diff --git a/.build/.added_strings_w3.jai b/.build/.added_strings_w3.jai index 8c381ae..97fedb5 100644 --- a/.build/.added_strings_w3.jai +++ b/.build/.added_strings_w3.jai @@ -1,6 +1,432 @@ // Workspace: Game // -// String added via add_build_string() from c:/Personal/games/Coven/metaprogram.jai:30. +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:32. // -GAME_NAME :: "Test"; +GAME_NAME :: "FPS"; + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:246. +// +serialize_entity :: (e: *Entity, path: string) { + builder: String_Builder; + builder.allocator = temp; + + if e.type == { + case Block; serialize_entity(cast(*Block)e, *builder); + case Character; serialize_entity(cast(*Character)e, *builder); + case Item; serialize_entity(cast(*Item)e, *builder); + case Pistol; serialize_entity(cast(*Pistol)e, *builder); + + } + + write_entire_file(tprint("%/%.ent", path, e.id), builder_to_string(*builder)); +} + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:257. +// +deserialize_entity :: (scene: *Scene, path: string) -> *Entity { + content := read_entire_file(path); + if content.count == 0 return null; + + lines := split(content, "\n"); + first_line := split(lines[0], ":"); + + if first_line.count != 2 return null; + + e: *Entity; + + type := trim(first_line[1], " \n\r"); + + if type == { + case "Block"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Block); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*Block)e); update_matrix(*e.transform); + case "Character"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Character); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*Character)e); update_matrix(*e.transform); + case "Item"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Item); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*Item)e); update_matrix(*e.transform); + case "Pistol"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Pistol); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*Pistol)e); update_matrix(*e.transform); + + } + + return e; +} + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:266. +// +new_block :: (scene: *Scene = null) -> *Block { _scene := scene; +if _scene == null { +_scene = game_state.current_scene; } +p, locator := find_and_occupy_empty_slot(*_scene.by_type._Block); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; } +new_character :: (scene: *Scene = null) -> *Character { _scene := scene; +if _scene == null { +_scene = game_state.current_scene; } +p, locator := find_and_occupy_empty_slot(*_scene.by_type._Character); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; } +new_item :: (scene: *Scene = null) -> *Item { _scene := scene; +if _scene == null { +_scene = game_state.current_scene; } +p, locator := find_and_occupy_empty_slot(*_scene.by_type._Item); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; } +new_pistol :: (scene: *Scene = null) -> *Pistol { _scene := scene; +if _scene == null { +_scene = game_state.current_scene; } +p, locator := find_and_occupy_empty_slot(*_scene.by_type._Pistol); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; } + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270. +// +serialize_entity :: (e: *Item, builder: *String_Builder) { + print_to_builder(builder, "type: Item\n"); + print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled); + print_to_builder(builder, "entity.flags: %\n", e.entity.flags); + print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x); + print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y); + print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z); + print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x); + print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y); + print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z); + print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w); + print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x); + print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y); + print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z); + print_to_builder(builder, "entity.grid_position.x: %\n", e.entity.grid_position.x); + print_to_builder(builder, "entity.grid_position.y: %\n", e.entity.grid_position.y); + print_to_builder(builder, "entity.grid_position.z: %\n", e.entity.grid_position.z); + print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x); + print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y); + print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z); +} + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270. +// +deserialize_entity :: (scene: *Scene, lines: [] string, e: *Item) { + for line: lines { + values := split(line, ":"); + if values.count == 2 { + if trim(values[0], " ") == { + case "entity.enabled"; + scan2(values[1], "%", *e.entity.enabled); + case "entity.transform.position.x"; + scan2(values[1], "%", *e.entity.transform.position.x); + case "entity.transform.position.y"; + scan2(values[1], "%", *e.entity.transform.position.y); + case "entity.transform.position.z"; + scan2(values[1], "%", *e.entity.transform.position.z); + case "entity.transform.orientation.x"; + scan2(values[1], "%", *e.entity.transform.orientation.x); + case "entity.transform.orientation.y"; + scan2(values[1], "%", *e.entity.transform.orientation.y); + case "entity.transform.orientation.z"; + scan2(values[1], "%", *e.entity.transform.orientation.z); + case "entity.transform.orientation.w"; + scan2(values[1], "%", *e.entity.transform.orientation.w); + case "entity.transform.scale.x"; + scan2(values[1], "%", *e.entity.transform.scale.x); + case "entity.transform.scale.y"; + scan2(values[1], "%", *e.entity.transform.scale.y); + case "entity.transform.scale.z"; + scan2(values[1], "%", *e.entity.transform.scale.z); + case "entity.grid_position.x"; + scan2(values[1], "%", *e.entity.grid_position.x); + case "entity.grid_position.y"; + scan2(values[1], "%", *e.entity.grid_position.y); + case "entity.grid_position.z"; + scan2(values[1], "%", *e.entity.grid_position.z); + case "entity.snap_offset.x"; + scan2(values[1], "%", *e.entity.snap_offset.x); + case "entity.snap_offset.y"; + scan2(values[1], "%", *e.entity.snap_offset.y); + case "entity.snap_offset.z"; + scan2(values[1], "%", *e.entity.snap_offset.z); + } + } + } +} + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270. +// +serialize_entity :: (e: *Block, builder: *String_Builder) { + print_to_builder(builder, "type: Block\n"); + print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled); + print_to_builder(builder, "entity.flags: %\n", e.entity.flags); + print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x); + print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y); + print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z); + print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x); + print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y); + print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z); + print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w); + print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x); + print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y); + print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z); + print_to_builder(builder, "entity.grid_position.x: %\n", e.entity.grid_position.x); + print_to_builder(builder, "entity.grid_position.y: %\n", e.entity.grid_position.y); + print_to_builder(builder, "entity.grid_position.z: %\n", e.entity.grid_position.z); + print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x); + print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y); + print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z); + print_to_builder(builder, "block_type: %\n", e.block_type); + print_to_builder(builder, "debug_id: %\n", e.debug_id); +} + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270. +// +deserialize_entity :: (scene: *Scene, lines: [] string, e: *Block) { + for line: lines { + values := split(line, ":"); + if values.count == 2 { + if trim(values[0], " ") == { + case "entity.enabled"; + scan2(values[1], "%", *e.entity.enabled); + case "entity.transform.position.x"; + scan2(values[1], "%", *e.entity.transform.position.x); + case "entity.transform.position.y"; + scan2(values[1], "%", *e.entity.transform.position.y); + case "entity.transform.position.z"; + scan2(values[1], "%", *e.entity.transform.position.z); + case "entity.transform.orientation.x"; + scan2(values[1], "%", *e.entity.transform.orientation.x); + case "entity.transform.orientation.y"; + scan2(values[1], "%", *e.entity.transform.orientation.y); + case "entity.transform.orientation.z"; + scan2(values[1], "%", *e.entity.transform.orientation.z); + case "entity.transform.orientation.w"; + scan2(values[1], "%", *e.entity.transform.orientation.w); + case "entity.transform.scale.x"; + scan2(values[1], "%", *e.entity.transform.scale.x); + case "entity.transform.scale.y"; + scan2(values[1], "%", *e.entity.transform.scale.y); + case "entity.transform.scale.z"; + scan2(values[1], "%", *e.entity.transform.scale.z); + case "entity.grid_position.x"; + scan2(values[1], "%", *e.entity.grid_position.x); + case "entity.grid_position.y"; + scan2(values[1], "%", *e.entity.grid_position.y); + case "entity.grid_position.z"; + scan2(values[1], "%", *e.entity.grid_position.z); + case "entity.snap_offset.x"; + scan2(values[1], "%", *e.entity.snap_offset.x); + case "entity.snap_offset.y"; + scan2(values[1], "%", *e.entity.snap_offset.y); + case "entity.snap_offset.z"; + scan2(values[1], "%", *e.entity.snap_offset.z); + case "debug_id"; + scan2(values[1], "%", *e.debug_id); + } + } + } +} + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270. +// +serialize_entity :: (e: *Pistol, builder: *String_Builder) { + print_to_builder(builder, "type: Pistol\n"); + print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled); + print_to_builder(builder, "entity.flags: %\n", e.entity.flags); + print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x); + print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y); + print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z); + print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x); + print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y); + print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z); + print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w); + print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x); + print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y); + print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z); + print_to_builder(builder, "entity.grid_position.x: %\n", e.entity.grid_position.x); + print_to_builder(builder, "entity.grid_position.y: %\n", e.entity.grid_position.y); + print_to_builder(builder, "entity.grid_position.z: %\n", e.entity.grid_position.z); + print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x); + print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y); + print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z); + print_to_builder(builder, "shooting: %\n", e.shooting); + print_to_builder(builder, "reloading: %\n", e.reloading); + print_to_builder(builder, "shoot_time: %\n", e.shoot_time); + print_to_builder(builder, "reload_time: %\n", e.reload_time); + print_to_builder(builder, "shot_cooldown_time: %\n", e.shot_cooldown_time); + print_to_builder(builder, "current_mag_ammo: %\n", e.current_mag_ammo); + print_to_builder(builder, "ammo_per_mag: %\n", e.ammo_per_mag); +} + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270. +// +deserialize_entity :: (scene: *Scene, lines: [] string, e: *Pistol) { + for line: lines { + values := split(line, ":"); + if values.count == 2 { + if trim(values[0], " ") == { + case "entity.enabled"; + scan2(values[1], "%", *e.entity.enabled); + case "entity.transform.position.x"; + scan2(values[1], "%", *e.entity.transform.position.x); + case "entity.transform.position.y"; + scan2(values[1], "%", *e.entity.transform.position.y); + case "entity.transform.position.z"; + scan2(values[1], "%", *e.entity.transform.position.z); + case "entity.transform.orientation.x"; + scan2(values[1], "%", *e.entity.transform.orientation.x); + case "entity.transform.orientation.y"; + scan2(values[1], "%", *e.entity.transform.orientation.y); + case "entity.transform.orientation.z"; + scan2(values[1], "%", *e.entity.transform.orientation.z); + case "entity.transform.orientation.w"; + scan2(values[1], "%", *e.entity.transform.orientation.w); + case "entity.transform.scale.x"; + scan2(values[1], "%", *e.entity.transform.scale.x); + case "entity.transform.scale.y"; + scan2(values[1], "%", *e.entity.transform.scale.y); + case "entity.transform.scale.z"; + scan2(values[1], "%", *e.entity.transform.scale.z); + case "entity.grid_position.x"; + scan2(values[1], "%", *e.entity.grid_position.x); + case "entity.grid_position.y"; + scan2(values[1], "%", *e.entity.grid_position.y); + case "entity.grid_position.z"; + scan2(values[1], "%", *e.entity.grid_position.z); + case "entity.snap_offset.x"; + scan2(values[1], "%", *e.entity.snap_offset.x); + case "entity.snap_offset.y"; + scan2(values[1], "%", *e.entity.snap_offset.y); + case "entity.snap_offset.z"; + scan2(values[1], "%", *e.entity.snap_offset.z); + case "shooting"; + scan2(values[1], "%", *e.shooting); + case "reloading"; + scan2(values[1], "%", *e.reloading); + case "shoot_time"; + scan2(values[1], "%", *e.shoot_time); + case "reload_time"; + scan2(values[1], "%", *e.reload_time); + case "shot_cooldown_time"; + scan2(values[1], "%", *e.shot_cooldown_time); + case "current_mag_ammo"; + scan2(values[1], "%", *e.current_mag_ammo); + case "ammo_per_mag"; + scan2(values[1], "%", *e.ammo_per_mag); + } + } + } +} + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270. +// +serialize_entity :: (e: *Character, builder: *String_Builder) { + print_to_builder(builder, "type: Character\n"); + print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled); + print_to_builder(builder, "entity.flags: %\n", e.entity.flags); + print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x); + print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y); + print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z); + print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x); + print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y); + print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z); + print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w); + print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x); + print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y); + print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z); + print_to_builder(builder, "entity.grid_position.x: %\n", e.entity.grid_position.x); + print_to_builder(builder, "entity.grid_position.y: %\n", e.entity.grid_position.y); + print_to_builder(builder, "entity.grid_position.z: %\n", e.entity.grid_position.z); + print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x); + print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y); + print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z); + print_to_builder(builder, "look_direction.x: %\n", e.look_direction.x); + print_to_builder(builder, "look_direction.y: %\n", e.look_direction.y); + print_to_builder(builder, "look_direction.z: %\n", e.look_direction.z); + print_to_builder(builder, "yaw: %\n", e.yaw); + print_to_builder(builder, "pitch: %\n", e.pitch); + print_to_builder(builder, "last_footstep_audio: %\n", e.last_footstep_audio); + print_to_builder(builder, "animation_time: %\n", e.animation_time); + print_to_builder(builder, "health: %\n", e.health); + print_to_builder(builder, "jump_press_time: %\n", e.jump_press_time); + print_to_builder(builder, "last_grounded_time: %\n", e.last_grounded_time); +} + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270. +// +deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) { + for line: lines { + values := split(line, ":"); + if values.count == 2 { + if trim(values[0], " ") == { + case "entity.enabled"; + scan2(values[1], "%", *e.entity.enabled); + case "entity.transform.position.x"; + scan2(values[1], "%", *e.entity.transform.position.x); + case "entity.transform.position.y"; + scan2(values[1], "%", *e.entity.transform.position.y); + case "entity.transform.position.z"; + scan2(values[1], "%", *e.entity.transform.position.z); + case "entity.transform.orientation.x"; + scan2(values[1], "%", *e.entity.transform.orientation.x); + case "entity.transform.orientation.y"; + scan2(values[1], "%", *e.entity.transform.orientation.y); + case "entity.transform.orientation.z"; + scan2(values[1], "%", *e.entity.transform.orientation.z); + case "entity.transform.orientation.w"; + scan2(values[1], "%", *e.entity.transform.orientation.w); + case "entity.transform.scale.x"; + scan2(values[1], "%", *e.entity.transform.scale.x); + case "entity.transform.scale.y"; + scan2(values[1], "%", *e.entity.transform.scale.y); + case "entity.transform.scale.z"; + scan2(values[1], "%", *e.entity.transform.scale.z); + case "entity.grid_position.x"; + scan2(values[1], "%", *e.entity.grid_position.x); + case "entity.grid_position.y"; + scan2(values[1], "%", *e.entity.grid_position.y); + case "entity.grid_position.z"; + scan2(values[1], "%", *e.entity.grid_position.z); + case "entity.snap_offset.x"; + scan2(values[1], "%", *e.entity.snap_offset.x); + case "entity.snap_offset.y"; + scan2(values[1], "%", *e.entity.snap_offset.y); + case "entity.snap_offset.z"; + scan2(values[1], "%", *e.entity.snap_offset.z); + case "look_direction.x"; + scan2(values[1], "%", *e.look_direction.x); + case "look_direction.y"; + scan2(values[1], "%", *e.look_direction.y); + case "look_direction.z"; + scan2(values[1], "%", *e.look_direction.z); + case "yaw"; + scan2(values[1], "%", *e.yaw); + case "pitch"; + scan2(values[1], "%", *e.pitch); + case "last_footstep_audio"; + scan2(values[1], "%", *e.last_footstep_audio); + case "animation_time"; + scan2(values[1], "%", *e.animation_time); + case "health"; + scan2(values[1], "%", *e.health); + case "jump_press_time"; + scan2(values[1], "%", *e.jump_press_time); + case "last_grounded_time"; + scan2(values[1], "%", *e.last_grounded_time); + } + } + } +} + +// +// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:278. +// + +// NUM_ENTITY_TYPES tells the target program how many entity types there are. +NUM_ENTITY_TYPES :: 4; + +// entity_types is an array containing all the entity types. +entity_types : [4] Type : .[ Block, Character, Item, Pistol ]; + +Entity_Storage :: struct { + _Block: Bucket_Array(Block, 20, true); + _Character: Bucket_Array(Character, 20, true); + _Item: Bucket_Array(Item, 20, true); + _Pistol: Bucket_Array(Pistol, 20, true); + +} diff --git a/core/math.jai b/core/math.jai index 51d002d..270c402 100644 --- a/core/math.jai +++ b/core/math.jai @@ -362,5 +362,4 @@ ease_in_out_sine :: (x: float) -> float { } #import "PCG"; -#import "Math"; - +#import "Math"; \ No newline at end of file diff --git a/metaprogram.jai b/metaprogram.jai index a2c7cc8..c16d38f 100644 --- a/metaprogram.jai +++ b/metaprogram.jai @@ -5,8 +5,8 @@ build_release := false; -build :: (main_path: string, game_name: string) { - set_working_directory(#filepath); +build :: (main_path: string, game_name: string, working_dir: string = #filepath) { + set_working_directory(working_dir); w := compiler_create_workspace("Game"); opts := get_build_options(w); @@ -18,6 +18,7 @@ build :: (main_path: string, game_name: string) { new_path: [..] string; array_add(*new_path, ..opts.import_path); array_add(*new_path, "../../modules"); + array_add(*new_path, "modules/ufbx"); array_add(*new_path, "modules"); opts.import_path = new_path; @@ -163,6 +164,7 @@ generate_serialize_procedure_for_entity :: (code_struct: *Code_Struct) { } note_struct :: (code_struct: *Code_Struct) { + print("Type: %\n", code_struct.defined_type.name); if is_subclass_of(code_struct.defined_type, "Entity") { name := code_struct.defined_type.name; diff --git a/module.jai b/module.jai index db2e87e..403c4b0 100644 --- a/module.jai +++ b/module.jai @@ -1,10 +1,10 @@ -#load "core/entity.jai"; -#load "core/scene.jai"; +EDITOR :: true; +DEBUG :: true; #if EDITOR { //#load "../editor/scene_editor.jai"; //#load "../ui/new_ui/new_ui.jai"; - #load "../editor/editor.jai"; + #load "editor/editor.jai"; editor: Editor; } @@ -17,9 +17,9 @@ time: float; dt: float; quit: bool; -init :: (window_title: string, window_width: u32, window_height: u32, fullscreen: bool) { - window = Coven.create_window(GAME_NAME, 1400, xx (1400.0*aspect), true); - renderer = Coven.create_renderer(window); +coven_init :: (window_title: string, window_width: u32, window_height: u32, fullscreen: bool) { + window = create_window(GAME_NAME, 1400, xx (1400.0*aspect), true); + renderer = create_renderer(window); renderer.vsync = true; init_input(); @@ -27,7 +27,7 @@ init :: (window_title: string, window_width: u32, window_height: u32, fullscreen init_console(); } -run :: (update_func: (float)) { +coven_run :: (update_func: (float)) { time = xx seconds_since_init(); while !quit { @@ -56,4 +56,32 @@ run :: (update_func: (float)) { SDL_DestroyWindow(window); SDL_Quit(); -} \ No newline at end of file +} + +#load "input/input.jai"; +#load "networking/networking.jai"; +#load "renderer/renderer.jai"; +#load "windowing/window.jai"; +#load "physics/physics.jai"; + +#load "core/string_helpers.jai"; +#load "core/math.jai"; +#load "core/ray.jai"; +#load "animation/animator.jai"; +#load "core/entity.jai"; +#load "core/parray.jai"; +#load "core/scene.jai"; +#load "core/transform.jai"; +#load "core/camera.jai"; +#load "core/console.jai"; +#load "audio/audio.jai"; + +#import "Bucket_Array"; +#import "Basic"; +#import "String"; +#import "System"; +#import "Flat_Pool"; +#import "Hash_Table"; +#import "File"; +#import "File_Watcher"; +#import "File_Utilities"; \ No newline at end of file diff --git a/modules/fmod/first.jai b/modules/fmod/first.jai new file mode 100644 index 0000000..aa65abd --- /dev/null +++ b/modules/fmod/first.jai @@ -0,0 +1,46 @@ +#import "Basic"; +#import "Compiler"; +#import "BuildCpp"; +#import "Check"; +#import "Bindings_Generator"; +#import "File"; + +#run { + set_build_options_dc(.{do_output=false}); + if !generate_bindings() { + compiler_set_workspace_status(.FAILED); + } +} + +generate_bindings :: () -> bool { + output_filename: string; + opts: Generate_Bindings_Options; + { + using opts; + + //#if OS == .WINDOWS { + output_filename = "module.jai"; + //} else #if OS == .LINUX { + // output_filename = "linux.jai"; + //} else #if OS == .MACOS { + // // @ToDo: Determine dynamically? Customize? + // array_add(*system_include_paths, "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include"); + // output_filename = "macos.jai"; + //} else { + // assert(false); + //} + + array_add(*libpaths, "lib/x64"); + array_add(*libnames, "fmod"); + array_add(*libnames, "fmodstudio"); + array_add(*system_include_paths, GENERATOR_DEFAULT_SYSTEM_INCLUDE_PATH); + array_add(*source_files, "inc/fmod.h"); + array_add(*source_files, "inc/fmod_studio.h"); + array_add(*extra_clang_arguments, "-x", "c"); + //strip_flags = 0; + generate_compile_time_struct_checks = false; + // strip_flags &= ~(Strip_Flags.CONSTRUCTORS | .DESTRUCTORS); + } + + return generate_bindings(opts, output_filename); +} diff --git a/modules/fmod/inc/fmod.cs b/modules/fmod/inc/fmod.cs new file mode 100644 index 0000000..c3bc548 --- /dev/null +++ b/modules/fmod/inc/fmod.cs @@ -0,0 +1,4041 @@ +/* ======================================================================================== */ +/* FMOD Core API - C# wrapper. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/core-api.html */ +/* ======================================================================================== */ + +using System; +using System.Text; +using System.Runtime.InteropServices; +using System.Collections.Generic; + +namespace FMOD +{ + /* + FMOD version number. Check this against FMOD::System::getVersion / System_GetVersion + 0xaaaabbcc -> aaaa = major version number. bb = minor version number. cc = development version number. + */ + public partial class VERSION + { + public const int number = 0x00020212; +#if !UNITY_2019_4_OR_NEWER + public const string dll = "fmod"; +#endif + } + + public class CONSTANTS + { + public const int MAX_CHANNEL_WIDTH = 32; + public const int MAX_LISTENERS = 8; + public const int REVERB_MAXINSTANCES = 4; + public const int MAX_SYSTEMS = 8; + } + + /* + FMOD core types + */ + public enum RESULT : int + { + OK, + ERR_BADCOMMAND, + ERR_CHANNEL_ALLOC, + ERR_CHANNEL_STOLEN, + ERR_DMA, + ERR_DSP_CONNECTION, + ERR_DSP_DONTPROCESS, + ERR_DSP_FORMAT, + ERR_DSP_INUSE, + ERR_DSP_NOTFOUND, + ERR_DSP_RESERVED, + ERR_DSP_SILENCE, + ERR_DSP_TYPE, + ERR_FILE_BAD, + ERR_FILE_COULDNOTSEEK, + ERR_FILE_DISKEJECTED, + ERR_FILE_EOF, + ERR_FILE_ENDOFDATA, + ERR_FILE_NOTFOUND, + ERR_FORMAT, + ERR_HEADER_MISMATCH, + ERR_HTTP, + ERR_HTTP_ACCESS, + ERR_HTTP_PROXY_AUTH, + ERR_HTTP_SERVER_ERROR, + ERR_HTTP_TIMEOUT, + ERR_INITIALIZATION, + ERR_INITIALIZED, + ERR_INTERNAL, + ERR_INVALID_FLOAT, + ERR_INVALID_HANDLE, + ERR_INVALID_PARAM, + ERR_INVALID_POSITION, + ERR_INVALID_SPEAKER, + ERR_INVALID_SYNCPOINT, + ERR_INVALID_THREAD, + ERR_INVALID_VECTOR, + ERR_MAXAUDIBLE, + ERR_MEMORY, + ERR_MEMORY_CANTPOINT, + ERR_NEEDS3D, + ERR_NEEDSHARDWARE, + ERR_NET_CONNECT, + ERR_NET_SOCKET_ERROR, + ERR_NET_URL, + ERR_NET_WOULD_BLOCK, + ERR_NOTREADY, + ERR_OUTPUT_ALLOCATED, + ERR_OUTPUT_CREATEBUFFER, + ERR_OUTPUT_DRIVERCALL, + ERR_OUTPUT_FORMAT, + ERR_OUTPUT_INIT, + ERR_OUTPUT_NODRIVERS, + ERR_PLUGIN, + ERR_PLUGIN_MISSING, + ERR_PLUGIN_RESOURCE, + ERR_PLUGIN_VERSION, + ERR_RECORD, + ERR_REVERB_CHANNELGROUP, + ERR_REVERB_INSTANCE, + ERR_SUBSOUNDS, + ERR_SUBSOUND_ALLOCATED, + ERR_SUBSOUND_CANTMOVE, + ERR_TAGNOTFOUND, + ERR_TOOMANYCHANNELS, + ERR_TRUNCATED, + ERR_UNIMPLEMENTED, + ERR_UNINITIALIZED, + ERR_UNSUPPORTED, + ERR_VERSION, + ERR_EVENT_ALREADY_LOADED, + ERR_EVENT_LIVEUPDATE_BUSY, + ERR_EVENT_LIVEUPDATE_MISMATCH, + ERR_EVENT_LIVEUPDATE_TIMEOUT, + ERR_EVENT_NOTFOUND, + ERR_STUDIO_UNINITIALIZED, + ERR_STUDIO_NOT_LOADED, + ERR_INVALID_STRING, + ERR_ALREADY_LOCKED, + ERR_NOT_LOCKED, + ERR_RECORD_DISCONNECTED, + ERR_TOOMANYSAMPLES, + } + + public enum CHANNELCONTROL_TYPE : int + { + CHANNEL, + CHANNELGROUP, + MAX + } + + [StructLayout(LayoutKind.Sequential)] + public struct VECTOR + { + public float x; + public float y; + public float z; + } + + [StructLayout(LayoutKind.Sequential)] + public struct ATTRIBUTES_3D + { + public VECTOR position; + public VECTOR velocity; + public VECTOR forward; + public VECTOR up; + } + + [StructLayout(LayoutKind.Sequential)] + public partial struct GUID + { + public int Data1; + public int Data2; + public int Data3; + public int Data4; + } + + [StructLayout(LayoutKind.Sequential)] + public struct ASYNCREADINFO + { + public IntPtr handle; + public uint offset; + public uint sizebytes; + public int priority; + + public IntPtr userdata; + public IntPtr buffer; + public uint bytesread; + public FILE_ASYNCDONE_FUNC done; + } + + public enum OUTPUTTYPE : int + { + AUTODETECT, + + UNKNOWN, + NOSOUND, + WAVWRITER, + NOSOUND_NRT, + WAVWRITER_NRT, + + WASAPI, + ASIO, + PULSEAUDIO, + ALSA, + COREAUDIO, + AUDIOTRACK, + OPENSL, + AUDIOOUT, + AUDIO3D, + WEBAUDIO, + NNAUDIO, + WINSONIC, + AAUDIO, + AUDIOWORKLET, + PHASE, + + MAX, + } + + public enum PORT_TYPE : int + { + MUSIC, + COPYRIGHT_MUSIC, + VOICE, + CONTROLLER, + PERSONAL, + VIBRATION, + AUX, + + MAX + } + + public enum DEBUG_MODE : int + { + TTY, + FILE, + CALLBACK, + } + + [Flags] + public enum DEBUG_FLAGS : uint + { + NONE = 0x00000000, + ERROR = 0x00000001, + WARNING = 0x00000002, + LOG = 0x00000004, + + TYPE_MEMORY = 0x00000100, + TYPE_FILE = 0x00000200, + TYPE_CODEC = 0x00000400, + TYPE_TRACE = 0x00000800, + + DISPLAY_TIMESTAMPS = 0x00010000, + DISPLAY_LINENUMBERS = 0x00020000, + DISPLAY_THREAD = 0x00040000, + } + + [Flags] + public enum MEMORY_TYPE : uint + { + NORMAL = 0x00000000, + STREAM_FILE = 0x00000001, + STREAM_DECODE = 0x00000002, + SAMPLEDATA = 0x00000004, + DSP_BUFFER = 0x00000008, + PLUGIN = 0x00000010, + PERSISTENT = 0x00200000, + ALL = 0xFFFFFFFF + } + + public enum SPEAKERMODE : int + { + DEFAULT, + RAW, + MONO, + STEREO, + QUAD, + SURROUND, + _5POINT1, + _7POINT1, + _7POINT1POINT4, + + MAX, + } + + public enum SPEAKER : int + { + NONE = -1, + FRONT_LEFT, + FRONT_RIGHT, + FRONT_CENTER, + LOW_FREQUENCY, + SURROUND_LEFT, + SURROUND_RIGHT, + BACK_LEFT, + BACK_RIGHT, + TOP_FRONT_LEFT, + TOP_FRONT_RIGHT, + TOP_BACK_LEFT, + TOP_BACK_RIGHT, + + MAX, + } + + [Flags] + public enum CHANNELMASK : uint + { + FRONT_LEFT = 0x00000001, + FRONT_RIGHT = 0x00000002, + FRONT_CENTER = 0x00000004, + LOW_FREQUENCY = 0x00000008, + SURROUND_LEFT = 0x00000010, + SURROUND_RIGHT = 0x00000020, + BACK_LEFT = 0x00000040, + BACK_RIGHT = 0x00000080, + BACK_CENTER = 0x00000100, + + MONO = (FRONT_LEFT), + STEREO = (FRONT_LEFT | FRONT_RIGHT), + LRC = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER), + QUAD = (FRONT_LEFT | FRONT_RIGHT | SURROUND_LEFT | SURROUND_RIGHT), + SURROUND = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT), + _5POINT1 = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT), + _5POINT1_REARS = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | BACK_LEFT | BACK_RIGHT), + _7POINT0 = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT), + _7POINT1 = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT) + } + + public enum CHANNELORDER : int + { + DEFAULT, + WAVEFORMAT, + PROTOOLS, + ALLMONO, + ALLSTEREO, + ALSA, + + MAX, + } + + public enum PLUGINTYPE : int + { + OUTPUT, + CODEC, + DSP, + + MAX, + } + + [StructLayout(LayoutKind.Sequential)] + public struct PLUGINLIST + { + PLUGINTYPE type; + IntPtr description; + } + + [Flags] + public enum INITFLAGS : uint + { + NORMAL = 0x00000000, + STREAM_FROM_UPDATE = 0x00000001, + MIX_FROM_UPDATE = 0x00000002, + _3D_RIGHTHANDED = 0x00000004, + CLIP_OUTPUT = 0x00000008, + CHANNEL_LOWPASS = 0x00000100, + CHANNEL_DISTANCEFILTER = 0x00000200, + PROFILE_ENABLE = 0x00010000, + VOL0_BECOMES_VIRTUAL = 0x00020000, + GEOMETRY_USECLOSEST = 0x00040000, + PREFER_DOLBY_DOWNMIX = 0x00080000, + THREAD_UNSAFE = 0x00100000, + PROFILE_METER_ALL = 0x00200000, + MEMORY_TRACKING = 0x00400000, + } + + public enum SOUND_TYPE : int + { + UNKNOWN, + AIFF, + ASF, + DLS, + FLAC, + FSB, + IT, + MIDI, + MOD, + MPEG, + OGGVORBIS, + PLAYLIST, + RAW, + S3M, + USER, + WAV, + XM, + XMA, + AUDIOQUEUE, + AT9, + VORBIS, + MEDIA_FOUNDATION, + MEDIACODEC, + FADPCM, + OPUS, + + MAX, + } + + public enum SOUND_FORMAT : int + { + NONE, + PCM8, + PCM16, + PCM24, + PCM32, + PCMFLOAT, + BITSTREAM, + + MAX + } + + [Flags] + public enum MODE : uint + { + DEFAULT = 0x00000000, + LOOP_OFF = 0x00000001, + LOOP_NORMAL = 0x00000002, + LOOP_BIDI = 0x00000004, + _2D = 0x00000008, + _3D = 0x00000010, + CREATESTREAM = 0x00000080, + CREATESAMPLE = 0x00000100, + CREATECOMPRESSEDSAMPLE = 0x00000200, + OPENUSER = 0x00000400, + OPENMEMORY = 0x00000800, + OPENMEMORY_POINT = 0x10000000, + OPENRAW = 0x00001000, + OPENONLY = 0x00002000, + ACCURATETIME = 0x00004000, + MPEGSEARCH = 0x00008000, + NONBLOCKING = 0x00010000, + UNIQUE = 0x00020000, + _3D_HEADRELATIVE = 0x00040000, + _3D_WORLDRELATIVE = 0x00080000, + _3D_INVERSEROLLOFF = 0x00100000, + _3D_LINEARROLLOFF = 0x00200000, + _3D_LINEARSQUAREROLLOFF = 0x00400000, + _3D_INVERSETAPEREDROLLOFF = 0x00800000, + _3D_CUSTOMROLLOFF = 0x04000000, + _3D_IGNOREGEOMETRY = 0x40000000, + IGNORETAGS = 0x02000000, + LOWMEM = 0x08000000, + VIRTUAL_PLAYFROMSTART = 0x80000000 + } + + public enum OPENSTATE : int + { + READY = 0, + LOADING, + ERROR, + CONNECTING, + BUFFERING, + SEEKING, + PLAYING, + SETPOSITION, + + MAX, + } + + public enum SOUNDGROUP_BEHAVIOR : int + { + BEHAVIOR_FAIL, + BEHAVIOR_MUTE, + BEHAVIOR_STEALLOWEST, + + MAX, + } + + public enum CHANNELCONTROL_CALLBACK_TYPE : int + { + END, + VIRTUALVOICE, + SYNCPOINT, + OCCLUSION, + + MAX, + } + + public struct CHANNELCONTROL_DSP_INDEX + { + public const int HEAD = -1; + public const int FADER = -2; + public const int TAIL = -3; + } + + public enum ERRORCALLBACK_INSTANCETYPE : int + { + NONE, + SYSTEM, + CHANNEL, + CHANNELGROUP, + CHANNELCONTROL, + SOUND, + SOUNDGROUP, + DSP, + DSPCONNECTION, + GEOMETRY, + REVERB3D, + STUDIO_SYSTEM, + STUDIO_EVENTDESCRIPTION, + STUDIO_EVENTINSTANCE, + STUDIO_PARAMETERINSTANCE, + STUDIO_BUS, + STUDIO_VCA, + STUDIO_BANK, + STUDIO_COMMANDREPLAY + } + + [StructLayout(LayoutKind.Sequential)] + public struct ERRORCALLBACK_INFO + { + public RESULT result; + public ERRORCALLBACK_INSTANCETYPE instancetype; + public IntPtr instance; + public StringWrapper functionname; + public StringWrapper functionparams; + } + + [StructLayout(LayoutKind.Sequential)] + public struct CPU_USAGE + { + public float dsp; /* DSP mixing CPU usage. */ + public float stream; /* Streaming engine CPU usage. */ + public float geometry; /* Geometry engine CPU usage. */ + public float update; /* System::update CPU usage. */ + public float convolution1; /* Convolution reverb processing thread #1 CPU usage */ + public float convolution2; /* Convolution reverb processing thread #2 CPU usage */ + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_DATA_PARAMETER_INFO + { + public IntPtr data; + public uint length; + public int index; + } + + [Flags] + public enum SYSTEM_CALLBACK_TYPE : uint + { + DEVICELISTCHANGED = 0x00000001, + DEVICELOST = 0x00000002, + MEMORYALLOCATIONFAILED = 0x00000004, + THREADCREATED = 0x00000008, + BADDSPCONNECTION = 0x00000010, + PREMIX = 0x00000020, + POSTMIX = 0x00000040, + ERROR = 0x00000080, + MIDMIX = 0x00000100, + THREADDESTROYED = 0x00000200, + PREUPDATE = 0x00000400, + POSTUPDATE = 0x00000800, + RECORDLISTCHANGED = 0x00001000, + BUFFEREDNOMIX = 0x00002000, + DEVICEREINITIALIZE = 0x00004000, + OUTPUTUNDERRUN = 0x00008000, + RECORDPOSITIONCHANGED = 0x00010000, + ALL = 0xFFFFFFFF, + } + + /* + FMOD Callbacks + */ + public delegate RESULT DEBUG_CALLBACK (DEBUG_FLAGS flags, IntPtr file, int line, IntPtr func, IntPtr message); + public delegate RESULT SYSTEM_CALLBACK (IntPtr system, SYSTEM_CALLBACK_TYPE type, IntPtr commanddata1, IntPtr commanddata2, IntPtr userdata); + public delegate RESULT CHANNELCONTROL_CALLBACK (IntPtr channelcontrol, CHANNELCONTROL_TYPE controltype, CHANNELCONTROL_CALLBACK_TYPE callbacktype, IntPtr commanddata1, IntPtr commanddata2); + public delegate RESULT DSP_CALLBACK (IntPtr dsp, DSP_CALLBACK_TYPE type, IntPtr data); + public delegate RESULT SOUND_NONBLOCK_CALLBACK (IntPtr sound, RESULT result); + public delegate RESULT SOUND_PCMREAD_CALLBACK (IntPtr sound, IntPtr data, uint datalen); + public delegate RESULT SOUND_PCMSETPOS_CALLBACK (IntPtr sound, int subsound, uint position, TIMEUNIT postype); + public delegate RESULT FILE_OPEN_CALLBACK (IntPtr name, ref uint filesize, ref IntPtr handle, IntPtr userdata); + public delegate RESULT FILE_CLOSE_CALLBACK (IntPtr handle, IntPtr userdata); + public delegate RESULT FILE_READ_CALLBACK (IntPtr handle, IntPtr buffer, uint sizebytes, ref uint bytesread, IntPtr userdata); + public delegate RESULT FILE_SEEK_CALLBACK (IntPtr handle, uint pos, IntPtr userdata); + public delegate RESULT FILE_ASYNCREAD_CALLBACK (IntPtr info, IntPtr userdata); + public delegate RESULT FILE_ASYNCCANCEL_CALLBACK(IntPtr info, IntPtr userdata); + public delegate void FILE_ASYNCDONE_FUNC (IntPtr info, RESULT result); + public delegate IntPtr MEMORY_ALLOC_CALLBACK (uint size, MEMORY_TYPE type, IntPtr sourcestr); + public delegate IntPtr MEMORY_REALLOC_CALLBACK (IntPtr ptr, uint size, MEMORY_TYPE type, IntPtr sourcestr); + public delegate void MEMORY_FREE_CALLBACK (IntPtr ptr, MEMORY_TYPE type, IntPtr sourcestr); + public delegate float CB_3D_ROLLOFF_CALLBACK (IntPtr channelcontrol, float distance); + + public enum DSP_RESAMPLER : int + { + DEFAULT, + NOINTERP, + LINEAR, + CUBIC, + SPLINE, + + MAX, + } + + public enum DSP_CALLBACK_TYPE : int + { + DATAPARAMETERRELEASE, + + MAX, + } + + public enum DSPCONNECTION_TYPE : int + { + STANDARD, + SIDECHAIN, + SEND, + SEND_SIDECHAIN, + + MAX, + } + + public enum TAGTYPE : int + { + UNKNOWN = 0, + ID3V1, + ID3V2, + VORBISCOMMENT, + SHOUTCAST, + ICECAST, + ASF, + MIDI, + PLAYLIST, + FMOD, + USER, + + MAX + } + + public enum TAGDATATYPE : int + { + BINARY = 0, + INT, + FLOAT, + STRING, + STRING_UTF16, + STRING_UTF16BE, + STRING_UTF8, + + MAX + } + + [StructLayout(LayoutKind.Sequential)] + public struct TAG + { + public TAGTYPE type; + public TAGDATATYPE datatype; + public StringWrapper name; + public IntPtr data; + public uint datalen; + public bool updated; + } + + [Flags] + public enum TIMEUNIT : uint + { + MS = 0x00000001, + PCM = 0x00000002, + PCMBYTES = 0x00000004, + RAWBYTES = 0x00000008, + PCMFRACTION = 0x00000010, + MODORDER = 0x00000100, + MODROW = 0x00000200, + MODPATTERN = 0x00000400, + } + + public struct PORT_INDEX + { + public const ulong NONE = 0xFFFFFFFFFFFFFFFF; + public const ulong FLAG_VR_CONTROLLER = 0x1000000000000000; + } + + [StructLayout(LayoutKind.Sequential)] + public struct CREATESOUNDEXINFO + { + public int cbsize; + public uint length; + public uint fileoffset; + public int numchannels; + public int defaultfrequency; + public SOUND_FORMAT format; + public uint decodebuffersize; + public int initialsubsound; + public int numsubsounds; + public IntPtr inclusionlist; + public int inclusionlistnum; + public IntPtr pcmreadcallback_internal; + public IntPtr pcmsetposcallback_internal; + public IntPtr nonblockcallback_internal; + public IntPtr dlsname; + public IntPtr encryptionkey; + public int maxpolyphony; + public IntPtr userdata; + public SOUND_TYPE suggestedsoundtype; + public IntPtr fileuseropen_internal; + public IntPtr fileuserclose_internal; + public IntPtr fileuserread_internal; + public IntPtr fileuserseek_internal; + public IntPtr fileuserasyncread_internal; + public IntPtr fileuserasynccancel_internal; + public IntPtr fileuserdata; + public int filebuffersize; + public CHANNELORDER channelorder; + public IntPtr initialsoundgroup; + public uint initialseekposition; + public TIMEUNIT initialseekpostype; + public int ignoresetfilesystem; + public uint audioqueuepolicy; + public uint minmidigranularity; + public int nonblockthreadid; + public IntPtr fsbguid; + + public SOUND_PCMREAD_CALLBACK pcmreadcallback + { + set { pcmreadcallback_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return pcmreadcallback_internal == IntPtr.Zero ? null : (SOUND_PCMREAD_CALLBACK)Marshal.GetDelegateForFunctionPointer(pcmreadcallback_internal, typeof(SOUND_PCMREAD_CALLBACK)); } + } + public SOUND_PCMSETPOS_CALLBACK pcmsetposcallback + { + set { pcmsetposcallback_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return pcmsetposcallback_internal == IntPtr.Zero ? null : (SOUND_PCMSETPOS_CALLBACK)Marshal.GetDelegateForFunctionPointer(pcmsetposcallback_internal, typeof(SOUND_PCMSETPOS_CALLBACK)); } + } + public SOUND_NONBLOCK_CALLBACK nonblockcallback + { + set { nonblockcallback_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return nonblockcallback_internal == IntPtr.Zero ? null : (SOUND_NONBLOCK_CALLBACK)Marshal.GetDelegateForFunctionPointer(nonblockcallback_internal, typeof(SOUND_NONBLOCK_CALLBACK)); } + } + public FILE_OPEN_CALLBACK fileuseropen + { + set { fileuseropen_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuseropen_internal == IntPtr.Zero ? null : (FILE_OPEN_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuseropen_internal, typeof(FILE_OPEN_CALLBACK)); } + } + public FILE_CLOSE_CALLBACK fileuserclose + { + set { fileuserclose_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuserclose_internal == IntPtr.Zero ? null : (FILE_CLOSE_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuserclose_internal, typeof(FILE_CLOSE_CALLBACK)); } + } + public FILE_READ_CALLBACK fileuserread + { + set { fileuserread_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuserread_internal == IntPtr.Zero ? null : (FILE_READ_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuserread_internal, typeof(FILE_READ_CALLBACK)); } + } + public FILE_SEEK_CALLBACK fileuserseek + { + set { fileuserseek_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuserseek_internal == IntPtr.Zero ? null : (FILE_SEEK_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuserseek_internal, typeof(FILE_SEEK_CALLBACK)); } + } + public FILE_ASYNCREAD_CALLBACK fileuserasyncread + { + set { fileuserasyncread_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuserasyncread_internal == IntPtr.Zero ? null : (FILE_ASYNCREAD_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuserasyncread_internal, typeof(FILE_ASYNCREAD_CALLBACK)); } + } + public FILE_ASYNCCANCEL_CALLBACK fileuserasynccancel + { + set { fileuserasynccancel_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } + get { return fileuserasynccancel_internal == IntPtr.Zero ? null : (FILE_ASYNCCANCEL_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuserasynccancel_internal, typeof(FILE_ASYNCCANCEL_CALLBACK)); } + } + + } + +#pragma warning disable 414 + [StructLayout(LayoutKind.Sequential)] + public struct REVERB_PROPERTIES + { + public float DecayTime; + public float EarlyDelay; + public float LateDelay; + public float HFReference; + public float HFDecayRatio; + public float Diffusion; + public float Density; + public float LowShelfFrequency; + public float LowShelfGain; + public float HighCut; + public float EarlyLateMix; + public float WetLevel; + + #region wrapperinternal + public REVERB_PROPERTIES(float decayTime, float earlyDelay, float lateDelay, float hfReference, + float hfDecayRatio, float diffusion, float density, float lowShelfFrequency, float lowShelfGain, + float highCut, float earlyLateMix, float wetLevel) + { + DecayTime = decayTime; + EarlyDelay = earlyDelay; + LateDelay = lateDelay; + HFReference = hfReference; + HFDecayRatio = hfDecayRatio; + Diffusion = diffusion; + Density = density; + LowShelfFrequency = lowShelfFrequency; + LowShelfGain = lowShelfGain; + HighCut = highCut; + EarlyLateMix = earlyLateMix; + WetLevel = wetLevel; + } + #endregion + } +#pragma warning restore 414 + + public class PRESET + { + public static REVERB_PROPERTIES OFF() { return new REVERB_PROPERTIES( 1000, 7, 11, 5000, 100, 100, 100, 250, 0, 20, 96, -80.0f );} + public static REVERB_PROPERTIES GENERIC() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 83, 100, 100, 250, 0, 14500, 96, -8.0f );} + public static REVERB_PROPERTIES PADDEDCELL() { return new REVERB_PROPERTIES( 170, 1, 2, 5000, 10, 100, 100, 250, 0, 160, 84, -7.8f );} + public static REVERB_PROPERTIES ROOM() { return new REVERB_PROPERTIES( 400, 2, 3, 5000, 83, 100, 100, 250, 0, 6050, 88, -9.4f );} + public static REVERB_PROPERTIES BATHROOM() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 54, 100, 60, 250, 0, 2900, 83, 0.5f );} + public static REVERB_PROPERTIES LIVINGROOM() { return new REVERB_PROPERTIES( 500, 3, 4, 5000, 10, 100, 100, 250, 0, 160, 58, -19.0f );} + public static REVERB_PROPERTIES STONEROOM() { return new REVERB_PROPERTIES( 2300, 12, 17, 5000, 64, 100, 100, 250, 0, 7800, 71, -8.5f );} + public static REVERB_PROPERTIES AUDITORIUM() { return new REVERB_PROPERTIES( 4300, 20, 30, 5000, 59, 100, 100, 250, 0, 5850, 64, -11.7f );} + public static REVERB_PROPERTIES CONCERTHALL() { return new REVERB_PROPERTIES( 3900, 20, 29, 5000, 70, 100, 100, 250, 0, 5650, 80, -9.8f );} + public static REVERB_PROPERTIES CAVE() { return new REVERB_PROPERTIES( 2900, 15, 22, 5000, 100, 100, 100, 250, 0, 20000, 59, -11.3f );} + public static REVERB_PROPERTIES ARENA() { return new REVERB_PROPERTIES( 7200, 20, 30, 5000, 33, 100, 100, 250, 0, 4500, 80, -9.6f );} + public static REVERB_PROPERTIES HANGAR() { return new REVERB_PROPERTIES( 10000, 20, 30, 5000, 23, 100, 100, 250, 0, 3400, 72, -7.4f );} + public static REVERB_PROPERTIES CARPETTEDHALLWAY() { return new REVERB_PROPERTIES( 300, 2, 30, 5000, 10, 100, 100, 250, 0, 500, 56, -24.0f );} + public static REVERB_PROPERTIES HALLWAY() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 59, 100, 100, 250, 0, 7800, 87, -5.5f );} + public static REVERB_PROPERTIES STONECORRIDOR() { return new REVERB_PROPERTIES( 270, 13, 20, 5000, 79, 100, 100, 250, 0, 9000, 86, -6.0f );} + public static REVERB_PROPERTIES ALLEY() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 86, 100, 100, 250, 0, 8300, 80, -9.8f );} + public static REVERB_PROPERTIES FOREST() { return new REVERB_PROPERTIES( 1500, 162, 88, 5000, 54, 79, 100, 250, 0, 760, 94, -12.3f );} + public static REVERB_PROPERTIES CITY() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 67, 50, 100, 250, 0, 4050, 66, -26.0f );} + public static REVERB_PROPERTIES MOUNTAINS() { return new REVERB_PROPERTIES( 1500, 300, 100, 5000, 21, 27, 100, 250, 0, 1220, 82, -24.0f );} + public static REVERB_PROPERTIES QUARRY() { return new REVERB_PROPERTIES( 1500, 61, 25, 5000, 83, 100, 100, 250, 0, 3400, 100, -5.0f );} + public static REVERB_PROPERTIES PLAIN() { return new REVERB_PROPERTIES( 1500, 179, 100, 5000, 50, 21, 100, 250, 0, 1670, 65, -28.0f );} + public static REVERB_PROPERTIES PARKINGLOT() { return new REVERB_PROPERTIES( 1700, 8, 12, 5000, 100, 100, 100, 250, 0, 20000, 56, -19.5f );} + public static REVERB_PROPERTIES SEWERPIPE() { return new REVERB_PROPERTIES( 2800, 14, 21, 5000, 14, 80, 60, 250, 0, 3400, 66, 1.2f );} + public static REVERB_PROPERTIES UNDERWATER() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 10, 100, 100, 250, 0, 500, 92, 7.0f );} + } + + [StructLayout(LayoutKind.Sequential)] + public struct ADVANCEDSETTINGS + { + public int cbSize; + public int maxMPEGCodecs; + public int maxADPCMCodecs; + public int maxXMACodecs; + public int maxVorbisCodecs; + public int maxAT9Codecs; + public int maxFADPCMCodecs; + public int maxPCMCodecs; + public int ASIONumChannels; + public IntPtr ASIOChannelList; + public IntPtr ASIOSpeakerList; + public float vol0virtualvol; + public uint defaultDecodeBufferSize; + public ushort profilePort; + public uint geometryMaxFadeTime; + public float distanceFilterCenterFreq; + public int reverb3Dinstance; + public int DSPBufferPoolSize; + public DSP_RESAMPLER resamplerMethod; + public uint randomSeed; + public int maxConvolutionThreads; + public int maxOpusCodecs; + } + + [Flags] + public enum DRIVER_STATE : uint + { + CONNECTED = 0x00000001, + DEFAULT = 0x00000002, + } + + public enum THREAD_PRIORITY : int + { + /* Platform specific priority range */ + PLATFORM_MIN = -32 * 1024, + PLATFORM_MAX = 32 * 1024, + + /* Platform agnostic priorities, maps internally to platform specific value */ + DEFAULT = PLATFORM_MIN - 1, + LOW = PLATFORM_MIN - 2, + MEDIUM = PLATFORM_MIN - 3, + HIGH = PLATFORM_MIN - 4, + VERY_HIGH = PLATFORM_MIN - 5, + EXTREME = PLATFORM_MIN - 6, + CRITICAL = PLATFORM_MIN - 7, + + /* Thread defaults */ + MIXER = EXTREME, + FEEDER = CRITICAL, + STREAM = VERY_HIGH, + FILE = HIGH, + NONBLOCKING = HIGH, + RECORD = HIGH, + GEOMETRY = LOW, + PROFILER = MEDIUM, + STUDIO_UPDATE = MEDIUM, + STUDIO_LOAD_BANK = MEDIUM, + STUDIO_LOAD_SAMPLE = MEDIUM, + CONVOLUTION1 = VERY_HIGH, + CONVOLUTION2 = VERY_HIGH + + } + + public enum THREAD_STACK_SIZE : uint + { + DEFAULT = 0, + MIXER = 80 * 1024, + FEEDER = 16 * 1024, + STREAM = 96 * 1024, + FILE = 64 * 1024, + NONBLOCKING = 112 * 1024, + RECORD = 16 * 1024, + GEOMETRY = 48 * 1024, + PROFILER = 128 * 1024, + STUDIO_UPDATE = 96 * 1024, + STUDIO_LOAD_BANK = 96 * 1024, + STUDIO_LOAD_SAMPLE = 96 * 1024, + CONVOLUTION1 = 16 * 1024, + CONVOLUTION2 = 16 * 1024 + } + + [Flags] + public enum THREAD_AFFINITY : long + { + /* Platform agnostic thread groupings */ + GROUP_DEFAULT = 0x4000000000000000, + GROUP_A = 0x4000000000000001, + GROUP_B = 0x4000000000000002, + GROUP_C = 0x4000000000000003, + + /* Thread defaults */ + MIXER = GROUP_A, + FEEDER = GROUP_C, + STREAM = GROUP_C, + FILE = GROUP_C, + NONBLOCKING = GROUP_C, + RECORD = GROUP_C, + GEOMETRY = GROUP_C, + PROFILER = GROUP_C, + STUDIO_UPDATE = GROUP_B, + STUDIO_LOAD_BANK = GROUP_C, + STUDIO_LOAD_SAMPLE = GROUP_C, + CONVOLUTION1 = GROUP_C, + CONVOLUTION2 = GROUP_C, + + /* Core mask, valid up to 1 << 61 */ + CORE_ALL = 0, + CORE_0 = 1 << 0, + CORE_1 = 1 << 1, + CORE_2 = 1 << 2, + CORE_3 = 1 << 3, + CORE_4 = 1 << 4, + CORE_5 = 1 << 5, + CORE_6 = 1 << 6, + CORE_7 = 1 << 7, + CORE_8 = 1 << 8, + CORE_9 = 1 << 9, + CORE_10 = 1 << 10, + CORE_11 = 1 << 11, + CORE_12 = 1 << 12, + CORE_13 = 1 << 13, + CORE_14 = 1 << 14, + CORE_15 = 1 << 15 + } + + public enum THREAD_TYPE : int + { + MIXER, + FEEDER, + STREAM, + FILE, + NONBLOCKING, + RECORD, + GEOMETRY, + PROFILER, + STUDIO_UPDATE, + STUDIO_LOAD_BANK, + STUDIO_LOAD_SAMPLE, + CONVOLUTION1, + CONVOLUTION2, + + MAX + } + + /* + FMOD System factory functions. Use this to create an FMOD System Instance. below you will see System init/close to get started. + */ + public struct Factory + { + public static RESULT System_Create(out System system) + { + return FMOD5_System_Create(out system.handle, VERSION.number); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Create(out IntPtr system, uint headerversion); + + #endregion + } + + /* + FMOD global system functions (optional). + */ + public struct Memory + { + public static RESULT Initialize(IntPtr poolmem, int poollen, MEMORY_ALLOC_CALLBACK useralloc, MEMORY_REALLOC_CALLBACK userrealloc, MEMORY_FREE_CALLBACK userfree, MEMORY_TYPE memtypeflags = MEMORY_TYPE.ALL) + { + return FMOD5_Memory_Initialize(poolmem, poollen, useralloc, userrealloc, userfree, memtypeflags); + } + + public static RESULT GetStats(out int currentalloced, out int maxalloced, bool blocking = true) + { + return FMOD5_Memory_GetStats(out currentalloced, out maxalloced, blocking); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Memory_Initialize(IntPtr poolmem, int poollen, MEMORY_ALLOC_CALLBACK useralloc, MEMORY_REALLOC_CALLBACK userrealloc, MEMORY_FREE_CALLBACK userfree, MEMORY_TYPE memtypeflags); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Memory_GetStats (out int currentalloced, out int maxalloced, bool blocking); + + #endregion + } + + public struct Debug + { + public static RESULT Initialize(DEBUG_FLAGS flags, DEBUG_MODE mode = DEBUG_MODE.TTY, DEBUG_CALLBACK callback = null, string filename = null) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_Debug_Initialize(flags, mode, callback, encoder.byteFromStringUTF8(filename)); + } + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Debug_Initialize(DEBUG_FLAGS flags, DEBUG_MODE mode, DEBUG_CALLBACK callback, byte[] filename); + + #endregion + } + + public struct Thread + { + public static RESULT SetAttributes(THREAD_TYPE type, THREAD_AFFINITY affinity = THREAD_AFFINITY.GROUP_DEFAULT, THREAD_PRIORITY priority = THREAD_PRIORITY.DEFAULT, THREAD_STACK_SIZE stacksize = THREAD_STACK_SIZE.DEFAULT) + { + return FMOD5_Thread_SetAttributes(type, affinity, priority, stacksize); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Thread_SetAttributes(THREAD_TYPE type, THREAD_AFFINITY affinity, THREAD_PRIORITY priority, THREAD_STACK_SIZE stacksize); + #endregion + } + + /* + 'System' API. + */ + public struct System + { + public RESULT release() + { + return FMOD5_System_Release(this.handle); + } + + // Setup functions. + public RESULT setOutput(OUTPUTTYPE output) + { + return FMOD5_System_SetOutput(this.handle, output); + } + public RESULT getOutput(out OUTPUTTYPE output) + { + return FMOD5_System_GetOutput(this.handle, out output); + } + public RESULT getNumDrivers(out int numdrivers) + { + return FMOD5_System_GetNumDrivers(this.handle, out numdrivers); + } + public RESULT getDriverInfo(int id, out string name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_System_GetDriverInfo(this.handle, id, stringMem, namelen, out guid, out systemrate, out speakermode, out speakermodechannels); + using (StringHelper.ThreadSafeEncoding encoding = StringHelper.GetFreeHelper()) + { + name = encoding.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getDriverInfo(int id, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels) + { + return FMOD5_System_GetDriverInfo(this.handle, id, IntPtr.Zero, 0, out guid, out systemrate, out speakermode, out speakermodechannels); + } + public RESULT setDriver(int driver) + { + return FMOD5_System_SetDriver(this.handle, driver); + } + public RESULT getDriver(out int driver) + { + return FMOD5_System_GetDriver(this.handle, out driver); + } + public RESULT setSoftwareChannels(int numsoftwarechannels) + { + return FMOD5_System_SetSoftwareChannels(this.handle, numsoftwarechannels); + } + public RESULT getSoftwareChannels(out int numsoftwarechannels) + { + return FMOD5_System_GetSoftwareChannels(this.handle, out numsoftwarechannels); + } + public RESULT setSoftwareFormat(int samplerate, SPEAKERMODE speakermode, int numrawspeakers) + { + return FMOD5_System_SetSoftwareFormat(this.handle, samplerate, speakermode, numrawspeakers); + } + public RESULT getSoftwareFormat(out int samplerate, out SPEAKERMODE speakermode, out int numrawspeakers) + { + return FMOD5_System_GetSoftwareFormat(this.handle, out samplerate, out speakermode, out numrawspeakers); + } + public RESULT setDSPBufferSize(uint bufferlength, int numbuffers) + { + return FMOD5_System_SetDSPBufferSize(this.handle, bufferlength, numbuffers); + } + public RESULT getDSPBufferSize(out uint bufferlength, out int numbuffers) + { + return FMOD5_System_GetDSPBufferSize(this.handle, out bufferlength, out numbuffers); + } + public RESULT setFileSystem(FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek, FILE_ASYNCREAD_CALLBACK userasyncread, FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign) + { + return FMOD5_System_SetFileSystem(this.handle, useropen, userclose, userread, userseek, userasyncread, userasynccancel, blockalign); + } + public RESULT attachFileSystem(FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek) + { + return FMOD5_System_AttachFileSystem(this.handle, useropen, userclose, userread, userseek); + } + public RESULT setAdvancedSettings(ref ADVANCEDSETTINGS settings) + { + settings.cbSize = MarshalHelper.SizeOf(typeof(ADVANCEDSETTINGS)); + return FMOD5_System_SetAdvancedSettings(this.handle, ref settings); + } + public RESULT getAdvancedSettings(ref ADVANCEDSETTINGS settings) + { + settings.cbSize = MarshalHelper.SizeOf(typeof(ADVANCEDSETTINGS)); + return FMOD5_System_GetAdvancedSettings(this.handle, ref settings); + } + public RESULT setCallback(SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask = SYSTEM_CALLBACK_TYPE.ALL) + { + return FMOD5_System_SetCallback(this.handle, callback, callbackmask); + } + + // Plug-in support. + public RESULT setPluginPath(string path) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_SetPluginPath(this.handle, encoder.byteFromStringUTF8(path)); + } + } + public RESULT loadPlugin(string filename, out uint handle, uint priority = 0) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_LoadPlugin(this.handle, encoder.byteFromStringUTF8(filename), out handle, priority); + } + } + public RESULT unloadPlugin(uint handle) + { + return FMOD5_System_UnloadPlugin(this.handle, handle); + } + public RESULT getNumNestedPlugins(uint handle, out int count) + { + return FMOD5_System_GetNumNestedPlugins(this.handle, handle, out count); + } + public RESULT getNestedPlugin(uint handle, int index, out uint nestedhandle) + { + return FMOD5_System_GetNestedPlugin(this.handle, handle, index, out nestedhandle); + } + public RESULT getNumPlugins(PLUGINTYPE plugintype, out int numplugins) + { + return FMOD5_System_GetNumPlugins(this.handle, plugintype, out numplugins); + } + public RESULT getPluginHandle(PLUGINTYPE plugintype, int index, out uint handle) + { + return FMOD5_System_GetPluginHandle(this.handle, plugintype, index, out handle); + } + public RESULT getPluginInfo(uint handle, out PLUGINTYPE plugintype, out string name, int namelen, out uint version) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_System_GetPluginInfo(this.handle, handle, out plugintype, stringMem, namelen, out version); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getPluginInfo(uint handle, out PLUGINTYPE plugintype, out uint version) + { + return FMOD5_System_GetPluginInfo(this.handle, handle, out plugintype, IntPtr.Zero, 0, out version); + } + public RESULT setOutputByPlugin(uint handle) + { + return FMOD5_System_SetOutputByPlugin(this.handle, handle); + } + public RESULT getOutputByPlugin(out uint handle) + { + return FMOD5_System_GetOutputByPlugin(this.handle, out handle); + } + public RESULT createDSPByPlugin(uint handle, out DSP dsp) + { + return FMOD5_System_CreateDSPByPlugin(this.handle, handle, out dsp.handle); + } + public RESULT getDSPInfoByPlugin(uint handle, out IntPtr description) + { + return FMOD5_System_GetDSPInfoByPlugin(this.handle, handle, out description); + } + public RESULT registerDSP(ref DSP_DESCRIPTION description, out uint handle) + { + return FMOD5_System_RegisterDSP(this.handle, ref description, out handle); + } + + // Init/Close. + public RESULT init(int maxchannels, INITFLAGS flags, IntPtr extradriverdata) + { + return FMOD5_System_Init(this.handle, maxchannels, flags, extradriverdata); + } + public RESULT close() + { + return FMOD5_System_Close(this.handle); + } + + // General post-init system functions. + public RESULT update() + { + return FMOD5_System_Update(this.handle); + } + public RESULT setSpeakerPosition(SPEAKER speaker, float x, float y, bool active) + { + return FMOD5_System_SetSpeakerPosition(this.handle, speaker, x, y, active); + } + public RESULT getSpeakerPosition(SPEAKER speaker, out float x, out float y, out bool active) + { + return FMOD5_System_GetSpeakerPosition(this.handle, speaker, out x, out y, out active); + } + public RESULT setStreamBufferSize(uint filebuffersize, TIMEUNIT filebuffersizetype) + { + return FMOD5_System_SetStreamBufferSize(this.handle, filebuffersize, filebuffersizetype); + } + public RESULT getStreamBufferSize(out uint filebuffersize, out TIMEUNIT filebuffersizetype) + { + return FMOD5_System_GetStreamBufferSize(this.handle, out filebuffersize, out filebuffersizetype); + } + public RESULT set3DSettings(float dopplerscale, float distancefactor, float rolloffscale) + { + return FMOD5_System_Set3DSettings(this.handle, dopplerscale, distancefactor, rolloffscale); + } + public RESULT get3DSettings(out float dopplerscale, out float distancefactor, out float rolloffscale) + { + return FMOD5_System_Get3DSettings(this.handle, out dopplerscale, out distancefactor, out rolloffscale); + } + public RESULT set3DNumListeners(int numlisteners) + { + return FMOD5_System_Set3DNumListeners(this.handle, numlisteners); + } + public RESULT get3DNumListeners(out int numlisteners) + { + return FMOD5_System_Get3DNumListeners(this.handle, out numlisteners); + } + public RESULT set3DListenerAttributes(int listener, ref VECTOR pos, ref VECTOR vel, ref VECTOR forward, ref VECTOR up) + { + return FMOD5_System_Set3DListenerAttributes(this.handle, listener, ref pos, ref vel, ref forward, ref up); + } + public RESULT get3DListenerAttributes(int listener, out VECTOR pos, out VECTOR vel, out VECTOR forward, out VECTOR up) + { + return FMOD5_System_Get3DListenerAttributes(this.handle, listener, out pos, out vel, out forward, out up); + } + public RESULT set3DRolloffCallback(CB_3D_ROLLOFF_CALLBACK callback) + { + return FMOD5_System_Set3DRolloffCallback(this.handle, callback); + } + public RESULT mixerSuspend() + { + return FMOD5_System_MixerSuspend(this.handle); + } + public RESULT mixerResume() + { + return FMOD5_System_MixerResume(this.handle); + } + public RESULT getDefaultMixMatrix(SPEAKERMODE sourcespeakermode, SPEAKERMODE targetspeakermode, float[] matrix, int matrixhop) + { + return FMOD5_System_GetDefaultMixMatrix(this.handle, sourcespeakermode, targetspeakermode, matrix, matrixhop); + } + public RESULT getSpeakerModeChannels(SPEAKERMODE mode, out int channels) + { + return FMOD5_System_GetSpeakerModeChannels(this.handle, mode, out channels); + } + + // System information functions. + public RESULT getVersion(out uint version) + { + return FMOD5_System_GetVersion(this.handle, out version); + } + public RESULT getOutputHandle(out IntPtr handle) + { + return FMOD5_System_GetOutputHandle(this.handle, out handle); + } + public RESULT getChannelsPlaying(out int channels) + { + return FMOD5_System_GetChannelsPlaying(this.handle, out channels, IntPtr.Zero); + } + public RESULT getChannelsPlaying(out int channels, out int realchannels) + { + return FMOD5_System_GetChannelsPlaying(this.handle, out channels, out realchannels); + } + public RESULT getCPUUsage(out CPU_USAGE usage) + { + return FMOD5_System_GetCPUUsage(this.handle, out usage); + } + public RESULT getFileUsage(out Int64 sampleBytesRead, out Int64 streamBytesRead, out Int64 otherBytesRead) + { + return FMOD5_System_GetFileUsage(this.handle, out sampleBytesRead, out streamBytesRead, out otherBytesRead); + } + + // Sound/DSP/Channel/FX creation and retrieval. + public RESULT createSound(string name, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_CreateSound(this.handle, encoder.byteFromStringUTF8(name), mode, ref exinfo, out sound.handle); + } + } + public RESULT createSound(byte[] data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + return FMOD5_System_CreateSound(this.handle, data, mode, ref exinfo, out sound.handle); + } + public RESULT createSound(IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + return FMOD5_System_CreateSound(this.handle, name_or_data, mode, ref exinfo, out sound.handle); + } + public RESULT createSound(string name, MODE mode, out Sound sound) + { + CREATESOUNDEXINFO exinfo = new CREATESOUNDEXINFO(); + exinfo.cbsize = MarshalHelper.SizeOf(typeof(CREATESOUNDEXINFO)); + + return createSound(name, mode, ref exinfo, out sound); + } + public RESULT createStream(string name, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_CreateStream(this.handle, encoder.byteFromStringUTF8(name), mode, ref exinfo, out sound.handle); + } + } + public RESULT createStream(byte[] data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + return FMOD5_System_CreateStream(this.handle, data, mode, ref exinfo, out sound.handle); + } + public RESULT createStream(IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) + { + return FMOD5_System_CreateStream(this.handle, name_or_data, mode, ref exinfo, out sound.handle); + } + public RESULT createStream(string name, MODE mode, out Sound sound) + { + CREATESOUNDEXINFO exinfo = new CREATESOUNDEXINFO(); + exinfo.cbsize = MarshalHelper.SizeOf(typeof(CREATESOUNDEXINFO)); + + return createStream(name, mode, ref exinfo, out sound); + } + public RESULT createDSP(ref DSP_DESCRIPTION description, out DSP dsp) + { + return FMOD5_System_CreateDSP(this.handle, ref description, out dsp.handle); + } + public RESULT createDSPByType(DSP_TYPE type, out DSP dsp) + { + return FMOD5_System_CreateDSPByType(this.handle, type, out dsp.handle); + } + public RESULT createChannelGroup(string name, out ChannelGroup channelgroup) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_CreateChannelGroup(this.handle, encoder.byteFromStringUTF8(name), out channelgroup.handle); + } + } + public RESULT createSoundGroup(string name, out SoundGroup soundgroup) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_CreateSoundGroup(this.handle, encoder.byteFromStringUTF8(name), out soundgroup.handle); + } + } + public RESULT createReverb3D(out Reverb3D reverb) + { + return FMOD5_System_CreateReverb3D(this.handle, out reverb.handle); + } + public RESULT playSound(Sound sound, ChannelGroup channelgroup, bool paused, out Channel channel) + { + return FMOD5_System_PlaySound(this.handle, sound.handle, channelgroup.handle, paused, out channel.handle); + } + public RESULT playDSP(DSP dsp, ChannelGroup channelgroup, bool paused, out Channel channel) + { + return FMOD5_System_PlayDSP(this.handle, dsp.handle, channelgroup.handle, paused, out channel.handle); + } + public RESULT getChannel(int channelid, out Channel channel) + { + return FMOD5_System_GetChannel(this.handle, channelid, out channel.handle); + } + public RESULT getDSPInfoByType(DSP_TYPE type, out IntPtr description) + { + return FMOD5_System_GetDSPInfoByType(this.handle, type, out description); + } + public RESULT getMasterChannelGroup(out ChannelGroup channelgroup) + { + return FMOD5_System_GetMasterChannelGroup(this.handle, out channelgroup.handle); + } + public RESULT getMasterSoundGroup(out SoundGroup soundgroup) + { + return FMOD5_System_GetMasterSoundGroup(this.handle, out soundgroup.handle); + } + + // Routing to ports. + public RESULT attachChannelGroupToPort(PORT_TYPE portType, ulong portIndex, ChannelGroup channelgroup, bool passThru = false) + { + return FMOD5_System_AttachChannelGroupToPort(this.handle, portType, portIndex, channelgroup.handle, passThru); + } + public RESULT detachChannelGroupFromPort(ChannelGroup channelgroup) + { + return FMOD5_System_DetachChannelGroupFromPort(this.handle, channelgroup.handle); + } + + // Reverb api. + public RESULT setReverbProperties(int instance, ref REVERB_PROPERTIES prop) + { + return FMOD5_System_SetReverbProperties(this.handle, instance, ref prop); + } + public RESULT getReverbProperties(int instance, out REVERB_PROPERTIES prop) + { + return FMOD5_System_GetReverbProperties(this.handle, instance, out prop); + } + + // System level DSP functionality. + public RESULT lockDSP() + { + return FMOD5_System_LockDSP(this.handle); + } + public RESULT unlockDSP() + { + return FMOD5_System_UnlockDSP(this.handle); + } + + // Recording api + public RESULT getRecordNumDrivers(out int numdrivers, out int numconnected) + { + return FMOD5_System_GetRecordNumDrivers(this.handle, out numdrivers, out numconnected); + } + public RESULT getRecordDriverInfo(int id, out string name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels, out DRIVER_STATE state) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_System_GetRecordDriverInfo(this.handle, id, stringMem, namelen, out guid, out systemrate, out speakermode, out speakermodechannels, out state); + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getRecordDriverInfo(int id, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels, out DRIVER_STATE state) + { + return FMOD5_System_GetRecordDriverInfo(this.handle, id, IntPtr.Zero, 0, out guid, out systemrate, out speakermode, out speakermodechannels, out state); + } + public RESULT getRecordPosition(int id, out uint position) + { + return FMOD5_System_GetRecordPosition(this.handle, id, out position); + } + public RESULT recordStart(int id, Sound sound, bool loop) + { + return FMOD5_System_RecordStart(this.handle, id, sound.handle, loop); + } + public RESULT recordStop(int id) + { + return FMOD5_System_RecordStop(this.handle, id); + } + public RESULT isRecording(int id, out bool recording) + { + return FMOD5_System_IsRecording(this.handle, id, out recording); + } + + // Geometry api + public RESULT createGeometry(int maxpolygons, int maxvertices, out Geometry geometry) + { + return FMOD5_System_CreateGeometry(this.handle, maxpolygons, maxvertices, out geometry.handle); + } + public RESULT setGeometrySettings(float maxworldsize) + { + return FMOD5_System_SetGeometrySettings(this.handle, maxworldsize); + } + public RESULT getGeometrySettings(out float maxworldsize) + { + return FMOD5_System_GetGeometrySettings(this.handle, out maxworldsize); + } + public RESULT loadGeometry(IntPtr data, int datasize, out Geometry geometry) + { + return FMOD5_System_LoadGeometry(this.handle, data, datasize, out geometry.handle); + } + public RESULT getGeometryOcclusion(ref VECTOR listener, ref VECTOR source, out float direct, out float reverb) + { + return FMOD5_System_GetGeometryOcclusion(this.handle, ref listener, ref source, out direct, out reverb); + } + + // Network functions + public RESULT setNetworkProxy(string proxy) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_System_SetNetworkProxy(this.handle, encoder.byteFromStringUTF8(proxy)); + } + } + public RESULT getNetworkProxy(out string proxy, int proxylen) + { + IntPtr stringMem = Marshal.AllocHGlobal(proxylen); + + RESULT result = FMOD5_System_GetNetworkProxy(this.handle, stringMem, proxylen); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + proxy = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT setNetworkTimeout(int timeout) + { + return FMOD5_System_SetNetworkTimeout(this.handle, timeout); + } + public RESULT getNetworkTimeout(out int timeout) + { + return FMOD5_System_GetNetworkTimeout(this.handle, out timeout); + } + + // Userdata set/get + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_System_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_System_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Release (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetOutput (IntPtr system, OUTPUTTYPE output); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetOutput (IntPtr system, out OUTPUTTYPE output); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNumDrivers (IntPtr system, out int numdrivers); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDriverInfo (IntPtr system, int id, IntPtr name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetDriver (IntPtr system, int driver); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDriver (IntPtr system, out int driver); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetSoftwareChannels (IntPtr system, int numsoftwarechannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetSoftwareChannels (IntPtr system, out int numsoftwarechannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetSoftwareFormat (IntPtr system, int samplerate, SPEAKERMODE speakermode, int numrawspeakers); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetSoftwareFormat (IntPtr system, out int samplerate, out SPEAKERMODE speakermode, out int numrawspeakers); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetDSPBufferSize (IntPtr system, uint bufferlength, int numbuffers); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDSPBufferSize (IntPtr system, out uint bufferlength, out int numbuffers); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetFileSystem (IntPtr system, FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek, FILE_ASYNCREAD_CALLBACK userasyncread, FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_AttachFileSystem (IntPtr system, FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetAdvancedSettings (IntPtr system, ref ADVANCEDSETTINGS settings); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetAdvancedSettings (IntPtr system, ref ADVANCEDSETTINGS settings); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetCallback (IntPtr system, SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetPluginPath (IntPtr system, byte[] path); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_LoadPlugin (IntPtr system, byte[] filename, out uint handle, uint priority); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_UnloadPlugin (IntPtr system, uint handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNumNestedPlugins (IntPtr system, uint handle, out int count); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNestedPlugin (IntPtr system, uint handle, int index, out uint nestedhandle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNumPlugins (IntPtr system, PLUGINTYPE plugintype, out int numplugins); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetPluginHandle (IntPtr system, PLUGINTYPE plugintype, int index, out uint handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetPluginInfo (IntPtr system, uint handle, out PLUGINTYPE plugintype, IntPtr name, int namelen, out uint version); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetOutputByPlugin (IntPtr system, uint handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetOutputByPlugin (IntPtr system, out uint handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateDSPByPlugin (IntPtr system, uint handle, out IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDSPInfoByPlugin (IntPtr system, uint handle, out IntPtr description); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_RegisterDSP (IntPtr system, ref DSP_DESCRIPTION description, out uint handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Init (IntPtr system, int maxchannels, INITFLAGS flags, IntPtr extradriverdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Close (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Update (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetSpeakerPosition (IntPtr system, SPEAKER speaker, float x, float y, bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetSpeakerPosition (IntPtr system, SPEAKER speaker, out float x, out float y, out bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetStreamBufferSize (IntPtr system, uint filebuffersize, TIMEUNIT filebuffersizetype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetStreamBufferSize (IntPtr system, out uint filebuffersize, out TIMEUNIT filebuffersizetype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Set3DSettings (IntPtr system, float dopplerscale, float distancefactor, float rolloffscale); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Get3DSettings (IntPtr system, out float dopplerscale, out float distancefactor, out float rolloffscale); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Set3DNumListeners (IntPtr system, int numlisteners); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Get3DNumListeners (IntPtr system, out int numlisteners); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Set3DListenerAttributes (IntPtr system, int listener, ref VECTOR pos, ref VECTOR vel, ref VECTOR forward, ref VECTOR up); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Get3DListenerAttributes (IntPtr system, int listener, out VECTOR pos, out VECTOR vel, out VECTOR forward, out VECTOR up); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_Set3DRolloffCallback (IntPtr system, CB_3D_ROLLOFF_CALLBACK callback); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_MixerSuspend (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_MixerResume (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDefaultMixMatrix (IntPtr system, SPEAKERMODE sourcespeakermode, SPEAKERMODE targetspeakermode, float[] matrix, int matrixhop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetSpeakerModeChannels (IntPtr system, SPEAKERMODE mode, out int channels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetVersion (IntPtr system, out uint version); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetOutputHandle (IntPtr system, out IntPtr handle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetChannelsPlaying (IntPtr system, out int channels, IntPtr zero); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetChannelsPlaying (IntPtr system, out int channels, out int realchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetCPUUsage (IntPtr system, out CPU_USAGE usage); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetFileUsage (IntPtr system, out Int64 sampleBytesRead, out Int64 streamBytesRead, out Int64 otherBytesRead); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateSound (IntPtr system, byte[] name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateSound (IntPtr system, IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateStream (IntPtr system, byte[] name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateStream (IntPtr system, IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateDSP (IntPtr system, ref DSP_DESCRIPTION description, out IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateDSPByType (IntPtr system, DSP_TYPE type, out IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateChannelGroup (IntPtr system, byte[] name, out IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateSoundGroup (IntPtr system, byte[] name, out IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateReverb3D (IntPtr system, out IntPtr reverb); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_PlaySound (IntPtr system, IntPtr sound, IntPtr channelgroup, bool paused, out IntPtr channel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_PlayDSP (IntPtr system, IntPtr dsp, IntPtr channelgroup, bool paused, out IntPtr channel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetChannel (IntPtr system, int channelid, out IntPtr channel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetDSPInfoByType (IntPtr system, DSP_TYPE type, out IntPtr description); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetMasterChannelGroup (IntPtr system, out IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetMasterSoundGroup (IntPtr system, out IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_AttachChannelGroupToPort (IntPtr system, PORT_TYPE portType, ulong portIndex, IntPtr channelgroup, bool passThru); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_DetachChannelGroupFromPort(IntPtr system, IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetReverbProperties (IntPtr system, int instance, ref REVERB_PROPERTIES prop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetReverbProperties (IntPtr system, int instance, out REVERB_PROPERTIES prop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_LockDSP (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_UnlockDSP (IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetRecordNumDrivers (IntPtr system, out int numdrivers, out int numconnected); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetRecordDriverInfo (IntPtr system, int id, IntPtr name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels, out DRIVER_STATE state); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetRecordPosition (IntPtr system, int id, out uint position); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_RecordStart (IntPtr system, int id, IntPtr sound, bool loop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_RecordStop (IntPtr system, int id); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_IsRecording (IntPtr system, int id, out bool recording); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_CreateGeometry (IntPtr system, int maxpolygons, int maxvertices, out IntPtr geometry); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetGeometrySettings (IntPtr system, float maxworldsize); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetGeometrySettings (IntPtr system, out float maxworldsize); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_LoadGeometry (IntPtr system, IntPtr data, int datasize, out IntPtr geometry); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetGeometryOcclusion (IntPtr system, ref VECTOR listener, ref VECTOR source, out float direct, out float reverb); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetNetworkProxy (IntPtr system, byte[] proxy); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNetworkProxy (IntPtr system, IntPtr proxy, int proxylen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetNetworkTimeout (IntPtr system, int timeout); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetNetworkTimeout (IntPtr system, out int timeout); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_SetUserData (IntPtr system, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_System_GetUserData (IntPtr system, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public System(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + + /* + 'Sound' API. + */ + public struct Sound + { + public RESULT release() + { + return FMOD5_Sound_Release(this.handle); + } + public RESULT getSystemObject(out System system) + { + return FMOD5_Sound_GetSystemObject(this.handle, out system.handle); + } + + // Standard sound manipulation functions. + public RESULT @lock(uint offset, uint length, out IntPtr ptr1, out IntPtr ptr2, out uint len1, out uint len2) + { + return FMOD5_Sound_Lock(this.handle, offset, length, out ptr1, out ptr2, out len1, out len2); + } + public RESULT unlock(IntPtr ptr1, IntPtr ptr2, uint len1, uint len2) + { + return FMOD5_Sound_Unlock(this.handle, ptr1, ptr2, len1, len2); + } + public RESULT setDefaults(float frequency, int priority) + { + return FMOD5_Sound_SetDefaults(this.handle, frequency, priority); + } + public RESULT getDefaults(out float frequency, out int priority) + { + return FMOD5_Sound_GetDefaults(this.handle, out frequency, out priority); + } + public RESULT set3DMinMaxDistance(float min, float max) + { + return FMOD5_Sound_Set3DMinMaxDistance(this.handle, min, max); + } + public RESULT get3DMinMaxDistance(out float min, out float max) + { + return FMOD5_Sound_Get3DMinMaxDistance(this.handle, out min, out max); + } + public RESULT set3DConeSettings(float insideconeangle, float outsideconeangle, float outsidevolume) + { + return FMOD5_Sound_Set3DConeSettings(this.handle, insideconeangle, outsideconeangle, outsidevolume); + } + public RESULT get3DConeSettings(out float insideconeangle, out float outsideconeangle, out float outsidevolume) + { + return FMOD5_Sound_Get3DConeSettings(this.handle, out insideconeangle, out outsideconeangle, out outsidevolume); + } + public RESULT set3DCustomRolloff(ref VECTOR points, int numpoints) + { + return FMOD5_Sound_Set3DCustomRolloff(this.handle, ref points, numpoints); + } + public RESULT get3DCustomRolloff(out IntPtr points, out int numpoints) + { + return FMOD5_Sound_Get3DCustomRolloff(this.handle, out points, out numpoints); + } + + public RESULT getSubSound(int index, out Sound subsound) + { + return FMOD5_Sound_GetSubSound(this.handle, index, out subsound.handle); + } + public RESULT getSubSoundParent(out Sound parentsound) + { + return FMOD5_Sound_GetSubSoundParent(this.handle, out parentsound.handle); + } + public RESULT getName(out string name, int namelen) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_Sound_GetName(this.handle, stringMem, namelen); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getLength(out uint length, TIMEUNIT lengthtype) + { + return FMOD5_Sound_GetLength(this.handle, out length, lengthtype); + } + public RESULT getFormat(out SOUND_TYPE type, out SOUND_FORMAT format, out int channels, out int bits) + { + return FMOD5_Sound_GetFormat(this.handle, out type, out format, out channels, out bits); + } + public RESULT getNumSubSounds(out int numsubsounds) + { + return FMOD5_Sound_GetNumSubSounds(this.handle, out numsubsounds); + } + public RESULT getNumTags(out int numtags, out int numtagsupdated) + { + return FMOD5_Sound_GetNumTags(this.handle, out numtags, out numtagsupdated); + } + public RESULT getTag(string name, int index, out TAG tag) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_Sound_GetTag(this.handle, encoder.byteFromStringUTF8(name), index, out tag); + } + } + public RESULT getOpenState(out OPENSTATE openstate, out uint percentbuffered, out bool starving, out bool diskbusy) + { + return FMOD5_Sound_GetOpenState(this.handle, out openstate, out percentbuffered, out starving, out diskbusy); + } + public RESULT readData(byte[] buffer) + { + return FMOD5_Sound_ReadData(this.handle, buffer, (uint)buffer.Length, IntPtr.Zero); + } + public RESULT readData(byte[] buffer, out uint read) + { + return FMOD5_Sound_ReadData(this.handle, buffer, (uint)buffer.Length, out read); + } + [Obsolete("Use Sound.readData(byte[], out uint) or Sound.readData(byte[]) instead.")] + public RESULT readData(IntPtr buffer, uint length, out uint read) + { + return FMOD5_Sound_ReadData(this.handle, buffer, length, out read); + } + public RESULT seekData(uint pcm) + { + return FMOD5_Sound_SeekData(this.handle, pcm); + } + public RESULT setSoundGroup(SoundGroup soundgroup) + { + return FMOD5_Sound_SetSoundGroup(this.handle, soundgroup.handle); + } + public RESULT getSoundGroup(out SoundGroup soundgroup) + { + return FMOD5_Sound_GetSoundGroup(this.handle, out soundgroup.handle); + } + + // Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks. + public RESULT getNumSyncPoints(out int numsyncpoints) + { + return FMOD5_Sound_GetNumSyncPoints(this.handle, out numsyncpoints); + } + public RESULT getSyncPoint(int index, out IntPtr point) + { + return FMOD5_Sound_GetSyncPoint(this.handle, index, out point); + } + public RESULT getSyncPointInfo(IntPtr point, out string name, int namelen, out uint offset, TIMEUNIT offsettype) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_Sound_GetSyncPointInfo(this.handle, point, stringMem, namelen, out offset, offsettype); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getSyncPointInfo(IntPtr point, out uint offset, TIMEUNIT offsettype) + { + return FMOD5_Sound_GetSyncPointInfo(this.handle, point, IntPtr.Zero, 0, out offset, offsettype); + } + public RESULT addSyncPoint(uint offset, TIMEUNIT offsettype, string name, out IntPtr point) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD5_Sound_AddSyncPoint(this.handle, offset, offsettype, encoder.byteFromStringUTF8(name), out point); + } + } + public RESULT deleteSyncPoint(IntPtr point) + { + return FMOD5_Sound_DeleteSyncPoint(this.handle, point); + } + + // Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time. + public RESULT setMode(MODE mode) + { + return FMOD5_Sound_SetMode(this.handle, mode); + } + public RESULT getMode(out MODE mode) + { + return FMOD5_Sound_GetMode(this.handle, out mode); + } + public RESULT setLoopCount(int loopcount) + { + return FMOD5_Sound_SetLoopCount(this.handle, loopcount); + } + public RESULT getLoopCount(out int loopcount) + { + return FMOD5_Sound_GetLoopCount(this.handle, out loopcount); + } + public RESULT setLoopPoints(uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype) + { + return FMOD5_Sound_SetLoopPoints(this.handle, loopstart, loopstarttype, loopend, loopendtype); + } + public RESULT getLoopPoints(out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype) + { + return FMOD5_Sound_GetLoopPoints(this.handle, out loopstart, loopstarttype, out loopend, loopendtype); + } + + // For MOD/S3M/XM/IT/MID sequenced formats only. + public RESULT getMusicNumChannels(out int numchannels) + { + return FMOD5_Sound_GetMusicNumChannels(this.handle, out numchannels); + } + public RESULT setMusicChannelVolume(int channel, float volume) + { + return FMOD5_Sound_SetMusicChannelVolume(this.handle, channel, volume); + } + public RESULT getMusicChannelVolume(int channel, out float volume) + { + return FMOD5_Sound_GetMusicChannelVolume(this.handle, channel, out volume); + } + public RESULT setMusicSpeed(float speed) + { + return FMOD5_Sound_SetMusicSpeed(this.handle, speed); + } + public RESULT getMusicSpeed(out float speed) + { + return FMOD5_Sound_GetMusicSpeed(this.handle, out speed); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_Sound_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_Sound_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Release (IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSystemObject (IntPtr sound, out IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Lock (IntPtr sound, uint offset, uint length, out IntPtr ptr1, out IntPtr ptr2, out uint len1, out uint len2); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Unlock (IntPtr sound, IntPtr ptr1, IntPtr ptr2, uint len1, uint len2); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetDefaults (IntPtr sound, float frequency, int priority); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetDefaults (IntPtr sound, out float frequency, out int priority); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Set3DMinMaxDistance (IntPtr sound, float min, float max); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Get3DMinMaxDistance (IntPtr sound, out float min, out float max); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Set3DConeSettings (IntPtr sound, float insideconeangle, float outsideconeangle, float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Get3DConeSettings (IntPtr sound, out float insideconeangle, out float outsideconeangle, out float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Set3DCustomRolloff (IntPtr sound, ref VECTOR points, int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_Get3DCustomRolloff (IntPtr sound, out IntPtr points, out int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSubSound (IntPtr sound, int index, out IntPtr subsound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSubSoundParent (IntPtr sound, out IntPtr parentsound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetName (IntPtr sound, IntPtr name, int namelen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetLength (IntPtr sound, out uint length, TIMEUNIT lengthtype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetFormat (IntPtr sound, out SOUND_TYPE type, out SOUND_FORMAT format, out int channels, out int bits); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetNumSubSounds (IntPtr sound, out int numsubsounds); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetNumTags (IntPtr sound, out int numtags, out int numtagsupdated); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetTag (IntPtr sound, byte[] name, int index, out TAG tag); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetOpenState (IntPtr sound, out OPENSTATE openstate, out uint percentbuffered, out bool starving, out bool diskbusy); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_ReadData (IntPtr sound, byte[] buffer, uint length, IntPtr zero); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_ReadData (IntPtr sound, byte[] buffer, uint length, out uint read); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_ReadData (IntPtr sound, IntPtr buffer, uint length, out uint read); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SeekData (IntPtr sound, uint pcm); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetSoundGroup (IntPtr sound, IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSoundGroup (IntPtr sound, out IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetNumSyncPoints (IntPtr sound, out int numsyncpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSyncPoint (IntPtr sound, int index, out IntPtr point); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetSyncPointInfo (IntPtr sound, IntPtr point, IntPtr name, int namelen, out uint offset, TIMEUNIT offsettype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_AddSyncPoint (IntPtr sound, uint offset, TIMEUNIT offsettype, byte[] name, out IntPtr point); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_DeleteSyncPoint (IntPtr sound, IntPtr point); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetMode (IntPtr sound, MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetMode (IntPtr sound, out MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetLoopCount (IntPtr sound, int loopcount); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetLoopCount (IntPtr sound, out int loopcount); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetLoopPoints (IntPtr sound, uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetLoopPoints (IntPtr sound, out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetMusicNumChannels (IntPtr sound, out int numchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetMusicChannelVolume (IntPtr sound, int channel, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetMusicChannelVolume (IntPtr sound, int channel, out float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetMusicSpeed (IntPtr sound, float speed); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetMusicSpeed (IntPtr sound, out float speed); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_SetUserData (IntPtr sound, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Sound_GetUserData (IntPtr sound, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Sound(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'ChannelControl' API + */ + interface IChannelControl + { + RESULT getSystemObject (out System system); + + // General control functionality for Channels and ChannelGroups. + RESULT stop (); + RESULT setPaused (bool paused); + RESULT getPaused (out bool paused); + RESULT setVolume (float volume); + RESULT getVolume (out float volume); + RESULT setVolumeRamp (bool ramp); + RESULT getVolumeRamp (out bool ramp); + RESULT getAudibility (out float audibility); + RESULT setPitch (float pitch); + RESULT getPitch (out float pitch); + RESULT setMute (bool mute); + RESULT getMute (out bool mute); + RESULT setReverbProperties (int instance, float wet); + RESULT getReverbProperties (int instance, out float wet); + RESULT setLowPassGain (float gain); + RESULT getLowPassGain (out float gain); + RESULT setMode (MODE mode); + RESULT getMode (out MODE mode); + RESULT setCallback (CHANNELCONTROL_CALLBACK callback); + RESULT isPlaying (out bool isplaying); + + // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. + RESULT setPan (float pan); + RESULT setMixLevelsOutput (float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); + RESULT setMixLevelsInput (float[] levels, int numlevels); + RESULT setMixMatrix (float[] matrix, int outchannels, int inchannels, int inchannel_hop); + RESULT getMixMatrix (float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); + + // Clock based functionality. + RESULT getDSPClock (out ulong dspclock, out ulong parentclock); + RESULT setDelay (ulong dspclock_start, ulong dspclock_end, bool stopchannels); + RESULT getDelay (out ulong dspclock_start, out ulong dspclock_end); + RESULT getDelay (out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels); + RESULT addFadePoint (ulong dspclock, float volume); + RESULT setFadePointRamp (ulong dspclock, float volume); + RESULT removeFadePoints (ulong dspclock_start, ulong dspclock_end); + RESULT getFadePoints (ref uint numpoints, ulong[] point_dspclock, float[] point_volume); + + // DSP effects. + RESULT getDSP (int index, out DSP dsp); + RESULT addDSP (int index, DSP dsp); + RESULT removeDSP (DSP dsp); + RESULT getNumDSPs (out int numdsps); + RESULT setDSPIndex (DSP dsp, int index); + RESULT getDSPIndex (DSP dsp, out int index); + + // 3D functionality. + RESULT set3DAttributes (ref VECTOR pos, ref VECTOR vel); + RESULT get3DAttributes (out VECTOR pos, out VECTOR vel); + RESULT set3DMinMaxDistance (float mindistance, float maxdistance); + RESULT get3DMinMaxDistance (out float mindistance, out float maxdistance); + RESULT set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume); + RESULT get3DConeSettings (out float insideconeangle, out float outsideconeangle, out float outsidevolume); + RESULT set3DConeOrientation (ref VECTOR orientation); + RESULT get3DConeOrientation (out VECTOR orientation); + RESULT set3DCustomRolloff (ref VECTOR points, int numpoints); + RESULT get3DCustomRolloff (out IntPtr points, out int numpoints); + RESULT set3DOcclusion (float directocclusion, float reverbocclusion); + RESULT get3DOcclusion (out float directocclusion, out float reverbocclusion); + RESULT set3DSpread (float angle); + RESULT get3DSpread (out float angle); + RESULT set3DLevel (float level); + RESULT get3DLevel (out float level); + RESULT set3DDopplerLevel (float level); + RESULT get3DDopplerLevel (out float level); + RESULT set3DDistanceFilter (bool custom, float customLevel, float centerFreq); + RESULT get3DDistanceFilter (out bool custom, out float customLevel, out float centerFreq); + + // Userdata set/get. + RESULT setUserData (IntPtr userdata); + RESULT getUserData (out IntPtr userdata); + } + + /* + 'Channel' API + */ + public struct Channel : IChannelControl + { + // Channel specific control functionality. + public RESULT setFrequency(float frequency) + { + return FMOD5_Channel_SetFrequency(this.handle, frequency); + } + public RESULT getFrequency(out float frequency) + { + return FMOD5_Channel_GetFrequency(this.handle, out frequency); + } + public RESULT setPriority(int priority) + { + return FMOD5_Channel_SetPriority(this.handle, priority); + } + public RESULT getPriority(out int priority) + { + return FMOD5_Channel_GetPriority(this.handle, out priority); + } + public RESULT setPosition(uint position, TIMEUNIT postype) + { + return FMOD5_Channel_SetPosition(this.handle, position, postype); + } + public RESULT getPosition(out uint position, TIMEUNIT postype) + { + return FMOD5_Channel_GetPosition(this.handle, out position, postype); + } + public RESULT setChannelGroup(ChannelGroup channelgroup) + { + return FMOD5_Channel_SetChannelGroup(this.handle, channelgroup.handle); + } + public RESULT getChannelGroup(out ChannelGroup channelgroup) + { + return FMOD5_Channel_GetChannelGroup(this.handle, out channelgroup.handle); + } + public RESULT setLoopCount(int loopcount) + { + return FMOD5_Channel_SetLoopCount(this.handle, loopcount); + } + public RESULT getLoopCount(out int loopcount) + { + return FMOD5_Channel_GetLoopCount(this.handle, out loopcount); + } + public RESULT setLoopPoints(uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype) + { + return FMOD5_Channel_SetLoopPoints(this.handle, loopstart, loopstarttype, loopend, loopendtype); + } + public RESULT getLoopPoints(out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype) + { + return FMOD5_Channel_GetLoopPoints(this.handle, out loopstart, loopstarttype, out loopend, loopendtype); + } + + // Information only functions. + public RESULT isVirtual(out bool isvirtual) + { + return FMOD5_Channel_IsVirtual(this.handle, out isvirtual); + } + public RESULT getCurrentSound(out Sound sound) + { + return FMOD5_Channel_GetCurrentSound(this.handle, out sound.handle); + } + public RESULT getIndex(out int index) + { + return FMOD5_Channel_GetIndex(this.handle, out index); + } + + public RESULT getSystemObject(out System system) + { + return FMOD5_Channel_GetSystemObject(this.handle, out system.handle); + } + + // General control functionality for Channels and ChannelGroups. + public RESULT stop() + { + return FMOD5_Channel_Stop(this.handle); + } + public RESULT setPaused(bool paused) + { + return FMOD5_Channel_SetPaused(this.handle, paused); + } + public RESULT getPaused(out bool paused) + { + return FMOD5_Channel_GetPaused(this.handle, out paused); + } + public RESULT setVolume(float volume) + { + return FMOD5_Channel_SetVolume(this.handle, volume); + } + public RESULT getVolume(out float volume) + { + return FMOD5_Channel_GetVolume(this.handle, out volume); + } + public RESULT setVolumeRamp(bool ramp) + { + return FMOD5_Channel_SetVolumeRamp(this.handle, ramp); + } + public RESULT getVolumeRamp(out bool ramp) + { + return FMOD5_Channel_GetVolumeRamp(this.handle, out ramp); + } + public RESULT getAudibility(out float audibility) + { + return FMOD5_Channel_GetAudibility(this.handle, out audibility); + } + public RESULT setPitch(float pitch) + { + return FMOD5_Channel_SetPitch(this.handle, pitch); + } + public RESULT getPitch(out float pitch) + { + return FMOD5_Channel_GetPitch(this.handle, out pitch); + } + public RESULT setMute(bool mute) + { + return FMOD5_Channel_SetMute(this.handle, mute); + } + public RESULT getMute(out bool mute) + { + return FMOD5_Channel_GetMute(this.handle, out mute); + } + public RESULT setReverbProperties(int instance, float wet) + { + return FMOD5_Channel_SetReverbProperties(this.handle, instance, wet); + } + public RESULT getReverbProperties(int instance, out float wet) + { + return FMOD5_Channel_GetReverbProperties(this.handle, instance, out wet); + } + public RESULT setLowPassGain(float gain) + { + return FMOD5_Channel_SetLowPassGain(this.handle, gain); + } + public RESULT getLowPassGain(out float gain) + { + return FMOD5_Channel_GetLowPassGain(this.handle, out gain); + } + public RESULT setMode(MODE mode) + { + return FMOD5_Channel_SetMode(this.handle, mode); + } + public RESULT getMode(out MODE mode) + { + return FMOD5_Channel_GetMode(this.handle, out mode); + } + public RESULT setCallback(CHANNELCONTROL_CALLBACK callback) + { + return FMOD5_Channel_SetCallback(this.handle, callback); + } + public RESULT isPlaying(out bool isplaying) + { + return FMOD5_Channel_IsPlaying(this.handle, out isplaying); + } + + // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. + public RESULT setPan(float pan) + { + return FMOD5_Channel_SetPan(this.handle, pan); + } + public RESULT setMixLevelsOutput(float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright) + { + return FMOD5_Channel_SetMixLevelsOutput(this.handle, frontleft, frontright, center, lfe, surroundleft, surroundright, backleft, backright); + } + public RESULT setMixLevelsInput(float[] levels, int numlevels) + { + return FMOD5_Channel_SetMixLevelsInput(this.handle, levels, numlevels); + } + public RESULT setMixMatrix(float[] matrix, int outchannels, int inchannels, int inchannel_hop = 0) + { + return FMOD5_Channel_SetMixMatrix(this.handle, matrix, outchannels, inchannels, inchannel_hop); + } + public RESULT getMixMatrix(float[] matrix, out int outchannels, out int inchannels, int inchannel_hop = 0) + { + return FMOD5_Channel_GetMixMatrix(this.handle, matrix, out outchannels, out inchannels, inchannel_hop); + } + + // Clock based functionality. + public RESULT getDSPClock(out ulong dspclock, out ulong parentclock) + { + return FMOD5_Channel_GetDSPClock(this.handle, out dspclock, out parentclock); + } + public RESULT setDelay(ulong dspclock_start, ulong dspclock_end, bool stopchannels = true) + { + return FMOD5_Channel_SetDelay(this.handle, dspclock_start, dspclock_end, stopchannels); + } + public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end) + { + return FMOD5_Channel_GetDelay(this.handle, out dspclock_start, out dspclock_end, IntPtr.Zero); + } + public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels) + { + return FMOD5_Channel_GetDelay(this.handle, out dspclock_start, out dspclock_end, out stopchannels); + } + public RESULT addFadePoint(ulong dspclock, float volume) + { + return FMOD5_Channel_AddFadePoint(this.handle, dspclock, volume); + } + public RESULT setFadePointRamp(ulong dspclock, float volume) + { + return FMOD5_Channel_SetFadePointRamp(this.handle, dspclock, volume); + } + public RESULT removeFadePoints(ulong dspclock_start, ulong dspclock_end) + { + return FMOD5_Channel_RemoveFadePoints(this.handle, dspclock_start, dspclock_end); + } + public RESULT getFadePoints(ref uint numpoints, ulong[] point_dspclock, float[] point_volume) + { + return FMOD5_Channel_GetFadePoints(this.handle, ref numpoints, point_dspclock, point_volume); + } + + // DSP effects. + public RESULT getDSP(int index, out DSP dsp) + { + return FMOD5_Channel_GetDSP(this.handle, index, out dsp.handle); + } + public RESULT addDSP(int index, DSP dsp) + { + return FMOD5_Channel_AddDSP(this.handle, index, dsp.handle); + } + public RESULT removeDSP(DSP dsp) + { + return FMOD5_Channel_RemoveDSP(this.handle, dsp.handle); + } + public RESULT getNumDSPs(out int numdsps) + { + return FMOD5_Channel_GetNumDSPs(this.handle, out numdsps); + } + public RESULT setDSPIndex(DSP dsp, int index) + { + return FMOD5_Channel_SetDSPIndex(this.handle, dsp.handle, index); + } + public RESULT getDSPIndex(DSP dsp, out int index) + { + return FMOD5_Channel_GetDSPIndex(this.handle, dsp.handle, out index); + } + + // 3D functionality. + public RESULT set3DAttributes(ref VECTOR pos, ref VECTOR vel) + { + return FMOD5_Channel_Set3DAttributes(this.handle, ref pos, ref vel); + } + public RESULT get3DAttributes(out VECTOR pos, out VECTOR vel) + { + return FMOD5_Channel_Get3DAttributes(this.handle, out pos, out vel); + } + public RESULT set3DMinMaxDistance(float mindistance, float maxdistance) + { + return FMOD5_Channel_Set3DMinMaxDistance(this.handle, mindistance, maxdistance); + } + public RESULT get3DMinMaxDistance(out float mindistance, out float maxdistance) + { + return FMOD5_Channel_Get3DMinMaxDistance(this.handle, out mindistance, out maxdistance); + } + public RESULT set3DConeSettings(float insideconeangle, float outsideconeangle, float outsidevolume) + { + return FMOD5_Channel_Set3DConeSettings(this.handle, insideconeangle, outsideconeangle, outsidevolume); + } + public RESULT get3DConeSettings(out float insideconeangle, out float outsideconeangle, out float outsidevolume) + { + return FMOD5_Channel_Get3DConeSettings(this.handle, out insideconeangle, out outsideconeangle, out outsidevolume); + } + public RESULT set3DConeOrientation(ref VECTOR orientation) + { + return FMOD5_Channel_Set3DConeOrientation(this.handle, ref orientation); + } + public RESULT get3DConeOrientation(out VECTOR orientation) + { + return FMOD5_Channel_Get3DConeOrientation(this.handle, out orientation); + } + public RESULT set3DCustomRolloff(ref VECTOR points, int numpoints) + { + return FMOD5_Channel_Set3DCustomRolloff(this.handle, ref points, numpoints); + } + public RESULT get3DCustomRolloff(out IntPtr points, out int numpoints) + { + return FMOD5_Channel_Get3DCustomRolloff(this.handle, out points, out numpoints); + } + public RESULT set3DOcclusion(float directocclusion, float reverbocclusion) + { + return FMOD5_Channel_Set3DOcclusion(this.handle, directocclusion, reverbocclusion); + } + public RESULT get3DOcclusion(out float directocclusion, out float reverbocclusion) + { + return FMOD5_Channel_Get3DOcclusion(this.handle, out directocclusion, out reverbocclusion); + } + public RESULT set3DSpread(float angle) + { + return FMOD5_Channel_Set3DSpread(this.handle, angle); + } + public RESULT get3DSpread(out float angle) + { + return FMOD5_Channel_Get3DSpread(this.handle, out angle); + } + public RESULT set3DLevel(float level) + { + return FMOD5_Channel_Set3DLevel(this.handle, level); + } + public RESULT get3DLevel(out float level) + { + return FMOD5_Channel_Get3DLevel(this.handle, out level); + } + public RESULT set3DDopplerLevel(float level) + { + return FMOD5_Channel_Set3DDopplerLevel(this.handle, level); + } + public RESULT get3DDopplerLevel(out float level) + { + return FMOD5_Channel_Get3DDopplerLevel(this.handle, out level); + } + public RESULT set3DDistanceFilter(bool custom, float customLevel, float centerFreq) + { + return FMOD5_Channel_Set3DDistanceFilter(this.handle, custom, customLevel, centerFreq); + } + public RESULT get3DDistanceFilter(out bool custom, out float customLevel, out float centerFreq) + { + return FMOD5_Channel_Get3DDistanceFilter(this.handle, out custom, out customLevel, out centerFreq); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_Channel_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_Channel_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetFrequency (IntPtr channel, float frequency); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetFrequency (IntPtr channel, out float frequency); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetPriority (IntPtr channel, int priority); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetPriority (IntPtr channel, out int priority); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetPosition (IntPtr channel, uint position, TIMEUNIT postype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetPosition (IntPtr channel, out uint position, TIMEUNIT postype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetChannelGroup (IntPtr channel, IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetChannelGroup (IntPtr channel, out IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetLoopCount (IntPtr channel, int loopcount); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetLoopCount (IntPtr channel, out int loopcount); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetLoopPoints (IntPtr channel, uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetLoopPoints (IntPtr channel, out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_IsVirtual (IntPtr channel, out bool isvirtual); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetCurrentSound (IntPtr channel, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetIndex (IntPtr channel, out int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetSystemObject (IntPtr channel, out IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Stop (IntPtr channel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetPaused (IntPtr channel, bool paused); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetPaused (IntPtr channel, out bool paused); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetVolume (IntPtr channel, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetVolume (IntPtr channel, out float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetVolumeRamp (IntPtr channel, bool ramp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetVolumeRamp (IntPtr channel, out bool ramp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetAudibility (IntPtr channel, out float audibility); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetPitch (IntPtr channel, float pitch); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetPitch (IntPtr channel, out float pitch); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetMute (IntPtr channel, bool mute); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetMute (IntPtr channel, out bool mute); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetReverbProperties (IntPtr channel, int instance, float wet); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetReverbProperties (IntPtr channel, int instance, out float wet); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetLowPassGain (IntPtr channel, float gain); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetLowPassGain (IntPtr channel, out float gain); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetMode (IntPtr channel, MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetMode (IntPtr channel, out MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetCallback (IntPtr channel, CHANNELCONTROL_CALLBACK callback); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_IsPlaying (IntPtr channel, out bool isplaying); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetPan (IntPtr channel, float pan); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetMixLevelsOutput (IntPtr channel, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetMixLevelsInput (IntPtr channel, float[] levels, int numlevels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetMixMatrix (IntPtr channel, float[] matrix, int outchannels, int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetMixMatrix (IntPtr channel, float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetDSPClock (IntPtr channel, out ulong dspclock, out ulong parentclock); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetDelay (IntPtr channel, ulong dspclock_start, ulong dspclock_end, bool stopchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetDelay (IntPtr channel, out ulong dspclock_start, out ulong dspclock_end, IntPtr zero); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetDelay (IntPtr channel, out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_AddFadePoint (IntPtr channel, ulong dspclock, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetFadePointRamp (IntPtr channel, ulong dspclock, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_RemoveFadePoints (IntPtr channel, ulong dspclock_start, ulong dspclock_end); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetFadePoints (IntPtr channel, ref uint numpoints, ulong[] point_dspclock, float[] point_volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetDSP (IntPtr channel, int index, out IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_AddDSP (IntPtr channel, int index, IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_RemoveDSP (IntPtr channel, IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetNumDSPs (IntPtr channel, out int numdsps); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetDSPIndex (IntPtr channel, IntPtr dsp, int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetDSPIndex (IntPtr channel, IntPtr dsp, out int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DAttributes (IntPtr channel, ref VECTOR pos, ref VECTOR vel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DAttributes (IntPtr channel, out VECTOR pos, out VECTOR vel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DMinMaxDistance (IntPtr channel, float mindistance, float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DMinMaxDistance (IntPtr channel, out float mindistance, out float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DConeSettings (IntPtr channel, float insideconeangle, float outsideconeangle, float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DConeSettings (IntPtr channel, out float insideconeangle, out float outsideconeangle, out float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DConeOrientation (IntPtr channel, ref VECTOR orientation); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DConeOrientation (IntPtr channel, out VECTOR orientation); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DCustomRolloff (IntPtr channel, ref VECTOR points, int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DCustomRolloff (IntPtr channel, out IntPtr points, out int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DOcclusion (IntPtr channel, float directocclusion, float reverbocclusion); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DOcclusion (IntPtr channel, out float directocclusion, out float reverbocclusion); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DSpread (IntPtr channel, float angle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DSpread (IntPtr channel, out float angle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DLevel (IntPtr channel, float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DLevel (IntPtr channel, out float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DDopplerLevel (IntPtr channel, float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DDopplerLevel (IntPtr channel, out float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Set3DDistanceFilter (IntPtr channel, bool custom, float customLevel, float centerFreq); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_Get3DDistanceFilter (IntPtr channel, out bool custom, out float customLevel, out float centerFreq); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_SetUserData (IntPtr channel, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Channel_GetUserData (IntPtr channel, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Channel(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'ChannelGroup' API + */ + public struct ChannelGroup : IChannelControl + { + public RESULT release() + { + return FMOD5_ChannelGroup_Release(this.handle); + } + + // Nested channel groups. + public RESULT addGroup(ChannelGroup group, bool propagatedspclock = true) + { + return FMOD5_ChannelGroup_AddGroup(this.handle, group.handle, propagatedspclock, IntPtr.Zero); + } + public RESULT addGroup(ChannelGroup group, bool propagatedspclock, out DSPConnection connection) + { + return FMOD5_ChannelGroup_AddGroup(this.handle, group.handle, propagatedspclock, out connection.handle); + } + public RESULT getNumGroups(out int numgroups) + { + return FMOD5_ChannelGroup_GetNumGroups(this.handle, out numgroups); + } + public RESULT getGroup(int index, out ChannelGroup group) + { + return FMOD5_ChannelGroup_GetGroup(this.handle, index, out group.handle); + } + public RESULT getParentGroup(out ChannelGroup group) + { + return FMOD5_ChannelGroup_GetParentGroup(this.handle, out group.handle); + } + + // Information only functions. + public RESULT getName(out string name, int namelen) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_ChannelGroup_GetName(this.handle, stringMem, namelen); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getNumChannels(out int numchannels) + { + return FMOD5_ChannelGroup_GetNumChannels(this.handle, out numchannels); + } + public RESULT getChannel(int index, out Channel channel) + { + return FMOD5_ChannelGroup_GetChannel(this.handle, index, out channel.handle); + } + + public RESULT getSystemObject(out System system) + { + return FMOD5_ChannelGroup_GetSystemObject(this.handle, out system.handle); + } + + // General control functionality for Channels and ChannelGroups. + public RESULT stop() + { + return FMOD5_ChannelGroup_Stop(this.handle); + } + public RESULT setPaused(bool paused) + { + return FMOD5_ChannelGroup_SetPaused(this.handle, paused); + } + public RESULT getPaused(out bool paused) + { + return FMOD5_ChannelGroup_GetPaused(this.handle, out paused); + } + public RESULT setVolume(float volume) + { + return FMOD5_ChannelGroup_SetVolume(this.handle, volume); + } + public RESULT getVolume(out float volume) + { + return FMOD5_ChannelGroup_GetVolume(this.handle, out volume); + } + public RESULT setVolumeRamp(bool ramp) + { + return FMOD5_ChannelGroup_SetVolumeRamp(this.handle, ramp); + } + public RESULT getVolumeRamp(out bool ramp) + { + return FMOD5_ChannelGroup_GetVolumeRamp(this.handle, out ramp); + } + public RESULT getAudibility(out float audibility) + { + return FMOD5_ChannelGroup_GetAudibility(this.handle, out audibility); + } + public RESULT setPitch(float pitch) + { + return FMOD5_ChannelGroup_SetPitch(this.handle, pitch); + } + public RESULT getPitch(out float pitch) + { + return FMOD5_ChannelGroup_GetPitch(this.handle, out pitch); + } + public RESULT setMute(bool mute) + { + return FMOD5_ChannelGroup_SetMute(this.handle, mute); + } + public RESULT getMute(out bool mute) + { + return FMOD5_ChannelGroup_GetMute(this.handle, out mute); + } + public RESULT setReverbProperties(int instance, float wet) + { + return FMOD5_ChannelGroup_SetReverbProperties(this.handle, instance, wet); + } + public RESULT getReverbProperties(int instance, out float wet) + { + return FMOD5_ChannelGroup_GetReverbProperties(this.handle, instance, out wet); + } + public RESULT setLowPassGain(float gain) + { + return FMOD5_ChannelGroup_SetLowPassGain(this.handle, gain); + } + public RESULT getLowPassGain(out float gain) + { + return FMOD5_ChannelGroup_GetLowPassGain(this.handle, out gain); + } + public RESULT setMode(MODE mode) + { + return FMOD5_ChannelGroup_SetMode(this.handle, mode); + } + public RESULT getMode(out MODE mode) + { + return FMOD5_ChannelGroup_GetMode(this.handle, out mode); + } + public RESULT setCallback(CHANNELCONTROL_CALLBACK callback) + { + return FMOD5_ChannelGroup_SetCallback(this.handle, callback); + } + public RESULT isPlaying(out bool isplaying) + { + return FMOD5_ChannelGroup_IsPlaying(this.handle, out isplaying); + } + + // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. + public RESULT setPan(float pan) + { + return FMOD5_ChannelGroup_SetPan(this.handle, pan); + } + public RESULT setMixLevelsOutput(float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright) + { + return FMOD5_ChannelGroup_SetMixLevelsOutput(this.handle, frontleft, frontright, center, lfe, surroundleft, surroundright, backleft, backright); + } + public RESULT setMixLevelsInput(float[] levels, int numlevels) + { + return FMOD5_ChannelGroup_SetMixLevelsInput(this.handle, levels, numlevels); + } + public RESULT setMixMatrix(float[] matrix, int outchannels, int inchannels, int inchannel_hop) + { + return FMOD5_ChannelGroup_SetMixMatrix(this.handle, matrix, outchannels, inchannels, inchannel_hop); + } + public RESULT getMixMatrix(float[] matrix, out int outchannels, out int inchannels, int inchannel_hop) + { + return FMOD5_ChannelGroup_GetMixMatrix(this.handle, matrix, out outchannels, out inchannels, inchannel_hop); + } + + // Clock based functionality. + public RESULT getDSPClock(out ulong dspclock, out ulong parentclock) + { + return FMOD5_ChannelGroup_GetDSPClock(this.handle, out dspclock, out parentclock); + } + public RESULT setDelay(ulong dspclock_start, ulong dspclock_end, bool stopchannels) + { + return FMOD5_ChannelGroup_SetDelay(this.handle, dspclock_start, dspclock_end, stopchannels); + } + public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end) + { + return FMOD5_ChannelGroup_GetDelay(this.handle, out dspclock_start, out dspclock_end, IntPtr.Zero); + } + public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels) + { + return FMOD5_ChannelGroup_GetDelay(this.handle, out dspclock_start, out dspclock_end, out stopchannels); + } + public RESULT addFadePoint(ulong dspclock, float volume) + { + return FMOD5_ChannelGroup_AddFadePoint(this.handle, dspclock, volume); + } + public RESULT setFadePointRamp(ulong dspclock, float volume) + { + return FMOD5_ChannelGroup_SetFadePointRamp(this.handle, dspclock, volume); + } + public RESULT removeFadePoints(ulong dspclock_start, ulong dspclock_end) + { + return FMOD5_ChannelGroup_RemoveFadePoints(this.handle, dspclock_start, dspclock_end); + } + public RESULT getFadePoints(ref uint numpoints, ulong[] point_dspclock, float[] point_volume) + { + return FMOD5_ChannelGroup_GetFadePoints(this.handle, ref numpoints, point_dspclock, point_volume); + } + + // DSP effects. + public RESULT getDSP(int index, out DSP dsp) + { + return FMOD5_ChannelGroup_GetDSP(this.handle, index, out dsp.handle); + } + public RESULT addDSP(int index, DSP dsp) + { + return FMOD5_ChannelGroup_AddDSP(this.handle, index, dsp.handle); + } + public RESULT removeDSP(DSP dsp) + { + return FMOD5_ChannelGroup_RemoveDSP(this.handle, dsp.handle); + } + public RESULT getNumDSPs(out int numdsps) + { + return FMOD5_ChannelGroup_GetNumDSPs(this.handle, out numdsps); + } + public RESULT setDSPIndex(DSP dsp, int index) + { + return FMOD5_ChannelGroup_SetDSPIndex(this.handle, dsp.handle, index); + } + public RESULT getDSPIndex(DSP dsp, out int index) + { + return FMOD5_ChannelGroup_GetDSPIndex(this.handle, dsp.handle, out index); + } + + // 3D functionality. + public RESULT set3DAttributes(ref VECTOR pos, ref VECTOR vel) + { + return FMOD5_ChannelGroup_Set3DAttributes(this.handle, ref pos, ref vel); + } + public RESULT get3DAttributes(out VECTOR pos, out VECTOR vel) + { + return FMOD5_ChannelGroup_Get3DAttributes(this.handle, out pos, out vel); + } + public RESULT set3DMinMaxDistance(float mindistance, float maxdistance) + { + return FMOD5_ChannelGroup_Set3DMinMaxDistance(this.handle, mindistance, maxdistance); + } + public RESULT get3DMinMaxDistance(out float mindistance, out float maxdistance) + { + return FMOD5_ChannelGroup_Get3DMinMaxDistance(this.handle, out mindistance, out maxdistance); + } + public RESULT set3DConeSettings(float insideconeangle, float outsideconeangle, float outsidevolume) + { + return FMOD5_ChannelGroup_Set3DConeSettings(this.handle, insideconeangle, outsideconeangle, outsidevolume); + } + public RESULT get3DConeSettings(out float insideconeangle, out float outsideconeangle, out float outsidevolume) + { + return FMOD5_ChannelGroup_Get3DConeSettings(this.handle, out insideconeangle, out outsideconeangle, out outsidevolume); + } + public RESULT set3DConeOrientation(ref VECTOR orientation) + { + return FMOD5_ChannelGroup_Set3DConeOrientation(this.handle, ref orientation); + } + public RESULT get3DConeOrientation(out VECTOR orientation) + { + return FMOD5_ChannelGroup_Get3DConeOrientation(this.handle, out orientation); + } + public RESULT set3DCustomRolloff(ref VECTOR points, int numpoints) + { + return FMOD5_ChannelGroup_Set3DCustomRolloff(this.handle, ref points, numpoints); + } + public RESULT get3DCustomRolloff(out IntPtr points, out int numpoints) + { + return FMOD5_ChannelGroup_Get3DCustomRolloff(this.handle, out points, out numpoints); + } + public RESULT set3DOcclusion(float directocclusion, float reverbocclusion) + { + return FMOD5_ChannelGroup_Set3DOcclusion(this.handle, directocclusion, reverbocclusion); + } + public RESULT get3DOcclusion(out float directocclusion, out float reverbocclusion) + { + return FMOD5_ChannelGroup_Get3DOcclusion(this.handle, out directocclusion, out reverbocclusion); + } + public RESULT set3DSpread(float angle) + { + return FMOD5_ChannelGroup_Set3DSpread(this.handle, angle); + } + public RESULT get3DSpread(out float angle) + { + return FMOD5_ChannelGroup_Get3DSpread(this.handle, out angle); + } + public RESULT set3DLevel(float level) + { + return FMOD5_ChannelGroup_Set3DLevel(this.handle, level); + } + public RESULT get3DLevel(out float level) + { + return FMOD5_ChannelGroup_Get3DLevel(this.handle, out level); + } + public RESULT set3DDopplerLevel(float level) + { + return FMOD5_ChannelGroup_Set3DDopplerLevel(this.handle, level); + } + public RESULT get3DDopplerLevel(out float level) + { + return FMOD5_ChannelGroup_Get3DDopplerLevel(this.handle, out level); + } + public RESULT set3DDistanceFilter(bool custom, float customLevel, float centerFreq) + { + return FMOD5_ChannelGroup_Set3DDistanceFilter(this.handle, custom, customLevel, centerFreq); + } + public RESULT get3DDistanceFilter(out bool custom, out float customLevel, out float centerFreq) + { + return FMOD5_ChannelGroup_Get3DDistanceFilter(this.handle, out custom, out customLevel, out centerFreq); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_ChannelGroup_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_ChannelGroup_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Release (IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_AddGroup (IntPtr channelgroup, IntPtr group, bool propagatedspclock, IntPtr zero); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_AddGroup (IntPtr channelgroup, IntPtr group, bool propagatedspclock, out IntPtr connection); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetNumGroups (IntPtr channelgroup, out int numgroups); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetGroup (IntPtr channelgroup, int index, out IntPtr group); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetParentGroup (IntPtr channelgroup, out IntPtr group); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetName (IntPtr channelgroup, IntPtr name, int namelen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetNumChannels (IntPtr channelgroup, out int numchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetChannel (IntPtr channelgroup, int index, out IntPtr channel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetSystemObject (IntPtr channelgroup, out IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Stop (IntPtr channelgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetPaused (IntPtr channelgroup, bool paused); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetPaused (IntPtr channelgroup, out bool paused); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetVolume (IntPtr channelgroup, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetVolume (IntPtr channelgroup, out float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetVolumeRamp (IntPtr channelgroup, bool ramp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetVolumeRamp (IntPtr channelgroup, out bool ramp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetAudibility (IntPtr channelgroup, out float audibility); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetPitch (IntPtr channelgroup, float pitch); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetPitch (IntPtr channelgroup, out float pitch); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetMute (IntPtr channelgroup, bool mute); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetMute (IntPtr channelgroup, out bool mute); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetReverbProperties (IntPtr channelgroup, int instance, float wet); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetReverbProperties (IntPtr channelgroup, int instance, out float wet); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetLowPassGain (IntPtr channelgroup, float gain); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetLowPassGain (IntPtr channelgroup, out float gain); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetMode (IntPtr channelgroup, MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetMode (IntPtr channelgroup, out MODE mode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetCallback (IntPtr channelgroup, CHANNELCONTROL_CALLBACK callback); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_IsPlaying (IntPtr channelgroup, out bool isplaying); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetPan (IntPtr channelgroup, float pan); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetMixLevelsOutput (IntPtr channelgroup, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetMixLevelsInput (IntPtr channelgroup, float[] levels, int numlevels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetMixMatrix (IntPtr channelgroup, float[] matrix, int outchannels, int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetMixMatrix (IntPtr channelgroup, float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetDSPClock (IntPtr channelgroup, out ulong dspclock, out ulong parentclock); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetDelay (IntPtr channelgroup, ulong dspclock_start, ulong dspclock_end, bool stopchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetDelay (IntPtr channelgroup, out ulong dspclock_start, out ulong dspclock_end, IntPtr zero); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetDelay (IntPtr channelgroup, out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_AddFadePoint (IntPtr channelgroup, ulong dspclock, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetFadePointRamp (IntPtr channelgroup, ulong dspclock, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_RemoveFadePoints (IntPtr channelgroup, ulong dspclock_start, ulong dspclock_end); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetFadePoints (IntPtr channelgroup, ref uint numpoints, ulong[] point_dspclock, float[] point_volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetDSP (IntPtr channelgroup, int index, out IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_AddDSP (IntPtr channelgroup, int index, IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_RemoveDSP (IntPtr channelgroup, IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetNumDSPs (IntPtr channelgroup, out int numdsps); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetDSPIndex (IntPtr channelgroup, IntPtr dsp, int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetDSPIndex (IntPtr channelgroup, IntPtr dsp, out int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DAttributes (IntPtr channelgroup, ref VECTOR pos, ref VECTOR vel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DAttributes (IntPtr channelgroup, out VECTOR pos, out VECTOR vel); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DMinMaxDistance (IntPtr channelgroup, float mindistance, float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DMinMaxDistance (IntPtr channelgroup, out float mindistance, out float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DConeSettings (IntPtr channelgroup, float insideconeangle, float outsideconeangle, float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DConeSettings (IntPtr channelgroup, out float insideconeangle, out float outsideconeangle, out float outsidevolume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DConeOrientation(IntPtr channelgroup, ref VECTOR orientation); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DConeOrientation(IntPtr channelgroup, out VECTOR orientation); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DCustomRolloff (IntPtr channelgroup, ref VECTOR points, int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DCustomRolloff (IntPtr channelgroup, out IntPtr points, out int numpoints); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DOcclusion (IntPtr channelgroup, float directocclusion, float reverbocclusion); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DOcclusion (IntPtr channelgroup, out float directocclusion, out float reverbocclusion); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DSpread (IntPtr channelgroup, float angle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DSpread (IntPtr channelgroup, out float angle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DLevel (IntPtr channelgroup, float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DLevel (IntPtr channelgroup, out float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DDopplerLevel (IntPtr channelgroup, float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DDopplerLevel (IntPtr channelgroup, out float level); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Set3DDistanceFilter (IntPtr channelgroup, bool custom, float customLevel, float centerFreq); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_Get3DDistanceFilter (IntPtr channelgroup, out bool custom, out float customLevel, out float centerFreq); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_SetUserData (IntPtr channelgroup, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_ChannelGroup_GetUserData (IntPtr channelgroup, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public ChannelGroup(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'SoundGroup' API + */ + public struct SoundGroup + { + public RESULT release() + { + return FMOD5_SoundGroup_Release(this.handle); + } + + public RESULT getSystemObject(out System system) + { + return FMOD5_SoundGroup_GetSystemObject(this.handle, out system.handle); + } + + // SoundGroup control functions. + public RESULT setMaxAudible(int maxaudible) + { + return FMOD5_SoundGroup_SetMaxAudible(this.handle, maxaudible); + } + public RESULT getMaxAudible(out int maxaudible) + { + return FMOD5_SoundGroup_GetMaxAudible(this.handle, out maxaudible); + } + public RESULT setMaxAudibleBehavior(SOUNDGROUP_BEHAVIOR behavior) + { + return FMOD5_SoundGroup_SetMaxAudibleBehavior(this.handle, behavior); + } + public RESULT getMaxAudibleBehavior(out SOUNDGROUP_BEHAVIOR behavior) + { + return FMOD5_SoundGroup_GetMaxAudibleBehavior(this.handle, out behavior); + } + public RESULT setMuteFadeSpeed(float speed) + { + return FMOD5_SoundGroup_SetMuteFadeSpeed(this.handle, speed); + } + public RESULT getMuteFadeSpeed(out float speed) + { + return FMOD5_SoundGroup_GetMuteFadeSpeed(this.handle, out speed); + } + public RESULT setVolume(float volume) + { + return FMOD5_SoundGroup_SetVolume(this.handle, volume); + } + public RESULT getVolume(out float volume) + { + return FMOD5_SoundGroup_GetVolume(this.handle, out volume); + } + public RESULT stop() + { + return FMOD5_SoundGroup_Stop(this.handle); + } + + // Information only functions. + public RESULT getName(out string name, int namelen) + { + IntPtr stringMem = Marshal.AllocHGlobal(namelen); + + RESULT result = FMOD5_SoundGroup_GetName(this.handle, stringMem, namelen); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + + return result; + } + public RESULT getNumSounds(out int numsounds) + { + return FMOD5_SoundGroup_GetNumSounds(this.handle, out numsounds); + } + public RESULT getSound(int index, out Sound sound) + { + return FMOD5_SoundGroup_GetSound(this.handle, index, out sound.handle); + } + public RESULT getNumPlaying(out int numplaying) + { + return FMOD5_SoundGroup_GetNumPlaying(this.handle, out numplaying); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_SoundGroup_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_SoundGroup_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_Release (IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetSystemObject (IntPtr soundgroup, out IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_SetMaxAudible (IntPtr soundgroup, int maxaudible); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetMaxAudible (IntPtr soundgroup, out int maxaudible); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_SetMaxAudibleBehavior (IntPtr soundgroup, SOUNDGROUP_BEHAVIOR behavior); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetMaxAudibleBehavior (IntPtr soundgroup, out SOUNDGROUP_BEHAVIOR behavior); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_SetMuteFadeSpeed (IntPtr soundgroup, float speed); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetMuteFadeSpeed (IntPtr soundgroup, out float speed); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_SetVolume (IntPtr soundgroup, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetVolume (IntPtr soundgroup, out float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_Stop (IntPtr soundgroup); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetName (IntPtr soundgroup, IntPtr name, int namelen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetNumSounds (IntPtr soundgroup, out int numsounds); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetSound (IntPtr soundgroup, int index, out IntPtr sound); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetNumPlaying (IntPtr soundgroup, out int numplaying); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_SetUserData (IntPtr soundgroup, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_SoundGroup_GetUserData (IntPtr soundgroup, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public SoundGroup(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'DSP' API + */ + public struct DSP + { + public RESULT release() + { + return FMOD5_DSP_Release(this.handle); + } + public RESULT getSystemObject(out System system) + { + return FMOD5_DSP_GetSystemObject(this.handle, out system.handle); + } + + // Connection / disconnection / input and output enumeration. + public RESULT addInput(DSP input) + { + return FMOD5_DSP_AddInput(this.handle, input.handle, IntPtr.Zero, DSPCONNECTION_TYPE.STANDARD); + } + public RESULT addInput(DSP input, out DSPConnection connection, DSPCONNECTION_TYPE type = DSPCONNECTION_TYPE.STANDARD) + { + return FMOD5_DSP_AddInput(this.handle, input.handle, out connection.handle, type); + } + public RESULT disconnectFrom(DSP target, DSPConnection connection) + { + return FMOD5_DSP_DisconnectFrom(this.handle, target.handle, connection.handle); + } + public RESULT disconnectAll(bool inputs, bool outputs) + { + return FMOD5_DSP_DisconnectAll(this.handle, inputs, outputs); + } + public RESULT getNumInputs(out int numinputs) + { + return FMOD5_DSP_GetNumInputs(this.handle, out numinputs); + } + public RESULT getNumOutputs(out int numoutputs) + { + return FMOD5_DSP_GetNumOutputs(this.handle, out numoutputs); + } + public RESULT getInput(int index, out DSP input, out DSPConnection inputconnection) + { + return FMOD5_DSP_GetInput(this.handle, index, out input.handle, out inputconnection.handle); + } + public RESULT getOutput(int index, out DSP output, out DSPConnection outputconnection) + { + return FMOD5_DSP_GetOutput(this.handle, index, out output.handle, out outputconnection.handle); + } + + // DSP unit control. + public RESULT setActive(bool active) + { + return FMOD5_DSP_SetActive(this.handle, active); + } + public RESULT getActive(out bool active) + { + return FMOD5_DSP_GetActive(this.handle, out active); + } + public RESULT setBypass(bool bypass) + { + return FMOD5_DSP_SetBypass(this.handle, bypass); + } + public RESULT getBypass(out bool bypass) + { + return FMOD5_DSP_GetBypass(this.handle, out bypass); + } + public RESULT setWetDryMix(float prewet, float postwet, float dry) + { + return FMOD5_DSP_SetWetDryMix(this.handle, prewet, postwet, dry); + } + public RESULT getWetDryMix(out float prewet, out float postwet, out float dry) + { + return FMOD5_DSP_GetWetDryMix(this.handle, out prewet, out postwet, out dry); + } + public RESULT setChannelFormat(CHANNELMASK channelmask, int numchannels, SPEAKERMODE source_speakermode) + { + return FMOD5_DSP_SetChannelFormat(this.handle, channelmask, numchannels, source_speakermode); + } + public RESULT getChannelFormat(out CHANNELMASK channelmask, out int numchannels, out SPEAKERMODE source_speakermode) + { + return FMOD5_DSP_GetChannelFormat(this.handle, out channelmask, out numchannels, out source_speakermode); + } + public RESULT getOutputChannelFormat(CHANNELMASK inmask, int inchannels, SPEAKERMODE inspeakermode, out CHANNELMASK outmask, out int outchannels, out SPEAKERMODE outspeakermode) + { + return FMOD5_DSP_GetOutputChannelFormat(this.handle, inmask, inchannels, inspeakermode, out outmask, out outchannels, out outspeakermode); + } + public RESULT reset() + { + return FMOD5_DSP_Reset(this.handle); + } + public RESULT setCallback(DSP_CALLBACK callback) + { + return FMOD5_DSP_SetCallback(this.handle, callback); + } + + // DSP parameter control. + public RESULT setParameterFloat(int index, float value) + { + return FMOD5_DSP_SetParameterFloat(this.handle, index, value); + } + public RESULT setParameterInt(int index, int value) + { + return FMOD5_DSP_SetParameterInt(this.handle, index, value); + } + public RESULT setParameterBool(int index, bool value) + { + return FMOD5_DSP_SetParameterBool(this.handle, index, value); + } + public RESULT setParameterData(int index, byte[] data) + { + return FMOD5_DSP_SetParameterData(this.handle, index, Marshal.UnsafeAddrOfPinnedArrayElement(data, 0), (uint)data.Length); + } + public RESULT getParameterFloat(int index, out float value) + { + return FMOD5_DSP_GetParameterFloat(this.handle, index, out value, IntPtr.Zero, 0); + } + public RESULT getParameterInt(int index, out int value) + { + return FMOD5_DSP_GetParameterInt(this.handle, index, out value, IntPtr.Zero, 0); + } + public RESULT getParameterBool(int index, out bool value) + { + return FMOD5_DSP_GetParameterBool(this.handle, index, out value, IntPtr.Zero, 0); + } + public RESULT getParameterData(int index, out IntPtr data, out uint length) + { + return FMOD5_DSP_GetParameterData(this.handle, index, out data, out length, IntPtr.Zero, 0); + } + public RESULT getNumParameters(out int numparams) + { + return FMOD5_DSP_GetNumParameters(this.handle, out numparams); + } + public RESULT getParameterInfo(int index, out DSP_PARAMETER_DESC desc) + { + IntPtr descPtr; + RESULT result = FMOD5_DSP_GetParameterInfo(this.handle, index, out descPtr); + desc = (DSP_PARAMETER_DESC)MarshalHelper.PtrToStructure(descPtr, typeof(DSP_PARAMETER_DESC)); + return result; + } + public RESULT getDataParameterIndex(int datatype, out int index) + { + return FMOD5_DSP_GetDataParameterIndex(this.handle, datatype, out index); + } + public RESULT showConfigDialog(IntPtr hwnd, bool show) + { + return FMOD5_DSP_ShowConfigDialog(this.handle, hwnd, show); + } + + // DSP attributes. + public RESULT getInfo(out string name, out uint version, out int channels, out int configwidth, out int configheight) + { + IntPtr nameMem = Marshal.AllocHGlobal(32); + + RESULT result = FMOD5_DSP_GetInfo(this.handle, nameMem, out version, out channels, out configwidth, out configheight); + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + name = encoder.stringFromNative(nameMem); + } + Marshal.FreeHGlobal(nameMem); + return result; + } + public RESULT getInfo(out uint version, out int channels, out int configwidth, out int configheight) + { + return FMOD5_DSP_GetInfo(this.handle, IntPtr.Zero, out version, out channels, out configwidth, out configheight); ; + } + public RESULT getType(out DSP_TYPE type) + { + return FMOD5_DSP_GetType(this.handle, out type); + } + public RESULT getIdle(out bool idle) + { + return FMOD5_DSP_GetIdle(this.handle, out idle); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_DSP_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_DSP_GetUserData(this.handle, out userdata); + } + + // Metering. + public RESULT setMeteringEnabled(bool inputEnabled, bool outputEnabled) + { + return FMOD5_DSP_SetMeteringEnabled(this.handle, inputEnabled, outputEnabled); + } + public RESULT getMeteringEnabled(out bool inputEnabled, out bool outputEnabled) + { + return FMOD5_DSP_GetMeteringEnabled(this.handle, out inputEnabled, out outputEnabled); + } + + public RESULT getMeteringInfo(IntPtr zero, out DSP_METERING_INFO outputInfo) + { + return FMOD5_DSP_GetMeteringInfo(this.handle, zero, out outputInfo); + } + public RESULT getMeteringInfo(out DSP_METERING_INFO inputInfo, IntPtr zero) + { + return FMOD5_DSP_GetMeteringInfo(this.handle, out inputInfo, zero); + } + public RESULT getMeteringInfo(out DSP_METERING_INFO inputInfo, out DSP_METERING_INFO outputInfo) + { + return FMOD5_DSP_GetMeteringInfo(this.handle, out inputInfo, out outputInfo); + } + + public RESULT getCPUUsage(out uint exclusive, out uint inclusive) + { + return FMOD5_DSP_GetCPUUsage(this.handle, out exclusive, out inclusive); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_Release (IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetSystemObject (IntPtr dsp, out IntPtr system); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_AddInput (IntPtr dsp, IntPtr input, IntPtr zero, DSPCONNECTION_TYPE type); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_AddInput (IntPtr dsp, IntPtr input, out IntPtr connection, DSPCONNECTION_TYPE type); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_DisconnectFrom (IntPtr dsp, IntPtr target, IntPtr connection); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_DisconnectAll (IntPtr dsp, bool inputs, bool outputs); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetNumInputs (IntPtr dsp, out int numinputs); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetNumOutputs (IntPtr dsp, out int numoutputs); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetInput (IntPtr dsp, int index, out IntPtr input, out IntPtr inputconnection); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetOutput (IntPtr dsp, int index, out IntPtr output, out IntPtr outputconnection); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetActive (IntPtr dsp, bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetActive (IntPtr dsp, out bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetBypass (IntPtr dsp, bool bypass); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetBypass (IntPtr dsp, out bool bypass); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetWetDryMix (IntPtr dsp, float prewet, float postwet, float dry); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetWetDryMix (IntPtr dsp, out float prewet, out float postwet, out float dry); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetChannelFormat (IntPtr dsp, CHANNELMASK channelmask, int numchannels, SPEAKERMODE source_speakermode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetChannelFormat (IntPtr dsp, out CHANNELMASK channelmask, out int numchannels, out SPEAKERMODE source_speakermode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetOutputChannelFormat (IntPtr dsp, CHANNELMASK inmask, int inchannels, SPEAKERMODE inspeakermode, out CHANNELMASK outmask, out int outchannels, out SPEAKERMODE outspeakermode); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_Reset (IntPtr dsp); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetCallback (IntPtr dsp, DSP_CALLBACK callback); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetParameterFloat (IntPtr dsp, int index, float value); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetParameterInt (IntPtr dsp, int index, int value); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetParameterBool (IntPtr dsp, int index, bool value); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetParameterData (IntPtr dsp, int index, IntPtr data, uint length); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetParameterFloat (IntPtr dsp, int index, out float value, IntPtr valuestr, int valuestrlen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetParameterInt (IntPtr dsp, int index, out int value, IntPtr valuestr, int valuestrlen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetParameterBool (IntPtr dsp, int index, out bool value, IntPtr valuestr, int valuestrlen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetParameterData (IntPtr dsp, int index, out IntPtr data, out uint length, IntPtr valuestr, int valuestrlen); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetNumParameters (IntPtr dsp, out int numparams); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetParameterInfo (IntPtr dsp, int index, out IntPtr desc); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetDataParameterIndex (IntPtr dsp, int datatype, out int index); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_ShowConfigDialog (IntPtr dsp, IntPtr hwnd, bool show); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetInfo (IntPtr dsp, IntPtr name, out uint version, out int channels, out int configwidth, out int configheight); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetType (IntPtr dsp, out DSP_TYPE type); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetIdle (IntPtr dsp, out bool idle); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_SetUserData (IntPtr dsp, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSP_GetUserData (IntPtr dsp, out IntPtr userdata); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_SetMeteringEnabled (IntPtr dsp, bool inputEnabled, bool outputEnabled); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_GetMeteringEnabled (IntPtr dsp, out bool inputEnabled, out bool outputEnabled); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_GetMeteringInfo (IntPtr dsp, IntPtr zero, out DSP_METERING_INFO outputInfo); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_GetMeteringInfo (IntPtr dsp, out DSP_METERING_INFO inputInfo, IntPtr zero); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_GetMeteringInfo (IntPtr dsp, out DSP_METERING_INFO inputInfo, out DSP_METERING_INFO outputInfo); + [DllImport(VERSION.dll)] + public static extern RESULT FMOD5_DSP_GetCPUUsage (IntPtr dsp, out uint exclusive, out uint inclusive); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public DSP(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'DSPConnection' API + */ + public struct DSPConnection + { + public RESULT getInput(out DSP input) + { + return FMOD5_DSPConnection_GetInput(this.handle, out input.handle); + } + public RESULT getOutput(out DSP output) + { + return FMOD5_DSPConnection_GetOutput(this.handle, out output.handle); + } + public RESULT setMix(float volume) + { + return FMOD5_DSPConnection_SetMix(this.handle, volume); + } + public RESULT getMix(out float volume) + { + return FMOD5_DSPConnection_GetMix(this.handle, out volume); + } + public RESULT setMixMatrix(float[] matrix, int outchannels, int inchannels, int inchannel_hop = 0) + { + return FMOD5_DSPConnection_SetMixMatrix(this.handle, matrix, outchannels, inchannels, inchannel_hop); + } + public RESULT getMixMatrix(float[] matrix, out int outchannels, out int inchannels, int inchannel_hop = 0) + { + return FMOD5_DSPConnection_GetMixMatrix(this.handle, matrix, out outchannels, out inchannels, inchannel_hop); + } + public RESULT getType(out DSPCONNECTION_TYPE type) + { + return FMOD5_DSPConnection_GetType(this.handle, out type); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_DSPConnection_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_DSPConnection_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetInput (IntPtr dspconnection, out IntPtr input); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetOutput (IntPtr dspconnection, out IntPtr output); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_SetMix (IntPtr dspconnection, float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetMix (IntPtr dspconnection, out float volume); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_SetMixMatrix (IntPtr dspconnection, float[] matrix, int outchannels, int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetMixMatrix (IntPtr dspconnection, float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetType (IntPtr dspconnection, out DSPCONNECTION_TYPE type); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_SetUserData (IntPtr dspconnection, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_DSPConnection_GetUserData (IntPtr dspconnection, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public DSPConnection(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'Geometry' API + */ + public struct Geometry + { + public RESULT release() + { + return FMOD5_Geometry_Release(this.handle); + } + + // Polygon manipulation. + public RESULT addPolygon(float directocclusion, float reverbocclusion, bool doublesided, int numvertices, VECTOR[] vertices, out int polygonindex) + { + return FMOD5_Geometry_AddPolygon(this.handle, directocclusion, reverbocclusion, doublesided, numvertices, vertices, out polygonindex); + } + public RESULT getNumPolygons(out int numpolygons) + { + return FMOD5_Geometry_GetNumPolygons(this.handle, out numpolygons); + } + public RESULT getMaxPolygons(out int maxpolygons, out int maxvertices) + { + return FMOD5_Geometry_GetMaxPolygons(this.handle, out maxpolygons, out maxvertices); + } + public RESULT getPolygonNumVertices(int index, out int numvertices) + { + return FMOD5_Geometry_GetPolygonNumVertices(this.handle, index, out numvertices); + } + public RESULT setPolygonVertex(int index, int vertexindex, ref VECTOR vertex) + { + return FMOD5_Geometry_SetPolygonVertex(this.handle, index, vertexindex, ref vertex); + } + public RESULT getPolygonVertex(int index, int vertexindex, out VECTOR vertex) + { + return FMOD5_Geometry_GetPolygonVertex(this.handle, index, vertexindex, out vertex); + } + public RESULT setPolygonAttributes(int index, float directocclusion, float reverbocclusion, bool doublesided) + { + return FMOD5_Geometry_SetPolygonAttributes(this.handle, index, directocclusion, reverbocclusion, doublesided); + } + public RESULT getPolygonAttributes(int index, out float directocclusion, out float reverbocclusion, out bool doublesided) + { + return FMOD5_Geometry_GetPolygonAttributes(this.handle, index, out directocclusion, out reverbocclusion, out doublesided); + } + + // Object manipulation. + public RESULT setActive(bool active) + { + return FMOD5_Geometry_SetActive(this.handle, active); + } + public RESULT getActive(out bool active) + { + return FMOD5_Geometry_GetActive(this.handle, out active); + } + public RESULT setRotation(ref VECTOR forward, ref VECTOR up) + { + return FMOD5_Geometry_SetRotation(this.handle, ref forward, ref up); + } + public RESULT getRotation(out VECTOR forward, out VECTOR up) + { + return FMOD5_Geometry_GetRotation(this.handle, out forward, out up); + } + public RESULT setPosition(ref VECTOR position) + { + return FMOD5_Geometry_SetPosition(this.handle, ref position); + } + public RESULT getPosition(out VECTOR position) + { + return FMOD5_Geometry_GetPosition(this.handle, out position); + } + public RESULT setScale(ref VECTOR scale) + { + return FMOD5_Geometry_SetScale(this.handle, ref scale); + } + public RESULT getScale(out VECTOR scale) + { + return FMOD5_Geometry_GetScale(this.handle, out scale); + } + public RESULT save(IntPtr data, out int datasize) + { + return FMOD5_Geometry_Save(this.handle, data, out datasize); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_Geometry_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_Geometry_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_Release (IntPtr geometry); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_AddPolygon (IntPtr geometry, float directocclusion, float reverbocclusion, bool doublesided, int numvertices, VECTOR[] vertices, out int polygonindex); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetNumPolygons (IntPtr geometry, out int numpolygons); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetMaxPolygons (IntPtr geometry, out int maxpolygons, out int maxvertices); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetPolygonNumVertices(IntPtr geometry, int index, out int numvertices); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetPolygonVertex (IntPtr geometry, int index, int vertexindex, ref VECTOR vertex); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetPolygonVertex (IntPtr geometry, int index, int vertexindex, out VECTOR vertex); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetPolygonAttributes (IntPtr geometry, int index, float directocclusion, float reverbocclusion, bool doublesided); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetPolygonAttributes (IntPtr geometry, int index, out float directocclusion, out float reverbocclusion, out bool doublesided); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetActive (IntPtr geometry, bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetActive (IntPtr geometry, out bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetRotation (IntPtr geometry, ref VECTOR forward, ref VECTOR up); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetRotation (IntPtr geometry, out VECTOR forward, out VECTOR up); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetPosition (IntPtr geometry, ref VECTOR position); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetPosition (IntPtr geometry, out VECTOR position); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetScale (IntPtr geometry, ref VECTOR scale); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetScale (IntPtr geometry, out VECTOR scale); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_Save (IntPtr geometry, IntPtr data, out int datasize); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_SetUserData (IntPtr geometry, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Geometry_GetUserData (IntPtr geometry, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Geometry(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + /* + 'Reverb3D' API + */ + public struct Reverb3D + { + public RESULT release() + { + return FMOD5_Reverb3D_Release(this.handle); + } + + // Reverb manipulation. + public RESULT set3DAttributes(ref VECTOR position, float mindistance, float maxdistance) + { + return FMOD5_Reverb3D_Set3DAttributes(this.handle, ref position, mindistance, maxdistance); + } + public RESULT get3DAttributes(ref VECTOR position, ref float mindistance, ref float maxdistance) + { + return FMOD5_Reverb3D_Get3DAttributes(this.handle, ref position, ref mindistance, ref maxdistance); + } + public RESULT setProperties(ref REVERB_PROPERTIES properties) + { + return FMOD5_Reverb3D_SetProperties(this.handle, ref properties); + } + public RESULT getProperties(ref REVERB_PROPERTIES properties) + { + return FMOD5_Reverb3D_GetProperties(this.handle, ref properties); + } + public RESULT setActive(bool active) + { + return FMOD5_Reverb3D_SetActive(this.handle, active); + } + public RESULT getActive(out bool active) + { + return FMOD5_Reverb3D_GetActive(this.handle, out active); + } + + // Userdata set/get. + public RESULT setUserData(IntPtr userdata) + { + return FMOD5_Reverb3D_SetUserData(this.handle, userdata); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD5_Reverb3D_GetUserData(this.handle, out userdata); + } + + #region importfunctions + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_Release (IntPtr reverb3d); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_Set3DAttributes (IntPtr reverb3d, ref VECTOR position, float mindistance, float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_Get3DAttributes (IntPtr reverb3d, ref VECTOR position, ref float mindistance, ref float maxdistance); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_SetProperties (IntPtr reverb3d, ref REVERB_PROPERTIES properties); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_GetProperties (IntPtr reverb3d, ref REVERB_PROPERTIES properties); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_SetActive (IntPtr reverb3d, bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_GetActive (IntPtr reverb3d, out bool active); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_SetUserData (IntPtr reverb3d, IntPtr userdata); + [DllImport(VERSION.dll)] + private static extern RESULT FMOD5_Reverb3D_GetUserData (IntPtr reverb3d, out IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Reverb3D(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + #endregion + } + + #region Helper Functions + [StructLayout(LayoutKind.Sequential)] + public struct StringWrapper + { + IntPtr nativeUtf8Ptr; + + public StringWrapper(IntPtr ptr) + { + nativeUtf8Ptr = ptr; + } + + public static implicit operator string(StringWrapper fstring) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return encoder.stringFromNative(fstring.nativeUtf8Ptr); + } + } + } + + static class StringHelper + { + public class ThreadSafeEncoding : IDisposable + { + UTF8Encoding encoding = new UTF8Encoding(); + byte[] encodedBuffer = new byte[128]; + char[] decodedBuffer = new char[128]; + bool inUse; + GCHandle gcHandle; + + public bool InUse() { return inUse; } + public void SetInUse() { inUse = true; } + + private int roundUpPowerTwo(int number) + { + int newNumber = 1; + while (newNumber <= number) + { + newNumber *= 2; + } + + return newNumber; + } + + public byte[] byteFromStringUTF8(string s) + { + if (s == null) + { + return null; + } + + int maximumLength = encoding.GetMaxByteCount(s.Length) + 1; // +1 for null terminator + if (maximumLength > encodedBuffer.Length) + { + int encodedLength = encoding.GetByteCount(s) + 1; // +1 for null terminator + if (encodedLength > encodedBuffer.Length) + { + encodedBuffer = new byte[roundUpPowerTwo(encodedLength)]; + } + } + + int byteCount = encoding.GetBytes(s, 0, s.Length, encodedBuffer, 0); + encodedBuffer[byteCount] = 0; // Apply null terminator + + return encodedBuffer; + } + + public IntPtr intptrFromStringUTF8(string s) + { + if (s == null) + { + return IntPtr.Zero; + } + + gcHandle = GCHandle.Alloc(byteFromStringUTF8(s), GCHandleType.Pinned); + return gcHandle.AddrOfPinnedObject(); + } + + public string stringFromNative(IntPtr nativePtr) + { + if (nativePtr == IntPtr.Zero) + { + return ""; + } + + int nativeLen = 0; + while (Marshal.ReadByte(nativePtr, nativeLen) != 0) + { + nativeLen++; + } + + if (nativeLen == 0) + { + return ""; + } + + if (nativeLen > encodedBuffer.Length) + { + encodedBuffer = new byte[roundUpPowerTwo(nativeLen)]; + } + + Marshal.Copy(nativePtr, encodedBuffer, 0, nativeLen); + + int maximumLength = encoding.GetMaxCharCount(nativeLen); + if (maximumLength > decodedBuffer.Length) + { + int decodedLength = encoding.GetCharCount(encodedBuffer, 0, nativeLen); + if (decodedLength > decodedBuffer.Length) + { + decodedBuffer = new char[roundUpPowerTwo(decodedLength)]; + } + } + + int charCount = encoding.GetChars(encodedBuffer, 0, nativeLen, decodedBuffer, 0); + + return new String(decodedBuffer, 0, charCount); + } + + public void Dispose() + { + if (gcHandle.IsAllocated) + { + gcHandle.Free(); + } + lock (encoders) + { + inUse = false; + } + } + } + + static List encoders = new List(1); + + public static ThreadSafeEncoding GetFreeHelper() + { + lock (encoders) + { + ThreadSafeEncoding helper = null; + // Search for not in use helper + for (int i = 0; i < encoders.Count; i++) + { + if (!encoders[i].InUse()) + { + helper = encoders[i]; + break; + } + } + // Otherwise create another helper + if (helper == null) + { + helper = new ThreadSafeEncoding(); + encoders.Add(helper); + } + helper.SetInUse(); + return helper; + } + } + } + + // Some of the Marshal functions were marked as deprecated / obsolete, however that decision was reversed: https://github.com/dotnet/corefx/pull/10541 + // Use the old syntax (non-generic) to ensure maximum compatibility (especially with Unity) ignoring the warnings + public static class MarshalHelper + { +#pragma warning disable 618 + public static int SizeOf(Type t) + { + return Marshal.SizeOf(t); // Always use Type version, never Object version as it boxes causes GC allocations + } + + public static object PtrToStructure(IntPtr ptr, Type structureType) + { + return Marshal.PtrToStructure(ptr, structureType); + } +#pragma warning restore 618 + } + + #endregion +} diff --git a/modules/fmod/inc/fmod.h b/modules/fmod/inc/fmod.h new file mode 100644 index 0000000..bd08a69 --- /dev/null +++ b/modules/fmod/inc/fmod.h @@ -0,0 +1,668 @@ +/* ======================================================================================== */ +/* FMOD Core API - C header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* Use this header in conjunction with fmod_common.h (which contains all the constants / */ +/* callbacks) to develop using the C interface */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/core-api.html */ +/* ======================================================================================== */ + +#ifndef _FMOD_H +#define _FMOD_H + +#include "fmod_common.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* + FMOD global system functions (optional). +*/ +FMOD_RESULT F_API FMOD_Memory_Initialize (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags); +FMOD_RESULT F_API FMOD_Memory_GetStats (int *currentalloced, int *maxalloced, FMOD_BOOL blocking); +FMOD_RESULT F_API FMOD_Debug_Initialize (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode, FMOD_DEBUG_CALLBACK callback, const char *filename); +FMOD_RESULT F_API FMOD_File_SetDiskBusy (int busy); +FMOD_RESULT F_API FMOD_File_GetDiskBusy (int *busy); +FMOD_RESULT F_API FMOD_Thread_SetAttributes (FMOD_THREAD_TYPE type, FMOD_THREAD_AFFINITY affinity, FMOD_THREAD_PRIORITY priority, FMOD_THREAD_STACK_SIZE stacksize); + +/* + FMOD System factory functions. Use this to create an FMOD System Instance. below you will see FMOD_System_Init/Close to get started. +*/ +FMOD_RESULT F_API FMOD_System_Create (FMOD_SYSTEM **system, unsigned int headerversion); +FMOD_RESULT F_API FMOD_System_Release (FMOD_SYSTEM *system); + +/* + 'System' API +*/ + +/* Setup functions. */ +FMOD_RESULT F_API FMOD_System_SetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE output); +FMOD_RESULT F_API FMOD_System_GetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE *output); +FMOD_RESULT F_API FMOD_System_GetNumDrivers (FMOD_SYSTEM *system, int *numdrivers); +FMOD_RESULT F_API FMOD_System_GetDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels); +FMOD_RESULT F_API FMOD_System_SetDriver (FMOD_SYSTEM *system, int driver); +FMOD_RESULT F_API FMOD_System_GetDriver (FMOD_SYSTEM *system, int *driver); +FMOD_RESULT F_API FMOD_System_SetSoftwareChannels (FMOD_SYSTEM *system, int numsoftwarechannels); +FMOD_RESULT F_API FMOD_System_GetSoftwareChannels (FMOD_SYSTEM *system, int *numsoftwarechannels); +FMOD_RESULT F_API FMOD_System_SetSoftwareFormat (FMOD_SYSTEM *system, int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers); +FMOD_RESULT F_API FMOD_System_GetSoftwareFormat (FMOD_SYSTEM *system, int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers); +FMOD_RESULT F_API FMOD_System_SetDSPBufferSize (FMOD_SYSTEM *system, unsigned int bufferlength, int numbuffers); +FMOD_RESULT F_API FMOD_System_GetDSPBufferSize (FMOD_SYSTEM *system, unsigned int *bufferlength, int *numbuffers); +FMOD_RESULT F_API FMOD_System_SetFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign); +FMOD_RESULT F_API FMOD_System_AttachFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek); +FMOD_RESULT F_API FMOD_System_SetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_System_GetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_System_SetCallback (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask); + +/* Plug-in support. */ +FMOD_RESULT F_API FMOD_System_SetPluginPath (FMOD_SYSTEM *system, const char *path); +FMOD_RESULT F_API FMOD_System_LoadPlugin (FMOD_SYSTEM *system, const char *filename, unsigned int *handle, unsigned int priority); +FMOD_RESULT F_API FMOD_System_UnloadPlugin (FMOD_SYSTEM *system, unsigned int handle); +FMOD_RESULT F_API FMOD_System_GetNumNestedPlugins (FMOD_SYSTEM *system, unsigned int handle, int *count); +FMOD_RESULT F_API FMOD_System_GetNestedPlugin (FMOD_SYSTEM *system, unsigned int handle, int index, unsigned int *nestedhandle); +FMOD_RESULT F_API FMOD_System_GetNumPlugins (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int *numplugins); +FMOD_RESULT F_API FMOD_System_GetPluginHandle (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle); +FMOD_RESULT F_API FMOD_System_GetPluginInfo (FMOD_SYSTEM *system, unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version); +FMOD_RESULT F_API FMOD_System_SetOutputByPlugin (FMOD_SYSTEM *system, unsigned int handle); +FMOD_RESULT F_API FMOD_System_GetOutputByPlugin (FMOD_SYSTEM *system, unsigned int *handle); +FMOD_RESULT F_API FMOD_System_CreateDSPByPlugin (FMOD_SYSTEM *system, unsigned int handle, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_System_GetDSPInfoByPlugin (FMOD_SYSTEM *system, unsigned int handle, const FMOD_DSP_DESCRIPTION **description); +FMOD_RESULT F_API FMOD_System_RegisterCodec (FMOD_SYSTEM *system, FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority); +FMOD_RESULT F_API FMOD_System_RegisterDSP (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, unsigned int *handle); +FMOD_RESULT F_API FMOD_System_RegisterOutput (FMOD_SYSTEM *system, const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle); + +/* Init/Close. */ +FMOD_RESULT F_API FMOD_System_Init (FMOD_SYSTEM *system, int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata); +FMOD_RESULT F_API FMOD_System_Close (FMOD_SYSTEM *system); + +/* General post-init system functions. */ +FMOD_RESULT F_API FMOD_System_Update (FMOD_SYSTEM *system); +FMOD_RESULT F_API FMOD_System_SetSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float x, float y, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_System_GetSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float *x, float *y, FMOD_BOOL *active); +FMOD_RESULT F_API FMOD_System_SetStreamBufferSize (FMOD_SYSTEM *system, unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype); +FMOD_RESULT F_API FMOD_System_GetStreamBufferSize (FMOD_SYSTEM *system, unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype); +FMOD_RESULT F_API FMOD_System_Set3DSettings (FMOD_SYSTEM *system, float dopplerscale, float distancefactor, float rolloffscale); +FMOD_RESULT F_API FMOD_System_Get3DSettings (FMOD_SYSTEM *system, float *dopplerscale, float *distancefactor, float *rolloffscale); +FMOD_RESULT F_API FMOD_System_Set3DNumListeners (FMOD_SYSTEM *system, int numlisteners); +FMOD_RESULT F_API FMOD_System_Get3DNumListeners (FMOD_SYSTEM *system, int *numlisteners); +FMOD_RESULT F_API FMOD_System_Set3DListenerAttributes (FMOD_SYSTEM *system, int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_System_Get3DListenerAttributes (FMOD_SYSTEM *system, int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_System_Set3DRolloffCallback (FMOD_SYSTEM *system, FMOD_3D_ROLLOFF_CALLBACK callback); +FMOD_RESULT F_API FMOD_System_MixerSuspend (FMOD_SYSTEM *system); +FMOD_RESULT F_API FMOD_System_MixerResume (FMOD_SYSTEM *system); +FMOD_RESULT F_API FMOD_System_GetDefaultMixMatrix (FMOD_SYSTEM *system, FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop); +FMOD_RESULT F_API FMOD_System_GetSpeakerModeChannels (FMOD_SYSTEM *system, FMOD_SPEAKERMODE mode, int *channels); + +/* System information functions. */ +FMOD_RESULT F_API FMOD_System_GetVersion (FMOD_SYSTEM *system, unsigned int *version); +FMOD_RESULT F_API FMOD_System_GetOutputHandle (FMOD_SYSTEM *system, void **handle); +FMOD_RESULT F_API FMOD_System_GetChannelsPlaying (FMOD_SYSTEM *system, int *channels, int *realchannels); +FMOD_RESULT F_API FMOD_System_GetCPUUsage (FMOD_SYSTEM *system, FMOD_CPU_USAGE *usage); +FMOD_RESULT F_API FMOD_System_GetFileUsage (FMOD_SYSTEM *system, long long *sampleBytesRead, long long *streamBytesRead, long long *otherBytesRead); + +/* Sound/DSP/Channel/FX creation and retrieval. */ +FMOD_RESULT F_API FMOD_System_CreateSound (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_System_CreateStream (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_System_CreateDSP (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_System_CreateDSPByType (FMOD_SYSTEM *system, FMOD_DSP_TYPE type, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_System_CreateChannelGroup (FMOD_SYSTEM *system, const char *name, FMOD_CHANNELGROUP **channelgroup); +FMOD_RESULT F_API FMOD_System_CreateSoundGroup (FMOD_SYSTEM *system, const char *name, FMOD_SOUNDGROUP **soundgroup); +FMOD_RESULT F_API FMOD_System_CreateReverb3D (FMOD_SYSTEM *system, FMOD_REVERB3D **reverb); +FMOD_RESULT F_API FMOD_System_PlaySound (FMOD_SYSTEM *system, FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel); +FMOD_RESULT F_API FMOD_System_PlayDSP (FMOD_SYSTEM *system, FMOD_DSP *dsp, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel); +FMOD_RESULT F_API FMOD_System_GetChannel (FMOD_SYSTEM *system, int channelid, FMOD_CHANNEL **channel); +FMOD_RESULT F_API FMOD_System_GetDSPInfoByType (FMOD_SYSTEM *system, FMOD_DSP_TYPE type, const FMOD_DSP_DESCRIPTION **description); +FMOD_RESULT F_API FMOD_System_GetMasterChannelGroup (FMOD_SYSTEM *system, FMOD_CHANNELGROUP **channelgroup); +FMOD_RESULT F_API FMOD_System_GetMasterSoundGroup (FMOD_SYSTEM *system, FMOD_SOUNDGROUP **soundgroup); + +/* Routing to ports. */ +FMOD_RESULT F_API FMOD_System_AttachChannelGroupToPort (FMOD_SYSTEM *system, FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL passThru); +FMOD_RESULT F_API FMOD_System_DetachChannelGroupFromPort(FMOD_SYSTEM *system, FMOD_CHANNELGROUP *channelgroup); + +/* Reverb API. */ +FMOD_RESULT F_API FMOD_System_SetReverbProperties (FMOD_SYSTEM *system, int instance, const FMOD_REVERB_PROPERTIES *prop); +FMOD_RESULT F_API FMOD_System_GetReverbProperties (FMOD_SYSTEM *system, int instance, FMOD_REVERB_PROPERTIES *prop); + +/* System level DSP functionality. */ +FMOD_RESULT F_API FMOD_System_LockDSP (FMOD_SYSTEM *system); +FMOD_RESULT F_API FMOD_System_UnlockDSP (FMOD_SYSTEM *system); + +/* Recording API. */ +FMOD_RESULT F_API FMOD_System_GetRecordNumDrivers (FMOD_SYSTEM *system, int *numdrivers, int *numconnected); +FMOD_RESULT F_API FMOD_System_GetRecordDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state); +FMOD_RESULT F_API FMOD_System_GetRecordPosition (FMOD_SYSTEM *system, int id, unsigned int *position); +FMOD_RESULT F_API FMOD_System_RecordStart (FMOD_SYSTEM *system, int id, FMOD_SOUND *sound, FMOD_BOOL loop); +FMOD_RESULT F_API FMOD_System_RecordStop (FMOD_SYSTEM *system, int id); +FMOD_RESULT F_API FMOD_System_IsRecording (FMOD_SYSTEM *system, int id, FMOD_BOOL *recording); + +/* Geometry API. */ +FMOD_RESULT F_API FMOD_System_CreateGeometry (FMOD_SYSTEM *system, int maxpolygons, int maxvertices, FMOD_GEOMETRY **geometry); +FMOD_RESULT F_API FMOD_System_SetGeometrySettings (FMOD_SYSTEM *system, float maxworldsize); +FMOD_RESULT F_API FMOD_System_GetGeometrySettings (FMOD_SYSTEM *system, float *maxworldsize); +FMOD_RESULT F_API FMOD_System_LoadGeometry (FMOD_SYSTEM *system, const void *data, int datasize, FMOD_GEOMETRY **geometry); +FMOD_RESULT F_API FMOD_System_GetGeometryOcclusion (FMOD_SYSTEM *system, const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb); + +/* Network functions. */ +FMOD_RESULT F_API FMOD_System_SetNetworkProxy (FMOD_SYSTEM *system, const char *proxy); +FMOD_RESULT F_API FMOD_System_GetNetworkProxy (FMOD_SYSTEM *system, char *proxy, int proxylen); +FMOD_RESULT F_API FMOD_System_SetNetworkTimeout (FMOD_SYSTEM *system, int timeout); +FMOD_RESULT F_API FMOD_System_GetNetworkTimeout (FMOD_SYSTEM *system, int *timeout); + +/* Userdata set/get. */ +FMOD_RESULT F_API FMOD_System_SetUserData (FMOD_SYSTEM *system, void *userdata); +FMOD_RESULT F_API FMOD_System_GetUserData (FMOD_SYSTEM *system, void **userdata); + +/* Sound API +*/ + +FMOD_RESULT F_API FMOD_Sound_Release (FMOD_SOUND *sound); +FMOD_RESULT F_API FMOD_Sound_GetSystemObject (FMOD_SOUND *sound, FMOD_SYSTEM **system); + +/* + Standard sound manipulation functions. +*/ + +FMOD_RESULT F_API FMOD_Sound_Lock (FMOD_SOUND *sound, unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2); +FMOD_RESULT F_API FMOD_Sound_Unlock (FMOD_SOUND *sound, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2); +FMOD_RESULT F_API FMOD_Sound_SetDefaults (FMOD_SOUND *sound, float frequency, int priority); +FMOD_RESULT F_API FMOD_Sound_GetDefaults (FMOD_SOUND *sound, float *frequency, int *priority); +FMOD_RESULT F_API FMOD_Sound_Set3DMinMaxDistance (FMOD_SOUND *sound, float min, float max); +FMOD_RESULT F_API FMOD_Sound_Get3DMinMaxDistance (FMOD_SOUND *sound, float *min, float *max); +FMOD_RESULT F_API FMOD_Sound_Set3DConeSettings (FMOD_SOUND *sound, float insideconeangle, float outsideconeangle, float outsidevolume); +FMOD_RESULT F_API FMOD_Sound_Get3DConeSettings (FMOD_SOUND *sound, float *insideconeangle, float *outsideconeangle, float *outsidevolume); +FMOD_RESULT F_API FMOD_Sound_Set3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR *points, int numpoints); +FMOD_RESULT F_API FMOD_Sound_Get3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR **points, int *numpoints); +FMOD_RESULT F_API FMOD_Sound_GetSubSound (FMOD_SOUND *sound, int index, FMOD_SOUND **subsound); +FMOD_RESULT F_API FMOD_Sound_GetSubSoundParent (FMOD_SOUND *sound, FMOD_SOUND **parentsound); +FMOD_RESULT F_API FMOD_Sound_GetName (FMOD_SOUND *sound, char *name, int namelen); +FMOD_RESULT F_API FMOD_Sound_GetLength (FMOD_SOUND *sound, unsigned int *length, FMOD_TIMEUNIT lengthtype); +FMOD_RESULT F_API FMOD_Sound_GetFormat (FMOD_SOUND *sound, FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits); +FMOD_RESULT F_API FMOD_Sound_GetNumSubSounds (FMOD_SOUND *sound, int *numsubsounds); +FMOD_RESULT F_API FMOD_Sound_GetNumTags (FMOD_SOUND *sound, int *numtags, int *numtagsupdated); +FMOD_RESULT F_API FMOD_Sound_GetTag (FMOD_SOUND *sound, const char *name, int index, FMOD_TAG *tag); +FMOD_RESULT F_API FMOD_Sound_GetOpenState (FMOD_SOUND *sound, FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, FMOD_BOOL *starving, FMOD_BOOL *diskbusy); +FMOD_RESULT F_API FMOD_Sound_ReadData (FMOD_SOUND *sound, void *buffer, unsigned int length, unsigned int *read); +FMOD_RESULT F_API FMOD_Sound_SeekData (FMOD_SOUND *sound, unsigned int pcm); + +FMOD_RESULT F_API FMOD_Sound_SetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP *soundgroup); +FMOD_RESULT F_API FMOD_Sound_GetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP **soundgroup); + +/* + Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks. +*/ + +FMOD_RESULT F_API FMOD_Sound_GetNumSyncPoints (FMOD_SOUND *sound, int *numsyncpoints); +FMOD_RESULT F_API FMOD_Sound_GetSyncPoint (FMOD_SOUND *sound, int index, FMOD_SYNCPOINT **point); +FMOD_RESULT F_API FMOD_Sound_GetSyncPointInfo (FMOD_SOUND *sound, FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype); +FMOD_RESULT F_API FMOD_Sound_AddSyncPoint (FMOD_SOUND *sound, unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point); +FMOD_RESULT F_API FMOD_Sound_DeleteSyncPoint (FMOD_SOUND *sound, FMOD_SYNCPOINT *point); + +/* + Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time. +*/ + +FMOD_RESULT F_API FMOD_Sound_SetMode (FMOD_SOUND *sound, FMOD_MODE mode); +FMOD_RESULT F_API FMOD_Sound_GetMode (FMOD_SOUND *sound, FMOD_MODE *mode); +FMOD_RESULT F_API FMOD_Sound_SetLoopCount (FMOD_SOUND *sound, int loopcount); +FMOD_RESULT F_API FMOD_Sound_GetLoopCount (FMOD_SOUND *sound, int *loopcount); +FMOD_RESULT F_API FMOD_Sound_SetLoopPoints (FMOD_SOUND *sound, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); +FMOD_RESULT F_API FMOD_Sound_GetLoopPoints (FMOD_SOUND *sound, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + +/* + For MOD/S3M/XM/IT/MID sequenced formats only. +*/ + +FMOD_RESULT F_API FMOD_Sound_GetMusicNumChannels (FMOD_SOUND *sound, int *numchannels); +FMOD_RESULT F_API FMOD_Sound_SetMusicChannelVolume (FMOD_SOUND *sound, int channel, float volume); +FMOD_RESULT F_API FMOD_Sound_GetMusicChannelVolume (FMOD_SOUND *sound, int channel, float *volume); +FMOD_RESULT F_API FMOD_Sound_SetMusicSpeed (FMOD_SOUND *sound, float speed); +FMOD_RESULT F_API FMOD_Sound_GetMusicSpeed (FMOD_SOUND *sound, float *speed); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Sound_SetUserData (FMOD_SOUND *sound, void *userdata); +FMOD_RESULT F_API FMOD_Sound_GetUserData (FMOD_SOUND *sound, void **userdata); + +/* + 'Channel' API +*/ + +FMOD_RESULT F_API FMOD_Channel_GetSystemObject (FMOD_CHANNEL *channel, FMOD_SYSTEM **system); + +/* + General control functionality for Channels and ChannelGroups. +*/ + +FMOD_RESULT F_API FMOD_Channel_Stop (FMOD_CHANNEL *channel); +FMOD_RESULT F_API FMOD_Channel_SetPaused (FMOD_CHANNEL *channel, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Channel_GetPaused (FMOD_CHANNEL *channel, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Channel_SetVolume (FMOD_CHANNEL *channel, float volume); +FMOD_RESULT F_API FMOD_Channel_GetVolume (FMOD_CHANNEL *channel, float *volume); +FMOD_RESULT F_API FMOD_Channel_SetVolumeRamp (FMOD_CHANNEL *channel, FMOD_BOOL ramp); +FMOD_RESULT F_API FMOD_Channel_GetVolumeRamp (FMOD_CHANNEL *channel, FMOD_BOOL *ramp); +FMOD_RESULT F_API FMOD_Channel_GetAudibility (FMOD_CHANNEL *channel, float *audibility); +FMOD_RESULT F_API FMOD_Channel_SetPitch (FMOD_CHANNEL *channel, float pitch); +FMOD_RESULT F_API FMOD_Channel_GetPitch (FMOD_CHANNEL *channel, float *pitch); +FMOD_RESULT F_API FMOD_Channel_SetMute (FMOD_CHANNEL *channel, FMOD_BOOL mute); +FMOD_RESULT F_API FMOD_Channel_GetMute (FMOD_CHANNEL *channel, FMOD_BOOL *mute); +FMOD_RESULT F_API FMOD_Channel_SetReverbProperties (FMOD_CHANNEL *channel, int instance, float wet); +FMOD_RESULT F_API FMOD_Channel_GetReverbProperties (FMOD_CHANNEL *channel, int instance, float *wet); +FMOD_RESULT F_API FMOD_Channel_SetLowPassGain (FMOD_CHANNEL *channel, float gain); +FMOD_RESULT F_API FMOD_Channel_GetLowPassGain (FMOD_CHANNEL *channel, float *gain); +FMOD_RESULT F_API FMOD_Channel_SetMode (FMOD_CHANNEL *channel, FMOD_MODE mode); +FMOD_RESULT F_API FMOD_Channel_GetMode (FMOD_CHANNEL *channel, FMOD_MODE *mode); +FMOD_RESULT F_API FMOD_Channel_SetCallback (FMOD_CHANNEL *channel, FMOD_CHANNELCONTROL_CALLBACK callback); +FMOD_RESULT F_API FMOD_Channel_IsPlaying (FMOD_CHANNEL *channel, FMOD_BOOL *isplaying); + +/* + Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. +*/ + +FMOD_RESULT F_API FMOD_Channel_SetPan (FMOD_CHANNEL *channel, float pan); +FMOD_RESULT F_API FMOD_Channel_SetMixLevelsOutput (FMOD_CHANNEL *channel, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); +FMOD_RESULT F_API FMOD_Channel_SetMixLevelsInput (FMOD_CHANNEL *channel, float *levels, int numlevels); +FMOD_RESULT F_API FMOD_Channel_SetMixMatrix (FMOD_CHANNEL *channel, float *matrix, int outchannels, int inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_Channel_GetMixMatrix (FMOD_CHANNEL *channel, float *matrix, int *outchannels, int *inchannels, int inchannel_hop); + +/* + Clock based functionality. +*/ + +FMOD_RESULT F_API FMOD_Channel_GetDSPClock (FMOD_CHANNEL *channel, unsigned long long *dspclock, unsigned long long *parentclock); +FMOD_RESULT F_API FMOD_Channel_SetDelay (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels); +FMOD_RESULT F_API FMOD_Channel_GetDelay (FMOD_CHANNEL *channel, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels); +FMOD_RESULT F_API FMOD_Channel_AddFadePoint (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_Channel_SetFadePointRamp (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_Channel_RemoveFadePoints (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end); +FMOD_RESULT F_API FMOD_Channel_GetFadePoints (FMOD_CHANNEL *channel, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume); + +/* + DSP effects. +*/ + +FMOD_RESULT F_API FMOD_Channel_GetDSP (FMOD_CHANNEL *channel, int index, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_Channel_AddDSP (FMOD_CHANNEL *channel, int index, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_Channel_RemoveDSP (FMOD_CHANNEL *channel, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_Channel_GetNumDSPs (FMOD_CHANNEL *channel, int *numdsps); +FMOD_RESULT F_API FMOD_Channel_SetDSPIndex (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int index); +FMOD_RESULT F_API FMOD_Channel_GetDSPIndex (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int *index); + +/* + 3D functionality. +*/ + +FMOD_RESULT F_API FMOD_Channel_Set3DAttributes (FMOD_CHANNEL *channel, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel); +FMOD_RESULT F_API FMOD_Channel_Get3DAttributes (FMOD_CHANNEL *channel, FMOD_VECTOR *pos, FMOD_VECTOR *vel); +FMOD_RESULT F_API FMOD_Channel_Set3DMinMaxDistance (FMOD_CHANNEL *channel, float mindistance, float maxdistance); +FMOD_RESULT F_API FMOD_Channel_Get3DMinMaxDistance (FMOD_CHANNEL *channel, float *mindistance, float *maxdistance); +FMOD_RESULT F_API FMOD_Channel_Set3DConeSettings (FMOD_CHANNEL *channel, float insideconeangle, float outsideconeangle, float outsidevolume); +FMOD_RESULT F_API FMOD_Channel_Get3DConeSettings (FMOD_CHANNEL *channel, float *insideconeangle, float *outsideconeangle, float *outsidevolume); +FMOD_RESULT F_API FMOD_Channel_Set3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_Channel_Get3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_Channel_Set3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR *points, int numpoints); +FMOD_RESULT F_API FMOD_Channel_Get3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR **points, int *numpoints); +FMOD_RESULT F_API FMOD_Channel_Set3DOcclusion (FMOD_CHANNEL *channel, float directocclusion, float reverbocclusion); +FMOD_RESULT F_API FMOD_Channel_Get3DOcclusion (FMOD_CHANNEL *channel, float *directocclusion, float *reverbocclusion); +FMOD_RESULT F_API FMOD_Channel_Set3DSpread (FMOD_CHANNEL *channel, float angle); +FMOD_RESULT F_API FMOD_Channel_Get3DSpread (FMOD_CHANNEL *channel, float *angle); +FMOD_RESULT F_API FMOD_Channel_Set3DLevel (FMOD_CHANNEL *channel, float level); +FMOD_RESULT F_API FMOD_Channel_Get3DLevel (FMOD_CHANNEL *channel, float *level); +FMOD_RESULT F_API FMOD_Channel_Set3DDopplerLevel (FMOD_CHANNEL *channel, float level); +FMOD_RESULT F_API FMOD_Channel_Get3DDopplerLevel (FMOD_CHANNEL *channel, float *level); +FMOD_RESULT F_API FMOD_Channel_Set3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL custom, float customLevel, float centerFreq); +FMOD_RESULT F_API FMOD_Channel_Get3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL *custom, float *customLevel, float *centerFreq); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Channel_SetUserData (FMOD_CHANNEL *channel, void *userdata); +FMOD_RESULT F_API FMOD_Channel_GetUserData (FMOD_CHANNEL *channel, void **userdata); + +/* + Channel specific control functionality. +*/ + +FMOD_RESULT F_API FMOD_Channel_SetFrequency (FMOD_CHANNEL *channel, float frequency); +FMOD_RESULT F_API FMOD_Channel_GetFrequency (FMOD_CHANNEL *channel, float *frequency); +FMOD_RESULT F_API FMOD_Channel_SetPriority (FMOD_CHANNEL *channel, int priority); +FMOD_RESULT F_API FMOD_Channel_GetPriority (FMOD_CHANNEL *channel, int *priority); +FMOD_RESULT F_API FMOD_Channel_SetPosition (FMOD_CHANNEL *channel, unsigned int position, FMOD_TIMEUNIT postype); +FMOD_RESULT F_API FMOD_Channel_GetPosition (FMOD_CHANNEL *channel, unsigned int *position, FMOD_TIMEUNIT postype); +FMOD_RESULT F_API FMOD_Channel_SetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP *channelgroup); +FMOD_RESULT F_API FMOD_Channel_GetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP **channelgroup); +FMOD_RESULT F_API FMOD_Channel_SetLoopCount (FMOD_CHANNEL *channel, int loopcount); +FMOD_RESULT F_API FMOD_Channel_GetLoopCount (FMOD_CHANNEL *channel, int *loopcount); +FMOD_RESULT F_API FMOD_Channel_SetLoopPoints (FMOD_CHANNEL *channel, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); +FMOD_RESULT F_API FMOD_Channel_GetLoopPoints (FMOD_CHANNEL *channel, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + +/* + Information only functions. +*/ + +FMOD_RESULT F_API FMOD_Channel_IsVirtual (FMOD_CHANNEL *channel, FMOD_BOOL *isvirtual); +FMOD_RESULT F_API FMOD_Channel_GetCurrentSound (FMOD_CHANNEL *channel, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_Channel_GetIndex (FMOD_CHANNEL *channel, int *index); + +/* + 'ChannelGroup' API +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetSystemObject (FMOD_CHANNELGROUP *channelgroup, FMOD_SYSTEM **system); + +/* + General control functionality for Channels and ChannelGroups. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_Stop (FMOD_CHANNELGROUP *channelgroup); +FMOD_RESULT F_API FMOD_ChannelGroup_SetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_ChannelGroup_GetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_ChannelGroup_SetVolume (FMOD_CHANNELGROUP *channelgroup, float volume); +FMOD_RESULT F_API FMOD_ChannelGroup_GetVolume (FMOD_CHANNELGROUP *channelgroup, float *volume); +FMOD_RESULT F_API FMOD_ChannelGroup_SetVolumeRamp (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL ramp); +FMOD_RESULT F_API FMOD_ChannelGroup_GetVolumeRamp (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *ramp); +FMOD_RESULT F_API FMOD_ChannelGroup_GetAudibility (FMOD_CHANNELGROUP *channelgroup, float *audibility); +FMOD_RESULT F_API FMOD_ChannelGroup_SetPitch (FMOD_CHANNELGROUP *channelgroup, float pitch); +FMOD_RESULT F_API FMOD_ChannelGroup_GetPitch (FMOD_CHANNELGROUP *channelgroup, float *pitch); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL mute); +FMOD_RESULT F_API FMOD_ChannelGroup_GetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *mute); +FMOD_RESULT F_API FMOD_ChannelGroup_SetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float wet); +FMOD_RESULT F_API FMOD_ChannelGroup_GetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float *wet); +FMOD_RESULT F_API FMOD_ChannelGroup_SetLowPassGain (FMOD_CHANNELGROUP *channelgroup, float gain); +FMOD_RESULT F_API FMOD_ChannelGroup_GetLowPassGain (FMOD_CHANNELGROUP *channelgroup, float *gain); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMode (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE mode); +FMOD_RESULT F_API FMOD_ChannelGroup_GetMode (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE *mode); +FMOD_RESULT F_API FMOD_ChannelGroup_SetCallback (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELCONTROL_CALLBACK callback); +FMOD_RESULT F_API FMOD_ChannelGroup_IsPlaying (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *isplaying); + +/* + Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_SetPan (FMOD_CHANNELGROUP *channelgroup, float pan); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsOutput (FMOD_CHANNELGROUP *channelgroup, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsInput (FMOD_CHANNELGROUP *channelgroup, float *levels, int numlevels); +FMOD_RESULT F_API FMOD_ChannelGroup_SetMixMatrix (FMOD_CHANNELGROUP *channelgroup, float *matrix, int outchannels, int inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_ChannelGroup_GetMixMatrix (FMOD_CHANNELGROUP *channelgroup, float *matrix, int *outchannels, int *inchannels, int inchannel_hop); + +/* + Clock based functionality. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetDSPClock (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock, unsigned long long *parentclock); +FMOD_RESULT F_API FMOD_ChannelGroup_SetDelay (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels); +FMOD_RESULT F_API FMOD_ChannelGroup_GetDelay (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels); +FMOD_RESULT F_API FMOD_ChannelGroup_AddFadePoint (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_ChannelGroup_SetFadePointRamp (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume); +FMOD_RESULT F_API FMOD_ChannelGroup_RemoveFadePoints (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end); +FMOD_RESULT F_API FMOD_ChannelGroup_GetFadePoints (FMOD_CHANNELGROUP *channelgroup, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume); + +/* + DSP effects. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetDSP (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP **dsp); +FMOD_RESULT F_API FMOD_ChannelGroup_AddDSP (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_ChannelGroup_RemoveDSP (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_ChannelGroup_GetNumDSPs (FMOD_CHANNELGROUP *channelgroup, int *numdsps); +FMOD_RESULT F_API FMOD_ChannelGroup_SetDSPIndex (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int index); +FMOD_RESULT F_API FMOD_ChannelGroup_GetDSPIndex (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int *index); + +/* + 3D functionality. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DAttributes (FMOD_CHANNELGROUP *channelgroup, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DAttributes (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *pos, FMOD_VECTOR *vel); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float mindistance, float maxdistance); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float *mindistance, float *maxdistance); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeSettings (FMOD_CHANNELGROUP *channelgroup, float insideconeangle, float outsideconeangle, float outsidevolume); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeSettings (FMOD_CHANNELGROUP *channelgroup, float *insideconeangle, float *outsideconeangle, float *outsidevolume); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DCustomRolloff (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *points, int numpoints); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DCustomRolloff (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR **points, int *numpoints); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float directocclusion, float reverbocclusion); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float *directocclusion, float *reverbocclusion); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DSpread (FMOD_CHANNELGROUP *channelgroup, float angle); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DSpread (FMOD_CHANNELGROUP *channelgroup, float *angle); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DLevel (FMOD_CHANNELGROUP *channelgroup, float level); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DLevel (FMOD_CHANNELGROUP *channelgroup, float *level); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DDopplerLevel (FMOD_CHANNELGROUP *channelgroup, float level); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DDopplerLevel (FMOD_CHANNELGROUP *channelgroup, float *level); +FMOD_RESULT F_API FMOD_ChannelGroup_Set3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL custom, float customLevel, float centerFreq); +FMOD_RESULT F_API FMOD_ChannelGroup_Get3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *custom, float *customLevel, float *centerFreq); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_SetUserData (FMOD_CHANNELGROUP *channelgroup, void *userdata); +FMOD_RESULT F_API FMOD_ChannelGroup_GetUserData (FMOD_CHANNELGROUP *channelgroup, void **userdata); + +FMOD_RESULT F_API FMOD_ChannelGroup_Release (FMOD_CHANNELGROUP *channelgroup); + +/* + Nested channel groups. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_AddGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP *group, FMOD_BOOL propagatedspclock, FMOD_DSPCONNECTION **connection); +FMOD_RESULT F_API FMOD_ChannelGroup_GetNumGroups (FMOD_CHANNELGROUP *channelgroup, int *numgroups); +FMOD_RESULT F_API FMOD_ChannelGroup_GetGroup (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNELGROUP **group); +FMOD_RESULT F_API FMOD_ChannelGroup_GetParentGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP **group); + +/* + Information only functions. +*/ + +FMOD_RESULT F_API FMOD_ChannelGroup_GetName (FMOD_CHANNELGROUP *channelgroup, char *name, int namelen); +FMOD_RESULT F_API FMOD_ChannelGroup_GetNumChannels (FMOD_CHANNELGROUP *channelgroup, int *numchannels); +FMOD_RESULT F_API FMOD_ChannelGroup_GetChannel (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNEL **channel); + +/* + 'SoundGroup' API +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_Release (FMOD_SOUNDGROUP *soundgroup); +FMOD_RESULT F_API FMOD_SoundGroup_GetSystemObject (FMOD_SOUNDGROUP *soundgroup, FMOD_SYSTEM **system); + +/* + SoundGroup control functions. +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int maxaudible); +FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int *maxaudible); +FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR behavior); +FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR *behavior); +FMOD_RESULT F_API FMOD_SoundGroup_SetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float speed); +FMOD_RESULT F_API FMOD_SoundGroup_GetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float *speed); +FMOD_RESULT F_API FMOD_SoundGroup_SetVolume (FMOD_SOUNDGROUP *soundgroup, float volume); +FMOD_RESULT F_API FMOD_SoundGroup_GetVolume (FMOD_SOUNDGROUP *soundgroup, float *volume); +FMOD_RESULT F_API FMOD_SoundGroup_Stop (FMOD_SOUNDGROUP *soundgroup); + +/* + Information only functions. +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_GetName (FMOD_SOUNDGROUP *soundgroup, char *name, int namelen); +FMOD_RESULT F_API FMOD_SoundGroup_GetNumSounds (FMOD_SOUNDGROUP *soundgroup, int *numsounds); +FMOD_RESULT F_API FMOD_SoundGroup_GetSound (FMOD_SOUNDGROUP *soundgroup, int index, FMOD_SOUND **sound); +FMOD_RESULT F_API FMOD_SoundGroup_GetNumPlaying (FMOD_SOUNDGROUP *soundgroup, int *numplaying); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_SoundGroup_SetUserData (FMOD_SOUNDGROUP *soundgroup, void *userdata); +FMOD_RESULT F_API FMOD_SoundGroup_GetUserData (FMOD_SOUNDGROUP *soundgroup, void **userdata); + +/* + 'DSP' API +*/ + +FMOD_RESULT F_API FMOD_DSP_Release (FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_DSP_GetSystemObject (FMOD_DSP *dsp, FMOD_SYSTEM **system); + +/* + Connection / disconnection / input and output enumeration. +*/ + +FMOD_RESULT F_API FMOD_DSP_AddInput (FMOD_DSP *dsp, FMOD_DSP *input, FMOD_DSPCONNECTION **connection, FMOD_DSPCONNECTION_TYPE type); +FMOD_RESULT F_API FMOD_DSP_DisconnectFrom (FMOD_DSP *dsp, FMOD_DSP *target, FMOD_DSPCONNECTION *connection); +FMOD_RESULT F_API FMOD_DSP_DisconnectAll (FMOD_DSP *dsp, FMOD_BOOL inputs, FMOD_BOOL outputs); +FMOD_RESULT F_API FMOD_DSP_GetNumInputs (FMOD_DSP *dsp, int *numinputs); +FMOD_RESULT F_API FMOD_DSP_GetNumOutputs (FMOD_DSP *dsp, int *numoutputs); +FMOD_RESULT F_API FMOD_DSP_GetInput (FMOD_DSP *dsp, int index, FMOD_DSP **input, FMOD_DSPCONNECTION **inputconnection); +FMOD_RESULT F_API FMOD_DSP_GetOutput (FMOD_DSP *dsp, int index, FMOD_DSP **output, FMOD_DSPCONNECTION **outputconnection); + +/* + DSP unit control. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetActive (FMOD_DSP *dsp, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_DSP_GetActive (FMOD_DSP *dsp, FMOD_BOOL *active); +FMOD_RESULT F_API FMOD_DSP_SetBypass (FMOD_DSP *dsp, FMOD_BOOL bypass); +FMOD_RESULT F_API FMOD_DSP_GetBypass (FMOD_DSP *dsp, FMOD_BOOL *bypass); +FMOD_RESULT F_API FMOD_DSP_SetWetDryMix (FMOD_DSP *dsp, float prewet, float postwet, float dry); +FMOD_RESULT F_API FMOD_DSP_GetWetDryMix (FMOD_DSP *dsp, float *prewet, float *postwet, float *dry); +FMOD_RESULT F_API FMOD_DSP_SetChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode); +FMOD_RESULT F_API FMOD_DSP_GetChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode); +FMOD_RESULT F_API FMOD_DSP_GetOutputChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode); +FMOD_RESULT F_API FMOD_DSP_Reset (FMOD_DSP *dsp); +FMOD_RESULT F_API FMOD_DSP_SetCallback (FMOD_DSP *dsp, FMOD_DSP_CALLBACK callback); + +/* + DSP parameter control. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetParameterFloat (FMOD_DSP *dsp, int index, float value); +FMOD_RESULT F_API FMOD_DSP_SetParameterInt (FMOD_DSP *dsp, int index, int value); +FMOD_RESULT F_API FMOD_DSP_SetParameterBool (FMOD_DSP *dsp, int index, FMOD_BOOL value); +FMOD_RESULT F_API FMOD_DSP_SetParameterData (FMOD_DSP *dsp, int index, void *data, unsigned int length); +FMOD_RESULT F_API FMOD_DSP_GetParameterFloat (FMOD_DSP *dsp, int index, float *value, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetParameterInt (FMOD_DSP *dsp, int index, int *value, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetParameterBool (FMOD_DSP *dsp, int index, FMOD_BOOL *value, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetParameterData (FMOD_DSP *dsp, int index, void **data, unsigned int *length, char *valuestr, int valuestrlen); +FMOD_RESULT F_API FMOD_DSP_GetNumParameters (FMOD_DSP *dsp, int *numparams); +FMOD_RESULT F_API FMOD_DSP_GetParameterInfo (FMOD_DSP *dsp, int index, FMOD_DSP_PARAMETER_DESC **desc); +FMOD_RESULT F_API FMOD_DSP_GetDataParameterIndex (FMOD_DSP *dsp, int datatype, int *index); +FMOD_RESULT F_API FMOD_DSP_ShowConfigDialog (FMOD_DSP *dsp, void *hwnd, FMOD_BOOL show); + +/* + DSP attributes. +*/ + +FMOD_RESULT F_API FMOD_DSP_GetInfo (FMOD_DSP *dsp, char *name, unsigned int *version, int *channels, int *configwidth, int *configheight); +FMOD_RESULT F_API FMOD_DSP_GetType (FMOD_DSP *dsp, FMOD_DSP_TYPE *type); +FMOD_RESULT F_API FMOD_DSP_GetIdle (FMOD_DSP *dsp, FMOD_BOOL *idle); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetUserData (FMOD_DSP *dsp, void *userdata); +FMOD_RESULT F_API FMOD_DSP_GetUserData (FMOD_DSP *dsp, void **userdata); + +/* + Metering. +*/ + +FMOD_RESULT F_API FMOD_DSP_SetMeteringEnabled (FMOD_DSP *dsp, FMOD_BOOL inputEnabled, FMOD_BOOL outputEnabled); +FMOD_RESULT F_API FMOD_DSP_GetMeteringEnabled (FMOD_DSP *dsp, FMOD_BOOL *inputEnabled, FMOD_BOOL *outputEnabled); +FMOD_RESULT F_API FMOD_DSP_GetMeteringInfo (FMOD_DSP *dsp, FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo); +FMOD_RESULT F_API FMOD_DSP_GetCPUUsage (FMOD_DSP *dsp, unsigned int *exclusive, unsigned int *inclusive); + +/* + 'DSPConnection' API +*/ + +FMOD_RESULT F_API FMOD_DSPConnection_GetInput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **input); +FMOD_RESULT F_API FMOD_DSPConnection_GetOutput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **output); +FMOD_RESULT F_API FMOD_DSPConnection_SetMix (FMOD_DSPCONNECTION *dspconnection, float volume); +FMOD_RESULT F_API FMOD_DSPConnection_GetMix (FMOD_DSPCONNECTION *dspconnection, float *volume); +FMOD_RESULT F_API FMOD_DSPConnection_SetMixMatrix (FMOD_DSPCONNECTION *dspconnection, float *matrix, int outchannels, int inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_DSPConnection_GetMixMatrix (FMOD_DSPCONNECTION *dspconnection, float *matrix, int *outchannels, int *inchannels, int inchannel_hop); +FMOD_RESULT F_API FMOD_DSPConnection_GetType (FMOD_DSPCONNECTION *dspconnection, FMOD_DSPCONNECTION_TYPE *type); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_DSPConnection_SetUserData (FMOD_DSPCONNECTION *dspconnection, void *userdata); +FMOD_RESULT F_API FMOD_DSPConnection_GetUserData (FMOD_DSPCONNECTION *dspconnection, void **userdata); + +/* + 'Geometry' API +*/ + +FMOD_RESULT F_API FMOD_Geometry_Release (FMOD_GEOMETRY *geometry); + +/* + Polygon manipulation. +*/ + +FMOD_RESULT F_API FMOD_Geometry_AddPolygon (FMOD_GEOMETRY *geometry, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex); +FMOD_RESULT F_API FMOD_Geometry_GetNumPolygons (FMOD_GEOMETRY *geometry, int *numpolygons); +FMOD_RESULT F_API FMOD_Geometry_GetMaxPolygons (FMOD_GEOMETRY *geometry, int *maxpolygons, int *maxvertices); +FMOD_RESULT F_API FMOD_Geometry_GetPolygonNumVertices (FMOD_GEOMETRY *geometry, int index, int *numvertices); +FMOD_RESULT F_API FMOD_Geometry_SetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, const FMOD_VECTOR *vertex); +FMOD_RESULT F_API FMOD_Geometry_GetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, FMOD_VECTOR *vertex); +FMOD_RESULT F_API FMOD_Geometry_SetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided); +FMOD_RESULT F_API FMOD_Geometry_GetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float *directocclusion, float *reverbocclusion, FMOD_BOOL *doublesided); + +/* + Object manipulation. +*/ + +FMOD_RESULT F_API FMOD_Geometry_SetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_Geometry_GetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL *active); +FMOD_RESULT F_API FMOD_Geometry_SetRotation (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *forward, const FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_Geometry_GetRotation (FMOD_GEOMETRY *geometry, FMOD_VECTOR *forward, FMOD_VECTOR *up); +FMOD_RESULT F_API FMOD_Geometry_SetPosition (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *position); +FMOD_RESULT F_API FMOD_Geometry_GetPosition (FMOD_GEOMETRY *geometry, FMOD_VECTOR *position); +FMOD_RESULT F_API FMOD_Geometry_SetScale (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *scale); +FMOD_RESULT F_API FMOD_Geometry_GetScale (FMOD_GEOMETRY *geometry, FMOD_VECTOR *scale); +FMOD_RESULT F_API FMOD_Geometry_Save (FMOD_GEOMETRY *geometry, void *data, int *datasize); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Geometry_SetUserData (FMOD_GEOMETRY *geometry, void *userdata); +FMOD_RESULT F_API FMOD_Geometry_GetUserData (FMOD_GEOMETRY *geometry, void **userdata); + +/* + 'Reverb3D' API +*/ + +FMOD_RESULT F_API FMOD_Reverb3D_Release (FMOD_REVERB3D *reverb3d); + +/* + Reverb manipulation. +*/ + +FMOD_RESULT F_API FMOD_Reverb3D_Set3DAttributes (FMOD_REVERB3D *reverb3d, const FMOD_VECTOR *position, float mindistance, float maxdistance); +FMOD_RESULT F_API FMOD_Reverb3D_Get3DAttributes (FMOD_REVERB3D *reverb3d, FMOD_VECTOR *position, float *mindistance, float *maxdistance); +FMOD_RESULT F_API FMOD_Reverb3D_SetProperties (FMOD_REVERB3D *reverb3d, const FMOD_REVERB_PROPERTIES *properties); +FMOD_RESULT F_API FMOD_Reverb3D_GetProperties (FMOD_REVERB3D *reverb3d, FMOD_REVERB_PROPERTIES *properties); +FMOD_RESULT F_API FMOD_Reverb3D_SetActive (FMOD_REVERB3D *reverb3d, FMOD_BOOL active); +FMOD_RESULT F_API FMOD_Reverb3D_GetActive (FMOD_REVERB3D *reverb3d, FMOD_BOOL *active); + +/* + Userdata set/get. +*/ + +FMOD_RESULT F_API FMOD_Reverb3D_SetUserData (FMOD_REVERB3D *reverb3d, void *userdata); +FMOD_RESULT F_API FMOD_Reverb3D_GetUserData (FMOD_REVERB3D *reverb3d, void **userdata); + +#ifdef __cplusplus +} +#endif + +#endif /* _FMOD_H */ diff --git a/modules/fmod/inc/fmod.hpp b/modules/fmod/inc/fmod.hpp new file mode 100644 index 0000000..d1e8c51 --- /dev/null +++ b/modules/fmod/inc/fmod.hpp @@ -0,0 +1,607 @@ +/* ======================================================================================== */ +/* FMOD Core API - C++ header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* Use this header in conjunction with fmod_common.h (which contains all the constants / */ +/* callbacks) to develop using the C++ language. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/core-api.html */ +/* ======================================================================================== */ +#ifndef _FMOD_HPP +#define _FMOD_HPP + +#include "fmod_common.h" +#include "fmod.h" + +/* + FMOD Namespace +*/ +namespace FMOD +{ + class System; + class Sound; + class ChannelControl; + class Channel; + class ChannelGroup; + class SoundGroup; + class DSP; + class DSPConnection; + class Geometry; + class Reverb3D; + + /* + FMOD global system functions (optional). + */ + inline FMOD_RESULT Memory_Initialize (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags = FMOD_MEMORY_ALL) { return FMOD_Memory_Initialize(poolmem, poollen, useralloc, userrealloc, userfree, memtypeflags); } + inline FMOD_RESULT Memory_GetStats (int *currentalloced, int *maxalloced, bool blocking = true) { return FMOD_Memory_GetStats(currentalloced, maxalloced, blocking); } + inline FMOD_RESULT Debug_Initialize (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode = FMOD_DEBUG_MODE_TTY, FMOD_DEBUG_CALLBACK callback = 0, const char *filename = 0) { return FMOD_Debug_Initialize(flags, mode, callback, filename); } + inline FMOD_RESULT File_SetDiskBusy (int busy) { return FMOD_File_SetDiskBusy(busy); } + inline FMOD_RESULT File_GetDiskBusy (int *busy) { return FMOD_File_GetDiskBusy(busy); } + inline FMOD_RESULT Thread_SetAttributes (FMOD_THREAD_TYPE type, FMOD_THREAD_AFFINITY affinity = FMOD_THREAD_AFFINITY_GROUP_DEFAULT, FMOD_THREAD_PRIORITY priority = FMOD_THREAD_PRIORITY_DEFAULT, FMOD_THREAD_STACK_SIZE stacksize = FMOD_THREAD_STACK_SIZE_DEFAULT) { return FMOD_Thread_SetAttributes(type, affinity, priority, stacksize); } + + /* + FMOD System factory functions. + */ + inline FMOD_RESULT System_Create (System **system, unsigned int headerversion = FMOD_VERSION) { return FMOD_System_Create((FMOD_SYSTEM **)system, headerversion); } + + /* + 'System' API + */ + class System + { + private: + + // Constructor made private so user cannot statically instance a System class. System_Create must be used. + System(); + System(const System &); + + public: + + FMOD_RESULT F_API release (); + + // Setup functions. + FMOD_RESULT F_API setOutput (FMOD_OUTPUTTYPE output); + FMOD_RESULT F_API getOutput (FMOD_OUTPUTTYPE *output); + FMOD_RESULT F_API getNumDrivers (int *numdrivers); + FMOD_RESULT F_API getDriverInfo (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels); + FMOD_RESULT F_API setDriver (int driver); + FMOD_RESULT F_API getDriver (int *driver); + FMOD_RESULT F_API setSoftwareChannels (int numsoftwarechannels); + FMOD_RESULT F_API getSoftwareChannels (int *numsoftwarechannels); + FMOD_RESULT F_API setSoftwareFormat (int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers); + FMOD_RESULT F_API getSoftwareFormat (int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers); + FMOD_RESULT F_API setDSPBufferSize (unsigned int bufferlength, int numbuffers); + FMOD_RESULT F_API getDSPBufferSize (unsigned int *bufferlength, int *numbuffers); + FMOD_RESULT F_API setFileSystem (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign); + FMOD_RESULT F_API attachFileSystem (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek); + FMOD_RESULT F_API setAdvancedSettings (FMOD_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API getAdvancedSettings (FMOD_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API setCallback (FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_SYSTEM_CALLBACK_ALL); + + // Plug-in support. + FMOD_RESULT F_API setPluginPath (const char *path); + FMOD_RESULT F_API loadPlugin (const char *filename, unsigned int *handle, unsigned int priority = 0); + FMOD_RESULT F_API unloadPlugin (unsigned int handle); + FMOD_RESULT F_API getNumNestedPlugins (unsigned int handle, int *count); + FMOD_RESULT F_API getNestedPlugin (unsigned int handle, int index, unsigned int *nestedhandle); + FMOD_RESULT F_API getNumPlugins (FMOD_PLUGINTYPE plugintype, int *numplugins); + FMOD_RESULT F_API getPluginHandle (FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle); + FMOD_RESULT F_API getPluginInfo (unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version); + FMOD_RESULT F_API setOutputByPlugin (unsigned int handle); + FMOD_RESULT F_API getOutputByPlugin (unsigned int *handle); + FMOD_RESULT F_API createDSPByPlugin (unsigned int handle, DSP **dsp); + FMOD_RESULT F_API getDSPInfoByPlugin (unsigned int handle, const FMOD_DSP_DESCRIPTION **description); + FMOD_RESULT F_API registerCodec (FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority = 0); + FMOD_RESULT F_API registerDSP (const FMOD_DSP_DESCRIPTION *description, unsigned int *handle); + FMOD_RESULT F_API registerOutput (const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle); + + // Init/Close. + FMOD_RESULT F_API init (int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata); + FMOD_RESULT F_API close (); + + // General post-init system functions. + FMOD_RESULT F_API update (); /* IMPORTANT! CALL THIS ONCE PER FRAME! */ + + FMOD_RESULT F_API setSpeakerPosition (FMOD_SPEAKER speaker, float x, float y, bool active); + FMOD_RESULT F_API getSpeakerPosition (FMOD_SPEAKER speaker, float *x, float *y, bool *active); + FMOD_RESULT F_API setStreamBufferSize (unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype); + FMOD_RESULT F_API getStreamBufferSize (unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype); + FMOD_RESULT F_API set3DSettings (float dopplerscale, float distancefactor, float rolloffscale); + FMOD_RESULT F_API get3DSettings (float *dopplerscale, float *distancefactor, float *rolloffscale); + FMOD_RESULT F_API set3DNumListeners (int numlisteners); + FMOD_RESULT F_API get3DNumListeners (int *numlisteners); + FMOD_RESULT F_API set3DListenerAttributes (int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up); + FMOD_RESULT F_API get3DListenerAttributes (int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up); + FMOD_RESULT F_API set3DRolloffCallback (FMOD_3D_ROLLOFF_CALLBACK callback); + FMOD_RESULT F_API mixerSuspend (); + FMOD_RESULT F_API mixerResume (); + FMOD_RESULT F_API getDefaultMixMatrix (FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop); + FMOD_RESULT F_API getSpeakerModeChannels (FMOD_SPEAKERMODE mode, int *channels); + + // System information functions. + FMOD_RESULT F_API getVersion (unsigned int *version); + FMOD_RESULT F_API getOutputHandle (void **handle); + FMOD_RESULT F_API getChannelsPlaying (int *channels, int *realchannels = 0); + FMOD_RESULT F_API getCPUUsage (FMOD_CPU_USAGE *usage); + FMOD_RESULT F_API getFileUsage (long long *sampleBytesRead, long long *streamBytesRead, long long *otherBytesRead); + + // Sound/DSP/Channel/FX creation and retrieval. + FMOD_RESULT F_API createSound (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound); + FMOD_RESULT F_API createStream (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound); + FMOD_RESULT F_API createDSP (const FMOD_DSP_DESCRIPTION *description, DSP **dsp); + FMOD_RESULT F_API createDSPByType (FMOD_DSP_TYPE type, DSP **dsp); + FMOD_RESULT F_API createChannelGroup (const char *name, ChannelGroup **channelgroup); + FMOD_RESULT F_API createSoundGroup (const char *name, SoundGroup **soundgroup); + FMOD_RESULT F_API createReverb3D (Reverb3D **reverb); + + FMOD_RESULT F_API playSound (Sound *sound, ChannelGroup *channelgroup, bool paused, Channel **channel); + FMOD_RESULT F_API playDSP (DSP *dsp, ChannelGroup *channelgroup, bool paused, Channel **channel); + FMOD_RESULT F_API getChannel (int channelid, Channel **channel); + FMOD_RESULT F_API getDSPInfoByType (FMOD_DSP_TYPE type, const FMOD_DSP_DESCRIPTION **description); + FMOD_RESULT F_API getMasterChannelGroup (ChannelGroup **channelgroup); + FMOD_RESULT F_API getMasterSoundGroup (SoundGroup **soundgroup); + + // Routing to ports. + FMOD_RESULT F_API attachChannelGroupToPort (FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, ChannelGroup *channelgroup, bool passThru = false); + FMOD_RESULT F_API detachChannelGroupFromPort (ChannelGroup *channelgroup); + + // Reverb API. + FMOD_RESULT F_API setReverbProperties (int instance, const FMOD_REVERB_PROPERTIES *prop); + FMOD_RESULT F_API getReverbProperties (int instance, FMOD_REVERB_PROPERTIES *prop); + + // System level DSP functionality. + FMOD_RESULT F_API lockDSP (); + FMOD_RESULT F_API unlockDSP (); + + // Recording API. + FMOD_RESULT F_API getRecordNumDrivers (int *numdrivers, int *numconnected); + FMOD_RESULT F_API getRecordDriverInfo (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state); + FMOD_RESULT F_API getRecordPosition (int id, unsigned int *position); + FMOD_RESULT F_API recordStart (int id, Sound *sound, bool loop); + FMOD_RESULT F_API recordStop (int id); + FMOD_RESULT F_API isRecording (int id, bool *recording); + + // Geometry API. + FMOD_RESULT F_API createGeometry (int maxpolygons, int maxvertices, Geometry **geometry); + FMOD_RESULT F_API setGeometrySettings (float maxworldsize); + FMOD_RESULT F_API getGeometrySettings (float *maxworldsize); + FMOD_RESULT F_API loadGeometry (const void *data, int datasize, Geometry **geometry); + FMOD_RESULT F_API getGeometryOcclusion (const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb); + + // Network functions. + FMOD_RESULT F_API setNetworkProxy (const char *proxy); + FMOD_RESULT F_API getNetworkProxy (char *proxy, int proxylen); + FMOD_RESULT F_API setNetworkTimeout (int timeout); + FMOD_RESULT F_API getNetworkTimeout (int *timeout); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + /* + 'Sound' API + */ + class Sound + { + private: + + // Constructor made private so user cannot statically instance a Sound class. Appropriate Sound creation or retrieval function must be used. + Sound(); + Sound(const Sound &); + + public: + + FMOD_RESULT F_API release (); + FMOD_RESULT F_API getSystemObject (System **system); + + // Standard sound manipulation functions. + FMOD_RESULT F_API lock (unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2); + FMOD_RESULT F_API unlock (void *ptr1, void *ptr2, unsigned int len1, unsigned int len2); + FMOD_RESULT F_API setDefaults (float frequency, int priority); + FMOD_RESULT F_API getDefaults (float *frequency, int *priority); + FMOD_RESULT F_API set3DMinMaxDistance (float min, float max); + FMOD_RESULT F_API get3DMinMaxDistance (float *min, float *max); + FMOD_RESULT F_API set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume); + FMOD_RESULT F_API get3DConeSettings (float *insideconeangle, float *outsideconeangle, float *outsidevolume); + FMOD_RESULT F_API set3DCustomRolloff (FMOD_VECTOR *points, int numpoints); + FMOD_RESULT F_API get3DCustomRolloff (FMOD_VECTOR **points, int *numpoints); + FMOD_RESULT F_API getSubSound (int index, Sound **subsound); + FMOD_RESULT F_API getSubSoundParent (Sound **parentsound); + FMOD_RESULT F_API getName (char *name, int namelen); + FMOD_RESULT F_API getLength (unsigned int *length, FMOD_TIMEUNIT lengthtype); + FMOD_RESULT F_API getFormat (FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits); + FMOD_RESULT F_API getNumSubSounds (int *numsubsounds); + FMOD_RESULT F_API getNumTags (int *numtags, int *numtagsupdated); + FMOD_RESULT F_API getTag (const char *name, int index, FMOD_TAG *tag); + FMOD_RESULT F_API getOpenState (FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, bool *starving, bool *diskbusy); + FMOD_RESULT F_API readData (void *buffer, unsigned int length, unsigned int *read); + FMOD_RESULT F_API seekData (unsigned int pcm); + + FMOD_RESULT F_API setSoundGroup (SoundGroup *soundgroup); + FMOD_RESULT F_API getSoundGroup (SoundGroup **soundgroup); + + // Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks. + FMOD_RESULT F_API getNumSyncPoints (int *numsyncpoints); + FMOD_RESULT F_API getSyncPoint (int index, FMOD_SYNCPOINT **point); + FMOD_RESULT F_API getSyncPointInfo (FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype); + FMOD_RESULT F_API addSyncPoint (unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point); + FMOD_RESULT F_API deleteSyncPoint (FMOD_SYNCPOINT *point); + + // Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time. + FMOD_RESULT F_API setMode (FMOD_MODE mode); + FMOD_RESULT F_API getMode (FMOD_MODE *mode); + FMOD_RESULT F_API setLoopCount (int loopcount); + FMOD_RESULT F_API getLoopCount (int *loopcount); + FMOD_RESULT F_API setLoopPoints (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); + FMOD_RESULT F_API getLoopPoints (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + + // For MOD/S3M/XM/IT/MID sequenced formats only. + FMOD_RESULT F_API getMusicNumChannels (int *numchannels); + FMOD_RESULT F_API setMusicChannelVolume (int channel, float volume); + FMOD_RESULT F_API getMusicChannelVolume (int channel, float *volume); + FMOD_RESULT F_API setMusicSpeed (float speed); + FMOD_RESULT F_API getMusicSpeed (float *speed); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + + /* + 'ChannelControl API'. This is a base class for Channel and ChannelGroup so they can share the same functionality. This cannot be used or instansiated explicitly. + */ + class ChannelControl + { + private: + + // Constructor made private so user cannot statically instance a Control class. + ChannelControl(); + ChannelControl(const ChannelControl &); + + public: + + FMOD_RESULT F_API getSystemObject (System **system); + + // General control functionality for Channels and ChannelGroups. + FMOD_RESULT F_API stop (); + FMOD_RESULT F_API setPaused (bool paused); + FMOD_RESULT F_API getPaused (bool *paused); + FMOD_RESULT F_API setVolume (float volume); + FMOD_RESULT F_API getVolume (float *volume); + FMOD_RESULT F_API setVolumeRamp (bool ramp); + FMOD_RESULT F_API getVolumeRamp (bool *ramp); + FMOD_RESULT F_API getAudibility (float *audibility); + FMOD_RESULT F_API setPitch (float pitch); + FMOD_RESULT F_API getPitch (float *pitch); + FMOD_RESULT F_API setMute (bool mute); + FMOD_RESULT F_API getMute (bool *mute); + FMOD_RESULT F_API setReverbProperties (int instance, float wet); + FMOD_RESULT F_API getReverbProperties (int instance, float *wet); + FMOD_RESULT F_API setLowPassGain (float gain); + FMOD_RESULT F_API getLowPassGain (float *gain); + FMOD_RESULT F_API setMode (FMOD_MODE mode); + FMOD_RESULT F_API getMode (FMOD_MODE *mode); + FMOD_RESULT F_API setCallback (FMOD_CHANNELCONTROL_CALLBACK callback); + FMOD_RESULT F_API isPlaying (bool *isplaying); + + // Panning and level adjustment. + // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. + FMOD_RESULT F_API setPan (float pan); + FMOD_RESULT F_API setMixLevelsOutput (float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); + FMOD_RESULT F_API setMixLevelsInput (float *levels, int numlevels); + FMOD_RESULT F_API setMixMatrix (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0); + FMOD_RESULT F_API getMixMatrix (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0); + + // Clock based functionality. + FMOD_RESULT F_API getDSPClock (unsigned long long *dspclock, unsigned long long *parentclock); + FMOD_RESULT F_API setDelay (unsigned long long dspclock_start, unsigned long long dspclock_end, bool stopchannels = true); + FMOD_RESULT F_API getDelay (unsigned long long *dspclock_start, unsigned long long *dspclock_end, bool *stopchannels = 0); + FMOD_RESULT F_API addFadePoint (unsigned long long dspclock, float volume); + FMOD_RESULT F_API setFadePointRamp (unsigned long long dspclock, float volume); + FMOD_RESULT F_API removeFadePoints (unsigned long long dspclock_start, unsigned long long dspclock_end); + FMOD_RESULT F_API getFadePoints (unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume); + + // DSP effects. + FMOD_RESULT F_API getDSP (int index, DSP **dsp); + FMOD_RESULT F_API addDSP (int index, DSP *dsp); + FMOD_RESULT F_API removeDSP (DSP *dsp); + FMOD_RESULT F_API getNumDSPs (int *numdsps); + FMOD_RESULT F_API setDSPIndex (DSP *dsp, int index); + FMOD_RESULT F_API getDSPIndex (DSP *dsp, int *index); + + // 3D functionality. + FMOD_RESULT F_API set3DAttributes (const FMOD_VECTOR *pos, const FMOD_VECTOR *vel); + FMOD_RESULT F_API get3DAttributes (FMOD_VECTOR *pos, FMOD_VECTOR *vel); + FMOD_RESULT F_API set3DMinMaxDistance (float mindistance, float maxdistance); + FMOD_RESULT F_API get3DMinMaxDistance (float *mindistance, float *maxdistance); + FMOD_RESULT F_API set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume); + FMOD_RESULT F_API get3DConeSettings (float *insideconeangle, float *outsideconeangle, float *outsidevolume); + FMOD_RESULT F_API set3DConeOrientation (FMOD_VECTOR *orientation); + FMOD_RESULT F_API get3DConeOrientation (FMOD_VECTOR *orientation); + FMOD_RESULT F_API set3DCustomRolloff (FMOD_VECTOR *points, int numpoints); + FMOD_RESULT F_API get3DCustomRolloff (FMOD_VECTOR **points, int *numpoints); + FMOD_RESULT F_API set3DOcclusion (float directocclusion, float reverbocclusion); + FMOD_RESULT F_API get3DOcclusion (float *directocclusion, float *reverbocclusion); + FMOD_RESULT F_API set3DSpread (float angle); + FMOD_RESULT F_API get3DSpread (float *angle); + FMOD_RESULT F_API set3DLevel (float level); + FMOD_RESULT F_API get3DLevel (float *level); + FMOD_RESULT F_API set3DDopplerLevel (float level); + FMOD_RESULT F_API get3DDopplerLevel (float *level); + FMOD_RESULT F_API set3DDistanceFilter (bool custom, float customLevel, float centerFreq); + FMOD_RESULT F_API get3DDistanceFilter (bool *custom, float *customLevel, float *centerFreq); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + /* + 'Channel' API. + */ + class Channel : public ChannelControl + { + private: + + // Constructor made private so user cannot statically instance a Channel class. Appropriate Channel creation or retrieval function must be used. + Channel(); + Channel(const Channel &); + + public: + + // Channel specific control functionality. + FMOD_RESULT F_API setFrequency (float frequency); + FMOD_RESULT F_API getFrequency (float *frequency); + FMOD_RESULT F_API setPriority (int priority); + FMOD_RESULT F_API getPriority (int *priority); + FMOD_RESULT F_API setPosition (unsigned int position, FMOD_TIMEUNIT postype); + FMOD_RESULT F_API getPosition (unsigned int *position, FMOD_TIMEUNIT postype); + FMOD_RESULT F_API setChannelGroup (ChannelGroup *channelgroup); + FMOD_RESULT F_API getChannelGroup (ChannelGroup **channelgroup); + FMOD_RESULT F_API setLoopCount (int loopcount); + FMOD_RESULT F_API getLoopCount (int *loopcount); + FMOD_RESULT F_API setLoopPoints (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype); + FMOD_RESULT F_API getLoopPoints (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype); + + // Information only functions. + FMOD_RESULT F_API isVirtual (bool *isvirtual); + FMOD_RESULT F_API getCurrentSound (Sound **sound); + FMOD_RESULT F_API getIndex (int *index); + }; + + /* + 'ChannelGroup' API + */ + class ChannelGroup : public ChannelControl + { + private: + + // Constructor made private so user cannot statically instance a ChannelGroup class. Appropriate ChannelGroup creation or retrieval function must be used. + ChannelGroup(); + ChannelGroup(const ChannelGroup &); + + public: + + FMOD_RESULT F_API release (); + + // Nested channel groups. + FMOD_RESULT F_API addGroup (ChannelGroup *group, bool propagatedspclock = true, DSPConnection **connection = 0); + FMOD_RESULT F_API getNumGroups (int *numgroups); + FMOD_RESULT F_API getGroup (int index, ChannelGroup **group); + FMOD_RESULT F_API getParentGroup (ChannelGroup **group); + + // Information only functions. + FMOD_RESULT F_API getName (char *name, int namelen); + FMOD_RESULT F_API getNumChannels (int *numchannels); + FMOD_RESULT F_API getChannel (int index, Channel **channel); + }; + + /* + 'SoundGroup' API + */ + class SoundGroup + { + private: + + // Constructor made private so user cannot statically instance a SoundGroup class. Appropriate SoundGroup creation or retrieval function must be used. + SoundGroup(); + SoundGroup(const SoundGroup &); + + public: + + FMOD_RESULT F_API release (); + FMOD_RESULT F_API getSystemObject (System **system); + + // SoundGroup control functions. + FMOD_RESULT F_API setMaxAudible (int maxaudible); + FMOD_RESULT F_API getMaxAudible (int *maxaudible); + FMOD_RESULT F_API setMaxAudibleBehavior (FMOD_SOUNDGROUP_BEHAVIOR behavior); + FMOD_RESULT F_API getMaxAudibleBehavior (FMOD_SOUNDGROUP_BEHAVIOR *behavior); + FMOD_RESULT F_API setMuteFadeSpeed (float speed); + FMOD_RESULT F_API getMuteFadeSpeed (float *speed); + FMOD_RESULT F_API setVolume (float volume); + FMOD_RESULT F_API getVolume (float *volume); + FMOD_RESULT F_API stop (); + + // Information only functions. + FMOD_RESULT F_API getName (char *name, int namelen); + FMOD_RESULT F_API getNumSounds (int *numsounds); + FMOD_RESULT F_API getSound (int index, Sound **sound); + FMOD_RESULT F_API getNumPlaying (int *numplaying); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + /* + 'DSP' API + */ + class DSP + { + private: + + // Constructor made private so user cannot statically instance a DSP class. Appropriate DSP creation or retrieval function must be used. + DSP(); + DSP(const DSP &); + + public: + + FMOD_RESULT F_API release (); + FMOD_RESULT F_API getSystemObject (System **system); + + // Connection / disconnection / input and output enumeration. + FMOD_RESULT F_API addInput (DSP *input, DSPConnection **connection = 0, FMOD_DSPCONNECTION_TYPE type = FMOD_DSPCONNECTION_TYPE_STANDARD); + FMOD_RESULT F_API disconnectFrom (DSP *target, DSPConnection *connection = 0); + FMOD_RESULT F_API disconnectAll (bool inputs, bool outputs); + FMOD_RESULT F_API getNumInputs (int *numinputs); + FMOD_RESULT F_API getNumOutputs (int *numoutputs); + FMOD_RESULT F_API getInput (int index, DSP **input, DSPConnection **inputconnection); + FMOD_RESULT F_API getOutput (int index, DSP **output, DSPConnection **outputconnection); + + // DSP unit control. + FMOD_RESULT F_API setActive (bool active); + FMOD_RESULT F_API getActive (bool *active); + FMOD_RESULT F_API setBypass (bool bypass); + FMOD_RESULT F_API getBypass (bool *bypass); + FMOD_RESULT F_API setWetDryMix (float prewet, float postwet, float dry); + FMOD_RESULT F_API getWetDryMix (float *prewet, float *postwet, float *dry); + FMOD_RESULT F_API setChannelFormat (FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode); + FMOD_RESULT F_API getChannelFormat (FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode); + FMOD_RESULT F_API getOutputChannelFormat (FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode); + FMOD_RESULT F_API reset (); + FMOD_RESULT F_API setCallback (FMOD_DSP_CALLBACK callback); + + // DSP parameter control. + FMOD_RESULT F_API setParameterFloat (int index, float value); + FMOD_RESULT F_API setParameterInt (int index, int value); + FMOD_RESULT F_API setParameterBool (int index, bool value); + FMOD_RESULT F_API setParameterData (int index, void *data, unsigned int length); + FMOD_RESULT F_API getParameterFloat (int index, float *value, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getParameterInt (int index, int *value, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getParameterBool (int index, bool *value, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getParameterData (int index, void **data, unsigned int *length, char *valuestr, int valuestrlen); + FMOD_RESULT F_API getNumParameters (int *numparams); + FMOD_RESULT F_API getParameterInfo (int index, FMOD_DSP_PARAMETER_DESC **desc); + FMOD_RESULT F_API getDataParameterIndex (int datatype, int *index); + FMOD_RESULT F_API showConfigDialog (void *hwnd, bool show); + + // DSP attributes. + FMOD_RESULT F_API getInfo (char *name, unsigned int *version, int *channels, int *configwidth, int *configheight); + FMOD_RESULT F_API getType (FMOD_DSP_TYPE *type); + FMOD_RESULT F_API getIdle (bool *idle); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + + // Metering. + FMOD_RESULT F_API setMeteringEnabled (bool inputEnabled, bool outputEnabled); + FMOD_RESULT F_API getMeteringEnabled (bool *inputEnabled, bool *outputEnabled); + FMOD_RESULT F_API getMeteringInfo (FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo); + FMOD_RESULT F_API getCPUUsage (unsigned int *exclusive, unsigned int *inclusive); + }; + + + /* + 'DSPConnection' API + */ + class DSPConnection + { + private: + + // Constructor made private so user cannot statically instance a DSPConnection class. Appropriate DSPConnection creation or retrieval function must be used. + DSPConnection(); + DSPConnection(const DSPConnection &); + + public: + + FMOD_RESULT F_API getInput (DSP **input); + FMOD_RESULT F_API getOutput (DSP **output); + FMOD_RESULT F_API setMix (float volume); + FMOD_RESULT F_API getMix (float *volume); + FMOD_RESULT F_API setMixMatrix (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0); + FMOD_RESULT F_API getMixMatrix (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0); + FMOD_RESULT F_API getType (FMOD_DSPCONNECTION_TYPE *type); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + + /* + 'Geometry' API + */ + class Geometry + { + private: + + // Constructor made private so user cannot statically instance a Geometry class. Appropriate Geometry creation or retrieval function must be used. + Geometry(); + Geometry(const Geometry &); + + public: + + FMOD_RESULT F_API release (); + + // Polygon manipulation. + FMOD_RESULT F_API addPolygon (float directocclusion, float reverbocclusion, bool doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex); + FMOD_RESULT F_API getNumPolygons (int *numpolygons); + FMOD_RESULT F_API getMaxPolygons (int *maxpolygons, int *maxvertices); + FMOD_RESULT F_API getPolygonNumVertices (int index, int *numvertices); + FMOD_RESULT F_API setPolygonVertex (int index, int vertexindex, const FMOD_VECTOR *vertex); + FMOD_RESULT F_API getPolygonVertex (int index, int vertexindex, FMOD_VECTOR *vertex); + FMOD_RESULT F_API setPolygonAttributes (int index, float directocclusion, float reverbocclusion, bool doublesided); + FMOD_RESULT F_API getPolygonAttributes (int index, float *directocclusion, float *reverbocclusion, bool *doublesided); + + // Object manipulation. + FMOD_RESULT F_API setActive (bool active); + FMOD_RESULT F_API getActive (bool *active); + FMOD_RESULT F_API setRotation (const FMOD_VECTOR *forward, const FMOD_VECTOR *up); + FMOD_RESULT F_API getRotation (FMOD_VECTOR *forward, FMOD_VECTOR *up); + FMOD_RESULT F_API setPosition (const FMOD_VECTOR *position); + FMOD_RESULT F_API getPosition (FMOD_VECTOR *position); + FMOD_RESULT F_API setScale (const FMOD_VECTOR *scale); + FMOD_RESULT F_API getScale (FMOD_VECTOR *scale); + FMOD_RESULT F_API save (void *data, int *datasize); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; + + + /* + 'Reverb' API + */ + class Reverb3D + { + private: + + // Constructor made private so user cannot statically instance a Reverb3D class. Appropriate Reverb creation or retrieval function must be used. + Reverb3D(); + Reverb3D(const Reverb3D &); + + public: + + FMOD_RESULT F_API release (); + + // Reverb manipulation. + FMOD_RESULT F_API set3DAttributes (const FMOD_VECTOR *position, float mindistance, float maxdistance); + FMOD_RESULT F_API get3DAttributes (FMOD_VECTOR *position, float *mindistance,float *maxdistance); + FMOD_RESULT F_API setProperties (const FMOD_REVERB_PROPERTIES *properties); + FMOD_RESULT F_API getProperties (FMOD_REVERB_PROPERTIES *properties); + FMOD_RESULT F_API setActive (bool active); + FMOD_RESULT F_API getActive (bool *active); + + // Userdata set/get. + FMOD_RESULT F_API setUserData (void *userdata); + FMOD_RESULT F_API getUserData (void **userdata); + }; +} + +#endif diff --git a/modules/fmod/inc/fmod_codec.h b/modules/fmod/inc/fmod_codec.h new file mode 100644 index 0000000..ab8fd6d --- /dev/null +++ b/modules/fmod/inc/fmod_codec.h @@ -0,0 +1,136 @@ +/* ======================================================================================== */ +/* FMOD Core API - Codec development header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* Use this header if you are wanting to develop your own file format plugin to use with */ +/* FMOD's codec system. With this header you can make your own fileformat plugin that FMOD */ +/* can register and use. See the documentation and examples on how to make a working */ +/* plugin. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/core-api.html */ +/* ======================================================================================== */ +#ifndef _FMOD_CODEC_H +#define _FMOD_CODEC_H + +/* + Codec types +*/ +typedef struct FMOD_CODEC_STATE FMOD_CODEC_STATE; +typedef struct FMOD_CODEC_WAVEFORMAT FMOD_CODEC_WAVEFORMAT; + +/* + Codec constants +*/ +#define FMOD_CODEC_PLUGIN_VERSION 1 + +typedef int FMOD_CODEC_SEEK_METHOD; +#define FMOD_CODEC_SEEK_METHOD_SET 0 +#define FMOD_CODEC_SEEK_METHOD_CURRENT 1 +#define FMOD_CODEC_SEEK_METHOD_END 2 + +/* + Codec callbacks +*/ +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_OPEN_CALLBACK) (FMOD_CODEC_STATE *codec_state, FMOD_MODE usermode, FMOD_CREATESOUNDEXINFO *userexinfo); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_CLOSE_CALLBACK) (FMOD_CODEC_STATE *codec_state); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_READ_CALLBACK) (FMOD_CODEC_STATE *codec_state, void *buffer, unsigned int samples_in, unsigned int *samples_out); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETLENGTH_CALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *length, FMOD_TIMEUNIT lengthtype); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SETPOSITION_CALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, unsigned int position, FMOD_TIMEUNIT postype); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETPOSITION_CALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *position, FMOD_TIMEUNIT postype); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SOUNDCREATE_CALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, FMOD_SOUND *sound); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETWAVEFORMAT_CALLBACK)(FMOD_CODEC_STATE *codec_state, int index, FMOD_CODEC_WAVEFORMAT *waveformat); + +/* + Codec functions +*/ +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_METADATA_FUNC) (FMOD_CODEC_STATE *codec_state, FMOD_TAGTYPE tagtype, char *name, void *data, unsigned int datalen, FMOD_TAGDATATYPE datatype, int unique); +typedef void * (F_CALLBACK *FMOD_CODEC_ALLOC_FUNC) (unsigned int size, unsigned int align, const char *file, int line); +typedef void (F_CALLBACK *FMOD_CODEC_FREE_FUNC) (void *ptr, const char *file, int line); +typedef void (F_CALLBACK *FMOD_CODEC_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *string, ...); + +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_READ_FUNC) (FMOD_CODEC_STATE *codec_state, void *buffer, unsigned int sizebytes, unsigned int *bytesread); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_SEEK_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int pos, FMOD_CODEC_SEEK_METHOD method); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_TELL_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int *pos); +typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_SIZE_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int *size); + +/* + Codec structures +*/ +typedef struct FMOD_CODEC_DESCRIPTION +{ + unsigned int apiversion; + const char *name; + unsigned int version; + int defaultasstream; + FMOD_TIMEUNIT timeunits; + FMOD_CODEC_OPEN_CALLBACK open; + FMOD_CODEC_CLOSE_CALLBACK close; + FMOD_CODEC_READ_CALLBACK read; + FMOD_CODEC_GETLENGTH_CALLBACK getlength; + FMOD_CODEC_SETPOSITION_CALLBACK setposition; + FMOD_CODEC_GETPOSITION_CALLBACK getposition; + FMOD_CODEC_SOUNDCREATE_CALLBACK soundcreate; + FMOD_CODEC_GETWAVEFORMAT_CALLBACK getwaveformat; +} FMOD_CODEC_DESCRIPTION; + +struct FMOD_CODEC_WAVEFORMAT +{ + const char* name; + FMOD_SOUND_FORMAT format; + int channels; + int frequency; + unsigned int lengthbytes; + unsigned int lengthpcm; + unsigned int pcmblocksize; + int loopstart; + int loopend; + FMOD_MODE mode; + FMOD_CHANNELMASK channelmask; + FMOD_CHANNELORDER channelorder; + float peakvolume; +}; + +typedef struct FMOD_CODEC_STATE_FUNCTIONS +{ + FMOD_CODEC_METADATA_FUNC metadata; + FMOD_CODEC_ALLOC_FUNC alloc; + FMOD_CODEC_FREE_FUNC free; + FMOD_CODEC_LOG_FUNC log; + FMOD_CODEC_FILE_READ_FUNC read; + FMOD_CODEC_FILE_SEEK_FUNC seek; + FMOD_CODEC_FILE_TELL_FUNC tell; + FMOD_CODEC_FILE_SIZE_FUNC size; +} FMOD_CODEC_STATE_FUNCTIONS; + +struct FMOD_CODEC_STATE +{ + void *plugindata; + FMOD_CODEC_WAVEFORMAT *waveformat; + FMOD_CODEC_STATE_FUNCTIONS *functions; + int numsubsounds; +}; + +/* + Codec macros +*/ +#define FMOD_CODEC_METADATA(_state, _tagtype, _name, _data, _datalen, _datatype, _unique) \ + (_state)->functions->metadata(_state, _tagtype, _name, _data, _datalen, _datatype, _unique) +#define FMOD_CODEC_ALLOC(_state, _size, _align) \ + (_state)->functions->alloc(_size, _align, __FILE__, __LINE__) +#define FMOD_CODEC_FREE(_state, _ptr) \ + (_state)->functions->free(_ptr, __FILE__, __LINE__) +#define FMOD_CODEC_LOG(_state, _level, _location, _format, ...) \ + (_state)->functions->log(_level, __FILE__, __LINE__, _location, _format, __VA_ARGS__) +#define FMOD_CODEC_FILE_READ(_state, _buffer, _sizebytes, _bytesread) \ + (_state)->functions->read(_state, _buffer, _sizebytes, _bytesread) +#define FMOD_CODEC_FILE_SEEK(_state, _pos, _method) \ + (_state)->functions->seek(_state, _pos, _method) +#define FMOD_CODEC_FILE_TELL(_state, _pos) \ + (_state)->functions->tell(_state, _pos) +#define FMOD_CODEC_FILE_SIZE(_state, _size) \ + (_state)->functions->size(_state, _size) + +#endif + + diff --git a/modules/fmod/inc/fmod_common.h b/modules/fmod/inc/fmod_common.h new file mode 100644 index 0000000..01e8f9c --- /dev/null +++ b/modules/fmod/inc/fmod_common.h @@ -0,0 +1,899 @@ +/* ======================================================================================== */ +/* FMOD Core API - Common C/C++ header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* This header is included by fmod.hpp (C++ interface) and fmod.h (C interface) */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/core-api-common.html */ +/* ======================================================================================== */ +#ifndef _FMOD_COMMON_H +#define _FMOD_COMMON_H + +/* + Library import helpers +*/ +#if defined(_WIN32) || defined(__CYGWIN__) + #define F_CALL __stdcall +#else + #define F_CALL +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) || defined(__ORBIS__) || defined(F_USE_DECLSPEC) + #define F_EXPORT __declspec(dllexport) +#elif defined(__APPLE__) || defined(__ANDROID__) || defined(__linux__) || defined(F_USE_ATTRIBUTE) + #define F_EXPORT __attribute__((visibility("default"))) +#else + #define F_EXPORT +#endif + +#ifdef DLL_EXPORTS + #define F_API F_EXPORT F_CALL +#else + #define F_API F_CALL +#endif + +#define F_CALLBACK F_CALL + +/* + FMOD core types +*/ +typedef int FMOD_BOOL; +typedef struct FMOD_SYSTEM FMOD_SYSTEM; +typedef struct FMOD_SOUND FMOD_SOUND; +typedef struct FMOD_CHANNELCONTROL FMOD_CHANNELCONTROL; +typedef struct FMOD_CHANNEL FMOD_CHANNEL; +typedef struct FMOD_CHANNELGROUP FMOD_CHANNELGROUP; +typedef struct FMOD_SOUNDGROUP FMOD_SOUNDGROUP; +typedef struct FMOD_REVERB3D FMOD_REVERB3D; +typedef struct FMOD_DSP FMOD_DSP; +typedef struct FMOD_DSPCONNECTION FMOD_DSPCONNECTION; +typedef struct FMOD_POLYGON FMOD_POLYGON; +typedef struct FMOD_GEOMETRY FMOD_GEOMETRY; +typedef struct FMOD_SYNCPOINT FMOD_SYNCPOINT; +typedef struct FMOD_ASYNCREADINFO FMOD_ASYNCREADINFO; + +/* + FMOD constants +*/ +#define FMOD_VERSION 0x00020212 /* 0xaaaabbcc -> aaaa = product version, bb = major version, cc = minor version.*/ + +typedef unsigned int FMOD_DEBUG_FLAGS; +#define FMOD_DEBUG_LEVEL_NONE 0x00000000 +#define FMOD_DEBUG_LEVEL_ERROR 0x00000001 +#define FMOD_DEBUG_LEVEL_WARNING 0x00000002 +#define FMOD_DEBUG_LEVEL_LOG 0x00000004 +#define FMOD_DEBUG_TYPE_MEMORY 0x00000100 +#define FMOD_DEBUG_TYPE_FILE 0x00000200 +#define FMOD_DEBUG_TYPE_CODEC 0x00000400 +#define FMOD_DEBUG_TYPE_TRACE 0x00000800 +#define FMOD_DEBUG_DISPLAY_TIMESTAMPS 0x00010000 +#define FMOD_DEBUG_DISPLAY_LINENUMBERS 0x00020000 +#define FMOD_DEBUG_DISPLAY_THREAD 0x00040000 + +typedef unsigned int FMOD_MEMORY_TYPE; +#define FMOD_MEMORY_NORMAL 0x00000000 +#define FMOD_MEMORY_STREAM_FILE 0x00000001 +#define FMOD_MEMORY_STREAM_DECODE 0x00000002 +#define FMOD_MEMORY_SAMPLEDATA 0x00000004 +#define FMOD_MEMORY_DSP_BUFFER 0x00000008 +#define FMOD_MEMORY_PLUGIN 0x00000010 +#define FMOD_MEMORY_PERSISTENT 0x00200000 +#define FMOD_MEMORY_ALL 0xFFFFFFFF + +typedef unsigned int FMOD_INITFLAGS; +#define FMOD_INIT_NORMAL 0x00000000 +#define FMOD_INIT_STREAM_FROM_UPDATE 0x00000001 +#define FMOD_INIT_MIX_FROM_UPDATE 0x00000002 +#define FMOD_INIT_3D_RIGHTHANDED 0x00000004 +#define FMOD_INIT_CLIP_OUTPUT 0x00000008 +#define FMOD_INIT_CHANNEL_LOWPASS 0x00000100 +#define FMOD_INIT_CHANNEL_DISTANCEFILTER 0x00000200 +#define FMOD_INIT_PROFILE_ENABLE 0x00010000 +#define FMOD_INIT_VOL0_BECOMES_VIRTUAL 0x00020000 +#define FMOD_INIT_GEOMETRY_USECLOSEST 0x00040000 +#define FMOD_INIT_PREFER_DOLBY_DOWNMIX 0x00080000 +#define FMOD_INIT_THREAD_UNSAFE 0x00100000 +#define FMOD_INIT_PROFILE_METER_ALL 0x00200000 +#define FMOD_INIT_MEMORY_TRACKING 0x00400000 + +typedef unsigned int FMOD_DRIVER_STATE; +#define FMOD_DRIVER_STATE_CONNECTED 0x00000001 +#define FMOD_DRIVER_STATE_DEFAULT 0x00000002 + +typedef unsigned int FMOD_TIMEUNIT; +#define FMOD_TIMEUNIT_MS 0x00000001 +#define FMOD_TIMEUNIT_PCM 0x00000002 +#define FMOD_TIMEUNIT_PCMBYTES 0x00000004 +#define FMOD_TIMEUNIT_RAWBYTES 0x00000008 +#define FMOD_TIMEUNIT_PCMFRACTION 0x00000010 +#define FMOD_TIMEUNIT_MODORDER 0x00000100 +#define FMOD_TIMEUNIT_MODROW 0x00000200 +#define FMOD_TIMEUNIT_MODPATTERN 0x00000400 + +typedef unsigned int FMOD_SYSTEM_CALLBACK_TYPE; +#define FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED 0x00000001 +#define FMOD_SYSTEM_CALLBACK_DEVICELOST 0x00000002 +#define FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED 0x00000004 +#define FMOD_SYSTEM_CALLBACK_THREADCREATED 0x00000008 +#define FMOD_SYSTEM_CALLBACK_BADDSPCONNECTION 0x00000010 +#define FMOD_SYSTEM_CALLBACK_PREMIX 0x00000020 +#define FMOD_SYSTEM_CALLBACK_POSTMIX 0x00000040 +#define FMOD_SYSTEM_CALLBACK_ERROR 0x00000080 +#define FMOD_SYSTEM_CALLBACK_MIDMIX 0x00000100 +#define FMOD_SYSTEM_CALLBACK_THREADDESTROYED 0x00000200 +#define FMOD_SYSTEM_CALLBACK_PREUPDATE 0x00000400 +#define FMOD_SYSTEM_CALLBACK_POSTUPDATE 0x00000800 +#define FMOD_SYSTEM_CALLBACK_RECORDLISTCHANGED 0x00001000 +#define FMOD_SYSTEM_CALLBACK_BUFFEREDNOMIX 0x00002000 +#define FMOD_SYSTEM_CALLBACK_DEVICEREINITIALIZE 0x00004000 +#define FMOD_SYSTEM_CALLBACK_OUTPUTUNDERRUN 0x00008000 +#define FMOD_SYSTEM_CALLBACK_RECORDPOSITIONCHANGED 0x00010000 +#define FMOD_SYSTEM_CALLBACK_ALL 0xFFFFFFFF + +typedef unsigned int FMOD_MODE; +#define FMOD_DEFAULT 0x00000000 +#define FMOD_LOOP_OFF 0x00000001 +#define FMOD_LOOP_NORMAL 0x00000002 +#define FMOD_LOOP_BIDI 0x00000004 +#define FMOD_2D 0x00000008 +#define FMOD_3D 0x00000010 +#define FMOD_CREATESTREAM 0x00000080 +#define FMOD_CREATESAMPLE 0x00000100 +#define FMOD_CREATECOMPRESSEDSAMPLE 0x00000200 +#define FMOD_OPENUSER 0x00000400 +#define FMOD_OPENMEMORY 0x00000800 +#define FMOD_OPENMEMORY_POINT 0x10000000 +#define FMOD_OPENRAW 0x00001000 +#define FMOD_OPENONLY 0x00002000 +#define FMOD_ACCURATETIME 0x00004000 +#define FMOD_MPEGSEARCH 0x00008000 +#define FMOD_NONBLOCKING 0x00010000 +#define FMOD_UNIQUE 0x00020000 +#define FMOD_3D_HEADRELATIVE 0x00040000 +#define FMOD_3D_WORLDRELATIVE 0x00080000 +#define FMOD_3D_INVERSEROLLOFF 0x00100000 +#define FMOD_3D_LINEARROLLOFF 0x00200000 +#define FMOD_3D_LINEARSQUAREROLLOFF 0x00400000 +#define FMOD_3D_INVERSETAPEREDROLLOFF 0x00800000 +#define FMOD_3D_CUSTOMROLLOFF 0x04000000 +#define FMOD_3D_IGNOREGEOMETRY 0x40000000 +#define FMOD_IGNORETAGS 0x02000000 +#define FMOD_LOWMEM 0x08000000 +#define FMOD_VIRTUAL_PLAYFROMSTART 0x80000000 + +typedef unsigned int FMOD_CHANNELMASK; +#define FMOD_CHANNELMASK_FRONT_LEFT 0x00000001 +#define FMOD_CHANNELMASK_FRONT_RIGHT 0x00000002 +#define FMOD_CHANNELMASK_FRONT_CENTER 0x00000004 +#define FMOD_CHANNELMASK_LOW_FREQUENCY 0x00000008 +#define FMOD_CHANNELMASK_SURROUND_LEFT 0x00000010 +#define FMOD_CHANNELMASK_SURROUND_RIGHT 0x00000020 +#define FMOD_CHANNELMASK_BACK_LEFT 0x00000040 +#define FMOD_CHANNELMASK_BACK_RIGHT 0x00000080 +#define FMOD_CHANNELMASK_BACK_CENTER 0x00000100 +#define FMOD_CHANNELMASK_MONO (FMOD_CHANNELMASK_FRONT_LEFT) +#define FMOD_CHANNELMASK_STEREO (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT) +#define FMOD_CHANNELMASK_LRC (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER) +#define FMOD_CHANNELMASK_QUAD (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT) +#define FMOD_CHANNELMASK_SURROUND (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT) +#define FMOD_CHANNELMASK_5POINT1 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT) +#define FMOD_CHANNELMASK_5POINT1_REARS (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT) +#define FMOD_CHANNELMASK_7POINT0 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT) +#define FMOD_CHANNELMASK_7POINT1 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT) + +typedef unsigned long long FMOD_PORT_INDEX; +#define FMOD_PORT_INDEX_NONE 0xFFFFFFFFFFFFFFFF +#define FMOD_PORT_INDEX_FLAG_VR_CONTROLLER 0x1000000000000000 + +typedef int FMOD_THREAD_PRIORITY; +/* Platform specific priority range */ +#define FMOD_THREAD_PRIORITY_PLATFORM_MIN (-32 * 1024) +#define FMOD_THREAD_PRIORITY_PLATFORM_MAX ( 32 * 1024) +/* Platform agnostic priorities, maps internally to platform specific value */ +#define FMOD_THREAD_PRIORITY_DEFAULT (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 1) +#define FMOD_THREAD_PRIORITY_LOW (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 2) +#define FMOD_THREAD_PRIORITY_MEDIUM (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 3) +#define FMOD_THREAD_PRIORITY_HIGH (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 4) +#define FMOD_THREAD_PRIORITY_VERY_HIGH (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 5) +#define FMOD_THREAD_PRIORITY_EXTREME (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 6) +#define FMOD_THREAD_PRIORITY_CRITICAL (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 7) +/* Thread defaults */ +#define FMOD_THREAD_PRIORITY_MIXER FMOD_THREAD_PRIORITY_EXTREME +#define FMOD_THREAD_PRIORITY_FEEDER FMOD_THREAD_PRIORITY_CRITICAL +#define FMOD_THREAD_PRIORITY_STREAM FMOD_THREAD_PRIORITY_VERY_HIGH +#define FMOD_THREAD_PRIORITY_FILE FMOD_THREAD_PRIORITY_HIGH +#define FMOD_THREAD_PRIORITY_NONBLOCKING FMOD_THREAD_PRIORITY_HIGH +#define FMOD_THREAD_PRIORITY_RECORD FMOD_THREAD_PRIORITY_HIGH +#define FMOD_THREAD_PRIORITY_GEOMETRY FMOD_THREAD_PRIORITY_LOW +#define FMOD_THREAD_PRIORITY_PROFILER FMOD_THREAD_PRIORITY_MEDIUM +#define FMOD_THREAD_PRIORITY_STUDIO_UPDATE FMOD_THREAD_PRIORITY_MEDIUM +#define FMOD_THREAD_PRIORITY_STUDIO_LOAD_BANK FMOD_THREAD_PRIORITY_MEDIUM +#define FMOD_THREAD_PRIORITY_STUDIO_LOAD_SAMPLE FMOD_THREAD_PRIORITY_MEDIUM +#define FMOD_THREAD_PRIORITY_CONVOLUTION1 FMOD_THREAD_PRIORITY_VERY_HIGH +#define FMOD_THREAD_PRIORITY_CONVOLUTION2 FMOD_THREAD_PRIORITY_VERY_HIGH + +typedef unsigned int FMOD_THREAD_STACK_SIZE; +#define FMOD_THREAD_STACK_SIZE_DEFAULT 0 +#define FMOD_THREAD_STACK_SIZE_MIXER (80 * 1024) +#define FMOD_THREAD_STACK_SIZE_FEEDER (16 * 1024) +#define FMOD_THREAD_STACK_SIZE_STREAM (96 * 1024) +#define FMOD_THREAD_STACK_SIZE_FILE (64 * 1024) +#define FMOD_THREAD_STACK_SIZE_NONBLOCKING (112 * 1024) +#define FMOD_THREAD_STACK_SIZE_RECORD (16 * 1024) +#define FMOD_THREAD_STACK_SIZE_GEOMETRY (48 * 1024) +#define FMOD_THREAD_STACK_SIZE_PROFILER (128 * 1024) +#define FMOD_THREAD_STACK_SIZE_STUDIO_UPDATE (96 * 1024) +#define FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_BANK (96 * 1024) +#define FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_SAMPLE (96 * 1024) +#define FMOD_THREAD_STACK_SIZE_CONVOLUTION1 (16 * 1024) +#define FMOD_THREAD_STACK_SIZE_CONVOLUTION2 (16 * 1024) + +typedef long long FMOD_THREAD_AFFINITY; +/* Platform agnostic thread groupings */ +#define FMOD_THREAD_AFFINITY_GROUP_DEFAULT 0x4000000000000000 +#define FMOD_THREAD_AFFINITY_GROUP_A 0x4000000000000001 +#define FMOD_THREAD_AFFINITY_GROUP_B 0x4000000000000002 +#define FMOD_THREAD_AFFINITY_GROUP_C 0x4000000000000003 +/* Thread defaults */ +#define FMOD_THREAD_AFFINITY_MIXER FMOD_THREAD_AFFINITY_GROUP_A +#define FMOD_THREAD_AFFINITY_FEEDER FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_STREAM FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_FILE FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_NONBLOCKING FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_RECORD FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_GEOMETRY FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_PROFILER FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_STUDIO_UPDATE FMOD_THREAD_AFFINITY_GROUP_B +#define FMOD_THREAD_AFFINITY_STUDIO_LOAD_BANK FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_STUDIO_LOAD_SAMPLE FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_CONVOLUTION1 FMOD_THREAD_AFFINITY_GROUP_C +#define FMOD_THREAD_AFFINITY_CONVOLUTION2 FMOD_THREAD_AFFINITY_GROUP_C +/* Core mask, valid up to 1 << 62 */ +#define FMOD_THREAD_AFFINITY_CORE_ALL 0 +#define FMOD_THREAD_AFFINITY_CORE_0 (1 << 0) +#define FMOD_THREAD_AFFINITY_CORE_1 (1 << 1) +#define FMOD_THREAD_AFFINITY_CORE_2 (1 << 2) +#define FMOD_THREAD_AFFINITY_CORE_3 (1 << 3) +#define FMOD_THREAD_AFFINITY_CORE_4 (1 << 4) +#define FMOD_THREAD_AFFINITY_CORE_5 (1 << 5) +#define FMOD_THREAD_AFFINITY_CORE_6 (1 << 6) +#define FMOD_THREAD_AFFINITY_CORE_7 (1 << 7) +#define FMOD_THREAD_AFFINITY_CORE_8 (1 << 8) +#define FMOD_THREAD_AFFINITY_CORE_9 (1 << 9) +#define FMOD_THREAD_AFFINITY_CORE_10 (1 << 10) +#define FMOD_THREAD_AFFINITY_CORE_11 (1 << 11) +#define FMOD_THREAD_AFFINITY_CORE_12 (1 << 12) +#define FMOD_THREAD_AFFINITY_CORE_13 (1 << 13) +#define FMOD_THREAD_AFFINITY_CORE_14 (1 << 14) +#define FMOD_THREAD_AFFINITY_CORE_15 (1 << 15) + +/* Preset for FMOD_REVERB_PROPERTIES */ +#define FMOD_PRESET_OFF { 1000, 7, 11, 5000, 100, 100, 100, 250, 0, 20, 96, -80.0f } +#define FMOD_PRESET_GENERIC { 1500, 7, 11, 5000, 83, 100, 100, 250, 0, 14500, 96, -8.0f } +#define FMOD_PRESET_PADDEDCELL { 170, 1, 2, 5000, 10, 100, 100, 250, 0, 160, 84, -7.8f } +#define FMOD_PRESET_ROOM { 400, 2, 3, 5000, 83, 100, 100, 250, 0, 6050, 88, -9.4f } +#define FMOD_PRESET_BATHROOM { 1500, 7, 11, 5000, 54, 100, 60, 250, 0, 2900, 83, 0.5f } +#define FMOD_PRESET_LIVINGROOM { 500, 3, 4, 5000, 10, 100, 100, 250, 0, 160, 58, -19.0f } +#define FMOD_PRESET_STONEROOM { 2300, 12, 17, 5000, 64, 100, 100, 250, 0, 7800, 71, -8.5f } +#define FMOD_PRESET_AUDITORIUM { 4300, 20, 30, 5000, 59, 100, 100, 250, 0, 5850, 64, -11.7f } +#define FMOD_PRESET_CONCERTHALL { 3900, 20, 29, 5000, 70, 100, 100, 250, 0, 5650, 80, -9.8f } +#define FMOD_PRESET_CAVE { 2900, 15, 22, 5000, 100, 100, 100, 250, 0, 20000, 59, -11.3f } +#define FMOD_PRESET_ARENA { 7200, 20, 30, 5000, 33, 100, 100, 250, 0, 4500, 80, -9.6f } +#define FMOD_PRESET_HANGAR { 10000, 20, 30, 5000, 23, 100, 100, 250, 0, 3400, 72, -7.4f } +#define FMOD_PRESET_CARPETTEDHALLWAY { 300, 2, 30, 5000, 10, 100, 100, 250, 0, 500, 56, -24.0f } +#define FMOD_PRESET_HALLWAY { 1500, 7, 11, 5000, 59, 100, 100, 250, 0, 7800, 87, -5.5f } +#define FMOD_PRESET_STONECORRIDOR { 270, 13, 20, 5000, 79, 100, 100, 250, 0, 9000, 86, -6.0f } +#define FMOD_PRESET_ALLEY { 1500, 7, 11, 5000, 86, 100, 100, 250, 0, 8300, 80, -9.8f } +#define FMOD_PRESET_FOREST { 1500, 162, 88, 5000, 54, 79, 100, 250, 0, 760, 94, -12.3f } +#define FMOD_PRESET_CITY { 1500, 7, 11, 5000, 67, 50, 100, 250, 0, 4050, 66, -26.0f } +#define FMOD_PRESET_MOUNTAINS { 1500, 300, 100, 5000, 21, 27, 100, 250, 0, 1220, 82, -24.0f } +#define FMOD_PRESET_QUARRY { 1500, 61, 25, 5000, 83, 100, 100, 250, 0, 3400, 100, -5.0f } +#define FMOD_PRESET_PLAIN { 1500, 179, 100, 5000, 50, 21, 100, 250, 0, 1670, 65, -28.0f } +#define FMOD_PRESET_PARKINGLOT { 1700, 8, 12, 5000, 100, 100, 100, 250, 0, 20000, 56, -19.5f } +#define FMOD_PRESET_SEWERPIPE { 2800, 14, 21, 5000, 14, 80, 60, 250, 0, 3400, 66, 1.2f } +#define FMOD_PRESET_UNDERWATER { 1500, 7, 11, 5000, 10, 100, 100, 250, 0, 500, 92, 7.0f } + +#define FMOD_MAX_CHANNEL_WIDTH 32 +#define FMOD_MAX_SYSTEMS 8 +#define FMOD_MAX_LISTENERS 8 +#define FMOD_REVERB_MAXINSTANCES 4 + +typedef enum FMOD_THREAD_TYPE +{ + FMOD_THREAD_TYPE_MIXER, + FMOD_THREAD_TYPE_FEEDER, + FMOD_THREAD_TYPE_STREAM, + FMOD_THREAD_TYPE_FILE, + FMOD_THREAD_TYPE_NONBLOCKING, + FMOD_THREAD_TYPE_RECORD, + FMOD_THREAD_TYPE_GEOMETRY, + FMOD_THREAD_TYPE_PROFILER, + FMOD_THREAD_TYPE_STUDIO_UPDATE, + FMOD_THREAD_TYPE_STUDIO_LOAD_BANK, + FMOD_THREAD_TYPE_STUDIO_LOAD_SAMPLE, + FMOD_THREAD_TYPE_CONVOLUTION1, + FMOD_THREAD_TYPE_CONVOLUTION2, + + FMOD_THREAD_TYPE_MAX, + FMOD_THREAD_TYPE_FORCEINT = 65536 +} FMOD_THREAD_TYPE; + +typedef enum FMOD_RESULT +{ + FMOD_OK, + FMOD_ERR_BADCOMMAND, + FMOD_ERR_CHANNEL_ALLOC, + FMOD_ERR_CHANNEL_STOLEN, + FMOD_ERR_DMA, + FMOD_ERR_DSP_CONNECTION, + FMOD_ERR_DSP_DONTPROCESS, + FMOD_ERR_DSP_FORMAT, + FMOD_ERR_DSP_INUSE, + FMOD_ERR_DSP_NOTFOUND, + FMOD_ERR_DSP_RESERVED, + FMOD_ERR_DSP_SILENCE, + FMOD_ERR_DSP_TYPE, + FMOD_ERR_FILE_BAD, + FMOD_ERR_FILE_COULDNOTSEEK, + FMOD_ERR_FILE_DISKEJECTED, + FMOD_ERR_FILE_EOF, + FMOD_ERR_FILE_ENDOFDATA, + FMOD_ERR_FILE_NOTFOUND, + FMOD_ERR_FORMAT, + FMOD_ERR_HEADER_MISMATCH, + FMOD_ERR_HTTP, + FMOD_ERR_HTTP_ACCESS, + FMOD_ERR_HTTP_PROXY_AUTH, + FMOD_ERR_HTTP_SERVER_ERROR, + FMOD_ERR_HTTP_TIMEOUT, + FMOD_ERR_INITIALIZATION, + FMOD_ERR_INITIALIZED, + FMOD_ERR_INTERNAL, + FMOD_ERR_INVALID_FLOAT, + FMOD_ERR_INVALID_HANDLE, + FMOD_ERR_INVALID_PARAM, + FMOD_ERR_INVALID_POSITION, + FMOD_ERR_INVALID_SPEAKER, + FMOD_ERR_INVALID_SYNCPOINT, + FMOD_ERR_INVALID_THREAD, + FMOD_ERR_INVALID_VECTOR, + FMOD_ERR_MAXAUDIBLE, + FMOD_ERR_MEMORY, + FMOD_ERR_MEMORY_CANTPOINT, + FMOD_ERR_NEEDS3D, + FMOD_ERR_NEEDSHARDWARE, + FMOD_ERR_NET_CONNECT, + FMOD_ERR_NET_SOCKET_ERROR, + FMOD_ERR_NET_URL, + FMOD_ERR_NET_WOULD_BLOCK, + FMOD_ERR_NOTREADY, + FMOD_ERR_OUTPUT_ALLOCATED, + FMOD_ERR_OUTPUT_CREATEBUFFER, + FMOD_ERR_OUTPUT_DRIVERCALL, + FMOD_ERR_OUTPUT_FORMAT, + FMOD_ERR_OUTPUT_INIT, + FMOD_ERR_OUTPUT_NODRIVERS, + FMOD_ERR_PLUGIN, + FMOD_ERR_PLUGIN_MISSING, + FMOD_ERR_PLUGIN_RESOURCE, + FMOD_ERR_PLUGIN_VERSION, + FMOD_ERR_RECORD, + FMOD_ERR_REVERB_CHANNELGROUP, + FMOD_ERR_REVERB_INSTANCE, + FMOD_ERR_SUBSOUNDS, + FMOD_ERR_SUBSOUND_ALLOCATED, + FMOD_ERR_SUBSOUND_CANTMOVE, + FMOD_ERR_TAGNOTFOUND, + FMOD_ERR_TOOMANYCHANNELS, + FMOD_ERR_TRUNCATED, + FMOD_ERR_UNIMPLEMENTED, + FMOD_ERR_UNINITIALIZED, + FMOD_ERR_UNSUPPORTED, + FMOD_ERR_VERSION, + FMOD_ERR_EVENT_ALREADY_LOADED, + FMOD_ERR_EVENT_LIVEUPDATE_BUSY, + FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH, + FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT, + FMOD_ERR_EVENT_NOTFOUND, + FMOD_ERR_STUDIO_UNINITIALIZED, + FMOD_ERR_STUDIO_NOT_LOADED, + FMOD_ERR_INVALID_STRING, + FMOD_ERR_ALREADY_LOCKED, + FMOD_ERR_NOT_LOCKED, + FMOD_ERR_RECORD_DISCONNECTED, + FMOD_ERR_TOOMANYSAMPLES, + + FMOD_RESULT_FORCEINT = 65536 +} FMOD_RESULT; + +typedef enum FMOD_CHANNELCONTROL_TYPE +{ + FMOD_CHANNELCONTROL_CHANNEL, + FMOD_CHANNELCONTROL_CHANNELGROUP, + + FMOD_CHANNELCONTROL_MAX, + FMOD_CHANNELCONTROL_FORCEINT = 65536 +} FMOD_CHANNELCONTROL_TYPE; + +typedef enum FMOD_OUTPUTTYPE +{ + FMOD_OUTPUTTYPE_AUTODETECT, + FMOD_OUTPUTTYPE_UNKNOWN, + FMOD_OUTPUTTYPE_NOSOUND, + FMOD_OUTPUTTYPE_WAVWRITER, + FMOD_OUTPUTTYPE_NOSOUND_NRT, + FMOD_OUTPUTTYPE_WAVWRITER_NRT, + FMOD_OUTPUTTYPE_WASAPI, + FMOD_OUTPUTTYPE_ASIO, + FMOD_OUTPUTTYPE_PULSEAUDIO, + FMOD_OUTPUTTYPE_ALSA, + FMOD_OUTPUTTYPE_COREAUDIO, + FMOD_OUTPUTTYPE_AUDIOTRACK, + FMOD_OUTPUTTYPE_OPENSL, + FMOD_OUTPUTTYPE_AUDIOOUT, + FMOD_OUTPUTTYPE_AUDIO3D, + FMOD_OUTPUTTYPE_WEBAUDIO, + FMOD_OUTPUTTYPE_NNAUDIO, + FMOD_OUTPUTTYPE_WINSONIC, + FMOD_OUTPUTTYPE_AAUDIO, + FMOD_OUTPUTTYPE_AUDIOWORKLET, + FMOD_OUTPUTTYPE_PHASE, + + FMOD_OUTPUTTYPE_MAX, + FMOD_OUTPUTTYPE_FORCEINT = 65536 +} FMOD_OUTPUTTYPE; + +typedef enum FMOD_DEBUG_MODE +{ + FMOD_DEBUG_MODE_TTY, + FMOD_DEBUG_MODE_FILE, + FMOD_DEBUG_MODE_CALLBACK, + + FMOD_DEBUG_MODE_FORCEINT = 65536 +} FMOD_DEBUG_MODE; + +typedef enum FMOD_SPEAKERMODE +{ + FMOD_SPEAKERMODE_DEFAULT, + FMOD_SPEAKERMODE_RAW, + FMOD_SPEAKERMODE_MONO, + FMOD_SPEAKERMODE_STEREO, + FMOD_SPEAKERMODE_QUAD, + FMOD_SPEAKERMODE_SURROUND, + FMOD_SPEAKERMODE_5POINT1, + FMOD_SPEAKERMODE_7POINT1, + FMOD_SPEAKERMODE_7POINT1POINT4, + + FMOD_SPEAKERMODE_MAX, + FMOD_SPEAKERMODE_FORCEINT = 65536 +} FMOD_SPEAKERMODE; + +typedef enum FMOD_SPEAKER +{ + FMOD_SPEAKER_NONE = -1, + FMOD_SPEAKER_FRONT_LEFT = 0, + FMOD_SPEAKER_FRONT_RIGHT, + FMOD_SPEAKER_FRONT_CENTER, + FMOD_SPEAKER_LOW_FREQUENCY, + FMOD_SPEAKER_SURROUND_LEFT, + FMOD_SPEAKER_SURROUND_RIGHT, + FMOD_SPEAKER_BACK_LEFT, + FMOD_SPEAKER_BACK_RIGHT, + FMOD_SPEAKER_TOP_FRONT_LEFT, + FMOD_SPEAKER_TOP_FRONT_RIGHT, + FMOD_SPEAKER_TOP_BACK_LEFT, + FMOD_SPEAKER_TOP_BACK_RIGHT, + + FMOD_SPEAKER_MAX, + FMOD_SPEAKER_FORCEINT = 65536 +} FMOD_SPEAKER; + +typedef enum FMOD_CHANNELORDER +{ + FMOD_CHANNELORDER_DEFAULT, + FMOD_CHANNELORDER_WAVEFORMAT, + FMOD_CHANNELORDER_PROTOOLS, + FMOD_CHANNELORDER_ALLMONO, + FMOD_CHANNELORDER_ALLSTEREO, + FMOD_CHANNELORDER_ALSA, + + FMOD_CHANNELORDER_MAX, + FMOD_CHANNELORDER_FORCEINT = 65536 +} FMOD_CHANNELORDER; + +typedef enum FMOD_PLUGINTYPE +{ + FMOD_PLUGINTYPE_OUTPUT, + FMOD_PLUGINTYPE_CODEC, + FMOD_PLUGINTYPE_DSP, + + FMOD_PLUGINTYPE_MAX, + FMOD_PLUGINTYPE_FORCEINT = 65536 +} FMOD_PLUGINTYPE; + +typedef enum FMOD_SOUND_TYPE +{ + FMOD_SOUND_TYPE_UNKNOWN, + FMOD_SOUND_TYPE_AIFF, + FMOD_SOUND_TYPE_ASF, + FMOD_SOUND_TYPE_DLS, + FMOD_SOUND_TYPE_FLAC, + FMOD_SOUND_TYPE_FSB, + FMOD_SOUND_TYPE_IT, + FMOD_SOUND_TYPE_MIDI, + FMOD_SOUND_TYPE_MOD, + FMOD_SOUND_TYPE_MPEG, + FMOD_SOUND_TYPE_OGGVORBIS, + FMOD_SOUND_TYPE_PLAYLIST, + FMOD_SOUND_TYPE_RAW, + FMOD_SOUND_TYPE_S3M, + FMOD_SOUND_TYPE_USER, + FMOD_SOUND_TYPE_WAV, + FMOD_SOUND_TYPE_XM, + FMOD_SOUND_TYPE_XMA, + FMOD_SOUND_TYPE_AUDIOQUEUE, + FMOD_SOUND_TYPE_AT9, + FMOD_SOUND_TYPE_VORBIS, + FMOD_SOUND_TYPE_MEDIA_FOUNDATION, + FMOD_SOUND_TYPE_MEDIACODEC, + FMOD_SOUND_TYPE_FADPCM, + FMOD_SOUND_TYPE_OPUS, + + FMOD_SOUND_TYPE_MAX, + FMOD_SOUND_TYPE_FORCEINT = 65536 +} FMOD_SOUND_TYPE; + +typedef enum FMOD_SOUND_FORMAT +{ + FMOD_SOUND_FORMAT_NONE, + FMOD_SOUND_FORMAT_PCM8, + FMOD_SOUND_FORMAT_PCM16, + FMOD_SOUND_FORMAT_PCM24, + FMOD_SOUND_FORMAT_PCM32, + FMOD_SOUND_FORMAT_PCMFLOAT, + FMOD_SOUND_FORMAT_BITSTREAM, + + FMOD_SOUND_FORMAT_MAX, + FMOD_SOUND_FORMAT_FORCEINT = 65536 +} FMOD_SOUND_FORMAT; + +typedef enum FMOD_OPENSTATE +{ + FMOD_OPENSTATE_READY, + FMOD_OPENSTATE_LOADING, + FMOD_OPENSTATE_ERROR, + FMOD_OPENSTATE_CONNECTING, + FMOD_OPENSTATE_BUFFERING, + FMOD_OPENSTATE_SEEKING, + FMOD_OPENSTATE_PLAYING, + FMOD_OPENSTATE_SETPOSITION, + + FMOD_OPENSTATE_MAX, + FMOD_OPENSTATE_FORCEINT = 65536 +} FMOD_OPENSTATE; + +typedef enum FMOD_SOUNDGROUP_BEHAVIOR +{ + FMOD_SOUNDGROUP_BEHAVIOR_FAIL, + FMOD_SOUNDGROUP_BEHAVIOR_MUTE, + FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST, + + FMOD_SOUNDGROUP_BEHAVIOR_MAX, + FMOD_SOUNDGROUP_BEHAVIOR_FORCEINT = 65536 +} FMOD_SOUNDGROUP_BEHAVIOR; + +typedef enum FMOD_CHANNELCONTROL_CALLBACK_TYPE +{ + FMOD_CHANNELCONTROL_CALLBACK_END, + FMOD_CHANNELCONTROL_CALLBACK_VIRTUALVOICE, + FMOD_CHANNELCONTROL_CALLBACK_SYNCPOINT, + FMOD_CHANNELCONTROL_CALLBACK_OCCLUSION, + + FMOD_CHANNELCONTROL_CALLBACK_MAX, + FMOD_CHANNELCONTROL_CALLBACK_FORCEINT = 65536 +} FMOD_CHANNELCONTROL_CALLBACK_TYPE; + +typedef enum FMOD_CHANNELCONTROL_DSP_INDEX +{ + FMOD_CHANNELCONTROL_DSP_HEAD = -1, + FMOD_CHANNELCONTROL_DSP_FADER = -2, + FMOD_CHANNELCONTROL_DSP_TAIL = -3, + + FMOD_CHANNELCONTROL_DSP_FORCEINT = 65536 +} FMOD_CHANNELCONTROL_DSP_INDEX; + +typedef enum FMOD_ERRORCALLBACK_INSTANCETYPE +{ + FMOD_ERRORCALLBACK_INSTANCETYPE_NONE, + FMOD_ERRORCALLBACK_INSTANCETYPE_SYSTEM, + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNEL, + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELGROUP, + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELCONTROL, + FMOD_ERRORCALLBACK_INSTANCETYPE_SOUND, + FMOD_ERRORCALLBACK_INSTANCETYPE_SOUNDGROUP, + FMOD_ERRORCALLBACK_INSTANCETYPE_DSP, + FMOD_ERRORCALLBACK_INSTANCETYPE_DSPCONNECTION, + FMOD_ERRORCALLBACK_INSTANCETYPE_GEOMETRY, + FMOD_ERRORCALLBACK_INSTANCETYPE_REVERB3D, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_SYSTEM, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTDESCRIPTION, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTINSTANCE, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_PARAMETERINSTANCE, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BUS, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_VCA, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BANK, + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_COMMANDREPLAY, + + FMOD_ERRORCALLBACK_INSTANCETYPE_FORCEINT = 65536 +} FMOD_ERRORCALLBACK_INSTANCETYPE; + +typedef enum FMOD_DSP_RESAMPLER +{ + FMOD_DSP_RESAMPLER_DEFAULT, + FMOD_DSP_RESAMPLER_NOINTERP, + FMOD_DSP_RESAMPLER_LINEAR, + FMOD_DSP_RESAMPLER_CUBIC, + FMOD_DSP_RESAMPLER_SPLINE, + + FMOD_DSP_RESAMPLER_MAX, + FMOD_DSP_RESAMPLER_FORCEINT = 65536 +} FMOD_DSP_RESAMPLER; + +typedef enum FMOD_DSP_CALLBACK_TYPE +{ + FMOD_DSP_CALLBACK_DATAPARAMETERRELEASE, + + FMOD_DSP_CALLBACK_MAX, + FMOD_DSP_CALLBACK_FORCEINT = 65536 +} FMOD_DSP_CALLBACK_TYPE; + +typedef enum FMOD_DSPCONNECTION_TYPE +{ + FMOD_DSPCONNECTION_TYPE_STANDARD, + FMOD_DSPCONNECTION_TYPE_SIDECHAIN, + FMOD_DSPCONNECTION_TYPE_SEND, + FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN, + + FMOD_DSPCONNECTION_TYPE_MAX, + FMOD_DSPCONNECTION_TYPE_FORCEINT = 65536 +} FMOD_DSPCONNECTION_TYPE; + +typedef enum FMOD_TAGTYPE +{ + FMOD_TAGTYPE_UNKNOWN, + FMOD_TAGTYPE_ID3V1, + FMOD_TAGTYPE_ID3V2, + FMOD_TAGTYPE_VORBISCOMMENT, + FMOD_TAGTYPE_SHOUTCAST, + FMOD_TAGTYPE_ICECAST, + FMOD_TAGTYPE_ASF, + FMOD_TAGTYPE_MIDI, + FMOD_TAGTYPE_PLAYLIST, + FMOD_TAGTYPE_FMOD, + FMOD_TAGTYPE_USER, + + FMOD_TAGTYPE_MAX, + FMOD_TAGTYPE_FORCEINT = 65536 +} FMOD_TAGTYPE; + +typedef enum FMOD_TAGDATATYPE +{ + FMOD_TAGDATATYPE_BINARY, + FMOD_TAGDATATYPE_INT, + FMOD_TAGDATATYPE_FLOAT, + FMOD_TAGDATATYPE_STRING, + FMOD_TAGDATATYPE_STRING_UTF16, + FMOD_TAGDATATYPE_STRING_UTF16BE, + FMOD_TAGDATATYPE_STRING_UTF8, + + FMOD_TAGDATATYPE_MAX, + FMOD_TAGDATATYPE_FORCEINT = 65536 +} FMOD_TAGDATATYPE; + +typedef enum FMOD_PORT_TYPE +{ + FMOD_PORT_TYPE_MUSIC, + FMOD_PORT_TYPE_COPYRIGHT_MUSIC, + FMOD_PORT_TYPE_VOICE, + FMOD_PORT_TYPE_CONTROLLER, + FMOD_PORT_TYPE_PERSONAL, + FMOD_PORT_TYPE_VIBRATION, + FMOD_PORT_TYPE_AUX, + + FMOD_PORT_TYPE_MAX, + FMOD_PORT_TYPE_FORCEINT = 65536 +} FMOD_PORT_TYPE; + +/* + FMOD callbacks +*/ +typedef FMOD_RESULT (F_CALL *FMOD_DEBUG_CALLBACK) (FMOD_DEBUG_FLAGS flags, const char *file, int line, const char* func, const char* message); +typedef FMOD_RESULT (F_CALL *FMOD_SYSTEM_CALLBACK) (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK_TYPE type, void *commanddata1, void* commanddata2, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_CHANNELCONTROL_CALLBACK) (FMOD_CHANNELCONTROL *channelcontrol, FMOD_CHANNELCONTROL_TYPE controltype, FMOD_CHANNELCONTROL_CALLBACK_TYPE callbacktype, void *commanddata1, void *commanddata2); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_CALLBACK) (FMOD_DSP *dsp, FMOD_DSP_CALLBACK_TYPE type, void *data); +typedef FMOD_RESULT (F_CALL *FMOD_SOUND_NONBLOCK_CALLBACK) (FMOD_SOUND *sound, FMOD_RESULT result); +typedef FMOD_RESULT (F_CALL *FMOD_SOUND_PCMREAD_CALLBACK) (FMOD_SOUND *sound, void *data, unsigned int datalen); +typedef FMOD_RESULT (F_CALL *FMOD_SOUND_PCMSETPOS_CALLBACK) (FMOD_SOUND *sound, int subsound, unsigned int position, FMOD_TIMEUNIT postype); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_OPEN_CALLBACK) (const char *name, unsigned int *filesize, void **handle, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_CLOSE_CALLBACK) (void *handle, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_READ_CALLBACK) (void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_SEEK_CALLBACK) (void *handle, unsigned int pos, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_ASYNCREAD_CALLBACK) (FMOD_ASYNCREADINFO *info, void *userdata); +typedef FMOD_RESULT (F_CALL *FMOD_FILE_ASYNCCANCEL_CALLBACK)(FMOD_ASYNCREADINFO *info, void *userdata); +typedef void (F_CALL *FMOD_FILE_ASYNCDONE_FUNC) (FMOD_ASYNCREADINFO *info, FMOD_RESULT result); +typedef void* (F_CALL *FMOD_MEMORY_ALLOC_CALLBACK) (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void* (F_CALL *FMOD_MEMORY_REALLOC_CALLBACK) (void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void (F_CALL *FMOD_MEMORY_FREE_CALLBACK) (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef float (F_CALL *FMOD_3D_ROLLOFF_CALLBACK) (FMOD_CHANNELCONTROL *channelcontrol, float distance); + +/* + FMOD structs +*/ +struct FMOD_ASYNCREADINFO +{ + void *handle; + unsigned int offset; + unsigned int sizebytes; + int priority; + void *userdata; + void *buffer; + unsigned int bytesread; + FMOD_FILE_ASYNCDONE_FUNC done; +}; + +typedef struct FMOD_VECTOR +{ + float x; + float y; + float z; +} FMOD_VECTOR; + +typedef struct FMOD_3D_ATTRIBUTES +{ + FMOD_VECTOR position; + FMOD_VECTOR velocity; + FMOD_VECTOR forward; + FMOD_VECTOR up; +} FMOD_3D_ATTRIBUTES; + +typedef struct FMOD_GUID +{ + unsigned int Data1; + unsigned short Data2; + unsigned short Data3; + unsigned char Data4[8]; +} FMOD_GUID; + +typedef struct FMOD_PLUGINLIST +{ + FMOD_PLUGINTYPE type; + void *description; +} FMOD_PLUGINLIST; + +typedef struct FMOD_ADVANCEDSETTINGS +{ + int cbSize; + int maxMPEGCodecs; + int maxADPCMCodecs; + int maxXMACodecs; + int maxVorbisCodecs; + int maxAT9Codecs; + int maxFADPCMCodecs; + int maxPCMCodecs; + int ASIONumChannels; + char **ASIOChannelList; + FMOD_SPEAKER *ASIOSpeakerList; + float vol0virtualvol; + unsigned int defaultDecodeBufferSize; + unsigned short profilePort; + unsigned int geometryMaxFadeTime; + float distanceFilterCenterFreq; + int reverb3Dinstance; + int DSPBufferPoolSize; + FMOD_DSP_RESAMPLER resamplerMethod; + unsigned int randomSeed; + int maxConvolutionThreads; + int maxOpusCodecs; +} FMOD_ADVANCEDSETTINGS; + +typedef struct FMOD_TAG +{ + FMOD_TAGTYPE type; + FMOD_TAGDATATYPE datatype; + char *name; + void *data; + unsigned int datalen; + FMOD_BOOL updated; +} FMOD_TAG; + +typedef struct FMOD_CREATESOUNDEXINFO +{ + int cbsize; + unsigned int length; + unsigned int fileoffset; + int numchannels; + int defaultfrequency; + FMOD_SOUND_FORMAT format; + unsigned int decodebuffersize; + int initialsubsound; + int numsubsounds; + int *inclusionlist; + int inclusionlistnum; + FMOD_SOUND_PCMREAD_CALLBACK pcmreadcallback; + FMOD_SOUND_PCMSETPOS_CALLBACK pcmsetposcallback; + FMOD_SOUND_NONBLOCK_CALLBACK nonblockcallback; + const char *dlsname; + const char *encryptionkey; + int maxpolyphony; + void *userdata; + FMOD_SOUND_TYPE suggestedsoundtype; + FMOD_FILE_OPEN_CALLBACK fileuseropen; + FMOD_FILE_CLOSE_CALLBACK fileuserclose; + FMOD_FILE_READ_CALLBACK fileuserread; + FMOD_FILE_SEEK_CALLBACK fileuserseek; + FMOD_FILE_ASYNCREAD_CALLBACK fileuserasyncread; + FMOD_FILE_ASYNCCANCEL_CALLBACK fileuserasynccancel; + void *fileuserdata; + int filebuffersize; + FMOD_CHANNELORDER channelorder; + FMOD_SOUNDGROUP *initialsoundgroup; + unsigned int initialseekposition; + FMOD_TIMEUNIT initialseekpostype; + int ignoresetfilesystem; + unsigned int audioqueuepolicy; + unsigned int minmidigranularity; + int nonblockthreadid; + FMOD_GUID *fsbguid; +} FMOD_CREATESOUNDEXINFO; + +typedef struct FMOD_REVERB_PROPERTIES +{ + float DecayTime; + float EarlyDelay; + float LateDelay; + float HFReference; + float HFDecayRatio; + float Diffusion; + float Density; + float LowShelfFrequency; + float LowShelfGain; + float HighCut; + float EarlyLateMix; + float WetLevel; +} FMOD_REVERB_PROPERTIES; + +typedef struct FMOD_ERRORCALLBACK_INFO +{ + FMOD_RESULT result; + FMOD_ERRORCALLBACK_INSTANCETYPE instancetype; + void *instance; + const char *functionname; + const char *functionparams; +} FMOD_ERRORCALLBACK_INFO; + +typedef struct FMOD_CPU_USAGE +{ + float dsp; + float stream; + float geometry; + float update; + float convolution1; + float convolution2; +} FMOD_CPU_USAGE; + +typedef struct FMOD_DSP_DATA_PARAMETER_INFO +{ + void *data; + unsigned int length; + int index; +} FMOD_DSP_DATA_PARAMETER_INFO; + +/* + FMOD optional headers for plugin development +*/ +#include "fmod_codec.h" +#include "fmod_dsp.h" +#include "fmod_output.h" + +#endif diff --git a/modules/fmod/inc/fmod_dsp.cs b/modules/fmod/inc/fmod_dsp.cs new file mode 100644 index 0000000..537fe5c --- /dev/null +++ b/modules/fmod/inc/fmod_dsp.cs @@ -0,0 +1,897 @@ +/* ======================================================================================== */ +/* FMOD Core API - DSP header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* Use this header if you are wanting to develop your own DSP plugin to use with FMODs */ +/* dsp system. With this header you can make your own DSP plugin that FMOD can */ +/* register and use. See the documentation and examples on how to make a working plugin. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/plugin-api-dsp.html */ +/* =========================================================================================*/ + +using System; +using System.Text; +using System.Runtime.InteropServices; + +namespace FMOD +{ + [StructLayout(LayoutKind.Sequential)] + public struct DSP_BUFFER_ARRAY + { + public int numbuffers; + public int[] buffernumchannels; + public CHANNELMASK[] bufferchannelmask; + public IntPtr[] buffers; + public SPEAKERMODE speakermode; + } + + public enum DSP_PROCESS_OPERATION + { + PROCESS_PERFORM = 0, + PROCESS_QUERY + } + + [StructLayout(LayoutKind.Sequential)] + public struct COMPLEX + { + public float real; + public float imag; + } + + public enum DSP_PAN_SURROUND_FLAGS + { + DEFAULT = 0, + ROTATION_NOT_BIASED = 1, + } + + + /* + DSP callbacks + */ + public delegate RESULT DSP_CREATE_CALLBACK (ref DSP_STATE dsp_state); + public delegate RESULT DSP_RELEASE_CALLBACK (ref DSP_STATE dsp_state); + public delegate RESULT DSP_RESET_CALLBACK (ref DSP_STATE dsp_state); + public delegate RESULT DSP_SETPOSITION_CALLBACK (ref DSP_STATE dsp_state, uint pos); + public delegate RESULT DSP_READ_CALLBACK (ref DSP_STATE dsp_state, IntPtr inbuffer, IntPtr outbuffer, uint length, int inchannels, ref int outchannels); + public delegate RESULT DSP_SHOULDIPROCESS_CALLBACK (ref DSP_STATE dsp_state, bool inputsidle, uint length, CHANNELMASK inmask, int inchannels, SPEAKERMODE speakermode); + public delegate RESULT DSP_PROCESS_CALLBACK (ref DSP_STATE dsp_state, uint length, ref DSP_BUFFER_ARRAY inbufferarray, ref DSP_BUFFER_ARRAY outbufferarray, bool inputsidle, DSP_PROCESS_OPERATION op); + public delegate RESULT DSP_SETPARAM_FLOAT_CALLBACK (ref DSP_STATE dsp_state, int index, float value); + public delegate RESULT DSP_SETPARAM_INT_CALLBACK (ref DSP_STATE dsp_state, int index, int value); + public delegate RESULT DSP_SETPARAM_BOOL_CALLBACK (ref DSP_STATE dsp_state, int index, bool value); + public delegate RESULT DSP_SETPARAM_DATA_CALLBACK (ref DSP_STATE dsp_state, int index, IntPtr data, uint length); + public delegate RESULT DSP_GETPARAM_FLOAT_CALLBACK (ref DSP_STATE dsp_state, int index, ref float value, IntPtr valuestr); + public delegate RESULT DSP_GETPARAM_INT_CALLBACK (ref DSP_STATE dsp_state, int index, ref int value, IntPtr valuestr); + public delegate RESULT DSP_GETPARAM_BOOL_CALLBACK (ref DSP_STATE dsp_state, int index, ref bool value, IntPtr valuestr); + public delegate RESULT DSP_GETPARAM_DATA_CALLBACK (ref DSP_STATE dsp_state, int index, ref IntPtr data, ref uint length, IntPtr valuestr); + public delegate RESULT DSP_SYSTEM_REGISTER_CALLBACK (ref DSP_STATE dsp_state); + public delegate RESULT DSP_SYSTEM_DEREGISTER_CALLBACK (ref DSP_STATE dsp_state); + public delegate RESULT DSP_SYSTEM_MIX_CALLBACK (ref DSP_STATE dsp_state, int stage); + + + /* + DSP functions + */ + public delegate IntPtr DSP_ALLOC_FUNC (uint size, MEMORY_TYPE type, IntPtr sourcestr); + public delegate IntPtr DSP_REALLOC_FUNC (IntPtr ptr, uint size, MEMORY_TYPE type, IntPtr sourcestr); + public delegate void DSP_FREE_FUNC (IntPtr ptr, MEMORY_TYPE type, IntPtr sourcestr); + public delegate void DSP_LOG_FUNC (DEBUG_FLAGS level, IntPtr file, int line, IntPtr function, IntPtr str); + public delegate RESULT DSP_GETSAMPLERATE_FUNC (ref DSP_STATE dsp_state, ref int rate); + public delegate RESULT DSP_GETBLOCKSIZE_FUNC (ref DSP_STATE dsp_state, ref uint blocksize); + public delegate RESULT DSP_GETSPEAKERMODE_FUNC (ref DSP_STATE dsp_state, ref int speakermode_mixer, ref int speakermode_output); + public delegate RESULT DSP_GETCLOCK_FUNC (ref DSP_STATE dsp_state, out ulong clock, out uint offset, out uint length); + public delegate RESULT DSP_GETLISTENERATTRIBUTES_FUNC (ref DSP_STATE dsp_state, ref int numlisteners, IntPtr attributes); + public delegate RESULT DSP_GETUSERDATA_FUNC (ref DSP_STATE dsp_state, out IntPtr userdata); + public delegate RESULT DSP_DFT_FFTREAL_FUNC (ref DSP_STATE dsp_state, int size, IntPtr signal, IntPtr dft, IntPtr window, int signalhop); + public delegate RESULT DSP_DFT_IFFTREAL_FUNC (ref DSP_STATE dsp_state, int size, IntPtr dft, IntPtr signal, IntPtr window, int signalhop); + public delegate RESULT DSP_PAN_SUMMONOMATRIX_FUNC (ref DSP_STATE dsp_state, int sourceSpeakerMode, float lowFrequencyGain, float overallGain, IntPtr matrix); + public delegate RESULT DSP_PAN_SUMSTEREOMATRIX_FUNC (ref DSP_STATE dsp_state, int sourceSpeakerMode, float pan, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix); + public delegate RESULT DSP_PAN_SUMSURROUNDMATRIX_FUNC (ref DSP_STATE dsp_state, int sourceSpeakerMode, int targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix, DSP_PAN_SURROUND_FLAGS flags); + public delegate RESULT DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC (ref DSP_STATE dsp_state, int targetSpeakerMode, float direction, float extent, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix); + public delegate RESULT DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC (ref DSP_STATE dsp_state, int targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix); + public delegate RESULT DSP_PAN_GETROLLOFFGAIN_FUNC (ref DSP_STATE dsp_state, DSP_PAN_3D_ROLLOFF_TYPE rolloff, float distance, float mindistance, float maxdistance, out float gain); + + + public enum DSP_TYPE : int + { + UNKNOWN, + MIXER, + OSCILLATOR, + LOWPASS, + ITLOWPASS, + HIGHPASS, + ECHO, + FADER, + FLANGE, + DISTORTION, + NORMALIZE, + LIMITER, + PARAMEQ, + PITCHSHIFT, + CHORUS, + VSTPLUGIN, + WINAMPPLUGIN, + ITECHO, + COMPRESSOR, + SFXREVERB, + LOWPASS_SIMPLE, + DELAY, + TREMOLO, + LADSPAPLUGIN, + SEND, + RETURN, + HIGHPASS_SIMPLE, + PAN, + THREE_EQ, + FFT, + LOUDNESS_METER, + ENVELOPEFOLLOWER, + CONVOLUTIONREVERB, + CHANNELMIX, + TRANSCEIVER, + OBJECTPAN, + MULTIBAND_EQ, + MAX + } + + public enum DSP_PARAMETER_TYPE + { + FLOAT = 0, + INT, + BOOL, + DATA, + MAX + } + + public enum DSP_PARAMETER_FLOAT_MAPPING_TYPE + { + DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR = 0, + DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO, + DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR, + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR + { + public int numpoints; + public IntPtr pointparamvalues; + public IntPtr pointpositions; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_FLOAT_MAPPING + { + public DSP_PARAMETER_FLOAT_MAPPING_TYPE type; + public DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR piecewiselinearmapping; + } + + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_DESC_FLOAT + { + public float min; + public float max; + public float defaultval; + public DSP_PARAMETER_FLOAT_MAPPING mapping; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_DESC_INT + { + public int min; + public int max; + public int defaultval; + public bool goestoinf; + public IntPtr valuenames; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_DESC_BOOL + { + public bool defaultval; + public IntPtr valuenames; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_DESC_DATA + { + public int datatype; + } + + [StructLayout(LayoutKind.Explicit)] + public struct DSP_PARAMETER_DESC_UNION + { + [FieldOffset(0)] + public DSP_PARAMETER_DESC_FLOAT floatdesc; + [FieldOffset(0)] + public DSP_PARAMETER_DESC_INT intdesc; + [FieldOffset(0)] + public DSP_PARAMETER_DESC_BOOL booldesc; + [FieldOffset(0)] + public DSP_PARAMETER_DESC_DATA datadesc; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_DESC + { + public DSP_PARAMETER_TYPE type; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] name; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] label; + public string description; + + public DSP_PARAMETER_DESC_UNION desc; + } + + public enum DSP_PARAMETER_DATA_TYPE + { + DSP_PARAMETER_DATA_TYPE_USER = 0, + DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1, + DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2, + DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3, + DSP_PARAMETER_DATA_TYPE_FFT = -4, + DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5, + DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE = -6 + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_OVERALLGAIN + { + public float linear_gain; + public float linear_gain_additive; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_3DATTRIBUTES + { + public ATTRIBUTES_3D relative; + public ATTRIBUTES_3D absolute; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_3DATTRIBUTES_MULTI + { + public int numlisteners; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public ATTRIBUTES_3D[] relative; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public float[] weight; + public ATTRIBUTES_3D absolute; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_SIDECHAIN + { + public int sidechainenable; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_FFT + { + public int length; + public int numchannels; + + [MarshalAs(UnmanagedType.ByValArray,SizeConst=32)] + private IntPtr[] spectrum_internal; + + public float[][] spectrum + { + get + { + var buffer = new float[numchannels][]; + + for (int i = 0; i < numchannels; ++i) + { + buffer[i] = new float[length]; + Marshal.Copy(spectrum_internal[i], buffer[i], 0, length); + } + + return buffer; + } + } + + public void getSpectrum(ref float[][] buffer) + { + int bufferLength = Math.Min(buffer.Length, numchannels); + for (int i = 0; i < bufferLength; ++i) + { + getSpectrum(i, ref buffer[i]); + } + } + + public void getSpectrum(int channel, ref float[] buffer) + { + int bufferLength = Math.Min(buffer.Length, length); + Marshal.Copy(spectrum_internal[channel], buffer, 0, bufferLength); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_LOUDNESS_METER_INFO_TYPE + { + public float momentaryloudness; + public float shorttermloudness; + public float integratedloudness; + public float loudness10thpercentile; + public float loudness95thpercentile; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 66)] + public float[] loudnesshistogram; + public float maxtruepeak; + public float maxmomentaryloudness; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_LOUDNESS_METER_WEIGHTING_TYPE + { + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public float[] channelweight; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_PARAMETER_ATTENUATION_RANGE + { + public float min; + public float max; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_DESCRIPTION + { + public uint pluginsdkversion; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] name; + public uint version; + public int numinputbuffers; + public int numoutputbuffers; + public DSP_CREATE_CALLBACK create; + public DSP_RELEASE_CALLBACK release; + public DSP_RESET_CALLBACK reset; + public DSP_READ_CALLBACK read; + public DSP_PROCESS_CALLBACK process; + public DSP_SETPOSITION_CALLBACK setposition; + + public int numparameters; + public IntPtr paramdesc; + public DSP_SETPARAM_FLOAT_CALLBACK setparameterfloat; + public DSP_SETPARAM_INT_CALLBACK setparameterint; + public DSP_SETPARAM_BOOL_CALLBACK setparameterbool; + public DSP_SETPARAM_DATA_CALLBACK setparameterdata; + public DSP_GETPARAM_FLOAT_CALLBACK getparameterfloat; + public DSP_GETPARAM_INT_CALLBACK getparameterint; + public DSP_GETPARAM_BOOL_CALLBACK getparameterbool; + public DSP_GETPARAM_DATA_CALLBACK getparameterdata; + public DSP_SHOULDIPROCESS_CALLBACK shouldiprocess; + public IntPtr userdata; + + public DSP_SYSTEM_REGISTER_CALLBACK sys_register; + public DSP_SYSTEM_DEREGISTER_CALLBACK sys_deregister; + public DSP_SYSTEM_MIX_CALLBACK sys_mix; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_STATE_DFT_FUNCTIONS + { + public DSP_DFT_FFTREAL_FUNC fftreal; + public DSP_DFT_IFFTREAL_FUNC inversefftreal; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_STATE_PAN_FUNCTIONS + { + public DSP_PAN_SUMMONOMATRIX_FUNC summonomatrix; + public DSP_PAN_SUMSTEREOMATRIX_FUNC sumstereomatrix; + public DSP_PAN_SUMSURROUNDMATRIX_FUNC sumsurroundmatrix; + public DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC summonotosurroundmatrix; + public DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC sumstereotosurroundmatrix; + public DSP_PAN_GETROLLOFFGAIN_FUNC getrolloffgain; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_STATE_FUNCTIONS + { + public DSP_ALLOC_FUNC alloc; + public DSP_REALLOC_FUNC realloc; + public DSP_FREE_FUNC free; + public DSP_GETSAMPLERATE_FUNC getsamplerate; + public DSP_GETBLOCKSIZE_FUNC getblocksize; + public IntPtr dft; + public IntPtr pan; + public DSP_GETSPEAKERMODE_FUNC getspeakermode; + public DSP_GETCLOCK_FUNC getclock; + public DSP_GETLISTENERATTRIBUTES_FUNC getlistenerattributes; + public DSP_LOG_FUNC log; + public DSP_GETUSERDATA_FUNC getuserdata; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_STATE + { + public IntPtr instance; + public IntPtr plugindata; + public uint channelmask; + public int source_speakermode; + public IntPtr sidechaindata; + public int sidechainchannels; + public IntPtr functions; + public int systemobject; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DSP_METERING_INFO + { + public int numsamples; + [MarshalAs(UnmanagedType.ByValArray, SizeConst=32)] + public float[] peaklevel; + [MarshalAs(UnmanagedType.ByValArray, SizeConst=32)] + public float[] rmslevel; + public short numchannels; + } + + /* + ============================================================================================================== + + FMOD built in effect parameters. + Use DSP::setParameter with these enums for the 'index' parameter. + + ============================================================================================================== + */ + + public enum DSP_OSCILLATOR : int + { + TYPE, + RATE + } + + public enum DSP_LOWPASS : int + { + CUTOFF, + RESONANCE + } + + public enum DSP_ITLOWPASS : int + { + CUTOFF, + RESONANCE + } + + public enum DSP_HIGHPASS : int + { + CUTOFF, + RESONANCE + } + + public enum DSP_ECHO : int + { + DELAY, + FEEDBACK, + DRYLEVEL, + WETLEVEL + } + + public enum DSP_FADER : int + { + GAIN, + OVERALL_GAIN, + } + + public enum DSP_DELAY : int + { + CH0, + CH1, + CH2, + CH3, + CH4, + CH5, + CH6, + CH7, + CH8, + CH9, + CH10, + CH11, + CH12, + CH13, + CH14, + CH15, + MAXDELAY, + } + + public enum DSP_FLANGE : int + { + MIX, + DEPTH, + RATE + } + + public enum DSP_TREMOLO : int + { + FREQUENCY, + DEPTH, + SHAPE, + SKEW, + DUTY, + SQUARE, + PHASE, + SPREAD + } + + public enum DSP_DISTORTION : int + { + LEVEL + } + + public enum DSP_NORMALIZE : int + { + FADETIME, + THRESHOLD, + MAXAMP + } + + public enum DSP_LIMITER : int + { + RELEASETIME, + CEILING, + MAXIMIZERGAIN, + MODE, + } + + public enum DSP_PARAMEQ : int + { + CENTER, + BANDWIDTH, + GAIN + } + + public enum DSP_MULTIBAND_EQ : int + { + A_FILTER, + A_FREQUENCY, + A_Q, + A_GAIN, + B_FILTER, + B_FREQUENCY, + B_Q, + B_GAIN, + C_FILTER, + C_FREQUENCY, + C_Q, + C_GAIN, + D_FILTER, + D_FREQUENCY, + D_Q, + D_GAIN, + E_FILTER, + E_FREQUENCY, + E_Q, + E_GAIN, + } + + public enum DSP_MULTIBAND_EQ_FILTER_TYPE : int + { + DISABLED, + LOWPASS_12DB, + LOWPASS_24DB, + LOWPASS_48DB, + HIGHPASS_12DB, + HIGHPASS_24DB, + HIGHPASS_48DB, + LOWSHELF, + HIGHSHELF, + PEAKING, + BANDPASS, + NOTCH, + ALLPASS, + } + + public enum DSP_PITCHSHIFT : int + { + PITCH, + FFTSIZE, + OVERLAP, + MAXCHANNELS + } + + public enum DSP_CHORUS : int + { + MIX, + RATE, + DEPTH, + } + + public enum DSP_ITECHO : int + { + WETDRYMIX, + FEEDBACK, + LEFTDELAY, + RIGHTDELAY, + PANDELAY + } + + public enum DSP_COMPRESSOR : int + { + THRESHOLD, + RATIO, + ATTACK, + RELEASE, + GAINMAKEUP, + USESIDECHAIN, + LINKED + } + + public enum DSP_SFXREVERB : int + { + DECAYTIME, + EARLYDELAY, + LATEDELAY, + HFREFERENCE, + HFDECAYRATIO, + DIFFUSION, + DENSITY, + LOWSHELFFREQUENCY, + LOWSHELFGAIN, + HIGHCUT, + EARLYLATEMIX, + WETLEVEL, + DRYLEVEL + } + + public enum DSP_LOWPASS_SIMPLE : int + { + CUTOFF + } + + public enum DSP_SEND : int + { + RETURNID, + LEVEL, + } + + public enum DSP_RETURN : int + { + ID, + INPUT_SPEAKER_MODE + } + + public enum DSP_HIGHPASS_SIMPLE : int + { + CUTOFF + } + + public enum DSP_PAN_2D_STEREO_MODE_TYPE : int + { + DISTRIBUTED, + DISCRETE + } + + public enum DSP_PAN_MODE_TYPE : int + { + MONO, + STEREO, + SURROUND + } + + public enum DSP_PAN_3D_ROLLOFF_TYPE : int + { + LINEARSQUARED, + LINEAR, + INVERSE, + INVERSETAPERED, + CUSTOM + } + + public enum DSP_PAN_3D_EXTENT_MODE_TYPE : int + { + AUTO, + USER, + OFF + } + + public enum DSP_PAN : int + { + MODE, + _2D_STEREO_POSITION, + _2D_DIRECTION, + _2D_EXTENT, + _2D_ROTATION, + _2D_LFE_LEVEL, + _2D_STEREO_MODE, + _2D_STEREO_SEPARATION, + _2D_STEREO_AXIS, + ENABLED_SPEAKERS, + _3D_POSITION, + _3D_ROLLOFF, + _3D_MIN_DISTANCE, + _3D_MAX_DISTANCE, + _3D_EXTENT_MODE, + _3D_SOUND_SIZE, + _3D_MIN_EXTENT, + _3D_PAN_BLEND, + LFE_UPMIX_ENABLED, + OVERALL_GAIN, + SURROUND_SPEAKER_MODE, + _2D_HEIGHT_BLEND, + ATTENUATION_RANGE, + OVERRIDE_RANGE + } + + public enum DSP_THREE_EQ_CROSSOVERSLOPE_TYPE : int + { + _12DB, + _24DB, + _48DB + } + + public enum DSP_THREE_EQ : int + { + LOWGAIN, + MIDGAIN, + HIGHGAIN, + LOWCROSSOVER, + HIGHCROSSOVER, + CROSSOVERSLOPE + } + + public enum DSP_FFT_WINDOW : int + { + RECT, + TRIANGLE, + HAMMING, + HANNING, + BLACKMAN, + BLACKMANHARRIS + } + + public enum DSP_FFT : int + { + WINDOWSIZE, + WINDOWTYPE, + SPECTRUMDATA, + DOMINANT_FREQ + } + + + public enum DSP_LOUDNESS_METER : int + { + STATE, + WEIGHTING, + INFO + } + + + public enum DSP_LOUDNESS_METER_STATE_TYPE : int + { + RESET_INTEGRATED = -3, + RESET_MAXPEAK = -2, + RESET_ALL = -1, + PAUSED = 0, + ANALYZING = 1 + } + + public enum DSP_ENVELOPEFOLLOWER : int + { + ATTACK, + RELEASE, + ENVELOPE, + USESIDECHAIN + } + + public enum DSP_CONVOLUTION_REVERB : int + { + IR, + WET, + DRY, + LINKED + } + + public enum DSP_CHANNELMIX_OUTPUT : int + { + DEFAULT, + ALLMONO, + ALLSTEREO, + ALLQUAD, + ALL5POINT1, + ALL7POINT1, + ALLLFE, + ALL7POINT1POINT4 + } + + public enum DSP_CHANNELMIX : int + { + OUTPUTGROUPING, + GAIN_CH0, + GAIN_CH1, + GAIN_CH2, + GAIN_CH3, + GAIN_CH4, + GAIN_CH5, + GAIN_CH6, + GAIN_CH7, + GAIN_CH8, + GAIN_CH9, + GAIN_CH10, + GAIN_CH11, + GAIN_CH12, + GAIN_CH13, + GAIN_CH14, + GAIN_CH15, + GAIN_CH16, + GAIN_CH17, + GAIN_CH18, + GAIN_CH19, + GAIN_CH20, + GAIN_CH21, + GAIN_CH22, + GAIN_CH23, + GAIN_CH24, + GAIN_CH25, + GAIN_CH26, + GAIN_CH27, + GAIN_CH28, + GAIN_CH29, + GAIN_CH30, + GAIN_CH31, + OUTPUT_CH0, + OUTPUT_CH1, + OUTPUT_CH2, + OUTPUT_CH3, + OUTPUT_CH4, + OUTPUT_CH5, + OUTPUT_CH6, + OUTPUT_CH7, + OUTPUT_CH8, + OUTPUT_CH9, + OUTPUT_CH10, + OUTPUT_CH11, + OUTPUT_CH12, + OUTPUT_CH13, + OUTPUT_CH14, + OUTPUT_CH15, + OUTPUT_CH16, + OUTPUT_CH17, + OUTPUT_CH18, + OUTPUT_CH19, + OUTPUT_CH20, + OUTPUT_CH21, + OUTPUT_CH22, + OUTPUT_CH23, + OUTPUT_CH24, + OUTPUT_CH25, + OUTPUT_CH26, + OUTPUT_CH27, + OUTPUT_CH28, + OUTPUT_CH29, + OUTPUT_CH30, + OUTPUT_CH31, + } + + public enum DSP_TRANSCEIVER_SPEAKERMODE : int + { + AUTO = -1, + MONO = 0, + STEREO, + SURROUND, + } + + public enum DSP_TRANSCEIVER : int + { + TRANSMIT, + GAIN, + CHANNEL, + TRANSMITSPEAKERMODE + } + + public enum DSP_OBJECTPAN : int + { + _3D_POSITION, + _3D_ROLLOFF, + _3D_MIN_DISTANCE, + _3D_MAX_DISTANCE, + _3D_EXTENT_MODE, + _3D_SOUND_SIZE, + _3D_MIN_EXTENT, + OVERALL_GAIN, + OUTPUTGAIN, + ATTENUATION_RANGE, + OVERRIDE_RANGE + } +} diff --git a/modules/fmod/inc/fmod_dsp.h b/modules/fmod/inc/fmod_dsp.h new file mode 100644 index 0000000..dee54dc --- /dev/null +++ b/modules/fmod/inc/fmod_dsp.h @@ -0,0 +1,421 @@ +/* ======================================================================================== */ +/* FMOD Core API - DSP header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* Use this header if you are wanting to develop your own DSP plugin to use with FMODs */ +/* dsp system. With this header you can make your own DSP plugin that FMOD can */ +/* register and use. See the documentation and examples on how to make a working plugin. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/plugin-api-dsp.html */ +/* =========================================================================================*/ +#ifndef _FMOD_DSP_H +#define _FMOD_DSP_H + +#include "fmod_dsp_effects.h" + +typedef struct FMOD_DSP_STATE FMOD_DSP_STATE; +typedef struct FMOD_DSP_BUFFER_ARRAY FMOD_DSP_BUFFER_ARRAY; +typedef struct FMOD_COMPLEX FMOD_COMPLEX; + +/* + DSP Constants +*/ +#define FMOD_PLUGIN_SDK_VERSION 110 +#define FMOD_DSP_GETPARAM_VALUESTR_LENGTH 32 + +typedef enum +{ + FMOD_DSP_PROCESS_PERFORM, + FMOD_DSP_PROCESS_QUERY +} FMOD_DSP_PROCESS_OPERATION; + +typedef enum FMOD_DSP_PAN_SURROUND_FLAGS +{ + FMOD_DSP_PAN_SURROUND_DEFAULT = 0, + FMOD_DSP_PAN_SURROUND_ROTATION_NOT_BIASED = 1, + + FMOD_DSP_PAN_SURROUND_FLAGS_FORCEINT = 65536 +} FMOD_DSP_PAN_SURROUND_FLAGS; + +typedef enum +{ + FMOD_DSP_PARAMETER_TYPE_FLOAT, + FMOD_DSP_PARAMETER_TYPE_INT, + FMOD_DSP_PARAMETER_TYPE_BOOL, + FMOD_DSP_PARAMETER_TYPE_DATA, + + FMOD_DSP_PARAMETER_TYPE_MAX, + FMOD_DSP_PARAMETER_TYPE_FORCEINT = 65536 +} FMOD_DSP_PARAMETER_TYPE; + +typedef enum +{ + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR, + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO, + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR, + + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_FORCEINT = 65536 +} FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE; + +typedef enum +{ + FMOD_DSP_PARAMETER_DATA_TYPE_USER = 0, + FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1, + FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2, + FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3, + FMOD_DSP_PARAMETER_DATA_TYPE_FFT = -4, + FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5, + FMOD_DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE = -6, +} FMOD_DSP_PARAMETER_DATA_TYPE; + +/* + DSP Callbacks +*/ +typedef FMOD_RESULT (F_CALL *FMOD_DSP_CREATE_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_RELEASE_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_RESET_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_READ_CALLBACK) (FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int *outchannels); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PROCESS_CALLBACK) (FMOD_DSP_STATE *dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPOSITION_CALLBACK) (FMOD_DSP_STATE *dsp_state, unsigned int pos); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SHOULDIPROCESS_CALLBACK) (FMOD_DSP_STATE *dsp_state, FMOD_BOOL inputsidle, unsigned int length, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE speakermode); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_FLOAT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float value); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_INT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, int value); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_BOOL_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL value); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_DATA_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, void *data, unsigned int length); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_FLOAT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_INT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, int *value, char *valuestr); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_BOOL_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL *value, char *valuestr); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_DATA_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, void **data, unsigned int *length, char *valuestr); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_REGISTER_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK) (FMOD_DSP_STATE *dsp_state); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_MIX_CALLBACK) (FMOD_DSP_STATE *dsp_state, int stage); + +/* + DSP Functions +*/ +typedef void * (F_CALL *FMOD_DSP_ALLOC_FUNC) (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void * (F_CALL *FMOD_DSP_REALLOC_FUNC) (void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void (F_CALL *FMOD_DSP_FREE_FUNC) (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr); +typedef void (F_CALL *FMOD_DSP_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *str, ...); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETSAMPLERATE_FUNC) (FMOD_DSP_STATE *dsp_state, int *rate); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETBLOCKSIZE_FUNC) (FMOD_DSP_STATE *dsp_state, unsigned int *blocksize); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETSPEAKERMODE_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE *speakermode_mixer, FMOD_SPEAKERMODE *speakermode_output); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETCLOCK_FUNC) (FMOD_DSP_STATE *dsp_state, unsigned long long *clock, unsigned int *offset, unsigned int *length); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETLISTENERATTRIBUTES_FUNC) (FMOD_DSP_STATE *dsp_state, int *numlisteners, FMOD_3D_ATTRIBUTES *attributes); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETUSERDATA_FUNC) (FMOD_DSP_STATE *dsp_state, void **userdata); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_DFT_FFTREAL_FUNC) (FMOD_DSP_STATE *dsp_state, int size, const float *signal, FMOD_COMPLEX* dft, const float *window, int signalhop); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_DFT_IFFTREAL_FUNC) (FMOD_DSP_STATE *dsp_state, int size, const FMOD_COMPLEX *dft, float* signal, const float *window, int signalhop); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMMONOMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, float lowFrequencyGain, float overallGain, float *matrix); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, float pan, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix, FMOD_DSP_PAN_SURROUND_FLAGS flags); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix); +typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_DSP_PAN_3D_ROLLOFF_TYPE rolloff, float distance, float mindistance, float maxdistance, float *gain); + +/* + DSP Structures +*/ +struct FMOD_DSP_BUFFER_ARRAY +{ + int numbuffers; + int *buffernumchannels; + FMOD_CHANNELMASK *bufferchannelmask; + float **buffers; + FMOD_SPEAKERMODE speakermode; +}; + +struct FMOD_COMPLEX +{ + float real; + float imag; +}; + +typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR +{ + int numpoints; + float *pointparamvalues; + float *pointpositions; +} FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR; + +typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING +{ + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE type; + FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR piecewiselinearmapping; +} FMOD_DSP_PARAMETER_FLOAT_MAPPING; + +typedef struct FMOD_DSP_PARAMETER_DESC_FLOAT +{ + float min; + float max; + float defaultval; + FMOD_DSP_PARAMETER_FLOAT_MAPPING mapping; +} FMOD_DSP_PARAMETER_DESC_FLOAT; + +typedef struct FMOD_DSP_PARAMETER_DESC_INT +{ + int min; + int max; + int defaultval; + FMOD_BOOL goestoinf; + const char* const* valuenames; +} FMOD_DSP_PARAMETER_DESC_INT; + +typedef struct FMOD_DSP_PARAMETER_DESC_BOOL +{ + FMOD_BOOL defaultval; + const char* const* valuenames; +} FMOD_DSP_PARAMETER_DESC_BOOL; + +typedef struct FMOD_DSP_PARAMETER_DESC_DATA +{ + int datatype; +} FMOD_DSP_PARAMETER_DESC_DATA; + +typedef struct FMOD_DSP_PARAMETER_DESC +{ + FMOD_DSP_PARAMETER_TYPE type; + char name[16]; + char label[16]; + const char *description; + + union + { + FMOD_DSP_PARAMETER_DESC_FLOAT floatdesc; + FMOD_DSP_PARAMETER_DESC_INT intdesc; + FMOD_DSP_PARAMETER_DESC_BOOL booldesc; + FMOD_DSP_PARAMETER_DESC_DATA datadesc; + }; +} FMOD_DSP_PARAMETER_DESC; + +typedef struct FMOD_DSP_PARAMETER_OVERALLGAIN +{ + float linear_gain; + float linear_gain_additive; +} FMOD_DSP_PARAMETER_OVERALLGAIN; + +typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES +{ + FMOD_3D_ATTRIBUTES relative; + FMOD_3D_ATTRIBUTES absolute; +} FMOD_DSP_PARAMETER_3DATTRIBUTES; + +typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI +{ + int numlisteners; + FMOD_3D_ATTRIBUTES relative[FMOD_MAX_LISTENERS]; + float weight[FMOD_MAX_LISTENERS]; + FMOD_3D_ATTRIBUTES absolute; +} FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI; + +typedef struct FMOD_DSP_PARAMETER_ATTENUATION_RANGE +{ + float min; + float max; +} FMOD_DSP_PARAMETER_ATTENUATION_RANGE; + +typedef struct FMOD_DSP_PARAMETER_SIDECHAIN +{ + FMOD_BOOL sidechainenable; +} FMOD_DSP_PARAMETER_SIDECHAIN; + +typedef struct FMOD_DSP_PARAMETER_FFT +{ + int length; + int numchannels; + float *spectrum[32]; +} FMOD_DSP_PARAMETER_FFT; + +typedef struct FMOD_DSP_DESCRIPTION +{ + unsigned int pluginsdkversion; + char name[32]; + unsigned int version; + int numinputbuffers; + int numoutputbuffers; + FMOD_DSP_CREATE_CALLBACK create; + FMOD_DSP_RELEASE_CALLBACK release; + FMOD_DSP_RESET_CALLBACK reset; + FMOD_DSP_READ_CALLBACK read; + FMOD_DSP_PROCESS_CALLBACK process; + FMOD_DSP_SETPOSITION_CALLBACK setposition; + + int numparameters; + FMOD_DSP_PARAMETER_DESC **paramdesc; + FMOD_DSP_SETPARAM_FLOAT_CALLBACK setparameterfloat; + FMOD_DSP_SETPARAM_INT_CALLBACK setparameterint; + FMOD_DSP_SETPARAM_BOOL_CALLBACK setparameterbool; + FMOD_DSP_SETPARAM_DATA_CALLBACK setparameterdata; + FMOD_DSP_GETPARAM_FLOAT_CALLBACK getparameterfloat; + FMOD_DSP_GETPARAM_INT_CALLBACK getparameterint; + FMOD_DSP_GETPARAM_BOOL_CALLBACK getparameterbool; + FMOD_DSP_GETPARAM_DATA_CALLBACK getparameterdata; + FMOD_DSP_SHOULDIPROCESS_CALLBACK shouldiprocess; + void *userdata; + + FMOD_DSP_SYSTEM_REGISTER_CALLBACK sys_register; + FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK sys_deregister; + FMOD_DSP_SYSTEM_MIX_CALLBACK sys_mix; + +} FMOD_DSP_DESCRIPTION; + +typedef struct FMOD_DSP_STATE_DFT_FUNCTIONS +{ + FMOD_DSP_DFT_FFTREAL_FUNC fftreal; + FMOD_DSP_DFT_IFFTREAL_FUNC inversefftreal; +} FMOD_DSP_STATE_DFT_FUNCTIONS; + +typedef struct FMOD_DSP_STATE_PAN_FUNCTIONS +{ + FMOD_DSP_PAN_SUMMONOMATRIX_FUNC summonomatrix; + FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC sumstereomatrix; + FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC sumsurroundmatrix; + FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC summonotosurroundmatrix; + FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC sumstereotosurroundmatrix; + FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC getrolloffgain; +} FMOD_DSP_STATE_PAN_FUNCTIONS; + +typedef struct FMOD_DSP_STATE_FUNCTIONS +{ + FMOD_DSP_ALLOC_FUNC alloc; + FMOD_DSP_REALLOC_FUNC realloc; + FMOD_DSP_FREE_FUNC free; + FMOD_DSP_GETSAMPLERATE_FUNC getsamplerate; + FMOD_DSP_GETBLOCKSIZE_FUNC getblocksize; + FMOD_DSP_STATE_DFT_FUNCTIONS *dft; + FMOD_DSP_STATE_PAN_FUNCTIONS *pan; + FMOD_DSP_GETSPEAKERMODE_FUNC getspeakermode; + FMOD_DSP_GETCLOCK_FUNC getclock; + FMOD_DSP_GETLISTENERATTRIBUTES_FUNC getlistenerattributes; + FMOD_DSP_LOG_FUNC log; + FMOD_DSP_GETUSERDATA_FUNC getuserdata; +} FMOD_DSP_STATE_FUNCTIONS; + +struct FMOD_DSP_STATE +{ + void *instance; + void *plugindata; + FMOD_CHANNELMASK channelmask; + FMOD_SPEAKERMODE source_speakermode; + float *sidechaindata; + int sidechainchannels; + FMOD_DSP_STATE_FUNCTIONS *functions; + int systemobject; +}; + +typedef struct FMOD_DSP_METERING_INFO +{ + int numsamples; + float peaklevel[32]; + float rmslevel[32]; + short numchannels; +} FMOD_DSP_METERING_INFO; + +/* + DSP Macros +*/ +#define FMOD_DSP_INIT_PARAMDESC_FLOAT(_paramstruct, _name, _label, _description, _min, _max, _defaultval) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_FLOAT; \ + strncpy((_paramstruct).name, _name, 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).floatdesc.min = _min; \ + (_paramstruct).floatdesc.max = _max; \ + (_paramstruct).floatdesc.defaultval = _defaultval; \ + (_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO; + +#define FMOD_DSP_INIT_PARAMDESC_FLOAT_WITH_MAPPING(_paramstruct, _name, _label, _description, _defaultval, _values, _positions); \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_FLOAT; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).floatdesc.min = _values[0]; \ + (_paramstruct).floatdesc.max = _values[sizeof(_values) / sizeof(float) - 1]; \ + (_paramstruct).floatdesc.defaultval = _defaultval; \ + (_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR; \ + (_paramstruct).floatdesc.mapping.piecewiselinearmapping.numpoints = sizeof(_values) / sizeof(float); \ + (_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointparamvalues = _values; \ + (_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointpositions = _positions; + +#define FMOD_DSP_INIT_PARAMDESC_INT(_paramstruct, _name, _label, _description, _min, _max, _defaultval, _goestoinf, _valuenames) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_INT; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).intdesc.min = _min; \ + (_paramstruct).intdesc.max = _max; \ + (_paramstruct).intdesc.defaultval = _defaultval; \ + (_paramstruct).intdesc.goestoinf = _goestoinf; \ + (_paramstruct).intdesc.valuenames = _valuenames; + +#define FMOD_DSP_INIT_PARAMDESC_INT_ENUMERATED(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_INT; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).intdesc.min = 0; \ + (_paramstruct).intdesc.max = sizeof(_valuenames) / sizeof(char*) - 1; \ + (_paramstruct).intdesc.defaultval = _defaultval; \ + (_paramstruct).intdesc.goestoinf = false; \ + (_paramstruct).intdesc.valuenames = _valuenames; + +#define FMOD_DSP_INIT_PARAMDESC_BOOL(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_BOOL; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).booldesc.defaultval = _defaultval; \ + (_paramstruct).booldesc.valuenames = _valuenames; + +#define FMOD_DSP_INIT_PARAMDESC_DATA(_paramstruct, _name, _label, _description, _datatype) \ + memset(&(_paramstruct), 0, sizeof(_paramstruct)); \ + (_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_DATA; \ + strncpy((_paramstruct).name, _name , 15); \ + strncpy((_paramstruct).label, _label, 15); \ + (_paramstruct).description = _description; \ + (_paramstruct).datadesc.datatype = _datatype; + +#define FMOD_DSP_ALLOC(_state, _size) \ + (_state)->functions->alloc(_size, FMOD_MEMORY_NORMAL, __FILE__) +#define FMOD_DSP_REALLOC(_state, _ptr, _size) \ + (_state)->functions->realloc(_ptr, _size, FMOD_MEMORY_NORMAL, __FILE__) +#define FMOD_DSP_FREE(_state, _ptr) \ + (_state)->functions->free(_ptr, FMOD_MEMORY_NORMAL, __FILE__) +#define FMOD_DSP_LOG(_state, _level, _location, _format, ...) \ + (_state)->functions->log(_level, __FILE__, __LINE__, _location, _format, __VA_ARGS__) +#define FMOD_DSP_GETSAMPLERATE(_state, _rate) \ + (_state)->functions->getsamplerate(_state, _rate) +#define FMOD_DSP_GETBLOCKSIZE(_state, _blocksize) \ + (_state)->functions->getblocksize(_state, _blocksize) +#define FMOD_DSP_GETSPEAKERMODE(_state, _speakermodemix, _speakermodeout) \ + (_state)->functions->getspeakermode(_state, _speakermodemix, _speakermodeout) +#define FMOD_DSP_GETCLOCK(_state, _clock, _offset, _length) \ + (_state)->functions->getclock(_state, _clock, _offset, _length) +#define FMOD_DSP_GETLISTENERATTRIBUTES(_state, _numlisteners, _attributes) \ + (_state)->functions->getlistenerattributes(_state, _numlisteners, _attributes) +#define FMOD_DSP_GETUSERDATA(_state, _userdata) \ + (_state)->functions->getuserdata(_state, _userdata) +#define FMOD_DSP_DFT_FFTREAL(_state, _size, _signal, _dft, _window, _signalhop) \ + (_state)->functions->dft->fftreal(_state, _size, _signal, _dft, _window, _signalhop) +#define FMOD_DSP_DFT_IFFTREAL(_state, _size, _dft, _signal, _window, _signalhop) \ + (_state)->functions->dft->inversefftreal(_state, _size, _dft, _signal, _window, _signalhop) +#define FMOD_DSP_PAN_SUMMONOMATRIX(_state, _sourcespeakermode, _lowfrequencygain, _overallgain, _matrix) \ + (_state)->functions->pan->summonomatrix(_state, _sourcespeakermode, _lowfrequencygain, _overallgain, _matrix) +#define FMOD_DSP_PAN_SUMSTEREOMATRIX(_state, _sourcespeakermode, _pan, _lowfrequencygain, _overallgain, _matrixhop, _matrix) \ + (_state)->functions->pan->sumstereomatrix(_state, _sourcespeakermode, _pan, _lowfrequencygain, _overallgain, _matrixhop, _matrix) +#define FMOD_DSP_PAN_SUMSURROUNDMATRIX(_state, _sourcespeakermode, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, _matrixhop, _matrix, _flags) \ + (_state)->functions->pan->sumsurroundmatrix(_state, _sourcespeakermode, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, _matrixhop, _matrix, _flags) +#define FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX(_state, _targetspeakermode, _direction, _extent, _lowfrequencygain, _overallgain, _matrixhop, _matrix) \ + (_state)->functions->pan->summonotosurroundmatrix(_state, _targetspeakermode, _direction, _extent, _lowfrequencygain, _overallgain, _matrixhop, _matrix) +#define FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX(_state, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, matrixhop, _matrix) \ + (_state)->functions->pan->sumstereotosurroundmatrix(_state, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, matrixhop, _matrix) +#define FMOD_DSP_PAN_GETROLLOFFGAIN(_state, _rolloff, _distance, _mindistance, _maxdistance, _gain) \ + (_state)->functions->pan->getrolloffgain(_state, _rolloff, _distance, _mindistance, _maxdistance, _gain) + +#endif + diff --git a/modules/fmod/inc/fmod_dsp_effects.h b/modules/fmod/inc/fmod_dsp_effects.h new file mode 100644 index 0000000..bf2c2b4 --- /dev/null +++ b/modules/fmod/inc/fmod_dsp_effects.h @@ -0,0 +1,577 @@ +/* ============================================================================================================= */ +/* FMOD Core API - Built-in effects header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* In this header you can find parameter structures for FMOD system registered DSP effects */ +/* and generators. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/core-api-common-dsp-effects.html#fmod_dsp_type */ +/* ============================================================================================================= */ + +#ifndef _FMOD_DSP_EFFECTS_H +#define _FMOD_DSP_EFFECTS_H + +typedef enum +{ + FMOD_DSP_TYPE_UNKNOWN, + FMOD_DSP_TYPE_MIXER, + FMOD_DSP_TYPE_OSCILLATOR, + FMOD_DSP_TYPE_LOWPASS, + FMOD_DSP_TYPE_ITLOWPASS, + FMOD_DSP_TYPE_HIGHPASS, + FMOD_DSP_TYPE_ECHO, + FMOD_DSP_TYPE_FADER, + FMOD_DSP_TYPE_FLANGE, + FMOD_DSP_TYPE_DISTORTION, + FMOD_DSP_TYPE_NORMALIZE, + FMOD_DSP_TYPE_LIMITER, + FMOD_DSP_TYPE_PARAMEQ, + FMOD_DSP_TYPE_PITCHSHIFT, + FMOD_DSP_TYPE_CHORUS, + FMOD_DSP_TYPE_VSTPLUGIN, + FMOD_DSP_TYPE_WINAMPPLUGIN, + FMOD_DSP_TYPE_ITECHO, + FMOD_DSP_TYPE_COMPRESSOR, + FMOD_DSP_TYPE_SFXREVERB, + FMOD_DSP_TYPE_LOWPASS_SIMPLE, + FMOD_DSP_TYPE_DELAY, + FMOD_DSP_TYPE_TREMOLO, + FMOD_DSP_TYPE_LADSPAPLUGIN, + FMOD_DSP_TYPE_SEND, + FMOD_DSP_TYPE_RETURN, + FMOD_DSP_TYPE_HIGHPASS_SIMPLE, + FMOD_DSP_TYPE_PAN, + FMOD_DSP_TYPE_THREE_EQ, + FMOD_DSP_TYPE_FFT, + FMOD_DSP_TYPE_LOUDNESS_METER, + FMOD_DSP_TYPE_ENVELOPEFOLLOWER, + FMOD_DSP_TYPE_CONVOLUTIONREVERB, + FMOD_DSP_TYPE_CHANNELMIX, + FMOD_DSP_TYPE_TRANSCEIVER, + FMOD_DSP_TYPE_OBJECTPAN, + FMOD_DSP_TYPE_MULTIBAND_EQ, + + FMOD_DSP_TYPE_MAX, + FMOD_DSP_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_DSP_TYPE; + +/* + =================================================================================================== + + FMOD built in effect parameters. + Use DSP::setParameter with these enums for the 'index' parameter. + + =================================================================================================== +*/ + +typedef enum +{ + FMOD_DSP_OSCILLATOR_TYPE, + FMOD_DSP_OSCILLATOR_RATE +} FMOD_DSP_OSCILLATOR; + + +typedef enum +{ + FMOD_DSP_LOWPASS_CUTOFF, + FMOD_DSP_LOWPASS_RESONANCE +} FMOD_DSP_LOWPASS; + + +typedef enum +{ + FMOD_DSP_ITLOWPASS_CUTOFF, + FMOD_DSP_ITLOWPASS_RESONANCE +} FMOD_DSP_ITLOWPASS; + + +typedef enum +{ + FMOD_DSP_HIGHPASS_CUTOFF, + FMOD_DSP_HIGHPASS_RESONANCE +} FMOD_DSP_HIGHPASS; + + +typedef enum +{ + FMOD_DSP_ECHO_DELAY, + FMOD_DSP_ECHO_FEEDBACK, + FMOD_DSP_ECHO_DRYLEVEL, + FMOD_DSP_ECHO_WETLEVEL +} FMOD_DSP_ECHO; + + +typedef enum FMOD_DSP_FADER +{ + FMOD_DSP_FADER_GAIN, + FMOD_DSP_FADER_OVERALL_GAIN, +} FMOD_DSP_FADER; + + +typedef enum +{ + FMOD_DSP_FLANGE_MIX, + FMOD_DSP_FLANGE_DEPTH, + FMOD_DSP_FLANGE_RATE +} FMOD_DSP_FLANGE; + + +typedef enum +{ + FMOD_DSP_DISTORTION_LEVEL +} FMOD_DSP_DISTORTION; + + +typedef enum +{ + FMOD_DSP_NORMALIZE_FADETIME, + FMOD_DSP_NORMALIZE_THRESHOLD, + FMOD_DSP_NORMALIZE_MAXAMP +} FMOD_DSP_NORMALIZE; + + +typedef enum +{ + FMOD_DSP_LIMITER_RELEASETIME, + FMOD_DSP_LIMITER_CEILING, + FMOD_DSP_LIMITER_MAXIMIZERGAIN, + FMOD_DSP_LIMITER_MODE, +} FMOD_DSP_LIMITER; + + +typedef enum +{ + FMOD_DSP_PARAMEQ_CENTER, + FMOD_DSP_PARAMEQ_BANDWIDTH, + FMOD_DSP_PARAMEQ_GAIN +} FMOD_DSP_PARAMEQ; + + +typedef enum FMOD_DSP_MULTIBAND_EQ +{ + FMOD_DSP_MULTIBAND_EQ_A_FILTER, + FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, + FMOD_DSP_MULTIBAND_EQ_A_Q, + FMOD_DSP_MULTIBAND_EQ_A_GAIN, + FMOD_DSP_MULTIBAND_EQ_B_FILTER, + FMOD_DSP_MULTIBAND_EQ_B_FREQUENCY, + FMOD_DSP_MULTIBAND_EQ_B_Q, + FMOD_DSP_MULTIBAND_EQ_B_GAIN, + FMOD_DSP_MULTIBAND_EQ_C_FILTER, + FMOD_DSP_MULTIBAND_EQ_C_FREQUENCY, + FMOD_DSP_MULTIBAND_EQ_C_Q, + FMOD_DSP_MULTIBAND_EQ_C_GAIN, + FMOD_DSP_MULTIBAND_EQ_D_FILTER, + FMOD_DSP_MULTIBAND_EQ_D_FREQUENCY, + FMOD_DSP_MULTIBAND_EQ_D_Q, + FMOD_DSP_MULTIBAND_EQ_D_GAIN, + FMOD_DSP_MULTIBAND_EQ_E_FILTER, + FMOD_DSP_MULTIBAND_EQ_E_FREQUENCY, + FMOD_DSP_MULTIBAND_EQ_E_Q, + FMOD_DSP_MULTIBAND_EQ_E_GAIN, +} FMOD_DSP_MULTIBAND_EQ; + + +typedef enum FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE +{ + FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED, + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_48DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_24DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_48DB, + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWSHELF, + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHSHELF, + FMOD_DSP_MULTIBAND_EQ_FILTER_PEAKING, + FMOD_DSP_MULTIBAND_EQ_FILTER_BANDPASS, + FMOD_DSP_MULTIBAND_EQ_FILTER_NOTCH, + FMOD_DSP_MULTIBAND_EQ_FILTER_ALLPASS, +} FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE; + + +typedef enum +{ + FMOD_DSP_PITCHSHIFT_PITCH, + FMOD_DSP_PITCHSHIFT_FFTSIZE, + FMOD_DSP_PITCHSHIFT_OVERLAP, + FMOD_DSP_PITCHSHIFT_MAXCHANNELS +} FMOD_DSP_PITCHSHIFT; + + +typedef enum +{ + FMOD_DSP_CHORUS_MIX, + FMOD_DSP_CHORUS_RATE, + FMOD_DSP_CHORUS_DEPTH, +} FMOD_DSP_CHORUS; + + +typedef enum +{ + FMOD_DSP_ITECHO_WETDRYMIX, + FMOD_DSP_ITECHO_FEEDBACK, + FMOD_DSP_ITECHO_LEFTDELAY, + FMOD_DSP_ITECHO_RIGHTDELAY, + FMOD_DSP_ITECHO_PANDELAY +} FMOD_DSP_ITECHO; + +typedef enum +{ + FMOD_DSP_COMPRESSOR_THRESHOLD, + FMOD_DSP_COMPRESSOR_RATIO, + FMOD_DSP_COMPRESSOR_ATTACK, + FMOD_DSP_COMPRESSOR_RELEASE, + FMOD_DSP_COMPRESSOR_GAINMAKEUP, + FMOD_DSP_COMPRESSOR_USESIDECHAIN, + FMOD_DSP_COMPRESSOR_LINKED +} FMOD_DSP_COMPRESSOR; + +typedef enum +{ + FMOD_DSP_SFXREVERB_DECAYTIME, + FMOD_DSP_SFXREVERB_EARLYDELAY, + FMOD_DSP_SFXREVERB_LATEDELAY, + FMOD_DSP_SFXREVERB_HFREFERENCE, + FMOD_DSP_SFXREVERB_HFDECAYRATIO, + FMOD_DSP_SFXREVERB_DIFFUSION, + FMOD_DSP_SFXREVERB_DENSITY, + FMOD_DSP_SFXREVERB_LOWSHELFFREQUENCY, + FMOD_DSP_SFXREVERB_LOWSHELFGAIN, + FMOD_DSP_SFXREVERB_HIGHCUT, + FMOD_DSP_SFXREVERB_EARLYLATEMIX, + FMOD_DSP_SFXREVERB_WETLEVEL, + FMOD_DSP_SFXREVERB_DRYLEVEL +} FMOD_DSP_SFXREVERB; + +typedef enum +{ + FMOD_DSP_LOWPASS_SIMPLE_CUTOFF +} FMOD_DSP_LOWPASS_SIMPLE; + + +typedef enum +{ + FMOD_DSP_DELAY_CH0, + FMOD_DSP_DELAY_CH1, + FMOD_DSP_DELAY_CH2, + FMOD_DSP_DELAY_CH3, + FMOD_DSP_DELAY_CH4, + FMOD_DSP_DELAY_CH5, + FMOD_DSP_DELAY_CH6, + FMOD_DSP_DELAY_CH7, + FMOD_DSP_DELAY_CH8, + FMOD_DSP_DELAY_CH9, + FMOD_DSP_DELAY_CH10, + FMOD_DSP_DELAY_CH11, + FMOD_DSP_DELAY_CH12, + FMOD_DSP_DELAY_CH13, + FMOD_DSP_DELAY_CH14, + FMOD_DSP_DELAY_CH15, + FMOD_DSP_DELAY_MAXDELAY +} FMOD_DSP_DELAY; + + +typedef enum +{ + FMOD_DSP_TREMOLO_FREQUENCY, + FMOD_DSP_TREMOLO_DEPTH, + FMOD_DSP_TREMOLO_SHAPE, + FMOD_DSP_TREMOLO_SKEW, + FMOD_DSP_TREMOLO_DUTY, + FMOD_DSP_TREMOLO_SQUARE, + FMOD_DSP_TREMOLO_PHASE, + FMOD_DSP_TREMOLO_SPREAD +} FMOD_DSP_TREMOLO; + + +typedef enum +{ + FMOD_DSP_SEND_RETURNID, + FMOD_DSP_SEND_LEVEL, +} FMOD_DSP_SEND; + + +typedef enum +{ + FMOD_DSP_RETURN_ID, + FMOD_DSP_RETURN_INPUT_SPEAKER_MODE +} FMOD_DSP_RETURN; + + +typedef enum +{ + FMOD_DSP_HIGHPASS_SIMPLE_CUTOFF +} FMOD_DSP_HIGHPASS_SIMPLE; + + +typedef enum +{ + FMOD_DSP_PAN_2D_STEREO_MODE_DISTRIBUTED, + FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE +} FMOD_DSP_PAN_2D_STEREO_MODE_TYPE; + + +typedef enum +{ + FMOD_DSP_PAN_MODE_MONO, + FMOD_DSP_PAN_MODE_STEREO, + FMOD_DSP_PAN_MODE_SURROUND +} FMOD_DSP_PAN_MODE_TYPE; + + +typedef enum +{ + FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED, + FMOD_DSP_PAN_3D_ROLLOFF_LINEAR, + FMOD_DSP_PAN_3D_ROLLOFF_INVERSE, + FMOD_DSP_PAN_3D_ROLLOFF_INVERSETAPERED, + FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM +} FMOD_DSP_PAN_3D_ROLLOFF_TYPE; + + +typedef enum +{ + FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO, + FMOD_DSP_PAN_3D_EXTENT_MODE_USER, + FMOD_DSP_PAN_3D_EXTENT_MODE_OFF +} FMOD_DSP_PAN_3D_EXTENT_MODE_TYPE; + + +typedef enum +{ + FMOD_DSP_PAN_MODE, + FMOD_DSP_PAN_2D_STEREO_POSITION, + FMOD_DSP_PAN_2D_DIRECTION, + FMOD_DSP_PAN_2D_EXTENT, + FMOD_DSP_PAN_2D_ROTATION, + FMOD_DSP_PAN_2D_LFE_LEVEL, + FMOD_DSP_PAN_2D_STEREO_MODE, + FMOD_DSP_PAN_2D_STEREO_SEPARATION, + FMOD_DSP_PAN_2D_STEREO_AXIS, + FMOD_DSP_PAN_ENABLED_SPEAKERS, + FMOD_DSP_PAN_3D_POSITION, + FMOD_DSP_PAN_3D_ROLLOFF, + FMOD_DSP_PAN_3D_MIN_DISTANCE, + FMOD_DSP_PAN_3D_MAX_DISTANCE, + FMOD_DSP_PAN_3D_EXTENT_MODE, + FMOD_DSP_PAN_3D_SOUND_SIZE, + FMOD_DSP_PAN_3D_MIN_EXTENT, + FMOD_DSP_PAN_3D_PAN_BLEND, + FMOD_DSP_PAN_LFE_UPMIX_ENABLED, + FMOD_DSP_PAN_OVERALL_GAIN, + FMOD_DSP_PAN_SURROUND_SPEAKER_MODE, + FMOD_DSP_PAN_2D_HEIGHT_BLEND, + FMOD_DSP_PAN_ATTENUATION_RANGE, + FMOD_DSP_PAN_OVERRIDE_RANGE +} FMOD_DSP_PAN; + + +typedef enum +{ + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_12DB, + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_24DB, + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_48DB +} FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE; + + +typedef enum +{ + FMOD_DSP_THREE_EQ_LOWGAIN, + FMOD_DSP_THREE_EQ_MIDGAIN, + FMOD_DSP_THREE_EQ_HIGHGAIN, + FMOD_DSP_THREE_EQ_LOWCROSSOVER, + FMOD_DSP_THREE_EQ_HIGHCROSSOVER, + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE +} FMOD_DSP_THREE_EQ; + + +typedef enum +{ + FMOD_DSP_FFT_WINDOW_RECT, + FMOD_DSP_FFT_WINDOW_TRIANGLE, + FMOD_DSP_FFT_WINDOW_HAMMING, + FMOD_DSP_FFT_WINDOW_HANNING, + FMOD_DSP_FFT_WINDOW_BLACKMAN, + FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS +} FMOD_DSP_FFT_WINDOW; + + +typedef enum +{ + FMOD_DSP_FFT_WINDOWSIZE, + FMOD_DSP_FFT_WINDOWTYPE, + FMOD_DSP_FFT_SPECTRUMDATA, + FMOD_DSP_FFT_DOMINANT_FREQ +} FMOD_DSP_FFT; + +#define FMOD_DSP_LOUDNESS_METER_HISTOGRAM_SAMPLES 66 + +typedef enum +{ + FMOD_DSP_LOUDNESS_METER_STATE, + FMOD_DSP_LOUDNESS_METER_WEIGHTING, + FMOD_DSP_LOUDNESS_METER_INFO +} FMOD_DSP_LOUDNESS_METER; + + +typedef enum +{ + FMOD_DSP_LOUDNESS_METER_STATE_RESET_INTEGRATED = -3, + FMOD_DSP_LOUDNESS_METER_STATE_RESET_MAXPEAK = -2, + FMOD_DSP_LOUDNESS_METER_STATE_RESET_ALL = -1, + FMOD_DSP_LOUDNESS_METER_STATE_PAUSED = 0, + FMOD_DSP_LOUDNESS_METER_STATE_ANALYZING = 1 +} FMOD_DSP_LOUDNESS_METER_STATE_TYPE; + +typedef struct FMOD_DSP_LOUDNESS_METER_INFO_TYPE +{ + float momentaryloudness; + float shorttermloudness; + float integratedloudness; + float loudness10thpercentile; + float loudness95thpercentile; + float loudnesshistogram[FMOD_DSP_LOUDNESS_METER_HISTOGRAM_SAMPLES]; + float maxtruepeak; + float maxmomentaryloudness; +} FMOD_DSP_LOUDNESS_METER_INFO_TYPE; + +typedef struct FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE +{ + float channelweight[32]; +} FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE; + + +typedef enum +{ + FMOD_DSP_ENVELOPEFOLLOWER_ATTACK, + FMOD_DSP_ENVELOPEFOLLOWER_RELEASE, + FMOD_DSP_ENVELOPEFOLLOWER_ENVELOPE, + FMOD_DSP_ENVELOPEFOLLOWER_USESIDECHAIN +} FMOD_DSP_ENVELOPEFOLLOWER; + +typedef enum +{ + FMOD_DSP_CONVOLUTION_REVERB_PARAM_IR, + FMOD_DSP_CONVOLUTION_REVERB_PARAM_WET, + FMOD_DSP_CONVOLUTION_REVERB_PARAM_DRY, + FMOD_DSP_CONVOLUTION_REVERB_PARAM_LINKED +} FMOD_DSP_CONVOLUTION_REVERB; + +typedef enum +{ + FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT, + FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO, + FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO, + FMOD_DSP_CHANNELMIX_OUTPUT_ALLQUAD, + FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1, + FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1, + FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE, + FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1POINT4 +} FMOD_DSP_CHANNELMIX_OUTPUT; + +typedef enum +{ + FMOD_DSP_CHANNELMIX_OUTPUTGROUPING, + FMOD_DSP_CHANNELMIX_GAIN_CH0, + FMOD_DSP_CHANNELMIX_GAIN_CH1, + FMOD_DSP_CHANNELMIX_GAIN_CH2, + FMOD_DSP_CHANNELMIX_GAIN_CH3, + FMOD_DSP_CHANNELMIX_GAIN_CH4, + FMOD_DSP_CHANNELMIX_GAIN_CH5, + FMOD_DSP_CHANNELMIX_GAIN_CH6, + FMOD_DSP_CHANNELMIX_GAIN_CH7, + FMOD_DSP_CHANNELMIX_GAIN_CH8, + FMOD_DSP_CHANNELMIX_GAIN_CH9, + FMOD_DSP_CHANNELMIX_GAIN_CH10, + FMOD_DSP_CHANNELMIX_GAIN_CH11, + FMOD_DSP_CHANNELMIX_GAIN_CH12, + FMOD_DSP_CHANNELMIX_GAIN_CH13, + FMOD_DSP_CHANNELMIX_GAIN_CH14, + FMOD_DSP_CHANNELMIX_GAIN_CH15, + FMOD_DSP_CHANNELMIX_GAIN_CH16, + FMOD_DSP_CHANNELMIX_GAIN_CH17, + FMOD_DSP_CHANNELMIX_GAIN_CH18, + FMOD_DSP_CHANNELMIX_GAIN_CH19, + FMOD_DSP_CHANNELMIX_GAIN_CH20, + FMOD_DSP_CHANNELMIX_GAIN_CH21, + FMOD_DSP_CHANNELMIX_GAIN_CH22, + FMOD_DSP_CHANNELMIX_GAIN_CH23, + FMOD_DSP_CHANNELMIX_GAIN_CH24, + FMOD_DSP_CHANNELMIX_GAIN_CH25, + FMOD_DSP_CHANNELMIX_GAIN_CH26, + FMOD_DSP_CHANNELMIX_GAIN_CH27, + FMOD_DSP_CHANNELMIX_GAIN_CH28, + FMOD_DSP_CHANNELMIX_GAIN_CH29, + FMOD_DSP_CHANNELMIX_GAIN_CH30, + FMOD_DSP_CHANNELMIX_GAIN_CH31, + FMOD_DSP_CHANNELMIX_OUTPUT_CH0, + FMOD_DSP_CHANNELMIX_OUTPUT_CH1, + FMOD_DSP_CHANNELMIX_OUTPUT_CH2, + FMOD_DSP_CHANNELMIX_OUTPUT_CH3, + FMOD_DSP_CHANNELMIX_OUTPUT_CH4, + FMOD_DSP_CHANNELMIX_OUTPUT_CH5, + FMOD_DSP_CHANNELMIX_OUTPUT_CH6, + FMOD_DSP_CHANNELMIX_OUTPUT_CH7, + FMOD_DSP_CHANNELMIX_OUTPUT_CH8, + FMOD_DSP_CHANNELMIX_OUTPUT_CH9, + FMOD_DSP_CHANNELMIX_OUTPUT_CH10, + FMOD_DSP_CHANNELMIX_OUTPUT_CH11, + FMOD_DSP_CHANNELMIX_OUTPUT_CH12, + FMOD_DSP_CHANNELMIX_OUTPUT_CH13, + FMOD_DSP_CHANNELMIX_OUTPUT_CH14, + FMOD_DSP_CHANNELMIX_OUTPUT_CH15, + FMOD_DSP_CHANNELMIX_OUTPUT_CH16, + FMOD_DSP_CHANNELMIX_OUTPUT_CH17, + FMOD_DSP_CHANNELMIX_OUTPUT_CH18, + FMOD_DSP_CHANNELMIX_OUTPUT_CH19, + FMOD_DSP_CHANNELMIX_OUTPUT_CH20, + FMOD_DSP_CHANNELMIX_OUTPUT_CH21, + FMOD_DSP_CHANNELMIX_OUTPUT_CH22, + FMOD_DSP_CHANNELMIX_OUTPUT_CH23, + FMOD_DSP_CHANNELMIX_OUTPUT_CH24, + FMOD_DSP_CHANNELMIX_OUTPUT_CH25, + FMOD_DSP_CHANNELMIX_OUTPUT_CH26, + FMOD_DSP_CHANNELMIX_OUTPUT_CH27, + FMOD_DSP_CHANNELMIX_OUTPUT_CH28, + FMOD_DSP_CHANNELMIX_OUTPUT_CH29, + FMOD_DSP_CHANNELMIX_OUTPUT_CH30, + FMOD_DSP_CHANNELMIX_OUTPUT_CH31 +} FMOD_DSP_CHANNELMIX; + +typedef enum +{ + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_AUTO = -1, + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO = 0, + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO, + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND, +} FMOD_DSP_TRANSCEIVER_SPEAKERMODE; + + +typedef enum +{ + FMOD_DSP_TRANSCEIVER_TRANSMIT, + FMOD_DSP_TRANSCEIVER_GAIN, + FMOD_DSP_TRANSCEIVER_CHANNEL, + FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE +} FMOD_DSP_TRANSCEIVER; + + +typedef enum +{ + FMOD_DSP_OBJECTPAN_3D_POSITION, + FMOD_DSP_OBJECTPAN_3D_ROLLOFF, + FMOD_DSP_OBJECTPAN_3D_MIN_DISTANCE, + FMOD_DSP_OBJECTPAN_3D_MAX_DISTANCE, + FMOD_DSP_OBJECTPAN_3D_EXTENT_MODE, + FMOD_DSP_OBJECTPAN_3D_SOUND_SIZE, + FMOD_DSP_OBJECTPAN_3D_MIN_EXTENT, + FMOD_DSP_OBJECTPAN_OVERALL_GAIN, + FMOD_DSP_OBJECTPAN_OUTPUTGAIN, + FMOD_DSP_OBJECTPAN_ATTENUATION_RANGE, + FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE +} FMOD_DSP_OBJECTPAN; + +#endif + diff --git a/modules/fmod/inc/fmod_errors.cs b/modules/fmod/inc/fmod_errors.cs new file mode 100644 index 0000000..a869bcb --- /dev/null +++ b/modules/fmod/inc/fmod_errors.cs @@ -0,0 +1,106 @@ +/* ============================================================================================== */ +/* FMOD Core / Studio API - Error string header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* Use this header if you want to store or display a string version / english explanation */ +/* of the FMOD error codes. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/core-api-common.html#fmod_result */ +/* =============================================================================================== */ + +namespace FMOD +{ + public class Error + { + public static string String(FMOD.RESULT errcode) + { + switch (errcode) + { + case FMOD.RESULT.OK: return "No errors."; + case FMOD.RESULT.ERR_BADCOMMAND: return "Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound)."; + case FMOD.RESULT.ERR_CHANNEL_ALLOC: return "Error trying to allocate a channel."; + case FMOD.RESULT.ERR_CHANNEL_STOLEN: return "The specified channel has been reused to play another sound."; + case FMOD.RESULT.ERR_DMA: return "DMA Failure. See debug output for more information."; + case FMOD.RESULT.ERR_DSP_CONNECTION: return "DSP connection error. Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts."; + case FMOD.RESULT.ERR_DSP_DONTPROCESS: return "DSP return code from a DSP process query callback. Tells mixer not to call the process callback and therefore not consume CPU. Use this to optimize the DSP graph."; + case FMOD.RESULT.ERR_DSP_FORMAT: return "DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map."; + case FMOD.RESULT.ERR_DSP_INUSE: return "DSP is already in the mixer's DSP network. It must be removed before being reinserted or released."; + case FMOD.RESULT.ERR_DSP_NOTFOUND: return "DSP connection error. Couldn't find the DSP unit specified."; + case FMOD.RESULT.ERR_DSP_RESERVED: return "DSP operation error. Cannot perform operation on this DSP as it is reserved by the system."; + case FMOD.RESULT.ERR_DSP_SILENCE: return "DSP return code from a DSP process query callback. Tells mixer silence would be produced from read, so go idle and not consume CPU. Use this to optimize the DSP graph."; + case FMOD.RESULT.ERR_DSP_TYPE: return "DSP operation cannot be performed on a DSP of this type."; + case FMOD.RESULT.ERR_FILE_BAD: return "Error loading file."; + case FMOD.RESULT.ERR_FILE_COULDNOTSEEK: return "Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format."; + case FMOD.RESULT.ERR_FILE_DISKEJECTED: return "Media was ejected while reading."; + case FMOD.RESULT.ERR_FILE_EOF: return "End of file unexpectedly reached while trying to read essential data (truncated?)."; + case FMOD.RESULT.ERR_FILE_ENDOFDATA: return "End of current chunk reached while trying to read data."; + case FMOD.RESULT.ERR_FILE_NOTFOUND: return "File not found."; + case FMOD.RESULT.ERR_FORMAT: return "Unsupported file or audio format."; + case FMOD.RESULT.ERR_HEADER_MISMATCH: return "There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library."; + case FMOD.RESULT.ERR_HTTP: return "A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere."; + case FMOD.RESULT.ERR_HTTP_ACCESS: return "The specified resource requires authentication or is forbidden."; + case FMOD.RESULT.ERR_HTTP_PROXY_AUTH: return "Proxy authentication is required to access the specified resource."; + case FMOD.RESULT.ERR_HTTP_SERVER_ERROR: return "A HTTP server error occurred."; + case FMOD.RESULT.ERR_HTTP_TIMEOUT: return "The HTTP request timed out."; + case FMOD.RESULT.ERR_INITIALIZATION: return "FMOD was not initialized correctly to support this function."; + case FMOD.RESULT.ERR_INITIALIZED: return "Cannot call this command after System::init."; + case FMOD.RESULT.ERR_INTERNAL: return "An error occurred that wasn't supposed to. Contact support."; + case FMOD.RESULT.ERR_INVALID_FLOAT: return "Value passed in was a NaN, Inf or denormalized float."; + case FMOD.RESULT.ERR_INVALID_HANDLE: return "An invalid object handle was used."; + case FMOD.RESULT.ERR_INVALID_PARAM: return "An invalid parameter was passed to this function."; + case FMOD.RESULT.ERR_INVALID_POSITION: return "An invalid seek position was passed to this function."; + case FMOD.RESULT.ERR_INVALID_SPEAKER: return "An invalid speaker was passed to this function based on the current speaker mode."; + case FMOD.RESULT.ERR_INVALID_SYNCPOINT: return "The syncpoint did not come from this sound handle."; + case FMOD.RESULT.ERR_INVALID_THREAD: return "Tried to call a function on a thread that is not supported."; + case FMOD.RESULT.ERR_INVALID_VECTOR: return "The vectors passed in are not unit length, or perpendicular."; + case FMOD.RESULT.ERR_MAXAUDIBLE: return "Reached maximum audible playback count for this sound's soundgroup."; + case FMOD.RESULT.ERR_MEMORY: return "Not enough memory or resources."; + case FMOD.RESULT.ERR_MEMORY_CANTPOINT: return "Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used."; + case FMOD.RESULT.ERR_NEEDS3D: return "Tried to call a command on a 2d sound when the command was meant for 3d sound."; + case FMOD.RESULT.ERR_NEEDSHARDWARE: return "Tried to use a feature that requires hardware support."; + case FMOD.RESULT.ERR_NET_CONNECT: return "Couldn't connect to the specified host."; + case FMOD.RESULT.ERR_NET_SOCKET_ERROR: return "A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere."; + case FMOD.RESULT.ERR_NET_URL: return "The specified URL couldn't be resolved."; + case FMOD.RESULT.ERR_NET_WOULD_BLOCK: return "Operation on a non-blocking socket could not complete immediately."; + case FMOD.RESULT.ERR_NOTREADY: return "Operation could not be performed because specified sound/DSP connection is not ready."; + case FMOD.RESULT.ERR_OUTPUT_ALLOCATED: return "Error initializing output device, but more specifically, the output device is already in use and cannot be reused."; + case FMOD.RESULT.ERR_OUTPUT_CREATEBUFFER: return "Error creating hardware sound buffer."; + case FMOD.RESULT.ERR_OUTPUT_DRIVERCALL: return "A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted."; + case FMOD.RESULT.ERR_OUTPUT_FORMAT: return "Soundcard does not support the specified format."; + case FMOD.RESULT.ERR_OUTPUT_INIT: return "Error initializing output device."; + case FMOD.RESULT.ERR_OUTPUT_NODRIVERS: return "The output device has no drivers installed. If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode. If post-init, the function just fails."; + case FMOD.RESULT.ERR_PLUGIN: return "An unspecified error has been returned from a plugin."; + case FMOD.RESULT.ERR_PLUGIN_MISSING: return "A requested output, dsp unit type or codec was not available."; + case FMOD.RESULT.ERR_PLUGIN_RESOURCE: return "A resource that the plugin requires cannot be allocated or found. (ie the DLS file for MIDI playback)"; + case FMOD.RESULT.ERR_PLUGIN_VERSION: return "A plugin was built with an unsupported SDK version."; + case FMOD.RESULT.ERR_RECORD: return "An error occurred trying to initialize the recording device."; + case FMOD.RESULT.ERR_REVERB_CHANNELGROUP: return "Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection."; + case FMOD.RESULT.ERR_REVERB_INSTANCE: return "Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist."; + case FMOD.RESULT.ERR_SUBSOUNDS: return "The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound."; + case FMOD.RESULT.ERR_SUBSOUND_ALLOCATED: return "This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first."; + case FMOD.RESULT.ERR_SUBSOUND_CANTMOVE: return "Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file."; + case FMOD.RESULT.ERR_TAGNOTFOUND: return "The specified tag could not be found or there are no tags."; + case FMOD.RESULT.ERR_TOOMANYCHANNELS: return "The sound created exceeds the allowable input channel count. This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat."; + case FMOD.RESULT.ERR_TRUNCATED: return "The retrieved string is too long to fit in the supplied buffer and has been truncated."; + case FMOD.RESULT.ERR_UNIMPLEMENTED: return "Something in FMOD hasn't been implemented when it should be! contact support!"; + case FMOD.RESULT.ERR_UNINITIALIZED: return "This command failed because System::init or System::setDriver was not called."; + case FMOD.RESULT.ERR_UNSUPPORTED: return "A command issued was not supported by this object. Possibly a plugin without certain callbacks specified."; + case FMOD.RESULT.ERR_VERSION: return "The version number of this file format is not supported."; + case FMOD.RESULT.ERR_EVENT_ALREADY_LOADED: return "The specified bank has already been loaded."; + case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_BUSY: return "The live update connection failed due to the game already being connected."; + case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_MISMATCH: return "The live update connection failed due to the game data being out of sync with the tool."; + case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_TIMEOUT: return "The live update connection timed out."; + case FMOD.RESULT.ERR_EVENT_NOTFOUND: return "The requested event, bus or vca could not be found."; + case FMOD.RESULT.ERR_STUDIO_UNINITIALIZED: return "The Studio::System object is not yet initialized."; + case FMOD.RESULT.ERR_STUDIO_NOT_LOADED: return "The specified resource is not loaded, so it can't be unloaded."; + case FMOD.RESULT.ERR_INVALID_STRING: return "An invalid string was passed to this function."; + case FMOD.RESULT.ERR_ALREADY_LOCKED: return "The specified resource is already locked."; + case FMOD.RESULT.ERR_NOT_LOCKED: return "The specified resource is not locked, so it can't be unlocked."; + case FMOD.RESULT.ERR_RECORD_DISCONNECTED: return "The specified recording driver has been disconnected."; + case FMOD.RESULT.ERR_TOOMANYSAMPLES: return "The length provided exceed the allowable limit."; + default: return "Unknown error."; + } + } + } +} diff --git a/modules/fmod/inc/fmod_errors.h b/modules/fmod/inc/fmod_errors.h new file mode 100644 index 0000000..6764299 --- /dev/null +++ b/modules/fmod/inc/fmod_errors.h @@ -0,0 +1,110 @@ +/* ============================================================================================== */ +/* FMOD Core / Studio API - Error string header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* Use this header if you want to store or display a string version / english explanation */ +/* of the FMOD error codes. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/core-api-common.html#fmod_result */ +/* =============================================================================================== */ +#ifndef _FMOD_ERRORS_H +#define _FMOD_ERRORS_H + +#include "fmod.h" + +#ifdef __GNUC__ +static const char *FMOD_ErrorString(FMOD_RESULT errcode) __attribute__((unused)); +#endif + +static const char *FMOD_ErrorString(FMOD_RESULT errcode) +{ + switch (errcode) + { + case FMOD_OK: return "No errors."; + case FMOD_ERR_BADCOMMAND: return "Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound)."; + case FMOD_ERR_CHANNEL_ALLOC: return "Error trying to allocate a channel."; + case FMOD_ERR_CHANNEL_STOLEN: return "The specified channel has been reused to play another sound."; + case FMOD_ERR_DMA: return "DMA Failure. See debug output for more information."; + case FMOD_ERR_DSP_CONNECTION: return "DSP connection error. Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts."; + case FMOD_ERR_DSP_DONTPROCESS: return "DSP return code from a DSP process query callback. Tells mixer not to call the process callback and therefore not consume CPU. Use this to optimize the DSP graph."; + case FMOD_ERR_DSP_FORMAT: return "DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map."; + case FMOD_ERR_DSP_INUSE: return "DSP is already in the mixer's DSP network. It must be removed before being reinserted or released."; + case FMOD_ERR_DSP_NOTFOUND: return "DSP connection error. Couldn't find the DSP unit specified."; + case FMOD_ERR_DSP_RESERVED: return "DSP operation error. Cannot perform operation on this DSP as it is reserved by the system."; + case FMOD_ERR_DSP_SILENCE: return "DSP return code from a DSP process query callback. Tells mixer silence would be produced from read, so go idle and not consume CPU. Use this to optimize the DSP graph."; + case FMOD_ERR_DSP_TYPE: return "DSP operation cannot be performed on a DSP of this type."; + case FMOD_ERR_FILE_BAD: return "Error loading file."; + case FMOD_ERR_FILE_COULDNOTSEEK: return "Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format."; + case FMOD_ERR_FILE_DISKEJECTED: return "Media was ejected while reading."; + case FMOD_ERR_FILE_EOF: return "End of file unexpectedly reached while trying to read essential data (truncated?)."; + case FMOD_ERR_FILE_ENDOFDATA: return "End of current chunk reached while trying to read data."; + case FMOD_ERR_FILE_NOTFOUND: return "File not found."; + case FMOD_ERR_FORMAT: return "Unsupported file or audio format."; + case FMOD_ERR_HEADER_MISMATCH: return "There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library."; + case FMOD_ERR_HTTP: return "A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere."; + case FMOD_ERR_HTTP_ACCESS: return "The specified resource requires authentication or is forbidden."; + case FMOD_ERR_HTTP_PROXY_AUTH: return "Proxy authentication is required to access the specified resource."; + case FMOD_ERR_HTTP_SERVER_ERROR: return "A HTTP server error occurred."; + case FMOD_ERR_HTTP_TIMEOUT: return "The HTTP request timed out."; + case FMOD_ERR_INITIALIZATION: return "FMOD was not initialized correctly to support this function."; + case FMOD_ERR_INITIALIZED: return "Cannot call this command after System::init."; + case FMOD_ERR_INTERNAL: return "An error occurred that wasn't supposed to. Contact support."; + case FMOD_ERR_INVALID_FLOAT: return "Value passed in was a NaN, Inf or denormalized float."; + case FMOD_ERR_INVALID_HANDLE: return "An invalid object handle was used."; + case FMOD_ERR_INVALID_PARAM: return "An invalid parameter was passed to this function."; + case FMOD_ERR_INVALID_POSITION: return "An invalid seek position was passed to this function."; + case FMOD_ERR_INVALID_SPEAKER: return "An invalid speaker was passed to this function based on the current speaker mode."; + case FMOD_ERR_INVALID_SYNCPOINT: return "The syncpoint did not come from this sound handle."; + case FMOD_ERR_INVALID_THREAD: return "Tried to call a function on a thread that is not supported."; + case FMOD_ERR_INVALID_VECTOR: return "The vectors passed in are not unit length, or perpendicular."; + case FMOD_ERR_MAXAUDIBLE: return "Reached maximum audible playback count for this sound's soundgroup."; + case FMOD_ERR_MEMORY: return "Not enough memory or resources."; + case FMOD_ERR_MEMORY_CANTPOINT: return "Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used."; + case FMOD_ERR_NEEDS3D: return "Tried to call a command on a 2d sound when the command was meant for 3d sound."; + case FMOD_ERR_NEEDSHARDWARE: return "Tried to use a feature that requires hardware support."; + case FMOD_ERR_NET_CONNECT: return "Couldn't connect to the specified host."; + case FMOD_ERR_NET_SOCKET_ERROR: return "A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere."; + case FMOD_ERR_NET_URL: return "The specified URL couldn't be resolved."; + case FMOD_ERR_NET_WOULD_BLOCK: return "Operation on a non-blocking socket could not complete immediately."; + case FMOD_ERR_NOTREADY: return "Operation could not be performed because specified sound/DSP connection is not ready."; + case FMOD_ERR_OUTPUT_ALLOCATED: return "Error initializing output device, but more specifically, the output device is already in use and cannot be reused."; + case FMOD_ERR_OUTPUT_CREATEBUFFER: return "Error creating hardware sound buffer."; + case FMOD_ERR_OUTPUT_DRIVERCALL: return "A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted."; + case FMOD_ERR_OUTPUT_FORMAT: return "Soundcard does not support the specified format."; + case FMOD_ERR_OUTPUT_INIT: return "Error initializing output device."; + case FMOD_ERR_OUTPUT_NODRIVERS: return "The output device has no drivers installed. If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode. If post-init, the function just fails."; + case FMOD_ERR_PLUGIN: return "An unspecified error has been returned from a plugin."; + case FMOD_ERR_PLUGIN_MISSING: return "A requested output, dsp unit type or codec was not available."; + case FMOD_ERR_PLUGIN_RESOURCE: return "A resource that the plugin requires cannot be allocated or found. (ie the DLS file for MIDI playback)"; + case FMOD_ERR_PLUGIN_VERSION: return "A plugin was built with an unsupported SDK version."; + case FMOD_ERR_RECORD: return "An error occurred trying to initialize the recording device."; + case FMOD_ERR_REVERB_CHANNELGROUP: return "Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection."; + case FMOD_ERR_REVERB_INSTANCE: return "Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist."; + case FMOD_ERR_SUBSOUNDS: return "The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound."; + case FMOD_ERR_SUBSOUND_ALLOCATED: return "This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first."; + case FMOD_ERR_SUBSOUND_CANTMOVE: return "Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file."; + case FMOD_ERR_TAGNOTFOUND: return "The specified tag could not be found or there are no tags."; + case FMOD_ERR_TOOMANYCHANNELS: return "The sound created exceeds the allowable input channel count. This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat."; + case FMOD_ERR_TRUNCATED: return "The retrieved string is too long to fit in the supplied buffer and has been truncated."; + case FMOD_ERR_UNIMPLEMENTED: return "Something in FMOD hasn't been implemented when it should be! contact support!"; + case FMOD_ERR_UNINITIALIZED: return "This command failed because System::init or System::setDriver was not called."; + case FMOD_ERR_UNSUPPORTED: return "A command issued was not supported by this object. Possibly a plugin without certain callbacks specified."; + case FMOD_ERR_VERSION: return "The version number of this file format is not supported."; + case FMOD_ERR_EVENT_ALREADY_LOADED: return "The specified bank has already been loaded."; + case FMOD_ERR_EVENT_LIVEUPDATE_BUSY: return "The live update connection failed due to the game already being connected."; + case FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH: return "The live update connection failed due to the game data being out of sync with the tool."; + case FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT: return "The live update connection timed out."; + case FMOD_ERR_EVENT_NOTFOUND: return "The requested event, parameter, bus or vca could not be found."; + case FMOD_ERR_STUDIO_UNINITIALIZED: return "The Studio::System object is not yet initialized."; + case FMOD_ERR_STUDIO_NOT_LOADED: return "The specified resource is not loaded, so it can't be unloaded."; + case FMOD_ERR_INVALID_STRING: return "An invalid string was passed to this function."; + case FMOD_ERR_ALREADY_LOCKED: return "The specified resource is already locked."; + case FMOD_ERR_NOT_LOCKED: return "The specified resource is not locked, so it can't be unlocked."; + case FMOD_ERR_RECORD_DISCONNECTED: return "The specified recording driver has been disconnected."; + case FMOD_ERR_TOOMANYSAMPLES: return "The length provided exceeds the allowable limit."; + default : return "Unknown error."; + }; +} + +#endif diff --git a/modules/fmod/inc/fmod_output.h b/modules/fmod/inc/fmod_output.h new file mode 100644 index 0000000..7bdea17 --- /dev/null +++ b/modules/fmod/inc/fmod_output.h @@ -0,0 +1,122 @@ +/* ======================================================================================== */ +/* FMOD Core API - output development header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* Use this header if you are wanting to develop your own output plugin to use with */ +/* FMOD's output system. With this header you can make your own output plugin that FMOD */ +/* can register and use. See the documentation and examples on how to make a working */ +/* plugin. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/plugin-api-output.html */ +/* ======================================================================================== */ +#ifndef _FMOD_OUTPUT_H +#define _FMOD_OUTPUT_H + +typedef struct FMOD_OUTPUT_STATE FMOD_OUTPUT_STATE; +typedef struct FMOD_OUTPUT_OBJECT3DINFO FMOD_OUTPUT_OBJECT3DINFO; + +/* + Output constants +*/ +#define FMOD_OUTPUT_PLUGIN_VERSION 5 + +typedef unsigned int FMOD_OUTPUT_METHOD; +#define FMOD_OUTPUT_METHOD_MIX_DIRECT 0 +#define FMOD_OUTPUT_METHOD_MIX_BUFFERED 1 + +/* + Output callbacks +*/ +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int *numdrivers); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETDRIVERINFO_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_INIT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int selecteddriver, FMOD_INITFLAGS flags, int *outputrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_SOUND_FORMAT *outputformat, int dspbufferlength, int *dspnumbuffers, int *dspnumadditionalbuffers, void *extradriverdata); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_START_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_STOP_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_CLOSE_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_UPDATE_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETHANDLE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void **handle); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_MIXER_CALLBACK) (FMOD_OUTPUT_STATE *output_state); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int *maxhardwareobjects); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void **object3d); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DFREE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void *object3d); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void *object3d, const FMOD_OUTPUT_OBJECT3DINFO *info); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OPENPORT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, int *portId, int *portRate, int *portChannels, FMOD_SOUND_FORMAT *portFormat); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_CLOSEPORT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int portId); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK)(FMOD_OUTPUT_STATE *output_state); + +/* + Output functions +*/ +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_READFROMMIXER_FUNC) (FMOD_OUTPUT_STATE *output_state, void *buffer, unsigned int length); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_COPYPORT_FUNC) (FMOD_OUTPUT_STATE *output_state, int portId, void *buffer, unsigned int length); +typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_REQUESTRESET_FUNC) (FMOD_OUTPUT_STATE *output_state); +typedef void * (F_CALL *FMOD_OUTPUT_ALLOC_FUNC) (unsigned int size, unsigned int align, const char *file, int line); +typedef void (F_CALL *FMOD_OUTPUT_FREE_FUNC) (void *ptr, const char *file, int line); +typedef void (F_CALL *FMOD_OUTPUT_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *string, ...); + +/* + Output structures +*/ +typedef struct FMOD_OUTPUT_DESCRIPTION +{ + unsigned int apiversion; + const char *name; + unsigned int version; + FMOD_OUTPUT_METHOD method; + FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK getnumdrivers; + FMOD_OUTPUT_GETDRIVERINFO_CALLBACK getdriverinfo; + FMOD_OUTPUT_INIT_CALLBACK init; + FMOD_OUTPUT_START_CALLBACK start; + FMOD_OUTPUT_STOP_CALLBACK stop; + FMOD_OUTPUT_CLOSE_CALLBACK close; + FMOD_OUTPUT_UPDATE_CALLBACK update; + FMOD_OUTPUT_GETHANDLE_CALLBACK gethandle; + FMOD_OUTPUT_MIXER_CALLBACK mixer; + FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK object3dgetinfo; + FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK object3dalloc; + FMOD_OUTPUT_OBJECT3DFREE_CALLBACK object3dfree; + FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK object3dupdate; + FMOD_OUTPUT_OPENPORT_CALLBACK openport; + FMOD_OUTPUT_CLOSEPORT_CALLBACK closeport; + FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK devicelistchanged; +} FMOD_OUTPUT_DESCRIPTION; + +struct FMOD_OUTPUT_STATE +{ + void *plugindata; + FMOD_OUTPUT_READFROMMIXER_FUNC readfrommixer; + FMOD_OUTPUT_ALLOC_FUNC alloc; + FMOD_OUTPUT_FREE_FUNC free; + FMOD_OUTPUT_LOG_FUNC log; + FMOD_OUTPUT_COPYPORT_FUNC copyport; + FMOD_OUTPUT_REQUESTRESET_FUNC requestreset; +}; + +struct FMOD_OUTPUT_OBJECT3DINFO +{ + float *buffer; + unsigned int bufferlength; + FMOD_VECTOR position; + float gain; + float spread; + float priority; +}; + +/* + Output macros +*/ +#define FMOD_OUTPUT_READFROMMIXER(_state, _buffer, _length) \ + (_state)->readfrommixer(_state, _buffer, _length) +#define FMOD_OUTPUT_ALLOC(_state, _size, _align) \ + (_state)->alloc(_size, _align, __FILE__, __LINE__) +#define FMOD_OUTPUT_FREE(_state, _ptr) \ + (_state)->free(_ptr, __FILE__, __LINE__) +#define FMOD_OUTPUT_LOG(_state, _level, _location, _format, ...) \ + (_state)->log(_level, __FILE__, __LINE__, _location, _format, ##__VA_ARGS__) +#define FMOD_OUTPUT_COPYPORT(_state, _id, _buffer, _length) \ + (_state)->copyport(_state, _id, _buffer, _length) +#define FMOD_OUTPUT_REQUESTRESET(_state) \ + (_state)->requestreset(_state) + +#endif /* _FMOD_OUTPUT_H */ diff --git a/modules/fmod/inc/fmod_studio.cs b/modules/fmod/inc/fmod_studio.cs new file mode 100644 index 0000000..ba93148 --- /dev/null +++ b/modules/fmod/inc/fmod_studio.cs @@ -0,0 +1,2250 @@ +/* ======================================================================================== */ +/* FMOD Studio API - C# wrapper. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/studio-api.html */ +/* ======================================================================================== */ + +using System; +using System.Text; +using System.Runtime.InteropServices; +using System.Collections; + +namespace FMOD.Studio +{ + public partial class STUDIO_VERSION + { +#if !UNITY_2019_4_OR_NEWER + public const string dll = "fmodstudio"; +#endif + } + + public enum STOP_MODE : int + { + ALLOWFADEOUT, + IMMEDIATE, + } + + public enum LOADING_STATE : int + { + UNLOADING, + UNLOADED, + LOADING, + LOADED, + ERROR, + } + + [StructLayout(LayoutKind.Sequential)] + public struct PROGRAMMER_SOUND_PROPERTIES + { + public StringWrapper name; + public IntPtr sound; + public int subsoundIndex; + } + + [StructLayout(LayoutKind.Sequential)] + public struct TIMELINE_MARKER_PROPERTIES + { + public StringWrapper name; + public int position; + } + + [StructLayout(LayoutKind.Sequential)] + public struct TIMELINE_BEAT_PROPERTIES + { + public int bar; + public int beat; + public int position; + public float tempo; + public int timesignatureupper; + public int timesignaturelower; + } + + [StructLayout(LayoutKind.Sequential)] + public struct TIMELINE_NESTED_BEAT_PROPERTIES + { + public GUID eventid; + public TIMELINE_BEAT_PROPERTIES properties; + } + + [StructLayout(LayoutKind.Sequential)] + public struct ADVANCEDSETTINGS + { + public int cbsize; + public int commandqueuesize; + public int handleinitialsize; + public int studioupdateperiod; + public int idlesampledatapoolsize; + public int streamingscheduledelay; + public IntPtr encryptionkey; + } + + [StructLayout(LayoutKind.Sequential)] + public struct CPU_USAGE + { + public float update; + } + + [StructLayout(LayoutKind.Sequential)] + public struct BUFFER_INFO + { + public int currentusage; + public int peakusage; + public int capacity; + public int stallcount; + public float stalltime; + } + + [StructLayout(LayoutKind.Sequential)] + public struct BUFFER_USAGE + { + public BUFFER_INFO studiocommandqueue; + public BUFFER_INFO studiohandle; + } + + [StructLayout(LayoutKind.Sequential)] + public struct BANK_INFO + { + public int size; + public IntPtr userdata; + public int userdatalength; + public FILE_OPEN_CALLBACK opencallback; + public FILE_CLOSE_CALLBACK closecallback; + public FILE_READ_CALLBACK readcallback; + public FILE_SEEK_CALLBACK seekcallback; + } + + [Flags] + public enum SYSTEM_CALLBACK_TYPE : uint + { + PREUPDATE = 0x00000001, + POSTUPDATE = 0x00000002, + BANK_UNLOAD = 0x00000004, + LIVEUPDATE_CONNECTED = 0x00000008, + LIVEUPDATE_DISCONNECTED = 0x00000010, + ALL = 0xFFFFFFFF, + } + + public delegate RESULT SYSTEM_CALLBACK(IntPtr system, SYSTEM_CALLBACK_TYPE type, IntPtr commanddata, IntPtr userdata); + + public enum PARAMETER_TYPE : int + { + GAME_CONTROLLED, + AUTOMATIC_DISTANCE, + AUTOMATIC_EVENT_CONE_ANGLE, + AUTOMATIC_EVENT_ORIENTATION, + AUTOMATIC_DIRECTION, + AUTOMATIC_ELEVATION, + AUTOMATIC_LISTENER_ORIENTATION, + AUTOMATIC_SPEED, + AUTOMATIC_SPEED_ABSOLUTE, + AUTOMATIC_DISTANCE_NORMALIZED, + MAX + } + + [Flags] + public enum PARAMETER_FLAGS : uint + { + READONLY = 0x00000001, + AUTOMATIC = 0x00000002, + GLOBAL = 0x00000004, + DISCRETE = 0x00000008, + LABELED = 0x00000010, + } + + [StructLayout(LayoutKind.Sequential)] + public struct PARAMETER_ID + { + public uint data1; + public uint data2; + } + + [StructLayout(LayoutKind.Sequential)] + public struct PARAMETER_DESCRIPTION + { + public StringWrapper name; + public PARAMETER_ID id; + public float minimum; + public float maximum; + public float defaultvalue; + public PARAMETER_TYPE type; + public PARAMETER_FLAGS flags; + public GUID guid; + } + + // This is only need for loading memory and given our C# wrapper LOAD_MEMORY_POINT isn't feasible anyway + enum LOAD_MEMORY_MODE : int + { + LOAD_MEMORY, + LOAD_MEMORY_POINT, + } + + enum LOAD_MEMORY_ALIGNMENT : int + { + VALUE = 32 + } + + [StructLayout(LayoutKind.Sequential)] + public struct SOUND_INFO + { + public IntPtr name_or_data; + public MODE mode; + public CREATESOUNDEXINFO exinfo; + public int subsoundindex; + + public string name + { + get + { + using (StringHelper.ThreadSafeEncoding encoding = StringHelper.GetFreeHelper()) + { + return ((mode & (MODE.OPENMEMORY | MODE.OPENMEMORY_POINT)) == 0) ? encoding.stringFromNative(name_or_data) : String.Empty; + } + } + } + } + + public enum USER_PROPERTY_TYPE : int + { + INTEGER, + BOOLEAN, + FLOAT, + STRING, + } + + [StructLayout(LayoutKind.Sequential)] + public struct USER_PROPERTY + { + public StringWrapper name; + public USER_PROPERTY_TYPE type; + private Union_IntBoolFloatString value; + + public int intValue() { return (type == USER_PROPERTY_TYPE.INTEGER) ? value.intvalue : -1; } + public bool boolValue() { return (type == USER_PROPERTY_TYPE.BOOLEAN) ? value.boolvalue : false; } + public float floatValue() { return (type == USER_PROPERTY_TYPE.FLOAT) ? value.floatvalue : -1; } + public string stringValue() { return (type == USER_PROPERTY_TYPE.STRING) ? value.stringvalue : ""; } + }; + + [StructLayout(LayoutKind.Explicit)] + struct Union_IntBoolFloatString + { + [FieldOffset(0)] + public int intvalue; + [FieldOffset(0)] + public bool boolvalue; + [FieldOffset(0)] + public float floatvalue; + [FieldOffset(0)] + public StringWrapper stringvalue; + } + + [Flags] + public enum INITFLAGS : uint + { + NORMAL = 0x00000000, + LIVEUPDATE = 0x00000001, + ALLOW_MISSING_PLUGINS = 0x00000002, + SYNCHRONOUS_UPDATE = 0x00000004, + DEFERRED_CALLBACKS = 0x00000008, + LOAD_FROM_UPDATE = 0x00000010, + MEMORY_TRACKING = 0x00000020, + } + + [Flags] + public enum LOAD_BANK_FLAGS : uint + { + NORMAL = 0x00000000, + NONBLOCKING = 0x00000001, + DECOMPRESS_SAMPLES = 0x00000002, + UNENCRYPTED = 0x00000004, + } + + [Flags] + public enum COMMANDCAPTURE_FLAGS : uint + { + NORMAL = 0x00000000, + FILEFLUSH = 0x00000001, + SKIP_INITIAL_STATE = 0x00000002, + } + + [Flags] + public enum COMMANDREPLAY_FLAGS : uint + { + NORMAL = 0x00000000, + SKIP_CLEANUP = 0x00000001, + FAST_FORWARD = 0x00000002, + SKIP_BANK_LOAD = 0x00000004, + } + + public enum PLAYBACK_STATE : int + { + PLAYING, + SUSTAINING, + STOPPED, + STARTING, + STOPPING, + } + + public enum EVENT_PROPERTY : int + { + CHANNELPRIORITY, + SCHEDULE_DELAY, + SCHEDULE_LOOKAHEAD, + MINIMUM_DISTANCE, + MAXIMUM_DISTANCE, + COOLDOWN, + MAX + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PLUGIN_INSTANCE_PROPERTIES + { + public IntPtr name; + public IntPtr dsp; + } + + [Flags] + public enum EVENT_CALLBACK_TYPE : uint + { + CREATED = 0x00000001, + DESTROYED = 0x00000002, + STARTING = 0x00000004, + STARTED = 0x00000008, + RESTARTED = 0x00000010, + STOPPED = 0x00000020, + START_FAILED = 0x00000040, + CREATE_PROGRAMMER_SOUND = 0x00000080, + DESTROY_PROGRAMMER_SOUND = 0x00000100, + PLUGIN_CREATED = 0x00000200, + PLUGIN_DESTROYED = 0x00000400, + TIMELINE_MARKER = 0x00000800, + TIMELINE_BEAT = 0x00001000, + SOUND_PLAYED = 0x00002000, + SOUND_STOPPED = 0x00004000, + REAL_TO_VIRTUAL = 0x00008000, + VIRTUAL_TO_REAL = 0x00010000, + START_EVENT_COMMAND = 0x00020000, + NESTED_TIMELINE_BEAT = 0x00040000, + + ALL = 0xFFFFFFFF, + } + + public delegate RESULT EVENT_CALLBACK(EVENT_CALLBACK_TYPE type, IntPtr _event, IntPtr parameters); + + public delegate RESULT COMMANDREPLAY_FRAME_CALLBACK(IntPtr replay, int commandindex, float currenttime, IntPtr userdata); + public delegate RESULT COMMANDREPLAY_LOAD_BANK_CALLBACK(IntPtr replay, int commandindex, GUID bankguid, IntPtr bankfilename, LOAD_BANK_FLAGS flags, out IntPtr bank, IntPtr userdata); + public delegate RESULT COMMANDREPLAY_CREATE_INSTANCE_CALLBACK(IntPtr replay, int commandindex, IntPtr eventdescription, out IntPtr instance, IntPtr userdata); + + public enum INSTANCETYPE : int + { + NONE, + SYSTEM, + EVENTDESCRIPTION, + EVENTINSTANCE, + PARAMETERINSTANCE, + BUS, + VCA, + BANK, + COMMANDREPLAY, + } + + [StructLayout(LayoutKind.Sequential)] + public struct COMMAND_INFO + { + public StringWrapper commandname; + public int parentcommandindex; + public int framenumber; + public float frametime; + public INSTANCETYPE instancetype; + public INSTANCETYPE outputtype; + public UInt32 instancehandle; + public UInt32 outputhandle; + } + + [StructLayout(LayoutKind.Sequential)] + public struct MEMORY_USAGE + { + public int exclusive; + public int inclusive; + public int sampledata; + } + + public struct Util + { + public static RESULT parseID(string idString, out GUID id) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_ParseID(encoder.byteFromStringUTF8(idString), out id); + } + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_ParseID(byte[] idString, out GUID id); + #endregion + } + + public struct System + { + // Initialization / system functions. + public static RESULT create(out System system) + { + return FMOD_Studio_System_Create(out system.handle, VERSION.number); + } + public RESULT setAdvancedSettings(ADVANCEDSETTINGS settings) + { + settings.cbsize = MarshalHelper.SizeOf(typeof(ADVANCEDSETTINGS)); + return FMOD_Studio_System_SetAdvancedSettings(this.handle, ref settings); + } + public RESULT setAdvancedSettings(ADVANCEDSETTINGS settings, string encryptionKey) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr userKey = settings.encryptionkey; + settings.encryptionkey = encoder.intptrFromStringUTF8(encryptionKey); + FMOD.RESULT result = setAdvancedSettings(settings); + settings.encryptionkey = userKey; + return result; + } + } + public RESULT getAdvancedSettings(out ADVANCEDSETTINGS settings) + { + settings.cbsize = MarshalHelper.SizeOf(typeof(ADVANCEDSETTINGS)); + return FMOD_Studio_System_GetAdvancedSettings(this.handle, out settings); + } + public RESULT initialize(int maxchannels, INITFLAGS studioflags, FMOD.INITFLAGS flags, IntPtr extradriverdata) + { + return FMOD_Studio_System_Initialize(this.handle, maxchannels, studioflags, flags, extradriverdata); + } + public RESULT release() + { + return FMOD_Studio_System_Release(this.handle); + } + public RESULT update() + { + return FMOD_Studio_System_Update(this.handle); + } + public RESULT getCoreSystem(out FMOD.System coresystem) + { + return FMOD_Studio_System_GetCoreSystem(this.handle, out coresystem.handle); + } + public RESULT getEvent(string path, out EventDescription _event) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetEvent(this.handle, encoder.byteFromStringUTF8(path), out _event.handle); + } + } + public RESULT getBus(string path, out Bus bus) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetBus(this.handle, encoder.byteFromStringUTF8(path), out bus.handle); + } + } + public RESULT getVCA(string path, out VCA vca) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetVCA(this.handle, encoder.byteFromStringUTF8(path), out vca.handle); + } + } + public RESULT getBank(string path, out Bank bank) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetBank(this.handle, encoder.byteFromStringUTF8(path), out bank.handle); + } + } + + public RESULT getEventByID(GUID id, out EventDescription _event) + { + return FMOD_Studio_System_GetEventByID(this.handle, ref id, out _event.handle); + } + public RESULT getBusByID(GUID id, out Bus bus) + { + return FMOD_Studio_System_GetBusByID(this.handle, ref id, out bus.handle); + } + public RESULT getVCAByID(GUID id, out VCA vca) + { + return FMOD_Studio_System_GetVCAByID(this.handle, ref id, out vca.handle); + } + public RESULT getBankByID(GUID id, out Bank bank) + { + return FMOD_Studio_System_GetBankByID(this.handle, ref id, out bank.handle); + } + public RESULT getSoundInfo(string key, out SOUND_INFO info) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetSoundInfo(this.handle, encoder.byteFromStringUTF8(key), out info); + } + } + public RESULT getParameterDescriptionByName(string name, out PARAMETER_DESCRIPTION parameter) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetParameterDescriptionByName(this.handle, encoder.byteFromStringUTF8(name), out parameter); + } + } + public RESULT getParameterDescriptionByID(PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter) + { + return FMOD_Studio_System_GetParameterDescriptionByID(this.handle, id, out parameter); + } + public RESULT getParameterLabelByName(string name, int labelindex, out string label) + { + label = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + byte[] nameBytes = encoder.byteFromStringUTF8(name); + RESULT result = FMOD_Studio_System_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + result = FMOD_Studio_System_GetParameterLabelByName(this.handle, nameBytes, labelindex, IntPtr.Zero, 0, out retrieved); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_System_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + label = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getParameterLabelByID(PARAMETER_ID id, int labelindex, out string label) + { + label = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_System_GetParameterLabelByID(this.handle, id, labelindex, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + result = FMOD_Studio_System_GetParameterLabelByID(this.handle, id, labelindex, IntPtr.Zero, 0, out retrieved); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_System_GetParameterLabelByID(this.handle, id, labelindex, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + label = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getParameterByID(PARAMETER_ID id, out float value) + { + float finalValue; + return getParameterByID(id, out value, out finalValue); + } + public RESULT getParameterByID(PARAMETER_ID id, out float value, out float finalvalue) + { + return FMOD_Studio_System_GetParameterByID(this.handle, id, out value, out finalvalue); + } + public RESULT setParameterByID(PARAMETER_ID id, float value, bool ignoreseekspeed = false) + { + return FMOD_Studio_System_SetParameterByID(this.handle, id, value, ignoreseekspeed); + } + public RESULT setParameterByIDWithLabel(PARAMETER_ID id, string label, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_SetParameterByIDWithLabel(this.handle, id, encoder.byteFromStringUTF8(label), ignoreseekspeed); + } + } + public RESULT setParametersByIDs(PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed = false) + { + return FMOD_Studio_System_SetParametersByIDs(this.handle, ids, values, count, ignoreseekspeed); + } + public RESULT getParameterByName(string name, out float value) + { + float finalValue; + return getParameterByName(name, out value, out finalValue); + } + public RESULT getParameterByName(string name, out float value, out float finalvalue) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_GetParameterByName(this.handle, encoder.byteFromStringUTF8(name), out value, out finalvalue); + } + } + public RESULT setParameterByName(string name, float value, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_SetParameterByName(this.handle, encoder.byteFromStringUTF8(name), value, ignoreseekspeed); + } + } + public RESULT setParameterByNameWithLabel(string name, string label, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper(), + labelEncoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_SetParameterByNameWithLabel(this.handle, encoder.byteFromStringUTF8(name), labelEncoder.byteFromStringUTF8(label), ignoreseekspeed); + } + } + public RESULT lookupID(string path, out GUID id) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_LookupID(this.handle, encoder.byteFromStringUTF8(path), out id); + } + } + public RESULT lookupPath(GUID id, out string path) + { + path = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_System_LookupPath(this.handle, ref id, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_System_LookupPath(this.handle, ref id, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getNumListeners(out int numlisteners) + { + return FMOD_Studio_System_GetNumListeners(this.handle, out numlisteners); + } + public RESULT setNumListeners(int numlisteners) + { + return FMOD_Studio_System_SetNumListeners(this.handle, numlisteners); + } + public RESULT getListenerAttributes(int listener, out ATTRIBUTES_3D attributes) + { + return FMOD_Studio_System_GetListenerAttributes(this.handle, listener, out attributes, IntPtr.Zero); + } + public RESULT getListenerAttributes(int listener, out ATTRIBUTES_3D attributes, out VECTOR attenuationposition) + { + return FMOD_Studio_System_GetListenerAttributes(this.handle, listener, out attributes, out attenuationposition); + } + public RESULT setListenerAttributes(int listener, ATTRIBUTES_3D attributes) + { + return FMOD_Studio_System_SetListenerAttributes(this.handle, listener, ref attributes, IntPtr.Zero); + } + public RESULT setListenerAttributes(int listener, ATTRIBUTES_3D attributes, VECTOR attenuationposition) + { + return FMOD_Studio_System_SetListenerAttributes(this.handle, listener, ref attributes, ref attenuationposition); + } + public RESULT getListenerWeight(int listener, out float weight) + { + return FMOD_Studio_System_GetListenerWeight(this.handle, listener, out weight); + } + public RESULT setListenerWeight(int listener, float weight) + { + return FMOD_Studio_System_SetListenerWeight(this.handle, listener, weight); + } + public RESULT loadBankFile(string filename, LOAD_BANK_FLAGS flags, out Bank bank) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_LoadBankFile(this.handle, encoder.byteFromStringUTF8(filename), flags, out bank.handle); + } + } + public RESULT loadBankMemory(byte[] buffer, LOAD_BANK_FLAGS flags, out Bank bank) + { + // Manually pin the byte array. It's what the marshaller should do anyway but don't leave it to chance. + GCHandle pinnedArray = GCHandle.Alloc(buffer, GCHandleType.Pinned); + IntPtr pointer = pinnedArray.AddrOfPinnedObject(); + RESULT result = FMOD_Studio_System_LoadBankMemory(this.handle, pointer, buffer.Length, LOAD_MEMORY_MODE.LOAD_MEMORY, flags, out bank.handle); + pinnedArray.Free(); + return result; + } + public RESULT loadBankCustom(BANK_INFO info, LOAD_BANK_FLAGS flags, out Bank bank) + { + info.size = MarshalHelper.SizeOf(typeof(BANK_INFO)); + return FMOD_Studio_System_LoadBankCustom(this.handle, ref info, flags, out bank.handle); + } + public RESULT unloadAll() + { + return FMOD_Studio_System_UnloadAll(this.handle); + } + public RESULT flushCommands() + { + return FMOD_Studio_System_FlushCommands(this.handle); + } + public RESULT flushSampleLoading() + { + return FMOD_Studio_System_FlushSampleLoading(this.handle); + } + public RESULT startCommandCapture(string filename, COMMANDCAPTURE_FLAGS flags) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_StartCommandCapture(this.handle, encoder.byteFromStringUTF8(filename), flags); + } + } + public RESULT stopCommandCapture() + { + return FMOD_Studio_System_StopCommandCapture(this.handle); + } + public RESULT loadCommandReplay(string filename, COMMANDREPLAY_FLAGS flags, out CommandReplay replay) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_System_LoadCommandReplay(this.handle, encoder.byteFromStringUTF8(filename), flags, out replay.handle); + } + } + public RESULT getBankCount(out int count) + { + return FMOD_Studio_System_GetBankCount(this.handle, out count); + } + public RESULT getBankList(out Bank[] array) + { + array = null; + + RESULT result; + int capacity; + result = FMOD_Studio_System_GetBankCount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new Bank[0]; + return result; + } + + IntPtr[] rawArray = new IntPtr[capacity]; + int actualCount; + result = FMOD_Studio_System_GetBankList(this.handle, rawArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + if (actualCount > capacity) // More items added since we queried just now? + { + actualCount = capacity; + } + array = new Bank[actualCount]; + for (int i = 0; i < actualCount; ++i) + { + array[i].handle = rawArray[i]; + } + return RESULT.OK; + } + public RESULT getParameterDescriptionCount(out int count) + { + return FMOD_Studio_System_GetParameterDescriptionCount(this.handle, out count); + } + public RESULT getParameterDescriptionList(out PARAMETER_DESCRIPTION[] array) + { + array = null; + + int capacity; + RESULT result = FMOD_Studio_System_GetParameterDescriptionCount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new PARAMETER_DESCRIPTION[0]; + return RESULT.OK; + } + + PARAMETER_DESCRIPTION[] tempArray = new PARAMETER_DESCRIPTION[capacity]; + int actualCount; + result = FMOD_Studio_System_GetParameterDescriptionList(this.handle, tempArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + + if (actualCount != capacity) + { + Array.Resize(ref tempArray, actualCount); + } + + array = tempArray; + + return RESULT.OK; + } + public RESULT getCPUUsage(out CPU_USAGE usage, out FMOD.CPU_USAGE usage_core) + { + return FMOD_Studio_System_GetCPUUsage(this.handle, out usage, out usage_core); + } + public RESULT getBufferUsage(out BUFFER_USAGE usage) + { + return FMOD_Studio_System_GetBufferUsage(this.handle, out usage); + } + public RESULT resetBufferUsage() + { + return FMOD_Studio_System_ResetBufferUsage(this.handle); + } + + public RESULT setCallback(SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask = SYSTEM_CALLBACK_TYPE.ALL) + { + return FMOD_Studio_System_SetCallback(this.handle, callback, callbackmask); + } + + public RESULT getUserData(out IntPtr userdata) + { + return FMOD_Studio_System_GetUserData(this.handle, out userdata); + } + + public RESULT setUserData(IntPtr userdata) + { + return FMOD_Studio_System_SetUserData(this.handle, userdata); + } + + public RESULT getMemoryUsage(out MEMORY_USAGE memoryusage) + { + return FMOD_Studio_System_GetMemoryUsage(this.handle, out memoryusage); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_Create (out IntPtr system, uint headerversion); + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_System_IsValid (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetAdvancedSettings (IntPtr system, ref ADVANCEDSETTINGS settings); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetAdvancedSettings (IntPtr system, out ADVANCEDSETTINGS settings); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_Initialize (IntPtr system, int maxchannels, INITFLAGS studioflags, FMOD.INITFLAGS flags, IntPtr extradriverdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_Release (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_Update (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetCoreSystem (IntPtr system, out IntPtr coresystem); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetEvent (IntPtr system, byte[] path, out IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBus (IntPtr system, byte[] path, out IntPtr bus); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetVCA (IntPtr system, byte[] path, out IntPtr vca); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBank (IntPtr system, byte[] path, out IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetEventByID (IntPtr system, ref GUID id, out IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBusByID (IntPtr system, ref GUID id, out IntPtr bus); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetVCAByID (IntPtr system, ref GUID id, out IntPtr vca); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBankByID (IntPtr system, ref GUID id, out IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetSoundInfo (IntPtr system, byte[] key, out SOUND_INFO info); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterDescriptionByName(IntPtr system, byte[] name, out PARAMETER_DESCRIPTION parameter); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterDescriptionByID(IntPtr system, PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterLabelByName (IntPtr system, byte[] name, int labelindex, IntPtr label, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterLabelByID (IntPtr system, PARAMETER_ID id, int labelindex, IntPtr label, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterByID (IntPtr system, PARAMETER_ID id, out float value, out float finalvalue); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetParameterByID (IntPtr system, PARAMETER_ID id, float value, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetParameterByIDWithLabel (IntPtr system, PARAMETER_ID id, byte[] label, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetParametersByIDs (IntPtr system, PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterByName (IntPtr system, byte[] name, out float value, out float finalvalue); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetParameterByName (IntPtr system, byte[] name, float value, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetParameterByNameWithLabel (IntPtr system, byte[] name, byte[] label, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LookupID (IntPtr system, byte[] path, out GUID id); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LookupPath (IntPtr system, ref GUID id, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetNumListeners (IntPtr system, out int numlisteners); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetNumListeners (IntPtr system, int numlisteners); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetListenerAttributes (IntPtr system, int listener, out ATTRIBUTES_3D attributes, IntPtr zero); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetListenerAttributes (IntPtr system, int listener, out ATTRIBUTES_3D attributes, out VECTOR attenuationposition); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetListenerAttributes (IntPtr system, int listener, ref ATTRIBUTES_3D attributes, IntPtr zero); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetListenerAttributes (IntPtr system, int listener, ref ATTRIBUTES_3D attributes, ref VECTOR attenuationposition); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetListenerWeight (IntPtr system, int listener, out float weight); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetListenerWeight (IntPtr system, int listener, float weight); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LoadBankFile (IntPtr system, byte[] filename, LOAD_BANK_FLAGS flags, out IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LoadBankMemory (IntPtr system, IntPtr buffer, int length, LOAD_MEMORY_MODE mode, LOAD_BANK_FLAGS flags, out IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LoadBankCustom (IntPtr system, ref BANK_INFO info, LOAD_BANK_FLAGS flags, out IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_UnloadAll (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_FlushCommands (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_FlushSampleLoading (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_StartCommandCapture (IntPtr system, byte[] filename, COMMANDCAPTURE_FLAGS flags); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_StopCommandCapture (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_LoadCommandReplay (IntPtr system, byte[] filename, COMMANDREPLAY_FLAGS flags, out IntPtr replay); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBankCount (IntPtr system, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBankList (IntPtr system, IntPtr[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterDescriptionCount(IntPtr system, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetParameterDescriptionList(IntPtr system, [Out] PARAMETER_DESCRIPTION[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetCPUUsage (IntPtr system, out CPU_USAGE usage, out FMOD.CPU_USAGE usage_core); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetBufferUsage (IntPtr system, out BUFFER_USAGE usage); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_ResetBufferUsage (IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetCallback (IntPtr system, SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetUserData (IntPtr system, out IntPtr userdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_SetUserData (IntPtr system, IntPtr userdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_System_GetMemoryUsage (IntPtr system, out MEMORY_USAGE memoryusage); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public System(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_System_IsValid(this.handle); + } + + #endregion + } + + public struct EventDescription + { + public RESULT getID(out GUID id) + { + return FMOD_Studio_EventDescription_GetID(this.handle, out id); + } + public RESULT getPath(out string path) + { + path = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_EventDescription_GetPath(this.handle, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_EventDescription_GetPath(this.handle, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getParameterDescriptionCount(out int count) + { + return FMOD_Studio_EventDescription_GetParameterDescriptionCount(this.handle, out count); + } + public RESULT getParameterDescriptionByIndex(int index, out PARAMETER_DESCRIPTION parameter) + { + return FMOD_Studio_EventDescription_GetParameterDescriptionByIndex(this.handle, index, out parameter); + } + public RESULT getParameterDescriptionByName(string name, out PARAMETER_DESCRIPTION parameter) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventDescription_GetParameterDescriptionByName(this.handle, encoder.byteFromStringUTF8(name), out parameter); + } + } + public RESULT getParameterDescriptionByID(PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter) + { + return FMOD_Studio_EventDescription_GetParameterDescriptionByID(this.handle, id, out parameter); + } + public RESULT getParameterLabelByIndex(int index, int labelindex, out string label) + { + label = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_EventDescription_GetParameterLabelByIndex(this.handle, index, labelindex, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + result = FMOD_Studio_EventDescription_GetParameterLabelByIndex(this.handle, index, labelindex, IntPtr.Zero, 0, out retrieved); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_EventDescription_GetParameterLabelByIndex(this.handle, index, labelindex, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + label = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getParameterLabelByName(string name, int labelindex, out string label) + { + label = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + byte[] nameBytes = encoder.byteFromStringUTF8(name); + RESULT result = FMOD_Studio_EventDescription_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + result = FMOD_Studio_EventDescription_GetParameterLabelByName(this.handle, nameBytes, labelindex, IntPtr.Zero, 0, out retrieved); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_EventDescription_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + label = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getParameterLabelByID(PARAMETER_ID id, int labelindex, out string label) + { + label = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_EventDescription_GetParameterLabelByID(this.handle, id, labelindex, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + result = FMOD_Studio_EventDescription_GetParameterLabelByID(this.handle, id, labelindex, IntPtr.Zero, 0, out retrieved); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_EventDescription_GetParameterLabelByID(this.handle, id, labelindex, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + label = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getUserPropertyCount(out int count) + { + return FMOD_Studio_EventDescription_GetUserPropertyCount(this.handle, out count); + } + public RESULT getUserPropertyByIndex(int index, out USER_PROPERTY property) + { + return FMOD_Studio_EventDescription_GetUserPropertyByIndex(this.handle, index, out property); + } + public RESULT getUserProperty(string name, out USER_PROPERTY property) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventDescription_GetUserProperty(this.handle, encoder.byteFromStringUTF8(name), out property); + } + } + public RESULT getLength(out int length) + { + return FMOD_Studio_EventDescription_GetLength(this.handle, out length); + } + public RESULT getMinMaxDistance(out float min, out float max) + { + return FMOD_Studio_EventDescription_GetMinMaxDistance(this.handle, out min, out max); + } + public RESULT getSoundSize(out float size) + { + return FMOD_Studio_EventDescription_GetSoundSize(this.handle, out size); + } + public RESULT isSnapshot(out bool snapshot) + { + return FMOD_Studio_EventDescription_IsSnapshot(this.handle, out snapshot); + } + public RESULT isOneshot(out bool oneshot) + { + return FMOD_Studio_EventDescription_IsOneshot(this.handle, out oneshot); + } + public RESULT isStream(out bool isStream) + { + return FMOD_Studio_EventDescription_IsStream(this.handle, out isStream); + } + public RESULT is3D(out bool is3D) + { + return FMOD_Studio_EventDescription_Is3D(this.handle, out is3D); + } + public RESULT isDopplerEnabled(out bool doppler) + { + return FMOD_Studio_EventDescription_IsDopplerEnabled(this.handle, out doppler); + } + public RESULT hasSustainPoint(out bool sustainPoint) + { + return FMOD_Studio_EventDescription_HasSustainPoint(this.handle, out sustainPoint); + } + + public RESULT createInstance(out EventInstance instance) + { + return FMOD_Studio_EventDescription_CreateInstance(this.handle, out instance.handle); + } + + public RESULT getInstanceCount(out int count) + { + return FMOD_Studio_EventDescription_GetInstanceCount(this.handle, out count); + } + public RESULT getInstanceList(out EventInstance[] array) + { + array = null; + + RESULT result; + int capacity; + result = FMOD_Studio_EventDescription_GetInstanceCount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new EventInstance[0]; + return result; + } + + IntPtr[] rawArray = new IntPtr[capacity]; + int actualCount; + result = FMOD_Studio_EventDescription_GetInstanceList(this.handle, rawArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + if (actualCount > capacity) // More items added since we queried just now? + { + actualCount = capacity; + } + array = new EventInstance[actualCount]; + for (int i = 0; i < actualCount; ++i) + { + array[i].handle = rawArray[i]; + } + return RESULT.OK; + } + + public RESULT loadSampleData() + { + return FMOD_Studio_EventDescription_LoadSampleData(this.handle); + } + + public RESULT unloadSampleData() + { + return FMOD_Studio_EventDescription_UnloadSampleData(this.handle); + } + + public RESULT getSampleLoadingState(out LOADING_STATE state) + { + return FMOD_Studio_EventDescription_GetSampleLoadingState(this.handle, out state); + } + + public RESULT releaseAllInstances() + { + return FMOD_Studio_EventDescription_ReleaseAllInstances(this.handle); + } + public RESULT setCallback(EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask = EVENT_CALLBACK_TYPE.ALL) + { + return FMOD_Studio_EventDescription_SetCallback(this.handle, callback, callbackmask); + } + + public RESULT getUserData(out IntPtr userdata) + { + return FMOD_Studio_EventDescription_GetUserData(this.handle, out userdata); + } + + public RESULT setUserData(IntPtr userdata) + { + return FMOD_Studio_EventDescription_SetUserData(this.handle, userdata); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_EventDescription_IsValid (IntPtr eventdescription); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetID (IntPtr eventdescription, out GUID id); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetPath (IntPtr eventdescription, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionCount(IntPtr eventdescription, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByIndex(IntPtr eventdescription, int index, out PARAMETER_DESCRIPTION parameter); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByName(IntPtr eventdescription, byte[] name, out PARAMETER_DESCRIPTION parameter); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByID(IntPtr eventdescription, PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterLabelByIndex(IntPtr eventdescription, int index, int labelindex, IntPtr label, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterLabelByName(IntPtr eventdescription, byte[] name, int labelindex, IntPtr label, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetParameterLabelByID (IntPtr eventdescription, PARAMETER_ID id, int labelindex, IntPtr label, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetUserPropertyCount (IntPtr eventdescription, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetUserPropertyByIndex(IntPtr eventdescription, int index, out USER_PROPERTY property); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetUserProperty (IntPtr eventdescription, byte[] name, out USER_PROPERTY property); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetLength (IntPtr eventdescription, out int length); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetMinMaxDistance (IntPtr eventdescription, out float min, out float max); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetSoundSize (IntPtr eventdescription, out float size); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_IsSnapshot (IntPtr eventdescription, out bool snapshot); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_IsOneshot (IntPtr eventdescription, out bool oneshot); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_IsStream (IntPtr eventdescription, out bool isStream); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_Is3D (IntPtr eventdescription, out bool is3D); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_IsDopplerEnabled (IntPtr eventdescription, out bool doppler); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_HasSustainPoint (IntPtr eventdescription, out bool sustainPoint); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_CreateInstance (IntPtr eventdescription, out IntPtr instance); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetInstanceCount (IntPtr eventdescription, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetInstanceList (IntPtr eventdescription, IntPtr[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_LoadSampleData (IntPtr eventdescription); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_UnloadSampleData (IntPtr eventdescription); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetSampleLoadingState (IntPtr eventdescription, out LOADING_STATE state); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_ReleaseAllInstances (IntPtr eventdescription); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_SetCallback (IntPtr eventdescription, EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_GetUserData (IntPtr eventdescription, out IntPtr userdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventDescription_SetUserData (IntPtr eventdescription, IntPtr userdata); + #endregion + #region wrapperinternal + + public IntPtr handle; + + public EventDescription(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_EventDescription_IsValid(this.handle); + } + + #endregion + } + + public struct EventInstance + { + public RESULT getDescription(out EventDescription description) + { + return FMOD_Studio_EventInstance_GetDescription(this.handle, out description.handle); + } + public RESULT getVolume(out float volume) + { + return FMOD_Studio_EventInstance_GetVolume(this.handle, out volume, IntPtr.Zero); + } + public RESULT getVolume(out float volume, out float finalvolume) + { + return FMOD_Studio_EventInstance_GetVolume(this.handle, out volume, out finalvolume); + } + public RESULT setVolume(float volume) + { + return FMOD_Studio_EventInstance_SetVolume(this.handle, volume); + } + public RESULT getPitch(out float pitch) + { + return FMOD_Studio_EventInstance_GetPitch(this.handle, out pitch, IntPtr.Zero); + } + public RESULT getPitch(out float pitch, out float finalpitch) + { + return FMOD_Studio_EventInstance_GetPitch(this.handle, out pitch, out finalpitch); + } + public RESULT setPitch(float pitch) + { + return FMOD_Studio_EventInstance_SetPitch(this.handle, pitch); + } + public RESULT get3DAttributes(out ATTRIBUTES_3D attributes) + { + return FMOD_Studio_EventInstance_Get3DAttributes(this.handle, out attributes); + } + public RESULT set3DAttributes(ATTRIBUTES_3D attributes) + { + return FMOD_Studio_EventInstance_Set3DAttributes(this.handle, ref attributes); + } + public RESULT getListenerMask(out uint mask) + { + return FMOD_Studio_EventInstance_GetListenerMask(this.handle, out mask); + } + public RESULT setListenerMask(uint mask) + { + return FMOD_Studio_EventInstance_SetListenerMask(this.handle, mask); + } + public RESULT getProperty(EVENT_PROPERTY index, out float value) + { + return FMOD_Studio_EventInstance_GetProperty(this.handle, index, out value); + } + public RESULT setProperty(EVENT_PROPERTY index, float value) + { + return FMOD_Studio_EventInstance_SetProperty(this.handle, index, value); + } + public RESULT getReverbLevel(int index, out float level) + { + return FMOD_Studio_EventInstance_GetReverbLevel(this.handle, index, out level); + } + public RESULT setReverbLevel(int index, float level) + { + return FMOD_Studio_EventInstance_SetReverbLevel(this.handle, index, level); + } + public RESULT getPaused(out bool paused) + { + return FMOD_Studio_EventInstance_GetPaused(this.handle, out paused); + } + public RESULT setPaused(bool paused) + { + return FMOD_Studio_EventInstance_SetPaused(this.handle, paused); + } + public RESULT start() + { + return FMOD_Studio_EventInstance_Start(this.handle); + } + public RESULT stop(STOP_MODE mode) + { + return FMOD_Studio_EventInstance_Stop(this.handle, mode); + } + public RESULT getTimelinePosition(out int position) + { + return FMOD_Studio_EventInstance_GetTimelinePosition(this.handle, out position); + } + public RESULT setTimelinePosition(int position) + { + return FMOD_Studio_EventInstance_SetTimelinePosition(this.handle, position); + } + public RESULT getPlaybackState(out PLAYBACK_STATE state) + { + return FMOD_Studio_EventInstance_GetPlaybackState(this.handle, out state); + } + public RESULT getChannelGroup(out FMOD.ChannelGroup group) + { + return FMOD_Studio_EventInstance_GetChannelGroup(this.handle, out group.handle); + } + public RESULT getMinMaxDistance(out float min, out float max) + { + return FMOD_Studio_EventInstance_GetMinMaxDistance(this.handle, out min, out max); + } + public RESULT release() + { + return FMOD_Studio_EventInstance_Release(this.handle); + } + public RESULT isVirtual(out bool virtualstate) + { + return FMOD_Studio_EventInstance_IsVirtual(this.handle, out virtualstate); + } + public RESULT getParameterByID(PARAMETER_ID id, out float value) + { + float finalvalue; + return getParameterByID(id, out value, out finalvalue); + } + public RESULT getParameterByID(PARAMETER_ID id, out float value, out float finalvalue) + { + return FMOD_Studio_EventInstance_GetParameterByID(this.handle, id, out value, out finalvalue); + } + public RESULT setParameterByID(PARAMETER_ID id, float value, bool ignoreseekspeed = false) + { + return FMOD_Studio_EventInstance_SetParameterByID(this.handle, id, value, ignoreseekspeed); + } + public RESULT setParameterByIDWithLabel(PARAMETER_ID id, string label, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventInstance_SetParameterByIDWithLabel(this.handle, id, encoder.byteFromStringUTF8(label), ignoreseekspeed); + } + } + public RESULT setParametersByIDs(PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed = false) + { + return FMOD_Studio_EventInstance_SetParametersByIDs(this.handle, ids, values, count, ignoreseekspeed); + } + public RESULT getParameterByName(string name, out float value) + { + float finalValue; + return getParameterByName(name, out value, out finalValue); + } + public RESULT getParameterByName(string name, out float value, out float finalvalue) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventInstance_GetParameterByName(this.handle, encoder.byteFromStringUTF8(name), out value, out finalvalue); + } + } + public RESULT setParameterByName(string name, float value, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventInstance_SetParameterByName(this.handle, encoder.byteFromStringUTF8(name), value, ignoreseekspeed); + } + } + public RESULT setParameterByNameWithLabel(string name, string label, bool ignoreseekspeed = false) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper(), + labelEncoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_EventInstance_SetParameterByNameWithLabel(this.handle, encoder.byteFromStringUTF8(name), labelEncoder.byteFromStringUTF8(label), ignoreseekspeed); + } + } + public RESULT keyOff() + { + return FMOD_Studio_EventInstance_KeyOff(this.handle); + } + public RESULT setCallback(EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask = EVENT_CALLBACK_TYPE.ALL) + { + return FMOD_Studio_EventInstance_SetCallback(this.handle, callback, callbackmask); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD_Studio_EventInstance_GetUserData(this.handle, out userdata); + } + public RESULT setUserData(IntPtr userdata) + { + return FMOD_Studio_EventInstance_SetUserData(this.handle, userdata); + } + public RESULT getCPUUsage(out uint exclusive, out uint inclusive) + { + return FMOD_Studio_EventInstance_GetCPUUsage(this.handle, out exclusive, out inclusive); + } + public RESULT getMemoryUsage(out MEMORY_USAGE memoryusage) + { + return FMOD_Studio_EventInstance_GetMemoryUsage(this.handle, out memoryusage); + } + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_EventInstance_IsValid (IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetDescription (IntPtr _event, out IntPtr description); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetVolume (IntPtr _event, out float volume, IntPtr zero); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetVolume (IntPtr _event, out float volume, out float finalvolume); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetVolume (IntPtr _event, float volume); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetPitch (IntPtr _event, out float pitch, IntPtr zero); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetPitch (IntPtr _event, out float pitch, out float finalpitch); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetPitch (IntPtr _event, float pitch); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_Get3DAttributes (IntPtr _event, out ATTRIBUTES_3D attributes); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_Set3DAttributes (IntPtr _event, ref ATTRIBUTES_3D attributes); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetListenerMask (IntPtr _event, out uint mask); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetListenerMask (IntPtr _event, uint mask); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetProperty (IntPtr _event, EVENT_PROPERTY index, out float value); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetProperty (IntPtr _event, EVENT_PROPERTY index, float value); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetReverbLevel (IntPtr _event, int index, out float level); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetReverbLevel (IntPtr _event, int index, float level); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetPaused (IntPtr _event, out bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetPaused (IntPtr _event, bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_Start (IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_Stop (IntPtr _event, STOP_MODE mode); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetTimelinePosition (IntPtr _event, out int position); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetTimelinePosition (IntPtr _event, int position); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetPlaybackState (IntPtr _event, out PLAYBACK_STATE state); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetChannelGroup (IntPtr _event, out IntPtr group); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetMinMaxDistance (IntPtr _event, out float min, out float max); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_Release (IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_IsVirtual (IntPtr _event, out bool virtualstate); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetParameterByName (IntPtr _event, byte[] name, out float value, out float finalvalue); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetParameterByName (IntPtr _event, byte[] name, float value, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetParameterByNameWithLabel (IntPtr _event, byte[] name, byte[] label, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetParameterByID (IntPtr _event, PARAMETER_ID id, out float value, out float finalvalue); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetParameterByID (IntPtr _event, PARAMETER_ID id, float value, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetParameterByIDWithLabel (IntPtr _event, PARAMETER_ID id, byte[] label, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetParametersByIDs (IntPtr _event, PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_KeyOff (IntPtr _event); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetCallback (IntPtr _event, EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask); + [DllImport (STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetUserData (IntPtr _event, out IntPtr userdata); + [DllImport (STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_SetUserData (IntPtr _event, IntPtr userdata); + [DllImport (STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetCPUUsage (IntPtr _event, out uint exclusive, out uint inclusive); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_EventInstance_GetMemoryUsage (IntPtr _event, out MEMORY_USAGE memoryusage); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public EventInstance(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_EventInstance_IsValid(this.handle); + } + + #endregion + } + + public struct Bus + { + public RESULT getID(out GUID id) + { + return FMOD_Studio_Bus_GetID(this.handle, out id); + } + public RESULT getPath(out string path) + { + path = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_Bus_GetPath(this.handle, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_Bus_GetPath(this.handle, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + + } + public RESULT getVolume(out float volume) + { + float finalVolume; + return getVolume(out volume, out finalVolume); + } + public RESULT getVolume(out float volume, out float finalvolume) + { + return FMOD_Studio_Bus_GetVolume(this.handle, out volume, out finalvolume); + } + public RESULT setVolume(float volume) + { + return FMOD_Studio_Bus_SetVolume(this.handle, volume); + } + public RESULT getPaused(out bool paused) + { + return FMOD_Studio_Bus_GetPaused(this.handle, out paused); + } + public RESULT setPaused(bool paused) + { + return FMOD_Studio_Bus_SetPaused(this.handle, paused); + } + public RESULT getMute(out bool mute) + { + return FMOD_Studio_Bus_GetMute(this.handle, out mute); + } + public RESULT setMute(bool mute) + { + return FMOD_Studio_Bus_SetMute(this.handle, mute); + } + public RESULT stopAllEvents(STOP_MODE mode) + { + return FMOD_Studio_Bus_StopAllEvents(this.handle, mode); + } + public RESULT lockChannelGroup() + { + return FMOD_Studio_Bus_LockChannelGroup(this.handle); + } + public RESULT unlockChannelGroup() + { + return FMOD_Studio_Bus_UnlockChannelGroup(this.handle); + } + public RESULT getChannelGroup(out FMOD.ChannelGroup group) + { + return FMOD_Studio_Bus_GetChannelGroup(this.handle, out group.handle); + } + public RESULT getCPUUsage(out uint exclusive, out uint inclusive) + { + return FMOD_Studio_Bus_GetCPUUsage(this.handle, out exclusive, out inclusive); + } + public RESULT getMemoryUsage(out MEMORY_USAGE memoryusage) + { + return FMOD_Studio_Bus_GetMemoryUsage(this.handle, out memoryusage); + } + public RESULT getPortIndex(out ulong index) + { + return FMOD_Studio_Bus_GetPortIndex(this.handle, out index); + } + public RESULT setPortIndex(ulong index) + { + return FMOD_Studio_Bus_SetPortIndex(this.handle, index); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_Bus_IsValid (IntPtr bus); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetID (IntPtr bus, out GUID id); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetPath (IntPtr bus, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetVolume (IntPtr bus, out float volume, out float finalvolume); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_SetVolume (IntPtr bus, float volume); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetPaused (IntPtr bus, out bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_SetPaused (IntPtr bus, bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetMute (IntPtr bus, out bool mute); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_SetMute (IntPtr bus, bool mute); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_StopAllEvents (IntPtr bus, STOP_MODE mode); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_LockChannelGroup (IntPtr bus); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_UnlockChannelGroup (IntPtr bus); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetChannelGroup (IntPtr bus, out IntPtr group); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetCPUUsage (IntPtr bus, out uint exclusive, out uint inclusive); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetMemoryUsage (IntPtr bus, out MEMORY_USAGE memoryusage); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_GetPortIndex (IntPtr bus, out ulong index); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bus_SetPortIndex (IntPtr bus, ulong index); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Bus(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_Bus_IsValid(this.handle); + } + + #endregion + } + + public struct VCA + { + public RESULT getID(out GUID id) + { + return FMOD_Studio_VCA_GetID(this.handle, out id); + } + public RESULT getPath(out string path) + { + path = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_VCA_GetPath(this.handle, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_VCA_GetPath(this.handle, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getVolume(out float volume) + { + float finalVolume; + return getVolume(out volume, out finalVolume); + } + public RESULT getVolume(out float volume, out float finalvolume) + { + return FMOD_Studio_VCA_GetVolume(this.handle, out volume, out finalvolume); + } + public RESULT setVolume(float volume) + { + return FMOD_Studio_VCA_SetVolume(this.handle, volume); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_VCA_IsValid (IntPtr vca); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_VCA_GetID (IntPtr vca, out GUID id); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_VCA_GetPath (IntPtr vca, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_VCA_GetVolume (IntPtr vca, out float volume, out float finalvolume); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_VCA_SetVolume (IntPtr vca, float volume); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public VCA(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_VCA_IsValid(this.handle); + } + + #endregion + } + + public struct Bank + { + // Property access + + public RESULT getID(out GUID id) + { + return FMOD_Studio_Bank_GetID(this.handle, out id); + } + public RESULT getPath(out string path) + { + path = null; + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_Bank_GetPath(this.handle, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_Bank_GetPath(this.handle, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT unload() + { + return FMOD_Studio_Bank_Unload(this.handle); + } + public RESULT loadSampleData() + { + return FMOD_Studio_Bank_LoadSampleData(this.handle); + } + public RESULT unloadSampleData() + { + return FMOD_Studio_Bank_UnloadSampleData(this.handle); + } + public RESULT getLoadingState(out LOADING_STATE state) + { + return FMOD_Studio_Bank_GetLoadingState(this.handle, out state); + } + public RESULT getSampleLoadingState(out LOADING_STATE state) + { + return FMOD_Studio_Bank_GetSampleLoadingState(this.handle, out state); + } + + // Enumeration + public RESULT getStringCount(out int count) + { + return FMOD_Studio_Bank_GetStringCount(this.handle, out count); + } + public RESULT getStringInfo(int index, out GUID id, out string path) + { + path = null; + id = new GUID(); + + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + IntPtr stringMem = Marshal.AllocHGlobal(256); + int retrieved = 0; + RESULT result = FMOD_Studio_Bank_GetStringInfo(this.handle, index, out id, stringMem, 256, out retrieved); + + if (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringMem = Marshal.AllocHGlobal(retrieved); + result = FMOD_Studio_Bank_GetStringInfo(this.handle, index, out id, stringMem, retrieved, out retrieved); + } + + if (result == RESULT.OK) + { + path = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + + public RESULT getEventCount(out int count) + { + return FMOD_Studio_Bank_GetEventCount(this.handle, out count); + } + public RESULT getEventList(out EventDescription[] array) + { + array = null; + + RESULT result; + int capacity; + result = FMOD_Studio_Bank_GetEventCount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new EventDescription[0]; + return result; + } + + IntPtr[] rawArray = new IntPtr[capacity]; + int actualCount; + result = FMOD_Studio_Bank_GetEventList(this.handle, rawArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + if (actualCount > capacity) // More items added since we queried just now? + { + actualCount = capacity; + } + array = new EventDescription[actualCount]; + for (int i = 0; i < actualCount; ++i) + { + array[i].handle = rawArray[i]; + } + return RESULT.OK; + } + public RESULT getBusCount(out int count) + { + return FMOD_Studio_Bank_GetBusCount(this.handle, out count); + } + public RESULT getBusList(out Bus[] array) + { + array = null; + + RESULT result; + int capacity; + result = FMOD_Studio_Bank_GetBusCount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new Bus[0]; + return result; + } + + IntPtr[] rawArray = new IntPtr[capacity]; + int actualCount; + result = FMOD_Studio_Bank_GetBusList(this.handle, rawArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + if (actualCount > capacity) // More items added since we queried just now? + { + actualCount = capacity; + } + array = new Bus[actualCount]; + for (int i = 0; i < actualCount; ++i) + { + array[i].handle = rawArray[i]; + } + return RESULT.OK; + } + public RESULT getVCACount(out int count) + { + return FMOD_Studio_Bank_GetVCACount(this.handle, out count); + } + public RESULT getVCAList(out VCA[] array) + { + array = null; + + RESULT result; + int capacity; + result = FMOD_Studio_Bank_GetVCACount(this.handle, out capacity); + if (result != RESULT.OK) + { + return result; + } + if (capacity == 0) + { + array = new VCA[0]; + return result; + } + + IntPtr[] rawArray = new IntPtr[capacity]; + int actualCount; + result = FMOD_Studio_Bank_GetVCAList(this.handle, rawArray, capacity, out actualCount); + if (result != RESULT.OK) + { + return result; + } + if (actualCount > capacity) // More items added since we queried just now? + { + actualCount = capacity; + } + array = new VCA[actualCount]; + for (int i = 0; i < actualCount; ++i) + { + array[i].handle = rawArray[i]; + } + return RESULT.OK; + } + + public RESULT getUserData(out IntPtr userdata) + { + return FMOD_Studio_Bank_GetUserData(this.handle, out userdata); + } + + public RESULT setUserData(IntPtr userdata) + { + return FMOD_Studio_Bank_SetUserData(this.handle, userdata); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_Bank_IsValid (IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetID (IntPtr bank, out GUID id); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetPath (IntPtr bank, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_Unload (IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_LoadSampleData (IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_UnloadSampleData (IntPtr bank); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetLoadingState (IntPtr bank, out LOADING_STATE state); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetSampleLoadingState (IntPtr bank, out LOADING_STATE state); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetStringCount (IntPtr bank, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetStringInfo (IntPtr bank, int index, out GUID id, IntPtr path, int size, out int retrieved); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetEventCount (IntPtr bank, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetEventList (IntPtr bank, IntPtr[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetBusCount (IntPtr bank, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetBusList (IntPtr bank, IntPtr[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetVCACount (IntPtr bank, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetVCAList (IntPtr bank, IntPtr[] array, int capacity, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_GetUserData (IntPtr bank, out IntPtr userdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_Bank_SetUserData (IntPtr bank, IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public Bank(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_Bank_IsValid(this.handle); + } + + #endregion + } + + public struct CommandReplay + { + // Information query + public RESULT getSystem(out System system) + { + return FMOD_Studio_CommandReplay_GetSystem(this.handle, out system.handle); + } + + public RESULT getLength(out float length) + { + return FMOD_Studio_CommandReplay_GetLength(this.handle, out length); + } + public RESULT getCommandCount(out int count) + { + return FMOD_Studio_CommandReplay_GetCommandCount(this.handle, out count); + } + public RESULT getCommandInfo(int commandIndex, out COMMAND_INFO info) + { + return FMOD_Studio_CommandReplay_GetCommandInfo(this.handle, commandIndex, out info); + } + + public RESULT getCommandString(int commandIndex, out string buffer) + { + buffer = null; + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + int stringLength = 256; + IntPtr stringMem = Marshal.AllocHGlobal(256); + RESULT result = FMOD_Studio_CommandReplay_GetCommandString(this.handle, commandIndex, stringMem, stringLength); + + while (result == RESULT.ERR_TRUNCATED) + { + Marshal.FreeHGlobal(stringMem); + stringLength *= 2; + stringMem = Marshal.AllocHGlobal(stringLength); + result = FMOD_Studio_CommandReplay_GetCommandString(this.handle, commandIndex, stringMem, stringLength); + } + + if (result == RESULT.OK) + { + buffer = encoder.stringFromNative(stringMem); + } + Marshal.FreeHGlobal(stringMem); + return result; + } + } + public RESULT getCommandAtTime(float time, out int commandIndex) + { + return FMOD_Studio_CommandReplay_GetCommandAtTime(this.handle, time, out commandIndex); + } + // Playback + public RESULT setBankPath(string bankPath) + { + using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) + { + return FMOD_Studio_CommandReplay_SetBankPath(this.handle, encoder.byteFromStringUTF8(bankPath)); + } + } + public RESULT start() + { + return FMOD_Studio_CommandReplay_Start(this.handle); + } + public RESULT stop() + { + return FMOD_Studio_CommandReplay_Stop(this.handle); + } + public RESULT seekToTime(float time) + { + return FMOD_Studio_CommandReplay_SeekToTime(this.handle, time); + } + public RESULT seekToCommand(int commandIndex) + { + return FMOD_Studio_CommandReplay_SeekToCommand(this.handle, commandIndex); + } + public RESULT getPaused(out bool paused) + { + return FMOD_Studio_CommandReplay_GetPaused(this.handle, out paused); + } + public RESULT setPaused(bool paused) + { + return FMOD_Studio_CommandReplay_SetPaused(this.handle, paused); + } + public RESULT getPlaybackState(out PLAYBACK_STATE state) + { + return FMOD_Studio_CommandReplay_GetPlaybackState(this.handle, out state); + } + public RESULT getCurrentCommand(out int commandIndex, out float currentTime) + { + return FMOD_Studio_CommandReplay_GetCurrentCommand(this.handle, out commandIndex, out currentTime); + } + // Release + public RESULT release() + { + return FMOD_Studio_CommandReplay_Release(this.handle); + } + // Callbacks + public RESULT setFrameCallback(COMMANDREPLAY_FRAME_CALLBACK callback) + { + return FMOD_Studio_CommandReplay_SetFrameCallback(this.handle, callback); + } + public RESULT setLoadBankCallback(COMMANDREPLAY_LOAD_BANK_CALLBACK callback) + { + return FMOD_Studio_CommandReplay_SetLoadBankCallback(this.handle, callback); + } + public RESULT setCreateInstanceCallback(COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback) + { + return FMOD_Studio_CommandReplay_SetCreateInstanceCallback(this.handle, callback); + } + public RESULT getUserData(out IntPtr userdata) + { + return FMOD_Studio_CommandReplay_GetUserData(this.handle, out userdata); + } + public RESULT setUserData(IntPtr userdata) + { + return FMOD_Studio_CommandReplay_SetUserData(this.handle, userdata); + } + + #region importfunctions + [DllImport(STUDIO_VERSION.dll)] + private static extern bool FMOD_Studio_CommandReplay_IsValid (IntPtr replay); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetSystem (IntPtr replay, out IntPtr system); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetLength (IntPtr replay, out float length); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetCommandCount (IntPtr replay, out int count); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetCommandInfo (IntPtr replay, int commandindex, out COMMAND_INFO info); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetCommandString (IntPtr replay, int commandIndex, IntPtr buffer, int length); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetCommandAtTime (IntPtr replay, float time, out int commandIndex); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetBankPath (IntPtr replay, byte[] bankPath); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_Start (IntPtr replay); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_Stop (IntPtr replay); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SeekToTime (IntPtr replay, float time); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SeekToCommand (IntPtr replay, int commandIndex); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetPaused (IntPtr replay, out bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetPaused (IntPtr replay, bool paused); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetPlaybackState (IntPtr replay, out PLAYBACK_STATE state); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetCurrentCommand (IntPtr replay, out int commandIndex, out float currentTime); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_Release (IntPtr replay); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetFrameCallback (IntPtr replay, COMMANDREPLAY_FRAME_CALLBACK callback); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetLoadBankCallback (IntPtr replay, COMMANDREPLAY_LOAD_BANK_CALLBACK callback); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetCreateInstanceCallback(IntPtr replay, COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_GetUserData (IntPtr replay, out IntPtr userdata); + [DllImport(STUDIO_VERSION.dll)] + private static extern RESULT FMOD_Studio_CommandReplay_SetUserData (IntPtr replay, IntPtr userdata); + #endregion + + #region wrapperinternal + + public IntPtr handle; + + public CommandReplay(IntPtr ptr) { this.handle = ptr; } + public bool hasHandle() { return this.handle != IntPtr.Zero; } + public void clearHandle() { this.handle = IntPtr.Zero; } + + public bool isValid() + { + return hasHandle() && FMOD_Studio_CommandReplay_IsValid(this.handle); + } + + #endregion + } +} // FMOD diff --git a/modules/fmod/inc/fmod_studio.h b/modules/fmod/inc/fmod_studio.h new file mode 100644 index 0000000..cda39e5 --- /dev/null +++ b/modules/fmod/inc/fmod_studio.h @@ -0,0 +1,248 @@ +/* ======================================================================================== */ +/* FMOD Studio API - C header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* Use this header in conjunction with fmod_studio_common.h (which contains all the */ +/* constants / callbacks) to develop using the C language. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/studio-api.html */ +/* ======================================================================================== */ +#ifndef FMOD_STUDIO_H +#define FMOD_STUDIO_H + +#include "fmod_studio_common.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* + Global +*/ +FMOD_RESULT F_API FMOD_Studio_ParseID(const char *idstring, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_System_Create(FMOD_STUDIO_SYSTEM **system, unsigned int headerversion); + +/* + System +*/ +FMOD_BOOL F_API FMOD_Studio_System_IsValid(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_SetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_Studio_System_GetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings); +FMOD_RESULT F_API FMOD_Studio_System_Initialize(FMOD_STUDIO_SYSTEM *system, int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata); +FMOD_RESULT F_API FMOD_Studio_System_Release(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_Update(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_GetCoreSystem(FMOD_STUDIO_SYSTEM *system, FMOD_SYSTEM **coresystem); +FMOD_RESULT F_API FMOD_Studio_System_GetEvent(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_EVENTDESCRIPTION **event); +FMOD_RESULT F_API FMOD_Studio_System_GetBus(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BUS **bus); +FMOD_RESULT F_API FMOD_Studio_System_GetVCA(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_VCA **vca); +FMOD_RESULT F_API FMOD_Studio_System_GetBank(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_GetEventByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_EVENTDESCRIPTION **event); +FMOD_RESULT F_API FMOD_Studio_System_GetBusByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BUS **bus); +FMOD_RESULT F_API FMOD_Studio_System_GetVCAByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_VCA **vca); +FMOD_RESULT F_API FMOD_Studio_System_GetBankByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_GetSoundInfo(FMOD_STUDIO_SYSTEM *system, const char *key, FMOD_STUDIO_SOUND_INFO *info); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionByName(FMOD_STUDIO_SYSTEM *system, const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterLabelByName(FMOD_STUDIO_SYSTEM *system, const char *name, int labelindex, char *label, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterLabelByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue); +FMOD_RESULT F_API FMOD_Studio_System_SetParameterByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, float value, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_System_SetParameterByIDWithLabel(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, const char *label, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_System_SetParametersByIDs(FMOD_STUDIO_SYSTEM *system, const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterByName(FMOD_STUDIO_SYSTEM *system, const char *name, float *value, float *finalvalue); +FMOD_RESULT F_API FMOD_Studio_System_SetParameterByName(FMOD_STUDIO_SYSTEM *system, const char *name, float value, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_System_SetParameterByNameWithLabel(FMOD_STUDIO_SYSTEM *system, const char *name, const char *label, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_System_LookupID(FMOD_STUDIO_SYSTEM *system, const char *path, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_System_LookupPath(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_System_GetNumListeners(FMOD_STUDIO_SYSTEM *system, int *numlisteners); +FMOD_RESULT F_API FMOD_Studio_System_SetNumListeners(FMOD_STUDIO_SYSTEM *system, int numlisteners); +FMOD_RESULT F_API FMOD_Studio_System_GetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, FMOD_3D_ATTRIBUTES *attributes, FMOD_VECTOR *attenuationposition); +FMOD_RESULT F_API FMOD_Studio_System_SetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, const FMOD_3D_ATTRIBUTES *attributes, const FMOD_VECTOR *attenuationposition); +FMOD_RESULT F_API FMOD_Studio_System_GetListenerWeight(FMOD_STUDIO_SYSTEM *system, int index, float *weight); +FMOD_RESULT F_API FMOD_Studio_System_SetListenerWeight(FMOD_STUDIO_SYSTEM *system, int index, float weight); +FMOD_RESULT F_API FMOD_Studio_System_LoadBankFile(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_LoadBankMemory(FMOD_STUDIO_SYSTEM *system, const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_LoadBankCustom(FMOD_STUDIO_SYSTEM *system, const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank); +FMOD_RESULT F_API FMOD_Studio_System_RegisterPlugin(FMOD_STUDIO_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description); +FMOD_RESULT F_API FMOD_Studio_System_UnregisterPlugin(FMOD_STUDIO_SYSTEM *system, const char *name); +FMOD_RESULT F_API FMOD_Studio_System_UnloadAll(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_FlushCommands(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_FlushSampleLoading(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_StartCommandCapture(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags); +FMOD_RESULT F_API FMOD_Studio_System_StopCommandCapture(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_LoadCommandReplay(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, FMOD_STUDIO_COMMANDREPLAY **replay); +FMOD_RESULT F_API FMOD_Studio_System_GetBankCount(FMOD_STUDIO_SYSTEM *system, int *count); +FMOD_RESULT F_API FMOD_Studio_System_GetBankList(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BANK **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionCount(FMOD_STUDIO_SYSTEM *system, int *count); +FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionList(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_DESCRIPTION *array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_System_GetCPUUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_CPU_USAGE *usage, FMOD_CPU_USAGE *usage_core); +FMOD_RESULT F_API FMOD_Studio_System_GetBufferUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BUFFER_USAGE *usage); +FMOD_RESULT F_API FMOD_Studio_System_ResetBufferUsage(FMOD_STUDIO_SYSTEM *system); +FMOD_RESULT F_API FMOD_Studio_System_SetCallback(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask); +FMOD_RESULT F_API FMOD_Studio_System_SetUserData(FMOD_STUDIO_SYSTEM *system, void *userdata); +FMOD_RESULT F_API FMOD_Studio_System_GetUserData(FMOD_STUDIO_SYSTEM *system, void **userdata); +FMOD_RESULT F_API FMOD_Studio_System_GetMemoryUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_MEMORY_USAGE *memoryusage); + +/* + EventDescription +*/ +FMOD_BOOL F_API FMOD_Studio_EventDescription_IsValid(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetPath(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByName(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, int labelindex, char *label, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByName(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, int labelindex, char *label, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_USER_PROPERTY *property); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserProperty(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_USER_PROPERTY *property); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetLength(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *length); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetMinMaxDistance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *min, float *max); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetSoundSize(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *size); +FMOD_RESULT F_API FMOD_Studio_EventDescription_IsSnapshot(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *snapshot); +FMOD_RESULT F_API FMOD_Studio_EventDescription_IsOneshot(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *oneshot); +FMOD_RESULT F_API FMOD_Studio_EventDescription_IsStream(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *isStream); +FMOD_RESULT F_API FMOD_Studio_EventDescription_Is3D(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *is3D); +FMOD_RESULT F_API FMOD_Studio_EventDescription_IsDopplerEnabled(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *doppler); +FMOD_RESULT F_API FMOD_Studio_EventDescription_HasSustainPoint(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *sustainPoint); +FMOD_RESULT F_API FMOD_Studio_EventDescription_CreateInstance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **instance); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceList(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_EventDescription_LoadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription); +FMOD_RESULT F_API FMOD_Studio_EventDescription_UnloadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetSampleLoadingState(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_LOADING_STATE *state); +FMOD_RESULT F_API FMOD_Studio_EventDescription_ReleaseAllInstances(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription); +FMOD_RESULT F_API FMOD_Studio_EventDescription_SetCallback(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask); +FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void **userdata); +FMOD_RESULT F_API FMOD_Studio_EventDescription_SetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void *userdata); + +/* + EventInstance +*/ +FMOD_BOOL F_API FMOD_Studio_EventInstance_IsValid(FMOD_STUDIO_EVENTINSTANCE *eventinstance); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetDescription(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENTDESCRIPTION **description); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *volume, float *finalvolume); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float volume); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *pitch, float *finalpitch); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float pitch); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Get3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Set3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetListenerMask(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int *mask); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetListenerMask(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int mask); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float *value); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float value); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetReverbLevel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float *level); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetReverbLevel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float level); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Start(FMOD_STUDIO_EVENTINSTANCE *eventinstance); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Stop(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_STOP_MODE mode); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int *position); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int position); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPlaybackState(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PLAYBACK_STATE *state); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetChannelGroup(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_CHANNELGROUP **group); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetMinMaxDistance(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *min, float *max); +FMOD_RESULT F_API FMOD_Studio_EventInstance_Release(FMOD_STUDIO_EVENTINSTANCE *eventinstance); +FMOD_RESULT F_API FMOD_Studio_EventInstance_IsVirtual(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *virtualstate); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterByName(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, float *value, float *finalvalue); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByName(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, float value, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByNameWithLabel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, const char *label, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterByID(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByID(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, float value, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByIDWithLabel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, const char *label, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParametersByIDs(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, FMOD_BOOL ignoreseekspeed); +FMOD_RESULT F_API FMOD_Studio_EventInstance_KeyOff(FMOD_STUDIO_EVENTINSTANCE *eventinstance); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetCallback(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void **userdata); +FMOD_RESULT F_API FMOD_Studio_EventInstance_SetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void *userdata); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetCPUUsage(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int *exclusive, unsigned int *inclusive); +FMOD_RESULT F_API FMOD_Studio_EventInstance_GetMemoryUsage(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_MEMORY_USAGE *memoryusage); + +/* + Bus +*/ +FMOD_BOOL F_API FMOD_Studio_Bus_IsValid(FMOD_STUDIO_BUS *bus); +FMOD_RESULT F_API FMOD_Studio_Bus_GetID(FMOD_STUDIO_BUS *bus, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_Bus_GetPath(FMOD_STUDIO_BUS *bus, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_Bus_GetVolume(FMOD_STUDIO_BUS *bus, float *volume, float *finalvolume); +FMOD_RESULT F_API FMOD_Studio_Bus_SetVolume(FMOD_STUDIO_BUS *bus, float volume); +FMOD_RESULT F_API FMOD_Studio_Bus_GetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Studio_Bus_SetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Studio_Bus_GetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL *mute); +FMOD_RESULT F_API FMOD_Studio_Bus_SetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL mute); +FMOD_RESULT F_API FMOD_Studio_Bus_StopAllEvents(FMOD_STUDIO_BUS *bus, FMOD_STUDIO_STOP_MODE mode); +FMOD_RESULT F_API FMOD_Studio_Bus_GetPortIndex(FMOD_STUDIO_BUS *bus, FMOD_PORT_INDEX *index); +FMOD_RESULT F_API FMOD_Studio_Bus_SetPortIndex(FMOD_STUDIO_BUS *bus, FMOD_PORT_INDEX index); +FMOD_RESULT F_API FMOD_Studio_Bus_LockChannelGroup(FMOD_STUDIO_BUS *bus); +FMOD_RESULT F_API FMOD_Studio_Bus_UnlockChannelGroup(FMOD_STUDIO_BUS *bus); +FMOD_RESULT F_API FMOD_Studio_Bus_GetChannelGroup(FMOD_STUDIO_BUS *bus, FMOD_CHANNELGROUP **group); +FMOD_RESULT F_API FMOD_Studio_Bus_GetCPUUsage(FMOD_STUDIO_BUS *bus, unsigned int *exclusive, unsigned int *inclusive); +FMOD_RESULT F_API FMOD_Studio_Bus_GetMemoryUsage(FMOD_STUDIO_BUS *bus, FMOD_STUDIO_MEMORY_USAGE *memoryusage); + +/* + VCA +*/ +FMOD_BOOL F_API FMOD_Studio_VCA_IsValid(FMOD_STUDIO_VCA *vca); +FMOD_RESULT F_API FMOD_Studio_VCA_GetID(FMOD_STUDIO_VCA *vca, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_VCA_GetPath(FMOD_STUDIO_VCA *vca, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_VCA_GetVolume(FMOD_STUDIO_VCA *vca, float *volume, float *finalvolume); +FMOD_RESULT F_API FMOD_Studio_VCA_SetVolume(FMOD_STUDIO_VCA *vca, float volume); + +/* + Bank +*/ +FMOD_BOOL F_API FMOD_Studio_Bank_IsValid(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_GetID(FMOD_STUDIO_BANK *bank, FMOD_GUID *id); +FMOD_RESULT F_API FMOD_Studio_Bank_GetPath(FMOD_STUDIO_BANK *bank, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_Bank_Unload(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_LoadSampleData(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_UnloadSampleData(FMOD_STUDIO_BANK *bank); +FMOD_RESULT F_API FMOD_Studio_Bank_GetLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state); +FMOD_RESULT F_API FMOD_Studio_Bank_GetSampleLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state); +FMOD_RESULT F_API FMOD_Studio_Bank_GetStringCount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetStringInfo(FMOD_STUDIO_BANK *bank, int index, FMOD_GUID *id, char *path, int size, int *retrieved); +FMOD_RESULT F_API FMOD_Studio_Bank_GetEventCount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetEventList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_EVENTDESCRIPTION **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetBusCount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetBusList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_BUS **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetVCACount(FMOD_STUDIO_BANK *bank, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetVCAList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_VCA **array, int capacity, int *count); +FMOD_RESULT F_API FMOD_Studio_Bank_GetUserData(FMOD_STUDIO_BANK *bank, void **userdata); +FMOD_RESULT F_API FMOD_Studio_Bank_SetUserData(FMOD_STUDIO_BANK *bank, void *userdata); + +/* + Command playback information +*/ +FMOD_BOOL F_API FMOD_Studio_CommandReplay_IsValid(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetSystem(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_SYSTEM **system); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetLength(FMOD_STUDIO_COMMANDREPLAY *replay, float *length); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandCount(FMOD_STUDIO_COMMANDREPLAY *replay, int *count); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandInfo(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, FMOD_STUDIO_COMMAND_INFO *info); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandString(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, char *buffer, int length); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandAtTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time, int *commandindex); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetBankPath(FMOD_STUDIO_COMMANDREPLAY *replay, const char *bankPath); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_Start(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_Stop(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL *paused); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL paused); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPlaybackState(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_PLAYBACK_STATE *state); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCurrentCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int *commandindex, float *currenttime); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_Release(FMOD_STUDIO_COMMANDREPLAY *replay); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetFrameCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void **userdata); +FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void *userdata); + +#ifdef __cplusplus +} +#endif + +#endif /* FMOD_STUDIO_H */ diff --git a/modules/fmod/inc/fmod_studio.hpp b/modules/fmod/inc/fmod_studio.hpp new file mode 100644 index 0000000..0955a9c --- /dev/null +++ b/modules/fmod/inc/fmod_studio.hpp @@ -0,0 +1,402 @@ +/* ======================================================================================== */ +/* FMOD Studio API - C++ header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* Use this header in conjunction with fmod_studio_common.h (which contains all the */ +/* constants / callbacks) to develop using the C++ language. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/studio-api.html */ +/* ======================================================================================== */ +#ifndef FMOD_STUDIO_HPP +#define FMOD_STUDIO_HPP + +#include "fmod_studio_common.h" +#include "fmod_studio.h" + +#include "fmod.hpp" + +namespace FMOD +{ + +namespace Studio +{ + typedef FMOD_GUID ID; // Deprecated. Please use FMOD_GUID type. + + class System; + class EventDescription; + class EventInstance; + class Bus; + class VCA; + class Bank; + class CommandReplay; + + inline FMOD_RESULT parseID(const char *idstring, FMOD_GUID *id) { return FMOD_Studio_ParseID(idstring, id); } + + class System + { + private: + // Constructor made private so user cannot statically instance a System class. System::create must be used. + System(); + System(const System &); + + public: + static FMOD_RESULT F_API create(System **system, unsigned int headerversion = FMOD_VERSION); + FMOD_RESULT F_API setAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API getAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings); + FMOD_RESULT F_API initialize(int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata); + FMOD_RESULT F_API release(); + + // Handle validity + bool F_API isValid() const; + + // Update processing + FMOD_RESULT F_API update(); + FMOD_RESULT F_API flushCommands(); + FMOD_RESULT F_API flushSampleLoading(); + + // Low-level API access + FMOD_RESULT F_API getCoreSystem(FMOD::System **system) const; + + // Asset retrieval + FMOD_RESULT F_API getEvent(const char *path, EventDescription **event) const; + FMOD_RESULT F_API getBus(const char *path, Bus **bus) const; + FMOD_RESULT F_API getVCA(const char *path, VCA **vca) const; + FMOD_RESULT F_API getBank(const char *path, Bank **bank) const; + FMOD_RESULT F_API getEventByID(const FMOD_GUID *id, EventDescription **event) const; + FMOD_RESULT F_API getBusByID(const FMOD_GUID *id, Bus **bus) const; + FMOD_RESULT F_API getVCAByID(const FMOD_GUID *id, VCA **vca) const; + FMOD_RESULT F_API getBankByID(const FMOD_GUID *id, Bank **bank) const; + FMOD_RESULT F_API getSoundInfo(const char *key, FMOD_STUDIO_SOUND_INFO *info) const; + FMOD_RESULT F_API getParameterDescriptionByName(const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getParameterDescriptionByID(FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getParameterLabelByName(const char *name, int labelindex, char *label, int size, int *retrieved) const; + FMOD_RESULT F_API getParameterLabelByID(FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved) const; + + // Global parameter control + FMOD_RESULT F_API getParameterByID(FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue = 0) const; + FMOD_RESULT F_API setParameterByID(FMOD_STUDIO_PARAMETER_ID id, float value, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParameterByIDWithLabel(FMOD_STUDIO_PARAMETER_ID id, const char *label, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParametersByIDs(const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, bool ignoreseekspeed = false); + FMOD_RESULT F_API getParameterByName(const char *name, float *value, float *finalvalue = 0) const; + FMOD_RESULT F_API setParameterByName(const char *name, float value, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParameterByNameWithLabel(const char *name, const char *label, bool ignoreseekspeed = false); + + // Path lookup + FMOD_RESULT F_API lookupID(const char *path, FMOD_GUID *id) const; + FMOD_RESULT F_API lookupPath(const FMOD_GUID *id, char *path, int size, int *retrieved) const; + + // Listener control + FMOD_RESULT F_API getNumListeners(int *numlisteners); + FMOD_RESULT F_API setNumListeners(int numlisteners); + FMOD_RESULT F_API getListenerAttributes(int listener, FMOD_3D_ATTRIBUTES *attributes, FMOD_VECTOR *attenuationposition = 0) const; + FMOD_RESULT F_API setListenerAttributes(int listener, const FMOD_3D_ATTRIBUTES *attributes, const FMOD_VECTOR *attenuationposition = 0); + FMOD_RESULT F_API getListenerWeight(int listener, float *weight); + FMOD_RESULT F_API setListenerWeight(int listener, float weight); + + // Bank control + FMOD_RESULT F_API loadBankFile(const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank); + FMOD_RESULT F_API loadBankMemory(const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank); + FMOD_RESULT F_API loadBankCustom(const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank); + FMOD_RESULT F_API unloadAll(); + + // General functionality + FMOD_RESULT F_API getBufferUsage(FMOD_STUDIO_BUFFER_USAGE *usage) const; + FMOD_RESULT F_API resetBufferUsage(); + FMOD_RESULT F_API registerPlugin(const FMOD_DSP_DESCRIPTION *description); + FMOD_RESULT F_API unregisterPlugin(const char *name); + + // Enumeration + FMOD_RESULT F_API getBankCount(int *count) const; + FMOD_RESULT F_API getBankList(Bank **array, int capacity, int *count) const; + FMOD_RESULT F_API getParameterDescriptionCount(int *count) const; + FMOD_RESULT F_API getParameterDescriptionList(FMOD_STUDIO_PARAMETER_DESCRIPTION *array, int capacity, int *count) const; + + // Command capture and replay + FMOD_RESULT F_API startCommandCapture(const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags); + FMOD_RESULT F_API stopCommandCapture(); + FMOD_RESULT F_API loadCommandReplay(const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, CommandReplay **replay); + + // Callbacks + FMOD_RESULT F_API setCallback(FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_STUDIO_SYSTEM_CALLBACK_ALL); + FMOD_RESULT F_API getUserData(void **userdata) const; + FMOD_RESULT F_API setUserData(void *userdata); + + // Monitoring + FMOD_RESULT F_API getCPUUsage(FMOD_STUDIO_CPU_USAGE *usage, FMOD_CPU_USAGE *usage_core) const; + FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const; + }; + + class EventDescription + { + private: + // Constructor made private so user cannot statically instance the class. + EventDescription(); + EventDescription(const EventDescription &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + FMOD_RESULT F_API getParameterDescriptionCount(int *count) const; + FMOD_RESULT F_API getParameterDescriptionByIndex(int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getParameterDescriptionByName(const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getParameterDescriptionByID(FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const; + FMOD_RESULT F_API getParameterLabelByIndex(int index, int labelindex, char *label, int size, int *retrieved) const; + FMOD_RESULT F_API getParameterLabelByName(const char *name, int labelindex, char *label, int size, int *retrieved) const; + FMOD_RESULT F_API getParameterLabelByID(FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved) const; + FMOD_RESULT F_API getUserPropertyCount(int *count) const; + FMOD_RESULT F_API getUserPropertyByIndex(int index, FMOD_STUDIO_USER_PROPERTY *property) const; + FMOD_RESULT F_API getUserProperty(const char *name, FMOD_STUDIO_USER_PROPERTY *property) const; + FMOD_RESULT F_API getLength(int *length) const; + FMOD_RESULT F_API getMinMaxDistance(float *min, float *max) const; + FMOD_RESULT F_API getSoundSize(float *size) const; + + FMOD_RESULT F_API isSnapshot(bool *snapshot) const; + FMOD_RESULT F_API isOneshot(bool *oneshot) const; + FMOD_RESULT F_API isStream(bool *isStream) const; + FMOD_RESULT F_API is3D(bool *is3d) const; + FMOD_RESULT F_API isDopplerEnabled(bool *doppler) const; + FMOD_RESULT F_API hasSustainPoint(bool *sustainPoint) const; + + // Playback control + FMOD_RESULT F_API createInstance(EventInstance **instance) const; + FMOD_RESULT F_API getInstanceCount(int *count) const; + FMOD_RESULT F_API getInstanceList(EventInstance **array, int capacity, int *count) const; + + // Sample data loading control + FMOD_RESULT F_API loadSampleData(); + FMOD_RESULT F_API unloadSampleData(); + FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const; + + // Convenience functions + FMOD_RESULT F_API releaseAllInstances(); + + // Callbacks + FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL); + FMOD_RESULT F_API getUserData(void **userdata) const; + FMOD_RESULT F_API setUserData(void *userdata); + }; + + class EventInstance + { + private: + // Constructor made private so user cannot statically instance the class. + EventInstance(); + EventInstance(const EventInstance &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getDescription(EventDescription **description) const; + + // Playback control + FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const; + FMOD_RESULT F_API setVolume(float volume); + + FMOD_RESULT F_API getPitch(float *pitch, float *finalpitch = 0) const; + FMOD_RESULT F_API setPitch(float pitch); + + FMOD_RESULT F_API get3DAttributes(FMOD_3D_ATTRIBUTES *attributes) const; + FMOD_RESULT F_API set3DAttributes(const FMOD_3D_ATTRIBUTES *attributes); + + FMOD_RESULT F_API getListenerMask(unsigned int *mask) const; + FMOD_RESULT F_API setListenerMask(unsigned int mask); + + FMOD_RESULT F_API getProperty(FMOD_STUDIO_EVENT_PROPERTY index, float *value) const; + FMOD_RESULT F_API setProperty(FMOD_STUDIO_EVENT_PROPERTY index, float value); + + FMOD_RESULT F_API getReverbLevel(int index, float *level) const; + FMOD_RESULT F_API setReverbLevel(int index, float level); + + FMOD_RESULT F_API getPaused(bool *paused) const; + FMOD_RESULT F_API setPaused(bool paused); + + FMOD_RESULT F_API start(); + FMOD_RESULT F_API stop(FMOD_STUDIO_STOP_MODE mode); + + FMOD_RESULT F_API getTimelinePosition(int *position) const; + FMOD_RESULT F_API setTimelinePosition(int position); + + FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const; + + FMOD_RESULT F_API getChannelGroup(ChannelGroup **group) const; + + FMOD_RESULT F_API getMinMaxDistance(float *min, float *max) const; + + FMOD_RESULT F_API release(); + + FMOD_RESULT F_API isVirtual(bool *virtualstate) const; + + FMOD_RESULT F_API getParameterByID(FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue = 0) const; + FMOD_RESULT F_API setParameterByID(FMOD_STUDIO_PARAMETER_ID id, float value, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParameterByIDWithLabel(FMOD_STUDIO_PARAMETER_ID id, const char* label, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParametersByIDs(const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, bool ignoreseekspeed = false); + + FMOD_RESULT F_API getParameterByName(const char *name, float *value, float *finalvalue = 0) const; + FMOD_RESULT F_API setParameterByName(const char *name, float value, bool ignoreseekspeed = false); + FMOD_RESULT F_API setParameterByNameWithLabel(const char *name, const char* label, bool ignoreseekspeed = false); + + FMOD_RESULT F_API keyOff(); + + // Monitoring + FMOD_RESULT F_API getCPUUsage(unsigned int *exclusive, unsigned int *inclusive) const; + FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const; + + // Callbacks + FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL); + FMOD_RESULT F_API getUserData(void **userdata) const; + FMOD_RESULT F_API setUserData(void *userdata); + }; + + class Bus + { + private: + // Constructor made private so user cannot statically instance the class. + Bus(); + Bus(const Bus &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + + // Playback control + FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const; + FMOD_RESULT F_API setVolume(float volume); + + FMOD_RESULT F_API getPaused(bool *paused) const; + FMOD_RESULT F_API setPaused(bool paused); + + FMOD_RESULT F_API getMute(bool *mute) const; + FMOD_RESULT F_API setMute(bool mute); + + FMOD_RESULT F_API stopAllEvents(FMOD_STUDIO_STOP_MODE mode); + + // Output port + FMOD_RESULT F_API getPortIndex(FMOD_PORT_INDEX *index) const; + FMOD_RESULT F_API setPortIndex(FMOD_PORT_INDEX index); + + // Low-level API access + FMOD_RESULT F_API lockChannelGroup(); + FMOD_RESULT F_API unlockChannelGroup(); + FMOD_RESULT F_API getChannelGroup(FMOD::ChannelGroup **group) const; + + // Monitoring + FMOD_RESULT F_API getCPUUsage(unsigned int *exclusive, unsigned int *inclusive) const; + FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const; + }; + + class VCA + { + private: + // Constructor made private so user cannot statically instance the class. + VCA(); + VCA(const VCA &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + + // Playback control + FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const; + FMOD_RESULT F_API setVolume(float volume); + }; + + class Bank + { + private: + // Constructor made private so user cannot statically instance the class. + Bank(); + Bank(const Bank &); + + public: + // Handle validity + bool F_API isValid() const; + + // Property access + FMOD_RESULT F_API getID(FMOD_GUID *id) const; + FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const; + + // Loading control + FMOD_RESULT F_API unload(); + FMOD_RESULT F_API loadSampleData(); + FMOD_RESULT F_API unloadSampleData(); + + FMOD_RESULT F_API getLoadingState(FMOD_STUDIO_LOADING_STATE *state) const; + FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const; + + // Enumeration + FMOD_RESULT F_API getStringCount(int *count) const; + FMOD_RESULT F_API getStringInfo(int index, FMOD_GUID *id, char *path, int size, int *retrieved) const; + FMOD_RESULT F_API getEventCount(int *count) const; + FMOD_RESULT F_API getEventList(EventDescription **array, int capacity, int *count) const; + FMOD_RESULT F_API getBusCount(int *count) const; + FMOD_RESULT F_API getBusList(Bus **array, int capacity, int *count) const; + FMOD_RESULT F_API getVCACount(int *count) const; + FMOD_RESULT F_API getVCAList(VCA **array, int capacity, int *count) const; + + FMOD_RESULT F_API getUserData(void **userdata) const; + FMOD_RESULT F_API setUserData(void *userdata); + }; + + class CommandReplay + { + private: + // Constructor made private so user cannot statically instance the class. + CommandReplay(); + CommandReplay(const CommandReplay &); + + public: + // Handle validity + bool F_API isValid() const; + + // Information query + FMOD_RESULT F_API getSystem(System **system) const; + FMOD_RESULT F_API getLength(float *length) const; + + FMOD_RESULT F_API getCommandCount(int *count) const; + FMOD_RESULT F_API getCommandInfo(int commandindex, FMOD_STUDIO_COMMAND_INFO *info) const; + FMOD_RESULT F_API getCommandString(int commandindex, char *buffer, int length) const; + FMOD_RESULT F_API getCommandAtTime(float time, int *commandindex) const; + + // Playback + FMOD_RESULT F_API setBankPath(const char *bankPath); + FMOD_RESULT F_API start(); + FMOD_RESULT F_API stop(); + FMOD_RESULT F_API seekToTime(float time); + FMOD_RESULT F_API seekToCommand(int commandindex); + FMOD_RESULT F_API getPaused(bool *paused) const; + FMOD_RESULT F_API setPaused(bool paused); + FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const; + FMOD_RESULT F_API getCurrentCommand(int *commandindex, float *currenttime) const; + + // Release + FMOD_RESULT F_API release(); + + // Callbacks + FMOD_RESULT F_API setFrameCallback(FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback); + FMOD_RESULT F_API setLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback); + FMOD_RESULT F_API setCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback); + + FMOD_RESULT F_API getUserData(void **userdata) const; + FMOD_RESULT F_API setUserData(void *userdata); + }; + +} // namespace Studio + +} // namespace FMOD + +#endif //FMOD_STUDIO_HPP diff --git a/modules/fmod/inc/fmod_studio_common.h b/modules/fmod/inc/fmod_studio_common.h new file mode 100644 index 0000000..d8946ec --- /dev/null +++ b/modules/fmod/inc/fmod_studio_common.h @@ -0,0 +1,336 @@ +/* ======================================================================================== */ +/* FMOD Studio API - Common C/C++ header file. */ +/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */ +/* */ +/* This header defines common enumerations, structs and callbacks that are shared between */ +/* the C and C++ interfaces. */ +/* */ +/* For more detail visit: */ +/* https://fmod.com/docs/2.02/api/studio-api.html */ +/* ======================================================================================== */ +#ifndef FMOD_STUDIO_COMMON_H +#define FMOD_STUDIO_COMMON_H + +#include "fmod.h" + +/* + FMOD Studio types. +*/ +typedef struct FMOD_STUDIO_SYSTEM FMOD_STUDIO_SYSTEM; +typedef struct FMOD_STUDIO_EVENTDESCRIPTION FMOD_STUDIO_EVENTDESCRIPTION; +typedef struct FMOD_STUDIO_EVENTINSTANCE FMOD_STUDIO_EVENTINSTANCE; +typedef struct FMOD_STUDIO_BUS FMOD_STUDIO_BUS; +typedef struct FMOD_STUDIO_VCA FMOD_STUDIO_VCA; +typedef struct FMOD_STUDIO_BANK FMOD_STUDIO_BANK; +typedef struct FMOD_STUDIO_COMMANDREPLAY FMOD_STUDIO_COMMANDREPLAY; + +/* + FMOD Studio constants +*/ +#define FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT 32 + +typedef unsigned int FMOD_STUDIO_INITFLAGS; +#define FMOD_STUDIO_INIT_NORMAL 0x00000000 +#define FMOD_STUDIO_INIT_LIVEUPDATE 0x00000001 +#define FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS 0x00000002 +#define FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE 0x00000004 +#define FMOD_STUDIO_INIT_DEFERRED_CALLBACKS 0x00000008 +#define FMOD_STUDIO_INIT_LOAD_FROM_UPDATE 0x00000010 +#define FMOD_STUDIO_INIT_MEMORY_TRACKING 0x00000020 + +typedef unsigned int FMOD_STUDIO_PARAMETER_FLAGS; +#define FMOD_STUDIO_PARAMETER_READONLY 0x00000001 +#define FMOD_STUDIO_PARAMETER_AUTOMATIC 0x00000002 +#define FMOD_STUDIO_PARAMETER_GLOBAL 0x00000004 +#define FMOD_STUDIO_PARAMETER_DISCRETE 0x00000008 +#define FMOD_STUDIO_PARAMETER_LABELED 0x00000010 + +typedef unsigned int FMOD_STUDIO_SYSTEM_CALLBACK_TYPE; +#define FMOD_STUDIO_SYSTEM_CALLBACK_PREUPDATE 0x00000001 +#define FMOD_STUDIO_SYSTEM_CALLBACK_POSTUPDATE 0x00000002 +#define FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD 0x00000004 +#define FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_CONNECTED 0x00000008 +#define FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_DISCONNECTED 0x00000010 +#define FMOD_STUDIO_SYSTEM_CALLBACK_ALL 0xFFFFFFFF + +typedef unsigned int FMOD_STUDIO_EVENT_CALLBACK_TYPE; +#define FMOD_STUDIO_EVENT_CALLBACK_CREATED 0x00000001 +#define FMOD_STUDIO_EVENT_CALLBACK_DESTROYED 0x00000002 +#define FMOD_STUDIO_EVENT_CALLBACK_STARTING 0x00000004 +#define FMOD_STUDIO_EVENT_CALLBACK_STARTED 0x00000008 +#define FMOD_STUDIO_EVENT_CALLBACK_RESTARTED 0x00000010 +#define FMOD_STUDIO_EVENT_CALLBACK_STOPPED 0x00000020 +#define FMOD_STUDIO_EVENT_CALLBACK_START_FAILED 0x00000040 +#define FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND 0x00000080 +#define FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND 0x00000100 +#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED 0x00000200 +#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED 0x00000400 +#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER 0x00000800 +#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT 0x00001000 +#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED 0x00002000 +#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED 0x00004000 +#define FMOD_STUDIO_EVENT_CALLBACK_REAL_TO_VIRTUAL 0x00008000 +#define FMOD_STUDIO_EVENT_CALLBACK_VIRTUAL_TO_REAL 0x00010000 +#define FMOD_STUDIO_EVENT_CALLBACK_START_EVENT_COMMAND 0x00020000 +#define FMOD_STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT 0x00040000 +#define FMOD_STUDIO_EVENT_CALLBACK_ALL 0xFFFFFFFF + +typedef unsigned int FMOD_STUDIO_LOAD_BANK_FLAGS; +#define FMOD_STUDIO_LOAD_BANK_NORMAL 0x00000000 +#define FMOD_STUDIO_LOAD_BANK_NONBLOCKING 0x00000001 +#define FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES 0x00000002 +#define FMOD_STUDIO_LOAD_BANK_UNENCRYPTED 0x00000004 + +typedef unsigned int FMOD_STUDIO_COMMANDCAPTURE_FLAGS; +#define FMOD_STUDIO_COMMANDCAPTURE_NORMAL 0x00000000 +#define FMOD_STUDIO_COMMANDCAPTURE_FILEFLUSH 0x00000001 +#define FMOD_STUDIO_COMMANDCAPTURE_SKIP_INITIAL_STATE 0x00000002 + +typedef unsigned int FMOD_STUDIO_COMMANDREPLAY_FLAGS; +#define FMOD_STUDIO_COMMANDREPLAY_NORMAL 0x00000000 +#define FMOD_STUDIO_COMMANDREPLAY_SKIP_CLEANUP 0x00000001 +#define FMOD_STUDIO_COMMANDREPLAY_FAST_FORWARD 0x00000002 +#define FMOD_STUDIO_COMMANDREPLAY_SKIP_BANK_LOAD 0x00000004 + +typedef enum FMOD_STUDIO_LOADING_STATE +{ + FMOD_STUDIO_LOADING_STATE_UNLOADING, + FMOD_STUDIO_LOADING_STATE_UNLOADED, + FMOD_STUDIO_LOADING_STATE_LOADING, + FMOD_STUDIO_LOADING_STATE_LOADED, + FMOD_STUDIO_LOADING_STATE_ERROR, + + FMOD_STUDIO_LOADING_STATE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_LOADING_STATE; + +typedef enum FMOD_STUDIO_LOAD_MEMORY_MODE +{ + FMOD_STUDIO_LOAD_MEMORY, + FMOD_STUDIO_LOAD_MEMORY_POINT, + + FMOD_STUDIO_LOAD_MEMORY_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_LOAD_MEMORY_MODE; + +typedef enum FMOD_STUDIO_PARAMETER_TYPE +{ + FMOD_STUDIO_PARAMETER_GAME_CONTROLLED, + FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE, + FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE, + FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION, + FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION, + FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION, + FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION, + FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED, + FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED_ABSOLUTE, + FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE_NORMALIZED, + + FMOD_STUDIO_PARAMETER_MAX, + FMOD_STUDIO_PARAMETER_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_PARAMETER_TYPE; + +typedef enum FMOD_STUDIO_USER_PROPERTY_TYPE +{ + FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER, + FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN, + FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT, + FMOD_STUDIO_USER_PROPERTY_TYPE_STRING, + + FMOD_STUDIO_USER_PROPERTY_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_USER_PROPERTY_TYPE; + +typedef enum FMOD_STUDIO_EVENT_PROPERTY +{ + FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY, + FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY, + FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD, + FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE, + FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE, + FMOD_STUDIO_EVENT_PROPERTY_COOLDOWN, + FMOD_STUDIO_EVENT_PROPERTY_MAX, + + FMOD_STUDIO_EVENT_PROPERTY_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_EVENT_PROPERTY; + +typedef enum FMOD_STUDIO_PLAYBACK_STATE +{ + FMOD_STUDIO_PLAYBACK_PLAYING, + FMOD_STUDIO_PLAYBACK_SUSTAINING, + FMOD_STUDIO_PLAYBACK_STOPPED, + FMOD_STUDIO_PLAYBACK_STARTING, + FMOD_STUDIO_PLAYBACK_STOPPING, + + FMOD_STUDIO_PLAYBACK_FORCEINT = 65536 +} FMOD_STUDIO_PLAYBACK_STATE; + +typedef enum FMOD_STUDIO_STOP_MODE +{ + FMOD_STUDIO_STOP_ALLOWFADEOUT, + FMOD_STUDIO_STOP_IMMEDIATE, + + FMOD_STUDIO_STOP_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_STOP_MODE; + +typedef enum FMOD_STUDIO_INSTANCETYPE +{ + FMOD_STUDIO_INSTANCETYPE_NONE, + FMOD_STUDIO_INSTANCETYPE_SYSTEM, + FMOD_STUDIO_INSTANCETYPE_EVENTDESCRIPTION, + FMOD_STUDIO_INSTANCETYPE_EVENTINSTANCE, + FMOD_STUDIO_INSTANCETYPE_PARAMETERINSTANCE, + FMOD_STUDIO_INSTANCETYPE_BUS, + FMOD_STUDIO_INSTANCETYPE_VCA, + FMOD_STUDIO_INSTANCETYPE_BANK, + FMOD_STUDIO_INSTANCETYPE_COMMANDREPLAY, + + FMOD_STUDIO_INSTANCETYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */ +} FMOD_STUDIO_INSTANCETYPE; + +/* + FMOD Studio structures +*/ +typedef struct FMOD_STUDIO_BANK_INFO +{ + int size; + void *userdata; + int userdatalength; + FMOD_FILE_OPEN_CALLBACK opencallback; + FMOD_FILE_CLOSE_CALLBACK closecallback; + FMOD_FILE_READ_CALLBACK readcallback; + FMOD_FILE_SEEK_CALLBACK seekcallback; +} FMOD_STUDIO_BANK_INFO; + +typedef struct FMOD_STUDIO_PARAMETER_ID +{ + unsigned int data1; + unsigned int data2; +} FMOD_STUDIO_PARAMETER_ID; + +typedef struct FMOD_STUDIO_PARAMETER_DESCRIPTION +{ + const char *name; + FMOD_STUDIO_PARAMETER_ID id; + float minimum; + float maximum; + float defaultvalue; + FMOD_STUDIO_PARAMETER_TYPE type; + FMOD_STUDIO_PARAMETER_FLAGS flags; + FMOD_GUID guid; +} FMOD_STUDIO_PARAMETER_DESCRIPTION; + +typedef struct FMOD_STUDIO_USER_PROPERTY +{ + const char *name; + FMOD_STUDIO_USER_PROPERTY_TYPE type; + + union + { + int intvalue; + FMOD_BOOL boolvalue; + float floatvalue; + const char *stringvalue; + }; +} FMOD_STUDIO_USER_PROPERTY; + +typedef struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES +{ + const char *name; + FMOD_SOUND *sound; + int subsoundIndex; +} FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES; + +typedef struct FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES +{ + const char *name; + FMOD_DSP *dsp; +} FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES; + +typedef struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES +{ + const char *name; + int position; +} FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES; + +typedef struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES +{ + int bar; + int beat; + int position; + float tempo; + int timesignatureupper; + int timesignaturelower; +} FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES; + +typedef struct FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES +{ + FMOD_GUID eventid; + FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES properties; +} FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES; + +typedef struct FMOD_STUDIO_ADVANCEDSETTINGS +{ + int cbsize; + unsigned int commandqueuesize; + unsigned int handleinitialsize; + int studioupdateperiod; + int idlesampledatapoolsize; + unsigned int streamingscheduledelay; + const char* encryptionkey; +} FMOD_STUDIO_ADVANCEDSETTINGS; + +typedef struct FMOD_STUDIO_CPU_USAGE +{ + float update; +} FMOD_STUDIO_CPU_USAGE; + +typedef struct FMOD_STUDIO_BUFFER_INFO +{ + int currentusage; + int peakusage; + int capacity; + int stallcount; + float stalltime; +} FMOD_STUDIO_BUFFER_INFO; + +typedef struct FMOD_STUDIO_BUFFER_USAGE +{ + FMOD_STUDIO_BUFFER_INFO studiocommandqueue; + FMOD_STUDIO_BUFFER_INFO studiohandle; +} FMOD_STUDIO_BUFFER_USAGE; + +typedef struct FMOD_STUDIO_SOUND_INFO +{ + const char *name_or_data; + FMOD_MODE mode; + FMOD_CREATESOUNDEXINFO exinfo; + int subsoundindex; +} FMOD_STUDIO_SOUND_INFO; + +typedef struct FMOD_STUDIO_COMMAND_INFO +{ + const char *commandname; + int parentcommandindex; + int framenumber; + float frametime; + FMOD_STUDIO_INSTANCETYPE instancetype; + FMOD_STUDIO_INSTANCETYPE outputtype; + unsigned int instancehandle; + unsigned int outputhandle; +} FMOD_STUDIO_COMMAND_INFO; + +typedef struct FMOD_STUDIO_MEMORY_USAGE +{ + int exclusive; + int inclusive; + int sampledata; +} FMOD_STUDIO_MEMORY_USAGE; + +/* + FMOD Studio callbacks. +*/ +typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_SYSTEM_CALLBACK) (FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE type, void *commanddata, void *userdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_EVENT_CALLBACK) (FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE *event, void *parameters); +typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, float currenttime, void *userdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, const FMOD_GUID *bankguid, const char *bankfilename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank, void *userdata); +typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **instance, void *userdata); + +#endif // FMOD_STUDIO_COMMON_H diff --git a/modules/fmod/lib/x64/fmod.dll b/modules/fmod/lib/x64/fmod.dll new file mode 100644 index 0000000..4b71d04 Binary files /dev/null and b/modules/fmod/lib/x64/fmod.dll differ diff --git a/modules/fmod/lib/x64/fmod.lib b/modules/fmod/lib/x64/fmod.lib new file mode 100644 index 0000000..f708333 Binary files /dev/null and b/modules/fmod/lib/x64/fmod.lib differ diff --git a/modules/fmod/lib/x64/fmodL.dll b/modules/fmod/lib/x64/fmodL.dll new file mode 100644 index 0000000..dc15e8f Binary files /dev/null and b/modules/fmod/lib/x64/fmodL.dll differ diff --git a/modules/fmod/lib/x64/fmodL_vc.lib b/modules/fmod/lib/x64/fmodL_vc.lib new file mode 100644 index 0000000..554d0c8 Binary files /dev/null and b/modules/fmod/lib/x64/fmodL_vc.lib differ diff --git a/modules/fmod/lib/x64/fmodstudio.dll b/modules/fmod/lib/x64/fmodstudio.dll new file mode 100644 index 0000000..17c3b5d Binary files /dev/null and b/modules/fmod/lib/x64/fmodstudio.dll differ diff --git a/modules/fmod/lib/x64/fmodstudio.lib b/modules/fmod/lib/x64/fmodstudio.lib new file mode 100644 index 0000000..1bb00b6 Binary files /dev/null and b/modules/fmod/lib/x64/fmodstudio.lib differ diff --git a/modules/fmod/lib/x64/fmodstudio1.dll b/modules/fmod/lib/x64/fmodstudio1.dll new file mode 100644 index 0000000..02adac3 Binary files /dev/null and b/modules/fmod/lib/x64/fmodstudio1.dll differ diff --git a/modules/fmod/lib/x64/fmodstudioL_vc.lib b/modules/fmod/lib/x64/fmodstudioL_vc.lib new file mode 100644 index 0000000..8bd00b7 Binary files /dev/null and b/modules/fmod/lib/x64/fmodstudioL_vc.lib differ diff --git a/modules/fmod/lib/x86/fmod.dll b/modules/fmod/lib/x86/fmod.dll new file mode 100644 index 0000000..91fce43 Binary files /dev/null and b/modules/fmod/lib/x86/fmod.dll differ diff --git a/modules/fmod/lib/x86/fmodL.dll b/modules/fmod/lib/x86/fmodL.dll new file mode 100644 index 0000000..8f22497 Binary files /dev/null and b/modules/fmod/lib/x86/fmodL.dll differ diff --git a/modules/fmod/lib/x86/fmodL_vc.lib b/modules/fmod/lib/x86/fmodL_vc.lib new file mode 100644 index 0000000..98e2492 Binary files /dev/null and b/modules/fmod/lib/x86/fmodL_vc.lib differ diff --git a/modules/fmod/lib/x86/fmod_vc.lib b/modules/fmod/lib/x86/fmod_vc.lib new file mode 100644 index 0000000..f0d9a3e Binary files /dev/null and b/modules/fmod/lib/x86/fmod_vc.lib differ diff --git a/modules/fmod/lib/x86/fmodstudio.dll b/modules/fmod/lib/x86/fmodstudio.dll new file mode 100644 index 0000000..3d6365e Binary files /dev/null and b/modules/fmod/lib/x86/fmodstudio.dll differ diff --git a/modules/fmod/lib/x86/fmodstudioL.dll b/modules/fmod/lib/x86/fmodstudioL.dll new file mode 100644 index 0000000..962eb1f Binary files /dev/null and b/modules/fmod/lib/x86/fmodstudioL.dll differ diff --git a/modules/fmod/lib/x86/fmodstudioL_vc.lib b/modules/fmod/lib/x86/fmodstudioL_vc.lib new file mode 100644 index 0000000..10a2940 Binary files /dev/null and b/modules/fmod/lib/x86/fmodstudioL_vc.lib differ diff --git a/modules/fmod/lib/x86/fmodstudio_vc.lib b/modules/fmod/lib/x86/fmodstudio_vc.lib new file mode 100644 index 0000000..d50313d Binary files /dev/null and b/modules/fmod/lib/x86/fmodstudio_vc.lib differ diff --git a/modules/fmod/lib/x86/libfmod.a b/modules/fmod/lib/x86/libfmod.a new file mode 100644 index 0000000..ad5fba1 Binary files /dev/null and b/modules/fmod/lib/x86/libfmod.a differ diff --git a/modules/fmod/lib/x86/libfmodL.a b/modules/fmod/lib/x86/libfmodL.a new file mode 100644 index 0000000..ce0ca36 Binary files /dev/null and b/modules/fmod/lib/x86/libfmodL.a differ diff --git a/modules/fmod/lib/x86/libfmodstudio.a b/modules/fmod/lib/x86/libfmodstudio.a new file mode 100644 index 0000000..46765ea Binary files /dev/null and b/modules/fmod/lib/x86/libfmodstudio.a differ diff --git a/modules/fmod/lib/x86/libfmodstudioL.a b/modules/fmod/lib/x86/libfmodstudioL.a new file mode 100644 index 0000000..39503a0 Binary files /dev/null and b/modules/fmod/lib/x86/libfmodstudioL.a differ diff --git a/modules/fmod/module.jai b/modules/fmod/module.jai new file mode 100644 index 0000000..a36f29d --- /dev/null +++ b/modules/fmod/module.jai @@ -0,0 +1,3553 @@ +// +// This file was auto-generated using the following command: +// +// jai first.jai +// + + + +FMOD_VERSION :: 0x00020212; + +FMOD_DEBUG_LEVEL_NONE :: 0x00000000; +FMOD_DEBUG_LEVEL_ERROR :: 0x00000001; +FMOD_DEBUG_LEVEL_WARNING :: 0x00000002; +FMOD_DEBUG_LEVEL_LOG :: 0x00000004; +FMOD_DEBUG_TYPE_MEMORY :: 0x00000100; +FMOD_DEBUG_TYPE_FILE :: 0x00000200; +FMOD_DEBUG_TYPE_CODEC :: 0x00000400; +FMOD_DEBUG_TYPE_TRACE :: 0x00000800; +FMOD_DEBUG_DISPLAY_TIMESTAMPS :: 0x00010000; +FMOD_DEBUG_DISPLAY_LINENUMBERS :: 0x00020000; +FMOD_DEBUG_DISPLAY_THREAD :: 0x00040000; + +FMOD_MEMORY_NORMAL :: 0x00000000; +FMOD_MEMORY_STREAM_FILE :: 0x00000001; +FMOD_MEMORY_STREAM_DECODE :: 0x00000002; +FMOD_MEMORY_SAMPLEDATA :: 0x00000004; +FMOD_MEMORY_DSP_BUFFER :: 0x00000008; +FMOD_MEMORY_PLUGIN :: 0x00000010; +FMOD_MEMORY_PERSISTENT :: 0x00200000; +FMOD_MEMORY_ALL :: 0xFFFFFFFF; + +FMOD_INIT_NORMAL :: 0x00000000; +FMOD_INIT_STREAM_FROM_UPDATE :: 0x00000001; +FMOD_INIT_MIX_FROM_UPDATE :: 0x00000002; +FMOD_INIT_3D_RIGHTHANDED :: 0x00000004; +FMOD_INIT_CLIP_OUTPUT :: 0x00000008; +FMOD_INIT_CHANNEL_LOWPASS :: 0x00000100; +FMOD_INIT_CHANNEL_DISTANCEFILTER :: 0x00000200; +FMOD_INIT_PROFILE_ENABLE :: 0x00010000; +FMOD_INIT_VOL0_BECOMES_VIRTUAL :: 0x00020000; +FMOD_INIT_GEOMETRY_USECLOSEST :: 0x00040000; +FMOD_INIT_PREFER_DOLBY_DOWNMIX :: 0x00080000; +FMOD_INIT_THREAD_UNSAFE :: 0x00100000; +FMOD_INIT_PROFILE_METER_ALL :: 0x00200000; +FMOD_INIT_MEMORY_TRACKING :: 0x00400000; + +FMOD_DRIVER_STATE_CONNECTED :: 0x00000001; +FMOD_DRIVER_STATE_DEFAULT :: 0x00000002; + +FMOD_TIMEUNIT_MS :: 0x00000001; +FMOD_TIMEUNIT_PCM :: 0x00000002; +FMOD_TIMEUNIT_PCMBYTES :: 0x00000004; +FMOD_TIMEUNIT_RAWBYTES :: 0x00000008; +FMOD_TIMEUNIT_PCMFRACTION :: 0x00000010; +FMOD_TIMEUNIT_MODORDER :: 0x00000100; +FMOD_TIMEUNIT_MODROW :: 0x00000200; +FMOD_TIMEUNIT_MODPATTERN :: 0x00000400; + +FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED :: 0x00000001; +FMOD_SYSTEM_CALLBACK_DEVICELOST :: 0x00000002; +FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED :: 0x00000004; +FMOD_SYSTEM_CALLBACK_THREADCREATED :: 0x00000008; +FMOD_SYSTEM_CALLBACK_BADDSPCONNECTION :: 0x00000010; +FMOD_SYSTEM_CALLBACK_PREMIX :: 0x00000020; +FMOD_SYSTEM_CALLBACK_POSTMIX :: 0x00000040; +FMOD_SYSTEM_CALLBACK_ERROR :: 0x00000080; +FMOD_SYSTEM_CALLBACK_MIDMIX :: 0x00000100; +FMOD_SYSTEM_CALLBACK_THREADDESTROYED :: 0x00000200; +FMOD_SYSTEM_CALLBACK_PREUPDATE :: 0x00000400; +FMOD_SYSTEM_CALLBACK_POSTUPDATE :: 0x00000800; +FMOD_SYSTEM_CALLBACK_RECORDLISTCHANGED :: 0x00001000; +FMOD_SYSTEM_CALLBACK_BUFFEREDNOMIX :: 0x00002000; +FMOD_SYSTEM_CALLBACK_DEVICEREINITIALIZE :: 0x00004000; +FMOD_SYSTEM_CALLBACK_OUTPUTUNDERRUN :: 0x00008000; +FMOD_SYSTEM_CALLBACK_RECORDPOSITIONCHANGED :: 0x00010000; +FMOD_SYSTEM_CALLBACK_ALL :: 0xFFFFFFFF; + +FMOD_DEFAULT :: 0x00000000; +FMOD_LOOP_OFF :: 0x00000001; +FMOD_LOOP_NORMAL :: 0x00000002; +FMOD_LOOP_BIDI :: 0x00000004; +FMOD_2D :: 0x00000008; +FMOD_3D :: 0x00000010; +FMOD_CREATESTREAM :: 0x00000080; +FMOD_CREATESAMPLE :: 0x00000100; +FMOD_CREATECOMPRESSEDSAMPLE :: 0x00000200; +FMOD_OPENUSER :: 0x00000400; +FMOD_OPENMEMORY :: 0x00000800; +FMOD_OPENMEMORY_POINT :: 0x10000000; +FMOD_OPENRAW :: 0x00001000; +FMOD_OPENONLY :: 0x00002000; +FMOD_ACCURATETIME :: 0x00004000; +FMOD_MPEGSEARCH :: 0x00008000; +FMOD_NONBLOCKING :: 0x00010000; +FMOD_UNIQUE :: 0x00020000; +FMOD_3D_HEADRELATIVE :: 0x00040000; +FMOD_3D_WORLDRELATIVE :: 0x00080000; +FMOD_3D_INVERSEROLLOFF :: 0x00100000; +FMOD_3D_LINEARROLLOFF :: 0x00200000; +FMOD_3D_LINEARSQUAREROLLOFF :: 0x00400000; +FMOD_3D_INVERSETAPEREDROLLOFF :: 0x00800000; +FMOD_3D_CUSTOMROLLOFF :: 0x04000000; +FMOD_3D_IGNOREGEOMETRY :: 0x40000000; +FMOD_IGNORETAGS :: 0x02000000; +FMOD_LOWMEM :: 0x08000000; +FMOD_VIRTUAL_PLAYFROMSTART :: 0x80000000; + +FMOD_CHANNELMASK_FRONT_LEFT :: 0x00000001; +FMOD_CHANNELMASK_FRONT_RIGHT :: 0x00000002; +FMOD_CHANNELMASK_FRONT_CENTER :: 0x00000004; +FMOD_CHANNELMASK_LOW_FREQUENCY :: 0x00000008; +FMOD_CHANNELMASK_SURROUND_LEFT :: 0x00000010; +FMOD_CHANNELMASK_SURROUND_RIGHT :: 0x00000020; +FMOD_CHANNELMASK_BACK_LEFT :: 0x00000040; +FMOD_CHANNELMASK_BACK_RIGHT :: 0x00000080; +FMOD_CHANNELMASK_BACK_CENTER :: 0x00000100; +FMOD_CHANNELMASK_MONO :: FMOD_CHANNELMASK_FRONT_LEFT; +FMOD_CHANNELMASK_STEREO :: FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT; +FMOD_CHANNELMASK_LRC :: FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER; +FMOD_CHANNELMASK_QUAD :: FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT; +FMOD_CHANNELMASK_SURROUND :: FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT; +FMOD_CHANNELMASK_5POINT1 :: FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT; +FMOD_CHANNELMASK_5POINT1_REARS :: FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT; +FMOD_CHANNELMASK_7POINT0 :: FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT; +FMOD_CHANNELMASK_7POINT1 :: FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT; + +FMOD_PORT_INDEX_NONE :: 0xFFFFFFFFFFFFFFFF; +FMOD_PORT_INDEX_FLAG_VR_CONTROLLER :: 0x1000000000000000; + +FMOD_THREAD_PRIORITY_PLATFORM_MIN :: -32 * 1024; +FMOD_THREAD_PRIORITY_PLATFORM_MAX :: 32 * 1024; + +FMOD_THREAD_PRIORITY_DEFAULT :: FMOD_THREAD_PRIORITY_PLATFORM_MIN - 1; +FMOD_THREAD_PRIORITY_LOW :: FMOD_THREAD_PRIORITY_PLATFORM_MIN - 2; +FMOD_THREAD_PRIORITY_MEDIUM :: FMOD_THREAD_PRIORITY_PLATFORM_MIN - 3; +FMOD_THREAD_PRIORITY_HIGH :: FMOD_THREAD_PRIORITY_PLATFORM_MIN - 4; +FMOD_THREAD_PRIORITY_VERY_HIGH :: FMOD_THREAD_PRIORITY_PLATFORM_MIN - 5; +FMOD_THREAD_PRIORITY_EXTREME :: FMOD_THREAD_PRIORITY_PLATFORM_MIN - 6; +FMOD_THREAD_PRIORITY_CRITICAL :: FMOD_THREAD_PRIORITY_PLATFORM_MIN - 7; + +FMOD_THREAD_PRIORITY_MIXER :: FMOD_THREAD_PRIORITY_EXTREME; +FMOD_THREAD_PRIORITY_FEEDER :: FMOD_THREAD_PRIORITY_CRITICAL; +FMOD_THREAD_PRIORITY_STREAM :: FMOD_THREAD_PRIORITY_VERY_HIGH; +FMOD_THREAD_PRIORITY_FILE :: FMOD_THREAD_PRIORITY_HIGH; +FMOD_THREAD_PRIORITY_NONBLOCKING :: FMOD_THREAD_PRIORITY_HIGH; +FMOD_THREAD_PRIORITY_RECORD :: FMOD_THREAD_PRIORITY_HIGH; +FMOD_THREAD_PRIORITY_GEOMETRY :: FMOD_THREAD_PRIORITY_LOW; +FMOD_THREAD_PRIORITY_PROFILER :: FMOD_THREAD_PRIORITY_MEDIUM; +FMOD_THREAD_PRIORITY_STUDIO_UPDATE :: FMOD_THREAD_PRIORITY_MEDIUM; +FMOD_THREAD_PRIORITY_STUDIO_LOAD_BANK :: FMOD_THREAD_PRIORITY_MEDIUM; +FMOD_THREAD_PRIORITY_STUDIO_LOAD_SAMPLE :: FMOD_THREAD_PRIORITY_MEDIUM; +FMOD_THREAD_PRIORITY_CONVOLUTION1 :: FMOD_THREAD_PRIORITY_VERY_HIGH; +FMOD_THREAD_PRIORITY_CONVOLUTION2 :: FMOD_THREAD_PRIORITY_VERY_HIGH; + +FMOD_THREAD_STACK_SIZE_DEFAULT :: 0; +FMOD_THREAD_STACK_SIZE_MIXER :: 80 * 1024; +FMOD_THREAD_STACK_SIZE_FEEDER :: 16 * 1024; +FMOD_THREAD_STACK_SIZE_STREAM :: 96 * 1024; +FMOD_THREAD_STACK_SIZE_FILE :: 64 * 1024; +FMOD_THREAD_STACK_SIZE_NONBLOCKING :: 112 * 1024; +FMOD_THREAD_STACK_SIZE_RECORD :: 16 * 1024; +FMOD_THREAD_STACK_SIZE_GEOMETRY :: 48 * 1024; +FMOD_THREAD_STACK_SIZE_PROFILER :: 128 * 1024; +FMOD_THREAD_STACK_SIZE_STUDIO_UPDATE :: 96 * 1024; +FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_BANK :: 96 * 1024; +FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_SAMPLE :: 96 * 1024; +FMOD_THREAD_STACK_SIZE_CONVOLUTION1 :: 16 * 1024; +FMOD_THREAD_STACK_SIZE_CONVOLUTION2 :: 16 * 1024; + +FMOD_THREAD_AFFINITY_GROUP_DEFAULT :: 0x4000000000000000; +FMOD_THREAD_AFFINITY_GROUP_A :: 0x4000000000000001; +FMOD_THREAD_AFFINITY_GROUP_B :: 0x4000000000000002; +FMOD_THREAD_AFFINITY_GROUP_C :: 0x4000000000000003; + +FMOD_THREAD_AFFINITY_MIXER :: FMOD_THREAD_AFFINITY_GROUP_A; +FMOD_THREAD_AFFINITY_FEEDER :: FMOD_THREAD_AFFINITY_GROUP_C; +FMOD_THREAD_AFFINITY_STREAM :: FMOD_THREAD_AFFINITY_GROUP_C; +FMOD_THREAD_AFFINITY_FILE :: FMOD_THREAD_AFFINITY_GROUP_C; +FMOD_THREAD_AFFINITY_NONBLOCKING :: FMOD_THREAD_AFFINITY_GROUP_C; +FMOD_THREAD_AFFINITY_RECORD :: FMOD_THREAD_AFFINITY_GROUP_C; +FMOD_THREAD_AFFINITY_GEOMETRY :: FMOD_THREAD_AFFINITY_GROUP_C; +FMOD_THREAD_AFFINITY_PROFILER :: FMOD_THREAD_AFFINITY_GROUP_C; +FMOD_THREAD_AFFINITY_STUDIO_UPDATE :: FMOD_THREAD_AFFINITY_GROUP_B; +FMOD_THREAD_AFFINITY_STUDIO_LOAD_BANK :: FMOD_THREAD_AFFINITY_GROUP_C; +FMOD_THREAD_AFFINITY_STUDIO_LOAD_SAMPLE :: FMOD_THREAD_AFFINITY_GROUP_C; +FMOD_THREAD_AFFINITY_CONVOLUTION1 :: FMOD_THREAD_AFFINITY_GROUP_C; +FMOD_THREAD_AFFINITY_CONVOLUTION2 :: FMOD_THREAD_AFFINITY_GROUP_C; + +FMOD_THREAD_AFFINITY_CORE_ALL :: 0; +FMOD_THREAD_AFFINITY_CORE_0 :: 1 << 0; +FMOD_THREAD_AFFINITY_CORE_1 :: 1 << 1; +FMOD_THREAD_AFFINITY_CORE_2 :: 1 << 2; +FMOD_THREAD_AFFINITY_CORE_3 :: 1 << 3; +FMOD_THREAD_AFFINITY_CORE_4 :: 1 << 4; +FMOD_THREAD_AFFINITY_CORE_5 :: 1 << 5; +FMOD_THREAD_AFFINITY_CORE_6 :: 1 << 6; +FMOD_THREAD_AFFINITY_CORE_7 :: 1 << 7; +FMOD_THREAD_AFFINITY_CORE_8 :: 1 << 8; +FMOD_THREAD_AFFINITY_CORE_9 :: 1 << 9; +FMOD_THREAD_AFFINITY_CORE_10 :: 1 << 10; +FMOD_THREAD_AFFINITY_CORE_11 :: 1 << 11; +FMOD_THREAD_AFFINITY_CORE_12 :: 1 << 12; +FMOD_THREAD_AFFINITY_CORE_13 :: 1 << 13; +FMOD_THREAD_AFFINITY_CORE_14 :: 1 << 14; +FMOD_THREAD_AFFINITY_CORE_15 :: 1 << 15; + +FMOD_MAX_CHANNEL_WIDTH :: 32; +FMOD_MAX_SYSTEMS :: 8; +FMOD_MAX_LISTENERS :: 8; +FMOD_REVERB_MAXINSTANCES :: 4; + +FMOD_CODEC_PLUGIN_VERSION :: 1; + +FMOD_CODEC_SEEK_METHOD_SET :: 0; +FMOD_CODEC_SEEK_METHOD_CURRENT :: 1; +FMOD_CODEC_SEEK_METHOD_END :: 2; + +FMOD_DSP_LOUDNESS_METER_HISTOGRAM_SAMPLES :: 66; + +FMOD_PLUGIN_SDK_VERSION :: 110; +FMOD_DSP_GETPARAM_VALUESTR_LENGTH :: 32; + +FMOD_OUTPUT_PLUGIN_VERSION :: 5; + +FMOD_OUTPUT_METHOD_MIX_DIRECT :: 0; +FMOD_OUTPUT_METHOD_MIX_BUFFERED :: 1; + +FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT :: 32; + +FMOD_STUDIO_INIT_NORMAL :: 0x00000000; +FMOD_STUDIO_INIT_LIVEUPDATE :: 0x00000001; +FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS :: 0x00000002; +FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE :: 0x00000004; +FMOD_STUDIO_INIT_DEFERRED_CALLBACKS :: 0x00000008; +FMOD_STUDIO_INIT_LOAD_FROM_UPDATE :: 0x00000010; +FMOD_STUDIO_INIT_MEMORY_TRACKING :: 0x00000020; + +FMOD_STUDIO_PARAMETER_READONLY :: 0x00000001; +FMOD_STUDIO_PARAMETER_AUTOMATIC :: 0x00000002; +FMOD_STUDIO_PARAMETER_GLOBAL :: 0x00000004; +FMOD_STUDIO_PARAMETER_DISCRETE :: 0x00000008; +FMOD_STUDIO_PARAMETER_LABELED :: 0x00000010; + +FMOD_STUDIO_SYSTEM_CALLBACK_PREUPDATE :: 0x00000001; +FMOD_STUDIO_SYSTEM_CALLBACK_POSTUPDATE :: 0x00000002; +FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD :: 0x00000004; +FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_CONNECTED :: 0x00000008; +FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_DISCONNECTED :: 0x00000010; +FMOD_STUDIO_SYSTEM_CALLBACK_ALL :: 0xFFFFFFFF; + +FMOD_STUDIO_EVENT_CALLBACK_CREATED :: 0x00000001; +FMOD_STUDIO_EVENT_CALLBACK_DESTROYED :: 0x00000002; +FMOD_STUDIO_EVENT_CALLBACK_STARTING :: 0x00000004; +FMOD_STUDIO_EVENT_CALLBACK_STARTED :: 0x00000008; +FMOD_STUDIO_EVENT_CALLBACK_RESTARTED :: 0x00000010; +FMOD_STUDIO_EVENT_CALLBACK_STOPPED :: 0x00000020; +FMOD_STUDIO_EVENT_CALLBACK_START_FAILED :: 0x00000040; +FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND :: 0x00000080; +FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND :: 0x00000100; +FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED :: 0x00000200; +FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED :: 0x00000400; +FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER :: 0x00000800; +FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT :: 0x00001000; +FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED :: 0x00002000; +FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED :: 0x00004000; +FMOD_STUDIO_EVENT_CALLBACK_REAL_TO_VIRTUAL :: 0x00008000; +FMOD_STUDIO_EVENT_CALLBACK_VIRTUAL_TO_REAL :: 0x00010000; +FMOD_STUDIO_EVENT_CALLBACK_START_EVENT_COMMAND :: 0x00020000; +FMOD_STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT :: 0x00040000; +FMOD_STUDIO_EVENT_CALLBACK_ALL :: 0xFFFFFFFF; + +FMOD_STUDIO_LOAD_BANK_NORMAL :: 0x00000000; +FMOD_STUDIO_LOAD_BANK_NONBLOCKING :: 0x00000001; +FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES :: 0x00000002; +FMOD_STUDIO_LOAD_BANK_UNENCRYPTED :: 0x00000004; + +FMOD_STUDIO_COMMANDCAPTURE_NORMAL :: 0x00000000; +FMOD_STUDIO_COMMANDCAPTURE_FILEFLUSH :: 0x00000001; +FMOD_STUDIO_COMMANDCAPTURE_SKIP_INITIAL_STATE :: 0x00000002; + +FMOD_STUDIO_COMMANDREPLAY_NORMAL :: 0x00000000; +FMOD_STUDIO_COMMANDREPLAY_SKIP_CLEANUP :: 0x00000001; +FMOD_STUDIO_COMMANDREPLAY_FAST_FORWARD :: 0x00000002; +FMOD_STUDIO_COMMANDREPLAY_SKIP_BANK_LOAD :: 0x00000004; + +/* +FMOD core types +*/ +FMOD_BOOL :: s32; +FMOD_SYSTEM :: struct {} +FMOD_SOUND :: struct {} +FMOD_CHANNELCONTROL :: struct {} +FMOD_CHANNEL :: struct {} +FMOD_CHANNELGROUP :: struct {} +FMOD_SOUNDGROUP :: struct {} +FMOD_REVERB3D :: struct {} +FMOD_DSP :: struct {} +FMOD_DSPCONNECTION :: struct {} +FMOD_POLYGON :: struct {} +FMOD_GEOMETRY :: struct {} +FMOD_SYNCPOINT :: struct {} + +FMOD_DEBUG_FLAGS :: u32; + +FMOD_MEMORY_TYPE :: u32; + +FMOD_INITFLAGS :: u32; + +FMOD_DRIVER_STATE :: u32; + +FMOD_TIMEUNIT :: u32; + +FMOD_SYSTEM_CALLBACK_TYPE :: u32; + +FMOD_MODE :: u32; + +FMOD_CHANNELMASK :: u32; + +FMOD_PORT_INDEX :: u64; + +FMOD_THREAD_PRIORITY :: s32; + +FMOD_THREAD_STACK_SIZE :: u32; + +FMOD_THREAD_AFFINITY :: s64; + +FMOD_THREAD_TYPE :: enum s32 { + MIXER :: 0; + FEEDER :: 1; + STREAM :: 2; + FILE :: 3; + NONBLOCKING :: 4; + RECORD :: 5; + GEOMETRY :: 6; + PROFILER :: 7; + STUDIO_UPDATE :: 8; + STUDIO_LOAD_BANK :: 9; + STUDIO_LOAD_SAMPLE :: 10; + CONVOLUTION1 :: 11; + CONVOLUTION2 :: 12; + + MAX :: 13; + FORCEINT :: 65536; + + FMOD_THREAD_TYPE_MIXER :: MIXER; + FMOD_THREAD_TYPE_FEEDER :: FEEDER; + FMOD_THREAD_TYPE_STREAM :: STREAM; + FMOD_THREAD_TYPE_FILE :: FILE; + FMOD_THREAD_TYPE_NONBLOCKING :: NONBLOCKING; + FMOD_THREAD_TYPE_RECORD :: RECORD; + FMOD_THREAD_TYPE_GEOMETRY :: GEOMETRY; + FMOD_THREAD_TYPE_PROFILER :: PROFILER; + FMOD_THREAD_TYPE_STUDIO_UPDATE :: STUDIO_UPDATE; + FMOD_THREAD_TYPE_STUDIO_LOAD_BANK :: STUDIO_LOAD_BANK; + FMOD_THREAD_TYPE_STUDIO_LOAD_SAMPLE :: STUDIO_LOAD_SAMPLE; + FMOD_THREAD_TYPE_CONVOLUTION1 :: CONVOLUTION1; + FMOD_THREAD_TYPE_CONVOLUTION2 :: CONVOLUTION2; + + FMOD_THREAD_TYPE_MAX :: MAX; + FMOD_THREAD_TYPE_FORCEINT :: FORCEINT; +} + +FMOD_RESULT :: enum s32 { + FMOD_OK :: 0; + FMOD_ERR_BADCOMMAND :: 1; + FMOD_ERR_CHANNEL_ALLOC :: 2; + FMOD_ERR_CHANNEL_STOLEN :: 3; + FMOD_ERR_DMA :: 4; + FMOD_ERR_DSP_CONNECTION :: 5; + FMOD_ERR_DSP_DONTPROCESS :: 6; + FMOD_ERR_DSP_FORMAT :: 7; + FMOD_ERR_DSP_INUSE :: 8; + FMOD_ERR_DSP_NOTFOUND :: 9; + FMOD_ERR_DSP_RESERVED :: 10; + FMOD_ERR_DSP_SILENCE :: 11; + FMOD_ERR_DSP_TYPE :: 12; + FMOD_ERR_FILE_BAD :: 13; + FMOD_ERR_FILE_COULDNOTSEEK :: 14; + FMOD_ERR_FILE_DISKEJECTED :: 15; + FMOD_ERR_FILE_EOF :: 16; + FMOD_ERR_FILE_ENDOFDATA :: 17; + FMOD_ERR_FILE_NOTFOUND :: 18; + FMOD_ERR_FORMAT :: 19; + FMOD_ERR_HEADER_MISMATCH :: 20; + FMOD_ERR_HTTP :: 21; + FMOD_ERR_HTTP_ACCESS :: 22; + FMOD_ERR_HTTP_PROXY_AUTH :: 23; + FMOD_ERR_HTTP_SERVER_ERROR :: 24; + FMOD_ERR_HTTP_TIMEOUT :: 25; + FMOD_ERR_INITIALIZATION :: 26; + FMOD_ERR_INITIALIZED :: 27; + FMOD_ERR_INTERNAL :: 28; + FMOD_ERR_INVALID_FLOAT :: 29; + FMOD_ERR_INVALID_HANDLE :: 30; + FMOD_ERR_INVALID_PARAM :: 31; + FMOD_ERR_INVALID_POSITION :: 32; + FMOD_ERR_INVALID_SPEAKER :: 33; + FMOD_ERR_INVALID_SYNCPOINT :: 34; + FMOD_ERR_INVALID_THREAD :: 35; + FMOD_ERR_INVALID_VECTOR :: 36; + FMOD_ERR_MAXAUDIBLE :: 37; + FMOD_ERR_MEMORY :: 38; + FMOD_ERR_MEMORY_CANTPOINT :: 39; + FMOD_ERR_NEEDS3D :: 40; + FMOD_ERR_NEEDSHARDWARE :: 41; + FMOD_ERR_NET_CONNECT :: 42; + FMOD_ERR_NET_SOCKET_ERROR :: 43; + FMOD_ERR_NET_URL :: 44; + FMOD_ERR_NET_WOULD_BLOCK :: 45; + FMOD_ERR_NOTREADY :: 46; + FMOD_ERR_OUTPUT_ALLOCATED :: 47; + FMOD_ERR_OUTPUT_CREATEBUFFER :: 48; + FMOD_ERR_OUTPUT_DRIVERCALL :: 49; + FMOD_ERR_OUTPUT_FORMAT :: 50; + FMOD_ERR_OUTPUT_INIT :: 51; + FMOD_ERR_OUTPUT_NODRIVERS :: 52; + FMOD_ERR_PLUGIN :: 53; + FMOD_ERR_PLUGIN_MISSING :: 54; + FMOD_ERR_PLUGIN_RESOURCE :: 55; + FMOD_ERR_PLUGIN_VERSION :: 56; + FMOD_ERR_RECORD :: 57; + FMOD_ERR_REVERB_CHANNELGROUP :: 58; + FMOD_ERR_REVERB_INSTANCE :: 59; + FMOD_ERR_SUBSOUNDS :: 60; + FMOD_ERR_SUBSOUND_ALLOCATED :: 61; + FMOD_ERR_SUBSOUND_CANTMOVE :: 62; + FMOD_ERR_TAGNOTFOUND :: 63; + FMOD_ERR_TOOMANYCHANNELS :: 64; + FMOD_ERR_TRUNCATED :: 65; + FMOD_ERR_UNIMPLEMENTED :: 66; + FMOD_ERR_UNINITIALIZED :: 67; + FMOD_ERR_UNSUPPORTED :: 68; + FMOD_ERR_VERSION :: 69; + FMOD_ERR_EVENT_ALREADY_LOADED :: 70; + FMOD_ERR_EVENT_LIVEUPDATE_BUSY :: 71; + FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH :: 72; + FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT :: 73; + FMOD_ERR_EVENT_NOTFOUND :: 74; + FMOD_ERR_STUDIO_UNINITIALIZED :: 75; + FMOD_ERR_STUDIO_NOT_LOADED :: 76; + FMOD_ERR_INVALID_STRING :: 77; + FMOD_ERR_ALREADY_LOCKED :: 78; + FMOD_ERR_NOT_LOCKED :: 79; + FMOD_ERR_RECORD_DISCONNECTED :: 80; + FMOD_ERR_TOOMANYSAMPLES :: 81; + + FORCEINT :: 65536; + FMOD_RESULT_FORCEINT :: FORCEINT; +} + +FMOD_CHANNELCONTROL_TYPE :: enum s32 { + CHANNEL :: 0; + CHANNELGROUP :: 1; + + MAX :: 2; + FORCEINT :: 65536; + + FMOD_CHANNELCONTROL_CHANNEL :: CHANNEL; + FMOD_CHANNELCONTROL_CHANNELGROUP :: CHANNELGROUP; + + FMOD_CHANNELCONTROL_MAX :: MAX; + FMOD_CHANNELCONTROL_FORCEINT :: FORCEINT; +} + +FMOD_OUTPUTTYPE :: enum s32 { + AUTODETECT :: 0; + UNKNOWN :: 1; + NOSOUND :: 2; + WAVWRITER :: 3; + NOSOUND_NRT :: 4; + WAVWRITER_NRT :: 5; + WASAPI :: 6; + ASIO :: 7; + PULSEAUDIO :: 8; + ALSA :: 9; + COREAUDIO :: 10; + AUDIOTRACK :: 11; + OPENSL :: 12; + AUDIOOUT :: 13; + AUDIO3D :: 14; + WEBAUDIO :: 15; + NNAUDIO :: 16; + WINSONIC :: 17; + AAUDIO :: 18; + AUDIOWORKLET :: 19; + PHASE :: 20; + + MAX :: 21; + FORCEINT :: 65536; + + FMOD_OUTPUTTYPE_AUTODETECT :: AUTODETECT; + FMOD_OUTPUTTYPE_UNKNOWN :: UNKNOWN; + FMOD_OUTPUTTYPE_NOSOUND :: NOSOUND; + FMOD_OUTPUTTYPE_WAVWRITER :: WAVWRITER; + FMOD_OUTPUTTYPE_NOSOUND_NRT :: NOSOUND_NRT; + FMOD_OUTPUTTYPE_WAVWRITER_NRT :: WAVWRITER_NRT; + FMOD_OUTPUTTYPE_WASAPI :: WASAPI; + FMOD_OUTPUTTYPE_ASIO :: ASIO; + FMOD_OUTPUTTYPE_PULSEAUDIO :: PULSEAUDIO; + FMOD_OUTPUTTYPE_ALSA :: ALSA; + FMOD_OUTPUTTYPE_COREAUDIO :: COREAUDIO; + FMOD_OUTPUTTYPE_AUDIOTRACK :: AUDIOTRACK; + FMOD_OUTPUTTYPE_OPENSL :: OPENSL; + FMOD_OUTPUTTYPE_AUDIOOUT :: AUDIOOUT; + FMOD_OUTPUTTYPE_AUDIO3D :: AUDIO3D; + FMOD_OUTPUTTYPE_WEBAUDIO :: WEBAUDIO; + FMOD_OUTPUTTYPE_NNAUDIO :: NNAUDIO; + FMOD_OUTPUTTYPE_WINSONIC :: WINSONIC; + FMOD_OUTPUTTYPE_AAUDIO :: AAUDIO; + FMOD_OUTPUTTYPE_AUDIOWORKLET :: AUDIOWORKLET; + FMOD_OUTPUTTYPE_PHASE :: PHASE; + + FMOD_OUTPUTTYPE_MAX :: MAX; + FMOD_OUTPUTTYPE_FORCEINT :: FORCEINT; +} + +FMOD_DEBUG_MODE :: enum s32 { + TTY :: 0; + FILE :: 1; + CALLBACK :: 2; + + FORCEINT :: 65536; + + FMOD_DEBUG_MODE_TTY :: TTY; + FMOD_DEBUG_MODE_FILE :: FILE; + FMOD_DEBUG_MODE_CALLBACK :: CALLBACK; + + FMOD_DEBUG_MODE_FORCEINT :: FORCEINT; +} + +FMOD_SPEAKERMODE :: enum s32 { + DEFAULT :: 0; + RAW :: 1; + MONO :: 2; + STEREO :: 3; + QUAD :: 4; + SURROUND :: 5; + _5POINT1 :: 6; + _7POINT1 :: 7; + _7POINT1POINT4 :: 8; + + MAX :: 9; + FORCEINT :: 65536; + + FMOD_SPEAKERMODE_DEFAULT :: DEFAULT; + FMOD_SPEAKERMODE_RAW :: RAW; + FMOD_SPEAKERMODE_MONO :: MONO; + FMOD_SPEAKERMODE_STEREO :: STEREO; + FMOD_SPEAKERMODE_QUAD :: QUAD; + FMOD_SPEAKERMODE_SURROUND :: SURROUND; + FMOD_SPEAKERMODE_5POINT1 :: _5POINT1; + FMOD_SPEAKERMODE_7POINT1 :: _7POINT1; + FMOD_SPEAKERMODE_7POINT1POINT4 :: _7POINT1POINT4; + + FMOD_SPEAKERMODE_MAX :: MAX; + FMOD_SPEAKERMODE_FORCEINT :: FORCEINT; +} + +FMOD_SPEAKER :: enum s32 { + NONE :: -1; + FRONT_LEFT :: 0; + FRONT_RIGHT :: 1; + FRONT_CENTER :: 2; + LOW_FREQUENCY :: 3; + SURROUND_LEFT :: 4; + SURROUND_RIGHT :: 5; + BACK_LEFT :: 6; + BACK_RIGHT :: 7; + TOP_FRONT_LEFT :: 8; + TOP_FRONT_RIGHT :: 9; + TOP_BACK_LEFT :: 10; + TOP_BACK_RIGHT :: 11; + + MAX :: 12; + FORCEINT :: 65536; + + FMOD_SPEAKER_NONE :: NONE; + FMOD_SPEAKER_FRONT_LEFT :: FRONT_LEFT; + FMOD_SPEAKER_FRONT_RIGHT :: FRONT_RIGHT; + FMOD_SPEAKER_FRONT_CENTER :: FRONT_CENTER; + FMOD_SPEAKER_LOW_FREQUENCY :: LOW_FREQUENCY; + FMOD_SPEAKER_SURROUND_LEFT :: SURROUND_LEFT; + FMOD_SPEAKER_SURROUND_RIGHT :: SURROUND_RIGHT; + FMOD_SPEAKER_BACK_LEFT :: BACK_LEFT; + FMOD_SPEAKER_BACK_RIGHT :: BACK_RIGHT; + FMOD_SPEAKER_TOP_FRONT_LEFT :: TOP_FRONT_LEFT; + FMOD_SPEAKER_TOP_FRONT_RIGHT :: TOP_FRONT_RIGHT; + FMOD_SPEAKER_TOP_BACK_LEFT :: TOP_BACK_LEFT; + FMOD_SPEAKER_TOP_BACK_RIGHT :: TOP_BACK_RIGHT; + + FMOD_SPEAKER_MAX :: MAX; + FMOD_SPEAKER_FORCEINT :: FORCEINT; +} + +FMOD_CHANNELORDER :: enum s32 { + DEFAULT :: 0; + WAVEFORMAT :: 1; + PROTOOLS :: 2; + ALLMONO :: 3; + ALLSTEREO :: 4; + ALSA :: 5; + + MAX :: 6; + FORCEINT :: 65536; + + FMOD_CHANNELORDER_DEFAULT :: DEFAULT; + FMOD_CHANNELORDER_WAVEFORMAT :: WAVEFORMAT; + FMOD_CHANNELORDER_PROTOOLS :: PROTOOLS; + FMOD_CHANNELORDER_ALLMONO :: ALLMONO; + FMOD_CHANNELORDER_ALLSTEREO :: ALLSTEREO; + FMOD_CHANNELORDER_ALSA :: ALSA; + + FMOD_CHANNELORDER_MAX :: MAX; + FMOD_CHANNELORDER_FORCEINT :: FORCEINT; +} + +FMOD_PLUGINTYPE :: enum s32 { + OUTPUT :: 0; + CODEC :: 1; + DSP :: 2; + + MAX :: 3; + FORCEINT :: 65536; + + FMOD_PLUGINTYPE_OUTPUT :: OUTPUT; + FMOD_PLUGINTYPE_CODEC :: CODEC; + FMOD_PLUGINTYPE_DSP :: DSP; + + FMOD_PLUGINTYPE_MAX :: MAX; + FMOD_PLUGINTYPE_FORCEINT :: FORCEINT; +} + +FMOD_SOUND_TYPE :: enum s32 { + UNKNOWN :: 0; + AIFF :: 1; + ASF :: 2; + DLS :: 3; + FLAC :: 4; + FSB :: 5; + IT :: 6; + MIDI :: 7; + MOD :: 8; + MPEG :: 9; + OGGVORBIS :: 10; + PLAYLIST :: 11; + RAW :: 12; + S3M :: 13; + USER :: 14; + WAV :: 15; + XM :: 16; + XMA :: 17; + AUDIOQUEUE :: 18; + AT9 :: 19; + VORBIS :: 20; + MEDIA_FOUNDATION :: 21; + MEDIACODEC :: 22; + FADPCM :: 23; + OPUS :: 24; + + MAX :: 25; + FORCEINT :: 65536; + + FMOD_SOUND_TYPE_UNKNOWN :: UNKNOWN; + FMOD_SOUND_TYPE_AIFF :: AIFF; + FMOD_SOUND_TYPE_ASF :: ASF; + FMOD_SOUND_TYPE_DLS :: DLS; + FMOD_SOUND_TYPE_FLAC :: FLAC; + FMOD_SOUND_TYPE_FSB :: FSB; + FMOD_SOUND_TYPE_IT :: IT; + FMOD_SOUND_TYPE_MIDI :: MIDI; + FMOD_SOUND_TYPE_MOD :: MOD; + FMOD_SOUND_TYPE_MPEG :: MPEG; + FMOD_SOUND_TYPE_OGGVORBIS :: OGGVORBIS; + FMOD_SOUND_TYPE_PLAYLIST :: PLAYLIST; + FMOD_SOUND_TYPE_RAW :: RAW; + FMOD_SOUND_TYPE_S3M :: S3M; + FMOD_SOUND_TYPE_USER :: USER; + FMOD_SOUND_TYPE_WAV :: WAV; + FMOD_SOUND_TYPE_XM :: XM; + FMOD_SOUND_TYPE_XMA :: XMA; + FMOD_SOUND_TYPE_AUDIOQUEUE :: AUDIOQUEUE; + FMOD_SOUND_TYPE_AT9 :: AT9; + FMOD_SOUND_TYPE_VORBIS :: VORBIS; + FMOD_SOUND_TYPE_MEDIA_FOUNDATION :: MEDIA_FOUNDATION; + FMOD_SOUND_TYPE_MEDIACODEC :: MEDIACODEC; + FMOD_SOUND_TYPE_FADPCM :: FADPCM; + FMOD_SOUND_TYPE_OPUS :: OPUS; + + FMOD_SOUND_TYPE_MAX :: MAX; + FMOD_SOUND_TYPE_FORCEINT :: FORCEINT; +} + +FMOD_SOUND_FORMAT :: enum s32 { + NONE :: 0; + PCM8 :: 1; + PCM16 :: 2; + PCM24 :: 3; + PCM32 :: 4; + PCMFLOAT :: 5; + BITSTREAM :: 6; + + MAX :: 7; + FORCEINT :: 65536; + + FMOD_SOUND_FORMAT_NONE :: NONE; + FMOD_SOUND_FORMAT_PCM8 :: PCM8; + FMOD_SOUND_FORMAT_PCM16 :: PCM16; + FMOD_SOUND_FORMAT_PCM24 :: PCM24; + FMOD_SOUND_FORMAT_PCM32 :: PCM32; + FMOD_SOUND_FORMAT_PCMFLOAT :: PCMFLOAT; + FMOD_SOUND_FORMAT_BITSTREAM :: BITSTREAM; + + FMOD_SOUND_FORMAT_MAX :: MAX; + FMOD_SOUND_FORMAT_FORCEINT :: FORCEINT; +} + +FMOD_OPENSTATE :: enum s32 { + READY :: 0; + LOADING :: 1; + ERROR :: 2; + CONNECTING :: 3; + BUFFERING :: 4; + SEEKING :: 5; + PLAYING :: 6; + SETPOSITION :: 7; + + MAX :: 8; + FORCEINT :: 65536; + + FMOD_OPENSTATE_READY :: READY; + FMOD_OPENSTATE_LOADING :: LOADING; + FMOD_OPENSTATE_ERROR :: ERROR; + FMOD_OPENSTATE_CONNECTING :: CONNECTING; + FMOD_OPENSTATE_BUFFERING :: BUFFERING; + FMOD_OPENSTATE_SEEKING :: SEEKING; + FMOD_OPENSTATE_PLAYING :: PLAYING; + FMOD_OPENSTATE_SETPOSITION :: SETPOSITION; + + FMOD_OPENSTATE_MAX :: MAX; + FMOD_OPENSTATE_FORCEINT :: FORCEINT; +} + +FMOD_SOUNDGROUP_BEHAVIOR :: enum s32 { + FAIL :: 0; + MUTE :: 1; + STEALLOWEST :: 2; + + MAX :: 3; + FORCEINT :: 65536; + + FMOD_SOUNDGROUP_BEHAVIOR_FAIL :: FAIL; + FMOD_SOUNDGROUP_BEHAVIOR_MUTE :: MUTE; + FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST :: STEALLOWEST; + + FMOD_SOUNDGROUP_BEHAVIOR_MAX :: MAX; + FMOD_SOUNDGROUP_BEHAVIOR_FORCEINT :: FORCEINT; +} + +FMOD_CHANNELCONTROL_CALLBACK_TYPE :: enum s32 { + END :: 0; + VIRTUALVOICE :: 1; + SYNCPOINT :: 2; + OCCLUSION :: 3; + + MAX :: 4; + FORCEINT :: 65536; + + FMOD_CHANNELCONTROL_CALLBACK_END :: END; + FMOD_CHANNELCONTROL_CALLBACK_VIRTUALVOICE :: VIRTUALVOICE; + FMOD_CHANNELCONTROL_CALLBACK_SYNCPOINT :: SYNCPOINT; + FMOD_CHANNELCONTROL_CALLBACK_OCCLUSION :: OCCLUSION; + + FMOD_CHANNELCONTROL_CALLBACK_MAX :: MAX; + FMOD_CHANNELCONTROL_CALLBACK_FORCEINT :: FORCEINT; +} + +FMOD_CHANNELCONTROL_DSP_INDEX :: enum s32 { + HEAD :: -1; + FADER :: -2; + TAIL :: -3; + + FORCEINT :: 65536; + + FMOD_CHANNELCONTROL_DSP_HEAD :: HEAD; + FMOD_CHANNELCONTROL_DSP_FADER :: FADER; + FMOD_CHANNELCONTROL_DSP_TAIL :: TAIL; + + FMOD_CHANNELCONTROL_DSP_FORCEINT :: FORCEINT; +} + +FMOD_ERRORCALLBACK_INSTANCETYPE :: enum s32 { + NONE :: 0; + SYSTEM :: 1; + CHANNEL :: 2; + CHANNELGROUP :: 3; + CHANNELCONTROL :: 4; + SOUND :: 5; + SOUNDGROUP :: 6; + DSP :: 7; + DSPCONNECTION :: 8; + GEOMETRY :: 9; + REVERB3D :: 10; + STUDIO_SYSTEM :: 11; + STUDIO_EVENTDESCRIPTION :: 12; + STUDIO_EVENTINSTANCE :: 13; + STUDIO_PARAMETERINSTANCE :: 14; + STUDIO_BUS :: 15; + STUDIO_VCA :: 16; + STUDIO_BANK :: 17; + STUDIO_COMMANDREPLAY :: 18; + + FORCEINT :: 65536; + + FMOD_ERRORCALLBACK_INSTANCETYPE_NONE :: NONE; + FMOD_ERRORCALLBACK_INSTANCETYPE_SYSTEM :: SYSTEM; + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNEL :: CHANNEL; + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELGROUP :: CHANNELGROUP; + FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELCONTROL :: CHANNELCONTROL; + FMOD_ERRORCALLBACK_INSTANCETYPE_SOUND :: SOUND; + FMOD_ERRORCALLBACK_INSTANCETYPE_SOUNDGROUP :: SOUNDGROUP; + FMOD_ERRORCALLBACK_INSTANCETYPE_DSP :: DSP; + FMOD_ERRORCALLBACK_INSTANCETYPE_DSPCONNECTION :: DSPCONNECTION; + FMOD_ERRORCALLBACK_INSTANCETYPE_GEOMETRY :: GEOMETRY; + FMOD_ERRORCALLBACK_INSTANCETYPE_REVERB3D :: REVERB3D; + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_SYSTEM :: STUDIO_SYSTEM; + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTDESCRIPTION :: STUDIO_EVENTDESCRIPTION; + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTINSTANCE :: STUDIO_EVENTINSTANCE; + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_PARAMETERINSTANCE :: STUDIO_PARAMETERINSTANCE; + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BUS :: STUDIO_BUS; + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_VCA :: STUDIO_VCA; + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BANK :: STUDIO_BANK; + FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_COMMANDREPLAY :: STUDIO_COMMANDREPLAY; + + FMOD_ERRORCALLBACK_INSTANCETYPE_FORCEINT :: FORCEINT; +} + +FMOD_DSP_RESAMPLER :: enum s32 { + DEFAULT :: 0; + NOINTERP :: 1; + LINEAR :: 2; + CUBIC :: 3; + SPLINE :: 4; + + MAX :: 5; + FORCEINT :: 65536; + + FMOD_DSP_RESAMPLER_DEFAULT :: DEFAULT; + FMOD_DSP_RESAMPLER_NOINTERP :: NOINTERP; + FMOD_DSP_RESAMPLER_LINEAR :: LINEAR; + FMOD_DSP_RESAMPLER_CUBIC :: CUBIC; + FMOD_DSP_RESAMPLER_SPLINE :: SPLINE; + + FMOD_DSP_RESAMPLER_MAX :: MAX; + FMOD_DSP_RESAMPLER_FORCEINT :: FORCEINT; +} + +FMOD_DSP_CALLBACK_TYPE :: enum s32 { + DATAPARAMETERRELEASE :: 0; + + MAX :: 1; + FORCEINT :: 65536; + + FMOD_DSP_CALLBACK_DATAPARAMETERRELEASE :: DATAPARAMETERRELEASE; + + FMOD_DSP_CALLBACK_MAX :: MAX; + FMOD_DSP_CALLBACK_FORCEINT :: FORCEINT; +} + +FMOD_DSPCONNECTION_TYPE :: enum s32 { + STANDARD :: 0; + SIDECHAIN :: 1; + SEND :: 2; + SEND_SIDECHAIN :: 3; + + MAX :: 4; + FORCEINT :: 65536; + + FMOD_DSPCONNECTION_TYPE_STANDARD :: STANDARD; + FMOD_DSPCONNECTION_TYPE_SIDECHAIN :: SIDECHAIN; + FMOD_DSPCONNECTION_TYPE_SEND :: SEND; + FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN :: SEND_SIDECHAIN; + + FMOD_DSPCONNECTION_TYPE_MAX :: MAX; + FMOD_DSPCONNECTION_TYPE_FORCEINT :: FORCEINT; +} + +FMOD_TAGTYPE :: enum s32 { + UNKNOWN :: 0; + ID3V1 :: 1; + ID3V2 :: 2; + VORBISCOMMENT :: 3; + SHOUTCAST :: 4; + ICECAST :: 5; + ASF :: 6; + MIDI :: 7; + PLAYLIST :: 8; + FMOD :: 9; + USER :: 10; + + MAX :: 11; + FORCEINT :: 65536; + + FMOD_TAGTYPE_UNKNOWN :: UNKNOWN; + FMOD_TAGTYPE_ID3V1 :: ID3V1; + FMOD_TAGTYPE_ID3V2 :: ID3V2; + FMOD_TAGTYPE_VORBISCOMMENT :: VORBISCOMMENT; + FMOD_TAGTYPE_SHOUTCAST :: SHOUTCAST; + FMOD_TAGTYPE_ICECAST :: ICECAST; + FMOD_TAGTYPE_ASF :: ASF; + FMOD_TAGTYPE_MIDI :: MIDI; + FMOD_TAGTYPE_PLAYLIST :: PLAYLIST; + FMOD_TAGTYPE_FMOD :: FMOD; + FMOD_TAGTYPE_USER :: USER; + + FMOD_TAGTYPE_MAX :: MAX; + FMOD_TAGTYPE_FORCEINT :: FORCEINT; +} + +FMOD_TAGDATATYPE :: enum s32 { + BINARY :: 0; + INT :: 1; + FLOAT :: 2; + STRING :: 3; + STRING_UTF16 :: 4; + STRING_UTF16BE :: 5; + STRING_UTF8 :: 6; + + MAX :: 7; + FORCEINT :: 65536; + + FMOD_TAGDATATYPE_BINARY :: BINARY; + FMOD_TAGDATATYPE_INT :: INT; + FMOD_TAGDATATYPE_FLOAT :: FLOAT; + FMOD_TAGDATATYPE_STRING :: STRING; + FMOD_TAGDATATYPE_STRING_UTF16 :: STRING_UTF16; + FMOD_TAGDATATYPE_STRING_UTF16BE :: STRING_UTF16BE; + FMOD_TAGDATATYPE_STRING_UTF8 :: STRING_UTF8; + + FMOD_TAGDATATYPE_MAX :: MAX; + FMOD_TAGDATATYPE_FORCEINT :: FORCEINT; +} + +FMOD_PORT_TYPE :: enum s32 { + MUSIC :: 0; + COPYRIGHT_MUSIC :: 1; + VOICE :: 2; + CONTROLLER :: 3; + PERSONAL :: 4; + VIBRATION :: 5; + AUX :: 6; + + MAX :: 7; + FORCEINT :: 65536; + + FMOD_PORT_TYPE_MUSIC :: MUSIC; + FMOD_PORT_TYPE_COPYRIGHT_MUSIC :: COPYRIGHT_MUSIC; + FMOD_PORT_TYPE_VOICE :: VOICE; + FMOD_PORT_TYPE_CONTROLLER :: CONTROLLER; + FMOD_PORT_TYPE_PERSONAL :: PERSONAL; + FMOD_PORT_TYPE_VIBRATION :: VIBRATION; + FMOD_PORT_TYPE_AUX :: AUX; + + FMOD_PORT_TYPE_MAX :: MAX; + FMOD_PORT_TYPE_FORCEINT :: FORCEINT; +} + +/* +FMOD callbacks +*/ +FMOD_DEBUG_CALLBACK :: #type (flags: FMOD_DEBUG_FLAGS, file: *u8, line: s32, func: *u8, message: *u8) -> FMOD_RESULT #c_call; +FMOD_SYSTEM_CALLBACK :: #type (system: *FMOD_SYSTEM, type: FMOD_SYSTEM_CALLBACK_TYPE, commanddata1: *void, commanddata2: *void, userdata: *void) -> FMOD_RESULT #c_call; +FMOD_CHANNELCONTROL_CALLBACK :: #type (channelcontrol: *FMOD_CHANNELCONTROL, controltype: FMOD_CHANNELCONTROL_TYPE, callbacktype: FMOD_CHANNELCONTROL_CALLBACK_TYPE, commanddata1: *void, commanddata2: *void) -> FMOD_RESULT #c_call; +FMOD_DSP_CALLBACK :: #type (dsp: *FMOD_DSP, type: FMOD_DSP_CALLBACK_TYPE, data: *void) -> FMOD_RESULT #c_call; +FMOD_SOUND_NONBLOCK_CALLBACK :: #type (sound: *FMOD_SOUND, result: FMOD_RESULT) -> FMOD_RESULT #c_call; +FMOD_SOUND_PCMREAD_CALLBACK :: #type (sound: *FMOD_SOUND, data: *void, datalen: u32) -> FMOD_RESULT #c_call; +FMOD_SOUND_PCMSETPOS_CALLBACK :: #type (sound: *FMOD_SOUND, subsound: s32, position: u32, postype: FMOD_TIMEUNIT) -> FMOD_RESULT #c_call; +FMOD_FILE_OPEN_CALLBACK :: #type (name: *u8, filesize: *u32, handle: **void, userdata: *void) -> FMOD_RESULT #c_call; +FMOD_FILE_CLOSE_CALLBACK :: #type (handle: *void, userdata: *void) -> FMOD_RESULT #c_call; +FMOD_FILE_READ_CALLBACK :: #type (handle: *void, buffer: *void, sizebytes: u32, bytesread: *u32, userdata: *void) -> FMOD_RESULT #c_call; +FMOD_FILE_SEEK_CALLBACK :: #type (handle: *void, pos: u32, userdata: *void) -> FMOD_RESULT #c_call; +FMOD_FILE_ASYNCREAD_CALLBACK :: #type (info: *FMOD_ASYNCREADINFO, userdata: *void) -> FMOD_RESULT #c_call; +FMOD_FILE_ASYNCCANCEL_CALLBACK :: #type (info: *FMOD_ASYNCREADINFO, userdata: *void) -> FMOD_RESULT #c_call; +FMOD_FILE_ASYNCDONE_FUNC :: #type (info: *FMOD_ASYNCREADINFO, result: FMOD_RESULT) -> void #c_call; +FMOD_MEMORY_ALLOC_CALLBACK :: #type (size: u32, type: FMOD_MEMORY_TYPE, sourcestr: *u8) -> *void #c_call; +FMOD_MEMORY_REALLOC_CALLBACK :: #type (ptr: *void, size: u32, type: FMOD_MEMORY_TYPE, sourcestr: *u8) -> *void #c_call; +FMOD_MEMORY_FREE_CALLBACK :: #type (ptr: *void, type: FMOD_MEMORY_TYPE, sourcestr: *u8) -> void #c_call; +FMOD_3D_ROLLOFF_CALLBACK :: #type (channelcontrol: *FMOD_CHANNELCONTROL, distance: float) -> float #c_call; + +/* +FMOD structs +*/ +FMOD_ASYNCREADINFO :: struct { + handle: *void; + offset: u32; + sizebytes: u32; + priority: s32; + userdata: *void; + buffer: *void; + bytesread: u32; + done: FMOD_FILE_ASYNCDONE_FUNC; +} + +FMOD_VECTOR :: struct { + x: float; + y: float; + z: float; +} + +FMOD_3D_ATTRIBUTES :: struct { + position: FMOD_VECTOR; + velocity: FMOD_VECTOR; + forward: FMOD_VECTOR; + up: FMOD_VECTOR; +} + +FMOD_GUID :: struct { + Data1: u32; + Data2: u16; + Data3: u16; + Data4: [8] u8; +} + +FMOD_PLUGINLIST :: struct { + type: FMOD_PLUGINTYPE; + description: *void; +} + +FMOD_ADVANCEDSETTINGS :: struct { + cbSize: s32; + maxMPEGCodecs: s32; + maxADPCMCodecs: s32; + maxXMACodecs: s32; + maxVorbisCodecs: s32; + maxAT9Codecs: s32; + maxFADPCMCodecs: s32; + maxPCMCodecs: s32; + ASIONumChannels: s32; + ASIOChannelList: **u8; + ASIOSpeakerList: *FMOD_SPEAKER; + vol0virtualvol: float; + defaultDecodeBufferSize: u32; + profilePort: u16; + geometryMaxFadeTime: u32; + distanceFilterCenterFreq: float; + reverb3Dinstance: s32; + DSPBufferPoolSize: s32; + resamplerMethod: FMOD_DSP_RESAMPLER; + randomSeed: u32; + maxConvolutionThreads: s32; + maxOpusCodecs: s32; +} + +FMOD_TAG :: struct { + type: FMOD_TAGTYPE; + datatype: FMOD_TAGDATATYPE; + name: *u8; + data: *void; + datalen: u32; + updated: FMOD_BOOL; +} + +FMOD_CREATESOUNDEXINFO :: struct { + cbsize: s32; + length: u32; + fileoffset: u32; + numchannels: s32; + defaultfrequency: s32; + format: FMOD_SOUND_FORMAT; + decodebuffersize: u32; + initialsubsound: s32; + numsubsounds: s32; + inclusionlist: *s32; + inclusionlistnum: s32; + pcmreadcallback: FMOD_SOUND_PCMREAD_CALLBACK; + pcmsetposcallback: FMOD_SOUND_PCMSETPOS_CALLBACK; + nonblockcallback: FMOD_SOUND_NONBLOCK_CALLBACK; + dlsname: *u8; + encryptionkey: *u8; + maxpolyphony: s32; + userdata: *void; + suggestedsoundtype: FMOD_SOUND_TYPE; + fileuseropen: FMOD_FILE_OPEN_CALLBACK; + fileuserclose: FMOD_FILE_CLOSE_CALLBACK; + fileuserread: FMOD_FILE_READ_CALLBACK; + fileuserseek: FMOD_FILE_SEEK_CALLBACK; + fileuserasyncread: FMOD_FILE_ASYNCREAD_CALLBACK; + fileuserasynccancel: FMOD_FILE_ASYNCCANCEL_CALLBACK; + fileuserdata: *void; + filebuffersize: s32; + channelorder: FMOD_CHANNELORDER; + initialsoundgroup: *FMOD_SOUNDGROUP; + initialseekposition: u32; + initialseekpostype: FMOD_TIMEUNIT; + ignoresetfilesystem: s32; + audioqueuepolicy: u32; + minmidigranularity: u32; + nonblockthreadid: s32; + fsbguid: *FMOD_GUID; +} + +FMOD_REVERB_PROPERTIES :: struct { + DecayTime: float; + EarlyDelay: float; + LateDelay: float; + HFReference: float; + HFDecayRatio: float; + Diffusion: float; + Density: float; + LowShelfFrequency: float; + LowShelfGain: float; + HighCut: float; + EarlyLateMix: float; + WetLevel: float; +} + +FMOD_ERRORCALLBACK_INFO :: struct { + result: FMOD_RESULT; + instancetype: FMOD_ERRORCALLBACK_INSTANCETYPE; + instance: *void; + functionname: *u8; + functionparams: *u8; +} + +FMOD_CPU_USAGE :: struct { + dsp: float; + stream: float; + geometry: float; + update: float; + convolution1: float; + convolution2: float; +} + +FMOD_DSP_DATA_PARAMETER_INFO :: struct { + data: *void; + length: u32; + index: s32; +} + +FMOD_CODEC_SEEK_METHOD :: s32; + +/* +Codec callbacks +*/ +FMOD_CODEC_OPEN_CALLBACK :: #type (codec_state: *FMOD_CODEC_STATE, usermode: FMOD_MODE, userexinfo: *FMOD_CREATESOUNDEXINFO) -> FMOD_RESULT #c_call; +FMOD_CODEC_CLOSE_CALLBACK :: #type (codec_state: *FMOD_CODEC_STATE) -> FMOD_RESULT #c_call; +FMOD_CODEC_READ_CALLBACK :: #type (codec_state: *FMOD_CODEC_STATE, buffer: *void, samples_in: u32, samples_out: *u32) -> FMOD_RESULT #c_call; +FMOD_CODEC_GETLENGTH_CALLBACK :: #type (codec_state: *FMOD_CODEC_STATE, length: *u32, lengthtype: FMOD_TIMEUNIT) -> FMOD_RESULT #c_call; +FMOD_CODEC_SETPOSITION_CALLBACK :: #type (codec_state: *FMOD_CODEC_STATE, subsound: s32, position: u32, postype: FMOD_TIMEUNIT) -> FMOD_RESULT #c_call; +FMOD_CODEC_GETPOSITION_CALLBACK :: #type (codec_state: *FMOD_CODEC_STATE, position: *u32, postype: FMOD_TIMEUNIT) -> FMOD_RESULT #c_call; +FMOD_CODEC_SOUNDCREATE_CALLBACK :: #type (codec_state: *FMOD_CODEC_STATE, subsound: s32, sound: *FMOD_SOUND) -> FMOD_RESULT #c_call; +FMOD_CODEC_GETWAVEFORMAT_CALLBACK :: #type (codec_state: *FMOD_CODEC_STATE, index: s32, waveformat: *FMOD_CODEC_WAVEFORMAT) -> FMOD_RESULT #c_call; + +/* +Codec functions +*/ +FMOD_CODEC_METADATA_FUNC :: #type (codec_state: *FMOD_CODEC_STATE, tagtype: FMOD_TAGTYPE, name: *u8, data: *void, datalen: u32, datatype: FMOD_TAGDATATYPE, unique: s32) -> FMOD_RESULT #c_call; +FMOD_CODEC_ALLOC_FUNC :: #type (size: u32, align: u32, file: *u8, line: s32) -> *void #c_call; +FMOD_CODEC_FREE_FUNC :: #type (ptr: *void, file: *u8, line: s32) -> void #c_call; +FMOD_CODEC_LOG_FUNC :: #type (level: FMOD_DEBUG_FLAGS, file: *u8, line: s32, function: *u8, _string: *u8, __args: ..Any) -> void #c_call; + +FMOD_CODEC_FILE_READ_FUNC :: #type (codec_state: *FMOD_CODEC_STATE, buffer: *void, sizebytes: u32, bytesread: *u32) -> FMOD_RESULT #c_call; +FMOD_CODEC_FILE_SEEK_FUNC :: #type (codec_state: *FMOD_CODEC_STATE, pos: u32, method: FMOD_CODEC_SEEK_METHOD) -> FMOD_RESULT #c_call; +FMOD_CODEC_FILE_TELL_FUNC :: #type (codec_state: *FMOD_CODEC_STATE, pos: *u32) -> FMOD_RESULT #c_call; +FMOD_CODEC_FILE_SIZE_FUNC :: #type (codec_state: *FMOD_CODEC_STATE, size: *u32) -> FMOD_RESULT #c_call; + +/* +Codec structures +*/ +FMOD_CODEC_DESCRIPTION :: struct { + apiversion: u32; + name: *u8; + version: u32; + defaultasstream: s32; + timeunits: FMOD_TIMEUNIT; + open: FMOD_CODEC_OPEN_CALLBACK; + close: FMOD_CODEC_CLOSE_CALLBACK; + read: FMOD_CODEC_READ_CALLBACK; + getlength: FMOD_CODEC_GETLENGTH_CALLBACK; + setposition: FMOD_CODEC_SETPOSITION_CALLBACK; + getposition: FMOD_CODEC_GETPOSITION_CALLBACK; + soundcreate: FMOD_CODEC_SOUNDCREATE_CALLBACK; + getwaveformat: FMOD_CODEC_GETWAVEFORMAT_CALLBACK; +} + +FMOD_CODEC_WAVEFORMAT :: struct { + name: *u8; + format: FMOD_SOUND_FORMAT; + channels: s32; + frequency: s32; + lengthbytes: u32; + lengthpcm: u32; + pcmblocksize: u32; + loopstart: s32; + loopend: s32; + mode: FMOD_MODE; + channelmask: FMOD_CHANNELMASK; + channelorder: FMOD_CHANNELORDER; + peakvolume: float; +} + +FMOD_CODEC_STATE_FUNCTIONS :: struct { + metadata: FMOD_CODEC_METADATA_FUNC; + alloc: FMOD_CODEC_ALLOC_FUNC; + free: FMOD_CODEC_FREE_FUNC; + log: FMOD_CODEC_LOG_FUNC; + read: FMOD_CODEC_FILE_READ_FUNC; + seek: FMOD_CODEC_FILE_SEEK_FUNC; + tell: FMOD_CODEC_FILE_TELL_FUNC; + size: FMOD_CODEC_FILE_SIZE_FUNC; +} + +FMOD_CODEC_STATE :: struct { + plugindata: *void; + waveformat: *FMOD_CODEC_WAVEFORMAT; + functions: *FMOD_CODEC_STATE_FUNCTIONS; + numsubsounds: s32; +} + +FMOD_DSP_TYPE :: enum s32 { + UNKNOWN :: 0; + MIXER :: 1; + OSCILLATOR :: 2; + LOWPASS :: 3; + ITLOWPASS :: 4; + HIGHPASS :: 5; + ECHO :: 6; + FADER :: 7; + FLANGE :: 8; + DISTORTION :: 9; + NORMALIZE :: 10; + LIMITER :: 11; + PARAMEQ :: 12; + PITCHSHIFT :: 13; + CHORUS :: 14; + VSTPLUGIN :: 15; + WINAMPPLUGIN :: 16; + ITECHO :: 17; + COMPRESSOR :: 18; + SFXREVERB :: 19; + LOWPASS_SIMPLE :: 20; + DELAY :: 21; + TREMOLO :: 22; + LADSPAPLUGIN :: 23; + SEND :: 24; + RETURN :: 25; + HIGHPASS_SIMPLE :: 26; + PAN :: 27; + THREE_EQ :: 28; + FFT :: 29; + LOUDNESS_METER :: 30; + ENVELOPEFOLLOWER :: 31; + CONVOLUTIONREVERB :: 32; + CHANNELMIX :: 33; + TRANSCEIVER :: 34; + OBJECTPAN :: 35; + MULTIBAND_EQ :: 36; + + MAX :: 37; + FORCEINT :: 65536; + + FMOD_DSP_TYPE_UNKNOWN :: UNKNOWN; + FMOD_DSP_TYPE_MIXER :: MIXER; + FMOD_DSP_TYPE_OSCILLATOR :: OSCILLATOR; + FMOD_DSP_TYPE_LOWPASS :: LOWPASS; + FMOD_DSP_TYPE_ITLOWPASS :: ITLOWPASS; + FMOD_DSP_TYPE_HIGHPASS :: HIGHPASS; + FMOD_DSP_TYPE_ECHO :: ECHO; + FMOD_DSP_TYPE_FADER :: FADER; + FMOD_DSP_TYPE_FLANGE :: FLANGE; + FMOD_DSP_TYPE_DISTORTION :: DISTORTION; + FMOD_DSP_TYPE_NORMALIZE :: NORMALIZE; + FMOD_DSP_TYPE_LIMITER :: LIMITER; + FMOD_DSP_TYPE_PARAMEQ :: PARAMEQ; + FMOD_DSP_TYPE_PITCHSHIFT :: PITCHSHIFT; + FMOD_DSP_TYPE_CHORUS :: CHORUS; + FMOD_DSP_TYPE_VSTPLUGIN :: VSTPLUGIN; + FMOD_DSP_TYPE_WINAMPPLUGIN :: WINAMPPLUGIN; + FMOD_DSP_TYPE_ITECHO :: ITECHO; + FMOD_DSP_TYPE_COMPRESSOR :: COMPRESSOR; + FMOD_DSP_TYPE_SFXREVERB :: SFXREVERB; + FMOD_DSP_TYPE_LOWPASS_SIMPLE :: LOWPASS_SIMPLE; + FMOD_DSP_TYPE_DELAY :: DELAY; + FMOD_DSP_TYPE_TREMOLO :: TREMOLO; + FMOD_DSP_TYPE_LADSPAPLUGIN :: LADSPAPLUGIN; + FMOD_DSP_TYPE_SEND :: SEND; + FMOD_DSP_TYPE_RETURN :: RETURN; + FMOD_DSP_TYPE_HIGHPASS_SIMPLE :: HIGHPASS_SIMPLE; + FMOD_DSP_TYPE_PAN :: PAN; + FMOD_DSP_TYPE_THREE_EQ :: THREE_EQ; + FMOD_DSP_TYPE_FFT :: FFT; + FMOD_DSP_TYPE_LOUDNESS_METER :: LOUDNESS_METER; + FMOD_DSP_TYPE_ENVELOPEFOLLOWER :: ENVELOPEFOLLOWER; + FMOD_DSP_TYPE_CONVOLUTIONREVERB :: CONVOLUTIONREVERB; + FMOD_DSP_TYPE_CHANNELMIX :: CHANNELMIX; + FMOD_DSP_TYPE_TRANSCEIVER :: TRANSCEIVER; + FMOD_DSP_TYPE_OBJECTPAN :: OBJECTPAN; + FMOD_DSP_TYPE_MULTIBAND_EQ :: MULTIBAND_EQ; + + FMOD_DSP_TYPE_MAX :: MAX; + FMOD_DSP_TYPE_FORCEINT :: FORCEINT; +} + +/* +=================================================================================================== + +FMOD built in effect parameters. +Use DSP::setParameter with these enums for the 'index' parameter. + +=================================================================================================== +*/ +FMOD_DSP_OSCILLATOR :: enum s32 { + TYPE :: 0; + RATE :: 1; + + FMOD_DSP_OSCILLATOR_TYPE :: TYPE; + FMOD_DSP_OSCILLATOR_RATE :: RATE; +} + +FMOD_DSP_LOWPASS :: enum s32 { + CUTOFF :: 0; + RESONANCE :: 1; + + FMOD_DSP_LOWPASS_CUTOFF :: CUTOFF; + FMOD_DSP_LOWPASS_RESONANCE :: RESONANCE; +} + +FMOD_DSP_ITLOWPASS :: enum s32 { + CUTOFF :: 0; + RESONANCE :: 1; + + FMOD_DSP_ITLOWPASS_CUTOFF :: CUTOFF; + FMOD_DSP_ITLOWPASS_RESONANCE :: RESONANCE; +} + +FMOD_DSP_HIGHPASS :: enum s32 { + CUTOFF :: 0; + RESONANCE :: 1; + + FMOD_DSP_HIGHPASS_CUTOFF :: CUTOFF; + FMOD_DSP_HIGHPASS_RESONANCE :: RESONANCE; +} + +FMOD_DSP_ECHO :: enum s32 { + DELAY :: 0; + FEEDBACK :: 1; + DRYLEVEL :: 2; + WETLEVEL :: 3; + + FMOD_DSP_ECHO_DELAY :: DELAY; + FMOD_DSP_ECHO_FEEDBACK :: FEEDBACK; + FMOD_DSP_ECHO_DRYLEVEL :: DRYLEVEL; + FMOD_DSP_ECHO_WETLEVEL :: WETLEVEL; +} + +FMOD_DSP_FADER :: enum s32 { + GAIN :: 0; + OVERALL_GAIN :: 1; + + FMOD_DSP_FADER_GAIN :: GAIN; + FMOD_DSP_FADER_OVERALL_GAIN :: OVERALL_GAIN; +} + +FMOD_DSP_FLANGE :: enum s32 { + MIX :: 0; + DEPTH :: 1; + RATE :: 2; + + FMOD_DSP_FLANGE_MIX :: MIX; + FMOD_DSP_FLANGE_DEPTH :: DEPTH; + FMOD_DSP_FLANGE_RATE :: RATE; +} + +FMOD_DSP_DISTORTION :: enum s32 { + FMOD_DSP_DISTORTION_LEVEL :: 0; +} + +FMOD_DSP_NORMALIZE :: enum s32 { + FADETIME :: 0; + THRESHOLD :: 1; + MAXAMP :: 2; + + FMOD_DSP_NORMALIZE_FADETIME :: FADETIME; + FMOD_DSP_NORMALIZE_THRESHOLD :: THRESHOLD; + FMOD_DSP_NORMALIZE_MAXAMP :: MAXAMP; +} + +FMOD_DSP_LIMITER :: enum s32 { + RELEASETIME :: 0; + CEILING :: 1; + MAXIMIZERGAIN :: 2; + MODE :: 3; + + FMOD_DSP_LIMITER_RELEASETIME :: RELEASETIME; + FMOD_DSP_LIMITER_CEILING :: CEILING; + FMOD_DSP_LIMITER_MAXIMIZERGAIN :: MAXIMIZERGAIN; + FMOD_DSP_LIMITER_MODE :: MODE; +} + +FMOD_DSP_PARAMEQ :: enum s32 { + CENTER :: 0; + BANDWIDTH :: 1; + GAIN :: 2; + + FMOD_DSP_PARAMEQ_CENTER :: CENTER; + FMOD_DSP_PARAMEQ_BANDWIDTH :: BANDWIDTH; + FMOD_DSP_PARAMEQ_GAIN :: GAIN; +} + +FMOD_DSP_MULTIBAND_EQ :: enum s32 { + A_FILTER :: 0; + A_FREQUENCY :: 1; + A_Q :: 2; + A_GAIN :: 3; + B_FILTER :: 4; + B_FREQUENCY :: 5; + B_Q :: 6; + B_GAIN :: 7; + C_FILTER :: 8; + C_FREQUENCY :: 9; + C_Q :: 10; + C_GAIN :: 11; + D_FILTER :: 12; + D_FREQUENCY :: 13; + D_Q :: 14; + D_GAIN :: 15; + E_FILTER :: 16; + E_FREQUENCY :: 17; + E_Q :: 18; + E_GAIN :: 19; + + FMOD_DSP_MULTIBAND_EQ_A_FILTER :: A_FILTER; + FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY :: A_FREQUENCY; + FMOD_DSP_MULTIBAND_EQ_A_Q :: A_Q; + FMOD_DSP_MULTIBAND_EQ_A_GAIN :: A_GAIN; + FMOD_DSP_MULTIBAND_EQ_B_FILTER :: B_FILTER; + FMOD_DSP_MULTIBAND_EQ_B_FREQUENCY :: B_FREQUENCY; + FMOD_DSP_MULTIBAND_EQ_B_Q :: B_Q; + FMOD_DSP_MULTIBAND_EQ_B_GAIN :: B_GAIN; + FMOD_DSP_MULTIBAND_EQ_C_FILTER :: C_FILTER; + FMOD_DSP_MULTIBAND_EQ_C_FREQUENCY :: C_FREQUENCY; + FMOD_DSP_MULTIBAND_EQ_C_Q :: C_Q; + FMOD_DSP_MULTIBAND_EQ_C_GAIN :: C_GAIN; + FMOD_DSP_MULTIBAND_EQ_D_FILTER :: D_FILTER; + FMOD_DSP_MULTIBAND_EQ_D_FREQUENCY :: D_FREQUENCY; + FMOD_DSP_MULTIBAND_EQ_D_Q :: D_Q; + FMOD_DSP_MULTIBAND_EQ_D_GAIN :: D_GAIN; + FMOD_DSP_MULTIBAND_EQ_E_FILTER :: E_FILTER; + FMOD_DSP_MULTIBAND_EQ_E_FREQUENCY :: E_FREQUENCY; + FMOD_DSP_MULTIBAND_EQ_E_Q :: E_Q; + FMOD_DSP_MULTIBAND_EQ_E_GAIN :: E_GAIN; +} + +FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE :: enum s32 { + DISABLED :: 0; + LOWPASS_12DB :: 1; + LOWPASS_24DB :: 2; + LOWPASS_48DB :: 3; + HIGHPASS_12DB :: 4; + HIGHPASS_24DB :: 5; + HIGHPASS_48DB :: 6; + LOWSHELF :: 7; + HIGHSHELF :: 8; + PEAKING :: 9; + BANDPASS :: 10; + NOTCH :: 11; + ALLPASS :: 12; + + FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED :: DISABLED; + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB :: LOWPASS_12DB; + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB :: LOWPASS_24DB; + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_48DB :: LOWPASS_48DB; + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB :: HIGHPASS_12DB; + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_24DB :: HIGHPASS_24DB; + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_48DB :: HIGHPASS_48DB; + FMOD_DSP_MULTIBAND_EQ_FILTER_LOWSHELF :: LOWSHELF; + FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHSHELF :: HIGHSHELF; + FMOD_DSP_MULTIBAND_EQ_FILTER_PEAKING :: PEAKING; + FMOD_DSP_MULTIBAND_EQ_FILTER_BANDPASS :: BANDPASS; + FMOD_DSP_MULTIBAND_EQ_FILTER_NOTCH :: NOTCH; + FMOD_DSP_MULTIBAND_EQ_FILTER_ALLPASS :: ALLPASS; +} + +FMOD_DSP_PITCHSHIFT :: enum s32 { + PITCH :: 0; + FFTSIZE :: 1; + OVERLAP :: 2; + MAXCHANNELS :: 3; + + FMOD_DSP_PITCHSHIFT_PITCH :: PITCH; + FMOD_DSP_PITCHSHIFT_FFTSIZE :: FFTSIZE; + FMOD_DSP_PITCHSHIFT_OVERLAP :: OVERLAP; + FMOD_DSP_PITCHSHIFT_MAXCHANNELS :: MAXCHANNELS; +} + +FMOD_DSP_CHORUS :: enum s32 { + MIX :: 0; + RATE :: 1; + DEPTH :: 2; + + FMOD_DSP_CHORUS_MIX :: MIX; + FMOD_DSP_CHORUS_RATE :: RATE; + FMOD_DSP_CHORUS_DEPTH :: DEPTH; +} + +FMOD_DSP_ITECHO :: enum s32 { + WETDRYMIX :: 0; + FEEDBACK :: 1; + LEFTDELAY :: 2; + RIGHTDELAY :: 3; + PANDELAY :: 4; + + FMOD_DSP_ITECHO_WETDRYMIX :: WETDRYMIX; + FMOD_DSP_ITECHO_FEEDBACK :: FEEDBACK; + FMOD_DSP_ITECHO_LEFTDELAY :: LEFTDELAY; + FMOD_DSP_ITECHO_RIGHTDELAY :: RIGHTDELAY; + FMOD_DSP_ITECHO_PANDELAY :: PANDELAY; +} + +FMOD_DSP_COMPRESSOR :: enum s32 { + THRESHOLD :: 0; + RATIO :: 1; + ATTACK :: 2; + RELEASE :: 3; + GAINMAKEUP :: 4; + USESIDECHAIN :: 5; + LINKED :: 6; + + FMOD_DSP_COMPRESSOR_THRESHOLD :: THRESHOLD; + FMOD_DSP_COMPRESSOR_RATIO :: RATIO; + FMOD_DSP_COMPRESSOR_ATTACK :: ATTACK; + FMOD_DSP_COMPRESSOR_RELEASE :: RELEASE; + FMOD_DSP_COMPRESSOR_GAINMAKEUP :: GAINMAKEUP; + FMOD_DSP_COMPRESSOR_USESIDECHAIN :: USESIDECHAIN; + FMOD_DSP_COMPRESSOR_LINKED :: LINKED; +} + +FMOD_DSP_SFXREVERB :: enum s32 { + DECAYTIME :: 0; + EARLYDELAY :: 1; + LATEDELAY :: 2; + HFREFERENCE :: 3; + HFDECAYRATIO :: 4; + DIFFUSION :: 5; + DENSITY :: 6; + LOWSHELFFREQUENCY :: 7; + LOWSHELFGAIN :: 8; + HIGHCUT :: 9; + EARLYLATEMIX :: 10; + WETLEVEL :: 11; + DRYLEVEL :: 12; + + FMOD_DSP_SFXREVERB_DECAYTIME :: DECAYTIME; + FMOD_DSP_SFXREVERB_EARLYDELAY :: EARLYDELAY; + FMOD_DSP_SFXREVERB_LATEDELAY :: LATEDELAY; + FMOD_DSP_SFXREVERB_HFREFERENCE :: HFREFERENCE; + FMOD_DSP_SFXREVERB_HFDECAYRATIO :: HFDECAYRATIO; + FMOD_DSP_SFXREVERB_DIFFUSION :: DIFFUSION; + FMOD_DSP_SFXREVERB_DENSITY :: DENSITY; + FMOD_DSP_SFXREVERB_LOWSHELFFREQUENCY :: LOWSHELFFREQUENCY; + FMOD_DSP_SFXREVERB_LOWSHELFGAIN :: LOWSHELFGAIN; + FMOD_DSP_SFXREVERB_HIGHCUT :: HIGHCUT; + FMOD_DSP_SFXREVERB_EARLYLATEMIX :: EARLYLATEMIX; + FMOD_DSP_SFXREVERB_WETLEVEL :: WETLEVEL; + FMOD_DSP_SFXREVERB_DRYLEVEL :: DRYLEVEL; +} + +FMOD_DSP_LOWPASS_SIMPLE :: enum s32 { + FMOD_DSP_LOWPASS_SIMPLE_CUTOFF :: 0; +} + +FMOD_DSP_DELAY :: enum s32 { + CH0 :: 0; + CH1 :: 1; + CH2 :: 2; + CH3 :: 3; + CH4 :: 4; + CH5 :: 5; + CH6 :: 6; + CH7 :: 7; + CH8 :: 8; + CH9 :: 9; + CH10 :: 10; + CH11 :: 11; + CH12 :: 12; + CH13 :: 13; + CH14 :: 14; + CH15 :: 15; + MAXDELAY :: 16; + + FMOD_DSP_DELAY_CH0 :: CH0; + FMOD_DSP_DELAY_CH1 :: CH1; + FMOD_DSP_DELAY_CH2 :: CH2; + FMOD_DSP_DELAY_CH3 :: CH3; + FMOD_DSP_DELAY_CH4 :: CH4; + FMOD_DSP_DELAY_CH5 :: CH5; + FMOD_DSP_DELAY_CH6 :: CH6; + FMOD_DSP_DELAY_CH7 :: CH7; + FMOD_DSP_DELAY_CH8 :: CH8; + FMOD_DSP_DELAY_CH9 :: CH9; + FMOD_DSP_DELAY_CH10 :: CH10; + FMOD_DSP_DELAY_CH11 :: CH11; + FMOD_DSP_DELAY_CH12 :: CH12; + FMOD_DSP_DELAY_CH13 :: CH13; + FMOD_DSP_DELAY_CH14 :: CH14; + FMOD_DSP_DELAY_CH15 :: CH15; + FMOD_DSP_DELAY_MAXDELAY :: MAXDELAY; +} + +FMOD_DSP_TREMOLO :: enum s32 { + FREQUENCY :: 0; + DEPTH :: 1; + SHAPE :: 2; + SKEW :: 3; + DUTY :: 4; + SQUARE :: 5; + PHASE :: 6; + SPREAD :: 7; + + FMOD_DSP_TREMOLO_FREQUENCY :: FREQUENCY; + FMOD_DSP_TREMOLO_DEPTH :: DEPTH; + FMOD_DSP_TREMOLO_SHAPE :: SHAPE; + FMOD_DSP_TREMOLO_SKEW :: SKEW; + FMOD_DSP_TREMOLO_DUTY :: DUTY; + FMOD_DSP_TREMOLO_SQUARE :: SQUARE; + FMOD_DSP_TREMOLO_PHASE :: PHASE; + FMOD_DSP_TREMOLO_SPREAD :: SPREAD; +} + +FMOD_DSP_SEND :: enum s32 { + RETURNID :: 0; + LEVEL :: 1; + + FMOD_DSP_SEND_RETURNID :: RETURNID; + FMOD_DSP_SEND_LEVEL :: LEVEL; +} + +FMOD_DSP_RETURN :: enum s32 { + ID :: 0; + INPUT_SPEAKER_MODE :: 1; + + FMOD_DSP_RETURN_ID :: ID; + FMOD_DSP_RETURN_INPUT_SPEAKER_MODE :: INPUT_SPEAKER_MODE; +} + +FMOD_DSP_HIGHPASS_SIMPLE :: enum s32 { + FMOD_DSP_HIGHPASS_SIMPLE_CUTOFF :: 0; +} + +FMOD_DSP_PAN_2D_STEREO_MODE_TYPE :: enum s32 { + TRIBUTED :: 0; + CRETE :: 1; + + FMOD_DSP_PAN_2D_STEREO_MODE_DISTRIBUTED :: TRIBUTED; + FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE :: CRETE; +} + +FMOD_DSP_PAN_MODE_TYPE :: enum s32 { + MONO :: 0; + STEREO :: 1; + SURROUND :: 2; + + FMOD_DSP_PAN_MODE_MONO :: MONO; + FMOD_DSP_PAN_MODE_STEREO :: STEREO; + FMOD_DSP_PAN_MODE_SURROUND :: SURROUND; +} + +FMOD_DSP_PAN_3D_ROLLOFF_TYPE :: enum s32 { + LINEARSQUARED :: 0; + LINEAR :: 1; + INVERSE :: 2; + INVERSETAPERED :: 3; + CUSTOM :: 4; + + FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED :: LINEARSQUARED; + FMOD_DSP_PAN_3D_ROLLOFF_LINEAR :: LINEAR; + FMOD_DSP_PAN_3D_ROLLOFF_INVERSE :: INVERSE; + FMOD_DSP_PAN_3D_ROLLOFF_INVERSETAPERED :: INVERSETAPERED; + FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM :: CUSTOM; +} + +FMOD_DSP_PAN_3D_EXTENT_MODE_TYPE :: enum s32 { + AUTO :: 0; + USER :: 1; + OFF :: 2; + + FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO :: AUTO; + FMOD_DSP_PAN_3D_EXTENT_MODE_USER :: USER; + FMOD_DSP_PAN_3D_EXTENT_MODE_OFF :: OFF; +} + +FMOD_DSP_PAN :: enum s32 { + MODE :: 0; + _2D_STEREO_POSITION :: 1; + _2D_DIRECTION :: 2; + _2D_EXTENT :: 3; + _2D_ROTATION :: 4; + _2D_LFE_LEVEL :: 5; + _2D_STEREO_MODE :: 6; + _2D_STEREO_SEPARATION :: 7; + _2D_STEREO_AXIS :: 8; + ENABLED_SPEAKERS :: 9; + _3D_POSITION :: 10; + _3D_ROLLOFF :: 11; + _3D_MIN_DISTANCE :: 12; + _3D_MAX_DISTANCE :: 13; + _3D_EXTENT_MODE :: 14; + _3D_SOUND_SIZE :: 15; + _3D_MIN_EXTENT :: 16; + _3D_PAN_BLEND :: 17; + LFE_UPMIX_ENABLED :: 18; + OVERALL_GAIN :: 19; + SURROUND_SPEAKER_MODE :: 20; + _2D_HEIGHT_BLEND :: 21; + ATTENUATION_RANGE :: 22; + OVERRIDE_RANGE :: 23; + + FMOD_DSP_PAN_MODE :: MODE; + FMOD_DSP_PAN_2D_STEREO_POSITION :: _2D_STEREO_POSITION; + FMOD_DSP_PAN_2D_DIRECTION :: _2D_DIRECTION; + FMOD_DSP_PAN_2D_EXTENT :: _2D_EXTENT; + FMOD_DSP_PAN_2D_ROTATION :: _2D_ROTATION; + FMOD_DSP_PAN_2D_LFE_LEVEL :: _2D_LFE_LEVEL; + FMOD_DSP_PAN_2D_STEREO_MODE :: _2D_STEREO_MODE; + FMOD_DSP_PAN_2D_STEREO_SEPARATION :: _2D_STEREO_SEPARATION; + FMOD_DSP_PAN_2D_STEREO_AXIS :: _2D_STEREO_AXIS; + FMOD_DSP_PAN_ENABLED_SPEAKERS :: ENABLED_SPEAKERS; + FMOD_DSP_PAN_3D_POSITION :: _3D_POSITION; + FMOD_DSP_PAN_3D_ROLLOFF :: _3D_ROLLOFF; + FMOD_DSP_PAN_3D_MIN_DISTANCE :: _3D_MIN_DISTANCE; + FMOD_DSP_PAN_3D_MAX_DISTANCE :: _3D_MAX_DISTANCE; + FMOD_DSP_PAN_3D_EXTENT_MODE :: _3D_EXTENT_MODE; + FMOD_DSP_PAN_3D_SOUND_SIZE :: _3D_SOUND_SIZE; + FMOD_DSP_PAN_3D_MIN_EXTENT :: _3D_MIN_EXTENT; + FMOD_DSP_PAN_3D_PAN_BLEND :: _3D_PAN_BLEND; + FMOD_DSP_PAN_LFE_UPMIX_ENABLED :: LFE_UPMIX_ENABLED; + FMOD_DSP_PAN_OVERALL_GAIN :: OVERALL_GAIN; + FMOD_DSP_PAN_SURROUND_SPEAKER_MODE :: SURROUND_SPEAKER_MODE; + FMOD_DSP_PAN_2D_HEIGHT_BLEND :: _2D_HEIGHT_BLEND; + FMOD_DSP_PAN_ATTENUATION_RANGE :: ATTENUATION_RANGE; + FMOD_DSP_PAN_OVERRIDE_RANGE :: OVERRIDE_RANGE; +} + +FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE :: enum s32 { + _12DB :: 0; + _24DB :: 1; + _48DB :: 2; + + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_12DB :: _12DB; + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_24DB :: _24DB; + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_48DB :: _48DB; +} + +FMOD_DSP_THREE_EQ :: enum s32 { + LOWGAIN :: 0; + MIDGAIN :: 1; + HIGHGAIN :: 2; + LOWCROSSOVER :: 3; + HIGHCROSSOVER :: 4; + CROSSOVERSLOPE :: 5; + + FMOD_DSP_THREE_EQ_LOWGAIN :: LOWGAIN; + FMOD_DSP_THREE_EQ_MIDGAIN :: MIDGAIN; + FMOD_DSP_THREE_EQ_HIGHGAIN :: HIGHGAIN; + FMOD_DSP_THREE_EQ_LOWCROSSOVER :: LOWCROSSOVER; + FMOD_DSP_THREE_EQ_HIGHCROSSOVER :: HIGHCROSSOVER; + FMOD_DSP_THREE_EQ_CROSSOVERSLOPE :: CROSSOVERSLOPE; +} + +FMOD_DSP_FFT_WINDOW :: enum s32 { + RECT :: 0; + TRIANGLE :: 1; + HAMMING :: 2; + HANNING :: 3; + BLACKMAN :: 4; + BLACKMANHARRIS :: 5; + + FMOD_DSP_FFT_WINDOW_RECT :: RECT; + FMOD_DSP_FFT_WINDOW_TRIANGLE :: TRIANGLE; + FMOD_DSP_FFT_WINDOW_HAMMING :: HAMMING; + FMOD_DSP_FFT_WINDOW_HANNING :: HANNING; + FMOD_DSP_FFT_WINDOW_BLACKMAN :: BLACKMAN; + FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS :: BLACKMANHARRIS; +} + +FMOD_DSP_FFT :: enum s32 { + WINDOWSIZE :: 0; + WINDOWTYPE :: 1; + SPECTRUMDATA :: 2; + DOMINANT_FREQ :: 3; + + FMOD_DSP_FFT_WINDOWSIZE :: WINDOWSIZE; + FMOD_DSP_FFT_WINDOWTYPE :: WINDOWTYPE; + FMOD_DSP_FFT_SPECTRUMDATA :: SPECTRUMDATA; + FMOD_DSP_FFT_DOMINANT_FREQ :: DOMINANT_FREQ; +} + +FMOD_DSP_LOUDNESS_METER :: enum s32 { + STATE :: 0; + WEIGHTING :: 1; + INFO :: 2; + + FMOD_DSP_LOUDNESS_METER_STATE :: STATE; + FMOD_DSP_LOUDNESS_METER_WEIGHTING :: WEIGHTING; + FMOD_DSP_LOUDNESS_METER_INFO :: INFO; +} + +FMOD_DSP_LOUDNESS_METER_STATE_TYPE :: enum s32 { + RESET_INTEGRATED :: -3; + RESET_MAXPEAK :: -2; + RESET_ALL :: -1; + PAUSED :: 0; + ANALYZING :: 1; + + FMOD_DSP_LOUDNESS_METER_STATE_RESET_INTEGRATED :: RESET_INTEGRATED; + FMOD_DSP_LOUDNESS_METER_STATE_RESET_MAXPEAK :: RESET_MAXPEAK; + FMOD_DSP_LOUDNESS_METER_STATE_RESET_ALL :: RESET_ALL; + FMOD_DSP_LOUDNESS_METER_STATE_PAUSED :: PAUSED; + FMOD_DSP_LOUDNESS_METER_STATE_ANALYZING :: ANALYZING; +} + +FMOD_DSP_LOUDNESS_METER_INFO_TYPE :: struct { + momentaryloudness: float; + shorttermloudness: float; + integratedloudness: float; + loudness10thpercentile: float; + loudness95thpercentile: float; + loudnesshistogram: [66] float; + maxtruepeak: float; + maxmomentaryloudness: float; +} + +FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE :: struct { + channelweight: [32] float; +} + +FMOD_DSP_ENVELOPEFOLLOWER :: enum s32 { + ATTACK :: 0; + RELEASE :: 1; + ENVELOPE :: 2; + USESIDECHAIN :: 3; + + FMOD_DSP_ENVELOPEFOLLOWER_ATTACK :: ATTACK; + FMOD_DSP_ENVELOPEFOLLOWER_RELEASE :: RELEASE; + FMOD_DSP_ENVELOPEFOLLOWER_ENVELOPE :: ENVELOPE; + FMOD_DSP_ENVELOPEFOLLOWER_USESIDECHAIN :: USESIDECHAIN; +} + +FMOD_DSP_CONVOLUTION_REVERB :: enum s32 { + IR :: 0; + WET :: 1; + DRY :: 2; + LINKED :: 3; + + FMOD_DSP_CONVOLUTION_REVERB_PARAM_IR :: IR; + FMOD_DSP_CONVOLUTION_REVERB_PARAM_WET :: WET; + FMOD_DSP_CONVOLUTION_REVERB_PARAM_DRY :: DRY; + FMOD_DSP_CONVOLUTION_REVERB_PARAM_LINKED :: LINKED; +} + +FMOD_DSP_CHANNELMIX_OUTPUT :: enum s32 { + DEFAULT :: 0; + ALLMONO :: 1; + ALLSTEREO :: 2; + ALLQUAD :: 3; + ALL5POINT1 :: 4; + ALL7POINT1 :: 5; + ALLLFE :: 6; + ALL7POINT1POINT4 :: 7; + + FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT :: DEFAULT; + FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO :: ALLMONO; + FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO :: ALLSTEREO; + FMOD_DSP_CHANNELMIX_OUTPUT_ALLQUAD :: ALLQUAD; + FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1 :: ALL5POINT1; + FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1 :: ALL7POINT1; + FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE :: ALLLFE; + FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1POINT4 :: ALL7POINT1POINT4; +} + +FMOD_DSP_CHANNELMIX :: enum s32 { + OUTPUTGROUPING :: 0; + GAIN_CH0 :: 1; + GAIN_CH1 :: 2; + GAIN_CH2 :: 3; + GAIN_CH3 :: 4; + GAIN_CH4 :: 5; + GAIN_CH5 :: 6; + GAIN_CH6 :: 7; + GAIN_CH7 :: 8; + GAIN_CH8 :: 9; + GAIN_CH9 :: 10; + GAIN_CH10 :: 11; + GAIN_CH11 :: 12; + GAIN_CH12 :: 13; + GAIN_CH13 :: 14; + GAIN_CH14 :: 15; + GAIN_CH15 :: 16; + GAIN_CH16 :: 17; + GAIN_CH17 :: 18; + GAIN_CH18 :: 19; + GAIN_CH19 :: 20; + GAIN_CH20 :: 21; + GAIN_CH21 :: 22; + GAIN_CH22 :: 23; + GAIN_CH23 :: 24; + GAIN_CH24 :: 25; + GAIN_CH25 :: 26; + GAIN_CH26 :: 27; + GAIN_CH27 :: 28; + GAIN_CH28 :: 29; + GAIN_CH29 :: 30; + GAIN_CH30 :: 31; + GAIN_CH31 :: 32; + OUTPUT_CH0 :: 33; + OUTPUT_CH1 :: 34; + OUTPUT_CH2 :: 35; + OUTPUT_CH3 :: 36; + OUTPUT_CH4 :: 37; + OUTPUT_CH5 :: 38; + OUTPUT_CH6 :: 39; + OUTPUT_CH7 :: 40; + OUTPUT_CH8 :: 41; + OUTPUT_CH9 :: 42; + OUTPUT_CH10 :: 43; + OUTPUT_CH11 :: 44; + OUTPUT_CH12 :: 45; + OUTPUT_CH13 :: 46; + OUTPUT_CH14 :: 47; + OUTPUT_CH15 :: 48; + OUTPUT_CH16 :: 49; + OUTPUT_CH17 :: 50; + OUTPUT_CH18 :: 51; + OUTPUT_CH19 :: 52; + OUTPUT_CH20 :: 53; + OUTPUT_CH21 :: 54; + OUTPUT_CH22 :: 55; + OUTPUT_CH23 :: 56; + OUTPUT_CH24 :: 57; + OUTPUT_CH25 :: 58; + OUTPUT_CH26 :: 59; + OUTPUT_CH27 :: 60; + OUTPUT_CH28 :: 61; + OUTPUT_CH29 :: 62; + OUTPUT_CH30 :: 63; + OUTPUT_CH31 :: 64; + + FMOD_DSP_CHANNELMIX_OUTPUTGROUPING :: OUTPUTGROUPING; + FMOD_DSP_CHANNELMIX_GAIN_CH0 :: GAIN_CH0; + FMOD_DSP_CHANNELMIX_GAIN_CH1 :: GAIN_CH1; + FMOD_DSP_CHANNELMIX_GAIN_CH2 :: GAIN_CH2; + FMOD_DSP_CHANNELMIX_GAIN_CH3 :: GAIN_CH3; + FMOD_DSP_CHANNELMIX_GAIN_CH4 :: GAIN_CH4; + FMOD_DSP_CHANNELMIX_GAIN_CH5 :: GAIN_CH5; + FMOD_DSP_CHANNELMIX_GAIN_CH6 :: GAIN_CH6; + FMOD_DSP_CHANNELMIX_GAIN_CH7 :: GAIN_CH7; + FMOD_DSP_CHANNELMIX_GAIN_CH8 :: GAIN_CH8; + FMOD_DSP_CHANNELMIX_GAIN_CH9 :: GAIN_CH9; + FMOD_DSP_CHANNELMIX_GAIN_CH10 :: GAIN_CH10; + FMOD_DSP_CHANNELMIX_GAIN_CH11 :: GAIN_CH11; + FMOD_DSP_CHANNELMIX_GAIN_CH12 :: GAIN_CH12; + FMOD_DSP_CHANNELMIX_GAIN_CH13 :: GAIN_CH13; + FMOD_DSP_CHANNELMIX_GAIN_CH14 :: GAIN_CH14; + FMOD_DSP_CHANNELMIX_GAIN_CH15 :: GAIN_CH15; + FMOD_DSP_CHANNELMIX_GAIN_CH16 :: GAIN_CH16; + FMOD_DSP_CHANNELMIX_GAIN_CH17 :: GAIN_CH17; + FMOD_DSP_CHANNELMIX_GAIN_CH18 :: GAIN_CH18; + FMOD_DSP_CHANNELMIX_GAIN_CH19 :: GAIN_CH19; + FMOD_DSP_CHANNELMIX_GAIN_CH20 :: GAIN_CH20; + FMOD_DSP_CHANNELMIX_GAIN_CH21 :: GAIN_CH21; + FMOD_DSP_CHANNELMIX_GAIN_CH22 :: GAIN_CH22; + FMOD_DSP_CHANNELMIX_GAIN_CH23 :: GAIN_CH23; + FMOD_DSP_CHANNELMIX_GAIN_CH24 :: GAIN_CH24; + FMOD_DSP_CHANNELMIX_GAIN_CH25 :: GAIN_CH25; + FMOD_DSP_CHANNELMIX_GAIN_CH26 :: GAIN_CH26; + FMOD_DSP_CHANNELMIX_GAIN_CH27 :: GAIN_CH27; + FMOD_DSP_CHANNELMIX_GAIN_CH28 :: GAIN_CH28; + FMOD_DSP_CHANNELMIX_GAIN_CH29 :: GAIN_CH29; + FMOD_DSP_CHANNELMIX_GAIN_CH30 :: GAIN_CH30; + FMOD_DSP_CHANNELMIX_GAIN_CH31 :: GAIN_CH31; + FMOD_DSP_CHANNELMIX_OUTPUT_CH0 :: OUTPUT_CH0; + FMOD_DSP_CHANNELMIX_OUTPUT_CH1 :: OUTPUT_CH1; + FMOD_DSP_CHANNELMIX_OUTPUT_CH2 :: OUTPUT_CH2; + FMOD_DSP_CHANNELMIX_OUTPUT_CH3 :: OUTPUT_CH3; + FMOD_DSP_CHANNELMIX_OUTPUT_CH4 :: OUTPUT_CH4; + FMOD_DSP_CHANNELMIX_OUTPUT_CH5 :: OUTPUT_CH5; + FMOD_DSP_CHANNELMIX_OUTPUT_CH6 :: OUTPUT_CH6; + FMOD_DSP_CHANNELMIX_OUTPUT_CH7 :: OUTPUT_CH7; + FMOD_DSP_CHANNELMIX_OUTPUT_CH8 :: OUTPUT_CH8; + FMOD_DSP_CHANNELMIX_OUTPUT_CH9 :: OUTPUT_CH9; + FMOD_DSP_CHANNELMIX_OUTPUT_CH10 :: OUTPUT_CH10; + FMOD_DSP_CHANNELMIX_OUTPUT_CH11 :: OUTPUT_CH11; + FMOD_DSP_CHANNELMIX_OUTPUT_CH12 :: OUTPUT_CH12; + FMOD_DSP_CHANNELMIX_OUTPUT_CH13 :: OUTPUT_CH13; + FMOD_DSP_CHANNELMIX_OUTPUT_CH14 :: OUTPUT_CH14; + FMOD_DSP_CHANNELMIX_OUTPUT_CH15 :: OUTPUT_CH15; + FMOD_DSP_CHANNELMIX_OUTPUT_CH16 :: OUTPUT_CH16; + FMOD_DSP_CHANNELMIX_OUTPUT_CH17 :: OUTPUT_CH17; + FMOD_DSP_CHANNELMIX_OUTPUT_CH18 :: OUTPUT_CH18; + FMOD_DSP_CHANNELMIX_OUTPUT_CH19 :: OUTPUT_CH19; + FMOD_DSP_CHANNELMIX_OUTPUT_CH20 :: OUTPUT_CH20; + FMOD_DSP_CHANNELMIX_OUTPUT_CH21 :: OUTPUT_CH21; + FMOD_DSP_CHANNELMIX_OUTPUT_CH22 :: OUTPUT_CH22; + FMOD_DSP_CHANNELMIX_OUTPUT_CH23 :: OUTPUT_CH23; + FMOD_DSP_CHANNELMIX_OUTPUT_CH24 :: OUTPUT_CH24; + FMOD_DSP_CHANNELMIX_OUTPUT_CH25 :: OUTPUT_CH25; + FMOD_DSP_CHANNELMIX_OUTPUT_CH26 :: OUTPUT_CH26; + FMOD_DSP_CHANNELMIX_OUTPUT_CH27 :: OUTPUT_CH27; + FMOD_DSP_CHANNELMIX_OUTPUT_CH28 :: OUTPUT_CH28; + FMOD_DSP_CHANNELMIX_OUTPUT_CH29 :: OUTPUT_CH29; + FMOD_DSP_CHANNELMIX_OUTPUT_CH30 :: OUTPUT_CH30; + FMOD_DSP_CHANNELMIX_OUTPUT_CH31 :: OUTPUT_CH31; +} + +FMOD_DSP_TRANSCEIVER_SPEAKERMODE :: enum s32 { + AUTO :: -1; + MONO :: 0; + STEREO :: 1; + SURROUND :: 2; + + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_AUTO :: AUTO; + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO :: MONO; + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO :: STEREO; + FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND :: SURROUND; +} + +FMOD_DSP_TRANSCEIVER :: enum s32 { + TRANSMIT :: 0; + GAIN :: 1; + CHANNEL :: 2; + TRANSMITSPEAKERMODE :: 3; + + FMOD_DSP_TRANSCEIVER_TRANSMIT :: TRANSMIT; + FMOD_DSP_TRANSCEIVER_GAIN :: GAIN; + FMOD_DSP_TRANSCEIVER_CHANNEL :: CHANNEL; + FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE :: TRANSMITSPEAKERMODE; +} + +FMOD_DSP_OBJECTPAN :: enum s32 { + _3D_POSITION :: 0; + _3D_ROLLOFF :: 1; + _3D_MIN_DISTANCE :: 2; + _3D_MAX_DISTANCE :: 3; + _3D_EXTENT_MODE :: 4; + _3D_SOUND_SIZE :: 5; + _3D_MIN_EXTENT :: 6; + OVERALL_GAIN :: 7; + OUTPUTGAIN :: 8; + ATTENUATION_RANGE :: 9; + OVERRIDE_RANGE :: 10; + + FMOD_DSP_OBJECTPAN_3D_POSITION :: _3D_POSITION; + FMOD_DSP_OBJECTPAN_3D_ROLLOFF :: _3D_ROLLOFF; + FMOD_DSP_OBJECTPAN_3D_MIN_DISTANCE :: _3D_MIN_DISTANCE; + FMOD_DSP_OBJECTPAN_3D_MAX_DISTANCE :: _3D_MAX_DISTANCE; + FMOD_DSP_OBJECTPAN_3D_EXTENT_MODE :: _3D_EXTENT_MODE; + FMOD_DSP_OBJECTPAN_3D_SOUND_SIZE :: _3D_SOUND_SIZE; + FMOD_DSP_OBJECTPAN_3D_MIN_EXTENT :: _3D_MIN_EXTENT; + FMOD_DSP_OBJECTPAN_OVERALL_GAIN :: OVERALL_GAIN; + FMOD_DSP_OBJECTPAN_OUTPUTGAIN :: OUTPUTGAIN; + FMOD_DSP_OBJECTPAN_ATTENUATION_RANGE :: ATTENUATION_RANGE; + FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE :: OVERRIDE_RANGE; +} + +FMOD_DSP_PROCESS_OPERATION :: enum s32 { + PERFORM :: 0; + QUERY :: 1; + + FMOD_DSP_PROCESS_PERFORM :: PERFORM; + FMOD_DSP_PROCESS_QUERY :: QUERY; +} + +FMOD_DSP_PAN_SURROUND_FLAGS :: enum s32 { + FMOD_DSP_PAN_SURROUND_DEFAULT :: 0; + FMOD_DSP_PAN_SURROUND_ROTATION_NOT_BIASED :: 1; + + FORCEINT :: 65536; + FMOD_DSP_PAN_SURROUND_FLAGS_FORCEINT :: FORCEINT; +} + +FMOD_DSP_PARAMETER_TYPE :: enum s32 { + FLOAT :: 0; + INT :: 1; + BOOL :: 2; + DATA :: 3; + + MAX :: 4; + FORCEINT :: 65536; + + FMOD_DSP_PARAMETER_TYPE_FLOAT :: FLOAT; + FMOD_DSP_PARAMETER_TYPE_INT :: INT; + FMOD_DSP_PARAMETER_TYPE_BOOL :: BOOL; + FMOD_DSP_PARAMETER_TYPE_DATA :: DATA; + + FMOD_DSP_PARAMETER_TYPE_MAX :: MAX; + FMOD_DSP_PARAMETER_TYPE_FORCEINT :: FORCEINT; +} + +FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE :: enum s32 { + LINEAR :: 0; + AUTO :: 1; + PIECEWISE_LINEAR :: 2; + + FORCEINT :: 65536; + + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR :: LINEAR; + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO :: AUTO; + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR :: PIECEWISE_LINEAR; + + FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_FORCEINT :: FORCEINT; +} + +FMOD_DSP_PARAMETER_DATA_TYPE :: enum s32 { + USER :: 0; + OVERALLGAIN :: -1; + _3DATTRIBUTES :: -2; + SIDECHAIN :: -3; + FFT :: -4; + _3DATTRIBUTES_MULTI :: -5; + ATTENUATION_RANGE :: -6; + + FMOD_DSP_PARAMETER_DATA_TYPE_USER :: USER; + FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN :: OVERALLGAIN; + FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES :: _3DATTRIBUTES; + FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN :: SIDECHAIN; + FMOD_DSP_PARAMETER_DATA_TYPE_FFT :: FFT; + FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI :: _3DATTRIBUTES_MULTI; + FMOD_DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE :: ATTENUATION_RANGE; +} + +/* +DSP Callbacks +*/ +FMOD_DSP_CREATE_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE) -> FMOD_RESULT #c_call; +FMOD_DSP_RELEASE_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE) -> FMOD_RESULT #c_call; +FMOD_DSP_RESET_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE) -> FMOD_RESULT #c_call; +FMOD_DSP_READ_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, inbuffer: *float, outbuffer: *float, length: u32, inchannels: s32, outchannels: *s32) -> FMOD_RESULT #c_call; +FMOD_DSP_PROCESS_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, length: u32, inbufferarray: *FMOD_DSP_BUFFER_ARRAY, outbufferarray: *FMOD_DSP_BUFFER_ARRAY, inputsidle: FMOD_BOOL, op: FMOD_DSP_PROCESS_OPERATION) -> FMOD_RESULT #c_call; +FMOD_DSP_SETPOSITION_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, pos: u32) -> FMOD_RESULT #c_call; +FMOD_DSP_SHOULDIPROCESS_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, inputsidle: FMOD_BOOL, length: u32, inmask: FMOD_CHANNELMASK, inchannels: s32, speakermode: FMOD_SPEAKERMODE) -> FMOD_RESULT #c_call; +FMOD_DSP_SETPARAM_FLOAT_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, index: s32, value: float) -> FMOD_RESULT #c_call; +FMOD_DSP_SETPARAM_INT_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, index: s32, value: s32) -> FMOD_RESULT #c_call; +FMOD_DSP_SETPARAM_BOOL_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, index: s32, value: FMOD_BOOL) -> FMOD_RESULT #c_call; +FMOD_DSP_SETPARAM_DATA_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, index: s32, data: *void, length: u32) -> FMOD_RESULT #c_call; +FMOD_DSP_GETPARAM_FLOAT_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, index: s32, value: *float, valuestr: *u8) -> FMOD_RESULT #c_call; +FMOD_DSP_GETPARAM_INT_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, index: s32, value: *s32, valuestr: *u8) -> FMOD_RESULT #c_call; +FMOD_DSP_GETPARAM_BOOL_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, index: s32, value: *FMOD_BOOL, valuestr: *u8) -> FMOD_RESULT #c_call; +FMOD_DSP_GETPARAM_DATA_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, index: s32, data: **void, length: *u32, valuestr: *u8) -> FMOD_RESULT #c_call; +FMOD_DSP_SYSTEM_REGISTER_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE) -> FMOD_RESULT #c_call; +FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE) -> FMOD_RESULT #c_call; +FMOD_DSP_SYSTEM_MIX_CALLBACK :: #type (dsp_state: *FMOD_DSP_STATE, stage: s32) -> FMOD_RESULT #c_call; + +/* +DSP Functions +*/ +FMOD_DSP_ALLOC_FUNC :: #type (size: u32, type: FMOD_MEMORY_TYPE, sourcestr: *u8) -> *void #c_call; +FMOD_DSP_REALLOC_FUNC :: #type (ptr: *void, size: u32, type: FMOD_MEMORY_TYPE, sourcestr: *u8) -> *void #c_call; +FMOD_DSP_FREE_FUNC :: #type (ptr: *void, type: FMOD_MEMORY_TYPE, sourcestr: *u8) -> void #c_call; +FMOD_DSP_LOG_FUNC :: #type (level: FMOD_DEBUG_FLAGS, file: *u8, line: s32, function: *u8, str: *u8, __args: ..Any) -> void #c_call; +FMOD_DSP_GETSAMPLERATE_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, rate: *s32) -> FMOD_RESULT #c_call; +FMOD_DSP_GETBLOCKSIZE_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, blocksize: *u32) -> FMOD_RESULT #c_call; +FMOD_DSP_GETSPEAKERMODE_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, speakermode_mixer: *FMOD_SPEAKERMODE, speakermode_output: *FMOD_SPEAKERMODE) -> FMOD_RESULT #c_call; +FMOD_DSP_GETCLOCK_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, clock: *u64, offset: *u32, length: *u32) -> FMOD_RESULT #c_call; +FMOD_DSP_GETLISTENERATTRIBUTES_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, numlisteners: *s32, attributes: *FMOD_3D_ATTRIBUTES) -> FMOD_RESULT #c_call; +FMOD_DSP_GETUSERDATA_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, userdata: **void) -> FMOD_RESULT #c_call; +FMOD_DSP_DFT_FFTREAL_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, size: s32, signal: *float, dft: *FMOD_COMPLEX, window: *float, signalhop: s32) -> FMOD_RESULT #c_call; +FMOD_DSP_DFT_IFFTREAL_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, size: s32, dft: *FMOD_COMPLEX, signal: *float, window: *float, signalhop: s32) -> FMOD_RESULT #c_call; +FMOD_DSP_PAN_SUMMONOMATRIX_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, sourceSpeakerMode: FMOD_SPEAKERMODE, lowFrequencyGain: float, overallGain: float, matrix: *float) -> FMOD_RESULT #c_call; +FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, sourceSpeakerMode: FMOD_SPEAKERMODE, pan: float, lowFrequencyGain: float, overallGain: float, matrixHop: s32, matrix: *float) -> FMOD_RESULT #c_call; +FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, sourceSpeakerMode: FMOD_SPEAKERMODE, targetSpeakerMode: FMOD_SPEAKERMODE, direction: float, extent: float, rotation: float, lowFrequencyGain: float, overallGain: float, matrixHop: s32, matrix: *float, flags: FMOD_DSP_PAN_SURROUND_FLAGS) -> FMOD_RESULT #c_call; +FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, targetSpeakerMode: FMOD_SPEAKERMODE, direction: float, extent: float, lowFrequencyGain: float, overallGain: float, matrixHop: s32, matrix: *float) -> FMOD_RESULT #c_call; +FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, targetSpeakerMode: FMOD_SPEAKERMODE, direction: float, extent: float, rotation: float, lowFrequencyGain: float, overallGain: float, matrixHop: s32, matrix: *float) -> FMOD_RESULT #c_call; +FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC :: #type (dsp_state: *FMOD_DSP_STATE, rolloff: FMOD_DSP_PAN_3D_ROLLOFF_TYPE, distance: float, mindistance: float, maxdistance: float, gain: *float) -> FMOD_RESULT #c_call; + +/* +DSP Structures +*/ +FMOD_DSP_BUFFER_ARRAY :: struct { + numbuffers: s32; + buffernumchannels: *s32; + bufferchannelmask: *FMOD_CHANNELMASK; + buffers: **float; + speakermode: FMOD_SPEAKERMODE; +} + +FMOD_COMPLEX :: struct { + real: float; + imag: float; +} + +FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR :: struct { + numpoints: s32; + pointparamvalues: *float; + pointpositions: *float; +} + +FMOD_DSP_PARAMETER_FLOAT_MAPPING :: struct { + type: FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE; + piecewiselinearmapping: FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR; +} + +FMOD_DSP_PARAMETER_DESC_FLOAT :: struct { + min: float; + max: float; + defaultval: float; + mapping: FMOD_DSP_PARAMETER_FLOAT_MAPPING; +} + +FMOD_DSP_PARAMETER_DESC_INT :: struct { + min: s32; + max: s32; + defaultval: s32; + goestoinf: FMOD_BOOL; + valuenames: **u8; +} + +FMOD_DSP_PARAMETER_DESC_BOOL :: struct { + defaultval: FMOD_BOOL; + valuenames: **u8; +} + +FMOD_DSP_PARAMETER_DESC_DATA :: struct { + datatype: s32; +} + +FMOD_DSP_PARAMETER_DESC :: struct { + type: FMOD_DSP_PARAMETER_TYPE; + name: [16] u8; + label: [16] u8; + description: *u8; + + union { + floatdesc: FMOD_DSP_PARAMETER_DESC_FLOAT; + intdesc: FMOD_DSP_PARAMETER_DESC_INT; + booldesc: FMOD_DSP_PARAMETER_DESC_BOOL; + datadesc: FMOD_DSP_PARAMETER_DESC_DATA; + } +} + +FMOD_DSP_PARAMETER_OVERALLGAIN :: struct { + linear_gain: float; + linear_gain_additive: float; +} + +FMOD_DSP_PARAMETER_3DATTRIBUTES :: struct { + relative: FMOD_3D_ATTRIBUTES; + absolute: FMOD_3D_ATTRIBUTES; +} + +FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI :: struct { + numlisteners: s32; + relative: [8] FMOD_3D_ATTRIBUTES; + weight: [8] float; + absolute: FMOD_3D_ATTRIBUTES; +} + +FMOD_DSP_PARAMETER_ATTENUATION_RANGE :: struct { + min: float; + max: float; +} + +FMOD_DSP_PARAMETER_SIDECHAIN :: struct { + sidechainenable: FMOD_BOOL; +} + +FMOD_DSP_PARAMETER_FFT :: struct { + length: s32; + numchannels: s32; + spectrum: [32] *float; +} + +FMOD_DSP_DESCRIPTION :: struct { + pluginsdkversion: u32; + name: [32] u8; + version: u32; + numinputbuffers: s32; + numoutputbuffers: s32; + create: FMOD_DSP_CREATE_CALLBACK; + release: FMOD_DSP_RELEASE_CALLBACK; + reset: FMOD_DSP_RESET_CALLBACK; + read: FMOD_DSP_READ_CALLBACK; + process: FMOD_DSP_PROCESS_CALLBACK; + setposition: FMOD_DSP_SETPOSITION_CALLBACK; + + numparameters: s32; + paramdesc: **FMOD_DSP_PARAMETER_DESC; + setparameterfloat: FMOD_DSP_SETPARAM_FLOAT_CALLBACK; + setparameterint: FMOD_DSP_SETPARAM_INT_CALLBACK; + setparameterbool: FMOD_DSP_SETPARAM_BOOL_CALLBACK; + setparameterdata: FMOD_DSP_SETPARAM_DATA_CALLBACK; + getparameterfloat: FMOD_DSP_GETPARAM_FLOAT_CALLBACK; + getparameterint: FMOD_DSP_GETPARAM_INT_CALLBACK; + getparameterbool: FMOD_DSP_GETPARAM_BOOL_CALLBACK; + getparameterdata: FMOD_DSP_GETPARAM_DATA_CALLBACK; + shouldiprocess: FMOD_DSP_SHOULDIPROCESS_CALLBACK; + userdata: *void; + + sys_register: FMOD_DSP_SYSTEM_REGISTER_CALLBACK; + sys_deregister: FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK; + sys_mix: FMOD_DSP_SYSTEM_MIX_CALLBACK; +} + +FMOD_DSP_STATE_DFT_FUNCTIONS :: struct { + fftreal: FMOD_DSP_DFT_FFTREAL_FUNC; + inversefftreal: FMOD_DSP_DFT_IFFTREAL_FUNC; +} + +FMOD_DSP_STATE_PAN_FUNCTIONS :: struct { + summonomatrix: FMOD_DSP_PAN_SUMMONOMATRIX_FUNC; + sumstereomatrix: FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC; + sumsurroundmatrix: FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC; + summonotosurroundmatrix: FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC; + sumstereotosurroundmatrix: FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC; + getrolloffgain: FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC; +} + +FMOD_DSP_STATE_FUNCTIONS :: struct { + alloc: FMOD_DSP_ALLOC_FUNC; + realloc: FMOD_DSP_REALLOC_FUNC; + free: FMOD_DSP_FREE_FUNC; + getsamplerate: FMOD_DSP_GETSAMPLERATE_FUNC; + getblocksize: FMOD_DSP_GETBLOCKSIZE_FUNC; + dft: *FMOD_DSP_STATE_DFT_FUNCTIONS; + pan: *FMOD_DSP_STATE_PAN_FUNCTIONS; + getspeakermode: FMOD_DSP_GETSPEAKERMODE_FUNC; + getclock: FMOD_DSP_GETCLOCK_FUNC; + getlistenerattributes: FMOD_DSP_GETLISTENERATTRIBUTES_FUNC; + log: FMOD_DSP_LOG_FUNC; + getuserdata: FMOD_DSP_GETUSERDATA_FUNC; +} + +FMOD_DSP_STATE :: struct { + instance: *void; + plugindata: *void; + channelmask: FMOD_CHANNELMASK; + source_speakermode: FMOD_SPEAKERMODE; + sidechaindata: *float; + sidechainchannels: s32; + functions: *FMOD_DSP_STATE_FUNCTIONS; + systemobject: s32; +} + +FMOD_DSP_METERING_INFO :: struct { + numsamples: s32; + peaklevel: [32] float; + rmslevel: [32] float; + numchannels: s16; +} + +FMOD_OUTPUT_METHOD :: u32; + +/* +Output callbacks +*/ +FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE, numdrivers: *s32) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_GETDRIVERINFO_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE, id: s32, name: *u8, namelen: s32, guid: *FMOD_GUID, systemrate: *s32, speakermode: *FMOD_SPEAKERMODE, speakermodechannels: *s32) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_INIT_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE, selecteddriver: s32, flags: FMOD_INITFLAGS, outputrate: *s32, speakermode: *FMOD_SPEAKERMODE, speakermodechannels: *s32, outputformat: *FMOD_SOUND_FORMAT, dspbufferlength: s32, dspnumbuffers: *s32, dspnumadditionalbuffers: *s32, extradriverdata: *void) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_START_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_STOP_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_CLOSE_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_UPDATE_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_GETHANDLE_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE, handle: **void) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_MIXER_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE, maxhardwareobjects: *s32) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE, object3d: **void) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_OBJECT3DFREE_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE, object3d: *void) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE, object3d: *void, info: *FMOD_OUTPUT_OBJECT3DINFO) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_OPENPORT_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE, portType: FMOD_PORT_TYPE, portIndex: FMOD_PORT_INDEX, portId: *s32, portRate: *s32, portChannels: *s32, portFormat: *FMOD_SOUND_FORMAT) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_CLOSEPORT_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE, portId: s32) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK :: #type (output_state: *FMOD_OUTPUT_STATE) -> FMOD_RESULT #c_call; + +/* +Output functions +*/ +FMOD_OUTPUT_READFROMMIXER_FUNC :: #type (output_state: *FMOD_OUTPUT_STATE, buffer: *void, length: u32) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_COPYPORT_FUNC :: #type (output_state: *FMOD_OUTPUT_STATE, portId: s32, buffer: *void, length: u32) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_REQUESTRESET_FUNC :: #type (output_state: *FMOD_OUTPUT_STATE) -> FMOD_RESULT #c_call; +FMOD_OUTPUT_ALLOC_FUNC :: #type (size: u32, align: u32, file: *u8, line: s32) -> *void #c_call; +FMOD_OUTPUT_FREE_FUNC :: #type (ptr: *void, file: *u8, line: s32) -> void #c_call; +FMOD_OUTPUT_LOG_FUNC :: #type (level: FMOD_DEBUG_FLAGS, file: *u8, line: s32, function: *u8, _string: *u8, __args: ..Any) -> void #c_call; + +/* +Output structures +*/ +FMOD_OUTPUT_DESCRIPTION :: struct { + apiversion: u32; + name: *u8; + version: u32; + method: FMOD_OUTPUT_METHOD; + getnumdrivers: FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK; + getdriverinfo: FMOD_OUTPUT_GETDRIVERINFO_CALLBACK; + init: FMOD_OUTPUT_INIT_CALLBACK; + start: FMOD_OUTPUT_START_CALLBACK; + stop: FMOD_OUTPUT_STOP_CALLBACK; + close: FMOD_OUTPUT_CLOSE_CALLBACK; + update: FMOD_OUTPUT_UPDATE_CALLBACK; + gethandle: FMOD_OUTPUT_GETHANDLE_CALLBACK; + mixer: FMOD_OUTPUT_MIXER_CALLBACK; + object3dgetinfo: FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK; + object3dalloc: FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK; + object3dfree: FMOD_OUTPUT_OBJECT3DFREE_CALLBACK; + object3dupdate: FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK; + openport: FMOD_OUTPUT_OPENPORT_CALLBACK; + closeport: FMOD_OUTPUT_CLOSEPORT_CALLBACK; + devicelistchanged: FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK; +} + +FMOD_OUTPUT_STATE :: struct { + plugindata: *void; + readfrommixer: FMOD_OUTPUT_READFROMMIXER_FUNC; + alloc: FMOD_OUTPUT_ALLOC_FUNC; + free: FMOD_OUTPUT_FREE_FUNC; + log: FMOD_OUTPUT_LOG_FUNC; + copyport: FMOD_OUTPUT_COPYPORT_FUNC; + requestreset: FMOD_OUTPUT_REQUESTRESET_FUNC; +} + +FMOD_OUTPUT_OBJECT3DINFO :: struct { + buffer: *float; + bufferlength: u32; + position: FMOD_VECTOR; + gain: float; + spread: float; + priority: float; +} + +/* +FMOD global system functions (optional). +*/ +FMOD_Memory_Initialize :: (poolmem: *void, poollen: s32, useralloc: FMOD_MEMORY_ALLOC_CALLBACK, userrealloc: FMOD_MEMORY_REALLOC_CALLBACK, userfree: FMOD_MEMORY_FREE_CALLBACK, memtypeflags: FMOD_MEMORY_TYPE) -> FMOD_RESULT #foreign fmod; +FMOD_Memory_GetStats :: (currentalloced: *s32, maxalloced: *s32, blocking: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Debug_Initialize :: (flags: FMOD_DEBUG_FLAGS, mode: FMOD_DEBUG_MODE, callback: FMOD_DEBUG_CALLBACK, filename: *u8) -> FMOD_RESULT #foreign fmod; +FMOD_File_SetDiskBusy :: (busy: s32) -> FMOD_RESULT #foreign fmod; +FMOD_File_GetDiskBusy :: (busy: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Thread_SetAttributes :: (type: FMOD_THREAD_TYPE, affinity: FMOD_THREAD_AFFINITY, priority: FMOD_THREAD_PRIORITY, stacksize: FMOD_THREAD_STACK_SIZE) -> FMOD_RESULT #foreign fmod; + +/* +FMOD System factory functions. Use this to create an FMOD System Instance. below you will see FMOD_System_Init/Close to get started. +*/ +FMOD_System_Create :: (system: **FMOD_SYSTEM, headerversion: u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_Release :: (system: *FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; + +/* Setup functions. */ +FMOD_System_SetOutput :: (system: *FMOD_SYSTEM, output: FMOD_OUTPUTTYPE) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetOutput :: (system: *FMOD_SYSTEM, output: *FMOD_OUTPUTTYPE) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetNumDrivers :: (system: *FMOD_SYSTEM, numdrivers: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetDriverInfo :: (system: *FMOD_SYSTEM, id: s32, name: *u8, namelen: s32, guid: *FMOD_GUID, systemrate: *s32, speakermode: *FMOD_SPEAKERMODE, speakermodechannels: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetDriver :: (system: *FMOD_SYSTEM, driver: s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetDriver :: (system: *FMOD_SYSTEM, driver: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetSoftwareChannels :: (system: *FMOD_SYSTEM, numsoftwarechannels: s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetSoftwareChannels :: (system: *FMOD_SYSTEM, numsoftwarechannels: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetSoftwareFormat :: (system: *FMOD_SYSTEM, samplerate: s32, speakermode: FMOD_SPEAKERMODE, numrawspeakers: s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetSoftwareFormat :: (system: *FMOD_SYSTEM, samplerate: *s32, speakermode: *FMOD_SPEAKERMODE, numrawspeakers: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetDSPBufferSize :: (system: *FMOD_SYSTEM, bufferlength: u32, numbuffers: s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetDSPBufferSize :: (system: *FMOD_SYSTEM, bufferlength: *u32, numbuffers: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetFileSystem :: (system: *FMOD_SYSTEM, useropen: FMOD_FILE_OPEN_CALLBACK, userclose: FMOD_FILE_CLOSE_CALLBACK, userread: FMOD_FILE_READ_CALLBACK, userseek: FMOD_FILE_SEEK_CALLBACK, userasyncread: FMOD_FILE_ASYNCREAD_CALLBACK, userasynccancel: FMOD_FILE_ASYNCCANCEL_CALLBACK, blockalign: s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_AttachFileSystem :: (system: *FMOD_SYSTEM, useropen: FMOD_FILE_OPEN_CALLBACK, userclose: FMOD_FILE_CLOSE_CALLBACK, userread: FMOD_FILE_READ_CALLBACK, userseek: FMOD_FILE_SEEK_CALLBACK) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetAdvancedSettings :: (system: *FMOD_SYSTEM, settings: *FMOD_ADVANCEDSETTINGS) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetAdvancedSettings :: (system: *FMOD_SYSTEM, settings: *FMOD_ADVANCEDSETTINGS) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetCallback :: (system: *FMOD_SYSTEM, callback: FMOD_SYSTEM_CALLBACK, callbackmask: FMOD_SYSTEM_CALLBACK_TYPE) -> FMOD_RESULT #foreign fmod; + +/* Plug-in support. */ +FMOD_System_SetPluginPath :: (system: *FMOD_SYSTEM, path: *u8) -> FMOD_RESULT #foreign fmod; +FMOD_System_LoadPlugin :: (system: *FMOD_SYSTEM, filename: *u8, handle: *u32, priority: u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_UnloadPlugin :: (system: *FMOD_SYSTEM, handle: u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetNumNestedPlugins :: (system: *FMOD_SYSTEM, handle: u32, count: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetNestedPlugin :: (system: *FMOD_SYSTEM, handle: u32, index: s32, nestedhandle: *u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetNumPlugins :: (system: *FMOD_SYSTEM, plugintype: FMOD_PLUGINTYPE, numplugins: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetPluginHandle :: (system: *FMOD_SYSTEM, plugintype: FMOD_PLUGINTYPE, index: s32, handle: *u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetPluginInfo :: (system: *FMOD_SYSTEM, handle: u32, plugintype: *FMOD_PLUGINTYPE, name: *u8, namelen: s32, version: *u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetOutputByPlugin :: (system: *FMOD_SYSTEM, handle: u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetOutputByPlugin :: (system: *FMOD_SYSTEM, handle: *u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_CreateDSPByPlugin :: (system: *FMOD_SYSTEM, handle: u32, dsp: **FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetDSPInfoByPlugin :: (system: *FMOD_SYSTEM, handle: u32, description: **FMOD_DSP_DESCRIPTION) -> FMOD_RESULT #foreign fmod; +FMOD_System_RegisterCodec :: (system: *FMOD_SYSTEM, description: *FMOD_CODEC_DESCRIPTION, handle: *u32, priority: u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_RegisterDSP :: (system: *FMOD_SYSTEM, description: *FMOD_DSP_DESCRIPTION, handle: *u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_RegisterOutput :: (system: *FMOD_SYSTEM, description: *FMOD_OUTPUT_DESCRIPTION, handle: *u32) -> FMOD_RESULT #foreign fmod; + +/* Init/Close. */ +FMOD_System_Init :: (system: *FMOD_SYSTEM, maxchannels: s32, flags: FMOD_INITFLAGS, extradriverdata: *void) -> FMOD_RESULT #foreign fmod; +FMOD_System_Close :: (system: *FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; + +/* General post-init system functions. */ +FMOD_System_Update :: (system: *FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetSpeakerPosition :: (system: *FMOD_SYSTEM, speaker: FMOD_SPEAKER, x: float, y: float, active: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetSpeakerPosition :: (system: *FMOD_SYSTEM, speaker: FMOD_SPEAKER, x: *float, y: *float, active: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetStreamBufferSize :: (system: *FMOD_SYSTEM, filebuffersize: u32, filebuffersizetype: FMOD_TIMEUNIT) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetStreamBufferSize :: (system: *FMOD_SYSTEM, filebuffersize: *u32, filebuffersizetype: *FMOD_TIMEUNIT) -> FMOD_RESULT #foreign fmod; +FMOD_System_Set3DSettings :: (system: *FMOD_SYSTEM, dopplerscale: float, distancefactor: float, rolloffscale: float) -> FMOD_RESULT #foreign fmod; +FMOD_System_Get3DSettings :: (system: *FMOD_SYSTEM, dopplerscale: *float, distancefactor: *float, rolloffscale: *float) -> FMOD_RESULT #foreign fmod; +FMOD_System_Set3DNumListeners :: (system: *FMOD_SYSTEM, numlisteners: s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_Get3DNumListeners :: (system: *FMOD_SYSTEM, numlisteners: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_Set3DListenerAttributes :: (system: *FMOD_SYSTEM, listener: s32, pos: *FMOD_VECTOR, vel: *FMOD_VECTOR, forward: *FMOD_VECTOR, up: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_System_Get3DListenerAttributes :: (system: *FMOD_SYSTEM, listener: s32, pos: *FMOD_VECTOR, vel: *FMOD_VECTOR, forward: *FMOD_VECTOR, up: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_System_Set3DRolloffCallback :: (system: *FMOD_SYSTEM, callback: FMOD_3D_ROLLOFF_CALLBACK) -> FMOD_RESULT #foreign fmod; +FMOD_System_MixerSuspend :: (system: *FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; +FMOD_System_MixerResume :: (system: *FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetDefaultMixMatrix :: (system: *FMOD_SYSTEM, sourcespeakermode: FMOD_SPEAKERMODE, targetspeakermode: FMOD_SPEAKERMODE, matrix: *float, matrixhop: s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetSpeakerModeChannels :: (system: *FMOD_SYSTEM, mode: FMOD_SPEAKERMODE, channels: *s32) -> FMOD_RESULT #foreign fmod; + +/* System information functions. */ +FMOD_System_GetVersion :: (system: *FMOD_SYSTEM, version: *u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetOutputHandle :: (system: *FMOD_SYSTEM, handle: **void) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetChannelsPlaying :: (system: *FMOD_SYSTEM, channels: *s32, realchannels: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetCPUUsage :: (system: *FMOD_SYSTEM, usage: *FMOD_CPU_USAGE) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetFileUsage :: (system: *FMOD_SYSTEM, sampleBytesRead: *s64, streamBytesRead: *s64, otherBytesRead: *s64) -> FMOD_RESULT #foreign fmod; + +/* Sound/DSP/Channel/FX creation and retrieval. */ +FMOD_System_CreateSound :: (system: *FMOD_SYSTEM, name_or_data: *u8, mode: FMOD_MODE, exinfo: *FMOD_CREATESOUNDEXINFO, sound: **FMOD_SOUND) -> FMOD_RESULT #foreign fmod; +FMOD_System_CreateStream :: (system: *FMOD_SYSTEM, name_or_data: *u8, mode: FMOD_MODE, exinfo: *FMOD_CREATESOUNDEXINFO, sound: **FMOD_SOUND) -> FMOD_RESULT #foreign fmod; +FMOD_System_CreateDSP :: (system: *FMOD_SYSTEM, description: *FMOD_DSP_DESCRIPTION, dsp: **FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_System_CreateDSPByType :: (system: *FMOD_SYSTEM, type: FMOD_DSP_TYPE, dsp: **FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_System_CreateChannelGroup :: (system: *FMOD_SYSTEM, name: *u8, channelgroup: **FMOD_CHANNELGROUP) -> FMOD_RESULT #foreign fmod; +FMOD_System_CreateSoundGroup :: (system: *FMOD_SYSTEM, name: *u8, soundgroup: **FMOD_SOUNDGROUP) -> FMOD_RESULT #foreign fmod; +FMOD_System_CreateReverb3D :: (system: *FMOD_SYSTEM, reverb: **FMOD_REVERB3D) -> FMOD_RESULT #foreign fmod; +FMOD_System_PlaySound :: (system: *FMOD_SYSTEM, sound: *FMOD_SOUND, channelgroup: *FMOD_CHANNELGROUP, paused: FMOD_BOOL, channel: **FMOD_CHANNEL) -> FMOD_RESULT #foreign fmod; +FMOD_System_PlayDSP :: (system: *FMOD_SYSTEM, dsp: *FMOD_DSP, channelgroup: *FMOD_CHANNELGROUP, paused: FMOD_BOOL, channel: **FMOD_CHANNEL) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetChannel :: (system: *FMOD_SYSTEM, channelid: s32, channel: **FMOD_CHANNEL) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetDSPInfoByType :: (system: *FMOD_SYSTEM, type: FMOD_DSP_TYPE, description: **FMOD_DSP_DESCRIPTION) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetMasterChannelGroup :: (system: *FMOD_SYSTEM, channelgroup: **FMOD_CHANNELGROUP) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetMasterSoundGroup :: (system: *FMOD_SYSTEM, soundgroup: **FMOD_SOUNDGROUP) -> FMOD_RESULT #foreign fmod; + +/* Routing to ports. */ +FMOD_System_AttachChannelGroupToPort :: (system: *FMOD_SYSTEM, portType: FMOD_PORT_TYPE, portIndex: FMOD_PORT_INDEX, channelgroup: *FMOD_CHANNELGROUP, passThru: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_System_DetachChannelGroupFromPort :: (system: *FMOD_SYSTEM, channelgroup: *FMOD_CHANNELGROUP) -> FMOD_RESULT #foreign fmod; + +/* Reverb API. */ +FMOD_System_SetReverbProperties :: (system: *FMOD_SYSTEM, instance: s32, prop: *FMOD_REVERB_PROPERTIES) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetReverbProperties :: (system: *FMOD_SYSTEM, instance: s32, prop: *FMOD_REVERB_PROPERTIES) -> FMOD_RESULT #foreign fmod; + +/* System level DSP functionality. */ +FMOD_System_LockDSP :: (system: *FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; +FMOD_System_UnlockDSP :: (system: *FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; + +/* Recording API. */ +FMOD_System_GetRecordNumDrivers :: (system: *FMOD_SYSTEM, numdrivers: *s32, numconnected: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetRecordDriverInfo :: (system: *FMOD_SYSTEM, id: s32, name: *u8, namelen: s32, guid: *FMOD_GUID, systemrate: *s32, speakermode: *FMOD_SPEAKERMODE, speakermodechannels: *s32, state: *FMOD_DRIVER_STATE) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetRecordPosition :: (system: *FMOD_SYSTEM, id: s32, position: *u32) -> FMOD_RESULT #foreign fmod; +FMOD_System_RecordStart :: (system: *FMOD_SYSTEM, id: s32, sound: *FMOD_SOUND, loop: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_System_RecordStop :: (system: *FMOD_SYSTEM, id: s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_IsRecording :: (system: *FMOD_SYSTEM, id: s32, recording: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; + +/* Geometry API. */ +FMOD_System_CreateGeometry :: (system: *FMOD_SYSTEM, maxpolygons: s32, maxvertices: s32, geometry: **FMOD_GEOMETRY) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetGeometrySettings :: (system: *FMOD_SYSTEM, maxworldsize: float) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetGeometrySettings :: (system: *FMOD_SYSTEM, maxworldsize: *float) -> FMOD_RESULT #foreign fmod; +FMOD_System_LoadGeometry :: (system: *FMOD_SYSTEM, data: *void, datasize: s32, geometry: **FMOD_GEOMETRY) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetGeometryOcclusion :: (system: *FMOD_SYSTEM, listener: *FMOD_VECTOR, source: *FMOD_VECTOR, direct: *float, reverb: *float) -> FMOD_RESULT #foreign fmod; + +/* Network functions. */ +FMOD_System_SetNetworkProxy :: (system: *FMOD_SYSTEM, proxy: *u8) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetNetworkProxy :: (system: *FMOD_SYSTEM, proxy: *u8, proxylen: s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_SetNetworkTimeout :: (system: *FMOD_SYSTEM, timeout: s32) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetNetworkTimeout :: (system: *FMOD_SYSTEM, timeout: *s32) -> FMOD_RESULT #foreign fmod; + +/* Userdata set/get. */ +FMOD_System_SetUserData :: (system: *FMOD_SYSTEM, userdata: *void) -> FMOD_RESULT #foreign fmod; +FMOD_System_GetUserData :: (system: *FMOD_SYSTEM, userdata: **void) -> FMOD_RESULT #foreign fmod; + +/* Sound API +*/ +FMOD_Sound_Release :: (sound: *FMOD_SOUND) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetSystemObject :: (sound: *FMOD_SOUND, system: **FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; + +/* +Standard sound manipulation functions. +*/ +FMOD_Sound_Lock :: (sound: *FMOD_SOUND, offset: u32, length: u32, ptr1: **void, ptr2: **void, len1: *u32, len2: *u32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_Unlock :: (sound: *FMOD_SOUND, ptr1: *void, ptr2: *void, len1: u32, len2: u32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_SetDefaults :: (sound: *FMOD_SOUND, frequency: float, priority: s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetDefaults :: (sound: *FMOD_SOUND, frequency: *float, priority: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_Set3DMinMaxDistance :: (sound: *FMOD_SOUND, min: float, max: float) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_Get3DMinMaxDistance :: (sound: *FMOD_SOUND, min: *float, max: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_Set3DConeSettings :: (sound: *FMOD_SOUND, insideconeangle: float, outsideconeangle: float, outsidevolume: float) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_Get3DConeSettings :: (sound: *FMOD_SOUND, insideconeangle: *float, outsideconeangle: *float, outsidevolume: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_Set3DCustomRolloff :: (sound: *FMOD_SOUND, points: *FMOD_VECTOR, numpoints: s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_Get3DCustomRolloff :: (sound: *FMOD_SOUND, points: **FMOD_VECTOR, numpoints: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetSubSound :: (sound: *FMOD_SOUND, index: s32, subsound: **FMOD_SOUND) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetSubSoundParent :: (sound: *FMOD_SOUND, parentsound: **FMOD_SOUND) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetName :: (sound: *FMOD_SOUND, name: *u8, namelen: s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetLength :: (sound: *FMOD_SOUND, length: *u32, lengthtype: FMOD_TIMEUNIT) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetFormat :: (sound: *FMOD_SOUND, type: *FMOD_SOUND_TYPE, format: *FMOD_SOUND_FORMAT, channels: *s32, bits: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetNumSubSounds :: (sound: *FMOD_SOUND, numsubsounds: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetNumTags :: (sound: *FMOD_SOUND, numtags: *s32, numtagsupdated: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetTag :: (sound: *FMOD_SOUND, name: *u8, index: s32, tag: *FMOD_TAG) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetOpenState :: (sound: *FMOD_SOUND, openstate: *FMOD_OPENSTATE, percentbuffered: *u32, starving: *FMOD_BOOL, diskbusy: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_ReadData :: (sound: *FMOD_SOUND, buffer: *void, length: u32, read: *u32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_SeekData :: (sound: *FMOD_SOUND, pcm: u32) -> FMOD_RESULT #foreign fmod; + +FMOD_Sound_SetSoundGroup :: (sound: *FMOD_SOUND, soundgroup: *FMOD_SOUNDGROUP) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetSoundGroup :: (sound: *FMOD_SOUND, soundgroup: **FMOD_SOUNDGROUP) -> FMOD_RESULT #foreign fmod; + +/* +Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks. +*/ +FMOD_Sound_GetNumSyncPoints :: (sound: *FMOD_SOUND, numsyncpoints: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetSyncPoint :: (sound: *FMOD_SOUND, index: s32, point: **FMOD_SYNCPOINT) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetSyncPointInfo :: (sound: *FMOD_SOUND, point: *FMOD_SYNCPOINT, name: *u8, namelen: s32, offset: *u32, offsettype: FMOD_TIMEUNIT) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_AddSyncPoint :: (sound: *FMOD_SOUND, offset: u32, offsettype: FMOD_TIMEUNIT, name: *u8, point: **FMOD_SYNCPOINT) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_DeleteSyncPoint :: (sound: *FMOD_SOUND, point: *FMOD_SYNCPOINT) -> FMOD_RESULT #foreign fmod; + +/* +Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time. +*/ +FMOD_Sound_SetMode :: (sound: *FMOD_SOUND, mode: FMOD_MODE) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetMode :: (sound: *FMOD_SOUND, mode: *FMOD_MODE) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_SetLoopCount :: (sound: *FMOD_SOUND, loopcount: s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetLoopCount :: (sound: *FMOD_SOUND, loopcount: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_SetLoopPoints :: (sound: *FMOD_SOUND, loopstart: u32, loopstarttype: FMOD_TIMEUNIT, loopend: u32, loopendtype: FMOD_TIMEUNIT) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetLoopPoints :: (sound: *FMOD_SOUND, loopstart: *u32, loopstarttype: FMOD_TIMEUNIT, loopend: *u32, loopendtype: FMOD_TIMEUNIT) -> FMOD_RESULT #foreign fmod; + +/* +For MOD/S3M/XM/IT/MID sequenced formats only. +*/ +FMOD_Sound_GetMusicNumChannels :: (sound: *FMOD_SOUND, numchannels: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_SetMusicChannelVolume :: (sound: *FMOD_SOUND, channel: s32, volume: float) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetMusicChannelVolume :: (sound: *FMOD_SOUND, channel: s32, volume: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_SetMusicSpeed :: (sound: *FMOD_SOUND, speed: float) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetMusicSpeed :: (sound: *FMOD_SOUND, speed: *float) -> FMOD_RESULT #foreign fmod; + +/* +Userdata set/get. +*/ +FMOD_Sound_SetUserData :: (sound: *FMOD_SOUND, userdata: *void) -> FMOD_RESULT #foreign fmod; +FMOD_Sound_GetUserData :: (sound: *FMOD_SOUND, userdata: **void) -> FMOD_RESULT #foreign fmod; + +/* +'Channel' API +*/ +FMOD_Channel_GetSystemObject :: (channel: *FMOD_CHANNEL, system: **FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; + +/* +General control functionality for Channels and ChannelGroups. +*/ +FMOD_Channel_Stop :: (channel: *FMOD_CHANNEL) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetPaused :: (channel: *FMOD_CHANNEL, paused: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetPaused :: (channel: *FMOD_CHANNEL, paused: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetVolume :: (channel: *FMOD_CHANNEL, volume: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetVolume :: (channel: *FMOD_CHANNEL, volume: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetVolumeRamp :: (channel: *FMOD_CHANNEL, ramp: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetVolumeRamp :: (channel: *FMOD_CHANNEL, ramp: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetAudibility :: (channel: *FMOD_CHANNEL, audibility: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetPitch :: (channel: *FMOD_CHANNEL, pitch: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetPitch :: (channel: *FMOD_CHANNEL, pitch: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetMute :: (channel: *FMOD_CHANNEL, mute: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetMute :: (channel: *FMOD_CHANNEL, mute: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetReverbProperties :: (channel: *FMOD_CHANNEL, instance: s32, wet: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetReverbProperties :: (channel: *FMOD_CHANNEL, instance: s32, wet: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetLowPassGain :: (channel: *FMOD_CHANNEL, gain: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetLowPassGain :: (channel: *FMOD_CHANNEL, gain: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetMode :: (channel: *FMOD_CHANNEL, mode: FMOD_MODE) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetMode :: (channel: *FMOD_CHANNEL, mode: *FMOD_MODE) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetCallback :: (channel: *FMOD_CHANNEL, callback: FMOD_CHANNELCONTROL_CALLBACK) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_IsPlaying :: (channel: *FMOD_CHANNEL, isplaying: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; + +/* +Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. +*/ +FMOD_Channel_SetPan :: (channel: *FMOD_CHANNEL, pan: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetMixLevelsOutput :: (channel: *FMOD_CHANNEL, frontleft: float, frontright: float, center: float, lfe: float, surroundleft: float, surroundright: float, backleft: float, backright: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetMixLevelsInput :: (channel: *FMOD_CHANNEL, levels: *float, numlevels: s32) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetMixMatrix :: (channel: *FMOD_CHANNEL, matrix: *float, outchannels: s32, inchannels: s32, inchannel_hop: s32) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetMixMatrix :: (channel: *FMOD_CHANNEL, matrix: *float, outchannels: *s32, inchannels: *s32, inchannel_hop: s32) -> FMOD_RESULT #foreign fmod; + +/* +Clock based functionality. +*/ +FMOD_Channel_GetDSPClock :: (channel: *FMOD_CHANNEL, dspclock: *u64, parentclock: *u64) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetDelay :: (channel: *FMOD_CHANNEL, dspclock_start: u64, dspclock_end: u64, stopchannels: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetDelay :: (channel: *FMOD_CHANNEL, dspclock_start: *u64, dspclock_end: *u64, stopchannels: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_AddFadePoint :: (channel: *FMOD_CHANNEL, dspclock: u64, volume: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetFadePointRamp :: (channel: *FMOD_CHANNEL, dspclock: u64, volume: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_RemoveFadePoints :: (channel: *FMOD_CHANNEL, dspclock_start: u64, dspclock_end: u64) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetFadePoints :: (channel: *FMOD_CHANNEL, numpoints: *u32, point_dspclock: *u64, point_volume: *float) -> FMOD_RESULT #foreign fmod; + +/* +DSP effects. +*/ +FMOD_Channel_GetDSP :: (channel: *FMOD_CHANNEL, index: s32, dsp: **FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_AddDSP :: (channel: *FMOD_CHANNEL, index: s32, dsp: *FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_RemoveDSP :: (channel: *FMOD_CHANNEL, dsp: *FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetNumDSPs :: (channel: *FMOD_CHANNEL, numdsps: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetDSPIndex :: (channel: *FMOD_CHANNEL, dsp: *FMOD_DSP, index: s32) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetDSPIndex :: (channel: *FMOD_CHANNEL, dsp: *FMOD_DSP, index: *s32) -> FMOD_RESULT #foreign fmod; + +/* +3D functionality. +*/ +FMOD_Channel_Set3DAttributes :: (channel: *FMOD_CHANNEL, pos: *FMOD_VECTOR, vel: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Get3DAttributes :: (channel: *FMOD_CHANNEL, pos: *FMOD_VECTOR, vel: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Set3DMinMaxDistance :: (channel: *FMOD_CHANNEL, mindistance: float, maxdistance: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Get3DMinMaxDistance :: (channel: *FMOD_CHANNEL, mindistance: *float, maxdistance: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Set3DConeSettings :: (channel: *FMOD_CHANNEL, insideconeangle: float, outsideconeangle: float, outsidevolume: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Get3DConeSettings :: (channel: *FMOD_CHANNEL, insideconeangle: *float, outsideconeangle: *float, outsidevolume: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Set3DConeOrientation :: (channel: *FMOD_CHANNEL, orientation: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Get3DConeOrientation :: (channel: *FMOD_CHANNEL, orientation: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Set3DCustomRolloff :: (channel: *FMOD_CHANNEL, points: *FMOD_VECTOR, numpoints: s32) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Get3DCustomRolloff :: (channel: *FMOD_CHANNEL, points: **FMOD_VECTOR, numpoints: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Set3DOcclusion :: (channel: *FMOD_CHANNEL, directocclusion: float, reverbocclusion: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Get3DOcclusion :: (channel: *FMOD_CHANNEL, directocclusion: *float, reverbocclusion: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Set3DSpread :: (channel: *FMOD_CHANNEL, angle: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Get3DSpread :: (channel: *FMOD_CHANNEL, angle: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Set3DLevel :: (channel: *FMOD_CHANNEL, level: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Get3DLevel :: (channel: *FMOD_CHANNEL, level: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Set3DDopplerLevel :: (channel: *FMOD_CHANNEL, level: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Get3DDopplerLevel :: (channel: *FMOD_CHANNEL, level: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Set3DDistanceFilter :: (channel: *FMOD_CHANNEL, custom: FMOD_BOOL, customLevel: float, centerFreq: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_Get3DDistanceFilter :: (channel: *FMOD_CHANNEL, custom: *FMOD_BOOL, customLevel: *float, centerFreq: *float) -> FMOD_RESULT #foreign fmod; + +/* +Userdata set/get. +*/ +FMOD_Channel_SetUserData :: (channel: *FMOD_CHANNEL, userdata: *void) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetUserData :: (channel: *FMOD_CHANNEL, userdata: **void) -> FMOD_RESULT #foreign fmod; + +/* +Channel specific control functionality. +*/ +FMOD_Channel_SetFrequency :: (channel: *FMOD_CHANNEL, frequency: float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetFrequency :: (channel: *FMOD_CHANNEL, frequency: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetPriority :: (channel: *FMOD_CHANNEL, priority: s32) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetPriority :: (channel: *FMOD_CHANNEL, priority: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetPosition :: (channel: *FMOD_CHANNEL, position: u32, postype: FMOD_TIMEUNIT) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetPosition :: (channel: *FMOD_CHANNEL, position: *u32, postype: FMOD_TIMEUNIT) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetChannelGroup :: (channel: *FMOD_CHANNEL, channelgroup: *FMOD_CHANNELGROUP) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetChannelGroup :: (channel: *FMOD_CHANNEL, channelgroup: **FMOD_CHANNELGROUP) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetLoopCount :: (channel: *FMOD_CHANNEL, loopcount: s32) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetLoopCount :: (channel: *FMOD_CHANNEL, loopcount: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_SetLoopPoints :: (channel: *FMOD_CHANNEL, loopstart: u32, loopstarttype: FMOD_TIMEUNIT, loopend: u32, loopendtype: FMOD_TIMEUNIT) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetLoopPoints :: (channel: *FMOD_CHANNEL, loopstart: *u32, loopstarttype: FMOD_TIMEUNIT, loopend: *u32, loopendtype: FMOD_TIMEUNIT) -> FMOD_RESULT #foreign fmod; + +/* +Information only functions. +*/ +FMOD_Channel_IsVirtual :: (channel: *FMOD_CHANNEL, isvirtual: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetCurrentSound :: (channel: *FMOD_CHANNEL, sound: **FMOD_SOUND) -> FMOD_RESULT #foreign fmod; +FMOD_Channel_GetIndex :: (channel: *FMOD_CHANNEL, index: *s32) -> FMOD_RESULT #foreign fmod; + +/* +'ChannelGroup' API +*/ +FMOD_ChannelGroup_GetSystemObject :: (channelgroup: *FMOD_CHANNELGROUP, system: **FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; + +/* +General control functionality for Channels and ChannelGroups. +*/ +FMOD_ChannelGroup_Stop :: (channelgroup: *FMOD_CHANNELGROUP) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetPaused :: (channelgroup: *FMOD_CHANNELGROUP, paused: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetPaused :: (channelgroup: *FMOD_CHANNELGROUP, paused: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetVolume :: (channelgroup: *FMOD_CHANNELGROUP, volume: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetVolume :: (channelgroup: *FMOD_CHANNELGROUP, volume: *float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetVolumeRamp :: (channelgroup: *FMOD_CHANNELGROUP, ramp: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetVolumeRamp :: (channelgroup: *FMOD_CHANNELGROUP, ramp: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetAudibility :: (channelgroup: *FMOD_CHANNELGROUP, audibility: *float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetPitch :: (channelgroup: *FMOD_CHANNELGROUP, pitch: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetPitch :: (channelgroup: *FMOD_CHANNELGROUP, pitch: *float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetMute :: (channelgroup: *FMOD_CHANNELGROUP, mute: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetMute :: (channelgroup: *FMOD_CHANNELGROUP, mute: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetReverbProperties :: (channelgroup: *FMOD_CHANNELGROUP, instance: s32, wet: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetReverbProperties :: (channelgroup: *FMOD_CHANNELGROUP, instance: s32, wet: *float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetLowPassGain :: (channelgroup: *FMOD_CHANNELGROUP, gain: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetLowPassGain :: (channelgroup: *FMOD_CHANNELGROUP, gain: *float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetMode :: (channelgroup: *FMOD_CHANNELGROUP, mode: FMOD_MODE) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetMode :: (channelgroup: *FMOD_CHANNELGROUP, mode: *FMOD_MODE) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetCallback :: (channelgroup: *FMOD_CHANNELGROUP, callback: FMOD_CHANNELCONTROL_CALLBACK) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_IsPlaying :: (channelgroup: *FMOD_CHANNELGROUP, isplaying: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; + +/* +Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. +*/ +FMOD_ChannelGroup_SetPan :: (channelgroup: *FMOD_CHANNELGROUP, pan: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetMixLevelsOutput :: (channelgroup: *FMOD_CHANNELGROUP, frontleft: float, frontright: float, center: float, lfe: float, surroundleft: float, surroundright: float, backleft: float, backright: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetMixLevelsInput :: (channelgroup: *FMOD_CHANNELGROUP, levels: *float, numlevels: s32) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetMixMatrix :: (channelgroup: *FMOD_CHANNELGROUP, matrix: *float, outchannels: s32, inchannels: s32, inchannel_hop: s32) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetMixMatrix :: (channelgroup: *FMOD_CHANNELGROUP, matrix: *float, outchannels: *s32, inchannels: *s32, inchannel_hop: s32) -> FMOD_RESULT #foreign fmod; + +/* +Clock based functionality. +*/ +FMOD_ChannelGroup_GetDSPClock :: (channelgroup: *FMOD_CHANNELGROUP, dspclock: *u64, parentclock: *u64) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetDelay :: (channelgroup: *FMOD_CHANNELGROUP, dspclock_start: u64, dspclock_end: u64, stopchannels: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetDelay :: (channelgroup: *FMOD_CHANNELGROUP, dspclock_start: *u64, dspclock_end: *u64, stopchannels: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_AddFadePoint :: (channelgroup: *FMOD_CHANNELGROUP, dspclock: u64, volume: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetFadePointRamp :: (channelgroup: *FMOD_CHANNELGROUP, dspclock: u64, volume: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_RemoveFadePoints :: (channelgroup: *FMOD_CHANNELGROUP, dspclock_start: u64, dspclock_end: u64) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetFadePoints :: (channelgroup: *FMOD_CHANNELGROUP, numpoints: *u32, point_dspclock: *u64, point_volume: *float) -> FMOD_RESULT #foreign fmod; + +/* +DSP effects. +*/ +FMOD_ChannelGroup_GetDSP :: (channelgroup: *FMOD_CHANNELGROUP, index: s32, dsp: **FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_AddDSP :: (channelgroup: *FMOD_CHANNELGROUP, index: s32, dsp: *FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_RemoveDSP :: (channelgroup: *FMOD_CHANNELGROUP, dsp: *FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetNumDSPs :: (channelgroup: *FMOD_CHANNELGROUP, numdsps: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_SetDSPIndex :: (channelgroup: *FMOD_CHANNELGROUP, dsp: *FMOD_DSP, index: s32) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetDSPIndex :: (channelgroup: *FMOD_CHANNELGROUP, dsp: *FMOD_DSP, index: *s32) -> FMOD_RESULT #foreign fmod; + +/* +3D functionality. +*/ +FMOD_ChannelGroup_Set3DAttributes :: (channelgroup: *FMOD_CHANNELGROUP, pos: *FMOD_VECTOR, vel: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Get3DAttributes :: (channelgroup: *FMOD_CHANNELGROUP, pos: *FMOD_VECTOR, vel: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Set3DMinMaxDistance :: (channelgroup: *FMOD_CHANNELGROUP, mindistance: float, maxdistance: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Get3DMinMaxDistance :: (channelgroup: *FMOD_CHANNELGROUP, mindistance: *float, maxdistance: *float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Set3DConeSettings :: (channelgroup: *FMOD_CHANNELGROUP, insideconeangle: float, outsideconeangle: float, outsidevolume: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Get3DConeSettings :: (channelgroup: *FMOD_CHANNELGROUP, insideconeangle: *float, outsideconeangle: *float, outsidevolume: *float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Set3DConeOrientation :: (channelgroup: *FMOD_CHANNELGROUP, orientation: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Get3DConeOrientation :: (channelgroup: *FMOD_CHANNELGROUP, orientation: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Set3DCustomRolloff :: (channelgroup: *FMOD_CHANNELGROUP, points: *FMOD_VECTOR, numpoints: s32) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Get3DCustomRolloff :: (channelgroup: *FMOD_CHANNELGROUP, points: **FMOD_VECTOR, numpoints: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Set3DOcclusion :: (channelgroup: *FMOD_CHANNELGROUP, directocclusion: float, reverbocclusion: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Get3DOcclusion :: (channelgroup: *FMOD_CHANNELGROUP, directocclusion: *float, reverbocclusion: *float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Set3DSpread :: (channelgroup: *FMOD_CHANNELGROUP, angle: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Get3DSpread :: (channelgroup: *FMOD_CHANNELGROUP, angle: *float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Set3DLevel :: (channelgroup: *FMOD_CHANNELGROUP, level: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Get3DLevel :: (channelgroup: *FMOD_CHANNELGROUP, level: *float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Set3DDopplerLevel :: (channelgroup: *FMOD_CHANNELGROUP, level: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Get3DDopplerLevel :: (channelgroup: *FMOD_CHANNELGROUP, level: *float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Set3DDistanceFilter :: (channelgroup: *FMOD_CHANNELGROUP, custom: FMOD_BOOL, customLevel: float, centerFreq: float) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_Get3DDistanceFilter :: (channelgroup: *FMOD_CHANNELGROUP, custom: *FMOD_BOOL, customLevel: *float, centerFreq: *float) -> FMOD_RESULT #foreign fmod; + +/* +Userdata set/get. +*/ +FMOD_ChannelGroup_SetUserData :: (channelgroup: *FMOD_CHANNELGROUP, userdata: *void) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetUserData :: (channelgroup: *FMOD_CHANNELGROUP, userdata: **void) -> FMOD_RESULT #foreign fmod; + +FMOD_ChannelGroup_Release :: (channelgroup: *FMOD_CHANNELGROUP) -> FMOD_RESULT #foreign fmod; + +/* +Nested channel groups. +*/ +FMOD_ChannelGroup_AddGroup :: (channelgroup: *FMOD_CHANNELGROUP, group: *FMOD_CHANNELGROUP, propagatedspclock: FMOD_BOOL, connection: **FMOD_DSPCONNECTION) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetNumGroups :: (channelgroup: *FMOD_CHANNELGROUP, numgroups: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetGroup :: (channelgroup: *FMOD_CHANNELGROUP, index: s32, group: **FMOD_CHANNELGROUP) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetParentGroup :: (channelgroup: *FMOD_CHANNELGROUP, group: **FMOD_CHANNELGROUP) -> FMOD_RESULT #foreign fmod; + +/* +Information only functions. +*/ +FMOD_ChannelGroup_GetName :: (channelgroup: *FMOD_CHANNELGROUP, name: *u8, namelen: s32) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetNumChannels :: (channelgroup: *FMOD_CHANNELGROUP, numchannels: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_ChannelGroup_GetChannel :: (channelgroup: *FMOD_CHANNELGROUP, index: s32, channel: **FMOD_CHANNEL) -> FMOD_RESULT #foreign fmod; + +/* +'SoundGroup' API +*/ +FMOD_SoundGroup_Release :: (soundgroup: *FMOD_SOUNDGROUP) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_GetSystemObject :: (soundgroup: *FMOD_SOUNDGROUP, system: **FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; + +/* +SoundGroup control functions. +*/ +FMOD_SoundGroup_SetMaxAudible :: (soundgroup: *FMOD_SOUNDGROUP, maxaudible: s32) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_GetMaxAudible :: (soundgroup: *FMOD_SOUNDGROUP, maxaudible: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_SetMaxAudibleBehavior :: (soundgroup: *FMOD_SOUNDGROUP, behavior: FMOD_SOUNDGROUP_BEHAVIOR) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_GetMaxAudibleBehavior :: (soundgroup: *FMOD_SOUNDGROUP, behavior: *FMOD_SOUNDGROUP_BEHAVIOR) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_SetMuteFadeSpeed :: (soundgroup: *FMOD_SOUNDGROUP, speed: float) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_GetMuteFadeSpeed :: (soundgroup: *FMOD_SOUNDGROUP, speed: *float) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_SetVolume :: (soundgroup: *FMOD_SOUNDGROUP, volume: float) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_GetVolume :: (soundgroup: *FMOD_SOUNDGROUP, volume: *float) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_Stop :: (soundgroup: *FMOD_SOUNDGROUP) -> FMOD_RESULT #foreign fmod; + +/* +Information only functions. +*/ +FMOD_SoundGroup_GetName :: (soundgroup: *FMOD_SOUNDGROUP, name: *u8, namelen: s32) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_GetNumSounds :: (soundgroup: *FMOD_SOUNDGROUP, numsounds: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_GetSound :: (soundgroup: *FMOD_SOUNDGROUP, index: s32, sound: **FMOD_SOUND) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_GetNumPlaying :: (soundgroup: *FMOD_SOUNDGROUP, numplaying: *s32) -> FMOD_RESULT #foreign fmod; + +/* +Userdata set/get. +*/ +FMOD_SoundGroup_SetUserData :: (soundgroup: *FMOD_SOUNDGROUP, userdata: *void) -> FMOD_RESULT #foreign fmod; +FMOD_SoundGroup_GetUserData :: (soundgroup: *FMOD_SOUNDGROUP, userdata: **void) -> FMOD_RESULT #foreign fmod; + +/* +'DSP' API +*/ +FMOD_DSP_Release :: (dsp: *FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetSystemObject :: (dsp: *FMOD_DSP, system: **FMOD_SYSTEM) -> FMOD_RESULT #foreign fmod; + +/* +Connection / disconnection / input and output enumeration. +*/ +FMOD_DSP_AddInput :: (dsp: *FMOD_DSP, input: *FMOD_DSP, connection: **FMOD_DSPCONNECTION, type: FMOD_DSPCONNECTION_TYPE) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_DisconnectFrom :: (dsp: *FMOD_DSP, target: *FMOD_DSP, connection: *FMOD_DSPCONNECTION) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_DisconnectAll :: (dsp: *FMOD_DSP, inputs: FMOD_BOOL, outputs: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetNumInputs :: (dsp: *FMOD_DSP, numinputs: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetNumOutputs :: (dsp: *FMOD_DSP, numoutputs: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetInput :: (dsp: *FMOD_DSP, index: s32, input: **FMOD_DSP, inputconnection: **FMOD_DSPCONNECTION) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetOutput :: (dsp: *FMOD_DSP, index: s32, output: **FMOD_DSP, outputconnection: **FMOD_DSPCONNECTION) -> FMOD_RESULT #foreign fmod; + +/* +DSP unit control. +*/ +FMOD_DSP_SetActive :: (dsp: *FMOD_DSP, active: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetActive :: (dsp: *FMOD_DSP, active: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_SetBypass :: (dsp: *FMOD_DSP, bypass: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetBypass :: (dsp: *FMOD_DSP, bypass: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_SetWetDryMix :: (dsp: *FMOD_DSP, prewet: float, postwet: float, dry: float) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetWetDryMix :: (dsp: *FMOD_DSP, prewet: *float, postwet: *float, dry: *float) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_SetChannelFormat :: (dsp: *FMOD_DSP, channelmask: FMOD_CHANNELMASK, numchannels: s32, source_speakermode: FMOD_SPEAKERMODE) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetChannelFormat :: (dsp: *FMOD_DSP, channelmask: *FMOD_CHANNELMASK, numchannels: *s32, source_speakermode: *FMOD_SPEAKERMODE) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetOutputChannelFormat :: (dsp: *FMOD_DSP, inmask: FMOD_CHANNELMASK, inchannels: s32, inspeakermode: FMOD_SPEAKERMODE, outmask: *FMOD_CHANNELMASK, outchannels: *s32, outspeakermode: *FMOD_SPEAKERMODE) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_Reset :: (dsp: *FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_SetCallback :: (dsp: *FMOD_DSP, callback: FMOD_DSP_CALLBACK) -> FMOD_RESULT #foreign fmod; + +/* +DSP parameter control. +*/ +FMOD_DSP_SetParameterFloat :: (dsp: *FMOD_DSP, index: s32, value: float) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_SetParameterInt :: (dsp: *FMOD_DSP, index: s32, value: s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_SetParameterBool :: (dsp: *FMOD_DSP, index: s32, value: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_SetParameterData :: (dsp: *FMOD_DSP, index: s32, data: *void, length: u32) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetParameterFloat :: (dsp: *FMOD_DSP, index: s32, value: *float, valuestr: *u8, valuestrlen: s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetParameterInt :: (dsp: *FMOD_DSP, index: s32, value: *s32, valuestr: *u8, valuestrlen: s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetParameterBool :: (dsp: *FMOD_DSP, index: s32, value: *FMOD_BOOL, valuestr: *u8, valuestrlen: s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetParameterData :: (dsp: *FMOD_DSP, index: s32, data: **void, length: *u32, valuestr: *u8, valuestrlen: s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetNumParameters :: (dsp: *FMOD_DSP, numparams: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetParameterInfo :: (dsp: *FMOD_DSP, index: s32, desc: **FMOD_DSP_PARAMETER_DESC) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetDataParameterIndex :: (dsp: *FMOD_DSP, datatype: s32, index: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_ShowConfigDialog :: (dsp: *FMOD_DSP, hwnd: *void, show: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; + +/* +DSP attributes. +*/ +FMOD_DSP_GetInfo :: (dsp: *FMOD_DSP, name: *u8, version: *u32, channels: *s32, configwidth: *s32, configheight: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetType :: (dsp: *FMOD_DSP, type: *FMOD_DSP_TYPE) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetIdle :: (dsp: *FMOD_DSP, idle: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; + +/* +Userdata set/get. +*/ +FMOD_DSP_SetUserData :: (dsp: *FMOD_DSP, userdata: *void) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetUserData :: (dsp: *FMOD_DSP, userdata: **void) -> FMOD_RESULT #foreign fmod; + +/* +Metering. +*/ +FMOD_DSP_SetMeteringEnabled :: (dsp: *FMOD_DSP, inputEnabled: FMOD_BOOL, outputEnabled: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetMeteringEnabled :: (dsp: *FMOD_DSP, inputEnabled: *FMOD_BOOL, outputEnabled: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetMeteringInfo :: (dsp: *FMOD_DSP, inputInfo: *FMOD_DSP_METERING_INFO, outputInfo: *FMOD_DSP_METERING_INFO) -> FMOD_RESULT #foreign fmod; +FMOD_DSP_GetCPUUsage :: (dsp: *FMOD_DSP, exclusive: *u32, inclusive: *u32) -> FMOD_RESULT #foreign fmod; + +/* +'DSPConnection' API +*/ +FMOD_DSPConnection_GetInput :: (dspconnection: *FMOD_DSPCONNECTION, input: **FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_DSPConnection_GetOutput :: (dspconnection: *FMOD_DSPCONNECTION, output: **FMOD_DSP) -> FMOD_RESULT #foreign fmod; +FMOD_DSPConnection_SetMix :: (dspconnection: *FMOD_DSPCONNECTION, volume: float) -> FMOD_RESULT #foreign fmod; +FMOD_DSPConnection_GetMix :: (dspconnection: *FMOD_DSPCONNECTION, volume: *float) -> FMOD_RESULT #foreign fmod; +FMOD_DSPConnection_SetMixMatrix :: (dspconnection: *FMOD_DSPCONNECTION, matrix: *float, outchannels: s32, inchannels: s32, inchannel_hop: s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSPConnection_GetMixMatrix :: (dspconnection: *FMOD_DSPCONNECTION, matrix: *float, outchannels: *s32, inchannels: *s32, inchannel_hop: s32) -> FMOD_RESULT #foreign fmod; +FMOD_DSPConnection_GetType :: (dspconnection: *FMOD_DSPCONNECTION, type: *FMOD_DSPCONNECTION_TYPE) -> FMOD_RESULT #foreign fmod; + +/* +Userdata set/get. +*/ +FMOD_DSPConnection_SetUserData :: (dspconnection: *FMOD_DSPCONNECTION, userdata: *void) -> FMOD_RESULT #foreign fmod; +FMOD_DSPConnection_GetUserData :: (dspconnection: *FMOD_DSPCONNECTION, userdata: **void) -> FMOD_RESULT #foreign fmod; + +/* +'Geometry' API +*/ +FMOD_Geometry_Release :: (geometry: *FMOD_GEOMETRY) -> FMOD_RESULT #foreign fmod; + +/* +Polygon manipulation. +*/ +FMOD_Geometry_AddPolygon :: (geometry: *FMOD_GEOMETRY, directocclusion: float, reverbocclusion: float, doublesided: FMOD_BOOL, numvertices: s32, vertices: *FMOD_VECTOR, polygonindex: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_GetNumPolygons :: (geometry: *FMOD_GEOMETRY, numpolygons: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_GetMaxPolygons :: (geometry: *FMOD_GEOMETRY, maxpolygons: *s32, maxvertices: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_GetPolygonNumVertices :: (geometry: *FMOD_GEOMETRY, index: s32, numvertices: *s32) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_SetPolygonVertex :: (geometry: *FMOD_GEOMETRY, index: s32, vertexindex: s32, vertex: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_GetPolygonVertex :: (geometry: *FMOD_GEOMETRY, index: s32, vertexindex: s32, vertex: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_SetPolygonAttributes :: (geometry: *FMOD_GEOMETRY, index: s32, directocclusion: float, reverbocclusion: float, doublesided: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_GetPolygonAttributes :: (geometry: *FMOD_GEOMETRY, index: s32, directocclusion: *float, reverbocclusion: *float, doublesided: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; + +/* +Object manipulation. +*/ +FMOD_Geometry_SetActive :: (geometry: *FMOD_GEOMETRY, active: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_GetActive :: (geometry: *FMOD_GEOMETRY, active: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_SetRotation :: (geometry: *FMOD_GEOMETRY, forward: *FMOD_VECTOR, up: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_GetRotation :: (geometry: *FMOD_GEOMETRY, forward: *FMOD_VECTOR, up: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_SetPosition :: (geometry: *FMOD_GEOMETRY, position: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_GetPosition :: (geometry: *FMOD_GEOMETRY, position: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_SetScale :: (geometry: *FMOD_GEOMETRY, scale: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_GetScale :: (geometry: *FMOD_GEOMETRY, scale: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_Save :: (geometry: *FMOD_GEOMETRY, data: *void, datasize: *s32) -> FMOD_RESULT #foreign fmod; + +/* +Userdata set/get. +*/ +FMOD_Geometry_SetUserData :: (geometry: *FMOD_GEOMETRY, userdata: *void) -> FMOD_RESULT #foreign fmod; +FMOD_Geometry_GetUserData :: (geometry: *FMOD_GEOMETRY, userdata: **void) -> FMOD_RESULT #foreign fmod; + +/* +'Reverb3D' API +*/ +FMOD_Reverb3D_Release :: (reverb3d: *FMOD_REVERB3D) -> FMOD_RESULT #foreign fmod; + +/* +Reverb manipulation. +*/ +FMOD_Reverb3D_Set3DAttributes :: (reverb3d: *FMOD_REVERB3D, position: *FMOD_VECTOR, mindistance: float, maxdistance: float) -> FMOD_RESULT #foreign fmod; +FMOD_Reverb3D_Get3DAttributes :: (reverb3d: *FMOD_REVERB3D, position: *FMOD_VECTOR, mindistance: *float, maxdistance: *float) -> FMOD_RESULT #foreign fmod; +FMOD_Reverb3D_SetProperties :: (reverb3d: *FMOD_REVERB3D, properties: *FMOD_REVERB_PROPERTIES) -> FMOD_RESULT #foreign fmod; +FMOD_Reverb3D_GetProperties :: (reverb3d: *FMOD_REVERB3D, properties: *FMOD_REVERB_PROPERTIES) -> FMOD_RESULT #foreign fmod; +FMOD_Reverb3D_SetActive :: (reverb3d: *FMOD_REVERB3D, active: FMOD_BOOL) -> FMOD_RESULT #foreign fmod; +FMOD_Reverb3D_GetActive :: (reverb3d: *FMOD_REVERB3D, active: *FMOD_BOOL) -> FMOD_RESULT #foreign fmod; + +/* +Userdata set/get. +*/ +FMOD_Reverb3D_SetUserData :: (reverb3d: *FMOD_REVERB3D, userdata: *void) -> FMOD_RESULT #foreign fmod; +FMOD_Reverb3D_GetUserData :: (reverb3d: *FMOD_REVERB3D, userdata: **void) -> FMOD_RESULT #foreign fmod; + +FMOD_STUDIO_SYSTEM :: struct {} +FMOD_STUDIO_EVENTDESCRIPTION :: struct {} +FMOD_STUDIO_EVENTINSTANCE :: struct {} +FMOD_STUDIO_BUS :: struct {} +FMOD_STUDIO_VCA :: struct {} +FMOD_STUDIO_BANK :: struct {} +FMOD_STUDIO_COMMANDREPLAY :: struct {} + +FMOD_STUDIO_INITFLAGS :: u32; + +FMOD_STUDIO_PARAMETER_FLAGS :: u32; + +FMOD_STUDIO_SYSTEM_CALLBACK_TYPE :: u32; + +FMOD_STUDIO_EVENT_CALLBACK_TYPE :: u32; + +FMOD_STUDIO_LOAD_BANK_FLAGS :: u32; + +FMOD_STUDIO_COMMANDCAPTURE_FLAGS :: u32; + +FMOD_STUDIO_COMMANDREPLAY_FLAGS :: u32; + +FMOD_STUDIO_LOADING_STATE :: enum s32 { + UNLOADING :: 0; + UNLOADED :: 1; + LOADING :: 2; + LOADED :: 3; + ERROR :: 4; + + FORCEINT :: 65536; + + FMOD_STUDIO_LOADING_STATE_UNLOADING :: UNLOADING; + FMOD_STUDIO_LOADING_STATE_UNLOADED :: UNLOADED; + FMOD_STUDIO_LOADING_STATE_LOADING :: LOADING; + FMOD_STUDIO_LOADING_STATE_LOADED :: LOADED; + FMOD_STUDIO_LOADING_STATE_ERROR :: ERROR; + + FMOD_STUDIO_LOADING_STATE_FORCEINT :: FORCEINT; +} + +FMOD_STUDIO_LOAD_MEMORY_MODE :: enum s32 { + MEMORY :: 0; + MEMORY_POINT :: 1; + + MEMORY_FORCEINT :: 65536; + + FMOD_STUDIO_LOAD_MEMORY :: MEMORY; + FMOD_STUDIO_LOAD_MEMORY_POINT :: MEMORY_POINT; + + FMOD_STUDIO_LOAD_MEMORY_FORCEINT :: MEMORY_FORCEINT; +} + +FMOD_STUDIO_PARAMETER_TYPE :: enum s32 { + GAME_CONTROLLED :: 0; + AUTOMATIC_DISTANCE :: 1; + AUTOMATIC_EVENT_CONE_ANGLE :: 2; + AUTOMATIC_EVENT_ORIENTATION :: 3; + AUTOMATIC_DIRECTION :: 4; + AUTOMATIC_ELEVATION :: 5; + AUTOMATIC_LISTENER_ORIENTATION :: 6; + AUTOMATIC_SPEED :: 7; + AUTOMATIC_SPEED_ABSOLUTE :: 8; + AUTOMATIC_DISTANCE_NORMALIZED :: 9; + + MAX :: 10; + FORCEINT :: 65536; + + FMOD_STUDIO_PARAMETER_GAME_CONTROLLED :: GAME_CONTROLLED; + FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE :: AUTOMATIC_DISTANCE; + FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE :: AUTOMATIC_EVENT_CONE_ANGLE; + FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION :: AUTOMATIC_EVENT_ORIENTATION; + FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION :: AUTOMATIC_DIRECTION; + FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION :: AUTOMATIC_ELEVATION; + FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION :: AUTOMATIC_LISTENER_ORIENTATION; + FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED :: AUTOMATIC_SPEED; + FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED_ABSOLUTE :: AUTOMATIC_SPEED_ABSOLUTE; + FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE_NORMALIZED :: AUTOMATIC_DISTANCE_NORMALIZED; + + FMOD_STUDIO_PARAMETER_MAX :: MAX; + FMOD_STUDIO_PARAMETER_FORCEINT :: FORCEINT; +} + +FMOD_STUDIO_USER_PROPERTY_TYPE :: enum s32 { + INTEGER :: 0; + BOOLEAN :: 1; + FLOAT :: 2; + STRING :: 3; + + FORCEINT :: 65536; + + FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER :: INTEGER; + FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN :: BOOLEAN; + FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT :: FLOAT; + FMOD_STUDIO_USER_PROPERTY_TYPE_STRING :: STRING; + + FMOD_STUDIO_USER_PROPERTY_TYPE_FORCEINT :: FORCEINT; +} + +FMOD_STUDIO_EVENT_PROPERTY :: enum s32 { + CHANNELPRIORITY :: 0; + SCHEDULE_DELAY :: 1; + SCHEDULE_LOOKAHEAD :: 2; + MINIMUM_DISTANCE :: 3; + MAXIMUM_DISTANCE :: 4; + COOLDOWN :: 5; + MAX :: 6; + + FORCEINT :: 65536; + + FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY :: CHANNELPRIORITY; + FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY :: SCHEDULE_DELAY; + FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD :: SCHEDULE_LOOKAHEAD; + FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE :: MINIMUM_DISTANCE; + FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE :: MAXIMUM_DISTANCE; + FMOD_STUDIO_EVENT_PROPERTY_COOLDOWN :: COOLDOWN; + FMOD_STUDIO_EVENT_PROPERTY_MAX :: MAX; + + FMOD_STUDIO_EVENT_PROPERTY_FORCEINT :: FORCEINT; +} + +FMOD_STUDIO_PLAYBACK_STATE :: enum s32 { + PLAYING :: 0; + SUSTAINING :: 1; + STOPPED :: 2; + STARTING :: 3; + STOPPING :: 4; + + FORCEINT :: 65536; + + FMOD_STUDIO_PLAYBACK_PLAYING :: PLAYING; + FMOD_STUDIO_PLAYBACK_SUSTAINING :: SUSTAINING; + FMOD_STUDIO_PLAYBACK_STOPPED :: STOPPED; + FMOD_STUDIO_PLAYBACK_STARTING :: STARTING; + FMOD_STUDIO_PLAYBACK_STOPPING :: STOPPING; + + FMOD_STUDIO_PLAYBACK_FORCEINT :: FORCEINT; +} + +FMOD_STUDIO_STOP_MODE :: enum s32 { + ALLOWFADEOUT :: 0; + IMMEDIATE :: 1; + + FORCEINT :: 65536; + + FMOD_STUDIO_STOP_ALLOWFADEOUT :: ALLOWFADEOUT; + FMOD_STUDIO_STOP_IMMEDIATE :: IMMEDIATE; + + FMOD_STUDIO_STOP_FORCEINT :: FORCEINT; +} + +FMOD_STUDIO_INSTANCETYPE :: enum s32 { + NONE :: 0; + SYSTEM :: 1; + EVENTDESCRIPTION :: 2; + EVENTINSTANCE :: 3; + PARAMETERINSTANCE :: 4; + BUS :: 5; + VCA :: 6; + BANK :: 7; + COMMANDREPLAY :: 8; + + FORCEINT :: 65536; + + FMOD_STUDIO_INSTANCETYPE_NONE :: NONE; + FMOD_STUDIO_INSTANCETYPE_SYSTEM :: SYSTEM; + FMOD_STUDIO_INSTANCETYPE_EVENTDESCRIPTION :: EVENTDESCRIPTION; + FMOD_STUDIO_INSTANCETYPE_EVENTINSTANCE :: EVENTINSTANCE; + FMOD_STUDIO_INSTANCETYPE_PARAMETERINSTANCE :: PARAMETERINSTANCE; + FMOD_STUDIO_INSTANCETYPE_BUS :: BUS; + FMOD_STUDIO_INSTANCETYPE_VCA :: VCA; + FMOD_STUDIO_INSTANCETYPE_BANK :: BANK; + FMOD_STUDIO_INSTANCETYPE_COMMANDREPLAY :: COMMANDREPLAY; + + FMOD_STUDIO_INSTANCETYPE_FORCEINT :: FORCEINT; +} + +/* +FMOD Studio structures +*/ +FMOD_STUDIO_BANK_INFO :: struct { + size: s32; + userdata: *void; + userdatalength: s32; + opencallback: FMOD_FILE_OPEN_CALLBACK; + closecallback: FMOD_FILE_CLOSE_CALLBACK; + readcallback: FMOD_FILE_READ_CALLBACK; + seekcallback: FMOD_FILE_SEEK_CALLBACK; +} + +FMOD_STUDIO_PARAMETER_ID :: struct { + data1: u32; + data2: u32; +} + +FMOD_STUDIO_PARAMETER_DESCRIPTION :: struct { + name: *u8; + id: FMOD_STUDIO_PARAMETER_ID; + minimum: float; + maximum: float; + defaultvalue: float; + type: FMOD_STUDIO_PARAMETER_TYPE; + flags: FMOD_STUDIO_PARAMETER_FLAGS; + guid: FMOD_GUID; +} + +FMOD_STUDIO_USER_PROPERTY :: struct { + name: *u8; + type: FMOD_STUDIO_USER_PROPERTY_TYPE; + + union { + intvalue: s32; + boolvalue: FMOD_BOOL; + floatvalue: float; + stringvalue: *u8; + } +} + +FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES :: struct { + name: *u8; + sound: *FMOD_SOUND; + subsoundIndex: s32; +} + +FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES :: struct { + name: *u8; + dsp: *FMOD_DSP; +} + +FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES :: struct { + name: *u8; + position: s32; +} + +FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES :: struct { + bar: s32; + beat: s32; + position: s32; + tempo: float; + timesignatureupper: s32; + timesignaturelower: s32; +} + +FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES :: struct { + eventid: FMOD_GUID; + properties: FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES; +} + +FMOD_STUDIO_ADVANCEDSETTINGS :: struct { + cbsize: s32; + commandqueuesize: u32; + handleinitialsize: u32; + studioupdateperiod: s32; + idlesampledatapoolsize: s32; + streamingscheduledelay: u32; + encryptionkey: *u8; +} + +FMOD_STUDIO_CPU_USAGE :: struct { + update: float; +} + +FMOD_STUDIO_BUFFER_INFO :: struct { + currentusage: s32; + peakusage: s32; + capacity: s32; + stallcount: s32; + stalltime: float; +} + +FMOD_STUDIO_BUFFER_USAGE :: struct { + studiocommandqueue: FMOD_STUDIO_BUFFER_INFO; + studiohandle: FMOD_STUDIO_BUFFER_INFO; +} + +FMOD_STUDIO_SOUND_INFO :: struct { + name_or_data: *u8; + mode: FMOD_MODE; + exinfo: FMOD_CREATESOUNDEXINFO; + subsoundindex: s32; +} + +FMOD_STUDIO_COMMAND_INFO :: struct { + commandname: *u8; + parentcommandindex: s32; + framenumber: s32; + frametime: float; + instancetype: FMOD_STUDIO_INSTANCETYPE; + outputtype: FMOD_STUDIO_INSTANCETYPE; + instancehandle: u32; + outputhandle: u32; +} + +FMOD_STUDIO_MEMORY_USAGE :: struct { + exclusive: s32; + inclusive: s32; + sampledata: s32; +} + +/* +FMOD Studio callbacks. +*/ +FMOD_STUDIO_SYSTEM_CALLBACK :: #type (system: *FMOD_STUDIO_SYSTEM, type: FMOD_STUDIO_SYSTEM_CALLBACK_TYPE, commanddata: *void, userdata: *void) -> FMOD_RESULT #c_call; +FMOD_STUDIO_EVENT_CALLBACK :: #type (type: FMOD_STUDIO_EVENT_CALLBACK_TYPE, event: *FMOD_STUDIO_EVENTINSTANCE, parameters: *void) -> FMOD_RESULT #c_call; +FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK :: #type (replay: *FMOD_STUDIO_COMMANDREPLAY, commandindex: s32, currenttime: float, userdata: *void) -> FMOD_RESULT #c_call; +FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK :: #type (replay: *FMOD_STUDIO_COMMANDREPLAY, commandindex: s32, bankguid: *FMOD_GUID, bankfilename: *u8, flags: FMOD_STUDIO_LOAD_BANK_FLAGS, bank: **FMOD_STUDIO_BANK, userdata: *void) -> FMOD_RESULT #c_call; +FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK :: #type (replay: *FMOD_STUDIO_COMMANDREPLAY, commandindex: s32, eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, instance: **FMOD_STUDIO_EVENTINSTANCE, userdata: *void) -> FMOD_RESULT #c_call; + +/* +Global +*/ +FMOD_Studio_ParseID :: (idstring: *u8, id: *FMOD_GUID) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_Create :: (system: **FMOD_STUDIO_SYSTEM, headerversion: u32) -> FMOD_RESULT #foreign fmodstudio; + +/* +System +*/ +FMOD_Studio_System_IsValid :: (system: *FMOD_STUDIO_SYSTEM) -> FMOD_BOOL #foreign fmodstudio; +FMOD_Studio_System_SetAdvancedSettings :: (system: *FMOD_STUDIO_SYSTEM, settings: *FMOD_STUDIO_ADVANCEDSETTINGS) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetAdvancedSettings :: (system: *FMOD_STUDIO_SYSTEM, settings: *FMOD_STUDIO_ADVANCEDSETTINGS) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_Initialize :: (system: *FMOD_STUDIO_SYSTEM, maxchannels: s32, studioflags: FMOD_STUDIO_INITFLAGS, flags: FMOD_INITFLAGS, extradriverdata: *void) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_Release :: (system: *FMOD_STUDIO_SYSTEM) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_Update :: (system: *FMOD_STUDIO_SYSTEM) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetCoreSystem :: (system: *FMOD_STUDIO_SYSTEM, coresystem: **FMOD_SYSTEM) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetEvent :: (system: *FMOD_STUDIO_SYSTEM, pathOrID: *u8, event: **FMOD_STUDIO_EVENTDESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetBus :: (system: *FMOD_STUDIO_SYSTEM, pathOrID: *u8, bus: **FMOD_STUDIO_BUS) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetVCA :: (system: *FMOD_STUDIO_SYSTEM, pathOrID: *u8, vca: **FMOD_STUDIO_VCA) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetBank :: (system: *FMOD_STUDIO_SYSTEM, pathOrID: *u8, bank: **FMOD_STUDIO_BANK) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetEventByID :: (system: *FMOD_STUDIO_SYSTEM, id: *FMOD_GUID, event: **FMOD_STUDIO_EVENTDESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetBusByID :: (system: *FMOD_STUDIO_SYSTEM, id: *FMOD_GUID, bus: **FMOD_STUDIO_BUS) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetVCAByID :: (system: *FMOD_STUDIO_SYSTEM, id: *FMOD_GUID, vca: **FMOD_STUDIO_VCA) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetBankByID :: (system: *FMOD_STUDIO_SYSTEM, id: *FMOD_GUID, bank: **FMOD_STUDIO_BANK) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetSoundInfo :: (system: *FMOD_STUDIO_SYSTEM, key: *u8, info: *FMOD_STUDIO_SOUND_INFO) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetParameterDescriptionByName :: (system: *FMOD_STUDIO_SYSTEM, name: *u8, parameter: *FMOD_STUDIO_PARAMETER_DESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetParameterDescriptionByID :: (system: *FMOD_STUDIO_SYSTEM, id: FMOD_STUDIO_PARAMETER_ID, parameter: *FMOD_STUDIO_PARAMETER_DESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetParameterLabelByName :: (system: *FMOD_STUDIO_SYSTEM, name: *u8, labelindex: s32, label: *u8, size: s32, retrieved: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetParameterLabelByID :: (system: *FMOD_STUDIO_SYSTEM, id: FMOD_STUDIO_PARAMETER_ID, labelindex: s32, label: *u8, size: s32, retrieved: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetParameterByID :: (system: *FMOD_STUDIO_SYSTEM, id: FMOD_STUDIO_PARAMETER_ID, value: *float, finalvalue: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_SetParameterByID :: (system: *FMOD_STUDIO_SYSTEM, id: FMOD_STUDIO_PARAMETER_ID, value: float, ignoreseekspeed: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_SetParameterByIDWithLabel :: (system: *FMOD_STUDIO_SYSTEM, id: FMOD_STUDIO_PARAMETER_ID, label: *u8, ignoreseekspeed: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_SetParametersByIDs :: (system: *FMOD_STUDIO_SYSTEM, ids: *FMOD_STUDIO_PARAMETER_ID, values: *float, count: s32, ignoreseekspeed: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetParameterByName :: (system: *FMOD_STUDIO_SYSTEM, name: *u8, value: *float, finalvalue: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_SetParameterByName :: (system: *FMOD_STUDIO_SYSTEM, name: *u8, value: float, ignoreseekspeed: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_SetParameterByNameWithLabel :: (system: *FMOD_STUDIO_SYSTEM, name: *u8, label: *u8, ignoreseekspeed: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_LookupID :: (system: *FMOD_STUDIO_SYSTEM, path: *u8, id: *FMOD_GUID) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_LookupPath :: (system: *FMOD_STUDIO_SYSTEM, id: *FMOD_GUID, path: *u8, size: s32, retrieved: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetNumListeners :: (system: *FMOD_STUDIO_SYSTEM, numlisteners: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_SetNumListeners :: (system: *FMOD_STUDIO_SYSTEM, numlisteners: s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetListenerAttributes :: (system: *FMOD_STUDIO_SYSTEM, index: s32, attributes: *FMOD_3D_ATTRIBUTES, attenuationposition: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_SetListenerAttributes :: (system: *FMOD_STUDIO_SYSTEM, index: s32, attributes: *FMOD_3D_ATTRIBUTES, attenuationposition: *FMOD_VECTOR) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetListenerWeight :: (system: *FMOD_STUDIO_SYSTEM, index: s32, weight: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_SetListenerWeight :: (system: *FMOD_STUDIO_SYSTEM, index: s32, weight: float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_LoadBankFile :: (system: *FMOD_STUDIO_SYSTEM, filename: *u8, flags: FMOD_STUDIO_LOAD_BANK_FLAGS, bank: **FMOD_STUDIO_BANK) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_LoadBankMemory :: (system: *FMOD_STUDIO_SYSTEM, buffer: *u8, length: s32, mode: FMOD_STUDIO_LOAD_MEMORY_MODE, flags: FMOD_STUDIO_LOAD_BANK_FLAGS, bank: **FMOD_STUDIO_BANK) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_LoadBankCustom :: (system: *FMOD_STUDIO_SYSTEM, info: *FMOD_STUDIO_BANK_INFO, flags: FMOD_STUDIO_LOAD_BANK_FLAGS, bank: **FMOD_STUDIO_BANK) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_RegisterPlugin :: (system: *FMOD_STUDIO_SYSTEM, description: *FMOD_DSP_DESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_UnregisterPlugin :: (system: *FMOD_STUDIO_SYSTEM, name: *u8) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_UnloadAll :: (system: *FMOD_STUDIO_SYSTEM) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_FlushCommands :: (system: *FMOD_STUDIO_SYSTEM) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_FlushSampleLoading :: (system: *FMOD_STUDIO_SYSTEM) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_StartCommandCapture :: (system: *FMOD_STUDIO_SYSTEM, filename: *u8, flags: FMOD_STUDIO_COMMANDCAPTURE_FLAGS) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_StopCommandCapture :: (system: *FMOD_STUDIO_SYSTEM) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_LoadCommandReplay :: (system: *FMOD_STUDIO_SYSTEM, filename: *u8, flags: FMOD_STUDIO_COMMANDREPLAY_FLAGS, replay: **FMOD_STUDIO_COMMANDREPLAY) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetBankCount :: (system: *FMOD_STUDIO_SYSTEM, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetBankList :: (system: *FMOD_STUDIO_SYSTEM, array: **FMOD_STUDIO_BANK, capacity: s32, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetParameterDescriptionCount :: (system: *FMOD_STUDIO_SYSTEM, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetParameterDescriptionList :: (system: *FMOD_STUDIO_SYSTEM, array: *FMOD_STUDIO_PARAMETER_DESCRIPTION, capacity: s32, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetCPUUsage :: (system: *FMOD_STUDIO_SYSTEM, usage: *FMOD_STUDIO_CPU_USAGE, usage_core: *FMOD_CPU_USAGE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetBufferUsage :: (system: *FMOD_STUDIO_SYSTEM, usage: *FMOD_STUDIO_BUFFER_USAGE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_ResetBufferUsage :: (system: *FMOD_STUDIO_SYSTEM) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_SetCallback :: (system: *FMOD_STUDIO_SYSTEM, callback: FMOD_STUDIO_SYSTEM_CALLBACK, callbackmask: FMOD_STUDIO_SYSTEM_CALLBACK_TYPE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_SetUserData :: (system: *FMOD_STUDIO_SYSTEM, userdata: *void) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetUserData :: (system: *FMOD_STUDIO_SYSTEM, userdata: **void) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_System_GetMemoryUsage :: (system: *FMOD_STUDIO_SYSTEM, memoryusage: *FMOD_STUDIO_MEMORY_USAGE) -> FMOD_RESULT #foreign fmodstudio; + +/* +EventDescription +*/ +FMOD_Studio_EventDescription_IsValid :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION) -> FMOD_BOOL #foreign fmodstudio; +FMOD_Studio_EventDescription_GetID :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, id: *FMOD_GUID) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetPath :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, path: *u8, size: s32, retrieved: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetParameterDescriptionCount :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetParameterDescriptionByIndex :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, index: s32, parameter: *FMOD_STUDIO_PARAMETER_DESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetParameterDescriptionByName :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, name: *u8, parameter: *FMOD_STUDIO_PARAMETER_DESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetParameterDescriptionByID :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, id: FMOD_STUDIO_PARAMETER_ID, parameter: *FMOD_STUDIO_PARAMETER_DESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetParameterLabelByIndex :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, index: s32, labelindex: s32, label: *u8, size: s32, retrieved: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetParameterLabelByName :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, name: *u8, labelindex: s32, label: *u8, size: s32, retrieved: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetParameterLabelByID :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, id: FMOD_STUDIO_PARAMETER_ID, labelindex: s32, label: *u8, size: s32, retrieved: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetUserPropertyCount :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetUserPropertyByIndex :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, index: s32, property: *FMOD_STUDIO_USER_PROPERTY) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetUserProperty :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, name: *u8, property: *FMOD_STUDIO_USER_PROPERTY) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetLength :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, length: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetMinMaxDistance :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, min: *float, max: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetSoundSize :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, size: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_IsSnapshot :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, snapshot: *FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_IsOneshot :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, oneshot: *FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_IsStream :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, isStream: *FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_Is3D :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, is3D: *FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_IsDopplerEnabled :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, doppler: *FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_HasSustainPoint :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, sustainPoint: *FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_CreateInstance :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, instance: **FMOD_STUDIO_EVENTINSTANCE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetInstanceCount :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetInstanceList :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, array: **FMOD_STUDIO_EVENTINSTANCE, capacity: s32, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_LoadSampleData :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_UnloadSampleData :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetSampleLoadingState :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, state: *FMOD_STUDIO_LOADING_STATE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_ReleaseAllInstances :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_SetCallback :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, callback: FMOD_STUDIO_EVENT_CALLBACK, callbackmask: FMOD_STUDIO_EVENT_CALLBACK_TYPE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_GetUserData :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, userdata: **void) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventDescription_SetUserData :: (eventdescription: *FMOD_STUDIO_EVENTDESCRIPTION, userdata: *void) -> FMOD_RESULT #foreign fmodstudio; + +/* +EventInstance +*/ +FMOD_Studio_EventInstance_IsValid :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE) -> FMOD_BOOL #foreign fmodstudio; +FMOD_Studio_EventInstance_GetDescription :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, description: **FMOD_STUDIO_EVENTDESCRIPTION) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetVolume :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, volume: *float, finalvolume: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetVolume :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, volume: float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetPitch :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, pitch: *float, finalpitch: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetPitch :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, pitch: float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_Get3DAttributes :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, attributes: *FMOD_3D_ATTRIBUTES) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_Set3DAttributes :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, attributes: *FMOD_3D_ATTRIBUTES) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetListenerMask :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, mask: *u32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetListenerMask :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, mask: u32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetProperty :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, index: FMOD_STUDIO_EVENT_PROPERTY, value: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetProperty :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, index: FMOD_STUDIO_EVENT_PROPERTY, value: float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetReverbLevel :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, index: s32, level: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetReverbLevel :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, index: s32, level: float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetPaused :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, paused: *FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetPaused :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, paused: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_Start :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_Stop :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, mode: FMOD_STUDIO_STOP_MODE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetTimelinePosition :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, position: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetTimelinePosition :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, position: s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetPlaybackState :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, state: *FMOD_STUDIO_PLAYBACK_STATE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetChannelGroup :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, group: **FMOD_CHANNELGROUP) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetMinMaxDistance :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, min: *float, max: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_Release :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_IsVirtual :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, virtualstate: *FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetParameterByName :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, name: *u8, value: *float, finalvalue: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetParameterByName :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, name: *u8, value: float, ignoreseekspeed: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetParameterByNameWithLabel :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, name: *u8, label: *u8, ignoreseekspeed: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetParameterByID :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, id: FMOD_STUDIO_PARAMETER_ID, value: *float, finalvalue: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetParameterByID :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, id: FMOD_STUDIO_PARAMETER_ID, value: float, ignoreseekspeed: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetParameterByIDWithLabel :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, id: FMOD_STUDIO_PARAMETER_ID, label: *u8, ignoreseekspeed: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetParametersByIDs :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, ids: *FMOD_STUDIO_PARAMETER_ID, values: *float, count: s32, ignoreseekspeed: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_KeyOff :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetCallback :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, callback: FMOD_STUDIO_EVENT_CALLBACK, callbackmask: FMOD_STUDIO_EVENT_CALLBACK_TYPE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetUserData :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, userdata: **void) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_SetUserData :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, userdata: *void) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetCPUUsage :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, exclusive: *u32, inclusive: *u32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_EventInstance_GetMemoryUsage :: (eventinstance: *FMOD_STUDIO_EVENTINSTANCE, memoryusage: *FMOD_STUDIO_MEMORY_USAGE) -> FMOD_RESULT #foreign fmodstudio; + +/* +Bus +*/ +FMOD_Studio_Bus_IsValid :: (bus: *FMOD_STUDIO_BUS) -> FMOD_BOOL #foreign fmodstudio; +FMOD_Studio_Bus_GetID :: (bus: *FMOD_STUDIO_BUS, id: *FMOD_GUID) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_GetPath :: (bus: *FMOD_STUDIO_BUS, path: *u8, size: s32, retrieved: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_GetVolume :: (bus: *FMOD_STUDIO_BUS, volume: *float, finalvolume: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_SetVolume :: (bus: *FMOD_STUDIO_BUS, volume: float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_GetPaused :: (bus: *FMOD_STUDIO_BUS, paused: *FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_SetPaused :: (bus: *FMOD_STUDIO_BUS, paused: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_GetMute :: (bus: *FMOD_STUDIO_BUS, mute: *FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_SetMute :: (bus: *FMOD_STUDIO_BUS, mute: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_StopAllEvents :: (bus: *FMOD_STUDIO_BUS, mode: FMOD_STUDIO_STOP_MODE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_GetPortIndex :: (bus: *FMOD_STUDIO_BUS, index: *FMOD_PORT_INDEX) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_SetPortIndex :: (bus: *FMOD_STUDIO_BUS, index: FMOD_PORT_INDEX) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_LockChannelGroup :: (bus: *FMOD_STUDIO_BUS) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_UnlockChannelGroup :: (bus: *FMOD_STUDIO_BUS) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_GetChannelGroup :: (bus: *FMOD_STUDIO_BUS, group: **FMOD_CHANNELGROUP) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_GetCPUUsage :: (bus: *FMOD_STUDIO_BUS, exclusive: *u32, inclusive: *u32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bus_GetMemoryUsage :: (bus: *FMOD_STUDIO_BUS, memoryusage: *FMOD_STUDIO_MEMORY_USAGE) -> FMOD_RESULT #foreign fmodstudio; + +/* +VCA +*/ +FMOD_Studio_VCA_IsValid :: (vca: *FMOD_STUDIO_VCA) -> FMOD_BOOL #foreign fmodstudio; +FMOD_Studio_VCA_GetID :: (vca: *FMOD_STUDIO_VCA, id: *FMOD_GUID) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_VCA_GetPath :: (vca: *FMOD_STUDIO_VCA, path: *u8, size: s32, retrieved: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_VCA_GetVolume :: (vca: *FMOD_STUDIO_VCA, volume: *float, finalvolume: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_VCA_SetVolume :: (vca: *FMOD_STUDIO_VCA, volume: float) -> FMOD_RESULT #foreign fmodstudio; + +/* +Bank +*/ +FMOD_Studio_Bank_IsValid :: (bank: *FMOD_STUDIO_BANK) -> FMOD_BOOL #foreign fmodstudio; +FMOD_Studio_Bank_GetID :: (bank: *FMOD_STUDIO_BANK, id: *FMOD_GUID) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetPath :: (bank: *FMOD_STUDIO_BANK, path: *u8, size: s32, retrieved: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_Unload :: (bank: *FMOD_STUDIO_BANK) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_LoadSampleData :: (bank: *FMOD_STUDIO_BANK) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_UnloadSampleData :: (bank: *FMOD_STUDIO_BANK) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetLoadingState :: (bank: *FMOD_STUDIO_BANK, state: *FMOD_STUDIO_LOADING_STATE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetSampleLoadingState :: (bank: *FMOD_STUDIO_BANK, state: *FMOD_STUDIO_LOADING_STATE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetStringCount :: (bank: *FMOD_STUDIO_BANK, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetStringInfo :: (bank: *FMOD_STUDIO_BANK, index: s32, id: *FMOD_GUID, path: *u8, size: s32, retrieved: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetEventCount :: (bank: *FMOD_STUDIO_BANK, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetEventList :: (bank: *FMOD_STUDIO_BANK, array: **FMOD_STUDIO_EVENTDESCRIPTION, capacity: s32, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetBusCount :: (bank: *FMOD_STUDIO_BANK, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetBusList :: (bank: *FMOD_STUDIO_BANK, array: **FMOD_STUDIO_BUS, capacity: s32, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetVCACount :: (bank: *FMOD_STUDIO_BANK, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetVCAList :: (bank: *FMOD_STUDIO_BANK, array: **FMOD_STUDIO_VCA, capacity: s32, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_GetUserData :: (bank: *FMOD_STUDIO_BANK, userdata: **void) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_Bank_SetUserData :: (bank: *FMOD_STUDIO_BANK, userdata: *void) -> FMOD_RESULT #foreign fmodstudio; + +/* +Command playback information +*/ +FMOD_Studio_CommandReplay_IsValid :: (replay: *FMOD_STUDIO_COMMANDREPLAY) -> FMOD_BOOL #foreign fmodstudio; +FMOD_Studio_CommandReplay_GetSystem :: (replay: *FMOD_STUDIO_COMMANDREPLAY, system: **FMOD_STUDIO_SYSTEM) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_GetLength :: (replay: *FMOD_STUDIO_COMMANDREPLAY, length: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_GetCommandCount :: (replay: *FMOD_STUDIO_COMMANDREPLAY, count: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_GetCommandInfo :: (replay: *FMOD_STUDIO_COMMANDREPLAY, commandindex: s32, info: *FMOD_STUDIO_COMMAND_INFO) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_GetCommandString :: (replay: *FMOD_STUDIO_COMMANDREPLAY, commandindex: s32, buffer: *u8, length: s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_GetCommandAtTime :: (replay: *FMOD_STUDIO_COMMANDREPLAY, time: float, commandindex: *s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_SetBankPath :: (replay: *FMOD_STUDIO_COMMANDREPLAY, bankPath: *u8) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_Start :: (replay: *FMOD_STUDIO_COMMANDREPLAY) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_Stop :: (replay: *FMOD_STUDIO_COMMANDREPLAY) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_SeekToTime :: (replay: *FMOD_STUDIO_COMMANDREPLAY, time: float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_SeekToCommand :: (replay: *FMOD_STUDIO_COMMANDREPLAY, commandindex: s32) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_GetPaused :: (replay: *FMOD_STUDIO_COMMANDREPLAY, paused: *FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_SetPaused :: (replay: *FMOD_STUDIO_COMMANDREPLAY, paused: FMOD_BOOL) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_GetPlaybackState :: (replay: *FMOD_STUDIO_COMMANDREPLAY, state: *FMOD_STUDIO_PLAYBACK_STATE) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_GetCurrentCommand :: (replay: *FMOD_STUDIO_COMMANDREPLAY, commandindex: *s32, currenttime: *float) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_Release :: (replay: *FMOD_STUDIO_COMMANDREPLAY) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_SetFrameCallback :: (replay: *FMOD_STUDIO_COMMANDREPLAY, callback: FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_SetLoadBankCallback :: (replay: *FMOD_STUDIO_COMMANDREPLAY, callback: FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_SetCreateInstanceCallback :: (replay: *FMOD_STUDIO_COMMANDREPLAY, callback: FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_GetUserData :: (replay: *FMOD_STUDIO_COMMANDREPLAY, userdata: **void) -> FMOD_RESULT #foreign fmodstudio; +FMOD_Studio_CommandReplay_SetUserData :: (replay: *FMOD_STUDIO_COMMANDREPLAY, userdata: *void) -> FMOD_RESULT #foreign fmodstudio; + +#scope_file + +fmod :: #library "lib/x64/fmod"; +fmodstudio :: #library,no_dll "lib/x64/fmodstudio"; diff --git a/modules/ufbx/.gitattributes b/modules/ufbx/.gitattributes new file mode 100644 index 0000000..73a8b6c --- /dev/null +++ b/modules/ufbx/.gitattributes @@ -0,0 +1,10 @@ +* text=auto + +# Treat all .fbx/.obj/.mtl files (even ASCII) as binary +*.fbx binary +*.obj binary +*.mtl binary + +*.png binary +*.mcx binary +*.mc binary diff --git a/modules/ufbx/.github/codecov.yml b/modules/ufbx/.github/codecov.yml new file mode 100644 index 0000000..4c6b223 --- /dev/null +++ b/modules/ufbx/.github/codecov.yml @@ -0,0 +1,19 @@ +coverage: + status: + project: + default: + informational: true + patch: + default: + informational: true +parsers: + gcov: + branch_detection: + conditional: yes + loop: yes + method: yes + macro: yes +ignore: + - "test" +comment: + layout: "diff" diff --git a/modules/ufbx/.github/workflows/ci.yml b/modules/ufbx/.github/workflows/ci.yml new file mode 100644 index 0000000..3327e2c --- /dev/null +++ b/modules/ufbx/.github/workflows/ci.yml @@ -0,0 +1,500 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +# Cancel any in-flight jobs for the same PR/branch so there's only one active +# at a time +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + + ci_pre_hashes: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 2 + - name: Compile hash_scene + run: | + mkdir build + clang test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene + - name: Generate reference hashes + run: | + python3 misc/generate_hashses.py --exe build/hash_scene -o build/hashes.txt --verbose + - name: Upload reference hashes + uses: actions/upload-artifact@v3 + with: + name: reference-hashes + path: build/hashes.txt + + ci_ubuntu: + runs-on: ubuntu-20.04 + needs: ci_pre_hashes + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 2 + - name: Update apt + run: sudo apt-get update + - name: Install apt dependencies + run: sudo apt-get install -y gcc-multilib g++-multilib lcov llvm-11 + - name: Download reference hashes + uses: actions/download-artifact@v3 + with: + name: reference-hashes + path: build + - name: Run tests + run: python3 misc/run_tests.py tests stack readme threadcheck hashes --runner ci_linux + - name: Verbose test info + run: build/runner_clang_release_x64/runner -d data -v + - name: Generate coverage + run: LLVM_COV=llvm-cov-11 bash misc/generate_coverage.sh + - name: Upload coverage + run: bash <(curl -s https://codecov.io/bash) -f coverage.lcov -y .github/codecov.yml + - name: Compress hashdumps + if: ${{ always() && !cancelled() }} + run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_linux.txt.gz + - name: Upload hashdumps + uses: actions/upload-artifact@v3 + if: ${{ always() && !cancelled() }} + with: + name: hash-dumps + path: build/hashdump_ci_linux.txt.gz + + ci_windows: + runs-on: windows-2019 + needs: ci_pre_hashes + steps: + - uses: actions/checkout@v3 + - name: Download reference hashes + uses: actions/download-artifact@v3 + with: + name: reference-hashes + path: build + - run: type build\hashes.txt + - name: Run tests + run: python misc/run_tests.py tests stack readme threadcheck hashes --runner ci_windows + - name: Verbose test info + run: build\runner_vs_cl64_release_x64\runner.exe -d data -v + - name: Compress hashdumps + if: ${{ always() && !cancelled() }} + run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_windows.txt.gz + - name: Upload hashdumps + uses: actions/upload-artifact@v3 + if: ${{ always() && !cancelled() }} + with: + name: hash-dumps + path: build/hashdump_ci_windows.txt.gz + + ci_macos: + runs-on: macos-11 + needs: ci_pre_hashes + steps: + - uses: actions/checkout@v3 + - name: Download reference hashes + uses: actions/download-artifact@v3 + with: + name: reference-hashes + path: build + - name: Run tests + run: python3 misc/run_tests.py tests stack readme threadcheck hashes --remove-compiler gcc --additional-compiler gcc-11 --remove-arch x86 --runner ci_macos + - name: Compile ufbx as Objective C + run: clang -Wall -Wextra -Werror -ObjC -c ufbx.c -o build/ufbx-objc.o + - name: Compress hashdumps + if: ${{ always() && !cancelled() }} + run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_macos.txt.gz + - name: Upload hashdumps + uses: actions/upload-artifact@v3 + if: ${{ always() && !cancelled() }} + with: + name: hash-dumps + path: build/hashdump_ci_macos.txt.gz + + ci_picort: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Run picort + run: python misc/run_tests.py picort + - name: Upload result images + env: + BUNNY_API_TOKEN: ${{ secrets.BUNNY_API_TOKEN }} + if: ${{ always() && !cancelled() }} + continue-on-error: true + run: | + HASH="$(git rev-parse --short=16 HEAD)" + URL="https://storage.bunnycdn.com/ufbx-images/$HASH" + DST_URL="https://ufbx-images.b-cdn.net/$HASH" + curl -sS -w " -> $DST_URL/barbarian.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/barbarian.png --data-binary @build/images/barbarian.png + curl -sS -w " -> $DST_URL/barbarian-scalar.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/barbarian-scalar.png --data-binary @build/images/barbarian-scalar.png + curl -sS -w " -> $DST_URL/barbarian-big.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/barbarian-big.png --data-binary @build/images/barbarian-big.png + curl -sS -w " -> $DST_URL/slime-binary.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/slime-binary.png --data-binary @build/images/slime-binary.png + curl -sS -w " -> $DST_URL/slime-ascii.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/slime-ascii.png --data-binary @build/images/slime-ascii.png + curl -sS -w " -> $DST_URL/slime-big.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/slime-big.png --data-binary @build/images/slime-big.png + + ci_domfuzz: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Run domfuzz/objfuzz + run: python misc/run_tests.py domfuzz objfuzz + + ci_viewer: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Run viewer + run: python misc/run_tests.py viewer + + ci_features: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Compile feature permutations + run: python misc/run_tests.py features + + ci_analysis: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Update apt + run: sudo apt-get update + - name: Install apt dependencies + run: sudo apt-get install -y cppcheck + - name: Install PIP dependencies + run: sudo pip3 install pcpp pycparser + - name: Prepare directories + run: mkdir build + - name: cppcheck + run: cppcheck --error-exitcode=1 --inline-suppr --std=c99 ufbx.c -DUFBX_STATIC_ANALYSIS=1 + - name: Clang Analyzer + if: ${{ always() && !cancelled() }} + run: clang --analyze -Xanalyzer -analyzer-werror -Xanalyzer -analyzer-disable-checker=unix.Malloc ufbx.c + - name: Get Clang debug stack usage + if: ${{ always() && !cancelled() }} + run: clang -fstack-usage -DUFBX_DEV -DUFBX_STANDARD_C -c ufbx.c -o build/ufbx-clang-debug.o + - name: Get Clang release stack usage + if: ${{ always() && !cancelled() }} + run: clang -fstack-usage -DUFBX_DEV -O2 -c ufbx.c -o build/ufbx-clang-release.o + - name: Get GCC debug stack usage + if: ${{ always() && !cancelled() }} + run: gcc -fstack-usage -DUFBX_DEV -DUFBX_STANDARD_C -c ufbx.c -o build/ufbx-gcc-debug.o + - name: Get GCC release stack usage + if: ${{ always() && !cancelled() }} + run: gcc -fstack-usage -DUFBX_DEV -O2 -c ufbx.c -o build/ufbx-gcc-release.o + - name: Parse ufbx.c to AST for analysis + if: ${{ always() && !cancelled() }} + run: python3 misc/analyze_stack.py --no-su --cache build/ufbx-cache.pickle + - name: Analyze Clang debug stack + if: ${{ always() && !cancelled() }} + run: python3 misc/analyze_stack.py build/ufbx-clang-debug.su --limit 0x20000 --cache build/ufbx-cache.pickle + - name: Analyze Clang release stack + if: ${{ always() && !cancelled() }} + run: python3 misc/analyze_stack.py build/ufbx-clang-release.su --limit 0x10000 --cache build/ufbx-cache.pickle + - name: Analyze GCC debug stack + if: ${{ always() && !cancelled() }} + run: python3 misc/analyze_stack.py build/ufbx-gcc-debug.su --limit 0x20000 --cache build/ufbx-cache.pickle + - name: Analyze GCC release stack + if: ${{ always() && !cancelled() }} + run: python3 misc/analyze_stack.py build/ufbx-gcc-release.su --limit 0x10000 --cache build/ufbx-cache.pickle + + ci_compat: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Update apt + run: sudo apt-get update + - name: Install apt dependencies + run: sudo apt-get install -y gcc-multilib g++-multilib + - name: Copy the current ufbx.h to ufbx_new.h + run: cp ufbx.h ufbx_new.h + - name: Downgrade to oldest compatible header + run: bash misc/downgrade_header.sh + - name: Run tests with old header (source compatability) + run: python3 misc/run_tests.py tests --no-sanitize --runner ci_compat + - name: Run tests with new header in ufbx.c, old header in runner.c (ABI compatability) + run: python3 misc/run_tests.py tests --no-sanitize-arch x86 --runner ci_compat --define UFBX_HEADER_PATH=\"ufbx_new.h\" + + ci_lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check formatting + if: ${{ always() && !cancelled() }} + run: python3 misc/check_formatting.py ufbx.c ufbx.h + - name: Check for typos + if: ${{ always() && !cancelled() }} + uses: crate-ci/typos@master + with: + files: ufbx.h ufbx.c + config: ./misc/typos.toml + + ci_bindgen: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Create bindgen/build directory + run: mkdir bindgen/build + - name: Parse ufbx.h + run: python3 bindgen/ufbx_parser.py + - name: Generate typed IR + run: python3 bindgen/ufbx_ir.py + + ci_exotic: + runs-on: ubuntu-latest + needs: ci_pre_hashes + steps: + - uses: actions/checkout@v3 + - name: Download reference hashes + uses: actions/download-artifact@v3 + with: + name: reference-hashes + path: build + - name: Update apt + run: sudo apt-get update + - name: Install apt dependencies + run: sudo apt-get install -y tcc qemu qemu-user gcc-multilib + - name: Install zig cc via PIP + run: sudo pip3 install ziglang + - name: Run tests with TCC + run: python3 misc/run_tests.py tests hashes --additional-compiler tcc --compiler tcc --remove-arch x86 --runner ci_exotic + - name: Compile ufbx.c wth x86 TCC + run: i386-tcc -Wall -Werror -c ufbx.c -o build/tcc-ufbx-x86.o + - name: Compile PowerPC tests + run: python3 -m ziglang cc -fno-sanitize=undefined -target powerpc-linux -DUFBX_DEV ufbx.c test/runner.c -g -o build/ppc-runner + - name: Run PowerPC tests + run: qemu-ppc build/ppc-runner -d data + - name: Compile PowerPC hash_scene + run: | + python3 -m ziglang cc -fno-sanitize=undefined -ffp-contract=off -target powerpc-linux misc/fdlibm.c test/hash_scene.c -g -o build/ppc_hasher_debug + python3 -m ziglang cc -fno-sanitize=undefined -ffp-contract=off -O2 -target powerpc-linux misc/fdlibm.c test/hash_scene.c -g -o build/ppc_hasher_release + - name: Check PowerPC hashes + run: | + qemu-ppc build/ppc_hasher_debug --check build/hashes.txt --dump build/hashdumps/ci_exotic_powerpc_debug.txt --max-dump-errors 3 + qemu-ppc build/ppc_hasher_release --check build/hashes.txt --dump build/hashdumps/ci_exotic_powerpc_release.txt --max-dump-errors 3 + - name: Compile runner with fdlibm + run: clang -DUFBX_NO_MATH_H -DUFBX_MATH_PREFIX=fdlibm_ ufbx.c test/runner.c misc/fdlibm.c -lm -o build/fdlibm_runner + - name: Run tests using fdlibm + run: build/fdlibm_runner -d data + - name: Compile runner.c + run: gcc -c test/runner.c -o build/runner.o + - name: Build and run standard C99 + run: | + gcc -Wall -Wextra -Werror -Wno-unused-function -std=c99 -DUFBX_STANDARD_C build/runner.o ufbx.c -lm -o build/runner-c99 + build/runner-c99 -d data --allow-non-thread-safe + - name: Build and run standard C11 + run: | + gcc -Wall -Wextra -Werror -Wno-unused-function -std=c11 -DUFBX_STANDARD_C build/runner.o ufbx.c -lm -o build/runner-c11 + build/runner-c11 -d data + - name: Build and run standard C++98 + run: | + g++ -Wall -Wextra -Werror -Wno-unused-function -std=c++98 -DUFBX_STANDARD_C build/runner.o -x c++ ufbx.c -lm -o build/runner-cpp98 + build/runner-cpp98 -d data --allow-non-thread-safe + - name: Build and run standard C++11 + run: | + g++ -Wall -Wextra -Werror -Wno-unused-function -std=c++11 -DUFBX_STANDARD_C build/runner.o -x c++ ufbx.c -lm -o build/runner-cpp11 + build/runner-cpp11 -d data + - name: Build and run threadcheck (standard C11) + run: | + gcc -Wall -Wextra -Werror -Wno-unused-function -std=c11 -DUFBX_STANDARD_C -c ufbx.c -o build/ufbx-c11.o + g++ -Wall -Wextra -Werror -Wno-unused-function -pthread -std=c++11 build/ufbx-c11.o test/threadcheck.cpp -lm -o build/threadcheck-c11 + build/threadcheck-c11 data/maya_cube_7500_binary.fbx 2 + - name: Build and run threadcheck (standard C++11) + run: | + g++ -Wall -Wextra -Werror -Wno-unused-function -pthread -std=c++11 -DUFBX_STANDARD_C -x c++ ufbx.c test/threadcheck.cpp -lm -o build/threadcheck-cpp11 + build/threadcheck-cpp11 data/maya_cube_7500_binary.fbx 2 + - name: Compress hashdumps + if: ${{ always() && !cancelled() }} + run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_exotic.txt.gz + - name: Upload hashdumps + uses: actions/upload-artifact@v3 + if: ${{ always() && !cancelled() }} + with: + name: hash-dumps + path: build/hashdump_ci_exotic.txt.gz + + ci_hasher: + runs-on: ubuntu-latest + needs: ci_pre_hashes + steps: + - uses: actions/checkout@v3 + - name: Prepare directories + run: | + mkdir build + mkdir build/hashdumps + - name: Download reference hashes + uses: actions/download-artifact@v3 + with: + name: reference-hashes + path: build + - name: Compile and run hash_scene with various configurations + run: | + clang test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_x64_release.txt --max-dump-errors 3 + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_unbuffered_x64_release.txt --max-dump-errors 3 --no-read-buffer + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_dedicated_x64_release.txt --max-dump-errors 3 --dedicated-allocs + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_linear_x64_release.txt --max-dump-errors 3 --dedicated-allocs --allocator linear + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_linear_reverse_x64_release.txt --max-dump-errors 3 --dedicated-allocs --allocator linear-reverse + clang -DUFBX_DEV -DUFBX_REGRESSION test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_regression_x64_release.txt --max-dump-errors 3 + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_regression_unbuffered_x64_release.txt --max-dump-errors 3 --no-read-buffer + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_regression_dedicated_x64_release.txt --max-dump-errors 3 --dedicated-allocs + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_regression_linear_x64_release.txt --max-dump-errors 3 --dedicated-allocs --allocator linear + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_regression_linear_reverse_x64_release.txt --max-dump-errors 3 --dedicated-allocs --allocator linear-reverse + clang -fshort-enums -fshort-wchar test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_short_x64_release.txt --max-dump-errors 3 + clang -fsigned-char test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_schar_x64_release.txt --max-dump-errors 3 + clang -funsigned-char test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_uchar_x64_release.txt --max-dump-errors 3 + clang -DUFBX_STANDARD_C -DUFBX_DEV -DUFBX_REGRESSION test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene + build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_stdc_x64_release.txt --max-dump-errors 3 + - name: Compress hashdumps + if: ${{ always() && !cancelled() }} + run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_hasher.txt.gz + - name: Upload hashdumps + uses: actions/upload-artifact@v3 + if: ${{ always() && !cancelled() }} + with: + name: hash-dumps + path: build/hashdump_ci_hasher.txt.gz + + ci_wasm: + runs-on: ubuntu-latest + needs: ci_pre_hashes + steps: + - uses: actions/checkout@v3 + - name: Install wasi-sdk + run: | + mkdir build + export WASI_VERSION=17 + export WASI_VERSION_FULL=${WASI_VERSION}.0 + curl -L https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_VERSION}/wasi-sdk-${WASI_VERSION_FULL}-linux.tar.gz -o build/wasi-sdk.tar.gz + tar xzf build/wasi-sdk.tar.gz -C build + mv build/wasi-sdk-${WASI_VERSION_FULL} build/wasi-sdk + - name: Install wasmtime + run: | + curl https://wasmtime.dev/install.sh -sSf > wasmtime-install.sh + bash wasmtime-install.sh --version v4.0.0 + echo "$HOME/.wasmtime/bin" >> $GITHUB_PATH + - name: Test wasmtime + run: wasmtime --version + - name: Download reference hashes + uses: actions/download-artifact@v3 + with: + name: reference-hashes + path: build + - name: Run tests + run: python3 misc/run_tests.py tests hashes --wasi-sdk build/wasi-sdk --compiler wasi_clang --runner ci_wasm + - name: Compress hashdumps + if: ${{ always() && !cancelled() }} + run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_wasm.txt.gz + - name: Upload hashdumps + uses: actions/upload-artifact@v3 + if: ${{ always() && !cancelled() }} + with: + name: hash-dumps + path: build/hashdump_ci_wasm.txt.gz + + ci_arm32: + runs-on: [self-hosted, ARM] + needs: ci_pre_hashes + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 2 + - name: Download reference hashes + uses: actions/download-artifact@v3 + with: + name: reference-hashes + path: build + - name: Run tests + run: python3 misc/run_tests.py tests stack hashes --no-sanitize --threads 2 --runner ci_arm64 + - name: Compress hashdumps + if: ${{ always() && !cancelled() }} + run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_arm32.txt.gz + - name: Upload hashdumps + uses: actions/upload-artifact@v3 + if: ${{ always() && !cancelled() }} + with: + name: hash-dumps + path: build/hashdump_ci_arm32.txt.gz + + ci_arm64: + runs-on: [self-hosted, ARM64] + needs: ci_pre_hashes + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 2 + - name: Download reference hashes + uses: actions/download-artifact@v3 + with: + name: reference-hashes + path: build + - name: Run tests + run: python3 misc/run_tests.py tests stack hashes --no-sanitize --threads 2 --runner ci_arm64 + - name: Compress hashdumps + if: ${{ always() && !cancelled() }} + run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_arm64.txt.gz + - name: Upload hashdumps + uses: actions/upload-artifact@v3 + if: ${{ always() && !cancelled() }} + with: + name: hash-dumps + path: build/hashdump_ci_arm64.txt.gz + + ci_dataset: + runs-on: [self-hosted, ARM64] + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 2 + - name: Create build directory + run: mkdir build + - name: Compile check_fbx.c + run: clang -O2 test/check_fbx.c -lm -o build/check_fbx + - name: Run dataset tests + run: python3 misc/check_dataset.py --exe build/check_fbx --root /mnt/fbx-files --host-url https://ufbx-dataset.b-cdn.net + + ci_post_hashes: + runs-on: ubuntu-latest + if: ${{ always() }} + needs: [ci_ubuntu, ci_windows, ci_macos, ci_wasm, ci_arm32, ci_arm64, ci_exotic, ci_hasher] + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 2 + - name: Compile hash_scene + run: | + mkdir build + clang test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene + - name: Download combined hashdumps + uses: actions/download-artifact@v3 + with: + name: hash-dumps + path: build/ci-hashdumps + - name: List files to dump + run: python3 misc/hash_diff.py list build/ci-hashdumps -o build/dumped-files.txt + - name: Dump reference hashes + run: | + mkdir build/ref-hashdumps + build/hash_scene --check build/dumped-files.txt --dump build/ref-hashdumps/reference_linux_x64_release.txt --dump-all + - name: Compress reference hashdumps + run: python3 misc/hash_diff.py compress build/ref-hashdumps -o build/hashdump_ci_reference.txt.gz + - name: Diff CI and reference dumps + run: python3 misc/hash_diff.py diff build/ci-hashdumps --ref build/hashdump_ci_reference.txt.gz + - name: Upload reference hashdumps + uses: actions/upload-artifact@v3 + if: ${{ always() && !cancelled() }} + with: + name: hash-dumps + path: build/hashdump_ci_reference.txt.gz diff --git a/modules/ufbx/.gitignore b/modules/ufbx/.gitignore new file mode 100644 index 0000000..915fbe1 --- /dev/null +++ b/modules/ufbx/.gitignore @@ -0,0 +1,19 @@ + +# Project files +proj/ + +# Build output +build/ + +# Python cache files +__pycache__/ + +# Editor files +.vscode/ + +# Coverage files +*.lcov +*.gcov +*.gcda +*.gcno + diff --git a/modules/ufbx/LICENSE b/modules/ufbx/LICENSE new file mode 100644 index 0000000..5db259b --- /dev/null +++ b/modules/ufbx/LICENSE @@ -0,0 +1,39 @@ +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2020 Samuli Raivio +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +---------------------------------------- diff --git a/modules/ufbx/README.md b/modules/ufbx/README.md new file mode 100644 index 0000000..83780c6 --- /dev/null +++ b/modules/ufbx/README.md @@ -0,0 +1,145 @@ +# ufbx [![CI](https://github.com/bqqbarbhg/ufbx/actions/workflows/ci.yml/badge.svg)](https://github.com/bqqbarbhg/ufbx/actions/workflows/ci.yml) [![codecov](https://codecov.io/gh/bqqbarbhg/ufbx/branch/master/graph/badge.svg)](https://codecov.io/gh/bqqbarbhg/ufbx) + +Single source file FBX file loader. + +```cpp +ufbx_load_opts opts = { 0 }; // Optional, pass NULL for defaults +ufbx_error error; // Optional, pass NULL if you don't care about errors +ufbx_scene *scene = ufbx_load_file("thing.fbx", &opts, &error); +if (!scene) { + fprintf(stderr, "Failed to load: %s\n", error.description.data); + exit(1); +} + +// Use and inspect `scene`, it's just plain data! + +// Let's just list all objects within the scene for example: +for (size_t i = 0; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + if (node->is_root) continue; + + printf("Object: %s\n", node->name.data); + if (node->mesh) { + printf("-> mesh with %zu faces\n", node->mesh->faces.count); + } +} + +ufbx_free_scene(scene); +``` + +## Setup + +Copy `ufbx.h` and `ufbx.c` to your project, `ufbx.c` needs to be compiled as +C99/C++11 or more recent. You can also add `misc/ufbx.natvis` to get debug +formatting for the types. + +## Features + +The goal is to be at feature parity with the official FBX SDK. + +* Supports binary and ASCII FBX files starting from version 3000 +* Safe + * Invalid files and out-of-memory conditions are handled gracefully + * Loaded scenes are sanitized by default, no out-of-bounds indices or non-UTF-8 strings + * Extensively [tested](#testing) +* Various object types + * Meshes, skinning, blend shapes + * Lights and cameras + * Embedded textures + * NURBS curves and surfaces + * Geometry caches + * LOD groups + * Display/selection sets + * Rigging constraints +* Unified PBR material from known vendor-specific materials +* Various utilities for evaluating the scene (can be compiled out if not needed) + * Polygon triangulation + * Index generation + * Animation curve evaluation / layer blending + * CPU skinning evaluation + * Subdivision surface evaluation + * NURBS curve/surface tessellation +* Progress reporting and cancellation +* Support for Wavefront `.obj` files as well + +## Platforms + +The library is written in portable C (also compiles as C++) and should work on +almost any platform without modification. If compiled as pre-C11/C++11 on an +unknown compiler (not MSVC/Clang/GCC/TCC), some functions will not be +thread-safe as C99 does not have support for atomics. + +The following platforms are tested on CI and produce bit-exact results: + +* Windows: MSVC x64/x86, Clang x64/x86, GCC MinGW x64 +* macOS: Clang x64, GCC x64 +* Linux: Clang x64/x86/ARM64/ARM32/PowerPC, GCC x64/x86/ARM64/ARM32, TCC x64/x86 +* WASI: Clang WASM + +## Testing + +* Internal tests run on all platforms listed above +* Fuzzed in multiple layers + * Parsers (fbx binary/fbx ascii/deflate/xml/mcx/obj/mtl) fuzzed via AFL + * Built-in fuzzing for byte modifications/truncation/out-of-memory + * Semantic fuzzing for binary FBX and OBJ files +* Public dataset: 3.0GB / 245 files + * Loaded, validated, and compared against reference .obj files +* Private dataset: 33.6GB / 12618 files + * Loaded and validated +* Static analysis for maximum stack depth on Linux GCC/Clang + +## Versioning + +The latest commit in the [`master`](https://github.com/ufbx/ufbx/tree/master) +branch contains the latest stable version of the library. + +Older versions are tagged as `vX.Y.Z`, patch updates (`Z`) are ABI compatible +and work with older versions of the header from the same minor version (`Y`). +Minor versions within a major verision (`X`) are expected to be source +compatible after `1.0.0` but the `0.Y.Z` releases can break for every minor +release. + +## License + +``` +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2020 Samuli Raivio +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +---------------------------------------- +``` diff --git a/modules/ufbx/bindgen/parsette.py b/modules/ufbx/bindgen/parsette.py new file mode 100644 index 0000000..55bd76e --- /dev/null +++ b/modules/ufbx/bindgen/parsette.py @@ -0,0 +1,472 @@ +import re +from typing import Optional, Callable, Any, Iterable, NamedTuple, Union, List, Dict, Tuple +import typing + +try: + regex_type = re.Pattern +except AttributeError: + try: + regex_type = re.RegexObject + except AttributeError: + regex_type = type(re.compile('')) + +Matcher = Callable[[str, int], int] + +def make_regex_matcher(regex) -> Matcher: + def matcher(text: str, begin: int) -> int: + m = regex.match(text, begin) + if m: + return m.end() + else: + return -1 + return matcher + +def make_literal_matcher(literal) -> Matcher: + def matcher(text: str, begin: int) -> int: + if text.startswith(literal, begin): + return begin + len(literal) + else: + return -1 + return matcher + +def never_matcher(text: str, begin: int) -> int: + return -1 + +def always_one_matcher(text: str, begin: int) -> int: + return begin + 1 + +class Location(NamedTuple): + filename: str + source: str + begin: int + end: int + line: int + column: int + + def __str__(self): + if self.filename: + return f"{self.filename}:{self.line}:{self.column}" + else: + return f"{self.line}:{self.column}" + +class ParserHint(NamedTuple): + location: Location + message: str + +class ParseError(Exception): + def __init__(self, loc: Location, message: str, hints: Iterable[ParserHint]): + msg = f"{loc}: {message}" + if hints: + lines = (f".. while parsing {h.message} at {h.location}" for h in reversed(hints)) + msg = msg + "\n" + "\n".join(lines) + super().__init__(msg) + self.loc = loc + +class Rule: + """Rule to match tokens + + """ + def __init__(self, name: str, matcher: Matcher=never_matcher, literal: str="", value:Any=None, ignore:bool=False): + self.name = name + self.matcher = matcher + self.literal = literal + if value is None or callable(value): + self.valuer = value + else: + self.valuer = lambda s: value + self.ignore = bool(ignore) + + def __repr__(self): + return "Rule({!r})".format(self.name) + + def __str__(self): + return "{!r}".format(self.name) + +# Special rules for begin and end +Begin = Rule("begin-of-file") +End = Rule("end-of-file") +Synthetic = Rule("synthetic") +Error = Rule("error") + +def make_matcher_from_pattern(pattern: Any) -> Matcher: + if isinstance(pattern, str): + # Compile strings to regex + regex = re.compile(pattern, re.ASCII) + return make_regex_matcher(regex) + elif isinstance(pattern, regex_type): + # Already compiled regex + return make_regex_matcher(pattern) + elif callable(pattern): + # Custom matcher function + return pattern + else: + raise TypeError('Invalid type for rule pattern {!r}'.format(type(pattern))) + +class Lexer(object): + def __init__(self): + self.global_rules = [] + self.prefix_rules = {} + self.lexer_type = SourceLexer + + def add_rule(self, rule: Rule, prefix:Iterable[str]=None): + if prefix: + for pre in prefix: + if not isinstance(pre, str): + raise TypeError("Prefixes must be an iterable of str") + if len(pre) > 1: + raise ValueError('Prefixes must be single characters') + rules = self.prefix_rules.setdefault(pre, []) + rules.append(rule) + else: + self.global_rules.append(rule) + + def rule(self, name: str, pattern: Any, *, value:Any=None, prefix:Optional[Iterable[str]]=None): + matcher = make_matcher_from_pattern(pattern) + rule = Rule(name, matcher, "", value, ignore=False) + self.add_rule(rule, prefix) + return rule + + def ignore(self, name: str, pattern: Any, *, value:Any=None, prefix:Optional[Iterable[str]]=None): + matcher = make_matcher_from_pattern(pattern) + rule = Rule(name, matcher, "", value, ignore=True) + self.add_rule(rule, prefix) + return rule + + def ignore_whitespace(self, *, ignore_newline=True): + spaces = " \t\v\r" + if ignore_newline: + spaces += "\n" + regex = re.compile(f"[{re.escape(spaces)}]+") + self.ignore("whitespace", regex, prefix=spaces) + + def literal(self, literal: str, value: Any=None): + if not isinstance(literal, str): + raise TypeError('Literals must be strings, got {!r}'.format(type(literal))) + if not literal: + raise ValueError('Empty literal') + if len(literal) == 1: + # Prefix match is full match + matcher = always_one_matcher + else: + matcher = make_literal_matcher(literal) + rule = Rule(repr(literal), matcher, literal, value) + self.add_rule(rule, literal[0]) + return rule + + def literals(self, *args: str): + return [self.literal(arg) for arg in args] + + def make(self, source: str, filename: str=""): + return self.lexer_type(self, source, filename) + +class Token: + __slots__ = ["rule", "location", "value", "_text"] + + def __init__(self, rule: Rule, location: Location): + self.rule = rule + self.location = location + self.value = None + self._text = None + + if rule.valuer: + self.value = rule.valuer(self.text()) + + def text(self) -> str: + if self._text is None: + loc = self.location + self._text = loc.source[loc.begin:loc.end] + return self._text + + def __str__(self) -> str: + loc = self.location + length = loc.end - loc.begin + if self.rule.literal or length > 20: + return self.rule.name + else: + return f"{self.rule.name} {self.text()!r}" + + def __repr__(self) -> str: + return f"Token({self.rule.name!r}" + +def synthetic(text: str): + length = len(text) + loc = Location("", text, 0, length, 1, 1) + return Token(Synthetic, loc) + +class SourceLexer: + def __init__(self, lexer: Lexer, source: str, filename:str=""): + self.pos = 0 + self.lexer = lexer + self.source = source + self.source_length = len(source) + self.filename = filename + self.line = 1 + self.line_end = 0 + + def scan(self) -> Token: + pos = self.pos + source_end = self.source_length + lexer = self.lexer + source = self.source + global_rules = lexer.global_rules + + while pos < source_end: + prefix = source[pos] + prefix_rules = lexer.prefix_rules.get(prefix) + + best_rule = None + best_end = -1 + + if prefix_rules: + for rule in prefix_rules: + end = rule.matcher(source, pos) + if end >= best_end: + best_rule = rule + best_end = end + + for rule in global_rules: + end = rule.matcher(source, pos) + if end >= best_end: + best_rule = rule + best_end = end + + column = pos - self.line_end + 1 + while self.line_end < best_end: + line_end = source.find("\n", self.line_end, best_end) + if line_end < 0: break + self.line_end = line_end + 1 + self.line += 1 + + if best_end < 0: + loc = Location(self.filename, source, pos, pos + 1, self.line, column) + return Token(Error, loc) + + if best_rule.ignore: + pos = best_end + else: + self.pos = best_end + loc = Location(self.filename, source, pos, best_end, self.line, column) + return Token(best_rule, loc) + + loc = Location(self.filename, source, source_end, source_end + 1, self.line + 1, 1) + return Token(End, loc) + +def format_rule(rule): + if isinstance(rule, list): + return 'any of ({})'.format(', '.join(format_rule(r) for r in rule)) + elif isinstance(rule, Rule): + return rule.name + elif isinstance(rule, str): + return repr(rule) + else: + raise TypeError(f'Unsupported rule type {repr(type(rule))}') + +def format_message(msg): + return " " + msg if msg else "" + +class ParserHintContext: + def __init__(self, parser: "Parser", token_or_loc: Union[Token, Location], message: str): + self.parser = parser + if hasattr(token_or_loc, "location"): + self.location = token_or_loc.location + else: + self.location = token_or_loc + self.message = message + + def __enter__(self): + self.parser.hint_stack.append(ParserHint(self.location, self.message)) + + def __exit__(self, type, value, traceback): + self.parser.hint_stack.pop() + +class Parser: + def __init__(self, lexer: Lexer, source: str, filename:str=""): + begin_loc = Location(filename, source, 0, 0, 1, 1) + self.lexer = lexer + self.source_lexer = lexer.make(source, filename) + self.prev_token = Token(Begin, begin_loc) + self.token = self.source_lexer.scan() + self.hint_stack = [] + + def scan(self): + if self.token.rule is not End: + self.prev_token = self.token + self.token = self.source_lexer.scan() + if self.token.rule is Error: + self.fail(f"Bad token starting with {self.token.text()!r}") + return self.prev_token + + def peek(self, rule: Any) -> Optional[Token]: + if isinstance(rule, list): + for r in rule: + tok = self.peek(r) + if tok: return tok + elif isinstance(rule, Rule): + if self.token.rule == rule: + return self.token + elif isinstance(rule, str): + if self.token.rule.literal == rule: + return self.token + else: + raise TypeError(f'Unsupported rule type {type(rule)!r}') + + def accept(self, rule) -> Optional[Token]: + tok = self.peek(rule) + if tok: + self.scan() + return tok + else: + return None + + def fail_at(self, location: Location, message: str): + raise ParseError(location, message, self.hint_stack) + + def fail(self, message: str): + self.fail_at(self.token.location, message) + + def fail_prev(self, message: str): + self.fail_at(self.prev_token.location, message) + + def fail_got(self, message: str): + self.fail_at(self.token.location, message + f", got {self.token}") + + def fail_prev_got(self, message: str): + self.fail_at(self.prev_token.location, message + f", got {self.prev_token}") + + def require(self, rule, message: str="") -> Token: + tok = self.accept(rule) + if tok: + return tok + else: + fr, fm = format_rule, format_message + self.fail_got(f"Expected {fr(rule)}{fm(message)}") + + def sep(self, sep, message="") -> Iterable[int]: + n = 0 + yield n + while self.accept(sep): + yield n + n += 1 + + def until(self, end, message="") -> Iterable[int]: + n = 0 + while not self.accept(end): + yield n + n += 1 + + def sep_until(self, sep, end, message="") -> Iterable[int]: + n = 0 + while not self.accept(end): + if n > 0 and not self.accept(sep): + fr, fm = format_rule, format_message + self.fail_got(f"Expected {fr(sep)} or {fr(end)}{fm(message)}") + yield n + n += 1 + + def ignore(self, rule) -> int: + n = 0 + while self.accept(rule): + n += 1 + return n + + def hint(self, token_or_loc: Union[Token, Location], message: str): + return ParserHintContext(self, token_or_loc, message) + +get_origin = getattr(typing, "get_origin", lambda o: getattr(o, "__origin__", None)) +get_args = getattr(typing, "get_args", lambda o: getattr(o, "__args__", None)) + +class AstField(NamedTuple): + name: str + base: type + optional: bool + sequence: bool + +def make_ast_field(name, base): + origin, args = get_origin(base), get_args(base) + optional = sequence = False + if origin == Union and len(args) == 2 and type(None) in args: + base = args[args.index(type(None)) ^ 1] + optional = True + origin, args = get_origin(base), get_args(base) + if origin == List: + base = args[0] + sequence = True + elif origin: + base = object + return AstField(name, base, optional, sequence) + +class Ast: + def __init__(self, *args, **kwargs): + cls = type(self) + if len(args) > len(cls.fields): + raise TypeError(f"Too many fields for {cls.__name__}: {len(args)}, expected {len(cls.fields)}") + for field, arg in zip(cls.fields, args): + setattr(self, field.name, arg) + for name, arg in kwargs.items(): + setattr(self, name, arg) + for field in cls.fields: + try: + value = getattr(self, field.name) + if field.optional and value is None: + continue + if field.sequence: + for ix, v in enumerate(value): + if not isinstance(v, field.base): + raise TypeError(f"Trying to assign '{type(v).__name__}' to '{cls.__name__}' field '{field.name}: {field.base.__name__}' index [{ix}]") + else: + if not isinstance(value, field.base): + raise TypeError(f"Trying to assign '{type(value).__name__}' to '{cls.__name__}' field '{field.name}: {field.base.__name__}'") + except AttributeError: + raise ValueError(f"'{cls.__name__}' requires field '{field.name}: {field.base.__name__}'") + + def __init_subclass__(cls, **kwargs): + fields = getattr(cls, "__annotations__", {}) + cls.fields = [make_ast_field(k, v) for k,v in fields.items()] + super().__init_subclass__(**kwargs) + + def _imp_dump(self, result, indent): + cls = type(self) + indent_str = " " * indent + result += (cls.__name__, "(") + first = True + num_asts = 0 + for field in cls.fields: + if issubclass(field.base, Ast): + num_asts += 1 + continue + if not first: result.append(", ") + first = False + result += (field.name, "=", str(getattr(self, field.name, None))) + + for field in cls.fields: + if not issubclass(field.base, Ast): continue + + if num_asts > 1: + result += ("\n", indent_str, " ") + else: + if not first: result.append(", ") + + result.append(field.name) + result.append("=") + attr = getattr(self, field.name, None) + if not attr: + result.append("None") + continue + + if field.sequence: + result.append("[") + seq_indent = 1 if num_asts == 1 else 2 + print(seq_indent) + for ast in getattr(self, field.name, None): + result += ("\n", indent_str, " " * seq_indent) + ast._imp_dump(result, indent + seq_indent) + result += ("\n", indent_str, " ]") + else: + attr._imp_dump(result, indent + 1) + + result += ")" + + def dump(self, indent=0): + result = [] + self._imp_dump(result, indent) + return "".join(result) diff --git a/modules/ufbx/bindgen/ufbx_ir.py b/modules/ufbx/bindgen/ufbx_ir.py new file mode 100644 index 0000000..c995556 --- /dev/null +++ b/modules/ufbx/bindgen/ufbx_ir.py @@ -0,0 +1,1098 @@ +from typing import NamedTuple, Dict, List, Optional, Union, get_type_hints +import typing +import json +import os + +get_origin = getattr(typing, "get_origin", lambda o: getattr(o, "__origin__", None)) +get_args = getattr(typing, "get_args", lambda o: getattr(o, "__args__", None)) + +class BaseField(NamedTuple): + name: str + json_name: str + type: type + optional: bool + list: bool + dict: bool + +def make_field(name, base): + json_name = "".join((p.title() if i > 0 else p) for i,p in enumerate(name.split("_"))) + origin, args = get_origin(base), get_args(base) + optional = list_ = dict_ = False + if origin == Union and len(args) == 2 and type(None) in args: + base = args[args.index(type(None)) ^ 1] + optional = True + origin, args = get_origin(base), get_args(base) + if origin in (List, list): + base = args[0] + list_ = True + if origin in (Dict, dict) and len(args) == 2 and args[0] == str: + base = args[1] + dict_ = True + return BaseField(name, json_name, base, optional, list_, dict_) + +def get_fields(cls): + if not hasattr(cls, "_base_fields"): + cls._base_fields = [make_field(name, typ) for name, typ in get_type_hints(cls).items()] + return cls._base_fields + +def from_json(typ, json_obj): + if typ in (str, int, float, bool): + if not isinstance(json_obj, typ): + raise ValueError(f"Wrong type for {typ.__name__}, got {type(json_obj)} expected {typ}") + return json_obj + + values = { } + for field in get_fields(typ): + json_field = json_obj.get(field.json_name) + if not field.optional and json_field is None: + raise ValueError(f"Missing non-optional field {typ.__name__}.{field.json_name}") + if json_field is None: + values[field.name] = None + continue + + if field.list: + if not isinstance(json_field, list): + raise ValueError(f"Wrong type for {typ.__name__}.{field.json_name}, got {type(json_obj)} expected a list of {field.type}") + values[field.name] = [from_json(field.type, js) for js in json_field] + elif field.dict: + if not isinstance(json_field, dict): + raise ValueError(f"Wrong type for {typ.__name__}.{field.json_name}, got {type(json_obj)} expected an object containing {field.type}") + values[field.name] = { k: from_json(field.type, js) for k,js in json_field.items() } + else: + values[field.name] = from_json(field.type, json_field) + return typ(**values) + +def to_json_imp(typ, obj): + if typ in (str, int, float, bool): + if not isinstance(obj, typ): + raise TypeError(f"Wrong type for {typ.__name__}, got {type(obj)} expected {typ}") + return obj + + values = { } + for field in get_fields(typ): + obj_field = getattr(obj, field.name, None) + if not field.optional and obj_field is None: + raise TypeError(f"Missing non-optional field {typ.__name__}.{field.name}") + if obj_field is None: + values[field.json_name] = None + continue + + if field.list: + if not isinstance(obj_field, list): + raise TypeError(f"Wrong type for {typ.__name__}.{field.name}, got {type(obj_field)} expected a list of {field.type}") + values[field.json_name] = [to_json_imp(field.type, js) for js in obj_field] + elif field.dict: + if not isinstance(obj_field, dict): + raise TypeError(f"Wrong type for {typ.__name__}.{field.name}, got {type(obj_field)} expected an object containing {field.type}") + values[field.json_name] = { k: to_json_imp(field.type, ob) for k,ob in obj_field.items() } + else: + values[field.json_name] = to_json_imp(field.type, obj_field) + return values + +def to_json(obj): + return to_json_imp(type(obj), obj) + +class Base: + def __init__(self, **kwargs): + for field in get_fields(type(self)): + val = kwargs.get(field.name, None) + if not field.optional and val is None: + if field.list: + val = [] + elif field.dict: + val = { } + else: + val = field.type() + setattr(self, field.name, val) + + def __repr__(self): + cls = type(self) + fs = ", ".join(f"{f.name}={getattr(self, f.name, None)!r}" for f in get_fields(cls)) + return f"{cls.__name__}({fs})" + +class Mod(Base): + pass + +class Constant(Base): + name: str + value_int: int + +class Type(Base): + key: str + base_name: str + size: Dict[str, int] + align: Dict[str, int] + kind: str + is_nullable: bool + is_const: bool + is_pod: bool + is_function: bool + array_length: Optional[int] + func_args: List["Argument"] + inner: Optional[str] + +class Field(Base): + type: str + name: str + kind: str + private: bool + offset: Dict[str, int] + comment: Optional[str] + union_sized: Dict[str, bool] + union_preferred: bool + +class Struct(Base): + name: str + short_name: str + fields: List[Field] + comment: Optional[str] + vertex_attrib_type: Optional[str] + is_union: bool + is_anonymous: bool + is_list: bool + is_element: bool + is_pod: bool + is_input: bool + is_callback: bool + is_interface: bool + member_functions: List[str] + member_globals: List[str] + +class EnumValue(Base): + name: str + short_name: str + short_name_raw: str + value: int + comment: Optional[str] + flag: bool + auxiliary: bool + +class Enum(Base): + name: str + short_name: str + values: List[str] + flag: bool + +class Argument(Base): + name: str + type: str + kind: str + is_return: bool + by_ref: bool + return_ref: bool + +class StringArgument(Base): + name: str + pointer_index: int + length_index: int + +class ArrayArgument(Base): + name: str + pointer_index: int + num_index: int + +class BlobArgument(Base): + name: str + pointer_index: int + size_index: int + +class Function(Base): + name: str + short_name: str + pretty_name: str + return_type: str + return_kind: str + kind: str + arguments: List[Argument] + string_arguments: List[StringArgument] + array_arguments: List[ArrayArgument] + blob_arguments: List[BlobArgument] + is_inline: bool + member_name: Optional[str] + ffi_name: Optional[str] + catch_name: Optional[str] + len_name: Optional[str] + is_ffi: bool + is_catch: bool + is_len: bool + has_error: bool + has_panic: bool + alloc_type: str + return_array_scale: int + nullable_return: bool + +class Global(Base): + name: str + short_name: str + type: str + +class Typedef(Base): + name: str + short_name: str + type: str + +class Declaration(Base): + kind: str + name: str + +class MemberFunction(Base): + func: str + self_type: str + member_name: str + self_index: int + +class MemberGlobal(Base): + global_name: str + self_type: str + member_name: str + +class File(Base): + constants: Dict[str, Constant] + types: Dict[str, Type] + structs: Dict[str, Struct] + enums: Dict[str, Enum] + enum_values: Dict[str, EnumValue] + functions: Dict[str, Function] + globals: Dict[str, Global] + typedefs: Dict[str, Typedef] + member_functions: Dict[str, MemberFunction] + member_globals: Dict[str, MemberGlobal] + declarations: List[Declaration] + element_types: List[str] + +def init_type(file, typ, key, mods): + name = typ["name"] + t = Type(base_name=name, key=key) + + if typ.get("kind", "") == "define": + t.kind = "define" + + if mods: + mods = mods[:] + + if mods[0]["type"] == "nullable": + for n in range(len(mods)): + if mods[n]["type"] == "pointer": + mods[n]["nullable"] = True + mods = mods[1:] + break + + if mods[0]["type"] == "const": + for n in range(len(mods)): + if mods[n]["type"] == "pointer": + mods[n]["const"] = True + mods = mods[1:] + break + + if mods: + mod = mods[-1] + mt = mod["type"] + mods = mods[:-1] + + if mt == "pointer": + t.kind = "pointer" + t.is_nullable = mod.get("nullable", False) + t.is_const = mod.get("const", False) + t.inner = parse_type_imp(file, typ, mods) + elif mt == "array": + length = eval_const(file, mod["length"]) + t.kind = "array" + t.array_length = length + t.inner = parse_type_imp(file, typ, mods) + elif mt == "function": + t.kind = "function" + t.func_args = [parse_argument(file, arg) for arg in mod["args"]] + t.inner = parse_type_imp(file, typ, mods) + elif mt == "const": + t.kind = "const" + t.inner = parse_type_imp(file, typ, mods) + elif mt == "unsafe": + t.kind = "unsafe" + t.inner = parse_type_imp(file, typ, mods) + else: + raise ValueError(f"Unhandled mod {mt}") + + return t + +def eval_const(file, expr): + if expr in file.constants: + return file.constants[expr].value_int + elif expr in file.enum_values: + return file.enum_values[expr].value + else: + return int(expr, base=0) + +def parse_type_imp(file, typ, mods): + key = typ["name"] + for mod in mods: + mt = mod["type"] + if mt == "pointer": + key = key + "*" + elif mt == "nullable": + key = key + "?" + elif mt == "unsafe": + key = key + " unsafe" + elif mt == "const": + key = key + " const" + elif mt == "array": + length = eval_const(file, mod["length"]) + key = key + f"[{length}]" + elif mt == "function": + args = [parse_type(file, a["type"]) for a in mod["args"]] + args_str = ",".join(args) + key = key + f"({args_str})" + else: + raise ValueError(f"Unhandled mod {mt}") + + if key not in file.types: + file.types[key] = init_type(file, typ, key, mods) + + return key + +def parse_type(file, typ, in_func=False): + mods = typ["mods"] + if in_func: + mods = [m for m in mods if m["type"] not in ("function", "inline", "abi")] + return parse_type_imp(file, typ, mods) + +def parse_field(file: File, st: Struct, decl, anon_path): + anon_id = 0 + + kind, name = decl["kind"], decl.get("name") + if kind == "group": + for inner in decl["decls"]: + parse_field(file, st, inner, anon_path) + elif kind == "struct": + anon_name = f"{anon_path}.{anon_id}" + anon_id += 1 + ast = Struct(name=anon_name) + ast.is_anonymous = True + at = Type(base_name=anon_name, key=anon_name) + at.kind = "struct" + file.types[anon_name] = at + file.structs[anon_name] = ast + if decl["structKind"] == "union": + ast.is_union = True + for inner in decl["decls"]: + parse_field(file, ast, inner, anon_name) + fd = Field(name="", type=anon_name) + st.fields.append(fd) + elif kind == "decl": + typ = parse_type(file, decl["type"]) + fd = Field(name=name, type=typ) + if name.startswith("_"): + fd.private = True + st.fields.append(fd) + +def postprocess_fields(file: File, st: Struct): + for field in st.fields: + tp = file.types[field.type] + if tp.kind == "array" and tp.inner == "char": + len_ix = find_index(st.fields, lambda f: f.name == field.name + "_length") + if len_ix >= 0: + field.kind = "inlineBuf" + st.fields[len_ix].kind = "inlineBufLength" + +def shorten_name(name: str, prefix: str): + for part in prefix.split("_"): + if name.lower().startswith(part.lower() + "_"): + name = name[len(part)+1:] + if prefix.lower().endswith("_flags") and name.lower().startswith("flag_"): + name = name[5:] + return name + +def shorten_global(name: str): + if name.lower().startswith("ufbx_"): + name = name[5:] + return name + +class EnumCtx: + def __init__(self): + self.next_value = 0 + self.hit_aux = False + +def parse_enum(file: File, en: Enum, decl, ctx): + kind, name = decl["kind"], decl.get("name") + if kind == "group": + for inner in decl["decls"]: + parse_enum(file, en, inner, ctx) + elif kind == "decl": + if name in ("UFBX_ELEMENT_TYPE_FIRST_ATTRIB"): + ctx.hit_aux = True + ev = EnumValue(name=name, flag=en.flag) + ev.short_name_raw = shorten_name(name, en.name) + ev.short_name = ev.short_name_raw + ev.auxiliary = ctx.hit_aux + if ev.short_name[0].isdigit(): + ev.short_name = "E" + ev.short_name + val = decl.get("value") + if val: + ev.value = eval_const(file, val) + else: + ev.value = ctx.next_value + ctx.next_value = ev.value + 1 + en.values.append(name) + file.enum_values[name] = ev + +def parse_argument(file: File, arg): + name = arg["name"] + typ = parse_type(file, arg["type"]) + return Argument(name=name, type=typ, kind="") + +def parse_func(file: File, decl): + name = decl["name"] + mods = decl["type"]["mods"] + func_mod = next(m for m in mods if m["type"] == "function") + + fn = Function(name=name) + fn.short_name = shorten_global(name) + fn.pretty_name = fn.short_name + if fn.pretty_name.endswith("_len"): + fn.pretty_name = fn.pretty_name[:-4] + fn.return_type = parse_type(file, decl["type"], in_func=True) + fn.is_inline = any(m for m in mods if m["type"] == "inline") + fn.arguments = [parse_argument(file, arg) for arg in func_mod["args"]] + + file.functions[name] = fn + file.declarations.append(Declaration(kind="function", name=name)) + +def parse_global(file: File, decl): + name = decl["name"] + + gl = Global(name=name) + gl.short_name = shorten_global(name) + gl.type = parse_type(file, decl["type"]) + file.globals[name] = gl + file.declarations.append(Declaration(kind="global", name=name)) + +def parse_typedef(file: File, decl): + name = decl["name"] + + td = Typedef(name=name) + td.short_name = shorten_global(name) + td.type = parse_type(file, decl["type"]) + file.typedefs[name] = td + file.declarations.append(Declaration(kind="typedef", name=name)) + + t = Type(name=name, base_name=name) + t.kind = "typedef" + t.key = name + t.inner = td.type + file.types[name] = t + +def parse_decl(file: File, decl): + kind, name = decl["kind"], decl.get("name") + if kind == "group": + for inner in decl["decls"]: + parse_decl(file, inner) + elif kind == "struct": + st = Struct(name=name) + st.short_name = shorten_global(name) + t = Type(base_name=name, key=name) + t.kind = "struct" + file.structs[name] = st + file.types[name] = t + file.declarations.append(Declaration(kind="struct", name=name)) + if decl.get("isList"): + st.is_list = True + for inner in decl["decls"]: + parse_field(file, st, inner, name) + elif kind == "enum": + en = Enum(name=name) + en.short_name = shorten_global(name) + t = Type(base_name=name, key=name) + t.kind = "enum" + + if name.endswith("_flags"): + en.flag = True + + file.enums[name] = en + file.types[name] = t + file.declarations.append(Declaration(kind="enum", name=name)) + ctx = EnumCtx() + for inner in decl["decls"]: + parse_enum(file, en, inner, ctx) + elif kind == "decl": + if decl["declKind"] == "typedef": + if decl["type"]["name"] != decl["name"]: + parse_typedef(file, decl) + elif decl["isFunction"]: + parse_func(file, decl) + elif decl["kind"] == "decl": + parse_global(file, decl) + elif kind == "enumType": + line = decl["line"] + enum_name = decl["enumName"] + last_value = decl["lastValue"] + count_name = decl["countName"] + en = file.enums.get(enum_name) + if not en: + raise RuntimeError(f"ufbx.h:{line}: UFBX_ENUM_TYPE() has undefined enum name {enum_name}") + max_value = max((file.enum_values[n] for n in en.values), key=lambda v: v.value) + if max_value.name != last_value: + if last_value in file.enum_values: + wrong_value = file.enum_values[last_value].value + else: + wrong_value = "(undefined)" + raise RuntimeError(f"ufbx.h:{line}: UFBX_ENUM_TYPE() has wrong highest value ({last_value} = {wrong_value}), actual highest value is ({max_value.name} = {max_value.value})") + count = max_value.value + 1 + file.constants[count_name] = Constant(name=count_name, value_int=count) + file.declarations.append(Declaration(kind="enumCount", name=count_name)) + +def parse_file(decls): + file = File() + + # HACK + file.constants["UFBX_ERROR_STACK_MAX_DEPTH"] = Constant(name="UFBX_ERROR_STACK_MAX_DEPTH", value_int=8) + file.constants["UFBX_PANIC_MESSAGE_LENGTH"] = Constant(name="UFBX_PANIC_MESSAGE_LENGTH", value_int=128) + file.constants["UFBX_ERROR_INFO_LENGTH"] = Constant(name="UFBX_ERROR_INFO_LENGTH", value_int=256) + + for decl in decls: + parse_decl(file, decl) + return file + +class Arch: + def __init__(self, name, sizes): + self.name = name + self.sizes = sizes + +sizes_base = { + "void": 0, + "char": 1, + "bool": 1, + "uint8_t": 1, + "int8_t": 1, + "uint16_t": 2, + "int16_t": 2, + "uint32_t": 4, + "int32_t": 4, + "uint64_t": 4, + "int64_t": 4, + "float": 4, + "double": 8, + "enum": 4, +} + +sizes_32bit = { + **sizes_base, + "size_t": 4, + "ptrdiff_t": 4, + "*": 4, +} + +sizes_64bit = { + **sizes_base, + "size_t": 8, + "ptrdiff_t": 8, + "*": 8, +} + +archs = [ + Arch("x86", sizes_32bit), + Arch("x64", sizes_64bit), + Arch("wasm", sizes_32bit), +] + +def layout_struct(arch: Arch, file: File, typ: Type, st: Struct): + offset = 0 + align = 0 + union_size = 0 + for field in st.fields: + field_type = file.types[field.type] + layout_type(arch, file, field_type) + field_size = field_type.size[arch.name] + field_align = field_type.align[arch.name] + + align = max(align, field_align) + while offset % field_align != 0: + offset += 1 + + field.offset[arch.name] = offset + + if st.is_union: + union_size = max(union_size, field_size) + else: + offset += field_size + + while offset % align != 0: + offset += 1 + + if st.is_union: + offset = union_size + for field in st.fields: + field_type = file.types[field.type] + field_size = field_type.size[arch.name] + if field_size == union_size: + field.union_sized[arch.name] = True + + typ.size[arch.name] = offset + typ.align[arch.name] = align + +def layout_type(arch: Arch, file: File, typ: Type): + if arch.name in typ.size: + return + + if typ.kind == "pointer": + size = arch.sizes["*"] + typ.size[arch.name] = size + typ.align[arch.name] = size + elif typ.kind == "": + size = arch.sizes[typ.base_name] + typ.size[arch.name] = size + typ.align[arch.name] = size + elif typ.kind == "enum": + size = arch.sizes["enum"] + typ.size[arch.name] = size + typ.align[arch.name] = size + elif typ.kind == "typedef": + inner = file.types[typ.inner] + layout_type(arch, file, inner) + typ.size[arch.name] = inner.size[arch.name] + typ.align[arch.name] = inner.align[arch.name] + elif typ.kind in ("const", "unsafe"): + inner = file.types[typ.inner] + layout_type(arch, file, inner) + typ.size[arch.name] = inner.size[arch.name] + typ.align[arch.name] = inner.align[arch.name] + elif typ.kind == "struct": + st = file.structs[typ.base_name] + layout_struct(arch, file, typ, st) + elif typ.kind == "array": + inner = file.types[typ.inner] + layout_type(arch, file, inner) + typ.size[arch.name] = inner.size[arch.name] * typ.array_length + typ.align[arch.name] = inner.align[arch.name] + elif typ.kind == "function": + inner = file.types[typ.inner] + layout_type(arch, file, inner) + typ.size[arch.name] = 0 + typ.align[arch.name] = 0 + elif typ.kind == "define": + typ.size[arch.name] = 0 + typ.align[arch.name] = 0 + else: + raise ValueError(f"Unhandled type kind: {typ.kind}") + +def layout_file(arch: Arch, file: File): + for typ in file.types.values(): + layout_type(arch, file, typ) + +def to_pascal(name_snake): + parts = name_snake.lower().split("_") + for n in range(0, len(parts)): + parts[n] = parts[n].title() + return "".join(parts) + +def to_camel(name_snake): + parts = name_snake.lower().split("_") + for n in range(1, len(parts)): + parts[n] = parts[n].title() + return "".join(parts) + +prim_types = { + "bool", + "int8_t", + "uint8_t", + "int16_t", + "uint16_t", + "int32_t", + "uint32_t", + "int64_t", + "uint64_t", + "size_t", + "float", + "double", +} + +pod_types = { + *prim_types, +} + +ref_types = { + "ufbx_scene", + "ufbx_element", + "ufbx_anim", + "ufbx_props", + "ufbx_vertex_real", + "ufbx_vertex_vec2", + "ufbx_vertex_vec3", + "ufbx_vertex_vec4", + "ufbx_geometry_cache", + "ufbx_cache_channel", + "ufbx_cache_frame", + "ufbx_texture_file", +} + +pod_structs = [ + "ufbx_vec2", + "ufbx_vec3", + "ufbx_vec4", + "ufbx_quat", + "ufbx_matrix", + "ufbx_transform", + "ufbx_edge", + "ufbx_face", + "ufbx_lod_level", + "ufbx_skin_vertex", + "ufbx_skin_weight", + "ufbx_tangent", + "ufbx_keyframe", + "ufbx_curve_point", + "ufbx_surface_point", + "ufbx_topo_edge", + "ufbx_coordinate_axes", +] + +input_structs = [ + "ufbx_allocator_opts", + "ufbx_open_memory_opts", + "ufbx_load_opts", + "ufbx_evaluate_opts", + "ufbx_tessellate_curve_opts", + "ufbx_tessellate_surface_opts", + "ufbx_subdivide_opts", + "ufbx_geometry_cache_opts", + "ufbx_geometry_cache_data_opts", +] + +interface_structs = [ + "ufbx_allocator", + "ufbx_stream", +] + +union_prefer = { + "ufbx_vec2.0": 0, + "ufbx_vec3.0": 0, + "ufbx_vec4.0": 0, + "ufbx_quat.0": 0, + "ufbx_matrix.0": 0, + "ufbx_scene.0": 0, +} + +member_functions = [ + MemberFunction(func="ufbx_find_prop_len", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_prop", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_real_len", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_real", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_vec3_len", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_vec3", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_int_len", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_int", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_bool_len", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_bool", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_string_len", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_string", self_type="ufbx_props"), + MemberFunction(func="ufbx_find_element_len", self_type="ufbx_scene"), + MemberFunction(func="ufbx_find_element", self_type="ufbx_scene"), + MemberFunction(func="ufbx_find_node_len", self_type="ufbx_scene"), + MemberFunction(func="ufbx_find_node", self_type="ufbx_scene"), + MemberFunction(func="ufbx_find_anim_stack_len", self_type="ufbx_scene"), + MemberFunction(func="ufbx_find_anim_stack", self_type="ufbx_scene"), + MemberFunction(func="ufbx_find_anim_prop_len", self_type="ufbx_anim_layer"), + MemberFunction(func="ufbx_find_anim_prop", self_type="ufbx_anim_layer"), + MemberFunction(func="ufbx_find_anim_props", self_type="ufbx_anim_layer"), + MemberFunction(func="ufbx_get_compatible_matrix_for_normals", self_type="ufbx_node"), + MemberFunction(func="ufbx_evaluate_curve", self_type="ufbx_anim_curve", member_name="evaluate"), + MemberFunction(func="ufbx_evaluate_anim_value_real", self_type="ufbx_anim_value", member_name="evaluate_real"), + MemberFunction(func="ufbx_evaluate_anim_value_vec2", self_type="ufbx_anim_value", member_name="evaluate_vec2"), + MemberFunction(func="ufbx_evaluate_anim_value_vec3", self_type="ufbx_anim_value", member_name="evaluate_vec3"), + MemberFunction(func="ufbx_evaluate_transform", self_type="ufbx_node"), + MemberFunction(func="ufbx_evaluate_blend_weight", self_type="ufbx_blend_channel"), + MemberFunction(func="ufbx_evaluate_scene", self_type="ufbx_scene", member_name="evaluate"), + MemberFunction(func="ufbx_find_prop_texture_len", self_type="ufbx_material"), + MemberFunction(func="ufbx_find_prop_texture", self_type="ufbx_material"), + MemberFunction(func="ufbx_find_shader_prop_len", self_type="ufbx_shader"), + MemberFunction(func="ufbx_find_shader_prop", self_type="ufbx_shader"), + MemberFunction(func="ufbx_catch_get_skin_vertex_matrix", self_type="ufbx_skin_deformer"), + MemberFunction(func="ufbx_get_skin_vertex_matrix", self_type="ufbx_skin_deformer"), + MemberFunction(func="ufbx_get_blend_shape_vertex_offset", self_type="ufbx_blend_shape", member_name="get_vertex_offset"), + MemberFunction(func="ufbx_get_blend_vertex_offset", self_type="ufbx_blend_deformer", member_name="get_vertex_offset"), + MemberFunction(func="ufbx_add_blend_shape_vertex_offsets", self_type="ufbx_blend_shape", member_name="add_vertex_offsets"), + MemberFunction(func="ufbx_add_blend_vertex_offsets", self_type="ufbx_blend_deformer", member_name="add_vertex_offsets"), + MemberFunction(func="ufbx_evaluate_nurbs_basis", self_type="ufbx_nurbs_basis", member_name="evaluate"), + MemberFunction(func="ufbx_evaluate_nurbs_curve", self_type="ufbx_nurbs_curve", member_name="evaluate"), + MemberFunction(func="ufbx_evaluate_nurbs_surface", self_type="ufbx_nurbs_surface", member_name="evaluate"), + MemberFunction(func="ufbx_tessellate_nurbs_curve", self_type="ufbx_nurbs_curve", member_name="tessellate"), + MemberFunction(func="ufbx_tessellate_nurbs_surface", self_type="ufbx_nurbs_surface", member_name="tessellate"), + MemberFunction(func="ufbx_catch_triangulate_face", self_type="ufbx_mesh"), + MemberFunction(func="ufbx_triangulate_face", self_type="ufbx_mesh"), + MemberFunction(func="ufbx_subdivide_mesh", self_type="ufbx_mesh", member_name="subdivide"), + MemberFunction(func="ufbx_read_geometry_cache_real", self_type="ufbx_cache_frame", member_name="read_real"), + MemberFunction(func="ufbx_sample_geometry_cache_real", self_type="ufbx_cache_channel", member_name="sample_real"), + MemberFunction(func="ufbx_read_geometry_cache_vec3", self_type="ufbx_cache_frame", member_name="read_vec3"), + MemberFunction(func="ufbx_sample_geometry_cache_vec3", self_type="ufbx_cache_channel", member_name="sample_vec3"), +] + +member_globals = [ + MemberGlobal(global_name="ufbx_empty_string", self_type="ufbx_string", member_name="empty"), + MemberGlobal(global_name="ufbx_empty_blob", self_type="ufbx_blob", member_name="empty"), + MemberGlobal(global_name="ufbx_identity_matrix", self_type="ufbx_matrix", member_name="identity"), + MemberGlobal(global_name="ufbx_identity_transform", self_type="ufbx_transform", member_name="identity"), + MemberGlobal(global_name="ufbx_zero_vec2", self_type="ufbx_vec2", member_name="zero"), + MemberGlobal(global_name="ufbx_zero_vec3", self_type="ufbx_vec3", member_name="zero"), + MemberGlobal(global_name="ufbx_zero_vec4", self_type="ufbx_vec4", member_name="zero"), + MemberGlobal(global_name="ufbx_identity_quat", self_type="ufbx_quat", member_name="identity"), + MemberGlobal(global_name="ufbx_axes_right_handed_y_up", self_type="ufbx_coordinate_axes", member_name="right_handed_y_up"), + MemberGlobal(global_name="ufbx_axes_right_handed_z_up", self_type="ufbx_coordinate_axes", member_name="right_handed_z_up"), + MemberGlobal(global_name="ufbx_axes_left_handed_y_up", self_type="ufbx_coordinate_axes", member_name="left_handed_y_up"), + MemberGlobal(global_name="ufbx_axes_left_handed_z_up", self_type="ufbx_coordinate_axes", member_name="left_handed_z_up"), +] + +def find_index(list, predicate): + for i,v in enumerate(list): + if predicate(v): + return i + return -1 + +if __name__ == "__main__": + src_path = os.path.dirname(os.path.realpath(__file__)) + path = os.path.join(src_path, "build", "ufbx.json") + with open(path, "rt") as f: + js = json.load(f) + file = parse_file(js) + + for name in file.enums["ufbx_element_type"].values: + ev = file.enum_values[name] + if ev.auxiliary: continue + name = name.lower().replace("ufbx_element_", "ufbx_") + st = file.structs[name] + st.is_element = True + file.element_types.append(name) + ref_types.add(name) + + file.structs["ufbx_vertex_real"].vertex_attrib_type = "ufbx_real" + file.structs["ufbx_vertex_vec2"].vertex_attrib_type = "ufbx_vec2" + file.structs["ufbx_vertex_vec3"].vertex_attrib_type = "ufbx_vec3" + file.structs["ufbx_vertex_vec4"].vertex_attrib_type = "ufbx_vec4" + + for pod in pod_structs: + file.structs[pod].is_pod = True + + for inp in input_structs: + file.structs[inp].is_input = True + + for inp in interface_structs: + file.structs[inp].is_interface = True + + for st in file.structs.values(): + if st.name.endswith("_cb"): + st.is_callback = True + + for name, index in union_prefer.items(): + st = file.structs[name] + st.fields[index].union_preferred = True + + for st in file.structs.values(): + if not st.is_union: continue + if any(f.union_preferred for f in st.fields): continue + st.fields[-1].union_preferred = True + + for typ in file.types.values(): + if typ.kind == "struct": + st = file.structs[typ.base_name] + if st.is_pod: + typ.is_pod = True + elif typ.kind == "": + if typ.base_name in pod_types: + typ.is_pod = True + + for typ in file.types.values(): + if typ.kind == "function": + typ.is_function = True + + for typ in file.types.values(): + if typ.kind == "typedef": + inner = file.types[typ.inner] + if inner.is_pod: + typ.is_pod = True + if inner.is_function: + typ.is_function = True + + for typ in file.types.values(): + if typ.kind == "pointer": + inner = file.types[typ.inner] + if inner.is_function: + typ.is_function = True + + for st in file.structs.values(): + postprocess_fields(file, st) + + for func in file.functions.values(): + for index, arg in enumerate(func.arguments): + if arg.kind: continue + if arg.type == "char const*": + len_name = arg.name + "_len" + len_index = find_index(func.arguments, lambda a: a.name == len_name) + if len_index >= 0: + arg.kind = "stringPointer" + func.arguments[len_index].kind = "stringLength" + sa = StringArgument(name=arg.name, pointer_index=index, len_index=len_index) + func.string_arguments.append(sa) + continue + + typ = file.types[arg.type] + if arg.name == "retval": + arg.is_return = True + assert typ.kind == "pointer" + inner = file.types[typ.inner] + if inner.is_pod: + arg.kind = "pod" + func.return_kind = "pod" + elif typ.kind == "pointer": + inner = file.types[typ.inner] + + num_name = "num_" + arg.name + num_index = find_index(func.arguments, lambda a: a.name == num_name) + + size_name = arg.name + "_size" + size_index = find_index(func.arguments, lambda a: a.name == size_name) + + if num_index < 0 and inner.key == "char": + num_index = size_index + + if num_index >= 0: + arg.kind = "arrayPointer" + func.arguments[num_index].kind = "arrayLength" + aa = ArrayArgument(name=arg.name, pointer_index=index, num_index=num_index) + func.array_arguments.append(aa) + elif size_index >= 0 and inner.key == "void": + arg.kind = "blobPointer" + func.arguments[size_index].kind = "blobSize" + ba = BlobArgument(name=arg.name, pointer_index=index, size_index=size_index) + func.blob_arguments.append(ba) + elif typ.is_const and inner.is_pod: + arg.by_ref = True + arg.kind = "pod" + elif typ.is_const and inner.key in input_structs: + arg.by_ref = True + arg.kind = "input" + elif not typ.is_const and inner.key == "ufbx_error": + arg.by_ref = True + arg.kind = "error" + func.has_error = True + elif not typ.is_const and inner.key == "ufbx_panic": + arg.by_ref = True + arg.kind = "panic" + func.has_panic = True + elif typ.is_const and inner.key == "ufbx_stream": + arg.by_ref = True + arg.kind = "stream" + elif typ.is_const and inner.key in ref_types: + arg.kind = "ref" + elif typ.is_pod: + if arg.type in prim_types: + arg.kind = "prim" + else: + arg.kind = "pod" + elif typ.kind == "enum": + arg.kind = "enum" + + rtyp = file.types[func.return_type] + if rtyp.kind == "enum": + func.return_kind = "enum" + elif func.return_type in prim_types: + func.return_kind = "prim" + elif rtyp.kind == "pointer": + inner = file.types[rtyp.inner] + if inner.key in ref_types: + func.return_kind = "ref" + + for func in file.functions.values(): + for index, arg in enumerate(func.arguments): + if arg.name == "retval": continue + typ = file.types[arg.type] + if typ.base_name in file.element_types: + arg.return_ref = True + if typ.base_name in { "ufbx_scene", "ufbx_anim", "ufbx_element", "ufbx_geometry_cache", "ufbx_props" }: + arg.return_ref = True + if len(func.arguments) == 1 and func.arguments[0].type == "void": + func.arguments.clear() + + for func in file.functions.values(): + if "_ffi_" in func.name: + func.is_ffi = True + non_ffi = func.name.replace("_ffi_", "_", 1) + file.functions[non_ffi].ffi_name = func.name + elif "_catch_" in func.name: + func.is_catch = True + non_catch = func.name.replace("_catch_", "_", 1) + file.functions[non_catch].catch_name = func.name + elif func.name.endswith("_len"): + func.is_len = True + non_len = func.name[:-4] + file.functions[non_len].len_name = func.name + + file.functions["ufbx_load_file"].alloc_type = "scene" + file.functions["ufbx_load_file_len"].alloc_type = "scene" + file.functions["ufbx_load_memory"].alloc_type = "scene" + file.functions["ufbx_load_stream"].alloc_type = "scene" + file.functions["ufbx_load_stream_prefix"].alloc_type = "scene" + file.functions["ufbx_load_stdio"].alloc_type = "scene" + file.functions["ufbx_load_stdio_prefix"].alloc_type = "scene" + file.functions["ufbx_evaluate_scene"].alloc_type = "scene" + file.functions["ufbx_subdivide_mesh"].alloc_type = "mesh" + file.functions["ufbx_tessellate_nurbs_curve"].alloc_type = "line" + file.functions["ufbx_tessellate_nurbs_surface"].alloc_type = "mesh" + file.functions["ufbx_load_geometry_cache"].alloc_type = "geometryCache" + file.functions["ufbx_load_geometry_cache_len"].alloc_type = "geometryCache" + + file.functions["ufbx_free_scene"].kind = "free" + file.functions["ufbx_free_mesh"].kind = "free" + file.functions["ufbx_free_line_curve"].kind = "free" + file.functions["ufbx_free_geometry_cache"].kind = "free" + + file.functions["ufbx_retain_scene"].kind = "retain" + file.functions["ufbx_retain_mesh"].kind = "retain" + file.functions["ufbx_retain_line_curve"].kind = "retain" + file.functions["ufbx_retain_geometry_cache"].kind = "retain" + + file.functions["ufbx_triangulate_face"].return_array_scale = 3 + file.functions["ufbx_ffi_triangulate_face"].return_array_scale = 3 + file.functions["ufbx_read_geometry_cache_real"].return_array_scale = 1 + file.functions["ufbx_sample_geometry_cache_real"].return_array_scale = 1 + file.functions["ufbx_read_geometry_cache_vec3"].return_array_scale = 1 + file.functions["ufbx_sample_geometry_cache_vec3"].return_array_scale = 1 + + for func in file.functions.values(): + t = file.types[func.return_type] + if t.kind == "pointer" and not func.alloc_type: + func.nullable_return = True + + for mf in member_functions: + if not mf.member_name: + mf.member_name = mf.func.replace("ufbx_", "") + fn = file.functions[mf.func] + + self_index = -1 + for ix, arg in enumerate(fn.arguments): + t = file.types[arg.type] + while t.inner: + t = file.types[t.inner] + if t.base_name == mf.self_type: + self_index = ix + if self_index < 0: + raise RuntimeError(f"Could not find self ({mf.self_type}) for member {mf.func}") + mf.self_index = self_index + + file.structs[mf.self_type].member_functions.append(mf.func) + + file.member_functions[mf.func] = mf + + for mg in member_globals: + file.structs[mg.self_type].member_globals.append(mg.global_name) + file.member_globals[mg.global_name] = mg + + allow_missing_enum_count = ["ufbx_progress_result"] + for en in file.enums.values(): + if en.flag: continue + if en.name in allow_missing_enum_count: continue + count_name = en.name.upper() + "_COUNT" + if count_name not in file.constants: + raise RuntimeError(f"enum {en.name} is missing UFBX_ENUM_TYPE()") + + for arch in archs: + layout_file(arch, file) + + path_dst = os.path.join(src_path, "build", "ufbx_typed.json") + with open(path_dst, "wt") as f: + json.dump(to_json(file), f, indent=2) diff --git a/modules/ufbx/bindgen/ufbx_parser.py b/modules/ufbx/bindgen/ufbx_parser.py new file mode 100644 index 0000000..8e24b8a --- /dev/null +++ b/modules/ufbx/bindgen/ufbx_parser.py @@ -0,0 +1,804 @@ +import parsette +import string +from typing import List, Optional, NamedTuple, Union +import json +import argparse +import os +import re + +lexer = parsette.Lexer() + +lexer.ignore_whitespace() + +TEnd = parsette.End +TIdent = lexer.rule("identifier", r"[A-Za-z_][A-Za-z0-9_]*", prefix=string.ascii_letters+"_") +TNumber = lexer.rule("number", r"(0[Xx][0-9A-Fa-f]+)|([0-9]+)", prefix=string.digits) +TComment = lexer.rule("comment", r"//[^\r\n]*", prefix="/") +TPreproc = lexer.rule("preproc", r"#[^\n\\]*(\\\r?\n[^\n\\]*?)*\n", prefix="#") +TString = lexer.rule("string", r"\"[^\"]*\"", prefix="\"") +lexer.literals(*"const typedef struct union enum extern ufbx_abi ufbx_inline ufbx_nullable ufbx_abi ufbx_unsafe UFBX_LIST_TYPE UFBX_ENUM_REPR UFBX_FLAG_REPR UFBX_ENUM_FORCE_WIDTH UFBX_FLAG_FORCE_WIDTH UFBX_ENUM_TYPE".split()) +lexer.literals(*",.*[]{}()<>=-;") +lexer.ignore("disable", re.compile(r"//\s*bindgen-disable.*?//\s*bindgen-enable", flags=re.DOTALL)) + +Token = parsette.Token +Ast = parsette.Ast + +class AType(Ast): + pass + +class AName(Ast): + pass + +class ATop(Ast): + pass + +class AStructDecl(Ast): + pass + +class AEnumDecl(Ast): + pass + +class ADecl(Ast): + type: AType + names: List[AName] + end_line: Optional[int] = None + +class ANamePointer(AName): + inner: AName + +class ANameArray(AName): + inner: AName + length: Optional[Token] + +class ANameIdent(AName): + ident: Token + +class ANameFunction(AName): + inner: AName + args: List[ADecl] + +class ANameAnonymous(AName): + pass + +class ATypeConst(AType): + inner: AType + +class ATypeSpec(AType): + inner: AType + spec: Token + +class ATypeIdent(AType): + name: Token + +class ATypeStruct(AType): + kind: Token + name: Optional[Token] + decls: Optional[List[AStructDecl]] + +class ATypeEnum(AType): + kind: Token + name: Optional[Token] + decls: Optional[List[AEnumDecl]] + +class AStructComment(AStructDecl): + comments: List[Token] + +class AStructField(AStructDecl): + decl: ADecl + +class AEnumComment(AEnumDecl): + comments: List[Token] + +class AEnumValue(AEnumDecl): + name: Token + value: Optional[Token] + +class ATopPreproc(ATop): + preproc: Token + +class ATopComment(ATop): + comments: List[Token] + +class ATopDecl(ATop): + decl: ADecl + +class ATopExtern(ATop): + decl: ADecl + +class ATopTypedef(ATop): + decl: ADecl + +class ATopFile(ATop): + tops: List[ATop] + +class ATopList(ATop): + name: Token + type: ADecl + +class ATopEnumType(ATop): + enum_type: Token + prefix: Token + last_value: Token + +class Parser(parsette.Parser): + def __init__(self, source, filename=""): + super().__init__(lexer, source, filename) + + def finish_comment(self, comment_type, first): + comments = [first] + line = first.location.line + 1 + while self.peek(TComment) and self.token.location.line == line: + comments.append(self.scan()) + line += 1 + return comment_type(comments) + + def accept_impl(self) -> bool: + if self.token.rule != TIdent: return False + text = self.token.text() + if not text.startswith("UFBX_"): return False + if not text.endswith("_IMPL"): return False + self.scan() + return True + + def finish_struct(self, kind) -> ATypeStruct: + kn = kind.text() + name = self.accept(TIdent) + if self.accept("{"): + fields = [] + loc = name if name else kind + with self.hint(loc, f"{kn} {name.text()}" if name else f"anonymous {kn}"): + while not self.accept("}"): + if self.accept(TComment): + fields.append(self.finish_comment(AStructComment, self.prev_token)) + elif self.accept_impl(): + self.require("(", "for macro parameters") + self.finish_macro_params() + else: + decl = self.parse_decl(f"{kn} field") + field = AStructField(decl) + fields.append(field) + self.require(";", f"after {kn} field") + else: + fields = None + return ATypeStruct(kind, name, fields) + + def parse_enum_decl(self) -> AEnumDecl: + if self.accept(TComment): + return self.finish_comment(AEnumComment, self.prev_token) + else: + name = self.require(TIdent, "enum value name") + value = None + if self.accept("="): + value = self.require([TIdent, TNumber], f"'{name.text()}' value") + return AEnumValue(name, value) + + def finish_enum(self, kind) -> ATypeStruct: + kn = kind.text() + name = self.accept(TIdent) + self.require(["UFBX_ENUM_REPR", "UFBX_FLAG_REPR"], "enum repr macro") + if self.accept("{"): + decls = [] + loc = name if name else kind + has_force_width = False + with self.hint(loc, f"{kn} {name.text()}" if name else f"anonymous {kn}"): + while not self.accept("}"): + if self.accept(","): + continue + if self.accept(["UFBX_ENUM_FORCE_WIDTH", "UFBX_FLAG_FORCE_WIDTH"]): + self.require("(", "for FORCE_WIDTH macro parameters") + self.require(TIdent, "for FORCE_WIDTH macro name") + self.require(")", "for FORCE_WIDTH macro parameters") + has_force_width = True + continue + decls.append(self.parse_enum_decl()) + if not has_force_width: + self.fail_at(self.prev_token, "enum missing FORCE_WIDTH macro") + else: + decls = None + return ATypeEnum(kind, name, decls) + + def parse_type(self) -> AType: + token = self.token + if self.accept("const"): + inner = self.parse_type() + return ATypeConst(inner) + elif self.accept(["ufbx_nullable", "ufbx_abi", "ufbx_unsafe", "ufbx_inline"]): + inner = self.parse_type() + return ATypeSpec(inner, token) + elif self.accept(["struct", "union"]): + return self.finish_struct(self.prev_token) + elif self.accept("enum"): + return self.finish_enum(self.prev_token) + elif self.accept(TIdent): + return ATypeIdent(self.prev_token) + else: + self.fail_got("expected a type") + + def parse_name_non_array(self, ctx, allow_anonymous=False) -> AName: + if self.accept("*"): + inner = self.parse_name_non_array(ctx, allow_anonymous) + return ANamePointer(inner) + if allow_anonymous and not self.peek(TIdent): + return ANameAnonymous() + else: + name = self.require(TIdent, f"for {ctx} name") + return ANameIdent(name) + + def parse_name(self, ctx, allow_anonymous=False) -> AName: + ast = self.parse_name_non_array(ctx, allow_anonymous) + + while True: + if self.accept("["): + length = self.accept([TIdent, TNumber]) + self.require("]", f"for opening [") + ast = ANameArray(ast, length) + elif self.accept("("): + args = [] + while not self.accept(")"): + args.append(self.parse_decl("argument", allow_list=False, allow_anonymous=True)) + self.accept(",") + ast = ANameFunction(ast, args) + else: + break + return ast + + def parse_decl(self, ctx, allow_anonymous=False, allow_list=True) -> ADecl: + typ = self.parse_type() + names = [] + if not self.peek(";"): + if allow_list: + for _ in self.sep(","): + names.append(self.parse_name(ctx, allow_anonymous)) + else: + names.append(self.parse_name(ctx, allow_anonymous)) + return ADecl(typ, names) + + def finish_top_list(self) -> ATopList: + self.require("(", "for macro parameters") + name = self.require(TIdent, "for list type name") + self.require(",", "for macro parameters") + decl = self.parse_decl("UFBX_TOP_LIST type", allow_anonymous=True, allow_list=False) + self.require(")", "for macro parameters") + return ATopList(name, decl) + + def finish_top_enum_type(self) -> ATopEnumType: + self.require("(", "for macro parameters") + enum_name = self.require(TIdent, "for enum type name") + self.require(",", "for macro parameters") + prefix = self.require(TIdent, "for enum prefix") + self.require(",", "for macro parameters") + last_value = self.require(TIdent, "for enum last value") + self.require(")", "for macro parameters") + return ATopEnumType(enum_name, prefix, last_value) + + def finish_macro_params(self): + while not self.accept(")"): + if self.accept(TEnd): self.fail("Unclosed macro parameters") + if self.accept("("): + self.finish_macro_params() + else: + self.scan() + + def parse_top(self) -> List[ATop]: + if self.accept(TPreproc): + return [ATopPreproc(self.prev_token)] + elif self.accept(TComment): + return [self.finish_comment(ATopComment, self.prev_token)] + elif self.accept("typedef"): + decl = self.parse_decl("typedef") + self.require(";", "after typedef") + decl.end_line = self.prev_token.location.line + return [ATopTypedef(decl)] + elif self.accept("extern"): + if self.accept(TString): + self.require("{", "for extern ABI block") + tops = [] + while not self.accept("}"): + tops += self.parse_top() + return tops + else: + decl = self.parse_decl("extern") + self.require(";", "after extern") + decl.end_line = self.prev_token.location.line + return [ATopExtern(decl)] + elif self.accept("UFBX_LIST_TYPE"): + tl = self.finish_top_list() + self.require(";", "after UFBX_LIST_TYPE()") + return [tl] + elif self.accept("UFBX_ENUM_TYPE"): + tl = self.finish_top_enum_type() + self.require(";", "after UFBX_ENUM_TYPE()") + return [tl] + else: + decl = self.parse_decl("top-level") + if self.accept("{"): + level = 1 + while level > 0: + if self.accept("{"): + level += 1 + elif self.accept("}"): + level -= 1 + else: + self.scan() + decl.end_line = self.prev_token.location.line + else: + self.require(";", "after top-level declaration") + decl.end_line = self.prev_token.location.line + return [ATopDecl(decl)] + + def parse_top_file(self) -> ATopFile: + tops = [] + while not self.accept(parsette.End): + if self.ignore(TEnd): continue + tops += self.parse_top() + return ATopFile(tops) + +def fmt_type(type: AType): + if isinstance(type, ATypeIdent): + return type.name.text() + elif isinstance(type, ATypeConst): + return f"const {fmt_type(type.inner)}" + elif isinstance(type, ATypeSpec): + return f"{type.spec.text()} {fmt_type(type.inner)}" + +class SMod: pass +class SModConst(SMod): pass +class SModNullable(SMod): pass +class SModInline(SMod): pass +class SModAbi(SMod): pass +class SModUnsafe(SMod): pass +class SModPointer(SMod): pass +class SModArray(SMod): + def __init__(self, length: Optional[str]): + self.length = length +class SModFunction(SMod): + def __init__(self, args: List["SDecl"]): + self.args = args + +class SComment(NamedTuple): + line_begin: int + line_end: int + text: List[str] + +class SType(NamedTuple): + kind: str + name: Optional[str] + mods: List[SMod] = [] + body: Union["SStruct", "SEnum", "SEnumType", None] = None + +class SName(NamedTuple): + name: Optional[str] + type: SType + value: Optional[str] = None + +class SDecl(NamedTuple): + line_begin: int + line_end: int + kind: str + names: List[SName] + comment: Optional[SComment] = None + comment_inline: bool = False + is_function: bool = False + define_args: Optional[List[str]] = None + value: Optional[str] = None + +class SDeclGroup(NamedTuple): + line: int + decls: List[SDecl] + comment: Optional[SComment] = None + comment_inline: bool = False + is_function: bool = False + +SCommentDecl = Union[SComment, SDecl, SDeclGroup] + +class SStruct(NamedTuple): + line: int + kind: str + name: Optional[str] + decls: List[SCommentDecl] + is_list: bool = False + +class SEnum(NamedTuple): + line: int + name: Optional[str] + decls: List[SCommentDecl] + +class SEnumType(NamedTuple): + line: int + enum_name: str + enum_prefix: str + last_value: str + +def type_line(typ: AType): + if isinstance(typ, ATypeIdent): + return typ.name.location.line + elif isinstance(typ, ATypeConst): + return type_line(typ.inner) + elif isinstance(typ, ATypeStruct): + return typ.kind.location.line + elif isinstance(typ, ATypeEnum): + return typ.kind.location.line + elif isinstance(typ, ATypeSpec): + return type_line(typ.inner) + else: + raise TypeError(f"Unhandled type {type(typ).__name__}") + +spec_to_mod = { + "ufbx_abi": SModAbi, + "ufbx_nullable": SModNullable, + "ufbx_inline": SModInline, + "ufbx_unsafe": SModUnsafe, +} + +def to_stype(typ: AType) -> SType: + if isinstance(typ, ATypeIdent): + return SType("name", typ.name.text()) + elif isinstance(typ, ATypeConst): + st = to_stype(typ.inner) + return st._replace(mods=st.mods + [SModConst()]) + elif isinstance(typ, ATypeSpec): + st = to_stype(typ.inner) + spec = typ.spec.text() + return st._replace(mods=st.mods + [spec_to_mod[spec]()]) + elif isinstance(typ, ATypeStruct): + body = to_sstruct(typ) if typ.decls is not None else None + return SType(typ.kind.text(), typ.name.text() if typ.name else None, body=body) + elif isinstance(typ, ATypeEnum): + body = to_senum(typ) if typ.decls is not None else None + return SType("enum", typ.name.text() if typ.name else None, body=body) + else: + raise TypeError(f"Unhandled type {type(typ).__name__}") + +def name_to_stype(base: SType, name: AName) -> SType: + if isinstance(name, ANamePointer): + st = name_to_stype(base, name.inner) + return st._replace(mods=st.mods + [SModPointer()]) + elif isinstance(name, ANameArray): + st = name_to_stype(base, name.inner) + mod = SModArray(name.length.text() if name.length else None) + return st._replace(mods=st.mods + [mod]) + elif isinstance(name, ANameFunction): + st = name_to_stype(base, name.inner) + mod = SModFunction([to_sdecl(a, "argument") for a in name.args]) + return st._replace(mods=st.mods + [mod]) + elif isinstance(name, ANameIdent): + return base + elif isinstance(name, ANameAnonymous): + return base + else: + raise TypeError(f"Unhandled type {type(name)}") + +def name_str(name: AName): + if isinstance(name, ANameIdent): + return name.ident.text() + elif isinstance(name, ANameAnonymous): + return None + elif isinstance(name, ANamePointer): + return name_str(name.inner) + elif isinstance(name, ANameArray): + return name_str(name.inner) + elif isinstance(name, ANameFunction): + return name_str(name.inner) + else: + raise TypeError(f"Unhandled type {type(name)}") + +def to_sdecl(decl: ADecl, kind: str) -> SDecl: + names = [] + is_function = False + base_st = to_stype(decl.type) + for name in decl.names: + st = name_to_stype(base_st, name) + if any(isinstance(mod, SModFunction) for mod in st.mods): + is_function = True + names.append(SName(name_str(name), st)) + if not decl.names: + names.append(SName(None, base_st)) + line = type_line(decl.type) + end_line = decl.end_line + if end_line is None: end_line = line + return SDecl(line, end_line, kind, names, is_function=is_function) + +Comment = List[str] + +def to_scomment(comment: Ast): + if not comment: return None + begin = comment.comments[0].location.line + end = comment.comments[-1].location.line + text = [c.text()[3:] for c in comment.comments] + return SComment(begin, end, text) + +def to_sstruct(struct: ATypeStruct) -> SStruct: + decls = [] + + for decl in struct.decls: + if isinstance(decl, AStructComment): + decls.append(to_scomment(decl)) + elif isinstance(decl, AStructField): + decls.append(to_sdecl(decl.decl, "field")) + + line = struct.kind.location.line + name = struct.name.text() if struct.name else None + kind = struct.kind.text() + return SStruct(line, kind, name, decls) + +def to_senum(enum: ATypeEnum) -> SEnum: + decls = [] + name = enum.name.text() if enum.name else None + + for decl in enum.decls: + if isinstance(decl, AEnumComment): + decls.append(to_scomment(decl)) + elif isinstance(decl, AEnumValue): + line = decl.name.location.line + decls.append(SDecl( + line_begin=line, + line_end=line, + kind="enumValue", + value=decl.value.text() if decl.value else None, + names=[ + SName( + name=decl.name.text(), + type=SType("enum", name), + value=decl.value) + ])) + + line = enum.kind.location.line + return SEnum(line, name, decls) + +def to_sbody(typ: AType): + if isinstance(typ, ATypeStruct): + return to_sstruct(typ) + elif isinstance(typ, ATypeEnum): + return to_senum(typ) + else: + raise TypeError(f"Unhandled type {type(typ)}") + +def top_sdecls(top: ATop) -> List[SCommentDecl]: + if isinstance(top, ATopFile): + decls = [] + for t in top.tops: + decls += top_sdecls(t) + return decls + elif isinstance(top, ATopTypedef): + return [to_sdecl(top.decl, "typedef")] + elif isinstance(top, ATopExtern): + return [to_sdecl(top.decl, "extern")] + elif isinstance(top, ATopDecl): + return [to_sdecl(top.decl, "toplevel")] + elif isinstance(top, ATopComment): + return [to_scomment(top)] + elif isinstance(top, ATopList): + line = top.name.location.line + name = top.name.text() + st = to_stype(top.type.type) + st = name_to_stype(st, top.type.names[0]) + return [SDecl(line, line, "list", [SName(None, SType("struct", name, + body=SStruct(line, "struct", name, [ + SDecl(line, line, "field", [SName("data", st._replace(mods=st.mods+[SModPointer()]))]), + SDecl(line+1, line+1, "field", [SName("count", SType("name", "size_t"))]), + ], is_list=True) + ))])] + elif isinstance(top, ATopEnumType): + line = top.enum_type.location.line + name = top.prefix.text() + "_COUNT" + return [SDecl(line, line, "enumCount", + [SName(name, SType("enumType", "enumType", body=SEnumType( + line, top.enum_type.text(), top.prefix.text(), top.last_value.text()) + ) + )] + )] + elif isinstance(top, ATopPreproc): + line = top.preproc.location.line + text = top.preproc.text() + m = re.match(r"#\s*define\s+(\w+)(\([^\)]*\))?\s+(.*)", text) + if m: + name = m.group(1) + args = m.group(2) + if args: + args = [arg.strip() for arg in args.split(",")] + else: + args = None + value = m.group(3) + return [SDecl(line, line, "define", [SName(name, SType("define", "define"))], + define_args=args, + value=value)] + else: + return [] # TODO + else: + raise TypeError(f"Unhandled type {type(top)}") + +def collect_decl_comments(decls: List[SCommentDecl]): + n = 0 + while n < len(decls): + dc = decls[n:n+3] + if isinstance(dc[0], SComment): + if (len(dc) >= 2 and isinstance(dc[1], SDecl) and dc[0].line_end + 1 == dc[1].line_begin + and (len(dc) < 3 or not (isinstance(dc[2], SComment) and dc[1].line_end == dc[2].line_begin))): + yield dc[1]._replace(comment=dc[0]) + n += 2 + else: + yield dc[0] + n += 1 + else: + if len(dc) >= 2 and isinstance(dc[1], SComment) and dc[0].line_end == dc[1].line_begin: + comment = dc[1]._replace(text=[re.sub("^\s*<\s*", "", t) for t in dc[1].text]) + yield dc[0]._replace(comment=comment, comment_inline=True) + n += 2 + else: + yield dc[0] + n += 1 + +def collect_decl_groups(decls: List[SCommentDecl]): + n = 0 + while n < len(decls): + dc = decls[n] + if isinstance(dc, SDecl) and not dc.comment_inline and not (dc.names and dc.names[0].type.body): + group = [dc] + line = dc.line_end + 1 + n += 1 + while n < len(decls): + dc2 = decls[n] + if not isinstance(dc2, SDecl): break + if dc2.comment: break + if dc2.line_begin != line: break + if dc2.names and dc2.names[0].type.body: break + if dc2.is_function != dc.is_function: break + group.append(dc2) + line = dc2.line_end + 1 + n += 1 + group[0] = dc._replace(comment=None) + comment_inline = len(group) == 1 and dc.comment_inline + yield SDeclGroup(dc.line_begin, group, dc.comment, comment_inline, dc.is_function) + elif isinstance(dc, SDecl) and not (dc.names and dc.names[0].type.body): + group = [dc._replace(comment=None)] + yield SDeclGroup(dc.line_begin, group, dc.comment, dc.comment_inline, dc.is_function) + n += 1 + else: + yield dc + n += 1 + +def collect_decls(decls: List[SCommentDecl], allow_groups: bool) -> List[SCommentDecl]: + decls = list(collect_decl_comments(decls)) + if allow_groups: + decls = list(collect_decl_groups(decls)) + return decls + +def format_arg(decl: SDecl): + name = decl.names[0] + return { + "type": format_type(name.type), + "name": name.name, + } + +def format_mod(mod: SMod): + if isinstance(mod, SModConst): + return { "type": "const" } + elif isinstance(mod, SModNullable): + return { "type": "nullable" } + elif isinstance(mod, SModInline): + return { "type": "inline" } + elif isinstance(mod, SModAbi): + return { "type": "abi" } + elif isinstance(mod, SModPointer): + return { "type": "pointer" } + elif isinstance(mod, SModUnsafe): + return { "type": "unsafe" } + elif isinstance(mod, SModArray): + return { "type": "array", "length": mod.length } + elif isinstance(mod, SModFunction): + return { "type": "function", "args": [format_arg(d) for d in mod.args] } + else: + raise TypeError(f"Unhandled mod {type(mod)}") + +def format_type(type: SType): + return { + "kind": type.kind, + "name": type.name, + "mods": [format_mod(mod) for mod in type.mods], + } + +def format_name(name: SName): + return { + "type": format_type(name.type), + "name": name.name, + } + +def format_decls(decls: List[SCommentDecl], allow_groups: bool): + for decl in collect_decls(decls, allow_groups): + if isinstance(decl, SComment): + yield { + "kind": "paragraph", + "comment": decl.text, + } + elif isinstance(decl, SDecl): + body = None + if decl.names and decl.names[0].type.body: + body = decl.names[0].type.body + if isinstance(body, SStruct): + yield { + "kind": "struct", + "structKind": body.kind, + "line": body.line, + "name": body.name, + "comment": decl.comment.text if decl.comment else [], + "commentInline": decl.comment_inline, + "isList": body.is_list, + "decls": list(format_decls(body.decls, allow_groups=True)), + } + elif isinstance(body, SEnum): + yield { + "kind": "enum", + "line": body.line, + "name": body.name, + "comment": decl.comment.text if decl.comment else [], + "commentInline": decl.comment_inline, + "decls": list(format_decls(body.decls, allow_groups=True)), + } + elif isinstance(body, SEnumType): + yield { + "kind": "enumType", + "line": body.line, + "enumName": body.enum_name, + "countName": body.enum_prefix + "_COUNT", + "lastValue": body.last_value, + "comment": decl.comment.text if decl.comment else [], + "commentInline": decl.comment_inline, + } + else: + for name in decl.names: + yield { + "kind": "decl", + "declKind": decl.kind, + "line": decl.line_begin, + "name": name.name, + "comment": decl.comment.text if decl.comment else [], + "commentInline": decl.comment_inline, + "isFunction": decl.is_function, + "value": decl.value, + "defineArgs": decl.define_args, + "type": format_type(name.type), + } + elif isinstance(decl, SDeclGroup): + yield { + "kind": "group", + "line": decl.line, + "name": None, + "comment": decl.comment.text if decl.comment else [], + "commentInline": decl.comment_inline, + "isFunction": decl.is_function, + "decls": list(format_decls(decl.decls, allow_groups=False)), + } + else: + raise TypeError(f"Unhandled type {type(decl)}") + +if __name__ == "__main__": + parser = argparse.ArgumentParser("ufbx_parser.py") + parser.add_argument("-i", help="Input file") + parser.add_argument("-o", help="Output file") + argv = parser.parse_args() + + src_path = os.path.dirname(os.path.realpath(__file__)) + + input_file = argv.i + if not input_file: + input_file = os.path.join(src_path, "..", "ufbx.h") + + output_file = argv.o + if not output_file: + output_file = os.path.join(src_path, "build", "ufbx.json") + + output_path = os.path.dirname(os.path.realpath(output_file)) + if not os.path.exists(output_path): + os.makedirs(output_path, exist_ok=True) + + with open(input_file) as f: + source = f.read() + + p = Parser(source, "ufbx.h") + top_file = p.parse_top_file() + result = top_sdecls(top_file) + + js = list(format_decls(result, allow_groups=True)) + + with open(output_file, "wt") as f: + json.dump(js, f, indent=2) diff --git a/modules/ufbx/data/blender_272_cube_7400_binary.fbx b/modules/ufbx/data/blender_272_cube_7400_binary.fbx new file mode 100644 index 0000000..4fa2695 Binary files /dev/null and b/modules/ufbx/data/blender_272_cube_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_ball_0_obj.mtl b/modules/ufbx/data/blender_279_ball_0_obj.mtl new file mode 100644 index 0000000..8f0b78d --- /dev/null +++ b/modules/ufbx/data/blender_279_ball_0_obj.mtl @@ -0,0 +1,22 @@ +# Blender MTL File: 'None' +# Material Count: 2 + +newmtl Red +Ns 96.078421 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.000000 0.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 0.000000 +illum 9 + +newmtl White +Ns 96.078421 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 0.000000 +illum 9 diff --git a/modules/ufbx/data/blender_279_ball_0_obj.obj b/modules/ufbx/data/blender_279_ball_0_obj.obj new file mode 100644 index 0000000..9c00d3e --- /dev/null +++ b/modules/ufbx/data/blender_279_ball_0_obj.obj @@ -0,0 +1,199 @@ +# Blender v3.2.0 OBJ File: '' +# www.blender.org +mtllib blender_279_ball_0_obj.mtl +o Icosphere +v 0.000000 -0.000000 -1.000000 +v 0.723607 -0.525725 -0.447219 +v -0.276388 -0.850649 -0.447220 +v -0.894426 -0.000000 -0.447216 +v -0.276388 0.850649 -0.447220 +v 0.723607 0.525725 -0.447220 +v 0.276388 -0.850649 0.447220 +v -0.723607 -0.525725 0.447220 +v -0.723607 0.525725 0.447219 +v 0.276388 0.850649 0.447220 +v 0.894426 0.000000 0.447216 +v 0.000000 0.000000 1.000000 +v -0.162456 -0.499995 -0.850654 +v 0.425323 -0.309012 -0.850654 +v 0.262869 -0.809012 -0.525738 +v 0.850648 -0.000000 -0.525736 +v 0.425323 0.309011 -0.850654 +v -0.525730 -0.000000 -0.850652 +v -0.688189 -0.499997 -0.525736 +v -0.162456 0.499995 -0.850654 +v -0.688189 0.499997 -0.525736 +v 0.262869 0.809012 -0.525738 +v 0.951058 -0.309013 0.000000 +v 0.951058 0.309013 -0.000000 +v 0.000000 -1.000000 0.000000 +v 0.587786 -0.809017 0.000000 +v -0.951058 -0.309013 0.000000 +v -0.587786 -0.809017 0.000000 +v -0.587786 0.809017 -0.000000 +v -0.951058 0.309013 -0.000000 +v 0.587786 0.809017 -0.000000 +v 0.000000 1.000000 -0.000000 +v 0.688189 -0.499997 0.525736 +v -0.262869 -0.809012 0.525738 +v -0.850648 0.000000 0.525736 +v -0.262869 0.809012 0.525738 +v 0.688189 0.499997 0.525736 +v 0.162456 -0.499995 0.850654 +v 0.525730 0.000000 0.850652 +v -0.425323 -0.309011 0.850654 +v -0.425323 0.309012 0.850654 +v 0.162456 0.499995 0.850654 +vn -0.4713 -0.5831 0.6617 +vn -0.7002 0.2680 0.6617 +vn -0.1024 0.3151 0.9435 +vn -0.1876 0.5773 0.7947 +vn -0.4713 0.5831 0.6617 +vn -0.3313 0.0000 0.9435 +vn -0.6071 0.0000 0.7947 +vn -0.7002 -0.2680 0.6617 +vn -0.1024 -0.3151 0.9435 +vn -0.1876 -0.5773 0.7947 +vn -0.3035 0.9342 0.1876 +vn -0.5346 0.7779 0.3304 +vn -0.9050 0.2680 0.3304 +vn -0.9822 -0.0000 0.1876 +vn -0.9050 -0.2680 0.3304 +vn -0.5346 -0.7779 0.3304 +vn -0.3035 -0.9342 0.1876 +vn -0.8026 0.5831 0.1256 +vn -0.8026 -0.5831 0.1256 +vn 0.2764 -0.8506 0.4472 +vn 0.6882 -0.5000 0.5257 +vn 0.1625 -0.5000 0.8507 +vn 0.2764 0.8506 0.4472 +vn -0.2629 0.8090 0.5257 +vn 0.1625 0.5000 0.8507 +vn 0.8944 0.0000 0.4472 +vn 0.6882 0.5000 0.5257 +vn 0.5257 0.0000 0.8507 +vn 0.0000 -0.0000 1.0000 +vn -0.2629 -0.8090 0.5257 +vn 0.9511 0.3090 -0.0000 +vn 0.5878 0.8090 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 -1.0000 0.0000 +vn 0.5878 -0.8090 0.0000 +vn 0.9511 -0.3090 -0.0000 +vn -0.2680 -0.1947 -0.9435 +vn -0.2680 0.1947 -0.9435 +vn 0.0247 -0.9435 -0.3304 +vn -0.8897 -0.3151 -0.3304 +vn -0.5746 0.7488 -0.3304 +vn -0.3066 -0.9435 -0.1256 +vn -0.9921 -0.0000 -0.1256 +vn -0.3066 0.9435 -0.1256 +vn 0.0247 0.9435 -0.3304 +vn -0.7947 0.5773 -0.1876 +vn -0.8897 0.3151 -0.3304 +vn -0.7947 -0.5773 -0.1876 +vn -0.5746 -0.7488 -0.3304 +vn -0.0385 0.7488 -0.6617 +vn -0.4089 0.6284 -0.6617 +vn -0.4911 0.3568 -0.7947 +vn -0.7240 0.1947 -0.6617 +vn -0.7240 -0.1947 -0.6617 +vn -0.4911 -0.3568 -0.7947 +vn -0.4089 -0.6284 -0.6617 +vn -0.0385 -0.7488 -0.6617 +vn -0.0000 -0.0000 -1.0000 +vn 0.4253 -0.3090 -0.8507 +vn -0.1624 -0.5000 -0.8507 +vn 0.7236 -0.5257 -0.4472 +vn 0.8506 -0.0000 -0.5257 +vn -0.1624 0.5000 -0.8507 +vn 0.4253 0.3090 -0.8507 +vn 0.7236 0.5257 -0.4472 +vn 0.2629 0.8090 -0.5257 +vn 0.2629 -0.8090 -0.5257 +usemtl Red +s off +f 8//1 34//1 40//1 +f 9//2 35//2 41//2 +f 42//3 41//3 12//3 +f 42//4 36//4 41//4 +f 36//5 9//5 41//5 +f 41//6 40//6 12//6 +f 41//7 35//7 40//7 +f 35//8 8//8 40//8 +f 40//9 38//9 12//9 +f 40//10 34//10 38//10 +f 32//11 29//11 36//11 +f 29//12 9//12 36//12 +f 30//13 35//13 9//13 +f 30//14 27//14 35//14 +f 27//15 8//15 35//15 +f 28//16 34//16 8//16 +f 28//17 25//17 34//17 +f 29//18 30//18 9//18 +f 27//19 28//19 8//19 +s 1 +f 7//20 33//21 38//22 +f 10//23 36//24 42//25 +f 11//26 37//27 39//28 +f 39//28 42//25 12//29 +f 39//28 37//27 42//25 +f 37//27 10//23 42//25 +f 34//30 7//20 38//22 +f 38//22 39//28 12//29 +f 38//22 33//21 39//28 +f 33//21 11//26 39//28 +f 24//31 37//27 11//26 +f 24//31 31//32 37//27 +f 31//32 10//23 37//27 +f 32//33 36//24 10//23 +f 25//34 7//20 34//30 +f 26//35 33//21 7//20 +f 26//35 23//36 33//21 +f 23//36 11//26 33//21 +f 31//32 32//33 10//23 +f 25//34 26//35 7//20 +f 23//36 24//31 11//26 +usemtl White +s off +f 1//37 13//37 18//37 +f 1//38 18//38 20//38 +f 3//39 15//39 25//39 +f 4//40 19//40 27//40 +f 5//41 21//41 29//41 +f 3//42 25//42 28//42 +f 4//43 27//43 30//43 +f 5//44 29//44 32//44 +f 22//45 5//45 32//45 +f 29//46 21//46 30//46 +f 21//47 4//47 30//47 +f 27//48 19//48 28//48 +f 19//49 3//49 28//49 +f 20//50 5//50 22//50 +f 20//51 21//51 5//51 +f 20//52 18//52 21//52 +f 18//53 4//53 21//53 +f 18//54 19//54 4//54 +f 18//55 13//55 19//55 +f 13//56 3//56 19//56 +f 13//57 15//57 3//57 +s 1 +f 1//58 14//59 13//60 +f 2//61 14//59 16//62 +f 1//58 20//63 17//64 +f 2//61 16//62 23//36 +f 6//65 22//66 31//32 +f 2//61 23//36 26//35 +f 6//65 31//32 24//31 +f 31//32 22//66 32//33 +f 25//34 15//67 26//35 +f 15//67 2//61 26//35 +f 23//36 16//62 24//31 +f 16//62 6//65 24//31 +f 17//64 22//66 6//65 +f 17//64 20//63 22//66 +f 16//62 17//64 6//65 +f 16//62 14//59 17//64 +f 14//59 1//58 17//64 +f 13//60 14//59 15//67 +f 14//59 2//61 15//67 diff --git a/modules/ufbx/data/blender_279_ball_6100_ascii.fbx b/modules/ufbx/data/blender_279_ball_6100_ascii.fbx new file mode 100644 index 0000000..1014004 --- /dev/null +++ b/modules/ufbx/data/blender_279_ball_6100_ascii.fbx @@ -0,0 +1,1667 @@ +; FBX 6.1.0 project file +; Created by Blender FBX Exporter +; for support mail: ideasman42@gmail.com +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 04 + Day: 01 + Hour: 16 + Minute: 34 + Second: 23 + Millisecond: 0 + } + Creator: "FBX SDK/FBX Plugins build 20070228" + OtherFlags: { + FlagPLE: 0 + } +} +CreationTime: "2020-04-01 16:34:23:000" +Creator: "Blender version 2.79 (sub 0)" + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 12 + ObjectType: "Model" { + Count: 9 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 2 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Icosphere", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: 0.000000,0.000000,-1.000000,0.723607,-0.525725,-0.447220,-0.276388,-0.850649,-0.447220,-0.894426,0.000000,-0.447216, + -0.276388,0.850649,-0.447220,0.723607,0.525725,-0.447220,0.276388,-0.850649,0.447220,-0.723607,-0.525725,0.447220, + -0.723607,0.525725,0.447220,0.276388,0.850649,0.447220,0.894426,0.000000,0.447216,0.000000,0.000000,1.000000, + -0.162456,-0.499995,-0.850654,0.425323,-0.309011,-0.850654,0.262869,-0.809012,-0.525738,0.850648,0.000000,-0.525736, + 0.425323,0.309011,-0.850654,-0.525730,0.000000,-0.850652,-0.688189,-0.499997,-0.525736,-0.162456,0.499995,-0.850654, + -0.688189,0.499997,-0.525736,0.262869,0.809012,-0.525738,0.951058,-0.309013,0.000000,0.951058,0.309013,0.000000, + 0.000000,-1.000000,0.000000,0.587786,-0.809017,0.000000,-0.951058,-0.309013,0.000000,-0.587786,-0.809017,0.000000, + -0.587786,0.809017,0.000000,-0.951058,0.309013,0.000000,0.587786,0.809017,0.000000,0.000000,1.000000,0.000000, + 0.688189,-0.499997,0.525736,-0.262869,-0.809012,0.525738,-0.850648,0.000000,0.525736,-0.262869,0.809012,0.525738, + 0.688189,0.499997,0.525736,0.162456,-0.499995,0.850654,0.525730,0.000000,0.850652,-0.425323,-0.309011,0.850654, + -0.425323,0.309011,0.850654,0.162456,0.499995,0.850654 + PolygonVertexIndex: 0,13,-13,1,13,-16,0,12,-18,0,17,-20,0,19,-17,1,15,-23,2,14,-25,3,18,-27,4,20,-29,5,21,-31,1,22, + -26,2,24,-28,3,26,-30,4,28,-32,5,30,-24,6,32,-38,7,33,-40,8,34,-41,9,35,-42,10,36,-39,38,41,-12,38, + 36,-42,36,9,-42,41,40,-12,41,35,-41,35,8,-41,40,39,-12,40,34,-40,34,7,-40,39,37,-12,39,33,-38,33,6,-38, + 37,38,-12,37,32,-39,32,10,-39,23,36,-11,23,30,-37,30,9,-37,31,35,-10,31,28,-36,28,8,-36,29,34,-9,29,26, + -35,26,7,-35,27,33,-8,27,24,-34,24,6,-34,25,32,-7,25,22,-33,22,10,-33,30,31,-10,30,21,-32,21,4,-32,28, + 29,-9,28,20,-30,20,3,-30,26,27,-8,26,18,-28,18,2,-28,24,25,-7,24,14,-26,14,1,-26,22,23,-11,22,15,-24, + 15,5,-24,16,21,-6,16,19,-22,19,4,-22,19,20,-5,19,17,-21,17,3,-21,17,18,-4,17,12,-19,12,2,-19,15,16, + -6,15,13,-17,13,0,-17,12,14,-3,12,13,-15,13,1,-15 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0.000000,0.000000,-1.000000,0.425306,-0.309000,-0.850642,-0.162450,-0.499985,-0.850642,0.723594,-0.525712,-0.447188, + 0.425306,-0.309000,-0.850642,0.850642,0.000000,-0.525712,-0.268034,-0.194736,-0.943523,-0.268034,-0.194736,-0.943523, + -0.268034,-0.194736,-0.943523,-0.268034,0.194736,-0.943523,-0.268034,0.194736,-0.943523,-0.268034,0.194736,-0.943523, + 0.000000,0.000000,-1.000000,-0.162450,0.499985,-0.850642,0.425306,0.309000,-0.850642,0.723594,-0.525712,-0.447188, + 0.850642,0.000000,-0.525712,0.951048,-0.309000,0.000000,0.024747,-0.943521,-0.330386,0.024747,-0.943521,-0.330386, + 0.024747,-0.943521,-0.330386,-0.889697,-0.315095,-0.330385,-0.889697,-0.315095,-0.330385,-0.889697,-0.315095,-0.330385, + -0.574602,0.748783,-0.330388,-0.574602,0.748783,-0.330388,-0.574602,0.748783,-0.330388,0.723594,0.525712,-0.447188, + 0.262856,0.808985,-0.525712,0.587756,0.809015,0.000000,0.723594,-0.525712,-0.447188,0.951048,-0.309000,0.000000, + 0.587756,-0.809015,0.000000,-0.306569,-0.943522,-0.125629,-0.306569,-0.943522,-0.125629,-0.306569,-0.943522,-0.125629, + -0.992077,0.000000,-0.125628,-0.992077,0.000000,-0.125628,-0.992077,0.000000,-0.125628,-0.306569,0.943522,-0.125629, + -0.306569,0.943522,-0.125629,-0.306569,0.943522,-0.125629,0.723594,0.525712,-0.447188,0.587756,0.809015,0.000000, + 0.951048,0.309000,0.000000,0.276376,-0.850642,0.447218,0.688162,-0.499985,0.525712,0.162450,-0.499985,0.850642, + -0.471300,-0.583122,0.661699,-0.471300,-0.583122,0.661699,-0.471300,-0.583122,0.661699,-0.700224,0.268032,0.661699, + -0.700224,0.268032,0.661699,-0.700224,0.268032,0.661699,0.276376,0.850642,0.447218,-0.262856,0.808985,0.525712, + 0.162450,0.499985,0.850642,0.894406,0.000000,0.447188,0.688162,0.499985,0.525712,0.525712,0.000000,0.850642, + 0.525712,0.000000,0.850642,0.162450,0.499985,0.850642,0.000000,0.000000,1.000000,0.525712,0.000000,0.850642, + 0.688162,0.499985,0.525712,0.162450,0.499985,0.850642,0.688162,0.499985,0.525712,0.276376,0.850642,0.447218, + 0.162450,0.499985,0.850642,-0.102381,0.315090,0.943523,-0.102381,0.315090,0.943523,-0.102381,0.315090,0.943523, + -0.187594,0.577345,0.794658,-0.187594,0.577345,0.794658,-0.187594,0.577345,0.794658,-0.471300,0.583122,0.661699, + -0.471300,0.583122,0.661699,-0.471300,0.583122,0.661699,-0.331304,0.000000,0.943524,-0.331304,0.000000,0.943524, + -0.331304,0.000000,0.943524,-0.607060,0.000000,0.794656,-0.607060,0.000000,0.794656,-0.607060,0.000000,0.794656, + -0.700224,-0.268032,0.661699,-0.700224,-0.268032,0.661699,-0.700224,-0.268032,0.661699,-0.102381,-0.315090,0.943523, + -0.102381,-0.315090,0.943523,-0.102381,-0.315090,0.943523,-0.187594,-0.577345,0.794658,-0.187594,-0.577345,0.794658, + -0.187594,-0.577345,0.794658,-0.262856,-0.808985,0.525712,0.276376,-0.850642,0.447218,0.162450,-0.499985,0.850642, + 0.162450,-0.499985,0.850642,0.525712,0.000000,0.850642,0.000000,0.000000,1.000000,0.162450,-0.499985,0.850642, + 0.688162,-0.499985,0.525712,0.525712,0.000000,0.850642,0.688162,-0.499985,0.525712,0.894406,0.000000,0.447188, + 0.525712,0.000000,0.850642,0.951048,0.309000,0.000000,0.688162,0.499985,0.525712,0.894406,0.000000,0.447188, + 0.951048,0.309000,0.000000,0.587756,0.809015,0.000000,0.688162,0.499985,0.525712,0.587756,0.809015,0.000000, + 0.276376,0.850642,0.447218,0.688162,0.499985,0.525712,0.000000,1.000000,0.000000,-0.262856,0.808985,0.525712, + 0.276376,0.850642,0.447218,-0.303531,0.934171,0.187597,-0.303531,0.934171,0.187597,-0.303531,0.934171,0.187597, + -0.534576,0.777864,0.330387,-0.534576,0.777864,0.330387,-0.534576,0.777864,0.330387,-0.904989,0.268031,0.330385, + -0.904989,0.268031,0.330385,-0.904989,0.268031,0.330385,-0.982246,0.000000,0.187599,-0.982246,0.000000,0.187599, + -0.982246,0.000000,0.187599,-0.904989,-0.268031,0.330385,-0.904989,-0.268031,0.330385,-0.904989,-0.268031,0.330385, + -0.534576,-0.777864,0.330387,-0.534576,-0.777864,0.330387,-0.534576,-0.777864,0.330387,-0.303531,-0.934171,0.187597, + -0.303531,-0.934171,0.187597,-0.303531,-0.934171,0.187597,0.000000,-1.000000,0.000000,0.276376,-0.850642,0.447218, + -0.262856,-0.808985,0.525712,0.587756,-0.809015,0.000000,0.688162,-0.499985,0.525712,0.276376,-0.850642,0.447218, + 0.587756,-0.809015,0.000000,0.951048,-0.309000,0.000000,0.688162,-0.499985,0.525712,0.951048,-0.309000,0.000000, + 0.894406,0.000000,0.447188,0.688162,-0.499985,0.525712,0.587756,0.809015,0.000000,0.000000,1.000000,0.000000, + 0.276376,0.850642,0.447218,0.587756,0.809015,0.000000,0.262856,0.808985,-0.525712,0.000000,1.000000,0.000000, + 0.024747,0.943521,-0.330386,0.024747,0.943521,-0.330386,0.024747,0.943521,-0.330386,-0.802609,0.583126,0.125627, + -0.802609,0.583126,0.125627,-0.802609,0.583126,0.125627,-0.794656,0.577348,-0.187595,-0.794656,0.577348,-0.187595, + -0.794656,0.577348,-0.187595,-0.889697,0.315095,-0.330385,-0.889697,0.315095,-0.330385,-0.889697,0.315095,-0.330385, + -0.802609,-0.583126,0.125627,-0.802609,-0.583126,0.125627,-0.802609,-0.583126,0.125627,-0.794656,-0.577348,-0.187595, + -0.794656,-0.577348,-0.187595,-0.794656,-0.577348,-0.187595,-0.574602,-0.748784,-0.330388,-0.574602,-0.748784,-0.330388, + -0.574602,-0.748784,-0.330388,0.000000,-1.000000,0.000000,0.587756,-0.809015,0.000000,0.276376,-0.850642,0.447218, + 0.000000,-1.000000,0.000000,0.262856,-0.808985,-0.525712,0.587756,-0.809015,0.000000,0.262856,-0.808985,-0.525712, + 0.723594,-0.525712,-0.447188,0.587756,-0.809015,0.000000,0.951048,-0.309000,0.000000,0.951048,0.309000,0.000000, + 0.894406,0.000000,0.447188,0.951048,-0.309000,0.000000,0.850642,0.000000,-0.525712,0.951048,0.309000,0.000000, + 0.850642,0.000000,-0.525712,0.723594,0.525712,-0.447188,0.951048,0.309000,0.000000,0.425306,0.309000,-0.850642, + 0.262856,0.808985,-0.525712,0.723594,0.525712,-0.447188,0.425306,0.309000,-0.850642,-0.162450,0.499985,-0.850642, + 0.262856,0.808985,-0.525712,-0.038531,0.748779,-0.661699,-0.038531,0.748779,-0.661699,-0.038531,0.748779,-0.661699, + -0.408946,0.628425,-0.661699,-0.408946,0.628425,-0.661699,-0.408946,0.628425,-0.661699,-0.491120,0.356821,-0.794657, + -0.491120,0.356821,-0.794657,-0.491120,0.356821,-0.794657,-0.724042,0.194736,-0.661695,-0.724042,0.194736,-0.661695, + -0.724042,0.194736,-0.661695,-0.724042,-0.194736,-0.661695,-0.724042,-0.194736,-0.661695,-0.724042,-0.194736,-0.661695, + -0.491120,-0.356821,-0.794657,-0.491120,-0.356821,-0.794657,-0.491120,-0.356821,-0.794657,-0.408946,-0.628425,-0.661699, + -0.408946,-0.628425,-0.661699,-0.408946,-0.628425,-0.661699,0.850642,0.000000,-0.525712,0.425306,0.309000,-0.850642, + 0.723594,0.525712,-0.447188,0.850642,0.000000,-0.525712,0.425306,-0.309000,-0.850642,0.425306,0.309000,-0.850642, + 0.425306,-0.309000,-0.850642,0.000000,0.000000,-1.000000,0.425306,0.309000,-0.850642,-0.038531,-0.748779,-0.661699, + -0.038531,-0.748779,-0.661699,-0.038531,-0.748779,-0.661699,-0.162450,-0.499985,-0.850642,0.425306,-0.309000,-0.850642, + 0.262856,-0.808985,-0.525712,0.425306,-0.309000,-0.850642,0.723594,-0.525712,-0.447188,0.262856,-0.808985,-0.525712 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: 1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1, + 1,1,1,0,0,0,0,0,0,0,1,1,1,0,1,1 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::Red", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.0000,0.0000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.0000,0.0000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.0,0.0 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Material: "Material::White", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 1 + PoseNode: { + Node: "Model::Icosphere" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Icosphere", "Mesh" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::Red", "" { + } + Material: "Material::White", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Icosphere", "Model::Scene" + Connect: "OO", "Material::Red", "Model::Icosphere" + Connect: "OO", "Material::White", "Model::Icosphere" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Icosphere" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/blender_279_ball_7400_binary.fbx b/modules/ufbx/data/blender_279_ball_7400_binary.fbx new file mode 100644 index 0000000..bf9382a Binary files /dev/null and b/modules/ufbx/data/blender_279_ball_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_bone_radius_6100_ascii.fbx b/modules/ufbx/data/blender_279_bone_radius_6100_ascii.fbx new file mode 100644 index 0000000..e4adb09 --- /dev/null +++ b/modules/ufbx/data/blender_279_bone_radius_6100_ascii.fbx @@ -0,0 +1,2178 @@ +; FBX 6.1.0 project file +; Created by Blender FBX Exporter +; for support mail: ideasman42@gmail.com +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 08 + Day: 23 + Hour: 22 + Minute: 21 + Second: 17 + Millisecond: 0 + } + Creator: "FBX SDK/FBX Plugins build 20070228" + OtherFlags: { + FlagPLE: 0 + } +} +CreationTime: "2021-08-23 22:21:17:000" +Creator: "Blender version 2.79 (sub 0)" + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 14 + ObjectType: "Model" { + Count: 13 + } + ObjectType: "Geometry" { + Count: 0 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Armature", "Limb" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + } + Model: "Model::Bone", "Limb" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",89.999995674159678,-89.999995674159678,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Size", "double", "",1 + Property: "LimbLength", "double", "",1.000000 + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "Color", "Color", "A",0.8,0.8,0.8 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + } + Model: "Model::Bone_001", "Limb" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",1.000000000000000,0.000000075497901,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,-0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Size", "double", "",1 + Property: "LimbLength", "double", "",1.000000 + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "Color", "Color", "A",0.8,0.8,0.8 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + } + Model: "Model::Bone_002", "Limb" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",1.000000000000000,0.000000075497901,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,-0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Size", "double", "",1 + Property: "LimbLength", "double", "",1.000000 + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "Color", "Color", "A",0.8,0.8,0.8 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + } + Model: "Model::Bone_003", "Limb" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",1.000000000000000,0.000000075497908,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,-0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Size", "double", "",1 + Property: "LimbLength", "double", "",4.000000 + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "Color", "Color", "A",0.8,0.8,0.8 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 5 + PoseNode: { + Node: "Model::Armature" + Matrix: 1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + PoseNode: { + Node: "Model::Bone" + Matrix: 0.000000075497901,1.000000000000000,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000075497901,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + PoseNode: { + Node: "Model::Bone_001" + Matrix: 0.000000075497901,1.000000000000000,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000075497901,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,1.000000000000000 + } + PoseNode: { + Node: "Model::Bone_002" + Matrix: 0.000000075497901,1.000000000000000,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000075497901,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,2.000000000000000,0.000000000000000,1.000000000000000 + } + PoseNode: { + Node: "Model::Bone_003" + Matrix: 0.000000075497901,1.000000000000000,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000075497901,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,3.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Armature", "Limb" { + } + Model: "Model::Bone", "Limb" { + } + Model: "Model::Bone_001", "Limb" { + } + Model: "Model::Bone_002", "Limb" { + } + Model: "Model::Bone_003", "Limb" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Armature", "Model::Scene" + Connect: "OO", "Model::Bone", "Model::Armature" + Connect: "OO", "Model::Bone_001", "Model::Bone" + Connect: "OO", "Model::Bone_002", "Model::Bone_001" + Connect: "OO", "Model::Bone_003", "Model::Bone_002" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Bone" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -89.999995674159678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-89.999995674159678,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Bone_001" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000075497901 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000075497901,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Bone_002" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000075497901 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000075497901,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Bone_003" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000075497908 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000075497908,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Armature" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/blender_279_bone_radius_7400_binary.fbx b/modules/ufbx/data/blender_279_bone_radius_7400_binary.fbx new file mode 100644 index 0000000..a733c12 Binary files /dev/null and b/modules/ufbx/data/blender_279_bone_radius_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_color_sets_6100_ascii.fbx b/modules/ufbx/data/blender_279_color_sets_6100_ascii.fbx new file mode 100644 index 0000000..7018af8 --- /dev/null +++ b/modules/ufbx/data/blender_279_color_sets_6100_ascii.fbx @@ -0,0 +1,1601 @@ +; FBX 6.1.0 project file +; Created by Blender FBX Exporter +; for support mail: ideasman42@gmail.com +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 03 + Day: 31 + Hour: 20 + Minute: 42 + Second: 49 + Millisecond: 0 + } + Creator: "FBX SDK/FBX Plugins build 20070228" + OtherFlags: { + FlagPLE: 0 + } +} +CreationTime: "2020-03-31 20:42:49:000" +Creator: "Blender version 2.79 (sub 0)" + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 11 + ObjectType: "Model" { + Count: 9 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Cube", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: -0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.500000,-0.500000,0.500000,-0.500000,-0.500000,0.500000,0.500000, + 0.500000,-0.500000,-0.500000,0.500000,-0.500000,0.500000,0.500000,0.500000,-0.500000,0.500000,0.500000,0.500000 + PolygonVertexIndex: 0,1,3,-3,2,3,7,-7,6,7,5,-5,4,5,1,-1,2,6,4,-1,7,3,1,-6 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: -1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000, + 0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000 + } + LayerElementColor: 0 { + Version: 101 + Name: "RGBCube" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 0.000000,1.000000,1.000000,1,1.000000,1.000000,0.000000,1,1.000000,1.000000,1.000000,1,1.000000,0.000000,0.000000,1, + 0.000000,0.000000,1.000000,1,1.000000,0.000000,1.000000,1,0.000000,0.000000,0.000000,1,0.000000,1.000000,0.000000,1 + ColorIndex: 6,4,0,7,7,0,2,1,1,2,5,3,3,5,4,6,7,1,3,6,2,0,4,5 + } + LayerElementColor: 1 { + Version: 101 + Name: "White" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 1.000000,1.000000,1.000000,1 + ColorIndex: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementColor: 2 { + Version: 101 + Name: "Black" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 0.000000,0.000000,0.000000,1 + ColorIndex: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 2 + } + } + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::unnamed", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 1 + PoseNode: { + Node: "Model::Cube" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Cube", "Mesh" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::unnamed", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Cube", "Model::Scene" + Connect: "OO", "Material::unnamed", "Model::Cube" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Cube" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/blender_279_color_sets_7400_binary.fbx b/modules/ufbx/data/blender_279_color_sets_7400_binary.fbx new file mode 100644 index 0000000..7a9d1c4 Binary files /dev/null and b/modules/ufbx/data/blender_279_color_sets_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_default.obj b/modules/ufbx/data/blender_279_default.obj new file mode 100644 index 0000000..453d928 --- /dev/null +++ b/modules/ufbx/data/blender_279_default.obj @@ -0,0 +1,25 @@ +# ufbx:bad_uvs +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +g Cube +v 1.000000 -1.000000 -1.000000 +v 1.000000 -1.000000 1.000000 +v -1.000000 -1.000000 1.000000 +v -1.000000 -1.000000 -1.000000 +v 1.000000 1.000000 -0.999999 +v 0.999999 1.000000 1.000001 +v -1.000000 1.000000 1.000000 +v -1.000000 1.000000 -1.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/blender_279_default_6100_ascii.fbx b/modules/ufbx/data/blender_279_default_6100_ascii.fbx new file mode 100644 index 0000000..5fcb557 --- /dev/null +++ b/modules/ufbx/data/blender_279_default_6100_ascii.fbx @@ -0,0 +1,1988 @@ +; FBX 6.1.0 project file +; Created by Blender FBX Exporter +; for support mail: ideasman42@gmail.com +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 01 + Day: 19 + Hour: 15 + Minute: 41 + Second: 02 + Millisecond: 0 + } + Creator: "FBX SDK/FBX Plugins build 20070228" + OtherFlags: { + FlagPLE: 0 + } +} +CreationTime: "2020-01-19 15:41:02:000" +Creator: "Blender version 2.79 (sub 0)" + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 11 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Camera", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",7.481131553649902,5.343665122985840,6.507639884948730 + Property: "Lcl Rotation", "Lcl Rotation", "A+",22.768806135967264,142.108342135190838,34.348488581189514 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",49.134342 + Property: "FieldOfViewX", "FieldOfView", "A+",49.134342 + Property: "FieldOfViewY", "FieldOfView", "A+",28.841546 + Property: "FocalLength", "Number", "A+",35.000000 + Property: "FilmOffsetX", "Number", "A+",0.000000 + Property: "FilmOffsetY", "Number", "A+",0.000000 + Property: "BackgroundColor", "Color", "A+",0,0,0 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",3 + Property: "GateFit", "enum", "",2 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",1920 + Property: "AspectH", "double", "",1080 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",0.100000 + Property: "FarPlane", "double", "",99.999994 + Property: "FilmWidth", "double", "",1.259843 + Property: "FilmHeight", "double", "",0.708661 + Property: "FilmAspectRatio", "double", "",1.777778 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",0 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.777778 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 7.481132,5.343665,6.507640 + Up: -0.324014,0.895396,-0.305421 + LookAt: -0.685921,0.000000,0.727677 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Lamp", "Light" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4.076245307922363,5.903861999511719,-1.005453944206238 + Property: "Lcl Rotation", "Lcl Rotation", "A+",47.533574547422390,107.220753553002154,10.743666437040241 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,0.999999940395355,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + Property: "LightType", "enum", "",0 + Property: "CastLightOnObject", "bool", "",1 + Property: "DrawVolumetricLight", "bool", "",1 + Property: "DrawGroundProjection", "bool", "",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "",0 + Property: "GoboProperty", "object", "" + Property: "Color", "Color", "A+",1,1,1 + Property: "Fog", "Fog", "A+",50 + Property: "Color", "Color", "A",1.00,1.00,1.00 + Property: "Intensity", "Intensity", "A+",100.00 + Property: "Fog", "Fog", "A+",50 + Property: "LightType", "enum", "",0 + Property: "CastLightOnObject", "bool", "",1 + Property: "DrawGroundProjection", "bool", "",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "",0 + Property: "DrawVolumetricLight", "bool", "",1 + Property: "GoboProperty", "object", "" + Property: "DecayType", "enum", "",2 + Property: "EnableFarAttenuation", "bool", "",1 + Property: "FarAttenuationEnd", "double", "",60.00 + Property: "CastShadows", "bool", "",1 + Property: "ShadowColor", "ColorRGBA", "",0,0,0,1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Light" + GeometryVersion: 124 + } + Model: "Model::Cube", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: 1.000000,1.000000,-1.000000,1.000000,-1.000000,-1.000000,-1.000000,-1.000000,-1.000000,-1.000000,1.000000,-1.000000, + 1.000000,0.999999,1.000000,0.999999,-1.000001,1.000000,-1.000000,-1.000000,1.000000,-1.000000,1.000000,1.000000 + PolygonVertexIndex: 0,1,2,-4,4,7,6,-6,0,4,5,-2,1,5,6,-3,2,6,7,-4,4,0,3,-8 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000, + -0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000, + -1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::Material", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 1 + PoseNode: { + Node: "Model::Cube" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Cube", "Mesh" { + } + Model: "Model::Camera", "Camera" { + } + Model: "Model::Lamp", "Light" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::Material", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Cube", "Model::Scene" + Connect: "OO", "Model::Lamp", "Model::Scene" + Connect: "OO", "Model::Camera", "Model::Scene" + Connect: "OO", "Material::Material", "Model::Cube" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Cube" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Camera" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 7.481131553649902 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,7.481131553649902,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 5.343665122985840 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,5.343665122985840,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 6.507639884948730 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,6.507639884948730,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 22.768802720872678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,22.768802720872678,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 142.108328474812481 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,142.108328474812481,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 34.348495411378678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,34.348495411378678,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Lamp" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 4.076245307922363 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,4.076245307922363,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 5.903861999511719 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,5.903861999511719,L + Color: 0,1,0 + } + Channel: "Z" { + Default: -1.005453944206238 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-1.005453944206238,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 47.533574547422390 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,47.533574547422390,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 107.220760383191333 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,107.220760383191333,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 10.743664729492949 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,10.743664729492949,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.999999940395355 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.999999940395355,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/blender_279_default_7400_binary.fbx b/modules/ufbx/data/blender_279_default_7400_binary.fbx new file mode 100644 index 0000000..ee293d9 Binary files /dev/null and b/modules/ufbx/data/blender_279_default_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_edge_circle_6100_ascii.fbx b/modules/ufbx/data/blender_279_edge_circle_6100_ascii.fbx new file mode 100644 index 0000000..615bde3 --- /dev/null +++ b/modules/ufbx/data/blender_279_edge_circle_6100_ascii.fbx @@ -0,0 +1,1639 @@ +; FBX 6.1.0 project file +; Created by Blender FBX Exporter +; for support mail: ideasman42@gmail.com +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 09 + Day: 13 + Hour: 14 + Minute: 16 + Second: 18 + Millisecond: 0 + } + Creator: "FBX SDK/FBX Plugins build 20070228" + OtherFlags: { + FlagPLE: 0 + } +} +CreationTime: "2020-09-13 14:16:18:000" +Creator: "Blender version 2.79 (sub 0)" + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 11 + ObjectType: "Model" { + Count: 9 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Circle", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: 0.000000,1.000000,0.000000,-0.024541,0.999699,0.000000,-0.049068,0.998795,0.000000,-0.073565,0.997290,0.000000, + -0.098017,0.995185,0.000000,-0.122411,0.992480,0.000000,-0.146730,0.989177,0.000000,-0.170962,0.985278,0.000000, + -0.195090,0.980785,0.000000,-0.219101,0.975702,0.000000,-0.242980,0.970031,0.000000,-0.266713,0.963776,0.000000, + -0.290285,0.956940,0.000000,-0.313682,0.949528,0.000000,-0.336890,0.941544,0.000000,-0.359895,0.932993,0.000000, + -0.382683,0.923880,0.000000,-0.405241,0.914210,0.000000,-0.427555,0.903989,0.000000,-0.449611,0.893224,0.000000, + -0.471397,0.881921,0.000000,-0.492898,0.870087,0.000000,-0.514103,0.857729,0.000000,-0.534998,0.844854,0.000000, + -0.555570,0.831470,0.000000,-0.575808,0.817585,0.000000,-0.595699,0.803207,0.000000,-0.615232,0.788346,0.000000, + -0.634393,0.773010,0.000000,-0.653173,0.757209,0.000000,-0.671559,0.740951,0.000000,-0.689541,0.724247,0.000000, + -0.707107,0.707107,0.000000,-0.724247,0.689540,0.000000,-0.740951,0.671559,0.000000,-0.757209,0.653173,0.000000, + -0.773011,0.634393,0.000000,-0.788347,0.615231,0.000000,-0.803208,0.595699,0.000000,-0.817585,0.575808,0.000000, + -0.831470,0.555570,0.000000,-0.844854,0.534997,0.000000,-0.857729,0.514103,0.000000,-0.870087,0.492898,0.000000, + -0.881921,0.471397,0.000000,-0.893224,0.449611,0.000000,-0.903989,0.427555,0.000000,-0.914210,0.405241,0.000000, + -0.923880,0.382684,0.000000,-0.932993,0.359895,0.000000,-0.941544,0.336890,0.000000,-0.949528,0.313682,0.000000, + -0.956940,0.290285,0.000000,-0.963776,0.266713,0.000000,-0.970031,0.242981,0.000000,-0.975702,0.219102,0.000000, + -0.980785,0.195091,0.000000,-0.985278,0.170962,0.000000,-0.989176,0.146731,0.000000,-0.992479,0.122411,0.000000, + -0.995185,0.098018,0.000000,-0.997290,0.073565,0.000000,-0.998795,0.049068,0.000000,-0.999699,0.024542,0.000000, + -1.000000,0.000001,0.000000,-0.999699,-0.024540,0.000000,-0.998796,-0.049067,0.000000,-0.997291,-0.073564,0.000000, + -0.995185,-0.098016,0.000000,-0.992480,-0.122410,0.000000,-0.989177,-0.146729,0.000000,-0.985278,-0.170961,0.000000, + -0.980786,-0.195089,0.000000,-0.975702,-0.219100,0.000000,-0.970032,-0.242979,0.000000,-0.963776,-0.266711,0.000000, + -0.956941,-0.290283,0.000000,-0.949529,-0.313680,0.000000,-0.941545,-0.336888,0.000000,-0.932993,-0.359894,0.000000, + -0.923880,-0.382682,0.000000,-0.914210,-0.405240,0.000000,-0.903990,-0.427554,0.000000,-0.893225,-0.449610,0.000000, + -0.881922,-0.471395,0.000000,-0.870088,-0.492897,0.000000,-0.857729,-0.514102,0.000000,-0.844854,-0.534997,0.000000, + -0.831470,-0.555569,0.000000,-0.817586,-0.575807,0.000000,-0.803208,-0.595698,0.000000,-0.788347,-0.615231,0.000000, + -0.773011,-0.634392,0.000000,-0.757209,-0.653172,0.000000,-0.740952,-0.671558,0.000000,-0.724248,-0.689540,0.000000, + -0.707107,-0.707106,0.000000,-0.689541,-0.724247,0.000000,-0.671559,-0.740951,0.000000,-0.653173,-0.757209,0.000000, + -0.634394,-0.773010,0.000000,-0.615232,-0.788346,0.000000,-0.595700,-0.803207,0.000000,-0.575808,-0.817585,0.000000, + -0.555570,-0.831470,0.000000,-0.534998,-0.844854,0.000000,-0.514103,-0.857729,0.000000,-0.492898,-0.870087,0.000000, + -0.471397,-0.881921,0.000000,-0.449611,-0.893224,0.000000,-0.427555,-0.903989,0.000000,-0.405241,-0.914210,0.000000, + -0.382683,-0.923880,0.000000,-0.359895,-0.932993,0.000000,-0.336889,-0.941544,0.000000,-0.313681,-0.949528,0.000000, + -0.290284,-0.956941,0.000000,-0.266712,-0.963776,0.000000,-0.242979,-0.970031,0.000000,-0.219100,-0.975702,0.000000, + -0.195089,-0.980785,0.000000,-0.170961,-0.985278,0.000000,-0.146729,-0.989177,0.000000,-0.122410,-0.992480,0.000000, + -0.098016,-0.995185,0.000000,-0.073563,-0.997291,0.000000,-0.049066,-0.998796,0.000000,-0.024540,-0.999699,0.000000, + 0.000002,-1.000000,0.000000,0.024543,-0.999699,0.000000,0.049069,-0.998795,0.000000,0.073566,-0.997290,0.000000, + 0.098019,-0.995185,0.000000,0.122413,-0.992479,0.000000,0.146732,-0.989176,0.000000,0.170964,-0.985277,0.000000, + 0.195092,-0.980785,0.000000,0.219103,-0.975702,0.000000,0.242982,-0.970031,0.000000,0.266715,-0.963775,0.000000, + 0.290287,-0.956940,0.000000,0.313684,-0.949527,0.000000,0.336892,-0.941543,0.000000,0.359897,-0.932992,0.000000, + 0.382686,-0.923879,0.000000,0.405244,-0.914209,0.000000,0.427558,-0.903988,0.000000,0.449614,-0.893223,0.000000, + 0.471399,-0.881920,0.000000,0.492901,-0.870086,0.000000,0.514105,-0.857727,0.000000,0.535000,-0.844852,0.000000, + 0.555573,-0.831468,0.000000,0.575811,-0.817583,0.000000,0.595702,-0.803206,0.000000,0.615234,-0.788344,0.000000, + 0.634396,-0.773008,0.000000,0.653176,-0.757207,0.000000,0.671562,-0.740949,0.000000,0.689543,-0.724245,0.000000, + 0.707109,-0.707104,0.000000,0.724250,-0.689538,0.000000,0.740954,-0.671556,0.000000,0.757211,-0.653170,0.000000, + 0.773013,-0.634390,0.000000,0.788349,-0.615229,0.000000,0.803210,-0.595696,0.000000,0.817587,-0.575805,0.000000, + 0.831472,-0.555567,0.000000,0.844856,-0.534994,0.000000,0.857731,-0.514099,0.000000,0.870089,-0.492894,0.000000, + 0.881923,-0.471393,0.000000,0.893226,-0.449607,0.000000,0.903991,-0.427551,0.000000,0.914212,-0.405237,0.000000, + 0.923881,-0.382679,0.000000,0.932994,-0.359891,0.000000,0.941546,-0.336885,0.000000,0.949530,-0.313677,0.000000, + 0.956942,-0.290280,0.000000,0.963777,-0.266708,0.000000,0.970032,-0.242975,0.000000,0.975703,-0.219096,0.000000, + 0.980786,-0.195085,0.000000,0.985279,-0.170957,0.000000,0.989177,-0.146725,0.000000,0.992480,-0.122405,0.000000, + 0.995185,-0.098012,0.000000,0.997291,-0.073559,0.000000,0.998796,-0.049062,0.000000,0.999699,-0.024536,0.000000, + 1.000000,0.000006,0.000000,0.999699,0.024547,0.000000,0.998795,0.049074,0.000000,0.997290,0.073570,0.000000, + 0.995184,0.098023,0.000000,0.992479,0.122417,0.000000,0.989176,0.146737,0.000000,0.985277,0.170968,0.000000, + 0.980784,0.195096,0.000000,0.975701,0.219107,0.000000,0.970030,0.242986,0.000000,0.963774,0.266719,0.000000, + 0.956938,0.290291,0.000000,0.949526,0.313688,0.000000,0.941542,0.336896,0.000000,0.932990,0.359901,0.000000, + 0.923877,0.382690,0.000000,0.914207,0.405248,0.000000,0.903986,0.427561,0.000000,0.893221,0.449618,0.000000, + 0.881918,0.471403,0.000000,0.870083,0.492904,0.000000,0.857725,0.514109,0.000000,0.844850,0.535004,0.000000, + 0.831465,0.555576,0.000000,0.817581,0.575814,0.000000,0.803203,0.595705,0.000000,0.788342,0.615238,0.000000, + 0.773006,0.634399,0.000000,0.757204,0.653179,0.000000,0.740946,0.671565,0.000000,0.724242,0.689546,0.000000, + 0.707101,0.707112,0.000000,0.689535,0.724253,0.000000,0.671553,0.740957,0.000000,0.653167,0.757214,0.000000, + 0.634387,0.773016,0.000000,0.615225,0.788352,0.000000,0.595693,0.803213,0.000000,0.575801,0.817590,0.000000, + 0.555563,0.831474,0.000000,0.534990,0.844858,0.000000,0.514095,0.857733,0.000000,0.492891,0.870091,0.000000, + 0.471389,0.881925,0.000000,0.449603,0.893228,0.000000,0.427547,0.903993,0.000000,0.405233,0.914213,0.000000, + 0.382675,0.923883,0.000000,0.359886,0.932996,0.000000,0.336881,0.941547,0.000000,0.313673,0.949531,0.000000, + 0.290276,0.956943,0.000000,0.266704,0.963779,0.000000,0.242971,0.970034,0.000000,0.219092,0.975704,0.000000, + 0.195081,0.980787,0.000000,0.170952,0.985279,0.000000,0.146721,0.989178,0.000000,0.122401,0.992481,0.000000, + 0.098007,0.995186,0.000000,0.073555,0.997291,0.000000,0.049058,0.998796,0.000000,0.024531,0.999699,0.000000 + PolygonVertexIndex: 1,-1,2,-2,3,-3,4,-4,5,-5,6,-6,7,-7,8,-8,9,-9,10,-10,11,-11,12,-12,13,-13,14,-14,15,-15,16,-16, + 17,-17,18,-18,19,-19,20,-20,21,-21,22,-22,23,-23,24,-24,25,-25,26,-26,27,-27,28,-28,29,-29,30,-30,31,-31,32,-32, + 33,-33,34,-34,35,-35,36,-36,37,-37,38,-38,39,-39,40,-40,41,-41,42,-42,43,-43,44,-44,45,-45,46,-46,47,-47,48,-48, + 49,-49,50,-50,51,-51,52,-52,53,-53,54,-54,55,-55,56,-56,57,-57,58,-58,59,-59,60,-60,61,-61,62,-62,63,-63,64,-64, + 65,-65,66,-66,67,-67,68,-68,69,-69,70,-70,71,-71,72,-72,73,-73,74,-74,75,-75,76,-76,77,-77,78,-78,79,-79,80,-80, + 81,-81,82,-82,83,-83,84,-84,85,-85,86,-86,87,-87,88,-88,89,-89,90,-90,91,-91,92,-92,93,-93,94,-94,95,-95,96,-96, + 97,-97,98,-98,99,-99,100,-100,101,-101,102,-102,103,-103,104,-104,105,-105,106,-106,107,-107,108,-108,109,-109,110,-110,111,-111,112,-112, + 113,-113,114,-114,115,-115,116,-116,117,-117,118,-118,119,-119,120,-120,121,-121,122,-122,123,-123,124,-124,125,-125,126,-126,127,-127,128,-128, + 129,-129,130,-130,131,-131,132,-132,133,-133,134,-134,135,-135,136,-136,137,-137,138,-138,139,-139,140,-140,141,-141,142,-142,143,-143,144,-144, + 145,-145,146,-146,147,-147,148,-148,149,-149,150,-150,151,-151,152,-152,153,-153,154,-154,155,-155,156,-156,157,-157,158,-158,159,-159,160,-160, + 161,-161,162,-162,163,-163,164,-164,165,-165,166,-166,167,-167,168,-168,169,-169,170,-170,171,-171,172,-172,173,-173,174,-174,175,-175,176,-176, + 177,-177,178,-178,179,-179,180,-180,181,-181,182,-182,183,-183,184,-184,185,-185,186,-186,187,-187,188,-188,189,-189,190,-190,191,-191,192,-192, + 193,-193,194,-194,195,-195,196,-196,197,-197,198,-198,199,-199,200,-200,201,-201,202,-202,203,-203,204,-204,205,-205,206,-206,207,-207,208,-208, + 209,-209,210,-210,211,-211,212,-212,213,-213,214,-214,215,-215,216,-216,217,-217,218,-218,219,-219,220,-220,221,-221,222,-222,223,-223,224,-224, + 225,-225,226,-226,227,-227,228,-228,229,-229,230,-230,231,-231,232,-232,233,-233,234,-234,235,-235,236,-236,237,-237,238,-238,239,-239,240,-240, + 241,-241,242,-242,243,-243,244,-244,245,-245,246,-246,247,-247,248,-248,249,-249,250,-250,251,-251,252,-252,253,-253,254,-254,255,-255,0,-256 + Edges: 1,0,2,1,3,2,4,3,5,4,6,5,7,6,8,7,9,8,10,9,11,10,12,11,13,12,14,13,15,14,16,15, + 17,16,18,17,19,18,20,19,21,20,22,21,23,22,24,23,25,24,26,25,27,26,28,27,29,28,30,29,31,30,32,31, + 33,32,34,33,35,34,36,35,37,36,38,37,39,38,40,39,41,40,42,41,43,42,44,43,45,44,46,45,47,46,48,47, + 49,48,50,49,51,50,52,51,53,52,54,53,55,54,56,55,57,56,58,57,59,58,60,59,61,60,62,61,63,62,64,63, + 65,64,66,65,67,66,68,67,69,68,70,69,71,70,72,71,73,72,74,73,75,74,76,75,77,76,78,77,79,78,80,79, + 81,80,82,81,83,82,84,83,85,84,86,85,87,86,88,87,89,88,90,89,91,90,92,91,93,92,94,93,95,94,96,95, + 97,96,98,97,99,98,100,99,101,100,102,101,103,102,104,103,105,104,106,105,107,106,108,107,109,108,110,109,111,110,112,111, + 113,112,114,113,115,114,116,115,117,116,118,117,119,118,120,119,121,120,122,121,123,122,124,123,125,124,126,125,127,126,128,127, + 129,128,130,129,131,130,132,131,133,132,134,133,135,134,136,135,137,136,138,137,139,138,140,139,141,140,142,141,143,142,144,143, + 145,144,146,145,147,146,148,147,149,148,150,149,151,150,152,151,153,152,154,153,155,154,156,155,157,156,158,157,159,158,160,159, + 161,160,162,161,163,162,164,163,165,164,166,165,167,166,168,167,169,168,170,169,171,170,172,171,173,172,174,173,175,174,176,175, + 177,176,178,177,179,178,180,179,181,180,182,181,183,182,184,183,185,184,186,185,187,186,188,187,189,188,190,189,191,190,192,191, + 193,192,194,193,195,194,196,195,197,196,198,197,199,198,200,199,201,200,202,201,203,202,204,203,205,204,206,205,207,206,208,207, + 209,208,210,209,211,210,212,211,213,212,214,213,215,214,216,215,217,216,218,217,219,218,220,219,221,220,222,221,223,222,224,223, + 225,224,226,225,227,226,228,227,229,228,230,229,231,230,232,231,233,232,234,233,235,234,236,235,237,236,238,237,239,238,240,239, + 241,240,242,241,243,242,244,243,245,244,246,245,247,246,248,247,249,248,250,249,251,250,252,251,253,252,254,253,255,254,0,255 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::unnamed", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 1 + PoseNode: { + Node: "Model::Circle" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Circle", "Mesh" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::unnamed", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Circle", "Model::Scene" + Connect: "OO", "Material::unnamed", "Model::Circle" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Circle" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/blender_279_edge_circle_7400_binary.fbx b/modules/ufbx/data/blender_279_edge_circle_7400_binary.fbx new file mode 100644 index 0000000..f8acf07 Binary files /dev/null and b/modules/ufbx/data/blender_279_edge_circle_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_edge_vertex_6100_ascii.fbx b/modules/ufbx/data/blender_279_edge_vertex_6100_ascii.fbx new file mode 100644 index 0000000..5bcb9ed --- /dev/null +++ b/modules/ufbx/data/blender_279_edge_vertex_6100_ascii.fbx @@ -0,0 +1,1546 @@ +; FBX 6.1.0 project file +; Created by Blender FBX Exporter +; for support mail: ideasman42@gmail.com +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 09 + Day: 13 + Hour: 13 + Minute: 58 + Second: 54 + Millisecond: 0 + } + Creator: "FBX SDK/FBX Plugins build 20070228" + OtherFlags: { + FlagPLE: 0 + } +} +CreationTime: "2020-09-13 13:58:54:000" +Creator: "Blender version 2.79 (sub 0)" + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 11 + ObjectType: "Model" { + Count: 9 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Plane", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: -1.000000,-1.000000,0.000000,1.000000,-1.000000,0.000000,-1.000000,1.000000,0.000000 + PolygonVertexIndex: 0,-2 + Edges: 0,1 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::unnamed", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 1 + PoseNode: { + Node: "Model::Plane" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Plane", "Mesh" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::unnamed", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Plane", "Model::Scene" + Connect: "OO", "Material::unnamed", "Model::Plane" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Plane" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/blender_279_edge_vertex_7400_binary.fbx b/modules/ufbx/data/blender_279_edge_vertex_7400_binary.fbx new file mode 100644 index 0000000..58de9b9 Binary files /dev/null and b/modules/ufbx/data/blender_279_edge_vertex_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_empty_cube_6100_ascii.fbx b/modules/ufbx/data/blender_279_empty_cube_6100_ascii.fbx new file mode 100644 index 0000000..a9eb40c --- /dev/null +++ b/modules/ufbx/data/blender_279_empty_cube_6100_ascii.fbx @@ -0,0 +1,1546 @@ +; FBX 6.1.0 project file +; Created by Blender FBX Exporter +; for support mail: ideasman42@gmail.com +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 11 + Day: 29 + Hour: 19 + Minute: 28 + Second: 13 + Millisecond: 0 + } + Creator: "FBX SDK/FBX Plugins build 20070228" + OtherFlags: { + FlagPLE: 0 + } +} +CreationTime: "2022-11-29 19:28:13:000" +Creator: "Blender version 2.79 (sub 0)" + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 11 + ObjectType: "Model" { + Count: 9 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Cube", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: + PolygonVertexIndex: + Edges: + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::Material_001", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 1 + PoseNode: { + Node: "Model::Cube" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Cube", "Mesh" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::Material_001", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Cube", "Model::Scene" + Connect: "OO", "Material::Material_001", "Model::Cube" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Cube" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/blender_279_empty_cube_7400_binary.fbx b/modules/ufbx/data/blender_279_empty_cube_7400_binary.fbx new file mode 100644 index 0000000..a12b3d6 Binary files /dev/null and b/modules/ufbx/data/blender_279_empty_cube_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_internal_textures_7400_binary.fbx b/modules/ufbx/data/blender_279_internal_textures_7400_binary.fbx new file mode 100644 index 0000000..f7d6806 Binary files /dev/null and b/modules/ufbx/data/blender_279_internal_textures_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_nested_meshes.obj b/modules/ufbx/data/blender_279_nested_meshes.obj new file mode 100644 index 0000000..092a26b --- /dev/null +++ b/modules/ufbx/data/blender_279_nested_meshes.obj @@ -0,0 +1,179 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -100.000000 -99.999984 100.000016 +v -100.000000 100.000016 99.999984 +v -100.000000 -100.000016 -99.999984 +v -100.000000 99.999984 -100.000016 +v 100.000000 -99.999984 100.000016 +v 100.000000 100.000016 99.999984 +v 100.000000 -100.000016 -99.999984 +v 100.000000 99.999984 -100.000016 +vn -1.000000 0.000000 -0.000000 +vn -1.000000 0.000000 -0.000000 +vn -1.000000 0.000000 -0.000000 +vn -1.000000 0.000000 -0.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +s off +g CubeFBXASC046001 +f 1//1 2//2 4//3 3//4 +f 3//5 4//6 8//7 7//8 +f 7//9 8//10 6//11 5//12 +f 5//13 6//14 2//15 1//16 +f 3//17 7//18 5//19 1//20 +f 8//21 4//22 2//23 6//24 +g default +v 197.583224 193.951703 -76.118610 +v -182.971705 290.435579 -234.286480 +v 145.165263 230.906611 9.318881 +v 78.463071 194.765819 84.535448 +v 130.881032 157.810913 -0.902039 +vn 0.319483 0.925323 -0.204226 +vn 0.319483 0.925323 -0.204226 +vn 0.319483 0.925323 -0.204226 +vn -0.098113 0.928177 0.358973 +vn -0.098113 0.928177 0.358973 +vn -0.098113 0.928177 0.358973 +vn -0.452538 -0.885498 0.105368 +vn -0.452538 -0.885498 0.105368 +vn -0.452538 -0.885498 0.105368 +vn -0.034942 -0.888352 -0.457831 +vn -0.034942 -0.888352 -0.457831 +vn -0.034942 -0.888352 -0.457831 +vn 0.780485 -0.233606 0.579890 +vn 0.780485 -0.233606 0.579890 +vn 0.780485 -0.233606 0.579890 +vn 0.780485 -0.233606 0.579890 +s off +g CubeFBXASC046001 SpaceFBXASC032Cone +f 9//25 10//26 11//27 +f 11//28 10//29 12//30 +f 12//31 10//32 13//33 +f 13//34 10//35 9//36 +f 9//37 11//38 12//39 13//40 +g default +v -101.179661 151.211242 190.961505 +v 104.427292 179.828822 273.855201 +v -163.773779 235.928872 159.201358 +v -315.586777 230.941757 45.919290 +v -141.204840 171.758585 90.564298 +v 118.375546 140.169738 231.435522 +v 17.092532 277.246586 180.044197 +v -242.487854 308.835433 39.172973 +v -228.539600 269.176349 -3.246706 +v 39.661471 213.076299 111.407137 +v 191.474469 218.063414 224.689205 +v -22.932647 297.793929 79.646990 +vn -0.380843 0.064412 0.922394 +vn -0.380843 0.064412 0.922394 +vn -0.380843 0.064412 0.922394 +vn -0.156730 -0.746634 0.646509 +vn -0.156730 -0.746634 0.646509 +vn -0.156730 -0.746634 0.646509 +vn -0.589500 -0.137123 0.796045 +vn -0.589500 -0.137123 0.796045 +vn -0.589500 -0.137123 0.796045 +vn -0.303621 -0.949963 -0.073376 +vn -0.303621 -0.949963 -0.073376 +vn -0.303621 -0.949963 -0.073376 +vn -0.013296 -0.980634 -0.195396 +vn -0.013296 -0.980634 -0.195396 +vn -0.013296 -0.980634 -0.195396 +vn 0.581856 -0.489808 0.649255 +vn 0.581856 -0.489808 0.649255 +vn 0.581856 -0.489808 0.649255 +vn -0.220899 0.566484 0.793914 +vn -0.220899 0.566484 0.793914 +vn -0.220899 0.566484 0.793914 +vn -0.514501 0.540487 0.665705 +vn -0.514501 0.540487 0.665705 +vn -0.514501 0.540487 0.665705 +vn -0.069866 -0.723742 -0.686525 +vn -0.069866 -0.723742 -0.686525 +vn -0.069866 -0.723742 -0.686525 +vn 0.242305 -0.750546 -0.614792 +vn 0.242305 -0.750546 -0.614792 +vn 0.242305 -0.750546 -0.614792 +vn 0.069866 0.723742 0.686525 +vn 0.069866 0.723742 0.686525 +vn 0.069866 0.723742 0.686525 +vn -0.242305 0.750546 0.614792 +vn -0.242305 0.750546 0.614792 +vn -0.242305 0.750546 0.614792 +vn -0.581856 0.489808 -0.649255 +vn -0.581856 0.489808 -0.649255 +vn -0.581856 0.489808 -0.649255 +vn 0.220899 -0.566484 -0.793914 +vn 0.220899 -0.566484 -0.793914 +vn 0.220899 -0.566484 -0.793914 +vn 0.514501 -0.540487 -0.665705 +vn 0.514501 -0.540487 -0.665705 +vn 0.514501 -0.540487 -0.665705 +vn 0.303621 0.949963 0.073376 +vn 0.303621 0.949963 0.073376 +vn 0.303621 0.949963 0.073376 +vn 0.013296 0.980634 0.195396 +vn 0.013296 0.980634 0.195396 +vn 0.013296 0.980634 0.195396 +vn 0.156730 0.746634 -0.646509 +vn 0.156730 0.746634 -0.646509 +vn 0.156730 0.746634 -0.646509 +vn 0.380843 -0.064412 -0.922394 +vn 0.380843 -0.064412 -0.922394 +vn 0.380843 -0.064412 -0.922394 +vn 0.589500 0.137123 -0.796045 +vn 0.589500 0.137123 -0.796045 +vn 0.589500 0.137123 -0.796045 +s off +g CubeFBXASC046001 IcoFBXASC046FBXASC032FBXASC046Sphere +f 14//41 15//42 16//43 +f 15//44 14//45 19//46 +f 14//47 16//48 17//49 +f 14//50 17//51 18//52 +f 14//53 18//54 19//55 +f 15//56 19//57 24//58 +f 16//59 15//60 20//61 +f 17//62 16//63 21//64 +f 18//65 17//66 22//67 +f 19//68 18//69 23//70 +f 15//71 24//72 20//73 +f 16//74 20//75 21//76 +f 17//77 21//78 22//79 +f 18//80 22//81 23//82 +f 19//83 23//84 24//85 +f 20//86 24//87 25//88 +f 21//89 20//90 25//91 +f 22//92 21//93 25//94 +f 23//95 22//96 25//97 +f 24//98 23//99 25//100 +g default +v -152.919693 371.478976 111.425983 +v 27.280693 286.450085 89.921433 +v -27.280650 454.809441 -89.921519 +v 152.919736 369.780550 -111.426068 +vn 0.408272 0.724935 0.554782 +vn 0.408272 0.724935 0.554782 +vn 0.408272 0.724935 0.554782 +vn 0.408272 0.724935 0.554782 +s off +g CubeFBXASC046001 SpaceFBXASC032Cone DeepFBXASC032Plane +f 26//101 27//102 29//103 28//104 diff --git a/modules/ufbx/data/blender_279_nested_meshes_7400_binary.fbx b/modules/ufbx/data/blender_279_nested_meshes_7400_binary.fbx new file mode 100644 index 0000000..c971845 Binary files /dev/null and b/modules/ufbx/data/blender_279_nested_meshes_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_sausage_6100_ascii.fbx b/modules/ufbx/data/blender_279_sausage_6100_ascii.fbx new file mode 100644 index 0000000..dd4a417 --- /dev/null +++ b/modules/ufbx/data/blender_279_sausage_6100_ascii.fbx @@ -0,0 +1,3910 @@ +; FBX 6.1.0 project file +; Created by Blender FBX Exporter +; for support mail: ideasman42@gmail.com +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 04 + Day: 04 + Hour: 14 + Minute: 55 + Second: 53 + Millisecond: 0 + } + Creator: "FBX SDK/FBX Plugins build 20070228" + OtherFlags: { + FlagPLE: 0 + } +} +CreationTime: "2020-04-04 14:55:53:000" +Creator: "Blender version 2.79 (sub 0)" + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 18 + ObjectType: "Model" { + Count: 13 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Skeleton", "Limb" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + } + Model: "Model::Skin", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,-0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: -0.937500,0.000000,5.250000,-0.875000,-0.375000,5.250000,-0.937500,0.000000,5.625000,-0.875000,0.375000,5.250000, + -0.937500,0.000000,4.875000,-0.875000,-0.375000,4.875000,-0.875000,-0.375000,5.625000,-0.875000,0.375000,5.625000, + -0.875000,0.375000,4.875000,0.031250,0.968750,5.250000,-0.375000,0.875000,5.250000,0.031250,0.968750,5.625000, + 0.500000,1.000000,5.250000,0.031250,0.968750,4.875000,-0.375000,0.875000,4.875000,-0.375000,0.875000,5.625000, + 0.500000,1.000000,5.625000,0.500000,1.000000,4.875000,0.968750,0.031250,5.250000,1.000000,0.500000,5.250000, + 0.968750,0.031250,5.625000,0.875000,-0.375000,5.250000,0.968750,0.031250,4.875000,1.000000,0.500000,4.875000, + 1.000000,0.500000,5.625000,0.875000,-0.375000,5.625000,0.875000,-0.375000,4.875000,0.000000,-0.937500,5.250000, + 0.375000,-0.875000,5.250000,0.000000,-0.937500,5.625000,-0.375000,-0.875000,5.250000,0.000000,-0.937500,4.875000, + 0.375000,-0.875000,4.875000,0.375000,-0.875000,5.625000,-0.375000,-0.875000,5.625000,-0.375000,-0.875000,4.875000, + 0.000000,0.000000,0.091146,0.000000,0.350694,0.135417,0.350694,0.000000,0.135417,0.000000,-0.350694,0.135417, + -0.350694,0.000000,0.135417,-0.326389,0.326389,0.177083,0.326389,0.326389,0.177083,0.326389,-0.326389,0.177083, + -0.326389,-0.326389,0.177083,0.003906,0.003906,6.000000,0.015625,0.484375,6.000000,-0.468750,0.000000,6.000000, + 0.000000,-0.468750,6.000000,0.484375,0.015625,6.000000,0.500000,0.500000,6.000000,-0.437500,0.437500,6.000000, + -0.437500,-0.437500,6.000000,0.437500,-0.437500,6.000000,0.000000,-0.907986,0.777995,0.362847,-0.847222,0.782552, + 0.000000,-0.937500,1.125000,-0.362847,-0.847222,0.782552,0.000000,-0.819444,0.486979,0.326389,-0.763889,0.505208, + 0.375000,-0.875000,1.125000,-0.375000,-0.875000,1.125000,-0.326389,-0.763889,0.505208,0.000000,-0.937500,2.250000, + 0.375000,-0.875000,2.250000,0.000000,-0.937500,2.625000,-0.375000,-0.875000,2.250000,0.000000,-0.937500,1.875000, + 0.375000,-0.875000,1.875000,0.375000,-0.875000,2.625000,-0.375000,-0.875000,2.625000,-0.375000,-0.875000,1.875000, + 0.000000,-0.937500,3.750000,0.375000,-0.875000,3.750000,0.000000,-0.937500,4.125000,-0.375000,-0.875000,3.750000, + 0.000000,-0.937500,3.375000,0.375000,-0.875000,3.375000,0.375000,-0.875000,4.125000,-0.375000,-0.875000,4.125000, + -0.375000,-0.875000,3.375000,0.935330,0.027344,0.777995,0.956597,0.472222,0.782552,0.968750,0.031250,1.125000, + 0.847222,-0.362847,0.782552,0.835069,0.015625,0.486979,0.826389,0.388889,0.505208,1.000000,0.500000,1.125000, + 0.875000,-0.375000,1.125000,0.763889,-0.326389,0.505208,0.968750,0.031250,2.250000,1.000000,0.500000,2.250000, + 0.968750,0.031250,2.625000,0.875000,-0.375000,2.250000,0.968750,0.031250,1.875000,1.000000,0.500000,1.875000, + 1.000000,0.500000,2.625000,0.875000,-0.375000,2.625000,0.875000,-0.375000,1.875000,0.968750,0.031250,3.750000, + 1.000000,0.500000,3.750000,0.968750,0.031250,4.125000,0.875000,-0.375000,3.750000,0.968750,0.031250,3.375000, + 1.000000,0.500000,3.375000,1.000000,0.500000,4.125000,0.875000,-0.375000,4.125000,0.875000,-0.375000,3.375000, + 0.027344,0.935330,0.777995,-0.362847,0.847222,0.782552,0.031250,0.968750,1.125000,0.472222,0.956597,0.782552, + 0.015625,0.835069,0.486979,-0.326389,0.763889,0.505208,-0.375000,0.875000,1.125000,0.500000,1.000000,1.125000, + 0.388889,0.826389,0.505208,0.031250,0.968750,2.250000,-0.375000,0.875000,2.250000,0.031250,0.968750,2.625000, + 0.500000,1.000000,2.250000,0.031250,0.968750,1.875000,-0.375000,0.875000,1.875000,-0.375000,0.875000,2.625000, + 0.500000,1.000000,2.625000,0.500000,1.000000,1.875000,0.031250,0.968750,3.750000,-0.375000,0.875000,3.750000, + 0.031250,0.968750,4.125000,0.500000,1.000000,3.750000,0.031250,0.968750,3.375000,-0.375000,0.875000,3.375000, + -0.375000,0.875000,4.125000,0.500000,1.000000,4.125000,0.500000,1.000000,3.375000,-0.907986,0.000000,0.777995, + -0.847222,-0.362847,0.782552,-0.937500,0.000000,1.125000,-0.847222,0.362847,0.782552,-0.819444,0.000000,0.486979, + -0.763889,-0.326389,0.505208,-0.875000,-0.375000,1.125000,-0.875000,0.375000,1.125000,-0.763889,0.326389,0.505208, + -0.937500,0.000000,2.250000,-0.875000,-0.375000,2.250000,-0.937500,0.000000,2.625000,-0.875000,0.375000,2.250000, + -0.937500,0.000000,1.875000,-0.875000,-0.375000,1.875000,-0.875000,-0.375000,2.625000,-0.875000,0.375000,2.625000, + -0.875000,0.375000,1.875000,-0.937500,0.000000,3.750000,-0.875000,-0.375000,3.750000,-0.937500,0.000000,4.125000, + -0.875000,0.375000,3.750000,-0.937500,0.000000,3.375000,-0.875000,-0.375000,3.375000,-0.875000,-0.375000,4.125000, + -0.875000,0.375000,4.125000,-0.875000,0.375000,3.375000,-0.598958,0.302083,0.300781,-0.643229,0.000000,0.267578, + -0.598958,-0.302083,0.300781,-0.687500,-0.687500,4.875000,-0.687500,-0.687500,5.250000,-0.687500,-0.687500,5.625000, + -0.875000,-0.375000,6.000000,-0.937500,0.000000,6.000000,-0.875000,0.375000,6.000000,-0.687500,0.687500,1.125000, + -0.665365,0.665365,0.787109,-0.598958,0.598958,0.523438,0.317708,0.614583,0.300781,0.003906,0.647135,0.267578, + -0.302083,0.598958,0.300781,-0.375000,0.875000,6.000000,0.031250,0.968750,6.000000,0.500000,1.000000,6.000000, + 1.000000,1.000000,1.125000,0.944444,0.944444,0.791667,0.777778,0.777778,0.541667,0.598958,-0.302083,0.300781, + 0.647135,0.003906,0.267578,0.614583,0.317708,0.300781,1.000000,0.500000,6.000000,0.968750,0.031250,6.000000, + 0.875000,-0.375000,6.000000,0.687500,-0.687500,1.125000,0.665365,-0.665365,0.787109,0.598958,-0.598958,0.523438, + -0.302083,-0.598958,0.300781,0.000000,-0.643229,0.267578,0.302083,-0.598958,0.300781,0.375000,-0.875000,6.000000, + 0.000000,-0.937500,6.000000,-0.375000,-0.875000,6.000000,-0.598958,-0.598958,0.523438,-0.665365,-0.665365,0.787109, + -0.687500,-0.687500,1.125000,-0.687500,-0.687500,1.875000,-0.687500,-0.687500,2.250000,-0.687500,-0.687500,2.625000, + -0.687500,-0.687500,3.375000,-0.687500,-0.687500,3.750000,-0.687500,-0.687500,4.125000,-0.687500,0.687500,5.625000, + -0.687500,0.687500,5.250000,-0.687500,0.687500,4.875000,-0.687500,0.687500,4.125000,-0.687500,0.687500,3.750000, + -0.687500,0.687500,3.375000,-0.687500,0.687500,2.625000,-0.687500,0.687500,2.250000,-0.687500,0.687500,1.875000, + 1.000000,1.000000,5.625000,1.000000,1.000000,5.250000,1.000000,1.000000,4.875000,1.000000,1.000000,4.125000, + 1.000000,1.000000,3.750000,1.000000,1.000000,3.375000,1.000000,1.000000,2.625000,1.000000,1.000000,2.250000, + 1.000000,1.000000,1.875000,0.687500,-0.687500,5.625000,0.687500,-0.687500,5.250000,0.687500,-0.687500,4.875000, + 0.687500,-0.687500,4.125000,0.687500,-0.687500,3.750000,0.687500,-0.687500,3.375000,0.687500,-0.687500,2.625000, + 0.687500,-0.687500,2.250000,0.687500,-0.687500,1.875000,0.375000,-0.875000,1.500000,0.000000,-0.937500,1.500000, + -0.375000,-0.875000,1.500000,0.375000,-0.875000,3.000000,0.000000,-0.937500,3.000000,-0.375000,-0.875000,3.000000, + 0.375000,-0.875000,4.500000,0.000000,-0.937500,4.500000,-0.375000,-0.875000,4.500000,1.000000,0.500000,1.500000, + 0.968750,0.031250,1.500000,0.875000,-0.375000,1.500000,1.000000,0.500000,3.000000,0.968750,0.031250,3.000000, + 0.875000,-0.375000,3.000000,1.000000,0.500000,4.500000,0.968750,0.031250,4.500000,0.875000,-0.375000,4.500000, + -0.375000,0.875000,1.500000,0.031250,0.968750,1.500000,0.500000,1.000000,1.500000,-0.375000,0.875000,3.000000, + 0.031250,0.968750,3.000000,0.500000,1.000000,3.000000,-0.375000,0.875000,4.500000,0.031250,0.968750,4.500000, + 0.500000,1.000000,4.500000,-0.875000,-0.375000,1.500000,-0.937500,0.000000,1.500000,-0.875000,0.375000,1.500000, + -0.875000,-0.375000,3.000000,-0.937500,0.000000,3.000000,-0.875000,0.375000,3.000000,-0.875000,-0.375000,4.500000, + -0.937500,0.000000,4.500000,-0.875000,0.375000,4.500000,-0.509259,-0.509259,0.368056,-0.687500,-0.687500,6.000000, + -0.509259,0.509259,0.368056,-0.687500,0.687500,6.000000,0.509259,-0.509259,0.368056,0.687500,-0.687500,6.000000, + 0.550926,0.550926,0.368056,1.000000,1.000000,6.000000,-0.687500,-0.687500,1.500000,-0.687500,-0.687500,3.000000, + -0.687500,-0.687500,4.500000,-0.687500,0.687500,4.500000,-0.687500,0.687500,3.000000,-0.687500,0.687500,1.500000, + 1.000000,1.000000,4.500000,1.000000,1.000000,3.000000,1.000000,1.000000,1.500000,0.687500,-0.687500,4.500000, + 0.687500,-0.687500,3.000000,0.687500,-0.687500,1.500000 + PolygonVertexIndex: 0,4,5,-2,1,5,165,-167,4,268,267,-6,5,267,280,-166,0,1,6,-3,2,6,168,-170,1,166,167,-7,6,167,271,-169, + 0,2,7,-4,3,7,207,-209,2,169,170,-8,7,170,273,-208,0,3,8,-5,4,8,269,-269,3,208,209,-9,8,209,281,-270, + 9,13,14,-11,10,14,209,-209,13,259,258,-15,14,258,281,-210,9,10,15,-12,11,15,177,-179,10,208,207,-16,15,207,273,-178, + 9,11,16,-13,12,16,216,-218,11,178,179,-17,16,179,277,-217,9,12,17,-14,13,17,260,-260,12,217,218,-18,17,218,284,-261, + 18,22,23,-20,19,23,218,-218,22,250,249,-24,23,249,284,-219,18,19,24,-21,20,24,186,-188,19,217,216,-25,24,216,277,-187, + 18,20,25,-22,21,25,225,-227,20,187,188,-26,25,188,275,-226,18,21,26,-23,22,26,251,-251,21,226,227,-27,26,227,287,-252, + 27,31,32,-29,28,32,227,-227,31,241,240,-33,32,240,287,-228,27,28,33,-30,29,33,195,-197,28,226,225,-34,33,225,275,-196, + 27,29,34,-31,30,34,167,-167,29,196,197,-35,34,197,271,-168,27,30,35,-32,31,35,242,-242,30,166,165,-36,35,165,280,-243, + 36,40,41,-38,37,41,176,-176,40,163,162,-42,41,162,272,-177,36,37,42,-39,38,42,185,-185,37,175,174,-43,42,174,276,-186, + 36,38,43,-40,39,43,194,-194,38,184,183,-44,43,183,274,-195,36,39,44,-41,40,44,164,-164,39,193,192,-45,44,192,270,-165, + 45,49,50,-47,46,50,179,-179,49,187,186,-51,50,186,277,-180,45,46,51,-48,47,51,170,-170,46,178,177,-52,51,177,273,-171, + 45,47,52,-49,48,52,197,-197,47,169,168,-53,52,168,271,-198,45,48,53,-50,49,53,188,-188,48,196,195,-54,53,195,275,-189, + 54,58,59,-56,55,59,191,-191,58,193,194,-60,59,194,274,-192,54,55,60,-57,56,60,234,-236,55,190,189,-61,60,189,289,-235, + 54,56,61,-58,57,61,200,-200,56,235,236,-62,61,236,278,-201,54,57,62,-59,58,62,192,-194,57,199,198,-63,62,198,270,-193, + 63,67,68,-65,64,68,233,-233,67,235,234,-69,68,234,289,-234,63,64,69,-66,65,69,237,-239,64,232,231,-70,69,231,288,-238, + 63,65,70,-67,66,70,203,-203,65,238,239,-71,70,239,279,-204,63,66,71,-68,67,71,236,-236,66,202,201,-72,71,201,278,-237, + 72,76,77,-74,73,77,230,-230,76,238,237,-78,77,237,288,-231,72,73,78,-75,74,78,240,-242,73,229,228,-79,78,228,287,-241, + 72,74,79,-76,75,79,206,-206,74,241,242,-80,79,242,280,-207,72,75,80,-77,76,80,239,-239,75,205,204,-81,80,204,279,-240, + 81,85,86,-83,82,86,182,-182,85,184,185,-87,86,185,276,-183,81,82,87,-84,83,87,243,-245,82,181,180,-88,87,180,286,-244, + 81,83,88,-85,84,88,189,-191,83,244,245,-89,88,245,289,-190,81,84,89,-86,85,89,183,-185,84,190,191,-90,89,191,274,-184, + 90,94,95,-92,91,95,224,-224,94,244,243,-96,95,243,286,-225,90,91,96,-93,92,96,246,-248,91,223,222,-97,96,222,285,-247, + 90,92,97,-94,93,97,231,-233,92,247,248,-98,97,248,288,-232,90,93,98,-95,94,98,245,-245,93,232,233,-99,98,233,289,-246, + 99,103,104,-101,100,104,221,-221,103,247,246,-105,104,246,285,-222,99,100,105,-102,101,105,249,-251,100,220,219,-106,105,219,284,-250, + 99,101,106,-103,102,106,228,-230,101,250,251,-107,106,251,287,-229,99,102,107,-104,103,107,248,-248,102,229,230,-108,107,230,288,-249, + 108,112,113,-110,109,113,173,-173,112,175,176,-114,113,176,272,-174,108,109,114,-111,110,114,252,-254,109,172,171,-115,114,171,283,-253, + 108,110,115,-112,111,115,180,-182,110,253,254,-116,115,254,286,-181,108,111,116,-113,112,116,174,-176,111,181,182,-117,116,182,276,-175, + 117,121,122,-119,118,122,215,-215,121,253,252,-123,122,252,283,-216,117,118,123,-120,119,123,255,-257,118,214,213,-124,123,213,282,-256, + 117,119,124,-121,120,124,222,-224,119,256,257,-125,124,257,285,-223,117,120,125,-122,121,125,254,-254,120,223,224,-126,125,224,286,-255, + 126,130,131,-128,127,131,212,-212,130,256,255,-132,131,255,282,-213,126,127,132,-129,128,132,258,-260,127,211,210,-133,132,210,281,-259, + 126,128,133,-130,129,133,219,-221,128,259,260,-134,133,260,284,-220,126,129,134,-131,130,134,257,-257,129,220,221,-135,134,221,285,-258, + 135,139,140,-137,136,140,198,-200,139,163,164,-141,140,164,270,-199,135,136,141,-138,137,141,261,-263,136,199,200,-142,141,200,278,-262, + 135,137,142,-139,138,142,171,-173,137,262,263,-143,142,263,283,-172,135,138,143,-140,139,143,162,-164,138,172,173,-144,143,173,272,-163, + 144,148,149,-146,145,149,201,-203,148,262,261,-150,149,261,278,-202,144,145,150,-147,146,150,264,-266,145,202,203,-151,150,203,279,-265, + 144,146,151,-148,147,151,213,-215,146,265,266,-152,151,266,282,-214,144,147,152,-149,148,152,263,-263,147,214,215,-153,152,215,283,-264, + 153,157,158,-155,154,158,204,-206,157,265,264,-159,158,264,279,-205,153,154,159,-156,155,159,267,-269,154,205,206,-160,159,206,280,-268, + 153,155,160,-157,156,160,210,-212,155,268,269,-161,160,269,281,-211,153,156,161,-158,157,161,266,-266,156,211,212,-162,161,212,282,-267 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + -0.129425,0.129425,-0.983106,-0.129425,0.129425,-0.983106,-0.129425,0.129425,-0.983106,-0.129425,0.129425,-0.983106, + -0.153533,0.411564,-0.898356,-0.153533,0.411564,-0.898356,-0.153533,0.411564,-0.898356,-0.153533,0.411564,-0.898356, + -0.413083,0.152042,-0.897912,-0.413083,0.152042,-0.897912,-0.413083,0.152042,-0.897912,-0.413083,0.152042,-0.897912, + -0.420042,0.420042,-0.804444,-0.420042,0.420042,-0.804444,-0.420042,0.420042,-0.804444,-0.420042,0.420042,-0.804444, + 0.129425,0.129425,-0.983106,0.129425,0.129425,-0.983106,0.129425,0.129425,-0.983106,0.129425,0.129425,-0.983106, + 0.397869,0.141349,-0.906488,0.397869,0.141349,-0.906488,0.397869,0.141349,-0.906488,0.397869,0.141349,-0.906488, + 0.141349,0.397869,-0.906488,0.141349,0.397869,-0.906488,0.141349,0.397869,-0.906488,0.141349,0.397869,-0.906488, + 0.364429,0.364429,-0.856961,0.364429,0.364429,-0.856961,0.364429,0.364429,-0.856961,0.364429,0.364429,-0.856961, + 0.129425,-0.129425,-0.983106,0.129425,-0.129425,-0.983106,0.129425,-0.129425,-0.983106,0.129425,-0.129425,-0.983106, + 0.152042,-0.413083,-0.897912,0.152042,-0.413083,-0.897912,0.152042,-0.413083,-0.897912,0.152042,-0.413083,-0.897912, + 0.411564,-0.153533,-0.898356,0.411564,-0.153533,-0.898356,0.411564,-0.153533,-0.898356,0.411564,-0.153533,-0.898356, + 0.420042,-0.420042,-0.804444,0.420042,-0.420042,-0.804444,0.420042,-0.420042,-0.804444,0.420042,-0.420042,-0.804444, + -0.129425,-0.129425,-0.983106,-0.129425,-0.129425,-0.983106,-0.129425,-0.129425,-0.983106,-0.129425,-0.129425,-0.983106, + -0.413083,-0.152042,-0.897912,-0.413083,-0.152042,-0.897912,-0.413083,-0.152042,-0.897912,-0.413083,-0.152042,-0.897912, + -0.152042,-0.413083,-0.897912,-0.152042,-0.413083,-0.897912,-0.152042,-0.413083,-0.897912,-0.152042,-0.413083,-0.897912, + -0.420042,-0.420042,-0.804444,-0.420042,-0.420042,-0.804444,-0.420042,-0.420042,-0.804444,-0.420042,-0.420042,-0.804444, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.168477,-0.940461,-0.295208,0.168477,-0.940461,-0.295208,0.168477,-0.940461,-0.295208,0.168477,-0.940461,-0.295208, + 0.498799,-0.806275,-0.317994,0.498799,-0.806275,-0.317994,0.498799,-0.806275,-0.317994,0.498799,-0.806275,-0.317994, + 0.172155,-0.762521,-0.623638,0.172155,-0.762521,-0.623638,0.172155,-0.762521,-0.623638,0.172155,-0.762521,-0.623638, + 0.454502,-0.652831,-0.606003,0.454502,-0.652831,-0.606003,0.454502,-0.652831,-0.606003,0.454502,-0.652831,-0.606003, + 0.164693,-0.982713,-0.084564,0.164693,-0.982713,-0.084564,0.164693,-0.982713,-0.084564,0.164693,-0.982713,-0.084564, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.513313,-0.853626,-0.088497,0.513313,-0.853626,-0.088497,0.513313,-0.853626,-0.088497,0.513313,-0.853626,-0.088497, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + -0.164693,-0.982713,-0.084564,-0.164693,-0.982713,-0.084564,-0.164693,-0.982713,-0.084564,-0.164693,-0.982713,-0.084564, + -0.513313,-0.853626,-0.088497,-0.513313,-0.853626,-0.088497,-0.513313,-0.853626,-0.088497,-0.513313,-0.853626,-0.088497, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + -0.168477,-0.940461,-0.295208,-0.168477,-0.940461,-0.295208,-0.168477,-0.940461,-0.295208,-0.168477,-0.940461,-0.295208, + -0.172155,-0.762521,-0.623638,-0.172155,-0.762521,-0.623638,-0.172155,-0.762521,-0.623638,-0.172155,-0.762521,-0.623638, + -0.498799,-0.806275,-0.317994,-0.498799,-0.806275,-0.317994,-0.498799,-0.806275,-0.317994,-0.498799,-0.806275,-0.317994, + -0.454502,-0.652831,-0.606003,-0.454502,-0.652831,-0.606003,-0.454502,-0.652831,-0.606003,-0.454502,-0.652831,-0.606003, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000,0.164399,-0.986394,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + 0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000,0.514496,-0.857493,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000,-0.164399,-0.986394,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + -0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000,-0.514496,-0.857493,0.000000, + 0.926924,-0.003810,-0.375229,0.926924,-0.003810,-0.375229,0.926924,-0.003810,-0.375229,0.926924,-0.003810,-0.375229, + 0.849764,0.087476,-0.519855,0.849764,0.087476,-0.519855,0.849764,0.087476,-0.519855,0.849764,0.087476,-0.519855, + 0.714886,0.094763,-0.692790,0.714886,0.094763,-0.692790,0.714886,0.094763,-0.692790,0.714886,0.094763,-0.692790, + 0.539579,0.232313,-0.809250,0.539579,0.232313,-0.809250,0.539579,0.232313,-0.809250,0.539579,0.232313,-0.809250, + 0.992543,-0.056515,-0.107998,0.992543,-0.056515,-0.107998,0.992543,-0.056515,-0.107998,0.992543,-0.056515,-0.107998, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 0.989110,0.013738,-0.146535,0.989110,0.013738,-0.146535,0.989110,0.013738,-0.146535,0.989110,0.013738,-0.146535, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 0.970942,-0.222211,-0.088842,0.970942,-0.222211,-0.088842,0.970942,-0.222211,-0.088842,0.970942,-0.222211,-0.088842, + 0.853626,-0.513314,-0.088497,0.853626,-0.513314,-0.088497,0.853626,-0.513314,-0.088497,0.853626,-0.513314,-0.088497, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.927361,-0.211352,-0.308760,0.927361,-0.211352,-0.308760,0.927361,-0.211352,-0.308760,0.927361,-0.211352,-0.308760, + 0.751952,-0.188639,-0.631651,0.751952,-0.188639,-0.631651,0.751952,-0.188639,-0.631651,0.751952,-0.188639,-0.631651, + 0.806275,-0.498799,-0.317995,0.806275,-0.498799,-0.317995,0.806275,-0.498799,-0.317995,0.806275,-0.498799,-0.317995, + 0.652831,-0.454502,-0.606003,0.652831,-0.454502,-0.606003,0.652831,-0.454502,-0.606003,0.652831,-0.454502,-0.606003, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000,0.997785,-0.066519,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000,0.974391,-0.224859,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + 0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000,0.857493,-0.514496,0.000000, + -0.211352,0.927361,-0.308759,-0.211352,0.927361,-0.308759,-0.211352,0.927361,-0.308759,-0.211352,0.927361,-0.308759, + -0.498799,0.806275,-0.317994,-0.498799,0.806275,-0.317994,-0.498799,0.806275,-0.317994,-0.498799,0.806275,-0.317994, + -0.188639,0.751952,-0.631651,-0.188639,0.751952,-0.631651,-0.188639,0.751952,-0.631651,-0.188639,0.751952,-0.631651, + -0.454502,0.652831,-0.606003,-0.454502,0.652831,-0.606003,-0.454502,0.652831,-0.606003,-0.454502,0.652831,-0.606003, + -0.222211,0.970942,-0.088842,-0.222211,0.970942,-0.088842,-0.222211,0.970942,-0.088842,-0.222211,0.970942,-0.088842, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.513313,0.853626,-0.088497,-0.513313,0.853626,-0.088497,-0.513313,0.853626,-0.088497,-0.513313,0.853626,-0.088497, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.056515,0.992543,-0.107998,-0.056515,0.992543,-0.107998,-0.056515,0.992543,-0.107998,-0.056515,0.992543,-0.107998, + 0.013738,0.989110,-0.146535,0.013738,0.989110,-0.146535,0.013738,0.989110,-0.146535,0.013738,0.989110,-0.146535, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + -0.003810,0.926924,-0.375229,-0.003810,0.926924,-0.375229,-0.003810,0.926924,-0.375229,-0.003810,0.926924,-0.375229, + 0.094763,0.714886,-0.692790,0.094763,0.714886,-0.692790,0.094763,0.714886,-0.692790,0.094763,0.714886,-0.692790, + 0.087476,0.849764,-0.519855,0.087476,0.849764,-0.519855,0.087476,0.849764,-0.519855,0.087476,0.849764,-0.519855, + 0.232313,0.539579,-0.809250,0.232313,0.539579,-0.809250,0.232313,0.539579,-0.809250,0.232313,0.539579,-0.809250, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000,-0.224859,0.974391,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000,-0.514496,0.857493,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + -0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000,-0.066519,0.997785,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + -0.940461,-0.168477,-0.295208,-0.940461,-0.168477,-0.295208,-0.940461,-0.168477,-0.295208,-0.940461,-0.168477,-0.295208, + -0.806275,-0.498799,-0.317995,-0.806275,-0.498799,-0.317995,-0.806275,-0.498799,-0.317995,-0.806275,-0.498799,-0.317995, + -0.762521,-0.172155,-0.623638,-0.762521,-0.172155,-0.623638,-0.762521,-0.172155,-0.623638,-0.762521,-0.172155,-0.623638, + -0.652831,-0.454502,-0.606003,-0.652831,-0.454502,-0.606003,-0.652831,-0.454502,-0.606003,-0.652831,-0.454502,-0.606003, + -0.982713,-0.164693,-0.084564,-0.982713,-0.164693,-0.084564,-0.982713,-0.164693,-0.084564,-0.982713,-0.164693,-0.084564, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.853626,-0.513314,-0.088497,-0.853626,-0.513314,-0.088497,-0.853626,-0.513314,-0.088497,-0.853626,-0.513314,-0.088497, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.982713,0.164693,-0.084564,-0.982713,0.164693,-0.084564,-0.982713,0.164693,-0.084564,-0.982713,0.164693,-0.084564, + -0.853626,0.513314,-0.088497,-0.853626,0.513314,-0.088497,-0.853626,0.513314,-0.088497,-0.853626,0.513314,-0.088497, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.940462,0.168477,-0.295208,-0.940462,0.168477,-0.295208,-0.940462,0.168477,-0.295208,-0.940462,0.168477,-0.295208, + -0.762521,0.172155,-0.623638,-0.762521,0.172155,-0.623638,-0.762521,0.172155,-0.623638,-0.762521,0.172155,-0.623638, + -0.806275,0.498799,-0.317995,-0.806275,0.498799,-0.317995,-0.806275,0.498799,-0.317995,-0.806275,0.498799,-0.317995, + -0.652831,0.454502,-0.606003,-0.652831,0.454502,-0.606003,-0.652831,0.454502,-0.606003,-0.652831,0.454502,-0.606003, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000,-0.986394,-0.164399,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000,-0.857493,-0.514496,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000,-0.986394,0.164399,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000, + -0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000,-0.857493,0.514496,0.000000 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + } + Model: "Model::Bottom", "Limb" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",89.999995674159678,-89.999995674159678,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Size", "double", "",1 + Property: "LimbLength", "double", "",1.900000 + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "Color", "Color", "A",0.8,0.8,0.8 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + } + Model: "Model::Middle", "Limb" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",1.900000095367432,0.000000143446016,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000013660376712,0.000000000001031,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.999999940395355,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Size", "double", "",1 + Property: "LimbLength", "double", "",1.900000 + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "Color", "Color", "A",0.8,0.8,0.8 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + } + Model: "Model::Top", "Limb" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",1.899999976158142,0.000000143446002,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-0.000013660376712,-0.000000000001031,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Size", "double", "",1 + Property: "LimbLength", "double", "",1.800000 + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "Color", "Color", "A",0.8,0.8,0.8 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::unnamed", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Deformer: "Deformer::Skin Skin", "Skin" { + Version: 100 + MultiLayer: 0 + Type: "Skin" + Properties60: { + } + Link_DeformAcuracy: 50 + } + Deformer: "SubDeformer::Cluster Skin Bottom", "Cluster" { + Version: 100 + MultiLayer: 0 + Type: "Cluster" + Properties60: { + Property: "SrcModel", "object", "" + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 36,37,38,39,40,41,42,43,44,54,55,56,57,58,59,60,61,62,63,64,65,66,67 + ,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90 + ,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113 + ,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136 + ,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159 + ,160,161,162,163,164,171,172,173,174,175,176,180,181,182,183,184,185,189,190,191,192,193,194 + ,198,199,200,201,202,203,204,205,206,210,211,212,213,214,215,219,220,221,222,223,224,228,229 + ,230,231,232,233,234,235,236,237,238,239,243,244,245,246,247,248,252,253,254,255,256,257,261 + ,262,263,264,265,266,270,272,274,276,278,279,282,283,285,286,288,289 + Weights: 1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,0.95893457,0.95891615,0.93851346,0.95895299,0.97942995,0.97941904,0.93849087,0.93853606,0.97944085,0.49540614,0.49539320,0.28517735,0.49541909,0.70640102,0.70638274,0.28517000,0.28518474,0.70641933,0.03799289,0.03799206,0.01903105,0.03799373,0.05688592,0.05688470,0.01903062,0.01903147,0.05688714,0.95893457,0.95895299 + ,0.93851346,0.95891615,0.97942995,0.97944085,0.93853606,0.93849087,0.97941904,0.49540616,0.49541907,0.28517735,0.49539320,0.70640102,0.70641935,0.28518474,0.28516998,0.70638272,0.03799289,0.03799373,0.01903104,0.03799206,0.05688592,0.05688714,0.01903147,0.01903062,0.05688470,0.95893457,0.95891615,0.93851346,0.95895299,0.97942995,0.97941904,0.93849087,0.93853606,0.97944085,0.49540614,0.49539320,0.28517735,0.49541909 + ,0.70640102,0.70638274,0.28517000,0.28518474,0.70641933,0.03799289,0.03799206,0.01903105,0.03799373,0.05688592,0.05688470,0.01903062,0.01903147,0.05688714,0.95893457,0.95895299,0.93851346,0.95891615,0.97942995,0.97944085,0.93853606,0.93849087,0.97941904,0.49540616,0.49541907,0.28517735,0.49539320,0.70640102,0.70641935,0.28518474,0.28516998,0.70638272,0.03799289,0.03799373,0.01903104,0.03799206,0.05688592,0.05688714 + ,0.01903147,0.01903062,0.05688470,1.00000000,1.00000000,1.00000000,0.93846827,0.95889772,0.97940813,1.00000000,1.00000000,1.00000000,0.93855864,0.95897141,0.97945174,1.00000000,1.00000000,1.00000000,0.93846827,0.95889772,0.97940813,1.00000000,1.00000000,1.00000000,0.97945174,0.95897141,0.93855864,0.70643764,0.49543203,0.28519209,0.05688836,0.03799456,0.01903190,0.01903019,0.03799122,0.05688348,0.28516261,0.49538027 + ,0.70636443,0.01903190,0.03799456,0.05688836,0.28519209,0.49543203,0.70643764,0.01903019,0.03799122,0.05688348,0.28516261,0.49538027,0.70636443,0.91814278,0.91816623,0.91818968,0.07570892,0.07571050,0.07571209,0.91818968,0.91816623,0.91814278,0.07571209,0.07571050,0.07570892,0.91814278,0.91816623,0.91818968,0.07570892,0.07571050,0.07571209,0.91818968,0.91816623,0.91814278,0.07571209,0.07571050,0.07570892,1.00000000 + ,1.00000000,1.00000000,1.00000000,0.91821314,0.07571368,0.07570733,0.91811932,0.07571368,0.91821314,0.07570733,0.91811932 + Transform: 0.000000075497901,-1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,1.000000000000000,0.000000075497901,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + TransformLink: 0.000000075497901,1.000000000000000,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000075497901,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + Deformer: "SubDeformer::Cluster Skin Middle", "Cluster" { + Version: 100 + MultiLayer: 0 + Type: "Cluster" + Properties60: { + Property: "SrcModel", "object", "" + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 + ,23,24,25,26,27,28,29,30,31,32,33,34,35,54,55,56,57,58,59,60,61,62,63 + ,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86 + ,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109 + ,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132 + ,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155 + ,156,157,158,159,160,161,165,166,167,171,172,173,180,181,182,189,190,191,198,199,200,201,202 + ,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225 + ,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248 + ,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,278,279 + ,280,281,282,283,284,285,286,287,288,289 + Weights: 0.04104395,0.04106118,0.02055774,0.04102673,0.06145902,0.06148015,0.02056793,0.02054755,0.06143790,0.04104395,0.04102673,0.02055774,0.04106118,0.06145902,0.06143790,0.02054755,0.02056793,0.06148015,0.04104395,0.04106118,0.02055774,0.04102673,0.06145902,0.06148015,0.02056793,0.02054755,0.06143790,0.04104395,0.04102673,0.02055774,0.04106118,0.06145902,0.06143790,0.02054755,0.02056793,0.06148015,0.04106543,0.04108385 + ,0.06148654,0.04104701,0.02057005,0.02058096,0.06150913,0.06146394,0.02055915,0.46659942,0.46661157,0.65793446,0.46658727,0.27456714,0.27458502,0.65794065,0.65792823,0.27454925,0.46658369,0.46657238,0.27454391,0.46659495,0.65792646,0.65792077,0.27452723,0.27456059,0.65793215,0.04106543,0.04104701,0.06148654,0.04108385,0.02057005,0.02055915,0.06146394,0.06150913,0.02058096,0.46659941,0.46658729,0.65793446,0.46661157 + ,0.27456714,0.27454923,0.65792823,0.65794067,0.27458504,0.46658367,0.46659497,0.27454389,0.46657238,0.65792644,0.65793215,0.27456058,0.27452721,0.65792075,0.04106543,0.04108385,0.06148654,0.04104701,0.02057005,0.02058096,0.06150913,0.06146394,0.02055915,0.46659942,0.46661157,0.65793446,0.46658727,0.27456714,0.27458502,0.65794065,0.65792823,0.27454925,0.46658369,0.46657238,0.27454391,0.46659495,0.65792646,0.65792077 + ,0.27452723,0.27456059,0.65793215,0.04106543,0.04104701,0.06148654,0.04108385,0.02057005,0.02055915,0.06146394,0.06150913,0.02058096,0.46659941,0.46658729,0.65793446,0.46661157,0.27456714,0.27454923,0.65792823,0.65794067,0.27458504,0.46658367,0.46659497,0.27454389,0.46657238,0.65792644,0.65793215,0.27456058,0.27452721,0.65792075,0.06150128,0.04107841,0.02057813,0.06153173,0.04110228,0.02059187,0.06144136,0.04102859 + ,0.02054826,0.06153173,0.04110228,0.02059187,0.02054826,0.04102859,0.06144136,0.27453135,0.46657512,0.65792204,0.65793782,0.46660623,0.27457729,0.02053736,0.04100952,0.06141678,0.27451052,0.46656112,0.65791510,0.65794688,0.46662371,0.27460292,0.02057813,0.04107841,0.06150128,0.27457729,0.46660623,0.65793782,0.65792204,0.46657512,0.27453135,0.02053736,0.04100952,0.06141678,0.27451052,0.46656112,0.65791510,0.65794688 + ,0.46662371,0.27460292,0.08185722,0.08183377,0.08181032,0.84857612,0.84857603,0.84857595,0.08178138,0.08180331,0.08182524,0.08181032,0.08183377,0.08185722,0.84857595,0.84857603,0.84857612,0.08182524,0.08180331,0.08178138,0.08185722,0.08183377,0.08181032,0.84857612,0.84857603,0.84857595,0.08178138,0.08180331,0.08182524,0.08181032,0.08183377,0.08185722,0.84857595,0.84857603,0.84857612,0.08182524,0.08180331,0.08178138 + ,0.08178686,0.84857586,0.08184717,0.08175944,0.84857621,0.08188068,0.08184717,0.84857586,0.08178686,0.08175944,0.84857621,0.08188068 + Transform: 0.000000075497901,-1.000000000000000,0.000000238418551,0.000000000000000,0.000000000000018,-0.000000238418551,-1.000000000000000,0.000000000000000,1.000000119209290,0.000000075497908,0.000000000000000,0.000000000000000,-1.900000214576721,-0.000000143446030,0.000000000000000,1.000000000000000 + TransformLink: 0.000000075497901,0.999999940395355,-0.000000000000018,0.000000000000000,-1.000000000000000,0.000000075497894,0.000000238418551,0.000000000000000,0.000000238418551,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,1.900000095367432,0.000000000000000,1.000000000000000 + } + Deformer: "SubDeformer::Cluster Skin Top", "Cluster" { + Version: 100 + MultiLayer: 0 + Type: "Cluster" + Properties60: { + Property: "SrcModel", "object", "" + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 + ,23,24,25,26,27,28,29,30,31,32,33,34,35,45,46,47,48,49,50,51,52,53,63 + ,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,90,91,92,93,94,95 + ,96,97,98,99,100,101,102,103,104,105,106,107,117,118,119,120,121,122,123,124,125,126,127 + ,128,129,130,131,132,133,134,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159 + ,160,161,165,166,167,168,169,170,177,178,179,186,187,188,195,196,197,201,202,203,204,205,206 + ,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229 + ,230,231,232,233,237,238,239,240,241,242,246,247,248,249,250,251,255,256,257,258,259,260,264 + ,265,266,267,268,269,271,273,275,277,279,280,281,282,284,285,287,288 + Weights: 0.95895605,0.95893882,0.97944226,0.95897327,0.93854098,0.93851985,0.97943207,0.97945245,0.93856210,0.95895605,0.95897327,0.97944226,0.95893882,0.93854098,0.93856210,0.97945245,0.97943207,0.93851985,0.95895605,0.95893882,0.97944226,0.95897327,0.93854098,0.93851985,0.97943207,0.97945245,0.93856210,0.95895605,0.95897327,0.97944226,0.95893882,0.93854098,0.93856210,0.97945245,0.97943207,0.93851985,1.00000000,1.00000000 + ,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,0.03799444,0.03799523,0.05688819,0.03799364,0.01903183,0.01903224,0.05688935,0.05688703,0.01903142,0.49542342,0.49543556,0.70642504,0.49541132,0.28518762,0.28519453,0.70644215,0.70640794,0.28518071,0.03799444,0.03799364,0.05688819,0.03799523,0.01903183,0.01903142,0.05688703,0.05688934,0.01903224,0.49542343,0.49541131,0.70642506,0.49543556 + ,0.28518764,0.28518071,0.70640794,0.70644217,0.28519455,0.03799444,0.03799523,0.05688819,0.03799364,0.01903183,0.01903224,0.05688935,0.05688703,0.01903142,0.49542342,0.49543556,0.70642504,0.49541132,0.28518762,0.28519453,0.70644215,0.70640794,0.28518071,0.03799444,0.03799364,0.05688819,0.03799523,0.01903183,0.01903142,0.05688703,0.05688934,0.01903224,0.49542343,0.49541131,0.70642506,0.49543556,0.28518764,0.28518071 + ,0.70640794,0.70644217,0.28519455,0.93849872,0.95892159,0.97942187,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,1.00000000,0.01903102,0.03799285,0.05688587,0.28517382,0.49539921,0.70639081,0.97946264,0.95899048,0.93858322,0.70645929,0.49544766,0.28520142,0.05689050,0.03799602,0.01903265,0.97942187,0.95892159,0.93849872,0.70639081,0.49539921 + ,0.28517382,0.05688587,0.03799285,0.01903102,0.97946264,0.95899048,0.93858322,0.70645929,0.49544766,0.28520142,0.05689050,0.03799602,0.01903265,0.07571497,0.07571347,0.07571196,0.91821862,0.91819669,0.91817476,0.07571196,0.07571347,0.07571497,0.91817476,0.91819669,0.91821862,0.07571497,0.07571347,0.07571196,0.91821862,0.91819669,0.91817476,0.07571196,0.07571347,0.07571497,0.91817476,0.91819669,0.91821862,1.00000000 + ,1.00000000,1.00000000,1.00000000,0.07571047,0.91815283,0.91824056,0.07571646,0.91815283,0.07571047,0.91824056,0.07571646 + Transform: 0.000000075497901,-1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,1.000000119209290,0.000000075497908,0.000000000000000,0.000000000000000,-3.799999952316284,-0.000000286892032,0.000000000000000,1.000000000000000 + TransformLink: 0.000000075497901,0.999999940395355,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000075497894,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,3.799999713897705,0.000000000000000,1.000000000000000 + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 5 + PoseNode: { + Node: "Model::Skeleton" + Matrix: 1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + PoseNode: { + Node: "Model::Skin" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + PoseNode: { + Node: "Model::Bottom" + Matrix: 0.000000075497901,1.000000000000000,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000075497901,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + PoseNode: { + Node: "Model::Middle" + Matrix: 0.000000075497901,0.999999940395355,-0.000000000000018,0.000000000000000,-1.000000000000000,0.000000075497894,0.000000238418551,0.000000000000000,0.000000238418551,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,1.900000095367432,0.000000000000000,1.000000000000000 + } + PoseNode: { + Node: "Model::Top" + Matrix: 0.000000075497901,0.999999940395355,0.000000000000000,0.000000000000000,-1.000000000000000,0.000000075497894,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,3.799999713897705,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Skeleton", "Limb" { + } + Model: "Model::Skin", "Mesh" { + } + Model: "Model::Bottom", "Limb" { + } + Model: "Model::Middle", "Limb" { + } + Model: "Model::Top", "Limb" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::unnamed", "" { + } + Deformer: "Deformer::Skin Skin", "Skin" { + } + Deformer: "SubDeformer::Cluster Skin Bottom", "Cluster" { + } + Deformer: "SubDeformer::Cluster Skin Middle", "Cluster" { + } + Deformer: "SubDeformer::Cluster Skin Top", "Cluster" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Skin", "Model::Scene" + Connect: "OO", "Model::Skeleton", "Model::Scene" + Connect: "OO", "Material::unnamed", "Model::Skin" + Connect: "OO", "Deformer::Skin Skin", "Model::Skin" + Connect: "OO", "SubDeformer::Cluster Skin Bottom", "Deformer::Skin Skin" + Connect: "OO", "SubDeformer::Cluster Skin Middle", "Deformer::Skin Skin" + Connect: "OO", "SubDeformer::Cluster Skin Top", "Deformer::Skin Skin" + Connect: "OO", "Model::Bottom", "SubDeformer::Cluster Skin Bottom" + Connect: "OO", "Model::Middle", "SubDeformer::Cluster Skin Middle" + Connect: "OO", "Model::Top", "SubDeformer::Cluster Skin Top" + Connect: "OO", "Model::Bottom", "Model::Skeleton" + Connect: "OO", "Model::Middle", "Model::Bottom" + Connect: "OO", "Model::Top", "Model::Middle" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,36564041750 + ReferenceTime: 0,36564041750 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Bottom" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 87.404496468801881 + KeyVer: 4005 + KeyCount: 19 + Key: + 0,87.404496468801881,L, + 1924423250,78.883275403711281,L, + 3848846500,62.525648530282076,L, + 5773269750,36.198889280180857,L, + 9622116250,-33.567377902424219,L, + 11546539500,-59.894188378944214,L, + 13470962750,-76.251794761805911,L, + 15395386000,-84.773008996707347,L, + 17319809250,-87.368528692632651,L, + 19244232500,-84.141510196616380,L, + 21168655750,-73.329040702745758,L, + 23093079000,-51.991451188481136,L, + 25017502250,-17.740910935084049,L, + 26941925500,23.499506603563347,L, + 28866348750,57.750062224886065,L, + 30790772000,79.087661984434448,L, + 32715195250,89.900124648115906,L, + 34639618500,93.127143144132162,L, + 36564041750,93.127143144132162,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -89.999995674159678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-89.999995674159678,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Middle" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.900000095367432 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.900000095367432,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000143446002 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000000143446002,L, + 36564041750,0.000000143446016,L + Color: 0,1,0 + } + Channel: "Z" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,-0.000000000000000,L, + 36564041750,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -0.470259965097730 + KeyVer: 4005 + KeyCount: 20 + Key: + 0,-0.470259965097730,L, + 1924423250,-1.900810483273729,L, + 3848846500,-4.320911284519497,L, + 5773269750,-7.751705486215040,L, + 7697693000,-12.192691923230011,L, + 9622116250,-17.604180793184344,L, + 11546539500,-23.888450018301874,L, + 13470962750,-30.875685727890687,L, + 15395386000,-38.322599998809871,L, + 17319809250,-45.929788073697758,L, + 19244232500,-53.376702344616938,L, + 21168655750,-60.363941469300336,L, + 23093079000,-66.648234600079959,L, + 25017502250,-72.059711517203255,L, + 26941925500,-76.500707345728330,L, + 28866348750,-79.931497705442467,L, + 30790772000,-82.351590822725413,L, + 32715195250,-83.782160284004192,L, + 34639618500,-84.252418808358897,L, + 36564041750,-84.252418808358897,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000035503250 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,-0.000000035503250,L, + 36564041750,-0.000004303965270,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000145400 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000000000145400,L, + 36564041750,0.000003892508361,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 0.999999940395355 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.999999940395355,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.999999940395355 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.999999940395355,L, + 36564041750,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.999999940395355 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.999999940395355,L, + 36564041750,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Top" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.899999856948853 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,1.899999856948853,L, + 36564041750,1.899999976158142,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000143445988 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000143445988,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000001 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000000000000001,L, + 36564041750,0.000000000000002,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0.458812781492217 + KeyVer: 4005 + KeyCount: 20 + Key: + 0,0.458812781492217,L, + 1924423250,1.854053142650005,L, + 3848846500,4.212794512600227,L, + 5773269750,7.553286783279162,L, + 7697693000,11.872084551137366,L, + 9622116250,17.127559947617787,L, + 11546539500,23.222537310077850,L, + 13470962750,29.991606532293016,L, + 15395386000,37.200468220070086,L, + 17319809250,44.562452503754869,L, + 19244232500,51.771297116059017,L, + 21168655750,58.540383413747108,L, + 23093079000,64.635364191301761,L, + 25017502250,69.890839587782182,L, + 26941925500,74.209636501866740,L, + 28866348750,77.550124930564266,L, + 30790772000,79.908869288722244,L, + 32715195250,81.304099351235422,L, + 34639618500,81.762944629487052,L, + 36564041750,81.762944629487052,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000034639039 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000000034639039,L, + 36564041750,0.000004281086447,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000138308 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000000000138308,L, + 36564041750,0.000003705970102,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Skeleton" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } + Take: "Base" { + FileName: "Base.tak" + LocalTime: 0,1924423250 + ReferenceTime: 0,1924423250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Bottom" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -89.999995674159678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-89.999995674159678,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Middle" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.900000095367432 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.900000095367432,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000143446016 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000143446016,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0.000013660376712 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000013660376712,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000001031 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000001031,L + Color: 0,1,0 + } + Channel: "Z" { + Default: -0.000000000000407 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000407,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 0.999999940395355 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.999999940395355,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Top" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.899999976158142 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.899999976158142,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000143446002 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000143446002,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -0.000013660376712 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000013660376712,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000001031 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000001031,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Skeleton" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } + Take: "Spin" { + FileName: "Spin.tak" + LocalTime: -1924423249,34639618500 + ReferenceTime: -1924423249,34639618500 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Bottom" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 90.000002504348856 + KeyVer: 4005 + KeyCount: 19 + Key: + 0,90.000002504348856,L, + 1924423250,87.404496468801881,L, + 3848846500,78.883275403711281,L, + 5773269750,62.525648530282076,L, + 7697693000,36.198889280180857,L, + 11546539500,-33.567377902424219,L, + 13470962750,-59.894188378944214,L, + 15395386000,-76.251794761805911,L, + 17319809250,-84.773008996707347,L, + 19244232500,-87.368528692632651,L, + 21168655750,-84.141510196616380,L, + 23093079000,-73.329040702745758,L, + 25017502250,-51.991451188481136,L, + 26941925500,-17.740910935084049,L, + 28866348750,23.499506603563347,L, + 30790772000,57.750062224886065,L, + 32715195250,79.087661984434448,L, + 34639618500,89.900124648115906,L, + 36564041750,93.127143144132162,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -89.999995674159678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-89.999995674159678,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Middle" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.900000095367432 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.900000095367432,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000143446016 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000143446016,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0.000013660376712 + KeyVer: 4005 + KeyCount: 20 + Key: + 0,0.000013660376712,L, + 1924423250,-0.470259965097730,L, + 3848846500,-1.900810483273729,L, + 5773269750,-4.320911284519497,L, + 7697693000,-7.751705486215040,L, + 9622116250,-12.192691923230011,L, + 11546539500,-17.604180793184344,L, + 13470962750,-23.888450018301874,L, + 15395386000,-30.875685727890687,L, + 17319809250,-38.322599998809871,L, + 19244232500,-45.929788073697758,L, + 21168655750,-53.376702344616938,L, + 23093079000,-60.363941469300336,L, + 25017502250,-66.648234600079959,L, + 26941925500,-72.059711517203255,L, + 28866348750,-76.500707345728330,L, + 30790772000,-79.931497705442467,L, + 32715195250,-82.351590822725413,L, + 34639618500,-83.782160284004192,L, + 36564041750,-84.252418808358897,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000001031 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000000000001031,L, + 36564041750,-0.000004303965270,L + Color: 0,1,0 + } + Channel: "Z" { + Default: -0.000000000000407 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,-0.000000000000407,L, + 36564041750,0.000003892508361,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 0.999999940395355 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.999999940395355,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Top" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.899999976158142 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.899999976158142,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000143446002 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000000143446002,L, + 36564041750,0.000000143445988,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000000000000000,L, + 36564041750,0.000000000000002,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -0.000013660376712 + KeyVer: 4005 + KeyCount: 20 + Key: + 0,-0.000013660376712,L, + 1924423250,0.458812781492217,L, + 3848846500,1.854053142650005,L, + 5773269750,4.212794512600227,L, + 7697693000,7.553286783279162,L, + 9622116250,11.872084551137366,L, + 11546539500,17.127559947617787,L, + 13470962750,23.222537310077850,L, + 15395386000,29.991606532293016,L, + 17319809250,37.200468220070086,L, + 19244232500,44.562452503754869,L, + 21168655750,51.771297116059017,L, + 23093079000,58.540383413747108,L, + 25017502250,64.635364191301761,L, + 26941925500,69.890839587782182,L, + 28866348750,74.209636501866740,L, + 30790772000,77.550124930564266,L, + 32715195250,79.908869288722244,L, + 34639618500,81.304099351235422,L, + 36564041750,81.762944629487052,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000001031 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,-0.000000000001031,L, + 36564041750,0.000004281086447,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000000000000000,L, + 36564041750,0.000003705970102,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Skeleton" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } + Take: "Wiggle" { + FileName: "Wiggle.tak" + LocalTime: 0,36564041750 + ReferenceTime: 0,36564041750 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Bottom" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -53.502668108384718 + KeyVer: 4005 + KeyCount: 19 + Key: + 0,-53.502668108384718,L, + 1924423250,-55.783982027016961,L, + 3848846500,-62.847234326973329,L, + 5773269750,-74.800543487720361,L, + 7697693000,-90.800206976938881,L, + 9622116250,-108.435058734591138,L, + 11546539500,-124.434735884187987,L, + 13470962750,-136.388045044935041,L, + 15395386000,-143.451293929796805,L, + 17319809250,-145.732604433334473,L, + 19244232500,-143.889286640512410,L, + 21168655750,-138.196364948449997,L, + 23093079000,-128.511880705437846,L, + 25017502250,-115.201508579259595,L, + 28866348750,-84.033750302081245,L, + 30790772000,-70.723378175903008,L, + 32715195250,-61.038907593269201,L, + 34639618500,-55.345989316301356,L, + 36564041750,-53.502668108384718,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000002538284359 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000002538284359,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Middle" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.900000095367432 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.900000095367432,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000178813934 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000178813934,L + Color: 0,1,0 + } + Channel: "Z" { + Default: -0.000000000000014 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000014,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0.000013660377526 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000013660377526,L, + 36564041750,-0.000000382145426,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000001527 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000000000001527,L, + 36564041750,-0.000007547383590,L + Color: 0,1,0 + } + Channel: "Z" { + Default: -0.000000000000121 + KeyVer: 4005 + KeyCount: 20 + Key: + 0,-0.000000000000121,L, + 1924423250,0.464128376213772,L, + 3848846500,1.875729174867832,L, + 5773269750,4.262874740255159,L, + 7697693000,7.645129775727253,L, + 9622116250,12.020374788207299,L, + 11546539500,17.347833548350380,L, + 13470962750,23.530058039720771,L, + 15395386000,30.399580561606463,L, + 17319809250,37.717967747819117,L, + 19244232500,45.192773096214005,L, + 21168655750,52.511163697521241,L, + 23093079000,59.380687926954224,L, + 25017502250,65.562903880588152,L, + 26941925500,70.890369470920405,L, + 28866348750,75.265611068305873,L, + 30790772000,78.647866103777957,L, + 32715195250,81.035003558315651,L, + 34639618500,82.446612414458500,L, + 36564041750,82.910744259127711,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 0.999999940395355 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.999999940395355,L, + 36564041750,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Top" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.899999856948853 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,1.899999856948853,L, + 36564041750,1.899999976158142,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000119209247 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,0.000000119209247,L, + 36564041750,0.000000327825546,L + Color: 0,1,0 + } + Channel: "Z" { + Default: -0.000000000000028 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,-0.000000000000028,L, + 36564041750,0.000000000000028,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -0.000013660374269 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,-0.000013660374269,L, + 36564041750,-0.000016087784187,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000001120 + KeyVer: 4005 + KeyCount: 2 + Key: + 0,-0.000000000001120,L, + 36564041750,-0.000008146437654,L + Color: 0,1,0 + } + Channel: "Z" { + Default: -0.000001707547496 + KeyVer: 4005 + KeyCount: 20 + Key: + 0,-0.000001707547496,L, + 1924423250,-0.303526456360643,L, + 3848846500,-1.223277382115711,L, + 5773269750,-2.767505993660096,L, + 7697693000,-4.933096870958629,L, + 9622116250,-7.699519425861633,L, + 11546539500,-11.022258754227259,L, + 13470962750,-14.827227367241667,L, + 15395386000,-19.008105686510937,L, + 17319809250,-23.428855126788839,L, + 19244232500,-27.932140572997053,L, + 21168655750,-32.352901966105996,L, + 23093079000,-36.533793945753608,L, + 25017502250,-40.338748898389674,L, + 26941925500,-43.661492495623534,L, + 28866348750,-46.427913769866073,L, + 30790772000,-48.593503793390958,L, + 32715195250,-50.137737847742336,L, + 34639618500,-51.057491121374930,L, + 36564041750,-51.361007652616934,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000119209290 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000119209290,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000119209290 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000119209290,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Skeleton" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 36564041750 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/blender_279_sausage_7400_binary.fbx b/modules/ufbx/data/blender_279_sausage_7400_binary.fbx new file mode 100644 index 0000000..cd326d0 Binary files /dev/null and b/modules/ufbx/data/blender_279_sausage_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_sausage_base_0.obj b/modules/ufbx/data/blender_279_sausage_base_0.obj new file mode 100644 index 0000000..7e8c6c7 --- /dev/null +++ b/modules/ufbx/data/blender_279_sausage_base_0.obj @@ -0,0 +1,664 @@ +# ufbx:bad_uvs +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +g Skin_Cube.001 +v -0.937500 5.250000 0.000000 +v -0.875000 5.250000 0.375000 +v -0.937500 5.625000 0.000000 +v -0.875000 5.250000 -0.375000 +v -0.937500 4.875000 0.000000 +v -0.875000 4.875000 0.375000 +v -0.875000 5.625000 0.375000 +v -0.875000 5.625000 -0.375000 +v -0.875000 4.875000 -0.375000 +v 0.031250 5.250000 -0.968750 +v -0.375000 5.250000 -0.875000 +v 0.031250 5.625000 -0.968750 +v 0.500000 5.250000 -1.000000 +v 0.031250 4.875000 -0.968750 +v -0.375000 4.875000 -0.875000 +v -0.375000 5.625000 -0.875000 +v 0.500000 5.625000 -1.000000 +v 0.500000 4.875000 -1.000000 +v 0.968750 5.250000 -0.031250 +v 1.000000 5.250000 -0.500000 +v 0.968750 5.625000 -0.031250 +v 0.875000 5.250000 0.375000 +v 0.968750 4.875000 -0.031250 +v 1.000000 4.875000 -0.500000 +v 1.000000 5.625000 -0.500000 +v 0.875000 5.625000 0.375000 +v 0.875000 4.875000 0.375000 +v 0.000000 5.250000 0.937500 +v 0.375000 5.250000 0.875000 +v 0.000000 5.625000 0.937500 +v -0.375000 5.250000 0.875000 +v 0.000000 4.875000 0.937500 +v 0.375000 4.875000 0.875000 +v 0.375000 5.625000 0.875000 +v -0.375000 5.625000 0.875000 +v -0.375000 4.875000 0.875000 +v 0.000000 0.091146 0.000000 +v 0.000000 0.135417 -0.350694 +v 0.350694 0.135417 0.000000 +v 0.000000 0.135417 0.350694 +v -0.350694 0.135417 0.000000 +v -0.326389 0.177083 -0.326389 +v 0.326389 0.177083 -0.326389 +v 0.326389 0.177083 0.326389 +v -0.326389 0.177083 0.326389 +v 0.003906 6.000000 -0.003906 +v 0.015625 6.000000 -0.484375 +v -0.468750 6.000000 0.000000 +v 0.000000 6.000000 0.468750 +v 0.484375 6.000000 -0.015625 +v 0.500000 6.000000 -0.500000 +v -0.437500 6.000000 -0.437500 +v -0.437500 6.000000 0.437500 +v 0.437500 6.000000 0.437500 +v 0.000000 0.777995 0.907986 +v 0.362847 0.782552 0.847222 +v 0.000000 1.125000 0.937500 +v -0.362847 0.782552 0.847222 +v 0.000000 0.486979 0.819444 +v 0.326389 0.505208 0.763889 +v 0.375000 1.125000 0.875000 +v -0.375000 1.125000 0.875000 +v -0.326389 0.505208 0.763889 +v 0.000000 2.250000 0.937500 +v 0.375000 2.250000 0.875000 +v 0.000000 2.625000 0.937500 +v -0.375000 2.250000 0.875000 +v 0.000000 1.875000 0.937500 +v 0.375000 1.875000 0.875000 +v 0.375000 2.625000 0.875000 +v -0.375000 2.625000 0.875000 +v -0.375000 1.875000 0.875000 +v 0.000000 3.750000 0.937500 +v 0.375000 3.750000 0.875000 +v 0.000000 4.125000 0.937500 +v -0.375000 3.750000 0.875000 +v 0.000000 3.375000 0.937500 +v 0.375000 3.375000 0.875000 +v 0.375000 4.125000 0.875000 +v -0.375000 4.125000 0.875000 +v -0.375000 3.375000 0.875000 +v 0.935330 0.777995 -0.027344 +v 0.956597 0.782552 -0.472222 +v 0.968750 1.125000 -0.031250 +v 0.847222 0.782552 0.362847 +v 0.835069 0.486979 -0.015625 +v 0.826389 0.505208 -0.388889 +v 1.000000 1.125000 -0.500000 +v 0.875000 1.125000 0.375000 +v 0.763889 0.505208 0.326389 +v 0.968750 2.250000 -0.031250 +v 1.000000 2.250000 -0.500000 +v 0.968750 2.625000 -0.031250 +v 0.875000 2.250000 0.375000 +v 0.968750 1.875000 -0.031250 +v 1.000000 1.875000 -0.500000 +v 1.000000 2.625000 -0.500000 +v 0.875000 2.625000 0.375000 +v 0.875000 1.875000 0.375000 +v 0.968750 3.750000 -0.031250 +v 1.000000 3.750000 -0.500000 +v 0.968750 4.125000 -0.031250 +v 0.875000 3.750000 0.375000 +v 0.968750 3.375000 -0.031250 +v 1.000000 3.375000 -0.500000 +v 1.000000 4.125000 -0.500000 +v 0.875000 4.125000 0.375000 +v 0.875000 3.375000 0.375000 +v 0.027344 0.777995 -0.935330 +v -0.362847 0.782552 -0.847222 +v 0.031250 1.125000 -0.968750 +v 0.472222 0.782552 -0.956597 +v 0.015625 0.486979 -0.835069 +v -0.326389 0.505208 -0.763889 +v -0.375000 1.125000 -0.875000 +v 0.500000 1.125000 -1.000000 +v 0.388889 0.505208 -0.826389 +v 0.031250 2.250000 -0.968750 +v -0.375000 2.250000 -0.875000 +v 0.031250 2.625000 -0.968750 +v 0.500000 2.250000 -1.000000 +v 0.031250 1.875000 -0.968750 +v -0.375000 1.875000 -0.875000 +v -0.375000 2.625000 -0.875000 +v 0.500000 2.625000 -1.000000 +v 0.500000 1.875000 -1.000000 +v 0.031250 3.750000 -0.968750 +v -0.375000 3.750000 -0.875000 +v 0.031250 4.125000 -0.968750 +v 0.500000 3.750000 -1.000000 +v 0.031250 3.375000 -0.968750 +v -0.375000 3.375000 -0.875000 +v -0.375000 4.125000 -0.875000 +v 0.500000 4.125000 -1.000000 +v 0.500000 3.375000 -1.000000 +v -0.907986 0.777995 0.000000 +v -0.847222 0.782552 0.362847 +v -0.937500 1.125000 0.000000 +v -0.847222 0.782552 -0.362847 +v -0.819444 0.486979 0.000000 +v -0.763889 0.505208 0.326389 +v -0.875000 1.125000 0.375000 +v -0.875000 1.125000 -0.375000 +v -0.763889 0.505208 -0.326389 +v -0.937500 2.250000 0.000000 +v -0.875000 2.250000 0.375000 +v -0.937500 2.625000 0.000000 +v -0.875000 2.250000 -0.375000 +v -0.937500 1.875000 0.000000 +v -0.875000 1.875000 0.375000 +v -0.875000 2.625000 0.375000 +v -0.875000 2.625000 -0.375000 +v -0.875000 1.875000 -0.375000 +v -0.937500 3.750000 0.000000 +v -0.875000 3.750000 0.375000 +v -0.937500 4.125000 0.000000 +v -0.875000 3.750000 -0.375000 +v -0.937500 3.375000 0.000000 +v -0.875000 3.375000 0.375000 +v -0.875000 4.125000 0.375000 +v -0.875000 4.125000 -0.375000 +v -0.875000 3.375000 -0.375000 +v -0.598958 0.300781 -0.302083 +v -0.643229 0.267578 0.000000 +v -0.598958 0.300781 0.302083 +v -0.687500 4.875000 0.687500 +v -0.687500 5.250000 0.687500 +v -0.687500 5.625000 0.687500 +v -0.875000 6.000000 0.375000 +v -0.937500 6.000000 0.000000 +v -0.875000 6.000000 -0.375000 +v -0.687500 1.125000 -0.687500 +v -0.665365 0.787109 -0.665365 +v -0.598958 0.523438 -0.598958 +v 0.317708 0.300781 -0.614583 +v 0.003906 0.267578 -0.647135 +v -0.302083 0.300781 -0.598958 +v -0.375000 6.000000 -0.875000 +v 0.031250 6.000000 -0.968750 +v 0.500000 6.000000 -1.000000 +v 1.000000 1.125000 -1.000000 +v 0.944444 0.791667 -0.944444 +v 0.777778 0.541667 -0.777778 +v 0.598958 0.300781 0.302083 +v 0.647135 0.267578 -0.003906 +v 0.614583 0.300781 -0.317708 +v 1.000000 6.000000 -0.500000 +v 0.968750 6.000000 -0.031250 +v 0.875000 6.000000 0.375000 +v 0.687500 1.125000 0.687500 +v 0.665365 0.787109 0.665365 +v 0.598958 0.523438 0.598958 +v -0.302083 0.300781 0.598958 +v 0.000000 0.267578 0.643229 +v 0.302083 0.300781 0.598958 +v 0.375000 6.000000 0.875000 +v 0.000000 6.000000 0.937500 +v -0.375000 6.000000 0.875000 +v -0.598958 0.523438 0.598958 +v -0.665365 0.787109 0.665365 +v -0.687500 1.125000 0.687500 +v -0.687500 1.875000 0.687500 +v -0.687500 2.250000 0.687500 +v -0.687500 2.625000 0.687500 +v -0.687500 3.375000 0.687500 +v -0.687500 3.750000 0.687500 +v -0.687500 4.125000 0.687500 +v -0.687500 5.625000 -0.687500 +v -0.687500 5.250000 -0.687500 +v -0.687500 4.875000 -0.687500 +v -0.687500 4.125000 -0.687500 +v -0.687500 3.750000 -0.687500 +v -0.687500 3.375000 -0.687500 +v -0.687500 2.625000 -0.687500 +v -0.687500 2.250000 -0.687500 +v -0.687500 1.875000 -0.687500 +v 1.000000 5.625000 -1.000000 +v 1.000000 5.250000 -1.000000 +v 1.000000 4.875000 -1.000000 +v 1.000000 4.125000 -1.000000 +v 1.000000 3.750000 -1.000000 +v 1.000000 3.375000 -1.000000 +v 1.000000 2.625000 -1.000000 +v 1.000000 2.250000 -1.000000 +v 1.000000 1.875000 -1.000000 +v 0.687500 5.625000 0.687500 +v 0.687500 5.250000 0.687500 +v 0.687500 4.875000 0.687500 +v 0.687500 4.125000 0.687500 +v 0.687500 3.750000 0.687500 +v 0.687500 3.375000 0.687500 +v 0.687500 2.625000 0.687500 +v 0.687500 2.250000 0.687500 +v 0.687500 1.875000 0.687500 +v 0.375000 1.500000 0.875000 +v 0.000000 1.500000 0.937500 +v -0.375000 1.500000 0.875000 +v 0.375000 3.000000 0.875000 +v 0.000000 3.000000 0.937500 +v -0.375000 3.000000 0.875000 +v 0.375000 4.500000 0.875000 +v 0.000000 4.500000 0.937500 +v -0.375000 4.500000 0.875000 +v 1.000000 1.500000 -0.500000 +v 0.968750 1.500000 -0.031250 +v 0.875000 1.500000 0.375000 +v 1.000000 3.000000 -0.500000 +v 0.968750 3.000000 -0.031250 +v 0.875000 3.000000 0.375000 +v 1.000000 4.500000 -0.500000 +v 0.968750 4.500000 -0.031250 +v 0.875000 4.500000 0.375000 +v -0.375000 1.500000 -0.875000 +v 0.031250 1.500000 -0.968750 +v 0.500000 1.500000 -1.000000 +v -0.375000 3.000000 -0.875000 +v 0.031250 3.000000 -0.968750 +v 0.500000 3.000000 -1.000000 +v -0.375000 4.500000 -0.875000 +v 0.031250 4.500000 -0.968750 +v 0.500000 4.500000 -1.000000 +v -0.875000 1.500000 0.375000 +v -0.937500 1.500000 0.000000 +v -0.875000 1.500000 -0.375000 +v -0.875000 3.000000 0.375000 +v -0.937500 3.000000 0.000000 +v -0.875000 3.000000 -0.375000 +v -0.875000 4.500000 0.375000 +v -0.937500 4.500000 0.000000 +v -0.875000 4.500000 -0.375000 +v -0.509259 0.368056 0.509259 +v -0.687500 6.000000 0.687500 +v -0.509259 0.368056 -0.509259 +v -0.687500 6.000000 -0.687500 +v 0.509259 0.368056 0.509259 +v 0.687500 6.000000 0.687500 +v 0.550926 0.368056 -0.550926 +v 1.000000 6.000000 -1.000000 +v -0.687500 1.500000 0.687500 +v -0.687500 3.000000 0.687500 +v -0.687500 4.500000 0.687500 +v -0.687500 4.500000 -0.687500 +v -0.687500 3.000000 -0.687500 +v -0.687500 1.500000 -0.687500 +v 1.000000 4.500000 -1.000000 +v 1.000000 3.000000 -1.000000 +v 1.000000 1.500000 -1.000000 +v 0.687500 4.500000 0.687500 +v 0.687500 3.000000 0.687500 +v 0.687500 1.500000 0.687500 +vn -0.9864 0.0000 0.1644 +vn -0.8575 0.0000 0.5145 +vn -0.9864 0.0000 -0.1644 +vn -0.8575 0.0000 -0.5145 +vn -0.2249 0.0000 -0.9744 +vn -0.5145 0.0000 -0.8575 +vn -0.0665 0.0000 -0.9978 +vn 0.0000 0.0000 -1.0000 +vn 0.9978 0.0000 0.0665 +vn 1.0000 0.0000 0.0000 +vn 0.9744 0.0000 0.2249 +vn 0.8575 0.0000 0.5145 +vn 0.1644 0.0000 0.9864 +vn 0.5145 0.0000 0.8575 +vn -0.1644 0.0000 0.9864 +vn -0.5145 0.0000 0.8575 +vn -0.1294 -0.9831 -0.1294 +vn -0.1535 -0.8984 -0.4116 +vn -0.4131 -0.8979 -0.1520 +vn -0.4200 -0.8044 -0.4200 +vn 0.1294 -0.9831 -0.1294 +vn 0.3979 -0.9065 -0.1413 +vn 0.1413 -0.9065 -0.3979 +vn 0.3644 -0.8570 -0.3644 +vn 0.1294 -0.9831 0.1294 +vn 0.1520 -0.8979 0.4131 +vn 0.4116 -0.8984 0.1535 +vn 0.4200 -0.8044 0.4200 +vn -0.1294 -0.9831 0.1294 +vn -0.4131 -0.8979 0.1520 +vn -0.1520 -0.8979 0.4131 +vn -0.4200 -0.8044 0.4200 +vn 0.0000 1.0000 0.0000 +vn 0.1685 -0.2952 0.9405 +vn 0.4988 -0.3180 0.8063 +vn 0.1722 -0.6236 0.7625 +vn 0.4545 -0.6060 0.6528 +vn 0.1647 -0.0846 0.9827 +vn 0.5133 -0.0885 0.8536 +vn -0.1647 -0.0846 0.9827 +vn -0.5133 -0.0885 0.8536 +vn -0.1685 -0.2952 0.9405 +vn -0.1722 -0.6236 0.7625 +vn -0.4988 -0.3180 0.8063 +vn -0.4545 -0.6060 0.6528 +vn 0.9269 -0.3752 0.0038 +vn 0.8498 -0.5199 -0.0875 +vn 0.7149 -0.6928 -0.0948 +vn 0.5396 -0.8092 -0.2323 +vn 0.9925 -0.1080 0.0565 +vn 0.9891 -0.1465 -0.0137 +vn 0.9709 -0.0888 0.2222 +vn 0.8536 -0.0885 0.5133 +vn 0.9274 -0.3088 0.2114 +vn 0.7520 -0.6317 0.1886 +vn 0.8063 -0.3180 0.4988 +vn 0.6528 -0.6060 0.4545 +vn -0.2114 -0.3088 -0.9274 +vn -0.4988 -0.3180 -0.8063 +vn -0.1886 -0.6317 -0.7520 +vn -0.4545 -0.6060 -0.6528 +vn -0.2222 -0.0888 -0.9709 +vn -0.5133 -0.0885 -0.8536 +vn -0.0565 -0.1080 -0.9925 +vn 0.0137 -0.1465 -0.9891 +vn -0.0038 -0.3752 -0.9269 +vn 0.0948 -0.6928 -0.7149 +vn 0.0875 -0.5199 -0.8498 +vn 0.2323 -0.8092 -0.5396 +vn -0.9405 -0.2952 0.1685 +vn -0.8063 -0.3180 0.4988 +vn -0.7625 -0.6236 0.1722 +vn -0.6528 -0.6060 0.4545 +vn -0.9827 -0.0846 0.1647 +vn -0.8536 -0.0885 0.5133 +vn -0.9827 -0.0846 -0.1647 +vn -0.8536 -0.0885 -0.5133 +vn -0.9405 -0.2952 -0.1685 +vn -0.7625 -0.6236 -0.1722 +vn -0.8063 -0.3180 -0.4988 +vn -0.6528 -0.6060 -0.4545 +s off +f 1//1 5//1 6//1 2//1 +f 2//2 6//2 166//2 167//2 +f 5//1 269//1 268//1 6//1 +f 6//2 268//2 281//2 166//2 +f 1//1 2//1 7//1 3//1 +f 3//1 7//1 169//1 170//1 +f 2//2 167//2 168//2 7//2 +f 7//2 168//2 272//2 169//2 +f 1//3 3//3 8//3 4//3 +f 4//4 8//4 208//4 209//4 +f 3//3 170//3 171//3 8//3 +f 8//4 171//4 274//4 208//4 +f 1//3 4//3 9//3 5//3 +f 5//3 9//3 270//3 269//3 +f 4//4 209//4 210//4 9//4 +f 9//4 210//4 282//4 270//4 +f 10//5 14//5 15//5 11//5 +f 11//6 15//6 210//6 209//6 +f 14//5 260//5 259//5 15//5 +f 15//6 259//6 282//6 210//6 +f 10//5 11//5 16//5 12//5 +f 12//5 16//5 178//5 179//5 +f 11//6 209//6 208//6 16//6 +f 16//6 208//6 274//6 178//6 +f 10//7 12//7 17//7 13//7 +f 13//8 17//8 217//8 218//8 +f 12//7 179//7 180//7 17//7 +f 17//8 180//8 278//8 217//8 +f 10//7 13//7 18//7 14//7 +f 14//7 18//7 261//7 260//7 +f 13//8 218//8 219//8 18//8 +f 18//8 219//8 285//8 261//8 +f 19//9 23//9 24//9 20//9 +f 20//10 24//10 219//10 218//10 +f 23//9 251//9 250//9 24//9 +f 24//10 250//10 285//10 219//10 +f 19//9 20//9 25//9 21//9 +f 21//9 25//9 187//9 188//9 +f 20//10 218//10 217//10 25//10 +f 25//10 217//10 278//10 187//10 +f 19//11 21//11 26//11 22//11 +f 22//12 26//12 226//12 227//12 +f 21//11 188//11 189//11 26//11 +f 26//12 189//12 276//12 226//12 +f 19//11 22//11 27//11 23//11 +f 23//11 27//11 252//11 251//11 +f 22//12 227//12 228//12 27//12 +f 27//12 228//12 288//12 252//12 +f 28//13 32//13 33//13 29//13 +f 29//14 33//14 228//14 227//14 +f 32//13 242//13 241//13 33//13 +f 33//14 241//14 288//14 228//14 +f 28//13 29//13 34//13 30//13 +f 30//13 34//13 196//13 197//13 +f 29//14 227//14 226//14 34//14 +f 34//14 226//14 276//14 196//14 +f 28//15 30//15 35//15 31//15 +f 31//16 35//16 168//16 167//16 +f 30//15 197//15 198//15 35//15 +f 35//16 198//16 272//16 168//16 +f 28//15 31//15 36//15 32//15 +f 32//15 36//15 243//15 242//15 +f 31//16 167//16 166//16 36//16 +f 36//16 166//16 281//16 243//16 +f 37//17 41//17 42//17 38//17 +f 38//18 42//18 177//18 176//18 +f 41//19 164//19 163//19 42//19 +f 42//20 163//20 273//20 177//20 +f 37//21 38//21 43//21 39//21 +f 39//22 43//22 186//22 185//22 +f 38//23 176//23 175//23 43//23 +f 43//24 175//24 277//24 186//24 +f 37//25 39//25 44//25 40//25 +f 40//26 44//26 195//26 194//26 +f 39//27 185//27 184//27 44//27 +f 44//28 184//28 275//28 195//28 +f 37//29 40//29 45//29 41//29 +f 41//30 45//30 165//30 164//30 +f 40//31 194//31 193//31 45//31 +f 45//32 193//32 271//32 165//32 +f 46//33 50//33 51//33 47//33 +f 47//33 51//33 180//33 179//33 +f 50//33 188//33 187//33 51//33 +f 51//33 187//33 278//33 180//33 +f 46//33 47//33 52//33 48//33 +f 48//33 52//33 171//33 170//33 +f 47//33 179//33 178//33 52//33 +f 52//33 178//33 274//33 171//33 +f 46//33 48//33 53//33 49//33 +f 49//33 53//33 198//33 197//33 +f 48//33 170//33 169//33 53//33 +f 53//33 169//33 272//33 198//33 +f 46//33 49//33 54//33 50//33 +f 50//33 54//33 189//33 188//33 +f 49//33 197//33 196//33 54//33 +f 54//33 196//33 276//33 189//33 +f 55//34 59//34 60//34 56//34 +f 56//35 60//35 192//35 191//35 +f 59//36 194//36 195//36 60//36 +f 60//37 195//37 275//37 192//37 +f 55//38 56//38 61//38 57//38 +f 57//13 61//13 235//13 236//13 +f 56//39 191//39 190//39 61//39 +f 61//14 190//14 290//14 235//14 +f 55//40 57//40 62//40 58//40 +f 58//41 62//41 201//41 200//41 +f 57//15 236//15 237//15 62//15 +f 62//16 237//16 279//16 201//16 +f 55//42 58//42 63//42 59//42 +f 59//43 63//43 193//43 194//43 +f 58//44 200//44 199//44 63//44 +f 63//45 199//45 271//45 193//45 +f 64//13 68//13 69//13 65//13 +f 65//14 69//14 234//14 233//14 +f 68//13 236//13 235//13 69//13 +f 69//14 235//14 290//14 234//14 +f 64//13 65//13 70//13 66//13 +f 66//13 70//13 238//13 239//13 +f 65//14 233//14 232//14 70//14 +f 70//14 232//14 289//14 238//14 +f 64//15 66//15 71//15 67//15 +f 67//16 71//16 204//16 203//16 +f 66//15 239//15 240//15 71//15 +f 71//16 240//16 280//16 204//16 +f 64//15 67//15 72//15 68//15 +f 68//15 72//15 237//15 236//15 +f 67//16 203//16 202//16 72//16 +f 72//16 202//16 279//16 237//16 +f 73//13 77//13 78//13 74//13 +f 74//14 78//14 231//14 230//14 +f 77//13 239//13 238//13 78//13 +f 78//14 238//14 289//14 231//14 +f 73//13 74//13 79//13 75//13 +f 75//13 79//13 241//13 242//13 +f 74//14 230//14 229//14 79//14 +f 79//14 229//14 288//14 241//14 +f 73//15 75//15 80//15 76//15 +f 76//16 80//16 207//16 206//16 +f 75//15 242//15 243//15 80//15 +f 80//16 243//16 281//16 207//16 +f 73//15 76//15 81//15 77//15 +f 77//15 81//15 240//15 239//15 +f 76//16 206//16 205//16 81//16 +f 81//16 205//16 280//16 240//16 +f 82//46 86//46 87//46 83//46 +f 83//47 87//47 183//47 182//47 +f 86//48 185//48 186//48 87//48 +f 87//49 186//49 277//49 183//49 +f 82//50 83//50 88//50 84//50 +f 84//9 88//9 244//9 245//9 +f 83//51 182//51 181//51 88//51 +f 88//10 181//10 287//10 244//10 +f 82//52 84//52 89//52 85//52 +f 85//53 89//53 190//53 191//53 +f 84//11 245//11 246//11 89//11 +f 89//12 246//12 290//12 190//12 +f 82//54 85//54 90//54 86//54 +f 86//55 90//55 184//55 185//55 +f 85//56 191//56 192//56 90//56 +f 90//57 192//57 275//57 184//57 +f 91//9 95//9 96//9 92//9 +f 92//10 96//10 225//10 224//10 +f 95//9 245//9 244//9 96//9 +f 96//10 244//10 287//10 225//10 +f 91//9 92//9 97//9 93//9 +f 93//9 97//9 247//9 248//9 +f 92//10 224//10 223//10 97//10 +f 97//10 223//10 286//10 247//10 +f 91//11 93//11 98//11 94//11 +f 94//12 98//12 232//12 233//12 +f 93//11 248//11 249//11 98//11 +f 98//12 249//12 289//12 232//12 +f 91//11 94//11 99//11 95//11 +f 95//11 99//11 246//11 245//11 +f 94//12 233//12 234//12 99//12 +f 99//12 234//12 290//12 246//12 +f 100//9 104//9 105//9 101//9 +f 101//10 105//10 222//10 221//10 +f 104//9 248//9 247//9 105//9 +f 105//10 247//10 286//10 222//10 +f 100//9 101//9 106//9 102//9 +f 102//9 106//9 250//9 251//9 +f 101//10 221//10 220//10 106//10 +f 106//10 220//10 285//10 250//10 +f 100//11 102//11 107//11 103//11 +f 103//12 107//12 229//12 230//12 +f 102//11 251//11 252//11 107//11 +f 107//12 252//12 288//12 229//12 +f 100//11 103//11 108//11 104//11 +f 104//11 108//11 249//11 248//11 +f 103//12 230//12 231//12 108//12 +f 108//12 231//12 289//12 249//12 +f 109//58 113//58 114//58 110//58 +f 110//59 114//59 174//59 173//59 +f 113//60 176//60 177//60 114//60 +f 114//61 177//61 273//61 174//61 +f 109//62 110//62 115//62 111//62 +f 111//5 115//5 253//5 254//5 +f 110//63 173//63 172//63 115//63 +f 115//6 172//6 284//6 253//6 +f 109//64 111//64 116//64 112//64 +f 112//65 116//65 181//65 182//65 +f 111//7 254//7 255//7 116//7 +f 116//8 255//8 287//8 181//8 +f 109//66 112//66 117//66 113//66 +f 113//67 117//67 175//67 176//67 +f 112//68 182//68 183//68 117//68 +f 117//69 183//69 277//69 175//69 +f 118//5 122//5 123//5 119//5 +f 119//6 123//6 216//6 215//6 +f 122//5 254//5 253//5 123//5 +f 123//6 253//6 284//6 216//6 +f 118//5 119//5 124//5 120//5 +f 120//5 124//5 256//5 257//5 +f 119//6 215//6 214//6 124//6 +f 124//6 214//6 283//6 256//6 +f 118//7 120//7 125//7 121//7 +f 121//8 125//8 223//8 224//8 +f 120//7 257//7 258//7 125//7 +f 125//8 258//8 286//8 223//8 +f 118//7 121//7 126//7 122//7 +f 122//7 126//7 255//7 254//7 +f 121//8 224//8 225//8 126//8 +f 126//8 225//8 287//8 255//8 +f 127//5 131//5 132//5 128//5 +f 128//6 132//6 213//6 212//6 +f 131//5 257//5 256//5 132//5 +f 132//6 256//6 283//6 213//6 +f 127//5 128//5 133//5 129//5 +f 129//5 133//5 259//5 260//5 +f 128//6 212//6 211//6 133//6 +f 133//6 211//6 282//6 259//6 +f 127//7 129//7 134//7 130//7 +f 130//8 134//8 220//8 221//8 +f 129//7 260//7 261//7 134//7 +f 134//8 261//8 285//8 220//8 +f 127//7 130//7 135//7 131//7 +f 131//7 135//7 258//7 257//7 +f 130//8 221//8 222//8 135//8 +f 135//8 222//8 286//8 258//8 +f 136//70 140//70 141//70 137//70 +f 137//71 141//71 199//71 200//71 +f 140//72 164//72 165//72 141//72 +f 141//73 165//73 271//73 199//73 +f 136//74 137//74 142//74 138//74 +f 138//1 142//1 262//1 263//1 +f 137//75 200//75 201//75 142//75 +f 142//2 201//2 279//2 262//2 +f 136//76 138//76 143//76 139//76 +f 139//77 143//77 172//77 173//77 +f 138//3 263//3 264//3 143//3 +f 143//4 264//4 284//4 172//4 +f 136//78 139//78 144//78 140//78 +f 140//79 144//79 163//79 164//79 +f 139//80 173//80 174//80 144//80 +f 144//81 174//81 273//81 163//81 +f 145//1 149//1 150//1 146//1 +f 146//2 150//2 202//2 203//2 +f 149//1 263//1 262//1 150//1 +f 150//2 262//2 279//2 202//2 +f 145//1 146//1 151//1 147//1 +f 147//1 151//1 265//1 266//1 +f 146//2 203//2 204//2 151//2 +f 151//2 204//2 280//2 265//2 +f 145//3 147//3 152//3 148//3 +f 148//4 152//4 214//4 215//4 +f 147//3 266//3 267//3 152//3 +f 152//4 267//4 283//4 214//4 +f 145//3 148//3 153//3 149//3 +f 149//3 153//3 264//3 263//3 +f 148//4 215//4 216//4 153//4 +f 153//4 216//4 284//4 264//4 +f 154//1 158//1 159//1 155//1 +f 155//2 159//2 205//2 206//2 +f 158//1 266//1 265//1 159//1 +f 159//2 265//2 280//2 205//2 +f 154//1 155//1 160//1 156//1 +f 156//1 160//1 268//1 269//1 +f 155//2 206//2 207//2 160//2 +f 160//2 207//2 281//2 268//2 +f 154//3 156//3 161//3 157//3 +f 157//4 161//4 211//4 212//4 +f 156//3 269//3 270//3 161//3 +f 161//4 270//4 282//4 211//4 +f 154//3 157//3 162//3 158//3 +f 158//3 162//3 267//3 266//3 +f 157//4 212//4 213//4 162//4 +f 162//4 213//4 283//4 267//4 diff --git a/modules/ufbx/data/blender_279_sausage_spin_15.obj b/modules/ufbx/data/blender_279_sausage_spin_15.obj new file mode 100644 index 0000000..9e4fe94 --- /dev/null +++ b/modules/ufbx/data/blender_279_sausage_spin_15.obj @@ -0,0 +1,856 @@ +# ufbx:bad_uvs +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +g Skin_Cube.001 +v -0.294501 5.250000 -0.861288 +v -0.619363 5.250000 -0.686071 +v -0.316787 5.625000 -0.867635 +v 0.069632 5.250000 -0.921681 +v -0.272291 4.875000 -0.854963 +v -0.596100 4.875000 -0.689052 +v -0.642710 5.625000 -0.683079 +v 0.051377 5.625000 -0.936515 +v 0.087828 4.875000 -0.906897 +v 0.899814 5.250000 -0.275608 +v 0.686066 5.250000 -0.619402 +v 0.907115 5.625000 -0.298426 +v 1.075758 5.250000 0.145237 +v 0.892538 4.875000 -0.252869 +v 0.689046 4.875000 -0.596148 +v 0.683076 5.625000 -0.642734 +v 1.094421 5.625000 0.124842 +v 1.057163 4.875000 0.165557 +v 0.333027 5.250000 0.880181 +v 0.773465 5.250000 0.761644 +v 0.356268 5.625000 0.885996 +v -0.069632 5.250000 0.921681 +v 0.309866 4.875000 0.874385 +v 0.746396 4.875000 0.766743 +v 0.800631 5.625000 0.756526 +v -0.051377 5.625000 0.936515 +v -0.087828 4.875000 0.906897 +v -0.861288 5.250000 0.294501 +v -0.686066 5.250000 0.619402 +v -0.867635 5.625000 0.316787 +v -0.921656 5.250000 -0.069663 +v -0.854963 4.875000 0.272291 +v -0.689046 4.875000 0.596148 +v -0.683076 5.625000 0.642734 +v -0.936500 5.625000 -0.051395 +v -0.906866 4.875000 -0.087865 +v 0.000000 0.091146 0.000000 +v 0.321609 0.135417 -0.139836 +v 0.139836 0.135417 0.321609 +v -0.321609 0.135417 0.139836 +v -0.139836 0.135417 -0.321609 +v 0.169175 0.177083 -0.429464 +v 0.429464 0.177083 0.169175 +v -0.169175 0.177083 0.429464 +v -0.429464 0.177083 -0.169175 +v 0.005055 6.000000 0.002229 +v 0.457221 6.000000 -0.160662 +v -0.169576 6.000000 -0.437002 +v -0.437002 6.000000 0.169576 +v 0.189795 6.000000 0.445916 +v 0.647016 6.000000 0.285254 +v 0.249598 6.000000 -0.566139 +v -0.566139 6.000000 -0.249598 +v -0.249598 6.000000 0.566139 +v -0.820926 0.777995 0.317405 +v -0.639151 0.782552 0.624199 +v -0.841574 1.125000 0.304798 +v -0.892841 0.782552 -0.031876 +v -0.746168 0.486979 0.306563 +v -0.573477 0.505208 0.582971 +v -0.663554 1.125000 0.621081 +v -0.907405 1.125000 -0.052130 +v -0.817693 0.505208 -0.011415 +v -0.722380 2.250000 -0.151280 +v -0.734735 2.250000 0.147743 +v -0.666098 2.625000 -0.366719 +v -0.613718 2.250000 -0.430135 +v -0.778867 1.875000 0.064944 +v -0.700968 1.875000 0.372140 +v -0.768380 2.625000 -0.075839 +v -0.475009 2.625000 -0.608704 +v -0.752933 1.875000 -0.250916 +v -0.728906 3.750000 -0.167120 +v -0.747159 3.750000 0.135596 +v -0.788674 4.125000 0.041139 +v -0.613456 3.750000 -0.447551 +v -0.669355 3.375000 -0.374624 +v -0.774581 3.375000 -0.081901 +v -0.719637 4.125000 0.353885 +v -0.752539 4.125000 -0.277088 +v -0.474878 3.375000 -0.617396 +v 0.351685 0.777995 0.836089 +v 0.761366 0.782552 0.699796 +v 0.343010 1.125000 0.859467 +v -0.031910 0.782552 0.892816 +v 0.326636 0.486979 0.754551 +v 0.663287 0.505208 0.607002 +v 0.773988 1.125000 0.735114 +v -0.052172 1.125000 0.907372 +v -0.011432 0.505208 0.817680 +v -0.132243 2.250000 0.751502 +v 0.223921 2.250000 0.851218 +v -0.356739 2.625000 0.700525 +v -0.430158 2.250000 0.613701 +v 0.093071 1.875000 0.802664 +v 0.484694 1.875000 0.796150 +v -0.035906 2.625000 0.906086 +v -0.608716 2.625000 0.475000 +v -0.250949 1.875000 0.752907 +v -0.148394 3.750000 0.758774 +v 0.210473 3.750000 0.866634 +v 0.068800 4.125000 0.813592 +v -0.447531 3.750000 0.613472 +v -0.364800 3.375000 0.704155 +v -0.042617 3.375000 0.913780 +v 0.464486 4.125000 0.819315 +v -0.277058 4.125000 0.752563 +v -0.617386 3.375000 0.474886 +v 0.855206 0.777995 -0.302241 +v 0.639151 0.782552 -0.624199 +v 0.879787 1.125000 -0.286905 +v 1.029966 0.782552 0.092528 +v 0.766242 0.486979 -0.298181 +v 0.573477 0.505208 -0.582971 +v 0.663554 1.125000 -0.621081 +v 1.060259 1.125000 0.123698 +v 0.897987 0.505208 0.044943 +v 0.741417 2.250000 0.180402 +v 0.734735 2.250000 -0.147743 +v 0.676078 2.625000 0.401146 +v 0.689867 2.250000 0.546622 +v 0.806994 1.875000 -0.041147 +v 0.700968 1.875000 -0.372140 +v 0.768380 2.625000 0.075839 +v 0.514927 2.625000 0.746412 +v 0.865445 1.875000 0.346104 +v 0.747632 3.750000 0.196988 +v 0.747159 3.750000 -0.135596 +v 0.816334 4.125000 -0.016222 +v 0.688359 3.750000 0.567023 +v 0.679180 3.375000 0.409424 +v 0.774581 3.375000 0.081901 +v 0.719637 4.125000 -0.353885 +v 0.863178 4.125000 0.376760 +v 0.514174 3.375000 0.756594 +v -0.317405 0.777995 -0.820926 +v -0.624241 0.782552 -0.639144 +v -0.304798 1.125000 -0.841574 +v 0.031910 0.782552 -0.892816 +v -0.306563 0.486979 -0.746168 +v -0.582993 0.505208 -0.573474 +v -0.621134 1.125000 -0.663546 +v 0.052172 1.125000 -0.907372 +v 0.011432 0.505208 -0.817680 +v 0.151280 2.250000 -0.722380 +v -0.147772 2.250000 -0.734731 +v 0.366719 2.625000 -0.666098 +v 0.430158 2.250000 -0.613701 +v -0.064944 1.875000 -0.778867 +v -0.372182 1.875000 -0.700962 +v 0.075824 2.625000 -0.768378 +v 0.608716 2.625000 -0.475000 +v 0.250949 1.875000 -0.752907 +v 0.167120 3.750000 -0.728906 +v -0.135571 3.750000 -0.747162 +v -0.041139 4.125000 -0.788674 +v 0.447531 3.750000 -0.613472 +v 0.374624 3.375000 -0.669355 +v 0.081914 3.375000 -0.774582 +v -0.353847 4.125000 -0.719642 +v 0.277058 4.125000 -0.752563 +v 0.617386 3.375000 -0.474886 +v 0.038200 0.300781 -0.669736 +v -0.256482 0.267578 -0.589882 +v -0.515859 0.300781 -0.428830 +v -0.826610 4.875000 -0.427316 +v -0.847543 5.250000 -0.415664 +v -0.868555 5.625000 -0.403966 +v -0.666143 6.000000 -0.680076 +v -0.339152 6.000000 -0.874004 +v 0.033060 6.000000 -0.951398 +v 0.393663 1.125000 -0.840626 +v 0.368998 0.787109 -0.834122 +v 0.321333 0.523438 -0.769456 +v 0.690295 0.300781 0.046299 +v 0.595022 0.267578 -0.254457 +v 0.428830 0.300781 -0.515859 +v 0.680076 6.000000 -0.666143 +v 0.914442 6.000000 -0.321323 +v 1.113152 6.000000 0.104374 +v 1.222865 1.125000 0.572521 +v 1.184090 0.791667 0.523708 +v 0.999229 0.541667 0.417238 +v -0.038200 0.300781 0.669736 +v 0.261622 0.267578 0.591907 +v 0.536418 0.300781 0.436929 +v 0.827897 6.000000 0.751390 +v 0.379590 6.000000 0.891832 +v -0.033060 6.000000 0.951398 +v -0.393663 1.125000 0.840626 +v -0.368998 0.787109 0.834122 +v -0.321333 0.523438 0.769456 +v -0.669736 0.300781 -0.038200 +v -0.589882 0.267578 0.256482 +v -0.428830 0.300781 0.515859 +v -0.680076 6.000000 0.666143 +v -0.874004 6.000000 0.339152 +v -0.951398 6.000000 -0.033060 +v -0.769495 0.523438 -0.321310 +v -0.834196 0.787109 -0.368954 +v -0.840720 1.125000 -0.393608 +v -0.618832 1.875000 -0.523522 +v -0.418832 2.250000 -0.640669 +v -0.219558 2.625000 -0.757391 +v -0.216125 3.375000 -0.765592 +v -0.411953 3.750000 -0.657099 +v -0.608495 4.125000 -0.548211 +v 0.403943 5.625000 -0.868597 +v 0.415624 5.250000 -0.847613 +v 0.427268 4.875000 -0.826696 +v 0.548173 4.125000 -0.608564 +v 0.657073 3.750000 -0.411999 +v 0.765579 3.375000 -0.216148 +v 0.757407 2.625000 -0.219532 +v 0.640699 2.250000 -0.418782 +v 0.523565 1.875000 -0.618758 +v 1.263353 5.625000 0.587587 +v 1.232790 5.250000 0.604602 +v 1.202341 4.875000 0.621551 +v 0.885084 4.125000 0.797398 +v 0.599205 3.750000 0.955780 +v 0.314363 3.375000 1.113588 +v 0.319357 2.625000 1.101660 +v 0.609210 2.250000 0.931882 +v 0.900119 1.875000 0.761486 +v -0.403943 5.625000 0.868597 +v -0.415624 5.250000 0.847613 +v -0.427268 4.875000 0.826696 +v -0.548173 4.125000 0.608564 +v -0.657073 3.750000 0.411999 +v -0.765579 3.375000 0.216148 +v -0.757407 2.625000 0.219532 +v -0.640699 2.250000 0.418782 +v -0.523565 1.875000 0.618758 +v -0.667077 1.500000 0.597357 +v -0.835560 1.500000 0.281957 +v -0.892656 1.500000 -0.071042 +v -0.801903 3.000000 -0.298610 +v -0.610020 3.000000 -0.581376 +v -0.336802 3.000000 -0.786626 +v -0.692016 4.500000 0.572971 +v -0.848660 4.500000 0.250159 +v -0.892130 4.500000 -0.106002 +v 0.746418 1.500000 0.740880 +v 0.319208 1.500000 0.854014 +v -0.071086 1.500000 0.892622 +v -0.294791 3.000000 0.960756 +v -0.580422 3.000000 0.649734 +v -0.786626 3.000000 0.336802 +v 0.719426 4.500000 0.771824 +v 0.286786 4.500000 0.868610 +v -0.105962 4.500000 0.892162 +v 0.667077 1.500000 -0.597357 +v 0.872811 1.500000 -0.263504 +v 1.041663 1.500000 0.144853 +v 0.801903 3.000000 0.298610 +v 0.610975 3.000000 0.621090 +v 0.340621 3.000000 0.945479 +v 0.692016 4.500000 -0.572971 +v 0.885287 4.500000 -0.230209 +v 1.038635 4.500000 0.185804 +v -0.597411 1.500000 -0.667069 +v -0.281957 1.500000 -0.835560 +v 0.071086 1.500000 -0.892622 +v 0.298610 3.000000 -0.801903 +v 0.581376 3.000000 -0.610020 +v 0.786626 3.000000 -0.336802 +v -0.572921 4.500000 -0.692022 +v -0.250159 4.500000 -0.848660 +v 0.105962 4.500000 -0.892162 +v -0.670086 0.368056 -0.263960 +v -0.889647 6.000000 -0.392225 +v 0.263960 0.368056 -0.670086 +v 0.392225 6.000000 -0.889647 +v -0.263960 0.368056 0.670086 +v -0.392225 6.000000 0.889647 +v 0.724911 0.368056 0.285557 +v 1.294033 6.000000 0.570509 +v -0.819562 1.500000 -0.405947 +v -0.021006 3.000000 -0.873691 +v -0.805755 4.500000 -0.438925 +v 0.438875 4.500000 -0.805845 +v 0.873691 3.000000 -0.021005 +v 0.406004 1.500000 -0.819464 +v 1.172008 4.500000 0.638437 +v 0.030554 3.000000 1.270823 +v 1.192090 1.500000 0.590468 +v -0.438875 4.500000 0.805845 +v -0.873691 3.000000 0.021005 +v -0.406004 1.500000 0.819464 +vn -0.4652 -0.0321 -0.8846 +vn -0.7571 -0.0319 -0.6526 +vn -0.4462 -0.0309 -0.8944 +vn -0.7429 -0.0306 -0.6686 +vn -0.4835 -0.0333 -0.8747 +vn -0.5012 -0.0345 -0.8646 +vn -0.7705 -0.0331 -0.6366 +vn -0.7832 -0.0343 -0.6208 +vn -0.1737 -0.0372 -0.9841 +vn 0.1990 -0.0388 -0.9792 +vn -0.1937 -0.0383 -0.9803 +vn 0.1791 -0.0399 -0.9830 +vn -0.1532 -0.0360 -0.9875 +vn -0.1320 -0.0349 -0.9906 +vn 0.2194 -0.0377 -0.9749 +vn 0.2402 -0.0365 -0.9700 +vn 0.8542 -0.0367 -0.5187 +vn 0.6526 -0.0319 -0.7571 +vn 0.8651 -0.0355 -0.5003 +vn 0.6686 -0.0306 -0.7429 +vn 0.8431 -0.0379 -0.5364 +vn 0.8320 -0.0390 -0.5534 +vn 0.6366 -0.0331 -0.7705 +vn 0.6208 -0.0342 -0.7832 +vn 0.9172 -0.0545 -0.3947 +vn 0.9399 -0.0783 -0.3323 +vn 0.9089 -0.0555 -0.4133 +vn 0.9329 -0.0790 -0.3513 +vn 0.9253 -0.0535 -0.3755 +vn 0.9332 -0.0524 -0.3556 +vn 0.9467 -0.0774 -0.3126 +vn 0.9533 -0.0766 -0.2922 +vn 0.2497 -0.0176 0.9682 +vn 0.3136 0.0039 0.9496 +vn 0.2289 -0.0162 0.9733 +vn 0.2932 0.0056 0.9560 +vn 0.2698 -0.0190 0.9627 +vn 0.2894 -0.0204 0.9570 +vn 0.3333 0.0022 0.9428 +vn 0.3524 0.0005 0.9358 +vn 0.1128 -0.0336 0.9931 +vn -0.1990 -0.0388 0.9792 +vn 0.1329 -0.0347 0.9905 +vn -0.1791 -0.0399 0.9830 +vn 0.0920 -0.0324 0.9952 +vn 0.0707 -0.0312 0.9970 +vn -0.2194 -0.0377 0.9749 +vn -0.2402 -0.0365 0.9700 +vn -0.8846 -0.0321 0.4652 +vn -0.6526 -0.0319 0.7571 +vn -0.8944 -0.0309 0.4461 +vn -0.6686 -0.0306 0.7429 +vn -0.8747 -0.0333 0.4835 +vn -0.8646 -0.0345 0.5012 +vn -0.6366 -0.0331 0.7705 +vn -0.6208 -0.0342 0.7832 +vn -0.9841 -0.0372 0.1737 +vn -0.9792 -0.0389 -0.1991 +vn -0.9803 -0.0383 0.1937 +vn -0.9830 -0.0400 -0.1791 +vn -0.9876 -0.0361 0.1531 +vn -0.9906 -0.0349 0.1319 +vn -0.9749 -0.0377 -0.2196 +vn -0.9700 -0.0365 -0.2404 +vn 0.0671 -0.9831 -0.1703 +vn 0.3162 -0.8984 -0.3049 +vn -0.0253 -0.8979 -0.4394 +vn 0.2177 -0.8044 -0.5527 +vn 0.1703 -0.9831 0.0671 +vn 0.2883 -0.9065 0.3085 +vn 0.4212 -0.9065 -0.0290 +vn 0.4795 -0.8570 0.1889 +vn -0.0671 -0.9831 0.1703 +vn -0.3182 -0.8979 0.3041 +vn 0.0233 -0.8984 0.4387 +vn -0.2177 -0.8044 0.5527 +vn -0.1703 -0.9831 -0.0671 +vn -0.3041 -0.8979 -0.3182 +vn -0.4394 -0.8979 0.0253 +vn -0.5527 -0.8044 -0.2177 +vn 0.0000 1.0000 0.0000 +vn -0.8230 -0.2501 0.5100 +vn -0.5743 -0.2715 0.7723 +vn -0.6558 -0.5943 0.4655 +vn -0.4467 -0.5699 0.6897 +vn -0.8650 -0.0451 0.4998 +vn -0.8763 0.0328 0.4807 +vn -0.6214 -0.0487 0.7820 +vn -0.6391 0.0325 0.7684 +vn -0.9807 -0.0410 0.1910 +vn -0.9824 -0.0424 -0.1817 +vn -0.9847 0.0368 0.1705 +vn -0.9786 0.0384 -0.2022 +vn -0.9491 -0.2470 0.1956 +vn -0.7910 -0.5942 0.1456 +vn -0.9494 -0.2663 -0.1662 +vn -0.8065 -0.5683 -0.1628 +vn -0.9899 0.0929 0.1070 +vn -0.8825 0.0843 0.4627 +vn -0.9031 0.2382 0.3574 +vn -0.7100 0.2338 0.6642 +vn -0.9783 -0.0818 -0.1901 +vn -0.8654 -0.2328 -0.4438 +vn -0.9789 -0.0939 0.1815 +vn -0.9645 -0.2462 -0.0954 +vn -0.8661 -0.0367 -0.4985 +vn -0.6234 -0.0268 -0.7815 +vn -0.6806 -0.1936 -0.7066 +vn -0.3747 -0.1879 -0.9079 +vn -0.9662 0.1368 -0.2187 +vn -0.9604 0.2752 0.0447 +vn -0.8172 0.1497 -0.5565 +vn -0.9061 0.2888 -0.3090 +vn -0.9766 0.0729 -0.2025 +vn -0.9819 0.0846 0.1694 +vn -0.8676 0.2159 -0.4479 +vn -0.9684 0.2289 -0.0984 +vn -0.9926 -0.0893 0.0819 +vn -0.9180 -0.2257 0.3260 +vn -0.8942 -0.0809 0.4404 +vn -0.7354 -0.2213 0.6405 +vn -0.9609 -0.1319 -0.2433 +vn -0.8035 -0.1444 -0.5776 +vn -0.9650 -0.2621 0.0105 +vn -0.8982 -0.2753 -0.3426 +vn -0.8600 0.0291 -0.5094 +vn -0.6808 0.1771 -0.7107 +vn -0.6136 0.0194 -0.7894 +vn -0.3733 0.1713 -0.9117 +vn 0.3431 -0.3426 0.8746 +vn 0.3996 -0.5038 0.7659 +vn 0.3732 -0.6715 0.6402 +vn 0.4325 -0.7964 0.4227 +vn 0.2955 -0.0827 0.9517 +vn 0.2667 0.0179 0.9636 +vn 0.3598 -0.1422 0.9221 +vn 0.3303 -0.0042 0.9439 +vn 0.1327 -0.0489 0.9899 +vn -0.1819 -0.0424 0.9824 +vn 0.1094 0.0330 0.9934 +vn -0.2024 0.0384 0.9785 +vn 0.1499 -0.2639 0.9528 +vn 0.1252 -0.6039 0.7871 +vn -0.1663 -0.2663 0.9494 +vn -0.1628 -0.5683 0.8066 +vn -0.1232 -0.0850 0.9887 +vn -0.0543 -0.3239 0.9445 +vn 0.1440 0.0885 0.9856 +vn 0.2081 -0.1385 0.9683 +vn -0.3968 -0.2608 0.8800 +vn -0.5976 -0.3881 0.7016 +vn -0.3079 -0.4730 0.8255 +vn -0.4943 -0.5595 0.6653 +vn -0.5493 -0.0849 0.8313 +vn -0.7815 -0.0268 0.6233 +vn -0.7398 -0.2375 0.6295 +vn -0.9079 -0.1879 0.3747 +vn -0.2793 0.0920 0.9558 +vn -0.0147 0.2393 0.9708 +vn -0.5566 0.1497 0.8172 +vn -0.3092 0.2887 0.9061 +vn -0.4094 0.2475 0.8782 +vn -0.3214 0.4571 0.8293 +vn -0.6044 0.3700 0.7056 +vn -0.5028 0.5426 0.6729 +vn -0.1483 0.0833 0.9854 +vn 0.1089 -0.0786 0.9909 +vn -0.0785 0.3159 0.9455 +vn 0.1733 0.1430 0.9744 +vn -0.3035 -0.0884 0.9487 +vn -0.5775 -0.1445 0.8035 +vn -0.0494 -0.2268 0.9727 +vn -0.3425 -0.2754 0.8982 +vn -0.5601 0.0759 0.8250 +vn -0.7446 0.2204 0.6301 +vn -0.7894 0.0194 0.6136 +vn -0.9117 0.1713 0.3733 +vn 0.7962 -0.2602 -0.5462 +vn 0.5743 -0.2715 -0.7723 +vn 0.6401 -0.6019 -0.4774 +vn 0.4467 -0.5699 -0.6897 +vn 0.8341 -0.0445 -0.5498 +vn 0.8449 0.0374 -0.5337 +vn 0.6214 -0.0487 -0.7820 +vn 0.6391 0.0325 -0.7684 +vn 0.9141 -0.0456 -0.4029 +vn 0.9396 -0.0561 -0.3376 +vn 0.9184 0.0546 -0.3918 +vn 0.9409 0.0791 -0.3293 +vn 0.8799 -0.3148 -0.3558 +vn 0.7196 -0.6647 -0.2006 +vn 0.8606 -0.4446 -0.2483 +vn 0.6178 -0.7863 -0.0039 +vn 0.9759 0.1406 -0.1669 +vn 0.8825 0.0843 -0.4627 +vn 0.8691 0.2802 -0.4076 +vn 0.7100 0.2338 -0.6642 +vn 0.9909 -0.0350 0.1298 +vn 0.8988 -0.1941 0.3930 +vn 0.9789 -0.0939 -0.1815 +vn 0.9645 -0.2462 0.0954 +vn 0.9480 0.1448 0.2834 +vn 0.8674 0.3781 0.3236 +vn 0.8401 -0.0343 0.5413 +vn 0.7867 0.1988 0.5845 +vn 0.9505 0.3105 -0.0087 +vn 0.8717 0.4220 -0.2490 +vn 0.8589 0.5098 0.0493 +vn 0.7954 0.5814 -0.1710 +vn 0.9894 0.0274 0.1423 +vn 0.9819 0.0846 -0.1694 +vn 0.9006 0.1775 0.3967 +vn 0.9684 0.2289 0.0984 +vn 0.9805 -0.1356 -0.1422 +vn 0.8865 -0.2670 -0.3778 +vn 0.8942 -0.0809 -0.4404 +vn 0.7354 -0.2213 -0.6405 +vn 0.9534 -0.3012 0.0155 +vn 0.8644 -0.4976 0.0718 +vn 0.8865 -0.4074 -0.2194 +vn 0.8109 -0.5672 -0.1442 +vn 0.9440 -0.1472 0.2952 +vn 0.8389 0.0200 0.5439 +vn 0.8648 -0.3741 0.3351 +vn 0.7836 -0.2076 0.5855 +vn -0.5100 -0.2501 -0.8230 +vn -0.7723 -0.2715 -0.5743 +vn -0.4655 -0.5944 -0.6558 +vn -0.6897 -0.5700 -0.4466 +vn -0.4998 -0.0451 -0.8650 +vn -0.4806 0.0327 -0.8763 +vn -0.7819 -0.0487 -0.6214 +vn -0.7684 0.0325 -0.6392 +vn -0.1909 -0.0410 -0.9807 +vn 0.1819 -0.0424 -0.9824 +vn -0.1704 0.0367 -0.9847 +vn 0.2024 0.0384 -0.9785 +vn -0.1955 -0.2470 -0.9491 +vn -0.1455 -0.5942 -0.7910 +vn 0.1663 -0.2663 -0.9494 +vn 0.1628 -0.5683 -0.8066 +vn -0.1070 0.0929 -0.9899 +vn -0.4628 0.0843 -0.8825 +vn -0.3573 0.2382 -0.9031 +vn -0.6642 0.2338 -0.7100 +vn 0.1901 -0.0818 -0.9784 +vn 0.4438 -0.2328 -0.8654 +vn -0.1815 -0.0939 -0.9789 +vn 0.0954 -0.2462 -0.9645 +vn 0.4985 -0.0367 -0.8661 +vn 0.7815 -0.0268 -0.6233 +vn 0.7066 -0.1935 -0.6806 +vn 0.9079 -0.1879 -0.3747 +vn 0.2187 0.1368 -0.9662 +vn -0.0447 0.2751 -0.9604 +vn 0.5566 0.1497 -0.8172 +vn 0.3092 0.2887 -0.9061 +vn 0.2025 0.0729 -0.9766 +vn -0.1693 0.0846 -0.9819 +vn 0.4479 0.2159 -0.8676 +vn 0.0985 0.2289 -0.9685 +vn -0.0819 -0.0893 -0.9926 +vn -0.3260 -0.2257 -0.9180 +vn -0.4403 -0.0809 -0.8942 +vn -0.6405 -0.2213 -0.7354 +vn 0.2433 -0.1319 -0.9609 +vn 0.5775 -0.1445 -0.8035 +vn -0.0106 -0.2622 -0.9650 +vn 0.3425 -0.2754 -0.8982 +vn 0.5094 0.0291 -0.8600 +vn 0.7107 0.1771 -0.6808 +vn 0.7894 0.0194 -0.6136 +vn 0.9117 0.1713 -0.3733 +s off +f 1//1 5//1 6//1 2//1 +f 2//2 6//2 166//2 167//2 +f 5//3 269//3 268//3 6//3 +f 6//4 268//4 281//4 166//4 +f 1//5 2//5 7//5 3//5 +f 3//6 7//6 169//6 170//6 +f 2//7 167//7 168//7 7//7 +f 7//8 168//8 272//8 169//8 +f 1//9 3//9 8//9 4//9 +f 4//10 8//10 208//10 209//10 +f 3//11 170//11 171//11 8//11 +f 8//12 171//12 274//12 208//12 +f 1//13 4//13 9//13 5//13 +f 5//14 9//14 270//14 269//14 +f 4//15 209//15 210//15 9//15 +f 9//16 210//16 282//16 270//16 +f 10//17 14//17 15//17 11//17 +f 11//18 15//18 210//18 209//18 +f 14//19 260//19 259//19 15//19 +f 15//20 259//20 282//20 210//20 +f 10//21 11//21 16//21 12//21 +f 12//22 16//22 178//22 179//22 +f 11//23 209//23 208//23 16//23 +f 16//24 208//24 274//24 178//24 +f 10//25 12//25 17//25 13//25 +f 13//26 17//26 217//26 218//26 +f 12//27 179//27 180//27 17//27 +f 17//28 180//28 278//28 217//28 +f 10//29 13//29 18//29 14//29 +f 14//30 18//30 261//30 260//30 +f 13//31 218//31 219//31 18//31 +f 18//32 219//32 285//32 261//32 +f 19//33 23//33 24//33 20//33 +f 20//34 24//34 219//34 218//34 +f 23//35 251//35 250//35 24//35 +f 24//36 250//36 285//36 219//36 +f 19//37 20//37 25//37 21//37 +f 21//38 25//38 187//38 188//38 +f 20//39 218//39 217//39 25//39 +f 25//40 217//40 278//40 187//40 +f 19//41 21//41 26//41 22//41 +f 22//42 26//42 226//42 227//42 +f 21//43 188//43 189//43 26//43 +f 26//44 189//44 276//44 226//44 +f 19//45 22//45 27//45 23//45 +f 23//46 27//46 252//46 251//46 +f 22//47 227//47 228//47 27//47 +f 27//48 228//48 288//48 252//48 +f 28//49 32//49 33//49 29//49 +f 29//50 33//50 228//50 227//50 +f 32//51 242//51 241//51 33//51 +f 33//52 241//52 288//52 228//52 +f 28//53 29//53 34//53 30//53 +f 30//54 34//54 196//54 197//54 +f 29//55 227//55 226//55 34//55 +f 34//56 226//56 276//56 196//56 +f 28//57 30//57 35//57 31//57 +f 31//58 35//58 168//58 167//58 +f 30//59 197//59 198//59 35//59 +f 35//60 198//60 272//60 168//60 +f 28//61 31//61 36//61 32//61 +f 32//62 36//62 243//62 242//62 +f 31//63 167//63 166//63 36//63 +f 36//64 166//64 281//64 243//64 +f 37//65 41//65 42//65 38//65 +f 38//66 42//66 177//66 176//66 +f 41//67 164//67 163//67 42//67 +f 42//68 163//68 273//68 177//68 +f 37//69 38//69 43//69 39//69 +f 39//70 43//70 186//70 185//70 +f 38//71 176//71 175//71 43//71 +f 43//72 175//72 277//72 186//72 +f 37//73 39//73 44//73 40//73 +f 40//74 44//74 195//74 194//74 +f 39//75 185//75 184//75 44//75 +f 44//76 184//76 275//76 195//76 +f 37//77 40//77 45//77 41//77 +f 41//78 45//78 165//78 164//78 +f 40//79 194//79 193//79 45//79 +f 45//80 193//80 271//80 165//80 +f 46//81 50//81 51//81 47//81 +f 47//81 51//81 180//81 179//81 +f 50//81 188//81 187//81 51//81 +f 51//81 187//81 278//81 180//81 +f 46//81 47//81 52//81 48//81 +f 48//81 52//81 171//81 170//81 +f 47//81 179//81 178//81 52//81 +f 52//81 178//81 274//81 171//81 +f 46//81 48//81 53//81 49//81 +f 49//81 53//81 198//81 197//81 +f 48//81 170//81 169//81 53//81 +f 53//81 169//81 272//81 198//81 +f 46//81 49//81 54//81 50//81 +f 50//81 54//81 189//81 188//81 +f 49//81 197//81 196//81 54//81 +f 54//81 196//81 276//81 189//81 +f 55//82 59//82 60//82 56//82 +f 56//83 60//83 192//83 191//83 +f 59//84 194//84 195//84 60//84 +f 60//85 195//85 275//85 192//85 +f 55//86 56//86 61//86 57//86 +f 57//87 61//87 235//87 236//87 +f 56//88 191//88 190//88 61//88 +f 61//89 190//89 290//89 235//89 +f 55//90 57//90 62//90 58//90 +f 58//91 62//91 201//91 200//91 +f 57//92 236//92 237//92 62//92 +f 62//93 237//93 279//93 201//93 +f 55//94 58//94 63//94 59//94 +f 59//95 63//95 193//95 194//95 +f 58//96 200//96 199//96 63//96 +f 63//97 199//97 271//97 193//97 +f 64//98 68//98 69//98 65//98 +f 65//99 69//99 234//99 233//99 +f 68//100 236//100 235//100 69//100 +f 69//101 235//101 290//101 234//101 +f 64//102 65//102 70//102 66//102 +f 66//103 70//103 238//103 239//103 +f 65//104 233//104 232//104 70//104 +f 70//105 232//105 289//105 238//105 +f 64//106 66//106 71//106 67//106 +f 67//107 71//107 204//107 203//107 +f 66//108 239//108 240//108 71//108 +f 71//109 240//109 280//109 204//109 +f 64//110 67//110 72//110 68//110 +f 68//111 72//111 237//111 236//111 +f 67//112 203//112 202//112 72//112 +f 72//113 202//113 279//113 237//113 +f 73//114 77//114 78//114 74//114 +f 74//115 78//115 231//115 230//115 +f 77//116 239//116 238//116 78//116 +f 78//117 238//117 289//117 231//117 +f 73//118 74//118 79//118 75//118 +f 75//119 79//119 241//119 242//119 +f 74//120 230//120 229//120 79//120 +f 79//121 229//121 288//121 241//121 +f 73//122 75//122 80//122 76//122 +f 76//123 80//123 207//123 206//123 +f 75//124 242//124 243//124 80//124 +f 80//125 243//125 281//125 207//125 +f 73//126 76//126 81//126 77//126 +f 77//127 81//127 240//127 239//127 +f 76//128 206//128 205//128 81//128 +f 81//129 205//129 280//129 240//129 +f 82//130 86//130 87//130 83//130 +f 83//131 87//131 183//131 182//131 +f 86//132 185//132 186//132 87//132 +f 87//133 186//133 277//133 183//133 +f 82//134 83//134 88//134 84//134 +f 84//135 88//135 244//135 245//135 +f 83//136 182//136 181//136 88//136 +f 88//137 181//137 287//137 244//137 +f 82//138 84//138 89//138 85//138 +f 85//139 89//139 190//139 191//139 +f 84//140 245//140 246//140 89//140 +f 89//141 246//141 290//141 190//141 +f 82//142 85//142 90//142 86//142 +f 86//143 90//143 184//143 185//143 +f 85//144 191//144 192//144 90//144 +f 90//145 192//145 275//145 184//145 +f 91//146 95//146 96//146 92//146 +f 92//147 96//147 225//147 224//147 +f 95//148 245//148 244//148 96//148 +f 96//149 244//149 287//149 225//149 +f 91//150 92//150 97//150 93//150 +f 93//151 97//151 247//151 248//151 +f 92//152 224//152 223//152 97//152 +f 97//153 223//153 286//153 247//153 +f 91//154 93//154 98//154 94//154 +f 94//155 98//155 232//155 233//155 +f 93//156 248//156 249//156 98//156 +f 98//157 249//157 289//157 232//157 +f 91//158 94//158 99//158 95//158 +f 95//159 99//159 246//159 245//159 +f 94//160 233//160 234//160 99//160 +f 99//161 234//161 290//161 246//161 +f 100//162 104//162 105//162 101//162 +f 101//163 105//163 222//163 221//163 +f 104//164 248//164 247//164 105//164 +f 105//165 247//165 286//165 222//165 +f 100//166 101//166 106//166 102//166 +f 102//167 106//167 250//167 251//167 +f 101//168 221//168 220//168 106//168 +f 106//169 220//169 285//169 250//169 +f 100//170 102//170 107//170 103//170 +f 103//171 107//171 229//171 230//171 +f 102//172 251//172 252//172 107//172 +f 107//173 252//173 288//173 229//173 +f 100//174 103//174 108//174 104//174 +f 104//175 108//175 249//175 248//175 +f 103//176 230//176 231//176 108//176 +f 108//177 231//177 289//177 249//177 +f 109//178 113//178 114//178 110//178 +f 110//179 114//179 174//179 173//179 +f 113//180 176//180 177//180 114//180 +f 114//181 177//181 273//181 174//181 +f 109//182 110//182 115//182 111//182 +f 111//183 115//183 253//183 254//183 +f 110//184 173//184 172//184 115//184 +f 115//185 172//185 284//185 253//185 +f 109//186 111//186 116//186 112//186 +f 112//187 116//187 181//187 182//187 +f 111//188 254//188 255//188 116//188 +f 116//189 255//189 287//189 181//189 +f 109//190 112//190 117//190 113//190 +f 113//191 117//191 175//191 176//191 +f 112//192 182//192 183//192 117//192 +f 117//193 183//193 277//193 175//193 +f 118//194 122//194 123//194 119//194 +f 119//195 123//195 216//195 215//195 +f 122//196 254//196 253//196 123//196 +f 123//197 253//197 284//197 216//197 +f 118//198 119//198 124//198 120//198 +f 120//199 124//199 256//199 257//199 +f 119//200 215//200 214//200 124//200 +f 124//201 214//201 283//201 256//201 +f 118//202 120//202 125//202 121//202 +f 121//203 125//203 223//203 224//203 +f 120//204 257//204 258//204 125//204 +f 125//205 258//205 286//205 223//205 +f 118//206 121//206 126//206 122//206 +f 122//207 126//207 255//207 254//207 +f 121//208 224//208 225//208 126//208 +f 126//209 225//209 287//209 255//209 +f 127//210 131//210 132//210 128//210 +f 128//211 132//211 213//211 212//211 +f 131//212 257//212 256//212 132//212 +f 132//213 256//213 283//213 213//213 +f 127//214 128//214 133//214 129//214 +f 129//215 133//215 259//215 260//215 +f 128//216 212//216 211//216 133//216 +f 133//217 211//217 282//217 259//217 +f 127//218 129//218 134//218 130//218 +f 130//219 134//219 220//219 221//219 +f 129//220 260//220 261//220 134//220 +f 134//221 261//221 285//221 220//221 +f 127//222 130//222 135//222 131//222 +f 131//223 135//223 258//223 257//223 +f 130//224 221//224 222//224 135//224 +f 135//225 222//225 286//225 258//225 +f 136//226 140//226 141//226 137//226 +f 137//227 141//227 199//227 200//227 +f 140//228 164//228 165//228 141//228 +f 141//229 165//229 271//229 199//229 +f 136//230 137//230 142//230 138//230 +f 138//231 142//231 262//231 263//231 +f 137//232 200//232 201//232 142//232 +f 142//233 201//233 279//233 262//233 +f 136//234 138//234 143//234 139//234 +f 139//235 143//235 172//235 173//235 +f 138//236 263//236 264//236 143//236 +f 143//237 264//237 284//237 172//237 +f 136//238 139//238 144//238 140//238 +f 140//239 144//239 163//239 164//239 +f 139//240 173//240 174//240 144//240 +f 144//241 174//241 273//241 163//241 +f 145//242 149//242 150//242 146//242 +f 146//243 150//243 202//243 203//243 +f 149//244 263//244 262//244 150//244 +f 150//245 262//245 279//245 202//245 +f 145//246 146//246 151//246 147//246 +f 147//247 151//247 265//247 266//247 +f 146//248 203//248 204//248 151//248 +f 151//249 204//249 280//249 265//249 +f 145//250 147//250 152//250 148//250 +f 148//251 152//251 214//251 215//251 +f 147//252 266//252 267//252 152//252 +f 152//253 267//253 283//253 214//253 +f 145//254 148//254 153//254 149//254 +f 149//255 153//255 264//255 263//255 +f 148//256 215//256 216//256 153//256 +f 153//257 216//257 284//257 264//257 +f 154//258 158//258 159//258 155//258 +f 155//259 159//259 205//259 206//259 +f 158//260 266//260 265//260 159//260 +f 159//261 265//261 280//261 205//261 +f 154//262 155//262 160//262 156//262 +f 156//263 160//263 268//263 269//263 +f 155//264 206//264 207//264 160//264 +f 160//265 207//265 281//265 268//265 +f 154//266 156//266 161//266 157//266 +f 157//267 161//267 211//267 212//267 +f 156//268 269//268 270//268 161//268 +f 161//269 270//269 282//269 211//269 +f 154//270 157//270 162//270 158//270 +f 158//271 162//271 267//271 266//271 +f 157//272 212//272 213//272 162//272 +f 162//273 213//273 283//273 267//273 diff --git a/modules/ufbx/data/blender_279_sausage_wiggle_20.obj b/modules/ufbx/data/blender_279_sausage_wiggle_20.obj new file mode 100644 index 0000000..3ac7877 --- /dev/null +++ b/modules/ufbx/data/blender_279_sausage_wiggle_20.obj @@ -0,0 +1,844 @@ +# ufbx:bad_uvs +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +g Skin_Cube.001 +v -1.091528 4.313337 0.000001 +v -1.030064 4.310006 0.375001 +v -1.047250 4.709257 0.000001 +v -1.030032 4.310046 -0.374999 +v -1.123311 3.922210 0.000001 +v -1.062235 3.919911 0.375001 +v -0.985389 4.704895 0.375001 +v -0.985365 4.704921 -0.374999 +v -1.062209 3.919955 -0.374999 +v -0.138587 4.262017 -0.968749 +v -0.538189 4.283551 -0.874999 +v -0.088220 4.641850 -0.968749 +v 0.322490 4.237185 -0.999999 +v -0.176438 3.886921 -0.968749 +v -0.573497 3.901733 -0.874999 +v -0.490380 4.670126 -0.874999 +v 0.375810 4.609233 -0.999999 +v 0.281705 3.869848 -0.999999 +v 0.783613 4.212353 -0.031249 +v 0.814328 4.210704 -0.499999 +v 0.839874 4.576618 -0.031249 +v 0.691418 4.217315 0.375001 +v 0.739890 3.852770 -0.031249 +v 0.770410 3.851643 -0.499999 +v 0.870792 4.574446 -0.499999 +v 0.747082 4.583140 0.375001 +v 0.648282 3.856178 0.375001 +v -0.169327 4.263672 0.937501 +v 0.199575 4.243809 0.875001 +v -0.119156 4.644024 0.937501 +v -0.538226 4.283525 0.875001 +v -0.206982 3.888059 0.937501 +v 0.159570 3.874399 0.875001 +v 0.252097 4.617934 0.875001 +v -0.490408 4.670109 0.875001 +v -0.573530 3.901706 0.875001 +v 0.054212 0.073271 -0.000000 +v 0.080544 0.108859 -0.350694 +v 0.362462 -0.099728 -0.000000 +v 0.080544 0.108859 0.350694 +v -0.201374 0.317447 0.000000 +v -0.157052 0.336486 -0.326389 +v 0.367706 -0.051777 -0.326389 +v 0.367706 -0.051777 0.326389 +v -0.157052 0.336486 0.326389 +v -0.052512 5.028802 -0.003905 +v -0.040837 5.027791 -0.484374 +v -0.523407 5.069566 0.000001 +v -0.056404 5.029139 0.468751 +v 0.426167 4.987364 -0.015624 +v 0.441734 4.986016 -0.499999 +v -0.492273 5.066871 -0.437499 +v -0.492273 5.066871 0.437501 +v 0.379466 4.991406 0.437501 +v 0.523519 0.630691 0.907986 +v 0.815991 0.438183 0.847222 +v 0.731992 0.909823 0.937500 +v 0.235973 0.830500 0.847222 +v 0.327989 0.394801 0.819444 +v 0.599968 0.224144 0.763889 +v 1.030833 0.717207 0.875000 +v 0.433150 1.102461 0.875000 +v 0.076706 0.594690 0.763889 +v 1.057564 1.770461 0.937500 +v 1.341732 1.785480 0.875000 +v 0.823501 2.030382 0.937500 +v 0.773396 1.755454 0.875000 +v 1.095208 1.496883 0.937500 +v 1.386255 1.413296 0.875000 +v 1.100820 2.143649 0.875000 +v 0.546182 1.917122 0.875000 +v 0.804160 1.580487 0.875000 +v -0.137287 2.803306 0.937500 +v 0.179889 2.905541 0.875000 +v -0.239594 3.136696 0.937500 +v -0.454460 2.701064 0.875000 +v 0.074137 2.516732 0.937500 +v 0.367932 2.673528 0.875000 +v 0.101052 3.184174 0.875000 +v -0.580236 3.089208 0.875000 +v -0.219655 2.359934 0.875000 +v 1.271021 0.125037 -0.027344 +v 1.290456 0.117156 -0.472222 +v 1.503939 0.412198 -0.031250 +v 1.203096 0.176335 0.362847 +v 0.997323 -0.079227 -0.015625 +v 1.000694 -0.059702 -0.388889 +v 1.528820 0.396114 -0.500000 +v 1.429255 0.460384 0.375000 +v 0.950637 -0.024197 0.326389 +v 1.791682 1.809246 -0.031250 +v 1.815372 1.810482 -0.500000 +v 1.539929 2.322982 -0.031250 +v 1.720630 1.805506 0.375000 +v 1.847080 1.280929 -0.031250 +v 1.871336 1.273939 -0.500000 +v 1.563048 2.332413 -0.500000 +v 1.470589 2.294673 0.375000 +v 1.774317 1.301848 0.375000 +v 0.682087 3.067423 -0.031250 +v 0.708517 3.075952 -0.500000 +v 0.640395 3.259356 -0.031249 +v 0.602793 3.041856 0.375000 +v 0.833116 2.921794 -0.031250 +v 0.857602 2.934865 -0.500000 +v 0.668774 3.263324 -0.499999 +v 0.555243 3.247476 0.375001 +v 0.759664 2.882589 0.375000 +v 0.545372 0.615908 -0.935330 +v 0.236029 0.830487 -0.847222 +v 0.756894 0.893771 -0.968750 +v 0.903350 0.379029 -0.956597 +v 0.340513 0.385932 -0.835069 +v 0.076747 0.594684 -0.763889 +v 0.433198 1.102443 -0.875000 +v 1.130394 0.652968 -1.000000 +v 0.650024 0.188652 -0.826389 +v 1.081245 1.771712 -0.968750 +v 0.773383 1.755440 -0.875000 +v 0.846612 2.039821 -0.968750 +v 1.436471 1.790472 -1.000000 +v 1.119462 1.489917 -0.968750 +v 0.804162 1.580469 -0.875000 +v 0.546166 1.917114 -0.875000 +v 1.193279 2.181399 -1.000000 +v 1.483272 1.385411 -1.000000 +v -0.110855 2.811826 -0.968750 +v -0.454468 2.701070 -0.875000 +v -0.211207 3.140653 -0.968750 +v 0.285617 2.939630 -1.000000 +v 0.098621 2.529799 -0.968750 +v -0.219666 2.359936 -0.875000 +v -0.580233 3.089221 -0.875000 +v 0.214588 3.200010 -1.000000 +v 0.465872 2.725800 -1.000000 +v -0.202130 1.121562 0.000000 +v -0.151134 1.092372 0.362847 +v -0.015053 1.391396 0.000000 +v -0.151076 1.092336 -0.362847 +v -0.328820 0.859960 0.000000 +v -0.273964 0.843044 0.326389 +v 0.034724 1.359315 0.375000 +v 0.034775 1.359267 -0.375000 +v -0.273922 0.843025 -0.326389 +v 0.347127 1.732927 -0.000000 +v 0.394496 1.735444 0.375000 +v 0.130183 1.747222 -0.000000 +v 0.394484 1.735414 -0.375000 +v 0.367590 1.705870 -0.000000 +v 0.416096 1.691959 0.375000 +v 0.176412 1.766108 0.375000 +v 0.176397 1.766091 -0.375000 +v 0.416099 1.691917 -0.375000 +v -0.930229 2.547709 0.000000 +v -0.877361 2.564741 0.375000 +v -1.091196 3.017993 0.000000 +v -0.877372 2.564756 -0.375000 +v -0.660358 2.124738 0.000000 +v -0.611385 2.150869 0.375000 +v -1.034421 3.025893 0.375000 +v -1.034424 3.025920 -0.375000 +v -0.611398 2.150874 -0.375000 +v -0.302593 0.598045 -0.302083 +v -0.357931 0.597685 0.000000 +v -0.302593 0.598045 0.302083 +v -0.878984 3.913065 0.687501 +v -0.845641 4.300058 0.687501 +v -0.799784 4.691838 0.687501 +v -0.928143 5.104603 0.375001 +v -0.990410 5.109993 0.000001 +v -0.928143 5.104603 -0.374999 +v 0.184209 1.262939 -0.687500 +v -0.003246 0.997653 -0.665365 +v -0.131357 0.764009 -0.598958 +v 0.434301 0.052825 -0.614583 +v 0.162292 0.212779 -0.647135 +v -0.063940 0.421468 -0.598958 +v -0.430006 5.061481 -0.874999 +v -0.025270 5.026443 -0.968749 +v 0.441734 4.986017 -0.999999 +v 1.528799 0.396082 -1.000000 +v 1.285646 0.130986 -0.944444 +v 0.982408 -0.002897 -0.777778 +v 0.660394 -0.114458 0.302083 +v 0.679374 -0.169805 -0.003906 +v 0.672954 -0.123752 -0.317708 +v 0.939871 4.942894 -0.499999 +v 0.908737 4.945589 -0.031249 +v 0.815336 4.953675 0.375001 +v 1.279868 0.556715 0.687500 +v 1.060247 0.278306 0.665365 +v 0.828807 0.084045 0.598958 +v -0.063940 0.421468 0.598958 +v 0.159152 0.215102 0.643229 +v 0.421740 0.062119 0.598958 +v 0.317199 4.996797 0.875001 +v -0.056404 5.029139 0.937501 +v -0.430006 5.061481 0.875001 +v -0.131439 0.764037 0.598958 +v -0.003360 0.997709 0.665365 +v 0.184109 1.263013 0.687500 +v 0.561619 1.650173 0.687500 +v 0.536589 1.742960 0.687500 +v 0.315084 1.822745 0.687500 +v -0.464481 2.229267 0.687500 +v -0.718768 2.615857 0.687500 +v -0.864102 3.049625 0.687500 +v -0.799732 4.691885 -0.687499 +v -0.845575 4.300128 -0.687499 +v -0.878928 3.913141 -0.687499 +v -0.864103 3.049669 -0.687500 +v -0.718788 2.615880 -0.687500 +v -0.464505 2.229274 -0.687500 +v 0.315052 1.822717 -0.687500 +v 0.536565 1.742912 -0.687500 +v 0.561624 1.650107 -0.687500 +v 0.870774 4.574450 -0.999999 +v 0.814302 4.210711 -0.999999 +v 0.770385 3.851653 -0.999999 +v 0.668765 3.263336 -0.999999 +v 0.708516 3.075962 -1.000000 +v 0.857605 2.934871 -1.000000 +v 1.563057 2.332406 -1.000000 +v 1.815380 1.810467 -1.000000 +v 1.871338 1.273915 -1.000000 +v 0.561480 4.596188 0.687501 +v 0.507001 4.227249 0.687501 +v 0.465038 3.863006 0.687501 +v 0.384928 3.223730 0.687500 +v 0.444204 2.990731 0.687500 +v 0.612761 2.804187 0.687500 +v 1.331917 2.238044 0.687500 +v 1.578536 1.798007 0.687500 +v 1.628792 1.343657 0.687500 +v 1.233314 1.027022 0.875000 +v 0.935357 1.209573 0.937500 +v 0.637399 1.392147 0.875000 +v 0.664587 2.487880 0.875000 +v 0.394086 2.276721 0.937500 +v 0.123585 2.065563 0.875000 +v 0.132020 3.509680 0.875001 +v -0.232186 3.517158 0.937501 +v -0.596386 3.524623 0.875000 +v 1.729868 0.722704 -0.500000 +v 1.705049 0.737950 -0.031250 +v 1.630572 0.783619 0.375000 +v 1.115434 2.839812 -0.500000 +v 1.092889 2.822216 -0.031250 +v 1.025260 2.769426 0.375000 +v 0.738970 3.497235 -0.499999 +v 0.708640 3.497845 -0.031249 +v 0.617611 3.499703 0.375001 +v 0.637426 1.392126 -0.875000 +v 0.960186 1.194359 -0.968750 +v 1.332606 0.966138 -1.000000 +v 0.123579 2.065562 -0.875000 +v 0.416628 2.294318 -0.968750 +v 0.754762 2.558267 -1.000000 +v -0.596366 3.524646 -0.875000 +v -0.201836 3.516535 -0.968749 +v 0.253386 3.507195 -0.999999 +v 0.240138 1.635581 0.375000 +v 0.190495 1.665982 0.000000 +v 0.240167 1.635529 -0.375000 +v -0.237087 1.784019 0.375000 +v -0.282174 1.748824 -0.000000 +v -0.237094 1.784016 -0.375000 +v -1.081970 3.534582 0.375000 +v -1.142662 3.535849 0.000000 +v -1.081957 3.534623 -0.375000 +v -0.190472 0.598774 0.509259 +v -0.741342 5.088431 0.687501 +v -0.190472 0.598774 -0.509259 +v -0.741342 5.088432 -0.687499 +v 0.628300 -0.007026 0.509259 +v 0.628535 4.969846 0.687501 +v 0.661795 -0.031808 -0.550926 +v 0.939871 4.942895 -0.999999 +v 0.389096 1.544313 0.687500 +v -0.101831 1.889599 0.687500 +v -0.899884 3.530831 0.687500 +v -0.899853 3.530899 -0.687500 +v -0.101845 1.889595 -0.687500 +v 0.389153 1.544233 -0.687500 +v 0.738951 3.497248 -0.999999 +v 1.115437 2.839812 -1.000000 +v 1.729858 0.722672 -1.000000 +v 0.435531 3.503437 0.687501 +v 0.890005 2.663846 0.687500 +v 1.481611 0.874917 0.687500 +vn -0.9836 0.0805 0.1613 +vn -0.8588 0.0724 0.5072 +vn -0.9858 0.0499 0.1603 +vn -0.8621 0.0456 0.5047 +vn -0.9805 0.1103 0.1624 +vn -0.9767 0.1392 0.1635 +vn -0.8547 0.0984 0.5097 +vn -0.8499 0.1235 0.5122 +vn -0.9805 0.1103 -0.1624 +vn -0.8547 0.0983 -0.5097 +vn -0.9767 0.1392 -0.1635 +vn -0.8499 0.1234 -0.5122 +vn -0.9836 0.0805 -0.1614 +vn -0.9858 0.0499 -0.1603 +vn -0.8588 0.0724 -0.5072 +vn -0.8621 0.0457 -0.5047 +vn -0.2281 0.0220 -0.9734 +vn -0.5199 0.0464 -0.8530 +vn -0.2301 0.0149 -0.9731 +vn -0.5235 0.0302 -0.8515 +vn -0.2259 0.0289 -0.9737 +vn -0.2236 0.0355 -0.9740 +vn -0.5157 0.0621 -0.8545 +vn -0.5111 0.0770 -0.8560 +vn -0.0668 0.0092 -0.9977 +vn 0.0000 0.0000 -1.0000 +vn -0.0661 0.0112 -0.9978 +vn -0.0675 0.0072 -0.9977 +vn -0.0681 0.0050 -0.9977 +vn 0.9905 -0.1208 0.0651 +vn 0.9926 -0.1214 -0.0001 +vn 0.9940 -0.0879 0.0647 +vn 0.9961 -0.0884 -0.0000 +vn 0.9861 -0.1527 0.0655 +vn 0.9808 -0.1835 0.0659 +vn 0.9882 -0.1534 -0.0000 +vn 0.9829 -0.1843 -0.0000 +vn 0.9639 -0.1478 0.2215 +vn 0.8514 -0.1276 0.5087 +vn 0.9585 -0.1777 0.2228 +vn 0.8457 -0.1538 0.5111 +vn 0.9684 -0.1167 0.2203 +vn 0.9720 -0.0846 0.2190 +vn 0.8564 -0.1005 0.5065 +vn 0.8605 -0.0723 0.5042 +vn 0.1668 -0.0174 0.9858 +vn 0.5191 -0.0580 0.8527 +vn 0.1683 -0.0121 0.9857 +vn 0.5230 -0.0412 0.8513 +vn 0.1651 -0.0225 0.9860 +vn 0.1634 -0.0273 0.9862 +vn 0.5147 -0.0741 0.8542 +vn 0.5099 -0.0895 0.8556 +vn -0.1652 0.0211 0.9860 +vn -0.5157 0.0621 0.8545 +vn -0.1635 0.0259 0.9862 +vn -0.5111 0.0771 0.8560 +vn -0.1668 0.0161 0.9859 +vn -0.1683 0.0108 0.9857 +vn -0.5198 0.0464 0.8530 +vn -0.5235 0.0302 0.8515 +vn -0.6888 -0.7133 -0.1294 +vn -0.6578 -0.6309 -0.4116 +vn -0.8661 -0.4761 -0.1520 +vn -0.8161 -0.3968 -0.4200 +vn -0.4807 -0.8673 -0.1294 +vn -0.2193 -0.9654 -0.1413 +vn -0.4255 -0.8128 -0.3979 +vn -0.2167 -0.9057 -0.3644 +vn -0.4807 -0.8673 0.1294 +vn -0.4118 -0.8122 0.4131 +vn -0.2035 -0.9670 0.1535 +vn -0.1408 -0.8965 0.4200 +vn -0.6888 -0.7133 0.1294 +vn -0.8661 -0.4761 0.1520 +vn -0.6563 -0.6314 0.4131 +vn -0.8161 -0.3968 0.4200 +vn 0.0862 0.9963 0.0000 +vn -0.0235 -0.3379 0.9409 +vn 0.2361 -0.5521 0.7997 +vn -0.2040 -0.5801 0.7886 +vn 0.0397 -0.7376 0.6741 +vn 0.0930 -0.1712 0.9808 +vn 0.1454 -0.0968 0.9846 +vn 0.3861 -0.3764 0.8422 +vn 0.4525 -0.2912 0.8429 +vn -0.1841 0.0334 0.9823 +vn -0.4677 0.2563 0.8459 +vn -0.1437 0.0994 0.9846 +vn -0.4379 0.3138 0.8425 +vn -0.2956 -0.1228 0.9474 +vn -0.4761 -0.3586 0.8029 +vn -0.5685 0.0870 0.8181 +vn -0.6847 -0.1349 0.7163 +vn 0.2154 0.0274 0.9761 +vn 0.6199 0.0711 0.7815 +vn 0.1722 -0.0800 0.9818 +vn 0.5405 -0.1897 0.8197 +vn 0.1842 0.1415 0.9726 +vn 0.1194 0.1750 0.9773 +vn 0.5427 0.3315 0.7717 +vn 0.3934 0.4487 0.8024 +vn -0.1722 -0.1884 0.9669 +vn -0.3624 -0.6736 0.6442 +vn -0.0974 -0.2103 0.9728 +vn -0.1756 -0.6847 0.7074 +vn -0.2160 -0.0329 0.9758 +vn -0.1589 0.1091 0.9812 +vn -0.6205 -0.1293 0.7735 +vn -0.3986 0.4597 0.7936 +vn 0.1514 0.1166 0.9816 +vn 0.4410 0.3757 0.8151 +vn 0.1117 0.1618 0.9805 +vn 0.2968 0.5225 0.7993 +vn 0.1750 0.0518 0.9832 +vn 0.1751 -0.0095 0.9845 +vn 0.5360 0.1447 0.8317 +vn 0.5396 -0.0727 0.8388 +vn -0.1743 -0.0551 0.9832 +vn -0.5286 -0.1744 0.8308 +vn -0.1745 -0.0019 0.9847 +vn -0.5366 -0.0304 0.8433 +vn -0.1544 -0.1097 0.9819 +vn -0.1202 -0.1491 0.9815 +vn -0.4717 -0.3170 0.8228 +vn -0.3800 -0.4231 0.8225 +vn 0.5607 -0.8280 0.0038 +vn 0.4340 -0.8969 -0.0852 +vn 0.2205 -0.9709 -0.0936 +vn 0.0318 -0.9718 -0.2339 +vn 0.7689 -0.6371 0.0540 +vn 0.8496 -0.5237 0.0625 +vn 0.7478 -0.6638 -0.0131 +vn 0.8516 -0.5242 0.0000 +vn 0.7601 -0.6140 0.2128 +vn 0.6655 -0.5577 0.4961 +vn 0.8306 -0.5150 0.2120 +vn 0.7375 -0.4634 0.4912 +vn 0.5906 -0.7803 0.2058 +vn 0.2763 -0.9424 0.1885 +vn 0.4868 -0.7240 0.4887 +vn 0.2131 -0.8637 0.4567 +vn 0.9933 0.1039 0.0502 +vn 0.9946 0.1037 0.0000 +vn 0.9665 -0.2504 0.0565 +vn 0.9686 -0.2486 0.0000 +vn 0.8980 0.4371 0.0498 +vn 0.7463 0.6633 0.0555 +vn 0.9003 0.4352 0.0000 +vn 0.7499 0.6615 0.0000 +vn 0.8813 0.4410 0.1697 +vn 0.8059 0.4307 0.4062 +vn 0.7241 0.6635 0.1883 +vn 0.6386 0.6291 0.4432 +vn 0.9798 0.1036 0.1712 +vn 0.9475 -0.2552 0.1926 +vn 0.9061 0.0983 0.4116 +vn 0.8537 -0.2517 0.4559 +vn 0.6898 0.7220 0.0541 +vn 0.6874 0.7263 0.0000 +vn 0.3516 0.9349 0.0482 +vn 0.3459 0.9383 0.0000 +vn 0.9760 0.2095 0.0599 +vn 0.9580 -0.2807 0.0590 +vn 0.9782 0.2075 -0.0000 +vn 0.9578 -0.2874 -0.0000 +vn 0.9554 0.2145 0.2032 +vn 0.8550 0.2082 0.4749 +vn 0.9464 -0.2519 0.2021 +vn 0.8590 -0.1824 0.4785 +vn 0.6914 0.6982 0.1856 +vn 0.3700 0.9138 0.1677 +vn 0.6519 0.6135 0.4458 +vn 0.3847 0.8239 0.4162 +vn -0.3375 -0.1049 -0.9355 +vn -0.5686 0.0871 -0.8180 +vn -0.4946 -0.3535 -0.7940 +vn -0.6846 -0.1347 -0.7163 +vn -0.2343 0.0662 -0.9699 +vn -0.1964 0.1356 -0.9711 +vn -0.4678 0.2563 -0.8458 +vn -0.4380 0.3139 -0.8424 +vn -0.1064 -0.0537 -0.9929 +vn -0.0653 -0.1248 -0.9900 +vn -0.0590 0.0390 -0.9975 +vn -0.2054 -0.2888 -0.9351 +vn -0.3053 -0.5839 -0.7522 +vn -0.2024 -0.4493 -0.8702 +vn -0.2552 -0.7602 -0.5975 +vn -0.2927 -0.0442 -0.9552 +vn -0.6205 -0.1294 -0.7735 +vn -0.2174 0.1465 -0.9650 +vn -0.3987 0.4596 -0.7936 +vn -0.2326 -0.2500 -0.9399 +vn -0.1332 -0.2819 -0.9501 +vn -0.3624 -0.6735 -0.6443 +vn -0.1756 -0.6846 -0.7074 +vn -0.0761 -0.0551 -0.9956 +vn -0.0501 -0.0689 -0.9964 +vn -0.0879 -0.0109 -0.9961 +vn -0.0708 0.0307 -0.9970 +vn -0.2102 -0.1498 -0.9661 +vn -0.4717 -0.3170 -0.8228 +vn -0.1632 -0.2037 -0.9653 +vn -0.3800 -0.4231 -0.8225 +vn -0.2377 -0.0750 -0.9684 +vn -0.2384 -0.0020 -0.9712 +vn -0.5286 -0.1743 -0.8308 +vn -0.5367 -0.0304 -0.8433 +vn -0.0711 -0.0207 -0.9973 +vn -0.0710 0.0050 -0.9975 +vn -0.0612 -0.0481 -0.9970 +vn -0.0446 -0.0671 -0.9968 +vn -0.8908 0.4233 0.1651 +vn -0.8068 0.3123 0.5016 +vn -0.9793 0.1031 0.1744 +vn -0.8781 0.0556 0.4752 +vn -0.8127 0.5610 0.1576 +vn -0.7919 0.5908 0.1542 +vn -0.7247 0.4762 0.4980 +vn -0.7020 0.5167 0.4902 +vn -0.8126 0.5610 -0.1578 +vn -0.7246 0.4762 -0.4981 +vn -0.7919 0.5908 -0.1544 +vn -0.7020 0.5166 -0.4903 +vn -0.8908 0.4233 -0.1653 +vn -0.9792 0.1032 -0.1745 +vn -0.8067 0.3123 -0.5017 +vn -0.8781 0.0558 -0.4753 +vn -0.8545 -0.5095 0.1015 +vn -0.8731 -0.2987 0.3854 +vn -0.2620 0.9608 0.0910 +vn -0.3930 0.8441 0.3648 +vn -0.1027 -0.9939 0.0412 +vn -0.0236 -0.9969 0.0748 +vn -0.2385 -0.9493 0.2046 +vn -0.0972 -0.9522 0.2897 +vn -0.1027 -0.9939 -0.0411 +vn -0.2386 -0.9493 -0.2046 +vn -0.0236 -0.9969 -0.0747 +vn -0.0972 -0.9522 -0.2897 +vn -0.8544 -0.5096 -0.1014 +vn -0.2620 0.9607 -0.0912 +vn -0.8730 -0.2989 -0.3853 +vn -0.3931 0.8440 -0.3650 +vn -0.8334 -0.5336 0.1439 +vn -0.7431 -0.4830 0.4633 +vn -0.6951 -0.7042 0.1448 +vn -0.6128 -0.6391 0.4648 +vn -0.9360 -0.3196 0.1475 +vn -0.9834 -0.0949 0.1549 +vn -0.8347 -0.2820 0.4730 +vn -0.8677 -0.0730 0.4916 +vn -0.9360 -0.3196 -0.1475 +vn -0.8347 -0.2820 -0.4730 +vn -0.9834 -0.0948 -0.1549 +vn -0.8677 -0.0730 -0.4916 +vn -0.8334 -0.5336 -0.1439 +vn -0.6951 -0.7042 -0.1447 +vn -0.7431 -0.4829 -0.4633 +vn -0.6128 -0.6392 -0.4648 +s off +f 1//1 5//1 6//1 2//1 +f 2//2 6//2 166//2 167//2 +f 5//3 269//3 268//3 6//3 +f 6//4 268//4 281//4 166//4 +f 1//5 2//5 7//5 3//5 +f 3//6 7//6 169//6 170//6 +f 2//7 167//7 168//7 7//7 +f 7//8 168//8 272//8 169//8 +f 1//9 3//9 8//9 4//9 +f 4//10 8//10 208//10 209//10 +f 3//11 170//11 171//11 8//11 +f 8//12 171//12 274//12 208//12 +f 1//13 4//13 9//13 5//13 +f 5//14 9//14 270//14 269//14 +f 4//15 209//15 210//15 9//15 +f 9//16 210//16 282//16 270//16 +f 10//17 14//17 15//17 11//17 +f 11//18 15//18 210//18 209//18 +f 14//19 260//19 259//19 15//19 +f 15//20 259//20 282//20 210//20 +f 10//21 11//21 16//21 12//21 +f 12//22 16//22 178//22 179//22 +f 11//23 209//23 208//23 16//23 +f 16//24 208//24 274//24 178//24 +f 10//25 12//25 17//25 13//25 +f 13//26 17//26 217//26 218//26 +f 12//27 179//27 180//27 17//27 +f 17//26 180//26 278//26 217//26 +f 10//28 13//28 18//28 14//28 +f 14//29 18//29 261//29 260//29 +f 13//26 218//26 219//26 18//26 +f 18//26 219//26 285//26 261//26 +f 19//30 23//30 24//30 20//30 +f 20//31 24//31 219//31 218//31 +f 23//32 251//32 250//32 24//32 +f 24//33 250//33 285//33 219//33 +f 19//34 20//34 25//34 21//34 +f 21//35 25//35 187//35 188//35 +f 20//36 218//36 217//36 25//36 +f 25//37 217//37 278//37 187//37 +f 19//38 21//38 26//38 22//38 +f 22//39 26//39 226//39 227//39 +f 21//40 188//40 189//40 26//40 +f 26//41 189//41 276//41 226//41 +f 19//42 22//42 27//42 23//42 +f 23//43 27//43 252//43 251//43 +f 22//44 227//44 228//44 27//44 +f 27//45 228//45 288//45 252//45 +f 28//46 32//46 33//46 29//46 +f 29//47 33//47 228//47 227//47 +f 32//48 242//48 241//48 33//48 +f 33//49 241//49 288//49 228//49 +f 28//50 29//50 34//50 30//50 +f 30//51 34//51 196//51 197//51 +f 29//52 227//52 226//52 34//52 +f 34//53 226//53 276//53 196//53 +f 28//54 30//54 35//54 31//54 +f 31//55 35//55 168//55 167//55 +f 30//56 197//56 198//56 35//56 +f 35//57 198//57 272//57 168//57 +f 28//58 31//58 36//58 32//58 +f 32//59 36//59 243//59 242//59 +f 31//60 167//60 166//60 36//60 +f 36//61 166//61 281//61 243//61 +f 37//62 41//62 42//62 38//62 +f 38//63 42//63 177//63 176//63 +f 41//64 164//64 163//64 42//64 +f 42//65 163//65 273//65 177//65 +f 37//66 38//66 43//66 39//66 +f 39//67 43//67 186//67 185//67 +f 38//68 176//68 175//68 43//68 +f 43//69 175//69 277//69 186//69 +f 37//70 39//70 44//70 40//70 +f 40//71 44//71 195//71 194//71 +f 39//72 185//72 184//72 44//72 +f 44//73 184//73 275//73 195//73 +f 37//74 40//74 45//74 41//74 +f 41//75 45//75 165//75 164//75 +f 40//76 194//76 193//76 45//76 +f 45//77 193//77 271//77 165//77 +f 46//78 50//78 51//78 47//78 +f 47//78 51//78 180//78 179//78 +f 50//78 188//78 187//78 51//78 +f 51//78 187//78 278//78 180//78 +f 46//78 47//78 52//78 48//78 +f 48//78 52//78 171//78 170//78 +f 47//78 179//78 178//78 52//78 +f 52//78 178//78 274//78 171//78 +f 46//78 48//78 53//78 49//78 +f 49//78 53//78 198//78 197//78 +f 48//78 170//78 169//78 53//78 +f 53//78 169//78 272//78 198//78 +f 46//78 49//78 54//78 50//78 +f 50//78 54//78 189//78 188//78 +f 49//78 197//78 196//78 54//78 +f 54//78 196//78 276//78 189//78 +f 55//79 59//79 60//79 56//79 +f 56//80 60//80 192//80 191//80 +f 59//81 194//81 195//81 60//81 +f 60//82 195//82 275//82 192//82 +f 55//83 56//83 61//83 57//83 +f 57//84 61//84 235//84 236//84 +f 56//85 191//85 190//85 61//85 +f 61//86 190//86 290//86 235//86 +f 55//87 57//87 62//87 58//87 +f 58//88 62//88 201//88 200//88 +f 57//89 236//89 237//89 62//89 +f 62//90 237//90 279//90 201//90 +f 55//91 58//91 63//91 59//91 +f 59//92 63//92 193//92 194//92 +f 58//93 200//93 199//93 63//93 +f 63//94 199//94 271//94 193//94 +f 64//95 68//95 69//95 65//95 +f 65//96 69//96 234//96 233//96 +f 68//97 236//97 235//97 69//97 +f 69//98 235//98 290//98 234//98 +f 64//99 65//99 70//99 66//99 +f 66//100 70//100 238//100 239//100 +f 65//101 233//101 232//101 70//101 +f 70//102 232//102 289//102 238//102 +f 64//103 66//103 71//103 67//103 +f 67//104 71//104 204//104 203//104 +f 66//105 239//105 240//105 71//105 +f 71//106 240//106 280//106 204//106 +f 64//107 67//107 72//107 68//107 +f 68//108 72//108 237//108 236//108 +f 67//109 203//109 202//109 72//109 +f 72//110 202//110 279//110 237//110 +f 73//111 77//111 78//111 74//111 +f 74//112 78//112 231//112 230//112 +f 77//113 239//113 238//113 78//113 +f 78//114 238//114 289//114 231//114 +f 73//115 74//115 79//115 75//115 +f 75//116 79//116 241//116 242//116 +f 74//117 230//117 229//117 79//117 +f 79//118 229//118 288//118 241//118 +f 73//119 75//119 80//119 76//119 +f 76//120 80//120 207//120 206//120 +f 75//121 242//121 243//121 80//121 +f 80//122 243//122 281//122 207//122 +f 73//123 76//123 81//123 77//123 +f 77//124 81//124 240//124 239//124 +f 76//125 206//125 205//125 81//125 +f 81//126 205//126 280//126 240//126 +f 82//127 86//127 87//127 83//127 +f 83//128 87//128 183//128 182//128 +f 86//129 185//129 186//129 87//129 +f 87//130 186//130 277//130 183//130 +f 82//131 83//131 88//131 84//131 +f 84//132 88//132 244//132 245//132 +f 83//133 182//133 181//133 88//133 +f 88//134 181//134 287//134 244//134 +f 82//135 84//135 89//135 85//135 +f 85//136 89//136 190//136 191//136 +f 84//137 245//137 246//137 89//137 +f 89//138 246//138 290//138 190//138 +f 82//139 85//139 90//139 86//139 +f 86//140 90//140 184//140 185//140 +f 85//141 191//141 192//141 90//141 +f 90//142 192//142 275//142 184//142 +f 91//143 95//143 96//143 92//143 +f 92//144 96//144 225//144 224//144 +f 95//145 245//145 244//145 96//145 +f 96//146 244//146 287//146 225//146 +f 91//147 92//147 97//147 93//147 +f 93//148 97//148 247//148 248//148 +f 92//149 224//149 223//149 97//149 +f 97//150 223//150 286//150 247//150 +f 91//151 93//151 98//151 94//151 +f 94//152 98//152 232//152 233//152 +f 93//153 248//153 249//153 98//153 +f 98//154 249//154 289//154 232//154 +f 91//155 94//155 99//155 95//155 +f 95//156 99//156 246//156 245//156 +f 94//157 233//157 234//157 99//157 +f 99//158 234//158 290//158 246//158 +f 100//159 104//159 105//159 101//159 +f 101//160 105//160 222//160 221//160 +f 104//161 248//161 247//161 105//161 +f 105//162 247//162 286//162 222//162 +f 100//163 101//163 106//163 102//163 +f 102//164 106//164 250//164 251//164 +f 101//165 221//165 220//165 106//165 +f 106//166 220//166 285//166 250//166 +f 100//167 102//167 107//167 103//167 +f 103//168 107//168 229//168 230//168 +f 102//169 251//169 252//169 107//169 +f 107//170 252//170 288//170 229//170 +f 100//171 103//171 108//171 104//171 +f 104//172 108//172 249//172 248//172 +f 103//173 230//173 231//173 108//173 +f 108//174 231//174 289//174 249//174 +f 109//175 113//175 114//175 110//175 +f 110//176 114//176 174//176 173//176 +f 113//177 176//177 177//177 114//177 +f 114//178 177//178 273//178 174//178 +f 109//179 110//179 115//179 111//179 +f 111//180 115//180 253//180 254//180 +f 110//181 173//181 172//181 115//181 +f 115//182 172//182 284//182 253//182 +f 109//183 111//183 116//183 112//183 +f 112//184 116//184 181//184 182//184 +f 111//185 254//185 255//185 116//185 +f 116//26 255//26 287//26 181//26 +f 109//186 112//186 117//186 113//186 +f 113//187 117//187 175//187 176//187 +f 112//188 182//188 183//188 117//188 +f 117//189 183//189 277//189 175//189 +f 118//190 122//190 123//190 119//190 +f 119//191 123//191 216//191 215//191 +f 122//192 254//192 253//192 123//192 +f 123//193 253//193 284//193 216//193 +f 118//194 119//194 124//194 120//194 +f 120//195 124//195 256//195 257//195 +f 119//196 215//196 214//196 124//196 +f 124//197 214//197 283//197 256//197 +f 118//198 120//198 125//198 121//198 +f 121//26 125//26 223//26 224//26 +f 120//199 257//199 258//199 125//199 +f 125//26 258//26 286//26 223//26 +f 118//200 121//200 126//200 122//200 +f 122//201 126//201 255//201 254//201 +f 121//26 224//26 225//26 126//26 +f 126//26 225//26 287//26 255//26 +f 127//202 131//202 132//202 128//202 +f 128//203 132//203 213//203 212//203 +f 131//204 257//204 256//204 132//204 +f 132//205 256//205 283//205 213//205 +f 127//206 128//206 133//206 129//206 +f 129//207 133//207 259//207 260//207 +f 128//208 212//208 211//208 133//208 +f 133//209 211//209 282//209 259//209 +f 127//210 129//210 134//210 130//210 +f 130//26 134//26 220//26 221//26 +f 129//211 260//211 261//211 134//211 +f 134//26 261//26 285//26 220//26 +f 127//212 130//212 135//212 131//212 +f 131//213 135//213 258//213 257//213 +f 130//26 221//26 222//26 135//26 +f 135//26 222//26 286//26 258//26 +f 136//214 140//214 141//214 137//214 +f 137//215 141//215 199//215 200//215 +f 140//216 164//216 165//216 141//216 +f 141//217 165//217 271//217 199//217 +f 136//218 137//218 142//218 138//218 +f 138//219 142//219 262//219 263//219 +f 137//220 200//220 201//220 142//220 +f 142//221 201//221 279//221 262//221 +f 136//222 138//222 143//222 139//222 +f 139//223 143//223 172//223 173//223 +f 138//224 263//224 264//224 143//224 +f 143//225 264//225 284//225 172//225 +f 136//226 139//226 144//226 140//226 +f 140//227 144//227 163//227 164//227 +f 139//228 173//228 174//228 144//228 +f 144//229 174//229 273//229 163//229 +f 145//230 149//230 150//230 146//230 +f 146//231 150//231 202//231 203//231 +f 149//232 263//232 262//232 150//232 +f 150//233 262//233 279//233 202//233 +f 145//234 146//234 151//234 147//234 +f 147//235 151//235 265//235 266//235 +f 146//236 203//236 204//236 151//236 +f 151//237 204//237 280//237 265//237 +f 145//238 147//238 152//238 148//238 +f 148//239 152//239 214//239 215//239 +f 147//240 266//240 267//240 152//240 +f 152//241 267//241 283//241 214//241 +f 145//242 148//242 153//242 149//242 +f 149//243 153//243 264//243 263//243 +f 148//244 215//244 216//244 153//244 +f 153//245 216//245 284//245 264//245 +f 154//246 158//246 159//246 155//246 +f 155//247 159//247 205//247 206//247 +f 158//248 266//248 265//248 159//248 +f 159//249 265//249 280//249 205//249 +f 154//250 155//250 160//250 156//250 +f 156//251 160//251 268//251 269//251 +f 155//252 206//252 207//252 160//252 +f 160//253 207//253 281//253 268//253 +f 154//254 156//254 161//254 157//254 +f 157//255 161//255 211//255 212//255 +f 156//256 269//256 270//256 161//256 +f 161//257 270//257 282//257 211//257 +f 154//258 157//258 162//258 158//258 +f 158//259 162//259 267//259 266//259 +f 157//260 212//260 213//260 162//260 +f 162//261 213//261 283//261 267//261 diff --git a/modules/ufbx/data/blender_279_unicode_6100_ascii.fbx b/modules/ufbx/data/blender_279_unicode_6100_ascii.fbx new file mode 100644 index 0000000..825b203 --- /dev/null +++ b/modules/ufbx/data/blender_279_unicode_6100_ascii.fbx @@ -0,0 +1,1551 @@ +; FBX 6.1.0 project file +; Created by Blender FBX Exporter +; for support mail: ideasman42@gmail.com +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 05 + Day: 11 + Hour: 18 + Minute: 03 + Second: 16 + Millisecond: 0 + } + Creator: "FBX SDK/FBX Plugins build 20070228" + OtherFlags: { + FlagPLE: 0 + } +} +CreationTime: "2022-05-11 18:03:16:000" +Creator: "Blender version 2.79 (sub 0)" + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 11 + ObjectType: "Model" { + Count: 9 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::aβカ😂", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: 1.000000,1.000000,-1.000000,1.000000,-1.000000,-1.000000,-1.000000,-1.000000,-1.000000,-1.000000,1.000000,-1.000000, + 1.000000,0.999999,1.000000,0.999999,-1.000001,1.000000,-1.000000,-1.000000,1.000000,-1.000000,1.000000,1.000000 + PolygonVertexIndex: 0,1,2,-4,4,7,6,-6,0,4,5,-2,1,5,6,-3,2,6,7,-4,4,0,3,-8 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000, + -0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000, + -1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::Material", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 1 + PoseNode: { + Node: "Model::aβカ😂" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::aβカ😂", "Mesh" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::Material", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::aβカ😂", "Model::Scene" + Connect: "OO", "Material::Material", "Model::aβカ😂" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::aβカ😂" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/blender_279_unicode_7400_binary.fbx b/modules/ufbx/data/blender_279_unicode_7400_binary.fbx new file mode 100644 index 0000000..82d006b Binary files /dev/null and b/modules/ufbx/data/blender_279_unicode_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_uv_set_tangents_7400_binary.fbx b/modules/ufbx/data/blender_279_uv_set_tangents_7400_binary.fbx new file mode 100644 index 0000000..c51397e Binary files /dev/null and b/modules/ufbx/data/blender_279_uv_set_tangents_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_279_uv_sets_6100_ascii.fbx b/modules/ufbx/data/blender_279_uv_sets_6100_ascii.fbx new file mode 100644 index 0000000..0e3b020 --- /dev/null +++ b/modules/ufbx/data/blender_279_uv_sets_6100_ascii.fbx @@ -0,0 +1,1618 @@ +; FBX 6.1.0 project file +; Created by Blender FBX Exporter +; for support mail: ideasman42@gmail.com +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 03 + Day: 31 + Hour: 20 + Minute: 51 + Second: 20 + Millisecond: 0 + } + Creator: "FBX SDK/FBX Plugins build 20070228" + OtherFlags: { + FlagPLE: 0 + } +} +CreationTime: "2020-03-31 20:51:20:000" +Creator: "Blender version 2.79 (sub 0)" + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 11 + ObjectType: "Model" { + Count: 9 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Cube", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: -0.500000,0.500000,0.500000,-0.500000,-0.500000,0.500000,0.500000,-0.500000,0.500000,0.500000,0.500000,0.500000, + -0.500000,0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.500000,-0.500000,-0.500000,0.500000,0.500000,-0.500000 + PolygonVertexIndex: 3,7,4,-1,5,1,0,-5,6,2,1,-6,7,3,2,-7,3,0,1,-3,7,6,5,-5 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000, + -1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000, + -0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000, + 1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000 + } + LayerElementUV: 0 { + Version: 101 + Name: "Default" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.585382,0.502978,0.587205,0.299704,0.382108,0.501156,0.792302,0.098252,0.383930,0.297881,0.589028,0.096429, + 0.790480,0.301526,0.378462,0.907705,0.380285,0.704430,0.583559,0.706253,0.180656,0.296058,0.182478,0.092783, + 0.385753,0.094606,0.581737,0.909527 + UVIndex: 2,4,1,0,5,3,6,1,7,8,9,13,4,10,11,12,2,0,9,8,4,12,5,1 + } + LayerElementUV: 1 { + Version: 101 + Name: "PerFace" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.000000,1.000000,0.000000,1.000000,1.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000, + -0.000000,0.000000,1.000000,1.000000,-0.000000,1.000000,1.000000,0.000000,0.000000,0.000000,1.000000,1.000000, + -0.000000,0.000000,-0.000000,0.000000,1.000000,1.000000,0.000000,1.000000,1.000000,0.000000,1.000000,1.000000, + 1.000000,-0.000000 + UVIndex: 17,16,3,0,4,1,14,9,16,2,5,6,16,7,8,10,11,0,12,18,14,16,13,15 + } + LayerElementUV: 2 { + Version: 101 + Name: "Row" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 3.999401,0.999401,3.000600,0.999401,3.000599,0.000600,3.999401,0.000599,4.000600,0.999401,4.999401,0.999400, + 4.000599,0.000599,4.999401,0.000599,5.999401,0.999401,5.000600,0.000600,5.999401,0.000599,5.000600,0.999401, + 0.999401,0.000599,0.999401,0.999401,0.000600,0.999401,0.000600,0.000599,1.000599,0.999401,1.999400,0.000599, + 1.999401,0.999401,1.000599,0.000599,2.999401,0.000599,2.999401,0.999401,2.000599,0.999401,2.000600,0.000600 + UVIndex: 10,8,11,9,16,19,17,18,12,13,14,15,20,21,22,23,0,1,2,3,5,4,6,7 + } + LayerElementTexture: 0 { + Version: 101 + Name: "" + MappingInformationType: "NoMappingInformation" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Translucent" + TextureAlpha: 1 + TextureId: + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + } + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::Material", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 1 + PoseNode: { + Node: "Model::Cube" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Cube", "Mesh" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::Material", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Cube", "Model::Scene" + Connect: "OO", "Material::Material", "Model::Cube" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Cube" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/blender_279_uv_sets_7400_binary.fbx b/modules/ufbx/data/blender_279_uv_sets_7400_binary.fbx new file mode 100644 index 0000000..d79eece Binary files /dev/null and b/modules/ufbx/data/blender_279_uv_sets_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_282_suzanne.obj b/modules/ufbx/data/blender_282_suzanne.obj new file mode 100644 index 0000000..ac51356 --- /dev/null +++ b/modules/ufbx/data/blender_282_suzanne.obj @@ -0,0 +1,2066 @@ +# Blender v2.82 (sub 7) OBJ File: '' +# www.blender.org +g Suzanne +v 0.437500 0.164062 0.765625 +v -0.437500 0.164062 0.765625 +v 0.500000 0.093750 0.687500 +v -0.500000 0.093750 0.687500 +v 0.546875 0.054688 0.578125 +v -0.546875 0.054688 0.578125 +v 0.351562 -0.023438 0.617188 +v -0.351562 -0.023438 0.617188 +v 0.351562 0.031250 0.718750 +v -0.351562 0.031250 0.718750 +v 0.351562 0.132812 0.781250 +v -0.351562 0.132812 0.781250 +v 0.273438 0.164062 0.796875 +v -0.273438 0.164062 0.796875 +v 0.203125 0.093750 0.742188 +v -0.203125 0.093750 0.742188 +v 0.156250 0.054688 0.648438 +v -0.156250 0.054688 0.648438 +v 0.078125 0.242188 0.656250 +v -0.078125 0.242188 0.656250 +v 0.140625 0.242188 0.742188 +v -0.140625 0.242188 0.742188 +v 0.242188 0.242188 0.796875 +v -0.242188 0.242188 0.796875 +v 0.273438 0.328125 0.796875 +v -0.273438 0.328125 0.796875 +v 0.203125 0.390625 0.742188 +v -0.203125 0.390625 0.742188 +v 0.156250 0.437500 0.648438 +v -0.156250 0.437500 0.648438 +v 0.351562 0.515625 0.617188 +v -0.351562 0.515625 0.617188 +v 0.351562 0.453125 0.718750 +v -0.351562 0.453125 0.718750 +v 0.351562 0.359375 0.781250 +v -0.351562 0.359375 0.781250 +v 0.437500 0.328125 0.765625 +v -0.437500 0.328125 0.765625 +v 0.500000 0.390625 0.687500 +v -0.500000 0.390625 0.687500 +v 0.546875 0.437500 0.578125 +v -0.546875 0.437500 0.578125 +v 0.625000 0.242188 0.562500 +v -0.625000 0.242188 0.562500 +v 0.562500 0.242188 0.671875 +v -0.562500 0.242188 0.671875 +v 0.468750 0.242188 0.757812 +v -0.468750 0.242188 0.757812 +v 0.476562 0.242188 0.773438 +v -0.476562 0.242188 0.773438 +v 0.445312 0.335938 0.781250 +v -0.445312 0.335938 0.781250 +v 0.351562 0.375000 0.804688 +v -0.351562 0.375000 0.804688 +v 0.265625 0.335938 0.820312 +v -0.265625 0.335938 0.820312 +v 0.226562 0.242188 0.820312 +v -0.226562 0.242188 0.820312 +v 0.265625 0.156250 0.820312 +v -0.265625 0.156250 0.820312 +v 0.351562 0.242188 0.828125 +v -0.351562 0.242188 0.828125 +v 0.351562 0.117188 0.804688 +v -0.351562 0.117188 0.804688 +v 0.445312 0.156250 0.781250 +v -0.445312 0.156250 0.781250 +v 0.000000 0.429688 0.742188 +v 0.000000 0.351562 0.820312 +v 0.000000 -0.679688 0.734375 +v 0.000000 -0.320312 0.781250 +v 0.000000 -0.187500 0.796875 +v 0.000000 -0.773438 0.718750 +v 0.000000 0.406250 0.601562 +v 0.000000 0.570312 0.570312 +v 0.000000 0.898438 -0.546875 +v 0.000000 0.562500 -0.851562 +v 0.000000 0.070312 -0.828125 +v 0.000000 -0.382812 -0.351562 +v 0.203125 -0.187500 0.562500 +v -0.203125 -0.187500 0.562500 +v 0.312500 -0.437500 0.570312 +v -0.312500 -0.437500 0.570312 +v 0.351562 -0.695312 0.570312 +v -0.351562 -0.695312 0.570312 +v 0.367188 -0.890625 0.531250 +v -0.367188 -0.890625 0.531250 +v 0.328125 -0.945312 0.523438 +v -0.328125 -0.945312 0.523438 +v 0.179688 -0.968750 0.554688 +v -0.179688 -0.968750 0.554688 +v 0.000000 -0.984375 0.578125 +v 0.437500 -0.140625 0.531250 +v -0.437500 -0.140625 0.531250 +v 0.632812 -0.039062 0.539062 +v -0.632812 -0.039062 0.539062 +v 0.828125 0.148438 0.445312 +v -0.828125 0.148438 0.445312 +v 0.859375 0.429688 0.593750 +v -0.859375 0.429688 0.593750 +v 0.710938 0.484375 0.625000 +v -0.710938 0.484375 0.625000 +v 0.492188 0.601562 0.687500 +v -0.492188 0.601562 0.687500 +v 0.320312 0.757812 0.734375 +v -0.320312 0.757812 0.734375 +v 0.156250 0.718750 0.757812 +v -0.156250 0.718750 0.757812 +v 0.062500 0.492188 0.750000 +v -0.062500 0.492188 0.750000 +v 0.164062 0.414062 0.773438 +v -0.164062 0.414062 0.773438 +v 0.125000 0.304688 0.765625 +v -0.125000 0.304688 0.765625 +v 0.203125 0.093750 0.742188 +v -0.203125 0.093750 0.742188 +v 0.375000 0.015625 0.703125 +v -0.375000 0.015625 0.703125 +v 0.492188 0.062500 0.671875 +v -0.492188 0.062500 0.671875 +v 0.625000 0.187500 0.648438 +v -0.625000 0.187500 0.648438 +v 0.640625 0.296875 0.648438 +v -0.640625 0.296875 0.648438 +v 0.601562 0.375000 0.664062 +v -0.601562 0.375000 0.664062 +v 0.429688 0.437500 0.718750 +v -0.429688 0.437500 0.718750 +v 0.250000 0.468750 0.757812 +v -0.250000 0.468750 0.757812 +v 0.000000 -0.765625 0.734375 +v 0.109375 -0.718750 0.734375 +v -0.109375 -0.718750 0.734375 +v 0.117188 -0.835938 0.710938 +v -0.117188 -0.835938 0.710938 +v 0.062500 -0.882812 0.695312 +v -0.062500 -0.882812 0.695312 +v 0.000000 -0.890625 0.687500 +v 0.000000 -0.195312 0.750000 +v 0.000000 -0.140625 0.742188 +v 0.101562 -0.148438 0.742188 +v -0.101562 -0.148438 0.742188 +v 0.125000 -0.226562 0.750000 +v -0.125000 -0.226562 0.750000 +v 0.085938 -0.289062 0.742188 +v -0.085938 -0.289062 0.742188 +v 0.398438 -0.046875 0.671875 +v -0.398438 -0.046875 0.671875 +v 0.617188 0.054688 0.625000 +v -0.617188 0.054688 0.625000 +v 0.726562 0.203125 0.601562 +v -0.726562 0.203125 0.601562 +v 0.742188 0.375000 0.656250 +v -0.742188 0.375000 0.656250 +v 0.687500 0.414062 0.726562 +v -0.687500 0.414062 0.726562 +v 0.437500 0.546875 0.796875 +v -0.437500 0.546875 0.796875 +v 0.312500 0.640625 0.835938 +v -0.312500 0.640625 0.835938 +v 0.203125 0.617188 0.851562 +v -0.203125 0.617188 0.851562 +v 0.101562 0.429688 0.843750 +v -0.101562 0.429688 0.843750 +v 0.125000 -0.101562 0.812500 +v -0.125000 -0.101562 0.812500 +v 0.210938 -0.445312 0.710938 +v -0.210938 -0.445312 0.710938 +v 0.250000 -0.703125 0.687500 +v -0.250000 -0.703125 0.687500 +v 0.265625 -0.820312 0.664062 +v -0.265625 -0.820312 0.664062 +v 0.234375 -0.914062 0.632812 +v -0.234375 -0.914062 0.632812 +v 0.164062 -0.929688 0.632812 +v -0.164062 -0.929688 0.632812 +v 0.000000 -0.945312 0.640625 +v 0.000000 0.046875 0.726562 +v 0.000000 0.210938 0.765625 +v 0.328125 0.476562 0.742188 +v -0.328125 0.476562 0.742188 +v 0.164062 0.140625 0.750000 +v -0.164062 0.140625 0.750000 +v 0.132812 0.210938 0.757812 +v -0.132812 0.210938 0.757812 +v 0.117188 -0.687500 0.734375 +v -0.117188 -0.687500 0.734375 +v 0.078125 -0.445312 0.750000 +v -0.078125 -0.445312 0.750000 +v 0.000000 -0.445312 0.750000 +v 0.000000 -0.328125 0.742188 +v 0.093750 -0.273438 0.781250 +v -0.093750 -0.273438 0.781250 +v 0.132812 -0.226562 0.796875 +v -0.132812 -0.226562 0.796875 +v 0.109375 -0.132812 0.781250 +v -0.109375 -0.132812 0.781250 +v 0.039062 -0.125000 0.781250 +v -0.039062 -0.125000 0.781250 +v 0.000000 -0.203125 0.828125 +v 0.046875 -0.148438 0.812500 +v -0.046875 -0.148438 0.812500 +v 0.093750 -0.156250 0.812500 +v -0.093750 -0.156250 0.812500 +v 0.109375 -0.226562 0.828125 +v -0.109375 -0.226562 0.828125 +v 0.078125 -0.250000 0.804688 +v -0.078125 -0.250000 0.804688 +v 0.000000 -0.289062 0.804688 +v 0.257812 -0.312500 0.554688 +v -0.257812 -0.312500 0.554688 +v 0.164062 -0.242188 0.710938 +v -0.164062 -0.242188 0.710938 +v 0.179688 -0.312500 0.710938 +v -0.179688 -0.312500 0.710938 +v 0.234375 -0.250000 0.554688 +v -0.234375 -0.250000 0.554688 +v 0.000000 -0.875000 0.687500 +v 0.046875 -0.867188 0.687500 +v -0.046875 -0.867188 0.687500 +v 0.093750 -0.820312 0.710938 +v -0.093750 -0.820312 0.710938 +v 0.093750 -0.742188 0.726562 +v -0.093750 -0.742188 0.726562 +v 0.000000 -0.781250 0.656250 +v 0.093750 -0.750000 0.664062 +v -0.093750 -0.750000 0.664062 +v 0.093750 -0.812500 0.640625 +v -0.093750 -0.812500 0.640625 +v 0.046875 -0.851562 0.632812 +v -0.046875 -0.851562 0.632812 +v 0.000000 -0.859375 0.632812 +v 0.171875 0.218750 0.781250 +v -0.171875 0.218750 0.781250 +v 0.187500 0.156250 0.773438 +v -0.187500 0.156250 0.773438 +v 0.335938 0.429688 0.757812 +v -0.335938 0.429688 0.757812 +v 0.273438 0.421875 0.773438 +v -0.273438 0.421875 0.773438 +v 0.421875 0.398438 0.773438 +v -0.421875 0.398438 0.773438 +v 0.562500 0.351562 0.695312 +v -0.562500 0.351562 0.695312 +v 0.585938 0.289062 0.687500 +v -0.585938 0.289062 0.687500 +v 0.578125 0.195312 0.679688 +v -0.578125 0.195312 0.679688 +v 0.476562 0.101562 0.718750 +v -0.476562 0.101562 0.718750 +v 0.375000 0.062500 0.742188 +v -0.375000 0.062500 0.742188 +v 0.226562 0.109375 0.781250 +v -0.226562 0.109375 0.781250 +v 0.179688 0.296875 0.781250 +v -0.179688 0.296875 0.781250 +v 0.210938 0.375000 0.781250 +v -0.210938 0.375000 0.781250 +v 0.234375 0.359375 0.757812 +v -0.234375 0.359375 0.757812 +v 0.195312 0.296875 0.757812 +v -0.195312 0.296875 0.757812 +v 0.242188 0.125000 0.757812 +v -0.242188 0.125000 0.757812 +v 0.375000 0.085938 0.726562 +v -0.375000 0.085938 0.726562 +v 0.460938 0.117188 0.703125 +v -0.460938 0.117188 0.703125 +v 0.546875 0.210938 0.671875 +v -0.546875 0.210938 0.671875 +v 0.554688 0.281250 0.671875 +v -0.554688 0.281250 0.671875 +v 0.531250 0.335938 0.679688 +v -0.531250 0.335938 0.679688 +v 0.414062 0.390625 0.750000 +v -0.414062 0.390625 0.750000 +v 0.281250 0.398438 0.765625 +v -0.281250 0.398438 0.765625 +v 0.335938 0.406250 0.750000 +v -0.335938 0.406250 0.750000 +v 0.203125 0.171875 0.750000 +v -0.203125 0.171875 0.750000 +v 0.195312 0.226562 0.750000 +v -0.195312 0.226562 0.750000 +v 0.109375 0.460938 0.609375 +v -0.109375 0.460938 0.609375 +v 0.195312 0.664062 0.617188 +v -0.195312 0.664062 0.617188 +v 0.335938 0.687500 0.593750 +v -0.335938 0.687500 0.593750 +v 0.484375 0.554688 0.554688 +v -0.484375 0.554688 0.554688 +v 0.679688 0.453125 0.492188 +v -0.679688 0.453125 0.492188 +v 0.796875 0.406250 0.460938 +v -0.796875 0.406250 0.460938 +v 0.773438 0.164062 0.375000 +v -0.773438 0.164062 0.375000 +v 0.601562 0.000000 0.414062 +v -0.601562 0.000000 0.414062 +v 0.437500 -0.093750 0.468750 +v -0.437500 -0.093750 0.468750 +v 0.000000 0.898438 0.289062 +v 0.000000 0.984375 -0.078125 +v 0.000000 -0.195312 -0.671875 +v 0.000000 -0.460938 0.187500 +v 0.000000 -0.976562 0.460938 +v 0.000000 -0.804688 0.343750 +v 0.000000 -0.570312 0.320312 +v 0.000000 -0.484375 0.281250 +v 0.851562 0.234375 0.054688 +v -0.851562 0.234375 0.054688 +v 0.859375 0.320312 -0.046875 +v -0.859375 0.320312 -0.046875 +v 0.773438 0.265625 -0.437500 +v -0.773438 0.265625 -0.437500 +v 0.460938 0.437500 -0.703125 +v -0.460938 0.437500 -0.703125 +v 0.734375 -0.046875 0.070312 +v -0.734375 -0.046875 0.070312 +v 0.593750 -0.125000 -0.164062 +v -0.593750 -0.125000 -0.164062 +v 0.640625 -0.007812 -0.429688 +v -0.640625 -0.007812 -0.429688 +v 0.335938 0.054688 -0.664062 +v -0.335938 0.054688 -0.664062 +v 0.234375 -0.351562 0.406250 +v -0.234375 -0.351562 0.406250 +v 0.179688 -0.414062 0.257812 +v -0.179688 -0.414062 0.257812 +v 0.289062 -0.710938 0.382812 +v -0.289062 -0.710938 0.382812 +v 0.250000 -0.500000 0.390625 +v -0.250000 -0.500000 0.390625 +v 0.328125 -0.914062 0.398438 +v -0.328125 -0.914062 0.398438 +v 0.140625 -0.757812 0.367188 +v -0.140625 -0.757812 0.367188 +v 0.125000 -0.539062 0.359375 +v -0.125000 -0.539062 0.359375 +v 0.164062 -0.945312 0.437500 +v -0.164062 -0.945312 0.437500 +v 0.218750 -0.281250 0.429688 +v -0.218750 -0.281250 0.429688 +v 0.210938 -0.226562 0.468750 +v -0.210938 -0.226562 0.468750 +v 0.203125 -0.171875 0.500000 +v -0.203125 -0.171875 0.500000 +v 0.210938 -0.390625 0.164062 +v -0.210938 -0.390625 0.164062 +v 0.296875 -0.312500 -0.265625 +v -0.296875 -0.312500 -0.265625 +v 0.343750 -0.148438 -0.539062 +v -0.343750 -0.148438 -0.539062 +v 0.453125 0.867188 -0.382812 +v -0.453125 0.867188 -0.382812 +v 0.453125 0.929688 -0.070312 +v -0.453125 0.929688 -0.070312 +v 0.453125 0.851562 0.234375 +v -0.453125 0.851562 0.234375 +v 0.460938 0.523438 0.429688 +v -0.460938 0.523438 0.429688 +v 0.726562 0.406250 0.335938 +v -0.726562 0.406250 0.335938 +v 0.632812 0.453125 0.281250 +v -0.632812 0.453125 0.281250 +v 0.640625 0.703125 0.054688 +v -0.640625 0.703125 0.054688 +v 0.796875 0.562500 0.125000 +v -0.796875 0.562500 0.125000 +v 0.796875 0.617188 -0.117188 +v -0.796875 0.617188 -0.117188 +v 0.640625 0.750000 -0.195312 +v -0.640625 0.750000 -0.195312 +v 0.640625 0.679688 -0.445312 +v -0.640625 0.679688 -0.445312 +v 0.796875 0.539062 -0.359375 +v -0.796875 0.539062 -0.359375 +v 0.617188 0.328125 -0.585938 +v -0.617188 0.328125 -0.585938 +v 0.484375 0.023438 -0.546875 +v -0.484375 0.023438 -0.546875 +v 0.820312 0.328125 -0.203125 +v -0.820312 0.328125 -0.203125 +v 0.406250 -0.171875 0.148438 +v -0.406250 -0.171875 0.148438 +v 0.429688 -0.195312 -0.210938 +v -0.429688 -0.195312 -0.210938 +v 0.890625 0.406250 -0.234375 +v -0.890625 0.406250 -0.234375 +v 0.773438 -0.140625 -0.125000 +v -0.773438 -0.140625 -0.125000 +v 1.039062 -0.101562 -0.328125 +v -1.039062 -0.101562 -0.328125 +v 1.281250 0.054688 -0.429688 +v -1.281250 0.054688 -0.429688 +v 1.351562 0.320312 -0.421875 +v -1.351562 0.320312 -0.421875 +v 1.234375 0.507812 -0.421875 +v -1.234375 0.507812 -0.421875 +v 1.023438 0.476562 -0.312500 +v -1.023438 0.476562 -0.312500 +v 1.015625 0.414062 -0.289062 +v -1.015625 0.414062 -0.289062 +v 1.187500 0.437500 -0.390625 +v -1.187500 0.437500 -0.390625 +v 1.265625 0.289062 -0.406250 +v -1.265625 0.289062 -0.406250 +v 1.210938 0.078125 -0.406250 +v -1.210938 0.078125 -0.406250 +v 1.031250 -0.039062 -0.304688 +v -1.031250 -0.039062 -0.304688 +v 0.828125 -0.070312 -0.132812 +v -0.828125 -0.070312 -0.132812 +v 0.921875 0.359375 -0.218750 +v -0.921875 0.359375 -0.218750 +v 0.945312 0.304688 -0.289062 +v -0.945312 0.304688 -0.289062 +v 0.882812 -0.023438 -0.210938 +v -0.882812 -0.023438 -0.210938 +v 1.039062 0.000000 -0.367188 +v -1.039062 0.000000 -0.367188 +v 1.187500 0.093750 -0.445312 +v -1.187500 0.093750 -0.445312 +v 1.234375 0.250000 -0.445312 +v -1.234375 0.250000 -0.445312 +v 1.171875 0.359375 -0.437500 +v -1.171875 0.359375 -0.437500 +v 1.023438 0.343750 -0.359375 +v -1.023438 0.343750 -0.359375 +v 0.843750 0.289062 -0.210938 +v -0.843750 0.289062 -0.210938 +v 0.835938 0.171875 -0.273438 +v -0.835938 0.171875 -0.273438 +v 0.757812 0.093750 -0.273438 +v -0.757812 0.093750 -0.273438 +v 0.820312 0.085938 -0.273438 +v -0.820312 0.085938 -0.273438 +v 0.843750 0.015625 -0.273438 +v -0.843750 0.015625 -0.273438 +v 0.812500 -0.015625 -0.273438 +v -0.812500 -0.015625 -0.273438 +v 0.726562 0.000000 -0.070312 +v -0.726562 0.000000 -0.070312 +v 0.718750 -0.023438 -0.171875 +v -0.718750 -0.023438 -0.171875 +v 0.718750 0.039062 -0.187500 +v -0.718750 0.039062 -0.187500 +v 0.796875 0.203125 -0.210938 +v -0.796875 0.203125 -0.210938 +v 0.890625 0.242188 -0.265625 +v -0.890625 0.242188 -0.265625 +v 0.890625 0.234375 -0.320312 +v -0.890625 0.234375 -0.320312 +v 0.812500 -0.015625 -0.320312 +v -0.812500 -0.015625 -0.320312 +v 0.851562 0.015625 -0.320312 +v -0.851562 0.015625 -0.320312 +v 0.828125 0.078125 -0.320312 +v -0.828125 0.078125 -0.320312 +v 0.765625 0.093750 -0.320312 +v -0.765625 0.093750 -0.320312 +v 0.843750 0.171875 -0.320312 +v -0.843750 0.171875 -0.320312 +v 1.039062 0.328125 -0.414062 +v -1.039062 0.328125 -0.414062 +v 1.187500 0.343750 -0.484375 +v -1.187500 0.343750 -0.484375 +v 1.257812 0.242188 -0.492188 +v -1.257812 0.242188 -0.492188 +v 1.210938 0.085938 -0.484375 +v -1.210938 0.085938 -0.484375 +v 1.046875 0.000000 -0.421875 +v -1.046875 0.000000 -0.421875 +v 0.882812 -0.015625 -0.265625 +v -0.882812 -0.015625 -0.265625 +v 0.953125 0.289062 -0.343750 +v -0.953125 0.289062 -0.343750 +v 0.890625 0.109375 -0.328125 +v -0.890625 0.109375 -0.328125 +v 0.937500 0.062500 -0.335938 +v -0.937500 0.062500 -0.335938 +v 1.000000 0.125000 -0.367188 +v -1.000000 0.125000 -0.367188 +v 0.960938 0.171875 -0.351562 +v -0.960938 0.171875 -0.351562 +v 1.015625 0.234375 -0.375000 +v -1.015625 0.234375 -0.375000 +v 1.054688 0.187500 -0.382812 +v -1.054688 0.187500 -0.382812 +v 1.109375 0.210938 -0.390625 +v -1.109375 0.210938 -0.390625 +v 1.085938 0.273438 -0.390625 +v -1.085938 0.273438 -0.390625 +v 1.023438 0.437500 -0.484375 +v -1.023438 0.437500 -0.484375 +v 1.250000 0.468750 -0.546875 +v -1.250000 0.468750 -0.546875 +v 1.367188 0.296875 -0.500000 +v -1.367188 0.296875 -0.500000 +v 1.312500 0.054688 -0.531250 +v -1.312500 0.054688 -0.531250 +v 1.039062 -0.085938 -0.492188 +v -1.039062 -0.085938 -0.492188 +v 0.789062 -0.125000 -0.328125 +v -0.789062 -0.125000 -0.328125 +v 0.859375 0.382812 -0.382812 +v -0.859375 0.382812 -0.382812 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn 0.6650 -0.2008 0.7194 +vn -0.6650 -0.2008 0.7194 +vn 0.8294 -0.3036 0.4689 +vn -0.8294 -0.3036 0.4689 +vn 0.4155 -0.7933 0.4449 +vn -0.4155 -0.7933 0.4449 +vn 0.3600 -0.5089 0.7820 +vn -0.3600 -0.5089 0.7820 +vn -0.0787 -0.5394 0.8384 +vn 0.0787 -0.5394 0.8384 +vn -0.2696 -0.8413 0.4685 +vn 0.2696 -0.8413 0.4685 +vn -0.7707 -0.3352 0.5420 +vn 0.7707 -0.3352 0.5420 +vn -0.4689 -0.1940 0.8617 +vn 0.4689 -0.1940 0.8617 +vn -0.4767 0.1907 0.8581 +vn 0.4767 0.1907 0.8581 +vn -0.7672 0.3264 0.5521 +vn 0.7672 0.3264 0.5521 +vn -0.2519 0.8173 0.5182 +vn 0.2519 0.8173 0.5182 +vn -0.0949 0.5696 0.8164 +vn 0.0949 0.5696 0.8164 +vn 0.3667 0.5370 0.7597 +vn -0.3667 0.5370 0.7597 +vn 0.4141 0.7672 0.4898 +vn -0.4141 0.7672 0.4898 +vn 0.8277 0.2952 0.4771 +vn -0.8277 0.2952 0.4771 +vn 0.6713 0.1971 0.7145 +vn -0.6713 0.1971 0.7145 +vn 0.8111 0.3244 -0.4867 +vn -0.8111 0.3244 -0.4867 +vn 0.2052 0.8206 -0.5334 +vn -0.2052 0.8206 -0.5334 +vn -0.4223 0.7806 -0.4607 +vn 0.4223 0.7806 -0.4607 +vn -0.8241 0.3225 -0.4658 +vn 0.8241 0.3225 -0.4658 +vn -0.8137 -0.3487 -0.4650 +vn 0.8137 -0.3487 -0.4650 +vn -0.4223 -0.7806 -0.4607 +vn 0.4223 -0.7806 -0.4607 +vn 0.2052 -0.8206 -0.5334 +vn -0.2052 -0.8206 -0.5334 +vn 0.7995 -0.3510 -0.4875 +vn -0.7995 -0.3510 -0.4875 +vn 0.4000 -0.0623 0.9144 +vn -0.4000 -0.0623 0.9144 +vn 0.3069 -0.1754 0.9354 +vn -0.3069 -0.1754 0.9354 +vn 0.0945 -0.1835 0.9785 +vn -0.0945 -0.1835 0.9785 +vn -0.0624 -0.0283 0.9977 +vn 0.0624 -0.0283 0.9977 +vn -0.0624 0.0260 0.9977 +vn 0.0624 0.0260 0.9977 +vn 0.0996 0.1729 0.9799 +vn -0.0996 0.1729 0.9799 +vn 0.3036 0.1656 0.9383 +vn -0.3036 0.1656 0.9383 +vn 0.4002 0.0572 0.9147 +vn -0.4002 0.0572 0.9147 +vn 0.1231 -0.8616 0.4924 +vn -0.1231 -0.8616 0.4924 +vn 0.2190 -0.8647 0.4520 +vn -0.2190 -0.8647 0.4520 +vn 0.5902 -0.4550 0.6668 +vn -0.5902 -0.4550 0.6668 +vn 0.7689 -0.0506 0.6374 +vn -0.7689 -0.0506 0.6374 +vn 0.7796 0.0900 0.6197 +vn -0.7796 0.0900 0.6197 +vn 0.3241 -0.8188 0.4739 +vn -0.3241 -0.8188 0.4739 +vn 0.3857 -0.6629 0.6417 +vn -0.3857 -0.6629 0.6417 +vn 0.6895 -0.4193 0.5906 +vn -0.6895 -0.4193 0.5906 +vn 0.6588 -0.3634 0.6588 +vn -0.6588 -0.3634 0.6588 +vn 0.5465 0.3707 0.7509 +vn -0.5465 0.3707 0.7509 +vn 0.5064 0.6464 0.5706 +vn -0.5064 0.6464 0.5706 +vn 0.6092 0.5167 0.6015 +vn -0.6092 0.5167 0.6015 +vn -0.0441 0.6610 0.7491 +vn 0.0441 0.6610 0.7491 +vn -0.7246 0.3187 0.6110 +vn 0.7246 0.3187 0.6110 +vn -0.5880 0.5554 0.5880 +vn 0.5880 0.5554 0.5880 +vn 0.5361 -0.3909 0.7482 +vn -0.5361 -0.3909 0.7482 +vn 0.2207 -0.4690 0.8552 +vn -0.2207 -0.4690 0.8552 +vn -0.0794 -0.5321 0.8429 +vn 0.0794 -0.5321 0.8429 +vn -0.0825 -0.6575 0.7490 +vn 0.0825 -0.6575 0.7490 +vn 0.0457 -0.5667 0.8226 +vn -0.0457 -0.5667 0.8226 +vn 0.2784 -0.2130 0.9365 +vn -0.2784 -0.2130 0.9365 +vn 0.3813 -0.1824 0.9063 +vn -0.3813 -0.1824 0.9063 +vn 0.3357 -0.2878 0.8969 +vn -0.3357 -0.2878 0.8969 +vn 0.3762 0.0603 0.9246 +vn -0.3762 0.0603 0.9246 +vn -0.1352 0.2680 0.9539 +vn 0.1352 0.2680 0.9539 +vn 0.3961 -0.4321 0.8102 +vn -0.3961 -0.4321 0.8102 +vn 0.1856 -0.2474 0.9510 +vn -0.1856 -0.2474 0.9510 +vn 0.0099 -0.1948 0.9808 +vn -0.0099 -0.1948 0.9808 +vn 0.0721 -0.6966 0.7138 +vn -0.0721 -0.6966 0.7138 +vn 0.1863 -0.5723 0.7986 +vn -0.1863 -0.5723 0.7986 +vn 0.3157 -0.2708 0.9094 +vn -0.3157 -0.2708 0.9094 +vn 0.3063 -0.0265 0.9516 +vn -0.3063 -0.0265 0.9516 +vn 0.3266 -0.1306 0.9361 +vn -0.3266 -0.1306 0.9361 +vn -0.0137 0.0574 0.9983 +vn 0.0137 0.0574 0.9983 +vn -0.0026 -0.0656 0.9978 +vn 0.0026 -0.0656 0.9978 +vn 0.0000 0.0000 1.0000 +vn 0.8174 -0.5744 -0.0442 +vn -0.8174 -0.5744 -0.0442 +vn 0.9494 0.2297 -0.2144 +vn -0.9494 0.2297 -0.2144 +vn 0.0825 0.9073 -0.4124 +vn -0.0825 0.9073 -0.4124 +vn -0.8836 0.3555 0.3047 +vn 0.8836 0.3555 0.3047 +vn 0.4207 -0.8797 0.2218 +vn -0.4207 -0.8797 0.2218 +vn 0.2873 -0.5747 0.7663 +vn -0.2873 -0.5747 0.7663 +vn -0.6542 0.6019 0.4580 +vn 0.6542 0.6019 0.4580 +vn 0.1052 0.7892 0.6051 +vn -0.1052 0.7892 0.6051 +vn 0.7582 0.2916 0.5832 +vn -0.7582 0.2916 0.5832 +vn 0.3889 -0.7130 0.5834 +vn -0.3889 -0.7130 0.5834 +vn 0.0463 0.2314 0.9718 +vn -0.0463 0.2314 0.9718 +vn 0.0335 -0.4018 0.9151 +vn -0.0335 -0.4018 0.9151 +vn -0.4452 -0.1610 0.8809 +vn 0.4452 -0.1610 0.8809 +vn -0.2182 -0.4364 0.8729 +vn 0.2182 -0.4364 0.8729 +vn 0.4341 -0.1290 0.8916 +vn -0.4341 -0.1290 0.8916 +vn 0.3008 0.0501 0.9524 +vn -0.3008 0.0501 0.9524 +vn 0.8123 0.3010 0.4996 +vn -0.8123 0.3010 0.4996 +vn 0.8753 0.2574 0.4093 +vn -0.8753 0.2574 0.4093 +vn 0.9385 0.1601 0.3060 +vn -0.9385 0.1601 0.3060 +vn 0.2237 -0.6539 0.7227 +vn -0.2237 -0.6539 0.7227 +vn -0.1536 -0.1997 0.9677 +vn 0.1536 -0.1997 0.9677 +vn -0.2733 -0.1025 0.9565 +vn 0.2733 -0.1025 0.9565 +vn -0.0976 0.1952 0.9759 +vn 0.0976 0.1952 0.9759 +vn -0.1582 0.9494 0.2713 +vn 0.1582 0.9494 0.2713 +vn -0.6934 0.7082 0.1328 +vn 0.6934 0.7082 0.1328 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.3051 -0.9450 0.1181 +vn -0.3051 -0.9450 0.1181 +vn 0.0298 -0.2981 0.9541 +vn -0.0298 -0.2981 0.9541 +vn 0.1353 -0.3479 0.9277 +vn -0.1353 -0.3479 0.9277 +vn -0.5085 -0.2755 0.8158 +vn 0.5085 -0.2755 0.8158 +vn -0.3843 -0.0419 0.9223 +vn 0.3843 -0.0419 0.9223 +vn -0.2083 0.0374 0.9774 +vn 0.2083 0.0374 0.9774 +vn -0.5721 -0.4767 0.6674 +vn 0.5721 -0.4767 0.6674 +vn -0.1369 -0.7531 0.6435 +vn 0.1369 -0.7531 0.6435 +vn 0.4088 -0.6071 0.6814 +vn -0.4088 -0.6071 0.6814 +vn 0.5740 -0.4130 0.7070 +vn -0.5740 -0.4130 0.7070 +vn 0.5665 -0.0968 0.8183 +vn -0.5665 -0.0968 0.8183 +vn 0.5703 0.1180 0.8129 +vn -0.5703 0.1180 0.8129 +vn 0.4823 0.5621 0.6719 +vn -0.4823 0.5621 0.6719 +vn 0.2604 0.6114 0.7473 +vn -0.2604 0.6114 0.7473 +vn 0.1640 0.3607 0.9182 +vn -0.1640 0.3607 0.9182 +vn -0.0178 0.2495 0.9682 +vn 0.0178 0.2495 0.9682 +vn 0.3273 -0.4166 0.8481 +vn -0.3273 -0.4166 0.8481 +vn 0.2811 -0.2610 0.9235 +vn -0.2811 -0.2610 0.9235 +vn -0.2542 -0.6514 0.7149 +vn 0.2542 -0.6514 0.7149 +vn -0.0260 -0.8455 0.5333 +vn 0.0260 -0.8455 0.5333 +vn -0.3518 -0.2606 0.8991 +vn 0.3518 -0.2606 0.8991 +vn -0.3523 -0.0110 0.9358 +vn 0.3523 -0.0110 0.9358 +vn -0.1317 0.4608 0.8777 +vn 0.1317 0.4608 0.8777 +vn -0.0342 0.6159 0.7870 +vn 0.0342 0.6159 0.7870 +vn 0.3603 0.5836 0.7277 +vn -0.3603 0.5836 0.7277 +vn 0.4988 0.5300 0.6858 +vn -0.4988 0.5300 0.6858 +vn 0.6667 -0.3333 0.6667 +vn -0.6667 -0.3333 0.6667 +vn 0.8165 -0.0731 0.5727 +vn -0.8165 -0.0731 0.5727 +vn 0.7840 0.1161 0.6098 +vn -0.7840 0.1161 0.6098 +vn -0.5306 0.8111 -0.2461 +vn 0.5306 0.8111 -0.2461 +vn -0.8511 0.3695 -0.3730 +vn 0.8511 0.3695 -0.3730 +vn -0.2446 0.8675 -0.4331 +vn 0.2446 0.8675 -0.4331 +vn 0.5924 0.7465 -0.3030 +vn -0.5924 0.7465 -0.3030 +vn 0.3685 0.8758 -0.3118 +vn -0.3685 0.8758 -0.3118 +vn 0.2821 0.9151 -0.2880 +vn -0.2821 0.9151 -0.2880 +vn 0.8561 0.1340 -0.4991 +vn -0.8561 0.1340 -0.4991 +vn 0.5342 -0.7233 -0.4376 +vn -0.5342 -0.7233 -0.4376 +vn 0.3849 -0.8131 -0.4368 +vn -0.3849 -0.8131 -0.4368 +vn 0.2335 -0.5806 -0.7800 +vn -0.2335 -0.5806 -0.7800 +vn 0.2449 -0.0583 -0.9678 +vn -0.2449 -0.0583 -0.9678 +vn 0.1163 -0.4535 -0.8837 +vn -0.1163 -0.4535 -0.8837 +vn 0.1152 -0.9836 -0.1388 +vn -0.1152 -0.9836 -0.1388 +vn 0.1184 -0.9669 -0.2260 +vn -0.1184 -0.9669 -0.2260 +vn 0.9597 -0.0085 -0.2808 +vn -0.9597 -0.0085 -0.2808 +vn 0.9319 0.1629 -0.3242 +vn -0.9319 0.1629 -0.3242 +vn 0.1626 0.0207 -0.9865 +vn -0.1626 0.0207 -0.9865 +vn -0.0188 -0.2177 -0.9758 +vn 0.0188 -0.2177 -0.9758 +vn 0.7538 -0.2926 -0.5884 +vn -0.7538 -0.2926 -0.5884 +vn 0.9196 0.1379 -0.3678 +vn -0.9196 0.1379 -0.3678 +vn 0.9297 0.3127 -0.1944 +vn -0.9297 0.3127 -0.1944 +vn 0.9120 0.3376 -0.2329 +vn -0.9120 0.3376 -0.2329 +vn 0.9407 0.3338 -0.0607 +vn -0.9407 0.3338 -0.0607 +vn 0.1761 -0.8805 -0.4402 +vn -0.1761 -0.8805 -0.4402 +vn 0.3708 -0.4733 -0.7991 +vn -0.3708 -0.4733 -0.7991 +vn 0.3107 -0.8284 -0.4660 +vn -0.3107 -0.8284 -0.4660 +vn 0.2793 -0.9515 -0.1287 +vn -0.2793 -0.9515 -0.1287 +vn 0.3139 -0.9321 -0.1807 +vn -0.3139 -0.9321 -0.1807 +vn 0.9762 -0.2083 -0.0609 +vn -0.9762 -0.2083 -0.0609 +vn 0.8267 -0.5066 0.2447 +vn -0.8267 -0.5066 0.2447 +vn 0.3449 -0.1158 -0.9315 +vn -0.3449 -0.1158 -0.9315 +vn 0.1203 0.9644 0.2355 +vn -0.1203 0.9644 0.2355 +vn 0.1275 0.9744 -0.1851 +vn -0.1275 0.9744 -0.1851 +vn 0.3492 0.5947 -0.7241 +vn -0.3492 0.5947 -0.7241 +vn 0.4153 0.8981 -0.1449 +vn -0.4153 0.8981 -0.1449 +vn 0.1845 0.7036 0.6863 +vn -0.1845 0.7036 0.6863 +vn 0.6056 0.7794 0.1608 +vn -0.6056 0.7794 0.1608 +vn 0.7033 0.6806 -0.2053 +vn -0.7033 0.6806 -0.2053 +vn 0.6679 0.2007 -0.7166 +vn -0.6679 0.2007 -0.7166 +vn 0.4948 0.4342 -0.7528 +vn -0.4948 0.4342 -0.7528 +vn 0.6423 0.7459 -0.1761 +vn -0.6423 0.7459 -0.1761 +vn 0.7182 0.6788 0.1530 +vn -0.7182 0.6788 0.1530 +vn 0.7388 0.3972 0.5444 +vn -0.7388 0.3972 0.5444 +vn 0.3428 0.9261 -0.1579 +vn -0.3428 0.9261 -0.1579 +vn 0.2270 0.5740 0.7867 +vn -0.2270 0.5740 0.7867 +vn -0.1722 0.1046 -0.9795 +vn 0.1722 0.1046 -0.9795 +vn 0.0425 0.9150 0.4013 +vn -0.0425 0.9150 0.4013 +vn -0.1616 0.1847 0.9694 +vn 0.1616 0.1847 0.9694 +vn 0.9791 0.1973 0.0483 +vn -0.9791 0.1973 0.0483 +vn 0.9470 0.0918 0.3079 +vn -0.9470 0.0918 0.3079 +vn 0.9794 0.1905 -0.0661 +vn -0.9794 0.1905 -0.0661 +vn 0.9938 0.0312 -0.1070 +vn -0.9938 0.0312 -0.1070 +vn 0.7116 -0.7008 0.0501 +vn -0.7116 -0.7008 0.0501 +vn 0.3722 -0.9243 0.0847 +vn -0.3722 -0.9243 0.0847 +vn 0.4465 -0.8644 0.2310 +vn -0.4465 -0.8644 0.2310 +vn 0.6066 -0.7578 0.2405 +vn -0.6066 -0.7578 0.2405 +vn 0.7325 -0.6368 0.2407 +vn -0.7325 -0.6368 0.2407 +vn 0.2637 -0.4499 0.8533 +vn -0.2637 -0.4499 0.8533 +vn 0.5568 -0.3181 -0.7673 +vn -0.5568 -0.3181 -0.7673 +vn 0.5004 -0.2807 -0.8190 +vn -0.5004 -0.2807 -0.8190 +vn 0.3190 -0.8494 -0.4205 +vn -0.3190 -0.8494 -0.4205 +vn 0.7198 -0.6356 -0.2793 +vn -0.7198 -0.6356 -0.2793 +vn 0.4972 -0.4408 -0.7473 +vn -0.4972 -0.4408 -0.7473 +vn 0.3506 0.3807 0.8557 +vn -0.3506 0.3807 0.8557 +vn 0.4566 0.1715 0.8730 +vn -0.4566 0.1715 0.8730 +vn 0.2583 0.1055 0.9603 +vn -0.2583 0.1055 0.9603 +vn 0.2455 -0.0802 0.9661 +vn -0.2455 -0.0802 0.9661 +vn 0.4643 -0.0599 0.8837 +vn -0.4643 -0.0599 0.8837 +vn 0.6225 -0.3045 0.7210 +vn -0.6225 -0.3045 0.7210 +vn 0.4500 0.6590 0.6027 +vn -0.4500 0.6590 0.6027 +vn -0.2667 0.8309 0.4884 +vn 0.2667 0.8309 0.4884 +vn -0.8284 0.2291 0.5111 +vn 0.8284 0.2291 0.5111 +vn -0.5251 -0.3566 0.7727 +vn 0.5251 -0.3566 0.7727 +vn 0.4546 -0.5665 0.6873 +vn -0.4546 -0.5665 0.6873 +vn 0.6996 -0.4497 0.5552 +vn -0.6996 -0.4497 0.5552 +vn 0.7220 -0.6827 -0.1126 +vn -0.7220 -0.6827 -0.1126 +vn -0.1919 0.2860 0.9388 +vn 0.1919 0.2860 0.9388 +vn 0.9048 -0.3734 -0.2047 +vn -0.9048 -0.3734 -0.2047 +vn 0.1034 0.1551 0.9825 +vn -0.1034 0.1551 0.9825 +vn 0.0841 0.9318 0.3530 +vn -0.0841 0.9318 0.3530 +vn 0.6446 -0.0883 0.7594 +vn -0.6446 -0.0883 0.7594 +vn 0.4309 0.4740 0.7678 +vn -0.4309 0.4740 0.7678 +vn 0.8032 -0.4847 0.3462 +vn -0.8032 -0.4847 0.3462 +vn 0.5811 -0.4128 0.7014 +vn -0.5811 -0.4128 0.7014 +vn 0.5910 -0.4305 0.6822 +vn -0.5910 -0.4305 0.6822 +vn 0.9818 -0.1804 -0.0591 +vn -0.9818 -0.1804 -0.0591 +vn 0.9105 -0.3965 -0.1175 +vn -0.9105 -0.3965 -0.1175 +vn 0.9972 -0.0181 -0.0725 +vn -0.9972 -0.0181 -0.0725 +vn 0.7313 -0.6543 0.1925 +vn -0.7313 -0.6543 0.1925 +vn 0.7867 -0.6079 0.1073 +vn -0.7867 -0.6079 0.1073 +vn 0.7022 -0.7022 0.1170 +vn -0.7022 -0.7022 0.1170 +vn 0.1840 0.9816 -0.0511 +vn -0.1840 0.9816 -0.0511 +vn 0.9352 0.3301 0.1284 +vn -0.9352 0.3301 0.1284 +vn 0.6633 -0.7463 0.0553 +vn -0.6633 -0.7463 0.0553 +vn -0.0085 0.9970 0.0767 +vn 0.0085 0.9970 0.0767 +vn 0.6237 -0.7061 0.3354 +vn -0.6237 -0.7061 0.3354 +vn 0.2733 -0.8925 0.3587 +vn -0.2733 -0.8925 0.3587 +vn -0.8328 -0.5080 -0.2200 +vn 0.8328 -0.5080 -0.2200 +vn -0.8339 0.2377 -0.4981 +vn 0.8339 0.2377 -0.4981 +vn -0.5655 0.7847 -0.2539 +vn 0.5655 0.7847 -0.2539 +vn -0.0560 0.9962 0.0672 +vn 0.0560 0.9962 0.0672 +vn 0.1445 0.0222 0.9893 +vn -0.1445 0.0222 0.9893 +vn 0.3275 0.0645 0.9427 +vn -0.3275 0.0645 0.9427 +vn 0.3127 0.0232 0.9496 +vn -0.3127 0.0232 0.9496 +vn 0.1710 0.0274 0.9849 +vn -0.1710 0.0274 0.9849 +vn 0.3487 0.2849 0.8929 +vn -0.3487 0.2849 0.8929 +vn 0.4006 -0.0343 0.9156 +vn -0.4006 -0.0343 0.9156 +vn 0.2572 -0.0603 0.9645 +vn -0.2572 -0.0603 0.9645 +vn 0.0637 -0.0106 0.9979 +vn -0.0637 -0.0106 0.9979 +vn -0.3637 0.7039 0.6101 +vn 0.3637 0.7039 0.6101 +vn 0.6299 0.0355 0.7759 +vn -0.6299 0.0355 0.7759 +vn 0.4472 -0.2002 0.8717 +vn -0.4472 -0.2002 0.8717 +vn 0.5072 -0.2141 0.8348 +vn -0.5072 -0.2141 0.8348 +vn 0.5258 0.2619 0.8093 +vn -0.5258 0.2619 0.8093 +vn 0.2980 0.5802 0.7580 +vn -0.2980 0.5802 0.7580 +vn 0.0930 -0.9924 -0.0805 +vn -0.0930 -0.9924 -0.0805 +vn 0.5006 -0.8657 0.0080 +vn -0.5006 -0.8657 0.0080 +vn 0.9285 -0.2497 0.2748 +vn -0.9285 -0.2497 0.2748 +vn 0.8393 0.5424 -0.0378 +vn -0.8393 0.5424 -0.0378 +vn -0.2355 0.9367 -0.2589 +vn 0.2355 0.9367 -0.2589 +vn -0.4499 0.8838 -0.1285 +vn 0.4499 0.8838 -0.1285 +vn -0.5384 -0.0098 -0.8427 +vn 0.5384 -0.0098 -0.8427 +vn -0.1910 -0.0241 -0.9813 +vn 0.1910 -0.0241 -0.9813 +vn 0.4046 0.0266 -0.9141 +vn -0.4046 0.0266 -0.9141 +vn -0.7819 0.6231 0.0197 +vn 0.7819 0.6231 0.0197 +vn 0.5428 -0.2063 -0.8142 +vn -0.5428 -0.2063 -0.8142 +vn -0.2474 -0.9231 -0.2945 +vn 0.2474 -0.9231 -0.2945 +s off +f 47/1/1 1/2/1 3/3/1 45/4/1 +f 4/5/2 2/6/2 48/7/2 46/8/2 +f 45/4/3 3/3/3 5/9/3 43/10/3 +f 6/11/4 4/5/4 46/8/4 44/12/4 +f 3/3/5 9/13/5 7/14/5 5/9/5 +f 8/15/6 10/16/6 4/5/6 6/11/6 +f 1/2/7 11/17/7 9/13/7 3/3/7 +f 10/16/8 12/18/8 2/6/8 4/5/8 +f 11/17/9 13/19/9 15/20/9 9/13/9 +f 16/21/10 14/22/10 12/18/10 10/16/10 +f 9/13/11 15/20/11 17/23/11 7/14/11 +f 18/24/12 16/21/12 10/16/12 8/15/12 +f 15/20/13 21/25/13 19/26/13 17/23/13 +f 20/27/14 22/28/14 16/21/14 18/24/14 +f 13/19/15 23/29/15 21/25/15 15/20/15 +f 22/28/16 24/30/16 14/22/16 16/21/16 +f 23/29/17 25/31/17 27/32/17 21/25/17 +f 28/33/18 26/34/18 24/30/18 22/28/18 +f 21/25/19 27/32/19 29/35/19 19/26/19 +f 30/36/20 28/33/20 22/28/20 20/27/20 +f 27/32/21 33/37/21 31/38/21 29/35/21 +f 32/39/22 34/40/22 28/33/22 30/36/22 +f 25/31/23 35/41/23 33/37/23 27/32/23 +f 34/40/24 36/42/24 26/34/24 28/33/24 +f 35/41/25 37/43/25 39/44/25 33/37/25 +f 40/45/26 38/46/26 36/42/26 34/40/26 +f 33/37/27 39/44/27 41/47/27 31/38/27 +f 42/48/28 40/45/28 34/40/28 32/39/28 +f 39/44/29 45/4/29 43/10/29 41/47/29 +f 44/12/30 46/8/30 40/45/30 42/48/30 +f 37/43/31 47/1/31 45/4/31 39/44/31 +f 46/8/32 48/7/32 38/46/32 40/45/32 +f 47/1/33 37/43/33 51/49/33 49/50/33 +f 52/51/34 38/46/34 48/7/34 50/52/34 +f 37/43/35 35/41/35 53/53/35 51/49/35 +f 54/54/36 36/42/36 38/46/36 52/51/36 +f 35/41/37 25/31/37 55/55/37 53/53/37 +f 56/56/38 26/34/38 36/42/38 54/54/38 +f 25/31/39 23/29/39 57/57/39 55/55/39 +f 58/58/40 24/30/40 26/34/40 56/56/40 +f 23/29/41 13/19/41 59/59/41 57/57/41 +f 60/60/42 14/22/42 24/30/42 58/58/42 +f 13/19/43 11/17/43 63/61/43 59/59/43 +f 64/62/44 12/18/44 14/22/44 60/60/44 +f 11/17/45 1/2/45 65/63/45 63/61/45 +f 66/64/46 2/6/46 12/18/46 64/62/46 +f 1/2/47 47/1/47 49/50/47 65/63/47 +f 50/52/48 48/7/48 2/6/48 66/64/48 +f 61/65/49 65/63/49 49/50/49 +f 50/52/50 66/64/50 62/66/50 +f 63/61/51 65/63/51 61/65/51 +f 62/66/52 66/64/52 64/62/52 +f 61/65/53 59/59/53 63/61/53 +f 64/62/54 60/60/54 62/66/54 +f 61/65/55 57/57/55 59/59/55 +f 60/60/56 58/58/56 62/66/56 +f 61/65/57 55/55/57 57/57/57 +f 58/58/58 56/56/58 62/66/58 +f 61/65/59 53/53/59 55/55/59 +f 56/56/60 54/54/60 62/66/60 +f 61/65/61 51/49/61 53/53/61 +f 54/54/62 52/51/62 62/66/62 +f 61/65/63 49/50/63 51/49/63 +f 52/51/64 50/52/64 62/66/64 +f 89/67/65 174/68/65 176/69/65 91/70/65 +f 176/69/66 175/71/66 90/72/66 91/70/66 +f 87/73/67 172/74/67 174/68/67 89/67/67 +f 175/71/68 173/75/68 88/76/68 90/72/68 +f 85/77/69 170/78/69 172/74/69 87/73/69 +f 173/75/70 171/79/70 86/80/70 88/76/70 +f 83/81/71 168/82/71 170/78/71 85/77/71 +f 171/79/72 169/83/72 84/84/72 86/80/72 +f 81/85/73 166/86/73 168/82/73 83/81/73 +f 169/83/74 167/87/74 82/88/74 84/84/74 +f 79/89/75 92/90/75 146/91/75 164/92/75 +f 147/93/76 93/94/76 80/95/76 165/96/76 +f 92/90/77 94/97/77 148/98/77 146/91/77 +f 149/99/78 95/100/78 93/94/78 147/93/78 +f 94/97/79 96/101/79 150/102/79 148/98/79 +f 151/103/80 97/104/80 95/100/80 149/99/80 +f 96/101/81 98/105/81 152/106/81 150/102/81 +f 153/107/82 99/108/82 97/104/82 151/103/82 +f 98/105/83 100/109/83 154/110/83 152/106/83 +f 155/111/84 101/112/84 99/108/84 153/107/84 +f 100/109/85 102/113/85 156/114/85 154/110/85 +f 157/115/86 103/116/86 101/112/86 155/111/86 +f 102/113/87 104/117/87 158/118/87 156/114/87 +f 159/119/88 105/120/88 103/116/88 157/115/88 +f 104/117/89 106/121/89 160/122/89 158/118/89 +f 161/123/90 107/124/90 105/120/90 159/119/90 +f 106/121/91 108/125/91 162/126/91 160/122/91 +f 163/127/92 109/128/92 107/124/92 161/123/92 +f 108/125/93 67/129/93 68/130/93 162/126/93 +f 68/130/94 67/129/94 109/128/94 163/127/94 +f 110/131/95 128/132/95 160/122/95 162/126/95 +f 161/123/96 129/133/96 111/134/96 163/127/96 +f 128/132/97 179/135/97 158/118/97 160/122/97 +f 159/119/98 180/136/98 129/133/98 161/123/98 +f 126/137/99 156/114/99 158/118/99 179/135/99 +f 159/119/100 157/115/100 127/138/100 180/136/100 +f 124/139/101 154/110/101 156/114/101 126/137/101 +f 157/115/102 155/111/102 125/140/102 127/138/102 +f 122/141/103 152/106/103 154/110/103 124/139/103 +f 155/111/104 153/107/104 123/142/104 125/140/104 +f 120/143/105 150/102/105 152/106/105 122/141/105 +f 153/107/106 151/103/106 121/144/106 123/142/106 +f 118/145/107 148/98/107 150/102/107 120/143/107 +f 151/103/108 149/99/108 119/146/108 121/144/108 +f 116/147/109 146/91/109 148/98/109 118/145/109 +f 149/99/110 147/93/110 117/148/110 119/146/110 +f 114/149/111 164/92/111 146/91/111 116/147/111 +f 147/93/112 165/96/112 115/150/112 117/148/112 +f 114/149/113 181/151/113 177/152/113 164/92/113 +f 177/152/114 182/153/114 115/150/114 165/96/114 +f 110/131/115 162/126/115 68/130/115 112/154/115 +f 68/130/116 163/127/116 111/134/116 113/155/116 +f 112/154/117 68/130/117 178/156/117 183/157/117 +f 178/156/118 68/130/118 113/155/118 184/158/118 +f 177/152/119 181/151/119 183/157/119 178/156/119 +f 184/158/120 182/153/120 177/152/120 178/156/120 +f 135/159/121 137/160/121 176/69/121 174/68/121 +f 176/69/122 137/160/122 136/161/122 175/71/122 +f 133/162/123 135/159/123 174/68/123 172/74/123 +f 175/71/124 136/161/124 134/163/124 173/75/124 +f 131/164/125 133/162/125 172/74/125 170/78/125 +f 173/75/126 134/163/126 132/165/126 171/79/126 +f 166/86/127 187/166/127 185/167/127 168/82/127 +f 186/168/128 188/169/128 167/87/128 169/83/128 +f 131/164/129 170/78/129 168/82/129 185/167/129 +f 169/83/130 171/79/130 132/165/130 186/168/130 +f 144/170/131 190/171/131 189/172/131 187/166/131 +f 189/172/132 190/171/132 145/173/132 188/169/132 +f 185/167/133 187/166/133 189/172/133 69/174/133 +f 189/172/134 188/169/134 186/168/134 69/174/134 +f 130/175/135 131/164/135 185/167/135 69/174/135 +f 186/168/135 132/165/135 130/175/135 69/174/135 +f 142/176/136 193/177/136 191/178/136 144/170/136 +f 192/179/137 194/180/137 143/181/137 145/173/137 +f 140/182/138 195/183/138 193/177/138 142/176/138 +f 194/180/139 196/184/139 141/185/139 143/181/139 +f 139/186/140 197/187/140 195/183/140 140/182/140 +f 196/184/141 198/188/141 139/186/141 141/185/141 +f 138/189/142 71/190/142 197/187/142 139/186/142 +f 198/188/143 71/190/143 138/189/143 139/186/143 +f 190/171/144 144/170/144 191/178/144 70/191/144 +f 192/179/145 145/173/145 190/171/145 70/191/145 +f 70/191/146 191/178/146 206/192/146 208/193/146 +f 207/194/147 192/179/147 70/191/147 208/193/147 +f 71/190/148 199/195/148 200/196/148 197/187/148 +f 201/197/149 199/195/149 71/190/149 198/188/149 +f 197/187/150 200/196/150 202/198/150 195/183/150 +f 203/199/151 201/197/151 198/188/151 196/184/151 +f 195/183/152 202/198/152 204/200/152 193/177/152 +f 205/201/153 203/199/153 196/184/153 194/180/153 +f 193/177/154 204/200/154 206/192/154 191/178/154 +f 207/194/155 205/201/155 194/180/155 192/179/155 +f 199/195/156 204/200/156 202/198/156 200/196/156 +f 203/199/157 205/201/157 199/195/157 201/197/157 +f 199/195/158 208/193/158 206/192/158 204/200/158 +f 207/194/159 208/193/159 199/195/159 205/201/159 +f 139/186/160 140/182/160 164/92/160 177/152/160 +f 165/96/161 141/185/161 139/186/161 177/152/161 +f 140/182/162 142/176/162 211/202/162 164/92/162 +f 212/203/163 143/181/163 141/185/163 165/96/163 +f 142/176/164 144/170/164 213/204/164 211/202/164 +f 214/205/165 145/173/165 143/181/165 212/203/165 +f 144/170/166 187/166/166 166/86/166 213/204/166 +f 167/87/167 188/169/167 145/173/167 214/205/167 +f 81/85/168 209/206/168 213/204/168 166/86/168 +f 214/205/169 210/207/169 82/88/169 167/87/169 +f 209/206/170 215/208/170 211/202/170 213/204/170 +f 212/203/171 216/209/171 210/207/171 214/205/171 +f 79/89/172 164/92/172 211/202/172 215/208/172 +f 212/203/173 165/96/173 80/95/173 216/209/173 +f 131/164/174 130/175/174 72/210/174 222/211/174 +f 72/210/175 130/175/175 132/165/175 223/212/175 +f 133/162/176 131/164/176 222/211/176 220/213/176 +f 223/212/177 132/165/177 134/163/177 221/214/177 +f 135/159/178 133/162/178 220/213/178 218/215/178 +f 221/214/179 134/163/179 136/161/179 219/216/179 +f 137/160/180 135/159/180 218/215/180 217/217/180 +f 219/216/181 136/161/181 137/160/181 217/217/181 +f 217/217/182 218/215/182 229/218/182 231/219/182 +f 230/220/183 219/216/183 217/217/183 231/219/183 +f 218/215/184 220/213/184 227/221/184 229/218/184 +f 228/222/185 221/214/185 219/216/185 230/220/185 +f 220/213/186 222/211/186 225/223/186 227/221/186 +f 226/224/187 223/212/187 221/214/187 228/222/187 +f 222/211/188 72/210/188 224/225/188 225/223/188 +f 224/225/189 72/210/189 223/212/189 226/224/189 +f 224/225/190 231/219/190 229/218/190 225/223/190 +f 230/220/191 231/219/191 224/225/191 226/224/191 +f 225/223/192 229/218/192 227/221/192 +f 228/222/193 230/220/193 226/224/193 +f 183/157/194 181/151/194 234/226/194 232/227/194 +f 235/228/195 182/153/195 184/158/195 233/229/195 +f 112/154/196 183/157/196 232/227/196 254/230/196 +f 233/229/197 184/158/197 113/155/197 255/231/197 +f 110/131/198 112/154/198 254/230/198 256/232/198 +f 255/231/199 113/155/199 111/134/199 257/233/199 +f 181/151/200 114/149/200 252/234/200 234/226/200 +f 253/235/201 115/150/201 182/153/201 235/228/201 +f 114/149/202 116/147/202 250/236/202 252/234/202 +f 251/237/203 117/148/203 115/150/203 253/235/203 +f 116/147/204 118/145/204 248/238/204 250/236/204 +f 249/239/205 119/146/205 117/148/205 251/237/205 +f 118/145/206 120/143/206 246/240/206 248/238/206 +f 247/241/207 121/144/207 119/146/207 249/239/207 +f 120/143/208 122/141/208 244/242/208 246/240/208 +f 245/243/209 123/142/209 121/144/209 247/241/209 +f 122/141/210 124/139/210 242/244/210 244/242/210 +f 243/245/211 125/140/211 123/142/211 245/243/211 +f 124/139/212 126/137/212 240/246/212 242/244/212 +f 241/247/213 127/138/213 125/140/213 243/245/213 +f 126/137/214 179/135/214 236/248/214 240/246/214 +f 237/249/215 180/136/215 127/138/215 241/247/215 +f 179/135/216 128/132/216 238/250/216 236/248/216 +f 239/251/217 129/133/217 180/136/217 237/249/217 +f 128/132/218 110/131/218 256/232/218 238/250/218 +f 257/233/219 111/134/219 129/133/219 239/251/219 +f 238/250/220 256/232/220 258/252/220 276/253/220 +f 259/254/221 257/233/221 239/251/221 277/255/221 +f 236/248/222 238/250/222 276/253/222 278/256/222 +f 277/255/223 239/251/223 237/249/223 279/257/223 +f 240/246/224 236/248/224 278/256/224 274/258/224 +f 279/257/225 237/249/225 241/247/225 275/259/225 +f 242/244/226 240/246/226 274/258/226 272/260/226 +f 275/259/227 241/247/227 243/245/227 273/261/227 +f 244/242/228 242/244/228 272/260/228 270/262/228 +f 273/261/229 243/245/229 245/243/229 271/263/229 +f 246/240/230 244/242/230 270/262/230 268/264/230 +f 271/263/231 245/243/231 247/241/231 269/265/231 +f 248/238/232 246/240/232 268/264/232 266/266/232 +f 269/265/233 247/241/233 249/239/233 267/267/233 +f 250/236/234 248/238/234 266/266/234 264/268/234 +f 267/267/235 249/239/235 251/237/235 265/269/235 +f 252/234/236 250/236/236 264/268/236 262/270/236 +f 265/269/237 251/237/237 253/235/237 263/271/237 +f 234/226/238 252/234/238 262/270/238 280/272/238 +f 263/271/239 253/235/239 235/228/239 281/273/239 +f 256/232/240 254/230/240 260/274/240 258/252/240 +f 261/275/241 255/231/241 257/233/241 259/254/241 +f 254/230/242 232/227/242 282/276/242 260/274/242 +f 283/277/243 233/229/243 255/231/243 261/275/243 +f 232/227/244 234/226/244 280/272/244 282/276/244 +f 281/273/245 235/228/245 233/229/245 283/277/245 +f 67/129/246 108/125/246 284/278/246 73/279/246 +f 285/280/247 109/128/247 67/129/247 73/279/247 +f 108/125/248 106/121/248 286/281/248 284/278/248 +f 287/282/249 107/124/249 109/128/249 285/280/249 +f 106/121/250 104/117/250 288/283/250 286/281/250 +f 289/284/251 105/120/251 107/124/251 287/282/251 +f 104/117/252 102/113/252 290/285/252 288/283/252 +f 291/286/253 103/116/253 105/120/253 289/284/253 +f 102/113/254 100/109/254 292/287/254 290/285/254 +f 293/288/255 101/112/255 103/116/255 291/286/255 +f 100/109/256 98/105/256 294/289/256 292/287/256 +f 295/290/257 99/108/257 101/112/257 293/288/257 +f 98/105/258 96/101/258 296/291/258 294/289/258 +f 297/292/259 97/104/259 99/108/259 295/290/259 +f 96/101/260 94/97/260 298/293/260 296/291/260 +f 299/294/261 95/100/261 97/104/261 297/292/261 +f 94/97/262 92/90/262 300/295/262 298/293/262 +f 301/296/263 93/94/263 95/100/263 299/294/263 +f 308/297/264 309/298/264 328/299/264 338/300/264 +f 329/301/265 309/302/265 308/303/265 339/304/265 +f 307/305/266 308/297/266 338/300/266 336/306/266 +f 339/304/267 308/303/267 307/307/267 337/308/267 +f 306/309/268 307/305/268 336/306/268 340/310/268 +f 337/308/269 307/307/269 306/309/269 341/311/269 +f 89/67/270 91/70/270 306/309/270 340/310/270 +f 306/309/271 91/70/271 90/72/271 341/311/271 +f 87/73/272 89/67/272 340/310/272 334/312/272 +f 341/311/273 90/72/273 88/76/273 335/313/273 +f 85/77/274 87/73/274 334/312/274 330/314/274 +f 335/313/275 88/76/275 86/80/275 331/315/275 +f 83/81/276 85/77/276 330/314/276 332/316/276 +f 331/315/277 86/80/277 84/84/277 333/317/277 +f 330/314/278 336/306/278 338/300/278 332/316/278 +f 339/304/279 337/308/279 331/315/279 333/317/279 +f 330/314/280 334/312/280 340/310/280 336/306/280 +f 341/311/281 335/313/281 331/315/281 337/308/281 +f 326/318/282 332/316/282 338/300/282 328/299/282 +f 339/304/283 333/317/283 327/319/283 329/301/283 +f 81/85/284 83/81/284 332/316/284 326/318/284 +f 333/317/285 84/84/285 82/88/285 327/319/285 +f 209/206/286 342/320/286 344/321/286 215/208/286 +f 345/322/287 343/323/287 210/207/287 216/209/287 +f 81/85/288 326/318/288 342/320/288 209/206/288 +f 343/323/289 327/319/289 82/88/289 210/207/289 +f 79/89/290 215/208/290 344/321/290 346/324/290 +f 345/322/291 216/209/291 80/95/291 347/325/291 +f 79/89/292 346/324/292 300/295/292 92/90/292 +f 301/296/293 347/325/293 80/95/293 93/94/293 +f 77/326/294 324/327/294 352/328/294 304/329/294 +f 353/330/295 325/331/295 77/332/295 304/333/295 +f 304/329/296 352/328/296 350/334/296 78/335/296 +f 351/336/297 353/330/297 304/333/297 78/337/297 +f 78/335/298 350/334/298 348/338/298 305/339/298 +f 349/340/299 351/336/299 78/337/299 305/341/299 +f 305/339/300 348/338/300 328/299/300 309/298/300 +f 329/301/301 349/340/301 305/341/301 309/302/301 +f 326/318/302 328/299/302 348/338/302 342/320/302 +f 349/340/303 329/301/303 327/319/303 343/323/303 +f 296/291/304 298/293/304 318/342/304 310/343/304 +f 319/344/305 299/294/305 297/292/305 311/345/305 +f 76/346/306 316/347/306 324/327/306 77/326/306 +f 325/331/307 317/348/307 76/349/307 77/332/307 +f 302/350/308 358/351/308 356/352/308 303/353/308 +f 357/354/309 359/355/309 302/356/309 303/357/309 +f 303/353/310 356/352/310 354/358/310 75/359/310 +f 355/360/311 357/354/311 303/357/311 75/361/311 +f 75/359/312 354/358/312 316/347/312 76/346/312 +f 317/348/313 355/360/313 75/361/313 76/349/313 +f 292/362/314 294/289/314 362/363/314 364/364/314 +f 363/365/315 295/290/315 293/366/315 365/367/315 +f 364/364/316 362/363/316 368/368/316 366/369/316 +f 369/370/317 363/365/317 365/367/317 367/371/317 +f 366/369/318 368/368/318 370/372/318 372/373/318 +f 371/374/319 369/370/319 367/371/319 373/375/319 +f 372/373/320 370/372/320 376/376/320 374/377/320 +f 377/378/321 371/374/321 373/375/321 375/379/321 +f 314/380/322 378/381/322 374/377/322 376/376/322 +f 375/379/323 379/382/323 315/383/323 377/378/323 +f 316/347/324 354/358/324 374/377/324 378/381/324 +f 375/379/325 355/360/325 317/348/325 379/382/325 +f 354/358/326 356/352/326 372/373/326 374/377/326 +f 373/375/327 357/354/327 355/360/327 375/379/327 +f 356/352/328 358/351/328 366/369/328 372/373/328 +f 367/371/329 359/355/329 357/354/329 373/375/329 +f 358/351/330 360/384/330 364/364/330 366/369/330 +f 365/367/331 361/385/331 359/355/331 367/371/331 +f 290/386/332 292/362/332 364/364/332 360/384/332 +f 365/367/333 293/366/333 291/387/333 361/385/333 +f 74/388/334 360/384/334 358/351/334 302/350/334 +f 359/355/335 361/385/335 74/389/335 302/356/335 +f 284/390/336 286/391/336 288/392/336 290/386/336 +f 289/393/337 287/394/337 285/395/337 291/387/337 +f 284/390/338 290/386/338 360/384/338 74/388/338 +f 361/385/339 291/387/339 285/395/339 74/389/339 +f 73/396/340 284/390/340 74/388/340 +f 74/389/341 285/395/341 73/397/341 +f 294/289/342 296/291/342 310/343/342 362/363/342 +f 311/345/343 297/292/343 295/290/343 363/365/343 +f 310/343/344 312/398/344 368/368/344 362/363/344 +f 369/370/345 313/399/345 311/345/345 363/365/345 +f 312/398/346 382/400/346 370/372/346 368/368/346 +f 371/374/347 383/401/347 313/399/347 369/370/347 +f 314/380/348 376/376/348 370/372/348 382/400/348 +f 371/374/349 377/378/349 315/383/349 383/401/349 +f 348/338/350 350/334/350 386/402/350 384/403/350 +f 387/404/351 351/336/351 349/340/351 385/405/351 +f 318/342/352 384/403/352 386/402/352 320/406/352 +f 387/404/353 385/405/353 319/344/353 321/407/353 +f 298/293/354 300/295/354 384/403/354 318/342/354 +f 385/405/355 301/296/355 299/294/355 319/344/355 +f 300/295/356 344/321/356 342/320/356 384/403/356 +f 343/323/357 345/322/357 301/296/357 385/405/357 +f 342/320/358 348/338/358 384/403/358 +f 385/405/359 349/340/359 343/323/359 +f 300/295/360 346/324/360 344/321/360 +f 345/322/361 347/325/361 301/296/361 +f 314/380/362 322/408/362 380/409/362 378/381/362 +f 381/410/363 323/411/363 315/383/363 379/382/363 +f 316/347/364 378/381/364 380/409/364 324/327/364 +f 381/410/365 379/382/365 317/348/365 325/331/365 +f 320/406/366 386/402/366 380/409/366 322/408/366 +f 381/410/367 387/404/367 321/407/367 323/411/367 +f 350/334/368 352/328/368 380/409/368 386/402/368 +f 381/410/369 353/330/369 351/336/369 387/404/369 +f 324/327/370 380/409/370 352/328/370 +f 353/330/371 381/410/371 325/331/371 +f 400/412/372 388/413/372 414/414/372 402/415/372 +f 415/416/373 389/417/373 401/418/373 403/419/373 +f 400/412/374 402/415/374 404/420/374 398/421/374 +f 405/422/375 403/419/375 401/418/375 399/423/375 +f 398/421/376 404/420/376 406/424/376 396/425/376 +f 407/426/377 405/422/377 399/423/377 397/427/377 +f 396/425/378 406/424/378 408/428/378 394/429/378 +f 409/430/379 407/426/379 397/427/379 395/431/379 +f 394/429/380 408/428/380 410/432/380 392/433/380 +f 411/434/381 409/430/381 395/431/381 393/435/381 +f 392/433/382 410/432/382 412/436/382 390/437/382 +f 413/438/383 411/434/383 393/435/383 391/439/383 +f 410/432/384 420/440/384 418/441/384 412/436/384 +f 419/442/385 421/443/385 411/434/385 413/438/385 +f 408/428/386 422/444/386 420/440/386 410/432/386 +f 421/443/387 423/445/387 409/430/387 411/434/387 +f 406/424/388 424/446/388 422/444/388 408/428/388 +f 423/445/389 425/447/389 407/426/389 409/430/389 +f 404/420/390 426/448/390 424/446/390 406/424/390 +f 425/447/391 427/449/391 405/422/391 407/426/391 +f 402/415/392 428/450/392 426/448/392 404/420/392 +f 427/449/393 429/451/393 403/419/393 405/422/393 +f 402/415/394 414/414/394 416/452/394 428/450/394 +f 417/453/395 415/416/395 403/419/395 429/451/395 +f 318/342/396 320/406/396 444/454/396 442/455/396 +f 445/456/397 321/407/397 319/344/397 443/457/397 +f 320/458/398 390/437/398 412/436/398 444/459/398 +f 413/438/399 391/439/399 321/460/399 445/461/399 +f 310/343/400 318/342/400 442/455/400 312/398/400 +f 443/457/401 319/344/401 311/345/401 313/399/401 +f 382/462/402 430/463/402 414/414/402 388/413/402 +f 415/416/403 431/464/403 383/465/403 389/417/403 +f 412/436/404 418/441/404 440/466/404 444/459/404 +f 441/467/405 419/442/405 413/438/405 445/461/405 +f 438/468/406 446/469/406 444/459/406 440/466/406 +f 445/461/407 447/470/407 439/471/407 441/467/407 +f 434/472/408 446/469/408 438/468/408 436/473/408 +f 439/471/409 447/470/409 435/474/409 437/475/409 +f 432/476/410 448/477/410 446/469/410 434/472/410 +f 447/470/411 449/478/411 433/479/411 435/474/411 +f 430/463/412 448/477/412 432/476/412 450/480/412 +f 433/479/413 449/478/413 431/464/413 451/481/413 +f 414/414/414 430/463/414 450/480/414 416/452/414 +f 451/481/415 431/464/415 415/416/415 417/453/415 +f 312/398/416 448/482/416 430/483/416 382/400/416 +f 431/484/417 449/485/417 313/399/417 383/401/417 +f 312/398/418 442/455/418 446/486/418 448/482/418 +f 447/487/419 443/457/419 313/399/419 449/485/419 +f 442/455/420 444/454/420 446/486/420 +f 447/487/421 445/456/421 443/457/421 +f 416/452/422 450/480/422 452/488/422 476/489/422 +f 453/490/423 451/481/423 417/453/423 477/491/423 +f 450/480/424 432/476/424 462/492/424 452/488/424 +f 463/493/425 433/479/425 451/481/425 453/490/425 +f 432/476/426 434/472/426 460/494/426 462/492/426 +f 461/495/427 435/474/427 433/479/427 463/493/427 +f 434/472/428 436/473/428 458/496/428 460/494/428 +f 459/497/429 437/475/429 435/474/429 461/495/429 +f 436/473/430 438/468/430 456/498/430 458/496/430 +f 457/499/431 439/471/431 437/475/431 459/497/431 +f 438/468/432 440/466/432 454/500/432 456/498/432 +f 455/501/433 441/467/433 439/471/433 457/499/433 +f 440/466/434 418/441/434 474/502/434 454/500/434 +f 475/503/435 419/442/435 441/467/435 455/501/435 +f 428/450/436 416/452/436 476/489/436 464/504/436 +f 477/491/437 417/453/437 429/451/437 465/505/437 +f 426/448/438 428/450/438 464/504/438 466/506/438 +f 465/505/439 429/451/439 427/449/439 467/507/439 +f 424/446/440 426/448/440 466/506/440 468/508/440 +f 467/507/441 427/449/441 425/447/441 469/509/441 +f 422/444/442 424/446/442 468/508/442 470/510/442 +f 469/509/443 425/447/443 423/445/443 471/511/443 +f 420/440/444 422/444/444 470/510/444 472/512/444 +f 471/511/445 423/445/445 421/443/445 473/513/445 +f 418/441/446 420/440/446 472/512/446 474/502/446 +f 473/513/447 421/443/447 419/442/447 475/503/447 +f 458/496/448 456/498/448 480/514/448 478/515/448 +f 481/516/449 457/499/449 459/497/449 479/517/449 +f 478/515/450 480/514/450 482/518/450 484/519/450 +f 483/520/451 481/516/451 479/517/451 485/521/451 +f 484/519/452 482/518/452 488/522/452 486/523/452 +f 489/524/453 483/520/453 485/521/453 487/525/453 +f 486/523/454 488/522/454 490/526/454 492/527/454 +f 491/528/455 489/524/455 487/525/455 493/529/455 +f 464/504/456 476/489/456 486/523/456 492/527/456 +f 487/525/457 477/491/457 465/505/457 493/529/457 +f 452/488/458 484/519/458 486/523/458 476/489/458 +f 487/525/459 485/521/459 453/490/459 477/491/459 +f 452/488/460 462/492/460 478/515/460 484/519/460 +f 479/517/461 463/493/461 453/490/461 485/521/461 +f 458/496/462 478/515/462 462/492/462 460/494/462 +f 463/493/463 479/517/463 459/497/463 461/495/463 +f 454/500/464 474/502/464 480/514/464 456/498/464 +f 481/516/465 475/503/465 455/501/465 457/499/465 +f 472/512/466 482/518/466 480/514/466 474/502/466 +f 481/516/467 483/520/467 473/513/467 475/503/467 +f 470/510/468 488/522/468 482/518/468 472/512/468 +f 483/520/469 489/524/469 471/511/469 473/513/469 +f 468/508/470 490/526/470 488/522/470 470/510/470 +f 489/524/471 491/528/471 469/509/471 471/511/471 +f 466/506/472 492/527/472 490/526/472 468/508/472 +f 491/528/473 493/529/473 467/507/473 469/509/473 +f 464/504/474 492/527/474 466/506/474 +f 467/507/475 493/529/475 465/505/475 +f 392/433/476 390/437/476 504/530/476 502/531/476 +f 505/532/477 391/439/477 393/435/477 503/533/477 +f 394/429/478 392/433/478 502/531/478 500/534/478 +f 503/533/479 393/435/479 395/431/479 501/535/479 +f 396/425/480 394/429/480 500/534/480 498/536/480 +f 501/535/481 395/431/481 397/427/481 499/537/481 +f 398/538/482 396/425/482 498/536/482 496/539/482 +f 499/537/483 397/427/483 399/540/483 497/541/483 +f 400/542/484 398/538/484 496/539/484 494/543/484 +f 497/541/485 399/540/485 401/544/485 495/545/485 +f 388/546/486 400/542/486 494/543/486 506/547/486 +f 495/545/487 401/544/487 389/548/487 507/549/487 +f 494/543/488 502/531/488 504/530/488 506/547/488 +f 505/532/489 503/533/489 495/545/489 507/549/489 +f 494/543/490 496/539/490 500/534/490 502/531/490 +f 501/535/491 497/541/491 495/545/491 503/533/491 +f 496/539/492 498/536/492 500/534/492 +f 501/535/493 499/537/493 497/541/493 +f 314/380/494 382/400/494 388/550/494 506/551/494 +f 389/548/495 383/552/495 315/553/495 507/549/495 +f 314/554/496 506/547/496 504/530/496 322/555/496 +f 505/532/497 507/549/497 315/553/497 323/556/497 +f 320/458/498 322/555/498 504/530/498 390/437/498 +f 505/532/499 323/556/499 321/460/499 391/439/499 diff --git a/modules/ufbx/data/blender_282_suzanne_7400_binary.fbx b/modules/ufbx/data/blender_282_suzanne_7400_binary.fbx new file mode 100644 index 0000000..f7fcc0e Binary files /dev/null and b/modules/ufbx/data/blender_282_suzanne_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_282_suzanne_and_transform.obj b/modules/ufbx/data/blender_282_suzanne_and_transform.obj new file mode 100644 index 0000000..92af643 --- /dev/null +++ b/modules/ufbx/data/blender_282_suzanne_and_transform.obj @@ -0,0 +1,4130 @@ +# Blender v2.82 (sub 7) OBJ File: '' +# www.blender.org +g Suzanne +v 0.437500 0.164062 0.765625 +v -0.437500 0.164062 0.765625 +v 0.500000 0.093750 0.687500 +v -0.500000 0.093750 0.687500 +v 0.546875 0.054688 0.578125 +v -0.546875 0.054688 0.578125 +v 0.351562 -0.023438 0.617188 +v -0.351562 -0.023438 0.617188 +v 0.351562 0.031250 0.718750 +v -0.351562 0.031250 0.718750 +v 0.351562 0.132812 0.781250 +v -0.351562 0.132812 0.781250 +v 0.273438 0.164062 0.796875 +v -0.273438 0.164062 0.796875 +v 0.203125 0.093750 0.742188 +v -0.203125 0.093750 0.742188 +v 0.156250 0.054688 0.648438 +v -0.156250 0.054688 0.648438 +v 0.078125 0.242188 0.656250 +v -0.078125 0.242188 0.656250 +v 0.140625 0.242188 0.742188 +v -0.140625 0.242188 0.742188 +v 0.242188 0.242188 0.796875 +v -0.242188 0.242188 0.796875 +v 0.273438 0.328125 0.796875 +v -0.273438 0.328125 0.796875 +v 0.203125 0.390625 0.742188 +v -0.203125 0.390625 0.742188 +v 0.156250 0.437500 0.648438 +v -0.156250 0.437500 0.648438 +v 0.351562 0.515625 0.617188 +v -0.351562 0.515625 0.617188 +v 0.351562 0.453125 0.718750 +v -0.351562 0.453125 0.718750 +v 0.351562 0.359375 0.781250 +v -0.351562 0.359375 0.781250 +v 0.437500 0.328125 0.765625 +v -0.437500 0.328125 0.765625 +v 0.500000 0.390625 0.687500 +v -0.500000 0.390625 0.687500 +v 0.546875 0.437500 0.578125 +v -0.546875 0.437500 0.578125 +v 0.625000 0.242188 0.562500 +v -0.625000 0.242188 0.562500 +v 0.562500 0.242188 0.671875 +v -0.562500 0.242188 0.671875 +v 0.468750 0.242188 0.757812 +v -0.468750 0.242188 0.757812 +v 0.476562 0.242188 0.773438 +v -0.476562 0.242188 0.773438 +v 0.445312 0.335938 0.781250 +v -0.445312 0.335938 0.781250 +v 0.351562 0.375000 0.804688 +v -0.351562 0.375000 0.804688 +v 0.265625 0.335938 0.820312 +v -0.265625 0.335938 0.820312 +v 0.226562 0.242188 0.820312 +v -0.226562 0.242188 0.820312 +v 0.265625 0.156250 0.820312 +v -0.265625 0.156250 0.820312 +v 0.351562 0.242188 0.828125 +v -0.351562 0.242188 0.828125 +v 0.351562 0.117188 0.804688 +v -0.351562 0.117188 0.804688 +v 0.445312 0.156250 0.781250 +v -0.445312 0.156250 0.781250 +v 0.000000 0.429688 0.742188 +v 0.000000 0.351562 0.820312 +v 0.000000 -0.679688 0.734375 +v 0.000000 -0.320312 0.781250 +v 0.000000 -0.187500 0.796875 +v 0.000000 -0.773438 0.718750 +v 0.000000 0.406250 0.601562 +v 0.000000 0.570312 0.570312 +v 0.000000 0.898438 -0.546875 +v 0.000000 0.562500 -0.851562 +v 0.000000 0.070312 -0.828125 +v 0.000000 -0.382812 -0.351562 +v 0.203125 -0.187500 0.562500 +v -0.203125 -0.187500 0.562500 +v 0.312500 -0.437500 0.570312 +v -0.312500 -0.437500 0.570312 +v 0.351562 -0.695312 0.570312 +v -0.351562 -0.695312 0.570312 +v 0.367188 -0.890625 0.531250 +v -0.367188 -0.890625 0.531250 +v 0.328125 -0.945312 0.523438 +v -0.328125 -0.945312 0.523438 +v 0.179688 -0.968750 0.554688 +v -0.179688 -0.968750 0.554688 +v 0.000000 -0.984375 0.578125 +v 0.437500 -0.140625 0.531250 +v -0.437500 -0.140625 0.531250 +v 0.632812 -0.039062 0.539062 +v -0.632812 -0.039062 0.539062 +v 0.828125 0.148438 0.445312 +v -0.828125 0.148438 0.445312 +v 0.859375 0.429688 0.593750 +v -0.859375 0.429688 0.593750 +v 0.710938 0.484375 0.625000 +v -0.710938 0.484375 0.625000 +v 0.492188 0.601562 0.687500 +v -0.492188 0.601562 0.687500 +v 0.320312 0.757812 0.734375 +v -0.320312 0.757812 0.734375 +v 0.156250 0.718750 0.757812 +v -0.156250 0.718750 0.757812 +v 0.062500 0.492188 0.750000 +v -0.062500 0.492188 0.750000 +v 0.164062 0.414062 0.773438 +v -0.164062 0.414062 0.773438 +v 0.125000 0.304688 0.765625 +v -0.125000 0.304688 0.765625 +v 0.203125 0.093750 0.742188 +v -0.203125 0.093750 0.742188 +v 0.375000 0.015625 0.703125 +v -0.375000 0.015625 0.703125 +v 0.492188 0.062500 0.671875 +v -0.492188 0.062500 0.671875 +v 0.625000 0.187500 0.648438 +v -0.625000 0.187500 0.648438 +v 0.640625 0.296875 0.648438 +v -0.640625 0.296875 0.648438 +v 0.601562 0.375000 0.664062 +v -0.601562 0.375000 0.664062 +v 0.429688 0.437500 0.718750 +v -0.429688 0.437500 0.718750 +v 0.250000 0.468750 0.757812 +v -0.250000 0.468750 0.757812 +v 0.000000 -0.765625 0.734375 +v 0.109375 -0.718750 0.734375 +v -0.109375 -0.718750 0.734375 +v 0.117188 -0.835938 0.710938 +v -0.117188 -0.835938 0.710938 +v 0.062500 -0.882812 0.695312 +v -0.062500 -0.882812 0.695312 +v 0.000000 -0.890625 0.687500 +v 0.000000 -0.195312 0.750000 +v 0.000000 -0.140625 0.742188 +v 0.101562 -0.148438 0.742188 +v -0.101562 -0.148438 0.742188 +v 0.125000 -0.226562 0.750000 +v -0.125000 -0.226562 0.750000 +v 0.085938 -0.289062 0.742188 +v -0.085938 -0.289062 0.742188 +v 0.398438 -0.046875 0.671875 +v -0.398438 -0.046875 0.671875 +v 0.617188 0.054688 0.625000 +v -0.617188 0.054688 0.625000 +v 0.726562 0.203125 0.601562 +v -0.726562 0.203125 0.601562 +v 0.742188 0.375000 0.656250 +v -0.742188 0.375000 0.656250 +v 0.687500 0.414062 0.726562 +v -0.687500 0.414062 0.726562 +v 0.437500 0.546875 0.796875 +v -0.437500 0.546875 0.796875 +v 0.312500 0.640625 0.835938 +v -0.312500 0.640625 0.835938 +v 0.203125 0.617188 0.851562 +v -0.203125 0.617188 0.851562 +v 0.101562 0.429688 0.843750 +v -0.101562 0.429688 0.843750 +v 0.125000 -0.101562 0.812500 +v -0.125000 -0.101562 0.812500 +v 0.210938 -0.445312 0.710938 +v -0.210938 -0.445312 0.710938 +v 0.250000 -0.703125 0.687500 +v -0.250000 -0.703125 0.687500 +v 0.265625 -0.820312 0.664062 +v -0.265625 -0.820312 0.664062 +v 0.234375 -0.914062 0.632812 +v -0.234375 -0.914062 0.632812 +v 0.164062 -0.929688 0.632812 +v -0.164062 -0.929688 0.632812 +v 0.000000 -0.945312 0.640625 +v 0.000000 0.046875 0.726562 +v 0.000000 0.210938 0.765625 +v 0.328125 0.476562 0.742188 +v -0.328125 0.476562 0.742188 +v 0.164062 0.140625 0.750000 +v -0.164062 0.140625 0.750000 +v 0.132812 0.210938 0.757812 +v -0.132812 0.210938 0.757812 +v 0.117188 -0.687500 0.734375 +v -0.117188 -0.687500 0.734375 +v 0.078125 -0.445312 0.750000 +v -0.078125 -0.445312 0.750000 +v 0.000000 -0.445312 0.750000 +v 0.000000 -0.328125 0.742188 +v 0.093750 -0.273438 0.781250 +v -0.093750 -0.273438 0.781250 +v 0.132812 -0.226562 0.796875 +v -0.132812 -0.226562 0.796875 +v 0.109375 -0.132812 0.781250 +v -0.109375 -0.132812 0.781250 +v 0.039062 -0.125000 0.781250 +v -0.039062 -0.125000 0.781250 +v 0.000000 -0.203125 0.828125 +v 0.046875 -0.148438 0.812500 +v -0.046875 -0.148438 0.812500 +v 0.093750 -0.156250 0.812500 +v -0.093750 -0.156250 0.812500 +v 0.109375 -0.226562 0.828125 +v -0.109375 -0.226562 0.828125 +v 0.078125 -0.250000 0.804688 +v -0.078125 -0.250000 0.804688 +v 0.000000 -0.289062 0.804688 +v 0.257812 -0.312500 0.554688 +v -0.257812 -0.312500 0.554688 +v 0.164062 -0.242188 0.710938 +v -0.164062 -0.242188 0.710938 +v 0.179688 -0.312500 0.710938 +v -0.179688 -0.312500 0.710938 +v 0.234375 -0.250000 0.554688 +v -0.234375 -0.250000 0.554688 +v 0.000000 -0.875000 0.687500 +v 0.046875 -0.867188 0.687500 +v -0.046875 -0.867188 0.687500 +v 0.093750 -0.820312 0.710938 +v -0.093750 -0.820312 0.710938 +v 0.093750 -0.742188 0.726562 +v -0.093750 -0.742188 0.726562 +v 0.000000 -0.781250 0.656250 +v 0.093750 -0.750000 0.664062 +v -0.093750 -0.750000 0.664062 +v 0.093750 -0.812500 0.640625 +v -0.093750 -0.812500 0.640625 +v 0.046875 -0.851562 0.632812 +v -0.046875 -0.851562 0.632812 +v 0.000000 -0.859375 0.632812 +v 0.171875 0.218750 0.781250 +v -0.171875 0.218750 0.781250 +v 0.187500 0.156250 0.773438 +v -0.187500 0.156250 0.773438 +v 0.335938 0.429688 0.757812 +v -0.335938 0.429688 0.757812 +v 0.273438 0.421875 0.773438 +v -0.273438 0.421875 0.773438 +v 0.421875 0.398438 0.773438 +v -0.421875 0.398438 0.773438 +v 0.562500 0.351562 0.695312 +v -0.562500 0.351562 0.695312 +v 0.585938 0.289062 0.687500 +v -0.585938 0.289062 0.687500 +v 0.578125 0.195312 0.679688 +v -0.578125 0.195312 0.679688 +v 0.476562 0.101562 0.718750 +v -0.476562 0.101562 0.718750 +v 0.375000 0.062500 0.742188 +v -0.375000 0.062500 0.742188 +v 0.226562 0.109375 0.781250 +v -0.226562 0.109375 0.781250 +v 0.179688 0.296875 0.781250 +v -0.179688 0.296875 0.781250 +v 0.210938 0.375000 0.781250 +v -0.210938 0.375000 0.781250 +v 0.234375 0.359375 0.757812 +v -0.234375 0.359375 0.757812 +v 0.195312 0.296875 0.757812 +v -0.195312 0.296875 0.757812 +v 0.242188 0.125000 0.757812 +v -0.242188 0.125000 0.757812 +v 0.375000 0.085938 0.726562 +v -0.375000 0.085938 0.726562 +v 0.460938 0.117188 0.703125 +v -0.460938 0.117188 0.703125 +v 0.546875 0.210938 0.671875 +v -0.546875 0.210938 0.671875 +v 0.554688 0.281250 0.671875 +v -0.554688 0.281250 0.671875 +v 0.531250 0.335938 0.679688 +v -0.531250 0.335938 0.679688 +v 0.414062 0.390625 0.750000 +v -0.414062 0.390625 0.750000 +v 0.281250 0.398438 0.765625 +v -0.281250 0.398438 0.765625 +v 0.335938 0.406250 0.750000 +v -0.335938 0.406250 0.750000 +v 0.203125 0.171875 0.750000 +v -0.203125 0.171875 0.750000 +v 0.195312 0.226562 0.750000 +v -0.195312 0.226562 0.750000 +v 0.109375 0.460938 0.609375 +v -0.109375 0.460938 0.609375 +v 0.195312 0.664062 0.617188 +v -0.195312 0.664062 0.617188 +v 0.335938 0.687500 0.593750 +v -0.335938 0.687500 0.593750 +v 0.484375 0.554688 0.554688 +v -0.484375 0.554688 0.554688 +v 0.679688 0.453125 0.492188 +v -0.679688 0.453125 0.492188 +v 0.796875 0.406250 0.460938 +v -0.796875 0.406250 0.460938 +v 0.773438 0.164062 0.375000 +v -0.773438 0.164062 0.375000 +v 0.601562 0.000000 0.414062 +v -0.601562 0.000000 0.414062 +v 0.437500 -0.093750 0.468750 +v -0.437500 -0.093750 0.468750 +v 0.000000 0.898438 0.289062 +v 0.000000 0.984375 -0.078125 +v 0.000000 -0.195312 -0.671875 +v 0.000000 -0.460938 0.187500 +v 0.000000 -0.976562 0.460938 +v 0.000000 -0.804688 0.343750 +v 0.000000 -0.570312 0.320312 +v 0.000000 -0.484375 0.281250 +v 0.851562 0.234375 0.054688 +v -0.851562 0.234375 0.054688 +v 0.859375 0.320312 -0.046875 +v -0.859375 0.320312 -0.046875 +v 0.773438 0.265625 -0.437500 +v -0.773438 0.265625 -0.437500 +v 0.460938 0.437500 -0.703125 +v -0.460938 0.437500 -0.703125 +v 0.734375 -0.046875 0.070312 +v -0.734375 -0.046875 0.070312 +v 0.593750 -0.125000 -0.164062 +v -0.593750 -0.125000 -0.164062 +v 0.640625 -0.007812 -0.429688 +v -0.640625 -0.007812 -0.429688 +v 0.335938 0.054688 -0.664062 +v -0.335938 0.054688 -0.664062 +v 0.234375 -0.351562 0.406250 +v -0.234375 -0.351562 0.406250 +v 0.179688 -0.414062 0.257812 +v -0.179688 -0.414062 0.257812 +v 0.289062 -0.710938 0.382812 +v -0.289062 -0.710938 0.382812 +v 0.250000 -0.500000 0.390625 +v -0.250000 -0.500000 0.390625 +v 0.328125 -0.914062 0.398438 +v -0.328125 -0.914062 0.398438 +v 0.140625 -0.757812 0.367188 +v -0.140625 -0.757812 0.367188 +v 0.125000 -0.539062 0.359375 +v -0.125000 -0.539062 0.359375 +v 0.164062 -0.945312 0.437500 +v -0.164062 -0.945312 0.437500 +v 0.218750 -0.281250 0.429688 +v -0.218750 -0.281250 0.429688 +v 0.210938 -0.226562 0.468750 +v -0.210938 -0.226562 0.468750 +v 0.203125 -0.171875 0.500000 +v -0.203125 -0.171875 0.500000 +v 0.210938 -0.390625 0.164062 +v -0.210938 -0.390625 0.164062 +v 0.296875 -0.312500 -0.265625 +v -0.296875 -0.312500 -0.265625 +v 0.343750 -0.148438 -0.539062 +v -0.343750 -0.148438 -0.539062 +v 0.453125 0.867188 -0.382812 +v -0.453125 0.867188 -0.382812 +v 0.453125 0.929688 -0.070312 +v -0.453125 0.929688 -0.070312 +v 0.453125 0.851562 0.234375 +v -0.453125 0.851562 0.234375 +v 0.460938 0.523438 0.429688 +v -0.460938 0.523438 0.429688 +v 0.726562 0.406250 0.335938 +v -0.726562 0.406250 0.335938 +v 0.632812 0.453125 0.281250 +v -0.632812 0.453125 0.281250 +v 0.640625 0.703125 0.054688 +v -0.640625 0.703125 0.054688 +v 0.796875 0.562500 0.125000 +v -0.796875 0.562500 0.125000 +v 0.796875 0.617188 -0.117188 +v -0.796875 0.617188 -0.117188 +v 0.640625 0.750000 -0.195312 +v -0.640625 0.750000 -0.195312 +v 0.640625 0.679688 -0.445312 +v -0.640625 0.679688 -0.445312 +v 0.796875 0.539062 -0.359375 +v -0.796875 0.539062 -0.359375 +v 0.617188 0.328125 -0.585938 +v -0.617188 0.328125 -0.585938 +v 0.484375 0.023438 -0.546875 +v -0.484375 0.023438 -0.546875 +v 0.820312 0.328125 -0.203125 +v -0.820312 0.328125 -0.203125 +v 0.406250 -0.171875 0.148438 +v -0.406250 -0.171875 0.148438 +v 0.429688 -0.195312 -0.210938 +v -0.429688 -0.195312 -0.210938 +v 0.890625 0.406250 -0.234375 +v -0.890625 0.406250 -0.234375 +v 0.773438 -0.140625 -0.125000 +v -0.773438 -0.140625 -0.125000 +v 1.039062 -0.101562 -0.328125 +v -1.039062 -0.101562 -0.328125 +v 1.281250 0.054688 -0.429688 +v -1.281250 0.054688 -0.429688 +v 1.351562 0.320312 -0.421875 +v -1.351562 0.320312 -0.421875 +v 1.234375 0.507812 -0.421875 +v -1.234375 0.507812 -0.421875 +v 1.023438 0.476562 -0.312500 +v -1.023438 0.476562 -0.312500 +v 1.015625 0.414062 -0.289062 +v -1.015625 0.414062 -0.289062 +v 1.187500 0.437500 -0.390625 +v -1.187500 0.437500 -0.390625 +v 1.265625 0.289062 -0.406250 +v -1.265625 0.289062 -0.406250 +v 1.210938 0.078125 -0.406250 +v -1.210938 0.078125 -0.406250 +v 1.031250 -0.039062 -0.304688 +v -1.031250 -0.039062 -0.304688 +v 0.828125 -0.070312 -0.132812 +v -0.828125 -0.070312 -0.132812 +v 0.921875 0.359375 -0.218750 +v -0.921875 0.359375 -0.218750 +v 0.945312 0.304688 -0.289062 +v -0.945312 0.304688 -0.289062 +v 0.882812 -0.023438 -0.210938 +v -0.882812 -0.023438 -0.210938 +v 1.039062 0.000000 -0.367188 +v -1.039062 0.000000 -0.367188 +v 1.187500 0.093750 -0.445312 +v -1.187500 0.093750 -0.445312 +v 1.234375 0.250000 -0.445312 +v -1.234375 0.250000 -0.445312 +v 1.171875 0.359375 -0.437500 +v -1.171875 0.359375 -0.437500 +v 1.023438 0.343750 -0.359375 +v -1.023438 0.343750 -0.359375 +v 0.843750 0.289062 -0.210938 +v -0.843750 0.289062 -0.210938 +v 0.835938 0.171875 -0.273438 +v -0.835938 0.171875 -0.273438 +v 0.757812 0.093750 -0.273438 +v -0.757812 0.093750 -0.273438 +v 0.820312 0.085938 -0.273438 +v -0.820312 0.085938 -0.273438 +v 0.843750 0.015625 -0.273438 +v -0.843750 0.015625 -0.273438 +v 0.812500 -0.015625 -0.273438 +v -0.812500 -0.015625 -0.273438 +v 0.726562 0.000000 -0.070312 +v -0.726562 0.000000 -0.070312 +v 0.718750 -0.023438 -0.171875 +v -0.718750 -0.023438 -0.171875 +v 0.718750 0.039062 -0.187500 +v -0.718750 0.039062 -0.187500 +v 0.796875 0.203125 -0.210938 +v -0.796875 0.203125 -0.210938 +v 0.890625 0.242188 -0.265625 +v -0.890625 0.242188 -0.265625 +v 0.890625 0.234375 -0.320312 +v -0.890625 0.234375 -0.320312 +v 0.812500 -0.015625 -0.320312 +v -0.812500 -0.015625 -0.320312 +v 0.851562 0.015625 -0.320312 +v -0.851562 0.015625 -0.320312 +v 0.828125 0.078125 -0.320312 +v -0.828125 0.078125 -0.320312 +v 0.765625 0.093750 -0.320312 +v -0.765625 0.093750 -0.320312 +v 0.843750 0.171875 -0.320312 +v -0.843750 0.171875 -0.320312 +v 1.039062 0.328125 -0.414062 +v -1.039062 0.328125 -0.414062 +v 1.187500 0.343750 -0.484375 +v -1.187500 0.343750 -0.484375 +v 1.257812 0.242188 -0.492188 +v -1.257812 0.242188 -0.492188 +v 1.210938 0.085938 -0.484375 +v -1.210938 0.085938 -0.484375 +v 1.046875 0.000000 -0.421875 +v -1.046875 0.000000 -0.421875 +v 0.882812 -0.015625 -0.265625 +v -0.882812 -0.015625 -0.265625 +v 0.953125 0.289062 -0.343750 +v -0.953125 0.289062 -0.343750 +v 0.890625 0.109375 -0.328125 +v -0.890625 0.109375 -0.328125 +v 0.937500 0.062500 -0.335938 +v -0.937500 0.062500 -0.335938 +v 1.000000 0.125000 -0.367188 +v -1.000000 0.125000 -0.367188 +v 0.960938 0.171875 -0.351562 +v -0.960938 0.171875 -0.351562 +v 1.015625 0.234375 -0.375000 +v -1.015625 0.234375 -0.375000 +v 1.054688 0.187500 -0.382812 +v -1.054688 0.187500 -0.382812 +v 1.109375 0.210938 -0.390625 +v -1.109375 0.210938 -0.390625 +v 1.085938 0.273438 -0.390625 +v -1.085938 0.273438 -0.390625 +v 1.023438 0.437500 -0.484375 +v -1.023438 0.437500 -0.484375 +v 1.250000 0.468750 -0.546875 +v -1.250000 0.468750 -0.546875 +v 1.367188 0.296875 -0.500000 +v -1.367188 0.296875 -0.500000 +v 1.312500 0.054688 -0.531250 +v -1.312500 0.054688 -0.531250 +v 1.039062 -0.085938 -0.492188 +v -1.039062 -0.085938 -0.492188 +v 0.789062 -0.125000 -0.328125 +v -0.789062 -0.125000 -0.328125 +v 0.859375 0.382812 -0.382812 +v -0.859375 0.382812 -0.382812 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn 0.6650 -0.2008 0.7194 +vn -0.6650 -0.2008 0.7194 +vn 0.8294 -0.3036 0.4689 +vn -0.8294 -0.3036 0.4689 +vn 0.4155 -0.7933 0.4449 +vn -0.4155 -0.7933 0.4449 +vn 0.3600 -0.5089 0.7820 +vn -0.3600 -0.5089 0.7820 +vn -0.0787 -0.5394 0.8384 +vn 0.0787 -0.5394 0.8384 +vn -0.2696 -0.8413 0.4685 +vn 0.2696 -0.8413 0.4685 +vn -0.7707 -0.3352 0.5420 +vn 0.7707 -0.3352 0.5420 +vn -0.4689 -0.1940 0.8617 +vn 0.4689 -0.1940 0.8617 +vn -0.4767 0.1907 0.8581 +vn 0.4767 0.1907 0.8581 +vn -0.7672 0.3264 0.5521 +vn 0.7672 0.3264 0.5521 +vn -0.2519 0.8173 0.5182 +vn 0.2519 0.8173 0.5182 +vn -0.0949 0.5696 0.8164 +vn 0.0949 0.5696 0.8164 +vn 0.3667 0.5370 0.7597 +vn -0.3667 0.5370 0.7597 +vn 0.4141 0.7672 0.4898 +vn -0.4141 0.7672 0.4898 +vn 0.8277 0.2952 0.4771 +vn -0.8277 0.2952 0.4771 +vn 0.6713 0.1971 0.7145 +vn -0.6713 0.1971 0.7145 +vn 0.8111 0.3244 -0.4867 +vn -0.8111 0.3244 -0.4867 +vn 0.2052 0.8206 -0.5334 +vn -0.2052 0.8206 -0.5334 +vn -0.4223 0.7806 -0.4607 +vn 0.4223 0.7806 -0.4607 +vn -0.8241 0.3225 -0.4658 +vn 0.8241 0.3225 -0.4658 +vn -0.8137 -0.3487 -0.4650 +vn 0.8137 -0.3487 -0.4650 +vn -0.4223 -0.7806 -0.4607 +vn 0.4223 -0.7806 -0.4607 +vn 0.2052 -0.8206 -0.5334 +vn -0.2052 -0.8206 -0.5334 +vn 0.7995 -0.3510 -0.4875 +vn -0.7995 -0.3510 -0.4875 +vn 0.4000 -0.0623 0.9144 +vn -0.4000 -0.0623 0.9144 +vn 0.3069 -0.1754 0.9354 +vn -0.3069 -0.1754 0.9354 +vn 0.0945 -0.1835 0.9785 +vn -0.0945 -0.1835 0.9785 +vn -0.0624 -0.0283 0.9977 +vn 0.0624 -0.0283 0.9977 +vn -0.0624 0.0260 0.9977 +vn 0.0624 0.0260 0.9977 +vn 0.0996 0.1729 0.9799 +vn -0.0996 0.1729 0.9799 +vn 0.3036 0.1656 0.9383 +vn -0.3036 0.1656 0.9383 +vn 0.4002 0.0572 0.9147 +vn -0.4002 0.0572 0.9147 +vn 0.1231 -0.8616 0.4924 +vn -0.1231 -0.8616 0.4924 +vn 0.2190 -0.8647 0.4520 +vn -0.2190 -0.8647 0.4520 +vn 0.5902 -0.4550 0.6668 +vn -0.5902 -0.4550 0.6668 +vn 0.7689 -0.0506 0.6374 +vn -0.7689 -0.0506 0.6374 +vn 0.7796 0.0900 0.6197 +vn -0.7796 0.0900 0.6197 +vn 0.3241 -0.8188 0.4739 +vn -0.3241 -0.8188 0.4739 +vn 0.3857 -0.6629 0.6417 +vn -0.3857 -0.6629 0.6417 +vn 0.6895 -0.4193 0.5906 +vn -0.6895 -0.4193 0.5906 +vn 0.6588 -0.3634 0.6588 +vn -0.6588 -0.3634 0.6588 +vn 0.5465 0.3707 0.7509 +vn -0.5465 0.3707 0.7509 +vn 0.5064 0.6464 0.5706 +vn -0.5064 0.6464 0.5706 +vn 0.6092 0.5167 0.6015 +vn -0.6092 0.5167 0.6015 +vn -0.0441 0.6610 0.7491 +vn 0.0441 0.6610 0.7491 +vn -0.7246 0.3187 0.6110 +vn 0.7246 0.3187 0.6110 +vn -0.5880 0.5554 0.5880 +vn 0.5880 0.5554 0.5880 +vn 0.5361 -0.3909 0.7482 +vn -0.5361 -0.3909 0.7482 +vn 0.2207 -0.4690 0.8552 +vn -0.2207 -0.4690 0.8552 +vn -0.0794 -0.5321 0.8429 +vn 0.0794 -0.5321 0.8429 +vn -0.0825 -0.6575 0.7490 +vn 0.0825 -0.6575 0.7490 +vn 0.0457 -0.5667 0.8226 +vn -0.0457 -0.5667 0.8226 +vn 0.2784 -0.2130 0.9365 +vn -0.2784 -0.2130 0.9365 +vn 0.3813 -0.1824 0.9063 +vn -0.3813 -0.1824 0.9063 +vn 0.3357 -0.2878 0.8969 +vn -0.3357 -0.2878 0.8969 +vn 0.3762 0.0603 0.9246 +vn -0.3762 0.0603 0.9246 +vn -0.1352 0.2680 0.9539 +vn 0.1352 0.2680 0.9539 +vn 0.3961 -0.4321 0.8102 +vn -0.3961 -0.4321 0.8102 +vn 0.1856 -0.2474 0.9510 +vn -0.1856 -0.2474 0.9510 +vn 0.0099 -0.1948 0.9808 +vn -0.0099 -0.1948 0.9808 +vn 0.0721 -0.6966 0.7138 +vn -0.0721 -0.6966 0.7138 +vn 0.1863 -0.5723 0.7986 +vn -0.1863 -0.5723 0.7986 +vn 0.3157 -0.2708 0.9094 +vn -0.3157 -0.2708 0.9094 +vn 0.3063 -0.0265 0.9516 +vn -0.3063 -0.0265 0.9516 +vn 0.3266 -0.1306 0.9361 +vn -0.3266 -0.1306 0.9361 +vn -0.0137 0.0574 0.9983 +vn 0.0137 0.0574 0.9983 +vn -0.0026 -0.0656 0.9978 +vn 0.0026 -0.0656 0.9978 +vn 0.0000 0.0000 1.0000 +vn 0.8174 -0.5744 -0.0442 +vn -0.8174 -0.5744 -0.0442 +vn 0.9494 0.2297 -0.2144 +vn -0.9494 0.2297 -0.2144 +vn 0.0825 0.9073 -0.4124 +vn -0.0825 0.9073 -0.4124 +vn -0.8836 0.3555 0.3047 +vn 0.8836 0.3555 0.3047 +vn 0.4207 -0.8797 0.2218 +vn -0.4207 -0.8797 0.2218 +vn 0.2873 -0.5747 0.7663 +vn -0.2873 -0.5747 0.7663 +vn -0.6542 0.6019 0.4580 +vn 0.6542 0.6019 0.4580 +vn 0.1052 0.7892 0.6051 +vn -0.1052 0.7892 0.6051 +vn 0.7582 0.2916 0.5832 +vn -0.7582 0.2916 0.5832 +vn 0.3889 -0.7130 0.5834 +vn -0.3889 -0.7130 0.5834 +vn 0.0463 0.2314 0.9718 +vn -0.0463 0.2314 0.9718 +vn 0.0335 -0.4018 0.9151 +vn -0.0335 -0.4018 0.9151 +vn -0.4452 -0.1610 0.8809 +vn 0.4452 -0.1610 0.8809 +vn -0.2182 -0.4364 0.8729 +vn 0.2182 -0.4364 0.8729 +vn 0.4341 -0.1290 0.8916 +vn -0.4341 -0.1290 0.8916 +vn 0.3008 0.0501 0.9524 +vn -0.3008 0.0501 0.9524 +vn 0.8123 0.3010 0.4996 +vn -0.8123 0.3010 0.4996 +vn 0.8753 0.2574 0.4093 +vn -0.8753 0.2574 0.4093 +vn 0.9385 0.1601 0.3060 +vn -0.9385 0.1601 0.3060 +vn 0.2237 -0.6539 0.7227 +vn -0.2237 -0.6539 0.7227 +vn -0.1536 -0.1997 0.9677 +vn 0.1536 -0.1997 0.9677 +vn -0.2733 -0.1025 0.9565 +vn 0.2733 -0.1025 0.9565 +vn -0.0976 0.1952 0.9759 +vn 0.0976 0.1952 0.9759 +vn -0.1582 0.9494 0.2713 +vn 0.1582 0.9494 0.2713 +vn -0.6934 0.7082 0.1328 +vn 0.6934 0.7082 0.1328 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.3051 -0.9450 0.1181 +vn -0.3051 -0.9450 0.1181 +vn 0.0298 -0.2981 0.9541 +vn -0.0298 -0.2981 0.9541 +vn 0.1353 -0.3479 0.9277 +vn -0.1353 -0.3479 0.9277 +vn -0.5085 -0.2755 0.8158 +vn 0.5085 -0.2755 0.8158 +vn -0.3843 -0.0419 0.9223 +vn 0.3843 -0.0419 0.9223 +vn -0.2083 0.0374 0.9774 +vn 0.2083 0.0374 0.9774 +vn -0.5721 -0.4767 0.6674 +vn 0.5721 -0.4767 0.6674 +vn -0.1369 -0.7531 0.6435 +vn 0.1369 -0.7531 0.6435 +vn 0.4088 -0.6071 0.6814 +vn -0.4088 -0.6071 0.6814 +vn 0.5740 -0.4130 0.7070 +vn -0.5740 -0.4130 0.7070 +vn 0.5665 -0.0968 0.8183 +vn -0.5665 -0.0968 0.8183 +vn 0.5703 0.1180 0.8129 +vn -0.5703 0.1180 0.8129 +vn 0.4823 0.5621 0.6719 +vn -0.4823 0.5621 0.6719 +vn 0.2604 0.6114 0.7473 +vn -0.2604 0.6114 0.7473 +vn 0.1640 0.3607 0.9182 +vn -0.1640 0.3607 0.9182 +vn -0.0178 0.2495 0.9682 +vn 0.0178 0.2495 0.9682 +vn 0.3273 -0.4166 0.8481 +vn -0.3273 -0.4166 0.8481 +vn 0.2811 -0.2610 0.9235 +vn -0.2811 -0.2610 0.9235 +vn -0.2542 -0.6514 0.7149 +vn 0.2542 -0.6514 0.7149 +vn -0.0260 -0.8455 0.5333 +vn 0.0260 -0.8455 0.5333 +vn -0.3518 -0.2606 0.8991 +vn 0.3518 -0.2606 0.8991 +vn -0.3523 -0.0110 0.9358 +vn 0.3523 -0.0110 0.9358 +vn -0.1317 0.4608 0.8777 +vn 0.1317 0.4608 0.8777 +vn -0.0342 0.6159 0.7870 +vn 0.0342 0.6159 0.7870 +vn 0.3603 0.5836 0.7277 +vn -0.3603 0.5836 0.7277 +vn 0.4988 0.5300 0.6858 +vn -0.4988 0.5300 0.6858 +vn 0.6667 -0.3333 0.6667 +vn -0.6667 -0.3333 0.6667 +vn 0.8165 -0.0731 0.5727 +vn -0.8165 -0.0731 0.5727 +vn 0.7840 0.1161 0.6098 +vn -0.7840 0.1161 0.6098 +vn -0.5306 0.8111 -0.2461 +vn 0.5306 0.8111 -0.2461 +vn -0.8511 0.3695 -0.3730 +vn 0.8511 0.3695 -0.3730 +vn -0.2446 0.8675 -0.4331 +vn 0.2446 0.8675 -0.4331 +vn 0.5924 0.7465 -0.3030 +vn -0.5924 0.7465 -0.3030 +vn 0.3685 0.8758 -0.3118 +vn -0.3685 0.8758 -0.3118 +vn 0.2821 0.9151 -0.2880 +vn -0.2821 0.9151 -0.2880 +vn 0.8561 0.1340 -0.4991 +vn -0.8561 0.1340 -0.4991 +vn 0.5342 -0.7233 -0.4376 +vn -0.5342 -0.7233 -0.4376 +vn 0.3849 -0.8131 -0.4368 +vn -0.3849 -0.8131 -0.4368 +vn 0.2335 -0.5806 -0.7800 +vn -0.2335 -0.5806 -0.7800 +vn 0.2449 -0.0583 -0.9678 +vn -0.2449 -0.0583 -0.9678 +vn 0.1163 -0.4535 -0.8837 +vn -0.1163 -0.4535 -0.8837 +vn 0.1152 -0.9836 -0.1388 +vn -0.1152 -0.9836 -0.1388 +vn 0.1184 -0.9669 -0.2260 +vn -0.1184 -0.9669 -0.2260 +vn 0.9597 -0.0085 -0.2808 +vn -0.9597 -0.0085 -0.2808 +vn 0.9319 0.1629 -0.3242 +vn -0.9319 0.1629 -0.3242 +vn 0.1626 0.0207 -0.9865 +vn -0.1626 0.0207 -0.9865 +vn -0.0188 -0.2177 -0.9758 +vn 0.0188 -0.2177 -0.9758 +vn 0.7538 -0.2926 -0.5884 +vn -0.7538 -0.2926 -0.5884 +vn 0.9196 0.1379 -0.3678 +vn -0.9196 0.1379 -0.3678 +vn 0.9297 0.3127 -0.1944 +vn -0.9297 0.3127 -0.1944 +vn 0.9120 0.3376 -0.2329 +vn -0.9120 0.3376 -0.2329 +vn 0.9407 0.3338 -0.0607 +vn -0.9407 0.3338 -0.0607 +vn 0.1761 -0.8805 -0.4402 +vn -0.1761 -0.8805 -0.4402 +vn 0.3708 -0.4733 -0.7991 +vn -0.3708 -0.4733 -0.7991 +vn 0.3107 -0.8284 -0.4660 +vn -0.3107 -0.8284 -0.4660 +vn 0.2793 -0.9515 -0.1287 +vn -0.2793 -0.9515 -0.1287 +vn 0.3139 -0.9321 -0.1807 +vn -0.3139 -0.9321 -0.1807 +vn 0.9762 -0.2083 -0.0609 +vn -0.9762 -0.2083 -0.0609 +vn 0.8267 -0.5066 0.2447 +vn -0.8267 -0.5066 0.2447 +vn 0.3449 -0.1158 -0.9315 +vn -0.3449 -0.1158 -0.9315 +vn 0.1203 0.9644 0.2355 +vn -0.1203 0.9644 0.2355 +vn 0.1275 0.9744 -0.1851 +vn -0.1275 0.9744 -0.1851 +vn 0.3492 0.5947 -0.7241 +vn -0.3492 0.5947 -0.7241 +vn 0.4153 0.8981 -0.1449 +vn -0.4153 0.8981 -0.1449 +vn 0.1845 0.7036 0.6863 +vn -0.1845 0.7036 0.6863 +vn 0.6056 0.7794 0.1608 +vn -0.6056 0.7794 0.1608 +vn 0.7033 0.6806 -0.2053 +vn -0.7033 0.6806 -0.2053 +vn 0.6679 0.2007 -0.7166 +vn -0.6679 0.2007 -0.7166 +vn 0.4948 0.4342 -0.7528 +vn -0.4948 0.4342 -0.7528 +vn 0.6423 0.7459 -0.1761 +vn -0.6423 0.7459 -0.1761 +vn 0.7182 0.6788 0.1530 +vn -0.7182 0.6788 0.1530 +vn 0.7388 0.3972 0.5444 +vn -0.7388 0.3972 0.5444 +vn 0.3428 0.9261 -0.1579 +vn -0.3428 0.9261 -0.1579 +vn 0.2270 0.5740 0.7867 +vn -0.2270 0.5740 0.7867 +vn -0.1722 0.1046 -0.9795 +vn 0.1722 0.1046 -0.9795 +vn 0.0425 0.9150 0.4013 +vn -0.0425 0.9150 0.4013 +vn -0.1616 0.1847 0.9694 +vn 0.1616 0.1847 0.9694 +vn 0.9791 0.1973 0.0483 +vn -0.9791 0.1973 0.0483 +vn 0.9470 0.0918 0.3079 +vn -0.9470 0.0918 0.3079 +vn 0.9794 0.1905 -0.0661 +vn -0.9794 0.1905 -0.0661 +vn 0.9938 0.0312 -0.1070 +vn -0.9938 0.0312 -0.1070 +vn 0.7116 -0.7008 0.0501 +vn -0.7116 -0.7008 0.0501 +vn 0.3722 -0.9243 0.0847 +vn -0.3722 -0.9243 0.0847 +vn 0.4465 -0.8644 0.2310 +vn -0.4465 -0.8644 0.2310 +vn 0.6066 -0.7578 0.2405 +vn -0.6066 -0.7578 0.2405 +vn 0.7325 -0.6368 0.2407 +vn -0.7325 -0.6368 0.2407 +vn 0.2637 -0.4499 0.8533 +vn -0.2637 -0.4499 0.8533 +vn 0.5568 -0.3181 -0.7673 +vn -0.5568 -0.3181 -0.7673 +vn 0.5004 -0.2807 -0.8190 +vn -0.5004 -0.2807 -0.8190 +vn 0.3190 -0.8494 -0.4205 +vn -0.3190 -0.8494 -0.4205 +vn 0.7198 -0.6356 -0.2793 +vn -0.7198 -0.6356 -0.2793 +vn 0.4972 -0.4408 -0.7473 +vn -0.4972 -0.4408 -0.7473 +vn 0.3506 0.3807 0.8557 +vn -0.3506 0.3807 0.8557 +vn 0.4566 0.1715 0.8730 +vn -0.4566 0.1715 0.8730 +vn 0.2583 0.1055 0.9603 +vn -0.2583 0.1055 0.9603 +vn 0.2455 -0.0802 0.9661 +vn -0.2455 -0.0802 0.9661 +vn 0.4643 -0.0599 0.8837 +vn -0.4643 -0.0599 0.8837 +vn 0.6225 -0.3045 0.7210 +vn -0.6225 -0.3045 0.7210 +vn 0.4500 0.6590 0.6027 +vn -0.4500 0.6590 0.6027 +vn -0.2667 0.8309 0.4884 +vn 0.2667 0.8309 0.4884 +vn -0.8284 0.2291 0.5111 +vn 0.8284 0.2291 0.5111 +vn -0.5251 -0.3566 0.7727 +vn 0.5251 -0.3566 0.7727 +vn 0.4546 -0.5665 0.6873 +vn -0.4546 -0.5665 0.6873 +vn 0.6996 -0.4497 0.5552 +vn -0.6996 -0.4497 0.5552 +vn 0.7220 -0.6827 -0.1126 +vn -0.7220 -0.6827 -0.1126 +vn -0.1919 0.2860 0.9388 +vn 0.1919 0.2860 0.9388 +vn 0.9048 -0.3734 -0.2047 +vn -0.9048 -0.3734 -0.2047 +vn 0.1034 0.1551 0.9825 +vn -0.1034 0.1551 0.9825 +vn 0.0841 0.9318 0.3530 +vn -0.0841 0.9318 0.3530 +vn 0.6446 -0.0883 0.7594 +vn -0.6446 -0.0883 0.7594 +vn 0.4309 0.4740 0.7678 +vn -0.4309 0.4740 0.7678 +vn 0.8032 -0.4847 0.3462 +vn -0.8032 -0.4847 0.3462 +vn 0.5811 -0.4128 0.7014 +vn -0.5811 -0.4128 0.7014 +vn 0.5910 -0.4305 0.6822 +vn -0.5910 -0.4305 0.6822 +vn 0.9818 -0.1804 -0.0591 +vn -0.9818 -0.1804 -0.0591 +vn 0.9105 -0.3965 -0.1175 +vn -0.9105 -0.3965 -0.1175 +vn 0.9972 -0.0181 -0.0725 +vn -0.9972 -0.0181 -0.0725 +vn 0.7313 -0.6543 0.1925 +vn -0.7313 -0.6543 0.1925 +vn 0.7867 -0.6079 0.1073 +vn -0.7867 -0.6079 0.1073 +vn 0.7022 -0.7022 0.1170 +vn -0.7022 -0.7022 0.1170 +vn 0.1840 0.9816 -0.0511 +vn -0.1840 0.9816 -0.0511 +vn 0.9352 0.3301 0.1284 +vn -0.9352 0.3301 0.1284 +vn 0.6633 -0.7463 0.0553 +vn -0.6633 -0.7463 0.0553 +vn -0.0085 0.9970 0.0767 +vn 0.0085 0.9970 0.0767 +vn 0.6237 -0.7061 0.3354 +vn -0.6237 -0.7061 0.3354 +vn 0.2733 -0.8925 0.3587 +vn -0.2733 -0.8925 0.3587 +vn -0.8328 -0.5080 -0.2200 +vn 0.8328 -0.5080 -0.2200 +vn -0.8339 0.2377 -0.4981 +vn 0.8339 0.2377 -0.4981 +vn -0.5655 0.7847 -0.2539 +vn 0.5655 0.7847 -0.2539 +vn -0.0560 0.9962 0.0672 +vn 0.0560 0.9962 0.0672 +vn 0.1445 0.0222 0.9893 +vn -0.1445 0.0222 0.9893 +vn 0.3275 0.0645 0.9427 +vn -0.3275 0.0645 0.9427 +vn 0.3127 0.0232 0.9496 +vn -0.3127 0.0232 0.9496 +vn 0.1710 0.0274 0.9849 +vn -0.1710 0.0274 0.9849 +vn 0.3487 0.2849 0.8929 +vn -0.3487 0.2849 0.8929 +vn 0.4006 -0.0343 0.9156 +vn -0.4006 -0.0343 0.9156 +vn 0.2572 -0.0603 0.9645 +vn -0.2572 -0.0603 0.9645 +vn 0.0637 -0.0106 0.9979 +vn -0.0637 -0.0106 0.9979 +vn -0.3637 0.7039 0.6101 +vn 0.3637 0.7039 0.6101 +vn 0.6299 0.0355 0.7759 +vn -0.6299 0.0355 0.7759 +vn 0.4472 -0.2002 0.8717 +vn -0.4472 -0.2002 0.8717 +vn 0.5072 -0.2141 0.8348 +vn -0.5072 -0.2141 0.8348 +vn 0.5258 0.2619 0.8093 +vn -0.5258 0.2619 0.8093 +vn 0.2980 0.5802 0.7580 +vn -0.2980 0.5802 0.7580 +vn 0.0930 -0.9924 -0.0805 +vn -0.0930 -0.9924 -0.0805 +vn 0.5006 -0.8657 0.0080 +vn -0.5006 -0.8657 0.0080 +vn 0.9285 -0.2497 0.2748 +vn -0.9285 -0.2497 0.2748 +vn 0.8393 0.5424 -0.0378 +vn -0.8393 0.5424 -0.0378 +vn -0.2355 0.9367 -0.2589 +vn 0.2355 0.9367 -0.2589 +vn -0.4499 0.8838 -0.1285 +vn 0.4499 0.8838 -0.1285 +vn -0.5384 -0.0098 -0.8427 +vn 0.5384 -0.0098 -0.8427 +vn -0.1910 -0.0241 -0.9813 +vn 0.1910 -0.0241 -0.9813 +vn 0.4046 0.0266 -0.9141 +vn -0.4046 0.0266 -0.9141 +vn -0.7819 0.6231 0.0197 +vn 0.7819 0.6231 0.0197 +vn 0.5428 -0.2063 -0.8142 +vn -0.5428 -0.2063 -0.8142 +vn -0.2474 -0.9231 -0.2945 +vn 0.2474 -0.9231 -0.2945 +s off +f 47/1/1 1/2/1 3/3/1 45/4/1 +f 4/5/2 2/6/2 48/7/2 46/8/2 +f 45/4/3 3/3/3 5/9/3 43/10/3 +f 6/11/4 4/5/4 46/8/4 44/12/4 +f 3/3/5 9/13/5 7/14/5 5/9/5 +f 8/15/6 10/16/6 4/5/6 6/11/6 +f 1/2/7 11/17/7 9/13/7 3/3/7 +f 10/16/8 12/18/8 2/6/8 4/5/8 +f 11/17/9 13/19/9 15/20/9 9/13/9 +f 16/21/10 14/22/10 12/18/10 10/16/10 +f 9/13/11 15/20/11 17/23/11 7/14/11 +f 18/24/12 16/21/12 10/16/12 8/15/12 +f 15/20/13 21/25/13 19/26/13 17/23/13 +f 20/27/14 22/28/14 16/21/14 18/24/14 +f 13/19/15 23/29/15 21/25/15 15/20/15 +f 22/28/16 24/30/16 14/22/16 16/21/16 +f 23/29/17 25/31/17 27/32/17 21/25/17 +f 28/33/18 26/34/18 24/30/18 22/28/18 +f 21/25/19 27/32/19 29/35/19 19/26/19 +f 30/36/20 28/33/20 22/28/20 20/27/20 +f 27/32/21 33/37/21 31/38/21 29/35/21 +f 32/39/22 34/40/22 28/33/22 30/36/22 +f 25/31/23 35/41/23 33/37/23 27/32/23 +f 34/40/24 36/42/24 26/34/24 28/33/24 +f 35/41/25 37/43/25 39/44/25 33/37/25 +f 40/45/26 38/46/26 36/42/26 34/40/26 +f 33/37/27 39/44/27 41/47/27 31/38/27 +f 42/48/28 40/45/28 34/40/28 32/39/28 +f 39/44/29 45/4/29 43/10/29 41/47/29 +f 44/12/30 46/8/30 40/45/30 42/48/30 +f 37/43/31 47/1/31 45/4/31 39/44/31 +f 46/8/32 48/7/32 38/46/32 40/45/32 +f 47/1/33 37/43/33 51/49/33 49/50/33 +f 52/51/34 38/46/34 48/7/34 50/52/34 +f 37/43/35 35/41/35 53/53/35 51/49/35 +f 54/54/36 36/42/36 38/46/36 52/51/36 +f 35/41/37 25/31/37 55/55/37 53/53/37 +f 56/56/38 26/34/38 36/42/38 54/54/38 +f 25/31/39 23/29/39 57/57/39 55/55/39 +f 58/58/40 24/30/40 26/34/40 56/56/40 +f 23/29/41 13/19/41 59/59/41 57/57/41 +f 60/60/42 14/22/42 24/30/42 58/58/42 +f 13/19/43 11/17/43 63/61/43 59/59/43 +f 64/62/44 12/18/44 14/22/44 60/60/44 +f 11/17/45 1/2/45 65/63/45 63/61/45 +f 66/64/46 2/6/46 12/18/46 64/62/46 +f 1/2/47 47/1/47 49/50/47 65/63/47 +f 50/52/48 48/7/48 2/6/48 66/64/48 +f 61/65/49 65/63/49 49/50/49 +f 50/52/50 66/64/50 62/66/50 +f 63/61/51 65/63/51 61/65/51 +f 62/66/52 66/64/52 64/62/52 +f 61/65/53 59/59/53 63/61/53 +f 64/62/54 60/60/54 62/66/54 +f 61/65/55 57/57/55 59/59/55 +f 60/60/56 58/58/56 62/66/56 +f 61/65/57 55/55/57 57/57/57 +f 58/58/58 56/56/58 62/66/58 +f 61/65/59 53/53/59 55/55/59 +f 56/56/60 54/54/60 62/66/60 +f 61/65/61 51/49/61 53/53/61 +f 54/54/62 52/51/62 62/66/62 +f 61/65/63 49/50/63 51/49/63 +f 52/51/64 50/52/64 62/66/64 +f 89/67/65 174/68/65 176/69/65 91/70/65 +f 176/69/66 175/71/66 90/72/66 91/70/66 +f 87/73/67 172/74/67 174/68/67 89/67/67 +f 175/71/68 173/75/68 88/76/68 90/72/68 +f 85/77/69 170/78/69 172/74/69 87/73/69 +f 173/75/70 171/79/70 86/80/70 88/76/70 +f 83/81/71 168/82/71 170/78/71 85/77/71 +f 171/79/72 169/83/72 84/84/72 86/80/72 +f 81/85/73 166/86/73 168/82/73 83/81/73 +f 169/83/74 167/87/74 82/88/74 84/84/74 +f 79/89/75 92/90/75 146/91/75 164/92/75 +f 147/93/76 93/94/76 80/95/76 165/96/76 +f 92/90/77 94/97/77 148/98/77 146/91/77 +f 149/99/78 95/100/78 93/94/78 147/93/78 +f 94/97/79 96/101/79 150/102/79 148/98/79 +f 151/103/80 97/104/80 95/100/80 149/99/80 +f 96/101/81 98/105/81 152/106/81 150/102/81 +f 153/107/82 99/108/82 97/104/82 151/103/82 +f 98/105/83 100/109/83 154/110/83 152/106/83 +f 155/111/84 101/112/84 99/108/84 153/107/84 +f 100/109/85 102/113/85 156/114/85 154/110/85 +f 157/115/86 103/116/86 101/112/86 155/111/86 +f 102/113/87 104/117/87 158/118/87 156/114/87 +f 159/119/88 105/120/88 103/116/88 157/115/88 +f 104/117/89 106/121/89 160/122/89 158/118/89 +f 161/123/90 107/124/90 105/120/90 159/119/90 +f 106/121/91 108/125/91 162/126/91 160/122/91 +f 163/127/92 109/128/92 107/124/92 161/123/92 +f 108/125/93 67/129/93 68/130/93 162/126/93 +f 68/130/94 67/129/94 109/128/94 163/127/94 +f 110/131/95 128/132/95 160/122/95 162/126/95 +f 161/123/96 129/133/96 111/134/96 163/127/96 +f 128/132/97 179/135/97 158/118/97 160/122/97 +f 159/119/98 180/136/98 129/133/98 161/123/98 +f 126/137/99 156/114/99 158/118/99 179/135/99 +f 159/119/100 157/115/100 127/138/100 180/136/100 +f 124/139/101 154/110/101 156/114/101 126/137/101 +f 157/115/102 155/111/102 125/140/102 127/138/102 +f 122/141/103 152/106/103 154/110/103 124/139/103 +f 155/111/104 153/107/104 123/142/104 125/140/104 +f 120/143/105 150/102/105 152/106/105 122/141/105 +f 153/107/106 151/103/106 121/144/106 123/142/106 +f 118/145/107 148/98/107 150/102/107 120/143/107 +f 151/103/108 149/99/108 119/146/108 121/144/108 +f 116/147/109 146/91/109 148/98/109 118/145/109 +f 149/99/110 147/93/110 117/148/110 119/146/110 +f 114/149/111 164/92/111 146/91/111 116/147/111 +f 147/93/112 165/96/112 115/150/112 117/148/112 +f 114/149/113 181/151/113 177/152/113 164/92/113 +f 177/152/114 182/153/114 115/150/114 165/96/114 +f 110/131/115 162/126/115 68/130/115 112/154/115 +f 68/130/116 163/127/116 111/134/116 113/155/116 +f 112/154/117 68/130/117 178/156/117 183/157/117 +f 178/156/118 68/130/118 113/155/118 184/158/118 +f 177/152/119 181/151/119 183/157/119 178/156/119 +f 184/158/120 182/153/120 177/152/120 178/156/120 +f 135/159/121 137/160/121 176/69/121 174/68/121 +f 176/69/122 137/160/122 136/161/122 175/71/122 +f 133/162/123 135/159/123 174/68/123 172/74/123 +f 175/71/124 136/161/124 134/163/124 173/75/124 +f 131/164/125 133/162/125 172/74/125 170/78/125 +f 173/75/126 134/163/126 132/165/126 171/79/126 +f 166/86/127 187/166/127 185/167/127 168/82/127 +f 186/168/128 188/169/128 167/87/128 169/83/128 +f 131/164/129 170/78/129 168/82/129 185/167/129 +f 169/83/130 171/79/130 132/165/130 186/168/130 +f 144/170/131 190/171/131 189/172/131 187/166/131 +f 189/172/132 190/171/132 145/173/132 188/169/132 +f 185/167/133 187/166/133 189/172/133 69/174/133 +f 189/172/134 188/169/134 186/168/134 69/174/134 +f 130/175/135 131/164/135 185/167/135 69/174/135 +f 186/168/135 132/165/135 130/175/135 69/174/135 +f 142/176/136 193/177/136 191/178/136 144/170/136 +f 192/179/137 194/180/137 143/181/137 145/173/137 +f 140/182/138 195/183/138 193/177/138 142/176/138 +f 194/180/139 196/184/139 141/185/139 143/181/139 +f 139/186/140 197/187/140 195/183/140 140/182/140 +f 196/184/141 198/188/141 139/186/141 141/185/141 +f 138/189/142 71/190/142 197/187/142 139/186/142 +f 198/188/143 71/190/143 138/189/143 139/186/143 +f 190/171/144 144/170/144 191/178/144 70/191/144 +f 192/179/145 145/173/145 190/171/145 70/191/145 +f 70/191/146 191/178/146 206/192/146 208/193/146 +f 207/194/147 192/179/147 70/191/147 208/193/147 +f 71/190/148 199/195/148 200/196/148 197/187/148 +f 201/197/149 199/195/149 71/190/149 198/188/149 +f 197/187/150 200/196/150 202/198/150 195/183/150 +f 203/199/151 201/197/151 198/188/151 196/184/151 +f 195/183/152 202/198/152 204/200/152 193/177/152 +f 205/201/153 203/199/153 196/184/153 194/180/153 +f 193/177/154 204/200/154 206/192/154 191/178/154 +f 207/194/155 205/201/155 194/180/155 192/179/155 +f 199/195/156 204/200/156 202/198/156 200/196/156 +f 203/199/157 205/201/157 199/195/157 201/197/157 +f 199/195/158 208/193/158 206/192/158 204/200/158 +f 207/194/159 208/193/159 199/195/159 205/201/159 +f 139/186/160 140/182/160 164/92/160 177/152/160 +f 165/96/161 141/185/161 139/186/161 177/152/161 +f 140/182/162 142/176/162 211/202/162 164/92/162 +f 212/203/163 143/181/163 141/185/163 165/96/163 +f 142/176/164 144/170/164 213/204/164 211/202/164 +f 214/205/165 145/173/165 143/181/165 212/203/165 +f 144/170/166 187/166/166 166/86/166 213/204/166 +f 167/87/167 188/169/167 145/173/167 214/205/167 +f 81/85/168 209/206/168 213/204/168 166/86/168 +f 214/205/169 210/207/169 82/88/169 167/87/169 +f 209/206/170 215/208/170 211/202/170 213/204/170 +f 212/203/171 216/209/171 210/207/171 214/205/171 +f 79/89/172 164/92/172 211/202/172 215/208/172 +f 212/203/173 165/96/173 80/95/173 216/209/173 +f 131/164/174 130/175/174 72/210/174 222/211/174 +f 72/210/175 130/175/175 132/165/175 223/212/175 +f 133/162/176 131/164/176 222/211/176 220/213/176 +f 223/212/177 132/165/177 134/163/177 221/214/177 +f 135/159/178 133/162/178 220/213/178 218/215/178 +f 221/214/179 134/163/179 136/161/179 219/216/179 +f 137/160/180 135/159/180 218/215/180 217/217/180 +f 219/216/181 136/161/181 137/160/181 217/217/181 +f 217/217/182 218/215/182 229/218/182 231/219/182 +f 230/220/183 219/216/183 217/217/183 231/219/183 +f 218/215/184 220/213/184 227/221/184 229/218/184 +f 228/222/185 221/214/185 219/216/185 230/220/185 +f 220/213/186 222/211/186 225/223/186 227/221/186 +f 226/224/187 223/212/187 221/214/187 228/222/187 +f 222/211/188 72/210/188 224/225/188 225/223/188 +f 224/225/189 72/210/189 223/212/189 226/224/189 +f 224/225/190 231/219/190 229/218/190 225/223/190 +f 230/220/191 231/219/191 224/225/191 226/224/191 +f 225/223/192 229/218/192 227/221/192 +f 228/222/193 230/220/193 226/224/193 +f 183/157/194 181/151/194 234/226/194 232/227/194 +f 235/228/195 182/153/195 184/158/195 233/229/195 +f 112/154/196 183/157/196 232/227/196 254/230/196 +f 233/229/197 184/158/197 113/155/197 255/231/197 +f 110/131/198 112/154/198 254/230/198 256/232/198 +f 255/231/199 113/155/199 111/134/199 257/233/199 +f 181/151/200 114/149/200 252/234/200 234/226/200 +f 253/235/201 115/150/201 182/153/201 235/228/201 +f 114/149/202 116/147/202 250/236/202 252/234/202 +f 251/237/203 117/148/203 115/150/203 253/235/203 +f 116/147/204 118/145/204 248/238/204 250/236/204 +f 249/239/205 119/146/205 117/148/205 251/237/205 +f 118/145/206 120/143/206 246/240/206 248/238/206 +f 247/241/207 121/144/207 119/146/207 249/239/207 +f 120/143/208 122/141/208 244/242/208 246/240/208 +f 245/243/209 123/142/209 121/144/209 247/241/209 +f 122/141/210 124/139/210 242/244/210 244/242/210 +f 243/245/211 125/140/211 123/142/211 245/243/211 +f 124/139/212 126/137/212 240/246/212 242/244/212 +f 241/247/213 127/138/213 125/140/213 243/245/213 +f 126/137/214 179/135/214 236/248/214 240/246/214 +f 237/249/215 180/136/215 127/138/215 241/247/215 +f 179/135/216 128/132/216 238/250/216 236/248/216 +f 239/251/217 129/133/217 180/136/217 237/249/217 +f 128/132/218 110/131/218 256/232/218 238/250/218 +f 257/233/219 111/134/219 129/133/219 239/251/219 +f 238/250/220 256/232/220 258/252/220 276/253/220 +f 259/254/221 257/233/221 239/251/221 277/255/221 +f 236/248/222 238/250/222 276/253/222 278/256/222 +f 277/255/223 239/251/223 237/249/223 279/257/223 +f 240/246/224 236/248/224 278/256/224 274/258/224 +f 279/257/225 237/249/225 241/247/225 275/259/225 +f 242/244/226 240/246/226 274/258/226 272/260/226 +f 275/259/227 241/247/227 243/245/227 273/261/227 +f 244/242/228 242/244/228 272/260/228 270/262/228 +f 273/261/229 243/245/229 245/243/229 271/263/229 +f 246/240/230 244/242/230 270/262/230 268/264/230 +f 271/263/231 245/243/231 247/241/231 269/265/231 +f 248/238/232 246/240/232 268/264/232 266/266/232 +f 269/265/233 247/241/233 249/239/233 267/267/233 +f 250/236/234 248/238/234 266/266/234 264/268/234 +f 267/267/235 249/239/235 251/237/235 265/269/235 +f 252/234/236 250/236/236 264/268/236 262/270/236 +f 265/269/237 251/237/237 253/235/237 263/271/237 +f 234/226/238 252/234/238 262/270/238 280/272/238 +f 263/271/239 253/235/239 235/228/239 281/273/239 +f 256/232/240 254/230/240 260/274/240 258/252/240 +f 261/275/241 255/231/241 257/233/241 259/254/241 +f 254/230/242 232/227/242 282/276/242 260/274/242 +f 283/277/243 233/229/243 255/231/243 261/275/243 +f 232/227/244 234/226/244 280/272/244 282/276/244 +f 281/273/245 235/228/245 233/229/245 283/277/245 +f 67/129/246 108/125/246 284/278/246 73/279/246 +f 285/280/247 109/128/247 67/129/247 73/279/247 +f 108/125/248 106/121/248 286/281/248 284/278/248 +f 287/282/249 107/124/249 109/128/249 285/280/249 +f 106/121/250 104/117/250 288/283/250 286/281/250 +f 289/284/251 105/120/251 107/124/251 287/282/251 +f 104/117/252 102/113/252 290/285/252 288/283/252 +f 291/286/253 103/116/253 105/120/253 289/284/253 +f 102/113/254 100/109/254 292/287/254 290/285/254 +f 293/288/255 101/112/255 103/116/255 291/286/255 +f 100/109/256 98/105/256 294/289/256 292/287/256 +f 295/290/257 99/108/257 101/112/257 293/288/257 +f 98/105/258 96/101/258 296/291/258 294/289/258 +f 297/292/259 97/104/259 99/108/259 295/290/259 +f 96/101/260 94/97/260 298/293/260 296/291/260 +f 299/294/261 95/100/261 97/104/261 297/292/261 +f 94/97/262 92/90/262 300/295/262 298/293/262 +f 301/296/263 93/94/263 95/100/263 299/294/263 +f 308/297/264 309/298/264 328/299/264 338/300/264 +f 329/301/265 309/302/265 308/303/265 339/304/265 +f 307/305/266 308/297/266 338/300/266 336/306/266 +f 339/304/267 308/303/267 307/307/267 337/308/267 +f 306/309/268 307/305/268 336/306/268 340/310/268 +f 337/308/269 307/307/269 306/309/269 341/311/269 +f 89/67/270 91/70/270 306/309/270 340/310/270 +f 306/309/271 91/70/271 90/72/271 341/311/271 +f 87/73/272 89/67/272 340/310/272 334/312/272 +f 341/311/273 90/72/273 88/76/273 335/313/273 +f 85/77/274 87/73/274 334/312/274 330/314/274 +f 335/313/275 88/76/275 86/80/275 331/315/275 +f 83/81/276 85/77/276 330/314/276 332/316/276 +f 331/315/277 86/80/277 84/84/277 333/317/277 +f 330/314/278 336/306/278 338/300/278 332/316/278 +f 339/304/279 337/308/279 331/315/279 333/317/279 +f 330/314/280 334/312/280 340/310/280 336/306/280 +f 341/311/281 335/313/281 331/315/281 337/308/281 +f 326/318/282 332/316/282 338/300/282 328/299/282 +f 339/304/283 333/317/283 327/319/283 329/301/283 +f 81/85/284 83/81/284 332/316/284 326/318/284 +f 333/317/285 84/84/285 82/88/285 327/319/285 +f 209/206/286 342/320/286 344/321/286 215/208/286 +f 345/322/287 343/323/287 210/207/287 216/209/287 +f 81/85/288 326/318/288 342/320/288 209/206/288 +f 343/323/289 327/319/289 82/88/289 210/207/289 +f 79/89/290 215/208/290 344/321/290 346/324/290 +f 345/322/291 216/209/291 80/95/291 347/325/291 +f 79/89/292 346/324/292 300/295/292 92/90/292 +f 301/296/293 347/325/293 80/95/293 93/94/293 +f 77/326/294 324/327/294 352/328/294 304/329/294 +f 353/330/295 325/331/295 77/332/295 304/333/295 +f 304/329/296 352/328/296 350/334/296 78/335/296 +f 351/336/297 353/330/297 304/333/297 78/337/297 +f 78/335/298 350/334/298 348/338/298 305/339/298 +f 349/340/299 351/336/299 78/337/299 305/341/299 +f 305/339/300 348/338/300 328/299/300 309/298/300 +f 329/301/301 349/340/301 305/341/301 309/302/301 +f 326/318/302 328/299/302 348/338/302 342/320/302 +f 349/340/303 329/301/303 327/319/303 343/323/303 +f 296/291/304 298/293/304 318/342/304 310/343/304 +f 319/344/305 299/294/305 297/292/305 311/345/305 +f 76/346/306 316/347/306 324/327/306 77/326/306 +f 325/331/307 317/348/307 76/349/307 77/332/307 +f 302/350/308 358/351/308 356/352/308 303/353/308 +f 357/354/309 359/355/309 302/356/309 303/357/309 +f 303/353/310 356/352/310 354/358/310 75/359/310 +f 355/360/311 357/354/311 303/357/311 75/361/311 +f 75/359/312 354/358/312 316/347/312 76/346/312 +f 317/348/313 355/360/313 75/361/313 76/349/313 +f 292/362/314 294/289/314 362/363/314 364/364/314 +f 363/365/315 295/290/315 293/366/315 365/367/315 +f 364/364/316 362/363/316 368/368/316 366/369/316 +f 369/370/317 363/365/317 365/367/317 367/371/317 +f 366/369/318 368/368/318 370/372/318 372/373/318 +f 371/374/319 369/370/319 367/371/319 373/375/319 +f 372/373/320 370/372/320 376/376/320 374/377/320 +f 377/378/321 371/374/321 373/375/321 375/379/321 +f 314/380/322 378/381/322 374/377/322 376/376/322 +f 375/379/323 379/382/323 315/383/323 377/378/323 +f 316/347/324 354/358/324 374/377/324 378/381/324 +f 375/379/325 355/360/325 317/348/325 379/382/325 +f 354/358/326 356/352/326 372/373/326 374/377/326 +f 373/375/327 357/354/327 355/360/327 375/379/327 +f 356/352/328 358/351/328 366/369/328 372/373/328 +f 367/371/329 359/355/329 357/354/329 373/375/329 +f 358/351/330 360/384/330 364/364/330 366/369/330 +f 365/367/331 361/385/331 359/355/331 367/371/331 +f 290/386/332 292/362/332 364/364/332 360/384/332 +f 365/367/333 293/366/333 291/387/333 361/385/333 +f 74/388/334 360/384/334 358/351/334 302/350/334 +f 359/355/335 361/385/335 74/389/335 302/356/335 +f 284/390/336 286/391/336 288/392/336 290/386/336 +f 289/393/337 287/394/337 285/395/337 291/387/337 +f 284/390/338 290/386/338 360/384/338 74/388/338 +f 361/385/339 291/387/339 285/395/339 74/389/339 +f 73/396/340 284/390/340 74/388/340 +f 74/389/341 285/395/341 73/397/341 +f 294/289/342 296/291/342 310/343/342 362/363/342 +f 311/345/343 297/292/343 295/290/343 363/365/343 +f 310/343/344 312/398/344 368/368/344 362/363/344 +f 369/370/345 313/399/345 311/345/345 363/365/345 +f 312/398/346 382/400/346 370/372/346 368/368/346 +f 371/374/347 383/401/347 313/399/347 369/370/347 +f 314/380/348 376/376/348 370/372/348 382/400/348 +f 371/374/349 377/378/349 315/383/349 383/401/349 +f 348/338/350 350/334/350 386/402/350 384/403/350 +f 387/404/351 351/336/351 349/340/351 385/405/351 +f 318/342/352 384/403/352 386/402/352 320/406/352 +f 387/404/353 385/405/353 319/344/353 321/407/353 +f 298/293/354 300/295/354 384/403/354 318/342/354 +f 385/405/355 301/296/355 299/294/355 319/344/355 +f 300/295/356 344/321/356 342/320/356 384/403/356 +f 343/323/357 345/322/357 301/296/357 385/405/357 +f 342/320/358 348/338/358 384/403/358 +f 385/405/359 349/340/359 343/323/359 +f 300/295/360 346/324/360 344/321/360 +f 345/322/361 347/325/361 301/296/361 +f 314/380/362 322/408/362 380/409/362 378/381/362 +f 381/410/363 323/411/363 315/383/363 379/382/363 +f 316/347/364 378/381/364 380/409/364 324/327/364 +f 381/410/365 379/382/365 317/348/365 325/331/365 +f 320/406/366 386/402/366 380/409/366 322/408/366 +f 381/410/367 387/404/367 321/407/367 323/411/367 +f 350/334/368 352/328/368 380/409/368 386/402/368 +f 381/410/369 353/330/369 351/336/369 387/404/369 +f 324/327/370 380/409/370 352/328/370 +f 353/330/371 381/410/371 325/331/371 +f 400/412/372 388/413/372 414/414/372 402/415/372 +f 415/416/373 389/417/373 401/418/373 403/419/373 +f 400/412/374 402/415/374 404/420/374 398/421/374 +f 405/422/375 403/419/375 401/418/375 399/423/375 +f 398/421/376 404/420/376 406/424/376 396/425/376 +f 407/426/377 405/422/377 399/423/377 397/427/377 +f 396/425/378 406/424/378 408/428/378 394/429/378 +f 409/430/379 407/426/379 397/427/379 395/431/379 +f 394/429/380 408/428/380 410/432/380 392/433/380 +f 411/434/381 409/430/381 395/431/381 393/435/381 +f 392/433/382 410/432/382 412/436/382 390/437/382 +f 413/438/383 411/434/383 393/435/383 391/439/383 +f 410/432/384 420/440/384 418/441/384 412/436/384 +f 419/442/385 421/443/385 411/434/385 413/438/385 +f 408/428/386 422/444/386 420/440/386 410/432/386 +f 421/443/387 423/445/387 409/430/387 411/434/387 +f 406/424/388 424/446/388 422/444/388 408/428/388 +f 423/445/389 425/447/389 407/426/389 409/430/389 +f 404/420/390 426/448/390 424/446/390 406/424/390 +f 425/447/391 427/449/391 405/422/391 407/426/391 +f 402/415/392 428/450/392 426/448/392 404/420/392 +f 427/449/393 429/451/393 403/419/393 405/422/393 +f 402/415/394 414/414/394 416/452/394 428/450/394 +f 417/453/395 415/416/395 403/419/395 429/451/395 +f 318/342/396 320/406/396 444/454/396 442/455/396 +f 445/456/397 321/407/397 319/344/397 443/457/397 +f 320/458/398 390/437/398 412/436/398 444/459/398 +f 413/438/399 391/439/399 321/460/399 445/461/399 +f 310/343/400 318/342/400 442/455/400 312/398/400 +f 443/457/401 319/344/401 311/345/401 313/399/401 +f 382/462/402 430/463/402 414/414/402 388/413/402 +f 415/416/403 431/464/403 383/465/403 389/417/403 +f 412/436/404 418/441/404 440/466/404 444/459/404 +f 441/467/405 419/442/405 413/438/405 445/461/405 +f 438/468/406 446/469/406 444/459/406 440/466/406 +f 445/461/407 447/470/407 439/471/407 441/467/407 +f 434/472/408 446/469/408 438/468/408 436/473/408 +f 439/471/409 447/470/409 435/474/409 437/475/409 +f 432/476/410 448/477/410 446/469/410 434/472/410 +f 447/470/411 449/478/411 433/479/411 435/474/411 +f 430/463/412 448/477/412 432/476/412 450/480/412 +f 433/479/413 449/478/413 431/464/413 451/481/413 +f 414/414/414 430/463/414 450/480/414 416/452/414 +f 451/481/415 431/464/415 415/416/415 417/453/415 +f 312/398/416 448/482/416 430/483/416 382/400/416 +f 431/484/417 449/485/417 313/399/417 383/401/417 +f 312/398/418 442/455/418 446/486/418 448/482/418 +f 447/487/419 443/457/419 313/399/419 449/485/419 +f 442/455/420 444/454/420 446/486/420 +f 447/487/421 445/456/421 443/457/421 +f 416/452/422 450/480/422 452/488/422 476/489/422 +f 453/490/423 451/481/423 417/453/423 477/491/423 +f 450/480/424 432/476/424 462/492/424 452/488/424 +f 463/493/425 433/479/425 451/481/425 453/490/425 +f 432/476/426 434/472/426 460/494/426 462/492/426 +f 461/495/427 435/474/427 433/479/427 463/493/427 +f 434/472/428 436/473/428 458/496/428 460/494/428 +f 459/497/429 437/475/429 435/474/429 461/495/429 +f 436/473/430 438/468/430 456/498/430 458/496/430 +f 457/499/431 439/471/431 437/475/431 459/497/431 +f 438/468/432 440/466/432 454/500/432 456/498/432 +f 455/501/433 441/467/433 439/471/433 457/499/433 +f 440/466/434 418/441/434 474/502/434 454/500/434 +f 475/503/435 419/442/435 441/467/435 455/501/435 +f 428/450/436 416/452/436 476/489/436 464/504/436 +f 477/491/437 417/453/437 429/451/437 465/505/437 +f 426/448/438 428/450/438 464/504/438 466/506/438 +f 465/505/439 429/451/439 427/449/439 467/507/439 +f 424/446/440 426/448/440 466/506/440 468/508/440 +f 467/507/441 427/449/441 425/447/441 469/509/441 +f 422/444/442 424/446/442 468/508/442 470/510/442 +f 469/509/443 425/447/443 423/445/443 471/511/443 +f 420/440/444 422/444/444 470/510/444 472/512/444 +f 471/511/445 423/445/445 421/443/445 473/513/445 +f 418/441/446 420/440/446 472/512/446 474/502/446 +f 473/513/447 421/443/447 419/442/447 475/503/447 +f 458/496/448 456/498/448 480/514/448 478/515/448 +f 481/516/449 457/499/449 459/497/449 479/517/449 +f 478/515/450 480/514/450 482/518/450 484/519/450 +f 483/520/451 481/516/451 479/517/451 485/521/451 +f 484/519/452 482/518/452 488/522/452 486/523/452 +f 489/524/453 483/520/453 485/521/453 487/525/453 +f 486/523/454 488/522/454 490/526/454 492/527/454 +f 491/528/455 489/524/455 487/525/455 493/529/455 +f 464/504/456 476/489/456 486/523/456 492/527/456 +f 487/525/457 477/491/457 465/505/457 493/529/457 +f 452/488/458 484/519/458 486/523/458 476/489/458 +f 487/525/459 485/521/459 453/490/459 477/491/459 +f 452/488/460 462/492/460 478/515/460 484/519/460 +f 479/517/461 463/493/461 453/490/461 485/521/461 +f 458/496/462 478/515/462 462/492/462 460/494/462 +f 463/493/463 479/517/463 459/497/463 461/495/463 +f 454/500/464 474/502/464 480/514/464 456/498/464 +f 481/516/465 475/503/465 455/501/465 457/499/465 +f 472/512/466 482/518/466 480/514/466 474/502/466 +f 481/516/467 483/520/467 473/513/467 475/503/467 +f 470/510/468 488/522/468 482/518/468 472/512/468 +f 483/520/469 489/524/469 471/511/469 473/513/469 +f 468/508/470 490/526/470 488/522/470 470/510/470 +f 489/524/471 491/528/471 469/509/471 471/511/471 +f 466/506/472 492/527/472 490/526/472 468/508/472 +f 491/528/473 493/529/473 467/507/473 469/509/473 +f 464/504/474 492/527/474 466/506/474 +f 467/507/475 493/529/475 465/505/475 +f 392/433/476 390/437/476 504/530/476 502/531/476 +f 505/532/477 391/439/477 393/435/477 503/533/477 +f 394/429/478 392/433/478 502/531/478 500/534/478 +f 503/533/479 393/435/479 395/431/479 501/535/479 +f 396/425/480 394/429/480 500/534/480 498/536/480 +f 501/535/481 395/431/481 397/427/481 499/537/481 +f 398/538/482 396/425/482 498/536/482 496/539/482 +f 499/537/483 397/427/483 399/540/483 497/541/483 +f 400/542/484 398/538/484 496/539/484 494/543/484 +f 497/541/485 399/540/485 401/544/485 495/545/485 +f 388/546/486 400/542/486 494/543/486 506/547/486 +f 495/545/487 401/544/487 389/548/487 507/549/487 +f 494/543/488 502/531/488 504/530/488 506/547/488 +f 505/532/489 503/533/489 495/545/489 507/549/489 +f 494/543/490 496/539/490 500/534/490 502/531/490 +f 501/535/491 497/541/491 495/545/491 503/533/491 +f 496/539/492 498/536/492 500/534/492 +f 501/535/493 499/537/493 497/541/493 +f 314/380/494 382/400/494 388/550/494 506/551/494 +f 389/548/495 383/552/495 315/553/495 507/549/495 +f 314/554/496 506/547/496 504/530/496 322/555/496 +f 505/532/497 507/549/497 315/553/497 323/556/497 +f 320/458/498 322/555/498 504/530/498 390/437/498 +f 505/532/499 323/556/499 321/460/499 391/439/499 +g Transformed_Suzanne.001 +v -1.009868 2.205956 -0.421178 +v -1.254192 2.465473 -0.958310 +v -0.924912 2.143532 -0.434721 +v -1.204140 2.440123 -1.048586 +v -0.845536 2.123187 -0.439210 +v -1.150941 2.447583 -1.110626 +v -0.879987 2.098124 -0.608339 +v -1.076319 2.306664 -1.039964 +v -0.950292 2.121164 -0.565228 +v -1.146624 2.329705 -0.996852 +v -1.025830 2.198248 -0.493625 +v -1.222162 2.406789 -0.925249 +v -1.069314 2.246118 -0.519794 +v -1.222016 2.408316 -0.855501 +v -1.031669 2.216711 -0.613293 +v -1.145105 2.337201 -0.862676 +v -0.985288 2.219923 -0.674285 +v -1.072547 2.312607 -0.866118 +v -1.099622 2.414654 -0.597269 +v -1.143251 2.460996 -0.693186 +v -1.119666 2.372748 -0.553137 +v -1.198199 2.456164 -0.725787 +v -1.115169 2.327755 -0.487123 +v -1.250420 2.471416 -0.784464 +v -1.147285 2.398092 -0.410900 +v -1.299988 2.560290 -0.746608 +v -1.172760 2.491711 -0.416248 +v -1.286196 2.612202 -0.665631 +v -1.167221 2.574528 -0.420200 +v -1.254480 2.667213 -0.612033 +v -1.136179 2.597467 -0.250547 +v -1.332511 2.806007 -0.682171 +v -1.150789 2.511954 -0.285217 +v -1.347121 2.720495 -0.716841 +v -1.133505 2.408117 -0.343249 +v -1.329836 2.616657 -0.774873 +v -1.087839 2.357930 -0.312284 +v -1.332163 2.617447 -0.849417 +v -1.066003 2.418532 -0.237676 +v -1.345231 2.715123 -0.851541 +v -1.027469 2.477792 -0.185126 +v -1.332875 2.802189 -0.856542 +v -0.906014 2.277949 -0.267851 +v -1.255049 2.648688 -1.035183 +v -0.971188 2.266744 -0.298880 +v -1.285320 2.600409 -0.989479 +v -1.034862 2.271180 -0.350664 +v -1.296638 2.549235 -0.926164 +v -1.039498 2.264614 -0.344820 +v -1.305637 2.547303 -0.929911 +v -1.096188 2.358601 -0.301255 +v -1.344875 2.622752 -0.847979 +v -1.151157 2.416217 -0.331305 +v -1.347489 2.624758 -0.762930 +v -1.163406 2.401272 -0.408938 +v -1.311745 2.558836 -0.735054 +v -1.129758 2.326015 -0.495142 +v -1.256283 2.460408 -0.773300 +v -1.078008 2.234825 -0.528202 +v -1.226348 2.392389 -0.854319 +v -1.098263 2.286817 -0.417885 +v -1.294595 2.495358 -0.849509 +v -1.028630 2.177401 -0.502424 +v -1.224962 2.385942 -0.934048 +v -1.010791 2.192153 -0.420519 +v -1.259478 2.456305 -0.967243 +v -1.248043 2.588141 -0.515013 +v -1.245001 2.494528 -0.561626 +v -0.717399 1.562632 -1.251863 +v -0.908646 1.882781 -1.010190 +v -0.978584 2.001558 -0.920990 +v -0.666027 1.480039 -1.315136 +v -1.175546 2.604670 -0.540003 +v -1.239883 2.765141 -0.433206 +v -0.908373 3.372883 -0.290367 +v -0.615775 3.144551 -0.533780 +v -0.392088 2.682256 -0.858887 +v -0.384673 2.132928 -1.127669 +v -0.819603 2.005046 -0.812022 +v -0.933039 2.125536 -1.061405 +v -0.673657 1.738903 -0.910289 +v -0.848175 1.924272 -1.293955 +v -0.540224 1.488501 -1.057428 +v -0.736556 1.697042 -1.489052 +v -0.425994 1.313568 -1.180092 +v -0.631052 1.531377 -1.630899 +v -0.407502 1.276620 -1.240893 +v -0.590745 1.471258 -1.643742 +v -0.451446 1.290437 -1.345473 +v -0.551794 1.397024 -1.566081 +v -0.504420 1.322883 -1.464576 +v -0.762801 1.987452 -0.639131 +v -1.007125 2.246969 -1.176264 +v -0.759941 2.021478 -0.451301 +v -1.113339 2.396851 -1.228225 +v -0.753609 2.162728 -0.213246 +v -1.216080 2.653957 -1.229961 +v -0.943315 2.373622 0.002570 +v -1.423238 2.883388 -1.052512 +v -1.024389 2.459807 -0.050157 +v -1.421415 2.881523 -0.922997 +v -1.168434 2.616244 -0.102466 +v -1.443298 2.908201 -0.706740 +v -1.311137 2.799211 -0.101121 +v -1.490017 2.989215 -0.494379 +v -1.348609 2.805313 -0.226188 +v -1.435868 2.897998 -0.418022 +v -1.263703 2.625374 -0.434639 +v -1.298607 2.662448 -0.511372 +v -1.208441 2.516510 -0.422575 +v -1.300063 2.613829 -0.623999 +v -1.163959 2.428904 -0.519674 +v -1.233766 2.503052 -0.673140 +v -1.031669 2.216711 -0.613293 +v -1.145105 2.337201 -0.862676 +v -0.929504 2.103988 -0.562260 +v -1.138925 2.326432 -1.022659 +v -0.905424 2.121150 -0.461306 +v -1.180289 2.413107 -1.065580 +v -0.917520 2.203922 -0.298383 +v -1.266555 2.574661 -1.065715 +v -0.965138 2.300604 -0.216196 +v -1.322898 2.680611 -1.002712 +v -1.019992 2.380309 -0.187273 +v -1.355938 2.737145 -0.925830 +v -1.121549 2.474309 -0.247629 +v -1.361510 2.729192 -0.775170 +v -1.203618 2.545928 -0.334571 +v -1.343232 2.694224 -0.641504 +v -0.676557 1.483027 -1.308902 +v -0.668294 1.494008 -1.210648 +v -0.729375 1.558887 -1.344931 +v -0.600193 1.389512 -1.285206 +v -0.665637 1.459025 -1.429080 +v -0.586368 1.366559 -1.350937 +v -0.621271 1.403633 -1.427670 +v -0.596698 1.379984 -1.395013 +v -0.954418 2.007068 -0.929320 +v -0.977000 2.059850 -0.893547 +v -0.944928 2.022491 -0.836386 +v -1.001646 2.082736 -0.961078 +v -0.904663 1.941047 -0.873329 +v -0.974470 2.015195 -1.026795 +v -0.882458 1.896862 -0.939315 +v -0.930450 1.947839 -1.044823 +v -0.879621 2.047640 -0.591452 +v -1.102131 2.283986 -1.080626 +v -0.846356 2.089586 -0.392903 +v -1.191027 2.455691 -1.150644 +v -0.876134 2.201020 -0.228811 +v -1.281887 2.632004 -1.120835 +v -0.977317 2.340725 -0.101472 +v -1.391795 2.780978 -1.012679 +v -1.041831 2.374010 -0.104399 +v -1.425768 2.781822 -0.948465 +v -1.205436 2.552064 -0.164997 +v -1.449760 2.811581 -0.702129 +v -1.301938 2.665358 -0.176885 +v -1.476456 2.850727 -0.560551 +v -1.328158 2.671838 -0.258534 +v -1.441594 2.792328 -0.507917 +v -1.263998 2.530401 -0.445854 +v -1.320716 2.590646 -0.570545 +v -0.991340 2.039841 -0.786169 +v -1.061147 2.113989 -0.939636 +v -0.759661 1.723549 -0.968386 +v -0.877460 1.848673 -1.227361 +v -0.616001 1.479520 -1.117097 +v -0.755615 1.627816 -1.424030 +v -0.545718 1.372707 -1.186859 +v -0.694058 1.530271 -1.512975 +v -0.496254 1.303631 -1.270363 +v -0.627142 1.442658 -1.558113 +v -0.508461 1.310011 -1.323897 +v -0.600083 1.407330 -1.525321 +v -0.550255 1.342072 -1.434456 +v -1.059292 2.237784 -0.770145 +v -1.154307 2.379136 -0.658632 +v -1.178699 2.534243 -0.282476 +v -1.361942 2.728881 -0.685325 +v -1.068263 2.269593 -0.605636 +v -1.159884 2.366912 -0.807061 +v -1.113814 2.341869 -0.577627 +v -1.187984 2.420651 -0.740685 +v -0.680964 1.520638 -1.185111 +v -0.746408 1.590152 -1.328986 +v -0.813790 1.752318 -1.047294 +v -0.857419 1.798660 -1.143211 +v -0.835605 1.775489 -1.095253 +v -0.887890 1.886166 -1.017996 +v -0.904746 1.898396 -0.921528 +v -0.957101 1.954007 -1.036628 +v -0.922934 1.925983 -0.865388 +v -0.997104 2.004765 -1.028446 +v -0.967216 2.024026 -0.818599 +v -1.028297 2.088905 -0.952882 +v -0.990562 2.052116 -0.856576 +v -1.012377 2.075288 -0.904534 +v -0.984793 1.978587 -0.929264 +v -0.990877 2.019591 -0.865240 +v -1.017054 2.047397 -0.922790 +v -0.974075 1.998451 -0.841650 +v -1.026430 2.054062 -0.956750 +v -0.943113 1.924437 -0.877679 +v -1.004194 1.989316 -1.011962 +v -0.930474 1.918368 -0.913991 +v -0.974104 1.964710 -1.009907 +v -0.933724 1.905355 -0.987876 +v -0.741517 1.875161 -0.861942 +v -0.885494 2.028091 -1.178466 +v -0.869286 1.925610 -0.862341 +v -0.960907 2.022929 -1.063766 +v -0.831507 1.855844 -0.899418 +v -0.931854 1.962431 -1.120026 +v -0.777765 1.940007 -0.834846 +v -0.908653 2.079034 -1.122596 +v -0.604124 1.394457 -1.384642 +v -0.594748 1.387792 -1.350682 +v -0.620926 1.415597 -1.408232 +v -0.614163 1.410937 -1.289222 +v -0.666518 1.466547 -1.404322 +v -0.658110 1.479056 -1.236320 +v -0.710465 1.534667 -1.351420 +v -0.635044 1.489797 -1.324514 +v -0.627127 1.488815 -1.245698 +v -0.679482 1.544426 -1.360798 +v -0.587197 1.437293 -1.288754 +v -0.639552 1.492904 -1.403854 +v -0.578312 1.417136 -1.343980 +v -0.604490 1.444942 -1.401530 +v -0.587688 1.423802 -1.377940 +v -1.116846 2.331147 -0.546890 +v -1.212830 2.433100 -0.757906 +v -1.079371 2.270742 -0.579305 +v -1.184081 2.381964 -0.809505 +v -1.161057 2.484256 -0.307744 +v -1.348664 2.683528 -0.720185 +v -1.181614 2.491307 -0.350248 +v -1.334316 2.653505 -0.685956 +v -1.129027 2.425571 -0.274683 +v -1.364625 2.675820 -0.792633 +v -1.033396 2.361686 -0.224712 +v -1.347527 2.695351 -0.915311 +v -0.993739 2.298965 -0.252332 +v -1.320959 2.646532 -0.971706 +v -0.947957 2.216564 -0.319876 +v -1.270814 2.559497 -1.029659 +v -0.948805 2.149222 -0.441826 +v -1.214943 2.431911 -1.026917 +v -0.968825 2.136787 -0.528527 +v -1.178246 2.359230 -0.988926 +v -1.049595 2.213611 -0.585914 +v -1.176119 2.348004 -0.864072 +v -1.151793 2.401198 -0.490240 +v -1.252141 2.507786 -0.710848 +v -1.180197 2.464298 -0.419203 +v -1.297996 2.589423 -0.678177 +v -1.156000 2.449247 -0.416758 +v -1.286888 2.588274 -0.704508 +v -1.137204 2.402937 -0.482221 +v -1.246277 2.518793 -0.722012 +v -1.042431 2.229824 -0.567524 +v -1.177682 2.373485 -0.864866 +v -0.973147 2.162746 -0.514019 +v -1.182567 2.385190 -0.974418 +v -0.953776 2.172579 -0.442095 +v -1.211189 2.445999 -1.008003 +v -0.960700 2.242430 -0.329213 +v -1.266105 2.566827 -1.000629 +v -0.991935 2.305245 -0.277749 +v -1.301703 2.634276 -0.958756 +v -1.027878 2.360730 -0.255314 +v -1.324558 2.675858 -0.907547 +v -1.117269 2.427025 -0.286237 +v -1.348505 2.672639 -0.794594 +v -1.164885 2.469404 -0.361532 +v -1.321950 2.636236 -0.706832 +v -1.146510 2.464670 -0.323824 +v -1.334116 2.663942 -0.736265 +v -1.072207 2.286955 -0.560915 +v -1.185643 2.407445 -0.810298 +v -1.100379 2.339930 -0.529413 +v -1.209452 2.455786 -0.769205 +v -1.174405 2.620764 -0.436040 +v -1.235486 2.685643 -0.570323 +v -1.250354 2.781309 -0.247941 +v -1.359427 2.897165 -0.487732 +v -1.212000 2.767685 -0.147632 +v -1.399606 2.966957 -0.560073 +v -1.090389 2.611255 -0.147284 +v -1.360890 2.898578 -0.741966 +v -0.960314 2.476244 -0.098991 +v -1.339889 2.879422 -0.933465 +v -0.891679 2.406564 -0.060263 +v -1.336698 2.879256 -1.038611 +v -0.745627 2.212541 -0.241163 +v -1.177557 2.671331 -1.190736 +v -0.732691 2.100922 -0.452943 +v -1.068637 2.457758 -1.191501 +v -0.757809 2.047868 -0.612212 +v -1.002133 2.307385 -1.149344 +v -1.273110 3.145569 -0.234288 +v -1.153740 3.325022 -0.201881 +v -0.334023 2.393714 -1.024708 +v -0.582748 1.913974 -1.143360 +v -0.457002 1.361987 -1.467252 +v -0.487555 1.553064 -1.361035 +v -0.588716 1.776543 -1.207045 +v -0.612514 1.866770 -1.152626 +v -0.617469 2.341603 -0.168024 +v -1.093029 2.846735 -1.213514 +v -0.611816 2.446509 -0.113003 +v -1.091738 2.956275 -1.168084 +v -0.439384 2.527561 -0.228260 +v -0.871314 2.986350 -1.177834 +v -0.492429 2.851687 -0.323834 +v -0.749842 3.125107 -0.889742 +v -0.523344 2.111585 -0.425588 +v -0.933459 2.547203 -1.327203 +v -0.423218 2.144657 -0.579490 +v -0.754801 2.496859 -1.308455 +v -0.349925 2.311538 -0.490754 +v -0.707685 2.691545 -1.277269 +v -0.362443 2.523533 -0.652031 +v -0.550049 2.722805 -1.064472 +v -0.664730 1.886292 -0.912214 +v -0.795618 2.025320 -1.199964 +v -0.585531 1.884982 -0.997226 +v -0.685878 1.991569 -1.217834 +v -0.468439 1.543551 -1.118744 +v -0.629868 1.715017 -1.473635 +v -0.583004 1.748407 -1.002193 +v -0.722618 1.896702 -1.309126 +v -0.367813 1.339558 -1.228537 +v -0.551057 1.534196 -1.631386 +v -0.480792 1.548404 -1.242025 +v -0.559325 1.631820 -1.414675 +v -0.585708 1.757794 -1.106950 +v -0.655515 1.831942 -1.260416 +v -0.415816 1.348648 -1.347370 +v -0.507438 1.445967 -1.548795 +v -0.712736 1.949685 -0.873565 +v -0.834898 2.079444 -1.142131 +v -0.757951 1.992038 -0.839442 +v -0.875751 2.117162 -1.098417 +v -0.799758 2.036515 -0.805844 +v -0.913195 2.157006 -1.055227 +v -0.547038 1.922917 -0.968776 +v -0.664837 2.048041 -1.227751 +v -0.372690 2.086641 -0.892994 +v -0.538481 2.262742 -1.257477 +v -0.318265 2.299067 -0.773670 +v -0.510234 2.502973 -1.195702 +v -0.838580 3.164929 -0.021945 +v -1.091630 3.433715 -0.578261 +v -1.004634 3.137847 0.040503 +v -1.257684 3.406633 -0.515813 +v -1.100446 2.982626 0.009089 +v -1.353496 3.251411 -0.547227 +v -1.027541 2.623250 -0.190799 +v -1.284954 2.896670 -0.756706 +v -0.856772 2.461409 -0.111811 +v -1.262525 2.892393 -1.003835 +v -0.881366 2.547506 -0.141917 +v -1.234764 2.922879 -0.918841 +v -0.899144 2.838377 0.013612 +v -1.256904 3.218384 -0.772903 +v -0.819361 2.642651 0.020909 +v -1.264380 3.115343 -0.957440 +v -0.739680 2.759166 0.040959 +v -1.184699 3.231858 -0.937390 +v -0.812341 2.949780 0.027953 +v -1.170102 3.329787 -0.758563 +v -0.669845 2.952630 -0.035487 +v -1.027605 3.332637 -0.822003 +v -0.596879 2.752655 -0.027143 +v -1.041898 3.225347 -1.005491 +v -0.447950 2.672162 -0.292651 +v -0.792621 3.038267 -1.050392 +v -0.357275 2.418694 -0.573790 +v -0.627776 2.706017 -1.168473 +v -0.558261 2.507820 -0.142278 +v -1.016369 2.994415 -1.149402 +v -0.589646 2.071870 -0.704738 +v -0.816518 2.312850 -1.203503 +v -0.415160 2.140931 -0.730015 +v -0.655121 2.395814 -1.257556 +v -0.562122 2.567832 -0.049359 +v -1.059496 3.096135 -1.142807 +v -0.382662 2.066267 -0.476936 +v -0.814592 2.525057 -1.426510 +v -0.238429 2.078905 -0.301578 +v -0.818699 2.695258 -1.577268 +v -0.200748 2.179429 -0.056013 +v -0.916269 2.939444 -1.629044 +v -0.310763 2.402503 0.163977 +v -1.065550 3.204226 -1.495379 +v -0.432595 2.610945 0.216489 +v -1.121938 3.343154 -1.298992 +v -0.524366 2.614817 0.073598 +v -1.095910 3.221902 -1.182909 +v -0.507070 2.552866 0.028891 +v -1.074251 3.155317 -1.218024 +v -0.425903 2.551218 0.143142 +v -1.089068 3.255622 -1.314789 +v -0.326725 2.394795 0.091530 +v -1.033520 3.145542 -1.462318 +v -0.241746 2.215620 -0.082047 +v -0.918001 2.933927 -1.568753 +v -0.280540 2.132744 -0.263318 +v -0.856447 2.744463 -1.529416 +v -0.397399 2.117304 -0.397221 +v -0.859870 2.608533 -1.413936 +v -0.537936 2.510894 -0.060239 +v -1.052762 3.057734 -1.192055 +v -0.474722 2.472404 -0.086867 +v -1.002637 3.033147 -1.247457 +v -0.370319 2.165749 -0.337779 +v -0.863330 2.689418 -1.421636 +v -0.269653 2.183606 -0.236788 +v -0.849923 2.799959 -1.512478 +v -0.238673 2.247667 -0.088684 +v -0.901838 2.952071 -1.546615 +v -0.299842 2.378502 0.043799 +v -0.989186 3.110711 -1.471682 +v -0.372684 2.496230 0.078552 +v -1.027124 3.191366 -1.360196 +v -0.440793 2.504537 -0.017698 +v -1.012337 3.111622 -1.274205 +v -0.529743 2.466809 -0.154342 +v -1.000940 2.967307 -1.190241 +v -0.448961 2.377569 -0.241112 +v -0.915794 2.873432 -1.267419 +v -0.433646 2.328372 -0.340924 +v -0.856851 2.777892 -1.271314 +v -0.412482 2.302598 -0.307743 +v -0.870589 2.789192 -1.314866 +v -0.372521 2.230515 -0.340024 +v -0.843717 2.731012 -1.375922 +v -0.366395 2.210836 -0.379949 +v -0.820140 2.692796 -1.377481 +v -0.486445 2.195563 -0.408705 +v -0.892197 2.626546 -1.300729 +v -0.433174 2.203787 -0.435871 +v -0.834563 2.630136 -1.318303 +v -0.456059 2.265930 -0.395436 +v -0.857449 2.692280 -1.277868 +v -0.501990 2.401106 -0.240156 +v -0.947009 2.873798 -1.218505 +v -0.470516 2.424356 -0.160348 +v -0.967890 2.952659 -1.253797 +v -0.442941 2.431990 -0.169203 +v -0.940315 2.960293 -1.262651 +v -0.345942 2.223582 -0.383093 +v -0.799687 2.705543 -1.380625 +v -0.349887 2.240944 -0.338373 +v -0.825446 2.746076 -1.383863 +v -0.386135 2.305790 -0.311277 +v -0.848605 2.797019 -1.327992 +v -0.411012 2.338801 -0.339273 +v -0.838579 2.792956 -1.279255 +v -0.426327 2.387998 -0.239461 +v -0.897523 2.888496 -1.275359 +v -0.405143 2.500300 -0.022146 +v -0.985413 3.116654 -1.297836 +v -0.340443 2.489869 0.074628 +v -1.003608 3.194273 -1.383303 +v -0.269133 2.377060 0.049856 +v -0.971565 3.123172 -1.494400 +v -0.211372 2.244101 -0.082102 +v -0.887626 2.962408 -1.568809 +v -0.243610 2.196160 -0.235661 +v -0.828243 2.817148 -1.520943 +v -0.350171 2.187857 -0.336262 +v -0.843182 2.711526 -1.420119 +v -0.441254 2.470485 -0.096110 +v -0.973531 3.035861 -1.266292 +v -0.380126 2.318325 -0.252693 +v -0.877500 2.846628 -1.346141 +v -0.341351 2.263126 -0.255554 +v -0.864902 2.819234 -1.406553 +v -0.339967 2.310981 -0.177801 +v -0.898423 2.904164 -1.405533 +v -0.379970 2.361739 -0.169620 +v -0.916610 2.931750 -1.349393 +v -0.384176 2.409787 -0.096138 +v -0.951358 3.012238 -1.343053 +v -0.347583 2.356905 -0.103795 +v -0.936579 2.982527 -1.398669 +v -0.340043 2.364520 -0.055192 +v -0.959579 3.022582 -1.417207 +v -0.376290 2.429367 -0.028097 +v -0.982738 3.073525 -1.361337 +v -0.430808 2.625371 0.036141 +v -1.002352 3.232455 -1.220366 +v -0.355127 2.604117 0.191768 +v -1.053196 3.345595 -1.342896 +v -0.261174 2.397403 0.152772 +v -1.024687 3.208394 -1.525768 +v -0.147708 2.197778 -0.043643 +v -0.880681 2.976330 -1.655041 +v -0.174271 2.137992 -0.302213 +v -0.754541 2.754345 -1.577903 +v -0.297097 2.131342 -0.470600 +v -0.737753 2.599400 -1.439357 +v -0.494943 2.595754 -0.094056 +v -0.974865 3.105520 -1.149138 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn -0.4587 -0.7293 0.5076 +vn -0.8701 -0.2924 -0.3968 +vn -0.1637 -0.7591 0.6300 +vn -0.7462 -0.1403 -0.6507 +vn -0.2155 -0.9569 0.1945 +vn -0.5685 -0.5820 -0.5815 +vn -0.5649 -0.7917 0.2324 +vn -0.7910 -0.5516 -0.2647 +vn -0.7347 -0.6750 -0.0683 +vn -0.6865 -0.7262 0.0377 +vn -0.5355 -0.7044 -0.4660 +vn -0.3022 -0.9521 0.0467 +vn -0.7793 -0.2200 -0.5868 +vn -0.2519 -0.7802 0.5726 +vn -0.8840 -0.4104 -0.2238 +vn -0.6139 -0.6973 0.3699 +vn -0.9516 -0.2756 -0.1357 +vn -0.6767 -0.5677 0.4689 +vn -0.9206 0.0390 -0.3886 +vn -0.3988 -0.5152 0.7586 +vn -0.9831 0.0884 0.1606 +vn -0.7751 -0.1325 0.6178 +vn -0.9427 -0.2600 0.2092 +vn -0.8833 -0.3230 0.3397 +vn -0.7539 -0.3997 0.5214 +vn -0.9886 -0.1504 0.0054 +vn -0.6503 -0.2024 0.7322 +vn -0.9877 0.1560 -0.0095 +vn -0.2994 -0.5133 0.8043 +vn -0.8780 0.1013 -0.4678 +vn -0.5276 -0.5843 0.6166 +vn -0.9438 -0.1423 -0.2983 +vn 0.7522 0.1674 0.6374 +vn 0.1846 0.7703 -0.6104 +vn 0.5696 0.7373 0.3632 +vn 0.4016 0.9158 -0.0063 +vn 0.2331 0.9506 -0.2051 +vn 0.5857 0.5760 0.5702 +vn 0.1588 0.7663 -0.6226 +vn 0.7402 0.1487 0.6557 +vn 0.3067 0.4847 -0.8191 +vn 0.8839 -0.1284 0.4498 +vn 0.6281 0.1806 -0.7569 +vn 0.9808 -0.1941 0.0185 +vn 0.9770 -0.0567 -0.2057 +vn 0.8089 0.1218 -0.5752 +vn 0.8963 -0.1073 0.4302 +vn 0.3343 0.4897 -0.8053 +vn -0.6820 -0.6400 0.3540 +vn -0.9049 -0.4032 -0.1362 +vn -0.7031 -0.6572 0.2715 +vn -0.8731 -0.4766 -0.1023 +vn -0.7813 -0.6076 0.1429 +vn -0.8325 -0.5532 0.0303 +vn -0.8527 -0.5152 0.0862 +vn -0.8194 -0.5506 0.1595 +vn -0.8615 -0.4980 0.0985 +vn -0.8282 -0.5334 0.1717 +vn -0.8385 -0.4950 0.2276 +vn -0.8924 -0.4378 0.1091 +vn -0.7622 -0.5451 0.3491 +vn -0.9301 -0.3668 -0.0199 +vn -0.7022 -0.6007 0.3822 +vn -0.9252 -0.3639 -0.1080 +vn -0.3925 -0.9148 -0.0950 +vn -0.4989 -0.8018 -0.3289 +vn -0.3037 -0.9527 -0.0138 +vn -0.4984 -0.7458 -0.4419 +vn -0.4084 -0.8167 0.4077 +vn -0.7978 -0.4030 -0.4484 +vn -0.3863 -0.6792 0.6240 +vn -0.8768 -0.1583 -0.4541 +vn -0.3960 -0.6247 0.6731 +vn -0.8979 -0.0915 -0.4305 +vn -0.2864 -0.9522 0.1059 +vn -0.5616 -0.6599 -0.4991 +vn -0.4398 -0.8725 0.2127 +vn -0.7141 -0.5812 -0.3902 +vn -0.3128 -0.8124 0.4922 +vn -0.7817 -0.3143 -0.5387 +vn -0.3902 -0.7887 0.4751 +vn -0.8188 -0.3334 -0.4673 +vn -0.6365 -0.5034 0.5844 +vn -0.9763 -0.1424 -0.1628 +vn -0.6197 -0.3296 0.7123 +vn -0.9921 0.0660 -0.1064 +vn -0.5549 -0.4225 0.7166 +vn -0.9770 0.0259 -0.2114 +vn -0.9369 -0.2153 0.2755 +vn -0.9075 -0.2466 0.3402 +vn -0.9405 -0.0183 -0.3394 +vn -0.4615 -0.5270 0.7136 +vn -0.9809 0.0439 -0.1897 +vn -0.5659 -0.3969 0.7227 +vn -0.4960 -0.7817 0.3782 +vn -0.8309 -0.4259 -0.3581 +vn -0.6564 -0.7392 0.1506 +vn -0.7885 -0.5989 -0.1398 +vn -0.7376 -0.6720 -0.0659 +vn -0.6891 -0.7235 0.0406 +vn -0.6822 -0.7204 -0.1248 +vn -0.6273 -0.7788 -0.0039 +vn -0.6867 -0.7269 0.0062 +vn -0.7152 -0.6967 -0.0563 +vn -0.7070 -0.6631 0.2460 +vn -0.8616 -0.4989 -0.0938 +vn -0.6659 -0.6758 0.3160 +vn -0.8804 -0.4479 -0.1555 +vn -0.6615 -0.7015 0.2651 +vn -0.8530 -0.4981 -0.1559 +vn -0.7146 -0.5951 0.3678 +vn -0.9232 -0.3735 -0.0908 +vn -0.9139 -0.3912 0.1084 +vn -0.8392 -0.4705 0.2727 +vn -0.5781 -0.7687 0.2735 +vn -0.8194 -0.5125 -0.2569 +vn -0.7362 -0.6518 0.1823 +vn -0.8387 -0.5429 -0.0431 +vn -0.8039 -0.5879 0.0902 +vn -0.8093 -0.5822 0.0783 +vn -0.6065 -0.7946 -0.0293 +vn -0.6562 -0.7417 -0.1386 +vn -0.6276 -0.7722 0.0988 +vn -0.7454 -0.6472 -0.1601 +vn -0.6758 -0.6911 0.2562 +vn -0.8544 -0.5014 -0.1364 +vn -0.7326 -0.6090 0.3041 +vn -0.9000 -0.4311 -0.0640 +vn -0.7039 -0.6470 0.2933 +vn -0.8843 -0.4553 -0.1034 +vn -0.8542 -0.5023 0.1343 +vn -0.8469 -0.5101 0.1504 +vn -0.8313 -0.5442 0.1130 +vn -0.8299 -0.5457 0.1160 +vn -0.8415 -0.5245 0.1294 +vn 0.5566 -0.6227 0.5500 +vn -0.1407 0.1180 -0.9830 +vn 0.5598 -0.1189 0.8200 +vn -0.1552 0.6407 -0.7520 +vn 0.3940 0.8482 0.3540 +vn 0.3161 0.9310 0.1826 +vn -0.7758 0.2859 -0.5625 +vn -0.1104 -0.4209 0.9004 +vn 0.1295 -0.9806 0.1470 +vn -0.2997 -0.5246 -0.7968 +vn -0.5737 -0.8019 0.1665 +vn -0.7588 -0.6054 -0.2403 +vn -0.9431 0.1934 -0.2705 +vn -0.4422 -0.3386 0.8305 +vn -0.8773 -0.1420 0.4585 +vn -0.9582 -0.0560 0.2807 +vn -0.4197 -0.5361 0.7324 +vn -0.9253 0.0010 -0.3792 +vn -0.3827 -0.9018 0.2007 +vn -0.6747 -0.5917 -0.4412 +vn -0.8625 -0.4604 0.2099 +vn -0.8878 -0.4336 0.1544 +vn -0.7480 -0.6618 0.0509 +vn -0.7672 -0.6414 0.0087 +vn -0.8897 -0.4124 -0.1957 +vn -0.6364 -0.6815 0.3613 +vn -0.7980 -0.5894 -0.1255 +vn -0.6694 -0.7261 0.1573 +vn -0.6501 -0.6687 0.3610 +vn -0.8953 -0.4081 -0.1783 +vn -0.7474 -0.5830 0.3186 +vn -0.9118 -0.4084 -0.0429 +vn -0.3280 -0.5162 0.7912 +vn -0.8910 0.0818 -0.4466 +vn -0.2042 -0.5105 0.8353 +vn -0.8289 0.1531 -0.5381 +vn -0.0452 -0.5143 0.8564 +vn -0.7301 0.2132 -0.6492 +vn -0.5613 -0.8218 0.0977 +vn -0.7125 -0.6612 -0.2348 +vn -0.8422 -0.5391 -0.0102 +vn -0.7583 -0.6282 0.1742 +vn -0.8819 -0.4675 -0.0611 +vn -0.7326 -0.6260 0.2671 +vn -0.8952 -0.4306 0.1152 +vn -0.8422 -0.4869 0.2318 +vn -0.8566 0.4075 0.3165 +vn -0.6860 0.2263 0.6915 +vn -0.7008 0.5964 -0.3913 +vn -0.0703 -0.0733 0.9948 +vn -0.3790 0.4026 -0.8332 +vn 0.3790 -0.4026 0.8332 +vn 0.2889 -0.9565 -0.0409 +vn -0.0602 -0.5858 -0.8082 +vn -0.7759 -0.6263 0.0765 +vn -0.7924 -0.6087 0.0402 +vn -0.7293 -0.6722 0.1280 +vn -0.8057 -0.5909 -0.0401 +vn -0.8657 -0.4125 -0.2837 +vn -0.5637 -0.7333 0.3802 +vn -0.9070 -0.4037 -0.1201 +vn -0.6937 -0.6302 0.3487 +vn -0.8945 -0.4470 0.0129 +vn -0.7820 -0.5664 0.2601 +vn -0.7918 -0.4202 -0.4433 +vn -0.4126 -0.8230 0.3904 +vn -0.6308 -0.7408 -0.2309 +vn -0.5298 -0.8481 -0.0089 +vn -0.4681 -0.8493 0.2440 +vn -0.7469 -0.5532 -0.3689 +vn -0.4506 -0.7970 0.4022 +vn -0.8184 -0.4063 -0.4064 +vn -0.5727 -0.6807 0.4568 +vn -0.9044 -0.3283 -0.2724 +vn -0.6069 -0.6066 0.5135 +vn -0.9420 -0.2506 -0.2232 +vn -0.6688 -0.3954 0.6295 +vn -0.9950 -0.0490 -0.0875 +vn -0.8115 -0.3367 0.4776 +vn -0.9828 -0.1547 0.1011 +vn -0.8395 -0.4419 0.3161 +vn -0.9328 -0.3428 0.1110 +vn -0.8829 -0.4355 0.1757 +vn -0.8731 -0.4459 0.1972 +vn -0.6239 -0.7464 0.2317 +vn -0.8188 -0.5394 -0.1967 +vn -0.6942 -0.6797 0.2371 +vn -0.8519 -0.5121 -0.1096 +vn -0.7177 -0.6464 -0.2590 +vn -0.5452 -0.8297 0.1202 +vn -0.4978 -0.8405 -0.2139 +vn -0.4762 -0.8635 -0.1663 +vn -0.8609 -0.4835 -0.1585 +vn -0.6610 -0.6958 0.2810 +vn -0.9087 -0.4074 -0.0909 +vn -0.7146 -0.6137 0.3359 +vn -0.9388 -0.3075 0.1554 +vn -0.8610 -0.3901 0.3263 +vn -0.9303 -0.2522 0.2664 +vn -0.9082 -0.2756 0.3148 +vn -0.7551 -0.3708 0.5406 +vn -0.9928 -0.1184 0.0181 +vn -0.6606 -0.4166 0.6246 +vn -0.9924 -0.0641 -0.1049 +vn -0.3981 -0.7780 0.4859 +vn -0.8281 -0.3213 -0.4593 +vn -0.3109 -0.6833 0.6607 +vn -0.8474 -0.1134 -0.5188 +vn -0.3919 -0.6134 0.6857 +vn -0.8996 -0.0742 -0.4305 +vn -0.1165 0.9516 -0.2845 +vn 0.3870 0.4167 0.8225 +vn 0.0375 0.7656 -0.6422 +vn 0.6660 0.0981 0.7395 +vn 0.2688 0.9632 -0.0061 +vn 0.4894 0.7289 0.4788 +vn 0.4846 0.3751 0.7902 +vn -0.0393 0.9315 -0.3615 +vn 0.4002 0.6119 0.6822 +vn 0.0411 0.9934 -0.1073 +vn 0.3265 0.6916 0.6442 +vn 0.0369 0.9993 0.0074 +vn 0.7990 0.0783 0.5963 +vn 0.2167 0.6968 -0.6838 +vn 0.9627 -0.2296 0.1432 +vn 0.5256 0.2347 -0.8178 +vn 0.9751 -0.2206 -0.0233 +vn 0.6423 0.1329 -0.7548 +vn 0.9748 0.1920 -0.1140 +vn 0.8253 0.3507 -0.4426 +vn 0.9043 0.4270 0.0053 +vn 0.7714 0.5681 -0.2868 +vn 0.9342 0.3169 -0.1636 +vn 0.8659 0.3895 -0.3139 +vn 0.6916 -0.6085 -0.3891 +vn 0.5530 -0.4612 -0.6939 +vn 0.8008 -0.4653 -0.3773 +vn 0.6670 -0.3232 -0.6713 +vn 0.6749 -0.1741 0.7171 +vn -0.0251 0.5694 -0.8217 +vn 0.6738 -0.0581 0.7367 +vn -0.0028 0.6606 -0.7508 +vn 0.8762 0.4811 -0.0278 +vn 0.7889 0.5739 -0.2198 +vn 0.8686 0.4576 -0.1902 +vn 0.8788 0.4467 -0.1677 +vn 0.9274 0.0036 0.3740 +vn 0.4258 0.5363 -0.7287 +vn 0.7132 -0.0324 0.7002 +vn 0.0562 0.6655 -0.7443 +vn 0.5194 -0.0905 0.8497 +vn -0.1941 0.6674 -0.7190 +vn 0.5516 -0.0429 0.8330 +vn -0.1461 0.6982 -0.7008 +vn 0.3651 -0.1906 0.9113 +vn -0.3735 0.5939 -0.7126 +vn 0.9518 -0.1639 -0.2592 +vn 0.7921 0.0058 -0.6104 +vn 0.9816 0.1910 0.0083 +vn 0.7526 0.4342 -0.4951 +vn 0.9801 -0.1684 -0.1048 +vn 0.7134 0.1150 -0.6913 +vn 0.7262 -0.6718 -0.1459 +vn 0.4047 -0.3304 -0.8527 +vn 0.7978 -0.5941 -0.1027 +vn 0.4521 -0.2270 -0.8626 +vn 0.4966 -0.4463 0.7444 +vn -0.2524 0.3493 -0.9024 +vn 0.1448 -0.7840 0.6037 +vn -0.5173 -0.0807 -0.8520 +vn 0.9282 0.3677 0.0576 +vn 0.7373 0.5704 -0.3620 +vn -0.6764 0.3072 0.6694 +vn -0.8111 0.4504 0.3732 +vn 0.0706 0.8034 0.5912 +vn -0.0780 0.9612 0.2647 +vn 0.7538 0.5820 0.3050 +vn 0.5222 0.8280 -0.2042 +vn 0.1755 0.4839 0.8574 +vn -0.2688 0.9558 -0.1193 +vn -0.8466 -0.2513 0.4692 +vn -0.9764 -0.1134 0.1838 +vn -0.1779 -0.0185 0.9839 +vn -0.7539 0.5933 -0.2823 +vn 0.4122 0.2022 0.8884 +vn -0.2056 0.8585 -0.4698 +vn 0.8695 0.2901 0.3998 +vn 0.4557 0.7296 -0.5099 +vn 0.8187 0.4609 0.3424 +vn 0.5079 0.7911 -0.3409 +vn 0.3446 0.2518 0.9044 +vn -0.2488 0.8820 -0.4001 +vn -0.0781 -0.1164 0.9901 +vn -0.7166 0.5617 -0.4135 +vn -0.4218 -0.4795 0.7695 +vn -0.9330 0.0635 -0.3542 +vn 0.1541 0.5731 0.8048 +vn -0.2236 0.9743 -0.0256 +vn -0.8283 -0.3532 0.4348 +vn -0.9728 -0.1998 0.1172 +vn 0.7707 0.6027 -0.2066 +vn 0.8637 0.5040 -0.0022 +vn -0.8524 0.1182 0.5093 +vn -0.8932 0.1614 0.4198 +vn -0.9077 -0.4131 0.0739 +vn -0.8197 -0.5066 0.2674 +vn 0.2711 -0.3458 0.8983 +vn -0.4797 0.4516 -0.7523 +vn -0.0291 -0.5453 0.8378 +vn -0.7163 0.1846 -0.6730 +vn 0.4104 -0.2622 0.8734 +vn -0.3391 0.5340 -0.7745 +vn 0.4947 -0.3047 0.8139 +vn -0.2545 0.4910 -0.8331 +vn 0.4476 -0.7696 0.4555 +vn -0.2035 -0.0780 -0.9760 +vn 0.3729 -0.9269 0.0432 +vn -0.0444 -0.4837 -0.8741 +vn 0.1209 -0.9760 0.1813 +vn -0.3262 -0.5011 -0.8016 +vn 0.1402 -0.9187 0.3693 +vn -0.4137 -0.3304 -0.8484 +vn 0.1524 -0.8501 0.5041 +vn -0.4693 -0.1898 -0.8624 +vn -0.6436 -0.7432 0.1830 +vn -0.8011 -0.5759 -0.1632 +vn 0.9699 0.1657 0.1783 +vn 0.6292 0.5276 -0.5707 +vn 0.9653 0.2216 0.1380 +vn 0.6684 0.5370 -0.5146 +vn 0.9679 -0.2308 -0.0993 +vn 0.6821 0.0727 -0.7276 +vn 0.8316 -0.4045 0.3806 +vn 0.2289 0.2357 -0.9445 +vn 0.9847 0.1327 0.1128 +vn 0.6711 0.4658 -0.5768 +vn -0.7605 -0.4732 0.4446 +vn -0.9672 -0.2537 -0.0099 +vn -0.6866 -0.5715 0.4495 +vn -0.9476 -0.2942 -0.1244 +vn -0.7730 -0.5556 0.3061 +vn -0.9139 -0.4060 -0.0035 +vn -0.7480 -0.6126 0.2555 +vn -0.8814 -0.4709 -0.0378 +vn -0.6473 -0.6513 0.3958 +vn -0.9102 -0.3722 -0.1819 +vn -0.4588 -0.7623 0.4565 +vn -0.8480 -0.3489 -0.3990 +vn -0.6717 -0.3211 0.6676 +vn -0.9984 0.0259 -0.0506 +vn -0.9802 0.1290 0.1501 +vn -0.7540 -0.1112 0.6474 +vn -0.8808 0.0497 -0.4709 +vn -0.3151 -0.5511 0.7726 +vn -0.8426 -0.4242 -0.3317 +vn -0.5205 -0.7664 0.3765 +vn -0.4601 -0.8404 0.2865 +vn -0.7653 -0.5162 -0.3846 +vn -0.2716 -0.8242 0.4970 +vn -0.7590 -0.3065 -0.5745 +vn 0.6694 -0.6068 0.4287 +vn 0.0211 0.0817 -0.9964 +vn -0.9283 -0.3639 0.0769 +vn -0.8212 -0.4776 0.3123 +vn 0.6899 -0.3880 0.6111 +vn -0.0126 0.3582 -0.9335 +vn -0.8349 -0.5021 0.2256 +vn -0.8907 -0.4427 0.1028 +vn -0.8019 0.1595 0.5757 +vn -0.8865 0.2493 0.3898 +vn -0.5115 -0.6876 0.5154 +vn -0.8999 -0.2750 -0.3385 +vn -0.7158 -0.4421 0.5406 +vn -0.9865 -0.1546 -0.0546 +vn 0.0018 -0.8103 0.5861 +vn -0.6162 -0.1539 -0.7724 +vn -0.4439 -0.7981 0.4075 +vn -0.8173 -0.4014 -0.4134 +vn -0.4234 -0.8067 0.4122 +vn -0.8083 -0.3979 -0.4339 +vn 0.4885 -0.4357 0.7559 +vn -0.2623 0.3617 -0.8946 +vn 0.6035 -0.4778 0.6383 +vn -0.1188 0.2895 -0.9498 +vn 0.4676 -0.3546 0.8097 +vn -0.2863 0.4462 -0.8479 +vn 0.2261 -0.8371 0.4981 +vn -0.4090 -0.1626 -0.8979 +vn 0.3519 -0.7603 0.5460 +vn -0.3261 -0.0402 -0.9445 +vn 0.3445 -0.8200 0.4570 +vn -0.2934 -0.1425 -0.9453 +vn -0.1529 0.6526 0.7421 +vn -0.3786 0.8923 0.2460 +vn 0.1286 -0.3334 0.9340 +vn -0.6000 0.4405 -0.6678 +vn 0.4443 -0.8001 0.4030 +vn -0.1820 -0.1348 -0.9740 +vn -0.5355 0.6491 0.5403 +vn -0.5249 0.6377 0.5638 +vn -0.0028 -0.9172 0.3984 +vn -0.5335 -0.3535 -0.7684 +vn -0.1531 -0.9882 0.0094 +vn -0.4166 -0.7083 -0.5699 +vn 0.0682 0.2892 -0.9548 +vn 0.7399 -0.4243 0.5219 +vn 0.2039 0.7374 -0.6439 +vn 0.7771 0.1287 0.6161 +vn -0.1112 0.9390 -0.3253 +vn 0.4128 0.3825 0.8266 +vn -0.5463 0.6921 0.4718 +vn -0.4762 0.6175 0.6260 +vn -0.8019 -0.5558 0.2189 +vn -0.8795 -0.4735 0.0486 +vn -0.7379 -0.5839 0.3384 +vn -0.9179 -0.3928 -0.0572 +vn -0.7381 -0.5943 0.3195 +vn -0.9092 -0.4125 -0.0567 +vn -0.7938 -0.5607 0.2357 +vn -0.8857 -0.4631 0.0336 +vn -0.7545 -0.5112 0.4116 +vn -0.9537 -0.2996 -0.0264 +vn -0.6869 -0.6309 0.3607 +vn -0.9099 -0.3940 -0.1296 +vn -0.7470 -0.6089 0.2669 +vn -0.8868 -0.4604 -0.0404 +vn -0.8220 -0.5453 0.1643 +vn -0.8560 -0.5092 0.0895 +vn -0.9994 0.0067 0.0339 +vn -0.7316 -0.2777 0.6225 +vn -0.5490 -0.6425 0.5346 +vn -0.9250 -0.2431 -0.2920 +vn -0.6253 -0.6952 0.3544 +vn -0.8817 -0.4229 -0.2092 +vn -0.5838 -0.7113 0.3914 +vn -0.8804 -0.3963 -0.2605 +vn -0.6503 -0.5475 0.5266 +vn -0.9632 -0.2152 -0.1612 +vn -0.7921 -0.3633 0.4904 +vn -0.9852 -0.1583 0.0660 +vn 0.5890 -0.6911 -0.4189 +vn 0.4735 -0.5683 -0.6729 +vn 0.5269 -0.8271 0.1959 +vn -0.0006 -0.2668 -0.9638 +vn 0.0792 -0.6780 0.7308 +vn -0.6120 0.0562 -0.7889 +vn 0.2649 -0.0742 0.9614 +vn -0.4411 0.6757 -0.5907 +vn 0.0073 0.9968 0.0798 +vn 0.2590 0.7295 0.6331 +vn -0.3066 0.9382 -0.1605 +vn 0.1692 0.4329 0.8854 +vn 0.6138 0.6401 -0.4621 +vn 0.9246 0.3099 0.2213 +vn 0.7862 0.5666 -0.2468 +vn 0.8891 0.4573 -0.0206 +vn 0.9116 0.3897 0.1305 +vn 0.6862 0.6292 -0.3651 +vn -0.5345 0.6685 -0.5172 +vn 0.1497 -0.0583 0.9870 +vn 0.9555 0.2305 0.1842 +vn 0.6350 0.5709 -0.5204 +vn 0.6403 -0.1281 -0.7573 +vn 0.8956 -0.3993 -0.1961 +s off +f 554/557/500 508/558/500 510/559/500 552/560/500 +f 511/561/501 509/562/501 555/563/501 553/564/501 +f 552/560/502 510/559/502 512/565/502 550/566/502 +f 513/567/503 511/561/503 553/564/503 551/568/503 +f 510/559/504 516/569/504 514/570/504 512/565/504 +f 515/571/505 517/572/505 511/561/505 513/567/505 +f 508/558/506 518/573/506 516/569/506 510/559/506 +f 517/572/507 519/574/507 509/562/507 511/561/507 +f 518/573/508 520/575/508 522/576/508 516/569/508 +f 523/577/509 521/578/509 519/574/509 517/572/509 +f 516/569/510 522/576/510 524/579/510 514/570/510 +f 525/580/511 523/577/511 517/572/511 515/571/511 +f 522/576/512 528/581/512 526/582/512 524/579/512 +f 527/583/513 529/584/513 523/577/513 525/580/513 +f 520/575/514 530/585/514 528/581/514 522/576/514 +f 529/584/515 531/586/515 521/578/515 523/577/515 +f 530/585/516 532/587/516 534/588/516 528/581/516 +f 535/589/517 533/590/517 531/586/517 529/584/517 +f 528/581/518 534/588/518 536/591/518 526/582/518 +f 537/592/519 535/589/519 529/584/519 527/583/519 +f 534/588/520 540/593/520 538/594/520 536/591/520 +f 539/595/521 541/596/521 535/589/521 537/592/521 +f 532/587/522 542/597/522 540/593/522 534/588/522 +f 541/596/523 543/598/523 533/590/523 535/589/523 +f 542/597/524 544/599/524 546/600/524 540/593/524 +f 547/601/525 545/602/525 543/598/525 541/596/525 +f 540/593/526 546/600/526 548/603/526 538/594/526 +f 549/604/527 547/601/527 541/596/527 539/595/527 +f 546/600/528 552/560/528 550/566/528 548/603/528 +f 551/568/529 553/564/529 547/601/529 549/604/529 +f 544/599/530 554/557/530 552/560/530 546/600/530 +f 553/564/531 555/563/531 545/602/531 547/601/531 +f 554/557/532 544/599/532 558/605/532 556/606/532 +f 559/607/533 545/602/533 555/563/533 557/608/533 +f 544/599/534 542/597/534 560/609/534 558/605/534 +f 561/610/535 543/598/535 545/602/535 559/607/535 +f 542/597/536 532/587/536 562/611/536 560/609/536 +f 563/612/537 533/590/537 543/598/537 561/610/537 +f 532/587/538 530/585/538 564/613/538 562/611/538 +f 565/614/539 531/586/539 533/590/539 563/612/539 +f 530/585/540 520/575/540 566/615/540 564/613/540 +f 567/616/541 521/578/541 531/586/541 565/614/541 +f 520/575/542 518/573/542 570/617/542 566/615/542 +f 571/618/543 519/574/543 521/578/543 567/616/543 +f 518/573/544 508/558/544 572/619/544 570/617/544 +f 573/620/545 509/562/545 519/574/545 571/618/545 +f 508/558/546 554/557/546 556/606/546 572/619/546 +f 557/608/547 555/563/547 509/562/547 573/620/547 +f 568/621/548 572/619/548 556/606/548 +f 557/608/549 573/620/549 569/622/549 +f 570/617/550 572/619/550 568/621/550 +f 569/622/551 573/620/551 571/618/551 +f 568/621/552 566/615/552 570/617/552 +f 571/618/553 567/616/553 569/622/553 +f 568/621/554 564/613/554 566/615/554 +f 567/616/555 565/614/555 569/622/555 +f 568/621/556 562/611/556 564/613/556 +f 565/614/557 563/612/557 569/622/557 +f 568/621/558 560/609/558 562/611/558 +f 563/612/559 561/610/559 569/622/559 +f 568/621/560 558/605/560 560/609/560 +f 561/610/561 559/607/561 569/622/561 +f 568/621/562 556/606/562 558/605/562 +f 559/607/563 557/608/563 569/622/563 +f 596/623/564 681/624/564 683/625/564 598/626/564 +f 683/625/565 682/627/565 597/628/565 598/626/565 +f 594/629/566 679/630/566 681/624/566 596/623/566 +f 682/627/567 680/631/567 595/632/567 597/628/567 +f 592/633/568 677/634/568 679/630/568 594/629/568 +f 680/631/569 678/635/569 593/636/569 595/632/569 +f 590/637/570 675/638/570 677/634/570 592/633/570 +f 678/635/571 676/639/571 591/640/571 593/636/571 +f 588/641/572 673/642/572 675/638/572 590/637/572 +f 676/639/573 674/643/573 589/644/573 591/640/573 +f 586/645/574 599/646/574 653/647/574 671/648/574 +f 654/649/575 600/650/575 587/651/575 672/652/575 +f 599/646/576 601/653/576 655/654/576 653/647/576 +f 656/655/577 602/656/577 600/650/577 654/649/577 +f 601/653/578 603/657/578 657/658/578 655/654/578 +f 658/659/579 604/660/579 602/656/579 656/655/579 +f 603/657/580 605/661/580 659/662/580 657/658/580 +f 660/663/581 606/664/581 604/660/581 658/659/581 +f 605/661/582 607/665/582 661/666/582 659/662/582 +f 662/667/583 608/668/583 606/664/583 660/663/583 +f 607/665/584 609/669/584 663/670/584 661/666/584 +f 664/671/585 610/672/585 608/668/585 662/667/585 +f 609/669/586 611/673/586 665/674/586 663/670/586 +f 666/675/587 612/676/587 610/672/587 664/671/587 +f 611/673/588 613/677/588 667/678/588 665/674/588 +f 668/679/589 614/680/589 612/676/589 666/675/589 +f 613/677/590 615/681/590 669/682/590 667/678/590 +f 670/683/591 616/684/591 614/680/591 668/679/591 +f 615/681/592 574/685/592 575/686/592 669/682/592 +f 575/686/593 574/685/593 616/684/593 670/683/593 +f 617/687/594 635/688/594 667/678/594 669/682/594 +f 668/679/595 636/689/595 618/690/595 670/683/595 +f 635/688/596 686/691/596 665/674/596 667/678/596 +f 666/675/597 687/692/597 636/689/597 668/679/597 +f 633/693/598 663/670/598 665/674/598 686/691/598 +f 666/675/599 664/671/599 634/694/599 687/692/599 +f 631/695/600 661/666/600 663/670/600 633/693/600 +f 664/671/601 662/667/601 632/696/601 634/694/601 +f 629/697/602 659/662/602 661/666/602 631/695/602 +f 662/667/603 660/663/603 630/698/603 632/696/603 +f 627/699/604 657/658/604 659/662/604 629/697/604 +f 660/663/605 658/659/605 628/700/605 630/698/605 +f 625/701/606 655/654/606 657/658/606 627/699/606 +f 658/659/607 656/655/607 626/702/607 628/700/607 +f 623/703/608 653/647/608 655/654/608 625/701/608 +f 656/655/609 654/649/609 624/704/609 626/702/609 +f 621/705/610 671/648/610 653/647/610 623/703/610 +f 654/649/611 672/652/611 622/706/611 624/704/611 +f 621/705/612 688/707/612 684/708/612 671/648/612 +f 684/708/613 689/709/613 622/706/613 672/652/613 +f 617/687/614 669/682/614 575/686/614 619/710/614 +f 575/686/615 670/683/615 618/690/615 620/711/615 +f 619/710/616 575/686/616 685/712/616 690/713/616 +f 685/712/617 575/686/617 620/711/617 691/714/617 +f 684/708/618 688/707/618 690/713/618 685/712/618 +f 691/714/619 689/709/619 684/708/619 685/712/619 +f 642/715/620 644/716/620 683/625/620 681/624/620 +f 683/625/621 644/716/621 643/717/621 682/627/621 +f 640/718/622 642/715/622 681/624/622 679/630/622 +f 682/627/623 643/717/623 641/719/623 680/631/623 +f 638/720/624 640/718/624 679/630/624 677/634/624 +f 680/631/625 641/719/625 639/721/625 678/635/625 +f 673/642/626 694/722/626 692/723/626 675/638/626 +f 693/724/627 695/725/627 674/643/627 676/639/627 +f 638/720/628 677/634/628 675/638/628 692/723/628 +f 676/639/629 678/635/629 639/721/629 693/724/629 +f 651/726/630 697/727/630 696/728/630 694/722/630 +f 696/728/631 697/727/631 652/729/631 695/725/631 +f 692/723/632 694/722/632 696/728/632 576/730/632 +f 696/728/633 695/725/633 693/724/633 576/730/633 +f 637/731/634 638/720/634 692/723/634 576/730/634 +f 693/724/634 639/721/634 637/731/634 576/730/634 +f 649/732/635 700/733/635 698/734/635 651/726/635 +f 699/735/636 701/736/636 650/737/636 652/729/636 +f 647/738/637 702/739/637 700/733/637 649/732/637 +f 701/736/638 703/740/638 648/741/638 650/737/638 +f 646/742/639 704/743/639 702/739/639 647/738/639 +f 703/740/640 705/744/640 646/742/640 648/741/640 +f 645/745/641 578/746/641 704/743/641 646/742/641 +f 705/744/642 578/746/642 645/745/642 646/742/642 +f 697/727/643 651/726/643 698/734/643 577/747/643 +f 699/735/644 652/729/644 697/727/644 577/747/644 +f 577/747/645 698/734/645 713/748/645 715/749/645 +f 714/750/646 699/735/646 577/747/646 715/749/646 +f 578/746/647 706/751/647 707/752/647 704/743/647 +f 708/753/648 706/751/648 578/746/648 705/744/648 +f 704/743/649 707/752/649 709/754/649 702/739/649 +f 710/755/650 708/753/650 705/744/650 703/740/650 +f 702/739/651 709/754/651 711/756/651 700/733/651 +f 712/757/652 710/755/652 703/740/652 701/736/652 +f 700/733/653 711/756/653 713/748/653 698/734/653 +f 714/750/654 712/757/654 701/736/654 699/735/654 +f 706/751/655 711/756/655 709/754/655 707/752/655 +f 710/755/656 712/757/656 706/751/656 708/753/656 +f 706/751/657 715/749/657 713/748/657 711/756/657 +f 714/750/658 715/749/658 706/751/658 712/757/658 +f 646/742/659 647/738/659 671/648/659 684/708/659 +f 672/652/660 648/741/660 646/742/660 684/708/660 +f 647/738/661 649/732/661 718/758/661 671/648/661 +f 719/759/662 650/737/662 648/741/662 672/652/662 +f 649/732/663 651/726/663 720/760/663 718/758/663 +f 721/761/664 652/729/664 650/737/664 719/759/664 +f 651/726/665 694/722/665 673/642/665 720/760/665 +f 674/643/666 695/725/666 652/729/666 721/761/666 +f 588/641/667 716/762/667 720/760/667 673/642/667 +f 721/761/668 717/763/668 589/644/668 674/643/668 +f 716/762/669 722/764/669 718/758/669 720/760/669 +f 719/759/670 723/765/670 717/763/670 721/761/670 +f 586/645/671 671/648/671 718/758/671 722/764/671 +f 719/759/672 672/652/672 587/651/672 723/765/672 +f 638/720/673 637/731/673 579/766/673 729/767/673 +f 579/766/674 637/731/674 639/721/674 730/768/674 +f 640/718/675 638/720/675 729/767/675 727/769/675 +f 730/768/676 639/721/676 641/719/676 728/770/676 +f 642/715/677 640/718/677 727/769/677 725/771/677 +f 728/770/678 641/719/678 643/717/678 726/772/678 +f 644/716/679 642/715/679 725/771/679 724/773/679 +f 726/772/680 643/717/680 644/716/680 724/773/680 +f 724/773/681 725/771/681 736/774/681 738/775/681 +f 737/776/682 726/772/682 724/773/682 738/775/682 +f 725/771/683 727/769/683 734/777/683 736/774/683 +f 735/778/684 728/770/684 726/772/684 737/776/684 +f 727/769/685 729/767/685 732/779/685 734/777/685 +f 733/780/686 730/768/686 728/770/686 735/778/686 +f 729/767/687 579/766/687 731/781/687 732/779/687 +f 731/781/688 579/766/688 730/768/688 733/780/688 +f 731/781/689 738/775/689 736/774/689 732/779/689 +f 737/776/690 738/775/690 731/781/690 733/780/690 +f 732/779/691 736/774/691 734/777/691 +f 735/778/692 737/776/692 733/780/692 +f 690/713/693 688/707/693 741/782/693 739/783/693 +f 742/784/694 689/709/694 691/714/694 740/785/694 +f 619/710/695 690/713/695 739/783/695 761/786/695 +f 740/785/696 691/714/696 620/711/696 762/787/696 +f 617/687/697 619/710/697 761/786/697 763/788/697 +f 762/787/698 620/711/698 618/690/698 764/789/698 +f 688/707/699 621/705/699 759/790/699 741/782/699 +f 760/791/700 622/706/700 689/709/700 742/784/700 +f 621/705/701 623/703/701 757/792/701 759/790/701 +f 758/793/702 624/704/702 622/706/702 760/791/702 +f 623/703/703 625/701/703 755/794/703 757/792/703 +f 756/795/704 626/702/704 624/704/704 758/793/704 +f 625/701/705 627/699/705 753/796/705 755/794/705 +f 754/797/706 628/700/706 626/702/706 756/795/706 +f 627/699/707 629/697/707 751/798/707 753/796/707 +f 752/799/708 630/698/708 628/700/708 754/797/708 +f 629/697/709 631/695/709 749/800/709 751/798/709 +f 750/801/710 632/696/710 630/698/710 752/799/710 +f 631/695/711 633/693/711 747/802/711 749/800/711 +f 748/803/712 634/694/712 632/696/712 750/801/712 +f 633/693/713 686/691/713 743/804/713 747/802/713 +f 744/805/714 687/692/714 634/694/714 748/803/714 +f 686/691/715 635/688/715 745/806/715 743/804/715 +f 746/807/716 636/689/716 687/692/716 744/805/716 +f 635/688/717 617/687/717 763/788/717 745/806/717 +f 764/789/718 618/690/718 636/689/718 746/807/718 +f 745/806/719 763/788/719 765/808/719 783/809/719 +f 766/810/720 764/789/720 746/807/720 784/811/720 +f 743/804/721 745/806/721 783/809/721 785/812/721 +f 784/811/722 746/807/722 744/805/722 786/813/722 +f 747/802/723 743/804/723 785/812/723 781/814/723 +f 786/813/724 744/805/724 748/803/724 782/815/724 +f 749/800/725 747/802/725 781/814/725 779/816/725 +f 782/815/726 748/803/726 750/801/726 780/817/726 +f 751/798/727 749/800/727 779/816/727 777/818/727 +f 780/817/728 750/801/728 752/799/728 778/819/728 +f 753/796/729 751/798/729 777/818/729 775/820/729 +f 778/819/730 752/799/730 754/797/730 776/821/730 +f 755/794/731 753/796/731 775/820/731 773/822/731 +f 776/821/732 754/797/732 756/795/732 774/823/732 +f 757/792/733 755/794/733 773/822/733 771/824/733 +f 774/823/734 756/795/734 758/793/734 772/825/734 +f 759/790/735 757/792/735 771/824/735 769/826/735 +f 772/825/736 758/793/736 760/791/736 770/827/736 +f 741/782/737 759/790/737 769/826/737 787/828/737 +f 770/827/738 760/791/738 742/784/738 788/829/738 +f 763/788/739 761/786/739 767/830/739 765/808/739 +f 768/831/740 762/787/740 764/789/740 766/810/740 +f 761/786/741 739/783/741 789/832/741 767/830/741 +f 790/833/742 740/785/742 762/787/742 768/831/742 +f 739/783/743 741/782/743 787/828/743 789/832/743 +f 788/829/744 742/784/744 740/785/744 790/833/744 +f 574/685/745 615/681/745 791/834/745 580/835/745 +f 792/836/746 616/684/746 574/685/746 580/835/746 +f 615/681/747 613/677/747 793/837/747 791/834/747 +f 794/838/748 614/680/748 616/684/748 792/836/748 +f 613/677/749 611/673/749 795/839/749 793/837/749 +f 796/840/750 612/676/750 614/680/750 794/838/750 +f 611/673/751 609/669/751 797/841/751 795/839/751 +f 798/842/752 610/672/752 612/676/752 796/840/752 +f 609/669/753 607/665/753 799/843/753 797/841/753 +f 800/844/754 608/668/754 610/672/754 798/842/754 +f 607/665/755 605/661/755 801/845/755 799/843/755 +f 802/846/756 606/664/756 608/668/756 800/844/756 +f 605/661/757 603/657/757 803/847/757 801/845/757 +f 804/848/758 604/660/758 606/664/758 802/846/758 +f 603/657/759 601/653/759 805/849/759 803/847/759 +f 806/850/760 602/656/760 604/660/760 804/848/760 +f 601/653/761 599/646/761 807/851/761 805/849/761 +f 808/852/762 600/650/762 602/656/762 806/850/762 +f 815/853/763 816/854/763 835/855/763 845/856/763 +f 836/857/764 816/858/764 815/859/764 846/860/764 +f 814/861/765 815/853/765 845/856/765 843/862/765 +f 846/860/766 815/859/766 814/863/766 844/864/766 +f 813/865/767 814/861/767 843/862/767 847/866/767 +f 844/864/768 814/863/768 813/865/768 848/867/768 +f 596/623/769 598/626/769 813/865/769 847/866/769 +f 813/865/770 598/626/770 597/628/770 848/867/770 +f 594/629/771 596/623/771 847/866/771 841/868/771 +f 848/867/772 597/628/772 595/632/772 842/869/772 +f 592/633/773 594/629/773 841/868/773 837/870/773 +f 842/869/774 595/632/774 593/636/774 838/871/774 +f 590/637/775 592/633/775 837/870/775 839/872/775 +f 838/871/776 593/636/776 591/640/776 840/873/776 +f 837/870/777 843/862/777 845/856/777 839/872/777 +f 846/860/778 844/864/778 838/871/778 840/873/778 +f 837/870/779 841/868/779 847/866/779 843/862/779 +f 848/867/780 842/869/780 838/871/780 844/864/780 +f 833/874/781 839/872/781 845/856/781 835/855/781 +f 846/860/782 840/873/782 834/875/782 836/857/782 +f 588/641/783 590/637/783 839/872/783 833/874/783 +f 840/873/784 591/640/784 589/644/784 834/875/784 +f 716/762/785 849/876/785 851/877/785 722/764/785 +f 852/878/786 850/879/786 717/763/786 723/765/786 +f 588/641/787 833/874/787 849/876/787 716/762/787 +f 850/879/788 834/875/788 589/644/788 717/763/788 +f 586/645/789 722/764/789 851/877/789 853/880/789 +f 852/878/790 723/765/790 587/651/790 854/881/790 +f 586/645/791 853/880/791 807/851/791 599/646/791 +f 808/852/792 854/881/792 587/651/792 600/650/792 +f 584/882/793 831/883/793 859/884/793 811/885/793 +f 860/886/794 832/887/794 584/888/794 811/889/794 +f 811/885/795 859/884/795 857/890/795 585/891/795 +f 858/892/796 860/886/796 811/889/796 585/893/796 +f 585/891/797 857/890/797 855/894/797 812/895/797 +f 856/896/798 858/892/798 585/893/798 812/897/798 +f 812/895/799 855/894/799 835/855/799 816/854/799 +f 836/857/800 856/896/800 812/897/800 816/858/800 +f 833/874/801 835/855/801 855/894/801 849/876/801 +f 856/896/802 836/857/802 834/875/802 850/879/802 +f 803/847/803 805/849/803 825/898/803 817/899/803 +f 826/900/804 806/850/804 804/848/804 818/901/804 +f 583/902/805 823/903/805 831/883/805 584/882/805 +f 832/887/806 824/904/806 583/905/806 584/888/806 +f 809/906/807 865/907/807 863/908/807 810/909/807 +f 864/910/808 866/911/808 809/912/808 810/913/808 +f 810/909/809 863/908/809 861/914/809 582/915/809 +f 862/916/810 864/910/810 810/913/810 582/917/810 +f 582/915/811 861/914/811 823/903/811 583/902/811 +f 824/904/812 862/916/812 582/917/812 583/905/812 +f 799/918/813 801/845/813 869/919/813 871/920/813 +f 870/921/814 802/846/814 800/922/814 872/923/814 +f 871/920/815 869/919/815 875/924/815 873/925/815 +f 876/926/816 870/921/816 872/923/816 874/927/816 +f 873/925/817 875/924/817 877/928/817 879/929/817 +f 878/930/818 876/926/818 874/927/818 880/931/818 +f 879/929/819 877/928/819 883/932/819 881/933/819 +f 884/934/820 878/930/820 880/931/820 882/935/820 +f 821/936/821 885/937/821 881/933/821 883/932/821 +f 882/935/822 886/938/822 822/939/822 884/934/822 +f 823/903/823 861/914/823 881/933/823 885/937/823 +f 882/935/824 862/916/824 824/904/824 886/938/824 +f 861/914/825 863/908/825 879/929/825 881/933/825 +f 880/931/826 864/910/826 862/916/826 882/935/826 +f 863/908/827 865/907/827 873/925/827 879/929/827 +f 874/927/828 866/911/828 864/910/828 880/931/828 +f 865/907/829 867/940/829 871/920/829 873/925/829 +f 872/923/830 868/941/830 866/911/830 874/927/830 +f 797/942/831 799/918/831 871/920/831 867/940/831 +f 872/923/832 800/922/832 798/943/832 868/941/832 +f 581/944/833 867/940/833 865/907/833 809/906/833 +f 866/911/834 868/941/834 581/945/834 809/912/834 +f 791/946/835 793/947/835 795/948/835 797/942/835 +f 796/949/836 794/950/836 792/951/836 798/943/836 +f 791/946/837 797/942/837 867/940/837 581/944/837 +f 868/941/838 798/943/838 792/951/838 581/945/838 +f 580/952/839 791/946/839 581/944/839 +f 581/945/840 792/951/840 580/953/840 +f 801/845/841 803/847/841 817/899/841 869/919/841 +f 818/901/842 804/848/842 802/846/842 870/921/842 +f 817/899/843 819/954/843 875/924/843 869/919/843 +f 876/926/844 820/955/844 818/901/844 870/921/844 +f 819/954/845 889/956/845 877/928/845 875/924/845 +f 878/930/846 890/957/846 820/955/846 876/926/846 +f 821/936/847 883/932/847 877/928/847 889/956/847 +f 878/930/848 884/934/848 822/939/848 890/957/848 +f 855/894/849 857/890/849 893/958/849 891/959/849 +f 894/960/850 858/892/850 856/896/850 892/961/850 +f 825/898/851 891/959/851 893/958/851 827/962/851 +f 894/960/852 892/961/852 826/900/852 828/963/852 +f 805/849/853 807/851/853 891/959/853 825/898/853 +f 892/961/854 808/852/854 806/850/854 826/900/854 +f 807/851/855 851/877/855 849/876/855 891/959/855 +f 850/879/856 852/878/856 808/852/856 892/961/856 +f 849/876/857 855/894/857 891/959/857 +f 892/961/858 856/896/858 850/879/858 +f 807/851/859 853/880/859 851/877/859 +f 852/878/860 854/881/860 808/852/860 +f 821/936/861 829/964/861 887/965/861 885/937/861 +f 888/966/862 830/967/862 822/939/862 886/938/862 +f 823/903/863 885/937/863 887/965/863 831/883/863 +f 888/966/864 886/938/864 824/904/864 832/887/864 +f 827/962/865 893/958/865 887/965/865 829/964/865 +f 888/966/866 894/960/866 828/963/866 830/967/866 +f 857/890/867 859/884/867 887/965/867 893/958/867 +f 888/966/868 860/886/868 858/892/868 894/960/868 +f 831/883/869 887/965/869 859/884/869 +f 860/886/870 888/966/870 832/887/870 +f 907/968/871 895/969/871 921/970/871 909/971/871 +f 922/972/872 896/973/872 908/974/872 910/975/872 +f 907/968/873 909/971/873 911/976/873 905/977/873 +f 912/978/874 910/975/874 908/974/874 906/979/874 +f 905/977/875 911/976/875 913/980/875 903/981/875 +f 914/982/876 912/978/876 906/979/876 904/983/876 +f 903/981/877 913/980/877 915/984/877 901/985/877 +f 916/986/878 914/982/878 904/983/878 902/987/878 +f 901/985/879 915/984/879 917/988/879 899/989/879 +f 918/990/880 916/986/880 902/987/880 900/991/880 +f 899/989/881 917/988/881 919/992/881 897/993/881 +f 920/994/882 918/990/882 900/991/882 898/995/882 +f 917/988/883 927/996/883 925/997/883 919/992/883 +f 926/998/884 928/999/884 918/990/884 920/994/884 +f 915/984/885 929/1000/885 927/996/885 917/988/885 +f 928/999/886 930/1001/886 916/986/886 918/990/886 +f 913/980/887 931/1002/887 929/1000/887 915/984/887 +f 930/1001/888 932/1003/888 914/982/888 916/986/888 +f 911/976/889 933/1004/889 931/1002/889 913/980/889 +f 932/1003/890 934/1005/890 912/978/890 914/982/890 +f 909/971/891 935/1006/891 933/1004/891 911/976/891 +f 934/1005/892 936/1007/892 910/975/892 912/978/892 +f 909/971/893 921/970/893 923/1008/893 935/1006/893 +f 924/1009/894 922/972/894 910/975/894 936/1007/894 +f 825/898/895 827/962/895 951/1010/895 949/1011/895 +f 952/1012/896 828/963/896 826/900/896 950/1013/896 +f 827/1014/897 897/993/897 919/992/897 951/1015/897 +f 920/994/898 898/995/898 828/1016/898 952/1017/898 +f 817/899/899 825/898/899 949/1011/899 819/954/899 +f 950/1013/900 826/900/900 818/901/900 820/955/900 +f 889/1018/901 937/1019/901 921/970/901 895/969/901 +f 922/972/902 938/1020/902 890/1021/902 896/973/902 +f 919/992/903 925/997/903 947/1022/903 951/1015/903 +f 948/1023/904 926/998/904 920/994/904 952/1017/904 +f 945/1024/905 953/1025/905 951/1015/905 947/1022/905 +f 952/1017/906 954/1026/906 946/1027/906 948/1023/906 +f 941/1028/907 953/1025/907 945/1024/907 943/1029/907 +f 946/1027/908 954/1026/908 942/1030/908 944/1031/908 +f 939/1032/909 955/1033/909 953/1025/909 941/1028/909 +f 954/1026/910 956/1034/910 940/1035/910 942/1030/910 +f 937/1019/911 955/1033/911 939/1032/911 957/1036/911 +f 940/1035/912 956/1034/912 938/1020/912 958/1037/912 +f 921/970/913 937/1019/913 957/1036/913 923/1008/913 +f 958/1037/914 938/1020/914 922/972/914 924/1009/914 +f 819/954/915 955/1038/915 937/1039/915 889/956/915 +f 938/1040/916 956/1041/916 820/955/916 890/957/916 +f 819/954/917 949/1011/917 953/1042/917 955/1038/917 +f 954/1043/918 950/1013/918 820/955/918 956/1041/918 +f 949/1011/919 951/1010/919 953/1042/919 +f 954/1043/920 952/1012/920 950/1013/920 +f 923/1008/921 957/1036/921 959/1044/921 983/1045/921 +f 960/1046/922 958/1037/922 924/1009/922 984/1047/922 +f 957/1036/923 939/1032/923 969/1048/923 959/1044/923 +f 970/1049/924 940/1035/924 958/1037/924 960/1046/924 +f 939/1032/925 941/1028/925 967/1050/925 969/1048/925 +f 968/1051/926 942/1030/926 940/1035/926 970/1049/926 +f 941/1028/927 943/1029/927 965/1052/927 967/1050/927 +f 966/1053/928 944/1031/928 942/1030/928 968/1051/928 +f 943/1029/929 945/1024/929 963/1054/929 965/1052/929 +f 964/1055/930 946/1027/930 944/1031/930 966/1053/930 +f 945/1024/931 947/1022/931 961/1056/931 963/1054/931 +f 962/1057/932 948/1023/932 946/1027/932 964/1055/932 +f 947/1022/933 925/997/933 981/1058/933 961/1056/933 +f 982/1059/934 926/998/934 948/1023/934 962/1057/934 +f 935/1006/935 923/1008/935 983/1045/935 971/1060/935 +f 984/1047/936 924/1009/936 936/1007/936 972/1061/936 +f 933/1004/937 935/1006/937 971/1060/937 973/1062/937 +f 972/1061/938 936/1007/938 934/1005/938 974/1063/938 +f 931/1002/939 933/1004/939 973/1062/939 975/1064/939 +f 974/1063/940 934/1005/940 932/1003/940 976/1065/940 +f 929/1000/941 931/1002/941 975/1064/941 977/1066/941 +f 976/1065/942 932/1003/942 930/1001/942 978/1067/942 +f 927/996/943 929/1000/943 977/1066/943 979/1068/943 +f 978/1067/944 930/1001/944 928/999/944 980/1069/944 +f 925/997/945 927/996/945 979/1068/945 981/1058/945 +f 980/1069/946 928/999/946 926/998/946 982/1059/946 +f 965/1052/947 963/1054/947 987/1070/947 985/1071/947 +f 988/1072/948 964/1055/948 966/1053/948 986/1073/948 +f 985/1071/949 987/1070/949 989/1074/949 991/1075/949 +f 990/1076/950 988/1072/950 986/1073/950 992/1077/950 +f 991/1075/951 989/1074/951 995/1078/951 993/1079/951 +f 996/1080/952 990/1076/952 992/1077/952 994/1081/952 +f 993/1079/953 995/1078/953 997/1082/953 999/1083/953 +f 998/1084/954 996/1080/954 994/1081/954 1000/1085/954 +f 971/1060/955 983/1045/955 993/1079/955 999/1083/955 +f 994/1081/956 984/1047/956 972/1061/956 1000/1085/956 +f 959/1044/957 991/1075/957 993/1079/957 983/1045/957 +f 994/1081/958 992/1077/958 960/1046/958 984/1047/958 +f 959/1044/959 969/1048/959 985/1071/959 991/1075/959 +f 986/1073/960 970/1049/960 960/1046/960 992/1077/960 +f 965/1052/961 985/1071/961 969/1048/961 967/1050/961 +f 970/1049/962 986/1073/962 966/1053/962 968/1051/962 +f 961/1056/963 981/1058/963 987/1070/963 963/1054/963 +f 988/1072/964 982/1059/964 962/1057/964 964/1055/964 +f 979/1068/965 989/1074/965 987/1070/965 981/1058/965 +f 988/1072/966 990/1076/966 980/1069/966 982/1059/966 +f 977/1066/967 995/1078/967 989/1074/967 979/1068/967 +f 990/1076/968 996/1080/968 978/1067/968 980/1069/968 +f 975/1064/969 997/1082/969 995/1078/969 977/1066/969 +f 996/1080/970 998/1084/970 976/1065/970 978/1067/970 +f 973/1062/971 999/1083/971 997/1082/971 975/1064/971 +f 998/1084/972 1000/1085/972 974/1063/972 976/1065/972 +f 971/1060/973 999/1083/973 973/1062/973 +f 974/1063/974 1000/1085/974 972/1061/974 +f 899/989/975 897/993/975 1011/1086/975 1009/1087/975 +f 1012/1088/976 898/995/976 900/991/976 1010/1089/976 +f 901/985/977 899/989/977 1009/1087/977 1007/1090/977 +f 1010/1089/978 900/991/978 902/987/978 1008/1091/978 +f 903/981/979 901/985/979 1007/1090/979 1005/1092/979 +f 1008/1091/980 902/987/980 904/983/980 1006/1093/980 +f 905/1094/981 903/981/981 1005/1092/981 1003/1095/981 +f 1006/1093/982 904/983/982 906/1096/982 1004/1097/982 +f 907/1098/983 905/1094/983 1003/1095/983 1001/1099/983 +f 1004/1097/984 906/1096/984 908/1100/984 1002/1101/984 +f 895/1102/985 907/1098/985 1001/1099/985 1013/1103/985 +f 1002/1101/986 908/1100/986 896/1104/986 1014/1105/986 +f 1001/1099/987 1009/1087/987 1011/1086/987 1013/1103/987 +f 1012/1088/988 1010/1089/988 1002/1101/988 1014/1105/988 +f 1001/1099/989 1003/1095/989 1007/1090/989 1009/1087/989 +f 1008/1091/990 1004/1097/990 1002/1101/990 1010/1089/990 +f 1003/1095/991 1005/1092/991 1007/1090/991 +f 1008/1091/992 1006/1093/992 1004/1097/992 +f 821/936/993 889/956/993 895/1106/993 1013/1107/993 +f 896/1104/994 890/1108/994 822/1109/994 1014/1105/994 +f 821/1110/995 1013/1103/995 1011/1086/995 829/1111/995 +f 1012/1088/996 1014/1105/996 822/1109/996 830/1112/996 +f 827/1014/997 829/1111/997 1011/1086/997 897/993/997 +f 1012/1088/998 830/1112/998 828/1016/998 898/995/998 diff --git a/modules/ufbx/data/blender_282_suzanne_and_transform_7400_binary.fbx b/modules/ufbx/data/blender_282_suzanne_and_transform_7400_binary.fbx new file mode 100644 index 0000000..c9cc4fe Binary files /dev/null and b/modules/ufbx/data/blender_282_suzanne_and_transform_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293_barbarian_7400_binary.fbx b/modules/ufbx/data/blender_293_barbarian_7400_binary.fbx new file mode 100644 index 0000000..8de4bf0 Binary files /dev/null and b/modules/ufbx/data/blender_293_barbarian_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293_embedded_textures_7400_binary.fbx b/modules/ufbx/data/blender_293_embedded_textures_7400_binary.fbx new file mode 100644 index 0000000..7aa0387 Binary files /dev/null and b/modules/ufbx/data/blender_293_embedded_textures_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293_half_skinned.obj b/modules/ufbx/data/blender_293_half_skinned.obj new file mode 100644 index 0000000..d4194ac --- /dev/null +++ b/modules/ufbx/data/blender_293_half_skinned.obj @@ -0,0 +1,14 @@ +# Blender v2.93.1 OBJ File: '' +# www.blender.org +g Plane +v -1.000000 1.000000 1.000000 +v 1.000000 1.000000 1.000000 +v -1.000000 0.000000 -1.000000 +v 1.000000 0.000000 -1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 0.8944 -0.4472 +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 diff --git a/modules/ufbx/data/blender_293_half_skinned_7400_binary.fbx b/modules/ufbx/data/blender_293_half_skinned_7400_binary.fbx new file mode 100644 index 0000000..9c376ed Binary files /dev/null and b/modules/ufbx/data/blender_293_half_skinned_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293_half_smooth_cube_7400_binary.fbx b/modules/ufbx/data/blender_293_half_smooth_cube_7400_binary.fbx new file mode 100644 index 0000000..f5c5d25 Binary files /dev/null and b/modules/ufbx/data/blender_293_half_smooth_cube_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293_instancing.obj b/modules/ufbx/data/blender_293_instancing.obj new file mode 100644 index 0000000..7d8f6c8 --- /dev/null +++ b/modules/ufbx/data/blender_293_instancing.obj @@ -0,0 +1,16523 @@ +# Blender v2.93.1 OBJ File: '' +# www.blender.org +mtllib blender_293_instancing.mtl +g Suzanne +v 0.437500 0.164062 -2.334375 +v -0.437500 0.164062 -2.334375 +v 0.500000 0.093750 -2.412500 +v -0.500000 0.093750 -2.412500 +v 0.546875 0.054688 -2.521875 +v -0.546875 0.054688 -2.521875 +v 0.351562 -0.023438 -2.482813 +v -0.351562 -0.023438 -2.482813 +v 0.351562 0.031250 -2.381250 +v -0.351562 0.031250 -2.381250 +v 0.351562 0.132812 -2.318750 +v -0.351562 0.132812 -2.318750 +v 0.273438 0.164062 -2.303125 +v -0.273438 0.164062 -2.303125 +v 0.203125 0.093750 -2.357813 +v -0.203125 0.093750 -2.357813 +v 0.156250 0.054688 -2.451563 +v -0.156250 0.054688 -2.451563 +v 0.078125 0.242188 -2.443750 +v -0.078125 0.242188 -2.443750 +v 0.140625 0.242188 -2.357813 +v -0.140625 0.242188 -2.357813 +v 0.242188 0.242188 -2.303125 +v -0.242188 0.242188 -2.303125 +v 0.273438 0.328125 -2.303125 +v -0.273438 0.328125 -2.303125 +v 0.203125 0.390625 -2.357813 +v -0.203125 0.390625 -2.357813 +v 0.156250 0.437500 -2.451563 +v -0.156250 0.437500 -2.451563 +v 0.351562 0.515625 -2.482813 +v -0.351562 0.515625 -2.482813 +v 0.351562 0.453125 -2.381250 +v -0.351562 0.453125 -2.381250 +v 0.351562 0.359375 -2.318750 +v -0.351562 0.359375 -2.318750 +v 0.437500 0.328125 -2.334375 +v -0.437500 0.328125 -2.334375 +v 0.500000 0.390625 -2.412500 +v -0.500000 0.390625 -2.412500 +v 0.546875 0.437500 -2.521875 +v -0.546875 0.437500 -2.521875 +v 0.625000 0.242188 -2.537500 +v -0.625000 0.242188 -2.537500 +v 0.562500 0.242188 -2.428125 +v -0.562500 0.242188 -2.428125 +v 0.468750 0.242188 -2.342188 +v -0.468750 0.242188 -2.342188 +v 0.476562 0.242188 -2.326563 +v -0.476562 0.242188 -2.326563 +v 0.445312 0.335938 -2.318750 +v -0.445312 0.335938 -2.318750 +v 0.351562 0.375000 -2.295313 +v -0.351562 0.375000 -2.295313 +v 0.265625 0.335938 -2.279688 +v -0.265625 0.335938 -2.279688 +v 0.226562 0.242188 -2.279688 +v -0.226562 0.242188 -2.279688 +v 0.265625 0.156250 -2.279688 +v -0.265625 0.156250 -2.279688 +v 0.351562 0.242188 -2.271875 +v -0.351562 0.242188 -2.271875 +v 0.351562 0.117188 -2.295313 +v -0.351562 0.117188 -2.295313 +v 0.445312 0.156250 -2.318750 +v -0.445312 0.156250 -2.318750 +v 0.000000 0.429688 -2.357813 +v 0.000000 0.351562 -2.279688 +v 0.000000 -0.679688 -2.365625 +v 0.000000 -0.320312 -2.318750 +v 0.000000 -0.187500 -2.303125 +v 0.000000 -0.773438 -2.381250 +v 0.000000 0.406250 -2.498438 +v 0.000000 0.570312 -2.529688 +v 0.000000 0.898438 -3.646875 +v 0.000000 0.562500 -3.951563 +v 0.000000 0.070312 -3.928125 +v 0.000000 -0.382812 -3.451563 +v 0.203125 -0.187500 -2.537500 +v -0.203125 -0.187500 -2.537500 +v 0.312500 -0.437500 -2.529688 +v -0.312500 -0.437500 -2.529688 +v 0.351562 -0.695312 -2.529688 +v -0.351562 -0.695312 -2.529688 +v 0.367188 -0.890625 -2.568750 +v -0.367188 -0.890625 -2.568750 +v 0.328125 -0.945312 -2.576563 +v -0.328125 -0.945312 -2.576563 +v 0.179688 -0.968750 -2.545313 +v -0.179688 -0.968750 -2.545313 +v 0.000000 -0.984375 -2.521875 +v 0.437500 -0.140625 -2.568750 +v -0.437500 -0.140625 -2.568750 +v 0.632812 -0.039062 -2.560938 +v -0.632812 -0.039062 -2.560938 +v 0.828125 0.148438 -2.654688 +v -0.828125 0.148438 -2.654688 +v 0.859375 0.429688 -2.506250 +v -0.859375 0.429688 -2.506250 +v 0.710938 0.484375 -2.475000 +v -0.710938 0.484375 -2.475000 +v 0.492188 0.601562 -2.412500 +v -0.492188 0.601562 -2.412500 +v 0.320312 0.757812 -2.365625 +v -0.320312 0.757812 -2.365625 +v 0.156250 0.718750 -2.342188 +v -0.156250 0.718750 -2.342188 +v 0.062500 0.492188 -2.350000 +v -0.062500 0.492188 -2.350000 +v 0.164062 0.414062 -2.326563 +v -0.164062 0.414062 -2.326563 +v 0.125000 0.304688 -2.334375 +v -0.125000 0.304688 -2.334375 +v 0.203125 0.093750 -2.357813 +v -0.203125 0.093750 -2.357813 +v 0.375000 0.015625 -2.396875 +v -0.375000 0.015625 -2.396875 +v 0.492188 0.062500 -2.428125 +v -0.492188 0.062500 -2.428125 +v 0.625000 0.187500 -2.451563 +v -0.625000 0.187500 -2.451563 +v 0.640625 0.296875 -2.451563 +v -0.640625 0.296875 -2.451563 +v 0.601562 0.375000 -2.435938 +v -0.601562 0.375000 -2.435938 +v 0.429688 0.437500 -2.381250 +v -0.429688 0.437500 -2.381250 +v 0.250000 0.468750 -2.342188 +v -0.250000 0.468750 -2.342188 +v 0.000000 -0.765625 -2.365625 +v 0.109375 -0.718750 -2.365625 +v -0.109375 -0.718750 -2.365625 +v 0.117188 -0.835938 -2.389063 +v -0.117188 -0.835938 -2.389063 +v 0.062500 -0.882812 -2.404688 +v -0.062500 -0.882812 -2.404688 +v 0.000000 -0.890625 -2.412500 +v 0.000000 -0.195312 -2.350000 +v 0.000000 -0.140625 -2.357813 +v 0.101562 -0.148438 -2.357813 +v -0.101562 -0.148438 -2.357813 +v 0.125000 -0.226562 -2.350000 +v -0.125000 -0.226562 -2.350000 +v 0.085938 -0.289062 -2.357813 +v -0.085938 -0.289062 -2.357813 +v 0.398438 -0.046875 -2.428125 +v -0.398438 -0.046875 -2.428125 +v 0.617188 0.054688 -2.475000 +v -0.617188 0.054688 -2.475000 +v 0.726562 0.203125 -2.498438 +v -0.726562 0.203125 -2.498438 +v 0.742188 0.375000 -2.443750 +v -0.742188 0.375000 -2.443750 +v 0.687500 0.414062 -2.373438 +v -0.687500 0.414062 -2.373438 +v 0.437500 0.546875 -2.303125 +v -0.437500 0.546875 -2.303125 +v 0.312500 0.640625 -2.264063 +v -0.312500 0.640625 -2.264063 +v 0.203125 0.617188 -2.248438 +v -0.203125 0.617188 -2.248438 +v 0.101562 0.429688 -2.256250 +v -0.101562 0.429688 -2.256250 +v 0.125000 -0.101562 -2.287500 +v -0.125000 -0.101562 -2.287500 +v 0.210938 -0.445312 -2.389063 +v -0.210938 -0.445312 -2.389063 +v 0.250000 -0.703125 -2.412500 +v -0.250000 -0.703125 -2.412500 +v 0.265625 -0.820312 -2.435938 +v -0.265625 -0.820312 -2.435938 +v 0.234375 -0.914062 -2.467188 +v -0.234375 -0.914062 -2.467188 +v 0.164062 -0.929688 -2.467188 +v -0.164062 -0.929688 -2.467188 +v 0.000000 -0.945312 -2.459375 +v 0.000000 0.046875 -2.373438 +v 0.000000 0.210938 -2.334375 +v 0.328125 0.476562 -2.357813 +v -0.328125 0.476562 -2.357813 +v 0.164062 0.140625 -2.350000 +v -0.164062 0.140625 -2.350000 +v 0.132812 0.210938 -2.342188 +v -0.132812 0.210938 -2.342188 +v 0.117188 -0.687500 -2.365625 +v -0.117188 -0.687500 -2.365625 +v 0.078125 -0.445312 -2.350000 +v -0.078125 -0.445312 -2.350000 +v 0.000000 -0.445312 -2.350000 +v 0.000000 -0.328125 -2.357813 +v 0.093750 -0.273438 -2.318750 +v -0.093750 -0.273438 -2.318750 +v 0.132812 -0.226562 -2.303125 +v -0.132812 -0.226562 -2.303125 +v 0.109375 -0.132812 -2.318750 +v -0.109375 -0.132812 -2.318750 +v 0.039062 -0.125000 -2.318750 +v -0.039062 -0.125000 -2.318750 +v 0.000000 -0.203125 -2.271875 +v 0.046875 -0.148438 -2.287500 +v -0.046875 -0.148438 -2.287500 +v 0.093750 -0.156250 -2.287500 +v -0.093750 -0.156250 -2.287500 +v 0.109375 -0.226562 -2.271875 +v -0.109375 -0.226562 -2.271875 +v 0.078125 -0.250000 -2.295313 +v -0.078125 -0.250000 -2.295313 +v 0.000000 -0.289062 -2.295313 +v 0.257812 -0.312500 -2.545313 +v -0.257812 -0.312500 -2.545313 +v 0.164062 -0.242188 -2.389063 +v -0.164062 -0.242188 -2.389063 +v 0.179688 -0.312500 -2.389063 +v -0.179688 -0.312500 -2.389063 +v 0.234375 -0.250000 -2.545313 +v -0.234375 -0.250000 -2.545313 +v 0.000000 -0.875000 -2.412500 +v 0.046875 -0.867188 -2.412500 +v -0.046875 -0.867188 -2.412500 +v 0.093750 -0.820312 -2.389063 +v -0.093750 -0.820312 -2.389063 +v 0.093750 -0.742188 -2.373438 +v -0.093750 -0.742188 -2.373438 +v 0.000000 -0.781250 -2.443750 +v 0.093750 -0.750000 -2.435938 +v -0.093750 -0.750000 -2.435938 +v 0.093750 -0.812500 -2.459375 +v -0.093750 -0.812500 -2.459375 +v 0.046875 -0.851562 -2.467188 +v -0.046875 -0.851562 -2.467188 +v 0.000000 -0.859375 -2.467188 +v 0.171875 0.218750 -2.318750 +v -0.171875 0.218750 -2.318750 +v 0.187500 0.156250 -2.326563 +v -0.187500 0.156250 -2.326563 +v 0.335938 0.429688 -2.342188 +v -0.335938 0.429688 -2.342188 +v 0.273438 0.421875 -2.326563 +v -0.273438 0.421875 -2.326563 +v 0.421875 0.398438 -2.326563 +v -0.421875 0.398438 -2.326563 +v 0.562500 0.351562 -2.404688 +v -0.562500 0.351562 -2.404688 +v 0.585938 0.289062 -2.412500 +v -0.585938 0.289062 -2.412500 +v 0.578125 0.195312 -2.420313 +v -0.578125 0.195312 -2.420313 +v 0.476562 0.101562 -2.381250 +v -0.476562 0.101562 -2.381250 +v 0.375000 0.062500 -2.357813 +v -0.375000 0.062500 -2.357813 +v 0.226562 0.109375 -2.318750 +v -0.226562 0.109375 -2.318750 +v 0.179688 0.296875 -2.318750 +v -0.179688 0.296875 -2.318750 +v 0.210938 0.375000 -2.318750 +v -0.210938 0.375000 -2.318750 +v 0.234375 0.359375 -2.342188 +v -0.234375 0.359375 -2.342188 +v 0.195312 0.296875 -2.342188 +v -0.195312 0.296875 -2.342188 +v 0.242188 0.125000 -2.342188 +v -0.242188 0.125000 -2.342188 +v 0.375000 0.085938 -2.373438 +v -0.375000 0.085938 -2.373438 +v 0.460938 0.117188 -2.396875 +v -0.460938 0.117188 -2.396875 +v 0.546875 0.210938 -2.428125 +v -0.546875 0.210938 -2.428125 +v 0.554688 0.281250 -2.428125 +v -0.554688 0.281250 -2.428125 +v 0.531250 0.335938 -2.420313 +v -0.531250 0.335938 -2.420313 +v 0.414062 0.390625 -2.350000 +v -0.414062 0.390625 -2.350000 +v 0.281250 0.398438 -2.334375 +v -0.281250 0.398438 -2.334375 +v 0.335938 0.406250 -2.350000 +v -0.335938 0.406250 -2.350000 +v 0.203125 0.171875 -2.350000 +v -0.203125 0.171875 -2.350000 +v 0.195312 0.226562 -2.350000 +v -0.195312 0.226562 -2.350000 +v 0.109375 0.460938 -2.490625 +v -0.109375 0.460938 -2.490625 +v 0.195312 0.664062 -2.482813 +v -0.195312 0.664062 -2.482813 +v 0.335938 0.687500 -2.506250 +v -0.335938 0.687500 -2.506250 +v 0.484375 0.554688 -2.545313 +v -0.484375 0.554688 -2.545313 +v 0.679688 0.453125 -2.607813 +v -0.679688 0.453125 -2.607813 +v 0.796875 0.406250 -2.639063 +v -0.796875 0.406250 -2.639063 +v 0.773438 0.164062 -2.725000 +v -0.773438 0.164062 -2.725000 +v 0.601562 0.000000 -2.685938 +v -0.601562 0.000000 -2.685938 +v 0.437500 -0.093750 -2.631250 +v -0.437500 -0.093750 -2.631250 +v 0.000000 0.898438 -2.810938 +v 0.000000 0.984375 -3.178125 +v 0.000000 -0.195312 -3.771875 +v 0.000000 -0.460938 -2.912500 +v 0.000000 -0.976562 -2.639063 +v 0.000000 -0.804688 -2.756250 +v 0.000000 -0.570312 -2.779688 +v 0.000000 -0.484375 -2.818750 +v 0.851562 0.234375 -3.045313 +v -0.851562 0.234375 -3.045313 +v 0.859375 0.320312 -3.146875 +v -0.859375 0.320312 -3.146875 +v 0.773438 0.265625 -3.537500 +v -0.773438 0.265625 -3.537500 +v 0.460938 0.437500 -3.803125 +v -0.460938 0.437500 -3.803125 +v 0.734375 -0.046875 -3.029688 +v -0.734375 -0.046875 -3.029688 +v 0.593750 -0.125000 -3.264063 +v -0.593750 -0.125000 -3.264063 +v 0.640625 -0.007812 -3.529688 +v -0.640625 -0.007812 -3.529688 +v 0.335938 0.054688 -3.764063 +v -0.335938 0.054688 -3.764063 +v 0.234375 -0.351562 -2.693750 +v -0.234375 -0.351562 -2.693750 +v 0.179688 -0.414062 -2.842188 +v -0.179688 -0.414062 -2.842188 +v 0.289062 -0.710938 -2.717188 +v -0.289062 -0.710938 -2.717188 +v 0.250000 -0.500000 -2.709375 +v -0.250000 -0.500000 -2.709375 +v 0.328125 -0.914062 -2.701563 +v -0.328125 -0.914062 -2.701563 +v 0.140625 -0.757812 -2.732813 +v -0.140625 -0.757812 -2.732813 +v 0.125000 -0.539062 -2.740625 +v -0.125000 -0.539062 -2.740625 +v 0.164062 -0.945312 -2.662500 +v -0.164062 -0.945312 -2.662500 +v 0.218750 -0.281250 -2.670313 +v -0.218750 -0.281250 -2.670313 +v 0.210938 -0.226562 -2.631250 +v -0.210938 -0.226562 -2.631250 +v 0.203125 -0.171875 -2.600000 +v -0.203125 -0.171875 -2.600000 +v 0.210938 -0.390625 -2.935938 +v -0.210938 -0.390625 -2.935938 +v 0.296875 -0.312500 -3.365625 +v -0.296875 -0.312500 -3.365625 +v 0.343750 -0.148438 -3.639063 +v -0.343750 -0.148438 -3.639063 +v 0.453125 0.867188 -3.482813 +v -0.453125 0.867188 -3.482813 +v 0.453125 0.929688 -3.170313 +v -0.453125 0.929688 -3.170313 +v 0.453125 0.851562 -2.865625 +v -0.453125 0.851562 -2.865625 +v 0.460938 0.523438 -2.670313 +v -0.460938 0.523438 -2.670313 +v 0.726562 0.406250 -2.764063 +v -0.726562 0.406250 -2.764063 +v 0.632812 0.453125 -2.818750 +v -0.632812 0.453125 -2.818750 +v 0.640625 0.703125 -3.045313 +v -0.640625 0.703125 -3.045313 +v 0.796875 0.562500 -2.975000 +v -0.796875 0.562500 -2.975000 +v 0.796875 0.617188 -3.217188 +v -0.796875 0.617188 -3.217188 +v 0.640625 0.750000 -3.295313 +v -0.640625 0.750000 -3.295313 +v 0.640625 0.679688 -3.545313 +v -0.640625 0.679688 -3.545313 +v 0.796875 0.539062 -3.459375 +v -0.796875 0.539062 -3.459375 +v 0.617188 0.328125 -3.685938 +v -0.617188 0.328125 -3.685938 +v 0.484375 0.023438 -3.646875 +v -0.484375 0.023438 -3.646875 +v 0.820312 0.328125 -3.303125 +v -0.820312 0.328125 -3.303125 +v 0.406250 -0.171875 -2.951563 +v -0.406250 -0.171875 -2.951563 +v 0.429688 -0.195312 -3.310938 +v -0.429688 -0.195312 -3.310938 +v 0.890625 0.406250 -3.334375 +v -0.890625 0.406250 -3.334375 +v 0.773438 -0.140625 -3.225000 +v -0.773438 -0.140625 -3.225000 +v 1.039062 -0.101562 -3.428125 +v -1.039062 -0.101562 -3.428125 +v 1.281250 0.054688 -3.529688 +v -1.281250 0.054688 -3.529688 +v 1.351562 0.320312 -3.521875 +v -1.351562 0.320312 -3.521875 +v 1.234375 0.507812 -3.521875 +v -1.234375 0.507812 -3.521875 +v 1.023438 0.476562 -3.412500 +v -1.023438 0.476562 -3.412500 +v 1.015625 0.414062 -3.389063 +v -1.015625 0.414062 -3.389063 +v 1.187500 0.437500 -3.490625 +v -1.187500 0.437500 -3.490625 +v 1.265625 0.289062 -3.506250 +v -1.265625 0.289062 -3.506250 +v 1.210938 0.078125 -3.506250 +v -1.210938 0.078125 -3.506250 +v 1.031250 -0.039062 -3.404688 +v -1.031250 -0.039062 -3.404688 +v 0.828125 -0.070312 -3.232813 +v -0.828125 -0.070312 -3.232813 +v 0.921875 0.359375 -3.318750 +v -0.921875 0.359375 -3.318750 +v 0.945312 0.304688 -3.389063 +v -0.945312 0.304688 -3.389063 +v 0.882812 -0.023438 -3.310938 +v -0.882812 -0.023438 -3.310938 +v 1.039062 0.000000 -3.467188 +v -1.039062 0.000000 -3.467188 +v 1.187500 0.093750 -3.545313 +v -1.187500 0.093750 -3.545313 +v 1.234375 0.250000 -3.545313 +v -1.234375 0.250000 -3.545313 +v 1.171875 0.359375 -3.537500 +v -1.171875 0.359375 -3.537500 +v 1.023438 0.343750 -3.459375 +v -1.023438 0.343750 -3.459375 +v 0.843750 0.289062 -3.310938 +v -0.843750 0.289062 -3.310938 +v 0.835938 0.171875 -3.373438 +v -0.835938 0.171875 -3.373438 +v 0.757812 0.093750 -3.373438 +v -0.757812 0.093750 -3.373438 +v 0.820312 0.085938 -3.373438 +v -0.820312 0.085938 -3.373438 +v 0.843750 0.015625 -3.373438 +v -0.843750 0.015625 -3.373438 +v 0.812500 -0.015625 -3.373438 +v -0.812500 -0.015625 -3.373438 +v 0.726562 0.000000 -3.170313 +v -0.726562 0.000000 -3.170313 +v 0.718750 -0.023438 -3.271875 +v -0.718750 -0.023438 -3.271875 +v 0.718750 0.039062 -3.287500 +v -0.718750 0.039062 -3.287500 +v 0.796875 0.203125 -3.310938 +v -0.796875 0.203125 -3.310938 +v 0.890625 0.242188 -3.365625 +v -0.890625 0.242188 -3.365625 +v 0.890625 0.234375 -3.420313 +v -0.890625 0.234375 -3.420313 +v 0.812500 -0.015625 -3.420313 +v -0.812500 -0.015625 -3.420313 +v 0.851562 0.015625 -3.420313 +v -0.851562 0.015625 -3.420313 +v 0.828125 0.078125 -3.420313 +v -0.828125 0.078125 -3.420313 +v 0.765625 0.093750 -3.420313 +v -0.765625 0.093750 -3.420313 +v 0.843750 0.171875 -3.420313 +v -0.843750 0.171875 -3.420313 +v 1.039062 0.328125 -3.514063 +v -1.039062 0.328125 -3.514063 +v 1.187500 0.343750 -3.584375 +v -1.187500 0.343750 -3.584375 +v 1.257812 0.242188 -3.592188 +v -1.257812 0.242188 -3.592188 +v 1.210938 0.085938 -3.584375 +v -1.210938 0.085938 -3.584375 +v 1.046875 0.000000 -3.521875 +v -1.046875 0.000000 -3.521875 +v 0.882812 -0.015625 -3.365625 +v -0.882812 -0.015625 -3.365625 +v 0.953125 0.289062 -3.443750 +v -0.953125 0.289062 -3.443750 +v 0.890625 0.109375 -3.428125 +v -0.890625 0.109375 -3.428125 +v 0.937500 0.062500 -3.435938 +v -0.937500 0.062500 -3.435938 +v 1.000000 0.125000 -3.467188 +v -1.000000 0.125000 -3.467188 +v 0.960938 0.171875 -3.451563 +v -0.960938 0.171875 -3.451563 +v 1.015625 0.234375 -3.475000 +v -1.015625 0.234375 -3.475000 +v 1.054688 0.187500 -3.482813 +v -1.054688 0.187500 -3.482813 +v 1.109375 0.210938 -3.490625 +v -1.109375 0.210938 -3.490625 +v 1.085938 0.273438 -3.490625 +v -1.085938 0.273438 -3.490625 +v 1.023438 0.437500 -3.584375 +v -1.023438 0.437500 -3.584375 +v 1.250000 0.468750 -3.646875 +v -1.250000 0.468750 -3.646875 +v 1.367188 0.296875 -3.600000 +v -1.367188 0.296875 -3.600000 +v 1.312500 0.054688 -3.631250 +v -1.312500 0.054688 -3.631250 +v 1.039062 -0.085938 -3.592188 +v -1.039062 -0.085938 -3.592188 +v 0.789062 -0.125000 -3.428125 +v -0.789062 -0.125000 -3.428125 +v 0.859375 0.382812 -3.482813 +v -0.859375 0.382812 -3.482813 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn 0.6650 -0.2008 0.7194 +vn -0.6650 -0.2008 0.7194 +vn 0.8294 -0.3036 0.4689 +vn -0.8294 -0.3036 0.4689 +vn 0.4155 -0.7933 0.4449 +vn -0.4155 -0.7933 0.4449 +vn 0.3600 -0.5089 0.7820 +vn -0.3600 -0.5089 0.7820 +vn -0.0787 -0.5394 0.8384 +vn 0.0787 -0.5394 0.8384 +vn -0.2696 -0.8413 0.4685 +vn 0.2696 -0.8413 0.4685 +vn -0.7707 -0.3352 0.5420 +vn 0.7707 -0.3352 0.5420 +vn -0.4689 -0.1940 0.8617 +vn 0.4689 -0.1940 0.8617 +vn -0.4767 0.1907 0.8581 +vn 0.4767 0.1907 0.8581 +vn -0.7672 0.3264 0.5521 +vn 0.7672 0.3264 0.5521 +vn -0.2519 0.8173 0.5182 +vn 0.2519 0.8173 0.5182 +vn -0.0949 0.5696 0.8164 +vn 0.0949 0.5696 0.8164 +vn 0.3667 0.5370 0.7597 +vn -0.3667 0.5370 0.7597 +vn 0.4141 0.7672 0.4898 +vn -0.4141 0.7672 0.4898 +vn 0.8277 0.2952 0.4771 +vn -0.8277 0.2952 0.4771 +vn 0.6713 0.1971 0.7145 +vn -0.6713 0.1971 0.7145 +vn 0.8111 0.3244 -0.4867 +vn -0.8111 0.3244 -0.4867 +vn 0.2051 0.8206 -0.5334 +vn -0.2052 0.8206 -0.5334 +vn -0.4223 0.7806 -0.4607 +vn 0.4223 0.7806 -0.4607 +vn -0.8241 0.3225 -0.4658 +vn 0.8241 0.3225 -0.4658 +vn -0.8137 -0.3487 -0.4650 +vn 0.8137 -0.3487 -0.4650 +vn -0.4223 -0.7806 -0.4607 +vn 0.4223 -0.7806 -0.4607 +vn 0.2051 -0.8206 -0.5334 +vn -0.2052 -0.8206 -0.5334 +vn 0.7995 -0.3510 -0.4875 +vn -0.7995 -0.3510 -0.4875 +vn 0.4000 -0.0623 0.9144 +vn -0.4000 -0.0623 0.9144 +vn 0.3069 -0.1754 0.9354 +vn -0.3069 -0.1754 0.9354 +vn 0.0945 -0.1835 0.9785 +vn -0.0945 -0.1835 0.9785 +vn -0.0624 -0.0283 0.9977 +vn 0.0624 -0.0283 0.9977 +vn -0.0624 0.0260 0.9977 +vn 0.0624 0.0260 0.9977 +vn 0.0996 0.1729 0.9799 +vn -0.0996 0.1729 0.9799 +vn 0.3036 0.1656 0.9383 +vn -0.3036 0.1656 0.9383 +vn 0.4002 0.0572 0.9147 +vn -0.4002 0.0572 0.9147 +vn 0.1231 -0.8616 0.4924 +vn -0.1231 -0.8616 0.4924 +vn 0.2190 -0.8647 0.4520 +vn -0.2190 -0.8647 0.4520 +vn 0.5902 -0.4550 0.6668 +vn -0.5902 -0.4550 0.6668 +vn 0.7689 -0.0506 0.6374 +vn -0.7689 -0.0506 0.6374 +vn 0.7796 0.0900 0.6197 +vn -0.7796 0.0900 0.6197 +vn 0.3241 -0.8188 0.4739 +vn -0.3241 -0.8188 0.4739 +vn 0.3857 -0.6629 0.6417 +vn -0.3857 -0.6629 0.6417 +vn 0.6895 -0.4193 0.5906 +vn -0.6895 -0.4193 0.5906 +vn 0.6588 -0.3634 0.6588 +vn -0.6588 -0.3634 0.6588 +vn 0.5465 0.3707 0.7509 +vn -0.5465 0.3707 0.7509 +vn 0.5064 0.6464 0.5706 +vn -0.5064 0.6464 0.5706 +vn 0.6092 0.5167 0.6015 +vn -0.6092 0.5167 0.6015 +vn -0.0441 0.6610 0.7491 +vn 0.0441 0.6610 0.7491 +vn -0.7246 0.3187 0.6110 +vn 0.7246 0.3187 0.6110 +vn -0.5880 0.5554 0.5880 +vn 0.5880 0.5554 0.5880 +vn 0.5361 -0.3909 0.7482 +vn -0.5361 -0.3909 0.7482 +vn 0.2207 -0.4690 0.8552 +vn -0.2207 -0.4690 0.8552 +vn -0.0794 -0.5321 0.8429 +vn 0.0794 -0.5321 0.8429 +vn -0.0825 -0.6575 0.7490 +vn 0.0825 -0.6575 0.7490 +vn 0.0457 -0.5667 0.8226 +vn -0.0457 -0.5667 0.8226 +vn 0.2784 -0.2130 0.9365 +vn -0.2784 -0.2130 0.9365 +vn 0.3813 -0.1824 0.9063 +vn -0.3813 -0.1824 0.9063 +vn 0.3357 -0.2878 0.8969 +vn -0.3357 -0.2878 0.8969 +vn 0.3762 0.0603 0.9246 +vn -0.3762 0.0603 0.9246 +vn -0.1352 0.2680 0.9539 +vn 0.1352 0.2680 0.9539 +vn 0.3961 -0.4321 0.8102 +vn -0.3961 -0.4321 0.8102 +vn 0.1856 -0.2474 0.9510 +vn -0.1856 -0.2474 0.9510 +vn 0.0099 -0.1948 0.9808 +vn -0.0099 -0.1948 0.9808 +vn 0.0721 -0.6966 0.7138 +vn -0.0721 -0.6966 0.7138 +vn 0.1863 -0.5723 0.7986 +vn -0.1863 -0.5723 0.7986 +vn 0.3157 -0.2708 0.9094 +vn -0.3157 -0.2708 0.9094 +vn 0.3063 -0.0265 0.9516 +vn -0.3063 -0.0265 0.9516 +vn 0.3266 -0.1306 0.9361 +vn -0.3266 -0.1306 0.9361 +vn -0.0137 0.0574 0.9983 +vn 0.0137 0.0574 0.9983 +vn -0.0026 -0.0656 0.9978 +vn 0.0026 -0.0656 0.9978 +vn -0.0000 0.0000 1.0000 +vn 0.8174 -0.5744 -0.0442 +vn -0.8174 -0.5744 -0.0442 +vn 0.9494 0.2297 -0.2144 +vn -0.9494 0.2297 -0.2144 +vn 0.0825 0.9073 -0.4124 +vn -0.0825 0.9073 -0.4124 +vn -0.8836 0.3555 0.3047 +vn 0.8836 0.3555 0.3047 +vn 0.4207 -0.8797 0.2218 +vn -0.4207 -0.8797 0.2218 +vn 0.2873 -0.5747 0.7663 +vn -0.2873 -0.5747 0.7663 +vn -0.6542 0.6019 0.4580 +vn 0.6542 0.6019 0.4580 +vn 0.1052 0.7892 0.6051 +vn -0.1052 0.7892 0.6051 +vn 0.7582 0.2916 0.5832 +vn -0.7582 0.2916 0.5832 +vn 0.3889 -0.7130 0.5834 +vn -0.3889 -0.7130 0.5834 +vn 0.0463 0.2314 0.9718 +vn -0.0463 0.2314 0.9718 +vn 0.0335 -0.4018 0.9151 +vn -0.0335 -0.4018 0.9151 +vn -0.4452 -0.1610 0.8809 +vn 0.4452 -0.1610 0.8809 +vn -0.2182 -0.4364 0.8729 +vn 0.2182 -0.4364 0.8729 +vn 0.4341 -0.1290 0.8916 +vn -0.4341 -0.1290 0.8916 +vn 0.3008 0.0501 0.9524 +vn -0.3008 0.0501 0.9524 +vn 0.8123 0.3010 0.4996 +vn -0.8123 0.3010 0.4996 +vn 0.8753 0.2574 0.4093 +vn -0.8753 0.2574 0.4093 +vn 0.9385 0.1601 0.3060 +vn -0.9385 0.1601 0.3060 +vn 0.2237 -0.6539 0.7227 +vn -0.2237 -0.6539 0.7227 +vn -0.1536 -0.1997 0.9677 +vn 0.1536 -0.1997 0.9677 +vn -0.2733 -0.1025 0.9565 +vn 0.2733 -0.1025 0.9565 +vn -0.0976 0.1952 0.9759 +vn 0.0976 0.1952 0.9759 +vn -0.1582 0.9494 0.2713 +vn 0.1582 0.9494 0.2713 +vn -0.6934 0.7082 0.1328 +vn 0.6934 0.7082 0.1328 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.3051 -0.9450 0.1181 +vn -0.3051 -0.9450 0.1181 +vn 0.0298 -0.2981 0.9541 +vn -0.0298 -0.2981 0.9541 +vn 0.1353 -0.3479 0.9277 +vn -0.1353 -0.3479 0.9277 +vn -0.5085 -0.2755 0.8158 +vn 0.5085 -0.2755 0.8158 +vn -0.3843 -0.0419 0.9223 +vn 0.3843 -0.0419 0.9223 +vn -0.2083 0.0374 0.9774 +vn 0.2083 0.0374 0.9774 +vn -0.5721 -0.4767 0.6674 +vn 0.5721 -0.4767 0.6674 +vn -0.1369 -0.7531 0.6435 +vn 0.1369 -0.7531 0.6435 +vn 0.4088 -0.6071 0.6814 +vn -0.4088 -0.6071 0.6814 +vn 0.5740 -0.4130 0.7070 +vn -0.5740 -0.4130 0.7070 +vn 0.5665 -0.0968 0.8183 +vn -0.5665 -0.0968 0.8183 +vn 0.5703 0.1180 0.8129 +vn -0.5703 0.1180 0.8129 +vn 0.4823 0.5621 0.6719 +vn -0.4823 0.5621 0.6719 +vn 0.2604 0.6114 0.7473 +vn -0.2604 0.6114 0.7473 +vn 0.1640 0.3607 0.9182 +vn -0.1640 0.3607 0.9182 +vn -0.0178 0.2495 0.9682 +vn 0.0178 0.2495 0.9682 +vn 0.3273 -0.4166 0.8481 +vn -0.3273 -0.4166 0.8481 +vn 0.2811 -0.2610 0.9235 +vn -0.2811 -0.2610 0.9235 +vn -0.2542 -0.6514 0.7149 +vn 0.2542 -0.6514 0.7149 +vn -0.0260 -0.8455 0.5333 +vn 0.0260 -0.8455 0.5333 +vn -0.3518 -0.2606 0.8991 +vn 0.3518 -0.2606 0.8991 +vn -0.3523 -0.0110 0.9358 +vn 0.3523 -0.0110 0.9358 +vn -0.1317 0.4608 0.8777 +vn 0.1317 0.4608 0.8777 +vn -0.0342 0.6159 0.7870 +vn 0.0342 0.6159 0.7870 +vn 0.3603 0.5836 0.7277 +vn -0.3603 0.5836 0.7277 +vn 0.4988 0.5300 0.6858 +vn -0.4988 0.5300 0.6858 +vn 0.6667 -0.3333 0.6667 +vn -0.6667 -0.3333 0.6667 +vn 0.8165 -0.0731 0.5727 +vn -0.8165 -0.0731 0.5727 +vn 0.7840 0.1161 0.6098 +vn -0.7840 0.1161 0.6098 +vn -0.5306 0.8111 -0.2461 +vn 0.5306 0.8111 -0.2461 +vn -0.8511 0.3695 -0.3730 +vn 0.8511 0.3695 -0.3730 +vn -0.2446 0.8675 -0.4331 +vn 0.2446 0.8675 -0.4331 +vn 0.5924 0.7465 -0.3030 +vn -0.5924 0.7465 -0.3030 +vn 0.3685 0.8758 -0.3118 +vn -0.3685 0.8758 -0.3118 +vn 0.2821 0.9151 -0.2880 +vn -0.2821 0.9151 -0.2880 +vn 0.8561 0.1340 -0.4991 +vn -0.8561 0.1340 -0.4991 +vn 0.5342 -0.7233 -0.4376 +vn -0.5342 -0.7233 -0.4376 +vn 0.3849 -0.8131 -0.4368 +vn -0.3849 -0.8131 -0.4368 +vn 0.2335 -0.5806 -0.7800 +vn -0.2335 -0.5806 -0.7800 +vn 0.2449 -0.0583 -0.9678 +vn -0.2449 -0.0583 -0.9678 +vn 0.1163 -0.4535 -0.8837 +vn -0.1163 -0.4535 -0.8837 +vn 0.1152 -0.9836 -0.1388 +vn -0.1152 -0.9836 -0.1388 +vn 0.1184 -0.9669 -0.2260 +vn -0.1184 -0.9669 -0.2260 +vn 0.9597 -0.0085 -0.2808 +vn -0.9597 -0.0085 -0.2808 +vn 0.9319 0.1629 -0.3242 +vn -0.9319 0.1629 -0.3242 +vn 0.1626 0.0207 -0.9865 +vn -0.1626 0.0207 -0.9865 +vn -0.0188 -0.2177 -0.9758 +vn 0.0188 -0.2177 -0.9758 +vn 0.7538 -0.2926 -0.5884 +vn -0.7538 -0.2926 -0.5884 +vn 0.9196 0.1379 -0.3678 +vn -0.9196 0.1379 -0.3678 +vn 0.9297 0.3127 -0.1944 +vn -0.9297 0.3127 -0.1944 +vn 0.9120 0.3376 -0.2329 +vn -0.9120 0.3376 -0.2329 +vn 0.9407 0.3338 -0.0607 +vn -0.9407 0.3338 -0.0607 +vn 0.1761 -0.8805 -0.4402 +vn -0.1761 -0.8805 -0.4402 +vn 0.3708 -0.4733 -0.7991 +vn -0.3708 -0.4733 -0.7991 +vn 0.3107 -0.8284 -0.4660 +vn -0.3107 -0.8284 -0.4660 +vn 0.2793 -0.9515 -0.1287 +vn -0.2793 -0.9515 -0.1287 +vn 0.3139 -0.9321 -0.1807 +vn -0.3139 -0.9321 -0.1807 +vn 0.9762 -0.2083 -0.0609 +vn -0.9762 -0.2083 -0.0609 +vn 0.8267 -0.5066 0.2447 +vn -0.8267 -0.5066 0.2447 +vn 0.3449 -0.1158 -0.9315 +vn -0.3449 -0.1158 -0.9315 +vn 0.1203 0.9644 0.2355 +vn -0.1203 0.9644 0.2355 +vn 0.1275 0.9744 -0.1851 +vn -0.1275 0.9744 -0.1851 +vn 0.3492 0.5947 -0.7241 +vn -0.3492 0.5947 -0.7241 +vn 0.4153 0.8981 -0.1449 +vn -0.4153 0.8981 -0.1449 +vn 0.1845 0.7036 0.6863 +vn -0.1845 0.7036 0.6863 +vn 0.6056 0.7794 0.1608 +vn -0.6056 0.7794 0.1608 +vn 0.7033 0.6806 -0.2053 +vn -0.7033 0.6806 -0.2053 +vn 0.6679 0.2007 -0.7166 +vn -0.6679 0.2007 -0.7166 +vn 0.4948 0.4342 -0.7528 +vn -0.4948 0.4342 -0.7528 +vn 0.6423 0.7459 -0.1761 +vn -0.6423 0.7459 -0.1761 +vn 0.7182 0.6788 0.1530 +vn -0.7182 0.6788 0.1530 +vn 0.7388 0.3972 0.5444 +vn -0.7388 0.3972 0.5444 +vn 0.3428 0.9261 -0.1579 +vn -0.3428 0.9261 -0.1579 +vn 0.2270 0.5740 0.7867 +vn -0.2270 0.5740 0.7867 +vn -0.1722 0.1046 -0.9795 +vn 0.1722 0.1046 -0.9795 +vn 0.0425 0.9150 0.4013 +vn -0.0425 0.9150 0.4013 +vn -0.1616 0.1847 0.9694 +vn 0.1616 0.1847 0.9694 +vn 0.9791 0.1973 0.0483 +vn -0.9791 0.1973 0.0483 +vn 0.9470 0.0918 0.3079 +vn -0.9470 0.0918 0.3079 +vn 0.9794 0.1905 -0.0661 +vn -0.9794 0.1905 -0.0661 +vn 0.9938 0.0312 -0.1070 +vn -0.9938 0.0312 -0.1070 +vn 0.7116 -0.7008 0.0501 +vn -0.7116 -0.7008 0.0501 +vn 0.3722 -0.9243 0.0847 +vn -0.3722 -0.9243 0.0847 +vn 0.4465 -0.8644 0.2310 +vn -0.4465 -0.8644 0.2310 +vn 0.6066 -0.7578 0.2405 +vn -0.6066 -0.7578 0.2405 +vn 0.7325 -0.6368 0.2407 +vn -0.7325 -0.6368 0.2407 +vn 0.2637 -0.4499 0.8533 +vn -0.2637 -0.4499 0.8533 +vn 0.5568 -0.3181 -0.7673 +vn -0.5568 -0.3181 -0.7673 +vn 0.5004 -0.2807 -0.8190 +vn -0.5004 -0.2807 -0.8190 +vn 0.3190 -0.8494 -0.4205 +vn -0.3190 -0.8494 -0.4205 +vn 0.7198 -0.6356 -0.2793 +vn -0.7198 -0.6356 -0.2793 +vn 0.4972 -0.4408 -0.7473 +vn -0.4972 -0.4408 -0.7473 +vn 0.3506 0.3807 0.8557 +vn -0.3506 0.3807 0.8557 +vn 0.4566 0.1715 0.8730 +vn -0.4566 0.1715 0.8730 +vn 0.2583 0.1055 0.9603 +vn -0.2583 0.1055 0.9603 +vn 0.2455 -0.0802 0.9661 +vn -0.2455 -0.0802 0.9661 +vn 0.4643 -0.0599 0.8837 +vn -0.4643 -0.0599 0.8837 +vn 0.6225 -0.3045 0.7210 +vn -0.6225 -0.3045 0.7210 +vn 0.4500 0.6590 0.6027 +vn -0.4500 0.6590 0.6027 +vn -0.2667 0.8309 0.4884 +vn 0.2667 0.8309 0.4884 +vn -0.8284 0.2291 0.5111 +vn 0.8284 0.2291 0.5111 +vn -0.5251 -0.3566 0.7727 +vn 0.5251 -0.3566 0.7727 +vn 0.4546 -0.5665 0.6873 +vn -0.4546 -0.5665 0.6873 +vn 0.6996 -0.4497 0.5552 +vn -0.6996 -0.4497 0.5552 +vn 0.7220 -0.6827 -0.1126 +vn -0.7220 -0.6827 -0.1126 +vn -0.1919 0.2860 0.9388 +vn 0.1919 0.2860 0.9388 +vn 0.9048 -0.3734 -0.2047 +vn -0.9048 -0.3734 -0.2047 +vn 0.1034 0.1551 0.9825 +vn -0.1034 0.1551 0.9825 +vn 0.0841 0.9318 0.3530 +vn -0.0841 0.9318 0.3530 +vn 0.6446 -0.0883 0.7594 +vn -0.6446 -0.0883 0.7594 +vn 0.4309 0.4740 0.7678 +vn -0.4309 0.4740 0.7678 +vn 0.8032 -0.4847 0.3462 +vn -0.8032 -0.4847 0.3462 +vn 0.5811 -0.4128 0.7014 +vn -0.5811 -0.4128 0.7014 +vn 0.5910 -0.4305 0.6822 +vn -0.5910 -0.4305 0.6822 +vn 0.9818 -0.1804 -0.0591 +vn -0.9818 -0.1804 -0.0591 +vn 0.9105 -0.3965 -0.1175 +vn -0.9105 -0.3965 -0.1175 +vn 0.9972 -0.0181 -0.0725 +vn -0.9972 -0.0181 -0.0725 +vn 0.7313 -0.6543 0.1925 +vn -0.7313 -0.6543 0.1925 +vn 0.7867 -0.6079 0.1073 +vn -0.7867 -0.6079 0.1073 +vn 0.7022 -0.7022 0.1170 +vn -0.7022 -0.7022 0.1170 +vn 0.1840 0.9816 -0.0511 +vn -0.1840 0.9816 -0.0511 +vn 0.9352 0.3301 0.1284 +vn -0.9352 0.3301 0.1284 +vn 0.6633 -0.7463 0.0553 +vn -0.6633 -0.7463 0.0553 +vn -0.0085 0.9970 0.0767 +vn 0.0085 0.9970 0.0767 +vn 0.6237 -0.7061 0.3354 +vn -0.6237 -0.7061 0.3354 +vn 0.2733 -0.8925 0.3587 +vn -0.2733 -0.8925 0.3587 +vn -0.8328 -0.5080 -0.2200 +vn 0.8328 -0.5080 -0.2200 +vn -0.8339 0.2377 -0.4981 +vn 0.8339 0.2377 -0.4981 +vn -0.5655 0.7847 -0.2539 +vn 0.5655 0.7847 -0.2539 +vn -0.0560 0.9962 0.0672 +vn 0.0560 0.9962 0.0672 +vn 0.1445 0.0222 0.9893 +vn -0.1445 0.0222 0.9893 +vn 0.3275 0.0645 0.9427 +vn -0.3275 0.0645 0.9427 +vn 0.3127 0.0232 0.9496 +vn -0.3127 0.0232 0.9496 +vn 0.1710 0.0274 0.9849 +vn -0.1710 0.0274 0.9849 +vn 0.3487 0.2849 0.8929 +vn -0.3487 0.2849 0.8929 +vn 0.4006 -0.0343 0.9156 +vn -0.4006 -0.0343 0.9156 +vn 0.2572 -0.0603 0.9645 +vn -0.2572 -0.0603 0.9645 +vn 0.0637 -0.0106 0.9979 +vn -0.0637 -0.0106 0.9979 +vn -0.3637 0.7039 0.6101 +vn 0.3637 0.7039 0.6101 +vn 0.6299 0.0355 0.7759 +vn -0.6299 0.0355 0.7759 +vn 0.4472 -0.2002 0.8717 +vn -0.4472 -0.2002 0.8717 +vn 0.5072 -0.2141 0.8348 +vn -0.5072 -0.2141 0.8348 +vn 0.5258 0.2619 0.8093 +vn -0.5258 0.2619 0.8093 +vn 0.2980 0.5802 0.7580 +vn -0.2980 0.5802 0.7580 +vn 0.0930 -0.9924 -0.0805 +vn -0.0930 -0.9924 -0.0805 +vn 0.5006 -0.8657 0.0080 +vn -0.5006 -0.8657 0.0080 +vn 0.9285 -0.2497 0.2748 +vn -0.9285 -0.2497 0.2748 +vn 0.8393 0.5424 -0.0378 +vn -0.8393 0.5424 -0.0378 +vn -0.2355 0.9367 -0.2589 +vn 0.2355 0.9367 -0.2589 +vn -0.4499 0.8838 -0.1285 +vn 0.4499 0.8838 -0.1285 +vn -0.5384 -0.0098 -0.8427 +vn 0.5384 -0.0098 -0.8427 +vn -0.1910 -0.0241 -0.9813 +vn 0.1910 -0.0241 -0.9813 +vn 0.4046 0.0266 -0.9141 +vn -0.4046 0.0266 -0.9141 +vn -0.7819 0.6231 0.0197 +vn 0.7819 0.6231 0.0197 +vn 0.5428 -0.2063 -0.8142 +vn -0.5428 -0.2063 -0.8142 +vn -0.2474 -0.9231 -0.2945 +vn 0.2474 -0.9231 -0.2945 +usemtl None +s off +f 47/1/1 1/2/1 3/3/1 45/4/1 +f 4/5/2 2/6/2 48/7/2 46/8/2 +f 45/4/3 3/3/3 5/9/3 43/10/3 +f 6/11/4 4/5/4 46/8/4 44/12/4 +f 3/3/5 9/13/5 7/14/5 5/9/5 +f 8/15/6 10/16/6 4/5/6 6/11/6 +f 1/2/7 11/17/7 9/13/7 3/3/7 +f 10/16/8 12/18/8 2/6/8 4/5/8 +f 11/17/9 13/19/9 15/20/9 9/13/9 +f 16/21/10 14/22/10 12/18/10 10/16/10 +f 9/13/11 15/20/11 17/23/11 7/14/11 +f 18/24/12 16/21/12 10/16/12 8/15/12 +f 15/20/13 21/25/13 19/26/13 17/23/13 +f 20/27/14 22/28/14 16/21/14 18/24/14 +f 13/19/15 23/29/15 21/25/15 15/20/15 +f 22/28/16 24/30/16 14/22/16 16/21/16 +f 23/29/17 25/31/17 27/32/17 21/25/17 +f 28/33/18 26/34/18 24/30/18 22/28/18 +f 21/25/19 27/32/19 29/35/19 19/26/19 +f 30/36/20 28/33/20 22/28/20 20/27/20 +f 27/32/21 33/37/21 31/38/21 29/35/21 +f 32/39/22 34/40/22 28/33/22 30/36/22 +f 25/31/23 35/41/23 33/37/23 27/32/23 +f 34/40/24 36/42/24 26/34/24 28/33/24 +f 35/41/25 37/43/25 39/44/25 33/37/25 +f 40/45/26 38/46/26 36/42/26 34/40/26 +f 33/37/27 39/44/27 41/47/27 31/38/27 +f 42/48/28 40/45/28 34/40/28 32/39/28 +f 39/44/29 45/4/29 43/10/29 41/47/29 +f 44/12/30 46/8/30 40/45/30 42/48/30 +f 37/43/31 47/1/31 45/4/31 39/44/31 +f 46/8/32 48/7/32 38/46/32 40/45/32 +f 47/1/33 37/43/33 51/49/33 49/50/33 +f 52/51/34 38/46/34 48/7/34 50/52/34 +f 37/43/35 35/41/35 53/53/35 51/49/35 +f 54/54/36 36/42/36 38/46/36 52/51/36 +f 35/41/37 25/31/37 55/55/37 53/53/37 +f 56/56/38 26/34/38 36/42/38 54/54/38 +f 25/31/39 23/29/39 57/57/39 55/55/39 +f 58/58/40 24/30/40 26/34/40 56/56/40 +f 23/29/41 13/19/41 59/59/41 57/57/41 +f 60/60/42 14/22/42 24/30/42 58/58/42 +f 13/19/43 11/17/43 63/61/43 59/59/43 +f 64/62/44 12/18/44 14/22/44 60/60/44 +f 11/17/45 1/2/45 65/63/45 63/61/45 +f 66/64/46 2/6/46 12/18/46 64/62/46 +f 1/2/47 47/1/47 49/50/47 65/63/47 +f 50/52/48 48/7/48 2/6/48 66/64/48 +f 61/65/49 65/63/49 49/50/49 +f 50/52/50 66/64/50 62/66/50 +f 63/61/51 65/63/51 61/65/51 +f 62/66/52 66/64/52 64/62/52 +f 61/65/53 59/59/53 63/61/53 +f 64/62/54 60/60/54 62/66/54 +f 61/65/55 57/57/55 59/59/55 +f 60/60/56 58/58/56 62/66/56 +f 61/65/57 55/55/57 57/57/57 +f 58/58/58 56/56/58 62/66/58 +f 61/65/59 53/53/59 55/55/59 +f 56/56/60 54/54/60 62/66/60 +f 61/65/61 51/49/61 53/53/61 +f 54/54/62 52/51/62 62/66/62 +f 61/65/63 49/50/63 51/49/63 +f 52/51/64 50/52/64 62/66/64 +f 89/67/65 174/68/65 176/69/65 91/70/65 +f 176/69/66 175/71/66 90/72/66 91/70/66 +f 87/73/67 172/74/67 174/68/67 89/67/67 +f 175/71/68 173/75/68 88/76/68 90/72/68 +f 85/77/69 170/78/69 172/74/69 87/73/69 +f 173/75/70 171/79/70 86/80/70 88/76/70 +f 83/81/71 168/82/71 170/78/71 85/77/71 +f 171/79/72 169/83/72 84/84/72 86/80/72 +f 81/85/73 166/86/73 168/82/73 83/81/73 +f 169/83/74 167/87/74 82/88/74 84/84/74 +f 79/89/75 92/90/75 146/91/75 164/92/75 +f 147/93/76 93/94/76 80/95/76 165/96/76 +f 92/90/77 94/97/77 148/98/77 146/91/77 +f 149/99/78 95/100/78 93/94/78 147/93/78 +f 94/97/79 96/101/79 150/102/79 148/98/79 +f 151/103/80 97/104/80 95/100/80 149/99/80 +f 96/101/81 98/105/81 152/106/81 150/102/81 +f 153/107/82 99/108/82 97/104/82 151/103/82 +f 98/105/83 100/109/83 154/110/83 152/106/83 +f 155/111/84 101/112/84 99/108/84 153/107/84 +f 100/109/85 102/113/85 156/114/85 154/110/85 +f 157/115/86 103/116/86 101/112/86 155/111/86 +f 102/113/87 104/117/87 158/118/87 156/114/87 +f 159/119/88 105/120/88 103/116/88 157/115/88 +f 104/117/89 106/121/89 160/122/89 158/118/89 +f 161/123/90 107/124/90 105/120/90 159/119/90 +f 106/121/91 108/125/91 162/126/91 160/122/91 +f 163/127/92 109/128/92 107/124/92 161/123/92 +f 108/125/93 67/129/93 68/130/93 162/126/93 +f 68/130/94 67/129/94 109/128/94 163/127/94 +f 110/131/95 128/132/95 160/122/95 162/126/95 +f 161/123/96 129/133/96 111/134/96 163/127/96 +f 128/132/97 179/135/97 158/118/97 160/122/97 +f 159/119/98 180/136/98 129/133/98 161/123/98 +f 126/137/99 156/114/99 158/118/99 179/135/99 +f 159/119/100 157/115/100 127/138/100 180/136/100 +f 124/139/101 154/110/101 156/114/101 126/137/101 +f 157/115/102 155/111/102 125/140/102 127/138/102 +f 122/141/103 152/106/103 154/110/103 124/139/103 +f 155/111/104 153/107/104 123/142/104 125/140/104 +f 120/143/105 150/102/105 152/106/105 122/141/105 +f 153/107/106 151/103/106 121/144/106 123/142/106 +f 118/145/107 148/98/107 150/102/107 120/143/107 +f 151/103/108 149/99/108 119/146/108 121/144/108 +f 116/147/109 146/91/109 148/98/109 118/145/109 +f 149/99/110 147/93/110 117/148/110 119/146/110 +f 114/149/111 164/92/111 146/91/111 116/147/111 +f 147/93/112 165/96/112 115/150/112 117/148/112 +f 114/149/113 181/151/113 177/152/113 164/92/113 +f 177/152/114 182/153/114 115/150/114 165/96/114 +f 110/131/115 162/126/115 68/130/115 112/154/115 +f 68/130/116 163/127/116 111/134/116 113/155/116 +f 112/154/117 68/130/117 178/156/117 183/157/117 +f 178/156/118 68/130/118 113/155/118 184/158/118 +f 177/152/119 181/151/119 183/157/119 178/156/119 +f 184/158/120 182/153/120 177/152/120 178/156/120 +f 135/159/121 137/160/121 176/69/121 174/68/121 +f 176/69/122 137/160/122 136/161/122 175/71/122 +f 133/162/123 135/159/123 174/68/123 172/74/123 +f 175/71/124 136/161/124 134/163/124 173/75/124 +f 131/164/125 133/162/125 172/74/125 170/78/125 +f 173/75/126 134/163/126 132/165/126 171/79/126 +f 166/86/127 187/166/127 185/167/127 168/82/127 +f 186/168/128 188/169/128 167/87/128 169/83/128 +f 131/164/129 170/78/129 168/82/129 185/167/129 +f 169/83/130 171/79/130 132/165/130 186/168/130 +f 144/170/131 190/171/131 189/172/131 187/166/131 +f 189/172/132 190/171/132 145/173/132 188/169/132 +f 185/167/133 187/166/133 189/172/133 69/174/133 +f 189/172/134 188/169/134 186/168/134 69/174/134 +f 130/175/135 131/164/135 185/167/135 69/174/135 +f 186/168/135 132/165/135 130/175/135 69/174/135 +f 142/176/136 193/177/136 191/178/136 144/170/136 +f 192/179/137 194/180/137 143/181/137 145/173/137 +f 140/182/138 195/183/138 193/177/138 142/176/138 +f 194/180/139 196/184/139 141/185/139 143/181/139 +f 139/186/140 197/187/140 195/183/140 140/182/140 +f 196/184/141 198/188/141 139/186/141 141/185/141 +f 138/189/142 71/190/142 197/187/142 139/186/142 +f 198/188/143 71/190/143 138/189/143 139/186/143 +f 190/171/144 144/170/144 191/178/144 70/191/144 +f 192/179/145 145/173/145 190/171/145 70/191/145 +f 70/191/146 191/178/146 206/192/146 208/193/146 +f 207/194/147 192/179/147 70/191/147 208/193/147 +f 71/190/148 199/195/148 200/196/148 197/187/148 +f 201/197/149 199/195/149 71/190/149 198/188/149 +f 197/187/150 200/196/150 202/198/150 195/183/150 +f 203/199/151 201/197/151 198/188/151 196/184/151 +f 195/183/152 202/198/152 204/200/152 193/177/152 +f 205/201/153 203/199/153 196/184/153 194/180/153 +f 193/177/154 204/200/154 206/192/154 191/178/154 +f 207/194/155 205/201/155 194/180/155 192/179/155 +f 199/195/156 204/200/156 202/198/156 200/196/156 +f 203/199/157 205/201/157 199/195/157 201/197/157 +f 199/195/158 208/193/158 206/192/158 204/200/158 +f 207/194/159 208/193/159 199/195/159 205/201/159 +f 139/186/160 140/182/160 164/92/160 177/152/160 +f 165/96/161 141/185/161 139/186/161 177/152/161 +f 140/182/162 142/176/162 211/202/162 164/92/162 +f 212/203/163 143/181/163 141/185/163 165/96/163 +f 142/176/164 144/170/164 213/204/164 211/202/164 +f 214/205/165 145/173/165 143/181/165 212/203/165 +f 144/170/166 187/166/166 166/86/166 213/204/166 +f 167/87/167 188/169/167 145/173/167 214/205/167 +f 81/85/168 209/206/168 213/204/168 166/86/168 +f 214/205/169 210/207/169 82/88/169 167/87/169 +f 209/206/170 215/208/170 211/202/170 213/204/170 +f 212/203/171 216/209/171 210/207/171 214/205/171 +f 79/89/172 164/92/172 211/202/172 215/208/172 +f 212/203/173 165/96/173 80/95/173 216/209/173 +f 131/164/174 130/175/174 72/210/174 222/211/174 +f 72/210/175 130/175/175 132/165/175 223/212/175 +f 133/162/176 131/164/176 222/211/176 220/213/176 +f 223/212/177 132/165/177 134/163/177 221/214/177 +f 135/159/178 133/162/178 220/213/178 218/215/178 +f 221/214/179 134/163/179 136/161/179 219/216/179 +f 137/160/180 135/159/180 218/215/180 217/217/180 +f 219/216/181 136/161/181 137/160/181 217/217/181 +f 217/217/182 218/215/182 229/218/182 231/219/182 +f 230/220/183 219/216/183 217/217/183 231/219/183 +f 218/215/184 220/213/184 227/221/184 229/218/184 +f 228/222/185 221/214/185 219/216/185 230/220/185 +f 220/213/186 222/211/186 225/223/186 227/221/186 +f 226/224/187 223/212/187 221/214/187 228/222/187 +f 222/211/188 72/210/188 224/225/188 225/223/188 +f 224/225/189 72/210/189 223/212/189 226/224/189 +f 224/225/190 231/219/190 229/218/190 225/223/190 +f 230/220/191 231/219/191 224/225/191 226/224/191 +f 225/223/192 229/218/192 227/221/192 +f 228/222/193 230/220/193 226/224/193 +f 183/157/194 181/151/194 234/226/194 232/227/194 +f 235/228/195 182/153/195 184/158/195 233/229/195 +f 112/154/196 183/157/196 232/227/196 254/230/196 +f 233/229/197 184/158/197 113/155/197 255/231/197 +f 110/131/198 112/154/198 254/230/198 256/232/198 +f 255/231/199 113/155/199 111/134/199 257/233/199 +f 181/151/200 114/149/200 252/234/200 234/226/200 +f 253/235/201 115/150/201 182/153/201 235/228/201 +f 114/149/202 116/147/202 250/236/202 252/234/202 +f 251/237/203 117/148/203 115/150/203 253/235/203 +f 116/147/204 118/145/204 248/238/204 250/236/204 +f 249/239/205 119/146/205 117/148/205 251/237/205 +f 118/145/206 120/143/206 246/240/206 248/238/206 +f 247/241/207 121/144/207 119/146/207 249/239/207 +f 120/143/208 122/141/208 244/242/208 246/240/208 +f 245/243/209 123/142/209 121/144/209 247/241/209 +f 122/141/210 124/139/210 242/244/210 244/242/210 +f 243/245/211 125/140/211 123/142/211 245/243/211 +f 124/139/212 126/137/212 240/246/212 242/244/212 +f 241/247/213 127/138/213 125/140/213 243/245/213 +f 126/137/214 179/135/214 236/248/214 240/246/214 +f 237/249/215 180/136/215 127/138/215 241/247/215 +f 179/135/216 128/132/216 238/250/216 236/248/216 +f 239/251/217 129/133/217 180/136/217 237/249/217 +f 128/132/218 110/131/218 256/232/218 238/250/218 +f 257/233/219 111/134/219 129/133/219 239/251/219 +f 238/250/220 256/232/220 258/252/220 276/253/220 +f 259/254/221 257/233/221 239/251/221 277/255/221 +f 236/248/222 238/250/222 276/253/222 278/256/222 +f 277/255/223 239/251/223 237/249/223 279/257/223 +f 240/246/224 236/248/224 278/256/224 274/258/224 +f 279/257/225 237/249/225 241/247/225 275/259/225 +f 242/244/226 240/246/226 274/258/226 272/260/226 +f 275/259/227 241/247/227 243/245/227 273/261/227 +f 244/242/228 242/244/228 272/260/228 270/262/228 +f 273/261/229 243/245/229 245/243/229 271/263/229 +f 246/240/230 244/242/230 270/262/230 268/264/230 +f 271/263/231 245/243/231 247/241/231 269/265/231 +f 248/238/232 246/240/232 268/264/232 266/266/232 +f 269/265/233 247/241/233 249/239/233 267/267/233 +f 250/236/234 248/238/234 266/266/234 264/268/234 +f 267/267/235 249/239/235 251/237/235 265/269/235 +f 252/234/236 250/236/236 264/268/236 262/270/236 +f 265/269/237 251/237/237 253/235/237 263/271/237 +f 234/226/238 252/234/238 262/270/238 280/272/238 +f 263/271/239 253/235/239 235/228/239 281/273/239 +f 256/232/240 254/230/240 260/274/240 258/252/240 +f 261/275/241 255/231/241 257/233/241 259/254/241 +f 254/230/242 232/227/242 282/276/242 260/274/242 +f 283/277/243 233/229/243 255/231/243 261/275/243 +f 232/227/244 234/226/244 280/272/244 282/276/244 +f 281/273/245 235/228/245 233/229/245 283/277/245 +f 67/129/246 108/125/246 284/278/246 73/279/246 +f 285/280/247 109/128/247 67/129/247 73/279/247 +f 108/125/248 106/121/248 286/281/248 284/278/248 +f 287/282/249 107/124/249 109/128/249 285/280/249 +f 106/121/250 104/117/250 288/283/250 286/281/250 +f 289/284/251 105/120/251 107/124/251 287/282/251 +f 104/117/252 102/113/252 290/285/252 288/283/252 +f 291/286/253 103/116/253 105/120/253 289/284/253 +f 102/113/254 100/109/254 292/287/254 290/285/254 +f 293/288/255 101/112/255 103/116/255 291/286/255 +f 100/109/256 98/105/256 294/289/256 292/287/256 +f 295/290/257 99/108/257 101/112/257 293/288/257 +f 98/105/258 96/101/258 296/291/258 294/289/258 +f 297/292/259 97/104/259 99/108/259 295/290/259 +f 96/101/260 94/97/260 298/293/260 296/291/260 +f 299/294/261 95/100/261 97/104/261 297/292/261 +f 94/97/262 92/90/262 300/295/262 298/293/262 +f 301/296/263 93/94/263 95/100/263 299/294/263 +f 308/297/264 309/298/264 328/299/264 338/300/264 +f 329/301/265 309/302/265 308/303/265 339/304/265 +f 307/305/266 308/297/266 338/300/266 336/306/266 +f 339/304/267 308/303/267 307/307/267 337/308/267 +f 306/309/268 307/305/268 336/306/268 340/310/268 +f 337/308/269 307/307/269 306/309/269 341/311/269 +f 89/67/270 91/70/270 306/309/270 340/310/270 +f 306/309/271 91/70/271 90/72/271 341/311/271 +f 87/73/272 89/67/272 340/310/272 334/312/272 +f 341/311/273 90/72/273 88/76/273 335/313/273 +f 85/77/274 87/73/274 334/312/274 330/314/274 +f 335/313/275 88/76/275 86/80/275 331/315/275 +f 83/81/276 85/77/276 330/314/276 332/316/276 +f 331/315/277 86/80/277 84/84/277 333/317/277 +f 330/314/278 336/306/278 338/300/278 332/316/278 +f 339/304/279 337/308/279 331/315/279 333/317/279 +f 330/314/280 334/312/280 340/310/280 336/306/280 +f 341/311/281 335/313/281 331/315/281 337/308/281 +f 326/318/282 332/316/282 338/300/282 328/299/282 +f 339/304/283 333/317/283 327/319/283 329/301/283 +f 81/85/284 83/81/284 332/316/284 326/318/284 +f 333/317/285 84/84/285 82/88/285 327/319/285 +f 209/206/286 342/320/286 344/321/286 215/208/286 +f 345/322/287 343/323/287 210/207/287 216/209/287 +f 81/85/288 326/318/288 342/320/288 209/206/288 +f 343/323/289 327/319/289 82/88/289 210/207/289 +f 79/89/290 215/208/290 344/321/290 346/324/290 +f 345/322/291 216/209/291 80/95/291 347/325/291 +f 79/89/292 346/324/292 300/295/292 92/90/292 +f 301/296/293 347/325/293 80/95/293 93/94/293 +f 77/326/294 324/327/294 352/328/294 304/329/294 +f 353/330/295 325/331/295 77/332/295 304/333/295 +f 304/329/296 352/328/296 350/334/296 78/335/296 +f 351/336/297 353/330/297 304/333/297 78/337/297 +f 78/335/298 350/334/298 348/338/298 305/339/298 +f 349/340/299 351/336/299 78/337/299 305/341/299 +f 305/339/300 348/338/300 328/299/300 309/298/300 +f 329/301/301 349/340/301 305/341/301 309/302/301 +f 326/318/302 328/299/302 348/338/302 342/320/302 +f 349/340/303 329/301/303 327/319/303 343/323/303 +f 296/291/304 298/293/304 318/342/304 310/343/304 +f 319/344/305 299/294/305 297/292/305 311/345/305 +f 76/346/306 316/347/306 324/327/306 77/326/306 +f 325/331/307 317/348/307 76/349/307 77/332/307 +f 302/350/308 358/351/308 356/352/308 303/353/308 +f 357/354/309 359/355/309 302/356/309 303/357/309 +f 303/353/310 356/352/310 354/358/310 75/359/310 +f 355/360/311 357/354/311 303/357/311 75/361/311 +f 75/359/312 354/358/312 316/347/312 76/346/312 +f 317/348/313 355/360/313 75/361/313 76/349/313 +f 292/362/314 294/289/314 362/363/314 364/364/314 +f 363/365/315 295/290/315 293/366/315 365/367/315 +f 364/364/316 362/363/316 368/368/316 366/369/316 +f 369/370/317 363/365/317 365/367/317 367/371/317 +f 366/369/318 368/368/318 370/372/318 372/373/318 +f 371/374/319 369/370/319 367/371/319 373/375/319 +f 372/373/320 370/372/320 376/376/320 374/377/320 +f 377/378/321 371/374/321 373/375/321 375/379/321 +f 314/380/322 378/381/322 374/377/322 376/376/322 +f 375/379/323 379/382/323 315/383/323 377/378/323 +f 316/347/324 354/358/324 374/377/324 378/381/324 +f 375/379/325 355/360/325 317/348/325 379/382/325 +f 354/358/326 356/352/326 372/373/326 374/377/326 +f 373/375/327 357/354/327 355/360/327 375/379/327 +f 356/352/328 358/351/328 366/369/328 372/373/328 +f 367/371/329 359/355/329 357/354/329 373/375/329 +f 358/351/330 360/384/330 364/364/330 366/369/330 +f 365/367/331 361/385/331 359/355/331 367/371/331 +f 290/386/332 292/362/332 364/364/332 360/384/332 +f 365/367/333 293/366/333 291/387/333 361/385/333 +f 74/388/334 360/384/334 358/351/334 302/350/334 +f 359/355/335 361/385/335 74/389/335 302/356/335 +f 284/390/336 286/391/336 288/392/336 290/386/336 +f 289/393/337 287/394/337 285/395/337 291/387/337 +f 284/390/338 290/386/338 360/384/338 74/388/338 +f 361/385/339 291/387/339 285/395/339 74/389/339 +f 73/396/340 284/390/340 74/388/340 +f 74/389/341 285/395/341 73/397/341 +f 294/289/342 296/291/342 310/343/342 362/363/342 +f 311/345/343 297/292/343 295/290/343 363/365/343 +f 310/343/344 312/398/344 368/368/344 362/363/344 +f 369/370/345 313/399/345 311/345/345 363/365/345 +f 312/398/346 382/400/346 370/372/346 368/368/346 +f 371/374/347 383/401/347 313/399/347 369/370/347 +f 314/380/348 376/376/348 370/372/348 382/400/348 +f 371/374/349 377/378/349 315/383/349 383/401/349 +f 348/338/350 350/334/350 386/402/350 384/403/350 +f 387/404/351 351/336/351 349/340/351 385/405/351 +f 318/342/352 384/403/352 386/402/352 320/406/352 +f 387/404/353 385/405/353 319/344/353 321/407/353 +f 298/293/354 300/295/354 384/403/354 318/342/354 +f 385/405/355 301/296/355 299/294/355 319/344/355 +f 300/295/356 344/321/356 342/320/356 384/403/356 +f 343/323/357 345/322/357 301/296/357 385/405/357 +f 342/320/358 348/338/358 384/403/358 +f 385/405/359 349/340/359 343/323/359 +f 300/295/360 346/324/360 344/321/360 +f 345/322/361 347/325/361 301/296/361 +f 314/380/362 322/408/362 380/409/362 378/381/362 +f 381/410/363 323/411/363 315/383/363 379/382/363 +f 316/347/364 378/381/364 380/409/364 324/327/364 +f 381/410/365 379/382/365 317/348/365 325/331/365 +f 320/406/366 386/402/366 380/409/366 322/408/366 +f 381/410/367 387/404/367 321/407/367 323/411/367 +f 350/334/368 352/328/368 380/409/368 386/402/368 +f 381/410/369 353/330/369 351/336/369 387/404/369 +f 324/327/370 380/409/370 352/328/370 +f 353/330/371 381/410/371 325/331/371 +f 400/412/372 388/413/372 414/414/372 402/415/372 +f 415/416/373 389/417/373 401/418/373 403/419/373 +f 400/412/374 402/415/374 404/420/374 398/421/374 +f 405/422/375 403/419/375 401/418/375 399/423/375 +f 398/421/376 404/420/376 406/424/376 396/425/376 +f 407/426/377 405/422/377 399/423/377 397/427/377 +f 396/425/378 406/424/378 408/428/378 394/429/378 +f 409/430/379 407/426/379 397/427/379 395/431/379 +f 394/429/380 408/428/380 410/432/380 392/433/380 +f 411/434/381 409/430/381 395/431/381 393/435/381 +f 392/433/382 410/432/382 412/436/382 390/437/382 +f 413/438/383 411/434/383 393/435/383 391/439/383 +f 410/432/384 420/440/384 418/441/384 412/436/384 +f 419/442/385 421/443/385 411/434/385 413/438/385 +f 408/428/386 422/444/386 420/440/386 410/432/386 +f 421/443/387 423/445/387 409/430/387 411/434/387 +f 406/424/388 424/446/388 422/444/388 408/428/388 +f 423/445/389 425/447/389 407/426/389 409/430/389 +f 404/420/390 426/448/390 424/446/390 406/424/390 +f 425/447/391 427/449/391 405/422/391 407/426/391 +f 402/415/392 428/450/392 426/448/392 404/420/392 +f 427/449/393 429/451/393 403/419/393 405/422/393 +f 402/415/394 414/414/394 416/452/394 428/450/394 +f 417/453/395 415/416/395 403/419/395 429/451/395 +f 318/342/396 320/406/396 444/454/396 442/455/396 +f 445/456/397 321/407/397 319/344/397 443/457/397 +f 320/458/398 390/437/398 412/436/398 444/459/398 +f 413/438/399 391/439/399 321/460/399 445/461/399 +f 310/343/400 318/342/400 442/455/400 312/398/400 +f 443/457/401 319/344/401 311/345/401 313/399/401 +f 382/462/402 430/463/402 414/414/402 388/413/402 +f 415/416/403 431/464/403 383/465/403 389/417/403 +f 412/436/404 418/441/404 440/466/404 444/459/404 +f 441/467/405 419/442/405 413/438/405 445/461/405 +f 438/468/406 446/469/406 444/459/406 440/466/406 +f 445/461/407 447/470/407 439/471/407 441/467/407 +f 434/472/408 446/469/408 438/468/408 436/473/408 +f 439/471/409 447/470/409 435/474/409 437/475/409 +f 432/476/410 448/477/410 446/469/410 434/472/410 +f 447/470/411 449/478/411 433/479/411 435/474/411 +f 430/463/412 448/477/412 432/476/412 450/480/412 +f 433/479/413 449/478/413 431/464/413 451/481/413 +f 414/414/414 430/463/414 450/480/414 416/452/414 +f 451/481/415 431/464/415 415/416/415 417/453/415 +f 312/398/416 448/482/416 430/483/416 382/400/416 +f 431/484/417 449/485/417 313/399/417 383/401/417 +f 312/398/418 442/455/418 446/486/418 448/482/418 +f 447/487/419 443/457/419 313/399/419 449/485/419 +f 442/455/420 444/454/420 446/486/420 +f 447/487/421 445/456/421 443/457/421 +f 416/452/422 450/480/422 452/488/422 476/489/422 +f 453/490/423 451/481/423 417/453/423 477/491/423 +f 450/480/424 432/476/424 462/492/424 452/488/424 +f 463/493/425 433/479/425 451/481/425 453/490/425 +f 432/476/426 434/472/426 460/494/426 462/492/426 +f 461/495/427 435/474/427 433/479/427 463/493/427 +f 434/472/428 436/473/428 458/496/428 460/494/428 +f 459/497/429 437/475/429 435/474/429 461/495/429 +f 436/473/430 438/468/430 456/498/430 458/496/430 +f 457/499/431 439/471/431 437/475/431 459/497/431 +f 438/468/432 440/466/432 454/500/432 456/498/432 +f 455/501/433 441/467/433 439/471/433 457/499/433 +f 440/466/434 418/441/434 474/502/434 454/500/434 +f 475/503/435 419/442/435 441/467/435 455/501/435 +f 428/450/436 416/452/436 476/489/436 464/504/436 +f 477/491/437 417/453/437 429/451/437 465/505/437 +f 426/448/438 428/450/438 464/504/438 466/506/438 +f 465/505/439 429/451/439 427/449/439 467/507/439 +f 424/446/440 426/448/440 466/506/440 468/508/440 +f 467/507/441 427/449/441 425/447/441 469/509/441 +f 422/444/442 424/446/442 468/508/442 470/510/442 +f 469/509/443 425/447/443 423/445/443 471/511/443 +f 420/440/444 422/444/444 470/510/444 472/512/444 +f 471/511/445 423/445/445 421/443/445 473/513/445 +f 418/441/446 420/440/446 472/512/446 474/502/446 +f 473/513/447 421/443/447 419/442/447 475/503/447 +f 458/496/448 456/498/448 480/514/448 478/515/448 +f 481/516/449 457/499/449 459/497/449 479/517/449 +f 478/515/450 480/514/450 482/518/450 484/519/450 +f 483/520/451 481/516/451 479/517/451 485/521/451 +f 484/519/452 482/518/452 488/522/452 486/523/452 +f 489/524/453 483/520/453 485/521/453 487/525/453 +f 486/523/454 488/522/454 490/526/454 492/527/454 +f 491/528/455 489/524/455 487/525/455 493/529/455 +f 464/504/456 476/489/456 486/523/456 492/527/456 +f 487/525/457 477/491/457 465/505/457 493/529/457 +f 452/488/458 484/519/458 486/523/458 476/489/458 +f 487/525/459 485/521/459 453/490/459 477/491/459 +f 452/488/460 462/492/460 478/515/460 484/519/460 +f 479/517/461 463/493/461 453/490/461 485/521/461 +f 458/496/462 478/515/462 462/492/462 460/494/462 +f 463/493/463 479/517/463 459/497/463 461/495/463 +f 454/500/464 474/502/464 480/514/464 456/498/464 +f 481/516/465 475/503/465 455/501/465 457/499/465 +f 472/512/466 482/518/466 480/514/466 474/502/466 +f 481/516/467 483/520/467 473/513/467 475/503/467 +f 470/510/468 488/522/468 482/518/468 472/512/468 +f 483/520/469 489/524/469 471/511/469 473/513/469 +f 468/508/470 490/526/470 488/522/470 470/510/470 +f 489/524/471 491/528/471 469/509/471 471/511/471 +f 466/506/472 492/527/472 490/526/472 468/508/472 +f 491/528/473 493/529/473 467/507/473 469/509/473 +f 464/504/474 492/527/474 466/506/474 +f 467/507/475 493/529/475 465/505/475 +f 392/433/476 390/437/476 504/530/476 502/531/476 +f 505/532/477 391/439/477 393/435/477 503/533/477 +f 394/429/478 392/433/478 502/531/478 500/534/478 +f 503/533/479 393/435/479 395/431/479 501/535/479 +f 396/425/480 394/429/480 500/534/480 498/536/480 +f 501/535/481 395/431/481 397/427/481 499/537/481 +f 398/538/482 396/425/482 498/536/482 496/539/482 +f 499/537/483 397/427/483 399/540/483 497/541/483 +f 400/542/484 398/538/484 496/539/484 494/543/484 +f 497/541/485 399/540/485 401/544/485 495/545/485 +f 388/546/486 400/542/486 494/543/486 506/547/486 +f 495/545/487 401/544/487 389/548/487 507/549/487 +f 494/543/488 502/531/488 504/530/488 506/547/488 +f 505/532/489 503/533/489 495/545/489 507/549/489 +f 494/543/490 496/539/490 500/534/490 502/531/490 +f 501/535/491 497/541/491 495/545/491 503/533/491 +f 496/539/492 498/536/492 500/534/492 +f 501/535/493 499/537/493 497/541/493 +f 314/380/494 382/400/494 388/550/494 506/551/494 +f 389/548/495 383/552/495 315/553/495 507/549/495 +f 314/554/496 506/547/496 504/530/496 322/555/496 +f 505/532/497 507/549/497 315/553/497 323/556/497 +f 320/458/498 322/555/498 504/530/498 390/437/498 +f 505/532/499 323/556/499 321/460/499 391/439/499 +g Suzanne.001_Suzanne +v -1.341293 0.164062 -1.960012 +v -1.960012 0.164062 -1.341293 +v -1.352342 0.093750 -2.059449 +v -2.059449 0.093750 -1.352342 +v -1.396536 0.054688 -2.169934 +v -2.169934 0.054688 -1.396536 +v -1.507021 -0.023438 -2.004206 +v -2.004206 -0.023438 -1.507022 +v -1.435206 0.031250 -1.932391 +v -1.932390 0.031250 -1.435206 +v -1.391012 0.132812 -1.888196 +v -1.888196 0.132812 -1.391012 +v -1.435206 0.164062 -1.821905 +v -1.821905 0.164062 -1.435206 +v -1.523594 0.093750 -1.810857 +v -1.810856 0.093750 -1.523594 +v -1.623031 0.054688 -1.844002 +v -1.844002 0.054688 -1.623031 +v -1.672750 0.242188 -1.783235 +v -1.783235 0.242188 -1.672750 +v -1.567788 0.242188 -1.766662 +v -1.766662 0.242188 -1.567789 +v -1.457303 0.242188 -1.799808 +v -1.799808 0.242188 -1.457303 +v -1.435206 0.328125 -1.821905 +v -1.821905 0.328125 -1.435206 +v -1.523594 0.390625 -1.810857 +v -1.810856 0.390625 -1.523594 +v -1.623031 0.437500 -1.844002 +v -1.844002 0.437500 -1.623031 +v -1.507021 0.515625 -2.004206 +v -2.004206 0.515625 -1.507022 +v -1.435206 0.453125 -1.932391 +v -1.932390 0.453125 -1.435206 +v -1.391012 0.359375 -1.888196 +v -1.888196 0.359375 -1.391012 +v -1.341293 0.328125 -1.960012 +v -1.960012 0.328125 -1.341293 +v -1.352342 0.390625 -2.059449 +v -2.059449 0.390625 -1.352342 +v -1.396536 0.437500 -2.169934 +v -2.169934 0.437500 -1.396536 +v -1.352342 0.242188 -2.236226 +v -2.236225 0.242188 -1.352342 +v -1.319196 0.242188 -2.114691 +v -2.114691 0.242188 -1.319196 +v -1.324721 0.242188 -1.987633 +v -1.987633 0.242188 -1.324721 +v -1.308148 0.242188 -1.982109 +v -1.982109 0.242188 -1.308148 +v -1.324721 0.335938 -1.954488 +v -1.954487 0.335938 -1.324721 +v -1.374439 0.375000 -1.871624 +v -1.871623 0.375000 -1.374439 +v -1.424157 0.335938 -1.799808 +v -1.799808 0.335938 -1.424158 +v -1.451779 0.242188 -1.772187 +v -1.772187 0.242188 -1.451779 +v -1.424157 0.156250 -1.799808 +v -1.799808 0.156250 -1.424158 +v -1.357866 0.242188 -1.855051 +v -1.855051 0.242188 -1.357866 +v -1.374439 0.117188 -1.871624 +v -1.871623 0.117188 -1.374439 +v -1.324721 0.156250 -1.954488 +v -1.954487 0.156250 -1.324721 +v -1.667225 0.429688 -1.667226 +v -1.611983 0.351562 -1.611983 +v -1.672750 -0.679688 -1.672750 +v -1.639604 -0.320312 -1.639604 +v -1.628555 -0.187500 -1.628556 +v -1.683798 -0.773438 -1.683798 +v -1.766662 0.406250 -1.766662 +v -1.788759 0.570312 -1.788759 +v -2.578730 0.898438 -2.578730 +v -2.794177 0.562500 -2.794177 +v -2.777604 0.070312 -2.777604 +v -2.440623 -0.382812 -2.440624 +v -1.650653 -0.187500 -1.937915 +v -1.937915 -0.187500 -1.650653 +v -1.567788 -0.437500 -2.009730 +v -2.009730 -0.437500 -1.567789 +v -1.540167 -0.695312 -2.037352 +v -2.037352 -0.695312 -1.540167 +v -1.556740 -0.890625 -2.076022 +v -2.076021 -0.890625 -1.556740 +v -1.589885 -0.945312 -2.053925 +v -2.053924 -0.945312 -1.589886 +v -1.672750 -0.968750 -1.926866 +v -1.926866 -0.968750 -1.672750 +v -1.783235 -0.984375 -1.783235 +v -1.507021 -0.140625 -2.125740 +v -2.125740 -0.140625 -1.507022 +v -1.363390 -0.039062 -2.258323 +v -2.258322 -0.039062 -1.363391 +v -1.291575 0.148438 -2.462721 +v -2.462720 0.148438 -1.291575 +v -1.164517 0.429688 -2.379857 +v -2.379856 0.429688 -1.164517 +v -1.247381 0.484375 -2.252798 +v -2.252798 0.484375 -1.247381 +v -1.357866 0.601562 -2.053925 +v -2.053924 0.601562 -1.357866 +v -1.446254 0.757812 -1.899245 +v -1.899245 0.757812 -1.446255 +v -1.545691 0.718750 -1.766662 +v -1.766662 0.718750 -1.545691 +v -1.617507 0.492188 -1.705895 +v -1.705895 0.492188 -1.617507 +v -1.529119 0.414062 -1.761138 +v -1.761138 0.414062 -1.529119 +v -1.562264 0.304688 -1.739041 +v -1.739041 0.304688 -1.562264 +v -1.523594 0.093750 -1.810857 +v -1.810856 0.093750 -1.523594 +v -1.429682 0.015625 -1.960012 +v -1.960012 0.015625 -1.429682 +v -1.368915 0.062500 -2.064973 +v -2.064973 0.062500 -1.368915 +v -1.291575 0.187500 -2.175458 +v -2.175458 0.187500 -1.291575 +v -1.280526 0.296875 -2.186507 +v -2.186507 0.296875 -1.280527 +v -1.297099 0.375000 -2.147837 +v -2.147837 0.375000 -1.297099 +v -1.379963 0.437500 -1.987633 +v -1.987633 0.437500 -1.379963 +v -1.479400 0.468750 -1.832954 +v -1.832953 0.468750 -1.479400 +v -1.672750 -0.765625 -1.672750 +v -1.595410 -0.718750 -1.750090 +v -1.750089 -0.718750 -1.595410 +v -1.606458 -0.835938 -1.772187 +v -1.772187 -0.835938 -1.606459 +v -1.656177 -0.882812 -1.744565 +v -1.744565 -0.882812 -1.656177 +v -1.705895 -0.890625 -1.705895 +v -1.661701 -0.195312 -1.661701 +v -1.667225 -0.140625 -1.667226 +v -1.595410 -0.148438 -1.739041 +v -1.739041 -0.148438 -1.595410 +v -1.573313 -0.226562 -1.750090 +v -1.750089 -0.226562 -1.573313 +v -1.606458 -0.289062 -1.727993 +v -1.727992 -0.289062 -1.606459 +v -1.435206 -0.046875 -1.998682 +v -1.998682 -0.046875 -1.435206 +v -1.313672 0.054688 -2.186507 +v -2.186507 0.054688 -1.313672 +v -1.252905 0.203125 -2.280420 +v -2.280420 0.203125 -1.252905 +v -1.203187 0.375000 -2.252798 +v -2.252798 0.375000 -1.203187 +v -1.192138 0.414062 -2.164410 +v -2.164410 0.414062 -1.192138 +v -1.319196 0.546875 -1.937915 +v -1.937915 0.546875 -1.319196 +v -1.379963 0.640625 -1.821905 +v -1.821905 0.640625 -1.379963 +v -1.446254 0.617188 -1.733517 +v -1.733517 0.617188 -1.446255 +v -1.523594 0.429688 -1.667226 +v -1.667225 0.429688 -1.523594 +v -1.529119 -0.101562 -1.705895 +v -1.705895 -0.101562 -1.529119 +v -1.540167 -0.445312 -1.838478 +v -1.838478 -0.445312 -1.540167 +v -1.529119 -0.703125 -1.882672 +v -1.882672 -0.703125 -1.529119 +v -1.534643 -0.820312 -1.910293 +v -1.910293 -0.820312 -1.534643 +v -1.578837 -0.914062 -1.910293 +v -1.910293 -0.914062 -1.578837 +v -1.628555 -0.929688 -1.860575 +v -1.860575 -0.929688 -1.628556 +v -1.739041 -0.945312 -1.739041 +v -1.678274 0.046875 -1.678274 +v -1.650653 0.210938 -1.650653 +v -1.435206 0.476562 -1.899245 +v -1.899245 0.476562 -1.435206 +v -1.545691 0.140625 -1.777711 +v -1.777711 0.140625 -1.545691 +v -1.562264 0.210938 -1.750090 +v -1.750089 0.210938 -1.562264 +v -1.589885 -0.687500 -1.755614 +v -1.755614 -0.687500 -1.589886 +v -1.606458 -0.445312 -1.716944 +v -1.716944 -0.445312 -1.606459 +v -1.661701 -0.445312 -1.661701 +v -1.667225 -0.328125 -1.667226 +v -1.573313 -0.273438 -1.705895 +v -1.705895 -0.273438 -1.573313 +v -1.534643 -0.226562 -1.722468 +v -1.722468 -0.226562 -1.534643 +v -1.562264 -0.132812 -1.716944 +v -1.716944 -0.132812 -1.562264 +v -1.611983 -0.125000 -1.667225 +v -1.667225 -0.125000 -1.611983 +v -1.606458 -0.203125 -1.606459 +v -1.584361 -0.148438 -1.650653 +v -1.650653 -0.148438 -1.584362 +v -1.551216 -0.156250 -1.683798 +v -1.683798 -0.156250 -1.551216 +v -1.529119 -0.226562 -1.683798 +v -1.683798 -0.226562 -1.529119 +v -1.567788 -0.250000 -1.678274 +v -1.678274 -0.250000 -1.567789 +v -1.623031 -0.289062 -1.623031 +v -1.617507 -0.312500 -1.982109 +v -1.982109 -0.312500 -1.617507 +v -1.573313 -0.242188 -1.805332 +v -1.805332 -0.242188 -1.573313 +v -1.562264 -0.312500 -1.816381 +v -1.816381 -0.312500 -1.562264 +v -1.634080 -0.250000 -1.965536 +v -1.965536 -0.250000 -1.634080 +v -1.705895 -0.875000 -1.705895 +v -1.672750 -0.867188 -1.739041 +v -1.739041 -0.867188 -1.672750 +v -1.623031 -0.820312 -1.755614 +v -1.755614 -0.820312 -1.623031 +v -1.611983 -0.742188 -1.744565 +v -1.744565 -0.742188 -1.611983 +v -1.727992 -0.781250 -1.727993 +v -1.656177 -0.750000 -1.788759 +v -1.788759 -0.750000 -1.656177 +v -1.672750 -0.812500 -1.805332 +v -1.805332 -0.812500 -1.672750 +v -1.711419 -0.851562 -1.777711 +v -1.777711 -0.851562 -1.711420 +v -1.744565 -0.859375 -1.744565 +v -1.518070 0.218750 -1.761138 +v -1.761138 0.218750 -1.518070 +v -1.512546 0.156250 -1.777711 +v -1.777711 0.156250 -1.512546 +v -1.418633 0.429688 -1.893721 +v -1.893721 0.429688 -1.418633 +v -1.451779 0.421875 -1.838478 +v -1.838478 0.421875 -1.451779 +v -1.346817 0.398438 -1.943439 +v -1.943439 0.398438 -1.346818 +v -1.302623 0.351562 -2.098119 +v -2.098119 0.351562 -1.302624 +v -1.291575 0.289062 -2.120216 +v -2.120216 0.289062 -1.291575 +v -1.302623 0.195312 -2.120216 +v -2.120216 0.195312 -1.302624 +v -1.346817 0.101562 -2.020779 +v -2.020779 0.101562 -1.346818 +v -1.402060 0.062500 -1.932391 +v -1.932390 0.062500 -1.402061 +v -1.479400 0.109375 -1.799808 +v -1.799808 0.109375 -1.479400 +v -1.512546 0.296875 -1.766662 +v -1.766662 0.296875 -1.512546 +v -1.490449 0.375000 -1.788759 +v -1.788759 0.375000 -1.490449 +v -1.490449 0.359375 -1.821905 +v -1.821905 0.359375 -1.490449 +v -1.518070 0.296875 -1.794284 +v -1.794284 0.296875 -1.518070 +v -1.484924 0.125000 -1.827429 +v -1.827429 0.125000 -1.484925 +v -1.413109 0.085938 -1.943439 +v -1.943439 0.085938 -1.413109 +v -1.368915 0.117188 -2.020779 +v -2.020779 0.117188 -1.368915 +v -1.330245 0.210938 -2.103643 +v -2.103643 0.210938 -1.330245 +v -1.324720 0.281250 -2.109167 +v -2.109167 0.281250 -1.324721 +v -1.335769 0.335938 -2.087070 +v -2.087070 0.335938 -1.335769 +v -1.368915 0.390625 -1.954488 +v -1.954488 0.390625 -1.368915 +v -1.451779 0.398438 -1.849526 +v -1.849526 0.398438 -1.451779 +v -1.424157 0.406250 -1.899245 +v -1.899245 0.406250 -1.424158 +v -1.518070 0.171875 -1.805332 +v -1.805332 0.171875 -1.518070 +v -1.523594 0.226562 -1.799808 +v -1.799808 0.226562 -1.523594 +v -1.683798 0.460938 -1.838478 +v -1.838478 0.460938 -1.683798 +v -1.617507 0.664062 -1.893721 +v -1.893721 0.664062 -1.617507 +v -1.534643 0.687500 -2.009730 +v -2.009730 0.687500 -1.534643 +v -1.457303 0.554688 -2.142313 +v -2.142313 0.554688 -1.457303 +v -1.363390 0.453125 -2.324614 +v -2.324614 0.453125 -1.363391 +v -1.302623 0.406250 -2.429575 +v -2.429575 0.406250 -1.302624 +v -1.379963 0.164062 -2.473769 +v -2.473769 0.164062 -1.379963 +v -1.473876 0.000000 -2.324614 +v -2.324614 0.000000 -1.473876 +v -1.551216 -0.093750 -2.169934 +v -2.169934 -0.093750 -1.551216 +v -1.987633 0.898438 -1.987633 +v -2.247274 0.984375 -2.247274 +v -2.667119 -0.195312 -2.667119 +v -2.059449 -0.460938 -2.059449 +v -1.866099 -0.976562 -1.866099 +v -1.948963 -0.804688 -1.948963 +v -1.965536 -0.570312 -1.965536 +v -1.993157 -0.484375 -1.993158 +v -1.551216 0.234375 -2.755507 +v -2.755507 0.234375 -1.551216 +v -1.617507 0.320312 -2.832847 +v -2.832847 0.320312 -1.617507 +v -1.954487 0.265625 -3.048294 +v -3.048293 0.265625 -1.954488 +v -2.363284 0.437500 -3.015148 +v -3.015148 0.437500 -2.363284 +v -1.623031 -0.046875 -2.661594 +v -2.661594 -0.046875 -1.623031 +v -1.888196 -0.125000 -2.727886 +v -2.727885 -0.125000 -1.888196 +v -2.042876 -0.007812 -2.948857 +v -2.948856 -0.007812 -2.042876 +v -2.424051 0.054688 -2.899138 +v -2.899138 0.054688 -2.424051 +v -1.739041 -0.351562 -2.070498 +v -2.070497 -0.351562 -1.739041 +v -1.882672 -0.414062 -2.136789 +v -2.136788 -0.414062 -1.882672 +v -1.716944 -0.710938 -2.125740 +v -2.125740 -0.710938 -1.716944 +v -1.739041 -0.500000 -2.092594 +v -2.092594 -0.500000 -1.739041 +v -1.678274 -0.914062 -2.142313 +v -2.142313 -0.914062 -1.678274 +v -1.832953 -0.757812 -2.031827 +v -2.031827 -0.757812 -1.832954 +v -1.849526 -0.539062 -2.026303 +v -2.026303 -0.539062 -1.849527 +v -1.766662 -0.945312 -1.998682 +v -1.998682 -0.945312 -1.766662 +v -1.733517 -0.281250 -2.042876 +v -2.042876 -0.281250 -1.733517 +v -1.711419 -0.226562 -2.009730 +v -2.009730 -0.226562 -1.711420 +v -1.694847 -0.171875 -1.982109 +v -1.982109 -0.171875 -1.694847 +v -1.926866 -0.390625 -2.225177 +v -2.225177 -0.390625 -1.926866 +v -2.169934 -0.312500 -2.589779 +v -2.589779 -0.312500 -2.169934 +v -2.330138 -0.148438 -2.816274 +v -2.816274 -0.148438 -2.330138 +v -2.142313 0.867188 -2.783128 +v -2.783128 0.867188 -2.142313 +v -1.921342 0.929688 -2.562158 +v -2.562157 0.929688 -1.921342 +v -1.705895 0.851562 -2.346711 +v -2.346711 0.851562 -1.705895 +v -1.562264 0.523438 -2.214128 +v -2.214128 0.523438 -1.562264 +v -1.440730 0.406250 -2.468245 +v -2.468245 0.406250 -1.440730 +v -1.545691 0.453125 -2.440624 +v -2.440624 0.453125 -1.545692 +v -1.700371 0.703125 -2.606352 +v -2.606352 0.703125 -1.700371 +v -1.540167 0.562500 -2.667119 +v -2.667119 0.562500 -1.540167 +v -1.711419 0.617188 -2.838371 +v -2.838371 0.617188 -1.711420 +v -1.877148 0.750000 -2.783128 +v -2.783128 0.750000 -1.877148 +v -2.053924 0.679688 -2.959905 +v -2.959905 0.679688 -2.053925 +v -1.882672 0.539062 -3.009624 +v -3.009624 0.539062 -1.882672 +v -2.169934 0.328125 -3.042769 +v -3.042769 0.328125 -2.169934 +v -2.236225 0.023438 -2.921235 +v -2.921235 0.023438 -2.236226 +v -1.755614 0.328125 -2.915711 +v -2.915711 0.328125 -1.755614 +v -1.799808 -0.171875 -2.374332 +v -2.374332 -0.171875 -1.799808 +v -2.037352 -0.195312 -2.645022 +v -2.645021 -0.195312 -2.037352 +v -1.727992 0.406250 -2.987526 +v -2.987526 0.406250 -1.727993 +v -1.733517 -0.140625 -2.827322 +v -2.827322 -0.140625 -1.733517 +v -1.689322 -0.101562 -3.158779 +v -3.158779 -0.101562 -1.689323 +v -1.589885 0.054688 -3.401847 +v -3.401847 0.054688 -1.589886 +v -1.534643 0.320312 -3.446041 +v -3.446041 0.320312 -1.534643 +v -1.617507 0.507812 -3.363177 +v -3.363177 0.507812 -1.617507 +v -1.689322 0.476562 -3.136682 +v -3.136682 0.476562 -1.689323 +v -1.678274 0.414062 -3.114585 +v -3.114584 0.414062 -1.678274 +v -1.628555 0.437500 -3.307934 +v -3.307934 0.437500 -1.628556 +v -1.584361 0.289062 -3.374226 +v -3.374225 0.289062 -1.584362 +v -1.623031 0.078125 -3.335556 +v -3.335556 0.078125 -1.623031 +v -1.678274 -0.039062 -3.136682 +v -3.136682 -0.039062 -1.678274 +v -1.700371 -0.070312 -2.871517 +v -2.871517 -0.070312 -1.700371 +v -1.694847 0.359375 -2.998575 +v -2.998575 0.359375 -1.694847 +v -1.727992 0.304688 -3.064866 +v -3.064866 0.304688 -1.727993 +v -1.716944 -0.023438 -2.965429 +v -2.965429 -0.023438 -1.716944 +v -1.716944 0.000000 -3.186400 +v -3.186400 0.000000 -1.716944 +v -1.667225 0.093750 -3.346604 +v -3.346604 0.093750 -1.667226 +v -1.634080 0.250000 -3.379750 +v -3.379750 0.250000 -1.634080 +v -1.672750 0.359375 -3.330031 +v -3.330031 0.359375 -1.672750 +v -1.722468 0.343750 -3.169827 +v -3.169827 0.343750 -1.722468 +v -1.744565 0.289062 -2.937808 +v -2.937808 0.289062 -1.744565 +v -1.794284 0.171875 -2.976478 +v -2.976478 0.171875 -1.794284 +v -1.849526 0.093750 -2.921235 +v -2.921235 0.093750 -1.849527 +v -1.805332 0.085938 -2.965429 +v -2.965429 0.085938 -1.805332 +v -1.788759 0.015625 -2.982002 +v -2.982002 0.015625 -1.788760 +v -1.810856 -0.015625 -2.959905 +v -2.959905 -0.015625 -1.810857 +v -1.727992 0.000000 -2.755507 +v -2.755507 0.000000 -1.727993 +v -1.805332 -0.023438 -2.821798 +v -2.821798 -0.023438 -1.805332 +v -1.816381 0.039062 -2.832847 +v -2.832847 0.039062 -1.816381 +v -1.777711 0.203125 -2.904663 +v -2.904662 0.203125 -1.777711 +v -1.750089 0.242188 -3.009624 +v -3.009624 0.242188 -1.750090 +v -1.788759 0.234375 -3.048294 +v -3.048293 0.234375 -1.788760 +v -1.844002 -0.015625 -2.993051 +v -2.993051 -0.015625 -1.844002 +v -1.816381 0.015625 -3.020672 +v -3.020672 0.015625 -1.816381 +v -1.832953 0.078125 -3.004099 +v -3.004099 0.078125 -1.832954 +v -1.877148 0.093750 -2.959905 +v -2.959905 0.093750 -1.877148 +v -1.821905 0.171875 -3.015148 +v -3.015148 0.171875 -1.821905 +v -1.750089 0.328125 -3.219546 +v -3.219546 0.328125 -1.750090 +v -1.694847 0.343750 -3.374226 +v -3.374225 0.343750 -1.694847 +v -1.650652 0.242188 -3.429468 +v -3.429468 0.242188 -1.650653 +v -1.678274 0.085938 -3.390798 +v -3.390798 0.085938 -1.678274 +v -1.750089 0.000000 -3.230594 +v -3.230594 0.000000 -1.750090 +v -1.755614 -0.015625 -3.004099 +v -3.004099 -0.015625 -1.755614 +v -1.761138 0.289062 -3.109061 +v -3.109060 0.289062 -1.761138 +v -1.794284 0.109375 -3.053818 +v -3.053818 0.109375 -1.794284 +v -1.766662 0.062500 -3.092488 +v -3.092488 0.062500 -1.766662 +v -1.744565 0.125000 -3.158779 +v -3.158779 0.125000 -1.744565 +v -1.761138 0.171875 -3.120109 +v -3.120109 0.171875 -1.761138 +v -1.739041 0.234375 -3.175352 +v -3.175352 0.234375 -1.739041 +v -1.716944 0.187500 -3.208498 +v -3.208497 0.187500 -1.716944 +v -1.683798 0.210938 -3.252692 +v -3.252691 0.210938 -1.683798 +v -1.700371 0.273438 -3.236119 +v -3.236119 0.273438 -1.700371 +v -1.810856 0.437500 -3.258216 +v -3.258216 0.437500 -1.810857 +v -1.694847 0.468750 -3.462614 +v -3.462614 0.468750 -1.694847 +v -1.578837 0.296875 -3.512332 +v -3.512332 0.296875 -1.578837 +v -1.639604 0.054688 -3.495759 +v -3.495759 0.054688 -1.639604 +v -1.805332 -0.085938 -3.274789 +v -3.274788 -0.085938 -1.805332 +v -1.866099 -0.125000 -2.982002 +v -2.982002 -0.125000 -1.866099 +v -1.855051 0.382812 -3.070391 +v -3.070390 0.382812 -1.855051 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn 0.9789 -0.2008 0.0384 +vn 0.0384 -0.2008 0.9789 +vn 0.9181 -0.3036 -0.2549 +vn -0.2549 -0.3036 0.9181 +vn 0.6085 -0.7933 0.0208 +vn 0.0208 -0.7933 0.6085 +vn 0.8075 -0.5089 0.2984 +vn 0.2984 -0.5089 0.8075 +vn 0.5372 -0.5394 0.6484 +vn 0.6484 -0.5394 0.5372 +vn 0.1406 -0.8413 0.5220 +vn 0.5220 -0.8413 0.1406 +vn -0.1617 -0.3352 0.9282 +vn 0.9282 -0.3352 -0.1617 +vn 0.2777 -0.1940 0.9409 +vn 0.9409 -0.1940 0.2777 +vn 0.2697 0.1907 0.9439 +vn 0.9439 0.1907 0.2697 +vn -0.1521 0.3264 0.9329 +vn 0.9329 0.3264 -0.1521 +vn 0.1883 0.8173 0.5445 +vn 0.5445 0.8173 0.1883 +vn 0.5102 0.5696 0.6444 +vn 0.6444 0.5696 0.5102 +vn 0.7965 0.5370 0.2778 +vn 0.2779 0.5370 0.7965 +vn 0.6391 0.7672 0.0536 +vn 0.0536 0.7672 0.6391 +vn 0.9227 0.2952 -0.2479 +vn -0.2479 0.2952 0.9227 +vn 0.9799 0.1971 0.0305 +vn 0.0305 0.1971 0.9799 +vn 0.2294 0.3244 -0.9177 +vn -0.9177 0.3244 0.2294 +vn -0.2321 0.8206 -0.5222 +vn -0.5222 0.8206 -0.2321 +vn -0.6244 0.7806 -0.0271 +vn -0.0271 0.7806 -0.6244 +vn -0.9120 0.3225 0.2533 +vn 0.2534 0.3225 -0.9120 +vn -0.9042 -0.3487 0.2466 +vn 0.2466 -0.3487 -0.9042 +vn -0.6244 -0.7806 -0.0271 +vn -0.0271 -0.7806 -0.6244 +vn -0.2321 -0.8206 -0.5222 +vn -0.5222 -0.8206 -0.2321 +vn 0.2206 -0.3510 -0.9100 +vn -0.9100 -0.3510 0.2206 +vn 0.9294 -0.0623 0.3637 +vn 0.3637 -0.0623 0.9294 +vn 0.8785 -0.1754 0.4444 +vn 0.4444 -0.1754 0.8785 +vn 0.7587 -0.1835 0.6251 +vn 0.6251 -0.1835 0.7587 +vn 0.6614 -0.0283 0.7495 +vn 0.7495 -0.0283 0.6614 +vn 0.6614 0.0260 0.7496 +vn 0.7496 0.0260 0.6614 +vn 0.7633 0.1729 0.6225 +vn 0.6225 0.1729 0.7633 +vn 0.8781 0.1656 0.4488 +vn 0.4488 0.1656 0.8781 +vn 0.9297 0.0572 0.3638 +vn 0.3638 0.0572 0.9297 +vn 0.4352 -0.8616 0.2611 +vn 0.2611 -0.8616 0.4352 +vn 0.4745 -0.8647 0.1648 +vn 0.1648 -0.8647 0.4745 +vn 0.8888 -0.4550 0.0542 +vn 0.0542 -0.4550 0.8888 +vn 0.9944 -0.0506 -0.0930 +vn -0.0930 -0.0506 0.9944 +vn 0.9895 0.0900 -0.1131 +vn -0.1131 0.0900 0.9895 +vn 0.5643 -0.8188 0.1059 +vn 0.1059 -0.8188 0.5643 +vn 0.7265 -0.6629 0.1810 +vn 0.1810 -0.6629 0.7265 +vn 0.9051 -0.4193 -0.0699 +vn -0.0699 -0.4193 0.9051 +vn 0.9316 -0.3634 0.0000 +vn -0.0000 -0.3634 0.9316 +vn 0.9174 0.3707 0.1445 +vn 0.1445 0.3707 0.9174 +vn 0.7616 0.6464 0.0454 +vn 0.0454 0.6464 0.7616 +vn 0.8561 0.5167 -0.0055 +vn -0.0055 0.5167 0.8561 +vn 0.4985 0.6610 0.5609 +vn 0.5609 0.6610 0.4985 +vn -0.0803 0.3187 0.9444 +vn 0.9444 0.3187 -0.0803 +vn 0.0000 0.5554 0.8316 +vn 0.8316 0.5554 0.0000 +vn 0.9081 -0.3909 0.1500 +vn 0.1500 -0.3909 0.9081 +vn 0.7608 -0.4690 0.4487 +vn 0.4487 -0.4690 0.7608 +vn 0.5399 -0.5321 0.6522 +vn 0.6522 -0.5321 0.5399 +vn 0.4713 -0.6575 0.5879 +vn 0.5879 -0.6575 0.4713 +vn 0.6140 -0.5667 0.5494 +vn 0.5494 -0.5667 0.6140 +vn 0.8591 -0.2130 0.4653 +vn 0.4653 -0.2130 0.8591 +vn 0.9105 -0.1824 0.3712 +vn 0.3712 -0.1824 0.9105 +vn 0.8716 -0.2878 0.3968 +vn 0.3968 -0.2878 0.8716 +vn 0.9198 0.0603 0.3877 +vn 0.3877 0.0603 0.9198 +vn 0.5789 0.2680 0.7701 +vn 0.7701 0.2680 0.5789 +vn 0.8530 -0.4321 0.2928 +vn 0.2928 -0.4321 0.8530 +vn 0.8037 -0.2474 0.5412 +vn 0.5412 -0.2474 0.8037 +vn 0.7005 -0.1948 0.6865 +vn 0.6865 -0.1948 0.7005 +vn 0.5557 -0.6966 0.4538 +vn 0.4538 -0.6966 0.5557 +vn 0.6964 -0.5723 0.4329 +vn 0.4329 -0.5723 0.6964 +vn 0.8663 -0.2708 0.4198 +vn 0.4198 -0.2708 0.8663 +vn 0.8894 -0.0265 0.4563 +vn 0.4563 -0.0265 0.8894 +vn 0.8928 -0.1306 0.4310 +vn 0.4310 -0.1306 0.8928 +vn 0.6962 0.0574 0.7155 +vn 0.7155 0.0574 0.6962 +vn 0.7037 -0.0656 0.7074 +vn 0.7074 -0.0656 0.7037 +vn 0.7071 0.0000 0.7071 +vn 0.5467 -0.5744 -0.6092 +vn -0.6092 -0.5744 0.5467 +vn 0.5197 0.2297 -0.8229 +vn -0.8229 0.2297 0.5197 +vn -0.2333 0.9073 -0.3499 +vn -0.3499 0.9073 -0.2333 +vn -0.4094 0.3555 0.8403 +vn 0.8403 0.3555 -0.4094 +vn 0.4543 -0.8797 -0.1406 +vn -0.1406 -0.8797 0.4543 +vn 0.7450 -0.5747 0.3386 +vn 0.3386 -0.5747 0.7450 +vn -0.1388 0.6019 0.7864 +vn 0.7864 0.6019 -0.1388 +vn 0.5022 0.7892 0.3534 +vn 0.3534 0.7892 0.5022 +vn 0.9485 0.2916 -0.1237 +vn -0.1237 0.2916 0.9485 +vn 0.6875 -0.7130 0.1375 +vn 0.1375 -0.7130 0.6875 +vn 0.7199 0.2314 0.6544 +vn 0.6544 0.2314 0.7199 +vn 0.6708 -0.4018 0.6234 +vn 0.6234 -0.4018 0.6708 +vn 0.3081 -0.1610 0.9376 +vn 0.9376 -0.1610 0.3081 +vn 0.4629 -0.4364 0.7715 +vn 0.7715 -0.4364 0.4629 +vn 0.9374 -0.1290 0.3235 +vn 0.3235 -0.1290 0.9374 +vn 0.8861 0.0501 0.4608 +vn 0.4608 0.0501 0.8861 +vn 0.9276 0.3010 -0.2211 +vn -0.2211 0.3010 0.9276 +vn 0.9084 0.2574 -0.3295 +vn -0.3295 0.2574 0.9084 +vn 0.8800 0.1601 -0.4473 +vn -0.4473 0.1601 0.8800 +vn 0.6692 -0.6539 0.3529 +vn 0.3529 -0.6539 0.6692 +vn 0.5757 -0.1997 0.7929 +vn 0.7929 -0.1997 0.5757 +vn 0.4831 -0.1025 0.8696 +vn 0.8696 -0.1025 0.4831 +vn 0.6211 0.1952 0.7591 +vn 0.7591 0.1952 0.6211 +vn 0.0799 0.9494 0.3037 +vn 0.3037 0.9494 0.0799 +vn -0.3964 0.7082 0.5842 +vn 0.5842 0.7082 -0.3964 +vn -0.7071 -0.0000 0.7071 +vn 0.7071 -0.0000 -0.7071 +vn 0.2993 -0.9450 -0.1322 +vn -0.1322 -0.9450 0.2993 +vn 0.6957 -0.2981 0.6535 +vn 0.6535 -0.2981 0.6957 +vn 0.7517 -0.3479 0.5603 +vn 0.5603 -0.3479 0.7517 +vn 0.2173 -0.2755 0.9364 +vn 0.9364 -0.2755 0.2173 +vn 0.3804 -0.0419 0.9239 +vn 0.9239 -0.0419 0.3804 +vn 0.5438 0.0374 0.8384 +vn 0.8384 0.0374 0.5438 +vn 0.0674 -0.4767 0.8765 +vn 0.8765 -0.4767 0.0674 +vn 0.3582 -0.7531 0.5519 +vn 0.5519 -0.7531 0.3582 +vn 0.7709 -0.6071 0.1927 +vn 0.1927 -0.6071 0.7709 +vn 0.9059 -0.4130 0.0941 +vn 0.0940 -0.4130 0.9059 +vn 0.9792 -0.0968 0.1780 +vn 0.1780 -0.0968 0.9792 +vn 0.9781 0.1180 0.1715 +vn 0.1715 0.1180 0.9781 +vn 0.8161 0.5621 0.1341 +vn 0.1341 0.5621 0.8161 +vn 0.7125 0.6114 0.3443 +vn 0.3443 0.6114 0.7125 +vn 0.7652 0.3607 0.5333 +vn 0.5333 0.3607 0.7652 +vn 0.6720 0.2495 0.6972 +vn 0.6972 0.2495 0.6720 +vn 0.8312 -0.4166 0.3682 +vn 0.3682 -0.4166 0.8312 +vn 0.8518 -0.2610 0.4543 +vn 0.4543 -0.2610 0.8518 +vn 0.3258 -0.6514 0.6853 +vn 0.6853 -0.6514 0.3258 +vn 0.3587 -0.8455 0.3955 +vn 0.3955 -0.8455 0.3587 +vn 0.3870 -0.2606 0.8845 +vn 0.8845 -0.2606 0.3870 +vn 0.4126 -0.0110 0.9108 +vn 0.9108 -0.0110 0.4126 +vn 0.5275 0.4608 0.7137 +vn 0.7137 0.4608 0.5275 +vn 0.5323 0.6159 0.5807 +vn 0.5807 0.6159 0.5323 +vn 0.7693 0.5836 0.2598 +vn 0.2598 0.5836 0.7693 +vn 0.8376 0.5300 0.1323 +vn 0.1323 0.5300 0.8376 +vn 0.9428 -0.3333 -0.0000 +vn -0.0000 -0.3333 0.9428 +vn 0.9823 -0.0731 -0.1723 +vn -0.1723 -0.0731 0.9823 +vn 0.9856 0.1161 -0.1232 +vn -0.1232 0.1161 0.9856 +vn -0.5493 0.8111 0.2012 +vn 0.2012 0.8111 -0.5493 +vn -0.8655 0.3695 0.3381 +vn 0.3381 0.3695 -0.8655 +vn -0.4792 0.8675 -0.1333 +vn -0.1333 0.8675 -0.4792 +vn 0.2046 0.7465 -0.6331 +vn -0.6331 0.7465 0.2046 +vn 0.0401 0.8758 -0.4811 +vn -0.4811 0.8758 0.0401 +vn -0.0041 0.9151 -0.4031 +vn -0.4031 0.9151 -0.0041 +vn 0.2525 0.1340 -0.9583 +vn -0.9583 0.1340 0.2525 +vn 0.0683 -0.7233 -0.6872 +vn -0.6872 -0.7233 0.0683 +vn -0.0367 -0.8131 -0.5810 +vn -0.5810 -0.8131 -0.0367 +vn -0.3864 -0.5806 -0.7167 +vn -0.7167 -0.5806 -0.3864 +vn -0.5112 -0.0583 -0.8575 +vn -0.8575 -0.0583 -0.5112 +vn -0.5426 -0.4535 -0.7071 +vn -0.7071 -0.4535 -0.5426 +vn -0.0167 -0.9836 -0.1796 +vn -0.1796 -0.9836 -0.0167 +vn -0.0761 -0.9669 -0.2435 +vn -0.2435 -0.9669 -0.0761 +vn 0.4801 -0.0085 -0.8772 +vn -0.8772 -0.0085 0.4801 +vn 0.4297 0.1629 -0.8882 +vn -0.8882 0.1629 0.4297 +vn -0.5826 0.0207 -0.8125 +vn -0.8125 0.0207 -0.5826 +vn -0.7033 -0.2177 -0.6768 +vn -0.6768 -0.2177 -0.7033 +vn 0.1169 -0.2926 -0.9491 +vn -0.9491 -0.2926 0.1169 +vn 0.3902 0.1379 -0.9104 +vn -0.9104 0.1379 0.3902 +vn 0.5200 0.3127 -0.7949 +vn -0.7949 0.3127 0.5200 +vn 0.4802 0.3376 -0.8095 +vn -0.8095 0.3376 0.4802 +vn 0.6223 0.3338 -0.7081 +vn -0.7081 0.3338 0.6223 +vn -0.1868 -0.8805 -0.4358 +vn -0.4358 -0.8805 -0.1868 +vn -0.3029 -0.4733 -0.8272 +vn -0.8272 -0.4733 -0.3029 +vn -0.1098 -0.8284 -0.5492 +vn -0.5492 -0.8284 -0.1098 +vn 0.1065 -0.9515 -0.2885 +vn -0.2885 -0.9515 0.1065 +vn 0.0942 -0.9321 -0.3497 +vn -0.3497 -0.9321 0.0942 +vn 0.6472 -0.2083 -0.7333 +vn -0.7333 -0.2083 0.6472 +vn 0.7576 -0.5066 -0.4115 +vn -0.4115 -0.5066 0.7576 +vn -0.4148 -0.1158 -0.9025 +vn -0.9025 -0.1158 -0.4148 +vn 0.2516 0.9644 0.0815 +vn 0.0815 0.9644 0.2516 +vn -0.0407 0.9744 -0.2211 +vn -0.2211 0.9744 -0.0407 +vn -0.2651 0.5947 -0.7590 +vn -0.7590 0.5947 -0.2651 +vn 0.1912 0.8981 -0.3961 +vn -0.3961 0.8981 0.1912 +vn 0.6157 0.7036 0.3548 +vn 0.3548 0.7036 0.6157 +vn 0.5419 0.7794 -0.3145 +vn -0.3145 0.7794 0.5419 +vn 0.3522 0.6806 -0.6425 +vn -0.6425 0.6806 0.3522 +vn -0.0344 0.2007 -0.9790 +vn -0.9790 0.2007 -0.0344 +vn -0.1824 0.4342 -0.8821 +vn -0.8821 0.4342 -0.1824 +vn 0.3297 0.7459 -0.5787 +vn -0.5787 0.7459 0.3297 +vn 0.6160 0.6788 -0.3997 +vn -0.3997 0.6788 0.6160 +vn 0.9074 0.3972 -0.1375 +vn -0.1375 0.3972 0.9074 +vn 0.1307 0.9261 -0.3540 +vn -0.3540 0.9261 0.1307 +vn 0.7168 0.5740 0.3958 +vn 0.3958 0.5740 0.7168 +vn -0.8144 0.1046 -0.5708 +vn -0.5708 0.1046 -0.8144 +vn 0.3138 0.9150 0.2538 +vn 0.2538 0.9150 0.3138 +vn 0.5712 0.1847 0.7997 +vn 0.7997 0.1847 0.5712 +vn 0.7265 0.1973 -0.6582 +vn -0.6582 0.1973 0.7265 +vn 0.8873 0.0918 -0.4519 +vn -0.4519 0.0918 0.8873 +vn 0.6458 0.1905 -0.7393 +vn -0.7393 0.1905 0.6458 +vn 0.6271 0.0312 -0.7783 +vn -0.7783 0.0312 0.6271 +vn 0.5385 -0.7008 -0.4678 +vn -0.4678 -0.7008 0.5385 +vn 0.3230 -0.9243 -0.2033 +vn -0.2033 -0.9243 0.3230 +vn 0.4791 -0.8644 -0.1524 +vn -0.1524 -0.8644 0.4791 +vn 0.5990 -0.7578 -0.2589 +vn -0.2589 -0.7578 0.5990 +vn 0.6881 -0.6368 -0.3478 +vn -0.3478 -0.6368 0.6881 +vn 0.7898 -0.4499 0.4169 +vn 0.4169 -0.4499 0.7898 +vn -0.1489 -0.3181 -0.9363 +vn -0.9363 -0.3181 -0.1489 +vn -0.2253 -0.2807 -0.9330 +vn -0.9330 -0.2807 -0.2253 +vn -0.0718 -0.8494 -0.5229 +vn -0.5229 -0.8494 -0.0718 +vn 0.3114 -0.6356 -0.7064 +vn -0.7064 -0.6356 0.3114 +vn -0.1769 -0.4408 -0.8800 +vn -0.8800 -0.4408 -0.1769 +vn 0.8529 0.3807 0.3572 +vn 0.3572 0.3807 0.8529 +vn 0.9401 0.1715 0.2945 +vn 0.2945 0.1715 0.9401 +vn 0.8617 0.1055 0.4964 +vn 0.4964 0.1055 0.8617 +vn 0.8567 -0.0802 0.5095 +vn 0.5095 -0.0802 0.8567 +vn 0.9531 -0.0599 0.2965 +vn 0.2965 -0.0599 0.9531 +vn 0.9500 -0.3045 0.0697 +vn 0.0697 -0.3045 0.9500 +vn 0.7444 0.6590 0.1080 +vn 0.1080 0.6590 0.7444 +vn 0.1568 0.8309 0.5339 +vn 0.5339 0.8309 0.1568 +vn -0.2243 0.2291 0.9472 +vn 0.9472 0.2291 -0.2243 +vn 0.1751 -0.3566 0.9177 +vn 0.9177 -0.3566 0.1751 +vn 0.8075 -0.5665 0.1645 +vn 0.1645 -0.5665 0.8075 +vn 0.8873 -0.4497 -0.1021 +vn -0.1021 -0.4497 0.8873 +vn 0.4309 -0.6827 -0.5902 +vn -0.5902 -0.6827 0.4309 +vn 0.5282 0.2860 0.7995 +vn 0.7995 0.2860 0.5282 +vn 0.4950 -0.3734 -0.7846 +vn -0.7846 -0.3734 0.4950 +vn 0.7678 0.1551 0.6216 +vn 0.6216 0.1551 0.7678 +vn 0.3091 0.9318 0.1902 +vn 0.1902 0.9318 0.3091 +vn 0.9928 -0.0883 0.0812 +vn 0.0812 -0.0883 0.9928 +vn 0.8477 0.4740 0.2382 +vn 0.2382 0.4740 0.8477 +vn 0.8128 -0.4847 -0.3232 +vn -0.3232 -0.4847 0.8128 +vn 0.9068 -0.4128 0.0850 +vn 0.0850 -0.4128 0.9068 +vn 0.9003 -0.4305 0.0645 +vn 0.0645 -0.4305 0.9003 +vn 0.6524 -0.1804 -0.7361 +vn -0.7361 -0.1804 0.6524 +vn 0.5607 -0.3965 -0.7269 +vn -0.7269 -0.3965 0.5607 +vn 0.6538 -0.0181 -0.7564 +vn -0.7564 -0.0181 0.6538 +vn 0.6532 -0.6543 -0.3810 +vn -0.3810 -0.6543 0.6532 +vn 0.6322 -0.6079 -0.4804 +vn -0.4804 -0.6079 0.6322 +vn 0.5793 -0.7022 -0.4138 +vn -0.4138 -0.7022 0.5793 +vn 0.0940 0.9816 -0.1663 +vn -0.1663 0.9816 0.0940 +vn 0.7520 0.3301 -0.5705 +vn -0.5705 0.3301 0.7520 +vn 0.5081 -0.7463 -0.4300 +vn -0.4300 -0.7463 0.5081 +vn 0.0482 0.9970 0.0603 +vn 0.0603 0.9970 0.0482 +vn 0.6782 -0.7061 -0.2039 +vn -0.2039 -0.7061 0.6782 +vn 0.4469 -0.8925 0.0604 +vn 0.0604 -0.8925 0.4469 +vn -0.7444 -0.5080 0.4333 +vn 0.4333 -0.5080 -0.7444 +vn -0.9419 0.2377 0.2375 +vn 0.2375 0.2377 -0.9419 +vn -0.5794 0.7847 0.2203 +vn 0.2203 0.7847 -0.5794 +vn 0.0079 0.9962 0.0871 +vn 0.0871 0.9962 0.0079 +vn 0.8017 0.0222 0.5973 +vn 0.5973 0.0222 0.8017 +vn 0.8981 0.0645 0.4350 +vn 0.4350 0.0645 0.8981 +vn 0.8925 0.0232 0.4504 +vn 0.4504 0.0232 0.8925 +vn 0.8173 0.0274 0.5755 +vn 0.5755 0.0274 0.8173 +vn 0.8779 0.2849 0.3848 +vn 0.3848 0.2849 0.8779 +vn 0.9307 -0.0343 0.3642 +vn 0.3642 -0.0343 0.9307 +vn 0.8639 -0.0603 0.5001 +vn 0.5001 -0.0603 0.8639 +vn 0.7507 -0.0106 0.6606 +vn 0.6606 -0.0106 0.7507 +vn 0.1742 0.7039 0.6886 +vn 0.6886 0.7039 0.1742 +vn 0.9940 0.0355 0.1032 +vn 0.1032 0.0355 0.9940 +vn 0.9326 -0.2002 0.3002 +vn 0.3002 -0.2002 0.9326 +vn 0.9489 -0.2141 0.2317 +vn 0.2317 -0.2141 0.9489 +vn 0.9440 0.2619 0.2004 +vn 0.2004 0.2619 0.9440 +vn 0.7467 0.5802 0.3253 +vn 0.3253 0.5802 0.7467 +vn 0.0089 -0.9924 -0.1227 +vn -0.1227 -0.9924 0.0089 +vn 0.3596 -0.8657 -0.3483 +vn -0.3483 -0.8657 0.3596 +vn 0.8509 -0.2497 -0.4623 +vn -0.4623 -0.2497 0.8509 +vn 0.5667 0.5424 -0.6202 +vn -0.6202 0.5424 0.5667 +vn -0.3496 0.9367 -0.0165 +vn -0.0165 0.9367 -0.3496 +vn -0.4090 0.8838 0.2272 +vn 0.2272 0.8838 -0.4090 +vn -0.9765 -0.0098 -0.2152 +vn -0.2152 -0.0098 -0.9765 +vn -0.8290 -0.0241 -0.5588 +vn -0.5588 -0.0241 -0.8290 +vn -0.3603 0.0266 -0.9325 +vn -0.9325 0.0266 -0.3603 +vn -0.5390 0.6231 0.5668 +vn 0.5668 0.6231 -0.5390 +vn -0.1919 -0.2063 -0.9595 +vn -0.9595 -0.2063 -0.1919 +vn -0.3832 -0.9231 -0.0333 +vn -0.0333 -0.9231 -0.3832 +usemtl None +s off +f 554/557/500 508/558/500 510/559/500 552/560/500 +f 511/561/501 509/562/501 555/563/501 553/564/501 +f 552/560/502 510/559/502 512/565/502 550/566/502 +f 513/567/503 511/561/503 553/564/503 551/568/503 +f 510/559/504 516/569/504 514/570/504 512/565/504 +f 515/571/505 517/572/505 511/561/505 513/567/505 +f 508/558/506 518/573/506 516/569/506 510/559/506 +f 517/572/507 519/574/507 509/562/507 511/561/507 +f 518/573/508 520/575/508 522/576/508 516/569/508 +f 523/577/509 521/578/509 519/574/509 517/572/509 +f 516/569/510 522/576/510 524/579/510 514/570/510 +f 525/580/511 523/577/511 517/572/511 515/571/511 +f 522/576/512 528/581/512 526/582/512 524/579/512 +f 527/583/513 529/584/513 523/577/513 525/580/513 +f 520/575/514 530/585/514 528/581/514 522/576/514 +f 529/584/515 531/586/515 521/578/515 523/577/515 +f 530/585/516 532/587/516 534/588/516 528/581/516 +f 535/589/517 533/590/517 531/586/517 529/584/517 +f 528/581/518 534/588/518 536/591/518 526/582/518 +f 537/592/519 535/589/519 529/584/519 527/583/519 +f 534/588/520 540/593/520 538/594/520 536/591/520 +f 539/595/521 541/596/521 535/589/521 537/592/521 +f 532/587/522 542/597/522 540/593/522 534/588/522 +f 541/596/523 543/598/523 533/590/523 535/589/523 +f 542/597/524 544/599/524 546/600/524 540/593/524 +f 547/601/525 545/602/525 543/598/525 541/596/525 +f 540/593/526 546/600/526 548/603/526 538/594/526 +f 549/604/527 547/601/527 541/596/527 539/595/527 +f 546/600/528 552/560/528 550/566/528 548/603/528 +f 551/568/529 553/564/529 547/601/529 549/604/529 +f 544/599/530 554/557/530 552/560/530 546/600/530 +f 553/564/531 555/563/531 545/602/531 547/601/531 +f 554/557/532 544/599/532 558/605/532 556/606/532 +f 559/607/533 545/602/533 555/563/533 557/608/533 +f 544/599/534 542/597/534 560/609/534 558/605/534 +f 561/610/535 543/598/535 545/602/535 559/607/535 +f 542/597/536 532/587/536 562/611/536 560/609/536 +f 563/612/537 533/590/537 543/598/537 561/610/537 +f 532/587/538 530/585/538 564/613/538 562/611/538 +f 565/614/539 531/586/539 533/590/539 563/612/539 +f 530/585/540 520/575/540 566/615/540 564/613/540 +f 567/616/541 521/578/541 531/586/541 565/614/541 +f 520/575/542 518/573/542 570/617/542 566/615/542 +f 571/618/543 519/574/543 521/578/543 567/616/543 +f 518/573/544 508/558/544 572/619/544 570/617/544 +f 573/620/545 509/562/545 519/574/545 571/618/545 +f 508/558/546 554/557/546 556/606/546 572/619/546 +f 557/608/547 555/563/547 509/562/547 573/620/547 +f 568/621/548 572/619/548 556/606/548 +f 557/608/549 573/620/549 569/622/549 +f 570/617/550 572/619/550 568/621/550 +f 569/622/551 573/620/551 571/618/551 +f 568/621/552 566/615/552 570/617/552 +f 571/618/553 567/616/553 569/622/553 +f 568/621/554 564/613/554 566/615/554 +f 567/616/555 565/614/555 569/622/555 +f 568/621/556 562/611/556 564/613/556 +f 565/614/557 563/612/557 569/622/557 +f 568/621/558 560/609/558 562/611/558 +f 563/612/559 561/610/559 569/622/559 +f 568/621/560 558/605/560 560/609/560 +f 561/610/561 559/607/561 569/622/561 +f 568/621/562 556/606/562 558/605/562 +f 559/607/563 557/608/563 569/622/563 +f 596/623/564 681/624/564 683/625/564 598/626/564 +f 683/625/565 682/627/565 597/628/565 598/626/565 +f 594/629/566 679/630/566 681/624/566 596/623/566 +f 682/627/567 680/631/567 595/632/567 597/628/567 +f 592/633/568 677/634/568 679/630/568 594/629/568 +f 680/631/569 678/635/569 593/636/569 595/632/569 +f 590/637/570 675/638/570 677/634/570 592/633/570 +f 678/635/571 676/639/571 591/640/571 593/636/571 +f 588/641/572 673/642/572 675/638/572 590/637/572 +f 676/639/573 674/643/573 589/644/573 591/640/573 +f 586/645/574 599/646/574 653/647/574 671/648/574 +f 654/649/575 600/650/575 587/651/575 672/652/575 +f 599/646/576 601/653/576 655/654/576 653/647/576 +f 656/655/577 602/656/577 600/650/577 654/649/577 +f 601/653/578 603/657/578 657/658/578 655/654/578 +f 658/659/579 604/660/579 602/656/579 656/655/579 +f 603/657/580 605/661/580 659/662/580 657/658/580 +f 660/663/581 606/664/581 604/660/581 658/659/581 +f 605/661/582 607/665/582 661/666/582 659/662/582 +f 662/667/583 608/668/583 606/664/583 660/663/583 +f 607/665/584 609/669/584 663/670/584 661/666/584 +f 664/671/585 610/672/585 608/668/585 662/667/585 +f 609/669/586 611/673/586 665/674/586 663/670/586 +f 666/675/587 612/676/587 610/672/587 664/671/587 +f 611/673/588 613/677/588 667/678/588 665/674/588 +f 668/679/589 614/680/589 612/676/589 666/675/589 +f 613/677/590 615/681/590 669/682/590 667/678/590 +f 670/683/591 616/684/591 614/680/591 668/679/591 +f 615/681/592 574/685/592 575/686/592 669/682/592 +f 575/686/593 574/685/593 616/684/593 670/683/593 +f 617/687/594 635/688/594 667/678/594 669/682/594 +f 668/679/595 636/689/595 618/690/595 670/683/595 +f 635/688/596 686/691/596 665/674/596 667/678/596 +f 666/675/597 687/692/597 636/689/597 668/679/597 +f 633/693/598 663/670/598 665/674/598 686/691/598 +f 666/675/599 664/671/599 634/694/599 687/692/599 +f 631/695/600 661/666/600 663/670/600 633/693/600 +f 664/671/601 662/667/601 632/696/601 634/694/601 +f 629/697/602 659/662/602 661/666/602 631/695/602 +f 662/667/603 660/663/603 630/698/603 632/696/603 +f 627/699/604 657/658/604 659/662/604 629/697/604 +f 660/663/605 658/659/605 628/700/605 630/698/605 +f 625/701/606 655/654/606 657/658/606 627/699/606 +f 658/659/607 656/655/607 626/702/607 628/700/607 +f 623/703/608 653/647/608 655/654/608 625/701/608 +f 656/655/609 654/649/609 624/704/609 626/702/609 +f 621/705/610 671/648/610 653/647/610 623/703/610 +f 654/649/611 672/652/611 622/706/611 624/704/611 +f 621/705/612 688/707/612 684/708/612 671/648/612 +f 684/708/613 689/709/613 622/706/613 672/652/613 +f 617/687/614 669/682/614 575/686/614 619/710/614 +f 575/686/615 670/683/615 618/690/615 620/711/615 +f 619/710/616 575/686/616 685/712/616 690/713/616 +f 685/712/617 575/686/617 620/711/617 691/714/617 +f 684/708/618 688/707/618 690/713/618 685/712/618 +f 691/714/619 689/709/619 684/708/619 685/712/619 +f 642/715/620 644/716/620 683/625/620 681/624/620 +f 683/625/621 644/716/621 643/717/621 682/627/621 +f 640/718/622 642/715/622 681/624/622 679/630/622 +f 682/627/623 643/717/623 641/719/623 680/631/623 +f 638/720/624 640/718/624 679/630/624 677/634/624 +f 680/631/625 641/719/625 639/721/625 678/635/625 +f 673/642/626 694/722/626 692/723/626 675/638/626 +f 693/724/627 695/725/627 674/643/627 676/639/627 +f 638/720/628 677/634/628 675/638/628 692/723/628 +f 676/639/629 678/635/629 639/721/629 693/724/629 +f 651/726/630 697/727/630 696/728/630 694/722/630 +f 696/728/631 697/727/631 652/729/631 695/725/631 +f 692/723/632 694/722/632 696/728/632 576/730/632 +f 696/728/633 695/725/633 693/724/633 576/730/633 +f 637/731/634 638/720/634 692/723/634 576/730/634 +f 693/724/634 639/721/634 637/731/634 576/730/634 +f 649/732/635 700/733/635 698/734/635 651/726/635 +f 699/735/636 701/736/636 650/737/636 652/729/636 +f 647/738/637 702/739/637 700/733/637 649/732/637 +f 701/736/638 703/740/638 648/741/638 650/737/638 +f 646/742/639 704/743/639 702/739/639 647/738/639 +f 703/740/640 705/744/640 646/742/640 648/741/640 +f 645/745/641 578/746/641 704/743/641 646/742/641 +f 705/744/642 578/746/642 645/745/642 646/742/642 +f 697/727/643 651/726/643 698/734/643 577/747/643 +f 699/735/644 652/729/644 697/727/644 577/747/644 +f 577/747/645 698/734/645 713/748/645 715/749/645 +f 714/750/646 699/735/646 577/747/646 715/749/646 +f 578/746/647 706/751/647 707/752/647 704/743/647 +f 708/753/648 706/751/648 578/746/648 705/744/648 +f 704/743/649 707/752/649 709/754/649 702/739/649 +f 710/755/650 708/753/650 705/744/650 703/740/650 +f 702/739/651 709/754/651 711/756/651 700/733/651 +f 712/757/652 710/755/652 703/740/652 701/736/652 +f 700/733/653 711/756/653 713/748/653 698/734/653 +f 714/750/654 712/757/654 701/736/654 699/735/654 +f 706/751/655 711/756/655 709/754/655 707/752/655 +f 710/755/656 712/757/656 706/751/656 708/753/656 +f 706/751/657 715/749/657 713/748/657 711/756/657 +f 714/750/658 715/749/658 706/751/658 712/757/658 +f 646/742/659 647/738/659 671/648/659 684/708/659 +f 672/652/660 648/741/660 646/742/660 684/708/660 +f 647/738/661 649/732/661 718/758/661 671/648/661 +f 719/759/662 650/737/662 648/741/662 672/652/662 +f 649/732/663 651/726/663 720/760/663 718/758/663 +f 721/761/664 652/729/664 650/737/664 719/759/664 +f 651/726/665 694/722/665 673/642/665 720/760/665 +f 674/643/666 695/725/666 652/729/666 721/761/666 +f 588/641/667 716/762/667 720/760/667 673/642/667 +f 721/761/668 717/763/668 589/644/668 674/643/668 +f 716/762/669 722/764/669 718/758/669 720/760/669 +f 719/759/670 723/765/670 717/763/670 721/761/670 +f 586/645/671 671/648/671 718/758/671 722/764/671 +f 719/759/672 672/652/672 587/651/672 723/765/672 +f 638/720/673 637/731/673 579/766/673 729/767/673 +f 579/766/674 637/731/674 639/721/674 730/768/674 +f 640/718/675 638/720/675 729/767/675 727/769/675 +f 730/768/676 639/721/676 641/719/676 728/770/676 +f 642/715/677 640/718/677 727/769/677 725/771/677 +f 728/770/678 641/719/678 643/717/678 726/772/678 +f 644/716/679 642/715/679 725/771/679 724/773/679 +f 726/772/680 643/717/680 644/716/680 724/773/680 +f 724/773/681 725/771/681 736/774/681 738/775/681 +f 737/776/682 726/772/682 724/773/682 738/775/682 +f 725/771/683 727/769/683 734/777/683 736/774/683 +f 735/778/684 728/770/684 726/772/684 737/776/684 +f 727/769/685 729/767/685 732/779/685 734/777/685 +f 733/780/686 730/768/686 728/770/686 735/778/686 +f 729/767/687 579/766/687 731/781/687 732/779/687 +f 731/781/688 579/766/688 730/768/688 733/780/688 +f 731/781/689 738/775/689 736/774/689 732/779/689 +f 737/776/690 738/775/690 731/781/690 733/780/690 +f 732/779/691 736/774/691 734/777/691 +f 735/778/692 737/776/692 733/780/692 +f 690/713/693 688/707/693 741/782/693 739/783/693 +f 742/784/694 689/709/694 691/714/694 740/785/694 +f 619/710/695 690/713/695 739/783/695 761/786/695 +f 740/785/696 691/714/696 620/711/696 762/787/696 +f 617/687/697 619/710/697 761/786/697 763/788/697 +f 762/787/698 620/711/698 618/690/698 764/789/698 +f 688/707/699 621/705/699 759/790/699 741/782/699 +f 760/791/700 622/706/700 689/709/700 742/784/700 +f 621/705/701 623/703/701 757/792/701 759/790/701 +f 758/793/702 624/704/702 622/706/702 760/791/702 +f 623/703/703 625/701/703 755/794/703 757/792/703 +f 756/795/704 626/702/704 624/704/704 758/793/704 +f 625/701/705 627/699/705 753/796/705 755/794/705 +f 754/797/706 628/700/706 626/702/706 756/795/706 +f 627/699/707 629/697/707 751/798/707 753/796/707 +f 752/799/708 630/698/708 628/700/708 754/797/708 +f 629/697/709 631/695/709 749/800/709 751/798/709 +f 750/801/710 632/696/710 630/698/710 752/799/710 +f 631/695/711 633/693/711 747/802/711 749/800/711 +f 748/803/712 634/694/712 632/696/712 750/801/712 +f 633/693/713 686/691/713 743/804/713 747/802/713 +f 744/805/714 687/692/714 634/694/714 748/803/714 +f 686/691/715 635/688/715 745/806/715 743/804/715 +f 746/807/716 636/689/716 687/692/716 744/805/716 +f 635/688/717 617/687/717 763/788/717 745/806/717 +f 764/789/718 618/690/718 636/689/718 746/807/718 +f 745/806/719 763/788/719 765/808/719 783/809/719 +f 766/810/720 764/789/720 746/807/720 784/811/720 +f 743/804/721 745/806/721 783/809/721 785/812/721 +f 784/811/722 746/807/722 744/805/722 786/813/722 +f 747/802/723 743/804/723 785/812/723 781/814/723 +f 786/813/724 744/805/724 748/803/724 782/815/724 +f 749/800/725 747/802/725 781/814/725 779/816/725 +f 782/815/726 748/803/726 750/801/726 780/817/726 +f 751/798/727 749/800/727 779/816/727 777/818/727 +f 780/817/728 750/801/728 752/799/728 778/819/728 +f 753/796/729 751/798/729 777/818/729 775/820/729 +f 778/819/730 752/799/730 754/797/730 776/821/730 +f 755/794/731 753/796/731 775/820/731 773/822/731 +f 776/821/732 754/797/732 756/795/732 774/823/732 +f 757/792/733 755/794/733 773/822/733 771/824/733 +f 774/823/734 756/795/734 758/793/734 772/825/734 +f 759/790/735 757/792/735 771/824/735 769/826/735 +f 772/825/736 758/793/736 760/791/736 770/827/736 +f 741/782/737 759/790/737 769/826/737 787/828/737 +f 770/827/738 760/791/738 742/784/738 788/829/738 +f 763/788/739 761/786/739 767/830/739 765/808/739 +f 768/831/740 762/787/740 764/789/740 766/810/740 +f 761/786/741 739/783/741 789/832/741 767/830/741 +f 790/833/742 740/785/742 762/787/742 768/831/742 +f 739/783/743 741/782/743 787/828/743 789/832/743 +f 788/829/744 742/784/744 740/785/744 790/833/744 +f 574/685/745 615/681/745 791/834/745 580/835/745 +f 792/836/746 616/684/746 574/685/746 580/835/746 +f 615/681/747 613/677/747 793/837/747 791/834/747 +f 794/838/748 614/680/748 616/684/748 792/836/748 +f 613/677/749 611/673/749 795/839/749 793/837/749 +f 796/840/750 612/676/750 614/680/750 794/838/750 +f 611/673/751 609/669/751 797/841/751 795/839/751 +f 798/842/752 610/672/752 612/676/752 796/840/752 +f 609/669/753 607/665/753 799/843/753 797/841/753 +f 800/844/754 608/668/754 610/672/754 798/842/754 +f 607/665/755 605/661/755 801/845/755 799/843/755 +f 802/846/756 606/664/756 608/668/756 800/844/756 +f 605/661/757 603/657/757 803/847/757 801/845/757 +f 804/848/758 604/660/758 606/664/758 802/846/758 +f 603/657/759 601/653/759 805/849/759 803/847/759 +f 806/850/760 602/656/760 604/660/760 804/848/760 +f 601/653/761 599/646/761 807/851/761 805/849/761 +f 808/852/762 600/650/762 602/656/762 806/850/762 +f 815/853/763 816/854/763 835/855/763 845/856/763 +f 836/857/764 816/858/764 815/859/764 846/860/764 +f 814/861/765 815/853/765 845/856/765 843/862/765 +f 846/860/766 815/859/766 814/863/766 844/864/766 +f 813/865/767 814/861/767 843/862/767 847/866/767 +f 844/864/768 814/863/768 813/865/768 848/867/768 +f 596/623/769 598/626/769 813/865/769 847/866/769 +f 813/865/770 598/626/770 597/628/770 848/867/770 +f 594/629/771 596/623/771 847/866/771 841/868/771 +f 848/867/772 597/628/772 595/632/772 842/869/772 +f 592/633/773 594/629/773 841/868/773 837/870/773 +f 842/869/774 595/632/774 593/636/774 838/871/774 +f 590/637/775 592/633/775 837/870/775 839/872/775 +f 838/871/776 593/636/776 591/640/776 840/873/776 +f 837/870/777 843/862/777 845/856/777 839/872/777 +f 846/860/778 844/864/778 838/871/778 840/873/778 +f 837/870/779 841/868/779 847/866/779 843/862/779 +f 848/867/780 842/869/780 838/871/780 844/864/780 +f 833/874/781 839/872/781 845/856/781 835/855/781 +f 846/860/782 840/873/782 834/875/782 836/857/782 +f 588/641/783 590/637/783 839/872/783 833/874/783 +f 840/873/784 591/640/784 589/644/784 834/875/784 +f 716/762/785 849/876/785 851/877/785 722/764/785 +f 852/878/786 850/879/786 717/763/786 723/765/786 +f 588/641/787 833/874/787 849/876/787 716/762/787 +f 850/879/788 834/875/788 589/644/788 717/763/788 +f 586/645/789 722/764/789 851/877/789 853/880/789 +f 852/878/790 723/765/790 587/651/790 854/881/790 +f 586/645/791 853/880/791 807/851/791 599/646/791 +f 808/852/792 854/881/792 587/651/792 600/650/792 +f 584/882/793 831/883/793 859/884/793 811/885/793 +f 860/886/794 832/887/794 584/888/794 811/889/794 +f 811/885/795 859/884/795 857/890/795 585/891/795 +f 858/892/796 860/886/796 811/889/796 585/893/796 +f 585/891/797 857/890/797 855/894/797 812/895/797 +f 856/896/798 858/892/798 585/893/798 812/897/798 +f 812/895/799 855/894/799 835/855/799 816/854/799 +f 836/857/800 856/896/800 812/897/800 816/858/800 +f 833/874/801 835/855/801 855/894/801 849/876/801 +f 856/896/802 836/857/802 834/875/802 850/879/802 +f 803/847/803 805/849/803 825/898/803 817/899/803 +f 826/900/804 806/850/804 804/848/804 818/901/804 +f 583/902/805 823/903/805 831/883/805 584/882/805 +f 832/887/806 824/904/806 583/905/806 584/888/806 +f 809/906/807 865/907/807 863/908/807 810/909/807 +f 864/910/808 866/911/808 809/912/808 810/913/808 +f 810/909/809 863/908/809 861/914/809 582/915/809 +f 862/916/810 864/910/810 810/913/810 582/917/810 +f 582/915/811 861/914/811 823/903/811 583/902/811 +f 824/904/812 862/916/812 582/917/812 583/905/812 +f 799/918/813 801/845/813 869/919/813 871/920/813 +f 870/921/814 802/846/814 800/922/814 872/923/814 +f 871/920/815 869/919/815 875/924/815 873/925/815 +f 876/926/816 870/921/816 872/923/816 874/927/816 +f 873/925/817 875/924/817 877/928/817 879/929/817 +f 878/930/818 876/926/818 874/927/818 880/931/818 +f 879/929/819 877/928/819 883/932/819 881/933/819 +f 884/934/820 878/930/820 880/931/820 882/935/820 +f 821/936/821 885/937/821 881/933/821 883/932/821 +f 882/935/822 886/938/822 822/939/822 884/934/822 +f 823/903/823 861/914/823 881/933/823 885/937/823 +f 882/935/824 862/916/824 824/904/824 886/938/824 +f 861/914/825 863/908/825 879/929/825 881/933/825 +f 880/931/826 864/910/826 862/916/826 882/935/826 +f 863/908/827 865/907/827 873/925/827 879/929/827 +f 874/927/828 866/911/828 864/910/828 880/931/828 +f 865/907/829 867/940/829 871/920/829 873/925/829 +f 872/923/830 868/941/830 866/911/830 874/927/830 +f 797/942/831 799/918/831 871/920/831 867/940/831 +f 872/923/832 800/922/832 798/943/832 868/941/832 +f 581/944/833 867/940/833 865/907/833 809/906/833 +f 866/911/834 868/941/834 581/945/834 809/912/834 +f 791/946/835 793/947/835 795/948/835 797/942/835 +f 796/949/836 794/950/836 792/951/836 798/943/836 +f 791/946/837 797/942/837 867/940/837 581/944/837 +f 868/941/838 798/943/838 792/951/838 581/945/838 +f 580/952/839 791/946/839 581/944/839 +f 581/945/840 792/951/840 580/953/840 +f 801/845/841 803/847/841 817/899/841 869/919/841 +f 818/901/842 804/848/842 802/846/842 870/921/842 +f 817/899/843 819/954/843 875/924/843 869/919/843 +f 876/926/844 820/955/844 818/901/844 870/921/844 +f 819/954/845 889/956/845 877/928/845 875/924/845 +f 878/930/846 890/957/846 820/955/846 876/926/846 +f 821/936/847 883/932/847 877/928/847 889/956/847 +f 878/930/848 884/934/848 822/939/848 890/957/848 +f 855/894/849 857/890/849 893/958/849 891/959/849 +f 894/960/850 858/892/850 856/896/850 892/961/850 +f 825/898/851 891/959/851 893/958/851 827/962/851 +f 894/960/852 892/961/852 826/900/852 828/963/852 +f 805/849/853 807/851/853 891/959/853 825/898/853 +f 892/961/854 808/852/854 806/850/854 826/900/854 +f 807/851/855 851/877/855 849/876/855 891/959/855 +f 850/879/856 852/878/856 808/852/856 892/961/856 +f 849/876/857 855/894/857 891/959/857 +f 892/961/858 856/896/858 850/879/858 +f 807/851/859 853/880/859 851/877/859 +f 852/878/860 854/881/860 808/852/860 +f 821/936/861 829/964/861 887/965/861 885/937/861 +f 888/966/862 830/967/862 822/939/862 886/938/862 +f 823/903/863 885/937/863 887/965/863 831/883/863 +f 888/966/864 886/938/864 824/904/864 832/887/864 +f 827/962/865 893/958/865 887/965/865 829/964/865 +f 888/966/866 894/960/866 828/963/866 830/967/866 +f 857/890/867 859/884/867 887/965/867 893/958/867 +f 888/966/868 860/886/868 858/892/868 894/960/868 +f 831/883/869 887/965/869 859/884/869 +f 860/886/870 888/966/870 832/887/870 +f 907/968/871 895/969/871 921/970/871 909/971/871 +f 922/972/872 896/973/872 908/974/872 910/975/872 +f 907/968/873 909/971/873 911/976/873 905/977/873 +f 912/978/874 910/975/874 908/974/874 906/979/874 +f 905/977/875 911/976/875 913/980/875 903/981/875 +f 914/982/876 912/978/876 906/979/876 904/983/876 +f 903/981/877 913/980/877 915/984/877 901/985/877 +f 916/986/878 914/982/878 904/983/878 902/987/878 +f 901/985/879 915/984/879 917/988/879 899/989/879 +f 918/990/880 916/986/880 902/987/880 900/991/880 +f 899/989/881 917/988/881 919/992/881 897/993/881 +f 920/994/882 918/990/882 900/991/882 898/995/882 +f 917/988/883 927/996/883 925/997/883 919/992/883 +f 926/998/884 928/999/884 918/990/884 920/994/884 +f 915/984/885 929/1000/885 927/996/885 917/988/885 +f 928/999/886 930/1001/886 916/986/886 918/990/886 +f 913/980/887 931/1002/887 929/1000/887 915/984/887 +f 930/1001/888 932/1003/888 914/982/888 916/986/888 +f 911/976/889 933/1004/889 931/1002/889 913/980/889 +f 932/1003/890 934/1005/890 912/978/890 914/982/890 +f 909/971/891 935/1006/891 933/1004/891 911/976/891 +f 934/1005/892 936/1007/892 910/975/892 912/978/892 +f 909/971/893 921/970/893 923/1008/893 935/1006/893 +f 924/1009/894 922/972/894 910/975/894 936/1007/894 +f 825/898/895 827/962/895 951/1010/895 949/1011/895 +f 952/1012/896 828/963/896 826/900/896 950/1013/896 +f 827/1014/897 897/993/897 919/992/897 951/1015/897 +f 920/994/898 898/995/898 828/1016/898 952/1017/898 +f 817/899/899 825/898/899 949/1011/899 819/954/899 +f 950/1013/900 826/900/900 818/901/900 820/955/900 +f 889/1018/901 937/1019/901 921/970/901 895/969/901 +f 922/972/902 938/1020/902 890/1021/902 896/973/902 +f 919/992/903 925/997/903 947/1022/903 951/1015/903 +f 948/1023/904 926/998/904 920/994/904 952/1017/904 +f 945/1024/905 953/1025/905 951/1015/905 947/1022/905 +f 952/1017/906 954/1026/906 946/1027/906 948/1023/906 +f 941/1028/907 953/1025/907 945/1024/907 943/1029/907 +f 946/1027/908 954/1026/908 942/1030/908 944/1031/908 +f 939/1032/909 955/1033/909 953/1025/909 941/1028/909 +f 954/1026/910 956/1034/910 940/1035/910 942/1030/910 +f 937/1019/911 955/1033/911 939/1032/911 957/1036/911 +f 940/1035/912 956/1034/912 938/1020/912 958/1037/912 +f 921/970/913 937/1019/913 957/1036/913 923/1008/913 +f 958/1037/914 938/1020/914 922/972/914 924/1009/914 +f 819/954/915 955/1038/915 937/1039/915 889/956/915 +f 938/1040/916 956/1041/916 820/955/916 890/957/916 +f 819/954/917 949/1011/917 953/1042/917 955/1038/917 +f 954/1043/918 950/1013/918 820/955/918 956/1041/918 +f 949/1011/919 951/1010/919 953/1042/919 +f 954/1043/920 952/1012/920 950/1013/920 +f 923/1008/921 957/1036/921 959/1044/921 983/1045/921 +f 960/1046/922 958/1037/922 924/1009/922 984/1047/922 +f 957/1036/923 939/1032/923 969/1048/923 959/1044/923 +f 970/1049/924 940/1035/924 958/1037/924 960/1046/924 +f 939/1032/925 941/1028/925 967/1050/925 969/1048/925 +f 968/1051/926 942/1030/926 940/1035/926 970/1049/926 +f 941/1028/927 943/1029/927 965/1052/927 967/1050/927 +f 966/1053/928 944/1031/928 942/1030/928 968/1051/928 +f 943/1029/929 945/1024/929 963/1054/929 965/1052/929 +f 964/1055/930 946/1027/930 944/1031/930 966/1053/930 +f 945/1024/931 947/1022/931 961/1056/931 963/1054/931 +f 962/1057/932 948/1023/932 946/1027/932 964/1055/932 +f 947/1022/933 925/997/933 981/1058/933 961/1056/933 +f 982/1059/934 926/998/934 948/1023/934 962/1057/934 +f 935/1006/935 923/1008/935 983/1045/935 971/1060/935 +f 984/1047/936 924/1009/936 936/1007/936 972/1061/936 +f 933/1004/937 935/1006/937 971/1060/937 973/1062/937 +f 972/1061/938 936/1007/938 934/1005/938 974/1063/938 +f 931/1002/939 933/1004/939 973/1062/939 975/1064/939 +f 974/1063/940 934/1005/940 932/1003/940 976/1065/940 +f 929/1000/941 931/1002/941 975/1064/941 977/1066/941 +f 976/1065/942 932/1003/942 930/1001/942 978/1067/942 +f 927/996/943 929/1000/943 977/1066/943 979/1068/943 +f 978/1067/944 930/1001/944 928/999/944 980/1069/944 +f 925/997/945 927/996/945 979/1068/945 981/1058/945 +f 980/1069/946 928/999/946 926/998/946 982/1059/946 +f 965/1052/947 963/1054/947 987/1070/947 985/1071/947 +f 988/1072/948 964/1055/948 966/1053/948 986/1073/948 +f 985/1071/949 987/1070/949 989/1074/949 991/1075/949 +f 990/1076/950 988/1072/950 986/1073/950 992/1077/950 +f 991/1075/951 989/1074/951 995/1078/951 993/1079/951 +f 996/1080/952 990/1076/952 992/1077/952 994/1081/952 +f 993/1079/953 995/1078/953 997/1082/953 999/1083/953 +f 998/1084/954 996/1080/954 994/1081/954 1000/1085/954 +f 971/1060/955 983/1045/955 993/1079/955 999/1083/955 +f 994/1081/956 984/1047/956 972/1061/956 1000/1085/956 +f 959/1044/957 991/1075/957 993/1079/957 983/1045/957 +f 994/1081/958 992/1077/958 960/1046/958 984/1047/958 +f 959/1044/959 969/1048/959 985/1071/959 991/1075/959 +f 986/1073/960 970/1049/960 960/1046/960 992/1077/960 +f 965/1052/961 985/1071/961 969/1048/961 967/1050/961 +f 970/1049/962 986/1073/962 966/1053/962 968/1051/962 +f 961/1056/963 981/1058/963 987/1070/963 963/1054/963 +f 988/1072/964 982/1059/964 962/1057/964 964/1055/964 +f 979/1068/965 989/1074/965 987/1070/965 981/1058/965 +f 988/1072/966 990/1076/966 980/1069/966 982/1059/966 +f 977/1066/967 995/1078/967 989/1074/967 979/1068/967 +f 990/1076/968 996/1080/968 978/1067/968 980/1069/968 +f 975/1064/969 997/1082/969 995/1078/969 977/1066/969 +f 996/1080/970 998/1084/970 976/1065/970 978/1067/970 +f 973/1062/971 999/1083/971 997/1082/971 975/1064/971 +f 998/1084/972 1000/1085/972 974/1063/972 976/1065/972 +f 971/1060/973 999/1083/973 973/1062/973 +f 974/1063/974 1000/1085/974 972/1061/974 +f 899/989/975 897/993/975 1011/1086/975 1009/1087/975 +f 1012/1088/976 898/995/976 900/991/976 1010/1089/976 +f 901/985/977 899/989/977 1009/1087/977 1007/1090/977 +f 1010/1089/978 900/991/978 902/987/978 1008/1091/978 +f 903/981/979 901/985/979 1007/1090/979 1005/1092/979 +f 1008/1091/980 902/987/980 904/983/980 1006/1093/980 +f 905/1094/981 903/981/981 1005/1092/981 1003/1095/981 +f 1006/1093/982 904/983/982 906/1096/982 1004/1097/982 +f 907/1098/983 905/1094/983 1003/1095/983 1001/1099/983 +f 1004/1097/984 906/1096/984 908/1100/984 1002/1101/984 +f 895/1102/985 907/1098/985 1001/1099/985 1013/1103/985 +f 1002/1101/986 908/1100/986 896/1104/986 1014/1105/986 +f 1001/1099/987 1009/1087/987 1011/1086/987 1013/1103/987 +f 1012/1088/988 1010/1089/988 1002/1101/988 1014/1105/988 +f 1001/1099/989 1003/1095/989 1007/1090/989 1009/1087/989 +f 1008/1091/990 1004/1097/990 1002/1101/990 1010/1089/990 +f 1003/1095/991 1005/1092/991 1007/1090/991 +f 1008/1091/992 1006/1093/992 1004/1097/992 +f 821/936/993 889/956/993 895/1106/993 1013/1107/993 +f 896/1104/994 890/1108/994 822/1109/994 1014/1105/994 +f 821/1110/995 1013/1103/995 1011/1086/995 829/1111/995 +f 1012/1088/996 1014/1105/996 822/1109/996 830/1112/996 +f 827/1014/997 829/1111/997 1011/1086/997 897/993/997 +f 1012/1088/998 830/1112/998 828/1016/998 898/995/998 +g Suzanne.002_Suzanne +v -2.334375 0.164062 -0.437500 +v -2.334375 0.164062 0.437500 +v -2.412500 0.093750 -0.500000 +v -2.412500 0.093750 0.500000 +v -2.521875 0.054688 -0.546875 +v -2.521875 0.054688 0.546875 +v -2.482813 -0.023438 -0.351563 +v -2.482813 -0.023438 0.351562 +v -2.381250 0.031250 -0.351563 +v -2.381250 0.031250 0.351562 +v -2.318750 0.132812 -0.351563 +v -2.318750 0.132812 0.351562 +v -2.303125 0.164062 -0.273438 +v -2.303125 0.164062 0.273437 +v -2.357813 0.093750 -0.203125 +v -2.357813 0.093750 0.203125 +v -2.451563 0.054688 -0.156250 +v -2.451563 0.054688 0.156250 +v -2.443750 0.242188 -0.078125 +v -2.443750 0.242188 0.078125 +v -2.357813 0.242188 -0.140625 +v -2.357813 0.242188 0.140625 +v -2.303125 0.242188 -0.242188 +v -2.303125 0.242188 0.242187 +v -2.303125 0.328125 -0.273438 +v -2.303125 0.328125 0.273437 +v -2.357813 0.390625 -0.203125 +v -2.357813 0.390625 0.203125 +v -2.451563 0.437500 -0.156250 +v -2.451563 0.437500 0.156250 +v -2.482813 0.515625 -0.351563 +v -2.482813 0.515625 0.351562 +v -2.381250 0.453125 -0.351563 +v -2.381250 0.453125 0.351562 +v -2.318750 0.359375 -0.351563 +v -2.318750 0.359375 0.351562 +v -2.334375 0.328125 -0.437500 +v -2.334375 0.328125 0.437500 +v -2.412500 0.390625 -0.500000 +v -2.412500 0.390625 0.500000 +v -2.521875 0.437500 -0.546875 +v -2.521875 0.437500 0.546875 +v -2.537500 0.242188 -0.625000 +v -2.537500 0.242188 0.625000 +v -2.428125 0.242188 -0.562500 +v -2.428125 0.242188 0.562500 +v -2.342188 0.242188 -0.468750 +v -2.342188 0.242188 0.468750 +v -2.326563 0.242188 -0.476563 +v -2.326563 0.242188 0.476562 +v -2.318750 0.335938 -0.445313 +v -2.318750 0.335938 0.445312 +v -2.295313 0.375000 -0.351563 +v -2.295313 0.375000 0.351562 +v -2.279688 0.335938 -0.265625 +v -2.279688 0.335938 0.265625 +v -2.279688 0.242188 -0.226563 +v -2.279688 0.242188 0.226562 +v -2.279688 0.156250 -0.265625 +v -2.279688 0.156250 0.265625 +v -2.271875 0.242188 -0.351563 +v -2.271875 0.242188 0.351562 +v -2.295313 0.117188 -0.351563 +v -2.295313 0.117188 0.351562 +v -2.318750 0.156250 -0.445313 +v -2.318750 0.156250 0.445312 +v -2.357813 0.429688 -0.000000 +v -2.279688 0.351562 -0.000000 +v -2.365625 -0.679688 -0.000000 +v -2.318750 -0.320312 -0.000000 +v -2.303125 -0.187500 -0.000000 +v -2.381250 -0.773438 -0.000000 +v -2.498438 0.406250 -0.000000 +v -2.529688 0.570312 -0.000000 +v -3.646875 0.898438 -0.000000 +v -3.951563 0.562500 -0.000000 +v -3.928125 0.070312 -0.000000 +v -3.451563 -0.382812 -0.000000 +v -2.537500 -0.187500 -0.203125 +v -2.537500 -0.187500 0.203125 +v -2.529688 -0.437500 -0.312500 +v -2.529688 -0.437500 0.312500 +v -2.529688 -0.695312 -0.351563 +v -2.529688 -0.695312 0.351562 +v -2.568750 -0.890625 -0.367188 +v -2.568750 -0.890625 0.367187 +v -2.576563 -0.945312 -0.328125 +v -2.576563 -0.945312 0.328125 +v -2.545313 -0.968750 -0.179688 +v -2.545313 -0.968750 0.179687 +v -2.521875 -0.984375 -0.000000 +v -2.568750 -0.140625 -0.437500 +v -2.568750 -0.140625 0.437500 +v -2.560938 -0.039062 -0.632813 +v -2.560938 -0.039062 0.632812 +v -2.654688 0.148438 -0.828125 +v -2.654688 0.148438 0.828125 +v -2.506250 0.429688 -0.859375 +v -2.506250 0.429688 0.859375 +v -2.475000 0.484375 -0.710938 +v -2.475000 0.484375 0.710937 +v -2.412500 0.601562 -0.492188 +v -2.412500 0.601562 0.492187 +v -2.365625 0.757812 -0.320313 +v -2.365625 0.757812 0.320312 +v -2.342188 0.718750 -0.156250 +v -2.342188 0.718750 0.156250 +v -2.350000 0.492188 -0.062500 +v -2.350000 0.492188 0.062500 +v -2.326563 0.414062 -0.164063 +v -2.326563 0.414062 0.164062 +v -2.334375 0.304688 -0.125000 +v -2.334375 0.304688 0.125000 +v -2.357813 0.093750 -0.203125 +v -2.357813 0.093750 0.203125 +v -2.396875 0.015625 -0.375000 +v -2.396875 0.015625 0.375000 +v -2.428125 0.062500 -0.492188 +v -2.428125 0.062500 0.492187 +v -2.451563 0.187500 -0.625000 +v -2.451563 0.187500 0.625000 +v -2.451563 0.296875 -0.640625 +v -2.451563 0.296875 0.640625 +v -2.435938 0.375000 -0.601563 +v -2.435938 0.375000 0.601562 +v -2.381250 0.437500 -0.429688 +v -2.381250 0.437500 0.429687 +v -2.342188 0.468750 -0.250000 +v -2.342188 0.468750 0.250000 +v -2.365625 -0.765625 -0.000000 +v -2.365625 -0.718750 -0.109375 +v -2.365625 -0.718750 0.109375 +v -2.389063 -0.835938 -0.117188 +v -2.389063 -0.835938 0.117187 +v -2.404688 -0.882812 -0.062500 +v -2.404688 -0.882812 0.062500 +v -2.412500 -0.890625 -0.000000 +v -2.350000 -0.195312 -0.000000 +v -2.357813 -0.140625 -0.000000 +v -2.357813 -0.148438 -0.101563 +v -2.357813 -0.148438 0.101562 +v -2.350000 -0.226562 -0.125000 +v -2.350000 -0.226562 0.125000 +v -2.357813 -0.289062 -0.085938 +v -2.357813 -0.289062 0.085937 +v -2.428125 -0.046875 -0.398438 +v -2.428125 -0.046875 0.398437 +v -2.475000 0.054688 -0.617188 +v -2.475000 0.054688 0.617187 +v -2.498438 0.203125 -0.726563 +v -2.498438 0.203125 0.726562 +v -2.443750 0.375000 -0.742188 +v -2.443750 0.375000 0.742187 +v -2.373438 0.414062 -0.687500 +v -2.373438 0.414062 0.687500 +v -2.303125 0.546875 -0.437500 +v -2.303125 0.546875 0.437500 +v -2.264063 0.640625 -0.312500 +v -2.264063 0.640625 0.312500 +v -2.248438 0.617188 -0.203125 +v -2.248438 0.617188 0.203125 +v -2.256250 0.429688 -0.101563 +v -2.256250 0.429688 0.101562 +v -2.287500 -0.101562 -0.125000 +v -2.287500 -0.101562 0.125000 +v -2.389063 -0.445312 -0.210938 +v -2.389063 -0.445312 0.210937 +v -2.412500 -0.703125 -0.250000 +v -2.412500 -0.703125 0.250000 +v -2.435938 -0.820312 -0.265625 +v -2.435938 -0.820312 0.265625 +v -2.467188 -0.914062 -0.234375 +v -2.467188 -0.914062 0.234375 +v -2.467188 -0.929688 -0.164063 +v -2.467188 -0.929688 0.164062 +v -2.459375 -0.945312 -0.000000 +v -2.373438 0.046875 -0.000000 +v -2.334375 0.210938 -0.000000 +v -2.357813 0.476562 -0.328125 +v -2.357813 0.476562 0.328125 +v -2.350000 0.140625 -0.164063 +v -2.350000 0.140625 0.164062 +v -2.342188 0.210938 -0.132813 +v -2.342188 0.210938 0.132812 +v -2.365625 -0.687500 -0.117188 +v -2.365625 -0.687500 0.117187 +v -2.350000 -0.445312 -0.078125 +v -2.350000 -0.445312 0.078125 +v -2.350000 -0.445312 -0.000000 +v -2.357813 -0.328125 -0.000000 +v -2.318750 -0.273438 -0.093750 +v -2.318750 -0.273438 0.093750 +v -2.303125 -0.226562 -0.132813 +v -2.303125 -0.226562 0.132812 +v -2.318750 -0.132812 -0.109375 +v -2.318750 -0.132812 0.109375 +v -2.318750 -0.125000 -0.039063 +v -2.318750 -0.125000 0.039062 +v -2.271875 -0.203125 -0.000000 +v -2.287500 -0.148438 -0.046875 +v -2.287500 -0.148438 0.046875 +v -2.287500 -0.156250 -0.093750 +v -2.287500 -0.156250 0.093750 +v -2.271875 -0.226562 -0.109375 +v -2.271875 -0.226562 0.109375 +v -2.295313 -0.250000 -0.078125 +v -2.295313 -0.250000 0.078125 +v -2.295313 -0.289062 -0.000000 +v -2.545313 -0.312500 -0.257813 +v -2.545313 -0.312500 0.257812 +v -2.389063 -0.242188 -0.164063 +v -2.389063 -0.242188 0.164062 +v -2.389063 -0.312500 -0.179688 +v -2.389063 -0.312500 0.179687 +v -2.545313 -0.250000 -0.234375 +v -2.545313 -0.250000 0.234375 +v -2.412500 -0.875000 -0.000000 +v -2.412500 -0.867188 -0.046875 +v -2.412500 -0.867188 0.046875 +v -2.389063 -0.820312 -0.093750 +v -2.389063 -0.820312 0.093750 +v -2.373438 -0.742188 -0.093750 +v -2.373438 -0.742188 0.093750 +v -2.443750 -0.781250 -0.000000 +v -2.435938 -0.750000 -0.093750 +v -2.435938 -0.750000 0.093750 +v -2.459375 -0.812500 -0.093750 +v -2.459375 -0.812500 0.093750 +v -2.467188 -0.851562 -0.046875 +v -2.467188 -0.851562 0.046875 +v -2.467188 -0.859375 -0.000000 +v -2.318750 0.218750 -0.171875 +v -2.318750 0.218750 0.171875 +v -2.326563 0.156250 -0.187500 +v -2.326563 0.156250 0.187500 +v -2.342188 0.429688 -0.335938 +v -2.342188 0.429688 0.335937 +v -2.326563 0.421875 -0.273438 +v -2.326563 0.421875 0.273437 +v -2.326563 0.398438 -0.421875 +v -2.326563 0.398438 0.421875 +v -2.404688 0.351562 -0.562500 +v -2.404688 0.351562 0.562500 +v -2.412500 0.289062 -0.585938 +v -2.412500 0.289062 0.585937 +v -2.420313 0.195312 -0.578125 +v -2.420313 0.195312 0.578125 +v -2.381250 0.101562 -0.476563 +v -2.381250 0.101562 0.476562 +v -2.357813 0.062500 -0.375000 +v -2.357813 0.062500 0.375000 +v -2.318750 0.109375 -0.226563 +v -2.318750 0.109375 0.226562 +v -2.318750 0.296875 -0.179688 +v -2.318750 0.296875 0.179687 +v -2.318750 0.375000 -0.210938 +v -2.318750 0.375000 0.210937 +v -2.342188 0.359375 -0.234375 +v -2.342188 0.359375 0.234375 +v -2.342188 0.296875 -0.195313 +v -2.342188 0.296875 0.195312 +v -2.342188 0.125000 -0.242188 +v -2.342188 0.125000 0.242187 +v -2.373438 0.085938 -0.375000 +v -2.373438 0.085938 0.375000 +v -2.396875 0.117188 -0.460938 +v -2.396875 0.117188 0.460937 +v -2.428125 0.210938 -0.546875 +v -2.428125 0.210938 0.546875 +v -2.428125 0.281250 -0.554688 +v -2.428125 0.281250 0.554687 +v -2.420313 0.335938 -0.531250 +v -2.420313 0.335938 0.531250 +v -2.350000 0.390625 -0.414063 +v -2.350000 0.390625 0.414062 +v -2.334375 0.398438 -0.281250 +v -2.334375 0.398438 0.281250 +v -2.350000 0.406250 -0.335938 +v -2.350000 0.406250 0.335937 +v -2.350000 0.171875 -0.203125 +v -2.350000 0.171875 0.203125 +v -2.350000 0.226562 -0.195313 +v -2.350000 0.226562 0.195312 +v -2.490625 0.460938 -0.109375 +v -2.490625 0.460938 0.109375 +v -2.482813 0.664062 -0.195313 +v -2.482813 0.664062 0.195312 +v -2.506250 0.687500 -0.335938 +v -2.506250 0.687500 0.335937 +v -2.545313 0.554688 -0.484375 +v -2.545313 0.554688 0.484375 +v -2.607813 0.453125 -0.679688 +v -2.607813 0.453125 0.679687 +v -2.639063 0.406250 -0.796875 +v -2.639063 0.406250 0.796875 +v -2.725000 0.164062 -0.773438 +v -2.725000 0.164062 0.773437 +v -2.685938 0.000000 -0.601563 +v -2.685938 0.000000 0.601562 +v -2.631250 -0.093750 -0.437500 +v -2.631250 -0.093750 0.437500 +v -2.810938 0.898438 -0.000000 +v -3.178125 0.984375 -0.000000 +v -3.771875 -0.195312 -0.000000 +v -2.912500 -0.460938 -0.000000 +v -2.639063 -0.976562 -0.000000 +v -2.756250 -0.804688 -0.000000 +v -2.779688 -0.570312 -0.000000 +v -2.818750 -0.484375 -0.000000 +v -3.045313 0.234375 -0.851563 +v -3.045313 0.234375 0.851562 +v -3.146875 0.320312 -0.859375 +v -3.146875 0.320312 0.859375 +v -3.537500 0.265625 -0.773438 +v -3.537500 0.265625 0.773437 +v -3.803125 0.437500 -0.460938 +v -3.803125 0.437500 0.460937 +v -3.029688 -0.046875 -0.734375 +v -3.029688 -0.046875 0.734375 +v -3.264063 -0.125000 -0.593750 +v -3.264063 -0.125000 0.593750 +v -3.529688 -0.007812 -0.640625 +v -3.529688 -0.007812 0.640625 +v -3.764063 0.054688 -0.335938 +v -3.764063 0.054688 0.335937 +v -2.693750 -0.351562 -0.234375 +v -2.693750 -0.351562 0.234375 +v -2.842188 -0.414062 -0.179688 +v -2.842188 -0.414062 0.179687 +v -2.717188 -0.710938 -0.289063 +v -2.717188 -0.710938 0.289062 +v -2.709375 -0.500000 -0.250000 +v -2.709375 -0.500000 0.250000 +v -2.701563 -0.914062 -0.328125 +v -2.701563 -0.914062 0.328125 +v -2.732813 -0.757812 -0.140625 +v -2.732813 -0.757812 0.140625 +v -2.740625 -0.539062 -0.125000 +v -2.740625 -0.539062 0.125000 +v -2.662500 -0.945312 -0.164063 +v -2.662500 -0.945312 0.164062 +v -2.670313 -0.281250 -0.218750 +v -2.670313 -0.281250 0.218750 +v -2.631250 -0.226562 -0.210938 +v -2.631250 -0.226562 0.210937 +v -2.600000 -0.171875 -0.203125 +v -2.600000 -0.171875 0.203125 +v -2.935938 -0.390625 -0.210938 +v -2.935938 -0.390625 0.210937 +v -3.365625 -0.312500 -0.296875 +v -3.365625 -0.312500 0.296875 +v -3.639063 -0.148438 -0.343750 +v -3.639063 -0.148438 0.343750 +v -3.482813 0.867188 -0.453125 +v -3.482813 0.867188 0.453125 +v -3.170313 0.929688 -0.453125 +v -3.170313 0.929688 0.453125 +v -2.865625 0.851562 -0.453125 +v -2.865625 0.851562 0.453125 +v -2.670313 0.523438 -0.460938 +v -2.670313 0.523438 0.460937 +v -2.764063 0.406250 -0.726563 +v -2.764063 0.406250 0.726562 +v -2.818750 0.453125 -0.632813 +v -2.818750 0.453125 0.632812 +v -3.045313 0.703125 -0.640625 +v -3.045313 0.703125 0.640625 +v -2.975000 0.562500 -0.796875 +v -2.975000 0.562500 0.796875 +v -3.217188 0.617188 -0.796875 +v -3.217188 0.617188 0.796875 +v -3.295313 0.750000 -0.640625 +v -3.295313 0.750000 0.640625 +v -3.545313 0.679688 -0.640625 +v -3.545313 0.679688 0.640625 +v -3.459375 0.539062 -0.796875 +v -3.459375 0.539062 0.796875 +v -3.685938 0.328125 -0.617188 +v -3.685938 0.328125 0.617187 +v -3.646875 0.023438 -0.484375 +v -3.646875 0.023438 0.484375 +v -3.303125 0.328125 -0.820313 +v -3.303125 0.328125 0.820312 +v -2.951563 -0.171875 -0.406250 +v -2.951563 -0.171875 0.406250 +v -3.310938 -0.195312 -0.429688 +v -3.310938 -0.195312 0.429687 +v -3.334375 0.406250 -0.890625 +v -3.334375 0.406250 0.890625 +v -3.225000 -0.140625 -0.773438 +v -3.225000 -0.140625 0.773437 +v -3.428125 -0.101562 -1.039063 +v -3.428125 -0.101562 1.039062 +v -3.529688 0.054688 -1.281250 +v -3.529688 0.054688 1.281250 +v -3.521875 0.320312 -1.351563 +v -3.521875 0.320312 1.351562 +v -3.521875 0.507812 -1.234375 +v -3.521875 0.507812 1.234375 +v -3.412500 0.476562 -1.023438 +v -3.412500 0.476562 1.023437 +v -3.389063 0.414062 -1.015625 +v -3.389063 0.414062 1.015625 +v -3.490625 0.437500 -1.187500 +v -3.490625 0.437500 1.187500 +v -3.506250 0.289062 -1.265625 +v -3.506250 0.289062 1.265625 +v -3.506250 0.078125 -1.210938 +v -3.506250 0.078125 1.210937 +v -3.404688 -0.039062 -1.031250 +v -3.404688 -0.039062 1.031250 +v -3.232813 -0.070312 -0.828125 +v -3.232813 -0.070312 0.828125 +v -3.318750 0.359375 -0.921875 +v -3.318750 0.359375 0.921875 +v -3.389063 0.304688 -0.945313 +v -3.389063 0.304688 0.945312 +v -3.310938 -0.023438 -0.882813 +v -3.310938 -0.023438 0.882812 +v -3.467188 0.000000 -1.039063 +v -3.467188 0.000000 1.039062 +v -3.545313 0.093750 -1.187500 +v -3.545313 0.093750 1.187500 +v -3.545313 0.250000 -1.234375 +v -3.545313 0.250000 1.234375 +v -3.537500 0.359375 -1.171875 +v -3.537500 0.359375 1.171875 +v -3.459375 0.343750 -1.023438 +v -3.459375 0.343750 1.023437 +v -3.310938 0.289062 -0.843750 +v -3.310938 0.289062 0.843750 +v -3.373438 0.171875 -0.835938 +v -3.373438 0.171875 0.835937 +v -3.373438 0.093750 -0.757813 +v -3.373438 0.093750 0.757812 +v -3.373438 0.085938 -0.820313 +v -3.373438 0.085938 0.820312 +v -3.373438 0.015625 -0.843750 +v -3.373438 0.015625 0.843750 +v -3.373438 -0.015625 -0.812500 +v -3.373438 -0.015625 0.812500 +v -3.170313 0.000000 -0.726563 +v -3.170313 0.000000 0.726562 +v -3.271875 -0.023438 -0.718750 +v -3.271875 -0.023438 0.718750 +v -3.287500 0.039062 -0.718750 +v -3.287500 0.039062 0.718750 +v -3.310938 0.203125 -0.796875 +v -3.310938 0.203125 0.796875 +v -3.365625 0.242188 -0.890625 +v -3.365625 0.242188 0.890625 +v -3.420313 0.234375 -0.890625 +v -3.420313 0.234375 0.890625 +v -3.420313 -0.015625 -0.812500 +v -3.420313 -0.015625 0.812500 +v -3.420313 0.015625 -0.851563 +v -3.420313 0.015625 0.851562 +v -3.420313 0.078125 -0.828125 +v -3.420313 0.078125 0.828125 +v -3.420313 0.093750 -0.765625 +v -3.420313 0.093750 0.765625 +v -3.420313 0.171875 -0.843750 +v -3.420313 0.171875 0.843750 +v -3.514063 0.328125 -1.039063 +v -3.514063 0.328125 1.039062 +v -3.584375 0.343750 -1.187500 +v -3.584375 0.343750 1.187500 +v -3.592188 0.242188 -1.257813 +v -3.592188 0.242188 1.257812 +v -3.584375 0.085938 -1.210938 +v -3.584375 0.085938 1.210937 +v -3.521875 0.000000 -1.046875 +v -3.521875 0.000000 1.046875 +v -3.365625 -0.015625 -0.882813 +v -3.365625 -0.015625 0.882812 +v -3.443750 0.289062 -0.953125 +v -3.443750 0.289062 0.953125 +v -3.428125 0.109375 -0.890625 +v -3.428125 0.109375 0.890625 +v -3.435938 0.062500 -0.937500 +v -3.435938 0.062500 0.937500 +v -3.467188 0.125000 -1.000000 +v -3.467188 0.125000 1.000000 +v -3.451563 0.171875 -0.960938 +v -3.451563 0.171875 0.960937 +v -3.475000 0.234375 -1.015625 +v -3.475000 0.234375 1.015625 +v -3.482813 0.187500 -1.054688 +v -3.482813 0.187500 1.054687 +v -3.490625 0.210938 -1.109375 +v -3.490625 0.210938 1.109375 +v -3.490625 0.273438 -1.085938 +v -3.490625 0.273438 1.085937 +v -3.584375 0.437500 -1.023438 +v -3.584375 0.437500 1.023437 +v -3.646875 0.468750 -1.250000 +v -3.646875 0.468750 1.250000 +v -3.600000 0.296875 -1.367188 +v -3.600000 0.296875 1.367187 +v -3.631250 0.054688 -1.312500 +v -3.631250 0.054688 1.312500 +v -3.592188 -0.085938 -1.039063 +v -3.592188 -0.085938 1.039062 +v -3.428125 -0.125000 -0.789063 +v -3.428125 -0.125000 0.789062 +v -3.482813 0.382812 -0.859375 +v -3.482813 0.382812 0.859375 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn 0.7194 -0.2008 -0.6650 +vn 0.7194 -0.2008 0.6650 +vn 0.4689 -0.3036 -0.8294 +vn 0.4689 -0.3036 0.8294 +vn 0.4449 -0.7933 -0.4155 +vn 0.4449 -0.7933 0.4155 +vn 0.7820 -0.5089 -0.3600 +vn 0.7820 -0.5089 0.3600 +vn 0.8384 -0.5394 0.0787 +vn 0.8384 -0.5394 -0.0787 +vn 0.4685 -0.8413 0.2696 +vn 0.4685 -0.8413 -0.2696 +vn 0.5420 -0.3352 0.7707 +vn 0.5420 -0.3352 -0.7707 +vn 0.8617 -0.1940 0.4689 +vn 0.8617 -0.1940 -0.4689 +vn 0.8581 0.1907 0.4767 +vn 0.8581 0.1907 -0.4767 +vn 0.5521 0.3264 0.7672 +vn 0.5521 0.3264 -0.7672 +vn 0.5182 0.8173 0.2519 +vn 0.5182 0.8173 -0.2519 +vn 0.8164 0.5696 0.0949 +vn 0.8164 0.5696 -0.0949 +vn 0.7597 0.5370 -0.3667 +vn 0.7597 0.5370 0.3667 +vn 0.4898 0.7672 -0.4141 +vn 0.4898 0.7672 0.4141 +vn 0.4771 0.2952 -0.8277 +vn 0.4771 0.2952 0.8277 +vn 0.7145 0.1971 -0.6713 +vn 0.7145 0.1971 0.6713 +vn -0.4867 0.3244 -0.8111 +vn -0.4867 0.3244 0.8111 +vn -0.5334 0.8206 -0.2052 +vn -0.5334 0.8206 0.2052 +vn -0.4607 0.7806 0.4223 +vn -0.4607 0.7806 -0.4223 +vn -0.4658 0.3225 0.8241 +vn -0.4658 0.3225 -0.8241 +vn -0.4650 -0.3487 0.8137 +vn -0.4650 -0.3487 -0.8137 +vn -0.4607 -0.7806 0.4223 +vn -0.4607 -0.7806 -0.4223 +vn -0.5334 -0.8206 -0.2052 +vn -0.5334 -0.8206 0.2052 +vn -0.4875 -0.3510 -0.7995 +vn -0.4875 -0.3510 0.7995 +vn 0.9144 -0.0623 -0.4000 +vn 0.9144 -0.0623 0.4000 +vn 0.9354 -0.1754 -0.3069 +vn 0.9354 -0.1754 0.3069 +vn 0.9785 -0.1835 -0.0945 +vn 0.9785 -0.1835 0.0945 +vn 0.9977 -0.0283 0.0624 +vn 0.9977 -0.0283 -0.0624 +vn 0.9977 0.0260 0.0624 +vn 0.9977 0.0260 -0.0624 +vn 0.9799 0.1729 -0.0996 +vn 0.9799 0.1729 0.0996 +vn 0.9383 0.1656 -0.3036 +vn 0.9383 0.1656 0.3036 +vn 0.9147 0.0572 -0.4002 +vn 0.9147 0.0572 0.4002 +vn 0.4924 -0.8616 -0.1231 +vn 0.4924 -0.8616 0.1231 +vn 0.4520 -0.8647 -0.2190 +vn 0.4520 -0.8647 0.2190 +vn 0.6668 -0.4550 -0.5902 +vn 0.6668 -0.4550 0.5902 +vn 0.6374 -0.0506 -0.7689 +vn 0.6374 -0.0506 0.7689 +vn 0.6197 0.0900 -0.7796 +vn 0.6197 0.0900 0.7796 +vn 0.4739 -0.8188 -0.3241 +vn 0.4739 -0.8188 0.3241 +vn 0.6417 -0.6629 -0.3857 +vn 0.6417 -0.6629 0.3857 +vn 0.5906 -0.4193 -0.6895 +vn 0.5906 -0.4193 0.6895 +vn 0.6588 -0.3634 -0.6588 +vn 0.6588 -0.3634 0.6588 +vn 0.7509 0.3707 -0.5465 +vn 0.7509 0.3707 0.5465 +vn 0.5706 0.6464 -0.5064 +vn 0.5706 0.6464 0.5064 +vn 0.6015 0.5167 -0.6092 +vn 0.6015 0.5167 0.6092 +vn 0.7491 0.6610 0.0441 +vn 0.7491 0.6610 -0.0441 +vn 0.6110 0.3187 0.7246 +vn 0.6110 0.3187 -0.7246 +vn 0.5880 0.5554 0.5880 +vn 0.5880 0.5554 -0.5880 +vn 0.7482 -0.3909 -0.5361 +vn 0.7482 -0.3909 0.5361 +vn 0.8552 -0.4690 -0.2207 +vn 0.8552 -0.4690 0.2207 +vn 0.8429 -0.5321 0.0794 +vn 0.8429 -0.5321 -0.0794 +vn 0.7490 -0.6575 0.0825 +vn 0.7490 -0.6575 -0.0825 +vn 0.8226 -0.5667 -0.0457 +vn 0.8226 -0.5667 0.0457 +vn 0.9365 -0.2130 -0.2784 +vn 0.9365 -0.2130 0.2784 +vn 0.9063 -0.1824 -0.3813 +vn 0.9063 -0.1824 0.3813 +vn 0.8969 -0.2878 -0.3357 +vn 0.8969 -0.2878 0.3357 +vn 0.9246 0.0603 -0.3762 +vn 0.9246 0.0603 0.3762 +vn 0.9539 0.2680 0.1352 +vn 0.9539 0.2680 -0.1352 +vn 0.8102 -0.4321 -0.3961 +vn 0.8102 -0.4321 0.3961 +vn 0.9510 -0.2474 -0.1856 +vn 0.9510 -0.2474 0.1856 +vn 0.9808 -0.1948 -0.0099 +vn 0.9808 -0.1948 0.0099 +vn 0.7138 -0.6966 -0.0721 +vn 0.7138 -0.6966 0.0721 +vn 0.7986 -0.5723 -0.1863 +vn 0.7986 -0.5723 0.1863 +vn 0.9094 -0.2708 -0.3157 +vn 0.9094 -0.2708 0.3157 +vn 0.9516 -0.0265 -0.3063 +vn 0.9516 -0.0265 0.3063 +vn 0.9361 -0.1306 -0.3266 +vn 0.9361 -0.1306 0.3266 +vn 0.9983 0.0574 0.0137 +vn 0.9983 0.0574 -0.0137 +vn 0.9978 -0.0656 0.0026 +vn 0.9978 -0.0656 -0.0026 +vn 1.0000 0.0000 0.0000 +vn -0.0442 -0.5744 -0.8174 +vn -0.0442 -0.5744 0.8174 +vn -0.2144 0.2297 -0.9494 +vn -0.2144 0.2297 0.9494 +vn -0.4124 0.9073 -0.0825 +vn -0.4124 0.9073 0.0825 +vn 0.3047 0.3555 0.8836 +vn 0.3047 0.3555 -0.8836 +vn 0.2218 -0.8797 -0.4207 +vn 0.2218 -0.8797 0.4207 +vn 0.7663 -0.5747 -0.2873 +vn 0.7663 -0.5747 0.2873 +vn 0.4580 0.6019 0.6542 +vn 0.4580 0.6019 -0.6542 +vn 0.6051 0.7892 -0.1052 +vn 0.6051 0.7892 0.1052 +vn 0.5832 0.2916 -0.7582 +vn 0.5832 0.2916 0.7582 +vn 0.5834 -0.7130 -0.3889 +vn 0.5834 -0.7130 0.3889 +vn 0.9718 0.2314 -0.0463 +vn 0.9718 0.2314 0.0463 +vn 0.9151 -0.4018 -0.0335 +vn 0.9151 -0.4018 0.0335 +vn 0.8809 -0.1610 0.4452 +vn 0.8809 -0.1610 -0.4452 +vn 0.8729 -0.4364 0.2182 +vn 0.8729 -0.4364 -0.2182 +vn 0.8916 -0.1290 -0.4341 +vn 0.8916 -0.1290 0.4341 +vn 0.9524 0.0501 -0.3008 +vn 0.9524 0.0501 0.3008 +vn 0.4996 0.3010 -0.8123 +vn 0.4996 0.3010 0.8123 +vn 0.4093 0.2574 -0.8753 +vn 0.4093 0.2574 0.8753 +vn 0.3060 0.1601 -0.9385 +vn 0.3060 0.1601 0.9385 +vn 0.7227 -0.6539 -0.2237 +vn 0.7227 -0.6539 0.2237 +vn 0.9677 -0.1997 0.1536 +vn 0.9677 -0.1997 -0.1536 +vn 0.9565 -0.1025 0.2733 +vn 0.9565 -0.1025 -0.2733 +vn 0.9759 0.1952 0.0976 +vn 0.9759 0.1952 -0.0976 +vn 0.2713 0.9494 0.1582 +vn 0.2713 0.9494 -0.1582 +vn 0.1328 0.7082 0.6934 +vn 0.1328 0.7082 -0.6934 +vn -0.0000 -0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.1181 -0.9450 -0.3051 +vn 0.1181 -0.9450 0.3051 +vn 0.9541 -0.2981 -0.0298 +vn 0.9541 -0.2981 0.0298 +vn 0.9277 -0.3479 -0.1353 +vn 0.9277 -0.3479 0.1353 +vn 0.8158 -0.2755 0.5085 +vn 0.8158 -0.2755 -0.5085 +vn 0.9223 -0.0419 0.3843 +vn 0.9223 -0.0419 -0.3843 +vn 0.9774 0.0374 0.2083 +vn 0.9774 0.0374 -0.2083 +vn 0.6674 -0.4767 0.5721 +vn 0.6674 -0.4767 -0.5721 +vn 0.6435 -0.7531 0.1369 +vn 0.6435 -0.7531 -0.1369 +vn 0.6814 -0.6071 -0.4088 +vn 0.6814 -0.6071 0.4088 +vn 0.7070 -0.4130 -0.5740 +vn 0.7070 -0.4130 0.5740 +vn 0.8183 -0.0968 -0.5665 +vn 0.8183 -0.0968 0.5665 +vn 0.8129 0.1180 -0.5703 +vn 0.8129 0.1180 0.5703 +vn 0.6719 0.5621 -0.4823 +vn 0.6719 0.5621 0.4823 +vn 0.7473 0.6114 -0.2604 +vn 0.7473 0.6114 0.2604 +vn 0.9182 0.3607 -0.1640 +vn 0.9182 0.3607 0.1640 +vn 0.9682 0.2495 0.0178 +vn 0.9682 0.2495 -0.0178 +vn 0.8481 -0.4166 -0.3273 +vn 0.8481 -0.4166 0.3273 +vn 0.9235 -0.2610 -0.2811 +vn 0.9235 -0.2610 0.2811 +vn 0.7149 -0.6514 0.2542 +vn 0.7149 -0.6514 -0.2542 +vn 0.5333 -0.8455 0.0260 +vn 0.5333 -0.8455 -0.0260 +vn 0.8991 -0.2606 0.3518 +vn 0.8991 -0.2606 -0.3518 +vn 0.9358 -0.0110 0.3523 +vn 0.9358 -0.0110 -0.3523 +vn 0.8777 0.4608 0.1317 +vn 0.8777 0.4608 -0.1317 +vn 0.7870 0.6160 0.0342 +vn 0.7870 0.6160 -0.0342 +vn 0.7277 0.5836 -0.3603 +vn 0.7277 0.5836 0.3603 +vn 0.6858 0.5300 -0.4988 +vn 0.6858 0.5300 0.4988 +vn 0.6667 -0.3333 -0.6667 +vn 0.6667 -0.3333 0.6667 +vn 0.5727 -0.0731 -0.8165 +vn 0.5727 -0.0731 0.8165 +vn 0.6098 0.1161 -0.7840 +vn 0.6098 0.1161 0.7840 +vn -0.2461 0.8111 0.5306 +vn -0.2461 0.8111 -0.5306 +vn -0.3730 0.3695 0.8511 +vn -0.3730 0.3695 -0.8511 +vn -0.4331 0.8675 0.2446 +vn -0.4331 0.8675 -0.2446 +vn -0.3030 0.7465 -0.5924 +vn -0.3030 0.7465 0.5924 +vn -0.3118 0.8758 -0.3685 +vn -0.3118 0.8758 0.3685 +vn -0.2880 0.9151 -0.2821 +vn -0.2880 0.9151 0.2821 +vn -0.4991 0.1340 -0.8561 +vn -0.4991 0.1340 0.8561 +vn -0.4376 -0.7233 -0.5342 +vn -0.4376 -0.7233 0.5342 +vn -0.4368 -0.8131 -0.3849 +vn -0.4368 -0.8131 0.3849 +vn -0.7800 -0.5806 -0.2335 +vn -0.7800 -0.5806 0.2335 +vn -0.9678 -0.0583 -0.2449 +vn -0.9678 -0.0583 0.2449 +vn -0.8837 -0.4535 -0.1163 +vn -0.8837 -0.4535 0.1163 +vn -0.1388 -0.9836 -0.1152 +vn -0.1388 -0.9836 0.1152 +vn -0.2260 -0.9669 -0.1184 +vn -0.2260 -0.9669 0.1184 +vn -0.2808 -0.0085 -0.9597 +vn -0.2808 -0.0085 0.9597 +vn -0.3242 0.1629 -0.9319 +vn -0.3242 0.1629 0.9319 +vn -0.9865 0.0207 -0.1626 +vn -0.9865 0.0207 0.1626 +vn -0.9758 -0.2177 0.0188 +vn -0.9758 -0.2177 -0.0188 +vn -0.5884 -0.2926 -0.7538 +vn -0.5884 -0.2926 0.7538 +vn -0.3678 0.1379 -0.9196 +vn -0.3678 0.1379 0.9196 +vn -0.1944 0.3127 -0.9297 +vn -0.1944 0.3127 0.9297 +vn -0.2329 0.3376 -0.9120 +vn -0.2329 0.3376 0.9120 +vn -0.0607 0.3338 -0.9407 +vn -0.0607 0.3338 0.9407 +vn -0.4402 -0.8805 -0.1761 +vn -0.4402 -0.8805 0.1761 +vn -0.7991 -0.4733 -0.3708 +vn -0.7991 -0.4733 0.3708 +vn -0.4660 -0.8284 -0.3107 +vn -0.4660 -0.8284 0.3107 +vn -0.1287 -0.9515 -0.2793 +vn -0.1287 -0.9515 0.2793 +vn -0.1807 -0.9321 -0.3139 +vn -0.1807 -0.9321 0.3139 +vn -0.0609 -0.2083 -0.9762 +vn -0.0609 -0.2083 0.9762 +vn 0.2447 -0.5066 -0.8267 +vn 0.2447 -0.5066 0.8267 +vn -0.9315 -0.1158 -0.3449 +vn -0.9315 -0.1158 0.3449 +vn 0.2355 0.9644 -0.1203 +vn 0.2355 0.9644 0.1203 +vn -0.1851 0.9744 -0.1275 +vn -0.1851 0.9744 0.1275 +vn -0.7241 0.5947 -0.3492 +vn -0.7241 0.5947 0.3492 +vn -0.1449 0.8981 -0.4153 +vn -0.1449 0.8981 0.4153 +vn 0.6863 0.7036 -0.1845 +vn 0.6863 0.7036 0.1845 +vn 0.1608 0.7794 -0.6056 +vn 0.1608 0.7794 0.6056 +vn -0.2053 0.6806 -0.7033 +vn -0.2053 0.6806 0.7033 +vn -0.7166 0.2007 -0.6679 +vn -0.7166 0.2007 0.6679 +vn -0.7528 0.4342 -0.4948 +vn -0.7528 0.4342 0.4948 +vn -0.1761 0.7459 -0.6423 +vn -0.1761 0.7459 0.6423 +vn 0.1530 0.6788 -0.7182 +vn 0.1530 0.6788 0.7182 +vn 0.5444 0.3972 -0.7388 +vn 0.5444 0.3972 0.7388 +vn -0.1579 0.9261 -0.3428 +vn -0.1579 0.9261 0.3428 +vn 0.7867 0.5740 -0.2270 +vn 0.7867 0.5740 0.2270 +vn -0.9795 0.1046 0.1722 +vn -0.9795 0.1046 -0.1722 +vn 0.4013 0.9150 -0.0425 +vn 0.4013 0.9150 0.0425 +vn 0.9694 0.1847 0.1616 +vn 0.9694 0.1847 -0.1616 +vn 0.0483 0.1973 -0.9791 +vn 0.0483 0.1973 0.9791 +vn 0.3079 0.0918 -0.9470 +vn 0.3079 0.0918 0.9470 +vn -0.0661 0.1905 -0.9794 +vn -0.0661 0.1905 0.9794 +vn -0.1070 0.0312 -0.9938 +vn -0.1070 0.0312 0.9938 +vn 0.0501 -0.7008 -0.7116 +vn 0.0501 -0.7008 0.7116 +vn 0.0847 -0.9243 -0.3722 +vn 0.0847 -0.9243 0.3722 +vn 0.2310 -0.8644 -0.4465 +vn 0.2310 -0.8644 0.4465 +vn 0.2405 -0.7578 -0.6066 +vn 0.2405 -0.7578 0.6066 +vn 0.2407 -0.6368 -0.7325 +vn 0.2407 -0.6368 0.7325 +vn 0.8533 -0.4499 -0.2637 +vn 0.8533 -0.4499 0.2637 +vn -0.7673 -0.3181 -0.5568 +vn -0.7673 -0.3181 0.5568 +vn -0.8190 -0.2807 -0.5004 +vn -0.8190 -0.2807 0.5004 +vn -0.4205 -0.8494 -0.3190 +vn -0.4205 -0.8494 0.3190 +vn -0.2793 -0.6356 -0.7198 +vn -0.2793 -0.6356 0.7198 +vn -0.7473 -0.4408 -0.4972 +vn -0.7473 -0.4408 0.4972 +vn 0.8557 0.3807 -0.3506 +vn 0.8557 0.3807 0.3506 +vn 0.8730 0.1715 -0.4566 +vn 0.8730 0.1715 0.4566 +vn 0.9603 0.1055 -0.2583 +vn 0.9603 0.1055 0.2583 +vn 0.9661 -0.0802 -0.2455 +vn 0.9661 -0.0802 0.2455 +vn 0.8837 -0.0599 -0.4643 +vn 0.8837 -0.0599 0.4643 +vn 0.7210 -0.3045 -0.6225 +vn 0.7210 -0.3045 0.6225 +vn 0.6027 0.6590 -0.4500 +vn 0.6027 0.6590 0.4500 +vn 0.4884 0.8309 0.2667 +vn 0.4884 0.8309 -0.2667 +vn 0.5111 0.2291 0.8284 +vn 0.5111 0.2291 -0.8284 +vn 0.7727 -0.3566 0.5251 +vn 0.7727 -0.3566 -0.5251 +vn 0.6873 -0.5665 -0.4546 +vn 0.6873 -0.5665 0.4546 +vn 0.5552 -0.4497 -0.6996 +vn 0.5552 -0.4497 0.6996 +vn -0.1126 -0.6827 -0.7220 +vn -0.1126 -0.6827 0.7220 +vn 0.9388 0.2860 0.1919 +vn 0.9388 0.2860 -0.1919 +vn -0.2047 -0.3734 -0.9048 +vn -0.2047 -0.3734 0.9048 +vn 0.9825 0.1551 -0.1034 +vn 0.9825 0.1551 0.1034 +vn 0.3530 0.9318 -0.0841 +vn 0.3530 0.9318 0.0841 +vn 0.7594 -0.0883 -0.6446 +vn 0.7594 -0.0883 0.6446 +vn 0.7678 0.4740 -0.4309 +vn 0.7678 0.4740 0.4309 +vn 0.3462 -0.4847 -0.8032 +vn 0.3462 -0.4847 0.8032 +vn 0.7014 -0.4128 -0.5811 +vn 0.7014 -0.4128 0.5811 +vn 0.6822 -0.4305 -0.5910 +vn 0.6822 -0.4305 0.5910 +vn -0.0591 -0.1804 -0.9818 +vn -0.0591 -0.1804 0.9818 +vn -0.1175 -0.3965 -0.9105 +vn -0.1175 -0.3965 0.9105 +vn -0.0725 -0.0181 -0.9972 +vn -0.0725 -0.0181 0.9972 +vn 0.1925 -0.6543 -0.7313 +vn 0.1924 -0.6543 0.7313 +vn 0.1073 -0.6079 -0.7867 +vn 0.1073 -0.6079 0.7867 +vn 0.1170 -0.7022 -0.7022 +vn 0.1170 -0.7022 0.7022 +vn -0.0511 0.9816 -0.1840 +vn -0.0511 0.9816 0.1840 +vn 0.1284 0.3301 -0.9352 +vn 0.1284 0.3301 0.9352 +vn 0.0553 -0.7463 -0.6633 +vn 0.0553 -0.7463 0.6633 +vn 0.0767 0.9970 0.0085 +vn 0.0767 0.9970 -0.0085 +vn 0.3354 -0.7061 -0.6237 +vn 0.3354 -0.7061 0.6237 +vn 0.3587 -0.8925 -0.2733 +vn 0.3587 -0.8925 0.2733 +vn -0.2200 -0.5080 0.8328 +vn -0.2200 -0.5080 -0.8328 +vn -0.4981 0.2377 0.8339 +vn -0.4981 0.2377 -0.8339 +vn -0.2539 0.7847 0.5655 +vn -0.2539 0.7847 -0.5655 +vn 0.0672 0.9962 0.0560 +vn 0.0672 0.9962 -0.0560 +vn 0.9893 0.0222 -0.1445 +vn 0.9893 0.0222 0.1445 +vn 0.9427 0.0645 -0.3275 +vn 0.9427 0.0645 0.3275 +vn 0.9496 0.0232 -0.3127 +vn 0.9496 0.0232 0.3127 +vn 0.9849 0.0274 -0.1710 +vn 0.9849 0.0274 0.1710 +vn 0.8929 0.2849 -0.3487 +vn 0.8929 0.2849 0.3487 +vn 0.9156 -0.0343 -0.4006 +vn 0.9156 -0.0343 0.4006 +vn 0.9645 -0.0603 -0.2572 +vn 0.9645 -0.0603 0.2572 +vn 0.9979 -0.0106 -0.0637 +vn 0.9979 -0.0106 0.0637 +vn 0.6101 0.7039 0.3637 +vn 0.6101 0.7039 -0.3637 +vn 0.7759 0.0355 -0.6299 +vn 0.7759 0.0355 0.6299 +vn 0.8717 -0.2002 -0.4472 +vn 0.8717 -0.2002 0.4472 +vn 0.8348 -0.2141 -0.5072 +vn 0.8348 -0.2141 0.5072 +vn 0.8093 0.2619 -0.5258 +vn 0.8093 0.2619 0.5258 +vn 0.7580 0.5802 -0.2980 +vn 0.7580 0.5802 0.2980 +vn -0.0805 -0.9924 -0.0930 +vn -0.0805 -0.9924 0.0930 +vn 0.0080 -0.8657 -0.5006 +vn 0.0080 -0.8657 0.5006 +vn 0.2748 -0.2497 -0.9285 +vn 0.2748 -0.2497 0.9285 +vn -0.0378 0.5424 -0.8393 +vn -0.0378 0.5424 0.8393 +vn -0.2589 0.9367 0.2355 +vn -0.2589 0.9367 -0.2355 +vn -0.1285 0.8838 0.4499 +vn -0.1285 0.8838 -0.4499 +vn -0.8427 -0.0098 0.5384 +vn -0.8427 -0.0098 -0.5384 +vn -0.9813 -0.0241 0.1910 +vn -0.9813 -0.0241 -0.1910 +vn -0.9141 0.0266 -0.4046 +vn -0.9141 0.0266 0.4046 +vn 0.0197 0.6231 0.7819 +vn 0.0197 0.6231 -0.7819 +vn -0.8142 -0.2063 -0.5428 +vn -0.8142 -0.2063 0.5428 +vn -0.2945 -0.9231 0.2474 +vn -0.2945 -0.9231 -0.2474 +usemtl None +s off +f 1061/1113/999 1015/1114/999 1017/1115/999 1059/1116/999 +f 1018/1117/1000 1016/1118/1000 1062/1119/1000 1060/1120/1000 +f 1059/1116/1001 1017/1115/1001 1019/1121/1001 1057/1122/1001 +f 1020/1123/1002 1018/1117/1002 1060/1120/1002 1058/1124/1002 +f 1017/1115/1003 1023/1125/1003 1021/1126/1003 1019/1121/1003 +f 1022/1127/1004 1024/1128/1004 1018/1117/1004 1020/1123/1004 +f 1015/1114/1005 1025/1129/1005 1023/1125/1005 1017/1115/1005 +f 1024/1128/1006 1026/1130/1006 1016/1118/1006 1018/1117/1006 +f 1025/1129/1007 1027/1131/1007 1029/1132/1007 1023/1125/1007 +f 1030/1133/1008 1028/1134/1008 1026/1130/1008 1024/1128/1008 +f 1023/1125/1009 1029/1132/1009 1031/1135/1009 1021/1126/1009 +f 1032/1136/1010 1030/1133/1010 1024/1128/1010 1022/1127/1010 +f 1029/1132/1011 1035/1137/1011 1033/1138/1011 1031/1135/1011 +f 1034/1139/1012 1036/1140/1012 1030/1133/1012 1032/1136/1012 +f 1027/1131/1013 1037/1141/1013 1035/1137/1013 1029/1132/1013 +f 1036/1140/1014 1038/1142/1014 1028/1134/1014 1030/1133/1014 +f 1037/1141/1015 1039/1143/1015 1041/1144/1015 1035/1137/1015 +f 1042/1145/1016 1040/1146/1016 1038/1142/1016 1036/1140/1016 +f 1035/1137/1017 1041/1144/1017 1043/1147/1017 1033/1138/1017 +f 1044/1148/1018 1042/1145/1018 1036/1140/1018 1034/1139/1018 +f 1041/1144/1019 1047/1149/1019 1045/1150/1019 1043/1147/1019 +f 1046/1151/1020 1048/1152/1020 1042/1145/1020 1044/1148/1020 +f 1039/1143/1021 1049/1153/1021 1047/1149/1021 1041/1144/1021 +f 1048/1152/1022 1050/1154/1022 1040/1146/1022 1042/1145/1022 +f 1049/1153/1023 1051/1155/1023 1053/1156/1023 1047/1149/1023 +f 1054/1157/1024 1052/1158/1024 1050/1154/1024 1048/1152/1024 +f 1047/1149/1025 1053/1156/1025 1055/1159/1025 1045/1150/1025 +f 1056/1160/1026 1054/1157/1026 1048/1152/1026 1046/1151/1026 +f 1053/1156/1027 1059/1116/1027 1057/1122/1027 1055/1159/1027 +f 1058/1124/1028 1060/1120/1028 1054/1157/1028 1056/1160/1028 +f 1051/1155/1029 1061/1113/1029 1059/1116/1029 1053/1156/1029 +f 1060/1120/1030 1062/1119/1030 1052/1158/1030 1054/1157/1030 +f 1061/1113/1031 1051/1155/1031 1065/1161/1031 1063/1162/1031 +f 1066/1163/1032 1052/1158/1032 1062/1119/1032 1064/1164/1032 +f 1051/1155/1033 1049/1153/1033 1067/1165/1033 1065/1161/1033 +f 1068/1166/1034 1050/1154/1034 1052/1158/1034 1066/1163/1034 +f 1049/1153/1035 1039/1143/1035 1069/1167/1035 1067/1165/1035 +f 1070/1168/1036 1040/1146/1036 1050/1154/1036 1068/1166/1036 +f 1039/1143/1037 1037/1141/1037 1071/1169/1037 1069/1167/1037 +f 1072/1170/1038 1038/1142/1038 1040/1146/1038 1070/1168/1038 +f 1037/1141/1039 1027/1131/1039 1073/1171/1039 1071/1169/1039 +f 1074/1172/1040 1028/1134/1040 1038/1142/1040 1072/1170/1040 +f 1027/1131/1041 1025/1129/1041 1077/1173/1041 1073/1171/1041 +f 1078/1174/1042 1026/1130/1042 1028/1134/1042 1074/1172/1042 +f 1025/1129/1043 1015/1114/1043 1079/1175/1043 1077/1173/1043 +f 1080/1176/1044 1016/1118/1044 1026/1130/1044 1078/1174/1044 +f 1015/1114/1045 1061/1113/1045 1063/1162/1045 1079/1175/1045 +f 1064/1164/1046 1062/1119/1046 1016/1118/1046 1080/1176/1046 +f 1075/1177/1047 1079/1175/1047 1063/1162/1047 +f 1064/1164/1048 1080/1176/1048 1076/1178/1048 +f 1077/1173/1049 1079/1175/1049 1075/1177/1049 +f 1076/1178/1050 1080/1176/1050 1078/1174/1050 +f 1075/1177/1051 1073/1171/1051 1077/1173/1051 +f 1078/1174/1052 1074/1172/1052 1076/1178/1052 +f 1075/1177/1053 1071/1169/1053 1073/1171/1053 +f 1074/1172/1054 1072/1170/1054 1076/1178/1054 +f 1075/1177/1055 1069/1167/1055 1071/1169/1055 +f 1072/1170/1056 1070/1168/1056 1076/1178/1056 +f 1075/1177/1057 1067/1165/1057 1069/1167/1057 +f 1070/1168/1058 1068/1166/1058 1076/1178/1058 +f 1075/1177/1059 1065/1161/1059 1067/1165/1059 +f 1068/1166/1060 1066/1163/1060 1076/1178/1060 +f 1075/1177/1061 1063/1162/1061 1065/1161/1061 +f 1066/1163/1062 1064/1164/1062 1076/1178/1062 +f 1103/1179/1063 1188/1180/1063 1190/1181/1063 1105/1182/1063 +f 1190/1181/1064 1189/1183/1064 1104/1184/1064 1105/1182/1064 +f 1101/1185/1065 1186/1186/1065 1188/1180/1065 1103/1179/1065 +f 1189/1183/1066 1187/1187/1066 1102/1188/1066 1104/1184/1066 +f 1099/1189/1067 1184/1190/1067 1186/1186/1067 1101/1185/1067 +f 1187/1187/1068 1185/1191/1068 1100/1192/1068 1102/1188/1068 +f 1097/1193/1069 1182/1194/1069 1184/1190/1069 1099/1189/1069 +f 1185/1191/1070 1183/1195/1070 1098/1196/1070 1100/1192/1070 +f 1095/1197/1071 1180/1198/1071 1182/1194/1071 1097/1193/1071 +f 1183/1195/1072 1181/1199/1072 1096/1200/1072 1098/1196/1072 +f 1093/1201/1073 1106/1202/1073 1160/1203/1073 1178/1204/1073 +f 1161/1205/1074 1107/1206/1074 1094/1207/1074 1179/1208/1074 +f 1106/1202/1075 1108/1209/1075 1162/1210/1075 1160/1203/1075 +f 1163/1211/1076 1109/1212/1076 1107/1206/1076 1161/1205/1076 +f 1108/1209/1077 1110/1213/1077 1164/1214/1077 1162/1210/1077 +f 1165/1215/1078 1111/1216/1078 1109/1212/1078 1163/1211/1078 +f 1110/1213/1079 1112/1217/1079 1166/1218/1079 1164/1214/1079 +f 1167/1219/1080 1113/1220/1080 1111/1216/1080 1165/1215/1080 +f 1112/1217/1081 1114/1221/1081 1168/1222/1081 1166/1218/1081 +f 1169/1223/1082 1115/1224/1082 1113/1220/1082 1167/1219/1082 +f 1114/1221/1083 1116/1225/1083 1170/1226/1083 1168/1222/1083 +f 1171/1227/1084 1117/1228/1084 1115/1224/1084 1169/1223/1084 +f 1116/1225/1085 1118/1229/1085 1172/1230/1085 1170/1226/1085 +f 1173/1231/1086 1119/1232/1086 1117/1228/1086 1171/1227/1086 +f 1118/1229/1087 1120/1233/1087 1174/1234/1087 1172/1230/1087 +f 1175/1235/1088 1121/1236/1088 1119/1232/1088 1173/1231/1088 +f 1120/1233/1089 1122/1237/1089 1176/1238/1089 1174/1234/1089 +f 1177/1239/1090 1123/1240/1090 1121/1236/1090 1175/1235/1090 +f 1122/1237/1091 1081/1241/1091 1082/1242/1091 1176/1238/1091 +f 1082/1242/1092 1081/1241/1092 1123/1240/1092 1177/1239/1092 +f 1124/1243/1093 1142/1244/1093 1174/1234/1093 1176/1238/1093 +f 1175/1235/1094 1143/1245/1094 1125/1246/1094 1177/1239/1094 +f 1142/1244/1095 1193/1247/1095 1172/1230/1095 1174/1234/1095 +f 1173/1231/1096 1194/1248/1096 1143/1245/1096 1175/1235/1096 +f 1140/1249/1097 1170/1226/1097 1172/1230/1097 1193/1247/1097 +f 1173/1231/1098 1171/1227/1098 1141/1250/1098 1194/1248/1098 +f 1138/1251/1099 1168/1222/1099 1170/1226/1099 1140/1249/1099 +f 1171/1227/1100 1169/1223/1100 1139/1252/1100 1141/1250/1100 +f 1136/1253/1101 1166/1218/1101 1168/1222/1101 1138/1251/1101 +f 1169/1223/1102 1167/1219/1102 1137/1254/1102 1139/1252/1102 +f 1134/1255/1103 1164/1214/1103 1166/1218/1103 1136/1253/1103 +f 1167/1219/1104 1165/1215/1104 1135/1256/1104 1137/1254/1104 +f 1132/1257/1105 1162/1210/1105 1164/1214/1105 1134/1255/1105 +f 1165/1215/1106 1163/1211/1106 1133/1258/1106 1135/1256/1106 +f 1130/1259/1107 1160/1203/1107 1162/1210/1107 1132/1257/1107 +f 1163/1211/1108 1161/1205/1108 1131/1260/1108 1133/1258/1108 +f 1128/1261/1109 1178/1204/1109 1160/1203/1109 1130/1259/1109 +f 1161/1205/1110 1179/1208/1110 1129/1262/1110 1131/1260/1110 +f 1128/1261/1111 1195/1263/1111 1191/1264/1111 1178/1204/1111 +f 1191/1264/1112 1196/1265/1112 1129/1262/1112 1179/1208/1112 +f 1124/1243/1113 1176/1238/1113 1082/1242/1113 1126/1266/1113 +f 1082/1242/1114 1177/1239/1114 1125/1246/1114 1127/1267/1114 +f 1126/1266/1115 1082/1242/1115 1192/1268/1115 1197/1269/1115 +f 1192/1268/1116 1082/1242/1116 1127/1267/1116 1198/1270/1116 +f 1191/1264/1117 1195/1263/1117 1197/1269/1117 1192/1268/1117 +f 1198/1270/1118 1196/1265/1118 1191/1264/1118 1192/1268/1118 +f 1149/1271/1119 1151/1272/1119 1190/1181/1119 1188/1180/1119 +f 1190/1181/1120 1151/1272/1120 1150/1273/1120 1189/1183/1120 +f 1147/1274/1121 1149/1271/1121 1188/1180/1121 1186/1186/1121 +f 1189/1183/1122 1150/1273/1122 1148/1275/1122 1187/1187/1122 +f 1145/1276/1123 1147/1274/1123 1186/1186/1123 1184/1190/1123 +f 1187/1187/1124 1148/1275/1124 1146/1277/1124 1185/1191/1124 +f 1180/1198/1125 1201/1278/1125 1199/1279/1125 1182/1194/1125 +f 1200/1280/1126 1202/1281/1126 1181/1199/1126 1183/1195/1126 +f 1145/1276/1127 1184/1190/1127 1182/1194/1127 1199/1279/1127 +f 1183/1195/1128 1185/1191/1128 1146/1277/1128 1200/1280/1128 +f 1158/1282/1129 1204/1283/1129 1203/1284/1129 1201/1278/1129 +f 1203/1284/1130 1204/1283/1130 1159/1285/1130 1202/1281/1130 +f 1199/1279/1131 1201/1278/1131 1203/1284/1131 1083/1286/1131 +f 1203/1284/1132 1202/1281/1132 1200/1280/1132 1083/1286/1132 +f 1144/1287/1133 1145/1276/1133 1199/1279/1133 1083/1286/1133 +f 1200/1280/1133 1146/1277/1133 1144/1287/1133 1083/1286/1133 +f 1156/1288/1134 1207/1289/1134 1205/1290/1134 1158/1282/1134 +f 1206/1291/1135 1208/1292/1135 1157/1293/1135 1159/1285/1135 +f 1154/1294/1136 1209/1295/1136 1207/1289/1136 1156/1288/1136 +f 1208/1292/1137 1210/1296/1137 1155/1297/1137 1157/1293/1137 +f 1153/1298/1138 1211/1299/1138 1209/1295/1138 1154/1294/1138 +f 1210/1296/1139 1212/1300/1139 1153/1298/1139 1155/1297/1139 +f 1152/1301/1140 1085/1302/1140 1211/1299/1140 1153/1298/1140 +f 1212/1300/1141 1085/1302/1141 1152/1301/1141 1153/1298/1141 +f 1204/1283/1142 1158/1282/1142 1205/1290/1142 1084/1303/1142 +f 1206/1291/1143 1159/1285/1143 1204/1283/1143 1084/1303/1143 +f 1084/1303/1144 1205/1290/1144 1220/1304/1144 1222/1305/1144 +f 1221/1306/1145 1206/1291/1145 1084/1303/1145 1222/1305/1145 +f 1085/1302/1146 1213/1307/1146 1214/1308/1146 1211/1299/1146 +f 1215/1309/1147 1213/1307/1147 1085/1302/1147 1212/1300/1147 +f 1211/1299/1148 1214/1308/1148 1216/1310/1148 1209/1295/1148 +f 1217/1311/1149 1215/1309/1149 1212/1300/1149 1210/1296/1149 +f 1209/1295/1150 1216/1310/1150 1218/1312/1150 1207/1289/1150 +f 1219/1313/1151 1217/1311/1151 1210/1296/1151 1208/1292/1151 +f 1207/1289/1152 1218/1312/1152 1220/1304/1152 1205/1290/1152 +f 1221/1306/1153 1219/1313/1153 1208/1292/1153 1206/1291/1153 +f 1213/1307/1154 1218/1312/1154 1216/1310/1154 1214/1308/1154 +f 1217/1311/1155 1219/1313/1155 1213/1307/1155 1215/1309/1155 +f 1213/1307/1156 1222/1305/1156 1220/1304/1156 1218/1312/1156 +f 1221/1306/1157 1222/1305/1157 1213/1307/1157 1219/1313/1157 +f 1153/1298/1158 1154/1294/1158 1178/1204/1158 1191/1264/1158 +f 1179/1208/1159 1155/1297/1159 1153/1298/1159 1191/1264/1159 +f 1154/1294/1160 1156/1288/1160 1225/1314/1160 1178/1204/1160 +f 1226/1315/1161 1157/1293/1161 1155/1297/1161 1179/1208/1161 +f 1156/1288/1162 1158/1282/1162 1227/1316/1162 1225/1314/1162 +f 1228/1317/1163 1159/1285/1163 1157/1293/1163 1226/1315/1163 +f 1158/1282/1164 1201/1278/1164 1180/1198/1164 1227/1316/1164 +f 1181/1199/1165 1202/1281/1165 1159/1285/1165 1228/1317/1165 +f 1095/1197/1166 1223/1318/1166 1227/1316/1166 1180/1198/1166 +f 1228/1317/1167 1224/1319/1167 1096/1200/1167 1181/1199/1167 +f 1223/1318/1168 1229/1320/1168 1225/1314/1168 1227/1316/1168 +f 1226/1315/1169 1230/1321/1169 1224/1319/1169 1228/1317/1169 +f 1093/1201/1170 1178/1204/1170 1225/1314/1170 1229/1320/1170 +f 1226/1315/1171 1179/1208/1171 1094/1207/1171 1230/1321/1171 +f 1145/1276/1172 1144/1287/1172 1086/1322/1172 1236/1323/1172 +f 1086/1322/1173 1144/1287/1173 1146/1277/1173 1237/1324/1173 +f 1147/1274/1174 1145/1276/1174 1236/1323/1174 1234/1325/1174 +f 1237/1324/1175 1146/1277/1175 1148/1275/1175 1235/1326/1175 +f 1149/1271/1176 1147/1274/1176 1234/1325/1176 1232/1327/1176 +f 1235/1326/1177 1148/1275/1177 1150/1273/1177 1233/1328/1177 +f 1151/1272/1178 1149/1271/1178 1232/1327/1178 1231/1329/1178 +f 1233/1328/1179 1150/1273/1179 1151/1272/1179 1231/1329/1179 +f 1231/1329/1180 1232/1327/1180 1243/1330/1180 1245/1331/1180 +f 1244/1332/1181 1233/1328/1181 1231/1329/1181 1245/1331/1181 +f 1232/1327/1182 1234/1325/1182 1241/1333/1182 1243/1330/1182 +f 1242/1334/1183 1235/1326/1183 1233/1328/1183 1244/1332/1183 +f 1234/1325/1184 1236/1323/1184 1239/1335/1184 1241/1333/1184 +f 1240/1336/1185 1237/1324/1185 1235/1326/1185 1242/1334/1185 +f 1236/1323/1186 1086/1322/1186 1238/1337/1186 1239/1335/1186 +f 1238/1337/1187 1086/1322/1187 1237/1324/1187 1240/1336/1187 +f 1238/1337/1188 1245/1331/1188 1243/1330/1188 1239/1335/1188 +f 1244/1332/1189 1245/1331/1189 1238/1337/1189 1240/1336/1189 +f 1239/1335/1190 1243/1330/1190 1241/1333/1190 +f 1242/1334/1191 1244/1332/1191 1240/1336/1191 +f 1197/1269/1192 1195/1263/1192 1248/1338/1192 1246/1339/1192 +f 1249/1340/1193 1196/1265/1193 1198/1270/1193 1247/1341/1193 +f 1126/1266/1194 1197/1269/1194 1246/1339/1194 1268/1342/1194 +f 1247/1341/1195 1198/1270/1195 1127/1267/1195 1269/1343/1195 +f 1124/1243/1196 1126/1266/1196 1268/1342/1196 1270/1344/1196 +f 1269/1343/1197 1127/1267/1197 1125/1246/1197 1271/1345/1197 +f 1195/1263/1198 1128/1261/1198 1266/1346/1198 1248/1338/1198 +f 1267/1347/1199 1129/1262/1199 1196/1265/1199 1249/1340/1199 +f 1128/1261/1200 1130/1259/1200 1264/1348/1200 1266/1346/1200 +f 1265/1349/1201 1131/1260/1201 1129/1262/1201 1267/1347/1201 +f 1130/1259/1202 1132/1257/1202 1262/1350/1202 1264/1348/1202 +f 1263/1351/1203 1133/1258/1203 1131/1260/1203 1265/1349/1203 +f 1132/1257/1204 1134/1255/1204 1260/1352/1204 1262/1350/1204 +f 1261/1353/1205 1135/1256/1205 1133/1258/1205 1263/1351/1205 +f 1134/1255/1206 1136/1253/1206 1258/1354/1206 1260/1352/1206 +f 1259/1355/1207 1137/1254/1207 1135/1256/1207 1261/1353/1207 +f 1136/1253/1208 1138/1251/1208 1256/1356/1208 1258/1354/1208 +f 1257/1357/1209 1139/1252/1209 1137/1254/1209 1259/1355/1209 +f 1138/1251/1210 1140/1249/1210 1254/1358/1210 1256/1356/1210 +f 1255/1359/1211 1141/1250/1211 1139/1252/1211 1257/1357/1211 +f 1140/1249/1212 1193/1247/1212 1250/1360/1212 1254/1358/1212 +f 1251/1361/1213 1194/1248/1213 1141/1250/1213 1255/1359/1213 +f 1193/1247/1214 1142/1244/1214 1252/1362/1214 1250/1360/1214 +f 1253/1363/1215 1143/1245/1215 1194/1248/1215 1251/1361/1215 +f 1142/1244/1216 1124/1243/1216 1270/1344/1216 1252/1362/1216 +f 1271/1345/1217 1125/1246/1217 1143/1245/1217 1253/1363/1217 +f 1252/1362/1218 1270/1344/1218 1272/1364/1218 1290/1365/1218 +f 1273/1366/1219 1271/1345/1219 1253/1363/1219 1291/1367/1219 +f 1250/1360/1220 1252/1362/1220 1290/1365/1220 1292/1368/1220 +f 1291/1367/1221 1253/1363/1221 1251/1361/1221 1293/1369/1221 +f 1254/1358/1222 1250/1360/1222 1292/1368/1222 1288/1370/1222 +f 1293/1369/1223 1251/1361/1223 1255/1359/1223 1289/1371/1223 +f 1256/1356/1224 1254/1358/1224 1288/1370/1224 1286/1372/1224 +f 1289/1371/1225 1255/1359/1225 1257/1357/1225 1287/1373/1225 +f 1258/1354/1226 1256/1356/1226 1286/1372/1226 1284/1374/1226 +f 1287/1373/1227 1257/1357/1227 1259/1355/1227 1285/1375/1227 +f 1260/1352/1228 1258/1354/1228 1284/1374/1228 1282/1376/1228 +f 1285/1375/1229 1259/1355/1229 1261/1353/1229 1283/1377/1229 +f 1262/1350/1230 1260/1352/1230 1282/1376/1230 1280/1378/1230 +f 1283/1377/1231 1261/1353/1231 1263/1351/1231 1281/1379/1231 +f 1264/1348/1232 1262/1350/1232 1280/1378/1232 1278/1380/1232 +f 1281/1379/1233 1263/1351/1233 1265/1349/1233 1279/1381/1233 +f 1266/1346/1234 1264/1348/1234 1278/1380/1234 1276/1382/1234 +f 1279/1381/1235 1265/1349/1235 1267/1347/1235 1277/1383/1235 +f 1248/1338/1236 1266/1346/1236 1276/1382/1236 1294/1384/1236 +f 1277/1383/1237 1267/1347/1237 1249/1340/1237 1295/1385/1237 +f 1270/1344/1238 1268/1342/1238 1274/1386/1238 1272/1364/1238 +f 1275/1387/1239 1269/1343/1239 1271/1345/1239 1273/1366/1239 +f 1268/1342/1240 1246/1339/1240 1296/1388/1240 1274/1386/1240 +f 1297/1389/1241 1247/1341/1241 1269/1343/1241 1275/1387/1241 +f 1246/1339/1242 1248/1338/1242 1294/1384/1242 1296/1388/1242 +f 1295/1385/1243 1249/1340/1243 1247/1341/1243 1297/1389/1243 +f 1081/1241/1244 1122/1237/1244 1298/1390/1244 1087/1391/1244 +f 1299/1392/1245 1123/1240/1245 1081/1241/1245 1087/1391/1245 +f 1122/1237/1246 1120/1233/1246 1300/1393/1246 1298/1390/1246 +f 1301/1394/1247 1121/1236/1247 1123/1240/1247 1299/1392/1247 +f 1120/1233/1248 1118/1229/1248 1302/1395/1248 1300/1393/1248 +f 1303/1396/1249 1119/1232/1249 1121/1236/1249 1301/1394/1249 +f 1118/1229/1250 1116/1225/1250 1304/1397/1250 1302/1395/1250 +f 1305/1398/1251 1117/1228/1251 1119/1232/1251 1303/1396/1251 +f 1116/1225/1252 1114/1221/1252 1306/1399/1252 1304/1397/1252 +f 1307/1400/1253 1115/1224/1253 1117/1228/1253 1305/1398/1253 +f 1114/1221/1254 1112/1217/1254 1308/1401/1254 1306/1399/1254 +f 1309/1402/1255 1113/1220/1255 1115/1224/1255 1307/1400/1255 +f 1112/1217/1256 1110/1213/1256 1310/1403/1256 1308/1401/1256 +f 1311/1404/1257 1111/1216/1257 1113/1220/1257 1309/1402/1257 +f 1110/1213/1258 1108/1209/1258 1312/1405/1258 1310/1403/1258 +f 1313/1406/1259 1109/1212/1259 1111/1216/1259 1311/1404/1259 +f 1108/1209/1260 1106/1202/1260 1314/1407/1260 1312/1405/1260 +f 1315/1408/1261 1107/1206/1261 1109/1212/1261 1313/1406/1261 +f 1322/1409/1262 1323/1410/1262 1342/1411/1262 1352/1412/1262 +f 1343/1413/1263 1323/1414/1263 1322/1415/1263 1353/1416/1263 +f 1321/1417/1264 1322/1409/1264 1352/1412/1264 1350/1418/1264 +f 1353/1416/1265 1322/1415/1265 1321/1419/1265 1351/1420/1265 +f 1320/1421/1266 1321/1417/1266 1350/1418/1266 1354/1422/1266 +f 1351/1420/1267 1321/1419/1267 1320/1421/1267 1355/1423/1267 +f 1103/1179/1268 1105/1182/1268 1320/1421/1268 1354/1422/1268 +f 1320/1421/1269 1105/1182/1269 1104/1184/1269 1355/1423/1269 +f 1101/1185/1270 1103/1179/1270 1354/1422/1270 1348/1424/1270 +f 1355/1423/1271 1104/1184/1271 1102/1188/1271 1349/1425/1271 +f 1099/1189/1272 1101/1185/1272 1348/1424/1272 1344/1426/1272 +f 1349/1425/1273 1102/1188/1273 1100/1192/1273 1345/1427/1273 +f 1097/1193/1274 1099/1189/1274 1344/1426/1274 1346/1428/1274 +f 1345/1427/1275 1100/1192/1275 1098/1196/1275 1347/1429/1275 +f 1344/1426/1276 1350/1418/1276 1352/1412/1276 1346/1428/1276 +f 1353/1416/1277 1351/1420/1277 1345/1427/1277 1347/1429/1277 +f 1344/1426/1278 1348/1424/1278 1354/1422/1278 1350/1418/1278 +f 1355/1423/1279 1349/1425/1279 1345/1427/1279 1351/1420/1279 +f 1340/1430/1280 1346/1428/1280 1352/1412/1280 1342/1411/1280 +f 1353/1416/1281 1347/1429/1281 1341/1431/1281 1343/1413/1281 +f 1095/1197/1282 1097/1193/1282 1346/1428/1282 1340/1430/1282 +f 1347/1429/1283 1098/1196/1283 1096/1200/1283 1341/1431/1283 +f 1223/1318/1284 1356/1432/1284 1358/1433/1284 1229/1320/1284 +f 1359/1434/1285 1357/1435/1285 1224/1319/1285 1230/1321/1285 +f 1095/1197/1286 1340/1430/1286 1356/1432/1286 1223/1318/1286 +f 1357/1435/1287 1341/1431/1287 1096/1200/1287 1224/1319/1287 +f 1093/1201/1288 1229/1320/1288 1358/1433/1288 1360/1436/1288 +f 1359/1434/1289 1230/1321/1289 1094/1207/1289 1361/1437/1289 +f 1093/1201/1290 1360/1436/1290 1314/1407/1290 1106/1202/1290 +f 1315/1408/1291 1361/1437/1291 1094/1207/1291 1107/1206/1291 +f 1091/1438/1292 1338/1439/1292 1366/1440/1292 1318/1441/1292 +f 1367/1442/1293 1339/1443/1293 1091/1444/1293 1318/1445/1293 +f 1318/1441/1294 1366/1440/1294 1364/1446/1294 1092/1447/1294 +f 1365/1448/1295 1367/1442/1295 1318/1445/1295 1092/1449/1295 +f 1092/1447/1296 1364/1446/1296 1362/1450/1296 1319/1451/1296 +f 1363/1452/1297 1365/1448/1297 1092/1449/1297 1319/1453/1297 +f 1319/1451/1298 1362/1450/1298 1342/1411/1298 1323/1410/1298 +f 1343/1413/1299 1363/1452/1299 1319/1453/1299 1323/1414/1299 +f 1340/1430/1300 1342/1411/1300 1362/1450/1300 1356/1432/1300 +f 1363/1452/1301 1343/1413/1301 1341/1431/1301 1357/1435/1301 +f 1310/1403/1302 1312/1405/1302 1332/1454/1302 1324/1455/1302 +f 1333/1456/1303 1313/1406/1303 1311/1404/1303 1325/1457/1303 +f 1090/1458/1304 1330/1459/1304 1338/1439/1304 1091/1438/1304 +f 1339/1443/1305 1331/1460/1305 1090/1461/1305 1091/1444/1305 +f 1316/1462/1306 1372/1463/1306 1370/1464/1306 1317/1465/1306 +f 1371/1466/1307 1373/1467/1307 1316/1468/1307 1317/1469/1307 +f 1317/1465/1308 1370/1464/1308 1368/1470/1308 1089/1471/1308 +f 1369/1472/1309 1371/1466/1309 1317/1469/1309 1089/1473/1309 +f 1089/1471/1310 1368/1470/1310 1330/1459/1310 1090/1458/1310 +f 1331/1460/1311 1369/1472/1311 1089/1473/1311 1090/1461/1311 +f 1306/1474/1312 1308/1401/1312 1376/1475/1312 1378/1476/1312 +f 1377/1477/1313 1309/1402/1313 1307/1478/1313 1379/1479/1313 +f 1378/1476/1314 1376/1475/1314 1382/1480/1314 1380/1481/1314 +f 1383/1482/1315 1377/1477/1315 1379/1479/1315 1381/1483/1315 +f 1380/1481/1316 1382/1480/1316 1384/1484/1316 1386/1485/1316 +f 1385/1486/1317 1383/1482/1317 1381/1483/1317 1387/1487/1317 +f 1386/1485/1318 1384/1484/1318 1390/1488/1318 1388/1489/1318 +f 1391/1490/1319 1385/1486/1319 1387/1487/1319 1389/1491/1319 +f 1328/1492/1320 1392/1493/1320 1388/1489/1320 1390/1488/1320 +f 1389/1491/1321 1393/1494/1321 1329/1495/1321 1391/1490/1321 +f 1330/1459/1322 1368/1470/1322 1388/1489/1322 1392/1493/1322 +f 1389/1491/1323 1369/1472/1323 1331/1460/1323 1393/1494/1323 +f 1368/1470/1324 1370/1464/1324 1386/1485/1324 1388/1489/1324 +f 1387/1487/1325 1371/1466/1325 1369/1472/1325 1389/1491/1325 +f 1370/1464/1326 1372/1463/1326 1380/1481/1326 1386/1485/1326 +f 1381/1483/1327 1373/1467/1327 1371/1466/1327 1387/1487/1327 +f 1372/1463/1328 1374/1496/1328 1378/1476/1328 1380/1481/1328 +f 1379/1479/1329 1375/1497/1329 1373/1467/1329 1381/1483/1329 +f 1304/1498/1330 1306/1474/1330 1378/1476/1330 1374/1496/1330 +f 1379/1479/1331 1307/1478/1331 1305/1499/1331 1375/1497/1331 +f 1088/1500/1332 1374/1496/1332 1372/1463/1332 1316/1462/1332 +f 1373/1467/1333 1375/1497/1333 1088/1501/1333 1316/1468/1333 +f 1298/1502/1334 1300/1503/1334 1302/1504/1334 1304/1498/1334 +f 1303/1505/1335 1301/1506/1335 1299/1507/1335 1305/1499/1335 +f 1298/1502/1336 1304/1498/1336 1374/1496/1336 1088/1500/1336 +f 1375/1497/1337 1305/1499/1337 1299/1507/1337 1088/1501/1337 +f 1087/1508/1338 1298/1502/1338 1088/1500/1338 +f 1088/1501/1339 1299/1507/1339 1087/1509/1339 +f 1308/1401/1340 1310/1403/1340 1324/1455/1340 1376/1475/1340 +f 1325/1457/1341 1311/1404/1341 1309/1402/1341 1377/1477/1341 +f 1324/1455/1342 1326/1510/1342 1382/1480/1342 1376/1475/1342 +f 1383/1482/1343 1327/1511/1343 1325/1457/1343 1377/1477/1343 +f 1326/1510/1344 1396/1512/1344 1384/1484/1344 1382/1480/1344 +f 1385/1486/1345 1397/1513/1345 1327/1511/1345 1383/1482/1345 +f 1328/1492/1346 1390/1488/1346 1384/1484/1346 1396/1512/1346 +f 1385/1486/1347 1391/1490/1347 1329/1495/1347 1397/1513/1347 +f 1362/1450/1348 1364/1446/1348 1400/1514/1348 1398/1515/1348 +f 1401/1516/1349 1365/1448/1349 1363/1452/1349 1399/1517/1349 +f 1332/1454/1350 1398/1515/1350 1400/1514/1350 1334/1518/1350 +f 1401/1516/1351 1399/1517/1351 1333/1456/1351 1335/1519/1351 +f 1312/1405/1352 1314/1407/1352 1398/1515/1352 1332/1454/1352 +f 1399/1517/1353 1315/1408/1353 1313/1406/1353 1333/1456/1353 +f 1314/1407/1354 1358/1433/1354 1356/1432/1354 1398/1515/1354 +f 1357/1435/1355 1359/1434/1355 1315/1408/1355 1399/1517/1355 +f 1356/1432/1356 1362/1450/1356 1398/1515/1356 +f 1399/1517/1357 1363/1452/1357 1357/1435/1357 +f 1314/1407/1358 1360/1436/1358 1358/1433/1358 +f 1359/1434/1359 1361/1437/1359 1315/1408/1359 +f 1328/1492/1360 1336/1520/1360 1394/1521/1360 1392/1493/1360 +f 1395/1522/1361 1337/1523/1361 1329/1495/1361 1393/1494/1361 +f 1330/1459/1362 1392/1493/1362 1394/1521/1362 1338/1439/1362 +f 1395/1522/1363 1393/1494/1363 1331/1460/1363 1339/1443/1363 +f 1334/1518/1364 1400/1514/1364 1394/1521/1364 1336/1520/1364 +f 1395/1522/1365 1401/1516/1365 1335/1519/1365 1337/1523/1365 +f 1364/1446/1366 1366/1440/1366 1394/1521/1366 1400/1514/1366 +f 1395/1522/1367 1367/1442/1367 1365/1448/1367 1401/1516/1367 +f 1338/1439/1368 1394/1521/1368 1366/1440/1368 +f 1367/1442/1369 1395/1522/1369 1339/1443/1369 +f 1414/1524/1370 1402/1525/1370 1428/1526/1370 1416/1527/1370 +f 1429/1528/1371 1403/1529/1371 1415/1530/1371 1417/1531/1371 +f 1414/1524/1372 1416/1527/1372 1418/1532/1372 1412/1533/1372 +f 1419/1534/1373 1417/1531/1373 1415/1530/1373 1413/1535/1373 +f 1412/1533/1374 1418/1532/1374 1420/1536/1374 1410/1537/1374 +f 1421/1538/1375 1419/1534/1375 1413/1535/1375 1411/1539/1375 +f 1410/1537/1376 1420/1536/1376 1422/1540/1376 1408/1541/1376 +f 1423/1542/1377 1421/1538/1377 1411/1539/1377 1409/1543/1377 +f 1408/1541/1378 1422/1540/1378 1424/1544/1378 1406/1545/1378 +f 1425/1546/1379 1423/1542/1379 1409/1543/1379 1407/1547/1379 +f 1406/1545/1380 1424/1544/1380 1426/1548/1380 1404/1549/1380 +f 1427/1550/1381 1425/1546/1381 1407/1547/1381 1405/1551/1381 +f 1424/1544/1382 1434/1552/1382 1432/1553/1382 1426/1548/1382 +f 1433/1554/1383 1435/1555/1383 1425/1546/1383 1427/1550/1383 +f 1422/1540/1384 1436/1556/1384 1434/1552/1384 1424/1544/1384 +f 1435/1555/1385 1437/1557/1385 1423/1542/1385 1425/1546/1385 +f 1420/1536/1386 1438/1558/1386 1436/1556/1386 1422/1540/1386 +f 1437/1557/1387 1439/1559/1387 1421/1538/1387 1423/1542/1387 +f 1418/1532/1388 1440/1560/1388 1438/1558/1388 1420/1536/1388 +f 1439/1559/1389 1441/1561/1389 1419/1534/1389 1421/1538/1389 +f 1416/1527/1390 1442/1562/1390 1440/1560/1390 1418/1532/1390 +f 1441/1561/1391 1443/1563/1391 1417/1531/1391 1419/1534/1391 +f 1416/1527/1392 1428/1526/1392 1430/1564/1392 1442/1562/1392 +f 1431/1565/1393 1429/1528/1393 1417/1531/1393 1443/1563/1393 +f 1332/1454/1394 1334/1518/1394 1458/1566/1394 1456/1567/1394 +f 1459/1568/1395 1335/1519/1395 1333/1456/1395 1457/1569/1395 +f 1334/1570/1396 1404/1549/1396 1426/1548/1396 1458/1571/1396 +f 1427/1550/1397 1405/1551/1397 1335/1572/1397 1459/1573/1397 +f 1324/1455/1398 1332/1454/1398 1456/1567/1398 1326/1510/1398 +f 1457/1569/1399 1333/1456/1399 1325/1457/1399 1327/1511/1399 +f 1396/1574/1400 1444/1575/1400 1428/1526/1400 1402/1525/1400 +f 1429/1528/1401 1445/1576/1401 1397/1577/1401 1403/1529/1401 +f 1426/1548/1402 1432/1553/1402 1454/1578/1402 1458/1571/1402 +f 1455/1579/1403 1433/1554/1403 1427/1550/1403 1459/1573/1403 +f 1452/1580/1404 1460/1581/1404 1458/1571/1404 1454/1578/1404 +f 1459/1573/1405 1461/1582/1405 1453/1583/1405 1455/1579/1405 +f 1448/1584/1406 1460/1581/1406 1452/1580/1406 1450/1585/1406 +f 1453/1583/1407 1461/1582/1407 1449/1586/1407 1451/1587/1407 +f 1446/1588/1408 1462/1589/1408 1460/1581/1408 1448/1584/1408 +f 1461/1582/1409 1463/1590/1409 1447/1591/1409 1449/1586/1409 +f 1444/1575/1410 1462/1589/1410 1446/1588/1410 1464/1592/1410 +f 1447/1591/1411 1463/1590/1411 1445/1576/1411 1465/1593/1411 +f 1428/1526/1412 1444/1575/1412 1464/1592/1412 1430/1564/1412 +f 1465/1593/1413 1445/1576/1413 1429/1528/1413 1431/1565/1413 +f 1326/1510/1414 1462/1594/1414 1444/1595/1414 1396/1512/1414 +f 1445/1596/1415 1463/1597/1415 1327/1511/1415 1397/1513/1415 +f 1326/1510/1416 1456/1567/1416 1460/1598/1416 1462/1594/1416 +f 1461/1599/1417 1457/1569/1417 1327/1511/1417 1463/1597/1417 +f 1456/1567/1418 1458/1566/1418 1460/1598/1418 +f 1461/1599/1419 1459/1568/1419 1457/1569/1419 +f 1430/1564/1420 1464/1592/1420 1466/1600/1420 1490/1601/1420 +f 1467/1602/1421 1465/1593/1421 1431/1565/1421 1491/1603/1421 +f 1464/1592/1422 1446/1588/1422 1476/1604/1422 1466/1600/1422 +f 1477/1605/1423 1447/1591/1423 1465/1593/1423 1467/1602/1423 +f 1446/1588/1424 1448/1584/1424 1474/1606/1424 1476/1604/1424 +f 1475/1607/1425 1449/1586/1425 1447/1591/1425 1477/1605/1425 +f 1448/1584/1426 1450/1585/1426 1472/1608/1426 1474/1606/1426 +f 1473/1609/1427 1451/1587/1427 1449/1586/1427 1475/1607/1427 +f 1450/1585/1428 1452/1580/1428 1470/1610/1428 1472/1608/1428 +f 1471/1611/1429 1453/1583/1429 1451/1587/1429 1473/1609/1429 +f 1452/1580/1430 1454/1578/1430 1468/1612/1430 1470/1610/1430 +f 1469/1613/1431 1455/1579/1431 1453/1583/1431 1471/1611/1431 +f 1454/1578/1432 1432/1553/1432 1488/1614/1432 1468/1612/1432 +f 1489/1615/1433 1433/1554/1433 1455/1579/1433 1469/1613/1433 +f 1442/1562/1434 1430/1564/1434 1490/1601/1434 1478/1616/1434 +f 1491/1603/1435 1431/1565/1435 1443/1563/1435 1479/1617/1435 +f 1440/1560/1436 1442/1562/1436 1478/1616/1436 1480/1618/1436 +f 1479/1617/1437 1443/1563/1437 1441/1561/1437 1481/1619/1437 +f 1438/1558/1438 1440/1560/1438 1480/1618/1438 1482/1620/1438 +f 1481/1619/1439 1441/1561/1439 1439/1559/1439 1483/1621/1439 +f 1436/1556/1440 1438/1558/1440 1482/1620/1440 1484/1622/1440 +f 1483/1621/1441 1439/1559/1441 1437/1557/1441 1485/1623/1441 +f 1434/1552/1442 1436/1556/1442 1484/1622/1442 1486/1624/1442 +f 1485/1623/1443 1437/1557/1443 1435/1555/1443 1487/1625/1443 +f 1432/1553/1444 1434/1552/1444 1486/1624/1444 1488/1614/1444 +f 1487/1625/1445 1435/1555/1445 1433/1554/1445 1489/1615/1445 +f 1472/1608/1446 1470/1610/1446 1494/1626/1446 1492/1627/1446 +f 1495/1628/1447 1471/1611/1447 1473/1609/1447 1493/1629/1447 +f 1492/1627/1448 1494/1626/1448 1496/1630/1448 1498/1631/1448 +f 1497/1632/1449 1495/1628/1449 1493/1629/1449 1499/1633/1449 +f 1498/1631/1450 1496/1630/1450 1502/1634/1450 1500/1635/1450 +f 1503/1636/1451 1497/1632/1451 1499/1633/1451 1501/1637/1451 +f 1500/1635/1452 1502/1634/1452 1504/1638/1452 1506/1639/1452 +f 1505/1640/1453 1503/1636/1453 1501/1637/1453 1507/1641/1453 +f 1478/1616/1454 1490/1601/1454 1500/1635/1454 1506/1639/1454 +f 1501/1637/1455 1491/1603/1455 1479/1617/1455 1507/1641/1455 +f 1466/1600/1456 1498/1631/1456 1500/1635/1456 1490/1601/1456 +f 1501/1637/1457 1499/1633/1457 1467/1602/1457 1491/1603/1457 +f 1466/1600/1458 1476/1604/1458 1492/1627/1458 1498/1631/1458 +f 1493/1629/1459 1477/1605/1459 1467/1602/1459 1499/1633/1459 +f 1472/1608/1460 1492/1627/1460 1476/1604/1460 1474/1606/1460 +f 1477/1605/1461 1493/1629/1461 1473/1609/1461 1475/1607/1461 +f 1468/1612/1462 1488/1614/1462 1494/1626/1462 1470/1610/1462 +f 1495/1628/1463 1489/1615/1463 1469/1613/1463 1471/1611/1463 +f 1486/1624/1464 1496/1630/1464 1494/1626/1464 1488/1614/1464 +f 1495/1628/1465 1497/1632/1465 1487/1625/1465 1489/1615/1465 +f 1484/1622/1466 1502/1634/1466 1496/1630/1466 1486/1624/1466 +f 1497/1632/1467 1503/1636/1467 1485/1623/1467 1487/1625/1467 +f 1482/1620/1468 1504/1638/1468 1502/1634/1468 1484/1622/1468 +f 1503/1636/1469 1505/1640/1469 1483/1621/1469 1485/1623/1469 +f 1480/1618/1470 1506/1639/1470 1504/1638/1470 1482/1620/1470 +f 1505/1640/1471 1507/1641/1471 1481/1619/1471 1483/1621/1471 +f 1478/1616/1472 1506/1639/1472 1480/1618/1472 +f 1481/1619/1473 1507/1641/1473 1479/1617/1473 +f 1406/1545/1474 1404/1549/1474 1518/1642/1474 1516/1643/1474 +f 1519/1644/1475 1405/1551/1475 1407/1547/1475 1517/1645/1475 +f 1408/1541/1476 1406/1545/1476 1516/1643/1476 1514/1646/1476 +f 1517/1645/1477 1407/1547/1477 1409/1543/1477 1515/1647/1477 +f 1410/1537/1478 1408/1541/1478 1514/1646/1478 1512/1648/1478 +f 1515/1647/1479 1409/1543/1479 1411/1539/1479 1513/1649/1479 +f 1412/1650/1480 1410/1537/1480 1512/1648/1480 1510/1651/1480 +f 1513/1649/1481 1411/1539/1481 1413/1652/1481 1511/1653/1481 +f 1414/1654/1482 1412/1650/1482 1510/1651/1482 1508/1655/1482 +f 1511/1653/1483 1413/1652/1483 1415/1656/1483 1509/1657/1483 +f 1402/1658/1484 1414/1654/1484 1508/1655/1484 1520/1659/1484 +f 1509/1657/1485 1415/1656/1485 1403/1660/1485 1521/1661/1485 +f 1508/1655/1486 1516/1643/1486 1518/1642/1486 1520/1659/1486 +f 1519/1644/1487 1517/1645/1487 1509/1657/1487 1521/1661/1487 +f 1508/1655/1488 1510/1651/1488 1514/1646/1488 1516/1643/1488 +f 1515/1647/1489 1511/1653/1489 1509/1657/1489 1517/1645/1489 +f 1510/1651/1490 1512/1648/1490 1514/1646/1490 +f 1515/1647/1491 1513/1649/1491 1511/1653/1491 +f 1328/1492/1492 1396/1512/1492 1402/1662/1492 1520/1663/1492 +f 1403/1660/1493 1397/1664/1493 1329/1665/1493 1521/1661/1493 +f 1328/1666/1494 1520/1659/1494 1518/1642/1494 1336/1667/1494 +f 1519/1644/1495 1521/1661/1495 1329/1665/1495 1337/1668/1495 +f 1334/1570/1496 1336/1667/1496 1518/1642/1496 1404/1549/1496 +f 1519/1644/1497 1337/1668/1497 1335/1572/1497 1405/1551/1497 +g Suzanne.003_Suzanne +v -1.960012 0.164062 1.341293 +v -1.341294 0.164062 1.960012 +v -2.059449 0.093750 1.352342 +v -1.352342 0.093750 2.059449 +v -2.169934 0.054688 1.396536 +v -1.396537 0.054688 2.169934 +v -2.004206 -0.023438 1.507021 +v -1.507022 -0.023438 2.004206 +v -1.932391 0.031250 1.435206 +v -1.435206 0.031250 1.932390 +v -1.888196 0.132812 1.391012 +v -1.391012 0.132812 1.888196 +v -1.821905 0.164062 1.435206 +v -1.435206 0.164062 1.821905 +v -1.810857 0.093750 1.523594 +v -1.523595 0.093750 1.810856 +v -1.844002 0.054688 1.623031 +v -1.623032 0.054688 1.844002 +v -1.783235 0.242188 1.672750 +v -1.672750 0.242188 1.783235 +v -1.766663 0.242188 1.567788 +v -1.567789 0.242188 1.766662 +v -1.799808 0.242188 1.457303 +v -1.457303 0.242188 1.799808 +v -1.821905 0.328125 1.435206 +v -1.435206 0.328125 1.821905 +v -1.810857 0.390625 1.523594 +v -1.523595 0.390625 1.810856 +v -1.844002 0.437500 1.623031 +v -1.623032 0.437500 1.844002 +v -2.004206 0.515625 1.507021 +v -1.507022 0.515625 2.004206 +v -1.932391 0.453125 1.435206 +v -1.435206 0.453125 1.932390 +v -1.888196 0.359375 1.391012 +v -1.391012 0.359375 1.888196 +v -1.960012 0.328125 1.341293 +v -1.341294 0.328125 1.960012 +v -2.059449 0.390625 1.352342 +v -1.352342 0.390625 2.059449 +v -2.169934 0.437500 1.396536 +v -1.396537 0.437500 2.169934 +v -2.236226 0.242188 1.352342 +v -1.352342 0.242188 2.236225 +v -2.114691 0.242188 1.319196 +v -1.319197 0.242188 2.114691 +v -1.987633 0.242188 1.324720 +v -1.324721 0.242188 1.987633 +v -1.982109 0.242188 1.308147 +v -1.308148 0.242188 1.982109 +v -1.954488 0.335938 1.324720 +v -1.324721 0.335938 1.954487 +v -1.871624 0.375000 1.374439 +v -1.374439 0.375000 1.871623 +v -1.799808 0.335938 1.424157 +v -1.424158 0.335938 1.799808 +v -1.772187 0.242188 1.451779 +v -1.451779 0.242188 1.772187 +v -1.799808 0.156250 1.424157 +v -1.424158 0.156250 1.799808 +v -1.855051 0.242188 1.357866 +v -1.357867 0.242188 1.855051 +v -1.871624 0.117188 1.374439 +v -1.374439 0.117188 1.871623 +v -1.954488 0.156250 1.324720 +v -1.324721 0.156250 1.954487 +v -1.667226 0.429688 1.667225 +v -1.611983 0.351562 1.611983 +v -1.672750 -0.679688 1.672750 +v -1.639604 -0.320312 1.639604 +v -1.628556 -0.187500 1.628555 +v -1.683799 -0.773438 1.683798 +v -1.766663 0.406250 1.766662 +v -1.788760 0.570312 1.788759 +v -2.578731 0.898438 2.578730 +v -2.794177 0.562500 2.794176 +v -2.777605 0.070312 2.777604 +v -2.440624 -0.382812 2.440623 +v -1.937915 -0.187500 1.650652 +v -1.650653 -0.187500 1.937915 +v -2.009731 -0.437500 1.567788 +v -1.567789 -0.437500 2.009730 +v -2.037352 -0.695312 1.540167 +v -1.540168 -0.695312 2.037351 +v -2.076022 -0.890625 1.556740 +v -1.556740 -0.890625 2.076021 +v -2.053925 -0.945312 1.589885 +v -1.589886 -0.945312 2.053924 +v -1.926866 -0.968750 1.672750 +v -1.672750 -0.968750 1.926866 +v -1.783235 -0.984375 1.783235 +v -2.125740 -0.140625 1.507021 +v -1.507022 -0.140625 2.125740 +v -2.258323 -0.039062 1.363390 +v -1.363391 -0.039062 2.258322 +v -2.462721 0.148438 1.291574 +v -1.291575 0.148438 2.462720 +v -2.379857 0.429688 1.164516 +v -1.164517 0.429688 2.379856 +v -2.252798 0.484375 1.247380 +v -1.247381 0.484375 2.252798 +v -2.053925 0.601562 1.357866 +v -1.357867 0.601562 2.053924 +v -1.899245 0.757812 1.446254 +v -1.446255 0.757812 1.899245 +v -1.766663 0.718750 1.545691 +v -1.545692 0.718750 1.766662 +v -1.705896 0.492188 1.617507 +v -1.617507 0.492188 1.705895 +v -1.761138 0.414062 1.529118 +v -1.529119 0.414062 1.761138 +v -1.739041 0.304688 1.562264 +v -1.562265 0.304688 1.739041 +v -1.810857 0.093750 1.523594 +v -1.523595 0.093750 1.810856 +v -1.960012 0.015625 1.429682 +v -1.429682 0.015625 1.960012 +v -2.064973 0.062500 1.368914 +v -1.368915 0.062500 2.064973 +v -2.175459 0.187500 1.291575 +v -1.291575 0.187500 2.175458 +v -2.186507 0.296875 1.280526 +v -1.280527 0.296875 2.186507 +v -2.147837 0.375000 1.297099 +v -1.297100 0.375000 2.147837 +v -1.987633 0.437500 1.379963 +v -1.379964 0.437500 1.987633 +v -1.832954 0.468750 1.479400 +v -1.479401 0.468750 1.832953 +v -1.672750 -0.765625 1.672750 +v -1.750090 -0.718750 1.595410 +v -1.595410 -0.718750 1.750089 +v -1.772187 -0.835938 1.606458 +v -1.606459 -0.835938 1.772186 +v -1.744565 -0.882812 1.656177 +v -1.656177 -0.882812 1.744565 +v -1.705896 -0.890625 1.705895 +v -1.661701 -0.195312 1.661701 +v -1.667226 -0.140625 1.667225 +v -1.739041 -0.148438 1.595410 +v -1.595410 -0.148438 1.739041 +v -1.750090 -0.226562 1.573313 +v -1.573313 -0.226562 1.750089 +v -1.727993 -0.289062 1.606458 +v -1.606459 -0.289062 1.727992 +v -1.998682 -0.046875 1.435206 +v -1.435206 -0.046875 1.998682 +v -2.186507 0.054688 1.313672 +v -1.313672 0.054688 2.186507 +v -2.280420 0.203125 1.252905 +v -1.252905 0.203125 2.280420 +v -2.252798 0.375000 1.203186 +v -1.203187 0.375000 2.252798 +v -2.164410 0.414062 1.192138 +v -1.192138 0.414062 2.164410 +v -1.937915 0.546875 1.319196 +v -1.319197 0.546875 1.937915 +v -1.821905 0.640625 1.379963 +v -1.379964 0.640625 1.821905 +v -1.733517 0.617188 1.446254 +v -1.446255 0.617188 1.733517 +v -1.667226 0.429688 1.523594 +v -1.523595 0.429688 1.667225 +v -1.705896 -0.101562 1.529118 +v -1.529119 -0.101562 1.705895 +v -1.838478 -0.445312 1.540167 +v -1.540167 -0.445312 1.838478 +v -1.882672 -0.703125 1.529118 +v -1.529119 -0.703125 1.882672 +v -1.910294 -0.820312 1.534643 +v -1.534643 -0.820312 1.910293 +v -1.910294 -0.914062 1.578837 +v -1.578837 -0.914062 1.910293 +v -1.860575 -0.929688 1.628555 +v -1.628556 -0.929688 1.860575 +v -1.739041 -0.945312 1.739041 +v -1.678274 0.046875 1.678274 +v -1.650653 0.210938 1.650652 +v -1.899245 0.476562 1.435206 +v -1.435206 0.476562 1.899245 +v -1.777711 0.140625 1.545691 +v -1.545692 0.140625 1.777711 +v -1.750090 0.210938 1.562264 +v -1.562265 0.210938 1.750089 +v -1.755614 -0.687500 1.589885 +v -1.589886 -0.687500 1.755614 +v -1.716944 -0.445312 1.606458 +v -1.606459 -0.445312 1.716944 +v -1.661701 -0.445312 1.661701 +v -1.667226 -0.328125 1.667225 +v -1.705896 -0.273438 1.573313 +v -1.573313 -0.273438 1.705895 +v -1.722468 -0.226562 1.534643 +v -1.534643 -0.226562 1.722468 +v -1.716944 -0.132812 1.562264 +v -1.562265 -0.132812 1.716944 +v -1.667226 -0.125000 1.611982 +v -1.611983 -0.125000 1.667225 +v -1.606459 -0.203125 1.606458 +v -1.650653 -0.148438 1.584361 +v -1.584362 -0.148438 1.650652 +v -1.683798 -0.156250 1.551216 +v -1.551216 -0.156250 1.683798 +v -1.683798 -0.226562 1.529118 +v -1.529119 -0.226562 1.683798 +v -1.678274 -0.250000 1.567788 +v -1.567789 -0.250000 1.678274 +v -1.623031 -0.289062 1.623031 +v -1.982109 -0.312500 1.617507 +v -1.617507 -0.312500 1.982109 +v -1.805332 -0.242188 1.573313 +v -1.573313 -0.242188 1.805332 +v -1.816381 -0.312500 1.562264 +v -1.562265 -0.312500 1.816381 +v -1.965536 -0.250000 1.634079 +v -1.634080 -0.250000 1.965536 +v -1.705896 -0.875000 1.705895 +v -1.739041 -0.867188 1.672750 +v -1.672750 -0.867188 1.739041 +v -1.755614 -0.820312 1.623031 +v -1.623031 -0.820312 1.755614 +v -1.744565 -0.742188 1.611983 +v -1.611983 -0.742188 1.744565 +v -1.727993 -0.781250 1.727992 +v -1.788760 -0.750000 1.656177 +v -1.656177 -0.750000 1.788759 +v -1.805332 -0.812500 1.672750 +v -1.672750 -0.812500 1.805332 +v -1.777711 -0.851562 1.711419 +v -1.711420 -0.851562 1.777711 +v -1.744565 -0.859375 1.744565 +v -1.761138 0.218750 1.518070 +v -1.518070 0.218750 1.761138 +v -1.777711 0.156250 1.512546 +v -1.512546 0.156250 1.777711 +v -1.893721 0.429688 1.418633 +v -1.418634 0.429688 1.893720 +v -1.838478 0.421875 1.451779 +v -1.451779 0.421875 1.838478 +v -1.943439 0.398438 1.346817 +v -1.346818 0.398438 1.943439 +v -2.098119 0.351562 1.302623 +v -1.302624 0.351562 2.098119 +v -2.120216 0.289062 1.291575 +v -1.291575 0.289062 2.120216 +v -2.120216 0.195312 1.302623 +v -1.302624 0.195312 2.120216 +v -2.020779 0.101562 1.346817 +v -1.346818 0.101562 2.020779 +v -1.932391 0.062500 1.402060 +v -1.402061 0.062500 1.932390 +v -1.799808 0.109375 1.479400 +v -1.479401 0.109375 1.799808 +v -1.766663 0.296875 1.512546 +v -1.512546 0.296875 1.766662 +v -1.788760 0.375000 1.490448 +v -1.490449 0.375000 1.788759 +v -1.821905 0.359375 1.490448 +v -1.490449 0.359375 1.821905 +v -1.794284 0.296875 1.518070 +v -1.518070 0.296875 1.794284 +v -1.827430 0.125000 1.484924 +v -1.484925 0.125000 1.827429 +v -1.943439 0.085938 1.413109 +v -1.413109 0.085938 1.943439 +v -2.020779 0.117188 1.368914 +v -1.368915 0.117188 2.020779 +v -2.103643 0.210938 1.330245 +v -1.330245 0.210938 2.103643 +v -2.109167 0.281250 1.324720 +v -1.324721 0.281250 2.109167 +v -2.087070 0.335938 1.335769 +v -1.335770 0.335938 2.087070 +v -1.954488 0.390625 1.368914 +v -1.368915 0.390625 1.954487 +v -1.849527 0.398438 1.451779 +v -1.451779 0.398438 1.849526 +v -1.899245 0.406250 1.424157 +v -1.424158 0.406250 1.899245 +v -1.805332 0.171875 1.518070 +v -1.518070 0.171875 1.805332 +v -1.799808 0.226562 1.523594 +v -1.523595 0.226562 1.799808 +v -1.838478 0.460938 1.683798 +v -1.683799 0.460938 1.838478 +v -1.893721 0.664062 1.617507 +v -1.617507 0.664062 1.893720 +v -2.009731 0.687500 1.534643 +v -1.534643 0.687500 2.009730 +v -2.142313 0.554688 1.457303 +v -1.457304 0.554688 2.142313 +v -2.324614 0.453125 1.363390 +v -1.363391 0.453125 2.324614 +v -2.429575 0.406250 1.302623 +v -1.302624 0.406250 2.429575 +v -2.473769 0.164062 1.379963 +v -1.379964 0.164062 2.473769 +v -2.324614 0.000000 1.473876 +v -1.473876 0.000000 2.324614 +v -2.169934 -0.093750 1.551215 +v -1.551216 -0.093750 2.169934 +v -1.987633 0.898438 1.987633 +v -2.247274 0.984375 2.247274 +v -2.667119 -0.195312 2.667118 +v -2.059449 -0.460938 2.059448 +v -1.866099 -0.976562 1.866099 +v -1.948964 -0.804688 1.948963 +v -1.965536 -0.570312 1.965536 +v -1.993158 -0.484375 1.993157 +v -2.755507 0.234375 1.551215 +v -1.551216 0.234375 2.755507 +v -2.832847 0.320312 1.617507 +v -1.617508 0.320312 2.832847 +v -3.048294 0.265625 1.954487 +v -1.954488 0.265625 3.048293 +v -3.015148 0.437500 2.363283 +v -2.363284 0.437500 3.015147 +v -2.661595 -0.046875 1.623031 +v -1.623032 -0.046875 2.661594 +v -2.727886 -0.125000 1.888196 +v -1.888197 -0.125000 2.727885 +v -2.948857 -0.007812 2.042875 +v -2.042876 -0.007812 2.948856 +v -2.899138 0.054688 2.424050 +v -2.424051 0.054688 2.899137 +v -2.070498 -0.351562 1.739041 +v -1.739041 -0.351562 2.070497 +v -2.136789 -0.414062 1.882672 +v -1.882672 -0.414062 2.136788 +v -2.125740 -0.710938 1.716944 +v -1.716944 -0.710938 2.125740 +v -2.092595 -0.500000 1.739041 +v -1.739041 -0.500000 2.092594 +v -2.142313 -0.914062 1.678274 +v -1.678274 -0.914062 2.142313 +v -2.031828 -0.757812 1.832953 +v -1.832954 -0.757812 2.031827 +v -2.026303 -0.539062 1.849526 +v -1.849527 -0.539062 2.026303 +v -1.998682 -0.945312 1.766662 +v -1.766663 -0.945312 1.998682 +v -2.042876 -0.281250 1.733516 +v -1.733517 -0.281250 2.042876 +v -2.009731 -0.226562 1.711419 +v -1.711420 -0.226562 2.009730 +v -1.982109 -0.171875 1.694847 +v -1.694847 -0.171875 1.982109 +v -2.225177 -0.390625 1.926866 +v -1.926867 -0.390625 2.225177 +v -2.589779 -0.312500 2.169934 +v -2.169935 -0.312500 2.589778 +v -2.816274 -0.148438 2.330137 +v -2.330139 -0.148438 2.816274 +v -2.783129 0.867188 2.142312 +v -2.142313 0.867188 2.783128 +v -2.562158 0.929688 1.921342 +v -1.921342 0.929688 2.562157 +v -2.346711 0.851562 1.705895 +v -1.705896 0.851562 2.346711 +v -2.214128 0.523438 1.562264 +v -1.562265 0.523438 2.214128 +v -2.468245 0.406250 1.440730 +v -1.440731 0.406250 2.468245 +v -2.440624 0.453125 1.545691 +v -1.545692 0.453125 2.440623 +v -2.606352 0.703125 1.700371 +v -1.700372 0.703125 2.606351 +v -2.667119 0.562500 1.540167 +v -1.540168 0.562500 2.667119 +v -2.838371 0.617188 1.711419 +v -1.711420 0.617188 2.838371 +v -2.783129 0.750000 1.877147 +v -1.877148 0.750000 2.783128 +v -2.959905 0.679688 2.053924 +v -2.053925 0.679688 2.959905 +v -3.009624 0.539062 1.882671 +v -1.882673 0.539062 3.009623 +v -3.042769 0.328125 2.169934 +v -2.169935 0.328125 3.042769 +v -2.921236 0.023438 2.236225 +v -2.236226 0.023438 2.921235 +v -2.915711 0.328125 1.755613 +v -1.755614 0.328125 2.915711 +v -2.374332 -0.171875 1.799808 +v -1.799808 -0.171875 2.374332 +v -2.645022 -0.195312 2.037351 +v -2.037352 -0.195312 2.645021 +v -2.987527 0.406250 1.727992 +v -1.727993 0.406250 2.987526 +v -2.827323 -0.140625 1.733516 +v -1.733517 -0.140625 2.827322 +v -3.158779 -0.101562 1.689322 +v -1.689323 -0.101562 3.158779 +v -3.401847 0.054688 1.589885 +v -1.589886 0.054688 3.401846 +v -3.446041 0.320312 1.534642 +v -1.534644 0.320312 3.446041 +v -3.363177 0.507812 1.617506 +v -1.617508 0.507812 3.363177 +v -3.136682 0.476562 1.689322 +v -1.689323 0.476562 3.136682 +v -3.114585 0.414062 1.678273 +v -1.678275 0.414062 3.114584 +v -3.307934 0.437500 1.628555 +v -1.628556 0.437500 3.307934 +v -3.374226 0.289062 1.584361 +v -1.584362 0.289062 3.374225 +v -3.335556 0.078125 1.623031 +v -1.623032 0.078125 3.335555 +v -3.136682 -0.039062 1.678273 +v -1.678275 -0.039062 3.136682 +v -2.871517 -0.070312 1.700371 +v -1.700372 -0.070312 2.871516 +v -2.998575 0.359375 1.694846 +v -1.694847 0.359375 2.998575 +v -3.064867 0.304688 1.727992 +v -1.727993 0.304688 3.064866 +v -2.965430 -0.023438 1.716943 +v -1.716944 -0.023438 2.965429 +v -3.186400 0.000000 1.716943 +v -1.716945 0.000000 3.186400 +v -3.346604 0.093750 1.667225 +v -1.667226 0.093750 3.346604 +v -3.379750 0.250000 1.634079 +v -1.634081 0.250000 3.379750 +v -3.330031 0.359375 1.672749 +v -1.672750 0.359375 3.330031 +v -3.169827 0.343750 1.722468 +v -1.722469 0.343750 3.169827 +v -2.937808 0.289062 1.744565 +v -1.744566 0.289062 2.937808 +v -2.976478 0.171875 1.794283 +v -1.794284 0.171875 2.976478 +v -2.921235 0.093750 1.849526 +v -1.849527 0.093750 2.921235 +v -2.965430 0.085938 1.805332 +v -1.805333 0.085938 2.965429 +v -2.982002 0.015625 1.788759 +v -1.788760 0.015625 2.982002 +v -2.959905 -0.015625 1.810856 +v -1.810857 -0.015625 2.959905 +v -2.755507 0.000000 1.727992 +v -1.727993 0.000000 2.755507 +v -2.821798 -0.023438 1.805332 +v -1.805333 -0.023438 2.821798 +v -2.832847 0.039062 1.816380 +v -1.816381 0.039062 2.832847 +v -2.904663 0.203125 1.777710 +v -1.777711 0.203125 2.904662 +v -3.009624 0.242188 1.750089 +v -1.750090 0.242188 3.009623 +v -3.048294 0.234375 1.788759 +v -1.788760 0.234375 3.048293 +v -2.993051 -0.015625 1.844002 +v -1.844003 -0.015625 2.993050 +v -3.020672 0.015625 1.816380 +v -1.816381 0.015625 3.020672 +v -3.004099 0.078125 1.832953 +v -1.832954 0.078125 3.004099 +v -2.959905 0.093750 1.877147 +v -1.877148 0.093750 2.959905 +v -3.015148 0.171875 1.821904 +v -1.821906 0.171875 3.015147 +v -3.219546 0.328125 1.750089 +v -1.750090 0.328125 3.219546 +v -3.374226 0.343750 1.694846 +v -1.694847 0.343750 3.374225 +v -3.429468 0.242188 1.650652 +v -1.650653 0.242188 3.429468 +v -3.390799 0.085938 1.678273 +v -1.678275 0.085938 3.390798 +v -3.230595 0.000000 1.750089 +v -1.750090 0.000000 3.230594 +v -3.004099 -0.015625 1.755613 +v -1.755614 -0.015625 3.004099 +v -3.109061 0.289062 1.761137 +v -1.761139 0.289062 3.109060 +v -3.053818 0.109375 1.794283 +v -1.794284 0.109375 3.053817 +v -3.092488 0.062500 1.766662 +v -1.766663 0.062500 3.092487 +v -3.158779 0.125000 1.744565 +v -1.744566 0.125000 3.158779 +v -3.120109 0.171875 1.761137 +v -1.761139 0.171875 3.120109 +v -3.175352 0.234375 1.739040 +v -1.739042 0.234375 3.175351 +v -3.208498 0.187500 1.716943 +v -1.716944 0.187500 3.208497 +v -3.252692 0.210938 1.683798 +v -1.683799 0.210938 3.252691 +v -3.236119 0.273438 1.700371 +v -1.700372 0.273438 3.236118 +v -3.258216 0.437500 1.810856 +v -1.810857 0.437500 3.258215 +v -3.462614 0.468750 1.694846 +v -1.694847 0.468750 3.462614 +v -3.512332 0.296875 1.578836 +v -1.578838 0.296875 3.512332 +v -3.495759 0.054688 1.639603 +v -1.639605 0.054688 3.495759 +v -3.274789 -0.085938 1.805332 +v -1.805333 -0.085938 3.274788 +v -2.982002 -0.125000 1.866099 +v -1.866100 -0.125000 2.982002 +v -3.070391 0.382812 1.855050 +v -1.855051 0.382812 3.070390 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn 0.0384 -0.2008 -0.9789 +vn 0.9789 -0.2008 -0.0384 +vn -0.2549 -0.3036 -0.9181 +vn 0.9181 -0.3036 0.2549 +vn 0.0208 -0.7933 -0.6085 +vn 0.6085 -0.7933 -0.0208 +vn 0.2984 -0.5089 -0.8075 +vn 0.8075 -0.5089 -0.2984 +vn 0.6484 -0.5394 -0.5372 +vn 0.5372 -0.5394 -0.6484 +vn 0.5220 -0.8413 -0.1406 +vn 0.1406 -0.8413 -0.5220 +vn 0.9282 -0.3352 0.1617 +vn -0.1617 -0.3352 -0.9282 +vn 0.9409 -0.1940 -0.2777 +vn 0.2777 -0.1940 -0.9409 +vn 0.9439 0.1907 -0.2697 +vn 0.2697 0.1907 -0.9439 +vn 0.9329 0.3264 0.1521 +vn -0.1521 0.3264 -0.9329 +vn 0.5445 0.8173 -0.1883 +vn 0.1883 0.8173 -0.5445 +vn 0.6444 0.5696 -0.5102 +vn 0.5102 0.5696 -0.6444 +vn 0.2778 0.5370 -0.7965 +vn 0.7965 0.5370 -0.2778 +vn 0.0536 0.7672 -0.6391 +vn 0.6391 0.7672 -0.0536 +vn -0.2479 0.2952 -0.9227 +vn 0.9227 0.2952 0.2479 +vn 0.0305 0.1971 -0.9799 +vn 0.9799 0.1971 -0.0305 +vn -0.9177 0.3244 -0.2294 +vn 0.2294 0.3244 0.9177 +vn -0.5222 0.8206 0.2321 +vn -0.2321 0.8206 0.5222 +vn -0.0271 0.7806 0.6244 +vn -0.6244 0.7806 0.0271 +vn 0.2533 0.3225 0.9120 +vn -0.9121 0.3225 -0.2533 +vn 0.2466 -0.3487 0.9042 +vn -0.9042 -0.3487 -0.2466 +vn -0.0271 -0.7806 0.6244 +vn -0.6244 -0.7806 0.0271 +vn -0.5222 -0.8206 0.2321 +vn -0.2321 -0.8206 0.5222 +vn -0.9100 -0.3510 -0.2206 +vn 0.2206 -0.3510 0.9100 +vn 0.3637 -0.0623 -0.9294 +vn 0.9294 -0.0623 -0.3637 +vn 0.4444 -0.1754 -0.8785 +vn 0.8785 -0.1754 -0.4444 +vn 0.6251 -0.1835 -0.7587 +vn 0.7587 -0.1835 -0.6251 +vn 0.7495 -0.0283 -0.6614 +vn 0.6614 -0.0283 -0.7495 +vn 0.7496 0.0260 -0.6614 +vn 0.6614 0.0260 -0.7496 +vn 0.6225 0.1729 -0.7633 +vn 0.7633 0.1729 -0.6225 +vn 0.4488 0.1656 -0.8781 +vn 0.8781 0.1656 -0.4488 +vn 0.3638 0.0572 -0.9297 +vn 0.9297 0.0572 -0.3638 +vn 0.2611 -0.8616 -0.4352 +vn 0.4352 -0.8616 -0.2611 +vn 0.1648 -0.8647 -0.4745 +vn 0.4745 -0.8647 -0.1648 +vn 0.0542 -0.4550 -0.8888 +vn 0.8888 -0.4550 -0.0542 +vn -0.0930 -0.0506 -0.9944 +vn 0.9944 -0.0506 0.0930 +vn -0.1131 0.0900 -0.9895 +vn 0.9895 0.0900 0.1131 +vn 0.1059 -0.8188 -0.5643 +vn 0.5643 -0.8188 -0.1059 +vn 0.1810 -0.6629 -0.7265 +vn 0.7265 -0.6629 -0.1810 +vn -0.0699 -0.4193 -0.9051 +vn 0.9051 -0.4193 0.0699 +vn 0.0000 -0.3634 -0.9316 +vn 0.9316 -0.3634 0.0000 +vn 0.1445 0.3707 -0.9174 +vn 0.9174 0.3707 -0.1445 +vn 0.0454 0.6464 -0.7616 +vn 0.7616 0.6464 -0.0454 +vn -0.0055 0.5167 -0.8561 +vn 0.8561 0.5167 0.0055 +vn 0.5609 0.6610 -0.4985 +vn 0.4985 0.6610 -0.5609 +vn 0.9444 0.3187 0.0803 +vn -0.0803 0.3187 -0.9444 +vn 0.8316 0.5554 0.0000 +vn 0.0000 0.5554 -0.8316 +vn 0.1500 -0.3909 -0.9081 +vn 0.9081 -0.3909 -0.1500 +vn 0.4487 -0.4690 -0.7608 +vn 0.7608 -0.4690 -0.4487 +vn 0.6522 -0.5321 -0.5399 +vn 0.5399 -0.5321 -0.6522 +vn 0.5879 -0.6575 -0.4713 +vn 0.4713 -0.6575 -0.5879 +vn 0.5494 -0.5667 -0.6140 +vn 0.6140 -0.5667 -0.5494 +vn 0.4653 -0.2130 -0.8591 +vn 0.8591 -0.2130 -0.4653 +vn 0.3712 -0.1824 -0.9105 +vn 0.9105 -0.1824 -0.3712 +vn 0.3968 -0.2878 -0.8716 +vn 0.8716 -0.2878 -0.3968 +vn 0.3877 0.0603 -0.9198 +vn 0.9198 0.0603 -0.3877 +vn 0.7701 0.2680 -0.5789 +vn 0.5789 0.2680 -0.7701 +vn 0.2928 -0.4321 -0.8530 +vn 0.8530 -0.4321 -0.2928 +vn 0.5412 -0.2474 -0.8037 +vn 0.8037 -0.2474 -0.5412 +vn 0.6865 -0.1948 -0.7005 +vn 0.7005 -0.1948 -0.6865 +vn 0.4538 -0.6966 -0.5557 +vn 0.5557 -0.6966 -0.4538 +vn 0.4329 -0.5723 -0.6964 +vn 0.6964 -0.5723 -0.4329 +vn 0.4198 -0.2708 -0.8663 +vn 0.8663 -0.2708 -0.4198 +vn 0.4563 -0.0265 -0.8894 +vn 0.8894 -0.0265 -0.4563 +vn 0.4310 -0.1306 -0.8928 +vn 0.8928 -0.1306 -0.4310 +vn 0.7155 0.0574 -0.6962 +vn 0.6962 0.0574 -0.7155 +vn 0.7074 -0.0656 -0.7037 +vn 0.7037 -0.0656 -0.7074 +vn 0.7071 0.0000 -0.7071 +vn -0.6092 -0.5744 -0.5467 +vn 0.5467 -0.5744 0.6092 +vn -0.8229 0.2297 -0.5197 +vn 0.5197 0.2297 0.8229 +vn -0.3499 0.9073 0.2333 +vn -0.2333 0.9073 0.3499 +vn 0.8403 0.3555 0.4094 +vn -0.4094 0.3555 -0.8403 +vn -0.1406 -0.8797 -0.4543 +vn 0.4543 -0.8797 0.1406 +vn 0.3386 -0.5747 -0.7450 +vn 0.7450 -0.5747 -0.3386 +vn 0.7864 0.6019 0.1388 +vn -0.1388 0.6019 -0.7864 +vn 0.3534 0.7892 -0.5022 +vn 0.5022 0.7892 -0.3534 +vn -0.1237 0.2916 -0.9485 +vn 0.9485 0.2916 0.1237 +vn 0.1375 -0.7130 -0.6875 +vn 0.6875 -0.7130 -0.1375 +vn 0.6544 0.2314 -0.7199 +vn 0.7199 0.2314 -0.6544 +vn 0.6234 -0.4018 -0.6708 +vn 0.6708 -0.4018 -0.6234 +vn 0.9376 -0.1610 -0.3081 +vn 0.3081 -0.1610 -0.9376 +vn 0.7715 -0.4364 -0.4629 +vn 0.4629 -0.4364 -0.7715 +vn 0.3235 -0.1290 -0.9374 +vn 0.9374 -0.1290 -0.3235 +vn 0.4608 0.0501 -0.8861 +vn 0.8861 0.0501 -0.4608 +vn -0.2211 0.3010 -0.9276 +vn 0.9276 0.3010 0.2211 +vn -0.3295 0.2574 -0.9084 +vn 0.9084 0.2574 0.3295 +vn -0.4473 0.1601 -0.8800 +vn 0.8800 0.1601 0.4473 +vn 0.3529 -0.6539 -0.6692 +vn 0.6692 -0.6539 -0.3529 +vn 0.7929 -0.1997 -0.5757 +vn 0.5757 -0.1997 -0.7929 +vn 0.8696 -0.1025 -0.4831 +vn 0.4831 -0.1025 -0.8696 +vn 0.7591 0.1952 -0.6211 +vn 0.6211 0.1952 -0.7591 +vn 0.3037 0.9494 -0.0799 +vn 0.0799 0.9494 -0.3037 +vn 0.5842 0.7082 0.3964 +vn -0.3964 0.7082 -0.5842 +vn 0.7071 -0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +vn -0.1322 -0.9450 -0.2993 +vn 0.2993 -0.9450 0.1322 +vn 0.6535 -0.2981 -0.6957 +vn 0.6957 -0.2981 -0.6535 +vn 0.5603 -0.3479 -0.7517 +vn 0.7517 -0.3479 -0.5603 +vn 0.9364 -0.2755 -0.2173 +vn 0.2173 -0.2755 -0.9364 +vn 0.9239 -0.0419 -0.3804 +vn 0.3804 -0.0419 -0.9239 +vn 0.8384 0.0374 -0.5438 +vn 0.5438 0.0374 -0.8384 +vn 0.8765 -0.4767 -0.0674 +vn 0.0674 -0.4767 -0.8765 +vn 0.5519 -0.7531 -0.3582 +vn 0.3582 -0.7531 -0.5519 +vn 0.1927 -0.6071 -0.7709 +vn 0.7709 -0.6071 -0.1927 +vn 0.0941 -0.4130 -0.9059 +vn 0.9059 -0.4130 -0.0940 +vn 0.1780 -0.0968 -0.9792 +vn 0.9792 -0.0968 -0.1780 +vn 0.1715 0.1180 -0.9781 +vn 0.9781 0.1180 -0.1715 +vn 0.1341 0.5621 -0.8161 +vn 0.8161 0.5621 -0.1341 +vn 0.3443 0.6114 -0.7125 +vn 0.7125 0.6114 -0.3443 +vn 0.5333 0.3607 -0.7652 +vn 0.7652 0.3607 -0.5333 +vn 0.6972 0.2495 -0.6720 +vn 0.6720 0.2495 -0.6972 +vn 0.3682 -0.4166 -0.8312 +vn 0.8312 -0.4166 -0.3682 +vn 0.4543 -0.2610 -0.8518 +vn 0.8518 -0.2610 -0.4543 +vn 0.6853 -0.6514 -0.3258 +vn 0.3258 -0.6514 -0.6853 +vn 0.3955 -0.8455 -0.3587 +vn 0.3587 -0.8455 -0.3955 +vn 0.8845 -0.2606 -0.3870 +vn 0.3870 -0.2606 -0.8845 +vn 0.9108 -0.0110 -0.4126 +vn 0.4126 -0.0110 -0.9108 +vn 0.7137 0.4608 -0.5275 +vn 0.5275 0.4608 -0.7137 +vn 0.5807 0.6159 -0.5323 +vn 0.5323 0.6159 -0.5807 +vn 0.2598 0.5836 -0.7693 +vn 0.7693 0.5836 -0.2598 +vn 0.1323 0.5300 -0.8376 +vn 0.8376 0.5300 -0.1323 +vn 0.0000 -0.3333 -0.9428 +vn 0.9428 -0.3333 0.0000 +vn -0.1723 -0.0731 -0.9823 +vn 0.9823 -0.0731 0.1723 +vn -0.1232 0.1162 -0.9856 +vn 0.9856 0.1161 0.1232 +vn 0.2012 0.8111 0.5493 +vn -0.5493 0.8111 -0.2012 +vn 0.3381 0.3695 0.8655 +vn -0.8655 0.3695 -0.3381 +vn -0.1333 0.8675 0.4792 +vn -0.4792 0.8675 0.1333 +vn -0.6331 0.7465 -0.2046 +vn 0.2046 0.7465 0.6331 +vn -0.4811 0.8758 -0.0401 +vn 0.0401 0.8758 0.4811 +vn -0.4031 0.9151 0.0041 +vn -0.0041 0.9151 0.4031 +vn -0.9583 0.1340 -0.2525 +vn 0.2525 0.1340 0.9583 +vn -0.6872 -0.7233 -0.0683 +vn 0.0683 -0.7233 0.6872 +vn -0.5810 -0.8131 0.0367 +vn -0.0367 -0.8131 0.5810 +vn -0.7167 -0.5806 0.3864 +vn -0.3864 -0.5806 0.7167 +vn -0.8575 -0.0583 0.5112 +vn -0.5112 -0.0583 0.8575 +vn -0.7071 -0.4535 0.5426 +vn -0.5426 -0.4535 0.7071 +vn -0.1796 -0.9836 0.0167 +vn -0.0167 -0.9836 0.1796 +vn -0.2435 -0.9669 0.0761 +vn -0.0761 -0.9669 0.2435 +vn -0.8772 -0.0085 -0.4801 +vn 0.4801 -0.0085 0.8772 +vn -0.8882 0.1629 -0.4297 +vn 0.4297 0.1629 0.8882 +vn -0.8125 0.0207 0.5826 +vn -0.5826 0.0207 0.8125 +vn -0.6768 -0.2177 0.7033 +vn -0.7033 -0.2177 0.6768 +vn -0.9491 -0.2926 -0.1169 +vn 0.1169 -0.2926 0.9491 +vn -0.9104 0.1379 -0.3902 +vn 0.3902 0.1379 0.9104 +vn -0.7949 0.3127 -0.5200 +vn 0.5200 0.3127 0.7949 +vn -0.8095 0.3376 -0.4802 +vn 0.4802 0.3376 0.8095 +vn -0.7081 0.3338 -0.6223 +vn 0.6223 0.3338 0.7081 +vn -0.4358 -0.8805 0.1868 +vn -0.1868 -0.8805 0.4358 +vn -0.8272 -0.4733 0.3029 +vn -0.3029 -0.4733 0.8272 +vn -0.5492 -0.8284 0.1098 +vn -0.1098 -0.8284 0.5492 +vn -0.2885 -0.9515 -0.1065 +vn 0.1065 -0.9515 0.2885 +vn -0.3497 -0.9321 -0.0942 +vn 0.0942 -0.9321 0.3497 +vn -0.7333 -0.2083 -0.6472 +vn 0.6472 -0.2083 0.7333 +vn -0.4115 -0.5066 -0.7576 +vn 0.7576 -0.5066 0.4115 +vn -0.9025 -0.1158 0.4148 +vn -0.4148 -0.1158 0.9025 +vn 0.0815 0.9644 -0.2516 +vn 0.2516 0.9644 -0.0815 +vn -0.2211 0.9744 0.0407 +vn -0.0407 0.9744 0.2211 +vn -0.7590 0.5947 0.2651 +vn -0.2651 0.5947 0.7590 +vn -0.3961 0.8981 -0.1912 +vn 0.1912 0.8981 0.3961 +vn 0.3548 0.7036 -0.6157 +vn 0.6157 0.7036 -0.3548 +vn -0.3145 0.7794 -0.5419 +vn 0.5419 0.7794 0.3145 +vn -0.6425 0.6806 -0.3522 +vn 0.3522 0.6806 0.6425 +vn -0.9790 0.2007 0.0344 +vn -0.0344 0.2007 0.9790 +vn -0.8821 0.4342 0.1824 +vn -0.1824 0.4342 0.8821 +vn -0.5787 0.7459 -0.3297 +vn 0.3297 0.7459 0.5787 +vn -0.3997 0.6788 -0.6160 +vn 0.6160 0.6788 0.3997 +vn -0.1375 0.3972 -0.9074 +vn 0.9074 0.3972 0.1375 +vn -0.3540 0.9261 -0.1307 +vn 0.1307 0.9261 0.3540 +vn 0.3958 0.5740 -0.7168 +vn 0.7168 0.5740 -0.3958 +vn -0.5708 0.1046 0.8144 +vn -0.8144 0.1046 0.5708 +vn 0.2538 0.9150 -0.3138 +vn 0.3138 0.9150 -0.2538 +vn 0.7997 0.1847 -0.5712 +vn 0.5712 0.1847 -0.7997 +vn -0.6582 0.1973 -0.7265 +vn 0.7265 0.1973 0.6582 +vn -0.4519 0.0918 -0.8873 +vn 0.8873 0.0918 0.4519 +vn -0.7393 0.1905 -0.6458 +vn 0.6458 0.1905 0.7393 +vn -0.7783 0.0312 -0.6271 +vn 0.6271 0.0312 0.7783 +vn -0.4678 -0.7008 -0.5385 +vn 0.5385 -0.7008 0.4678 +vn -0.2033 -0.9243 -0.3230 +vn 0.3230 -0.9243 0.2033 +vn -0.1524 -0.8644 -0.4791 +vn 0.4791 -0.8644 0.1524 +vn -0.2589 -0.7578 -0.5990 +vn 0.5990 -0.7578 0.2589 +vn -0.3478 -0.6368 -0.6881 +vn 0.6881 -0.6368 0.3478 +vn 0.4169 -0.4499 -0.7898 +vn 0.7898 -0.4499 -0.4169 +vn -0.9363 -0.3181 0.1489 +vn -0.1489 -0.3181 0.9363 +vn -0.9330 -0.2807 0.2253 +vn -0.2253 -0.2807 0.9330 +vn -0.5229 -0.8494 0.0718 +vn -0.0718 -0.8494 0.5229 +vn -0.7064 -0.6356 -0.3114 +vn 0.3114 -0.6356 0.7064 +vn -0.8800 -0.4408 0.1769 +vn -0.1769 -0.4408 0.8800 +vn 0.3572 0.3807 -0.8529 +vn 0.8529 0.3807 -0.3572 +vn 0.2945 0.1715 -0.9401 +vn 0.9401 0.1715 -0.2945 +vn 0.4964 0.1055 -0.8617 +vn 0.8617 0.1055 -0.4964 +vn 0.5095 -0.0802 -0.8567 +vn 0.8567 -0.0802 -0.5095 +vn 0.2965 -0.0599 -0.9531 +vn 0.9531 -0.0599 -0.2965 +vn 0.0697 -0.3045 -0.9500 +vn 0.9500 -0.3045 -0.0697 +vn 0.1080 0.6590 -0.7444 +vn 0.7444 0.6590 -0.1080 +vn 0.5339 0.8309 -0.1568 +vn 0.1568 0.8309 -0.5339 +vn 0.9472 0.2291 0.2243 +vn -0.2243 0.2291 -0.9472 +vn 0.9177 -0.3566 -0.1751 +vn 0.1751 -0.3566 -0.9177 +vn 0.1645 -0.5665 -0.8075 +vn 0.8075 -0.5665 -0.1645 +vn -0.1021 -0.4497 -0.8873 +vn 0.8873 -0.4497 0.1021 +vn -0.5902 -0.6827 -0.4309 +vn 0.4309 -0.6827 0.5902 +vn 0.7995 0.2860 -0.5282 +vn 0.5282 0.2860 -0.7995 +vn -0.7846 -0.3734 -0.4950 +vn 0.4950 -0.3734 0.7846 +vn 0.6216 0.1551 -0.7678 +vn 0.7678 0.1551 -0.6216 +vn 0.1902 0.9318 -0.3091 +vn 0.3091 0.9318 -0.1902 +vn 0.0812 -0.0883 -0.9928 +vn 0.9928 -0.0883 -0.0812 +vn 0.2382 0.4740 -0.8477 +vn 0.8477 0.4740 -0.2382 +vn -0.3232 -0.4847 -0.8128 +vn 0.8128 -0.4847 0.3232 +vn 0.0850 -0.4128 -0.9068 +vn 0.9068 -0.4128 -0.0850 +vn 0.0645 -0.4305 -0.9003 +vn 0.9003 -0.4305 -0.0645 +vn -0.7361 -0.1804 -0.6524 +vn 0.6524 -0.1804 0.7361 +vn -0.7269 -0.3965 -0.5607 +vn 0.5607 -0.3965 0.7269 +vn -0.7564 -0.0181 -0.6538 +vn 0.6538 -0.0181 0.7564 +vn -0.3810 -0.6543 -0.6532 +vn 0.6532 -0.6543 0.3810 +vn -0.4804 -0.6079 -0.6322 +vn 0.6322 -0.6079 0.4804 +vn -0.4138 -0.7022 -0.5793 +vn 0.5793 -0.7022 0.4138 +vn -0.1663 0.9816 -0.0940 +vn 0.0940 0.9816 0.1663 +vn -0.5705 0.3301 -0.7520 +vn 0.7520 0.3301 0.5705 +vn -0.4300 -0.7463 -0.5081 +vn 0.5081 -0.7463 0.4300 +vn 0.0603 0.9970 -0.0482 +vn 0.0482 0.9970 -0.0603 +vn -0.2039 -0.7061 -0.6782 +vn 0.6782 -0.7061 0.2039 +vn 0.0604 -0.8925 -0.4469 +vn 0.4469 -0.8925 -0.0604 +vn 0.4333 -0.5080 0.7444 +vn -0.7444 -0.5080 -0.4333 +vn 0.2375 0.2377 0.9419 +vn -0.9419 0.2377 -0.2375 +vn 0.2203 0.7847 0.5794 +vn -0.5794 0.7847 -0.2203 +vn 0.0871 0.9962 -0.0079 +vn 0.0079 0.9962 -0.0871 +vn 0.5973 0.0222 -0.8017 +vn 0.8017 0.0222 -0.5973 +vn 0.4350 0.0645 -0.8981 +vn 0.8981 0.0645 -0.4350 +vn 0.4504 0.0232 -0.8925 +vn 0.8925 0.0232 -0.4504 +vn 0.5755 0.0274 -0.8173 +vn 0.8173 0.0274 -0.5755 +vn 0.3848 0.2849 -0.8779 +vn 0.8779 0.2849 -0.3848 +vn 0.3642 -0.0343 -0.9307 +vn 0.9307 -0.0343 -0.3642 +vn 0.5001 -0.0603 -0.8639 +vn 0.8639 -0.0603 -0.5001 +vn 0.6606 -0.0106 -0.7507 +vn 0.7507 -0.0106 -0.6606 +vn 0.6886 0.7039 -0.1742 +vn 0.1742 0.7039 -0.6886 +vn 0.1032 0.0355 -0.9940 +vn 0.9940 0.0355 -0.1032 +vn 0.3002 -0.2002 -0.9326 +vn 0.9326 -0.2002 -0.3002 +vn 0.2317 -0.2141 -0.9489 +vn 0.9489 -0.2141 -0.2317 +vn 0.2004 0.2619 -0.9440 +vn 0.9440 0.2619 -0.2004 +vn 0.3253 0.5802 -0.7467 +vn 0.7467 0.5802 -0.3253 +vn -0.1227 -0.9924 -0.0089 +vn 0.0089 -0.9924 0.1227 +vn -0.3483 -0.8657 -0.3596 +vn 0.3596 -0.8657 0.3483 +vn -0.4623 -0.2497 -0.8509 +vn 0.8509 -0.2497 0.4623 +vn -0.6202 0.5424 -0.5667 +vn 0.5667 0.5424 0.6202 +vn -0.0165 0.9367 0.3496 +vn -0.3496 0.9367 0.0165 +vn 0.2272 0.8838 0.4090 +vn -0.4090 0.8838 -0.2272 +vn -0.2152 -0.0098 0.9765 +vn -0.9765 -0.0098 0.2152 +vn -0.5588 -0.0241 0.8290 +vn -0.8290 -0.0241 0.5588 +vn -0.9325 0.0266 0.3603 +vn -0.3603 0.0266 0.9325 +vn 0.5668 0.6231 0.5389 +vn -0.5390 0.6231 -0.5668 +vn -0.9595 -0.2063 0.1919 +vn -0.1919 -0.2063 0.9595 +vn -0.0333 -0.9231 0.3832 +vn -0.3832 -0.9231 0.0333 +usemtl None +s off +f 1568/1669/1498 1522/1670/1498 1524/1671/1498 1566/1672/1498 +f 1525/1673/1499 1523/1674/1499 1569/1675/1499 1567/1676/1499 +f 1566/1672/1500 1524/1671/1500 1526/1677/1500 1564/1678/1500 +f 1527/1679/1501 1525/1673/1501 1567/1676/1501 1565/1680/1501 +f 1524/1671/1502 1530/1681/1502 1528/1682/1502 1526/1677/1502 +f 1529/1683/1503 1531/1684/1503 1525/1673/1503 1527/1679/1503 +f 1522/1670/1504 1532/1685/1504 1530/1681/1504 1524/1671/1504 +f 1531/1684/1505 1533/1686/1505 1523/1674/1505 1525/1673/1505 +f 1532/1685/1506 1534/1687/1506 1536/1688/1506 1530/1681/1506 +f 1537/1689/1507 1535/1690/1507 1533/1686/1507 1531/1684/1507 +f 1530/1681/1508 1536/1688/1508 1538/1691/1508 1528/1682/1508 +f 1539/1692/1509 1537/1689/1509 1531/1684/1509 1529/1683/1509 +f 1536/1688/1510 1542/1693/1510 1540/1694/1510 1538/1691/1510 +f 1541/1695/1511 1543/1696/1511 1537/1689/1511 1539/1692/1511 +f 1534/1687/1512 1544/1697/1512 1542/1693/1512 1536/1688/1512 +f 1543/1696/1513 1545/1698/1513 1535/1690/1513 1537/1689/1513 +f 1544/1697/1514 1546/1699/1514 1548/1700/1514 1542/1693/1514 +f 1549/1701/1515 1547/1702/1515 1545/1698/1515 1543/1696/1515 +f 1542/1693/1516 1548/1700/1516 1550/1703/1516 1540/1694/1516 +f 1551/1704/1517 1549/1701/1517 1543/1696/1517 1541/1695/1517 +f 1548/1700/1518 1554/1705/1518 1552/1706/1518 1550/1703/1518 +f 1553/1707/1519 1555/1708/1519 1549/1701/1519 1551/1704/1519 +f 1546/1699/1520 1556/1709/1520 1554/1705/1520 1548/1700/1520 +f 1555/1708/1521 1557/1710/1521 1547/1702/1521 1549/1701/1521 +f 1556/1709/1522 1558/1711/1522 1560/1712/1522 1554/1705/1522 +f 1561/1713/1523 1559/1714/1523 1557/1710/1523 1555/1708/1523 +f 1554/1705/1524 1560/1712/1524 1562/1715/1524 1552/1706/1524 +f 1563/1716/1525 1561/1713/1525 1555/1708/1525 1553/1707/1525 +f 1560/1712/1526 1566/1672/1526 1564/1678/1526 1562/1715/1526 +f 1565/1680/1527 1567/1676/1527 1561/1713/1527 1563/1716/1527 +f 1558/1711/1528 1568/1669/1528 1566/1672/1528 1560/1712/1528 +f 1567/1676/1529 1569/1675/1529 1559/1714/1529 1561/1713/1529 +f 1568/1669/1530 1558/1711/1530 1572/1717/1530 1570/1718/1530 +f 1573/1719/1531 1559/1714/1531 1569/1675/1531 1571/1720/1531 +f 1558/1711/1532 1556/1709/1532 1574/1721/1532 1572/1717/1532 +f 1575/1722/1533 1557/1710/1533 1559/1714/1533 1573/1719/1533 +f 1556/1709/1534 1546/1699/1534 1576/1723/1534 1574/1721/1534 +f 1577/1724/1535 1547/1702/1535 1557/1710/1535 1575/1722/1535 +f 1546/1699/1536 1544/1697/1536 1578/1725/1536 1576/1723/1536 +f 1579/1726/1537 1545/1698/1537 1547/1702/1537 1577/1724/1537 +f 1544/1697/1538 1534/1687/1538 1580/1727/1538 1578/1725/1538 +f 1581/1728/1539 1535/1690/1539 1545/1698/1539 1579/1726/1539 +f 1534/1687/1540 1532/1685/1540 1584/1729/1540 1580/1727/1540 +f 1585/1730/1541 1533/1686/1541 1535/1690/1541 1581/1728/1541 +f 1532/1685/1542 1522/1670/1542 1586/1731/1542 1584/1729/1542 +f 1587/1732/1543 1523/1674/1543 1533/1686/1543 1585/1730/1543 +f 1522/1670/1544 1568/1669/1544 1570/1718/1544 1586/1731/1544 +f 1571/1720/1545 1569/1675/1545 1523/1674/1545 1587/1732/1545 +f 1582/1733/1546 1586/1731/1546 1570/1718/1546 +f 1571/1720/1547 1587/1732/1547 1583/1734/1547 +f 1584/1729/1548 1586/1731/1548 1582/1733/1548 +f 1583/1734/1549 1587/1732/1549 1585/1730/1549 +f 1582/1733/1550 1580/1727/1550 1584/1729/1550 +f 1585/1730/1551 1581/1728/1551 1583/1734/1551 +f 1582/1733/1552 1578/1725/1552 1580/1727/1552 +f 1581/1728/1553 1579/1726/1553 1583/1734/1553 +f 1582/1733/1554 1576/1723/1554 1578/1725/1554 +f 1579/1726/1555 1577/1724/1555 1583/1734/1555 +f 1582/1733/1556 1574/1721/1556 1576/1723/1556 +f 1577/1724/1557 1575/1722/1557 1583/1734/1557 +f 1582/1733/1558 1572/1717/1558 1574/1721/1558 +f 1575/1722/1559 1573/1719/1559 1583/1734/1559 +f 1582/1733/1560 1570/1718/1560 1572/1717/1560 +f 1573/1719/1561 1571/1720/1561 1583/1734/1561 +f 1610/1735/1562 1695/1736/1562 1697/1737/1562 1612/1738/1562 +f 1697/1737/1563 1696/1739/1563 1611/1740/1563 1612/1738/1563 +f 1608/1741/1564 1693/1742/1564 1695/1736/1564 1610/1735/1564 +f 1696/1739/1565 1694/1743/1565 1609/1744/1565 1611/1740/1565 +f 1606/1745/1566 1691/1746/1566 1693/1742/1566 1608/1741/1566 +f 1694/1743/1567 1692/1747/1567 1607/1748/1567 1609/1744/1567 +f 1604/1749/1568 1689/1750/1568 1691/1746/1568 1606/1745/1568 +f 1692/1747/1569 1690/1751/1569 1605/1752/1569 1607/1748/1569 +f 1602/1753/1570 1687/1754/1570 1689/1750/1570 1604/1749/1570 +f 1690/1751/1571 1688/1755/1571 1603/1756/1571 1605/1752/1571 +f 1600/1757/1572 1613/1758/1572 1667/1759/1572 1685/1760/1572 +f 1668/1761/1573 1614/1762/1573 1601/1763/1573 1686/1764/1573 +f 1613/1758/1574 1615/1765/1574 1669/1766/1574 1667/1759/1574 +f 1670/1767/1575 1616/1768/1575 1614/1762/1575 1668/1761/1575 +f 1615/1765/1576 1617/1769/1576 1671/1770/1576 1669/1766/1576 +f 1672/1771/1577 1618/1772/1577 1616/1768/1577 1670/1767/1577 +f 1617/1769/1578 1619/1773/1578 1673/1774/1578 1671/1770/1578 +f 1674/1775/1579 1620/1776/1579 1618/1772/1579 1672/1771/1579 +f 1619/1773/1580 1621/1777/1580 1675/1778/1580 1673/1774/1580 +f 1676/1779/1581 1622/1780/1581 1620/1776/1581 1674/1775/1581 +f 1621/1777/1582 1623/1781/1582 1677/1782/1582 1675/1778/1582 +f 1678/1783/1583 1624/1784/1583 1622/1780/1583 1676/1779/1583 +f 1623/1781/1584 1625/1785/1584 1679/1786/1584 1677/1782/1584 +f 1680/1787/1585 1626/1788/1585 1624/1784/1585 1678/1783/1585 +f 1625/1785/1586 1627/1789/1586 1681/1790/1586 1679/1786/1586 +f 1682/1791/1587 1628/1792/1587 1626/1788/1587 1680/1787/1587 +f 1627/1789/1588 1629/1793/1588 1683/1794/1588 1681/1790/1588 +f 1684/1795/1589 1630/1796/1589 1628/1792/1589 1682/1791/1589 +f 1629/1793/1590 1588/1797/1590 1589/1798/1590 1683/1794/1590 +f 1589/1798/1591 1588/1797/1591 1630/1796/1591 1684/1795/1591 +f 1631/1799/1592 1649/1800/1592 1681/1790/1592 1683/1794/1592 +f 1682/1791/1593 1650/1801/1593 1632/1802/1593 1684/1795/1593 +f 1649/1800/1594 1700/1803/1594 1679/1786/1594 1681/1790/1594 +f 1680/1787/1595 1701/1804/1595 1650/1801/1595 1682/1791/1595 +f 1647/1805/1596 1677/1782/1596 1679/1786/1596 1700/1803/1596 +f 1680/1787/1597 1678/1783/1597 1648/1806/1597 1701/1804/1597 +f 1645/1807/1598 1675/1778/1598 1677/1782/1598 1647/1805/1598 +f 1678/1783/1599 1676/1779/1599 1646/1808/1599 1648/1806/1599 +f 1643/1809/1600 1673/1774/1600 1675/1778/1600 1645/1807/1600 +f 1676/1779/1601 1674/1775/1601 1644/1810/1601 1646/1808/1601 +f 1641/1811/1602 1671/1770/1602 1673/1774/1602 1643/1809/1602 +f 1674/1775/1603 1672/1771/1603 1642/1812/1603 1644/1810/1603 +f 1639/1813/1604 1669/1766/1604 1671/1770/1604 1641/1811/1604 +f 1672/1771/1605 1670/1767/1605 1640/1814/1605 1642/1812/1605 +f 1637/1815/1606 1667/1759/1606 1669/1766/1606 1639/1813/1606 +f 1670/1767/1607 1668/1761/1607 1638/1816/1607 1640/1814/1607 +f 1635/1817/1608 1685/1760/1608 1667/1759/1608 1637/1815/1608 +f 1668/1761/1609 1686/1764/1609 1636/1818/1609 1638/1816/1609 +f 1635/1817/1610 1702/1819/1610 1698/1820/1610 1685/1760/1610 +f 1698/1820/1611 1703/1821/1611 1636/1818/1611 1686/1764/1611 +f 1631/1799/1612 1683/1794/1612 1589/1798/1612 1633/1822/1612 +f 1589/1798/1613 1684/1795/1613 1632/1802/1613 1634/1823/1613 +f 1633/1822/1614 1589/1798/1614 1699/1824/1614 1704/1825/1614 +f 1699/1824/1615 1589/1798/1615 1634/1823/1615 1705/1826/1615 +f 1698/1820/1616 1702/1819/1616 1704/1825/1616 1699/1824/1616 +f 1705/1826/1617 1703/1821/1617 1698/1820/1617 1699/1824/1617 +f 1656/1827/1618 1658/1828/1618 1697/1737/1618 1695/1736/1618 +f 1697/1737/1619 1658/1828/1619 1657/1829/1619 1696/1739/1619 +f 1654/1830/1620 1656/1827/1620 1695/1736/1620 1693/1742/1620 +f 1696/1739/1621 1657/1829/1621 1655/1831/1621 1694/1743/1621 +f 1652/1832/1622 1654/1830/1622 1693/1742/1622 1691/1746/1622 +f 1694/1743/1623 1655/1831/1623 1653/1833/1623 1692/1747/1623 +f 1687/1754/1624 1708/1834/1624 1706/1835/1624 1689/1750/1624 +f 1707/1836/1625 1709/1837/1625 1688/1755/1625 1690/1751/1625 +f 1652/1832/1626 1691/1746/1626 1689/1750/1626 1706/1835/1626 +f 1690/1751/1627 1692/1747/1627 1653/1833/1627 1707/1836/1627 +f 1665/1838/1628 1711/1839/1628 1710/1840/1628 1708/1834/1628 +f 1710/1840/1629 1711/1839/1629 1666/1841/1629 1709/1837/1629 +f 1706/1835/1630 1708/1834/1630 1710/1840/1630 1590/1842/1630 +f 1710/1840/1631 1709/1837/1631 1707/1836/1631 1590/1842/1631 +f 1651/1843/1632 1652/1832/1632 1706/1835/1632 1590/1842/1632 +f 1707/1836/1632 1653/1833/1632 1651/1843/1632 1590/1842/1632 +f 1663/1844/1633 1714/1845/1633 1712/1846/1633 1665/1838/1633 +f 1713/1847/1634 1715/1848/1634 1664/1849/1634 1666/1841/1634 +f 1661/1850/1635 1716/1851/1635 1714/1845/1635 1663/1844/1635 +f 1715/1848/1636 1717/1852/1636 1662/1853/1636 1664/1849/1636 +f 1660/1854/1637 1718/1855/1637 1716/1851/1637 1661/1850/1637 +f 1717/1852/1638 1719/1856/1638 1660/1854/1638 1662/1853/1638 +f 1659/1857/1639 1592/1858/1639 1718/1855/1639 1660/1854/1639 +f 1719/1856/1640 1592/1858/1640 1659/1857/1640 1660/1854/1640 +f 1711/1839/1641 1665/1838/1641 1712/1846/1641 1591/1859/1641 +f 1713/1847/1642 1666/1841/1642 1711/1839/1642 1591/1859/1642 +f 1591/1859/1643 1712/1846/1643 1727/1860/1643 1729/1861/1643 +f 1728/1862/1644 1713/1847/1644 1591/1859/1644 1729/1861/1644 +f 1592/1858/1645 1720/1863/1645 1721/1864/1645 1718/1855/1645 +f 1722/1865/1646 1720/1863/1646 1592/1858/1646 1719/1856/1646 +f 1718/1855/1647 1721/1864/1647 1723/1866/1647 1716/1851/1647 +f 1724/1867/1648 1722/1865/1648 1719/1856/1648 1717/1852/1648 +f 1716/1851/1649 1723/1866/1649 1725/1868/1649 1714/1845/1649 +f 1726/1869/1650 1724/1867/1650 1717/1852/1650 1715/1848/1650 +f 1714/1845/1651 1725/1868/1651 1727/1860/1651 1712/1846/1651 +f 1728/1862/1652 1726/1869/1652 1715/1848/1652 1713/1847/1652 +f 1720/1863/1653 1725/1868/1653 1723/1866/1653 1721/1864/1653 +f 1724/1867/1654 1726/1869/1654 1720/1863/1654 1722/1865/1654 +f 1720/1863/1655 1729/1861/1655 1727/1860/1655 1725/1868/1655 +f 1728/1862/1656 1729/1861/1656 1720/1863/1656 1726/1869/1656 +f 1660/1854/1657 1661/1850/1657 1685/1760/1657 1698/1820/1657 +f 1686/1764/1658 1662/1853/1658 1660/1854/1658 1698/1820/1658 +f 1661/1850/1659 1663/1844/1659 1732/1870/1659 1685/1760/1659 +f 1733/1871/1660 1664/1849/1660 1662/1853/1660 1686/1764/1660 +f 1663/1844/1661 1665/1838/1661 1734/1872/1661 1732/1870/1661 +f 1735/1873/1662 1666/1841/1662 1664/1849/1662 1733/1871/1662 +f 1665/1838/1663 1708/1834/1663 1687/1754/1663 1734/1872/1663 +f 1688/1755/1664 1709/1837/1664 1666/1841/1664 1735/1873/1664 +f 1602/1753/1665 1730/1874/1665 1734/1872/1665 1687/1754/1665 +f 1735/1873/1666 1731/1875/1666 1603/1756/1666 1688/1755/1666 +f 1730/1874/1667 1736/1876/1667 1732/1870/1667 1734/1872/1667 +f 1733/1871/1668 1737/1877/1668 1731/1875/1668 1735/1873/1668 +f 1600/1757/1669 1685/1760/1669 1732/1870/1669 1736/1876/1669 +f 1733/1871/1670 1686/1764/1670 1601/1763/1670 1737/1877/1670 +f 1652/1832/1671 1651/1843/1671 1593/1878/1671 1743/1879/1671 +f 1593/1878/1672 1651/1843/1672 1653/1833/1672 1744/1880/1672 +f 1654/1830/1673 1652/1832/1673 1743/1879/1673 1741/1881/1673 +f 1744/1880/1674 1653/1833/1674 1655/1831/1674 1742/1882/1674 +f 1656/1827/1675 1654/1830/1675 1741/1881/1675 1739/1883/1675 +f 1742/1882/1676 1655/1831/1676 1657/1829/1676 1740/1884/1676 +f 1658/1828/1677 1656/1827/1677 1739/1883/1677 1738/1885/1677 +f 1740/1884/1678 1657/1829/1678 1658/1828/1678 1738/1885/1678 +f 1738/1885/1679 1739/1883/1679 1750/1886/1679 1752/1887/1679 +f 1751/1888/1680 1740/1884/1680 1738/1885/1680 1752/1887/1680 +f 1739/1883/1681 1741/1881/1681 1748/1889/1681 1750/1886/1681 +f 1749/1890/1682 1742/1882/1682 1740/1884/1682 1751/1888/1682 +f 1741/1881/1683 1743/1879/1683 1746/1891/1683 1748/1889/1683 +f 1747/1892/1684 1744/1880/1684 1742/1882/1684 1749/1890/1684 +f 1743/1879/1685 1593/1878/1685 1745/1893/1685 1746/1891/1685 +f 1745/1893/1686 1593/1878/1686 1744/1880/1686 1747/1892/1686 +f 1745/1893/1687 1752/1887/1687 1750/1886/1687 1746/1891/1687 +f 1751/1888/1688 1752/1887/1688 1745/1893/1688 1747/1892/1688 +f 1746/1891/1689 1750/1886/1689 1748/1889/1689 +f 1749/1890/1690 1751/1888/1690 1747/1892/1690 +f 1704/1825/1691 1702/1819/1691 1755/1894/1691 1753/1895/1691 +f 1756/1896/1692 1703/1821/1692 1705/1826/1692 1754/1897/1692 +f 1633/1822/1693 1704/1825/1693 1753/1895/1693 1775/1898/1693 +f 1754/1897/1694 1705/1826/1694 1634/1823/1694 1776/1899/1694 +f 1631/1799/1695 1633/1822/1695 1775/1898/1695 1777/1900/1695 +f 1776/1899/1696 1634/1823/1696 1632/1802/1696 1778/1901/1696 +f 1702/1819/1697 1635/1817/1697 1773/1902/1697 1755/1894/1697 +f 1774/1903/1698 1636/1818/1698 1703/1821/1698 1756/1896/1698 +f 1635/1817/1699 1637/1815/1699 1771/1904/1699 1773/1902/1699 +f 1772/1905/1700 1638/1816/1700 1636/1818/1700 1774/1903/1700 +f 1637/1815/1701 1639/1813/1701 1769/1906/1701 1771/1904/1701 +f 1770/1907/1702 1640/1814/1702 1638/1816/1702 1772/1905/1702 +f 1639/1813/1703 1641/1811/1703 1767/1908/1703 1769/1906/1703 +f 1768/1909/1704 1642/1812/1704 1640/1814/1704 1770/1907/1704 +f 1641/1811/1705 1643/1809/1705 1765/1910/1705 1767/1908/1705 +f 1766/1911/1706 1644/1810/1706 1642/1812/1706 1768/1909/1706 +f 1643/1809/1707 1645/1807/1707 1763/1912/1707 1765/1910/1707 +f 1764/1913/1708 1646/1808/1708 1644/1810/1708 1766/1911/1708 +f 1645/1807/1709 1647/1805/1709 1761/1914/1709 1763/1912/1709 +f 1762/1915/1710 1648/1806/1710 1646/1808/1710 1764/1913/1710 +f 1647/1805/1711 1700/1803/1711 1757/1916/1711 1761/1914/1711 +f 1758/1917/1712 1701/1804/1712 1648/1806/1712 1762/1915/1712 +f 1700/1803/1713 1649/1800/1713 1759/1918/1713 1757/1916/1713 +f 1760/1919/1714 1650/1801/1714 1701/1804/1714 1758/1917/1714 +f 1649/1800/1715 1631/1799/1715 1777/1900/1715 1759/1918/1715 +f 1778/1901/1716 1632/1802/1716 1650/1801/1716 1760/1919/1716 +f 1759/1918/1717 1777/1900/1717 1779/1920/1717 1797/1921/1717 +f 1780/1922/1718 1778/1901/1718 1760/1919/1718 1798/1923/1718 +f 1757/1916/1719 1759/1918/1719 1797/1921/1719 1799/1924/1719 +f 1798/1923/1720 1760/1919/1720 1758/1917/1720 1800/1925/1720 +f 1761/1914/1721 1757/1916/1721 1799/1924/1721 1795/1926/1721 +f 1800/1925/1722 1758/1917/1722 1762/1915/1722 1796/1927/1722 +f 1763/1912/1723 1761/1914/1723 1795/1926/1723 1793/1928/1723 +f 1796/1927/1724 1762/1915/1724 1764/1913/1724 1794/1929/1724 +f 1765/1910/1725 1763/1912/1725 1793/1928/1725 1791/1930/1725 +f 1794/1929/1726 1764/1913/1726 1766/1911/1726 1792/1931/1726 +f 1767/1908/1727 1765/1910/1727 1791/1930/1727 1789/1932/1727 +f 1792/1931/1728 1766/1911/1728 1768/1909/1728 1790/1933/1728 +f 1769/1906/1729 1767/1908/1729 1789/1932/1729 1787/1934/1729 +f 1790/1933/1730 1768/1909/1730 1770/1907/1730 1788/1935/1730 +f 1771/1904/1731 1769/1906/1731 1787/1934/1731 1785/1936/1731 +f 1788/1935/1732 1770/1907/1732 1772/1905/1732 1786/1937/1732 +f 1773/1902/1733 1771/1904/1733 1785/1936/1733 1783/1938/1733 +f 1786/1937/1734 1772/1905/1734 1774/1903/1734 1784/1939/1734 +f 1755/1894/1735 1773/1902/1735 1783/1938/1735 1801/1940/1735 +f 1784/1939/1736 1774/1903/1736 1756/1896/1736 1802/1941/1736 +f 1777/1900/1737 1775/1898/1737 1781/1942/1737 1779/1920/1737 +f 1782/1943/1738 1776/1899/1738 1778/1901/1738 1780/1922/1738 +f 1775/1898/1739 1753/1895/1739 1803/1944/1739 1781/1942/1739 +f 1804/1945/1740 1754/1897/1740 1776/1899/1740 1782/1943/1740 +f 1753/1895/1741 1755/1894/1741 1801/1940/1741 1803/1944/1741 +f 1802/1941/1742 1756/1896/1742 1754/1897/1742 1804/1945/1742 +f 1588/1797/1743 1629/1793/1743 1805/1946/1743 1594/1947/1743 +f 1806/1948/1744 1630/1796/1744 1588/1797/1744 1594/1947/1744 +f 1629/1793/1745 1627/1789/1745 1807/1949/1745 1805/1946/1745 +f 1808/1950/1746 1628/1792/1746 1630/1796/1746 1806/1948/1746 +f 1627/1789/1747 1625/1785/1747 1809/1951/1747 1807/1949/1747 +f 1810/1952/1748 1626/1788/1748 1628/1792/1748 1808/1950/1748 +f 1625/1785/1749 1623/1781/1749 1811/1953/1749 1809/1951/1749 +f 1812/1954/1750 1624/1784/1750 1626/1788/1750 1810/1952/1750 +f 1623/1781/1751 1621/1777/1751 1813/1955/1751 1811/1953/1751 +f 1814/1956/1752 1622/1780/1752 1624/1784/1752 1812/1954/1752 +f 1621/1777/1753 1619/1773/1753 1815/1957/1753 1813/1955/1753 +f 1816/1958/1754 1620/1776/1754 1622/1780/1754 1814/1956/1754 +f 1619/1773/1755 1617/1769/1755 1817/1959/1755 1815/1957/1755 +f 1818/1960/1756 1618/1772/1756 1620/1776/1756 1816/1958/1756 +f 1617/1769/1757 1615/1765/1757 1819/1961/1757 1817/1959/1757 +f 1820/1962/1758 1616/1768/1758 1618/1772/1758 1818/1960/1758 +f 1615/1765/1759 1613/1758/1759 1821/1963/1759 1819/1961/1759 +f 1822/1964/1760 1614/1762/1760 1616/1768/1760 1820/1962/1760 +f 1829/1965/1761 1830/1966/1761 1849/1967/1761 1859/1968/1761 +f 1850/1969/1762 1830/1970/1762 1829/1971/1762 1860/1972/1762 +f 1828/1973/1763 1829/1965/1763 1859/1968/1763 1857/1974/1763 +f 1860/1972/1764 1829/1971/1764 1828/1975/1764 1858/1976/1764 +f 1827/1977/1765 1828/1973/1765 1857/1974/1765 1861/1978/1765 +f 1858/1976/1766 1828/1975/1766 1827/1977/1766 1862/1979/1766 +f 1610/1735/1767 1612/1738/1767 1827/1977/1767 1861/1978/1767 +f 1827/1977/1768 1612/1738/1768 1611/1740/1768 1862/1979/1768 +f 1608/1741/1769 1610/1735/1769 1861/1978/1769 1855/1980/1769 +f 1862/1979/1770 1611/1740/1770 1609/1744/1770 1856/1981/1770 +f 1606/1745/1771 1608/1741/1771 1855/1980/1771 1851/1982/1771 +f 1856/1981/1772 1609/1744/1772 1607/1748/1772 1852/1983/1772 +f 1604/1749/1773 1606/1745/1773 1851/1982/1773 1853/1984/1773 +f 1852/1983/1774 1607/1748/1774 1605/1752/1774 1854/1985/1774 +f 1851/1982/1775 1857/1974/1775 1859/1968/1775 1853/1984/1775 +f 1860/1972/1776 1858/1976/1776 1852/1983/1776 1854/1985/1776 +f 1851/1982/1777 1855/1980/1777 1861/1978/1777 1857/1974/1777 +f 1862/1979/1778 1856/1981/1778 1852/1983/1778 1858/1976/1778 +f 1847/1986/1779 1853/1984/1779 1859/1968/1779 1849/1967/1779 +f 1860/1972/1780 1854/1985/1780 1848/1987/1780 1850/1969/1780 +f 1602/1753/1781 1604/1749/1781 1853/1984/1781 1847/1986/1781 +f 1854/1985/1782 1605/1752/1782 1603/1756/1782 1848/1987/1782 +f 1730/1874/1783 1863/1988/1783 1865/1989/1783 1736/1876/1783 +f 1866/1990/1784 1864/1991/1784 1731/1875/1784 1737/1877/1784 +f 1602/1753/1785 1847/1986/1785 1863/1988/1785 1730/1874/1785 +f 1864/1991/1786 1848/1987/1786 1603/1756/1786 1731/1875/1786 +f 1600/1757/1787 1736/1876/1787 1865/1989/1787 1867/1992/1787 +f 1866/1990/1788 1737/1877/1788 1601/1763/1788 1868/1993/1788 +f 1600/1757/1789 1867/1992/1789 1821/1963/1789 1613/1758/1789 +f 1822/1964/1790 1868/1993/1790 1601/1763/1790 1614/1762/1790 +f 1598/1994/1791 1845/1995/1791 1873/1996/1791 1825/1997/1791 +f 1874/1998/1792 1846/1999/1792 1598/2000/1792 1825/2001/1792 +f 1825/1997/1793 1873/1996/1793 1871/2002/1793 1599/2003/1793 +f 1872/2004/1794 1874/1998/1794 1825/2001/1794 1599/2005/1794 +f 1599/2003/1795 1871/2002/1795 1869/2006/1795 1826/2007/1795 +f 1870/2008/1796 1872/2004/1796 1599/2005/1796 1826/2009/1796 +f 1826/2007/1797 1869/2006/1797 1849/1967/1797 1830/1966/1797 +f 1850/1969/1798 1870/2008/1798 1826/2009/1798 1830/1970/1798 +f 1847/1986/1799 1849/1967/1799 1869/2006/1799 1863/1988/1799 +f 1870/2008/1800 1850/1969/1800 1848/1987/1800 1864/1991/1800 +f 1817/1959/1801 1819/1961/1801 1839/2010/1801 1831/2011/1801 +f 1840/2012/1802 1820/1962/1802 1818/1960/1802 1832/2013/1802 +f 1597/2014/1803 1837/2015/1803 1845/1995/1803 1598/1994/1803 +f 1846/1999/1804 1838/2016/1804 1597/2017/1804 1598/2000/1804 +f 1823/2018/1805 1879/2019/1805 1877/2020/1805 1824/2021/1805 +f 1878/2022/1806 1880/2023/1806 1823/2024/1806 1824/2025/1806 +f 1824/2021/1807 1877/2020/1807 1875/2026/1807 1596/2027/1807 +f 1876/2028/1808 1878/2022/1808 1824/2025/1808 1596/2029/1808 +f 1596/2027/1809 1875/2026/1809 1837/2015/1809 1597/2014/1809 +f 1838/2016/1810 1876/2028/1810 1596/2029/1810 1597/2017/1810 +f 1813/2030/1811 1815/1957/1811 1883/2031/1811 1885/2032/1811 +f 1884/2033/1812 1816/1958/1812 1814/2034/1812 1886/2035/1812 +f 1885/2032/1813 1883/2031/1813 1889/2036/1813 1887/2037/1813 +f 1890/2038/1814 1884/2033/1814 1886/2035/1814 1888/2039/1814 +f 1887/2037/1815 1889/2036/1815 1891/2040/1815 1893/2041/1815 +f 1892/2042/1816 1890/2038/1816 1888/2039/1816 1894/2043/1816 +f 1893/2041/1817 1891/2040/1817 1897/2044/1817 1895/2045/1817 +f 1898/2046/1818 1892/2042/1818 1894/2043/1818 1896/2047/1818 +f 1835/2048/1819 1899/2049/1819 1895/2045/1819 1897/2044/1819 +f 1896/2047/1820 1900/2050/1820 1836/2051/1820 1898/2046/1820 +f 1837/2015/1821 1875/2026/1821 1895/2045/1821 1899/2049/1821 +f 1896/2047/1822 1876/2028/1822 1838/2016/1822 1900/2050/1822 +f 1875/2026/1823 1877/2020/1823 1893/2041/1823 1895/2045/1823 +f 1894/2043/1824 1878/2022/1824 1876/2028/1824 1896/2047/1824 +f 1877/2020/1825 1879/2019/1825 1887/2037/1825 1893/2041/1825 +f 1888/2039/1826 1880/2023/1826 1878/2022/1826 1894/2043/1826 +f 1879/2019/1827 1881/2052/1827 1885/2032/1827 1887/2037/1827 +f 1886/2035/1828 1882/2053/1828 1880/2023/1828 1888/2039/1828 +f 1811/2054/1829 1813/2030/1829 1885/2032/1829 1881/2052/1829 +f 1886/2035/1830 1814/2034/1830 1812/2055/1830 1882/2053/1830 +f 1595/2056/1831 1881/2052/1831 1879/2019/1831 1823/2018/1831 +f 1880/2023/1832 1882/2053/1832 1595/2057/1832 1823/2024/1832 +f 1805/2058/1833 1807/2059/1833 1809/2060/1833 1811/2054/1833 +f 1810/2061/1834 1808/2062/1834 1806/2063/1834 1812/2055/1834 +f 1805/2058/1835 1811/2054/1835 1881/2052/1835 1595/2056/1835 +f 1882/2053/1836 1812/2055/1836 1806/2063/1836 1595/2057/1836 +f 1594/2064/1837 1805/2058/1837 1595/2056/1837 +f 1595/2057/1838 1806/2063/1838 1594/2065/1838 +f 1815/1957/1839 1817/1959/1839 1831/2011/1839 1883/2031/1839 +f 1832/2013/1840 1818/1960/1840 1816/1958/1840 1884/2033/1840 +f 1831/2011/1841 1833/2066/1841 1889/2036/1841 1883/2031/1841 +f 1890/2038/1842 1834/2067/1842 1832/2013/1842 1884/2033/1842 +f 1833/2066/1843 1903/2068/1843 1891/2040/1843 1889/2036/1843 +f 1892/2042/1844 1904/2069/1844 1834/2067/1844 1890/2038/1844 +f 1835/2048/1845 1897/2044/1845 1891/2040/1845 1903/2068/1845 +f 1892/2042/1846 1898/2046/1846 1836/2051/1846 1904/2069/1846 +f 1869/2006/1847 1871/2002/1847 1907/2070/1847 1905/2071/1847 +f 1908/2072/1848 1872/2004/1848 1870/2008/1848 1906/2073/1848 +f 1839/2010/1849 1905/2071/1849 1907/2070/1849 1841/2074/1849 +f 1908/2072/1850 1906/2073/1850 1840/2012/1850 1842/2075/1850 +f 1819/1961/1851 1821/1963/1851 1905/2071/1851 1839/2010/1851 +f 1906/2073/1852 1822/1964/1852 1820/1962/1852 1840/2012/1852 +f 1821/1963/1853 1865/1989/1853 1863/1988/1853 1905/2071/1853 +f 1864/1991/1854 1866/1990/1854 1822/1964/1854 1906/2073/1854 +f 1863/1988/1855 1869/2006/1855 1905/2071/1855 +f 1906/2073/1856 1870/2008/1856 1864/1991/1856 +f 1821/1963/1857 1867/1992/1857 1865/1989/1857 +f 1866/1990/1858 1868/1993/1858 1822/1964/1858 +f 1835/2048/1859 1843/2076/1859 1901/2077/1859 1899/2049/1859 +f 1902/2078/1860 1844/2079/1860 1836/2051/1860 1900/2050/1860 +f 1837/2015/1861 1899/2049/1861 1901/2077/1861 1845/1995/1861 +f 1902/2078/1862 1900/2050/1862 1838/2016/1862 1846/1999/1862 +f 1841/2074/1863 1907/2070/1863 1901/2077/1863 1843/2076/1863 +f 1902/2078/1864 1908/2072/1864 1842/2075/1864 1844/2079/1864 +f 1871/2002/1865 1873/1996/1865 1901/2077/1865 1907/2070/1865 +f 1902/2078/1866 1874/1998/1866 1872/2004/1866 1908/2072/1866 +f 1845/1995/1867 1901/2077/1867 1873/1996/1867 +f 1874/1998/1868 1902/2078/1868 1846/1999/1868 +f 1921/2080/1869 1909/2081/1869 1935/2082/1869 1923/2083/1869 +f 1936/2084/1870 1910/2085/1870 1922/2086/1870 1924/2087/1870 +f 1921/2080/1871 1923/2083/1871 1925/2088/1871 1919/2089/1871 +f 1926/2090/1872 1924/2087/1872 1922/2086/1872 1920/2091/1872 +f 1919/2089/1873 1925/2088/1873 1927/2092/1873 1917/2093/1873 +f 1928/2094/1874 1926/2090/1874 1920/2091/1874 1918/2095/1874 +f 1917/2093/1875 1927/2092/1875 1929/2096/1875 1915/2097/1875 +f 1930/2098/1876 1928/2094/1876 1918/2095/1876 1916/2099/1876 +f 1915/2097/1877 1929/2096/1877 1931/2100/1877 1913/2101/1877 +f 1932/2102/1878 1930/2098/1878 1916/2099/1878 1914/2103/1878 +f 1913/2101/1879 1931/2100/1879 1933/2104/1879 1911/2105/1879 +f 1934/2106/1880 1932/2102/1880 1914/2103/1880 1912/2107/1880 +f 1931/2100/1881 1941/2108/1881 1939/2109/1881 1933/2104/1881 +f 1940/2110/1882 1942/2111/1882 1932/2102/1882 1934/2106/1882 +f 1929/2096/1883 1943/2112/1883 1941/2108/1883 1931/2100/1883 +f 1942/2111/1884 1944/2113/1884 1930/2098/1884 1932/2102/1884 +f 1927/2092/1885 1945/2114/1885 1943/2112/1885 1929/2096/1885 +f 1944/2113/1886 1946/2115/1886 1928/2094/1886 1930/2098/1886 +f 1925/2088/1887 1947/2116/1887 1945/2114/1887 1927/2092/1887 +f 1946/2115/1888 1948/2117/1888 1926/2090/1888 1928/2094/1888 +f 1923/2083/1889 1949/2118/1889 1947/2116/1889 1925/2088/1889 +f 1948/2117/1890 1950/2119/1890 1924/2087/1890 1926/2090/1890 +f 1923/2083/1891 1935/2082/1891 1937/2120/1891 1949/2118/1891 +f 1938/2121/1892 1936/2084/1892 1924/2087/1892 1950/2119/1892 +f 1839/2010/1893 1841/2074/1893 1965/2122/1893 1963/2123/1893 +f 1966/2124/1894 1842/2075/1894 1840/2012/1894 1964/2125/1894 +f 1841/2126/1895 1911/2105/1895 1933/2104/1895 1965/2127/1895 +f 1934/2106/1896 1912/2107/1896 1842/2128/1896 1966/2129/1896 +f 1831/2011/1897 1839/2010/1897 1963/2123/1897 1833/2066/1897 +f 1964/2125/1898 1840/2012/1898 1832/2013/1898 1834/2067/1898 +f 1903/2130/1899 1951/2131/1899 1935/2082/1899 1909/2081/1899 +f 1936/2084/1900 1952/2132/1900 1904/2133/1900 1910/2085/1900 +f 1933/2104/1901 1939/2109/1901 1961/2134/1901 1965/2127/1901 +f 1962/2135/1902 1940/2110/1902 1934/2106/1902 1966/2129/1902 +f 1959/2136/1903 1967/2137/1903 1965/2127/1903 1961/2134/1903 +f 1966/2129/1904 1968/2138/1904 1960/2139/1904 1962/2135/1904 +f 1955/2140/1905 1967/2137/1905 1959/2136/1905 1957/2141/1905 +f 1960/2139/1906 1968/2138/1906 1956/2142/1906 1958/2143/1906 +f 1953/2144/1907 1969/2145/1907 1967/2137/1907 1955/2140/1907 +f 1968/2138/1908 1970/2146/1908 1954/2147/1908 1956/2142/1908 +f 1951/2131/1909 1969/2145/1909 1953/2144/1909 1971/2148/1909 +f 1954/2147/1910 1970/2146/1910 1952/2132/1910 1972/2149/1910 +f 1935/2082/1911 1951/2131/1911 1971/2148/1911 1937/2120/1911 +f 1972/2149/1912 1952/2132/1912 1936/2084/1912 1938/2121/1912 +f 1833/2066/1913 1969/2150/1913 1951/2151/1913 1903/2068/1913 +f 1952/2152/1914 1970/2153/1914 1834/2067/1914 1904/2069/1914 +f 1833/2066/1915 1963/2123/1915 1967/2154/1915 1969/2150/1915 +f 1968/2155/1916 1964/2125/1916 1834/2067/1916 1970/2153/1916 +f 1963/2123/1917 1965/2122/1917 1967/2154/1917 +f 1968/2155/1918 1966/2124/1918 1964/2125/1918 +f 1937/2120/1919 1971/2148/1919 1973/2156/1919 1997/2157/1919 +f 1974/2158/1920 1972/2149/1920 1938/2121/1920 1998/2159/1920 +f 1971/2148/1921 1953/2144/1921 1983/2160/1921 1973/2156/1921 +f 1984/2161/1922 1954/2147/1922 1972/2149/1922 1974/2158/1922 +f 1953/2144/1923 1955/2140/1923 1981/2162/1923 1983/2160/1923 +f 1982/2163/1924 1956/2142/1924 1954/2147/1924 1984/2161/1924 +f 1955/2140/1925 1957/2141/1925 1979/2164/1925 1981/2162/1925 +f 1980/2165/1926 1958/2143/1926 1956/2142/1926 1982/2163/1926 +f 1957/2141/1927 1959/2136/1927 1977/2166/1927 1979/2164/1927 +f 1978/2167/1928 1960/2139/1928 1958/2143/1928 1980/2165/1928 +f 1959/2136/1929 1961/2134/1929 1975/2168/1929 1977/2166/1929 +f 1976/2169/1930 1962/2135/1930 1960/2139/1930 1978/2167/1930 +f 1961/2134/1931 1939/2109/1931 1995/2170/1931 1975/2168/1931 +f 1996/2171/1932 1940/2110/1932 1962/2135/1932 1976/2169/1932 +f 1949/2118/1933 1937/2120/1933 1997/2157/1933 1985/2172/1933 +f 1998/2159/1934 1938/2121/1934 1950/2119/1934 1986/2173/1934 +f 1947/2116/1935 1949/2118/1935 1985/2172/1935 1987/2174/1935 +f 1986/2173/1936 1950/2119/1936 1948/2117/1936 1988/2175/1936 +f 1945/2114/1937 1947/2116/1937 1987/2174/1937 1989/2176/1937 +f 1988/2175/1938 1948/2117/1938 1946/2115/1938 1990/2177/1938 +f 1943/2112/1939 1945/2114/1939 1989/2176/1939 1991/2178/1939 +f 1990/2177/1940 1946/2115/1940 1944/2113/1940 1992/2179/1940 +f 1941/2108/1941 1943/2112/1941 1991/2178/1941 1993/2180/1941 +f 1992/2179/1942 1944/2113/1942 1942/2111/1942 1994/2181/1942 +f 1939/2109/1943 1941/2108/1943 1993/2180/1943 1995/2170/1943 +f 1994/2181/1944 1942/2111/1944 1940/2110/1944 1996/2171/1944 +f 1979/2164/1945 1977/2166/1945 2001/2182/1945 1999/2183/1945 +f 2002/2184/1946 1978/2167/1946 1980/2165/1946 2000/2185/1946 +f 1999/2183/1947 2001/2182/1947 2003/2186/1947 2005/2187/1947 +f 2004/2188/1948 2002/2184/1948 2000/2185/1948 2006/2189/1948 +f 2005/2187/1949 2003/2186/1949 2009/2190/1949 2007/2191/1949 +f 2010/2192/1950 2004/2188/1950 2006/2189/1950 2008/2193/1950 +f 2007/2191/1951 2009/2190/1951 2011/2194/1951 2013/2195/1951 +f 2012/2196/1952 2010/2192/1952 2008/2193/1952 2014/2197/1952 +f 1985/2172/1953 1997/2157/1953 2007/2191/1953 2013/2195/1953 +f 2008/2193/1954 1998/2159/1954 1986/2173/1954 2014/2197/1954 +f 1973/2156/1955 2005/2187/1955 2007/2191/1955 1997/2157/1955 +f 2008/2193/1956 2006/2189/1956 1974/2158/1956 1998/2159/1956 +f 1973/2156/1957 1983/2160/1957 1999/2183/1957 2005/2187/1957 +f 2000/2185/1958 1984/2161/1958 1974/2158/1958 2006/2189/1958 +f 1979/2164/1959 1999/2183/1959 1983/2160/1959 1981/2162/1959 +f 1984/2161/1960 2000/2185/1960 1980/2165/1960 1982/2163/1960 +f 1975/2168/1961 1995/2170/1961 2001/2182/1961 1977/2166/1961 +f 2002/2184/1962 1996/2171/1962 1976/2169/1962 1978/2167/1962 +f 1993/2180/1963 2003/2186/1963 2001/2182/1963 1995/2170/1963 +f 2002/2184/1964 2004/2188/1964 1994/2181/1964 1996/2171/1964 +f 1991/2178/1965 2009/2190/1965 2003/2186/1965 1993/2180/1965 +f 2004/2188/1966 2010/2192/1966 1992/2179/1966 1994/2181/1966 +f 1989/2176/1967 2011/2194/1967 2009/2190/1967 1991/2178/1967 +f 2010/2192/1968 2012/2196/1968 1990/2177/1968 1992/2179/1968 +f 1987/2174/1969 2013/2195/1969 2011/2194/1969 1989/2176/1969 +f 2012/2196/1970 2014/2197/1970 1988/2175/1970 1990/2177/1970 +f 1985/2172/1971 2013/2195/1971 1987/2174/1971 +f 1988/2175/1972 2014/2197/1972 1986/2173/1972 +f 1913/2101/1973 1911/2105/1973 2025/2198/1973 2023/2199/1973 +f 2026/2200/1974 1912/2107/1974 1914/2103/1974 2024/2201/1974 +f 1915/2097/1975 1913/2101/1975 2023/2199/1975 2021/2202/1975 +f 2024/2201/1976 1914/2103/1976 1916/2099/1976 2022/2203/1976 +f 1917/2093/1977 1915/2097/1977 2021/2202/1977 2019/2204/1977 +f 2022/2203/1978 1916/2099/1978 1918/2095/1978 2020/2205/1978 +f 1919/2206/1979 1917/2093/1979 2019/2204/1979 2017/2207/1979 +f 2020/2205/1980 1918/2095/1980 1920/2208/1980 2018/2209/1980 +f 1921/2210/1981 1919/2206/1981 2017/2207/1981 2015/2211/1981 +f 2018/2209/1982 1920/2208/1982 1922/2212/1982 2016/2213/1982 +f 1909/2214/1983 1921/2210/1983 2015/2211/1983 2027/2215/1983 +f 2016/2213/1984 1922/2212/1984 1910/2216/1984 2028/2217/1984 +f 2015/2211/1985 2023/2199/1985 2025/2198/1985 2027/2215/1985 +f 2026/2200/1986 2024/2201/1986 2016/2213/1986 2028/2217/1986 +f 2015/2211/1987 2017/2207/1987 2021/2202/1987 2023/2199/1987 +f 2022/2203/1988 2018/2209/1988 2016/2213/1988 2024/2201/1988 +f 2017/2207/1989 2019/2204/1989 2021/2202/1989 +f 2022/2203/1990 2020/2205/1990 2018/2209/1990 +f 1835/2048/1991 1903/2068/1991 1909/2218/1991 2027/2219/1991 +f 1910/2216/1992 1904/2220/1992 1836/2221/1992 2028/2217/1992 +f 1835/2222/1993 2027/2215/1993 2025/2198/1993 1843/2223/1993 +f 2026/2200/1994 2028/2217/1994 1836/2221/1994 1844/2224/1994 +f 1841/2126/1995 1843/2223/1995 2025/2198/1995 1911/2105/1995 +f 2026/2200/1996 1844/2224/1996 1842/2128/1996 1912/2107/1996 +g Suzanne.004_Suzanne +v -0.437500 0.164062 2.334375 +v 0.437500 0.164062 2.334375 +v -0.500000 0.093750 2.412500 +v 0.500000 0.093750 2.412500 +v -0.546875 0.054688 2.521875 +v 0.546875 0.054688 2.521875 +v -0.351563 -0.023438 2.482813 +v 0.351562 -0.023438 2.482813 +v -0.351563 0.031250 2.381250 +v 0.351562 0.031250 2.381250 +v -0.351563 0.132812 2.318750 +v 0.351562 0.132812 2.318750 +v -0.273438 0.164062 2.303125 +v 0.273437 0.164062 2.303125 +v -0.203125 0.093750 2.357813 +v 0.203125 0.093750 2.357813 +v -0.156250 0.054688 2.451563 +v 0.156250 0.054688 2.451563 +v -0.078125 0.242188 2.443750 +v 0.078125 0.242188 2.443750 +v -0.140625 0.242188 2.357813 +v 0.140625 0.242188 2.357813 +v -0.242188 0.242188 2.303125 +v 0.242187 0.242188 2.303125 +v -0.273438 0.328125 2.303125 +v 0.273437 0.328125 2.303125 +v -0.203125 0.390625 2.357813 +v 0.203125 0.390625 2.357813 +v -0.156250 0.437500 2.451563 +v 0.156250 0.437500 2.451563 +v -0.351563 0.515625 2.482813 +v 0.351562 0.515625 2.482813 +v -0.351563 0.453125 2.381250 +v 0.351562 0.453125 2.381250 +v -0.351563 0.359375 2.318750 +v 0.351562 0.359375 2.318750 +v -0.437500 0.328125 2.334375 +v 0.437500 0.328125 2.334375 +v -0.500000 0.390625 2.412500 +v 0.500000 0.390625 2.412500 +v -0.546875 0.437500 2.521875 +v 0.546875 0.437500 2.521875 +v -0.625000 0.242188 2.537500 +v 0.625000 0.242188 2.537500 +v -0.562500 0.242188 2.428125 +v 0.562500 0.242188 2.428125 +v -0.468750 0.242188 2.342188 +v 0.468750 0.242188 2.342188 +v -0.476563 0.242188 2.326563 +v 0.476562 0.242188 2.326563 +v -0.445313 0.335938 2.318750 +v 0.445312 0.335938 2.318750 +v -0.351563 0.375000 2.295313 +v 0.351562 0.375000 2.295313 +v -0.265625 0.335938 2.279688 +v 0.265625 0.335938 2.279688 +v -0.226563 0.242188 2.279688 +v 0.226562 0.242188 2.279688 +v -0.265625 0.156250 2.279688 +v 0.265625 0.156250 2.279688 +v -0.351563 0.242188 2.271875 +v 0.351562 0.242188 2.271875 +v -0.351563 0.117188 2.295313 +v 0.351562 0.117188 2.295313 +v -0.445313 0.156250 2.318750 +v 0.445312 0.156250 2.318750 +v -0.000000 0.429688 2.357813 +v -0.000000 0.351562 2.279688 +v -0.000000 -0.679688 2.365625 +v -0.000000 -0.320312 2.318750 +v -0.000000 -0.187500 2.303125 +v -0.000000 -0.773438 2.381250 +v -0.000000 0.406250 2.498438 +v -0.000000 0.570312 2.529688 +v -0.000001 0.898438 3.646875 +v -0.000001 0.562500 3.951563 +v -0.000001 0.070312 3.928125 +v -0.000001 -0.382812 3.451563 +v -0.203125 -0.187500 2.537500 +v 0.203125 -0.187500 2.537500 +v -0.312500 -0.437500 2.529688 +v 0.312500 -0.437500 2.529688 +v -0.351563 -0.695312 2.529688 +v 0.351562 -0.695312 2.529688 +v -0.367188 -0.890625 2.568750 +v 0.367187 -0.890625 2.568750 +v -0.328125 -0.945312 2.576563 +v 0.328125 -0.945312 2.576563 +v -0.179688 -0.968750 2.545313 +v 0.179687 -0.968750 2.545313 +v -0.000000 -0.984375 2.521875 +v -0.437500 -0.140625 2.568750 +v 0.437500 -0.140625 2.568750 +v -0.632813 -0.039062 2.560937 +v 0.632812 -0.039062 2.560938 +v -0.828125 0.148438 2.654687 +v 0.828125 0.148438 2.654688 +v -0.859375 0.429688 2.506250 +v 0.859375 0.429688 2.506250 +v -0.710938 0.484375 2.475000 +v 0.710937 0.484375 2.475000 +v -0.492188 0.601562 2.412500 +v 0.492187 0.601562 2.412500 +v -0.320313 0.757812 2.365625 +v 0.320312 0.757812 2.365625 +v -0.156250 0.718750 2.342188 +v 0.156250 0.718750 2.342188 +v -0.062500 0.492188 2.350000 +v 0.062500 0.492188 2.350000 +v -0.164063 0.414062 2.326563 +v 0.164062 0.414062 2.326563 +v -0.125000 0.304688 2.334375 +v 0.125000 0.304688 2.334375 +v -0.203125 0.093750 2.357813 +v 0.203125 0.093750 2.357813 +v -0.375000 0.015625 2.396875 +v 0.375000 0.015625 2.396875 +v -0.492188 0.062500 2.428125 +v 0.492187 0.062500 2.428125 +v -0.625000 0.187500 2.451562 +v 0.625000 0.187500 2.451563 +v -0.640625 0.296875 2.451562 +v 0.640625 0.296875 2.451563 +v -0.601563 0.375000 2.435937 +v 0.601562 0.375000 2.435938 +v -0.429688 0.437500 2.381250 +v 0.429687 0.437500 2.381250 +v -0.250000 0.468750 2.342188 +v 0.250000 0.468750 2.342188 +v -0.000000 -0.765625 2.365625 +v -0.109375 -0.718750 2.365625 +v 0.109375 -0.718750 2.365625 +v -0.117188 -0.835938 2.389063 +v 0.117187 -0.835938 2.389063 +v -0.062500 -0.882812 2.404688 +v 0.062500 -0.882812 2.404688 +v -0.000000 -0.890625 2.412500 +v -0.000000 -0.195312 2.350000 +v -0.000000 -0.140625 2.357813 +v -0.101563 -0.148438 2.357813 +v 0.101562 -0.148438 2.357813 +v -0.125000 -0.226562 2.350000 +v 0.125000 -0.226562 2.350000 +v -0.085938 -0.289062 2.357813 +v 0.085937 -0.289062 2.357813 +v -0.398438 -0.046875 2.428125 +v 0.398437 -0.046875 2.428125 +v -0.617188 0.054688 2.475000 +v 0.617187 0.054688 2.475000 +v -0.726563 0.203125 2.498437 +v 0.726562 0.203125 2.498438 +v -0.742188 0.375000 2.443750 +v 0.742187 0.375000 2.443750 +v -0.687500 0.414062 2.373437 +v 0.687500 0.414062 2.373438 +v -0.437500 0.546875 2.303125 +v 0.437500 0.546875 2.303125 +v -0.312500 0.640625 2.264063 +v 0.312500 0.640625 2.264063 +v -0.203125 0.617188 2.248438 +v 0.203125 0.617188 2.248438 +v -0.101563 0.429688 2.256250 +v 0.101562 0.429688 2.256250 +v -0.125000 -0.101562 2.287500 +v 0.125000 -0.101562 2.287500 +v -0.210938 -0.445312 2.389063 +v 0.210937 -0.445312 2.389063 +v -0.250000 -0.703125 2.412500 +v 0.250000 -0.703125 2.412500 +v -0.265625 -0.820312 2.435938 +v 0.265625 -0.820312 2.435938 +v -0.234375 -0.914062 2.467188 +v 0.234375 -0.914062 2.467188 +v -0.164063 -0.929688 2.467188 +v 0.164062 -0.929688 2.467188 +v -0.000000 -0.945312 2.459375 +v -0.000000 0.046875 2.373438 +v -0.000000 0.210938 2.334375 +v -0.328125 0.476562 2.357813 +v 0.328125 0.476562 2.357813 +v -0.164063 0.140625 2.350000 +v 0.164062 0.140625 2.350000 +v -0.132813 0.210938 2.342188 +v 0.132812 0.210938 2.342188 +v -0.117188 -0.687500 2.365625 +v 0.117187 -0.687500 2.365625 +v -0.078125 -0.445312 2.350000 +v 0.078125 -0.445312 2.350000 +v -0.000000 -0.445312 2.350000 +v -0.000000 -0.328125 2.357813 +v -0.093750 -0.273438 2.318750 +v 0.093750 -0.273438 2.318750 +v -0.132813 -0.226562 2.303125 +v 0.132812 -0.226562 2.303125 +v -0.109375 -0.132812 2.318750 +v 0.109375 -0.132812 2.318750 +v -0.039063 -0.125000 2.318750 +v 0.039062 -0.125000 2.318750 +v -0.000000 -0.203125 2.271875 +v -0.046875 -0.148438 2.287500 +v 0.046875 -0.148438 2.287500 +v -0.093750 -0.156250 2.287500 +v 0.093750 -0.156250 2.287500 +v -0.109375 -0.226562 2.271875 +v 0.109375 -0.226562 2.271875 +v -0.078125 -0.250000 2.295313 +v 0.078125 -0.250000 2.295313 +v -0.000000 -0.289062 2.295313 +v -0.257813 -0.312500 2.545313 +v 0.257812 -0.312500 2.545313 +v -0.164063 -0.242188 2.389063 +v 0.164062 -0.242188 2.389063 +v -0.179688 -0.312500 2.389063 +v 0.179687 -0.312500 2.389063 +v -0.234375 -0.250000 2.545313 +v 0.234375 -0.250000 2.545313 +v -0.000000 -0.875000 2.412500 +v -0.046875 -0.867188 2.412500 +v 0.046875 -0.867188 2.412500 +v -0.093750 -0.820312 2.389063 +v 0.093750 -0.820312 2.389063 +v -0.093750 -0.742188 2.373438 +v 0.093750 -0.742188 2.373438 +v -0.000000 -0.781250 2.443750 +v -0.093750 -0.750000 2.435938 +v 0.093750 -0.750000 2.435938 +v -0.093750 -0.812500 2.459375 +v 0.093750 -0.812500 2.459375 +v -0.046875 -0.851562 2.467188 +v 0.046875 -0.851562 2.467188 +v -0.000000 -0.859375 2.467188 +v -0.171875 0.218750 2.318750 +v 0.171875 0.218750 2.318750 +v -0.187500 0.156250 2.326563 +v 0.187500 0.156250 2.326563 +v -0.335938 0.429688 2.342188 +v 0.335937 0.429688 2.342188 +v -0.273438 0.421875 2.326563 +v 0.273437 0.421875 2.326563 +v -0.421875 0.398438 2.326563 +v 0.421875 0.398438 2.326563 +v -0.562500 0.351562 2.404688 +v 0.562500 0.351562 2.404688 +v -0.585938 0.289062 2.412500 +v 0.585937 0.289062 2.412500 +v -0.578125 0.195312 2.420313 +v 0.578125 0.195312 2.420313 +v -0.476563 0.101562 2.381250 +v 0.476562 0.101562 2.381250 +v -0.375000 0.062500 2.357813 +v 0.375000 0.062500 2.357813 +v -0.226563 0.109375 2.318750 +v 0.226562 0.109375 2.318750 +v -0.179688 0.296875 2.318750 +v 0.179687 0.296875 2.318750 +v -0.210938 0.375000 2.318750 +v 0.210937 0.375000 2.318750 +v -0.234375 0.359375 2.342188 +v 0.234375 0.359375 2.342188 +v -0.195313 0.296875 2.342188 +v 0.195312 0.296875 2.342188 +v -0.242188 0.125000 2.342188 +v 0.242187 0.125000 2.342188 +v -0.375000 0.085938 2.373438 +v 0.375000 0.085938 2.373438 +v -0.460938 0.117188 2.396875 +v 0.460937 0.117188 2.396875 +v -0.546875 0.210938 2.428125 +v 0.546875 0.210938 2.428125 +v -0.554688 0.281250 2.428125 +v 0.554687 0.281250 2.428125 +v -0.531250 0.335938 2.420313 +v 0.531250 0.335938 2.420313 +v -0.414063 0.390625 2.350000 +v 0.414062 0.390625 2.350000 +v -0.281250 0.398438 2.334375 +v 0.281250 0.398438 2.334375 +v -0.335938 0.406250 2.350000 +v 0.335937 0.406250 2.350000 +v -0.203125 0.171875 2.350000 +v 0.203125 0.171875 2.350000 +v -0.195313 0.226562 2.350000 +v 0.195312 0.226562 2.350000 +v -0.109375 0.460938 2.490625 +v 0.109375 0.460938 2.490625 +v -0.195313 0.664062 2.482813 +v 0.195312 0.664062 2.482813 +v -0.335938 0.687500 2.506250 +v 0.335937 0.687500 2.506250 +v -0.484375 0.554688 2.545313 +v 0.484375 0.554688 2.545313 +v -0.679688 0.453125 2.607813 +v 0.679687 0.453125 2.607813 +v -0.796875 0.406250 2.639062 +v 0.796875 0.406250 2.639063 +v -0.773438 0.164062 2.725000 +v 0.773437 0.164062 2.725000 +v -0.601563 0.000000 2.685938 +v 0.601562 0.000000 2.685938 +v -0.437500 -0.093750 2.631250 +v 0.437500 -0.093750 2.631250 +v -0.000000 0.898438 2.810938 +v -0.000000 0.984375 3.178125 +v -0.000001 -0.195312 3.771875 +v -0.000000 -0.460938 2.912500 +v -0.000000 -0.976562 2.639063 +v -0.000000 -0.804688 2.756250 +v -0.000000 -0.570312 2.779688 +v -0.000000 -0.484375 2.818750 +v -0.851563 0.234375 3.045312 +v 0.851562 0.234375 3.045313 +v -0.859375 0.320312 3.146875 +v 0.859375 0.320312 3.146875 +v -0.773438 0.265625 3.537500 +v 0.773437 0.265625 3.537500 +v -0.460938 0.437500 3.803125 +v 0.460937 0.437500 3.803125 +v -0.734375 -0.046875 3.029688 +v 0.734375 -0.046875 3.029688 +v -0.593750 -0.125000 3.264063 +v 0.593750 -0.125000 3.264063 +v -0.640626 -0.007812 3.529688 +v 0.640624 -0.007812 3.529688 +v -0.335938 0.054688 3.764063 +v 0.335937 0.054688 3.764063 +v -0.234375 -0.351562 2.693750 +v 0.234375 -0.351562 2.693750 +v -0.179688 -0.414062 2.842188 +v 0.179687 -0.414062 2.842188 +v -0.289063 -0.710938 2.717188 +v 0.289062 -0.710938 2.717188 +v -0.250000 -0.500000 2.709375 +v 0.250000 -0.500000 2.709375 +v -0.328125 -0.914062 2.701563 +v 0.328125 -0.914062 2.701563 +v -0.140625 -0.757812 2.732813 +v 0.140625 -0.757812 2.732813 +v -0.125000 -0.539062 2.740625 +v 0.125000 -0.539062 2.740625 +v -0.164063 -0.945312 2.662500 +v 0.164062 -0.945312 2.662500 +v -0.218750 -0.281250 2.670313 +v 0.218750 -0.281250 2.670313 +v -0.210938 -0.226562 2.631250 +v 0.210937 -0.226562 2.631250 +v -0.203125 -0.171875 2.600000 +v 0.203125 -0.171875 2.600000 +v -0.210938 -0.390625 2.935938 +v 0.210937 -0.390625 2.935938 +v -0.296876 -0.312500 3.365625 +v 0.296874 -0.312500 3.365625 +v -0.343751 -0.148438 3.639063 +v 0.343749 -0.148438 3.639063 +v -0.453126 0.867188 3.482813 +v 0.453124 0.867188 3.482813 +v -0.453125 0.929688 3.170313 +v 0.453125 0.929688 3.170313 +v -0.453125 0.851562 2.865625 +v 0.453125 0.851562 2.865625 +v -0.460938 0.523438 2.670313 +v 0.460937 0.523438 2.670313 +v -0.726563 0.406250 2.764062 +v 0.726562 0.406250 2.764063 +v -0.632813 0.453125 2.818750 +v 0.632812 0.453125 2.818750 +v -0.640625 0.703125 3.045313 +v 0.640625 0.703125 3.045313 +v -0.796875 0.562500 2.975000 +v 0.796875 0.562500 2.975000 +v -0.796875 0.617188 3.217187 +v 0.796875 0.617188 3.217188 +v -0.640625 0.750000 3.295313 +v 0.640625 0.750000 3.295313 +v -0.640626 0.679688 3.545313 +v 0.640624 0.679688 3.545313 +v -0.796876 0.539062 3.459375 +v 0.796874 0.539062 3.459375 +v -0.617188 0.328125 3.685937 +v 0.617187 0.328125 3.685938 +v -0.484376 0.023438 3.646875 +v 0.484374 0.023438 3.646875 +v -0.820313 0.328125 3.303125 +v 0.820312 0.328125 3.303125 +v -0.406250 -0.171875 2.951563 +v 0.406250 -0.171875 2.951563 +v -0.429688 -0.195312 3.310938 +v 0.429687 -0.195312 3.310938 +v -0.890626 0.406250 3.334375 +v 0.890624 0.406250 3.334375 +v -0.773438 -0.140625 3.225000 +v 0.773437 -0.140625 3.225000 +v -1.039063 -0.101562 3.428125 +v 1.039062 -0.101562 3.428125 +v -1.281251 0.054688 3.529687 +v 1.281249 0.054688 3.529688 +v -1.351563 0.320312 3.521875 +v 1.351562 0.320312 3.521875 +v -1.234376 0.507812 3.521875 +v 1.234374 0.507812 3.521875 +v -1.023438 0.476562 3.412500 +v 1.023437 0.476562 3.412500 +v -1.015625 0.414062 3.389062 +v 1.015625 0.414062 3.389063 +v -1.187500 0.437500 3.490625 +v 1.187500 0.437500 3.490625 +v -1.265626 0.289062 3.506250 +v 1.265624 0.289062 3.506250 +v -1.210938 0.078125 3.506250 +v 1.210937 0.078125 3.506250 +v -1.031250 -0.039062 3.404687 +v 1.031250 -0.039062 3.404688 +v -0.828125 -0.070312 3.232812 +v 0.828125 -0.070312 3.232813 +v -0.921876 0.359375 3.318750 +v 0.921874 0.359375 3.318750 +v -0.945313 0.304688 3.389062 +v 0.945312 0.304688 3.389063 +v -0.882813 -0.023438 3.310937 +v 0.882812 -0.023438 3.310938 +v -1.039063 0.000000 3.467187 +v 1.039062 0.000000 3.467188 +v -1.187501 0.093750 3.545312 +v 1.187499 0.093750 3.545313 +v -1.234376 0.250000 3.545312 +v 1.234374 0.250000 3.545313 +v -1.171876 0.359375 3.537500 +v 1.171874 0.359375 3.537500 +v -1.023438 0.343750 3.459375 +v 1.023437 0.343750 3.459375 +v -0.843751 0.289062 3.310937 +v 0.843749 0.289062 3.310938 +v -0.835938 0.171875 3.373437 +v 0.835937 0.171875 3.373438 +v -0.757813 0.093750 3.373437 +v 0.757812 0.093750 3.373438 +v -0.820313 0.085938 3.373437 +v 0.820312 0.085938 3.373438 +v -0.843751 0.015625 3.373437 +v 0.843749 0.015625 3.373438 +v -0.812501 -0.015625 3.373437 +v 0.812499 -0.015625 3.373438 +v -0.726563 0.000000 3.170313 +v 0.726562 0.000000 3.170313 +v -0.718750 -0.023438 3.271875 +v 0.718750 -0.023438 3.271875 +v -0.718750 0.039062 3.287500 +v 0.718750 0.039062 3.287500 +v -0.796876 0.203125 3.310937 +v 0.796874 0.203125 3.310938 +v -0.890626 0.242188 3.365625 +v 0.890624 0.242188 3.365625 +v -0.890626 0.234375 3.420312 +v 0.890624 0.234375 3.420313 +v -0.812501 -0.015625 3.420312 +v 0.812499 -0.015625 3.420313 +v -0.851563 0.015625 3.420312 +v 0.851562 0.015625 3.420313 +v -0.828126 0.078125 3.420312 +v 0.828124 0.078125 3.420313 +v -0.765626 0.093750 3.420312 +v 0.765624 0.093750 3.420313 +v -0.843751 0.171875 3.420312 +v 0.843749 0.171875 3.420313 +v -1.039063 0.328125 3.514062 +v 1.039062 0.328125 3.514063 +v -1.187501 0.343750 3.584375 +v 1.187499 0.343750 3.584375 +v -1.257813 0.242188 3.592187 +v 1.257812 0.242188 3.592188 +v -1.210938 0.085938 3.584375 +v 1.210937 0.085938 3.584375 +v -1.046876 0.000000 3.521875 +v 1.046874 0.000000 3.521875 +v -0.882813 -0.015625 3.365625 +v 0.882812 -0.015625 3.365625 +v -0.953126 0.289062 3.443750 +v 0.953124 0.289062 3.443750 +v -0.890626 0.109375 3.428125 +v 0.890624 0.109375 3.428125 +v -0.937501 0.062500 3.435937 +v 0.937499 0.062500 3.435938 +v -1.000000 0.125000 3.467187 +v 0.999999 0.125000 3.467188 +v -0.960938 0.171875 3.451562 +v 0.960937 0.171875 3.451563 +v -1.015625 0.234375 3.475000 +v 1.015625 0.234375 3.475000 +v -1.054688 0.187500 3.482812 +v 1.054687 0.187500 3.482813 +v -1.109375 0.210938 3.490625 +v 1.109375 0.210938 3.490625 +v -1.085938 0.273438 3.490625 +v 1.085937 0.273438 3.490625 +v -1.023438 0.437500 3.584375 +v 1.023437 0.437500 3.584375 +v -1.250001 0.468750 3.646875 +v 1.249999 0.468750 3.646875 +v -1.367188 0.296875 3.600000 +v 1.367187 0.296875 3.600000 +v -1.312501 0.054688 3.631250 +v 1.312499 0.054688 3.631250 +v -1.039063 -0.085938 3.592187 +v 1.039062 -0.085938 3.592188 +v -0.789063 -0.125000 3.428125 +v 0.789062 -0.125000 3.428125 +v -0.859376 0.382812 3.482812 +v 0.859374 0.382812 3.482813 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn -0.6650 -0.2008 -0.7194 +vn 0.6650 -0.2008 -0.7194 +vn -0.8294 -0.3036 -0.4689 +vn 0.8294 -0.3036 -0.4689 +vn -0.4155 -0.7933 -0.4449 +vn 0.4155 -0.7933 -0.4449 +vn -0.3600 -0.5089 -0.7820 +vn 0.3600 -0.5089 -0.7820 +vn 0.0787 -0.5394 -0.8384 +vn -0.0787 -0.5394 -0.8384 +vn 0.2696 -0.8413 -0.4685 +vn -0.2696 -0.8413 -0.4685 +vn 0.7707 -0.3352 -0.5420 +vn -0.7707 -0.3352 -0.5420 +vn 0.4689 -0.1940 -0.8617 +vn -0.4689 -0.1940 -0.8617 +vn 0.4767 0.1907 -0.8581 +vn -0.4767 0.1907 -0.8581 +vn 0.7672 0.3264 -0.5521 +vn -0.7672 0.3264 -0.5521 +vn 0.2519 0.8173 -0.5182 +vn -0.2519 0.8173 -0.5182 +vn 0.0949 0.5696 -0.8164 +vn -0.0949 0.5696 -0.8164 +vn -0.3667 0.5370 -0.7597 +vn 0.3667 0.5370 -0.7597 +vn -0.4141 0.7672 -0.4898 +vn 0.4141 0.7672 -0.4898 +vn -0.8277 0.2952 -0.4771 +vn 0.8277 0.2952 -0.4771 +vn -0.6713 0.1971 -0.7145 +vn 0.6713 0.1971 -0.7145 +vn -0.8111 0.3244 0.4867 +vn 0.8111 0.3244 0.4867 +vn -0.2051 0.8206 0.5334 +vn 0.2052 0.8206 0.5334 +vn 0.4223 0.7806 0.4607 +vn -0.4223 0.7806 0.4607 +vn 0.8241 0.3225 0.4658 +vn -0.8241 0.3225 0.4658 +vn 0.8137 -0.3487 0.4650 +vn -0.8137 -0.3487 0.4650 +vn 0.4223 -0.7806 0.4607 +vn -0.4223 -0.7806 0.4607 +vn -0.2051 -0.8206 0.5334 +vn 0.2052 -0.8206 0.5334 +vn -0.7995 -0.3510 0.4875 +vn 0.7995 -0.3510 0.4875 +vn -0.4000 -0.0623 -0.9144 +vn 0.4000 -0.0623 -0.9144 +vn -0.3069 -0.1754 -0.9354 +vn 0.3069 -0.1754 -0.9354 +vn -0.0945 -0.1835 -0.9785 +vn 0.0945 -0.1835 -0.9785 +vn 0.0624 -0.0283 -0.9977 +vn -0.0624 -0.0283 -0.9977 +vn 0.0624 0.0260 -0.9977 +vn -0.0624 0.0260 -0.9977 +vn -0.0996 0.1729 -0.9799 +vn 0.0996 0.1729 -0.9799 +vn -0.3036 0.1656 -0.9383 +vn 0.3036 0.1656 -0.9383 +vn -0.4002 0.0572 -0.9147 +vn 0.4002 0.0572 -0.9147 +vn -0.1231 -0.8616 -0.4924 +vn 0.1231 -0.8616 -0.4924 +vn -0.2190 -0.8647 -0.4520 +vn 0.2190 -0.8647 -0.4520 +vn -0.5902 -0.4550 -0.6668 +vn 0.5902 -0.4550 -0.6668 +vn -0.7689 -0.0506 -0.6374 +vn 0.7689 -0.0506 -0.6374 +vn -0.7796 0.0900 -0.6197 +vn 0.7796 0.0900 -0.6197 +vn -0.3241 -0.8188 -0.4739 +vn 0.3241 -0.8188 -0.4739 +vn -0.3857 -0.6629 -0.6417 +vn 0.3857 -0.6629 -0.6417 +vn -0.6895 -0.4193 -0.5906 +vn 0.6895 -0.4193 -0.5906 +vn -0.6588 -0.3634 -0.6588 +vn 0.6588 -0.3634 -0.6588 +vn -0.5465 0.3707 -0.7509 +vn 0.5465 0.3707 -0.7509 +vn -0.5064 0.6464 -0.5706 +vn 0.5064 0.6464 -0.5706 +vn -0.6092 0.5167 -0.6015 +vn 0.6092 0.5167 -0.6015 +vn 0.0441 0.6610 -0.7491 +vn -0.0441 0.6610 -0.7491 +vn 0.7246 0.3187 -0.6110 +vn -0.7246 0.3187 -0.6110 +vn 0.5880 0.5554 -0.5880 +vn -0.5880 0.5554 -0.5880 +vn -0.5361 -0.3909 -0.7482 +vn 0.5361 -0.3909 -0.7482 +vn -0.2207 -0.4690 -0.8552 +vn 0.2207 -0.4690 -0.8552 +vn 0.0794 -0.5321 -0.8429 +vn -0.0794 -0.5321 -0.8429 +vn 0.0825 -0.6575 -0.7490 +vn -0.0825 -0.6575 -0.7490 +vn -0.0457 -0.5667 -0.8226 +vn 0.0457 -0.5667 -0.8226 +vn -0.2784 -0.2130 -0.9365 +vn 0.2784 -0.2130 -0.9365 +vn -0.3813 -0.1824 -0.9063 +vn 0.3813 -0.1824 -0.9063 +vn -0.3357 -0.2878 -0.8969 +vn 0.3357 -0.2878 -0.8969 +vn -0.3762 0.0603 -0.9246 +vn 0.3762 0.0603 -0.9246 +vn 0.1352 0.2680 -0.9539 +vn -0.1352 0.2680 -0.9539 +vn -0.3961 -0.4321 -0.8102 +vn 0.3961 -0.4321 -0.8102 +vn -0.1856 -0.2474 -0.9510 +vn 0.1856 -0.2474 -0.9510 +vn -0.0099 -0.1948 -0.9808 +vn 0.0099 -0.1948 -0.9808 +vn -0.0721 -0.6966 -0.7138 +vn 0.0721 -0.6966 -0.7138 +vn -0.1863 -0.5723 -0.7986 +vn 0.1863 -0.5723 -0.7986 +vn -0.3157 -0.2708 -0.9094 +vn 0.3157 -0.2708 -0.9094 +vn -0.3063 -0.0265 -0.9516 +vn 0.3063 -0.0265 -0.9516 +vn -0.3266 -0.1306 -0.9361 +vn 0.3266 -0.1306 -0.9361 +vn 0.0137 0.0574 -0.9983 +vn -0.0137 0.0574 -0.9983 +vn 0.0026 -0.0656 -0.9978 +vn -0.0026 -0.0656 -0.9978 +vn 0.0000 0.0000 -1.0000 +vn -0.8174 -0.5744 0.0442 +vn 0.8174 -0.5744 0.0442 +vn -0.9494 0.2297 0.2144 +vn 0.9494 0.2297 0.2144 +vn -0.0825 0.9073 0.4124 +vn 0.0825 0.9073 0.4124 +vn 0.8836 0.3555 -0.3047 +vn -0.8836 0.3555 -0.3047 +vn -0.4207 -0.8797 -0.2218 +vn 0.4207 -0.8797 -0.2218 +vn -0.2873 -0.5747 -0.7663 +vn 0.2873 -0.5747 -0.7663 +vn 0.6542 0.6019 -0.4580 +vn -0.6542 0.6019 -0.4580 +vn -0.1052 0.7892 -0.6051 +vn 0.1052 0.7892 -0.6051 +vn -0.7582 0.2916 -0.5832 +vn 0.7582 0.2916 -0.5832 +vn -0.3889 -0.7130 -0.5834 +vn 0.3889 -0.7130 -0.5834 +vn -0.0463 0.2314 -0.9718 +vn 0.0463 0.2314 -0.9718 +vn -0.0335 -0.4018 -0.9151 +vn 0.0335 -0.4018 -0.9151 +vn 0.4452 -0.1610 -0.8809 +vn -0.4452 -0.1610 -0.8809 +vn 0.2182 -0.4364 -0.8729 +vn -0.2182 -0.4364 -0.8729 +vn -0.4341 -0.1290 -0.8916 +vn 0.4341 -0.1290 -0.8916 +vn -0.3008 0.0501 -0.9524 +vn 0.3008 0.0501 -0.9524 +vn -0.8123 0.3010 -0.4996 +vn 0.8123 0.3010 -0.4996 +vn -0.8753 0.2574 -0.4093 +vn 0.8753 0.2574 -0.4093 +vn -0.9385 0.1601 -0.3060 +vn 0.9385 0.1601 -0.3060 +vn -0.2237 -0.6539 -0.7227 +vn 0.2237 -0.6539 -0.7227 +vn 0.1536 -0.1997 -0.9677 +vn -0.1536 -0.1997 -0.9677 +vn 0.2733 -0.1025 -0.9565 +vn -0.2733 -0.1025 -0.9565 +vn 0.0976 0.1952 -0.9759 +vn -0.0976 0.1952 -0.9759 +vn 0.1582 0.9494 -0.2713 +vn -0.1582 0.9494 -0.2713 +vn 0.6934 0.7082 -0.1328 +vn -0.6934 0.7082 -0.1328 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 -0.0000 +vn -0.3051 -0.9450 -0.1181 +vn 0.3051 -0.9450 -0.1181 +vn -0.0298 -0.2981 -0.9541 +vn 0.0298 -0.2981 -0.9541 +vn -0.1353 -0.3479 -0.9277 +vn 0.1353 -0.3479 -0.9277 +vn 0.5085 -0.2755 -0.8158 +vn -0.5085 -0.2755 -0.8158 +vn 0.3843 -0.0419 -0.9223 +vn -0.3843 -0.0419 -0.9223 +vn 0.2083 0.0374 -0.9774 +vn -0.2083 0.0374 -0.9774 +vn 0.5721 -0.4767 -0.6674 +vn -0.5721 -0.4767 -0.6674 +vn 0.1369 -0.7531 -0.6435 +vn -0.1369 -0.7531 -0.6435 +vn -0.4088 -0.6071 -0.6814 +vn 0.4088 -0.6071 -0.6814 +vn -0.5740 -0.4130 -0.7070 +vn 0.5740 -0.4130 -0.7070 +vn -0.5665 -0.0968 -0.8183 +vn 0.5665 -0.0968 -0.8183 +vn -0.5703 0.1180 -0.8129 +vn 0.5703 0.1180 -0.8129 +vn -0.4823 0.5621 -0.6719 +vn 0.4823 0.5621 -0.6719 +vn -0.2604 0.6114 -0.7473 +vn 0.2604 0.6114 -0.7473 +vn -0.1640 0.3607 -0.9182 +vn 0.1640 0.3607 -0.9182 +vn 0.0178 0.2495 -0.9682 +vn -0.0178 0.2495 -0.9682 +vn -0.3273 -0.4166 -0.8481 +vn 0.3273 -0.4166 -0.8481 +vn -0.2811 -0.2610 -0.9235 +vn 0.2811 -0.2610 -0.9235 +vn 0.2542 -0.6514 -0.7149 +vn -0.2542 -0.6514 -0.7149 +vn 0.0260 -0.8455 -0.5333 +vn -0.0260 -0.8455 -0.5333 +vn 0.3518 -0.2606 -0.8991 +vn -0.3518 -0.2606 -0.8991 +vn 0.3523 -0.0110 -0.9358 +vn -0.3523 -0.0110 -0.9358 +vn 0.1317 0.4608 -0.8777 +vn -0.1317 0.4608 -0.8777 +vn 0.0342 0.6159 -0.7870 +vn -0.0342 0.6159 -0.7870 +vn -0.3603 0.5836 -0.7277 +vn 0.3603 0.5836 -0.7277 +vn -0.4988 0.5300 -0.6858 +vn 0.4988 0.5300 -0.6858 +vn -0.6667 -0.3333 -0.6667 +vn 0.6667 -0.3333 -0.6667 +vn -0.8165 -0.0731 -0.5727 +vn 0.8165 -0.0731 -0.5727 +vn -0.7840 0.1161 -0.6098 +vn 0.7840 0.1161 -0.6098 +vn 0.5306 0.8111 0.2461 +vn -0.5306 0.8111 0.2461 +vn 0.8511 0.3695 0.3730 +vn -0.8511 0.3695 0.3730 +vn 0.2446 0.8675 0.4331 +vn -0.2446 0.8675 0.4331 +vn -0.5924 0.7465 0.3030 +vn 0.5924 0.7465 0.3030 +vn -0.3685 0.8758 0.3118 +vn 0.3685 0.8758 0.3118 +vn -0.2821 0.9151 0.2880 +vn 0.2821 0.9151 0.2880 +vn -0.8561 0.1340 0.4991 +vn 0.8561 0.1340 0.4991 +vn -0.5342 -0.7233 0.4376 +vn 0.5342 -0.7233 0.4376 +vn -0.3849 -0.8131 0.4368 +vn 0.3849 -0.8131 0.4368 +vn -0.2335 -0.5806 0.7800 +vn 0.2335 -0.5806 0.7800 +vn -0.2449 -0.0583 0.9678 +vn 0.2449 -0.0583 0.9678 +vn -0.1163 -0.4535 0.8837 +vn 0.1163 -0.4535 0.8837 +vn -0.1152 -0.9836 0.1388 +vn 0.1152 -0.9836 0.1388 +vn -0.1184 -0.9669 0.2260 +vn 0.1184 -0.9669 0.2260 +vn -0.9597 -0.0085 0.2808 +vn 0.9597 -0.0085 0.2808 +vn -0.9319 0.1629 0.3242 +vn 0.9319 0.1629 0.3242 +vn -0.1626 0.0207 0.9865 +vn 0.1626 0.0207 0.9865 +vn 0.0188 -0.2177 0.9758 +vn -0.0188 -0.2177 0.9758 +vn -0.7538 -0.2926 0.5884 +vn 0.7538 -0.2926 0.5884 +vn -0.9196 0.1379 0.3678 +vn 0.9196 0.1379 0.3678 +vn -0.9297 0.3127 0.1944 +vn 0.9297 0.3127 0.1944 +vn -0.9120 0.3376 0.2329 +vn 0.9120 0.3376 0.2329 +vn -0.9407 0.3338 0.0607 +vn 0.9407 0.3338 0.0607 +vn -0.1761 -0.8805 0.4402 +vn 0.1761 -0.8805 0.4402 +vn -0.3708 -0.4733 0.7991 +vn 0.3708 -0.4733 0.7991 +vn -0.3107 -0.8284 0.4660 +vn 0.3107 -0.8284 0.4660 +vn -0.2793 -0.9515 0.1287 +vn 0.2793 -0.9515 0.1287 +vn -0.3139 -0.9321 0.1807 +vn 0.3139 -0.9321 0.1807 +vn -0.9762 -0.2083 0.0609 +vn 0.9762 -0.2083 0.0609 +vn -0.8267 -0.5066 -0.2447 +vn 0.8267 -0.5066 -0.2447 +vn -0.3449 -0.1158 0.9315 +vn 0.3449 -0.1158 0.9315 +vn -0.1203 0.9644 -0.2355 +vn 0.1203 0.9644 -0.2355 +vn -0.1275 0.9744 0.1851 +vn 0.1275 0.9744 0.1851 +vn -0.3492 0.5947 0.7241 +vn 0.3492 0.5947 0.7241 +vn -0.4153 0.8981 0.1449 +vn 0.4153 0.8981 0.1449 +vn -0.1845 0.7036 -0.6863 +vn 0.1845 0.7036 -0.6863 +vn -0.6056 0.7794 -0.1608 +vn 0.6056 0.7794 -0.1608 +vn -0.7033 0.6806 0.2053 +vn 0.7033 0.6806 0.2053 +vn -0.6679 0.2007 0.7166 +vn 0.6679 0.2007 0.7166 +vn -0.4948 0.4342 0.7528 +vn 0.4948 0.4342 0.7528 +vn -0.6423 0.7459 0.1761 +vn 0.6423 0.7459 0.1761 +vn -0.7182 0.6788 -0.1530 +vn 0.7182 0.6788 -0.1530 +vn -0.7388 0.3972 -0.5444 +vn 0.7388 0.3972 -0.5444 +vn -0.3428 0.9261 0.1579 +vn 0.3428 0.9261 0.1579 +vn -0.2270 0.5740 -0.7867 +vn 0.2270 0.5740 -0.7867 +vn 0.1722 0.1046 0.9795 +vn -0.1722 0.1046 0.9795 +vn -0.0425 0.9150 -0.4013 +vn 0.0425 0.9150 -0.4013 +vn 0.1616 0.1847 -0.9694 +vn -0.1616 0.1847 -0.9694 +vn -0.9791 0.1973 -0.0483 +vn 0.9791 0.1973 -0.0483 +vn -0.9470 0.0918 -0.3079 +vn 0.9470 0.0918 -0.3079 +vn -0.9794 0.1905 0.0661 +vn 0.9794 0.1905 0.0661 +vn -0.9938 0.0312 0.1070 +vn 0.9938 0.0312 0.1070 +vn -0.7116 -0.7008 -0.0501 +vn 0.7116 -0.7008 -0.0501 +vn -0.3722 -0.9243 -0.0847 +vn 0.3722 -0.9243 -0.0847 +vn -0.4465 -0.8644 -0.2310 +vn 0.4465 -0.8644 -0.2310 +vn -0.6066 -0.7578 -0.2405 +vn 0.6066 -0.7578 -0.2405 +vn -0.7325 -0.6368 -0.2407 +vn 0.7325 -0.6368 -0.2407 +vn -0.2637 -0.4499 -0.8533 +vn 0.2637 -0.4499 -0.8533 +vn -0.5568 -0.3181 0.7673 +vn 0.5568 -0.3181 0.7673 +vn -0.5004 -0.2807 0.8190 +vn 0.5004 -0.2807 0.8190 +vn -0.3190 -0.8494 0.4205 +vn 0.3190 -0.8494 0.4205 +vn -0.7198 -0.6356 0.2793 +vn 0.7198 -0.6356 0.2793 +vn -0.4972 -0.4408 0.7473 +vn 0.4972 -0.4408 0.7473 +vn -0.3506 0.3807 -0.8557 +vn 0.3506 0.3807 -0.8557 +vn -0.4566 0.1715 -0.8730 +vn 0.4566 0.1715 -0.8730 +vn -0.2583 0.1055 -0.9603 +vn 0.2583 0.1055 -0.9603 +vn -0.2455 -0.0802 -0.9661 +vn 0.2455 -0.0802 -0.9661 +vn -0.4643 -0.0599 -0.8837 +vn 0.4643 -0.0599 -0.8837 +vn -0.6225 -0.3045 -0.7210 +vn 0.6225 -0.3045 -0.7210 +vn -0.4500 0.6590 -0.6027 +vn 0.4500 0.6590 -0.6027 +vn 0.2667 0.8309 -0.4884 +vn -0.2667 0.8309 -0.4884 +vn 0.8284 0.2291 -0.5111 +vn -0.8284 0.2291 -0.5111 +vn 0.5251 -0.3566 -0.7727 +vn -0.5251 -0.3566 -0.7727 +vn -0.4546 -0.5665 -0.6873 +vn 0.4546 -0.5665 -0.6873 +vn -0.6996 -0.4497 -0.5552 +vn 0.6996 -0.4497 -0.5552 +vn -0.7220 -0.6827 0.1126 +vn 0.7220 -0.6827 0.1126 +vn 0.1919 0.2860 -0.9388 +vn -0.1919 0.2860 -0.9388 +vn -0.9048 -0.3734 0.2047 +vn 0.9048 -0.3734 0.2047 +vn -0.1034 0.1551 -0.9825 +vn 0.1034 0.1551 -0.9825 +vn -0.0841 0.9318 -0.3530 +vn 0.0841 0.9318 -0.3530 +vn -0.6446 -0.0883 -0.7594 +vn 0.6446 -0.0883 -0.7594 +vn -0.4309 0.4740 -0.7678 +vn 0.4309 0.4740 -0.7678 +vn -0.8032 -0.4847 -0.3462 +vn 0.8032 -0.4847 -0.3462 +vn -0.5811 -0.4128 -0.7014 +vn 0.5811 -0.4128 -0.7014 +vn -0.5910 -0.4305 -0.6822 +vn 0.5910 -0.4305 -0.6822 +vn -0.9818 -0.1804 0.0591 +vn 0.9818 -0.1804 0.0591 +vn -0.9105 -0.3965 0.1175 +vn 0.9105 -0.3965 0.1175 +vn -0.9972 -0.0181 0.0725 +vn 0.9972 -0.0181 0.0725 +vn -0.7313 -0.6543 -0.1925 +vn 0.7313 -0.6543 -0.1925 +vn -0.7867 -0.6079 -0.1073 +vn 0.7867 -0.6079 -0.1073 +vn -0.7022 -0.7022 -0.1170 +vn 0.7022 -0.7022 -0.1170 +vn -0.1840 0.9816 0.0511 +vn 0.1840 0.9816 0.0511 +vn -0.9352 0.3301 -0.1284 +vn 0.9352 0.3301 -0.1284 +vn -0.6633 -0.7463 -0.0553 +vn 0.6633 -0.7463 -0.0553 +vn 0.0085 0.9970 -0.0767 +vn -0.0085 0.9970 -0.0767 +vn -0.6237 -0.7061 -0.3354 +vn 0.6237 -0.7061 -0.3354 +vn -0.2733 -0.8925 -0.3587 +vn 0.2733 -0.8925 -0.3587 +vn 0.8328 -0.5080 0.2200 +vn -0.8328 -0.5080 0.2200 +vn 0.8339 0.2377 0.4981 +vn -0.8339 0.2377 0.4981 +vn 0.5655 0.7847 0.2539 +vn -0.5655 0.7847 0.2539 +vn 0.0560 0.9962 -0.0672 +vn -0.0560 0.9962 -0.0672 +vn -0.1445 0.0222 -0.9893 +vn 0.1445 0.0222 -0.9893 +vn -0.3275 0.0645 -0.9427 +vn 0.3275 0.0645 -0.9427 +vn -0.3127 0.0232 -0.9496 +vn 0.3127 0.0232 -0.9496 +vn -0.1710 0.0274 -0.9849 +vn 0.1710 0.0274 -0.9849 +vn -0.3487 0.2849 -0.8929 +vn 0.3487 0.2849 -0.8929 +vn -0.4006 -0.0343 -0.9156 +vn 0.4006 -0.0343 -0.9156 +vn -0.2572 -0.0603 -0.9645 +vn 0.2572 -0.0603 -0.9645 +vn -0.0637 -0.0106 -0.9979 +vn 0.0637 -0.0106 -0.9979 +vn 0.3637 0.7039 -0.6101 +vn -0.3637 0.7039 -0.6101 +vn -0.6299 0.0355 -0.7759 +vn 0.6299 0.0355 -0.7759 +vn -0.4472 -0.2002 -0.8717 +vn 0.4472 -0.2002 -0.8717 +vn -0.5072 -0.2141 -0.8348 +vn 0.5072 -0.2141 -0.8348 +vn -0.5258 0.2619 -0.8093 +vn 0.5258 0.2619 -0.8093 +vn -0.2980 0.5802 -0.7580 +vn 0.2980 0.5802 -0.7580 +vn -0.0930 -0.9924 0.0805 +vn 0.0930 -0.9924 0.0805 +vn -0.5006 -0.8657 -0.0080 +vn 0.5006 -0.8657 -0.0080 +vn -0.9285 -0.2497 -0.2748 +vn 0.9285 -0.2497 -0.2748 +vn -0.8393 0.5424 0.0378 +vn 0.8393 0.5424 0.0378 +vn 0.2355 0.9367 0.2589 +vn -0.2355 0.9367 0.2589 +vn 0.4499 0.8838 0.1285 +vn -0.4499 0.8838 0.1285 +vn 0.5384 -0.0098 0.8427 +vn -0.5384 -0.0098 0.8427 +vn 0.1910 -0.0241 0.9813 +vn -0.1910 -0.0241 0.9813 +vn -0.4046 0.0266 0.9141 +vn 0.4046 0.0266 0.9141 +vn 0.7819 0.6231 -0.0197 +vn -0.7819 0.6231 -0.0197 +vn -0.5428 -0.2063 0.8142 +vn 0.5428 -0.2063 0.8142 +vn 0.2474 -0.9231 0.2945 +vn -0.2474 -0.9231 0.2945 +usemtl None +s off +f 2075/2225/1997 2029/2226/1997 2031/2227/1997 2073/2228/1997 +f 2032/2229/1998 2030/2230/1998 2076/2231/1998 2074/2232/1998 +f 2073/2228/1999 2031/2227/1999 2033/2233/1999 2071/2234/1999 +f 2034/2235/2000 2032/2229/2000 2074/2232/2000 2072/2236/2000 +f 2031/2227/2001 2037/2237/2001 2035/2238/2001 2033/2233/2001 +f 2036/2239/2002 2038/2240/2002 2032/2229/2002 2034/2235/2002 +f 2029/2226/2003 2039/2241/2003 2037/2237/2003 2031/2227/2003 +f 2038/2240/2004 2040/2242/2004 2030/2230/2004 2032/2229/2004 +f 2039/2241/2005 2041/2243/2005 2043/2244/2005 2037/2237/2005 +f 2044/2245/2006 2042/2246/2006 2040/2242/2006 2038/2240/2006 +f 2037/2237/2007 2043/2244/2007 2045/2247/2007 2035/2238/2007 +f 2046/2248/2008 2044/2245/2008 2038/2240/2008 2036/2239/2008 +f 2043/2244/2009 2049/2249/2009 2047/2250/2009 2045/2247/2009 +f 2048/2251/2010 2050/2252/2010 2044/2245/2010 2046/2248/2010 +f 2041/2243/2011 2051/2253/2011 2049/2249/2011 2043/2244/2011 +f 2050/2252/2012 2052/2254/2012 2042/2246/2012 2044/2245/2012 +f 2051/2253/2013 2053/2255/2013 2055/2256/2013 2049/2249/2013 +f 2056/2257/2014 2054/2258/2014 2052/2254/2014 2050/2252/2014 +f 2049/2249/2015 2055/2256/2015 2057/2259/2015 2047/2250/2015 +f 2058/2260/2016 2056/2257/2016 2050/2252/2016 2048/2251/2016 +f 2055/2256/2017 2061/2261/2017 2059/2262/2017 2057/2259/2017 +f 2060/2263/2018 2062/2264/2018 2056/2257/2018 2058/2260/2018 +f 2053/2255/2019 2063/2265/2019 2061/2261/2019 2055/2256/2019 +f 2062/2264/2020 2064/2266/2020 2054/2258/2020 2056/2257/2020 +f 2063/2265/2021 2065/2267/2021 2067/2268/2021 2061/2261/2021 +f 2068/2269/2022 2066/2270/2022 2064/2266/2022 2062/2264/2022 +f 2061/2261/2023 2067/2268/2023 2069/2271/2023 2059/2262/2023 +f 2070/2272/2024 2068/2269/2024 2062/2264/2024 2060/2263/2024 +f 2067/2268/2025 2073/2228/2025 2071/2234/2025 2069/2271/2025 +f 2072/2236/2026 2074/2232/2026 2068/2269/2026 2070/2272/2026 +f 2065/2267/2027 2075/2225/2027 2073/2228/2027 2067/2268/2027 +f 2074/2232/2028 2076/2231/2028 2066/2270/2028 2068/2269/2028 +f 2075/2225/2029 2065/2267/2029 2079/2273/2029 2077/2274/2029 +f 2080/2275/2030 2066/2270/2030 2076/2231/2030 2078/2276/2030 +f 2065/2267/2031 2063/2265/2031 2081/2277/2031 2079/2273/2031 +f 2082/2278/2032 2064/2266/2032 2066/2270/2032 2080/2275/2032 +f 2063/2265/2033 2053/2255/2033 2083/2279/2033 2081/2277/2033 +f 2084/2280/2034 2054/2258/2034 2064/2266/2034 2082/2278/2034 +f 2053/2255/2035 2051/2253/2035 2085/2281/2035 2083/2279/2035 +f 2086/2282/2036 2052/2254/2036 2054/2258/2036 2084/2280/2036 +f 2051/2253/2037 2041/2243/2037 2087/2283/2037 2085/2281/2037 +f 2088/2284/2038 2042/2246/2038 2052/2254/2038 2086/2282/2038 +f 2041/2243/2039 2039/2241/2039 2091/2285/2039 2087/2283/2039 +f 2092/2286/2040 2040/2242/2040 2042/2246/2040 2088/2284/2040 +f 2039/2241/2041 2029/2226/2041 2093/2287/2041 2091/2285/2041 +f 2094/2288/2042 2030/2230/2042 2040/2242/2042 2092/2286/2042 +f 2029/2226/2043 2075/2225/2043 2077/2274/2043 2093/2287/2043 +f 2078/2276/2044 2076/2231/2044 2030/2230/2044 2094/2288/2044 +f 2089/2289/2045 2093/2287/2045 2077/2274/2045 +f 2078/2276/2046 2094/2288/2046 2090/2290/2046 +f 2091/2285/2047 2093/2287/2047 2089/2289/2047 +f 2090/2290/2048 2094/2288/2048 2092/2286/2048 +f 2089/2289/2049 2087/2283/2049 2091/2285/2049 +f 2092/2286/2050 2088/2284/2050 2090/2290/2050 +f 2089/2289/2051 2085/2281/2051 2087/2283/2051 +f 2088/2284/2052 2086/2282/2052 2090/2290/2052 +f 2089/2289/2053 2083/2279/2053 2085/2281/2053 +f 2086/2282/2054 2084/2280/2054 2090/2290/2054 +f 2089/2289/2055 2081/2277/2055 2083/2279/2055 +f 2084/2280/2056 2082/2278/2056 2090/2290/2056 +f 2089/2289/2057 2079/2273/2057 2081/2277/2057 +f 2082/2278/2058 2080/2275/2058 2090/2290/2058 +f 2089/2289/2059 2077/2274/2059 2079/2273/2059 +f 2080/2275/2060 2078/2276/2060 2090/2290/2060 +f 2117/2291/2061 2202/2292/2061 2204/2293/2061 2119/2294/2061 +f 2204/2293/2062 2203/2295/2062 2118/2296/2062 2119/2294/2062 +f 2115/2297/2063 2200/2298/2063 2202/2292/2063 2117/2291/2063 +f 2203/2295/2064 2201/2299/2064 2116/2300/2064 2118/2296/2064 +f 2113/2301/2065 2198/2302/2065 2200/2298/2065 2115/2297/2065 +f 2201/2299/2066 2199/2303/2066 2114/2304/2066 2116/2300/2066 +f 2111/2305/2067 2196/2306/2067 2198/2302/2067 2113/2301/2067 +f 2199/2303/2068 2197/2307/2068 2112/2308/2068 2114/2304/2068 +f 2109/2309/2069 2194/2310/2069 2196/2306/2069 2111/2305/2069 +f 2197/2307/2070 2195/2311/2070 2110/2312/2070 2112/2308/2070 +f 2107/2313/2071 2120/2314/2071 2174/2315/2071 2192/2316/2071 +f 2175/2317/2072 2121/2318/2072 2108/2319/2072 2193/2320/2072 +f 2120/2314/2073 2122/2321/2073 2176/2322/2073 2174/2315/2073 +f 2177/2323/2074 2123/2324/2074 2121/2318/2074 2175/2317/2074 +f 2122/2321/2075 2124/2325/2075 2178/2326/2075 2176/2322/2075 +f 2179/2327/2076 2125/2328/2076 2123/2324/2076 2177/2323/2076 +f 2124/2325/2077 2126/2329/2077 2180/2330/2077 2178/2326/2077 +f 2181/2331/2078 2127/2332/2078 2125/2328/2078 2179/2327/2078 +f 2126/2329/2079 2128/2333/2079 2182/2334/2079 2180/2330/2079 +f 2183/2335/2080 2129/2336/2080 2127/2332/2080 2181/2331/2080 +f 2128/2333/2081 2130/2337/2081 2184/2338/2081 2182/2334/2081 +f 2185/2339/2082 2131/2340/2082 2129/2336/2082 2183/2335/2082 +f 2130/2337/2083 2132/2341/2083 2186/2342/2083 2184/2338/2083 +f 2187/2343/2084 2133/2344/2084 2131/2340/2084 2185/2339/2084 +f 2132/2341/2085 2134/2345/2085 2188/2346/2085 2186/2342/2085 +f 2189/2347/2086 2135/2348/2086 2133/2344/2086 2187/2343/2086 +f 2134/2345/2087 2136/2349/2087 2190/2350/2087 2188/2346/2087 +f 2191/2351/2088 2137/2352/2088 2135/2348/2088 2189/2347/2088 +f 2136/2349/2089 2095/2353/2089 2096/2354/2089 2190/2350/2089 +f 2096/2354/2090 2095/2353/2090 2137/2352/2090 2191/2351/2090 +f 2138/2355/2091 2156/2356/2091 2188/2346/2091 2190/2350/2091 +f 2189/2347/2092 2157/2357/2092 2139/2358/2092 2191/2351/2092 +f 2156/2356/2093 2207/2359/2093 2186/2342/2093 2188/2346/2093 +f 2187/2343/2094 2208/2360/2094 2157/2357/2094 2189/2347/2094 +f 2154/2361/2095 2184/2338/2095 2186/2342/2095 2207/2359/2095 +f 2187/2343/2096 2185/2339/2096 2155/2362/2096 2208/2360/2096 +f 2152/2363/2097 2182/2334/2097 2184/2338/2097 2154/2361/2097 +f 2185/2339/2098 2183/2335/2098 2153/2364/2098 2155/2362/2098 +f 2150/2365/2099 2180/2330/2099 2182/2334/2099 2152/2363/2099 +f 2183/2335/2100 2181/2331/2100 2151/2366/2100 2153/2364/2100 +f 2148/2367/2101 2178/2326/2101 2180/2330/2101 2150/2365/2101 +f 2181/2331/2102 2179/2327/2102 2149/2368/2102 2151/2366/2102 +f 2146/2369/2103 2176/2322/2103 2178/2326/2103 2148/2367/2103 +f 2179/2327/2104 2177/2323/2104 2147/2370/2104 2149/2368/2104 +f 2144/2371/2105 2174/2315/2105 2176/2322/2105 2146/2369/2105 +f 2177/2323/2106 2175/2317/2106 2145/2372/2106 2147/2370/2106 +f 2142/2373/2107 2192/2316/2107 2174/2315/2107 2144/2371/2107 +f 2175/2317/2108 2193/2320/2108 2143/2374/2108 2145/2372/2108 +f 2142/2373/2109 2209/2375/2109 2205/2376/2109 2192/2316/2109 +f 2205/2376/2110 2210/2377/2110 2143/2374/2110 2193/2320/2110 +f 2138/2355/2111 2190/2350/2111 2096/2354/2111 2140/2378/2111 +f 2096/2354/2112 2191/2351/2112 2139/2358/2112 2141/2379/2112 +f 2140/2378/2113 2096/2354/2113 2206/2380/2113 2211/2381/2113 +f 2206/2380/2114 2096/2354/2114 2141/2379/2114 2212/2382/2114 +f 2205/2376/2115 2209/2375/2115 2211/2381/2115 2206/2380/2115 +f 2212/2382/2116 2210/2377/2116 2205/2376/2116 2206/2380/2116 +f 2163/2383/2117 2165/2384/2117 2204/2293/2117 2202/2292/2117 +f 2204/2293/2118 2165/2384/2118 2164/2385/2118 2203/2295/2118 +f 2161/2386/2119 2163/2383/2119 2202/2292/2119 2200/2298/2119 +f 2203/2295/2120 2164/2385/2120 2162/2387/2120 2201/2299/2120 +f 2159/2388/2121 2161/2386/2121 2200/2298/2121 2198/2302/2121 +f 2201/2299/2122 2162/2387/2122 2160/2389/2122 2199/2303/2122 +f 2194/2310/2123 2215/2390/2123 2213/2391/2123 2196/2306/2123 +f 2214/2392/2124 2216/2393/2124 2195/2311/2124 2197/2307/2124 +f 2159/2388/2125 2198/2302/2125 2196/2306/2125 2213/2391/2125 +f 2197/2307/2126 2199/2303/2126 2160/2389/2126 2214/2392/2126 +f 2172/2394/2127 2218/2395/2127 2217/2396/2127 2215/2390/2127 +f 2217/2396/2128 2218/2395/2128 2173/2397/2128 2216/2393/2128 +f 2213/2391/2129 2215/2390/2129 2217/2396/2129 2097/2398/2129 +f 2217/2396/2130 2216/2393/2130 2214/2392/2130 2097/2398/2130 +f 2158/2399/2131 2159/2388/2131 2213/2391/2131 2097/2398/2131 +f 2214/2392/2131 2160/2389/2131 2158/2399/2131 2097/2398/2131 +f 2170/2400/2132 2221/2401/2132 2219/2402/2132 2172/2394/2132 +f 2220/2403/2133 2222/2404/2133 2171/2405/2133 2173/2397/2133 +f 2168/2406/2134 2223/2407/2134 2221/2401/2134 2170/2400/2134 +f 2222/2404/2135 2224/2408/2135 2169/2409/2135 2171/2405/2135 +f 2167/2410/2136 2225/2411/2136 2223/2407/2136 2168/2406/2136 +f 2224/2408/2137 2226/2412/2137 2167/2410/2137 2169/2409/2137 +f 2166/2413/2138 2099/2414/2138 2225/2411/2138 2167/2410/2138 +f 2226/2412/2139 2099/2414/2139 2166/2413/2139 2167/2410/2139 +f 2218/2395/2140 2172/2394/2140 2219/2402/2140 2098/2415/2140 +f 2220/2403/2141 2173/2397/2141 2218/2395/2141 2098/2415/2141 +f 2098/2415/2142 2219/2402/2142 2234/2416/2142 2236/2417/2142 +f 2235/2418/2143 2220/2403/2143 2098/2415/2143 2236/2417/2143 +f 2099/2414/2144 2227/2419/2144 2228/2420/2144 2225/2411/2144 +f 2229/2421/2145 2227/2419/2145 2099/2414/2145 2226/2412/2145 +f 2225/2411/2146 2228/2420/2146 2230/2422/2146 2223/2407/2146 +f 2231/2423/2147 2229/2421/2147 2226/2412/2147 2224/2408/2147 +f 2223/2407/2148 2230/2422/2148 2232/2424/2148 2221/2401/2148 +f 2233/2425/2149 2231/2423/2149 2224/2408/2149 2222/2404/2149 +f 2221/2401/2150 2232/2424/2150 2234/2416/2150 2219/2402/2150 +f 2235/2418/2151 2233/2425/2151 2222/2404/2151 2220/2403/2151 +f 2227/2419/2152 2232/2424/2152 2230/2422/2152 2228/2420/2152 +f 2231/2423/2153 2233/2425/2153 2227/2419/2153 2229/2421/2153 +f 2227/2419/2154 2236/2417/2154 2234/2416/2154 2232/2424/2154 +f 2235/2418/2155 2236/2417/2155 2227/2419/2155 2233/2425/2155 +f 2167/2410/2156 2168/2406/2156 2192/2316/2156 2205/2376/2156 +f 2193/2320/2157 2169/2409/2157 2167/2410/2157 2205/2376/2157 +f 2168/2406/2158 2170/2400/2158 2239/2426/2158 2192/2316/2158 +f 2240/2427/2159 2171/2405/2159 2169/2409/2159 2193/2320/2159 +f 2170/2400/2160 2172/2394/2160 2241/2428/2160 2239/2426/2160 +f 2242/2429/2161 2173/2397/2161 2171/2405/2161 2240/2427/2161 +f 2172/2394/2162 2215/2390/2162 2194/2310/2162 2241/2428/2162 +f 2195/2311/2163 2216/2393/2163 2173/2397/2163 2242/2429/2163 +f 2109/2309/2164 2237/2430/2164 2241/2428/2164 2194/2310/2164 +f 2242/2429/2165 2238/2431/2165 2110/2312/2165 2195/2311/2165 +f 2237/2430/2166 2243/2432/2166 2239/2426/2166 2241/2428/2166 +f 2240/2427/2167 2244/2433/2167 2238/2431/2167 2242/2429/2167 +f 2107/2313/2168 2192/2316/2168 2239/2426/2168 2243/2432/2168 +f 2240/2427/2169 2193/2320/2169 2108/2319/2169 2244/2433/2169 +f 2159/2388/2170 2158/2399/2170 2100/2434/2170 2250/2435/2170 +f 2100/2434/2171 2158/2399/2171 2160/2389/2171 2251/2436/2171 +f 2161/2386/2172 2159/2388/2172 2250/2435/2172 2248/2437/2172 +f 2251/2436/2173 2160/2389/2173 2162/2387/2173 2249/2438/2173 +f 2163/2383/2174 2161/2386/2174 2248/2437/2174 2246/2439/2174 +f 2249/2438/2175 2162/2387/2175 2164/2385/2175 2247/2440/2175 +f 2165/2384/2176 2163/2383/2176 2246/2439/2176 2245/2441/2176 +f 2247/2440/2177 2164/2385/2177 2165/2384/2177 2245/2441/2177 +f 2245/2441/2178 2246/2439/2178 2257/2442/2178 2259/2443/2178 +f 2258/2444/2179 2247/2440/2179 2245/2441/2179 2259/2443/2179 +f 2246/2439/2180 2248/2437/2180 2255/2445/2180 2257/2442/2180 +f 2256/2446/2181 2249/2438/2181 2247/2440/2181 2258/2444/2181 +f 2248/2437/2182 2250/2435/2182 2253/2447/2182 2255/2445/2182 +f 2254/2448/2183 2251/2436/2183 2249/2438/2183 2256/2446/2183 +f 2250/2435/2184 2100/2434/2184 2252/2449/2184 2253/2447/2184 +f 2252/2449/2185 2100/2434/2185 2251/2436/2185 2254/2448/2185 +f 2252/2449/2186 2259/2443/2186 2257/2442/2186 2253/2447/2186 +f 2258/2444/2187 2259/2443/2187 2252/2449/2187 2254/2448/2187 +f 2253/2447/2188 2257/2442/2188 2255/2445/2188 +f 2256/2446/2189 2258/2444/2189 2254/2448/2189 +f 2211/2381/2190 2209/2375/2190 2262/2450/2190 2260/2451/2190 +f 2263/2452/2191 2210/2377/2191 2212/2382/2191 2261/2453/2191 +f 2140/2378/2192 2211/2381/2192 2260/2451/2192 2282/2454/2192 +f 2261/2453/2193 2212/2382/2193 2141/2379/2193 2283/2455/2193 +f 2138/2355/2194 2140/2378/2194 2282/2454/2194 2284/2456/2194 +f 2283/2455/2195 2141/2379/2195 2139/2358/2195 2285/2457/2195 +f 2209/2375/2196 2142/2373/2196 2280/2458/2196 2262/2450/2196 +f 2281/2459/2197 2143/2374/2197 2210/2377/2197 2263/2452/2197 +f 2142/2373/2198 2144/2371/2198 2278/2460/2198 2280/2458/2198 +f 2279/2461/2199 2145/2372/2199 2143/2374/2199 2281/2459/2199 +f 2144/2371/2200 2146/2369/2200 2276/2462/2200 2278/2460/2200 +f 2277/2463/2201 2147/2370/2201 2145/2372/2201 2279/2461/2201 +f 2146/2369/2202 2148/2367/2202 2274/2464/2202 2276/2462/2202 +f 2275/2465/2203 2149/2368/2203 2147/2370/2203 2277/2463/2203 +f 2148/2367/2204 2150/2365/2204 2272/2466/2204 2274/2464/2204 +f 2273/2467/2205 2151/2366/2205 2149/2368/2205 2275/2465/2205 +f 2150/2365/2206 2152/2363/2206 2270/2468/2206 2272/2466/2206 +f 2271/2469/2207 2153/2364/2207 2151/2366/2207 2273/2467/2207 +f 2152/2363/2208 2154/2361/2208 2268/2470/2208 2270/2468/2208 +f 2269/2471/2209 2155/2362/2209 2153/2364/2209 2271/2469/2209 +f 2154/2361/2210 2207/2359/2210 2264/2472/2210 2268/2470/2210 +f 2265/2473/2211 2208/2360/2211 2155/2362/2211 2269/2471/2211 +f 2207/2359/2212 2156/2356/2212 2266/2474/2212 2264/2472/2212 +f 2267/2475/2213 2157/2357/2213 2208/2360/2213 2265/2473/2213 +f 2156/2356/2214 2138/2355/2214 2284/2456/2214 2266/2474/2214 +f 2285/2457/2215 2139/2358/2215 2157/2357/2215 2267/2475/2215 +f 2266/2474/2216 2284/2456/2216 2286/2476/2216 2304/2477/2216 +f 2287/2478/2217 2285/2457/2217 2267/2475/2217 2305/2479/2217 +f 2264/2472/2218 2266/2474/2218 2304/2477/2218 2306/2480/2218 +f 2305/2479/2219 2267/2475/2219 2265/2473/2219 2307/2481/2219 +f 2268/2470/2220 2264/2472/2220 2306/2480/2220 2302/2482/2220 +f 2307/2481/2221 2265/2473/2221 2269/2471/2221 2303/2483/2221 +f 2270/2468/2222 2268/2470/2222 2302/2482/2222 2300/2484/2222 +f 2303/2483/2223 2269/2471/2223 2271/2469/2223 2301/2485/2223 +f 2272/2466/2224 2270/2468/2224 2300/2484/2224 2298/2486/2224 +f 2301/2485/2225 2271/2469/2225 2273/2467/2225 2299/2487/2225 +f 2274/2464/2226 2272/2466/2226 2298/2486/2226 2296/2488/2226 +f 2299/2487/2227 2273/2467/2227 2275/2465/2227 2297/2489/2227 +f 2276/2462/2228 2274/2464/2228 2296/2488/2228 2294/2490/2228 +f 2297/2489/2229 2275/2465/2229 2277/2463/2229 2295/2491/2229 +f 2278/2460/2230 2276/2462/2230 2294/2490/2230 2292/2492/2230 +f 2295/2491/2231 2277/2463/2231 2279/2461/2231 2293/2493/2231 +f 2280/2458/2232 2278/2460/2232 2292/2492/2232 2290/2494/2232 +f 2293/2493/2233 2279/2461/2233 2281/2459/2233 2291/2495/2233 +f 2262/2450/2234 2280/2458/2234 2290/2494/2234 2308/2496/2234 +f 2291/2495/2235 2281/2459/2235 2263/2452/2235 2309/2497/2235 +f 2284/2456/2236 2282/2454/2236 2288/2498/2236 2286/2476/2236 +f 2289/2499/2237 2283/2455/2237 2285/2457/2237 2287/2478/2237 +f 2282/2454/2238 2260/2451/2238 2310/2500/2238 2288/2498/2238 +f 2311/2501/2239 2261/2453/2239 2283/2455/2239 2289/2499/2239 +f 2260/2451/2240 2262/2450/2240 2308/2496/2240 2310/2500/2240 +f 2309/2497/2241 2263/2452/2241 2261/2453/2241 2311/2501/2241 +f 2095/2353/2242 2136/2349/2242 2312/2502/2242 2101/2503/2242 +f 2313/2504/2243 2137/2352/2243 2095/2353/2243 2101/2503/2243 +f 2136/2349/2244 2134/2345/2244 2314/2505/2244 2312/2502/2244 +f 2315/2506/2245 2135/2348/2245 2137/2352/2245 2313/2504/2245 +f 2134/2345/2246 2132/2341/2246 2316/2507/2246 2314/2505/2246 +f 2317/2508/2247 2133/2344/2247 2135/2348/2247 2315/2506/2247 +f 2132/2341/2248 2130/2337/2248 2318/2509/2248 2316/2507/2248 +f 2319/2510/2249 2131/2340/2249 2133/2344/2249 2317/2508/2249 +f 2130/2337/2250 2128/2333/2250 2320/2511/2250 2318/2509/2250 +f 2321/2512/2251 2129/2336/2251 2131/2340/2251 2319/2510/2251 +f 2128/2333/2252 2126/2329/2252 2322/2513/2252 2320/2511/2252 +f 2323/2514/2253 2127/2332/2253 2129/2336/2253 2321/2512/2253 +f 2126/2329/2254 2124/2325/2254 2324/2515/2254 2322/2513/2254 +f 2325/2516/2255 2125/2328/2255 2127/2332/2255 2323/2514/2255 +f 2124/2325/2256 2122/2321/2256 2326/2517/2256 2324/2515/2256 +f 2327/2518/2257 2123/2324/2257 2125/2328/2257 2325/2516/2257 +f 2122/2321/2258 2120/2314/2258 2328/2519/2258 2326/2517/2258 +f 2329/2520/2259 2121/2318/2259 2123/2324/2259 2327/2518/2259 +f 2336/2521/2260 2337/2522/2260 2356/2523/2260 2366/2524/2260 +f 2357/2525/2261 2337/2526/2261 2336/2527/2261 2367/2528/2261 +f 2335/2529/2262 2336/2521/2262 2366/2524/2262 2364/2530/2262 +f 2367/2528/2263 2336/2527/2263 2335/2531/2263 2365/2532/2263 +f 2334/2533/2264 2335/2529/2264 2364/2530/2264 2368/2534/2264 +f 2365/2532/2265 2335/2531/2265 2334/2533/2265 2369/2535/2265 +f 2117/2291/2266 2119/2294/2266 2334/2533/2266 2368/2534/2266 +f 2334/2533/2267 2119/2294/2267 2118/2296/2267 2369/2535/2267 +f 2115/2297/2268 2117/2291/2268 2368/2534/2268 2362/2536/2268 +f 2369/2535/2269 2118/2296/2269 2116/2300/2269 2363/2537/2269 +f 2113/2301/2270 2115/2297/2270 2362/2536/2270 2358/2538/2270 +f 2363/2537/2271 2116/2300/2271 2114/2304/2271 2359/2539/2271 +f 2111/2305/2272 2113/2301/2272 2358/2538/2272 2360/2540/2272 +f 2359/2539/2273 2114/2304/2273 2112/2308/2273 2361/2541/2273 +f 2358/2538/2274 2364/2530/2274 2366/2524/2274 2360/2540/2274 +f 2367/2528/2275 2365/2532/2275 2359/2539/2275 2361/2541/2275 +f 2358/2538/2276 2362/2536/2276 2368/2534/2276 2364/2530/2276 +f 2369/2535/2277 2363/2537/2277 2359/2539/2277 2365/2532/2277 +f 2354/2542/2278 2360/2540/2278 2366/2524/2278 2356/2523/2278 +f 2367/2528/2279 2361/2541/2279 2355/2543/2279 2357/2525/2279 +f 2109/2309/2280 2111/2305/2280 2360/2540/2280 2354/2542/2280 +f 2361/2541/2281 2112/2308/2281 2110/2312/2281 2355/2543/2281 +f 2237/2430/2282 2370/2544/2282 2372/2545/2282 2243/2432/2282 +f 2373/2546/2283 2371/2547/2283 2238/2431/2283 2244/2433/2283 +f 2109/2309/2284 2354/2542/2284 2370/2544/2284 2237/2430/2284 +f 2371/2547/2285 2355/2543/2285 2110/2312/2285 2238/2431/2285 +f 2107/2313/2286 2243/2432/2286 2372/2545/2286 2374/2548/2286 +f 2373/2546/2287 2244/2433/2287 2108/2319/2287 2375/2549/2287 +f 2107/2313/2288 2374/2548/2288 2328/2519/2288 2120/2314/2288 +f 2329/2520/2289 2375/2549/2289 2108/2319/2289 2121/2318/2289 +f 2105/2550/2290 2352/2551/2290 2380/2552/2290 2332/2553/2290 +f 2381/2554/2291 2353/2555/2291 2105/2556/2291 2332/2557/2291 +f 2332/2553/2292 2380/2552/2292 2378/2558/2292 2106/2559/2292 +f 2379/2560/2293 2381/2554/2293 2332/2557/2293 2106/2561/2293 +f 2106/2559/2294 2378/2558/2294 2376/2562/2294 2333/2563/2294 +f 2377/2564/2295 2379/2560/2295 2106/2561/2295 2333/2565/2295 +f 2333/2563/2296 2376/2562/2296 2356/2523/2296 2337/2522/2296 +f 2357/2525/2297 2377/2564/2297 2333/2565/2297 2337/2526/2297 +f 2354/2542/2298 2356/2523/2298 2376/2562/2298 2370/2544/2298 +f 2377/2564/2299 2357/2525/2299 2355/2543/2299 2371/2547/2299 +f 2324/2515/2300 2326/2517/2300 2346/2566/2300 2338/2567/2300 +f 2347/2568/2301 2327/2518/2301 2325/2516/2301 2339/2569/2301 +f 2104/2570/2302 2344/2571/2302 2352/2551/2302 2105/2550/2302 +f 2353/2555/2303 2345/2572/2303 2104/2573/2303 2105/2556/2303 +f 2330/2574/2304 2386/2575/2304 2384/2576/2304 2331/2577/2304 +f 2385/2578/2305 2387/2579/2305 2330/2580/2305 2331/2581/2305 +f 2331/2577/2306 2384/2576/2306 2382/2582/2306 2103/2583/2306 +f 2383/2584/2307 2385/2578/2307 2331/2581/2307 2103/2585/2307 +f 2103/2583/2308 2382/2582/2308 2344/2571/2308 2104/2570/2308 +f 2345/2572/2309 2383/2584/2309 2103/2585/2309 2104/2573/2309 +f 2320/2586/2310 2322/2513/2310 2390/2587/2310 2392/2588/2310 +f 2391/2589/2311 2323/2514/2311 2321/2590/2311 2393/2591/2311 +f 2392/2588/2312 2390/2587/2312 2396/2592/2312 2394/2593/2312 +f 2397/2594/2313 2391/2589/2313 2393/2591/2313 2395/2595/2313 +f 2394/2593/2314 2396/2592/2314 2398/2596/2314 2400/2597/2314 +f 2399/2598/2315 2397/2594/2315 2395/2595/2315 2401/2599/2315 +f 2400/2597/2316 2398/2596/2316 2404/2600/2316 2402/2601/2316 +f 2405/2602/2317 2399/2598/2317 2401/2599/2317 2403/2603/2317 +f 2342/2604/2318 2406/2605/2318 2402/2601/2318 2404/2600/2318 +f 2403/2603/2319 2407/2606/2319 2343/2607/2319 2405/2602/2319 +f 2344/2571/2320 2382/2582/2320 2402/2601/2320 2406/2605/2320 +f 2403/2603/2321 2383/2584/2321 2345/2572/2321 2407/2606/2321 +f 2382/2582/2322 2384/2576/2322 2400/2597/2322 2402/2601/2322 +f 2401/2599/2323 2385/2578/2323 2383/2584/2323 2403/2603/2323 +f 2384/2576/2324 2386/2575/2324 2394/2593/2324 2400/2597/2324 +f 2395/2595/2325 2387/2579/2325 2385/2578/2325 2401/2599/2325 +f 2386/2575/2326 2388/2608/2326 2392/2588/2326 2394/2593/2326 +f 2393/2591/2327 2389/2609/2327 2387/2579/2327 2395/2595/2327 +f 2318/2610/2328 2320/2586/2328 2392/2588/2328 2388/2608/2328 +f 2393/2591/2329 2321/2590/2329 2319/2611/2329 2389/2609/2329 +f 2102/2612/2330 2388/2608/2330 2386/2575/2330 2330/2574/2330 +f 2387/2579/2331 2389/2609/2331 2102/2613/2331 2330/2580/2331 +f 2312/2614/2332 2314/2615/2332 2316/2616/2332 2318/2610/2332 +f 2317/2617/2333 2315/2618/2333 2313/2619/2333 2319/2611/2333 +f 2312/2614/2334 2318/2610/2334 2388/2608/2334 2102/2612/2334 +f 2389/2609/2335 2319/2611/2335 2313/2619/2335 2102/2613/2335 +f 2101/2620/2336 2312/2614/2336 2102/2612/2336 +f 2102/2613/2337 2313/2619/2337 2101/2621/2337 +f 2322/2513/2338 2324/2515/2338 2338/2567/2338 2390/2587/2338 +f 2339/2569/2339 2325/2516/2339 2323/2514/2339 2391/2589/2339 +f 2338/2567/2340 2340/2622/2340 2396/2592/2340 2390/2587/2340 +f 2397/2594/2341 2341/2623/2341 2339/2569/2341 2391/2589/2341 +f 2340/2622/2342 2410/2624/2342 2398/2596/2342 2396/2592/2342 +f 2399/2598/2343 2411/2625/2343 2341/2623/2343 2397/2594/2343 +f 2342/2604/2344 2404/2600/2344 2398/2596/2344 2410/2624/2344 +f 2399/2598/2345 2405/2602/2345 2343/2607/2345 2411/2625/2345 +f 2376/2562/2346 2378/2558/2346 2414/2626/2346 2412/2627/2346 +f 2415/2628/2347 2379/2560/2347 2377/2564/2347 2413/2629/2347 +f 2346/2566/2348 2412/2627/2348 2414/2626/2348 2348/2630/2348 +f 2415/2628/2349 2413/2629/2349 2347/2568/2349 2349/2631/2349 +f 2326/2517/2350 2328/2519/2350 2412/2627/2350 2346/2566/2350 +f 2413/2629/2351 2329/2520/2351 2327/2518/2351 2347/2568/2351 +f 2328/2519/2352 2372/2545/2352 2370/2544/2352 2412/2627/2352 +f 2371/2547/2353 2373/2546/2353 2329/2520/2353 2413/2629/2353 +f 2370/2544/2354 2376/2562/2354 2412/2627/2354 +f 2413/2629/2355 2377/2564/2355 2371/2547/2355 +f 2328/2519/2356 2374/2548/2356 2372/2545/2356 +f 2373/2546/2357 2375/2549/2357 2329/2520/2357 +f 2342/2604/2358 2350/2632/2358 2408/2633/2358 2406/2605/2358 +f 2409/2634/2359 2351/2635/2359 2343/2607/2359 2407/2606/2359 +f 2344/2571/2360 2406/2605/2360 2408/2633/2360 2352/2551/2360 +f 2409/2634/2361 2407/2606/2361 2345/2572/2361 2353/2555/2361 +f 2348/2630/2362 2414/2626/2362 2408/2633/2362 2350/2632/2362 +f 2409/2634/2363 2415/2628/2363 2349/2631/2363 2351/2635/2363 +f 2378/2558/2364 2380/2552/2364 2408/2633/2364 2414/2626/2364 +f 2409/2634/2365 2381/2554/2365 2379/2560/2365 2415/2628/2365 +f 2352/2551/2366 2408/2633/2366 2380/2552/2366 +f 2381/2554/2367 2409/2634/2367 2353/2555/2367 +f 2428/2636/2368 2416/2637/2368 2442/2638/2368 2430/2639/2368 +f 2443/2640/2369 2417/2641/2369 2429/2642/2369 2431/2643/2369 +f 2428/2636/2370 2430/2639/2370 2432/2644/2370 2426/2645/2370 +f 2433/2646/2371 2431/2643/2371 2429/2642/2371 2427/2647/2371 +f 2426/2645/2372 2432/2644/2372 2434/2648/2372 2424/2649/2372 +f 2435/2650/2373 2433/2646/2373 2427/2647/2373 2425/2651/2373 +f 2424/2649/2374 2434/2648/2374 2436/2652/2374 2422/2653/2374 +f 2437/2654/2375 2435/2650/2375 2425/2651/2375 2423/2655/2375 +f 2422/2653/2376 2436/2652/2376 2438/2656/2376 2420/2657/2376 +f 2439/2658/2377 2437/2654/2377 2423/2655/2377 2421/2659/2377 +f 2420/2657/2378 2438/2656/2378 2440/2660/2378 2418/2661/2378 +f 2441/2662/2379 2439/2658/2379 2421/2659/2379 2419/2663/2379 +f 2438/2656/2380 2448/2664/2380 2446/2665/2380 2440/2660/2380 +f 2447/2666/2381 2449/2667/2381 2439/2658/2381 2441/2662/2381 +f 2436/2652/2382 2450/2668/2382 2448/2664/2382 2438/2656/2382 +f 2449/2667/2383 2451/2669/2383 2437/2654/2383 2439/2658/2383 +f 2434/2648/2384 2452/2670/2384 2450/2668/2384 2436/2652/2384 +f 2451/2669/2385 2453/2671/2385 2435/2650/2385 2437/2654/2385 +f 2432/2644/2386 2454/2672/2386 2452/2670/2386 2434/2648/2386 +f 2453/2671/2387 2455/2673/2387 2433/2646/2387 2435/2650/2387 +f 2430/2639/2388 2456/2674/2388 2454/2672/2388 2432/2644/2388 +f 2455/2673/2389 2457/2675/2389 2431/2643/2389 2433/2646/2389 +f 2430/2639/2390 2442/2638/2390 2444/2676/2390 2456/2674/2390 +f 2445/2677/2391 2443/2640/2391 2431/2643/2391 2457/2675/2391 +f 2346/2566/2392 2348/2630/2392 2472/2678/2392 2470/2679/2392 +f 2473/2680/2393 2349/2631/2393 2347/2568/2393 2471/2681/2393 +f 2348/2682/2394 2418/2661/2394 2440/2660/2394 2472/2683/2394 +f 2441/2662/2395 2419/2663/2395 2349/2684/2395 2473/2685/2395 +f 2338/2567/2396 2346/2566/2396 2470/2679/2396 2340/2622/2396 +f 2471/2681/2397 2347/2568/2397 2339/2569/2397 2341/2623/2397 +f 2410/2686/2398 2458/2687/2398 2442/2638/2398 2416/2637/2398 +f 2443/2640/2399 2459/2688/2399 2411/2689/2399 2417/2641/2399 +f 2440/2660/2400 2446/2665/2400 2468/2690/2400 2472/2683/2400 +f 2469/2691/2401 2447/2666/2401 2441/2662/2401 2473/2685/2401 +f 2466/2692/2402 2474/2693/2402 2472/2683/2402 2468/2690/2402 +f 2473/2685/2403 2475/2694/2403 2467/2695/2403 2469/2691/2403 +f 2462/2696/2404 2474/2693/2404 2466/2692/2404 2464/2697/2404 +f 2467/2695/2405 2475/2694/2405 2463/2698/2405 2465/2699/2405 +f 2460/2700/2406 2476/2701/2406 2474/2693/2406 2462/2696/2406 +f 2475/2694/2407 2477/2702/2407 2461/2703/2407 2463/2698/2407 +f 2458/2687/2408 2476/2701/2408 2460/2700/2408 2478/2704/2408 +f 2461/2703/2409 2477/2702/2409 2459/2688/2409 2479/2705/2409 +f 2442/2638/2410 2458/2687/2410 2478/2704/2410 2444/2676/2410 +f 2479/2705/2411 2459/2688/2411 2443/2640/2411 2445/2677/2411 +f 2340/2622/2412 2476/2706/2412 2458/2707/2412 2410/2624/2412 +f 2459/2708/2413 2477/2709/2413 2341/2623/2413 2411/2625/2413 +f 2340/2622/2414 2470/2679/2414 2474/2710/2414 2476/2706/2414 +f 2475/2711/2415 2471/2681/2415 2341/2623/2415 2477/2709/2415 +f 2470/2679/2416 2472/2678/2416 2474/2710/2416 +f 2475/2711/2417 2473/2680/2417 2471/2681/2417 +f 2444/2676/2418 2478/2704/2418 2480/2712/2418 2504/2713/2418 +f 2481/2714/2419 2479/2705/2419 2445/2677/2419 2505/2715/2419 +f 2478/2704/2420 2460/2700/2420 2490/2716/2420 2480/2712/2420 +f 2491/2717/2421 2461/2703/2421 2479/2705/2421 2481/2714/2421 +f 2460/2700/2422 2462/2696/2422 2488/2718/2422 2490/2716/2422 +f 2489/2719/2423 2463/2698/2423 2461/2703/2423 2491/2717/2423 +f 2462/2696/2424 2464/2697/2424 2486/2720/2424 2488/2718/2424 +f 2487/2721/2425 2465/2699/2425 2463/2698/2425 2489/2719/2425 +f 2464/2697/2426 2466/2692/2426 2484/2722/2426 2486/2720/2426 +f 2485/2723/2427 2467/2695/2427 2465/2699/2427 2487/2721/2427 +f 2466/2692/2428 2468/2690/2428 2482/2724/2428 2484/2722/2428 +f 2483/2725/2429 2469/2691/2429 2467/2695/2429 2485/2723/2429 +f 2468/2690/2430 2446/2665/2430 2502/2726/2430 2482/2724/2430 +f 2503/2727/2431 2447/2666/2431 2469/2691/2431 2483/2725/2431 +f 2456/2674/2432 2444/2676/2432 2504/2713/2432 2492/2728/2432 +f 2505/2715/2433 2445/2677/2433 2457/2675/2433 2493/2729/2433 +f 2454/2672/2434 2456/2674/2434 2492/2728/2434 2494/2730/2434 +f 2493/2729/2435 2457/2675/2435 2455/2673/2435 2495/2731/2435 +f 2452/2670/2436 2454/2672/2436 2494/2730/2436 2496/2732/2436 +f 2495/2731/2437 2455/2673/2437 2453/2671/2437 2497/2733/2437 +f 2450/2668/2438 2452/2670/2438 2496/2732/2438 2498/2734/2438 +f 2497/2733/2439 2453/2671/2439 2451/2669/2439 2499/2735/2439 +f 2448/2664/2440 2450/2668/2440 2498/2734/2440 2500/2736/2440 +f 2499/2735/2441 2451/2669/2441 2449/2667/2441 2501/2737/2441 +f 2446/2665/2442 2448/2664/2442 2500/2736/2442 2502/2726/2442 +f 2501/2737/2443 2449/2667/2443 2447/2666/2443 2503/2727/2443 +f 2486/2720/2444 2484/2722/2444 2508/2738/2444 2506/2739/2444 +f 2509/2740/2445 2485/2723/2445 2487/2721/2445 2507/2741/2445 +f 2506/2739/2446 2508/2738/2446 2510/2742/2446 2512/2743/2446 +f 2511/2744/2447 2509/2740/2447 2507/2741/2447 2513/2745/2447 +f 2512/2743/2448 2510/2742/2448 2516/2746/2448 2514/2747/2448 +f 2517/2748/2449 2511/2744/2449 2513/2745/2449 2515/2749/2449 +f 2514/2747/2450 2516/2746/2450 2518/2750/2450 2520/2751/2450 +f 2519/2752/2451 2517/2748/2451 2515/2749/2451 2521/2753/2451 +f 2492/2728/2452 2504/2713/2452 2514/2747/2452 2520/2751/2452 +f 2515/2749/2453 2505/2715/2453 2493/2729/2453 2521/2753/2453 +f 2480/2712/2454 2512/2743/2454 2514/2747/2454 2504/2713/2454 +f 2515/2749/2455 2513/2745/2455 2481/2714/2455 2505/2715/2455 +f 2480/2712/2456 2490/2716/2456 2506/2739/2456 2512/2743/2456 +f 2507/2741/2457 2491/2717/2457 2481/2714/2457 2513/2745/2457 +f 2486/2720/2458 2506/2739/2458 2490/2716/2458 2488/2718/2458 +f 2491/2717/2459 2507/2741/2459 2487/2721/2459 2489/2719/2459 +f 2482/2724/2460 2502/2726/2460 2508/2738/2460 2484/2722/2460 +f 2509/2740/2461 2503/2727/2461 2483/2725/2461 2485/2723/2461 +f 2500/2736/2462 2510/2742/2462 2508/2738/2462 2502/2726/2462 +f 2509/2740/2463 2511/2744/2463 2501/2737/2463 2503/2727/2463 +f 2498/2734/2464 2516/2746/2464 2510/2742/2464 2500/2736/2464 +f 2511/2744/2465 2517/2748/2465 2499/2735/2465 2501/2737/2465 +f 2496/2732/2466 2518/2750/2466 2516/2746/2466 2498/2734/2466 +f 2517/2748/2467 2519/2752/2467 2497/2733/2467 2499/2735/2467 +f 2494/2730/2468 2520/2751/2468 2518/2750/2468 2496/2732/2468 +f 2519/2752/2469 2521/2753/2469 2495/2731/2469 2497/2733/2469 +f 2492/2728/2470 2520/2751/2470 2494/2730/2470 +f 2495/2731/2471 2521/2753/2471 2493/2729/2471 +f 2420/2657/2472 2418/2661/2472 2532/2754/2472 2530/2755/2472 +f 2533/2756/2473 2419/2663/2473 2421/2659/2473 2531/2757/2473 +f 2422/2653/2474 2420/2657/2474 2530/2755/2474 2528/2758/2474 +f 2531/2757/2475 2421/2659/2475 2423/2655/2475 2529/2759/2475 +f 2424/2649/2476 2422/2653/2476 2528/2758/2476 2526/2760/2476 +f 2529/2759/2477 2423/2655/2477 2425/2651/2477 2527/2761/2477 +f 2426/2762/2478 2424/2649/2478 2526/2760/2478 2524/2763/2478 +f 2527/2761/2479 2425/2651/2479 2427/2764/2479 2525/2765/2479 +f 2428/2766/2480 2426/2762/2480 2524/2763/2480 2522/2767/2480 +f 2525/2765/2481 2427/2764/2481 2429/2768/2481 2523/2769/2481 +f 2416/2770/2482 2428/2766/2482 2522/2767/2482 2534/2771/2482 +f 2523/2769/2483 2429/2768/2483 2417/2772/2483 2535/2773/2483 +f 2522/2767/2484 2530/2755/2484 2532/2754/2484 2534/2771/2484 +f 2533/2756/2485 2531/2757/2485 2523/2769/2485 2535/2773/2485 +f 2522/2767/2486 2524/2763/2486 2528/2758/2486 2530/2755/2486 +f 2529/2759/2487 2525/2765/2487 2523/2769/2487 2531/2757/2487 +f 2524/2763/2488 2526/2760/2488 2528/2758/2488 +f 2529/2759/2489 2527/2761/2489 2525/2765/2489 +f 2342/2604/2490 2410/2624/2490 2416/2774/2490 2534/2775/2490 +f 2417/2772/2491 2411/2776/2491 2343/2777/2491 2535/2773/2491 +f 2342/2778/2492 2534/2771/2492 2532/2754/2492 2350/2779/2492 +f 2533/2756/2493 2535/2773/2493 2343/2777/2493 2351/2780/2493 +f 2348/2682/2494 2350/2779/2494 2532/2754/2494 2418/2661/2494 +f 2533/2756/2495 2351/2780/2495 2349/2684/2495 2419/2663/2495 +g Suzanne.005_Suzanne +v 1.341293 0.164062 1.960012 +v 1.960011 0.164062 1.341294 +v 1.352341 0.093750 2.059449 +v 2.059448 0.093750 1.352342 +v 1.396536 0.054688 2.169934 +v 2.169934 0.054688 1.396536 +v 1.507021 -0.023438 2.004206 +v 2.004205 -0.023438 1.507022 +v 1.435205 0.031250 1.932391 +v 1.932390 0.031250 1.435206 +v 1.391011 0.132812 1.888196 +v 1.888196 0.132812 1.391012 +v 1.435205 0.164062 1.821905 +v 1.821905 0.164062 1.435206 +v 1.523594 0.093750 1.810857 +v 1.810856 0.093750 1.523594 +v 1.623031 0.054688 1.844002 +v 1.844002 0.054688 1.623031 +v 1.672749 0.242188 1.783235 +v 1.783235 0.242188 1.672750 +v 1.567788 0.242188 1.766662 +v 1.766662 0.242188 1.567789 +v 1.457303 0.242188 1.799808 +v 1.799807 0.242188 1.457303 +v 1.435205 0.328125 1.821905 +v 1.821905 0.328125 1.435206 +v 1.523594 0.390625 1.810857 +v 1.810856 0.390625 1.523594 +v 1.623031 0.437500 1.844002 +v 1.844002 0.437500 1.623031 +v 1.507021 0.515625 2.004206 +v 2.004205 0.515625 1.507022 +v 1.435205 0.453125 1.932391 +v 1.932390 0.453125 1.435206 +v 1.391011 0.359375 1.888196 +v 1.888196 0.359375 1.391012 +v 1.341293 0.328125 1.960012 +v 1.960011 0.328125 1.341294 +v 1.352341 0.390625 2.059449 +v 2.059448 0.390625 1.352342 +v 1.396536 0.437500 2.169934 +v 2.169934 0.437500 1.396536 +v 1.352341 0.242188 2.236226 +v 2.236225 0.242188 1.352342 +v 1.319196 0.242188 2.114691 +v 2.114691 0.242188 1.319196 +v 1.324720 0.242188 1.987633 +v 1.987633 0.242188 1.324721 +v 1.308147 0.242188 1.982109 +v 1.982108 0.242188 1.308148 +v 1.324720 0.335938 1.954488 +v 1.954487 0.335938 1.324721 +v 1.374439 0.375000 1.871624 +v 1.871623 0.375000 1.374439 +v 1.424157 0.335938 1.799808 +v 1.799807 0.335938 1.424158 +v 1.451778 0.242188 1.772187 +v 1.772186 0.242188 1.451779 +v 1.424157 0.156250 1.799808 +v 1.799807 0.156250 1.424158 +v 1.357866 0.242188 1.855051 +v 1.855050 0.242188 1.357866 +v 1.374439 0.117188 1.871624 +v 1.871623 0.117188 1.374439 +v 1.324720 0.156250 1.954488 +v 1.954487 0.156250 1.324721 +v 1.667225 0.429688 1.667226 +v 1.611982 0.351562 1.611983 +v 1.672749 -0.679688 1.672750 +v 1.639604 -0.320312 1.639604 +v 1.628555 -0.187500 1.628556 +v 1.683798 -0.773438 1.683798 +v 1.766662 0.406250 1.766662 +v 1.788759 0.570312 1.788759 +v 2.578730 0.898438 2.578730 +v 2.794176 0.562500 2.794177 +v 2.777603 0.070312 2.777604 +v 2.440623 -0.382812 2.440624 +v 1.650652 -0.187500 1.937915 +v 1.937914 -0.187500 1.650653 +v 1.567788 -0.437500 2.009730 +v 2.009730 -0.437500 1.567789 +v 1.540167 -0.695312 2.037352 +v 2.037351 -0.695312 1.540167 +v 1.556739 -0.890625 2.076022 +v 2.076021 -0.890625 1.556740 +v 1.589885 -0.945312 2.053925 +v 2.053924 -0.945312 1.589886 +v 1.672749 -0.968750 1.926866 +v 1.926866 -0.968750 1.672750 +v 1.783235 -0.984375 1.783235 +v 1.507021 -0.140625 2.125740 +v 2.125740 -0.140625 1.507022 +v 1.363390 -0.039062 2.258322 +v 2.258322 -0.039062 1.363391 +v 1.291574 0.148438 2.462721 +v 2.462720 0.148438 1.291575 +v 1.164516 0.429688 2.379857 +v 2.379856 0.429688 1.164517 +v 1.247380 0.484375 2.252798 +v 2.252798 0.484375 1.247381 +v 1.357866 0.601562 2.053925 +v 2.053924 0.601562 1.357866 +v 1.446254 0.757812 1.899245 +v 1.899244 0.757812 1.446255 +v 1.545691 0.718750 1.766662 +v 1.766662 0.718750 1.545691 +v 1.617507 0.492188 1.705895 +v 1.705895 0.492188 1.617507 +v 1.529118 0.414062 1.761138 +v 1.761137 0.414062 1.529119 +v 1.562264 0.304688 1.739041 +v 1.739040 0.304688 1.562264 +v 1.523594 0.093750 1.810857 +v 1.810856 0.093750 1.523594 +v 1.429681 0.015625 1.960012 +v 1.960011 0.015625 1.429682 +v 1.368914 0.062500 2.064973 +v 2.064972 0.062500 1.368915 +v 1.291574 0.187500 2.175458 +v 2.175458 0.187500 1.291575 +v 1.280526 0.296875 2.186507 +v 2.186507 0.296875 1.280527 +v 1.297099 0.375000 2.147837 +v 2.147837 0.375000 1.297099 +v 1.379963 0.437500 1.987633 +v 1.987633 0.437500 1.379963 +v 1.479400 0.468750 1.832954 +v 1.832953 0.468750 1.479400 +v 1.672749 -0.765625 1.672750 +v 1.595409 -0.718750 1.750090 +v 1.750089 -0.718750 1.595410 +v 1.606458 -0.835938 1.772187 +v 1.772186 -0.835938 1.606459 +v 1.656176 -0.882812 1.744565 +v 1.744565 -0.882812 1.656177 +v 1.705895 -0.890625 1.705895 +v 1.661701 -0.195312 1.661701 +v 1.667225 -0.140625 1.667226 +v 1.595409 -0.148438 1.739041 +v 1.739040 -0.148438 1.595410 +v 1.573312 -0.226562 1.750090 +v 1.750089 -0.226562 1.573313 +v 1.606458 -0.289062 1.727993 +v 1.727992 -0.289062 1.606459 +v 1.435205 -0.046875 1.998682 +v 1.998681 -0.046875 1.435206 +v 1.313671 0.054688 2.186507 +v 2.186507 0.054688 1.313672 +v 1.252905 0.203125 2.280420 +v 2.280419 0.203125 1.252905 +v 1.203186 0.375000 2.252798 +v 2.252798 0.375000 1.203187 +v 1.192137 0.414062 2.164410 +v 2.164409 0.414062 1.192138 +v 1.319196 0.546875 1.937915 +v 1.937914 0.546875 1.319196 +v 1.379963 0.640625 1.821905 +v 1.821905 0.640625 1.379963 +v 1.446254 0.617188 1.733517 +v 1.733516 0.617188 1.446255 +v 1.523594 0.429688 1.667226 +v 1.667225 0.429688 1.523594 +v 1.529118 -0.101562 1.705895 +v 1.705895 -0.101562 1.529119 +v 1.540167 -0.445312 1.838478 +v 1.838477 -0.445312 1.540167 +v 1.529118 -0.703125 1.882672 +v 1.882671 -0.703125 1.529119 +v 1.534642 -0.820312 1.910293 +v 1.910293 -0.820312 1.534643 +v 1.578837 -0.914062 1.910293 +v 1.910293 -0.914062 1.578837 +v 1.628555 -0.929688 1.860575 +v 1.860574 -0.929688 1.628556 +v 1.739040 -0.945312 1.739041 +v 1.678273 0.046875 1.678274 +v 1.650652 0.210938 1.650653 +v 1.435205 0.476562 1.899245 +v 1.899244 0.476562 1.435206 +v 1.545691 0.140625 1.777711 +v 1.777710 0.140625 1.545691 +v 1.562264 0.210938 1.750090 +v 1.750089 0.210938 1.562264 +v 1.589885 -0.687500 1.755614 +v 1.755613 -0.687500 1.589886 +v 1.606458 -0.445312 1.716944 +v 1.716943 -0.445312 1.606459 +v 1.661701 -0.445312 1.661701 +v 1.667225 -0.328125 1.667226 +v 1.573312 -0.273438 1.705895 +v 1.705895 -0.273438 1.573313 +v 1.534642 -0.226562 1.722468 +v 1.722468 -0.226562 1.534643 +v 1.562264 -0.132812 1.716944 +v 1.716943 -0.132812 1.562264 +v 1.611982 -0.125000 1.667225 +v 1.667225 -0.125000 1.611983 +v 1.606458 -0.203125 1.606459 +v 1.584361 -0.148438 1.650653 +v 1.650652 -0.148438 1.584362 +v 1.551215 -0.156250 1.683798 +v 1.683798 -0.156250 1.551216 +v 1.529118 -0.226562 1.683798 +v 1.683798 -0.226562 1.529119 +v 1.567788 -0.250000 1.678274 +v 1.678273 -0.250000 1.567789 +v 1.623031 -0.289062 1.623031 +v 1.617507 -0.312500 1.982109 +v 1.982108 -0.312500 1.617507 +v 1.573312 -0.242188 1.805332 +v 1.805332 -0.242188 1.573313 +v 1.562264 -0.312500 1.816381 +v 1.816380 -0.312500 1.562264 +v 1.634079 -0.250000 1.965536 +v 1.965536 -0.250000 1.634080 +v 1.705895 -0.875000 1.705895 +v 1.672749 -0.867188 1.739041 +v 1.739040 -0.867188 1.672750 +v 1.623031 -0.820312 1.755614 +v 1.755613 -0.820312 1.623031 +v 1.611982 -0.742188 1.744565 +v 1.744565 -0.742188 1.611983 +v 1.727992 -0.781250 1.727993 +v 1.656176 -0.750000 1.788759 +v 1.788759 -0.750000 1.656177 +v 1.672749 -0.812500 1.805332 +v 1.805332 -0.812500 1.672750 +v 1.711419 -0.851562 1.777711 +v 1.777710 -0.851562 1.711420 +v 1.744565 -0.859375 1.744565 +v 1.518070 0.218750 1.761138 +v 1.761137 0.218750 1.518070 +v 1.512545 0.156250 1.777711 +v 1.777710 0.156250 1.512546 +v 1.418633 0.429688 1.893721 +v 1.893720 0.429688 1.418633 +v 1.451778 0.421875 1.838478 +v 1.838477 0.421875 1.451779 +v 1.346817 0.398438 1.943439 +v 1.943439 0.398438 1.346818 +v 1.302623 0.351562 2.098119 +v 2.098118 0.351562 1.302624 +v 1.291574 0.289062 2.120216 +v 2.120215 0.289062 1.291575 +v 1.302623 0.195312 2.120216 +v 2.120215 0.195312 1.302624 +v 1.346817 0.101562 2.020779 +v 2.020778 0.101562 1.346818 +v 1.402060 0.062500 1.932391 +v 1.932390 0.062500 1.402061 +v 1.479400 0.109375 1.799808 +v 1.799807 0.109375 1.479400 +v 1.512545 0.296875 1.766662 +v 1.766662 0.296875 1.512546 +v 1.490448 0.375000 1.788759 +v 1.788759 0.375000 1.490449 +v 1.490448 0.359375 1.821905 +v 1.821905 0.359375 1.490449 +v 1.518070 0.296875 1.794284 +v 1.794283 0.296875 1.518070 +v 1.484924 0.125000 1.827429 +v 1.827429 0.125000 1.484925 +v 1.413108 0.085938 1.943439 +v 1.943439 0.085938 1.413109 +v 1.368914 0.117188 2.020779 +v 2.020778 0.117188 1.368915 +v 1.330244 0.210938 2.103643 +v 2.103642 0.210938 1.330245 +v 1.324720 0.281250 2.109167 +v 2.109167 0.281250 1.324721 +v 1.335769 0.335938 2.087070 +v 2.087070 0.335938 1.335769 +v 1.368914 0.390625 1.954488 +v 1.954487 0.390625 1.368915 +v 1.451778 0.398438 1.849526 +v 1.849526 0.398438 1.451779 +v 1.424157 0.406250 1.899245 +v 1.899244 0.406250 1.424158 +v 1.518070 0.171875 1.805332 +v 1.805332 0.171875 1.518070 +v 1.523594 0.226562 1.799808 +v 1.799807 0.226562 1.523594 +v 1.683798 0.460938 1.838478 +v 1.838477 0.460938 1.683798 +v 1.617507 0.664062 1.893721 +v 1.893720 0.664062 1.617507 +v 1.534642 0.687500 2.009730 +v 2.009730 0.687500 1.534643 +v 1.457303 0.554688 2.142313 +v 2.142312 0.554688 1.457303 +v 1.363390 0.453125 2.324614 +v 2.324613 0.453125 1.363391 +v 1.302623 0.406250 2.429575 +v 2.429574 0.406250 1.302624 +v 1.379963 0.164062 2.473769 +v 2.473769 0.164062 1.379964 +v 1.473875 0.000000 2.324614 +v 2.324613 0.000000 1.473876 +v 1.551215 -0.093750 2.169934 +v 2.169934 -0.093750 1.551216 +v 1.987633 0.898438 1.987633 +v 2.247273 0.984375 2.247274 +v 2.667118 -0.195312 2.667119 +v 2.059448 -0.460938 2.059449 +v 1.866099 -0.976562 1.866099 +v 1.948963 -0.804688 1.948963 +v 1.965536 -0.570312 1.965536 +v 1.993157 -0.484375 1.993158 +v 1.551215 0.234375 2.755507 +v 2.755507 0.234375 1.551216 +v 1.617506 0.320312 2.832847 +v 2.832846 0.320312 1.617507 +v 1.954487 0.265625 3.048294 +v 3.048293 0.265625 1.954488 +v 2.363283 0.437500 3.015148 +v 3.015147 0.437500 2.363284 +v 1.623031 -0.046875 2.661594 +v 2.661594 -0.046875 1.623031 +v 1.888196 -0.125000 2.727886 +v 2.727885 -0.125000 1.888196 +v 2.042875 -0.007812 2.948857 +v 2.948856 -0.007812 2.042876 +v 2.424050 0.054688 2.899138 +v 2.899137 0.054688 2.424051 +v 1.739040 -0.351562 2.070497 +v 2.070497 -0.351562 1.739041 +v 1.882671 -0.414062 2.136789 +v 2.136788 -0.414062 1.882672 +v 1.716943 -0.710938 2.125740 +v 2.125740 -0.710938 1.716944 +v 1.739040 -0.500000 2.092594 +v 2.092594 -0.500000 1.739041 +v 1.678273 -0.914062 2.142313 +v 2.142312 -0.914062 1.678274 +v 1.832953 -0.757812 2.031827 +v 2.031827 -0.757812 1.832954 +v 1.849526 -0.539062 2.026303 +v 2.026303 -0.539062 1.849527 +v 1.766662 -0.945312 1.998682 +v 1.998681 -0.945312 1.766662 +v 1.733516 -0.281250 2.042876 +v 2.042875 -0.281250 1.733517 +v 1.711419 -0.226562 2.009730 +v 2.009730 -0.226562 1.711420 +v 1.694846 -0.171875 1.982109 +v 1.982108 -0.171875 1.694847 +v 1.926866 -0.390625 2.225177 +v 2.225176 -0.390625 1.926866 +v 2.169934 -0.312500 2.589779 +v 2.589778 -0.312500 2.169934 +v 2.330137 -0.148438 2.816274 +v 2.816273 -0.148438 2.330138 +v 2.142312 0.867188 2.783128 +v 2.783128 0.867188 2.142313 +v 1.921341 0.929688 2.562158 +v 2.562157 0.929688 1.921342 +v 1.705895 0.851562 2.346711 +v 2.346710 0.851562 1.705895 +v 1.562264 0.523438 2.214128 +v 2.214128 0.523438 1.562264 +v 1.440730 0.406250 2.468245 +v 2.468244 0.406250 1.440730 +v 1.545691 0.453125 2.440624 +v 2.440623 0.453125 1.545692 +v 1.700370 0.703125 2.606352 +v 2.606351 0.703125 1.700371 +v 1.540167 0.562500 2.667119 +v 2.667118 0.562500 1.540167 +v 1.711419 0.617188 2.838371 +v 2.838370 0.617188 1.711420 +v 1.877147 0.750000 2.783128 +v 2.783128 0.750000 1.877148 +v 2.053924 0.679688 2.959905 +v 2.959904 0.679688 2.053925 +v 1.882671 0.539062 3.009624 +v 3.009623 0.539062 1.882672 +v 2.169934 0.328125 3.042769 +v 3.042768 0.328125 2.169934 +v 2.236225 0.023438 2.921235 +v 2.921235 0.023438 2.236226 +v 1.755613 0.328125 2.915711 +v 2.915710 0.328125 1.755614 +v 1.799807 -0.171875 2.374332 +v 2.374332 -0.171875 1.799808 +v 2.037351 -0.195312 2.645022 +v 2.645021 -0.195312 2.037352 +v 1.727992 0.406250 2.987526 +v 2.987526 0.406250 1.727993 +v 1.733516 -0.140625 2.827322 +v 2.827322 -0.140625 1.733517 +v 1.689322 -0.101562 3.158779 +v 3.158778 -0.101562 1.689323 +v 1.589885 0.054688 3.401847 +v 3.401846 0.054688 1.589886 +v 1.534642 0.320312 3.446041 +v 3.446040 0.320312 1.534643 +v 1.617506 0.507812 3.363177 +v 3.363176 0.507812 1.617507 +v 1.689322 0.476562 3.136682 +v 3.136681 0.476562 1.689323 +v 1.678273 0.414062 3.114585 +v 3.114584 0.414062 1.678274 +v 1.628555 0.437500 3.307934 +v 3.307934 0.437500 1.628556 +v 1.584361 0.289062 3.374225 +v 3.374225 0.289062 1.584362 +v 1.623031 0.078125 3.335556 +v 3.335555 0.078125 1.623031 +v 1.678273 -0.039062 3.136682 +v 3.136681 -0.039062 1.678274 +v 1.700370 -0.070312 2.871517 +v 2.871516 -0.070312 1.700371 +v 1.694846 0.359375 2.998575 +v 2.998574 0.359375 1.694847 +v 1.727992 0.304688 3.064866 +v 3.064866 0.304688 1.727993 +v 1.716943 -0.023438 2.965429 +v 2.965429 -0.023438 1.716944 +v 1.716943 0.000000 3.186400 +v 3.186400 0.000000 1.716944 +v 1.667225 0.093750 3.346604 +v 3.346603 0.093750 1.667226 +v 1.634079 0.250000 3.379750 +v 3.379749 0.250000 1.634080 +v 1.672749 0.359375 3.330031 +v 3.330031 0.359375 1.672750 +v 1.722467 0.343750 3.169827 +v 3.169827 0.343750 1.722468 +v 1.744565 0.289062 2.937808 +v 2.937807 0.289062 1.744565 +v 1.794283 0.171875 2.976478 +v 2.976477 0.171875 1.794284 +v 1.849526 0.093750 2.921235 +v 2.921235 0.093750 1.849527 +v 1.805332 0.085938 2.965429 +v 2.965429 0.085938 1.805332 +v 1.788759 0.015625 2.982002 +v 2.982002 0.015625 1.788760 +v 1.810856 -0.015625 2.959905 +v 2.959904 -0.015625 1.810857 +v 1.727992 0.000000 2.755507 +v 2.755507 0.000000 1.727993 +v 1.805332 -0.023438 2.821798 +v 2.821798 -0.023438 1.805332 +v 1.816380 0.039062 2.832847 +v 2.832846 0.039062 1.816381 +v 1.777710 0.203125 2.904662 +v 2.904662 0.203125 1.777711 +v 1.750089 0.242188 3.009624 +v 3.009623 0.242188 1.750090 +v 1.788759 0.234375 3.048294 +v 3.048293 0.234375 1.788760 +v 1.844002 -0.015625 2.993051 +v 2.993050 -0.015625 1.844002 +v 1.816380 0.015625 3.020672 +v 3.020671 0.015625 1.816381 +v 1.832953 0.078125 3.004099 +v 3.004099 0.078125 1.832954 +v 1.877147 0.093750 2.959905 +v 2.959904 0.093750 1.877148 +v 1.821904 0.171875 3.015148 +v 3.015147 0.171875 1.821905 +v 1.750089 0.328125 3.219546 +v 3.219545 0.328125 1.750090 +v 1.694846 0.343750 3.374225 +v 3.374225 0.343750 1.694847 +v 1.650652 0.242188 3.429468 +v 3.429468 0.242188 1.650653 +v 1.678273 0.085938 3.390798 +v 3.390798 0.085938 1.678274 +v 1.750089 0.000000 3.230594 +v 3.230594 0.000000 1.750090 +v 1.755613 -0.015625 3.004099 +v 3.004099 -0.015625 1.755614 +v 1.761137 0.289062 3.109061 +v 3.109060 0.289062 1.761138 +v 1.794283 0.109375 3.053818 +v 3.053817 0.109375 1.794284 +v 1.766662 0.062500 3.092488 +v 3.092487 0.062500 1.766663 +v 1.744565 0.125000 3.158779 +v 3.158778 0.125000 1.744565 +v 1.761137 0.171875 3.120109 +v 3.120108 0.171875 1.761138 +v 1.739040 0.234375 3.175352 +v 3.175351 0.234375 1.739041 +v 1.716943 0.187500 3.208497 +v 3.208497 0.187500 1.716944 +v 1.683798 0.210938 3.252692 +v 3.252691 0.210938 1.683799 +v 1.700370 0.273438 3.236119 +v 3.236118 0.273438 1.700371 +v 1.810856 0.437500 3.258216 +v 3.258215 0.437500 1.810857 +v 1.694846 0.468750 3.462614 +v 3.462613 0.468750 1.694847 +v 1.578836 0.296875 3.512332 +v 3.512332 0.296875 1.578837 +v 1.639603 0.054688 3.495759 +v 3.495759 0.054688 1.639604 +v 1.805331 -0.085938 3.274789 +v 3.274788 -0.085938 1.805332 +v 1.866099 -0.125000 2.982002 +v 2.982002 -0.125000 1.866099 +v 1.855050 0.382812 3.070391 +v 3.070390 0.382812 1.855051 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn -0.9789 -0.2008 -0.0384 +vn -0.0384 -0.2008 -0.9789 +vn -0.9181 -0.3036 0.2549 +vn 0.2549 -0.3036 -0.9181 +vn -0.6085 -0.7933 -0.0208 +vn -0.0208 -0.7933 -0.6085 +vn -0.8075 -0.5089 -0.2984 +vn -0.2984 -0.5089 -0.8075 +vn -0.5372 -0.5394 -0.6484 +vn -0.6484 -0.5394 -0.5372 +vn -0.1406 -0.8413 -0.5220 +vn -0.5220 -0.8413 -0.1406 +vn 0.1617 -0.3352 -0.9282 +vn -0.9282 -0.3352 0.1617 +vn -0.2777 -0.1940 -0.9409 +vn -0.9409 -0.1940 -0.2777 +vn -0.2697 0.1907 -0.9439 +vn -0.9439 0.1907 -0.2697 +vn 0.1521 0.3264 -0.9329 +vn -0.9329 0.3264 0.1521 +vn -0.1883 0.8173 -0.5445 +vn -0.5445 0.8173 -0.1883 +vn -0.5102 0.5696 -0.6444 +vn -0.6444 0.5696 -0.5102 +vn -0.7965 0.5370 -0.2778 +vn -0.2778 0.5370 -0.7965 +vn -0.6391 0.7672 -0.0536 +vn -0.0536 0.7672 -0.6391 +vn -0.9227 0.2952 0.2479 +vn 0.2479 0.2952 -0.9227 +vn -0.9799 0.1971 -0.0305 +vn -0.0305 0.1971 -0.9799 +vn -0.2294 0.3244 0.9177 +vn 0.9177 0.3244 -0.2294 +vn 0.2321 0.8206 0.5222 +vn 0.5222 0.8206 0.2321 +vn 0.6244 0.7806 0.0271 +vn 0.0271 0.7806 0.6244 +vn 0.9120 0.3225 -0.2533 +vn -0.2533 0.3225 0.9120 +vn 0.9042 -0.3487 -0.2466 +vn -0.2466 -0.3487 0.9042 +vn 0.6244 -0.7806 0.0271 +vn 0.0271 -0.7806 0.6244 +vn 0.2321 -0.8206 0.5222 +vn 0.5222 -0.8206 0.2321 +vn -0.2206 -0.3510 0.9100 +vn 0.9100 -0.3510 -0.2206 +vn -0.9294 -0.0623 -0.3637 +vn -0.3637 -0.0623 -0.9294 +vn -0.8785 -0.1754 -0.4444 +vn -0.4444 -0.1754 -0.8785 +vn -0.7587 -0.1835 -0.6251 +vn -0.6251 -0.1835 -0.7587 +vn -0.6614 -0.0283 -0.7495 +vn -0.7495 -0.0283 -0.6614 +vn -0.6614 0.0260 -0.7496 +vn -0.7496 0.0260 -0.6614 +vn -0.7633 0.1729 -0.6225 +vn -0.6225 0.1729 -0.7633 +vn -0.8781 0.1656 -0.4488 +vn -0.4488 0.1656 -0.8781 +vn -0.9297 0.0572 -0.3638 +vn -0.3638 0.0572 -0.9297 +vn -0.4352 -0.8616 -0.2611 +vn -0.2611 -0.8616 -0.4352 +vn -0.4745 -0.8647 -0.1648 +vn -0.1648 -0.8647 -0.4745 +vn -0.8888 -0.4550 -0.0542 +vn -0.0542 -0.4550 -0.8888 +vn -0.9944 -0.0506 0.0930 +vn 0.0930 -0.0506 -0.9944 +vn -0.9895 0.0900 0.1131 +vn 0.1131 0.0900 -0.9895 +vn -0.5643 -0.8188 -0.1059 +vn -0.1059 -0.8188 -0.5643 +vn -0.7265 -0.6629 -0.1810 +vn -0.1810 -0.6629 -0.7265 +vn -0.9051 -0.4193 0.0699 +vn 0.0699 -0.4193 -0.9051 +vn -0.9316 -0.3634 -0.0000 +vn 0.0000 -0.3634 -0.9316 +vn -0.9174 0.3707 -0.1445 +vn -0.1445 0.3707 -0.9174 +vn -0.7616 0.6464 -0.0454 +vn -0.0454 0.6464 -0.7616 +vn -0.8561 0.5167 0.0055 +vn 0.0055 0.5167 -0.8561 +vn -0.4985 0.6610 -0.5609 +vn -0.5609 0.6610 -0.4985 +vn 0.0803 0.3187 -0.9444 +vn -0.9444 0.3187 0.0803 +vn 0.0000 0.5554 -0.8316 +vn -0.8316 0.5554 0.0000 +vn -0.9081 -0.3909 -0.1500 +vn -0.1500 -0.3909 -0.9081 +vn -0.7608 -0.4690 -0.4487 +vn -0.4487 -0.4690 -0.7608 +vn -0.5399 -0.5321 -0.6522 +vn -0.6522 -0.5321 -0.5399 +vn -0.4713 -0.6575 -0.5879 +vn -0.5879 -0.6575 -0.4713 +vn -0.6140 -0.5667 -0.5494 +vn -0.5494 -0.5667 -0.6140 +vn -0.8591 -0.2130 -0.4653 +vn -0.4654 -0.2130 -0.8591 +vn -0.9105 -0.1824 -0.3712 +vn -0.3712 -0.1824 -0.9105 +vn -0.8716 -0.2878 -0.3968 +vn -0.3968 -0.2878 -0.8716 +vn -0.9198 0.0603 -0.3877 +vn -0.3877 0.0603 -0.9198 +vn -0.5789 0.2680 -0.7701 +vn -0.7701 0.2680 -0.5789 +vn -0.8530 -0.4321 -0.2928 +vn -0.2928 -0.4321 -0.8530 +vn -0.8037 -0.2474 -0.5412 +vn -0.5412 -0.2474 -0.8037 +vn -0.7005 -0.1948 -0.6865 +vn -0.6865 -0.1948 -0.7005 +vn -0.5557 -0.6966 -0.4538 +vn -0.4538 -0.6966 -0.5557 +vn -0.6964 -0.5723 -0.4329 +vn -0.4329 -0.5723 -0.6964 +vn -0.8663 -0.2708 -0.4198 +vn -0.4198 -0.2708 -0.8663 +vn -0.8894 -0.0265 -0.4563 +vn -0.4563 -0.0265 -0.8894 +vn -0.8928 -0.1306 -0.4310 +vn -0.4310 -0.1306 -0.8928 +vn -0.6962 0.0574 -0.7155 +vn -0.7155 0.0574 -0.6962 +vn -0.7037 -0.0656 -0.7074 +vn -0.7074 -0.0656 -0.7037 +vn -0.7071 0.0000 -0.7071 +vn -0.5467 -0.5744 0.6092 +vn 0.6092 -0.5744 -0.5467 +vn -0.5197 0.2297 0.8229 +vn 0.8229 0.2297 -0.5197 +vn 0.2333 0.9073 0.3499 +vn 0.3499 0.9073 0.2333 +vn 0.4094 0.3555 -0.8403 +vn -0.8403 0.3555 0.4094 +vn -0.4543 -0.8797 0.1406 +vn 0.1406 -0.8797 -0.4543 +vn -0.7450 -0.5747 -0.3386 +vn -0.3386 -0.5747 -0.7450 +vn 0.1388 0.6019 -0.7864 +vn -0.7864 0.6019 0.1388 +vn -0.5022 0.7892 -0.3534 +vn -0.3534 0.7892 -0.5022 +vn -0.9485 0.2916 0.1237 +vn 0.1237 0.2916 -0.9485 +vn -0.6875 -0.7130 -0.1375 +vn -0.1375 -0.7130 -0.6875 +vn -0.7199 0.2314 -0.6544 +vn -0.6544 0.2314 -0.7199 +vn -0.6708 -0.4018 -0.6234 +vn -0.6234 -0.4018 -0.6708 +vn -0.3081 -0.1610 -0.9376 +vn -0.9376 -0.1610 -0.3081 +vn -0.4629 -0.4364 -0.7715 +vn -0.7715 -0.4364 -0.4629 +vn -0.9374 -0.1290 -0.3235 +vn -0.3235 -0.1290 -0.9374 +vn -0.8861 0.0501 -0.4608 +vn -0.4608 0.0501 -0.8861 +vn -0.9276 0.3010 0.2211 +vn 0.2211 0.3010 -0.9276 +vn -0.9084 0.2574 0.3295 +vn 0.3295 0.2574 -0.9084 +vn -0.8800 0.1601 0.4473 +vn 0.4473 0.1601 -0.8800 +vn -0.6692 -0.6539 -0.3529 +vn -0.3529 -0.6539 -0.6692 +vn -0.5757 -0.1997 -0.7929 +vn -0.7929 -0.1997 -0.5757 +vn -0.4831 -0.1025 -0.8696 +vn -0.8696 -0.1025 -0.4831 +vn -0.6211 0.1952 -0.7591 +vn -0.7591 0.1952 -0.6211 +vn -0.0799 0.9494 -0.3037 +vn -0.3037 0.9494 -0.0799 +vn 0.3964 0.7082 -0.5842 +vn -0.5842 0.7082 0.3964 +vn 0.7071 -0.0000 -0.7071 +vn -0.7071 -0.0000 0.7071 +vn -0.2993 -0.9450 0.1322 +vn 0.1322 -0.9450 -0.2993 +vn -0.6957 -0.2981 -0.6535 +vn -0.6535 -0.2981 -0.6957 +vn -0.7517 -0.3479 -0.5603 +vn -0.5603 -0.3479 -0.7517 +vn -0.2173 -0.2755 -0.9364 +vn -0.9364 -0.2755 -0.2173 +vn -0.3804 -0.0419 -0.9239 +vn -0.9239 -0.0419 -0.3804 +vn -0.5438 0.0374 -0.8384 +vn -0.8384 0.0374 -0.5438 +vn -0.0674 -0.4767 -0.8765 +vn -0.8765 -0.4767 -0.0674 +vn -0.3582 -0.7531 -0.5519 +vn -0.5519 -0.7531 -0.3582 +vn -0.7709 -0.6071 -0.1927 +vn -0.1927 -0.6071 -0.7709 +vn -0.9059 -0.4130 -0.0941 +vn -0.0940 -0.4130 -0.9059 +vn -0.9792 -0.0968 -0.1780 +vn -0.1780 -0.0968 -0.9792 +vn -0.9781 0.1180 -0.1715 +vn -0.1715 0.1180 -0.9781 +vn -0.8161 0.5621 -0.1341 +vn -0.1341 0.5621 -0.8161 +vn -0.7125 0.6114 -0.3443 +vn -0.3443 0.6114 -0.7125 +vn -0.7652 0.3607 -0.5333 +vn -0.5333 0.3607 -0.7652 +vn -0.6720 0.2495 -0.6972 +vn -0.6972 0.2495 -0.6720 +vn -0.8312 -0.4166 -0.3682 +vn -0.3682 -0.4166 -0.8312 +vn -0.8518 -0.2610 -0.4543 +vn -0.4543 -0.2610 -0.8518 +vn -0.3258 -0.6514 -0.6853 +vn -0.6853 -0.6514 -0.3258 +vn -0.3587 -0.8455 -0.3955 +vn -0.3955 -0.8455 -0.3587 +vn -0.3870 -0.2606 -0.8845 +vn -0.8845 -0.2606 -0.3870 +vn -0.4126 -0.0110 -0.9108 +vn -0.9108 -0.0110 -0.4126 +vn -0.5275 0.4608 -0.7137 +vn -0.7137 0.4608 -0.5275 +vn -0.5323 0.6159 -0.5807 +vn -0.5807 0.6160 -0.5323 +vn -0.7693 0.5836 -0.2598 +vn -0.2598 0.5836 -0.7693 +vn -0.8376 0.5300 -0.1323 +vn -0.1323 0.5300 -0.8376 +vn -0.9428 -0.3333 -0.0000 +vn 0.0000 -0.3333 -0.9428 +vn -0.9823 -0.0731 0.1723 +vn 0.1723 -0.0731 -0.9823 +vn -0.9856 0.1161 0.1232 +vn 0.1232 0.1161 -0.9856 +vn 0.5493 0.8111 -0.2012 +vn -0.2012 0.8111 0.5493 +vn 0.8655 0.3695 -0.3381 +vn -0.3381 0.3695 0.8655 +vn 0.4792 0.8675 0.1333 +vn 0.1333 0.8675 0.4792 +vn -0.2046 0.7465 0.6331 +vn 0.6331 0.7465 -0.2046 +vn -0.0401 0.8758 0.4811 +vn 0.4811 0.8758 -0.0401 +vn 0.0041 0.9151 0.4031 +vn 0.4031 0.9151 0.0041 +vn -0.2525 0.1340 0.9583 +vn 0.9583 0.1340 -0.2525 +vn -0.0683 -0.7233 0.6872 +vn 0.6872 -0.7233 -0.0683 +vn 0.0367 -0.8131 0.5810 +vn 0.5810 -0.8131 0.0367 +vn 0.3864 -0.5806 0.7167 +vn 0.7167 -0.5806 0.3864 +vn 0.5112 -0.0583 0.8575 +vn 0.8575 -0.0583 0.5112 +vn 0.5426 -0.4535 0.7071 +vn 0.7071 -0.4535 0.5426 +vn 0.0167 -0.9836 0.1796 +vn 0.1796 -0.9836 0.0167 +vn 0.0761 -0.9669 0.2435 +vn 0.2435 -0.9669 0.0761 +vn -0.4801 -0.0085 0.8772 +vn 0.8772 -0.0085 -0.4801 +vn -0.4297 0.1629 0.8882 +vn 0.8882 0.1629 -0.4297 +vn 0.5826 0.0207 0.8125 +vn 0.8125 0.0207 0.5826 +vn 0.7033 -0.2177 0.6768 +vn 0.6768 -0.2177 0.7033 +vn -0.1169 -0.2926 0.9491 +vn 0.9491 -0.2926 -0.1169 +vn -0.3902 0.1379 0.9104 +vn 0.9104 0.1379 -0.3902 +vn -0.5200 0.3127 0.7949 +vn 0.7949 0.3127 -0.5200 +vn -0.4802 0.3376 0.8095 +vn 0.8095 0.3376 -0.4802 +vn -0.6223 0.3338 0.7081 +vn 0.7081 0.3338 -0.6223 +vn 0.1868 -0.8805 0.4358 +vn 0.4358 -0.8805 0.1868 +vn 0.3029 -0.4733 0.8272 +vn 0.8272 -0.4733 0.3029 +vn 0.1098 -0.8284 0.5492 +vn 0.5492 -0.8284 0.1098 +vn -0.1065 -0.9515 0.2885 +vn 0.2885 -0.9515 -0.1065 +vn -0.0942 -0.9321 0.3497 +vn 0.3497 -0.9321 -0.0942 +vn -0.6472 -0.2083 0.7333 +vn 0.7333 -0.2083 -0.6472 +vn -0.7576 -0.5066 0.4115 +vn 0.4115 -0.5066 -0.7576 +vn 0.4148 -0.1158 0.9025 +vn 0.9025 -0.1158 0.4148 +vn -0.2516 0.9644 -0.0815 +vn -0.0815 0.9644 -0.2516 +vn 0.0407 0.9744 0.2211 +vn 0.2211 0.9744 0.0407 +vn 0.2651 0.5947 0.7590 +vn 0.7590 0.5947 0.2651 +vn -0.1912 0.8981 0.3961 +vn 0.3961 0.8981 -0.1912 +vn -0.6157 0.7036 -0.3548 +vn -0.3548 0.7036 -0.6157 +vn -0.5419 0.7794 0.3145 +vn 0.3145 0.7794 -0.5419 +vn -0.3522 0.6806 0.6425 +vn 0.6425 0.6806 -0.3522 +vn 0.0344 0.2007 0.9790 +vn 0.9790 0.2007 0.0344 +vn 0.1824 0.4342 0.8821 +vn 0.8821 0.4342 0.1824 +vn -0.3297 0.7459 0.5787 +vn 0.5787 0.7459 -0.3297 +vn -0.6160 0.6788 0.3997 +vn 0.3997 0.6788 -0.6160 +vn -0.9074 0.3972 0.1375 +vn 0.1375 0.3972 -0.9074 +vn -0.1307 0.9261 0.3540 +vn 0.3540 0.9261 -0.1307 +vn -0.7168 0.5740 -0.3958 +vn -0.3958 0.5740 -0.7168 +vn 0.8144 0.1046 0.5708 +vn 0.5708 0.1046 0.8144 +vn -0.3138 0.9150 -0.2538 +vn -0.2538 0.9150 -0.3138 +vn -0.5712 0.1847 -0.7997 +vn -0.7997 0.1847 -0.5712 +vn -0.7265 0.1973 0.6582 +vn 0.6582 0.1973 -0.7265 +vn -0.8873 0.0918 0.4519 +vn 0.4519 0.0918 -0.8873 +vn -0.6458 0.1905 0.7393 +vn 0.7393 0.1905 -0.6458 +vn -0.6271 0.0312 0.7783 +vn 0.7783 0.0312 -0.6271 +vn -0.5385 -0.7008 0.4678 +vn 0.4678 -0.7008 -0.5385 +vn -0.3230 -0.9243 0.2033 +vn 0.2033 -0.9243 -0.3230 +vn -0.4791 -0.8644 0.1524 +vn 0.1524 -0.8644 -0.4791 +vn -0.5990 -0.7578 0.2589 +vn 0.2589 -0.7578 -0.5990 +vn -0.6881 -0.6368 0.3478 +vn 0.3478 -0.6368 -0.6881 +vn -0.7898 -0.4499 -0.4169 +vn -0.4169 -0.4499 -0.7898 +vn 0.1489 -0.3181 0.9363 +vn 0.9363 -0.3181 0.1489 +vn 0.2253 -0.2807 0.9330 +vn 0.9330 -0.2807 0.2253 +vn 0.0718 -0.8494 0.5229 +vn 0.5229 -0.8494 0.0718 +vn -0.3115 -0.6356 0.7064 +vn 0.7064 -0.6356 -0.3114 +vn 0.1769 -0.4408 0.8800 +vn 0.8800 -0.4408 0.1769 +vn -0.8529 0.3807 -0.3572 +vn -0.3572 0.3807 -0.8529 +vn -0.9401 0.1715 -0.2945 +vn -0.2945 0.1715 -0.9401 +vn -0.8617 0.1055 -0.4964 +vn -0.4964 0.1055 -0.8617 +vn -0.8567 -0.0802 -0.5095 +vn -0.5095 -0.0802 -0.8567 +vn -0.9531 -0.0599 -0.2965 +vn -0.2965 -0.0599 -0.9531 +vn -0.9500 -0.3045 -0.0697 +vn -0.0697 -0.3045 -0.9500 +vn -0.7444 0.6590 -0.1080 +vn -0.1080 0.6590 -0.7444 +vn -0.1568 0.8309 -0.5339 +vn -0.5339 0.8309 -0.1568 +vn 0.2243 0.2291 -0.9472 +vn -0.9472 0.2291 0.2243 +vn -0.1751 -0.3566 -0.9177 +vn -0.9177 -0.3566 -0.1751 +vn -0.8075 -0.5665 -0.1645 +vn -0.1645 -0.5665 -0.8075 +vn -0.8873 -0.4497 0.1021 +vn 0.1021 -0.4497 -0.8873 +vn -0.4309 -0.6827 0.5902 +vn 0.5902 -0.6827 -0.4309 +vn -0.5282 0.2860 -0.7995 +vn -0.7995 0.2860 -0.5282 +vn -0.4950 -0.3734 0.7846 +vn 0.7846 -0.3734 -0.4950 +vn -0.7678 0.1551 -0.6216 +vn -0.6216 0.1551 -0.7678 +vn -0.3091 0.9318 -0.1902 +vn -0.1902 0.9318 -0.3091 +vn -0.9928 -0.0883 -0.0812 +vn -0.0812 -0.0883 -0.9928 +vn -0.8477 0.4740 -0.2382 +vn -0.2382 0.4740 -0.8477 +vn -0.8128 -0.4847 0.3232 +vn 0.3232 -0.4847 -0.8128 +vn -0.9068 -0.4128 -0.0850 +vn -0.0850 -0.4128 -0.9068 +vn -0.9003 -0.4305 -0.0645 +vn -0.0645 -0.4305 -0.9003 +vn -0.6524 -0.1804 0.7361 +vn 0.7361 -0.1804 -0.6524 +vn -0.5607 -0.3965 0.7269 +vn 0.7269 -0.3965 -0.5607 +vn -0.6538 -0.0181 0.7564 +vn 0.7564 -0.0181 -0.6538 +vn -0.6532 -0.6543 0.3810 +vn 0.3810 -0.6543 -0.6532 +vn -0.6322 -0.6079 0.4804 +vn 0.4804 -0.6079 -0.6322 +vn -0.5793 -0.7022 0.4138 +vn 0.4138 -0.7022 -0.5793 +vn -0.0940 0.9816 0.1663 +vn 0.1663 0.9816 -0.0940 +vn -0.7520 0.3301 0.5705 +vn 0.5705 0.3301 -0.7520 +vn -0.5081 -0.7463 0.4300 +vn 0.4300 -0.7463 -0.5081 +vn -0.0482 0.9970 -0.0603 +vn -0.0603 0.9970 -0.0482 +vn -0.6782 -0.7061 0.2039 +vn 0.2039 -0.7061 -0.6782 +vn -0.4469 -0.8925 -0.0604 +vn -0.0604 -0.8925 -0.4469 +vn 0.7444 -0.5080 -0.4333 +vn -0.4333 -0.5080 0.7444 +vn 0.9419 0.2377 -0.2375 +vn -0.2375 0.2377 0.9419 +vn 0.5794 0.7847 -0.2203 +vn -0.2203 0.7847 0.5794 +vn -0.0079 0.9962 -0.0871 +vn -0.0871 0.9962 -0.0079 +vn -0.8017 0.0222 -0.5973 +vn -0.5973 0.0222 -0.8017 +vn -0.8981 0.0645 -0.4350 +vn -0.4350 0.0645 -0.8981 +vn -0.8925 0.0232 -0.4504 +vn -0.4504 0.0232 -0.8925 +vn -0.8173 0.0274 -0.5755 +vn -0.5755 0.0274 -0.8173 +vn -0.8779 0.2849 -0.3848 +vn -0.3848 0.2849 -0.8779 +vn -0.9307 -0.0343 -0.3642 +vn -0.3642 -0.0343 -0.9307 +vn -0.8639 -0.0603 -0.5001 +vn -0.5001 -0.0603 -0.8639 +vn -0.7507 -0.0106 -0.6606 +vn -0.6606 -0.0106 -0.7507 +vn -0.1742 0.7039 -0.6886 +vn -0.6886 0.7039 -0.1742 +vn -0.9940 0.0355 -0.1032 +vn -0.1032 0.0355 -0.9940 +vn -0.9326 -0.2002 -0.3002 +vn -0.3002 -0.2002 -0.9326 +vn -0.9489 -0.2141 -0.2317 +vn -0.2317 -0.2141 -0.9489 +vn -0.9440 0.2619 -0.2004 +vn -0.2004 0.2619 -0.9440 +vn -0.7467 0.5802 -0.3253 +vn -0.3253 0.5802 -0.7467 +vn -0.0089 -0.9924 0.1227 +vn 0.1227 -0.9924 -0.0089 +vn -0.3596 -0.8657 0.3483 +vn 0.3483 -0.8657 -0.3596 +vn -0.8509 -0.2497 0.4623 +vn 0.4623 -0.2497 -0.8509 +vn -0.5667 0.5424 0.6202 +vn 0.6202 0.5424 -0.5667 +vn 0.3496 0.9367 0.0165 +vn 0.0165 0.9367 0.3496 +vn 0.4090 0.8838 -0.2272 +vn -0.2272 0.8838 0.4090 +vn 0.9765 -0.0098 0.2152 +vn 0.2152 -0.0098 0.9765 +vn 0.8290 -0.0241 0.5588 +vn 0.5588 -0.0241 0.8290 +vn 0.3603 0.0266 0.9325 +vn 0.9325 0.0266 0.3603 +vn 0.5390 0.6231 -0.5668 +vn -0.5668 0.6231 0.5389 +vn 0.1919 -0.2063 0.9595 +vn 0.9595 -0.2063 0.1919 +vn 0.3832 -0.9231 0.0333 +vn 0.0333 -0.9231 0.3832 +usemtl None +s off +f 2582/2781/2496 2536/2782/2496 2538/2783/2496 2580/2784/2496 +f 2539/2785/2497 2537/2786/2497 2583/2787/2497 2581/2788/2497 +f 2580/2784/2498 2538/2783/2498 2540/2789/2498 2578/2790/2498 +f 2541/2791/2499 2539/2785/2499 2581/2788/2499 2579/2792/2499 +f 2538/2783/2500 2544/2793/2500 2542/2794/2500 2540/2789/2500 +f 2543/2795/2501 2545/2796/2501 2539/2785/2501 2541/2791/2501 +f 2536/2782/2502 2546/2797/2502 2544/2793/2502 2538/2783/2502 +f 2545/2796/2503 2547/2798/2503 2537/2786/2503 2539/2785/2503 +f 2546/2797/2504 2548/2799/2504 2550/2800/2504 2544/2793/2504 +f 2551/2801/2505 2549/2802/2505 2547/2798/2505 2545/2796/2505 +f 2544/2793/2506 2550/2800/2506 2552/2803/2506 2542/2794/2506 +f 2553/2804/2507 2551/2801/2507 2545/2796/2507 2543/2795/2507 +f 2550/2800/2508 2556/2805/2508 2554/2806/2508 2552/2803/2508 +f 2555/2807/2509 2557/2808/2509 2551/2801/2509 2553/2804/2509 +f 2548/2799/2510 2558/2809/2510 2556/2805/2510 2550/2800/2510 +f 2557/2808/2511 2559/2810/2511 2549/2802/2511 2551/2801/2511 +f 2558/2809/2512 2560/2811/2512 2562/2812/2512 2556/2805/2512 +f 2563/2813/2513 2561/2814/2513 2559/2810/2513 2557/2808/2513 +f 2556/2805/2514 2562/2812/2514 2564/2815/2514 2554/2806/2514 +f 2565/2816/2515 2563/2813/2515 2557/2808/2515 2555/2807/2515 +f 2562/2812/2516 2568/2817/2516 2566/2818/2516 2564/2815/2516 +f 2567/2819/2517 2569/2820/2517 2563/2813/2517 2565/2816/2517 +f 2560/2811/2518 2570/2821/2518 2568/2817/2518 2562/2812/2518 +f 2569/2820/2519 2571/2822/2519 2561/2814/2519 2563/2813/2519 +f 2570/2821/2520 2572/2823/2520 2574/2824/2520 2568/2817/2520 +f 2575/2825/2521 2573/2826/2521 2571/2822/2521 2569/2820/2521 +f 2568/2817/2522 2574/2824/2522 2576/2827/2522 2566/2818/2522 +f 2577/2828/2523 2575/2825/2523 2569/2820/2523 2567/2819/2523 +f 2574/2824/2524 2580/2784/2524 2578/2790/2524 2576/2827/2524 +f 2579/2792/2525 2581/2788/2525 2575/2825/2525 2577/2828/2525 +f 2572/2823/2526 2582/2781/2526 2580/2784/2526 2574/2824/2526 +f 2581/2788/2527 2583/2787/2527 2573/2826/2527 2575/2825/2527 +f 2582/2781/2528 2572/2823/2528 2586/2829/2528 2584/2830/2528 +f 2587/2831/2529 2573/2826/2529 2583/2787/2529 2585/2832/2529 +f 2572/2823/2530 2570/2821/2530 2588/2833/2530 2586/2829/2530 +f 2589/2834/2531 2571/2822/2531 2573/2826/2531 2587/2831/2531 +f 2570/2821/2532 2560/2811/2532 2590/2835/2532 2588/2833/2532 +f 2591/2836/2533 2561/2814/2533 2571/2822/2533 2589/2834/2533 +f 2560/2811/2534 2558/2809/2534 2592/2837/2534 2590/2835/2534 +f 2593/2838/2535 2559/2810/2535 2561/2814/2535 2591/2836/2535 +f 2558/2809/2536 2548/2799/2536 2594/2839/2536 2592/2837/2536 +f 2595/2840/2537 2549/2802/2537 2559/2810/2537 2593/2838/2537 +f 2548/2799/2538 2546/2797/2538 2598/2841/2538 2594/2839/2538 +f 2599/2842/2539 2547/2798/2539 2549/2802/2539 2595/2840/2539 +f 2546/2797/2540 2536/2782/2540 2600/2843/2540 2598/2841/2540 +f 2601/2844/2541 2537/2786/2541 2547/2798/2541 2599/2842/2541 +f 2536/2782/2542 2582/2781/2542 2584/2830/2542 2600/2843/2542 +f 2585/2832/2543 2583/2787/2543 2537/2786/2543 2601/2844/2543 +f 2596/2845/2544 2600/2843/2544 2584/2830/2544 +f 2585/2832/2545 2601/2844/2545 2597/2846/2545 +f 2598/2841/2546 2600/2843/2546 2596/2845/2546 +f 2597/2846/2547 2601/2844/2547 2599/2842/2547 +f 2596/2845/2548 2594/2839/2548 2598/2841/2548 +f 2599/2842/2549 2595/2840/2549 2597/2846/2549 +f 2596/2845/2550 2592/2837/2550 2594/2839/2550 +f 2595/2840/2551 2593/2838/2551 2597/2846/2551 +f 2596/2845/2552 2590/2835/2552 2592/2837/2552 +f 2593/2838/2553 2591/2836/2553 2597/2846/2553 +f 2596/2845/2554 2588/2833/2554 2590/2835/2554 +f 2591/2836/2555 2589/2834/2555 2597/2846/2555 +f 2596/2845/2556 2586/2829/2556 2588/2833/2556 +f 2589/2834/2557 2587/2831/2557 2597/2846/2557 +f 2596/2845/2558 2584/2830/2558 2586/2829/2558 +f 2587/2831/2559 2585/2832/2559 2597/2846/2559 +f 2624/2847/2560 2709/2848/2560 2711/2849/2560 2626/2850/2560 +f 2711/2849/2561 2710/2851/2561 2625/2852/2561 2626/2850/2561 +f 2622/2853/2562 2707/2854/2562 2709/2848/2562 2624/2847/2562 +f 2710/2851/2563 2708/2855/2563 2623/2856/2563 2625/2852/2563 +f 2620/2857/2564 2705/2858/2564 2707/2854/2564 2622/2853/2564 +f 2708/2855/2565 2706/2859/2565 2621/2860/2565 2623/2856/2565 +f 2618/2861/2566 2703/2862/2566 2705/2858/2566 2620/2857/2566 +f 2706/2859/2567 2704/2863/2567 2619/2864/2567 2621/2860/2567 +f 2616/2865/2568 2701/2866/2568 2703/2862/2568 2618/2861/2568 +f 2704/2863/2569 2702/2867/2569 2617/2868/2569 2619/2864/2569 +f 2614/2869/2570 2627/2870/2570 2681/2871/2570 2699/2872/2570 +f 2682/2873/2571 2628/2874/2571 2615/2875/2571 2700/2876/2571 +f 2627/2870/2572 2629/2877/2572 2683/2878/2572 2681/2871/2572 +f 2684/2879/2573 2630/2880/2573 2628/2874/2573 2682/2873/2573 +f 2629/2877/2574 2631/2881/2574 2685/2882/2574 2683/2878/2574 +f 2686/2883/2575 2632/2884/2575 2630/2880/2575 2684/2879/2575 +f 2631/2881/2576 2633/2885/2576 2687/2886/2576 2685/2882/2576 +f 2688/2887/2577 2634/2888/2577 2632/2884/2577 2686/2883/2577 +f 2633/2885/2578 2635/2889/2578 2689/2890/2578 2687/2886/2578 +f 2690/2891/2579 2636/2892/2579 2634/2888/2579 2688/2887/2579 +f 2635/2889/2580 2637/2893/2580 2691/2894/2580 2689/2890/2580 +f 2692/2895/2581 2638/2896/2581 2636/2892/2581 2690/2891/2581 +f 2637/2893/2582 2639/2897/2582 2693/2898/2582 2691/2894/2582 +f 2694/2899/2583 2640/2900/2583 2638/2896/2583 2692/2895/2583 +f 2639/2897/2584 2641/2901/2584 2695/2902/2584 2693/2898/2584 +f 2696/2903/2585 2642/2904/2585 2640/2900/2585 2694/2899/2585 +f 2641/2901/2586 2643/2905/2586 2697/2906/2586 2695/2902/2586 +f 2698/2907/2587 2644/2908/2587 2642/2904/2587 2696/2903/2587 +f 2643/2905/2588 2602/2909/2588 2603/2910/2588 2697/2906/2588 +f 2603/2910/2589 2602/2909/2589 2644/2908/2589 2698/2907/2589 +f 2645/2911/2590 2663/2912/2590 2695/2902/2590 2697/2906/2590 +f 2696/2903/2591 2664/2913/2591 2646/2914/2591 2698/2907/2591 +f 2663/2912/2592 2714/2915/2592 2693/2898/2592 2695/2902/2592 +f 2694/2899/2593 2715/2916/2593 2664/2913/2593 2696/2903/2593 +f 2661/2917/2594 2691/2894/2594 2693/2898/2594 2714/2915/2594 +f 2694/2899/2595 2692/2895/2595 2662/2918/2595 2715/2916/2595 +f 2659/2919/2596 2689/2890/2596 2691/2894/2596 2661/2917/2596 +f 2692/2895/2597 2690/2891/2597 2660/2920/2597 2662/2918/2597 +f 2657/2921/2598 2687/2886/2598 2689/2890/2598 2659/2919/2598 +f 2690/2891/2599 2688/2887/2599 2658/2922/2599 2660/2920/2599 +f 2655/2923/2600 2685/2882/2600 2687/2886/2600 2657/2921/2600 +f 2688/2887/2601 2686/2883/2601 2656/2924/2601 2658/2922/2601 +f 2653/2925/2602 2683/2878/2602 2685/2882/2602 2655/2923/2602 +f 2686/2883/2603 2684/2879/2603 2654/2926/2603 2656/2924/2603 +f 2651/2927/2604 2681/2871/2604 2683/2878/2604 2653/2925/2604 +f 2684/2879/2605 2682/2873/2605 2652/2928/2605 2654/2926/2605 +f 2649/2929/2606 2699/2872/2606 2681/2871/2606 2651/2927/2606 +f 2682/2873/2607 2700/2876/2607 2650/2930/2607 2652/2928/2607 +f 2649/2929/2608 2716/2931/2608 2712/2932/2608 2699/2872/2608 +f 2712/2932/2609 2717/2933/2609 2650/2930/2609 2700/2876/2609 +f 2645/2911/2610 2697/2906/2610 2603/2910/2610 2647/2934/2610 +f 2603/2910/2611 2698/2907/2611 2646/2914/2611 2648/2935/2611 +f 2647/2934/2612 2603/2910/2612 2713/2936/2612 2718/2937/2612 +f 2713/2936/2613 2603/2910/2613 2648/2935/2613 2719/2938/2613 +f 2712/2932/2614 2716/2931/2614 2718/2937/2614 2713/2936/2614 +f 2719/2938/2615 2717/2933/2615 2712/2932/2615 2713/2936/2615 +f 2670/2939/2616 2672/2940/2616 2711/2849/2616 2709/2848/2616 +f 2711/2849/2617 2672/2940/2617 2671/2941/2617 2710/2851/2617 +f 2668/2942/2618 2670/2939/2618 2709/2848/2618 2707/2854/2618 +f 2710/2851/2619 2671/2941/2619 2669/2943/2619 2708/2855/2619 +f 2666/2944/2620 2668/2942/2620 2707/2854/2620 2705/2858/2620 +f 2708/2855/2621 2669/2943/2621 2667/2945/2621 2706/2859/2621 +f 2701/2866/2622 2722/2946/2622 2720/2947/2622 2703/2862/2622 +f 2721/2948/2623 2723/2949/2623 2702/2867/2623 2704/2863/2623 +f 2666/2944/2624 2705/2858/2624 2703/2862/2624 2720/2947/2624 +f 2704/2863/2625 2706/2859/2625 2667/2945/2625 2721/2948/2625 +f 2679/2950/2626 2725/2951/2626 2724/2952/2626 2722/2946/2626 +f 2724/2952/2627 2725/2951/2627 2680/2953/2627 2723/2949/2627 +f 2720/2947/2628 2722/2946/2628 2724/2952/2628 2604/2954/2628 +f 2724/2952/2629 2723/2949/2629 2721/2948/2629 2604/2954/2629 +f 2665/2955/2630 2666/2944/2630 2720/2947/2630 2604/2954/2630 +f 2721/2948/2630 2667/2945/2630 2665/2955/2630 2604/2954/2630 +f 2677/2956/2631 2728/2957/2631 2726/2958/2631 2679/2950/2631 +f 2727/2959/2632 2729/2960/2632 2678/2961/2632 2680/2953/2632 +f 2675/2962/2633 2730/2963/2633 2728/2957/2633 2677/2956/2633 +f 2729/2960/2634 2731/2964/2634 2676/2965/2634 2678/2961/2634 +f 2674/2966/2635 2732/2967/2635 2730/2963/2635 2675/2962/2635 +f 2731/2964/2636 2733/2968/2636 2674/2966/2636 2676/2965/2636 +f 2673/2969/2637 2606/2970/2637 2732/2967/2637 2674/2966/2637 +f 2733/2968/2638 2606/2970/2638 2673/2969/2638 2674/2966/2638 +f 2725/2951/2639 2679/2950/2639 2726/2958/2639 2605/2971/2639 +f 2727/2959/2640 2680/2953/2640 2725/2951/2640 2605/2971/2640 +f 2605/2971/2641 2726/2958/2641 2741/2972/2641 2743/2973/2641 +f 2742/2974/2642 2727/2959/2642 2605/2971/2642 2743/2973/2642 +f 2606/2970/2643 2734/2975/2643 2735/2976/2643 2732/2967/2643 +f 2736/2977/2644 2734/2975/2644 2606/2970/2644 2733/2968/2644 +f 2732/2967/2645 2735/2976/2645 2737/2978/2645 2730/2963/2645 +f 2738/2979/2646 2736/2977/2646 2733/2968/2646 2731/2964/2646 +f 2730/2963/2647 2737/2978/2647 2739/2980/2647 2728/2957/2647 +f 2740/2981/2648 2738/2979/2648 2731/2964/2648 2729/2960/2648 +f 2728/2957/2649 2739/2980/2649 2741/2972/2649 2726/2958/2649 +f 2742/2974/2650 2740/2981/2650 2729/2960/2650 2727/2959/2650 +f 2734/2975/2651 2739/2980/2651 2737/2978/2651 2735/2976/2651 +f 2738/2979/2652 2740/2981/2652 2734/2975/2652 2736/2977/2652 +f 2734/2975/2653 2743/2973/2653 2741/2972/2653 2739/2980/2653 +f 2742/2974/2654 2743/2973/2654 2734/2975/2654 2740/2981/2654 +f 2674/2966/2655 2675/2962/2655 2699/2872/2655 2712/2932/2655 +f 2700/2876/2656 2676/2965/2656 2674/2966/2656 2712/2932/2656 +f 2675/2962/2657 2677/2956/2657 2746/2982/2657 2699/2872/2657 +f 2747/2983/2658 2678/2961/2658 2676/2965/2658 2700/2876/2658 +f 2677/2956/2659 2679/2950/2659 2748/2984/2659 2746/2982/2659 +f 2749/2985/2660 2680/2953/2660 2678/2961/2660 2747/2983/2660 +f 2679/2950/2661 2722/2946/2661 2701/2866/2661 2748/2984/2661 +f 2702/2867/2662 2723/2949/2662 2680/2953/2662 2749/2985/2662 +f 2616/2865/2663 2744/2986/2663 2748/2984/2663 2701/2866/2663 +f 2749/2985/2664 2745/2987/2664 2617/2868/2664 2702/2867/2664 +f 2744/2986/2665 2750/2988/2665 2746/2982/2665 2748/2984/2665 +f 2747/2983/2666 2751/2989/2666 2745/2987/2666 2749/2985/2666 +f 2614/2869/2667 2699/2872/2667 2746/2982/2667 2750/2988/2667 +f 2747/2983/2668 2700/2876/2668 2615/2875/2668 2751/2989/2668 +f 2666/2944/2669 2665/2955/2669 2607/2990/2669 2757/2991/2669 +f 2607/2990/2670 2665/2955/2670 2667/2945/2670 2758/2992/2670 +f 2668/2942/2671 2666/2944/2671 2757/2991/2671 2755/2993/2671 +f 2758/2992/2672 2667/2945/2672 2669/2943/2672 2756/2994/2672 +f 2670/2939/2673 2668/2942/2673 2755/2993/2673 2753/2995/2673 +f 2756/2994/2674 2669/2943/2674 2671/2941/2674 2754/2996/2674 +f 2672/2940/2675 2670/2939/2675 2753/2995/2675 2752/2997/2675 +f 2754/2996/2676 2671/2941/2676 2672/2940/2676 2752/2997/2676 +f 2752/2997/2677 2753/2995/2677 2764/2998/2677 2766/2999/2677 +f 2765/3000/2678 2754/2996/2678 2752/2997/2678 2766/2999/2678 +f 2753/2995/2679 2755/2993/2679 2762/3001/2679 2764/2998/2679 +f 2763/3002/2680 2756/2994/2680 2754/2996/2680 2765/3000/2680 +f 2755/2993/2681 2757/2991/2681 2760/3003/2681 2762/3001/2681 +f 2761/3004/2682 2758/2992/2682 2756/2994/2682 2763/3002/2682 +f 2757/2991/2683 2607/2990/2683 2759/3005/2683 2760/3003/2683 +f 2759/3005/2684 2607/2990/2684 2758/2992/2684 2761/3004/2684 +f 2759/3005/2685 2766/2999/2685 2764/2998/2685 2760/3003/2685 +f 2765/3000/2686 2766/2999/2686 2759/3005/2686 2761/3004/2686 +f 2760/3003/2687 2764/2998/2687 2762/3001/2687 +f 2763/3002/2688 2765/3000/2688 2761/3004/2688 +f 2718/2937/2689 2716/2931/2689 2769/3006/2689 2767/3007/2689 +f 2770/3008/2690 2717/2933/2690 2719/2938/2690 2768/3009/2690 +f 2647/2934/2691 2718/2937/2691 2767/3007/2691 2789/3010/2691 +f 2768/3009/2692 2719/2938/2692 2648/2935/2692 2790/3011/2692 +f 2645/2911/2693 2647/2934/2693 2789/3010/2693 2791/3012/2693 +f 2790/3011/2694 2648/2935/2694 2646/2914/2694 2792/3013/2694 +f 2716/2931/2695 2649/2929/2695 2787/3014/2695 2769/3006/2695 +f 2788/3015/2696 2650/2930/2696 2717/2933/2696 2770/3008/2696 +f 2649/2929/2697 2651/2927/2697 2785/3016/2697 2787/3014/2697 +f 2786/3017/2698 2652/2928/2698 2650/2930/2698 2788/3015/2698 +f 2651/2927/2699 2653/2925/2699 2783/3018/2699 2785/3016/2699 +f 2784/3019/2700 2654/2926/2700 2652/2928/2700 2786/3017/2700 +f 2653/2925/2701 2655/2923/2701 2781/3020/2701 2783/3018/2701 +f 2782/3021/2702 2656/2924/2702 2654/2926/2702 2784/3019/2702 +f 2655/2923/2703 2657/2921/2703 2779/3022/2703 2781/3020/2703 +f 2780/3023/2704 2658/2922/2704 2656/2924/2704 2782/3021/2704 +f 2657/2921/2705 2659/2919/2705 2777/3024/2705 2779/3022/2705 +f 2778/3025/2706 2660/2920/2706 2658/2922/2706 2780/3023/2706 +f 2659/2919/2707 2661/2917/2707 2775/3026/2707 2777/3024/2707 +f 2776/3027/2708 2662/2918/2708 2660/2920/2708 2778/3025/2708 +f 2661/2917/2709 2714/2915/2709 2771/3028/2709 2775/3026/2709 +f 2772/3029/2710 2715/2916/2710 2662/2918/2710 2776/3027/2710 +f 2714/2915/2711 2663/2912/2711 2773/3030/2711 2771/3028/2711 +f 2774/3031/2712 2664/2913/2712 2715/2916/2712 2772/3029/2712 +f 2663/2912/2713 2645/2911/2713 2791/3012/2713 2773/3030/2713 +f 2792/3013/2714 2646/2914/2714 2664/2913/2714 2774/3031/2714 +f 2773/3030/2715 2791/3012/2715 2793/3032/2715 2811/3033/2715 +f 2794/3034/2716 2792/3013/2716 2774/3031/2716 2812/3035/2716 +f 2771/3028/2717 2773/3030/2717 2811/3033/2717 2813/3036/2717 +f 2812/3035/2718 2774/3031/2718 2772/3029/2718 2814/3037/2718 +f 2775/3026/2719 2771/3028/2719 2813/3036/2719 2809/3038/2719 +f 2814/3037/2720 2772/3029/2720 2776/3027/2720 2810/3039/2720 +f 2777/3024/2721 2775/3026/2721 2809/3038/2721 2807/3040/2721 +f 2810/3039/2722 2776/3027/2722 2778/3025/2722 2808/3041/2722 +f 2779/3022/2723 2777/3024/2723 2807/3040/2723 2805/3042/2723 +f 2808/3041/2724 2778/3025/2724 2780/3023/2724 2806/3043/2724 +f 2781/3020/2725 2779/3022/2725 2805/3042/2725 2803/3044/2725 +f 2806/3043/2726 2780/3023/2726 2782/3021/2726 2804/3045/2726 +f 2783/3018/2727 2781/3020/2727 2803/3044/2727 2801/3046/2727 +f 2804/3045/2728 2782/3021/2728 2784/3019/2728 2802/3047/2728 +f 2785/3016/2729 2783/3018/2729 2801/3046/2729 2799/3048/2729 +f 2802/3047/2730 2784/3019/2730 2786/3017/2730 2800/3049/2730 +f 2787/3014/2731 2785/3016/2731 2799/3048/2731 2797/3050/2731 +f 2800/3049/2732 2786/3017/2732 2788/3015/2732 2798/3051/2732 +f 2769/3006/2733 2787/3014/2733 2797/3050/2733 2815/3052/2733 +f 2798/3051/2734 2788/3015/2734 2770/3008/2734 2816/3053/2734 +f 2791/3012/2735 2789/3010/2735 2795/3054/2735 2793/3032/2735 +f 2796/3055/2736 2790/3011/2736 2792/3013/2736 2794/3034/2736 +f 2789/3010/2737 2767/3007/2737 2817/3056/2737 2795/3054/2737 +f 2818/3057/2738 2768/3009/2738 2790/3011/2738 2796/3055/2738 +f 2767/3007/2739 2769/3006/2739 2815/3052/2739 2817/3056/2739 +f 2816/3053/2740 2770/3008/2740 2768/3009/2740 2818/3057/2740 +f 2602/2909/2741 2643/2905/2741 2819/3058/2741 2608/3059/2741 +f 2820/3060/2742 2644/2908/2742 2602/2909/2742 2608/3059/2742 +f 2643/2905/2743 2641/2901/2743 2821/3061/2743 2819/3058/2743 +f 2822/3062/2744 2642/2904/2744 2644/2908/2744 2820/3060/2744 +f 2641/2901/2745 2639/2897/2745 2823/3063/2745 2821/3061/2745 +f 2824/3064/2746 2640/2900/2746 2642/2904/2746 2822/3062/2746 +f 2639/2897/2747 2637/2893/2747 2825/3065/2747 2823/3063/2747 +f 2826/3066/2748 2638/2896/2748 2640/2900/2748 2824/3064/2748 +f 2637/2893/2749 2635/2889/2749 2827/3067/2749 2825/3065/2749 +f 2828/3068/2750 2636/2892/2750 2638/2896/2750 2826/3066/2750 +f 2635/2889/2751 2633/2885/2751 2829/3069/2751 2827/3067/2751 +f 2830/3070/2752 2634/2888/2752 2636/2892/2752 2828/3068/2752 +f 2633/2885/2753 2631/2881/2753 2831/3071/2753 2829/3069/2753 +f 2832/3072/2754 2632/2884/2754 2634/2888/2754 2830/3070/2754 +f 2631/2881/2755 2629/2877/2755 2833/3073/2755 2831/3071/2755 +f 2834/3074/2756 2630/2880/2756 2632/2884/2756 2832/3072/2756 +f 2629/2877/2757 2627/2870/2757 2835/3075/2757 2833/3073/2757 +f 2836/3076/2758 2628/2874/2758 2630/2880/2758 2834/3074/2758 +f 2843/3077/2759 2844/3078/2759 2863/3079/2759 2873/3080/2759 +f 2864/3081/2760 2844/3082/2760 2843/3083/2760 2874/3084/2760 +f 2842/3085/2761 2843/3077/2761 2873/3080/2761 2871/3086/2761 +f 2874/3084/2762 2843/3083/2762 2842/3087/2762 2872/3088/2762 +f 2841/3089/2763 2842/3085/2763 2871/3086/2763 2875/3090/2763 +f 2872/3088/2764 2842/3087/2764 2841/3089/2764 2876/3091/2764 +f 2624/2847/2765 2626/2850/2765 2841/3089/2765 2875/3090/2765 +f 2841/3089/2766 2626/2850/2766 2625/2852/2766 2876/3091/2766 +f 2622/2853/2767 2624/2847/2767 2875/3090/2767 2869/3092/2767 +f 2876/3091/2768 2625/2852/2768 2623/2856/2768 2870/3093/2768 +f 2620/2857/2769 2622/2853/2769 2869/3092/2769 2865/3094/2769 +f 2870/3093/2770 2623/2856/2770 2621/2860/2770 2866/3095/2770 +f 2618/2861/2771 2620/2857/2771 2865/3094/2771 2867/3096/2771 +f 2866/3095/2772 2621/2860/2772 2619/2864/2772 2868/3097/2772 +f 2865/3094/2773 2871/3086/2773 2873/3080/2773 2867/3096/2773 +f 2874/3084/2774 2872/3088/2774 2866/3095/2774 2868/3097/2774 +f 2865/3094/2775 2869/3092/2775 2875/3090/2775 2871/3086/2775 +f 2876/3091/2776 2870/3093/2776 2866/3095/2776 2872/3088/2776 +f 2861/3098/2777 2867/3096/2777 2873/3080/2777 2863/3079/2777 +f 2874/3084/2778 2868/3097/2778 2862/3099/2778 2864/3081/2778 +f 2616/2865/2779 2618/2861/2779 2867/3096/2779 2861/3098/2779 +f 2868/3097/2780 2619/2864/2780 2617/2868/2780 2862/3099/2780 +f 2744/2986/2781 2877/3100/2781 2879/3101/2781 2750/2988/2781 +f 2880/3102/2782 2878/3103/2782 2745/2987/2782 2751/2989/2782 +f 2616/2865/2783 2861/3098/2783 2877/3100/2783 2744/2986/2783 +f 2878/3103/2784 2862/3099/2784 2617/2868/2784 2745/2987/2784 +f 2614/2869/2785 2750/2988/2785 2879/3101/2785 2881/3104/2785 +f 2880/3102/2786 2751/2989/2786 2615/2875/2786 2882/3105/2786 +f 2614/2869/2787 2881/3104/2787 2835/3075/2787 2627/2870/2787 +f 2836/3076/2788 2882/3105/2788 2615/2875/2788 2628/2874/2788 +f 2612/3106/2789 2859/3107/2789 2887/3108/2789 2839/3109/2789 +f 2888/3110/2790 2860/3111/2790 2612/3112/2790 2839/3113/2790 +f 2839/3109/2791 2887/3108/2791 2885/3114/2791 2613/3115/2791 +f 2886/3116/2792 2888/3110/2792 2839/3113/2792 2613/3117/2792 +f 2613/3115/2793 2885/3114/2793 2883/3118/2793 2840/3119/2793 +f 2884/3120/2794 2886/3116/2794 2613/3117/2794 2840/3121/2794 +f 2840/3119/2795 2883/3118/2795 2863/3079/2795 2844/3078/2795 +f 2864/3081/2796 2884/3120/2796 2840/3121/2796 2844/3082/2796 +f 2861/3098/2797 2863/3079/2797 2883/3118/2797 2877/3100/2797 +f 2884/3120/2798 2864/3081/2798 2862/3099/2798 2878/3103/2798 +f 2831/3071/2799 2833/3073/2799 2853/3122/2799 2845/3123/2799 +f 2854/3124/2800 2834/3074/2800 2832/3072/2800 2846/3125/2800 +f 2611/3126/2801 2851/3127/2801 2859/3107/2801 2612/3106/2801 +f 2860/3111/2802 2852/3128/2802 2611/3129/2802 2612/3112/2802 +f 2837/3130/2803 2893/3131/2803 2891/3132/2803 2838/3133/2803 +f 2892/3134/2804 2894/3135/2804 2837/3136/2804 2838/3137/2804 +f 2838/3133/2805 2891/3132/2805 2889/3138/2805 2610/3139/2805 +f 2890/3140/2806 2892/3134/2806 2838/3137/2806 2610/3141/2806 +f 2610/3139/2807 2889/3138/2807 2851/3127/2807 2611/3126/2807 +f 2852/3128/2808 2890/3140/2808 2610/3141/2808 2611/3129/2808 +f 2827/3142/2809 2829/3069/2809 2897/3143/2809 2899/3144/2809 +f 2898/3145/2810 2830/3070/2810 2828/3146/2810 2900/3147/2810 +f 2899/3144/2811 2897/3143/2811 2903/3148/2811 2901/3149/2811 +f 2904/3150/2812 2898/3145/2812 2900/3147/2812 2902/3151/2812 +f 2901/3149/2813 2903/3148/2813 2905/3152/2813 2907/3153/2813 +f 2906/3154/2814 2904/3150/2814 2902/3151/2814 2908/3155/2814 +f 2907/3153/2815 2905/3152/2815 2911/3156/2815 2909/3157/2815 +f 2912/3158/2816 2906/3154/2816 2908/3155/2816 2910/3159/2816 +f 2849/3160/2817 2913/3161/2817 2909/3157/2817 2911/3156/2817 +f 2910/3159/2818 2914/3162/2818 2850/3163/2818 2912/3158/2818 +f 2851/3127/2819 2889/3138/2819 2909/3157/2819 2913/3161/2819 +f 2910/3159/2820 2890/3140/2820 2852/3128/2820 2914/3162/2820 +f 2889/3138/2821 2891/3132/2821 2907/3153/2821 2909/3157/2821 +f 2908/3155/2822 2892/3134/2822 2890/3140/2822 2910/3159/2822 +f 2891/3132/2823 2893/3131/2823 2901/3149/2823 2907/3153/2823 +f 2902/3151/2824 2894/3135/2824 2892/3134/2824 2908/3155/2824 +f 2893/3131/2825 2895/3164/2825 2899/3144/2825 2901/3149/2825 +f 2900/3147/2826 2896/3165/2826 2894/3135/2826 2902/3151/2826 +f 2825/3166/2827 2827/3142/2827 2899/3144/2827 2895/3164/2827 +f 2900/3147/2828 2828/3146/2828 2826/3167/2828 2896/3165/2828 +f 2609/3168/2829 2895/3164/2829 2893/3131/2829 2837/3130/2829 +f 2894/3135/2830 2896/3165/2830 2609/3169/2830 2837/3136/2830 +f 2819/3170/2831 2821/3171/2831 2823/3172/2831 2825/3166/2831 +f 2824/3173/2832 2822/3174/2832 2820/3175/2832 2826/3167/2832 +f 2819/3170/2833 2825/3166/2833 2895/3164/2833 2609/3168/2833 +f 2896/3165/2834 2826/3167/2834 2820/3175/2834 2609/3169/2834 +f 2608/3176/2835 2819/3170/2835 2609/3168/2835 +f 2609/3169/2836 2820/3175/2836 2608/3177/2836 +f 2829/3069/2837 2831/3071/2837 2845/3123/2837 2897/3143/2837 +f 2846/3125/2838 2832/3072/2838 2830/3070/2838 2898/3145/2838 +f 2845/3123/2839 2847/3178/2839 2903/3148/2839 2897/3143/2839 +f 2904/3150/2840 2848/3179/2840 2846/3125/2840 2898/3145/2840 +f 2847/3178/2841 2917/3180/2841 2905/3152/2841 2903/3148/2841 +f 2906/3154/2842 2918/3181/2842 2848/3179/2842 2904/3150/2842 +f 2849/3160/2843 2911/3156/2843 2905/3152/2843 2917/3180/2843 +f 2906/3154/2844 2912/3158/2844 2850/3163/2844 2918/3181/2844 +f 2883/3118/2845 2885/3114/2845 2921/3182/2845 2919/3183/2845 +f 2922/3184/2846 2886/3116/2846 2884/3120/2846 2920/3185/2846 +f 2853/3122/2847 2919/3183/2847 2921/3182/2847 2855/3186/2847 +f 2922/3184/2848 2920/3185/2848 2854/3124/2848 2856/3187/2848 +f 2833/3073/2849 2835/3075/2849 2919/3183/2849 2853/3122/2849 +f 2920/3185/2850 2836/3076/2850 2834/3074/2850 2854/3124/2850 +f 2835/3075/2851 2879/3101/2851 2877/3100/2851 2919/3183/2851 +f 2878/3103/2852 2880/3102/2852 2836/3076/2852 2920/3185/2852 +f 2877/3100/2853 2883/3118/2853 2919/3183/2853 +f 2920/3185/2854 2884/3120/2854 2878/3103/2854 +f 2835/3075/2855 2881/3104/2855 2879/3101/2855 +f 2880/3102/2856 2882/3105/2856 2836/3076/2856 +f 2849/3160/2857 2857/3188/2857 2915/3189/2857 2913/3161/2857 +f 2916/3190/2858 2858/3191/2858 2850/3163/2858 2914/3162/2858 +f 2851/3127/2859 2913/3161/2859 2915/3189/2859 2859/3107/2859 +f 2916/3190/2860 2914/3162/2860 2852/3128/2860 2860/3111/2860 +f 2855/3186/2861 2921/3182/2861 2915/3189/2861 2857/3188/2861 +f 2916/3190/2862 2922/3184/2862 2856/3187/2862 2858/3191/2862 +f 2885/3114/2863 2887/3108/2863 2915/3189/2863 2921/3182/2863 +f 2916/3190/2864 2888/3110/2864 2886/3116/2864 2922/3184/2864 +f 2859/3107/2865 2915/3189/2865 2887/3108/2865 +f 2888/3110/2866 2916/3190/2866 2860/3111/2866 +f 2935/3192/2867 2923/3193/2867 2949/3194/2867 2937/3195/2867 +f 2950/3196/2868 2924/3197/2868 2936/3198/2868 2938/3199/2868 +f 2935/3192/2869 2937/3195/2869 2939/3200/2869 2933/3201/2869 +f 2940/3202/2870 2938/3199/2870 2936/3198/2870 2934/3203/2870 +f 2933/3201/2871 2939/3200/2871 2941/3204/2871 2931/3205/2871 +f 2942/3206/2872 2940/3202/2872 2934/3203/2872 2932/3207/2872 +f 2931/3205/2873 2941/3204/2873 2943/3208/2873 2929/3209/2873 +f 2944/3210/2874 2942/3206/2874 2932/3207/2874 2930/3211/2874 +f 2929/3209/2875 2943/3208/2875 2945/3212/2875 2927/3213/2875 +f 2946/3214/2876 2944/3210/2876 2930/3211/2876 2928/3215/2876 +f 2927/3213/2877 2945/3212/2877 2947/3216/2877 2925/3217/2877 +f 2948/3218/2878 2946/3214/2878 2928/3215/2878 2926/3219/2878 +f 2945/3212/2879 2955/3220/2879 2953/3221/2879 2947/3216/2879 +f 2954/3222/2880 2956/3223/2880 2946/3214/2880 2948/3218/2880 +f 2943/3208/2881 2957/3224/2881 2955/3220/2881 2945/3212/2881 +f 2956/3223/2882 2958/3225/2882 2944/3210/2882 2946/3214/2882 +f 2941/3204/2883 2959/3226/2883 2957/3224/2883 2943/3208/2883 +f 2958/3225/2884 2960/3227/2884 2942/3206/2884 2944/3210/2884 +f 2939/3200/2885 2961/3228/2885 2959/3226/2885 2941/3204/2885 +f 2960/3227/2886 2962/3229/2886 2940/3202/2886 2942/3206/2886 +f 2937/3195/2887 2963/3230/2887 2961/3228/2887 2939/3200/2887 +f 2962/3229/2888 2964/3231/2888 2938/3199/2888 2940/3202/2888 +f 2937/3195/2889 2949/3194/2889 2951/3232/2889 2963/3230/2889 +f 2952/3233/2890 2950/3196/2890 2938/3199/2890 2964/3231/2890 +f 2853/3122/2891 2855/3186/2891 2979/3234/2891 2977/3235/2891 +f 2980/3236/2892 2856/3187/2892 2854/3124/2892 2978/3237/2892 +f 2855/3238/2893 2925/3217/2893 2947/3216/2893 2979/3239/2893 +f 2948/3218/2894 2926/3219/2894 2856/3240/2894 2980/3241/2894 +f 2845/3123/2895 2853/3122/2895 2977/3235/2895 2847/3178/2895 +f 2978/3237/2896 2854/3124/2896 2846/3125/2896 2848/3179/2896 +f 2917/3242/2897 2965/3243/2897 2949/3194/2897 2923/3193/2897 +f 2950/3196/2898 2966/3244/2898 2918/3245/2898 2924/3197/2898 +f 2947/3216/2899 2953/3221/2899 2975/3246/2899 2979/3239/2899 +f 2976/3247/2900 2954/3222/2900 2948/3218/2900 2980/3241/2900 +f 2973/3248/2901 2981/3249/2901 2979/3239/2901 2975/3246/2901 +f 2980/3241/2902 2982/3250/2902 2974/3251/2902 2976/3247/2902 +f 2969/3252/2903 2981/3249/2903 2973/3248/2903 2971/3253/2903 +f 2974/3251/2904 2982/3250/2904 2970/3254/2904 2972/3255/2904 +f 2967/3256/2905 2983/3257/2905 2981/3249/2905 2969/3252/2905 +f 2982/3250/2906 2984/3258/2906 2968/3259/2906 2970/3254/2906 +f 2965/3243/2907 2983/3257/2907 2967/3256/2907 2985/3260/2907 +f 2968/3259/2908 2984/3258/2908 2966/3244/2908 2986/3261/2908 +f 2949/3194/2909 2965/3243/2909 2985/3260/2909 2951/3232/2909 +f 2986/3261/2910 2966/3244/2910 2950/3196/2910 2952/3233/2910 +f 2847/3178/2911 2983/3262/2911 2965/3263/2911 2917/3180/2911 +f 2966/3264/2912 2984/3265/2912 2848/3179/2912 2918/3181/2912 +f 2847/3178/2913 2977/3235/2913 2981/3266/2913 2983/3262/2913 +f 2982/3267/2914 2978/3237/2914 2848/3179/2914 2984/3265/2914 +f 2977/3235/2915 2979/3234/2915 2981/3266/2915 +f 2982/3267/2916 2980/3236/2916 2978/3237/2916 +f 2951/3232/2917 2985/3260/2917 2987/3268/2917 3011/3269/2917 +f 2988/3270/2918 2986/3261/2918 2952/3233/2918 3012/3271/2918 +f 2985/3260/2919 2967/3256/2919 2997/3272/2919 2987/3268/2919 +f 2998/3273/2920 2968/3259/2920 2986/3261/2920 2988/3270/2920 +f 2967/3256/2921 2969/3252/2921 2995/3274/2921 2997/3272/2921 +f 2996/3275/2922 2970/3254/2922 2968/3259/2922 2998/3273/2922 +f 2969/3252/2923 2971/3253/2923 2993/3276/2923 2995/3274/2923 +f 2994/3277/2924 2972/3255/2924 2970/3254/2924 2996/3275/2924 +f 2971/3253/2925 2973/3248/2925 2991/3278/2925 2993/3276/2925 +f 2992/3279/2926 2974/3251/2926 2972/3255/2926 2994/3277/2926 +f 2973/3248/2927 2975/3246/2927 2989/3280/2927 2991/3278/2927 +f 2990/3281/2928 2976/3247/2928 2974/3251/2928 2992/3279/2928 +f 2975/3246/2929 2953/3221/2929 3009/3282/2929 2989/3280/2929 +f 3010/3283/2930 2954/3222/2930 2976/3247/2930 2990/3281/2930 +f 2963/3230/2931 2951/3232/2931 3011/3269/2931 2999/3284/2931 +f 3012/3271/2932 2952/3233/2932 2964/3231/2932 3000/3285/2932 +f 2961/3228/2933 2963/3230/2933 2999/3284/2933 3001/3286/2933 +f 3000/3285/2934 2964/3231/2934 2962/3229/2934 3002/3287/2934 +f 2959/3226/2935 2961/3228/2935 3001/3286/2935 3003/3288/2935 +f 3002/3287/2936 2962/3229/2936 2960/3227/2936 3004/3289/2936 +f 2957/3224/2937 2959/3226/2937 3003/3288/2937 3005/3290/2937 +f 3004/3289/2938 2960/3227/2938 2958/3225/2938 3006/3291/2938 +f 2955/3220/2939 2957/3224/2939 3005/3290/2939 3007/3292/2939 +f 3006/3291/2940 2958/3225/2940 2956/3223/2940 3008/3293/2940 +f 2953/3221/2941 2955/3220/2941 3007/3292/2941 3009/3282/2941 +f 3008/3293/2942 2956/3223/2942 2954/3222/2942 3010/3283/2942 +f 2993/3276/2943 2991/3278/2943 3015/3294/2943 3013/3295/2943 +f 3016/3296/2944 2992/3279/2944 2994/3277/2944 3014/3297/2944 +f 3013/3295/2945 3015/3294/2945 3017/3298/2945 3019/3299/2945 +f 3018/3300/2946 3016/3296/2946 3014/3297/2946 3020/3301/2946 +f 3019/3299/2947 3017/3298/2947 3023/3302/2947 3021/3303/2947 +f 3024/3304/2948 3018/3300/2948 3020/3301/2948 3022/3305/2948 +f 3021/3303/2949 3023/3302/2949 3025/3306/2949 3027/3307/2949 +f 3026/3308/2950 3024/3304/2950 3022/3305/2950 3028/3309/2950 +f 2999/3284/2951 3011/3269/2951 3021/3303/2951 3027/3307/2951 +f 3022/3305/2952 3012/3271/2952 3000/3285/2952 3028/3309/2952 +f 2987/3268/2953 3019/3299/2953 3021/3303/2953 3011/3269/2953 +f 3022/3305/2954 3020/3301/2954 2988/3270/2954 3012/3271/2954 +f 2987/3268/2955 2997/3272/2955 3013/3295/2955 3019/3299/2955 +f 3014/3297/2956 2998/3273/2956 2988/3270/2956 3020/3301/2956 +f 2993/3276/2957 3013/3295/2957 2997/3272/2957 2995/3274/2957 +f 2998/3273/2958 3014/3297/2958 2994/3277/2958 2996/3275/2958 +f 2989/3280/2959 3009/3282/2959 3015/3294/2959 2991/3278/2959 +f 3016/3296/2960 3010/3283/2960 2990/3281/2960 2992/3279/2960 +f 3007/3292/2961 3017/3298/2961 3015/3294/2961 3009/3282/2961 +f 3016/3296/2962 3018/3300/2962 3008/3293/2962 3010/3283/2962 +f 3005/3290/2963 3023/3302/2963 3017/3298/2963 3007/3292/2963 +f 3018/3300/2964 3024/3304/2964 3006/3291/2964 3008/3293/2964 +f 3003/3288/2965 3025/3306/2965 3023/3302/2965 3005/3290/2965 +f 3024/3304/2966 3026/3308/2966 3004/3289/2966 3006/3291/2966 +f 3001/3286/2967 3027/3307/2967 3025/3306/2967 3003/3288/2967 +f 3026/3308/2968 3028/3309/2968 3002/3287/2968 3004/3289/2968 +f 2999/3284/2969 3027/3307/2969 3001/3286/2969 +f 3002/3287/2970 3028/3309/2970 3000/3285/2970 +f 2927/3213/2971 2925/3217/2971 3039/3310/2971 3037/3311/2971 +f 3040/3312/2972 2926/3219/2972 2928/3215/2972 3038/3313/2972 +f 2929/3209/2973 2927/3213/2973 3037/3311/2973 3035/3314/2973 +f 3038/3313/2974 2928/3215/2974 2930/3211/2974 3036/3315/2974 +f 2931/3205/2975 2929/3209/2975 3035/3314/2975 3033/3316/2975 +f 3036/3315/2976 2930/3211/2976 2932/3207/2976 3034/3317/2976 +f 2933/3318/2977 2931/3205/2977 3033/3316/2977 3031/3319/2977 +f 3034/3317/2978 2932/3207/2978 2934/3320/2978 3032/3321/2978 +f 2935/3322/2979 2933/3318/2979 3031/3319/2979 3029/3323/2979 +f 3032/3321/2980 2934/3320/2980 2936/3324/2980 3030/3325/2980 +f 2923/3326/2981 2935/3322/2981 3029/3323/2981 3041/3327/2981 +f 3030/3325/2982 2936/3324/2982 2924/3328/2982 3042/3329/2982 +f 3029/3323/2983 3037/3311/2983 3039/3310/2983 3041/3327/2983 +f 3040/3312/2984 3038/3313/2984 3030/3325/2984 3042/3329/2984 +f 3029/3323/2985 3031/3319/2985 3035/3314/2985 3037/3311/2985 +f 3036/3315/2986 3032/3321/2986 3030/3325/2986 3038/3313/2986 +f 3031/3319/2987 3033/3316/2987 3035/3314/2987 +f 3036/3315/2988 3034/3317/2988 3032/3321/2988 +f 2849/3160/2989 2917/3180/2989 2923/3330/2989 3041/3331/2989 +f 2924/3328/2990 2918/3332/2990 2850/3333/2990 3042/3329/2990 +f 2849/3334/2991 3041/3327/2991 3039/3310/2991 2857/3335/2991 +f 3040/3312/2992 3042/3329/2992 2850/3333/2992 2858/3336/2992 +f 2855/3238/2993 2857/3335/2993 3039/3310/2993 2925/3217/2993 +f 3040/3312/2994 2858/3336/2994 2856/3240/2994 2926/3219/2994 +g Suzanne.006_Suzanne +v 2.334375 0.164062 0.437501 +v 2.334375 0.164062 -0.437499 +v 2.412500 0.093750 0.500001 +v 2.412500 0.093750 -0.499999 +v 2.521875 0.054688 0.546876 +v 2.521875 0.054688 -0.546874 +v 2.482813 -0.023438 0.351563 +v 2.482813 -0.023438 -0.351562 +v 2.381250 0.031250 0.351563 +v 2.381250 0.031250 -0.351562 +v 2.318750 0.132812 0.351563 +v 2.318750 0.132812 -0.351562 +v 2.303125 0.164062 0.273438 +v 2.303125 0.164062 -0.273437 +v 2.357813 0.093750 0.203126 +v 2.357813 0.093750 -0.203124 +v 2.451563 0.054688 0.156251 +v 2.451563 0.054688 -0.156249 +v 2.443750 0.242188 0.078126 +v 2.443750 0.242188 -0.078124 +v 2.357813 0.242188 0.140626 +v 2.357813 0.242188 -0.140624 +v 2.303125 0.242188 0.242188 +v 2.303125 0.242188 -0.242187 +v 2.303125 0.328125 0.273438 +v 2.303125 0.328125 -0.273437 +v 2.357813 0.390625 0.203126 +v 2.357813 0.390625 -0.203124 +v 2.451563 0.437500 0.156251 +v 2.451563 0.437500 -0.156249 +v 2.482813 0.515625 0.351563 +v 2.482813 0.515625 -0.351562 +v 2.381250 0.453125 0.351563 +v 2.381250 0.453125 -0.351562 +v 2.318750 0.359375 0.351563 +v 2.318750 0.359375 -0.351562 +v 2.334375 0.328125 0.437501 +v 2.334375 0.328125 -0.437499 +v 2.412500 0.390625 0.500001 +v 2.412500 0.390625 -0.499999 +v 2.521875 0.437500 0.546876 +v 2.521875 0.437500 -0.546874 +v 2.537500 0.242188 0.625001 +v 2.537500 0.242188 -0.624999 +v 2.428125 0.242188 0.562501 +v 2.428125 0.242188 -0.562499 +v 2.342188 0.242188 0.468751 +v 2.342188 0.242188 -0.468749 +v 2.326563 0.242188 0.476563 +v 2.326563 0.242188 -0.476562 +v 2.318750 0.335938 0.445313 +v 2.318750 0.335938 -0.445312 +v 2.295313 0.375000 0.351563 +v 2.295313 0.375000 -0.351562 +v 2.279688 0.335938 0.265626 +v 2.279688 0.335938 -0.265624 +v 2.279688 0.242188 0.226563 +v 2.279688 0.242188 -0.226562 +v 2.279688 0.156250 0.265626 +v 2.279688 0.156250 -0.265624 +v 2.271875 0.242188 0.351563 +v 2.271875 0.242188 -0.351562 +v 2.295313 0.117188 0.351563 +v 2.295313 0.117188 -0.351562 +v 2.318750 0.156250 0.445313 +v 2.318750 0.156250 -0.445312 +v 2.357813 0.429688 0.000001 +v 2.279688 0.351562 0.000001 +v 2.365625 -0.679688 0.000001 +v 2.318750 -0.320312 0.000001 +v 2.303125 -0.187500 0.000001 +v 2.381250 -0.773438 0.000001 +v 2.498438 0.406250 0.000001 +v 2.529688 0.570312 0.000001 +v 3.646875 0.898438 0.000001 +v 3.951563 0.562500 0.000001 +v 3.928125 0.070312 0.000001 +v 3.451563 -0.382812 0.000001 +v 2.537500 -0.187500 0.203126 +v 2.537500 -0.187500 -0.203124 +v 2.529688 -0.437500 0.312501 +v 2.529688 -0.437500 -0.312499 +v 2.529688 -0.695312 0.351563 +v 2.529688 -0.695312 -0.351562 +v 2.568750 -0.890625 0.367188 +v 2.568750 -0.890625 -0.367187 +v 2.576563 -0.945312 0.328126 +v 2.576563 -0.945312 -0.328124 +v 2.545313 -0.968750 0.179688 +v 2.545313 -0.968750 -0.179687 +v 2.521875 -0.984375 0.000001 +v 2.568750 -0.140625 0.437501 +v 2.568750 -0.140625 -0.437499 +v 2.560938 -0.039062 0.632813 +v 2.560938 -0.039062 -0.632812 +v 2.654688 0.148438 0.828126 +v 2.654688 0.148438 -0.828124 +v 2.506250 0.429688 0.859376 +v 2.506250 0.429688 -0.859374 +v 2.475000 0.484375 0.710938 +v 2.475000 0.484375 -0.710937 +v 2.412500 0.601562 0.492188 +v 2.412500 0.601562 -0.492187 +v 2.365625 0.757812 0.320313 +v 2.365625 0.757812 -0.320312 +v 2.342188 0.718750 0.156251 +v 2.342188 0.718750 -0.156249 +v 2.350000 0.492188 0.062501 +v 2.350000 0.492188 -0.062499 +v 2.326563 0.414062 0.164063 +v 2.326563 0.414062 -0.164062 +v 2.334375 0.304688 0.125001 +v 2.334375 0.304688 -0.124999 +v 2.357813 0.093750 0.203126 +v 2.357813 0.093750 -0.203124 +v 2.396875 0.015625 0.375001 +v 2.396875 0.015625 -0.374999 +v 2.428125 0.062500 0.492188 +v 2.428125 0.062500 -0.492187 +v 2.451563 0.187500 0.625001 +v 2.451563 0.187500 -0.624999 +v 2.451563 0.296875 0.640626 +v 2.451563 0.296875 -0.640624 +v 2.435938 0.375000 0.601563 +v 2.435938 0.375000 -0.601562 +v 2.381250 0.437500 0.429688 +v 2.381250 0.437500 -0.429687 +v 2.342188 0.468750 0.250001 +v 2.342188 0.468750 -0.249999 +v 2.365625 -0.765625 0.000001 +v 2.365625 -0.718750 0.109376 +v 2.365625 -0.718750 -0.109374 +v 2.389063 -0.835938 0.117188 +v 2.389063 -0.835938 -0.117187 +v 2.404688 -0.882812 0.062501 +v 2.404688 -0.882812 -0.062499 +v 2.412500 -0.890625 0.000001 +v 2.350000 -0.195312 0.000001 +v 2.357813 -0.140625 0.000001 +v 2.357813 -0.148438 0.101563 +v 2.357813 -0.148438 -0.101562 +v 2.350000 -0.226562 0.125001 +v 2.350000 -0.226562 -0.124999 +v 2.357813 -0.289062 0.085938 +v 2.357813 -0.289062 -0.085937 +v 2.428125 -0.046875 0.398438 +v 2.428125 -0.046875 -0.398437 +v 2.475000 0.054688 0.617188 +v 2.475000 0.054688 -0.617187 +v 2.498438 0.203125 0.726563 +v 2.498438 0.203125 -0.726562 +v 2.443750 0.375000 0.742188 +v 2.443750 0.375000 -0.742187 +v 2.373438 0.414062 0.687501 +v 2.373438 0.414062 -0.687499 +v 2.303125 0.546875 0.437501 +v 2.303125 0.546875 -0.437499 +v 2.264063 0.640625 0.312501 +v 2.264063 0.640625 -0.312499 +v 2.248438 0.617188 0.203126 +v 2.248438 0.617188 -0.203124 +v 2.256250 0.429688 0.101563 +v 2.256250 0.429688 -0.101562 +v 2.287500 -0.101562 0.125001 +v 2.287500 -0.101562 -0.124999 +v 2.389063 -0.445312 0.210938 +v 2.389063 -0.445312 -0.210937 +v 2.412500 -0.703125 0.250001 +v 2.412500 -0.703125 -0.249999 +v 2.435938 -0.820312 0.265626 +v 2.435938 -0.820312 -0.265624 +v 2.467188 -0.914062 0.234376 +v 2.467188 -0.914062 -0.234374 +v 2.467188 -0.929688 0.164063 +v 2.467188 -0.929688 -0.164062 +v 2.459375 -0.945312 0.000001 +v 2.373438 0.046875 0.000001 +v 2.334375 0.210938 0.000001 +v 2.357813 0.476562 0.328126 +v 2.357813 0.476562 -0.328124 +v 2.350000 0.140625 0.164063 +v 2.350000 0.140625 -0.164062 +v 2.342188 0.210938 0.132813 +v 2.342188 0.210938 -0.132812 +v 2.365625 -0.687500 0.117188 +v 2.365625 -0.687500 -0.117187 +v 2.350000 -0.445312 0.078126 +v 2.350000 -0.445312 -0.078124 +v 2.350000 -0.445312 0.000001 +v 2.357813 -0.328125 0.000001 +v 2.318750 -0.273438 0.093751 +v 2.318750 -0.273438 -0.093749 +v 2.303125 -0.226562 0.132813 +v 2.303125 -0.226562 -0.132812 +v 2.318750 -0.132812 0.109376 +v 2.318750 -0.132812 -0.109374 +v 2.318750 -0.125000 0.039063 +v 2.318750 -0.125000 -0.039062 +v 2.271875 -0.203125 0.000001 +v 2.287500 -0.148438 0.046876 +v 2.287500 -0.148438 -0.046874 +v 2.287500 -0.156250 0.093751 +v 2.287500 -0.156250 -0.093749 +v 2.271875 -0.226562 0.109376 +v 2.271875 -0.226562 -0.109374 +v 2.295313 -0.250000 0.078126 +v 2.295313 -0.250000 -0.078124 +v 2.295313 -0.289062 0.000001 +v 2.545313 -0.312500 0.257813 +v 2.545313 -0.312500 -0.257812 +v 2.389063 -0.242188 0.164063 +v 2.389063 -0.242188 -0.164062 +v 2.389063 -0.312500 0.179688 +v 2.389063 -0.312500 -0.179687 +v 2.545313 -0.250000 0.234376 +v 2.545313 -0.250000 -0.234374 +v 2.412500 -0.875000 0.000001 +v 2.412500 -0.867188 0.046876 +v 2.412500 -0.867188 -0.046874 +v 2.389063 -0.820312 0.093751 +v 2.389063 -0.820312 -0.093749 +v 2.373438 -0.742188 0.093751 +v 2.373438 -0.742188 -0.093749 +v 2.443750 -0.781250 0.000001 +v 2.435938 -0.750000 0.093751 +v 2.435938 -0.750000 -0.093749 +v 2.459375 -0.812500 0.093751 +v 2.459375 -0.812500 -0.093749 +v 2.467188 -0.851562 0.046876 +v 2.467188 -0.851562 -0.046874 +v 2.467188 -0.859375 0.000001 +v 2.318750 0.218750 0.171876 +v 2.318750 0.218750 -0.171874 +v 2.326563 0.156250 0.187501 +v 2.326563 0.156250 -0.187499 +v 2.342188 0.429688 0.335938 +v 2.342188 0.429688 -0.335937 +v 2.326563 0.421875 0.273438 +v 2.326563 0.421875 -0.273437 +v 2.326563 0.398438 0.421876 +v 2.326563 0.398438 -0.421874 +v 2.404688 0.351562 0.562501 +v 2.404688 0.351562 -0.562499 +v 2.412500 0.289062 0.585938 +v 2.412500 0.289062 -0.585937 +v 2.420313 0.195312 0.578126 +v 2.420313 0.195312 -0.578124 +v 2.381250 0.101562 0.476563 +v 2.381250 0.101562 -0.476562 +v 2.357813 0.062500 0.375001 +v 2.357813 0.062500 -0.374999 +v 2.318750 0.109375 0.226563 +v 2.318750 0.109375 -0.226562 +v 2.318750 0.296875 0.179688 +v 2.318750 0.296875 -0.179687 +v 2.318750 0.375000 0.210938 +v 2.318750 0.375000 -0.210937 +v 2.342188 0.359375 0.234376 +v 2.342188 0.359375 -0.234374 +v 2.342188 0.296875 0.195313 +v 2.342188 0.296875 -0.195312 +v 2.342188 0.125000 0.242188 +v 2.342188 0.125000 -0.242187 +v 2.373438 0.085938 0.375001 +v 2.373438 0.085938 -0.374999 +v 2.396875 0.117188 0.460938 +v 2.396875 0.117188 -0.460937 +v 2.428125 0.210938 0.546876 +v 2.428125 0.210938 -0.546874 +v 2.428125 0.281250 0.554688 +v 2.428125 0.281250 -0.554687 +v 2.420313 0.335938 0.531251 +v 2.420313 0.335938 -0.531249 +v 2.350000 0.390625 0.414063 +v 2.350000 0.390625 -0.414062 +v 2.334375 0.398438 0.281251 +v 2.334375 0.398438 -0.281249 +v 2.350000 0.406250 0.335938 +v 2.350000 0.406250 -0.335937 +v 2.350000 0.171875 0.203126 +v 2.350000 0.171875 -0.203124 +v 2.350000 0.226562 0.195313 +v 2.350000 0.226562 -0.195312 +v 2.490625 0.460938 0.109376 +v 2.490625 0.460938 -0.109374 +v 2.482813 0.664062 0.195313 +v 2.482813 0.664062 -0.195312 +v 2.506250 0.687500 0.335938 +v 2.506250 0.687500 -0.335937 +v 2.545313 0.554688 0.484376 +v 2.545313 0.554688 -0.484374 +v 2.607813 0.453125 0.679688 +v 2.607813 0.453125 -0.679687 +v 2.639063 0.406250 0.796876 +v 2.639063 0.406250 -0.796874 +v 2.725000 0.164062 0.773438 +v 2.725000 0.164062 -0.773437 +v 2.685938 0.000000 0.601563 +v 2.685938 0.000000 -0.601562 +v 2.631250 -0.093750 0.437501 +v 2.631250 -0.093750 -0.437499 +v 2.810938 0.898438 0.000001 +v 3.178125 0.984375 0.000001 +v 3.771875 -0.195312 0.000001 +v 2.912500 -0.460938 0.000001 +v 2.639063 -0.976562 0.000001 +v 2.756250 -0.804688 0.000001 +v 2.779688 -0.570312 0.000001 +v 2.818750 -0.484375 0.000001 +v 3.045313 0.234375 0.851563 +v 3.045313 0.234375 -0.851562 +v 3.146875 0.320312 0.859376 +v 3.146875 0.320312 -0.859374 +v 3.537500 0.265625 0.773438 +v 3.537500 0.265625 -0.773437 +v 3.803125 0.437500 0.460938 +v 3.803125 0.437500 -0.460937 +v 3.029688 -0.046875 0.734376 +v 3.029688 -0.046875 -0.734374 +v 3.264063 -0.125000 0.593751 +v 3.264063 -0.125000 -0.593749 +v 3.529688 -0.007812 0.640626 +v 3.529688 -0.007812 -0.640624 +v 3.764063 0.054688 0.335938 +v 3.764063 0.054688 -0.335937 +v 2.693750 -0.351562 0.234376 +v 2.693750 -0.351562 -0.234374 +v 2.842188 -0.414062 0.179688 +v 2.842188 -0.414062 -0.179687 +v 2.717188 -0.710938 0.289063 +v 2.717188 -0.710938 -0.289062 +v 2.709375 -0.500000 0.250001 +v 2.709375 -0.500000 -0.249999 +v 2.701563 -0.914062 0.328126 +v 2.701563 -0.914062 -0.328124 +v 2.732813 -0.757812 0.140626 +v 2.732813 -0.757812 -0.140624 +v 2.740625 -0.539062 0.125001 +v 2.740625 -0.539062 -0.124999 +v 2.662500 -0.945312 0.164063 +v 2.662500 -0.945312 -0.164062 +v 2.670313 -0.281250 0.218751 +v 2.670313 -0.281250 -0.218749 +v 2.631250 -0.226562 0.210938 +v 2.631250 -0.226562 -0.210937 +v 2.600000 -0.171875 0.203126 +v 2.600000 -0.171875 -0.203124 +v 2.935938 -0.390625 0.210938 +v 2.935938 -0.390625 -0.210937 +v 3.365625 -0.312500 0.296876 +v 3.365625 -0.312500 -0.296874 +v 3.639063 -0.148438 0.343751 +v 3.639063 -0.148438 -0.343749 +v 3.482813 0.867188 0.453126 +v 3.482813 0.867188 -0.453124 +v 3.170313 0.929688 0.453126 +v 3.170313 0.929688 -0.453124 +v 2.865625 0.851562 0.453126 +v 2.865625 0.851562 -0.453124 +v 2.670313 0.523438 0.460938 +v 2.670313 0.523438 -0.460937 +v 2.764063 0.406250 0.726563 +v 2.764063 0.406250 -0.726562 +v 2.818750 0.453125 0.632813 +v 2.818750 0.453125 -0.632812 +v 3.045313 0.703125 0.640626 +v 3.045313 0.703125 -0.640624 +v 2.975000 0.562500 0.796876 +v 2.975000 0.562500 -0.796874 +v 3.217188 0.617188 0.796876 +v 3.217188 0.617188 -0.796874 +v 3.295313 0.750000 0.640626 +v 3.295313 0.750000 -0.640624 +v 3.545313 0.679688 0.640626 +v 3.545313 0.679688 -0.640624 +v 3.459375 0.539062 0.796876 +v 3.459375 0.539062 -0.796874 +v 3.685938 0.328125 0.617188 +v 3.685938 0.328125 -0.617187 +v 3.646875 0.023438 0.484376 +v 3.646875 0.023438 -0.484374 +v 3.303125 0.328125 0.820313 +v 3.303125 0.328125 -0.820312 +v 2.951563 -0.171875 0.406251 +v 2.951563 -0.171875 -0.406249 +v 3.310938 -0.195312 0.429688 +v 3.310938 -0.195312 -0.429687 +v 3.334375 0.406250 0.890626 +v 3.334375 0.406250 -0.890624 +v 3.225000 -0.140625 0.773438 +v 3.225000 -0.140625 -0.773437 +v 3.428125 -0.101562 1.039063 +v 3.428125 -0.101562 -1.039062 +v 3.529688 0.054688 1.281251 +v 3.529688 0.054688 -1.281249 +v 3.521875 0.320312 1.351563 +v 3.521875 0.320312 -1.351562 +v 3.521875 0.507812 1.234376 +v 3.521875 0.507812 -1.234374 +v 3.412500 0.476562 1.023438 +v 3.412500 0.476562 -1.023437 +v 3.389063 0.414062 1.015626 +v 3.389063 0.414062 -1.015624 +v 3.490625 0.437500 1.187501 +v 3.490625 0.437500 -1.187499 +v 3.506250 0.289062 1.265626 +v 3.506250 0.289062 -1.265624 +v 3.506250 0.078125 1.210938 +v 3.506250 0.078125 -1.210937 +v 3.404688 -0.039062 1.031251 +v 3.404688 -0.039062 -1.031249 +v 3.232813 -0.070312 0.828126 +v 3.232813 -0.070312 -0.828124 +v 3.318750 0.359375 0.921876 +v 3.318750 0.359375 -0.921874 +v 3.389063 0.304688 0.945313 +v 3.389063 0.304688 -0.945312 +v 3.310938 -0.023438 0.882813 +v 3.310938 -0.023438 -0.882812 +v 3.467188 0.000000 1.039063 +v 3.467188 0.000000 -1.039062 +v 3.545313 0.093750 1.187501 +v 3.545313 0.093750 -1.187499 +v 3.545313 0.250000 1.234376 +v 3.545313 0.250000 -1.234374 +v 3.537500 0.359375 1.171876 +v 3.537500 0.359375 -1.171874 +v 3.459375 0.343750 1.023438 +v 3.459375 0.343750 -1.023437 +v 3.310938 0.289062 0.843751 +v 3.310938 0.289062 -0.843749 +v 3.373438 0.171875 0.835938 +v 3.373438 0.171875 -0.835937 +v 3.373438 0.093750 0.757813 +v 3.373438 0.093750 -0.757812 +v 3.373438 0.085938 0.820313 +v 3.373438 0.085938 -0.820312 +v 3.373438 0.015625 0.843751 +v 3.373438 0.015625 -0.843749 +v 3.373438 -0.015625 0.812501 +v 3.373438 -0.015625 -0.812499 +v 3.170313 0.000000 0.726563 +v 3.170313 0.000000 -0.726562 +v 3.271875 -0.023438 0.718751 +v 3.271875 -0.023438 -0.718749 +v 3.287500 0.039062 0.718751 +v 3.287500 0.039062 -0.718749 +v 3.310938 0.203125 0.796876 +v 3.310938 0.203125 -0.796874 +v 3.365625 0.242188 0.890626 +v 3.365625 0.242188 -0.890624 +v 3.420313 0.234375 0.890626 +v 3.420313 0.234375 -0.890624 +v 3.420313 -0.015625 0.812501 +v 3.420313 -0.015625 -0.812499 +v 3.420313 0.015625 0.851563 +v 3.420313 0.015625 -0.851562 +v 3.420313 0.078125 0.828126 +v 3.420313 0.078125 -0.828124 +v 3.420313 0.093750 0.765626 +v 3.420313 0.093750 -0.765624 +v 3.420313 0.171875 0.843751 +v 3.420313 0.171875 -0.843749 +v 3.514063 0.328125 1.039063 +v 3.514063 0.328125 -1.039062 +v 3.584375 0.343750 1.187501 +v 3.584375 0.343750 -1.187499 +v 3.592188 0.242188 1.257813 +v 3.592188 0.242188 -1.257812 +v 3.584375 0.085938 1.210938 +v 3.584375 0.085938 -1.210937 +v 3.521875 0.000000 1.046876 +v 3.521875 0.000000 -1.046874 +v 3.365625 -0.015625 0.882813 +v 3.365625 -0.015625 -0.882812 +v 3.443750 0.289062 0.953126 +v 3.443750 0.289062 -0.953124 +v 3.428125 0.109375 0.890626 +v 3.428125 0.109375 -0.890624 +v 3.435938 0.062500 0.937501 +v 3.435938 0.062500 -0.937499 +v 3.467188 0.125000 1.000001 +v 3.467188 0.125000 -0.999999 +v 3.451563 0.171875 0.960938 +v 3.451563 0.171875 -0.960937 +v 3.475000 0.234375 1.015626 +v 3.475000 0.234375 -1.015624 +v 3.482813 0.187500 1.054688 +v 3.482813 0.187500 -1.054687 +v 3.490625 0.210938 1.109376 +v 3.490625 0.210938 -1.109374 +v 3.490625 0.273438 1.085938 +v 3.490625 0.273438 -1.085937 +v 3.584375 0.437500 1.023438 +v 3.584375 0.437500 -1.023437 +v 3.646875 0.468750 1.250001 +v 3.646875 0.468750 -1.249999 +v 3.600000 0.296875 1.367188 +v 3.600000 0.296875 -1.367187 +v 3.631250 0.054688 1.312501 +v 3.631250 0.054688 -1.312499 +v 3.592188 -0.085938 1.039063 +v 3.592188 -0.085938 -1.039062 +v 3.428125 -0.125000 0.789063 +v 3.428125 -0.125000 -0.789062 +v 3.482813 0.382812 0.859376 +v 3.482813 0.382812 -0.859374 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn -0.7194 -0.2008 0.6650 +vn -0.7194 -0.2008 -0.6650 +vn -0.4689 -0.3036 0.8294 +vn -0.4689 -0.3036 -0.8294 +vn -0.4449 -0.7933 0.4155 +vn -0.4449 -0.7933 -0.4155 +vn -0.7820 -0.5089 0.3600 +vn -0.7820 -0.5089 -0.3600 +vn -0.8384 -0.5394 -0.0787 +vn -0.8384 -0.5394 0.0787 +vn -0.4685 -0.8413 -0.2696 +vn -0.4685 -0.8413 0.2696 +vn -0.5420 -0.3352 -0.7707 +vn -0.5420 -0.3352 0.7707 +vn -0.8616 -0.1940 -0.4689 +vn -0.8617 -0.1940 0.4689 +vn -0.8581 0.1907 -0.4767 +vn -0.8581 0.1907 0.4767 +vn -0.5521 0.3264 -0.7672 +vn -0.5521 0.3264 0.7672 +vn -0.5182 0.8173 -0.2519 +vn -0.5182 0.8173 0.2519 +vn -0.8164 0.5696 -0.0949 +vn -0.8164 0.5696 0.0949 +vn -0.7597 0.5370 0.3667 +vn -0.7597 0.5370 -0.3667 +vn -0.4898 0.7672 0.4141 +vn -0.4898 0.7672 -0.4141 +vn -0.4771 0.2952 0.8277 +vn -0.4771 0.2952 -0.8277 +vn -0.7145 0.1971 0.6713 +vn -0.7145 0.1971 -0.6713 +vn 0.4867 0.3244 0.8111 +vn 0.4867 0.3244 -0.8111 +vn 0.5334 0.8206 0.2052 +vn 0.5334 0.8206 -0.2052 +vn 0.4607 0.7806 -0.4223 +vn 0.4607 0.7806 0.4223 +vn 0.4658 0.3225 -0.8241 +vn 0.4658 0.3225 0.8241 +vn 0.4650 -0.3487 -0.8137 +vn 0.4650 -0.3487 0.8137 +vn 0.4607 -0.7806 -0.4223 +vn 0.4607 -0.7806 0.4223 +vn 0.5334 -0.8206 0.2052 +vn 0.5334 -0.8206 -0.2052 +vn 0.4875 -0.3510 0.7995 +vn 0.4875 -0.3510 -0.7995 +vn -0.9144 -0.0623 0.4000 +vn -0.9144 -0.0623 -0.4000 +vn -0.9354 -0.1754 0.3069 +vn -0.9354 -0.1754 -0.3069 +vn -0.9785 -0.1835 0.0945 +vn -0.9785 -0.1835 -0.0945 +vn -0.9977 -0.0283 -0.0624 +vn -0.9977 -0.0283 0.0624 +vn -0.9977 0.0260 -0.0624 +vn -0.9977 0.0260 0.0624 +vn -0.9799 0.1729 0.0996 +vn -0.9799 0.1729 -0.0996 +vn -0.9383 0.1656 0.3036 +vn -0.9383 0.1656 -0.3036 +vn -0.9147 0.0572 0.4002 +vn -0.9147 0.0572 -0.4002 +vn -0.4924 -0.8616 0.1231 +vn -0.4924 -0.8616 -0.1231 +vn -0.4520 -0.8647 0.2190 +vn -0.4520 -0.8647 -0.2190 +vn -0.6668 -0.4550 0.5902 +vn -0.6668 -0.4550 -0.5902 +vn -0.6374 -0.0506 0.7689 +vn -0.6374 -0.0506 -0.7689 +vn -0.6197 0.0900 0.7796 +vn -0.6197 0.0900 -0.7796 +vn -0.4739 -0.8188 0.3241 +vn -0.4739 -0.8188 -0.3241 +vn -0.6417 -0.6629 0.3857 +vn -0.6417 -0.6629 -0.3857 +vn -0.5906 -0.4193 0.6895 +vn -0.5906 -0.4193 -0.6895 +vn -0.6588 -0.3634 0.6588 +vn -0.6588 -0.3634 -0.6588 +vn -0.7509 0.3707 0.5465 +vn -0.7509 0.3707 -0.5465 +vn -0.5706 0.6464 0.5064 +vn -0.5706 0.6464 -0.5064 +vn -0.6015 0.5167 0.6092 +vn -0.6015 0.5167 -0.6092 +vn -0.7491 0.6610 -0.0441 +vn -0.7491 0.6610 0.0441 +vn -0.6110 0.3187 -0.7246 +vn -0.6110 0.3187 0.7246 +vn -0.5880 0.5554 -0.5880 +vn -0.5880 0.5554 0.5880 +vn -0.7482 -0.3909 0.5361 +vn -0.7482 -0.3909 -0.5361 +vn -0.8552 -0.4690 0.2207 +vn -0.8552 -0.4690 -0.2207 +vn -0.8429 -0.5321 -0.0794 +vn -0.8429 -0.5321 0.0794 +vn -0.7490 -0.6575 -0.0825 +vn -0.7490 -0.6575 0.0825 +vn -0.8226 -0.5667 0.0457 +vn -0.8226 -0.5667 -0.0457 +vn -0.9365 -0.2130 0.2784 +vn -0.9365 -0.2130 -0.2784 +vn -0.9063 -0.1824 0.3813 +vn -0.9063 -0.1824 -0.3813 +vn -0.8969 -0.2878 0.3357 +vn -0.8969 -0.2878 -0.3357 +vn -0.9246 0.0603 0.3762 +vn -0.9246 0.0603 -0.3762 +vn -0.9539 0.2680 -0.1352 +vn -0.9539 0.2680 0.1352 +vn -0.8102 -0.4321 0.3961 +vn -0.8102 -0.4321 -0.3961 +vn -0.9510 -0.2474 0.1856 +vn -0.9510 -0.2474 -0.1856 +vn -0.9808 -0.1948 0.0099 +vn -0.9808 -0.1948 -0.0099 +vn -0.7138 -0.6966 0.0721 +vn -0.7138 -0.6966 -0.0721 +vn -0.7986 -0.5723 0.1863 +vn -0.7986 -0.5723 -0.1863 +vn -0.9094 -0.2708 0.3157 +vn -0.9094 -0.2708 -0.3157 +vn -0.9516 -0.0265 0.3063 +vn -0.9516 -0.0265 -0.3063 +vn -0.9361 -0.1306 0.3266 +vn -0.9361 -0.1306 -0.3266 +vn -0.9983 0.0574 -0.0137 +vn -0.9983 0.0574 0.0137 +vn -0.9978 -0.0656 -0.0026 +vn -0.9978 -0.0656 0.0026 +vn -1.0000 0.0000 0.0000 +vn 0.0442 -0.5744 0.8174 +vn 0.0442 -0.5744 -0.8174 +vn 0.2144 0.2297 0.9494 +vn 0.2144 0.2297 -0.9494 +vn 0.4124 0.9073 0.0825 +vn 0.4124 0.9073 -0.0825 +vn -0.3047 0.3555 -0.8836 +vn -0.3047 0.3555 0.8836 +vn -0.2218 -0.8797 0.4207 +vn -0.2218 -0.8797 -0.4207 +vn -0.7663 -0.5747 0.2873 +vn -0.7663 -0.5747 -0.2873 +vn -0.4580 0.6019 -0.6542 +vn -0.4580 0.6019 0.6542 +vn -0.6051 0.7892 0.1052 +vn -0.6051 0.7892 -0.1052 +vn -0.5832 0.2916 0.7582 +vn -0.5832 0.2916 -0.7582 +vn -0.5834 -0.7130 0.3889 +vn -0.5834 -0.7130 -0.3889 +vn -0.9718 0.2314 0.0463 +vn -0.9718 0.2314 -0.0463 +vn -0.9151 -0.4018 0.0335 +vn -0.9151 -0.4018 -0.0335 +vn -0.8809 -0.1610 -0.4452 +vn -0.8809 -0.1610 0.4452 +vn -0.8729 -0.4364 -0.2182 +vn -0.8729 -0.4364 0.2182 +vn -0.8916 -0.1290 0.4341 +vn -0.8916 -0.1290 -0.4341 +vn -0.9524 0.0501 0.3008 +vn -0.9524 0.0501 -0.3008 +vn -0.4996 0.3010 0.8123 +vn -0.4996 0.3010 -0.8123 +vn -0.4093 0.2574 0.8753 +vn -0.4093 0.2574 -0.8753 +vn -0.3060 0.1601 0.9385 +vn -0.3060 0.1601 -0.9385 +vn -0.7227 -0.6539 0.2237 +vn -0.7227 -0.6539 -0.2237 +vn -0.9677 -0.1997 -0.1536 +vn -0.9677 -0.1997 0.1536 +vn -0.9565 -0.1025 -0.2733 +vn -0.9565 -0.1025 0.2733 +vn -0.9759 0.1952 -0.0976 +vn -0.9759 0.1952 0.0976 +vn -0.2713 0.9494 -0.1582 +vn -0.2713 0.9494 0.1582 +vn -0.1328 0.7082 -0.6934 +vn -0.1328 0.7082 0.6934 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -0.1181 -0.9450 0.3051 +vn -0.1181 -0.9450 -0.3051 +vn -0.9541 -0.2981 0.0298 +vn -0.9541 -0.2981 -0.0298 +vn -0.9277 -0.3479 0.1353 +vn -0.9277 -0.3479 -0.1353 +vn -0.8158 -0.2755 -0.5085 +vn -0.8158 -0.2755 0.5085 +vn -0.9223 -0.0419 -0.3843 +vn -0.9223 -0.0419 0.3843 +vn -0.9774 0.0374 -0.2083 +vn -0.9774 0.0374 0.2083 +vn -0.6674 -0.4767 -0.5721 +vn -0.6674 -0.4767 0.5721 +vn -0.6435 -0.7531 -0.1369 +vn -0.6435 -0.7531 0.1369 +vn -0.6814 -0.6071 0.4088 +vn -0.6814 -0.6071 -0.4088 +vn -0.7070 -0.4130 0.5740 +vn -0.7070 -0.4130 -0.5740 +vn -0.8183 -0.0968 0.5665 +vn -0.8183 -0.0968 -0.5665 +vn -0.8129 0.1180 0.5703 +vn -0.8129 0.1180 -0.5703 +vn -0.6719 0.5621 0.4823 +vn -0.6719 0.5621 -0.4823 +vn -0.7473 0.6114 0.2604 +vn -0.7473 0.6114 -0.2604 +vn -0.9182 0.3607 0.1640 +vn -0.9182 0.3607 -0.1640 +vn -0.9682 0.2495 -0.0178 +vn -0.9682 0.2495 0.0178 +vn -0.8481 -0.4166 0.3273 +vn -0.8481 -0.4166 -0.3273 +vn -0.9235 -0.2610 0.2811 +vn -0.9235 -0.2610 -0.2811 +vn -0.7149 -0.6514 -0.2542 +vn -0.7149 -0.6514 0.2542 +vn -0.5333 -0.8455 -0.0260 +vn -0.5333 -0.8455 0.0260 +vn -0.8991 -0.2606 -0.3518 +vn -0.8991 -0.2606 0.3518 +vn -0.9358 -0.0110 -0.3523 +vn -0.9358 -0.0110 0.3523 +vn -0.8777 0.4608 -0.1317 +vn -0.8777 0.4608 0.1317 +vn -0.7870 0.6160 -0.0342 +vn -0.7870 0.6160 0.0342 +vn -0.7277 0.5836 0.3603 +vn -0.7277 0.5836 -0.3603 +vn -0.6858 0.5300 0.4988 +vn -0.6858 0.5300 -0.4988 +vn -0.6667 -0.3333 0.6667 +vn -0.6667 -0.3333 -0.6667 +vn -0.5727 -0.0731 0.8165 +vn -0.5727 -0.0731 -0.8165 +vn -0.6098 0.1161 0.7840 +vn -0.6098 0.1161 -0.7840 +vn 0.2461 0.8111 -0.5306 +vn 0.2461 0.8111 0.5306 +vn 0.3730 0.3695 -0.8511 +vn 0.3730 0.3695 0.8511 +vn 0.4331 0.8675 -0.2446 +vn 0.4331 0.8675 0.2446 +vn 0.3030 0.7465 0.5924 +vn 0.3030 0.7465 -0.5924 +vn 0.3118 0.8758 0.3685 +vn 0.3118 0.8758 -0.3685 +vn 0.2880 0.9151 0.2821 +vn 0.2880 0.9151 -0.2821 +vn 0.4991 0.1340 0.8561 +vn 0.4991 0.1340 -0.8561 +vn 0.4376 -0.7233 0.5342 +vn 0.4376 -0.7233 -0.5342 +vn 0.4368 -0.8131 0.3849 +vn 0.4368 -0.8131 -0.3849 +vn 0.7800 -0.5806 0.2335 +vn 0.7800 -0.5806 -0.2335 +vn 0.9678 -0.0583 0.2449 +vn 0.9678 -0.0583 -0.2449 +vn 0.8837 -0.4535 0.1163 +vn 0.8837 -0.4535 -0.1163 +vn 0.1388 -0.9836 0.1152 +vn 0.1388 -0.9836 -0.1152 +vn 0.2260 -0.9669 0.1184 +vn 0.2260 -0.9669 -0.1184 +vn 0.2808 -0.0085 0.9597 +vn 0.2808 -0.0085 -0.9597 +vn 0.3242 0.1629 0.9319 +vn 0.3242 0.1629 -0.9319 +vn 0.9865 0.0207 0.1626 +vn 0.9865 0.0207 -0.1626 +vn 0.9758 -0.2177 -0.0188 +vn 0.9758 -0.2177 0.0188 +vn 0.5884 -0.2926 0.7538 +vn 0.5884 -0.2926 -0.7538 +vn 0.3678 0.1379 0.9196 +vn 0.3678 0.1379 -0.9196 +vn 0.1944 0.3127 0.9297 +vn 0.1944 0.3127 -0.9297 +vn 0.2329 0.3376 0.9120 +vn 0.2329 0.3376 -0.9120 +vn 0.0607 0.3338 0.9407 +vn 0.0607 0.3338 -0.9407 +vn 0.4402 -0.8805 0.1761 +vn 0.4402 -0.8805 -0.1761 +vn 0.7991 -0.4733 0.3708 +vn 0.7991 -0.4733 -0.3708 +vn 0.4660 -0.8284 0.3107 +vn 0.4660 -0.8284 -0.3107 +vn 0.1287 -0.9515 0.2793 +vn 0.1287 -0.9515 -0.2793 +vn 0.1807 -0.9321 0.3139 +vn 0.1807 -0.9321 -0.3139 +vn 0.0609 -0.2083 0.9762 +vn 0.0609 -0.2083 -0.9762 +vn -0.2447 -0.5066 0.8267 +vn -0.2447 -0.5066 -0.8267 +vn 0.9315 -0.1158 0.3449 +vn 0.9315 -0.1158 -0.3449 +vn -0.2355 0.9644 0.1203 +vn -0.2355 0.9644 -0.1203 +vn 0.1851 0.9744 0.1275 +vn 0.1851 0.9744 -0.1275 +vn 0.7241 0.5947 0.3492 +vn 0.7241 0.5947 -0.3492 +vn 0.1449 0.8981 0.4153 +vn 0.1449 0.8981 -0.4153 +vn -0.6863 0.7036 0.1845 +vn -0.6863 0.7036 -0.1845 +vn -0.1608 0.7794 0.6056 +vn -0.1608 0.7794 -0.6056 +vn 0.2053 0.6806 0.7033 +vn 0.2053 0.6806 -0.7033 +vn 0.7166 0.2007 0.6679 +vn 0.7166 0.2007 -0.6679 +vn 0.7528 0.4342 0.4948 +vn 0.7528 0.4342 -0.4948 +vn 0.1761 0.7459 0.6423 +vn 0.1761 0.7459 -0.6423 +vn -0.1530 0.6788 0.7182 +vn -0.1530 0.6788 -0.7182 +vn -0.5444 0.3972 0.7388 +vn -0.5444 0.3972 -0.7388 +vn 0.1579 0.9261 0.3428 +vn 0.1579 0.9261 -0.3428 +vn -0.7867 0.5740 0.2270 +vn -0.7867 0.5740 -0.2270 +vn 0.9795 0.1046 -0.1722 +vn 0.9795 0.1046 0.1722 +vn -0.4013 0.9150 0.0425 +vn -0.4013 0.9150 -0.0425 +vn -0.9694 0.1847 -0.1616 +vn -0.9694 0.1847 0.1616 +vn -0.0483 0.1973 0.9791 +vn -0.0483 0.1973 -0.9791 +vn -0.3079 0.0918 0.9470 +vn -0.3079 0.0918 -0.9470 +vn 0.0661 0.1905 0.9794 +vn 0.0661 0.1905 -0.9794 +vn 0.1070 0.0312 0.9938 +vn 0.1070 0.0312 -0.9938 +vn -0.0501 -0.7008 0.7116 +vn -0.0501 -0.7008 -0.7116 +vn -0.0847 -0.9243 0.3722 +vn -0.0847 -0.9243 -0.3722 +vn -0.2310 -0.8644 0.4465 +vn -0.2310 -0.8644 -0.4465 +vn -0.2405 -0.7578 0.6066 +vn -0.2405 -0.7578 -0.6066 +vn -0.2407 -0.6368 0.7325 +vn -0.2407 -0.6368 -0.7325 +vn -0.8533 -0.4499 0.2637 +vn -0.8533 -0.4499 -0.2637 +vn 0.7673 -0.3181 0.5568 +vn 0.7673 -0.3181 -0.5568 +vn 0.8190 -0.2807 0.5004 +vn 0.8190 -0.2807 -0.5004 +vn 0.4205 -0.8494 0.3190 +vn 0.4205 -0.8494 -0.3190 +vn 0.2793 -0.6356 0.7198 +vn 0.2793 -0.6356 -0.7198 +vn 0.7473 -0.4408 0.4972 +vn 0.7473 -0.4408 -0.4972 +vn -0.8557 0.3807 0.3506 +vn -0.8557 0.3807 -0.3506 +vn -0.8730 0.1715 0.4566 +vn -0.8730 0.1715 -0.4566 +vn -0.9603 0.1055 0.2583 +vn -0.9603 0.1055 -0.2583 +vn -0.9661 -0.0802 0.2455 +vn -0.9661 -0.0802 -0.2455 +vn -0.8837 -0.0599 0.4643 +vn -0.8837 -0.0599 -0.4643 +vn -0.7210 -0.3045 0.6225 +vn -0.7210 -0.3045 -0.6225 +vn -0.6027 0.6590 0.4500 +vn -0.6027 0.6590 -0.4500 +vn -0.4884 0.8309 -0.2667 +vn -0.4884 0.8309 0.2667 +vn -0.5111 0.2291 -0.8284 +vn -0.5111 0.2291 0.8284 +vn -0.7727 -0.3566 -0.5251 +vn -0.7727 -0.3566 0.5251 +vn -0.6873 -0.5665 0.4546 +vn -0.6873 -0.5665 -0.4546 +vn -0.5552 -0.4497 0.6996 +vn -0.5552 -0.4497 -0.6996 +vn 0.1126 -0.6827 0.7220 +vn 0.1126 -0.6827 -0.7220 +vn -0.9388 0.2860 -0.1919 +vn -0.9388 0.2860 0.1919 +vn 0.2047 -0.3734 0.9048 +vn 0.2047 -0.3734 -0.9048 +vn -0.9825 0.1551 0.1034 +vn -0.9825 0.1551 -0.1034 +vn -0.3530 0.9318 0.0841 +vn -0.3530 0.9318 -0.0841 +vn -0.7594 -0.0883 0.6446 +vn -0.7594 -0.0883 -0.6446 +vn -0.7678 0.4740 0.4309 +vn -0.7678 0.4740 -0.4309 +vn -0.3462 -0.4847 0.8032 +vn -0.3462 -0.4847 -0.8032 +vn -0.7014 -0.4128 0.5811 +vn -0.7014 -0.4128 -0.5811 +vn -0.6822 -0.4305 0.5910 +vn -0.6822 -0.4305 -0.5910 +vn 0.0591 -0.1804 0.9818 +vn 0.0591 -0.1804 -0.9818 +vn 0.1175 -0.3965 0.9105 +vn 0.1175 -0.3965 -0.9105 +vn 0.0725 -0.0181 0.9972 +vn 0.0725 -0.0181 -0.9972 +vn -0.1925 -0.6543 0.7313 +vn -0.1925 -0.6543 -0.7313 +vn -0.1073 -0.6079 0.7867 +vn -0.1073 -0.6079 -0.7867 +vn -0.1170 -0.7022 0.7022 +vn -0.1170 -0.7022 -0.7022 +vn 0.0511 0.9816 0.1840 +vn 0.0511 0.9816 -0.1840 +vn -0.1284 0.3301 0.9352 +vn -0.1284 0.3301 -0.9352 +vn -0.0553 -0.7463 0.6633 +vn -0.0553 -0.7463 -0.6633 +vn -0.0767 0.9970 -0.0085 +vn -0.0767 0.9970 0.0085 +vn -0.3354 -0.7061 0.6237 +vn -0.3354 -0.7061 -0.6237 +vn -0.3587 -0.8925 0.2733 +vn -0.3587 -0.8925 -0.2733 +vn 0.2200 -0.5080 -0.8328 +vn 0.2200 -0.5080 0.8328 +vn 0.4981 0.2377 -0.8339 +vn 0.4981 0.2377 0.8339 +vn 0.2539 0.7847 -0.5655 +vn 0.2539 0.7847 0.5655 +vn -0.0672 0.9962 -0.0560 +vn -0.0672 0.9962 0.0560 +vn -0.9893 0.0222 0.1445 +vn -0.9893 0.0222 -0.1445 +vn -0.9427 0.0645 0.3275 +vn -0.9427 0.0645 -0.3275 +vn -0.9496 0.0232 0.3127 +vn -0.9496 0.0232 -0.3127 +vn -0.9849 0.0274 0.1710 +vn -0.9849 0.0274 -0.1710 +vn -0.8929 0.2849 0.3487 +vn -0.8929 0.2849 -0.3487 +vn -0.9156 -0.0343 0.4006 +vn -0.9156 -0.0343 -0.4006 +vn -0.9645 -0.0603 0.2572 +vn -0.9645 -0.0603 -0.2572 +vn -0.9979 -0.0106 0.0637 +vn -0.9979 -0.0106 -0.0637 +vn -0.6101 0.7039 -0.3637 +vn -0.6101 0.7039 0.3637 +vn -0.7759 0.0355 0.6299 +vn -0.7759 0.0355 -0.6299 +vn -0.8717 -0.2002 0.4472 +vn -0.8717 -0.2002 -0.4472 +vn -0.8348 -0.2141 0.5072 +vn -0.8348 -0.2141 -0.5072 +vn -0.8093 0.2619 0.5258 +vn -0.8093 0.2619 -0.5258 +vn -0.7580 0.5802 0.2980 +vn -0.7580 0.5802 -0.2980 +vn 0.0805 -0.9924 0.0930 +vn 0.0805 -0.9924 -0.0930 +vn -0.0080 -0.8657 0.5006 +vn -0.0080 -0.8657 -0.5006 +vn -0.2748 -0.2497 0.9285 +vn -0.2748 -0.2497 -0.9285 +vn 0.0378 0.5424 0.8393 +vn 0.0378 0.5424 -0.8393 +vn 0.2589 0.9367 -0.2355 +vn 0.2589 0.9367 0.2355 +vn 0.1285 0.8838 -0.4499 +vn 0.1285 0.8838 0.4499 +vn 0.8427 -0.0098 -0.5384 +vn 0.8427 -0.0098 0.5384 +vn 0.9813 -0.0241 -0.1910 +vn 0.9813 -0.0241 0.1910 +vn 0.9141 0.0266 0.4046 +vn 0.9141 0.0266 -0.4046 +vn -0.0197 0.6231 -0.7819 +vn -0.0197 0.6231 0.7819 +vn 0.8142 -0.2063 0.5428 +vn 0.8142 -0.2063 -0.5428 +vn 0.2945 -0.9231 -0.2474 +vn 0.2945 -0.9231 0.2474 +usemtl None +s off +f 3089/3337/2995 3043/3338/2995 3045/3339/2995 3087/3340/2995 +f 3046/3341/2996 3044/3342/2996 3090/3343/2996 3088/3344/2996 +f 3087/3340/2997 3045/3339/2997 3047/3345/2997 3085/3346/2997 +f 3048/3347/2998 3046/3341/2998 3088/3344/2998 3086/3348/2998 +f 3045/3339/2999 3051/3349/2999 3049/3350/2999 3047/3345/2999 +f 3050/3351/3000 3052/3352/3000 3046/3341/3000 3048/3347/3000 +f 3043/3338/3001 3053/3353/3001 3051/3349/3001 3045/3339/3001 +f 3052/3352/3002 3054/3354/3002 3044/3342/3002 3046/3341/3002 +f 3053/3353/3003 3055/3355/3003 3057/3356/3003 3051/3349/3003 +f 3058/3357/3004 3056/3358/3004 3054/3354/3004 3052/3352/3004 +f 3051/3349/3005 3057/3356/3005 3059/3359/3005 3049/3350/3005 +f 3060/3360/3006 3058/3357/3006 3052/3352/3006 3050/3351/3006 +f 3057/3356/3007 3063/3361/3007 3061/3362/3007 3059/3359/3007 +f 3062/3363/3008 3064/3364/3008 3058/3357/3008 3060/3360/3008 +f 3055/3355/3009 3065/3365/3009 3063/3361/3009 3057/3356/3009 +f 3064/3364/3010 3066/3366/3010 3056/3358/3010 3058/3357/3010 +f 3065/3365/3011 3067/3367/3011 3069/3368/3011 3063/3361/3011 +f 3070/3369/3012 3068/3370/3012 3066/3366/3012 3064/3364/3012 +f 3063/3361/3013 3069/3368/3013 3071/3371/3013 3061/3362/3013 +f 3072/3372/3014 3070/3369/3014 3064/3364/3014 3062/3363/3014 +f 3069/3368/3015 3075/3373/3015 3073/3374/3015 3071/3371/3015 +f 3074/3375/3016 3076/3376/3016 3070/3369/3016 3072/3372/3016 +f 3067/3367/3017 3077/3377/3017 3075/3373/3017 3069/3368/3017 +f 3076/3376/3018 3078/3378/3018 3068/3370/3018 3070/3369/3018 +f 3077/3377/3019 3079/3379/3019 3081/3380/3019 3075/3373/3019 +f 3082/3381/3020 3080/3382/3020 3078/3378/3020 3076/3376/3020 +f 3075/3373/3021 3081/3380/3021 3083/3383/3021 3073/3374/3021 +f 3084/3384/3022 3082/3381/3022 3076/3376/3022 3074/3375/3022 +f 3081/3380/3023 3087/3340/3023 3085/3346/3023 3083/3383/3023 +f 3086/3348/3024 3088/3344/3024 3082/3381/3024 3084/3384/3024 +f 3079/3379/3025 3089/3337/3025 3087/3340/3025 3081/3380/3025 +f 3088/3344/3026 3090/3343/3026 3080/3382/3026 3082/3381/3026 +f 3089/3337/3027 3079/3379/3027 3093/3385/3027 3091/3386/3027 +f 3094/3387/3028 3080/3382/3028 3090/3343/3028 3092/3388/3028 +f 3079/3379/3029 3077/3377/3029 3095/3389/3029 3093/3385/3029 +f 3096/3390/3030 3078/3378/3030 3080/3382/3030 3094/3387/3030 +f 3077/3377/3031 3067/3367/3031 3097/3391/3031 3095/3389/3031 +f 3098/3392/3032 3068/3370/3032 3078/3378/3032 3096/3390/3032 +f 3067/3367/3033 3065/3365/3033 3099/3393/3033 3097/3391/3033 +f 3100/3394/3034 3066/3366/3034 3068/3370/3034 3098/3392/3034 +f 3065/3365/3035 3055/3355/3035 3101/3395/3035 3099/3393/3035 +f 3102/3396/3036 3056/3358/3036 3066/3366/3036 3100/3394/3036 +f 3055/3355/3037 3053/3353/3037 3105/3397/3037 3101/3395/3037 +f 3106/3398/3038 3054/3354/3038 3056/3358/3038 3102/3396/3038 +f 3053/3353/3039 3043/3338/3039 3107/3399/3039 3105/3397/3039 +f 3108/3400/3040 3044/3342/3040 3054/3354/3040 3106/3398/3040 +f 3043/3338/3041 3089/3337/3041 3091/3386/3041 3107/3399/3041 +f 3092/3388/3042 3090/3343/3042 3044/3342/3042 3108/3400/3042 +f 3103/3401/3043 3107/3399/3043 3091/3386/3043 +f 3092/3388/3044 3108/3400/3044 3104/3402/3044 +f 3105/3397/3045 3107/3399/3045 3103/3401/3045 +f 3104/3402/3046 3108/3400/3046 3106/3398/3046 +f 3103/3401/3047 3101/3395/3047 3105/3397/3047 +f 3106/3398/3048 3102/3396/3048 3104/3402/3048 +f 3103/3401/3049 3099/3393/3049 3101/3395/3049 +f 3102/3396/3050 3100/3394/3050 3104/3402/3050 +f 3103/3401/3051 3097/3391/3051 3099/3393/3051 +f 3100/3394/3052 3098/3392/3052 3104/3402/3052 +f 3103/3401/3053 3095/3389/3053 3097/3391/3053 +f 3098/3392/3054 3096/3390/3054 3104/3402/3054 +f 3103/3401/3055 3093/3385/3055 3095/3389/3055 +f 3096/3390/3056 3094/3387/3056 3104/3402/3056 +f 3103/3401/3057 3091/3386/3057 3093/3385/3057 +f 3094/3387/3058 3092/3388/3058 3104/3402/3058 +f 3131/3403/3059 3216/3404/3059 3218/3405/3059 3133/3406/3059 +f 3218/3405/3060 3217/3407/3060 3132/3408/3060 3133/3406/3060 +f 3129/3409/3061 3214/3410/3061 3216/3404/3061 3131/3403/3061 +f 3217/3407/3062 3215/3411/3062 3130/3412/3062 3132/3408/3062 +f 3127/3413/3063 3212/3414/3063 3214/3410/3063 3129/3409/3063 +f 3215/3411/3064 3213/3415/3064 3128/3416/3064 3130/3412/3064 +f 3125/3417/3065 3210/3418/3065 3212/3414/3065 3127/3413/3065 +f 3213/3415/3066 3211/3419/3066 3126/3420/3066 3128/3416/3066 +f 3123/3421/3067 3208/3422/3067 3210/3418/3067 3125/3417/3067 +f 3211/3419/3068 3209/3423/3068 3124/3424/3068 3126/3420/3068 +f 3121/3425/3069 3134/3426/3069 3188/3427/3069 3206/3428/3069 +f 3189/3429/3070 3135/3430/3070 3122/3431/3070 3207/3432/3070 +f 3134/3426/3071 3136/3433/3071 3190/3434/3071 3188/3427/3071 +f 3191/3435/3072 3137/3436/3072 3135/3430/3072 3189/3429/3072 +f 3136/3433/3073 3138/3437/3073 3192/3438/3073 3190/3434/3073 +f 3193/3439/3074 3139/3440/3074 3137/3436/3074 3191/3435/3074 +f 3138/3437/3075 3140/3441/3075 3194/3442/3075 3192/3438/3075 +f 3195/3443/3076 3141/3444/3076 3139/3440/3076 3193/3439/3076 +f 3140/3441/3077 3142/3445/3077 3196/3446/3077 3194/3442/3077 +f 3197/3447/3078 3143/3448/3078 3141/3444/3078 3195/3443/3078 +f 3142/3445/3079 3144/3449/3079 3198/3450/3079 3196/3446/3079 +f 3199/3451/3080 3145/3452/3080 3143/3448/3080 3197/3447/3080 +f 3144/3449/3081 3146/3453/3081 3200/3454/3081 3198/3450/3081 +f 3201/3455/3082 3147/3456/3082 3145/3452/3082 3199/3451/3082 +f 3146/3453/3083 3148/3457/3083 3202/3458/3083 3200/3454/3083 +f 3203/3459/3084 3149/3460/3084 3147/3456/3084 3201/3455/3084 +f 3148/3457/3085 3150/3461/3085 3204/3462/3085 3202/3458/3085 +f 3205/3463/3086 3151/3464/3086 3149/3460/3086 3203/3459/3086 +f 3150/3461/3087 3109/3465/3087 3110/3466/3087 3204/3462/3087 +f 3110/3466/3088 3109/3465/3088 3151/3464/3088 3205/3463/3088 +f 3152/3467/3089 3170/3468/3089 3202/3458/3089 3204/3462/3089 +f 3203/3459/3090 3171/3469/3090 3153/3470/3090 3205/3463/3090 +f 3170/3468/3091 3221/3471/3091 3200/3454/3091 3202/3458/3091 +f 3201/3455/3092 3222/3472/3092 3171/3469/3092 3203/3459/3092 +f 3168/3473/3093 3198/3450/3093 3200/3454/3093 3221/3471/3093 +f 3201/3455/3094 3199/3451/3094 3169/3474/3094 3222/3472/3094 +f 3166/3475/3095 3196/3446/3095 3198/3450/3095 3168/3473/3095 +f 3199/3451/3096 3197/3447/3096 3167/3476/3096 3169/3474/3096 +f 3164/3477/3097 3194/3442/3097 3196/3446/3097 3166/3475/3097 +f 3197/3447/3098 3195/3443/3098 3165/3478/3098 3167/3476/3098 +f 3162/3479/3099 3192/3438/3099 3194/3442/3099 3164/3477/3099 +f 3195/3443/3100 3193/3439/3100 3163/3480/3100 3165/3478/3100 +f 3160/3481/3101 3190/3434/3101 3192/3438/3101 3162/3479/3101 +f 3193/3439/3102 3191/3435/3102 3161/3482/3102 3163/3480/3102 +f 3158/3483/3103 3188/3427/3103 3190/3434/3103 3160/3481/3103 +f 3191/3435/3104 3189/3429/3104 3159/3484/3104 3161/3482/3104 +f 3156/3485/3105 3206/3428/3105 3188/3427/3105 3158/3483/3105 +f 3189/3429/3106 3207/3432/3106 3157/3486/3106 3159/3484/3106 +f 3156/3485/3107 3223/3487/3107 3219/3488/3107 3206/3428/3107 +f 3219/3488/3108 3224/3489/3108 3157/3486/3108 3207/3432/3108 +f 3152/3467/3109 3204/3462/3109 3110/3466/3109 3154/3490/3109 +f 3110/3466/3110 3205/3463/3110 3153/3470/3110 3155/3491/3110 +f 3154/3490/3111 3110/3466/3111 3220/3492/3111 3225/3493/3111 +f 3220/3492/3112 3110/3466/3112 3155/3491/3112 3226/3494/3112 +f 3219/3488/3113 3223/3487/3113 3225/3493/3113 3220/3492/3113 +f 3226/3494/3114 3224/3489/3114 3219/3488/3114 3220/3492/3114 +f 3177/3495/3115 3179/3496/3115 3218/3405/3115 3216/3404/3115 +f 3218/3405/3116 3179/3496/3116 3178/3497/3116 3217/3407/3116 +f 3175/3498/3117 3177/3495/3117 3216/3404/3117 3214/3410/3117 +f 3217/3407/3118 3178/3497/3118 3176/3499/3118 3215/3411/3118 +f 3173/3500/3119 3175/3498/3119 3214/3410/3119 3212/3414/3119 +f 3215/3411/3120 3176/3499/3120 3174/3501/3120 3213/3415/3120 +f 3208/3422/3121 3229/3502/3121 3227/3503/3121 3210/3418/3121 +f 3228/3504/3122 3230/3505/3122 3209/3423/3122 3211/3419/3122 +f 3173/3500/3123 3212/3414/3123 3210/3418/3123 3227/3503/3123 +f 3211/3419/3124 3213/3415/3124 3174/3501/3124 3228/3504/3124 +f 3186/3506/3125 3232/3507/3125 3231/3508/3125 3229/3502/3125 +f 3231/3508/3126 3232/3507/3126 3187/3509/3126 3230/3505/3126 +f 3227/3503/3127 3229/3502/3127 3231/3508/3127 3111/3510/3127 +f 3231/3508/3128 3230/3505/3128 3228/3504/3128 3111/3510/3128 +f 3172/3511/3129 3173/3500/3129 3227/3503/3129 3111/3510/3129 +f 3228/3504/3129 3174/3501/3129 3172/3511/3129 3111/3510/3129 +f 3184/3512/3130 3235/3513/3130 3233/3514/3130 3186/3506/3130 +f 3234/3515/3131 3236/3516/3131 3185/3517/3131 3187/3509/3131 +f 3182/3518/3132 3237/3519/3132 3235/3513/3132 3184/3512/3132 +f 3236/3516/3133 3238/3520/3133 3183/3521/3133 3185/3517/3133 +f 3181/3522/3134 3239/3523/3134 3237/3519/3134 3182/3518/3134 +f 3238/3520/3135 3240/3524/3135 3181/3522/3135 3183/3521/3135 +f 3180/3525/3136 3113/3526/3136 3239/3523/3136 3181/3522/3136 +f 3240/3524/3137 3113/3526/3137 3180/3525/3137 3181/3522/3137 +f 3232/3507/3138 3186/3506/3138 3233/3514/3138 3112/3527/3138 +f 3234/3515/3139 3187/3509/3139 3232/3507/3139 3112/3527/3139 +f 3112/3527/3140 3233/3514/3140 3248/3528/3140 3250/3529/3140 +f 3249/3530/3141 3234/3515/3141 3112/3527/3141 3250/3529/3141 +f 3113/3526/3142 3241/3531/3142 3242/3532/3142 3239/3523/3142 +f 3243/3533/3143 3241/3531/3143 3113/3526/3143 3240/3524/3143 +f 3239/3523/3144 3242/3532/3144 3244/3534/3144 3237/3519/3144 +f 3245/3535/3145 3243/3533/3145 3240/3524/3145 3238/3520/3145 +f 3237/3519/3146 3244/3534/3146 3246/3536/3146 3235/3513/3146 +f 3247/3537/3147 3245/3535/3147 3238/3520/3147 3236/3516/3147 +f 3235/3513/3148 3246/3536/3148 3248/3528/3148 3233/3514/3148 +f 3249/3530/3149 3247/3537/3149 3236/3516/3149 3234/3515/3149 +f 3241/3531/3150 3246/3536/3150 3244/3534/3150 3242/3532/3150 +f 3245/3535/3151 3247/3537/3151 3241/3531/3151 3243/3533/3151 +f 3241/3531/3152 3250/3529/3152 3248/3528/3152 3246/3536/3152 +f 3249/3530/3153 3250/3529/3153 3241/3531/3153 3247/3537/3153 +f 3181/3522/3154 3182/3518/3154 3206/3428/3154 3219/3488/3154 +f 3207/3432/3155 3183/3521/3155 3181/3522/3155 3219/3488/3155 +f 3182/3518/3156 3184/3512/3156 3253/3538/3156 3206/3428/3156 +f 3254/3539/3157 3185/3517/3157 3183/3521/3157 3207/3432/3157 +f 3184/3512/3158 3186/3506/3158 3255/3540/3158 3253/3538/3158 +f 3256/3541/3159 3187/3509/3159 3185/3517/3159 3254/3539/3159 +f 3186/3506/3160 3229/3502/3160 3208/3422/3160 3255/3540/3160 +f 3209/3423/3161 3230/3505/3161 3187/3509/3161 3256/3541/3161 +f 3123/3421/3162 3251/3542/3162 3255/3540/3162 3208/3422/3162 +f 3256/3541/3163 3252/3543/3163 3124/3424/3163 3209/3423/3163 +f 3251/3542/3164 3257/3544/3164 3253/3538/3164 3255/3540/3164 +f 3254/3539/3165 3258/3545/3165 3252/3543/3165 3256/3541/3165 +f 3121/3425/3166 3206/3428/3166 3253/3538/3166 3257/3544/3166 +f 3254/3539/3167 3207/3432/3167 3122/3431/3167 3258/3545/3167 +f 3173/3500/3168 3172/3511/3168 3114/3546/3168 3264/3547/3168 +f 3114/3546/3169 3172/3511/3169 3174/3501/3169 3265/3548/3169 +f 3175/3498/3170 3173/3500/3170 3264/3547/3170 3262/3549/3170 +f 3265/3548/3171 3174/3501/3171 3176/3499/3171 3263/3550/3171 +f 3177/3495/3172 3175/3498/3172 3262/3549/3172 3260/3551/3172 +f 3263/3550/3173 3176/3499/3173 3178/3497/3173 3261/3552/3173 +f 3179/3496/3174 3177/3495/3174 3260/3551/3174 3259/3553/3174 +f 3261/3552/3175 3178/3497/3175 3179/3496/3175 3259/3553/3175 +f 3259/3553/3176 3260/3551/3176 3271/3554/3176 3273/3555/3176 +f 3272/3556/3177 3261/3552/3177 3259/3553/3177 3273/3555/3177 +f 3260/3551/3178 3262/3549/3178 3269/3557/3178 3271/3554/3178 +f 3270/3558/3179 3263/3550/3179 3261/3552/3179 3272/3556/3179 +f 3262/3549/3180 3264/3547/3180 3267/3559/3180 3269/3557/3180 +f 3268/3560/3181 3265/3548/3181 3263/3550/3181 3270/3558/3181 +f 3264/3547/3182 3114/3546/3182 3266/3561/3182 3267/3559/3182 +f 3266/3561/3183 3114/3546/3183 3265/3548/3183 3268/3560/3183 +f 3266/3561/3184 3273/3555/3184 3271/3554/3184 3267/3559/3184 +f 3272/3556/3185 3273/3555/3185 3266/3561/3185 3268/3560/3185 +f 3267/3559/3186 3271/3554/3186 3269/3557/3186 +f 3270/3558/3187 3272/3556/3187 3268/3560/3187 +f 3225/3493/3188 3223/3487/3188 3276/3562/3188 3274/3563/3188 +f 3277/3564/3189 3224/3489/3189 3226/3494/3189 3275/3565/3189 +f 3154/3490/3190 3225/3493/3190 3274/3563/3190 3296/3566/3190 +f 3275/3565/3191 3226/3494/3191 3155/3491/3191 3297/3567/3191 +f 3152/3467/3192 3154/3490/3192 3296/3566/3192 3298/3568/3192 +f 3297/3567/3193 3155/3491/3193 3153/3470/3193 3299/3569/3193 +f 3223/3487/3194 3156/3485/3194 3294/3570/3194 3276/3562/3194 +f 3295/3571/3195 3157/3486/3195 3224/3489/3195 3277/3564/3195 +f 3156/3485/3196 3158/3483/3196 3292/3572/3196 3294/3570/3196 +f 3293/3573/3197 3159/3484/3197 3157/3486/3197 3295/3571/3197 +f 3158/3483/3198 3160/3481/3198 3290/3574/3198 3292/3572/3198 +f 3291/3575/3199 3161/3482/3199 3159/3484/3199 3293/3573/3199 +f 3160/3481/3200 3162/3479/3200 3288/3576/3200 3290/3574/3200 +f 3289/3577/3201 3163/3480/3201 3161/3482/3201 3291/3575/3201 +f 3162/3479/3202 3164/3477/3202 3286/3578/3202 3288/3576/3202 +f 3287/3579/3203 3165/3478/3203 3163/3480/3203 3289/3577/3203 +f 3164/3477/3204 3166/3475/3204 3284/3580/3204 3286/3578/3204 +f 3285/3581/3205 3167/3476/3205 3165/3478/3205 3287/3579/3205 +f 3166/3475/3206 3168/3473/3206 3282/3582/3206 3284/3580/3206 +f 3283/3583/3207 3169/3474/3207 3167/3476/3207 3285/3581/3207 +f 3168/3473/3208 3221/3471/3208 3278/3584/3208 3282/3582/3208 +f 3279/3585/3209 3222/3472/3209 3169/3474/3209 3283/3583/3209 +f 3221/3471/3210 3170/3468/3210 3280/3586/3210 3278/3584/3210 +f 3281/3587/3211 3171/3469/3211 3222/3472/3211 3279/3585/3211 +f 3170/3468/3212 3152/3467/3212 3298/3568/3212 3280/3586/3212 +f 3299/3569/3213 3153/3470/3213 3171/3469/3213 3281/3587/3213 +f 3280/3586/3214 3298/3568/3214 3300/3588/3214 3318/3589/3214 +f 3301/3590/3215 3299/3569/3215 3281/3587/3215 3319/3591/3215 +f 3278/3584/3216 3280/3586/3216 3318/3589/3216 3320/3592/3216 +f 3319/3591/3217 3281/3587/3217 3279/3585/3217 3321/3593/3217 +f 3282/3582/3218 3278/3584/3218 3320/3592/3218 3316/3594/3218 +f 3321/3593/3219 3279/3585/3219 3283/3583/3219 3317/3595/3219 +f 3284/3580/3220 3282/3582/3220 3316/3594/3220 3314/3596/3220 +f 3317/3595/3221 3283/3583/3221 3285/3581/3221 3315/3597/3221 +f 3286/3578/3222 3284/3580/3222 3314/3596/3222 3312/3598/3222 +f 3315/3597/3223 3285/3581/3223 3287/3579/3223 3313/3599/3223 +f 3288/3576/3224 3286/3578/3224 3312/3598/3224 3310/3600/3224 +f 3313/3599/3225 3287/3579/3225 3289/3577/3225 3311/3601/3225 +f 3290/3574/3226 3288/3576/3226 3310/3600/3226 3308/3602/3226 +f 3311/3601/3227 3289/3577/3227 3291/3575/3227 3309/3603/3227 +f 3292/3572/3228 3290/3574/3228 3308/3602/3228 3306/3604/3228 +f 3309/3603/3229 3291/3575/3229 3293/3573/3229 3307/3605/3229 +f 3294/3570/3230 3292/3572/3230 3306/3604/3230 3304/3606/3230 +f 3307/3605/3231 3293/3573/3231 3295/3571/3231 3305/3607/3231 +f 3276/3562/3232 3294/3570/3232 3304/3606/3232 3322/3608/3232 +f 3305/3607/3233 3295/3571/3233 3277/3564/3233 3323/3609/3233 +f 3298/3568/3234 3296/3566/3234 3302/3610/3234 3300/3588/3234 +f 3303/3611/3235 3297/3567/3235 3299/3569/3235 3301/3590/3235 +f 3296/3566/3236 3274/3563/3236 3324/3612/3236 3302/3610/3236 +f 3325/3613/3237 3275/3565/3237 3297/3567/3237 3303/3611/3237 +f 3274/3563/3238 3276/3562/3238 3322/3608/3238 3324/3612/3238 +f 3323/3609/3239 3277/3564/3239 3275/3565/3239 3325/3613/3239 +f 3109/3465/3240 3150/3461/3240 3326/3614/3240 3115/3615/3240 +f 3327/3616/3241 3151/3464/3241 3109/3465/3241 3115/3615/3241 +f 3150/3461/3242 3148/3457/3242 3328/3617/3242 3326/3614/3242 +f 3329/3618/3243 3149/3460/3243 3151/3464/3243 3327/3616/3243 +f 3148/3457/3244 3146/3453/3244 3330/3619/3244 3328/3617/3244 +f 3331/3620/3245 3147/3456/3245 3149/3460/3245 3329/3618/3245 +f 3146/3453/3246 3144/3449/3246 3332/3621/3246 3330/3619/3246 +f 3333/3622/3247 3145/3452/3247 3147/3456/3247 3331/3620/3247 +f 3144/3449/3248 3142/3445/3248 3334/3623/3248 3332/3621/3248 +f 3335/3624/3249 3143/3448/3249 3145/3452/3249 3333/3622/3249 +f 3142/3445/3250 3140/3441/3250 3336/3625/3250 3334/3623/3250 +f 3337/3626/3251 3141/3444/3251 3143/3448/3251 3335/3624/3251 +f 3140/3441/3252 3138/3437/3252 3338/3627/3252 3336/3625/3252 +f 3339/3628/3253 3139/3440/3253 3141/3444/3253 3337/3626/3253 +f 3138/3437/3254 3136/3433/3254 3340/3629/3254 3338/3627/3254 +f 3341/3630/3255 3137/3436/3255 3139/3440/3255 3339/3628/3255 +f 3136/3433/3256 3134/3426/3256 3342/3631/3256 3340/3629/3256 +f 3343/3632/3257 3135/3430/3257 3137/3436/3257 3341/3630/3257 +f 3350/3633/3258 3351/3634/3258 3370/3635/3258 3380/3636/3258 +f 3371/3637/3259 3351/3638/3259 3350/3639/3259 3381/3640/3259 +f 3349/3641/3260 3350/3633/3260 3380/3636/3260 3378/3642/3260 +f 3381/3640/3261 3350/3639/3261 3349/3643/3261 3379/3644/3261 +f 3348/3645/3262 3349/3641/3262 3378/3642/3262 3382/3646/3262 +f 3379/3644/3263 3349/3643/3263 3348/3645/3263 3383/3647/3263 +f 3131/3403/3264 3133/3406/3264 3348/3645/3264 3382/3646/3264 +f 3348/3645/3265 3133/3406/3265 3132/3408/3265 3383/3647/3265 +f 3129/3409/3266 3131/3403/3266 3382/3646/3266 3376/3648/3266 +f 3383/3647/3267 3132/3408/3267 3130/3412/3267 3377/3649/3267 +f 3127/3413/3268 3129/3409/3268 3376/3648/3268 3372/3650/3268 +f 3377/3649/3269 3130/3412/3269 3128/3416/3269 3373/3651/3269 +f 3125/3417/3270 3127/3413/3270 3372/3650/3270 3374/3652/3270 +f 3373/3651/3271 3128/3416/3271 3126/3420/3271 3375/3653/3271 +f 3372/3650/3272 3378/3642/3272 3380/3636/3272 3374/3652/3272 +f 3381/3640/3273 3379/3644/3273 3373/3651/3273 3375/3653/3273 +f 3372/3650/3274 3376/3648/3274 3382/3646/3274 3378/3642/3274 +f 3383/3647/3275 3377/3649/3275 3373/3651/3275 3379/3644/3275 +f 3368/3654/3276 3374/3652/3276 3380/3636/3276 3370/3635/3276 +f 3381/3640/3277 3375/3653/3277 3369/3655/3277 3371/3637/3277 +f 3123/3421/3278 3125/3417/3278 3374/3652/3278 3368/3654/3278 +f 3375/3653/3279 3126/3420/3279 3124/3424/3279 3369/3655/3279 +f 3251/3542/3280 3384/3656/3280 3386/3657/3280 3257/3544/3280 +f 3387/3658/3281 3385/3659/3281 3252/3543/3281 3258/3545/3281 +f 3123/3421/3282 3368/3654/3282 3384/3656/3282 3251/3542/3282 +f 3385/3659/3283 3369/3655/3283 3124/3424/3283 3252/3543/3283 +f 3121/3425/3284 3257/3544/3284 3386/3657/3284 3388/3660/3284 +f 3387/3658/3285 3258/3545/3285 3122/3431/3285 3389/3661/3285 +f 3121/3425/3286 3388/3660/3286 3342/3631/3286 3134/3426/3286 +f 3343/3632/3287 3389/3661/3287 3122/3431/3287 3135/3430/3287 +f 3119/3662/3288 3366/3663/3288 3394/3664/3288 3346/3665/3288 +f 3395/3666/3289 3367/3667/3289 3119/3668/3289 3346/3669/3289 +f 3346/3665/3290 3394/3664/3290 3392/3670/3290 3120/3671/3290 +f 3393/3672/3291 3395/3666/3291 3346/3669/3291 3120/3673/3291 +f 3120/3671/3292 3392/3670/3292 3390/3674/3292 3347/3675/3292 +f 3391/3676/3293 3393/3672/3293 3120/3673/3293 3347/3677/3293 +f 3347/3675/3294 3390/3674/3294 3370/3635/3294 3351/3634/3294 +f 3371/3637/3295 3391/3676/3295 3347/3677/3295 3351/3638/3295 +f 3368/3654/3296 3370/3635/3296 3390/3674/3296 3384/3656/3296 +f 3391/3676/3297 3371/3637/3297 3369/3655/3297 3385/3659/3297 +f 3338/3627/3298 3340/3629/3298 3360/3678/3298 3352/3679/3298 +f 3361/3680/3299 3341/3630/3299 3339/3628/3299 3353/3681/3299 +f 3118/3682/3300 3358/3683/3300 3366/3663/3300 3119/3662/3300 +f 3367/3667/3301 3359/3684/3301 3118/3685/3301 3119/3668/3301 +f 3344/3686/3302 3400/3687/3302 3398/3688/3302 3345/3689/3302 +f 3399/3690/3303 3401/3691/3303 3344/3692/3303 3345/3693/3303 +f 3345/3689/3304 3398/3688/3304 3396/3694/3304 3117/3695/3304 +f 3397/3696/3305 3399/3690/3305 3345/3693/3305 3117/3697/3305 +f 3117/3695/3306 3396/3694/3306 3358/3683/3306 3118/3682/3306 +f 3359/3684/3307 3397/3696/3307 3117/3697/3307 3118/3685/3307 +f 3334/3698/3308 3336/3625/3308 3404/3699/3308 3406/3700/3308 +f 3405/3701/3309 3337/3626/3309 3335/3702/3309 3407/3703/3309 +f 3406/3700/3310 3404/3699/3310 3410/3704/3310 3408/3705/3310 +f 3411/3706/3311 3405/3701/3311 3407/3703/3311 3409/3707/3311 +f 3408/3705/3312 3410/3704/3312 3412/3708/3312 3414/3709/3312 +f 3413/3710/3313 3411/3706/3313 3409/3707/3313 3415/3711/3313 +f 3414/3709/3314 3412/3708/3314 3418/3712/3314 3416/3713/3314 +f 3419/3714/3315 3413/3710/3315 3415/3711/3315 3417/3715/3315 +f 3356/3716/3316 3420/3717/3316 3416/3713/3316 3418/3712/3316 +f 3417/3715/3317 3421/3718/3317 3357/3719/3317 3419/3714/3317 +f 3358/3683/3318 3396/3694/3318 3416/3713/3318 3420/3717/3318 +f 3417/3715/3319 3397/3696/3319 3359/3684/3319 3421/3718/3319 +f 3396/3694/3320 3398/3688/3320 3414/3709/3320 3416/3713/3320 +f 3415/3711/3321 3399/3690/3321 3397/3696/3321 3417/3715/3321 +f 3398/3688/3322 3400/3687/3322 3408/3705/3322 3414/3709/3322 +f 3409/3707/3323 3401/3691/3323 3399/3690/3323 3415/3711/3323 +f 3400/3687/3324 3402/3720/3324 3406/3700/3324 3408/3705/3324 +f 3407/3703/3325 3403/3721/3325 3401/3691/3325 3409/3707/3325 +f 3332/3722/3326 3334/3698/3326 3406/3700/3326 3402/3720/3326 +f 3407/3703/3327 3335/3702/3327 3333/3723/3327 3403/3721/3327 +f 3116/3724/3328 3402/3720/3328 3400/3687/3328 3344/3686/3328 +f 3401/3691/3329 3403/3721/3329 3116/3725/3329 3344/3692/3329 +f 3326/3726/3330 3328/3727/3330 3330/3728/3330 3332/3722/3330 +f 3331/3729/3331 3329/3730/3331 3327/3731/3331 3333/3723/3331 +f 3326/3726/3332 3332/3722/3332 3402/3720/3332 3116/3724/3332 +f 3403/3721/3333 3333/3723/3333 3327/3731/3333 3116/3725/3333 +f 3115/3732/3334 3326/3726/3334 3116/3724/3334 +f 3116/3725/3335 3327/3731/3335 3115/3733/3335 +f 3336/3625/3336 3338/3627/3336 3352/3679/3336 3404/3699/3336 +f 3353/3681/3337 3339/3628/3337 3337/3626/3337 3405/3701/3337 +f 3352/3679/3338 3354/3734/3338 3410/3704/3338 3404/3699/3338 +f 3411/3706/3339 3355/3735/3339 3353/3681/3339 3405/3701/3339 +f 3354/3734/3340 3424/3736/3340 3412/3708/3340 3410/3704/3340 +f 3413/3710/3341 3425/3737/3341 3355/3735/3341 3411/3706/3341 +f 3356/3716/3342 3418/3712/3342 3412/3708/3342 3424/3736/3342 +f 3413/3710/3343 3419/3714/3343 3357/3719/3343 3425/3737/3343 +f 3390/3674/3344 3392/3670/3344 3428/3738/3344 3426/3739/3344 +f 3429/3740/3345 3393/3672/3345 3391/3676/3345 3427/3741/3345 +f 3360/3678/3346 3426/3739/3346 3428/3738/3346 3362/3742/3346 +f 3429/3740/3347 3427/3741/3347 3361/3680/3347 3363/3743/3347 +f 3340/3629/3348 3342/3631/3348 3426/3739/3348 3360/3678/3348 +f 3427/3741/3349 3343/3632/3349 3341/3630/3349 3361/3680/3349 +f 3342/3631/3350 3386/3657/3350 3384/3656/3350 3426/3739/3350 +f 3385/3659/3351 3387/3658/3351 3343/3632/3351 3427/3741/3351 +f 3384/3656/3352 3390/3674/3352 3426/3739/3352 +f 3427/3741/3353 3391/3676/3353 3385/3659/3353 +f 3342/3631/3354 3388/3660/3354 3386/3657/3354 +f 3387/3658/3355 3389/3661/3355 3343/3632/3355 +f 3356/3716/3356 3364/3744/3356 3422/3745/3356 3420/3717/3356 +f 3423/3746/3357 3365/3747/3357 3357/3719/3357 3421/3718/3357 +f 3358/3683/3358 3420/3717/3358 3422/3745/3358 3366/3663/3358 +f 3423/3746/3359 3421/3718/3359 3359/3684/3359 3367/3667/3359 +f 3362/3742/3360 3428/3738/3360 3422/3745/3360 3364/3744/3360 +f 3423/3746/3361 3429/3740/3361 3363/3743/3361 3365/3747/3361 +f 3392/3670/3362 3394/3664/3362 3422/3745/3362 3428/3738/3362 +f 3423/3746/3363 3395/3666/3363 3393/3672/3363 3429/3740/3363 +f 3366/3663/3364 3422/3745/3364 3394/3664/3364 +f 3395/3666/3365 3423/3746/3365 3367/3667/3365 +f 3442/3748/3366 3430/3749/3366 3456/3750/3366 3444/3751/3366 +f 3457/3752/3367 3431/3753/3367 3443/3754/3367 3445/3755/3367 +f 3442/3748/3368 3444/3751/3368 3446/3756/3368 3440/3757/3368 +f 3447/3758/3369 3445/3755/3369 3443/3754/3369 3441/3759/3369 +f 3440/3757/3370 3446/3756/3370 3448/3760/3370 3438/3761/3370 +f 3449/3762/3371 3447/3758/3371 3441/3759/3371 3439/3763/3371 +f 3438/3761/3372 3448/3760/3372 3450/3764/3372 3436/3765/3372 +f 3451/3766/3373 3449/3762/3373 3439/3763/3373 3437/3767/3373 +f 3436/3765/3374 3450/3764/3374 3452/3768/3374 3434/3769/3374 +f 3453/3770/3375 3451/3766/3375 3437/3767/3375 3435/3771/3375 +f 3434/3769/3376 3452/3768/3376 3454/3772/3376 3432/3773/3376 +f 3455/3774/3377 3453/3770/3377 3435/3771/3377 3433/3775/3377 +f 3452/3768/3378 3462/3776/3378 3460/3777/3378 3454/3772/3378 +f 3461/3778/3379 3463/3779/3379 3453/3770/3379 3455/3774/3379 +f 3450/3764/3380 3464/3780/3380 3462/3776/3380 3452/3768/3380 +f 3463/3779/3381 3465/3781/3381 3451/3766/3381 3453/3770/3381 +f 3448/3760/3382 3466/3782/3382 3464/3780/3382 3450/3764/3382 +f 3465/3781/3383 3467/3783/3383 3449/3762/3383 3451/3766/3383 +f 3446/3756/3384 3468/3784/3384 3466/3782/3384 3448/3760/3384 +f 3467/3783/3385 3469/3785/3385 3447/3758/3385 3449/3762/3385 +f 3444/3751/3386 3470/3786/3386 3468/3784/3386 3446/3756/3386 +f 3469/3785/3387 3471/3787/3387 3445/3755/3387 3447/3758/3387 +f 3444/3751/3388 3456/3750/3388 3458/3788/3388 3470/3786/3388 +f 3459/3789/3389 3457/3752/3389 3445/3755/3389 3471/3787/3389 +f 3360/3678/3390 3362/3742/3390 3486/3790/3390 3484/3791/3390 +f 3487/3792/3391 3363/3743/3391 3361/3680/3391 3485/3793/3391 +f 3362/3794/3392 3432/3773/3392 3454/3772/3392 3486/3795/3392 +f 3455/3774/3393 3433/3775/3393 3363/3796/3393 3487/3797/3393 +f 3352/3679/3394 3360/3678/3394 3484/3791/3394 3354/3734/3394 +f 3485/3793/3395 3361/3680/3395 3353/3681/3395 3355/3735/3395 +f 3424/3798/3396 3472/3799/3396 3456/3750/3396 3430/3749/3396 +f 3457/3752/3397 3473/3800/3397 3425/3801/3397 3431/3753/3397 +f 3454/3772/3398 3460/3777/3398 3482/3802/3398 3486/3795/3398 +f 3483/3803/3399 3461/3778/3399 3455/3774/3399 3487/3797/3399 +f 3480/3804/3400 3488/3805/3400 3486/3795/3400 3482/3802/3400 +f 3487/3797/3401 3489/3806/3401 3481/3807/3401 3483/3803/3401 +f 3476/3808/3402 3488/3805/3402 3480/3804/3402 3478/3809/3402 +f 3481/3807/3403 3489/3806/3403 3477/3810/3403 3479/3811/3403 +f 3474/3812/3404 3490/3813/3404 3488/3805/3404 3476/3808/3404 +f 3489/3806/3405 3491/3814/3405 3475/3815/3405 3477/3810/3405 +f 3472/3799/3406 3490/3813/3406 3474/3812/3406 3492/3816/3406 +f 3475/3815/3407 3491/3814/3407 3473/3800/3407 3493/3817/3407 +f 3456/3750/3408 3472/3799/3408 3492/3816/3408 3458/3788/3408 +f 3493/3817/3409 3473/3800/3409 3457/3752/3409 3459/3789/3409 +f 3354/3734/3410 3490/3818/3410 3472/3819/3410 3424/3736/3410 +f 3473/3820/3411 3491/3821/3411 3355/3735/3411 3425/3737/3411 +f 3354/3734/3412 3484/3791/3412 3488/3822/3412 3490/3818/3412 +f 3489/3823/3413 3485/3793/3413 3355/3735/3413 3491/3821/3413 +f 3484/3791/3414 3486/3790/3414 3488/3822/3414 +f 3489/3823/3415 3487/3792/3415 3485/3793/3415 +f 3458/3788/3416 3492/3816/3416 3494/3824/3416 3518/3825/3416 +f 3495/3826/3417 3493/3817/3417 3459/3789/3417 3519/3827/3417 +f 3492/3816/3418 3474/3812/3418 3504/3828/3418 3494/3824/3418 +f 3505/3829/3419 3475/3815/3419 3493/3817/3419 3495/3826/3419 +f 3474/3812/3420 3476/3808/3420 3502/3830/3420 3504/3828/3420 +f 3503/3831/3421 3477/3810/3421 3475/3815/3421 3505/3829/3421 +f 3476/3808/3422 3478/3809/3422 3500/3832/3422 3502/3830/3422 +f 3501/3833/3423 3479/3811/3423 3477/3810/3423 3503/3831/3423 +f 3478/3809/3424 3480/3804/3424 3498/3834/3424 3500/3832/3424 +f 3499/3835/3425 3481/3807/3425 3479/3811/3425 3501/3833/3425 +f 3480/3804/3426 3482/3802/3426 3496/3836/3426 3498/3834/3426 +f 3497/3837/3427 3483/3803/3427 3481/3807/3427 3499/3835/3427 +f 3482/3802/3428 3460/3777/3428 3516/3838/3428 3496/3836/3428 +f 3517/3839/3429 3461/3778/3429 3483/3803/3429 3497/3837/3429 +f 3470/3786/3430 3458/3788/3430 3518/3825/3430 3506/3840/3430 +f 3519/3827/3431 3459/3789/3431 3471/3787/3431 3507/3841/3431 +f 3468/3784/3432 3470/3786/3432 3506/3840/3432 3508/3842/3432 +f 3507/3841/3433 3471/3787/3433 3469/3785/3433 3509/3843/3433 +f 3466/3782/3434 3468/3784/3434 3508/3842/3434 3510/3844/3434 +f 3509/3843/3435 3469/3785/3435 3467/3783/3435 3511/3845/3435 +f 3464/3780/3436 3466/3782/3436 3510/3844/3436 3512/3846/3436 +f 3511/3845/3437 3467/3783/3437 3465/3781/3437 3513/3847/3437 +f 3462/3776/3438 3464/3780/3438 3512/3846/3438 3514/3848/3438 +f 3513/3847/3439 3465/3781/3439 3463/3779/3439 3515/3849/3439 +f 3460/3777/3440 3462/3776/3440 3514/3848/3440 3516/3838/3440 +f 3515/3849/3441 3463/3779/3441 3461/3778/3441 3517/3839/3441 +f 3500/3832/3442 3498/3834/3442 3522/3850/3442 3520/3851/3442 +f 3523/3852/3443 3499/3835/3443 3501/3833/3443 3521/3853/3443 +f 3520/3851/3444 3522/3850/3444 3524/3854/3444 3526/3855/3444 +f 3525/3856/3445 3523/3852/3445 3521/3853/3445 3527/3857/3445 +f 3526/3855/3446 3524/3854/3446 3530/3858/3446 3528/3859/3446 +f 3531/3860/3447 3525/3856/3447 3527/3857/3447 3529/3861/3447 +f 3528/3859/3448 3530/3858/3448 3532/3862/3448 3534/3863/3448 +f 3533/3864/3449 3531/3860/3449 3529/3861/3449 3535/3865/3449 +f 3506/3840/3450 3518/3825/3450 3528/3859/3450 3534/3863/3450 +f 3529/3861/3451 3519/3827/3451 3507/3841/3451 3535/3865/3451 +f 3494/3824/3452 3526/3855/3452 3528/3859/3452 3518/3825/3452 +f 3529/3861/3453 3527/3857/3453 3495/3826/3453 3519/3827/3453 +f 3494/3824/3454 3504/3828/3454 3520/3851/3454 3526/3855/3454 +f 3521/3853/3455 3505/3829/3455 3495/3826/3455 3527/3857/3455 +f 3500/3832/3456 3520/3851/3456 3504/3828/3456 3502/3830/3456 +f 3505/3829/3457 3521/3853/3457 3501/3833/3457 3503/3831/3457 +f 3496/3836/3458 3516/3838/3458 3522/3850/3458 3498/3834/3458 +f 3523/3852/3459 3517/3839/3459 3497/3837/3459 3499/3835/3459 +f 3514/3848/3460 3524/3854/3460 3522/3850/3460 3516/3838/3460 +f 3523/3852/3461 3525/3856/3461 3515/3849/3461 3517/3839/3461 +f 3512/3846/3462 3530/3858/3462 3524/3854/3462 3514/3848/3462 +f 3525/3856/3463 3531/3860/3463 3513/3847/3463 3515/3849/3463 +f 3510/3844/3464 3532/3862/3464 3530/3858/3464 3512/3846/3464 +f 3531/3860/3465 3533/3864/3465 3511/3845/3465 3513/3847/3465 +f 3508/3842/3466 3534/3863/3466 3532/3862/3466 3510/3844/3466 +f 3533/3864/3467 3535/3865/3467 3509/3843/3467 3511/3845/3467 +f 3506/3840/3468 3534/3863/3468 3508/3842/3468 +f 3509/3843/3469 3535/3865/3469 3507/3841/3469 +f 3434/3769/3470 3432/3773/3470 3546/3866/3470 3544/3867/3470 +f 3547/3868/3471 3433/3775/3471 3435/3771/3471 3545/3869/3471 +f 3436/3765/3472 3434/3769/3472 3544/3867/3472 3542/3870/3472 +f 3545/3869/3473 3435/3771/3473 3437/3767/3473 3543/3871/3473 +f 3438/3761/3474 3436/3765/3474 3542/3870/3474 3540/3872/3474 +f 3543/3871/3475 3437/3767/3475 3439/3763/3475 3541/3873/3475 +f 3440/3874/3476 3438/3761/3476 3540/3872/3476 3538/3875/3476 +f 3541/3873/3477 3439/3763/3477 3441/3876/3477 3539/3877/3477 +f 3442/3878/3478 3440/3874/3478 3538/3875/3478 3536/3879/3478 +f 3539/3877/3479 3441/3876/3479 3443/3880/3479 3537/3881/3479 +f 3430/3882/3480 3442/3878/3480 3536/3879/3480 3548/3883/3480 +f 3537/3881/3481 3443/3880/3481 3431/3884/3481 3549/3885/3481 +f 3536/3879/3482 3544/3867/3482 3546/3866/3482 3548/3883/3482 +f 3547/3868/3483 3545/3869/3483 3537/3881/3483 3549/3885/3483 +f 3536/3879/3484 3538/3875/3484 3542/3870/3484 3544/3867/3484 +f 3543/3871/3485 3539/3877/3485 3537/3881/3485 3545/3869/3485 +f 3538/3875/3486 3540/3872/3486 3542/3870/3486 +f 3543/3871/3487 3541/3873/3487 3539/3877/3487 +f 3356/3716/3488 3424/3736/3488 3430/3886/3488 3548/3887/3488 +f 3431/3884/3489 3425/3888/3489 3357/3889/3489 3549/3885/3489 +f 3356/3890/3490 3548/3883/3490 3546/3866/3490 3364/3891/3490 +f 3547/3868/3491 3549/3885/3491 3357/3889/3491 3365/3892/3491 +f 3362/3794/3492 3364/3891/3492 3546/3866/3492 3432/3773/3492 +f 3547/3868/3493 3365/3892/3493 3363/3796/3493 3433/3775/3493 +g Suzanne.007_Suzanne +v 1.960013 0.164062 -1.341293 +v 1.341294 0.164062 -1.960012 +v 2.059449 0.093750 -1.352342 +v 1.352343 0.093750 -2.059448 +v 2.169935 0.054688 -1.396536 +v 1.396537 0.054688 -2.169934 +v 2.004207 -0.023438 -1.507021 +v 1.507022 -0.023438 -2.004206 +v 1.932391 0.031250 -1.435206 +v 1.435207 0.031250 -1.932390 +v 1.888197 0.132812 -1.391012 +v 1.391013 0.132812 -1.888196 +v 1.821906 0.164062 -1.435206 +v 1.435207 0.164062 -1.821905 +v 1.810857 0.093750 -1.523594 +v 1.523595 0.093750 -1.810856 +v 1.844003 0.054688 -1.623031 +v 1.623032 0.054688 -1.844002 +v 1.783236 0.242188 -1.672750 +v 1.672750 0.242188 -1.783235 +v 1.766663 0.242188 -1.567788 +v 1.567789 0.242188 -1.766662 +v 1.799809 0.242188 -1.457303 +v 1.457304 0.242188 -1.799808 +v 1.821906 0.328125 -1.435206 +v 1.435207 0.328125 -1.821905 +v 1.810857 0.390625 -1.523594 +v 1.523595 0.390625 -1.810856 +v 1.844003 0.437500 -1.623031 +v 1.623032 0.437500 -1.844002 +v 2.004207 0.515625 -1.507021 +v 1.507022 0.515625 -2.004206 +v 1.932391 0.453125 -1.435206 +v 1.435207 0.453125 -1.932390 +v 1.888197 0.359375 -1.391012 +v 1.391013 0.359375 -1.888196 +v 1.960013 0.328125 -1.341293 +v 1.341294 0.328125 -1.960012 +v 2.059449 0.390625 -1.352342 +v 1.352343 0.390625 -2.059448 +v 2.169935 0.437500 -1.396536 +v 1.396537 0.437500 -2.169934 +v 2.236226 0.242188 -1.352342 +v 1.352343 0.242188 -2.236225 +v 2.114692 0.242188 -1.319196 +v 1.319197 0.242188 -2.114691 +v 1.987634 0.242188 -1.324720 +v 1.324721 0.242188 -1.987633 +v 1.982110 0.242188 -1.308147 +v 1.308149 0.242188 -1.982109 +v 1.954488 0.335938 -1.324720 +v 1.324721 0.335938 -1.954487 +v 1.871624 0.375000 -1.374439 +v 1.374440 0.375000 -1.871623 +v 1.799809 0.335938 -1.424157 +v 1.424158 0.335938 -1.799808 +v 1.772187 0.242188 -1.451779 +v 1.451780 0.242188 -1.772186 +v 1.799809 0.156250 -1.424157 +v 1.424158 0.156250 -1.799808 +v 1.855051 0.242188 -1.357866 +v 1.357867 0.242188 -1.855050 +v 1.871624 0.117188 -1.374439 +v 1.374440 0.117188 -1.871623 +v 1.954488 0.156250 -1.324720 +v 1.324721 0.156250 -1.954487 +v 1.667226 0.429688 -1.667225 +v 1.611984 0.351562 -1.611982 +v 1.672750 -0.679688 -1.672750 +v 1.639605 -0.320312 -1.639604 +v 1.628556 -0.187500 -1.628555 +v 1.683799 -0.773438 -1.683798 +v 1.766663 0.406250 -1.766662 +v 1.788760 0.570312 -1.788759 +v 2.578731 0.898438 -2.578730 +v 2.794178 0.562500 -2.794176 +v 2.777605 0.070312 -2.777604 +v 2.440624 -0.382812 -2.440623 +v 1.937916 -0.187500 -1.650652 +v 1.650653 -0.187500 -1.937914 +v 2.009731 -0.437500 -1.567788 +v 1.567789 -0.437500 -2.009730 +v 2.037352 -0.695312 -1.540167 +v 1.540168 -0.695312 -2.037351 +v 2.076022 -0.890625 -1.556740 +v 1.556741 -0.890625 -2.076021 +v 2.053925 -0.945312 -1.589885 +v 1.589886 -0.945312 -2.053924 +v 1.926867 -0.968750 -1.672749 +v 1.672750 -0.968750 -1.926866 +v 1.783236 -0.984375 -1.783235 +v 2.125741 -0.140625 -1.507021 +v 1.507022 -0.140625 -2.125740 +v 2.258323 -0.039062 -1.363390 +v 1.363391 -0.039062 -2.258322 +v 2.462721 0.148438 -1.291575 +v 1.291576 0.148438 -2.462720 +v 2.379857 0.429688 -1.164516 +v 1.164518 0.429688 -2.379856 +v 2.252799 0.484375 -1.247380 +v 1.247382 0.484375 -2.252798 +v 2.053925 0.601562 -1.357866 +v 1.357867 0.601562 -2.053924 +v 1.899246 0.757812 -1.446254 +v 1.446255 0.757812 -1.899245 +v 1.766663 0.718750 -1.545691 +v 1.545692 0.718750 -1.766662 +v 1.705896 0.492188 -1.617507 +v 1.617508 0.492188 -1.705895 +v 1.761139 0.414062 -1.529118 +v 1.529119 0.414062 -1.761138 +v 1.739042 0.304688 -1.562264 +v 1.562265 0.304688 -1.739041 +v 1.810857 0.093750 -1.523594 +v 1.523595 0.093750 -1.810856 +v 1.960013 0.015625 -1.429681 +v 1.429682 0.015625 -1.960012 +v 2.064974 0.062500 -1.368914 +v 1.368916 0.062500 -2.064973 +v 2.175459 0.187500 -1.291575 +v 1.291576 0.187500 -2.175458 +v 2.186508 0.296875 -1.280526 +v 1.280527 0.296875 -2.186507 +v 2.147838 0.375000 -1.297099 +v 1.297100 0.375000 -2.147837 +v 1.987634 0.437500 -1.379963 +v 1.379964 0.437500 -1.987633 +v 1.832954 0.468750 -1.479400 +v 1.479401 0.468750 -1.832953 +v 1.672750 -0.765625 -1.672750 +v 1.750090 -0.718750 -1.595410 +v 1.595411 -0.718750 -1.750089 +v 1.772187 -0.835938 -1.606458 +v 1.606459 -0.835938 -1.772186 +v 1.744566 -0.882812 -1.656177 +v 1.656178 -0.882812 -1.744565 +v 1.705896 -0.890625 -1.705895 +v 1.661702 -0.195312 -1.661701 +v 1.667226 -0.140625 -1.667225 +v 1.739042 -0.148438 -1.595410 +v 1.595411 -0.148438 -1.739041 +v 1.750090 -0.226562 -1.573313 +v 1.573314 -0.226562 -1.750089 +v 1.727993 -0.289062 -1.606458 +v 1.606459 -0.289062 -1.727992 +v 1.998682 -0.046875 -1.435206 +v 1.435207 -0.046875 -1.998682 +v 2.186508 0.054688 -1.313672 +v 1.313673 0.054688 -2.186507 +v 2.280420 0.203125 -1.252905 +v 1.252906 0.203125 -2.280419 +v 2.252799 0.375000 -1.203186 +v 1.203187 0.375000 -2.252798 +v 2.164411 0.414062 -1.192138 +v 1.192139 0.414062 -2.164410 +v 1.937915 0.546875 -1.319196 +v 1.319197 0.546875 -1.937915 +v 1.821906 0.640625 -1.379963 +v 1.379964 0.640625 -1.821905 +v 1.733517 0.617188 -1.446254 +v 1.446255 0.617188 -1.733516 +v 1.667226 0.429688 -1.523594 +v 1.523595 0.429688 -1.667225 +v 1.705896 -0.101562 -1.529118 +v 1.529119 -0.101562 -1.705895 +v 1.838479 -0.445312 -1.540167 +v 1.540168 -0.445312 -1.838478 +v 1.882673 -0.703125 -1.529118 +v 1.529119 -0.703125 -1.882672 +v 1.910294 -0.820312 -1.534643 +v 1.534644 -0.820312 -1.910293 +v 1.910294 -0.914062 -1.578837 +v 1.578838 -0.914062 -1.910293 +v 1.860576 -0.929688 -1.628555 +v 1.628556 -0.929688 -1.860575 +v 1.739042 -0.945312 -1.739041 +v 1.678275 0.046875 -1.678274 +v 1.650653 0.210938 -1.650652 +v 1.899246 0.476562 -1.435206 +v 1.435207 0.476562 -1.899245 +v 1.777712 0.140625 -1.545691 +v 1.545692 0.140625 -1.777711 +v 1.750090 0.210938 -1.562264 +v 1.562265 0.210938 -1.750089 +v 1.755615 -0.687500 -1.589885 +v 1.589886 -0.687500 -1.755614 +v 1.716945 -0.445312 -1.606458 +v 1.606459 -0.445312 -1.716944 +v 1.661702 -0.445312 -1.661701 +v 1.667226 -0.328125 -1.667225 +v 1.705896 -0.273438 -1.573313 +v 1.573314 -0.273438 -1.705895 +v 1.722469 -0.226562 -1.534643 +v 1.534644 -0.226562 -1.722468 +v 1.716945 -0.132812 -1.562264 +v 1.562265 -0.132812 -1.716944 +v 1.667226 -0.125000 -1.611982 +v 1.611984 -0.125000 -1.667225 +v 1.606459 -0.203125 -1.606458 +v 1.650653 -0.148438 -1.584361 +v 1.584362 -0.148438 -1.650652 +v 1.683799 -0.156250 -1.551215 +v 1.551216 -0.156250 -1.683798 +v 1.683799 -0.226562 -1.529118 +v 1.529119 -0.226562 -1.683798 +v 1.678275 -0.250000 -1.567788 +v 1.567789 -0.250000 -1.678274 +v 1.623032 -0.289062 -1.623031 +v 1.982110 -0.312500 -1.617507 +v 1.617508 -0.312500 -1.982109 +v 1.805333 -0.242188 -1.573313 +v 1.573314 -0.242188 -1.805332 +v 1.816381 -0.312500 -1.562264 +v 1.562265 -0.312500 -1.816381 +v 1.965537 -0.250000 -1.634079 +v 1.634081 -0.250000 -1.965536 +v 1.705896 -0.875000 -1.705895 +v 1.739042 -0.867188 -1.672750 +v 1.672750 -0.867188 -1.739041 +v 1.755615 -0.820312 -1.623031 +v 1.623032 -0.820312 -1.755614 +v 1.744566 -0.742188 -1.611982 +v 1.611984 -0.742188 -1.744565 +v 1.727993 -0.781250 -1.727992 +v 1.788760 -0.750000 -1.656177 +v 1.656178 -0.750000 -1.788759 +v 1.805333 -0.812500 -1.672749 +v 1.672750 -0.812500 -1.805332 +v 1.777712 -0.851562 -1.711419 +v 1.711420 -0.851562 -1.777711 +v 1.744566 -0.859375 -1.744565 +v 1.761139 0.218750 -1.518070 +v 1.518071 0.218750 -1.761138 +v 1.777712 0.156250 -1.512546 +v 1.512547 0.156250 -1.777711 +v 1.893721 0.429688 -1.418633 +v 1.418634 0.429688 -1.893720 +v 1.838479 0.421875 -1.451779 +v 1.451780 0.421875 -1.838478 +v 1.943440 0.398438 -1.346817 +v 1.346819 0.398438 -1.943439 +v 2.098119 0.351562 -1.302623 +v 1.302624 0.351562 -2.098119 +v 2.120216 0.289062 -1.291575 +v 1.291576 0.289062 -2.120215 +v 2.120216 0.195312 -1.302623 +v 1.302624 0.195312 -2.120215 +v 2.020780 0.101562 -1.346817 +v 1.346818 0.101562 -2.020779 +v 1.932391 0.062500 -1.402060 +v 1.402061 0.062500 -1.932390 +v 1.799809 0.109375 -1.479400 +v 1.479401 0.109375 -1.799808 +v 1.766663 0.296875 -1.512546 +v 1.512547 0.296875 -1.766662 +v 1.788760 0.375000 -1.490448 +v 1.490450 0.375000 -1.788759 +v 1.821906 0.359375 -1.490448 +v 1.490450 0.359375 -1.821905 +v 1.794284 0.296875 -1.518070 +v 1.518071 0.296875 -1.794283 +v 1.827430 0.125000 -1.484924 +v 1.484925 0.125000 -1.827429 +v 1.943440 0.085938 -1.413109 +v 1.413110 0.085938 -1.943439 +v 2.020780 0.117188 -1.368914 +v 1.368916 0.117188 -2.020779 +v 2.103644 0.210938 -1.330245 +v 1.330246 0.210938 -2.103643 +v 2.109168 0.281250 -1.324720 +v 1.324721 0.281250 -2.109167 +v 2.087071 0.335938 -1.335769 +v 1.335770 0.335938 -2.087070 +v 1.954488 0.390625 -1.368914 +v 1.368916 0.390625 -1.954487 +v 1.849527 0.398438 -1.451779 +v 1.451780 0.398438 -1.849526 +v 1.899246 0.406250 -1.424157 +v 1.424158 0.406250 -1.899245 +v 1.805333 0.171875 -1.518070 +v 1.518071 0.171875 -1.805332 +v 1.799809 0.226562 -1.523594 +v 1.523595 0.226562 -1.799808 +v 1.838479 0.460938 -1.683798 +v 1.683799 0.460938 -1.838478 +v 1.893721 0.664062 -1.617507 +v 1.617508 0.664062 -1.893720 +v 2.009731 0.687500 -1.534643 +v 1.534644 0.687500 -2.009730 +v 2.142313 0.554688 -1.457303 +v 1.457304 0.554688 -2.142313 +v 2.324615 0.453125 -1.363390 +v 1.363391 0.453125 -2.324614 +v 2.429576 0.406250 -1.302623 +v 1.302624 0.406250 -2.429575 +v 2.473770 0.164062 -1.379963 +v 1.379964 0.164062 -2.473769 +v 2.324615 0.000000 -1.473876 +v 1.473877 0.000000 -2.324614 +v 2.169935 -0.093750 -1.551215 +v 1.551217 -0.093750 -2.169934 +v 1.987634 0.898438 -1.987633 +v 2.247275 0.984375 -2.247274 +v 2.667120 -0.195312 -2.667118 +v 2.059450 -0.460938 -2.059448 +v 1.866100 -0.976562 -1.866099 +v 1.948964 -0.804688 -1.948963 +v 1.965537 -0.570312 -1.965536 +v 1.993158 -0.484375 -1.993157 +v 2.755508 0.234375 -1.551215 +v 1.551217 0.234375 -2.755507 +v 2.832848 0.320312 -1.617507 +v 1.617508 0.320312 -2.832847 +v 3.048294 0.265625 -1.954487 +v 1.954489 0.265625 -3.048293 +v 3.015149 0.437500 -2.363283 +v 2.363285 0.437500 -3.015147 +v 2.661595 -0.046875 -1.623031 +v 1.623032 -0.046875 -2.661594 +v 2.727886 -0.125000 -1.888196 +v 1.888197 -0.125000 -2.727885 +v 2.948857 -0.007812 -2.042876 +v 2.042877 -0.007812 -2.948856 +v 2.899139 0.054688 -2.424050 +v 2.424052 0.054688 -2.899137 +v 2.070498 -0.351562 -1.739041 +v 1.739042 -0.351562 -2.070497 +v 2.136789 -0.414062 -1.882672 +v 1.882673 -0.414062 -2.136788 +v 2.125741 -0.710938 -1.716944 +v 1.716945 -0.710938 -2.125740 +v 2.092595 -0.500000 -1.739041 +v 1.739042 -0.500000 -2.092594 +v 2.142313 -0.914062 -1.678274 +v 1.678275 -0.914062 -2.142313 +v 2.031828 -0.757812 -1.832953 +v 1.832954 -0.757812 -2.031827 +v 2.026304 -0.539062 -1.849526 +v 1.849527 -0.539062 -2.026303 +v 1.998682 -0.945312 -1.766662 +v 1.766663 -0.945312 -1.998681 +v 2.042877 -0.281250 -1.733516 +v 1.733518 -0.281250 -2.042876 +v 2.009731 -0.226562 -1.711419 +v 1.711420 -0.226562 -2.009730 +v 1.982110 -0.171875 -1.694847 +v 1.694848 -0.171875 -1.982109 +v 2.225178 -0.390625 -1.926866 +v 1.926867 -0.390625 -2.225177 +v 2.589780 -0.312500 -2.169934 +v 2.169935 -0.312500 -2.589778 +v 2.816275 -0.148438 -2.330137 +v 2.330139 -0.148438 -2.816274 +v 2.783129 0.867188 -2.142312 +v 2.142314 0.867188 -2.783128 +v 2.562158 0.929688 -1.921342 +v 1.921343 0.929688 -2.562157 +v 2.346712 0.851562 -1.705895 +v 1.705896 0.851562 -2.346711 +v 2.214129 0.523438 -1.562264 +v 1.562265 0.523438 -2.214128 +v 2.468246 0.406250 -1.440730 +v 1.440731 0.406250 -2.468245 +v 2.440624 0.453125 -1.545691 +v 1.545692 0.453125 -2.440623 +v 2.606352 0.703125 -1.700371 +v 1.700372 0.703125 -2.606351 +v 2.667119 0.562500 -1.540167 +v 1.540168 0.562500 -2.667118 +v 2.838372 0.617188 -1.711419 +v 1.711421 0.617188 -2.838371 +v 2.783129 0.750000 -1.877147 +v 1.877149 0.750000 -2.783128 +v 2.959906 0.679688 -2.053924 +v 2.053926 0.679688 -2.959905 +v 3.009624 0.539062 -1.882672 +v 1.882673 0.539062 -3.009623 +v 3.042770 0.328125 -2.169934 +v 2.169935 0.328125 -3.042769 +v 2.921236 0.023438 -2.236225 +v 2.236226 0.023438 -2.921235 +v 2.915712 0.328125 -1.755613 +v 1.755615 0.328125 -2.915710 +v 2.374333 -0.171875 -1.799808 +v 1.799809 -0.171875 -2.374332 +v 2.645022 -0.195312 -2.037351 +v 2.037353 -0.195312 -2.645021 +v 2.987527 0.406250 -1.727992 +v 1.727993 0.406250 -2.987526 +v 2.827323 -0.140625 -1.733516 +v 1.733518 -0.140625 -2.827322 +v 3.158780 -0.101562 -1.689322 +v 1.689324 -0.101562 -3.158779 +v 3.401847 0.054688 -1.589885 +v 1.589887 0.054688 -3.401846 +v 3.446042 0.320312 -1.534642 +v 1.534644 0.320312 -3.446041 +v 3.363178 0.507812 -1.617507 +v 1.617508 0.507812 -3.363177 +v 3.136683 0.476562 -1.689322 +v 1.689324 0.476562 -3.136682 +v 3.114585 0.414062 -1.678273 +v 1.678275 0.414062 -3.114584 +v 3.307935 0.437500 -1.628555 +v 1.628557 0.437500 -3.307934 +v 3.374226 0.289062 -1.584361 +v 1.584362 0.289062 -3.374225 +v 3.335556 0.078125 -1.623031 +v 1.623032 0.078125 -3.335555 +v 3.136683 -0.039062 -1.678273 +v 1.678275 -0.039062 -3.136682 +v 2.871517 -0.070312 -1.700371 +v 1.700372 -0.070312 -2.871516 +v 2.998576 0.359375 -1.694846 +v 1.694848 0.359375 -2.998575 +v 3.064867 0.304688 -1.727992 +v 1.727993 0.304688 -3.064866 +v 2.965430 -0.023438 -1.716944 +v 1.716945 -0.023438 -2.965429 +v 3.186401 0.000000 -1.716943 +v 1.716945 0.000000 -3.186400 +v 3.346605 0.093750 -1.667225 +v 1.667227 0.093750 -3.346604 +v 3.379750 0.250000 -1.634079 +v 1.634081 0.250000 -3.379749 +v 3.330032 0.359375 -1.672749 +v 1.672751 0.359375 -3.330031 +v 3.169828 0.343750 -1.722468 +v 1.722469 0.343750 -3.169827 +v 2.937809 0.289062 -1.744565 +v 1.744566 0.289062 -2.937808 +v 2.976479 0.171875 -1.794283 +v 1.794285 0.171875 -2.976478 +v 2.921236 0.093750 -1.849526 +v 1.849527 0.093750 -2.921235 +v 2.965430 0.085938 -1.805332 +v 1.805333 0.085938 -2.965429 +v 2.982003 0.015625 -1.788759 +v 1.788760 0.015625 -2.982002 +v 2.959906 -0.015625 -1.810856 +v 1.810858 -0.015625 -2.959905 +v 2.755508 0.000000 -1.727992 +v 1.727993 0.000000 -2.755507 +v 2.821799 -0.023438 -1.805332 +v 1.805333 -0.023438 -2.821798 +v 2.832848 0.039062 -1.816380 +v 1.816382 0.039062 -2.832846 +v 2.904663 0.203125 -1.777710 +v 1.777712 0.203125 -2.904662 +v 3.009624 0.242188 -1.750089 +v 1.750090 0.242188 -3.009623 +v 3.048294 0.234375 -1.788759 +v 1.788760 0.234375 -3.048293 +v 2.993052 -0.015625 -1.844002 +v 1.844003 -0.015625 -2.993050 +v 3.020673 0.015625 -1.816380 +v 1.816382 0.015625 -3.020672 +v 3.004100 0.078125 -1.832953 +v 1.832955 0.078125 -3.004099 +v 2.959906 0.093750 -1.877147 +v 1.877149 0.093750 -2.959905 +v 3.015149 0.171875 -1.821905 +v 1.821906 0.171875 -3.015147 +v 3.219547 0.328125 -1.750089 +v 1.750091 0.328125 -3.219546 +v 3.374226 0.343750 -1.694846 +v 1.694848 0.343750 -3.374225 +v 3.429469 0.242188 -1.650652 +v 1.650654 0.242188 -3.429468 +v 3.390799 0.085938 -1.678273 +v 1.678275 0.085938 -3.390798 +v 3.230595 0.000000 -1.750089 +v 1.750091 0.000000 -3.230594 +v 3.004100 -0.015625 -1.755613 +v 1.755615 -0.015625 -3.004099 +v 3.109061 0.289062 -1.761137 +v 1.761139 0.289062 -3.109060 +v 3.053818 0.109375 -1.794283 +v 1.794285 0.109375 -3.053817 +v 3.092488 0.062500 -1.766662 +v 1.766663 0.062500 -3.092487 +v 3.158780 0.125000 -1.744565 +v 1.744566 0.125000 -3.158779 +v 3.120110 0.171875 -1.761138 +v 1.761139 0.171875 -3.120109 +v 3.175352 0.234375 -1.739040 +v 1.739042 0.234375 -3.175351 +v 3.208498 0.187500 -1.716943 +v 1.716945 0.187500 -3.208497 +v 3.252692 0.210938 -1.683798 +v 1.683799 0.210938 -3.252691 +v 3.236119 0.273438 -1.700371 +v 1.700372 0.273438 -3.236118 +v 3.258216 0.437500 -1.810856 +v 1.810858 0.437500 -3.258215 +v 3.462615 0.468750 -1.694846 +v 1.694848 0.468750 -3.462614 +v 3.512333 0.296875 -1.578837 +v 1.578838 0.296875 -3.512332 +v 3.495760 0.054688 -1.639603 +v 1.639605 0.054688 -3.495759 +v 3.274789 -0.085938 -1.805332 +v 1.805333 -0.085938 -3.274788 +v 2.982003 -0.125000 -1.866099 +v 1.866100 -0.125000 -2.982002 +v 3.070391 0.382812 -1.855050 +v 1.855052 0.382812 -3.070390 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn -0.0384 -0.2008 0.9789 +vn -0.9789 -0.2008 0.0384 +vn 0.2549 -0.3036 0.9181 +vn -0.9181 -0.3036 -0.2549 +vn -0.0208 -0.7933 0.6085 +vn -0.6085 -0.7933 0.0208 +vn -0.2984 -0.5089 0.8075 +vn -0.8075 -0.5089 0.2984 +vn -0.6484 -0.5394 0.5372 +vn -0.5372 -0.5394 0.6484 +vn -0.5220 -0.8413 0.1406 +vn -0.1406 -0.8413 0.5220 +vn -0.9282 -0.3352 -0.1617 +vn 0.1617 -0.3352 0.9282 +vn -0.9409 -0.1940 0.2777 +vn -0.2777 -0.1940 0.9409 +vn -0.9439 0.1907 0.2697 +vn -0.2697 0.1907 0.9439 +vn -0.9329 0.3264 -0.1521 +vn 0.1521 0.3264 0.9329 +vn -0.5445 0.8173 0.1883 +vn -0.1883 0.8173 0.5445 +vn -0.6444 0.5696 0.5102 +vn -0.5102 0.5696 0.6444 +vn -0.2778 0.5370 0.7965 +vn -0.7965 0.5370 0.2778 +vn -0.0536 0.7672 0.6391 +vn -0.6391 0.7672 0.0536 +vn 0.2479 0.2952 0.9227 +vn -0.9227 0.2952 -0.2479 +vn -0.0305 0.1971 0.9799 +vn -0.9799 0.1971 0.0305 +vn 0.9177 0.3244 0.2294 +vn -0.2294 0.3244 -0.9177 +vn 0.5222 0.8206 -0.2321 +vn 0.2321 0.8206 -0.5222 +vn 0.0271 0.7806 -0.6244 +vn 0.6244 0.7806 -0.0271 +vn -0.2533 0.3225 -0.9120 +vn 0.9121 0.3225 0.2533 +vn -0.2466 -0.3487 -0.9042 +vn 0.9042 -0.3487 0.2466 +vn 0.0271 -0.7806 -0.6244 +vn 0.6244 -0.7806 -0.0271 +vn 0.5222 -0.8206 -0.2321 +vn 0.2321 -0.8206 -0.5222 +vn 0.9100 -0.3510 0.2206 +vn -0.2206 -0.3510 -0.9100 +vn -0.3637 -0.0623 0.9294 +vn -0.9294 -0.0623 0.3637 +vn -0.4444 -0.1754 0.8785 +vn -0.8785 -0.1754 0.4444 +vn -0.6251 -0.1835 0.7587 +vn -0.7587 -0.1835 0.6251 +vn -0.7495 -0.0283 0.6614 +vn -0.6614 -0.0283 0.7495 +vn -0.7496 0.0260 0.6614 +vn -0.6614 0.0260 0.7496 +vn -0.6225 0.1729 0.7633 +vn -0.7633 0.1729 0.6225 +vn -0.4488 0.1656 0.8781 +vn -0.8781 0.1656 0.4488 +vn -0.3638 0.0572 0.9297 +vn -0.9297 0.0572 0.3638 +vn -0.2611 -0.8616 0.4352 +vn -0.4352 -0.8616 0.2611 +vn -0.1648 -0.8647 0.4745 +vn -0.4745 -0.8647 0.1648 +vn -0.0542 -0.4550 0.8888 +vn -0.8888 -0.4550 0.0542 +vn 0.0930 -0.0506 0.9944 +vn -0.9944 -0.0506 -0.0930 +vn 0.1131 0.0900 0.9895 +vn -0.9895 0.0900 -0.1131 +vn -0.1059 -0.8188 0.5643 +vn -0.5643 -0.8188 0.1059 +vn -0.1810 -0.6629 0.7265 +vn -0.7265 -0.6629 0.1810 +vn 0.0699 -0.4193 0.9051 +vn -0.9051 -0.4193 -0.0699 +vn 0.0000 -0.3634 0.9316 +vn -0.9316 -0.3634 -0.0000 +vn -0.1445 0.3707 0.9174 +vn -0.9174 0.3707 0.1445 +vn -0.0454 0.6464 0.7616 +vn -0.7616 0.6464 0.0454 +vn 0.0055 0.5167 0.8561 +vn -0.8561 0.5167 -0.0055 +vn -0.5609 0.6610 0.4985 +vn -0.4985 0.6610 0.5609 +vn -0.9444 0.3187 -0.0803 +vn 0.0803 0.3187 0.9444 +vn -0.8316 0.5554 0.0000 +vn 0.0000 0.5554 0.8316 +vn -0.1500 -0.3909 0.9081 +vn -0.9081 -0.3909 0.1500 +vn -0.4487 -0.4690 0.7608 +vn -0.7608 -0.4690 0.4487 +vn -0.6522 -0.5321 0.5399 +vn -0.5399 -0.5321 0.6522 +vn -0.5879 -0.6575 0.4713 +vn -0.4713 -0.6575 0.5879 +vn -0.5494 -0.5667 0.6140 +vn -0.6140 -0.5667 0.5494 +vn -0.4653 -0.2130 0.8591 +vn -0.8591 -0.2130 0.4653 +vn -0.3712 -0.1824 0.9105 +vn -0.9105 -0.1824 0.3712 +vn -0.3968 -0.2878 0.8716 +vn -0.8716 -0.2878 0.3968 +vn -0.3877 0.0603 0.9198 +vn -0.9198 0.0603 0.3877 +vn -0.7701 0.2680 0.5789 +vn -0.5789 0.2680 0.7701 +vn -0.2928 -0.4321 0.8530 +vn -0.8530 -0.4321 0.2928 +vn -0.5412 -0.2474 0.8037 +vn -0.8037 -0.2474 0.5412 +vn -0.6865 -0.1948 0.7005 +vn -0.7005 -0.1948 0.6865 +vn -0.4538 -0.6966 0.5557 +vn -0.5557 -0.6966 0.4538 +vn -0.4329 -0.5723 0.6964 +vn -0.6964 -0.5723 0.4329 +vn -0.4198 -0.2708 0.8663 +vn -0.8663 -0.2708 0.4198 +vn -0.4563 -0.0265 0.8894 +vn -0.8894 -0.0265 0.4563 +vn -0.4310 -0.1306 0.8928 +vn -0.8928 -0.1306 0.4310 +vn -0.7155 0.0574 0.6962 +vn -0.6962 0.0574 0.7155 +vn -0.7074 -0.0656 0.7037 +vn -0.7037 -0.0656 0.7074 +vn -0.7071 0.0000 0.7071 +vn 0.6092 -0.5744 0.5467 +vn -0.5467 -0.5744 -0.6092 +vn 0.8229 0.2297 0.5197 +vn -0.5197 0.2297 -0.8229 +vn 0.3499 0.9073 -0.2333 +vn 0.2333 0.9073 -0.3499 +vn -0.8403 0.3555 -0.4094 +vn 0.4094 0.3555 0.8403 +vn 0.1406 -0.8797 0.4543 +vn -0.4543 -0.8797 -0.1406 +vn -0.3386 -0.5747 0.7450 +vn -0.7450 -0.5747 0.3386 +vn -0.7864 0.6019 -0.1388 +vn 0.1388 0.6019 0.7864 +vn -0.3534 0.7892 0.5022 +vn -0.5022 0.7892 0.3534 +vn 0.1237 0.2916 0.9485 +vn -0.9485 0.2916 -0.1237 +vn -0.1375 -0.7130 0.6875 +vn -0.6875 -0.7130 0.1375 +vn -0.6544 0.2314 0.7199 +vn -0.7199 0.2314 0.6544 +vn -0.6234 -0.4018 0.6708 +vn -0.6708 -0.4018 0.6234 +vn -0.9376 -0.1610 0.3081 +vn -0.3081 -0.1610 0.9376 +vn -0.7715 -0.4364 0.4629 +vn -0.4629 -0.4364 0.7715 +vn -0.3235 -0.1290 0.9374 +vn -0.9374 -0.1290 0.3235 +vn -0.4608 0.0501 0.8861 +vn -0.8861 0.0501 0.4608 +vn 0.2211 0.3010 0.9276 +vn -0.9276 0.3010 -0.2211 +vn 0.3295 0.2574 0.9084 +vn -0.9084 0.2574 -0.3295 +vn 0.4473 0.1601 0.8800 +vn -0.8800 0.1601 -0.4473 +vn -0.3529 -0.6539 0.6692 +vn -0.6692 -0.6539 0.3529 +vn -0.7929 -0.1997 0.5757 +vn -0.5757 -0.1997 0.7929 +vn -0.8696 -0.1025 0.4831 +vn -0.4831 -0.1025 0.8696 +vn -0.7591 0.1952 0.6211 +vn -0.6211 0.1952 0.7591 +vn -0.3037 0.9494 0.0799 +vn -0.0799 0.9494 0.3037 +vn -0.5842 0.7082 -0.3964 +vn 0.3964 0.7082 0.5842 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.1322 -0.9450 0.2993 +vn -0.2993 -0.9450 -0.1322 +vn -0.6535 -0.2981 0.6957 +vn -0.6957 -0.2981 0.6535 +vn -0.5603 -0.3479 0.7517 +vn -0.7517 -0.3479 0.5603 +vn -0.9364 -0.2755 0.2173 +vn -0.2173 -0.2755 0.9364 +vn -0.9239 -0.0419 0.3804 +vn -0.3804 -0.0419 0.9239 +vn -0.8384 0.0374 0.5438 +vn -0.5438 0.0374 0.8384 +vn -0.8765 -0.4767 0.0674 +vn -0.0674 -0.4767 0.8765 +vn -0.5519 -0.7531 0.3582 +vn -0.3582 -0.7531 0.5519 +vn -0.1927 -0.6071 0.7709 +vn -0.7709 -0.6071 0.1927 +vn -0.0940 -0.4130 0.9059 +vn -0.9059 -0.4130 0.0940 +vn -0.1780 -0.0968 0.9792 +vn -0.9792 -0.0968 0.1780 +vn -0.1715 0.1180 0.9781 +vn -0.9781 0.1180 0.1715 +vn -0.1341 0.5621 0.8161 +vn -0.8161 0.5621 0.1341 +vn -0.3443 0.6114 0.7125 +vn -0.7125 0.6114 0.3443 +vn -0.5333 0.3607 0.7652 +vn -0.7652 0.3607 0.5333 +vn -0.6972 0.2495 0.6720 +vn -0.6720 0.2495 0.6972 +vn -0.3682 -0.4166 0.8312 +vn -0.8312 -0.4166 0.3682 +vn -0.4543 -0.2610 0.8518 +vn -0.8518 -0.2610 0.4543 +vn -0.6853 -0.6514 0.3258 +vn -0.3258 -0.6514 0.6853 +vn -0.3955 -0.8455 0.3587 +vn -0.3587 -0.8455 0.3955 +vn -0.8845 -0.2606 0.3870 +vn -0.3870 -0.2606 0.8845 +vn -0.9108 -0.0110 0.4126 +vn -0.4126 -0.0110 0.9108 +vn -0.7137 0.4608 0.5275 +vn -0.5275 0.4608 0.7137 +vn -0.5807 0.6159 0.5323 +vn -0.5323 0.6159 0.5807 +vn -0.2598 0.5836 0.7693 +vn -0.7693 0.5836 0.2598 +vn -0.1323 0.5300 0.8376 +vn -0.8376 0.5300 0.1323 +vn -0.0000 -0.3333 0.9428 +vn -0.9428 -0.3333 0.0000 +vn 0.1723 -0.0731 0.9823 +vn -0.9823 -0.0731 -0.1723 +vn 0.1232 0.1162 0.9856 +vn -0.9856 0.1161 -0.1232 +vn -0.2012 0.8111 -0.5493 +vn 0.5493 0.8111 0.2012 +vn -0.3381 0.3695 -0.8655 +vn 0.8655 0.3695 0.3381 +vn 0.1333 0.8675 -0.4792 +vn 0.4792 0.8675 -0.1333 +vn 0.6331 0.7465 0.2046 +vn -0.2046 0.7465 -0.6331 +vn 0.4811 0.8758 0.0401 +vn -0.0401 0.8758 -0.4811 +vn 0.4031 0.9151 -0.0041 +vn 0.0041 0.9151 -0.4031 +vn 0.9583 0.1340 0.2525 +vn -0.2525 0.1340 -0.9583 +vn 0.6872 -0.7233 0.0683 +vn -0.0683 -0.7233 -0.6872 +vn 0.5810 -0.8131 -0.0367 +vn 0.0367 -0.8131 -0.5810 +vn 0.7167 -0.5806 -0.3864 +vn 0.3864 -0.5806 -0.7167 +vn 0.8575 -0.0583 -0.5112 +vn 0.5112 -0.0583 -0.8575 +vn 0.7071 -0.4535 -0.5426 +vn 0.5426 -0.4535 -0.7071 +vn 0.1796 -0.9836 -0.0167 +vn 0.0167 -0.9836 -0.1796 +vn 0.2435 -0.9669 -0.0761 +vn 0.0761 -0.9669 -0.2435 +vn 0.8772 -0.0085 0.4801 +vn -0.4801 -0.0085 -0.8772 +vn 0.8882 0.1629 0.4297 +vn -0.4297 0.1629 -0.8882 +vn 0.8125 0.0207 -0.5826 +vn 0.5826 0.0207 -0.8125 +vn 0.6768 -0.2177 -0.7033 +vn 0.7033 -0.2177 -0.6768 +vn 0.9491 -0.2926 0.1169 +vn -0.1169 -0.2926 -0.9491 +vn 0.9104 0.1379 0.3902 +vn -0.3902 0.1379 -0.9104 +vn 0.7949 0.3127 0.5200 +vn -0.5200 0.3127 -0.7949 +vn 0.8095 0.3376 0.4802 +vn -0.4802 0.3376 -0.8095 +vn 0.7081 0.3338 0.6223 +vn -0.6223 0.3338 -0.7081 +vn 0.4358 -0.8805 -0.1868 +vn 0.1868 -0.8805 -0.4358 +vn 0.8272 -0.4733 -0.3029 +vn 0.3029 -0.4733 -0.8272 +vn 0.5492 -0.8284 -0.1098 +vn 0.1098 -0.8284 -0.5492 +vn 0.2885 -0.9515 0.1065 +vn -0.1065 -0.9515 -0.2885 +vn 0.3497 -0.9321 0.0942 +vn -0.0942 -0.9321 -0.3497 +vn 0.7333 -0.2083 0.6472 +vn -0.6472 -0.2083 -0.7333 +vn 0.4115 -0.5066 0.7576 +vn -0.7576 -0.5066 -0.4115 +vn 0.9025 -0.1158 -0.4148 +vn 0.4148 -0.1158 -0.9025 +vn -0.0815 0.9644 0.2516 +vn -0.2516 0.9644 0.0815 +vn 0.2211 0.9744 -0.0407 +vn 0.0407 0.9744 -0.2211 +vn 0.7590 0.5947 -0.2651 +vn 0.2651 0.5947 -0.7590 +vn 0.3961 0.8981 0.1912 +vn -0.1912 0.8981 -0.3961 +vn -0.3548 0.7036 0.6157 +vn -0.6157 0.7036 0.3548 +vn 0.3145 0.7794 0.5419 +vn -0.5419 0.7794 -0.3145 +vn 0.6425 0.6806 0.3522 +vn -0.3522 0.6806 -0.6425 +vn 0.9790 0.2007 -0.0344 +vn 0.0344 0.2007 -0.9790 +vn 0.8821 0.4342 -0.1824 +vn 0.1824 0.4342 -0.8821 +vn 0.5787 0.7459 0.3297 +vn -0.3297 0.7459 -0.5787 +vn 0.3997 0.6788 0.6160 +vn -0.6160 0.6788 -0.3997 +vn 0.1375 0.3972 0.9074 +vn -0.9074 0.3972 -0.1375 +vn 0.3540 0.9261 0.1307 +vn -0.1307 0.9261 -0.3540 +vn -0.3958 0.5740 0.7168 +vn -0.7168 0.5740 0.3958 +vn 0.5708 0.1046 -0.8144 +vn 0.8144 0.1046 -0.5708 +vn -0.2538 0.9150 0.3138 +vn -0.3138 0.9150 0.2538 +vn -0.7997 0.1847 0.5712 +vn -0.5712 0.1847 0.7997 +vn 0.6582 0.1973 0.7265 +vn -0.7265 0.1973 -0.6582 +vn 0.4519 0.0918 0.8873 +vn -0.8873 0.0918 -0.4519 +vn 0.7393 0.1905 0.6458 +vn -0.6458 0.1905 -0.7393 +vn 0.7783 0.0312 0.6271 +vn -0.6271 0.0312 -0.7783 +vn 0.4678 -0.7008 0.5385 +vn -0.5385 -0.7008 -0.4678 +vn 0.2033 -0.9243 0.3230 +vn -0.3230 -0.9243 -0.2033 +vn 0.1524 -0.8644 0.4791 +vn -0.4791 -0.8644 -0.1524 +vn 0.2589 -0.7578 0.5990 +vn -0.5990 -0.7578 -0.2589 +vn 0.3478 -0.6368 0.6881 +vn -0.6881 -0.6368 -0.3478 +vn -0.4169 -0.4499 0.7898 +vn -0.7898 -0.4499 0.4169 +vn 0.9363 -0.3181 -0.1489 +vn 0.1489 -0.3181 -0.9363 +vn 0.9330 -0.2807 -0.2253 +vn 0.2253 -0.2807 -0.9330 +vn 0.5229 -0.8494 -0.0718 +vn 0.0718 -0.8494 -0.5229 +vn 0.7064 -0.6356 0.3114 +vn -0.3114 -0.6356 -0.7064 +vn 0.8800 -0.4408 -0.1769 +vn 0.1769 -0.4408 -0.8800 +vn -0.3572 0.3807 0.8529 +vn -0.8529 0.3807 0.3572 +vn -0.2945 0.1715 0.9401 +vn -0.9401 0.1715 0.2945 +vn -0.4964 0.1055 0.8617 +vn -0.8617 0.1055 0.4964 +vn -0.5095 -0.0802 0.8567 +vn -0.8567 -0.0802 0.5095 +vn -0.2965 -0.0599 0.9531 +vn -0.9531 -0.0599 0.2965 +vn -0.0697 -0.3045 0.9500 +vn -0.9500 -0.3045 0.0697 +vn -0.1080 0.6590 0.7444 +vn -0.7444 0.6590 0.1080 +vn -0.5339 0.8309 0.1568 +vn -0.1568 0.8309 0.5339 +vn -0.9472 0.2291 -0.2243 +vn 0.2243 0.2291 0.9472 +vn -0.9177 -0.3566 0.1751 +vn -0.1751 -0.3566 0.9177 +vn -0.1645 -0.5665 0.8075 +vn -0.8075 -0.5665 0.1645 +vn 0.1021 -0.4497 0.8873 +vn -0.8873 -0.4497 -0.1021 +vn 0.5902 -0.6827 0.4309 +vn -0.4309 -0.6827 -0.5902 +vn -0.7995 0.2860 0.5282 +vn -0.5282 0.2860 0.7995 +vn 0.7846 -0.3734 0.4950 +vn -0.4950 -0.3734 -0.7846 +vn -0.6216 0.1551 0.7678 +vn -0.7678 0.1551 0.6216 +vn -0.1902 0.9318 0.3091 +vn -0.3091 0.9318 0.1902 +vn -0.0812 -0.0883 0.9928 +vn -0.9928 -0.0883 0.0812 +vn -0.2382 0.4740 0.8477 +vn -0.8477 0.4740 0.2382 +vn 0.3232 -0.4847 0.8128 +vn -0.8128 -0.4847 -0.3232 +vn -0.0850 -0.4128 0.9068 +vn -0.9068 -0.4128 0.0850 +vn -0.0645 -0.4305 0.9003 +vn -0.9003 -0.4305 0.0645 +vn 0.7361 -0.1804 0.6524 +vn -0.6524 -0.1804 -0.7361 +vn 0.7269 -0.3965 0.5607 +vn -0.5607 -0.3965 -0.7269 +vn 0.7564 -0.0181 0.6538 +vn -0.6538 -0.0181 -0.7564 +vn 0.3810 -0.6543 0.6532 +vn -0.6532 -0.6543 -0.3810 +vn 0.4804 -0.6079 0.6322 +vn -0.6322 -0.6079 -0.4804 +vn 0.4138 -0.7022 0.5793 +vn -0.5793 -0.7022 -0.4138 +vn 0.1663 0.9816 0.0940 +vn -0.0940 0.9816 -0.1663 +vn 0.5705 0.3301 0.7520 +vn -0.7520 0.3301 -0.5705 +vn 0.4300 -0.7463 0.5081 +vn -0.5081 -0.7463 -0.4300 +vn -0.0603 0.9970 0.0482 +vn -0.0482 0.9970 0.0603 +vn 0.2039 -0.7061 0.6782 +vn -0.6782 -0.7061 -0.2039 +vn -0.0604 -0.8925 0.4469 +vn -0.4469 -0.8925 0.0604 +vn -0.4333 -0.5080 -0.7444 +vn 0.7444 -0.5080 0.4333 +vn -0.2375 0.2377 -0.9419 +vn 0.9419 0.2377 0.2375 +vn -0.2203 0.7847 -0.5794 +vn 0.5794 0.7847 0.2203 +vn -0.0871 0.9962 0.0079 +vn -0.0079 0.9962 0.0871 +vn -0.5973 0.0222 0.8017 +vn -0.8017 0.0222 0.5973 +vn -0.4350 0.0645 0.8981 +vn -0.8981 0.0645 0.4350 +vn -0.4504 0.0232 0.8925 +vn -0.8925 0.0232 0.4504 +vn -0.5755 0.0274 0.8173 +vn -0.8173 0.0274 0.5755 +vn -0.3848 0.2849 0.8779 +vn -0.8779 0.2849 0.3848 +vn -0.3642 -0.0343 0.9307 +vn -0.9307 -0.0343 0.3642 +vn -0.5001 -0.0603 0.8639 +vn -0.8639 -0.0603 0.5001 +vn -0.6606 -0.0106 0.7507 +vn -0.7507 -0.0106 0.6606 +vn -0.6886 0.7039 0.1742 +vn -0.1742 0.7039 0.6886 +vn -0.1032 0.0355 0.9940 +vn -0.9940 0.0355 0.1032 +vn -0.3002 -0.2002 0.9326 +vn -0.9326 -0.2002 0.3002 +vn -0.2317 -0.2141 0.9489 +vn -0.9489 -0.2141 0.2317 +vn -0.2004 0.2619 0.9440 +vn -0.9440 0.2619 0.2004 +vn -0.3253 0.5802 0.7467 +vn -0.7467 0.5802 0.3253 +vn 0.1227 -0.9924 0.0089 +vn -0.0089 -0.9924 -0.1227 +vn 0.3483 -0.8657 0.3596 +vn -0.3596 -0.8657 -0.3483 +vn 0.4623 -0.2497 0.8509 +vn -0.8509 -0.2497 -0.4623 +vn 0.6202 0.5424 0.5667 +vn -0.5667 0.5424 -0.6202 +vn 0.0165 0.9367 -0.3496 +vn 0.3496 0.9367 -0.0165 +vn -0.2272 0.8838 -0.4090 +vn 0.4090 0.8838 0.2272 +vn 0.2152 -0.0098 -0.9765 +vn 0.9765 -0.0098 -0.2152 +vn 0.5588 -0.0241 -0.8290 +vn 0.8290 -0.0241 -0.5588 +vn 0.9325 0.0266 -0.3603 +vn 0.3603 0.0266 -0.9325 +vn -0.5668 0.6231 -0.5389 +vn 0.5389 0.6231 0.5668 +vn 0.9595 -0.2063 -0.1919 +vn 0.1919 -0.2063 -0.9595 +vn 0.0333 -0.9231 -0.3832 +vn 0.3832 -0.9231 -0.0333 +usemtl None +s off +f 3596/3893/3494 3550/3894/3494 3552/3895/3494 3594/3896/3494 +f 3553/3897/3495 3551/3898/3495 3597/3899/3495 3595/3900/3495 +f 3594/3896/3496 3552/3895/3496 3554/3901/3496 3592/3902/3496 +f 3555/3903/3497 3553/3897/3497 3595/3900/3497 3593/3904/3497 +f 3552/3895/3498 3558/3905/3498 3556/3906/3498 3554/3901/3498 +f 3557/3907/3499 3559/3908/3499 3553/3897/3499 3555/3903/3499 +f 3550/3894/3500 3560/3909/3500 3558/3905/3500 3552/3895/3500 +f 3559/3908/3501 3561/3910/3501 3551/3898/3501 3553/3897/3501 +f 3560/3909/3502 3562/3911/3502 3564/3912/3502 3558/3905/3502 +f 3565/3913/3503 3563/3914/3503 3561/3910/3503 3559/3908/3503 +f 3558/3905/3504 3564/3912/3504 3566/3915/3504 3556/3906/3504 +f 3567/3916/3505 3565/3913/3505 3559/3908/3505 3557/3907/3505 +f 3564/3912/3506 3570/3917/3506 3568/3918/3506 3566/3915/3506 +f 3569/3919/3507 3571/3920/3507 3565/3913/3507 3567/3916/3507 +f 3562/3911/3508 3572/3921/3508 3570/3917/3508 3564/3912/3508 +f 3571/3920/3509 3573/3922/3509 3563/3914/3509 3565/3913/3509 +f 3572/3921/3510 3574/3923/3510 3576/3924/3510 3570/3917/3510 +f 3577/3925/3511 3575/3926/3511 3573/3922/3511 3571/3920/3511 +f 3570/3917/3512 3576/3924/3512 3578/3927/3512 3568/3918/3512 +f 3579/3928/3513 3577/3925/3513 3571/3920/3513 3569/3919/3513 +f 3576/3924/3514 3582/3929/3514 3580/3930/3514 3578/3927/3514 +f 3581/3931/3515 3583/3932/3515 3577/3925/3515 3579/3928/3515 +f 3574/3923/3516 3584/3933/3516 3582/3929/3516 3576/3924/3516 +f 3583/3932/3517 3585/3934/3517 3575/3926/3517 3577/3925/3517 +f 3584/3933/3518 3586/3935/3518 3588/3936/3518 3582/3929/3518 +f 3589/3937/3519 3587/3938/3519 3585/3934/3519 3583/3932/3519 +f 3582/3929/3520 3588/3936/3520 3590/3939/3520 3580/3930/3520 +f 3591/3940/3521 3589/3937/3521 3583/3932/3521 3581/3931/3521 +f 3588/3936/3522 3594/3896/3522 3592/3902/3522 3590/3939/3522 +f 3593/3904/3523 3595/3900/3523 3589/3937/3523 3591/3940/3523 +f 3586/3935/3524 3596/3893/3524 3594/3896/3524 3588/3936/3524 +f 3595/3900/3525 3597/3899/3525 3587/3938/3525 3589/3937/3525 +f 3596/3893/3526 3586/3935/3526 3600/3941/3526 3598/3942/3526 +f 3601/3943/3527 3587/3938/3527 3597/3899/3527 3599/3944/3527 +f 3586/3935/3528 3584/3933/3528 3602/3945/3528 3600/3941/3528 +f 3603/3946/3529 3585/3934/3529 3587/3938/3529 3601/3943/3529 +f 3584/3933/3530 3574/3923/3530 3604/3947/3530 3602/3945/3530 +f 3605/3948/3531 3575/3926/3531 3585/3934/3531 3603/3946/3531 +f 3574/3923/3532 3572/3921/3532 3606/3949/3532 3604/3947/3532 +f 3607/3950/3533 3573/3922/3533 3575/3926/3533 3605/3948/3533 +f 3572/3921/3534 3562/3911/3534 3608/3951/3534 3606/3949/3534 +f 3609/3952/3535 3563/3914/3535 3573/3922/3535 3607/3950/3535 +f 3562/3911/3536 3560/3909/3536 3612/3953/3536 3608/3951/3536 +f 3613/3954/3537 3561/3910/3537 3563/3914/3537 3609/3952/3537 +f 3560/3909/3538 3550/3894/3538 3614/3955/3538 3612/3953/3538 +f 3615/3956/3539 3551/3898/3539 3561/3910/3539 3613/3954/3539 +f 3550/3894/3540 3596/3893/3540 3598/3942/3540 3614/3955/3540 +f 3599/3944/3541 3597/3899/3541 3551/3898/3541 3615/3956/3541 +f 3610/3957/3542 3614/3955/3542 3598/3942/3542 +f 3599/3944/3543 3615/3956/3543 3611/3958/3543 +f 3612/3953/3544 3614/3955/3544 3610/3957/3544 +f 3611/3958/3545 3615/3956/3545 3613/3954/3545 +f 3610/3957/3546 3608/3951/3546 3612/3953/3546 +f 3613/3954/3547 3609/3952/3547 3611/3958/3547 +f 3610/3957/3548 3606/3949/3548 3608/3951/3548 +f 3609/3952/3549 3607/3950/3549 3611/3958/3549 +f 3610/3957/3550 3604/3947/3550 3606/3949/3550 +f 3607/3950/3551 3605/3948/3551 3611/3958/3551 +f 3610/3957/3552 3602/3945/3552 3604/3947/3552 +f 3605/3948/3553 3603/3946/3553 3611/3958/3553 +f 3610/3957/3554 3600/3941/3554 3602/3945/3554 +f 3603/3946/3555 3601/3943/3555 3611/3958/3555 +f 3610/3957/3556 3598/3942/3556 3600/3941/3556 +f 3601/3943/3557 3599/3944/3557 3611/3958/3557 +f 3638/3959/3558 3723/3960/3558 3725/3961/3558 3640/3962/3558 +f 3725/3961/3559 3724/3963/3559 3639/3964/3559 3640/3962/3559 +f 3636/3965/3560 3721/3966/3560 3723/3960/3560 3638/3959/3560 +f 3724/3963/3561 3722/3967/3561 3637/3968/3561 3639/3964/3561 +f 3634/3969/3562 3719/3970/3562 3721/3966/3562 3636/3965/3562 +f 3722/3967/3563 3720/3971/3563 3635/3972/3563 3637/3968/3563 +f 3632/3973/3564 3717/3974/3564 3719/3970/3564 3634/3969/3564 +f 3720/3971/3565 3718/3975/3565 3633/3976/3565 3635/3972/3565 +f 3630/3977/3566 3715/3978/3566 3717/3974/3566 3632/3973/3566 +f 3718/3975/3567 3716/3979/3567 3631/3980/3567 3633/3976/3567 +f 3628/3981/3568 3641/3982/3568 3695/3983/3568 3713/3984/3568 +f 3696/3985/3569 3642/3986/3569 3629/3987/3569 3714/3988/3569 +f 3641/3982/3570 3643/3989/3570 3697/3990/3570 3695/3983/3570 +f 3698/3991/3571 3644/3992/3571 3642/3986/3571 3696/3985/3571 +f 3643/3989/3572 3645/3993/3572 3699/3994/3572 3697/3990/3572 +f 3700/3995/3573 3646/3996/3573 3644/3992/3573 3698/3991/3573 +f 3645/3993/3574 3647/3997/3574 3701/3998/3574 3699/3994/3574 +f 3702/3999/3575 3648/4000/3575 3646/3996/3575 3700/3995/3575 +f 3647/3997/3576 3649/4001/3576 3703/4002/3576 3701/3998/3576 +f 3704/4003/3577 3650/4004/3577 3648/4000/3577 3702/3999/3577 +f 3649/4001/3578 3651/4005/3578 3705/4006/3578 3703/4002/3578 +f 3706/4007/3579 3652/4008/3579 3650/4004/3579 3704/4003/3579 +f 3651/4005/3580 3653/4009/3580 3707/4010/3580 3705/4006/3580 +f 3708/4011/3581 3654/4012/3581 3652/4008/3581 3706/4007/3581 +f 3653/4009/3582 3655/4013/3582 3709/4014/3582 3707/4010/3582 +f 3710/4015/3583 3656/4016/3583 3654/4012/3583 3708/4011/3583 +f 3655/4013/3584 3657/4017/3584 3711/4018/3584 3709/4014/3584 +f 3712/4019/3585 3658/4020/3585 3656/4016/3585 3710/4015/3585 +f 3657/4017/3586 3616/4021/3586 3617/4022/3586 3711/4018/3586 +f 3617/4022/3587 3616/4021/3587 3658/4020/3587 3712/4019/3587 +f 3659/4023/3588 3677/4024/3588 3709/4014/3588 3711/4018/3588 +f 3710/4015/3589 3678/4025/3589 3660/4026/3589 3712/4019/3589 +f 3677/4024/3590 3728/4027/3590 3707/4010/3590 3709/4014/3590 +f 3708/4011/3591 3729/4028/3591 3678/4025/3591 3710/4015/3591 +f 3675/4029/3592 3705/4006/3592 3707/4010/3592 3728/4027/3592 +f 3708/4011/3593 3706/4007/3593 3676/4030/3593 3729/4028/3593 +f 3673/4031/3594 3703/4002/3594 3705/4006/3594 3675/4029/3594 +f 3706/4007/3595 3704/4003/3595 3674/4032/3595 3676/4030/3595 +f 3671/4033/3596 3701/3998/3596 3703/4002/3596 3673/4031/3596 +f 3704/4003/3597 3702/3999/3597 3672/4034/3597 3674/4032/3597 +f 3669/4035/3598 3699/3994/3598 3701/3998/3598 3671/4033/3598 +f 3702/3999/3599 3700/3995/3599 3670/4036/3599 3672/4034/3599 +f 3667/4037/3600 3697/3990/3600 3699/3994/3600 3669/4035/3600 +f 3700/3995/3601 3698/3991/3601 3668/4038/3601 3670/4036/3601 +f 3665/4039/3602 3695/3983/3602 3697/3990/3602 3667/4037/3602 +f 3698/3991/3603 3696/3985/3603 3666/4040/3603 3668/4038/3603 +f 3663/4041/3604 3713/3984/3604 3695/3983/3604 3665/4039/3604 +f 3696/3985/3605 3714/3988/3605 3664/4042/3605 3666/4040/3605 +f 3663/4041/3606 3730/4043/3606 3726/4044/3606 3713/3984/3606 +f 3726/4044/3607 3731/4045/3607 3664/4042/3607 3714/3988/3607 +f 3659/4023/3608 3711/4018/3608 3617/4022/3608 3661/4046/3608 +f 3617/4022/3609 3712/4019/3609 3660/4026/3609 3662/4047/3609 +f 3661/4046/3610 3617/4022/3610 3727/4048/3610 3732/4049/3610 +f 3727/4048/3611 3617/4022/3611 3662/4047/3611 3733/4050/3611 +f 3726/4044/3612 3730/4043/3612 3732/4049/3612 3727/4048/3612 +f 3733/4050/3613 3731/4045/3613 3726/4044/3613 3727/4048/3613 +f 3684/4051/3614 3686/4052/3614 3725/3961/3614 3723/3960/3614 +f 3725/3961/3615 3686/4052/3615 3685/4053/3615 3724/3963/3615 +f 3682/4054/3616 3684/4051/3616 3723/3960/3616 3721/3966/3616 +f 3724/3963/3617 3685/4053/3617 3683/4055/3617 3722/3967/3617 +f 3680/4056/3618 3682/4054/3618 3721/3966/3618 3719/3970/3618 +f 3722/3967/3619 3683/4055/3619 3681/4057/3619 3720/3971/3619 +f 3715/3978/3620 3736/4058/3620 3734/4059/3620 3717/3974/3620 +f 3735/4060/3621 3737/4061/3621 3716/3979/3621 3718/3975/3621 +f 3680/4056/3622 3719/3970/3622 3717/3974/3622 3734/4059/3622 +f 3718/3975/3623 3720/3971/3623 3681/4057/3623 3735/4060/3623 +f 3693/4062/3624 3739/4063/3624 3738/4064/3624 3736/4058/3624 +f 3738/4064/3625 3739/4063/3625 3694/4065/3625 3737/4061/3625 +f 3734/4059/3626 3736/4058/3626 3738/4064/3626 3618/4066/3626 +f 3738/4064/3627 3737/4061/3627 3735/4060/3627 3618/4066/3627 +f 3679/4067/3628 3680/4056/3628 3734/4059/3628 3618/4066/3628 +f 3735/4060/3628 3681/4057/3628 3679/4067/3628 3618/4066/3628 +f 3691/4068/3629 3742/4069/3629 3740/4070/3629 3693/4062/3629 +f 3741/4071/3630 3743/4072/3630 3692/4073/3630 3694/4065/3630 +f 3689/4074/3631 3744/4075/3631 3742/4069/3631 3691/4068/3631 +f 3743/4072/3632 3745/4076/3632 3690/4077/3632 3692/4073/3632 +f 3688/4078/3633 3746/4079/3633 3744/4075/3633 3689/4074/3633 +f 3745/4076/3634 3747/4080/3634 3688/4078/3634 3690/4077/3634 +f 3687/4081/3635 3620/4082/3635 3746/4079/3635 3688/4078/3635 +f 3747/4080/3636 3620/4082/3636 3687/4081/3636 3688/4078/3636 +f 3739/4063/3637 3693/4062/3637 3740/4070/3637 3619/4083/3637 +f 3741/4071/3638 3694/4065/3638 3739/4063/3638 3619/4083/3638 +f 3619/4083/3639 3740/4070/3639 3755/4084/3639 3757/4085/3639 +f 3756/4086/3640 3741/4071/3640 3619/4083/3640 3757/4085/3640 +f 3620/4082/3641 3748/4087/3641 3749/4088/3641 3746/4079/3641 +f 3750/4089/3642 3748/4087/3642 3620/4082/3642 3747/4080/3642 +f 3746/4079/3643 3749/4088/3643 3751/4090/3643 3744/4075/3643 +f 3752/4091/3644 3750/4089/3644 3747/4080/3644 3745/4076/3644 +f 3744/4075/3645 3751/4090/3645 3753/4092/3645 3742/4069/3645 +f 3754/4093/3646 3752/4091/3646 3745/4076/3646 3743/4072/3646 +f 3742/4069/3647 3753/4092/3647 3755/4084/3647 3740/4070/3647 +f 3756/4086/3648 3754/4093/3648 3743/4072/3648 3741/4071/3648 +f 3748/4087/3649 3753/4092/3649 3751/4090/3649 3749/4088/3649 +f 3752/4091/3650 3754/4093/3650 3748/4087/3650 3750/4089/3650 +f 3748/4087/3651 3757/4085/3651 3755/4084/3651 3753/4092/3651 +f 3756/4086/3652 3757/4085/3652 3748/4087/3652 3754/4093/3652 +f 3688/4078/3653 3689/4074/3653 3713/3984/3653 3726/4044/3653 +f 3714/3988/3654 3690/4077/3654 3688/4078/3654 3726/4044/3654 +f 3689/4074/3655 3691/4068/3655 3760/4094/3655 3713/3984/3655 +f 3761/4095/3656 3692/4073/3656 3690/4077/3656 3714/3988/3656 +f 3691/4068/3657 3693/4062/3657 3762/4096/3657 3760/4094/3657 +f 3763/4097/3658 3694/4065/3658 3692/4073/3658 3761/4095/3658 +f 3693/4062/3659 3736/4058/3659 3715/3978/3659 3762/4096/3659 +f 3716/3979/3660 3737/4061/3660 3694/4065/3660 3763/4097/3660 +f 3630/3977/3661 3758/4098/3661 3762/4096/3661 3715/3978/3661 +f 3763/4097/3662 3759/4099/3662 3631/3980/3662 3716/3979/3662 +f 3758/4098/3663 3764/4100/3663 3760/4094/3663 3762/4096/3663 +f 3761/4095/3664 3765/4101/3664 3759/4099/3664 3763/4097/3664 +f 3628/3981/3665 3713/3984/3665 3760/4094/3665 3764/4100/3665 +f 3761/4095/3666 3714/3988/3666 3629/3987/3666 3765/4101/3666 +f 3680/4056/3667 3679/4067/3667 3621/4102/3667 3771/4103/3667 +f 3621/4102/3668 3679/4067/3668 3681/4057/3668 3772/4104/3668 +f 3682/4054/3669 3680/4056/3669 3771/4103/3669 3769/4105/3669 +f 3772/4104/3670 3681/4057/3670 3683/4055/3670 3770/4106/3670 +f 3684/4051/3671 3682/4054/3671 3769/4105/3671 3767/4107/3671 +f 3770/4106/3672 3683/4055/3672 3685/4053/3672 3768/4108/3672 +f 3686/4052/3673 3684/4051/3673 3767/4107/3673 3766/4109/3673 +f 3768/4108/3674 3685/4053/3674 3686/4052/3674 3766/4109/3674 +f 3766/4109/3675 3767/4107/3675 3778/4110/3675 3780/4111/3675 +f 3779/4112/3676 3768/4108/3676 3766/4109/3676 3780/4111/3676 +f 3767/4107/3677 3769/4105/3677 3776/4113/3677 3778/4110/3677 +f 3777/4114/3678 3770/4106/3678 3768/4108/3678 3779/4112/3678 +f 3769/4105/3679 3771/4103/3679 3774/4115/3679 3776/4113/3679 +f 3775/4116/3680 3772/4104/3680 3770/4106/3680 3777/4114/3680 +f 3771/4103/3681 3621/4102/3681 3773/4117/3681 3774/4115/3681 +f 3773/4117/3682 3621/4102/3682 3772/4104/3682 3775/4116/3682 +f 3773/4117/3683 3780/4111/3683 3778/4110/3683 3774/4115/3683 +f 3779/4112/3684 3780/4111/3684 3773/4117/3684 3775/4116/3684 +f 3774/4115/3685 3778/4110/3685 3776/4113/3685 +f 3777/4114/3686 3779/4112/3686 3775/4116/3686 +f 3732/4049/3687 3730/4043/3687 3783/4118/3687 3781/4119/3687 +f 3784/4120/3688 3731/4045/3688 3733/4050/3688 3782/4121/3688 +f 3661/4046/3689 3732/4049/3689 3781/4119/3689 3803/4122/3689 +f 3782/4121/3690 3733/4050/3690 3662/4047/3690 3804/4123/3690 +f 3659/4023/3691 3661/4046/3691 3803/4122/3691 3805/4124/3691 +f 3804/4123/3692 3662/4047/3692 3660/4026/3692 3806/4125/3692 +f 3730/4043/3693 3663/4041/3693 3801/4126/3693 3783/4118/3693 +f 3802/4127/3694 3664/4042/3694 3731/4045/3694 3784/4120/3694 +f 3663/4041/3695 3665/4039/3695 3799/4128/3695 3801/4126/3695 +f 3800/4129/3696 3666/4040/3696 3664/4042/3696 3802/4127/3696 +f 3665/4039/3697 3667/4037/3697 3797/4130/3697 3799/4128/3697 +f 3798/4131/3698 3668/4038/3698 3666/4040/3698 3800/4129/3698 +f 3667/4037/3699 3669/4035/3699 3795/4132/3699 3797/4130/3699 +f 3796/4133/3700 3670/4036/3700 3668/4038/3700 3798/4131/3700 +f 3669/4035/3701 3671/4033/3701 3793/4134/3701 3795/4132/3701 +f 3794/4135/3702 3672/4034/3702 3670/4036/3702 3796/4133/3702 +f 3671/4033/3703 3673/4031/3703 3791/4136/3703 3793/4134/3703 +f 3792/4137/3704 3674/4032/3704 3672/4034/3704 3794/4135/3704 +f 3673/4031/3705 3675/4029/3705 3789/4138/3705 3791/4136/3705 +f 3790/4139/3706 3676/4030/3706 3674/4032/3706 3792/4137/3706 +f 3675/4029/3707 3728/4027/3707 3785/4140/3707 3789/4138/3707 +f 3786/4141/3708 3729/4028/3708 3676/4030/3708 3790/4139/3708 +f 3728/4027/3709 3677/4024/3709 3787/4142/3709 3785/4140/3709 +f 3788/4143/3710 3678/4025/3710 3729/4028/3710 3786/4141/3710 +f 3677/4024/3711 3659/4023/3711 3805/4124/3711 3787/4142/3711 +f 3806/4125/3712 3660/4026/3712 3678/4025/3712 3788/4143/3712 +f 3787/4142/3713 3805/4124/3713 3807/4144/3713 3825/4145/3713 +f 3808/4146/3714 3806/4125/3714 3788/4143/3714 3826/4147/3714 +f 3785/4140/3715 3787/4142/3715 3825/4145/3715 3827/4148/3715 +f 3826/4147/3716 3788/4143/3716 3786/4141/3716 3828/4149/3716 +f 3789/4138/3717 3785/4140/3717 3827/4148/3717 3823/4150/3717 +f 3828/4149/3718 3786/4141/3718 3790/4139/3718 3824/4151/3718 +f 3791/4136/3719 3789/4138/3719 3823/4150/3719 3821/4152/3719 +f 3824/4151/3720 3790/4139/3720 3792/4137/3720 3822/4153/3720 +f 3793/4134/3721 3791/4136/3721 3821/4152/3721 3819/4154/3721 +f 3822/4153/3722 3792/4137/3722 3794/4135/3722 3820/4155/3722 +f 3795/4132/3723 3793/4134/3723 3819/4154/3723 3817/4156/3723 +f 3820/4155/3724 3794/4135/3724 3796/4133/3724 3818/4157/3724 +f 3797/4130/3725 3795/4132/3725 3817/4156/3725 3815/4158/3725 +f 3818/4157/3726 3796/4133/3726 3798/4131/3726 3816/4159/3726 +f 3799/4128/3727 3797/4130/3727 3815/4158/3727 3813/4160/3727 +f 3816/4159/3728 3798/4131/3728 3800/4129/3728 3814/4161/3728 +f 3801/4126/3729 3799/4128/3729 3813/4160/3729 3811/4162/3729 +f 3814/4161/3730 3800/4129/3730 3802/4127/3730 3812/4163/3730 +f 3783/4118/3731 3801/4126/3731 3811/4162/3731 3829/4164/3731 +f 3812/4163/3732 3802/4127/3732 3784/4120/3732 3830/4165/3732 +f 3805/4124/3733 3803/4122/3733 3809/4166/3733 3807/4144/3733 +f 3810/4167/3734 3804/4123/3734 3806/4125/3734 3808/4146/3734 +f 3803/4122/3735 3781/4119/3735 3831/4168/3735 3809/4166/3735 +f 3832/4169/3736 3782/4121/3736 3804/4123/3736 3810/4167/3736 +f 3781/4119/3737 3783/4118/3737 3829/4164/3737 3831/4168/3737 +f 3830/4165/3738 3784/4120/3738 3782/4121/3738 3832/4169/3738 +f 3616/4021/3739 3657/4017/3739 3833/4170/3739 3622/4171/3739 +f 3834/4172/3740 3658/4020/3740 3616/4021/3740 3622/4171/3740 +f 3657/4017/3741 3655/4013/3741 3835/4173/3741 3833/4170/3741 +f 3836/4174/3742 3656/4016/3742 3658/4020/3742 3834/4172/3742 +f 3655/4013/3743 3653/4009/3743 3837/4175/3743 3835/4173/3743 +f 3838/4176/3744 3654/4012/3744 3656/4016/3744 3836/4174/3744 +f 3653/4009/3745 3651/4005/3745 3839/4177/3745 3837/4175/3745 +f 3840/4178/3746 3652/4008/3746 3654/4012/3746 3838/4176/3746 +f 3651/4005/3747 3649/4001/3747 3841/4179/3747 3839/4177/3747 +f 3842/4180/3748 3650/4004/3748 3652/4008/3748 3840/4178/3748 +f 3649/4001/3749 3647/3997/3749 3843/4181/3749 3841/4179/3749 +f 3844/4182/3750 3648/4000/3750 3650/4004/3750 3842/4180/3750 +f 3647/3997/3751 3645/3993/3751 3845/4183/3751 3843/4181/3751 +f 3846/4184/3752 3646/3996/3752 3648/4000/3752 3844/4182/3752 +f 3645/3993/3753 3643/3989/3753 3847/4185/3753 3845/4183/3753 +f 3848/4186/3754 3644/3992/3754 3646/3996/3754 3846/4184/3754 +f 3643/3989/3755 3641/3982/3755 3849/4187/3755 3847/4185/3755 +f 3850/4188/3756 3642/3986/3756 3644/3992/3756 3848/4186/3756 +f 3857/4189/3757 3858/4190/3757 3877/4191/3757 3887/4192/3757 +f 3878/4193/3758 3858/4194/3758 3857/4195/3758 3888/4196/3758 +f 3856/4197/3759 3857/4189/3759 3887/4192/3759 3885/4198/3759 +f 3888/4196/3760 3857/4195/3760 3856/4199/3760 3886/4200/3760 +f 3855/4201/3761 3856/4197/3761 3885/4198/3761 3889/4202/3761 +f 3886/4200/3762 3856/4199/3762 3855/4201/3762 3890/4203/3762 +f 3638/3959/3763 3640/3962/3763 3855/4201/3763 3889/4202/3763 +f 3855/4201/3764 3640/3962/3764 3639/3964/3764 3890/4203/3764 +f 3636/3965/3765 3638/3959/3765 3889/4202/3765 3883/4204/3765 +f 3890/4203/3766 3639/3964/3766 3637/3968/3766 3884/4205/3766 +f 3634/3969/3767 3636/3965/3767 3883/4204/3767 3879/4206/3767 +f 3884/4205/3768 3637/3968/3768 3635/3972/3768 3880/4207/3768 +f 3632/3973/3769 3634/3969/3769 3879/4206/3769 3881/4208/3769 +f 3880/4207/3770 3635/3972/3770 3633/3976/3770 3882/4209/3770 +f 3879/4206/3771 3885/4198/3771 3887/4192/3771 3881/4208/3771 +f 3888/4196/3772 3886/4200/3772 3880/4207/3772 3882/4209/3772 +f 3879/4206/3773 3883/4204/3773 3889/4202/3773 3885/4198/3773 +f 3890/4203/3774 3884/4205/3774 3880/4207/3774 3886/4200/3774 +f 3875/4210/3775 3881/4208/3775 3887/4192/3775 3877/4191/3775 +f 3888/4196/3776 3882/4209/3776 3876/4211/3776 3878/4193/3776 +f 3630/3977/3777 3632/3973/3777 3881/4208/3777 3875/4210/3777 +f 3882/4209/3778 3633/3976/3778 3631/3980/3778 3876/4211/3778 +f 3758/4098/3779 3891/4212/3779 3893/4213/3779 3764/4100/3779 +f 3894/4214/3780 3892/4215/3780 3759/4099/3780 3765/4101/3780 +f 3630/3977/3781 3875/4210/3781 3891/4212/3781 3758/4098/3781 +f 3892/4215/3782 3876/4211/3782 3631/3980/3782 3759/4099/3782 +f 3628/3981/3783 3764/4100/3783 3893/4213/3783 3895/4216/3783 +f 3894/4214/3784 3765/4101/3784 3629/3987/3784 3896/4217/3784 +f 3628/3981/3785 3895/4216/3785 3849/4187/3785 3641/3982/3785 +f 3850/4188/3786 3896/4217/3786 3629/3987/3786 3642/3986/3786 +f 3626/4218/3787 3873/4219/3787 3901/4220/3787 3853/4221/3787 +f 3902/4222/3788 3874/4223/3788 3626/4224/3788 3853/4225/3788 +f 3853/4221/3789 3901/4220/3789 3899/4226/3789 3627/4227/3789 +f 3900/4228/3790 3902/4222/3790 3853/4225/3790 3627/4229/3790 +f 3627/4227/3791 3899/4226/3791 3897/4230/3791 3854/4231/3791 +f 3898/4232/3792 3900/4228/3792 3627/4229/3792 3854/4233/3792 +f 3854/4231/3793 3897/4230/3793 3877/4191/3793 3858/4190/3793 +f 3878/4193/3794 3898/4232/3794 3854/4233/3794 3858/4194/3794 +f 3875/4210/3795 3877/4191/3795 3897/4230/3795 3891/4212/3795 +f 3898/4232/3796 3878/4193/3796 3876/4211/3796 3892/4215/3796 +f 3845/4183/3797 3847/4185/3797 3867/4234/3797 3859/4235/3797 +f 3868/4236/3798 3848/4186/3798 3846/4184/3798 3860/4237/3798 +f 3625/4238/3799 3865/4239/3799 3873/4219/3799 3626/4218/3799 +f 3874/4223/3800 3866/4240/3800 3625/4241/3800 3626/4224/3800 +f 3851/4242/3801 3907/4243/3801 3905/4244/3801 3852/4245/3801 +f 3906/4246/3802 3908/4247/3802 3851/4248/3802 3852/4249/3802 +f 3852/4245/3803 3905/4244/3803 3903/4250/3803 3624/4251/3803 +f 3904/4252/3804 3906/4246/3804 3852/4249/3804 3624/4253/3804 +f 3624/4251/3805 3903/4250/3805 3865/4239/3805 3625/4238/3805 +f 3866/4240/3806 3904/4252/3806 3624/4253/3806 3625/4241/3806 +f 3841/4254/3807 3843/4181/3807 3911/4255/3807 3913/4256/3807 +f 3912/4257/3808 3844/4182/3808 3842/4258/3808 3914/4259/3808 +f 3913/4256/3809 3911/4255/3809 3917/4260/3809 3915/4261/3809 +f 3918/4262/3810 3912/4257/3810 3914/4259/3810 3916/4263/3810 +f 3915/4261/3811 3917/4260/3811 3919/4264/3811 3921/4265/3811 +f 3920/4266/3812 3918/4262/3812 3916/4263/3812 3922/4267/3812 +f 3921/4265/3813 3919/4264/3813 3925/4268/3813 3923/4269/3813 +f 3926/4270/3814 3920/4266/3814 3922/4267/3814 3924/4271/3814 +f 3863/4272/3815 3927/4273/3815 3923/4269/3815 3925/4268/3815 +f 3924/4271/3816 3928/4274/3816 3864/4275/3816 3926/4270/3816 +f 3865/4239/3817 3903/4250/3817 3923/4269/3817 3927/4273/3817 +f 3924/4271/3818 3904/4252/3818 3866/4240/3818 3928/4274/3818 +f 3903/4250/3819 3905/4244/3819 3921/4265/3819 3923/4269/3819 +f 3922/4267/3820 3906/4246/3820 3904/4252/3820 3924/4271/3820 +f 3905/4244/3821 3907/4243/3821 3915/4261/3821 3921/4265/3821 +f 3916/4263/3822 3908/4247/3822 3906/4246/3822 3922/4267/3822 +f 3907/4243/3823 3909/4276/3823 3913/4256/3823 3915/4261/3823 +f 3914/4259/3824 3910/4277/3824 3908/4247/3824 3916/4263/3824 +f 3839/4278/3825 3841/4254/3825 3913/4256/3825 3909/4276/3825 +f 3914/4259/3826 3842/4258/3826 3840/4279/3826 3910/4277/3826 +f 3623/4280/3827 3909/4276/3827 3907/4243/3827 3851/4242/3827 +f 3908/4247/3828 3910/4277/3828 3623/4281/3828 3851/4248/3828 +f 3833/4282/3829 3835/4283/3829 3837/4284/3829 3839/4278/3829 +f 3838/4285/3830 3836/4286/3830 3834/4287/3830 3840/4279/3830 +f 3833/4282/3831 3839/4278/3831 3909/4276/3831 3623/4280/3831 +f 3910/4277/3832 3840/4279/3832 3834/4287/3832 3623/4281/3832 +f 3622/4288/3833 3833/4282/3833 3623/4280/3833 +f 3623/4281/3834 3834/4287/3834 3622/4289/3834 +f 3843/4181/3835 3845/4183/3835 3859/4235/3835 3911/4255/3835 +f 3860/4237/3836 3846/4184/3836 3844/4182/3836 3912/4257/3836 +f 3859/4235/3837 3861/4290/3837 3917/4260/3837 3911/4255/3837 +f 3918/4262/3838 3862/4291/3838 3860/4237/3838 3912/4257/3838 +f 3861/4290/3839 3931/4292/3839 3919/4264/3839 3917/4260/3839 +f 3920/4266/3840 3932/4293/3840 3862/4291/3840 3918/4262/3840 +f 3863/4272/3841 3925/4268/3841 3919/4264/3841 3931/4292/3841 +f 3920/4266/3842 3926/4270/3842 3864/4275/3842 3932/4293/3842 +f 3897/4230/3843 3899/4226/3843 3935/4294/3843 3933/4295/3843 +f 3936/4296/3844 3900/4228/3844 3898/4232/3844 3934/4297/3844 +f 3867/4234/3845 3933/4295/3845 3935/4294/3845 3869/4298/3845 +f 3936/4296/3846 3934/4297/3846 3868/4236/3846 3870/4299/3846 +f 3847/4185/3847 3849/4187/3847 3933/4295/3847 3867/4234/3847 +f 3934/4297/3848 3850/4188/3848 3848/4186/3848 3868/4236/3848 +f 3849/4187/3849 3893/4213/3849 3891/4212/3849 3933/4295/3849 +f 3892/4215/3850 3894/4214/3850 3850/4188/3850 3934/4297/3850 +f 3891/4212/3851 3897/4230/3851 3933/4295/3851 +f 3934/4297/3852 3898/4232/3852 3892/4215/3852 +f 3849/4187/3853 3895/4216/3853 3893/4213/3853 +f 3894/4214/3854 3896/4217/3854 3850/4188/3854 +f 3863/4272/3855 3871/4300/3855 3929/4301/3855 3927/4273/3855 +f 3930/4302/3856 3872/4303/3856 3864/4275/3856 3928/4274/3856 +f 3865/4239/3857 3927/4273/3857 3929/4301/3857 3873/4219/3857 +f 3930/4302/3858 3928/4274/3858 3866/4240/3858 3874/4223/3858 +f 3869/4298/3859 3935/4294/3859 3929/4301/3859 3871/4300/3859 +f 3930/4302/3860 3936/4296/3860 3870/4299/3860 3872/4303/3860 +f 3899/4226/3861 3901/4220/3861 3929/4301/3861 3935/4294/3861 +f 3930/4302/3862 3902/4222/3862 3900/4228/3862 3936/4296/3862 +f 3873/4219/3863 3929/4301/3863 3901/4220/3863 +f 3902/4222/3864 3930/4302/3864 3874/4223/3864 +f 3949/4304/3865 3937/4305/3865 3963/4306/3865 3951/4307/3865 +f 3964/4308/3866 3938/4309/3866 3950/4310/3866 3952/4311/3866 +f 3949/4304/3867 3951/4307/3867 3953/4312/3867 3947/4313/3867 +f 3954/4314/3868 3952/4311/3868 3950/4310/3868 3948/4315/3868 +f 3947/4313/3869 3953/4312/3869 3955/4316/3869 3945/4317/3869 +f 3956/4318/3870 3954/4314/3870 3948/4315/3870 3946/4319/3870 +f 3945/4317/3871 3955/4316/3871 3957/4320/3871 3943/4321/3871 +f 3958/4322/3872 3956/4318/3872 3946/4319/3872 3944/4323/3872 +f 3943/4321/3873 3957/4320/3873 3959/4324/3873 3941/4325/3873 +f 3960/4326/3874 3958/4322/3874 3944/4323/3874 3942/4327/3874 +f 3941/4325/3875 3959/4324/3875 3961/4328/3875 3939/4329/3875 +f 3962/4330/3876 3960/4326/3876 3942/4327/3876 3940/4331/3876 +f 3959/4324/3877 3969/4332/3877 3967/4333/3877 3961/4328/3877 +f 3968/4334/3878 3970/4335/3878 3960/4326/3878 3962/4330/3878 +f 3957/4320/3879 3971/4336/3879 3969/4332/3879 3959/4324/3879 +f 3970/4335/3880 3972/4337/3880 3958/4322/3880 3960/4326/3880 +f 3955/4316/3881 3973/4338/3881 3971/4336/3881 3957/4320/3881 +f 3972/4337/3882 3974/4339/3882 3956/4318/3882 3958/4322/3882 +f 3953/4312/3883 3975/4340/3883 3973/4338/3883 3955/4316/3883 +f 3974/4339/3884 3976/4341/3884 3954/4314/3884 3956/4318/3884 +f 3951/4307/3885 3977/4342/3885 3975/4340/3885 3953/4312/3885 +f 3976/4341/3886 3978/4343/3886 3952/4311/3886 3954/4314/3886 +f 3951/4307/3887 3963/4306/3887 3965/4344/3887 3977/4342/3887 +f 3966/4345/3888 3964/4308/3888 3952/4311/3888 3978/4343/3888 +f 3867/4234/3889 3869/4298/3889 3993/4346/3889 3991/4347/3889 +f 3994/4348/3890 3870/4299/3890 3868/4236/3890 3992/4349/3890 +f 3869/4350/3891 3939/4329/3891 3961/4328/3891 3993/4351/3891 +f 3962/4330/3892 3940/4331/3892 3870/4352/3892 3994/4353/3892 +f 3859/4235/3893 3867/4234/3893 3991/4347/3893 3861/4290/3893 +f 3992/4349/3894 3868/4236/3894 3860/4237/3894 3862/4291/3894 +f 3931/4354/3895 3979/4355/3895 3963/4306/3895 3937/4305/3895 +f 3964/4308/3896 3980/4356/3896 3932/4357/3896 3938/4309/3896 +f 3961/4328/3897 3967/4333/3897 3989/4358/3897 3993/4351/3897 +f 3990/4359/3898 3968/4334/3898 3962/4330/3898 3994/4353/3898 +f 3987/4360/3899 3995/4361/3899 3993/4351/3899 3989/4358/3899 +f 3994/4353/3900 3996/4362/3900 3988/4363/3900 3990/4359/3900 +f 3983/4364/3901 3995/4361/3901 3987/4360/3901 3985/4365/3901 +f 3988/4363/3902 3996/4362/3902 3984/4366/3902 3986/4367/3902 +f 3981/4368/3903 3997/4369/3903 3995/4361/3903 3983/4364/3903 +f 3996/4362/3904 3998/4370/3904 3982/4371/3904 3984/4366/3904 +f 3979/4355/3905 3997/4369/3905 3981/4368/3905 3999/4372/3905 +f 3982/4371/3906 3998/4370/3906 3980/4356/3906 4000/4373/3906 +f 3963/4306/3907 3979/4355/3907 3999/4372/3907 3965/4344/3907 +f 4000/4373/3908 3980/4356/3908 3964/4308/3908 3966/4345/3908 +f 3861/4290/3909 3997/4374/3909 3979/4375/3909 3931/4292/3909 +f 3980/4376/3910 3998/4377/3910 3862/4291/3910 3932/4293/3910 +f 3861/4290/3911 3991/4347/3911 3995/4378/3911 3997/4374/3911 +f 3996/4379/3912 3992/4349/3912 3862/4291/3912 3998/4377/3912 +f 3991/4347/3913 3993/4346/3913 3995/4378/3913 +f 3996/4379/3914 3994/4348/3914 3992/4349/3914 +f 3965/4344/3915 3999/4372/3915 4001/4380/3915 4025/4381/3915 +f 4002/4382/3916 4000/4373/3916 3966/4345/3916 4026/4383/3916 +f 3999/4372/3917 3981/4368/3917 4011/4384/3917 4001/4380/3917 +f 4012/4385/3918 3982/4371/3918 4000/4373/3918 4002/4382/3918 +f 3981/4368/3919 3983/4364/3919 4009/4386/3919 4011/4384/3919 +f 4010/4387/3920 3984/4366/3920 3982/4371/3920 4012/4385/3920 +f 3983/4364/3921 3985/4365/3921 4007/4388/3921 4009/4386/3921 +f 4008/4389/3922 3986/4367/3922 3984/4366/3922 4010/4387/3922 +f 3985/4365/3923 3987/4360/3923 4005/4390/3923 4007/4388/3923 +f 4006/4391/3924 3988/4363/3924 3986/4367/3924 4008/4389/3924 +f 3987/4360/3925 3989/4358/3925 4003/4392/3925 4005/4390/3925 +f 4004/4393/3926 3990/4359/3926 3988/4363/3926 4006/4391/3926 +f 3989/4358/3927 3967/4333/3927 4023/4394/3927 4003/4392/3927 +f 4024/4395/3928 3968/4334/3928 3990/4359/3928 4004/4393/3928 +f 3977/4342/3929 3965/4344/3929 4025/4381/3929 4013/4396/3929 +f 4026/4383/3930 3966/4345/3930 3978/4343/3930 4014/4397/3930 +f 3975/4340/3931 3977/4342/3931 4013/4396/3931 4015/4398/3931 +f 4014/4397/3932 3978/4343/3932 3976/4341/3932 4016/4399/3932 +f 3973/4338/3933 3975/4340/3933 4015/4398/3933 4017/4400/3933 +f 4016/4399/3934 3976/4341/3934 3974/4339/3934 4018/4401/3934 +f 3971/4336/3935 3973/4338/3935 4017/4400/3935 4019/4402/3935 +f 4018/4401/3936 3974/4339/3936 3972/4337/3936 4020/4403/3936 +f 3969/4332/3937 3971/4336/3937 4019/4402/3937 4021/4404/3937 +f 4020/4403/3938 3972/4337/3938 3970/4335/3938 4022/4405/3938 +f 3967/4333/3939 3969/4332/3939 4021/4404/3939 4023/4394/3939 +f 4022/4405/3940 3970/4335/3940 3968/4334/3940 4024/4395/3940 +f 4007/4388/3941 4005/4390/3941 4029/4406/3941 4027/4407/3941 +f 4030/4408/3942 4006/4391/3942 4008/4389/3942 4028/4409/3942 +f 4027/4407/3943 4029/4406/3943 4031/4410/3943 4033/4411/3943 +f 4032/4412/3944 4030/4408/3944 4028/4409/3944 4034/4413/3944 +f 4033/4411/3945 4031/4410/3945 4037/4414/3945 4035/4415/3945 +f 4038/4416/3946 4032/4412/3946 4034/4413/3946 4036/4417/3946 +f 4035/4415/3947 4037/4414/3947 4039/4418/3947 4041/4419/3947 +f 4040/4420/3948 4038/4416/3948 4036/4417/3948 4042/4421/3948 +f 4013/4396/3949 4025/4381/3949 4035/4415/3949 4041/4419/3949 +f 4036/4417/3950 4026/4383/3950 4014/4397/3950 4042/4421/3950 +f 4001/4380/3951 4033/4411/3951 4035/4415/3951 4025/4381/3951 +f 4036/4417/3952 4034/4413/3952 4002/4382/3952 4026/4383/3952 +f 4001/4380/3953 4011/4384/3953 4027/4407/3953 4033/4411/3953 +f 4028/4409/3954 4012/4385/3954 4002/4382/3954 4034/4413/3954 +f 4007/4388/3955 4027/4407/3955 4011/4384/3955 4009/4386/3955 +f 4012/4385/3956 4028/4409/3956 4008/4389/3956 4010/4387/3956 +f 4003/4392/3957 4023/4394/3957 4029/4406/3957 4005/4390/3957 +f 4030/4408/3958 4024/4395/3958 4004/4393/3958 4006/4391/3958 +f 4021/4404/3959 4031/4410/3959 4029/4406/3959 4023/4394/3959 +f 4030/4408/3960 4032/4412/3960 4022/4405/3960 4024/4395/3960 +f 4019/4402/3961 4037/4414/3961 4031/4410/3961 4021/4404/3961 +f 4032/4412/3962 4038/4416/3962 4020/4403/3962 4022/4405/3962 +f 4017/4400/3963 4039/4418/3963 4037/4414/3963 4019/4402/3963 +f 4038/4416/3964 4040/4420/3964 4018/4401/3964 4020/4403/3964 +f 4015/4398/3965 4041/4419/3965 4039/4418/3965 4017/4400/3965 +f 4040/4420/3966 4042/4421/3966 4016/4399/3966 4018/4401/3966 +f 4013/4396/3967 4041/4419/3967 4015/4398/3967 +f 4016/4399/3968 4042/4421/3968 4014/4397/3968 +f 3941/4325/3969 3939/4329/3969 4053/4422/3969 4051/4423/3969 +f 4054/4424/3970 3940/4331/3970 3942/4327/3970 4052/4425/3970 +f 3943/4321/3971 3941/4325/3971 4051/4423/3971 4049/4426/3971 +f 4052/4425/3972 3942/4327/3972 3944/4323/3972 4050/4427/3972 +f 3945/4317/3973 3943/4321/3973 4049/4426/3973 4047/4428/3973 +f 4050/4427/3974 3944/4323/3974 3946/4319/3974 4048/4429/3974 +f 3947/4430/3975 3945/4317/3975 4047/4428/3975 4045/4431/3975 +f 4048/4429/3976 3946/4319/3976 3948/4432/3976 4046/4433/3976 +f 3949/4434/3977 3947/4430/3977 4045/4431/3977 4043/4435/3977 +f 4046/4433/3978 3948/4432/3978 3950/4436/3978 4044/4437/3978 +f 3937/4438/3979 3949/4434/3979 4043/4435/3979 4055/4439/3979 +f 4044/4437/3980 3950/4436/3980 3938/4440/3980 4056/4441/3980 +f 4043/4435/3981 4051/4423/3981 4053/4422/3981 4055/4439/3981 +f 4054/4424/3982 4052/4425/3982 4044/4437/3982 4056/4441/3982 +f 4043/4435/3983 4045/4431/3983 4049/4426/3983 4051/4423/3983 +f 4050/4427/3984 4046/4433/3984 4044/4437/3984 4052/4425/3984 +f 4045/4431/3985 4047/4428/3985 4049/4426/3985 +f 4050/4427/3986 4048/4429/3986 4046/4433/3986 +f 3863/4272/3987 3931/4292/3987 3937/4442/3987 4055/4443/3987 +f 3938/4440/3988 3932/4444/3988 3864/4445/3988 4056/4441/3988 +f 3863/4446/3989 4055/4439/3989 4053/4422/3989 3871/4447/3989 +f 4054/4424/3990 4056/4441/3990 3864/4445/3990 3872/4448/3990 +f 3869/4350/3991 3871/4447/3991 4053/4422/3991 3939/4329/3991 +f 4054/4424/3992 3872/4448/3992 3870/4352/3992 3940/4331/3992 diff --git a/modules/ufbx/data/blender_293_instancing_7400_binary.fbx b/modules/ufbx/data/blender_293_instancing_7400_binary.fbx new file mode 100644 index 0000000..da626f4 Binary files /dev/null and b/modules/ufbx/data/blender_293_instancing_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293_material_mapping_7400_binary.fbx b/modules/ufbx/data/blender_293_material_mapping_7400_binary.fbx new file mode 100644 index 0000000..abef5ae Binary files /dev/null and b/modules/ufbx/data/blender_293_material_mapping_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293_ngon_subsurf.obj b/modules/ufbx/data/blender_293_ngon_subsurf.obj new file mode 100644 index 0000000..3049fac --- /dev/null +++ b/modules/ufbx/data/blender_293_ngon_subsurf.obj @@ -0,0 +1,160 @@ +# ufbx:bad_normals +# Blender v2.93.1 OBJ File: '' +# www.blender.org +g Plane +v -0.285714 -0.098136 0.413226 +v 0.937829 0.000000 0.928330 +v -0.460317 -0.158108 -0.469873 +v 0.871949 -0.085869 -0.417109 +v 0.248437 -0.088936 1.566148 +v 1.594936 -0.085869 1.459709 +v 0.921956 -0.654242 0.930379 +v -0.035714 -0.355744 -0.651303 +v 0.863020 -0.582684 -0.415957 +v 0.552776 -0.539749 1.585911 +v 1.594936 -0.601085 1.459710 +v -0.535714 -0.098136 0.192785 +v 0.505357 0.000000 1.211489 +v 0.838690 0.000000 0.250902 +v 0.000000 -0.085869 -0.655912 +v -0.285714 -0.098136 0.913226 +v 1.029461 -0.085869 1.808282 +v 1.360116 0.000000 1.274214 +v 1.487795 -0.085869 0.487474 +v 0.469642 -0.613352 1.216098 +v 0.802976 -0.613352 0.255511 +v -0.035714 -0.527482 -0.651303 +v 1.029461 -0.601085 1.808282 +v 1.360116 -0.686954 1.274214 +v 1.487795 -0.601085 0.487474 +v -0.535714 -0.355744 -0.651303 +v 0.883035 -0.343477 -0.639780 +v 0.222321 -0.355744 1.510018 +v 1.673209 -0.343477 1.521541 +v 0.000000 0.000000 0.376352 +v 1.021426 0.000000 1.587841 +v 1.354760 0.000000 0.627254 +v 1.021426 -0.686954 1.587841 +v 1.354760 -0.686954 0.627254 +v 0.000000 -0.343477 -1.000000 +v -0.142857 -0.392545 0.394789 +v 1.532140 -0.343477 0.440881 +v 1.032140 -0.343477 1.881762 +vt 0.548251 0.350671 +vt 0.652271 0.246651 +vt 0.717143 0.389820 +vt 0.554400 0.448542 +vt 0.756292 0.142630 +vt 0.860312 0.246651 +vt 0.964333 0.350671 +vt 0.817434 0.464011 +vt 0.757280 0.544790 +vt 0.682839 0.529258 +vt 0.560550 0.546413 +vt 0.765227 0.624696 +vt 0.697373 0.622089 +vt 0.775277 0.761140 +vt 0.667914 0.653777 +vt 0.869805 0.555906 +vt 0.831967 0.556841 +vt 0.327956 0.466981 +vt 0.271977 0.447027 +vt 0.313610 0.400910 +vt 0.356348 0.428637 +vt 0.262851 0.391765 +vt 0.307700 0.365946 +vt 0.379745 0.395769 +vt 0.396222 0.596544 +vt 0.342146 0.533918 +vt 0.383779 0.487801 +vt 0.415056 0.493411 +vt 0.532234 0.686502 +vt 0.382822 0.754318 +vt 0.362253 0.711502 +vt 0.442877 0.630382 +vt 0.233410 0.822134 +vt 0.272149 0.695058 +vt 0.312973 0.679497 +vt 0.319629 0.648915 +vt 0.128878 0.675865 +vt 0.232895 0.546788 +vt 0.024346 0.529595 +vt 0.086040 0.413802 +vt 0.147735 0.298008 +vt 0.224598 0.386338 +vt 0.459765 0.257445 +vt 0.496000 0.471974 +vt 0.453689 0.485958 +vt 0.404454 0.357347 +vt 0.303750 0.277726 +vt 0.304938 0.323666 +vn 0.3105 -0.9445 -0.1077 +vn 0.1681 -0.9815 0.0919 +vn -0.0067 -0.9949 0.1004 +vn 0.0000 -1.0000 0.0000 +vn 0.1621 -0.9809 -0.1072 +vn -0.2024 -0.9395 -0.2764 +vn 0.1176 -0.9632 -0.2419 +vn -0.1888 -0.9677 0.1669 +vn -0.4259 -0.9043 0.0296 +vn 0.0799 0.9961 0.0375 +vn 0.2878 0.9124 -0.2910 +vn -0.2024 0.9395 -0.2764 +vn -0.0610 0.9899 0.1277 +vn 0.0908 0.9956 0.0223 +vn -0.4259 0.9043 0.0296 +vn -0.2230 -0.7235 0.6533 +vn 0.3714 -0.7275 0.5769 +vn 0.3241 0.9437 0.0664 +vn -0.1675 0.8005 0.5754 +vn 0.8323 0.5302 -0.1618 +vn 0.8521 0.4320 -0.2957 +vn 0.7373 0.5520 -0.3894 +vn 0.5592 0.7971 -0.2281 +vn 0.2043 0.9763 0.0709 +vn 0.1501 0.9876 -0.0453 +vn -0.9669 -0.2267 0.1169 +vn -0.7905 -0.3483 0.5037 +vn -0.7786 0.3748 0.5033 +vn -0.9669 0.2267 0.1169 +vn 0.3600 -0.0469 -0.9318 +vn -0.4843 -0.2926 -0.8245 +vn -0.4843 0.2926 -0.8245 +vn 0.4094 0.2992 -0.8619 +s off +f 1/1/1 12/2/1 30/3/1 16/4/1 +f 3/5/2 15/6/2 30/3/2 12/2/2 +f 4/7/3 14/8/3 30/3/3 15/6/3 +f 2/9/4 13/10/4 30/3/4 14/8/4 +f 5/11/5 16/4/5 30/3/5 13/10/5 +f 2/9/4 18/12/4 31/13/4 13/10/4 +f 6/14/6 17/15/6 31/13/6 18/12/6 +f 5/11/7 13/10/7 31/13/7 17/15/7 +f 4/7/8 19/16/8 32/17/8 14/8/8 +f 6/14/9 18/12/9 32/17/9 19/16/9 +f 2/9/4 14/8/4 32/17/4 18/12/4 +f 7/18/10 20/19/10 33/20/10 24/21/10 +f 10/22/11 23/23/11 33/20/11 20/19/11 +f 11/24/12 24/21/12 33/20/12 23/23/12 +f 9/25/13 21/26/13 34/27/13 25/28/13 +f 7/18/14 24/21/14 34/27/14 21/26/14 +f 11/24/15 25/28/15 34/27/15 24/21/15 +f 4/29/16 15/30/16 35/31/16 27/32/16 +f 15/30/17 3/33/17 26/34/17 35/31/17 +f 35/31/18 26/34/18 8/35/18 22/36/18 +f 27/32/19 35/31/19 22/36/19 9/25/19 +f 3/33/20 12/37/20 36/38/20 26/34/20 +f 1/39/21 16/40/21 36/38/21 12/37/21 +f 5/41/22 28/42/22 36/38/22 16/40/22 +f 10/22/23 20/19/23 36/38/23 28/42/23 +f 7/18/24 21/26/24 36/38/24 20/19/24 +f 9/25/25 22/36/25 36/38/25 21/26/25 +f 8/35/18 26/34/18 36/38/18 22/36/18 +f 6/43/26 19/44/26 37/45/26 29/46/26 +f 19/44/27 4/29/27 27/32/27 37/45/27 +f 37/45/28 27/32/28 9/25/28 25/28/28 +f 29/46/29 37/45/29 25/28/29 11/24/29 +f 5/41/30 17/47/30 38/48/30 28/42/30 +f 17/47/31 6/43/31 29/46/31 38/48/31 +f 38/48/32 29/46/32 11/24/32 23/23/32 +f 28/42/33 38/48/33 23/23/33 10/22/33 diff --git a/modules/ufbx/data/blender_293_ngon_subsurf_7400_binary.fbx b/modules/ufbx/data/blender_293_ngon_subsurf_7400_binary.fbx new file mode 100644 index 0000000..eb79302 Binary files /dev/null and b/modules/ufbx/data/blender_293_ngon_subsurf_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293_suzanne_subsurf.obj b/modules/ufbx/data/blender_293_suzanne_subsurf.obj new file mode 100644 index 0000000..b7968a0 --- /dev/null +++ b/modules/ufbx/data/blender_293_suzanne_subsurf.obj @@ -0,0 +1,8064 @@ +# ufbx:bad_normals +# Blender v2.93.1 OBJ File: '' +# www.blender.org +mtllib blender_293_suzanne_subsurf.mtl +g Suzanne +v 0.438843 0.160767 0.759033 +v -0.438843 0.160767 0.759033 +v 0.487305 0.108154 0.685547 +v -0.487305 0.108154 0.685547 +v 0.532227 0.068359 0.581055 +v -0.532227 0.068359 0.581055 +v 0.351562 -0.003906 0.616211 +v -0.351562 -0.003906 0.616211 +v 0.351685 0.052246 0.713013 +v -0.351685 0.052246 0.713013 +v 0.352417 0.127197 0.776123 +v -0.352417 0.127197 0.776123 +v 0.270142 0.160767 0.790894 +v -0.270142 0.160767 0.790894 +v 0.216675 0.108154 0.734497 +v -0.216675 0.108154 0.734497 +v 0.170898 0.068359 0.645508 +v -0.170898 0.068359 0.645508 +v 0.097656 0.243164 0.654297 +v -0.097656 0.243164 0.654297 +v 0.160645 0.242432 0.738037 +v -0.160645 0.242432 0.738037 +v 0.236572 0.243042 0.792969 +v -0.236572 0.243042 0.792969 +v 0.270142 0.329590 0.790894 +v -0.270142 0.329590 0.790894 +v 0.216675 0.377930 0.734497 +v -0.216675 0.377930 0.734497 +v 0.170898 0.422852 0.645508 +v -0.170898 0.422852 0.645508 +v 0.351562 0.496094 0.616211 +v -0.351562 0.496094 0.616211 +v 0.351685 0.434082 0.713013 +v -0.351685 0.434082 0.713013 +v 0.352417 0.364014 0.776123 +v -0.352417 0.364014 0.776123 +v 0.438843 0.329590 0.759033 +v -0.438843 0.329590 0.759033 +v 0.487305 0.377930 0.685547 +v -0.487305 0.377930 0.685547 +v 0.532227 0.422852 0.581055 +v -0.532227 0.422852 0.581055 +v 0.605469 0.243164 0.566406 +v -0.605469 0.243164 0.566406 +v 0.543457 0.242432 0.672607 +v -0.543457 0.242432 0.672607 +v 0.472656 0.243042 0.751221 +v -0.472656 0.243042 0.751221 +v 0.455404 0.243083 0.778971 +v -0.455404 0.243083 0.778971 +v 0.427531 0.318929 0.785848 +v -0.427531 0.318929 0.785848 +v 0.352458 0.350505 0.803426 +v -0.352458 0.350505 0.803426 +v 0.280924 0.318929 0.816406 +v -0.280924 0.318929 0.816406 +v 0.250244 0.243083 0.818197 +v -0.250244 0.243083 0.818197 +v 0.280924 0.171549 0.816406 +v -0.280924 0.171549 0.816406 +v 0.351969 0.242798 0.822428 +v -0.351969 0.242798 0.822428 +v 0.352458 0.140869 0.803426 +v -0.352458 0.140869 0.803426 +v 0.427531 0.171549 0.785848 +v -0.427531 0.171549 0.785848 +v 0.000000 0.432861 0.736816 +v -0.000000 0.352431 0.809679 +v 0.000000 -0.661133 0.736328 +v 0.000000 -0.306152 0.779297 +v 0.000000 -0.175293 0.791260 +v 0.000000 -0.765137 0.714600 +v 0.000000 0.439046 0.617676 +v 0.000000 0.566551 0.546875 +v 0.000000 0.855713 -0.490723 +v 0.000000 0.518066 -0.772461 +v 0.000000 0.093262 -0.771973 +v 0.000000 -0.352295 -0.304688 +v 0.226929 -0.177246 0.577515 +v -0.226929 -0.177246 0.577515 +v 0.288696 -0.443359 0.565674 +v -0.288696 -0.443359 0.565674 +v 0.323975 -0.664795 0.558960 +v -0.323975 -0.664795 0.558960 +v 0.338867 -0.845703 0.532471 +v -0.338867 -0.845703 0.532471 +v 0.302368 -0.930664 0.526001 +v -0.302368 -0.930664 0.526001 +v 0.171387 -0.960205 0.548950 +v -0.171387 -0.960205 0.548950 +v 0.000000 -0.974121 0.565918 +v 0.427002 -0.116943 0.545776 +v -0.427002 -0.116943 0.545776 +v 0.625366 -0.012573 0.525269 +v -0.625366 -0.012573 0.525269 +v 0.789429 0.167603 0.481934 +v -0.789429 0.167603 0.481934 +v 0.816772 0.393555 0.573364 +v -0.816772 0.393555 0.573364 +v 0.693237 0.479858 0.624512 +v -0.693237 0.479858 0.624512 +v 0.491455 0.592407 0.682251 +v -0.491455 0.592407 0.682251 +v 0.322388 0.711792 0.726685 +v -0.322388 0.711792 0.726685 +v 0.174561 0.676270 0.748169 +v -0.174561 0.676270 0.748169 +v 0.075806 0.499878 0.743896 +v -0.075806 0.499878 0.743896 +v 0.166992 0.407227 0.780640 +v -0.166992 0.407227 0.780640 +v 0.122559 0.310059 0.773926 +v -0.122559 0.310059 0.773926 +v 0.212769 0.071533 0.748657 +v -0.212769 0.071533 0.748657 +v 0.371216 0.027466 0.706543 +v -0.371216 0.027466 0.706543 +v 0.505615 0.075317 0.672729 +v -0.505615 0.075317 0.672729 +v 0.617920 0.189331 0.650635 +v -0.617920 0.189331 0.650635 +v 0.639771 0.300171 0.656006 +v -0.639771 0.300171 0.656006 +v 0.590088 0.376709 0.680542 +v -0.590088 0.376709 0.680542 +v 0.439087 0.443237 0.730469 +v -0.439087 0.443237 0.730469 +v 0.246460 0.473877 0.770996 +v -0.246460 0.473877 0.770996 +v 0.000000 -0.746338 0.732666 +v 0.112500 -0.737188 0.726406 +v -0.112500 -0.737188 0.726406 +v 0.121704 -0.835449 0.702271 +v -0.121704 -0.835449 0.702271 +v 0.071045 -0.882446 0.687744 +v -0.071045 -0.882446 0.687744 +v 0.000000 -0.893311 0.682861 +v 0.000000 -0.163086 0.768555 +v 0.000000 -0.134440 0.747396 +v 0.096069 -0.148438 0.753906 +v -0.096069 -0.148438 0.753906 +v 0.123657 -0.225220 0.750610 +v -0.123657 -0.225220 0.750610 +v 0.089531 -0.299844 0.743984 +v -0.089531 -0.299844 0.743984 +v 0.393799 -0.043579 0.667725 +v -0.393799 -0.043579 0.667725 +v 0.593506 0.050903 0.620850 +v -0.593506 0.050903 0.620850 +v 0.713379 0.197754 0.599365 +v -0.713379 0.197754 0.599365 +v 0.733887 0.355591 0.647339 +v -0.733887 0.355591 0.647339 +v 0.658203 0.427490 0.707153 +v -0.658203 0.427490 0.707153 +v 0.456909 0.536621 0.769775 +v -0.456909 0.536621 0.769775 +v 0.317383 0.619995 0.808838 +v -0.317383 0.619995 0.808838 +v 0.204834 0.592285 0.825439 +v -0.204834 0.592285 0.825439 +v 0.105713 0.447510 0.821411 +v -0.105713 0.447510 0.821411 +v 0.142415 -0.096300 0.776693 +v -0.142415 -0.096300 0.776693 +v 0.208252 -0.459473 0.695435 +v -0.208252 -0.459473 0.695435 +v 0.242798 -0.682739 0.678345 +v -0.242798 -0.682739 0.678345 +v 0.253784 -0.813354 0.655640 +v -0.253784 -0.813354 0.655640 +v 0.225098 -0.899292 0.632568 +v -0.225098 -0.899292 0.632568 +v 0.143921 -0.927979 0.631592 +v -0.143921 -0.927979 0.631592 +v 0.000000 -0.939697 0.636719 +v 0.000000 0.041558 0.738824 +v 0.000000 0.209473 0.765137 +v 0.329956 0.484375 0.755249 +v -0.329956 0.484375 0.755249 +v 0.149536 0.133545 0.752197 +v -0.149536 0.133545 0.752197 +v 0.123657 0.213989 0.761841 +v -0.123657 0.213989 0.761841 +v 0.114380 -0.664185 0.730225 +v -0.114380 -0.664185 0.730225 +v 0.089478 -0.457153 0.742188 +v -0.089478 -0.457153 0.742188 +v 0.000000 -0.458984 0.747070 +v 0.000000 -0.333008 0.748047 +v 0.084229 -0.272339 0.781250 +v -0.084229 -0.272339 0.781250 +v 0.121338 -0.221191 0.791138 +v -0.121338 -0.221191 0.791138 +v 0.100342 -0.147827 0.782104 +v -0.100342 -0.147827 0.782104 +v 0.039673 -0.138428 0.782104 +v -0.039673 -0.138428 0.782104 +v -0.000000 -0.202365 0.823351 +v 0.047743 -0.157769 0.809028 +v -0.047743 -0.157769 0.809028 +v 0.088108 -0.165148 0.809028 +v -0.088108 -0.165148 0.809028 +v 0.093994 -0.218994 0.819458 +v -0.093994 -0.218994 0.819458 +v 0.070095 -0.256510 0.804471 +v -0.070095 -0.256510 0.804471 +v 0.000000 -0.274170 0.804688 +v 0.246460 -0.315674 0.560303 +v -0.246460 -0.315674 0.560303 +v 0.164673 -0.234375 0.705688 +v -0.164673 -0.234375 0.705688 +v 0.180176 -0.317871 0.695801 +v -0.180176 -0.317871 0.695801 +v 0.221558 -0.244995 0.565674 +v -0.221558 -0.244995 0.565674 +v 0.000000 -0.873047 0.680908 +v 0.048706 -0.862427 0.684082 +v -0.048706 -0.862427 0.684082 +v 0.090576 -0.816895 0.701782 +v -0.090576 -0.816895 0.701782 +v 0.083862 -0.754517 0.716675 +v -0.083862 -0.754517 0.716675 +v 0.000000 -0.782959 0.662842 +v 0.077393 -0.771606 0.664876 +v -0.077393 -0.771606 0.664876 +v 0.084201 -0.809245 0.658782 +v -0.084201 -0.809245 0.658782 +v 0.051025 -0.838623 0.644246 +v -0.051025 -0.838623 0.644246 +v 0.000000 -0.848877 0.642822 +v 0.172607 0.220825 0.773804 +v -0.172607 0.220825 0.773804 +v 0.189331 0.158203 0.769165 +v -0.189331 0.158203 0.769165 +v 0.337891 0.427856 0.757935 +v -0.337891 0.427856 0.757935 +v 0.271484 0.419922 0.769409 +v -0.271484 0.419922 0.769409 +v 0.428711 0.399902 0.753296 +v -0.428711 0.399902 0.753296 +v 0.548950 0.350830 0.697632 +v -0.548950 0.350830 0.697632 +v 0.584595 0.285400 0.681030 +v -0.584595 0.285400 0.681030 +v 0.568237 0.195679 0.680054 +v -0.568237 0.195679 0.680054 +v 0.476807 0.105957 0.709473 +v -0.476807 0.105957 0.709473 +v 0.369019 0.070679 0.737061 +v -0.369019 0.070679 0.737061 +v 0.239380 0.109009 0.767944 +v -0.239380 0.109009 0.767944 +v 0.178345 0.297974 0.776245 +v -0.178345 0.297974 0.776245 +v 0.211792 0.373779 0.776367 +v -0.211792 0.373779 0.776367 +v 0.235352 0.356445 0.758789 +v -0.235352 0.356445 0.758789 +v 0.200195 0.295898 0.756836 +v -0.200195 0.295898 0.756836 +v 0.253906 0.125977 0.752930 +v -0.253906 0.125977 0.752930 +v 0.369141 0.094727 0.727539 +v -0.369141 0.094727 0.727539 +v 0.460938 0.125000 0.702148 +v -0.460938 0.125000 0.702148 +v 0.537109 0.208008 0.675781 +v -0.537109 0.208008 0.675781 +v 0.550781 0.279297 0.672852 +v -0.550781 0.279297 0.672852 +v 0.519531 0.335938 0.687500 +v -0.519531 0.335938 0.687500 +v 0.418945 0.385742 0.741211 +v -0.418945 0.385742 0.741211 +v 0.282227 0.394531 0.762695 +v -0.282227 0.394531 0.762695 +v 0.338867 0.403320 0.751953 +v -0.338867 0.403320 0.751953 +v 0.207031 0.172852 0.750977 +v -0.207031 0.172852 0.750977 +v 0.196289 0.228516 0.750977 +v -0.196289 0.228516 0.750977 +v 0.125521 0.489245 0.612891 +v -0.125521 0.489245 0.612891 +v 0.205729 0.638021 0.640625 +v -0.205729 0.638021 0.640625 +v 0.327691 0.665365 0.622179 +v -0.327691 0.665365 0.622179 +v 0.458125 0.553438 0.557578 +v -0.458125 0.553438 0.557578 +v 0.668091 0.463501 0.489014 +v -0.668091 0.463501 0.489014 +v 0.780396 0.385376 0.449707 +v -0.780396 0.385376 0.449707 +v 0.769775 0.177979 0.363892 +v -0.769775 0.177979 0.363892 +v 0.619507 -0.000366 0.387573 +v -0.619507 -0.000366 0.387573 +v 0.416667 -0.110781 0.449245 +v -0.416667 -0.110781 0.449245 +v 0.000000 0.856201 0.263916 +v 0.000000 0.950195 -0.085938 +v 0.000000 -0.175049 -0.618652 +v 0.000000 -0.436523 0.129395 +v 0.000000 -0.948242 0.456543 +v 0.000000 -0.786133 0.360352 +v 0.000000 -0.579346 0.325684 +v 0.000000 -0.475830 0.270508 +v 0.814697 0.226074 0.114136 +v -0.814697 0.226074 0.114136 +v 0.836328 0.300938 -0.049844 +v -0.836328 0.300938 -0.049844 +v 0.762813 0.282891 -0.418750 +v -0.762813 0.282891 -0.418750 +v 0.408691 0.442139 -0.665405 +v -0.408691 0.442139 -0.665405 +v 0.700312 -0.032500 0.072813 +v -0.700312 -0.032500 0.072812 +v 0.616094 -0.109531 -0.167969 +v -0.616094 -0.109531 -0.167969 +v 0.649780 0.005127 -0.400513 +v -0.649780 0.005127 -0.400513 +v 0.325521 0.077148 -0.660970 +v -0.325521 0.077148 -0.660970 +v 0.236694 -0.381104 0.408813 +v -0.236694 -0.381104 0.408813 +v 0.161865 -0.426758 0.279297 +v -0.161865 -0.426758 0.279297 +v 0.279541 -0.735840 0.403076 +v -0.279541 -0.735840 0.403076 +v 0.250000 -0.535645 0.407837 +v -0.250000 -0.535645 0.407837 +v 0.286024 -0.887153 0.430339 +v -0.286024 -0.887153 0.430339 +v 0.142334 -0.753784 0.373901 +v -0.142334 -0.753784 0.373901 +v 0.131958 -0.550171 0.349487 +v -0.131958 -0.550171 0.349487 +v 0.162720 -0.924683 0.441650 +v -0.162720 -0.924683 0.441650 +v 0.235833 -0.284766 0.404818 +v -0.235833 -0.284766 0.404818 +v 0.239176 -0.215210 0.474040 +v -0.239176 -0.215210 0.474040 +v 0.253111 -0.171658 0.501808 +v -0.253111 -0.171658 0.501808 +v 0.212630 -0.369297 0.155833 +v -0.212630 -0.369297 0.155833 +v 0.273193 -0.293091 -0.251099 +v -0.273193 -0.293091 -0.251099 +v 0.310872 -0.132080 -0.535482 +v -0.310872 -0.132080 -0.535482 +v 0.420288 0.804932 -0.407593 +v -0.420288 0.804932 -0.407593 +v 0.419922 0.896362 -0.089233 +v -0.419922 0.896362 -0.089233 +v 0.420532 0.808472 0.206787 +v -0.420532 0.808472 0.206787 +v 0.428833 0.561523 0.418091 +v -0.428833 0.561523 0.418091 +v 0.743408 0.409424 0.289062 +v -0.743408 0.409424 0.289062 +v 0.630615 0.487549 0.302734 +v -0.630615 0.487549 0.302734 +v 0.635010 0.679565 0.081543 +v -0.635010 0.679565 0.081543 +v 0.777710 0.535889 0.090576 +v -0.777710 0.535889 0.090576 +v 0.780151 0.582275 -0.138916 +v -0.780151 0.582275 -0.138916 +v 0.636719 0.740601 -0.170044 +v -0.636719 0.740601 -0.170044 +v 0.634277 0.650391 -0.414062 +v -0.634277 0.650391 -0.414062 +v 0.758247 0.524089 -0.343750 +v -0.758247 0.524089 -0.343750 +v 0.603149 0.339111 -0.558228 +v -0.603149 0.339111 -0.558228 +v 0.482005 0.019531 -0.522786 +v -0.482005 0.019531 -0.522786 +v 0.824766 0.347656 -0.205313 +v -0.824766 0.347656 -0.205313 +v 0.405755 -0.181641 0.158802 +v -0.405755 -0.181641 0.158802 +v 0.438843 -0.174072 -0.207764 +v -0.438843 -0.174072 -0.207764 +v 0.897949 0.395508 -0.258789 +v -0.897949 0.395508 -0.258789 +v 0.793335 -0.121094 -0.181519 +v -0.793335 -0.121094 -0.181519 +v 1.035889 -0.077881 -0.333130 +v -1.035889 -0.077881 -0.333130 +v 1.254883 0.070923 -0.426514 +v -1.254883 0.070923 -0.426514 +v 1.320435 0.304077 -0.431396 +v -1.320435 0.304077 -0.431396 +v 1.218506 0.467773 -0.420288 +v -1.218506 0.467773 -0.420288 +v 1.031982 0.459351 -0.333862 +v -1.031982 0.459351 -0.333862 +v 1.027222 0.409180 -0.304321 +v -1.027222 0.409180 -0.304321 +v 1.179810 0.415039 -0.389526 +v -1.179810 0.415039 -0.389526 +v 1.255371 0.280273 -0.411621 +v -1.255371 0.280273 -0.411621 +v 1.200806 0.088623 -0.401611 +v -1.200806 0.088623 -0.401611 +v 1.030518 -0.031006 -0.306030 +v -1.030518 -0.031006 -0.306030 +v 0.839600 -0.064575 -0.168579 +v -0.839600 -0.064575 -0.168579 +v 0.923706 0.356445 -0.236816 +v -0.923706 0.356445 -0.236816 +v 0.946167 0.306885 -0.293213 +v -0.946167 0.306885 -0.293213 +v 0.886963 -0.023926 -0.235107 +v -0.886963 -0.023926 -0.235107 +v 1.037964 0.004150 -0.356323 +v -1.037964 0.004150 -0.356323 +v 1.180054 0.099243 -0.435547 +v -1.180054 0.099243 -0.435547 +v 1.227051 0.247681 -0.445068 +v -1.227051 0.247681 -0.445068 +v 1.165039 0.350952 -0.428589 +v -1.165039 0.350952 -0.428589 +v 1.033203 0.347534 -0.358643 +v -1.033203 0.347534 -0.358643 +v 0.851318 0.287598 -0.216064 +v -0.851318 0.287598 -0.216064 +v 0.828857 0.173584 -0.270386 +v -0.828857 0.173584 -0.270386 +v 0.772461 0.096680 -0.270264 +v -0.772461 0.096680 -0.270264 +v 0.811632 0.071181 -0.281467 +v -0.811632 0.071181 -0.281467 +v 0.823608 0.022583 -0.269653 +v -0.823608 0.022583 -0.269653 +v 0.813721 -0.013672 -0.259521 +v -0.813721 -0.013672 -0.259521 +v 0.739176 0.032064 -0.078288 +v -0.739176 0.032064 -0.078288 +v 0.727526 -0.027448 -0.168229 +v -0.727526 -0.027448 -0.168229 +v 0.738307 0.048411 -0.191979 +v -0.738307 0.048411 -0.191979 +v 0.803589 0.201538 -0.198730 +v -0.803589 0.201538 -0.198730 +v 0.885498 0.245972 -0.269043 +v -0.885498 0.245972 -0.269043 +v 0.900635 0.226685 -0.320068 +v -0.900635 0.226685 -0.320068 +v 0.837023 -0.007595 -0.299479 +v -0.837023 -0.007595 -0.299479 +v 0.853027 0.024536 -0.315186 +v -0.853027 0.024536 -0.315186 +v 0.830688 0.077881 -0.315430 +v -0.830688 0.077881 -0.315430 +v 0.794705 0.106554 -0.310113 +v -0.794705 0.106554 -0.310113 +v 0.845459 0.162964 -0.315552 +v -0.845459 0.162964 -0.315552 +v 1.049113 0.320719 -0.404785 +v -1.049113 0.320719 -0.404785 +v 1.164836 0.323649 -0.460449 +v -1.164836 0.323649 -0.460449 +v 1.222412 0.234009 -0.471924 +v -1.222412 0.234009 -0.471924 +v 1.175903 0.106567 -0.460327 +v -1.175903 0.106567 -0.460327 +v 1.039795 0.023315 -0.397949 +v -1.039795 0.023315 -0.397949 +v 0.899414 -0.004639 -0.291016 +v -0.899414 -0.004639 -0.291016 +v 0.962769 0.281982 -0.345825 +v -0.962769 0.281982 -0.345825 +v 0.890503 0.114258 -0.329834 +v -0.890503 0.114258 -0.329834 +v 0.924194 0.060791 -0.331177 +v -0.924194 0.060791 -0.331177 +v 1.000000 0.116333 -0.369141 +v -1.000000 0.116333 -0.369141 +v 0.955688 0.173706 -0.349731 +v -0.955688 0.173706 -0.349731 +v 1.014526 0.232300 -0.371948 +v -1.014526 0.232300 -0.371948 +v 1.067749 0.177734 -0.392822 +v -1.067749 0.177734 -0.392822 +v 1.123481 0.223524 -0.411024 +v -1.123481 0.223524 -0.411024 +v 1.087077 0.274699 -0.401489 +v -1.087077 0.274699 -0.401489 +v 1.032837 0.375732 -0.458740 +v -1.032837 0.375732 -0.458740 +v 1.239827 0.400635 -0.516642 +v -1.239827 0.400635 -0.516642 +v 1.328270 0.287543 -0.496600 +v -1.328270 0.287543 -0.496600 +v 1.274984 0.114136 -0.510905 +v -1.274984 0.114136 -0.510905 +v 1.039917 -0.011475 -0.456787 +v -1.039917 -0.011475 -0.456787 +v 0.807983 -0.048950 -0.340698 +v -0.807983 -0.048950 -0.340698 +v 0.864380 0.318726 -0.376953 +v -0.864380 0.318726 -0.376953 +v 0.503906 0.242676 0.717773 +v 0.463867 0.198242 0.753418 +v 0.459961 0.137207 0.728027 +v 0.528320 0.169922 0.676270 +v -0.528320 0.169922 0.676270 +v -0.459961 0.137207 0.728027 +v -0.463867 0.198242 0.753418 +v -0.503906 0.242676 0.717773 +v 0.576172 0.242676 0.621094 +v 0.510742 0.086426 0.635254 +v 0.585938 0.148438 0.570312 +v -0.585938 0.148438 0.570312 +v -0.510742 0.086426 0.635254 +v -0.576172 0.242676 0.621094 +v 0.424805 0.067383 0.698730 +v 0.351562 0.021484 0.666992 +v 0.449219 0.015625 0.597656 +v -0.449219 0.015625 0.597656 +v -0.351562 0.021484 0.666992 +v -0.424805 0.067383 0.698730 +v 0.398926 0.136230 0.767090 +v 0.352051 0.093750 0.749512 +v -0.352051 0.093750 0.749512 +v -0.398926 0.136230 0.767090 +v 0.307617 0.136230 0.784668 +v 0.246582 0.137207 0.767090 +v 0.278809 0.067383 0.725586 +v -0.278809 0.067383 0.725586 +v -0.246582 0.137207 0.767090 +v -0.307617 0.136230 0.784668 +v 0.192383 0.086426 0.692383 +v 0.253906 0.015625 0.632812 +v -0.253906 0.015625 0.632812 +v -0.192383 0.086426 0.692383 +v 0.175781 0.169922 0.737793 +v 0.126953 0.242676 0.698242 +v 0.117188 0.148438 0.652344 +v -0.117188 0.148438 0.652344 +v -0.126953 0.242676 0.698242 +v -0.175781 0.169922 0.737793 +v 0.245605 0.198242 0.792969 +v 0.203125 0.242676 0.769531 +v -0.203125 0.242676 0.769531 +v -0.245605 0.198242 0.792969 +v 0.245605 0.289551 0.792969 +v 0.246582 0.350586 0.767090 +v 0.175781 0.315430 0.737793 +v -0.175781 0.315430 0.737793 +v -0.246582 0.350586 0.767090 +v -0.245605 0.289551 0.792969 +v 0.192383 0.401367 0.692383 +v 0.117188 0.339844 0.652344 +v -0.117188 0.339844 0.652344 +v -0.192383 0.401367 0.692383 +v 0.278809 0.418945 0.725586 +v 0.351562 0.466797 0.666992 +v 0.253906 0.476562 0.632812 +v -0.253906 0.476562 0.632812 +v -0.351562 0.466797 0.666992 +v -0.278809 0.418945 0.725586 +v 0.307617 0.354980 0.784668 +v 0.352051 0.394531 0.749512 +v -0.352051 0.394531 0.749512 +v -0.307617 0.354980 0.784668 +v 0.398926 0.354980 0.767090 +v 0.459961 0.350586 0.728027 +v 0.424805 0.418945 0.698730 +v -0.424805 0.418945 0.698730 +v -0.459961 0.350586 0.728027 +v -0.398926 0.354980 0.767090 +v 0.510742 0.401367 0.635254 +v 0.449219 0.476562 0.597656 +v -0.449219 0.476562 0.597656 +v -0.510742 0.401367 0.635254 +v 0.528320 0.315430 0.676270 +v 0.585938 0.339844 0.570312 +v -0.585938 0.339844 0.570312 +v -0.528320 0.315430 0.676270 +v 0.463867 0.289551 0.753418 +v -0.463867 0.289551 0.753418 +v 0.464844 0.243164 0.767578 +v 0.434082 0.325195 0.774902 +v 0.450846 0.284668 0.779622 +v -0.450846 0.284668 0.779622 +v -0.434082 0.325195 0.774902 +v -0.464844 0.243164 0.767578 +v 0.352539 0.358398 0.792480 +v 0.394043 0.344564 0.793457 +v -0.394043 0.344564 0.793457 +v -0.352539 0.358398 0.792480 +v 0.275391 0.325195 0.806641 +v 0.312663 0.344564 0.810872 +v -0.312663 0.344564 0.810872 +v -0.275391 0.325195 0.806641 +v 0.243164 0.243164 0.808594 +v 0.256348 0.284668 0.818034 +v -0.256348 0.284668 0.818034 +v -0.243164 0.243164 0.808594 +v 0.275391 0.166016 0.806641 +v 0.256348 0.203288 0.818034 +v -0.256348 0.203288 0.818034 +v -0.275391 0.166016 0.806641 +v 0.352539 0.133789 0.792480 +v 0.312663 0.146973 0.810872 +v -0.312663 0.146973 0.810872 +v -0.352539 0.133789 0.792480 +v 0.434082 0.166016 0.774902 +v 0.394043 0.146973 0.793457 +v -0.394043 0.146973 0.793457 +v -0.434082 0.166016 0.774902 +v 0.450846 0.203288 0.779622 +v -0.450846 0.203288 0.779622 +v 0.419271 0.242839 0.797526 +v 0.401042 0.195964 0.802083 +v -0.419271 0.242839 0.797526 +v -0.401042 0.195964 0.802083 +v 0.352214 0.175781 0.813802 +v -0.352214 0.175781 0.813802 +v 0.305339 0.195964 0.822266 +v -0.305339 0.195964 0.822266 +v 0.285156 0.242839 0.823568 +v -0.285156 0.242839 0.823568 +v 0.305339 0.292318 0.822266 +v -0.305339 0.292318 0.822266 +v 0.352214 0.313151 0.813802 +v -0.352214 0.313151 0.813802 +v 0.401042 0.292318 0.802083 +v -0.401042 0.292318 0.802083 +v 0.087891 -0.969727 0.560547 +v 0.164062 -0.948730 0.593750 +v 0.076660 -0.936035 0.634766 +v 0.000000 -0.960938 0.605469 +v -0.076660 -0.936035 0.634766 +v -0.164062 -0.948730 0.593750 +v -0.087891 -0.969727 0.560547 +v 0.246094 -0.949219 0.535645 +v 0.271973 -0.922852 0.582520 +v 0.192383 -0.918457 0.629883 +v -0.192383 -0.918457 0.629883 +v -0.271973 -0.922852 0.582520 +v -0.246094 -0.949219 0.535645 +v 0.330566 -0.898438 0.525391 +v 0.310059 -0.845215 0.599121 +v 0.245117 -0.862305 0.642578 +v -0.245117 -0.862305 0.642578 +v -0.310059 -0.845215 0.599121 +v -0.330566 -0.898438 0.525391 +v 0.335449 -0.765625 0.545898 +v 0.297852 -0.686523 0.626465 +v 0.252441 -0.758301 0.667480 +v -0.252441 -0.758301 0.667480 +v -0.297852 -0.686523 0.626465 +v -0.335449 -0.765625 0.545898 +v 0.308105 -0.549805 0.564941 +v 0.261230 -0.457520 0.638184 +v 0.226562 -0.572266 0.688477 +v -0.226562 -0.572266 0.688477 +v -0.261230 -0.457520 0.638184 +v -0.308105 -0.549805 0.564941 +v 0.200195 -0.150879 0.669922 +v 0.312988 -0.148926 0.563477 +v 0.412109 -0.087402 0.609863 +v 0.272461 -0.069336 0.715332 +v -0.272461 -0.069336 0.715332 +v -0.412109 -0.087402 0.609863 +v -0.312988 -0.148926 0.563477 +v -0.200195 -0.150879 0.669922 +v 0.529785 -0.072754 0.537598 +v 0.618164 0.016113 0.577148 +v 0.501953 -0.003418 0.639160 +v -0.501953 -0.003418 0.639160 +v -0.618164 0.016113 0.577148 +v -0.529785 -0.072754 0.537598 +v 0.717773 0.067383 0.495117 +v 0.761230 0.183105 0.543457 +v 0.665039 0.119141 0.604004 +v -0.665039 0.119141 0.604004 +v -0.761230 0.183105 0.543457 +v -0.717773 0.067383 0.495117 +v 0.822754 0.288574 0.520508 +v 0.785156 0.379883 0.618652 +v 0.735352 0.283203 0.617676 +v -0.735352 0.283203 0.617676 +v -0.785156 0.379883 0.618652 +v -0.822754 0.288574 0.520508 +v 0.770508 0.445801 0.603027 +v 0.682617 0.458984 0.677734 +v 0.711914 0.395020 0.676758 +v -0.711914 0.395020 0.676758 +v -0.682617 0.458984 0.677734 +v -0.770508 0.445801 0.603027 +v 0.594238 0.530273 0.652832 +v 0.475586 0.574219 0.739258 +v 0.561523 0.479004 0.739746 +v -0.561523 0.479004 0.739746 +v -0.475586 0.574219 0.739258 +v -0.594238 0.530273 0.652832 +v 0.402832 0.661621 0.707031 +v 0.317871 0.679688 0.782227 +v 0.379395 0.587402 0.792480 +v -0.379395 0.587402 0.792480 +v -0.317871 0.679688 0.782227 +v -0.402832 0.661621 0.707031 +v 0.244141 0.716797 0.740723 +v 0.184570 0.645996 0.801270 +v 0.259277 0.623047 0.819824 +v -0.259277 0.623047 0.819824 +v -0.184570 0.645996 0.801270 +v -0.244141 0.716797 0.740723 +v 0.120117 0.589844 0.748047 +v 0.083984 0.478027 0.795898 +v 0.153809 0.523438 0.825684 +v -0.153809 0.523438 0.825684 +v -0.083984 0.478027 0.795898 +v -0.120117 0.589844 0.748047 +v 0.036621 0.448730 0.739258 +v 0.000000 0.408203 0.785156 +v 0.060059 0.395508 0.813477 +v -0.060059 0.395508 0.813477 +v -0.036621 0.448730 0.739258 +v 0.135742 0.425293 0.806152 +v 0.204590 0.446289 0.777344 +v 0.226562 0.529785 0.803223 +v -0.226562 0.529785 0.803223 +v -0.204590 0.446289 0.777344 +v -0.135742 0.425293 0.806152 +v 0.287109 0.486328 0.763672 +v 0.322754 0.548340 0.787109 +v -0.322754 0.548340 0.787109 +v -0.287109 0.486328 0.763672 +v 0.378418 0.468750 0.745605 +v 0.445801 0.488281 0.753906 +v -0.445801 0.488281 0.753906 +v -0.378418 0.468750 0.745605 +v 0.518555 0.411621 0.705566 +v 0.624023 0.399414 0.697754 +v -0.624023 0.399414 0.697754 +v -0.518555 0.411621 0.705566 +v 0.626953 0.341309 0.665039 +v 0.683594 0.325684 0.654297 +v -0.683594 0.325684 0.654297 +v -0.626953 0.341309 0.665039 +v 0.639160 0.248047 0.650391 +v 0.662598 0.195801 0.631348 +v -0.662598 0.195801 0.631348 +v -0.639160 0.248047 0.650391 +v 0.568848 0.128418 0.659180 +v 0.548828 0.066406 0.650391 +v -0.548828 0.066406 0.650391 +v -0.568848 0.128418 0.659180 +v 0.441895 0.040039 0.687988 +v 0.379883 -0.004883 0.693848 +v -0.379883 -0.004883 0.693848 +v -0.441895 0.040039 0.687988 +v 0.287109 0.042480 0.729980 +v 0.181641 0.006836 0.761230 +v -0.181641 0.006836 0.761230 +v -0.287109 0.042480 0.729980 +v 0.171387 0.101074 0.752930 +v 0.090332 0.096191 0.746094 +v 0.076172 -0.023926 0.763184 +v -0.076172 -0.023926 0.763184 +v -0.090332 0.096191 0.746094 +v -0.171387 0.101074 0.752930 +v 0.139160 0.360352 0.778809 +v 0.071777 0.325195 0.791016 +v -0.071777 0.325195 0.791016 +v -0.139160 0.360352 0.778809 +v 0.118652 0.260742 0.768066 +v 0.000000 0.275391 0.785156 +v 0.067871 0.210938 0.762695 +v -0.067871 0.210938 0.762695 +v -0.118652 0.260742 0.768066 +v 0.000000 0.140625 0.748047 +v 0.133789 0.171387 0.755859 +v -0.133789 0.171387 0.755859 +v 0.106934 -0.903809 0.665039 +v 0.036621 -0.891113 0.684082 +v 0.000000 -0.915039 0.664062 +v -0.036621 -0.891113 0.684082 +v -0.106934 -0.903809 0.665039 +v 0.169434 -0.865723 0.674316 +v 0.101074 -0.865234 0.693848 +v -0.101074 -0.865234 0.693848 +v -0.169434 -0.865723 0.674316 +v 0.185547 -0.773438 0.697266 +v 0.127930 -0.789062 0.712891 +v -0.127930 -0.789062 0.712891 +v -0.185547 -0.773438 0.697266 +v 0.147949 -0.458496 0.727539 +v 0.102051 -0.566895 0.736816 +v 0.179199 -0.673340 0.711914 +v -0.179199 -0.673340 0.711914 +v -0.102051 -0.566895 0.736816 +v -0.147949 -0.458496 0.727539 +v 0.117188 -0.712891 0.727051 +v -0.117188 -0.712891 0.727051 +v 0.085938 -0.371094 0.741699 +v 0.042969 -0.324219 0.748047 +v 0.000000 -0.381836 0.746094 +v 0.041992 -0.458008 0.747070 +v -0.041992 -0.458008 0.747070 +v -0.042969 -0.324219 0.748047 +v -0.085938 -0.371094 0.741699 +v 0.055664 -0.661133 0.736328 +v 0.000000 -0.563477 0.742188 +v -0.055664 -0.661133 0.736328 +v 0.000000 -0.717773 0.734375 +v 0.054199 -0.736816 0.732910 +v -0.054199 -0.736816 0.732910 +v 0.114746 -0.259277 0.747070 +v 0.121094 -0.222656 0.770508 +v 0.109863 -0.249512 0.787109 +v 0.083496 -0.279785 0.763184 +v -0.083496 -0.279785 0.763184 +v -0.109863 -0.249512 0.787109 +v -0.121094 -0.222656 0.770508 +v -0.114746 -0.259277 0.747070 +v 0.118164 -0.184570 0.753418 +v 0.097656 -0.150391 0.763184 +v 0.117676 -0.182129 0.787598 +v -0.117676 -0.182129 0.787598 +v -0.097656 -0.150391 0.763184 +v -0.118164 -0.184570 0.753418 +v 0.055176 -0.127930 0.750488 +v 0.027832 -0.141113 0.763184 +v 0.070801 -0.133789 0.780273 +v -0.070801 -0.133789 0.780273 +v -0.027832 -0.141113 0.763184 +v -0.055176 -0.127930 0.750488 +v 0.000000 -0.165039 0.756836 +v 0.000000 -0.176758 0.770508 +v 0.017578 -0.160156 0.787598 +v -0.017578 -0.160156 0.787598 +v 0.000000 -0.313477 0.761719 +v 0.045410 -0.294922 0.779297 +v -0.045410 -0.294922 0.779297 +v 0.000000 -0.293945 0.792969 +v 0.079590 -0.262695 0.795410 +v 0.041992 -0.266113 0.804688 +v -0.041992 -0.266113 0.804688 +v -0.079590 -0.262695 0.795410 +v 0.000000 -0.180664 0.808594 +v 0.032715 -0.175293 0.816406 +v 0.044922 -0.145020 0.798828 +v -0.044922 -0.145020 0.798828 +v -0.032715 -0.175293 0.816406 +v 0.068848 -0.157227 0.810547 +v 0.096680 -0.153809 0.798828 +v -0.096680 -0.153809 0.798828 +v -0.068848 -0.157227 0.810547 +v 0.094238 -0.187988 0.816406 +v 0.114258 -0.220703 0.808105 +v -0.114258 -0.220703 0.808105 +v -0.094238 -0.187988 0.816406 +v 0.084473 -0.240723 0.812988 +v -0.084473 -0.240723 0.812988 +v 0.054688 -0.213867 0.823242 +v -0.054688 -0.213867 0.823242 +v 0.000000 -0.244141 0.816406 +v 0.000000 -0.066406 0.745117 +v 0.103027 -0.128906 0.766113 +v -0.103027 -0.128906 0.766113 +v 0.139160 -0.229004 0.735840 +v 0.149902 -0.179688 0.734375 +v -0.149902 -0.179688 0.734375 +v -0.139160 -0.229004 0.735840 +v 0.135742 -0.310547 0.727539 +v 0.172852 -0.275391 0.695801 +v -0.172852 -0.275391 0.695801 +v -0.135742 -0.310547 0.727539 +v 0.192383 -0.376953 0.696777 +v -0.192383 -0.376953 0.696777 +v 0.266602 -0.368164 0.562988 +v 0.221680 -0.320312 0.633789 +v -0.221680 -0.320312 0.633789 +v -0.266602 -0.368164 0.562988 +v 0.232910 -0.277344 0.561035 +v 0.197266 -0.241699 0.639648 +v -0.197266 -0.241699 0.639648 +v -0.232910 -0.277344 0.561035 +v 0.208008 -0.210449 0.574707 +v -0.208008 -0.210449 0.574707 +v 0.089355 -0.747559 0.727539 +v 0.000000 -0.759766 0.727539 +v 0.047852 -0.756836 0.716309 +v -0.047852 -0.756836 0.716309 +v -0.089355 -0.747559 0.727539 +v 0.098633 -0.821777 0.710938 +v 0.096191 -0.780762 0.710938 +v -0.096191 -0.780762 0.710938 +v -0.098633 -0.821777 0.710938 +v 0.054199 -0.870117 0.693359 +v 0.072754 -0.844238 0.691895 +v -0.072754 -0.844238 0.691895 +v -0.054199 -0.870117 0.693359 +v 0.000000 -0.880859 0.688477 +v 0.024414 -0.871094 0.681152 +v -0.024414 -0.871094 0.681152 +v 0.000000 -0.865234 0.660156 +v 0.046875 -0.854980 0.662109 +v 0.026367 -0.846191 0.643066 +v -0.026367 -0.846191 0.643066 +v -0.046875 -0.854980 0.662109 +v 0.087891 -0.812988 0.676270 +v 0.072266 -0.826660 0.646810 +v -0.072266 -0.826660 0.646810 +v -0.087891 -0.812988 0.676270 +v 0.082031 -0.758789 0.691895 +v 0.089844 -0.787109 0.659017 +v -0.089844 -0.787109 0.659017 +v -0.082031 -0.758789 0.691895 +v 0.000000 -0.769531 0.689453 +v 0.043945 -0.775879 0.664551 +v -0.043945 -0.775879 0.664551 +v 0.000000 -0.815430 0.645508 +v 0.063477 -0.804199 0.647298 +v -0.063477 -0.804199 0.647298 +v 0.155273 0.217285 0.769043 +v 0.177734 0.150879 0.762695 +v 0.178223 0.187500 0.770996 +v -0.178223 0.187500 0.770996 +v -0.177734 0.150879 0.762695 +v -0.155273 0.217285 0.769043 +v 0.156738 0.301758 0.773438 +v 0.172363 0.258301 0.775391 +v -0.172363 0.258301 0.775391 +v -0.156738 0.301758 0.773438 +v 0.192383 0.389160 0.775391 +v 0.191406 0.337891 0.776855 +v -0.191406 0.337891 0.776855 +v -0.192383 0.389160 0.775391 +v 0.229980 0.099609 0.756836 +v 0.206055 0.132812 0.770508 +v -0.206055 0.132812 0.770508 +v -0.229980 0.099609 0.756836 +v 0.368652 0.052246 0.724121 +v 0.300293 0.084473 0.754395 +v -0.300293 0.084473 0.754395 +v -0.368652 0.052246 0.724121 +v 0.485352 0.090332 0.694824 +v 0.425781 0.079102 0.723145 +v -0.425781 0.079102 0.723145 +v -0.485352 0.090332 0.694824 +v 0.588379 0.190430 0.668457 +v 0.528320 0.147461 0.692871 +v -0.528320 0.147461 0.692871 +v -0.588379 0.190430 0.668457 +v 0.607910 0.289062 0.668945 +v 0.584473 0.242676 0.677734 +v -0.584473 0.242676 0.677734 +v -0.607910 0.289062 0.668945 +v 0.566406 0.361328 0.686523 +v 0.576172 0.320801 0.685059 +v -0.576172 0.320801 0.685059 +v -0.566406 0.361328 0.686523 +v 0.433594 0.415527 0.738281 +v 0.492676 0.377441 0.726562 +v -0.492676 0.377441 0.726562 +v -0.433594 0.415527 0.738281 +v 0.334961 0.447754 0.751465 +v 0.378418 0.417480 0.759277 +v -0.378418 0.417480 0.759277 +v -0.334961 0.447754 0.751465 +v 0.261230 0.439941 0.765137 +v 0.303223 0.428711 0.762695 +v -0.303223 0.428711 0.762695 +v -0.261230 0.439941 0.765137 +v 0.239746 0.401367 0.773926 +v -0.239746 0.401367 0.773926 +v 0.277832 0.405762 0.767578 +v 0.225098 0.363770 0.769531 +v 0.257812 0.378906 0.761719 +v -0.257812 0.378906 0.761719 +v -0.225098 0.363770 0.769531 +v -0.277832 0.405762 0.767578 +v 0.338867 0.414062 0.756836 +v 0.308594 0.402344 0.757812 +v -0.308594 0.402344 0.757812 +v -0.338867 0.414062 0.756836 +v 0.423828 0.391113 0.751465 +v 0.375000 0.398438 0.750000 +v -0.375000 0.398438 0.750000 +v -0.423828 0.391113 0.751465 +v 0.533691 0.342773 0.695801 +v 0.472656 0.363281 0.714844 +v -0.472656 0.363281 0.714844 +v -0.533691 0.342773 0.695801 +v 0.566406 0.282227 0.680176 +v 0.542969 0.308594 0.675781 +v -0.542969 0.308594 0.675781 +v -0.566406 0.282227 0.680176 +v 0.551758 0.201660 0.680664 +v 0.550781 0.246094 0.671875 +v -0.550781 0.246094 0.671875 +v -0.551758 0.201660 0.680664 +v 0.468750 0.116699 0.709473 +v 0.503906 0.164062 0.687500 +v -0.503906 0.164062 0.687500 +v -0.468750 0.116699 0.709473 +v 0.369141 0.083984 0.735840 +v 0.417969 0.101562 0.714844 +v -0.417969 0.101562 0.714844 +v -0.369141 0.083984 0.735840 +v 0.247070 0.117676 0.764160 +v 0.308594 0.105469 0.742188 +v -0.308594 0.105469 0.742188 +v -0.247070 0.117676 0.764160 +v 0.198730 0.165527 0.763184 +v 0.222656 0.148438 0.753906 +v -0.222656 0.148438 0.753906 +v -0.198730 0.165527 0.763184 +v 0.191406 0.296387 0.769043 +v 0.214844 0.328125 0.757812 +v -0.214844 0.328125 0.757812 +v -0.191406 0.296387 0.769043 +v 0.185547 0.224609 0.765625 +v 0.195312 0.261719 0.753906 +v -0.195312 0.261719 0.753906 +v -0.185547 0.224609 0.765625 +v 0.199219 0.199219 0.750000 +v -0.199219 0.199219 0.750000 +v 0.000000 0.432617 0.673828 +v 0.086426 0.496094 0.679688 +v 0.047201 0.448405 0.620117 +v -0.047201 0.448405 0.620117 +v -0.086426 0.496094 0.679688 +v 0.183594 0.668457 0.683594 +v 0.179199 0.575195 0.625977 +v -0.179199 0.575195 0.625977 +v -0.183594 0.668457 0.683594 +v 0.329102 0.700684 0.661621 +v 0.266113 0.662598 0.620117 +v -0.266113 0.662598 0.620117 +v -0.329102 0.700684 0.661621 +v 0.494141 0.582520 0.618652 +v 0.377441 0.621094 0.596191 +v -0.377441 0.621094 0.596191 +v -0.494141 0.582520 0.618652 +v 0.686035 0.476074 0.562500 +v 0.580078 0.506836 0.519043 +v -0.580078 0.506836 0.519043 +v -0.686035 0.476074 0.562500 +v 0.808105 0.391602 0.516602 +v 0.736816 0.433105 0.472168 +v -0.736816 0.433105 0.472168 +v -0.808105 0.391602 0.516602 +v 0.781250 0.166992 0.433105 +v 0.792969 0.290039 0.402832 +v -0.792969 0.290039 0.402832 +v -0.781250 0.166992 0.433105 +v 0.617676 -0.009766 0.471191 +v 0.706055 0.080078 0.365234 +v -0.706055 0.080078 0.365234 +v -0.617676 -0.009766 0.471191 +v 0.430664 -0.112793 0.500977 +v 0.527832 -0.060059 0.411621 +v -0.527832 -0.060059 0.411621 +v -0.430664 -0.112793 0.500977 +v 0.066895 -0.569824 0.333008 +v 0.000000 -0.514648 0.302734 +v 0.088379 -0.459473 0.266602 +v 0.144531 -0.476562 0.318848 +v -0.144531 -0.476562 0.318848 +v -0.088379 -0.459473 0.266602 +v -0.066895 -0.569824 0.333008 +v 0.070801 -0.775391 0.365234 +v 0.000000 -0.677734 0.339844 +v 0.133301 -0.647949 0.362305 +v -0.133301 -0.647949 0.362305 +v -0.070801 -0.775391 0.365234 +v 0.081543 -0.940430 0.452148 +v 0.000000 -0.880859 0.402344 +v 0.152832 -0.851562 0.400879 +v -0.152832 -0.851562 0.400879 +v -0.081543 -0.940430 0.452148 +v 0.169922 -0.956543 0.494629 +v 0.000000 -0.974609 0.513672 +v -0.169922 -0.956543 0.494629 +v 0.308594 -0.916992 0.464844 +v 0.243164 -0.908691 0.427734 +v -0.243164 -0.908691 0.427734 +v -0.308594 -0.916992 0.464844 +v 0.324707 -0.791504 0.460449 +v 0.293945 -0.830566 0.409180 +v -0.293945 -0.830566 0.409180 +v -0.324707 -0.791504 0.460449 +v 0.300781 -0.597656 0.478516 +v 0.263672 -0.634277 0.404297 +v -0.263672 -0.634277 0.404297 +v -0.300781 -0.597656 0.478516 +v 0.215332 -0.731934 0.380371 +v 0.193359 -0.529297 0.369629 +v -0.193359 -0.529297 0.369629 +v -0.215332 -0.731934 0.380371 +v 0.205566 -0.394043 0.333008 +v 0.242188 -0.449707 0.408691 +v -0.242188 -0.449707 0.408691 +v -0.205566 -0.394043 0.333008 +v 0.272461 -0.407715 0.487793 +v -0.272461 -0.407715 0.487793 +v 0.240723 -0.301758 0.494141 +v 0.244629 -0.242188 0.444824 +v 0.222168 -0.238281 0.511719 +v -0.222168 -0.238281 0.511719 +v -0.244629 -0.242188 0.444824 +v -0.240723 -0.301758 0.494141 +v 0.229980 -0.334473 0.410156 +v -0.229980 -0.334473 0.410156 +v 0.234863 -0.179199 0.524902 +v 0.227702 -0.192871 0.492350 +v -0.227702 -0.192871 0.492350 +v -0.234863 -0.179199 0.524902 +v 0.311198 -0.144531 0.490885 +v -0.311198 -0.144531 0.490885 +v 0.000000 -0.058594 -0.712891 +v 0.176270 0.087891 -0.732422 +v 0.309408 -0.042969 -0.615560 +v 0.168457 -0.164551 -0.585938 +v -0.168457 -0.164551 -0.585938 +v -0.309408 -0.042969 -0.615560 +v -0.176270 0.087891 -0.732422 +v 0.000000 -0.274414 -0.484375 +v 0.297363 -0.219727 -0.413086 +v 0.145996 -0.335449 -0.285156 +v -0.145996 -0.335449 -0.285156 +v -0.297363 -0.219727 -0.413086 +v 0.000000 -0.404297 -0.074219 +v 0.242676 -0.339355 -0.052246 +v 0.108887 -0.418945 0.126953 +v -0.108887 -0.418945 0.126953 +v -0.242676 -0.339355 -0.052246 +v 0.000000 -0.455078 0.228516 +v 0.174805 -0.400391 0.239746 +v -0.174805 -0.400391 0.239746 +v 0.229818 -0.328125 0.288900 +v -0.229818 -0.328125 0.288900 +v 0.788086 0.197266 0.241211 +v 0.655273 -0.009277 0.247070 +v 0.779785 0.100586 0.088867 +v -0.779785 0.100586 0.088867 +v -0.655273 -0.009277 0.247070 +v -0.788086 0.197266 0.241211 +v 0.000000 0.298828 -0.800781 +v 0.222168 0.493164 -0.734375 +v 0.367676 0.246094 -0.688477 +v -0.367676 0.246094 -0.688477 +v -0.222168 0.493164 -0.734375 +v 0.000000 0.928711 0.099609 +v 0.227051 0.844238 0.249512 +v 0.419922 0.876465 0.065918 +v 0.226562 0.937500 -0.081055 +v -0.226562 0.937500 -0.081055 +v -0.419922 0.876465 0.065918 +v -0.227051 0.844238 0.249512 +v 0.000000 0.930664 -0.291016 +v 0.419922 0.880859 -0.249023 +v 0.227051 0.844238 -0.455078 +v -0.227051 0.844238 -0.455078 +v -0.419922 0.880859 -0.249023 +v 0.000000 0.710938 -0.660156 +v 0.421387 0.643555 -0.559082 +v -0.421387 0.643555 -0.559082 +v 0.646484 0.458008 0.401367 +v 0.754883 0.386230 0.374023 +v 0.691895 0.455078 0.302246 +v -0.691895 0.455078 0.302246 +v -0.754883 0.386230 0.374023 +v -0.646484 0.458008 0.401367 +v 0.629883 0.580078 0.196289 +v 0.757812 0.470215 0.194336 +v 0.713867 0.613770 0.086426 +v -0.713867 0.613770 0.086426 +v -0.757812 0.470215 0.194336 +v -0.629883 0.580078 0.196289 +v 0.636719 0.729980 -0.041992 +v 0.782715 0.573730 -0.021484 +v 0.718750 0.667969 -0.156250 +v -0.718750 0.667969 -0.156250 +v -0.782715 0.573730 -0.021484 +v -0.636719 0.729980 -0.041992 +v 0.636719 0.720703 -0.298340 +v 0.777344 0.560059 -0.258789 +v 0.715820 0.579590 -0.385254 +v -0.715820 0.579590 -0.385254 +v -0.777344 0.560059 -0.258789 +v -0.636719 0.720703 -0.298340 +v 0.768555 0.423828 -0.383301 +v 0.681641 0.299805 -0.495117 +v 0.626953 0.509766 -0.504395 +v -0.626953 0.509766 -0.504395 +v -0.681641 0.299805 -0.495117 +v -0.768555 0.423828 -0.383301 +v 0.523926 0.388672 -0.610840 +v 0.545898 0.732910 -0.407715 +v -0.545898 0.732910 -0.407715 +v -0.523926 0.388672 -0.610840 +v 0.546875 0.823730 -0.133301 +v -0.546875 0.823730 -0.133301 +v 0.546875 0.749023 0.136230 +v -0.546875 0.749023 0.136230 +v 0.422363 0.679688 0.323730 +v 0.551270 0.526367 0.350098 +v -0.551270 0.526367 0.350098 +v -0.422363 0.679688 0.323730 +v 0.443359 0.525391 0.491211 +v -0.443359 0.525391 0.491211 +v 0.000000 0.722656 0.405273 +v 0.238281 0.583008 0.480469 +v -0.238281 0.583008 0.480469 +v 0.284668 0.533691 0.574707 +v -0.284668 0.533691 0.574707 +v 0.102376 0.509440 0.578613 +v -0.102376 0.509440 0.578613 +v 0.000000 0.483724 0.589844 +v 0.793457 0.331055 0.203613 +v -0.793457 0.331055 0.203613 +v 0.828125 0.265625 0.031738 +v 0.820801 0.430176 0.033691 +v -0.820801 0.430176 0.033691 +v -0.828125 0.265625 0.031738 +v 0.832031 0.347656 -0.119629 +v 0.808105 0.459961 -0.165039 +v -0.808105 0.459961 -0.165039 +v -0.832031 0.347656 -0.119629 +v 0.806641 0.344238 -0.308594 +v -0.806641 0.344238 -0.308594 +v 0.307943 -0.277832 0.129720 +v 0.362793 -0.233398 -0.227051 +v 0.428223 -0.192383 -0.035645 +v -0.428223 -0.192383 -0.035645 +v -0.362793 -0.233398 -0.227051 +v -0.307943 -0.277832 0.129720 +v 0.640625 -0.088867 -0.054199 +v 0.556641 -0.107910 0.113770 +v 0.525391 -0.132812 -0.187988 +v -0.525391 -0.132812 -0.187988 +v -0.556641 -0.107910 0.113770 +v -0.640625 -0.088867 -0.054199 +v 0.426758 -0.134277 0.317871 +v -0.426758 -0.134277 0.317871 +v 0.312663 -0.169434 0.448893 +v 0.305501 -0.231934 0.301107 +v -0.305501 -0.231934 0.301107 +v -0.312663 -0.169434 0.448893 +v 0.702148 0.134766 -0.440430 +v 0.572754 0.022949 -0.453613 +v 0.551270 0.178711 -0.564453 +v -0.551270 0.178711 -0.564453 +v -0.572754 0.022949 -0.453613 +v -0.702148 0.134766 -0.440430 +v 0.420736 0.066406 -0.604818 +v -0.420736 0.066406 -0.604818 +v 0.617676 -0.077148 -0.298340 +v 0.459961 -0.101562 -0.371582 +v -0.459961 -0.101562 -0.371582 +v -0.617676 -0.077148 -0.298340 +v 0.401204 -0.076660 -0.514974 +v -0.401204 -0.076660 -0.514974 +v 1.029297 0.440918 -0.304688 +v 0.956543 0.430664 -0.291016 +v 0.911133 0.381348 -0.233398 +v 0.969238 0.385742 -0.265137 +v -0.969238 0.385742 -0.265137 +v -0.911133 0.381348 -0.233398 +v -0.956543 0.430664 -0.291016 +v -1.029297 0.440918 -0.304688 +v 1.126465 0.479004 -0.382324 +v 1.104492 0.424805 -0.350586 +v 1.199219 0.448242 -0.394043 +v -1.199219 0.448242 -0.394043 +v -1.104492 0.424805 -0.350586 +v -1.126465 0.479004 -0.382324 +v 1.286621 0.403809 -0.431641 +v 1.231934 0.362305 -0.406738 +v 1.288574 0.295898 -0.413574 +v -1.288574 0.295898 -0.413574 +v -1.231934 0.362305 -0.406738 +v -1.286621 0.403809 -0.431641 +v 1.309570 0.185547 -0.434570 +v 1.244629 0.182617 -0.413574 +v 1.227539 0.079102 -0.404785 +v -1.227539 0.079102 -0.404785 +v -1.244629 0.182617 -0.413574 +v -1.309570 0.185547 -0.434570 +v 1.157227 -0.017090 -0.392578 +v 1.125000 0.017578 -0.364746 +v 1.032227 -0.057617 -0.305664 +v -1.032227 -0.057617 -0.305664 +v -1.125000 0.017578 -0.364746 +v -1.157227 -0.017090 -0.392578 +v 0.910156 -0.110840 -0.248535 +v 0.930664 -0.057617 -0.228516 +v 0.812012 -0.097168 -0.157227 +v -0.812012 -0.097168 -0.157227 +v -0.930664 -0.057617 -0.228516 +v -0.910156 -0.110840 -0.248535 +v 1.033203 -0.009766 -0.326660 +v 0.957520 -0.016602 -0.287109 +v 0.866699 -0.040039 -0.198730 +v -0.866699 -0.040039 -0.198730 +v -0.957520 -0.016602 -0.287109 +v -1.033203 -0.009766 -0.326660 +v 1.185059 0.095703 -0.414551 +v 1.116211 0.042969 -0.405762 +v -1.116211 0.042969 -0.405762 +v -1.185059 0.095703 -0.414551 +v 1.234863 0.262695 -0.424316 +v 1.217285 0.172363 -0.445801 +v -1.217285 0.172363 -0.445801 +v -1.234863 0.262695 -0.424316 +v 1.168457 0.379883 -0.404297 +v 1.208496 0.310547 -0.441895 +v -1.208496 0.310547 -0.441895 +v -1.168457 0.379883 -0.404297 +v 1.028809 0.375488 -0.326660 +v 1.100098 0.358887 -0.397461 +v -1.100098 0.358887 -0.397461 +v -1.028809 0.375488 -0.326660 +v 0.936035 0.329590 -0.260742 +v 0.983887 0.330078 -0.322266 +v -0.983887 0.330078 -0.322266 +v -0.936035 0.329590 -0.260742 +v 0.736816 0.007812 -0.020508 +v 0.683594 -0.071777 -0.142090 +v 0.715007 -0.016764 -0.117350 +v -0.715007 -0.016764 -0.117350 +v -0.683594 -0.071777 -0.142090 +v -0.736816 0.007812 -0.020508 +v 0.698730 -0.113770 -0.174805 +v 0.771484 -0.054199 -0.162598 +v -0.771484 -0.054199 -0.162598 +v -0.698730 -0.113770 -0.174805 +v 0.788574 0.146973 -0.061035 +v -0.788574 0.146973 -0.061035 +v 0.854004 0.356445 -0.242188 +v 0.840820 0.312012 -0.199707 +v 0.883789 0.323242 -0.223145 +v -0.883789 0.323242 -0.223145 +v -0.840820 0.312012 -0.199707 +v -0.854004 0.356445 -0.242188 +v 0.838379 -0.022461 -0.237305 +v 0.778809 -0.017090 -0.217285 +v -0.778809 -0.017090 -0.217285 +v -0.838379 -0.022461 -0.237305 +v 0.814941 0.000977 -0.267578 +v 0.780273 0.029297 -0.234863 +v 0.733073 0.006185 -0.182292 +v -0.733073 0.006185 -0.182292 +v -0.780273 0.029297 -0.234863 +v -0.814941 0.000977 -0.267578 +v 0.789062 0.081543 -0.273926 +v 0.759766 0.079590 -0.237305 +v 0.821289 0.052246 -0.273926 +v -0.821289 0.052246 -0.273926 +v -0.759766 0.079590 -0.237305 +v -0.789062 0.081543 -0.273926 +v 0.792969 0.131348 -0.270020 +v 0.812988 0.182129 -0.240234 +v 0.767090 0.127441 -0.190918 +v -0.767090 0.127441 -0.190918 +v -0.812988 0.182129 -0.240234 +v -0.792969 0.131348 -0.270020 +v 0.869141 0.264160 -0.240723 +v 0.828125 0.250977 -0.207520 +v 0.858398 0.211426 -0.268555 +v -0.858398 0.211426 -0.268555 +v -0.828125 0.250977 -0.207520 +v -0.869141 0.264160 -0.240723 +v 0.914062 0.278320 -0.276367 +v -0.914062 0.278320 -0.276367 +v 0.815430 0.237305 -0.138672 +v -0.815430 0.237305 -0.138672 +v 0.735514 0.046224 -0.132487 +v -0.735514 0.046224 -0.132487 +v 0.952148 0.294434 -0.322266 +v 0.891602 0.237305 -0.296387 +v 0.929688 0.255859 -0.329102 +v -0.929688 0.255859 -0.329102 +v -0.891602 0.237305 -0.296387 +v -0.952148 0.294434 -0.322266 +v 0.836426 0.170410 -0.296387 +v 0.874023 0.195801 -0.316406 +v -0.874023 0.195801 -0.316406 +v -0.836426 0.170410 -0.296387 +v 0.779297 0.102051 -0.296875 +v 0.810547 0.127930 -0.314941 +v -0.810547 0.127930 -0.314941 +v -0.779297 0.102051 -0.296875 +v 0.819336 0.075195 -0.296875 +v 0.804688 0.093262 -0.314941 +v -0.804688 0.093262 -0.314941 +v -0.819336 0.075195 -0.296875 +v 0.840332 0.020020 -0.296875 +v 0.848145 0.052246 -0.315918 +v -0.848145 0.052246 -0.315918 +v -0.840332 0.020020 -0.296875 +v 0.825684 -0.012207 -0.289551 +v 0.841309 0.002930 -0.312012 +v -0.841309 0.002930 -0.312012 +v -0.825684 -0.012207 -0.289551 +v 0.894043 -0.016602 -0.265137 +v 0.853516 -0.009277 -0.291016 +v -0.853516 -0.009277 -0.291016 +v -0.894043 -0.016602 -0.265137 +v 1.039551 0.333008 -0.387207 +v 1.001465 0.303711 -0.372559 +v -1.001465 0.303711 -0.372559 +v -1.039551 0.333008 -0.387207 +v 1.169434 0.336426 -0.452637 +v 1.109049 0.332682 -0.437988 +v -1.109049 0.332682 -0.437988 +v -1.169434 0.336426 -0.452637 +v 1.231934 0.239746 -0.467285 +v 1.204590 0.288086 -0.470215 +v -1.204590 0.288086 -0.470215 +v -1.231934 0.239746 -0.467285 +v 1.185547 0.098145 -0.456543 +v 1.212402 0.169434 -0.470215 +v -1.212402 0.169434 -0.470215 +v -1.185547 0.098145 -0.456543 +v 1.042480 0.008789 -0.383789 +v 1.114258 0.057617 -0.437500 +v -1.114258 0.057617 -0.437500 +v -1.042480 0.008789 -0.383789 +v 0.964844 0.004395 -0.337891 +v -0.964844 0.004395 -0.337891 +v 0.856934 0.091797 -0.324219 +v 0.884277 0.039062 -0.323242 +v 0.913086 0.088867 -0.333984 +v -0.913086 0.088867 -0.333984 +v -0.884277 0.039062 -0.323242 +v -0.856934 0.091797 -0.324219 +v 0.923828 0.142578 -0.338867 +v 0.962891 0.086914 -0.349121 +v 0.979004 0.148438 -0.358398 +v -0.979004 0.148438 -0.358398 +v -0.962891 0.086914 -0.349121 +v -0.923828 0.142578 -0.338867 +v 0.984863 0.204590 -0.360840 +v 1.035156 0.147949 -0.383301 +v 1.036133 0.207031 -0.377930 +v -1.036133 0.207031 -0.377930 +v -1.035156 0.147949 -0.383301 +v -0.984863 0.204590 -0.360840 +v 1.047852 0.253906 -0.382812 +v 1.097168 0.201660 -0.398926 +v 1.105469 0.244629 -0.401367 +v -1.105469 0.244629 -0.401367 +v -1.097168 0.201660 -0.398926 +v -1.047852 0.253906 -0.382812 +v 1.063151 0.299479 -0.403809 +v 0.986816 0.259277 -0.361816 +v -0.986816 0.259277 -0.361816 +v -1.063151 0.299479 -0.403809 +v 0.925781 0.202637 -0.337402 +v -0.925781 0.202637 -0.337402 +v 0.865723 0.141602 -0.325195 +v -0.865723 0.141602 -0.325195 +v 0.914551 0.025391 -0.314941 +v -0.914551 0.025391 -0.314941 +v 1.022949 0.066895 -0.387695 +v -1.022949 0.066895 -0.387695 +v 1.125488 0.138672 -0.429688 +v -1.125488 0.138672 -0.429688 +v 1.171387 0.225586 -0.439941 +v -1.171387 0.225586 -0.439941 +v 1.134440 0.299967 -0.436035 +v -1.134440 0.299967 -0.436035 +v 1.039062 -0.080078 -0.395996 +v 0.792969 -0.119629 -0.258301 +v 0.916504 -0.042969 -0.390137 +v -0.916504 -0.042969 -0.390137 +v -0.792969 -0.119629 -0.258301 +v -1.039062 -0.080078 -0.395996 +v 1.272461 0.067871 -0.469238 +v 1.168945 0.041992 -0.495605 +v -1.168945 0.041992 -0.495605 +v -1.272461 0.067871 -0.469238 +v 1.336914 0.299316 -0.466309 +v 1.329427 0.201660 -0.506999 +v -1.329427 0.201660 -0.506999 +v -1.336914 0.299316 -0.466309 +v 1.229492 0.461914 -0.470703 +v 1.306966 0.359375 -0.511393 +v -1.306966 0.359375 -0.511393 +v -1.229492 0.461914 -0.470703 +v 1.032227 0.453125 -0.397949 +v 1.140625 0.399414 -0.496582 +v -1.140625 0.399414 -0.496582 +v -1.032227 0.453125 -0.397949 +v 0.883789 0.390137 -0.321289 +v 0.939941 0.349609 -0.410645 +v -0.939941 0.349609 -0.410645 +v -0.883789 0.390137 -0.321289 +v 1.036621 0.180664 -0.478027 +v 0.835449 0.134766 -0.381836 +v -0.835449 0.134766 -0.381836 +v -1.036621 0.180664 -0.478027 +v 1.257161 0.253906 -0.529460 +v -1.257161 0.253906 -0.529460 +v 0.808594 0.280762 -0.382324 +v -0.808594 0.280762 -0.382324 +v 0.723633 -0.025879 -0.353516 +v -0.723633 -0.025879 -0.353516 +v 0.492188 0.185547 0.720703 +v -0.492188 0.185547 0.720703 +v 0.558594 0.158203 0.625000 +v -0.558594 0.158203 0.625000 +v 0.437500 0.039062 0.650391 +v -0.437500 0.039062 0.650391 +v 0.410156 0.105469 0.738281 +v -0.410156 0.105469 0.738281 +v 0.294922 0.105469 0.759766 +v -0.294922 0.105469 0.759766 +v 0.265625 0.039062 0.681641 +v -0.265625 0.039062 0.681641 +v 0.144531 0.158203 0.697266 +v -0.144531 0.158203 0.697266 +v 0.214844 0.185547 0.769531 +v -0.214844 0.185547 0.769531 +v 0.214844 0.300781 0.769531 +v -0.214844 0.300781 0.769531 +v 0.144531 0.328125 0.697266 +v -0.144531 0.328125 0.697266 +v 0.265625 0.449219 0.681641 +v -0.265625 0.449219 0.681641 +v 0.294922 0.382812 0.759766 +v -0.294922 0.382812 0.759766 +v 0.410156 0.382812 0.738281 +v -0.410156 0.382812 0.738281 +v 0.437500 0.449219 0.650391 +v -0.437500 0.449219 0.650391 +v 0.558594 0.328125 0.625000 +v -0.558594 0.328125 0.625000 +v 0.492188 0.300781 0.720703 +v -0.492188 0.300781 0.720703 +v 0.457031 0.287109 0.769531 +v -0.457031 0.287109 0.769531 +v 0.396484 0.349609 0.783203 +v -0.396484 0.349609 0.783203 +v 0.310547 0.349609 0.800781 +v -0.310547 0.349609 0.800781 +v 0.251953 0.287109 0.808594 +v -0.251953 0.287109 0.808594 +v 0.251953 0.201172 0.808594 +v -0.251953 0.201172 0.808594 +v 0.310547 0.142578 0.800781 +v -0.310547 0.142578 0.800781 +v 0.396484 0.142578 0.783203 +v -0.396484 0.142578 0.783203 +v 0.457031 0.201172 0.769531 +v -0.457031 0.201172 0.769531 +v 0.424479 0.213542 0.794271 +v -0.424479 0.213542 0.794271 +v 0.382812 0.171875 0.804688 +v -0.382812 0.171875 0.804688 +v 0.322917 0.171875 0.817708 +v -0.322917 0.171875 0.817708 +v 0.281250 0.213542 0.822917 +v -0.281250 0.213542 0.822917 +v 0.281250 0.273438 0.822917 +v -0.281250 0.273438 0.822917 +v 0.322917 0.317708 0.817708 +v -0.322917 0.317708 0.817708 +v 0.382812 0.317708 0.804688 +v -0.382812 0.317708 0.804688 +v 0.424479 0.273438 0.794271 +v -0.424479 0.273438 0.794271 +v 0.085938 -0.957031 0.601562 +v -0.085938 -0.957031 0.601562 +v 0.226562 -0.939453 0.585938 +v -0.226562 -0.939453 0.585938 +v 0.298828 -0.892578 0.587891 +v -0.298828 -0.892578 0.587891 +v 0.308594 -0.777344 0.613281 +v -0.308594 -0.777344 0.613281 +v 0.281250 -0.570312 0.634766 +v -0.281250 -0.570312 0.634766 +v 0.291016 -0.119141 0.644531 +v -0.291016 -0.119141 0.644531 +v 0.521484 -0.042969 0.591797 +v -0.521484 -0.042969 0.591797 +v 0.701172 0.091797 0.552734 +v -0.701172 0.091797 0.552734 +v 0.789062 0.289062 0.574219 +v -0.789062 0.289062 0.574219 +v 0.750000 0.425781 0.650391 +v -0.750000 0.425781 0.650391 +v 0.582031 0.511719 0.708984 +v -0.582031 0.511719 0.708984 +v 0.390625 0.636719 0.763672 +v -0.390625 0.636719 0.763672 +v 0.248047 0.683594 0.794922 +v -0.248047 0.683594 0.794922 +v 0.130859 0.564453 0.800781 +v -0.130859 0.564453 0.800781 +v 0.041016 0.425781 0.789062 +v -0.041016 0.425781 0.789062 +v 0.179688 0.482422 0.806641 +v -0.179688 0.482422 0.806641 +v 0.273438 0.550781 0.796875 +v -0.273438 0.550781 0.796875 +v 0.376953 0.525391 0.773438 +v -0.376953 0.525391 0.773438 +v 0.539062 0.443359 0.726562 +v -0.539062 0.443359 0.726562 +v 0.667969 0.365234 0.673828 +v -0.667969 0.365234 0.673828 +v 0.683594 0.265625 0.638672 +v -0.683594 0.265625 0.638672 +v 0.615234 0.126953 0.636719 +v -0.615234 0.126953 0.636719 +v 0.470703 0.021484 0.667969 +v -0.470703 0.021484 0.667969 +v 0.275391 -0.009766 0.732422 +v -0.275391 -0.009766 0.732422 +v 0.123047 0.044922 0.757812 +v -0.123047 0.044922 0.757812 +v 0.097656 0.375000 0.800781 +v -0.097656 0.375000 0.800781 +v 0.064453 0.269531 0.777344 +v -0.064453 0.269531 0.777344 +v 0.074219 0.152344 0.750000 +v -0.074219 0.152344 0.750000 +v 0.056641 -0.912109 0.664062 +v -0.056641 -0.912109 0.664062 +v 0.144531 -0.890625 0.667969 +v -0.144531 -0.890625 0.667969 +v 0.181641 -0.822266 0.685547 +v -0.181641 -0.822266 0.685547 +v 0.164062 -0.570312 0.720703 +v -0.164062 -0.570312 0.720703 +v 0.185547 -0.732422 0.705078 +v -0.185547 -0.732422 0.705078 +v 0.041016 -0.376953 0.746094 +v -0.041016 -0.376953 0.746094 +v 0.048828 -0.564453 0.742188 +v -0.048828 -0.564453 0.742188 +v 0.056641 -0.712891 0.734375 +v -0.056641 -0.712891 0.734375 +v 0.109375 -0.253906 0.767578 +v -0.109375 -0.253906 0.767578 +v 0.117188 -0.183594 0.767578 +v -0.117188 -0.183594 0.767578 +v 0.062500 -0.136719 0.761719 +v -0.062500 -0.136719 0.761719 +v 0.009766 -0.162109 0.767578 +v -0.009766 -0.162109 0.767578 +v 0.044922 -0.302734 0.761719 +v -0.044922 -0.302734 0.761719 +v 0.042969 -0.283203 0.792969 +v -0.042969 -0.283203 0.792969 +v 0.021484 -0.166016 0.804688 +v -0.021484 -0.166016 0.804688 +v 0.072266 -0.140625 0.796875 +v -0.072266 -0.140625 0.796875 +v 0.111328 -0.185547 0.804688 +v -0.111328 -0.185547 0.804688 +v 0.103516 -0.244141 0.802734 +v -0.103516 -0.244141 0.802734 +v 0.062500 -0.183594 0.820312 +v -0.062500 -0.183594 0.820312 +v 0.046875 -0.242188 0.816406 +v -0.046875 -0.242188 0.816406 +v 0.056641 -0.085938 0.755859 +v -0.056641 -0.085938 0.755859 +v 0.128906 -0.179688 0.753906 +v -0.128906 -0.179688 0.753906 +v 0.138672 -0.267578 0.728516 +v -0.138672 -0.267578 0.728516 +v 0.138672 -0.373047 0.728516 +v -0.138672 -0.373047 0.728516 +v 0.240234 -0.376953 0.636719 +v -0.240234 -0.376953 0.636719 +v 0.208984 -0.279297 0.632812 +v -0.208984 -0.279297 0.632812 +v 0.181641 -0.195312 0.660156 +v -0.181641 -0.195312 0.660156 +v 0.050781 -0.750000 0.728516 +v -0.050781 -0.750000 0.728516 +v 0.103516 -0.779297 0.720703 +v -0.103516 -0.779297 0.720703 +v 0.080078 -0.851562 0.701172 +v -0.080078 -0.851562 0.701172 +v 0.027344 -0.878906 0.689453 +v -0.027344 -0.878906 0.689453 +v 0.023438 -0.863281 0.660156 +v -0.023438 -0.863281 0.660156 +v 0.070312 -0.837891 0.667969 +v -0.070312 -0.837891 0.667969 +v 0.093750 -0.781250 0.685547 +v -0.093750 -0.781250 0.685547 +v 0.046875 -0.761719 0.691406 +v -0.046875 -0.761719 0.691406 +v 0.035156 -0.810547 0.646484 +v -0.035156 -0.810547 0.646484 +v 0.078125 -0.804688 0.645833 +v -0.078125 -0.804688 0.645833 +v 0.164062 0.181641 0.765625 +v -0.164062 0.181641 0.765625 +v 0.152344 0.257812 0.771484 +v -0.152344 0.257812 0.771484 +v 0.169922 0.347656 0.775391 +v -0.169922 0.347656 0.775391 +v 0.195312 0.125000 0.761719 +v -0.195312 0.125000 0.761719 +v 0.294922 0.070312 0.742188 +v -0.294922 0.070312 0.742188 +v 0.429688 0.060547 0.708984 +v -0.429688 0.060547 0.708984 +v 0.542969 0.136719 0.679688 +v -0.542969 0.136719 0.679688 +v 0.607422 0.242188 0.666016 +v -0.607422 0.242188 0.666016 +v 0.597656 0.328125 0.673828 +v -0.597656 0.328125 0.673828 +v 0.503906 0.390625 0.712891 +v -0.503906 0.390625 0.712891 +v 0.378906 0.435547 0.748047 +v -0.378906 0.435547 0.748047 +v 0.296875 0.449219 0.757812 +v -0.296875 0.449219 0.757812 +v 0.224609 0.419922 0.771484 +v -0.224609 0.419922 0.771484 +v 0.250000 0.388672 0.769531 +v -0.250000 0.388672 0.769531 +v 0.306641 0.414062 0.761719 +v -0.306641 0.414062 0.761719 +v 0.376953 0.406250 0.757812 +v -0.376953 0.406250 0.757812 +v 0.482422 0.369141 0.724609 +v -0.482422 0.369141 0.724609 +v 0.558594 0.314453 0.683594 +v -0.558594 0.314453 0.683594 +v 0.566406 0.244141 0.677734 +v -0.566406 0.244141 0.677734 +v 0.515625 0.156250 0.693359 +v -0.515625 0.156250 0.693359 +v 0.421875 0.091797 0.722656 +v -0.421875 0.091797 0.722656 +v 0.304688 0.095703 0.751953 +v -0.304688 0.095703 0.751953 +v 0.214844 0.140625 0.765625 +v -0.214844 0.140625 0.765625 +v 0.205078 0.332031 0.769531 +v -0.205078 0.332031 0.769531 +v 0.185547 0.259766 0.767578 +v -0.185547 0.259766 0.767578 +v 0.189453 0.193359 0.763672 +v -0.189453 0.193359 0.763672 +v 0.042969 0.447266 0.675781 +v -0.042969 0.447266 0.675781 +v 0.130859 0.583984 0.683594 +v -0.130859 0.583984 0.683594 +v 0.251953 0.707031 0.675781 +v -0.251953 0.707031 0.675781 +v 0.408203 0.650391 0.642578 +v -0.408203 0.650391 0.642578 +v 0.591797 0.523438 0.589844 +v -0.591797 0.523438 0.589844 +v 0.761719 0.443359 0.542969 +v -0.761719 0.443359 0.542969 +v 0.814453 0.287109 0.468750 +v -0.814453 0.287109 0.468750 +v 0.708984 0.068359 0.443359 +v -0.708984 0.068359 0.443359 +v 0.527344 -0.068359 0.488281 +v -0.527344 -0.068359 0.488281 +v 0.076172 -0.501953 0.304688 +v -0.076172 -0.501953 0.304688 +v 0.066406 -0.667969 0.347656 +v -0.066406 -0.667969 0.347656 +v 0.076172 -0.871094 0.402344 +v -0.076172 -0.871094 0.402344 +v 0.085938 -0.968750 0.507812 +v -0.085938 -0.968750 0.507812 +v 0.250000 -0.943359 0.478516 +v -0.250000 -0.943359 0.478516 +v 0.328125 -0.865234 0.458984 +v -0.328125 -0.865234 0.458984 +v 0.314453 -0.699219 0.468750 +v -0.314453 -0.699219 0.468750 +v 0.201172 -0.626953 0.375000 +v -0.201172 -0.626953 0.375000 +v 0.230469 -0.832031 0.396484 +v -0.230469 -0.832031 0.396484 +v 0.197266 -0.451172 0.353516 +v -0.197266 -0.451172 0.353516 +v 0.287109 -0.496094 0.484375 +v -0.287109 -0.496094 0.484375 +v 0.230469 -0.267578 0.501953 +v -0.230469 -0.267578 0.501953 +v 0.255859 -0.345703 0.490234 +v -0.255859 -0.345703 0.490234 +v 0.212891 -0.208984 0.521484 +v -0.212891 -0.208984 0.521484 +v 0.320312 -0.148438 0.515625 +v -0.320312 -0.148438 0.515625 +v 0.169922 -0.054688 -0.675781 +v -0.169922 -0.054688 -0.675781 +v 0.160156 -0.259766 -0.457031 +v -0.160156 -0.259766 -0.457031 +v 0.126953 -0.386719 -0.066406 +v -0.126953 -0.386719 -0.066406 +v 0.097656 -0.437500 0.222656 +v -0.097656 -0.437500 0.222656 +v 0.210938 -0.359375 0.314453 +v -0.210938 -0.359375 0.314453 +v 0.740234 0.087891 0.228516 +v -0.740234 0.087891 0.228516 +v 0.199219 0.281250 -0.761719 +v -0.199219 0.281250 -0.761719 +v 0.226562 0.916016 0.093750 +v -0.226562 0.916016 0.093750 +v 0.226562 0.919922 -0.269531 +v -0.226562 0.919922 -0.269531 +v 0.228516 0.691406 -0.621094 +v -0.228516 0.691406 -0.621094 +v 0.708984 0.429688 0.392578 +v -0.708984 0.429688 0.392578 +v 0.699219 0.531250 0.199219 +v -0.699219 0.531250 0.199219 +v 0.718750 0.658203 -0.033203 +v -0.718750 0.658203 -0.033203 +v 0.718750 0.646484 -0.279297 +v -0.718750 0.646484 -0.279297 +v 0.707031 0.453125 -0.457031 +v -0.707031 0.453125 -0.457031 +v 0.542969 0.578125 -0.529297 +v -0.542969 0.578125 -0.529297 +v 0.546875 0.806641 -0.273438 +v -0.546875 0.806641 -0.273438 +v 0.546875 0.808594 0.005859 +v -0.546875 0.808594 0.005859 +v 0.546875 0.632812 0.250000 +v -0.546875 0.632812 0.250000 +v 0.564453 0.496094 0.439453 +v -0.564453 0.496094 0.439453 +v 0.228516 0.710938 0.380859 +v -0.228516 0.710938 0.380859 +v 0.281250 0.591797 0.593750 +v -0.281250 0.591797 0.593750 +v 0.263672 0.527344 0.541016 +v -0.263672 0.527344 0.541016 +v 0.036458 0.479167 0.593750 +v -0.036458 0.479167 0.593750 +v 0.787109 0.302734 0.306641 +v -0.787109 0.302734 0.306641 +v 0.808594 0.380859 0.117188 +v -0.808594 0.380859 0.117188 +v 0.818359 0.457031 -0.060547 +v -0.818359 0.457031 -0.060547 +v 0.796875 0.437500 -0.279297 +v -0.796875 0.437500 -0.279297 +v 0.335938 -0.267578 -0.041016 +v -0.335938 -0.267578 -0.041016 +v 0.541016 -0.134766 -0.039062 +v -0.541016 -0.134766 -0.039062 +v 0.544922 -0.078125 0.275391 +v -0.544922 -0.078125 0.275391 +v 0.318359 -0.193359 0.378906 +v -0.318359 -0.193359 0.378906 +v 0.278646 -0.281250 0.247396 +v -0.278646 -0.281250 0.247396 +v 0.283854 -0.164062 0.479167 +v -0.283854 -0.164062 0.479167 +v 0.628906 0.152344 -0.500000 +v -0.628906 0.152344 -0.500000 +v 0.474609 0.210938 -0.625000 +v -0.474609 0.210938 -0.625000 +v 0.537109 -0.076172 -0.337891 +v -0.537109 -0.076172 -0.337891 +v 0.388672 -0.158203 -0.390625 +v -0.388672 -0.158203 -0.390625 +v 0.388021 -0.023438 -0.583333 +v -0.388021 -0.023438 -0.583333 +v 0.962891 0.414062 -0.263672 +v -0.962891 0.414062 -0.263672 +v 1.115234 0.458984 -0.353516 +v -1.115234 0.458984 -0.353516 +v 1.259766 0.388672 -0.410156 +v -1.259766 0.388672 -0.410156 +v 1.277344 0.185547 -0.416016 +v -1.277344 0.185547 -0.416016 +v 1.140625 -0.001953 -0.367188 +v -1.140625 -0.001953 -0.367188 +v 0.917969 -0.087891 -0.222656 +v -0.917969 -0.087891 -0.222656 +v 0.945312 -0.033203 -0.253906 +v -0.945312 -0.033203 -0.253906 +v 1.117188 0.033203 -0.380859 +v -1.117188 0.033203 -0.380859 +v 1.224609 0.177734 -0.425781 +v -1.224609 0.177734 -0.425781 +v 1.214844 0.333984 -0.419922 +v -1.214844 0.333984 -0.419922 +v 1.099609 0.388672 -0.369141 +v -1.099609 0.388672 -0.369141 +v 0.976562 0.355469 -0.289062 +v -0.976562 0.355469 -0.289062 +v 0.693359 -0.048828 -0.083984 +v -0.693359 -0.048828 -0.083984 +v 0.728516 -0.089844 -0.148438 +v -0.728516 -0.089844 -0.148438 +v 0.792969 0.126953 0.001953 +v -0.792969 0.126953 0.001953 +v 0.869141 0.345703 -0.216797 +v -0.869141 0.345703 -0.216797 +v 0.810547 -0.033203 -0.197266 +v -0.810547 -0.033203 -0.197266 +v 0.773438 0.003906 -0.226562 +v -0.773438 0.003906 -0.226562 +v 0.785156 0.058594 -0.251953 +v -0.785156 0.058594 -0.251953 +v 0.777344 0.126953 -0.236328 +v -0.777344 0.126953 -0.236328 +v 0.841797 0.226562 -0.240234 +v -0.841797 0.226562 -0.240234 +v 0.900391 0.298828 -0.246094 +v -0.900391 0.298828 -0.246094 +v 0.830078 0.285156 -0.167969 +v -0.830078 0.285156 -0.167969 +v 0.775391 0.140625 -0.128906 +v -0.775391 0.140625 -0.128906 +v 0.721354 0.005208 -0.143229 +v -0.721354 0.005208 -0.143229 +v 0.919922 0.267578 -0.304688 +v -0.919922 0.267578 -0.304688 +v 0.865234 0.205078 -0.294922 +v -0.865234 0.205078 -0.294922 +v 0.800781 0.132812 -0.296875 +v -0.800781 0.132812 -0.296875 +v 0.792969 0.087891 -0.296875 +v -0.792969 0.087891 -0.296875 +v 0.835938 0.048828 -0.296875 +v -0.835938 0.048828 -0.296875 +v 0.830078 0.000000 -0.296875 +v -0.830078 0.000000 -0.296875 +v 0.847656 -0.017578 -0.267578 +v -0.847656 -0.017578 -0.267578 +v 0.990234 0.316406 -0.351562 +v -0.990234 0.316406 -0.351562 +v 1.105469 0.343750 -0.423828 +v -1.105469 0.343750 -0.423828 +v 1.212891 0.298828 -0.464844 +v -1.212891 0.298828 -0.464844 +v 1.222656 0.167969 -0.466797 +v -1.222656 0.167969 -0.466797 +v 1.121094 0.044922 -0.429688 +v -1.121094 0.044922 -0.429688 +v 0.962891 -0.009766 -0.316406 +v -0.962891 -0.009766 -0.316406 +v 0.876953 0.066406 -0.326172 +v -0.876953 0.066406 -0.326172 +v 0.947266 0.117188 -0.345703 +v -0.947266 0.117188 -0.345703 +v 1.007812 0.179688 -0.369141 +v -1.007812 0.179688 -0.369141 +v 1.066406 0.226562 -0.384766 +v -1.066406 0.226562 -0.384766 +v 1.023438 0.281250 -0.380859 +v -1.023438 0.281250 -0.380859 +v 0.955078 0.232422 -0.347656 +v -0.955078 0.232422 -0.347656 +v 0.896484 0.171875 -0.330078 +v -0.896484 0.171875 -0.330078 +v 0.832031 0.113281 -0.322266 +v -0.832031 0.113281 -0.322266 +v 0.871094 0.011719 -0.310547 +v -0.871094 0.011719 -0.310547 +v 0.966797 0.042969 -0.347656 +v -0.966797 0.042969 -0.347656 +v 1.078125 0.099609 -0.414062 +v -1.078125 0.099609 -0.414062 +v 1.158203 0.181641 -0.437500 +v -1.158203 0.181641 -0.437500 +v 1.160156 0.267578 -0.439453 +v -1.160156 0.267578 -0.439453 +v 1.104167 0.315104 -0.429688 +v -1.104167 0.315104 -0.429688 +v 0.910156 -0.113281 -0.318359 +v -0.910156 -0.113281 -0.318359 +v 1.167969 -0.019531 -0.445312 +v -1.167969 -0.019531 -0.445312 +v 1.328125 0.181641 -0.470703 +v -1.328125 0.181641 -0.470703 +v 1.300781 0.398438 -0.472656 +v -1.300781 0.398438 -0.472656 +v 1.132812 0.472656 -0.441406 +v -1.132812 0.472656 -0.441406 +v 0.949219 0.425781 -0.353516 +v -0.949219 0.425781 -0.353516 +v 0.927734 0.152344 -0.421875 +v -0.927734 0.152344 -0.421875 +v 1.156250 0.218750 -0.513672 +v -1.156250 0.218750 -0.513672 +v 1.309896 0.273438 -0.526042 +v -1.309896 0.273438 -0.526042 +v 0.835938 0.345703 -0.314453 +v -0.835938 0.345703 -0.314453 +v 0.765625 0.128906 -0.394531 +v -0.765625 0.128906 -0.394531 +v 0.699219 -0.099609 -0.261719 +v -0.699219 -0.099609 -0.261719 +vt 0.891692 0.588839 +vt 0.880961 0.586564 +vt 0.881557 0.574808 +vt 0.896488 0.577834 +vt 0.870121 0.588631 +vt 0.866440 0.577724 +vt 0.862025 0.562834 +vt 0.882667 0.558933 +vt 0.903005 0.563061 +vt 0.858288 0.847917 +vt 0.863360 0.833238 +vt 0.878333 0.836822 +vt 0.878737 0.852730 +vt 0.867521 0.822505 +vt 0.878258 0.825051 +vt 0.889080 0.823254 +vt 0.893383 0.834461 +vt 0.899238 0.849510 +vt 0.884459 0.541407 +vt 0.910227 0.547014 +vt 0.858169 0.545895 +vt 0.853018 0.521562 +vt 0.886592 0.523054 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.853685 0.864668 +vt 0.879749 0.870319 +vt 0.881065 0.888748 +vt 0.905740 0.865861 +vt 0.914672 0.888748 +vt 0.844401 0.574426 +vt 0.835120 0.560496 +vt 0.832125 0.591507 +vt 0.818536 0.582644 +vt 0.798481 0.569535 +vt 0.825750 0.545548 +vt 0.795104 0.838402 +vt 0.815721 0.826196 +vt 0.831306 0.849059 +vt 0.821281 0.863575 +vt 0.829690 0.817945 +vt 0.841196 0.835554 +vt 0.860653 0.594966 +vt 0.853501 0.586322 +vt 0.854032 0.604170 +vt 0.844549 0.598858 +vt 0.842429 0.811153 +vt 0.850816 0.824074 +vt 0.852138 0.806266 +vt 0.858344 0.815756 +vt 0.851729 0.614846 +vt 0.841395 0.613584 +vt 0.853473 0.625708 +vt 0.843729 0.628701 +vt 0.830502 0.632828 +vt 0.827527 0.611871 +vt 0.829903 0.776592 +vt 0.842933 0.781303 +vt 0.839931 0.796301 +vt 0.826001 0.797397 +vt 0.852535 0.784725 +vt 0.850311 0.795499 +vt 0.811643 0.609776 +vt 0.815003 0.637757 +vt 0.791018 0.645443 +vt 0.794749 0.607489 +vt 0.791018 0.762238 +vt 0.814639 0.770981 +vt 0.810039 0.798785 +vt 0.793061 0.800320 +vt 0.840944 0.651686 +vt 0.829182 0.662454 +vt 0.857367 0.664845 +vt 0.851481 0.679473 +vt 0.842358 0.702491 +vt 0.816688 0.673967 +vt 0.844839 0.707525 +vt 0.852931 0.730925 +vt 0.829899 0.746938 +vt 0.817928 0.734882 +vt 0.858163 0.745800 +vt 0.841172 0.758218 +vt 0.858989 0.635473 +vt 0.851242 0.642408 +vt 0.867665 0.642345 +vt 0.863079 0.652037 +vt 0.863300 0.758849 +vt 0.851048 0.767943 +vt 0.867452 0.768735 +vt 0.858480 0.775215 +vt 0.878887 0.644529 +vt 0.878385 0.654923 +vt 0.890382 0.642464 +vt 0.894097 0.651799 +vt 0.899630 0.664227 +vt 0.878286 0.668708 +vt 0.900356 0.748294 +vt 0.894278 0.760463 +vt 0.878719 0.756645 +vt 0.879233 0.742869 +vt 0.890152 0.769624 +vt 0.878760 0.767051 +vt 0.879203 0.684420 +vt 0.907091 0.678322 +vt 0.918898 0.699697 +vt 0.880628 0.701094 +vt 0.921180 0.713713 +vt 0.908436 0.734543 +vt 0.880846 0.727214 +vt 0.883009 0.710619 +vt 0.917327 0.652351 +vt 0.929888 0.662207 +vt 0.929409 0.635102 +vt 0.945192 0.639156 +vt 0.968392 0.645333 +vt 0.943645 0.672515 +vt 0.968213 0.770220 +vt 0.944761 0.775361 +vt 0.930496 0.751654 +vt 0.944697 0.741966 +vt 0.928814 0.778711 +vt 0.917509 0.760943 +vt 0.899876 0.636590 +vt 0.907155 0.643402 +vt 0.906348 0.627709 +vt 0.916089 0.631003 +vt 0.915325 0.782214 +vt 0.906950 0.769432 +vt 0.905448 0.785074 +vt 0.899376 0.775914 +vt 0.908777 0.616619 +vt 0.919430 0.615878 +vt 0.906995 0.605249 +vt 0.917062 0.600430 +vt 0.930714 0.593624 +vt 0.933908 0.614500 +vt 0.928276 0.820207 +vt 0.914940 0.812801 +vt 0.917991 0.797473 +vt 0.932394 0.799492 +vt 0.905097 0.807540 +vt 0.907382 0.796260 +vt 0.950598 0.612253 +vt 0.946105 0.585451 +vt 0.968392 0.573812 +vt 0.968392 0.609573 +vt 0.965038 0.841671 +vt 0.943289 0.829055 +vt 0.948967 0.802477 +vt 0.966626 0.805946 +vt 0.919717 0.575551 +vt 0.931712 0.562700 +vt 0.944279 0.549179 +vt 0.927900 0.851144 +vt 0.939855 0.865209 +vt 0.916488 0.837774 +vt 0.900835 0.595528 +vt 0.908869 0.587062 +vt 0.906161 0.825792 +vt 0.898511 0.816977 +vt 0.897284 0.599247 +vt 0.889634 0.593581 +vt 0.902360 0.607463 +vt 0.898689 0.609003 +vt 0.894921 0.601583 +vt 0.888110 0.597049 +vt 0.896965 0.803421 +vt 0.900564 0.805122 +vt 0.895129 0.813105 +vt 0.892872 0.810667 +vt 0.887235 0.818426 +vt 0.885867 0.814894 +vt 0.903563 0.616952 +vt 0.901305 0.626065 +vt 0.897259 0.624521 +vt 0.899888 0.617003 +vt 0.896226 0.787855 +vt 0.900336 0.786492 +vt 0.902188 0.795696 +vt 0.898518 0.795483 +vt 0.895995 0.633149 +vt 0.888373 0.637644 +vt 0.886679 0.633759 +vt 0.893156 0.630591 +vt 0.886066 0.778156 +vt 0.887931 0.774350 +vt 0.895346 0.779179 +vt 0.892396 0.781608 +vt 0.879183 0.638993 +vt 0.870175 0.637066 +vt 0.872102 0.632914 +vt 0.879329 0.635048 +vt 0.871465 0.778354 +vt 0.869725 0.774120 +vt 0.878810 0.772595 +vt 0.878780 0.776542 +vt 0.863101 0.631734 +vt 0.858526 0.624180 +vt 0.862476 0.622856 +vt 0.865988 0.629039 +vt 0.861403 0.787974 +vt 0.857515 0.786476 +vt 0.862421 0.779132 +vt 0.865186 0.781954 +vt 0.857013 0.615585 +vt 0.858792 0.606916 +vt 0.862520 0.608863 +vt 0.860718 0.615982 +vt 0.860826 0.801955 +vt 0.857015 0.803735 +vt 0.855623 0.794995 +vt 0.859342 0.794764 +vt 0.864088 0.599137 +vt 0.871771 0.593621 +vt 0.872990 0.597353 +vt 0.866415 0.601876 +vt 0.870775 0.813919 +vt 0.869391 0.817593 +vt 0.861961 0.811741 +vt 0.864406 0.809109 +vt 0.880708 0.591737 +vt 0.880545 0.595056 +vt 0.878235 0.819872 +vt 0.878220 0.816549 +vt 0.879569 0.616335 +vt 0.875381 0.604486 +vt 0.880218 0.601249 +vt 0.884915 0.604234 +vt 0.878169 0.810347 +vt 0.882993 0.807574 +vt 0.873480 0.806899 +vt 0.878190 0.795247 +vt 0.870243 0.606220 +vt 0.868906 0.611783 +vt 0.868423 0.804939 +vt 0.867334 0.799322 +vt 0.868915 0.620475 +vt 0.866315 0.616213 +vt 0.864943 0.794781 +vt 0.867730 0.790638 +vt 0.874939 0.626604 +vt 0.870063 0.625233 +vt 0.869088 0.785936 +vt 0.874020 0.784783 +vt 0.883908 0.627225 +vt 0.879383 0.629428 +vt 0.878585 0.782159 +vt 0.883008 0.784561 +vt 0.890509 0.621523 +vt 0.889008 0.626432 +vt 0.888067 0.785579 +vt 0.889349 0.790550 +vt 0.891514 0.611803 +vt 0.893847 0.616893 +vt 0.892478 0.795324 +vt 0.889922 0.800305 +vt 0.890450 0.605899 +vt 0.888597 0.806156 +vt 0.539314 0.053345 +vt 0.537040 0.057979 +vt 0.528630 0.056463 +vt 0.529796 0.050810 +vt 0.534325 0.061941 +vt 0.527228 0.060718 +vt 0.518927 0.060123 +vt 0.518925 0.055721 +vt 0.518925 0.049546 +vt 0.510632 0.060704 +vt 0.509230 0.056447 +vt 0.503543 0.061915 +vt 0.500834 0.057948 +vt 0.498567 0.053309 +vt 0.508066 0.050791 +vt 0.550838 0.058385 +vt 0.546647 0.061563 +vt 0.542849 0.059576 +vt 0.546114 0.055913 +vt 0.541991 0.065324 +vt 0.539009 0.063244 +vt 0.498862 0.063209 +vt 0.495029 0.059533 +vt 0.495878 0.065284 +vt 0.491230 0.061512 +vt 0.487046 0.058322 +vt 0.491773 0.055863 +vt 0.557459 0.064110 +vt 0.550940 0.068207 +vt 0.549020 0.064249 +vt 0.554132 0.060628 +vt 0.545459 0.073526 +vt 0.543983 0.068878 +vt 0.493881 0.068835 +vt 0.488852 0.064193 +vt 0.492398 0.073483 +vt 0.486924 0.068151 +vt 0.480407 0.064032 +vt 0.483748 0.060557 +vt 0.568627 0.080034 +vt 0.557062 0.083355 +vt 0.553377 0.074012 +vt 0.562286 0.070296 +vt 0.548931 0.087707 +vt 0.546894 0.078888 +vt 0.490953 0.078848 +vt 0.484473 0.073956 +vt 0.488904 0.087676 +vt 0.480762 0.083308 +vt 0.469163 0.079950 +vt 0.475552 0.070210 +vt 0.584301 0.109492 +vt 0.568768 0.114105 +vt 0.562725 0.097931 +vt 0.576499 0.094172 +vt 0.555797 0.119762 +vt 0.552211 0.102723 +vt 0.485603 0.102716 +vt 0.475056 0.097908 +vt 0.482003 0.119791 +vt 0.468969 0.114124 +vt 0.453338 0.109484 +vt 0.461217 0.094114 +vt 0.606157 0.171638 +vt 0.623405 0.186359 +vt 0.606884 0.200763 +vt 0.586464 0.187024 +vt 0.644385 0.202482 +vt 0.632076 0.214445 +vt 0.621002 0.227303 +vt 0.592977 0.218210 +vt 0.558793 0.209623 +vt 0.416962 0.228987 +vt 0.405473 0.216015 +vt 0.430888 0.201769 +vt 0.445231 0.219311 +vt 0.392747 0.203928 +vt 0.413973 0.187311 +vt 0.431395 0.172229 +vt 0.451442 0.187610 +vt 0.479659 0.210128 +vt 0.661887 0.218192 +vt 0.652512 0.228696 +vt 0.678158 0.233870 +vt 0.669687 0.243281 +vt 0.660913 0.251049 +vt 0.643415 0.238482 +vt 0.376630 0.254079 +vt 0.367417 0.246239 +vt 0.384811 0.230909 +vt 0.394310 0.240811 +vt 0.358459 0.236653 +vt 0.375004 0.220227 +vt 0.695442 0.249895 +vt 0.685098 0.257963 +vt 0.708176 0.267594 +vt 0.695713 0.273774 +vt 0.682849 0.278473 +vt 0.674192 0.264305 +vt 0.354754 0.283002 +vt 0.341241 0.278500 +vt 0.351801 0.261791 +vt 0.363279 0.268087 +vt 0.328067 0.272424 +vt 0.340831 0.253653 +vt 0.710799 0.288295 +vt 0.698505 0.291745 +vt 0.707738 0.307724 +vt 0.696383 0.308222 +vt 0.686069 0.307434 +vt 0.686480 0.293780 +vt 0.352515 0.313128 +vt 0.341893 0.314378 +vt 0.339014 0.297300 +vt 0.351555 0.298991 +vt 0.330125 0.314386 +vt 0.326116 0.294166 +vt 0.703422 0.321607 +vt 0.692260 0.319551 +vt 0.695343 0.334923 +vt 0.683891 0.330694 +vt 0.674331 0.325948 +vt 0.682599 0.316647 +vt 0.365353 0.331659 +vt 0.355756 0.336965 +vt 0.346649 0.325920 +vt 0.356469 0.322489 +vt 0.344203 0.341867 +vt 0.335240 0.328591 +vt 0.680993 0.352654 +vt 0.669034 0.346615 +vt 0.663496 0.370552 +vt 0.651914 0.362916 +vt 0.643166 0.354229 +vt 0.659524 0.339869 +vt 0.398430 0.359143 +vt 0.389912 0.368382 +vt 0.371689 0.352552 +vt 0.381103 0.345227 +vt 0.378483 0.376706 +vt 0.359757 0.359299 +vt 0.645975 0.384372 +vt 0.636756 0.375199 +vt 0.629889 0.393629 +vt 0.623653 0.383198 +vt 0.619606 0.371731 +vt 0.630242 0.364845 +vt 0.423128 0.375860 +vt 0.419544 0.387656 +vt 0.405892 0.380159 +vt 0.412042 0.369355 +vt 0.413721 0.398510 +vt 0.396965 0.389904 +vt 0.616695 0.397839 +vt 0.612698 0.386651 +vt 0.601508 0.398118 +vt 0.599483 0.385777 +vt 0.598403 0.373750 +vt 0.610113 0.374904 +vt 0.444643 0.376983 +vt 0.444079 0.389172 +vt 0.430786 0.390645 +vt 0.432874 0.378651 +vt 0.442602 0.401710 +vt 0.427272 0.402137 +vt 0.579440 0.395584 +vt 0.579601 0.380796 +vt 0.556312 0.392010 +vt 0.557829 0.374417 +vt 0.561672 0.359562 +vt 0.581121 0.367656 +vt 0.481024 0.361159 +vt 0.485493 0.375925 +vt 0.463880 0.383280 +vt 0.461797 0.370110 +vt 0.487774 0.393516 +vt 0.464695 0.398151 +vt 0.537944 0.389169 +vt 0.538944 0.369350 +vt 0.521980 0.388104 +vt 0.521543 0.367321 +vt 0.521061 0.342410 +vt 0.543462 0.352409 +vt 0.504220 0.370059 +vt 0.499012 0.353258 +vt 0.506063 0.389860 +vt 0.576492 0.338892 +vt 0.588070 0.344127 +vt 0.584401 0.354960 +vt 0.568874 0.347883 +vt 0.599057 0.346360 +vt 0.598421 0.359397 +vt 0.444019 0.362487 +vt 0.457972 0.357441 +vt 0.442838 0.349341 +vt 0.453843 0.346655 +vt 0.465321 0.340933 +vt 0.473324 0.349694 +vt 0.607932 0.346220 +vt 0.608629 0.359957 +vt 0.616122 0.343912 +vt 0.617334 0.357203 +vt 0.424802 0.361046 +vt 0.433732 0.363472 +vt 0.425468 0.347532 +vt 0.433859 0.349548 +vt 0.635618 0.333132 +vt 0.638389 0.343234 +vt 0.626846 0.351699 +vt 0.625058 0.339638 +vt 0.414922 0.355865 +vt 0.402821 0.347745 +vt 0.405220 0.337354 +vt 0.416228 0.343550 +vt 0.660206 0.314651 +vt 0.666553 0.319974 +vt 0.653188 0.331596 +vt 0.648683 0.324125 +vt 0.387230 0.336504 +vt 0.373083 0.325196 +vt 0.379378 0.319477 +vt 0.391528 0.328696 +vt 0.667992 0.298745 +vt 0.676436 0.303224 +vt 0.673796 0.311559 +vt 0.666139 0.306742 +vt 0.365319 0.316873 +vt 0.362283 0.308393 +vt 0.370802 0.303443 +vt 0.372998 0.311601 +vt 0.662811 0.278039 +vt 0.671750 0.278936 +vt 0.675991 0.291841 +vt 0.667274 0.289008 +vt 0.362322 0.296617 +vt 0.366247 0.283149 +vt 0.375432 0.281942 +vt 0.371202 0.293380 +vt 0.641178 0.255826 +vt 0.650468 0.254124 +vt 0.663002 0.266035 +vt 0.653428 0.266347 +vt 0.374870 0.269594 +vt 0.387430 0.257018 +vt 0.397003 0.258546 +vt 0.384728 0.269661 +vt 0.612614 0.245298 +vt 0.615193 0.237332 +vt 0.634875 0.244188 +vt 0.628116 0.248367 +vt 0.403166 0.246488 +vt 0.423081 0.239096 +vt 0.425893 0.247131 +vt 0.410175 0.250607 +vt 0.575330 0.254115 +vt 0.567220 0.237521 +vt 0.590391 0.234661 +vt 0.593043 0.247945 +vt 0.448181 0.235931 +vt 0.471694 0.238405 +vt 0.463886 0.255283 +vt 0.445806 0.249401 +vt 0.565405 0.261613 +vt 0.552431 0.247258 +vt 0.560180 0.270496 +vt 0.544078 0.261210 +vt 0.519748 0.247463 +vt 0.539890 0.229722 +vt 0.495583 0.261777 +vt 0.486848 0.247926 +vt 0.499170 0.230035 +vt 0.479598 0.271478 +vt 0.474105 0.262644 +vt 0.554142 0.339407 +vt 0.565846 0.330030 +vt 0.543239 0.327870 +vt 0.557974 0.318586 +vt 0.487805 0.340609 +vt 0.498341 0.328625 +vt 0.475717 0.331615 +vt 0.483239 0.319819 +vt 0.539203 0.311610 +vt 0.554719 0.305611 +vt 0.520605 0.315606 +vt 0.520283 0.294503 +vt 0.539155 0.293575 +vt 0.554708 0.292543 +vt 0.501854 0.312181 +vt 0.501351 0.294108 +vt 0.486090 0.306659 +vt 0.485701 0.293519 +vt 0.540216 0.276712 +vt 0.520023 0.274395 +vt 0.556571 0.280822 +vt 0.483500 0.281781 +vt 0.499839 0.277239 +vt 0.526391 0.068708 +vt 0.522781 0.067683 +vt 0.524939 0.064655 +vt 0.530205 0.065733 +vt 0.518928 0.067374 +vt 0.518928 0.064220 +vt 0.512920 0.064645 +vt 0.515077 0.067676 +vt 0.511468 0.068696 +vt 0.507658 0.065715 +vt 0.531713 0.073805 +vt 0.529517 0.070555 +vt 0.533980 0.067239 +vt 0.536458 0.069915 +vt 0.503884 0.067214 +vt 0.508342 0.070538 +vt 0.506144 0.073786 +vt 0.501405 0.069887 +vt 0.531225 0.085306 +vt 0.532534 0.079044 +vt 0.537832 0.074505 +vt 0.538680 0.079646 +vt 0.500025 0.074475 +vt 0.505319 0.079025 +vt 0.506623 0.085290 +vt 0.499172 0.079617 +vt 0.544035 0.123768 +vt 0.542166 0.106319 +vt 0.533926 0.126157 +vt 0.533130 0.108797 +vt 0.532778 0.094453 +vt 0.540687 0.091527 +vt 0.505070 0.094443 +vt 0.504724 0.108798 +vt 0.495672 0.106319 +vt 0.497156 0.091509 +vt 0.503945 0.126173 +vt 0.493809 0.123794 +vt 0.539578 0.083978 +vt 0.532163 0.087925 +vt 0.498269 0.083952 +vt 0.505684 0.087910 +vt 0.538348 0.156626 +vt 0.527985 0.152668 +vt 0.527019 0.141551 +vt 0.535871 0.141734 +vt 0.518978 0.151208 +vt 0.518960 0.140806 +vt 0.518943 0.126975 +vt 0.525912 0.126964 +vt 0.510900 0.141567 +vt 0.511972 0.126972 +vt 0.509972 0.152692 +vt 0.499609 0.156683 +vt 0.502034 0.141769 +vt 0.525644 0.110236 +vt 0.525656 0.096120 +vt 0.518932 0.110696 +vt 0.518927 0.096637 +vt 0.512218 0.110236 +vt 0.512196 0.096115 +vt 0.518926 0.086472 +vt 0.524945 0.086835 +vt 0.525385 0.089371 +vt 0.518925 0.089467 +vt 0.512464 0.089364 +vt 0.512904 0.086828 +vt 0.547150 0.173975 +vt 0.542049 0.175206 +vt 0.539912 0.168679 +vt 0.544567 0.165720 +vt 0.538113 0.176101 +vt 0.536881 0.171060 +vt 0.533511 0.166606 +vt 0.535266 0.163215 +vt 0.504503 0.166651 +vt 0.501153 0.171120 +vt 0.498108 0.168754 +vt 0.502729 0.163266 +vt 0.499949 0.176162 +vt 0.496015 0.175290 +vt 0.490904 0.174097 +vt 0.493427 0.165818 +vt 0.542087 0.193360 +vt 0.539006 0.189238 +vt 0.541963 0.182617 +vt 0.546610 0.183905 +vt 0.536530 0.186910 +vt 0.538179 0.181821 +vt 0.499923 0.181859 +vt 0.496167 0.182681 +vt 0.501611 0.186905 +vt 0.499260 0.189262 +vt 0.496310 0.193451 +vt 0.491548 0.184024 +vt 0.519585 0.200761 +vt 0.525614 0.194544 +vt 0.532532 0.193393 +vt 0.532726 0.200192 +vt 0.527756 0.190822 +vt 0.532619 0.190057 +vt 0.505552 0.189995 +vt 0.505986 0.193367 +vt 0.510391 0.190728 +vt 0.512872 0.194488 +vt 0.506139 0.200234 +vt 0.519186 0.192623 +vt 0.518619 0.190064 +vt 0.521327 0.192154 +vt 0.518797 0.193930 +vt 0.518974 0.187013 +vt 0.523255 0.188764 +vt 0.514776 0.188701 +vt 0.516442 0.192115 +vt 0.527826 0.158992 +vt 0.518991 0.157196 +vt 0.527032 0.162649 +vt 0.519000 0.160800 +vt 0.510157 0.159017 +vt 0.510971 0.162672 +vt 0.526090 0.165766 +vt 0.519009 0.164045 +vt 0.531718 0.169248 +vt 0.529697 0.170661 +vt 0.525478 0.169088 +vt 0.519023 0.167804 +vt 0.508343 0.170695 +vt 0.506311 0.169287 +vt 0.511931 0.165788 +vt 0.512566 0.169108 +vt 0.519086 0.184064 +vt 0.523803 0.185735 +vt 0.519080 0.179599 +vt 0.524925 0.183297 +vt 0.527818 0.185477 +vt 0.528180 0.187827 +vt 0.510239 0.185427 +vt 0.513176 0.183269 +vt 0.514309 0.185681 +vt 0.509857 0.187746 +vt 0.531939 0.187473 +vt 0.530566 0.184922 +vt 0.532840 0.183728 +vt 0.534565 0.185097 +vt 0.505231 0.183720 +vt 0.507488 0.184890 +vt 0.506111 0.187416 +vt 0.503521 0.185086 +vt 0.535546 0.181124 +vt 0.532774 0.180940 +vt 0.532096 0.177133 +vt 0.535348 0.176654 +vt 0.505971 0.177171 +vt 0.505299 0.180956 +vt 0.502535 0.181150 +vt 0.502711 0.176703 +vt 0.534438 0.172786 +vt 0.531173 0.173628 +vt 0.506881 0.173668 +vt 0.503603 0.172837 +vt 0.526699 0.177809 +vt 0.528574 0.181682 +vt 0.509509 0.181678 +vt 0.511405 0.177826 +vt 0.519049 0.172948 +vt 0.525674 0.173357 +vt 0.512407 0.173378 +vt 0.534250 0.213168 +vt 0.519646 0.219043 +vt 0.545871 0.200552 +vt 0.492604 0.200768 +vt 0.504734 0.213297 +vt 0.551833 0.186076 +vt 0.553412 0.172419 +vt 0.563647 0.168321 +vt 0.561716 0.184013 +vt 0.474292 0.168551 +vt 0.484615 0.172594 +vt 0.486345 0.186292 +vt 0.476391 0.184328 +vt 0.551880 0.162260 +vt 0.548945 0.152313 +vt 0.561164 0.147206 +vt 0.563129 0.157240 +vt 0.476663 0.147328 +vt 0.488961 0.152405 +vt 0.486067 0.162392 +vt 0.474729 0.157411 +vt 0.546313 0.139291 +vt 0.558750 0.134651 +vt 0.491557 0.139347 +vt 0.479056 0.134725 +vt 0.590430 0.122775 +vt 0.573592 0.128247 +vt 0.594811 0.133874 +vt 0.577198 0.140149 +vt 0.460500 0.140293 +vt 0.464117 0.128325 +vt 0.442725 0.134028 +vt 0.447147 0.122844 +vt 0.597367 0.142638 +vt 0.579588 0.149602 +vt 0.598809 0.150811 +vt 0.580668 0.159466 +vt 0.457083 0.159742 +vt 0.458117 0.149807 +vt 0.438729 0.151122 +vt 0.440157 0.142869 +vt 0.580343 0.172599 +vt 0.599848 0.160133 +vt 0.457516 0.172972 +vt 0.437728 0.160537 +vt 0.524451 0.085358 +vt 0.528614 0.084539 +vt 0.518925 0.084939 +vt 0.518925 0.083754 +vt 0.523789 0.084048 +vt 0.527444 0.083330 +vt 0.513399 0.085351 +vt 0.514061 0.084042 +vt 0.509234 0.084527 +vt 0.510406 0.083320 +vt 0.530055 0.080412 +vt 0.529424 0.075463 +vt 0.528681 0.080010 +vt 0.528076 0.075978 +vt 0.507797 0.080397 +vt 0.509171 0.079997 +vt 0.508431 0.075448 +vt 0.509779 0.075966 +vt 0.527375 0.072183 +vt 0.524595 0.070217 +vt 0.526202 0.073130 +vt 0.523725 0.071312 +vt 0.510482 0.072171 +vt 0.511655 0.073120 +vt 0.513262 0.070208 +vt 0.514132 0.071305 +vt 0.521773 0.069210 +vt 0.518929 0.068946 +vt 0.521311 0.070372 +vt 0.518929 0.070120 +vt 0.516084 0.069206 +vt 0.516546 0.070368 +vt 0.520792 0.072301 +vt 0.518928 0.072082 +vt 0.522687 0.073045 +vt 0.522119 0.075131 +vt 0.520571 0.074660 +vt 0.518928 0.074477 +vt 0.515737 0.075127 +vt 0.515170 0.073039 +vt 0.517065 0.072298 +vt 0.517285 0.074658 +vt 0.524646 0.074400 +vt 0.526155 0.076440 +vt 0.524746 0.076798 +vt 0.523477 0.075811 +vt 0.513109 0.076790 +vt 0.511700 0.076430 +vt 0.513211 0.074391 +vt 0.514379 0.075804 +vt 0.526702 0.079241 +vt 0.525770 0.081523 +vt 0.524030 0.079411 +vt 0.524751 0.078250 +vt 0.513823 0.079405 +vt 0.512081 0.081515 +vt 0.511151 0.079231 +vt 0.513103 0.078243 +vt 0.522846 0.082010 +vt 0.518925 0.081803 +vt 0.518926 0.079423 +vt 0.521844 0.079585 +vt 0.515005 0.082005 +vt 0.516008 0.079581 +vt 0.518927 0.076953 +vt 0.521004 0.077111 +vt 0.522658 0.077287 +vt 0.516851 0.077109 +vt 0.515197 0.077283 +vt 0.523466 0.077182 +vt 0.514389 0.077176 +vt 0.565241 0.283355 +vt 0.563684 0.292624 +vt 0.568319 0.275320 +vt 0.572243 0.277777 +vt 0.569831 0.285006 +vt 0.569010 0.293225 +vt 0.467623 0.279114 +vt 0.471518 0.276529 +vt 0.474842 0.284556 +vt 0.470260 0.286350 +vt 0.476677 0.293863 +vt 0.471328 0.294625 +vt 0.564222 0.303025 +vt 0.567317 0.313741 +vt 0.570071 0.302291 +vt 0.573142 0.311497 +vt 0.476455 0.304364 +vt 0.470539 0.303808 +vt 0.473683 0.315267 +vt 0.467739 0.313198 +vt 0.573436 0.323961 +vt 0.581581 0.332100 +vt 0.578352 0.320136 +vt 0.585105 0.327137 +vt 0.467866 0.325779 +vt 0.462776 0.322092 +vt 0.459942 0.334276 +vt 0.456204 0.329397 +vt 0.572342 0.268622 +vt 0.580216 0.262425 +vt 0.583200 0.266123 +vt 0.575954 0.271684 +vt 0.456225 0.267598 +vt 0.459147 0.263778 +vt 0.467276 0.269863 +vt 0.463706 0.273050 +vt 0.594847 0.255893 +vt 0.611230 0.251963 +vt 0.610754 0.257158 +vt 0.596216 0.260490 +vt 0.428062 0.259163 +vt 0.427457 0.253882 +vt 0.444168 0.257490 +vt 0.442893 0.262195 +vt 0.624361 0.253572 +vt 0.635866 0.259477 +vt 0.633046 0.263505 +vt 0.622561 0.258500 +vt 0.405517 0.266204 +vt 0.402535 0.262154 +vt 0.414133 0.255836 +vt 0.416083 0.260823 +vt 0.647372 0.268436 +vt 0.656424 0.278659 +vt 0.651897 0.280071 +vt 0.643616 0.271163 +vt 0.386714 0.283696 +vt 0.382022 0.282383 +vt 0.391003 0.271638 +vt 0.394925 0.274331 +vt 0.660566 0.288359 +vt 0.661246 0.297150 +vt 0.656019 0.296899 +vt 0.655512 0.288824 +vt 0.383039 0.301103 +vt 0.377677 0.301548 +vt 0.378081 0.292480 +vt 0.383289 0.292791 +vt 0.659916 0.304646 +vt 0.654935 0.311857 +vt 0.650639 0.310282 +vt 0.654971 0.303771 +vt 0.389015 0.314625 +vt 0.384672 0.316404 +vt 0.379310 0.309202 +vt 0.384353 0.308119 +vt 0.644668 0.319791 +vt 0.632887 0.327126 +vt 0.630529 0.323708 +vt 0.641296 0.317272 +vt 0.410025 0.327565 +vt 0.407758 0.331135 +vt 0.395459 0.324113 +vt 0.398809 0.321411 +vt 0.623366 0.332538 +vt 0.615257 0.336155 +vt 0.614615 0.331821 +vt 0.621931 0.328558 +vt 0.426508 0.335214 +vt 0.426027 0.339635 +vt 0.417654 0.336274 +vt 0.418956 0.332175 +vt 0.607708 0.338104 +vt 0.599835 0.338280 +vt 0.600616 0.333421 +vt 0.607698 0.333496 +vt 0.440754 0.336316 +vt 0.441730 0.341203 +vt 0.433755 0.341324 +vt 0.433586 0.336655 +vt 0.590753 0.336576 +vt 0.592806 0.331433 +vt 0.450844 0.339136 +vt 0.448579 0.334018 +vt 0.594583 0.327825 +vt 0.601265 0.330046 +vt 0.588029 0.323634 +vt 0.590644 0.321516 +vt 0.596222 0.324984 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.453126 0.325966 +vt 0.446650 0.330437 +vt 0.444890 0.327625 +vt 0.439971 0.332925 +vt 0.439372 0.331331 +vt 0.607644 0.330283 +vt 0.614074 0.328799 +vt 0.607567 0.327768 +vt 0.613335 0.327083 +vt 0.433517 0.333397 +vt 0.433497 0.330845 +vt 0.426939 0.332127 +vt 0.427623 0.330358 +vt 0.620908 0.325858 +vt 0.628881 0.321370 +vt 0.620093 0.323798 +vt 0.626851 0.320513 +vt 0.419888 0.329392 +vt 0.420636 0.327267 +vt 0.411613 0.325121 +vt 0.413648 0.324175 +vt 0.638723 0.315246 +vt 0.647218 0.308618 +vt 0.636549 0.313467 +vt 0.646248 0.306421 +vt 0.401361 0.319243 +vt 0.403515 0.317343 +vt 0.392457 0.312790 +vt 0.393381 0.310510 +vt 0.651151 0.302617 +vt 0.652130 0.296452 +vt 0.647895 0.301323 +vt 0.649541 0.296225 +vt 0.388229 0.306793 +vt 0.391522 0.305346 +vt 0.387015 0.300507 +vt 0.389662 0.300183 +vt 0.651762 0.289330 +vt 0.648537 0.281545 +vt 0.648663 0.289856 +vt 0.647785 0.283486 +vt 0.387155 0.293188 +vt 0.390351 0.293627 +vt 0.390206 0.285109 +vt 0.391040 0.287071 +vt 0.640941 0.273393 +vt 0.631234 0.266340 +vt 0.638807 0.275375 +vt 0.629829 0.267263 +vt 0.397726 0.276543 +vt 0.399966 0.278515 +vt 0.407439 0.269058 +vt 0.408893 0.269959 +vt 0.621671 0.261850 +vt 0.610899 0.260715 +vt 0.621235 0.264412 +vt 0.612641 0.261560 +vt 0.417069 0.264222 +vt 0.417574 0.266826 +vt 0.427998 0.262789 +vt 0.426254 0.263693 +vt 0.597565 0.263724 +vt 0.585604 0.268884 +vt 0.598903 0.266275 +vt 0.585166 0.270991 +vt 0.441606 0.265513 +vt 0.440311 0.268138 +vt 0.453864 0.270454 +vt 0.454369 0.272583 +vt 0.578953 0.274202 +vt 0.575703 0.279966 +vt 0.581645 0.276446 +vt 0.578124 0.281900 +vt 0.460743 0.275672 +vt 0.458084 0.278012 +vt 0.464190 0.281418 +vt 0.461798 0.283441 +vt 0.582033 0.317488 +vt 0.577323 0.310016 +vt 0.579548 0.309340 +vt 0.585096 0.315428 +vt 0.461204 0.311233 +vt 0.463474 0.311842 +vt 0.458970 0.319548 +vt 0.455806 0.317576 +vt 0.574627 0.301852 +vt 0.573612 0.293750 +vt 0.577524 0.293776 +vt 0.578536 0.301558 +vt 0.462754 0.295432 +vt 0.466703 0.295291 +vt 0.465932 0.303507 +vt 0.461979 0.303333 +vt 0.573946 0.286469 +vt 0.577824 0.287838 +vt 0.466150 0.287943 +vt 0.462276 0.289437 +vt 0.537814 0.410803 +vt 0.522486 0.410487 +vt 0.556089 0.411900 +vt 0.553209 0.433063 +vt 0.538120 0.433345 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.488908 0.413457 +vt 0.507174 0.411509 +vt 0.507920 0.434083 +vt 0.580237 0.413224 +vt 0.604324 0.413413 +vt 0.609819 0.431516 +vt 0.581514 0.432289 +vt 0.435860 0.435740 +vt 0.440490 0.417253 +vt 0.464714 0.415920 +vt 0.464334 0.435139 +vt 0.622415 0.411107 +vt 0.638729 0.405048 +vt 0.648174 0.419316 +vt 0.628996 0.425416 +vt 0.396518 0.425416 +vt 0.405331 0.410500 +vt 0.422136 0.415812 +vt 0.416189 0.430578 +vt 0.657485 0.393976 +vt 0.676771 0.378394 +vt 0.692106 0.388274 +vt 0.670140 0.403795 +vt 0.350292 0.396229 +vt 0.365355 0.385357 +vt 0.385755 0.400221 +vt 0.373405 0.410823 +vt 0.694675 0.358805 +vt 0.708795 0.339345 +vt 0.726332 0.341754 +vt 0.709219 0.365014 +vt 0.312756 0.350588 +vt 0.330606 0.347118 +vt 0.346077 0.366293 +vt 0.331524 0.373408 +vt 0.716728 0.324148 +vt 0.720489 0.308075 +vt 0.735879 0.312112 +vt 0.731106 0.326933 +vt 0.301067 0.320593 +vt 0.316923 0.315395 +vt 0.321627 0.331925 +vt 0.306911 0.335590 +vt 0.722094 0.285988 +vt 0.718071 0.262689 +vt 0.731519 0.256780 +vt 0.735791 0.282538 +vt 0.303229 0.261534 +vt 0.317592 0.267554 +vt 0.314279 0.292209 +vt 0.299718 0.289022 +vt 0.704948 0.242983 +vt 0.687690 0.225865 +vt 0.702798 0.217013 +vt 0.719338 0.235312 +vt 0.332486 0.219303 +vt 0.348426 0.228476 +vt 0.330762 0.246617 +vt 0.315457 0.238665 +vt 0.671262 0.210330 +vt 0.653897 0.195135 +vt 0.662317 0.184641 +vt 0.685445 0.200761 +vt 0.374195 0.185721 +vt 0.382918 0.196478 +vt 0.365218 0.212210 +vt 0.350400 0.202336 +vt 0.626908 0.015608 +vt 0.638176 0.018993 +vt 0.639561 0.040540 +vt 0.621541 0.032099 +vt 0.649444 0.022378 +vt 0.654195 0.047117 +vt 0.653501 0.070933 +vt 0.637878 0.060791 +vt 0.619529 0.049057 +vt 0.383906 0.070216 +vt 0.383583 0.046313 +vt 0.398340 0.039911 +vt 0.399749 0.060219 +vt 0.388827 0.021586 +vt 0.400073 0.018359 +vt 0.411318 0.015131 +vt 0.416466 0.031641 +vt 0.418298 0.048624 +vt 0.567460 0.000144 +vt 0.597184 0.007876 +vt 0.598253 0.024161 +vt 0.573917 0.020499 +vt 0.598430 0.039835 +vt 0.577728 0.035019 +vt 0.439789 0.023890 +vt 0.439501 0.039552 +vt 0.440977 0.007638 +vt 0.470636 0.000144 +vt 0.464105 0.020382 +vt 0.460236 0.034862 +vt 0.518922 0.024886 +vt 0.543191 0.012515 +vt 0.552750 0.024889 +vt 0.537616 0.033544 +vt 0.560569 0.036503 +vt 0.548263 0.041578 +vt 0.485213 0.024839 +vt 0.477380 0.036413 +vt 0.494779 0.012515 +vt 0.500285 0.033512 +vt 0.489654 0.041519 +vt 0.531378 0.042677 +vt 0.542117 0.047535 +vt 0.518927 0.040128 +vt 0.506494 0.042655 +vt 0.495779 0.047492 +vt 0.549415 0.051935 +vt 0.554977 0.055543 +vt 0.554949 0.048532 +vt 0.558366 0.052915 +vt 0.488483 0.051874 +vt 0.482963 0.048454 +vt 0.482915 0.055466 +vt 0.479532 0.052826 +vt 0.560503 0.058027 +vt 0.567352 0.061653 +vt 0.565105 0.054124 +vt 0.576047 0.057402 +vt 0.477380 0.057933 +vt 0.472789 0.054013 +vt 0.470506 0.061537 +vt 0.461815 0.057251 +vt 0.576881 0.068688 +vt 0.587176 0.079305 +vt 0.590585 0.064811 +vt 0.605153 0.075955 +vt 0.460918 0.068542 +vt 0.447196 0.064600 +vt 0.450534 0.079148 +vt 0.432505 0.075705 +vt 0.578971 0.047922 +vt 0.596821 0.054289 +vt 0.615002 0.064774 +vt 0.441013 0.054029 +vt 0.422701 0.064421 +vt 0.458932 0.047755 +vt 0.564907 0.046599 +vt 0.473014 0.046489 +vt 0.624013 0.104750 +vt 0.616184 0.090438 +vt 0.630060 0.078450 +vt 0.642020 0.091166 +vt 0.407441 0.078039 +vt 0.421316 0.090206 +vt 0.413334 0.104572 +vt 0.395272 0.090713 +vt 0.596324 0.093677 +vt 0.603744 0.108616 +vt 0.441273 0.093555 +vt 0.433741 0.108565 +vt 0.611761 0.131114 +vt 0.612571 0.139641 +vt 0.635943 0.127696 +vt 0.630860 0.142201 +vt 0.626197 0.150966 +vt 0.612401 0.147309 +vt 0.410974 0.151389 +vt 0.406192 0.142474 +vt 0.424780 0.139885 +vt 0.424973 0.147644 +vt 0.401083 0.127719 +vt 0.425593 0.131262 +vt 0.608855 0.120934 +vt 0.628976 0.115380 +vt 0.408262 0.115272 +vt 0.428547 0.120978 +vt 0.612370 0.154914 +vt 0.617753 0.164731 +vt 0.622617 0.156830 +vt 0.625724 0.164649 +vt 0.425034 0.155339 +vt 0.414640 0.157330 +vt 0.419599 0.165321 +vt 0.411492 0.165278 +vt 0.633828 0.179037 +vt 0.637884 0.173830 +vt 0.399140 0.174660 +vt 0.403302 0.179942 +vt 0.945900 0.079569 +vt 0.914838 0.105981 +vt 0.893260 0.084498 +vt 0.918840 0.058242 +vt 0.889132 0.123361 +vt 0.873282 0.106442 +vt 0.851852 0.096591 +vt 0.866972 0.069553 +vt 0.891780 0.036916 +vt 0.180084 0.088507 +vt 0.156552 0.097152 +vt 0.136417 0.071699 +vt 0.165727 0.058422 +vt 0.137530 0.114165 +vt 0.110425 0.092953 +vt 0.078961 0.060719 +vt 0.110619 0.041093 +vt 0.142277 0.021467 +vt 0.833734 0.057065 +vt 0.848682 0.023851 +vt 0.822965 0.086651 +vt 0.785804 0.079347 +vt 0.791534 0.049108 +vt 0.805584 0.010786 +vt 0.249093 0.074797 +vt 0.210628 0.080245 +vt 0.201098 0.048397 +vt 0.244703 0.043157 +vt 0.187463 0.012475 +vt 0.232648 0.003484 +vt 0.738361 0.047754 +vt 0.738984 0.016493 +vt 0.739549 0.077405 +vt 0.689992 0.080919 +vt 0.691272 0.049157 +vt 0.672384 0.022201 +vt 0.346775 0.079604 +vt 0.296387 0.074595 +vt 0.298714 0.044235 +vt 0.346234 0.047410 +vt 0.299313 0.012237 +vt 0.365979 0.020991 +vt 0.667324 0.049467 +vt 0.660914 0.022289 +vt 0.666424 0.075383 +vt 0.370819 0.074495 +vt 0.370369 0.048457 +vt 0.377403 0.021288 +vt 0.650904 0.098775 +vt 0.661183 0.105558 +vt 0.386234 0.098272 +vt 0.375694 0.105035 +vt 0.744333 0.224966 +vt 0.754642 0.247585 +vt 0.727991 0.205063 +vt 0.758274 0.191148 +vt 0.769779 0.215877 +vt 0.778667 0.239039 +vt 0.273755 0.191843 +vt 0.305809 0.206728 +vt 0.288775 0.227778 +vt 0.261579 0.218114 +vt 0.278389 0.252011 +vt 0.252527 0.243095 +vt 0.994525 0.167705 +vt 0.948074 0.176349 +vt 0.933945 0.138078 +vt 0.970213 0.123637 +vt 0.913217 0.182923 +vt 0.902861 0.149999 +vt 0.118945 0.142532 +vt 0.085008 0.126913 +vt 0.103932 0.178783 +vt 0.064870 0.169124 +vt 0.011829 0.155367 +vt 0.045395 0.108043 +vt 0.911671 0.402429 +vt 0.884003 0.369161 +vt 0.907892 0.346905 +vt 0.937286 0.373591 +vt 0.862686 0.339578 +vt 0.883515 0.321821 +vt 0.898768 0.301660 +vt 0.926996 0.320953 +vt 0.962901 0.344752 +vt 0.118375 0.315370 +vt 0.136374 0.338312 +vt 0.108675 0.368008 +vt 0.085783 0.338181 +vt 0.160786 0.357984 +vt 0.137159 0.392880 +vt 0.106400 0.432652 +vt 0.075184 0.399845 +vt 0.043968 0.367038 +vt 0.943061 0.290270 +vt 0.981378 0.299696 +vt 0.911263 0.279326 +vt 0.918742 0.252459 +vt 0.953248 0.255267 +vt 0.999856 0.254640 +vt 0.095172 0.258408 +vt 0.103698 0.289559 +vt 0.066713 0.302159 +vt 0.055135 0.260843 +vt 0.022056 0.313076 +vt 0.000144 0.259113 +vt 0.954713 0.216353 +vt 0.997190 0.211173 +vt 0.918953 0.218701 +vt 0.095629 0.219445 +vt 0.054717 0.215133 +vt 0.005987 0.207240 +vt 0.749542 0.334683 +vt 0.742710 0.323398 +vt 0.760230 0.315333 +vt 0.768682 0.327936 +vt 0.754434 0.300978 +vt 0.773434 0.293137 +vt 0.779994 0.306487 +vt 0.789564 0.318101 +vt 0.259496 0.301950 +vt 0.280510 0.309658 +vt 0.274913 0.325696 +vt 0.252703 0.316963 +vt 0.294625 0.333544 +vt 0.288183 0.346496 +vt 0.266464 0.340272 +vt 0.242718 0.330414 +vt 0.804247 0.296080 +vt 0.815676 0.307660 +vt 0.795245 0.283595 +vt 0.816175 0.273268 +vt 0.827684 0.284720 +vt 0.840737 0.296140 +vt 0.212022 0.281565 +vt 0.235299 0.292296 +vt 0.225501 0.306460 +vt 0.199173 0.294636 +vt 0.213124 0.319871 +vt 0.184690 0.307842 +vt 0.845003 0.273015 +vt 0.858466 0.283068 +vt 0.832533 0.263076 +vt 0.844821 0.251955 +vt 0.857419 0.260335 +vt 0.870829 0.268571 +vt 0.179781 0.258393 +vt 0.193764 0.270623 +vt 0.179588 0.281936 +vt 0.165402 0.267814 +vt 0.164426 0.293526 +vt 0.150180 0.277239 +vt 0.866150 0.246053 +vt 0.879792 0.252772 +vt 0.853541 0.238846 +vt 0.858615 0.227900 +vt 0.869522 0.229610 +vt 0.883757 0.234124 +vt 0.162811 0.231605 +vt 0.169328 0.243794 +vt 0.155267 0.251726 +vt 0.150917 0.233273 +vt 0.139801 0.259297 +vt 0.135112 0.238149 +vt 0.842355 0.195160 +vt 0.859121 0.189704 +vt 0.865865 0.210451 +vt 0.852806 0.214647 +vt 0.874671 0.186176 +vt 0.881130 0.211077 +vt 0.137932 0.212248 +vt 0.154082 0.212059 +vt 0.146173 0.184629 +vt 0.162167 0.189401 +vt 0.176788 0.196179 +vt 0.168313 0.217094 +vt 0.896625 0.215385 +vt 0.890727 0.185058 +vt 0.897871 0.243576 +vt 0.119181 0.248685 +vt 0.120908 0.216597 +vt 0.128897 0.182520 +vt 0.892501 0.265345 +vt 0.882329 0.283273 +vt 0.137173 0.294074 +vt 0.125336 0.273589 +vt 0.869172 0.299940 +vt 0.850334 0.314832 +vt 0.174262 0.329298 +vt 0.152490 0.312902 +vt 0.833464 0.354702 +vt 0.823123 0.327435 +vt 0.805060 0.366763 +vt 0.795591 0.338307 +vt 0.237000 0.353494 +vt 0.205465 0.342487 +vt 0.227594 0.386342 +vt 0.194700 0.373985 +vt 0.770185 0.379538 +vt 0.759863 0.357111 +vt 0.775794 0.348002 +vt 0.786680 0.375335 +vt 0.259768 0.363344 +vt 0.278152 0.372616 +vt 0.268122 0.398737 +vt 0.248944 0.395082 +vt 0.845499 0.449967 +vt 0.824956 0.403130 +vt 0.853581 0.388754 +vt 0.878585 0.426198 +vt 0.173003 0.414041 +vt 0.206543 0.429096 +vt 0.185281 0.484099 +vt 0.145840 0.458376 +vt 0.815858 0.445381 +vt 0.793215 0.444821 +vt 0.778079 0.421946 +vt 0.792645 0.414150 +vt 0.770572 0.444261 +vt 0.763136 0.431432 +vt 0.755700 0.418603 +vt 0.762942 0.399071 +vt 0.287033 0.442912 +vt 0.279198 0.458114 +vt 0.261445 0.448038 +vt 0.277577 0.420825 +vt 0.271364 0.473316 +vt 0.245312 0.475251 +vt 0.219260 0.477186 +vt 0.244234 0.439904 +vt 0.806457 0.409737 +vt 0.823720 0.439889 +vt 0.228110 0.435654 +vt 0.209866 0.471309 +vt 0.819845 0.468071 +vt 0.817852 0.456726 +vt 0.827067 0.454473 +vt 0.832672 0.459019 +vt 0.206812 0.488297 +vt 0.200587 0.493852 +vt 0.217577 0.490395 +vt 0.215894 0.503605 +vt 0.755291 0.275659 +vt 0.776439 0.267723 +vt 0.278652 0.282200 +vt 0.255635 0.274184 +vt 0.794820 0.235072 +vt 0.795082 0.261102 +vt 0.808235 0.230663 +vt 0.811209 0.254481 +vt 0.217549 0.260513 +vt 0.235224 0.267418 +vt 0.220518 0.234225 +vt 0.235095 0.238903 +vt 0.820950 0.229143 +vt 0.824810 0.246547 +vt 0.829287 0.219562 +vt 0.835759 0.236818 +vt 0.190262 0.241569 +vt 0.202740 0.252082 +vt 0.199067 0.222464 +vt 0.206983 0.233036 +vt 0.843931 0.224810 +vt 0.837701 0.211668 +vt 0.179580 0.228419 +vt 0.187927 0.209321 +vt 0.744359 0.103837 +vt 0.706047 0.109141 +vt 0.784963 0.102809 +vt 0.786447 0.122246 +vt 0.752059 0.127970 +vt 0.712371 0.140499 +vt 0.246597 0.119486 +vt 0.248893 0.099247 +vt 0.290608 0.101681 +vt 0.281936 0.126431 +vt 0.329760 0.108091 +vt 0.322678 0.140136 +vt 0.736714 0.167208 +vt 0.761916 0.150723 +vt 0.772211 0.168449 +vt 0.787690 0.140415 +vt 0.785486 0.152330 +vt 0.270931 0.149783 +vt 0.244699 0.138495 +vt 0.296879 0.167286 +vt 0.259495 0.167887 +vt 0.245969 0.151002 +vt 0.709243 0.185137 +vt 0.686430 0.166862 +vt 0.349277 0.167406 +vt 0.325495 0.186083 +vt 0.644947 0.163787 +vt 0.657890 0.151913 +vt 0.670045 0.134473 +vt 0.378600 0.152258 +vt 0.366202 0.134395 +vt 0.391891 0.164438 +vt 0.677327 0.115796 +vt 0.359020 0.115319 +vt 0.635300 0.165769 +vt 0.401750 0.166464 +vt 0.839869 0.175761 +vt 0.853235 0.168500 +vt 0.837382 0.156361 +vt 0.841417 0.150913 +vt 0.853765 0.137677 +vt 0.867144 0.161965 +vt 0.175775 0.132589 +vt 0.189019 0.148124 +vt 0.172572 0.166616 +vt 0.157745 0.158328 +vt 0.196622 0.155241 +vt 0.186705 0.175710 +vt 0.882140 0.156879 +vt 0.872766 0.134048 +vt 0.141530 0.151652 +vt 0.154964 0.127182 +vt 0.816880 0.141014 +vt 0.811434 0.154345 +vt 0.820522 0.126340 +vt 0.211373 0.122359 +vt 0.215227 0.138347 +vt 0.221296 0.153122 +vt 0.820556 0.108981 +vt 0.848088 0.116562 +vt 0.183019 0.110167 +vt 0.211947 0.103945 +vt 0.864510 0.119761 +vt 0.165361 0.112301 +vt 0.506166 0.904851 +vt 0.469277 0.899897 +vt 0.467102 0.887934 +vt 0.502009 0.889062 +vt 0.432388 0.894943 +vt 0.438605 0.880072 +vt 0.442570 0.867282 +vt 0.467297 0.874740 +vt 0.497540 0.875977 +vt 0.312156 0.865143 +vt 0.315792 0.878106 +vt 0.286936 0.885229 +vt 0.287103 0.871964 +vt 0.321637 0.893225 +vt 0.284422 0.897192 +vt 0.247207 0.901159 +vt 0.251822 0.885397 +vt 0.256678 0.872371 +vt 0.543710 0.881749 +vt 0.555496 0.892398 +vt 0.534426 0.869293 +vt 0.566292 0.853087 +vt 0.579330 0.863421 +vt 0.604825 0.879946 +vt 0.188235 0.847442 +vt 0.219796 0.864624 +vt 0.210113 0.876880 +vt 0.174834 0.857456 +vt 0.197968 0.887254 +vt 0.148729 0.873349 +vt 0.595994 0.831506 +vt 0.612393 0.835781 +vt 0.581472 0.825753 +vt 0.581825 0.795308 +vt 0.595536 0.796225 +vt 0.619962 0.791615 +vt 0.174295 0.788956 +vt 0.173769 0.819544 +vt 0.159006 0.824902 +vt 0.160488 0.789473 +vt 0.142396 0.828721 +vt 0.136063 0.784093 +vt 0.579793 0.767804 +vt 0.589729 0.763265 +vt 0.569205 0.769767 +vt 0.548861 0.748164 +vt 0.555739 0.744297 +vt 0.563952 0.739636 +vt 0.208752 0.742636 +vt 0.187712 0.763703 +vt 0.177137 0.761422 +vt 0.201967 0.738564 +vt 0.167303 0.756572 +vt 0.193875 0.733657 +vt 0.530349 0.723761 +vt 0.537882 0.718127 +vt 0.526039 0.729528 +vt 0.500239 0.712664 +vt 0.502360 0.705108 +vt 0.509441 0.697811 +vt 0.258441 0.708419 +vt 0.232145 0.724609 +vt 0.227988 0.718717 +vt 0.256518 0.700799 +vt 0.220609 0.712866 +vt 0.249633 0.693309 +vt 0.470507 0.687247 +vt 0.476553 0.677761 +vt 0.470964 0.696376 +vt 0.442627 0.684437 +vt 0.439691 0.671552 +vt 0.445649 0.657308 +vt 0.316870 0.681612 +vt 0.288185 0.692861 +vt 0.288873 0.683732 +vt 0.320103 0.668780 +vt 0.283075 0.674093 +vt 0.314481 0.654423 +vt 0.501210 0.721182 +vt 0.474394 0.705845 +vt 0.503339 0.729425 +vt 0.478400 0.714693 +vt 0.455602 0.705126 +vt 0.449084 0.695707 +vt 0.303354 0.702018 +vt 0.280263 0.711016 +vt 0.284505 0.702256 +vt 0.310125 0.692742 +vt 0.254889 0.725123 +vt 0.257242 0.716923 +vt 0.544487 0.752313 +vt 0.524464 0.736210 +vt 0.541615 0.756550 +vt 0.524268 0.742875 +vt 0.233553 0.738029 +vt 0.233538 0.731346 +vt 0.215780 0.751246 +vt 0.213020 0.746918 +vt 0.571714 0.792317 +vt 0.561605 0.770877 +vt 0.563856 0.789235 +vt 0.555810 0.771958 +vt 0.201098 0.766285 +vt 0.195311 0.765036 +vt 0.192523 0.783381 +vt 0.184541 0.786248 +vt 0.557285 0.839277 +vt 0.570708 0.817045 +vt 0.551540 0.826015 +vt 0.562758 0.808517 +vt 0.193070 0.802770 +vt 0.184837 0.811108 +vt 0.203833 0.820663 +vt 0.197682 0.833823 +vt 0.498666 0.859595 +vt 0.530144 0.853227 +vt 0.502835 0.844149 +vt 0.529227 0.837942 +vt 0.225907 0.833272 +vt 0.224553 0.848601 +vt 0.252242 0.840246 +vt 0.256002 0.855880 +vt 0.472229 0.859085 +vt 0.450313 0.852917 +vt 0.459439 0.839671 +vt 0.479382 0.844489 +vt 0.295958 0.836942 +vt 0.304767 0.850499 +vt 0.282577 0.856098 +vt 0.275792 0.841237 +vt 0.781229 0.177498 +vt 0.777540 0.192542 +vt 0.790753 0.164650 +vt 0.796021 0.176969 +vt 0.788561 0.181231 +vt 0.787311 0.191440 +vt 0.233625 0.175620 +vt 0.239797 0.163311 +vt 0.249526 0.176892 +vt 0.241448 0.180379 +vt 0.253192 0.192916 +vt 0.242627 0.191415 +vt 0.391039 0.611891 +vt 0.423162 0.635783 +vt 0.414812 0.659395 +vt 0.392902 0.649008 +vt 0.419641 0.680620 +vt 0.394766 0.686125 +vt 0.345258 0.657206 +vt 0.339989 0.678347 +vt 0.337396 0.633508 +vt 0.369913 0.610196 +vt 0.367375 0.647321 +vt 0.364838 0.684445 +vt 0.785521 0.211976 +vt 0.795291 0.208892 +vt 0.244733 0.213828 +vt 0.234116 0.210430 +vt 0.391747 0.862097 +vt 0.396676 0.851779 +vt 0.416134 0.867182 +vt 0.412068 0.878520 +vt 0.401605 0.841460 +vt 0.422232 0.855297 +vt 0.332920 0.853649 +vt 0.338727 0.865760 +vt 0.354026 0.840297 +vt 0.358701 0.850802 +vt 0.363377 0.861308 +vt 0.342507 0.877267 +vt 0.430345 0.696278 +vt 0.441095 0.707171 +vt 0.433108 0.714624 +vt 0.418039 0.702943 +vt 0.325667 0.712108 +vt 0.317846 0.704438 +vt 0.328898 0.693778 +vt 0.341075 0.700759 +vt 0.428970 0.728065 +vt 0.411160 0.720916 +vt 0.412028 0.711091 +vt 0.429871 0.721278 +vt 0.384658 0.710299 +vt 0.389712 0.698212 +vt 0.369619 0.696707 +vt 0.346905 0.709081 +vt 0.374400 0.708969 +vt 0.347534 0.718963 +vt 0.329482 0.725693 +vt 0.328747 0.718861 +vt 0.412713 0.748810 +vt 0.402384 0.737539 +vt 0.414283 0.732612 +vt 0.419552 0.742929 +vt 0.427993 0.735917 +vt 0.426851 0.741709 +vt 0.344106 0.730624 +vt 0.330264 0.733596 +vt 0.355924 0.735873 +vt 0.345272 0.746925 +vt 0.338558 0.740847 +vt 0.331263 0.739437 +vt 0.416980 0.784528 +vt 0.402816 0.787448 +vt 0.399599 0.759583 +vt 0.412712 0.764696 +vt 0.384657 0.795423 +vt 0.384658 0.752861 +vt 0.373335 0.751720 +vt 0.358163 0.758083 +vt 0.372270 0.794472 +vt 0.354223 0.785988 +vt 0.340072 0.782683 +vt 0.344867 0.762877 +vt 0.393131 0.818442 +vt 0.408920 0.809841 +vt 0.418563 0.827788 +vt 0.422947 0.802247 +vt 0.431514 0.817618 +vt 0.347510 0.808325 +vt 0.333617 0.800325 +vt 0.363148 0.817384 +vt 0.337347 0.826103 +vt 0.324605 0.815540 +vt 0.432392 0.842316 +vt 0.443580 0.830404 +vt 0.323061 0.840331 +vt 0.312141 0.828061 +vt 0.812198 0.213951 +vt 0.820073 0.216574 +vt 0.816266 0.203086 +vt 0.820686 0.206424 +vt 0.825107 0.209762 +vt 0.827197 0.214662 +vt 0.199767 0.214827 +vt 0.204798 0.210494 +vt 0.206958 0.220210 +vt 0.199417 0.218645 +vt 0.209828 0.206161 +vt 0.215391 0.216797 +vt 0.802821 0.202258 +vt 0.795502 0.189331 +vt 0.802192 0.184609 +vt 0.809229 0.193848 +vt 0.226485 0.183086 +vt 0.233684 0.188879 +vt 0.225609 0.203428 +vt 0.218157 0.194624 +vt 0.793802 0.183009 +vt 0.799106 0.180789 +vt 0.230055 0.179353 +vt 0.235688 0.181927 +vt 0.452764 0.821724 +vt 0.467554 0.830235 +vt 0.441512 0.810137 +vt 0.451051 0.802964 +vt 0.461899 0.813742 +vt 0.475726 0.821844 +vt 0.305373 0.800299 +vt 0.314760 0.807757 +vt 0.303149 0.819093 +vt 0.294190 0.810831 +vt 0.288063 0.827242 +vt 0.280085 0.818591 +vt 0.433448 0.796668 +vt 0.427392 0.781944 +vt 0.436210 0.778061 +vt 0.442865 0.790824 +vt 0.320932 0.775685 +vt 0.329683 0.779815 +vt 0.323216 0.794443 +vt 0.313915 0.788326 +vt 0.422167 0.766592 +vt 0.420500 0.754265 +vt 0.426815 0.757343 +vt 0.429958 0.765413 +vt 0.330900 0.755130 +vt 0.337317 0.752202 +vt 0.335326 0.764535 +vt 0.327537 0.763150 +vt 0.425119 0.748614 +vt 0.431772 0.744946 +vt 0.437934 0.749084 +vt 0.431216 0.753471 +vt 0.319953 0.746555 +vt 0.326243 0.742561 +vt 0.332826 0.746412 +vt 0.326582 0.751130 +vt 0.436206 0.738566 +vt 0.438509 0.731576 +vt 0.445433 0.734403 +vt 0.442947 0.742075 +vt 0.312804 0.731633 +vt 0.319822 0.728975 +vt 0.321956 0.736046 +vt 0.315103 0.739394 +vt 0.438769 0.726080 +vt 0.440211 0.720712 +vt 0.444070 0.722997 +vt 0.444570 0.728023 +vt 0.314462 0.720230 +vt 0.318390 0.718037 +vt 0.319700 0.723457 +vt 0.313832 0.725256 +vt 0.446061 0.714104 +vt 0.458719 0.712454 +vt 0.461005 0.720964 +vt 0.448865 0.720462 +vt 0.297533 0.717756 +vt 0.300043 0.709284 +vt 0.312691 0.711265 +vt 0.309718 0.717567 +vt 0.486234 0.834477 +vt 0.507497 0.833869 +vt 0.492848 0.825954 +vt 0.511534 0.825802 +vt 0.269185 0.830990 +vt 0.262777 0.822248 +vt 0.247846 0.829790 +vt 0.244016 0.821576 +vt 0.530038 0.827833 +vt 0.548289 0.817326 +vt 0.530052 0.821112 +vt 0.543283 0.811964 +vt 0.225378 0.823096 +vt 0.225553 0.816345 +vt 0.207347 0.812028 +vt 0.212526 0.806786 +vt 0.556681 0.803304 +vt 0.556901 0.788047 +vt 0.548593 0.800602 +vt 0.547784 0.788523 +vt 0.199322 0.797709 +vt 0.207519 0.795227 +vt 0.199540 0.782389 +vt 0.208678 0.783127 +vt 0.550636 0.773835 +vt 0.539246 0.760680 +vt 0.542657 0.777226 +vt 0.533477 0.766384 +vt 0.206237 0.768316 +vt 0.214148 0.771943 +vt 0.218040 0.755453 +vt 0.223666 0.761335 +vt 0.524091 0.748593 +vt 0.504695 0.736157 +vt 0.520508 0.755673 +vt 0.503273 0.744104 +vt 0.233573 0.743764 +vt 0.236970 0.750961 +vt 0.253350 0.731832 +vt 0.254563 0.739837 +vt 0.480584 0.721958 +vt 0.481289 0.730690 +vt 0.277885 0.718239 +vt 0.276949 0.726974 +vt 0.452240 0.747962 +vt 0.445761 0.755176 +vt 0.455400 0.739499 +vt 0.466859 0.747047 +vt 0.462582 0.756036 +vt 0.454669 0.763299 +vt 0.290987 0.743759 +vt 0.302676 0.736487 +vt 0.305629 0.745059 +vt 0.295043 0.752888 +vt 0.311943 0.752465 +vt 0.302793 0.760384 +vt 0.472472 0.766110 +vt 0.464072 0.773530 +vt 0.478260 0.757229 +vt 0.488959 0.768081 +vt 0.481838 0.776645 +vt 0.473719 0.784314 +vt 0.268265 0.764268 +vt 0.279285 0.753671 +vt 0.284855 0.762733 +vt 0.275177 0.773052 +vt 0.293086 0.770402 +vt 0.283117 0.780967 +vt 0.490606 0.786100 +vt 0.483357 0.794099 +vt 0.498311 0.777638 +vt 0.506764 0.785137 +vt 0.499283 0.793344 +vt 0.493518 0.801648 +vt 0.249939 0.780890 +vt 0.258625 0.773601 +vt 0.266123 0.782302 +vt 0.257217 0.789333 +vt 0.273180 0.790528 +vt 0.262775 0.797826 +vt 0.508378 0.797243 +vt 0.504736 0.805721 +vt 0.514765 0.789813 +vt 0.522193 0.793010 +vt 0.519588 0.798948 +vt 0.517494 0.807630 +vt 0.234236 0.788355 +vt 0.241781 0.785358 +vt 0.247981 0.792993 +vt 0.236682 0.794389 +vt 0.251401 0.801603 +vt 0.238540 0.803163 +vt 0.499287 0.815830 +vt 0.513829 0.816992 +vt 0.485023 0.811731 +vt 0.271027 0.808182 +vt 0.256591 0.811904 +vt 0.241957 0.812666 +vt 0.462622 0.793722 +vt 0.472942 0.803924 +vt 0.283368 0.800673 +vt 0.294004 0.790710 +vt 0.453638 0.782440 +vt 0.445590 0.771244 +vt 0.311696 0.768596 +vt 0.303323 0.779623 +vt 0.438078 0.761300 +vt 0.319494 0.758811 +vt 0.453126 0.729630 +vt 0.465025 0.733926 +vt 0.293165 0.730648 +vt 0.305209 0.726649 +vt 0.497066 0.755990 +vt 0.480857 0.743935 +vt 0.277032 0.740268 +vt 0.260464 0.751923 +vt 0.520406 0.775343 +vt 0.510097 0.766425 +vt 0.247114 0.762030 +vt 0.236527 0.770686 +vt 0.533439 0.790435 +vt 0.528445 0.782846 +vt 0.228249 0.777983 +vt 0.223021 0.785453 +vt 0.532275 0.808688 +vt 0.534611 0.799609 +vt 0.221583 0.794627 +vt 0.223671 0.803807 +vt 0.526743 0.815988 +vt 0.229019 0.811294 +vt 0.492632 0.667222 +vt 0.523352 0.690074 +vt 0.465874 0.641962 +vt 0.507960 0.626656 +vt 0.528528 0.655847 +vt 0.553068 0.682536 +vt 0.253280 0.623071 +vt 0.294662 0.638716 +vt 0.267297 0.663165 +vt 0.231929 0.651281 +vt 0.235945 0.685198 +vt 0.206572 0.677006 +vt 0.549123 0.711844 +vt 0.572334 0.733105 +vt 0.572286 0.706958 +vt 0.588280 0.728364 +vt 0.209549 0.706259 +vt 0.186581 0.700741 +vt 0.185684 0.726865 +vt 0.169886 0.721631 +vt 0.595375 0.754431 +vt 0.620810 0.767292 +vt 0.603149 0.746004 +vt 0.619756 0.755543 +vt 0.161926 0.747534 +vt 0.154420 0.738822 +vt 0.136030 0.759585 +vt 0.137477 0.747836 +vt 0.707492 0.759884 +vt 0.663727 0.775750 +vt 0.651200 0.763158 +vt 0.679266 0.742526 +vt 0.637004 0.751745 +vt 0.653228 0.735238 +vt 0.105751 0.754337 +vt 0.120342 0.743429 +vt 0.092794 0.766459 +vt 0.049526 0.748824 +vt 0.078675 0.732719 +vt 0.104797 0.726450 +vt 0.745511 0.652100 +vt 0.726501 0.705992 +vt 0.697726 0.705897 +vt 0.707312 0.662584 +vt 0.662804 0.705755 +vt 0.665943 0.669383 +vt 0.062384 0.695666 +vt 0.096615 0.696979 +vt 0.034467 0.694286 +vt 0.019409 0.639749 +vt 0.055680 0.652866 +vt 0.095280 0.661418 +vt 0.740843 0.572428 +vt 0.743177 0.612264 +vt 0.708753 0.621905 +vt 0.706123 0.582542 +vt 0.662860 0.632212 +vt 0.671403 0.592656 +vt 0.057364 0.614013 +vt 0.100277 0.626171 +vt 0.026537 0.602076 +vt 0.033664 0.564403 +vt 0.066133 0.582039 +vt 0.111371 0.595474 +vt 0.607563 0.675836 +vt 0.594028 0.643852 +vt 0.579497 0.612535 +vt 0.167361 0.638772 +vt 0.182968 0.608904 +vt 0.152631 0.669272 +vt 0.615585 0.705518 +vt 0.619188 0.729077 +vt 0.138972 0.721397 +vt 0.143475 0.698159 +vt 0.619467 0.742688 +vt 0.138198 0.734952 +vt 0.835231 0.207140 +vt 0.838530 0.201059 +vt 0.831932 0.213221 +vt 0.834578 0.206879 +vt 0.834641 0.206919 +vt 0.834705 0.206959 +vt 0.042440 0.543531 +vt 0.080685 0.559880 +vt 0.051216 0.522659 +vt 0.098128 0.542627 +vt 0.145041 0.562595 +vt 0.128325 0.573563 +vt 0.620420 0.565675 +vt 0.645911 0.579166 +vt 0.568491 0.584855 +vt 0.559246 0.558995 +vt 0.500657 0.594728 +vt 0.498072 0.552315 +vt 0.194754 0.581916 +vt 0.261251 0.591882 +vt 0.204630 0.556368 +vt 0.264218 0.550140 +vt 0.444556 0.582103 +vt 0.451996 0.612966 +vt 0.309096 0.610407 +vt 0.317066 0.580168 +vn 0.7273 -0.1123 0.6770 +vn 0.6470 -0.3278 0.6885 +vn 0.6658 -0.3430 0.6626 +vn 0.7475 -0.1217 0.6530 +vn -0.6658 -0.3430 0.6626 +vn -0.6470 -0.3278 0.6885 +vn -0.7273 -0.1123 0.6770 +vn -0.7475 -0.1217 0.6530 +vn 0.8357 -0.1487 0.5287 +vn 0.7404 -0.4154 0.5284 +vn 0.7666 -0.4493 0.4586 +vn 0.8709 -0.1601 0.4646 +vn -0.7666 -0.4493 0.4586 +vn -0.7404 -0.4154 0.5284 +vn -0.8357 -0.1487 0.5287 +vn -0.8709 -0.1601 0.4646 +vn 0.5368 -0.6566 0.5298 +vn 0.2687 -0.7999 0.5366 +vn 0.2578 -0.8623 0.4359 +vn 0.5454 -0.7103 0.4450 +vn -0.2578 -0.8623 0.4359 +vn -0.2687 -0.7999 0.5366 +vn -0.5368 -0.6566 0.5298 +vn -0.5454 -0.7103 0.4450 +vn 0.4685 -0.5130 0.7193 +vn 0.2654 -0.6038 0.7516 +vn 0.2708 -0.6392 0.7198 +vn 0.4893 -0.5353 0.6885 +vn -0.2708 -0.6392 0.7198 +vn -0.2654 -0.6038 0.7516 +vn -0.4685 -0.5130 0.7193 +vn -0.4893 -0.5353 0.6885 +vn 0.0158 -0.6277 0.7783 +vn -0.2383 -0.5553 0.7968 +vn -0.2682 -0.5807 0.7687 +vn -0.0056 -0.6633 0.7483 +vn 0.2682 -0.5807 0.7687 +vn 0.2383 -0.5553 0.7968 +vn -0.0158 -0.6277 0.7783 +vn 0.0056 -0.6633 0.7483 +vn -0.0755 -0.8283 0.5551 +vn -0.3820 -0.7169 0.5832 +vn -0.4211 -0.7697 0.4799 +vn -0.1034 -0.8883 0.4476 +vn 0.4211 -0.7697 0.4799 +vn 0.3820 -0.7169 0.5832 +vn 0.0755 -0.8283 0.5551 +vn 0.1034 -0.8883 0.4476 +vn -0.6383 -0.4619 0.6159 +vn -0.7558 -0.1624 0.6343 +vn -0.8211 -0.1789 0.5420 +vn -0.6910 -0.5023 0.5198 +vn 0.8211 -0.1789 0.5420 +vn 0.7558 -0.1624 0.6343 +vn 0.6383 -0.4619 0.6159 +vn 0.6910 -0.5023 0.5198 +vn -0.4701 -0.3509 0.8099 +vn -0.5701 -0.1161 0.8133 +vn -0.5928 -0.1243 0.7957 +vn -0.4956 -0.3679 0.7868 +vn 0.5928 -0.1243 0.7957 +vn 0.5701 -0.1161 0.8133 +vn 0.4701 -0.3509 0.8099 +vn 0.4956 -0.3679 0.7868 +vn -0.5732 0.1137 0.8115 +vn -0.4898 0.3470 0.7998 +vn -0.5053 0.3667 0.7811 +vn -0.5944 0.1232 0.7946 +vn 0.5053 0.3667 0.7811 +vn 0.4898 0.3470 0.7998 +vn 0.5732 0.1137 0.8115 +vn 0.5944 0.1232 0.7946 +vn -0.7547 0.1607 0.6361 +vn -0.6355 0.4531 0.6252 +vn -0.6861 0.4865 0.5409 +vn -0.8191 0.1757 0.5462 +vn 0.6861 0.4865 0.5409 +vn 0.6355 0.4531 0.6252 +vn 0.7547 0.1607 0.6361 +vn 0.8191 0.1757 0.5462 +vn -0.3748 0.7043 0.6028 +vn -0.0681 0.8125 0.5789 +vn -0.0889 0.8613 0.5002 +vn -0.4079 0.7482 0.5233 +vn 0.0889 0.8613 0.5002 +vn 0.0681 0.8125 0.5789 +vn 0.3748 0.7043 0.6028 +vn 0.4079 0.7482 0.5233 +vn -0.2643 0.5756 0.7738 +vn 0.0034 0.6622 0.7493 +vn -0.0121 0.6811 0.7321 +vn -0.2810 0.5914 0.7559 +vn 0.0121 0.6811 0.7321 +vn -0.0034 0.6622 0.7493 +vn 0.2643 0.5756 0.7738 +vn 0.2810 0.5914 0.7559 +vn 0.2665 0.6372 0.7231 +vn 0.4834 0.5317 0.6955 +vn 0.4964 0.5449 0.6758 +vn 0.2712 0.6563 0.7041 +vn -0.4964 0.5449 0.6758 +vn -0.4834 0.5317 0.6955 +vn -0.2665 0.6372 0.7231 +vn -0.2712 0.6563 0.7041 +vn 0.2698 0.7839 0.5592 +vn 0.5355 0.6437 0.5467 +vn 0.5442 0.6864 0.4824 +vn 0.2616 0.8339 0.4859 +vn -0.5442 0.6864 0.4824 +vn -0.5355 0.6437 0.5467 +vn -0.2698 0.7839 0.5592 +vn -0.2616 0.8339 0.4859 +vn 0.7396 0.4071 0.5360 +vn 0.8350 0.1471 0.5302 +vn 0.8697 0.1571 0.4679 +vn 0.7654 0.4336 0.4755 +vn -0.8697 0.1571 0.4679 +vn -0.8350 0.1471 0.5302 +vn -0.7396 0.4071 0.5360 +vn -0.7654 0.4336 0.4755 +vn 0.6612 0.3238 0.6768 +vn 0.7296 0.1099 0.6750 +vn 0.7487 0.1206 0.6518 +vn 0.6727 0.3417 0.6563 +vn -0.7487 0.1206 0.6518 +vn -0.7296 0.1099 0.6750 +vn -0.6612 0.3238 0.6768 +vn -0.6727 0.3417 0.6563 +vn 0.8979 0.1457 0.4155 +vn 0.8088 0.4421 0.3878 +vn 0.7208 0.3667 0.5882 +vn 0.7994 0.0976 0.5928 +vn -0.7208 0.3667 0.5882 +vn -0.8088 0.4421 0.3878 +vn -0.8979 0.1457 0.4155 +vn -0.7994 0.0976 0.5928 +vn 0.5572 0.7508 0.3547 +vn 0.2459 0.9127 0.3264 +vn 0.2579 0.8107 0.5255 +vn 0.5565 0.6116 0.5624 +vn -0.2579 0.8107 0.5255 +vn -0.2459 0.9127 0.3264 +vn -0.5572 0.7508 0.3547 +vn -0.5565 0.6116 0.5624 +vn -0.1284 0.9357 0.3286 +vn -0.4835 0.7944 0.3676 +vn -0.4298 0.7033 0.5662 +vn -0.0514 0.8484 0.5268 +vn 0.4298 0.7033 0.5662 +vn 0.4835 0.7944 0.3676 +vn 0.1284 0.9357 0.3286 +vn 0.0514 0.8484 0.5268 +vn -0.7740 0.4956 0.3941 +vn -0.9044 0.1782 0.3877 +vn -0.8385 0.1470 0.5247 +vn -0.6747 0.4757 0.5644 +vn 0.8385 0.1470 0.5247 +vn 0.9044 0.1782 0.3877 +vn 0.7740 0.4956 0.3941 +vn 0.6746 0.4757 0.5644 +vn -0.9014 -0.1851 0.3913 +vn -0.7496 -0.5180 0.4121 +vn -0.6662 -0.5074 0.5465 +vn -0.8390 -0.1538 0.5220 +vn 0.6662 -0.5074 0.5465 +vn 0.7496 -0.5180 0.4121 +vn 0.9014 -0.1851 0.3913 +vn 0.8390 -0.1538 0.5220 +vn -0.4559 -0.7923 0.4054 +vn -0.1155 -0.9190 0.3771 +vn -0.0661 -0.8733 0.4827 +vn -0.4326 -0.7287 0.5310 +vn 0.0661 -0.8733 0.4827 +vn 0.1155 -0.9190 0.3771 +vn 0.4559 -0.7923 0.4054 +vn 0.4326 -0.7287 0.5310 +vn 0.2516 -0.8928 0.3737 +vn 0.5426 -0.7431 0.3916 +vn 0.5520 -0.6403 0.5341 +vn 0.2546 -0.8374 0.4836 +vn -0.5520 -0.6403 0.5341 +vn -0.5426 -0.7431 0.3916 +vn -0.2516 -0.8928 0.3737 +vn -0.2546 -0.8374 0.4836 +vn 0.7901 -0.4607 0.4043 +vn 0.8956 -0.1513 0.4183 +vn 0.7999 -0.1021 0.5914 +vn 0.7153 -0.3948 0.5766 +vn -0.7999 -0.1021 0.5914 +vn -0.8956 -0.1513 0.4183 +vn -0.7901 -0.4607 0.4043 +vn -0.7153 -0.3948 0.5766 +vn 0.3463 -0.0436 0.9371 +vn 0.4246 -0.1483 0.8932 +vn 0.4653 -0.0290 0.8847 +vn -0.4653 -0.0290 0.8847 +vn -0.4246 -0.1483 0.8932 +vn -0.3463 -0.0436 0.9371 +vn 0.2531 -0.2854 0.9244 +vn 0.3780 -0.2127 0.9010 +vn 0.2775 -0.1178 0.9535 +vn -0.2775 -0.1178 0.9535 +vn -0.3780 -0.2127 0.9010 +vn -0.2531 -0.2854 0.9244 +vn 0.1272 -0.1176 0.9849 +vn -0.0284 -0.2304 0.9727 +vn 0.1457 -0.2960 0.9440 +vn -0.1457 -0.2960 0.9440 +vn 0.0284 -0.2304 0.9727 +vn -0.1272 -0.1176 0.9849 +vn 0.0156 -0.0210 0.9997 +vn -0.1662 -0.0169 0.9859 +vn -0.1075 -0.1515 0.9826 +vn 0.1075 -0.1515 0.9826 +vn 0.1662 -0.0169 0.9859 +vn -0.0156 -0.0210 0.9997 +vn 0.0156 0.0200 0.9997 +vn -0.1069 0.1401 0.9843 +vn -0.1659 0.0162 0.9860 +vn 0.1659 0.0162 0.9860 +vn 0.1069 0.1401 0.9843 +vn -0.0156 0.0200 0.9997 +vn 0.1282 0.1118 0.9854 +vn 0.1503 0.2778 0.9488 +vn -0.0240 0.2162 0.9761 +vn 0.0240 0.2162 0.9761 +vn -0.1503 0.2778 0.9488 +vn -0.1282 0.1118 0.9854 +vn 0.2768 0.1120 0.9544 +vn 0.3758 0.1997 0.9049 +vn 0.2510 0.2681 0.9301 +vn -0.2510 0.2681 0.9301 +vn -0.3758 0.1997 0.9049 +vn -0.2768 0.1120 0.9544 +vn 0.3465 0.0413 0.9372 +vn 0.4650 0.0277 0.8849 +vn 0.4247 0.1372 0.8949 +vn -0.4247 0.1372 0.8949 +vn -0.4650 0.0277 0.8849 +vn -0.3465 0.0413 0.9372 +vn 0.1386 -0.9493 0.2823 +vn 0.1343 -0.8291 0.5428 +vn 0.0586 -0.8311 0.5530 +vn 0.0617 -0.9498 0.3066 +vn -0.0586 -0.8311 0.5530 +vn -0.1343 -0.8291 0.5428 +vn -0.1386 -0.9493 0.2823 +vn -0.0617 -0.9498 0.3066 +vn 0.3460 -0.8864 0.3076 +vn 0.3308 -0.7099 0.6218 +vn 0.1854 -0.8199 0.5416 +vn 0.1804 -0.9479 0.2627 +vn -0.1854 -0.8199 0.5416 +vn -0.3308 -0.7099 0.6218 +vn -0.3460 -0.8864 0.3076 +vn -0.1804 -0.9479 0.2627 +vn 0.8726 -0.2473 0.4212 +vn 0.5837 -0.3099 0.7505 +vn 0.4816 -0.5002 0.7196 +vn 0.6655 -0.6181 0.4184 +vn -0.4816 -0.5002 0.7196 +vn -0.5837 -0.3099 0.7505 +vn -0.8726 -0.2473 0.4212 +vn -0.6655 -0.6181 0.4184 +vn 0.9246 0.0556 0.3769 +vn 0.6879 -0.0206 0.7255 +vn 0.6616 -0.1407 0.7365 +vn 0.9240 -0.0404 0.3803 +vn -0.6616 -0.1407 0.7365 +vn -0.6879 -0.0206 0.7255 +vn -0.9246 0.0556 0.3769 +vn -0.9240 -0.0404 0.3803 +vn 0.9095 0.1563 0.3852 +vn 0.7133 0.0892 0.6952 +vn 0.6931 0.0419 0.7196 +vn 0.9166 0.1049 0.3859 +vn -0.6931 0.0419 0.7196 +vn -0.7133 0.0892 0.6952 +vn -0.9095 0.1563 0.3852 +vn -0.9166 0.1049 0.3859 +vn 0.3722 -0.8474 0.3788 +vn 0.3239 -0.8441 0.4273 +vn 0.3732 -0.6960 0.6134 +vn 0.4153 -0.6949 0.5870 +vn -0.3732 -0.6960 0.6134 +vn -0.3239 -0.8441 0.4273 +vn -0.3722 -0.8474 0.3788 +vn -0.4153 -0.6949 0.5870 +vn 0.3888 -0.7907 0.4728 +vn 0.5118 -0.7186 0.4709 +vn 0.4603 -0.5651 0.6847 +vn 0.3919 -0.6473 0.6538 +vn -0.4603 -0.5651 0.6847 +vn -0.5118 -0.7186 0.4709 +vn -0.3888 -0.7907 0.4728 +vn -0.3919 -0.6473 0.6538 +vn 0.6692 -0.6010 0.4370 +vn 0.7616 -0.4716 0.4444 +vn 0.6577 -0.3656 0.6586 +vn 0.5934 -0.4448 0.6708 +vn -0.6577 -0.3656 0.6586 +vn -0.7616 -0.4716 0.4444 +vn -0.6692 -0.6010 0.4370 +vn -0.5934 -0.4448 0.6708 +vn 0.7994 -0.3620 0.4796 +vn 0.8281 -0.2154 0.5176 +vn 0.5973 -0.3152 0.7375 +vn 0.6416 -0.3429 0.6861 +vn -0.5973 -0.3152 0.7375 +vn -0.8281 -0.2154 0.5176 +vn -0.7994 -0.3620 0.4796 +vn -0.6416 -0.3429 0.6861 +vn 0.7792 0.3032 0.5486 +vn 0.4971 0.7392 0.4544 +vn 0.5156 0.2235 0.8271 +vn 0.5907 -0.1699 0.7888 +vn -0.5156 0.2235 0.8271 +vn -0.4971 0.7392 0.4544 +vn -0.7792 0.3032 0.5486 +vn -0.5907 -0.1699 0.7888 +vn 0.5118 0.7686 0.3839 +vn 0.5510 0.7439 0.3782 +vn 0.4628 0.4217 0.7798 +vn 0.4688 0.4069 0.7840 +vn -0.4628 0.4217 0.7798 +vn -0.5510 0.7439 0.3782 +vn -0.5118 0.7686 0.3839 +vn -0.4688 0.4069 0.7840 +vn 0.6225 0.6683 0.4072 +vn 0.5438 0.7126 0.4432 +vn 0.4234 0.3740 0.8251 +vn 0.4880 0.3713 0.7900 +vn -0.4234 0.3740 0.8251 +vn -0.5438 0.7126 0.4432 +vn -0.6225 0.6683 0.4072 +vn -0.4880 0.3713 0.7900 +vn 0.1427 0.8502 0.5068 +vn -0.3976 0.7662 0.5048 +vn -0.1175 0.3644 0.9238 +vn 0.1878 0.4009 0.8967 +vn 0.1175 0.3644 0.9238 +vn 0.3976 0.7662 0.5048 +vn -0.1427 0.8502 0.5068 +vn -0.1878 0.4009 0.8967 +vn -0.7677 0.4928 0.4097 +vn -0.8422 0.4179 0.3407 +vn -0.5150 0.2551 0.8184 +vn -0.3953 0.2739 0.8768 +vn 0.5150 0.2551 0.8184 +vn 0.8422 0.4179 0.3407 +vn 0.7677 0.4928 0.4097 +vn 0.3953 0.2739 0.8768 +vn -0.7543 0.5615 0.3403 +vn -0.3883 0.8222 0.4162 +vn -0.3145 0.4157 0.8534 +vn -0.5073 0.3177 0.8011 +vn 0.3145 0.4157 0.8534 +vn 0.3883 0.8222 0.4162 +vn 0.7543 0.5615 0.3403 +vn 0.5073 0.3177 0.8011 +vn 0.4513 -0.3587 0.8171 +vn 0.4014 -0.3659 0.8397 +vn 0.3053 -0.2281 0.9245 +vn 0.2972 -0.2387 0.9245 +vn -0.3053 -0.2281 0.9245 +vn -0.4014 -0.3659 0.8397 +vn -0.4513 -0.3587 0.8171 +vn -0.2972 -0.2387 0.9245 +vn 0.2871 -0.3945 0.8729 +vn 0.1555 -0.4262 0.8911 +vn 0.1692 -0.2712 0.9475 +vn 0.2389 -0.2508 0.9381 +vn -0.1692 -0.2712 0.9475 +vn -0.1555 -0.4262 0.8911 +vn -0.2871 -0.3945 0.8729 +vn -0.2389 -0.2508 0.9381 +vn 0.0208 -0.4510 0.8923 +vn 0.0869 -0.3102 0.9467 +vn 0.1083 -0.2879 0.9515 +vn 0.0379 -0.4411 0.8967 +vn -0.1083 -0.2879 0.9515 +vn -0.0869 -0.3102 0.9467 +vn -0.0208 -0.4510 0.8923 +vn -0.0379 -0.4411 0.8967 +vn -0.0053 -0.5709 0.8210 +vn 0.0941 -0.4058 0.9091 +vn 0.0853 -0.3560 0.9306 +vn 0.0342 -0.5096 0.8597 +vn -0.0853 -0.3560 0.9306 +vn -0.0941 -0.4058 0.9091 +vn 0.0053 -0.5709 0.8210 +vn -0.0342 -0.5096 0.8597 +vn 0.0967 -0.3017 0.9485 +vn 0.2907 -0.4003 0.8691 +vn 0.1877 -0.4405 0.8779 +vn 0.0029 -0.4905 0.8714 +vn -0.1877 -0.4405 0.8779 +vn -0.2907 -0.4003 0.8691 +vn -0.0967 -0.3017 0.9485 +vn -0.0029 -0.4905 0.8714 +vn 0.3645 -0.1702 0.9155 +vn 0.4821 -0.2710 0.8332 +vn 0.3780 -0.2958 0.8773 +vn 0.2342 -0.1821 0.9550 +vn -0.3780 -0.2958 0.8773 +vn -0.4821 -0.2710 0.8332 +vn -0.3645 -0.1702 0.9155 +vn -0.2342 -0.1821 0.9550 +vn 0.4084 -0.2560 0.8761 +vn 0.4697 -0.3069 0.8278 +vn 0.5088 -0.2748 0.8159 +vn 0.4167 -0.2150 0.8832 +vn -0.5088 -0.2748 0.8159 +vn -0.4697 -0.3069 0.8278 +vn -0.4084 -0.2560 0.8761 +vn -0.4167 -0.2150 0.8832 +vn 0.3237 -0.3313 0.8863 +vn 0.3712 -0.4418 0.8167 +vn 0.4106 -0.4069 0.8160 +vn 0.3841 -0.3255 0.8640 +vn -0.4106 -0.4069 0.8160 +vn -0.3712 -0.4418 0.8167 +vn -0.3237 -0.3313 0.8863 +vn -0.3841 -0.3255 0.8640 +vn 0.2773 0.0217 0.9605 +vn 0.3758 -0.1066 0.9205 +vn 0.3752 -0.3377 0.8632 +vn 0.3038 -0.1254 0.9444 +vn -0.3752 -0.3377 0.8632 +vn -0.3758 -0.1066 0.9205 +vn -0.2773 0.0217 0.9605 +vn -0.3038 -0.1254 0.9444 +vn 0.0730 0.0954 0.9928 +vn -0.0891 0.0895 0.9920 +vn -0.1548 0.1570 0.9754 +vn -0.0195 0.1299 0.9913 +vn 0.1548 0.1570 0.9754 +vn 0.0891 0.0895 0.9920 +vn -0.0730 0.0954 0.9928 +vn 0.0195 0.1299 0.9913 +vn 0.4037 -0.3369 0.8506 +vn 0.2042 -0.2888 0.9354 +vn 0.1507 -0.2779 0.9487 +vn 0.3030 -0.2626 0.9161 +vn -0.1507 -0.2779 0.9487 +vn -0.2042 -0.2888 0.9354 +vn -0.4037 -0.3369 0.8506 +vn -0.3030 -0.2626 0.9161 +vn 0.1957 -0.1996 0.9601 +vn 0.1170 -0.2806 0.9527 +vn 0.0657 -0.2660 0.9617 +vn 0.0804 -0.1875 0.9790 +vn -0.0657 -0.2660 0.9617 +vn -0.1170 -0.2806 0.9527 +vn -0.1957 -0.1996 0.9601 +vn -0.0804 -0.1875 0.9790 +vn -0.0210 -0.0864 0.9960 +vn -0.0535 -0.0981 0.9937 +vn -0.0077 -0.1827 0.9831 +vn 0.0243 -0.2264 0.9737 +vn 0.0077 -0.1827 0.9831 +vn 0.0535 -0.0981 0.9937 +vn 0.0210 -0.0864 0.9960 +vn -0.0243 -0.2264 0.9737 +vn 0.0882 -0.6473 0.7571 +vn 0.0268 -0.6653 0.7461 +vn 0.0468 -0.7500 0.6598 +vn 0.1148 -0.7353 0.6679 +vn -0.0468 -0.7500 0.6598 +vn -0.0268 -0.6653 0.7461 +vn -0.0882 -0.6473 0.7571 +vn -0.1148 -0.7353 0.6679 +vn 0.2442 -0.4371 0.8656 +vn 0.1519 -0.5765 0.8028 +vn 0.1717 -0.6888 0.7044 +vn 0.2892 -0.5401 0.7904 +vn -0.1717 -0.6888 0.7044 +vn -0.1519 -0.5765 0.8028 +vn -0.2442 -0.4371 0.8656 +vn -0.2892 -0.5401 0.7904 +vn 0.3063 -0.1983 0.9311 +vn 0.3152 -0.2848 0.9053 +vn 0.3730 -0.3737 0.8493 +vn 0.3970 -0.2731 0.8762 +vn -0.3730 -0.3737 0.8493 +vn -0.3152 -0.2848 0.9053 +vn -0.3063 -0.1983 0.9311 +vn -0.3970 -0.2731 0.8762 +vn 0.4643 0.0168 0.8855 +vn 0.2465 -0.0215 0.9689 +vn 0.2582 -0.0387 0.9653 +vn 0.4618 -0.0107 0.8869 +vn -0.2582 -0.0387 0.9653 +vn -0.2465 -0.0215 0.9689 +vn -0.4643 0.0168 0.8855 +vn -0.4618 -0.0107 0.8869 +vn 0.2860 -0.1432 0.9475 +vn 0.4332 -0.1748 0.8842 +vn 0.4652 -0.0608 0.8831 +vn 0.2759 -0.0656 0.9589 +vn -0.4652 -0.0608 0.8831 +vn -0.4332 -0.1748 0.8842 +vn -0.2860 -0.1432 0.9475 +vn -0.2759 -0.0656 0.9589 +vn 0.1046 -0.0387 0.9938 +vn 0.0063 -0.0386 0.9992 +vn -0.0009 0.0123 0.9999 +vn 0.0991 0.0114 0.9950 +vn 0.0009 0.0123 0.9999 +vn -0.0063 -0.0386 0.9992 +vn -0.1046 -0.0387 0.9938 +vn -0.0991 0.0114 0.9950 +vn 0.0992 -0.0540 0.9936 +vn 0.1006 -0.0381 0.9942 +vn 0.0000 -0.0462 0.9989 +vn -0.0006 -0.0602 0.9982 +vn -0.1006 -0.0381 0.9942 +vn -0.0992 -0.0540 0.9936 +vn 0.0006 -0.0602 0.9982 +vn 0.0057 -0.0606 0.9981 +vn 0.1152 -0.0604 0.9915 +vn 0.1106 -0.0465 0.9928 +vn 0.0016 -0.0360 0.9994 +vn -0.1106 -0.0465 0.9928 +vn -0.1152 -0.0604 0.9915 +vn -0.0057 -0.0606 0.9981 +vn -0.0016 -0.0360 0.9994 +vn 0.9181 -0.3140 0.2419 +vn 0.9298 -0.3663 0.0365 +vn 0.6495 -0.7310 0.2091 +vn 0.6386 -0.5515 0.5367 +vn -0.6495 -0.7310 0.2091 +vn -0.9298 -0.3663 0.0365 +vn -0.9181 -0.3140 0.2419 +vn -0.6386 -0.5515 0.5367 +vn 0.8574 0.5147 -0.0009 +vn 0.8786 0.4623 -0.1194 +vn 0.9952 0.0944 -0.0247 +vn 0.9890 0.1168 0.0907 +vn -0.9952 0.0944 -0.0247 +vn -0.8786 0.4623 -0.1194 +vn -0.8574 0.5147 -0.0009 +vn -0.9890 0.1168 0.0907 +vn -0.1074 0.7962 0.5954 +vn -0.1392 0.9876 -0.0731 +vn 0.3922 0.8867 -0.2450 +vn 0.3756 0.8780 0.2967 +vn -0.3922 0.8867 -0.2450 +vn 0.1392 0.9876 -0.0731 +vn 0.1074 0.7962 0.5954 +vn -0.3756 0.8780 0.2967 +vn -0.0108 0.7592 0.6508 +vn -0.7251 0.6838 0.0816 +vn -0.6736 0.6928 0.2575 +vn -0.5064 0.3843 0.7719 +vn 0.6736 0.6928 0.2575 +vn 0.7251 0.6838 0.0816 +vn 0.0108 0.7592 0.6508 +vn 0.5064 0.3843 0.7719 +vn 0.1232 -0.5545 0.8230 +vn 0.3364 -0.5638 0.7543 +vn 0.4669 -0.8186 0.3345 +vn 0.2183 -0.8974 0.3834 +vn -0.4669 -0.8186 0.3345 +vn -0.3364 -0.5638 0.7543 +vn -0.1232 -0.5545 0.8230 +vn -0.2183 -0.8974 0.3834 +vn 0.1820 -0.7319 0.6567 +vn 0.3599 -0.6937 0.6240 +vn 0.2443 -0.5823 0.7754 +vn 0.1174 -0.5306 0.8395 +vn -0.2443 -0.5823 0.7754 +vn -0.3599 -0.6937 0.6240 +vn -0.1820 -0.7319 0.6567 +vn -0.1174 -0.5306 0.8395 +vn -0.5357 0.7829 0.3162 +vn -0.2783 0.5637 0.7777 +vn -0.3046 0.5671 0.7652 +vn -0.5652 0.7127 0.4155 +vn 0.3046 0.5671 0.7652 +vn 0.2783 0.5637 0.7777 +vn 0.5357 0.7829 0.3162 +vn 0.5652 0.7127 0.4155 +vn -0.1157 0.9130 0.3912 +vn -0.0573 0.6306 0.7740 +vn 0.2624 0.5592 0.7864 +vn 0.4019 0.8455 0.3517 +vn -0.2624 0.5592 0.7864 +vn 0.0573 0.6306 0.7740 +vn 0.1157 0.9130 0.3912 +vn -0.4019 0.8455 0.3517 +vn 0.8110 0.4558 0.3668 +vn 0.4776 0.3746 0.7947 +vn 0.5212 0.1040 0.8471 +vn 0.9205 0.1167 0.3730 +vn -0.5212 0.1040 0.8471 +vn -0.4776 0.3746 0.7947 +vn -0.8110 0.4558 0.3668 +vn -0.9205 0.1167 0.3730 +vn 0.8092 -0.4216 0.4092 +vn 0.4019 -0.3967 0.8253 +vn 0.2733 -0.6372 0.7206 +vn 0.4566 -0.7153 0.5290 +vn -0.2733 -0.6372 0.7206 +vn -0.4019 -0.3967 0.8253 +vn -0.8092 -0.4216 0.4092 +vn -0.4566 -0.7153 0.5290 +vn -0.0039 0.1724 0.9850 +vn 0.1180 0.0811 0.9897 +vn 0.1769 0.3231 0.9297 +vn -0.0405 0.3806 0.9239 +vn -0.1769 0.3231 0.9297 +vn -0.1180 0.0811 0.9897 +vn 0.0039 0.1724 0.9850 +vn 0.0405 0.3806 0.9239 +vn -0.0169 -0.1911 0.9814 +vn 0.0452 -0.4015 0.9148 +vn 0.1316 -0.5000 0.8560 +vn 0.0762 -0.2808 0.9567 +vn -0.1316 -0.5000 0.8560 +vn -0.0452 -0.4015 0.9148 +vn 0.0169 -0.1911 0.9814 +vn -0.0762 -0.2808 0.9567 +vn -0.1258 -0.0262 0.9917 +vn -0.3067 -0.2224 0.9254 +vn -0.2398 -0.0343 0.9702 +vn -0.2423 0.0220 0.9700 +vn 0.2398 -0.0343 0.9702 +vn 0.3067 -0.2224 0.9254 +vn 0.1258 -0.0262 0.9917 +vn 0.2423 0.0220 0.9700 +vn -0.2695 -0.2832 0.9204 +vn 0.4785 -0.1181 0.8701 +vn 0.7159 -0.1356 0.6849 +vn 0.2945 -0.2960 0.9086 +vn -0.7159 -0.1356 0.6849 +vn -0.4785 -0.1181 0.8701 +vn 0.2695 -0.2832 0.9204 +vn -0.2945 -0.2960 0.9086 +vn 0.5980 -0.1937 0.7777 +vn 0.4002 -0.1785 0.8989 +vn 0.6366 0.0239 0.7708 +vn 0.7142 -0.0813 0.6952 +vn -0.6366 0.0239 0.7708 +vn -0.4002 -0.1785 0.8989 +vn -0.5980 -0.1937 0.7777 +vn -0.7142 -0.0813 0.6952 +vn 0.2856 -0.0108 0.9583 +vn 0.2432 0.0154 0.9699 +vn 0.4897 0.0613 0.8698 +vn 0.5478 0.0816 0.8326 +vn -0.4897 0.0613 0.8698 +vn -0.2432 0.0154 0.9699 +vn -0.2856 -0.0108 0.9583 +vn -0.5478 0.0816 0.8326 +vn 0.8932 0.2569 0.3691 +vn 0.8819 0.3300 0.3365 +vn 0.7877 0.2287 0.5720 +vn 0.7460 0.1691 0.6441 +vn -0.7877 0.2287 0.5720 +vn -0.8819 0.3300 0.3365 +vn -0.8932 0.2569 0.3691 +vn -0.7460 0.1691 0.6441 +vn 0.9006 0.2989 0.3155 +vn 0.9190 0.2536 0.3017 +vn 0.8801 0.1254 0.4579 +vn 0.8359 0.2064 0.5087 +vn -0.8801 0.1254 0.4579 +vn -0.9190 0.2536 0.3017 +vn -0.9006 0.2989 0.3155 +vn -0.8359 0.2064 0.5087 +vn 0.8200 -0.4526 0.3504 +vn 0.8136 -0.2784 0.5104 +vn 0.9110 0.0767 0.4053 +vn 0.9332 0.2382 0.2690 +vn -0.9110 0.0767 0.4053 +vn -0.8136 -0.2784 0.5104 +vn -0.8200 -0.4526 0.3504 +vn -0.9332 0.2382 0.2690 +vn 0.0798 -0.2245 0.9712 +vn 0.0520 -0.3423 0.9381 +vn 0.1527 -0.8959 0.4171 +vn 0.0593 -0.8662 0.4962 +vn -0.1527 -0.8959 0.4171 +vn -0.0520 -0.3423 0.9381 +vn -0.0798 -0.2245 0.9712 +vn -0.0593 -0.8662 0.4962 +vn 0.2086 -0.2434 0.9472 +vn 0.1842 -0.1704 0.9680 +vn -0.6732 -0.4369 0.5966 +vn -0.7792 -0.0464 0.6250 +vn 0.6732 -0.4369 0.5966 +vn -0.1842 -0.1704 0.9680 +vn -0.2086 -0.2434 0.9472 +vn 0.7792 -0.0464 0.6250 +vn 0.0328 -0.4066 0.9130 +vn 0.1141 -0.3580 0.9267 +vn -0.6856 0.1952 0.7014 +vn -0.5422 0.4296 0.7222 +vn 0.6856 0.1952 0.7014 +vn -0.1141 -0.3580 0.9267 +vn -0.0328 -0.4066 0.9130 +vn 0.5422 0.4296 0.7222 +vn -0.0048 -0.4085 0.9127 +vn 0.0028 -0.4061 0.9138 +vn -0.3110 0.6339 0.7081 +vn -0.0698 0.7044 0.7064 +vn 0.3110 0.6339 0.7081 +vn -0.0028 -0.4061 0.9138 +vn 0.0048 -0.4085 0.9127 +vn 0.0698 0.7044 0.7064 +vn -0.0780 0.9331 0.3511 +vn -0.3459 0.8768 0.3340 +vn -0.2793 0.7214 0.6337 +vn -0.0703 0.7184 0.6921 +vn 0.2793 0.7214 0.6337 +vn 0.3459 0.8768 0.3340 +vn 0.0780 0.9331 0.3511 +vn 0.0703 0.7184 0.6921 +vn -0.6231 0.7311 0.2777 +vn -0.8422 0.5039 0.1918 +vn -0.8465 0.4826 0.2250 +vn -0.5486 0.7208 0.4238 +vn 0.8465 0.4826 0.2250 +vn 0.8422 0.5039 0.1918 +vn 0.6231 0.7311 0.2777 +vn 0.5486 0.7208 0.4238 +vn -0.9846 0.1370 0.1084 +vn -0.8783 -0.4631 0.1187 +vn -0.7484 -0.5799 0.3217 +vn -0.9709 0.1792 0.1589 +vn 0.7484 -0.5799 0.3217 +vn 0.8783 -0.4631 0.1187 +vn 0.9846 0.1370 0.1084 +vn 0.9709 0.1792 0.1589 +vn 0.0703 -0.9817 0.1769 +vn 0.1584 -0.9714 0.1770 +vn 0.1269 -0.8843 0.4493 +vn 0.0888 -0.8956 0.4360 +vn -0.1269 -0.8843 0.4493 +vn -0.1584 -0.9714 0.1770 +vn -0.0703 -0.9817 0.1769 +vn -0.0888 -0.8956 0.4360 +vn 0.0412 -0.4702 0.8816 +vn -0.0091 -0.0868 0.9962 +vn -0.0145 -0.0876 0.9961 +vn 0.0673 -0.4848 0.8720 +vn 0.0145 -0.0876 0.9961 +vn 0.0091 -0.0868 0.9962 +vn -0.0412 -0.4702 0.8816 +vn -0.0673 -0.4848 0.8720 +vn -0.0608 -0.4990 0.8645 +vn -0.0210 -0.0299 0.9993 +vn -0.8477 0.2291 0.4784 +vn 0.8477 0.2291 0.4784 +vn 0.0210 -0.0299 0.9993 +vn 0.0608 -0.4990 0.8645 +vn -0.2258 -0.1698 0.9593 +vn -0.2384 -0.1937 0.9517 +vn -0.3201 -0.2054 0.9249 +vn -0.2647 -0.1414 0.9539 +vn 0.3201 -0.2054 0.9249 +vn 0.2384 -0.1937 0.9517 +vn 0.2258 -0.1698 0.9593 +vn 0.2647 -0.1414 0.9539 +vn -0.0559 -0.0784 0.9954 +vn -0.1589 -0.1119 0.9809 +vn -0.2196 -0.0592 0.9738 +vn -0.1602 -0.0133 0.9870 +vn 0.2196 -0.0592 0.9738 +vn 0.1589 -0.1119 0.9809 +vn 0.0559 -0.0784 0.9954 +vn 0.1602 -0.0133 0.9870 +vn 0.1080 -0.0820 0.9908 +vn 0.0337 -0.0812 0.9961 +vn -0.0985 0.0004 0.9951 +vn -0.0416 0.0293 0.9987 +vn 0.0985 0.0004 0.9951 +vn -0.0337 -0.0812 0.9961 +vn -0.1080 -0.0820 0.9908 +vn 0.0416 0.0293 0.9987 +vn -0.2294 -0.1590 0.9602 +vn -0.0707 -0.2584 0.9634 +vn -0.3075 -0.5433 0.7812 +vn -0.4120 -0.2694 0.8704 +vn 0.3075 -0.5433 0.7812 +vn 0.0707 -0.2584 0.9634 +vn 0.2294 -0.1590 0.9602 +vn 0.4120 -0.2694 0.8704 +vn 0.0675 -0.3683 0.9272 +vn 0.1214 -0.4982 0.8586 +vn 0.0574 -0.6162 0.7855 +vn -0.1165 -0.6608 0.7415 +vn -0.0574 -0.6162 0.7855 +vn -0.1214 -0.4982 0.8586 +vn -0.0675 -0.3683 0.9272 +vn 0.1165 -0.6608 0.7415 +vn 0.2874 -0.5650 0.7734 +vn 0.4513 -0.4912 0.7450 +vn 0.4493 -0.4744 0.7570 +vn 0.2727 -0.5515 0.7883 +vn -0.4493 -0.4744 0.7570 +vn -0.4513 -0.4912 0.7450 +vn -0.2874 -0.5650 0.7734 +vn -0.2727 -0.5515 0.7883 +vn 0.5072 -0.3954 0.7658 +vn 0.5127 -0.2828 0.8107 +vn 0.4975 -0.2184 0.8395 +vn 0.5175 -0.3628 0.7750 +vn -0.4975 -0.2184 0.8395 +vn -0.5127 -0.2828 0.8107 +vn -0.5072 -0.3954 0.7658 +vn -0.5175 -0.3628 0.7750 +vn 0.4826 -0.1550 0.8620 +vn 0.4265 -0.0825 0.9007 +vn 0.4601 -0.0647 0.8855 +vn 0.4597 -0.1218 0.8797 +vn -0.4601 -0.0647 0.8855 +vn -0.4265 -0.0825 0.9007 +vn -0.4826 -0.1550 0.8620 +vn -0.4597 -0.1218 0.8797 +vn 0.3552 -0.0597 0.9329 +vn 0.3088 -0.0828 0.9475 +vn 0.4678 0.0809 0.8801 +vn 0.4599 0.0091 0.8879 +vn -0.4678 0.0809 0.8801 +vn -0.3088 -0.0828 0.9475 +vn -0.3552 -0.0597 0.9329 +vn -0.4599 0.0091 0.8879 +vn 0.3479 -0.0238 0.9372 +vn 0.3614 0.1372 0.9223 +vn 0.4598 0.4842 0.7445 +vn 0.5038 0.2537 0.8257 +vn -0.4598 0.4842 0.7445 +vn -0.3614 0.1372 0.9223 +vn -0.3479 -0.0238 0.9372 +vn -0.5038 0.2537 0.8257 +vn 0.2612 0.1393 0.9552 +vn 0.1375 -0.0082 0.9905 +vn 0.1358 0.4258 0.8946 +vn 0.3136 0.5519 0.7727 +vn -0.1358 0.4258 0.8946 +vn -0.1375 -0.0082 0.9905 +vn -0.2612 0.1393 0.9552 +vn -0.3136 0.5519 0.7727 +vn 0.1749 -0.0932 0.9802 +vn 0.2118 -0.0874 0.9734 +vn 0.1272 0.2678 0.9550 +vn 0.1533 0.2998 0.9416 +vn -0.1272 0.2678 0.9550 +vn -0.2118 -0.0874 0.9734 +vn -0.1749 -0.0932 0.9802 +vn -0.1533 0.2998 0.9416 +vn 0.2023 -0.0731 0.9766 +vn 0.1716 -0.0703 0.9827 +vn 0.0039 0.1042 0.9946 +vn 0.0433 0.1989 0.9791 +vn -0.0039 0.1042 0.9946 +vn -0.1716 -0.0703 0.9827 +vn -0.2023 -0.0731 0.9766 +vn -0.0433 0.1989 0.9791 +vn 0.1764 -0.1175 0.9773 +vn 0.2503 -0.2080 0.9456 +vn 0.3984 -0.4479 0.8004 +vn 0.2580 -0.3856 0.8858 +vn -0.3984 -0.4479 0.8004 +vn -0.2503 -0.2080 0.9456 +vn -0.1764 -0.1175 0.9773 +vn -0.2580 -0.3856 0.8858 +vn 0.1419 -0.0502 0.9886 +vn 0.2098 -0.0241 0.9774 +vn 0.2619 -0.2812 0.9232 +vn 0.1641 -0.3470 0.9234 +vn -0.2619 -0.2812 0.9232 +vn -0.2098 -0.0241 0.9774 +vn -0.1419 -0.0502 0.9886 +vn -0.1641 -0.3470 0.9234 +vn 0.0634 -0.1816 0.9813 +vn -0.0526 -0.1007 0.9935 +vn -0.0843 -0.5566 0.8265 +vn -0.1348 -0.7754 0.6169 +vn 0.0843 -0.5566 0.8265 +vn 0.0526 -0.1007 0.9935 +vn -0.0634 -0.1816 0.9813 +vn 0.1348 -0.7754 0.6169 +vn 0.2005 -0.5067 0.8385 +vn 0.2383 -0.4064 0.8821 +vn -0.0812 -0.8427 0.5322 +vn -0.0640 -0.7747 0.6291 +vn 0.0812 -0.8427 0.5322 +vn -0.2383 -0.4064 0.8821 +vn -0.2005 -0.5067 0.8385 +vn 0.0640 -0.7747 0.6291 +vn -0.0332 -0.1172 0.9925 +vn 0.0578 -0.3461 0.9364 +vn -0.2133 -0.5362 0.8167 +vn -0.3840 -0.1907 0.9034 +vn 0.2133 -0.5362 0.8167 +vn -0.0578 -0.3461 0.9364 +vn 0.0332 -0.1172 0.9925 +vn 0.3840 -0.1907 0.9034 +vn 0.0282 0.0488 0.9984 +vn -0.0202 -0.0708 0.9973 +vn -0.3871 -0.0442 0.9210 +vn -0.2847 0.1800 0.9416 +vn 0.3871 -0.0442 0.9210 +vn 0.0202 -0.0708 0.9973 +vn -0.0282 0.0488 0.9984 +vn 0.2847 0.1800 0.9416 +vn 0.1824 0.1695 0.9685 +vn 0.1217 0.1677 0.9783 +vn -0.1675 0.3787 0.9103 +vn -0.1537 0.5074 0.8479 +vn 0.1675 0.3787 0.9103 +vn -0.1217 0.1677 0.9783 +vn -0.1824 0.1695 0.9685 +vn 0.1537 0.5074 0.8479 +vn 0.2256 0.0966 0.9694 +vn 0.2015 0.1231 0.9717 +vn -0.0956 0.6021 0.7927 +vn 0.1063 0.6268 0.7719 +vn 0.0956 0.6021 0.7927 +vn -0.2015 0.1231 0.9717 +vn -0.2256 0.0966 0.9694 +vn -0.1063 0.6268 0.7719 +vn 0.2622 0.1395 0.9549 +vn 0.2597 0.0956 0.9610 +vn 0.2912 0.6006 0.7447 +vn 0.3719 0.6010 0.7074 +vn -0.2912 0.6006 0.7447 +vn -0.2597 0.0956 0.9610 +vn -0.2622 0.1395 0.9549 +vn -0.3719 0.6010 0.7074 +vn 0.3148 0.2739 0.9088 +vn 0.2388 0.2541 0.9372 +vn 0.4401 0.5783 0.6869 +vn 0.5832 0.4491 0.6769 +vn -0.4401 0.5783 0.6869 +vn -0.2388 0.2541 0.9372 +vn -0.3148 0.2739 0.9088 +vn -0.5832 0.4491 0.6769 +vn 0.3567 -0.2066 0.9111 +vn 0.4345 -0.1666 0.8851 +vn 0.7213 -0.3143 0.6171 +vn 0.5757 -0.4001 0.7131 +vn -0.7213 -0.3143 0.6171 +vn -0.4345 -0.1666 0.8851 +vn -0.3567 -0.2066 0.9111 +vn -0.5757 -0.4001 0.7131 +vn 0.4936 -0.1029 0.8636 +vn 0.5275 -0.0396 0.8487 +vn 0.8125 -0.0300 0.5822 +vn 0.8067 -0.1577 0.5695 +vn -0.8125 -0.0300 0.5822 +vn -0.5275 -0.0396 0.8487 +vn -0.4936 -0.1029 0.8636 +vn -0.8067 -0.1577 0.5695 +vn 0.5351 0.0166 0.8446 +vn 0.4751 0.1342 0.8696 +vn 0.7355 0.2376 0.6345 +vn 0.7983 0.0611 0.5992 +vn -0.7355 0.2376 0.6345 +vn -0.4751 0.1342 0.8696 +vn -0.5351 0.0166 0.8446 +vn -0.7983 0.0611 0.5992 +vn -0.3564 0.9338 -0.0305 +vn -0.7591 0.6384 -0.1271 +vn -0.5797 0.7783 -0.2414 +vn -0.2594 0.9642 0.0554 +vn 0.5797 0.7783 -0.2414 +vn 0.7591 0.6384 -0.1271 +vn 0.3564 0.9338 -0.0305 +vn 0.2594 0.9642 0.0554 +vn -0.8771 0.4457 -0.1790 +vn -0.8328 0.5224 -0.1830 +vn -0.6598 0.4172 -0.6250 +vn -0.7028 0.4505 -0.5506 +vn 0.6598 0.4172 -0.6250 +vn 0.8328 0.5224 -0.1830 +vn 0.8771 0.4457 -0.1790 +vn 0.7028 0.4505 -0.5506 +vn -0.5042 0.8445 -0.1802 +vn 0.0443 0.9871 -0.1536 +vn -0.0365 0.7633 -0.6450 +vn -0.4474 0.6254 -0.6393 +vn 0.0365 0.7633 -0.6450 +vn -0.0443 0.9871 -0.1536 +vn 0.5042 0.8445 -0.1802 +vn 0.4474 0.6254 -0.6393 +vn 0.5129 0.8527 -0.0992 +vn 0.5986 0.7955 -0.0935 +vn 0.3523 0.7129 -0.6063 +vn 0.2944 0.7072 -0.6428 +vn -0.3523 0.7129 -0.6063 +vn -0.5986 0.7955 -0.0935 +vn -0.5129 0.8527 -0.0992 +vn -0.2944 0.7072 -0.6428 +vn 0.4899 0.8644 -0.1133 +vn 0.4236 0.8993 -0.1091 +vn 0.3649 0.8952 -0.2560 +vn 0.2923 0.8660 -0.4058 +vn -0.3649 0.8952 -0.2560 +vn -0.4236 0.8993 -0.1091 +vn -0.4899 0.8644 -0.1133 +vn -0.2923 0.8660 -0.4058 +vn 0.3764 0.9214 -0.0963 +vn 0.7040 0.6980 -0.1314 +vn 0.6182 0.7171 -0.3220 +vn 0.3362 0.9097 -0.2437 +vn -0.6182 0.7171 -0.3220 +vn -0.7040 0.6980 -0.1314 +vn -0.3764 0.9214 -0.0963 +vn -0.3362 0.9097 -0.2437 +vn 0.9785 0.1332 -0.1572 +vn 0.9637 -0.2187 -0.1534 +vn 0.9565 -0.1523 -0.2490 +vn 0.9064 0.2479 -0.3419 +vn -0.9565 -0.1523 -0.2490 +vn -0.9637 -0.2187 -0.1534 +vn -0.9785 0.1332 -0.1572 +vn -0.9064 0.2479 -0.3419 +vn 0.7948 -0.5913 -0.1362 +vn 0.6242 -0.7712 -0.1248 +vn 0.6455 -0.7567 -0.1032 +vn 0.8063 -0.5677 -0.1663 +vn -0.6455 -0.7567 -0.1032 +vn -0.6242 -0.7712 -0.1248 +vn -0.7948 -0.5913 -0.1362 +vn -0.8063 -0.5677 -0.1663 +vn 0.5227 -0.8454 -0.1101 +vn 0.3980 -0.9141 -0.0778 +vn 0.3905 -0.9135 -0.1145 +vn 0.5293 -0.8441 -0.0856 +vn -0.3905 -0.9135 -0.1145 +vn -0.3980 -0.9141 -0.0778 +vn -0.5227 -0.8454 -0.1101 +vn -0.5293 -0.8441 -0.0856 +vn 0.1166 -0.3653 -0.9235 +vn 0.1076 -0.6595 -0.7439 +vn 0.3922 -0.6625 -0.6382 +vn 0.3326 -0.4061 -0.8512 +vn -0.3922 -0.6625 -0.6382 +vn -0.1076 -0.6595 -0.7439 +vn -0.1166 -0.3653 -0.9235 +vn -0.3326 -0.4061 -0.8512 +vn 0.1160 -0.1703 -0.9785 +vn 0.1322 -0.1441 -0.9807 +vn 0.2652 -0.1327 -0.9550 +vn 0.2000 -0.1204 -0.9724 +vn -0.2652 -0.1327 -0.9550 +vn -0.1322 -0.1441 -0.9807 +vn -0.1160 -0.1703 -0.9785 +vn -0.2000 -0.1204 -0.9724 +vn 0.0451 -0.6037 -0.7959 +vn 0.0837 -0.3802 -0.9211 +vn 0.1298 -0.3022 -0.9444 +vn 0.0547 -0.5316 -0.8452 +vn -0.1298 -0.3022 -0.9444 +vn -0.0837 -0.3802 -0.9211 +vn -0.0451 -0.6037 -0.7959 +vn -0.0547 -0.5316 -0.8452 +vn 0.1217 -0.9915 -0.0468 +vn 0.0585 -0.9983 -0.0057 +vn 0.0465 -0.8981 -0.4373 +vn 0.0769 -0.8687 -0.4894 +vn -0.0465 -0.8981 -0.4373 +vn -0.0585 -0.9983 -0.0057 +vn -0.1217 -0.9915 -0.0468 +vn -0.0769 -0.8687 -0.4894 +vn 0.3393 -0.9324 -0.1249 +vn 0.1387 -0.9870 -0.0813 +vn 0.0505 -0.8376 -0.5439 +vn 0.2706 -0.7206 -0.6383 +vn -0.0505 -0.8376 -0.5439 +vn -0.1387 -0.9870 -0.0813 +vn -0.3393 -0.9324 -0.1249 +vn -0.2706 -0.7206 -0.6383 +vn 0.9901 -0.0290 -0.1370 +vn 0.8533 -0.4971 -0.1573 +vn 0.6430 -0.3347 -0.6889 +vn 0.8299 0.0726 -0.5532 +vn -0.6430 -0.3347 -0.6889 +vn -0.8533 -0.4971 -0.1573 +vn -0.9901 -0.0290 -0.1370 +vn -0.8299 0.0726 -0.5532 +vn 0.9779 0.1391 -0.1563 +vn 0.9834 0.0973 -0.1531 +vn 0.8402 0.1390 -0.5241 +vn 0.8528 0.1497 -0.5003 +vn -0.8402 0.1390 -0.5241 +vn -0.9834 0.0973 -0.1531 +vn -0.9779 0.1391 -0.1563 +vn -0.8528 0.1497 -0.5003 +vn 0.3822 0.0370 -0.9233 +vn 0.1532 -0.0625 -0.9862 +vn 0.2688 -0.0768 -0.9601 +vn 0.4965 0.0463 -0.8668 +vn -0.2688 -0.0768 -0.9601 +vn -0.1532 -0.0625 -0.9862 +vn -0.3822 0.0370 -0.9233 +vn -0.4965 0.0463 -0.8668 +vn 0.2653 -0.0694 -0.9617 +vn 0.2074 -0.3516 -0.9129 +vn -0.0068 -0.4342 -0.9008 +vn 0.0694 -0.2037 -0.9766 +vn 0.0068 -0.4342 -0.9008 +vn -0.2074 -0.3516 -0.9129 +vn -0.2653 -0.0694 -0.9617 +vn -0.0694 -0.2037 -0.9766 +vn 0.8652 -0.0990 -0.4915 +vn 0.6745 -0.0524 -0.7364 +vn 0.5096 -0.3034 -0.8051 +vn 0.7347 -0.4575 -0.5009 +vn -0.5096 -0.3034 -0.8051 +vn -0.6745 -0.0524 -0.7364 +vn -0.8652 -0.0990 -0.4915 +vn -0.7347 -0.4575 -0.5009 +vn 0.9760 0.1734 -0.1315 +vn 0.9766 0.1421 -0.1614 +vn 0.8686 0.1168 -0.4815 +vn 0.9026 0.1251 -0.4119 +vn -0.8686 0.1168 -0.4815 +vn -0.9766 0.1421 -0.1614 +vn -0.9760 0.1734 -0.1315 +vn -0.9026 0.1251 -0.4119 +vn 0.9500 0.3122 -0.0030 +vn 0.9982 -0.0173 0.0582 +vn 0.9481 0.0117 0.3177 +vn 0.9543 0.2977 0.0279 +vn -0.9481 0.0117 0.3177 +vn -0.9982 -0.0173 0.0582 +vn -0.9500 0.3122 -0.0030 +vn -0.9543 0.2977 0.0279 +vn 0.9603 0.2707 -0.0676 +vn 0.9275 0.2098 -0.3095 +vn 0.9821 0.0949 -0.1626 +vn 0.9388 0.3437 -0.0214 +vn -0.9821 0.0949 -0.1626 +vn -0.9275 0.2098 -0.3095 +vn -0.9603 0.2707 -0.0676 +vn -0.9388 0.3437 -0.0214 +vn 0.8296 -0.5488 0.1030 +vn 0.9457 0.3168 0.0726 +vn 0.8760 0.0949 0.4729 +vn 0.7087 -0.6925 0.1349 +vn -0.8760 0.0949 0.4729 +vn -0.9457 0.3168 0.0726 +vn -0.8296 -0.5488 0.1030 +vn -0.7087 -0.6925 0.1349 +vn 0.3328 -0.9408 0.0643 +vn 0.3508 -0.9237 -0.1541 +vn 0.2658 -0.9516 -0.1540 +vn 0.2867 -0.9579 -0.0140 +vn -0.2658 -0.9516 -0.1540 +vn -0.3508 -0.9237 -0.1541 +vn -0.3328 -0.9408 0.0643 +vn -0.2867 -0.9579 -0.0140 +vn 0.2001 -0.3621 -0.9104 +vn 0.3877 -0.3624 -0.8475 +vn 0.3717 -0.6029 -0.7060 +vn 0.1837 -0.6210 -0.7620 +vn -0.3717 -0.6029 -0.7060 +vn -0.3877 -0.3624 -0.8475 +vn -0.2001 -0.3621 -0.9104 +vn -0.1837 -0.6210 -0.7620 +vn 0.1674 -0.7953 -0.5827 +vn 0.3752 -0.7647 -0.5239 +vn 0.3702 -0.8633 -0.3429 +vn 0.1532 -0.9078 -0.3904 +vn -0.3702 -0.8633 -0.3429 +vn -0.3752 -0.7647 -0.5239 +vn -0.1674 -0.7953 -0.5827 +vn -0.1532 -0.9078 -0.3904 +vn 0.1434 -0.9658 -0.2160 +vn 0.3709 -0.9131 -0.1693 +vn 0.4174 -0.9043 -0.0900 +vn 0.1491 -0.9771 -0.1519 +vn -0.4174 -0.9043 -0.0900 +vn -0.3709 -0.9131 -0.1693 +vn -0.1434 -0.9658 -0.2160 +vn -0.1491 -0.9771 -0.1519 +vn 0.1583 -0.9716 -0.1759 +vn 0.4540 -0.8829 -0.1201 +vn 0.4500 -0.8195 -0.3547 +vn 0.1403 -0.8925 -0.4286 +vn -0.4500 -0.8195 -0.3547 +vn -0.4540 -0.8829 -0.1201 +vn -0.1583 -0.9716 -0.1759 +vn -0.1403 -0.8925 -0.4286 +vn 0.9614 -0.0417 -0.2720 +vn 0.8401 -0.4844 -0.2441 +vn 0.7790 -0.6253 0.0474 +vn 0.9544 -0.2980 -0.0169 +vn -0.7790 -0.6253 0.0474 +vn -0.8401 -0.4844 -0.2441 +vn -0.9614 -0.0417 -0.2720 +vn -0.9544 -0.2980 -0.0169 +vn 0.8706 -0.4755 0.1265 +vn 0.7279 -0.6600 0.1863 +vn 0.7927 -0.5636 0.2325 +vn 0.9198 -0.3521 0.1734 +vn -0.7927 -0.5636 0.2325 +vn -0.7279 -0.6600 0.1863 +vn -0.8706 -0.4755 0.1265 +vn -0.9198 -0.3521 0.1734 +vn 0.1902 0.1157 -0.9749 +vn 0.3826 0.0540 -0.9223 +vn 0.3800 -0.2095 -0.9009 +vn 0.1936 -0.1523 -0.9692 +vn -0.3800 -0.2095 -0.9009 +vn -0.3826 0.0540 -0.9223 +vn -0.1902 0.1157 -0.9749 +vn -0.1936 -0.1523 -0.9692 +vn 0.0678 0.9096 0.4099 +vn 0.2460 0.8772 0.4124 +vn 0.2136 0.9693 0.1216 +vn 0.0558 0.9914 0.1182 +vn -0.2136 0.9693 0.1216 +vn -0.2460 0.8772 0.4124 +vn -0.0678 0.9096 0.4099 +vn -0.0558 0.9914 0.1182 +vn 0.0569 0.9940 -0.0937 +vn 0.2050 0.9744 -0.0926 +vn 0.2483 0.8867 -0.3900 +vn 0.0911 0.9275 -0.3625 +vn -0.2483 0.8867 -0.3900 +vn -0.2050 0.9744 -0.0926 +vn -0.0569 0.9940 -0.0937 +vn -0.0911 0.9275 -0.3625 +vn 0.1577 0.7390 -0.6550 +vn 0.3386 0.6702 -0.6605 +vn 0.3926 0.4285 -0.8138 +vn 0.1938 0.4878 -0.8512 +vn -0.3926 0.4285 -0.8138 +vn -0.3386 0.6702 -0.6605 +vn -0.1577 0.7390 -0.6550 +vn -0.1938 0.4878 -0.8512 +vn 0.3769 0.9123 -0.1600 +vn 0.6401 0.7324 -0.2320 +vn 0.6878 0.7206 0.0877 +vn 0.4445 0.8780 0.1777 +vn -0.6878 0.7206 0.0877 +vn -0.6401 0.7324 -0.2320 +vn -0.3769 0.9123 -0.1600 +vn -0.4445 0.8780 0.1777 +vn 0.4241 0.6987 0.5761 +vn 0.6499 0.5895 0.4797 +vn 0.6527 0.5727 0.4960 +vn 0.4826 0.6630 0.5723 +vn -0.6527 0.5727 0.4960 +vn -0.6499 0.5895 0.4797 +vn -0.4241 0.6987 0.5761 +vn -0.4826 0.6630 0.5723 +vn 0.6041 0.7367 0.3037 +vn 0.7488 0.6139 0.2500 +vn 0.8015 0.5968 0.0369 +vn 0.6547 0.7534 0.0612 +vn -0.8015 0.5968 0.0369 +vn -0.7488 0.6139 0.2500 +vn -0.6041 0.7367 0.3037 +vn -0.6547 0.7534 0.0612 +vn 0.6753 0.7277 -0.1198 +vn 0.8265 0.5523 -0.1089 +vn 0.8306 0.4446 -0.3354 +vn 0.6704 0.6235 -0.4022 +vn -0.8306 0.4446 -0.3354 +vn -0.8265 0.5523 -0.1089 +vn -0.6753 0.7277 -0.1198 +vn -0.6704 0.6235 -0.4022 +vn 0.7355 0.0900 -0.6715 +vn 0.6174 0.1265 -0.7764 +vn 0.6217 0.3786 -0.6856 +vn 0.8049 0.2659 -0.5305 +vn -0.6217 0.3786 -0.6856 +vn -0.6174 0.1265 -0.7764 +vn -0.7355 0.0900 -0.6715 +vn -0.8049 0.2659 -0.5305 +vn 0.4660 0.3523 -0.8117 +vn 0.4131 0.5939 -0.6904 +vn 0.5062 0.4910 -0.7090 +vn 0.5506 0.2356 -0.8009 +vn -0.5062 0.4910 -0.7090 +vn -0.4131 0.5939 -0.6904 +vn -0.4660 0.3523 -0.8117 +vn -0.5506 0.2356 -0.8009 +vn 0.4262 0.8052 -0.4124 +vn 0.4791 0.8726 -0.0948 +vn 0.6628 0.7417 -0.1022 +vn 0.5875 0.6976 -0.4100 +vn -0.6628 0.7417 -0.1022 +vn -0.4791 0.8726 -0.0948 +vn -0.4262 0.8052 -0.4124 +vn -0.5875 0.6976 -0.4100 +vn 0.5132 0.8522 0.1014 +vn 0.5589 0.7509 0.3519 +vn 0.7048 0.6492 0.2860 +vn 0.6854 0.7248 0.0699 +vn -0.7048 0.6492 0.2860 +vn -0.5589 0.7509 0.3519 +vn -0.5132 0.8522 0.1014 +vn -0.6854 0.7248 0.0699 +vn 0.5784 0.5616 0.5917 +vn 0.5439 0.5641 0.6212 +vn 0.6419 0.5601 0.5237 +vn 0.6900 0.5185 0.5049 +vn -0.6419 0.5601 0.5237 +vn -0.5439 0.5641 0.6212 +vn -0.5784 0.5616 0.5917 +vn -0.6900 0.5185 0.5049 +vn 0.1862 0.9392 -0.2884 +vn 0.3690 0.9136 -0.1708 +vn 0.5027 0.8432 0.1906 +vn 0.3772 0.8780 0.2945 +vn -0.5027 0.8432 0.1906 +vn -0.3690 0.9136 -0.1708 +vn -0.1862 0.9392 -0.2884 +vn -0.3772 0.8780 0.2945 +vn 0.1398 0.6437 0.7524 +vn 0.3113 0.6008 0.7362 +vn 0.2926 0.6596 0.6923 +vn 0.0963 0.7117 0.6959 +vn -0.2926 0.6596 0.6923 +vn -0.3113 0.6008 0.7362 +vn -0.1398 0.6437 0.7524 +vn -0.0963 0.7117 0.6959 +vn -0.3143 0.3098 -0.8974 +vn -0.3627 0.3016 -0.8818 +vn -0.0528 0.3888 -0.9198 +vn -0.1143 0.3499 -0.9298 +vn 0.0528 0.3888 -0.9198 +vn 0.3627 0.3016 -0.8818 +vn 0.3143 0.3098 -0.8974 +vn 0.1143 0.3499 -0.9298 +vn -0.1211 0.9543 0.2731 +vn -0.1029 0.9514 -0.2902 +vn 0.2076 0.8342 0.5109 +vn 0.1206 0.7069 0.6969 +vn -0.2076 0.8342 0.5109 +vn 0.1029 0.9514 -0.2902 +vn 0.1211 0.9543 0.2731 +vn -0.1206 0.7069 0.6969 +vn -0.0947 0.5719 0.8148 +vn -0.2268 0.6795 0.6977 +vn -0.0201 0.4661 0.8845 +vn 0.0201 0.4661 0.8845 +vn 0.2268 0.6795 0.6977 +vn 0.0946 0.5719 0.8148 +vn 0.9341 0.3265 -0.1448 +vn 0.9920 -0.1200 0.0389 +vn 0.9899 0.0001 0.1418 +vn 0.9175 0.3893 0.0816 +vn -0.9899 0.0001 0.1418 +vn -0.9920 -0.1200 0.0389 +vn -0.9341 0.3265 -0.1448 +vn -0.9175 0.3893 0.0816 +vn 0.9822 0.0351 0.1847 +vn 0.9887 0.0423 0.1439 +vn 0.9233 0.2360 0.3032 +vn 0.9173 0.2553 0.3055 +vn -0.9233 0.2360 0.3032 +vn -0.9887 0.0423 0.1439 +vn -0.9822 0.0351 0.1847 +vn -0.9173 0.2553 0.3055 +vn 0.9933 0.1151 0.0108 +vn 0.9809 0.1735 -0.0877 +vn 0.9626 0.2675 -0.0418 +vn 0.9508 0.2920 0.1034 +vn -0.9626 0.2675 -0.0418 +vn -0.9809 0.1735 -0.0877 +vn -0.9933 0.1151 0.0108 +vn -0.9508 0.2920 0.1034 +vn 0.9288 0.1135 -0.3527 +vn 0.9358 0.2030 -0.2882 +vn 0.9733 0.2074 -0.0979 +vn 0.9725 0.1765 -0.1522 +vn -0.9733 0.2074 -0.0979 +vn -0.9358 0.2030 -0.2882 +vn -0.9288 0.1135 -0.3527 +vn -0.9725 0.1765 -0.1522 +vn 0.6553 -0.7551 0.0203 +vn 0.5920 -0.8020 -0.0794 +vn 0.6279 -0.7768 -0.0482 +vn 0.6575 -0.7478 0.0919 +vn -0.6279 -0.7768 -0.0482 +vn -0.5920 -0.8020 -0.0794 +vn -0.6553 -0.7551 0.0203 +vn -0.6575 -0.7478 0.0919 +vn 0.4668 -0.8741 0.1343 +vn 0.4588 -0.8824 0.1046 +vn 0.4476 -0.8920 -0.0633 +vn 0.3413 -0.9399 0.0148 +vn -0.4476 -0.8920 -0.0633 +vn -0.4588 -0.8824 0.1046 +vn -0.4668 -0.8741 0.1343 +vn -0.3413 -0.9399 0.0148 +vn 0.5613 -0.8065 0.1858 +vn 0.4668 -0.8654 0.1818 +vn 0.4767 -0.8577 0.1925 +vn 0.5263 -0.8217 0.2186 +vn -0.4767 -0.8577 0.1925 +vn -0.4668 -0.8654 0.1818 +vn -0.5613 -0.8065 0.1858 +vn -0.5263 -0.8217 0.2186 +vn 0.5216 -0.8204 0.2341 +vn 0.6578 -0.6375 0.4011 +vn 0.7511 -0.6001 0.2753 +vn 0.5984 -0.7768 0.1963 +vn -0.7511 -0.6001 0.2753 +vn -0.6578 -0.6375 0.4011 +vn -0.5216 -0.8204 0.2341 +vn -0.5984 -0.7768 0.1963 +vn 0.7592 -0.6218 0.1926 +vn 0.7187 -0.6817 0.1373 +vn 0.6862 -0.7002 0.1973 +vn -0.6862 -0.7002 0.1973 +vn -0.7187 -0.6817 0.1373 +vn -0.7592 -0.6218 0.1926 +vn 0.4177 -0.7750 0.4742 +vn 0.4704 -0.8012 0.3699 +vn 0.4993 -0.5066 0.7029 +vn -0.4993 -0.5066 0.7029 +vn -0.4704 -0.8012 0.3699 +vn -0.4177 -0.7750 0.4742 +vn 0.6287 -0.1731 -0.7581 +vn 0.4658 -0.4492 -0.7624 +vn 0.5177 -0.4475 -0.7292 +vn 0.5802 -0.1684 -0.7969 +vn -0.5177 -0.4475 -0.7292 +vn -0.4658 -0.4492 -0.7624 +vn -0.6287 -0.1731 -0.7581 +vn -0.5802 -0.1684 -0.7969 +vn 0.4618 -0.0233 -0.8867 +vn 0.5443 -0.1128 -0.8313 +vn 0.5532 -0.3757 -0.7436 +vn 0.4453 -0.2665 -0.8548 +vn -0.5532 -0.3757 -0.7436 +vn -0.5443 -0.1128 -0.8313 +vn -0.4618 -0.0233 -0.8867 +vn -0.4454 -0.2665 -0.8548 +vn 0.2208 -0.9325 -0.2857 +vn 0.4424 -0.8447 -0.3014 +vn 0.4406 -0.7369 -0.5127 +vn 0.2445 -0.7812 -0.5744 +vn -0.4406 -0.7369 -0.5127 +vn -0.4424 -0.8447 -0.3014 +vn -0.2208 -0.9325 -0.2857 +vn -0.2445 -0.7812 -0.5744 +vn 0.5828 -0.7694 -0.2615 +vn 0.5586 -0.7104 -0.4281 +vn 0.6683 -0.6368 -0.3844 +vn 0.6382 -0.7320 -0.2386 +vn -0.6683 -0.6368 -0.3844 +vn -0.5586 -0.7104 -0.4281 +vn -0.5828 -0.7694 -0.2615 +vn -0.6382 -0.7320 -0.2386 +vn 0.4367 -0.3637 -0.8228 +vn 0.6196 -0.4763 -0.6238 +vn 0.4702 -0.6134 -0.6346 +vn -0.4702 -0.6134 -0.6346 +vn -0.6196 -0.4763 -0.6238 +vn -0.4367 -0.3637 -0.8228 +vn -0.0205 0.8492 0.5277 +vn -0.1918 0.8152 0.5466 +vn 0.4724 0.0875 0.8770 +vn 0.5353 0.0226 0.8444 +vn -0.4724 0.0875 0.8770 +vn 0.1918 0.8152 0.5466 +vn 0.0205 0.8492 0.5277 +vn -0.5353 0.0226 0.8444 +vn 0.1382 0.8098 0.5702 +vn 0.5113 -0.0565 0.8575 +vn 0.4345 -0.0954 0.8956 +vn 0.3782 0.6396 0.6692 +vn -0.4345 -0.0954 0.8956 +vn -0.5113 -0.0565 0.8575 +vn -0.1382 0.8098 0.5702 +vn -0.3782 0.6396 0.6692 +vn 0.5193 0.3696 0.7705 +vn 0.2324 -0.0550 0.9711 +vn 0.0996 -0.0175 0.9949 +vn 0.5077 0.1512 0.8481 +vn -0.0996 -0.0175 0.9949 +vn -0.2324 -0.0550 0.9711 +vn -0.5193 0.3696 0.7705 +vn -0.5077 0.1512 0.8481 +vn 0.4991 -0.0694 0.8637 +vn 0.0746 -0.0289 0.9968 +vn 0.1012 0.0676 0.9926 +vn 0.5339 -0.1803 0.8261 +vn -0.1012 0.0676 0.9926 +vn -0.0746 -0.0289 0.9968 +vn -0.4991 -0.0694 0.8637 +vn -0.5339 -0.1803 0.8261 +vn 0.5960 -0.3435 0.7258 +vn 0.2560 0.1901 0.9478 +vn 0.4547 0.1312 0.8809 +vn 0.5900 -0.5478 0.5931 +vn -0.4547 0.1312 0.8809 +vn -0.2560 0.1901 0.9478 +vn -0.5960 -0.3435 0.7258 +vn -0.5900 -0.5478 0.5931 +vn 0.5327 -0.6774 0.5073 +vn 0.6046 -0.0297 0.7960 +vn 0.5400 -0.1178 0.8334 +vn 0.3758 -0.7678 0.5189 +vn -0.5400 -0.1178 0.8334 +vn -0.6046 -0.0297 0.7960 +vn -0.5327 -0.6774 0.5073 +vn -0.3758 -0.7678 0.5189 +vn 0.4221 0.5591 0.7136 +vn 0.1653 0.8690 0.4664 +vn 0.2941 0.8048 0.5156 +vn 0.4756 0.4512 0.7551 +vn -0.2941 0.8048 0.5156 +vn -0.1653 0.8690 0.4664 +vn -0.4221 0.5591 0.7136 +vn -0.4756 0.4512 0.7551 +vn -0.2542 0.6512 0.7151 +vn -0.5563 0.7759 0.2974 +vn -0.2140 0.9014 0.3764 +vn 0.0794 0.7092 0.7005 +vn 0.2140 0.9014 0.3764 +vn 0.5563 0.7759 0.2974 +vn 0.2542 0.6512 0.7151 +vn -0.0794 0.7092 0.7005 +vn -0.5416 0.0466 0.8394 +vn -0.9486 0.1144 0.2950 +vn -0.8572 0.4571 0.2373 +vn -0.5241 0.3505 0.7761 +vn 0.8572 0.4571 0.2373 +vn 0.9486 0.1144 0.2950 +vn 0.5416 0.0466 0.8394 +vn 0.5241 0.3505 0.7761 +vn -0.0686 -0.3762 0.9240 +vn -0.3293 -0.5899 0.7373 +vn -0.8190 -0.2642 0.5093 +vn -0.4092 -0.1702 0.8964 +vn 0.8190 -0.2642 0.5093 +vn 0.3293 -0.5899 0.7373 +vn 0.0686 -0.3762 0.9240 +vn 0.4092 -0.1702 0.8964 +vn 0.5220 -0.4493 0.7251 +vn 0.4795 -0.6141 0.6268 +vn 0.2706 -0.6499 0.7102 +vn 0.3580 -0.4611 0.8119 +vn -0.2706 -0.6499 0.7102 +vn -0.4795 -0.6141 0.6268 +vn -0.5220 -0.4493 0.7251 +vn -0.3580 -0.4611 0.8119 +vn 0.6248 -0.3986 0.6714 +vn 0.6587 -0.3369 0.6727 +vn 0.6943 -0.4801 0.5362 +vn 0.6141 -0.5531 0.5630 +vn -0.6943 -0.4801 0.5362 +vn -0.6587 -0.3369 0.6727 +vn -0.6248 -0.3986 0.6714 +vn -0.6141 -0.5531 0.5630 +vn 0.7007 -0.7122 0.0431 +vn 0.5427 -0.8336 0.1032 +vn 0.8133 -0.5499 0.1903 +vn 0.8700 -0.4877 -0.0722 +vn -0.8133 -0.5499 0.1903 +vn -0.5427 -0.8336 0.1032 +vn -0.7007 -0.7122 0.0431 +vn -0.8700 -0.4877 -0.0722 +vn -0.0275 -0.6205 0.7837 +vn -0.0000 -0.7270 0.6867 +vn 0.1214 0.2350 0.9644 +vn 0.1592 0.3008 0.9403 +vn -0.1214 0.2350 0.9644 +vn 0.0275 -0.6205 0.7837 +vn -0.1592 0.3008 0.9403 +vn 0.9629 -0.2654 0.0480 +vn 0.8749 -0.4801 0.0636 +vn 0.9101 -0.3839 -0.1561 +vn 0.9621 -0.2621 -0.0750 +vn -0.9101 -0.3839 -0.1561 +vn -0.8749 -0.4801 0.0636 +vn -0.9629 -0.2654 0.0480 +vn -0.9621 -0.2621 -0.0750 +vn 0.2189 0.6396 0.7369 +vn 0.5025 -0.1434 0.8526 +vn 0.3438 0.0039 0.9391 +vn -0.3999 0.7149 0.5736 +vn -0.3438 0.0039 0.9391 +vn -0.5025 -0.1434 0.8526 +vn -0.2189 0.6396 0.7369 +vn 0.3999 0.7149 0.5736 +vn 0.1416 0.7362 0.6617 +vn 0.0708 0.9263 0.3701 +vn 0.1860 0.9347 0.3027 +vn 0.2524 0.7846 0.5662 +vn -0.1860 0.9347 0.3027 +vn -0.0708 0.9263 0.3701 +vn -0.1416 0.7362 0.6617 +vn -0.2524 0.7846 0.5662 +vn 0.6620 -0.0533 0.7476 +vn 0.7321 0.0500 0.6793 +vn 0.6702 0.2898 0.6833 +vn 0.6793 0.3834 0.6258 +vn -0.6702 0.2898 0.6833 +vn -0.7321 0.0500 0.6793 +vn -0.6620 -0.0533 0.7476 +vn -0.6793 0.3834 0.6258 +vn 0.6671 0.4915 0.5599 +vn 0.7185 0.3229 0.6161 +vn 0.5895 0.2524 0.7673 +vn 0.4953 0.5448 0.6767 +vn -0.5895 0.2524 0.7673 +vn -0.7185 0.3229 0.6161 +vn -0.6671 0.4915 0.5599 +vn -0.4953 0.5448 0.6767 +vn 0.7462 -0.5303 0.4026 +vn 0.8459 -0.4455 0.2933 +vn 0.9177 -0.3399 0.2058 +vn 0.8790 -0.4117 0.2408 +vn -0.9177 -0.3399 0.2058 +vn -0.8459 -0.4455 0.2933 +vn -0.7462 -0.5303 0.4026 +vn -0.8790 -0.4117 0.2408 +vn 0.6539 -0.3645 0.6630 +vn 0.7818 -0.3994 0.4789 +vn 0.6662 -0.4851 0.5664 +vn 0.6220 -0.4608 0.6331 +vn -0.6662 -0.4851 0.5664 +vn -0.7818 -0.3994 0.4789 +vn -0.6539 -0.3645 0.6630 +vn -0.6220 -0.4608 0.6331 +vn 0.5746 -0.3515 0.7391 +vn 0.5455 -0.3604 0.7567 +vn 0.6377 -0.4508 0.6246 +vn 0.6737 -0.4640 0.5752 +vn -0.6377 -0.4508 0.6246 +vn -0.5455 -0.3604 0.7567 +vn -0.5746 -0.3515 0.7391 +vn -0.6737 -0.4640 0.5752 +vn 0.9892 -0.1431 -0.0332 +vn 0.9361 -0.3355 0.1060 +vn 0.8935 -0.2348 0.3827 +vn 0.9914 0.1179 0.0563 +vn -0.8935 -0.2348 0.3827 +vn -0.9361 -0.3355 0.1060 +vn -0.9892 -0.1431 -0.0332 +vn -0.9914 0.1179 0.0563 +vn 0.9423 -0.3297 -0.0577 +vn 0.9147 -0.3752 -0.1502 +vn 0.9298 -0.3679 -0.0089 +vn 0.9130 -0.4078 0.0129 +vn -0.9298 -0.3679 -0.0089 +vn -0.9147 -0.3752 -0.1502 +vn -0.9423 -0.3297 -0.0577 +vn -0.9130 -0.4078 0.0129 +vn 0.9354 -0.3331 -0.1189 +vn 0.9649 -0.0182 0.2620 +vn 0.9647 -0.2265 0.1348 +vn -0.9647 -0.2265 0.1348 +vn -0.9649 -0.0182 0.2620 +vn -0.9354 -0.3331 -0.1189 +vn 0.7120 -0.5876 0.3845 +vn 0.7337 -0.5770 0.3589 +vn 0.6887 -0.5163 0.5090 +vn 0.6830 -0.4932 0.5387 +vn -0.6887 -0.5163 0.5090 +vn -0.7337 -0.5770 0.3589 +vn -0.7120 -0.5876 0.3845 +vn -0.6830 -0.4932 0.5387 +vn 0.7388 -0.5816 0.3406 +vn 0.7333 -0.6043 0.3116 +vn 0.6509 -0.5579 0.5149 +vn 0.6816 -0.5313 0.5030 +vn -0.6509 -0.5579 0.5149 +vn -0.7333 -0.6043 0.3116 +vn -0.7388 -0.5816 0.3406 +vn -0.6816 -0.5313 0.5030 +vn 0.7243 -0.6494 0.2318 +vn 0.8306 -0.5336 0.1593 +vn 0.6951 -0.4454 0.5644 +vn 0.6174 -0.5989 0.5101 +vn -0.6951 -0.4454 0.5644 +vn -0.8306 -0.5336 0.1593 +vn -0.7243 -0.6494 0.2318 +vn -0.6174 -0.5989 0.5101 +vn 0.6811 0.6657 0.3050 +vn 0.4426 0.8229 0.3563 +vn 0.4269 0.7886 0.4425 +vn 0.6184 0.4156 0.6670 +vn -0.4269 0.7886 0.4425 +vn -0.4426 0.8229 0.3563 +vn -0.6811 0.6657 0.3050 +vn -0.6184 0.4156 0.6670 +vn 0.7428 0.5039 0.4407 +vn 0.8473 0.1348 0.5137 +vn 0.8098 0.1403 0.5697 +vn 0.7151 0.4634 0.5233 +vn -0.8098 0.1403 0.5697 +vn -0.8473 0.1348 0.5137 +vn -0.7428 0.5039 0.4407 +vn -0.7151 0.4634 0.5233 +vn 0.8087 -0.3438 0.4774 +vn 0.9084 0.0479 0.4153 +vn 0.6406 0.3517 0.6826 +vn 0.7902 -0.3805 0.4805 +vn -0.6406 0.3517 0.6826 +vn -0.9084 0.0479 0.4153 +vn -0.8087 -0.3438 0.4774 +vn -0.7902 -0.3805 0.4805 +vn 0.1493 0.9765 0.1554 +vn -0.0046 0.9804 0.1972 +vn -0.0662 0.9281 0.3663 +vn -0.0823 0.9430 0.3225 +vn 0.0662 0.9281 0.3663 +vn 0.0046 0.9804 0.1972 +vn -0.1493 0.9765 0.1554 +vn 0.0823 0.9430 0.3225 +vn 0.5698 -0.6825 0.4576 +vn 0.6797 -0.6052 0.4145 +vn 0.6792 -0.4446 0.5840 +vn 0.6092 -0.4742 0.6356 +vn -0.6792 -0.4446 0.5840 +vn -0.6797 -0.6052 0.4145 +vn -0.5698 -0.6825 0.4576 +vn -0.6092 -0.4742 0.6356 +vn 0.1434 -0.8406 0.5224 +vn 0.4106 -0.7628 0.4995 +vn 0.4658 -0.6095 0.6415 +vn 0.2145 -0.6668 0.7137 +vn -0.4658 -0.6095 0.6415 +vn -0.4106 -0.7628 0.4995 +vn -0.1434 -0.8406 0.5224 +vn -0.2145 -0.6668 0.7137 +vn -0.9542 -0.2910 -0.0694 +vn -0.5829 -0.7510 0.3104 +vn -0.1380 -0.4256 0.8943 +vn -0.3713 -0.1545 0.9156 +vn 0.1380 -0.4256 0.8943 +vn 0.5829 -0.7510 0.3104 +vn 0.9542 -0.2910 -0.0694 +vn 0.3713 -0.1545 0.9156 +vn -0.8679 0.4114 -0.2784 +vn -0.9569 0.1243 -0.2625 +vn -0.3893 0.0699 0.9185 +vn -0.2116 0.2604 0.9420 +vn 0.3893 0.0699 0.9185 +vn 0.9569 0.1243 -0.2625 +vn 0.8679 0.4114 -0.2784 +vn 0.2116 0.2604 0.9420 +vn -0.4099 0.9112 0.0419 +vn -0.6783 0.7208 -0.1430 +vn -0.0276 0.4645 0.8851 +vn 0.1209 0.6487 0.7513 +vn 0.0276 0.4645 0.8851 +vn 0.6783 0.7208 -0.1430 +vn 0.4099 0.9112 0.0419 +vn -0.1209 0.6487 0.7513 +vn 0.0860 0.9649 0.2483 +vn -0.0841 0.9794 0.1834 +vn 0.3082 0.7442 0.5926 +vn 0.2655 0.8263 0.4968 +vn -0.3082 0.7442 0.5926 +vn 0.0841 0.9794 0.1834 +vn -0.0860 0.9649 0.2483 +vn -0.2655 0.8263 0.4968 +vn 0.2574 0.1434 0.9556 +vn 0.2381 0.1169 0.9642 +vn 0.1210 0.1419 0.9825 +vn 0.1726 0.0265 0.9846 +vn -0.1210 0.1419 0.9825 +vn -0.2381 0.1169 0.9642 +vn -0.2574 0.1434 0.9556 +vn -0.1726 0.0265 0.9846 +vn 0.2675 0.0341 0.9630 +vn 0.2930 0.1243 0.9480 +vn 0.4064 0.0313 0.9132 +vn 0.3320 0.0177 0.9431 +vn -0.4064 0.0313 0.9132 +vn -0.2930 0.1243 0.9480 +vn -0.2675 0.0341 0.9630 +vn -0.3320 0.0177 0.9431 +vn 0.3485 0.0044 0.9373 +vn 0.4045 -0.0499 0.9132 +vn 0.3634 -0.0903 0.9272 +vn 0.3158 0.0103 0.9488 +vn -0.3634 -0.0903 0.9272 +vn -0.4045 -0.0499 0.9132 +vn -0.3485 0.0044 0.9373 +vn -0.3158 0.0103 0.9488 +vn 0.2438 0.0400 0.9690 +vn 0.3102 -0.1465 0.9393 +vn 0.4165 -0.0288 0.9087 +vn 0.3278 0.1814 0.9272 +vn -0.4165 -0.0288 0.9087 +vn -0.3102 -0.1465 0.9393 +vn -0.2438 0.0400 0.9690 +vn -0.3278 0.1814 0.9272 +vn 0.4524 0.2283 0.8621 +vn 0.5000 0.0443 0.8649 +vn 0.3320 0.1101 0.9368 +vn 0.3219 0.3049 0.8963 +vn -0.3320 0.1101 0.9368 +vn -0.5000 0.0443 0.8649 +vn -0.4524 0.2283 0.8621 +vn -0.3219 0.3049 0.8963 +vn 0.4596 -0.1697 0.8718 +vn 0.3694 -0.0290 0.9288 +vn 0.3783 0.0030 0.9257 +vn 0.4989 -0.1092 0.8598 +vn -0.3783 0.0030 0.9257 +vn -0.3694 -0.0290 0.9288 +vn -0.4596 -0.1697 0.8718 +vn -0.4989 -0.1092 0.8598 +vn 0.3907 -0.1939 0.8999 +vn 0.3001 -0.1973 0.9333 +vn 0.2293 -0.0197 0.9732 +vn 0.3158 -0.0334 0.9482 +vn -0.2293 -0.0197 0.9732 +vn -0.3001 -0.1973 0.9333 +vn -0.3907 -0.1939 0.8999 +vn -0.3158 -0.0334 0.9482 +vn 0.1769 0.1801 0.9676 +vn 0.1284 -0.0032 0.9917 +vn 0.2247 -0.1899 0.9558 +vn 0.3179 -0.0537 0.9466 +vn -0.2247 -0.1899 0.9558 +vn -0.1284 -0.0032 0.9917 +vn -0.1769 0.1801 0.9676 +vn -0.3179 -0.0537 0.9466 +vn -0.2447 0.7696 0.5897 +vn -0.1043 0.6828 0.7231 +vn -0.0510 0.4334 0.8998 +vn -0.0186 0.3169 0.9483 +vn 0.0510 0.4334 0.8998 +vn 0.1043 0.6828 0.7231 +vn 0.2447 0.7696 0.5897 +vn 0.0186 0.3169 0.9483 +vn 0.5827 0.1008 0.8064 +vn 0.5408 0.0016 0.8412 +vn 0.4163 0.1692 0.8933 +vn 0.4931 0.2814 0.8232 +vn -0.4163 0.1692 0.8933 +vn -0.5408 0.0016 0.8412 +vn -0.5827 0.1008 0.8064 +vn -0.4931 0.2814 0.8232 +vn 0.4316 -0.1456 0.8902 +vn 0.4343 -0.1822 0.8822 +vn 0.4757 -0.1189 0.8715 +vn 0.4741 -0.0525 0.8789 +vn -0.4757 -0.1189 0.8715 +vn -0.4343 -0.1822 0.8822 +vn -0.4316 -0.1456 0.8902 +vn -0.4741 -0.0525 0.8789 +vn 0.5201 -0.0786 0.8505 +vn 0.5090 -0.1171 0.8528 +vn 0.4391 -0.2271 0.8692 +vn 0.4623 -0.1564 0.8728 +vn -0.4391 -0.2271 0.8692 +vn -0.5090 -0.1171 0.8528 +vn -0.5201 -0.0786 0.8505 +vn -0.4623 -0.1564 0.8728 +vn 0.4584 0.2779 0.8442 +vn 0.4637 0.2832 0.8395 +vn 0.5251 0.1076 0.8442 +vn 0.5149 0.1364 0.8463 +vn -0.5251 0.1076 0.8442 +vn -0.4637 0.2832 0.8395 +vn -0.4584 0.2779 0.8442 +vn -0.5149 0.1364 0.8463 +vn 0.4182 0.3033 0.8562 +vn 0.3713 0.4206 0.8278 +vn 0.3842 0.3492 0.8547 +vn -0.3842 0.3492 0.8547 +vn -0.3713 0.4206 0.8278 +vn -0.4182 0.3033 0.8562 +vn 0.2752 -0.9606 0.0402 +vn 0.0743 -0.9972 0.0065 +vn -0.2865 -0.6869 -0.6679 +vn -0.2351 -0.6646 -0.7092 +vn 0.2865 -0.6869 -0.6679 +vn -0.0743 -0.9972 0.0065 +vn -0.2752 -0.9606 0.0402 +vn 0.2351 -0.6646 -0.7092 +vn 0.6745 -0.6981 0.2403 +vn 0.4664 -0.8799 0.0914 +vn 0.0273 -0.6492 -0.7601 +vn 0.3356 -0.6177 -0.7112 +vn -0.0273 -0.6492 -0.7601 +vn -0.4664 -0.8799 0.0914 +vn -0.6745 -0.6981 0.2403 +vn -0.3356 -0.6177 -0.7112 +vn 0.8891 -0.0884 0.4492 +vn 0.8268 -0.3823 0.4126 +vn 0.8267 -0.4481 -0.3404 +vn 0.9932 -0.0290 -0.1131 +vn -0.8267 -0.4481 -0.3404 +vn -0.8268 -0.3823 0.4126 +vn -0.8891 -0.0884 0.4492 +vn -0.9932 -0.0290 -0.1131 +vn 0.6766 0.7300 0.0964 +vn 0.8915 0.3241 0.3165 +vn 0.9286 0.2822 -0.2409 +vn 0.4775 0.6112 -0.6312 +vn -0.9286 0.2822 -0.2409 +vn -0.8915 0.3241 0.3165 +vn -0.6766 0.7300 0.0964 +vn -0.4775 0.6112 -0.6312 +vn -0.2459 0.9629 -0.1115 +vn 0.0806 0.9919 -0.0978 +vn -0.1731 0.5767 -0.7984 +vn -0.4004 0.5448 -0.7368 +vn 0.1731 0.5767 -0.7984 +vn -0.0806 0.9919 -0.0978 +vn 0.2459 0.9629 -0.1115 +vn 0.4004 0.5448 -0.7368 +vn -0.4907 0.8712 0.0129 +vn -0.3626 0.9299 -0.0613 +vn -0.5145 0.5403 -0.6658 +vn -0.5531 0.5711 -0.6066 +vn 0.5145 0.5403 -0.6658 +vn 0.3626 0.9299 -0.0613 +vn 0.4907 0.8712 0.0129 +vn 0.5531 0.5711 -0.6066 +vn -0.4742 0.0784 -0.8769 +vn -0.4415 -0.1127 -0.8901 +vn -0.3900 -0.1353 -0.9108 +vn -0.4209 0.0836 -0.9032 +vn 0.3900 -0.1353 -0.9108 +vn 0.4415 -0.1127 -0.8901 +vn 0.4742 0.0784 -0.8769 +vn 0.4209 0.0836 -0.9032 +vn -0.3249 0.0745 -0.9428 +vn -0.1883 0.0705 -0.9796 +vn -0.0850 -0.1226 -0.9888 +vn -0.2465 -0.1132 -0.9625 +vn 0.0850 -0.1226 -0.9888 +vn 0.1883 0.0705 -0.9796 +vn 0.3249 0.0745 -0.9428 +vn 0.2465 -0.1132 -0.9625 +vn 0.0940 0.1248 -0.9877 +vn 0.8214 0.1013 -0.5612 +vn 0.2027 -0.1366 -0.9697 +vn -0.2027 -0.1366 -0.9697 +vn -0.8214 0.1013 -0.5612 +vn -0.0940 0.1248 -0.9877 +vn 0.2613 0.7349 -0.6258 +vn -0.1992 0.9792 -0.0379 +vn -0.6616 0.7467 0.0689 +vn -0.5331 0.6611 -0.5280 +vn 0.6616 0.7467 0.0689 +vn 0.1992 0.9792 -0.0379 +vn -0.2613 0.7349 -0.6258 +vn 0.5331 0.6611 -0.5280 +vn 0.5925 -0.1146 -0.7974 +vn 0.1350 0.0215 -0.9906 +vn 0.1295 -0.2589 -0.9572 +vn 0.4466 -0.3788 -0.8106 +vn -0.1295 -0.2589 -0.9572 +vn -0.1350 0.0215 -0.9906 +vn -0.5925 -0.1146 -0.7974 +vn -0.4466 -0.3788 -0.8106 +vn -0.1199 -0.9705 -0.2090 +vn 0.0603 -0.7863 -0.6149 +vn -0.1223 -0.7503 -0.6497 +vn -0.1446 -0.9850 -0.0941 +vn 0.1223 -0.7503 -0.6497 +vn -0.0603 -0.7863 -0.6149 +vn 0.1199 -0.9705 -0.2090 +vn 0.1446 -0.9850 -0.0941 +usemtl None +s off +f 47/1/1 509/2/1 1513/3/1 508/4/1 +f 509/2/2 1/5/2 510/6/2 1513/3/2 +f 1513/3/3 510/6/3 3/7/3 511/8/3 +f 508/4/4 1513/3/4 511/8/4 45/9/4 +f 4/10/5 513/11/5 1514/12/5 512/13/5 +f 513/11/6 2/14/6 514/15/6 1514/12/6 +f 1514/12/7 514/15/7 48/16/7 515/17/7 +f 512/13/8 1514/12/8 515/17/8 46/18/8 +f 45/9/9 511/8/9 1515/19/9 516/20/9 +f 511/8/10 3/7/10 517/21/10 1515/19/10 +f 1515/19/11 517/21/11 5/22/11 518/23/11 +f 516/20/12 1515/19/12 518/23/12 43/24/12 +f 6/25/13 520/26/13 1516/27/13 519/28/13 +f 520/26/14 4/10/14 512/13/14 1516/27/14 +f 1516/27/15 512/13/15 46/18/15 521/29/15 +f 519/28/16 1516/27/16 521/29/16 44/30/16 +f 3/7/17 522/31/17 1517/32/17 517/21/17 +f 522/31/18 9/33/18 523/34/18 1517/32/18 +f 1517/32/19 523/34/19 7/35/19 524/36/19 +f 517/21/20 1517/32/20 524/36/20 5/22/20 +f 8/37/21 526/38/21 1518/39/21 525/40/21 +f 526/38/22 10/41/22 527/42/22 1518/39/22 +f 1518/39/23 527/42/23 4/10/23 520/26/23 +f 525/40/24 1518/39/24 520/26/24 6/25/24 +f 1/5/25 528/43/25 1519/44/25 510/6/25 +f 528/43/26 11/45/26 529/46/26 1519/44/26 +f 1519/44/27 529/46/27 9/33/27 522/31/27 +f 510/6/28 1519/44/28 522/31/28 3/7/28 +f 10/41/29 530/47/29 1520/48/29 527/42/29 +f 530/47/30 12/49/30 531/50/30 1520/48/30 +f 1520/48/31 531/50/31 2/14/31 513/11/31 +f 527/42/32 1520/48/32 513/11/32 4/10/32 +f 11/45/33 532/51/33 1521/52/33 529/46/33 +f 532/51/34 13/53/34 533/54/34 1521/52/34 +f 1521/52/35 533/54/35 15/55/35 534/56/35 +f 529/46/36 1521/52/36 534/56/36 9/33/36 +f 16/57/37 536/58/37 1522/59/37 535/60/37 +f 536/58/38 14/61/38 537/62/38 1522/59/38 +f 1522/59/39 537/62/39 12/49/39 530/47/39 +f 535/60/40 1522/59/40 530/47/40 10/41/40 +f 9/33/41 534/56/41 1523/63/41 523/34/41 +f 534/56/42 15/55/42 538/64/42 1523/63/42 +f 1523/63/43 538/64/43 17/65/43 539/66/43 +f 523/34/44 1523/63/44 539/66/44 7/35/44 +f 18/67/45 541/68/45 1524/69/45 540/70/45 +f 541/68/46 16/57/46 535/60/46 1524/69/46 +f 1524/69/47 535/60/47 10/41/47 526/38/47 +f 540/70/48 1524/69/48 526/38/48 8/37/48 +f 15/55/49 542/71/49 1525/72/49 538/64/49 +f 542/71/50 21/73/50 543/74/50 1525/72/50 +f 1525/72/51 543/74/51 19/75/51 544/76/51 +f 538/64/52 1525/72/52 544/76/52 17/65/52 +f 20/77/53 546/78/53 1526/79/53 545/80/53 +f 546/78/54 22/81/54 547/82/54 1526/79/54 +f 1526/79/55 547/82/55 16/57/55 541/68/55 +f 545/80/56 1526/79/56 541/68/56 18/67/56 +f 13/53/57 548/83/57 1527/84/57 533/54/57 +f 548/83/58 23/85/58 549/86/58 1527/84/58 +f 1527/84/59 549/86/59 21/73/59 542/71/59 +f 533/54/60 1527/84/60 542/71/60 15/55/60 +f 22/81/61 550/87/61 1528/88/61 547/82/61 +f 550/87/62 24/89/62 551/90/62 1528/88/62 +f 1528/88/63 551/90/63 14/61/63 536/58/63 +f 547/82/64 1528/88/64 536/58/64 16/57/64 +f 23/85/65 552/91/65 1529/92/65 549/86/65 +f 552/91/66 25/93/66 553/94/66 1529/92/66 +f 1529/92/67 553/94/67 27/95/67 554/96/67 +f 549/86/68 1529/92/68 554/96/68 21/73/68 +f 28/97/69 556/98/69 1530/99/69 555/100/69 +f 556/98/70 26/101/70 557/102/70 1530/99/70 +f 1530/99/71 557/102/71 24/89/71 550/87/71 +f 555/100/72 1530/99/72 550/87/72 22/81/72 +f 21/73/73 554/96/73 1531/103/73 543/74/73 +f 554/96/74 27/95/74 558/104/74 1531/103/74 +f 1531/103/75 558/104/75 29/105/75 559/106/75 +f 543/74/76 1531/103/76 559/106/76 19/75/76 +f 30/107/77 561/108/77 1532/109/77 560/110/77 +f 561/108/78 28/97/78 555/100/78 1532/109/78 +f 1532/109/79 555/100/79 22/81/79 546/78/79 +f 560/110/80 1532/109/80 546/78/80 20/77/80 +f 27/95/81 562/111/81 1533/112/81 558/104/81 +f 562/111/82 33/113/82 563/114/82 1533/112/82 +f 1533/112/83 563/114/83 31/115/83 564/116/83 +f 558/104/84 1533/112/84 564/116/84 29/105/84 +f 32/117/85 566/118/85 1534/119/85 565/120/85 +f 566/118/86 34/121/86 567/122/86 1534/119/86 +f 1534/119/87 567/122/87 28/97/87 561/108/87 +f 565/120/88 1534/119/88 561/108/88 30/107/88 +f 25/93/89 568/123/89 1535/124/89 553/94/89 +f 568/123/90 35/125/90 569/126/90 1535/124/90 +f 1535/124/91 569/126/91 33/113/91 562/111/91 +f 553/94/92 1535/124/92 562/111/92 27/95/92 +f 34/121/93 570/127/93 1536/128/93 567/122/93 +f 570/127/94 36/129/94 571/130/94 1536/128/94 +f 1536/128/95 571/130/95 26/101/95 556/98/95 +f 567/122/96 1536/128/96 556/98/96 28/97/96 +f 35/125/97 572/131/97 1537/132/97 569/126/97 +f 572/131/98 37/133/98 573/134/98 1537/132/98 +f 1537/132/99 573/134/99 39/135/99 574/136/99 +f 569/126/100 1537/132/100 574/136/100 33/113/100 +f 40/137/101 576/138/101 1538/139/101 575/140/101 +f 576/138/102 38/141/102 577/142/102 1538/139/102 +f 1538/139/103 577/142/103 36/129/103 570/127/103 +f 575/140/104 1538/139/104 570/127/104 34/121/104 +f 33/113/105 574/136/105 1539/143/105 563/114/105 +f 574/136/106 39/135/106 578/144/106 1539/143/106 +f 1539/143/107 578/144/107 41/145/107 579/146/107 +f 563/114/108 1539/143/108 579/146/108 31/115/108 +f 42/147/109 581/148/109 1540/149/109 580/150/109 +f 581/148/110 40/137/110 575/140/110 1540/149/110 +f 1540/149/111 575/140/111 34/121/111 566/118/111 +f 580/150/112 1540/149/112 566/118/112 32/117/112 +f 39/135/113 582/151/113 1541/152/113 578/144/113 +f 582/151/114 45/9/114 516/20/114 1541/152/114 +f 1541/152/115 516/20/115 43/24/115 583/153/115 +f 578/144/116 1541/152/116 583/153/116 41/145/116 +f 44/30/117 521/29/117 1542/154/117 584/155/117 +f 521/29/118 46/18/118 585/156/118 1542/154/118 +f 1542/154/119 585/156/119 40/137/119 581/148/119 +f 584/155/120 1542/154/120 581/148/120 42/147/120 +f 37/133/121 586/157/121 1543/158/121 573/134/121 +f 586/157/122 47/1/122 508/4/122 1543/158/122 +f 1543/158/123 508/4/123 45/9/123 582/151/123 +f 573/134/124 1543/158/124 582/151/124 39/135/124 +f 46/18/125 515/17/125 1544/159/125 585/156/125 +f 515/17/126 48/16/126 587/160/126 1544/159/126 +f 1544/159/127 587/160/127 38/141/127 576/138/127 +f 585/156/128 1544/159/128 576/138/128 40/137/128 +f 47/1/129 586/157/129 1545/161/129 588/162/129 +f 586/157/130 37/133/130 589/163/130 1545/161/130 +f 1545/161/131 589/163/131 51/164/131 590/165/131 +f 588/162/132 1545/161/132 590/165/132 49/166/132 +f 52/167/133 592/168/133 1546/169/133 591/170/133 +f 592/168/134 38/141/134 587/160/134 1546/169/134 +f 1546/169/135 587/160/135 48/16/135 593/171/135 +f 591/170/136 1546/169/136 593/171/136 50/172/136 +f 37/133/137 572/131/137 1547/173/137 589/163/137 +f 572/131/138 35/125/138 594/174/138 1547/173/138 +f 1547/173/139 594/174/139 53/175/139 595/176/139 +f 589/163/140 1547/173/140 595/176/140 51/164/140 +f 54/177/141 597/178/141 1548/179/141 596/180/141 +f 597/178/142 36/129/142 577/142/142 1548/179/142 +f 1548/179/143 577/142/143 38/141/143 592/168/143 +f 596/180/144 1548/179/144 592/168/144 52/167/144 +f 35/125/145 568/123/145 1549/181/145 594/174/145 +f 568/123/146 25/93/146 598/182/146 1549/181/146 +f 1549/181/147 598/182/147 55/183/147 599/184/147 +f 594/174/148 1549/181/148 599/184/148 53/175/148 +f 56/185/149 601/186/149 1550/187/149 600/188/149 +f 601/186/150 26/101/150 571/130/150 1550/187/150 +f 1550/187/151 571/130/151 36/129/151 597/178/151 +f 600/188/152 1550/187/152 597/178/152 54/177/152 +f 25/93/153 552/91/153 1551/189/153 598/182/153 +f 552/91/154 23/85/154 602/190/154 1551/189/154 +f 1551/189/155 602/190/155 57/191/155 603/192/155 +f 598/182/156 1551/189/156 603/192/156 55/183/156 +f 58/193/157 605/194/157 1552/195/157 604/196/157 +f 605/194/158 24/89/158 557/102/158 1552/195/158 +f 1552/195/159 557/102/159 26/101/159 601/186/159 +f 604/196/160 1552/195/160 601/186/160 56/185/160 +f 23/85/161 548/83/161 1553/197/161 602/190/161 +f 548/83/162 13/53/162 606/198/162 1553/197/162 +f 1553/197/163 606/198/163 59/199/163 607/200/163 +f 602/190/164 1553/197/164 607/200/164 57/191/164 +f 60/201/165 609/202/165 1554/203/165 608/204/165 +f 609/202/166 14/61/166 551/90/166 1554/203/166 +f 1554/203/167 551/90/167 24/89/167 605/194/167 +f 608/204/168 1554/203/168 605/194/168 58/193/168 +f 13/53/169 532/51/169 1555/205/169 606/198/169 +f 532/51/170 11/45/170 610/206/170 1555/205/170 +f 1555/205/171 610/206/171 63/207/171 611/208/171 +f 606/198/172 1555/205/172 611/208/172 59/199/172 +f 64/209/173 613/210/173 1556/211/173 612/212/173 +f 613/210/174 12/49/174 537/62/174 1556/211/174 +f 1556/211/175 537/62/175 14/61/175 609/202/175 +f 612/212/176 1556/211/176 609/202/176 60/201/176 +f 11/45/177 528/43/177 1557/213/177 610/206/177 +f 528/43/178 1/5/178 614/214/178 1557/213/178 +f 1557/213/179 614/214/179 65/215/179 615/216/179 +f 610/206/180 1557/213/180 615/216/180 63/207/180 +f 66/217/181 617/218/181 1558/219/181 616/220/181 +f 617/218/182 2/14/182 531/50/182 1558/219/182 +f 1558/219/183 531/50/183 12/49/183 613/210/183 +f 616/220/184 1558/219/184 613/210/184 64/209/184 +f 1/5/185 509/2/185 1559/221/185 614/214/185 +f 509/2/186 47/1/186 588/162/186 1559/221/186 +f 1559/221/187 588/162/187 49/166/187 618/222/187 +f 614/214/188 1559/221/188 618/222/188 65/215/188 +f 50/172/189 593/171/189 1560/223/189 619/224/189 +f 593/171/190 48/16/190 514/15/190 1560/223/190 +f 1560/223/191 514/15/191 2/14/191 617/218/191 +f 619/224/192 1560/223/192 617/218/192 66/217/192 +f 61/225/193 621/226/193 1561/227/193 620/228/193 +f 65/215/194 618/222/194 1561/227/194 621/226/194 +f 49/166/195 620/228/195 1561/227/195 618/222/195 +f 50/172/196 619/224/196 1562/229/196 622/230/196 +f 66/217/197 623/231/197 1562/229/197 619/224/197 +f 62/232/198 622/230/198 1562/229/198 623/231/198 +f 63/207/199 615/216/199 1563/233/199 624/234/199 +f 65/215/200 621/226/200 1563/233/200 615/216/200 +f 61/225/201 624/234/201 1563/233/201 621/226/201 +f 62/232/202 623/231/202 1564/235/202 625/236/202 +f 66/217/203 616/220/203 1564/235/203 623/231/203 +f 64/209/204 625/236/204 1564/235/204 616/220/204 +f 61/225/205 626/237/205 1565/238/205 624/234/205 +f 59/199/206 611/208/206 1565/238/206 626/237/206 +f 63/207/207 624/234/207 1565/238/207 611/208/207 +f 64/209/208 612/212/208 1566/239/208 625/236/208 +f 60/201/209 627/240/209 1566/239/209 612/212/209 +f 62/232/210 625/236/210 1566/239/210 627/240/210 +f 61/225/211 628/241/211 1567/242/211 626/237/211 +f 57/191/212 607/200/212 1567/242/212 628/241/212 +f 59/199/213 626/237/213 1567/242/213 607/200/213 +f 60/201/214 608/204/214 1568/243/214 627/240/214 +f 58/193/215 629/244/215 1568/243/215 608/204/215 +f 62/232/216 627/240/216 1568/243/216 629/244/216 +f 61/225/217 630/245/217 1569/246/217 628/241/217 +f 55/183/218 603/192/218 1569/246/218 630/245/218 +f 57/191/219 628/241/219 1569/246/219 603/192/219 +f 58/193/220 604/196/220 1570/247/220 629/244/220 +f 56/185/221 631/248/221 1570/247/221 604/196/221 +f 62/232/222 629/244/222 1570/247/222 631/248/222 +f 61/225/223 632/249/223 1571/250/223 630/245/223 +f 53/175/224 599/184/224 1571/250/224 632/249/224 +f 55/183/225 630/245/225 1571/250/225 599/184/225 +f 56/185/226 600/188/226 1572/251/226 631/248/226 +f 54/177/227 633/252/227 1572/251/227 600/188/227 +f 62/232/228 631/248/228 1572/251/228 633/252/228 +f 61/225/229 634/253/229 1573/254/229 632/249/229 +f 51/164/230 595/176/230 1573/254/230 634/253/230 +f 53/175/231 632/249/231 1573/254/231 595/176/231 +f 54/177/232 596/180/232 1574/255/232 633/252/232 +f 52/167/233 635/256/233 1574/255/233 596/180/233 +f 62/232/234 633/252/234 1574/255/234 635/256/234 +f 61/225/235 620/228/235 1575/257/235 634/253/235 +f 49/166/236 590/165/236 1575/257/236 620/228/236 +f 51/164/237 634/253/237 1575/257/237 590/165/237 +f 52/167/238 591/170/238 1576/258/238 635/256/238 +f 50/172/239 622/230/239 1576/258/239 591/170/239 +f 62/232/240 635/256/240 1576/258/240 622/230/240 +f 89/259/241 637/260/241 1577/261/241 636/262/241 +f 637/260/242 174/263/242 638/264/242 1577/261/242 +f 1577/261/243 638/264/243 176/265/243 639/266/243 +f 636/262/244 1577/261/244 639/266/244 91/267/244 +f 176/265/245 640/268/245 1578/269/245 639/266/245 +f 640/268/246 175/270/246 641/271/246 1578/269/246 +f 1578/269/247 641/271/247 90/272/247 642/273/247 +f 639/266/248 1578/269/248 642/273/248 91/267/248 +f 87/274/249 644/275/249 1579/276/249 643/277/249 +f 644/275/250 172/278/250 645/279/250 1579/276/250 +f 1579/276/251 645/279/251 174/263/251 637/260/251 +f 643/277/252 1579/276/252 637/260/252 89/259/252 +f 175/270/253 646/280/253 1580/281/253 641/271/253 +f 646/280/254 173/282/254 647/283/254 1580/281/254 +f 1580/281/255 647/283/255 88/284/255 648/285/255 +f 641/271/256 1580/281/256 648/285/256 90/272/256 +f 85/286/257 650/287/257 1581/288/257 649/289/257 +f 650/287/258 170/290/258 651/291/258 1581/288/258 +f 1581/288/259 651/291/259 172/278/259 644/275/259 +f 649/289/260 1581/288/260 644/275/260 87/274/260 +f 173/282/261 652/292/261 1582/293/261 647/283/261 +f 652/292/262 171/294/262 653/295/262 1582/293/262 +f 1582/293/263 653/295/263 86/296/263 654/297/263 +f 647/283/264 1582/293/264 654/297/264 88/284/264 +f 83/298/265 656/299/265 1583/300/265 655/301/265 +f 656/299/266 168/302/266 657/303/266 1583/300/266 +f 1583/300/267 657/303/267 170/290/267 650/287/267 +f 655/301/268 1583/300/268 650/287/268 85/286/268 +f 171/294/269 658/304/269 1584/305/269 653/295/269 +f 658/304/270 169/306/270 659/307/270 1584/305/270 +f 1584/305/271 659/307/271 84/308/271 660/309/271 +f 653/295/272 1584/305/272 660/309/272 86/296/272 +f 81/310/273 662/311/273 1585/312/273 661/313/273 +f 662/311/274 166/314/274 663/315/274 1585/312/274 +f 1585/312/275 663/315/275 168/302/275 656/299/275 +f 661/313/276 1585/312/276 656/299/276 83/298/276 +f 169/306/277 664/316/277 1586/317/277 659/307/277 +f 664/316/278 167/318/278 665/319/278 1586/317/278 +f 1586/317/279 665/319/279 82/320/279 666/321/279 +f 659/307/280 1586/317/280 666/321/280 84/308/280 +f 79/322/281 668/323/281 1587/324/281 667/325/281 +f 668/323/282 92/326/282 669/327/282 1587/324/282 +f 1587/324/283 669/327/283 146/328/283 670/329/283 +f 667/325/284 1587/324/284 670/329/284 164/330/284 +f 147/331/285 672/332/285 1588/333/285 671/334/285 +f 672/332/286 93/335/286 673/336/286 1588/333/286 +f 1588/333/287 673/336/287 80/337/287 674/338/287 +f 671/334/288 1588/333/288 674/338/288 165/339/288 +f 92/326/289 675/340/289 1589/341/289 669/327/289 +f 675/340/290 94/342/290 676/343/290 1589/341/290 +f 1589/341/291 676/343/291 148/344/291 677/345/291 +f 669/327/292 1589/341/292 677/345/292 146/328/292 +f 149/346/293 679/347/293 1590/348/293 678/349/293 +f 679/347/294 95/350/294 680/351/294 1590/348/294 +f 1590/348/295 680/351/295 93/335/295 672/332/295 +f 678/349/296 1590/348/296 672/332/296 147/331/296 +f 94/342/297 681/352/297 1591/353/297 676/343/297 +f 681/352/298 96/354/298 682/355/298 1591/353/298 +f 1591/353/299 682/355/299 150/356/299 683/357/299 +f 676/343/300 1591/353/300 683/357/300 148/344/300 +f 151/358/301 685/359/301 1592/360/301 684/361/301 +f 685/359/302 97/362/302 686/363/302 1592/360/302 +f 1592/360/303 686/363/303 95/350/303 679/347/303 +f 684/361/304 1592/360/304 679/347/304 149/346/304 +f 96/354/305 687/364/305 1593/365/305 682/355/305 +f 687/364/306 98/366/306 688/367/306 1593/365/306 +f 1593/365/307 688/367/307 152/368/307 689/369/307 +f 682/355/308 1593/365/308 689/369/308 150/356/308 +f 153/370/309 691/371/309 1594/372/309 690/373/309 +f 691/371/310 99/374/310 692/375/310 1594/372/310 +f 1594/372/311 692/375/311 97/362/311 685/359/311 +f 690/373/312 1594/372/312 685/359/312 151/358/312 +f 98/366/313 693/376/313 1595/377/313 688/367/313 +f 693/376/314 100/378/314 694/379/314 1595/377/314 +f 1595/377/315 694/379/315 154/380/315 695/381/315 +f 688/367/316 1595/377/316 695/381/316 152/368/316 +f 155/382/317 697/383/317 1596/384/317 696/385/317 +f 697/383/318 101/386/318 698/387/318 1596/384/318 +f 1596/384/319 698/387/319 99/374/319 691/371/319 +f 696/385/320 1596/384/320 691/371/320 153/370/320 +f 100/378/321 699/388/321 1597/389/321 694/379/321 +f 699/388/322 102/390/322 700/391/322 1597/389/322 +f 1597/389/323 700/391/323 156/392/323 701/393/323 +f 694/379/324 1597/389/324 701/393/324 154/380/324 +f 157/394/325 703/395/325 1598/396/325 702/397/325 +f 703/395/326 103/398/326 704/399/326 1598/396/326 +f 1598/396/327 704/399/327 101/386/327 697/383/327 +f 702/397/328 1598/396/328 697/383/328 155/382/328 +f 102/390/329 705/400/329 1599/401/329 700/391/329 +f 705/400/330 104/402/330 706/403/330 1599/401/330 +f 1599/401/331 706/403/331 158/404/331 707/405/331 +f 700/391/332 1599/401/332 707/405/332 156/392/332 +f 159/406/333 709/407/333 1600/408/333 708/409/333 +f 709/407/334 105/410/334 710/411/334 1600/408/334 +f 1600/408/335 710/411/335 103/398/335 703/395/335 +f 708/409/336 1600/408/336 703/395/336 157/394/336 +f 104/402/337 711/412/337 1601/413/337 706/403/337 +f 711/412/338 106/414/338 712/415/338 1601/413/338 +f 1601/413/339 712/415/339 160/416/339 713/417/339 +f 706/403/340 1601/413/340 713/417/340 158/404/340 +f 161/418/341 715/419/341 1602/420/341 714/421/341 +f 715/419/342 107/422/342 716/423/342 1602/420/342 +f 1602/420/343 716/423/343 105/410/343 709/407/343 +f 714/421/344 1602/420/344 709/407/344 159/406/344 +f 106/414/345 717/424/345 1603/425/345 712/415/345 +f 717/424/346 108/426/346 718/427/346 1603/425/346 +f 1603/425/347 718/427/347 162/428/347 719/429/347 +f 712/415/348 1603/425/348 719/429/348 160/416/348 +f 163/430/349 721/431/349 1604/432/349 720/433/349 +f 721/431/350 109/434/350 722/435/350 1604/432/350 +f 1604/432/351 722/435/351 107/422/351 715/419/351 +f 720/433/352 1604/432/352 715/419/352 161/418/352 +f 108/426/353 723/436/353 1605/437/353 718/427/353 +f 723/436/354 67/438/354 724/439/354 1605/437/354 +f 1605/437/355 724/439/355 68/440/355 725/441/355 +f 718/427/356 1605/437/356 725/441/356 162/428/356 +f 68/440/357 724/439/357 1606/442/357 726/443/357 +f 724/439/358 67/438/358 727/444/358 1606/442/358 +f 1606/442/359 727/444/359 109/434/359 721/431/359 +f 726/443/360 1606/442/360 721/431/360 163/430/360 +f 110/445/361 729/446/361 1607/447/361 728/448/361 +f 729/446/362 128/449/362 730/450/362 1607/447/362 +f 1607/447/363 730/450/363 160/416/363 719/429/363 +f 728/448/364 1607/447/364 719/429/364 162/428/364 +f 161/418/365 731/451/365 1608/452/365 720/433/365 +f 731/451/366 129/453/366 732/454/366 1608/452/366 +f 1608/452/367 732/454/367 111/455/367 733/456/367 +f 720/433/368 1608/452/368 733/456/368 163/430/368 +f 128/449/369 734/457/369 1609/458/369 730/450/369 +f 734/457/370 179/459/370 735/460/370 1609/458/370 +f 1609/458/371 735/460/371 158/404/371 713/417/371 +f 730/450/372 1609/458/372 713/417/372 160/416/372 +f 159/406/373 736/461/373 1610/462/373 714/421/373 +f 736/461/374 180/463/374 737/464/374 1610/462/374 +f 1610/462/375 737/464/375 129/453/375 731/451/375 +f 714/421/376 1610/462/376 731/451/376 161/418/376 +f 126/465/377 739/466/377 1611/467/377 738/468/377 +f 739/466/378 156/392/378 707/405/378 1611/467/378 +f 1611/467/379 707/405/379 158/404/379 735/460/379 +f 738/468/380 1611/467/380 735/460/380 179/459/380 +f 159/406/381 708/409/381 1612/469/381 736/461/381 +f 708/409/382 157/394/382 740/470/382 1612/469/382 +f 1612/469/383 740/470/383 127/471/383 741/472/383 +f 736/461/384 1612/469/384 741/472/384 180/463/384 +f 124/473/385 743/474/385 1613/475/385 742/476/385 +f 743/474/386 154/380/386 701/393/386 1613/475/386 +f 1613/475/387 701/393/387 156/392/387 739/466/387 +f 742/476/388 1613/475/388 739/466/388 126/465/388 +f 157/394/389 702/397/389 1614/477/389 740/470/389 +f 702/397/390 155/382/390 744/478/390 1614/477/390 +f 1614/477/391 744/478/391 125/479/391 745/480/391 +f 740/470/392 1614/477/392 745/480/392 127/471/392 +f 122/481/393 747/482/393 1615/483/393 746/484/393 +f 747/482/394 152/368/394 695/381/394 1615/483/394 +f 1615/483/395 695/381/395 154/380/395 743/474/395 +f 746/484/396 1615/483/396 743/474/396 124/473/396 +f 155/382/397 696/385/397 1616/485/397 744/478/397 +f 696/385/398 153/370/398 748/486/398 1616/485/398 +f 1616/485/399 748/486/399 123/487/399 749/488/399 +f 744/478/400 1616/485/400 749/488/400 125/479/400 +f 120/489/401 751/490/401 1617/491/401 750/492/401 +f 751/490/402 150/356/402 689/369/402 1617/491/402 +f 1617/491/403 689/369/403 152/368/403 747/482/403 +f 750/492/404 1617/491/404 747/482/404 122/481/404 +f 153/370/405 690/373/405 1618/493/405 748/486/405 +f 690/373/406 151/358/406 752/494/406 1618/493/406 +f 1618/493/407 752/494/407 121/495/407 753/496/407 +f 748/486/408 1618/493/408 753/496/408 123/487/408 +f 118/497/409 755/498/409 1619/499/409 754/500/409 +f 755/498/410 148/344/410 683/357/410 1619/499/410 +f 1619/499/411 683/357/411 150/356/411 751/490/411 +f 754/500/412 1619/499/412 751/490/412 120/489/412 +f 151/358/413 684/361/413 1620/501/413 752/494/413 +f 684/361/414 149/346/414 756/502/414 1620/501/414 +f 1620/501/415 756/502/415 119/503/415 757/504/415 +f 752/494/416 1620/501/416 757/504/416 121/495/416 +f 116/505/417 759/506/417 1621/507/417 758/508/417 +f 759/506/418 146/328/418 677/345/418 1621/507/418 +f 1621/507/419 677/345/419 148/344/419 755/498/419 +f 758/508/420 1621/507/420 755/498/420 118/497/420 +f 149/346/421 678/349/421 1622/509/421 756/502/421 +f 678/349/422 147/331/422 760/510/422 1622/509/422 +f 1622/509/423 760/510/423 117/511/423 761/512/423 +f 756/502/424 1622/509/424 761/512/424 119/503/424 +f 114/513/425 763/514/425 1623/515/425 762/516/425 +f 763/514/426 164/330/426 670/329/426 1623/515/426 +f 1623/515/427 670/329/427 146/328/427 759/506/427 +f 762/516/428 1623/515/428 759/506/428 116/505/428 +f 147/331/429 671/334/429 1624/517/429 760/510/429 +f 671/334/430 165/339/430 764/518/430 1624/517/430 +f 1624/517/431 764/518/431 115/519/431 765/520/431 +f 760/510/432 1624/517/432 765/520/432 117/511/432 +f 114/513/433 766/521/433 1625/522/433 763/514/433 +f 766/521/434 181/523/434 767/524/434 1625/522/434 +f 1625/522/435 767/524/435 177/525/435 768/526/435 +f 763/514/436 1625/522/436 768/526/436 164/330/436 +f 177/525/437 770/527/437 1626/528/437 769/529/437 +f 770/527/438 182/530/438 771/531/438 1626/528/438 +f 1626/528/439 771/531/439 115/519/439 764/518/439 +f 769/529/440 1626/528/440 764/518/440 165/339/440 +f 110/445/441 728/448/441 1627/532/441 772/533/441 +f 728/448/442 162/428/442 725/441/442 1627/532/442 +f 1627/532/443 725/441/443 68/440/443 773/534/443 +f 772/533/444 1627/532/444 773/534/444 112/535/444 +f 68/440/445 726/443/445 1628/536/445 774/537/445 +f 726/443/446 163/430/446 733/456/446 1628/536/446 +f 1628/536/447 733/456/447 111/455/447 775/538/447 +f 774/537/448 1628/536/448 775/538/448 113/539/448 +f 112/535/449 773/534/449 1629/540/449 776/541/449 +f 773/534/450 68/440/450 777/542/450 1629/540/450 +f 1629/540/451 777/542/451 178/543/451 778/544/451 +f 776/541/452 1629/540/452 778/544/452 183/545/452 +f 178/543/453 777/542/453 1630/546/453 779/547/453 +f 777/542/454 68/440/454 774/537/454 1630/546/454 +f 1630/546/455 774/537/455 113/539/455 780/548/455 +f 779/547/456 1630/546/456 780/548/456 184/549/456 +f 177/525/457 767/524/457 1631/550/457 781/551/457 +f 767/524/458 181/523/458 782/552/458 1631/550/458 +f 1631/550/459 782/552/459 183/545/459 778/544/459 +f 781/551/460 1631/550/460 778/544/460 178/543/460 +f 184/549/461 783/553/461 1632/554/461 779/547/461 +f 783/553/462 182/530/462 770/527/462 1632/554/462 +f 1632/554/463 770/527/463 177/525/463 781/551/463 +f 779/547/464 1632/554/464 781/551/464 178/543/464 +f 135/555/465 785/556/465 1633/557/465 784/558/465 +f 785/556/466 137/559/466 786/560/466 1633/557/466 +f 1633/557/467 786/560/467 176/265/467 638/264/467 +f 784/558/468 1633/557/468 638/264/468 174/263/468 +f 176/265/469 786/560/469 1634/561/469 640/268/469 +f 786/560/470 137/559/470 787/562/470 1634/561/470 +f 1634/561/471 787/562/471 136/563/471 788/564/471 +f 640/268/472 1634/561/472 788/564/472 175/270/472 +f 133/565/473 790/566/473 1635/567/473 789/568/473 +f 790/566/474 135/555/474 784/558/474 1635/567/474 +f 1635/567/475 784/558/475 174/263/475 645/279/475 +f 789/568/476 1635/567/476 645/279/476 172/278/476 +f 175/270/477 788/564/477 1636/569/477 646/280/477 +f 788/564/478 136/563/478 791/570/478 1636/569/478 +f 1636/569/479 791/570/479 134/571/479 792/572/479 +f 646/280/480 1636/569/480 792/572/480 173/282/480 +f 131/573/481 794/574/481 1637/575/481 793/576/481 +f 794/574/482 133/565/482 789/568/482 1637/575/482 +f 1637/575/483 789/568/483 172/278/483 651/291/483 +f 793/576/484 1637/575/484 651/291/484 170/290/484 +f 173/282/485 792/572/485 1638/577/485 652/292/485 +f 792/572/486 134/571/486 795/578/486 1638/577/486 +f 1638/577/487 795/578/487 132/579/487 796/580/487 +f 652/292/488 1638/577/488 796/580/488 171/294/488 +f 166/314/489 797/581/489 1639/582/489 663/315/489 +f 797/581/490 187/583/490 798/584/490 1639/582/490 +f 1639/582/491 798/584/491 185/585/491 799/586/491 +f 663/315/492 1639/582/492 799/586/492 168/302/492 +f 186/587/493 801/588/493 1640/589/493 800/590/493 +f 801/588/494 188/591/494 802/592/494 1640/589/494 +f 1640/589/495 802/592/495 167/318/495 664/316/495 +f 800/590/496 1640/589/496 664/316/496 169/306/496 +f 131/573/497 793/576/497 1641/593/497 803/594/497 +f 793/576/498 170/290/498 657/303/498 1641/593/498 +f 1641/593/499 657/303/499 168/302/499 799/586/499 +f 803/594/500 1641/593/500 799/586/500 185/585/500 +f 169/306/501 658/304/501 1642/595/501 800/590/501 +f 658/304/502 171/294/502 796/580/502 1642/595/502 +f 1642/595/503 796/580/503 132/579/503 804/596/503 +f 800/590/504 1642/595/504 804/596/504 186/587/504 +f 144/597/505 806/598/505 1643/599/505 805/600/505 +f 806/598/506 190/601/506 807/602/506 1643/599/506 +f 1643/599/507 807/602/507 189/603/507 808/604/507 +f 805/600/508 1643/599/508 808/604/508 187/583/508 +f 189/603/509 807/602/509 1644/605/509 809/606/509 +f 807/602/510 190/601/510 810/607/510 1644/605/510 +f 1644/605/511 810/607/511 145/608/511 811/609/511 +f 809/606/512 1644/605/512 811/609/512 188/591/512 +f 185/585/513 798/584/513 1645/610/513 812/611/513 +f 798/584/514 187/583/514 808/604/514 1645/610/514 +f 1645/610/515 808/604/515 189/603/515 813/612/515 +f 812/611/516 1645/610/516 813/612/516 69/613/516 +f 189/603/515 809/606/515 1646/614/515 813/612/515 +f 809/606/517 188/591/517 801/588/517 1646/614/517 +f 1646/614/518 801/588/518 186/587/518 814/615/518 +f 813/612/519 1646/614/519 814/615/519 69/613/519 +f 130/616/520 816/617/520 1647/618/520 815/619/520 +f 816/617/521 131/573/521 803/594/521 1647/618/521 +f 1647/618/522 803/594/522 185/585/522 812/611/522 +f 815/619/523 1647/618/523 812/611/523 69/613/523 +f 186/587/524 804/596/524 1648/620/524 814/615/524 +f 804/596/525 132/579/525 817/621/525 1648/620/525 +f 1648/620/526 817/621/526 130/616/526 815/619/526 +f 814/615/527 1648/620/527 815/619/527 69/613/527 +f 142/622/528 819/623/528 1649/624/528 818/625/528 +f 819/623/529 193/626/529 820/627/529 1649/624/529 +f 1649/624/530 820/627/530 191/628/530 821/629/530 +f 818/625/531 1649/624/531 821/629/531 144/597/531 +f 192/630/532 823/631/532 1650/632/532 822/633/532 +f 823/631/533 194/634/533 824/635/533 1650/632/533 +f 1650/632/534 824/635/534 143/636/534 825/637/534 +f 822/633/535 1650/632/535 825/637/535 145/608/535 +f 140/638/536 827/639/536 1651/640/536 826/641/536 +f 827/639/537 195/642/537 828/643/537 1651/640/537 +f 1651/640/538 828/643/538 193/626/538 819/623/538 +f 826/641/539 1651/640/539 819/623/539 142/622/539 +f 194/634/540 829/644/540 1652/645/540 824/635/540 +f 829/644/541 196/646/541 830/647/541 1652/645/541 +f 1652/645/542 830/647/542 141/648/542 831/649/542 +f 824/635/543 1652/645/543 831/649/543 143/636/543 +f 139/650/544 833/651/544 1653/652/544 832/653/544 +f 833/651/545 197/654/545 834/655/545 1653/652/545 +f 1653/652/546 834/655/546 195/642/546 827/639/546 +f 832/653/547 1653/652/547 827/639/547 140/638/547 +f 196/646/548 835/656/548 1654/657/548 830/647/548 +f 835/656/549 198/658/549 836/659/549 1654/657/549 +f 1654/657/550 836/659/550 139/650/550 837/660/550 +f 830/647/551 1654/657/551 837/660/551 141/648/551 +f 138/661/552 839/662/552 1655/663/552 838/664/552 +f 839/662/553 71/665/553 840/666/553 1655/663/553 +f 1655/663/554 840/666/554 197/654/554 833/651/554 +f 838/664/555 1655/663/555 833/651/555 139/650/555 +f 198/658/556 841/667/556 1656/668/556 836/659/556 +f 841/667/557 71/665/557 839/662/557 1656/668/557 +f 1656/668/558 839/662/558 138/661/558 838/664/558 +f 836/659/559 1656/668/559 838/664/559 139/650/559 +f 190/601/560 806/598/560 1657/669/560 842/670/560 +f 806/598/561 144/597/561 821/629/561 1657/669/561 +f 1657/669/562 821/629/562 191/628/562 843/671/562 +f 842/670/563 1657/669/563 843/671/563 70/672/563 +f 192/630/564 822/633/564 1658/673/564 844/674/564 +f 822/633/565 145/608/565 810/607/565 1658/673/565 +f 1658/673/566 810/607/566 190/601/566 842/670/566 +f 844/674/567 1658/673/567 842/670/567 70/672/567 +f 70/672/568 843/671/568 1659/675/568 845/676/568 +f 843/671/569 191/628/569 846/677/569 1659/675/569 +f 1659/675/570 846/677/570 206/678/570 847/679/570 +f 845/676/571 1659/675/571 847/679/571 208/680/571 +f 207/681/572 849/682/572 1660/683/572 848/684/572 +f 849/682/573 192/630/573 844/674/573 1660/683/573 +f 1660/683/574 844/674/574 70/672/574 845/676/574 +f 848/684/575 1660/683/575 845/676/575 208/680/575 +f 71/665/576 850/685/576 1661/686/576 840/666/576 +f 850/685/577 199/687/577 851/688/577 1661/686/577 +f 1661/686/578 851/688/578 200/689/578 852/690/578 +f 840/666/579 1661/686/579 852/690/579 197/654/579 +f 201/691/580 854/692/580 1662/693/580 853/694/580 +f 854/692/581 199/687/581 850/685/581 1662/693/581 +f 1662/693/582 850/685/582 71/665/582 841/667/582 +f 853/694/583 1662/693/583 841/667/583 198/658/583 +f 197/654/584 852/690/584 1663/695/584 834/655/584 +f 852/690/585 200/689/585 855/696/585 1663/695/585 +f 1663/695/586 855/696/586 202/697/586 856/698/586 +f 834/655/587 1663/695/587 856/698/587 195/642/587 +f 203/699/588 858/700/588 1664/701/588 857/702/588 +f 858/700/589 201/691/589 853/694/589 1664/701/589 +f 1664/701/590 853/694/590 198/658/590 835/656/590 +f 857/702/591 1664/701/591 835/656/591 196/646/591 +f 195/642/592 856/698/592 1665/703/592 828/643/592 +f 856/698/593 202/697/593 859/704/593 1665/703/593 +f 1665/703/594 859/704/594 204/705/594 860/706/594 +f 828/643/595 1665/703/595 860/706/595 193/626/595 +f 205/707/596 862/708/596 1666/709/596 861/710/596 +f 862/708/597 203/699/597 857/702/597 1666/709/597 +f 1666/709/598 857/702/598 196/646/598 829/644/598 +f 861/710/599 1666/709/599 829/644/599 194/634/599 +f 193/626/600 860/706/600 1667/711/600 820/627/600 +f 860/706/601 204/705/601 863/712/601 1667/711/601 +f 1667/711/602 863/712/602 206/678/602 846/677/602 +f 820/627/603 1667/711/603 846/677/603 191/628/603 +f 207/681/604 864/713/604 1668/714/604 849/682/604 +f 864/713/605 205/707/605 861/710/605 1668/714/605 +f 1668/714/606 861/710/606 194/634/606 823/631/606 +f 849/682/607 1668/714/607 823/631/607 192/630/607 +f 199/687/608 865/715/608 1669/716/608 851/688/608 +f 865/715/609 204/705/609 859/704/609 1669/716/609 +f 1669/716/610 859/704/610 202/697/610 855/696/610 +f 851/688/611 1669/716/611 855/696/611 200/689/611 +f 203/699/612 862/708/612 1670/717/612 858/700/612 +f 862/708/613 205/707/613 866/718/613 1670/717/613 +f 1670/717/614 866/718/614 199/687/614 854/692/614 +f 858/700/615 1670/717/615 854/692/615 201/691/615 +f 199/687/616 867/719/616 1671/720/616 865/715/616 +f 867/719/617 208/680/617 847/679/617 1671/720/617 +f 1671/720/618 847/679/618 206/678/618 863/712/618 +f 865/715/619 1671/720/619 863/712/619 204/705/619 +f 207/681/620 848/684/620 1672/721/620 864/713/620 +f 848/684/621 208/680/621 867/719/621 1672/721/621 +f 1672/721/622 867/719/622 199/687/622 866/718/622 +f 864/713/623 1672/721/623 866/718/623 205/707/623 +f 139/650/624 832/653/624 1673/722/624 868/723/624 +f 832/653/625 140/638/625 869/724/625 1673/722/625 +f 1673/722/626 869/724/626 164/330/626 768/526/626 +f 868/723/627 1673/722/627 768/526/627 177/525/627 +f 165/339/628 870/725/628 1674/726/628 769/529/628 +f 870/725/629 141/648/629 837/660/629 1674/726/629 +f 1674/726/630 837/660/630 139/650/630 868/723/630 +f 769/529/631 1674/726/631 868/723/631 177/525/631 +f 140/638/632 826/641/632 1675/727/632 869/724/632 +f 826/641/633 142/622/633 871/728/633 1675/727/633 +f 1675/727/634 871/728/634 211/729/634 872/730/634 +f 869/724/635 1675/727/635 872/730/635 164/330/635 +f 212/731/636 874/732/636 1676/733/636 873/734/636 +f 874/732/637 143/636/637 831/649/637 1676/733/637 +f 1676/733/638 831/649/638 141/648/638 870/725/638 +f 873/734/639 1676/733/639 870/725/639 165/339/639 +f 142/622/640 818/625/640 1677/735/640 871/728/640 +f 818/625/641 144/597/641 875/736/641 1677/735/641 +f 1677/735/642 875/736/642 213/737/642 876/738/642 +f 871/728/643 1677/735/643 876/738/643 211/729/643 +f 214/739/644 878/740/644 1678/741/644 877/742/644 +f 878/740/645 145/608/645 825/637/645 1678/741/645 +f 1678/741/646 825/637/646 143/636/646 874/732/646 +f 877/742/647 1678/741/647 874/732/647 212/731/647 +f 144/597/648 805/600/648 1679/743/648 875/736/648 +f 805/600/649 187/583/649 797/581/649 1679/743/649 +f 1679/743/650 797/581/650 166/314/650 879/744/650 +f 875/736/651 1679/743/651 879/744/651 213/737/651 +f 167/318/652 802/592/652 1680/745/652 880/746/652 +f 802/592/653 188/591/653 811/609/653 1680/745/653 +f 1680/745/654 811/609/654 145/608/654 878/740/654 +f 880/746/655 1680/745/655 878/740/655 214/739/655 +f 81/310/656 881/747/656 1681/748/656 662/311/656 +f 881/747/657 209/749/657 882/750/657 1681/748/657 +f 1681/748/658 882/750/658 213/737/658 879/744/658 +f 662/311/659 1681/748/659 879/744/659 166/314/659 +f 214/739/660 883/751/660 1682/752/660 880/746/660 +f 883/751/661 210/753/661 884/754/661 1682/752/661 +f 1682/752/662 884/754/662 82/320/662 665/319/662 +f 880/746/663 1682/752/663 665/319/663 167/318/663 +f 209/749/664 885/755/664 1683/756/664 882/750/664 +f 885/755/665 215/757/665 886/758/665 1683/756/665 +f 1683/756/666 886/758/666 211/729/666 876/738/666 +f 882/750/667 1683/756/667 876/738/667 213/737/667 +f 212/731/668 887/759/668 1684/760/668 877/742/668 +f 887/759/669 216/761/669 888/762/669 1684/760/669 +f 1684/760/670 888/762/670 210/753/670 883/751/670 +f 877/742/671 1684/760/671 883/751/671 214/739/671 +f 79/322/672 667/325/672 1685/763/672 889/764/672 +f 667/325/673 164/330/673 872/730/673 1685/763/673 +f 1685/763/674 872/730/674 211/729/674 886/758/674 +f 889/764/675 1685/763/675 886/758/675 215/757/675 +f 212/731/676 873/734/676 1686/765/676 887/759/676 +f 873/734/677 165/339/677 674/338/677 1686/765/677 +f 1686/765/678 674/338/678 80/337/678 890/766/678 +f 887/759/679 1686/765/679 890/766/679 216/761/679 +f 131/573/680 816/617/680 1687/767/680 891/768/680 +f 816/617/681 130/616/681 892/769/681 1687/767/681 +f 1687/767/682 892/769/682 72/770/682 893/771/682 +f 891/768/683 1687/767/683 893/771/683 222/772/683 +f 72/770/684 892/769/684 1688/773/684 894/774/684 +f 892/769/685 130/616/685 817/621/685 1688/773/685 +f 1688/773/686 817/621/686 132/579/686 895/775/686 +f 894/774/687 1688/773/687 895/775/687 223/776/687 +f 133/565/688 794/574/688 1689/777/688 896/778/688 +f 794/574/689 131/573/689 891/768/689 1689/777/689 +f 1689/777/690 891/768/690 222/772/690 897/779/690 +f 896/778/691 1689/777/691 897/779/691 220/780/691 +f 223/776/692 895/775/692 1690/781/692 898/782/692 +f 895/775/693 132/579/693 795/578/693 1690/781/693 +f 1690/781/694 795/578/694 134/571/694 899/783/694 +f 898/782/695 1690/781/695 899/783/695 221/784/695 +f 135/555/696 790/566/696 1691/785/696 900/786/696 +f 790/566/697 133/565/697 896/778/697 1691/785/697 +f 1691/785/698 896/778/698 220/780/698 901/787/698 +f 900/786/699 1691/785/699 901/787/699 218/788/699 +f 221/784/700 899/783/700 1692/789/700 902/790/700 +f 899/783/701 134/571/701 791/570/701 1692/789/701 +f 1692/789/702 791/570/702 136/563/702 903/791/702 +f 902/790/703 1692/789/703 903/791/703 219/792/703 +f 137/559/704 785/556/704 1693/793/704 904/794/704 +f 785/556/705 135/555/705 900/786/705 1693/793/705 +f 1693/793/706 900/786/706 218/788/706 905/795/706 +f 904/794/707 1693/793/707 905/795/707 217/796/707 +f 219/792/708 903/791/708 1694/797/708 906/798/708 +f 903/791/709 136/563/709 787/562/709 1694/797/709 +f 1694/797/710 787/562/710 137/559/710 904/794/710 +f 906/798/711 1694/797/711 904/794/711 217/796/711 +f 217/796/712 905/795/712 1695/799/712 907/800/712 +f 905/795/713 218/788/713 908/801/713 1695/799/713 +f 1695/799/714 908/801/714 229/802/714 909/803/714 +f 907/800/715 1695/799/715 909/803/715 231/804/715 +f 230/805/716 911/806/716 1696/807/716 910/808/716 +f 911/806/717 219/792/717 906/798/717 1696/807/717 +f 1696/807/718 906/798/718 217/796/718 907/800/718 +f 910/808/719 1696/807/719 907/800/719 231/804/719 +f 218/788/720 901/787/720 1697/809/720 908/801/720 +f 901/787/721 220/780/721 912/810/721 1697/809/721 +f 1697/809/722 912/810/722 227/811/722 913/812/722 +f 908/801/723 1697/809/723 913/812/723 229/802/723 +f 228/813/724 915/814/724 1698/815/724 914/816/724 +f 915/814/725 221/784/725 902/790/725 1698/815/725 +f 1698/815/726 902/790/726 219/792/726 911/806/726 +f 914/816/727 1698/815/727 911/806/727 230/805/727 +f 220/780/728 897/779/728 1699/817/728 912/810/728 +f 897/779/729 222/772/729 916/818/729 1699/817/729 +f 1699/817/730 916/818/730 225/819/730 917/820/730 +f 912/810/731 1699/817/731 917/820/731 227/811/731 +f 226/821/732 919/822/732 1700/823/732 918/824/732 +f 919/822/733 223/776/733 898/782/733 1700/823/733 +f 1700/823/734 898/782/734 221/784/734 915/814/734 +f 918/824/735 1700/823/735 915/814/735 228/813/735 +f 222/772/736 893/771/736 1701/825/736 916/818/736 +f 893/771/737 72/770/737 920/826/737 1701/825/737 +f 1701/825/738 920/826/738 224/827/738 921/828/738 +f 916/818/739 1701/825/739 921/828/739 225/819/739 +f 224/827/740 920/826/740 1702/829/740 922/830/740 +f 920/826/741 72/770/741 894/774/741 1702/829/741 +f 1702/829/742 894/774/742 223/776/742 919/822/742 +f 922/830/743 1702/829/743 919/822/743 226/821/743 +f 224/827/744 923/831/744 1703/832/744 921/828/744 +f 923/831/745 231/804/745 909/803/745 1703/832/745 +f 1703/832/746 909/803/746 229/802/746 924/833/746 +f 921/828/747 1703/832/747 924/833/747 225/819/747 +f 230/805/748 910/808/748 1704/834/748 925/835/748 +f 910/808/749 231/804/749 923/831/749 1704/834/749 +f 1704/834/750 923/831/750 224/827/750 922/830/750 +f 925/835/751 1704/834/751 922/830/751 226/821/751 +f 225/819/752 924/833/752 1705/836/752 917/820/752 +f 229/802/753 913/812/753 1705/836/753 924/833/753 +f 227/811/754 917/820/754 1705/836/754 913/812/754 +f 228/813/755 914/816/755 1706/837/755 918/824/755 +f 230/805/756 925/835/756 1706/837/756 914/816/756 +f 226/821/757 918/824/757 1706/837/757 925/835/757 +f 183/545/758 782/552/758 1707/838/758 926/839/758 +f 782/552/759 181/523/759 927/840/759 1707/838/759 +f 1707/838/760 927/840/760 234/841/760 928/842/760 +f 926/839/761 1707/838/761 928/842/761 232/843/761 +f 235/844/762 930/845/762 1708/846/762 929/847/762 +f 930/845/763 182/530/763 783/553/763 1708/846/763 +f 1708/846/764 783/553/764 184/549/764 931/848/764 +f 929/847/765 1708/846/765 931/848/765 233/849/765 +f 112/535/766 776/541/766 1709/850/766 932/851/766 +f 776/541/767 183/545/767 926/839/767 1709/850/767 +f 1709/850/768 926/839/768 232/843/768 933/852/768 +f 932/851/769 1709/850/769 933/852/769 254/853/769 +f 233/849/770 931/848/770 1710/854/770 934/855/770 +f 931/848/771 184/549/771 780/548/771 1710/854/771 +f 1710/854/772 780/548/772 113/539/772 935/856/772 +f 934/855/773 1710/854/773 935/856/773 255/857/773 +f 110/445/774 772/533/774 1711/858/774 936/859/774 +f 772/533/775 112/535/775 932/851/775 1711/858/775 +f 1711/858/776 932/851/776 254/853/776 937/860/776 +f 936/859/777 1711/858/777 937/860/777 256/861/777 +f 255/857/778 935/856/778 1712/862/778 938/863/778 +f 935/856/779 113/539/779 775/538/779 1712/862/779 +f 1712/862/780 775/538/780 111/455/780 939/864/780 +f 938/863/781 1712/862/781 939/864/781 257/865/781 +f 181/523/782 766/521/782 1713/866/782 927/840/782 +f 766/521/783 114/513/783 940/867/783 1713/866/783 +f 1713/866/784 940/867/784 252/868/784 941/869/784 +f 927/840/785 1713/866/785 941/869/785 234/841/785 +f 253/870/786 943/871/786 1714/872/786 942/873/786 +f 943/871/787 115/519/787 771/531/787 1714/872/787 +f 1714/872/788 771/531/788 182/530/788 930/845/788 +f 942/873/789 1714/872/789 930/845/789 235/844/789 +f 114/513/790 762/516/790 1715/874/790 940/867/790 +f 762/516/791 116/505/791 944/875/791 1715/874/791 +f 1715/874/792 944/875/792 250/876/792 945/877/792 +f 940/867/793 1715/874/793 945/877/793 252/868/793 +f 251/878/794 947/879/794 1716/880/794 946/881/794 +f 947/879/795 117/511/795 765/520/795 1716/880/795 +f 1716/880/796 765/520/796 115/519/796 943/871/796 +f 946/881/797 1716/880/797 943/871/797 253/870/797 +f 116/505/798 758/508/798 1717/882/798 944/875/798 +f 758/508/799 118/497/799 948/883/799 1717/882/799 +f 1717/882/800 948/883/800 248/884/800 949/885/800 +f 944/875/801 1717/882/801 949/885/801 250/876/801 +f 249/886/802 951/887/802 1718/888/802 950/889/802 +f 951/887/803 119/503/803 761/512/803 1718/888/803 +f 1718/888/804 761/512/804 117/511/804 947/879/804 +f 950/889/805 1718/888/805 947/879/805 251/878/805 +f 118/497/806 754/500/806 1719/890/806 948/883/806 +f 754/500/807 120/489/807 952/891/807 1719/890/807 +f 1719/890/808 952/891/808 246/892/808 953/893/808 +f 948/883/809 1719/890/809 953/893/809 248/884/809 +f 247/894/810 955/895/810 1720/896/810 954/897/810 +f 955/895/811 121/495/811 757/504/811 1720/896/811 +f 1720/896/812 757/504/812 119/503/812 951/887/812 +f 954/897/813 1720/896/813 951/887/813 249/886/813 +f 120/489/814 750/492/814 1721/898/814 952/891/814 +f 750/492/815 122/481/815 956/899/815 1721/898/815 +f 1721/898/816 956/899/816 244/900/816 957/901/816 +f 952/891/817 1721/898/817 957/901/817 246/892/817 +f 245/902/818 959/903/818 1722/904/818 958/905/818 +f 959/903/819 123/487/819 753/496/819 1722/904/819 +f 1722/904/820 753/496/820 121/495/820 955/895/820 +f 958/905/821 1722/904/821 955/895/821 247/894/821 +f 122/481/822 746/484/822 1723/906/822 956/899/822 +f 746/484/823 124/473/823 960/907/823 1723/906/823 +f 1723/906/824 960/907/824 242/908/824 961/909/824 +f 956/899/825 1723/906/825 961/909/825 244/900/825 +f 243/910/826 963/911/826 1724/912/826 962/913/826 +f 963/911/827 125/479/827 749/488/827 1724/912/827 +f 1724/912/828 749/488/828 123/487/828 959/903/828 +f 962/913/829 1724/912/829 959/903/829 245/902/829 +f 124/473/830 742/476/830 1725/914/830 960/907/830 +f 742/476/831 126/465/831 964/915/831 1725/914/831 +f 1725/914/832 964/915/832 240/916/832 965/917/832 +f 960/907/833 1725/914/833 965/917/833 242/908/833 +f 241/918/834 967/919/834 1726/920/834 966/921/834 +f 967/919/835 127/471/835 745/480/835 1726/920/835 +f 1726/920/836 745/480/836 125/479/836 963/911/836 +f 966/921/837 1726/920/837 963/911/837 243/910/837 +f 126/465/838 738/468/838 1727/922/838 964/915/838 +f 738/468/839 179/459/839 968/923/839 1727/922/839 +f 1727/922/840 968/923/840 236/924/840 969/925/840 +f 964/915/841 1727/922/841 969/925/841 240/916/841 +f 237/926/842 971/927/842 1728/928/842 970/929/842 +f 971/927/843 180/463/843 741/472/843 1728/928/843 +f 1728/928/844 741/472/844 127/471/844 967/919/844 +f 970/929/845 1728/928/845 967/919/845 241/918/845 +f 179/459/846 734/457/846 1729/930/846 968/923/846 +f 734/457/847 128/449/847 972/931/847 1729/930/847 +f 1729/930/848 972/931/848 238/932/848 973/933/848 +f 968/923/849 1729/930/849 973/933/849 236/924/849 +f 239/934/850 975/935/850 1730/936/850 974/937/850 +f 975/935/851 129/453/851 737/464/851 1730/936/851 +f 1730/936/852 737/464/852 180/463/852 971/927/852 +f 974/937/853 1730/936/853 971/927/853 237/926/853 +f 128/449/854 729/446/854 1731/938/854 972/931/854 +f 729/446/855 110/445/855 936/859/855 1731/938/855 +f 1731/938/856 936/859/856 256/861/856 976/939/856 +f 972/931/857 1731/938/857 976/939/857 238/932/857 +f 257/865/858 939/864/858 1732/940/858 977/941/858 +f 939/864/859 111/455/859 732/454/859 1732/940/859 +f 1732/940/860 732/454/860 129/453/860 975/935/860 +f 977/941/861 1732/940/861 975/935/861 239/934/861 +f 238/932/862 976/939/862 1733/942/862 978/943/862 +f 976/939/863 256/861/863 979/944/863 1733/942/863 +f 1733/942/864 979/944/864 258/945/864 980/946/864 +f 978/943/865 1733/942/865 980/946/865 276/947/865 +f 259/948/866 982/949/866 1734/950/866 981/951/866 +f 982/949/867 257/865/867 977/941/867 1734/950/867 +f 1734/950/868 977/941/868 239/934/868 983/952/868 +f 981/951/869 1734/950/869 983/952/869 277/953/869 +f 236/924/870 973/933/870 1735/954/870 984/955/870 +f 973/933/871 238/932/871 978/943/871 1735/954/871 +f 1735/954/872 978/943/872 276/947/872 985/956/872 +f 984/955/873 1735/954/873 985/956/873 278/957/873 +f 277/953/874 983/952/874 1736/958/874 986/959/874 +f 983/952/875 239/934/875 974/937/875 1736/958/875 +f 1736/958/876 974/937/876 237/926/876 987/960/876 +f 986/959/877 1736/958/877 987/960/877 279/961/877 +f 240/916/878 969/925/878 1737/962/878 988/963/878 +f 969/925/879 236/924/879 984/955/879 1737/962/879 +f 1737/962/880 984/955/880 278/957/880 989/964/880 +f 988/963/881 1737/962/881 989/964/881 274/965/881 +f 279/961/882 987/960/882 1738/966/882 990/967/882 +f 987/960/883 237/926/883 970/929/883 1738/966/883 +f 1738/966/884 970/929/884 241/918/884 991/968/884 +f 990/967/885 1738/966/885 991/968/885 275/969/885 +f 242/908/886 965/917/886 1739/970/886 992/971/886 +f 965/917/887 240/916/887 988/963/887 1739/970/887 +f 1739/970/888 988/963/888 274/965/888 993/972/888 +f 992/971/889 1739/970/889 993/972/889 272/973/889 +f 275/969/890 991/968/890 1740/974/890 994/975/890 +f 991/968/891 241/918/891 966/921/891 1740/974/891 +f 1740/974/892 966/921/892 243/910/892 995/976/892 +f 994/975/893 1740/974/893 995/976/893 273/977/893 +f 244/900/894 961/909/894 1741/978/894 996/979/894 +f 961/909/895 242/908/895 992/971/895 1741/978/895 +f 1741/978/896 992/971/896 272/973/896 997/980/896 +f 996/979/897 1741/978/897 997/980/897 270/981/897 +f 273/977/898 995/976/898 1742/982/898 998/983/898 +f 995/976/899 243/910/899 962/913/899 1742/982/899 +f 1742/982/900 962/913/900 245/902/900 999/984/900 +f 998/983/901 1742/982/901 999/984/901 271/985/901 +f 246/892/902 957/901/902 1743/986/902 1000/987/902 +f 957/901/903 244/900/903 996/979/903 1743/986/903 +f 1743/986/904 996/979/904 270/981/904 1001/988/904 +f 1000/987/905 1743/986/905 1001/988/905 268/989/905 +f 271/985/906 999/984/906 1744/990/906 1002/991/906 +f 999/984/907 245/902/907 958/905/907 1744/990/907 +f 1744/990/908 958/905/908 247/894/908 1003/992/908 +f 1002/991/909 1744/990/909 1003/992/909 269/993/909 +f 248/884/910 953/893/910 1745/994/910 1004/995/910 +f 953/893/911 246/892/911 1000/987/911 1745/994/911 +f 1745/994/912 1000/987/912 268/989/912 1005/996/912 +f 1004/995/913 1745/994/913 1005/996/913 266/997/913 +f 269/993/914 1003/992/914 1746/998/914 1006/999/914 +f 1003/992/915 247/894/915 954/897/915 1746/998/915 +f 1746/998/916 954/897/916 249/886/916 1007/1000/916 +f 1006/999/917 1746/998/917 1007/1000/917 267/1001/917 +f 250/876/918 949/885/918 1747/1002/918 1008/1003/918 +f 949/885/919 248/884/919 1004/995/919 1747/1002/919 +f 1747/1002/920 1004/995/920 266/997/920 1009/1004/920 +f 1008/1003/921 1747/1002/921 1009/1004/921 264/1005/921 +f 267/1001/922 1007/1000/922 1748/1006/922 1010/1007/922 +f 1007/1000/923 249/886/923 950/889/923 1748/1006/923 +f 1748/1006/924 950/889/924 251/878/924 1011/1008/924 +f 1010/1007/925 1748/1006/925 1011/1008/925 265/1009/925 +f 252/868/926 945/877/926 1749/1010/926 1012/1011/926 +f 945/877/927 250/876/927 1008/1003/927 1749/1010/927 +f 1749/1010/928 1008/1003/928 264/1005/928 1013/1012/928 +f 1012/1011/929 1749/1010/929 1013/1012/929 262/1013/929 +f 265/1009/930 1011/1008/930 1750/1014/930 1014/1015/930 +f 1011/1008/931 251/878/931 946/881/931 1750/1014/931 +f 1750/1014/932 946/881/932 253/870/932 1015/1016/932 +f 1014/1015/933 1750/1014/933 1015/1016/933 263/1017/933 +f 234/841/934 941/869/934 1751/1018/934 1016/1019/934 +f 941/869/935 252/868/935 1012/1011/935 1751/1018/935 +f 1751/1018/936 1012/1011/936 262/1013/936 1017/1020/936 +f 1016/1019/937 1751/1018/937 1017/1020/937 280/1021/937 +f 263/1017/938 1015/1016/938 1752/1022/938 1018/1023/938 +f 1015/1016/939 253/870/939 942/873/939 1752/1022/939 +f 1752/1022/940 942/873/940 235/844/940 1019/1024/940 +f 1018/1023/941 1752/1022/941 1019/1024/941 281/1025/941 +f 256/861/942 937/860/942 1753/1026/942 979/944/942 +f 937/860/943 254/853/943 1020/1027/943 1753/1026/943 +f 1753/1026/944 1020/1027/944 260/1028/944 1021/1029/944 +f 979/944/945 1753/1026/945 1021/1029/945 258/945/945 +f 261/1030/946 1023/1031/946 1754/1032/946 1022/1033/946 +f 1023/1031/947 255/857/947 938/863/947 1754/1032/947 +f 1754/1032/948 938/863/948 257/865/948 982/949/948 +f 1022/1033/949 1754/1032/949 982/949/949 259/948/949 +f 254/853/950 933/852/950 1755/1034/950 1020/1027/950 +f 933/852/951 232/843/951 1024/1035/951 1755/1034/951 +f 1755/1034/952 1024/1035/952 282/1036/952 1025/1037/952 +f 1020/1027/953 1755/1034/953 1025/1037/953 260/1028/953 +f 283/1038/954 1027/1039/954 1756/1040/954 1026/1041/954 +f 1027/1039/955 233/849/955 934/855/955 1756/1040/955 +f 1756/1040/956 934/855/956 255/857/956 1023/1031/956 +f 1026/1041/957 1756/1040/957 1023/1031/957 261/1030/957 +f 232/843/958 928/842/958 1757/1042/958 1024/1035/958 +f 928/842/959 234/841/959 1016/1019/959 1757/1042/959 +f 1757/1042/960 1016/1019/960 280/1021/960 1028/1043/960 +f 1024/1035/961 1757/1042/961 1028/1043/961 282/1036/961 +f 281/1025/962 1019/1024/962 1758/1044/962 1029/1045/962 +f 1019/1024/963 235/844/963 929/847/963 1758/1044/963 +f 1758/1044/964 929/847/964 233/849/964 1027/1039/964 +f 1029/1045/965 1758/1044/965 1027/1039/965 283/1038/965 +f 67/438/966 723/436/966 1759/1046/966 1030/1047/966 +f 723/436/967 108/426/967 1031/1048/967 1759/1046/967 +f 1759/1046/968 1031/1048/968 284/1049/968 1032/1050/968 +f 1030/1047/969 1759/1046/969 1032/1050/969 73/1051/969 +f 285/1052/970 1034/1053/970 1760/1054/970 1033/1055/970 +f 1034/1053/971 109/434/971 727/444/971 1760/1054/971 +f 1760/1054/972 727/444/972 67/438/972 1030/1047/972 +f 1033/1055/973 1760/1054/973 1030/1047/973 73/1051/973 +f 108/426/974 717/424/974 1761/1056/974 1031/1048/974 +f 717/424/975 106/414/975 1035/1057/975 1761/1056/975 +f 1761/1056/976 1035/1057/976 286/1058/976 1036/1059/976 +f 1031/1048/977 1761/1056/977 1036/1059/977 284/1049/977 +f 287/1060/978 1038/1061/978 1762/1062/978 1037/1063/978 +f 1038/1061/979 107/422/979 722/435/979 1762/1062/979 +f 1762/1062/980 722/435/980 109/434/980 1034/1053/980 +f 1037/1063/981 1762/1062/981 1034/1053/981 285/1052/981 +f 106/414/982 711/412/982 1763/1064/982 1035/1057/982 +f 711/412/983 104/402/983 1039/1065/983 1763/1064/983 +f 1763/1064/984 1039/1065/984 288/1066/984 1040/1067/984 +f 1035/1057/985 1763/1064/985 1040/1067/985 286/1058/985 +f 289/1068/986 1042/1069/986 1764/1070/986 1041/1071/986 +f 1042/1069/987 105/410/987 716/423/987 1764/1070/987 +f 1764/1070/988 716/423/988 107/422/988 1038/1061/988 +f 1041/1071/989 1764/1070/989 1038/1061/989 287/1060/989 +f 104/402/990 705/400/990 1765/1072/990 1039/1065/990 +f 705/400/991 102/390/991 1043/1073/991 1765/1072/991 +f 1765/1072/992 1043/1073/992 290/1074/992 1044/1075/992 +f 1039/1065/993 1765/1072/993 1044/1075/993 288/1066/993 +f 291/1076/994 1046/1077/994 1766/1078/994 1045/1079/994 +f 1046/1077/995 103/398/995 710/411/995 1766/1078/995 +f 1766/1078/996 710/411/996 105/410/996 1042/1069/996 +f 1045/1079/997 1766/1078/997 1042/1069/997 289/1068/997 +f 102/390/998 699/388/998 1767/1080/998 1043/1073/998 +f 699/388/999 100/378/999 1047/1081/999 1767/1080/999 +f 1767/1080/1000 1047/1081/1000 292/1082/1000 1048/1083/1000 +f 1043/1073/1001 1767/1080/1001 1048/1083/1001 290/1074/1001 +f 293/1084/1002 1050/1085/1002 1768/1086/1002 1049/1087/1002 +f 1050/1085/1003 101/386/1003 704/399/1003 1768/1086/1003 +f 1768/1086/1004 704/399/1004 103/398/1004 1046/1077/1004 +f 1049/1087/1005 1768/1086/1005 1046/1077/1005 291/1076/1005 +f 100/378/1006 693/376/1006 1769/1088/1006 1047/1081/1006 +f 693/376/1007 98/366/1007 1051/1089/1007 1769/1088/1007 +f 1769/1088/1008 1051/1089/1008 294/1090/1008 1052/1091/1008 +f 1047/1081/1009 1769/1088/1009 1052/1091/1009 292/1082/1009 +f 295/1092/1010 1054/1093/1010 1770/1094/1010 1053/1095/1010 +f 1054/1093/1011 99/374/1011 698/387/1011 1770/1094/1011 +f 1770/1094/1012 698/387/1012 101/386/1012 1050/1085/1012 +f 1053/1095/1013 1770/1094/1013 1050/1085/1013 293/1084/1013 +f 98/366/1014 687/364/1014 1771/1096/1014 1051/1089/1014 +f 687/364/1015 96/354/1015 1055/1097/1015 1771/1096/1015 +f 1771/1096/1016 1055/1097/1016 296/1098/1016 1056/1099/1016 +f 1051/1089/1017 1771/1096/1017 1056/1099/1017 294/1090/1017 +f 297/1100/1018 1058/1101/1018 1772/1102/1018 1057/1103/1018 +f 1058/1101/1019 97/362/1019 692/375/1019 1772/1102/1019 +f 1772/1102/1020 692/375/1020 99/374/1020 1054/1093/1020 +f 1057/1103/1021 1772/1102/1021 1054/1093/1021 295/1092/1021 +f 96/354/1022 681/352/1022 1773/1104/1022 1055/1097/1022 +f 681/352/1023 94/342/1023 1059/1105/1023 1773/1104/1023 +f 1773/1104/1024 1059/1105/1024 298/1106/1024 1060/1107/1024 +f 1055/1097/1025 1773/1104/1025 1060/1107/1025 296/1098/1025 +f 299/1108/1026 1062/1109/1026 1774/1110/1026 1061/1111/1026 +f 1062/1109/1027 95/350/1027 686/363/1027 1774/1110/1027 +f 1774/1110/1028 686/363/1028 97/362/1028 1058/1101/1028 +f 1061/1111/1029 1774/1110/1029 1058/1101/1029 297/1100/1029 +f 94/342/1030 675/340/1030 1775/1112/1030 1059/1105/1030 +f 675/340/1031 92/326/1031 1063/1113/1031 1775/1112/1031 +f 1775/1112/1032 1063/1113/1032 300/1114/1032 1064/1115/1032 +f 1059/1105/1033 1775/1112/1033 1064/1115/1033 298/1106/1033 +f 301/1116/1034 1066/1117/1034 1776/1118/1034 1065/1119/1034 +f 1066/1117/1035 93/335/1035 680/351/1035 1776/1118/1035 +f 1776/1118/1036 680/351/1036 95/350/1036 1062/1109/1036 +f 1065/1119/1037 1776/1118/1037 1062/1109/1037 299/1108/1037 +f 308/1120/1038 1068/1121/1038 1777/1122/1038 1067/1123/1038 +f 1068/1121/1039 309/1124/1039 1069/1125/1039 1777/1122/1039 +f 1777/1122/1040 1069/1125/1040 328/1126/1040 1070/1127/1040 +f 1067/1123/1041 1777/1122/1041 1070/1127/1041 338/1128/1041 +f 329/1129/1042 1072/1130/1042 1778/1131/1042 1071/1132/1042 +f 1072/1130/1043 309/1133/1043 1068/1134/1043 1778/1131/1043 +f 1778/1131/1044 1068/1134/1044 308/1135/1044 1073/1136/1044 +f 1071/1132/1045 1778/1131/1045 1073/1136/1045 339/1137/1045 +f 307/1138/1046 1075/1139/1046 1779/1140/1046 1074/1141/1046 +f 1075/1139/1047 308/1120/1047 1067/1123/1047 1779/1140/1047 +f 1779/1140/1048 1067/1123/1048 338/1128/1048 1076/1142/1048 +f 1074/1141/1049 1779/1140/1049 1076/1142/1049 336/1143/1049 +f 339/1137/1050 1073/1136/1050 1780/1144/1050 1077/1145/1050 +f 1073/1136/1051 308/1135/1051 1075/1146/1051 1780/1144/1051 +f 1780/1144/1052 1075/1146/1052 307/1147/1052 1078/1148/1052 +f 1077/1145/1053 1780/1144/1053 1078/1148/1053 337/1149/1053 +f 306/1150/1054 1080/1151/1054 1781/1152/1054 1079/1153/1054 +f 1080/1151/1055 307/1138/1055 1074/1141/1055 1781/1152/1055 +f 1781/1152/1056 1074/1141/1056 336/1143/1056 1081/1154/1056 +f 1079/1153/1057 1781/1152/1057 1081/1154/1057 340/1155/1057 +f 337/1149/1058 1078/1148/1058 1782/1156/1058 1082/1157/1058 +f 1078/1148/1059 307/1147/1059 1080/1158/1059 1782/1156/1059 +f 1782/1156/1060 1080/1158/1060 306/1150/1060 1083/1159/1060 +f 1082/1157/1061 1782/1156/1061 1083/1159/1061 341/1160/1061 +f 89/259/1062 636/262/1062 1783/1161/1062 1084/1162/1062 +f 636/262/1063 91/267/1063 1085/1163/1063 1783/1161/1063 +f 1783/1161/1064 1085/1163/1064 306/1150/1064 1079/1153/1064 +f 1084/1162/1065 1783/1161/1065 1079/1153/1065 340/1155/1065 +f 306/1150/1066 1085/1163/1066 1784/1164/1066 1083/1159/1066 +f 1085/1163/1067 91/267/1067 642/273/1067 1784/1164/1067 +f 1784/1164/1068 642/273/1068 90/272/1068 1086/1165/1068 +f 1083/1159/1069 1784/1164/1069 1086/1165/1069 341/1160/1069 +f 87/274/1070 643/277/1070 1785/1166/1070 1087/1167/1070 +f 643/277/1071 89/259/1071 1084/1162/1071 1785/1166/1071 +f 1785/1166/1072 1084/1162/1072 340/1155/1072 1088/1168/1072 +f 1087/1167/1073 1785/1166/1073 1088/1168/1073 334/1169/1073 +f 341/1160/1074 1086/1165/1074 1786/1170/1074 1089/1171/1074 +f 1086/1165/1075 90/272/1075 648/285/1075 1786/1170/1075 +f 1786/1170/1076 648/285/1076 88/284/1076 1090/1172/1076 +f 1089/1171/1077 1786/1170/1077 1090/1172/1077 335/1173/1077 +f 85/286/1078 649/289/1078 1787/1174/1078 1091/1175/1078 +f 649/289/1079 87/274/1079 1087/1167/1079 1787/1174/1079 +f 1787/1174/1080 1087/1167/1080 334/1169/1080 1092/1176/1080 +f 1091/1175/1081 1787/1174/1081 1092/1176/1081 330/1177/1081 +f 335/1173/1082 1090/1172/1082 1788/1178/1082 1093/1179/1082 +f 1090/1172/1083 88/284/1083 654/297/1083 1788/1178/1083 +f 1788/1178/1084 654/297/1084 86/296/1084 1094/1180/1084 +f 1093/1179/1085 1788/1178/1085 1094/1180/1085 331/1181/1085 +f 83/298/1086 655/301/1086 1789/1182/1086 1095/1183/1086 +f 655/301/1087 85/286/1087 1091/1175/1087 1789/1182/1087 +f 1789/1182/1088 1091/1175/1088 330/1177/1088 1096/1184/1088 +f 1095/1183/1089 1789/1182/1089 1096/1184/1089 332/1185/1089 +f 331/1181/1090 1094/1180/1090 1790/1186/1090 1097/1187/1090 +f 1094/1180/1091 86/296/1091 660/309/1091 1790/1186/1091 +f 1790/1186/1092 660/309/1092 84/308/1092 1098/1188/1092 +f 1097/1187/1093 1790/1186/1093 1098/1188/1093 333/1189/1093 +f 330/1177/1094 1099/1190/1094 1791/1191/1094 1096/1184/1094 +f 1099/1190/1095 336/1143/1095 1076/1142/1095 1791/1191/1095 +f 1791/1191/1096 1076/1142/1096 338/1128/1096 1100/1192/1096 +f 1096/1184/1097 1791/1191/1097 1100/1192/1097 332/1185/1097 +f 339/1137/1098 1077/1145/1098 1792/1193/1098 1101/1194/1098 +f 1077/1145/1099 337/1149/1099 1102/1195/1099 1792/1193/1099 +f 1792/1193/1100 1102/1195/1100 331/1181/1100 1097/1187/1100 +f 1101/1194/1101 1792/1193/1101 1097/1187/1101 333/1189/1101 +f 330/1177/1102 1092/1176/1102 1793/1196/1102 1099/1190/1102 +f 1092/1176/1103 334/1169/1103 1088/1168/1103 1793/1196/1103 +f 1793/1196/1104 1088/1168/1104 340/1155/1104 1081/1154/1104 +f 1099/1190/1105 1793/1196/1105 1081/1154/1105 336/1143/1105 +f 341/1160/1106 1089/1171/1106 1794/1197/1106 1082/1157/1106 +f 1089/1171/1107 335/1173/1107 1093/1179/1107 1794/1197/1107 +f 1794/1197/1108 1093/1179/1108 331/1181/1108 1102/1195/1108 +f 1082/1157/1109 1794/1197/1109 1102/1195/1109 337/1149/1109 +f 326/1198/1110 1104/1199/1110 1795/1200/1110 1103/1201/1110 +f 1104/1199/1111 332/1185/1111 1100/1192/1111 1795/1200/1111 +f 1795/1200/1112 1100/1192/1112 338/1128/1112 1070/1127/1112 +f 1103/1201/1113 1795/1200/1113 1070/1127/1113 328/1126/1113 +f 339/1137/1114 1101/1194/1114 1796/1202/1114 1071/1132/1114 +f 1101/1194/1115 333/1189/1115 1105/1203/1115 1796/1202/1115 +f 1796/1202/1116 1105/1203/1116 327/1204/1116 1106/1205/1116 +f 1071/1132/1117 1796/1202/1117 1106/1205/1117 329/1129/1117 +f 81/310/1118 661/313/1118 1797/1206/1118 1107/1207/1118 +f 661/313/1119 83/298/1119 1095/1183/1119 1797/1206/1119 +f 1797/1206/1120 1095/1183/1120 332/1185/1120 1104/1199/1120 +f 1107/1207/1121 1797/1206/1121 1104/1199/1121 326/1198/1121 +f 333/1189/1122 1098/1188/1122 1798/1208/1122 1105/1203/1122 +f 1098/1188/1123 84/308/1123 666/321/1123 1798/1208/1123 +f 1798/1208/1124 666/321/1124 82/320/1124 1108/1209/1124 +f 1105/1203/1125 1798/1208/1125 1108/1209/1125 327/1204/1125 +f 209/749/1126 1109/1210/1126 1799/1211/1126 885/755/1126 +f 1109/1210/1127 342/1212/1127 1110/1213/1127 1799/1211/1127 +f 1799/1211/1128 1110/1213/1128 344/1214/1128 1111/1215/1128 +f 885/755/1129 1799/1211/1129 1111/1215/1129 215/757/1129 +f 345/1216/1130 1113/1217/1130 1800/1218/1130 1112/1219/1130 +f 1113/1217/1131 343/1220/1131 1114/1221/1131 1800/1218/1131 +f 1800/1218/1132 1114/1221/1132 210/753/1132 888/762/1132 +f 1112/1219/1133 1800/1218/1133 888/762/1133 216/761/1133 +f 81/310/1134 1107/1207/1134 1801/1222/1134 881/747/1134 +f 1107/1207/1135 326/1198/1135 1115/1223/1135 1801/1222/1135 +f 1801/1222/1136 1115/1223/1136 342/1212/1136 1109/1210/1136 +f 881/747/1137 1801/1222/1137 1109/1210/1137 209/749/1137 +f 343/1220/1138 1116/1224/1138 1802/1225/1138 1114/1221/1138 +f 1116/1224/1139 327/1204/1139 1108/1209/1139 1802/1225/1139 +f 1802/1225/1140 1108/1209/1140 82/320/1140 884/754/1140 +f 1114/1221/1141 1802/1225/1141 884/754/1141 210/753/1141 +f 79/322/1142 889/764/1142 1803/1226/1142 1117/1227/1142 +f 889/764/1143 215/757/1143 1111/1215/1143 1803/1226/1143 +f 1803/1226/1144 1111/1215/1144 344/1214/1144 1118/1228/1144 +f 1117/1227/1145 1803/1226/1145 1118/1228/1145 346/1229/1145 +f 345/1216/1146 1112/1219/1146 1804/1230/1146 1119/1231/1146 +f 1112/1219/1147 216/761/1147 890/766/1147 1804/1230/1147 +f 1804/1230/1148 890/766/1148 80/337/1148 1120/1232/1148 +f 1119/1231/1149 1804/1230/1149 1120/1232/1149 347/1233/1149 +f 79/322/1150 1117/1227/1150 1805/1234/1150 668/323/1150 +f 1117/1227/1151 346/1229/1151 1121/1235/1151 1805/1234/1151 +f 1805/1234/1152 1121/1235/1152 300/1114/1152 1063/1113/1152 +f 668/323/1153 1805/1234/1153 1063/1113/1153 92/326/1153 +f 301/1116/1154 1122/1236/1154 1806/1237/1154 1066/1117/1154 +f 1122/1236/1155 347/1233/1155 1120/1232/1155 1806/1237/1155 +f 1806/1237/1156 1120/1232/1156 80/337/1156 673/336/1156 +f 1066/1117/1157 1806/1237/1157 673/336/1157 93/335/1157 +f 77/1238/1158 1124/1239/1158 1807/1240/1158 1123/1241/1158 +f 1124/1239/1159 324/1242/1159 1125/1243/1159 1807/1240/1159 +f 1807/1240/1160 1125/1243/1160 352/1244/1160 1126/1245/1160 +f 1123/1241/1161 1807/1240/1161 1126/1245/1161 304/1246/1161 +f 353/1247/1162 1128/1248/1162 1808/1249/1162 1127/1250/1162 +f 1128/1248/1163 325/1251/1163 1129/1252/1163 1808/1249/1163 +f 1808/1249/1164 1129/1252/1164 77/1253/1164 1123/1254/1164 +f 1127/1250/1165 1808/1249/1165 1123/1254/1165 304/1255/1165 +f 304/1246/1166 1126/1245/1166 1809/1256/1166 1130/1257/1166 +f 1126/1245/1167 352/1244/1167 1131/1258/1167 1809/1256/1167 +f 1809/1256/1168 1131/1258/1168 350/1259/1168 1132/1260/1168 +f 1130/1257/1169 1809/1256/1169 1132/1260/1169 78/1261/1169 +f 351/1262/1170 1134/1263/1170 1810/1264/1170 1133/1265/1170 +f 1134/1263/1171 353/1247/1171 1127/1250/1171 1810/1264/1171 +f 1810/1264/1172 1127/1250/1172 304/1255/1172 1130/1266/1172 +f 1133/1265/1173 1810/1264/1173 1130/1266/1173 78/1267/1173 +f 78/1261/1174 1132/1260/1174 1811/1268/1174 1135/1269/1174 +f 1132/1260/1175 350/1259/1175 1136/1270/1175 1811/1268/1175 +f 1811/1268/1176 1136/1270/1176 348/1271/1176 1137/1272/1176 +f 1135/1269/1177 1811/1268/1177 1137/1272/1177 305/1273/1177 +f 349/1274/1178 1139/1275/1178 1812/1276/1178 1138/1277/1178 +f 1139/1275/1179 351/1262/1179 1133/1265/1179 1812/1276/1179 +f 1812/1276/1180 1133/1265/1180 78/1267/1180 1135/1278/1180 +f 1138/1277/1181 1812/1276/1181 1135/1278/1181 305/1279/1181 +f 305/1273/1182 1137/1272/1182 1813/1280/1182 1140/1281/1182 +f 1137/1272/1183 348/1271/1183 1141/1282/1183 1813/1280/1183 +f 1813/1280/1184 1141/1282/1184 328/1126/1184 1069/1125/1184 +f 1140/1281/1185 1813/1280/1185 1069/1125/1185 309/1124/1185 +f 329/1129/1186 1142/1283/1186 1814/1284/1186 1072/1130/1186 +f 1142/1283/1187 349/1274/1187 1138/1277/1187 1814/1284/1187 +f 1814/1284/1188 1138/1277/1188 305/1279/1188 1140/1285/1188 +f 1072/1130/1189 1814/1284/1189 1140/1285/1189 309/1133/1189 +f 326/1198/1190 1103/1201/1190 1815/1286/1190 1115/1223/1190 +f 1103/1201/1191 328/1126/1191 1141/1282/1191 1815/1286/1191 +f 1815/1286/1192 1141/1282/1192 348/1271/1192 1143/1287/1192 +f 1115/1223/1193 1815/1286/1193 1143/1287/1193 342/1212/1193 +f 349/1274/1194 1142/1283/1194 1816/1288/1194 1144/1289/1194 +f 1142/1283/1195 329/1129/1195 1106/1205/1195 1816/1288/1195 +f 1816/1288/1196 1106/1205/1196 327/1204/1196 1116/1224/1196 +f 1144/1289/1197 1816/1288/1197 1116/1224/1197 343/1220/1197 +f 296/1098/1198 1060/1107/1198 1817/1290/1198 1145/1291/1198 +f 1060/1107/1199 298/1106/1199 1146/1292/1199 1817/1290/1199 +f 1817/1290/1200 1146/1292/1200 318/1293/1200 1147/1294/1200 +f 1145/1291/1201 1817/1290/1201 1147/1294/1201 310/1295/1201 +f 319/1296/1202 1149/1297/1202 1818/1298/1202 1148/1299/1202 +f 1149/1297/1203 299/1108/1203 1061/1111/1203 1818/1298/1203 +f 1818/1298/1204 1061/1111/1204 297/1100/1204 1150/1300/1204 +f 1148/1299/1205 1818/1298/1205 1150/1300/1205 311/1301/1205 +f 76/1302/1206 1152/1303/1206 1819/1304/1206 1151/1305/1206 +f 1152/1303/1207 316/1306/1207 1153/1307/1207 1819/1304/1207 +f 1819/1304/1208 1153/1307/1208 324/1242/1208 1124/1239/1208 +f 1151/1305/1209 1819/1304/1209 1124/1239/1209 77/1238/1209 +f 325/1251/1210 1154/1308/1210 1820/1309/1210 1129/1252/1210 +f 1154/1308/1211 317/1310/1211 1155/1311/1211 1820/1309/1211 +f 1820/1309/1212 1155/1311/1212 76/1312/1212 1151/1313/1212 +f 1129/1252/1213 1820/1309/1213 1151/1313/1213 77/1253/1213 +f 302/1314/1214 1157/1315/1214 1821/1316/1214 1156/1317/1214 +f 1157/1315/1215 358/1318/1215 1158/1319/1215 1821/1316/1215 +f 1821/1316/1216 1158/1319/1216 356/1320/1216 1159/1321/1216 +f 1156/1317/1217 1821/1316/1217 1159/1321/1217 303/1322/1217 +f 357/1323/1218 1161/1324/1218 1822/1325/1218 1160/1326/1218 +f 1161/1324/1219 359/1327/1219 1162/1328/1219 1822/1325/1219 +f 1822/1325/1220 1162/1328/1220 302/1329/1220 1156/1330/1220 +f 1160/1326/1221 1822/1325/1221 1156/1330/1221 303/1331/1221 +f 303/1322/1222 1159/1321/1222 1823/1332/1222 1163/1333/1222 +f 1159/1321/1223 356/1320/1223 1164/1334/1223 1823/1332/1223 +f 1823/1332/1224 1164/1334/1224 354/1335/1224 1165/1336/1224 +f 1163/1333/1225 1823/1332/1225 1165/1336/1225 75/1337/1225 +f 355/1338/1226 1167/1339/1226 1824/1340/1226 1166/1341/1226 +f 1167/1339/1227 357/1323/1227 1160/1326/1227 1824/1340/1227 +f 1824/1340/1228 1160/1326/1228 303/1331/1228 1163/1342/1228 +f 1166/1341/1229 1824/1340/1229 1163/1342/1229 75/1343/1229 +f 75/1337/1230 1165/1336/1230 1825/1344/1230 1168/1345/1230 +f 1165/1336/1231 354/1335/1231 1169/1346/1231 1825/1344/1231 +f 1825/1344/1232 1169/1346/1232 316/1306/1232 1152/1303/1232 +f 1168/1345/1233 1825/1344/1233 1152/1303/1233 76/1302/1233 +f 317/1310/1234 1170/1347/1234 1826/1348/1234 1155/1311/1234 +f 1170/1347/1235 355/1338/1235 1166/1341/1235 1826/1348/1235 +f 1826/1348/1236 1166/1341/1236 75/1343/1236 1168/1349/1236 +f 1155/1311/1237 1826/1348/1237 1168/1349/1237 76/1312/1237 +f 292/1350/1238 1052/1351/1238 1827/1352/1238 1171/1353/1238 +f 1052/1351/1239 294/1090/1239 1172/1354/1239 1827/1352/1239 +f 1827/1352/1240 1172/1354/1240 362/1355/1240 1173/1356/1240 +f 1171/1353/1241 1827/1352/1241 1173/1356/1241 364/1357/1241 +f 363/1358/1242 1175/1359/1242 1828/1360/1242 1174/1361/1242 +f 1175/1359/1243 295/1092/1243 1053/1362/1243 1828/1360/1243 +f 1828/1360/1244 1053/1362/1244 293/1363/1244 1176/1364/1244 +f 1174/1361/1245 1828/1360/1245 1176/1364/1245 365/1365/1245 +f 364/1357/1246 1173/1356/1246 1829/1366/1246 1177/1367/1246 +f 1173/1356/1247 362/1355/1247 1178/1368/1247 1829/1366/1247 +f 1829/1366/1248 1178/1368/1248 368/1369/1248 1179/1370/1248 +f 1177/1367/1249 1829/1366/1249 1179/1370/1249 366/1371/1249 +f 369/1372/1250 1181/1373/1250 1830/1374/1250 1180/1375/1250 +f 1181/1373/1251 363/1358/1251 1174/1361/1251 1830/1374/1251 +f 1830/1374/1252 1174/1361/1252 365/1365/1252 1182/1376/1252 +f 1180/1375/1253 1830/1374/1253 1182/1376/1253 367/1377/1253 +f 366/1371/1254 1179/1370/1254 1831/1378/1254 1183/1379/1254 +f 1179/1370/1255 368/1369/1255 1184/1380/1255 1831/1378/1255 +f 1831/1378/1256 1184/1380/1256 370/1381/1256 1185/1382/1256 +f 1183/1379/1257 1831/1378/1257 1185/1382/1257 372/1383/1257 +f 371/1384/1258 1187/1385/1258 1832/1386/1258 1186/1387/1258 +f 1187/1385/1259 369/1372/1259 1180/1375/1259 1832/1386/1259 +f 1832/1386/1260 1180/1375/1260 367/1377/1260 1188/1388/1260 +f 1186/1387/1261 1832/1386/1261 1188/1388/1261 373/1389/1261 +f 372/1383/1262 1185/1382/1262 1833/1390/1262 1189/1391/1262 +f 1185/1382/1263 370/1381/1263 1190/1392/1263 1833/1390/1263 +f 1833/1390/1264 1190/1392/1264 376/1393/1264 1191/1394/1264 +f 1189/1391/1265 1833/1390/1265 1191/1394/1265 374/1395/1265 +f 377/1396/1266 1193/1397/1266 1834/1398/1266 1192/1399/1266 +f 1193/1397/1267 371/1384/1267 1186/1387/1267 1834/1398/1267 +f 1834/1398/1268 1186/1387/1268 373/1389/1268 1194/1400/1268 +f 1192/1399/1269 1834/1398/1269 1194/1400/1269 375/1401/1269 +f 314/1402/1270 1196/1403/1270 1835/1404/1270 1195/1405/1270 +f 1196/1403/1271 378/1406/1271 1197/1407/1271 1835/1404/1271 +f 1835/1404/1272 1197/1407/1272 374/1395/1272 1191/1394/1272 +f 1195/1405/1273 1835/1404/1273 1191/1394/1273 376/1393/1273 +f 375/1401/1274 1198/1408/1274 1836/1409/1274 1192/1399/1274 +f 1198/1408/1275 379/1410/1275 1199/1411/1275 1836/1409/1275 +f 1836/1409/1276 1199/1411/1276 315/1412/1276 1200/1413/1276 +f 1192/1399/1277 1836/1409/1277 1200/1413/1277 377/1396/1277 +f 316/1306/1278 1169/1346/1278 1837/1414/1278 1201/1415/1278 +f 1169/1346/1279 354/1335/1279 1202/1416/1279 1837/1414/1279 +f 1837/1414/1280 1202/1416/1280 374/1395/1280 1197/1407/1280 +f 1201/1415/1281 1837/1414/1281 1197/1407/1281 378/1406/1281 +f 375/1401/1282 1203/1417/1282 1838/1418/1282 1198/1408/1282 +f 1203/1417/1283 355/1338/1283 1170/1347/1283 1838/1418/1283 +f 1838/1418/1284 1170/1347/1284 317/1310/1284 1204/1419/1284 +f 1198/1408/1285 1838/1418/1285 1204/1419/1285 379/1410/1285 +f 354/1335/1286 1164/1334/1286 1839/1420/1286 1202/1416/1286 +f 1164/1334/1287 356/1320/1287 1205/1421/1287 1839/1420/1287 +f 1839/1420/1288 1205/1421/1288 372/1383/1288 1189/1391/1288 +f 1202/1416/1289 1839/1420/1289 1189/1391/1289 374/1395/1289 +f 373/1389/1290 1206/1422/1290 1840/1423/1290 1194/1400/1290 +f 1206/1422/1291 357/1323/1291 1167/1339/1291 1840/1423/1291 +f 1840/1423/1292 1167/1339/1292 355/1338/1292 1203/1417/1292 +f 1194/1400/1293 1840/1423/1293 1203/1417/1293 375/1401/1293 +f 356/1320/1294 1158/1319/1294 1841/1424/1294 1205/1421/1294 +f 1158/1319/1295 358/1318/1295 1207/1425/1295 1841/1424/1295 +f 1841/1424/1296 1207/1425/1296 366/1371/1296 1183/1379/1296 +f 1205/1421/1297 1841/1424/1297 1183/1379/1297 372/1383/1297 +f 367/1377/1298 1208/1426/1298 1842/1427/1298 1188/1388/1298 +f 1208/1426/1299 359/1327/1299 1161/1324/1299 1842/1427/1299 +f 1842/1427/1300 1161/1324/1300 357/1323/1300 1206/1422/1300 +f 1188/1388/1301 1842/1427/1301 1206/1422/1301 373/1389/1301 +f 358/1318/1302 1209/1428/1302 1843/1429/1302 1207/1425/1302 +f 1209/1428/1303 360/1430/1303 1210/1431/1303 1843/1429/1303 +f 1843/1429/1304 1210/1431/1304 364/1357/1304 1177/1367/1304 +f 1207/1425/1305 1843/1429/1305 1177/1367/1305 366/1371/1305 +f 365/1365/1306 1211/1432/1306 1844/1433/1306 1182/1376/1306 +f 1211/1432/1307 361/1434/1307 1212/1435/1307 1844/1433/1307 +f 1844/1433/1308 1212/1435/1308 359/1327/1308 1208/1426/1308 +f 1182/1376/1309 1844/1433/1309 1208/1426/1309 367/1377/1309 +f 290/1436/1310 1048/1437/1310 1845/1438/1310 1213/1439/1310 +f 1048/1437/1311 292/1350/1311 1171/1353/1311 1845/1438/1311 +f 1845/1438/1312 1171/1353/1312 364/1357/1312 1210/1431/1312 +f 1213/1439/1313 1845/1438/1313 1210/1431/1313 360/1430/1313 +f 365/1365/1314 1176/1364/1314 1846/1440/1314 1211/1432/1314 +f 1176/1364/1315 293/1363/1315 1049/1441/1315 1846/1440/1315 +f 1846/1440/1316 1049/1441/1316 291/1442/1316 1214/1443/1316 +f 1211/1432/1317 1846/1440/1317 1214/1443/1317 361/1434/1317 +f 74/1444/1318 1216/1445/1318 1847/1446/1318 1215/1447/1318 +f 1216/1445/1319 360/1430/1319 1209/1428/1319 1847/1446/1319 +f 1847/1446/1320 1209/1428/1320 358/1318/1320 1157/1315/1320 +f 1215/1447/1321 1847/1446/1321 1157/1315/1321 302/1314/1321 +f 359/1327/1322 1212/1435/1322 1848/1448/1322 1162/1328/1322 +f 1212/1435/1323 361/1434/1323 1217/1449/1323 1848/1448/1323 +f 1848/1448/1324 1217/1449/1324 74/1450/1324 1215/1451/1324 +f 1162/1328/1325 1848/1448/1325 1215/1451/1325 302/1329/1325 +f 284/1452/1326 1036/1453/1326 1849/1454/1326 1218/1455/1326 +f 1036/1453/1327 286/1456/1327 1040/1457/1327 1849/1454/1327 +f 1849/1454/1328 1040/1457/1328 288/1458/1328 1044/1459/1328 +f 1218/1455/1329 1849/1454/1329 1044/1459/1329 290/1436/1329 +f 289/1460/1330 1041/1461/1330 1850/1462/1330 1045/1463/1330 +f 1041/1461/1331 287/1464/1331 1037/1465/1331 1850/1462/1331 +f 1850/1462/1332 1037/1465/1332 285/1466/1332 1219/1467/1332 +f 1045/1463/1333 1850/1462/1333 1219/1467/1333 291/1442/1333 +f 284/1452/1334 1218/1455/1334 1851/1468/1334 1220/1469/1334 +f 1218/1455/1335 290/1436/1335 1213/1439/1335 1851/1468/1335 +f 1851/1468/1336 1213/1439/1336 360/1430/1336 1216/1445/1336 +f 1220/1469/1337 1851/1468/1337 1216/1445/1337 74/1444/1337 +f 361/1434/1338 1214/1443/1338 1852/1470/1338 1217/1449/1338 +f 1214/1443/1339 291/1442/1339 1219/1467/1339 1852/1470/1339 +f 1852/1470/1340 1219/1467/1340 285/1466/1340 1221/1471/1340 +f 1217/1449/1341 1852/1470/1341 1221/1471/1341 74/1450/1341 +f 73/1472/1342 1032/1473/1342 1853/1474/1342 1222/1475/1342 +f 284/1452/1343 1220/1469/1343 1853/1474/1343 1032/1473/1343 +f 74/1444/1344 1222/1475/1344 1853/1474/1344 1220/1469/1344 +f 74/1450/1345 1221/1471/1345 1854/1476/1345 1222/1477/1345 +f 285/1466/1346 1033/1478/1346 1854/1476/1346 1221/1471/1346 +f 73/1479/1347 1222/1477/1347 1854/1476/1347 1033/1478/1347 +f 294/1090/1348 1056/1099/1348 1855/1480/1348 1172/1354/1348 +f 1056/1099/1349 296/1098/1349 1145/1291/1349 1855/1480/1349 +f 1855/1480/1350 1145/1291/1350 310/1295/1350 1223/1481/1350 +f 1172/1354/1351 1855/1480/1351 1223/1481/1351 362/1355/1351 +f 311/1301/1352 1150/1300/1352 1856/1482/1352 1224/1483/1352 +f 1150/1300/1353 297/1100/1353 1057/1103/1353 1856/1482/1353 +f 1856/1482/1354 1057/1103/1354 295/1092/1354 1175/1359/1354 +f 1224/1483/1355 1856/1482/1355 1175/1359/1355 363/1358/1355 +f 310/1295/1356 1225/1484/1356 1857/1485/1356 1223/1481/1356 +f 1225/1484/1357 312/1486/1357 1226/1487/1357 1857/1485/1357 +f 1857/1485/1358 1226/1487/1358 368/1369/1358 1178/1368/1358 +f 1223/1481/1359 1857/1485/1359 1178/1368/1359 362/1355/1359 +f 369/1372/1360 1227/1488/1360 1858/1489/1360 1181/1373/1360 +f 1227/1488/1361 313/1490/1361 1228/1491/1361 1858/1489/1361 +f 1858/1489/1362 1228/1491/1362 311/1301/1362 1224/1483/1362 +f 1181/1373/1363 1858/1489/1363 1224/1483/1363 363/1358/1363 +f 312/1486/1364 1229/1492/1364 1859/1493/1364 1226/1487/1364 +f 1229/1492/1365 382/1494/1365 1230/1495/1365 1859/1493/1365 +f 1859/1493/1366 1230/1495/1366 370/1381/1366 1184/1380/1366 +f 1226/1487/1367 1859/1493/1367 1184/1380/1367 368/1369/1367 +f 371/1384/1368 1231/1496/1368 1860/1497/1368 1187/1385/1368 +f 1231/1496/1369 383/1498/1369 1232/1499/1369 1860/1497/1369 +f 1860/1497/1370 1232/1499/1370 313/1490/1370 1227/1488/1370 +f 1187/1385/1371 1860/1497/1371 1227/1488/1371 369/1372/1371 +f 314/1402/1372 1195/1405/1372 1861/1500/1372 1233/1501/1372 +f 1195/1405/1373 376/1393/1373 1190/1392/1373 1861/1500/1373 +f 1861/1500/1374 1190/1392/1374 370/1381/1374 1230/1495/1374 +f 1233/1501/1375 1861/1500/1375 1230/1495/1375 382/1494/1375 +f 371/1384/1376 1193/1397/1376 1862/1502/1376 1231/1496/1376 +f 1193/1397/1377 377/1396/1377 1200/1413/1377 1862/1502/1377 +f 1862/1502/1378 1200/1413/1378 315/1412/1378 1234/1503/1378 +f 1231/1496/1379 1862/1502/1379 1234/1503/1379 383/1498/1379 +f 348/1271/1380 1136/1270/1380 1863/1504/1380 1235/1505/1380 +f 1136/1270/1381 350/1259/1381 1236/1506/1381 1863/1504/1381 +f 1863/1504/1382 1236/1506/1382 386/1507/1382 1237/1508/1382 +f 1235/1505/1383 1863/1504/1383 1237/1508/1383 384/1509/1383 +f 387/1510/1384 1239/1511/1384 1864/1512/1384 1238/1513/1384 +f 1239/1511/1385 351/1262/1385 1139/1275/1385 1864/1512/1385 +f 1864/1512/1386 1139/1275/1386 349/1274/1386 1240/1514/1386 +f 1238/1513/1387 1864/1512/1387 1240/1514/1387 385/1515/1387 +f 318/1293/1388 1242/1516/1388 1865/1517/1388 1241/1518/1388 +f 1242/1516/1389 384/1509/1389 1237/1508/1389 1865/1517/1389 +f 1865/1517/1390 1237/1508/1390 386/1507/1390 1243/1519/1390 +f 1241/1518/1391 1865/1517/1391 1243/1519/1391 320/1520/1391 +f 387/1510/1392 1238/1513/1392 1866/1521/1392 1244/1522/1392 +f 1238/1513/1393 385/1515/1393 1245/1523/1393 1866/1521/1393 +f 1866/1521/1394 1245/1523/1394 319/1296/1394 1246/1524/1394 +f 1244/1522/1395 1866/1521/1395 1246/1524/1395 321/1525/1395 +f 298/1106/1396 1064/1115/1396 1867/1526/1396 1146/1292/1396 +f 1064/1115/1397 300/1114/1397 1247/1527/1397 1867/1526/1397 +f 1867/1526/1398 1247/1527/1398 384/1509/1398 1242/1516/1398 +f 1146/1292/1399 1867/1526/1399 1242/1516/1399 318/1293/1399 +f 385/1515/1400 1248/1528/1400 1868/1529/1400 1245/1523/1400 +f 1248/1528/1401 301/1116/1401 1065/1119/1401 1868/1529/1401 +f 1868/1529/1402 1065/1119/1402 299/1108/1402 1149/1297/1402 +f 1245/1523/1403 1868/1529/1403 1149/1297/1403 319/1296/1403 +f 300/1114/1404 1249/1530/1404 1869/1531/1404 1247/1527/1404 +f 1249/1530/1405 344/1214/1405 1110/1213/1405 1869/1531/1405 +f 1869/1531/1406 1110/1213/1406 342/1212/1406 1250/1532/1406 +f 1247/1527/1407 1869/1531/1407 1250/1532/1407 384/1509/1407 +f 343/1220/1408 1113/1217/1408 1870/1533/1408 1251/1534/1408 +f 1113/1217/1409 345/1216/1409 1252/1535/1409 1870/1533/1409 +f 1870/1533/1410 1252/1535/1410 301/1116/1410 1248/1528/1410 +f 1251/1534/1411 1870/1533/1411 1248/1528/1411 385/1515/1411 +f 342/1212/1412 1143/1287/1412 1871/1536/1412 1250/1532/1412 +f 348/1271/1413 1235/1505/1413 1871/1536/1413 1143/1287/1413 +f 384/1509/1414 1250/1532/1414 1871/1536/1414 1235/1505/1414 +f 385/1515/1415 1240/1514/1415 1872/1537/1415 1251/1534/1415 +f 349/1274/1416 1144/1289/1416 1872/1537/1416 1240/1514/1416 +f 343/1220/1417 1251/1534/1417 1872/1537/1417 1144/1289/1417 +f 300/1114/1418 1121/1235/1418 1873/1538/1418 1249/1530/1418 +f 346/1229/1419 1118/1228/1419 1873/1538/1419 1121/1235/1419 +f 344/1214/1420 1249/1530/1420 1873/1538/1420 1118/1228/1420 +f 345/1216/1421 1119/1231/1421 1874/1539/1421 1252/1535/1421 +f 347/1233/1422 1122/1236/1422 1874/1539/1422 1119/1231/1422 +f 301/1116/1423 1252/1535/1423 1874/1539/1423 1122/1236/1423 +f 314/1402/1424 1253/1540/1424 1875/1541/1424 1196/1403/1424 +f 1253/1540/1425 322/1542/1425 1254/1543/1425 1875/1541/1425 +f 1875/1541/1426 1254/1543/1426 380/1544/1426 1255/1545/1426 +f 1196/1403/1427 1875/1541/1427 1255/1545/1427 378/1406/1427 +f 381/1546/1428 1257/1547/1428 1876/1548/1428 1256/1549/1428 +f 1257/1547/1429 323/1550/1429 1258/1551/1429 1876/1548/1429 +f 1876/1548/1430 1258/1551/1430 315/1412/1430 1199/1411/1430 +f 1256/1549/1431 1876/1548/1431 1199/1411/1431 379/1410/1431 +f 316/1306/1432 1201/1415/1432 1877/1552/1432 1153/1307/1432 +f 1201/1415/1433 378/1406/1433 1255/1545/1433 1877/1552/1433 +f 1877/1552/1434 1255/1545/1434 380/1544/1434 1259/1553/1434 +f 1153/1307/1435 1877/1552/1435 1259/1553/1435 324/1242/1435 +f 381/1546/1436 1256/1549/1436 1878/1554/1436 1260/1555/1436 +f 1256/1549/1437 379/1410/1437 1204/1419/1437 1878/1554/1437 +f 1878/1554/1438 1204/1419/1438 317/1310/1438 1154/1308/1438 +f 1260/1555/1439 1878/1554/1439 1154/1308/1439 325/1251/1439 +f 320/1520/1440 1243/1519/1440 1879/1556/1440 1261/1557/1440 +f 1243/1519/1441 386/1507/1441 1262/1558/1441 1879/1556/1441 +f 1879/1556/1442 1262/1558/1442 380/1544/1442 1254/1543/1442 +f 1261/1557/1443 1879/1556/1443 1254/1543/1443 322/1542/1443 +f 381/1546/1444 1263/1559/1444 1880/1560/1444 1257/1547/1444 +f 1263/1559/1445 387/1510/1445 1244/1522/1445 1880/1560/1445 +f 1880/1560/1446 1244/1522/1446 321/1525/1446 1264/1561/1446 +f 1257/1547/1447 1880/1560/1447 1264/1561/1447 323/1550/1447 +f 350/1259/1448 1131/1258/1448 1881/1562/1448 1236/1506/1448 +f 1131/1258/1449 352/1244/1449 1265/1563/1449 1881/1562/1449 +f 1881/1562/1450 1265/1563/1450 380/1544/1450 1262/1558/1450 +f 1236/1506/1451 1881/1562/1451 1262/1558/1451 386/1507/1451 +f 381/1546/1452 1266/1564/1452 1882/1565/1452 1263/1559/1452 +f 1266/1564/1453 353/1247/1453 1134/1263/1453 1882/1565/1453 +f 1882/1565/1454 1134/1263/1454 351/1262/1454 1239/1511/1454 +f 1263/1559/1455 1882/1565/1455 1239/1511/1455 387/1510/1455 +f 324/1242/1456 1259/1553/1456 1883/1566/1456 1125/1243/1456 +f 380/1544/1457 1265/1563/1457 1883/1566/1457 1259/1553/1457 +f 352/1244/1458 1125/1243/1458 1883/1566/1458 1265/1563/1458 +f 353/1247/1459 1266/1564/1459 1884/1567/1459 1128/1248/1459 +f 381/1546/1460 1260/1555/1460 1884/1567/1460 1266/1564/1460 +f 325/1251/1461 1128/1248/1461 1884/1567/1461 1260/1555/1461 +f 400/1568/1462 1268/1569/1462 1885/1570/1462 1267/1571/1462 +f 1268/1569/1463 388/1572/1463 1269/1573/1463 1885/1570/1463 +f 1885/1570/1464 1269/1573/1464 414/1574/1464 1270/1575/1464 +f 1267/1571/1465 1885/1570/1465 1270/1575/1465 402/1576/1465 +f 415/1577/1466 1272/1578/1466 1886/1579/1466 1271/1580/1466 +f 1272/1578/1467 389/1581/1467 1273/1582/1467 1886/1579/1467 +f 1886/1579/1468 1273/1582/1468 401/1583/1468 1274/1584/1468 +f 1271/1580/1469 1886/1579/1469 1274/1584/1469 403/1585/1469 +f 400/1568/1470 1267/1571/1470 1887/1586/1470 1275/1587/1470 +f 1267/1571/1471 402/1576/1471 1276/1588/1471 1887/1586/1471 +f 1887/1586/1472 1276/1588/1472 404/1589/1472 1277/1590/1472 +f 1275/1587/1473 1887/1586/1473 1277/1590/1473 398/1591/1473 +f 405/1592/1474 1279/1593/1474 1888/1594/1474 1278/1595/1474 +f 1279/1593/1475 403/1585/1475 1274/1584/1475 1888/1594/1475 +f 1888/1594/1476 1274/1584/1476 401/1583/1476 1280/1596/1476 +f 1278/1595/1477 1888/1594/1477 1280/1596/1477 399/1597/1477 +f 398/1591/1478 1277/1590/1478 1889/1598/1478 1281/1599/1478 +f 1277/1590/1479 404/1589/1479 1282/1600/1479 1889/1598/1479 +f 1889/1598/1480 1282/1600/1480 406/1601/1480 1283/1602/1480 +f 1281/1599/1481 1889/1598/1481 1283/1602/1481 396/1603/1481 +f 407/1604/1482 1285/1605/1482 1890/1606/1482 1284/1607/1482 +f 1285/1605/1483 405/1592/1483 1278/1595/1483 1890/1606/1483 +f 1890/1606/1484 1278/1595/1484 399/1597/1484 1286/1608/1484 +f 1284/1607/1485 1890/1606/1485 1286/1608/1485 397/1609/1485 +f 396/1603/1486 1283/1602/1486 1891/1610/1486 1287/1611/1486 +f 1283/1602/1487 406/1601/1487 1288/1612/1487 1891/1610/1487 +f 1891/1610/1488 1288/1612/1488 408/1613/1488 1289/1614/1488 +f 1287/1611/1489 1891/1610/1489 1289/1614/1489 394/1615/1489 +f 409/1616/1490 1291/1617/1490 1892/1618/1490 1290/1619/1490 +f 1291/1617/1491 407/1604/1491 1284/1607/1491 1892/1618/1491 +f 1892/1618/1492 1284/1607/1492 397/1609/1492 1292/1620/1492 +f 1290/1619/1493 1892/1618/1493 1292/1620/1493 395/1621/1493 +f 394/1615/1494 1289/1614/1494 1893/1622/1494 1293/1623/1494 +f 1289/1614/1495 408/1613/1495 1294/1624/1495 1893/1622/1495 +f 1893/1622/1496 1294/1624/1496 410/1625/1496 1295/1626/1496 +f 1293/1623/1497 1893/1622/1497 1295/1626/1497 392/1627/1497 +f 411/1628/1498 1297/1629/1498 1894/1630/1498 1296/1631/1498 +f 1297/1629/1499 409/1616/1499 1290/1619/1499 1894/1630/1499 +f 1894/1630/1500 1290/1619/1500 395/1621/1500 1298/1632/1500 +f 1296/1631/1501 1894/1630/1501 1298/1632/1501 393/1633/1501 +f 392/1627/1502 1295/1626/1502 1895/1634/1502 1299/1635/1502 +f 1295/1626/1503 410/1625/1503 1300/1636/1503 1895/1634/1503 +f 1895/1634/1504 1300/1636/1504 412/1637/1504 1301/1638/1504 +f 1299/1635/1505 1895/1634/1505 1301/1638/1505 390/1639/1505 +f 413/1640/1506 1303/1641/1506 1896/1642/1506 1302/1643/1506 +f 1303/1641/1507 411/1628/1507 1296/1631/1507 1896/1642/1507 +f 1896/1642/1508 1296/1631/1508 393/1633/1508 1304/1644/1508 +f 1302/1643/1509 1896/1642/1509 1304/1644/1509 391/1645/1509 +f 410/1625/1510 1305/1646/1510 1897/1647/1510 1300/1636/1510 +f 1305/1646/1511 420/1648/1511 1306/1649/1511 1897/1647/1511 +f 1897/1647/1512 1306/1649/1512 418/1650/1512 1307/1651/1512 +f 1300/1636/1513 1897/1647/1513 1307/1651/1513 412/1637/1513 +f 419/1652/1514 1309/1653/1514 1898/1654/1514 1308/1655/1514 +f 1309/1653/1515 421/1656/1515 1310/1657/1515 1898/1654/1515 +f 1898/1654/1516 1310/1657/1516 411/1628/1516 1303/1641/1516 +f 1308/1655/1517 1898/1654/1517 1303/1641/1517 413/1640/1517 +f 408/1613/1518 1311/1658/1518 1899/1659/1518 1294/1624/1518 +f 1311/1658/1519 422/1660/1519 1312/1661/1519 1899/1659/1519 +f 1899/1659/1520 1312/1661/1520 420/1648/1520 1305/1646/1520 +f 1294/1624/1521 1899/1659/1521 1305/1646/1521 410/1625/1521 +f 421/1656/1522 1313/1662/1522 1900/1663/1522 1310/1657/1522 +f 1313/1662/1523 423/1664/1523 1314/1665/1523 1900/1663/1523 +f 1900/1663/1524 1314/1665/1524 409/1616/1524 1297/1629/1524 +f 1310/1657/1525 1900/1663/1525 1297/1629/1525 411/1628/1525 +f 406/1601/1526 1315/1666/1526 1901/1667/1526 1288/1612/1526 +f 1315/1666/1527 424/1668/1527 1316/1669/1527 1901/1667/1527 +f 1901/1667/1528 1316/1669/1528 422/1660/1528 1311/1658/1528 +f 1288/1612/1529 1901/1667/1529 1311/1658/1529 408/1613/1529 +f 423/1664/1530 1317/1670/1530 1902/1671/1530 1314/1665/1530 +f 1317/1670/1531 425/1672/1531 1318/1673/1531 1902/1671/1531 +f 1902/1671/1532 1318/1673/1532 407/1604/1532 1291/1617/1532 +f 1314/1665/1533 1902/1671/1533 1291/1617/1533 409/1616/1533 +f 404/1589/1534 1319/1674/1534 1903/1675/1534 1282/1600/1534 +f 1319/1674/1535 426/1676/1535 1320/1677/1535 1903/1675/1535 +f 1903/1675/1536 1320/1677/1536 424/1668/1536 1315/1666/1536 +f 1282/1600/1537 1903/1675/1537 1315/1666/1537 406/1601/1537 +f 425/1672/1538 1321/1678/1538 1904/1679/1538 1318/1673/1538 +f 1321/1678/1539 427/1680/1539 1322/1681/1539 1904/1679/1539 +f 1904/1679/1540 1322/1681/1540 405/1592/1540 1285/1605/1540 +f 1318/1673/1541 1904/1679/1541 1285/1605/1541 407/1604/1541 +f 402/1576/1542 1323/1682/1542 1905/1683/1542 1276/1588/1542 +f 1323/1682/1543 428/1684/1543 1324/1685/1543 1905/1683/1543 +f 1905/1683/1544 1324/1685/1544 426/1676/1544 1319/1674/1544 +f 1276/1588/1545 1905/1683/1545 1319/1674/1545 404/1589/1545 +f 427/1680/1546 1325/1686/1546 1906/1687/1546 1322/1681/1546 +f 1325/1686/1547 429/1688/1547 1326/1689/1547 1906/1687/1547 +f 1906/1687/1548 1326/1689/1548 403/1585/1548 1279/1593/1548 +f 1322/1681/1549 1906/1687/1549 1279/1593/1549 405/1592/1549 +f 402/1576/1550 1270/1575/1550 1907/1690/1550 1323/1682/1550 +f 1270/1575/1551 414/1574/1551 1327/1691/1551 1907/1690/1551 +f 1907/1690/1552 1327/1691/1552 416/1692/1552 1328/1693/1552 +f 1323/1682/1553 1907/1690/1553 1328/1693/1553 428/1684/1553 +f 417/1694/1554 1330/1695/1554 1908/1696/1554 1329/1697/1554 +f 1330/1695/1555 415/1577/1555 1271/1580/1555 1908/1696/1555 +f 1908/1696/1556 1271/1580/1556 403/1585/1556 1326/1689/1556 +f 1329/1697/1557 1908/1696/1557 1326/1689/1557 429/1688/1557 +f 318/1293/1558 1241/1518/1558 1909/1698/1558 1331/1699/1558 +f 1241/1518/1559 320/1520/1559 1332/1700/1559 1909/1698/1559 +f 1909/1698/1560 1332/1700/1560 444/1701/1560 1333/1702/1560 +f 1331/1699/1561 1909/1698/1561 1333/1702/1561 442/1703/1561 +f 445/1704/1562 1335/1705/1562 1910/1706/1562 1334/1707/1562 +f 1335/1705/1563 321/1525/1563 1246/1524/1563 1910/1706/1563 +f 1910/1706/1564 1246/1524/1564 319/1296/1564 1336/1708/1564 +f 1334/1707/1565 1910/1706/1565 1336/1708/1565 443/1709/1565 +f 320/1710/1566 1337/1711/1566 1911/1712/1566 1332/1713/1566 +f 1337/1711/1567 390/1639/1567 1301/1638/1567 1911/1712/1567 +f 1911/1712/1568 1301/1638/1568 412/1637/1568 1338/1714/1568 +f 1332/1713/1569 1911/1712/1569 1338/1714/1569 444/1715/1569 +f 413/1640/1570 1302/1643/1570 1912/1716/1570 1339/1717/1570 +f 1302/1643/1567 391/1645/1567 1340/1718/1567 1912/1716/1567 +f 1912/1716/1571 1340/1718/1571 321/1719/1571 1335/1720/1571 +f 1339/1717/1572 1912/1716/1572 1335/1720/1572 445/1721/1572 +f 310/1295/1573 1147/1294/1573 1913/1722/1573 1225/1484/1573 +f 1147/1294/1574 318/1293/1574 1331/1699/1574 1913/1722/1574 +f 1913/1722/1575 1331/1699/1575 442/1703/1575 1341/1723/1575 +f 1225/1484/1576 1913/1722/1576 1341/1723/1576 312/1486/1576 +f 443/1709/1577 1336/1708/1577 1914/1724/1577 1342/1725/1577 +f 1336/1708/1578 319/1296/1578 1148/1299/1578 1914/1724/1578 +f 1914/1724/1579 1148/1299/1579 311/1301/1579 1228/1491/1579 +f 1342/1725/1580 1914/1724/1580 1228/1491/1580 313/1490/1580 +f 382/1726/1581 1344/1727/1581 1915/1728/1581 1343/1729/1581 +f 1344/1727/1582 430/1730/1582 1345/1731/1582 1915/1728/1582 +f 1915/1728/1583 1345/1731/1583 414/1574/1583 1269/1573/1583 +f 1343/1729/1584 1915/1728/1584 1269/1573/1584 388/1572/1584 +f 415/1577/1585 1346/1732/1585 1916/1733/1585 1272/1578/1585 +f 1346/1732/1586 431/1734/1586 1347/1735/1586 1916/1733/1586 +f 1916/1733/1587 1347/1735/1587 383/1736/1587 1348/1737/1587 +f 1272/1578/1588 1916/1733/1588 1348/1737/1588 389/1581/1588 +f 412/1637/1589 1307/1651/1589 1917/1738/1589 1338/1714/1589 +f 1307/1651/1590 418/1650/1590 1349/1739/1590 1917/1738/1590 +f 1917/1738/1591 1349/1739/1591 440/1740/1591 1350/1741/1591 +f 1338/1714/1592 1917/1738/1592 1350/1741/1592 444/1715/1592 +f 441/1742/1593 1352/1743/1593 1918/1744/1593 1351/1745/1593 +f 1352/1743/1594 419/1652/1594 1308/1655/1594 1918/1744/1594 +f 1918/1744/1595 1308/1655/1595 413/1640/1595 1339/1717/1595 +f 1351/1745/1596 1918/1744/1596 1339/1717/1596 445/1721/1596 +f 438/1746/1597 1354/1747/1597 1919/1748/1597 1353/1749/1597 +f 1354/1747/1598 446/1750/1598 1355/1751/1598 1919/1748/1598 +f 1919/1748/1599 1355/1751/1599 444/1715/1599 1350/1741/1599 +f 1353/1749/1600 1919/1748/1600 1350/1741/1600 440/1740/1600 +f 445/1721/1601 1356/1752/1601 1920/1753/1601 1351/1745/1601 +f 1356/1752/1602 447/1754/1602 1357/1755/1602 1920/1753/1602 +f 1920/1753/1603 1357/1755/1603 439/1756/1603 1358/1757/1603 +f 1351/1745/1604 1920/1753/1604 1358/1757/1604 441/1742/1604 +f 434/1758/1605 1360/1759/1605 1921/1760/1605 1359/1761/1605 +f 1360/1759/1606 446/1750/1606 1354/1747/1606 1921/1760/1606 +f 1921/1760/1607 1354/1747/1607 438/1746/1607 1361/1762/1607 +f 1359/1761/1608 1921/1760/1608 1361/1762/1608 436/1763/1608 +f 439/1756/1609 1357/1755/1609 1922/1764/1609 1362/1765/1609 +f 1357/1755/1610 447/1754/1610 1363/1766/1610 1922/1764/1610 +f 1922/1764/1611 1363/1766/1611 435/1767/1611 1364/1768/1611 +f 1362/1765/1612 1922/1764/1612 1364/1768/1612 437/1769/1612 +f 432/1770/1613 1366/1771/1613 1923/1772/1613 1365/1773/1613 +f 1366/1771/1614 448/1774/1614 1367/1775/1614 1923/1772/1614 +f 1923/1772/1615 1367/1775/1615 446/1750/1615 1360/1759/1615 +f 1365/1773/1616 1923/1772/1616 1360/1759/1616 434/1758/1616 +f 447/1754/1617 1368/1776/1617 1924/1777/1617 1363/1766/1617 +f 1368/1776/1618 449/1778/1618 1369/1779/1618 1924/1777/1618 +f 1924/1777/1619 1369/1779/1619 433/1780/1619 1370/1781/1619 +f 1363/1766/1620 1924/1777/1620 1370/1781/1620 435/1767/1620 +f 430/1730/1621 1372/1782/1621 1925/1783/1621 1371/1784/1621 +f 1372/1782/1622 448/1774/1622 1366/1771/1622 1925/1783/1622 +f 1925/1783/1623 1366/1771/1623 432/1770/1623 1373/1785/1623 +f 1371/1784/1624 1925/1783/1624 1373/1785/1624 450/1786/1624 +f 433/1780/1625 1369/1779/1625 1926/1787/1625 1374/1788/1625 +f 1369/1779/1626 449/1778/1626 1375/1789/1626 1926/1787/1626 +f 1926/1787/1627 1375/1789/1627 431/1734/1627 1376/1790/1627 +f 1374/1788/1628 1926/1787/1628 1376/1790/1628 451/1791/1628 +f 414/1574/1629 1345/1731/1629 1927/1792/1629 1327/1691/1629 +f 1345/1731/1630 430/1730/1630 1371/1784/1630 1927/1792/1630 +f 1927/1792/1631 1371/1784/1631 450/1786/1631 1377/1793/1631 +f 1327/1691/1632 1927/1792/1632 1377/1793/1632 416/1692/1632 +f 451/1791/1633 1376/1790/1633 1928/1794/1633 1378/1795/1633 +f 1376/1790/1634 431/1734/1634 1346/1732/1634 1928/1794/1634 +f 1928/1794/1635 1346/1732/1635 415/1577/1635 1330/1695/1635 +f 1378/1795/1636 1928/1794/1636 1330/1695/1636 417/1694/1636 +f 312/1486/1637 1379/1796/1637 1929/1797/1637 1229/1492/1637 +f 1379/1796/1638 448/1798/1638 1372/1799/1638 1929/1797/1638 +f 1929/1797/1639 1372/1799/1639 430/1800/1639 1344/1801/1639 +f 1229/1492/1640 1929/1797/1640 1344/1801/1640 382/1494/1640 +f 431/1802/1641 1375/1803/1641 1930/1804/1641 1347/1805/1641 +f 1375/1803/1642 449/1806/1642 1380/1807/1642 1930/1804/1642 +f 1930/1804/1643 1380/1807/1643 313/1490/1643 1232/1499/1643 +f 1347/1805/1644 1930/1804/1644 1232/1499/1644 383/1498/1644 +f 312/1486/1645 1341/1723/1645 1931/1808/1645 1379/1796/1645 +f 1341/1723/1646 442/1703/1646 1381/1809/1646 1931/1808/1646 +f 1931/1808/1647 1381/1809/1647 446/1810/1647 1367/1811/1647 +f 1379/1796/1648 1931/1808/1648 1367/1811/1648 448/1798/1648 +f 447/1812/1649 1382/1813/1649 1932/1814/1649 1368/1815/1649 +f 1382/1813/1650 443/1709/1650 1342/1725/1650 1932/1814/1650 +f 1932/1814/1651 1342/1725/1651 313/1490/1651 1380/1807/1651 +f 1368/1815/1652 1932/1814/1652 1380/1807/1652 449/1806/1652 +f 442/1703/1653 1333/1702/1653 1933/1816/1653 1381/1809/1653 +f 444/1701/1654 1355/1817/1654 1933/1816/1654 1333/1702/1654 +f 446/1810/1655 1381/1809/1655 1933/1816/1655 1355/1817/1655 +f 447/1812/1656 1356/1818/1656 1934/1819/1656 1382/1813/1656 +f 445/1704/1657 1334/1707/1657 1934/1819/1657 1356/1818/1657 +f 443/1709/1658 1382/1813/1658 1934/1819/1658 1334/1707/1658 +f 416/1692/1659 1377/1793/1659 1935/1820/1659 1383/1821/1659 +f 1377/1793/1660 450/1786/1660 1384/1822/1660 1935/1820/1660 +f 1935/1820/1661 1384/1822/1661 452/1823/1661 1385/1824/1661 +f 1383/1821/1662 1935/1820/1662 1385/1824/1662 476/1825/1662 +f 453/1826/1663 1387/1827/1663 1936/1828/1663 1386/1829/1663 +f 1387/1827/1664 451/1791/1664 1378/1795/1664 1936/1828/1664 +f 1936/1828/1665 1378/1795/1665 417/1694/1665 1388/1830/1665 +f 1386/1829/1666 1936/1828/1666 1388/1830/1666 477/1831/1666 +f 450/1786/1667 1373/1785/1667 1937/1832/1667 1384/1822/1667 +f 1373/1785/1668 432/1770/1668 1389/1833/1668 1937/1832/1668 +f 1937/1832/1669 1389/1833/1669 462/1834/1669 1390/1835/1669 +f 1384/1822/1670 1937/1832/1670 1390/1835/1670 452/1823/1670 +f 463/1836/1671 1392/1837/1671 1938/1838/1671 1391/1839/1671 +f 1392/1837/1672 433/1780/1672 1374/1788/1672 1938/1838/1672 +f 1938/1838/1673 1374/1788/1673 451/1791/1673 1387/1827/1673 +f 1391/1839/1674 1938/1838/1674 1387/1827/1674 453/1826/1674 +f 432/1770/1675 1365/1773/1675 1939/1840/1675 1389/1833/1675 +f 1365/1773/1676 434/1758/1676 1393/1841/1676 1939/1840/1676 +f 1939/1840/1677 1393/1841/1677 460/1842/1677 1394/1843/1677 +f 1389/1833/1678 1939/1840/1678 1394/1843/1678 462/1834/1678 +f 461/1844/1679 1396/1845/1679 1940/1846/1679 1395/1847/1679 +f 1396/1845/1680 435/1767/1680 1370/1781/1680 1940/1846/1680 +f 1940/1846/1681 1370/1781/1681 433/1780/1681 1392/1837/1681 +f 1395/1847/1682 1940/1846/1682 1392/1837/1682 463/1836/1682 +f 434/1758/1683 1359/1761/1683 1941/1848/1683 1393/1841/1683 +f 1359/1761/1684 436/1763/1684 1397/1849/1684 1941/1848/1684 +f 1941/1848/1685 1397/1849/1685 458/1850/1685 1398/1851/1685 +f 1393/1841/1686 1941/1848/1686 1398/1851/1686 460/1842/1686 +f 459/1852/1687 1400/1853/1687 1942/1854/1687 1399/1855/1687 +f 1400/1853/1688 437/1769/1688 1364/1768/1688 1942/1854/1688 +f 1942/1854/1689 1364/1768/1689 435/1767/1689 1396/1845/1689 +f 1399/1855/1690 1942/1854/1690 1396/1845/1690 461/1844/1690 +f 436/1763/1691 1361/1762/1691 1943/1856/1691 1397/1849/1691 +f 1361/1762/1692 438/1746/1692 1401/1857/1692 1943/1856/1692 +f 1943/1856/1693 1401/1857/1693 456/1858/1693 1402/1859/1693 +f 1397/1849/1694 1943/1856/1694 1402/1859/1694 458/1850/1694 +f 457/1860/1695 1404/1861/1695 1944/1862/1695 1403/1863/1695 +f 1404/1861/1696 439/1756/1696 1362/1765/1696 1944/1862/1696 +f 1944/1862/1697 1362/1765/1697 437/1769/1697 1400/1853/1697 +f 1403/1863/1698 1944/1862/1698 1400/1853/1698 459/1852/1698 +f 438/1746/1699 1353/1749/1699 1945/1864/1699 1401/1857/1699 +f 1353/1749/1700 440/1740/1700 1405/1865/1700 1945/1864/1700 +f 1945/1864/1701 1405/1865/1701 454/1866/1701 1406/1867/1701 +f 1401/1857/1702 1945/1864/1702 1406/1867/1702 456/1858/1702 +f 455/1868/1703 1408/1869/1703 1946/1870/1703 1407/1871/1703 +f 1408/1869/1704 441/1742/1704 1358/1757/1704 1946/1870/1704 +f 1946/1870/1705 1358/1757/1705 439/1756/1705 1404/1861/1705 +f 1407/1871/1706 1946/1870/1706 1404/1861/1706 457/1860/1706 +f 440/1740/1707 1349/1739/1707 1947/1872/1707 1405/1865/1707 +f 1349/1739/1708 418/1650/1708 1409/1873/1708 1947/1872/1708 +f 1947/1872/1709 1409/1873/1709 474/1874/1709 1410/1875/1709 +f 1405/1865/1710 1947/1872/1710 1410/1875/1710 454/1866/1710 +f 475/1876/1711 1412/1877/1711 1948/1878/1711 1411/1879/1711 +f 1412/1877/1712 419/1652/1712 1352/1743/1712 1948/1878/1712 +f 1948/1878/1713 1352/1743/1713 441/1742/1713 1408/1869/1713 +f 1411/1879/1714 1948/1878/1714 1408/1869/1714 455/1868/1714 +f 428/1684/1715 1328/1693/1715 1949/1880/1715 1413/1881/1715 +f 1328/1693/1716 416/1692/1716 1383/1821/1716 1949/1880/1716 +f 1949/1880/1717 1383/1821/1717 476/1825/1717 1414/1882/1717 +f 1413/1881/1718 1949/1880/1718 1414/1882/1718 464/1883/1718 +f 477/1831/1719 1388/1830/1719 1950/1884/1719 1415/1885/1719 +f 1388/1830/1720 417/1694/1720 1329/1697/1720 1950/1884/1720 +f 1950/1884/1721 1329/1697/1721 429/1688/1721 1416/1886/1721 +f 1415/1885/1722 1950/1884/1722 1416/1886/1722 465/1887/1722 +f 426/1676/1723 1324/1685/1723 1951/1888/1723 1417/1889/1723 +f 1324/1685/1724 428/1684/1724 1413/1881/1724 1951/1888/1724 +f 1951/1888/1725 1413/1881/1725 464/1883/1725 1418/1890/1725 +f 1417/1889/1726 1951/1888/1726 1418/1890/1726 466/1891/1726 +f 465/1887/1727 1416/1886/1727 1952/1892/1727 1419/1893/1727 +f 1416/1886/1728 429/1688/1728 1325/1686/1728 1952/1892/1728 +f 1952/1892/1729 1325/1686/1729 427/1680/1729 1420/1894/1729 +f 1419/1893/1730 1952/1892/1730 1420/1894/1730 467/1895/1730 +f 424/1668/1731 1320/1677/1731 1953/1896/1731 1421/1897/1731 +f 1320/1677/1732 426/1676/1732 1417/1889/1732 1953/1896/1732 +f 1953/1896/1733 1417/1889/1733 466/1891/1733 1422/1898/1733 +f 1421/1897/1734 1953/1896/1734 1422/1898/1734 468/1899/1734 +f 467/1895/1735 1420/1894/1735 1954/1900/1735 1423/1901/1735 +f 1420/1894/1736 427/1680/1736 1321/1678/1736 1954/1900/1736 +f 1954/1900/1737 1321/1678/1737 425/1672/1737 1424/1902/1737 +f 1423/1901/1738 1954/1900/1738 1424/1902/1738 469/1903/1738 +f 422/1660/1739 1316/1669/1739 1955/1904/1739 1425/1905/1739 +f 1316/1669/1740 424/1668/1740 1421/1897/1740 1955/1904/1740 +f 1955/1904/1741 1421/1897/1741 468/1899/1741 1426/1906/1741 +f 1425/1905/1742 1955/1904/1742 1426/1906/1742 470/1907/1742 +f 469/1903/1743 1424/1902/1743 1956/1908/1743 1427/1909/1743 +f 1424/1902/1744 425/1672/1744 1317/1670/1744 1956/1908/1744 +f 1956/1908/1745 1317/1670/1745 423/1664/1745 1428/1910/1745 +f 1427/1909/1746 1956/1908/1746 1428/1910/1746 471/1911/1746 +f 420/1648/1747 1312/1661/1747 1957/1912/1747 1429/1913/1747 +f 1312/1661/1748 422/1660/1748 1425/1905/1748 1957/1912/1748 +f 1957/1912/1749 1425/1905/1749 470/1907/1749 1430/1914/1749 +f 1429/1913/1750 1957/1912/1750 1430/1914/1750 472/1915/1750 +f 471/1911/1751 1428/1910/1751 1958/1916/1751 1431/1917/1751 +f 1428/1910/1752 423/1664/1752 1313/1662/1752 1958/1916/1752 +f 1958/1916/1753 1313/1662/1753 421/1656/1753 1432/1918/1753 +f 1431/1917/1754 1958/1916/1754 1432/1918/1754 473/1919/1754 +f 418/1650/1755 1306/1649/1755 1959/1920/1755 1409/1873/1755 +f 1306/1649/1756 420/1648/1756 1429/1913/1756 1959/1920/1756 +f 1959/1920/1757 1429/1913/1757 472/1915/1757 1433/1921/1757 +f 1409/1873/1758 1959/1920/1758 1433/1921/1758 474/1874/1758 +f 473/1919/1759 1432/1918/1759 1960/1922/1759 1434/1923/1759 +f 1432/1918/1760 421/1656/1760 1309/1653/1760 1960/1922/1760 +f 1960/1922/1761 1309/1653/1761 419/1652/1761 1412/1877/1761 +f 1434/1923/1762 1960/1922/1762 1412/1877/1762 475/1876/1762 +f 458/1850/1763 1402/1859/1763 1961/1924/1763 1435/1925/1763 +f 1402/1859/1764 456/1858/1764 1436/1926/1764 1961/1924/1764 +f 1961/1924/1765 1436/1926/1765 480/1927/1765 1437/1928/1765 +f 1435/1925/1766 1961/1924/1766 1437/1928/1766 478/1929/1766 +f 481/1930/1767 1439/1931/1767 1962/1932/1767 1438/1933/1767 +f 1439/1931/1768 457/1860/1768 1403/1863/1768 1962/1932/1768 +f 1962/1932/1769 1403/1863/1769 459/1852/1769 1440/1934/1769 +f 1438/1933/1770 1962/1932/1770 1440/1934/1770 479/1935/1770 +f 478/1929/1771 1437/1928/1771 1963/1936/1771 1441/1937/1771 +f 1437/1928/1772 480/1927/1772 1442/1938/1772 1963/1936/1772 +f 1963/1936/1773 1442/1938/1773 482/1939/1773 1443/1940/1773 +f 1441/1937/1774 1963/1936/1774 1443/1940/1774 484/1941/1774 +f 483/1942/1775 1445/1943/1775 1964/1944/1775 1444/1945/1775 +f 1445/1943/1776 481/1930/1776 1438/1933/1776 1964/1944/1776 +f 1964/1944/1777 1438/1933/1777 479/1935/1777 1446/1946/1777 +f 1444/1945/1778 1964/1944/1778 1446/1946/1778 485/1947/1778 +f 484/1941/1779 1443/1940/1779 1965/1948/1779 1447/1949/1779 +f 1443/1940/1780 482/1939/1780 1448/1950/1780 1965/1948/1780 +f 1965/1948/1781 1448/1950/1781 488/1951/1781 1449/1952/1781 +f 1447/1949/1782 1965/1948/1782 1449/1952/1782 486/1953/1782 +f 489/1954/1783 1451/1955/1783 1966/1956/1783 1450/1957/1783 +f 1451/1955/1784 483/1942/1784 1444/1945/1784 1966/1956/1784 +f 1966/1956/1785 1444/1945/1785 485/1947/1785 1452/1958/1785 +f 1450/1957/1786 1966/1956/1786 1452/1958/1786 487/1959/1786 +f 486/1953/1787 1449/1952/1787 1967/1960/1787 1453/1961/1787 +f 1449/1952/1788 488/1951/1788 1454/1962/1788 1967/1960/1788 +f 1967/1960/1789 1454/1962/1789 490/1963/1789 1455/1964/1789 +f 1453/1961/1790 1967/1960/1790 1455/1964/1790 492/1965/1790 +f 491/1966/1791 1457/1967/1791 1968/1968/1791 1456/1969/1791 +f 1457/1967/1792 489/1954/1792 1450/1957/1792 1968/1968/1792 +f 1968/1968/1793 1450/1957/1793 487/1959/1793 1458/1970/1793 +f 1456/1969/1794 1968/1968/1794 1458/1970/1794 493/1971/1794 +f 464/1883/1795 1414/1882/1795 1969/1972/1795 1459/1973/1795 +f 1414/1882/1796 476/1825/1796 1460/1974/1796 1969/1972/1796 +f 1969/1972/1797 1460/1974/1797 486/1953/1797 1453/1961/1797 +f 1459/1973/1798 1969/1972/1798 1453/1961/1798 492/1965/1798 +f 487/1959/1799 1461/1975/1799 1970/1976/1799 1458/1970/1799 +f 1461/1975/1800 477/1831/1800 1415/1885/1800 1970/1976/1800 +f 1970/1976/1801 1415/1885/1801 465/1887/1801 1462/1977/1801 +f 1458/1970/1802 1970/1976/1802 1462/1977/1802 493/1971/1802 +f 452/1823/1803 1463/1978/1803 1971/1979/1803 1385/1824/1803 +f 1463/1978/1804 484/1941/1804 1447/1949/1804 1971/1979/1804 +f 1971/1979/1805 1447/1949/1805 486/1953/1805 1460/1974/1805 +f 1385/1824/1806 1971/1979/1806 1460/1974/1806 476/1825/1806 +f 487/1959/1807 1452/1958/1807 1972/1980/1807 1461/1975/1807 +f 1452/1958/1808 485/1947/1808 1464/1981/1808 1972/1980/1808 +f 1972/1980/1809 1464/1981/1809 453/1826/1809 1386/1829/1809 +f 1461/1975/1810 1972/1980/1810 1386/1829/1810 477/1831/1810 +f 452/1823/1811 1390/1835/1811 1973/1982/1811 1463/1978/1811 +f 1390/1835/1812 462/1834/1812 1465/1983/1812 1973/1982/1812 +f 1973/1982/1813 1465/1983/1813 478/1929/1813 1441/1937/1813 +f 1463/1978/1814 1973/1982/1814 1441/1937/1814 484/1941/1814 +f 479/1935/1815 1466/1984/1815 1974/1985/1815 1446/1946/1815 +f 1466/1984/1816 463/1836/1816 1391/1839/1816 1974/1985/1816 +f 1974/1985/1817 1391/1839/1817 453/1826/1817 1464/1981/1817 +f 1446/1946/1818 1974/1985/1818 1464/1981/1818 485/1947/1818 +f 458/1850/1819 1435/1925/1819 1975/1986/1819 1398/1851/1819 +f 1435/1925/1820 478/1929/1820 1465/1983/1820 1975/1986/1820 +f 1975/1986/1821 1465/1983/1821 462/1834/1821 1394/1843/1821 +f 1398/1851/1822 1975/1986/1822 1394/1843/1822 460/1842/1822 +f 463/1836/1823 1466/1984/1823 1976/1987/1823 1395/1847/1823 +f 1466/1984/1824 479/1935/1824 1440/1934/1824 1976/1987/1824 +f 1976/1987/1825 1440/1934/1825 459/1852/1825 1399/1855/1825 +f 1395/1847/1826 1976/1987/1826 1399/1855/1826 461/1844/1826 +f 454/1866/1827 1410/1875/1827 1977/1988/1827 1406/1867/1827 +f 1410/1875/1828 474/1874/1828 1467/1989/1828 1977/1988/1828 +f 1977/1988/1829 1467/1989/1829 480/1927/1829 1436/1926/1829 +f 1406/1867/1830 1977/1988/1830 1436/1926/1830 456/1858/1830 +f 481/1930/1831 1468/1990/1831 1978/1991/1831 1439/1931/1831 +f 1468/1990/1832 475/1876/1832 1411/1879/1832 1978/1991/1832 +f 1978/1991/1833 1411/1879/1833 455/1868/1833 1407/1871/1833 +f 1439/1931/1834 1978/1991/1834 1407/1871/1834 457/1860/1834 +f 472/1915/1835 1469/1992/1835 1979/1993/1835 1433/1921/1835 +f 1469/1992/1836 482/1939/1836 1442/1938/1836 1979/1993/1836 +f 1979/1993/1837 1442/1938/1837 480/1927/1837 1467/1989/1837 +f 1433/1921/1838 1979/1993/1838 1467/1989/1838 474/1874/1838 +f 481/1930/1839 1445/1943/1839 1980/1994/1839 1468/1990/1839 +f 1445/1943/1840 483/1942/1840 1470/1995/1840 1980/1994/1840 +f 1980/1994/1841 1470/1995/1841 473/1919/1841 1434/1923/1841 +f 1468/1990/1842 1980/1994/1842 1434/1923/1842 475/1876/1842 +f 470/1907/1843 1471/1996/1843 1981/1997/1843 1430/1914/1843 +f 1471/1996/1844 488/1951/1844 1448/1950/1844 1981/1997/1844 +f 1981/1997/1845 1448/1950/1845 482/1939/1845 1469/1992/1845 +f 1430/1914/1846 1981/1997/1846 1469/1992/1846 472/1915/1846 +f 483/1942/1847 1451/1955/1847 1982/1998/1847 1470/1995/1847 +f 1451/1955/1848 489/1954/1848 1472/1999/1848 1982/1998/1848 +f 1982/1998/1849 1472/1999/1849 471/1911/1849 1431/1917/1849 +f 1470/1995/1850 1982/1998/1850 1431/1917/1850 473/1919/1850 +f 468/1899/1851 1473/2000/1851 1983/2001/1851 1426/1906/1851 +f 1473/2000/1852 490/1963/1852 1454/1962/1852 1983/2001/1852 +f 1983/2001/1853 1454/1962/1853 488/1951/1853 1471/1996/1853 +f 1426/1906/1854 1983/2001/1854 1471/1996/1854 470/1907/1854 +f 489/1954/1855 1457/1967/1855 1984/2002/1855 1472/1999/1855 +f 1457/1967/1856 491/1966/1856 1474/2003/1856 1984/2002/1856 +f 1984/2002/1857 1474/2003/1857 469/1903/1857 1427/1909/1857 +f 1472/1999/1858 1984/2002/1858 1427/1909/1858 471/1911/1858 +f 466/1891/1859 1475/2004/1859 1985/2005/1859 1422/1898/1859 +f 1475/2004/1860 492/1965/1860 1455/1964/1860 1985/2005/1860 +f 1985/2005/1861 1455/1964/1861 490/1963/1861 1473/2000/1861 +f 1422/1898/1862 1985/2005/1862 1473/2000/1862 468/1899/1862 +f 491/1966/1863 1456/1969/1863 1986/2006/1863 1474/2003/1863 +f 1456/1969/1864 493/1971/1864 1476/2007/1864 1986/2006/1864 +f 1986/2006/1865 1476/2007/1865 467/1895/1865 1423/1901/1865 +f 1474/2003/1866 1986/2006/1866 1423/1901/1866 469/1903/1866 +f 464/1883/1867 1459/1973/1867 1987/2008/1867 1418/1890/1867 +f 492/1965/1868 1475/2004/1868 1987/2008/1868 1459/1973/1868 +f 466/1891/1869 1418/1890/1869 1987/2008/1869 1475/2004/1869 +f 467/1895/1870 1476/2007/1870 1988/2009/1870 1419/1893/1870 +f 493/1971/1871 1462/1977/1871 1988/2009/1871 1476/2007/1871 +f 465/1887/1872 1419/1893/1872 1988/2009/1872 1462/1977/1872 +f 392/1627/1873 1299/1635/1873 1989/2010/1873 1477/2011/1873 +f 1299/1635/1874 390/1639/1874 1478/2012/1874 1989/2010/1874 +f 1989/2010/1875 1478/2012/1875 504/2013/1875 1479/2014/1875 +f 1477/2011/1876 1989/2010/1876 1479/2014/1876 502/2015/1876 +f 505/2016/1877 1481/2017/1877 1990/2018/1877 1480/2019/1877 +f 1481/2017/1878 391/1645/1878 1304/1644/1878 1990/2018/1878 +f 1990/2018/1879 1304/1644/1879 393/1633/1879 1482/2020/1879 +f 1480/2019/1880 1990/2018/1880 1482/2020/1880 503/2021/1880 +f 394/1615/1881 1293/1623/1881 1991/2022/1881 1483/2023/1881 +f 1293/1623/1882 392/1627/1882 1477/2011/1882 1991/2022/1882 +f 1991/2022/1883 1477/2011/1883 502/2015/1883 1484/2024/1883 +f 1483/2023/1884 1991/2022/1884 1484/2024/1884 500/2025/1884 +f 503/2021/1885 1482/2020/1885 1992/2026/1885 1485/2027/1885 +f 1482/2020/1886 393/1633/1886 1298/1632/1886 1992/2026/1886 +f 1992/2026/1887 1298/1632/1887 395/1621/1887 1486/2028/1887 +f 1485/2027/1888 1992/2026/1888 1486/2028/1888 501/2029/1888 +f 396/1603/1889 1287/1611/1889 1993/2030/1889 1487/2031/1889 +f 1287/1611/1890 394/1615/1890 1483/2023/1890 1993/2030/1890 +f 1993/2030/1891 1483/2023/1891 500/2025/1891 1488/2032/1891 +f 1487/2031/1892 1993/2030/1892 1488/2032/1892 498/2033/1892 +f 501/2029/1893 1486/2028/1893 1994/2034/1893 1489/2035/1893 +f 1486/2028/1894 395/1621/1894 1292/1620/1894 1994/2034/1894 +f 1994/2034/1895 1292/1620/1895 397/1609/1895 1490/2036/1895 +f 1489/2035/1896 1994/2034/1896 1490/2036/1896 499/2037/1896 +f 398/2038/1897 1281/2039/1897 1995/2040/1897 1491/2041/1897 +f 1281/2039/1898 396/1603/1898 1487/2031/1898 1995/2040/1898 +f 1995/2040/1899 1487/2031/1899 498/2033/1899 1492/2042/1899 +f 1491/2041/1900 1995/2040/1900 1492/2042/1900 496/2043/1900 +f 499/2037/1901 1490/2036/1901 1996/2044/1901 1493/2045/1901 +f 1490/2036/1902 397/1609/1902 1286/2046/1902 1996/2044/1902 +f 1996/2044/1903 1286/2046/1903 399/2047/1903 1494/2048/1903 +f 1493/2045/1904 1996/2044/1904 1494/2048/1904 497/2049/1904 +f 400/2050/1905 1275/2051/1905 1997/2052/1905 1495/2053/1905 +f 1275/2051/1906 398/2038/1906 1491/2041/1906 1997/2052/1906 +f 1997/2052/1907 1491/2041/1907 496/2043/1907 1496/2054/1907 +f 1495/2053/1908 1997/2052/1908 1496/2054/1908 494/2055/1908 +f 497/2049/1909 1494/2048/1909 1998/2056/1909 1497/2057/1909 +f 1494/2048/1910 399/2047/1910 1280/2058/1910 1998/2056/1910 +f 1998/2056/1911 1280/2058/1911 401/2059/1911 1498/2060/1911 +f 1497/2057/1912 1998/2056/1912 1498/2060/1912 495/2061/1912 +f 388/2062/1913 1268/2063/1913 1999/2064/1913 1499/2065/1913 +f 1268/2063/1914 400/2050/1914 1495/2053/1914 1999/2064/1914 +f 1999/2064/1915 1495/2053/1915 494/2055/1915 1500/2066/1915 +f 1499/2065/1916 1999/2064/1916 1500/2066/1916 506/2067/1916 +f 495/2061/1917 1498/2060/1917 2000/2068/1917 1501/2069/1917 +f 1498/2060/1918 401/2059/1918 1273/2070/1918 2000/2068/1918 +f 2000/2068/1919 1273/2070/1919 389/2071/1919 1502/2072/1919 +f 1501/2069/1920 2000/2068/1920 1502/2072/1920 507/2073/1920 +f 494/2055/1921 1503/2074/1921 2001/2075/1921 1500/2066/1921 +f 1503/2074/1922 502/2015/1922 1479/2014/1922 2001/2075/1922 +f 2001/2075/1923 1479/2014/1923 504/2013/1923 1504/2076/1923 +f 1500/2066/1924 2001/2075/1924 1504/2076/1924 506/2067/1924 +f 505/2016/1925 1480/2019/1925 2002/2077/1925 1505/2078/1925 +f 1480/2019/1926 503/2021/1926 1506/2079/1926 2002/2077/1926 +f 2002/2077/1927 1506/2079/1927 495/2061/1927 1501/2069/1927 +f 1505/2078/1928 2002/2077/1928 1501/2069/1928 507/2073/1928 +f 494/2055/1929 1496/2054/1929 2003/2080/1929 1503/2074/1929 +f 1496/2054/1930 496/2043/1930 1507/2081/1930 2003/2080/1930 +f 2003/2080/1931 1507/2081/1931 500/2025/1931 1484/2024/1931 +f 1503/2074/1932 2003/2080/1932 1484/2024/1932 502/2015/1932 +f 501/2029/1933 1508/2082/1933 2004/2083/1933 1485/2027/1933 +f 1508/2082/1934 497/2049/1934 1497/2057/1934 2004/2083/1934 +f 2004/2083/1935 1497/2057/1935 495/2061/1935 1506/2079/1935 +f 1485/2027/1936 2004/2083/1936 1506/2079/1936 503/2021/1936 +f 496/2043/1937 1492/2042/1937 2005/2084/1937 1507/2081/1937 +f 498/2033/1938 1488/2032/1938 2005/2084/1938 1492/2042/1938 +f 500/2025/1939 1507/2081/1939 2005/2084/1939 1488/2032/1939 +f 501/2029/1940 1489/2035/1940 2006/2085/1940 1508/2082/1940 +f 499/2037/1941 1493/2045/1941 2006/2085/1941 1489/2035/1941 +f 497/2049/1942 1508/2082/1942 2006/2085/1942 1493/2045/1942 +f 314/1402/1943 1233/1501/1943 2007/2086/1943 1509/2087/1943 +f 1233/1501/1944 382/1494/1944 1343/2088/1944 2007/2086/1944 +f 2007/2086/1945 1343/2088/1945 388/2089/1945 1499/2090/1945 +f 1509/2087/1946 2007/2086/1946 1499/2090/1946 506/2091/1946 +f 389/2071/1947 1348/2092/1947 2008/2093/1947 1502/2072/1947 +f 1348/2092/1948 383/2094/1948 1234/2095/1948 2008/2093/1948 +f 2008/2093/1949 1234/2095/1949 315/2096/1949 1510/2097/1949 +f 1502/2072/1950 2008/2093/1950 1510/2097/1950 507/2073/1950 +f 314/2098/1951 1509/2099/1951 2009/2100/1951 1253/2101/1951 +f 1509/2099/1952 506/2067/1952 1504/2076/1952 2009/2100/1952 +f 2009/2100/1953 1504/2076/1953 504/2013/1953 1511/2102/1953 +f 1253/2101/1954 2009/2100/1954 1511/2102/1954 322/2103/1954 +f 505/2016/1955 1505/2078/1955 2010/2104/1955 1512/2105/1955 +f 1505/2078/1956 507/2073/1956 1510/2097/1956 2010/2104/1956 +f 2010/2104/1957 1510/2097/1957 315/2096/1957 1258/2106/1957 +f 1512/2105/1958 2010/2104/1958 1258/2106/1958 323/2107/1958 +f 320/1710/1959 1261/2108/1959 2011/2109/1959 1337/1711/1959 +f 1261/2108/1960 322/2103/1960 1511/2102/1960 2011/2109/1960 +f 2011/2109/1961 1511/2102/1961 504/2013/1961 1478/2012/1961 +f 1337/1711/1962 2011/2109/1962 1478/2012/1962 390/1639/1962 +f 505/2016/1963 1512/2105/1963 2012/2110/1963 1481/2017/1963 +f 1512/2105/1964 323/2107/1964 1264/2111/1964 2012/2110/1964 +f 2012/2110/1965 1264/2111/1965 321/1719/1965 1340/1718/1965 +f 1481/2017/1966 2012/2110/1966 1340/1718/1966 391/1645/1966 diff --git a/modules/ufbx/data/blender_293_suzanne_subsurf_7400_binary.fbx b/modules/ufbx/data/blender_293_suzanne_subsurf_7400_binary.fbx new file mode 100644 index 0000000..61745b4 Binary files /dev/null and b/modules/ufbx/data/blender_293_suzanne_subsurf_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293_suzanne_subsurf_uv.obj b/modules/ufbx/data/blender_293_suzanne_subsurf_uv.obj new file mode 100644 index 0000000..605ed32 --- /dev/null +++ b/modules/ufbx/data/blender_293_suzanne_subsurf_uv.obj @@ -0,0 +1,32244 @@ +# ufbx:bad_normals +# Blender v2.93.2 OBJ File: '' +# www.blender.org +mtllib blender_293_suzanne_subsurf_uv.mtl +g SharpNone_Suzanne +v -4.061157 0.160767 0.759033 +v -4.938843 0.160767 0.759033 +v -4.012695 0.108154 0.685547 +v -4.987305 0.108154 0.685547 +v -3.967773 0.068359 0.581055 +v -5.032227 0.068359 0.581055 +v -4.148438 -0.003906 0.616211 +v -4.851562 -0.003906 0.616211 +v -4.148315 0.052246 0.713013 +v -4.851685 0.052246 0.713013 +v -4.147583 0.127197 0.776123 +v -4.852417 0.127197 0.776123 +v -4.229858 0.160767 0.790894 +v -4.770142 0.160767 0.790894 +v -4.283325 0.108154 0.734497 +v -4.716675 0.108154 0.734497 +v -4.329102 0.068359 0.645508 +v -4.670898 0.068359 0.645508 +v -4.402344 0.243164 0.654297 +v -4.597656 0.243164 0.654297 +v -4.339355 0.242432 0.738037 +v -4.660645 0.242432 0.738037 +v -4.263428 0.243042 0.792969 +v -4.736572 0.243042 0.792969 +v -4.229858 0.329590 0.790894 +v -4.770142 0.329590 0.790894 +v -4.283325 0.377930 0.734497 +v -4.716675 0.377930 0.734497 +v -4.329102 0.422852 0.645508 +v -4.670898 0.422852 0.645508 +v -4.148438 0.496094 0.616211 +v -4.851562 0.496094 0.616211 +v -4.148315 0.434082 0.713013 +v -4.851685 0.434082 0.713013 +v -4.147583 0.364014 0.776123 +v -4.852417 0.364014 0.776123 +v -4.061157 0.329590 0.759033 +v -4.938843 0.329590 0.759033 +v -4.012695 0.377930 0.685547 +v -4.987305 0.377930 0.685547 +v -3.967773 0.422852 0.581055 +v -5.032227 0.422852 0.581055 +v -3.894531 0.243164 0.566406 +v -5.105469 0.243164 0.566406 +v -3.956543 0.242432 0.672607 +v -5.043457 0.242432 0.672607 +v -4.027344 0.243042 0.751221 +v -4.972656 0.243042 0.751221 +v -4.044596 0.243083 0.778971 +v -4.955404 0.243083 0.778971 +v -4.072469 0.318929 0.785848 +v -4.927531 0.318929 0.785848 +v -4.147542 0.350505 0.803426 +v -4.852458 0.350505 0.803426 +v -4.219076 0.318929 0.816406 +v -4.780924 0.318929 0.816406 +v -4.249756 0.243083 0.818197 +v -4.750244 0.243083 0.818197 +v -4.219076 0.171549 0.816406 +v -4.780924 0.171549 0.816406 +v -4.148031 0.242798 0.822428 +v -4.851969 0.242798 0.822428 +v -4.147542 0.140869 0.803426 +v -4.852458 0.140869 0.803426 +v -4.072469 0.171549 0.785848 +v -4.927531 0.171549 0.785848 +v -4.500000 0.432861 0.736816 +v -4.500000 0.352431 0.809679 +v -4.500000 -0.661133 0.736328 +v -4.500000 -0.306152 0.779297 +v -4.500000 -0.175293 0.791260 +v -4.500000 -0.765137 0.714600 +v -4.500000 0.439046 0.617676 +v -4.500000 0.566551 0.546875 +v -4.500000 0.855713 -0.490723 +v -4.500000 0.518066 -0.772461 +v -4.500000 0.093262 -0.771973 +v -4.500000 -0.352295 -0.304688 +v -4.273071 -0.177246 0.577515 +v -4.726929 -0.177246 0.577515 +v -4.211304 -0.443359 0.565674 +v -4.788696 -0.443359 0.565674 +v -4.176025 -0.664795 0.558960 +v -4.823975 -0.664795 0.558960 +v -4.161133 -0.845703 0.532471 +v -4.838867 -0.845703 0.532471 +v -4.197632 -0.930664 0.526001 +v -4.802368 -0.930664 0.526001 +v -4.328613 -0.960205 0.548950 +v -4.671387 -0.960205 0.548950 +v -4.500000 -0.974121 0.565918 +v -4.072998 -0.116943 0.545776 +v -4.927002 -0.116943 0.545776 +v -3.874634 -0.012573 0.525269 +v -5.125366 -0.012573 0.525269 +v -3.710571 0.167603 0.481934 +v -5.289429 0.167603 0.481934 +v -3.683228 0.393555 0.573364 +v -5.316772 0.393555 0.573364 +v -3.806763 0.479858 0.624512 +v -5.193237 0.479858 0.624512 +v -4.008545 0.592407 0.682251 +v -4.991455 0.592407 0.682251 +v -4.177612 0.711792 0.726685 +v -4.822388 0.711792 0.726685 +v -4.325439 0.676270 0.748169 +v -4.674561 0.676270 0.748169 +v -4.424194 0.499878 0.743896 +v -4.575806 0.499878 0.743896 +v -4.333008 0.407227 0.780640 +v -4.666992 0.407227 0.780640 +v -4.377441 0.310059 0.773926 +v -4.622559 0.310059 0.773926 +v -4.287231 0.071533 0.748657 +v -4.712769 0.071533 0.748657 +v -4.128784 0.027466 0.706543 +v -4.871216 0.027466 0.706543 +v -3.994385 0.075317 0.672729 +v -5.005615 0.075317 0.672729 +v -3.882080 0.189331 0.650635 +v -5.117920 0.189331 0.650635 +v -3.860229 0.300171 0.656006 +v -5.139771 0.300171 0.656006 +v -3.909912 0.376709 0.680542 +v -5.090088 0.376709 0.680542 +v -4.060913 0.443237 0.730469 +v -4.939087 0.443237 0.730469 +v -4.253540 0.473877 0.770996 +v -4.746460 0.473877 0.770996 +v -4.500000 -0.746338 0.732666 +v -4.387500 -0.737188 0.726406 +v -4.612500 -0.737188 0.726406 +v -4.378296 -0.835449 0.702271 +v -4.621704 -0.835449 0.702271 +v -4.428955 -0.882446 0.687744 +v -4.571045 -0.882446 0.687744 +v -4.500000 -0.893311 0.682861 +v -4.500000 -0.163086 0.768555 +v -4.500000 -0.134440 0.747396 +v -4.403931 -0.148438 0.753906 +v -4.596069 -0.148438 0.753906 +v -4.376343 -0.225220 0.750610 +v -4.623657 -0.225220 0.750610 +v -4.410469 -0.299844 0.743984 +v -4.589531 -0.299844 0.743984 +v -4.106201 -0.043579 0.667725 +v -4.893799 -0.043579 0.667725 +v -3.906494 0.050903 0.620850 +v -5.093506 0.050903 0.620850 +v -3.786621 0.197754 0.599365 +v -5.213379 0.197754 0.599365 +v -3.766113 0.355591 0.647339 +v -5.233887 0.355591 0.647339 +v -3.841797 0.427490 0.707153 +v -5.158203 0.427490 0.707153 +v -4.043091 0.536621 0.769775 +v -4.956909 0.536621 0.769775 +v -4.182617 0.619995 0.808838 +v -4.817383 0.619995 0.808838 +v -4.295166 0.592285 0.825439 +v -4.704834 0.592285 0.825439 +v -4.394287 0.447510 0.821411 +v -4.605713 0.447510 0.821411 +v -4.357584 -0.096300 0.776693 +v -4.642416 -0.096300 0.776693 +v -4.291748 -0.459473 0.695435 +v -4.708252 -0.459473 0.695435 +v -4.257202 -0.682739 0.678345 +v -4.742798 -0.682739 0.678345 +v -4.246216 -0.813354 0.655640 +v -4.753784 -0.813354 0.655640 +v -4.274902 -0.899292 0.632568 +v -4.725098 -0.899292 0.632568 +v -4.356079 -0.927979 0.631592 +v -4.643921 -0.927979 0.631592 +v -4.500000 -0.939697 0.636719 +v -4.500000 0.041558 0.738824 +v -4.500000 0.209473 0.765137 +v -4.170044 0.484375 0.755249 +v -4.829956 0.484375 0.755249 +v -4.350464 0.133545 0.752197 +v -4.649536 0.133545 0.752197 +v -4.376343 0.213989 0.761841 +v -4.623657 0.213989 0.761841 +v -4.385620 -0.664185 0.730225 +v -4.614380 -0.664185 0.730225 +v -4.410522 -0.457153 0.742188 +v -4.589478 -0.457153 0.742188 +v -4.500000 -0.458984 0.747070 +v -4.500000 -0.333008 0.748047 +v -4.415771 -0.272339 0.781250 +v -4.584229 -0.272339 0.781250 +v -4.378662 -0.221191 0.791138 +v -4.621338 -0.221191 0.791138 +v -4.399658 -0.147827 0.782104 +v -4.600342 -0.147827 0.782104 +v -4.460327 -0.138428 0.782104 +v -4.539673 -0.138428 0.782104 +v -4.500000 -0.202365 0.823351 +v -4.452257 -0.157769 0.809028 +v -4.547743 -0.157769 0.809028 +v -4.411892 -0.165148 0.809028 +v -4.588108 -0.165148 0.809028 +v -4.406006 -0.218994 0.819458 +v -4.593994 -0.218994 0.819458 +v -4.429904 -0.256510 0.804471 +v -4.570096 -0.256510 0.804471 +v -4.500000 -0.274170 0.804688 +v -4.253540 -0.315674 0.560303 +v -4.746460 -0.315674 0.560303 +v -4.335327 -0.234375 0.705688 +v -4.664673 -0.234375 0.705688 +v -4.319824 -0.317871 0.695801 +v -4.680176 -0.317871 0.695801 +v -4.278442 -0.244995 0.565674 +v -4.721558 -0.244995 0.565674 +v -4.500000 -0.873047 0.680908 +v -4.451294 -0.862427 0.684082 +v -4.548706 -0.862427 0.684082 +v -4.409424 -0.816895 0.701782 +v -4.590576 -0.816895 0.701782 +v -4.416138 -0.754517 0.716675 +v -4.583862 -0.754517 0.716675 +v -4.500000 -0.782959 0.662842 +v -4.422607 -0.771606 0.664876 +v -4.577393 -0.771606 0.664876 +v -4.415799 -0.809245 0.658782 +v -4.584201 -0.809245 0.658782 +v -4.448975 -0.838623 0.644246 +v -4.551025 -0.838623 0.644246 +v -4.500000 -0.848877 0.642822 +v -4.327393 0.220825 0.773804 +v -4.672607 0.220825 0.773804 +v -4.310669 0.158203 0.769165 +v -4.689331 0.158203 0.769165 +v -4.162109 0.427856 0.757935 +v -4.837891 0.427856 0.757935 +v -4.228516 0.419922 0.769409 +v -4.771484 0.419922 0.769409 +v -4.071289 0.399902 0.753296 +v -4.928711 0.399902 0.753296 +v -3.951050 0.350830 0.697632 +v -5.048950 0.350830 0.697632 +v -3.915405 0.285400 0.681030 +v -5.084595 0.285400 0.681030 +v -3.931763 0.195679 0.680054 +v -5.068237 0.195679 0.680054 +v -4.023193 0.105957 0.709473 +v -4.976807 0.105957 0.709473 +v -4.130981 0.070679 0.737061 +v -4.869019 0.070679 0.737061 +v -4.260620 0.109009 0.767944 +v -4.739380 0.109009 0.767944 +v -4.321655 0.297974 0.776245 +v -4.678345 0.297974 0.776245 +v -4.288208 0.373779 0.776367 +v -4.711792 0.373779 0.776367 +v -4.264648 0.356445 0.758789 +v -4.735352 0.356445 0.758789 +v -4.299805 0.295898 0.756836 +v -4.700195 0.295898 0.756836 +v -4.246094 0.125977 0.752930 +v -4.753906 0.125977 0.752930 +v -4.130859 0.094727 0.727539 +v -4.869141 0.094727 0.727539 +v -4.039062 0.125000 0.702148 +v -4.960938 0.125000 0.702148 +v -3.962891 0.208008 0.675781 +v -5.037109 0.208008 0.675781 +v -3.949219 0.279297 0.672852 +v -5.050781 0.279297 0.672852 +v -3.980469 0.335938 0.687500 +v -5.019531 0.335938 0.687500 +v -4.081055 0.385742 0.741211 +v -4.918945 0.385742 0.741211 +v -4.217773 0.394531 0.762695 +v -4.782227 0.394531 0.762695 +v -4.161133 0.403320 0.751953 +v -4.838867 0.403320 0.751953 +v -4.292969 0.172852 0.750977 +v -4.707031 0.172852 0.750977 +v -4.303711 0.228516 0.750977 +v -4.696289 0.228516 0.750977 +v -4.374479 0.489245 0.612891 +v -4.625521 0.489245 0.612891 +v -4.294271 0.638021 0.640625 +v -4.705729 0.638021 0.640625 +v -4.172309 0.665365 0.622179 +v -4.827691 0.665365 0.622179 +v -4.041875 0.553438 0.557578 +v -4.958125 0.553438 0.557578 +v -3.831909 0.463501 0.489014 +v -5.168091 0.463501 0.489014 +v -3.719604 0.385376 0.449707 +v -5.280396 0.385376 0.449707 +v -3.730225 0.177979 0.363892 +v -5.269775 0.177979 0.363892 +v -3.880493 -0.000366 0.387573 +v -5.119507 -0.000366 0.387573 +v -4.083333 -0.110781 0.449245 +v -4.916667 -0.110781 0.449245 +v -4.500000 0.856201 0.263916 +v -4.500000 0.950195 -0.085938 +v -4.500000 -0.175049 -0.618652 +v -4.500000 -0.436523 0.129395 +v -4.500000 -0.948242 0.456543 +v -4.500000 -0.786133 0.360352 +v -4.500000 -0.579346 0.325684 +v -4.500000 -0.475830 0.270508 +v -3.685303 0.226074 0.114136 +v -5.314697 0.226074 0.114136 +v -3.663672 0.300938 -0.049844 +v -5.336329 0.300938 -0.049844 +v -3.737187 0.282891 -0.418750 +v -5.262813 0.282891 -0.418750 +v -4.091309 0.442139 -0.665405 +v -4.908691 0.442139 -0.665405 +v -3.799687 -0.032500 0.072813 +v -5.200313 -0.032500 0.072812 +v -3.883906 -0.109531 -0.167969 +v -5.116094 -0.109531 -0.167969 +v -3.850220 0.005127 -0.400513 +v -5.149780 0.005127 -0.400513 +v -4.174479 0.077148 -0.660970 +v -4.825521 0.077148 -0.660970 +v -4.263306 -0.381104 0.408813 +v -4.736694 -0.381104 0.408813 +v -4.338135 -0.426758 0.279297 +v -4.661865 -0.426758 0.279297 +v -4.220459 -0.735840 0.403076 +v -4.779541 -0.735840 0.403076 +v -4.250000 -0.535645 0.407837 +v -4.750000 -0.535645 0.407837 +v -4.213976 -0.887153 0.430339 +v -4.786024 -0.887153 0.430339 +v -4.357666 -0.753784 0.373901 +v -4.642334 -0.753784 0.373901 +v -4.368042 -0.550171 0.349487 +v -4.631958 -0.550171 0.349487 +v -4.337280 -0.924683 0.441650 +v -4.662720 -0.924683 0.441650 +v -4.264167 -0.284766 0.404818 +v -4.735833 -0.284766 0.404818 +v -4.260824 -0.215210 0.474040 +v -4.739176 -0.215210 0.474040 +v -4.246890 -0.171658 0.501808 +v -4.753110 -0.171658 0.501808 +v -4.287370 -0.369297 0.155833 +v -4.712630 -0.369297 0.155833 +v -4.226807 -0.293091 -0.251099 +v -4.773193 -0.293091 -0.251099 +v -4.189127 -0.132080 -0.535482 +v -4.810873 -0.132080 -0.535482 +v -4.079712 0.804932 -0.407593 +v -4.920288 0.804932 -0.407593 +v -4.080078 0.896362 -0.089233 +v -4.919922 0.896362 -0.089233 +v -4.079468 0.808472 0.206787 +v -4.920532 0.808472 0.206787 +v -4.071167 0.561523 0.418091 +v -4.928833 0.561523 0.418091 +v -3.756592 0.409424 0.289062 +v -5.243408 0.409424 0.289062 +v -3.869385 0.487549 0.302734 +v -5.130615 0.487549 0.302734 +v -3.864990 0.679565 0.081543 +v -5.135010 0.679565 0.081543 +v -3.722290 0.535889 0.090576 +v -5.277710 0.535889 0.090576 +v -3.719849 0.582275 -0.138916 +v -5.280151 0.582275 -0.138916 +v -3.863281 0.740601 -0.170044 +v -5.136719 0.740601 -0.170044 +v -3.865723 0.650391 -0.414062 +v -5.134277 0.650391 -0.414062 +v -3.741754 0.524089 -0.343750 +v -5.258246 0.524089 -0.343750 +v -3.896851 0.339111 -0.558228 +v -5.103149 0.339111 -0.558228 +v -4.017995 0.019531 -0.522786 +v -4.982005 0.019531 -0.522786 +v -3.675234 0.347656 -0.205313 +v -5.324766 0.347656 -0.205313 +v -4.094245 -0.181641 0.158802 +v -4.905755 -0.181641 0.158802 +v -4.061157 -0.174072 -0.207764 +v -4.938843 -0.174072 -0.207764 +v -3.602051 0.395508 -0.258789 +v -5.397949 0.395508 -0.258789 +v -3.706665 -0.121094 -0.181519 +v -5.293335 -0.121094 -0.181519 +v -3.464111 -0.077881 -0.333130 +v -5.535889 -0.077881 -0.333130 +v -3.245117 0.070923 -0.426514 +v -5.754883 0.070923 -0.426514 +v -3.179565 0.304077 -0.431396 +v -5.820435 0.304077 -0.431396 +v -3.281494 0.467773 -0.420288 +v -5.718506 0.467773 -0.420288 +v -3.468018 0.459351 -0.333862 +v -5.531982 0.459351 -0.333862 +v -3.472778 0.409180 -0.304321 +v -5.527222 0.409180 -0.304321 +v -3.320190 0.415039 -0.389526 +v -5.679810 0.415039 -0.389526 +v -3.244629 0.280273 -0.411621 +v -5.755371 0.280273 -0.411621 +v -3.299194 0.088623 -0.401611 +v -5.700806 0.088623 -0.401611 +v -3.469482 -0.031006 -0.306030 +v -5.530518 -0.031006 -0.306030 +v -3.660400 -0.064575 -0.168579 +v -5.339600 -0.064575 -0.168579 +v -3.576294 0.356445 -0.236816 +v -5.423706 0.356445 -0.236816 +v -3.553833 0.306885 -0.293213 +v -5.446167 0.306885 -0.293213 +v -3.613037 -0.023926 -0.235107 +v -5.386963 -0.023926 -0.235107 +v -3.462036 0.004150 -0.356323 +v -5.537964 0.004150 -0.356323 +v -3.319946 0.099243 -0.435547 +v -5.680054 0.099243 -0.435547 +v -3.272949 0.247681 -0.445068 +v -5.727051 0.247681 -0.445068 +v -3.334961 0.350952 -0.428589 +v -5.665039 0.350952 -0.428589 +v -3.466797 0.347534 -0.358643 +v -5.533203 0.347534 -0.358643 +v -3.648682 0.287598 -0.216064 +v -5.351318 0.287598 -0.216064 +v -3.671143 0.173584 -0.270386 +v -5.328857 0.173584 -0.270386 +v -3.727539 0.096680 -0.270264 +v -5.272461 0.096680 -0.270264 +v -3.688368 0.071181 -0.281467 +v -5.311632 0.071181 -0.281467 +v -3.676392 0.022583 -0.269653 +v -5.323608 0.022583 -0.269653 +v -3.686279 -0.013672 -0.259521 +v -5.313721 -0.013672 -0.259521 +v -3.760823 0.032064 -0.078288 +v -5.239176 0.032064 -0.078288 +v -3.772474 -0.027448 -0.168229 +v -5.227526 -0.027448 -0.168229 +v -3.761693 0.048411 -0.191979 +v -5.238307 0.048411 -0.191979 +v -3.696411 0.201538 -0.198730 +v -5.303589 0.201538 -0.198730 +v -3.614502 0.245972 -0.269043 +v -5.385498 0.245972 -0.269043 +v -3.599365 0.226685 -0.320068 +v -5.400635 0.226685 -0.320068 +v -3.662977 -0.007595 -0.299479 +v -5.337023 -0.007595 -0.299479 +v -3.646973 0.024536 -0.315186 +v -5.353027 0.024536 -0.315186 +v -3.669312 0.077881 -0.315430 +v -5.330688 0.077881 -0.315430 +v -3.705295 0.106554 -0.310113 +v -5.294705 0.106554 -0.310113 +v -3.654541 0.162964 -0.315552 +v -5.345459 0.162964 -0.315552 +v -3.450887 0.320719 -0.404785 +v -5.549113 0.320719 -0.404785 +v -3.335165 0.323649 -0.460449 +v -5.664835 0.323649 -0.460449 +v -3.277588 0.234009 -0.471924 +v -5.722412 0.234009 -0.471924 +v -3.324097 0.106567 -0.460327 +v -5.675903 0.106567 -0.460327 +v -3.460205 0.023315 -0.397949 +v -5.539795 0.023315 -0.397949 +v -3.600586 -0.004639 -0.291016 +v -5.399414 -0.004639 -0.291016 +v -3.537231 0.281982 -0.345825 +v -5.462769 0.281982 -0.345825 +v -3.609497 0.114258 -0.329834 +v -5.390503 0.114258 -0.329834 +v -3.575806 0.060791 -0.331177 +v -5.424194 0.060791 -0.331177 +v -3.500000 0.116333 -0.369141 +v -5.500000 0.116333 -0.369141 +v -3.544312 0.173706 -0.349731 +v -5.455688 0.173706 -0.349731 +v -3.485474 0.232300 -0.371948 +v -5.514526 0.232300 -0.371948 +v -3.432251 0.177734 -0.392822 +v -5.567749 0.177734 -0.392822 +v -3.376519 0.223524 -0.411024 +v -5.623481 0.223524 -0.411024 +v -3.412923 0.274699 -0.401489 +v -5.587077 0.274699 -0.401489 +v -3.467163 0.375732 -0.458740 +v -5.532837 0.375732 -0.458740 +v -3.260173 0.400635 -0.516642 +v -5.739827 0.400635 -0.516642 +v -3.171731 0.287543 -0.496600 +v -5.828269 0.287543 -0.496600 +v -3.225016 0.114136 -0.510905 +v -5.774983 0.114136 -0.510905 +v -3.460083 -0.011475 -0.456787 +v -5.539917 -0.011475 -0.456787 +v -3.692017 -0.048950 -0.340698 +v -5.307983 -0.048950 -0.340698 +v -3.635620 0.318726 -0.376953 +v -5.364380 0.318726 -0.376953 +v -3.996094 0.242676 0.717773 +v -4.036133 0.198242 0.753418 +v -4.040039 0.137207 0.728027 +v -3.971680 0.169922 0.676270 +v -5.028320 0.169922 0.676270 +v -4.959961 0.137207 0.728027 +v -4.963867 0.198242 0.753418 +v -5.003906 0.242676 0.717773 +v -3.923828 0.242676 0.621094 +v -3.989258 0.086426 0.635254 +v -3.914062 0.148438 0.570312 +v -5.085938 0.148438 0.570312 +v -5.010742 0.086426 0.635254 +v -5.076172 0.242676 0.621094 +v -4.075195 0.067383 0.698730 +v -4.148438 0.021484 0.666992 +v -4.050781 0.015625 0.597656 +v -4.949219 0.015625 0.597656 +v -4.851562 0.021484 0.666992 +v -4.924805 0.067383 0.698730 +v -4.101074 0.136230 0.767090 +v -4.147949 0.093750 0.749512 +v -4.852051 0.093750 0.749512 +v -4.898926 0.136230 0.767090 +v -4.192383 0.136230 0.784668 +v -4.253418 0.137207 0.767090 +v -4.221191 0.067383 0.725586 +v -4.778809 0.067383 0.725586 +v -4.746582 0.137207 0.767090 +v -4.807617 0.136230 0.784668 +v -4.307617 0.086426 0.692383 +v -4.246094 0.015625 0.632812 +v -4.753906 0.015625 0.632812 +v -4.692383 0.086426 0.692383 +v -4.324219 0.169922 0.737793 +v -4.373047 0.242676 0.698242 +v -4.382812 0.148438 0.652344 +v -4.617188 0.148438 0.652344 +v -4.626953 0.242676 0.698242 +v -4.675781 0.169922 0.737793 +v -4.254395 0.198242 0.792969 +v -4.296875 0.242676 0.769531 +v -4.703125 0.242676 0.769531 +v -4.745605 0.198242 0.792969 +v -4.254395 0.289551 0.792969 +v -4.253418 0.350586 0.767090 +v -4.324219 0.315430 0.737793 +v -4.675781 0.315430 0.737793 +v -4.746582 0.350586 0.767090 +v -4.745605 0.289551 0.792969 +v -4.307617 0.401367 0.692383 +v -4.382812 0.339844 0.652344 +v -4.617188 0.339844 0.652344 +v -4.692383 0.401367 0.692383 +v -4.221191 0.418945 0.725586 +v -4.148438 0.466797 0.666992 +v -4.246094 0.476562 0.632812 +v -4.753906 0.476562 0.632812 +v -4.851562 0.466797 0.666992 +v -4.778809 0.418945 0.725586 +v -4.192383 0.354980 0.784668 +v -4.147949 0.394531 0.749512 +v -4.852051 0.394531 0.749512 +v -4.807617 0.354980 0.784668 +v -4.101074 0.354980 0.767090 +v -4.040039 0.350586 0.728027 +v -4.075195 0.418945 0.698730 +v -4.924805 0.418945 0.698730 +v -4.959961 0.350586 0.728027 +v -4.898926 0.354980 0.767090 +v -3.989258 0.401367 0.635254 +v -4.050781 0.476562 0.597656 +v -4.949219 0.476562 0.597656 +v -5.010742 0.401367 0.635254 +v -3.971680 0.315430 0.676270 +v -3.914062 0.339844 0.570312 +v -5.085938 0.339844 0.570312 +v -5.028320 0.315430 0.676270 +v -4.036133 0.289551 0.753418 +v -4.963867 0.289551 0.753418 +v -4.035156 0.243164 0.767578 +v -4.065918 0.325195 0.774902 +v -4.049154 0.284668 0.779622 +v -4.950846 0.284668 0.779622 +v -4.934082 0.325195 0.774902 +v -4.964844 0.243164 0.767578 +v -4.147461 0.358398 0.792480 +v -4.105957 0.344564 0.793457 +v -4.894043 0.344564 0.793457 +v -4.852539 0.358398 0.792480 +v -4.224609 0.325195 0.806641 +v -4.187337 0.344564 0.810872 +v -4.812663 0.344564 0.810872 +v -4.775391 0.325195 0.806641 +v -4.256836 0.243164 0.808594 +v -4.243652 0.284668 0.818034 +v -4.756348 0.284668 0.818034 +v -4.743164 0.243164 0.808594 +v -4.224609 0.166016 0.806641 +v -4.243652 0.203288 0.818034 +v -4.756348 0.203288 0.818034 +v -4.775391 0.166016 0.806641 +v -4.147461 0.133789 0.792480 +v -4.187337 0.146973 0.810872 +v -4.812663 0.146973 0.810872 +v -4.852539 0.133789 0.792480 +v -4.065918 0.166016 0.774902 +v -4.105957 0.146973 0.793457 +v -4.894043 0.146973 0.793457 +v -4.934082 0.166016 0.774902 +v -4.049154 0.203288 0.779622 +v -4.950846 0.203288 0.779622 +v -4.080729 0.242839 0.797526 +v -4.098958 0.195964 0.802083 +v -4.919271 0.242839 0.797526 +v -4.901042 0.195964 0.802083 +v -4.147787 0.175781 0.813802 +v -4.852213 0.175781 0.813802 +v -4.194662 0.195964 0.822266 +v -4.805338 0.195964 0.822266 +v -4.214844 0.242839 0.823568 +v -4.785156 0.242839 0.823568 +v -4.194662 0.292318 0.822266 +v -4.805338 0.292318 0.822266 +v -4.147787 0.313151 0.813802 +v -4.852213 0.313151 0.813802 +v -4.098958 0.292318 0.802083 +v -4.901042 0.292318 0.802083 +v -4.412109 -0.969727 0.560547 +v -4.335938 -0.948730 0.593750 +v -4.423340 -0.936035 0.634766 +v -4.500000 -0.960938 0.605469 +v -4.576660 -0.936035 0.634766 +v -4.664062 -0.948730 0.593750 +v -4.587891 -0.969727 0.560547 +v -4.253906 -0.949219 0.535645 +v -4.228027 -0.922852 0.582520 +v -4.307617 -0.918457 0.629883 +v -4.692383 -0.918457 0.629883 +v -4.771973 -0.922852 0.582520 +v -4.746094 -0.949219 0.535645 +v -4.169434 -0.898438 0.525391 +v -4.189941 -0.845215 0.599121 +v -4.254883 -0.862305 0.642578 +v -4.745117 -0.862305 0.642578 +v -4.810059 -0.845215 0.599121 +v -4.830566 -0.898438 0.525391 +v -4.164551 -0.765625 0.545898 +v -4.202148 -0.686523 0.626465 +v -4.247559 -0.758301 0.667480 +v -4.752441 -0.758301 0.667480 +v -4.797852 -0.686523 0.626465 +v -4.835449 -0.765625 0.545898 +v -4.191895 -0.549805 0.564941 +v -4.238770 -0.457520 0.638184 +v -4.273438 -0.572266 0.688477 +v -4.726562 -0.572266 0.688477 +v -4.761230 -0.457520 0.638184 +v -4.808105 -0.549805 0.564941 +v -4.299805 -0.150879 0.669922 +v -4.187012 -0.148926 0.563477 +v -4.087891 -0.087402 0.609863 +v -4.227539 -0.069336 0.715332 +v -4.772461 -0.069336 0.715332 +v -4.912109 -0.087402 0.609863 +v -4.812988 -0.148926 0.563477 +v -4.700195 -0.150879 0.669922 +v -3.970215 -0.072754 0.537598 +v -3.881836 0.016113 0.577148 +v -3.998047 -0.003418 0.639160 +v -5.001953 -0.003418 0.639160 +v -5.118164 0.016113 0.577148 +v -5.029785 -0.072754 0.537598 +v -3.782227 0.067383 0.495117 +v -3.738770 0.183105 0.543457 +v -3.834961 0.119141 0.604004 +v -5.165039 0.119141 0.604004 +v -5.261230 0.183105 0.543457 +v -5.217773 0.067383 0.495117 +v -3.677246 0.288574 0.520508 +v -3.714844 0.379883 0.618652 +v -3.764648 0.283203 0.617676 +v -5.235352 0.283203 0.617676 +v -5.285156 0.379883 0.618652 +v -5.322754 0.288574 0.520508 +v -3.729492 0.445801 0.603027 +v -3.817383 0.458984 0.677734 +v -3.788086 0.395020 0.676758 +v -5.211914 0.395020 0.676758 +v -5.182617 0.458984 0.677734 +v -5.270508 0.445801 0.603027 +v -3.905762 0.530273 0.652832 +v -4.024414 0.574219 0.739258 +v -3.938477 0.479004 0.739746 +v -5.061523 0.479004 0.739746 +v -4.975586 0.574219 0.739258 +v -5.094238 0.530273 0.652832 +v -4.097168 0.661621 0.707031 +v -4.182129 0.679688 0.782227 +v -4.120605 0.587402 0.792480 +v -4.879395 0.587402 0.792480 +v -4.817871 0.679688 0.782227 +v -4.902832 0.661621 0.707031 +v -4.255859 0.716797 0.740723 +v -4.315430 0.645996 0.801270 +v -4.240723 0.623047 0.819824 +v -4.759277 0.623047 0.819824 +v -4.684570 0.645996 0.801270 +v -4.744141 0.716797 0.740723 +v -4.379883 0.589844 0.748047 +v -4.416016 0.478027 0.795898 +v -4.346191 0.523438 0.825684 +v -4.653809 0.523438 0.825684 +v -4.583984 0.478027 0.795898 +v -4.620117 0.589844 0.748047 +v -4.463379 0.448730 0.739258 +v -4.500000 0.408203 0.785156 +v -4.439941 0.395508 0.813477 +v -4.560059 0.395508 0.813477 +v -4.536621 0.448730 0.739258 +v -4.364258 0.425293 0.806152 +v -4.295410 0.446289 0.777344 +v -4.273438 0.529785 0.803223 +v -4.726562 0.529785 0.803223 +v -4.704590 0.446289 0.777344 +v -4.635742 0.425293 0.806152 +v -4.212891 0.486328 0.763672 +v -4.177246 0.548340 0.787109 +v -4.822754 0.548340 0.787109 +v -4.787109 0.486328 0.763672 +v -4.121582 0.468750 0.745605 +v -4.054199 0.488281 0.753906 +v -4.945801 0.488281 0.753906 +v -4.878418 0.468750 0.745605 +v -3.981445 0.411621 0.705566 +v -3.875977 0.399414 0.697754 +v -5.124023 0.399414 0.697754 +v -5.018555 0.411621 0.705566 +v -3.873047 0.341309 0.665039 +v -3.816406 0.325684 0.654297 +v -5.183594 0.325684 0.654297 +v -5.126953 0.341309 0.665039 +v -3.860840 0.248047 0.650391 +v -3.837402 0.195801 0.631348 +v -5.162598 0.195801 0.631348 +v -5.139160 0.248047 0.650391 +v -3.931152 0.128418 0.659180 +v -3.951172 0.066406 0.650391 +v -5.048828 0.066406 0.650391 +v -5.068848 0.128418 0.659180 +v -4.058105 0.040039 0.687988 +v -4.120117 -0.004883 0.693848 +v -4.879883 -0.004883 0.693848 +v -4.941895 0.040039 0.687988 +v -4.212891 0.042480 0.729980 +v -4.318359 0.006836 0.761230 +v -4.681641 0.006836 0.761230 +v -4.787109 0.042480 0.729980 +v -4.328613 0.101074 0.752930 +v -4.409668 0.096191 0.746094 +v -4.423828 -0.023926 0.763184 +v -4.576172 -0.023926 0.763184 +v -4.590332 0.096191 0.746094 +v -4.671387 0.101074 0.752930 +v -4.360840 0.360352 0.778809 +v -4.428223 0.325195 0.791016 +v -4.571777 0.325195 0.791016 +v -4.639160 0.360352 0.778809 +v -4.381348 0.260742 0.768066 +v -4.500000 0.275391 0.785156 +v -4.432129 0.210938 0.762695 +v -4.567871 0.210938 0.762695 +v -4.618652 0.260742 0.768066 +v -4.500000 0.140625 0.748047 +v -4.366211 0.171387 0.755859 +v -4.633789 0.171387 0.755859 +v -4.393066 -0.903809 0.665039 +v -4.463379 -0.891113 0.684082 +v -4.500000 -0.915039 0.664062 +v -4.536621 -0.891113 0.684082 +v -4.606934 -0.903809 0.665039 +v -4.330566 -0.865723 0.674316 +v -4.398926 -0.865234 0.693848 +v -4.601074 -0.865234 0.693848 +v -4.669434 -0.865723 0.674316 +v -4.314453 -0.773438 0.697266 +v -4.372070 -0.789062 0.712891 +v -4.627930 -0.789062 0.712891 +v -4.685547 -0.773438 0.697266 +v -4.352051 -0.458496 0.727539 +v -4.397949 -0.566895 0.736816 +v -4.320801 -0.673340 0.711914 +v -4.679199 -0.673340 0.711914 +v -4.602051 -0.566895 0.736816 +v -4.647949 -0.458496 0.727539 +v -4.382812 -0.712891 0.727051 +v -4.617188 -0.712891 0.727051 +v -4.414062 -0.371094 0.741699 +v -4.457031 -0.324219 0.748047 +v -4.500000 -0.381836 0.746094 +v -4.458008 -0.458008 0.747070 +v -4.541992 -0.458008 0.747070 +v -4.542969 -0.324219 0.748047 +v -4.585938 -0.371094 0.741699 +v -4.444336 -0.661133 0.736328 +v -4.500000 -0.563477 0.742188 +v -4.555664 -0.661133 0.736328 +v -4.500000 -0.717773 0.734375 +v -4.445801 -0.736816 0.732910 +v -4.554199 -0.736816 0.732910 +v -4.385254 -0.259277 0.747070 +v -4.378906 -0.222656 0.770508 +v -4.390137 -0.249512 0.787109 +v -4.416504 -0.279785 0.763184 +v -4.583496 -0.279785 0.763184 +v -4.609863 -0.249512 0.787109 +v -4.621094 -0.222656 0.770508 +v -4.614746 -0.259277 0.747070 +v -4.381836 -0.184570 0.753418 +v -4.402344 -0.150391 0.763184 +v -4.382324 -0.182129 0.787598 +v -4.617676 -0.182129 0.787598 +v -4.597656 -0.150391 0.763184 +v -4.618164 -0.184570 0.753418 +v -4.444824 -0.127930 0.750488 +v -4.472168 -0.141113 0.763184 +v -4.429199 -0.133789 0.780273 +v -4.570801 -0.133789 0.780273 +v -4.527832 -0.141113 0.763184 +v -4.555176 -0.127930 0.750488 +v -4.500000 -0.165039 0.756836 +v -4.500000 -0.176758 0.770508 +v -4.482422 -0.160156 0.787598 +v -4.517578 -0.160156 0.787598 +v -4.500000 -0.313477 0.761719 +v -4.454590 -0.294922 0.779297 +v -4.545410 -0.294922 0.779297 +v -4.500000 -0.293945 0.792969 +v -4.420410 -0.262695 0.795410 +v -4.458008 -0.266113 0.804688 +v -4.541992 -0.266113 0.804688 +v -4.579590 -0.262695 0.795410 +v -4.500000 -0.180664 0.808594 +v -4.467285 -0.175293 0.816406 +v -4.455078 -0.145020 0.798828 +v -4.544922 -0.145020 0.798828 +v -4.532715 -0.175293 0.816406 +v -4.431152 -0.157227 0.810547 +v -4.403320 -0.153809 0.798828 +v -4.596680 -0.153809 0.798828 +v -4.568848 -0.157227 0.810547 +v -4.405762 -0.187988 0.816406 +v -4.385742 -0.220703 0.808105 +v -4.614258 -0.220703 0.808105 +v -4.594238 -0.187988 0.816406 +v -4.415527 -0.240723 0.812988 +v -4.584473 -0.240723 0.812988 +v -4.445312 -0.213867 0.823242 +v -4.554688 -0.213867 0.823242 +v -4.500000 -0.244141 0.816406 +v -4.500000 -0.066406 0.745117 +v -4.396973 -0.128906 0.766113 +v -4.603027 -0.128906 0.766113 +v -4.360840 -0.229004 0.735840 +v -4.350098 -0.179688 0.734375 +v -4.649902 -0.179688 0.734375 +v -4.639160 -0.229004 0.735840 +v -4.364258 -0.310547 0.727539 +v -4.327148 -0.275391 0.695801 +v -4.672852 -0.275391 0.695801 +v -4.635742 -0.310547 0.727539 +v -4.307617 -0.376953 0.696777 +v -4.692383 -0.376953 0.696777 +v -4.233398 -0.368164 0.562988 +v -4.278320 -0.320312 0.633789 +v -4.721680 -0.320312 0.633789 +v -4.766602 -0.368164 0.562988 +v -4.267090 -0.277344 0.561035 +v -4.302734 -0.241699 0.639648 +v -4.697266 -0.241699 0.639648 +v -4.732910 -0.277344 0.561035 +v -4.291992 -0.210449 0.574707 +v -4.708008 -0.210449 0.574707 +v -4.410645 -0.747559 0.727539 +v -4.500000 -0.759766 0.727539 +v -4.452148 -0.756836 0.716309 +v -4.547852 -0.756836 0.716309 +v -4.589355 -0.747559 0.727539 +v -4.401367 -0.821777 0.710938 +v -4.403809 -0.780762 0.710938 +v -4.596191 -0.780762 0.710938 +v -4.598633 -0.821777 0.710938 +v -4.445801 -0.870117 0.693359 +v -4.427246 -0.844238 0.691895 +v -4.572754 -0.844238 0.691895 +v -4.554199 -0.870117 0.693359 +v -4.500000 -0.880859 0.688477 +v -4.475586 -0.871094 0.681152 +v -4.524414 -0.871094 0.681152 +v -4.500000 -0.865234 0.660156 +v -4.453125 -0.854980 0.662109 +v -4.473633 -0.846191 0.643066 +v -4.526367 -0.846191 0.643066 +v -4.546875 -0.854980 0.662109 +v -4.412109 -0.812988 0.676270 +v -4.427734 -0.826660 0.646810 +v -4.572266 -0.826660 0.646810 +v -4.587891 -0.812988 0.676270 +v -4.417969 -0.758789 0.691895 +v -4.410156 -0.787109 0.659017 +v -4.589844 -0.787109 0.659017 +v -4.582031 -0.758789 0.691895 +v -4.500000 -0.769531 0.689453 +v -4.456055 -0.775879 0.664551 +v -4.543945 -0.775879 0.664551 +v -4.500000 -0.815430 0.645508 +v -4.436523 -0.804199 0.647298 +v -4.563477 -0.804199 0.647298 +v -4.344727 0.217285 0.769043 +v -4.322266 0.150879 0.762695 +v -4.321777 0.187500 0.770996 +v -4.678223 0.187500 0.770996 +v -4.677734 0.150879 0.762695 +v -4.655273 0.217285 0.769043 +v -4.343262 0.301758 0.773438 +v -4.327637 0.258301 0.775391 +v -4.672363 0.258301 0.775391 +v -4.656738 0.301758 0.773438 +v -4.307617 0.389160 0.775391 +v -4.308594 0.337891 0.776855 +v -4.691406 0.337891 0.776855 +v -4.692383 0.389160 0.775391 +v -4.270020 0.099609 0.756836 +v -4.293945 0.132812 0.770508 +v -4.706055 0.132812 0.770508 +v -4.729980 0.099609 0.756836 +v -4.131348 0.052246 0.724121 +v -4.199707 0.084473 0.754395 +v -4.800293 0.084473 0.754395 +v -4.868652 0.052246 0.724121 +v -4.014648 0.090332 0.694824 +v -4.074219 0.079102 0.723145 +v -4.925781 0.079102 0.723145 +v -4.985352 0.090332 0.694824 +v -3.911621 0.190430 0.668457 +v -3.971680 0.147461 0.692871 +v -5.028320 0.147461 0.692871 +v -5.088379 0.190430 0.668457 +v -3.892090 0.289062 0.668945 +v -3.915527 0.242676 0.677734 +v -5.084473 0.242676 0.677734 +v -5.107910 0.289062 0.668945 +v -3.933594 0.361328 0.686523 +v -3.923828 0.320801 0.685059 +v -5.076172 0.320801 0.685059 +v -5.066406 0.361328 0.686523 +v -4.066406 0.415527 0.738281 +v -4.007324 0.377441 0.726562 +v -4.992676 0.377441 0.726562 +v -4.933594 0.415527 0.738281 +v -4.165039 0.447754 0.751465 +v -4.121582 0.417480 0.759277 +v -4.878418 0.417480 0.759277 +v -4.834961 0.447754 0.751465 +v -4.238770 0.439941 0.765137 +v -4.196777 0.428711 0.762695 +v -4.803223 0.428711 0.762695 +v -4.761230 0.439941 0.765137 +v -4.260254 0.401367 0.773926 +v -4.739746 0.401367 0.773926 +v -4.222168 0.405762 0.767578 +v -4.274902 0.363770 0.769531 +v -4.242188 0.378906 0.761719 +v -4.757812 0.378906 0.761719 +v -4.725098 0.363770 0.769531 +v -4.777832 0.405762 0.767578 +v -4.161133 0.414062 0.756836 +v -4.191406 0.402344 0.757812 +v -4.808594 0.402344 0.757812 +v -4.838867 0.414062 0.756836 +v -4.076172 0.391113 0.751465 +v -4.125000 0.398438 0.750000 +v -4.875000 0.398438 0.750000 +v -4.923828 0.391113 0.751465 +v -3.966309 0.342773 0.695801 +v -4.027344 0.363281 0.714844 +v -4.972656 0.363281 0.714844 +v -5.033691 0.342773 0.695801 +v -3.933594 0.282227 0.680176 +v -3.957031 0.308594 0.675781 +v -5.042969 0.308594 0.675781 +v -5.066406 0.282227 0.680176 +v -3.948242 0.201660 0.680664 +v -3.949219 0.246094 0.671875 +v -5.050781 0.246094 0.671875 +v -5.051758 0.201660 0.680664 +v -4.031250 0.116699 0.709473 +v -3.996094 0.164062 0.687500 +v -5.003906 0.164062 0.687500 +v -4.968750 0.116699 0.709473 +v -4.130859 0.083984 0.735840 +v -4.082031 0.101562 0.714844 +v -4.917969 0.101562 0.714844 +v -4.869141 0.083984 0.735840 +v -4.252930 0.117676 0.764160 +v -4.191406 0.105469 0.742188 +v -4.808594 0.105469 0.742188 +v -4.747070 0.117676 0.764160 +v -4.301270 0.165527 0.763184 +v -4.277344 0.148438 0.753906 +v -4.722656 0.148438 0.753906 +v -4.698730 0.165527 0.763184 +v -4.308594 0.296387 0.769043 +v -4.285156 0.328125 0.757812 +v -4.714844 0.328125 0.757812 +v -4.691406 0.296387 0.769043 +v -4.314453 0.224609 0.765625 +v -4.304688 0.261719 0.753906 +v -4.695312 0.261719 0.753906 +v -4.685547 0.224609 0.765625 +v -4.300781 0.199219 0.750000 +v -4.699219 0.199219 0.750000 +v -4.500000 0.432617 0.673828 +v -4.413574 0.496094 0.679688 +v -4.452799 0.448405 0.620117 +v -4.547201 0.448405 0.620117 +v -4.586426 0.496094 0.679688 +v -4.316406 0.668457 0.683594 +v -4.320801 0.575195 0.625977 +v -4.679199 0.575195 0.625977 +v -4.683594 0.668457 0.683594 +v -4.170898 0.700684 0.661621 +v -4.233887 0.662598 0.620117 +v -4.766113 0.662598 0.620117 +v -4.829102 0.700684 0.661621 +v -4.005859 0.582520 0.618652 +v -4.122559 0.621094 0.596191 +v -4.877441 0.621094 0.596191 +v -4.994141 0.582520 0.618652 +v -3.813965 0.476074 0.562500 +v -3.919922 0.506836 0.519043 +v -5.080078 0.506836 0.519043 +v -5.186035 0.476074 0.562500 +v -3.691895 0.391602 0.516602 +v -3.763184 0.433105 0.472168 +v -5.236816 0.433105 0.472168 +v -5.308105 0.391602 0.516602 +v -3.718750 0.166992 0.433105 +v -3.707031 0.290039 0.402832 +v -5.292969 0.290039 0.402832 +v -5.281250 0.166992 0.433105 +v -3.882324 -0.009766 0.471191 +v -3.793945 0.080078 0.365234 +v -5.206055 0.080078 0.365234 +v -5.117676 -0.009766 0.471191 +v -4.069336 -0.112793 0.500977 +v -3.972168 -0.060059 0.411621 +v -5.027832 -0.060059 0.411621 +v -4.930664 -0.112793 0.500977 +v -4.433105 -0.569824 0.333008 +v -4.500000 -0.514648 0.302734 +v -4.411621 -0.459473 0.266602 +v -4.355469 -0.476562 0.318848 +v -4.644531 -0.476562 0.318848 +v -4.588379 -0.459473 0.266602 +v -4.566895 -0.569824 0.333008 +v -4.429199 -0.775391 0.365234 +v -4.500000 -0.677734 0.339844 +v -4.366699 -0.647949 0.362305 +v -4.633301 -0.647949 0.362305 +v -4.570801 -0.775391 0.365234 +v -4.418457 -0.940430 0.452148 +v -4.500000 -0.880859 0.402344 +v -4.347168 -0.851562 0.400879 +v -4.652832 -0.851562 0.400879 +v -4.581543 -0.940430 0.452148 +v -4.330078 -0.956543 0.494629 +v -4.500000 -0.974609 0.513672 +v -4.669922 -0.956543 0.494629 +v -4.191406 -0.916992 0.464844 +v -4.256836 -0.908691 0.427734 +v -4.743164 -0.908691 0.427734 +v -4.808594 -0.916992 0.464844 +v -4.175293 -0.791504 0.460449 +v -4.206055 -0.830566 0.409180 +v -4.793945 -0.830566 0.409180 +v -4.824707 -0.791504 0.460449 +v -4.199219 -0.597656 0.478516 +v -4.236328 -0.634277 0.404297 +v -4.763672 -0.634277 0.404297 +v -4.800781 -0.597656 0.478516 +v -4.284668 -0.731934 0.380371 +v -4.306641 -0.529297 0.369629 +v -4.693359 -0.529297 0.369629 +v -4.715332 -0.731934 0.380371 +v -4.294434 -0.394043 0.333008 +v -4.257812 -0.449707 0.408691 +v -4.742188 -0.449707 0.408691 +v -4.705566 -0.394043 0.333008 +v -4.227539 -0.407715 0.487793 +v -4.772461 -0.407715 0.487793 +v -4.259277 -0.301758 0.494141 +v -4.255371 -0.242188 0.444824 +v -4.277832 -0.238281 0.511719 +v -4.722168 -0.238281 0.511719 +v -4.744629 -0.242188 0.444824 +v -4.740723 -0.301758 0.494141 +v -4.270020 -0.334473 0.410156 +v -4.729980 -0.334473 0.410156 +v -4.265137 -0.179199 0.524902 +v -4.272298 -0.192871 0.492350 +v -4.727702 -0.192871 0.492350 +v -4.734863 -0.179199 0.524902 +v -4.188802 -0.144531 0.490885 +v -4.811198 -0.144531 0.490885 +v -4.500000 -0.058594 -0.712891 +v -4.323730 0.087891 -0.732422 +v -4.190592 -0.042969 -0.615560 +v -4.331543 -0.164551 -0.585938 +v -4.668457 -0.164551 -0.585938 +v -4.809408 -0.042969 -0.615560 +v -4.676270 0.087891 -0.732422 +v -4.500000 -0.274414 -0.484375 +v -4.202637 -0.219727 -0.413086 +v -4.354004 -0.335449 -0.285156 +v -4.645996 -0.335449 -0.285156 +v -4.797363 -0.219727 -0.413086 +v -4.500000 -0.404297 -0.074219 +v -4.257324 -0.339355 -0.052246 +v -4.391113 -0.418945 0.126953 +v -4.608887 -0.418945 0.126953 +v -4.742676 -0.339355 -0.052246 +v -4.500000 -0.455078 0.228516 +v -4.325195 -0.400391 0.239746 +v -4.674805 -0.400391 0.239746 +v -4.270182 -0.328125 0.288900 +v -4.729818 -0.328125 0.288900 +v -3.711914 0.197266 0.241211 +v -3.844727 -0.009277 0.247070 +v -3.720215 0.100586 0.088867 +v -5.279785 0.100586 0.088867 +v -5.155273 -0.009277 0.247070 +v -5.288086 0.197266 0.241211 +v -4.500000 0.298828 -0.800781 +v -4.277832 0.493164 -0.734375 +v -4.132324 0.246094 -0.688477 +v -4.867676 0.246094 -0.688477 +v -4.722168 0.493164 -0.734375 +v -4.500000 0.928711 0.099609 +v -4.272949 0.844238 0.249512 +v -4.080078 0.876465 0.065918 +v -4.273438 0.937500 -0.081055 +v -4.726562 0.937500 -0.081055 +v -4.919922 0.876465 0.065918 +v -4.727051 0.844238 0.249512 +v -4.500000 0.930664 -0.291016 +v -4.080078 0.880859 -0.249023 +v -4.272949 0.844238 -0.455078 +v -4.727051 0.844238 -0.455078 +v -4.919922 0.880859 -0.249023 +v -4.500000 0.710938 -0.660156 +v -4.078613 0.643555 -0.559082 +v -4.921387 0.643555 -0.559082 +v -3.853516 0.458008 0.401367 +v -3.745117 0.386230 0.374023 +v -3.808105 0.455078 0.302246 +v -5.191895 0.455078 0.302246 +v -5.254883 0.386230 0.374023 +v -5.146484 0.458008 0.401367 +v -3.870117 0.580078 0.196289 +v -3.742188 0.470215 0.194336 +v -3.786133 0.613770 0.086426 +v -5.213867 0.613770 0.086426 +v -5.257812 0.470215 0.194336 +v -5.129883 0.580078 0.196289 +v -3.863281 0.729980 -0.041992 +v -3.717285 0.573730 -0.021484 +v -3.781250 0.667969 -0.156250 +v -5.218750 0.667969 -0.156250 +v -5.282715 0.573730 -0.021484 +v -5.136719 0.729980 -0.041992 +v -3.863281 0.720703 -0.298340 +v -3.722656 0.560059 -0.258789 +v -3.784180 0.579590 -0.385254 +v -5.215820 0.579590 -0.385254 +v -5.277344 0.560059 -0.258789 +v -5.136719 0.720703 -0.298340 +v -3.731445 0.423828 -0.383301 +v -3.818359 0.299805 -0.495117 +v -3.873047 0.509766 -0.504395 +v -5.126953 0.509766 -0.504395 +v -5.181641 0.299805 -0.495117 +v -5.268555 0.423828 -0.383301 +v -3.976074 0.388672 -0.610840 +v -3.954102 0.732910 -0.407715 +v -5.045898 0.732910 -0.407715 +v -5.023926 0.388672 -0.610840 +v -3.953125 0.823730 -0.133301 +v -5.046875 0.823730 -0.133301 +v -3.953125 0.749023 0.136230 +v -5.046875 0.749023 0.136230 +v -4.077637 0.679688 0.323730 +v -3.948730 0.526367 0.350098 +v -5.051270 0.526367 0.350098 +v -4.922363 0.679688 0.323730 +v -4.056641 0.525391 0.491211 +v -4.943359 0.525391 0.491211 +v -4.500000 0.722656 0.405273 +v -4.261719 0.583008 0.480469 +v -4.738281 0.583008 0.480469 +v -4.215332 0.533691 0.574707 +v -4.784668 0.533691 0.574707 +v -4.397624 0.509440 0.578613 +v -4.602376 0.509440 0.578613 +v -4.500000 0.483724 0.589844 +v -3.706543 0.331055 0.203613 +v -5.293457 0.331055 0.203613 +v -3.671875 0.265625 0.031738 +v -3.679199 0.430176 0.033691 +v -5.320801 0.430176 0.033691 +v -5.328125 0.265625 0.031738 +v -3.667969 0.347656 -0.119629 +v -3.691895 0.459961 -0.165039 +v -5.308105 0.459961 -0.165039 +v -5.332031 0.347656 -0.119629 +v -3.693359 0.344238 -0.308594 +v -5.306641 0.344238 -0.308594 +v -4.192057 -0.277832 0.129720 +v -4.137207 -0.233398 -0.227051 +v -4.071777 -0.192383 -0.035645 +v -4.928223 -0.192383 -0.035645 +v -4.862793 -0.233398 -0.227051 +v -4.807943 -0.277832 0.129720 +v -3.859375 -0.088867 -0.054199 +v -3.943359 -0.107910 0.113770 +v -3.974609 -0.132812 -0.187988 +v -5.025391 -0.132812 -0.187988 +v -5.056641 -0.107910 0.113770 +v -5.140625 -0.088867 -0.054199 +v -4.073242 -0.134277 0.317871 +v -4.926758 -0.134277 0.317871 +v -4.187337 -0.169434 0.448893 +v -4.194499 -0.231934 0.301107 +v -4.805501 -0.231934 0.301107 +v -4.812663 -0.169434 0.448893 +v -3.797852 0.134766 -0.440430 +v -3.927246 0.022949 -0.453613 +v -3.948730 0.178711 -0.564453 +v -5.051270 0.178711 -0.564453 +v -5.072754 0.022949 -0.453613 +v -5.202148 0.134766 -0.440430 +v -4.079264 0.066406 -0.604818 +v -4.920736 0.066406 -0.604818 +v -3.882324 -0.077148 -0.298340 +v -4.040039 -0.101562 -0.371582 +v -4.959961 -0.101562 -0.371582 +v -5.117676 -0.077148 -0.298340 +v -4.098795 -0.076660 -0.514974 +v -4.901205 -0.076660 -0.514974 +v -3.470703 0.440918 -0.304688 +v -3.543457 0.430664 -0.291016 +v -3.588867 0.381348 -0.233398 +v -3.530762 0.385742 -0.265137 +v -5.469238 0.385742 -0.265137 +v -5.411133 0.381348 -0.233398 +v -5.456543 0.430664 -0.291016 +v -5.529297 0.440918 -0.304688 +v -3.373535 0.479004 -0.382324 +v -3.395508 0.424805 -0.350586 +v -3.300781 0.448242 -0.394043 +v -5.699219 0.448242 -0.394043 +v -5.604492 0.424805 -0.350586 +v -5.626465 0.479004 -0.382324 +v -3.213379 0.403809 -0.431641 +v -3.268066 0.362305 -0.406738 +v -3.211426 0.295898 -0.413574 +v -5.788574 0.295898 -0.413574 +v -5.731934 0.362305 -0.406738 +v -5.786621 0.403809 -0.431641 +v -3.190430 0.185547 -0.434570 +v -3.255371 0.182617 -0.413574 +v -3.272461 0.079102 -0.404785 +v -5.727539 0.079102 -0.404785 +v -5.744629 0.182617 -0.413574 +v -5.809570 0.185547 -0.434570 +v -3.342773 -0.017090 -0.392578 +v -3.375000 0.017578 -0.364746 +v -3.467773 -0.057617 -0.305664 +v -5.532227 -0.057617 -0.305664 +v -5.625000 0.017578 -0.364746 +v -5.657227 -0.017090 -0.392578 +v -3.589844 -0.110840 -0.248535 +v -3.569336 -0.057617 -0.228516 +v -3.687988 -0.097168 -0.157227 +v -5.312012 -0.097168 -0.157227 +v -5.430664 -0.057617 -0.228516 +v -5.410156 -0.110840 -0.248535 +v -3.466797 -0.009766 -0.326660 +v -3.542480 -0.016602 -0.287109 +v -3.633301 -0.040039 -0.198730 +v -5.366699 -0.040039 -0.198730 +v -5.457520 -0.016602 -0.287109 +v -5.533203 -0.009766 -0.326660 +v -3.314941 0.095703 -0.414551 +v -3.383789 0.042969 -0.405762 +v -5.616211 0.042969 -0.405762 +v -5.685059 0.095703 -0.414551 +v -3.265137 0.262695 -0.424316 +v -3.282715 0.172363 -0.445801 +v -5.717285 0.172363 -0.445801 +v -5.734863 0.262695 -0.424316 +v -3.331543 0.379883 -0.404297 +v -3.291504 0.310547 -0.441895 +v -5.708496 0.310547 -0.441895 +v -5.668457 0.379883 -0.404297 +v -3.471191 0.375488 -0.326660 +v -3.399902 0.358887 -0.397461 +v -5.600098 0.358887 -0.397461 +v -5.528809 0.375488 -0.326660 +v -3.563965 0.329590 -0.260742 +v -3.516113 0.330078 -0.322266 +v -5.483887 0.330078 -0.322266 +v -5.436035 0.329590 -0.260742 +v -3.763184 0.007812 -0.020508 +v -3.816406 -0.071777 -0.142090 +v -3.784993 -0.016764 -0.117350 +v -5.215006 -0.016764 -0.117350 +v -5.183594 -0.071777 -0.142090 +v -5.236816 0.007812 -0.020508 +v -3.801270 -0.113770 -0.174805 +v -3.728516 -0.054199 -0.162598 +v -5.271484 -0.054199 -0.162598 +v -5.198730 -0.113770 -0.174805 +v -3.711426 0.146973 -0.061035 +v -5.288574 0.146973 -0.061035 +v -3.645996 0.356445 -0.242188 +v -3.659180 0.312012 -0.199707 +v -3.616211 0.323242 -0.223145 +v -5.383789 0.323242 -0.223145 +v -5.340820 0.312012 -0.199707 +v -5.354004 0.356445 -0.242188 +v -3.661621 -0.022461 -0.237305 +v -3.721191 -0.017090 -0.217285 +v -5.278809 -0.017090 -0.217285 +v -5.338379 -0.022461 -0.237305 +v -3.685059 0.000977 -0.267578 +v -3.719727 0.029297 -0.234863 +v -3.766927 0.006185 -0.182292 +v -5.233073 0.006185 -0.182292 +v -5.280273 0.029297 -0.234863 +v -5.314941 0.000977 -0.267578 +v -3.710938 0.081543 -0.273926 +v -3.740234 0.079590 -0.237305 +v -3.678711 0.052246 -0.273926 +v -5.321289 0.052246 -0.273926 +v -5.259766 0.079590 -0.237305 +v -5.289062 0.081543 -0.273926 +v -3.707031 0.131348 -0.270020 +v -3.687012 0.182129 -0.240234 +v -3.732910 0.127441 -0.190918 +v -5.267090 0.127441 -0.190918 +v -5.312988 0.182129 -0.240234 +v -5.292969 0.131348 -0.270020 +v -3.630859 0.264160 -0.240723 +v -3.671875 0.250977 -0.207520 +v -3.641602 0.211426 -0.268555 +v -5.358398 0.211426 -0.268555 +v -5.328125 0.250977 -0.207520 +v -5.369141 0.264160 -0.240723 +v -3.585938 0.278320 -0.276367 +v -5.414062 0.278320 -0.276367 +v -3.684570 0.237305 -0.138672 +v -5.315430 0.237305 -0.138672 +v -3.764486 0.046224 -0.132487 +v -5.235514 0.046224 -0.132487 +v -3.547852 0.294434 -0.322266 +v -3.608398 0.237305 -0.296387 +v -3.570312 0.255859 -0.329102 +v -5.429688 0.255859 -0.329102 +v -5.391602 0.237305 -0.296387 +v -5.452148 0.294434 -0.322266 +v -3.663574 0.170410 -0.296387 +v -3.625977 0.195801 -0.316406 +v -5.374023 0.195801 -0.316406 +v -5.336426 0.170410 -0.296387 +v -3.720703 0.102051 -0.296875 +v -3.689453 0.127930 -0.314941 +v -5.310547 0.127930 -0.314941 +v -5.279297 0.102051 -0.296875 +v -3.680664 0.075195 -0.296875 +v -3.695312 0.093262 -0.314941 +v -5.304688 0.093262 -0.314941 +v -5.319336 0.075195 -0.296875 +v -3.659668 0.020020 -0.296875 +v -3.651855 0.052246 -0.315918 +v -5.348145 0.052246 -0.315918 +v -5.340332 0.020020 -0.296875 +v -3.674316 -0.012207 -0.289551 +v -3.658691 0.002930 -0.312012 +v -5.341309 0.002930 -0.312012 +v -5.325684 -0.012207 -0.289551 +v -3.605957 -0.016602 -0.265137 +v -3.646484 -0.009277 -0.291016 +v -5.353516 -0.009277 -0.291016 +v -5.394043 -0.016602 -0.265137 +v -3.460449 0.333008 -0.387207 +v -3.498535 0.303711 -0.372559 +v -5.501465 0.303711 -0.372559 +v -5.539551 0.333008 -0.387207 +v -3.330566 0.336426 -0.452637 +v -3.390951 0.332682 -0.437988 +v -5.609049 0.332682 -0.437988 +v -5.669434 0.336426 -0.452637 +v -3.268066 0.239746 -0.467285 +v -3.295410 0.288086 -0.470215 +v -5.704590 0.288086 -0.470215 +v -5.731934 0.239746 -0.467285 +v -3.314453 0.098145 -0.456543 +v -3.287598 0.169434 -0.470215 +v -5.712402 0.169434 -0.470215 +v -5.685547 0.098145 -0.456543 +v -3.457520 0.008789 -0.383789 +v -3.385742 0.057617 -0.437500 +v -5.614258 0.057617 -0.437500 +v -5.542480 0.008789 -0.383789 +v -3.535156 0.004395 -0.337891 +v -5.464844 0.004395 -0.337891 +v -3.643066 0.091797 -0.324219 +v -3.615723 0.039062 -0.323242 +v -3.586914 0.088867 -0.333984 +v -5.413086 0.088867 -0.333984 +v -5.384277 0.039062 -0.323242 +v -5.356934 0.091797 -0.324219 +v -3.576172 0.142578 -0.338867 +v -3.537109 0.086914 -0.349121 +v -3.520996 0.148438 -0.358398 +v -5.479004 0.148438 -0.358398 +v -5.462891 0.086914 -0.349121 +v -5.423828 0.142578 -0.338867 +v -3.515137 0.204590 -0.360840 +v -3.464844 0.147949 -0.383301 +v -3.463867 0.207031 -0.377930 +v -5.536133 0.207031 -0.377930 +v -5.535156 0.147949 -0.383301 +v -5.484863 0.204590 -0.360840 +v -3.452148 0.253906 -0.382812 +v -3.402832 0.201660 -0.398926 +v -3.394531 0.244629 -0.401367 +v -5.605469 0.244629 -0.401367 +v -5.597168 0.201660 -0.398926 +v -5.547852 0.253906 -0.382812 +v -3.436849 0.299479 -0.403809 +v -3.513184 0.259277 -0.361816 +v -5.486816 0.259277 -0.361816 +v -5.563151 0.299479 -0.403809 +v -3.574219 0.202637 -0.337402 +v -5.425781 0.202637 -0.337402 +v -3.634277 0.141602 -0.325195 +v -5.365723 0.141602 -0.325195 +v -3.585449 0.025391 -0.314941 +v -5.414551 0.025391 -0.314941 +v -3.477051 0.066895 -0.387695 +v -5.522949 0.066895 -0.387695 +v -3.374512 0.138672 -0.429688 +v -5.625488 0.138672 -0.429688 +v -3.328613 0.225586 -0.439941 +v -5.671387 0.225586 -0.439941 +v -3.365560 0.299967 -0.436035 +v -5.634440 0.299967 -0.436035 +v -3.460938 -0.080078 -0.395996 +v -3.707031 -0.119629 -0.258301 +v -3.583496 -0.042969 -0.390137 +v -5.416504 -0.042969 -0.390137 +v -5.292969 -0.119629 -0.258301 +v -5.539062 -0.080078 -0.395996 +v -3.227539 0.067871 -0.469238 +v -3.331055 0.041992 -0.495605 +v -5.668945 0.041992 -0.495605 +v -5.772461 0.067871 -0.469238 +v -3.163086 0.299316 -0.466309 +v -3.170573 0.201660 -0.506999 +v -5.829427 0.201660 -0.506999 +v -5.836914 0.299316 -0.466309 +v -3.270508 0.461914 -0.470703 +v -3.193034 0.359375 -0.511393 +v -5.806966 0.359375 -0.511393 +v -5.729492 0.461914 -0.470703 +v -3.467773 0.453125 -0.397949 +v -3.359375 0.399414 -0.496582 +v -5.640625 0.399414 -0.496582 +v -5.532227 0.453125 -0.397949 +v -3.616211 0.390137 -0.321289 +v -3.560059 0.349609 -0.410645 +v -5.439941 0.349609 -0.410645 +v -5.383789 0.390137 -0.321289 +v -3.463379 0.180664 -0.478027 +v -3.664551 0.134766 -0.381836 +v -5.335449 0.134766 -0.381836 +v -5.536621 0.180664 -0.478027 +v -3.242838 0.253906 -0.529460 +v -5.757162 0.253906 -0.529460 +v -3.691406 0.280762 -0.382324 +v -5.308594 0.280762 -0.382324 +v -3.776367 -0.025879 -0.353516 +v -5.223633 -0.025879 -0.353516 +v -4.007812 0.185547 0.720703 +v -4.992188 0.185547 0.720703 +v -3.941406 0.158203 0.625000 +v -5.058594 0.158203 0.625000 +v -4.062500 0.039062 0.650391 +v -4.937500 0.039062 0.650391 +v -4.089844 0.105469 0.738281 +v -4.910156 0.105469 0.738281 +v -4.205078 0.105469 0.759766 +v -4.794922 0.105469 0.759766 +v -4.234375 0.039062 0.681641 +v -4.765625 0.039062 0.681641 +v -4.355469 0.158203 0.697266 +v -4.644531 0.158203 0.697266 +v -4.285156 0.185547 0.769531 +v -4.714844 0.185547 0.769531 +v -4.285156 0.300781 0.769531 +v -4.714844 0.300781 0.769531 +v -4.355469 0.328125 0.697266 +v -4.644531 0.328125 0.697266 +v -4.234375 0.449219 0.681641 +v -4.765625 0.449219 0.681641 +v -4.205078 0.382812 0.759766 +v -4.794922 0.382812 0.759766 +v -4.089844 0.382812 0.738281 +v -4.910156 0.382812 0.738281 +v -4.062500 0.449219 0.650391 +v -4.937500 0.449219 0.650391 +v -3.941406 0.328125 0.625000 +v -5.058594 0.328125 0.625000 +v -4.007812 0.300781 0.720703 +v -4.992188 0.300781 0.720703 +v -4.042969 0.287109 0.769531 +v -4.957031 0.287109 0.769531 +v -4.103516 0.349609 0.783203 +v -4.896484 0.349609 0.783203 +v -4.189453 0.349609 0.800781 +v -4.810547 0.349609 0.800781 +v -4.248047 0.287109 0.808594 +v -4.751953 0.287109 0.808594 +v -4.248047 0.201172 0.808594 +v -4.751953 0.201172 0.808594 +v -4.189453 0.142578 0.800781 +v -4.810547 0.142578 0.800781 +v -4.103516 0.142578 0.783203 +v -4.896484 0.142578 0.783203 +v -4.042969 0.201172 0.769531 +v -4.957031 0.201172 0.769531 +v -4.075521 0.213542 0.794271 +v -4.924479 0.213542 0.794271 +v -4.117188 0.171875 0.804688 +v -4.882812 0.171875 0.804688 +v -4.177083 0.171875 0.817708 +v -4.822917 0.171875 0.817708 +v -4.218750 0.213542 0.822917 +v -4.781250 0.213542 0.822917 +v -4.218750 0.273438 0.822917 +v -4.781250 0.273438 0.822917 +v -4.177083 0.317708 0.817708 +v -4.822917 0.317708 0.817708 +v -4.117188 0.317708 0.804688 +v -4.882812 0.317708 0.804688 +v -4.075521 0.273438 0.794271 +v -4.924479 0.273438 0.794271 +v -4.414062 -0.957031 0.601562 +v -4.585938 -0.957031 0.601562 +v -4.273438 -0.939453 0.585938 +v -4.726562 -0.939453 0.585938 +v -4.201172 -0.892578 0.587891 +v -4.798828 -0.892578 0.587891 +v -4.191406 -0.777344 0.613281 +v -4.808594 -0.777344 0.613281 +v -4.218750 -0.570312 0.634766 +v -4.781250 -0.570312 0.634766 +v -4.208984 -0.119141 0.644531 +v -4.791016 -0.119141 0.644531 +v -3.978516 -0.042969 0.591797 +v -5.021484 -0.042969 0.591797 +v -3.798828 0.091797 0.552734 +v -5.201172 0.091797 0.552734 +v -3.710938 0.289062 0.574219 +v -5.289062 0.289062 0.574219 +v -3.750000 0.425781 0.650391 +v -5.250000 0.425781 0.650391 +v -3.917969 0.511719 0.708984 +v -5.082031 0.511719 0.708984 +v -4.109375 0.636719 0.763672 +v -4.890625 0.636719 0.763672 +v -4.251953 0.683594 0.794922 +v -4.748047 0.683594 0.794922 +v -4.369141 0.564453 0.800781 +v -4.630859 0.564453 0.800781 +v -4.458984 0.425781 0.789062 +v -4.541016 0.425781 0.789062 +v -4.320312 0.482422 0.806641 +v -4.679688 0.482422 0.806641 +v -4.226562 0.550781 0.796875 +v -4.773438 0.550781 0.796875 +v -4.123047 0.525391 0.773438 +v -4.876953 0.525391 0.773438 +v -3.960938 0.443359 0.726562 +v -5.039062 0.443359 0.726562 +v -3.832031 0.365234 0.673828 +v -5.167969 0.365234 0.673828 +v -3.816406 0.265625 0.638672 +v -5.183594 0.265625 0.638672 +v -3.884766 0.126953 0.636719 +v -5.115234 0.126953 0.636719 +v -4.029297 0.021484 0.667969 +v -4.970703 0.021484 0.667969 +v -4.224609 -0.009766 0.732422 +v -4.775391 -0.009766 0.732422 +v -4.376953 0.044922 0.757812 +v -4.623047 0.044922 0.757812 +v -4.402344 0.375000 0.800781 +v -4.597656 0.375000 0.800781 +v -4.435547 0.269531 0.777344 +v -4.564453 0.269531 0.777344 +v -4.425781 0.152344 0.750000 +v -4.574219 0.152344 0.750000 +v -4.443359 -0.912109 0.664062 +v -4.556641 -0.912109 0.664062 +v -4.355469 -0.890625 0.667969 +v -4.644531 -0.890625 0.667969 +v -4.318359 -0.822266 0.685547 +v -4.681641 -0.822266 0.685547 +v -4.335938 -0.570312 0.720703 +v -4.664062 -0.570312 0.720703 +v -4.314453 -0.732422 0.705078 +v -4.685547 -0.732422 0.705078 +v -4.458984 -0.376953 0.746094 +v -4.541016 -0.376953 0.746094 +v -4.451172 -0.564453 0.742188 +v -4.548828 -0.564453 0.742188 +v -4.443359 -0.712891 0.734375 +v -4.556641 -0.712891 0.734375 +v -4.390625 -0.253906 0.767578 +v -4.609375 -0.253906 0.767578 +v -4.382812 -0.183594 0.767578 +v -4.617188 -0.183594 0.767578 +v -4.437500 -0.136719 0.761719 +v -4.562500 -0.136719 0.761719 +v -4.490234 -0.162109 0.767578 +v -4.509766 -0.162109 0.767578 +v -4.455078 -0.302734 0.761719 +v -4.544922 -0.302734 0.761719 +v -4.457031 -0.283203 0.792969 +v -4.542969 -0.283203 0.792969 +v -4.478516 -0.166016 0.804688 +v -4.521484 -0.166016 0.804688 +v -4.427734 -0.140625 0.796875 +v -4.572266 -0.140625 0.796875 +v -4.388672 -0.185547 0.804688 +v -4.611328 -0.185547 0.804688 +v -4.396484 -0.244141 0.802734 +v -4.603516 -0.244141 0.802734 +v -4.437500 -0.183594 0.820312 +v -4.562500 -0.183594 0.820312 +v -4.453125 -0.242188 0.816406 +v -4.546875 -0.242188 0.816406 +v -4.443359 -0.085938 0.755859 +v -4.556641 -0.085938 0.755859 +v -4.371094 -0.179688 0.753906 +v -4.628906 -0.179688 0.753906 +v -4.361328 -0.267578 0.728516 +v -4.638672 -0.267578 0.728516 +v -4.361328 -0.373047 0.728516 +v -4.638672 -0.373047 0.728516 +v -4.259766 -0.376953 0.636719 +v -4.740234 -0.376953 0.636719 +v -4.291016 -0.279297 0.632812 +v -4.708984 -0.279297 0.632812 +v -4.318359 -0.195312 0.660156 +v -4.681641 -0.195312 0.660156 +v -4.449219 -0.750000 0.728516 +v -4.550781 -0.750000 0.728516 +v -4.396484 -0.779297 0.720703 +v -4.603516 -0.779297 0.720703 +v -4.419922 -0.851562 0.701172 +v -4.580078 -0.851562 0.701172 +v -4.472656 -0.878906 0.689453 +v -4.527344 -0.878906 0.689453 +v -4.476562 -0.863281 0.660156 +v -4.523438 -0.863281 0.660156 +v -4.429688 -0.837891 0.667969 +v -4.570312 -0.837891 0.667969 +v -4.406250 -0.781250 0.685547 +v -4.593750 -0.781250 0.685547 +v -4.453125 -0.761719 0.691406 +v -4.546875 -0.761719 0.691406 +v -4.464844 -0.810547 0.646484 +v -4.535156 -0.810547 0.646484 +v -4.421875 -0.804688 0.645833 +v -4.578125 -0.804688 0.645833 +v -4.335938 0.181641 0.765625 +v -4.664062 0.181641 0.765625 +v -4.347656 0.257812 0.771484 +v -4.652344 0.257812 0.771484 +v -4.330078 0.347656 0.775391 +v -4.669922 0.347656 0.775391 +v -4.304688 0.125000 0.761719 +v -4.695312 0.125000 0.761719 +v -4.205078 0.070312 0.742188 +v -4.794922 0.070312 0.742188 +v -4.070312 0.060547 0.708984 +v -4.929688 0.060547 0.708984 +v -3.957031 0.136719 0.679688 +v -5.042969 0.136719 0.679688 +v -3.892578 0.242188 0.666016 +v -5.107422 0.242188 0.666016 +v -3.902344 0.328125 0.673828 +v -5.097656 0.328125 0.673828 +v -3.996094 0.390625 0.712891 +v -5.003906 0.390625 0.712891 +v -4.121094 0.435547 0.748047 +v -4.878906 0.435547 0.748047 +v -4.203125 0.449219 0.757812 +v -4.796875 0.449219 0.757812 +v -4.275391 0.419922 0.771484 +v -4.724609 0.419922 0.771484 +v -4.250000 0.388672 0.769531 +v -4.750000 0.388672 0.769531 +v -4.193359 0.414062 0.761719 +v -4.806641 0.414062 0.761719 +v -4.123047 0.406250 0.757812 +v -4.876953 0.406250 0.757812 +v -4.017578 0.369141 0.724609 +v -4.982422 0.369141 0.724609 +v -3.941406 0.314453 0.683594 +v -5.058594 0.314453 0.683594 +v -3.933594 0.244141 0.677734 +v -5.066406 0.244141 0.677734 +v -3.984375 0.156250 0.693359 +v -5.015625 0.156250 0.693359 +v -4.078125 0.091797 0.722656 +v -4.921875 0.091797 0.722656 +v -4.195312 0.095703 0.751953 +v -4.804688 0.095703 0.751953 +v -4.285156 0.140625 0.765625 +v -4.714844 0.140625 0.765625 +v -4.294922 0.332031 0.769531 +v -4.705078 0.332031 0.769531 +v -4.314453 0.259766 0.767578 +v -4.685547 0.259766 0.767578 +v -4.310547 0.193359 0.763672 +v -4.689453 0.193359 0.763672 +v -4.457031 0.447266 0.675781 +v -4.542969 0.447266 0.675781 +v -4.369141 0.583984 0.683594 +v -4.630859 0.583984 0.683594 +v -4.248047 0.707031 0.675781 +v -4.751953 0.707031 0.675781 +v -4.091797 0.650391 0.642578 +v -4.908203 0.650391 0.642578 +v -3.908203 0.523438 0.589844 +v -5.091797 0.523438 0.589844 +v -3.738281 0.443359 0.542969 +v -5.261719 0.443359 0.542969 +v -3.685547 0.287109 0.468750 +v -5.314453 0.287109 0.468750 +v -3.791016 0.068359 0.443359 +v -5.208984 0.068359 0.443359 +v -3.972656 -0.068359 0.488281 +v -5.027344 -0.068359 0.488281 +v -4.423828 -0.501953 0.304688 +v -4.576172 -0.501953 0.304688 +v -4.433594 -0.667969 0.347656 +v -4.566406 -0.667969 0.347656 +v -4.423828 -0.871094 0.402344 +v -4.576172 -0.871094 0.402344 +v -4.414062 -0.968750 0.507812 +v -4.585938 -0.968750 0.507812 +v -4.250000 -0.943359 0.478516 +v -4.750000 -0.943359 0.478516 +v -4.171875 -0.865234 0.458984 +v -4.828125 -0.865234 0.458984 +v -4.185547 -0.699219 0.468750 +v -4.814453 -0.699219 0.468750 +v -4.298828 -0.626953 0.375000 +v -4.701172 -0.626953 0.375000 +v -4.269531 -0.832031 0.396484 +v -4.730469 -0.832031 0.396484 +v -4.302734 -0.451172 0.353516 +v -4.697266 -0.451172 0.353516 +v -4.212891 -0.496094 0.484375 +v -4.787109 -0.496094 0.484375 +v -4.269531 -0.267578 0.501953 +v -4.730469 -0.267578 0.501953 +v -4.244141 -0.345703 0.490234 +v -4.755859 -0.345703 0.490234 +v -4.287109 -0.208984 0.521484 +v -4.712891 -0.208984 0.521484 +v -4.179688 -0.148438 0.515625 +v -4.820312 -0.148438 0.515625 +v -4.330078 -0.054688 -0.675781 +v -4.669922 -0.054688 -0.675781 +v -4.339844 -0.259766 -0.457031 +v -4.660156 -0.259766 -0.457031 +v -4.373047 -0.386719 -0.066406 +v -4.626953 -0.386719 -0.066406 +v -4.402344 -0.437500 0.222656 +v -4.597656 -0.437500 0.222656 +v -4.289062 -0.359375 0.314453 +v -4.710938 -0.359375 0.314453 +v -3.759766 0.087891 0.228516 +v -5.240234 0.087891 0.228516 +v -4.300781 0.281250 -0.761719 +v -4.699219 0.281250 -0.761719 +v -4.273438 0.916016 0.093750 +v -4.726562 0.916016 0.093750 +v -4.273438 0.919922 -0.269531 +v -4.726562 0.919922 -0.269531 +v -4.271484 0.691406 -0.621094 +v -4.728516 0.691406 -0.621094 +v -3.791016 0.429688 0.392578 +v -5.208984 0.429688 0.392578 +v -3.800781 0.531250 0.199219 +v -5.199219 0.531250 0.199219 +v -3.781250 0.658203 -0.033203 +v -5.218750 0.658203 -0.033203 +v -3.781250 0.646484 -0.279297 +v -5.218750 0.646484 -0.279297 +v -3.792969 0.453125 -0.457031 +v -5.207031 0.453125 -0.457031 +v -3.957031 0.578125 -0.529297 +v -5.042969 0.578125 -0.529297 +v -3.953125 0.806641 -0.273438 +v -5.046875 0.806641 -0.273438 +v -3.953125 0.808594 0.005859 +v -5.046875 0.808594 0.005859 +v -3.953125 0.632812 0.250000 +v -5.046875 0.632812 0.250000 +v -3.935547 0.496094 0.439453 +v -5.064453 0.496094 0.439453 +v -4.271484 0.710938 0.380859 +v -4.728516 0.710938 0.380859 +v -4.218750 0.591797 0.593750 +v -4.781250 0.591797 0.593750 +v -4.236328 0.527344 0.541016 +v -4.763672 0.527344 0.541016 +v -4.463542 0.479167 0.593750 +v -4.536458 0.479167 0.593750 +v -3.712891 0.302734 0.306641 +v -5.287109 0.302734 0.306641 +v -3.691406 0.380859 0.117188 +v -5.308594 0.380859 0.117188 +v -3.681641 0.457031 -0.060547 +v -5.318359 0.457031 -0.060547 +v -3.703125 0.437500 -0.279297 +v -5.296875 0.437500 -0.279297 +v -4.164062 -0.267578 -0.041016 +v -4.835938 -0.267578 -0.041016 +v -3.958984 -0.134766 -0.039062 +v -5.041016 -0.134766 -0.039062 +v -3.955078 -0.078125 0.275391 +v -5.044922 -0.078125 0.275391 +v -4.181641 -0.193359 0.378906 +v -4.818359 -0.193359 0.378906 +v -4.221354 -0.281250 0.247396 +v -4.778646 -0.281250 0.247396 +v -4.216146 -0.164062 0.479167 +v -4.783854 -0.164062 0.479167 +v -3.871094 0.152344 -0.500000 +v -5.128906 0.152344 -0.500000 +v -4.025391 0.210938 -0.625000 +v -4.974609 0.210938 -0.625000 +v -3.962891 -0.076172 -0.337891 +v -5.037109 -0.076172 -0.337891 +v -4.111328 -0.158203 -0.390625 +v -4.888672 -0.158203 -0.390625 +v -4.111979 -0.023438 -0.583333 +v -4.888021 -0.023438 -0.583333 +v -3.537109 0.414062 -0.263672 +v -5.462891 0.414062 -0.263672 +v -3.384766 0.458984 -0.353516 +v -5.615234 0.458984 -0.353516 +v -3.240234 0.388672 -0.410156 +v -5.759766 0.388672 -0.410156 +v -3.222656 0.185547 -0.416016 +v -5.777344 0.185547 -0.416016 +v -3.359375 -0.001953 -0.367188 +v -5.640625 -0.001953 -0.367188 +v -3.582031 -0.087891 -0.222656 +v -5.417969 -0.087891 -0.222656 +v -3.554688 -0.033203 -0.253906 +v -5.445312 -0.033203 -0.253906 +v -3.382812 0.033203 -0.380859 +v -5.617188 0.033203 -0.380859 +v -3.275391 0.177734 -0.425781 +v -5.724609 0.177734 -0.425781 +v -3.285156 0.333984 -0.419922 +v -5.714844 0.333984 -0.419922 +v -3.400391 0.388672 -0.369141 +v -5.599609 0.388672 -0.369141 +v -3.523438 0.355469 -0.289062 +v -5.476562 0.355469 -0.289062 +v -3.806641 -0.048828 -0.083984 +v -5.193359 -0.048828 -0.083984 +v -3.771484 -0.089844 -0.148438 +v -5.228516 -0.089844 -0.148438 +v -3.707031 0.126953 0.001953 +v -5.292969 0.126953 0.001953 +v -3.630859 0.345703 -0.216797 +v -5.369141 0.345703 -0.216797 +v -3.689453 -0.033203 -0.197266 +v -5.310547 -0.033203 -0.197266 +v -3.726562 0.003906 -0.226562 +v -5.273438 0.003906 -0.226562 +v -3.714844 0.058594 -0.251953 +v -5.285156 0.058594 -0.251953 +v -3.722656 0.126953 -0.236328 +v -5.277344 0.126953 -0.236328 +v -3.658203 0.226562 -0.240234 +v -5.341797 0.226562 -0.240234 +v -3.599609 0.298828 -0.246094 +v -5.400391 0.298828 -0.246094 +v -3.669922 0.285156 -0.167969 +v -5.330078 0.285156 -0.167969 +v -3.724609 0.140625 -0.128906 +v -5.275391 0.140625 -0.128906 +v -3.778646 0.005208 -0.143229 +v -5.221354 0.005208 -0.143229 +v -3.580078 0.267578 -0.304688 +v -5.419922 0.267578 -0.304688 +v -3.634766 0.205078 -0.294922 +v -5.365234 0.205078 -0.294922 +v -3.699219 0.132812 -0.296875 +v -5.300781 0.132812 -0.296875 +v -3.707031 0.087891 -0.296875 +v -5.292969 0.087891 -0.296875 +v -3.664062 0.048828 -0.296875 +v -5.335938 0.048828 -0.296875 +v -3.669922 0.000000 -0.296875 +v -5.330078 0.000000 -0.296875 +v -3.652344 -0.017578 -0.267578 +v -5.347656 -0.017578 -0.267578 +v -3.509766 0.316406 -0.351562 +v -5.490234 0.316406 -0.351562 +v -3.394531 0.343750 -0.423828 +v -5.605469 0.343750 -0.423828 +v -3.287109 0.298828 -0.464844 +v -5.712891 0.298828 -0.464844 +v -3.277344 0.167969 -0.466797 +v -5.722656 0.167969 -0.466797 +v -3.378906 0.044922 -0.429688 +v -5.621094 0.044922 -0.429688 +v -3.537109 -0.009766 -0.316406 +v -5.462891 -0.009766 -0.316406 +v -3.623047 0.066406 -0.326172 +v -5.376953 0.066406 -0.326172 +v -3.552734 0.117188 -0.345703 +v -5.447266 0.117188 -0.345703 +v -3.492188 0.179688 -0.369141 +v -5.507812 0.179688 -0.369141 +v -3.433594 0.226562 -0.384766 +v -5.566406 0.226562 -0.384766 +v -3.476562 0.281250 -0.380859 +v -5.523438 0.281250 -0.380859 +v -3.544922 0.232422 -0.347656 +v -5.455078 0.232422 -0.347656 +v -3.603516 0.171875 -0.330078 +v -5.396484 0.171875 -0.330078 +v -3.667969 0.113281 -0.322266 +v -5.332031 0.113281 -0.322266 +v -3.628906 0.011719 -0.310547 +v -5.371094 0.011719 -0.310547 +v -3.533203 0.042969 -0.347656 +v -5.466797 0.042969 -0.347656 +v -3.421875 0.099609 -0.414062 +v -5.578125 0.099609 -0.414062 +v -3.341797 0.181641 -0.437500 +v -5.658203 0.181641 -0.437500 +v -3.339844 0.267578 -0.439453 +v -5.660156 0.267578 -0.439453 +v -3.395833 0.315104 -0.429688 +v -5.604167 0.315104 -0.429688 +v -3.589844 -0.113281 -0.318359 +v -5.410156 -0.113281 -0.318359 +v -3.332031 -0.019531 -0.445312 +v -5.667969 -0.019531 -0.445312 +v -3.171875 0.181641 -0.470703 +v -5.828125 0.181641 -0.470703 +v -3.199219 0.398438 -0.472656 +v -5.800781 0.398438 -0.472656 +v -3.367188 0.472656 -0.441406 +v -5.632812 0.472656 -0.441406 +v -3.550781 0.425781 -0.353516 +v -5.449219 0.425781 -0.353516 +v -3.572266 0.152344 -0.421875 +v -5.427734 0.152344 -0.421875 +v -3.343750 0.218750 -0.513672 +v -5.656250 0.218750 -0.513672 +v -3.190104 0.273438 -0.526042 +v -5.809896 0.273438 -0.526042 +v -3.664062 0.345703 -0.314453 +v -5.335938 0.345703 -0.314453 +v -3.734375 0.128906 -0.394531 +v -5.265625 0.128906 -0.394531 +v -3.800781 -0.099609 -0.261719 +v -5.199219 -0.099609 -0.261719 +vt 0.891692 0.588839 +vt 0.880961 0.586564 +vt 0.881557 0.574808 +vt 0.896488 0.577834 +vt 0.870121 0.588631 +vt 0.866440 0.577724 +vt 0.862025 0.562834 +vt 0.882667 0.558933 +vt 0.903005 0.563061 +vt 0.858288 0.847917 +vt 0.863360 0.833238 +vt 0.878333 0.836822 +vt 0.878737 0.852730 +vt 0.867521 0.822505 +vt 0.878258 0.825051 +vt 0.889080 0.823254 +vt 0.893383 0.834461 +vt 0.899238 0.849510 +vt 0.884459 0.541407 +vt 0.910227 0.547014 +vt 0.858169 0.545895 +vt 0.854594 0.527932 +vt 0.886592 0.523054 +vt 0.917801 0.530331 +vt 0.849316 0.882455 +vt 0.853685 0.864668 +vt 0.879749 0.870319 +vt 0.881065 0.888748 +vt 0.905740 0.865861 +vt 0.912566 0.882863 +vt 0.844401 0.574426 +vt 0.835120 0.560496 +vt 0.832125 0.591507 +vt 0.818536 0.582644 +vt 0.804365 0.573027 +vt 0.825750 0.545548 +vt 0.801138 0.835175 +vt 0.815721 0.826196 +vt 0.831306 0.849059 +vt 0.821281 0.863575 +vt 0.829690 0.817945 +vt 0.841196 0.835554 +vt 0.860653 0.594966 +vt 0.853501 0.586322 +vt 0.854032 0.604170 +vt 0.844549 0.598858 +vt 0.842429 0.811153 +vt 0.850816 0.824074 +vt 0.852138 0.806266 +vt 0.858344 0.815756 +vt 0.851729 0.614846 +vt 0.841395 0.613584 +vt 0.853473 0.625708 +vt 0.843729 0.628701 +vt 0.830502 0.632828 +vt 0.827527 0.611871 +vt 0.829903 0.776592 +vt 0.842933 0.781303 +vt 0.839931 0.796301 +vt 0.826001 0.797397 +vt 0.852535 0.784725 +vt 0.850311 0.795499 +vt 0.811643 0.609776 +vt 0.815003 0.637757 +vt 0.798368 0.643086 +vt 0.794749 0.607489 +vt 0.798256 0.764919 +vt 0.814639 0.770981 +vt 0.810039 0.798785 +vt 0.793061 0.800320 +vt 0.840944 0.651686 +vt 0.829182 0.662454 +vt 0.857367 0.664845 +vt 0.851481 0.679473 +vt 0.845508 0.695011 +vt 0.816688 0.673967 +vt 0.847654 0.715138 +vt 0.852931 0.730925 +vt 0.829899 0.746938 +vt 0.817928 0.734882 +vt 0.858163 0.745800 +vt 0.841172 0.758218 +vt 0.858989 0.635473 +vt 0.851242 0.642408 +vt 0.867665 0.642345 +vt 0.863079 0.652037 +vt 0.863300 0.758849 +vt 0.851048 0.767943 +vt 0.867452 0.768735 +vt 0.858480 0.775215 +vt 0.878887 0.644529 +vt 0.878385 0.654923 +vt 0.890382 0.642464 +vt 0.894097 0.651799 +vt 0.899630 0.664227 +vt 0.878286 0.668708 +vt 0.900356 0.748294 +vt 0.894278 0.760463 +vt 0.878719 0.756645 +vt 0.879233 0.742869 +vt 0.890152 0.769624 +vt 0.878760 0.767051 +vt 0.879203 0.684420 +vt 0.907091 0.678322 +vt 0.915517 0.693251 +vt 0.880628 0.701094 +vt 0.917516 0.720003 +vt 0.908436 0.734543 +vt 0.880846 0.727214 +vt 0.883009 0.710619 +vt 0.917327 0.652351 +vt 0.929888 0.662207 +vt 0.929409 0.635102 +vt 0.945192 0.639156 +vt 0.962205 0.643188 +vt 0.943645 0.672515 +vt 0.961937 0.772088 +vt 0.944761 0.775361 +vt 0.930496 0.751654 +vt 0.944697 0.741966 +vt 0.928814 0.778711 +vt 0.917509 0.760943 +vt 0.899876 0.636590 +vt 0.907155 0.643402 +vt 0.906348 0.627709 +vt 0.916089 0.631003 +vt 0.915325 0.782214 +vt 0.906950 0.769432 +vt 0.905448 0.785074 +vt 0.899376 0.775914 +vt 0.908777 0.616619 +vt 0.919430 0.615878 +vt 0.906995 0.605249 +vt 0.917062 0.600430 +vt 0.930714 0.593624 +vt 0.933908 0.614500 +vt 0.928276 0.820207 +vt 0.914940 0.812801 +vt 0.917991 0.797473 +vt 0.932394 0.799492 +vt 0.905097 0.807540 +vt 0.907382 0.796260 +vt 0.950598 0.612253 +vt 0.946105 0.585451 +vt 0.962364 0.576594 +vt 0.968392 0.609573 +vt 0.959139 0.838624 +vt 0.943289 0.829055 +vt 0.948967 0.802477 +vt 0.966626 0.805946 +vt 0.919717 0.575551 +vt 0.931712 0.562700 +vt 0.944279 0.549179 +vt 0.927900 0.851144 +vt 0.939855 0.865209 +vt 0.916488 0.837774 +vt 0.900835 0.595528 +vt 0.908869 0.587062 +vt 0.906161 0.825792 +vt 0.898511 0.816977 +vt 0.897284 0.599247 +vt 0.889634 0.593581 +vt 0.902360 0.607463 +vt 0.898689 0.609003 +vt 0.894921 0.601583 +vt 0.888110 0.597049 +vt 0.896965 0.803421 +vt 0.900564 0.805122 +vt 0.895129 0.813105 +vt 0.892872 0.810667 +vt 0.887235 0.818426 +vt 0.885867 0.814894 +vt 0.903563 0.616952 +vt 0.901305 0.626065 +vt 0.897259 0.624521 +vt 0.899888 0.617003 +vt 0.896226 0.787855 +vt 0.900336 0.786492 +vt 0.902188 0.795696 +vt 0.898518 0.795483 +vt 0.895995 0.633149 +vt 0.888373 0.637644 +vt 0.886679 0.633759 +vt 0.893156 0.630591 +vt 0.886066 0.778156 +vt 0.887931 0.774350 +vt 0.895346 0.779179 +vt 0.892396 0.781608 +vt 0.879183 0.638993 +vt 0.870175 0.637066 +vt 0.872102 0.632914 +vt 0.879329 0.635048 +vt 0.871465 0.778354 +vt 0.869725 0.774120 +vt 0.878810 0.772595 +vt 0.878780 0.776542 +vt 0.863101 0.631734 +vt 0.858526 0.624180 +vt 0.862476 0.622856 +vt 0.865988 0.629039 +vt 0.861403 0.787974 +vt 0.857515 0.786476 +vt 0.862421 0.779132 +vt 0.865186 0.781954 +vt 0.857013 0.615585 +vt 0.858792 0.606916 +vt 0.862520 0.608863 +vt 0.860718 0.615982 +vt 0.860826 0.801955 +vt 0.857015 0.803735 +vt 0.855623 0.794995 +vt 0.859342 0.794764 +vt 0.864088 0.599137 +vt 0.871771 0.593621 +vt 0.872990 0.597353 +vt 0.866415 0.601876 +vt 0.870775 0.813919 +vt 0.869391 0.817593 +vt 0.861961 0.811741 +vt 0.864406 0.809109 +vt 0.880708 0.591737 +vt 0.880545 0.595056 +vt 0.878235 0.819872 +vt 0.878220 0.816549 +vt 0.879569 0.616335 +vt 0.875381 0.604486 +vt 0.880218 0.601249 +vt 0.884915 0.604234 +vt 0.878169 0.810347 +vt 0.882993 0.807574 +vt 0.873480 0.806899 +vt 0.878190 0.795247 +vt 0.870243 0.606220 +vt 0.868906 0.611783 +vt 0.868423 0.804939 +vt 0.867334 0.799322 +vt 0.868915 0.620475 +vt 0.866315 0.616213 +vt 0.864943 0.794781 +vt 0.867730 0.790638 +vt 0.874939 0.626604 +vt 0.870063 0.625233 +vt 0.869088 0.785936 +vt 0.874020 0.784783 +vt 0.883908 0.627225 +vt 0.879383 0.629428 +vt 0.878585 0.782159 +vt 0.883008 0.784561 +vt 0.890509 0.621523 +vt 0.889008 0.626432 +vt 0.888067 0.785579 +vt 0.889349 0.790550 +vt 0.891514 0.611803 +vt 0.893847 0.616893 +vt 0.892478 0.795324 +vt 0.889922 0.800305 +vt 0.890450 0.605899 +vt 0.888597 0.806156 +vt 0.539314 0.053345 +vt 0.537040 0.057979 +vt 0.528630 0.056463 +vt 0.529796 0.050810 +vt 0.534325 0.061941 +vt 0.527228 0.060718 +vt 0.518927 0.060123 +vt 0.518925 0.055721 +vt 0.518925 0.049546 +vt 0.510632 0.060704 +vt 0.509230 0.056447 +vt 0.503543 0.061915 +vt 0.500834 0.057948 +vt 0.498567 0.053309 +vt 0.508066 0.050791 +vt 0.550838 0.058385 +vt 0.546647 0.061563 +vt 0.542849 0.059576 +vt 0.546114 0.055913 +vt 0.541991 0.065324 +vt 0.539009 0.063244 +vt 0.498862 0.063209 +vt 0.495029 0.059533 +vt 0.495878 0.065284 +vt 0.491230 0.061512 +vt 0.487046 0.058322 +vt 0.491773 0.055863 +vt 0.557459 0.064110 +vt 0.550940 0.068207 +vt 0.549020 0.064249 +vt 0.554132 0.060628 +vt 0.545459 0.073526 +vt 0.543983 0.068878 +vt 0.493881 0.068835 +vt 0.488852 0.064193 +vt 0.492398 0.073483 +vt 0.486924 0.068151 +vt 0.480407 0.064032 +vt 0.483748 0.060557 +vt 0.568627 0.080034 +vt 0.557062 0.083355 +vt 0.553377 0.074012 +vt 0.562286 0.070296 +vt 0.548931 0.087707 +vt 0.546894 0.078888 +vt 0.490953 0.078848 +vt 0.484473 0.073956 +vt 0.488904 0.087676 +vt 0.480762 0.083308 +vt 0.469163 0.079950 +vt 0.475552 0.070210 +vt 0.584301 0.109492 +vt 0.568768 0.114105 +vt 0.562725 0.097931 +vt 0.576499 0.094172 +vt 0.555797 0.119762 +vt 0.552211 0.102723 +vt 0.485603 0.102716 +vt 0.475056 0.097908 +vt 0.482003 0.119791 +vt 0.468969 0.114124 +vt 0.453338 0.109484 +vt 0.461217 0.094114 +vt 0.606157 0.171638 +vt 0.623405 0.186359 +vt 0.606884 0.200763 +vt 0.586464 0.187024 +vt 0.644385 0.202482 +vt 0.632076 0.214445 +vt 0.621002 0.227303 +vt 0.592977 0.218210 +vt 0.558793 0.209623 +vt 0.416962 0.228987 +vt 0.405473 0.216015 +vt 0.430888 0.201769 +vt 0.445231 0.219311 +vt 0.392747 0.203928 +vt 0.413973 0.187311 +vt 0.431395 0.172229 +vt 0.451442 0.187610 +vt 0.479659 0.210128 +vt 0.661887 0.218192 +vt 0.652512 0.228696 +vt 0.678158 0.233870 +vt 0.669687 0.243281 +vt 0.660913 0.251049 +vt 0.643415 0.238482 +vt 0.376630 0.254079 +vt 0.367417 0.246239 +vt 0.384811 0.230909 +vt 0.394310 0.240811 +vt 0.358459 0.236653 +vt 0.375004 0.220227 +vt 0.695442 0.249895 +vt 0.685098 0.257963 +vt 0.708176 0.267594 +vt 0.695713 0.273774 +vt 0.682849 0.278473 +vt 0.674192 0.264305 +vt 0.354754 0.283002 +vt 0.341241 0.278500 +vt 0.351801 0.261791 +vt 0.363279 0.268087 +vt 0.328067 0.272424 +vt 0.340831 0.253653 +vt 0.710799 0.288295 +vt 0.698505 0.291745 +vt 0.707738 0.307724 +vt 0.696383 0.308222 +vt 0.686069 0.307434 +vt 0.686480 0.293780 +vt 0.352515 0.313128 +vt 0.341893 0.314378 +vt 0.339014 0.297300 +vt 0.351555 0.298991 +vt 0.330125 0.314386 +vt 0.326116 0.294166 +vt 0.703422 0.321607 +vt 0.692260 0.319551 +vt 0.695343 0.334923 +vt 0.683891 0.330694 +vt 0.674331 0.325948 +vt 0.682599 0.316647 +vt 0.365353 0.331659 +vt 0.355756 0.336965 +vt 0.346649 0.325920 +vt 0.356469 0.322489 +vt 0.344203 0.341867 +vt 0.335240 0.328591 +vt 0.680993 0.352654 +vt 0.669034 0.346615 +vt 0.663496 0.370552 +vt 0.651914 0.362916 +vt 0.643166 0.354229 +vt 0.659524 0.339869 +vt 0.398430 0.359143 +vt 0.389912 0.368382 +vt 0.371689 0.352552 +vt 0.381103 0.345227 +vt 0.378483 0.376706 +vt 0.359757 0.359299 +vt 0.645975 0.384372 +vt 0.636756 0.375199 +vt 0.629889 0.393629 +vt 0.623653 0.383198 +vt 0.619606 0.371731 +vt 0.630242 0.364845 +vt 0.423128 0.375860 +vt 0.419544 0.387656 +vt 0.405892 0.380159 +vt 0.412042 0.369355 +vt 0.413721 0.398510 +vt 0.396965 0.389904 +vt 0.616695 0.397839 +vt 0.612698 0.386651 +vt 0.601508 0.398118 +vt 0.599483 0.385777 +vt 0.598403 0.373750 +vt 0.610113 0.374904 +vt 0.444643 0.376983 +vt 0.444079 0.389172 +vt 0.430786 0.390645 +vt 0.432874 0.378651 +vt 0.442602 0.401710 +vt 0.427272 0.402137 +vt 0.579440 0.395584 +vt 0.579601 0.380796 +vt 0.556312 0.392010 +vt 0.557829 0.374417 +vt 0.561672 0.359562 +vt 0.581121 0.367656 +vt 0.481024 0.361159 +vt 0.485493 0.375925 +vt 0.463880 0.383280 +vt 0.461797 0.370110 +vt 0.487774 0.393516 +vt 0.464695 0.398151 +vt 0.537944 0.389169 +vt 0.538944 0.369350 +vt 0.521980 0.388104 +vt 0.521543 0.367321 +vt 0.521061 0.342410 +vt 0.543462 0.352409 +vt 0.504220 0.370059 +vt 0.499012 0.353258 +vt 0.506063 0.389860 +vt 0.576492 0.338892 +vt 0.588070 0.344127 +vt 0.584401 0.354960 +vt 0.568874 0.347883 +vt 0.599057 0.346360 +vt 0.598421 0.359397 +vt 0.444019 0.362487 +vt 0.457972 0.357441 +vt 0.442838 0.349341 +vt 0.453843 0.346655 +vt 0.465321 0.340933 +vt 0.473324 0.349694 +vt 0.607932 0.346220 +vt 0.608629 0.359957 +vt 0.616122 0.343912 +vt 0.617334 0.357203 +vt 0.424802 0.361046 +vt 0.433732 0.363472 +vt 0.425468 0.347532 +vt 0.433859 0.349548 +vt 0.635618 0.333132 +vt 0.638389 0.343234 +vt 0.626846 0.351699 +vt 0.625058 0.339638 +vt 0.414922 0.355865 +vt 0.402821 0.347745 +vt 0.405220 0.337354 +vt 0.416228 0.343550 +vt 0.660206 0.314651 +vt 0.666553 0.319974 +vt 0.653188 0.331596 +vt 0.648683 0.324125 +vt 0.387230 0.336504 +vt 0.373083 0.325196 +vt 0.379378 0.319477 +vt 0.391528 0.328696 +vt 0.667992 0.298745 +vt 0.676436 0.303224 +vt 0.673796 0.311559 +vt 0.666139 0.306742 +vt 0.365319 0.316873 +vt 0.362283 0.308393 +vt 0.370802 0.303443 +vt 0.372998 0.311601 +vt 0.662811 0.278039 +vt 0.671750 0.278936 +vt 0.675991 0.291841 +vt 0.667274 0.289008 +vt 0.362322 0.296617 +vt 0.366247 0.283149 +vt 0.375432 0.281942 +vt 0.371202 0.293380 +vt 0.641178 0.255826 +vt 0.650468 0.254124 +vt 0.663002 0.266035 +vt 0.653428 0.266347 +vt 0.374870 0.269594 +vt 0.387430 0.257018 +vt 0.397003 0.258546 +vt 0.384728 0.269661 +vt 0.612614 0.245298 +vt 0.615193 0.237332 +vt 0.634875 0.244188 +vt 0.628116 0.248367 +vt 0.403166 0.246488 +vt 0.423081 0.239096 +vt 0.425893 0.247131 +vt 0.410175 0.250607 +vt 0.575330 0.254115 +vt 0.567220 0.237521 +vt 0.590391 0.234661 +vt 0.593043 0.247945 +vt 0.448181 0.235931 +vt 0.471694 0.238405 +vt 0.463886 0.255283 +vt 0.445806 0.249401 +vt 0.565405 0.261613 +vt 0.552431 0.247258 +vt 0.560180 0.270496 +vt 0.544078 0.261210 +vt 0.519748 0.247463 +vt 0.539890 0.229722 +vt 0.495583 0.261777 +vt 0.486848 0.247926 +vt 0.499170 0.230035 +vt 0.479598 0.271478 +vt 0.474105 0.262644 +vt 0.554142 0.339407 +vt 0.565846 0.330030 +vt 0.543239 0.327870 +vt 0.557974 0.318586 +vt 0.487805 0.340609 +vt 0.498341 0.328625 +vt 0.475717 0.331615 +vt 0.483239 0.319819 +vt 0.539203 0.311610 +vt 0.554719 0.305611 +vt 0.520605 0.315606 +vt 0.520283 0.294503 +vt 0.539155 0.293575 +vt 0.554708 0.292543 +vt 0.501854 0.312181 +vt 0.501351 0.294108 +vt 0.486090 0.306659 +vt 0.485701 0.293519 +vt 0.540216 0.276712 +vt 0.520023 0.274395 +vt 0.556571 0.280822 +vt 0.483500 0.281781 +vt 0.499839 0.277239 +vt 0.526391 0.068708 +vt 0.522781 0.067683 +vt 0.524939 0.064655 +vt 0.530205 0.065733 +vt 0.518928 0.067374 +vt 0.518928 0.064220 +vt 0.512920 0.064645 +vt 0.515077 0.067676 +vt 0.511468 0.068696 +vt 0.507658 0.065715 +vt 0.531713 0.073805 +vt 0.529517 0.070555 +vt 0.533980 0.067239 +vt 0.536458 0.069915 +vt 0.503884 0.067214 +vt 0.508342 0.070538 +vt 0.506144 0.073786 +vt 0.501405 0.069887 +vt 0.531225 0.085306 +vt 0.532534 0.079044 +vt 0.537832 0.074505 +vt 0.538680 0.079646 +vt 0.500025 0.074475 +vt 0.505319 0.079025 +vt 0.506623 0.085290 +vt 0.499172 0.079617 +vt 0.544035 0.123768 +vt 0.542166 0.106319 +vt 0.533926 0.126157 +vt 0.533130 0.108797 +vt 0.532778 0.094453 +vt 0.540687 0.091527 +vt 0.505070 0.094443 +vt 0.504724 0.108798 +vt 0.495672 0.106319 +vt 0.497156 0.091509 +vt 0.503945 0.126173 +vt 0.493809 0.123794 +vt 0.539578 0.083978 +vt 0.532163 0.087925 +vt 0.498269 0.083952 +vt 0.505684 0.087910 +vt 0.538348 0.156626 +vt 0.527985 0.152668 +vt 0.527019 0.141551 +vt 0.535871 0.141734 +vt 0.518978 0.151208 +vt 0.518960 0.140806 +vt 0.518943 0.126975 +vt 0.525912 0.126964 +vt 0.510900 0.141567 +vt 0.511972 0.126972 +vt 0.509972 0.152692 +vt 0.499609 0.156683 +vt 0.502034 0.141769 +vt 0.525644 0.110236 +vt 0.525656 0.096120 +vt 0.518932 0.110696 +vt 0.518927 0.096637 +vt 0.512218 0.110236 +vt 0.512196 0.096115 +vt 0.518926 0.086472 +vt 0.524945 0.086835 +vt 0.525385 0.089371 +vt 0.518925 0.089467 +vt 0.512464 0.089364 +vt 0.512904 0.086828 +vt 0.547150 0.173975 +vt 0.542049 0.175206 +vt 0.539912 0.168679 +vt 0.544567 0.165720 +vt 0.538113 0.176101 +vt 0.536881 0.171060 +vt 0.533511 0.166606 +vt 0.535266 0.163215 +vt 0.504503 0.166651 +vt 0.501153 0.171120 +vt 0.498108 0.168754 +vt 0.502729 0.163266 +vt 0.499949 0.176162 +vt 0.496015 0.175290 +vt 0.490904 0.174097 +vt 0.493427 0.165818 +vt 0.542087 0.193360 +vt 0.539006 0.189238 +vt 0.541963 0.182617 +vt 0.546610 0.183905 +vt 0.536530 0.186910 +vt 0.538179 0.181821 +vt 0.499923 0.181859 +vt 0.496167 0.182681 +vt 0.501611 0.186905 +vt 0.499260 0.189262 +vt 0.496310 0.193451 +vt 0.491548 0.184024 +vt 0.519585 0.200761 +vt 0.525614 0.194544 +vt 0.532532 0.193393 +vt 0.532726 0.200192 +vt 0.527756 0.190822 +vt 0.532619 0.190057 +vt 0.505552 0.189995 +vt 0.505986 0.193367 +vt 0.510391 0.190728 +vt 0.512872 0.194488 +vt 0.506139 0.200234 +vt 0.519186 0.192623 +vt 0.518619 0.190064 +vt 0.521327 0.192154 +vt 0.518797 0.193930 +vt 0.518974 0.187013 +vt 0.523255 0.188764 +vt 0.514776 0.188701 +vt 0.516442 0.192115 +vt 0.527826 0.158992 +vt 0.518991 0.157196 +vt 0.527032 0.162649 +vt 0.519000 0.160800 +vt 0.510157 0.159017 +vt 0.510971 0.162672 +vt 0.526090 0.165766 +vt 0.519009 0.164045 +vt 0.531718 0.169248 +vt 0.529697 0.170661 +vt 0.525478 0.169088 +vt 0.519023 0.167804 +vt 0.508343 0.170695 +vt 0.506311 0.169287 +vt 0.511931 0.165788 +vt 0.512566 0.169108 +vt 0.519086 0.184064 +vt 0.523803 0.185735 +vt 0.519080 0.179599 +vt 0.524925 0.183297 +vt 0.527818 0.185477 +vt 0.528180 0.187827 +vt 0.510239 0.185427 +vt 0.513176 0.183269 +vt 0.514309 0.185681 +vt 0.509857 0.187746 +vt 0.531939 0.187473 +vt 0.530566 0.184922 +vt 0.532840 0.183728 +vt 0.534565 0.185097 +vt 0.505231 0.183720 +vt 0.507488 0.184890 +vt 0.506111 0.187416 +vt 0.503521 0.185086 +vt 0.535546 0.181124 +vt 0.532774 0.180940 +vt 0.532096 0.177133 +vt 0.535348 0.176654 +vt 0.505971 0.177171 +vt 0.505299 0.180956 +vt 0.502535 0.181150 +vt 0.502711 0.176703 +vt 0.534438 0.172786 +vt 0.531173 0.173628 +vt 0.506881 0.173668 +vt 0.503603 0.172837 +vt 0.526699 0.177809 +vt 0.528574 0.181682 +vt 0.509509 0.181678 +vt 0.511405 0.177826 +vt 0.519049 0.172948 +vt 0.525674 0.173357 +vt 0.512407 0.173378 +vt 0.534250 0.213168 +vt 0.519646 0.219043 +vt 0.545871 0.200552 +vt 0.492604 0.200768 +vt 0.504734 0.213297 +vt 0.551833 0.186076 +vt 0.553412 0.172419 +vt 0.563647 0.168321 +vt 0.561716 0.184013 +vt 0.474292 0.168551 +vt 0.484615 0.172594 +vt 0.486345 0.186292 +vt 0.476391 0.184328 +vt 0.551880 0.162260 +vt 0.548945 0.152313 +vt 0.561164 0.147206 +vt 0.563129 0.157240 +vt 0.476663 0.147328 +vt 0.488961 0.152405 +vt 0.486067 0.162392 +vt 0.474729 0.157411 +vt 0.546313 0.139291 +vt 0.558750 0.134651 +vt 0.491557 0.139347 +vt 0.479056 0.134725 +vt 0.590430 0.122775 +vt 0.573592 0.128247 +vt 0.594811 0.133874 +vt 0.577198 0.140149 +vt 0.460500 0.140293 +vt 0.464117 0.128325 +vt 0.442725 0.134028 +vt 0.447147 0.122844 +vt 0.597367 0.142638 +vt 0.579588 0.149602 +vt 0.598809 0.150811 +vt 0.580668 0.159466 +vt 0.457083 0.159742 +vt 0.458117 0.149807 +vt 0.438729 0.151122 +vt 0.440157 0.142869 +vt 0.580343 0.172599 +vt 0.599848 0.160133 +vt 0.457516 0.172972 +vt 0.437728 0.160537 +vt 0.524451 0.085358 +vt 0.528614 0.084539 +vt 0.518925 0.084939 +vt 0.518925 0.083754 +vt 0.523789 0.084048 +vt 0.527444 0.083330 +vt 0.513399 0.085351 +vt 0.514061 0.084042 +vt 0.509234 0.084527 +vt 0.510406 0.083320 +vt 0.530055 0.080412 +vt 0.529424 0.075463 +vt 0.528681 0.080010 +vt 0.528076 0.075978 +vt 0.507797 0.080397 +vt 0.509171 0.079997 +vt 0.508431 0.075448 +vt 0.509779 0.075966 +vt 0.527375 0.072183 +vt 0.524595 0.070217 +vt 0.526202 0.073130 +vt 0.523725 0.071312 +vt 0.510482 0.072171 +vt 0.511655 0.073120 +vt 0.513262 0.070208 +vt 0.514132 0.071305 +vt 0.521773 0.069210 +vt 0.518929 0.068946 +vt 0.521311 0.070372 +vt 0.518929 0.070120 +vt 0.516084 0.069206 +vt 0.516546 0.070368 +vt 0.520792 0.072301 +vt 0.518928 0.072082 +vt 0.522687 0.073045 +vt 0.522119 0.075131 +vt 0.520571 0.074660 +vt 0.518928 0.074477 +vt 0.515737 0.075127 +vt 0.515170 0.073039 +vt 0.517065 0.072298 +vt 0.517285 0.074658 +vt 0.524646 0.074400 +vt 0.526155 0.076440 +vt 0.524746 0.076798 +vt 0.523477 0.075811 +vt 0.513109 0.076790 +vt 0.511700 0.076430 +vt 0.513211 0.074391 +vt 0.514379 0.075804 +vt 0.526702 0.079241 +vt 0.525770 0.081523 +vt 0.524030 0.079411 +vt 0.524751 0.078250 +vt 0.513823 0.079405 +vt 0.512081 0.081515 +vt 0.511151 0.079231 +vt 0.513103 0.078243 +vt 0.522846 0.082010 +vt 0.518925 0.081803 +vt 0.518926 0.079423 +vt 0.521844 0.079585 +vt 0.515005 0.082005 +vt 0.516008 0.079581 +vt 0.518927 0.076953 +vt 0.521004 0.077111 +vt 0.522658 0.077287 +vt 0.516851 0.077109 +vt 0.515197 0.077283 +vt 0.523466 0.077182 +vt 0.514389 0.077176 +vt 0.565241 0.283355 +vt 0.563684 0.292624 +vt 0.568319 0.275320 +vt 0.572243 0.277777 +vt 0.569831 0.285006 +vt 0.569010 0.293225 +vt 0.467623 0.279114 +vt 0.471518 0.276529 +vt 0.474842 0.284556 +vt 0.470260 0.286350 +vt 0.476677 0.293863 +vt 0.471328 0.294625 +vt 0.564222 0.303025 +vt 0.567317 0.313741 +vt 0.570071 0.302291 +vt 0.573142 0.311497 +vt 0.476455 0.304364 +vt 0.470539 0.303808 +vt 0.473683 0.315267 +vt 0.467739 0.313198 +vt 0.573436 0.323961 +vt 0.581581 0.332100 +vt 0.578352 0.320136 +vt 0.585105 0.327137 +vt 0.467866 0.325779 +vt 0.462776 0.322092 +vt 0.459942 0.334276 +vt 0.456204 0.329397 +vt 0.572342 0.268622 +vt 0.580216 0.262425 +vt 0.583200 0.266123 +vt 0.575954 0.271684 +vt 0.456225 0.267598 +vt 0.459147 0.263778 +vt 0.467276 0.269863 +vt 0.463706 0.273050 +vt 0.594847 0.255893 +vt 0.611230 0.251963 +vt 0.610754 0.257158 +vt 0.596216 0.260490 +vt 0.428062 0.259163 +vt 0.427457 0.253882 +vt 0.444168 0.257490 +vt 0.442893 0.262195 +vt 0.624361 0.253572 +vt 0.635866 0.259477 +vt 0.633046 0.263505 +vt 0.622561 0.258500 +vt 0.405517 0.266204 +vt 0.402535 0.262154 +vt 0.414133 0.255836 +vt 0.416083 0.260823 +vt 0.647372 0.268436 +vt 0.656424 0.278659 +vt 0.651897 0.280071 +vt 0.643616 0.271163 +vt 0.386714 0.283696 +vt 0.382022 0.282383 +vt 0.391003 0.271638 +vt 0.394925 0.274331 +vt 0.660566 0.288359 +vt 0.661246 0.297150 +vt 0.656019 0.296899 +vt 0.655512 0.288824 +vt 0.383039 0.301103 +vt 0.377677 0.301548 +vt 0.378081 0.292480 +vt 0.383289 0.292791 +vt 0.659916 0.304646 +vt 0.654935 0.311857 +vt 0.650639 0.310282 +vt 0.654971 0.303771 +vt 0.389015 0.314625 +vt 0.384672 0.316404 +vt 0.379310 0.309202 +vt 0.384353 0.308119 +vt 0.644668 0.319791 +vt 0.632887 0.327126 +vt 0.630529 0.323708 +vt 0.641296 0.317272 +vt 0.410025 0.327565 +vt 0.407758 0.331135 +vt 0.395459 0.324113 +vt 0.398809 0.321411 +vt 0.623366 0.332538 +vt 0.615257 0.336155 +vt 0.614615 0.331821 +vt 0.621931 0.328558 +vt 0.426508 0.335214 +vt 0.426027 0.339635 +vt 0.417654 0.336274 +vt 0.418956 0.332175 +vt 0.607708 0.338104 +vt 0.599835 0.338280 +vt 0.600616 0.333421 +vt 0.607698 0.333496 +vt 0.440754 0.336316 +vt 0.441730 0.341203 +vt 0.433755 0.341324 +vt 0.433586 0.336655 +vt 0.590753 0.336576 +vt 0.592806 0.331433 +vt 0.450844 0.339136 +vt 0.448579 0.334018 +vt 0.594583 0.327825 +vt 0.601265 0.330046 +vt 0.588029 0.323634 +vt 0.590651 0.320861 +vt 0.596222 0.324984 +vt 0.601847 0.327415 +vt 0.450378 0.323260 +vt 0.453126 0.325966 +vt 0.446650 0.330437 +vt 0.444890 0.327625 +vt 0.439971 0.332925 +vt 0.439283 0.330283 +vt 0.607644 0.330283 +vt 0.614074 0.328799 +vt 0.607567 0.327768 +vt 0.613582 0.326433 +vt 0.433517 0.333397 +vt 0.433497 0.330845 +vt 0.426939 0.332127 +vt 0.427345 0.329707 +vt 0.620908 0.325858 +vt 0.628881 0.321370 +vt 0.620093 0.323798 +vt 0.627586 0.319573 +vt 0.419888 0.329392 +vt 0.420636 0.327267 +vt 0.411613 0.325121 +vt 0.412862 0.323240 +vt 0.638723 0.315246 +vt 0.647218 0.308618 +vt 0.636549 0.313467 +vt 0.644235 0.306908 +vt 0.401361 0.319243 +vt 0.403515 0.317343 +vt 0.392457 0.312790 +vt 0.395450 0.310927 +vt 0.651151 0.302617 +vt 0.652130 0.296452 +vt 0.647895 0.301323 +vt 0.648910 0.295907 +vt 0.388229 0.306793 +vt 0.391522 0.305346 +vt 0.387015 0.300507 +vt 0.390299 0.299835 +vt 0.651762 0.289330 +vt 0.648537 0.281545 +vt 0.648663 0.289856 +vt 0.645760 0.283051 +vt 0.387155 0.293188 +vt 0.390351 0.293627 +vt 0.390206 0.285109 +vt 0.393099 0.286571 +vt 0.640941 0.273393 +vt 0.631234 0.266340 +vt 0.638807 0.275375 +vt 0.629925 0.268578 +vt 0.397726 0.276543 +vt 0.399966 0.278515 +vt 0.407439 0.269058 +vt 0.408831 0.271315 +vt 0.621671 0.261850 +vt 0.610899 0.260715 +vt 0.621235 0.264412 +vt 0.611355 0.263452 +vt 0.417069 0.264222 +vt 0.417574 0.266826 +vt 0.427998 0.262789 +vt 0.427598 0.265588 +vt 0.597565 0.263724 +vt 0.585604 0.268884 +vt 0.598903 0.266275 +vt 0.587720 0.271176 +vt 0.441606 0.265513 +vt 0.440311 0.268138 +vt 0.453864 0.270454 +vt 0.451783 0.272829 +vt 0.578953 0.274202 +vt 0.575703 0.279966 +vt 0.581645 0.276446 +vt 0.578929 0.282021 +vt 0.460743 0.275672 +vt 0.458084 0.278012 +vt 0.464190 0.281418 +vt 0.460989 0.283583 +vt 0.582033 0.317488 +vt 0.577323 0.310016 +vt 0.580682 0.308917 +vt 0.585096 0.315428 +vt 0.460048 0.310844 +vt 0.463474 0.311842 +vt 0.458970 0.319548 +vt 0.455806 0.317576 +vt 0.574627 0.301852 +vt 0.573612 0.293750 +vt 0.577852 0.294237 +vt 0.578536 0.301558 +vt 0.462441 0.295908 +vt 0.466703 0.295291 +vt 0.465932 0.303507 +vt 0.461979 0.303333 +vt 0.573946 0.286469 +vt 0.577824 0.287838 +vt 0.466150 0.287943 +vt 0.462276 0.289437 +vt 0.537814 0.410803 +vt 0.522486 0.410487 +vt 0.556089 0.411900 +vt 0.556513 0.432940 +vt 0.538120 0.433345 +vt 0.523026 0.433671 +vt 0.489468 0.434574 +vt 0.488908 0.413457 +vt 0.507174 0.411509 +vt 0.507920 0.434083 +vt 0.580237 0.413224 +vt 0.604324 0.413413 +vt 0.607537 0.430184 +vt 0.581514 0.432289 +vt 0.438061 0.434299 +vt 0.440490 0.417253 +vt 0.464714 0.415920 +vt 0.464334 0.435139 +vt 0.622415 0.411107 +vt 0.638729 0.405048 +vt 0.648871 0.416961 +vt 0.628996 0.425416 +vt 0.395657 0.423058 +vt 0.405331 0.410500 +vt 0.422136 0.415812 +vt 0.416189 0.430578 +vt 0.657485 0.393976 +vt 0.676771 0.378394 +vt 0.690893 0.386339 +vt 0.670140 0.403795 +vt 0.351378 0.394172 +vt 0.365355 0.385357 +vt 0.385755 0.400221 +vt 0.373405 0.410823 +vt 0.694675 0.358805 +vt 0.708795 0.339345 +vt 0.723247 0.343864 +vt 0.709219 0.365014 +vt 0.315987 0.352544 +vt 0.330606 0.347118 +vt 0.346077 0.366293 +vt 0.331524 0.373408 +vt 0.716728 0.324148 +vt 0.720489 0.308075 +vt 0.736394 0.318639 +vt 0.731106 0.326933 +vt 0.300918 0.327580 +vt 0.316923 0.315395 +vt 0.321627 0.331925 +vt 0.306911 0.335590 +vt 0.722094 0.285988 +vt 0.718071 0.262689 +vt 0.731519 0.256780 +vt 0.735791 0.282538 +vt 0.303229 0.261534 +vt 0.317592 0.267554 +vt 0.314279 0.292209 +vt 0.299718 0.289022 +vt 0.704948 0.242983 +vt 0.687690 0.225865 +vt 0.702798 0.217013 +vt 0.719338 0.235312 +vt 0.332486 0.219303 +vt 0.348426 0.228476 +vt 0.330762 0.246617 +vt 0.315457 0.238665 +vt 0.671262 0.210330 +vt 0.653897 0.195135 +vt 0.662317 0.184641 +vt 0.685445 0.200761 +vt 0.374195 0.185721 +vt 0.382918 0.196478 +vt 0.365218 0.212210 +vt 0.350400 0.202336 +vt 0.622294 0.014521 +vt 0.638176 0.018993 +vt 0.639561 0.040540 +vt 0.621541 0.032099 +vt 0.649495 0.021510 +vt 0.654195 0.047117 +vt 0.653501 0.070933 +vt 0.637878 0.060791 +vt 0.619529 0.049057 +vt 0.383906 0.070216 +vt 0.383583 0.046313 +vt 0.398340 0.039911 +vt 0.399749 0.060219 +vt 0.388782 0.020705 +vt 0.400073 0.018359 +vt 0.415921 0.014065 +vt 0.416466 0.031641 +vt 0.418298 0.048624 +vt 0.568824 0.005170 +vt 0.597184 0.007876 +vt 0.598253 0.024161 +vt 0.573917 0.020499 +vt 0.598430 0.039835 +vt 0.577728 0.035019 +vt 0.439789 0.023890 +vt 0.439501 0.039552 +vt 0.440977 0.007638 +vt 0.469257 0.005110 +vt 0.464105 0.020382 +vt 0.460236 0.034862 +vt 0.518953 0.018701 +vt 0.543191 0.012515 +vt 0.552750 0.024889 +vt 0.537616 0.033544 +vt 0.560569 0.036503 +vt 0.548263 0.041578 +vt 0.485213 0.024839 +vt 0.477380 0.036413 +vt 0.494779 0.012515 +vt 0.500285 0.033512 +vt 0.489654 0.041519 +vt 0.531378 0.042677 +vt 0.542117 0.047535 +vt 0.518927 0.040128 +vt 0.506494 0.042655 +vt 0.495779 0.047492 +vt 0.549415 0.051935 +vt 0.554977 0.055543 +vt 0.554949 0.048532 +vt 0.558366 0.052915 +vt 0.488483 0.051874 +vt 0.482963 0.048454 +vt 0.482915 0.055466 +vt 0.479532 0.052826 +vt 0.560503 0.058027 +vt 0.567352 0.061653 +vt 0.565105 0.054124 +vt 0.576047 0.057402 +vt 0.477380 0.057933 +vt 0.472789 0.054013 +vt 0.470506 0.061537 +vt 0.461815 0.057251 +vt 0.576881 0.068688 +vt 0.587176 0.079305 +vt 0.590585 0.064811 +vt 0.605153 0.075955 +vt 0.460918 0.068542 +vt 0.447196 0.064600 +vt 0.450534 0.079148 +vt 0.432505 0.075705 +vt 0.578971 0.047922 +vt 0.596821 0.054289 +vt 0.615002 0.064774 +vt 0.441013 0.054029 +vt 0.422701 0.064421 +vt 0.458932 0.047755 +vt 0.564907 0.046599 +vt 0.473014 0.046489 +vt 0.624013 0.104750 +vt 0.616184 0.090438 +vt 0.630060 0.078450 +vt 0.642020 0.091166 +vt 0.407441 0.078039 +vt 0.421316 0.090206 +vt 0.413334 0.104572 +vt 0.395272 0.090713 +vt 0.596324 0.093677 +vt 0.603744 0.108616 +vt 0.441273 0.093555 +vt 0.433741 0.108565 +vt 0.611761 0.131114 +vt 0.612571 0.139641 +vt 0.635943 0.127696 +vt 0.630860 0.142201 +vt 0.626197 0.150966 +vt 0.612401 0.147309 +vt 0.410974 0.151389 +vt 0.406192 0.142474 +vt 0.424780 0.139885 +vt 0.424973 0.147644 +vt 0.401083 0.127719 +vt 0.425593 0.131262 +vt 0.608855 0.120934 +vt 0.628976 0.115380 +vt 0.408262 0.115272 +vt 0.428547 0.120978 +vt 0.612370 0.154914 +vt 0.617753 0.164731 +vt 0.622617 0.156830 +vt 0.625724 0.164649 +vt 0.425034 0.155339 +vt 0.414640 0.157330 +vt 0.419599 0.165321 +vt 0.411492 0.165278 +vt 0.633828 0.179037 +vt 0.637884 0.173830 +vt 0.399140 0.174660 +vt 0.403302 0.179942 +vt 0.945213 0.085254 +vt 0.914838 0.105981 +vt 0.893260 0.084498 +vt 0.918840 0.058242 +vt 0.889132 0.123361 +vt 0.873282 0.106442 +vt 0.851852 0.096591 +vt 0.866972 0.069553 +vt 0.887771 0.038981 +vt 0.180084 0.088507 +vt 0.156552 0.097152 +vt 0.136417 0.071699 +vt 0.165727 0.058422 +vt 0.137530 0.114165 +vt 0.110425 0.092953 +vt 0.078484 0.067644 +vt 0.110619 0.041093 +vt 0.145659 0.024126 +vt 0.833734 0.057065 +vt 0.848682 0.023851 +vt 0.822965 0.086651 +vt 0.785804 0.079347 +vt 0.791534 0.049108 +vt 0.799709 0.015479 +vt 0.249093 0.074797 +vt 0.210628 0.080245 +vt 0.201098 0.048397 +vt 0.244703 0.043157 +vt 0.187463 0.012475 +vt 0.238018 0.007920 +vt 0.738361 0.047754 +vt 0.738984 0.016493 +vt 0.739549 0.077405 +vt 0.689992 0.080919 +vt 0.691272 0.049157 +vt 0.686167 0.020796 +vt 0.346775 0.079604 +vt 0.296387 0.074595 +vt 0.298714 0.044235 +vt 0.346234 0.047410 +vt 0.299313 0.012237 +vt 0.352169 0.018877 +vt 0.667324 0.049467 +vt 0.660914 0.022289 +vt 0.666424 0.075383 +vt 0.370819 0.074495 +vt 0.370369 0.048457 +vt 0.377403 0.021288 +vt 0.650904 0.098775 +vt 0.661183 0.105558 +vt 0.386234 0.098272 +vt 0.375694 0.105035 +vt 0.744333 0.224966 +vt 0.754642 0.247585 +vt 0.727991 0.205063 +vt 0.758274 0.191148 +vt 0.769779 0.215877 +vt 0.778667 0.239039 +vt 0.273755 0.191843 +vt 0.305809 0.206728 +vt 0.288775 0.227778 +vt 0.261579 0.218114 +vt 0.278389 0.252011 +vt 0.252527 0.243095 +vt 0.989113 0.167555 +vt 0.948074 0.176349 +vt 0.933945 0.138078 +vt 0.970213 0.123637 +vt 0.913217 0.182923 +vt 0.902861 0.149999 +vt 0.118945 0.142532 +vt 0.085008 0.126913 +vt 0.103932 0.178783 +vt 0.064870 0.169124 +vt 0.018760 0.156504 +vt 0.045395 0.108043 +vt 0.909803 0.401162 +vt 0.884003 0.369161 +vt 0.907892 0.346905 +vt 0.937286 0.373591 +vt 0.862686 0.339578 +vt 0.883515 0.321821 +vt 0.898768 0.301660 +vt 0.926996 0.320953 +vt 0.961117 0.340698 +vt 0.118375 0.315370 +vt 0.136374 0.338312 +vt 0.108675 0.368008 +vt 0.085783 0.338181 +vt 0.160786 0.357984 +vt 0.137159 0.392880 +vt 0.108456 0.430881 +vt 0.075184 0.399845 +vt 0.046294 0.361749 +vt 0.943061 0.290270 +vt 0.981378 0.299696 +vt 0.911263 0.279326 +vt 0.918742 0.252459 +vt 0.953248 0.255267 +vt 0.994570 0.255037 +vt 0.095172 0.258408 +vt 0.103698 0.289559 +vt 0.066713 0.302159 +vt 0.055135 0.260843 +vt 0.022056 0.313076 +vt 0.007083 0.259635 +vt 0.954713 0.216353 +vt 0.997190 0.211173 +vt 0.918953 0.218701 +vt 0.095629 0.219445 +vt 0.054717 0.215133 +vt 0.005987 0.207240 +vt 0.750414 0.337469 +vt 0.742710 0.323398 +vt 0.760230 0.315333 +vt 0.768682 0.327936 +vt 0.754434 0.300978 +vt 0.773434 0.293137 +vt 0.779994 0.306487 +vt 0.789564 0.318101 +vt 0.259496 0.301950 +vt 0.280510 0.309658 +vt 0.274913 0.325696 +vt 0.252703 0.316963 +vt 0.294625 0.333544 +vt 0.287286 0.349788 +vt 0.266464 0.340272 +vt 0.242718 0.330414 +vt 0.804247 0.296080 +vt 0.815676 0.307660 +vt 0.795245 0.283595 +vt 0.816175 0.273268 +vt 0.827684 0.284720 +vt 0.840737 0.296140 +vt 0.212022 0.281565 +vt 0.235299 0.292296 +vt 0.225501 0.306460 +vt 0.199173 0.294636 +vt 0.213124 0.319871 +vt 0.184690 0.307842 +vt 0.845003 0.273015 +vt 0.858466 0.283068 +vt 0.832533 0.263076 +vt 0.844821 0.251955 +vt 0.857419 0.260335 +vt 0.870829 0.268571 +vt 0.179781 0.258393 +vt 0.193764 0.270623 +vt 0.179588 0.281936 +vt 0.165402 0.267814 +vt 0.164426 0.293526 +vt 0.150180 0.277239 +vt 0.866150 0.246053 +vt 0.879792 0.252772 +vt 0.853541 0.238846 +vt 0.858615 0.227900 +vt 0.869522 0.229610 +vt 0.883757 0.234124 +vt 0.162811 0.231605 +vt 0.169328 0.243794 +vt 0.155267 0.251726 +vt 0.150917 0.233273 +vt 0.139801 0.259297 +vt 0.135112 0.238149 +vt 0.840777 0.191785 +vt 0.859121 0.189704 +vt 0.865865 0.210451 +vt 0.852806 0.214647 +vt 0.874671 0.186176 +vt 0.881130 0.211077 +vt 0.137932 0.212248 +vt 0.154082 0.212059 +vt 0.146173 0.184629 +vt 0.162167 0.189401 +vt 0.182052 0.194347 +vt 0.168313 0.217094 +vt 0.896625 0.215385 +vt 0.890727 0.185058 +vt 0.897871 0.243576 +vt 0.119181 0.248685 +vt 0.120908 0.216597 +vt 0.128897 0.182520 +vt 0.892501 0.265345 +vt 0.882329 0.283273 +vt 0.137173 0.294074 +vt 0.125336 0.273589 +vt 0.869172 0.299940 +vt 0.850334 0.314832 +vt 0.174262 0.329298 +vt 0.152490 0.312902 +vt 0.833464 0.354702 +vt 0.823123 0.327435 +vt 0.805060 0.366763 +vt 0.795591 0.338307 +vt 0.237000 0.353494 +vt 0.205465 0.342487 +vt 0.227594 0.386342 +vt 0.194700 0.373985 +vt 0.765794 0.378814 +vt 0.759863 0.357111 +vt 0.775794 0.348002 +vt 0.786680 0.375335 +vt 0.259768 0.363344 +vt 0.278152 0.372616 +vt 0.272994 0.397729 +vt 0.248944 0.395082 +vt 0.850564 0.446288 +vt 0.824956 0.403130 +vt 0.853581 0.388754 +vt 0.878585 0.426198 +vt 0.173003 0.414041 +vt 0.206543 0.429096 +vt 0.179247 0.480106 +vt 0.145840 0.458376 +vt 0.810696 0.448077 +vt 0.793215 0.444821 +vt 0.778079 0.421946 +vt 0.792645 0.414150 +vt 0.774374 0.441194 +vt 0.763136 0.431432 +vt 0.759370 0.416927 +vt 0.762942 0.399071 +vt 0.282710 0.441191 +vt 0.279198 0.458114 +vt 0.261445 0.448038 +vt 0.277577 0.420825 +vt 0.266810 0.469999 +vt 0.245312 0.475251 +vt 0.225352 0.480005 +vt 0.244234 0.439904 +vt 0.806457 0.409737 +vt 0.823720 0.439889 +vt 0.228110 0.435654 +vt 0.209866 0.471309 +vt 0.822553 0.462972 +vt 0.817852 0.456726 +vt 0.827067 0.454473 +vt 0.832672 0.459019 +vt 0.206812 0.488297 +vt 0.200587 0.493852 +vt 0.217577 0.490395 +vt 0.212488 0.497864 +vt 0.755291 0.275659 +vt 0.776439 0.267723 +vt 0.278652 0.282200 +vt 0.255635 0.274184 +vt 0.794820 0.235072 +vt 0.795082 0.261102 +vt 0.808235 0.230663 +vt 0.811209 0.254481 +vt 0.217549 0.260513 +vt 0.235224 0.267418 +vt 0.220518 0.234225 +vt 0.235095 0.238903 +vt 0.820950 0.229143 +vt 0.824810 0.246547 +vt 0.829426 0.216752 +vt 0.835759 0.236818 +vt 0.190262 0.241569 +vt 0.202740 0.252082 +vt 0.196370 0.218224 +vt 0.206983 0.233036 +vt 0.843931 0.224810 +vt 0.837701 0.211668 +vt 0.179580 0.228419 +vt 0.187927 0.209321 +vt 0.744359 0.103837 +vt 0.706047 0.109141 +vt 0.784963 0.102809 +vt 0.786447 0.122246 +vt 0.752059 0.127970 +vt 0.712371 0.140499 +vt 0.246597 0.119486 +vt 0.248893 0.099247 +vt 0.290608 0.101681 +vt 0.281936 0.126431 +vt 0.329760 0.108091 +vt 0.322678 0.140136 +vt 0.736714 0.167208 +vt 0.761916 0.150723 +vt 0.772211 0.168449 +vt 0.787690 0.140415 +vt 0.793290 0.155914 +vt 0.270931 0.149783 +vt 0.244699 0.138495 +vt 0.296879 0.167286 +vt 0.259495 0.167887 +vt 0.238258 0.154609 +vt 0.709243 0.185137 +vt 0.686430 0.166862 +vt 0.349277 0.167406 +vt 0.325495 0.186083 +vt 0.644947 0.163787 +vt 0.657890 0.151913 +vt 0.670045 0.134473 +vt 0.378600 0.152258 +vt 0.366202 0.134395 +vt 0.391891 0.164438 +vt 0.677327 0.115796 +vt 0.359020 0.115319 +vt 0.635300 0.165769 +vt 0.401750 0.166464 +vt 0.839869 0.175761 +vt 0.853235 0.168500 +vt 0.831517 0.160707 +vt 0.841417 0.150913 +vt 0.853765 0.137677 +vt 0.867144 0.161965 +vt 0.175775 0.132589 +vt 0.189019 0.148124 +vt 0.172572 0.166616 +vt 0.157745 0.158328 +vt 0.200311 0.159828 +vt 0.186705 0.175710 +vt 0.882140 0.156879 +vt 0.872766 0.134048 +vt 0.141530 0.151652 +vt 0.154964 0.127182 +vt 0.816880 0.141014 +vt 0.811434 0.154345 +vt 0.820522 0.126340 +vt 0.211373 0.122359 +vt 0.215227 0.138347 +vt 0.221296 0.153122 +vt 0.820556 0.108981 +vt 0.848088 0.116562 +vt 0.183019 0.110167 +vt 0.211947 0.103945 +vt 0.864510 0.119761 +vt 0.165361 0.112301 +vt 0.509276 0.900499 +vt 0.469277 0.899897 +vt 0.467102 0.887934 +vt 0.502009 0.889062 +vt 0.436530 0.892076 +vt 0.438605 0.880072 +vt 0.442570 0.867282 +vt 0.467297 0.874740 +vt 0.497540 0.875977 +vt 0.312156 0.865143 +vt 0.315792 0.878106 +vt 0.286936 0.885229 +vt 0.287103 0.871964 +vt 0.317551 0.890227 +vt 0.284422 0.897192 +vt 0.244201 0.896691 +vt 0.251822 0.885397 +vt 0.256678 0.872371 +vt 0.543710 0.881749 +vt 0.555496 0.892398 +vt 0.534426 0.869293 +vt 0.566292 0.853087 +vt 0.579330 0.863421 +vt 0.594385 0.872018 +vt 0.188235 0.847442 +vt 0.219796 0.864624 +vt 0.210113 0.876880 +vt 0.174834 0.857456 +vt 0.197968 0.887254 +vt 0.159455 0.865668 +vt 0.595994 0.831506 +vt 0.612393 0.835781 +vt 0.581472 0.825753 +vt 0.581825 0.795308 +vt 0.595536 0.796225 +vt 0.629011 0.798690 +vt 0.174295 0.788956 +vt 0.173769 0.819544 +vt 0.159006 0.824902 +vt 0.160488 0.789473 +vt 0.142396 0.828721 +vt 0.126829 0.790841 +vt 0.579793 0.767804 +vt 0.589729 0.763265 +vt 0.569205 0.769767 +vt 0.548861 0.748164 +vt 0.555739 0.744297 +vt 0.563952 0.739636 +vt 0.208752 0.742636 +vt 0.187712 0.763703 +vt 0.177137 0.761422 +vt 0.201967 0.738564 +vt 0.167303 0.756572 +vt 0.193875 0.733657 +vt 0.530349 0.723761 +vt 0.537882 0.718127 +vt 0.526039 0.729528 +vt 0.500239 0.712664 +vt 0.502360 0.705108 +vt 0.509441 0.697811 +vt 0.258441 0.708419 +vt 0.232145 0.724609 +vt 0.227988 0.718717 +vt 0.256518 0.700799 +vt 0.220609 0.712866 +vt 0.249633 0.693309 +vt 0.470507 0.687247 +vt 0.476553 0.677761 +vt 0.470964 0.696376 +vt 0.442627 0.684437 +vt 0.439691 0.671552 +vt 0.445649 0.657308 +vt 0.316870 0.681612 +vt 0.288185 0.692861 +vt 0.288873 0.683732 +vt 0.320103 0.668780 +vt 0.283075 0.674093 +vt 0.314481 0.654423 +vt 0.501210 0.721182 +vt 0.474394 0.705845 +vt 0.503339 0.729425 +vt 0.478400 0.714693 +vt 0.455602 0.705126 +vt 0.449084 0.695707 +vt 0.303354 0.702018 +vt 0.280263 0.711016 +vt 0.284505 0.702256 +vt 0.310125 0.692742 +vt 0.254889 0.725123 +vt 0.257242 0.716923 +vt 0.544487 0.752313 +vt 0.524464 0.736210 +vt 0.541615 0.756550 +vt 0.524268 0.742875 +vt 0.233553 0.738029 +vt 0.233538 0.731346 +vt 0.215780 0.751246 +vt 0.213020 0.746918 +vt 0.571714 0.792317 +vt 0.561605 0.770877 +vt 0.563856 0.789235 +vt 0.555810 0.771958 +vt 0.201098 0.766285 +vt 0.195311 0.765036 +vt 0.192523 0.783381 +vt 0.184541 0.786248 +vt 0.557285 0.839277 +vt 0.570708 0.817045 +vt 0.551540 0.826015 +vt 0.562758 0.808517 +vt 0.193070 0.802770 +vt 0.184837 0.811108 +vt 0.203833 0.820663 +vt 0.197682 0.833823 +vt 0.498666 0.859595 +vt 0.530144 0.853227 +vt 0.502835 0.844149 +vt 0.529227 0.837942 +vt 0.225907 0.833272 +vt 0.224553 0.848601 +vt 0.252242 0.840246 +vt 0.256002 0.855880 +vt 0.472229 0.859085 +vt 0.450313 0.852917 +vt 0.459439 0.839671 +vt 0.479382 0.844489 +vt 0.295958 0.836942 +vt 0.304767 0.850499 +vt 0.282577 0.856098 +vt 0.275792 0.841237 +vt 0.781229 0.177498 +vt 0.777540 0.192542 +vt 0.790753 0.164650 +vt 0.795475 0.174844 +vt 0.788561 0.181231 +vt 0.787311 0.191440 +vt 0.234275 0.173476 +vt 0.239797 0.163311 +vt 0.249526 0.176892 +vt 0.241448 0.180379 +vt 0.253192 0.192916 +vt 0.242627 0.191415 +vt 0.404884 0.613723 +vt 0.423162 0.635783 +vt 0.414812 0.659395 +vt 0.392902 0.649008 +vt 0.419641 0.680620 +vt 0.393037 0.679868 +vt 0.345258 0.657206 +vt 0.339989 0.678347 +vt 0.337396 0.633508 +vt 0.356067 0.611970 +vt 0.367375 0.647321 +vt 0.366668 0.678229 +vt 0.785521 0.211976 +vt 0.795291 0.208892 +vt 0.244733 0.213828 +vt 0.234116 0.210430 +vt 0.398059 0.863623 +vt 0.396676 0.851779 +vt 0.416134 0.867182 +vt 0.412068 0.878520 +vt 0.398254 0.838285 +vt 0.422232 0.855297 +vt 0.332920 0.853649 +vt 0.338727 0.865760 +vt 0.357475 0.837195 +vt 0.358701 0.850802 +vt 0.356991 0.862671 +vt 0.342507 0.877267 +vt 0.430345 0.696278 +vt 0.441095 0.707171 +vt 0.433108 0.714624 +vt 0.418039 0.702943 +vt 0.325667 0.712108 +vt 0.317846 0.704438 +vt 0.328898 0.693778 +vt 0.341075 0.700759 +vt 0.428970 0.728065 +vt 0.411160 0.720916 +vt 0.412028 0.711091 +vt 0.429871 0.721278 +vt 0.385921 0.717918 +vt 0.389712 0.698212 +vt 0.369619 0.696707 +vt 0.346905 0.709081 +vt 0.372938 0.716591 +vt 0.347534 0.718963 +vt 0.329482 0.725693 +vt 0.328747 0.718861 +vt 0.412713 0.748810 +vt 0.402384 0.737539 +vt 0.414283 0.732612 +vt 0.419552 0.742929 +vt 0.427993 0.735917 +vt 0.426851 0.741709 +vt 0.344106 0.730624 +vt 0.330264 0.733596 +vt 0.355924 0.735873 +vt 0.345272 0.746925 +vt 0.338558 0.740847 +vt 0.331263 0.739437 +vt 0.416980 0.784528 +vt 0.402816 0.787448 +vt 0.399599 0.759583 +vt 0.412712 0.764696 +vt 0.386776 0.790537 +vt 0.384658 0.752861 +vt 0.373335 0.751720 +vt 0.358163 0.758083 +vt 0.370256 0.789512 +vt 0.354223 0.785988 +vt 0.340072 0.782683 +vt 0.344867 0.762877 +vt 0.393131 0.818442 +vt 0.408920 0.809841 +vt 0.418563 0.827788 +vt 0.422947 0.802247 +vt 0.431514 0.817618 +vt 0.347510 0.808325 +vt 0.333617 0.800325 +vt 0.363148 0.817384 +vt 0.337347 0.826103 +vt 0.324605 0.815540 +vt 0.432392 0.842316 +vt 0.443580 0.830404 +vt 0.323061 0.840331 +vt 0.312141 0.828061 +vt 0.812198 0.213951 +vt 0.820073 0.216574 +vt 0.815612 0.201611 +vt 0.820686 0.206424 +vt 0.824524 0.210153 +vt 0.827197 0.214662 +vt 0.200937 0.214698 +vt 0.204798 0.210494 +vt 0.206958 0.220210 +vt 0.199417 0.218645 +vt 0.210653 0.204360 +vt 0.215391 0.216797 +vt 0.802821 0.202258 +vt 0.795502 0.189331 +vt 0.803180 0.185964 +vt 0.809229 0.193848 +vt 0.225295 0.185037 +vt 0.233684 0.188879 +vt 0.225609 0.203428 +vt 0.218157 0.194624 +vt 0.793802 0.183009 +vt 0.799106 0.180789 +vt 0.230055 0.179353 +vt 0.235688 0.181927 +vt 0.452764 0.821724 +vt 0.467554 0.830235 +vt 0.441512 0.810137 +vt 0.451051 0.802964 +vt 0.461899 0.813742 +vt 0.475726 0.821844 +vt 0.305373 0.800299 +vt 0.314760 0.807757 +vt 0.303149 0.819093 +vt 0.294190 0.810831 +vt 0.288063 0.827242 +vt 0.280085 0.818591 +vt 0.433448 0.796668 +vt 0.427392 0.781944 +vt 0.436210 0.778061 +vt 0.442865 0.790824 +vt 0.320932 0.775685 +vt 0.329683 0.779815 +vt 0.323216 0.794443 +vt 0.313915 0.788326 +vt 0.422167 0.766592 +vt 0.420500 0.754265 +vt 0.426815 0.757343 +vt 0.429958 0.765413 +vt 0.330900 0.755130 +vt 0.337317 0.752202 +vt 0.335326 0.764535 +vt 0.327537 0.763150 +vt 0.425119 0.748614 +vt 0.431772 0.744946 +vt 0.437934 0.749084 +vt 0.431216 0.753471 +vt 0.319953 0.746555 +vt 0.326243 0.742561 +vt 0.332826 0.746412 +vt 0.326582 0.751130 +vt 0.436206 0.738566 +vt 0.438509 0.731576 +vt 0.445433 0.734403 +vt 0.442947 0.742075 +vt 0.312804 0.731633 +vt 0.319822 0.728975 +vt 0.321956 0.736046 +vt 0.315103 0.739394 +vt 0.438769 0.726080 +vt 0.440211 0.720712 +vt 0.444070 0.722997 +vt 0.444570 0.728023 +vt 0.314462 0.720230 +vt 0.318390 0.718037 +vt 0.319700 0.723457 +vt 0.313832 0.725256 +vt 0.446061 0.714104 +vt 0.458719 0.712454 +vt 0.461005 0.720964 +vt 0.448865 0.720462 +vt 0.297533 0.717756 +vt 0.300043 0.709284 +vt 0.312691 0.711265 +vt 0.309718 0.717567 +vt 0.486234 0.834477 +vt 0.507497 0.833869 +vt 0.492848 0.825954 +vt 0.511534 0.825802 +vt 0.269185 0.830990 +vt 0.262777 0.822248 +vt 0.247846 0.829790 +vt 0.244016 0.821576 +vt 0.530038 0.827833 +vt 0.548289 0.817326 +vt 0.530052 0.821112 +vt 0.543283 0.811964 +vt 0.225378 0.823096 +vt 0.225553 0.816345 +vt 0.207347 0.812028 +vt 0.212526 0.806786 +vt 0.556681 0.803304 +vt 0.556901 0.788047 +vt 0.548593 0.800602 +vt 0.547784 0.788523 +vt 0.199322 0.797709 +vt 0.207519 0.795227 +vt 0.199540 0.782389 +vt 0.208678 0.783127 +vt 0.550636 0.773835 +vt 0.539246 0.760680 +vt 0.542657 0.777226 +vt 0.533477 0.766384 +vt 0.206237 0.768316 +vt 0.214148 0.771943 +vt 0.218040 0.755453 +vt 0.223666 0.761335 +vt 0.524091 0.748593 +vt 0.504695 0.736157 +vt 0.520508 0.755673 +vt 0.503273 0.744104 +vt 0.233573 0.743764 +vt 0.236970 0.750961 +vt 0.253350 0.731832 +vt 0.254563 0.739837 +vt 0.480584 0.721958 +vt 0.481289 0.730690 +vt 0.277885 0.718239 +vt 0.276949 0.726974 +vt 0.452240 0.747962 +vt 0.445761 0.755176 +vt 0.455400 0.739499 +vt 0.466859 0.747047 +vt 0.462582 0.756036 +vt 0.454669 0.763299 +vt 0.290987 0.743759 +vt 0.302676 0.736487 +vt 0.305629 0.745059 +vt 0.295043 0.752888 +vt 0.311943 0.752465 +vt 0.302793 0.760384 +vt 0.472472 0.766110 +vt 0.464072 0.773530 +vt 0.478260 0.757229 +vt 0.488959 0.768081 +vt 0.481838 0.776645 +vt 0.473719 0.784314 +vt 0.268265 0.764268 +vt 0.279285 0.753671 +vt 0.284855 0.762733 +vt 0.275177 0.773052 +vt 0.293086 0.770402 +vt 0.283117 0.780967 +vt 0.490606 0.786100 +vt 0.483357 0.794099 +vt 0.498311 0.777638 +vt 0.506764 0.785137 +vt 0.499283 0.793344 +vt 0.493518 0.801648 +vt 0.249939 0.780890 +vt 0.258625 0.773601 +vt 0.266123 0.782302 +vt 0.257217 0.789333 +vt 0.273180 0.790528 +vt 0.262775 0.797826 +vt 0.508378 0.797243 +vt 0.504736 0.805721 +vt 0.514765 0.789813 +vt 0.522193 0.793010 +vt 0.519588 0.798948 +vt 0.517494 0.807630 +vt 0.234236 0.788355 +vt 0.241781 0.785358 +vt 0.247981 0.792993 +vt 0.236682 0.794389 +vt 0.251401 0.801603 +vt 0.238540 0.803163 +vt 0.499287 0.815830 +vt 0.513829 0.816992 +vt 0.485023 0.811731 +vt 0.271027 0.808182 +vt 0.256591 0.811904 +vt 0.241957 0.812666 +vt 0.462622 0.793722 +vt 0.472942 0.803924 +vt 0.283368 0.800673 +vt 0.294004 0.790710 +vt 0.453638 0.782440 +vt 0.445590 0.771244 +vt 0.311696 0.768596 +vt 0.303323 0.779623 +vt 0.438078 0.761300 +vt 0.319494 0.758811 +vt 0.453126 0.729630 +vt 0.465025 0.733926 +vt 0.293165 0.730648 +vt 0.305209 0.726649 +vt 0.497066 0.755990 +vt 0.480857 0.743935 +vt 0.277032 0.740268 +vt 0.260464 0.751923 +vt 0.520406 0.775343 +vt 0.510097 0.766425 +vt 0.247114 0.762030 +vt 0.236527 0.770686 +vt 0.533439 0.790435 +vt 0.528445 0.782846 +vt 0.228249 0.777983 +vt 0.223021 0.785453 +vt 0.532275 0.808688 +vt 0.534611 0.799609 +vt 0.221583 0.794627 +vt 0.223671 0.803807 +vt 0.526743 0.815988 +vt 0.229019 0.811294 +vt 0.492632 0.667222 +vt 0.523352 0.690074 +vt 0.465874 0.641962 +vt 0.507960 0.626656 +vt 0.528528 0.655847 +vt 0.553068 0.682536 +vt 0.253280 0.623071 +vt 0.294662 0.638716 +vt 0.267297 0.663165 +vt 0.231929 0.651281 +vt 0.235945 0.685198 +vt 0.206572 0.677006 +vt 0.549123 0.711844 +vt 0.572334 0.733105 +vt 0.572286 0.706958 +vt 0.588280 0.728364 +vt 0.209549 0.706259 +vt 0.186581 0.700741 +vt 0.185684 0.726865 +vt 0.169886 0.721631 +vt 0.595375 0.754431 +vt 0.620810 0.767292 +vt 0.603149 0.746004 +vt 0.619756 0.755543 +vt 0.161926 0.747534 +vt 0.154420 0.738822 +vt 0.136030 0.759585 +vt 0.137477 0.747836 +vt 0.701303 0.750377 +vt 0.663727 0.775750 +vt 0.651200 0.763158 +vt 0.679266 0.742526 +vt 0.637004 0.751745 +vt 0.653228 0.735238 +vt 0.105751 0.754337 +vt 0.120342 0.743429 +vt 0.092794 0.766459 +vt 0.056578 0.739598 +vt 0.078675 0.732719 +vt 0.104797 0.726450 +vt 0.740175 0.655614 +vt 0.726501 0.705992 +vt 0.697726 0.705897 +vt 0.707312 0.662584 +vt 0.662804 0.705755 +vt 0.665943 0.669383 +vt 0.062384 0.695666 +vt 0.096615 0.696979 +vt 0.034467 0.694286 +vt 0.024955 0.643965 +vt 0.055680 0.652866 +vt 0.095280 0.661418 +vt 0.732746 0.584916 +vt 0.743177 0.612264 +vt 0.708753 0.621905 +vt 0.706123 0.582542 +vt 0.662860 0.632212 +vt 0.673710 0.586755 +vt 0.057364 0.614013 +vt 0.100277 0.626171 +vt 0.026537 0.602076 +vt 0.034076 0.568603 +vt 0.066133 0.582039 +vt 0.111371 0.595474 +vt 0.607563 0.675836 +vt 0.594028 0.643852 +vt 0.579497 0.612535 +vt 0.167361 0.638772 +vt 0.182968 0.608904 +vt 0.152631 0.669272 +vt 0.615585 0.705518 +vt 0.619188 0.729077 +vt 0.138972 0.721397 +vt 0.143475 0.698159 +vt 0.619467 0.742688 +vt 0.138198 0.734952 +vt 0.835231 0.207140 +vt 0.838530 0.201059 +vt 0.831932 0.213221 +vt 0.833932 0.208474 +vt 0.834641 0.206919 +vt 0.835645 0.205474 +vt 0.042440 0.543531 +vt 0.080685 0.559880 +vt 0.060750 0.532869 +vt 0.098128 0.542627 +vt 0.148210 0.556046 +vt 0.128325 0.573563 +vt 0.611499 0.567378 +vt 0.645911 0.579166 +vt 0.568491 0.584855 +vt 0.559246 0.558995 +vt 0.500657 0.594728 +vt 0.499986 0.561432 +vt 0.194754 0.581916 +vt 0.261251 0.591882 +vt 0.204630 0.556368 +vt 0.262533 0.559204 +vt 0.444556 0.582103 +vt 0.451996 0.612966 +vt 0.309096 0.610407 +vt 0.317066 0.580168 +vn 0.7273 -0.1123 0.6770 +vn 0.6470 -0.3278 0.6885 +vn 0.6658 -0.3430 0.6626 +vn 0.7475 -0.1217 0.6530 +vn -0.6658 -0.3430 0.6626 +vn -0.6470 -0.3278 0.6885 +vn -0.7273 -0.1123 0.6770 +vn -0.7475 -0.1217 0.6530 +vn 0.8357 -0.1487 0.5287 +vn 0.7404 -0.4154 0.5284 +vn 0.7666 -0.4493 0.4586 +vn 0.8709 -0.1601 0.4646 +vn -0.7666 -0.4493 0.4586 +vn -0.7404 -0.4154 0.5284 +vn -0.8357 -0.1487 0.5287 +vn -0.8709 -0.1601 0.4646 +vn 0.5368 -0.6566 0.5298 +vn 0.2687 -0.7999 0.5366 +vn 0.2578 -0.8623 0.4359 +vn 0.5454 -0.7103 0.4450 +vn -0.2578 -0.8623 0.4359 +vn -0.2687 -0.7999 0.5366 +vn -0.5368 -0.6566 0.5298 +vn -0.5454 -0.7103 0.4450 +vn 0.4685 -0.5130 0.7193 +vn 0.2654 -0.6038 0.7516 +vn 0.2708 -0.6392 0.7198 +vn 0.4893 -0.5353 0.6885 +vn -0.2708 -0.6392 0.7198 +vn -0.2654 -0.6038 0.7516 +vn -0.4685 -0.5130 0.7193 +vn -0.4893 -0.5353 0.6885 +vn 0.0158 -0.6277 0.7783 +vn -0.2383 -0.5553 0.7968 +vn -0.2682 -0.5807 0.7687 +vn -0.0056 -0.6633 0.7483 +vn 0.2682 -0.5807 0.7687 +vn 0.2384 -0.5553 0.7968 +vn -0.0158 -0.6277 0.7783 +vn 0.0056 -0.6633 0.7483 +vn -0.0755 -0.8283 0.5551 +vn -0.3820 -0.7169 0.5832 +vn -0.4211 -0.7697 0.4799 +vn -0.1034 -0.8883 0.4476 +vn 0.4211 -0.7697 0.4799 +vn 0.3820 -0.7169 0.5832 +vn 0.0755 -0.8283 0.5551 +vn 0.1034 -0.8883 0.4476 +vn -0.6383 -0.4619 0.6159 +vn -0.7558 -0.1624 0.6343 +vn -0.8211 -0.1789 0.5420 +vn -0.6910 -0.5023 0.5198 +vn 0.8211 -0.1789 0.5420 +vn 0.7558 -0.1624 0.6343 +vn 0.6383 -0.4619 0.6159 +vn 0.6910 -0.5023 0.5198 +vn -0.4701 -0.3509 0.8099 +vn -0.5701 -0.1161 0.8133 +vn -0.5928 -0.1243 0.7957 +vn -0.4956 -0.3679 0.7868 +vn 0.5928 -0.1243 0.7957 +vn 0.5701 -0.1161 0.8133 +vn 0.4701 -0.3509 0.8099 +vn 0.4956 -0.3679 0.7868 +vn -0.5732 0.1137 0.8115 +vn -0.4898 0.3470 0.7998 +vn -0.5053 0.3667 0.7811 +vn -0.5944 0.1232 0.7946 +vn 0.5053 0.3667 0.7811 +vn 0.4898 0.3470 0.7998 +vn 0.5732 0.1137 0.8115 +vn 0.5944 0.1232 0.7946 +vn -0.7547 0.1607 0.6361 +vn -0.6355 0.4531 0.6252 +vn -0.6861 0.4865 0.5409 +vn -0.8191 0.1757 0.5462 +vn 0.6861 0.4865 0.5409 +vn 0.6355 0.4531 0.6252 +vn 0.7547 0.1607 0.6361 +vn 0.8191 0.1757 0.5462 +vn -0.3748 0.7043 0.6028 +vn -0.0681 0.8125 0.5789 +vn -0.0889 0.8613 0.5002 +vn -0.4079 0.7482 0.5233 +vn 0.0889 0.8613 0.5002 +vn 0.0681 0.8125 0.5789 +vn 0.3748 0.7043 0.6028 +vn 0.4079 0.7482 0.5233 +vn -0.2643 0.5756 0.7738 +vn 0.0034 0.6622 0.7493 +vn -0.0121 0.6811 0.7321 +vn -0.2810 0.5914 0.7559 +vn 0.0121 0.6811 0.7321 +vn -0.0034 0.6622 0.7493 +vn 0.2643 0.5756 0.7738 +vn 0.2810 0.5914 0.7559 +vn 0.2665 0.6372 0.7231 +vn 0.4834 0.5317 0.6955 +vn 0.4964 0.5449 0.6758 +vn 0.2712 0.6563 0.7041 +vn -0.4964 0.5449 0.6758 +vn -0.4834 0.5317 0.6955 +vn -0.2665 0.6372 0.7231 +vn -0.2712 0.6563 0.7041 +vn 0.2698 0.7839 0.5592 +vn 0.5355 0.6437 0.5467 +vn 0.5442 0.6864 0.4824 +vn 0.2616 0.8339 0.4859 +vn -0.5442 0.6864 0.4824 +vn -0.5355 0.6437 0.5467 +vn -0.2698 0.7839 0.5592 +vn -0.2616 0.8339 0.4859 +vn 0.7396 0.4071 0.5360 +vn 0.8350 0.1471 0.5302 +vn 0.8697 0.1571 0.4679 +vn 0.7654 0.4336 0.4755 +vn -0.8697 0.1571 0.4679 +vn -0.8350 0.1471 0.5302 +vn -0.7396 0.4071 0.5360 +vn -0.7654 0.4336 0.4755 +vn 0.6612 0.3238 0.6768 +vn 0.7296 0.1099 0.6750 +vn 0.7487 0.1206 0.6518 +vn 0.6727 0.3417 0.6563 +vn -0.7487 0.1206 0.6518 +vn -0.7296 0.1099 0.6750 +vn -0.6612 0.3238 0.6768 +vn -0.6727 0.3417 0.6563 +vn 0.8979 0.1457 0.4155 +vn 0.8088 0.4421 0.3878 +vn 0.7208 0.3667 0.5882 +vn 0.7994 0.0976 0.5928 +vn -0.7208 0.3667 0.5882 +vn -0.8088 0.4421 0.3878 +vn -0.8979 0.1457 0.4155 +vn -0.7994 0.0976 0.5928 +vn 0.5572 0.7508 0.3547 +vn 0.2459 0.9127 0.3264 +vn 0.2579 0.8107 0.5255 +vn 0.5565 0.6116 0.5624 +vn -0.2579 0.8107 0.5255 +vn -0.2459 0.9127 0.3264 +vn -0.5572 0.7508 0.3547 +vn -0.5565 0.6116 0.5624 +vn -0.1284 0.9357 0.3286 +vn -0.4835 0.7944 0.3676 +vn -0.4298 0.7033 0.5662 +vn -0.0514 0.8484 0.5268 +vn 0.4298 0.7033 0.5662 +vn 0.4835 0.7944 0.3676 +vn 0.1284 0.9357 0.3286 +vn 0.0514 0.8484 0.5268 +vn -0.7740 0.4956 0.3941 +vn -0.9044 0.1782 0.3877 +vn -0.8385 0.1470 0.5247 +vn -0.6747 0.4757 0.5644 +vn 0.8385 0.1470 0.5247 +vn 0.9044 0.1782 0.3877 +vn 0.7740 0.4956 0.3941 +vn 0.6747 0.4757 0.5644 +vn -0.9014 -0.1851 0.3913 +vn -0.7496 -0.5180 0.4121 +vn -0.6662 -0.5074 0.5465 +vn -0.8390 -0.1538 0.5220 +vn 0.6662 -0.5074 0.5465 +vn 0.7496 -0.5180 0.4121 +vn 0.9014 -0.1851 0.3913 +vn 0.8390 -0.1538 0.5220 +vn -0.4559 -0.7923 0.4054 +vn -0.1155 -0.9190 0.3771 +vn -0.0661 -0.8733 0.4827 +vn -0.4326 -0.7287 0.5310 +vn 0.0661 -0.8733 0.4827 +vn 0.1155 -0.9190 0.3771 +vn 0.4559 -0.7923 0.4054 +vn 0.4326 -0.7287 0.5310 +vn 0.2516 -0.8928 0.3737 +vn 0.5426 -0.7431 0.3916 +vn 0.5520 -0.6403 0.5341 +vn 0.2546 -0.8374 0.4836 +vn -0.5520 -0.6403 0.5341 +vn -0.5426 -0.7431 0.3916 +vn -0.2516 -0.8928 0.3737 +vn -0.2546 -0.8374 0.4836 +vn 0.7901 -0.4607 0.4043 +vn 0.8956 -0.1513 0.4183 +vn 0.7999 -0.1022 0.5914 +vn 0.7153 -0.3948 0.5766 +vn -0.7999 -0.1022 0.5914 +vn -0.8956 -0.1513 0.4183 +vn -0.7901 -0.4607 0.4043 +vn -0.7153 -0.3948 0.5766 +vn 0.3463 -0.0436 0.9371 +vn 0.4246 -0.1483 0.8932 +vn 0.4653 -0.0290 0.8847 +vn -0.4653 -0.0290 0.8847 +vn -0.4246 -0.1483 0.8932 +vn -0.3463 -0.0436 0.9371 +vn 0.2531 -0.2854 0.9244 +vn 0.3781 -0.2127 0.9010 +vn 0.2775 -0.1178 0.9535 +vn -0.2775 -0.1178 0.9535 +vn -0.3781 -0.2127 0.9010 +vn -0.2531 -0.2854 0.9244 +vn 0.1272 -0.1176 0.9849 +vn -0.0284 -0.2304 0.9727 +vn 0.1457 -0.2960 0.9440 +vn -0.1457 -0.2960 0.9440 +vn 0.0284 -0.2304 0.9727 +vn -0.1272 -0.1176 0.9849 +vn 0.0156 -0.0210 0.9997 +vn -0.1662 -0.0169 0.9859 +vn -0.1075 -0.1515 0.9826 +vn 0.1075 -0.1515 0.9826 +vn 0.1662 -0.0169 0.9859 +vn -0.0156 -0.0210 0.9997 +vn 0.0156 0.0200 0.9997 +vn -0.1069 0.1401 0.9843 +vn -0.1659 0.0162 0.9860 +vn 0.1659 0.0162 0.9860 +vn 0.1069 0.1401 0.9843 +vn -0.0156 0.0200 0.9997 +vn 0.1282 0.1118 0.9854 +vn 0.1503 0.2778 0.9488 +vn -0.0240 0.2162 0.9761 +vn 0.0240 0.2162 0.9761 +vn -0.1503 0.2778 0.9488 +vn -0.1282 0.1118 0.9854 +vn 0.2768 0.1120 0.9544 +vn 0.3758 0.1997 0.9049 +vn 0.2510 0.2681 0.9301 +vn -0.2510 0.2681 0.9301 +vn -0.3758 0.1997 0.9049 +vn -0.2768 0.1120 0.9544 +vn 0.3465 0.0413 0.9372 +vn 0.4650 0.0277 0.8849 +vn 0.4247 0.1372 0.8949 +vn -0.4247 0.1372 0.8949 +vn -0.4650 0.0277 0.8849 +vn -0.3465 0.0413 0.9372 +vn 0.1386 -0.9493 0.2823 +vn 0.1343 -0.8291 0.5428 +vn 0.0586 -0.8311 0.5530 +vn 0.0617 -0.9498 0.3066 +vn -0.0586 -0.8311 0.5530 +vn -0.1343 -0.8291 0.5428 +vn -0.1386 -0.9493 0.2823 +vn -0.0617 -0.9498 0.3066 +vn 0.3460 -0.8864 0.3076 +vn 0.3308 -0.7099 0.6218 +vn 0.1854 -0.8199 0.5416 +vn 0.1804 -0.9479 0.2627 +vn -0.1854 -0.8199 0.5416 +vn -0.3308 -0.7099 0.6218 +vn -0.3460 -0.8864 0.3076 +vn -0.1804 -0.9479 0.2627 +vn 0.8726 -0.2473 0.4212 +vn 0.5837 -0.3099 0.7505 +vn 0.4816 -0.5002 0.7196 +vn 0.6655 -0.6181 0.4184 +vn -0.4816 -0.5002 0.7196 +vn -0.5837 -0.3099 0.7505 +vn -0.8726 -0.2473 0.4212 +vn -0.6655 -0.6181 0.4184 +vn 0.9246 0.0556 0.3769 +vn 0.6879 -0.0206 0.7255 +vn 0.6616 -0.1407 0.7365 +vn 0.9240 -0.0404 0.3803 +vn -0.6616 -0.1407 0.7365 +vn -0.6879 -0.0206 0.7255 +vn -0.9246 0.0556 0.3769 +vn -0.9240 -0.0404 0.3803 +vn 0.9095 0.1563 0.3852 +vn 0.7133 0.0892 0.6952 +vn 0.6931 0.0419 0.7196 +vn 0.9166 0.1049 0.3859 +vn -0.6931 0.0419 0.7196 +vn -0.7133 0.0892 0.6952 +vn -0.9095 0.1563 0.3852 +vn -0.9166 0.1049 0.3859 +vn 0.3722 -0.8474 0.3788 +vn 0.3239 -0.8441 0.4273 +vn 0.3732 -0.6960 0.6134 +vn 0.4153 -0.6949 0.5870 +vn -0.3732 -0.6960 0.6134 +vn -0.3239 -0.8441 0.4273 +vn -0.3722 -0.8474 0.3788 +vn -0.4153 -0.6949 0.5870 +vn 0.3888 -0.7907 0.4728 +vn 0.5118 -0.7186 0.4709 +vn 0.4603 -0.5651 0.6847 +vn 0.3919 -0.6473 0.6538 +vn -0.4603 -0.5651 0.6847 +vn -0.5118 -0.7186 0.4709 +vn -0.3888 -0.7907 0.4728 +vn -0.3919 -0.6473 0.6538 +vn 0.6692 -0.6010 0.4370 +vn 0.7616 -0.4716 0.4444 +vn 0.6577 -0.3656 0.6586 +vn 0.5934 -0.4448 0.6708 +vn -0.6577 -0.3656 0.6586 +vn -0.7616 -0.4716 0.4444 +vn -0.6692 -0.6010 0.4370 +vn -0.5934 -0.4448 0.6708 +vn 0.7994 -0.3620 0.4796 +vn 0.8281 -0.2154 0.5176 +vn 0.5973 -0.3152 0.7375 +vn 0.6416 -0.3429 0.6861 +vn -0.5973 -0.3152 0.7375 +vn -0.8281 -0.2154 0.5176 +vn -0.7994 -0.3620 0.4796 +vn -0.6416 -0.3429 0.6861 +vn 0.7792 0.3032 0.5486 +vn 0.4971 0.7392 0.4544 +vn 0.5156 0.2235 0.8271 +vn 0.5907 -0.1699 0.7888 +vn -0.5156 0.2235 0.8271 +vn -0.4971 0.7392 0.4544 +vn -0.7792 0.3032 0.5486 +vn -0.5907 -0.1699 0.7888 +vn 0.5118 0.7686 0.3839 +vn 0.5510 0.7439 0.3782 +vn 0.4628 0.4217 0.7798 +vn 0.4688 0.4069 0.7840 +vn -0.4628 0.4217 0.7798 +vn -0.5510 0.7439 0.3782 +vn -0.5118 0.7686 0.3839 +vn -0.4688 0.4069 0.7840 +vn 0.6225 0.6683 0.4072 +vn 0.5438 0.7126 0.4432 +vn 0.4234 0.3740 0.8251 +vn 0.4880 0.3713 0.7900 +vn -0.4234 0.3740 0.8251 +vn -0.5438 0.7126 0.4432 +vn -0.6225 0.6683 0.4072 +vn -0.4880 0.3713 0.7900 +vn 0.1427 0.8502 0.5068 +vn -0.3976 0.7662 0.5048 +vn -0.1175 0.3644 0.9238 +vn 0.1878 0.4009 0.8967 +vn 0.1175 0.3644 0.9238 +vn 0.3976 0.7662 0.5048 +vn -0.1427 0.8502 0.5068 +vn -0.1878 0.4009 0.8967 +vn -0.7677 0.4928 0.4097 +vn -0.8422 0.4179 0.3407 +vn -0.5150 0.2551 0.8184 +vn -0.3953 0.2739 0.8768 +vn 0.5150 0.2551 0.8184 +vn 0.8422 0.4179 0.3407 +vn 0.7677 0.4928 0.4097 +vn 0.3953 0.2739 0.8768 +vn -0.7543 0.5615 0.3403 +vn -0.3883 0.8222 0.4162 +vn -0.3145 0.4157 0.8534 +vn -0.5073 0.3177 0.8011 +vn 0.3145 0.4157 0.8534 +vn 0.3883 0.8222 0.4162 +vn 0.7543 0.5615 0.3403 +vn 0.5073 0.3177 0.8011 +vn 0.4513 -0.3587 0.8171 +vn 0.4014 -0.3659 0.8397 +vn 0.3053 -0.2281 0.9245 +vn 0.2972 -0.2387 0.9245 +vn -0.3053 -0.2281 0.9245 +vn -0.4014 -0.3659 0.8397 +vn -0.4513 -0.3587 0.8171 +vn -0.2972 -0.2387 0.9245 +vn 0.2871 -0.3945 0.8729 +vn 0.1555 -0.4262 0.8911 +vn 0.1692 -0.2712 0.9475 +vn 0.2389 -0.2508 0.9381 +vn -0.1692 -0.2712 0.9475 +vn -0.1555 -0.4262 0.8911 +vn -0.2871 -0.3945 0.8729 +vn -0.2389 -0.2508 0.9381 +vn 0.0208 -0.4510 0.8923 +vn 0.0869 -0.3102 0.9467 +vn 0.1083 -0.2879 0.9515 +vn 0.0379 -0.4411 0.8967 +vn -0.1083 -0.2879 0.9515 +vn -0.0869 -0.3102 0.9467 +vn -0.0208 -0.4510 0.8923 +vn -0.0379 -0.4411 0.8967 +vn -0.0053 -0.5709 0.8210 +vn 0.0941 -0.4058 0.9091 +vn 0.0853 -0.3560 0.9306 +vn 0.0342 -0.5096 0.8597 +vn -0.0853 -0.3560 0.9306 +vn -0.0941 -0.4058 0.9091 +vn 0.0053 -0.5709 0.8210 +vn -0.0342 -0.5096 0.8597 +vn 0.0967 -0.3017 0.9485 +vn 0.2907 -0.4003 0.8691 +vn 0.1877 -0.4405 0.8779 +vn 0.0029 -0.4905 0.8714 +vn -0.1877 -0.4405 0.8779 +vn -0.2907 -0.4003 0.8691 +vn -0.0967 -0.3017 0.9485 +vn -0.0029 -0.4905 0.8714 +vn 0.3645 -0.1702 0.9155 +vn 0.4821 -0.2710 0.8332 +vn 0.3780 -0.2958 0.8773 +vn 0.2342 -0.1821 0.9550 +vn -0.3780 -0.2958 0.8773 +vn -0.4821 -0.2710 0.8332 +vn -0.3645 -0.1702 0.9155 +vn -0.2342 -0.1821 0.9550 +vn 0.4084 -0.2560 0.8761 +vn 0.4697 -0.3069 0.8278 +vn 0.5088 -0.2748 0.8159 +vn 0.4167 -0.2150 0.8832 +vn -0.5088 -0.2748 0.8159 +vn -0.4697 -0.3069 0.8278 +vn -0.4084 -0.2560 0.8761 +vn -0.4167 -0.2150 0.8832 +vn 0.3237 -0.3313 0.8863 +vn 0.3712 -0.4418 0.8167 +vn 0.4106 -0.4069 0.8160 +vn 0.3841 -0.3255 0.8640 +vn -0.4106 -0.4069 0.8160 +vn -0.3712 -0.4418 0.8167 +vn -0.3237 -0.3313 0.8863 +vn -0.3841 -0.3255 0.8640 +vn 0.2773 0.0217 0.9605 +vn 0.3758 -0.1066 0.9205 +vn 0.3752 -0.3377 0.8632 +vn 0.3038 -0.1254 0.9444 +vn -0.3752 -0.3377 0.8632 +vn -0.3758 -0.1066 0.9205 +vn -0.2773 0.0217 0.9605 +vn -0.3038 -0.1254 0.9444 +vn 0.0730 0.0954 0.9928 +vn -0.0891 0.0895 0.9920 +vn -0.1548 0.1570 0.9754 +vn -0.0195 0.1299 0.9913 +vn 0.1548 0.1570 0.9754 +vn 0.0891 0.0895 0.9920 +vn -0.0730 0.0954 0.9928 +vn 0.0195 0.1299 0.9913 +vn 0.4037 -0.3369 0.8506 +vn 0.2042 -0.2888 0.9354 +vn 0.1507 -0.2779 0.9487 +vn 0.3030 -0.2626 0.9161 +vn -0.1507 -0.2779 0.9487 +vn -0.2042 -0.2888 0.9354 +vn -0.4037 -0.3369 0.8506 +vn -0.3030 -0.2626 0.9161 +vn 0.1957 -0.1996 0.9601 +vn 0.1170 -0.2806 0.9527 +vn 0.0657 -0.2660 0.9617 +vn 0.0804 -0.1875 0.9790 +vn -0.0657 -0.2660 0.9617 +vn -0.1170 -0.2806 0.9527 +vn -0.1957 -0.1996 0.9601 +vn -0.0804 -0.1875 0.9790 +vn -0.0210 -0.0864 0.9960 +vn -0.0535 -0.0981 0.9937 +vn -0.0077 -0.1827 0.9831 +vn 0.0243 -0.2264 0.9737 +vn 0.0077 -0.1827 0.9831 +vn 0.0535 -0.0981 0.9937 +vn 0.0210 -0.0864 0.9960 +vn -0.0243 -0.2264 0.9737 +vn 0.0882 -0.6473 0.7571 +vn 0.0268 -0.6653 0.7461 +vn 0.0468 -0.7500 0.6598 +vn 0.1148 -0.7353 0.6679 +vn -0.0468 -0.7500 0.6598 +vn -0.0268 -0.6653 0.7461 +vn -0.0882 -0.6473 0.7571 +vn -0.1148 -0.7353 0.6679 +vn 0.2442 -0.4371 0.8656 +vn 0.1519 -0.5765 0.8028 +vn 0.1717 -0.6888 0.7044 +vn 0.2892 -0.5401 0.7904 +vn -0.1717 -0.6888 0.7044 +vn -0.1519 -0.5765 0.8028 +vn -0.2442 -0.4371 0.8656 +vn -0.2892 -0.5401 0.7904 +vn 0.3063 -0.1983 0.9311 +vn 0.3152 -0.2848 0.9053 +vn 0.3730 -0.3737 0.8493 +vn 0.3970 -0.2731 0.8762 +vn -0.3730 -0.3737 0.8493 +vn -0.3152 -0.2848 0.9053 +vn -0.3063 -0.1983 0.9311 +vn -0.3970 -0.2731 0.8762 +vn 0.4643 0.0168 0.8855 +vn 0.2465 -0.0215 0.9689 +vn 0.2582 -0.0387 0.9653 +vn 0.4618 -0.0107 0.8869 +vn -0.2582 -0.0387 0.9653 +vn -0.2465 -0.0215 0.9689 +vn -0.4643 0.0168 0.8855 +vn -0.4618 -0.0107 0.8869 +vn 0.2860 -0.1432 0.9475 +vn 0.4332 -0.1748 0.8842 +vn 0.4652 -0.0608 0.8831 +vn 0.2759 -0.0656 0.9589 +vn -0.4652 -0.0608 0.8831 +vn -0.4332 -0.1748 0.8842 +vn -0.2860 -0.1432 0.9475 +vn -0.2759 -0.0656 0.9589 +vn 0.1046 -0.0387 0.9938 +vn 0.0063 -0.0386 0.9992 +vn -0.0009 0.0123 0.9999 +vn 0.0991 0.0114 0.9950 +vn 0.0009 0.0123 0.9999 +vn -0.0063 -0.0386 0.9992 +vn -0.1046 -0.0387 0.9938 +vn -0.0991 0.0114 0.9950 +vn 0.0992 -0.0540 0.9936 +vn 0.1006 -0.0381 0.9942 +vn 0.0000 -0.0462 0.9989 +vn -0.0006 -0.0602 0.9982 +vn -0.1006 -0.0381 0.9942 +vn -0.0992 -0.0540 0.9936 +vn 0.0006 -0.0602 0.9982 +vn 0.0057 -0.0606 0.9981 +vn 0.1152 -0.0604 0.9915 +vn 0.1106 -0.0465 0.9928 +vn 0.0016 -0.0360 0.9994 +vn -0.1106 -0.0465 0.9928 +vn -0.1152 -0.0604 0.9915 +vn -0.0057 -0.0606 0.9981 +vn -0.0016 -0.0360 0.9994 +vn 0.9181 -0.3140 0.2419 +vn 0.9298 -0.3663 0.0365 +vn 0.6495 -0.7310 0.2091 +vn 0.6386 -0.5515 0.5367 +vn -0.6495 -0.7310 0.2091 +vn -0.9298 -0.3663 0.0365 +vn -0.9181 -0.3140 0.2419 +vn -0.6386 -0.5515 0.5367 +vn 0.8574 0.5147 -0.0009 +vn 0.8786 0.4623 -0.1194 +vn 0.9952 0.0944 -0.0247 +vn 0.9890 0.1168 0.0907 +vn -0.9952 0.0944 -0.0247 +vn -0.8786 0.4623 -0.1194 +vn -0.8574 0.5147 -0.0009 +vn -0.9890 0.1168 0.0907 +vn -0.1074 0.7962 0.5954 +vn -0.1392 0.9876 -0.0731 +vn 0.3922 0.8867 -0.2450 +vn 0.3756 0.8780 0.2967 +vn -0.3922 0.8867 -0.2450 +vn 0.1392 0.9876 -0.0731 +vn 0.1074 0.7962 0.5954 +vn -0.3756 0.8780 0.2967 +vn -0.0108 0.7592 0.6508 +vn -0.7251 0.6838 0.0816 +vn -0.6736 0.6928 0.2575 +vn -0.5064 0.3843 0.7719 +vn 0.6736 0.6928 0.2575 +vn 0.7251 0.6838 0.0816 +vn 0.0108 0.7592 0.6508 +vn 0.5064 0.3843 0.7719 +vn 0.1232 -0.5545 0.8230 +vn 0.3364 -0.5638 0.7543 +vn 0.4669 -0.8186 0.3345 +vn 0.2183 -0.8974 0.3834 +vn -0.4669 -0.8186 0.3345 +vn -0.3364 -0.5638 0.7543 +vn -0.1232 -0.5545 0.8230 +vn -0.2183 -0.8974 0.3834 +vn 0.1820 -0.7319 0.6567 +vn 0.3599 -0.6937 0.6240 +vn 0.2443 -0.5823 0.7754 +vn 0.1174 -0.5306 0.8395 +vn -0.2443 -0.5823 0.7754 +vn -0.3599 -0.6937 0.6240 +vn -0.1820 -0.7319 0.6567 +vn -0.1174 -0.5306 0.8395 +vn -0.5357 0.7829 0.3162 +vn -0.2783 0.5637 0.7777 +vn -0.3046 0.5671 0.7652 +vn -0.5652 0.7127 0.4155 +vn 0.3046 0.5672 0.7652 +vn 0.2783 0.5637 0.7777 +vn 0.5357 0.7829 0.3162 +vn 0.5652 0.7127 0.4155 +vn -0.1157 0.9130 0.3912 +vn -0.0573 0.6306 0.7740 +vn 0.2624 0.5592 0.7864 +vn 0.4019 0.8455 0.3517 +vn -0.2624 0.5592 0.7864 +vn 0.0573 0.6306 0.7740 +vn 0.1157 0.9130 0.3912 +vn -0.4019 0.8455 0.3517 +vn 0.8110 0.4558 0.3668 +vn 0.4776 0.3746 0.7947 +vn 0.5212 0.1040 0.8471 +vn 0.9205 0.1167 0.3730 +vn -0.5212 0.1040 0.8471 +vn -0.4776 0.3746 0.7947 +vn -0.8110 0.4558 0.3668 +vn -0.9205 0.1167 0.3730 +vn 0.8092 -0.4216 0.4092 +vn 0.4019 -0.3967 0.8253 +vn 0.2733 -0.6372 0.7206 +vn 0.4566 -0.7153 0.5290 +vn -0.2733 -0.6372 0.7206 +vn -0.4019 -0.3967 0.8253 +vn -0.8092 -0.4216 0.4092 +vn -0.4566 -0.7153 0.5290 +vn -0.0039 0.1724 0.9850 +vn 0.1180 0.0811 0.9897 +vn 0.1769 0.3231 0.9297 +vn -0.0405 0.3806 0.9239 +vn -0.1769 0.3231 0.9297 +vn -0.1180 0.0811 0.9897 +vn 0.0039 0.1724 0.9850 +vn 0.0405 0.3806 0.9239 +vn -0.0169 -0.1911 0.9814 +vn 0.0452 -0.4015 0.9148 +vn 0.1316 -0.5000 0.8560 +vn 0.0762 -0.2808 0.9567 +vn -0.1316 -0.5000 0.8560 +vn -0.0452 -0.4015 0.9148 +vn 0.0169 -0.1911 0.9814 +vn -0.0762 -0.2808 0.9567 +vn -0.1258 -0.0262 0.9917 +vn -0.3067 -0.2224 0.9254 +vn -0.2398 -0.0343 0.9702 +vn -0.2423 0.0220 0.9700 +vn 0.2398 -0.0343 0.9702 +vn 0.3067 -0.2224 0.9254 +vn 0.1258 -0.0262 0.9917 +vn 0.2423 0.0220 0.9700 +vn -0.2695 -0.2832 0.9204 +vn 0.4785 -0.1181 0.8701 +vn 0.7159 -0.1356 0.6849 +vn 0.2945 -0.2960 0.9086 +vn -0.7159 -0.1356 0.6849 +vn -0.4785 -0.1181 0.8701 +vn 0.2695 -0.2832 0.9204 +vn -0.2945 -0.2960 0.9086 +vn 0.5980 -0.1937 0.7777 +vn 0.4002 -0.1785 0.8989 +vn 0.6366 0.0239 0.7708 +vn 0.7142 -0.0813 0.6952 +vn -0.6366 0.0239 0.7708 +vn -0.4002 -0.1785 0.8989 +vn -0.5980 -0.1937 0.7777 +vn -0.7142 -0.0813 0.6952 +vn 0.2856 -0.0108 0.9583 +vn 0.2432 0.0154 0.9699 +vn 0.4897 0.0613 0.8698 +vn 0.5478 0.0816 0.8326 +vn -0.4897 0.0613 0.8698 +vn -0.2432 0.0154 0.9699 +vn -0.2856 -0.0108 0.9583 +vn -0.5478 0.0816 0.8326 +vn 0.8932 0.2569 0.3691 +vn 0.8819 0.3300 0.3365 +vn 0.7877 0.2287 0.5720 +vn 0.7460 0.1691 0.6441 +vn -0.7877 0.2287 0.5720 +vn -0.8819 0.3300 0.3365 +vn -0.8932 0.2569 0.3691 +vn -0.7460 0.1691 0.6441 +vn 0.9006 0.2989 0.3155 +vn 0.9190 0.2537 0.3017 +vn 0.8801 0.1254 0.4579 +vn 0.8359 0.2064 0.5087 +vn -0.8801 0.1254 0.4579 +vn -0.9190 0.2537 0.3017 +vn -0.9006 0.2989 0.3155 +vn -0.8359 0.2064 0.5087 +vn 0.8200 -0.4526 0.3504 +vn 0.8136 -0.2784 0.5104 +vn 0.9110 0.0767 0.4053 +vn 0.9332 0.2382 0.2690 +vn -0.9110 0.0767 0.4053 +vn -0.8136 -0.2784 0.5104 +vn -0.8200 -0.4526 0.3504 +vn -0.9332 0.2382 0.2690 +vn 0.0798 -0.2245 0.9712 +vn 0.0520 -0.3423 0.9381 +vn 0.1527 -0.8959 0.4171 +vn 0.0593 -0.8662 0.4962 +vn -0.1527 -0.8959 0.4171 +vn -0.0520 -0.3423 0.9381 +vn -0.0798 -0.2245 0.9712 +vn -0.0593 -0.8662 0.4962 +vn 0.2086 -0.2434 0.9472 +vn 0.1842 -0.1704 0.9680 +vn -0.6732 -0.4369 0.5966 +vn -0.7792 -0.0464 0.6250 +vn 0.6732 -0.4369 0.5966 +vn -0.1842 -0.1704 0.9680 +vn -0.2086 -0.2434 0.9472 +vn 0.7792 -0.0464 0.6250 +vn 0.0328 -0.4066 0.9130 +vn 0.1141 -0.3580 0.9267 +vn -0.6856 0.1952 0.7014 +vn -0.5422 0.4296 0.7222 +vn 0.6856 0.1952 0.7014 +vn -0.1141 -0.3580 0.9267 +vn -0.0328 -0.4066 0.9130 +vn 0.5422 0.4296 0.7222 +vn -0.0048 -0.4085 0.9127 +vn 0.0028 -0.4061 0.9138 +vn -0.3110 0.6339 0.7081 +vn -0.0698 0.7044 0.7064 +vn 0.3110 0.6339 0.7081 +vn -0.0028 -0.4061 0.9138 +vn 0.0048 -0.4085 0.9127 +vn 0.0698 0.7044 0.7064 +vn -0.0780 0.9331 0.3511 +vn -0.3459 0.8768 0.3340 +vn -0.2793 0.7214 0.6337 +vn -0.0703 0.7184 0.6921 +vn 0.2793 0.7214 0.6337 +vn 0.3459 0.8768 0.3340 +vn 0.0780 0.9331 0.3511 +vn 0.0703 0.7184 0.6921 +vn -0.6231 0.7311 0.2777 +vn -0.8422 0.5039 0.1918 +vn -0.8465 0.4826 0.2250 +vn -0.5486 0.7208 0.4238 +vn 0.8465 0.4826 0.2250 +vn 0.8422 0.5039 0.1918 +vn 0.6231 0.7311 0.2777 +vn 0.5486 0.7208 0.4238 +vn -0.9846 0.1370 0.1084 +vn -0.8783 -0.4631 0.1187 +vn -0.7485 -0.5799 0.3217 +vn -0.9709 0.1792 0.1589 +vn 0.7485 -0.5799 0.3217 +vn 0.8783 -0.4631 0.1187 +vn 0.9846 0.1370 0.1084 +vn 0.9709 0.1792 0.1589 +vn 0.0703 -0.9817 0.1769 +vn 0.1584 -0.9714 0.1770 +vn 0.1269 -0.8843 0.4493 +vn 0.0888 -0.8956 0.4360 +vn -0.1269 -0.8843 0.4493 +vn -0.1584 -0.9714 0.1770 +vn -0.0703 -0.9817 0.1769 +vn -0.0888 -0.8956 0.4360 +vn 0.0412 -0.4702 0.8816 +vn -0.0091 -0.0868 0.9962 +vn -0.0145 -0.0876 0.9961 +vn 0.0673 -0.4848 0.8720 +vn 0.0145 -0.0876 0.9961 +vn 0.0091 -0.0868 0.9962 +vn -0.0412 -0.4702 0.8816 +vn -0.0673 -0.4848 0.8720 +vn -0.0608 -0.4990 0.8645 +vn -0.0210 -0.0299 0.9993 +vn -0.8477 0.2291 0.4784 +vn 0.8477 0.2291 0.4784 +vn 0.0210 -0.0299 0.9993 +vn 0.0608 -0.4990 0.8645 +vn -0.2258 -0.1698 0.9593 +vn -0.2384 -0.1937 0.9517 +vn -0.3201 -0.2054 0.9249 +vn -0.2647 -0.1414 0.9539 +vn 0.3201 -0.2054 0.9249 +vn 0.2384 -0.1937 0.9517 +vn 0.2258 -0.1698 0.9593 +vn 0.2647 -0.1414 0.9539 +vn -0.0559 -0.0784 0.9954 +vn -0.1589 -0.1119 0.9809 +vn -0.2196 -0.0592 0.9738 +vn -0.1602 -0.0133 0.9870 +vn 0.2196 -0.0592 0.9738 +vn 0.1589 -0.1119 0.9809 +vn 0.0559 -0.0784 0.9954 +vn 0.1602 -0.0133 0.9870 +vn 0.1080 -0.0820 0.9908 +vn 0.0337 -0.0812 0.9961 +vn -0.0985 0.0004 0.9951 +vn -0.0416 0.0293 0.9987 +vn 0.0985 0.0004 0.9951 +vn -0.0337 -0.0812 0.9961 +vn -0.1080 -0.0820 0.9908 +vn 0.0416 0.0293 0.9987 +vn -0.2294 -0.1590 0.9602 +vn -0.0707 -0.2584 0.9634 +vn -0.3075 -0.5433 0.7812 +vn -0.4120 -0.2694 0.8704 +vn 0.3075 -0.5433 0.7812 +vn 0.0707 -0.2584 0.9634 +vn 0.2294 -0.1590 0.9602 +vn 0.4120 -0.2694 0.8704 +vn 0.0675 -0.3683 0.9272 +vn 0.1214 -0.4982 0.8586 +vn 0.0574 -0.6162 0.7855 +vn -0.1165 -0.6608 0.7415 +vn -0.0574 -0.6162 0.7855 +vn -0.1214 -0.4982 0.8586 +vn -0.0675 -0.3683 0.9272 +vn 0.1165 -0.6608 0.7415 +vn 0.2874 -0.5650 0.7734 +vn 0.4513 -0.4912 0.7450 +vn 0.4493 -0.4744 0.7570 +vn 0.2727 -0.5515 0.7883 +vn -0.4493 -0.4744 0.7570 +vn -0.4513 -0.4912 0.7450 +vn -0.2874 -0.5650 0.7734 +vn -0.2727 -0.5515 0.7883 +vn 0.5072 -0.3954 0.7658 +vn 0.5127 -0.2828 0.8107 +vn 0.4975 -0.2184 0.8395 +vn 0.5175 -0.3628 0.7750 +vn -0.4975 -0.2184 0.8395 +vn -0.5127 -0.2828 0.8107 +vn -0.5072 -0.3954 0.7658 +vn -0.5175 -0.3628 0.7750 +vn 0.4826 -0.1550 0.8620 +vn 0.4265 -0.0825 0.9007 +vn 0.4601 -0.0647 0.8855 +vn 0.4597 -0.1218 0.8797 +vn -0.4601 -0.0647 0.8855 +vn -0.4265 -0.0825 0.9007 +vn -0.4826 -0.1550 0.8620 +vn -0.4597 -0.1218 0.8797 +vn 0.3552 -0.0597 0.9329 +vn 0.3088 -0.0828 0.9475 +vn 0.4678 0.0809 0.8801 +vn 0.4599 0.0091 0.8879 +vn -0.4678 0.0809 0.8801 +vn -0.3088 -0.0828 0.9475 +vn -0.3552 -0.0597 0.9329 +vn -0.4599 0.0091 0.8879 +vn 0.3479 -0.0238 0.9372 +vn 0.3614 0.1372 0.9223 +vn 0.4598 0.4842 0.7445 +vn 0.5038 0.2537 0.8257 +vn -0.4598 0.4842 0.7445 +vn -0.3614 0.1372 0.9223 +vn -0.3479 -0.0238 0.9372 +vn -0.5038 0.2537 0.8257 +vn 0.2612 0.1393 0.9552 +vn 0.1375 -0.0082 0.9905 +vn 0.1358 0.4258 0.8946 +vn 0.3136 0.5519 0.7727 +vn -0.1358 0.4258 0.8946 +vn -0.1375 -0.0082 0.9905 +vn -0.2612 0.1393 0.9552 +vn -0.3136 0.5519 0.7727 +vn 0.1749 -0.0932 0.9802 +vn 0.2118 -0.0874 0.9734 +vn 0.1272 0.2678 0.9550 +vn 0.1533 0.2998 0.9416 +vn -0.1272 0.2678 0.9550 +vn -0.2118 -0.0874 0.9734 +vn -0.1749 -0.0932 0.9802 +vn -0.1533 0.2998 0.9416 +vn 0.2023 -0.0731 0.9766 +vn 0.1716 -0.0703 0.9827 +vn 0.0039 0.1042 0.9946 +vn 0.0433 0.1989 0.9791 +vn -0.0039 0.1042 0.9946 +vn -0.1716 -0.0703 0.9827 +vn -0.2023 -0.0731 0.9766 +vn -0.0433 0.1989 0.9791 +vn 0.1764 -0.1175 0.9773 +vn 0.2503 -0.2080 0.9456 +vn 0.3984 -0.4479 0.8004 +vn 0.2580 -0.3856 0.8858 +vn -0.3984 -0.4479 0.8004 +vn -0.2503 -0.2080 0.9456 +vn -0.1764 -0.1175 0.9773 +vn -0.2580 -0.3856 0.8858 +vn 0.1419 -0.0502 0.9886 +vn 0.2098 -0.0241 0.9774 +vn 0.2619 -0.2812 0.9232 +vn 0.1641 -0.3470 0.9234 +vn -0.2619 -0.2812 0.9232 +vn -0.2098 -0.0241 0.9774 +vn -0.1419 -0.0502 0.9886 +vn -0.1641 -0.3470 0.9234 +vn 0.0634 -0.1816 0.9813 +vn -0.0526 -0.1007 0.9935 +vn -0.0843 -0.5566 0.8265 +vn -0.1348 -0.7754 0.6169 +vn 0.0843 -0.5566 0.8265 +vn 0.0526 -0.1007 0.9935 +vn -0.0634 -0.1816 0.9813 +vn 0.1348 -0.7754 0.6169 +vn 0.2005 -0.5067 0.8385 +vn 0.2383 -0.4064 0.8821 +vn -0.0812 -0.8427 0.5322 +vn -0.0640 -0.7747 0.6291 +vn 0.0812 -0.8427 0.5322 +vn -0.2383 -0.4064 0.8821 +vn -0.2005 -0.5067 0.8385 +vn 0.0640 -0.7747 0.6291 +vn -0.0332 -0.1172 0.9925 +vn 0.0578 -0.3461 0.9364 +vn -0.2133 -0.5362 0.8167 +vn -0.3840 -0.1907 0.9034 +vn 0.2133 -0.5362 0.8167 +vn -0.0578 -0.3461 0.9364 +vn 0.0332 -0.1172 0.9925 +vn 0.3840 -0.1907 0.9034 +vn 0.0282 0.0488 0.9984 +vn -0.0202 -0.0708 0.9973 +vn -0.3871 -0.0442 0.9210 +vn -0.2847 0.1800 0.9416 +vn 0.3871 -0.0442 0.9210 +vn 0.0202 -0.0708 0.9973 +vn -0.0282 0.0488 0.9984 +vn 0.2847 0.1800 0.9416 +vn 0.1824 0.1695 0.9685 +vn 0.1217 0.1677 0.9783 +vn -0.1675 0.3787 0.9103 +vn -0.1537 0.5074 0.8479 +vn 0.1675 0.3787 0.9103 +vn -0.1217 0.1677 0.9783 +vn -0.1824 0.1695 0.9685 +vn 0.1537 0.5074 0.8479 +vn 0.2256 0.0966 0.9694 +vn 0.2015 0.1231 0.9717 +vn -0.0956 0.6021 0.7927 +vn 0.1063 0.6268 0.7719 +vn 0.0956 0.6021 0.7927 +vn -0.2015 0.1231 0.9717 +vn -0.2256 0.0966 0.9694 +vn -0.1063 0.6268 0.7719 +vn 0.2622 0.1395 0.9549 +vn 0.2597 0.0956 0.9610 +vn 0.2912 0.6006 0.7447 +vn 0.3719 0.6010 0.7074 +vn -0.2912 0.6006 0.7447 +vn -0.2597 0.0956 0.9610 +vn -0.2622 0.1395 0.9549 +vn -0.3719 0.6010 0.7074 +vn 0.3148 0.2739 0.9088 +vn 0.2388 0.2541 0.9372 +vn 0.4401 0.5783 0.6869 +vn 0.5832 0.4491 0.6769 +vn -0.4401 0.5783 0.6869 +vn -0.2388 0.2541 0.9372 +vn -0.3148 0.2739 0.9088 +vn -0.5832 0.4491 0.6769 +vn 0.3567 -0.2066 0.9111 +vn 0.4345 -0.1666 0.8851 +vn 0.7213 -0.3143 0.6171 +vn 0.5757 -0.4001 0.7131 +vn -0.7213 -0.3143 0.6171 +vn -0.4345 -0.1666 0.8851 +vn -0.3567 -0.2066 0.9111 +vn -0.5757 -0.4001 0.7131 +vn 0.4936 -0.1029 0.8636 +vn 0.5275 -0.0396 0.8487 +vn 0.8125 -0.0300 0.5822 +vn 0.8067 -0.1577 0.5695 +vn -0.8125 -0.0300 0.5822 +vn -0.5275 -0.0396 0.8487 +vn -0.4936 -0.1029 0.8636 +vn -0.8067 -0.1577 0.5695 +vn 0.5351 0.0166 0.8446 +vn 0.4751 0.1342 0.8696 +vn 0.7355 0.2376 0.6345 +vn 0.7983 0.0611 0.5992 +vn -0.7355 0.2376 0.6345 +vn -0.4751 0.1342 0.8696 +vn -0.5351 0.0166 0.8446 +vn -0.7983 0.0611 0.5992 +vn -0.3564 0.9338 -0.0305 +vn -0.7591 0.6384 -0.1271 +vn -0.5797 0.7783 -0.2414 +vn -0.2594 0.9642 0.0554 +vn 0.5797 0.7783 -0.2414 +vn 0.7591 0.6384 -0.1271 +vn 0.3564 0.9338 -0.0305 +vn 0.2594 0.9642 0.0554 +vn -0.8771 0.4457 -0.1790 +vn -0.8328 0.5224 -0.1830 +vn -0.6598 0.4172 -0.6250 +vn -0.7028 0.4505 -0.5506 +vn 0.6598 0.4172 -0.6250 +vn 0.8328 0.5224 -0.1830 +vn 0.8771 0.4457 -0.1790 +vn 0.7028 0.4505 -0.5506 +vn -0.5042 0.8445 -0.1802 +vn 0.0443 0.9871 -0.1536 +vn -0.0365 0.7633 -0.6450 +vn -0.4474 0.6254 -0.6393 +vn 0.0365 0.7633 -0.6450 +vn -0.0443 0.9871 -0.1536 +vn 0.5042 0.8445 -0.1802 +vn 0.4474 0.6254 -0.6393 +vn 0.5129 0.8527 -0.0992 +vn 0.5986 0.7955 -0.0935 +vn 0.3523 0.7129 -0.6063 +vn 0.2944 0.7072 -0.6428 +vn -0.3523 0.7129 -0.6063 +vn -0.5986 0.7955 -0.0935 +vn -0.5129 0.8527 -0.0992 +vn -0.2944 0.7072 -0.6428 +vn 0.4899 0.8644 -0.1133 +vn 0.4236 0.8993 -0.1091 +vn 0.3649 0.8952 -0.2560 +vn 0.2923 0.8660 -0.4058 +vn -0.3649 0.8952 -0.2560 +vn -0.4236 0.8993 -0.1091 +vn -0.4899 0.8644 -0.1133 +vn -0.2923 0.8660 -0.4058 +vn 0.3764 0.9214 -0.0963 +vn 0.7040 0.6980 -0.1314 +vn 0.6182 0.7171 -0.3220 +vn 0.3362 0.9097 -0.2437 +vn -0.6182 0.7171 -0.3220 +vn -0.7040 0.6980 -0.1314 +vn -0.3764 0.9214 -0.0963 +vn -0.3362 0.9097 -0.2437 +vn 0.9785 0.1332 -0.1572 +vn 0.9637 -0.2187 -0.1534 +vn 0.9565 -0.1523 -0.2490 +vn 0.9064 0.2479 -0.3419 +vn -0.9565 -0.1523 -0.2490 +vn -0.9637 -0.2187 -0.1534 +vn -0.9785 0.1332 -0.1572 +vn -0.9064 0.2479 -0.3419 +vn 0.7948 -0.5913 -0.1362 +vn 0.6242 -0.7712 -0.1248 +vn 0.6455 -0.7567 -0.1032 +vn 0.8063 -0.5677 -0.1663 +vn -0.6455 -0.7567 -0.1032 +vn -0.6242 -0.7712 -0.1248 +vn -0.7948 -0.5913 -0.1362 +vn -0.8063 -0.5677 -0.1663 +vn 0.5227 -0.8454 -0.1101 +vn 0.3980 -0.9141 -0.0778 +vn 0.3905 -0.9135 -0.1145 +vn 0.5293 -0.8441 -0.0856 +vn -0.3905 -0.9135 -0.1145 +vn -0.3980 -0.9141 -0.0778 +vn -0.5227 -0.8454 -0.1101 +vn -0.5293 -0.8441 -0.0856 +vn 0.1166 -0.3653 -0.9235 +vn 0.1076 -0.6595 -0.7439 +vn 0.3922 -0.6625 -0.6382 +vn 0.3326 -0.4061 -0.8512 +vn -0.3922 -0.6625 -0.6382 +vn -0.1076 -0.6595 -0.7439 +vn -0.1166 -0.3653 -0.9235 +vn -0.3326 -0.4061 -0.8512 +vn 0.1160 -0.1703 -0.9785 +vn 0.1322 -0.1441 -0.9807 +vn 0.2652 -0.1327 -0.9550 +vn 0.2000 -0.1204 -0.9724 +vn -0.2652 -0.1327 -0.9550 +vn -0.1322 -0.1441 -0.9807 +vn -0.1160 -0.1703 -0.9785 +vn -0.2000 -0.1204 -0.9724 +vn 0.0451 -0.6037 -0.7959 +vn 0.0837 -0.3802 -0.9211 +vn 0.1298 -0.3022 -0.9444 +vn 0.0547 -0.5316 -0.8452 +vn -0.1298 -0.3022 -0.9444 +vn -0.0837 -0.3802 -0.9211 +vn -0.0451 -0.6037 -0.7959 +vn -0.0547 -0.5316 -0.8452 +vn 0.1217 -0.9915 -0.0468 +vn 0.0585 -0.9983 -0.0057 +vn 0.0465 -0.8981 -0.4373 +vn 0.0769 -0.8687 -0.4894 +vn -0.0465 -0.8981 -0.4373 +vn -0.0585 -0.9983 -0.0057 +vn -0.1217 -0.9915 -0.0468 +vn -0.0769 -0.8687 -0.4894 +vn 0.3393 -0.9324 -0.1249 +vn 0.1387 -0.9870 -0.0813 +vn 0.0505 -0.8376 -0.5439 +vn 0.2706 -0.7206 -0.6383 +vn -0.0505 -0.8376 -0.5439 +vn -0.1387 -0.9870 -0.0813 +vn -0.3393 -0.9324 -0.1249 +vn -0.2706 -0.7206 -0.6383 +vn 0.9901 -0.0290 -0.1370 +vn 0.8533 -0.4971 -0.1573 +vn 0.6430 -0.3347 -0.6889 +vn 0.8299 0.0726 -0.5532 +vn -0.6430 -0.3347 -0.6889 +vn -0.8533 -0.4971 -0.1573 +vn -0.9901 -0.0290 -0.1370 +vn -0.8299 0.0726 -0.5532 +vn 0.9779 0.1391 -0.1563 +vn 0.9834 0.0973 -0.1531 +vn 0.8402 0.1390 -0.5241 +vn 0.8528 0.1497 -0.5003 +vn -0.8402 0.1390 -0.5241 +vn -0.9834 0.0973 -0.1531 +vn -0.9779 0.1391 -0.1563 +vn -0.8528 0.1497 -0.5003 +vn 0.3822 0.0370 -0.9233 +vn 0.1532 -0.0625 -0.9862 +vn 0.2688 -0.0768 -0.9601 +vn 0.4965 0.0463 -0.8668 +vn -0.2688 -0.0768 -0.9601 +vn -0.1532 -0.0625 -0.9862 +vn -0.3822 0.0370 -0.9233 +vn -0.4965 0.0463 -0.8668 +vn 0.2653 -0.0694 -0.9617 +vn 0.2074 -0.3516 -0.9129 +vn -0.0068 -0.4342 -0.9008 +vn 0.0694 -0.2037 -0.9766 +vn 0.0068 -0.4342 -0.9008 +vn -0.2074 -0.3516 -0.9129 +vn -0.2653 -0.0694 -0.9617 +vn -0.0694 -0.2037 -0.9766 +vn 0.8652 -0.0990 -0.4915 +vn 0.6745 -0.0524 -0.7364 +vn 0.5096 -0.3034 -0.8051 +vn 0.7347 -0.4575 -0.5009 +vn -0.5096 -0.3034 -0.8051 +vn -0.6745 -0.0524 -0.7364 +vn -0.8652 -0.0990 -0.4915 +vn -0.7347 -0.4575 -0.5009 +vn 0.9760 0.1734 -0.1315 +vn 0.9766 0.1420 -0.1614 +vn 0.8686 0.1168 -0.4815 +vn 0.9026 0.1251 -0.4119 +vn -0.8686 0.1168 -0.4815 +vn -0.9766 0.1420 -0.1614 +vn -0.9760 0.1734 -0.1315 +vn -0.9026 0.1251 -0.4119 +vn 0.9500 0.3122 -0.0030 +vn 0.9982 -0.0173 0.0582 +vn 0.9481 0.0117 0.3177 +vn 0.9543 0.2977 0.0279 +vn -0.9481 0.0117 0.3177 +vn -0.9982 -0.0173 0.0582 +vn -0.9500 0.3122 -0.0030 +vn -0.9543 0.2977 0.0279 +vn 0.9603 0.2707 -0.0676 +vn 0.9275 0.2098 -0.3095 +vn 0.9821 0.0949 -0.1626 +vn 0.9388 0.3437 -0.0214 +vn -0.9821 0.0949 -0.1626 +vn -0.9275 0.2098 -0.3095 +vn -0.9603 0.2707 -0.0676 +vn -0.9388 0.3437 -0.0214 +vn 0.8296 -0.5488 0.1030 +vn 0.9457 0.3168 0.0726 +vn 0.8760 0.0949 0.4729 +vn 0.7087 -0.6925 0.1349 +vn -0.8760 0.0949 0.4729 +vn -0.9457 0.3168 0.0726 +vn -0.8296 -0.5488 0.1030 +vn -0.7087 -0.6925 0.1349 +vn 0.3328 -0.9408 0.0643 +vn 0.3508 -0.9237 -0.1541 +vn 0.2658 -0.9516 -0.1540 +vn 0.2867 -0.9579 -0.0140 +vn -0.2658 -0.9516 -0.1540 +vn -0.3508 -0.9237 -0.1541 +vn -0.3328 -0.9408 0.0643 +vn -0.2867 -0.9579 -0.0140 +vn 0.2001 -0.3621 -0.9104 +vn 0.3877 -0.3624 -0.8475 +vn 0.3717 -0.6029 -0.7060 +vn 0.1837 -0.6210 -0.7620 +vn -0.3717 -0.6029 -0.7060 +vn -0.3877 -0.3624 -0.8475 +vn -0.2001 -0.3621 -0.9104 +vn -0.1837 -0.6210 -0.7620 +vn 0.1674 -0.7953 -0.5827 +vn 0.3752 -0.7647 -0.5239 +vn 0.3702 -0.8633 -0.3429 +vn 0.1532 -0.9078 -0.3904 +vn -0.3702 -0.8633 -0.3429 +vn -0.3752 -0.7647 -0.5239 +vn -0.1674 -0.7953 -0.5827 +vn -0.1532 -0.9078 -0.3904 +vn 0.1434 -0.9658 -0.2160 +vn 0.3709 -0.9131 -0.1693 +vn 0.4174 -0.9043 -0.0900 +vn 0.1491 -0.9771 -0.1519 +vn -0.4174 -0.9043 -0.0900 +vn -0.3709 -0.9131 -0.1693 +vn -0.1434 -0.9658 -0.2160 +vn -0.1491 -0.9771 -0.1519 +vn 0.1583 -0.9716 -0.1759 +vn 0.4540 -0.8829 -0.1201 +vn 0.4500 -0.8195 -0.3547 +vn 0.1403 -0.8925 -0.4286 +vn -0.4500 -0.8195 -0.3547 +vn -0.4540 -0.8829 -0.1201 +vn -0.1583 -0.9716 -0.1759 +vn -0.1403 -0.8925 -0.4286 +vn 0.9614 -0.0417 -0.2720 +vn 0.8401 -0.4844 -0.2441 +vn 0.7790 -0.6253 0.0474 +vn 0.9544 -0.2980 -0.0169 +vn -0.7790 -0.6253 0.0474 +vn -0.8401 -0.4844 -0.2441 +vn -0.9614 -0.0417 -0.2720 +vn -0.9544 -0.2980 -0.0169 +vn 0.8706 -0.4755 0.1265 +vn 0.7279 -0.6600 0.1863 +vn 0.7927 -0.5636 0.2325 +vn 0.9198 -0.3521 0.1734 +vn -0.7927 -0.5636 0.2325 +vn -0.7279 -0.6600 0.1863 +vn -0.8706 -0.4755 0.1265 +vn -0.9198 -0.3521 0.1734 +vn 0.1902 0.1157 -0.9749 +vn 0.3826 0.0540 -0.9223 +vn 0.3800 -0.2095 -0.9009 +vn 0.1936 -0.1523 -0.9692 +vn -0.3800 -0.2095 -0.9009 +vn -0.3826 0.0540 -0.9223 +vn -0.1902 0.1157 -0.9749 +vn -0.1936 -0.1523 -0.9692 +vn 0.0678 0.9096 0.4099 +vn 0.2460 0.8772 0.4124 +vn 0.2136 0.9693 0.1216 +vn 0.0558 0.9914 0.1182 +vn -0.2136 0.9693 0.1216 +vn -0.2460 0.8772 0.4124 +vn -0.0678 0.9096 0.4099 +vn -0.0558 0.9914 0.1182 +vn 0.0569 0.9940 -0.0937 +vn 0.2050 0.9744 -0.0926 +vn 0.2483 0.8867 -0.3900 +vn 0.0911 0.9275 -0.3625 +vn -0.2483 0.8867 -0.3900 +vn -0.2050 0.9744 -0.0926 +vn -0.0569 0.9940 -0.0937 +vn -0.0911 0.9275 -0.3625 +vn 0.1577 0.7390 -0.6550 +vn 0.3386 0.6702 -0.6605 +vn 0.3926 0.4285 -0.8138 +vn 0.1938 0.4878 -0.8512 +vn -0.3926 0.4285 -0.8138 +vn -0.3386 0.6702 -0.6605 +vn -0.1577 0.7390 -0.6550 +vn -0.1938 0.4878 -0.8512 +vn 0.3769 0.9123 -0.1600 +vn 0.6401 0.7324 -0.2320 +vn 0.6878 0.7206 0.0877 +vn 0.4445 0.8780 0.1777 +vn -0.6878 0.7206 0.0877 +vn -0.6401 0.7324 -0.2320 +vn -0.3769 0.9123 -0.1600 +vn -0.4445 0.8780 0.1777 +vn 0.4241 0.6987 0.5761 +vn 0.6499 0.5895 0.4797 +vn 0.6527 0.5727 0.4960 +vn 0.4826 0.6630 0.5723 +vn -0.6527 0.5727 0.4960 +vn -0.6499 0.5895 0.4797 +vn -0.4241 0.6987 0.5761 +vn -0.4826 0.6630 0.5723 +vn 0.6041 0.7367 0.3037 +vn 0.7488 0.6139 0.2500 +vn 0.8015 0.5968 0.0369 +vn 0.6547 0.7534 0.0612 +vn -0.8015 0.5968 0.0369 +vn -0.7488 0.6139 0.2500 +vn -0.6041 0.7367 0.3037 +vn -0.6547 0.7534 0.0612 +vn 0.6753 0.7277 -0.1198 +vn 0.8265 0.5523 -0.1089 +vn 0.8306 0.4446 -0.3354 +vn 0.6704 0.6235 -0.4022 +vn -0.8306 0.4446 -0.3354 +vn -0.8265 0.5523 -0.1089 +vn -0.6753 0.7277 -0.1198 +vn -0.6704 0.6235 -0.4022 +vn 0.7355 0.0900 -0.6715 +vn 0.6174 0.1265 -0.7764 +vn 0.6217 0.3786 -0.6856 +vn 0.8049 0.2659 -0.5305 +vn -0.6217 0.3786 -0.6856 +vn -0.6174 0.1265 -0.7764 +vn -0.7355 0.0900 -0.6715 +vn -0.8049 0.2659 -0.5305 +vn 0.4660 0.3523 -0.8117 +vn 0.4131 0.5939 -0.6904 +vn 0.5062 0.4910 -0.7090 +vn 0.5506 0.2356 -0.8009 +vn -0.5062 0.4910 -0.7090 +vn -0.4131 0.5939 -0.6904 +vn -0.4660 0.3523 -0.8117 +vn -0.5506 0.2356 -0.8009 +vn 0.4262 0.8052 -0.4124 +vn 0.4791 0.8726 -0.0948 +vn 0.6628 0.7417 -0.1022 +vn 0.5875 0.6976 -0.4100 +vn -0.6628 0.7417 -0.1022 +vn -0.4791 0.8726 -0.0948 +vn -0.4262 0.8052 -0.4124 +vn -0.5875 0.6976 -0.4100 +vn 0.5132 0.8522 0.1014 +vn 0.5589 0.7509 0.3519 +vn 0.7048 0.6492 0.2860 +vn 0.6854 0.7248 0.0699 +vn -0.7048 0.6492 0.2860 +vn -0.5589 0.7509 0.3519 +vn -0.5132 0.8522 0.1014 +vn -0.6854 0.7248 0.0699 +vn 0.5784 0.5616 0.5917 +vn 0.5439 0.5641 0.6212 +vn 0.6419 0.5601 0.5237 +vn 0.6900 0.5185 0.5049 +vn -0.6419 0.5601 0.5237 +vn -0.5439 0.5641 0.6212 +vn -0.5784 0.5616 0.5917 +vn -0.6900 0.5185 0.5049 +vn 0.1862 0.9392 -0.2884 +vn 0.3690 0.9136 -0.1708 +vn 0.5027 0.8432 0.1906 +vn 0.3772 0.8780 0.2945 +vn -0.5027 0.8432 0.1906 +vn -0.3690 0.9136 -0.1708 +vn -0.1862 0.9392 -0.2884 +vn -0.3772 0.8780 0.2945 +vn 0.1398 0.6437 0.7524 +vn 0.3113 0.6008 0.7362 +vn 0.2926 0.6596 0.6923 +vn 0.0963 0.7117 0.6959 +vn -0.2926 0.6596 0.6923 +vn -0.3113 0.6008 0.7362 +vn -0.1398 0.6437 0.7524 +vn -0.0963 0.7117 0.6959 +vn -0.3143 0.3098 -0.8974 +vn -0.3627 0.3016 -0.8818 +vn -0.0528 0.3888 -0.9198 +vn -0.1143 0.3499 -0.9298 +vn 0.0528 0.3888 -0.9198 +vn 0.3627 0.3016 -0.8818 +vn 0.3143 0.3098 -0.8974 +vn 0.1143 0.3499 -0.9298 +vn -0.1211 0.9543 0.2731 +vn -0.1029 0.9514 -0.2902 +vn 0.2076 0.8342 0.5109 +vn 0.1206 0.7069 0.6969 +vn -0.2076 0.8342 0.5109 +vn 0.1029 0.9514 -0.2902 +vn 0.1211 0.9543 0.2731 +vn -0.1206 0.7069 0.6969 +vn -0.0946 0.5719 0.8148 +vn -0.2268 0.6795 0.6977 +vn -0.0201 0.4661 0.8845 +vn 0.0201 0.4661 0.8845 +vn 0.2268 0.6795 0.6977 +vn 0.0946 0.5719 0.8148 +vn 0.9341 0.3265 -0.1448 +vn 0.9920 -0.1200 0.0389 +vn 0.9899 0.0001 0.1418 +vn 0.9175 0.3893 0.0816 +vn -0.9899 0.0001 0.1418 +vn -0.9920 -0.1200 0.0389 +vn -0.9341 0.3265 -0.1448 +vn -0.9175 0.3893 0.0816 +vn 0.9822 0.0351 0.1847 +vn 0.9887 0.0423 0.1439 +vn 0.9233 0.2360 0.3032 +vn 0.9173 0.2553 0.3055 +vn -0.9233 0.2360 0.3032 +vn -0.9887 0.0423 0.1439 +vn -0.9822 0.0351 0.1847 +vn -0.9173 0.2553 0.3055 +vn 0.9933 0.1151 0.0108 +vn 0.9809 0.1735 -0.0877 +vn 0.9626 0.2675 -0.0418 +vn 0.9508 0.2920 0.1034 +vn -0.9626 0.2675 -0.0418 +vn -0.9809 0.1735 -0.0877 +vn -0.9933 0.1151 0.0108 +vn -0.9508 0.2920 0.1034 +vn 0.9288 0.1135 -0.3527 +vn 0.9358 0.2030 -0.2882 +vn 0.9733 0.2074 -0.0979 +vn 0.9725 0.1765 -0.1522 +vn -0.9733 0.2074 -0.0979 +vn -0.9358 0.2030 -0.2882 +vn -0.9288 0.1135 -0.3527 +vn -0.9725 0.1765 -0.1522 +vn 0.6553 -0.7551 0.0203 +vn 0.5920 -0.8020 -0.0794 +vn 0.6279 -0.7768 -0.0482 +vn 0.6575 -0.7478 0.0919 +vn -0.6279 -0.7768 -0.0482 +vn -0.5920 -0.8020 -0.0794 +vn -0.6553 -0.7551 0.0203 +vn -0.6575 -0.7478 0.0919 +vn 0.4668 -0.8741 0.1343 +vn 0.4588 -0.8824 0.1046 +vn 0.4476 -0.8920 -0.0633 +vn 0.3413 -0.9399 0.0148 +vn -0.4476 -0.8920 -0.0633 +vn -0.4588 -0.8824 0.1046 +vn -0.4668 -0.8741 0.1343 +vn -0.3413 -0.9399 0.0148 +vn 0.5613 -0.8065 0.1858 +vn 0.4668 -0.8654 0.1818 +vn 0.4767 -0.8577 0.1925 +vn 0.5263 -0.8217 0.2186 +vn -0.4767 -0.8577 0.1925 +vn -0.4668 -0.8654 0.1818 +vn -0.5613 -0.8065 0.1858 +vn -0.5263 -0.8217 0.2186 +vn 0.5216 -0.8204 0.2341 +vn 0.6578 -0.6375 0.4011 +vn 0.7511 -0.6001 0.2753 +vn 0.5984 -0.7768 0.1963 +vn -0.7511 -0.6001 0.2753 +vn -0.6578 -0.6375 0.4011 +vn -0.5216 -0.8204 0.2341 +vn -0.5984 -0.7768 0.1963 +vn 0.7592 -0.6218 0.1926 +vn 0.7187 -0.6817 0.1373 +vn 0.6862 -0.7002 0.1973 +vn -0.6862 -0.7002 0.1973 +vn -0.7187 -0.6817 0.1373 +vn -0.7592 -0.6218 0.1926 +vn 0.4177 -0.7750 0.4742 +vn 0.4704 -0.8012 0.3699 +vn 0.4993 -0.5066 0.7029 +vn -0.4993 -0.5066 0.7029 +vn -0.4704 -0.8012 0.3699 +vn -0.4177 -0.7750 0.4742 +vn 0.6287 -0.1731 -0.7581 +vn 0.4658 -0.4492 -0.7624 +vn 0.5177 -0.4475 -0.7292 +vn 0.5802 -0.1684 -0.7969 +vn -0.5177 -0.4475 -0.7292 +vn -0.4658 -0.4492 -0.7624 +vn -0.6287 -0.1731 -0.7581 +vn -0.5802 -0.1684 -0.7969 +vn 0.4618 -0.0233 -0.8867 +vn 0.5443 -0.1128 -0.8313 +vn 0.5532 -0.3757 -0.7436 +vn 0.4454 -0.2665 -0.8548 +vn -0.5532 -0.3757 -0.7436 +vn -0.5443 -0.1128 -0.8313 +vn -0.4618 -0.0233 -0.8867 +vn -0.4454 -0.2665 -0.8548 +vn 0.2208 -0.9325 -0.2857 +vn 0.4424 -0.8447 -0.3014 +vn 0.4406 -0.7369 -0.5127 +vn 0.2445 -0.7812 -0.5744 +vn -0.4406 -0.7369 -0.5127 +vn -0.4424 -0.8447 -0.3014 +vn -0.2208 -0.9325 -0.2857 +vn -0.2445 -0.7812 -0.5744 +vn 0.5828 -0.7694 -0.2615 +vn 0.5586 -0.7104 -0.4281 +vn 0.6683 -0.6368 -0.3844 +vn 0.6382 -0.7320 -0.2386 +vn -0.6683 -0.6368 -0.3844 +vn -0.5586 -0.7104 -0.4281 +vn -0.5828 -0.7694 -0.2615 +vn -0.6382 -0.7320 -0.2386 +vn 0.4367 -0.3637 -0.8228 +vn 0.6197 -0.4763 -0.6238 +vn 0.4702 -0.6134 -0.6346 +vn -0.4702 -0.6134 -0.6346 +vn -0.6197 -0.4763 -0.6238 +vn -0.4367 -0.3637 -0.8228 +vn -0.0205 0.8492 0.5277 +vn -0.1918 0.8152 0.5466 +vn 0.4724 0.0875 0.8770 +vn 0.5353 0.0226 0.8444 +vn -0.4724 0.0875 0.8770 +vn 0.1918 0.8152 0.5466 +vn 0.0205 0.8492 0.5277 +vn -0.5353 0.0226 0.8444 +vn 0.1382 0.8098 0.5702 +vn 0.5113 -0.0565 0.8575 +vn 0.4345 -0.0954 0.8956 +vn 0.3782 0.6396 0.6692 +vn -0.4345 -0.0954 0.8956 +vn -0.5113 -0.0565 0.8575 +vn -0.1382 0.8098 0.5702 +vn -0.3782 0.6396 0.6692 +vn 0.5193 0.3696 0.7705 +vn 0.2324 -0.0550 0.9711 +vn 0.0996 -0.0175 0.9949 +vn 0.5077 0.1512 0.8481 +vn -0.0996 -0.0175 0.9949 +vn -0.2324 -0.0550 0.9711 +vn -0.5193 0.3696 0.7705 +vn -0.5077 0.1512 0.8481 +vn 0.4991 -0.0694 0.8637 +vn 0.0746 -0.0289 0.9968 +vn 0.1012 0.0676 0.9926 +vn 0.5339 -0.1803 0.8261 +vn -0.1012 0.0676 0.9926 +vn -0.0746 -0.0289 0.9968 +vn -0.4991 -0.0694 0.8637 +vn -0.5339 -0.1803 0.8261 +vn 0.5960 -0.3435 0.7258 +vn 0.2560 0.1901 0.9478 +vn 0.4547 0.1312 0.8809 +vn 0.5900 -0.5478 0.5931 +vn -0.4547 0.1312 0.8809 +vn -0.2560 0.1901 0.9478 +vn -0.5960 -0.3435 0.7258 +vn -0.5900 -0.5478 0.5931 +vn 0.5327 -0.6774 0.5073 +vn 0.6046 -0.0297 0.7960 +vn 0.5400 -0.1178 0.8334 +vn 0.3758 -0.7678 0.5189 +vn -0.5400 -0.1178 0.8334 +vn -0.6046 -0.0297 0.7960 +vn -0.5327 -0.6774 0.5073 +vn -0.3758 -0.7678 0.5189 +vn 0.4221 0.5591 0.7136 +vn 0.1653 0.8690 0.4664 +vn 0.2941 0.8048 0.5156 +vn 0.4756 0.4512 0.7551 +vn -0.2941 0.8048 0.5156 +vn -0.1653 0.8690 0.4664 +vn -0.4221 0.5591 0.7136 +vn -0.4756 0.4512 0.7551 +vn -0.2542 0.6512 0.7151 +vn -0.5563 0.7759 0.2974 +vn -0.2140 0.9014 0.3764 +vn 0.0794 0.7092 0.7005 +vn 0.2140 0.9014 0.3764 +vn 0.5563 0.7759 0.2974 +vn 0.2542 0.6512 0.7151 +vn -0.0794 0.7092 0.7005 +vn -0.5416 0.0466 0.8394 +vn -0.9486 0.1144 0.2950 +vn -0.8572 0.4571 0.2373 +vn -0.5241 0.3505 0.7761 +vn 0.8572 0.4571 0.2373 +vn 0.9486 0.1144 0.2950 +vn 0.5416 0.0466 0.8394 +vn 0.5241 0.3505 0.7761 +vn -0.0686 -0.3762 0.9240 +vn -0.3293 -0.5899 0.7373 +vn -0.8190 -0.2642 0.5093 +vn -0.4092 -0.1702 0.8964 +vn 0.8190 -0.2642 0.5093 +vn 0.3293 -0.5899 0.7373 +vn 0.0686 -0.3762 0.9240 +vn 0.4092 -0.1702 0.8964 +vn 0.5220 -0.4493 0.7251 +vn 0.4795 -0.6141 0.6268 +vn 0.2706 -0.6499 0.7102 +vn 0.3580 -0.4611 0.8119 +vn -0.2706 -0.6499 0.7102 +vn -0.4795 -0.6141 0.6268 +vn -0.5220 -0.4493 0.7251 +vn -0.3580 -0.4611 0.8119 +vn 0.6248 -0.3986 0.6714 +vn 0.6587 -0.3369 0.6727 +vn 0.6943 -0.4801 0.5362 +vn 0.6141 -0.5531 0.5630 +vn -0.6943 -0.4801 0.5362 +vn -0.6587 -0.3369 0.6727 +vn -0.6248 -0.3986 0.6714 +vn -0.6141 -0.5531 0.5630 +vn 0.7007 -0.7122 0.0431 +vn 0.5427 -0.8336 0.1032 +vn 0.8132 -0.5499 0.1903 +vn 0.8700 -0.4877 -0.0722 +vn -0.8133 -0.5499 0.1903 +vn -0.5427 -0.8336 0.1032 +vn -0.7007 -0.7122 0.0431 +vn -0.8700 -0.4877 -0.0722 +vn -0.0275 -0.6205 0.7837 +vn -0.0000 -0.7270 0.6867 +vn 0.1214 0.2350 0.9644 +vn 0.1592 0.3008 0.9403 +vn -0.1214 0.2350 0.9644 +vn 0.0275 -0.6205 0.7837 +vn -0.1592 0.3008 0.9403 +vn 0.9629 -0.2654 0.0480 +vn 0.8749 -0.4801 0.0636 +vn 0.9101 -0.3839 -0.1561 +vn 0.9621 -0.2621 -0.0750 +vn -0.9101 -0.3839 -0.1561 +vn -0.8749 -0.4801 0.0636 +vn -0.9629 -0.2654 0.0480 +vn -0.9621 -0.2621 -0.0750 +vn 0.2189 0.6396 0.7369 +vn 0.5025 -0.1434 0.8526 +vn 0.3438 0.0039 0.9391 +vn -0.3999 0.7149 0.5736 +vn -0.3438 0.0039 0.9391 +vn -0.5025 -0.1434 0.8526 +vn -0.2189 0.6396 0.7369 +vn 0.3999 0.7149 0.5736 +vn 0.1416 0.7362 0.6617 +vn 0.0708 0.9263 0.3701 +vn 0.1860 0.9347 0.3027 +vn 0.2524 0.7846 0.5662 +vn -0.1860 0.9347 0.3027 +vn -0.0708 0.9263 0.3701 +vn -0.1416 0.7362 0.6617 +vn -0.2524 0.7846 0.5662 +vn 0.6620 -0.0533 0.7476 +vn 0.7321 0.0500 0.6793 +vn 0.6702 0.2898 0.6833 +vn 0.6793 0.3834 0.6258 +vn -0.6702 0.2898 0.6832 +vn -0.7321 0.0500 0.6793 +vn -0.6620 -0.0533 0.7476 +vn -0.6793 0.3834 0.6258 +vn 0.6671 0.4915 0.5599 +vn 0.7185 0.3229 0.6161 +vn 0.5895 0.2524 0.7673 +vn 0.4953 0.5448 0.6767 +vn -0.5895 0.2524 0.7673 +vn -0.7185 0.3229 0.6161 +vn -0.6671 0.4915 0.5599 +vn -0.4953 0.5448 0.6767 +vn 0.7462 -0.5303 0.4026 +vn 0.8459 -0.4455 0.2933 +vn 0.9177 -0.3399 0.2058 +vn 0.8790 -0.4117 0.2408 +vn -0.9177 -0.3399 0.2058 +vn -0.8459 -0.4455 0.2933 +vn -0.7462 -0.5303 0.4026 +vn -0.8790 -0.4117 0.2408 +vn 0.6539 -0.3645 0.6630 +vn 0.7818 -0.3994 0.4789 +vn 0.6662 -0.4851 0.5664 +vn 0.6220 -0.4608 0.6331 +vn -0.6662 -0.4851 0.5664 +vn -0.7818 -0.3994 0.4789 +vn -0.6539 -0.3645 0.6630 +vn -0.6220 -0.4608 0.6331 +vn 0.5746 -0.3515 0.7391 +vn 0.5455 -0.3604 0.7567 +vn 0.6377 -0.4508 0.6246 +vn 0.6737 -0.4640 0.5752 +vn -0.6377 -0.4508 0.6246 +vn -0.5455 -0.3604 0.7567 +vn -0.5746 -0.3515 0.7391 +vn -0.6737 -0.4640 0.5752 +vn 0.9892 -0.1431 -0.0332 +vn 0.9361 -0.3355 0.1060 +vn 0.8935 -0.2348 0.3827 +vn 0.9914 0.1179 0.0563 +vn -0.8935 -0.2348 0.3827 +vn -0.9361 -0.3355 0.1060 +vn -0.9892 -0.1431 -0.0332 +vn -0.9914 0.1179 0.0563 +vn 0.9423 -0.3297 -0.0577 +vn 0.9147 -0.3752 -0.1502 +vn 0.9298 -0.3679 -0.0089 +vn 0.9130 -0.4078 0.0129 +vn -0.9298 -0.3679 -0.0089 +vn -0.9147 -0.3752 -0.1502 +vn -0.9423 -0.3297 -0.0577 +vn -0.9130 -0.4078 0.0129 +vn 0.9354 -0.3331 -0.1189 +vn 0.9649 -0.0182 0.2620 +vn 0.9647 -0.2265 0.1348 +vn -0.9646 -0.2265 0.1348 +vn -0.9649 -0.0182 0.2620 +vn -0.9354 -0.3331 -0.1189 +vn 0.7120 -0.5876 0.3845 +vn 0.7337 -0.5770 0.3589 +vn 0.6887 -0.5163 0.5090 +vn 0.6830 -0.4932 0.5387 +vn -0.6887 -0.5163 0.5090 +vn -0.7337 -0.5770 0.3589 +vn -0.7120 -0.5876 0.3845 +vn -0.6830 -0.4932 0.5387 +vn 0.7388 -0.5816 0.3406 +vn 0.7333 -0.6043 0.3116 +vn 0.6509 -0.5579 0.5149 +vn 0.6816 -0.5313 0.5030 +vn -0.6509 -0.5579 0.5149 +vn -0.7333 -0.6043 0.3116 +vn -0.7388 -0.5816 0.3406 +vn -0.6816 -0.5313 0.5030 +vn 0.7243 -0.6494 0.2318 +vn 0.8306 -0.5336 0.1593 +vn 0.6951 -0.4454 0.5644 +vn 0.6174 -0.5989 0.5101 +vn -0.6951 -0.4454 0.5644 +vn -0.8306 -0.5336 0.1593 +vn -0.7243 -0.6494 0.2318 +vn -0.6174 -0.5989 0.5101 +vn 0.6811 0.6657 0.3050 +vn 0.4426 0.8229 0.3563 +vn 0.4269 0.7886 0.4425 +vn 0.6184 0.4156 0.6670 +vn -0.4269 0.7886 0.4425 +vn -0.4426 0.8229 0.3563 +vn -0.6811 0.6657 0.3050 +vn -0.6184 0.4156 0.6670 +vn 0.7428 0.5039 0.4407 +vn 0.8473 0.1348 0.5137 +vn 0.8098 0.1403 0.5697 +vn 0.7151 0.4634 0.5233 +vn -0.8098 0.1403 0.5697 +vn -0.8473 0.1348 0.5137 +vn -0.7428 0.5039 0.4407 +vn -0.7151 0.4634 0.5233 +vn 0.8087 -0.3438 0.4774 +vn 0.9084 0.0479 0.4153 +vn 0.6406 0.3517 0.6826 +vn 0.7902 -0.3805 0.4805 +vn -0.6406 0.3517 0.6826 +vn -0.9084 0.0479 0.4153 +vn -0.8087 -0.3438 0.4774 +vn -0.7902 -0.3805 0.4805 +vn 0.1493 0.9765 0.1554 +vn -0.0046 0.9804 0.1972 +vn -0.0662 0.9281 0.3663 +vn -0.0823 0.9430 0.3225 +vn 0.0662 0.9281 0.3663 +vn 0.0046 0.9804 0.1972 +vn -0.1493 0.9765 0.1554 +vn 0.0823 0.9430 0.3225 +vn 0.5698 -0.6825 0.4576 +vn 0.6797 -0.6052 0.4145 +vn 0.6792 -0.4446 0.5840 +vn 0.6092 -0.4742 0.6356 +vn -0.6792 -0.4446 0.5840 +vn -0.6796 -0.6052 0.4145 +vn -0.5698 -0.6825 0.4576 +vn -0.6092 -0.4742 0.6356 +vn 0.1434 -0.8406 0.5224 +vn 0.4106 -0.7628 0.4995 +vn 0.4658 -0.6095 0.6415 +vn 0.2145 -0.6668 0.7137 +vn -0.4658 -0.6095 0.6414 +vn -0.4106 -0.7628 0.4995 +vn -0.1434 -0.8406 0.5224 +vn -0.2145 -0.6668 0.7137 +vn -0.9542 -0.2910 -0.0694 +vn -0.5829 -0.7510 0.3104 +vn -0.1380 -0.4256 0.8943 +vn -0.3713 -0.1545 0.9156 +vn 0.1380 -0.4256 0.8943 +vn 0.5829 -0.7510 0.3104 +vn 0.9542 -0.2910 -0.0694 +vn 0.3713 -0.1545 0.9156 +vn -0.8679 0.4114 -0.2784 +vn -0.9569 0.1243 -0.2625 +vn -0.3893 0.0699 0.9185 +vn -0.2116 0.2604 0.9420 +vn 0.3893 0.0699 0.9185 +vn 0.9569 0.1243 -0.2625 +vn 0.8679 0.4114 -0.2784 +vn 0.2116 0.2604 0.9420 +vn -0.4099 0.9112 0.0419 +vn -0.6783 0.7208 -0.1430 +vn -0.0276 0.4645 0.8851 +vn 0.1209 0.6487 0.7513 +vn 0.0276 0.4645 0.8851 +vn 0.6783 0.7208 -0.1430 +vn 0.4099 0.9112 0.0419 +vn -0.1209 0.6487 0.7513 +vn 0.0860 0.9649 0.2483 +vn -0.0841 0.9794 0.1834 +vn 0.3082 0.7442 0.5926 +vn 0.2655 0.8263 0.4968 +vn -0.3082 0.7442 0.5926 +vn 0.0841 0.9794 0.1834 +vn -0.0860 0.9649 0.2483 +vn -0.2655 0.8263 0.4968 +vn 0.2574 0.1434 0.9556 +vn 0.2381 0.1169 0.9642 +vn 0.1210 0.1419 0.9825 +vn 0.1726 0.0265 0.9846 +vn -0.1210 0.1419 0.9825 +vn -0.2381 0.1169 0.9642 +vn -0.2574 0.1434 0.9556 +vn -0.1726 0.0265 0.9846 +vn 0.2675 0.0341 0.9630 +vn 0.2930 0.1243 0.9480 +vn 0.4064 0.0313 0.9132 +vn 0.3320 0.0177 0.9431 +vn -0.4064 0.0313 0.9132 +vn -0.2930 0.1243 0.9480 +vn -0.2675 0.0341 0.9630 +vn -0.3320 0.0177 0.9431 +vn 0.3485 0.0044 0.9373 +vn 0.4045 -0.0499 0.9132 +vn 0.3634 -0.0903 0.9272 +vn 0.3158 0.0103 0.9488 +vn -0.3634 -0.0903 0.9272 +vn -0.4045 -0.0499 0.9132 +vn -0.3485 0.0044 0.9373 +vn -0.3158 0.0103 0.9488 +vn 0.2438 0.0400 0.9690 +vn 0.3102 -0.1465 0.9393 +vn 0.4165 -0.0288 0.9087 +vn 0.3278 0.1814 0.9272 +vn -0.4165 -0.0288 0.9087 +vn -0.3102 -0.1465 0.9393 +vn -0.2438 0.0400 0.9690 +vn -0.3278 0.1814 0.9272 +vn 0.4524 0.2283 0.8621 +vn 0.5000 0.0443 0.8649 +vn 0.3320 0.1101 0.9368 +vn 0.3219 0.3049 0.8963 +vn -0.3320 0.1101 0.9368 +vn -0.5000 0.0443 0.8649 +vn -0.4524 0.2283 0.8621 +vn -0.3219 0.3049 0.8963 +vn 0.4596 -0.1697 0.8718 +vn 0.3694 -0.0290 0.9288 +vn 0.3783 0.0030 0.9257 +vn 0.4989 -0.1092 0.8598 +vn -0.3783 0.0030 0.9257 +vn -0.3694 -0.0290 0.9288 +vn -0.4596 -0.1697 0.8718 +vn -0.4989 -0.1092 0.8598 +vn 0.3907 -0.1939 0.8999 +vn 0.3001 -0.1973 0.9333 +vn 0.2293 -0.0197 0.9732 +vn 0.3158 -0.0334 0.9482 +vn -0.2293 -0.0197 0.9732 +vn -0.3001 -0.1973 0.9333 +vn -0.3907 -0.1939 0.8999 +vn -0.3158 -0.0334 0.9482 +vn 0.1769 0.1801 0.9676 +vn 0.1284 -0.0032 0.9917 +vn 0.2247 -0.1899 0.9558 +vn 0.3179 -0.0537 0.9466 +vn -0.2247 -0.1899 0.9558 +vn -0.1284 -0.0032 0.9917 +vn -0.1769 0.1801 0.9676 +vn -0.3179 -0.0537 0.9466 +vn -0.2447 0.7696 0.5897 +vn -0.1043 0.6828 0.7231 +vn -0.0510 0.4334 0.8998 +vn -0.0186 0.3169 0.9483 +vn 0.0510 0.4334 0.8998 +vn 0.1043 0.6828 0.7231 +vn 0.2447 0.7696 0.5897 +vn 0.0186 0.3169 0.9483 +vn 0.5827 0.1008 0.8064 +vn 0.5408 0.0016 0.8412 +vn 0.4163 0.1692 0.8933 +vn 0.4931 0.2814 0.8232 +vn -0.4163 0.1692 0.8933 +vn -0.5408 0.0016 0.8412 +vn -0.5827 0.1008 0.8064 +vn -0.4931 0.2814 0.8232 +vn 0.4316 -0.1456 0.8902 +vn 0.4343 -0.1822 0.8822 +vn 0.4757 -0.1189 0.8715 +vn 0.4741 -0.0525 0.8789 +vn -0.4757 -0.1189 0.8715 +vn -0.4343 -0.1822 0.8822 +vn -0.4316 -0.1456 0.8902 +vn -0.4741 -0.0525 0.8789 +vn 0.5201 -0.0786 0.8505 +vn 0.5090 -0.1171 0.8528 +vn 0.4391 -0.2271 0.8692 +vn 0.4623 -0.1564 0.8728 +vn -0.4391 -0.2271 0.8692 +vn -0.5090 -0.1171 0.8528 +vn -0.5201 -0.0786 0.8505 +vn -0.4623 -0.1564 0.8728 +vn 0.4584 0.2779 0.8442 +vn 0.4637 0.2832 0.8395 +vn 0.5251 0.1076 0.8442 +vn 0.5149 0.1364 0.8463 +vn -0.5251 0.1076 0.8442 +vn -0.4637 0.2832 0.8395 +vn -0.4584 0.2779 0.8442 +vn -0.5149 0.1364 0.8463 +vn 0.4182 0.3033 0.8562 +vn 0.3713 0.4206 0.8278 +vn 0.3842 0.3492 0.8547 +vn -0.3842 0.3492 0.8547 +vn -0.3713 0.4206 0.8278 +vn -0.4182 0.3033 0.8562 +vn 0.2752 -0.9606 0.0402 +vn 0.0743 -0.9972 0.0065 +vn -0.2865 -0.6869 -0.6679 +vn -0.2351 -0.6646 -0.7092 +vn 0.2865 -0.6869 -0.6679 +vn -0.0743 -0.9972 0.0065 +vn -0.2752 -0.9606 0.0402 +vn 0.2351 -0.6646 -0.7092 +vn 0.6745 -0.6981 0.2403 +vn 0.4664 -0.8799 0.0914 +vn 0.0273 -0.6492 -0.7601 +vn 0.3356 -0.6177 -0.7112 +vn -0.0273 -0.6492 -0.7601 +vn -0.4664 -0.8799 0.0914 +vn -0.6745 -0.6981 0.2403 +vn -0.3356 -0.6177 -0.7112 +vn 0.8891 -0.0884 0.4492 +vn 0.8268 -0.3823 0.4126 +vn 0.8267 -0.4481 -0.3404 +vn 0.9932 -0.0290 -0.1131 +vn -0.8267 -0.4481 -0.3404 +vn -0.8268 -0.3823 0.4126 +vn -0.8891 -0.0884 0.4492 +vn -0.9932 -0.0290 -0.1131 +vn 0.6766 0.7300 0.0964 +vn 0.8915 0.3241 0.3165 +vn 0.9286 0.2822 -0.2409 +vn 0.4775 0.6112 -0.6312 +vn -0.9286 0.2822 -0.2409 +vn -0.8915 0.3241 0.3165 +vn -0.6766 0.7300 0.0964 +vn -0.4775 0.6112 -0.6312 +vn -0.2459 0.9629 -0.1115 +vn 0.0806 0.9919 -0.0978 +vn -0.1731 0.5767 -0.7984 +vn -0.4004 0.5448 -0.7368 +vn 0.1731 0.5767 -0.7984 +vn -0.0806 0.9919 -0.0978 +vn 0.2459 0.9629 -0.1115 +vn 0.4004 0.5448 -0.7368 +vn -0.4907 0.8712 0.0129 +vn -0.3626 0.9299 -0.0613 +vn -0.5145 0.5403 -0.6658 +vn -0.5531 0.5711 -0.6066 +vn 0.5145 0.5403 -0.6658 +vn 0.3626 0.9299 -0.0613 +vn 0.4907 0.8712 0.0129 +vn 0.5531 0.5711 -0.6066 +vn -0.4742 0.0784 -0.8769 +vn -0.4415 -0.1127 -0.8901 +vn -0.3900 -0.1353 -0.9108 +vn -0.4209 0.0836 -0.9032 +vn 0.3900 -0.1353 -0.9108 +vn 0.4415 -0.1127 -0.8901 +vn 0.4742 0.0784 -0.8769 +vn 0.4209 0.0836 -0.9032 +vn -0.3249 0.0745 -0.9428 +vn -0.1883 0.0705 -0.9796 +vn -0.0850 -0.1226 -0.9888 +vn -0.2465 -0.1132 -0.9625 +vn 0.0850 -0.1226 -0.9888 +vn 0.1883 0.0705 -0.9796 +vn 0.3249 0.0745 -0.9428 +vn 0.2465 -0.1132 -0.9625 +vn 0.0940 0.1248 -0.9877 +vn 0.8215 0.1013 -0.5612 +vn 0.2027 -0.1366 -0.9697 +vn -0.2027 -0.1366 -0.9697 +vn -0.8215 0.1014 -0.5612 +vn -0.0940 0.1248 -0.9877 +vn 0.2613 0.7349 -0.6258 +vn -0.1992 0.9792 -0.0379 +vn -0.6616 0.7467 0.0689 +vn -0.5331 0.6611 -0.5280 +vn 0.6616 0.7467 0.0689 +vn 0.1992 0.9792 -0.0379 +vn -0.2613 0.7349 -0.6258 +vn 0.5331 0.6611 -0.5280 +vn 0.5925 -0.1146 -0.7974 +vn 0.1350 0.0215 -0.9906 +vn 0.1295 -0.2589 -0.9572 +vn 0.4466 -0.3788 -0.8106 +vn -0.1295 -0.2589 -0.9572 +vn -0.1350 0.0215 -0.9906 +vn -0.5925 -0.1146 -0.7974 +vn -0.4466 -0.3788 -0.8106 +vn -0.1199 -0.9705 -0.2090 +vn 0.0603 -0.7863 -0.6149 +vn -0.1223 -0.7503 -0.6497 +vn -0.1446 -0.9850 -0.0941 +vn 0.1223 -0.7503 -0.6497 +vn -0.0603 -0.7863 -0.6149 +vn 0.1199 -0.9705 -0.2090 +vn 0.1446 -0.9850 -0.0941 +usemtl None +s off +f 47/1/1 509/2/1 1513/3/1 508/4/1 +f 509/2/2 1/5/2 510/6/2 1513/3/2 +f 1513/3/3 510/6/3 3/7/3 511/8/3 +f 508/4/4 1513/3/4 511/8/4 45/9/4 +f 4/10/5 513/11/5 1514/12/5 512/13/5 +f 513/11/6 2/14/6 514/15/6 1514/12/6 +f 1514/12/7 514/15/7 48/16/7 515/17/7 +f 512/13/8 1514/12/8 515/17/8 46/18/8 +f 45/9/9 511/8/9 1515/19/9 516/20/9 +f 511/8/10 3/7/10 517/21/10 1515/19/10 +f 1515/19/11 517/21/11 5/22/11 518/23/11 +f 516/20/12 1515/19/12 518/23/12 43/24/12 +f 6/25/13 520/26/13 1516/27/13 519/28/13 +f 520/26/14 4/10/14 512/13/14 1516/27/14 +f 1516/27/15 512/13/15 46/18/15 521/29/15 +f 519/28/16 1516/27/16 521/29/16 44/30/16 +f 3/7/17 522/31/17 1517/32/17 517/21/17 +f 522/31/18 9/33/18 523/34/18 1517/32/18 +f 1517/32/19 523/34/19 7/35/19 524/36/19 +f 517/21/20 1517/32/20 524/36/20 5/22/20 +f 8/37/21 526/38/21 1518/39/21 525/40/21 +f 526/38/22 10/41/22 527/42/22 1518/39/22 +f 1518/39/23 527/42/23 4/10/23 520/26/23 +f 525/40/24 1518/39/24 520/26/24 6/25/24 +f 1/5/25 528/43/25 1519/44/25 510/6/25 +f 528/43/26 11/45/26 529/46/26 1519/44/26 +f 1519/44/27 529/46/27 9/33/27 522/31/27 +f 510/6/28 1519/44/28 522/31/28 3/7/28 +f 10/41/29 530/47/29 1520/48/29 527/42/29 +f 530/47/30 12/49/30 531/50/30 1520/48/30 +f 1520/48/31 531/50/31 2/14/31 513/11/31 +f 527/42/32 1520/48/32 513/11/32 4/10/32 +f 11/45/33 532/51/33 1521/52/33 529/46/33 +f 532/51/34 13/53/34 533/54/34 1521/52/34 +f 1521/52/35 533/54/35 15/55/35 534/56/35 +f 529/46/36 1521/52/36 534/56/36 9/33/36 +f 16/57/37 536/58/37 1522/59/37 535/60/37 +f 536/58/38 14/61/38 537/62/38 1522/59/38 +f 1522/59/39 537/62/39 12/49/39 530/47/39 +f 535/60/40 1522/59/40 530/47/40 10/41/40 +f 9/33/41 534/56/41 1523/63/41 523/34/41 +f 534/56/42 15/55/42 538/64/42 1523/63/42 +f 1523/63/43 538/64/43 17/65/43 539/66/43 +f 523/34/44 1523/63/44 539/66/44 7/35/44 +f 18/67/45 541/68/45 1524/69/45 540/70/45 +f 541/68/46 16/57/46 535/60/46 1524/69/46 +f 1524/69/47 535/60/47 10/41/47 526/38/47 +f 540/70/48 1524/69/48 526/38/48 8/37/48 +f 15/55/49 542/71/49 1525/72/49 538/64/49 +f 542/71/50 21/73/50 543/74/50 1525/72/50 +f 1525/72/51 543/74/51 19/75/51 544/76/51 +f 538/64/52 1525/72/52 544/76/52 17/65/52 +f 20/77/53 546/78/53 1526/79/53 545/80/53 +f 546/78/54 22/81/54 547/82/54 1526/79/54 +f 1526/79/55 547/82/55 16/57/55 541/68/55 +f 545/80/56 1526/79/56 541/68/56 18/67/56 +f 13/53/57 548/83/57 1527/84/57 533/54/57 +f 548/83/58 23/85/58 549/86/58 1527/84/58 +f 1527/84/59 549/86/59 21/73/59 542/71/59 +f 533/54/60 1527/84/60 542/71/60 15/55/60 +f 22/81/61 550/87/61 1528/88/61 547/82/61 +f 550/87/62 24/89/62 551/90/62 1528/88/62 +f 1528/88/63 551/90/63 14/61/63 536/58/63 +f 547/82/64 1528/88/64 536/58/64 16/57/64 +f 23/85/65 552/91/65 1529/92/65 549/86/65 +f 552/91/66 25/93/66 553/94/66 1529/92/66 +f 1529/92/67 553/94/67 27/95/67 554/96/67 +f 549/86/68 1529/92/68 554/96/68 21/73/68 +f 28/97/69 556/98/69 1530/99/69 555/100/69 +f 556/98/70 26/101/70 557/102/70 1530/99/70 +f 1530/99/71 557/102/71 24/89/71 550/87/71 +f 555/100/72 1530/99/72 550/87/72 22/81/72 +f 21/73/73 554/96/73 1531/103/73 543/74/73 +f 554/96/74 27/95/74 558/104/74 1531/103/74 +f 1531/103/75 558/104/75 29/105/75 559/106/75 +f 543/74/76 1531/103/76 559/106/76 19/75/76 +f 30/107/77 561/108/77 1532/109/77 560/110/77 +f 561/108/78 28/97/78 555/100/78 1532/109/78 +f 1532/109/79 555/100/79 22/81/79 546/78/79 +f 560/110/80 1532/109/80 546/78/80 20/77/80 +f 27/95/81 562/111/81 1533/112/81 558/104/81 +f 562/111/82 33/113/82 563/114/82 1533/112/82 +f 1533/112/83 563/114/83 31/115/83 564/116/83 +f 558/104/84 1533/112/84 564/116/84 29/105/84 +f 32/117/85 566/118/85 1534/119/85 565/120/85 +f 566/118/86 34/121/86 567/122/86 1534/119/86 +f 1534/119/87 567/122/87 28/97/87 561/108/87 +f 565/120/88 1534/119/88 561/108/88 30/107/88 +f 25/93/89 568/123/89 1535/124/89 553/94/89 +f 568/123/90 35/125/90 569/126/90 1535/124/90 +f 1535/124/91 569/126/91 33/113/91 562/111/91 +f 553/94/92 1535/124/92 562/111/92 27/95/92 +f 34/121/93 570/127/93 1536/128/93 567/122/93 +f 570/127/94 36/129/94 571/130/94 1536/128/94 +f 1536/128/95 571/130/95 26/101/95 556/98/95 +f 567/122/96 1536/128/96 556/98/96 28/97/96 +f 35/125/97 572/131/97 1537/132/97 569/126/97 +f 572/131/98 37/133/98 573/134/98 1537/132/98 +f 1537/132/99 573/134/99 39/135/99 574/136/99 +f 569/126/100 1537/132/100 574/136/100 33/113/100 +f 40/137/101 576/138/101 1538/139/101 575/140/101 +f 576/138/102 38/141/102 577/142/102 1538/139/102 +f 1538/139/103 577/142/103 36/129/103 570/127/103 +f 575/140/104 1538/139/104 570/127/104 34/121/104 +f 33/113/105 574/136/105 1539/143/105 563/114/105 +f 574/136/106 39/135/106 578/144/106 1539/143/106 +f 1539/143/107 578/144/107 41/145/107 579/146/107 +f 563/114/108 1539/143/108 579/146/108 31/115/108 +f 42/147/109 581/148/109 1540/149/109 580/150/109 +f 581/148/110 40/137/110 575/140/110 1540/149/110 +f 1540/149/111 575/140/111 34/121/111 566/118/111 +f 580/150/112 1540/149/112 566/118/112 32/117/112 +f 39/135/113 582/151/113 1541/152/113 578/144/113 +f 582/151/114 45/9/114 516/20/114 1541/152/114 +f 1541/152/115 516/20/115 43/24/115 583/153/115 +f 578/144/116 1541/152/116 583/153/116 41/145/116 +f 44/30/117 521/29/117 1542/154/117 584/155/117 +f 521/29/118 46/18/118 585/156/118 1542/154/118 +f 1542/154/119 585/156/119 40/137/119 581/148/119 +f 584/155/120 1542/154/120 581/148/120 42/147/120 +f 37/133/121 586/157/121 1543/158/121 573/134/121 +f 586/157/122 47/1/122 508/4/122 1543/158/122 +f 1543/158/123 508/4/123 45/9/123 582/151/123 +f 573/134/124 1543/158/124 582/151/124 39/135/124 +f 46/18/125 515/17/125 1544/159/125 585/156/125 +f 515/17/126 48/16/126 587/160/126 1544/159/126 +f 1544/159/127 587/160/127 38/141/127 576/138/127 +f 585/156/128 1544/159/128 576/138/128 40/137/128 +f 47/1/129 586/157/129 1545/161/129 588/162/129 +f 586/157/130 37/133/130 589/163/130 1545/161/130 +f 1545/161/131 589/163/131 51/164/131 590/165/131 +f 588/162/132 1545/161/132 590/165/132 49/166/132 +f 52/167/133 592/168/133 1546/169/133 591/170/133 +f 592/168/134 38/141/134 587/160/134 1546/169/134 +f 1546/169/135 587/160/135 48/16/135 593/171/135 +f 591/170/136 1546/169/136 593/171/136 50/172/136 +f 37/133/137 572/131/137 1547/173/137 589/163/137 +f 572/131/138 35/125/138 594/174/138 1547/173/138 +f 1547/173/139 594/174/139 53/175/139 595/176/139 +f 589/163/140 1547/173/140 595/176/140 51/164/140 +f 54/177/141 597/178/141 1548/179/141 596/180/141 +f 597/178/142 36/129/142 577/142/142 1548/179/142 +f 1548/179/143 577/142/143 38/141/143 592/168/143 +f 596/180/144 1548/179/144 592/168/144 52/167/144 +f 35/125/145 568/123/145 1549/181/145 594/174/145 +f 568/123/146 25/93/146 598/182/146 1549/181/146 +f 1549/181/147 598/182/147 55/183/147 599/184/147 +f 594/174/148 1549/181/148 599/184/148 53/175/148 +f 56/185/149 601/186/149 1550/187/149 600/188/149 +f 601/186/150 26/101/150 571/130/150 1550/187/150 +f 1550/187/151 571/130/151 36/129/151 597/178/151 +f 600/188/152 1550/187/152 597/178/152 54/177/152 +f 25/93/153 552/91/153 1551/189/153 598/182/153 +f 552/91/154 23/85/154 602/190/154 1551/189/154 +f 1551/189/155 602/190/155 57/191/155 603/192/155 +f 598/182/156 1551/189/156 603/192/156 55/183/156 +f 58/193/157 605/194/157 1552/195/157 604/196/157 +f 605/194/158 24/89/158 557/102/158 1552/195/158 +f 1552/195/159 557/102/159 26/101/159 601/186/159 +f 604/196/160 1552/195/160 601/186/160 56/185/160 +f 23/85/161 548/83/161 1553/197/161 602/190/161 +f 548/83/162 13/53/162 606/198/162 1553/197/162 +f 1553/197/163 606/198/163 59/199/163 607/200/163 +f 602/190/164 1553/197/164 607/200/164 57/191/164 +f 60/201/165 609/202/165 1554/203/165 608/204/165 +f 609/202/166 14/61/166 551/90/166 1554/203/166 +f 1554/203/167 551/90/167 24/89/167 605/194/167 +f 608/204/168 1554/203/168 605/194/168 58/193/168 +f 13/53/169 532/51/169 1555/205/169 606/198/169 +f 532/51/170 11/45/170 610/206/170 1555/205/170 +f 1555/205/171 610/206/171 63/207/171 611/208/171 +f 606/198/172 1555/205/172 611/208/172 59/199/172 +f 64/209/173 613/210/173 1556/211/173 612/212/173 +f 613/210/174 12/49/174 537/62/174 1556/211/174 +f 1556/211/175 537/62/175 14/61/175 609/202/175 +f 612/212/176 1556/211/176 609/202/176 60/201/176 +f 11/45/177 528/43/177 1557/213/177 610/206/177 +f 528/43/178 1/5/178 614/214/178 1557/213/178 +f 1557/213/179 614/214/179 65/215/179 615/216/179 +f 610/206/180 1557/213/180 615/216/180 63/207/180 +f 66/217/181 617/218/181 1558/219/181 616/220/181 +f 617/218/182 2/14/182 531/50/182 1558/219/182 +f 1558/219/183 531/50/183 12/49/183 613/210/183 +f 616/220/184 1558/219/184 613/210/184 64/209/184 +f 1/5/185 509/2/185 1559/221/185 614/214/185 +f 509/2/186 47/1/186 588/162/186 1559/221/186 +f 1559/221/187 588/162/187 49/166/187 618/222/187 +f 614/214/188 1559/221/188 618/222/188 65/215/188 +f 50/172/189 593/171/189 1560/223/189 619/224/189 +f 593/171/190 48/16/190 514/15/190 1560/223/190 +f 1560/223/191 514/15/191 2/14/191 617/218/191 +f 619/224/192 1560/223/192 617/218/192 66/217/192 +f 61/225/193 621/226/193 1561/227/193 620/228/193 +f 65/215/194 618/222/194 1561/227/194 621/226/194 +f 49/166/195 620/228/195 1561/227/195 618/222/195 +f 50/172/196 619/224/196 1562/229/196 622/230/196 +f 66/217/197 623/231/197 1562/229/197 619/224/197 +f 62/232/198 622/230/198 1562/229/198 623/231/198 +f 63/207/199 615/216/199 1563/233/199 624/234/199 +f 65/215/200 621/226/200 1563/233/200 615/216/200 +f 61/225/201 624/234/201 1563/233/201 621/226/201 +f 62/232/202 623/231/202 1564/235/202 625/236/202 +f 66/217/203 616/220/203 1564/235/203 623/231/203 +f 64/209/204 625/236/204 1564/235/204 616/220/204 +f 61/225/205 626/237/205 1565/238/205 624/234/205 +f 59/199/206 611/208/206 1565/238/206 626/237/206 +f 63/207/207 624/234/207 1565/238/207 611/208/207 +f 64/209/208 612/212/208 1566/239/208 625/236/208 +f 60/201/209 627/240/209 1566/239/209 612/212/209 +f 62/232/210 625/236/210 1566/239/210 627/240/210 +f 61/225/211 628/241/211 1567/242/211 626/237/211 +f 57/191/212 607/200/212 1567/242/212 628/241/212 +f 59/199/213 626/237/213 1567/242/213 607/200/213 +f 60/201/214 608/204/214 1568/243/214 627/240/214 +f 58/193/215 629/244/215 1568/243/215 608/204/215 +f 62/232/216 627/240/216 1568/243/216 629/244/216 +f 61/225/217 630/245/217 1569/246/217 628/241/217 +f 55/183/218 603/192/218 1569/246/218 630/245/218 +f 57/191/219 628/241/219 1569/246/219 603/192/219 +f 58/193/220 604/196/220 1570/247/220 629/244/220 +f 56/185/221 631/248/221 1570/247/221 604/196/221 +f 62/232/222 629/244/222 1570/247/222 631/248/222 +f 61/225/223 632/249/223 1571/250/223 630/245/223 +f 53/175/224 599/184/224 1571/250/224 632/249/224 +f 55/183/225 630/245/225 1571/250/225 599/184/225 +f 56/185/226 600/188/226 1572/251/226 631/248/226 +f 54/177/227 633/252/227 1572/251/227 600/188/227 +f 62/232/228 631/248/228 1572/251/228 633/252/228 +f 61/225/229 634/253/229 1573/254/229 632/249/229 +f 51/164/230 595/176/230 1573/254/230 634/253/230 +f 53/175/231 632/249/231 1573/254/231 595/176/231 +f 54/177/232 596/180/232 1574/255/232 633/252/232 +f 52/167/233 635/256/233 1574/255/233 596/180/233 +f 62/232/234 633/252/234 1574/255/234 635/256/234 +f 61/225/235 620/228/235 1575/257/235 634/253/235 +f 49/166/236 590/165/236 1575/257/236 620/228/236 +f 51/164/237 634/253/237 1575/257/237 590/165/237 +f 52/167/238 591/170/238 1576/258/238 635/256/238 +f 50/172/239 622/230/239 1576/258/239 591/170/239 +f 62/232/240 635/256/240 1576/258/240 622/230/240 +f 89/259/241 637/260/241 1577/261/241 636/262/241 +f 637/260/242 174/263/242 638/264/242 1577/261/242 +f 1577/261/243 638/264/243 176/265/243 639/266/243 +f 636/262/244 1577/261/244 639/266/244 91/267/244 +f 176/265/245 640/268/245 1578/269/245 639/266/245 +f 640/268/246 175/270/246 641/271/246 1578/269/246 +f 1578/269/247 641/271/247 90/272/247 642/273/247 +f 639/266/248 1578/269/248 642/273/248 91/267/248 +f 87/274/249 644/275/249 1579/276/249 643/277/249 +f 644/275/250 172/278/250 645/279/250 1579/276/250 +f 1579/276/251 645/279/251 174/263/251 637/260/251 +f 643/277/252 1579/276/252 637/260/252 89/259/252 +f 175/270/253 646/280/253 1580/281/253 641/271/253 +f 646/280/254 173/282/254 647/283/254 1580/281/254 +f 1580/281/255 647/283/255 88/284/255 648/285/255 +f 641/271/256 1580/281/256 648/285/256 90/272/256 +f 85/286/257 650/287/257 1581/288/257 649/289/257 +f 650/287/258 170/290/258 651/291/258 1581/288/258 +f 1581/288/259 651/291/259 172/278/259 644/275/259 +f 649/289/260 1581/288/260 644/275/260 87/274/260 +f 173/282/261 652/292/261 1582/293/261 647/283/261 +f 652/292/262 171/294/262 653/295/262 1582/293/262 +f 1582/293/263 653/295/263 86/296/263 654/297/263 +f 647/283/264 1582/293/264 654/297/264 88/284/264 +f 83/298/265 656/299/265 1583/300/265 655/301/265 +f 656/299/266 168/302/266 657/303/266 1583/300/266 +f 1583/300/267 657/303/267 170/290/267 650/287/267 +f 655/301/268 1583/300/268 650/287/268 85/286/268 +f 171/294/269 658/304/269 1584/305/269 653/295/269 +f 658/304/270 169/306/270 659/307/270 1584/305/270 +f 1584/305/271 659/307/271 84/308/271 660/309/271 +f 653/295/272 1584/305/272 660/309/272 86/296/272 +f 81/310/273 662/311/273 1585/312/273 661/313/273 +f 662/311/274 166/314/274 663/315/274 1585/312/274 +f 1585/312/275 663/315/275 168/302/275 656/299/275 +f 661/313/276 1585/312/276 656/299/276 83/298/276 +f 169/306/277 664/316/277 1586/317/277 659/307/277 +f 664/316/278 167/318/278 665/319/278 1586/317/278 +f 1586/317/279 665/319/279 82/320/279 666/321/279 +f 659/307/280 1586/317/280 666/321/280 84/308/280 +f 79/322/281 668/323/281 1587/324/281 667/325/281 +f 668/323/282 92/326/282 669/327/282 1587/324/282 +f 1587/324/283 669/327/283 146/328/283 670/329/283 +f 667/325/284 1587/324/284 670/329/284 164/330/284 +f 147/331/285 672/332/285 1588/333/285 671/334/285 +f 672/332/286 93/335/286 673/336/286 1588/333/286 +f 1588/333/287 673/336/287 80/337/287 674/338/287 +f 671/334/288 1588/333/288 674/338/288 165/339/288 +f 92/326/289 675/340/289 1589/341/289 669/327/289 +f 675/340/290 94/342/290 676/343/290 1589/341/290 +f 1589/341/291 676/343/291 148/344/291 677/345/291 +f 669/327/292 1589/341/292 677/345/292 146/328/292 +f 149/346/293 679/347/293 1590/348/293 678/349/293 +f 679/347/294 95/350/294 680/351/294 1590/348/294 +f 1590/348/295 680/351/295 93/335/295 672/332/295 +f 678/349/296 1590/348/296 672/332/296 147/331/296 +f 94/342/297 681/352/297 1591/353/297 676/343/297 +f 681/352/298 96/354/298 682/355/298 1591/353/298 +f 1591/353/299 682/355/299 150/356/299 683/357/299 +f 676/343/300 1591/353/300 683/357/300 148/344/300 +f 151/358/301 685/359/301 1592/360/301 684/361/301 +f 685/359/302 97/362/302 686/363/302 1592/360/302 +f 1592/360/303 686/363/303 95/350/303 679/347/303 +f 684/361/304 1592/360/304 679/347/304 149/346/304 +f 96/354/305 687/364/305 1593/365/305 682/355/305 +f 687/364/306 98/366/306 688/367/306 1593/365/306 +f 1593/365/307 688/367/307 152/368/307 689/369/307 +f 682/355/308 1593/365/308 689/369/308 150/356/308 +f 153/370/309 691/371/309 1594/372/309 690/373/309 +f 691/371/310 99/374/310 692/375/310 1594/372/310 +f 1594/372/311 692/375/311 97/362/311 685/359/311 +f 690/373/312 1594/372/312 685/359/312 151/358/312 +f 98/366/313 693/376/313 1595/377/313 688/367/313 +f 693/376/314 100/378/314 694/379/314 1595/377/314 +f 1595/377/315 694/379/315 154/380/315 695/381/315 +f 688/367/316 1595/377/316 695/381/316 152/368/316 +f 155/382/317 697/383/317 1596/384/317 696/385/317 +f 697/383/318 101/386/318 698/387/318 1596/384/318 +f 1596/384/319 698/387/319 99/374/319 691/371/319 +f 696/385/320 1596/384/320 691/371/320 153/370/320 +f 100/378/321 699/388/321 1597/389/321 694/379/321 +f 699/388/322 102/390/322 700/391/322 1597/389/322 +f 1597/389/323 700/391/323 156/392/323 701/393/323 +f 694/379/324 1597/389/324 701/393/324 154/380/324 +f 157/394/325 703/395/325 1598/396/325 702/397/325 +f 703/395/326 103/398/326 704/399/326 1598/396/326 +f 1598/396/327 704/399/327 101/386/327 697/383/327 +f 702/397/328 1598/396/328 697/383/328 155/382/328 +f 102/390/329 705/400/329 1599/401/329 700/391/329 +f 705/400/330 104/402/330 706/403/330 1599/401/330 +f 1599/401/331 706/403/331 158/404/331 707/405/331 +f 700/391/332 1599/401/332 707/405/332 156/392/332 +f 159/406/333 709/407/333 1600/408/333 708/409/333 +f 709/407/334 105/410/334 710/411/334 1600/408/334 +f 1600/408/335 710/411/335 103/398/335 703/395/335 +f 708/409/336 1600/408/336 703/395/336 157/394/336 +f 104/402/337 711/412/337 1601/413/337 706/403/337 +f 711/412/338 106/414/338 712/415/338 1601/413/338 +f 1601/413/339 712/415/339 160/416/339 713/417/339 +f 706/403/340 1601/413/340 713/417/340 158/404/340 +f 161/418/341 715/419/341 1602/420/341 714/421/341 +f 715/419/342 107/422/342 716/423/342 1602/420/342 +f 1602/420/343 716/423/343 105/410/343 709/407/343 +f 714/421/344 1602/420/344 709/407/344 159/406/344 +f 106/414/345 717/424/345 1603/425/345 712/415/345 +f 717/424/346 108/426/346 718/427/346 1603/425/346 +f 1603/425/347 718/427/347 162/428/347 719/429/347 +f 712/415/348 1603/425/348 719/429/348 160/416/348 +f 163/430/349 721/431/349 1604/432/349 720/433/349 +f 721/431/350 109/434/350 722/435/350 1604/432/350 +f 1604/432/351 722/435/351 107/422/351 715/419/351 +f 720/433/352 1604/432/352 715/419/352 161/418/352 +f 108/426/353 723/436/353 1605/437/353 718/427/353 +f 723/436/354 67/438/354 724/439/354 1605/437/354 +f 1605/437/355 724/439/355 68/440/355 725/441/355 +f 718/427/356 1605/437/356 725/441/356 162/428/356 +f 68/440/357 724/439/357 1606/442/357 726/443/357 +f 724/439/358 67/438/358 727/444/358 1606/442/358 +f 1606/442/359 727/444/359 109/434/359 721/431/359 +f 726/443/360 1606/442/360 721/431/360 163/430/360 +f 110/445/361 729/446/361 1607/447/361 728/448/361 +f 729/446/362 128/449/362 730/450/362 1607/447/362 +f 1607/447/363 730/450/363 160/416/363 719/429/363 +f 728/448/364 1607/447/364 719/429/364 162/428/364 +f 161/418/365 731/451/365 1608/452/365 720/433/365 +f 731/451/366 129/453/366 732/454/366 1608/452/366 +f 1608/452/367 732/454/367 111/455/367 733/456/367 +f 720/433/368 1608/452/368 733/456/368 163/430/368 +f 128/449/369 734/457/369 1609/458/369 730/450/369 +f 734/457/370 179/459/370 735/460/370 1609/458/370 +f 1609/458/371 735/460/371 158/404/371 713/417/371 +f 730/450/372 1609/458/372 713/417/372 160/416/372 +f 159/406/373 736/461/373 1610/462/373 714/421/373 +f 736/461/374 180/463/374 737/464/374 1610/462/374 +f 1610/462/375 737/464/375 129/453/375 731/451/375 +f 714/421/376 1610/462/376 731/451/376 161/418/376 +f 126/465/377 739/466/377 1611/467/377 738/468/377 +f 739/466/378 156/392/378 707/405/378 1611/467/378 +f 1611/467/379 707/405/379 158/404/379 735/460/379 +f 738/468/380 1611/467/380 735/460/380 179/459/380 +f 159/406/381 708/409/381 1612/469/381 736/461/381 +f 708/409/382 157/394/382 740/470/382 1612/469/382 +f 1612/469/383 740/470/383 127/471/383 741/472/383 +f 736/461/384 1612/469/384 741/472/384 180/463/384 +f 124/473/385 743/474/385 1613/475/385 742/476/385 +f 743/474/386 154/380/386 701/393/386 1613/475/386 +f 1613/475/387 701/393/387 156/392/387 739/466/387 +f 742/476/388 1613/475/388 739/466/388 126/465/388 +f 157/394/389 702/397/389 1614/477/389 740/470/389 +f 702/397/390 155/382/390 744/478/390 1614/477/390 +f 1614/477/391 744/478/391 125/479/391 745/480/391 +f 740/470/392 1614/477/392 745/480/392 127/471/392 +f 122/481/393 747/482/393 1615/483/393 746/484/393 +f 747/482/394 152/368/394 695/381/394 1615/483/394 +f 1615/483/395 695/381/395 154/380/395 743/474/395 +f 746/484/396 1615/483/396 743/474/396 124/473/396 +f 155/382/397 696/385/397 1616/485/397 744/478/397 +f 696/385/398 153/370/398 748/486/398 1616/485/398 +f 1616/485/399 748/486/399 123/487/399 749/488/399 +f 744/478/400 1616/485/400 749/488/400 125/479/400 +f 120/489/401 751/490/401 1617/491/401 750/492/401 +f 751/490/402 150/356/402 689/369/402 1617/491/402 +f 1617/491/403 689/369/403 152/368/403 747/482/403 +f 750/492/404 1617/491/404 747/482/404 122/481/404 +f 153/370/405 690/373/405 1618/493/405 748/486/405 +f 690/373/406 151/358/406 752/494/406 1618/493/406 +f 1618/493/407 752/494/407 121/495/407 753/496/407 +f 748/486/408 1618/493/408 753/496/408 123/487/408 +f 118/497/409 755/498/409 1619/499/409 754/500/409 +f 755/498/410 148/344/410 683/357/410 1619/499/410 +f 1619/499/411 683/357/411 150/356/411 751/490/411 +f 754/500/412 1619/499/412 751/490/412 120/489/412 +f 151/358/413 684/361/413 1620/501/413 752/494/413 +f 684/361/414 149/346/414 756/502/414 1620/501/414 +f 1620/501/415 756/502/415 119/503/415 757/504/415 +f 752/494/416 1620/501/416 757/504/416 121/495/416 +f 116/505/417 759/506/417 1621/507/417 758/508/417 +f 759/506/418 146/328/418 677/345/418 1621/507/418 +f 1621/507/419 677/345/419 148/344/419 755/498/419 +f 758/508/420 1621/507/420 755/498/420 118/497/420 +f 149/346/421 678/349/421 1622/509/421 756/502/421 +f 678/349/422 147/331/422 760/510/422 1622/509/422 +f 1622/509/423 760/510/423 117/511/423 761/512/423 +f 756/502/424 1622/509/424 761/512/424 119/503/424 +f 114/513/425 763/514/425 1623/515/425 762/516/425 +f 763/514/426 164/330/426 670/329/426 1623/515/426 +f 1623/515/427 670/329/427 146/328/427 759/506/427 +f 762/516/428 1623/515/428 759/506/428 116/505/428 +f 147/331/429 671/334/429 1624/517/429 760/510/429 +f 671/334/430 165/339/430 764/518/430 1624/517/430 +f 1624/517/431 764/518/431 115/519/431 765/520/431 +f 760/510/432 1624/517/432 765/520/432 117/511/432 +f 114/513/433 766/521/433 1625/522/433 763/514/433 +f 766/521/434 181/523/434 767/524/434 1625/522/434 +f 1625/522/435 767/524/435 177/525/435 768/526/435 +f 763/514/436 1625/522/436 768/526/436 164/330/436 +f 177/525/437 770/527/437 1626/528/437 769/529/437 +f 770/527/438 182/530/438 771/531/438 1626/528/438 +f 1626/528/439 771/531/439 115/519/439 764/518/439 +f 769/529/440 1626/528/440 764/518/440 165/339/440 +f 110/445/441 728/448/441 1627/532/441 772/533/441 +f 728/448/442 162/428/442 725/441/442 1627/532/442 +f 1627/532/443 725/441/443 68/440/443 773/534/443 +f 772/533/444 1627/532/444 773/534/444 112/535/444 +f 68/440/445 726/443/445 1628/536/445 774/537/445 +f 726/443/446 163/430/446 733/456/446 1628/536/446 +f 1628/536/447 733/456/447 111/455/447 775/538/447 +f 774/537/448 1628/536/448 775/538/448 113/539/448 +f 112/535/449 773/534/449 1629/540/449 776/541/449 +f 773/534/450 68/440/450 777/542/450 1629/540/450 +f 1629/540/451 777/542/451 178/543/451 778/544/451 +f 776/541/452 1629/540/452 778/544/452 183/545/452 +f 178/543/453 777/542/453 1630/546/453 779/547/453 +f 777/542/454 68/440/454 774/537/454 1630/546/454 +f 1630/546/455 774/537/455 113/539/455 780/548/455 +f 779/547/456 1630/546/456 780/548/456 184/549/456 +f 177/525/457 767/524/457 1631/550/457 781/551/457 +f 767/524/458 181/523/458 782/552/458 1631/550/458 +f 1631/550/459 782/552/459 183/545/459 778/544/459 +f 781/551/460 1631/550/460 778/544/460 178/543/460 +f 184/549/461 783/553/461 1632/554/461 779/547/461 +f 783/553/462 182/530/462 770/527/462 1632/554/462 +f 1632/554/463 770/527/463 177/525/463 781/551/463 +f 779/547/464 1632/554/464 781/551/464 178/543/464 +f 135/555/465 785/556/465 1633/557/465 784/558/465 +f 785/556/466 137/559/466 786/560/466 1633/557/466 +f 1633/557/467 786/560/467 176/265/467 638/264/467 +f 784/558/468 1633/557/468 638/264/468 174/263/468 +f 176/265/469 786/560/469 1634/561/469 640/268/469 +f 786/560/470 137/559/470 787/562/470 1634/561/470 +f 1634/561/471 787/562/471 136/563/471 788/564/471 +f 640/268/472 1634/561/472 788/564/472 175/270/472 +f 133/565/473 790/566/473 1635/567/473 789/568/473 +f 790/566/474 135/555/474 784/558/474 1635/567/474 +f 1635/567/475 784/558/475 174/263/475 645/279/475 +f 789/568/476 1635/567/476 645/279/476 172/278/476 +f 175/270/477 788/564/477 1636/569/477 646/280/477 +f 788/564/478 136/563/478 791/570/478 1636/569/478 +f 1636/569/479 791/570/479 134/571/479 792/572/479 +f 646/280/480 1636/569/480 792/572/480 173/282/480 +f 131/573/481 794/574/481 1637/575/481 793/576/481 +f 794/574/482 133/565/482 789/568/482 1637/575/482 +f 1637/575/483 789/568/483 172/278/483 651/291/483 +f 793/576/484 1637/575/484 651/291/484 170/290/484 +f 173/282/485 792/572/485 1638/577/485 652/292/485 +f 792/572/486 134/571/486 795/578/486 1638/577/486 +f 1638/577/487 795/578/487 132/579/487 796/580/487 +f 652/292/488 1638/577/488 796/580/488 171/294/488 +f 166/314/489 797/581/489 1639/582/489 663/315/489 +f 797/581/490 187/583/490 798/584/490 1639/582/490 +f 1639/582/491 798/584/491 185/585/491 799/586/491 +f 663/315/492 1639/582/492 799/586/492 168/302/492 +f 186/587/493 801/588/493 1640/589/493 800/590/493 +f 801/588/494 188/591/494 802/592/494 1640/589/494 +f 1640/589/495 802/592/495 167/318/495 664/316/495 +f 800/590/496 1640/589/496 664/316/496 169/306/496 +f 131/573/497 793/576/497 1641/593/497 803/594/497 +f 793/576/498 170/290/498 657/303/498 1641/593/498 +f 1641/593/499 657/303/499 168/302/499 799/586/499 +f 803/594/500 1641/593/500 799/586/500 185/585/500 +f 169/306/501 658/304/501 1642/595/501 800/590/501 +f 658/304/502 171/294/502 796/580/502 1642/595/502 +f 1642/595/503 796/580/503 132/579/503 804/596/503 +f 800/590/504 1642/595/504 804/596/504 186/587/504 +f 144/597/505 806/598/505 1643/599/505 805/600/505 +f 806/598/506 190/601/506 807/602/506 1643/599/506 +f 1643/599/507 807/602/507 189/603/507 808/604/507 +f 805/600/508 1643/599/508 808/604/508 187/583/508 +f 189/603/509 807/602/509 1644/605/509 809/606/509 +f 807/602/510 190/601/510 810/607/510 1644/605/510 +f 1644/605/511 810/607/511 145/608/511 811/609/511 +f 809/606/512 1644/605/512 811/609/512 188/591/512 +f 185/585/513 798/584/513 1645/610/513 812/611/513 +f 798/584/514 187/583/514 808/604/514 1645/610/514 +f 1645/610/515 808/604/515 189/603/515 813/612/515 +f 812/611/516 1645/610/516 813/612/516 69/613/516 +f 189/603/515 809/606/515 1646/614/515 813/612/515 +f 809/606/517 188/591/517 801/588/517 1646/614/517 +f 1646/614/518 801/588/518 186/587/518 814/615/518 +f 813/612/519 1646/614/519 814/615/519 69/613/519 +f 130/616/520 816/617/520 1647/618/520 815/619/520 +f 816/617/521 131/573/521 803/594/521 1647/618/521 +f 1647/618/522 803/594/522 185/585/522 812/611/522 +f 815/619/523 1647/618/523 812/611/523 69/613/523 +f 186/587/524 804/596/524 1648/620/524 814/615/524 +f 804/596/525 132/579/525 817/621/525 1648/620/525 +f 1648/620/526 817/621/526 130/616/526 815/619/526 +f 814/615/527 1648/620/527 815/619/527 69/613/527 +f 142/622/528 819/623/528 1649/624/528 818/625/528 +f 819/623/529 193/626/529 820/627/529 1649/624/529 +f 1649/624/530 820/627/530 191/628/530 821/629/530 +f 818/625/531 1649/624/531 821/629/531 144/597/531 +f 192/630/532 823/631/532 1650/632/532 822/633/532 +f 823/631/533 194/634/533 824/635/533 1650/632/533 +f 1650/632/534 824/635/534 143/636/534 825/637/534 +f 822/633/535 1650/632/535 825/637/535 145/608/535 +f 140/638/536 827/639/536 1651/640/536 826/641/536 +f 827/639/537 195/642/537 828/643/537 1651/640/537 +f 1651/640/538 828/643/538 193/626/538 819/623/538 +f 826/641/539 1651/640/539 819/623/539 142/622/539 +f 194/634/540 829/644/540 1652/645/540 824/635/540 +f 829/644/541 196/646/541 830/647/541 1652/645/541 +f 1652/645/542 830/647/542 141/648/542 831/649/542 +f 824/635/543 1652/645/543 831/649/543 143/636/543 +f 139/650/544 833/651/544 1653/652/544 832/653/544 +f 833/651/545 197/654/545 834/655/545 1653/652/545 +f 1653/652/546 834/655/546 195/642/546 827/639/546 +f 832/653/547 1653/652/547 827/639/547 140/638/547 +f 196/646/548 835/656/548 1654/657/548 830/647/548 +f 835/656/549 198/658/549 836/659/549 1654/657/549 +f 1654/657/550 836/659/550 139/650/550 837/660/550 +f 830/647/551 1654/657/551 837/660/551 141/648/551 +f 138/661/552 839/662/552 1655/663/552 838/664/552 +f 839/662/553 71/665/553 840/666/553 1655/663/553 +f 1655/663/554 840/666/554 197/654/554 833/651/554 +f 838/664/555 1655/663/555 833/651/555 139/650/555 +f 198/658/556 841/667/556 1656/668/556 836/659/556 +f 841/667/557 71/665/557 839/662/557 1656/668/557 +f 1656/668/558 839/662/558 138/661/558 838/664/558 +f 836/659/559 1656/668/559 838/664/559 139/650/559 +f 190/601/560 806/598/560 1657/669/560 842/670/560 +f 806/598/561 144/597/561 821/629/561 1657/669/561 +f 1657/669/562 821/629/562 191/628/562 843/671/562 +f 842/670/563 1657/669/563 843/671/563 70/672/563 +f 192/630/564 822/633/564 1658/673/564 844/674/564 +f 822/633/565 145/608/565 810/607/565 1658/673/565 +f 1658/673/566 810/607/566 190/601/566 842/670/566 +f 844/674/567 1658/673/567 842/670/567 70/672/567 +f 70/672/568 843/671/568 1659/675/568 845/676/568 +f 843/671/569 191/628/569 846/677/569 1659/675/569 +f 1659/675/570 846/677/570 206/678/570 847/679/570 +f 845/676/571 1659/675/571 847/679/571 208/680/571 +f 207/681/572 849/682/572 1660/683/572 848/684/572 +f 849/682/573 192/630/573 844/674/573 1660/683/573 +f 1660/683/574 844/674/574 70/672/574 845/676/574 +f 848/684/575 1660/683/575 845/676/575 208/680/575 +f 71/665/576 850/685/576 1661/686/576 840/666/576 +f 850/685/577 199/687/577 851/688/577 1661/686/577 +f 1661/686/578 851/688/578 200/689/578 852/690/578 +f 840/666/579 1661/686/579 852/690/579 197/654/579 +f 201/691/580 854/692/580 1662/693/580 853/694/580 +f 854/692/581 199/687/581 850/685/581 1662/693/581 +f 1662/693/582 850/685/582 71/665/582 841/667/582 +f 853/694/583 1662/693/583 841/667/583 198/658/583 +f 197/654/584 852/690/584 1663/695/584 834/655/584 +f 852/690/585 200/689/585 855/696/585 1663/695/585 +f 1663/695/586 855/696/586 202/697/586 856/698/586 +f 834/655/587 1663/695/587 856/698/587 195/642/587 +f 203/699/588 858/700/588 1664/701/588 857/702/588 +f 858/700/589 201/691/589 853/694/589 1664/701/589 +f 1664/701/590 853/694/590 198/658/590 835/656/590 +f 857/702/591 1664/701/591 835/656/591 196/646/591 +f 195/642/592 856/698/592 1665/703/592 828/643/592 +f 856/698/593 202/697/593 859/704/593 1665/703/593 +f 1665/703/594 859/704/594 204/705/594 860/706/594 +f 828/643/595 1665/703/595 860/706/595 193/626/595 +f 205/707/596 862/708/596 1666/709/596 861/710/596 +f 862/708/597 203/699/597 857/702/597 1666/709/597 +f 1666/709/598 857/702/598 196/646/598 829/644/598 +f 861/710/599 1666/709/599 829/644/599 194/634/599 +f 193/626/600 860/706/600 1667/711/600 820/627/600 +f 860/706/601 204/705/601 863/712/601 1667/711/601 +f 1667/711/602 863/712/602 206/678/602 846/677/602 +f 820/627/603 1667/711/603 846/677/603 191/628/603 +f 207/681/604 864/713/604 1668/714/604 849/682/604 +f 864/713/605 205/707/605 861/710/605 1668/714/605 +f 1668/714/606 861/710/606 194/634/606 823/631/606 +f 849/682/607 1668/714/607 823/631/607 192/630/607 +f 199/687/608 865/715/608 1669/716/608 851/688/608 +f 865/715/609 204/705/609 859/704/609 1669/716/609 +f 1669/716/610 859/704/610 202/697/610 855/696/610 +f 851/688/611 1669/716/611 855/696/611 200/689/611 +f 203/699/612 862/708/612 1670/717/612 858/700/612 +f 862/708/613 205/707/613 866/718/613 1670/717/613 +f 1670/717/614 866/718/614 199/687/614 854/692/614 +f 858/700/615 1670/717/615 854/692/615 201/691/615 +f 199/687/616 867/719/616 1671/720/616 865/715/616 +f 867/719/617 208/680/617 847/679/617 1671/720/617 +f 1671/720/618 847/679/618 206/678/618 863/712/618 +f 865/715/619 1671/720/619 863/712/619 204/705/619 +f 207/681/620 848/684/620 1672/721/620 864/713/620 +f 848/684/621 208/680/621 867/719/621 1672/721/621 +f 1672/721/622 867/719/622 199/687/622 866/718/622 +f 864/713/623 1672/721/623 866/718/623 205/707/623 +f 139/650/624 832/653/624 1673/722/624 868/723/624 +f 832/653/625 140/638/625 869/724/625 1673/722/625 +f 1673/722/626 869/724/626 164/330/626 768/526/626 +f 868/723/627 1673/722/627 768/526/627 177/525/627 +f 165/339/628 870/725/628 1674/726/628 769/529/628 +f 870/725/629 141/648/629 837/660/629 1674/726/629 +f 1674/726/630 837/660/630 139/650/630 868/723/630 +f 769/529/631 1674/726/631 868/723/631 177/525/631 +f 140/638/632 826/641/632 1675/727/632 869/724/632 +f 826/641/633 142/622/633 871/728/633 1675/727/633 +f 1675/727/634 871/728/634 211/729/634 872/730/634 +f 869/724/635 1675/727/635 872/730/635 164/330/635 +f 212/731/636 874/732/636 1676/733/636 873/734/636 +f 874/732/637 143/636/637 831/649/637 1676/733/637 +f 1676/733/638 831/649/638 141/648/638 870/725/638 +f 873/734/639 1676/733/639 870/725/639 165/339/639 +f 142/622/640 818/625/640 1677/735/640 871/728/640 +f 818/625/641 144/597/641 875/736/641 1677/735/641 +f 1677/735/642 875/736/642 213/737/642 876/738/642 +f 871/728/643 1677/735/643 876/738/643 211/729/643 +f 214/739/644 878/740/644 1678/741/644 877/742/644 +f 878/740/645 145/608/645 825/637/645 1678/741/645 +f 1678/741/646 825/637/646 143/636/646 874/732/646 +f 877/742/647 1678/741/647 874/732/647 212/731/647 +f 144/597/648 805/600/648 1679/743/648 875/736/648 +f 805/600/649 187/583/649 797/581/649 1679/743/649 +f 1679/743/650 797/581/650 166/314/650 879/744/650 +f 875/736/651 1679/743/651 879/744/651 213/737/651 +f 167/318/652 802/592/652 1680/745/652 880/746/652 +f 802/592/653 188/591/653 811/609/653 1680/745/653 +f 1680/745/654 811/609/654 145/608/654 878/740/654 +f 880/746/655 1680/745/655 878/740/655 214/739/655 +f 81/310/656 881/747/656 1681/748/656 662/311/656 +f 881/747/657 209/749/657 882/750/657 1681/748/657 +f 1681/748/658 882/750/658 213/737/658 879/744/658 +f 662/311/659 1681/748/659 879/744/659 166/314/659 +f 214/739/660 883/751/660 1682/752/660 880/746/660 +f 883/751/661 210/753/661 884/754/661 1682/752/661 +f 1682/752/662 884/754/662 82/320/662 665/319/662 +f 880/746/663 1682/752/663 665/319/663 167/318/663 +f 209/749/664 885/755/664 1683/756/664 882/750/664 +f 885/755/665 215/757/665 886/758/665 1683/756/665 +f 1683/756/666 886/758/666 211/729/666 876/738/666 +f 882/750/667 1683/756/667 876/738/667 213/737/667 +f 212/731/668 887/759/668 1684/760/668 877/742/668 +f 887/759/669 216/761/669 888/762/669 1684/760/669 +f 1684/760/670 888/762/670 210/753/670 883/751/670 +f 877/742/671 1684/760/671 883/751/671 214/739/671 +f 79/322/672 667/325/672 1685/763/672 889/764/672 +f 667/325/673 164/330/673 872/730/673 1685/763/673 +f 1685/763/674 872/730/674 211/729/674 886/758/674 +f 889/764/675 1685/763/675 886/758/675 215/757/675 +f 212/731/676 873/734/676 1686/765/676 887/759/676 +f 873/734/677 165/339/677 674/338/677 1686/765/677 +f 1686/765/678 674/338/678 80/337/678 890/766/678 +f 887/759/679 1686/765/679 890/766/679 216/761/679 +f 131/573/680 816/617/680 1687/767/680 891/768/680 +f 816/617/681 130/616/681 892/769/681 1687/767/681 +f 1687/767/682 892/769/682 72/770/682 893/771/682 +f 891/768/683 1687/767/683 893/771/683 222/772/683 +f 72/770/684 892/769/684 1688/773/684 894/774/684 +f 892/769/685 130/616/685 817/621/685 1688/773/685 +f 1688/773/686 817/621/686 132/579/686 895/775/686 +f 894/774/687 1688/773/687 895/775/687 223/776/687 +f 133/565/688 794/574/688 1689/777/688 896/778/688 +f 794/574/689 131/573/689 891/768/689 1689/777/689 +f 1689/777/690 891/768/690 222/772/690 897/779/690 +f 896/778/691 1689/777/691 897/779/691 220/780/691 +f 223/776/692 895/775/692 1690/781/692 898/782/692 +f 895/775/693 132/579/693 795/578/693 1690/781/693 +f 1690/781/694 795/578/694 134/571/694 899/783/694 +f 898/782/695 1690/781/695 899/783/695 221/784/695 +f 135/555/696 790/566/696 1691/785/696 900/786/696 +f 790/566/697 133/565/697 896/778/697 1691/785/697 +f 1691/785/698 896/778/698 220/780/698 901/787/698 +f 900/786/699 1691/785/699 901/787/699 218/788/699 +f 221/784/700 899/783/700 1692/789/700 902/790/700 +f 899/783/701 134/571/701 791/570/701 1692/789/701 +f 1692/789/702 791/570/702 136/563/702 903/791/702 +f 902/790/703 1692/789/703 903/791/703 219/792/703 +f 137/559/704 785/556/704 1693/793/704 904/794/704 +f 785/556/705 135/555/705 900/786/705 1693/793/705 +f 1693/793/706 900/786/706 218/788/706 905/795/706 +f 904/794/707 1693/793/707 905/795/707 217/796/707 +f 219/792/708 903/791/708 1694/797/708 906/798/708 +f 903/791/709 136/563/709 787/562/709 1694/797/709 +f 1694/797/710 787/562/710 137/559/710 904/794/710 +f 906/798/711 1694/797/711 904/794/711 217/796/711 +f 217/796/712 905/795/712 1695/799/712 907/800/712 +f 905/795/713 218/788/713 908/801/713 1695/799/713 +f 1695/799/714 908/801/714 229/802/714 909/803/714 +f 907/800/715 1695/799/715 909/803/715 231/804/715 +f 230/805/716 911/806/716 1696/807/716 910/808/716 +f 911/806/717 219/792/717 906/798/717 1696/807/717 +f 1696/807/718 906/798/718 217/796/718 907/800/718 +f 910/808/719 1696/807/719 907/800/719 231/804/719 +f 218/788/720 901/787/720 1697/809/720 908/801/720 +f 901/787/721 220/780/721 912/810/721 1697/809/721 +f 1697/809/722 912/810/722 227/811/722 913/812/722 +f 908/801/723 1697/809/723 913/812/723 229/802/723 +f 228/813/724 915/814/724 1698/815/724 914/816/724 +f 915/814/725 221/784/725 902/790/725 1698/815/725 +f 1698/815/726 902/790/726 219/792/726 911/806/726 +f 914/816/727 1698/815/727 911/806/727 230/805/727 +f 220/780/728 897/779/728 1699/817/728 912/810/728 +f 897/779/729 222/772/729 916/818/729 1699/817/729 +f 1699/817/730 916/818/730 225/819/730 917/820/730 +f 912/810/731 1699/817/731 917/820/731 227/811/731 +f 226/821/732 919/822/732 1700/823/732 918/824/732 +f 919/822/733 223/776/733 898/782/733 1700/823/733 +f 1700/823/734 898/782/734 221/784/734 915/814/734 +f 918/824/735 1700/823/735 915/814/735 228/813/735 +f 222/772/736 893/771/736 1701/825/736 916/818/736 +f 893/771/737 72/770/737 920/826/737 1701/825/737 +f 1701/825/738 920/826/738 224/827/738 921/828/738 +f 916/818/739 1701/825/739 921/828/739 225/819/739 +f 224/827/740 920/826/740 1702/829/740 922/830/740 +f 920/826/741 72/770/741 894/774/741 1702/829/741 +f 1702/829/742 894/774/742 223/776/742 919/822/742 +f 922/830/743 1702/829/743 919/822/743 226/821/743 +f 224/827/744 923/831/744 1703/832/744 921/828/744 +f 923/831/745 231/804/745 909/803/745 1703/832/745 +f 1703/832/746 909/803/746 229/802/746 924/833/746 +f 921/828/747 1703/832/747 924/833/747 225/819/747 +f 230/805/748 910/808/748 1704/834/748 925/835/748 +f 910/808/749 231/804/749 923/831/749 1704/834/749 +f 1704/834/750 923/831/750 224/827/750 922/830/750 +f 925/835/751 1704/834/751 922/830/751 226/821/751 +f 225/819/752 924/833/752 1705/836/752 917/820/752 +f 229/802/753 913/812/753 1705/836/753 924/833/753 +f 227/811/754 917/820/754 1705/836/754 913/812/754 +f 228/813/755 914/816/755 1706/837/755 918/824/755 +f 230/805/756 925/835/756 1706/837/756 914/816/756 +f 226/821/757 918/824/757 1706/837/757 925/835/757 +f 183/545/758 782/552/758 1707/838/758 926/839/758 +f 782/552/759 181/523/759 927/840/759 1707/838/759 +f 1707/838/760 927/840/760 234/841/760 928/842/760 +f 926/839/761 1707/838/761 928/842/761 232/843/761 +f 235/844/762 930/845/762 1708/846/762 929/847/762 +f 930/845/763 182/530/763 783/553/763 1708/846/763 +f 1708/846/764 783/553/764 184/549/764 931/848/764 +f 929/847/765 1708/846/765 931/848/765 233/849/765 +f 112/535/766 776/541/766 1709/850/766 932/851/766 +f 776/541/767 183/545/767 926/839/767 1709/850/767 +f 1709/850/768 926/839/768 232/843/768 933/852/768 +f 932/851/769 1709/850/769 933/852/769 254/853/769 +f 233/849/770 931/848/770 1710/854/770 934/855/770 +f 931/848/771 184/549/771 780/548/771 1710/854/771 +f 1710/854/772 780/548/772 113/539/772 935/856/772 +f 934/855/773 1710/854/773 935/856/773 255/857/773 +f 110/445/774 772/533/774 1711/858/774 936/859/774 +f 772/533/775 112/535/775 932/851/775 1711/858/775 +f 1711/858/776 932/851/776 254/853/776 937/860/776 +f 936/859/777 1711/858/777 937/860/777 256/861/777 +f 255/857/778 935/856/778 1712/862/778 938/863/778 +f 935/856/779 113/539/779 775/538/779 1712/862/779 +f 1712/862/780 775/538/780 111/455/780 939/864/780 +f 938/863/781 1712/862/781 939/864/781 257/865/781 +f 181/523/782 766/521/782 1713/866/782 927/840/782 +f 766/521/783 114/513/783 940/867/783 1713/866/783 +f 1713/866/784 940/867/784 252/868/784 941/869/784 +f 927/840/785 1713/866/785 941/869/785 234/841/785 +f 253/870/786 943/871/786 1714/872/786 942/873/786 +f 943/871/787 115/519/787 771/531/787 1714/872/787 +f 1714/872/788 771/531/788 182/530/788 930/845/788 +f 942/873/789 1714/872/789 930/845/789 235/844/789 +f 114/513/790 762/516/790 1715/874/790 940/867/790 +f 762/516/791 116/505/791 944/875/791 1715/874/791 +f 1715/874/792 944/875/792 250/876/792 945/877/792 +f 940/867/793 1715/874/793 945/877/793 252/868/793 +f 251/878/794 947/879/794 1716/880/794 946/881/794 +f 947/879/795 117/511/795 765/520/795 1716/880/795 +f 1716/880/796 765/520/796 115/519/796 943/871/796 +f 946/881/797 1716/880/797 943/871/797 253/870/797 +f 116/505/798 758/508/798 1717/882/798 944/875/798 +f 758/508/799 118/497/799 948/883/799 1717/882/799 +f 1717/882/800 948/883/800 248/884/800 949/885/800 +f 944/875/801 1717/882/801 949/885/801 250/876/801 +f 249/886/802 951/887/802 1718/888/802 950/889/802 +f 951/887/803 119/503/803 761/512/803 1718/888/803 +f 1718/888/804 761/512/804 117/511/804 947/879/804 +f 950/889/805 1718/888/805 947/879/805 251/878/805 +f 118/497/806 754/500/806 1719/890/806 948/883/806 +f 754/500/807 120/489/807 952/891/807 1719/890/807 +f 1719/890/808 952/891/808 246/892/808 953/893/808 +f 948/883/809 1719/890/809 953/893/809 248/884/809 +f 247/894/810 955/895/810 1720/896/810 954/897/810 +f 955/895/811 121/495/811 757/504/811 1720/896/811 +f 1720/896/812 757/504/812 119/503/812 951/887/812 +f 954/897/813 1720/896/813 951/887/813 249/886/813 +f 120/489/814 750/492/814 1721/898/814 952/891/814 +f 750/492/815 122/481/815 956/899/815 1721/898/815 +f 1721/898/816 956/899/816 244/900/816 957/901/816 +f 952/891/817 1721/898/817 957/901/817 246/892/817 +f 245/902/818 959/903/818 1722/904/818 958/905/818 +f 959/903/819 123/487/819 753/496/819 1722/904/819 +f 1722/904/820 753/496/820 121/495/820 955/895/820 +f 958/905/821 1722/904/821 955/895/821 247/894/821 +f 122/481/822 746/484/822 1723/906/822 956/899/822 +f 746/484/823 124/473/823 960/907/823 1723/906/823 +f 1723/906/824 960/907/824 242/908/824 961/909/824 +f 956/899/825 1723/906/825 961/909/825 244/900/825 +f 243/910/826 963/911/826 1724/912/826 962/913/826 +f 963/911/827 125/479/827 749/488/827 1724/912/827 +f 1724/912/828 749/488/828 123/487/828 959/903/828 +f 962/913/829 1724/912/829 959/903/829 245/902/829 +f 124/473/830 742/476/830 1725/914/830 960/907/830 +f 742/476/831 126/465/831 964/915/831 1725/914/831 +f 1725/914/832 964/915/832 240/916/832 965/917/832 +f 960/907/833 1725/914/833 965/917/833 242/908/833 +f 241/918/834 967/919/834 1726/920/834 966/921/834 +f 967/919/835 127/471/835 745/480/835 1726/920/835 +f 1726/920/836 745/480/836 125/479/836 963/911/836 +f 966/921/837 1726/920/837 963/911/837 243/910/837 +f 126/465/838 738/468/838 1727/922/838 964/915/838 +f 738/468/839 179/459/839 968/923/839 1727/922/839 +f 1727/922/840 968/923/840 236/924/840 969/925/840 +f 964/915/841 1727/922/841 969/925/841 240/916/841 +f 237/926/842 971/927/842 1728/928/842 970/929/842 +f 971/927/843 180/463/843 741/472/843 1728/928/843 +f 1728/928/844 741/472/844 127/471/844 967/919/844 +f 970/929/845 1728/928/845 967/919/845 241/918/845 +f 179/459/846 734/457/846 1729/930/846 968/923/846 +f 734/457/847 128/449/847 972/931/847 1729/930/847 +f 1729/930/848 972/931/848 238/932/848 973/933/848 +f 968/923/849 1729/930/849 973/933/849 236/924/849 +f 239/934/850 975/935/850 1730/936/850 974/937/850 +f 975/935/851 129/453/851 737/464/851 1730/936/851 +f 1730/936/852 737/464/852 180/463/852 971/927/852 +f 974/937/853 1730/936/853 971/927/853 237/926/853 +f 128/449/854 729/446/854 1731/938/854 972/931/854 +f 729/446/855 110/445/855 936/859/855 1731/938/855 +f 1731/938/856 936/859/856 256/861/856 976/939/856 +f 972/931/857 1731/938/857 976/939/857 238/932/857 +f 257/865/858 939/864/858 1732/940/858 977/941/858 +f 939/864/859 111/455/859 732/454/859 1732/940/859 +f 1732/940/860 732/454/860 129/453/860 975/935/860 +f 977/941/861 1732/940/861 975/935/861 239/934/861 +f 238/932/862 976/939/862 1733/942/862 978/943/862 +f 976/939/863 256/861/863 979/944/863 1733/942/863 +f 1733/942/864 979/944/864 258/945/864 980/946/864 +f 978/943/865 1733/942/865 980/946/865 276/947/865 +f 259/948/866 982/949/866 1734/950/866 981/951/866 +f 982/949/867 257/865/867 977/941/867 1734/950/867 +f 1734/950/868 977/941/868 239/934/868 983/952/868 +f 981/951/869 1734/950/869 983/952/869 277/953/869 +f 236/924/870 973/933/870 1735/954/870 984/955/870 +f 973/933/871 238/932/871 978/943/871 1735/954/871 +f 1735/954/872 978/943/872 276/947/872 985/956/872 +f 984/955/873 1735/954/873 985/956/873 278/957/873 +f 277/953/874 983/952/874 1736/958/874 986/959/874 +f 983/952/875 239/934/875 974/937/875 1736/958/875 +f 1736/958/876 974/937/876 237/926/876 987/960/876 +f 986/959/877 1736/958/877 987/960/877 279/961/877 +f 240/916/878 969/925/878 1737/962/878 988/963/878 +f 969/925/879 236/924/879 984/955/879 1737/962/879 +f 1737/962/880 984/955/880 278/957/880 989/964/880 +f 988/963/881 1737/962/881 989/964/881 274/965/881 +f 279/961/882 987/960/882 1738/966/882 990/967/882 +f 987/960/883 237/926/883 970/929/883 1738/966/883 +f 1738/966/884 970/929/884 241/918/884 991/968/884 +f 990/967/885 1738/966/885 991/968/885 275/969/885 +f 242/908/886 965/917/886 1739/970/886 992/971/886 +f 965/917/887 240/916/887 988/963/887 1739/970/887 +f 1739/970/888 988/963/888 274/965/888 993/972/888 +f 992/971/889 1739/970/889 993/972/889 272/973/889 +f 275/969/890 991/968/890 1740/974/890 994/975/890 +f 991/968/891 241/918/891 966/921/891 1740/974/891 +f 1740/974/892 966/921/892 243/910/892 995/976/892 +f 994/975/893 1740/974/893 995/976/893 273/977/893 +f 244/900/894 961/909/894 1741/978/894 996/979/894 +f 961/909/895 242/908/895 992/971/895 1741/978/895 +f 1741/978/896 992/971/896 272/973/896 997/980/896 +f 996/979/897 1741/978/897 997/980/897 270/981/897 +f 273/977/898 995/976/898 1742/982/898 998/983/898 +f 995/976/899 243/910/899 962/913/899 1742/982/899 +f 1742/982/900 962/913/900 245/902/900 999/984/900 +f 998/983/901 1742/982/901 999/984/901 271/985/901 +f 246/892/902 957/901/902 1743/986/902 1000/987/902 +f 957/901/903 244/900/903 996/979/903 1743/986/903 +f 1743/986/904 996/979/904 270/981/904 1001/988/904 +f 1000/987/905 1743/986/905 1001/988/905 268/989/905 +f 271/985/906 999/984/906 1744/990/906 1002/991/906 +f 999/984/907 245/902/907 958/905/907 1744/990/907 +f 1744/990/908 958/905/908 247/894/908 1003/992/908 +f 1002/991/909 1744/990/909 1003/992/909 269/993/909 +f 248/884/910 953/893/910 1745/994/910 1004/995/910 +f 953/893/911 246/892/911 1000/987/911 1745/994/911 +f 1745/994/912 1000/987/912 268/989/912 1005/996/912 +f 1004/995/913 1745/994/913 1005/996/913 266/997/913 +f 269/993/914 1003/992/914 1746/998/914 1006/999/914 +f 1003/992/915 247/894/915 954/897/915 1746/998/915 +f 1746/998/916 954/897/916 249/886/916 1007/1000/916 +f 1006/999/917 1746/998/917 1007/1000/917 267/1001/917 +f 250/876/918 949/885/918 1747/1002/918 1008/1003/918 +f 949/885/919 248/884/919 1004/995/919 1747/1002/919 +f 1747/1002/920 1004/995/920 266/997/920 1009/1004/920 +f 1008/1003/921 1747/1002/921 1009/1004/921 264/1005/921 +f 267/1001/922 1007/1000/922 1748/1006/922 1010/1007/922 +f 1007/1000/923 249/886/923 950/889/923 1748/1006/923 +f 1748/1006/924 950/889/924 251/878/924 1011/1008/924 +f 1010/1007/925 1748/1006/925 1011/1008/925 265/1009/925 +f 252/868/926 945/877/926 1749/1010/926 1012/1011/926 +f 945/877/927 250/876/927 1008/1003/927 1749/1010/927 +f 1749/1010/928 1008/1003/928 264/1005/928 1013/1012/928 +f 1012/1011/929 1749/1010/929 1013/1012/929 262/1013/929 +f 265/1009/930 1011/1008/930 1750/1014/930 1014/1015/930 +f 1011/1008/931 251/878/931 946/881/931 1750/1014/931 +f 1750/1014/932 946/881/932 253/870/932 1015/1016/932 +f 1014/1015/933 1750/1014/933 1015/1016/933 263/1017/933 +f 234/841/934 941/869/934 1751/1018/934 1016/1019/934 +f 941/869/935 252/868/935 1012/1011/935 1751/1018/935 +f 1751/1018/936 1012/1011/936 262/1013/936 1017/1020/936 +f 1016/1019/937 1751/1018/937 1017/1020/937 280/1021/937 +f 263/1017/938 1015/1016/938 1752/1022/938 1018/1023/938 +f 1015/1016/939 253/870/939 942/873/939 1752/1022/939 +f 1752/1022/940 942/873/940 235/844/940 1019/1024/940 +f 1018/1023/941 1752/1022/941 1019/1024/941 281/1025/941 +f 256/861/942 937/860/942 1753/1026/942 979/944/942 +f 937/860/943 254/853/943 1020/1027/943 1753/1026/943 +f 1753/1026/944 1020/1027/944 260/1028/944 1021/1029/944 +f 979/944/945 1753/1026/945 1021/1029/945 258/945/945 +f 261/1030/946 1023/1031/946 1754/1032/946 1022/1033/946 +f 1023/1031/947 255/857/947 938/863/947 1754/1032/947 +f 1754/1032/948 938/863/948 257/865/948 982/949/948 +f 1022/1033/949 1754/1032/949 982/949/949 259/948/949 +f 254/853/950 933/852/950 1755/1034/950 1020/1027/950 +f 933/852/951 232/843/951 1024/1035/951 1755/1034/951 +f 1755/1034/952 1024/1035/952 282/1036/952 1025/1037/952 +f 1020/1027/953 1755/1034/953 1025/1037/953 260/1028/953 +f 283/1038/954 1027/1039/954 1756/1040/954 1026/1041/954 +f 1027/1039/955 233/849/955 934/855/955 1756/1040/955 +f 1756/1040/956 934/855/956 255/857/956 1023/1031/956 +f 1026/1041/957 1756/1040/957 1023/1031/957 261/1030/957 +f 232/843/958 928/842/958 1757/1042/958 1024/1035/958 +f 928/842/959 234/841/959 1016/1019/959 1757/1042/959 +f 1757/1042/960 1016/1019/960 280/1021/960 1028/1043/960 +f 1024/1035/961 1757/1042/961 1028/1043/961 282/1036/961 +f 281/1025/962 1019/1024/962 1758/1044/962 1029/1045/962 +f 1019/1024/963 235/844/963 929/847/963 1758/1044/963 +f 1758/1044/964 929/847/964 233/849/964 1027/1039/964 +f 1029/1045/965 1758/1044/965 1027/1039/965 283/1038/965 +f 67/438/966 723/436/966 1759/1046/966 1030/1047/966 +f 723/436/967 108/426/967 1031/1048/967 1759/1046/967 +f 1759/1046/968 1031/1048/968 284/1049/968 1032/1050/968 +f 1030/1047/969 1759/1046/969 1032/1050/969 73/1051/969 +f 285/1052/970 1034/1053/970 1760/1054/970 1033/1055/970 +f 1034/1053/971 109/434/971 727/444/971 1760/1054/971 +f 1760/1054/972 727/444/972 67/438/972 1030/1047/972 +f 1033/1055/973 1760/1054/973 1030/1047/973 73/1051/973 +f 108/426/974 717/424/974 1761/1056/974 1031/1048/974 +f 717/424/975 106/414/975 1035/1057/975 1761/1056/975 +f 1761/1056/976 1035/1057/976 286/1058/976 1036/1059/976 +f 1031/1048/977 1761/1056/977 1036/1059/977 284/1049/977 +f 287/1060/978 1038/1061/978 1762/1062/978 1037/1063/978 +f 1038/1061/979 107/422/979 722/435/979 1762/1062/979 +f 1762/1062/980 722/435/980 109/434/980 1034/1053/980 +f 1037/1063/981 1762/1062/981 1034/1053/981 285/1052/981 +f 106/414/982 711/412/982 1763/1064/982 1035/1057/982 +f 711/412/983 104/402/983 1039/1065/983 1763/1064/983 +f 1763/1064/984 1039/1065/984 288/1066/984 1040/1067/984 +f 1035/1057/985 1763/1064/985 1040/1067/985 286/1058/985 +f 289/1068/986 1042/1069/986 1764/1070/986 1041/1071/986 +f 1042/1069/987 105/410/987 716/423/987 1764/1070/987 +f 1764/1070/988 716/423/988 107/422/988 1038/1061/988 +f 1041/1071/989 1764/1070/989 1038/1061/989 287/1060/989 +f 104/402/990 705/400/990 1765/1072/990 1039/1065/990 +f 705/400/991 102/390/991 1043/1073/991 1765/1072/991 +f 1765/1072/992 1043/1073/992 290/1074/992 1044/1075/992 +f 1039/1065/993 1765/1072/993 1044/1075/993 288/1066/993 +f 291/1076/994 1046/1077/994 1766/1078/994 1045/1079/994 +f 1046/1077/995 103/398/995 710/411/995 1766/1078/995 +f 1766/1078/996 710/411/996 105/410/996 1042/1069/996 +f 1045/1079/997 1766/1078/997 1042/1069/997 289/1068/997 +f 102/390/998 699/388/998 1767/1080/998 1043/1073/998 +f 699/388/999 100/378/999 1047/1081/999 1767/1080/999 +f 1767/1080/1000 1047/1081/1000 292/1082/1000 1048/1083/1000 +f 1043/1073/1001 1767/1080/1001 1048/1083/1001 290/1074/1001 +f 293/1084/1002 1050/1085/1002 1768/1086/1002 1049/1087/1002 +f 1050/1085/1003 101/386/1003 704/399/1003 1768/1086/1003 +f 1768/1086/1004 704/399/1004 103/398/1004 1046/1077/1004 +f 1049/1087/1005 1768/1086/1005 1046/1077/1005 291/1076/1005 +f 100/378/1006 693/376/1006 1769/1088/1006 1047/1081/1006 +f 693/376/1007 98/366/1007 1051/1089/1007 1769/1088/1007 +f 1769/1088/1008 1051/1089/1008 294/1090/1008 1052/1091/1008 +f 1047/1081/1009 1769/1088/1009 1052/1091/1009 292/1082/1009 +f 295/1092/1010 1054/1093/1010 1770/1094/1010 1053/1095/1010 +f 1054/1093/1011 99/374/1011 698/387/1011 1770/1094/1011 +f 1770/1094/1012 698/387/1012 101/386/1012 1050/1085/1012 +f 1053/1095/1013 1770/1094/1013 1050/1085/1013 293/1084/1013 +f 98/366/1014 687/364/1014 1771/1096/1014 1051/1089/1014 +f 687/364/1015 96/354/1015 1055/1097/1015 1771/1096/1015 +f 1771/1096/1016 1055/1097/1016 296/1098/1016 1056/1099/1016 +f 1051/1089/1017 1771/1096/1017 1056/1099/1017 294/1090/1017 +f 297/1100/1018 1058/1101/1018 1772/1102/1018 1057/1103/1018 +f 1058/1101/1019 97/362/1019 692/375/1019 1772/1102/1019 +f 1772/1102/1020 692/375/1020 99/374/1020 1054/1093/1020 +f 1057/1103/1021 1772/1102/1021 1054/1093/1021 295/1092/1021 +f 96/354/1022 681/352/1022 1773/1104/1022 1055/1097/1022 +f 681/352/1023 94/342/1023 1059/1105/1023 1773/1104/1023 +f 1773/1104/1024 1059/1105/1024 298/1106/1024 1060/1107/1024 +f 1055/1097/1025 1773/1104/1025 1060/1107/1025 296/1098/1025 +f 299/1108/1026 1062/1109/1026 1774/1110/1026 1061/1111/1026 +f 1062/1109/1027 95/350/1027 686/363/1027 1774/1110/1027 +f 1774/1110/1028 686/363/1028 97/362/1028 1058/1101/1028 +f 1061/1111/1029 1774/1110/1029 1058/1101/1029 297/1100/1029 +f 94/342/1030 675/340/1030 1775/1112/1030 1059/1105/1030 +f 675/340/1031 92/326/1031 1063/1113/1031 1775/1112/1031 +f 1775/1112/1032 1063/1113/1032 300/1114/1032 1064/1115/1032 +f 1059/1105/1033 1775/1112/1033 1064/1115/1033 298/1106/1033 +f 301/1116/1034 1066/1117/1034 1776/1118/1034 1065/1119/1034 +f 1066/1117/1035 93/335/1035 680/351/1035 1776/1118/1035 +f 1776/1118/1036 680/351/1036 95/350/1036 1062/1109/1036 +f 1065/1119/1037 1776/1118/1037 1062/1109/1037 299/1108/1037 +f 308/1120/1038 1068/1121/1038 1777/1122/1038 1067/1123/1038 +f 1068/1121/1039 309/1124/1039 1069/1125/1039 1777/1122/1039 +f 1777/1122/1040 1069/1125/1040 328/1126/1040 1070/1127/1040 +f 1067/1123/1041 1777/1122/1041 1070/1127/1041 338/1128/1041 +f 329/1129/1042 1072/1130/1042 1778/1131/1042 1071/1132/1042 +f 1072/1130/1043 309/1133/1043 1068/1134/1043 1778/1131/1043 +f 1778/1131/1044 1068/1134/1044 308/1135/1044 1073/1136/1044 +f 1071/1132/1045 1778/1131/1045 1073/1136/1045 339/1137/1045 +f 307/1138/1046 1075/1139/1046 1779/1140/1046 1074/1141/1046 +f 1075/1139/1047 308/1120/1047 1067/1123/1047 1779/1140/1047 +f 1779/1140/1048 1067/1123/1048 338/1128/1048 1076/1142/1048 +f 1074/1141/1049 1779/1140/1049 1076/1142/1049 336/1143/1049 +f 339/1137/1050 1073/1136/1050 1780/1144/1050 1077/1145/1050 +f 1073/1136/1051 308/1135/1051 1075/1146/1051 1780/1144/1051 +f 1780/1144/1052 1075/1146/1052 307/1147/1052 1078/1148/1052 +f 1077/1145/1053 1780/1144/1053 1078/1148/1053 337/1149/1053 +f 306/1150/1054 1080/1151/1054 1781/1152/1054 1079/1153/1054 +f 1080/1151/1055 307/1138/1055 1074/1141/1055 1781/1152/1055 +f 1781/1152/1056 1074/1141/1056 336/1143/1056 1081/1154/1056 +f 1079/1153/1057 1781/1152/1057 1081/1154/1057 340/1155/1057 +f 337/1149/1058 1078/1148/1058 1782/1156/1058 1082/1157/1058 +f 1078/1148/1059 307/1147/1059 1080/1158/1059 1782/1156/1059 +f 1782/1156/1060 1080/1158/1060 306/1150/1060 1083/1159/1060 +f 1082/1157/1061 1782/1156/1061 1083/1159/1061 341/1160/1061 +f 89/259/1062 636/262/1062 1783/1161/1062 1084/1162/1062 +f 636/262/1063 91/267/1063 1085/1163/1063 1783/1161/1063 +f 1783/1161/1064 1085/1163/1064 306/1150/1064 1079/1153/1064 +f 1084/1162/1065 1783/1161/1065 1079/1153/1065 340/1155/1065 +f 306/1150/1066 1085/1163/1066 1784/1164/1066 1083/1159/1066 +f 1085/1163/1067 91/267/1067 642/273/1067 1784/1164/1067 +f 1784/1164/1068 642/273/1068 90/272/1068 1086/1165/1068 +f 1083/1159/1069 1784/1164/1069 1086/1165/1069 341/1160/1069 +f 87/274/1070 643/277/1070 1785/1166/1070 1087/1167/1070 +f 643/277/1071 89/259/1071 1084/1162/1071 1785/1166/1071 +f 1785/1166/1072 1084/1162/1072 340/1155/1072 1088/1168/1072 +f 1087/1167/1073 1785/1166/1073 1088/1168/1073 334/1169/1073 +f 341/1160/1074 1086/1165/1074 1786/1170/1074 1089/1171/1074 +f 1086/1165/1075 90/272/1075 648/285/1075 1786/1170/1075 +f 1786/1170/1076 648/285/1076 88/284/1076 1090/1172/1076 +f 1089/1171/1077 1786/1170/1077 1090/1172/1077 335/1173/1077 +f 85/286/1078 649/289/1078 1787/1174/1078 1091/1175/1078 +f 649/289/1079 87/274/1079 1087/1167/1079 1787/1174/1079 +f 1787/1174/1080 1087/1167/1080 334/1169/1080 1092/1176/1080 +f 1091/1175/1081 1787/1174/1081 1092/1176/1081 330/1177/1081 +f 335/1173/1082 1090/1172/1082 1788/1178/1082 1093/1179/1082 +f 1090/1172/1083 88/284/1083 654/297/1083 1788/1178/1083 +f 1788/1178/1084 654/297/1084 86/296/1084 1094/1180/1084 +f 1093/1179/1085 1788/1178/1085 1094/1180/1085 331/1181/1085 +f 83/298/1086 655/301/1086 1789/1182/1086 1095/1183/1086 +f 655/301/1087 85/286/1087 1091/1175/1087 1789/1182/1087 +f 1789/1182/1088 1091/1175/1088 330/1177/1088 1096/1184/1088 +f 1095/1183/1089 1789/1182/1089 1096/1184/1089 332/1185/1089 +f 331/1181/1090 1094/1180/1090 1790/1186/1090 1097/1187/1090 +f 1094/1180/1091 86/296/1091 660/309/1091 1790/1186/1091 +f 1790/1186/1092 660/309/1092 84/308/1092 1098/1188/1092 +f 1097/1187/1093 1790/1186/1093 1098/1188/1093 333/1189/1093 +f 330/1177/1094 1099/1190/1094 1791/1191/1094 1096/1184/1094 +f 1099/1190/1095 336/1143/1095 1076/1142/1095 1791/1191/1095 +f 1791/1191/1096 1076/1142/1096 338/1128/1096 1100/1192/1096 +f 1096/1184/1097 1791/1191/1097 1100/1192/1097 332/1185/1097 +f 339/1137/1098 1077/1145/1098 1792/1193/1098 1101/1194/1098 +f 1077/1145/1099 337/1149/1099 1102/1195/1099 1792/1193/1099 +f 1792/1193/1100 1102/1195/1100 331/1181/1100 1097/1187/1100 +f 1101/1194/1101 1792/1193/1101 1097/1187/1101 333/1189/1101 +f 330/1177/1102 1092/1176/1102 1793/1196/1102 1099/1190/1102 +f 1092/1176/1103 334/1169/1103 1088/1168/1103 1793/1196/1103 +f 1793/1196/1104 1088/1168/1104 340/1155/1104 1081/1154/1104 +f 1099/1190/1105 1793/1196/1105 1081/1154/1105 336/1143/1105 +f 341/1160/1106 1089/1171/1106 1794/1197/1106 1082/1157/1106 +f 1089/1171/1107 335/1173/1107 1093/1179/1107 1794/1197/1107 +f 1794/1197/1108 1093/1179/1108 331/1181/1108 1102/1195/1108 +f 1082/1157/1109 1794/1197/1109 1102/1195/1109 337/1149/1109 +f 326/1198/1110 1104/1199/1110 1795/1200/1110 1103/1201/1110 +f 1104/1199/1111 332/1185/1111 1100/1192/1111 1795/1200/1111 +f 1795/1200/1112 1100/1192/1112 338/1128/1112 1070/1127/1112 +f 1103/1201/1113 1795/1200/1113 1070/1127/1113 328/1126/1113 +f 339/1137/1114 1101/1194/1114 1796/1202/1114 1071/1132/1114 +f 1101/1194/1115 333/1189/1115 1105/1203/1115 1796/1202/1115 +f 1796/1202/1116 1105/1203/1116 327/1204/1116 1106/1205/1116 +f 1071/1132/1117 1796/1202/1117 1106/1205/1117 329/1129/1117 +f 81/310/1118 661/313/1118 1797/1206/1118 1107/1207/1118 +f 661/313/1119 83/298/1119 1095/1183/1119 1797/1206/1119 +f 1797/1206/1120 1095/1183/1120 332/1185/1120 1104/1199/1120 +f 1107/1207/1121 1797/1206/1121 1104/1199/1121 326/1198/1121 +f 333/1189/1122 1098/1188/1122 1798/1208/1122 1105/1203/1122 +f 1098/1188/1123 84/308/1123 666/321/1123 1798/1208/1123 +f 1798/1208/1124 666/321/1124 82/320/1124 1108/1209/1124 +f 1105/1203/1125 1798/1208/1125 1108/1209/1125 327/1204/1125 +f 209/749/1126 1109/1210/1126 1799/1211/1126 885/755/1126 +f 1109/1210/1127 342/1212/1127 1110/1213/1127 1799/1211/1127 +f 1799/1211/1128 1110/1213/1128 344/1214/1128 1111/1215/1128 +f 885/755/1129 1799/1211/1129 1111/1215/1129 215/757/1129 +f 345/1216/1130 1113/1217/1130 1800/1218/1130 1112/1219/1130 +f 1113/1217/1131 343/1220/1131 1114/1221/1131 1800/1218/1131 +f 1800/1218/1132 1114/1221/1132 210/753/1132 888/762/1132 +f 1112/1219/1133 1800/1218/1133 888/762/1133 216/761/1133 +f 81/310/1134 1107/1207/1134 1801/1222/1134 881/747/1134 +f 1107/1207/1135 326/1198/1135 1115/1223/1135 1801/1222/1135 +f 1801/1222/1136 1115/1223/1136 342/1212/1136 1109/1210/1136 +f 881/747/1137 1801/1222/1137 1109/1210/1137 209/749/1137 +f 343/1220/1138 1116/1224/1138 1802/1225/1138 1114/1221/1138 +f 1116/1224/1139 327/1204/1139 1108/1209/1139 1802/1225/1139 +f 1802/1225/1140 1108/1209/1140 82/320/1140 884/754/1140 +f 1114/1221/1141 1802/1225/1141 884/754/1141 210/753/1141 +f 79/322/1142 889/764/1142 1803/1226/1142 1117/1227/1142 +f 889/764/1143 215/757/1143 1111/1215/1143 1803/1226/1143 +f 1803/1226/1144 1111/1215/1144 344/1214/1144 1118/1228/1144 +f 1117/1227/1145 1803/1226/1145 1118/1228/1145 346/1229/1145 +f 345/1216/1146 1112/1219/1146 1804/1230/1146 1119/1231/1146 +f 1112/1219/1147 216/761/1147 890/766/1147 1804/1230/1147 +f 1804/1230/1148 890/766/1148 80/337/1148 1120/1232/1148 +f 1119/1231/1149 1804/1230/1149 1120/1232/1149 347/1233/1149 +f 79/322/1150 1117/1227/1150 1805/1234/1150 668/323/1150 +f 1117/1227/1151 346/1229/1151 1121/1235/1151 1805/1234/1151 +f 1805/1234/1152 1121/1235/1152 300/1114/1152 1063/1113/1152 +f 668/323/1153 1805/1234/1153 1063/1113/1153 92/326/1153 +f 301/1116/1154 1122/1236/1154 1806/1237/1154 1066/1117/1154 +f 1122/1236/1155 347/1233/1155 1120/1232/1155 1806/1237/1155 +f 1806/1237/1156 1120/1232/1156 80/337/1156 673/336/1156 +f 1066/1117/1157 1806/1237/1157 673/336/1157 93/335/1157 +f 77/1238/1158 1124/1239/1158 1807/1240/1158 1123/1241/1158 +f 1124/1239/1159 324/1242/1159 1125/1243/1159 1807/1240/1159 +f 1807/1240/1160 1125/1243/1160 352/1244/1160 1126/1245/1160 +f 1123/1241/1161 1807/1240/1161 1126/1245/1161 304/1246/1161 +f 353/1247/1162 1128/1248/1162 1808/1249/1162 1127/1250/1162 +f 1128/1248/1163 325/1251/1163 1129/1252/1163 1808/1249/1163 +f 1808/1249/1164 1129/1252/1164 77/1253/1164 1123/1254/1164 +f 1127/1250/1165 1808/1249/1165 1123/1254/1165 304/1255/1165 +f 304/1246/1166 1126/1245/1166 1809/1256/1166 1130/1257/1166 +f 1126/1245/1167 352/1244/1167 1131/1258/1167 1809/1256/1167 +f 1809/1256/1168 1131/1258/1168 350/1259/1168 1132/1260/1168 +f 1130/1257/1169 1809/1256/1169 1132/1260/1169 78/1261/1169 +f 351/1262/1170 1134/1263/1170 1810/1264/1170 1133/1265/1170 +f 1134/1263/1171 353/1247/1171 1127/1250/1171 1810/1264/1171 +f 1810/1264/1172 1127/1250/1172 304/1255/1172 1130/1266/1172 +f 1133/1265/1173 1810/1264/1173 1130/1266/1173 78/1267/1173 +f 78/1261/1174 1132/1260/1174 1811/1268/1174 1135/1269/1174 +f 1132/1260/1175 350/1259/1175 1136/1270/1175 1811/1268/1175 +f 1811/1268/1176 1136/1270/1176 348/1271/1176 1137/1272/1176 +f 1135/1269/1177 1811/1268/1177 1137/1272/1177 305/1273/1177 +f 349/1274/1178 1139/1275/1178 1812/1276/1178 1138/1277/1178 +f 1139/1275/1179 351/1262/1179 1133/1265/1179 1812/1276/1179 +f 1812/1276/1180 1133/1265/1180 78/1267/1180 1135/1278/1180 +f 1138/1277/1181 1812/1276/1181 1135/1278/1181 305/1279/1181 +f 305/1273/1182 1137/1272/1182 1813/1280/1182 1140/1281/1182 +f 1137/1272/1183 348/1271/1183 1141/1282/1183 1813/1280/1183 +f 1813/1280/1184 1141/1282/1184 328/1126/1184 1069/1125/1184 +f 1140/1281/1185 1813/1280/1185 1069/1125/1185 309/1124/1185 +f 329/1129/1186 1142/1283/1186 1814/1284/1186 1072/1130/1186 +f 1142/1283/1187 349/1274/1187 1138/1277/1187 1814/1284/1187 +f 1814/1284/1188 1138/1277/1188 305/1279/1188 1140/1285/1188 +f 1072/1130/1189 1814/1284/1189 1140/1285/1189 309/1133/1189 +f 326/1198/1190 1103/1201/1190 1815/1286/1190 1115/1223/1190 +f 1103/1201/1191 328/1126/1191 1141/1282/1191 1815/1286/1191 +f 1815/1286/1192 1141/1282/1192 348/1271/1192 1143/1287/1192 +f 1115/1223/1193 1815/1286/1193 1143/1287/1193 342/1212/1193 +f 349/1274/1194 1142/1283/1194 1816/1288/1194 1144/1289/1194 +f 1142/1283/1195 329/1129/1195 1106/1205/1195 1816/1288/1195 +f 1816/1288/1196 1106/1205/1196 327/1204/1196 1116/1224/1196 +f 1144/1289/1197 1816/1288/1197 1116/1224/1197 343/1220/1197 +f 296/1098/1198 1060/1107/1198 1817/1290/1198 1145/1291/1198 +f 1060/1107/1199 298/1106/1199 1146/1292/1199 1817/1290/1199 +f 1817/1290/1200 1146/1292/1200 318/1293/1200 1147/1294/1200 +f 1145/1291/1201 1817/1290/1201 1147/1294/1201 310/1295/1201 +f 319/1296/1202 1149/1297/1202 1818/1298/1202 1148/1299/1202 +f 1149/1297/1203 299/1108/1203 1061/1111/1203 1818/1298/1203 +f 1818/1298/1204 1061/1111/1204 297/1100/1204 1150/1300/1204 +f 1148/1299/1205 1818/1298/1205 1150/1300/1205 311/1301/1205 +f 76/1302/1206 1152/1303/1206 1819/1304/1206 1151/1305/1206 +f 1152/1303/1207 316/1306/1207 1153/1307/1207 1819/1304/1207 +f 1819/1304/1208 1153/1307/1208 324/1242/1208 1124/1239/1208 +f 1151/1305/1209 1819/1304/1209 1124/1239/1209 77/1238/1209 +f 325/1251/1210 1154/1308/1210 1820/1309/1210 1129/1252/1210 +f 1154/1308/1211 317/1310/1211 1155/1311/1211 1820/1309/1211 +f 1820/1309/1212 1155/1311/1212 76/1312/1212 1151/1313/1212 +f 1129/1252/1213 1820/1309/1213 1151/1313/1213 77/1253/1213 +f 302/1314/1214 1157/1315/1214 1821/1316/1214 1156/1317/1214 +f 1157/1315/1215 358/1318/1215 1158/1319/1215 1821/1316/1215 +f 1821/1316/1216 1158/1319/1216 356/1320/1216 1159/1321/1216 +f 1156/1317/1217 1821/1316/1217 1159/1321/1217 303/1322/1217 +f 357/1323/1218 1161/1324/1218 1822/1325/1218 1160/1326/1218 +f 1161/1324/1219 359/1327/1219 1162/1328/1219 1822/1325/1219 +f 1822/1325/1220 1162/1328/1220 302/1329/1220 1156/1330/1220 +f 1160/1326/1221 1822/1325/1221 1156/1330/1221 303/1331/1221 +f 303/1322/1222 1159/1321/1222 1823/1332/1222 1163/1333/1222 +f 1159/1321/1223 356/1320/1223 1164/1334/1223 1823/1332/1223 +f 1823/1332/1224 1164/1334/1224 354/1335/1224 1165/1336/1224 +f 1163/1333/1225 1823/1332/1225 1165/1336/1225 75/1337/1225 +f 355/1338/1226 1167/1339/1226 1824/1340/1226 1166/1341/1226 +f 1167/1339/1227 357/1323/1227 1160/1326/1227 1824/1340/1227 +f 1824/1340/1228 1160/1326/1228 303/1331/1228 1163/1342/1228 +f 1166/1341/1229 1824/1340/1229 1163/1342/1229 75/1343/1229 +f 75/1337/1230 1165/1336/1230 1825/1344/1230 1168/1345/1230 +f 1165/1336/1231 354/1335/1231 1169/1346/1231 1825/1344/1231 +f 1825/1344/1232 1169/1346/1232 316/1306/1232 1152/1303/1232 +f 1168/1345/1233 1825/1344/1233 1152/1303/1233 76/1302/1233 +f 317/1310/1234 1170/1347/1234 1826/1348/1234 1155/1311/1234 +f 1170/1347/1235 355/1338/1235 1166/1341/1235 1826/1348/1235 +f 1826/1348/1236 1166/1341/1236 75/1343/1236 1168/1349/1236 +f 1155/1311/1237 1826/1348/1237 1168/1349/1237 76/1312/1237 +f 292/1350/1238 1052/1351/1238 1827/1352/1238 1171/1353/1238 +f 1052/1351/1239 294/1090/1239 1172/1354/1239 1827/1352/1239 +f 1827/1352/1240 1172/1354/1240 362/1355/1240 1173/1356/1240 +f 1171/1353/1241 1827/1352/1241 1173/1356/1241 364/1357/1241 +f 363/1358/1242 1175/1359/1242 1828/1360/1242 1174/1361/1242 +f 1175/1359/1243 295/1092/1243 1053/1362/1243 1828/1360/1243 +f 1828/1360/1244 1053/1362/1244 293/1363/1244 1176/1364/1244 +f 1174/1361/1245 1828/1360/1245 1176/1364/1245 365/1365/1245 +f 364/1357/1246 1173/1356/1246 1829/1366/1246 1177/1367/1246 +f 1173/1356/1247 362/1355/1247 1178/1368/1247 1829/1366/1247 +f 1829/1366/1248 1178/1368/1248 368/1369/1248 1179/1370/1248 +f 1177/1367/1249 1829/1366/1249 1179/1370/1249 366/1371/1249 +f 369/1372/1250 1181/1373/1250 1830/1374/1250 1180/1375/1250 +f 1181/1373/1251 363/1358/1251 1174/1361/1251 1830/1374/1251 +f 1830/1374/1252 1174/1361/1252 365/1365/1252 1182/1376/1252 +f 1180/1375/1253 1830/1374/1253 1182/1376/1253 367/1377/1253 +f 366/1371/1254 1179/1370/1254 1831/1378/1254 1183/1379/1254 +f 1179/1370/1255 368/1369/1255 1184/1380/1255 1831/1378/1255 +f 1831/1378/1256 1184/1380/1256 370/1381/1256 1185/1382/1256 +f 1183/1379/1257 1831/1378/1257 1185/1382/1257 372/1383/1257 +f 371/1384/1258 1187/1385/1258 1832/1386/1258 1186/1387/1258 +f 1187/1385/1259 369/1372/1259 1180/1375/1259 1832/1386/1259 +f 1832/1386/1260 1180/1375/1260 367/1377/1260 1188/1388/1260 +f 1186/1387/1261 1832/1386/1261 1188/1388/1261 373/1389/1261 +f 372/1383/1262 1185/1382/1262 1833/1390/1262 1189/1391/1262 +f 1185/1382/1263 370/1381/1263 1190/1392/1263 1833/1390/1263 +f 1833/1390/1264 1190/1392/1264 376/1393/1264 1191/1394/1264 +f 1189/1391/1265 1833/1390/1265 1191/1394/1265 374/1395/1265 +f 377/1396/1266 1193/1397/1266 1834/1398/1266 1192/1399/1266 +f 1193/1397/1267 371/1384/1267 1186/1387/1267 1834/1398/1267 +f 1834/1398/1268 1186/1387/1268 373/1389/1268 1194/1400/1268 +f 1192/1399/1269 1834/1398/1269 1194/1400/1269 375/1401/1269 +f 314/1402/1270 1196/1403/1270 1835/1404/1270 1195/1405/1270 +f 1196/1403/1271 378/1406/1271 1197/1407/1271 1835/1404/1271 +f 1835/1404/1272 1197/1407/1272 374/1395/1272 1191/1394/1272 +f 1195/1405/1273 1835/1404/1273 1191/1394/1273 376/1393/1273 +f 375/1401/1274 1198/1408/1274 1836/1409/1274 1192/1399/1274 +f 1198/1408/1275 379/1410/1275 1199/1411/1275 1836/1409/1275 +f 1836/1409/1276 1199/1411/1276 315/1412/1276 1200/1413/1276 +f 1192/1399/1277 1836/1409/1277 1200/1413/1277 377/1396/1277 +f 316/1306/1278 1169/1346/1278 1837/1414/1278 1201/1415/1278 +f 1169/1346/1279 354/1335/1279 1202/1416/1279 1837/1414/1279 +f 1837/1414/1280 1202/1416/1280 374/1395/1280 1197/1407/1280 +f 1201/1415/1281 1837/1414/1281 1197/1407/1281 378/1406/1281 +f 375/1401/1282 1203/1417/1282 1838/1418/1282 1198/1408/1282 +f 1203/1417/1283 355/1338/1283 1170/1347/1283 1838/1418/1283 +f 1838/1418/1284 1170/1347/1284 317/1310/1284 1204/1419/1284 +f 1198/1408/1285 1838/1418/1285 1204/1419/1285 379/1410/1285 +f 354/1335/1286 1164/1334/1286 1839/1420/1286 1202/1416/1286 +f 1164/1334/1287 356/1320/1287 1205/1421/1287 1839/1420/1287 +f 1839/1420/1288 1205/1421/1288 372/1383/1288 1189/1391/1288 +f 1202/1416/1289 1839/1420/1289 1189/1391/1289 374/1395/1289 +f 373/1389/1290 1206/1422/1290 1840/1423/1290 1194/1400/1290 +f 1206/1422/1291 357/1323/1291 1167/1339/1291 1840/1423/1291 +f 1840/1423/1292 1167/1339/1292 355/1338/1292 1203/1417/1292 +f 1194/1400/1293 1840/1423/1293 1203/1417/1293 375/1401/1293 +f 356/1320/1294 1158/1319/1294 1841/1424/1294 1205/1421/1294 +f 1158/1319/1295 358/1318/1295 1207/1425/1295 1841/1424/1295 +f 1841/1424/1296 1207/1425/1296 366/1371/1296 1183/1379/1296 +f 1205/1421/1297 1841/1424/1297 1183/1379/1297 372/1383/1297 +f 367/1377/1298 1208/1426/1298 1842/1427/1298 1188/1388/1298 +f 1208/1426/1299 359/1327/1299 1161/1324/1299 1842/1427/1299 +f 1842/1427/1300 1161/1324/1300 357/1323/1300 1206/1422/1300 +f 1188/1388/1301 1842/1427/1301 1206/1422/1301 373/1389/1301 +f 358/1318/1302 1209/1428/1302 1843/1429/1302 1207/1425/1302 +f 1209/1428/1303 360/1430/1303 1210/1431/1303 1843/1429/1303 +f 1843/1429/1304 1210/1431/1304 364/1357/1304 1177/1367/1304 +f 1207/1425/1305 1843/1429/1305 1177/1367/1305 366/1371/1305 +f 365/1365/1306 1211/1432/1306 1844/1433/1306 1182/1376/1306 +f 1211/1432/1307 361/1434/1307 1212/1435/1307 1844/1433/1307 +f 1844/1433/1308 1212/1435/1308 359/1327/1308 1208/1426/1308 +f 1182/1376/1309 1844/1433/1309 1208/1426/1309 367/1377/1309 +f 290/1436/1310 1048/1437/1310 1845/1438/1310 1213/1439/1310 +f 1048/1437/1311 292/1350/1311 1171/1353/1311 1845/1438/1311 +f 1845/1438/1312 1171/1353/1312 364/1357/1312 1210/1431/1312 +f 1213/1439/1313 1845/1438/1313 1210/1431/1313 360/1430/1313 +f 365/1365/1314 1176/1364/1314 1846/1440/1314 1211/1432/1314 +f 1176/1364/1315 293/1363/1315 1049/1441/1315 1846/1440/1315 +f 1846/1440/1316 1049/1441/1316 291/1442/1316 1214/1443/1316 +f 1211/1432/1317 1846/1440/1317 1214/1443/1317 361/1434/1317 +f 74/1444/1318 1216/1445/1318 1847/1446/1318 1215/1447/1318 +f 1216/1445/1319 360/1430/1319 1209/1428/1319 1847/1446/1319 +f 1847/1446/1320 1209/1428/1320 358/1318/1320 1157/1315/1320 +f 1215/1447/1321 1847/1446/1321 1157/1315/1321 302/1314/1321 +f 359/1327/1322 1212/1435/1322 1848/1448/1322 1162/1328/1322 +f 1212/1435/1323 361/1434/1323 1217/1449/1323 1848/1448/1323 +f 1848/1448/1324 1217/1449/1324 74/1450/1324 1215/1451/1324 +f 1162/1328/1325 1848/1448/1325 1215/1451/1325 302/1329/1325 +f 284/1452/1326 1036/1453/1326 1849/1454/1326 1218/1455/1326 +f 1036/1453/1327 286/1456/1327 1040/1457/1327 1849/1454/1327 +f 1849/1454/1328 1040/1457/1328 288/1458/1328 1044/1459/1328 +f 1218/1455/1329 1849/1454/1329 1044/1459/1329 290/1436/1329 +f 289/1460/1330 1041/1461/1330 1850/1462/1330 1045/1463/1330 +f 1041/1461/1331 287/1464/1331 1037/1465/1331 1850/1462/1331 +f 1850/1462/1332 1037/1465/1332 285/1466/1332 1219/1467/1332 +f 1045/1463/1333 1850/1462/1333 1219/1467/1333 291/1442/1333 +f 284/1452/1334 1218/1455/1334 1851/1468/1334 1220/1469/1334 +f 1218/1455/1335 290/1436/1335 1213/1439/1335 1851/1468/1335 +f 1851/1468/1336 1213/1439/1336 360/1430/1336 1216/1445/1336 +f 1220/1469/1337 1851/1468/1337 1216/1445/1337 74/1444/1337 +f 361/1434/1338 1214/1443/1338 1852/1470/1338 1217/1449/1338 +f 1214/1443/1339 291/1442/1339 1219/1467/1339 1852/1470/1339 +f 1852/1470/1340 1219/1467/1340 285/1466/1340 1221/1471/1340 +f 1217/1449/1341 1852/1470/1341 1221/1471/1341 74/1450/1341 +f 73/1472/1342 1032/1473/1342 1853/1474/1342 1222/1475/1342 +f 284/1452/1343 1220/1469/1343 1853/1474/1343 1032/1473/1343 +f 74/1444/1344 1222/1475/1344 1853/1474/1344 1220/1469/1344 +f 74/1450/1345 1221/1471/1345 1854/1476/1345 1222/1477/1345 +f 285/1466/1346 1033/1478/1346 1854/1476/1346 1221/1471/1346 +f 73/1479/1347 1222/1477/1347 1854/1476/1347 1033/1478/1347 +f 294/1090/1348 1056/1099/1348 1855/1480/1348 1172/1354/1348 +f 1056/1099/1349 296/1098/1349 1145/1291/1349 1855/1480/1349 +f 1855/1480/1350 1145/1291/1350 310/1295/1350 1223/1481/1350 +f 1172/1354/1351 1855/1480/1351 1223/1481/1351 362/1355/1351 +f 311/1301/1352 1150/1300/1352 1856/1482/1352 1224/1483/1352 +f 1150/1300/1353 297/1100/1353 1057/1103/1353 1856/1482/1353 +f 1856/1482/1354 1057/1103/1354 295/1092/1354 1175/1359/1354 +f 1224/1483/1355 1856/1482/1355 1175/1359/1355 363/1358/1355 +f 310/1295/1356 1225/1484/1356 1857/1485/1356 1223/1481/1356 +f 1225/1484/1357 312/1486/1357 1226/1487/1357 1857/1485/1357 +f 1857/1485/1358 1226/1487/1358 368/1369/1358 1178/1368/1358 +f 1223/1481/1359 1857/1485/1359 1178/1368/1359 362/1355/1359 +f 369/1372/1360 1227/1488/1360 1858/1489/1360 1181/1373/1360 +f 1227/1488/1361 313/1490/1361 1228/1491/1361 1858/1489/1361 +f 1858/1489/1362 1228/1491/1362 311/1301/1362 1224/1483/1362 +f 1181/1373/1363 1858/1489/1363 1224/1483/1363 363/1358/1363 +f 312/1486/1364 1229/1492/1364 1859/1493/1364 1226/1487/1364 +f 1229/1492/1365 382/1494/1365 1230/1495/1365 1859/1493/1365 +f 1859/1493/1366 1230/1495/1366 370/1381/1366 1184/1380/1366 +f 1226/1487/1367 1859/1493/1367 1184/1380/1367 368/1369/1367 +f 371/1384/1368 1231/1496/1368 1860/1497/1368 1187/1385/1368 +f 1231/1496/1369 383/1498/1369 1232/1499/1369 1860/1497/1369 +f 1860/1497/1370 1232/1499/1370 313/1490/1370 1227/1488/1370 +f 1187/1385/1371 1860/1497/1371 1227/1488/1371 369/1372/1371 +f 314/1402/1372 1195/1405/1372 1861/1500/1372 1233/1501/1372 +f 1195/1405/1373 376/1393/1373 1190/1392/1373 1861/1500/1373 +f 1861/1500/1374 1190/1392/1374 370/1381/1374 1230/1495/1374 +f 1233/1501/1375 1861/1500/1375 1230/1495/1375 382/1494/1375 +f 371/1384/1376 1193/1397/1376 1862/1502/1376 1231/1496/1376 +f 1193/1397/1377 377/1396/1377 1200/1413/1377 1862/1502/1377 +f 1862/1502/1378 1200/1413/1378 315/1412/1378 1234/1503/1378 +f 1231/1496/1379 1862/1502/1379 1234/1503/1379 383/1498/1379 +f 348/1271/1380 1136/1270/1380 1863/1504/1380 1235/1505/1380 +f 1136/1270/1381 350/1259/1381 1236/1506/1381 1863/1504/1381 +f 1863/1504/1382 1236/1506/1382 386/1507/1382 1237/1508/1382 +f 1235/1505/1383 1863/1504/1383 1237/1508/1383 384/1509/1383 +f 387/1510/1384 1239/1511/1384 1864/1512/1384 1238/1513/1384 +f 1239/1511/1385 351/1262/1385 1139/1275/1385 1864/1512/1385 +f 1864/1512/1386 1139/1275/1386 349/1274/1386 1240/1514/1386 +f 1238/1513/1387 1864/1512/1387 1240/1514/1387 385/1515/1387 +f 318/1293/1388 1242/1516/1388 1865/1517/1388 1241/1518/1388 +f 1242/1516/1389 384/1509/1389 1237/1508/1389 1865/1517/1389 +f 1865/1517/1390 1237/1508/1390 386/1507/1390 1243/1519/1390 +f 1241/1518/1391 1865/1517/1391 1243/1519/1391 320/1520/1391 +f 387/1510/1392 1238/1513/1392 1866/1521/1392 1244/1522/1392 +f 1238/1513/1393 385/1515/1393 1245/1523/1393 1866/1521/1393 +f 1866/1521/1394 1245/1523/1394 319/1296/1394 1246/1524/1394 +f 1244/1522/1395 1866/1521/1395 1246/1524/1395 321/1525/1395 +f 298/1106/1396 1064/1115/1396 1867/1526/1396 1146/1292/1396 +f 1064/1115/1397 300/1114/1397 1247/1527/1397 1867/1526/1397 +f 1867/1526/1398 1247/1527/1398 384/1509/1398 1242/1516/1398 +f 1146/1292/1399 1867/1526/1399 1242/1516/1399 318/1293/1399 +f 385/1515/1400 1248/1528/1400 1868/1529/1400 1245/1523/1400 +f 1248/1528/1401 301/1116/1401 1065/1119/1401 1868/1529/1401 +f 1868/1529/1402 1065/1119/1402 299/1108/1402 1149/1297/1402 +f 1245/1523/1403 1868/1529/1403 1149/1297/1403 319/1296/1403 +f 300/1114/1404 1249/1530/1404 1869/1531/1404 1247/1527/1404 +f 1249/1530/1405 344/1214/1405 1110/1213/1405 1869/1531/1405 +f 1869/1531/1406 1110/1213/1406 342/1212/1406 1250/1532/1406 +f 1247/1527/1407 1869/1531/1407 1250/1532/1407 384/1509/1407 +f 343/1220/1408 1113/1217/1408 1870/1533/1408 1251/1534/1408 +f 1113/1217/1409 345/1216/1409 1252/1535/1409 1870/1533/1409 +f 1870/1533/1410 1252/1535/1410 301/1116/1410 1248/1528/1410 +f 1251/1534/1411 1870/1533/1411 1248/1528/1411 385/1515/1411 +f 342/1212/1412 1143/1287/1412 1871/1536/1412 1250/1532/1412 +f 348/1271/1413 1235/1505/1413 1871/1536/1413 1143/1287/1413 +f 384/1509/1414 1250/1532/1414 1871/1536/1414 1235/1505/1414 +f 385/1515/1415 1240/1514/1415 1872/1537/1415 1251/1534/1415 +f 349/1274/1416 1144/1289/1416 1872/1537/1416 1240/1514/1416 +f 343/1220/1417 1251/1534/1417 1872/1537/1417 1144/1289/1417 +f 300/1114/1418 1121/1235/1418 1873/1538/1418 1249/1530/1418 +f 346/1229/1419 1118/1228/1419 1873/1538/1419 1121/1235/1419 +f 344/1214/1420 1249/1530/1420 1873/1538/1420 1118/1228/1420 +f 345/1216/1421 1119/1231/1421 1874/1539/1421 1252/1535/1421 +f 347/1233/1422 1122/1236/1422 1874/1539/1422 1119/1231/1422 +f 301/1116/1423 1252/1535/1423 1874/1539/1423 1122/1236/1423 +f 314/1402/1424 1253/1540/1424 1875/1541/1424 1196/1403/1424 +f 1253/1540/1425 322/1542/1425 1254/1543/1425 1875/1541/1425 +f 1875/1541/1426 1254/1543/1426 380/1544/1426 1255/1545/1426 +f 1196/1403/1427 1875/1541/1427 1255/1545/1427 378/1406/1427 +f 381/1546/1428 1257/1547/1428 1876/1548/1428 1256/1549/1428 +f 1257/1547/1429 323/1550/1429 1258/1551/1429 1876/1548/1429 +f 1876/1548/1430 1258/1551/1430 315/1412/1430 1199/1411/1430 +f 1256/1549/1431 1876/1548/1431 1199/1411/1431 379/1410/1431 +f 316/1306/1432 1201/1415/1432 1877/1552/1432 1153/1307/1432 +f 1201/1415/1433 378/1406/1433 1255/1545/1433 1877/1552/1433 +f 1877/1552/1434 1255/1545/1434 380/1544/1434 1259/1553/1434 +f 1153/1307/1435 1877/1552/1435 1259/1553/1435 324/1242/1435 +f 381/1546/1436 1256/1549/1436 1878/1554/1436 1260/1555/1436 +f 1256/1549/1437 379/1410/1437 1204/1419/1437 1878/1554/1437 +f 1878/1554/1438 1204/1419/1438 317/1310/1438 1154/1308/1438 +f 1260/1555/1439 1878/1554/1439 1154/1308/1439 325/1251/1439 +f 320/1520/1440 1243/1519/1440 1879/1556/1440 1261/1557/1440 +f 1243/1519/1441 386/1507/1441 1262/1558/1441 1879/1556/1441 +f 1879/1556/1442 1262/1558/1442 380/1544/1442 1254/1543/1442 +f 1261/1557/1443 1879/1556/1443 1254/1543/1443 322/1542/1443 +f 381/1546/1444 1263/1559/1444 1880/1560/1444 1257/1547/1444 +f 1263/1559/1445 387/1510/1445 1244/1522/1445 1880/1560/1445 +f 1880/1560/1446 1244/1522/1446 321/1525/1446 1264/1561/1446 +f 1257/1547/1447 1880/1560/1447 1264/1561/1447 323/1550/1447 +f 350/1259/1448 1131/1258/1448 1881/1562/1448 1236/1506/1448 +f 1131/1258/1449 352/1244/1449 1265/1563/1449 1881/1562/1449 +f 1881/1562/1450 1265/1563/1450 380/1544/1450 1262/1558/1450 +f 1236/1506/1451 1881/1562/1451 1262/1558/1451 386/1507/1451 +f 381/1546/1452 1266/1564/1452 1882/1565/1452 1263/1559/1452 +f 1266/1564/1453 353/1247/1453 1134/1263/1453 1882/1565/1453 +f 1882/1565/1454 1134/1263/1454 351/1262/1454 1239/1511/1454 +f 1263/1559/1455 1882/1565/1455 1239/1511/1455 387/1510/1455 +f 324/1242/1456 1259/1553/1456 1883/1566/1456 1125/1243/1456 +f 380/1544/1457 1265/1563/1457 1883/1566/1457 1259/1553/1457 +f 352/1244/1458 1125/1243/1458 1883/1566/1458 1265/1563/1458 +f 353/1247/1459 1266/1564/1459 1884/1567/1459 1128/1248/1459 +f 381/1546/1460 1260/1555/1460 1884/1567/1460 1266/1564/1460 +f 325/1251/1461 1128/1248/1461 1884/1567/1461 1260/1555/1461 +f 400/1568/1462 1268/1569/1462 1885/1570/1462 1267/1571/1462 +f 1268/1569/1463 388/1572/1463 1269/1573/1463 1885/1570/1463 +f 1885/1570/1464 1269/1573/1464 414/1574/1464 1270/1575/1464 +f 1267/1571/1465 1885/1570/1465 1270/1575/1465 402/1576/1465 +f 415/1577/1466 1272/1578/1466 1886/1579/1466 1271/1580/1466 +f 1272/1578/1467 389/1581/1467 1273/1582/1467 1886/1579/1467 +f 1886/1579/1468 1273/1582/1468 401/1583/1468 1274/1584/1468 +f 1271/1580/1469 1886/1579/1469 1274/1584/1469 403/1585/1469 +f 400/1568/1470 1267/1571/1470 1887/1586/1470 1275/1587/1470 +f 1267/1571/1471 402/1576/1471 1276/1588/1471 1887/1586/1471 +f 1887/1586/1472 1276/1588/1472 404/1589/1472 1277/1590/1472 +f 1275/1587/1473 1887/1586/1473 1277/1590/1473 398/1591/1473 +f 405/1592/1474 1279/1593/1474 1888/1594/1474 1278/1595/1474 +f 1279/1593/1475 403/1585/1475 1274/1584/1475 1888/1594/1475 +f 1888/1594/1476 1274/1584/1476 401/1583/1476 1280/1596/1476 +f 1278/1595/1477 1888/1594/1477 1280/1596/1477 399/1597/1477 +f 398/1591/1478 1277/1590/1478 1889/1598/1478 1281/1599/1478 +f 1277/1590/1479 404/1589/1479 1282/1600/1479 1889/1598/1479 +f 1889/1598/1480 1282/1600/1480 406/1601/1480 1283/1602/1480 +f 1281/1599/1481 1889/1598/1481 1283/1602/1481 396/1603/1481 +f 407/1604/1482 1285/1605/1482 1890/1606/1482 1284/1607/1482 +f 1285/1605/1483 405/1592/1483 1278/1595/1483 1890/1606/1483 +f 1890/1606/1484 1278/1595/1484 399/1597/1484 1286/1608/1484 +f 1284/1607/1485 1890/1606/1485 1286/1608/1485 397/1609/1485 +f 396/1603/1486 1283/1602/1486 1891/1610/1486 1287/1611/1486 +f 1283/1602/1487 406/1601/1487 1288/1612/1487 1891/1610/1487 +f 1891/1610/1488 1288/1612/1488 408/1613/1488 1289/1614/1488 +f 1287/1611/1489 1891/1610/1489 1289/1614/1489 394/1615/1489 +f 409/1616/1490 1291/1617/1490 1892/1618/1490 1290/1619/1490 +f 1291/1617/1491 407/1604/1491 1284/1607/1491 1892/1618/1491 +f 1892/1618/1492 1284/1607/1492 397/1609/1492 1292/1620/1492 +f 1290/1619/1493 1892/1618/1493 1292/1620/1493 395/1621/1493 +f 394/1615/1494 1289/1614/1494 1893/1622/1494 1293/1623/1494 +f 1289/1614/1495 408/1613/1495 1294/1624/1495 1893/1622/1495 +f 1893/1622/1496 1294/1624/1496 410/1625/1496 1295/1626/1496 +f 1293/1623/1497 1893/1622/1497 1295/1626/1497 392/1627/1497 +f 411/1628/1498 1297/1629/1498 1894/1630/1498 1296/1631/1498 +f 1297/1629/1499 409/1616/1499 1290/1619/1499 1894/1630/1499 +f 1894/1630/1500 1290/1619/1500 395/1621/1500 1298/1632/1500 +f 1296/1631/1501 1894/1630/1501 1298/1632/1501 393/1633/1501 +f 392/1627/1502 1295/1626/1502 1895/1634/1502 1299/1635/1502 +f 1295/1626/1503 410/1625/1503 1300/1636/1503 1895/1634/1503 +f 1895/1634/1504 1300/1636/1504 412/1637/1504 1301/1638/1504 +f 1299/1635/1505 1895/1634/1505 1301/1638/1505 390/1639/1505 +f 413/1640/1506 1303/1641/1506 1896/1642/1506 1302/1643/1506 +f 1303/1641/1507 411/1628/1507 1296/1631/1507 1896/1642/1507 +f 1896/1642/1508 1296/1631/1508 393/1633/1508 1304/1644/1508 +f 1302/1643/1509 1896/1642/1509 1304/1644/1509 391/1645/1509 +f 410/1625/1510 1305/1646/1510 1897/1647/1510 1300/1636/1510 +f 1305/1646/1511 420/1648/1511 1306/1649/1511 1897/1647/1511 +f 1897/1647/1512 1306/1649/1512 418/1650/1512 1307/1651/1512 +f 1300/1636/1513 1897/1647/1513 1307/1651/1513 412/1637/1513 +f 419/1652/1514 1309/1653/1514 1898/1654/1514 1308/1655/1514 +f 1309/1653/1515 421/1656/1515 1310/1657/1515 1898/1654/1515 +f 1898/1654/1516 1310/1657/1516 411/1628/1516 1303/1641/1516 +f 1308/1655/1517 1898/1654/1517 1303/1641/1517 413/1640/1517 +f 408/1613/1518 1311/1658/1518 1899/1659/1518 1294/1624/1518 +f 1311/1658/1519 422/1660/1519 1312/1661/1519 1899/1659/1519 +f 1899/1659/1520 1312/1661/1520 420/1648/1520 1305/1646/1520 +f 1294/1624/1521 1899/1659/1521 1305/1646/1521 410/1625/1521 +f 421/1656/1522 1313/1662/1522 1900/1663/1522 1310/1657/1522 +f 1313/1662/1523 423/1664/1523 1314/1665/1523 1900/1663/1523 +f 1900/1663/1524 1314/1665/1524 409/1616/1524 1297/1629/1524 +f 1310/1657/1525 1900/1663/1525 1297/1629/1525 411/1628/1525 +f 406/1601/1526 1315/1666/1526 1901/1667/1526 1288/1612/1526 +f 1315/1666/1527 424/1668/1527 1316/1669/1527 1901/1667/1527 +f 1901/1667/1528 1316/1669/1528 422/1660/1528 1311/1658/1528 +f 1288/1612/1529 1901/1667/1529 1311/1658/1529 408/1613/1529 +f 423/1664/1530 1317/1670/1530 1902/1671/1530 1314/1665/1530 +f 1317/1670/1531 425/1672/1531 1318/1673/1531 1902/1671/1531 +f 1902/1671/1532 1318/1673/1532 407/1604/1532 1291/1617/1532 +f 1314/1665/1533 1902/1671/1533 1291/1617/1533 409/1616/1533 +f 404/1589/1534 1319/1674/1534 1903/1675/1534 1282/1600/1534 +f 1319/1674/1535 426/1676/1535 1320/1677/1535 1903/1675/1535 +f 1903/1675/1536 1320/1677/1536 424/1668/1536 1315/1666/1536 +f 1282/1600/1537 1903/1675/1537 1315/1666/1537 406/1601/1537 +f 425/1672/1538 1321/1678/1538 1904/1679/1538 1318/1673/1538 +f 1321/1678/1539 427/1680/1539 1322/1681/1539 1904/1679/1539 +f 1904/1679/1540 1322/1681/1540 405/1592/1540 1285/1605/1540 +f 1318/1673/1541 1904/1679/1541 1285/1605/1541 407/1604/1541 +f 402/1576/1542 1323/1682/1542 1905/1683/1542 1276/1588/1542 +f 1323/1682/1543 428/1684/1543 1324/1685/1543 1905/1683/1543 +f 1905/1683/1544 1324/1685/1544 426/1676/1544 1319/1674/1544 +f 1276/1588/1545 1905/1683/1545 1319/1674/1545 404/1589/1545 +f 427/1680/1546 1325/1686/1546 1906/1687/1546 1322/1681/1546 +f 1325/1686/1547 429/1688/1547 1326/1689/1547 1906/1687/1547 +f 1906/1687/1548 1326/1689/1548 403/1585/1548 1279/1593/1548 +f 1322/1681/1549 1906/1687/1549 1279/1593/1549 405/1592/1549 +f 402/1576/1550 1270/1575/1550 1907/1690/1550 1323/1682/1550 +f 1270/1575/1551 414/1574/1551 1327/1691/1551 1907/1690/1551 +f 1907/1690/1552 1327/1691/1552 416/1692/1552 1328/1693/1552 +f 1323/1682/1553 1907/1690/1553 1328/1693/1553 428/1684/1553 +f 417/1694/1554 1330/1695/1554 1908/1696/1554 1329/1697/1554 +f 1330/1695/1555 415/1577/1555 1271/1580/1555 1908/1696/1555 +f 1908/1696/1556 1271/1580/1556 403/1585/1556 1326/1689/1556 +f 1329/1697/1557 1908/1696/1557 1326/1689/1557 429/1688/1557 +f 318/1293/1558 1241/1518/1558 1909/1698/1558 1331/1699/1558 +f 1241/1518/1559 320/1520/1559 1332/1700/1559 1909/1698/1559 +f 1909/1698/1560 1332/1700/1560 444/1701/1560 1333/1702/1560 +f 1331/1699/1561 1909/1698/1561 1333/1702/1561 442/1703/1561 +f 445/1704/1562 1335/1705/1562 1910/1706/1562 1334/1707/1562 +f 1335/1705/1563 321/1525/1563 1246/1524/1563 1910/1706/1563 +f 1910/1706/1564 1246/1524/1564 319/1296/1564 1336/1708/1564 +f 1334/1707/1565 1910/1706/1565 1336/1708/1565 443/1709/1565 +f 320/1710/1566 1337/1711/1566 1911/1712/1566 1332/1713/1566 +f 1337/1711/1567 390/1639/1567 1301/1638/1567 1911/1712/1567 +f 1911/1712/1568 1301/1638/1568 412/1637/1568 1338/1714/1568 +f 1332/1713/1569 1911/1712/1569 1338/1714/1569 444/1715/1569 +f 413/1640/1570 1302/1643/1570 1912/1716/1570 1339/1717/1570 +f 1302/1643/1567 391/1645/1567 1340/1718/1567 1912/1716/1567 +f 1912/1716/1571 1340/1718/1571 321/1719/1571 1335/1720/1571 +f 1339/1717/1572 1912/1716/1572 1335/1720/1572 445/1721/1572 +f 310/1295/1573 1147/1294/1573 1913/1722/1573 1225/1484/1573 +f 1147/1294/1574 318/1293/1574 1331/1699/1574 1913/1722/1574 +f 1913/1722/1575 1331/1699/1575 442/1703/1575 1341/1723/1575 +f 1225/1484/1576 1913/1722/1576 1341/1723/1576 312/1486/1576 +f 443/1709/1577 1336/1708/1577 1914/1724/1577 1342/1725/1577 +f 1336/1708/1578 319/1296/1578 1148/1299/1578 1914/1724/1578 +f 1914/1724/1579 1148/1299/1579 311/1301/1579 1228/1491/1579 +f 1342/1725/1580 1914/1724/1580 1228/1491/1580 313/1490/1580 +f 382/1726/1581 1344/1727/1581 1915/1728/1581 1343/1729/1581 +f 1344/1727/1582 430/1730/1582 1345/1731/1582 1915/1728/1582 +f 1915/1728/1583 1345/1731/1583 414/1574/1583 1269/1573/1583 +f 1343/1729/1584 1915/1728/1584 1269/1573/1584 388/1572/1584 +f 415/1577/1585 1346/1732/1585 1916/1733/1585 1272/1578/1585 +f 1346/1732/1586 431/1734/1586 1347/1735/1586 1916/1733/1586 +f 1916/1733/1587 1347/1735/1587 383/1736/1587 1348/1737/1587 +f 1272/1578/1588 1916/1733/1588 1348/1737/1588 389/1581/1588 +f 412/1637/1589 1307/1651/1589 1917/1738/1589 1338/1714/1589 +f 1307/1651/1590 418/1650/1590 1349/1739/1590 1917/1738/1590 +f 1917/1738/1591 1349/1739/1591 440/1740/1591 1350/1741/1591 +f 1338/1714/1592 1917/1738/1592 1350/1741/1592 444/1715/1592 +f 441/1742/1593 1352/1743/1593 1918/1744/1593 1351/1745/1593 +f 1352/1743/1594 419/1652/1594 1308/1655/1594 1918/1744/1594 +f 1918/1744/1595 1308/1655/1595 413/1640/1595 1339/1717/1595 +f 1351/1745/1596 1918/1744/1596 1339/1717/1596 445/1721/1596 +f 438/1746/1597 1354/1747/1597 1919/1748/1597 1353/1749/1597 +f 1354/1747/1598 446/1750/1598 1355/1751/1598 1919/1748/1598 +f 1919/1748/1599 1355/1751/1599 444/1715/1599 1350/1741/1599 +f 1353/1749/1600 1919/1748/1600 1350/1741/1600 440/1740/1600 +f 445/1721/1601 1356/1752/1601 1920/1753/1601 1351/1745/1601 +f 1356/1752/1602 447/1754/1602 1357/1755/1602 1920/1753/1602 +f 1920/1753/1603 1357/1755/1603 439/1756/1603 1358/1757/1603 +f 1351/1745/1604 1920/1753/1604 1358/1757/1604 441/1742/1604 +f 434/1758/1605 1360/1759/1605 1921/1760/1605 1359/1761/1605 +f 1360/1759/1606 446/1750/1606 1354/1747/1606 1921/1760/1606 +f 1921/1760/1607 1354/1747/1607 438/1746/1607 1361/1762/1607 +f 1359/1761/1608 1921/1760/1608 1361/1762/1608 436/1763/1608 +f 439/1756/1609 1357/1755/1609 1922/1764/1609 1362/1765/1609 +f 1357/1755/1610 447/1754/1610 1363/1766/1610 1922/1764/1610 +f 1922/1764/1611 1363/1766/1611 435/1767/1611 1364/1768/1611 +f 1362/1765/1612 1922/1764/1612 1364/1768/1612 437/1769/1612 +f 432/1770/1613 1366/1771/1613 1923/1772/1613 1365/1773/1613 +f 1366/1771/1614 448/1774/1614 1367/1775/1614 1923/1772/1614 +f 1923/1772/1615 1367/1775/1615 446/1750/1615 1360/1759/1615 +f 1365/1773/1616 1923/1772/1616 1360/1759/1616 434/1758/1616 +f 447/1754/1617 1368/1776/1617 1924/1777/1617 1363/1766/1617 +f 1368/1776/1618 449/1778/1618 1369/1779/1618 1924/1777/1618 +f 1924/1777/1619 1369/1779/1619 433/1780/1619 1370/1781/1619 +f 1363/1766/1620 1924/1777/1620 1370/1781/1620 435/1767/1620 +f 430/1730/1621 1372/1782/1621 1925/1783/1621 1371/1784/1621 +f 1372/1782/1622 448/1774/1622 1366/1771/1622 1925/1783/1622 +f 1925/1783/1623 1366/1771/1623 432/1770/1623 1373/1785/1623 +f 1371/1784/1624 1925/1783/1624 1373/1785/1624 450/1786/1624 +f 433/1780/1625 1369/1779/1625 1926/1787/1625 1374/1788/1625 +f 1369/1779/1626 449/1778/1626 1375/1789/1626 1926/1787/1626 +f 1926/1787/1627 1375/1789/1627 431/1734/1627 1376/1790/1627 +f 1374/1788/1628 1926/1787/1628 1376/1790/1628 451/1791/1628 +f 414/1574/1629 1345/1731/1629 1927/1792/1629 1327/1691/1629 +f 1345/1731/1630 430/1730/1630 1371/1784/1630 1927/1792/1630 +f 1927/1792/1631 1371/1784/1631 450/1786/1631 1377/1793/1631 +f 1327/1691/1632 1927/1792/1632 1377/1793/1632 416/1692/1632 +f 451/1791/1633 1376/1790/1633 1928/1794/1633 1378/1795/1633 +f 1376/1790/1634 431/1734/1634 1346/1732/1634 1928/1794/1634 +f 1928/1794/1635 1346/1732/1635 415/1577/1635 1330/1695/1635 +f 1378/1795/1636 1928/1794/1636 1330/1695/1636 417/1694/1636 +f 312/1486/1637 1379/1796/1637 1929/1797/1637 1229/1492/1637 +f 1379/1796/1638 448/1798/1638 1372/1799/1638 1929/1797/1638 +f 1929/1797/1639 1372/1799/1639 430/1800/1639 1344/1801/1639 +f 1229/1492/1640 1929/1797/1640 1344/1801/1640 382/1494/1640 +f 431/1802/1641 1375/1803/1641 1930/1804/1641 1347/1805/1641 +f 1375/1803/1642 449/1806/1642 1380/1807/1642 1930/1804/1642 +f 1930/1804/1643 1380/1807/1643 313/1490/1643 1232/1499/1643 +f 1347/1805/1644 1930/1804/1644 1232/1499/1644 383/1498/1644 +f 312/1486/1645 1341/1723/1645 1931/1808/1645 1379/1796/1645 +f 1341/1723/1646 442/1703/1646 1381/1809/1646 1931/1808/1646 +f 1931/1808/1647 1381/1809/1647 446/1810/1647 1367/1811/1647 +f 1379/1796/1648 1931/1808/1648 1367/1811/1648 448/1798/1648 +f 447/1812/1649 1382/1813/1649 1932/1814/1649 1368/1815/1649 +f 1382/1813/1650 443/1709/1650 1342/1725/1650 1932/1814/1650 +f 1932/1814/1651 1342/1725/1651 313/1490/1651 1380/1807/1651 +f 1368/1815/1652 1932/1814/1652 1380/1807/1652 449/1806/1652 +f 442/1703/1653 1333/1702/1653 1933/1816/1653 1381/1809/1653 +f 444/1701/1654 1355/1817/1654 1933/1816/1654 1333/1702/1654 +f 446/1810/1655 1381/1809/1655 1933/1816/1655 1355/1817/1655 +f 447/1812/1656 1356/1818/1656 1934/1819/1656 1382/1813/1656 +f 445/1704/1657 1334/1707/1657 1934/1819/1657 1356/1818/1657 +f 443/1709/1658 1382/1813/1658 1934/1819/1658 1334/1707/1658 +f 416/1692/1659 1377/1793/1659 1935/1820/1659 1383/1821/1659 +f 1377/1793/1660 450/1786/1660 1384/1822/1660 1935/1820/1660 +f 1935/1820/1661 1384/1822/1661 452/1823/1661 1385/1824/1661 +f 1383/1821/1662 1935/1820/1662 1385/1824/1662 476/1825/1662 +f 453/1826/1663 1387/1827/1663 1936/1828/1663 1386/1829/1663 +f 1387/1827/1664 451/1791/1664 1378/1795/1664 1936/1828/1664 +f 1936/1828/1665 1378/1795/1665 417/1694/1665 1388/1830/1665 +f 1386/1829/1666 1936/1828/1666 1388/1830/1666 477/1831/1666 +f 450/1786/1667 1373/1785/1667 1937/1832/1667 1384/1822/1667 +f 1373/1785/1668 432/1770/1668 1389/1833/1668 1937/1832/1668 +f 1937/1832/1669 1389/1833/1669 462/1834/1669 1390/1835/1669 +f 1384/1822/1670 1937/1832/1670 1390/1835/1670 452/1823/1670 +f 463/1836/1671 1392/1837/1671 1938/1838/1671 1391/1839/1671 +f 1392/1837/1672 433/1780/1672 1374/1788/1672 1938/1838/1672 +f 1938/1838/1673 1374/1788/1673 451/1791/1673 1387/1827/1673 +f 1391/1839/1674 1938/1838/1674 1387/1827/1674 453/1826/1674 +f 432/1770/1675 1365/1773/1675 1939/1840/1675 1389/1833/1675 +f 1365/1773/1676 434/1758/1676 1393/1841/1676 1939/1840/1676 +f 1939/1840/1677 1393/1841/1677 460/1842/1677 1394/1843/1677 +f 1389/1833/1678 1939/1840/1678 1394/1843/1678 462/1834/1678 +f 461/1844/1679 1396/1845/1679 1940/1846/1679 1395/1847/1679 +f 1396/1845/1680 435/1767/1680 1370/1781/1680 1940/1846/1680 +f 1940/1846/1681 1370/1781/1681 433/1780/1681 1392/1837/1681 +f 1395/1847/1682 1940/1846/1682 1392/1837/1682 463/1836/1682 +f 434/1758/1683 1359/1761/1683 1941/1848/1683 1393/1841/1683 +f 1359/1761/1684 436/1763/1684 1397/1849/1684 1941/1848/1684 +f 1941/1848/1685 1397/1849/1685 458/1850/1685 1398/1851/1685 +f 1393/1841/1686 1941/1848/1686 1398/1851/1686 460/1842/1686 +f 459/1852/1687 1400/1853/1687 1942/1854/1687 1399/1855/1687 +f 1400/1853/1688 437/1769/1688 1364/1768/1688 1942/1854/1688 +f 1942/1854/1689 1364/1768/1689 435/1767/1689 1396/1845/1689 +f 1399/1855/1690 1942/1854/1690 1396/1845/1690 461/1844/1690 +f 436/1763/1691 1361/1762/1691 1943/1856/1691 1397/1849/1691 +f 1361/1762/1692 438/1746/1692 1401/1857/1692 1943/1856/1692 +f 1943/1856/1693 1401/1857/1693 456/1858/1693 1402/1859/1693 +f 1397/1849/1694 1943/1856/1694 1402/1859/1694 458/1850/1694 +f 457/1860/1695 1404/1861/1695 1944/1862/1695 1403/1863/1695 +f 1404/1861/1696 439/1756/1696 1362/1765/1696 1944/1862/1696 +f 1944/1862/1697 1362/1765/1697 437/1769/1697 1400/1853/1697 +f 1403/1863/1698 1944/1862/1698 1400/1853/1698 459/1852/1698 +f 438/1746/1699 1353/1749/1699 1945/1864/1699 1401/1857/1699 +f 1353/1749/1700 440/1740/1700 1405/1865/1700 1945/1864/1700 +f 1945/1864/1701 1405/1865/1701 454/1866/1701 1406/1867/1701 +f 1401/1857/1702 1945/1864/1702 1406/1867/1702 456/1858/1702 +f 455/1868/1703 1408/1869/1703 1946/1870/1703 1407/1871/1703 +f 1408/1869/1704 441/1742/1704 1358/1757/1704 1946/1870/1704 +f 1946/1870/1705 1358/1757/1705 439/1756/1705 1404/1861/1705 +f 1407/1871/1706 1946/1870/1706 1404/1861/1706 457/1860/1706 +f 440/1740/1707 1349/1739/1707 1947/1872/1707 1405/1865/1707 +f 1349/1739/1708 418/1650/1708 1409/1873/1708 1947/1872/1708 +f 1947/1872/1709 1409/1873/1709 474/1874/1709 1410/1875/1709 +f 1405/1865/1710 1947/1872/1710 1410/1875/1710 454/1866/1710 +f 475/1876/1711 1412/1877/1711 1948/1878/1711 1411/1879/1711 +f 1412/1877/1712 419/1652/1712 1352/1743/1712 1948/1878/1712 +f 1948/1878/1713 1352/1743/1713 441/1742/1713 1408/1869/1713 +f 1411/1879/1714 1948/1878/1714 1408/1869/1714 455/1868/1714 +f 428/1684/1715 1328/1693/1715 1949/1880/1715 1413/1881/1715 +f 1328/1693/1716 416/1692/1716 1383/1821/1716 1949/1880/1716 +f 1949/1880/1717 1383/1821/1717 476/1825/1717 1414/1882/1717 +f 1413/1881/1718 1949/1880/1718 1414/1882/1718 464/1883/1718 +f 477/1831/1719 1388/1830/1719 1950/1884/1719 1415/1885/1719 +f 1388/1830/1720 417/1694/1720 1329/1697/1720 1950/1884/1720 +f 1950/1884/1721 1329/1697/1721 429/1688/1721 1416/1886/1721 +f 1415/1885/1722 1950/1884/1722 1416/1886/1722 465/1887/1722 +f 426/1676/1723 1324/1685/1723 1951/1888/1723 1417/1889/1723 +f 1324/1685/1724 428/1684/1724 1413/1881/1724 1951/1888/1724 +f 1951/1888/1725 1413/1881/1725 464/1883/1725 1418/1890/1725 +f 1417/1889/1726 1951/1888/1726 1418/1890/1726 466/1891/1726 +f 465/1887/1727 1416/1886/1727 1952/1892/1727 1419/1893/1727 +f 1416/1886/1728 429/1688/1728 1325/1686/1728 1952/1892/1728 +f 1952/1892/1729 1325/1686/1729 427/1680/1729 1420/1894/1729 +f 1419/1893/1730 1952/1892/1730 1420/1894/1730 467/1895/1730 +f 424/1668/1731 1320/1677/1731 1953/1896/1731 1421/1897/1731 +f 1320/1677/1732 426/1676/1732 1417/1889/1732 1953/1896/1732 +f 1953/1896/1733 1417/1889/1733 466/1891/1733 1422/1898/1733 +f 1421/1897/1734 1953/1896/1734 1422/1898/1734 468/1899/1734 +f 467/1895/1735 1420/1894/1735 1954/1900/1735 1423/1901/1735 +f 1420/1894/1736 427/1680/1736 1321/1678/1736 1954/1900/1736 +f 1954/1900/1737 1321/1678/1737 425/1672/1737 1424/1902/1737 +f 1423/1901/1738 1954/1900/1738 1424/1902/1738 469/1903/1738 +f 422/1660/1739 1316/1669/1739 1955/1904/1739 1425/1905/1739 +f 1316/1669/1740 424/1668/1740 1421/1897/1740 1955/1904/1740 +f 1955/1904/1741 1421/1897/1741 468/1899/1741 1426/1906/1741 +f 1425/1905/1742 1955/1904/1742 1426/1906/1742 470/1907/1742 +f 469/1903/1743 1424/1902/1743 1956/1908/1743 1427/1909/1743 +f 1424/1902/1744 425/1672/1744 1317/1670/1744 1956/1908/1744 +f 1956/1908/1745 1317/1670/1745 423/1664/1745 1428/1910/1745 +f 1427/1909/1746 1956/1908/1746 1428/1910/1746 471/1911/1746 +f 420/1648/1747 1312/1661/1747 1957/1912/1747 1429/1913/1747 +f 1312/1661/1748 422/1660/1748 1425/1905/1748 1957/1912/1748 +f 1957/1912/1749 1425/1905/1749 470/1907/1749 1430/1914/1749 +f 1429/1913/1750 1957/1912/1750 1430/1914/1750 472/1915/1750 +f 471/1911/1751 1428/1910/1751 1958/1916/1751 1431/1917/1751 +f 1428/1910/1752 423/1664/1752 1313/1662/1752 1958/1916/1752 +f 1958/1916/1753 1313/1662/1753 421/1656/1753 1432/1918/1753 +f 1431/1917/1754 1958/1916/1754 1432/1918/1754 473/1919/1754 +f 418/1650/1755 1306/1649/1755 1959/1920/1755 1409/1873/1755 +f 1306/1649/1756 420/1648/1756 1429/1913/1756 1959/1920/1756 +f 1959/1920/1757 1429/1913/1757 472/1915/1757 1433/1921/1757 +f 1409/1873/1758 1959/1920/1758 1433/1921/1758 474/1874/1758 +f 473/1919/1759 1432/1918/1759 1960/1922/1759 1434/1923/1759 +f 1432/1918/1760 421/1656/1760 1309/1653/1760 1960/1922/1760 +f 1960/1922/1761 1309/1653/1761 419/1652/1761 1412/1877/1761 +f 1434/1923/1762 1960/1922/1762 1412/1877/1762 475/1876/1762 +f 458/1850/1763 1402/1859/1763 1961/1924/1763 1435/1925/1763 +f 1402/1859/1764 456/1858/1764 1436/1926/1764 1961/1924/1764 +f 1961/1924/1765 1436/1926/1765 480/1927/1765 1437/1928/1765 +f 1435/1925/1766 1961/1924/1766 1437/1928/1766 478/1929/1766 +f 481/1930/1767 1439/1931/1767 1962/1932/1767 1438/1933/1767 +f 1439/1931/1768 457/1860/1768 1403/1863/1768 1962/1932/1768 +f 1962/1932/1769 1403/1863/1769 459/1852/1769 1440/1934/1769 +f 1438/1933/1770 1962/1932/1770 1440/1934/1770 479/1935/1770 +f 478/1929/1771 1437/1928/1771 1963/1936/1771 1441/1937/1771 +f 1437/1928/1772 480/1927/1772 1442/1938/1772 1963/1936/1772 +f 1963/1936/1773 1442/1938/1773 482/1939/1773 1443/1940/1773 +f 1441/1937/1774 1963/1936/1774 1443/1940/1774 484/1941/1774 +f 483/1942/1775 1445/1943/1775 1964/1944/1775 1444/1945/1775 +f 1445/1943/1776 481/1930/1776 1438/1933/1776 1964/1944/1776 +f 1964/1944/1777 1438/1933/1777 479/1935/1777 1446/1946/1777 +f 1444/1945/1778 1964/1944/1778 1446/1946/1778 485/1947/1778 +f 484/1941/1779 1443/1940/1779 1965/1948/1779 1447/1949/1779 +f 1443/1940/1780 482/1939/1780 1448/1950/1780 1965/1948/1780 +f 1965/1948/1781 1448/1950/1781 488/1951/1781 1449/1952/1781 +f 1447/1949/1782 1965/1948/1782 1449/1952/1782 486/1953/1782 +f 489/1954/1783 1451/1955/1783 1966/1956/1783 1450/1957/1783 +f 1451/1955/1784 483/1942/1784 1444/1945/1784 1966/1956/1784 +f 1966/1956/1785 1444/1945/1785 485/1947/1785 1452/1958/1785 +f 1450/1957/1786 1966/1956/1786 1452/1958/1786 487/1959/1786 +f 486/1953/1787 1449/1952/1787 1967/1960/1787 1453/1961/1787 +f 1449/1952/1788 488/1951/1788 1454/1962/1788 1967/1960/1788 +f 1967/1960/1789 1454/1962/1789 490/1963/1789 1455/1964/1789 +f 1453/1961/1790 1967/1960/1790 1455/1964/1790 492/1965/1790 +f 491/1966/1791 1457/1967/1791 1968/1968/1791 1456/1969/1791 +f 1457/1967/1792 489/1954/1792 1450/1957/1792 1968/1968/1792 +f 1968/1968/1793 1450/1957/1793 487/1959/1793 1458/1970/1793 +f 1456/1969/1794 1968/1968/1794 1458/1970/1794 493/1971/1794 +f 464/1883/1795 1414/1882/1795 1969/1972/1795 1459/1973/1795 +f 1414/1882/1796 476/1825/1796 1460/1974/1796 1969/1972/1796 +f 1969/1972/1797 1460/1974/1797 486/1953/1797 1453/1961/1797 +f 1459/1973/1798 1969/1972/1798 1453/1961/1798 492/1965/1798 +f 487/1959/1799 1461/1975/1799 1970/1976/1799 1458/1970/1799 +f 1461/1975/1800 477/1831/1800 1415/1885/1800 1970/1976/1800 +f 1970/1976/1801 1415/1885/1801 465/1887/1801 1462/1977/1801 +f 1458/1970/1802 1970/1976/1802 1462/1977/1802 493/1971/1802 +f 452/1823/1803 1463/1978/1803 1971/1979/1803 1385/1824/1803 +f 1463/1978/1804 484/1941/1804 1447/1949/1804 1971/1979/1804 +f 1971/1979/1805 1447/1949/1805 486/1953/1805 1460/1974/1805 +f 1385/1824/1806 1971/1979/1806 1460/1974/1806 476/1825/1806 +f 487/1959/1807 1452/1958/1807 1972/1980/1807 1461/1975/1807 +f 1452/1958/1808 485/1947/1808 1464/1981/1808 1972/1980/1808 +f 1972/1980/1809 1464/1981/1809 453/1826/1809 1386/1829/1809 +f 1461/1975/1810 1972/1980/1810 1386/1829/1810 477/1831/1810 +f 452/1823/1811 1390/1835/1811 1973/1982/1811 1463/1978/1811 +f 1390/1835/1812 462/1834/1812 1465/1983/1812 1973/1982/1812 +f 1973/1982/1813 1465/1983/1813 478/1929/1813 1441/1937/1813 +f 1463/1978/1814 1973/1982/1814 1441/1937/1814 484/1941/1814 +f 479/1935/1815 1466/1984/1815 1974/1985/1815 1446/1946/1815 +f 1466/1984/1816 463/1836/1816 1391/1839/1816 1974/1985/1816 +f 1974/1985/1817 1391/1839/1817 453/1826/1817 1464/1981/1817 +f 1446/1946/1818 1974/1985/1818 1464/1981/1818 485/1947/1818 +f 458/1850/1819 1435/1925/1819 1975/1986/1819 1398/1851/1819 +f 1435/1925/1820 478/1929/1820 1465/1983/1820 1975/1986/1820 +f 1975/1986/1821 1465/1983/1821 462/1834/1821 1394/1843/1821 +f 1398/1851/1822 1975/1986/1822 1394/1843/1822 460/1842/1822 +f 463/1836/1823 1466/1984/1823 1976/1987/1823 1395/1847/1823 +f 1466/1984/1824 479/1935/1824 1440/1934/1824 1976/1987/1824 +f 1976/1987/1825 1440/1934/1825 459/1852/1825 1399/1855/1825 +f 1395/1847/1826 1976/1987/1826 1399/1855/1826 461/1844/1826 +f 454/1866/1827 1410/1875/1827 1977/1988/1827 1406/1867/1827 +f 1410/1875/1828 474/1874/1828 1467/1989/1828 1977/1988/1828 +f 1977/1988/1829 1467/1989/1829 480/1927/1829 1436/1926/1829 +f 1406/1867/1830 1977/1988/1830 1436/1926/1830 456/1858/1830 +f 481/1930/1831 1468/1990/1831 1978/1991/1831 1439/1931/1831 +f 1468/1990/1832 475/1876/1832 1411/1879/1832 1978/1991/1832 +f 1978/1991/1833 1411/1879/1833 455/1868/1833 1407/1871/1833 +f 1439/1931/1834 1978/1991/1834 1407/1871/1834 457/1860/1834 +f 472/1915/1835 1469/1992/1835 1979/1993/1835 1433/1921/1835 +f 1469/1992/1836 482/1939/1836 1442/1938/1836 1979/1993/1836 +f 1979/1993/1837 1442/1938/1837 480/1927/1837 1467/1989/1837 +f 1433/1921/1838 1979/1993/1838 1467/1989/1838 474/1874/1838 +f 481/1930/1839 1445/1943/1839 1980/1994/1839 1468/1990/1839 +f 1445/1943/1840 483/1942/1840 1470/1995/1840 1980/1994/1840 +f 1980/1994/1841 1470/1995/1841 473/1919/1841 1434/1923/1841 +f 1468/1990/1842 1980/1994/1842 1434/1923/1842 475/1876/1842 +f 470/1907/1843 1471/1996/1843 1981/1997/1843 1430/1914/1843 +f 1471/1996/1844 488/1951/1844 1448/1950/1844 1981/1997/1844 +f 1981/1997/1845 1448/1950/1845 482/1939/1845 1469/1992/1845 +f 1430/1914/1846 1981/1997/1846 1469/1992/1846 472/1915/1846 +f 483/1942/1847 1451/1955/1847 1982/1998/1847 1470/1995/1847 +f 1451/1955/1848 489/1954/1848 1472/1999/1848 1982/1998/1848 +f 1982/1998/1849 1472/1999/1849 471/1911/1849 1431/1917/1849 +f 1470/1995/1850 1982/1998/1850 1431/1917/1850 473/1919/1850 +f 468/1899/1851 1473/2000/1851 1983/2001/1851 1426/1906/1851 +f 1473/2000/1852 490/1963/1852 1454/1962/1852 1983/2001/1852 +f 1983/2001/1853 1454/1962/1853 488/1951/1853 1471/1996/1853 +f 1426/1906/1854 1983/2001/1854 1471/1996/1854 470/1907/1854 +f 489/1954/1855 1457/1967/1855 1984/2002/1855 1472/1999/1855 +f 1457/1967/1856 491/1966/1856 1474/2003/1856 1984/2002/1856 +f 1984/2002/1857 1474/2003/1857 469/1903/1857 1427/1909/1857 +f 1472/1999/1858 1984/2002/1858 1427/1909/1858 471/1911/1858 +f 466/1891/1859 1475/2004/1859 1985/2005/1859 1422/1898/1859 +f 1475/2004/1860 492/1965/1860 1455/1964/1860 1985/2005/1860 +f 1985/2005/1861 1455/1964/1861 490/1963/1861 1473/2000/1861 +f 1422/1898/1862 1985/2005/1862 1473/2000/1862 468/1899/1862 +f 491/1966/1863 1456/1969/1863 1986/2006/1863 1474/2003/1863 +f 1456/1969/1864 493/1971/1864 1476/2007/1864 1986/2006/1864 +f 1986/2006/1865 1476/2007/1865 467/1895/1865 1423/1901/1865 +f 1474/2003/1866 1986/2006/1866 1423/1901/1866 469/1903/1866 +f 464/1883/1867 1459/1973/1867 1987/2008/1867 1418/1890/1867 +f 492/1965/1868 1475/2004/1868 1987/2008/1868 1459/1973/1868 +f 466/1891/1869 1418/1890/1869 1987/2008/1869 1475/2004/1869 +f 467/1895/1870 1476/2007/1870 1988/2009/1870 1419/1893/1870 +f 493/1971/1871 1462/1977/1871 1988/2009/1871 1476/2007/1871 +f 465/1887/1872 1419/1893/1872 1988/2009/1872 1462/1977/1872 +f 392/1627/1873 1299/1635/1873 1989/2010/1873 1477/2011/1873 +f 1299/1635/1874 390/1639/1874 1478/2012/1874 1989/2010/1874 +f 1989/2010/1875 1478/2012/1875 504/2013/1875 1479/2014/1875 +f 1477/2011/1876 1989/2010/1876 1479/2014/1876 502/2015/1876 +f 505/2016/1877 1481/2017/1877 1990/2018/1877 1480/2019/1877 +f 1481/2017/1878 391/1645/1878 1304/1644/1878 1990/2018/1878 +f 1990/2018/1879 1304/1644/1879 393/1633/1879 1482/2020/1879 +f 1480/2019/1880 1990/2018/1880 1482/2020/1880 503/2021/1880 +f 394/1615/1881 1293/1623/1881 1991/2022/1881 1483/2023/1881 +f 1293/1623/1882 392/1627/1882 1477/2011/1882 1991/2022/1882 +f 1991/2022/1883 1477/2011/1883 502/2015/1883 1484/2024/1883 +f 1483/2023/1884 1991/2022/1884 1484/2024/1884 500/2025/1884 +f 503/2021/1885 1482/2020/1885 1992/2026/1885 1485/2027/1885 +f 1482/2020/1886 393/1633/1886 1298/1632/1886 1992/2026/1886 +f 1992/2026/1887 1298/1632/1887 395/1621/1887 1486/2028/1887 +f 1485/2027/1888 1992/2026/1888 1486/2028/1888 501/2029/1888 +f 396/1603/1889 1287/1611/1889 1993/2030/1889 1487/2031/1889 +f 1287/1611/1890 394/1615/1890 1483/2023/1890 1993/2030/1890 +f 1993/2030/1891 1483/2023/1891 500/2025/1891 1488/2032/1891 +f 1487/2031/1892 1993/2030/1892 1488/2032/1892 498/2033/1892 +f 501/2029/1893 1486/2028/1893 1994/2034/1893 1489/2035/1893 +f 1486/2028/1894 395/1621/1894 1292/1620/1894 1994/2034/1894 +f 1994/2034/1895 1292/1620/1895 397/1609/1895 1490/2036/1895 +f 1489/2035/1896 1994/2034/1896 1490/2036/1896 499/2037/1896 +f 398/2038/1897 1281/2039/1897 1995/2040/1897 1491/2041/1897 +f 1281/2039/1898 396/1603/1898 1487/2031/1898 1995/2040/1898 +f 1995/2040/1899 1487/2031/1899 498/2033/1899 1492/2042/1899 +f 1491/2041/1900 1995/2040/1900 1492/2042/1900 496/2043/1900 +f 499/2037/1901 1490/2036/1901 1996/2044/1901 1493/2045/1901 +f 1490/2036/1902 397/1609/1902 1286/2046/1902 1996/2044/1902 +f 1996/2044/1903 1286/2046/1903 399/2047/1903 1494/2048/1903 +f 1493/2045/1904 1996/2044/1904 1494/2048/1904 497/2049/1904 +f 400/2050/1905 1275/2051/1905 1997/2052/1905 1495/2053/1905 +f 1275/2051/1906 398/2038/1906 1491/2041/1906 1997/2052/1906 +f 1997/2052/1907 1491/2041/1907 496/2043/1907 1496/2054/1907 +f 1495/2053/1908 1997/2052/1908 1496/2054/1908 494/2055/1908 +f 497/2049/1909 1494/2048/1909 1998/2056/1909 1497/2057/1909 +f 1494/2048/1910 399/2047/1910 1280/2058/1910 1998/2056/1910 +f 1998/2056/1911 1280/2058/1911 401/2059/1911 1498/2060/1911 +f 1497/2057/1912 1998/2056/1912 1498/2060/1912 495/2061/1912 +f 388/2062/1913 1268/2063/1913 1999/2064/1913 1499/2065/1913 +f 1268/2063/1914 400/2050/1914 1495/2053/1914 1999/2064/1914 +f 1999/2064/1915 1495/2053/1915 494/2055/1915 1500/2066/1915 +f 1499/2065/1916 1999/2064/1916 1500/2066/1916 506/2067/1916 +f 495/2061/1917 1498/2060/1917 2000/2068/1917 1501/2069/1917 +f 1498/2060/1918 401/2059/1918 1273/2070/1918 2000/2068/1918 +f 2000/2068/1919 1273/2070/1919 389/2071/1919 1502/2072/1919 +f 1501/2069/1920 2000/2068/1920 1502/2072/1920 507/2073/1920 +f 494/2055/1921 1503/2074/1921 2001/2075/1921 1500/2066/1921 +f 1503/2074/1922 502/2015/1922 1479/2014/1922 2001/2075/1922 +f 2001/2075/1923 1479/2014/1923 504/2013/1923 1504/2076/1923 +f 1500/2066/1924 2001/2075/1924 1504/2076/1924 506/2067/1924 +f 505/2016/1925 1480/2019/1925 2002/2077/1925 1505/2078/1925 +f 1480/2019/1926 503/2021/1926 1506/2079/1926 2002/2077/1926 +f 2002/2077/1927 1506/2079/1927 495/2061/1927 1501/2069/1927 +f 1505/2078/1928 2002/2077/1928 1501/2069/1928 507/2073/1928 +f 494/2055/1929 1496/2054/1929 2003/2080/1929 1503/2074/1929 +f 1496/2054/1930 496/2043/1930 1507/2081/1930 2003/2080/1930 +f 2003/2080/1931 1507/2081/1931 500/2025/1931 1484/2024/1931 +f 1503/2074/1932 2003/2080/1932 1484/2024/1932 502/2015/1932 +f 501/2029/1933 1508/2082/1933 2004/2083/1933 1485/2027/1933 +f 1508/2082/1934 497/2049/1934 1497/2057/1934 2004/2083/1934 +f 2004/2083/1935 1497/2057/1935 495/2061/1935 1506/2079/1935 +f 1485/2027/1936 2004/2083/1936 1506/2079/1936 503/2021/1936 +f 496/2043/1937 1492/2042/1937 2005/2084/1937 1507/2081/1937 +f 498/2033/1938 1488/2032/1938 2005/2084/1938 1492/2042/1938 +f 500/2025/1939 1507/2081/1939 2005/2084/1939 1488/2032/1939 +f 501/2029/1940 1489/2035/1940 2006/2085/1940 1508/2082/1940 +f 499/2037/1941 1493/2045/1941 2006/2085/1941 1489/2035/1941 +f 497/2049/1942 1508/2082/1942 2006/2085/1942 1493/2045/1942 +f 314/1402/1943 1233/1501/1943 2007/2086/1943 1509/2087/1943 +f 1233/1501/1944 382/1494/1944 1343/2088/1944 2007/2086/1944 +f 2007/2086/1945 1343/2088/1945 388/2089/1945 1499/2090/1945 +f 1509/2087/1946 2007/2086/1946 1499/2090/1946 506/2091/1946 +f 389/2071/1947 1348/2092/1947 2008/2093/1947 1502/2072/1947 +f 1348/2092/1948 383/2094/1948 1234/2095/1948 2008/2093/1948 +f 2008/2093/1949 1234/2095/1949 315/2096/1949 1510/2097/1949 +f 1502/2072/1950 2008/2093/1950 1510/2097/1950 507/2073/1950 +f 314/2098/1951 1509/2099/1951 2009/2100/1951 1253/2101/1951 +f 1509/2099/1952 506/2067/1952 1504/2076/1952 2009/2100/1952 +f 2009/2100/1953 1504/2076/1953 504/2013/1953 1511/2102/1953 +f 1253/2101/1954 2009/2100/1954 1511/2102/1954 322/2103/1954 +f 505/2016/1955 1505/2078/1955 2010/2104/1955 1512/2105/1955 +f 1505/2078/1956 507/2073/1956 1510/2097/1956 2010/2104/1956 +f 2010/2104/1957 1510/2097/1957 315/2096/1957 1258/2106/1957 +f 1512/2105/1958 2010/2104/1958 1258/2106/1958 323/2107/1958 +f 320/1710/1959 1261/2108/1959 2011/2109/1959 1337/1711/1959 +f 1261/2108/1960 322/2103/1960 1511/2102/1960 2011/2109/1960 +f 2011/2109/1961 1511/2102/1961 504/2013/1961 1478/2012/1961 +f 1337/1711/1962 2011/2109/1962 1478/2012/1962 390/1639/1962 +f 505/2016/1963 1512/2105/1963 2012/2110/1963 1481/2017/1963 +f 1512/2105/1964 323/2107/1964 1264/2111/1964 2012/2110/1964 +f 2012/2110/1965 1264/2111/1965 321/1719/1965 1340/1718/1965 +f 1481/2017/1966 2012/2110/1966 1340/1718/1966 391/1645/1966 +g SharpCorners_Suzanne.004 +v -1.061157 0.160767 0.759033 +v -1.938843 0.160767 0.759033 +v -1.012695 0.108154 0.685547 +v -1.987305 0.108154 0.685547 +v -0.967773 0.068359 0.581055 +v -2.032227 0.068359 0.581055 +v -1.148438 -0.003906 0.616211 +v -1.851562 -0.003906 0.616211 +v -1.148315 0.052246 0.713013 +v -1.851685 0.052246 0.713013 +v -1.147583 0.127197 0.776123 +v -1.852417 0.127197 0.776123 +v -1.229858 0.160767 0.790894 +v -1.770142 0.160767 0.790894 +v -1.283325 0.108154 0.734497 +v -1.716675 0.108154 0.734497 +v -1.329102 0.068359 0.645508 +v -1.670898 0.068359 0.645508 +v -1.402344 0.243164 0.654297 +v -1.597656 0.243164 0.654297 +v -1.339355 0.242432 0.738037 +v -1.660645 0.242432 0.738037 +v -1.263428 0.243042 0.792969 +v -1.736572 0.243042 0.792969 +v -1.229858 0.329590 0.790894 +v -1.770142 0.329590 0.790894 +v -1.283325 0.377930 0.734497 +v -1.716675 0.377930 0.734497 +v -1.329102 0.422852 0.645508 +v -1.670898 0.422852 0.645508 +v -1.148438 0.496094 0.616211 +v -1.851562 0.496094 0.616211 +v -1.148315 0.434082 0.713013 +v -1.851685 0.434082 0.713013 +v -1.147583 0.364014 0.776123 +v -1.852417 0.364014 0.776123 +v -1.061157 0.329590 0.759033 +v -1.938843 0.329590 0.759033 +v -1.012695 0.377930 0.685547 +v -1.987305 0.377930 0.685547 +v -0.967773 0.422852 0.581055 +v -2.032227 0.422852 0.581055 +v -0.894531 0.243164 0.566406 +v -2.105469 0.243164 0.566406 +v -0.956543 0.242432 0.672607 +v -2.043457 0.242432 0.672607 +v -1.027344 0.243042 0.751221 +v -1.972656 0.243042 0.751221 +v -1.044596 0.243083 0.778971 +v -1.955404 0.243083 0.778971 +v -1.072469 0.318929 0.785848 +v -1.927531 0.318929 0.785848 +v -1.147542 0.350505 0.803426 +v -1.852458 0.350505 0.803426 +v -1.219075 0.318929 0.816406 +v -1.780925 0.318929 0.816406 +v -1.249756 0.243083 0.818197 +v -1.750244 0.243083 0.818197 +v -1.219075 0.171549 0.816406 +v -1.780925 0.171549 0.816406 +v -1.148031 0.242798 0.822428 +v -1.851969 0.242798 0.822428 +v -1.147542 0.140869 0.803426 +v -1.852458 0.140869 0.803426 +v -1.072469 0.171549 0.785848 +v -1.927531 0.171549 0.785848 +v -1.500000 0.432861 0.736816 +v -1.500000 0.352431 0.809679 +v -1.500000 -0.661133 0.736328 +v -1.500000 -0.306152 0.779297 +v -1.500000 -0.175293 0.791260 +v -1.500000 -0.765137 0.714600 +v -1.500000 0.439046 0.617676 +v -1.500000 0.566551 0.546875 +v -1.500000 0.855713 -0.490723 +v -1.500000 0.518066 -0.772461 +v -1.500000 0.093262 -0.771973 +v -1.500000 -0.352295 -0.304688 +v -1.273071 -0.177246 0.577515 +v -1.726929 -0.177246 0.577515 +v -1.211304 -0.443359 0.565674 +v -1.788696 -0.443359 0.565674 +v -1.176025 -0.664795 0.558960 +v -1.823975 -0.664795 0.558960 +v -1.161133 -0.845703 0.532471 +v -1.838867 -0.845703 0.532471 +v -1.197632 -0.930664 0.526001 +v -1.802368 -0.930664 0.526001 +v -1.328613 -0.960205 0.548950 +v -1.671387 -0.960205 0.548950 +v -1.500000 -0.974121 0.565918 +v -1.072998 -0.116943 0.545776 +v -1.927002 -0.116943 0.545776 +v -0.874634 -0.012573 0.525269 +v -2.125366 -0.012573 0.525269 +v -0.710571 0.167603 0.481934 +v -2.289429 0.167603 0.481934 +v -0.683228 0.393555 0.573364 +v -2.316772 0.393555 0.573364 +v -0.806763 0.479858 0.624512 +v -2.193237 0.479858 0.624512 +v -1.008545 0.592407 0.682251 +v -1.991455 0.592407 0.682251 +v -1.177612 0.711792 0.726685 +v -1.822388 0.711792 0.726685 +v -1.325439 0.676270 0.748169 +v -1.674561 0.676270 0.748169 +v -1.424194 0.499878 0.743896 +v -1.575806 0.499878 0.743896 +v -1.333008 0.407227 0.780640 +v -1.666992 0.407227 0.780640 +v -1.377441 0.310059 0.773926 +v -1.622559 0.310059 0.773926 +v -1.287231 0.071533 0.748657 +v -1.712769 0.071533 0.748657 +v -1.128784 0.027466 0.706543 +v -1.871216 0.027466 0.706543 +v -0.994385 0.075317 0.672729 +v -2.005615 0.075317 0.672729 +v -0.882080 0.189331 0.650635 +v -2.117920 0.189331 0.650635 +v -0.860229 0.300171 0.656006 +v -2.139771 0.300171 0.656006 +v -0.909912 0.376709 0.680542 +v -2.090088 0.376709 0.680542 +v -1.060913 0.443237 0.730469 +v -1.939087 0.443237 0.730469 +v -1.253540 0.473877 0.770996 +v -1.746460 0.473877 0.770996 +v -1.500000 -0.746338 0.732666 +v -1.387500 -0.737188 0.726406 +v -1.612500 -0.737188 0.726406 +v -1.378296 -0.835449 0.702271 +v -1.621704 -0.835449 0.702271 +v -1.428955 -0.882446 0.687744 +v -1.571045 -0.882446 0.687744 +v -1.500000 -0.893311 0.682861 +v -1.500000 -0.163086 0.768555 +v -1.500000 -0.134440 0.747396 +v -1.403931 -0.148438 0.753906 +v -1.596069 -0.148438 0.753906 +v -1.376343 -0.225220 0.750610 +v -1.623657 -0.225220 0.750610 +v -1.410469 -0.299844 0.743984 +v -1.589531 -0.299844 0.743984 +v -1.106201 -0.043579 0.667725 +v -1.893799 -0.043579 0.667725 +v -0.906494 0.050903 0.620850 +v -2.093506 0.050903 0.620850 +v -0.786621 0.197754 0.599365 +v -2.213379 0.197754 0.599365 +v -0.766113 0.355591 0.647339 +v -2.233887 0.355591 0.647339 +v -0.841797 0.427490 0.707153 +v -2.158203 0.427490 0.707153 +v -1.043091 0.536621 0.769775 +v -1.956909 0.536621 0.769775 +v -1.182617 0.619995 0.808838 +v -1.817383 0.619995 0.808838 +v -1.295166 0.592285 0.825439 +v -1.704834 0.592285 0.825439 +v -1.394287 0.447510 0.821411 +v -1.605713 0.447510 0.821411 +v -1.357585 -0.096300 0.776693 +v -1.642415 -0.096300 0.776693 +v -1.291748 -0.459473 0.695435 +v -1.708252 -0.459473 0.695435 +v -1.257202 -0.682739 0.678345 +v -1.742798 -0.682739 0.678345 +v -1.246216 -0.813354 0.655640 +v -1.753784 -0.813354 0.655640 +v -1.274902 -0.899292 0.632568 +v -1.725098 -0.899292 0.632568 +v -1.356079 -0.927979 0.631592 +v -1.643921 -0.927979 0.631592 +v -1.500000 -0.939697 0.636719 +v -1.500000 0.041558 0.738824 +v -1.500000 0.209473 0.765137 +v -1.170044 0.484375 0.755249 +v -1.829956 0.484375 0.755249 +v -1.350464 0.133545 0.752197 +v -1.649536 0.133545 0.752197 +v -1.376343 0.213989 0.761841 +v -1.623657 0.213989 0.761841 +v -1.385620 -0.664185 0.730225 +v -1.614380 -0.664185 0.730225 +v -1.410522 -0.457153 0.742188 +v -1.589478 -0.457153 0.742188 +v -1.500000 -0.458984 0.747070 +v -1.500000 -0.333008 0.748047 +v -1.415771 -0.272339 0.781250 +v -1.584229 -0.272339 0.781250 +v -1.378662 -0.221191 0.791138 +v -1.621338 -0.221191 0.791138 +v -1.399658 -0.147827 0.782104 +v -1.600342 -0.147827 0.782104 +v -1.460327 -0.138428 0.782104 +v -1.539673 -0.138428 0.782104 +v -1.500000 -0.202365 0.823351 +v -1.452257 -0.157769 0.809028 +v -1.547743 -0.157769 0.809028 +v -1.411892 -0.165148 0.809028 +v -1.588108 -0.165148 0.809028 +v -1.406006 -0.218994 0.819458 +v -1.593994 -0.218994 0.819458 +v -1.429904 -0.256510 0.804471 +v -1.570096 -0.256510 0.804471 +v -1.500000 -0.274170 0.804688 +v -1.253540 -0.315674 0.560303 +v -1.746460 -0.315674 0.560303 +v -1.335327 -0.234375 0.705688 +v -1.664673 -0.234375 0.705688 +v -1.319824 -0.317871 0.695801 +v -1.680176 -0.317871 0.695801 +v -1.278442 -0.244995 0.565674 +v -1.721558 -0.244995 0.565674 +v -1.500000 -0.873047 0.680908 +v -1.451294 -0.862427 0.684082 +v -1.548706 -0.862427 0.684082 +v -1.409424 -0.816895 0.701782 +v -1.590576 -0.816895 0.701782 +v -1.416138 -0.754517 0.716675 +v -1.583862 -0.754517 0.716675 +v -1.500000 -0.782959 0.662842 +v -1.422607 -0.771606 0.664876 +v -1.577393 -0.771606 0.664876 +v -1.415799 -0.809245 0.658782 +v -1.584201 -0.809245 0.658782 +v -1.448975 -0.838623 0.644246 +v -1.551025 -0.838623 0.644246 +v -1.500000 -0.848877 0.642822 +v -1.327393 0.220825 0.773804 +v -1.672607 0.220825 0.773804 +v -1.310669 0.158203 0.769165 +v -1.689331 0.158203 0.769165 +v -1.162109 0.427856 0.757935 +v -1.837891 0.427856 0.757935 +v -1.228516 0.419922 0.769409 +v -1.771484 0.419922 0.769409 +v -1.071289 0.399902 0.753296 +v -1.928711 0.399902 0.753296 +v -0.951050 0.350830 0.697632 +v -2.048950 0.350830 0.697632 +v -0.915405 0.285400 0.681030 +v -2.084595 0.285400 0.681030 +v -0.931763 0.195679 0.680054 +v -2.068237 0.195679 0.680054 +v -1.023193 0.105957 0.709473 +v -1.976807 0.105957 0.709473 +v -1.130981 0.070679 0.737061 +v -1.869019 0.070679 0.737061 +v -1.260620 0.109009 0.767944 +v -1.739380 0.109009 0.767944 +v -1.321655 0.297974 0.776245 +v -1.678345 0.297974 0.776245 +v -1.288208 0.373779 0.776367 +v -1.711792 0.373779 0.776367 +v -1.264648 0.356445 0.758789 +v -1.735352 0.356445 0.758789 +v -1.299805 0.295898 0.756836 +v -1.700195 0.295898 0.756836 +v -1.246094 0.125977 0.752930 +v -1.753906 0.125977 0.752930 +v -1.130859 0.094727 0.727539 +v -1.869141 0.094727 0.727539 +v -1.039062 0.125000 0.702148 +v -1.960938 0.125000 0.702148 +v -0.962891 0.208008 0.675781 +v -2.037109 0.208008 0.675781 +v -0.949219 0.279297 0.672852 +v -2.050781 0.279297 0.672852 +v -0.980469 0.335938 0.687500 +v -2.019531 0.335938 0.687500 +v -1.081055 0.385742 0.741211 +v -1.918945 0.385742 0.741211 +v -1.217773 0.394531 0.762695 +v -1.782227 0.394531 0.762695 +v -1.161133 0.403320 0.751953 +v -1.838867 0.403320 0.751953 +v -1.292969 0.172852 0.750977 +v -1.707031 0.172852 0.750977 +v -1.303711 0.228516 0.750977 +v -1.696289 0.228516 0.750977 +v -1.374479 0.489245 0.612891 +v -1.625521 0.489245 0.612891 +v -1.294271 0.638021 0.640625 +v -1.705729 0.638021 0.640625 +v -1.172309 0.665365 0.622179 +v -1.827691 0.665365 0.622179 +v -1.041875 0.553438 0.557578 +v -1.958125 0.553438 0.557578 +v -0.831909 0.463501 0.489014 +v -2.168091 0.463501 0.489014 +v -0.719604 0.385376 0.449707 +v -2.280396 0.385376 0.449707 +v -0.730225 0.177979 0.363892 +v -2.269775 0.177979 0.363892 +v -0.880493 -0.000366 0.387573 +v -2.119507 -0.000366 0.387573 +v -1.083333 -0.110781 0.449245 +v -1.916667 -0.110781 0.449245 +v -1.500000 0.856201 0.263916 +v -1.500000 0.950195 -0.085938 +v -1.500000 -0.175049 -0.618652 +v -1.500000 -0.436523 0.129395 +v -1.500000 -0.948242 0.456543 +v -1.500000 -0.786133 0.360352 +v -1.500000 -0.579346 0.325684 +v -1.500000 -0.475830 0.270508 +v -0.685303 0.226074 0.114136 +v -2.314697 0.226074 0.114136 +v -0.663672 0.300938 -0.049844 +v -2.336328 0.300938 -0.049844 +v -0.737187 0.282891 -0.418750 +v -2.262813 0.282891 -0.418750 +v -1.091309 0.442139 -0.665405 +v -1.908691 0.442139 -0.665405 +v -0.799688 -0.032500 0.072813 +v -2.200313 -0.032500 0.072812 +v -0.883906 -0.109531 -0.167969 +v -2.116094 -0.109531 -0.167969 +v -0.850220 0.005127 -0.400513 +v -2.149780 0.005127 -0.400513 +v -1.174479 0.077148 -0.660970 +v -1.825521 0.077148 -0.660970 +v -1.263306 -0.381104 0.408813 +v -1.736694 -0.381104 0.408813 +v -1.338135 -0.426758 0.279297 +v -1.661865 -0.426758 0.279297 +v -1.220459 -0.735840 0.403076 +v -1.779541 -0.735840 0.403076 +v -1.250000 -0.535645 0.407837 +v -1.750000 -0.535645 0.407837 +v -1.213976 -0.887153 0.430339 +v -1.786024 -0.887153 0.430339 +v -1.357666 -0.753784 0.373901 +v -1.642334 -0.753784 0.373901 +v -1.368042 -0.550171 0.349487 +v -1.631958 -0.550171 0.349487 +v -1.337280 -0.924683 0.441650 +v -1.662720 -0.924683 0.441650 +v -1.264167 -0.284766 0.404818 +v -1.735833 -0.284766 0.404818 +v -1.260824 -0.215210 0.474040 +v -1.739176 -0.215210 0.474040 +v -1.246889 -0.171658 0.501808 +v -1.753111 -0.171658 0.501808 +v -1.287370 -0.369297 0.155833 +v -1.712630 -0.369297 0.155833 +v -1.226807 -0.293091 -0.251099 +v -1.773193 -0.293091 -0.251099 +v -1.189128 -0.132080 -0.535482 +v -1.810872 -0.132080 -0.535482 +v -1.079712 0.804932 -0.407593 +v -1.920288 0.804932 -0.407593 +v -1.080078 0.896362 -0.089233 +v -1.919922 0.896362 -0.089233 +v -1.079468 0.808472 0.206787 +v -1.920532 0.808472 0.206787 +v -1.071167 0.561523 0.418091 +v -1.928833 0.561523 0.418091 +v -0.756592 0.409424 0.289062 +v -2.243408 0.409424 0.289062 +v -0.869385 0.487549 0.302734 +v -2.130615 0.487549 0.302734 +v -0.864990 0.679565 0.081543 +v -2.135010 0.679565 0.081543 +v -0.722290 0.535889 0.090576 +v -2.277710 0.535889 0.090576 +v -0.719849 0.582275 -0.138916 +v -2.280151 0.582275 -0.138916 +v -0.863281 0.740601 -0.170044 +v -2.136719 0.740601 -0.170044 +v -0.865723 0.650391 -0.414062 +v -2.134277 0.650391 -0.414062 +v -0.741753 0.524089 -0.343750 +v -2.258246 0.524089 -0.343750 +v -0.896851 0.339111 -0.558228 +v -2.103149 0.339111 -0.558228 +v -1.017995 0.019531 -0.522786 +v -1.982005 0.019531 -0.522786 +v -0.675234 0.347656 -0.205313 +v -2.324766 0.347656 -0.205313 +v -1.094245 -0.181641 0.158802 +v -1.905755 -0.181641 0.158802 +v -1.061157 -0.174072 -0.207764 +v -1.938843 -0.174072 -0.207764 +v -0.602051 0.395508 -0.258789 +v -2.397949 0.395508 -0.258789 +v -0.706665 -0.121094 -0.181519 +v -2.293335 -0.121094 -0.181519 +v -0.464111 -0.077881 -0.333130 +v -2.535889 -0.077881 -0.333130 +v -0.245117 0.070923 -0.426514 +v -2.754883 0.070923 -0.426514 +v -0.179565 0.304077 -0.431396 +v -2.820435 0.304077 -0.431396 +v -0.281494 0.467773 -0.420288 +v -2.718506 0.467773 -0.420288 +v -0.468018 0.459351 -0.333862 +v -2.531982 0.459351 -0.333862 +v -0.472778 0.409180 -0.304321 +v -2.527222 0.409180 -0.304321 +v -0.320190 0.415039 -0.389526 +v -2.679810 0.415039 -0.389526 +v -0.244629 0.280273 -0.411621 +v -2.755371 0.280273 -0.411621 +v -0.299194 0.088623 -0.401611 +v -2.700806 0.088623 -0.401611 +v -0.469482 -0.031006 -0.306030 +v -2.530518 -0.031006 -0.306030 +v -0.660400 -0.064575 -0.168579 +v -2.339600 -0.064575 -0.168579 +v -0.576294 0.356445 -0.236816 +v -2.423706 0.356445 -0.236816 +v -0.553833 0.306885 -0.293213 +v -2.446167 0.306885 -0.293213 +v -0.613037 -0.023926 -0.235107 +v -2.386963 -0.023926 -0.235107 +v -0.462036 0.004150 -0.356323 +v -2.537964 0.004150 -0.356323 +v -0.319946 0.099243 -0.435547 +v -2.680054 0.099243 -0.435547 +v -0.272949 0.247681 -0.445068 +v -2.727051 0.247681 -0.445068 +v -0.334961 0.350952 -0.428589 +v -2.665039 0.350952 -0.428589 +v -0.466797 0.347534 -0.358643 +v -2.533203 0.347534 -0.358643 +v -0.648682 0.287598 -0.216064 +v -2.351318 0.287598 -0.216064 +v -0.671143 0.173584 -0.270386 +v -2.328857 0.173584 -0.270386 +v -0.727539 0.096680 -0.270264 +v -2.272461 0.096680 -0.270264 +v -0.688368 0.071181 -0.281467 +v -2.311632 0.071181 -0.281467 +v -0.676392 0.022583 -0.269653 +v -2.323608 0.022583 -0.269653 +v -0.686279 -0.013672 -0.259521 +v -2.313721 -0.013672 -0.259521 +v -0.760824 0.032064 -0.078288 +v -2.239177 0.032064 -0.078288 +v -0.772474 -0.027448 -0.168229 +v -2.227526 -0.027448 -0.168229 +v -0.761693 0.048411 -0.191979 +v -2.238307 0.048411 -0.191979 +v -0.696411 0.201538 -0.198730 +v -2.303589 0.201538 -0.198730 +v -0.614502 0.245972 -0.269043 +v -2.385498 0.245972 -0.269043 +v -0.599365 0.226685 -0.320068 +v -2.400635 0.226685 -0.320068 +v -0.662977 -0.007595 -0.299479 +v -2.337023 -0.007595 -0.299479 +v -0.646973 0.024536 -0.315186 +v -2.353027 0.024536 -0.315186 +v -0.669312 0.077881 -0.315430 +v -2.330688 0.077881 -0.315430 +v -0.705295 0.106554 -0.310113 +v -2.294705 0.106554 -0.310113 +v -0.654541 0.162964 -0.315552 +v -2.345459 0.162964 -0.315552 +v -0.450887 0.320719 -0.404785 +v -2.549113 0.320719 -0.404785 +v -0.335164 0.323649 -0.460449 +v -2.664835 0.323649 -0.460449 +v -0.277588 0.234009 -0.471924 +v -2.722412 0.234009 -0.471924 +v -0.324097 0.106567 -0.460327 +v -2.675903 0.106567 -0.460327 +v -0.460205 0.023315 -0.397949 +v -2.539795 0.023315 -0.397949 +v -0.600586 -0.004639 -0.291016 +v -2.399414 -0.004639 -0.291016 +v -0.537231 0.281982 -0.345825 +v -2.462769 0.281982 -0.345825 +v -0.609497 0.114258 -0.329834 +v -2.390503 0.114258 -0.329834 +v -0.575806 0.060791 -0.331177 +v -2.424194 0.060791 -0.331177 +v -0.500000 0.116333 -0.369141 +v -2.500000 0.116333 -0.369141 +v -0.544312 0.173706 -0.349731 +v -2.455688 0.173706 -0.349731 +v -0.485474 0.232300 -0.371948 +v -2.514526 0.232300 -0.371948 +v -0.432251 0.177734 -0.392822 +v -2.567749 0.177734 -0.392822 +v -0.376519 0.223524 -0.411024 +v -2.623481 0.223524 -0.411024 +v -0.412923 0.274699 -0.401489 +v -2.587077 0.274699 -0.401489 +v -0.467163 0.375732 -0.458740 +v -2.532837 0.375732 -0.458740 +v -0.260173 0.400635 -0.516642 +v -2.739827 0.400635 -0.516642 +v -0.171730 0.287543 -0.496600 +v -2.828269 0.287543 -0.496600 +v -0.225016 0.114136 -0.510905 +v -2.774984 0.114136 -0.510905 +v -0.460083 -0.011475 -0.456787 +v -2.539917 -0.011475 -0.456787 +v -0.692017 -0.048950 -0.340698 +v -2.307983 -0.048950 -0.340698 +v -0.635620 0.318726 -0.376953 +v -2.364380 0.318726 -0.376953 +v -0.996094 0.242676 0.717773 +v -1.036133 0.198242 0.753418 +v -1.040039 0.137207 0.728027 +v -0.971680 0.169922 0.676270 +v -2.028320 0.169922 0.676270 +v -1.959961 0.137207 0.728027 +v -1.963867 0.198242 0.753418 +v -2.003906 0.242676 0.717773 +v -0.923828 0.242676 0.621094 +v -0.989258 0.086426 0.635254 +v -0.914062 0.148438 0.570312 +v -2.085938 0.148438 0.570312 +v -2.010742 0.086426 0.635254 +v -2.076172 0.242676 0.621094 +v -1.075195 0.067383 0.698730 +v -1.148438 0.021484 0.666992 +v -1.050781 0.015625 0.597656 +v -1.949219 0.015625 0.597656 +v -1.851562 0.021484 0.666992 +v -1.924805 0.067383 0.698730 +v -1.101074 0.136230 0.767090 +v -1.147949 0.093750 0.749512 +v -1.852051 0.093750 0.749512 +v -1.898926 0.136230 0.767090 +v -1.192383 0.136230 0.784668 +v -1.253418 0.137207 0.767090 +v -1.221191 0.067383 0.725586 +v -1.778809 0.067383 0.725586 +v -1.746582 0.137207 0.767090 +v -1.807617 0.136230 0.784668 +v -1.307617 0.086426 0.692383 +v -1.246094 0.015625 0.632812 +v -1.753906 0.015625 0.632812 +v -1.692383 0.086426 0.692383 +v -1.324219 0.169922 0.737793 +v -1.373047 0.242676 0.698242 +v -1.382812 0.148438 0.652344 +v -1.617188 0.148438 0.652344 +v -1.626953 0.242676 0.698242 +v -1.675781 0.169922 0.737793 +v -1.254395 0.198242 0.792969 +v -1.296875 0.242676 0.769531 +v -1.703125 0.242676 0.769531 +v -1.745605 0.198242 0.792969 +v -1.254395 0.289551 0.792969 +v -1.253418 0.350586 0.767090 +v -1.324219 0.315430 0.737793 +v -1.675781 0.315430 0.737793 +v -1.746582 0.350586 0.767090 +v -1.745605 0.289551 0.792969 +v -1.307617 0.401367 0.692383 +v -1.382812 0.339844 0.652344 +v -1.617188 0.339844 0.652344 +v -1.692383 0.401367 0.692383 +v -1.221191 0.418945 0.725586 +v -1.148438 0.466797 0.666992 +v -1.246094 0.476562 0.632812 +v -1.753906 0.476562 0.632812 +v -1.851562 0.466797 0.666992 +v -1.778809 0.418945 0.725586 +v -1.192383 0.354980 0.784668 +v -1.147949 0.394531 0.749512 +v -1.852051 0.394531 0.749512 +v -1.807617 0.354980 0.784668 +v -1.101074 0.354980 0.767090 +v -1.040039 0.350586 0.728027 +v -1.075195 0.418945 0.698730 +v -1.924805 0.418945 0.698730 +v -1.959961 0.350586 0.728027 +v -1.898926 0.354980 0.767090 +v -0.989258 0.401367 0.635254 +v -1.050781 0.476562 0.597656 +v -1.949219 0.476562 0.597656 +v -2.010742 0.401367 0.635254 +v -0.971680 0.315430 0.676270 +v -0.914062 0.339844 0.570312 +v -2.085938 0.339844 0.570312 +v -2.028320 0.315430 0.676270 +v -1.036133 0.289551 0.753418 +v -1.963867 0.289551 0.753418 +v -1.035156 0.243164 0.767578 +v -1.065918 0.325195 0.774902 +v -1.049154 0.284668 0.779622 +v -1.950846 0.284668 0.779622 +v -1.934082 0.325195 0.774902 +v -1.964844 0.243164 0.767578 +v -1.147461 0.358398 0.792480 +v -1.105957 0.344564 0.793457 +v -1.894043 0.344564 0.793457 +v -1.852539 0.358398 0.792480 +v -1.224609 0.325195 0.806641 +v -1.187337 0.344564 0.810872 +v -1.812663 0.344564 0.810872 +v -1.775391 0.325195 0.806641 +v -1.256836 0.243164 0.808594 +v -1.243652 0.284668 0.818034 +v -1.756348 0.284668 0.818034 +v -1.743164 0.243164 0.808594 +v -1.224609 0.166016 0.806641 +v -1.243652 0.203288 0.818034 +v -1.756348 0.203288 0.818034 +v -1.775391 0.166016 0.806641 +v -1.147461 0.133789 0.792480 +v -1.187337 0.146973 0.810872 +v -1.812663 0.146973 0.810872 +v -1.852539 0.133789 0.792480 +v -1.065918 0.166016 0.774902 +v -1.105957 0.146973 0.793457 +v -1.894043 0.146973 0.793457 +v -1.934082 0.166016 0.774902 +v -1.049154 0.203288 0.779622 +v -1.950846 0.203288 0.779622 +v -1.080729 0.242839 0.797526 +v -1.098958 0.195964 0.802083 +v -1.919271 0.242839 0.797526 +v -1.901042 0.195964 0.802083 +v -1.147786 0.175781 0.813802 +v -1.852214 0.175781 0.813802 +v -1.194661 0.195964 0.822266 +v -1.805339 0.195964 0.822266 +v -1.214844 0.242839 0.823568 +v -1.785156 0.242839 0.823568 +v -1.194661 0.292318 0.822266 +v -1.805339 0.292318 0.822266 +v -1.147786 0.313151 0.813802 +v -1.852214 0.313151 0.813802 +v -1.098958 0.292318 0.802083 +v -1.901042 0.292318 0.802083 +v -1.412109 -0.969727 0.560547 +v -1.335938 -0.948730 0.593750 +v -1.423340 -0.936035 0.634766 +v -1.500000 -0.960938 0.605469 +v -1.576660 -0.936035 0.634766 +v -1.664062 -0.948730 0.593750 +v -1.587891 -0.969727 0.560547 +v -1.253906 -0.949219 0.535645 +v -1.228027 -0.922852 0.582520 +v -1.307617 -0.918457 0.629883 +v -1.692383 -0.918457 0.629883 +v -1.771973 -0.922852 0.582520 +v -1.746094 -0.949219 0.535645 +v -1.169434 -0.898438 0.525391 +v -1.189941 -0.845215 0.599121 +v -1.254883 -0.862305 0.642578 +v -1.745117 -0.862305 0.642578 +v -1.810059 -0.845215 0.599121 +v -1.830566 -0.898438 0.525391 +v -1.164551 -0.765625 0.545898 +v -1.202148 -0.686523 0.626465 +v -1.247559 -0.758301 0.667480 +v -1.752441 -0.758301 0.667480 +v -1.797852 -0.686523 0.626465 +v -1.835449 -0.765625 0.545898 +v -1.191895 -0.549805 0.564941 +v -1.238770 -0.457520 0.638184 +v -1.273438 -0.572266 0.688477 +v -1.726562 -0.572266 0.688477 +v -1.761230 -0.457520 0.638184 +v -1.808105 -0.549805 0.564941 +v -1.299805 -0.150879 0.669922 +v -1.187012 -0.148926 0.563477 +v -1.087891 -0.087402 0.609863 +v -1.227539 -0.069336 0.715332 +v -1.772461 -0.069336 0.715332 +v -1.912109 -0.087402 0.609863 +v -1.812988 -0.148926 0.563477 +v -1.700195 -0.150879 0.669922 +v -0.970215 -0.072754 0.537598 +v -0.881836 0.016113 0.577148 +v -0.998047 -0.003418 0.639160 +v -2.001953 -0.003418 0.639160 +v -2.118164 0.016113 0.577148 +v -2.029785 -0.072754 0.537598 +v -0.782227 0.067383 0.495117 +v -0.738770 0.183105 0.543457 +v -0.834961 0.119141 0.604004 +v -2.165039 0.119141 0.604004 +v -2.261230 0.183105 0.543457 +v -2.217773 0.067383 0.495117 +v -0.677246 0.288574 0.520508 +v -0.714844 0.379883 0.618652 +v -0.764648 0.283203 0.617676 +v -2.235352 0.283203 0.617676 +v -2.285156 0.379883 0.618652 +v -2.322754 0.288574 0.520508 +v -0.729492 0.445801 0.603027 +v -0.817383 0.458984 0.677734 +v -0.788086 0.395020 0.676758 +v -2.211914 0.395020 0.676758 +v -2.182617 0.458984 0.677734 +v -2.270508 0.445801 0.603027 +v -0.905762 0.530273 0.652832 +v -1.024414 0.574219 0.739258 +v -0.938477 0.479004 0.739746 +v -2.061523 0.479004 0.739746 +v -1.975586 0.574219 0.739258 +v -2.094238 0.530273 0.652832 +v -1.097168 0.661621 0.707031 +v -1.182129 0.679688 0.782227 +v -1.120605 0.587402 0.792480 +v -1.879395 0.587402 0.792480 +v -1.817871 0.679688 0.782227 +v -1.902832 0.661621 0.707031 +v -1.255859 0.716797 0.740723 +v -1.315430 0.645996 0.801270 +v -1.240723 0.623047 0.819824 +v -1.759277 0.623047 0.819824 +v -1.684570 0.645996 0.801270 +v -1.744141 0.716797 0.740723 +v -1.379883 0.589844 0.748047 +v -1.416016 0.478027 0.795898 +v -1.346191 0.523438 0.825684 +v -1.653809 0.523438 0.825684 +v -1.583984 0.478027 0.795898 +v -1.620117 0.589844 0.748047 +v -1.463379 0.448730 0.739258 +v -1.500000 0.408203 0.785156 +v -1.439941 0.395508 0.813477 +v -1.560059 0.395508 0.813477 +v -1.536621 0.448730 0.739258 +v -1.364258 0.425293 0.806152 +v -1.295410 0.446289 0.777344 +v -1.273438 0.529785 0.803223 +v -1.726562 0.529785 0.803223 +v -1.704590 0.446289 0.777344 +v -1.635742 0.425293 0.806152 +v -1.212891 0.486328 0.763672 +v -1.177246 0.548340 0.787109 +v -1.822754 0.548340 0.787109 +v -1.787109 0.486328 0.763672 +v -1.121582 0.468750 0.745605 +v -1.054199 0.488281 0.753906 +v -1.945801 0.488281 0.753906 +v -1.878418 0.468750 0.745605 +v -0.981445 0.411621 0.705566 +v -0.875977 0.399414 0.697754 +v -2.124023 0.399414 0.697754 +v -2.018555 0.411621 0.705566 +v -0.873047 0.341309 0.665039 +v -0.816406 0.325684 0.654297 +v -2.183594 0.325684 0.654297 +v -2.126953 0.341309 0.665039 +v -0.860840 0.248047 0.650391 +v -0.837402 0.195801 0.631348 +v -2.162598 0.195801 0.631348 +v -2.139160 0.248047 0.650391 +v -0.931152 0.128418 0.659180 +v -0.951172 0.066406 0.650391 +v -2.048828 0.066406 0.650391 +v -2.068848 0.128418 0.659180 +v -1.058105 0.040039 0.687988 +v -1.120117 -0.004883 0.693848 +v -1.879883 -0.004883 0.693848 +v -1.941895 0.040039 0.687988 +v -1.212891 0.042480 0.729980 +v -1.318359 0.006836 0.761230 +v -1.681641 0.006836 0.761230 +v -1.787109 0.042480 0.729980 +v -1.328613 0.101074 0.752930 +v -1.409668 0.096191 0.746094 +v -1.423828 -0.023926 0.763184 +v -1.576172 -0.023926 0.763184 +v -1.590332 0.096191 0.746094 +v -1.671387 0.101074 0.752930 +v -1.360840 0.360352 0.778809 +v -1.428223 0.325195 0.791016 +v -1.571777 0.325195 0.791016 +v -1.639160 0.360352 0.778809 +v -1.381348 0.260742 0.768066 +v -1.500000 0.275391 0.785156 +v -1.432129 0.210938 0.762695 +v -1.567871 0.210938 0.762695 +v -1.618652 0.260742 0.768066 +v -1.500000 0.140625 0.748047 +v -1.366211 0.171387 0.755859 +v -1.633789 0.171387 0.755859 +v -1.393066 -0.903809 0.665039 +v -1.463379 -0.891113 0.684082 +v -1.500000 -0.915039 0.664062 +v -1.536621 -0.891113 0.684082 +v -1.606934 -0.903809 0.665039 +v -1.330566 -0.865723 0.674316 +v -1.398926 -0.865234 0.693848 +v -1.601074 -0.865234 0.693848 +v -1.669434 -0.865723 0.674316 +v -1.314453 -0.773438 0.697266 +v -1.372070 -0.789062 0.712891 +v -1.627930 -0.789062 0.712891 +v -1.685547 -0.773438 0.697266 +v -1.352051 -0.458496 0.727539 +v -1.397949 -0.566895 0.736816 +v -1.320801 -0.673340 0.711914 +v -1.679199 -0.673340 0.711914 +v -1.602051 -0.566895 0.736816 +v -1.647949 -0.458496 0.727539 +v -1.382812 -0.712891 0.727051 +v -1.617188 -0.712891 0.727051 +v -1.414062 -0.371094 0.741699 +v -1.457031 -0.324219 0.748047 +v -1.500000 -0.381836 0.746094 +v -1.458008 -0.458008 0.747070 +v -1.541992 -0.458008 0.747070 +v -1.542969 -0.324219 0.748047 +v -1.585938 -0.371094 0.741699 +v -1.444336 -0.661133 0.736328 +v -1.500000 -0.563477 0.742188 +v -1.555664 -0.661133 0.736328 +v -1.500000 -0.717773 0.734375 +v -1.445801 -0.736816 0.732910 +v -1.554199 -0.736816 0.732910 +v -1.385254 -0.259277 0.747070 +v -1.378906 -0.222656 0.770508 +v -1.390137 -0.249512 0.787109 +v -1.416504 -0.279785 0.763184 +v -1.583496 -0.279785 0.763184 +v -1.609863 -0.249512 0.787109 +v -1.621094 -0.222656 0.770508 +v -1.614746 -0.259277 0.747070 +v -1.381836 -0.184570 0.753418 +v -1.402344 -0.150391 0.763184 +v -1.382324 -0.182129 0.787598 +v -1.617676 -0.182129 0.787598 +v -1.597656 -0.150391 0.763184 +v -1.618164 -0.184570 0.753418 +v -1.444824 -0.127930 0.750488 +v -1.472168 -0.141113 0.763184 +v -1.429199 -0.133789 0.780273 +v -1.570801 -0.133789 0.780273 +v -1.527832 -0.141113 0.763184 +v -1.555176 -0.127930 0.750488 +v -1.500000 -0.165039 0.756836 +v -1.500000 -0.176758 0.770508 +v -1.482422 -0.160156 0.787598 +v -1.517578 -0.160156 0.787598 +v -1.500000 -0.313477 0.761719 +v -1.454590 -0.294922 0.779297 +v -1.545410 -0.294922 0.779297 +v -1.500000 -0.293945 0.792969 +v -1.420410 -0.262695 0.795410 +v -1.458008 -0.266113 0.804688 +v -1.541992 -0.266113 0.804688 +v -1.579590 -0.262695 0.795410 +v -1.500000 -0.180664 0.808594 +v -1.467285 -0.175293 0.816406 +v -1.455078 -0.145020 0.798828 +v -1.544922 -0.145020 0.798828 +v -1.532715 -0.175293 0.816406 +v -1.431152 -0.157227 0.810547 +v -1.403320 -0.153809 0.798828 +v -1.596680 -0.153809 0.798828 +v -1.568848 -0.157227 0.810547 +v -1.405762 -0.187988 0.816406 +v -1.385742 -0.220703 0.808105 +v -1.614258 -0.220703 0.808105 +v -1.594238 -0.187988 0.816406 +v -1.415527 -0.240723 0.812988 +v -1.584473 -0.240723 0.812988 +v -1.445312 -0.213867 0.823242 +v -1.554688 -0.213867 0.823242 +v -1.500000 -0.244141 0.816406 +v -1.500000 -0.066406 0.745117 +v -1.396973 -0.128906 0.766113 +v -1.603027 -0.128906 0.766113 +v -1.360840 -0.229004 0.735840 +v -1.350098 -0.179688 0.734375 +v -1.649902 -0.179688 0.734375 +v -1.639160 -0.229004 0.735840 +v -1.364258 -0.310547 0.727539 +v -1.327148 -0.275391 0.695801 +v -1.672852 -0.275391 0.695801 +v -1.635742 -0.310547 0.727539 +v -1.307617 -0.376953 0.696777 +v -1.692383 -0.376953 0.696777 +v -1.233398 -0.368164 0.562988 +v -1.278320 -0.320312 0.633789 +v -1.721680 -0.320312 0.633789 +v -1.766602 -0.368164 0.562988 +v -1.267090 -0.277344 0.561035 +v -1.302734 -0.241699 0.639648 +v -1.697266 -0.241699 0.639648 +v -1.732910 -0.277344 0.561035 +v -1.291992 -0.210449 0.574707 +v -1.708008 -0.210449 0.574707 +v -1.410645 -0.747559 0.727539 +v -1.500000 -0.759766 0.727539 +v -1.452148 -0.756836 0.716309 +v -1.547852 -0.756836 0.716309 +v -1.589355 -0.747559 0.727539 +v -1.401367 -0.821777 0.710938 +v -1.403809 -0.780762 0.710938 +v -1.596191 -0.780762 0.710938 +v -1.598633 -0.821777 0.710938 +v -1.445801 -0.870117 0.693359 +v -1.427246 -0.844238 0.691895 +v -1.572754 -0.844238 0.691895 +v -1.554199 -0.870117 0.693359 +v -1.500000 -0.880859 0.688477 +v -1.475586 -0.871094 0.681152 +v -1.524414 -0.871094 0.681152 +v -1.500000 -0.865234 0.660156 +v -1.453125 -0.854980 0.662109 +v -1.473633 -0.846191 0.643066 +v -1.526367 -0.846191 0.643066 +v -1.546875 -0.854980 0.662109 +v -1.412109 -0.812988 0.676270 +v -1.427734 -0.826660 0.646810 +v -1.572266 -0.826660 0.646810 +v -1.587891 -0.812988 0.676270 +v -1.417969 -0.758789 0.691895 +v -1.410156 -0.787109 0.659017 +v -1.589844 -0.787109 0.659017 +v -1.582031 -0.758789 0.691895 +v -1.500000 -0.769531 0.689453 +v -1.456055 -0.775879 0.664551 +v -1.543945 -0.775879 0.664551 +v -1.500000 -0.815430 0.645508 +v -1.436523 -0.804199 0.647298 +v -1.563477 -0.804199 0.647298 +v -1.344727 0.217285 0.769043 +v -1.322266 0.150879 0.762695 +v -1.321777 0.187500 0.770996 +v -1.678223 0.187500 0.770996 +v -1.677734 0.150879 0.762695 +v -1.655273 0.217285 0.769043 +v -1.343262 0.301758 0.773438 +v -1.327637 0.258301 0.775391 +v -1.672363 0.258301 0.775391 +v -1.656738 0.301758 0.773438 +v -1.307617 0.389160 0.775391 +v -1.308594 0.337891 0.776855 +v -1.691406 0.337891 0.776855 +v -1.692383 0.389160 0.775391 +v -1.270020 0.099609 0.756836 +v -1.293945 0.132812 0.770508 +v -1.706055 0.132812 0.770508 +v -1.729980 0.099609 0.756836 +v -1.131348 0.052246 0.724121 +v -1.199707 0.084473 0.754395 +v -1.800293 0.084473 0.754395 +v -1.868652 0.052246 0.724121 +v -1.014648 0.090332 0.694824 +v -1.074219 0.079102 0.723145 +v -1.925781 0.079102 0.723145 +v -1.985352 0.090332 0.694824 +v -0.911621 0.190430 0.668457 +v -0.971680 0.147461 0.692871 +v -2.028320 0.147461 0.692871 +v -2.088379 0.190430 0.668457 +v -0.892090 0.289062 0.668945 +v -0.915527 0.242676 0.677734 +v -2.084473 0.242676 0.677734 +v -2.107910 0.289062 0.668945 +v -0.933594 0.361328 0.686523 +v -0.923828 0.320801 0.685059 +v -2.076172 0.320801 0.685059 +v -2.066406 0.361328 0.686523 +v -1.066406 0.415527 0.738281 +v -1.007324 0.377441 0.726562 +v -1.992676 0.377441 0.726562 +v -1.933594 0.415527 0.738281 +v -1.165039 0.447754 0.751465 +v -1.121582 0.417480 0.759277 +v -1.878418 0.417480 0.759277 +v -1.834961 0.447754 0.751465 +v -1.238770 0.439941 0.765137 +v -1.196777 0.428711 0.762695 +v -1.803223 0.428711 0.762695 +v -1.761230 0.439941 0.765137 +v -1.260254 0.401367 0.773926 +v -1.739746 0.401367 0.773926 +v -1.222168 0.405762 0.767578 +v -1.274902 0.363770 0.769531 +v -1.242188 0.378906 0.761719 +v -1.757812 0.378906 0.761719 +v -1.725098 0.363770 0.769531 +v -1.777832 0.405762 0.767578 +v -1.161133 0.414062 0.756836 +v -1.191406 0.402344 0.757812 +v -1.808594 0.402344 0.757812 +v -1.838867 0.414062 0.756836 +v -1.076172 0.391113 0.751465 +v -1.125000 0.398438 0.750000 +v -1.875000 0.398438 0.750000 +v -1.923828 0.391113 0.751465 +v -0.966309 0.342773 0.695801 +v -1.027344 0.363281 0.714844 +v -1.972656 0.363281 0.714844 +v -2.033691 0.342773 0.695801 +v -0.933594 0.282227 0.680176 +v -0.957031 0.308594 0.675781 +v -2.042969 0.308594 0.675781 +v -2.066406 0.282227 0.680176 +v -0.948242 0.201660 0.680664 +v -0.949219 0.246094 0.671875 +v -2.050781 0.246094 0.671875 +v -2.051758 0.201660 0.680664 +v -1.031250 0.116699 0.709473 +v -0.996094 0.164062 0.687500 +v -2.003906 0.164062 0.687500 +v -1.968750 0.116699 0.709473 +v -1.130859 0.083984 0.735840 +v -1.082031 0.101562 0.714844 +v -1.917969 0.101562 0.714844 +v -1.869141 0.083984 0.735840 +v -1.252930 0.117676 0.764160 +v -1.191406 0.105469 0.742188 +v -1.808594 0.105469 0.742188 +v -1.747070 0.117676 0.764160 +v -1.301270 0.165527 0.763184 +v -1.277344 0.148438 0.753906 +v -1.722656 0.148438 0.753906 +v -1.698730 0.165527 0.763184 +v -1.308594 0.296387 0.769043 +v -1.285156 0.328125 0.757812 +v -1.714844 0.328125 0.757812 +v -1.691406 0.296387 0.769043 +v -1.314453 0.224609 0.765625 +v -1.304688 0.261719 0.753906 +v -1.695312 0.261719 0.753906 +v -1.685547 0.224609 0.765625 +v -1.300781 0.199219 0.750000 +v -1.699219 0.199219 0.750000 +v -1.500000 0.432617 0.673828 +v -1.413574 0.496094 0.679688 +v -1.452799 0.448405 0.620117 +v -1.547201 0.448405 0.620117 +v -1.586426 0.496094 0.679688 +v -1.316406 0.668457 0.683594 +v -1.320801 0.575195 0.625977 +v -1.679199 0.575195 0.625977 +v -1.683594 0.668457 0.683594 +v -1.170898 0.700684 0.661621 +v -1.233887 0.662598 0.620117 +v -1.766113 0.662598 0.620117 +v -1.829102 0.700684 0.661621 +v -1.005859 0.582520 0.618652 +v -1.122559 0.621094 0.596191 +v -1.877441 0.621094 0.596191 +v -1.994141 0.582520 0.618652 +v -0.813965 0.476074 0.562500 +v -0.919922 0.506836 0.519043 +v -2.080078 0.506836 0.519043 +v -2.186035 0.476074 0.562500 +v -0.691895 0.391602 0.516602 +v -0.763184 0.433105 0.472168 +v -2.236816 0.433105 0.472168 +v -2.308105 0.391602 0.516602 +v -0.718750 0.166992 0.433105 +v -0.707031 0.290039 0.402832 +v -2.292969 0.290039 0.402832 +v -2.281250 0.166992 0.433105 +v -0.882324 -0.009766 0.471191 +v -0.793945 0.080078 0.365234 +v -2.206055 0.080078 0.365234 +v -2.117676 -0.009766 0.471191 +v -1.069336 -0.112793 0.500977 +v -0.972168 -0.060059 0.411621 +v -2.027832 -0.060059 0.411621 +v -1.930664 -0.112793 0.500977 +v -1.433105 -0.569824 0.333008 +v -1.500000 -0.514648 0.302734 +v -1.411621 -0.459473 0.266602 +v -1.355469 -0.476562 0.318848 +v -1.644531 -0.476562 0.318848 +v -1.588379 -0.459473 0.266602 +v -1.566895 -0.569824 0.333008 +v -1.429199 -0.775391 0.365234 +v -1.500000 -0.677734 0.339844 +v -1.366699 -0.647949 0.362305 +v -1.633301 -0.647949 0.362305 +v -1.570801 -0.775391 0.365234 +v -1.418457 -0.940430 0.452148 +v -1.500000 -0.880859 0.402344 +v -1.347168 -0.851562 0.400879 +v -1.652832 -0.851562 0.400879 +v -1.581543 -0.940430 0.452148 +v -1.330078 -0.956543 0.494629 +v -1.500000 -0.974609 0.513672 +v -1.669922 -0.956543 0.494629 +v -1.191406 -0.916992 0.464844 +v -1.256836 -0.908691 0.427734 +v -1.743164 -0.908691 0.427734 +v -1.808594 -0.916992 0.464844 +v -1.175293 -0.791504 0.460449 +v -1.206055 -0.830566 0.409180 +v -1.793945 -0.830566 0.409180 +v -1.824707 -0.791504 0.460449 +v -1.199219 -0.597656 0.478516 +v -1.236328 -0.634277 0.404297 +v -1.763672 -0.634277 0.404297 +v -1.800781 -0.597656 0.478516 +v -1.284668 -0.731934 0.380371 +v -1.306641 -0.529297 0.369629 +v -1.693359 -0.529297 0.369629 +v -1.715332 -0.731934 0.380371 +v -1.294434 -0.394043 0.333008 +v -1.257812 -0.449707 0.408691 +v -1.742188 -0.449707 0.408691 +v -1.705566 -0.394043 0.333008 +v -1.227539 -0.407715 0.487793 +v -1.772461 -0.407715 0.487793 +v -1.259277 -0.301758 0.494141 +v -1.255371 -0.242188 0.444824 +v -1.277832 -0.238281 0.511719 +v -1.722168 -0.238281 0.511719 +v -1.744629 -0.242188 0.444824 +v -1.740723 -0.301758 0.494141 +v -1.270020 -0.334473 0.410156 +v -1.729980 -0.334473 0.410156 +v -1.265137 -0.179199 0.524902 +v -1.272298 -0.192871 0.492350 +v -1.727702 -0.192871 0.492350 +v -1.734863 -0.179199 0.524902 +v -1.188802 -0.144531 0.490885 +v -1.811198 -0.144531 0.490885 +v -1.500000 -0.058594 -0.712891 +v -1.323730 0.087891 -0.732422 +v -1.190592 -0.042969 -0.615560 +v -1.331543 -0.164551 -0.585938 +v -1.668457 -0.164551 -0.585938 +v -1.809408 -0.042969 -0.615560 +v -1.676270 0.087891 -0.732422 +v -1.500000 -0.274414 -0.484375 +v -1.202637 -0.219727 -0.413086 +v -1.354004 -0.335449 -0.285156 +v -1.645996 -0.335449 -0.285156 +v -1.797363 -0.219727 -0.413086 +v -1.500000 -0.404297 -0.074219 +v -1.257324 -0.339355 -0.052246 +v -1.391113 -0.418945 0.126953 +v -1.608887 -0.418945 0.126953 +v -1.742676 -0.339355 -0.052246 +v -1.500000 -0.455078 0.228516 +v -1.325195 -0.400391 0.239746 +v -1.674805 -0.400391 0.239746 +v -1.270182 -0.328125 0.288900 +v -1.729818 -0.328125 0.288900 +v -0.711914 0.197266 0.241211 +v -0.844727 -0.009277 0.247070 +v -0.720215 0.100586 0.088867 +v -2.279785 0.100586 0.088867 +v -2.155273 -0.009277 0.247070 +v -2.288086 0.197266 0.241211 +v -1.500000 0.298828 -0.800781 +v -1.277832 0.493164 -0.734375 +v -1.132324 0.246094 -0.688477 +v -1.867676 0.246094 -0.688477 +v -1.722168 0.493164 -0.734375 +v -1.500000 0.928711 0.099609 +v -1.272949 0.844238 0.249512 +v -1.080078 0.876465 0.065918 +v -1.273438 0.937500 -0.081055 +v -1.726562 0.937500 -0.081055 +v -1.919922 0.876465 0.065918 +v -1.727051 0.844238 0.249512 +v -1.500000 0.930664 -0.291016 +v -1.080078 0.880859 -0.249023 +v -1.272949 0.844238 -0.455078 +v -1.727051 0.844238 -0.455078 +v -1.919922 0.880859 -0.249023 +v -1.500000 0.710938 -0.660156 +v -1.078613 0.643555 -0.559082 +v -1.921387 0.643555 -0.559082 +v -0.853516 0.458008 0.401367 +v -0.745117 0.386230 0.374023 +v -0.808105 0.455078 0.302246 +v -2.191895 0.455078 0.302246 +v -2.254883 0.386230 0.374023 +v -2.146484 0.458008 0.401367 +v -0.870117 0.580078 0.196289 +v -0.742188 0.470215 0.194336 +v -0.786133 0.613770 0.086426 +v -2.213867 0.613770 0.086426 +v -2.257812 0.470215 0.194336 +v -2.129883 0.580078 0.196289 +v -0.863281 0.729980 -0.041992 +v -0.717285 0.573730 -0.021484 +v -0.781250 0.667969 -0.156250 +v -2.218750 0.667969 -0.156250 +v -2.282715 0.573730 -0.021484 +v -2.136719 0.729980 -0.041992 +v -0.863281 0.720703 -0.298340 +v -0.722656 0.560059 -0.258789 +v -0.784180 0.579590 -0.385254 +v -2.215820 0.579590 -0.385254 +v -2.277344 0.560059 -0.258789 +v -2.136719 0.720703 -0.298340 +v -0.731445 0.423828 -0.383301 +v -0.818359 0.299805 -0.495117 +v -0.873047 0.509766 -0.504395 +v -2.126953 0.509766 -0.504395 +v -2.181641 0.299805 -0.495117 +v -2.268555 0.423828 -0.383301 +v -0.976074 0.388672 -0.610840 +v -0.954102 0.732910 -0.407715 +v -2.045898 0.732910 -0.407715 +v -2.023926 0.388672 -0.610840 +v -0.953125 0.823730 -0.133301 +v -2.046875 0.823730 -0.133301 +v -0.953125 0.749023 0.136230 +v -2.046875 0.749023 0.136230 +v -1.077637 0.679688 0.323730 +v -0.948730 0.526367 0.350098 +v -2.051270 0.526367 0.350098 +v -1.922363 0.679688 0.323730 +v -1.056641 0.525391 0.491211 +v -1.943359 0.525391 0.491211 +v -1.500000 0.722656 0.405273 +v -1.261719 0.583008 0.480469 +v -1.738281 0.583008 0.480469 +v -1.215332 0.533691 0.574707 +v -1.784668 0.533691 0.574707 +v -1.397624 0.509440 0.578613 +v -1.602376 0.509440 0.578613 +v -1.500000 0.483724 0.589844 +v -0.706543 0.331055 0.203613 +v -2.293457 0.331055 0.203613 +v -0.671875 0.265625 0.031738 +v -0.679199 0.430176 0.033691 +v -2.320801 0.430176 0.033691 +v -2.328125 0.265625 0.031738 +v -0.667969 0.347656 -0.119629 +v -0.691895 0.459961 -0.165039 +v -2.308105 0.459961 -0.165039 +v -2.332031 0.347656 -0.119629 +v -0.693359 0.344238 -0.308594 +v -2.306641 0.344238 -0.308594 +v -1.192057 -0.277832 0.129720 +v -1.137207 -0.233398 -0.227051 +v -1.071777 -0.192383 -0.035645 +v -1.928223 -0.192383 -0.035645 +v -1.862793 -0.233398 -0.227051 +v -1.807943 -0.277832 0.129720 +v -0.859375 -0.088867 -0.054199 +v -0.943359 -0.107910 0.113770 +v -0.974609 -0.132812 -0.187988 +v -2.025391 -0.132812 -0.187988 +v -2.056641 -0.107910 0.113770 +v -2.140625 -0.088867 -0.054199 +v -1.073242 -0.134277 0.317871 +v -1.926758 -0.134277 0.317871 +v -1.187337 -0.169434 0.448893 +v -1.194499 -0.231934 0.301107 +v -1.805501 -0.231934 0.301107 +v -1.812663 -0.169434 0.448893 +v -0.797852 0.134766 -0.440430 +v -0.927246 0.022949 -0.453613 +v -0.948730 0.178711 -0.564453 +v -2.051270 0.178711 -0.564453 +v -2.072754 0.022949 -0.453613 +v -2.202148 0.134766 -0.440430 +v -1.079264 0.066406 -0.604818 +v -1.920736 0.066406 -0.604818 +v -0.882324 -0.077148 -0.298340 +v -1.040039 -0.101562 -0.371582 +v -1.959961 -0.101562 -0.371582 +v -2.117676 -0.077148 -0.298340 +v -1.098796 -0.076660 -0.514974 +v -1.901204 -0.076660 -0.514974 +v -0.470703 0.440918 -0.304688 +v -0.543457 0.430664 -0.291016 +v -0.588867 0.381348 -0.233398 +v -0.530762 0.385742 -0.265137 +v -2.469238 0.385742 -0.265137 +v -2.411133 0.381348 -0.233398 +v -2.456543 0.430664 -0.291016 +v -2.529297 0.440918 -0.304688 +v -0.373535 0.479004 -0.382324 +v -0.395508 0.424805 -0.350586 +v -0.300781 0.448242 -0.394043 +v -2.699219 0.448242 -0.394043 +v -2.604492 0.424805 -0.350586 +v -2.626465 0.479004 -0.382324 +v -0.213379 0.403809 -0.431641 +v -0.268066 0.362305 -0.406738 +v -0.211426 0.295898 -0.413574 +v -2.788574 0.295898 -0.413574 +v -2.731934 0.362305 -0.406738 +v -2.786621 0.403809 -0.431641 +v -0.190430 0.185547 -0.434570 +v -0.255371 0.182617 -0.413574 +v -0.272461 0.079102 -0.404785 +v -2.727539 0.079102 -0.404785 +v -2.744629 0.182617 -0.413574 +v -2.809570 0.185547 -0.434570 +v -0.342773 -0.017090 -0.392578 +v -0.375000 0.017578 -0.364746 +v -0.467773 -0.057617 -0.305664 +v -2.532227 -0.057617 -0.305664 +v -2.625000 0.017578 -0.364746 +v -2.657227 -0.017090 -0.392578 +v -0.589844 -0.110840 -0.248535 +v -0.569336 -0.057617 -0.228516 +v -0.687988 -0.097168 -0.157227 +v -2.312012 -0.097168 -0.157227 +v -2.430664 -0.057617 -0.228516 +v -2.410156 -0.110840 -0.248535 +v -0.466797 -0.009766 -0.326660 +v -0.542480 -0.016602 -0.287109 +v -0.633301 -0.040039 -0.198730 +v -2.366699 -0.040039 -0.198730 +v -2.457520 -0.016602 -0.287109 +v -2.533203 -0.009766 -0.326660 +v -0.314941 0.095703 -0.414551 +v -0.383789 0.042969 -0.405762 +v -2.616211 0.042969 -0.405762 +v -2.685059 0.095703 -0.414551 +v -0.265137 0.262695 -0.424316 +v -0.282715 0.172363 -0.445801 +v -2.717285 0.172363 -0.445801 +v -2.734863 0.262695 -0.424316 +v -0.331543 0.379883 -0.404297 +v -0.291504 0.310547 -0.441895 +v -2.708496 0.310547 -0.441895 +v -2.668457 0.379883 -0.404297 +v -0.471191 0.375488 -0.326660 +v -0.399902 0.358887 -0.397461 +v -2.600098 0.358887 -0.397461 +v -2.528809 0.375488 -0.326660 +v -0.563965 0.329590 -0.260742 +v -0.516113 0.330078 -0.322266 +v -2.483887 0.330078 -0.322266 +v -2.436035 0.329590 -0.260742 +v -0.763184 0.007812 -0.020508 +v -0.816406 -0.071777 -0.142090 +v -0.784993 -0.016764 -0.117350 +v -2.215007 -0.016764 -0.117350 +v -2.183594 -0.071777 -0.142090 +v -2.236816 0.007812 -0.020508 +v -0.801270 -0.113770 -0.174805 +v -0.728516 -0.054199 -0.162598 +v -2.271484 -0.054199 -0.162598 +v -2.198730 -0.113770 -0.174805 +v -0.711426 0.146973 -0.061035 +v -2.288574 0.146973 -0.061035 +v -0.645996 0.356445 -0.242188 +v -0.659180 0.312012 -0.199707 +v -0.616211 0.323242 -0.223145 +v -2.383789 0.323242 -0.223145 +v -2.340820 0.312012 -0.199707 +v -2.354004 0.356445 -0.242188 +v -0.661621 -0.022461 -0.237305 +v -0.721191 -0.017090 -0.217285 +v -2.278809 -0.017090 -0.217285 +v -2.338379 -0.022461 -0.237305 +v -0.685059 0.000977 -0.267578 +v -0.719727 0.029297 -0.234863 +v -0.766927 0.006185 -0.182292 +v -2.233073 0.006185 -0.182292 +v -2.280273 0.029297 -0.234863 +v -2.314941 0.000977 -0.267578 +v -0.710938 0.081543 -0.273926 +v -0.740234 0.079590 -0.237305 +v -0.678711 0.052246 -0.273926 +v -2.321289 0.052246 -0.273926 +v -2.259766 0.079590 -0.237305 +v -2.289062 0.081543 -0.273926 +v -0.707031 0.131348 -0.270020 +v -0.687012 0.182129 -0.240234 +v -0.732910 0.127441 -0.190918 +v -2.267090 0.127441 -0.190918 +v -2.312988 0.182129 -0.240234 +v -2.292969 0.131348 -0.270020 +v -0.630859 0.264160 -0.240723 +v -0.671875 0.250977 -0.207520 +v -0.641602 0.211426 -0.268555 +v -2.358398 0.211426 -0.268555 +v -2.328125 0.250977 -0.207520 +v -2.369141 0.264160 -0.240723 +v -0.585938 0.278320 -0.276367 +v -2.414062 0.278320 -0.276367 +v -0.684570 0.237305 -0.138672 +v -2.315430 0.237305 -0.138672 +v -0.764486 0.046224 -0.132487 +v -2.235514 0.046224 -0.132487 +v -0.547852 0.294434 -0.322266 +v -0.608398 0.237305 -0.296387 +v -0.570312 0.255859 -0.329102 +v -2.429688 0.255859 -0.329102 +v -2.391602 0.237305 -0.296387 +v -2.452148 0.294434 -0.322266 +v -0.663574 0.170410 -0.296387 +v -0.625977 0.195801 -0.316406 +v -2.374023 0.195801 -0.316406 +v -2.336426 0.170410 -0.296387 +v -0.720703 0.102051 -0.296875 +v -0.689453 0.127930 -0.314941 +v -2.310547 0.127930 -0.314941 +v -2.279297 0.102051 -0.296875 +v -0.680664 0.075195 -0.296875 +v -0.695312 0.093262 -0.314941 +v -2.304688 0.093262 -0.314941 +v -2.319336 0.075195 -0.296875 +v -0.659668 0.020020 -0.296875 +v -0.651855 0.052246 -0.315918 +v -2.348145 0.052246 -0.315918 +v -2.340332 0.020020 -0.296875 +v -0.674316 -0.012207 -0.289551 +v -0.658691 0.002930 -0.312012 +v -2.341309 0.002930 -0.312012 +v -2.325684 -0.012207 -0.289551 +v -0.605957 -0.016602 -0.265137 +v -0.646484 -0.009277 -0.291016 +v -2.353516 -0.009277 -0.291016 +v -2.394043 -0.016602 -0.265137 +v -0.460449 0.333008 -0.387207 +v -0.498535 0.303711 -0.372559 +v -2.501465 0.303711 -0.372559 +v -2.539551 0.333008 -0.387207 +v -0.330566 0.336426 -0.452637 +v -0.390951 0.332682 -0.437988 +v -2.609049 0.332682 -0.437988 +v -2.669434 0.336426 -0.452637 +v -0.268066 0.239746 -0.467285 +v -0.295410 0.288086 -0.470215 +v -2.704590 0.288086 -0.470215 +v -2.731934 0.239746 -0.467285 +v -0.314453 0.098145 -0.456543 +v -0.287598 0.169434 -0.470215 +v -2.712402 0.169434 -0.470215 +v -2.685547 0.098145 -0.456543 +v -0.457520 0.008789 -0.383789 +v -0.385742 0.057617 -0.437500 +v -2.614258 0.057617 -0.437500 +v -2.542480 0.008789 -0.383789 +v -0.535156 0.004395 -0.337891 +v -2.464844 0.004395 -0.337891 +v -0.643066 0.091797 -0.324219 +v -0.615723 0.039062 -0.323242 +v -0.586914 0.088867 -0.333984 +v -2.413086 0.088867 -0.333984 +v -2.384277 0.039062 -0.323242 +v -2.356934 0.091797 -0.324219 +v -0.576172 0.142578 -0.338867 +v -0.537109 0.086914 -0.349121 +v -0.520996 0.148438 -0.358398 +v -2.479004 0.148438 -0.358398 +v -2.462891 0.086914 -0.349121 +v -2.423828 0.142578 -0.338867 +v -0.515137 0.204590 -0.360840 +v -0.464844 0.147949 -0.383301 +v -0.463867 0.207031 -0.377930 +v -2.536133 0.207031 -0.377930 +v -2.535156 0.147949 -0.383301 +v -2.484863 0.204590 -0.360840 +v -0.452148 0.253906 -0.382812 +v -0.402832 0.201660 -0.398926 +v -0.394531 0.244629 -0.401367 +v -2.605469 0.244629 -0.401367 +v -2.597168 0.201660 -0.398926 +v -2.547852 0.253906 -0.382812 +v -0.436849 0.299479 -0.403809 +v -0.513184 0.259277 -0.361816 +v -2.486816 0.259277 -0.361816 +v -2.563151 0.299479 -0.403809 +v -0.574219 0.202637 -0.337402 +v -2.425781 0.202637 -0.337402 +v -0.634277 0.141602 -0.325195 +v -2.365723 0.141602 -0.325195 +v -0.585449 0.025391 -0.314941 +v -2.414551 0.025391 -0.314941 +v -0.477051 0.066895 -0.387695 +v -2.522949 0.066895 -0.387695 +v -0.374512 0.138672 -0.429688 +v -2.625488 0.138672 -0.429688 +v -0.328613 0.225586 -0.439941 +v -2.671387 0.225586 -0.439941 +v -0.365560 0.299967 -0.436035 +v -2.634440 0.299967 -0.436035 +v -0.460938 -0.080078 -0.395996 +v -0.707031 -0.119629 -0.258301 +v -0.583496 -0.042969 -0.390137 +v -2.416504 -0.042969 -0.390137 +v -2.292969 -0.119629 -0.258301 +v -2.539062 -0.080078 -0.395996 +v -0.227539 0.067871 -0.469238 +v -0.331055 0.041992 -0.495605 +v -2.668945 0.041992 -0.495605 +v -2.772461 0.067871 -0.469238 +v -0.163086 0.299316 -0.466309 +v -0.170573 0.201660 -0.506999 +v -2.829427 0.201660 -0.506999 +v -2.836914 0.299316 -0.466309 +v -0.270508 0.461914 -0.470703 +v -0.193034 0.359375 -0.511393 +v -2.806966 0.359375 -0.511393 +v -2.729492 0.461914 -0.470703 +v -0.467773 0.453125 -0.397949 +v -0.359375 0.399414 -0.496582 +v -2.640625 0.399414 -0.496582 +v -2.532227 0.453125 -0.397949 +v -0.616211 0.390137 -0.321289 +v -0.560059 0.349609 -0.410645 +v -2.439941 0.349609 -0.410645 +v -2.383789 0.390137 -0.321289 +v -0.463379 0.180664 -0.478027 +v -0.664551 0.134766 -0.381836 +v -2.335449 0.134766 -0.381836 +v -2.536621 0.180664 -0.478027 +v -0.242839 0.253906 -0.529460 +v -2.757162 0.253906 -0.529460 +v -0.691406 0.280762 -0.382324 +v -2.308594 0.280762 -0.382324 +v -0.776367 -0.025879 -0.353516 +v -2.223633 -0.025879 -0.353516 +v -1.007812 0.185547 0.720703 +v -1.992188 0.185547 0.720703 +v -0.941406 0.158203 0.625000 +v -2.058594 0.158203 0.625000 +v -1.062500 0.039062 0.650391 +v -1.937500 0.039062 0.650391 +v -1.089844 0.105469 0.738281 +v -1.910156 0.105469 0.738281 +v -1.205078 0.105469 0.759766 +v -1.794922 0.105469 0.759766 +v -1.234375 0.039062 0.681641 +v -1.765625 0.039062 0.681641 +v -1.355469 0.158203 0.697266 +v -1.644531 0.158203 0.697266 +v -1.285156 0.185547 0.769531 +v -1.714844 0.185547 0.769531 +v -1.285156 0.300781 0.769531 +v -1.714844 0.300781 0.769531 +v -1.355469 0.328125 0.697266 +v -1.644531 0.328125 0.697266 +v -1.234375 0.449219 0.681641 +v -1.765625 0.449219 0.681641 +v -1.205078 0.382812 0.759766 +v -1.794922 0.382812 0.759766 +v -1.089844 0.382812 0.738281 +v -1.910156 0.382812 0.738281 +v -1.062500 0.449219 0.650391 +v -1.937500 0.449219 0.650391 +v -0.941406 0.328125 0.625000 +v -2.058594 0.328125 0.625000 +v -1.007812 0.300781 0.720703 +v -1.992188 0.300781 0.720703 +v -1.042969 0.287109 0.769531 +v -1.957031 0.287109 0.769531 +v -1.103516 0.349609 0.783203 +v -1.896484 0.349609 0.783203 +v -1.189453 0.349609 0.800781 +v -1.810547 0.349609 0.800781 +v -1.248047 0.287109 0.808594 +v -1.751953 0.287109 0.808594 +v -1.248047 0.201172 0.808594 +v -1.751953 0.201172 0.808594 +v -1.189453 0.142578 0.800781 +v -1.810547 0.142578 0.800781 +v -1.103516 0.142578 0.783203 +v -1.896484 0.142578 0.783203 +v -1.042969 0.201172 0.769531 +v -1.957031 0.201172 0.769531 +v -1.075521 0.213542 0.794271 +v -1.924479 0.213542 0.794271 +v -1.117188 0.171875 0.804688 +v -1.882812 0.171875 0.804688 +v -1.177083 0.171875 0.817708 +v -1.822917 0.171875 0.817708 +v -1.218750 0.213542 0.822917 +v -1.781250 0.213542 0.822917 +v -1.218750 0.273438 0.822917 +v -1.781250 0.273438 0.822917 +v -1.177083 0.317708 0.817708 +v -1.822917 0.317708 0.817708 +v -1.117188 0.317708 0.804688 +v -1.882812 0.317708 0.804688 +v -1.075521 0.273438 0.794271 +v -1.924479 0.273438 0.794271 +v -1.414062 -0.957031 0.601562 +v -1.585938 -0.957031 0.601562 +v -1.273438 -0.939453 0.585938 +v -1.726562 -0.939453 0.585938 +v -1.201172 -0.892578 0.587891 +v -1.798828 -0.892578 0.587891 +v -1.191406 -0.777344 0.613281 +v -1.808594 -0.777344 0.613281 +v -1.218750 -0.570312 0.634766 +v -1.781250 -0.570312 0.634766 +v -1.208984 -0.119141 0.644531 +v -1.791016 -0.119141 0.644531 +v -0.978516 -0.042969 0.591797 +v -2.021484 -0.042969 0.591797 +v -0.798828 0.091797 0.552734 +v -2.201172 0.091797 0.552734 +v -0.710938 0.289062 0.574219 +v -2.289062 0.289062 0.574219 +v -0.750000 0.425781 0.650391 +v -2.250000 0.425781 0.650391 +v -0.917969 0.511719 0.708984 +v -2.082031 0.511719 0.708984 +v -1.109375 0.636719 0.763672 +v -1.890625 0.636719 0.763672 +v -1.251953 0.683594 0.794922 +v -1.748047 0.683594 0.794922 +v -1.369141 0.564453 0.800781 +v -1.630859 0.564453 0.800781 +v -1.458984 0.425781 0.789062 +v -1.541016 0.425781 0.789062 +v -1.320312 0.482422 0.806641 +v -1.679688 0.482422 0.806641 +v -1.226562 0.550781 0.796875 +v -1.773438 0.550781 0.796875 +v -1.123047 0.525391 0.773438 +v -1.876953 0.525391 0.773438 +v -0.960938 0.443359 0.726562 +v -2.039062 0.443359 0.726562 +v -0.832031 0.365234 0.673828 +v -2.167969 0.365234 0.673828 +v -0.816406 0.265625 0.638672 +v -2.183594 0.265625 0.638672 +v -0.884766 0.126953 0.636719 +v -2.115234 0.126953 0.636719 +v -1.029297 0.021484 0.667969 +v -1.970703 0.021484 0.667969 +v -1.224609 -0.009766 0.732422 +v -1.775391 -0.009766 0.732422 +v -1.376953 0.044922 0.757812 +v -1.623047 0.044922 0.757812 +v -1.402344 0.375000 0.800781 +v -1.597656 0.375000 0.800781 +v -1.435547 0.269531 0.777344 +v -1.564453 0.269531 0.777344 +v -1.425781 0.152344 0.750000 +v -1.574219 0.152344 0.750000 +v -1.443359 -0.912109 0.664062 +v -1.556641 -0.912109 0.664062 +v -1.355469 -0.890625 0.667969 +v -1.644531 -0.890625 0.667969 +v -1.318359 -0.822266 0.685547 +v -1.681641 -0.822266 0.685547 +v -1.335938 -0.570312 0.720703 +v -1.664062 -0.570312 0.720703 +v -1.314453 -0.732422 0.705078 +v -1.685547 -0.732422 0.705078 +v -1.458984 -0.376953 0.746094 +v -1.541016 -0.376953 0.746094 +v -1.451172 -0.564453 0.742188 +v -1.548828 -0.564453 0.742188 +v -1.443359 -0.712891 0.734375 +v -1.556641 -0.712891 0.734375 +v -1.390625 -0.253906 0.767578 +v -1.609375 -0.253906 0.767578 +v -1.382812 -0.183594 0.767578 +v -1.617188 -0.183594 0.767578 +v -1.437500 -0.136719 0.761719 +v -1.562500 -0.136719 0.761719 +v -1.490234 -0.162109 0.767578 +v -1.509766 -0.162109 0.767578 +v -1.455078 -0.302734 0.761719 +v -1.544922 -0.302734 0.761719 +v -1.457031 -0.283203 0.792969 +v -1.542969 -0.283203 0.792969 +v -1.478516 -0.166016 0.804688 +v -1.521484 -0.166016 0.804688 +v -1.427734 -0.140625 0.796875 +v -1.572266 -0.140625 0.796875 +v -1.388672 -0.185547 0.804688 +v -1.611328 -0.185547 0.804688 +v -1.396484 -0.244141 0.802734 +v -1.603516 -0.244141 0.802734 +v -1.437500 -0.183594 0.820312 +v -1.562500 -0.183594 0.820312 +v -1.453125 -0.242188 0.816406 +v -1.546875 -0.242188 0.816406 +v -1.443359 -0.085938 0.755859 +v -1.556641 -0.085938 0.755859 +v -1.371094 -0.179688 0.753906 +v -1.628906 -0.179688 0.753906 +v -1.361328 -0.267578 0.728516 +v -1.638672 -0.267578 0.728516 +v -1.361328 -0.373047 0.728516 +v -1.638672 -0.373047 0.728516 +v -1.259766 -0.376953 0.636719 +v -1.740234 -0.376953 0.636719 +v -1.291016 -0.279297 0.632812 +v -1.708984 -0.279297 0.632812 +v -1.318359 -0.195312 0.660156 +v -1.681641 -0.195312 0.660156 +v -1.449219 -0.750000 0.728516 +v -1.550781 -0.750000 0.728516 +v -1.396484 -0.779297 0.720703 +v -1.603516 -0.779297 0.720703 +v -1.419922 -0.851562 0.701172 +v -1.580078 -0.851562 0.701172 +v -1.472656 -0.878906 0.689453 +v -1.527344 -0.878906 0.689453 +v -1.476562 -0.863281 0.660156 +v -1.523438 -0.863281 0.660156 +v -1.429688 -0.837891 0.667969 +v -1.570312 -0.837891 0.667969 +v -1.406250 -0.781250 0.685547 +v -1.593750 -0.781250 0.685547 +v -1.453125 -0.761719 0.691406 +v -1.546875 -0.761719 0.691406 +v -1.464844 -0.810547 0.646484 +v -1.535156 -0.810547 0.646484 +v -1.421875 -0.804688 0.645833 +v -1.578125 -0.804688 0.645833 +v -1.335938 0.181641 0.765625 +v -1.664062 0.181641 0.765625 +v -1.347656 0.257812 0.771484 +v -1.652344 0.257812 0.771484 +v -1.330078 0.347656 0.775391 +v -1.669922 0.347656 0.775391 +v -1.304688 0.125000 0.761719 +v -1.695312 0.125000 0.761719 +v -1.205078 0.070312 0.742188 +v -1.794922 0.070312 0.742188 +v -1.070312 0.060547 0.708984 +v -1.929688 0.060547 0.708984 +v -0.957031 0.136719 0.679688 +v -2.042969 0.136719 0.679688 +v -0.892578 0.242188 0.666016 +v -2.107422 0.242188 0.666016 +v -0.902344 0.328125 0.673828 +v -2.097656 0.328125 0.673828 +v -0.996094 0.390625 0.712891 +v -2.003906 0.390625 0.712891 +v -1.121094 0.435547 0.748047 +v -1.878906 0.435547 0.748047 +v -1.203125 0.449219 0.757812 +v -1.796875 0.449219 0.757812 +v -1.275391 0.419922 0.771484 +v -1.724609 0.419922 0.771484 +v -1.250000 0.388672 0.769531 +v -1.750000 0.388672 0.769531 +v -1.193359 0.414062 0.761719 +v -1.806641 0.414062 0.761719 +v -1.123047 0.406250 0.757812 +v -1.876953 0.406250 0.757812 +v -1.017578 0.369141 0.724609 +v -1.982422 0.369141 0.724609 +v -0.941406 0.314453 0.683594 +v -2.058594 0.314453 0.683594 +v -0.933594 0.244141 0.677734 +v -2.066406 0.244141 0.677734 +v -0.984375 0.156250 0.693359 +v -2.015625 0.156250 0.693359 +v -1.078125 0.091797 0.722656 +v -1.921875 0.091797 0.722656 +v -1.195312 0.095703 0.751953 +v -1.804688 0.095703 0.751953 +v -1.285156 0.140625 0.765625 +v -1.714844 0.140625 0.765625 +v -1.294922 0.332031 0.769531 +v -1.705078 0.332031 0.769531 +v -1.314453 0.259766 0.767578 +v -1.685547 0.259766 0.767578 +v -1.310547 0.193359 0.763672 +v -1.689453 0.193359 0.763672 +v -1.457031 0.447266 0.675781 +v -1.542969 0.447266 0.675781 +v -1.369141 0.583984 0.683594 +v -1.630859 0.583984 0.683594 +v -1.248047 0.707031 0.675781 +v -1.751953 0.707031 0.675781 +v -1.091797 0.650391 0.642578 +v -1.908203 0.650391 0.642578 +v -0.908203 0.523438 0.589844 +v -2.091797 0.523438 0.589844 +v -0.738281 0.443359 0.542969 +v -2.261719 0.443359 0.542969 +v -0.685547 0.287109 0.468750 +v -2.314453 0.287109 0.468750 +v -0.791016 0.068359 0.443359 +v -2.208984 0.068359 0.443359 +v -0.972656 -0.068359 0.488281 +v -2.027344 -0.068359 0.488281 +v -1.423828 -0.501953 0.304688 +v -1.576172 -0.501953 0.304688 +v -1.433594 -0.667969 0.347656 +v -1.566406 -0.667969 0.347656 +v -1.423828 -0.871094 0.402344 +v -1.576172 -0.871094 0.402344 +v -1.414062 -0.968750 0.507812 +v -1.585938 -0.968750 0.507812 +v -1.250000 -0.943359 0.478516 +v -1.750000 -0.943359 0.478516 +v -1.171875 -0.865234 0.458984 +v -1.828125 -0.865234 0.458984 +v -1.185547 -0.699219 0.468750 +v -1.814453 -0.699219 0.468750 +v -1.298828 -0.626953 0.375000 +v -1.701172 -0.626953 0.375000 +v -1.269531 -0.832031 0.396484 +v -1.730469 -0.832031 0.396484 +v -1.302734 -0.451172 0.353516 +v -1.697266 -0.451172 0.353516 +v -1.212891 -0.496094 0.484375 +v -1.787109 -0.496094 0.484375 +v -1.269531 -0.267578 0.501953 +v -1.730469 -0.267578 0.501953 +v -1.244141 -0.345703 0.490234 +v -1.755859 -0.345703 0.490234 +v -1.287109 -0.208984 0.521484 +v -1.712891 -0.208984 0.521484 +v -1.179688 -0.148438 0.515625 +v -1.820312 -0.148438 0.515625 +v -1.330078 -0.054688 -0.675781 +v -1.669922 -0.054688 -0.675781 +v -1.339844 -0.259766 -0.457031 +v -1.660156 -0.259766 -0.457031 +v -1.373047 -0.386719 -0.066406 +v -1.626953 -0.386719 -0.066406 +v -1.402344 -0.437500 0.222656 +v -1.597656 -0.437500 0.222656 +v -1.289062 -0.359375 0.314453 +v -1.710938 -0.359375 0.314453 +v -0.759766 0.087891 0.228516 +v -2.240234 0.087891 0.228516 +v -1.300781 0.281250 -0.761719 +v -1.699219 0.281250 -0.761719 +v -1.273438 0.916016 0.093750 +v -1.726562 0.916016 0.093750 +v -1.273438 0.919922 -0.269531 +v -1.726562 0.919922 -0.269531 +v -1.271484 0.691406 -0.621094 +v -1.728516 0.691406 -0.621094 +v -0.791016 0.429688 0.392578 +v -2.208984 0.429688 0.392578 +v -0.800781 0.531250 0.199219 +v -2.199219 0.531250 0.199219 +v -0.781250 0.658203 -0.033203 +v -2.218750 0.658203 -0.033203 +v -0.781250 0.646484 -0.279297 +v -2.218750 0.646484 -0.279297 +v -0.792969 0.453125 -0.457031 +v -2.207031 0.453125 -0.457031 +v -0.957031 0.578125 -0.529297 +v -2.042969 0.578125 -0.529297 +v -0.953125 0.806641 -0.273438 +v -2.046875 0.806641 -0.273438 +v -0.953125 0.808594 0.005859 +v -2.046875 0.808594 0.005859 +v -0.953125 0.632812 0.250000 +v -2.046875 0.632812 0.250000 +v -0.935547 0.496094 0.439453 +v -2.064453 0.496094 0.439453 +v -1.271484 0.710938 0.380859 +v -1.728516 0.710938 0.380859 +v -1.218750 0.591797 0.593750 +v -1.781250 0.591797 0.593750 +v -1.236328 0.527344 0.541016 +v -1.763672 0.527344 0.541016 +v -1.463542 0.479167 0.593750 +v -1.536458 0.479167 0.593750 +v -0.712891 0.302734 0.306641 +v -2.287109 0.302734 0.306641 +v -0.691406 0.380859 0.117188 +v -2.308594 0.380859 0.117188 +v -0.681641 0.457031 -0.060547 +v -2.318359 0.457031 -0.060547 +v -0.703125 0.437500 -0.279297 +v -2.296875 0.437500 -0.279297 +v -1.164062 -0.267578 -0.041016 +v -1.835938 -0.267578 -0.041016 +v -0.958984 -0.134766 -0.039062 +v -2.041016 -0.134766 -0.039062 +v -0.955078 -0.078125 0.275391 +v -2.044922 -0.078125 0.275391 +v -1.181641 -0.193359 0.378906 +v -1.818359 -0.193359 0.378906 +v -1.221354 -0.281250 0.247396 +v -1.778646 -0.281250 0.247396 +v -1.216146 -0.164062 0.479167 +v -1.783854 -0.164062 0.479167 +v -0.871094 0.152344 -0.500000 +v -2.128906 0.152344 -0.500000 +v -1.025391 0.210938 -0.625000 +v -1.974609 0.210938 -0.625000 +v -0.962891 -0.076172 -0.337891 +v -2.037109 -0.076172 -0.337891 +v -1.111328 -0.158203 -0.390625 +v -1.888672 -0.158203 -0.390625 +v -1.111979 -0.023438 -0.583333 +v -1.888021 -0.023438 -0.583333 +v -0.537109 0.414062 -0.263672 +v -2.462891 0.414062 -0.263672 +v -0.384766 0.458984 -0.353516 +v -2.615234 0.458984 -0.353516 +v -0.240234 0.388672 -0.410156 +v -2.759766 0.388672 -0.410156 +v -0.222656 0.185547 -0.416016 +v -2.777344 0.185547 -0.416016 +v -0.359375 -0.001953 -0.367188 +v -2.640625 -0.001953 -0.367188 +v -0.582031 -0.087891 -0.222656 +v -2.417969 -0.087891 -0.222656 +v -0.554688 -0.033203 -0.253906 +v -2.445312 -0.033203 -0.253906 +v -0.382812 0.033203 -0.380859 +v -2.617188 0.033203 -0.380859 +v -0.275391 0.177734 -0.425781 +v -2.724609 0.177734 -0.425781 +v -0.285156 0.333984 -0.419922 +v -2.714844 0.333984 -0.419922 +v -0.400391 0.388672 -0.369141 +v -2.599609 0.388672 -0.369141 +v -0.523438 0.355469 -0.289062 +v -2.476562 0.355469 -0.289062 +v -0.806641 -0.048828 -0.083984 +v -2.193359 -0.048828 -0.083984 +v -0.771484 -0.089844 -0.148438 +v -2.228516 -0.089844 -0.148438 +v -0.707031 0.126953 0.001953 +v -2.292969 0.126953 0.001953 +v -0.630859 0.345703 -0.216797 +v -2.369141 0.345703 -0.216797 +v -0.689453 -0.033203 -0.197266 +v -2.310547 -0.033203 -0.197266 +v -0.726562 0.003906 -0.226562 +v -2.273438 0.003906 -0.226562 +v -0.714844 0.058594 -0.251953 +v -2.285156 0.058594 -0.251953 +v -0.722656 0.126953 -0.236328 +v -2.277344 0.126953 -0.236328 +v -0.658203 0.226562 -0.240234 +v -2.341797 0.226562 -0.240234 +v -0.599609 0.298828 -0.246094 +v -2.400391 0.298828 -0.246094 +v -0.669922 0.285156 -0.167969 +v -2.330078 0.285156 -0.167969 +v -0.724609 0.140625 -0.128906 +v -2.275391 0.140625 -0.128906 +v -0.778646 0.005208 -0.143229 +v -2.221354 0.005208 -0.143229 +v -0.580078 0.267578 -0.304688 +v -2.419922 0.267578 -0.304688 +v -0.634766 0.205078 -0.294922 +v -2.365234 0.205078 -0.294922 +v -0.699219 0.132812 -0.296875 +v -2.300781 0.132812 -0.296875 +v -0.707031 0.087891 -0.296875 +v -2.292969 0.087891 -0.296875 +v -0.664062 0.048828 -0.296875 +v -2.335938 0.048828 -0.296875 +v -0.669922 0.000000 -0.296875 +v -2.330078 0.000000 -0.296875 +v -0.652344 -0.017578 -0.267578 +v -2.347656 -0.017578 -0.267578 +v -0.509766 0.316406 -0.351562 +v -2.490234 0.316406 -0.351562 +v -0.394531 0.343750 -0.423828 +v -2.605469 0.343750 -0.423828 +v -0.287109 0.298828 -0.464844 +v -2.712891 0.298828 -0.464844 +v -0.277344 0.167969 -0.466797 +v -2.722656 0.167969 -0.466797 +v -0.378906 0.044922 -0.429688 +v -2.621094 0.044922 -0.429688 +v -0.537109 -0.009766 -0.316406 +v -2.462891 -0.009766 -0.316406 +v -0.623047 0.066406 -0.326172 +v -2.376953 0.066406 -0.326172 +v -0.552734 0.117188 -0.345703 +v -2.447266 0.117188 -0.345703 +v -0.492188 0.179688 -0.369141 +v -2.507812 0.179688 -0.369141 +v -0.433594 0.226562 -0.384766 +v -2.566406 0.226562 -0.384766 +v -0.476562 0.281250 -0.380859 +v -2.523438 0.281250 -0.380859 +v -0.544922 0.232422 -0.347656 +v -2.455078 0.232422 -0.347656 +v -0.603516 0.171875 -0.330078 +v -2.396484 0.171875 -0.330078 +v -0.667969 0.113281 -0.322266 +v -2.332031 0.113281 -0.322266 +v -0.628906 0.011719 -0.310547 +v -2.371094 0.011719 -0.310547 +v -0.533203 0.042969 -0.347656 +v -2.466797 0.042969 -0.347656 +v -0.421875 0.099609 -0.414062 +v -2.578125 0.099609 -0.414062 +v -0.341797 0.181641 -0.437500 +v -2.658203 0.181641 -0.437500 +v -0.339844 0.267578 -0.439453 +v -2.660156 0.267578 -0.439453 +v -0.395833 0.315104 -0.429688 +v -2.604167 0.315104 -0.429688 +v -0.589844 -0.113281 -0.318359 +v -2.410156 -0.113281 -0.318359 +v -0.332031 -0.019531 -0.445312 +v -2.667969 -0.019531 -0.445312 +v -0.171875 0.181641 -0.470703 +v -2.828125 0.181641 -0.470703 +v -0.199219 0.398438 -0.472656 +v -2.800781 0.398438 -0.472656 +v -0.367188 0.472656 -0.441406 +v -2.632812 0.472656 -0.441406 +v -0.550781 0.425781 -0.353516 +v -2.449219 0.425781 -0.353516 +v -0.572266 0.152344 -0.421875 +v -2.427734 0.152344 -0.421875 +v -0.343750 0.218750 -0.513672 +v -2.656250 0.218750 -0.513672 +v -0.190104 0.273438 -0.526042 +v -2.809896 0.273438 -0.526042 +v -0.664062 0.345703 -0.314453 +v -2.335938 0.345703 -0.314453 +v -0.734375 0.128906 -0.394531 +v -2.265625 0.128906 -0.394531 +v -0.800781 -0.099609 -0.261719 +v -2.199219 -0.099609 -0.261719 +vt 0.891692 0.588839 +vt 0.880961 0.586564 +vt 0.881557 0.574808 +vt 0.896488 0.577834 +vt 0.870121 0.588631 +vt 0.866440 0.577724 +vt 0.862025 0.562834 +vt 0.882667 0.558933 +vt 0.903005 0.563061 +vt 0.858288 0.847917 +vt 0.863360 0.833238 +vt 0.878333 0.836822 +vt 0.878737 0.852730 +vt 0.867521 0.822505 +vt 0.878258 0.825051 +vt 0.889080 0.823254 +vt 0.893383 0.834461 +vt 0.899238 0.849510 +vt 0.884459 0.541407 +vt 0.910227 0.547014 +vt 0.858169 0.545895 +vt 0.854594 0.527932 +vt 0.886592 0.523054 +vt 0.917801 0.530331 +vt 0.849316 0.882455 +vt 0.853685 0.864668 +vt 0.879749 0.870319 +vt 0.881065 0.888748 +vt 0.905740 0.865861 +vt 0.912566 0.882863 +vt 0.844401 0.574426 +vt 0.835120 0.560496 +vt 0.832125 0.591507 +vt 0.818536 0.582644 +vt 0.804365 0.573027 +vt 0.825750 0.545548 +vt 0.801138 0.835175 +vt 0.815721 0.826196 +vt 0.831306 0.849059 +vt 0.821281 0.863575 +vt 0.829690 0.817945 +vt 0.841196 0.835554 +vt 0.860653 0.594966 +vt 0.853501 0.586322 +vt 0.854032 0.604170 +vt 0.844549 0.598858 +vt 0.842429 0.811153 +vt 0.850816 0.824074 +vt 0.852138 0.806266 +vt 0.858344 0.815756 +vt 0.851729 0.614846 +vt 0.841395 0.613584 +vt 0.853473 0.625708 +vt 0.843729 0.628701 +vt 0.830502 0.632828 +vt 0.827527 0.611871 +vt 0.829903 0.776592 +vt 0.842933 0.781303 +vt 0.839931 0.796301 +vt 0.826001 0.797397 +vt 0.852535 0.784725 +vt 0.850311 0.795499 +vt 0.811643 0.609776 +vt 0.815003 0.637757 +vt 0.798368 0.643086 +vt 0.794749 0.607489 +vt 0.798256 0.764919 +vt 0.814639 0.770981 +vt 0.810039 0.798785 +vt 0.793061 0.800320 +vt 0.840944 0.651686 +vt 0.829182 0.662454 +vt 0.857367 0.664845 +vt 0.851481 0.679473 +vt 0.845508 0.695011 +vt 0.816688 0.673967 +vt 0.847654 0.715138 +vt 0.852931 0.730925 +vt 0.829899 0.746938 +vt 0.817928 0.734882 +vt 0.858163 0.745800 +vt 0.841172 0.758218 +vt 0.858989 0.635473 +vt 0.851242 0.642408 +vt 0.867665 0.642345 +vt 0.863079 0.652037 +vt 0.863300 0.758849 +vt 0.851048 0.767943 +vt 0.867452 0.768735 +vt 0.858480 0.775215 +vt 0.878887 0.644529 +vt 0.878385 0.654923 +vt 0.890382 0.642464 +vt 0.894097 0.651799 +vt 0.899630 0.664227 +vt 0.878286 0.668708 +vt 0.900356 0.748294 +vt 0.894278 0.760463 +vt 0.878719 0.756645 +vt 0.879233 0.742869 +vt 0.890152 0.769624 +vt 0.878760 0.767051 +vt 0.879203 0.684420 +vt 0.907091 0.678322 +vt 0.915517 0.693251 +vt 0.880628 0.701094 +vt 0.917516 0.720003 +vt 0.908436 0.734543 +vt 0.880846 0.727214 +vt 0.883009 0.710619 +vt 0.917327 0.652351 +vt 0.929888 0.662207 +vt 0.929409 0.635102 +vt 0.945192 0.639156 +vt 0.962205 0.643188 +vt 0.943645 0.672515 +vt 0.961937 0.772088 +vt 0.944761 0.775361 +vt 0.930496 0.751654 +vt 0.944697 0.741966 +vt 0.928814 0.778711 +vt 0.917509 0.760943 +vt 0.899876 0.636590 +vt 0.907155 0.643402 +vt 0.906348 0.627709 +vt 0.916089 0.631003 +vt 0.915325 0.782214 +vt 0.906950 0.769432 +vt 0.905448 0.785074 +vt 0.899376 0.775914 +vt 0.908777 0.616619 +vt 0.919430 0.615878 +vt 0.906995 0.605249 +vt 0.917062 0.600430 +vt 0.930714 0.593624 +vt 0.933908 0.614500 +vt 0.928276 0.820207 +vt 0.914940 0.812801 +vt 0.917991 0.797473 +vt 0.932394 0.799492 +vt 0.905097 0.807540 +vt 0.907382 0.796260 +vt 0.950598 0.612253 +vt 0.946105 0.585451 +vt 0.962364 0.576594 +vt 0.968392 0.609573 +vt 0.959139 0.838624 +vt 0.943289 0.829055 +vt 0.948967 0.802477 +vt 0.966626 0.805946 +vt 0.919717 0.575551 +vt 0.931712 0.562700 +vt 0.944279 0.549179 +vt 0.927900 0.851144 +vt 0.939855 0.865209 +vt 0.916488 0.837774 +vt 0.900835 0.595528 +vt 0.908869 0.587062 +vt 0.906161 0.825792 +vt 0.898511 0.816977 +vt 0.897284 0.599247 +vt 0.889634 0.593581 +vt 0.902360 0.607463 +vt 0.898689 0.609003 +vt 0.894921 0.601583 +vt 0.888110 0.597049 +vt 0.896965 0.803421 +vt 0.900564 0.805122 +vt 0.895129 0.813105 +vt 0.892872 0.810667 +vt 0.887235 0.818426 +vt 0.885867 0.814894 +vt 0.903563 0.616952 +vt 0.901305 0.626065 +vt 0.897259 0.624521 +vt 0.899888 0.617003 +vt 0.896226 0.787855 +vt 0.900336 0.786492 +vt 0.902188 0.795696 +vt 0.898518 0.795483 +vt 0.895995 0.633149 +vt 0.888373 0.637644 +vt 0.886679 0.633759 +vt 0.893156 0.630591 +vt 0.886066 0.778156 +vt 0.887931 0.774350 +vt 0.895346 0.779179 +vt 0.892396 0.781608 +vt 0.879183 0.638993 +vt 0.870175 0.637066 +vt 0.872102 0.632914 +vt 0.879329 0.635048 +vt 0.871465 0.778354 +vt 0.869725 0.774120 +vt 0.878810 0.772595 +vt 0.878780 0.776542 +vt 0.863101 0.631734 +vt 0.858526 0.624180 +vt 0.862476 0.622856 +vt 0.865988 0.629039 +vt 0.861403 0.787974 +vt 0.857515 0.786476 +vt 0.862421 0.779132 +vt 0.865186 0.781954 +vt 0.857013 0.615585 +vt 0.858792 0.606916 +vt 0.862520 0.608863 +vt 0.860718 0.615982 +vt 0.860826 0.801955 +vt 0.857015 0.803735 +vt 0.855623 0.794995 +vt 0.859342 0.794764 +vt 0.864088 0.599137 +vt 0.871771 0.593621 +vt 0.872990 0.597353 +vt 0.866415 0.601876 +vt 0.870775 0.813919 +vt 0.869391 0.817593 +vt 0.861961 0.811741 +vt 0.864406 0.809109 +vt 0.880708 0.591737 +vt 0.880545 0.595056 +vt 0.878235 0.819872 +vt 0.878220 0.816549 +vt 0.879569 0.616335 +vt 0.875381 0.604486 +vt 0.880218 0.601249 +vt 0.884915 0.604234 +vt 0.878169 0.810347 +vt 0.882993 0.807574 +vt 0.873480 0.806899 +vt 0.878190 0.795247 +vt 0.870243 0.606220 +vt 0.868906 0.611783 +vt 0.868423 0.804939 +vt 0.867334 0.799322 +vt 0.868915 0.620475 +vt 0.866315 0.616213 +vt 0.864943 0.794781 +vt 0.867730 0.790638 +vt 0.874939 0.626604 +vt 0.870063 0.625233 +vt 0.869088 0.785936 +vt 0.874020 0.784783 +vt 0.883908 0.627225 +vt 0.879383 0.629428 +vt 0.878585 0.782159 +vt 0.883008 0.784561 +vt 0.890509 0.621523 +vt 0.889008 0.626432 +vt 0.888067 0.785579 +vt 0.889349 0.790550 +vt 0.891514 0.611803 +vt 0.893847 0.616893 +vt 0.892478 0.795324 +vt 0.889922 0.800305 +vt 0.890450 0.605899 +vt 0.888597 0.806156 +vt 0.539314 0.053345 +vt 0.537040 0.057979 +vt 0.528630 0.056463 +vt 0.529796 0.050810 +vt 0.534325 0.061941 +vt 0.527228 0.060718 +vt 0.518927 0.060123 +vt 0.518925 0.055721 +vt 0.518925 0.049546 +vt 0.510632 0.060704 +vt 0.509230 0.056447 +vt 0.503543 0.061915 +vt 0.500834 0.057948 +vt 0.498567 0.053309 +vt 0.508066 0.050791 +vt 0.550838 0.058385 +vt 0.546647 0.061563 +vt 0.542849 0.059576 +vt 0.546114 0.055913 +vt 0.541991 0.065324 +vt 0.539009 0.063244 +vt 0.498862 0.063209 +vt 0.495029 0.059533 +vt 0.495878 0.065284 +vt 0.491230 0.061512 +vt 0.487046 0.058322 +vt 0.491773 0.055863 +vt 0.557459 0.064110 +vt 0.550940 0.068207 +vt 0.549020 0.064249 +vt 0.554132 0.060628 +vt 0.545459 0.073526 +vt 0.543983 0.068878 +vt 0.493881 0.068835 +vt 0.488852 0.064193 +vt 0.492398 0.073483 +vt 0.486924 0.068151 +vt 0.480407 0.064032 +vt 0.483748 0.060557 +vt 0.568627 0.080034 +vt 0.557062 0.083355 +vt 0.553377 0.074012 +vt 0.562286 0.070296 +vt 0.548931 0.087707 +vt 0.546894 0.078888 +vt 0.490953 0.078848 +vt 0.484473 0.073956 +vt 0.488904 0.087676 +vt 0.480762 0.083308 +vt 0.469163 0.079950 +vt 0.475552 0.070210 +vt 0.584301 0.109492 +vt 0.568768 0.114105 +vt 0.562725 0.097931 +vt 0.576499 0.094172 +vt 0.555797 0.119762 +vt 0.552211 0.102723 +vt 0.485603 0.102716 +vt 0.475056 0.097908 +vt 0.482003 0.119791 +vt 0.468969 0.114124 +vt 0.453338 0.109484 +vt 0.461217 0.094114 +vt 0.606157 0.171638 +vt 0.623405 0.186359 +vt 0.606884 0.200763 +vt 0.586464 0.187024 +vt 0.644385 0.202482 +vt 0.632076 0.214445 +vt 0.621002 0.227303 +vt 0.592977 0.218210 +vt 0.558793 0.209623 +vt 0.416962 0.228987 +vt 0.405473 0.216015 +vt 0.430888 0.201769 +vt 0.445231 0.219311 +vt 0.392747 0.203928 +vt 0.413973 0.187311 +vt 0.431395 0.172229 +vt 0.451442 0.187610 +vt 0.479659 0.210128 +vt 0.661887 0.218192 +vt 0.652512 0.228696 +vt 0.678158 0.233870 +vt 0.669687 0.243281 +vt 0.660913 0.251049 +vt 0.643415 0.238482 +vt 0.376630 0.254079 +vt 0.367417 0.246239 +vt 0.384811 0.230909 +vt 0.394310 0.240811 +vt 0.358459 0.236653 +vt 0.375004 0.220227 +vt 0.695442 0.249895 +vt 0.685098 0.257963 +vt 0.708176 0.267594 +vt 0.695713 0.273774 +vt 0.682849 0.278473 +vt 0.674192 0.264305 +vt 0.354754 0.283002 +vt 0.341241 0.278500 +vt 0.351801 0.261791 +vt 0.363279 0.268087 +vt 0.328067 0.272424 +vt 0.340831 0.253653 +vt 0.710799 0.288295 +vt 0.698505 0.291745 +vt 0.707738 0.307724 +vt 0.696383 0.308222 +vt 0.686069 0.307434 +vt 0.686480 0.293780 +vt 0.352515 0.313128 +vt 0.341893 0.314378 +vt 0.339014 0.297300 +vt 0.351555 0.298991 +vt 0.330125 0.314386 +vt 0.326116 0.294166 +vt 0.703422 0.321607 +vt 0.692260 0.319551 +vt 0.695343 0.334923 +vt 0.683891 0.330694 +vt 0.674331 0.325948 +vt 0.682599 0.316647 +vt 0.365353 0.331659 +vt 0.355756 0.336965 +vt 0.346649 0.325920 +vt 0.356469 0.322489 +vt 0.344203 0.341867 +vt 0.335240 0.328591 +vt 0.680993 0.352654 +vt 0.669034 0.346615 +vt 0.663496 0.370552 +vt 0.651914 0.362916 +vt 0.643166 0.354229 +vt 0.659524 0.339869 +vt 0.398430 0.359143 +vt 0.389912 0.368382 +vt 0.371689 0.352552 +vt 0.381103 0.345227 +vt 0.378483 0.376706 +vt 0.359757 0.359299 +vt 0.645975 0.384372 +vt 0.636756 0.375199 +vt 0.629889 0.393629 +vt 0.623653 0.383198 +vt 0.619606 0.371731 +vt 0.630242 0.364845 +vt 0.423128 0.375860 +vt 0.419544 0.387656 +vt 0.405892 0.380159 +vt 0.412042 0.369355 +vt 0.413721 0.398510 +vt 0.396965 0.389904 +vt 0.616695 0.397839 +vt 0.612698 0.386651 +vt 0.601508 0.398118 +vt 0.599483 0.385777 +vt 0.598403 0.373750 +vt 0.610113 0.374904 +vt 0.444643 0.376983 +vt 0.444079 0.389172 +vt 0.430786 0.390645 +vt 0.432874 0.378651 +vt 0.442602 0.401710 +vt 0.427272 0.402137 +vt 0.579440 0.395584 +vt 0.579601 0.380796 +vt 0.556312 0.392010 +vt 0.557829 0.374417 +vt 0.561672 0.359562 +vt 0.581121 0.367656 +vt 0.481024 0.361159 +vt 0.485493 0.375925 +vt 0.463880 0.383280 +vt 0.461797 0.370110 +vt 0.487774 0.393516 +vt 0.464695 0.398151 +vt 0.537944 0.389169 +vt 0.538944 0.369350 +vt 0.521980 0.388104 +vt 0.521543 0.367321 +vt 0.521061 0.342410 +vt 0.543462 0.352409 +vt 0.504220 0.370059 +vt 0.499012 0.353258 +vt 0.506063 0.389860 +vt 0.576492 0.338892 +vt 0.588070 0.344127 +vt 0.584401 0.354960 +vt 0.568874 0.347883 +vt 0.599057 0.346360 +vt 0.598421 0.359397 +vt 0.444019 0.362487 +vt 0.457972 0.357441 +vt 0.442838 0.349341 +vt 0.453843 0.346655 +vt 0.465321 0.340933 +vt 0.473324 0.349694 +vt 0.607932 0.346220 +vt 0.608629 0.359957 +vt 0.616122 0.343912 +vt 0.617334 0.357203 +vt 0.424802 0.361046 +vt 0.433732 0.363472 +vt 0.425468 0.347532 +vt 0.433859 0.349548 +vt 0.635618 0.333132 +vt 0.638389 0.343234 +vt 0.626846 0.351699 +vt 0.625058 0.339638 +vt 0.414922 0.355865 +vt 0.402821 0.347745 +vt 0.405220 0.337354 +vt 0.416228 0.343550 +vt 0.660206 0.314651 +vt 0.666553 0.319974 +vt 0.653188 0.331596 +vt 0.648683 0.324125 +vt 0.387230 0.336504 +vt 0.373083 0.325196 +vt 0.379378 0.319477 +vt 0.391528 0.328696 +vt 0.667992 0.298745 +vt 0.676436 0.303224 +vt 0.673796 0.311559 +vt 0.666139 0.306742 +vt 0.365319 0.316873 +vt 0.362283 0.308393 +vt 0.370802 0.303443 +vt 0.372998 0.311601 +vt 0.662811 0.278039 +vt 0.671750 0.278936 +vt 0.675991 0.291841 +vt 0.667274 0.289008 +vt 0.362322 0.296617 +vt 0.366247 0.283149 +vt 0.375432 0.281942 +vt 0.371202 0.293380 +vt 0.641178 0.255826 +vt 0.650468 0.254124 +vt 0.663002 0.266035 +vt 0.653428 0.266347 +vt 0.374870 0.269594 +vt 0.387430 0.257018 +vt 0.397003 0.258546 +vt 0.384728 0.269661 +vt 0.612614 0.245298 +vt 0.615193 0.237332 +vt 0.634875 0.244188 +vt 0.628116 0.248367 +vt 0.403166 0.246488 +vt 0.423081 0.239096 +vt 0.425893 0.247131 +vt 0.410175 0.250607 +vt 0.575330 0.254115 +vt 0.567220 0.237521 +vt 0.590391 0.234661 +vt 0.593043 0.247945 +vt 0.448181 0.235931 +vt 0.471694 0.238405 +vt 0.463886 0.255283 +vt 0.445806 0.249401 +vt 0.565405 0.261613 +vt 0.552431 0.247258 +vt 0.560180 0.270496 +vt 0.544078 0.261210 +vt 0.519748 0.247463 +vt 0.539890 0.229722 +vt 0.495583 0.261777 +vt 0.486848 0.247926 +vt 0.499170 0.230035 +vt 0.479598 0.271478 +vt 0.474105 0.262644 +vt 0.554142 0.339407 +vt 0.565846 0.330030 +vt 0.543239 0.327870 +vt 0.557974 0.318586 +vt 0.487805 0.340609 +vt 0.498341 0.328625 +vt 0.475717 0.331615 +vt 0.483239 0.319819 +vt 0.539203 0.311610 +vt 0.554719 0.305611 +vt 0.520605 0.315606 +vt 0.520283 0.294503 +vt 0.539155 0.293575 +vt 0.554708 0.292543 +vt 0.501854 0.312181 +vt 0.501351 0.294108 +vt 0.486090 0.306659 +vt 0.485701 0.293519 +vt 0.540216 0.276712 +vt 0.520023 0.274395 +vt 0.556571 0.280822 +vt 0.483500 0.281781 +vt 0.499839 0.277239 +vt 0.526391 0.068708 +vt 0.522781 0.067683 +vt 0.524939 0.064655 +vt 0.530205 0.065733 +vt 0.518928 0.067374 +vt 0.518928 0.064220 +vt 0.512920 0.064645 +vt 0.515077 0.067676 +vt 0.511468 0.068696 +vt 0.507658 0.065715 +vt 0.531713 0.073805 +vt 0.529517 0.070555 +vt 0.533980 0.067239 +vt 0.536458 0.069915 +vt 0.503884 0.067214 +vt 0.508342 0.070538 +vt 0.506144 0.073786 +vt 0.501405 0.069887 +vt 0.531225 0.085306 +vt 0.532534 0.079044 +vt 0.537832 0.074505 +vt 0.538680 0.079646 +vt 0.500025 0.074475 +vt 0.505319 0.079025 +vt 0.506623 0.085290 +vt 0.499172 0.079617 +vt 0.544035 0.123768 +vt 0.542166 0.106319 +vt 0.533926 0.126157 +vt 0.533130 0.108797 +vt 0.532778 0.094453 +vt 0.540687 0.091527 +vt 0.505070 0.094443 +vt 0.504724 0.108798 +vt 0.495672 0.106319 +vt 0.497156 0.091509 +vt 0.503945 0.126173 +vt 0.493809 0.123794 +vt 0.539578 0.083978 +vt 0.532163 0.087925 +vt 0.498269 0.083952 +vt 0.505684 0.087910 +vt 0.538348 0.156626 +vt 0.527985 0.152668 +vt 0.527019 0.141551 +vt 0.535871 0.141734 +vt 0.518978 0.151208 +vt 0.518960 0.140806 +vt 0.518943 0.126975 +vt 0.525912 0.126964 +vt 0.510900 0.141567 +vt 0.511972 0.126972 +vt 0.509972 0.152692 +vt 0.499609 0.156683 +vt 0.502034 0.141769 +vt 0.525644 0.110236 +vt 0.525656 0.096120 +vt 0.518932 0.110696 +vt 0.518927 0.096637 +vt 0.512218 0.110236 +vt 0.512196 0.096115 +vt 0.518926 0.086472 +vt 0.524945 0.086835 +vt 0.525385 0.089371 +vt 0.518925 0.089467 +vt 0.512464 0.089364 +vt 0.512904 0.086828 +vt 0.547150 0.173975 +vt 0.542049 0.175206 +vt 0.539912 0.168679 +vt 0.544567 0.165720 +vt 0.538113 0.176101 +vt 0.536881 0.171060 +vt 0.533511 0.166606 +vt 0.535266 0.163215 +vt 0.504503 0.166651 +vt 0.501153 0.171120 +vt 0.498108 0.168754 +vt 0.502729 0.163266 +vt 0.499949 0.176162 +vt 0.496015 0.175290 +vt 0.490904 0.174097 +vt 0.493427 0.165818 +vt 0.542087 0.193360 +vt 0.539006 0.189238 +vt 0.541963 0.182617 +vt 0.546610 0.183905 +vt 0.536530 0.186910 +vt 0.538179 0.181821 +vt 0.499923 0.181859 +vt 0.496167 0.182681 +vt 0.501611 0.186905 +vt 0.499260 0.189262 +vt 0.496310 0.193451 +vt 0.491548 0.184024 +vt 0.519585 0.200761 +vt 0.525614 0.194544 +vt 0.532532 0.193393 +vt 0.532726 0.200192 +vt 0.527756 0.190822 +vt 0.532619 0.190057 +vt 0.505552 0.189995 +vt 0.505986 0.193367 +vt 0.510391 0.190728 +vt 0.512872 0.194488 +vt 0.506139 0.200234 +vt 0.519186 0.192623 +vt 0.518619 0.190064 +vt 0.521327 0.192154 +vt 0.518797 0.193930 +vt 0.518974 0.187013 +vt 0.523255 0.188764 +vt 0.514776 0.188701 +vt 0.516442 0.192115 +vt 0.527826 0.158992 +vt 0.518991 0.157196 +vt 0.527032 0.162649 +vt 0.519000 0.160800 +vt 0.510157 0.159017 +vt 0.510971 0.162672 +vt 0.526090 0.165766 +vt 0.519009 0.164045 +vt 0.531718 0.169248 +vt 0.529697 0.170661 +vt 0.525478 0.169088 +vt 0.519023 0.167804 +vt 0.508343 0.170695 +vt 0.506311 0.169287 +vt 0.511931 0.165788 +vt 0.512566 0.169108 +vt 0.519086 0.184064 +vt 0.523803 0.185735 +vt 0.519080 0.179599 +vt 0.524925 0.183297 +vt 0.527818 0.185477 +vt 0.528180 0.187827 +vt 0.510239 0.185427 +vt 0.513176 0.183269 +vt 0.514309 0.185681 +vt 0.509857 0.187746 +vt 0.531939 0.187473 +vt 0.530566 0.184922 +vt 0.532840 0.183728 +vt 0.534565 0.185097 +vt 0.505231 0.183720 +vt 0.507488 0.184890 +vt 0.506111 0.187416 +vt 0.503521 0.185086 +vt 0.535546 0.181124 +vt 0.532774 0.180940 +vt 0.532096 0.177133 +vt 0.535348 0.176654 +vt 0.505971 0.177171 +vt 0.505299 0.180956 +vt 0.502535 0.181150 +vt 0.502711 0.176703 +vt 0.534438 0.172786 +vt 0.531173 0.173628 +vt 0.506881 0.173668 +vt 0.503603 0.172837 +vt 0.526699 0.177809 +vt 0.528574 0.181682 +vt 0.509509 0.181678 +vt 0.511405 0.177826 +vt 0.519049 0.172948 +vt 0.525674 0.173357 +vt 0.512407 0.173378 +vt 0.534250 0.213168 +vt 0.519646 0.219043 +vt 0.545871 0.200552 +vt 0.492604 0.200768 +vt 0.504734 0.213297 +vt 0.551833 0.186076 +vt 0.553412 0.172419 +vt 0.563647 0.168321 +vt 0.561716 0.184013 +vt 0.474292 0.168551 +vt 0.484615 0.172594 +vt 0.486345 0.186292 +vt 0.476391 0.184328 +vt 0.551880 0.162260 +vt 0.548945 0.152313 +vt 0.561164 0.147206 +vt 0.563129 0.157240 +vt 0.476663 0.147328 +vt 0.488961 0.152405 +vt 0.486067 0.162392 +vt 0.474729 0.157411 +vt 0.546313 0.139291 +vt 0.558750 0.134651 +vt 0.491557 0.139347 +vt 0.479056 0.134725 +vt 0.590430 0.122775 +vt 0.573592 0.128247 +vt 0.594811 0.133874 +vt 0.577198 0.140149 +vt 0.460500 0.140293 +vt 0.464117 0.128325 +vt 0.442725 0.134028 +vt 0.447147 0.122844 +vt 0.597367 0.142638 +vt 0.579588 0.149602 +vt 0.598809 0.150811 +vt 0.580668 0.159466 +vt 0.457083 0.159742 +vt 0.458117 0.149807 +vt 0.438729 0.151122 +vt 0.440157 0.142869 +vt 0.580343 0.172599 +vt 0.599848 0.160133 +vt 0.457516 0.172972 +vt 0.437728 0.160537 +vt 0.524451 0.085358 +vt 0.528614 0.084539 +vt 0.518925 0.084939 +vt 0.518925 0.083754 +vt 0.523789 0.084048 +vt 0.527444 0.083330 +vt 0.513399 0.085351 +vt 0.514061 0.084042 +vt 0.509234 0.084527 +vt 0.510406 0.083320 +vt 0.530055 0.080412 +vt 0.529424 0.075463 +vt 0.528681 0.080010 +vt 0.528076 0.075978 +vt 0.507797 0.080397 +vt 0.509171 0.079997 +vt 0.508431 0.075448 +vt 0.509779 0.075966 +vt 0.527375 0.072183 +vt 0.524595 0.070217 +vt 0.526202 0.073130 +vt 0.523725 0.071312 +vt 0.510482 0.072171 +vt 0.511655 0.073120 +vt 0.513262 0.070208 +vt 0.514132 0.071305 +vt 0.521773 0.069210 +vt 0.518929 0.068946 +vt 0.521311 0.070372 +vt 0.518929 0.070120 +vt 0.516084 0.069206 +vt 0.516546 0.070368 +vt 0.520792 0.072301 +vt 0.518928 0.072082 +vt 0.522687 0.073045 +vt 0.522119 0.075131 +vt 0.520571 0.074660 +vt 0.518928 0.074477 +vt 0.515737 0.075127 +vt 0.515170 0.073039 +vt 0.517065 0.072298 +vt 0.517285 0.074658 +vt 0.524646 0.074400 +vt 0.526155 0.076440 +vt 0.524746 0.076798 +vt 0.523477 0.075811 +vt 0.513109 0.076790 +vt 0.511700 0.076430 +vt 0.513211 0.074391 +vt 0.514379 0.075804 +vt 0.526702 0.079241 +vt 0.525770 0.081523 +vt 0.524030 0.079411 +vt 0.524751 0.078250 +vt 0.513823 0.079405 +vt 0.512081 0.081515 +vt 0.511151 0.079231 +vt 0.513103 0.078243 +vt 0.522846 0.082010 +vt 0.518925 0.081803 +vt 0.518926 0.079423 +vt 0.521844 0.079585 +vt 0.515005 0.082005 +vt 0.516008 0.079581 +vt 0.518927 0.076953 +vt 0.521004 0.077111 +vt 0.522658 0.077287 +vt 0.516851 0.077109 +vt 0.515197 0.077283 +vt 0.523466 0.077182 +vt 0.514389 0.077176 +vt 0.565241 0.283355 +vt 0.563684 0.292624 +vt 0.568319 0.275320 +vt 0.572243 0.277777 +vt 0.569831 0.285006 +vt 0.569010 0.293225 +vt 0.467623 0.279114 +vt 0.471518 0.276529 +vt 0.474842 0.284556 +vt 0.470260 0.286350 +vt 0.476677 0.293863 +vt 0.471328 0.294625 +vt 0.564222 0.303025 +vt 0.567317 0.313741 +vt 0.570071 0.302291 +vt 0.573142 0.311497 +vt 0.476455 0.304364 +vt 0.470539 0.303808 +vt 0.473683 0.315267 +vt 0.467739 0.313198 +vt 0.573436 0.323961 +vt 0.581581 0.332100 +vt 0.578352 0.320136 +vt 0.585105 0.327137 +vt 0.467866 0.325779 +vt 0.462776 0.322092 +vt 0.459942 0.334276 +vt 0.456204 0.329397 +vt 0.572342 0.268622 +vt 0.580216 0.262425 +vt 0.583200 0.266123 +vt 0.575954 0.271684 +vt 0.456225 0.267598 +vt 0.459147 0.263778 +vt 0.467276 0.269863 +vt 0.463706 0.273050 +vt 0.594847 0.255893 +vt 0.611230 0.251963 +vt 0.610754 0.257158 +vt 0.596216 0.260490 +vt 0.428062 0.259163 +vt 0.427457 0.253882 +vt 0.444168 0.257490 +vt 0.442893 0.262195 +vt 0.624361 0.253572 +vt 0.635866 0.259477 +vt 0.633046 0.263505 +vt 0.622561 0.258500 +vt 0.405517 0.266204 +vt 0.402535 0.262154 +vt 0.414133 0.255836 +vt 0.416083 0.260823 +vt 0.647372 0.268436 +vt 0.656424 0.278659 +vt 0.651897 0.280071 +vt 0.643616 0.271163 +vt 0.386714 0.283696 +vt 0.382022 0.282383 +vt 0.391003 0.271638 +vt 0.394925 0.274331 +vt 0.660566 0.288359 +vt 0.661246 0.297150 +vt 0.656019 0.296899 +vt 0.655512 0.288824 +vt 0.383039 0.301103 +vt 0.377677 0.301548 +vt 0.378081 0.292480 +vt 0.383289 0.292791 +vt 0.659916 0.304646 +vt 0.654935 0.311857 +vt 0.650639 0.310282 +vt 0.654971 0.303771 +vt 0.389015 0.314625 +vt 0.384672 0.316404 +vt 0.379310 0.309202 +vt 0.384353 0.308119 +vt 0.644668 0.319791 +vt 0.632887 0.327126 +vt 0.630529 0.323708 +vt 0.641296 0.317272 +vt 0.410025 0.327565 +vt 0.407758 0.331135 +vt 0.395459 0.324113 +vt 0.398809 0.321411 +vt 0.623366 0.332538 +vt 0.615257 0.336155 +vt 0.614615 0.331821 +vt 0.621931 0.328558 +vt 0.426508 0.335214 +vt 0.426027 0.339635 +vt 0.417654 0.336274 +vt 0.418956 0.332175 +vt 0.607708 0.338104 +vt 0.599835 0.338280 +vt 0.600616 0.333421 +vt 0.607698 0.333496 +vt 0.440754 0.336316 +vt 0.441730 0.341203 +vt 0.433755 0.341324 +vt 0.433586 0.336655 +vt 0.590753 0.336576 +vt 0.592806 0.331433 +vt 0.450844 0.339136 +vt 0.448579 0.334018 +vt 0.594583 0.327825 +vt 0.601265 0.330046 +vt 0.588029 0.323634 +vt 0.590651 0.320861 +vt 0.596222 0.324984 +vt 0.601847 0.327415 +vt 0.450378 0.323260 +vt 0.453126 0.325966 +vt 0.446650 0.330437 +vt 0.444890 0.327625 +vt 0.439971 0.332925 +vt 0.439283 0.330283 +vt 0.607644 0.330283 +vt 0.614074 0.328799 +vt 0.607567 0.327768 +vt 0.613582 0.326433 +vt 0.433517 0.333397 +vt 0.433497 0.330845 +vt 0.426939 0.332127 +vt 0.427345 0.329707 +vt 0.620908 0.325858 +vt 0.628881 0.321370 +vt 0.620093 0.323798 +vt 0.627586 0.319573 +vt 0.419888 0.329392 +vt 0.420636 0.327267 +vt 0.411613 0.325121 +vt 0.412862 0.323240 +vt 0.638723 0.315246 +vt 0.647218 0.308618 +vt 0.636549 0.313467 +vt 0.644235 0.306908 +vt 0.401361 0.319243 +vt 0.403515 0.317343 +vt 0.392457 0.312790 +vt 0.395450 0.310927 +vt 0.651151 0.302617 +vt 0.652130 0.296452 +vt 0.647895 0.301323 +vt 0.648910 0.295907 +vt 0.388229 0.306793 +vt 0.391522 0.305346 +vt 0.387015 0.300507 +vt 0.390299 0.299835 +vt 0.651762 0.289330 +vt 0.648537 0.281545 +vt 0.648663 0.289856 +vt 0.645760 0.283051 +vt 0.387155 0.293188 +vt 0.390351 0.293627 +vt 0.390206 0.285109 +vt 0.393099 0.286571 +vt 0.640941 0.273393 +vt 0.631234 0.266340 +vt 0.638807 0.275375 +vt 0.629925 0.268578 +vt 0.397726 0.276543 +vt 0.399966 0.278515 +vt 0.407439 0.269058 +vt 0.408831 0.271315 +vt 0.621671 0.261850 +vt 0.610899 0.260715 +vt 0.621235 0.264412 +vt 0.611355 0.263452 +vt 0.417069 0.264222 +vt 0.417574 0.266826 +vt 0.427998 0.262789 +vt 0.427598 0.265588 +vt 0.597565 0.263724 +vt 0.585604 0.268884 +vt 0.598903 0.266275 +vt 0.587720 0.271176 +vt 0.441606 0.265513 +vt 0.440311 0.268138 +vt 0.453864 0.270454 +vt 0.451783 0.272829 +vt 0.578953 0.274202 +vt 0.575703 0.279966 +vt 0.581645 0.276446 +vt 0.578929 0.282021 +vt 0.460743 0.275672 +vt 0.458084 0.278012 +vt 0.464190 0.281418 +vt 0.460989 0.283583 +vt 0.582033 0.317488 +vt 0.577323 0.310016 +vt 0.580682 0.308917 +vt 0.585096 0.315428 +vt 0.460048 0.310844 +vt 0.463474 0.311842 +vt 0.458970 0.319548 +vt 0.455806 0.317576 +vt 0.574627 0.301852 +vt 0.573612 0.293750 +vt 0.577852 0.294237 +vt 0.578536 0.301558 +vt 0.462441 0.295908 +vt 0.466703 0.295291 +vt 0.465932 0.303507 +vt 0.461979 0.303333 +vt 0.573946 0.286469 +vt 0.577824 0.287838 +vt 0.466150 0.287943 +vt 0.462276 0.289437 +vt 0.537814 0.410803 +vt 0.522486 0.410487 +vt 0.556089 0.411900 +vt 0.556513 0.432940 +vt 0.538120 0.433345 +vt 0.523026 0.433671 +vt 0.489468 0.434574 +vt 0.488908 0.413457 +vt 0.507174 0.411509 +vt 0.507920 0.434083 +vt 0.580237 0.413224 +vt 0.604324 0.413413 +vt 0.607537 0.430184 +vt 0.581514 0.432289 +vt 0.438061 0.434299 +vt 0.440490 0.417253 +vt 0.464714 0.415920 +vt 0.464334 0.435139 +vt 0.622415 0.411107 +vt 0.638729 0.405048 +vt 0.648871 0.416961 +vt 0.628996 0.425416 +vt 0.395657 0.423058 +vt 0.405331 0.410500 +vt 0.422136 0.415812 +vt 0.416189 0.430578 +vt 0.657485 0.393976 +vt 0.676771 0.378394 +vt 0.690893 0.386339 +vt 0.670140 0.403795 +vt 0.351378 0.394172 +vt 0.365355 0.385357 +vt 0.385755 0.400221 +vt 0.373405 0.410823 +vt 0.694675 0.358805 +vt 0.708795 0.339345 +vt 0.723247 0.343864 +vt 0.709219 0.365014 +vt 0.315987 0.352544 +vt 0.330606 0.347118 +vt 0.346077 0.366293 +vt 0.331524 0.373408 +vt 0.716728 0.324148 +vt 0.720489 0.308075 +vt 0.736394 0.318639 +vt 0.731106 0.326933 +vt 0.300918 0.327580 +vt 0.316923 0.315395 +vt 0.321627 0.331925 +vt 0.306911 0.335590 +vt 0.722094 0.285988 +vt 0.718071 0.262689 +vt 0.731519 0.256780 +vt 0.735791 0.282538 +vt 0.303229 0.261534 +vt 0.317592 0.267554 +vt 0.314279 0.292209 +vt 0.299718 0.289022 +vt 0.704948 0.242983 +vt 0.687690 0.225865 +vt 0.702798 0.217013 +vt 0.719338 0.235312 +vt 0.332486 0.219303 +vt 0.348426 0.228476 +vt 0.330762 0.246617 +vt 0.315457 0.238665 +vt 0.671262 0.210330 +vt 0.653897 0.195135 +vt 0.662317 0.184641 +vt 0.685445 0.200761 +vt 0.374195 0.185721 +vt 0.382918 0.196478 +vt 0.365218 0.212210 +vt 0.350400 0.202336 +vt 0.622294 0.014521 +vt 0.638176 0.018993 +vt 0.639561 0.040540 +vt 0.621541 0.032099 +vt 0.649495 0.021510 +vt 0.654195 0.047117 +vt 0.653501 0.070933 +vt 0.637878 0.060791 +vt 0.619529 0.049057 +vt 0.383906 0.070216 +vt 0.383583 0.046313 +vt 0.398340 0.039911 +vt 0.399749 0.060219 +vt 0.388782 0.020705 +vt 0.400073 0.018359 +vt 0.415921 0.014065 +vt 0.416466 0.031641 +vt 0.418298 0.048624 +vt 0.568824 0.005170 +vt 0.597184 0.007876 +vt 0.598253 0.024161 +vt 0.573917 0.020499 +vt 0.598430 0.039835 +vt 0.577728 0.035019 +vt 0.439789 0.023890 +vt 0.439501 0.039552 +vt 0.440977 0.007638 +vt 0.469257 0.005110 +vt 0.464105 0.020382 +vt 0.460236 0.034862 +vt 0.518953 0.018701 +vt 0.543191 0.012515 +vt 0.552750 0.024889 +vt 0.537616 0.033544 +vt 0.560569 0.036503 +vt 0.548263 0.041578 +vt 0.485213 0.024839 +vt 0.477380 0.036413 +vt 0.494779 0.012515 +vt 0.500285 0.033512 +vt 0.489654 0.041519 +vt 0.531378 0.042677 +vt 0.542117 0.047535 +vt 0.518927 0.040128 +vt 0.506494 0.042655 +vt 0.495779 0.047492 +vt 0.549415 0.051935 +vt 0.554977 0.055543 +vt 0.554949 0.048532 +vt 0.558366 0.052915 +vt 0.488483 0.051874 +vt 0.482963 0.048454 +vt 0.482915 0.055466 +vt 0.479532 0.052826 +vt 0.560503 0.058027 +vt 0.567352 0.061653 +vt 0.565105 0.054124 +vt 0.576047 0.057402 +vt 0.477380 0.057933 +vt 0.472789 0.054013 +vt 0.470506 0.061537 +vt 0.461815 0.057251 +vt 0.576881 0.068688 +vt 0.587176 0.079305 +vt 0.590585 0.064811 +vt 0.605153 0.075955 +vt 0.460918 0.068542 +vt 0.447196 0.064600 +vt 0.450534 0.079148 +vt 0.432505 0.075705 +vt 0.578971 0.047922 +vt 0.596821 0.054289 +vt 0.615002 0.064774 +vt 0.441013 0.054029 +vt 0.422701 0.064421 +vt 0.458932 0.047755 +vt 0.564907 0.046599 +vt 0.473014 0.046489 +vt 0.624013 0.104750 +vt 0.616184 0.090438 +vt 0.630060 0.078450 +vt 0.642020 0.091166 +vt 0.407441 0.078039 +vt 0.421316 0.090206 +vt 0.413334 0.104572 +vt 0.395272 0.090713 +vt 0.596324 0.093677 +vt 0.603744 0.108616 +vt 0.441273 0.093555 +vt 0.433741 0.108565 +vt 0.611761 0.131114 +vt 0.612571 0.139641 +vt 0.635943 0.127696 +vt 0.630860 0.142201 +vt 0.626197 0.150966 +vt 0.612401 0.147309 +vt 0.410974 0.151389 +vt 0.406192 0.142474 +vt 0.424780 0.139885 +vt 0.424973 0.147644 +vt 0.401083 0.127719 +vt 0.425593 0.131262 +vt 0.608855 0.120934 +vt 0.628976 0.115380 +vt 0.408262 0.115272 +vt 0.428547 0.120978 +vt 0.612370 0.154914 +vt 0.617753 0.164731 +vt 0.622617 0.156830 +vt 0.625724 0.164649 +vt 0.425034 0.155339 +vt 0.414640 0.157330 +vt 0.419599 0.165321 +vt 0.411492 0.165278 +vt 0.633828 0.179037 +vt 0.637884 0.173830 +vt 0.399140 0.174660 +vt 0.403302 0.179942 +vt 0.945213 0.085254 +vt 0.914838 0.105981 +vt 0.893260 0.084498 +vt 0.918840 0.058242 +vt 0.889132 0.123361 +vt 0.873282 0.106442 +vt 0.851852 0.096591 +vt 0.866972 0.069553 +vt 0.887771 0.038981 +vt 0.180084 0.088507 +vt 0.156552 0.097152 +vt 0.136417 0.071699 +vt 0.165727 0.058422 +vt 0.137530 0.114165 +vt 0.110425 0.092953 +vt 0.078484 0.067644 +vt 0.110619 0.041093 +vt 0.145659 0.024126 +vt 0.833734 0.057065 +vt 0.848682 0.023851 +vt 0.822965 0.086651 +vt 0.785804 0.079347 +vt 0.791534 0.049108 +vt 0.799709 0.015479 +vt 0.249093 0.074797 +vt 0.210628 0.080245 +vt 0.201098 0.048397 +vt 0.244703 0.043157 +vt 0.187463 0.012475 +vt 0.238018 0.007920 +vt 0.738361 0.047754 +vt 0.738984 0.016493 +vt 0.739549 0.077405 +vt 0.689992 0.080919 +vt 0.691272 0.049157 +vt 0.686167 0.020796 +vt 0.346775 0.079604 +vt 0.296387 0.074595 +vt 0.298714 0.044235 +vt 0.346234 0.047410 +vt 0.299313 0.012237 +vt 0.352169 0.018877 +vt 0.667324 0.049467 +vt 0.660914 0.022289 +vt 0.666424 0.075383 +vt 0.370819 0.074495 +vt 0.370369 0.048457 +vt 0.377403 0.021288 +vt 0.650904 0.098775 +vt 0.661183 0.105558 +vt 0.386234 0.098272 +vt 0.375694 0.105035 +vt 0.744333 0.224966 +vt 0.754642 0.247585 +vt 0.727991 0.205063 +vt 0.758274 0.191148 +vt 0.769779 0.215877 +vt 0.778667 0.239039 +vt 0.273755 0.191843 +vt 0.305809 0.206728 +vt 0.288775 0.227778 +vt 0.261579 0.218114 +vt 0.278389 0.252011 +vt 0.252527 0.243095 +vt 0.989113 0.167555 +vt 0.948074 0.176349 +vt 0.933945 0.138078 +vt 0.970213 0.123637 +vt 0.913217 0.182923 +vt 0.902861 0.149999 +vt 0.118945 0.142532 +vt 0.085008 0.126913 +vt 0.103932 0.178783 +vt 0.064870 0.169124 +vt 0.018760 0.156504 +vt 0.045395 0.108043 +vt 0.909803 0.401162 +vt 0.884003 0.369161 +vt 0.907892 0.346905 +vt 0.937286 0.373591 +vt 0.862686 0.339578 +vt 0.883515 0.321821 +vt 0.898768 0.301660 +vt 0.926996 0.320953 +vt 0.961117 0.340698 +vt 0.118375 0.315370 +vt 0.136374 0.338312 +vt 0.108675 0.368008 +vt 0.085783 0.338181 +vt 0.160786 0.357984 +vt 0.137159 0.392880 +vt 0.108456 0.430881 +vt 0.075184 0.399845 +vt 0.046294 0.361749 +vt 0.943061 0.290270 +vt 0.981378 0.299696 +vt 0.911263 0.279326 +vt 0.918742 0.252459 +vt 0.953248 0.255267 +vt 0.994570 0.255037 +vt 0.095172 0.258408 +vt 0.103698 0.289559 +vt 0.066713 0.302159 +vt 0.055135 0.260843 +vt 0.022056 0.313076 +vt 0.007083 0.259635 +vt 0.954713 0.216353 +vt 0.997190 0.211173 +vt 0.918953 0.218701 +vt 0.095629 0.219445 +vt 0.054717 0.215133 +vt 0.005987 0.207240 +vt 0.750414 0.337469 +vt 0.742710 0.323398 +vt 0.760230 0.315333 +vt 0.768682 0.327936 +vt 0.754434 0.300978 +vt 0.773434 0.293137 +vt 0.779994 0.306487 +vt 0.789564 0.318101 +vt 0.259496 0.301950 +vt 0.280510 0.309658 +vt 0.274913 0.325696 +vt 0.252703 0.316963 +vt 0.294625 0.333544 +vt 0.287286 0.349788 +vt 0.266464 0.340272 +vt 0.242718 0.330414 +vt 0.804247 0.296080 +vt 0.815676 0.307660 +vt 0.795245 0.283595 +vt 0.816175 0.273268 +vt 0.827684 0.284720 +vt 0.840737 0.296140 +vt 0.212022 0.281565 +vt 0.235299 0.292296 +vt 0.225501 0.306460 +vt 0.199173 0.294636 +vt 0.213124 0.319871 +vt 0.184690 0.307842 +vt 0.845003 0.273015 +vt 0.858466 0.283068 +vt 0.832533 0.263076 +vt 0.844821 0.251955 +vt 0.857419 0.260335 +vt 0.870829 0.268571 +vt 0.179781 0.258393 +vt 0.193764 0.270623 +vt 0.179588 0.281936 +vt 0.165402 0.267814 +vt 0.164426 0.293526 +vt 0.150180 0.277239 +vt 0.866150 0.246053 +vt 0.879792 0.252772 +vt 0.853541 0.238846 +vt 0.858615 0.227900 +vt 0.869522 0.229610 +vt 0.883757 0.234124 +vt 0.162811 0.231605 +vt 0.169328 0.243794 +vt 0.155267 0.251726 +vt 0.150917 0.233273 +vt 0.139801 0.259297 +vt 0.135112 0.238149 +vt 0.840777 0.191785 +vt 0.859121 0.189704 +vt 0.865865 0.210451 +vt 0.852806 0.214647 +vt 0.874671 0.186176 +vt 0.881130 0.211077 +vt 0.137932 0.212248 +vt 0.154082 0.212059 +vt 0.146173 0.184629 +vt 0.162167 0.189401 +vt 0.182052 0.194347 +vt 0.168313 0.217094 +vt 0.896625 0.215385 +vt 0.890727 0.185058 +vt 0.897871 0.243576 +vt 0.119181 0.248685 +vt 0.120908 0.216597 +vt 0.128897 0.182520 +vt 0.892501 0.265345 +vt 0.882329 0.283273 +vt 0.137173 0.294074 +vt 0.125336 0.273589 +vt 0.869172 0.299940 +vt 0.850334 0.314832 +vt 0.174262 0.329298 +vt 0.152490 0.312902 +vt 0.833464 0.354702 +vt 0.823123 0.327435 +vt 0.805060 0.366763 +vt 0.795591 0.338307 +vt 0.237000 0.353494 +vt 0.205465 0.342487 +vt 0.227594 0.386342 +vt 0.194700 0.373985 +vt 0.765794 0.378814 +vt 0.759863 0.357111 +vt 0.775794 0.348002 +vt 0.786680 0.375335 +vt 0.259768 0.363344 +vt 0.278152 0.372616 +vt 0.272994 0.397729 +vt 0.248944 0.395082 +vt 0.850564 0.446288 +vt 0.824956 0.403130 +vt 0.853581 0.388754 +vt 0.878585 0.426198 +vt 0.173003 0.414041 +vt 0.206543 0.429096 +vt 0.179247 0.480106 +vt 0.145840 0.458376 +vt 0.810696 0.448077 +vt 0.793215 0.444821 +vt 0.778079 0.421946 +vt 0.792645 0.414150 +vt 0.770572 0.444261 +vt 0.763136 0.431432 +vt 0.755700 0.418603 +vt 0.762942 0.399071 +vt 0.287033 0.442912 +vt 0.279198 0.458114 +vt 0.261445 0.448038 +vt 0.277577 0.420825 +vt 0.271364 0.473316 +vt 0.245312 0.475251 +vt 0.225352 0.480005 +vt 0.244234 0.439904 +vt 0.806457 0.409737 +vt 0.823720 0.439889 +vt 0.228110 0.435654 +vt 0.209866 0.471309 +vt 0.819845 0.468071 +vt 0.817852 0.456726 +vt 0.827067 0.454473 +vt 0.832672 0.459019 +vt 0.206812 0.488297 +vt 0.200587 0.493852 +vt 0.217577 0.490395 +vt 0.215894 0.503605 +vt 0.755291 0.275659 +vt 0.776439 0.267723 +vt 0.278652 0.282200 +vt 0.255635 0.274184 +vt 0.794820 0.235072 +vt 0.795082 0.261102 +vt 0.808235 0.230663 +vt 0.811209 0.254481 +vt 0.217549 0.260513 +vt 0.235224 0.267418 +vt 0.220518 0.234225 +vt 0.235095 0.238903 +vt 0.820950 0.229143 +vt 0.824810 0.246547 +vt 0.829426 0.216752 +vt 0.835759 0.236818 +vt 0.190262 0.241569 +vt 0.202740 0.252082 +vt 0.196370 0.218224 +vt 0.206983 0.233036 +vt 0.843931 0.224810 +vt 0.837701 0.211668 +vt 0.179580 0.228419 +vt 0.187927 0.209321 +vt 0.744359 0.103837 +vt 0.706047 0.109141 +vt 0.784963 0.102809 +vt 0.786447 0.122246 +vt 0.752059 0.127970 +vt 0.712371 0.140499 +vt 0.246597 0.119486 +vt 0.248893 0.099247 +vt 0.290608 0.101681 +vt 0.281936 0.126431 +vt 0.329760 0.108091 +vt 0.322678 0.140136 +vt 0.736714 0.167208 +vt 0.761916 0.150723 +vt 0.772211 0.168449 +vt 0.787690 0.140415 +vt 0.793290 0.155914 +vt 0.270931 0.149783 +vt 0.244699 0.138495 +vt 0.296879 0.167286 +vt 0.259495 0.167887 +vt 0.238258 0.154609 +vt 0.709243 0.185137 +vt 0.686430 0.166862 +vt 0.349277 0.167406 +vt 0.325495 0.186083 +vt 0.644947 0.163787 +vt 0.657890 0.151913 +vt 0.670045 0.134473 +vt 0.378600 0.152258 +vt 0.366202 0.134395 +vt 0.391891 0.164438 +vt 0.677327 0.115796 +vt 0.359020 0.115319 +vt 0.635300 0.165769 +vt 0.401750 0.166464 +vt 0.839869 0.175761 +vt 0.853235 0.168500 +vt 0.831517 0.160707 +vt 0.841417 0.150913 +vt 0.853765 0.137677 +vt 0.867144 0.161965 +vt 0.175775 0.132589 +vt 0.189019 0.148124 +vt 0.172572 0.166616 +vt 0.157745 0.158328 +vt 0.200311 0.159828 +vt 0.186705 0.175710 +vt 0.882140 0.156879 +vt 0.872766 0.134048 +vt 0.141530 0.151652 +vt 0.154964 0.127182 +vt 0.816880 0.141014 +vt 0.811434 0.154345 +vt 0.820522 0.126340 +vt 0.211373 0.122359 +vt 0.215227 0.138347 +vt 0.221296 0.153122 +vt 0.820556 0.108981 +vt 0.848088 0.116562 +vt 0.183019 0.110167 +vt 0.211947 0.103945 +vt 0.864510 0.119761 +vt 0.165361 0.112301 +vt 0.509276 0.900499 +vt 0.469277 0.899897 +vt 0.467102 0.887934 +vt 0.502009 0.889062 +vt 0.436530 0.892076 +vt 0.438605 0.880072 +vt 0.442570 0.867282 +vt 0.467297 0.874740 +vt 0.497540 0.875977 +vt 0.312156 0.865143 +vt 0.315792 0.878106 +vt 0.286936 0.885229 +vt 0.287103 0.871964 +vt 0.317551 0.890227 +vt 0.284422 0.897192 +vt 0.244201 0.896691 +vt 0.251822 0.885397 +vt 0.256678 0.872371 +vt 0.543710 0.881749 +vt 0.555496 0.892398 +vt 0.534426 0.869293 +vt 0.566292 0.853087 +vt 0.579330 0.863421 +vt 0.594385 0.872018 +vt 0.188235 0.847442 +vt 0.219796 0.864624 +vt 0.210113 0.876880 +vt 0.174834 0.857456 +vt 0.197968 0.887254 +vt 0.159455 0.865668 +vt 0.595994 0.831506 +vt 0.612393 0.835781 +vt 0.581472 0.825753 +vt 0.581825 0.795308 +vt 0.595536 0.796225 +vt 0.629011 0.798690 +vt 0.174295 0.788956 +vt 0.173769 0.819544 +vt 0.159006 0.824902 +vt 0.160488 0.789473 +vt 0.142396 0.828721 +vt 0.126829 0.790841 +vt 0.579793 0.767804 +vt 0.589729 0.763265 +vt 0.569205 0.769767 +vt 0.548861 0.748164 +vt 0.555739 0.744297 +vt 0.563952 0.739636 +vt 0.208752 0.742636 +vt 0.187712 0.763703 +vt 0.177137 0.761422 +vt 0.201967 0.738564 +vt 0.167303 0.756572 +vt 0.193875 0.733657 +vt 0.530349 0.723761 +vt 0.537882 0.718127 +vt 0.526039 0.729528 +vt 0.500239 0.712664 +vt 0.502360 0.705108 +vt 0.509441 0.697811 +vt 0.258441 0.708419 +vt 0.232145 0.724609 +vt 0.227988 0.718717 +vt 0.256518 0.700799 +vt 0.220609 0.712866 +vt 0.249633 0.693309 +vt 0.470507 0.687247 +vt 0.476553 0.677761 +vt 0.470964 0.696376 +vt 0.442627 0.684437 +vt 0.439691 0.671552 +vt 0.445649 0.657308 +vt 0.316870 0.681612 +vt 0.288185 0.692861 +vt 0.288873 0.683732 +vt 0.320103 0.668780 +vt 0.283075 0.674093 +vt 0.314481 0.654423 +vt 0.501210 0.721182 +vt 0.474394 0.705845 +vt 0.503339 0.729425 +vt 0.478400 0.714693 +vt 0.455602 0.705126 +vt 0.449084 0.695707 +vt 0.303354 0.702018 +vt 0.280263 0.711016 +vt 0.284505 0.702256 +vt 0.310125 0.692742 +vt 0.254889 0.725123 +vt 0.257242 0.716923 +vt 0.544487 0.752313 +vt 0.524464 0.736210 +vt 0.541615 0.756550 +vt 0.524268 0.742875 +vt 0.233553 0.738029 +vt 0.233538 0.731346 +vt 0.215780 0.751246 +vt 0.213020 0.746918 +vt 0.571714 0.792317 +vt 0.561605 0.770877 +vt 0.563856 0.789235 +vt 0.555810 0.771958 +vt 0.201098 0.766285 +vt 0.195311 0.765036 +vt 0.192523 0.783381 +vt 0.184541 0.786248 +vt 0.557285 0.839277 +vt 0.570708 0.817045 +vt 0.551540 0.826015 +vt 0.562758 0.808517 +vt 0.193070 0.802770 +vt 0.184837 0.811108 +vt 0.203833 0.820663 +vt 0.197682 0.833823 +vt 0.498666 0.859595 +vt 0.530144 0.853227 +vt 0.502835 0.844149 +vt 0.529227 0.837942 +vt 0.225907 0.833272 +vt 0.224553 0.848601 +vt 0.252242 0.840246 +vt 0.256002 0.855880 +vt 0.472229 0.859085 +vt 0.450313 0.852917 +vt 0.459439 0.839671 +vt 0.479382 0.844489 +vt 0.295958 0.836942 +vt 0.304767 0.850499 +vt 0.282577 0.856098 +vt 0.275792 0.841237 +vt 0.781229 0.177498 +vt 0.777540 0.192542 +vt 0.790753 0.164650 +vt 0.795475 0.174844 +vt 0.788561 0.181231 +vt 0.787311 0.191440 +vt 0.234275 0.173476 +vt 0.239797 0.163311 +vt 0.249526 0.176892 +vt 0.241448 0.180379 +vt 0.253192 0.192916 +vt 0.242627 0.191415 +vt 0.404884 0.613723 +vt 0.423162 0.635783 +vt 0.414812 0.659395 +vt 0.392902 0.649008 +vt 0.419641 0.680620 +vt 0.393037 0.679868 +vt 0.345258 0.657206 +vt 0.339989 0.678347 +vt 0.337396 0.633508 +vt 0.356067 0.611970 +vt 0.367375 0.647321 +vt 0.366668 0.678229 +vt 0.785521 0.211976 +vt 0.795291 0.208892 +vt 0.244733 0.213828 +vt 0.234116 0.210430 +vt 0.391747 0.862097 +vt 0.396676 0.851779 +vt 0.416134 0.867182 +vt 0.412068 0.878520 +vt 0.398254 0.838285 +vt 0.422232 0.855297 +vt 0.332920 0.853649 +vt 0.338727 0.865760 +vt 0.357475 0.837195 +vt 0.358701 0.850802 +vt 0.363377 0.861308 +vt 0.342507 0.877267 +vt 0.430345 0.696278 +vt 0.441095 0.707171 +vt 0.433108 0.714624 +vt 0.418039 0.702943 +vt 0.325667 0.712108 +vt 0.317846 0.704438 +vt 0.328898 0.693778 +vt 0.341075 0.700759 +vt 0.428970 0.728065 +vt 0.411160 0.720916 +vt 0.412028 0.711091 +vt 0.429871 0.721278 +vt 0.385921 0.717918 +vt 0.389712 0.698212 +vt 0.369619 0.696707 +vt 0.346905 0.709081 +vt 0.372938 0.716591 +vt 0.347534 0.718963 +vt 0.329482 0.725693 +vt 0.328747 0.718861 +vt 0.412713 0.748810 +vt 0.402384 0.737539 +vt 0.414283 0.732612 +vt 0.419552 0.742929 +vt 0.427993 0.735917 +vt 0.426851 0.741709 +vt 0.344106 0.730624 +vt 0.330264 0.733596 +vt 0.355924 0.735873 +vt 0.345272 0.746925 +vt 0.338558 0.740847 +vt 0.331263 0.739437 +vt 0.416980 0.784528 +vt 0.402816 0.787448 +vt 0.399599 0.759583 +vt 0.412712 0.764696 +vt 0.386776 0.790537 +vt 0.384658 0.752861 +vt 0.373335 0.751720 +vt 0.358163 0.758083 +vt 0.370256 0.789512 +vt 0.354223 0.785988 +vt 0.340072 0.782683 +vt 0.344867 0.762877 +vt 0.393131 0.818442 +vt 0.408920 0.809841 +vt 0.418563 0.827788 +vt 0.422947 0.802247 +vt 0.431514 0.817618 +vt 0.347510 0.808325 +vt 0.333617 0.800325 +vt 0.363148 0.817384 +vt 0.337347 0.826103 +vt 0.324605 0.815540 +vt 0.432392 0.842316 +vt 0.443580 0.830404 +vt 0.323061 0.840331 +vt 0.312141 0.828061 +vt 0.812198 0.213951 +vt 0.820073 0.216574 +vt 0.815612 0.201611 +vt 0.820686 0.206424 +vt 0.825107 0.209762 +vt 0.827197 0.214662 +vt 0.199767 0.214827 +vt 0.204798 0.210494 +vt 0.206958 0.220210 +vt 0.199417 0.218645 +vt 0.210653 0.204360 +vt 0.215391 0.216797 +vt 0.802821 0.202258 +vt 0.795502 0.189331 +vt 0.803180 0.185964 +vt 0.809229 0.193848 +vt 0.225295 0.185037 +vt 0.233684 0.188879 +vt 0.225609 0.203428 +vt 0.218157 0.194624 +vt 0.793802 0.183009 +vt 0.799106 0.180789 +vt 0.230055 0.179353 +vt 0.235688 0.181927 +vt 0.452764 0.821724 +vt 0.467554 0.830235 +vt 0.441512 0.810137 +vt 0.451051 0.802964 +vt 0.461899 0.813742 +vt 0.475726 0.821844 +vt 0.305373 0.800299 +vt 0.314760 0.807757 +vt 0.303149 0.819093 +vt 0.294190 0.810831 +vt 0.288063 0.827242 +vt 0.280085 0.818591 +vt 0.433448 0.796668 +vt 0.427392 0.781944 +vt 0.436210 0.778061 +vt 0.442865 0.790824 +vt 0.320932 0.775685 +vt 0.329683 0.779815 +vt 0.323216 0.794443 +vt 0.313915 0.788326 +vt 0.422167 0.766592 +vt 0.420500 0.754265 +vt 0.426815 0.757343 +vt 0.429958 0.765413 +vt 0.330900 0.755130 +vt 0.337317 0.752202 +vt 0.335326 0.764535 +vt 0.327537 0.763150 +vt 0.425119 0.748614 +vt 0.431772 0.744946 +vt 0.437934 0.749084 +vt 0.431216 0.753471 +vt 0.319953 0.746555 +vt 0.326243 0.742561 +vt 0.332826 0.746412 +vt 0.326582 0.751130 +vt 0.436206 0.738566 +vt 0.438509 0.731576 +vt 0.445433 0.734403 +vt 0.442947 0.742075 +vt 0.312804 0.731633 +vt 0.319822 0.728975 +vt 0.321956 0.736046 +vt 0.315103 0.739394 +vt 0.438769 0.726080 +vt 0.440211 0.720712 +vt 0.444070 0.722997 +vt 0.444570 0.728023 +vt 0.314462 0.720230 +vt 0.318390 0.718037 +vt 0.319700 0.723457 +vt 0.313832 0.725256 +vt 0.446061 0.714104 +vt 0.458719 0.712454 +vt 0.461005 0.720964 +vt 0.448865 0.720462 +vt 0.297533 0.717756 +vt 0.300043 0.709284 +vt 0.312691 0.711265 +vt 0.309718 0.717567 +vt 0.486234 0.834477 +vt 0.507497 0.833869 +vt 0.492848 0.825954 +vt 0.511534 0.825802 +vt 0.269185 0.830990 +vt 0.262777 0.822248 +vt 0.247846 0.829790 +vt 0.244016 0.821576 +vt 0.530038 0.827833 +vt 0.548289 0.817326 +vt 0.530052 0.821112 +vt 0.543283 0.811964 +vt 0.225378 0.823096 +vt 0.225553 0.816345 +vt 0.207347 0.812028 +vt 0.212526 0.806786 +vt 0.556681 0.803304 +vt 0.556901 0.788047 +vt 0.548593 0.800602 +vt 0.547784 0.788523 +vt 0.199322 0.797709 +vt 0.207519 0.795227 +vt 0.199540 0.782389 +vt 0.208678 0.783127 +vt 0.550636 0.773835 +vt 0.539246 0.760680 +vt 0.542657 0.777226 +vt 0.533477 0.766384 +vt 0.206237 0.768316 +vt 0.214148 0.771943 +vt 0.218040 0.755453 +vt 0.223666 0.761335 +vt 0.524091 0.748593 +vt 0.504695 0.736157 +vt 0.520508 0.755673 +vt 0.503273 0.744104 +vt 0.233573 0.743764 +vt 0.236970 0.750961 +vt 0.253350 0.731832 +vt 0.254563 0.739837 +vt 0.480584 0.721958 +vt 0.481289 0.730690 +vt 0.277885 0.718239 +vt 0.276949 0.726974 +vt 0.452240 0.747962 +vt 0.445761 0.755176 +vt 0.455400 0.739499 +vt 0.466859 0.747047 +vt 0.462582 0.756036 +vt 0.454669 0.763299 +vt 0.290987 0.743759 +vt 0.302676 0.736487 +vt 0.305629 0.745059 +vt 0.295043 0.752888 +vt 0.311943 0.752465 +vt 0.302793 0.760384 +vt 0.472472 0.766110 +vt 0.464072 0.773530 +vt 0.478260 0.757229 +vt 0.488959 0.768081 +vt 0.481838 0.776645 +vt 0.473719 0.784314 +vt 0.268265 0.764268 +vt 0.279285 0.753671 +vt 0.284855 0.762733 +vt 0.275177 0.773052 +vt 0.293086 0.770402 +vt 0.283117 0.780967 +vt 0.490606 0.786100 +vt 0.483357 0.794099 +vt 0.498311 0.777638 +vt 0.506764 0.785137 +vt 0.499283 0.793344 +vt 0.493518 0.801648 +vt 0.249939 0.780890 +vt 0.258625 0.773601 +vt 0.266123 0.782302 +vt 0.257217 0.789333 +vt 0.273180 0.790528 +vt 0.262775 0.797826 +vt 0.508378 0.797243 +vt 0.504736 0.805721 +vt 0.514765 0.789813 +vt 0.522193 0.793010 +vt 0.519588 0.798948 +vt 0.517494 0.807630 +vt 0.234236 0.788355 +vt 0.241781 0.785358 +vt 0.247981 0.792993 +vt 0.236682 0.794389 +vt 0.251401 0.801603 +vt 0.238540 0.803163 +vt 0.499287 0.815830 +vt 0.513829 0.816992 +vt 0.485023 0.811731 +vt 0.271027 0.808182 +vt 0.256591 0.811904 +vt 0.241957 0.812666 +vt 0.462622 0.793722 +vt 0.472942 0.803924 +vt 0.283368 0.800673 +vt 0.294004 0.790710 +vt 0.453638 0.782440 +vt 0.445590 0.771244 +vt 0.311696 0.768596 +vt 0.303323 0.779623 +vt 0.438078 0.761300 +vt 0.319494 0.758811 +vt 0.453126 0.729630 +vt 0.465025 0.733926 +vt 0.293165 0.730648 +vt 0.305209 0.726649 +vt 0.497066 0.755990 +vt 0.480857 0.743935 +vt 0.277032 0.740268 +vt 0.260464 0.751923 +vt 0.520406 0.775343 +vt 0.510097 0.766425 +vt 0.247114 0.762030 +vt 0.236527 0.770686 +vt 0.533439 0.790435 +vt 0.528445 0.782846 +vt 0.228249 0.777983 +vt 0.223021 0.785453 +vt 0.532275 0.808688 +vt 0.534611 0.799609 +vt 0.221583 0.794627 +vt 0.223671 0.803807 +vt 0.526743 0.815988 +vt 0.229019 0.811294 +vt 0.492632 0.667222 +vt 0.523352 0.690074 +vt 0.465874 0.641962 +vt 0.507960 0.626656 +vt 0.528528 0.655847 +vt 0.553068 0.682536 +vt 0.253280 0.623071 +vt 0.294662 0.638716 +vt 0.267297 0.663165 +vt 0.231929 0.651281 +vt 0.235945 0.685198 +vt 0.206572 0.677006 +vt 0.549123 0.711844 +vt 0.572334 0.733105 +vt 0.572286 0.706958 +vt 0.588280 0.728364 +vt 0.209549 0.706259 +vt 0.186581 0.700741 +vt 0.185684 0.726865 +vt 0.169886 0.721631 +vt 0.595375 0.754431 +vt 0.620810 0.767292 +vt 0.603149 0.746004 +vt 0.619756 0.755543 +vt 0.161926 0.747534 +vt 0.154420 0.738822 +vt 0.136030 0.759585 +vt 0.137477 0.747836 +vt 0.701303 0.750377 +vt 0.663727 0.775750 +vt 0.651200 0.763158 +vt 0.679266 0.742526 +vt 0.637004 0.751745 +vt 0.653228 0.735238 +vt 0.105751 0.754337 +vt 0.120342 0.743429 +vt 0.092794 0.766459 +vt 0.056578 0.739598 +vt 0.078675 0.732719 +vt 0.104797 0.726450 +vt 0.740175 0.655614 +vt 0.726501 0.705992 +vt 0.697726 0.705897 +vt 0.707312 0.662584 +vt 0.662804 0.705755 +vt 0.665943 0.669383 +vt 0.062384 0.695666 +vt 0.096615 0.696979 +vt 0.034467 0.694286 +vt 0.024955 0.643965 +vt 0.055680 0.652866 +vt 0.095280 0.661418 +vt 0.740843 0.572428 +vt 0.743177 0.612264 +vt 0.708753 0.621905 +vt 0.706123 0.582542 +vt 0.662860 0.632212 +vt 0.673710 0.586755 +vt 0.057364 0.614013 +vt 0.100277 0.626171 +vt 0.026537 0.602076 +vt 0.034076 0.568603 +vt 0.066133 0.582039 +vt 0.111371 0.595474 +vt 0.607563 0.675836 +vt 0.594028 0.643852 +vt 0.579497 0.612535 +vt 0.167361 0.638772 +vt 0.182968 0.608904 +vt 0.152631 0.669272 +vt 0.615585 0.705518 +vt 0.619188 0.729077 +vt 0.138972 0.721397 +vt 0.143475 0.698159 +vt 0.619467 0.742688 +vt 0.138198 0.734952 +vt 0.835231 0.207140 +vt 0.838530 0.201059 +vt 0.831932 0.213221 +vt 0.834578 0.206879 +vt 0.834641 0.206919 +vt 0.834705 0.206959 +vt 0.042440 0.543531 +vt 0.080685 0.559880 +vt 0.051216 0.522659 +vt 0.098128 0.542627 +vt 0.148210 0.556046 +vt 0.128325 0.573563 +vt 0.620420 0.565675 +vt 0.645911 0.579166 +vt 0.568491 0.584855 +vt 0.559246 0.558995 +vt 0.500657 0.594728 +vt 0.499986 0.561432 +vt 0.194754 0.581916 +vt 0.261251 0.591882 +vt 0.204630 0.556368 +vt 0.262533 0.559204 +vt 0.444556 0.582103 +vt 0.451996 0.612966 +vt 0.309096 0.610407 +vt 0.317066 0.580168 +vn 0.7273 -0.1123 0.6770 +vn 0.6470 -0.3278 0.6885 +vn 0.6658 -0.3430 0.6626 +vn 0.7475 -0.1217 0.6530 +vn -0.6658 -0.3430 0.6626 +vn -0.6470 -0.3278 0.6885 +vn -0.7273 -0.1123 0.6770 +vn -0.7475 -0.1217 0.6530 +vn 0.8357 -0.1487 0.5287 +vn 0.7404 -0.4154 0.5284 +vn 0.7666 -0.4493 0.4586 +vn 0.8709 -0.1601 0.4646 +vn -0.7666 -0.4493 0.4586 +vn -0.7404 -0.4154 0.5284 +vn -0.8357 -0.1487 0.5287 +vn -0.8709 -0.1601 0.4646 +vn 0.5368 -0.6566 0.5298 +vn 0.2687 -0.7999 0.5366 +vn 0.2578 -0.8623 0.4359 +vn 0.5454 -0.7103 0.4450 +vn -0.2578 -0.8623 0.4359 +vn -0.2687 -0.7999 0.5366 +vn -0.5368 -0.6566 0.5298 +vn -0.5454 -0.7103 0.4450 +vn 0.4685 -0.5130 0.7193 +vn 0.2654 -0.6038 0.7516 +vn 0.2708 -0.6392 0.7198 +vn 0.4893 -0.5353 0.6885 +vn -0.2708 -0.6392 0.7198 +vn -0.2654 -0.6038 0.7516 +vn -0.4685 -0.5130 0.7193 +vn -0.4893 -0.5353 0.6885 +vn 0.0158 -0.6277 0.7783 +vn -0.2383 -0.5553 0.7968 +vn -0.2682 -0.5807 0.7687 +vn -0.0056 -0.6633 0.7483 +vn 0.2682 -0.5807 0.7687 +vn 0.2383 -0.5553 0.7968 +vn -0.0158 -0.6277 0.7783 +vn 0.0056 -0.6633 0.7483 +vn -0.0755 -0.8283 0.5551 +vn -0.3820 -0.7169 0.5832 +vn -0.4211 -0.7697 0.4799 +vn -0.1034 -0.8883 0.4476 +vn 0.4211 -0.7697 0.4799 +vn 0.3820 -0.7169 0.5832 +vn 0.0755 -0.8283 0.5551 +vn 0.1034 -0.8883 0.4476 +vn -0.6383 -0.4619 0.6159 +vn -0.7558 -0.1624 0.6343 +vn -0.8211 -0.1789 0.5420 +vn -0.6910 -0.5023 0.5198 +vn 0.8211 -0.1789 0.5420 +vn 0.7558 -0.1624 0.6343 +vn 0.6383 -0.4619 0.6159 +vn 0.6910 -0.5023 0.5198 +vn -0.4701 -0.3509 0.8099 +vn -0.5701 -0.1161 0.8133 +vn -0.5928 -0.1243 0.7957 +vn -0.4956 -0.3679 0.7868 +vn 0.5928 -0.1243 0.7957 +vn 0.5701 -0.1161 0.8133 +vn 0.4701 -0.3509 0.8099 +vn 0.4956 -0.3679 0.7868 +vn -0.5732 0.1137 0.8115 +vn -0.4898 0.3470 0.7998 +vn -0.5053 0.3667 0.7811 +vn -0.5944 0.1232 0.7946 +vn 0.5053 0.3667 0.7811 +vn 0.4898 0.3470 0.7998 +vn 0.5732 0.1137 0.8115 +vn 0.5944 0.1232 0.7946 +vn -0.7547 0.1607 0.6361 +vn -0.6355 0.4531 0.6252 +vn -0.6861 0.4865 0.5409 +vn -0.8191 0.1757 0.5462 +vn 0.6861 0.4865 0.5409 +vn 0.6355 0.4531 0.6252 +vn 0.7547 0.1607 0.6361 +vn 0.8191 0.1757 0.5462 +vn -0.3748 0.7043 0.6028 +vn -0.0681 0.8125 0.5789 +vn -0.0889 0.8613 0.5002 +vn -0.4079 0.7482 0.5233 +vn 0.0889 0.8613 0.5002 +vn 0.0681 0.8125 0.5789 +vn 0.3748 0.7043 0.6028 +vn 0.4079 0.7482 0.5233 +vn -0.2643 0.5756 0.7738 +vn 0.0034 0.6622 0.7493 +vn -0.0121 0.6811 0.7321 +vn -0.2810 0.5914 0.7559 +vn 0.0121 0.6811 0.7321 +vn -0.0034 0.6622 0.7493 +vn 0.2643 0.5756 0.7738 +vn 0.2810 0.5914 0.7559 +vn 0.2665 0.6372 0.7231 +vn 0.4834 0.5317 0.6955 +vn 0.4964 0.5449 0.6758 +vn 0.2712 0.6563 0.7041 +vn -0.4964 0.5449 0.6758 +vn -0.4834 0.5317 0.6955 +vn -0.2665 0.6372 0.7231 +vn -0.2712 0.6563 0.7041 +vn 0.2698 0.7839 0.5592 +vn 0.5355 0.6437 0.5467 +vn 0.5442 0.6864 0.4824 +vn 0.2616 0.8339 0.4859 +vn -0.5442 0.6864 0.4824 +vn -0.5355 0.6437 0.5467 +vn -0.2698 0.7839 0.5592 +vn -0.2616 0.8339 0.4859 +vn 0.7396 0.4071 0.5360 +vn 0.8350 0.1471 0.5302 +vn 0.8697 0.1571 0.4679 +vn 0.7654 0.4336 0.4755 +vn -0.8697 0.1571 0.4679 +vn -0.8350 0.1471 0.5302 +vn -0.7396 0.4071 0.5360 +vn -0.7654 0.4336 0.4755 +vn 0.6612 0.3238 0.6768 +vn 0.7296 0.1099 0.6750 +vn 0.7487 0.1206 0.6518 +vn 0.6727 0.3417 0.6563 +vn -0.7487 0.1206 0.6518 +vn -0.7296 0.1099 0.6750 +vn -0.6612 0.3238 0.6768 +vn -0.6727 0.3417 0.6563 +vn 0.8979 0.1457 0.4155 +vn 0.8088 0.4421 0.3878 +vn 0.7208 0.3667 0.5882 +vn 0.7994 0.0976 0.5928 +vn -0.7208 0.3667 0.5882 +vn -0.8088 0.4421 0.3878 +vn -0.8979 0.1457 0.4155 +vn -0.7994 0.0976 0.5928 +vn 0.5572 0.7508 0.3547 +vn 0.2459 0.9127 0.3264 +vn 0.2579 0.8107 0.5255 +vn 0.5565 0.6116 0.5624 +vn -0.2579 0.8107 0.5255 +vn -0.2459 0.9127 0.3264 +vn -0.5572 0.7508 0.3547 +vn -0.5565 0.6116 0.5624 +vn -0.1284 0.9357 0.3286 +vn -0.4835 0.7944 0.3676 +vn -0.4298 0.7033 0.5662 +vn -0.0514 0.8484 0.5268 +vn 0.4298 0.7033 0.5662 +vn 0.4835 0.7944 0.3676 +vn 0.1284 0.9357 0.3286 +vn 0.0514 0.8484 0.5268 +vn -0.7740 0.4956 0.3941 +vn -0.9044 0.1782 0.3877 +vn -0.8385 0.1470 0.5247 +vn -0.6746 0.4757 0.5644 +vn 0.8385 0.1470 0.5247 +vn 0.9044 0.1782 0.3877 +vn 0.7740 0.4956 0.3941 +vn 0.6746 0.4757 0.5644 +vn -0.9014 -0.1851 0.3913 +vn -0.7496 -0.5180 0.4121 +vn -0.6662 -0.5074 0.5465 +vn -0.8390 -0.1538 0.5220 +vn 0.6662 -0.5074 0.5465 +vn 0.7496 -0.5180 0.4121 +vn 0.9014 -0.1851 0.3913 +vn 0.8390 -0.1538 0.5220 +vn -0.4559 -0.7923 0.4054 +vn -0.1155 -0.9190 0.3771 +vn -0.0661 -0.8733 0.4827 +vn -0.4326 -0.7287 0.5310 +vn 0.0661 -0.8733 0.4827 +vn 0.1155 -0.9190 0.3771 +vn 0.4559 -0.7923 0.4054 +vn 0.4326 -0.7287 0.5310 +vn 0.2516 -0.8928 0.3737 +vn 0.5426 -0.7431 0.3916 +vn 0.5520 -0.6403 0.5341 +vn 0.2546 -0.8374 0.4836 +vn -0.5520 -0.6403 0.5341 +vn -0.5426 -0.7431 0.3916 +vn -0.2516 -0.8928 0.3737 +vn -0.2546 -0.8374 0.4836 +vn 0.7901 -0.4607 0.4043 +vn 0.8956 -0.1513 0.4183 +vn 0.7999 -0.1021 0.5914 +vn 0.7153 -0.3948 0.5766 +vn -0.7999 -0.1021 0.5914 +vn -0.8956 -0.1513 0.4183 +vn -0.7901 -0.4607 0.4043 +vn -0.7153 -0.3948 0.5766 +vn 0.3463 -0.0436 0.9371 +vn 0.4246 -0.1483 0.8932 +vn 0.4653 -0.0290 0.8847 +vn -0.4653 -0.0290 0.8847 +vn -0.4246 -0.1483 0.8932 +vn -0.3463 -0.0436 0.9371 +vn 0.2531 -0.2854 0.9244 +vn 0.3780 -0.2127 0.9010 +vn 0.2775 -0.1178 0.9535 +vn -0.2775 -0.1178 0.9535 +vn -0.3780 -0.2127 0.9010 +vn -0.2531 -0.2854 0.9244 +vn 0.1272 -0.1176 0.9849 +vn -0.0284 -0.2304 0.9727 +vn 0.1457 -0.2960 0.9440 +vn -0.1457 -0.2960 0.9440 +vn 0.0284 -0.2304 0.9727 +vn -0.1272 -0.1176 0.9849 +vn 0.0156 -0.0210 0.9997 +vn -0.1662 -0.0169 0.9859 +vn -0.1075 -0.1515 0.9826 +vn 0.1075 -0.1515 0.9826 +vn 0.1662 -0.0169 0.9859 +vn -0.0156 -0.0210 0.9997 +vn 0.0156 0.0200 0.9997 +vn -0.1069 0.1401 0.9843 +vn -0.1659 0.0162 0.9860 +vn 0.1659 0.0162 0.9860 +vn 0.1069 0.1401 0.9843 +vn -0.0156 0.0200 0.9997 +vn 0.1282 0.1118 0.9854 +vn 0.1503 0.2778 0.9488 +vn -0.0240 0.2162 0.9761 +vn 0.0240 0.2162 0.9761 +vn -0.1503 0.2778 0.9488 +vn -0.1282 0.1118 0.9854 +vn 0.2768 0.1120 0.9544 +vn 0.3758 0.1997 0.9049 +vn 0.2510 0.2681 0.9301 +vn -0.2510 0.2681 0.9301 +vn -0.3758 0.1997 0.9049 +vn -0.2768 0.1120 0.9544 +vn 0.3465 0.0413 0.9372 +vn 0.4650 0.0277 0.8849 +vn 0.4247 0.1372 0.8949 +vn -0.4247 0.1372 0.8949 +vn -0.4650 0.0277 0.8849 +vn -0.3465 0.0413 0.9372 +vn 0.1386 -0.9493 0.2823 +vn 0.1343 -0.8291 0.5428 +vn 0.0586 -0.8311 0.5530 +vn 0.0617 -0.9498 0.3066 +vn -0.0586 -0.8311 0.5530 +vn -0.1343 -0.8291 0.5428 +vn -0.1386 -0.9493 0.2823 +vn -0.0617 -0.9498 0.3066 +vn 0.3460 -0.8864 0.3076 +vn 0.3308 -0.7099 0.6218 +vn 0.1854 -0.8199 0.5416 +vn 0.1804 -0.9479 0.2627 +vn -0.1854 -0.8199 0.5416 +vn -0.3308 -0.7099 0.6218 +vn -0.3460 -0.8864 0.3076 +vn -0.1804 -0.9479 0.2627 +vn 0.8726 -0.2473 0.4212 +vn 0.5837 -0.3099 0.7505 +vn 0.4816 -0.5002 0.7196 +vn 0.6655 -0.6181 0.4184 +vn -0.4816 -0.5002 0.7196 +vn -0.5837 -0.3099 0.7505 +vn -0.8726 -0.2473 0.4212 +vn -0.6655 -0.6181 0.4184 +vn 0.9246 0.0556 0.3769 +vn 0.6879 -0.0206 0.7255 +vn 0.6616 -0.1407 0.7365 +vn 0.9240 -0.0404 0.3803 +vn -0.6616 -0.1407 0.7365 +vn -0.6879 -0.0206 0.7255 +vn -0.9246 0.0556 0.3769 +vn -0.9240 -0.0404 0.3803 +vn 0.9095 0.1563 0.3852 +vn 0.7133 0.0892 0.6952 +vn 0.6931 0.0419 0.7196 +vn 0.9166 0.1049 0.3859 +vn -0.6931 0.0419 0.7196 +vn -0.7133 0.0892 0.6952 +vn -0.9095 0.1563 0.3852 +vn -0.9166 0.1049 0.3859 +vn 0.3722 -0.8474 0.3788 +vn 0.3239 -0.8441 0.4273 +vn 0.3732 -0.6960 0.6134 +vn 0.4153 -0.6949 0.5870 +vn -0.3732 -0.6960 0.6134 +vn -0.3239 -0.8441 0.4273 +vn -0.3722 -0.8474 0.3788 +vn -0.4153 -0.6949 0.5870 +vn 0.3888 -0.7907 0.4728 +vn 0.5118 -0.7186 0.4709 +vn 0.4603 -0.5651 0.6847 +vn 0.3919 -0.6473 0.6538 +vn -0.4603 -0.5651 0.6847 +vn -0.5118 -0.7186 0.4709 +vn -0.3888 -0.7907 0.4728 +vn -0.3919 -0.6473 0.6538 +vn 0.6692 -0.6010 0.4370 +vn 0.7616 -0.4716 0.4444 +vn 0.6577 -0.3656 0.6586 +vn 0.5934 -0.4448 0.6708 +vn -0.6577 -0.3656 0.6586 +vn -0.7616 -0.4716 0.4444 +vn -0.6692 -0.6010 0.4370 +vn -0.5934 -0.4448 0.6708 +vn 0.7994 -0.3620 0.4796 +vn 0.8281 -0.2154 0.5176 +vn 0.5973 -0.3152 0.7375 +vn 0.6416 -0.3429 0.6861 +vn -0.5973 -0.3152 0.7375 +vn -0.8281 -0.2154 0.5176 +vn -0.7994 -0.3620 0.4796 +vn -0.6416 -0.3429 0.6861 +vn 0.7792 0.3032 0.5486 +vn 0.4971 0.7392 0.4544 +vn 0.5156 0.2235 0.8271 +vn 0.5907 -0.1699 0.7888 +vn -0.5156 0.2235 0.8271 +vn -0.4971 0.7392 0.4544 +vn -0.7792 0.3032 0.5486 +vn -0.5907 -0.1699 0.7888 +vn 0.5118 0.7686 0.3839 +vn 0.5510 0.7439 0.3782 +vn 0.4628 0.4217 0.7798 +vn 0.4688 0.4069 0.7840 +vn -0.4628 0.4217 0.7798 +vn -0.5510 0.7439 0.3782 +vn -0.5118 0.7686 0.3839 +vn -0.4688 0.4069 0.7840 +vn 0.6225 0.6683 0.4072 +vn 0.5438 0.7126 0.4432 +vn 0.4234 0.3740 0.8251 +vn 0.4880 0.3713 0.7900 +vn -0.4234 0.3740 0.8251 +vn -0.5438 0.7126 0.4432 +vn -0.6225 0.6683 0.4072 +vn -0.4880 0.3713 0.7900 +vn 0.1427 0.8502 0.5068 +vn -0.3976 0.7662 0.5048 +vn -0.1175 0.3644 0.9238 +vn 0.1878 0.4009 0.8967 +vn 0.1175 0.3644 0.9238 +vn 0.3976 0.7662 0.5048 +vn -0.1427 0.8502 0.5068 +vn -0.1878 0.4009 0.8967 +vn -0.7677 0.4928 0.4097 +vn -0.8422 0.4179 0.3407 +vn -0.5150 0.2551 0.8184 +vn -0.3953 0.2739 0.8768 +vn 0.5150 0.2551 0.8184 +vn 0.8422 0.4179 0.3407 +vn 0.7677 0.4928 0.4097 +vn 0.3953 0.2739 0.8768 +vn -0.7543 0.5615 0.3403 +vn -0.3883 0.8222 0.4162 +vn -0.3145 0.4157 0.8534 +vn -0.5073 0.3177 0.8011 +vn 0.3145 0.4157 0.8534 +vn 0.3883 0.8222 0.4162 +vn 0.7543 0.5615 0.3403 +vn 0.5073 0.3177 0.8011 +vn 0.4513 -0.3587 0.8171 +vn 0.4014 -0.3659 0.8397 +vn 0.3053 -0.2281 0.9245 +vn 0.2972 -0.2387 0.9245 +vn -0.3053 -0.2281 0.9245 +vn -0.4014 -0.3659 0.8397 +vn -0.4513 -0.3587 0.8171 +vn -0.2972 -0.2387 0.9245 +vn 0.2871 -0.3945 0.8729 +vn 0.1555 -0.4262 0.8911 +vn 0.1692 -0.2712 0.9475 +vn 0.2389 -0.2508 0.9381 +vn -0.1692 -0.2712 0.9475 +vn -0.1555 -0.4262 0.8911 +vn -0.2871 -0.3945 0.8729 +vn -0.2389 -0.2508 0.9381 +vn 0.0208 -0.4510 0.8923 +vn 0.0869 -0.3102 0.9467 +vn 0.1083 -0.2879 0.9515 +vn 0.0379 -0.4411 0.8967 +vn -0.1083 -0.2879 0.9515 +vn -0.0869 -0.3102 0.9467 +vn -0.0208 -0.4510 0.8923 +vn -0.0379 -0.4411 0.8967 +vn -0.0053 -0.5709 0.8210 +vn 0.0941 -0.4058 0.9091 +vn 0.0853 -0.3560 0.9306 +vn 0.0342 -0.5096 0.8597 +vn -0.0853 -0.3560 0.9306 +vn -0.0941 -0.4058 0.9091 +vn 0.0053 -0.5709 0.8210 +vn -0.0342 -0.5096 0.8597 +vn 0.0967 -0.3017 0.9485 +vn 0.2907 -0.4003 0.8691 +vn 0.1877 -0.4405 0.8779 +vn 0.0029 -0.4905 0.8714 +vn -0.1877 -0.4405 0.8779 +vn -0.2907 -0.4003 0.8691 +vn -0.0967 -0.3017 0.9485 +vn -0.0029 -0.4905 0.8714 +vn 0.3645 -0.1702 0.9155 +vn 0.4821 -0.2710 0.8332 +vn 0.3780 -0.2958 0.8773 +vn 0.2342 -0.1821 0.9550 +vn -0.3780 -0.2958 0.8773 +vn -0.4821 -0.2710 0.8332 +vn -0.3645 -0.1702 0.9155 +vn -0.2342 -0.1821 0.9550 +vn 0.4084 -0.2560 0.8761 +vn 0.4697 -0.3069 0.8278 +vn 0.5088 -0.2748 0.8159 +vn 0.4167 -0.2150 0.8832 +vn -0.5088 -0.2748 0.8159 +vn -0.4697 -0.3069 0.8278 +vn -0.4084 -0.2560 0.8761 +vn -0.4167 -0.2150 0.8832 +vn 0.3237 -0.3313 0.8863 +vn 0.3712 -0.4418 0.8167 +vn 0.4106 -0.4069 0.8160 +vn 0.3841 -0.3255 0.8640 +vn -0.4106 -0.4069 0.8160 +vn -0.3712 -0.4418 0.8167 +vn -0.3237 -0.3313 0.8863 +vn -0.3841 -0.3255 0.8640 +vn 0.2773 0.0217 0.9605 +vn 0.3758 -0.1066 0.9205 +vn 0.3752 -0.3377 0.8632 +vn 0.3038 -0.1254 0.9444 +vn -0.3752 -0.3377 0.8632 +vn -0.3758 -0.1066 0.9205 +vn -0.2773 0.0217 0.9605 +vn -0.3038 -0.1254 0.9444 +vn 0.0730 0.0954 0.9928 +vn -0.0891 0.0895 0.9920 +vn -0.1548 0.1570 0.9754 +vn -0.0195 0.1299 0.9913 +vn 0.1548 0.1570 0.9754 +vn 0.0891 0.0895 0.9920 +vn -0.0730 0.0954 0.9928 +vn 0.0195 0.1299 0.9913 +vn 0.4037 -0.3369 0.8506 +vn 0.2042 -0.2888 0.9354 +vn 0.1507 -0.2779 0.9487 +vn 0.3030 -0.2626 0.9161 +vn -0.1507 -0.2779 0.9487 +vn -0.2042 -0.2888 0.9354 +vn -0.4037 -0.3369 0.8506 +vn -0.3030 -0.2626 0.9161 +vn 0.1957 -0.1996 0.9601 +vn 0.1170 -0.2806 0.9527 +vn 0.0657 -0.2660 0.9617 +vn 0.0804 -0.1875 0.9790 +vn -0.0657 -0.2660 0.9617 +vn -0.1170 -0.2806 0.9527 +vn -0.1957 -0.1996 0.9601 +vn -0.0804 -0.1875 0.9790 +vn -0.0210 -0.0864 0.9960 +vn -0.0535 -0.0981 0.9937 +vn -0.0077 -0.1827 0.9831 +vn 0.0243 -0.2264 0.9737 +vn 0.0077 -0.1827 0.9831 +vn 0.0535 -0.0981 0.9937 +vn 0.0210 -0.0864 0.9960 +vn -0.0243 -0.2264 0.9737 +vn 0.0882 -0.6473 0.7571 +vn 0.0268 -0.6653 0.7461 +vn 0.0468 -0.7500 0.6598 +vn 0.1148 -0.7353 0.6679 +vn -0.0468 -0.7500 0.6598 +vn -0.0268 -0.6653 0.7461 +vn -0.0882 -0.6473 0.7571 +vn -0.1148 -0.7353 0.6679 +vn 0.2442 -0.4371 0.8656 +vn 0.1519 -0.5765 0.8028 +vn 0.1717 -0.6888 0.7044 +vn 0.2892 -0.5401 0.7904 +vn -0.1717 -0.6888 0.7044 +vn -0.1519 -0.5765 0.8028 +vn -0.2442 -0.4371 0.8656 +vn -0.2892 -0.5401 0.7904 +vn 0.3063 -0.1983 0.9311 +vn 0.3152 -0.2848 0.9053 +vn 0.3730 -0.3737 0.8493 +vn 0.3970 -0.2731 0.8762 +vn -0.3730 -0.3737 0.8493 +vn -0.3152 -0.2848 0.9053 +vn -0.3063 -0.1983 0.9311 +vn -0.3970 -0.2731 0.8762 +vn 0.4643 0.0168 0.8855 +vn 0.2465 -0.0215 0.9689 +vn 0.2582 -0.0387 0.9653 +vn 0.4618 -0.0107 0.8869 +vn -0.2582 -0.0387 0.9653 +vn -0.2465 -0.0215 0.9689 +vn -0.4643 0.0168 0.8855 +vn -0.4618 -0.0107 0.8869 +vn 0.2860 -0.1432 0.9475 +vn 0.4332 -0.1748 0.8842 +vn 0.4652 -0.0608 0.8831 +vn 0.2759 -0.0656 0.9589 +vn -0.4652 -0.0608 0.8831 +vn -0.4332 -0.1748 0.8842 +vn -0.2860 -0.1432 0.9475 +vn -0.2759 -0.0656 0.9589 +vn 0.1046 -0.0387 0.9938 +vn 0.0063 -0.0386 0.9992 +vn -0.0009 0.0123 0.9999 +vn 0.0991 0.0114 0.9950 +vn 0.0009 0.0123 0.9999 +vn -0.0063 -0.0386 0.9992 +vn -0.1046 -0.0387 0.9938 +vn -0.0991 0.0114 0.9950 +vn 0.0992 -0.0540 0.9936 +vn 0.1006 -0.0381 0.9942 +vn 0.0000 -0.0462 0.9989 +vn -0.0006 -0.0602 0.9982 +vn -0.1006 -0.0381 0.9942 +vn -0.0992 -0.0540 0.9936 +vn 0.0006 -0.0602 0.9982 +vn 0.0057 -0.0606 0.9981 +vn 0.1152 -0.0604 0.9915 +vn 0.1106 -0.0465 0.9928 +vn 0.0016 -0.0360 0.9994 +vn -0.1106 -0.0465 0.9928 +vn -0.1152 -0.0604 0.9915 +vn -0.0057 -0.0606 0.9981 +vn -0.0016 -0.0360 0.9994 +vn 0.9181 -0.3140 0.2419 +vn 0.9298 -0.3663 0.0365 +vn 0.6495 -0.7310 0.2091 +vn 0.6386 -0.5515 0.5367 +vn -0.6495 -0.7310 0.2091 +vn -0.9298 -0.3663 0.0365 +vn -0.9181 -0.3140 0.2419 +vn -0.6386 -0.5515 0.5367 +vn 0.8574 0.5147 -0.0009 +vn 0.8786 0.4623 -0.1194 +vn 0.9952 0.0944 -0.0247 +vn 0.9890 0.1168 0.0907 +vn -0.9952 0.0944 -0.0247 +vn -0.8786 0.4623 -0.1194 +vn -0.8574 0.5147 -0.0009 +vn -0.9890 0.1168 0.0907 +vn -0.1074 0.7962 0.5954 +vn -0.1392 0.9876 -0.0731 +vn 0.3922 0.8867 -0.2450 +vn 0.3756 0.8780 0.2967 +vn -0.3922 0.8867 -0.2450 +vn 0.1392 0.9876 -0.0731 +vn 0.1074 0.7962 0.5954 +vn -0.3756 0.8780 0.2967 +vn -0.0108 0.7592 0.6508 +vn -0.7251 0.6838 0.0816 +vn -0.6736 0.6928 0.2575 +vn -0.5064 0.3843 0.7719 +vn 0.6736 0.6928 0.2575 +vn 0.7251 0.6838 0.0816 +vn 0.0108 0.7592 0.6508 +vn 0.5064 0.3843 0.7719 +vn 0.1232 -0.5545 0.8230 +vn 0.3364 -0.5638 0.7543 +vn 0.4669 -0.8186 0.3345 +vn 0.2183 -0.8974 0.3834 +vn -0.4669 -0.8186 0.3345 +vn -0.3364 -0.5638 0.7543 +vn -0.1232 -0.5545 0.8230 +vn -0.2183 -0.8974 0.3834 +vn 0.1820 -0.7319 0.6567 +vn 0.3599 -0.6937 0.6240 +vn 0.2443 -0.5823 0.7754 +vn 0.1174 -0.5306 0.8395 +vn -0.2443 -0.5823 0.7754 +vn -0.3599 -0.6937 0.6240 +vn -0.1820 -0.7319 0.6567 +vn -0.1174 -0.5306 0.8395 +vn -0.5357 0.7829 0.3162 +vn -0.2783 0.5637 0.7777 +vn -0.3046 0.5671 0.7652 +vn -0.5652 0.7127 0.4155 +vn 0.3046 0.5671 0.7652 +vn 0.2783 0.5637 0.7777 +vn 0.5357 0.7829 0.3162 +vn 0.5652 0.7127 0.4155 +vn -0.1157 0.9130 0.3912 +vn -0.0573 0.6306 0.7740 +vn 0.2624 0.5592 0.7864 +vn 0.4019 0.8455 0.3517 +vn -0.2624 0.5592 0.7864 +vn 0.0573 0.6306 0.7740 +vn 0.1157 0.9130 0.3912 +vn -0.4019 0.8455 0.3517 +vn 0.8110 0.4558 0.3668 +vn 0.4776 0.3746 0.7947 +vn 0.5212 0.1040 0.8471 +vn 0.9205 0.1167 0.3730 +vn -0.5212 0.1040 0.8471 +vn -0.4776 0.3746 0.7947 +vn -0.8110 0.4558 0.3668 +vn -0.9205 0.1167 0.3730 +vn 0.8092 -0.4216 0.4092 +vn 0.4019 -0.3967 0.8253 +vn 0.2733 -0.6372 0.7206 +vn 0.4566 -0.7153 0.5290 +vn -0.2733 -0.6372 0.7206 +vn -0.4019 -0.3967 0.8253 +vn -0.8092 -0.4216 0.4092 +vn -0.4566 -0.7153 0.5290 +vn -0.0039 0.1724 0.9850 +vn 0.1180 0.0811 0.9897 +vn 0.1769 0.3231 0.9297 +vn -0.0405 0.3806 0.9239 +vn -0.1769 0.3231 0.9297 +vn -0.1180 0.0811 0.9897 +vn 0.0039 0.1724 0.9850 +vn 0.0405 0.3806 0.9239 +vn -0.0169 -0.1911 0.9814 +vn 0.0452 -0.4015 0.9148 +vn 0.1316 -0.5000 0.8560 +vn 0.0762 -0.2808 0.9567 +vn -0.1316 -0.5000 0.8560 +vn -0.0452 -0.4015 0.9148 +vn 0.0169 -0.1911 0.9814 +vn -0.0762 -0.2808 0.9567 +vn -0.1258 -0.0262 0.9917 +vn -0.3067 -0.2224 0.9254 +vn -0.2398 -0.0343 0.9702 +vn -0.2423 0.0220 0.9700 +vn 0.2398 -0.0343 0.9702 +vn 0.3067 -0.2224 0.9254 +vn 0.1258 -0.0262 0.9917 +vn 0.2423 0.0220 0.9700 +vn -0.2695 -0.2832 0.9204 +vn 0.4785 -0.1181 0.8701 +vn 0.7159 -0.1356 0.6849 +vn 0.2945 -0.2960 0.9086 +vn -0.7159 -0.1356 0.6849 +vn -0.4785 -0.1181 0.8701 +vn 0.2695 -0.2832 0.9204 +vn -0.2945 -0.2960 0.9086 +vn 0.5980 -0.1937 0.7777 +vn 0.4002 -0.1785 0.8989 +vn 0.6366 0.0239 0.7708 +vn 0.7142 -0.0813 0.6952 +vn -0.6366 0.0239 0.7708 +vn -0.4002 -0.1785 0.8989 +vn -0.5980 -0.1937 0.7777 +vn -0.7142 -0.0813 0.6952 +vn 0.2856 -0.0108 0.9583 +vn 0.2432 0.0154 0.9699 +vn 0.4897 0.0613 0.8698 +vn 0.5478 0.0816 0.8326 +vn -0.4897 0.0613 0.8698 +vn -0.2432 0.0154 0.9699 +vn -0.2856 -0.0108 0.9583 +vn -0.5478 0.0816 0.8326 +vn 0.8932 0.2569 0.3691 +vn 0.8819 0.3300 0.3365 +vn 0.7877 0.2287 0.5720 +vn 0.7460 0.1691 0.6441 +vn -0.7877 0.2287 0.5720 +vn -0.8819 0.3300 0.3365 +vn -0.8932 0.2569 0.3691 +vn -0.7460 0.1691 0.6441 +vn 0.9006 0.2989 0.3155 +vn 0.9190 0.2536 0.3017 +vn 0.8801 0.1254 0.4579 +vn 0.8359 0.2064 0.5087 +vn -0.8801 0.1254 0.4579 +vn -0.9190 0.2536 0.3017 +vn -0.9006 0.2989 0.3155 +vn -0.8359 0.2064 0.5087 +vn 0.8200 -0.4526 0.3504 +vn 0.8136 -0.2784 0.5104 +vn 0.9110 0.0767 0.4053 +vn 0.9332 0.2382 0.2690 +vn -0.9110 0.0767 0.4053 +vn -0.8136 -0.2784 0.5104 +vn -0.8200 -0.4526 0.3504 +vn -0.9332 0.2382 0.2690 +vn 0.0798 -0.2245 0.9712 +vn 0.0520 -0.3423 0.9381 +vn 0.1527 -0.8959 0.4171 +vn 0.0593 -0.8662 0.4962 +vn -0.1527 -0.8959 0.4171 +vn -0.0520 -0.3423 0.9381 +vn -0.0798 -0.2245 0.9712 +vn -0.0593 -0.8662 0.4962 +vn 0.2086 -0.2434 0.9472 +vn 0.1842 -0.1704 0.9680 +vn -0.6732 -0.4369 0.5966 +vn -0.7792 -0.0464 0.6250 +vn 0.6732 -0.4369 0.5966 +vn -0.1842 -0.1704 0.9680 +vn -0.2086 -0.2434 0.9472 +vn 0.7792 -0.0464 0.6250 +vn 0.0328 -0.4066 0.9130 +vn 0.1141 -0.3580 0.9267 +vn -0.6856 0.1952 0.7014 +vn -0.5422 0.4296 0.7222 +vn 0.6856 0.1952 0.7014 +vn -0.1141 -0.3580 0.9267 +vn -0.0328 -0.4066 0.9130 +vn 0.5422 0.4296 0.7222 +vn -0.0048 -0.4085 0.9127 +vn 0.0028 -0.4061 0.9138 +vn -0.3110 0.6339 0.7081 +vn -0.0698 0.7044 0.7064 +vn 0.3110 0.6339 0.7081 +vn -0.0028 -0.4061 0.9138 +vn 0.0048 -0.4085 0.9127 +vn 0.0698 0.7044 0.7064 +vn -0.0780 0.9331 0.3511 +vn -0.3459 0.8768 0.3340 +vn -0.2793 0.7214 0.6337 +vn -0.0703 0.7184 0.6921 +vn 0.2793 0.7214 0.6337 +vn 0.3459 0.8768 0.3340 +vn 0.0780 0.9331 0.3511 +vn 0.0703 0.7184 0.6921 +vn -0.6231 0.7311 0.2777 +vn -0.8422 0.5039 0.1918 +vn -0.8465 0.4826 0.2250 +vn -0.5486 0.7208 0.4238 +vn 0.8465 0.4826 0.2250 +vn 0.8422 0.5039 0.1918 +vn 0.6231 0.7311 0.2777 +vn 0.5486 0.7208 0.4238 +vn -0.9846 0.1370 0.1084 +vn -0.8783 -0.4631 0.1187 +vn -0.7484 -0.5799 0.3217 +vn -0.9709 0.1792 0.1589 +vn 0.7484 -0.5799 0.3217 +vn 0.8783 -0.4631 0.1187 +vn 0.9846 0.1370 0.1084 +vn 0.9709 0.1792 0.1589 +vn 0.0703 -0.9817 0.1769 +vn 0.1584 -0.9714 0.1770 +vn 0.1269 -0.8843 0.4493 +vn 0.0888 -0.8956 0.4360 +vn -0.1269 -0.8843 0.4493 +vn -0.1584 -0.9714 0.1770 +vn -0.0703 -0.9817 0.1769 +vn -0.0888 -0.8956 0.4360 +vn 0.0412 -0.4702 0.8816 +vn -0.0091 -0.0868 0.9962 +vn -0.0145 -0.0876 0.9961 +vn 0.0673 -0.4848 0.8720 +vn 0.0145 -0.0876 0.9961 +vn 0.0091 -0.0868 0.9962 +vn -0.0412 -0.4702 0.8816 +vn -0.0673 -0.4848 0.8720 +vn -0.0608 -0.4990 0.8645 +vn -0.0210 -0.0299 0.9993 +vn -0.8477 0.2291 0.4784 +vn 0.8477 0.2291 0.4784 +vn 0.0210 -0.0299 0.9993 +vn 0.0608 -0.4990 0.8645 +vn -0.2258 -0.1698 0.9593 +vn -0.2384 -0.1937 0.9517 +vn -0.3201 -0.2054 0.9249 +vn -0.2647 -0.1414 0.9539 +vn 0.3201 -0.2054 0.9249 +vn 0.2384 -0.1937 0.9517 +vn 0.2258 -0.1698 0.9593 +vn 0.2647 -0.1414 0.9539 +vn -0.0559 -0.0784 0.9954 +vn -0.1589 -0.1119 0.9809 +vn -0.2196 -0.0592 0.9738 +vn -0.1602 -0.0133 0.9870 +vn 0.2196 -0.0592 0.9738 +vn 0.1589 -0.1119 0.9809 +vn 0.0559 -0.0784 0.9954 +vn 0.1602 -0.0133 0.9870 +vn 0.1080 -0.0820 0.9908 +vn 0.0337 -0.0812 0.9961 +vn -0.0985 0.0004 0.9951 +vn -0.0416 0.0293 0.9987 +vn 0.0985 0.0004 0.9951 +vn -0.0337 -0.0812 0.9961 +vn -0.1080 -0.0820 0.9908 +vn 0.0416 0.0293 0.9987 +vn -0.2294 -0.1590 0.9602 +vn -0.0707 -0.2584 0.9634 +vn -0.3075 -0.5433 0.7812 +vn -0.4120 -0.2694 0.8704 +vn 0.3075 -0.5433 0.7812 +vn 0.0707 -0.2584 0.9634 +vn 0.2294 -0.1590 0.9602 +vn 0.4120 -0.2694 0.8704 +vn 0.0675 -0.3683 0.9272 +vn 0.1214 -0.4982 0.8586 +vn 0.0574 -0.6162 0.7855 +vn -0.1165 -0.6608 0.7415 +vn -0.0574 -0.6162 0.7855 +vn -0.1214 -0.4982 0.8586 +vn -0.0675 -0.3683 0.9272 +vn 0.1165 -0.6608 0.7415 +vn 0.2874 -0.5650 0.7734 +vn 0.4513 -0.4912 0.7450 +vn 0.4493 -0.4744 0.7570 +vn 0.2727 -0.5515 0.7883 +vn -0.4493 -0.4744 0.7570 +vn -0.4513 -0.4912 0.7450 +vn -0.2874 -0.5650 0.7734 +vn -0.2727 -0.5515 0.7883 +vn 0.5072 -0.3954 0.7658 +vn 0.5127 -0.2828 0.8107 +vn 0.4975 -0.2184 0.8395 +vn 0.5175 -0.3628 0.7750 +vn -0.4975 -0.2184 0.8395 +vn -0.5127 -0.2828 0.8107 +vn -0.5072 -0.3954 0.7658 +vn -0.5175 -0.3628 0.7750 +vn 0.4826 -0.1550 0.8620 +vn 0.4265 -0.0825 0.9007 +vn 0.4601 -0.0647 0.8855 +vn 0.4597 -0.1218 0.8797 +vn -0.4601 -0.0647 0.8855 +vn -0.4265 -0.0825 0.9007 +vn -0.4826 -0.1550 0.8620 +vn -0.4597 -0.1218 0.8797 +vn 0.3552 -0.0597 0.9329 +vn 0.3088 -0.0828 0.9475 +vn 0.4678 0.0809 0.8801 +vn 0.4599 0.0091 0.8879 +vn -0.4678 0.0809 0.8801 +vn -0.3088 -0.0828 0.9475 +vn -0.3552 -0.0597 0.9329 +vn -0.4599 0.0091 0.8879 +vn 0.3479 -0.0238 0.9372 +vn 0.3614 0.1372 0.9223 +vn 0.4598 0.4842 0.7445 +vn 0.5038 0.2537 0.8257 +vn -0.4598 0.4842 0.7445 +vn -0.3614 0.1372 0.9223 +vn -0.3479 -0.0238 0.9372 +vn -0.5038 0.2537 0.8257 +vn 0.2612 0.1393 0.9552 +vn 0.1375 -0.0082 0.9905 +vn 0.1358 0.4258 0.8946 +vn 0.3136 0.5519 0.7727 +vn -0.1358 0.4258 0.8946 +vn -0.1375 -0.0082 0.9905 +vn -0.2612 0.1393 0.9552 +vn -0.3136 0.5519 0.7727 +vn 0.1749 -0.0932 0.9802 +vn 0.2118 -0.0874 0.9734 +vn 0.1272 0.2678 0.9550 +vn 0.1533 0.2998 0.9416 +vn -0.1272 0.2678 0.9550 +vn -0.2118 -0.0874 0.9734 +vn -0.1749 -0.0932 0.9802 +vn -0.1533 0.2998 0.9416 +vn 0.2023 -0.0731 0.9766 +vn 0.1716 -0.0703 0.9827 +vn 0.0039 0.1042 0.9946 +vn 0.0433 0.1989 0.9791 +vn -0.0039 0.1042 0.9946 +vn -0.1716 -0.0703 0.9827 +vn -0.2023 -0.0731 0.9766 +vn -0.0433 0.1989 0.9791 +vn 0.1764 -0.1175 0.9773 +vn 0.2503 -0.2080 0.9456 +vn 0.3984 -0.4479 0.8004 +vn 0.2580 -0.3856 0.8858 +vn -0.3984 -0.4479 0.8004 +vn -0.2503 -0.2080 0.9456 +vn -0.1764 -0.1175 0.9773 +vn -0.2580 -0.3856 0.8858 +vn 0.1419 -0.0502 0.9886 +vn 0.2098 -0.0241 0.9774 +vn 0.2619 -0.2812 0.9232 +vn 0.1641 -0.3470 0.9234 +vn -0.2619 -0.2812 0.9232 +vn -0.2098 -0.0241 0.9774 +vn -0.1419 -0.0502 0.9886 +vn -0.1641 -0.3470 0.9234 +vn 0.0634 -0.1816 0.9813 +vn -0.0526 -0.1007 0.9935 +vn -0.0843 -0.5566 0.8265 +vn -0.1348 -0.7754 0.6169 +vn 0.0843 -0.5566 0.8265 +vn 0.0526 -0.1007 0.9935 +vn -0.0634 -0.1816 0.9813 +vn 0.1348 -0.7754 0.6169 +vn 0.2005 -0.5067 0.8385 +vn 0.2383 -0.4064 0.8821 +vn -0.0812 -0.8427 0.5322 +vn -0.0640 -0.7747 0.6291 +vn 0.0812 -0.8427 0.5322 +vn -0.2383 -0.4064 0.8821 +vn -0.2005 -0.5067 0.8385 +vn 0.0640 -0.7747 0.6291 +vn -0.0332 -0.1172 0.9925 +vn 0.0578 -0.3461 0.9364 +vn -0.2133 -0.5362 0.8167 +vn -0.3840 -0.1907 0.9034 +vn 0.2133 -0.5362 0.8167 +vn -0.0578 -0.3461 0.9364 +vn 0.0332 -0.1172 0.9925 +vn 0.3840 -0.1907 0.9034 +vn 0.0282 0.0488 0.9984 +vn -0.0202 -0.0708 0.9973 +vn -0.3871 -0.0442 0.9210 +vn -0.2847 0.1800 0.9416 +vn 0.3871 -0.0442 0.9210 +vn 0.0202 -0.0708 0.9973 +vn -0.0282 0.0488 0.9984 +vn 0.2847 0.1800 0.9416 +vn 0.1824 0.1695 0.9685 +vn 0.1217 0.1677 0.9783 +vn -0.1675 0.3787 0.9103 +vn -0.1537 0.5074 0.8479 +vn 0.1675 0.3787 0.9103 +vn -0.1217 0.1677 0.9783 +vn -0.1824 0.1695 0.9685 +vn 0.1537 0.5074 0.8479 +vn 0.2256 0.0966 0.9694 +vn 0.2015 0.1231 0.9717 +vn -0.0956 0.6021 0.7927 +vn 0.1063 0.6268 0.7719 +vn 0.0956 0.6021 0.7927 +vn -0.2015 0.1231 0.9717 +vn -0.2256 0.0966 0.9694 +vn -0.1063 0.6268 0.7719 +vn 0.2622 0.1395 0.9549 +vn 0.2597 0.0956 0.9610 +vn 0.2912 0.6006 0.7447 +vn 0.3719 0.6010 0.7074 +vn -0.2912 0.6006 0.7447 +vn -0.2597 0.0956 0.9610 +vn -0.2622 0.1395 0.9549 +vn -0.3719 0.6010 0.7074 +vn 0.3148 0.2739 0.9088 +vn 0.2388 0.2541 0.9372 +vn 0.4401 0.5783 0.6869 +vn 0.5832 0.4491 0.6769 +vn -0.4401 0.5783 0.6869 +vn -0.2388 0.2541 0.9372 +vn -0.3148 0.2739 0.9088 +vn -0.5832 0.4491 0.6769 +vn 0.3567 -0.2066 0.9111 +vn 0.4345 -0.1666 0.8851 +vn 0.7213 -0.3143 0.6171 +vn 0.5757 -0.4001 0.7131 +vn -0.7213 -0.3143 0.6171 +vn -0.4345 -0.1666 0.8851 +vn -0.3567 -0.2066 0.9111 +vn -0.5757 -0.4001 0.7131 +vn 0.4936 -0.1029 0.8636 +vn 0.5275 -0.0396 0.8487 +vn 0.8125 -0.0300 0.5822 +vn 0.8067 -0.1577 0.5695 +vn -0.8125 -0.0300 0.5822 +vn -0.5275 -0.0396 0.8487 +vn -0.4936 -0.1029 0.8636 +vn -0.8067 -0.1577 0.5695 +vn 0.5351 0.0166 0.8446 +vn 0.4751 0.1342 0.8696 +vn 0.7355 0.2376 0.6345 +vn 0.7983 0.0611 0.5992 +vn -0.7355 0.2376 0.6345 +vn -0.4751 0.1342 0.8696 +vn -0.5351 0.0166 0.8446 +vn -0.7983 0.0611 0.5992 +vn -0.3564 0.9338 -0.0305 +vn -0.7591 0.6384 -0.1271 +vn -0.5797 0.7783 -0.2414 +vn -0.2594 0.9642 0.0554 +vn 0.5797 0.7783 -0.2414 +vn 0.7591 0.6384 -0.1271 +vn 0.3564 0.9338 -0.0305 +vn 0.2594 0.9642 0.0554 +vn -0.8771 0.4457 -0.1790 +vn -0.8328 0.5224 -0.1830 +vn -0.6598 0.4172 -0.6250 +vn -0.7028 0.4505 -0.5506 +vn 0.6598 0.4172 -0.6250 +vn 0.8328 0.5224 -0.1830 +vn 0.8771 0.4457 -0.1790 +vn 0.7028 0.4505 -0.5506 +vn -0.5042 0.8445 -0.1802 +vn 0.0443 0.9871 -0.1536 +vn -0.0365 0.7633 -0.6450 +vn -0.4474 0.6254 -0.6393 +vn 0.0365 0.7633 -0.6450 +vn -0.0443 0.9871 -0.1536 +vn 0.5042 0.8445 -0.1802 +vn 0.4474 0.6254 -0.6393 +vn 0.5129 0.8527 -0.0992 +vn 0.5986 0.7955 -0.0935 +vn 0.3523 0.7129 -0.6063 +vn 0.2944 0.7072 -0.6428 +vn -0.3523 0.7129 -0.6063 +vn -0.5986 0.7955 -0.0935 +vn -0.5129 0.8527 -0.0992 +vn -0.2944 0.7072 -0.6428 +vn 0.4899 0.8644 -0.1133 +vn 0.4236 0.8993 -0.1091 +vn 0.3649 0.8952 -0.2560 +vn 0.2923 0.8660 -0.4058 +vn -0.3649 0.8952 -0.2560 +vn -0.4236 0.8993 -0.1091 +vn -0.4899 0.8644 -0.1133 +vn -0.2923 0.8660 -0.4058 +vn 0.3764 0.9214 -0.0963 +vn 0.7040 0.6980 -0.1314 +vn 0.6182 0.7171 -0.3220 +vn 0.3362 0.9097 -0.2437 +vn -0.6182 0.7171 -0.3220 +vn -0.7040 0.6980 -0.1314 +vn -0.3764 0.9214 -0.0963 +vn -0.3362 0.9097 -0.2437 +vn 0.9785 0.1332 -0.1572 +vn 0.9637 -0.2187 -0.1534 +vn 0.9565 -0.1523 -0.2490 +vn 0.9064 0.2479 -0.3419 +vn -0.9565 -0.1523 -0.2490 +vn -0.9637 -0.2187 -0.1534 +vn -0.9785 0.1332 -0.1572 +vn -0.9064 0.2479 -0.3419 +vn 0.7948 -0.5913 -0.1362 +vn 0.6242 -0.7712 -0.1248 +vn 0.6455 -0.7567 -0.1032 +vn 0.8063 -0.5677 -0.1663 +vn -0.6455 -0.7567 -0.1032 +vn -0.6242 -0.7712 -0.1248 +vn -0.7948 -0.5913 -0.1362 +vn -0.8063 -0.5677 -0.1663 +vn 0.5227 -0.8454 -0.1101 +vn 0.3980 -0.9141 -0.0778 +vn 0.3905 -0.9135 -0.1145 +vn 0.5293 -0.8441 -0.0856 +vn -0.3905 -0.9135 -0.1145 +vn -0.3980 -0.9141 -0.0778 +vn -0.5227 -0.8454 -0.1101 +vn -0.5293 -0.8441 -0.0856 +vn 0.1166 -0.3653 -0.9235 +vn 0.1076 -0.6595 -0.7439 +vn 0.3922 -0.6625 -0.6382 +vn 0.3326 -0.4061 -0.8512 +vn -0.3922 -0.6625 -0.6382 +vn -0.1076 -0.6595 -0.7439 +vn -0.1166 -0.3653 -0.9235 +vn -0.3326 -0.4061 -0.8512 +vn 0.1160 -0.1703 -0.9785 +vn 0.1322 -0.1441 -0.9807 +vn 0.2652 -0.1327 -0.9550 +vn 0.2000 -0.1204 -0.9724 +vn -0.2652 -0.1327 -0.9550 +vn -0.1322 -0.1441 -0.9807 +vn -0.1160 -0.1703 -0.9785 +vn -0.2000 -0.1204 -0.9724 +vn 0.0451 -0.6037 -0.7959 +vn 0.0837 -0.3802 -0.9211 +vn 0.1298 -0.3022 -0.9444 +vn 0.0547 -0.5316 -0.8452 +vn -0.1298 -0.3022 -0.9444 +vn -0.0837 -0.3802 -0.9211 +vn -0.0451 -0.6037 -0.7959 +vn -0.0547 -0.5316 -0.8452 +vn 0.1217 -0.9915 -0.0468 +vn 0.0585 -0.9983 -0.0057 +vn 0.0465 -0.8981 -0.4373 +vn 0.0769 -0.8687 -0.4894 +vn -0.0465 -0.8981 -0.4373 +vn -0.0585 -0.9983 -0.0057 +vn -0.1217 -0.9915 -0.0468 +vn -0.0769 -0.8687 -0.4894 +vn 0.3393 -0.9324 -0.1249 +vn 0.1387 -0.9870 -0.0813 +vn 0.0505 -0.8376 -0.5439 +vn 0.2706 -0.7206 -0.6383 +vn -0.0505 -0.8376 -0.5439 +vn -0.1387 -0.9870 -0.0813 +vn -0.3393 -0.9324 -0.1249 +vn -0.2706 -0.7206 -0.6383 +vn 0.9901 -0.0290 -0.1370 +vn 0.8533 -0.4971 -0.1573 +vn 0.6430 -0.3347 -0.6889 +vn 0.8299 0.0726 -0.5532 +vn -0.6430 -0.3347 -0.6889 +vn -0.8533 -0.4971 -0.1573 +vn -0.9901 -0.0290 -0.1370 +vn -0.8299 0.0726 -0.5532 +vn 0.9779 0.1391 -0.1563 +vn 0.9834 0.0973 -0.1531 +vn 0.8402 0.1390 -0.5241 +vn 0.8528 0.1497 -0.5003 +vn -0.8402 0.1390 -0.5241 +vn -0.9834 0.0973 -0.1531 +vn -0.9779 0.1391 -0.1563 +vn -0.8528 0.1497 -0.5003 +vn 0.3822 0.0370 -0.9233 +vn 0.1532 -0.0625 -0.9862 +vn 0.2688 -0.0768 -0.9601 +vn 0.4965 0.0463 -0.8668 +vn -0.2688 -0.0768 -0.9601 +vn -0.1532 -0.0625 -0.9862 +vn -0.3822 0.0370 -0.9233 +vn -0.4965 0.0463 -0.8668 +vn 0.2653 -0.0694 -0.9617 +vn 0.2074 -0.3516 -0.9129 +vn -0.0068 -0.4342 -0.9008 +vn 0.0694 -0.2037 -0.9766 +vn 0.0068 -0.4342 -0.9008 +vn -0.2074 -0.3516 -0.9129 +vn -0.2653 -0.0694 -0.9617 +vn -0.0694 -0.2037 -0.9766 +vn 0.8652 -0.0990 -0.4915 +vn 0.6745 -0.0524 -0.7364 +vn 0.5096 -0.3034 -0.8051 +vn 0.7347 -0.4575 -0.5009 +vn -0.5096 -0.3034 -0.8051 +vn -0.6745 -0.0524 -0.7364 +vn -0.8652 -0.0990 -0.4915 +vn -0.7347 -0.4575 -0.5009 +vn 0.9760 0.1734 -0.1315 +vn 0.9766 0.1421 -0.1614 +vn 0.8686 0.1168 -0.4815 +vn 0.9026 0.1251 -0.4119 +vn -0.8686 0.1168 -0.4815 +vn -0.9766 0.1421 -0.1614 +vn -0.9760 0.1734 -0.1315 +vn -0.9026 0.1251 -0.4119 +vn 0.9500 0.3122 -0.0030 +vn 0.9982 -0.0173 0.0582 +vn 0.9481 0.0117 0.3177 +vn 0.9543 0.2977 0.0279 +vn -0.9481 0.0117 0.3177 +vn -0.9982 -0.0173 0.0582 +vn -0.9500 0.3122 -0.0030 +vn -0.9543 0.2977 0.0279 +vn 0.9603 0.2707 -0.0676 +vn 0.9275 0.2098 -0.3095 +vn 0.9821 0.0949 -0.1626 +vn 0.9388 0.3437 -0.0214 +vn -0.9821 0.0949 -0.1626 +vn -0.9275 0.2098 -0.3095 +vn -0.9603 0.2707 -0.0676 +vn -0.9388 0.3437 -0.0214 +vn 0.8296 -0.5488 0.1030 +vn 0.9457 0.3168 0.0726 +vn 0.8760 0.0949 0.4729 +vn 0.7087 -0.6925 0.1349 +vn -0.8760 0.0949 0.4729 +vn -0.9457 0.3168 0.0726 +vn -0.8296 -0.5488 0.1030 +vn -0.7087 -0.6925 0.1349 +vn 0.3328 -0.9408 0.0643 +vn 0.3508 -0.9237 -0.1541 +vn 0.2658 -0.9516 -0.1540 +vn 0.2867 -0.9579 -0.0140 +vn -0.2658 -0.9516 -0.1540 +vn -0.3508 -0.9237 -0.1541 +vn -0.3328 -0.9408 0.0643 +vn -0.2867 -0.9579 -0.0140 +vn 0.2001 -0.3621 -0.9104 +vn 0.3877 -0.3624 -0.8475 +vn 0.3717 -0.6029 -0.7060 +vn 0.1837 -0.6210 -0.7620 +vn -0.3717 -0.6029 -0.7060 +vn -0.3877 -0.3624 -0.8475 +vn -0.2001 -0.3621 -0.9104 +vn -0.1837 -0.6210 -0.7620 +vn 0.1674 -0.7953 -0.5827 +vn 0.3752 -0.7647 -0.5239 +vn 0.3702 -0.8633 -0.3429 +vn 0.1532 -0.9078 -0.3904 +vn -0.3702 -0.8633 -0.3429 +vn -0.3752 -0.7647 -0.5239 +vn -0.1674 -0.7953 -0.5827 +vn -0.1532 -0.9078 -0.3904 +vn 0.1434 -0.9658 -0.2160 +vn 0.3709 -0.9131 -0.1693 +vn 0.4174 -0.9043 -0.0900 +vn 0.1491 -0.9771 -0.1519 +vn -0.4174 -0.9043 -0.0900 +vn -0.3709 -0.9131 -0.1693 +vn -0.1434 -0.9658 -0.2160 +vn -0.1491 -0.9771 -0.1519 +vn 0.1583 -0.9716 -0.1759 +vn 0.4540 -0.8829 -0.1201 +vn 0.4500 -0.8195 -0.3547 +vn 0.1403 -0.8925 -0.4286 +vn -0.4500 -0.8195 -0.3547 +vn -0.4540 -0.8829 -0.1201 +vn -0.1583 -0.9716 -0.1759 +vn -0.1403 -0.8925 -0.4286 +vn 0.9614 -0.0417 -0.2720 +vn 0.8401 -0.4844 -0.2441 +vn 0.7790 -0.6253 0.0474 +vn 0.9544 -0.2980 -0.0169 +vn -0.7790 -0.6253 0.0474 +vn -0.8401 -0.4844 -0.2441 +vn -0.9614 -0.0417 -0.2720 +vn -0.9544 -0.2980 -0.0169 +vn 0.8706 -0.4755 0.1265 +vn 0.7279 -0.6600 0.1863 +vn 0.7927 -0.5636 0.2325 +vn 0.9198 -0.3521 0.1734 +vn -0.7927 -0.5636 0.2325 +vn -0.7279 -0.6600 0.1863 +vn -0.8706 -0.4755 0.1265 +vn -0.9198 -0.3521 0.1734 +vn 0.1902 0.1157 -0.9749 +vn 0.3826 0.0540 -0.9223 +vn 0.3800 -0.2095 -0.9009 +vn 0.1936 -0.1523 -0.9692 +vn -0.3800 -0.2095 -0.9009 +vn -0.3826 0.0540 -0.9223 +vn -0.1902 0.1157 -0.9749 +vn -0.1936 -0.1523 -0.9692 +vn 0.0678 0.9096 0.4099 +vn 0.2460 0.8772 0.4124 +vn 0.2136 0.9693 0.1216 +vn 0.0558 0.9914 0.1182 +vn -0.2136 0.9693 0.1216 +vn -0.2460 0.8772 0.4124 +vn -0.0678 0.9096 0.4099 +vn -0.0558 0.9914 0.1182 +vn 0.0569 0.9940 -0.0937 +vn 0.2050 0.9744 -0.0926 +vn 0.2483 0.8867 -0.3900 +vn 0.0911 0.9275 -0.3625 +vn -0.2483 0.8867 -0.3900 +vn -0.2050 0.9744 -0.0926 +vn -0.0569 0.9940 -0.0937 +vn -0.0911 0.9275 -0.3625 +vn 0.1577 0.7390 -0.6550 +vn 0.3386 0.6702 -0.6605 +vn 0.3926 0.4285 -0.8138 +vn 0.1938 0.4878 -0.8512 +vn -0.3926 0.4285 -0.8138 +vn -0.3386 0.6702 -0.6605 +vn -0.1577 0.7390 -0.6550 +vn -0.1938 0.4878 -0.8512 +vn 0.3769 0.9123 -0.1600 +vn 0.6401 0.7324 -0.2320 +vn 0.6878 0.7206 0.0877 +vn 0.4445 0.8780 0.1777 +vn -0.6878 0.7206 0.0877 +vn -0.6401 0.7324 -0.2320 +vn -0.3769 0.9123 -0.1600 +vn -0.4445 0.8780 0.1777 +vn 0.4241 0.6987 0.5761 +vn 0.6499 0.5895 0.4797 +vn 0.6527 0.5727 0.4960 +vn 0.4826 0.6630 0.5723 +vn -0.6527 0.5727 0.4960 +vn -0.6499 0.5895 0.4797 +vn -0.4241 0.6987 0.5761 +vn -0.4826 0.6630 0.5723 +vn 0.6041 0.7367 0.3037 +vn 0.7488 0.6139 0.2500 +vn 0.8015 0.5968 0.0369 +vn 0.6547 0.7534 0.0612 +vn -0.8015 0.5968 0.0369 +vn -0.7488 0.6139 0.2500 +vn -0.6041 0.7367 0.3037 +vn -0.6547 0.7534 0.0612 +vn 0.6753 0.7277 -0.1198 +vn 0.8265 0.5523 -0.1089 +vn 0.8306 0.4446 -0.3354 +vn 0.6704 0.6235 -0.4022 +vn -0.8306 0.4446 -0.3354 +vn -0.8265 0.5523 -0.1089 +vn -0.6753 0.7277 -0.1198 +vn -0.6704 0.6235 -0.4022 +vn 0.7355 0.0900 -0.6715 +vn 0.6174 0.1265 -0.7764 +vn 0.6217 0.3786 -0.6856 +vn 0.8049 0.2659 -0.5305 +vn -0.6217 0.3786 -0.6856 +vn -0.6174 0.1265 -0.7764 +vn -0.7355 0.0900 -0.6715 +vn -0.8049 0.2659 -0.5305 +vn 0.4660 0.3523 -0.8117 +vn 0.4131 0.5939 -0.6904 +vn 0.5062 0.4910 -0.7090 +vn 0.5506 0.2356 -0.8009 +vn -0.5062 0.4910 -0.7090 +vn -0.4131 0.5939 -0.6904 +vn -0.4660 0.3523 -0.8117 +vn -0.5506 0.2356 -0.8009 +vn 0.4262 0.8052 -0.4124 +vn 0.4791 0.8726 -0.0948 +vn 0.6628 0.7417 -0.1022 +vn 0.5875 0.6976 -0.4100 +vn -0.6628 0.7417 -0.1022 +vn -0.4791 0.8726 -0.0948 +vn -0.4262 0.8052 -0.4124 +vn -0.5875 0.6976 -0.4100 +vn 0.5132 0.8522 0.1014 +vn 0.5589 0.7509 0.3519 +vn 0.7048 0.6492 0.2860 +vn 0.6854 0.7248 0.0699 +vn -0.7048 0.6492 0.2860 +vn -0.5589 0.7509 0.3519 +vn -0.5132 0.8522 0.1014 +vn -0.6854 0.7248 0.0699 +vn 0.5784 0.5616 0.5917 +vn 0.5439 0.5641 0.6212 +vn 0.6419 0.5601 0.5237 +vn 0.6900 0.5185 0.5049 +vn -0.6419 0.5601 0.5237 +vn -0.5439 0.5641 0.6212 +vn -0.5784 0.5616 0.5917 +vn -0.6900 0.5185 0.5049 +vn 0.1862 0.9392 -0.2884 +vn 0.3690 0.9136 -0.1708 +vn 0.5027 0.8432 0.1906 +vn 0.3772 0.8780 0.2945 +vn -0.5027 0.8432 0.1906 +vn -0.3690 0.9136 -0.1708 +vn -0.1862 0.9392 -0.2884 +vn -0.3772 0.8780 0.2945 +vn 0.1398 0.6437 0.7524 +vn 0.3113 0.6008 0.7362 +vn 0.2926 0.6596 0.6923 +vn 0.0963 0.7117 0.6959 +vn -0.2926 0.6596 0.6923 +vn -0.3113 0.6008 0.7362 +vn -0.1398 0.6437 0.7524 +vn -0.0963 0.7117 0.6959 +vn -0.3143 0.3098 -0.8974 +vn -0.3627 0.3016 -0.8818 +vn -0.0528 0.3888 -0.9198 +vn -0.1143 0.3499 -0.9298 +vn 0.0528 0.3888 -0.9198 +vn 0.3627 0.3016 -0.8818 +vn 0.3143 0.3098 -0.8974 +vn 0.1143 0.3499 -0.9298 +vn -0.1211 0.9543 0.2731 +vn -0.1029 0.9514 -0.2902 +vn 0.2076 0.8342 0.5109 +vn 0.1206 0.7069 0.6969 +vn -0.2076 0.8342 0.5109 +vn 0.1029 0.9514 -0.2902 +vn 0.1211 0.9543 0.2731 +vn -0.1206 0.7069 0.6969 +vn -0.0946 0.5719 0.8148 +vn -0.2268 0.6795 0.6977 +vn -0.0201 0.4661 0.8845 +vn 0.0201 0.4661 0.8845 +vn 0.2268 0.6795 0.6977 +vn 0.0946 0.5719 0.8148 +vn 0.9341 0.3265 -0.1448 +vn 0.9920 -0.1200 0.0389 +vn 0.9899 0.0001 0.1418 +vn 0.9175 0.3893 0.0816 +vn -0.9899 0.0001 0.1418 +vn -0.9920 -0.1200 0.0389 +vn -0.9341 0.3265 -0.1448 +vn -0.9175 0.3893 0.0816 +vn 0.9822 0.0351 0.1847 +vn 0.9887 0.0423 0.1439 +vn 0.9233 0.2360 0.3032 +vn 0.9173 0.2553 0.3055 +vn -0.9233 0.2360 0.3032 +vn -0.9887 0.0423 0.1439 +vn -0.9822 0.0351 0.1847 +vn -0.9173 0.2553 0.3055 +vn 0.9933 0.1151 0.0108 +vn 0.9809 0.1735 -0.0877 +vn 0.9626 0.2675 -0.0418 +vn 0.9508 0.2920 0.1034 +vn -0.9626 0.2675 -0.0418 +vn -0.9809 0.1735 -0.0877 +vn -0.9933 0.1151 0.0108 +vn -0.9508 0.2920 0.1034 +vn 0.9288 0.1135 -0.3527 +vn 0.9358 0.2030 -0.2882 +vn 0.9733 0.2074 -0.0979 +vn 0.9725 0.1765 -0.1522 +vn -0.9733 0.2074 -0.0979 +vn -0.9358 0.2030 -0.2882 +vn -0.9288 0.1135 -0.3527 +vn -0.9725 0.1765 -0.1522 +vn 0.6553 -0.7551 0.0203 +vn 0.5920 -0.8020 -0.0794 +vn 0.6279 -0.7768 -0.0482 +vn 0.6575 -0.7478 0.0919 +vn -0.6279 -0.7768 -0.0482 +vn -0.5920 -0.8020 -0.0794 +vn -0.6553 -0.7551 0.0203 +vn -0.6575 -0.7478 0.0919 +vn 0.4668 -0.8741 0.1343 +vn 0.4588 -0.8824 0.1046 +vn 0.4476 -0.8920 -0.0633 +vn 0.3413 -0.9399 0.0148 +vn -0.4476 -0.8920 -0.0633 +vn -0.4588 -0.8824 0.1046 +vn -0.4668 -0.8741 0.1343 +vn -0.3413 -0.9399 0.0148 +vn 0.5613 -0.8065 0.1858 +vn 0.4668 -0.8654 0.1818 +vn 0.4767 -0.8577 0.1925 +vn 0.5263 -0.8217 0.2186 +vn -0.4767 -0.8577 0.1925 +vn -0.4668 -0.8654 0.1818 +vn -0.5613 -0.8065 0.1858 +vn -0.5263 -0.8217 0.2186 +vn 0.5216 -0.8204 0.2341 +vn 0.6578 -0.6375 0.4011 +vn 0.7511 -0.6001 0.2753 +vn 0.5984 -0.7768 0.1963 +vn -0.7511 -0.6001 0.2753 +vn -0.6578 -0.6375 0.4011 +vn -0.5216 -0.8204 0.2341 +vn -0.5984 -0.7768 0.1963 +vn 0.7592 -0.6218 0.1926 +vn 0.7187 -0.6817 0.1373 +vn 0.6862 -0.7002 0.1973 +vn -0.6862 -0.7002 0.1973 +vn -0.7187 -0.6817 0.1373 +vn -0.7592 -0.6218 0.1926 +vn 0.4177 -0.7750 0.4742 +vn 0.4704 -0.8012 0.3699 +vn 0.4993 -0.5066 0.7029 +vn -0.4993 -0.5066 0.7029 +vn -0.4704 -0.8012 0.3699 +vn -0.4177 -0.7750 0.4742 +vn 0.6287 -0.1731 -0.7581 +vn 0.4658 -0.4492 -0.7624 +vn 0.5177 -0.4475 -0.7292 +vn 0.5802 -0.1684 -0.7969 +vn -0.5177 -0.4475 -0.7292 +vn -0.4658 -0.4492 -0.7624 +vn -0.6287 -0.1731 -0.7581 +vn -0.5802 -0.1684 -0.7969 +vn 0.4618 -0.0233 -0.8867 +vn 0.5443 -0.1128 -0.8313 +vn 0.5532 -0.3757 -0.7436 +vn 0.4453 -0.2665 -0.8548 +vn -0.5532 -0.3757 -0.7436 +vn -0.5443 -0.1128 -0.8313 +vn -0.4618 -0.0233 -0.8867 +vn -0.4454 -0.2665 -0.8548 +vn 0.2208 -0.9325 -0.2857 +vn 0.4424 -0.8447 -0.3014 +vn 0.4406 -0.7369 -0.5127 +vn 0.2445 -0.7812 -0.5744 +vn -0.4406 -0.7369 -0.5127 +vn -0.4424 -0.8447 -0.3014 +vn -0.2208 -0.9325 -0.2857 +vn -0.2445 -0.7812 -0.5744 +vn 0.5828 -0.7694 -0.2615 +vn 0.5586 -0.7104 -0.4281 +vn 0.6683 -0.6368 -0.3844 +vn 0.6382 -0.7320 -0.2386 +vn -0.6683 -0.6368 -0.3844 +vn -0.5586 -0.7104 -0.4281 +vn -0.5828 -0.7694 -0.2615 +vn -0.6382 -0.7320 -0.2386 +vn 0.4367 -0.3637 -0.8228 +vn 0.6196 -0.4763 -0.6238 +vn 0.4702 -0.6134 -0.6346 +vn -0.4702 -0.6134 -0.6346 +vn -0.6196 -0.4763 -0.6238 +vn -0.4367 -0.3637 -0.8228 +vn -0.0205 0.8492 0.5277 +vn -0.1918 0.8152 0.5466 +vn 0.4724 0.0875 0.8770 +vn 0.5353 0.0226 0.8444 +vn -0.4724 0.0875 0.8770 +vn 0.1918 0.8152 0.5466 +vn 0.0205 0.8492 0.5277 +vn -0.5353 0.0226 0.8444 +vn 0.1382 0.8098 0.5702 +vn 0.5113 -0.0565 0.8575 +vn 0.4345 -0.0954 0.8956 +vn 0.3782 0.6396 0.6692 +vn -0.4345 -0.0954 0.8956 +vn -0.5113 -0.0565 0.8575 +vn -0.1382 0.8098 0.5702 +vn -0.3782 0.6396 0.6692 +vn 0.5193 0.3696 0.7705 +vn 0.2324 -0.0550 0.9711 +vn 0.0996 -0.0175 0.9949 +vn 0.5077 0.1512 0.8481 +vn -0.0996 -0.0175 0.9949 +vn -0.2324 -0.0550 0.9711 +vn -0.5193 0.3696 0.7705 +vn -0.5077 0.1512 0.8481 +vn 0.4991 -0.0694 0.8637 +vn 0.0746 -0.0289 0.9968 +vn 0.1012 0.0676 0.9926 +vn 0.5339 -0.1803 0.8261 +vn -0.1012 0.0676 0.9926 +vn -0.0746 -0.0289 0.9968 +vn -0.4991 -0.0694 0.8637 +vn -0.5339 -0.1803 0.8261 +vn 0.5960 -0.3435 0.7258 +vn 0.2560 0.1901 0.9478 +vn 0.4547 0.1312 0.8809 +vn 0.5900 -0.5478 0.5931 +vn -0.4547 0.1312 0.8809 +vn -0.2560 0.1901 0.9478 +vn -0.5960 -0.3435 0.7258 +vn -0.5900 -0.5478 0.5931 +vn 0.5327 -0.6774 0.5073 +vn 0.6046 -0.0297 0.7960 +vn 0.5400 -0.1178 0.8334 +vn 0.3758 -0.7678 0.5189 +vn -0.5400 -0.1178 0.8334 +vn -0.6046 -0.0297 0.7960 +vn -0.5327 -0.6774 0.5073 +vn -0.3758 -0.7678 0.5189 +vn 0.4221 0.5591 0.7136 +vn 0.1653 0.8690 0.4664 +vn 0.2941 0.8048 0.5156 +vn 0.4756 0.4512 0.7551 +vn -0.2941 0.8048 0.5156 +vn -0.1653 0.8690 0.4664 +vn -0.4221 0.5591 0.7136 +vn -0.4756 0.4512 0.7551 +vn -0.2542 0.6512 0.7151 +vn -0.5563 0.7759 0.2974 +vn -0.2140 0.9014 0.3764 +vn 0.0794 0.7092 0.7005 +vn 0.2140 0.9014 0.3764 +vn 0.5563 0.7759 0.2974 +vn 0.2542 0.6512 0.7151 +vn -0.0794 0.7092 0.7005 +vn -0.5416 0.0466 0.8394 +vn -0.9486 0.1144 0.2950 +vn -0.8572 0.4571 0.2373 +vn -0.5241 0.3505 0.7761 +vn 0.8572 0.4571 0.2373 +vn 0.9486 0.1144 0.2950 +vn 0.5416 0.0466 0.8394 +vn 0.5241 0.3505 0.7761 +vn -0.0686 -0.3762 0.9240 +vn -0.3293 -0.5899 0.7373 +vn -0.8190 -0.2642 0.5093 +vn -0.4092 -0.1702 0.8964 +vn 0.8190 -0.2642 0.5093 +vn 0.3293 -0.5899 0.7373 +vn 0.0686 -0.3762 0.9240 +vn 0.4092 -0.1702 0.8964 +vn 0.5220 -0.4493 0.7251 +vn 0.4795 -0.6141 0.6268 +vn 0.2706 -0.6499 0.7102 +vn 0.3580 -0.4611 0.8119 +vn -0.2706 -0.6499 0.7102 +vn -0.4795 -0.6141 0.6268 +vn -0.5220 -0.4493 0.7251 +vn -0.3580 -0.4611 0.8119 +vn 0.6248 -0.3986 0.6714 +vn 0.6587 -0.3369 0.6727 +vn 0.6943 -0.4801 0.5362 +vn 0.6141 -0.5531 0.5630 +vn -0.6943 -0.4801 0.5362 +vn -0.6587 -0.3369 0.6727 +vn -0.6248 -0.3986 0.6714 +vn -0.6141 -0.5531 0.5630 +vn 0.7007 -0.7122 0.0431 +vn 0.5427 -0.8336 0.1032 +vn 0.8133 -0.5499 0.1903 +vn 0.8700 -0.4877 -0.0722 +vn -0.8132 -0.5499 0.1903 +vn -0.5427 -0.8336 0.1032 +vn -0.7007 -0.7122 0.0431 +vn -0.8700 -0.4877 -0.0722 +vn -0.0275 -0.6205 0.7837 +vn -0.0000 -0.7270 0.6867 +vn 0.1214 0.2350 0.9644 +vn 0.1592 0.3008 0.9403 +vn -0.1214 0.2350 0.9644 +vn 0.0275 -0.6205 0.7837 +vn -0.1592 0.3008 0.9403 +vn 0.9629 -0.2654 0.0480 +vn 0.8749 -0.4801 0.0636 +vn 0.9101 -0.3839 -0.1561 +vn 0.9621 -0.2621 -0.0750 +vn -0.9101 -0.3839 -0.1561 +vn -0.8749 -0.4801 0.0636 +vn -0.9629 -0.2654 0.0480 +vn -0.9621 -0.2621 -0.0750 +vn 0.2189 0.6396 0.7369 +vn 0.5025 -0.1434 0.8526 +vn 0.3438 0.0039 0.9391 +vn -0.3999 0.7149 0.5736 +vn -0.3438 0.0039 0.9391 +vn -0.5025 -0.1434 0.8526 +vn -0.2189 0.6396 0.7369 +vn 0.3999 0.7149 0.5736 +vn 0.1416 0.7362 0.6617 +vn 0.0708 0.9263 0.3701 +vn 0.1860 0.9347 0.3027 +vn 0.2524 0.7846 0.5662 +vn -0.1860 0.9347 0.3027 +vn -0.0708 0.9263 0.3701 +vn -0.1416 0.7362 0.6617 +vn -0.2524 0.7846 0.5662 +vn 0.6620 -0.0533 0.7476 +vn 0.7321 0.0500 0.6793 +vn 0.6702 0.2898 0.6833 +vn 0.6793 0.3834 0.6258 +vn -0.6702 0.2898 0.6833 +vn -0.7321 0.0500 0.6793 +vn -0.6620 -0.0533 0.7476 +vn -0.6793 0.3834 0.6258 +vn 0.6671 0.4915 0.5599 +vn 0.7185 0.3229 0.6161 +vn 0.5895 0.2524 0.7673 +vn 0.4953 0.5448 0.6767 +vn -0.5895 0.2524 0.7673 +vn -0.7185 0.3229 0.6161 +vn -0.6671 0.4915 0.5599 +vn -0.4953 0.5448 0.6767 +vn 0.7462 -0.5303 0.4026 +vn 0.8459 -0.4455 0.2933 +vn 0.9177 -0.3399 0.2058 +vn 0.8790 -0.4117 0.2408 +vn -0.9177 -0.3399 0.2058 +vn -0.8459 -0.4455 0.2933 +vn -0.7462 -0.5303 0.4026 +vn -0.8790 -0.4117 0.2408 +vn 0.6539 -0.3645 0.6630 +vn 0.7818 -0.3994 0.4789 +vn 0.6662 -0.4851 0.5664 +vn 0.6220 -0.4608 0.6331 +vn -0.6662 -0.4851 0.5664 +vn -0.7818 -0.3994 0.4789 +vn -0.6539 -0.3645 0.6630 +vn -0.6220 -0.4608 0.6331 +vn 0.5746 -0.3515 0.7391 +vn 0.5455 -0.3604 0.7567 +vn 0.6377 -0.4508 0.6246 +vn 0.6737 -0.4640 0.5752 +vn -0.6377 -0.4508 0.6246 +vn -0.5455 -0.3604 0.7567 +vn -0.5746 -0.3515 0.7391 +vn -0.6737 -0.4640 0.5752 +vn 0.9892 -0.1431 -0.0332 +vn 0.9361 -0.3355 0.1060 +vn 0.8935 -0.2348 0.3827 +vn 0.9914 0.1179 0.0563 +vn -0.8935 -0.2348 0.3827 +vn -0.9361 -0.3355 0.1060 +vn -0.9892 -0.1431 -0.0332 +vn -0.9914 0.1179 0.0563 +vn 0.9423 -0.3297 -0.0577 +vn 0.9147 -0.3752 -0.1502 +vn 0.9298 -0.3679 -0.0089 +vn 0.9130 -0.4078 0.0129 +vn -0.9298 -0.3679 -0.0089 +vn -0.9147 -0.3752 -0.1502 +vn -0.9423 -0.3297 -0.0577 +vn -0.9130 -0.4078 0.0129 +vn 0.9354 -0.3331 -0.1189 +vn 0.9649 -0.0182 0.2620 +vn 0.9647 -0.2265 0.1348 +vn -0.9647 -0.2265 0.1348 +vn -0.9649 -0.0182 0.2620 +vn -0.9354 -0.3331 -0.1189 +vn 0.7120 -0.5876 0.3845 +vn 0.7337 -0.5770 0.3589 +vn 0.6887 -0.5163 0.5090 +vn 0.6830 -0.4932 0.5387 +vn -0.6887 -0.5163 0.5090 +vn -0.7337 -0.5770 0.3589 +vn -0.7120 -0.5876 0.3845 +vn -0.6830 -0.4932 0.5387 +vn 0.7388 -0.5816 0.3406 +vn 0.7333 -0.6043 0.3116 +vn 0.6509 -0.5579 0.5149 +vn 0.6816 -0.5313 0.5030 +vn -0.6509 -0.5579 0.5149 +vn -0.7333 -0.6043 0.3116 +vn -0.7388 -0.5816 0.3406 +vn -0.6816 -0.5313 0.5030 +vn 0.7243 -0.6494 0.2318 +vn 0.8306 -0.5336 0.1593 +vn 0.6951 -0.4454 0.5644 +vn 0.6174 -0.5989 0.5101 +vn -0.6951 -0.4454 0.5644 +vn -0.8306 -0.5336 0.1593 +vn -0.7243 -0.6494 0.2318 +vn -0.6174 -0.5989 0.5101 +vn 0.6811 0.6657 0.3050 +vn 0.4426 0.8229 0.3563 +vn 0.4269 0.7886 0.4425 +vn 0.6184 0.4156 0.6670 +vn -0.4269 0.7886 0.4425 +vn -0.4426 0.8229 0.3563 +vn -0.6811 0.6657 0.3050 +vn -0.6184 0.4156 0.6670 +vn 0.7428 0.5039 0.4407 +vn 0.8473 0.1348 0.5137 +vn 0.8098 0.1403 0.5697 +vn 0.7151 0.4634 0.5233 +vn -0.8098 0.1403 0.5697 +vn -0.8473 0.1348 0.5137 +vn -0.7428 0.5039 0.4407 +vn -0.7151 0.4634 0.5233 +vn 0.8087 -0.3438 0.4774 +vn 0.9084 0.0479 0.4153 +vn 0.6406 0.3517 0.6826 +vn 0.7902 -0.3805 0.4805 +vn -0.6406 0.3517 0.6826 +vn -0.9084 0.0479 0.4153 +vn -0.8087 -0.3438 0.4774 +vn -0.7902 -0.3805 0.4805 +vn 0.1493 0.9765 0.1554 +vn -0.0046 0.9804 0.1972 +vn -0.0662 0.9281 0.3663 +vn -0.0823 0.9430 0.3225 +vn 0.0662 0.9281 0.3663 +vn 0.0046 0.9804 0.1972 +vn -0.1493 0.9765 0.1554 +vn 0.0823 0.9430 0.3225 +vn 0.5698 -0.6825 0.4576 +vn 0.6797 -0.6052 0.4145 +vn 0.6792 -0.4446 0.5840 +vn 0.6092 -0.4742 0.6356 +vn -0.6792 -0.4446 0.5840 +vn -0.6797 -0.6052 0.4145 +vn -0.5698 -0.6825 0.4576 +vn -0.6092 -0.4742 0.6356 +vn 0.1434 -0.8406 0.5224 +vn 0.4106 -0.7628 0.4995 +vn 0.4658 -0.6095 0.6415 +vn 0.2145 -0.6668 0.7137 +vn -0.4658 -0.6095 0.6415 +vn -0.4106 -0.7628 0.4995 +vn -0.1434 -0.8406 0.5224 +vn -0.2145 -0.6668 0.7137 +vn -0.9542 -0.2910 -0.0694 +vn -0.5829 -0.7510 0.3104 +vn -0.1380 -0.4256 0.8943 +vn -0.3713 -0.1545 0.9156 +vn 0.1380 -0.4256 0.8943 +vn 0.5829 -0.7510 0.3104 +vn 0.9542 -0.2910 -0.0694 +vn 0.3713 -0.1545 0.9156 +vn -0.8679 0.4114 -0.2784 +vn -0.9569 0.1243 -0.2625 +vn -0.3893 0.0699 0.9185 +vn -0.2116 0.2604 0.9420 +vn 0.3893 0.0699 0.9185 +vn 0.9569 0.1243 -0.2625 +vn 0.8679 0.4114 -0.2784 +vn 0.2116 0.2604 0.9420 +vn -0.4099 0.9112 0.0419 +vn -0.6783 0.7208 -0.1430 +vn -0.0276 0.4645 0.8851 +vn 0.1209 0.6487 0.7513 +vn 0.0276 0.4645 0.8851 +vn 0.6783 0.7208 -0.1430 +vn 0.4099 0.9112 0.0419 +vn -0.1209 0.6487 0.7513 +vn 0.0860 0.9649 0.2483 +vn -0.0841 0.9794 0.1834 +vn 0.3082 0.7442 0.5926 +vn 0.2655 0.8263 0.4968 +vn -0.3082 0.7442 0.5926 +vn 0.0841 0.9794 0.1834 +vn -0.0860 0.9649 0.2483 +vn -0.2655 0.8263 0.4968 +vn 0.2574 0.1434 0.9556 +vn 0.2381 0.1169 0.9642 +vn 0.1210 0.1419 0.9825 +vn 0.1726 0.0265 0.9846 +vn -0.1210 0.1419 0.9825 +vn -0.2381 0.1169 0.9642 +vn -0.2574 0.1434 0.9556 +vn -0.1726 0.0265 0.9846 +vn 0.2675 0.0341 0.9630 +vn 0.2930 0.1243 0.9480 +vn 0.4064 0.0313 0.9132 +vn 0.3320 0.0177 0.9431 +vn -0.4064 0.0313 0.9132 +vn -0.2930 0.1243 0.9480 +vn -0.2675 0.0341 0.9630 +vn -0.3320 0.0177 0.9431 +vn 0.3485 0.0044 0.9373 +vn 0.4045 -0.0499 0.9132 +vn 0.3634 -0.0903 0.9272 +vn 0.3158 0.0103 0.9488 +vn -0.3634 -0.0903 0.9272 +vn -0.4045 -0.0499 0.9132 +vn -0.3485 0.0044 0.9373 +vn -0.3158 0.0103 0.9488 +vn 0.2438 0.0400 0.9690 +vn 0.3102 -0.1465 0.9393 +vn 0.4165 -0.0288 0.9087 +vn 0.3278 0.1814 0.9272 +vn -0.4165 -0.0288 0.9087 +vn -0.3102 -0.1465 0.9393 +vn -0.2438 0.0400 0.9690 +vn -0.3278 0.1814 0.9272 +vn 0.4524 0.2283 0.8621 +vn 0.5000 0.0443 0.8649 +vn 0.3320 0.1101 0.9368 +vn 0.3219 0.3049 0.8963 +vn -0.3320 0.1101 0.9368 +vn -0.5000 0.0443 0.8649 +vn -0.4524 0.2283 0.8621 +vn -0.3219 0.3049 0.8963 +vn 0.4596 -0.1697 0.8718 +vn 0.3694 -0.0290 0.9288 +vn 0.3783 0.0030 0.9257 +vn 0.4989 -0.1092 0.8598 +vn -0.3783 0.0030 0.9257 +vn -0.3694 -0.0290 0.9288 +vn -0.4596 -0.1697 0.8718 +vn -0.4989 -0.1092 0.8598 +vn 0.3907 -0.1939 0.8999 +vn 0.3001 -0.1973 0.9333 +vn 0.2293 -0.0197 0.9732 +vn 0.3158 -0.0334 0.9482 +vn -0.2293 -0.0197 0.9732 +vn -0.3001 -0.1973 0.9333 +vn -0.3907 -0.1939 0.8999 +vn -0.3158 -0.0334 0.9482 +vn 0.1769 0.1801 0.9676 +vn 0.1284 -0.0032 0.9917 +vn 0.2247 -0.1899 0.9558 +vn 0.3179 -0.0537 0.9466 +vn -0.2247 -0.1899 0.9558 +vn -0.1284 -0.0032 0.9917 +vn -0.1769 0.1801 0.9676 +vn -0.3179 -0.0537 0.9466 +vn -0.2447 0.7696 0.5897 +vn -0.1043 0.6828 0.7231 +vn -0.0510 0.4334 0.8998 +vn -0.0186 0.3169 0.9483 +vn 0.0510 0.4334 0.8998 +vn 0.1043 0.6828 0.7231 +vn 0.2447 0.7696 0.5897 +vn 0.0186 0.3169 0.9483 +vn 0.5827 0.1008 0.8064 +vn 0.5408 0.0016 0.8412 +vn 0.4163 0.1692 0.8933 +vn 0.4931 0.2814 0.8232 +vn -0.4163 0.1692 0.8933 +vn -0.5408 0.0016 0.8412 +vn -0.5827 0.1008 0.8064 +vn -0.4931 0.2814 0.8232 +vn 0.4316 -0.1456 0.8902 +vn 0.4343 -0.1822 0.8822 +vn 0.4757 -0.1189 0.8715 +vn 0.4741 -0.0525 0.8789 +vn -0.4757 -0.1189 0.8715 +vn -0.4343 -0.1822 0.8822 +vn -0.4316 -0.1456 0.8902 +vn -0.4741 -0.0525 0.8789 +vn 0.5201 -0.0786 0.8505 +vn 0.5090 -0.1171 0.8528 +vn 0.4391 -0.2271 0.8692 +vn 0.4623 -0.1564 0.8728 +vn -0.4391 -0.2271 0.8692 +vn -0.5090 -0.1171 0.8528 +vn -0.5201 -0.0786 0.8505 +vn -0.4623 -0.1564 0.8728 +vn 0.4584 0.2779 0.8442 +vn 0.4637 0.2832 0.8395 +vn 0.5251 0.1076 0.8442 +vn 0.5149 0.1364 0.8463 +vn -0.5251 0.1076 0.8442 +vn -0.4637 0.2832 0.8395 +vn -0.4584 0.2779 0.8442 +vn -0.5149 0.1364 0.8463 +vn 0.4182 0.3033 0.8562 +vn 0.3713 0.4206 0.8278 +vn 0.3842 0.3492 0.8547 +vn -0.3842 0.3492 0.8547 +vn -0.3713 0.4206 0.8278 +vn -0.4182 0.3033 0.8562 +vn 0.2752 -0.9606 0.0402 +vn 0.0743 -0.9972 0.0065 +vn -0.2865 -0.6869 -0.6679 +vn -0.2351 -0.6646 -0.7092 +vn 0.2865 -0.6869 -0.6679 +vn -0.0743 -0.9972 0.0065 +vn -0.2752 -0.9606 0.0402 +vn 0.2351 -0.6646 -0.7092 +vn 0.6745 -0.6981 0.2403 +vn 0.4664 -0.8799 0.0914 +vn 0.0273 -0.6492 -0.7601 +vn 0.3356 -0.6177 -0.7112 +vn -0.0273 -0.6492 -0.7601 +vn -0.4664 -0.8799 0.0914 +vn -0.6745 -0.6981 0.2403 +vn -0.3356 -0.6177 -0.7112 +vn 0.8891 -0.0884 0.4492 +vn 0.8268 -0.3823 0.4126 +vn 0.8267 -0.4481 -0.3404 +vn 0.9932 -0.0290 -0.1131 +vn -0.8267 -0.4481 -0.3404 +vn -0.8268 -0.3823 0.4126 +vn -0.8891 -0.0884 0.4492 +vn -0.9932 -0.0290 -0.1131 +vn 0.6766 0.7300 0.0964 +vn 0.8915 0.3241 0.3165 +vn 0.9286 0.2822 -0.2409 +vn 0.4775 0.6112 -0.6312 +vn -0.9286 0.2822 -0.2409 +vn -0.8915 0.3241 0.3165 +vn -0.6766 0.7300 0.0964 +vn -0.4775 0.6112 -0.6312 +vn -0.2459 0.9629 -0.1115 +vn 0.0806 0.9919 -0.0978 +vn -0.1731 0.5767 -0.7984 +vn -0.4004 0.5448 -0.7368 +vn 0.1731 0.5767 -0.7984 +vn -0.0806 0.9919 -0.0978 +vn 0.2459 0.9629 -0.1115 +vn 0.4004 0.5448 -0.7368 +vn -0.4907 0.8712 0.0129 +vn -0.3626 0.9299 -0.0613 +vn -0.5145 0.5403 -0.6658 +vn -0.5531 0.5711 -0.6066 +vn 0.5145 0.5403 -0.6658 +vn 0.3626 0.9299 -0.0613 +vn 0.4907 0.8712 0.0129 +vn 0.5531 0.5711 -0.6066 +vn -0.4742 0.0784 -0.8769 +vn -0.4415 -0.1127 -0.8901 +vn -0.3900 -0.1353 -0.9108 +vn -0.4209 0.0836 -0.9032 +vn 0.3900 -0.1353 -0.9108 +vn 0.4415 -0.1127 -0.8901 +vn 0.4742 0.0784 -0.8769 +vn 0.4209 0.0836 -0.9032 +vn -0.3249 0.0745 -0.9428 +vn -0.1883 0.0705 -0.9796 +vn -0.0850 -0.1226 -0.9888 +vn -0.2465 -0.1132 -0.9625 +vn 0.0850 -0.1226 -0.9888 +vn 0.1883 0.0705 -0.9796 +vn 0.3249 0.0745 -0.9428 +vn 0.2465 -0.1132 -0.9625 +vn 0.0940 0.1248 -0.9877 +vn 0.8214 0.1013 -0.5612 +vn 0.2027 -0.1366 -0.9697 +vn -0.2027 -0.1366 -0.9697 +vn -0.8215 0.1013 -0.5612 +vn -0.0940 0.1248 -0.9877 +vn 0.2613 0.7349 -0.6258 +vn -0.1992 0.9792 -0.0379 +vn -0.6616 0.7467 0.0689 +vn -0.5331 0.6611 -0.5280 +vn 0.6616 0.7467 0.0689 +vn 0.1992 0.9792 -0.0379 +vn -0.2613 0.7349 -0.6258 +vn 0.5331 0.6611 -0.5280 +vn 0.5925 -0.1146 -0.7974 +vn 0.1350 0.0215 -0.9906 +vn 0.1295 -0.2589 -0.9572 +vn 0.4466 -0.3788 -0.8106 +vn -0.1295 -0.2589 -0.9572 +vn -0.1350 0.0215 -0.9906 +vn -0.5925 -0.1146 -0.7974 +vn -0.4466 -0.3788 -0.8106 +vn -0.1199 -0.9705 -0.2090 +vn 0.0603 -0.7863 -0.6149 +vn -0.1223 -0.7503 -0.6497 +vn -0.1446 -0.9850 -0.0941 +vn 0.1223 -0.7503 -0.6497 +vn -0.0603 -0.7863 -0.6149 +vn 0.1199 -0.9705 -0.2090 +vn 0.1446 -0.9850 -0.0941 +usemtl None +s off +f 2059/2112/1967 2521/2113/1967 3525/2114/1967 2520/2115/1967 +f 2521/2113/1968 2013/2116/1968 2522/2117/1968 3525/2114/1968 +f 3525/2114/1969 2522/2117/1969 2015/2118/1969 2523/2119/1969 +f 2520/2115/1970 3525/2114/1970 2523/2119/1970 2057/2120/1970 +f 2016/2121/1971 2525/2122/1971 3526/2123/1971 2524/2124/1971 +f 2525/2122/1972 2014/2125/1972 2526/2126/1972 3526/2123/1972 +f 3526/2123/1973 2526/2126/1973 2060/2127/1973 2527/2128/1973 +f 2524/2124/1974 3526/2123/1974 2527/2128/1974 2058/2129/1974 +f 2057/2120/1975 2523/2119/1975 3527/2130/1975 2528/2131/1975 +f 2523/2119/1976 2015/2118/1976 2529/2132/1976 3527/2130/1976 +f 3527/2130/1977 2529/2132/1977 2017/2133/1977 2530/2134/1977 +f 2528/2131/1978 3527/2130/1978 2530/2134/1978 2055/2135/1978 +f 2018/2136/1979 2532/2137/1979 3528/2138/1979 2531/2139/1979 +f 2532/2137/1980 2016/2121/1980 2524/2124/1980 3528/2138/1980 +f 3528/2138/1981 2524/2124/1981 2058/2129/1981 2533/2140/1981 +f 2531/2139/1982 3528/2138/1982 2533/2140/1982 2056/2141/1982 +f 2015/2118/1983 2534/2142/1983 3529/2143/1983 2529/2132/1983 +f 2534/2142/1984 2021/2144/1984 2535/2145/1984 3529/2143/1984 +f 3529/2143/1985 2535/2145/1985 2019/2146/1985 2536/2147/1985 +f 2529/2132/1986 3529/2143/1986 2536/2147/1986 2017/2133/1986 +f 2020/2148/1987 2538/2149/1987 3530/2150/1987 2537/2151/1987 +f 2538/2149/1988 2022/2152/1988 2539/2153/1988 3530/2150/1988 +f 3530/2150/1989 2539/2153/1989 2016/2121/1989 2532/2137/1989 +f 2537/2151/1990 3530/2150/1990 2532/2137/1990 2018/2136/1990 +f 2013/2116/1991 2540/2154/1991 3531/2155/1991 2522/2117/1991 +f 2540/2154/1992 2023/2156/1992 2541/2157/1992 3531/2155/1992 +f 3531/2155/1993 2541/2157/1993 2021/2144/1993 2534/2142/1993 +f 2522/2117/1994 3531/2155/1994 2534/2142/1994 2015/2118/1994 +f 2022/2152/1995 2542/2158/1995 3532/2159/1995 2539/2153/1995 +f 2542/2158/1996 2024/2160/1996 2543/2161/1996 3532/2159/1996 +f 3532/2159/1997 2543/2161/1997 2014/2125/1997 2525/2122/1997 +f 2539/2153/1998 3532/2159/1998 2525/2122/1998 2016/2121/1998 +f 2023/2156/1999 2544/2162/1999 3533/2163/1999 2541/2157/1999 +f 2544/2162/2000 2025/2164/2000 2545/2165/2000 3533/2163/2000 +f 3533/2163/2001 2545/2165/2001 2027/2166/2001 2546/2167/2001 +f 2541/2157/2002 3533/2163/2002 2546/2167/2002 2021/2144/2002 +f 2028/2168/2003 2548/2169/2003 3534/2170/2003 2547/2171/2003 +f 2548/2169/2004 2026/2172/2004 2549/2173/2004 3534/2170/2004 +f 3534/2170/2005 2549/2173/2005 2024/2160/2005 2542/2158/2005 +f 2547/2171/2006 3534/2170/2006 2542/2158/2006 2022/2152/2006 +f 2021/2144/2007 2546/2167/2007 3535/2174/2007 2535/2145/2007 +f 2546/2167/2008 2027/2166/2008 2550/2175/2008 3535/2174/2008 +f 3535/2174/2009 2550/2175/2009 2029/2176/2009 2551/2177/2009 +f 2535/2145/2010 3535/2174/2010 2551/2177/2010 2019/2146/2010 +f 2030/2178/2011 2553/2179/2011 3536/2180/2011 2552/2181/2011 +f 2553/2179/2012 2028/2168/2012 2547/2171/2012 3536/2180/2012 +f 3536/2180/2013 2547/2171/2013 2022/2152/2013 2538/2149/2013 +f 2552/2181/2014 3536/2180/2014 2538/2149/2014 2020/2148/2014 +f 2027/2166/2015 2554/2182/2015 3537/2183/2015 2550/2175/2015 +f 2554/2182/2016 2033/2184/2016 2555/2185/2016 3537/2183/2016 +f 3537/2183/2017 2555/2185/2017 2031/2186/2017 2556/2187/2017 +f 2550/2175/2018 3537/2183/2018 2556/2187/2018 2029/2176/2018 +f 2032/2188/2019 2558/2189/2019 3538/2190/2019 2557/2191/2019 +f 2558/2189/2020 2034/2192/2020 2559/2193/2020 3538/2190/2020 +f 3538/2190/2021 2559/2193/2021 2028/2168/2021 2553/2179/2021 +f 2557/2191/2022 3538/2190/2022 2553/2179/2022 2030/2178/2022 +f 2025/2164/2023 2560/2194/2023 3539/2195/2023 2545/2165/2023 +f 2560/2194/2024 2035/2196/2024 2561/2197/2024 3539/2195/2024 +f 3539/2195/2025 2561/2197/2025 2033/2184/2025 2554/2182/2025 +f 2545/2165/2026 3539/2195/2026 2554/2182/2026 2027/2166/2026 +f 2034/2192/2027 2562/2198/2027 3540/2199/2027 2559/2193/2027 +f 2562/2198/2028 2036/2200/2028 2563/2201/2028 3540/2199/2028 +f 3540/2199/2029 2563/2201/2029 2026/2172/2029 2548/2169/2029 +f 2559/2193/2030 3540/2199/2030 2548/2169/2030 2028/2168/2030 +f 2035/2196/2031 2564/2202/2031 3541/2203/2031 2561/2197/2031 +f 2564/2202/2032 2037/2204/2032 2565/2205/2032 3541/2203/2032 +f 3541/2203/2033 2565/2205/2033 2039/2206/2033 2566/2207/2033 +f 2561/2197/2034 3541/2203/2034 2566/2207/2034 2033/2184/2034 +f 2040/2208/2035 2568/2209/2035 3542/2210/2035 2567/2211/2035 +f 2568/2209/2036 2038/2212/2036 2569/2213/2036 3542/2210/2036 +f 3542/2210/2037 2569/2213/2037 2036/2200/2037 2562/2198/2037 +f 2567/2211/2038 3542/2210/2038 2562/2198/2038 2034/2192/2038 +f 2033/2184/2039 2566/2207/2039 3543/2214/2039 2555/2185/2039 +f 2566/2207/2040 2039/2206/2040 2570/2215/2040 3543/2214/2040 +f 3543/2214/2041 2570/2215/2041 2041/2216/2041 2571/2217/2041 +f 2555/2185/2042 3543/2214/2042 2571/2217/2042 2031/2186/2042 +f 2042/2218/2043 2573/2219/2043 3544/2220/2043 2572/2221/2043 +f 2573/2219/2044 2040/2208/2044 2567/2211/2044 3544/2220/2044 +f 3544/2220/2045 2567/2211/2045 2034/2192/2045 2558/2189/2045 +f 2572/2221/2046 3544/2220/2046 2558/2189/2046 2032/2188/2046 +f 2039/2206/2047 2574/2222/2047 3545/2223/2047 2570/2215/2047 +f 2574/2222/2048 2045/2224/2048 2575/2225/2048 3545/2223/2048 +f 3545/2223/2049 2575/2225/2049 2043/2226/2049 2576/2227/2049 +f 2570/2215/2050 3545/2223/2050 2576/2227/2050 2041/2216/2050 +f 2044/2228/2051 2578/2229/2051 3546/2230/2051 2577/2231/2051 +f 2578/2229/2052 2046/2232/2052 2579/2233/2052 3546/2230/2052 +f 3546/2230/2053 2579/2233/2053 2040/2208/2053 2573/2219/2053 +f 2577/2231/2054 3546/2230/2054 2573/2219/2054 2042/2218/2054 +f 2037/2204/2055 2580/2234/2055 3547/2235/2055 2565/2205/2055 +f 2580/2234/2056 2047/2236/2056 2581/2237/2056 3547/2235/2056 +f 3547/2235/2057 2581/2237/2057 2045/2224/2057 2574/2222/2057 +f 2565/2205/2058 3547/2235/2058 2574/2222/2058 2039/2206/2058 +f 2046/2232/2059 2582/2238/2059 3548/2239/2059 2579/2233/2059 +f 2582/2238/2060 2048/2240/2060 2583/2241/2060 3548/2239/2060 +f 3548/2239/2061 2583/2241/2061 2038/2212/2061 2568/2209/2061 +f 2579/2233/2062 3548/2239/2062 2568/2209/2062 2040/2208/2062 +f 2047/2236/2063 2584/2242/2063 3549/2243/2063 2581/2237/2063 +f 2584/2242/2064 2049/2244/2064 2585/2245/2064 3549/2243/2064 +f 3549/2243/2065 2585/2245/2065 2051/2246/2065 2586/2247/2065 +f 2581/2237/2066 3549/2243/2066 2586/2247/2066 2045/2224/2066 +f 2052/2248/2067 2588/2249/2067 3550/2250/2067 2587/2251/2067 +f 2588/2249/2068 2050/2252/2068 2589/2253/2068 3550/2250/2068 +f 3550/2250/2069 2589/2253/2069 2048/2240/2069 2582/2238/2069 +f 2587/2251/2070 3550/2250/2070 2582/2238/2070 2046/2232/2070 +f 2045/2224/2071 2586/2247/2071 3551/2254/2071 2575/2225/2071 +f 2586/2247/2072 2051/2246/2072 2590/2255/2072 3551/2254/2072 +f 3551/2254/2073 2590/2255/2073 2053/2256/2073 2591/2257/2073 +f 2575/2225/2074 3551/2254/2074 2591/2257/2074 2043/2226/2074 +f 2054/2258/2075 2593/2259/2075 3552/2260/2075 2592/2261/2075 +f 2593/2259/2076 2052/2248/2076 2587/2251/2076 3552/2260/2076 +f 3552/2260/2077 2587/2251/2077 2046/2232/2077 2578/2229/2077 +f 2592/2261/2078 3552/2260/2078 2578/2229/2078 2044/2228/2078 +f 2051/2246/2079 2594/2262/2079 3553/2263/2079 2590/2255/2079 +f 2594/2262/2080 2057/2120/2080 2528/2131/2080 3553/2263/2080 +f 3553/2263/2081 2528/2131/2081 2055/2135/2081 2595/2264/2081 +f 2590/2255/2082 3553/2263/2082 2595/2264/2082 2053/2256/2082 +f 2056/2141/2083 2533/2140/2083 3554/2265/2083 2596/2266/2083 +f 2533/2140/2084 2058/2129/2084 2597/2267/2084 3554/2265/2084 +f 3554/2265/2085 2597/2267/2085 2052/2248/2085 2593/2259/2085 +f 2596/2266/2086 3554/2265/2086 2593/2259/2086 2054/2258/2086 +f 2049/2244/2087 2598/2268/2087 3555/2269/2087 2585/2245/2087 +f 2598/2268/2088 2059/2112/2088 2520/2115/2088 3555/2269/2088 +f 3555/2269/2089 2520/2115/2089 2057/2120/2089 2594/2262/2089 +f 2585/2245/2090 3555/2269/2090 2594/2262/2090 2051/2246/2090 +f 2058/2129/2091 2527/2128/2091 3556/2270/2091 2597/2267/2091 +f 2527/2128/2092 2060/2127/2092 2599/2271/2092 3556/2270/2092 +f 3556/2270/2093 2599/2271/2093 2050/2252/2093 2588/2249/2093 +f 2597/2267/2094 3556/2270/2094 2588/2249/2094 2052/2248/2094 +f 2059/2112/2095 2598/2268/2095 3557/2272/2095 2600/2273/2095 +f 2598/2268/2096 2049/2244/2096 2601/2274/2096 3557/2272/2096 +f 3557/2272/2097 2601/2274/2097 2063/2275/2097 2602/2276/2097 +f 2600/2273/2098 3557/2272/2098 2602/2276/2098 2061/2277/2098 +f 2064/2278/2099 2604/2279/2099 3558/2280/2099 2603/2281/2099 +f 2604/2279/2100 2050/2252/2100 2599/2271/2100 3558/2280/2100 +f 3558/2280/2101 2599/2271/2101 2060/2127/2101 2605/2282/2101 +f 2603/2281/2102 3558/2280/2102 2605/2282/2102 2062/2283/2102 +f 2049/2244/2103 2584/2242/2103 3559/2284/2103 2601/2274/2103 +f 2584/2242/2104 2047/2236/2104 2606/2285/2104 3559/2284/2104 +f 3559/2284/2105 2606/2285/2105 2065/2286/2105 2607/2287/2105 +f 2601/2274/2106 3559/2284/2106 2607/2287/2106 2063/2275/2106 +f 2066/2288/2107 2609/2289/2107 3560/2290/2107 2608/2291/2107 +f 2609/2289/2108 2048/2240/2108 2589/2253/2108 3560/2290/2108 +f 3560/2290/2109 2589/2253/2109 2050/2252/2109 2604/2279/2109 +f 2608/2291/2110 3560/2290/2110 2604/2279/2110 2064/2278/2110 +f 2047/2236/2111 2580/2234/2111 3561/2292/2111 2606/2285/2111 +f 2580/2234/2112 2037/2204/2112 2610/2293/2112 3561/2292/2112 +f 3561/2292/2113 2610/2293/2113 2067/2294/2113 2611/2295/2113 +f 2606/2285/2114 3561/2292/2114 2611/2295/2114 2065/2286/2114 +f 2068/2296/2115 2613/2297/2115 3562/2298/2115 2612/2299/2115 +f 2613/2297/2116 2038/2212/2116 2583/2241/2116 3562/2298/2116 +f 3562/2298/2117 2583/2241/2117 2048/2240/2117 2609/2289/2117 +f 2612/2299/2118 3562/2298/2118 2609/2289/2118 2066/2288/2118 +f 2037/2204/2119 2564/2202/2119 3563/2300/2119 2610/2293/2119 +f 2564/2202/2120 2035/2196/2120 2614/2301/2120 3563/2300/2120 +f 3563/2300/2121 2614/2301/2121 2069/2302/2121 2615/2303/2121 +f 2610/2293/2122 3563/2300/2122 2615/2303/2122 2067/2294/2122 +f 2070/2304/2123 2617/2305/2123 3564/2306/2123 2616/2307/2123 +f 2617/2305/2124 2036/2200/2124 2569/2213/2124 3564/2306/2124 +f 3564/2306/2125 2569/2213/2125 2038/2212/2125 2613/2297/2125 +f 2616/2307/2126 3564/2306/2126 2613/2297/2126 2068/2296/2126 +f 2035/2196/2127 2560/2194/2127 3565/2308/2127 2614/2301/2127 +f 2560/2194/2128 2025/2164/2128 2618/2309/2128 3565/2308/2128 +f 3565/2308/2129 2618/2309/2129 2071/2310/2129 2619/2311/2129 +f 2614/2301/2130 3565/2308/2130 2619/2311/2130 2069/2302/2130 +f 2072/2312/2131 2621/2313/2131 3566/2314/2131 2620/2315/2131 +f 2621/2313/2132 2026/2172/2132 2563/2201/2132 3566/2314/2132 +f 3566/2314/2133 2563/2201/2133 2036/2200/2133 2617/2305/2133 +f 2620/2315/2134 3566/2314/2134 2617/2305/2134 2070/2304/2134 +f 2025/2164/2135 2544/2162/2135 3567/2316/2135 2618/2309/2135 +f 2544/2162/2136 2023/2156/2136 2622/2317/2136 3567/2316/2136 +f 3567/2316/2137 2622/2317/2137 2075/2318/2137 2623/2319/2137 +f 2618/2309/2138 3567/2316/2138 2623/2319/2138 2071/2310/2138 +f 2076/2320/2139 2625/2321/2139 3568/2322/2139 2624/2323/2139 +f 2625/2321/2140 2024/2160/2140 2549/2173/2140 3568/2322/2140 +f 3568/2322/2141 2549/2173/2141 2026/2172/2141 2621/2313/2141 +f 2624/2323/2142 3568/2322/2142 2621/2313/2142 2072/2312/2142 +f 2023/2156/2143 2540/2154/2143 3569/2324/2143 2622/2317/2143 +f 2540/2154/2144 2013/2116/2144 2626/2325/2144 3569/2324/2144 +f 3569/2324/2145 2626/2325/2145 2077/2326/2145 2627/2327/2145 +f 2622/2317/2146 3569/2324/2146 2627/2327/2146 2075/2318/2146 +f 2078/2328/2147 2629/2329/2147 3570/2330/2147 2628/2331/2147 +f 2629/2329/2148 2014/2125/2148 2543/2161/2148 3570/2330/2148 +f 3570/2330/2149 2543/2161/2149 2024/2160/2149 2625/2321/2149 +f 2628/2331/2150 3570/2330/2150 2625/2321/2150 2076/2320/2150 +f 2013/2116/2151 2521/2113/2151 3571/2332/2151 2626/2325/2151 +f 2521/2113/2152 2059/2112/2152 2600/2273/2152 3571/2332/2152 +f 3571/2332/2153 2600/2273/2153 2061/2277/2153 2630/2333/2153 +f 2626/2325/2154 3571/2332/2154 2630/2333/2154 2077/2326/2154 +f 2062/2283/2155 2605/2282/2155 3572/2334/2155 2631/2335/2155 +f 2605/2282/2156 2060/2127/2156 2526/2126/2156 3572/2334/2156 +f 3572/2334/2157 2526/2126/2157 2014/2125/2157 2629/2329/2157 +f 2631/2335/2158 3572/2334/2158 2629/2329/2158 2078/2328/2158 +f 2073/2336/2159 2633/2337/2159 3573/2338/2159 2632/2339/2159 +f 2077/2326/2160 2630/2333/2160 3573/2338/2160 2633/2337/2160 +f 2061/2277/2161 2632/2339/2161 3573/2338/2161 2630/2333/2161 +f 2062/2283/2162 2631/2335/2162 3574/2340/2162 2634/2341/2162 +f 2078/2328/2163 2635/2342/2163 3574/2340/2163 2631/2335/2163 +f 2074/2343/2164 2634/2341/2164 3574/2340/2164 2635/2342/2164 +f 2075/2318/2165 2627/2327/2165 3575/2344/2165 2636/2345/2165 +f 2077/2326/2166 2633/2337/2166 3575/2344/2166 2627/2327/2166 +f 2073/2336/2167 2636/2345/2167 3575/2344/2167 2633/2337/2167 +f 2074/2343/2168 2635/2342/2168 3576/2346/2168 2637/2347/2168 +f 2078/2328/2169 2628/2331/2169 3576/2346/2169 2635/2342/2169 +f 2076/2320/2170 2637/2347/2170 3576/2346/2170 2628/2331/2170 +f 2073/2336/2171 2638/2348/2171 3577/2349/2171 2636/2345/2171 +f 2071/2310/2172 2623/2319/2172 3577/2349/2172 2638/2348/2172 +f 2075/2318/2173 2636/2345/2173 3577/2349/2173 2623/2319/2173 +f 2076/2320/2174 2624/2323/2174 3578/2350/2174 2637/2347/2174 +f 2072/2312/2175 2639/2351/2175 3578/2350/2175 2624/2323/2175 +f 2074/2343/2176 2637/2347/2176 3578/2350/2176 2639/2351/2176 +f 2073/2336/2177 2640/2352/2177 3579/2353/2177 2638/2348/2177 +f 2069/2302/2178 2619/2311/2178 3579/2353/2178 2640/2352/2178 +f 2071/2310/2179 2638/2348/2179 3579/2353/2179 2619/2311/2179 +f 2072/2312/2180 2620/2315/2180 3580/2354/2180 2639/2351/2180 +f 2070/2304/2181 2641/2355/2181 3580/2354/2181 2620/2315/2181 +f 2074/2343/2182 2639/2351/2182 3580/2354/2182 2641/2355/2182 +f 2073/2336/2183 2642/2356/2183 3581/2357/2183 2640/2352/2183 +f 2067/2294/2184 2615/2303/2184 3581/2357/2184 2642/2356/2184 +f 2069/2302/2185 2640/2352/2185 3581/2357/2185 2615/2303/2185 +f 2070/2304/2186 2616/2307/2186 3582/2358/2186 2641/2355/2186 +f 2068/2296/2187 2643/2359/2187 3582/2358/2187 2616/2307/2187 +f 2074/2343/2188 2641/2355/2188 3582/2358/2188 2643/2359/2188 +f 2073/2336/2189 2644/2360/2189 3583/2361/2189 2642/2356/2189 +f 2065/2286/2190 2611/2295/2190 3583/2361/2190 2644/2360/2190 +f 2067/2294/2191 2642/2356/2191 3583/2361/2191 2611/2295/2191 +f 2068/2296/2192 2612/2299/2192 3584/2362/2192 2643/2359/2192 +f 2066/2288/2193 2645/2363/2193 3584/2362/2193 2612/2299/2193 +f 2074/2343/2194 2643/2359/2194 3584/2362/2194 2645/2363/2194 +f 2073/2336/2195 2646/2364/2195 3585/2365/2195 2644/2360/2195 +f 2063/2275/2196 2607/2287/2196 3585/2365/2196 2646/2364/2196 +f 2065/2286/2197 2644/2360/2197 3585/2365/2197 2607/2287/2197 +f 2066/2288/2198 2608/2291/2198 3586/2366/2198 2645/2363/2198 +f 2064/2278/2199 2647/2367/2199 3586/2366/2199 2608/2291/2199 +f 2074/2343/2200 2645/2363/2200 3586/2366/2200 2647/2367/2200 +f 2073/2336/2201 2632/2339/2201 3587/2368/2201 2646/2364/2201 +f 2061/2277/2202 2602/2276/2202 3587/2368/2202 2632/2339/2202 +f 2063/2275/2203 2646/2364/2203 3587/2368/2203 2602/2276/2203 +f 2064/2278/2204 2603/2281/2204 3588/2369/2204 2647/2367/2204 +f 2062/2283/2205 2634/2341/2205 3588/2369/2205 2603/2281/2205 +f 2074/2343/2206 2647/2367/2206 3588/2369/2206 2634/2341/2206 +f 2101/2370/2207 2649/2371/2207 3589/2372/2207 2648/2373/2207 +f 2649/2371/2208 2186/2374/2208 2650/2375/2208 3589/2372/2208 +f 3589/2372/2209 2650/2375/2209 2188/2376/2209 2651/2377/2209 +f 2648/2373/2210 3589/2372/2210 2651/2377/2210 2103/2378/2210 +f 2188/2376/2211 2652/2379/2211 3590/2380/2211 2651/2377/2211 +f 2652/2379/2212 2187/2381/2212 2653/2382/2212 3590/2380/2212 +f 3590/2380/2213 2653/2382/2213 2102/2383/2213 2654/2384/2213 +f 2651/2377/2214 3590/2380/2214 2654/2384/2214 2103/2378/2214 +f 2099/2385/2215 2656/2386/2215 3591/2387/2215 2655/2388/2215 +f 2656/2386/2216 2184/2389/2216 2657/2390/2216 3591/2387/2216 +f 3591/2387/2217 2657/2390/2217 2186/2374/2217 2649/2371/2217 +f 2655/2388/2218 3591/2387/2218 2649/2371/2218 2101/2370/2218 +f 2187/2381/2219 2658/2391/2219 3592/2392/2219 2653/2382/2219 +f 2658/2391/2220 2185/2393/2220 2659/2394/2220 3592/2392/2220 +f 3592/2392/2221 2659/2394/2221 2100/2395/2221 2660/2396/2221 +f 2653/2382/2222 3592/2392/2222 2660/2396/2222 2102/2383/2222 +f 2097/2397/2223 2662/2398/2223 3593/2399/2223 2661/2400/2223 +f 2662/2398/2224 2182/2401/2224 2663/2402/2224 3593/2399/2224 +f 3593/2399/2225 2663/2402/2225 2184/2389/2225 2656/2386/2225 +f 2661/2400/2226 3593/2399/2226 2656/2386/2226 2099/2385/2226 +f 2185/2393/2227 2664/2403/2227 3594/2404/2227 2659/2394/2227 +f 2664/2403/2228 2183/2405/2228 2665/2406/2228 3594/2404/2228 +f 3594/2404/2229 2665/2406/2229 2098/2407/2229 2666/2408/2229 +f 2659/2394/2230 3594/2404/2230 2666/2408/2230 2100/2395/2230 +f 2095/2409/2231 2668/2410/2231 3595/2411/2231 2667/2412/2231 +f 2668/2410/2232 2180/2413/2232 2669/2414/2232 3595/2411/2232 +f 3595/2411/2233 2669/2414/2233 2182/2401/2233 2662/2398/2233 +f 2667/2412/2234 3595/2411/2234 2662/2398/2234 2097/2397/2234 +f 2183/2405/2235 2670/2415/2235 3596/2416/2235 2665/2406/2235 +f 2670/2415/2236 2181/2417/2236 2671/2418/2236 3596/2416/2236 +f 3596/2416/2237 2671/2418/2237 2096/2419/2237 2672/2420/2237 +f 2665/2406/2238 3596/2416/2238 2672/2420/2238 2098/2407/2238 +f 2093/2421/2239 2674/2422/2239 3597/2423/2239 2673/2424/2239 +f 2674/2422/2240 2178/2425/2240 2675/2426/2240 3597/2423/2240 +f 3597/2423/2241 2675/2426/2241 2180/2413/2241 2668/2410/2241 +f 2673/2424/2242 3597/2423/2242 2668/2410/2242 2095/2409/2242 +f 2181/2417/2243 2676/2427/2243 3598/2428/2243 2671/2418/2243 +f 2676/2427/2244 2179/2429/2244 2677/2430/2244 3598/2428/2244 +f 3598/2428/2245 2677/2430/2245 2094/2431/2245 2678/2432/2245 +f 2671/2418/2246 3598/2428/2246 2678/2432/2246 2096/2419/2246 +f 2091/2433/2247 2680/2434/2247 3599/2435/2247 2679/2436/2247 +f 2680/2434/2248 2104/2437/2248 2681/2438/2248 3599/2435/2248 +f 3599/2435/2249 2681/2438/2249 2158/2439/2249 2682/2440/2249 +f 2679/2436/2250 3599/2435/2250 2682/2440/2250 2176/2441/2250 +f 2159/2442/2251 2684/2443/2251 3600/2444/2251 2683/2445/2251 +f 2684/2443/2252 2105/2446/2252 2685/2447/2252 3600/2444/2252 +f 3600/2444/2253 2685/2447/2253 2092/2448/2253 2686/2449/2253 +f 2683/2445/2254 3600/2444/2254 2686/2449/2254 2177/2450/2254 +f 2104/2437/2255 2687/2451/2255 3601/2452/2255 2681/2438/2255 +f 2687/2451/2256 2106/2453/2256 2688/2454/2256 3601/2452/2256 +f 3601/2452/2257 2688/2454/2257 2160/2455/2257 2689/2456/2257 +f 2681/2438/2258 3601/2452/2258 2689/2456/2258 2158/2439/2258 +f 2161/2457/2259 2691/2458/2259 3602/2459/2259 2690/2460/2259 +f 2691/2458/2260 2107/2461/2260 2692/2462/2260 3602/2459/2260 +f 3602/2459/2261 2692/2462/2261 2105/2446/2261 2684/2443/2261 +f 2690/2460/2262 3602/2459/2262 2684/2443/2262 2159/2442/2262 +f 2106/2453/2263 2693/2463/2263 3603/2464/2263 2688/2454/2263 +f 2693/2463/2264 2108/2465/2264 2694/2466/2264 3603/2464/2264 +f 3603/2464/2265 2694/2466/2265 2162/2467/2265 2695/2468/2265 +f 2688/2454/2266 3603/2464/2266 2695/2468/2266 2160/2455/2266 +f 2163/2469/2267 2697/2470/2267 3604/2471/2267 2696/2472/2267 +f 2697/2470/2268 2109/2473/2268 2698/2474/2268 3604/2471/2268 +f 3604/2471/2269 2698/2474/2269 2107/2461/2269 2691/2458/2269 +f 2696/2472/2270 3604/2471/2270 2691/2458/2270 2161/2457/2270 +f 2108/2465/2271 2699/2475/2271 3605/2476/2271 2694/2466/2271 +f 2699/2475/2272 2110/2477/2272 2700/2478/2272 3605/2476/2272 +f 3605/2476/2273 2700/2478/2273 2164/2479/2273 2701/2480/2273 +f 2694/2466/2274 3605/2476/2274 2701/2480/2274 2162/2467/2274 +f 2165/2481/2275 2703/2482/2275 3606/2483/2275 2702/2484/2275 +f 2703/2482/2276 2111/2485/2276 2704/2486/2276 3606/2483/2276 +f 3606/2483/2277 2704/2486/2277 2109/2473/2277 2697/2470/2277 +f 2702/2484/2278 3606/2483/2278 2697/2470/2278 2163/2469/2278 +f 2110/2477/2279 2705/2487/2279 3607/2488/2279 2700/2478/2279 +f 2705/2487/2280 2112/2489/2280 2706/2490/2280 3607/2488/2280 +f 3607/2488/2281 2706/2490/2281 2166/2491/2281 2707/2492/2281 +f 2700/2478/2282 3607/2488/2282 2707/2492/2282 2164/2479/2282 +f 2167/2493/2283 2709/2494/2283 3608/2495/2283 2708/2496/2283 +f 2709/2494/2284 2113/2497/2284 2710/2498/2284 3608/2495/2284 +f 3608/2495/2285 2710/2498/2285 2111/2485/2285 2703/2482/2285 +f 2708/2496/2286 3608/2495/2286 2703/2482/2286 2165/2481/2286 +f 2112/2489/2287 2711/2499/2287 3609/2500/2287 2706/2490/2287 +f 2711/2499/2288 2114/2501/2288 2712/2502/2288 3609/2500/2288 +f 3609/2500/2289 2712/2502/2289 2168/2503/2289 2713/2504/2289 +f 2706/2490/2290 3609/2500/2290 2713/2504/2290 2166/2491/2290 +f 2169/2505/2291 2715/2506/2291 3610/2507/2291 2714/2508/2291 +f 2715/2506/2292 2115/2509/2292 2716/2510/2292 3610/2507/2292 +f 3610/2507/2293 2716/2510/2293 2113/2497/2293 2709/2494/2293 +f 2714/2508/2294 3610/2507/2294 2709/2494/2294 2167/2493/2294 +f 2114/2501/2295 2717/2511/2295 3611/2512/2295 2712/2502/2295 +f 2717/2511/2296 2116/2513/2296 2718/2514/2296 3611/2512/2296 +f 3611/2512/2297 2718/2514/2297 2170/2515/2297 2719/2516/2297 +f 2712/2502/2298 3611/2512/2298 2719/2516/2298 2168/2503/2298 +f 2171/2517/2299 2721/2518/2299 3612/2519/2299 2720/2520/2299 +f 2721/2518/2300 2117/2521/2300 2722/2522/2300 3612/2519/2300 +f 3612/2519/2301 2722/2522/2301 2115/2509/2301 2715/2506/2301 +f 2720/2520/2302 3612/2519/2302 2715/2506/2302 2169/2505/2302 +f 2116/2513/2303 2723/2523/2303 3613/2524/2303 2718/2514/2303 +f 2723/2523/2304 2118/2525/2304 2724/2526/2304 3613/2524/2304 +f 3613/2524/2305 2724/2526/2305 2172/2527/2305 2725/2528/2305 +f 2718/2514/2306 3613/2524/2306 2725/2528/2306 2170/2515/2306 +f 2173/2529/2307 2727/2530/2307 3614/2531/2307 2726/2532/2307 +f 2727/2530/2308 2119/2533/2308 2728/2534/2308 3614/2531/2308 +f 3614/2531/2309 2728/2534/2309 2117/2521/2309 2721/2518/2309 +f 2726/2532/2310 3614/2531/2310 2721/2518/2310 2171/2517/2310 +f 2118/2525/2311 2729/2535/2311 3615/2536/2311 2724/2526/2311 +f 2729/2535/2312 2120/2537/2312 2730/2538/2312 3615/2536/2312 +f 3615/2536/2313 2730/2538/2313 2174/2539/2313 2731/2540/2313 +f 2724/2526/2314 3615/2536/2314 2731/2540/2314 2172/2527/2314 +f 2175/2541/2315 2733/2542/2315 3616/2543/2315 2732/2544/2315 +f 2733/2542/2316 2121/2545/2316 2734/2546/2316 3616/2543/2316 +f 3616/2543/2317 2734/2546/2317 2119/2533/2317 2727/2530/2317 +f 2732/2544/2318 3616/2543/2318 2727/2530/2318 2173/2529/2318 +f 2120/2537/2319 2735/2547/2319 3617/2548/2319 2730/2538/2319 +f 2735/2547/2320 2079/2549/2320 2736/2550/2320 3617/2548/2320 +f 3617/2548/2321 2736/2550/2321 2080/2551/2321 2737/2552/2321 +f 2730/2538/2322 3617/2548/2322 2737/2552/2322 2174/2539/2322 +f 2080/2551/2323 2736/2550/2323 3618/2553/2323 2738/2554/2323 +f 2736/2550/2324 2079/2549/2324 2739/2555/2324 3618/2553/2324 +f 3618/2553/2325 2739/2555/2325 2121/2545/2325 2733/2542/2325 +f 2738/2554/2326 3618/2553/2326 2733/2542/2326 2175/2541/2326 +f 2122/2556/2327 2741/2557/2327 3619/2558/2327 2740/2559/2327 +f 2741/2557/2328 2140/2560/2328 2742/2561/2328 3619/2558/2328 +f 3619/2558/2329 2742/2561/2329 2172/2527/2329 2731/2540/2329 +f 2740/2559/2330 3619/2558/2330 2731/2540/2330 2174/2539/2330 +f 2173/2529/2331 2743/2562/2331 3620/2563/2331 2732/2544/2331 +f 2743/2562/2332 2141/2564/2332 2744/2565/2332 3620/2563/2332 +f 3620/2563/2333 2744/2565/2333 2123/2566/2333 2745/2567/2333 +f 2732/2544/2334 3620/2563/2334 2745/2567/2334 2175/2541/2334 +f 2140/2560/2335 2746/2568/2335 3621/2569/2335 2742/2561/2335 +f 2746/2568/2336 2191/2570/2336 2747/2571/2336 3621/2569/2336 +f 3621/2569/2337 2747/2571/2337 2170/2515/2337 2725/2528/2337 +f 2742/2561/2338 3621/2569/2338 2725/2528/2338 2172/2527/2338 +f 2171/2517/2339 2748/2572/2339 3622/2573/2339 2726/2532/2339 +f 2748/2572/2340 2192/2574/2340 2749/2575/2340 3622/2573/2340 +f 3622/2573/2341 2749/2575/2341 2141/2564/2341 2743/2562/2341 +f 2726/2532/2342 3622/2573/2342 2743/2562/2342 2173/2529/2342 +f 2138/2576/2343 2751/2577/2343 3623/2578/2343 2750/2579/2343 +f 2751/2577/2344 2168/2503/2344 2719/2516/2344 3623/2578/2344 +f 3623/2578/2345 2719/2516/2345 2170/2515/2345 2747/2571/2345 +f 2750/2579/2346 3623/2578/2346 2747/2571/2346 2191/2570/2346 +f 2171/2517/2347 2720/2520/2347 3624/2580/2347 2748/2572/2347 +f 2720/2520/2348 2169/2505/2348 2752/2581/2348 3624/2580/2348 +f 3624/2580/2349 2752/2581/2349 2139/2582/2349 2753/2583/2349 +f 2748/2572/2350 3624/2580/2350 2753/2583/2350 2192/2574/2350 +f 2136/2584/2351 2755/2585/2351 3625/2586/2351 2754/2587/2351 +f 2755/2585/2352 2166/2491/2352 2713/2504/2352 3625/2586/2352 +f 3625/2586/2353 2713/2504/2353 2168/2503/2353 2751/2577/2353 +f 2754/2587/2354 3625/2586/2354 2751/2577/2354 2138/2576/2354 +f 2169/2505/2355 2714/2508/2355 3626/2588/2355 2752/2581/2355 +f 2714/2508/2356 2167/2493/2356 2756/2589/2356 3626/2588/2356 +f 3626/2588/2357 2756/2589/2357 2137/2590/2357 2757/2591/2357 +f 2752/2581/2358 3626/2588/2358 2757/2591/2358 2139/2582/2358 +f 2134/2592/2359 2759/2593/2359 3627/2594/2359 2758/2595/2359 +f 2759/2593/2360 2164/2479/2360 2707/2492/2360 3627/2594/2360 +f 3627/2594/2361 2707/2492/2361 2166/2491/2361 2755/2585/2361 +f 2758/2595/2362 3627/2594/2362 2755/2585/2362 2136/2584/2362 +f 2167/2493/2363 2708/2496/2363 3628/2596/2363 2756/2589/2363 +f 2708/2496/2364 2165/2481/2364 2760/2597/2364 3628/2596/2364 +f 3628/2596/2365 2760/2597/2365 2135/2598/2365 2761/2599/2365 +f 2756/2589/2366 3628/2596/2366 2761/2599/2366 2137/2590/2366 +f 2132/2600/2367 2763/2601/2367 3629/2602/2367 2762/2603/2367 +f 2763/2601/2368 2162/2467/2368 2701/2480/2368 3629/2602/2368 +f 3629/2602/2369 2701/2480/2369 2164/2479/2369 2759/2593/2369 +f 2762/2603/2370 3629/2602/2370 2759/2593/2370 2134/2592/2370 +f 2165/2481/2371 2702/2484/2371 3630/2604/2371 2760/2597/2371 +f 2702/2484/2372 2163/2469/2372 2764/2605/2372 3630/2604/2372 +f 3630/2604/2373 2764/2605/2373 2133/2606/2373 2765/2607/2373 +f 2760/2597/2374 3630/2604/2374 2765/2607/2374 2135/2598/2374 +f 2130/2608/2375 2767/2609/2375 3631/2610/2375 2766/2611/2375 +f 2767/2609/2376 2160/2455/2376 2695/2468/2376 3631/2610/2376 +f 3631/2610/2377 2695/2468/2377 2162/2467/2377 2763/2601/2377 +f 2766/2611/2378 3631/2610/2378 2763/2601/2378 2132/2600/2378 +f 2163/2469/2379 2696/2472/2379 3632/2612/2379 2764/2605/2379 +f 2696/2472/2380 2161/2457/2380 2768/2613/2380 3632/2612/2380 +f 3632/2612/2381 2768/2613/2381 2131/2614/2381 2769/2615/2381 +f 2764/2605/2382 3632/2612/2382 2769/2615/2382 2133/2606/2382 +f 2128/2616/2383 2771/2617/2383 3633/2618/2383 2770/2619/2383 +f 2771/2617/2384 2158/2439/2384 2689/2456/2384 3633/2618/2384 +f 3633/2618/2385 2689/2456/2385 2160/2455/2385 2767/2609/2385 +f 2770/2619/2386 3633/2618/2386 2767/2609/2386 2130/2608/2386 +f 2161/2457/2387 2690/2460/2387 3634/2620/2387 2768/2613/2387 +f 2690/2460/2388 2159/2442/2388 2772/2621/2388 3634/2620/2388 +f 3634/2620/2389 2772/2621/2389 2129/2622/2389 2773/2623/2389 +f 2768/2613/2390 3634/2620/2390 2773/2623/2390 2131/2614/2390 +f 2126/2624/2391 2775/2625/2391 3635/2626/2391 2774/2627/2391 +f 2775/2625/2392 2176/2441/2392 2682/2440/2392 3635/2626/2392 +f 3635/2626/2393 2682/2440/2393 2158/2439/2393 2771/2617/2393 +f 2774/2627/2394 3635/2626/2394 2771/2617/2394 2128/2616/2394 +f 2159/2442/2395 2683/2445/2395 3636/2628/2395 2772/2621/2395 +f 2683/2445/2396 2177/2450/2396 2776/2629/2396 3636/2628/2396 +f 3636/2628/2397 2776/2629/2397 2127/2630/2397 2777/2631/2397 +f 2772/2621/2398 3636/2628/2398 2777/2631/2398 2129/2622/2398 +f 2126/2624/2399 2778/2632/2399 3637/2633/2399 2775/2625/2399 +f 2778/2632/2400 2193/2634/2400 2779/2635/2400 3637/2633/2400 +f 3637/2633/2401 2779/2635/2401 2189/2636/2401 2780/2637/2401 +f 2775/2625/2402 3637/2633/2402 2780/2637/2402 2176/2441/2402 +f 2189/2636/2403 2782/2638/2403 3638/2639/2403 2781/2640/2403 +f 2782/2638/2404 2194/2641/2404 2783/2642/2404 3638/2639/2404 +f 3638/2639/2405 2783/2642/2405 2127/2630/2405 2776/2629/2405 +f 2781/2640/2406 3638/2639/2406 2776/2629/2406 2177/2450/2406 +f 2122/2556/2407 2740/2559/2407 3639/2643/2407 2784/2644/2407 +f 2740/2559/2408 2174/2539/2408 2737/2552/2408 3639/2643/2408 +f 3639/2643/2409 2737/2552/2409 2080/2551/2409 2785/2645/2409 +f 2784/2644/2410 3639/2643/2410 2785/2645/2410 2124/2646/2410 +f 2080/2551/2411 2738/2554/2411 3640/2647/2411 2786/2648/2411 +f 2738/2554/2412 2175/2541/2412 2745/2567/2412 3640/2647/2412 +f 3640/2647/2413 2745/2567/2413 2123/2566/2413 2787/2649/2413 +f 2786/2648/2414 3640/2647/2414 2787/2649/2414 2125/2650/2414 +f 2124/2646/2415 2785/2645/2415 3641/2651/2415 2788/2652/2415 +f 2785/2645/2416 2080/2551/2416 2789/2653/2416 3641/2651/2416 +f 3641/2651/2417 2789/2653/2417 2190/2654/2417 2790/2655/2417 +f 2788/2652/2418 3641/2651/2418 2790/2655/2418 2195/2656/2418 +f 2190/2654/2419 2789/2653/2419 3642/2657/2419 2791/2658/2419 +f 2789/2653/2420 2080/2551/2420 2786/2648/2420 3642/2657/2420 +f 3642/2657/2421 2786/2648/2421 2125/2650/2421 2792/2659/2421 +f 2791/2658/2422 3642/2657/2422 2792/2659/2422 2196/2660/2422 +f 2189/2636/2423 2779/2635/2423 3643/2661/2423 2793/2662/2423 +f 2779/2635/2424 2193/2634/2424 2794/2663/2424 3643/2661/2424 +f 3643/2661/2425 2794/2663/2425 2195/2656/2425 2790/2655/2425 +f 2793/2662/2426 3643/2661/2426 2790/2655/2426 2190/2654/2426 +f 2196/2660/2427 2795/2664/2427 3644/2665/2427 2791/2658/2427 +f 2795/2664/2428 2194/2641/2428 2782/2638/2428 3644/2665/2428 +f 3644/2665/2429 2782/2638/2429 2189/2636/2429 2793/2662/2429 +f 2791/2658/2430 3644/2665/2430 2793/2662/2430 2190/2654/2430 +f 2147/2666/2431 2797/2667/2431 3645/2668/2431 2796/2669/2431 +f 2797/2667/2432 2149/2670/2432 2798/2671/2432 3645/2668/2432 +f 3645/2668/2433 2798/2671/2433 2188/2376/2433 2650/2375/2433 +f 2796/2669/2434 3645/2668/2434 2650/2375/2434 2186/2374/2434 +f 2188/2376/2435 2798/2671/2435 3646/2672/2435 2652/2379/2435 +f 2798/2671/2436 2149/2670/2436 2799/2673/2436 3646/2672/2436 +f 3646/2672/2437 2799/2673/2437 2148/2674/2437 2800/2675/2437 +f 2652/2379/2438 3646/2672/2438 2800/2675/2438 2187/2381/2438 +f 2145/2676/2439 2802/2677/2439 3647/2678/2439 2801/2679/2439 +f 2802/2677/2440 2147/2666/2440 2796/2669/2440 3647/2678/2440 +f 3647/2678/2441 2796/2669/2441 2186/2374/2441 2657/2390/2441 +f 2801/2679/2442 3647/2678/2442 2657/2390/2442 2184/2389/2442 +f 2187/2381/2443 2800/2675/2443 3648/2680/2443 2658/2391/2443 +f 2800/2675/2444 2148/2674/2444 2803/2681/2444 3648/2680/2444 +f 3648/2680/2445 2803/2681/2445 2146/2682/2445 2804/2683/2445 +f 2658/2391/2446 3648/2680/2446 2804/2683/2446 2185/2393/2446 +f 2143/2684/2447 2806/2685/2447 3649/2686/2447 2805/2687/2447 +f 2806/2685/2448 2145/2676/2448 2801/2679/2448 3649/2686/2448 +f 3649/2686/2449 2801/2679/2449 2184/2389/2449 2663/2402/2449 +f 2805/2687/2450 3649/2686/2450 2663/2402/2450 2182/2401/2450 +f 2185/2393/2451 2804/2683/2451 3650/2688/2451 2664/2403/2451 +f 2804/2683/2452 2146/2682/2452 2807/2689/2452 3650/2688/2452 +f 3650/2688/2453 2807/2689/2453 2144/2690/2453 2808/2691/2453 +f 2664/2403/2454 3650/2688/2454 2808/2691/2454 2183/2405/2454 +f 2178/2425/2455 2809/2692/2455 3651/2693/2455 2675/2426/2455 +f 2809/2692/2456 2199/2694/2456 2810/2695/2456 3651/2693/2456 +f 3651/2693/2457 2810/2695/2457 2197/2696/2457 2811/2697/2457 +f 2675/2426/2458 3651/2693/2458 2811/2697/2458 2180/2413/2458 +f 2198/2698/2459 2813/2699/2459 3652/2700/2459 2812/2701/2459 +f 2813/2699/2460 2200/2702/2460 2814/2703/2460 3652/2700/2460 +f 3652/2700/2461 2814/2703/2461 2179/2429/2461 2676/2427/2461 +f 2812/2701/2462 3652/2700/2462 2676/2427/2462 2181/2417/2462 +f 2143/2684/2463 2805/2687/2463 3653/2704/2463 2815/2705/2463 +f 2805/2687/2464 2182/2401/2464 2669/2414/2464 3653/2704/2464 +f 3653/2704/2465 2669/2414/2465 2180/2413/2465 2811/2697/2465 +f 2815/2705/2466 3653/2704/2466 2811/2697/2466 2197/2696/2466 +f 2181/2417/2467 2670/2415/2467 3654/2706/2467 2812/2701/2467 +f 2670/2415/2468 2183/2405/2468 2808/2691/2468 3654/2706/2468 +f 3654/2706/2469 2808/2691/2469 2144/2690/2469 2816/2707/2469 +f 2812/2701/2470 3654/2706/2470 2816/2707/2470 2198/2698/2470 +f 2156/2708/2471 2818/2709/2471 3655/2710/2471 2817/2711/2471 +f 2818/2709/2472 2202/2712/2472 2819/2713/2472 3655/2710/2472 +f 3655/2710/2473 2819/2713/2473 2201/2714/2473 2820/2715/2473 +f 2817/2711/2474 3655/2710/2474 2820/2715/2474 2199/2694/2474 +f 2201/2714/2475 2819/2713/2475 3656/2716/2475 2821/2717/2475 +f 2819/2713/2476 2202/2712/2476 2822/2718/2476 3656/2716/2476 +f 3656/2716/2477 2822/2718/2477 2157/2719/2477 2823/2720/2477 +f 2821/2717/2478 3656/2716/2478 2823/2720/2478 2200/2702/2478 +f 2197/2696/2479 2810/2695/2479 3657/2721/2479 2824/2722/2479 +f 2810/2695/2480 2199/2694/2480 2820/2715/2480 3657/2721/2480 +f 3657/2721/2481 2820/2715/2481 2201/2714/2481 2825/2723/2481 +f 2824/2722/2482 3657/2721/2482 2825/2723/2482 2081/2724/2482 +f 2201/2714/2481 2821/2717/2481 3658/2725/2481 2825/2723/2481 +f 2821/2717/2483 2200/2702/2483 2813/2699/2483 3658/2725/2483 +f 3658/2725/2484 2813/2699/2484 2198/2698/2484 2826/2726/2484 +f 2825/2723/2485 3658/2725/2485 2826/2726/2485 2081/2724/2485 +f 2142/2727/2486 2828/2728/2486 3659/2729/2486 2827/2730/2486 +f 2828/2728/2487 2143/2684/2487 2815/2705/2487 3659/2729/2487 +f 3659/2729/2488 2815/2705/2488 2197/2696/2488 2824/2722/2488 +f 2827/2730/2489 3659/2729/2489 2824/2722/2489 2081/2724/2489 +f 2198/2698/2490 2816/2707/2490 3660/2731/2490 2826/2726/2490 +f 2816/2707/2491 2144/2690/2491 2829/2732/2491 3660/2731/2491 +f 3660/2731/2492 2829/2732/2492 2142/2727/2492 2827/2730/2492 +f 2826/2726/2493 3660/2731/2493 2827/2730/2493 2081/2724/2493 +f 2154/2733/2494 2831/2734/2494 3661/2735/2494 2830/2736/2494 +f 2831/2734/2495 2205/2737/2495 2832/2738/2495 3661/2735/2495 +f 3661/2735/2496 2832/2738/2496 2203/2739/2496 2833/2740/2496 +f 2830/2736/2497 3661/2735/2497 2833/2740/2497 2156/2708/2497 +f 2204/2741/2498 2835/2742/2498 3662/2743/2498 2834/2744/2498 +f 2835/2742/2499 2206/2745/2499 2836/2746/2499 3662/2743/2499 +f 3662/2743/2500 2836/2746/2500 2155/2747/2500 2837/2748/2500 +f 2834/2744/2501 3662/2743/2501 2837/2748/2501 2157/2719/2501 +f 2152/2749/2502 2839/2750/2502 3663/2751/2502 2838/2752/2502 +f 2839/2750/2503 2207/2753/2503 2840/2754/2503 3663/2751/2503 +f 3663/2751/2504 2840/2754/2504 2205/2737/2504 2831/2734/2504 +f 2838/2752/2505 3663/2751/2505 2831/2734/2505 2154/2733/2505 +f 2206/2745/2506 2841/2755/2506 3664/2756/2506 2836/2746/2506 +f 2841/2755/2507 2208/2757/2507 2842/2758/2507 3664/2756/2507 +f 3664/2756/2508 2842/2758/2508 2153/2759/2508 2843/2760/2508 +f 2836/2746/2509 3664/2756/2509 2843/2760/2509 2155/2747/2509 +f 2151/2761/2510 2845/2762/2510 3665/2763/2510 2844/2764/2510 +f 2845/2762/2511 2209/2765/2511 2846/2766/2511 3665/2763/2511 +f 3665/2763/2512 2846/2766/2512 2207/2753/2512 2839/2750/2512 +f 2844/2764/2513 3665/2763/2513 2839/2750/2513 2152/2749/2513 +f 2208/2757/2514 2847/2767/2514 3666/2768/2514 2842/2758/2514 +f 2847/2767/2515 2210/2769/2515 2848/2770/2515 3666/2768/2515 +f 3666/2768/2516 2848/2770/2516 2151/2761/2516 2849/2771/2516 +f 2842/2758/2517 3666/2768/2517 2849/2771/2517 2153/2759/2517 +f 2150/2772/2518 2851/2773/2518 3667/2774/2518 2850/2775/2518 +f 2851/2773/2519 2083/2776/2519 2852/2777/2519 3667/2774/2519 +f 3667/2774/2520 2852/2777/2520 2209/2765/2520 2845/2762/2520 +f 2850/2775/2521 3667/2774/2521 2845/2762/2521 2151/2761/2521 +f 2210/2769/2522 2853/2778/2522 3668/2779/2522 2848/2770/2522 +f 2853/2778/2523 2083/2776/2523 2851/2773/2523 3668/2779/2523 +f 3668/2779/2524 2851/2773/2524 2150/2772/2524 2850/2775/2524 +f 2848/2770/2525 3668/2779/2525 2850/2775/2525 2151/2761/2525 +f 2202/2712/2526 2818/2709/2526 3669/2780/2526 2854/2781/2526 +f 2818/2709/2527 2156/2708/2527 2833/2740/2527 3669/2780/2527 +f 3669/2780/2528 2833/2740/2528 2203/2739/2528 2855/2782/2528 +f 2854/2781/2529 3669/2780/2529 2855/2782/2529 2082/2783/2529 +f 2204/2741/2530 2834/2744/2530 3670/2784/2530 2856/2785/2530 +f 2834/2744/2531 2157/2719/2531 2822/2718/2531 3670/2784/2531 +f 3670/2784/2532 2822/2718/2532 2202/2712/2532 2854/2781/2532 +f 2856/2785/2533 3670/2784/2533 2854/2781/2533 2082/2783/2533 +f 2082/2783/2534 2855/2782/2534 3671/2786/2534 2857/2787/2534 +f 2855/2782/2535 2203/2739/2535 2858/2788/2535 3671/2786/2535 +f 3671/2786/2536 2858/2788/2536 2218/2789/2536 2859/2790/2536 +f 2857/2787/2537 3671/2786/2537 2859/2790/2537 2220/2791/2537 +f 2219/2792/2538 2861/2793/2538 3672/2794/2538 2860/2795/2538 +f 2861/2793/2539 2204/2741/2539 2856/2785/2539 3672/2794/2539 +f 3672/2794/2540 2856/2785/2540 2082/2783/2540 2857/2787/2540 +f 2860/2795/2541 3672/2794/2541 2857/2787/2541 2220/2791/2541 +f 2083/2776/2542 2862/2796/2542 3673/2797/2542 2852/2777/2542 +f 2862/2796/2543 2211/2798/2543 2863/2799/2543 3673/2797/2543 +f 3673/2797/2544 2863/2799/2544 2212/2800/2544 2864/2801/2544 +f 2852/2777/2545 3673/2797/2545 2864/2801/2545 2209/2765/2545 +f 2213/2802/2546 2866/2803/2546 3674/2804/2546 2865/2805/2546 +f 2866/2803/2547 2211/2798/2547 2862/2796/2547 3674/2804/2547 +f 3674/2804/2548 2862/2796/2548 2083/2776/2548 2853/2778/2548 +f 2865/2805/2549 3674/2804/2549 2853/2778/2549 2210/2769/2549 +f 2209/2765/2550 2864/2801/2550 3675/2806/2550 2846/2766/2550 +f 2864/2801/2551 2212/2800/2551 2867/2807/2551 3675/2806/2551 +f 3675/2806/2552 2867/2807/2552 2214/2808/2552 2868/2809/2552 +f 2846/2766/2553 3675/2806/2553 2868/2809/2553 2207/2753/2553 +f 2215/2810/2554 2870/2811/2554 3676/2812/2554 2869/2813/2554 +f 2870/2811/2555 2213/2802/2555 2865/2805/2555 3676/2812/2555 +f 3676/2812/2556 2865/2805/2556 2210/2769/2556 2847/2767/2556 +f 2869/2813/2557 3676/2812/2557 2847/2767/2557 2208/2757/2557 +f 2207/2753/2558 2868/2809/2558 3677/2814/2558 2840/2754/2558 +f 2868/2809/2559 2214/2808/2559 2871/2815/2559 3677/2814/2559 +f 3677/2814/2560 2871/2815/2560 2216/2816/2560 2872/2817/2560 +f 2840/2754/2561 3677/2814/2561 2872/2817/2561 2205/2737/2561 +f 2217/2818/2562 2874/2819/2562 3678/2820/2562 2873/2821/2562 +f 2874/2819/2563 2215/2810/2563 2869/2813/2563 3678/2820/2563 +f 3678/2820/2564 2869/2813/2564 2208/2757/2564 2841/2755/2564 +f 2873/2821/2565 3678/2820/2565 2841/2755/2565 2206/2745/2565 +f 2205/2737/2566 2872/2817/2566 3679/2822/2566 2832/2738/2566 +f 2872/2817/2567 2216/2816/2567 2875/2823/2567 3679/2822/2567 +f 3679/2822/2568 2875/2823/2568 2218/2789/2568 2858/2788/2568 +f 2832/2738/2569 3679/2822/2569 2858/2788/2569 2203/2739/2569 +f 2219/2792/2570 2876/2824/2570 3680/2825/2570 2861/2793/2570 +f 2876/2824/2571 2217/2818/2571 2873/2821/2571 3680/2825/2571 +f 3680/2825/2572 2873/2821/2572 2206/2745/2572 2835/2742/2572 +f 2861/2793/2573 3680/2825/2573 2835/2742/2573 2204/2741/2573 +f 2211/2798/2574 2877/2826/2574 3681/2827/2574 2863/2799/2574 +f 2877/2826/2575 2216/2816/2575 2871/2815/2575 3681/2827/2575 +f 3681/2827/2576 2871/2815/2576 2214/2808/2576 2867/2807/2576 +f 2863/2799/2577 3681/2827/2577 2867/2807/2577 2212/2800/2577 +f 2215/2810/2578 2874/2819/2578 3682/2828/2578 2870/2811/2578 +f 2874/2819/2579 2217/2818/2579 2878/2829/2579 3682/2828/2579 +f 3682/2828/2580 2878/2829/2580 2211/2798/2580 2866/2803/2580 +f 2870/2811/2581 3682/2828/2581 2866/2803/2581 2213/2802/2581 +f 2211/2798/2582 2879/2830/2582 3683/2831/2582 2877/2826/2582 +f 2879/2830/2583 2220/2791/2583 2859/2790/2583 3683/2831/2583 +f 3683/2831/2584 2859/2790/2584 2218/2789/2584 2875/2823/2584 +f 2877/2826/2585 3683/2831/2585 2875/2823/2585 2216/2816/2585 +f 2219/2792/2586 2860/2795/2586 3684/2832/2586 2876/2824/2586 +f 2860/2795/2587 2220/2791/2587 2879/2830/2587 3684/2832/2587 +f 3684/2832/2588 2879/2830/2588 2211/2798/2588 2878/2829/2588 +f 2876/2824/2589 3684/2832/2589 2878/2829/2589 2217/2818/2589 +f 2151/2761/2590 2844/2764/2590 3685/2833/2590 2880/2834/2590 +f 2844/2764/2591 2152/2749/2591 2881/2835/2591 3685/2833/2591 +f 3685/2833/2592 2881/2835/2592 2176/2441/2592 2780/2637/2592 +f 2880/2834/2593 3685/2833/2593 2780/2637/2593 2189/2636/2593 +f 2177/2450/2594 2882/2836/2594 3686/2837/2594 2781/2640/2594 +f 2882/2836/2595 2153/2759/2595 2849/2771/2595 3686/2837/2595 +f 3686/2837/2596 2849/2771/2596 2151/2761/2596 2880/2834/2596 +f 2781/2640/2597 3686/2837/2597 2880/2834/2597 2189/2636/2597 +f 2152/2749/2598 2838/2752/2598 3687/2838/2598 2881/2835/2598 +f 2838/2752/2599 2154/2733/2599 2883/2839/2599 3687/2838/2599 +f 3687/2838/2600 2883/2839/2600 2223/2840/2600 2884/2841/2600 +f 2881/2835/2601 3687/2838/2601 2884/2841/2601 2176/2441/2601 +f 2224/2842/2602 2886/2843/2602 3688/2844/2602 2885/2845/2602 +f 2886/2843/2603 2155/2747/2603 2843/2760/2603 3688/2844/2603 +f 3688/2844/2604 2843/2760/2604 2153/2759/2604 2882/2836/2604 +f 2885/2845/2605 3688/2844/2605 2882/2836/2605 2177/2450/2605 +f 2154/2733/2606 2830/2736/2606 3689/2846/2606 2883/2839/2606 +f 2830/2736/2607 2156/2708/2607 2887/2847/2607 3689/2846/2607 +f 3689/2846/2608 2887/2847/2608 2225/2848/2608 2888/2849/2608 +f 2883/2839/2609 3689/2846/2609 2888/2849/2609 2223/2840/2609 +f 2226/2850/2610 2890/2851/2610 3690/2852/2610 2889/2853/2610 +f 2890/2851/2611 2157/2719/2611 2837/2748/2611 3690/2852/2611 +f 3690/2852/2612 2837/2748/2612 2155/2747/2612 2886/2843/2612 +f 2889/2853/2613 3690/2852/2613 2886/2843/2613 2224/2842/2613 +f 2156/2708/2614 2817/2711/2614 3691/2854/2614 2887/2847/2614 +f 2817/2711/2615 2199/2694/2615 2809/2692/2615 3691/2854/2615 +f 3691/2854/2616 2809/2692/2616 2178/2425/2616 2891/2855/2616 +f 2887/2847/2617 3691/2854/2617 2891/2855/2617 2225/2848/2617 +f 2179/2429/2618 2814/2703/2618 3692/2856/2618 2892/2857/2618 +f 2814/2703/2619 2200/2702/2619 2823/2720/2619 3692/2856/2619 +f 3692/2856/2620 2823/2720/2620 2157/2719/2620 2890/2851/2620 +f 2892/2857/2621 3692/2856/2621 2890/2851/2621 2226/2850/2621 +f 2093/2421/2622 2893/2858/2622 3693/2859/2622 2674/2422/2622 +f 2893/2858/2623 2221/2860/2623 2894/2861/2623 3693/2859/2623 +f 3693/2859/2624 2894/2861/2624 2225/2848/2624 2891/2855/2624 +f 2674/2422/2625 3693/2859/2625 2891/2855/2625 2178/2425/2625 +f 2226/2850/2626 2895/2862/2626 3694/2863/2626 2892/2857/2626 +f 2895/2862/2627 2222/2864/2627 2896/2865/2627 3694/2863/2627 +f 3694/2863/2628 2896/2865/2628 2094/2431/2628 2677/2430/2628 +f 2892/2857/2629 3694/2863/2629 2677/2430/2629 2179/2429/2629 +f 2221/2860/2630 2897/2866/2630 3695/2867/2630 2894/2861/2630 +f 2897/2866/2631 2227/2868/2631 2898/2869/2631 3695/2867/2631 +f 3695/2867/2632 2898/2869/2632 2223/2840/2632 2888/2849/2632 +f 2894/2861/2633 3695/2867/2633 2888/2849/2633 2225/2848/2633 +f 2224/2842/2634 2899/2870/2634 3696/2871/2634 2889/2853/2634 +f 2899/2870/2635 2228/2872/2635 2900/2873/2635 3696/2871/2635 +f 3696/2871/2636 2900/2873/2636 2222/2864/2636 2895/2862/2636 +f 2889/2853/2637 3696/2871/2637 2895/2862/2637 2226/2850/2637 +f 2091/2433/2638 2679/2436/2638 3697/2874/2638 2901/2875/2638 +f 2679/2436/2639 2176/2441/2639 2884/2841/2639 3697/2874/2639 +f 3697/2874/2640 2884/2841/2640 2223/2840/2640 2898/2869/2640 +f 2901/2875/2641 3697/2874/2641 2898/2869/2641 2227/2868/2641 +f 2224/2842/2642 2885/2845/2642 3698/2876/2642 2899/2870/2642 +f 2885/2845/2643 2177/2450/2643 2686/2449/2643 3698/2876/2643 +f 3698/2876/2644 2686/2449/2644 2092/2448/2644 2902/2877/2644 +f 2899/2870/2645 3698/2876/2645 2902/2877/2645 2228/2872/2645 +f 2143/2684/2646 2828/2728/2646 3699/2878/2646 2903/2879/2646 +f 2828/2728/2647 2142/2727/2647 2904/2880/2647 3699/2878/2647 +f 3699/2878/2648 2904/2880/2648 2084/2881/2648 2905/2882/2648 +f 2903/2879/2649 3699/2878/2649 2905/2882/2649 2234/2883/2649 +f 2084/2881/2650 2904/2880/2650 3700/2884/2650 2906/2885/2650 +f 2904/2880/2651 2142/2727/2651 2829/2732/2651 3700/2884/2651 +f 3700/2884/2652 2829/2732/2652 2144/2690/2652 2907/2886/2652 +f 2906/2885/2653 3700/2884/2653 2907/2886/2653 2235/2887/2653 +f 2145/2676/2654 2806/2685/2654 3701/2888/2654 2908/2889/2654 +f 2806/2685/2655 2143/2684/2655 2903/2879/2655 3701/2888/2655 +f 3701/2888/2656 2903/2879/2656 2234/2883/2656 2909/2890/2656 +f 2908/2889/2657 3701/2888/2657 2909/2890/2657 2232/2891/2657 +f 2235/2887/2658 2907/2886/2658 3702/2892/2658 2910/2893/2658 +f 2907/2886/2659 2144/2690/2659 2807/2689/2659 3702/2892/2659 +f 3702/2892/2660 2807/2689/2660 2146/2682/2660 2911/2894/2660 +f 2910/2893/2661 3702/2892/2661 2911/2894/2661 2233/2895/2661 +f 2147/2666/2662 2802/2677/2662 3703/2896/2662 2912/2897/2662 +f 2802/2677/2663 2145/2676/2663 2908/2889/2663 3703/2896/2663 +f 3703/2896/2664 2908/2889/2664 2232/2891/2664 2913/2898/2664 +f 2912/2897/2665 3703/2896/2665 2913/2898/2665 2230/2899/2665 +f 2233/2895/2666 2911/2894/2666 3704/2900/2666 2914/2901/2666 +f 2911/2894/2667 2146/2682/2667 2803/2681/2667 3704/2900/2667 +f 3704/2900/2668 2803/2681/2668 2148/2674/2668 2915/2902/2668 +f 2914/2901/2669 3704/2900/2669 2915/2902/2669 2231/2903/2669 +f 2149/2670/2670 2797/2667/2670 3705/2904/2670 2916/2905/2670 +f 2797/2667/2671 2147/2666/2671 2912/2897/2671 3705/2904/2671 +f 3705/2904/2672 2912/2897/2672 2230/2899/2672 2917/2906/2672 +f 2916/2905/2673 3705/2904/2673 2917/2906/2673 2229/2907/2673 +f 2231/2903/2674 2915/2902/2674 3706/2908/2674 2918/2909/2674 +f 2915/2902/2675 2148/2674/2675 2799/2673/2675 3706/2908/2675 +f 3706/2908/2676 2799/2673/2676 2149/2670/2676 2916/2905/2676 +f 2918/2909/2677 3706/2908/2677 2916/2905/2677 2229/2907/2677 +f 2229/2907/2678 2917/2906/2678 3707/2910/2678 2919/2911/2678 +f 2917/2906/2679 2230/2899/2679 2920/2912/2679 3707/2910/2679 +f 3707/2910/2680 2920/2912/2680 2241/2913/2680 2921/2914/2680 +f 2919/2911/2681 3707/2910/2681 2921/2914/2681 2243/2915/2681 +f 2242/2916/2682 2923/2917/2682 3708/2918/2682 2922/2919/2682 +f 2923/2917/2683 2231/2903/2683 2918/2909/2683 3708/2918/2683 +f 3708/2918/2684 2918/2909/2684 2229/2907/2684 2919/2911/2684 +f 2922/2919/2685 3708/2918/2685 2919/2911/2685 2243/2915/2685 +f 2230/2899/2686 2913/2898/2686 3709/2920/2686 2920/2912/2686 +f 2913/2898/2687 2232/2891/2687 2924/2921/2687 3709/2920/2687 +f 3709/2920/2688 2924/2921/2688 2239/2922/2688 2925/2923/2688 +f 2920/2912/2689 3709/2920/2689 2925/2923/2689 2241/2913/2689 +f 2240/2924/2690 2927/2925/2690 3710/2926/2690 2926/2927/2690 +f 2927/2925/2691 2233/2895/2691 2914/2901/2691 3710/2926/2691 +f 3710/2926/2692 2914/2901/2692 2231/2903/2692 2923/2917/2692 +f 2926/2927/2693 3710/2926/2693 2923/2917/2693 2242/2916/2693 +f 2232/2891/2694 2909/2890/2694 3711/2928/2694 2924/2921/2694 +f 2909/2890/2695 2234/2883/2695 2928/2929/2695 3711/2928/2695 +f 3711/2928/2696 2928/2929/2696 2237/2930/2696 2929/2931/2696 +f 2924/2921/2697 3711/2928/2697 2929/2931/2697 2239/2922/2697 +f 2238/2932/2698 2931/2933/2698 3712/2934/2698 2930/2935/2698 +f 2931/2933/2699 2235/2887/2699 2910/2893/2699 3712/2934/2699 +f 3712/2934/2700 2910/2893/2700 2233/2895/2700 2927/2925/2700 +f 2930/2935/2701 3712/2934/2701 2927/2925/2701 2240/2924/2701 +f 2234/2883/2702 2905/2882/2702 3713/2936/2702 2928/2929/2702 +f 2905/2882/2703 2084/2881/2703 2932/2937/2703 3713/2936/2703 +f 3713/2936/2704 2932/2937/2704 2236/2938/2704 2933/2939/2704 +f 2928/2929/2705 3713/2936/2705 2933/2939/2705 2237/2930/2705 +f 2236/2938/2706 2932/2937/2706 3714/2940/2706 2934/2941/2706 +f 2932/2937/2707 2084/2881/2707 2906/2885/2707 3714/2940/2707 +f 3714/2940/2708 2906/2885/2708 2235/2887/2708 2931/2933/2708 +f 2934/2941/2709 3714/2940/2709 2931/2933/2709 2238/2932/2709 +f 2236/2938/2710 2935/2942/2710 3715/2943/2710 2933/2939/2710 +f 2935/2942/2711 2243/2915/2711 2921/2914/2711 3715/2943/2711 +f 3715/2943/2712 2921/2914/2712 2241/2913/2712 2936/2944/2712 +f 2933/2939/2713 3715/2943/2713 2936/2944/2713 2237/2930/2713 +f 2242/2916/2714 2922/2919/2714 3716/2945/2714 2937/2946/2714 +f 2922/2919/2715 2243/2915/2715 2935/2942/2715 3716/2945/2715 +f 3716/2945/2716 2935/2942/2716 2236/2938/2716 2934/2941/2716 +f 2937/2946/2717 3716/2945/2717 2934/2941/2717 2238/2932/2717 +f 2237/2930/2718 2936/2944/2718 3717/2947/2718 2929/2931/2718 +f 2241/2913/2719 2925/2923/2719 3717/2947/2719 2936/2944/2719 +f 2239/2922/2720 2929/2931/2720 3717/2947/2720 2925/2923/2720 +f 2240/2924/2721 2926/2927/2721 3718/2948/2721 2930/2935/2721 +f 2242/2916/2722 2937/2946/2722 3718/2948/2722 2926/2927/2722 +f 2238/2932/2723 2930/2935/2723 3718/2948/2723 2937/2946/2723 +f 2195/2656/2724 2794/2663/2724 3719/2949/2724 2938/2950/2724 +f 2794/2663/2725 2193/2634/2725 2939/2951/2725 3719/2949/2725 +f 3719/2949/2726 2939/2951/2726 2246/2952/2726 2940/2953/2726 +f 2938/2950/2727 3719/2949/2727 2940/2953/2727 2244/2954/2727 +f 2247/2955/2728 2942/2956/2728 3720/2957/2728 2941/2958/2728 +f 2942/2956/2729 2194/2641/2729 2795/2664/2729 3720/2957/2729 +f 3720/2957/2730 2795/2664/2730 2196/2660/2730 2943/2959/2730 +f 2941/2958/2731 3720/2957/2731 2943/2959/2731 2245/2960/2731 +f 2124/2646/2732 2788/2652/2732 3721/2961/2732 2944/2962/2732 +f 2788/2652/2733 2195/2656/2733 2938/2950/2733 3721/2961/2733 +f 3721/2961/2734 2938/2950/2734 2244/2954/2734 2945/2963/2734 +f 2944/2962/2735 3721/2961/2735 2945/2963/2735 2266/2964/2735 +f 2245/2960/2736 2943/2959/2736 3722/2965/2736 2946/2966/2736 +f 2943/2959/2737 2196/2660/2737 2792/2659/2737 3722/2965/2737 +f 3722/2965/2738 2792/2659/2738 2125/2650/2738 2947/2967/2738 +f 2946/2966/2739 3722/2965/2739 2947/2967/2739 2267/2968/2739 +f 2122/2556/2740 2784/2644/2740 3723/2969/2740 2948/2970/2740 +f 2784/2644/2741 2124/2646/2741 2944/2962/2741 3723/2969/2741 +f 3723/2969/2742 2944/2962/2742 2266/2964/2742 2949/2971/2742 +f 2948/2970/2743 3723/2969/2743 2949/2971/2743 2268/2972/2743 +f 2267/2968/2744 2947/2967/2744 3724/2973/2744 2950/2974/2744 +f 2947/2967/2745 2125/2650/2745 2787/2649/2745 3724/2973/2745 +f 3724/2973/2746 2787/2649/2746 2123/2566/2746 2951/2975/2746 +f 2950/2974/2747 3724/2973/2747 2951/2975/2747 2269/2976/2747 +f 2193/2634/2748 2778/2632/2748 3725/2977/2748 2939/2951/2748 +f 2778/2632/2749 2126/2624/2749 2952/2978/2749 3725/2977/2749 +f 3725/2977/2750 2952/2978/2750 2264/2979/2750 2953/2980/2750 +f 2939/2951/2751 3725/2977/2751 2953/2980/2751 2246/2952/2751 +f 2265/2981/2752 2955/2982/2752 3726/2983/2752 2954/2984/2752 +f 2955/2982/2753 2127/2630/2753 2783/2642/2753 3726/2983/2753 +f 3726/2983/2754 2783/2642/2754 2194/2641/2754 2942/2956/2754 +f 2954/2984/2755 3726/2983/2755 2942/2956/2755 2247/2955/2755 +f 2126/2624/2756 2774/2627/2756 3727/2985/2756 2952/2978/2756 +f 2774/2627/2757 2128/2616/2757 2956/2986/2757 3727/2985/2757 +f 3727/2985/2758 2956/2986/2758 2262/2987/2758 2957/2988/2758 +f 2952/2978/2759 3727/2985/2759 2957/2988/2759 2264/2979/2759 +f 2263/2989/2760 2959/2990/2760 3728/2991/2760 2958/2992/2760 +f 2959/2990/2761 2129/2622/2761 2777/2631/2761 3728/2991/2761 +f 3728/2991/2762 2777/2631/2762 2127/2630/2762 2955/2982/2762 +f 2958/2992/2763 3728/2991/2763 2955/2982/2763 2265/2981/2763 +f 2128/2616/2764 2770/2619/2764 3729/2993/2764 2956/2986/2764 +f 2770/2619/2765 2130/2608/2765 2960/2994/2765 3729/2993/2765 +f 3729/2993/2766 2960/2994/2766 2260/2995/2766 2961/2996/2766 +f 2956/2986/2767 3729/2993/2767 2961/2996/2767 2262/2987/2767 +f 2261/2997/2768 2963/2998/2768 3730/2999/2768 2962/3000/2768 +f 2963/2998/2769 2131/2614/2769 2773/2623/2769 3730/2999/2769 +f 3730/2999/2770 2773/2623/2770 2129/2622/2770 2959/2990/2770 +f 2962/3000/2771 3730/2999/2771 2959/2990/2771 2263/2989/2771 +f 2130/2608/2772 2766/2611/2772 3731/3001/2772 2960/2994/2772 +f 2766/2611/2773 2132/2600/2773 2964/3002/2773 3731/3001/2773 +f 3731/3001/2774 2964/3002/2774 2258/3003/2774 2965/3004/2774 +f 2960/2994/2775 3731/3001/2775 2965/3004/2775 2260/2995/2775 +f 2259/3005/2776 2967/3006/2776 3732/3007/2776 2966/3008/2776 +f 2967/3006/2777 2133/2606/2777 2769/2615/2777 3732/3007/2777 +f 3732/3007/2778 2769/2615/2778 2131/2614/2778 2963/2998/2778 +f 2966/3008/2779 3732/3007/2779 2963/2998/2779 2261/2997/2779 +f 2132/2600/2780 2762/2603/2780 3733/3009/2780 2964/3002/2780 +f 2762/2603/2781 2134/2592/2781 2968/3010/2781 3733/3009/2781 +f 3733/3009/2782 2968/3010/2782 2256/3011/2782 2969/3012/2782 +f 2964/3002/2783 3733/3009/2783 2969/3012/2783 2258/3003/2783 +f 2257/3013/2784 2971/3014/2784 3734/3015/2784 2970/3016/2784 +f 2971/3014/2785 2135/2598/2785 2765/2607/2785 3734/3015/2785 +f 3734/3015/2786 2765/2607/2786 2133/2606/2786 2967/3006/2786 +f 2970/3016/2787 3734/3015/2787 2967/3006/2787 2259/3005/2787 +f 2134/2592/2788 2758/2595/2788 3735/3017/2788 2968/3010/2788 +f 2758/2595/2789 2136/2584/2789 2972/3018/2789 3735/3017/2789 +f 3735/3017/2790 2972/3018/2790 2254/3019/2790 2973/3020/2790 +f 2968/3010/2791 3735/3017/2791 2973/3020/2791 2256/3011/2791 +f 2255/3021/2792 2975/3022/2792 3736/3023/2792 2974/3024/2792 +f 2975/3022/2793 2137/2590/2793 2761/2599/2793 3736/3023/2793 +f 3736/3023/2794 2761/2599/2794 2135/2598/2794 2971/3014/2794 +f 2974/3024/2795 3736/3023/2795 2971/3014/2795 2257/3013/2795 +f 2136/2584/2796 2754/2587/2796 3737/3025/2796 2972/3018/2796 +f 2754/2587/2797 2138/2576/2797 2976/3026/2797 3737/3025/2797 +f 3737/3025/2798 2976/3026/2798 2252/3027/2798 2977/3028/2798 +f 2972/3018/2799 3737/3025/2799 2977/3028/2799 2254/3019/2799 +f 2253/3029/2800 2979/3030/2800 3738/3031/2800 2978/3032/2800 +f 2979/3030/2801 2139/2582/2801 2757/2591/2801 3738/3031/2801 +f 3738/3031/2802 2757/2591/2802 2137/2590/2802 2975/3022/2802 +f 2978/3032/2803 3738/3031/2803 2975/3022/2803 2255/3021/2803 +f 2138/2576/2804 2750/2579/2804 3739/3033/2804 2976/3026/2804 +f 2750/2579/2805 2191/2570/2805 2980/3034/2805 3739/3033/2805 +f 3739/3033/2806 2980/3034/2806 2248/3035/2806 2981/3036/2806 +f 2976/3026/2807 3739/3033/2807 2981/3036/2807 2252/3027/2807 +f 2249/3037/2808 2983/3038/2808 3740/3039/2808 2982/3040/2808 +f 2983/3038/2809 2192/2574/2809 2753/2583/2809 3740/3039/2809 +f 3740/3039/2810 2753/2583/2810 2139/2582/2810 2979/3030/2810 +f 2982/3040/2811 3740/3039/2811 2979/3030/2811 2253/3029/2811 +f 2191/2570/2812 2746/2568/2812 3741/3041/2812 2980/3034/2812 +f 2746/2568/2813 2140/2560/2813 2984/3042/2813 3741/3041/2813 +f 3741/3041/2814 2984/3042/2814 2250/3043/2814 2985/3044/2814 +f 2980/3034/2815 3741/3041/2815 2985/3044/2815 2248/3035/2815 +f 2251/3045/2816 2987/3046/2816 3742/3047/2816 2986/3048/2816 +f 2987/3046/2817 2141/2564/2817 2749/2575/2817 3742/3047/2817 +f 3742/3047/2818 2749/2575/2818 2192/2574/2818 2983/3038/2818 +f 2986/3048/2819 3742/3047/2819 2983/3038/2819 2249/3037/2819 +f 2140/2560/2820 2741/2557/2820 3743/3049/2820 2984/3042/2820 +f 2741/2557/2821 2122/2556/2821 2948/2970/2821 3743/3049/2821 +f 3743/3049/2822 2948/2970/2822 2268/2972/2822 2988/3050/2822 +f 2984/3042/2823 3743/3049/2823 2988/3050/2823 2250/3043/2823 +f 2269/2976/2824 2951/2975/2824 3744/3051/2824 2989/3052/2824 +f 2951/2975/2825 2123/2566/2825 2744/2565/2825 3744/3051/2825 +f 3744/3051/2826 2744/2565/2826 2141/2564/2826 2987/3046/2826 +f 2989/3052/2827 3744/3051/2827 2987/3046/2827 2251/3045/2827 +f 2250/3043/2828 2988/3050/2828 3745/3053/2828 2990/3054/2828 +f 2988/3050/2829 2268/2972/2829 2991/3055/2829 3745/3053/2829 +f 3745/3053/2830 2991/3055/2830 2270/3056/2830 2992/3057/2830 +f 2990/3054/2831 3745/3053/2831 2992/3057/2831 2288/3058/2831 +f 2271/3059/2832 2994/3060/2832 3746/3061/2832 2993/3062/2832 +f 2994/3060/2833 2269/2976/2833 2989/3052/2833 3746/3061/2833 +f 3746/3061/2834 2989/3052/2834 2251/3045/2834 2995/3063/2834 +f 2993/3062/2835 3746/3061/2835 2995/3063/2835 2289/3064/2835 +f 2248/3035/2836 2985/3044/2836 3747/3065/2836 2996/3066/2836 +f 2985/3044/2837 2250/3043/2837 2990/3054/2837 3747/3065/2837 +f 3747/3065/2838 2990/3054/2838 2288/3058/2838 2997/3067/2838 +f 2996/3066/2839 3747/3065/2839 2997/3067/2839 2290/3068/2839 +f 2289/3064/2840 2995/3063/2840 3748/3069/2840 2998/3070/2840 +f 2995/3063/2841 2251/3045/2841 2986/3048/2841 3748/3069/2841 +f 3748/3069/2842 2986/3048/2842 2249/3037/2842 2999/3071/2842 +f 2998/3070/2843 3748/3069/2843 2999/3071/2843 2291/3072/2843 +f 2252/3027/2844 2981/3036/2844 3749/3073/2844 3000/3074/2844 +f 2981/3036/2845 2248/3035/2845 2996/3066/2845 3749/3073/2845 +f 3749/3073/2846 2996/3066/2846 2290/3068/2846 3001/3075/2846 +f 3000/3074/2847 3749/3073/2847 3001/3075/2847 2286/3076/2847 +f 2291/3072/2848 2999/3071/2848 3750/3077/2848 3002/3078/2848 +f 2999/3071/2849 2249/3037/2849 2982/3040/2849 3750/3077/2849 +f 3750/3077/2850 2982/3040/2850 2253/3029/2850 3003/3079/2850 +f 3002/3078/2851 3750/3077/2851 3003/3079/2851 2287/3080/2851 +f 2254/3019/2852 2977/3028/2852 3751/3081/2852 3004/3082/2852 +f 2977/3028/2853 2252/3027/2853 3000/3074/2853 3751/3081/2853 +f 3751/3081/2854 3000/3074/2854 2286/3076/2854 3005/3083/2854 +f 3004/3082/2855 3751/3081/2855 3005/3083/2855 2284/3084/2855 +f 2287/3080/2856 3003/3079/2856 3752/3085/2856 3006/3086/2856 +f 3003/3079/2857 2253/3029/2857 2978/3032/2857 3752/3085/2857 +f 3752/3085/2858 2978/3032/2858 2255/3021/2858 3007/3087/2858 +f 3006/3086/2859 3752/3085/2859 3007/3087/2859 2285/3088/2859 +f 2256/3011/2860 2973/3020/2860 3753/3089/2860 3008/3090/2860 +f 2973/3020/2861 2254/3019/2861 3004/3082/2861 3753/3089/2861 +f 3753/3089/2862 3004/3082/2862 2284/3084/2862 3009/3091/2862 +f 3008/3090/2863 3753/3089/2863 3009/3091/2863 2282/3092/2863 +f 2285/3088/2864 3007/3087/2864 3754/3093/2864 3010/3094/2864 +f 3007/3087/2865 2255/3021/2865 2974/3024/2865 3754/3093/2865 +f 3754/3093/2866 2974/3024/2866 2257/3013/2866 3011/3095/2866 +f 3010/3094/2867 3754/3093/2867 3011/3095/2867 2283/3096/2867 +f 2258/3003/2868 2969/3012/2868 3755/3097/2868 3012/3098/2868 +f 2969/3012/2869 2256/3011/2869 3008/3090/2869 3755/3097/2869 +f 3755/3097/2870 3008/3090/2870 2282/3092/2870 3013/3099/2870 +f 3012/3098/2871 3755/3097/2871 3013/3099/2871 2280/3100/2871 +f 2283/3096/2872 3011/3095/2872 3756/3101/2872 3014/3102/2872 +f 3011/3095/2873 2257/3013/2873 2970/3016/2873 3756/3101/2873 +f 3756/3101/2874 2970/3016/2874 2259/3005/2874 3015/3103/2874 +f 3014/3102/2875 3756/3101/2875 3015/3103/2875 2281/3104/2875 +f 2260/2995/2876 2965/3004/2876 3757/3105/2876 3016/3106/2876 +f 2965/3004/2877 2258/3003/2877 3012/3098/2877 3757/3105/2877 +f 3757/3105/2878 3012/3098/2878 2280/3100/2878 3017/3107/2878 +f 3016/3106/2879 3757/3105/2879 3017/3107/2879 2278/3108/2879 +f 2281/3104/2880 3015/3103/2880 3758/3109/2880 3018/3110/2880 +f 3015/3103/2881 2259/3005/2881 2966/3008/2881 3758/3109/2881 +f 3758/3109/2882 2966/3008/2882 2261/2997/2882 3019/3111/2882 +f 3018/3110/2883 3758/3109/2883 3019/3111/2883 2279/3112/2883 +f 2262/2987/2884 2961/2996/2884 3759/3113/2884 3020/3114/2884 +f 2961/2996/2885 2260/2995/2885 3016/3106/2885 3759/3113/2885 +f 3759/3113/2886 3016/3106/2886 2278/3108/2886 3021/3115/2886 +f 3020/3114/2887 3759/3113/2887 3021/3115/2887 2276/3116/2887 +f 2279/3112/2888 3019/3111/2888 3760/3117/2888 3022/3118/2888 +f 3019/3111/2889 2261/2997/2889 2962/3000/2889 3760/3117/2889 +f 3760/3117/2890 2962/3000/2890 2263/2989/2890 3023/3119/2890 +f 3022/3118/2891 3760/3117/2891 3023/3119/2891 2277/3120/2891 +f 2264/2979/2892 2957/2988/2892 3761/3121/2892 3024/3122/2892 +f 2957/2988/2893 2262/2987/2893 3020/3114/2893 3761/3121/2893 +f 3761/3121/2894 3020/3114/2894 2276/3116/2894 3025/3123/2894 +f 3024/3122/2895 3761/3121/2895 3025/3123/2895 2274/3124/2895 +f 2277/3120/2896 3023/3119/2896 3762/3125/2896 3026/3126/2896 +f 3023/3119/2897 2263/2989/2897 2958/2992/2897 3762/3125/2897 +f 3762/3125/2898 2958/2992/2898 2265/2981/2898 3027/3127/2898 +f 3026/3126/2899 3762/3125/2899 3027/3127/2899 2275/3128/2899 +f 2246/2952/2900 2953/2980/2900 3763/3129/2900 3028/3130/2900 +f 2953/2980/2901 2264/2979/2901 3024/3122/2901 3763/3129/2901 +f 3763/3129/2902 3024/3122/2902 2274/3124/2902 3029/3131/2902 +f 3028/3130/2903 3763/3129/2903 3029/3131/2903 2292/3132/2903 +f 2275/3128/2904 3027/3127/2904 3764/3133/2904 3030/3134/2904 +f 3027/3127/2905 2265/2981/2905 2954/2984/2905 3764/3133/2905 +f 3764/3133/2906 2954/2984/2906 2247/2955/2906 3031/3135/2906 +f 3030/3134/2907 3764/3133/2907 3031/3135/2907 2293/3136/2907 +f 2268/2972/2908 2949/2971/2908 3765/3137/2908 2991/3055/2908 +f 2949/2971/2909 2266/2964/2909 3032/3138/2909 3765/3137/2909 +f 3765/3137/2910 3032/3138/2910 2272/3139/2910 3033/3140/2910 +f 2991/3055/2911 3765/3137/2911 3033/3140/2911 2270/3056/2911 +f 2273/3141/2912 3035/3142/2912 3766/3143/2912 3034/3144/2912 +f 3035/3142/2913 2267/2968/2913 2950/2974/2913 3766/3143/2913 +f 3766/3143/2914 2950/2974/2914 2269/2976/2914 2994/3060/2914 +f 3034/3144/2915 3766/3143/2915 2994/3060/2915 2271/3059/2915 +f 2266/2964/2916 2945/2963/2916 3767/3145/2916 3032/3138/2916 +f 2945/2963/2917 2244/2954/2917 3036/3146/2917 3767/3145/2917 +f 3767/3145/2918 3036/3146/2918 2294/3147/2918 3037/3148/2918 +f 3032/3138/2919 3767/3145/2919 3037/3148/2919 2272/3139/2919 +f 2295/3149/2920 3039/3150/2920 3768/3151/2920 3038/3152/2920 +f 3039/3150/2921 2245/2960/2921 2946/2966/2921 3768/3151/2921 +f 3768/3151/2922 2946/2966/2922 2267/2968/2922 3035/3142/2922 +f 3038/3152/2923 3768/3151/2923 3035/3142/2923 2273/3141/2923 +f 2244/2954/2924 2940/2953/2924 3769/3153/2924 3036/3146/2924 +f 2940/2953/2925 2246/2952/2925 3028/3130/2925 3769/3153/2925 +f 3769/3153/2926 3028/3130/2926 2292/3132/2926 3040/3154/2926 +f 3036/3146/2927 3769/3153/2927 3040/3154/2927 2294/3147/2927 +f 2293/3136/2928 3031/3135/2928 3770/3155/2928 3041/3156/2928 +f 3031/3135/2929 2247/2955/2929 2941/2958/2929 3770/3155/2929 +f 3770/3155/2930 2941/2958/2930 2245/2960/2930 3039/3150/2930 +f 3041/3156/2931 3770/3155/2931 3039/3150/2931 2295/3149/2931 +f 2079/2549/2932 2735/2547/2932 3771/3157/2932 3042/3158/2932 +f 2735/2547/2933 2120/2537/2933 3043/3159/2933 3771/3157/2933 +f 3771/3157/2934 3043/3159/2934 2296/3160/2934 3044/3161/2934 +f 3042/3158/2935 3771/3157/2935 3044/3161/2935 2085/3162/2935 +f 2297/3163/2936 3046/3164/2936 3772/3165/2936 3045/3166/2936 +f 3046/3164/2937 2121/2545/2937 2739/2555/2937 3772/3165/2937 +f 3772/3165/2938 2739/2555/2938 2079/2549/2938 3042/3158/2938 +f 3045/3166/2939 3772/3165/2939 3042/3158/2939 2085/3162/2939 +f 2120/2537/2940 2729/2535/2940 3773/3167/2940 3043/3159/2940 +f 2729/2535/2941 2118/2525/2941 3047/3168/2941 3773/3167/2941 +f 3773/3167/2942 3047/3168/2942 2298/3169/2942 3048/3170/2942 +f 3043/3159/2943 3773/3167/2943 3048/3170/2943 2296/3160/2943 +f 2299/3171/2944 3050/3172/2944 3774/3173/2944 3049/3174/2944 +f 3050/3172/2945 2119/2533/2945 2734/2546/2945 3774/3173/2945 +f 3774/3173/2946 2734/2546/2946 2121/2545/2946 3046/3164/2946 +f 3049/3174/2947 3774/3173/2947 3046/3164/2947 2297/3163/2947 +f 2118/2525/2948 2723/2523/2948 3775/3175/2948 3047/3168/2948 +f 2723/2523/2949 2116/2513/2949 3051/3176/2949 3775/3175/2949 +f 3775/3175/2950 3051/3176/2950 2300/3177/2950 3052/3178/2950 +f 3047/3168/2951 3775/3175/2951 3052/3178/2951 2298/3169/2951 +f 2301/3179/2952 3054/3180/2952 3776/3181/2952 3053/3182/2952 +f 3054/3180/2953 2117/2521/2953 2728/2534/2953 3776/3181/2953 +f 3776/3181/2954 2728/2534/2954 2119/2533/2954 3050/3172/2954 +f 3053/3182/2955 3776/3181/2955 3050/3172/2955 2299/3171/2955 +f 2116/2513/2956 2717/2511/2956 3777/3183/2956 3051/3176/2956 +f 2717/2511/2957 2114/2501/2957 3055/3184/2957 3777/3183/2957 +f 3777/3183/2958 3055/3184/2958 2302/3185/2958 3056/3186/2958 +f 3051/3176/2959 3777/3183/2959 3056/3186/2959 2300/3177/2959 +f 2303/3187/2960 3058/3188/2960 3778/3189/2960 3057/3190/2960 +f 3058/3188/2961 2115/2509/2961 2722/2522/2961 3778/3189/2961 +f 3778/3189/2962 2722/2522/2962 2117/2521/2962 3054/3180/2962 +f 3057/3190/2963 3778/3189/2963 3054/3180/2963 2301/3179/2963 +f 2114/2501/2964 2711/2499/2964 3779/3191/2964 3055/3184/2964 +f 2711/2499/2965 2112/2489/2965 3059/3192/2965 3779/3191/2965 +f 3779/3191/2966 3059/3192/2966 2304/3193/2966 3060/3194/2966 +f 3055/3184/2967 3779/3191/2967 3060/3194/2967 2302/3185/2967 +f 2305/3195/2968 3062/3196/2968 3780/3197/2968 3061/3198/2968 +f 3062/3196/2969 2113/2497/2969 2716/2510/2969 3780/3197/2969 +f 3780/3197/2970 2716/2510/2970 2115/2509/2970 3058/3188/2970 +f 3061/3198/2971 3780/3197/2971 3058/3188/2971 2303/3187/2971 +f 2112/2489/2972 2705/2487/2972 3781/3199/2972 3059/3192/2972 +f 2705/2487/2973 2110/2477/2973 3063/3200/2973 3781/3199/2973 +f 3781/3199/2974 3063/3200/2974 2306/3201/2974 3064/3202/2974 +f 3059/3192/2975 3781/3199/2975 3064/3202/2975 2304/3193/2975 +f 2307/3203/2976 3066/3204/2976 3782/3205/2976 3065/3206/2976 +f 3066/3204/2977 2111/2485/2977 2710/2498/2977 3782/3205/2977 +f 3782/3205/2978 2710/2498/2978 2113/2497/2978 3062/3196/2978 +f 3065/3206/2979 3782/3205/2979 3062/3196/2979 2305/3195/2979 +f 2110/2477/2980 2699/2475/2980 3783/3207/2980 3063/3200/2980 +f 2699/2475/2981 2108/2465/2981 3067/3208/2981 3783/3207/2981 +f 3783/3207/2982 3067/3208/2982 2308/3209/2982 3068/3210/2982 +f 3063/3200/2983 3783/3207/2983 3068/3210/2983 2306/3201/2983 +f 2309/3211/2984 3070/3212/2984 3784/3213/2984 3069/3214/2984 +f 3070/3212/2985 2109/2473/2985 2704/2486/2985 3784/3213/2985 +f 3784/3213/2986 2704/2486/2986 2111/2485/2986 3066/3204/2986 +f 3069/3214/2987 3784/3213/2987 3066/3204/2987 2307/3203/2987 +f 2108/2465/2988 2693/2463/2988 3785/3215/2988 3067/3208/2988 +f 2693/2463/2989 2106/2453/2989 3071/3216/2989 3785/3215/2989 +f 3785/3215/2990 3071/3216/2990 2310/3217/2990 3072/3218/2990 +f 3067/3208/2991 3785/3215/2991 3072/3218/2991 2308/3209/2991 +f 2311/3219/2992 3074/3220/2992 3786/3221/2992 3073/3222/2992 +f 3074/3220/2993 2107/2461/2993 2698/2474/2993 3786/3221/2993 +f 3786/3221/2994 2698/2474/2994 2109/2473/2994 3070/3212/2994 +f 3073/3222/2995 3786/3221/2995 3070/3212/2995 2309/3211/2995 +f 2106/2453/2996 2687/2451/2996 3787/3223/2996 3071/3216/2996 +f 2687/2451/2997 2104/2437/2997 3075/3224/2997 3787/3223/2997 +f 3787/3223/2998 3075/3224/2998 2312/3225/2998 3076/3226/2998 +f 3071/3216/2999 3787/3223/2999 3076/3226/2999 2310/3217/2999 +f 2313/3227/3000 3078/3228/3000 3788/3229/3000 3077/3230/3000 +f 3078/3228/3001 2105/2446/3001 2692/2462/3001 3788/3229/3001 +f 3788/3229/3002 2692/2462/3002 2107/2461/3002 3074/3220/3002 +f 3077/3230/3003 3788/3229/3003 3074/3220/3003 2311/3219/3003 +f 2320/3231/3004 3080/3232/3004 3789/3233/3004 3079/3234/3004 +f 3080/3232/3005 2321/3235/3005 3081/3236/3005 3789/3233/3005 +f 3789/3233/3006 3081/3236/3006 2340/3237/3006 3082/3238/3006 +f 3079/3234/3007 3789/3233/3007 3082/3238/3007 2350/3239/3007 +f 2341/3240/3008 3084/3241/3008 3790/3242/3008 3083/3243/3008 +f 3084/3241/3009 2321/3244/3009 3080/3245/3009 3790/3242/3009 +f 3790/3242/3010 3080/3245/3010 2320/3246/3010 3085/3247/3010 +f 3083/3243/3011 3790/3242/3011 3085/3247/3011 2351/3248/3011 +f 2319/3249/3012 3087/3250/3012 3791/3251/3012 3086/3252/3012 +f 3087/3250/3013 2320/3231/3013 3079/3234/3013 3791/3251/3013 +f 3791/3251/3014 3079/3234/3014 2350/3239/3014 3088/3253/3014 +f 3086/3252/3015 3791/3251/3015 3088/3253/3015 2348/3254/3015 +f 2351/3248/3016 3085/3247/3016 3792/3255/3016 3089/3256/3016 +f 3085/3247/3017 2320/3246/3017 3087/3257/3017 3792/3255/3017 +f 3792/3255/3018 3087/3257/3018 2319/3258/3018 3090/3259/3018 +f 3089/3256/3019 3792/3255/3019 3090/3259/3019 2349/3260/3019 +f 2318/3261/3020 3092/3262/3020 3793/3263/3020 3091/3264/3020 +f 3092/3262/3021 2319/3249/3021 3086/3252/3021 3793/3263/3021 +f 3793/3263/3022 3086/3252/3022 2348/3254/3022 3093/3265/3022 +f 3091/3264/3023 3793/3263/3023 3093/3265/3023 2352/3266/3023 +f 2349/3260/3024 3090/3259/3024 3794/3267/3024 3094/3268/3024 +f 3090/3259/3025 2319/3258/3025 3092/3269/3025 3794/3267/3025 +f 3794/3267/3026 3092/3269/3026 2318/3261/3026 3095/3270/3026 +f 3094/3268/3027 3794/3267/3027 3095/3270/3027 2353/3271/3027 +f 2101/2370/3028 2648/2373/3028 3795/3272/3028 3096/3273/3028 +f 2648/2373/3029 2103/2378/3029 3097/3274/3029 3795/3272/3029 +f 3795/3272/3030 3097/3274/3030 2318/3261/3030 3091/3264/3030 +f 3096/3273/3031 3795/3272/3031 3091/3264/3031 2352/3266/3031 +f 2318/3261/3032 3097/3274/3032 3796/3275/3032 3095/3270/3032 +f 3097/3274/3033 2103/2378/3033 2654/2384/3033 3796/3275/3033 +f 3796/3275/3034 2654/2384/3034 2102/2383/3034 3098/3276/3034 +f 3095/3270/3035 3796/3275/3035 3098/3276/3035 2353/3271/3035 +f 2099/2385/3036 2655/2388/3036 3797/3277/3036 3099/3278/3036 +f 2655/2388/3037 2101/2370/3037 3096/3273/3037 3797/3277/3037 +f 3797/3277/3038 3096/3273/3038 2352/3266/3038 3100/3279/3038 +f 3099/3278/3039 3797/3277/3039 3100/3279/3039 2346/3280/3039 +f 2353/3271/3040 3098/3276/3040 3798/3281/3040 3101/3282/3040 +f 3098/3276/3041 2102/2383/3041 2660/2396/3041 3798/3281/3041 +f 3798/3281/3042 2660/2396/3042 2100/2395/3042 3102/3283/3042 +f 3101/3282/3043 3798/3281/3043 3102/3283/3043 2347/3284/3043 +f 2097/2397/3044 2661/2400/3044 3799/3285/3044 3103/3286/3044 +f 2661/2400/3045 2099/2385/3045 3099/3278/3045 3799/3285/3045 +f 3799/3285/3046 3099/3278/3046 2346/3280/3046 3104/3287/3046 +f 3103/3286/3047 3799/3285/3047 3104/3287/3047 2342/3288/3047 +f 2347/3284/3048 3102/3283/3048 3800/3289/3048 3105/3290/3048 +f 3102/3283/3049 2100/2395/3049 2666/2408/3049 3800/3289/3049 +f 3800/3289/3050 2666/2408/3050 2098/2407/3050 3106/3291/3050 +f 3105/3290/3051 3800/3289/3051 3106/3291/3051 2343/3292/3051 +f 2095/2409/3052 2667/2412/3052 3801/3293/3052 3107/3294/3052 +f 2667/2412/3053 2097/2397/3053 3103/3286/3053 3801/3293/3053 +f 3801/3293/3054 3103/3286/3054 2342/3288/3054 3108/3295/3054 +f 3107/3294/3055 3801/3293/3055 3108/3295/3055 2344/3296/3055 +f 2343/3292/3056 3106/3291/3056 3802/3297/3056 3109/3298/3056 +f 3106/3291/3057 2098/2407/3057 2672/2420/3057 3802/3297/3057 +f 3802/3297/3058 2672/2420/3058 2096/2419/3058 3110/3299/3058 +f 3109/3298/3059 3802/3297/3059 3110/3299/3059 2345/3300/3059 +f 2342/3288/3060 3111/3301/3060 3803/3302/3060 3108/3295/3060 +f 3111/3301/3061 2348/3254/3061 3088/3253/3061 3803/3302/3061 +f 3803/3302/3062 3088/3253/3062 2350/3239/3062 3112/3303/3062 +f 3108/3295/3063 3803/3302/3063 3112/3303/3063 2344/3296/3063 +f 2351/3248/3064 3089/3256/3064 3804/3304/3064 3113/3305/3064 +f 3089/3256/3065 2349/3260/3065 3114/3306/3065 3804/3304/3065 +f 3804/3304/3066 3114/3306/3066 2343/3292/3066 3109/3298/3066 +f 3113/3305/3067 3804/3304/3067 3109/3298/3067 2345/3300/3067 +f 2342/3288/3068 3104/3287/3068 3805/3307/3068 3111/3301/3068 +f 3104/3287/3069 2346/3280/3069 3100/3279/3069 3805/3307/3069 +f 3805/3307/3070 3100/3279/3070 2352/3266/3070 3093/3265/3070 +f 3111/3301/3071 3805/3307/3071 3093/3265/3071 2348/3254/3071 +f 2353/3271/3072 3101/3282/3072 3806/3308/3072 3094/3268/3072 +f 3101/3282/3073 2347/3284/3073 3105/3290/3073 3806/3308/3073 +f 3806/3308/3074 3105/3290/3074 2343/3292/3074 3114/3306/3074 +f 3094/3268/3075 3806/3308/3075 3114/3306/3075 2349/3260/3075 +f 2338/3309/3076 3116/3310/3076 3807/3311/3076 3115/3312/3076 +f 3116/3310/3077 2344/3296/3077 3112/3303/3077 3807/3311/3077 +f 3807/3311/3078 3112/3303/3078 2350/3239/3078 3082/3238/3078 +f 3115/3312/3079 3807/3311/3079 3082/3238/3079 2340/3237/3079 +f 2351/3248/3080 3113/3305/3080 3808/3313/3080 3083/3243/3080 +f 3113/3305/3081 2345/3300/3081 3117/3314/3081 3808/3313/3081 +f 3808/3313/3082 3117/3314/3082 2339/3315/3082 3118/3316/3082 +f 3083/3243/3083 3808/3313/3083 3118/3316/3083 2341/3240/3083 +f 2093/2421/3084 2673/2424/3084 3809/3317/3084 3119/3318/3084 +f 2673/2424/3085 2095/2409/3085 3107/3294/3085 3809/3317/3085 +f 3809/3317/3086 3107/3294/3086 2344/3296/3086 3116/3310/3086 +f 3119/3318/3087 3809/3317/3087 3116/3310/3087 2338/3309/3087 +f 2345/3300/3088 3110/3299/3088 3810/3319/3088 3117/3314/3088 +f 3110/3299/3089 2096/2419/3089 2678/2432/3089 3810/3319/3089 +f 3810/3319/3090 2678/2432/3090 2094/2431/3090 3120/3320/3090 +f 3117/3314/3091 3810/3319/3091 3120/3320/3091 2339/3315/3091 +f 2221/2860/3092 3121/3321/3092 3811/3322/3092 2897/2866/3092 +f 3121/3321/3093 2354/3323/3093 3122/3324/3093 3811/3322/3093 +f 3811/3322/3094 3122/3324/3094 2356/3325/3094 3123/3326/3094 +f 2897/2866/3095 3811/3322/3095 3123/3326/3095 2227/2868/3095 +f 2357/3327/3096 3125/3328/3096 3812/3329/3096 3124/3330/3096 +f 3125/3328/3097 2355/3331/3097 3126/3332/3097 3812/3329/3097 +f 3812/3329/3098 3126/3332/3098 2222/2864/3098 2900/2873/3098 +f 3124/3330/3099 3812/3329/3099 2900/2873/3099 2228/2872/3099 +f 2093/2421/3100 3119/3318/3100 3813/3333/3100 2893/2858/3100 +f 3119/3318/3101 2338/3309/3101 3127/3334/3101 3813/3333/3101 +f 3813/3333/3102 3127/3334/3102 2354/3323/3102 3121/3321/3102 +f 2893/2858/3103 3813/3333/3103 3121/3321/3103 2221/2860/3103 +f 2355/3331/3104 3128/3335/3104 3814/3336/3104 3126/3332/3104 +f 3128/3335/3105 2339/3315/3105 3120/3320/3105 3814/3336/3105 +f 3814/3336/3106 3120/3320/3106 2094/2431/3106 2896/2865/3106 +f 3126/3332/3107 3814/3336/3107 2896/2865/3107 2222/2864/3107 +f 2091/2433/3108 2901/2875/3108 3815/3337/3108 3129/3338/3108 +f 2901/2875/3109 2227/2868/3109 3123/3326/3109 3815/3337/3109 +f 3815/3337/3110 3123/3326/3110 2356/3325/3110 3130/3339/3110 +f 3129/3338/3111 3815/3337/3111 3130/3339/3111 2358/3340/3111 +f 2357/3327/3112 3124/3330/3112 3816/3341/3112 3131/3342/3112 +f 3124/3330/3113 2228/2872/3113 2902/2877/3113 3816/3341/3113 +f 3816/3341/3114 2902/2877/3114 2092/2448/3114 3132/3343/3114 +f 3131/3342/3115 3816/3341/3115 3132/3343/3115 2359/3344/3115 +f 2091/2433/3116 3129/3338/3116 3817/3345/3116 2680/2434/3116 +f 3129/3338/3117 2358/3340/3117 3133/3346/3117 3817/3345/3117 +f 3817/3345/3118 3133/3346/3118 2312/3225/3118 3075/3224/3118 +f 2680/2434/3119 3817/3345/3119 3075/3224/3119 2104/2437/3119 +f 2313/3227/3120 3134/3347/3120 3818/3348/3120 3078/3228/3120 +f 3134/3347/3121 2359/3344/3121 3132/3343/3121 3818/3348/3121 +f 3818/3348/3122 3132/3343/3122 2092/2448/3122 2685/2447/3122 +f 3078/3228/3123 3818/3348/3123 2685/2447/3123 2105/2446/3123 +f 2089/3349/3124 3136/3350/3124 3819/3351/3124 3135/3352/3124 +f 3136/3350/3125 2336/3353/3125 3137/3354/3125 3819/3351/3125 +f 3819/3351/3126 3137/3354/3126 2364/3355/3126 3138/3356/3126 +f 3135/3352/3127 3819/3351/3127 3138/3356/3127 2316/3357/3127 +f 2365/3358/3128 3140/3359/3128 3820/3360/3128 3139/3361/3128 +f 3140/3359/3129 2337/3362/3129 3141/3363/3129 3820/3360/3129 +f 3820/3360/3130 3141/3363/3130 2089/3364/3130 3135/3365/3130 +f 3139/3361/3131 3820/3360/3131 3135/3365/3131 2316/3366/3131 +f 2316/3357/3132 3138/3356/3132 3821/3367/3132 3142/3368/3132 +f 3138/3356/3133 2364/3355/3133 3143/3369/3133 3821/3367/3133 +f 3821/3367/3134 3143/3369/3134 2362/3370/3134 3144/3371/3134 +f 3142/3368/3135 3821/3367/3135 3144/3371/3135 2090/3372/3135 +f 2363/3373/3136 3146/3374/3136 3822/3375/3136 3145/3376/3136 +f 3146/3374/3137 2365/3358/3137 3139/3361/3137 3822/3375/3137 +f 3822/3375/3138 3139/3361/3138 2316/3366/3138 3142/3377/3138 +f 3145/3376/3139 3822/3375/3139 3142/3377/3139 2090/3378/3139 +f 2090/3372/3140 3144/3371/3140 3823/3379/3140 3147/3380/3140 +f 3144/3371/3141 2362/3370/3141 3148/3381/3141 3823/3379/3141 +f 3823/3379/3142 3148/3381/3142 2360/3382/3142 3149/3383/3142 +f 3147/3380/3143 3823/3379/3143 3149/3383/3143 2317/3384/3143 +f 2361/3385/3144 3151/3386/3144 3824/3387/3144 3150/3388/3144 +f 3151/3386/3145 2363/3373/3145 3145/3376/3145 3824/3387/3145 +f 3824/3387/3146 3145/3376/3146 2090/3378/3146 3147/3389/3146 +f 3150/3388/3147 3824/3387/3147 3147/3389/3147 2317/3390/3147 +f 2317/3384/3148 3149/3383/3148 3825/3391/3148 3152/3392/3148 +f 3149/3383/3149 2360/3382/3149 3153/3393/3149 3825/3391/3149 +f 3825/3391/3150 3153/3393/3150 2340/3237/3150 3081/3236/3150 +f 3152/3392/3151 3825/3391/3151 3081/3236/3151 2321/3235/3151 +f 2341/3240/3152 3154/3394/3152 3826/3395/3152 3084/3241/3152 +f 3154/3394/3153 2361/3385/3153 3150/3388/3153 3826/3395/3153 +f 3826/3395/3154 3150/3388/3154 2317/3390/3154 3152/3396/3154 +f 3084/3241/3155 3826/3395/3155 3152/3396/3155 2321/3244/3155 +f 2338/3309/3156 3115/3312/3156 3827/3397/3156 3127/3334/3156 +f 3115/3312/3157 2340/3237/3157 3153/3393/3157 3827/3397/3157 +f 3827/3397/3158 3153/3393/3158 2360/3382/3158 3155/3398/3158 +f 3127/3334/3159 3827/3397/3159 3155/3398/3159 2354/3323/3159 +f 2361/3385/3160 3154/3394/3160 3828/3399/3160 3156/3400/3160 +f 3154/3394/3161 2341/3240/3161 3118/3316/3161 3828/3399/3161 +f 3828/3399/3162 3118/3316/3162 2339/3315/3162 3128/3335/3162 +f 3156/3400/3163 3828/3399/3163 3128/3335/3163 2355/3331/3163 +f 2308/3209/3164 3072/3218/3164 3829/3401/3164 3157/3402/3164 +f 3072/3218/3165 2310/3217/3165 3158/3403/3165 3829/3401/3165 +f 3829/3401/3166 3158/3403/3166 2330/3404/3166 3159/3405/3166 +f 3157/3402/3167 3829/3401/3167 3159/3405/3167 2322/3406/3167 +f 2331/3407/3168 3161/3408/3168 3830/3409/3168 3160/3410/3168 +f 3161/3408/3169 2311/3219/3169 3073/3222/3169 3830/3409/3169 +f 3830/3409/3170 3073/3222/3170 2309/3211/3170 3162/3411/3170 +f 3160/3410/3171 3830/3409/3171 3162/3411/3171 2323/3412/3171 +f 2088/3413/3172 3164/3414/3172 3831/3415/3172 3163/3416/3172 +f 3164/3414/3173 2328/3417/3173 3165/3418/3173 3831/3415/3173 +f 3831/3415/3174 3165/3418/3174 2336/3353/3174 3136/3350/3174 +f 3163/3416/3175 3831/3415/3175 3136/3350/3175 2089/3349/3175 +f 2337/3362/3176 3166/3419/3176 3832/3420/3176 3141/3363/3176 +f 3166/3419/3177 2329/3421/3177 3167/3422/3177 3832/3420/3177 +f 3832/3420/3178 3167/3422/3178 2088/3423/3178 3163/3424/3178 +f 3141/3363/3179 3832/3420/3179 3163/3424/3179 2089/3364/3179 +f 2314/3425/3180 3169/3426/3180 3833/3427/3180 3168/3428/3180 +f 3169/3426/3181 2370/3429/3181 3170/3430/3181 3833/3427/3181 +f 3833/3427/3182 3170/3430/3182 2368/3431/3182 3171/3432/3182 +f 3168/3428/3183 3833/3427/3183 3171/3432/3183 2315/3433/3183 +f 2369/3434/3184 3173/3435/3184 3834/3436/3184 3172/3437/3184 +f 3173/3435/3185 2371/3438/3185 3174/3439/3185 3834/3436/3185 +f 3834/3436/3186 3174/3439/3186 2314/3440/3186 3168/3441/3186 +f 3172/3437/3187 3834/3436/3187 3168/3441/3187 2315/3442/3187 +f 2315/3433/3188 3171/3432/3188 3835/3443/3188 3175/3444/3188 +f 3171/3432/3189 2368/3431/3189 3176/3445/3189 3835/3443/3189 +f 3835/3443/3190 3176/3445/3190 2366/3446/3190 3177/3447/3190 +f 3175/3444/3191 3835/3443/3191 3177/3447/3191 2087/3448/3191 +f 2367/3449/3192 3179/3450/3192 3836/3451/3192 3178/3452/3192 +f 3179/3450/3193 2369/3434/3193 3172/3437/3193 3836/3451/3193 +f 3836/3451/3194 3172/3437/3194 2315/3442/3194 3175/3453/3194 +f 3178/3452/3195 3836/3451/3195 3175/3453/3195 2087/3454/3195 +f 2087/3448/3196 3177/3447/3196 3837/3455/3196 3180/3456/3196 +f 3177/3447/3197 2366/3446/3197 3181/3457/3197 3837/3455/3197 +f 3837/3455/3198 3181/3457/3198 2328/3417/3198 3164/3414/3198 +f 3180/3456/3199 3837/3455/3199 3164/3414/3199 2088/3413/3199 +f 2329/3421/3200 3182/3458/3200 3838/3459/3200 3167/3422/3200 +f 3182/3458/3201 2367/3449/3201 3178/3452/3201 3838/3459/3201 +f 3838/3459/3202 3178/3452/3202 2087/3454/3202 3180/3460/3202 +f 3167/3422/3203 3838/3459/3203 3180/3460/3203 2088/3423/3203 +f 2304/3461/3204 3064/3462/3204 3839/3463/3204 3183/3464/3204 +f 3064/3462/3205 2306/3201/3205 3184/3465/3205 3839/3463/3205 +f 3839/3463/3206 3184/3465/3206 2374/3466/3206 3185/3467/3206 +f 3183/3464/3207 3839/3463/3207 3185/3467/3207 2376/3468/3207 +f 2375/3469/3208 3187/3470/3208 3840/3471/3208 3186/3472/3208 +f 3187/3470/3209 2307/3203/3209 3065/3473/3209 3840/3471/3209 +f 3840/3471/3210 3065/3473/3210 2305/3474/3210 3188/3475/3210 +f 3186/3472/3211 3840/3471/3211 3188/3475/3211 2377/3476/3211 +f 2376/3468/3212 3185/3467/3212 3841/3477/3212 3189/3478/3212 +f 3185/3467/3213 2374/3466/3213 3190/3479/3213 3841/3477/3213 +f 3841/3477/3214 3190/3479/3214 2380/3480/3214 3191/3481/3214 +f 3189/3478/3215 3841/3477/3215 3191/3481/3215 2378/3482/3215 +f 2381/3483/3216 3193/3484/3216 3842/3485/3216 3192/3486/3216 +f 3193/3484/3217 2375/3469/3217 3186/3472/3217 3842/3485/3217 +f 3842/3485/3218 3186/3472/3218 2377/3476/3218 3194/3487/3218 +f 3192/3486/3219 3842/3485/3219 3194/3487/3219 2379/3488/3219 +f 2378/3482/3220 3191/3481/3220 3843/3489/3220 3195/3490/3220 +f 3191/3481/3221 2380/3480/3221 3196/3491/3221 3843/3489/3221 +f 3843/3489/3222 3196/3491/3222 2382/3492/3222 3197/3493/3222 +f 3195/3490/3223 3843/3489/3223 3197/3493/3223 2384/3494/3223 +f 2383/3495/3224 3199/3496/3224 3844/3497/3224 3198/3498/3224 +f 3199/3496/3225 2381/3483/3225 3192/3486/3225 3844/3497/3225 +f 3844/3497/3226 3192/3486/3226 2379/3488/3226 3200/3499/3226 +f 3198/3498/3227 3844/3497/3227 3200/3499/3227 2385/3500/3227 +f 2384/3494/3228 3197/3493/3228 3845/3501/3228 3201/3502/3228 +f 3197/3493/3229 2382/3492/3229 3202/3503/3229 3845/3501/3229 +f 3845/3501/3230 3202/3503/3230 2388/3504/3230 3203/3505/3230 +f 3201/3502/3231 3845/3501/3231 3203/3505/3231 2386/3506/3231 +f 2389/3507/3232 3205/3508/3232 3846/3509/3232 3204/3510/3232 +f 3205/3508/3233 2383/3495/3233 3198/3498/3233 3846/3509/3233 +f 3846/3509/3234 3198/3498/3234 2385/3500/3234 3206/3511/3234 +f 3204/3510/3235 3846/3509/3235 3206/3511/3235 2387/3512/3235 +f 2326/3513/3236 3208/3514/3236 3847/3515/3236 3207/3516/3236 +f 3208/3514/3237 2390/3517/3237 3209/3518/3237 3847/3515/3237 +f 3847/3515/3238 3209/3518/3238 2386/3506/3238 3203/3505/3238 +f 3207/3516/3239 3847/3515/3239 3203/3505/3239 2388/3504/3239 +f 2387/3512/3240 3210/3519/3240 3848/3520/3240 3204/3510/3240 +f 3210/3519/3241 2391/3521/3241 3211/3522/3241 3848/3520/3241 +f 3848/3520/3242 3211/3522/3242 2327/3523/3242 3212/3524/3242 +f 3204/3510/3243 3848/3520/3243 3212/3524/3243 2389/3507/3243 +f 2328/3417/3244 3181/3457/3244 3849/3525/3244 3213/3526/3244 +f 3181/3457/3245 2366/3446/3245 3214/3527/3245 3849/3525/3245 +f 3849/3525/3246 3214/3527/3246 2386/3506/3246 3209/3518/3246 +f 3213/3526/3247 3849/3525/3247 3209/3518/3247 2390/3517/3247 +f 2387/3512/3248 3215/3528/3248 3850/3529/3248 3210/3519/3248 +f 3215/3528/3249 2367/3449/3249 3182/3458/3249 3850/3529/3249 +f 3850/3529/3250 3182/3458/3250 2329/3421/3250 3216/3530/3250 +f 3210/3519/3251 3850/3529/3251 3216/3530/3251 2391/3521/3251 +f 2366/3446/3252 3176/3445/3252 3851/3531/3252 3214/3527/3252 +f 3176/3445/3253 2368/3431/3253 3217/3532/3253 3851/3531/3253 +f 3851/3531/3254 3217/3532/3254 2384/3494/3254 3201/3502/3254 +f 3214/3527/3255 3851/3531/3255 3201/3502/3255 2386/3506/3255 +f 2385/3500/3256 3218/3533/3256 3852/3534/3256 3206/3511/3256 +f 3218/3533/3257 2369/3434/3257 3179/3450/3257 3852/3534/3257 +f 3852/3534/3258 3179/3450/3258 2367/3449/3258 3215/3528/3258 +f 3206/3511/3259 3852/3534/3259 3215/3528/3259 2387/3512/3259 +f 2368/3431/3260 3170/3430/3260 3853/3535/3260 3217/3532/3260 +f 3170/3430/3261 2370/3429/3261 3219/3536/3261 3853/3535/3261 +f 3853/3535/3262 3219/3536/3262 2378/3482/3262 3195/3490/3262 +f 3217/3532/3263 3853/3535/3263 3195/3490/3263 2384/3494/3263 +f 2379/3488/3264 3220/3537/3264 3854/3538/3264 3200/3499/3264 +f 3220/3537/3265 2371/3438/3265 3173/3435/3265 3854/3538/3265 +f 3854/3538/3266 3173/3435/3266 2369/3434/3266 3218/3533/3266 +f 3200/3499/3267 3854/3538/3267 3218/3533/3267 2385/3500/3267 +f 2370/3429/3268 3221/3539/3268 3855/3540/3268 3219/3536/3268 +f 3221/3539/3269 2372/3541/3269 3222/3542/3269 3855/3540/3269 +f 3855/3540/3270 3222/3542/3270 2376/3468/3270 3189/3478/3270 +f 3219/3536/3271 3855/3540/3271 3189/3478/3271 2378/3482/3271 +f 2377/3476/3272 3223/3543/3272 3856/3544/3272 3194/3487/3272 +f 3223/3543/3273 2373/3545/3273 3224/3546/3273 3856/3544/3273 +f 3856/3544/3274 3224/3546/3274 2371/3438/3274 3220/3537/3274 +f 3194/3487/3275 3856/3544/3275 3220/3537/3275 2379/3488/3275 +f 2302/3547/3276 3060/3548/3276 3857/3549/3276 3225/3550/3276 +f 3060/3548/3277 2304/3461/3277 3183/3464/3277 3857/3549/3277 +f 3857/3549/3278 3183/3464/3278 2376/3468/3278 3222/3542/3278 +f 3225/3550/3279 3857/3549/3279 3222/3542/3279 2372/3541/3279 +f 2377/3476/3280 3188/3475/3280 3858/3551/3280 3223/3543/3280 +f 3188/3475/3281 2305/3474/3281 3061/3552/3281 3858/3551/3281 +f 3858/3551/3282 3061/3552/3282 2303/3553/3282 3226/3554/3282 +f 3223/3543/3283 3858/3551/3283 3226/3554/3283 2373/3545/3283 +f 2086/3555/3284 3228/3556/3284 3859/3557/3284 3227/3558/3284 +f 3228/3556/3285 2372/3541/3285 3221/3539/3285 3859/3557/3285 +f 3859/3557/3286 3221/3539/3286 2370/3429/3286 3169/3426/3286 +f 3227/3558/3287 3859/3557/3287 3169/3426/3287 2314/3425/3287 +f 2371/3438/3288 3224/3546/3288 3860/3559/3288 3174/3439/3288 +f 3224/3546/3289 2373/3545/3289 3229/3560/3289 3860/3559/3289 +f 3860/3559/3290 3229/3560/3290 2086/3561/3290 3227/3562/3290 +f 3174/3439/3291 3860/3559/3291 3227/3562/3291 2314/3440/3291 +f 2296/3563/3292 3048/3564/3292 3861/3565/3292 3230/3566/3292 +f 3048/3564/3293 2298/3567/3293 3052/3568/3293 3861/3565/3293 +f 3861/3565/3294 3052/3568/3294 2300/3569/3294 3056/3570/3294 +f 3230/3566/3295 3861/3565/3295 3056/3570/3295 2302/3547/3295 +f 2301/3571/3296 3053/3572/3296 3862/3573/3296 3057/3574/3296 +f 3053/3572/3297 2299/3575/3297 3049/3576/3297 3862/3573/3297 +f 3862/3573/3298 3049/3576/3298 2297/3577/3298 3231/3578/3298 +f 3057/3574/3299 3862/3573/3299 3231/3578/3299 2303/3553/3299 +f 2296/3563/3300 3230/3566/3300 3863/3579/3300 3232/3580/3300 +f 3230/3566/3301 2302/3547/3301 3225/3550/3301 3863/3579/3301 +f 3863/3579/3302 3225/3550/3302 2372/3541/3302 3228/3556/3302 +f 3232/3580/3303 3863/3579/3303 3228/3556/3303 2086/3555/3303 +f 2373/3545/3304 3226/3554/3304 3864/3581/3304 3229/3560/3304 +f 3226/3554/3305 2303/3553/3305 3231/3578/3305 3864/3581/3305 +f 3864/3581/3306 3231/3578/3306 2297/3577/3306 3233/3582/3306 +f 3229/3560/3307 3864/3581/3307 3233/3582/3307 2086/3561/3307 +f 2085/3583/3308 3044/3584/3308 3865/3585/3308 3234/3586/3308 +f 2296/3563/3309 3232/3580/3309 3865/3585/3309 3044/3584/3309 +f 2086/3555/3310 3234/3586/3310 3865/3585/3310 3232/3580/3310 +f 2086/3561/3311 3233/3582/3311 3866/3587/3311 3234/3588/3311 +f 2297/3577/3312 3045/3589/3312 3866/3587/3312 3233/3582/3312 +f 2085/3590/3313 3234/3588/3313 3866/3587/3313 3045/3589/3313 +f 2306/3201/3314 3068/3210/3314 3867/3591/3314 3184/3465/3314 +f 3068/3210/3315 2308/3209/3315 3157/3402/3315 3867/3591/3315 +f 3867/3591/3316 3157/3402/3316 2322/3406/3316 3235/3592/3316 +f 3184/3465/3317 3867/3591/3317 3235/3592/3317 2374/3466/3317 +f 2323/3412/3318 3162/3411/3318 3868/3593/3318 3236/3594/3318 +f 3162/3411/3319 2309/3211/3319 3069/3214/3319 3868/3593/3319 +f 3868/3593/3320 3069/3214/3320 2307/3203/3320 3187/3470/3320 +f 3236/3594/3321 3868/3593/3321 3187/3470/3321 2375/3469/3321 +f 2322/3406/3322 3237/3595/3322 3869/3596/3322 3235/3592/3322 +f 3237/3595/3323 2324/3597/3323 3238/3598/3323 3869/3596/3323 +f 3869/3596/3324 3238/3598/3324 2380/3480/3324 3190/3479/3324 +f 3235/3592/3325 3869/3596/3325 3190/3479/3325 2374/3466/3325 +f 2381/3483/3326 3239/3599/3326 3870/3600/3326 3193/3484/3326 +f 3239/3599/3327 2325/3601/3327 3240/3602/3327 3870/3600/3327 +f 3870/3600/3328 3240/3602/3328 2323/3412/3328 3236/3594/3328 +f 3193/3484/3329 3870/3600/3329 3236/3594/3329 2375/3469/3329 +f 2324/3597/3330 3241/3603/3330 3871/3604/3330 3238/3598/3330 +f 3241/3603/3331 2394/3605/3331 3242/3606/3331 3871/3604/3331 +f 3871/3604/3332 3242/3606/3332 2382/3492/3332 3196/3491/3332 +f 3238/3598/3333 3871/3604/3333 3196/3491/3333 2380/3480/3333 +f 2383/3495/3334 3243/3607/3334 3872/3608/3334 3199/3496/3334 +f 3243/3607/3335 2395/3609/3335 3244/3610/3335 3872/3608/3335 +f 3872/3608/3336 3244/3610/3336 2325/3601/3336 3239/3599/3336 +f 3199/3496/3337 3872/3608/3337 3239/3599/3337 2381/3483/3337 +f 2326/3513/3338 3207/3516/3338 3873/3611/3338 3245/3612/3338 +f 3207/3516/3339 2388/3504/3339 3202/3503/3339 3873/3611/3339 +f 3873/3611/3340 3202/3503/3340 2382/3492/3340 3242/3606/3340 +f 3245/3612/3341 3873/3611/3341 3242/3606/3341 2394/3605/3341 +f 2383/3495/3342 3205/3508/3342 3874/3613/3342 3243/3607/3342 +f 3205/3508/3343 2389/3507/3343 3212/3524/3343 3874/3613/3343 +f 3874/3613/3344 3212/3524/3344 2327/3523/3344 3246/3614/3344 +f 3243/3607/3345 3874/3613/3345 3246/3614/3345 2395/3609/3345 +f 2360/3382/3346 3148/3381/3346 3875/3615/3346 3247/3616/3346 +f 3148/3381/3347 2362/3370/3347 3248/3617/3347 3875/3615/3347 +f 3875/3615/3348 3248/3617/3348 2398/3618/3348 3249/3619/3348 +f 3247/3616/3349 3875/3615/3349 3249/3619/3349 2396/3620/3349 +f 2399/3621/3350 3251/3622/3350 3876/3623/3350 3250/3624/3350 +f 3251/3622/3351 2363/3373/3351 3151/3386/3351 3876/3623/3351 +f 3876/3623/3352 3151/3386/3352 2361/3385/3352 3252/3625/3352 +f 3250/3624/3353 3876/3623/3353 3252/3625/3353 2397/3626/3353 +f 2330/3404/3354 3254/3627/3354 3877/3628/3354 3253/3629/3354 +f 3254/3627/3355 2396/3620/3355 3249/3619/3355 3877/3628/3355 +f 3877/3628/3356 3249/3619/3356 2398/3618/3356 3255/3630/3356 +f 3253/3629/3357 3877/3628/3357 3255/3630/3357 2332/3631/3357 +f 2399/3621/3358 3250/3624/3358 3878/3632/3358 3256/3633/3358 +f 3250/3624/3359 2397/3626/3359 3257/3634/3359 3878/3632/3359 +f 3878/3632/3360 3257/3634/3360 2331/3407/3360 3258/3635/3360 +f 3256/3633/3361 3878/3632/3361 3258/3635/3361 2333/3636/3361 +f 2310/3217/3362 3076/3226/3362 3879/3637/3362 3158/3403/3362 +f 3076/3226/3363 2312/3225/3363 3259/3638/3363 3879/3637/3363 +f 3879/3637/3364 3259/3638/3364 2396/3620/3364 3254/3627/3364 +f 3158/3403/3365 3879/3637/3365 3254/3627/3365 2330/3404/3365 +f 2397/3626/3366 3260/3639/3366 3880/3640/3366 3257/3634/3366 +f 3260/3639/3367 2313/3227/3367 3077/3230/3367 3880/3640/3367 +f 3880/3640/3368 3077/3230/3368 2311/3219/3368 3161/3408/3368 +f 3257/3634/3369 3880/3640/3369 3161/3408/3369 2331/3407/3369 +f 2312/3225/3370 3261/3641/3370 3881/3642/3370 3259/3638/3370 +f 3261/3641/3371 2356/3325/3371 3122/3324/3371 3881/3642/3371 +f 3881/3642/3372 3122/3324/3372 2354/3323/3372 3262/3643/3372 +f 3259/3638/3373 3881/3642/3373 3262/3643/3373 2396/3620/3373 +f 2355/3331/3374 3125/3328/3374 3882/3644/3374 3263/3645/3374 +f 3125/3328/3375 2357/3327/3375 3264/3646/3375 3882/3644/3375 +f 3882/3644/3376 3264/3646/3376 2313/3227/3376 3260/3639/3376 +f 3263/3645/3377 3882/3644/3377 3260/3639/3377 2397/3626/3377 +f 2354/3323/3378 3155/3398/3378 3883/3647/3378 3262/3643/3378 +f 2360/3382/3379 3247/3616/3379 3883/3647/3379 3155/3398/3379 +f 2396/3620/3380 3262/3643/3380 3883/3647/3380 3247/3616/3380 +f 2397/3626/3381 3252/3625/3381 3884/3648/3381 3263/3645/3381 +f 2361/3385/3382 3156/3400/3382 3884/3648/3382 3252/3625/3382 +f 2355/3331/3383 3263/3645/3383 3884/3648/3383 3156/3400/3383 +f 2312/3225/3384 3133/3346/3384 3885/3649/3384 3261/3641/3384 +f 2358/3340/3385 3130/3339/3385 3885/3649/3385 3133/3346/3385 +f 2356/3325/3386 3261/3641/3386 3885/3649/3386 3130/3339/3386 +f 2357/3327/3387 3131/3342/3387 3886/3650/3387 3264/3646/3387 +f 2359/3344/3388 3134/3347/3388 3886/3650/3388 3131/3342/3388 +f 2313/3227/3389 3264/3646/3389 3886/3650/3389 3134/3347/3389 +f 2326/3513/3390 3265/3651/3390 3887/3652/3390 3208/3514/3390 +f 3265/3651/3391 2334/3653/3391 3266/3654/3391 3887/3652/3391 +f 3887/3652/3392 3266/3654/3392 2392/3655/3392 3267/3656/3392 +f 3208/3514/3393 3887/3652/3393 3267/3656/3393 2390/3517/3393 +f 2393/3657/3394 3269/3658/3394 3888/3659/3394 3268/3660/3394 +f 3269/3658/3395 2335/3661/3395 3270/3662/3395 3888/3659/3395 +f 3888/3659/3396 3270/3662/3396 2327/3523/3396 3211/3522/3396 +f 3268/3660/3397 3888/3659/3397 3211/3522/3397 2391/3521/3397 +f 2328/3417/3398 3213/3526/3398 3889/3663/3398 3165/3418/3398 +f 3213/3526/3399 2390/3517/3399 3267/3656/3399 3889/3663/3399 +f 3889/3663/3400 3267/3656/3400 2392/3655/3400 3271/3664/3400 +f 3165/3418/3401 3889/3663/3401 3271/3664/3401 2336/3353/3401 +f 2393/3657/3402 3268/3660/3402 3890/3665/3402 3272/3666/3402 +f 3268/3660/3403 2391/3521/3403 3216/3530/3403 3890/3665/3403 +f 3890/3665/3404 3216/3530/3404 2329/3421/3404 3166/3419/3404 +f 3272/3666/3405 3890/3665/3405 3166/3419/3405 2337/3362/3405 +f 2332/3631/3406 3255/3630/3406 3891/3667/3406 3273/3668/3406 +f 3255/3630/3407 2398/3618/3407 3274/3669/3407 3891/3667/3407 +f 3891/3667/3408 3274/3669/3408 2392/3655/3408 3266/3654/3408 +f 3273/3668/3409 3891/3667/3409 3266/3654/3409 2334/3653/3409 +f 2393/3657/3410 3275/3670/3410 3892/3671/3410 3269/3658/3410 +f 3275/3670/3411 2399/3621/3411 3256/3633/3411 3892/3671/3411 +f 3892/3671/3412 3256/3633/3412 2333/3636/3412 3276/3672/3412 +f 3269/3658/3413 3892/3671/3413 3276/3672/3413 2335/3661/3413 +f 2362/3370/3414 3143/3369/3414 3893/3673/3414 3248/3617/3414 +f 3143/3369/3415 2364/3355/3415 3277/3674/3415 3893/3673/3415 +f 3893/3673/3416 3277/3674/3416 2392/3655/3416 3274/3669/3416 +f 3248/3617/3417 3893/3673/3417 3274/3669/3417 2398/3618/3417 +f 2393/3657/3418 3278/3675/3418 3894/3676/3418 3275/3670/3418 +f 3278/3675/3419 2365/3358/3419 3146/3374/3419 3894/3676/3419 +f 3894/3676/3420 3146/3374/3420 2363/3373/3420 3251/3622/3420 +f 3275/3670/3421 3894/3676/3421 3251/3622/3421 2399/3621/3421 +f 2336/3353/3422 3271/3664/3422 3895/3677/3422 3137/3354/3422 +f 2392/3655/3423 3277/3674/3423 3895/3677/3423 3271/3664/3423 +f 2364/3355/3424 3137/3354/3424 3895/3677/3424 3277/3674/3424 +f 2365/3358/3425 3278/3675/3425 3896/3678/3425 3140/3359/3425 +f 2393/3657/3426 3272/3666/3426 3896/3678/3426 3278/3675/3426 +f 2337/3362/3427 3140/3359/3427 3896/3678/3427 3272/3666/3427 +f 2412/3679/3428 3280/3680/3428 3897/3681/3428 3279/3682/3428 +f 3280/3680/3429 2400/3683/3429 3281/3684/3429 3897/3681/3429 +f 3897/3681/3430 3281/3684/3430 2426/3685/3430 3282/3686/3430 +f 3279/3682/3431 3897/3681/3431 3282/3686/3431 2414/3687/3431 +f 2427/3688/3432 3284/3689/3432 3898/3690/3432 3283/3691/3432 +f 3284/3689/3433 2401/3692/3433 3285/3693/3433 3898/3690/3433 +f 3898/3690/3434 3285/3693/3434 2413/3694/3434 3286/3695/3434 +f 3283/3691/3435 3898/3690/3435 3286/3695/3435 2415/3696/3435 +f 2412/3679/3436 3279/3682/3436 3899/3697/3436 3287/3698/3436 +f 3279/3682/3437 2414/3687/3437 3288/3699/3437 3899/3697/3437 +f 3899/3697/3438 3288/3699/3438 2416/3700/3438 3289/3701/3438 +f 3287/3698/3439 3899/3697/3439 3289/3701/3439 2410/3702/3439 +f 2417/3703/3440 3291/3704/3440 3900/3705/3440 3290/3706/3440 +f 3291/3704/3441 2415/3696/3441 3286/3695/3441 3900/3705/3441 +f 3900/3705/3442 3286/3695/3442 2413/3694/3442 3292/3707/3442 +f 3290/3706/3443 3900/3705/3443 3292/3707/3443 2411/3708/3443 +f 2410/3702/3444 3289/3701/3444 3901/3709/3444 3293/3710/3444 +f 3289/3701/3445 2416/3700/3445 3294/3711/3445 3901/3709/3445 +f 3901/3709/3446 3294/3711/3446 2418/3712/3446 3295/3713/3446 +f 3293/3710/3447 3901/3709/3447 3295/3713/3447 2408/3714/3447 +f 2419/3715/3448 3297/3716/3448 3902/3717/3448 3296/3718/3448 +f 3297/3716/3449 2417/3703/3449 3290/3706/3449 3902/3717/3449 +f 3902/3717/3450 3290/3706/3450 2411/3708/3450 3298/3719/3450 +f 3296/3718/3451 3902/3717/3451 3298/3719/3451 2409/3720/3451 +f 2408/3714/3452 3295/3713/3452 3903/3721/3452 3299/3722/3452 +f 3295/3713/3453 2418/3712/3453 3300/3723/3453 3903/3721/3453 +f 3903/3721/3454 3300/3723/3454 2420/3724/3454 3301/3725/3454 +f 3299/3722/3455 3903/3721/3455 3301/3725/3455 2406/3726/3455 +f 2421/3727/3456 3303/3728/3456 3904/3729/3456 3302/3730/3456 +f 3303/3728/3457 2419/3715/3457 3296/3718/3457 3904/3729/3457 +f 3904/3729/3458 3296/3718/3458 2409/3720/3458 3304/3731/3458 +f 3302/3730/3459 3904/3729/3459 3304/3731/3459 2407/3732/3459 +f 2406/3726/3460 3301/3725/3460 3905/3733/3460 3305/3734/3460 +f 3301/3725/3461 2420/3724/3461 3306/3735/3461 3905/3733/3461 +f 3905/3733/3462 3306/3735/3462 2422/3736/3462 3307/3737/3462 +f 3305/3734/3463 3905/3733/3463 3307/3737/3463 2404/3738/3463 +f 2423/3739/3464 3309/3740/3464 3906/3741/3464 3308/3742/3464 +f 3309/3740/3465 2421/3727/3465 3302/3730/3465 3906/3741/3465 +f 3906/3741/3466 3302/3730/3466 2407/3732/3466 3310/3743/3466 +f 3308/3742/3467 3906/3741/3467 3310/3743/3467 2405/3744/3467 +f 2404/3738/3468 3307/3737/3468 3907/3745/3468 3311/3746/3468 +f 3307/3737/3469 2422/3736/3469 3312/3747/3469 3907/3745/3469 +f 3907/3745/3470 3312/3747/3470 2424/3748/3470 3313/3749/3470 +f 3311/3746/3471 3907/3745/3471 3313/3749/3471 2402/3750/3471 +f 2425/3751/3472 3315/3752/3472 3908/3753/3472 3314/3754/3472 +f 3315/3752/3473 2423/3739/3473 3308/3742/3473 3908/3753/3473 +f 3908/3753/3474 3308/3742/3474 2405/3744/3474 3316/3755/3474 +f 3314/3754/3475 3908/3753/3475 3316/3755/3475 2403/3756/3475 +f 2422/3736/3476 3317/3757/3476 3909/3758/3476 3312/3747/3476 +f 3317/3757/3477 2432/3759/3477 3318/3760/3477 3909/3758/3477 +f 3909/3758/3478 3318/3760/3478 2430/3761/3478 3319/3762/3478 +f 3312/3747/3479 3909/3758/3479 3319/3762/3479 2424/3748/3479 +f 2431/3763/3480 3321/3764/3480 3910/3765/3480 3320/3766/3480 +f 3321/3764/3481 2433/3767/3481 3322/3768/3481 3910/3765/3481 +f 3910/3765/3482 3322/3768/3482 2423/3739/3482 3315/3752/3482 +f 3320/3766/3483 3910/3765/3483 3315/3752/3483 2425/3751/3483 +f 2420/3724/3484 3323/3769/3484 3911/3770/3484 3306/3735/3484 +f 3323/3769/3485 2434/3771/3485 3324/3772/3485 3911/3770/3485 +f 3911/3770/3486 3324/3772/3486 2432/3759/3486 3317/3757/3486 +f 3306/3735/3487 3911/3770/3487 3317/3757/3487 2422/3736/3487 +f 2433/3767/3488 3325/3773/3488 3912/3774/3488 3322/3768/3488 +f 3325/3773/3489 2435/3775/3489 3326/3776/3489 3912/3774/3489 +f 3912/3774/3490 3326/3776/3490 2421/3727/3490 3309/3740/3490 +f 3322/3768/3491 3912/3774/3491 3309/3740/3491 2423/3739/3491 +f 2418/3712/3492 3327/3777/3492 3913/3778/3492 3300/3723/3492 +f 3327/3777/3493 2436/3779/3493 3328/3780/3493 3913/3778/3493 +f 3913/3778/3494 3328/3780/3494 2434/3771/3494 3323/3769/3494 +f 3300/3723/3495 3913/3778/3495 3323/3769/3495 2420/3724/3495 +f 2435/3775/3496 3329/3781/3496 3914/3782/3496 3326/3776/3496 +f 3329/3781/3497 2437/3783/3497 3330/3784/3497 3914/3782/3497 +f 3914/3782/3498 3330/3784/3498 2419/3715/3498 3303/3728/3498 +f 3326/3776/3499 3914/3782/3499 3303/3728/3499 2421/3727/3499 +f 2416/3700/3500 3331/3785/3500 3915/3786/3500 3294/3711/3500 +f 3331/3785/3501 2438/3787/3501 3332/3788/3501 3915/3786/3501 +f 3915/3786/3502 3332/3788/3502 2436/3779/3502 3327/3777/3502 +f 3294/3711/3503 3915/3786/3503 3327/3777/3503 2418/3712/3503 +f 2437/3783/3504 3333/3789/3504 3916/3790/3504 3330/3784/3504 +f 3333/3789/3505 2439/3791/3505 3334/3792/3505 3916/3790/3505 +f 3916/3790/3506 3334/3792/3506 2417/3703/3506 3297/3716/3506 +f 3330/3784/3507 3916/3790/3507 3297/3716/3507 2419/3715/3507 +f 2414/3687/3508 3335/3793/3508 3917/3794/3508 3288/3699/3508 +f 3335/3793/3509 2440/3795/3509 3336/3796/3509 3917/3794/3509 +f 3917/3794/3510 3336/3796/3510 2438/3787/3510 3331/3785/3510 +f 3288/3699/3511 3917/3794/3511 3331/3785/3511 2416/3700/3511 +f 2439/3791/3512 3337/3797/3512 3918/3798/3512 3334/3792/3512 +f 3337/3797/3513 2441/3799/3513 3338/3800/3513 3918/3798/3513 +f 3918/3798/3514 3338/3800/3514 2415/3696/3514 3291/3704/3514 +f 3334/3792/3515 3918/3798/3515 3291/3704/3515 2417/3703/3515 +f 2414/3687/3516 3282/3686/3516 3919/3801/3516 3335/3793/3516 +f 3282/3686/3517 2426/3685/3517 3339/3802/3517 3919/3801/3517 +f 3919/3801/3518 3339/3802/3518 2428/3803/3518 3340/3804/3518 +f 3335/3793/3519 3919/3801/3519 3340/3804/3519 2440/3795/3519 +f 2429/3805/3520 3342/3806/3520 3920/3807/3520 3341/3808/3520 +f 3342/3806/3521 2427/3688/3521 3283/3691/3521 3920/3807/3521 +f 3920/3807/3522 3283/3691/3522 2415/3696/3522 3338/3800/3522 +f 3341/3808/3523 3920/3807/3523 3338/3800/3523 2441/3799/3523 +f 2330/3404/3524 3253/3629/3524 3921/3809/3524 3343/3810/3524 +f 3253/3629/3525 2332/3631/3525 3344/3811/3525 3921/3809/3525 +f 3921/3809/3526 3344/3811/3526 2456/3812/3526 3345/3813/3526 +f 3343/3810/3527 3921/3809/3527 3345/3813/3527 2454/3814/3527 +f 2457/3815/3528 3347/3816/3528 3922/3817/3528 3346/3818/3528 +f 3347/3816/3529 2333/3636/3529 3258/3635/3529 3922/3817/3529 +f 3922/3817/3530 3258/3635/3530 2331/3407/3530 3348/3819/3530 +f 3346/3818/3531 3922/3817/3531 3348/3819/3531 2455/3820/3531 +f 2332/3821/3532 3349/3822/3532 3923/3823/3532 3344/3824/3532 +f 3349/3822/3533 2402/3750/3533 3313/3749/3533 3923/3823/3533 +f 3923/3823/3534 3313/3749/3534 2424/3748/3534 3350/3825/3534 +f 3344/3824/3535 3923/3823/3535 3350/3825/3535 2456/3826/3535 +f 2425/3751/3536 3314/3754/3536 3924/3827/3536 3351/3828/3536 +f 3314/3754/3533 2403/3756/3533 3352/3829/3533 3924/3827/3533 +f 3924/3827/3537 3352/3829/3537 2333/3830/3537 3347/3831/3537 +f 3351/3828/3538 3924/3827/3538 3347/3831/3538 2457/3832/3538 +f 2322/3406/3539 3159/3405/3539 3925/3833/3539 3237/3595/3539 +f 3159/3405/3540 2330/3404/3540 3343/3810/3540 3925/3833/3540 +f 3925/3833/3541 3343/3810/3541 2454/3814/3541 3353/3834/3541 +f 3237/3595/3542 3925/3833/3542 3353/3834/3542 2324/3597/3542 +f 2455/3820/3543 3348/3819/3543 3926/3835/3543 3354/3836/3543 +f 3348/3819/3544 2331/3407/3544 3160/3410/3544 3926/3835/3544 +f 3926/3835/3545 3160/3410/3545 2323/3412/3545 3240/3602/3545 +f 3354/3836/3546 3926/3835/3546 3240/3602/3546 2325/3601/3546 +f 2394/3837/3547 3356/3838/3547 3927/3839/3547 3355/3840/3547 +f 3356/3838/3548 2442/3841/3548 3357/3842/3548 3927/3839/3548 +f 3927/3839/3549 3357/3842/3549 2426/3685/3549 3281/3684/3549 +f 3355/3840/3550 3927/3839/3550 3281/3684/3550 2400/3683/3550 +f 2427/3688/3551 3358/3843/3551 3928/3844/3551 3284/3689/3551 +f 3358/3843/3552 2443/3845/3552 3359/3846/3552 3928/3844/3552 +f 3928/3844/3553 3359/3846/3553 2395/3847/3553 3360/3848/3553 +f 3284/3689/3554 3928/3844/3554 3360/3848/3554 2401/3692/3554 +f 2424/3748/3555 3319/3762/3555 3929/3849/3555 3350/3825/3555 +f 3319/3762/3556 2430/3761/3556 3361/3850/3556 3929/3849/3556 +f 3929/3849/3557 3361/3850/3557 2452/3851/3557 3362/3852/3557 +f 3350/3825/3558 3929/3849/3558 3362/3852/3558 2456/3826/3558 +f 2453/3853/3559 3364/3854/3559 3930/3855/3559 3363/3856/3559 +f 3364/3854/3560 2431/3763/3560 3320/3766/3560 3930/3855/3560 +f 3930/3855/3561 3320/3766/3561 2425/3751/3561 3351/3828/3561 +f 3363/3856/3562 3930/3855/3562 3351/3828/3562 2457/3832/3562 +f 2450/3857/3563 3366/3858/3563 3931/3859/3563 3365/3860/3563 +f 3366/3858/3564 2458/3861/3564 3367/3862/3564 3931/3859/3564 +f 3931/3859/3565 3367/3862/3565 2456/3826/3565 3362/3852/3565 +f 3365/3860/3566 3931/3859/3566 3362/3852/3566 2452/3851/3566 +f 2457/3832/3567 3368/3863/3567 3932/3864/3567 3363/3856/3567 +f 3368/3863/3568 2459/3865/3568 3369/3866/3568 3932/3864/3568 +f 3932/3864/3569 3369/3866/3569 2451/3867/3569 3370/3868/3569 +f 3363/3856/3570 3932/3864/3570 3370/3868/3570 2453/3853/3570 +f 2446/3869/3571 3372/3870/3571 3933/3871/3571 3371/3872/3571 +f 3372/3870/3572 2458/3861/3572 3366/3858/3572 3933/3871/3572 +f 3933/3871/3573 3366/3858/3573 2450/3857/3573 3373/3873/3573 +f 3371/3872/3574 3933/3871/3574 3373/3873/3574 2448/3874/3574 +f 2451/3867/3575 3369/3866/3575 3934/3875/3575 3374/3876/3575 +f 3369/3866/3576 2459/3865/3576 3375/3877/3576 3934/3875/3576 +f 3934/3875/3577 3375/3877/3577 2447/3878/3577 3376/3879/3577 +f 3374/3876/3578 3934/3875/3578 3376/3879/3578 2449/3880/3578 +f 2444/3881/3579 3378/3882/3579 3935/3883/3579 3377/3884/3579 +f 3378/3882/3580 2460/3885/3580 3379/3886/3580 3935/3883/3580 +f 3935/3883/3581 3379/3886/3581 2458/3861/3581 3372/3870/3581 +f 3377/3884/3582 3935/3883/3582 3372/3870/3582 2446/3869/3582 +f 2459/3865/3583 3380/3887/3583 3936/3888/3583 3375/3877/3583 +f 3380/3887/3584 2461/3889/3584 3381/3890/3584 3936/3888/3584 +f 3936/3888/3585 3381/3890/3585 2445/3891/3585 3382/3892/3585 +f 3375/3877/3586 3936/3888/3586 3382/3892/3586 2447/3878/3586 +f 2442/3841/3587 3384/3893/3587 3937/3894/3587 3383/3895/3587 +f 3384/3893/3588 2460/3885/3588 3378/3882/3588 3937/3894/3588 +f 3937/3894/3589 3378/3882/3589 2444/3881/3589 3385/3896/3589 +f 3383/3895/3590 3937/3894/3590 3385/3896/3590 2462/3897/3590 +f 2445/3891/3591 3381/3890/3591 3938/3898/3591 3386/3899/3591 +f 3381/3890/3592 2461/3889/3592 3387/3900/3592 3938/3898/3592 +f 3938/3898/3593 3387/3900/3593 2443/3845/3593 3388/3901/3593 +f 3386/3899/3594 3938/3898/3594 3388/3901/3594 2463/3902/3594 +f 2426/3685/3595 3357/3842/3595 3939/3903/3595 3339/3802/3595 +f 3357/3842/3596 2442/3841/3596 3383/3895/3596 3939/3903/3596 +f 3939/3903/3597 3383/3895/3597 2462/3897/3597 3389/3904/3597 +f 3339/3802/3598 3939/3903/3598 3389/3904/3598 2428/3803/3598 +f 2463/3902/3599 3388/3901/3599 3940/3905/3599 3390/3906/3599 +f 3388/3901/3600 2443/3845/3600 3358/3843/3600 3940/3905/3600 +f 3940/3905/3601 3358/3843/3601 2427/3688/3601 3342/3806/3601 +f 3390/3906/3602 3940/3905/3602 3342/3806/3602 2429/3805/3602 +f 2324/3597/3603 3391/3907/3603 3941/3908/3603 3241/3603/3603 +f 3391/3907/3604 2460/3909/3604 3384/3910/3604 3941/3908/3604 +f 3941/3908/3605 3384/3910/3605 2442/3911/3605 3356/3912/3605 +f 3241/3603/3606 3941/3908/3606 3356/3912/3606 2394/3605/3606 +f 2443/3913/3607 3387/3914/3607 3942/3915/3607 3359/3916/3607 +f 3387/3914/3608 2461/3917/3608 3392/3918/3608 3942/3915/3608 +f 3942/3915/3609 3392/3918/3609 2325/3601/3609 3244/3610/3609 +f 3359/3916/3610 3942/3915/3610 3244/3610/3610 2395/3609/3610 +f 2324/3597/3611 3353/3834/3611 3943/3919/3611 3391/3907/3611 +f 3353/3834/3612 2454/3814/3612 3393/3920/3612 3943/3919/3612 +f 3943/3919/3613 3393/3920/3613 2458/3921/3613 3379/3922/3613 +f 3391/3907/3614 3943/3919/3614 3379/3922/3614 2460/3909/3614 +f 2459/3923/3615 3394/3924/3615 3944/3925/3615 3380/3926/3615 +f 3394/3924/3616 2455/3820/3616 3354/3836/3616 3944/3925/3616 +f 3944/3925/3617 3354/3836/3617 2325/3601/3617 3392/3918/3617 +f 3380/3926/3618 3944/3925/3618 3392/3918/3618 2461/3917/3618 +f 2454/3814/3619 3345/3813/3619 3945/3927/3619 3393/3920/3619 +f 2456/3812/3620 3367/3928/3620 3945/3927/3620 3345/3813/3620 +f 2458/3921/3621 3393/3920/3621 3945/3927/3621 3367/3928/3621 +f 2459/3923/3622 3368/3929/3622 3946/3930/3622 3394/3924/3622 +f 2457/3815/3623 3346/3818/3623 3946/3930/3623 3368/3929/3623 +f 2455/3820/3624 3394/3924/3624 3946/3930/3624 3346/3818/3624 +f 2428/3803/3625 3389/3904/3625 3947/3931/3625 3395/3932/3625 +f 3389/3904/3626 2462/3897/3626 3396/3933/3626 3947/3931/3626 +f 3947/3931/3627 3396/3933/3627 2464/3934/3627 3397/3935/3627 +f 3395/3932/3628 3947/3931/3628 3397/3935/3628 2488/3936/3628 +f 2465/3937/3629 3399/3938/3629 3948/3939/3629 3398/3940/3629 +f 3399/3938/3630 2463/3902/3630 3390/3906/3630 3948/3939/3630 +f 3948/3939/3631 3390/3906/3631 2429/3805/3631 3400/3941/3631 +f 3398/3940/3632 3948/3939/3632 3400/3941/3632 2489/3942/3632 +f 2462/3897/3633 3385/3896/3633 3949/3943/3633 3396/3933/3633 +f 3385/3896/3634 2444/3881/3634 3401/3944/3634 3949/3943/3634 +f 3949/3943/3635 3401/3944/3635 2474/3945/3635 3402/3946/3635 +f 3396/3933/3636 3949/3943/3636 3402/3946/3636 2464/3934/3636 +f 2475/3947/3637 3404/3948/3637 3950/3949/3637 3403/3950/3637 +f 3404/3948/3638 2445/3891/3638 3386/3899/3638 3950/3949/3638 +f 3950/3949/3639 3386/3899/3639 2463/3902/3639 3399/3938/3639 +f 3403/3950/3640 3950/3949/3640 3399/3938/3640 2465/3937/3640 +f 2444/3881/3641 3377/3884/3641 3951/3951/3641 3401/3944/3641 +f 3377/3884/3642 2446/3869/3642 3405/3952/3642 3951/3951/3642 +f 3951/3951/3643 3405/3952/3643 2472/3953/3643 3406/3954/3643 +f 3401/3944/3644 3951/3951/3644 3406/3954/3644 2474/3945/3644 +f 2473/3955/3645 3408/3956/3645 3952/3957/3645 3407/3958/3645 +f 3408/3956/3646 2447/3878/3646 3382/3892/3646 3952/3957/3646 +f 3952/3957/3647 3382/3892/3647 2445/3891/3647 3404/3948/3647 +f 3407/3958/3648 3952/3957/3648 3404/3948/3648 2475/3947/3648 +f 2446/3869/3649 3371/3872/3649 3953/3959/3649 3405/3952/3649 +f 3371/3872/3650 2448/3874/3650 3409/3960/3650 3953/3959/3650 +f 3953/3959/3651 3409/3960/3651 2470/3961/3651 3410/3962/3651 +f 3405/3952/3652 3953/3959/3652 3410/3962/3652 2472/3953/3652 +f 2471/3963/3653 3412/3964/3653 3954/3965/3653 3411/3966/3653 +f 3412/3964/3654 2449/3880/3654 3376/3879/3654 3954/3965/3654 +f 3954/3965/3655 3376/3879/3655 2447/3878/3655 3408/3956/3655 +f 3411/3966/3656 3954/3965/3656 3408/3956/3656 2473/3955/3656 +f 2448/3874/3657 3373/3873/3657 3955/3967/3657 3409/3960/3657 +f 3373/3873/3658 2450/3857/3658 3413/3968/3658 3955/3967/3658 +f 3955/3967/3659 3413/3968/3659 2468/3969/3659 3414/3970/3659 +f 3409/3960/3660 3955/3967/3660 3414/3970/3660 2470/3961/3660 +f 2469/3971/3661 3416/3972/3661 3956/3973/3661 3415/3974/3661 +f 3416/3972/3662 2451/3867/3662 3374/3876/3662 3956/3973/3662 +f 3956/3973/3663 3374/3876/3663 2449/3880/3663 3412/3964/3663 +f 3415/3974/3664 3956/3973/3664 3412/3964/3664 2471/3963/3664 +f 2450/3857/3665 3365/3860/3665 3957/3975/3665 3413/3968/3665 +f 3365/3860/3666 2452/3851/3666 3417/3976/3666 3957/3975/3666 +f 3957/3975/3667 3417/3976/3667 2466/3977/3667 3418/3978/3667 +f 3413/3968/3668 3957/3975/3668 3418/3978/3668 2468/3969/3668 +f 2467/3979/3669 3420/3980/3669 3958/3981/3669 3419/3982/3669 +f 3420/3980/3670 2453/3853/3670 3370/3868/3670 3958/3981/3670 +f 3958/3981/3671 3370/3868/3671 2451/3867/3671 3416/3972/3671 +f 3419/3982/3672 3958/3981/3672 3416/3972/3672 2469/3971/3672 +f 2452/3851/3673 3361/3850/3673 3959/3983/3673 3417/3976/3673 +f 3361/3850/3674 2430/3761/3674 3421/3984/3674 3959/3983/3674 +f 3959/3983/3675 3421/3984/3675 2486/3985/3675 3422/3986/3675 +f 3417/3976/3676 3959/3983/3676 3422/3986/3676 2466/3977/3676 +f 2487/3987/3677 3424/3988/3677 3960/3989/3677 3423/3990/3677 +f 3424/3988/3678 2431/3763/3678 3364/3854/3678 3960/3989/3678 +f 3960/3989/3679 3364/3854/3679 2453/3853/3679 3420/3980/3679 +f 3423/3990/3680 3960/3989/3680 3420/3980/3680 2467/3979/3680 +f 2440/3795/3681 3340/3804/3681 3961/3991/3681 3425/3992/3681 +f 3340/3804/3682 2428/3803/3682 3395/3932/3682 3961/3991/3682 +f 3961/3991/3683 3395/3932/3683 2488/3936/3683 3426/3993/3683 +f 3425/3992/3684 3961/3991/3684 3426/3993/3684 2476/3994/3684 +f 2489/3942/3685 3400/3941/3685 3962/3995/3685 3427/3996/3685 +f 3400/3941/3686 2429/3805/3686 3341/3808/3686 3962/3995/3686 +f 3962/3995/3687 3341/3808/3687 2441/3799/3687 3428/3997/3687 +f 3427/3996/3688 3962/3995/3688 3428/3997/3688 2477/3998/3688 +f 2438/3787/3689 3336/3796/3689 3963/3999/3689 3429/4000/3689 +f 3336/3796/3690 2440/3795/3690 3425/3992/3690 3963/3999/3690 +f 3963/3999/3691 3425/3992/3691 2476/3994/3691 3430/4001/3691 +f 3429/4000/3692 3963/3999/3692 3430/4001/3692 2478/4002/3692 +f 2477/3998/3693 3428/3997/3693 3964/4003/3693 3431/4004/3693 +f 3428/3997/3694 2441/3799/3694 3337/3797/3694 3964/4003/3694 +f 3964/4003/3695 3337/3797/3695 2439/3791/3695 3432/4005/3695 +f 3431/4004/3696 3964/4003/3696 3432/4005/3696 2479/4006/3696 +f 2436/3779/3697 3332/3788/3697 3965/4007/3697 3433/4008/3697 +f 3332/3788/3698 2438/3787/3698 3429/4000/3698 3965/4007/3698 +f 3965/4007/3699 3429/4000/3699 2478/4002/3699 3434/4009/3699 +f 3433/4008/3700 3965/4007/3700 3434/4009/3700 2480/4010/3700 +f 2479/4006/3701 3432/4005/3701 3966/4011/3701 3435/4012/3701 +f 3432/4005/3702 2439/3791/3702 3333/3789/3702 3966/4011/3702 +f 3966/4011/3703 3333/3789/3703 2437/3783/3703 3436/4013/3703 +f 3435/4012/3704 3966/4011/3704 3436/4013/3704 2481/4014/3704 +f 2434/3771/3705 3328/3780/3705 3967/4015/3705 3437/4016/3705 +f 3328/3780/3706 2436/3779/3706 3433/4008/3706 3967/4015/3706 +f 3967/4015/3707 3433/4008/3707 2480/4010/3707 3438/4017/3707 +f 3437/4016/3708 3967/4015/3708 3438/4017/3708 2482/4018/3708 +f 2481/4014/3709 3436/4013/3709 3968/4019/3709 3439/4020/3709 +f 3436/4013/3710 2437/3783/3710 3329/3781/3710 3968/4019/3710 +f 3968/4019/3711 3329/3781/3711 2435/3775/3711 3440/4021/3711 +f 3439/4020/3712 3968/4019/3712 3440/4021/3712 2483/4022/3712 +f 2432/3759/3713 3324/3772/3713 3969/4023/3713 3441/4024/3713 +f 3324/3772/3714 2434/3771/3714 3437/4016/3714 3969/4023/3714 +f 3969/4023/3715 3437/4016/3715 2482/4018/3715 3442/4025/3715 +f 3441/4024/3716 3969/4023/3716 3442/4025/3716 2484/4026/3716 +f 2483/4022/3717 3440/4021/3717 3970/4027/3717 3443/4028/3717 +f 3440/4021/3718 2435/3775/3718 3325/3773/3718 3970/4027/3718 +f 3970/4027/3719 3325/3773/3719 2433/3767/3719 3444/4029/3719 +f 3443/4028/3720 3970/4027/3720 3444/4029/3720 2485/4030/3720 +f 2430/3761/3721 3318/3760/3721 3971/4031/3721 3421/3984/3721 +f 3318/3760/3722 2432/3759/3722 3441/4024/3722 3971/4031/3722 +f 3971/4031/3723 3441/4024/3723 2484/4026/3723 3445/4032/3723 +f 3421/3984/3724 3971/4031/3724 3445/4032/3724 2486/3985/3724 +f 2485/4030/3725 3444/4029/3725 3972/4033/3725 3446/4034/3725 +f 3444/4029/3726 2433/3767/3726 3321/3764/3726 3972/4033/3726 +f 3972/4033/3727 3321/3764/3727 2431/3763/3727 3424/3988/3727 +f 3446/4034/3728 3972/4033/3728 3424/3988/3728 2487/3987/3728 +f 2470/3961/3729 3414/3970/3729 3973/4035/3729 3447/4036/3729 +f 3414/3970/3730 2468/3969/3730 3448/4037/3730 3973/4035/3730 +f 3973/4035/3731 3448/4037/3731 2492/4038/3731 3449/4039/3731 +f 3447/4036/3732 3973/4035/3732 3449/4039/3732 2490/4040/3732 +f 2493/4041/3733 3451/4042/3733 3974/4043/3733 3450/4044/3733 +f 3451/4042/3734 2469/3971/3734 3415/3974/3734 3974/4043/3734 +f 3974/4043/3735 3415/3974/3735 2471/3963/3735 3452/4045/3735 +f 3450/4044/3736 3974/4043/3736 3452/4045/3736 2491/4046/3736 +f 2490/4040/3737 3449/4039/3737 3975/4047/3737 3453/4048/3737 +f 3449/4039/3738 2492/4038/3738 3454/4049/3738 3975/4047/3738 +f 3975/4047/3739 3454/4049/3739 2494/4050/3739 3455/4051/3739 +f 3453/4048/3740 3975/4047/3740 3455/4051/3740 2496/4052/3740 +f 2495/4053/3741 3457/4054/3741 3976/4055/3741 3456/4056/3741 +f 3457/4054/3742 2493/4041/3742 3450/4044/3742 3976/4055/3742 +f 3976/4055/3743 3450/4044/3743 2491/4046/3743 3458/4057/3743 +f 3456/4056/3744 3976/4055/3744 3458/4057/3744 2497/4058/3744 +f 2496/4052/3745 3455/4051/3745 3977/4059/3745 3459/4060/3745 +f 3455/4051/3746 2494/4050/3746 3460/4061/3746 3977/4059/3746 +f 3977/4059/3747 3460/4061/3747 2500/4062/3747 3461/4063/3747 +f 3459/4060/3748 3977/4059/3748 3461/4063/3748 2498/4064/3748 +f 2501/4065/3749 3463/4066/3749 3978/4067/3749 3462/4068/3749 +f 3463/4066/3750 2495/4053/3750 3456/4056/3750 3978/4067/3750 +f 3978/4067/3751 3456/4056/3751 2497/4058/3751 3464/4069/3751 +f 3462/4068/3752 3978/4067/3752 3464/4069/3752 2499/4070/3752 +f 2498/4064/3753 3461/4063/3753 3979/4071/3753 3465/4072/3753 +f 3461/4063/3754 2500/4062/3754 3466/4073/3754 3979/4071/3754 +f 3979/4071/3755 3466/4073/3755 2502/4074/3755 3467/4075/3755 +f 3465/4072/3756 3979/4071/3756 3467/4075/3756 2504/4076/3756 +f 2503/4077/3757 3469/4078/3757 3980/4079/3757 3468/4080/3757 +f 3469/4078/3758 2501/4065/3758 3462/4068/3758 3980/4079/3758 +f 3980/4079/3759 3462/4068/3759 2499/4070/3759 3470/4081/3759 +f 3468/4080/3760 3980/4079/3760 3470/4081/3760 2505/4082/3760 +f 2476/3994/3761 3426/3993/3761 3981/4083/3761 3471/4084/3761 +f 3426/3993/3762 2488/3936/3762 3472/4085/3762 3981/4083/3762 +f 3981/4083/3763 3472/4085/3763 2498/4064/3763 3465/4072/3763 +f 3471/4084/3764 3981/4083/3764 3465/4072/3764 2504/4076/3764 +f 2499/4070/3765 3473/4086/3765 3982/4087/3765 3470/4081/3765 +f 3473/4086/3766 2489/3942/3766 3427/3996/3766 3982/4087/3766 +f 3982/4087/3767 3427/3996/3767 2477/3998/3767 3474/4088/3767 +f 3470/4081/3768 3982/4087/3768 3474/4088/3768 2505/4082/3768 +f 2464/3934/3769 3475/4089/3769 3983/4090/3769 3397/3935/3769 +f 3475/4089/3770 2496/4052/3770 3459/4060/3770 3983/4090/3770 +f 3983/4090/3771 3459/4060/3771 2498/4064/3771 3472/4085/3771 +f 3397/3935/3772 3983/4090/3772 3472/4085/3772 2488/3936/3772 +f 2499/4070/3773 3464/4069/3773 3984/4091/3773 3473/4086/3773 +f 3464/4069/3774 2497/4058/3774 3476/4092/3774 3984/4091/3774 +f 3984/4091/3775 3476/4092/3775 2465/3937/3775 3398/3940/3775 +f 3473/4086/3776 3984/4091/3776 3398/3940/3776 2489/3942/3776 +f 2464/3934/3777 3402/3946/3777 3985/4093/3777 3475/4089/3777 +f 3402/3946/3778 2474/3945/3778 3477/4094/3778 3985/4093/3778 +f 3985/4093/3779 3477/4094/3779 2490/4040/3779 3453/4048/3779 +f 3475/4089/3780 3985/4093/3780 3453/4048/3780 2496/4052/3780 +f 2491/4046/3781 3478/4095/3781 3986/4096/3781 3458/4057/3781 +f 3478/4095/3782 2475/3947/3782 3403/3950/3782 3986/4096/3782 +f 3986/4096/3783 3403/3950/3783 2465/3937/3783 3476/4092/3783 +f 3458/4057/3784 3986/4096/3784 3476/4092/3784 2497/4058/3784 +f 2470/3961/3785 3447/4036/3785 3987/4097/3785 3410/3962/3785 +f 3447/4036/3786 2490/4040/3786 3477/4094/3786 3987/4097/3786 +f 3987/4097/3787 3477/4094/3787 2474/3945/3787 3406/3954/3787 +f 3410/3962/3788 3987/4097/3788 3406/3954/3788 2472/3953/3788 +f 2475/3947/3789 3478/4095/3789 3988/4098/3789 3407/3958/3789 +f 3478/4095/3790 2491/4046/3790 3452/4045/3790 3988/4098/3790 +f 3988/4098/3791 3452/4045/3791 2471/3963/3791 3411/3966/3791 +f 3407/3958/3792 3988/4098/3792 3411/3966/3792 2473/3955/3792 +f 2466/3977/3793 3422/3986/3793 3989/4099/3793 3418/3978/3793 +f 3422/3986/3794 2486/3985/3794 3479/4100/3794 3989/4099/3794 +f 3989/4099/3795 3479/4100/3795 2492/4038/3795 3448/4037/3795 +f 3418/3978/3796 3989/4099/3796 3448/4037/3796 2468/3969/3796 +f 2493/4041/3797 3480/4101/3797 3990/4102/3797 3451/4042/3797 +f 3480/4101/3798 2487/3987/3798 3423/3990/3798 3990/4102/3798 +f 3990/4102/3799 3423/3990/3799 2467/3979/3799 3419/3982/3799 +f 3451/4042/3800 3990/4102/3800 3419/3982/3800 2469/3971/3800 +f 2484/4026/3801 3481/4103/3801 3991/4104/3801 3445/4032/3801 +f 3481/4103/3802 2494/4050/3802 3454/4049/3802 3991/4104/3802 +f 3991/4104/3803 3454/4049/3803 2492/4038/3803 3479/4100/3803 +f 3445/4032/3804 3991/4104/3804 3479/4100/3804 2486/3985/3804 +f 2493/4041/3805 3457/4054/3805 3992/4105/3805 3480/4101/3805 +f 3457/4054/3806 2495/4053/3806 3482/4106/3806 3992/4105/3806 +f 3992/4105/3807 3482/4106/3807 2485/4030/3807 3446/4034/3807 +f 3480/4101/3808 3992/4105/3808 3446/4034/3808 2487/3987/3808 +f 2482/4018/3809 3483/4107/3809 3993/4108/3809 3442/4025/3809 +f 3483/4107/3810 2500/4062/3810 3460/4061/3810 3993/4108/3810 +f 3993/4108/3811 3460/4061/3811 2494/4050/3811 3481/4103/3811 +f 3442/4025/3812 3993/4108/3812 3481/4103/3812 2484/4026/3812 +f 2495/4053/3813 3463/4066/3813 3994/4109/3813 3482/4106/3813 +f 3463/4066/3814 2501/4065/3814 3484/4110/3814 3994/4109/3814 +f 3994/4109/3815 3484/4110/3815 2483/4022/3815 3443/4028/3815 +f 3482/4106/3816 3994/4109/3816 3443/4028/3816 2485/4030/3816 +f 2480/4010/3817 3485/4111/3817 3995/4112/3817 3438/4017/3817 +f 3485/4111/3818 2502/4074/3818 3466/4073/3818 3995/4112/3818 +f 3995/4112/3819 3466/4073/3819 2500/4062/3819 3483/4107/3819 +f 3438/4017/3820 3995/4112/3820 3483/4107/3820 2482/4018/3820 +f 2501/4065/3821 3469/4078/3821 3996/4113/3821 3484/4110/3821 +f 3469/4078/3822 2503/4077/3822 3486/4114/3822 3996/4113/3822 +f 3996/4113/3823 3486/4114/3823 2481/4014/3823 3439/4020/3823 +f 3484/4110/3824 3996/4113/3824 3439/4020/3824 2483/4022/3824 +f 2478/4002/3825 3487/4115/3825 3997/4116/3825 3434/4009/3825 +f 3487/4115/3826 2504/4076/3826 3467/4075/3826 3997/4116/3826 +f 3997/4116/3827 3467/4075/3827 2502/4074/3827 3485/4111/3827 +f 3434/4009/3828 3997/4116/3828 3485/4111/3828 2480/4010/3828 +f 2503/4077/3829 3468/4080/3829 3998/4117/3829 3486/4114/3829 +f 3468/4080/3830 2505/4082/3830 3488/4118/3830 3998/4117/3830 +f 3998/4117/3831 3488/4118/3831 2479/4006/3831 3435/4012/3831 +f 3486/4114/3832 3998/4117/3832 3435/4012/3832 2481/4014/3832 +f 2476/3994/3833 3471/4084/3833 3999/4119/3833 3430/4001/3833 +f 2504/4076/3834 3487/4115/3834 3999/4119/3834 3471/4084/3834 +f 2478/4002/3835 3430/4001/3835 3999/4119/3835 3487/4115/3835 +f 2479/4006/3836 3488/4118/3836 4000/4120/3836 3431/4004/3836 +f 2505/4082/3837 3474/4088/3837 4000/4120/3837 3488/4118/3837 +f 2477/3998/3838 3431/4004/3838 4000/4120/3838 3474/4088/3838 +f 2404/3738/3839 3311/3746/3839 4001/4121/3839 3489/4122/3839 +f 3311/3746/3840 2402/3750/3840 3490/4123/3840 4001/4121/3840 +f 4001/4121/3841 3490/4123/3841 2516/4124/3841 3491/4125/3841 +f 3489/4122/3842 4001/4121/3842 3491/4125/3842 2514/4126/3842 +f 2517/4127/3843 3493/4128/3843 4002/4129/3843 3492/4130/3843 +f 3493/4128/3844 2403/3756/3844 3316/3755/3844 4002/4129/3844 +f 4002/4129/3845 3316/3755/3845 2405/3744/3845 3494/4131/3845 +f 3492/4130/3846 4002/4129/3846 3494/4131/3846 2515/4132/3846 +f 2406/3726/3847 3305/3734/3847 4003/4133/3847 3495/4134/3847 +f 3305/3734/3848 2404/3738/3848 3489/4122/3848 4003/4133/3848 +f 4003/4133/3849 3489/4122/3849 2514/4126/3849 3496/4135/3849 +f 3495/4134/3850 4003/4133/3850 3496/4135/3850 2512/4136/3850 +f 2515/4132/3851 3494/4131/3851 4004/4137/3851 3497/4138/3851 +f 3494/4131/3852 2405/3744/3852 3310/3743/3852 4004/4137/3852 +f 4004/4137/3853 3310/3743/3853 2407/3732/3853 3498/4139/3853 +f 3497/4138/3854 4004/4137/3854 3498/4139/3854 2513/4140/3854 +f 2408/3714/3855 3299/3722/3855 4005/4141/3855 3499/4142/3855 +f 3299/3722/3856 2406/3726/3856 3495/4134/3856 4005/4141/3856 +f 4005/4141/3857 3495/4134/3857 2512/4136/3857 3500/4143/3857 +f 3499/4142/3858 4005/4141/3858 3500/4143/3858 2510/4144/3858 +f 2513/4140/3859 3498/4139/3859 4006/4145/3859 3501/4146/3859 +f 3498/4139/3860 2407/3732/3860 3304/3731/3860 4006/4145/3860 +f 4006/4145/3861 3304/3731/3861 2409/3720/3861 3502/4147/3861 +f 3501/4146/3862 4006/4145/3862 3502/4147/3862 2511/4148/3862 +f 2410/4149/3863 3293/4150/3863 4007/4151/3863 3503/4152/3863 +f 3293/4150/3864 2408/3714/3864 3499/4142/3864 4007/4151/3864 +f 4007/4151/3865 3499/4142/3865 2510/4144/3865 3504/4153/3865 +f 3503/4152/3866 4007/4151/3866 3504/4153/3866 2508/4154/3866 +f 2511/4148/3867 3502/4147/3867 4008/4155/3867 3505/4156/3867 +f 3502/4147/3868 2409/3720/3868 3298/4157/3868 4008/4155/3868 +f 4008/4155/3869 3298/4157/3869 2411/4158/3869 3506/4159/3869 +f 3505/4156/3870 4008/4155/3870 3506/4159/3870 2509/4160/3870 +f 2412/4161/3871 3287/4162/3871 4009/4163/3871 3507/4164/3871 +f 3287/4162/3872 2410/4149/3872 3503/4152/3872 4009/4163/3872 +f 4009/4163/3873 3503/4152/3873 2508/4154/3873 3508/4165/3873 +f 3507/4164/3874 4009/4163/3874 3508/4165/3874 2506/4166/3874 +f 2509/4160/3875 3506/4159/3875 4010/4167/3875 3509/4168/3875 +f 3506/4159/3876 2411/4158/3876 3292/4169/3876 4010/4167/3876 +f 4010/4167/3877 3292/4169/3877 2413/4170/3877 3510/4171/3877 +f 3509/4168/3878 4010/4167/3878 3510/4171/3878 2507/4172/3878 +f 2400/4173/3879 3280/4174/3879 4011/4175/3879 3511/4176/3879 +f 3280/4174/3880 2412/4161/3880 3507/4164/3880 4011/4175/3880 +f 4011/4175/3881 3507/4164/3881 2506/4166/3881 3512/4177/3881 +f 3511/4176/3882 4011/4175/3882 3512/4177/3882 2518/4178/3882 +f 2507/4172/3883 3510/4171/3883 4012/4179/3883 3513/4180/3883 +f 3510/4171/3884 2413/4170/3884 3285/4181/3884 4012/4179/3884 +f 4012/4179/3885 3285/4181/3885 2401/4182/3885 3514/4183/3885 +f 3513/4180/3886 4012/4179/3886 3514/4183/3886 2519/4184/3886 +f 2506/4166/3887 3515/4185/3887 4013/4186/3887 3512/4177/3887 +f 3515/4185/3888 2514/4126/3888 3491/4125/3888 4013/4186/3888 +f 4013/4186/3889 3491/4125/3889 2516/4124/3889 3516/4187/3889 +f 3512/4177/3890 4013/4186/3890 3516/4187/3890 2518/4178/3890 +f 2517/4127/3891 3492/4130/3891 4014/4188/3891 3517/4189/3891 +f 3492/4130/3892 2515/4132/3892 3518/4190/3892 4014/4188/3892 +f 4014/4188/3893 3518/4190/3893 2507/4172/3893 3513/4180/3893 +f 3517/4189/3894 4014/4188/3894 3513/4180/3894 2519/4184/3894 +f 2506/4166/3895 3508/4165/3895 4015/4191/3895 3515/4185/3895 +f 3508/4165/3896 2508/4154/3896 3519/4192/3896 4015/4191/3896 +f 4015/4191/3897 3519/4192/3897 2512/4136/3897 3496/4135/3897 +f 3515/4185/3898 4015/4191/3898 3496/4135/3898 2514/4126/3898 +f 2513/4140/3899 3520/4193/3899 4016/4194/3899 3497/4138/3899 +f 3520/4193/3900 2509/4160/3900 3509/4168/3900 4016/4194/3900 +f 4016/4194/3901 3509/4168/3901 2507/4172/3901 3518/4190/3901 +f 3497/4138/3902 4016/4194/3902 3518/4190/3902 2515/4132/3902 +f 2508/4154/3903 3504/4153/3903 4017/4195/3903 3519/4192/3903 +f 2510/4144/3904 3500/4143/3904 4017/4195/3904 3504/4153/3904 +f 2512/4136/3905 3519/4192/3905 4017/4195/3905 3500/4143/3905 +f 2513/4140/3906 3501/4146/3906 4018/4196/3906 3520/4193/3906 +f 2511/4148/3907 3505/4156/3907 4018/4196/3907 3501/4146/3907 +f 2509/4160/3908 3520/4193/3908 4018/4196/3908 3505/4156/3908 +f 2326/3513/3909 3245/3612/3909 4019/4197/3909 3521/4198/3909 +f 3245/3612/3910 2394/3605/3910 3355/4199/3910 4019/4197/3910 +f 4019/4197/3911 3355/4199/3911 2400/4200/3911 3511/4201/3911 +f 3521/4198/3912 4019/4197/3912 3511/4201/3912 2518/4202/3912 +f 2401/4182/3913 3360/4203/3913 4020/4204/3913 3514/4183/3913 +f 3360/4203/3914 2395/4205/3914 3246/4206/3914 4020/4204/3914 +f 4020/4204/3915 3246/4206/3915 2327/4207/3915 3522/4208/3915 +f 3514/4183/3916 4020/4204/3916 3522/4208/3916 2519/4184/3916 +f 2326/4209/3917 3521/4210/3917 4021/4211/3917 3265/4212/3917 +f 3521/4210/3918 2518/4178/3918 3516/4187/3918 4021/4211/3918 +f 4021/4211/3919 3516/4187/3919 2516/4124/3919 3523/4213/3919 +f 3265/4212/3920 4021/4211/3920 3523/4213/3920 2334/4214/3920 +f 2517/4127/3921 3517/4189/3921 4022/4215/3921 3524/4216/3921 +f 3517/4189/3922 2519/4184/3922 3522/4208/3922 4022/4215/3922 +f 4022/4215/3923 3522/4208/3923 2327/4207/3923 3270/4217/3923 +f 3524/4216/3924 4022/4215/3924 3270/4217/3924 2335/4218/3924 +f 2332/3821/3925 3273/4219/3925 4023/4220/3925 3349/3822/3925 +f 3273/4219/3926 2334/4214/3926 3523/4213/3926 4023/4220/3926 +f 4023/4220/3927 3523/4213/3927 2516/4124/3927 3490/4123/3927 +f 3349/3822/3928 4023/4220/3928 3490/4123/3928 2402/3750/3928 +f 2517/4127/3929 3524/4216/3929 4024/4221/3929 3493/4128/3929 +f 3524/4216/3930 2335/4218/3930 3276/4222/3930 4024/4221/3930 +f 4024/4221/3931 3276/4222/3931 2333/3830/3931 3352/3829/3931 +f 3493/4128/3932 4024/4221/3932 3352/3829/3932 2403/3756/3932 +g SharpBoundary_Suzanne.005 +v 1.938843 0.160767 0.759033 +v 1.061157 0.160767 0.759033 +v 1.987305 0.108154 0.685547 +v 1.012695 0.108154 0.685547 +v 2.032227 0.068359 0.581055 +v 0.967773 0.068359 0.581055 +v 1.851562 -0.003906 0.616211 +v 1.148438 -0.003906 0.616211 +v 1.851685 0.052246 0.713013 +v 1.148315 0.052246 0.713013 +v 1.852417 0.127197 0.776123 +v 1.147583 0.127197 0.776123 +v 1.770142 0.160767 0.790894 +v 1.229858 0.160767 0.790894 +v 1.716675 0.108154 0.734497 +v 1.283325 0.108154 0.734497 +v 1.670898 0.068359 0.645508 +v 1.329102 0.068359 0.645508 +v 1.597656 0.243164 0.654297 +v 1.402344 0.243164 0.654297 +v 1.660645 0.242432 0.738037 +v 1.339355 0.242432 0.738037 +v 1.736572 0.243042 0.792969 +v 1.263428 0.243042 0.792969 +v 1.770142 0.329590 0.790894 +v 1.229858 0.329590 0.790894 +v 1.716675 0.377930 0.734497 +v 1.283325 0.377930 0.734497 +v 1.670898 0.422852 0.645508 +v 1.329102 0.422852 0.645508 +v 1.851562 0.496094 0.616211 +v 1.148438 0.496094 0.616211 +v 1.851685 0.434082 0.713013 +v 1.148315 0.434082 0.713013 +v 1.852417 0.364014 0.776123 +v 1.147583 0.364014 0.776123 +v 1.938843 0.329590 0.759033 +v 1.061157 0.329590 0.759033 +v 1.987305 0.377930 0.685547 +v 1.012695 0.377930 0.685547 +v 2.032227 0.422852 0.581055 +v 0.967773 0.422852 0.581055 +v 2.105469 0.243164 0.566406 +v 0.894531 0.243164 0.566406 +v 2.043457 0.242432 0.672607 +v 0.956543 0.242432 0.672607 +v 1.972656 0.243042 0.751221 +v 1.027344 0.243042 0.751221 +v 1.955404 0.243083 0.778971 +v 1.044596 0.243083 0.778971 +v 1.927531 0.318929 0.785848 +v 1.072469 0.318929 0.785848 +v 1.852458 0.350505 0.803426 +v 1.147542 0.350505 0.803426 +v 1.780925 0.318929 0.816406 +v 1.219075 0.318929 0.816406 +v 1.750244 0.243083 0.818197 +v 1.249756 0.243083 0.818197 +v 1.780925 0.171549 0.816406 +v 1.219075 0.171549 0.816406 +v 1.851969 0.242798 0.822428 +v 1.148031 0.242798 0.822428 +v 1.852458 0.140869 0.803426 +v 1.147542 0.140869 0.803426 +v 1.927531 0.171549 0.785848 +v 1.072469 0.171549 0.785848 +v 1.500000 0.432861 0.736816 +v 1.500000 0.352431 0.809679 +v 1.500000 -0.661133 0.736328 +v 1.500000 -0.306152 0.779297 +v 1.500000 -0.175293 0.791260 +v 1.500000 -0.765137 0.714600 +v 1.500000 0.439046 0.617676 +v 1.500000 0.566551 0.546875 +v 1.500000 0.855713 -0.490723 +v 1.500000 0.518066 -0.772461 +v 1.500000 0.093262 -0.771973 +v 1.500000 -0.352295 -0.304688 +v 1.726929 -0.177246 0.577515 +v 1.273071 -0.177246 0.577515 +v 1.788696 -0.443359 0.565674 +v 1.211304 -0.443359 0.565674 +v 1.823975 -0.664795 0.558960 +v 1.176025 -0.664795 0.558960 +v 1.838867 -0.845703 0.532471 +v 1.161133 -0.845703 0.532471 +v 1.802368 -0.930664 0.526001 +v 1.197632 -0.930664 0.526001 +v 1.671387 -0.960205 0.548950 +v 1.328613 -0.960205 0.548950 +v 1.500000 -0.974121 0.565918 +v 1.927002 -0.116943 0.545776 +v 1.072998 -0.116943 0.545776 +v 2.125366 -0.012573 0.525269 +v 0.874634 -0.012573 0.525269 +v 2.289429 0.167603 0.481934 +v 0.710571 0.167603 0.481934 +v 2.316772 0.393555 0.573364 +v 0.683228 0.393555 0.573364 +v 2.193237 0.479858 0.624512 +v 0.806763 0.479858 0.624512 +v 1.991455 0.592407 0.682251 +v 1.008545 0.592407 0.682251 +v 1.822388 0.711792 0.726685 +v 1.177612 0.711792 0.726685 +v 1.674561 0.676270 0.748169 +v 1.325439 0.676270 0.748169 +v 1.575806 0.499878 0.743896 +v 1.424194 0.499878 0.743896 +v 1.666992 0.407227 0.780640 +v 1.333008 0.407227 0.780640 +v 1.622559 0.310059 0.773926 +v 1.377441 0.310059 0.773926 +v 1.712769 0.071533 0.748657 +v 1.287231 0.071533 0.748657 +v 1.871216 0.027466 0.706543 +v 1.128784 0.027466 0.706543 +v 2.005615 0.075317 0.672729 +v 0.994385 0.075317 0.672729 +v 2.117920 0.189331 0.650635 +v 0.882080 0.189331 0.650635 +v 2.139771 0.300171 0.656006 +v 0.860229 0.300171 0.656006 +v 2.090088 0.376709 0.680542 +v 0.909912 0.376709 0.680542 +v 1.939087 0.443237 0.730469 +v 1.060913 0.443237 0.730469 +v 1.746460 0.473877 0.770996 +v 1.253540 0.473877 0.770996 +v 1.500000 -0.746338 0.732666 +v 1.612500 -0.737188 0.726406 +v 1.387500 -0.737188 0.726406 +v 1.621704 -0.835449 0.702271 +v 1.378296 -0.835449 0.702271 +v 1.571045 -0.882446 0.687744 +v 1.428955 -0.882446 0.687744 +v 1.500000 -0.893311 0.682861 +v 1.500000 -0.163086 0.768555 +v 1.500000 -0.134440 0.747396 +v 1.596069 -0.148438 0.753906 +v 1.403931 -0.148438 0.753906 +v 1.623657 -0.225220 0.750610 +v 1.376343 -0.225220 0.750610 +v 1.589531 -0.299844 0.743984 +v 1.410469 -0.299844 0.743984 +v 1.893799 -0.043579 0.667725 +v 1.106201 -0.043579 0.667725 +v 2.093506 0.050903 0.620850 +v 0.906494 0.050903 0.620850 +v 2.213379 0.197754 0.599365 +v 0.786621 0.197754 0.599365 +v 2.233887 0.355591 0.647339 +v 0.766113 0.355591 0.647339 +v 2.158203 0.427490 0.707153 +v 0.841797 0.427490 0.707153 +v 1.956909 0.536621 0.769775 +v 1.043091 0.536621 0.769775 +v 1.817383 0.619995 0.808838 +v 1.182617 0.619995 0.808838 +v 1.704834 0.592285 0.825439 +v 1.295166 0.592285 0.825439 +v 1.605713 0.447510 0.821411 +v 1.394287 0.447510 0.821411 +v 1.642415 -0.096300 0.776693 +v 1.357585 -0.096300 0.776693 +v 1.708252 -0.459473 0.695435 +v 1.291748 -0.459473 0.695435 +v 1.742798 -0.682739 0.678345 +v 1.257202 -0.682739 0.678345 +v 1.753784 -0.813354 0.655640 +v 1.246216 -0.813354 0.655640 +v 1.725098 -0.899292 0.632568 +v 1.274902 -0.899292 0.632568 +v 1.643921 -0.927979 0.631592 +v 1.356079 -0.927979 0.631592 +v 1.500000 -0.939697 0.636719 +v 1.500000 0.041558 0.738824 +v 1.500000 0.209473 0.765137 +v 1.829956 0.484375 0.755249 +v 1.170044 0.484375 0.755249 +v 1.649536 0.133545 0.752197 +v 1.350464 0.133545 0.752197 +v 1.623657 0.213989 0.761841 +v 1.376343 0.213989 0.761841 +v 1.614380 -0.664185 0.730225 +v 1.385620 -0.664185 0.730225 +v 1.589478 -0.457153 0.742188 +v 1.410522 -0.457153 0.742188 +v 1.500000 -0.458984 0.747070 +v 1.500000 -0.333008 0.748047 +v 1.584229 -0.272339 0.781250 +v 1.415771 -0.272339 0.781250 +v 1.621338 -0.221191 0.791138 +v 1.378662 -0.221191 0.791138 +v 1.600342 -0.147827 0.782104 +v 1.399658 -0.147827 0.782104 +v 1.539673 -0.138428 0.782104 +v 1.460327 -0.138428 0.782104 +v 1.500000 -0.202365 0.823351 +v 1.547743 -0.157769 0.809028 +v 1.452257 -0.157769 0.809028 +v 1.588108 -0.165148 0.809028 +v 1.411892 -0.165148 0.809028 +v 1.593994 -0.218994 0.819458 +v 1.406006 -0.218994 0.819458 +v 1.570096 -0.256510 0.804471 +v 1.429904 -0.256510 0.804471 +v 1.500000 -0.274170 0.804688 +v 1.746460 -0.315674 0.560303 +v 1.253540 -0.315674 0.560303 +v 1.664673 -0.234375 0.705688 +v 1.335327 -0.234375 0.705688 +v 1.680176 -0.317871 0.695801 +v 1.319824 -0.317871 0.695801 +v 1.721558 -0.244995 0.565674 +v 1.278442 -0.244995 0.565674 +v 1.500000 -0.873047 0.680908 +v 1.548706 -0.862427 0.684082 +v 1.451294 -0.862427 0.684082 +v 1.590576 -0.816895 0.701782 +v 1.409424 -0.816895 0.701782 +v 1.583862 -0.754517 0.716675 +v 1.416138 -0.754517 0.716675 +v 1.500000 -0.782959 0.662842 +v 1.577393 -0.771606 0.664876 +v 1.422607 -0.771606 0.664876 +v 1.584201 -0.809245 0.658782 +v 1.415799 -0.809245 0.658782 +v 1.551025 -0.838623 0.644246 +v 1.448975 -0.838623 0.644246 +v 1.500000 -0.848877 0.642822 +v 1.672607 0.220825 0.773804 +v 1.327393 0.220825 0.773804 +v 1.689331 0.158203 0.769165 +v 1.310669 0.158203 0.769165 +v 1.837891 0.427856 0.757935 +v 1.162109 0.427856 0.757935 +v 1.771484 0.419922 0.769409 +v 1.228516 0.419922 0.769409 +v 1.928711 0.399902 0.753296 +v 1.071289 0.399902 0.753296 +v 2.048950 0.350830 0.697632 +v 0.951050 0.350830 0.697632 +v 2.084595 0.285400 0.681030 +v 0.915405 0.285400 0.681030 +v 2.068237 0.195679 0.680054 +v 0.931763 0.195679 0.680054 +v 1.976807 0.105957 0.709473 +v 1.023193 0.105957 0.709473 +v 1.869019 0.070679 0.737061 +v 1.130981 0.070679 0.737061 +v 1.739380 0.109009 0.767944 +v 1.260620 0.109009 0.767944 +v 1.678345 0.297974 0.776245 +v 1.321655 0.297974 0.776245 +v 1.711792 0.373779 0.776367 +v 1.288208 0.373779 0.776367 +v 1.735352 0.356445 0.758789 +v 1.264648 0.356445 0.758789 +v 1.700195 0.295898 0.756836 +v 1.299805 0.295898 0.756836 +v 1.753906 0.125977 0.752930 +v 1.246094 0.125977 0.752930 +v 1.869141 0.094727 0.727539 +v 1.130859 0.094727 0.727539 +v 1.960938 0.125000 0.702148 +v 1.039062 0.125000 0.702148 +v 2.037109 0.208008 0.675781 +v 0.962891 0.208008 0.675781 +v 2.050781 0.279297 0.672852 +v 0.949219 0.279297 0.672852 +v 2.019531 0.335938 0.687500 +v 0.980469 0.335938 0.687500 +v 1.918945 0.385742 0.741211 +v 1.081055 0.385742 0.741211 +v 1.782227 0.394531 0.762695 +v 1.217773 0.394531 0.762695 +v 1.838867 0.403320 0.751953 +v 1.161133 0.403320 0.751953 +v 1.707031 0.172852 0.750977 +v 1.292969 0.172852 0.750977 +v 1.696289 0.228516 0.750977 +v 1.303711 0.228516 0.750977 +v 1.625521 0.489245 0.612891 +v 1.374479 0.489245 0.612891 +v 1.705729 0.638021 0.640625 +v 1.294271 0.638021 0.640625 +v 1.827691 0.665365 0.622179 +v 1.172309 0.665365 0.622179 +v 1.958125 0.553438 0.557578 +v 1.041875 0.553438 0.557578 +v 2.168091 0.463501 0.489014 +v 0.831909 0.463501 0.489014 +v 2.280396 0.385376 0.449707 +v 0.719604 0.385376 0.449707 +v 2.269775 0.177979 0.363892 +v 0.730225 0.177979 0.363892 +v 2.119507 -0.000366 0.387573 +v 0.880493 -0.000366 0.387573 +v 1.916667 -0.110781 0.449245 +v 1.083333 -0.110781 0.449245 +v 1.500000 0.856201 0.263916 +v 1.500000 0.950195 -0.085938 +v 1.500000 -0.175049 -0.618652 +v 1.500000 -0.436523 0.129395 +v 1.500000 -0.948242 0.456543 +v 1.500000 -0.786133 0.360352 +v 1.500000 -0.579346 0.325684 +v 1.500000 -0.475830 0.270508 +v 2.314697 0.226074 0.114136 +v 0.685303 0.226074 0.114136 +v 2.336328 0.300938 -0.049844 +v 0.663672 0.300938 -0.049844 +v 2.262813 0.282891 -0.418750 +v 0.737187 0.282891 -0.418750 +v 1.908691 0.442139 -0.665405 +v 1.091309 0.442139 -0.665405 +v 2.200313 -0.032500 0.072813 +v 0.799688 -0.032500 0.072812 +v 2.116094 -0.109531 -0.167969 +v 0.883906 -0.109531 -0.167969 +v 2.149780 0.005127 -0.400513 +v 0.850220 0.005127 -0.400513 +v 1.825521 0.077148 -0.660970 +v 1.174479 0.077148 -0.660970 +v 1.736694 -0.381104 0.408813 +v 1.263306 -0.381104 0.408813 +v 1.661865 -0.426758 0.279297 +v 1.338135 -0.426758 0.279297 +v 1.779541 -0.735840 0.403076 +v 1.220459 -0.735840 0.403076 +v 1.750000 -0.535645 0.407837 +v 1.250000 -0.535645 0.407837 +v 1.786024 -0.887153 0.430339 +v 1.213976 -0.887153 0.430339 +v 1.642334 -0.753784 0.373901 +v 1.357666 -0.753784 0.373901 +v 1.631958 -0.550171 0.349487 +v 1.368042 -0.550171 0.349487 +v 1.662720 -0.924683 0.441650 +v 1.337280 -0.924683 0.441650 +v 1.735833 -0.284766 0.404818 +v 1.264167 -0.284766 0.404818 +v 1.739176 -0.215210 0.474040 +v 1.260824 -0.215210 0.474040 +v 1.753111 -0.171658 0.501808 +v 1.246889 -0.171658 0.501808 +v 1.712630 -0.369297 0.155833 +v 1.287370 -0.369297 0.155833 +v 1.773193 -0.293091 -0.251099 +v 1.226807 -0.293091 -0.251099 +v 1.810872 -0.132080 -0.535482 +v 1.189128 -0.132080 -0.535482 +v 1.920288 0.804932 -0.407593 +v 1.079712 0.804932 -0.407593 +v 1.919922 0.896362 -0.089233 +v 1.080078 0.896362 -0.089233 +v 1.920532 0.808472 0.206787 +v 1.079468 0.808472 0.206787 +v 1.928833 0.561523 0.418091 +v 1.071167 0.561523 0.418091 +v 2.243408 0.409424 0.289062 +v 0.756592 0.409424 0.289062 +v 2.130615 0.487549 0.302734 +v 0.869385 0.487549 0.302734 +v 2.135010 0.679565 0.081543 +v 0.864990 0.679565 0.081543 +v 2.277710 0.535889 0.090576 +v 0.722290 0.535889 0.090576 +v 2.280151 0.582275 -0.138916 +v 0.719849 0.582275 -0.138916 +v 2.136719 0.740601 -0.170044 +v 0.863281 0.740601 -0.170044 +v 2.134277 0.650391 -0.414062 +v 0.865723 0.650391 -0.414062 +v 2.258246 0.524089 -0.343750 +v 0.741753 0.524089 -0.343750 +v 2.103149 0.339111 -0.558228 +v 0.896851 0.339111 -0.558228 +v 1.982005 0.019531 -0.522786 +v 1.017995 0.019531 -0.522786 +v 2.324766 0.347656 -0.205313 +v 0.675234 0.347656 -0.205313 +v 1.905755 -0.181641 0.158802 +v 1.094245 -0.181641 0.158802 +v 1.938843 -0.174072 -0.207764 +v 1.061157 -0.174072 -0.207764 +v 2.397949 0.395508 -0.258789 +v 0.602051 0.395508 -0.258789 +v 2.293335 -0.121094 -0.181519 +v 0.706665 -0.121094 -0.181519 +v 2.535889 -0.077881 -0.333130 +v 0.464111 -0.077881 -0.333130 +v 2.754883 0.070923 -0.426514 +v 0.245117 0.070923 -0.426514 +v 2.820435 0.304077 -0.431396 +v 0.179565 0.304077 -0.431396 +v 2.718506 0.467773 -0.420288 +v 0.281494 0.467773 -0.420288 +v 2.531982 0.459351 -0.333862 +v 0.468018 0.459351 -0.333862 +v 2.527222 0.409180 -0.304321 +v 0.472778 0.409180 -0.304321 +v 2.679810 0.415039 -0.389526 +v 0.320190 0.415039 -0.389526 +v 2.755371 0.280273 -0.411621 +v 0.244629 0.280273 -0.411621 +v 2.700806 0.088623 -0.401611 +v 0.299194 0.088623 -0.401611 +v 2.530518 -0.031006 -0.306030 +v 0.469482 -0.031006 -0.306030 +v 2.339600 -0.064575 -0.168579 +v 0.660400 -0.064575 -0.168579 +v 2.423706 0.356445 -0.236816 +v 0.576294 0.356445 -0.236816 +v 2.446167 0.306885 -0.293213 +v 0.553833 0.306885 -0.293213 +v 2.386963 -0.023926 -0.235107 +v 0.613037 -0.023926 -0.235107 +v 2.537964 0.004150 -0.356323 +v 0.462036 0.004150 -0.356323 +v 2.680054 0.099243 -0.435547 +v 0.319946 0.099243 -0.435547 +v 2.727051 0.247681 -0.445068 +v 0.272949 0.247681 -0.445068 +v 2.665039 0.350952 -0.428589 +v 0.334961 0.350952 -0.428589 +v 2.533203 0.347534 -0.358643 +v 0.466797 0.347534 -0.358643 +v 2.351318 0.287598 -0.216064 +v 0.648682 0.287598 -0.216064 +v 2.328857 0.173584 -0.270386 +v 0.671143 0.173584 -0.270386 +v 2.272461 0.096680 -0.270264 +v 0.727539 0.096680 -0.270264 +v 2.311632 0.071181 -0.281467 +v 0.688368 0.071181 -0.281467 +v 2.323608 0.022583 -0.269653 +v 0.676392 0.022583 -0.269653 +v 2.313721 -0.013672 -0.259521 +v 0.686279 -0.013672 -0.259521 +v 2.239177 0.032064 -0.078288 +v 0.760824 0.032064 -0.078288 +v 2.227526 -0.027448 -0.168229 +v 0.772474 -0.027448 -0.168229 +v 2.238307 0.048411 -0.191979 +v 0.761693 0.048411 -0.191979 +v 2.303589 0.201538 -0.198730 +v 0.696411 0.201538 -0.198730 +v 2.385498 0.245972 -0.269043 +v 0.614502 0.245972 -0.269043 +v 2.400635 0.226685 -0.320068 +v 0.599365 0.226685 -0.320068 +v 2.337023 -0.007595 -0.299479 +v 0.662977 -0.007595 -0.299479 +v 2.353027 0.024536 -0.315186 +v 0.646973 0.024536 -0.315186 +v 2.330688 0.077881 -0.315430 +v 0.669312 0.077881 -0.315430 +v 2.294705 0.106554 -0.310113 +v 0.705295 0.106554 -0.310113 +v 2.345459 0.162964 -0.315552 +v 0.654541 0.162964 -0.315552 +v 2.549113 0.320719 -0.404785 +v 0.450887 0.320719 -0.404785 +v 2.664835 0.323649 -0.460449 +v 0.335164 0.323649 -0.460449 +v 2.722412 0.234009 -0.471924 +v 0.277588 0.234009 -0.471924 +v 2.675903 0.106567 -0.460327 +v 0.324097 0.106567 -0.460327 +v 2.539795 0.023315 -0.397949 +v 0.460205 0.023315 -0.397949 +v 2.399414 -0.004639 -0.291016 +v 0.600586 -0.004639 -0.291016 +v 2.462769 0.281982 -0.345825 +v 0.537231 0.281982 -0.345825 +v 2.390503 0.114258 -0.329834 +v 0.609497 0.114258 -0.329834 +v 2.424194 0.060791 -0.331177 +v 0.575806 0.060791 -0.331177 +v 2.500000 0.116333 -0.369141 +v 0.500000 0.116333 -0.369141 +v 2.455688 0.173706 -0.349731 +v 0.544312 0.173706 -0.349731 +v 2.514526 0.232300 -0.371948 +v 0.485474 0.232300 -0.371948 +v 2.567749 0.177734 -0.392822 +v 0.432251 0.177734 -0.392822 +v 2.623481 0.223524 -0.411024 +v 0.376519 0.223524 -0.411024 +v 2.587077 0.274699 -0.401489 +v 0.412923 0.274699 -0.401489 +v 2.532837 0.375732 -0.458740 +v 0.467163 0.375732 -0.458740 +v 2.739827 0.400635 -0.516642 +v 0.260173 0.400635 -0.516642 +v 2.828269 0.287543 -0.496600 +v 0.171730 0.287543 -0.496600 +v 2.774984 0.114136 -0.510905 +v 0.225016 0.114136 -0.510905 +v 2.539917 -0.011475 -0.456787 +v 0.460083 -0.011475 -0.456787 +v 2.307983 -0.048950 -0.340698 +v 0.692017 -0.048950 -0.340698 +v 2.364380 0.318726 -0.376953 +v 0.635620 0.318726 -0.376953 +v 2.003906 0.242676 0.717773 +v 1.963867 0.198242 0.753418 +v 1.959961 0.137207 0.728027 +v 2.028320 0.169922 0.676270 +v 0.971680 0.169922 0.676270 +v 1.040039 0.137207 0.728027 +v 1.036133 0.198242 0.753418 +v 0.996094 0.242676 0.717773 +v 2.076172 0.242676 0.621094 +v 2.010742 0.086426 0.635254 +v 2.085938 0.148438 0.570312 +v 0.914062 0.148438 0.570312 +v 0.989258 0.086426 0.635254 +v 0.923828 0.242676 0.621094 +v 1.924805 0.067383 0.698730 +v 1.851562 0.021484 0.666992 +v 1.949219 0.015625 0.597656 +v 1.050781 0.015625 0.597656 +v 1.148438 0.021484 0.666992 +v 1.075195 0.067383 0.698730 +v 1.898926 0.136230 0.767090 +v 1.852051 0.093750 0.749512 +v 1.147949 0.093750 0.749512 +v 1.101074 0.136230 0.767090 +v 1.807617 0.136230 0.784668 +v 1.746582 0.137207 0.767090 +v 1.778809 0.067383 0.725586 +v 1.221191 0.067383 0.725586 +v 1.253418 0.137207 0.767090 +v 1.192383 0.136230 0.784668 +v 1.692383 0.086426 0.692383 +v 1.753906 0.015625 0.632812 +v 1.246094 0.015625 0.632812 +v 1.307617 0.086426 0.692383 +v 1.675781 0.169922 0.737793 +v 1.626953 0.242676 0.698242 +v 1.617188 0.148438 0.652344 +v 1.382812 0.148438 0.652344 +v 1.373047 0.242676 0.698242 +v 1.324219 0.169922 0.737793 +v 1.745605 0.198242 0.792969 +v 1.703125 0.242676 0.769531 +v 1.296875 0.242676 0.769531 +v 1.254395 0.198242 0.792969 +v 1.745605 0.289551 0.792969 +v 1.746582 0.350586 0.767090 +v 1.675781 0.315430 0.737793 +v 1.324219 0.315430 0.737793 +v 1.253418 0.350586 0.767090 +v 1.254395 0.289551 0.792969 +v 1.692383 0.401367 0.692383 +v 1.617188 0.339844 0.652344 +v 1.382812 0.339844 0.652344 +v 1.307617 0.401367 0.692383 +v 1.778809 0.418945 0.725586 +v 1.851562 0.466797 0.666992 +v 1.753906 0.476562 0.632812 +v 1.246094 0.476562 0.632812 +v 1.148438 0.466797 0.666992 +v 1.221191 0.418945 0.725586 +v 1.807617 0.354980 0.784668 +v 1.852051 0.394531 0.749512 +v 1.147949 0.394531 0.749512 +v 1.192383 0.354980 0.784668 +v 1.898926 0.354980 0.767090 +v 1.959961 0.350586 0.728027 +v 1.924805 0.418945 0.698730 +v 1.075195 0.418945 0.698730 +v 1.040039 0.350586 0.728027 +v 1.101074 0.354980 0.767090 +v 2.010742 0.401367 0.635254 +v 1.949219 0.476562 0.597656 +v 1.050781 0.476562 0.597656 +v 0.989258 0.401367 0.635254 +v 2.028320 0.315430 0.676270 +v 2.085938 0.339844 0.570312 +v 0.914062 0.339844 0.570312 +v 0.971680 0.315430 0.676270 +v 1.963867 0.289551 0.753418 +v 1.036133 0.289551 0.753418 +v 1.964844 0.243164 0.767578 +v 1.934082 0.325195 0.774902 +v 1.950846 0.284668 0.779622 +v 1.049154 0.284668 0.779622 +v 1.065918 0.325195 0.774902 +v 1.035156 0.243164 0.767578 +v 1.852539 0.358398 0.792480 +v 1.894043 0.344564 0.793457 +v 1.105957 0.344564 0.793457 +v 1.147461 0.358398 0.792480 +v 1.775391 0.325195 0.806641 +v 1.812663 0.344564 0.810872 +v 1.187337 0.344564 0.810872 +v 1.224609 0.325195 0.806641 +v 1.743164 0.243164 0.808594 +v 1.756348 0.284668 0.818034 +v 1.243652 0.284668 0.818034 +v 1.256836 0.243164 0.808594 +v 1.775391 0.166016 0.806641 +v 1.756348 0.203288 0.818034 +v 1.243652 0.203288 0.818034 +v 1.224609 0.166016 0.806641 +v 1.852539 0.133789 0.792480 +v 1.812663 0.146973 0.810872 +v 1.187337 0.146973 0.810872 +v 1.147461 0.133789 0.792480 +v 1.934082 0.166016 0.774902 +v 1.894043 0.146973 0.793457 +v 1.105957 0.146973 0.793457 +v 1.065918 0.166016 0.774902 +v 1.950846 0.203288 0.779622 +v 1.049154 0.203288 0.779622 +v 1.919271 0.242839 0.797526 +v 1.901042 0.195964 0.802083 +v 1.080729 0.242839 0.797526 +v 1.098958 0.195964 0.802083 +v 1.852214 0.175781 0.813802 +v 1.147786 0.175781 0.813802 +v 1.805339 0.195964 0.822266 +v 1.194661 0.195964 0.822266 +v 1.785156 0.242839 0.823568 +v 1.214844 0.242839 0.823568 +v 1.805339 0.292318 0.822266 +v 1.194661 0.292318 0.822266 +v 1.852214 0.313151 0.813802 +v 1.147786 0.313151 0.813802 +v 1.901042 0.292318 0.802083 +v 1.098958 0.292318 0.802083 +v 1.587891 -0.969727 0.560547 +v 1.664062 -0.948730 0.593750 +v 1.576660 -0.936035 0.634766 +v 1.500000 -0.960938 0.605469 +v 1.423340 -0.936035 0.634766 +v 1.335938 -0.948730 0.593750 +v 1.412109 -0.969727 0.560547 +v 1.746094 -0.949219 0.535645 +v 1.771973 -0.922852 0.582520 +v 1.692383 -0.918457 0.629883 +v 1.307617 -0.918457 0.629883 +v 1.228027 -0.922852 0.582520 +v 1.253906 -0.949219 0.535645 +v 1.830566 -0.898438 0.525391 +v 1.810059 -0.845215 0.599121 +v 1.745117 -0.862305 0.642578 +v 1.254883 -0.862305 0.642578 +v 1.189941 -0.845215 0.599121 +v 1.169434 -0.898438 0.525391 +v 1.835449 -0.765625 0.545898 +v 1.797852 -0.686523 0.626465 +v 1.752441 -0.758301 0.667480 +v 1.247559 -0.758301 0.667480 +v 1.202148 -0.686523 0.626465 +v 1.164551 -0.765625 0.545898 +v 1.808105 -0.549805 0.564941 +v 1.761230 -0.457520 0.638184 +v 1.726562 -0.572266 0.688477 +v 1.273438 -0.572266 0.688477 +v 1.238770 -0.457520 0.638184 +v 1.191895 -0.549805 0.564941 +v 1.700195 -0.150879 0.669922 +v 1.812988 -0.148926 0.563477 +v 1.912109 -0.087402 0.609863 +v 1.772461 -0.069336 0.715332 +v 1.227539 -0.069336 0.715332 +v 1.087891 -0.087402 0.609863 +v 1.187012 -0.148926 0.563477 +v 1.299805 -0.150879 0.669922 +v 2.029785 -0.072754 0.537598 +v 2.118164 0.016113 0.577148 +v 2.001953 -0.003418 0.639160 +v 0.998047 -0.003418 0.639160 +v 0.881836 0.016113 0.577148 +v 0.970215 -0.072754 0.537598 +v 2.217773 0.067383 0.495117 +v 2.261230 0.183105 0.543457 +v 2.165039 0.119141 0.604004 +v 0.834961 0.119141 0.604004 +v 0.738770 0.183105 0.543457 +v 0.782227 0.067383 0.495117 +v 2.322754 0.288574 0.520508 +v 2.285156 0.379883 0.618652 +v 2.235352 0.283203 0.617676 +v 0.764648 0.283203 0.617676 +v 0.714844 0.379883 0.618652 +v 0.677246 0.288574 0.520508 +v 2.270508 0.445801 0.603027 +v 2.182617 0.458984 0.677734 +v 2.211914 0.395020 0.676758 +v 0.788086 0.395020 0.676758 +v 0.817383 0.458984 0.677734 +v 0.729492 0.445801 0.603027 +v 2.094238 0.530273 0.652832 +v 1.975586 0.574219 0.739258 +v 2.061523 0.479004 0.739746 +v 0.938477 0.479004 0.739746 +v 1.024414 0.574219 0.739258 +v 0.905762 0.530273 0.652832 +v 1.902832 0.661621 0.707031 +v 1.817871 0.679688 0.782227 +v 1.879395 0.587402 0.792480 +v 1.120605 0.587402 0.792480 +v 1.182129 0.679688 0.782227 +v 1.097168 0.661621 0.707031 +v 1.744141 0.716797 0.740723 +v 1.684570 0.645996 0.801270 +v 1.759277 0.623047 0.819824 +v 1.240723 0.623047 0.819824 +v 1.315430 0.645996 0.801270 +v 1.255859 0.716797 0.740723 +v 1.620117 0.589844 0.748047 +v 1.583984 0.478027 0.795898 +v 1.653809 0.523438 0.825684 +v 1.346191 0.523438 0.825684 +v 1.416016 0.478027 0.795898 +v 1.379883 0.589844 0.748047 +v 1.536621 0.448730 0.739258 +v 1.500000 0.408203 0.785156 +v 1.560059 0.395508 0.813477 +v 1.439941 0.395508 0.813477 +v 1.463379 0.448730 0.739258 +v 1.635742 0.425293 0.806152 +v 1.704590 0.446289 0.777344 +v 1.726562 0.529785 0.803223 +v 1.273438 0.529785 0.803223 +v 1.295410 0.446289 0.777344 +v 1.364258 0.425293 0.806152 +v 1.787109 0.486328 0.763672 +v 1.822754 0.548340 0.787109 +v 1.177246 0.548340 0.787109 +v 1.212891 0.486328 0.763672 +v 1.878418 0.468750 0.745605 +v 1.945801 0.488281 0.753906 +v 1.054199 0.488281 0.753906 +v 1.121582 0.468750 0.745605 +v 2.018555 0.411621 0.705566 +v 2.124023 0.399414 0.697754 +v 0.875977 0.399414 0.697754 +v 0.981445 0.411621 0.705566 +v 2.126953 0.341309 0.665039 +v 2.183594 0.325684 0.654297 +v 0.816406 0.325684 0.654297 +v 0.873047 0.341309 0.665039 +v 2.139160 0.248047 0.650391 +v 2.162598 0.195801 0.631348 +v 0.837402 0.195801 0.631348 +v 0.860840 0.248047 0.650391 +v 2.068848 0.128418 0.659180 +v 2.048828 0.066406 0.650391 +v 0.951172 0.066406 0.650391 +v 0.931152 0.128418 0.659180 +v 1.941895 0.040039 0.687988 +v 1.879883 -0.004883 0.693848 +v 1.120117 -0.004883 0.693848 +v 1.058105 0.040039 0.687988 +v 1.787109 0.042480 0.729980 +v 1.681641 0.006836 0.761230 +v 1.318359 0.006836 0.761230 +v 1.212891 0.042480 0.729980 +v 1.671387 0.101074 0.752930 +v 1.590332 0.096191 0.746094 +v 1.576172 -0.023926 0.763184 +v 1.423828 -0.023926 0.763184 +v 1.409668 0.096191 0.746094 +v 1.328613 0.101074 0.752930 +v 1.639160 0.360352 0.778809 +v 1.571777 0.325195 0.791016 +v 1.428223 0.325195 0.791016 +v 1.360840 0.360352 0.778809 +v 1.618652 0.260742 0.768066 +v 1.500000 0.275391 0.785156 +v 1.567871 0.210938 0.762695 +v 1.432129 0.210938 0.762695 +v 1.381348 0.260742 0.768066 +v 1.500000 0.140625 0.748047 +v 1.633789 0.171387 0.755859 +v 1.366211 0.171387 0.755859 +v 1.606934 -0.903809 0.665039 +v 1.536621 -0.891113 0.684082 +v 1.500000 -0.915039 0.664062 +v 1.463379 -0.891113 0.684082 +v 1.393066 -0.903809 0.665039 +v 1.669434 -0.865723 0.674316 +v 1.601074 -0.865234 0.693848 +v 1.398926 -0.865234 0.693848 +v 1.330566 -0.865723 0.674316 +v 1.685547 -0.773438 0.697266 +v 1.627930 -0.789062 0.712891 +v 1.372070 -0.789062 0.712891 +v 1.314453 -0.773438 0.697266 +v 1.647949 -0.458496 0.727539 +v 1.602051 -0.566895 0.736816 +v 1.679199 -0.673340 0.711914 +v 1.320801 -0.673340 0.711914 +v 1.397949 -0.566895 0.736816 +v 1.352051 -0.458496 0.727539 +v 1.617188 -0.712891 0.727051 +v 1.382812 -0.712891 0.727051 +v 1.585938 -0.371094 0.741699 +v 1.542969 -0.324219 0.748047 +v 1.500000 -0.381836 0.746094 +v 1.541992 -0.458008 0.747070 +v 1.458008 -0.458008 0.747070 +v 1.457031 -0.324219 0.748047 +v 1.414062 -0.371094 0.741699 +v 1.555664 -0.661133 0.736328 +v 1.500000 -0.563477 0.742188 +v 1.444336 -0.661133 0.736328 +v 1.500000 -0.717773 0.734375 +v 1.554199 -0.736816 0.732910 +v 1.445801 -0.736816 0.732910 +v 1.614746 -0.259277 0.747070 +v 1.621094 -0.222656 0.770508 +v 1.609863 -0.249512 0.787109 +v 1.583496 -0.279785 0.763184 +v 1.416504 -0.279785 0.763184 +v 1.390137 -0.249512 0.787109 +v 1.378906 -0.222656 0.770508 +v 1.385254 -0.259277 0.747070 +v 1.618164 -0.184570 0.753418 +v 1.597656 -0.150391 0.763184 +v 1.617676 -0.182129 0.787598 +v 1.382324 -0.182129 0.787598 +v 1.402344 -0.150391 0.763184 +v 1.381836 -0.184570 0.753418 +v 1.555176 -0.127930 0.750488 +v 1.527832 -0.141113 0.763184 +v 1.570801 -0.133789 0.780273 +v 1.429199 -0.133789 0.780273 +v 1.472168 -0.141113 0.763184 +v 1.444824 -0.127930 0.750488 +v 1.500000 -0.165039 0.756836 +v 1.500000 -0.176758 0.770508 +v 1.517578 -0.160156 0.787598 +v 1.482422 -0.160156 0.787598 +v 1.500000 -0.313477 0.761719 +v 1.545410 -0.294922 0.779297 +v 1.454590 -0.294922 0.779297 +v 1.500000 -0.293945 0.792969 +v 1.579590 -0.262695 0.795410 +v 1.541992 -0.266113 0.804688 +v 1.458008 -0.266113 0.804688 +v 1.420410 -0.262695 0.795410 +v 1.500000 -0.180664 0.808594 +v 1.532715 -0.175293 0.816406 +v 1.544922 -0.145020 0.798828 +v 1.455078 -0.145020 0.798828 +v 1.467285 -0.175293 0.816406 +v 1.568848 -0.157227 0.810547 +v 1.596680 -0.153809 0.798828 +v 1.403320 -0.153809 0.798828 +v 1.431152 -0.157227 0.810547 +v 1.594238 -0.187988 0.816406 +v 1.614258 -0.220703 0.808105 +v 1.385742 -0.220703 0.808105 +v 1.405762 -0.187988 0.816406 +v 1.584473 -0.240723 0.812988 +v 1.415527 -0.240723 0.812988 +v 1.554688 -0.213867 0.823242 +v 1.445312 -0.213867 0.823242 +v 1.500000 -0.244141 0.816406 +v 1.500000 -0.066406 0.745117 +v 1.603027 -0.128906 0.766113 +v 1.396973 -0.128906 0.766113 +v 1.639160 -0.229004 0.735840 +v 1.649902 -0.179688 0.734375 +v 1.350098 -0.179688 0.734375 +v 1.360840 -0.229004 0.735840 +v 1.635742 -0.310547 0.727539 +v 1.672852 -0.275391 0.695801 +v 1.327148 -0.275391 0.695801 +v 1.364258 -0.310547 0.727539 +v 1.692383 -0.376953 0.696777 +v 1.307617 -0.376953 0.696777 +v 1.766602 -0.368164 0.562988 +v 1.721680 -0.320312 0.633789 +v 1.278320 -0.320312 0.633789 +v 1.233398 -0.368164 0.562988 +v 1.732910 -0.277344 0.561035 +v 1.697266 -0.241699 0.639648 +v 1.302734 -0.241699 0.639648 +v 1.267090 -0.277344 0.561035 +v 1.708008 -0.210449 0.574707 +v 1.291992 -0.210449 0.574707 +v 1.589355 -0.747559 0.727539 +v 1.500000 -0.759766 0.727539 +v 1.547852 -0.756836 0.716309 +v 1.452148 -0.756836 0.716309 +v 1.410645 -0.747559 0.727539 +v 1.598633 -0.821777 0.710938 +v 1.596191 -0.780762 0.710938 +v 1.403809 -0.780762 0.710938 +v 1.401367 -0.821777 0.710938 +v 1.554199 -0.870117 0.693359 +v 1.572754 -0.844238 0.691895 +v 1.427246 -0.844238 0.691895 +v 1.445801 -0.870117 0.693359 +v 1.500000 -0.880859 0.688477 +v 1.524414 -0.871094 0.681152 +v 1.475586 -0.871094 0.681152 +v 1.500000 -0.865234 0.660156 +v 1.546875 -0.854980 0.662109 +v 1.526367 -0.846191 0.643066 +v 1.473633 -0.846191 0.643066 +v 1.453125 -0.854980 0.662109 +v 1.587891 -0.812988 0.676270 +v 1.572266 -0.826660 0.646810 +v 1.427734 -0.826660 0.646810 +v 1.412109 -0.812988 0.676270 +v 1.582031 -0.758789 0.691895 +v 1.589844 -0.787109 0.659017 +v 1.410156 -0.787109 0.659017 +v 1.417969 -0.758789 0.691895 +v 1.500000 -0.769531 0.689453 +v 1.543945 -0.775879 0.664551 +v 1.456055 -0.775879 0.664551 +v 1.500000 -0.815430 0.645508 +v 1.563477 -0.804199 0.647298 +v 1.436523 -0.804199 0.647298 +v 1.655273 0.217285 0.769043 +v 1.677734 0.150879 0.762695 +v 1.678223 0.187500 0.770996 +v 1.321777 0.187500 0.770996 +v 1.322266 0.150879 0.762695 +v 1.344727 0.217285 0.769043 +v 1.656738 0.301758 0.773438 +v 1.672363 0.258301 0.775391 +v 1.327637 0.258301 0.775391 +v 1.343262 0.301758 0.773438 +v 1.692383 0.389160 0.775391 +v 1.691406 0.337891 0.776855 +v 1.308594 0.337891 0.776855 +v 1.307617 0.389160 0.775391 +v 1.729980 0.099609 0.756836 +v 1.706055 0.132812 0.770508 +v 1.293945 0.132812 0.770508 +v 1.270020 0.099609 0.756836 +v 1.868652 0.052246 0.724121 +v 1.800293 0.084473 0.754395 +v 1.199707 0.084473 0.754395 +v 1.131348 0.052246 0.724121 +v 1.985352 0.090332 0.694824 +v 1.925781 0.079102 0.723145 +v 1.074219 0.079102 0.723145 +v 1.014648 0.090332 0.694824 +v 2.088379 0.190430 0.668457 +v 2.028320 0.147461 0.692871 +v 0.971680 0.147461 0.692871 +v 0.911621 0.190430 0.668457 +v 2.107910 0.289062 0.668945 +v 2.084473 0.242676 0.677734 +v 0.915527 0.242676 0.677734 +v 0.892090 0.289062 0.668945 +v 2.066406 0.361328 0.686523 +v 2.076172 0.320801 0.685059 +v 0.923828 0.320801 0.685059 +v 0.933594 0.361328 0.686523 +v 1.933594 0.415527 0.738281 +v 1.992676 0.377441 0.726562 +v 1.007324 0.377441 0.726562 +v 1.066406 0.415527 0.738281 +v 1.834961 0.447754 0.751465 +v 1.878418 0.417480 0.759277 +v 1.121582 0.417480 0.759277 +v 1.165039 0.447754 0.751465 +v 1.761230 0.439941 0.765137 +v 1.803223 0.428711 0.762695 +v 1.196777 0.428711 0.762695 +v 1.238770 0.439941 0.765137 +v 1.739746 0.401367 0.773926 +v 1.260254 0.401367 0.773926 +v 1.777832 0.405762 0.767578 +v 1.725098 0.363770 0.769531 +v 1.757812 0.378906 0.761719 +v 1.242188 0.378906 0.761719 +v 1.274902 0.363770 0.769531 +v 1.222168 0.405762 0.767578 +v 1.838867 0.414062 0.756836 +v 1.808594 0.402344 0.757812 +v 1.191406 0.402344 0.757812 +v 1.161133 0.414062 0.756836 +v 1.923828 0.391113 0.751465 +v 1.875000 0.398438 0.750000 +v 1.125000 0.398438 0.750000 +v 1.076172 0.391113 0.751465 +v 2.033691 0.342773 0.695801 +v 1.972656 0.363281 0.714844 +v 1.027344 0.363281 0.714844 +v 0.966309 0.342773 0.695801 +v 2.066406 0.282227 0.680176 +v 2.042969 0.308594 0.675781 +v 0.957031 0.308594 0.675781 +v 0.933594 0.282227 0.680176 +v 2.051758 0.201660 0.680664 +v 2.050781 0.246094 0.671875 +v 0.949219 0.246094 0.671875 +v 0.948242 0.201660 0.680664 +v 1.968750 0.116699 0.709473 +v 2.003906 0.164062 0.687500 +v 0.996094 0.164062 0.687500 +v 1.031250 0.116699 0.709473 +v 1.869141 0.083984 0.735840 +v 1.917969 0.101562 0.714844 +v 1.082031 0.101562 0.714844 +v 1.130859 0.083984 0.735840 +v 1.747070 0.117676 0.764160 +v 1.808594 0.105469 0.742188 +v 1.191406 0.105469 0.742188 +v 1.252930 0.117676 0.764160 +v 1.698730 0.165527 0.763184 +v 1.722656 0.148438 0.753906 +v 1.277344 0.148438 0.753906 +v 1.301270 0.165527 0.763184 +v 1.691406 0.296387 0.769043 +v 1.714844 0.328125 0.757812 +v 1.285156 0.328125 0.757812 +v 1.308594 0.296387 0.769043 +v 1.685547 0.224609 0.765625 +v 1.695312 0.261719 0.753906 +v 1.304688 0.261719 0.753906 +v 1.314453 0.224609 0.765625 +v 1.699219 0.199219 0.750000 +v 1.300781 0.199219 0.750000 +v 1.500000 0.432617 0.673828 +v 1.586426 0.496094 0.679688 +v 1.547201 0.448405 0.620117 +v 1.452799 0.448405 0.620117 +v 1.413574 0.496094 0.679688 +v 1.683594 0.668457 0.683594 +v 1.679199 0.575195 0.625977 +v 1.320801 0.575195 0.625977 +v 1.316406 0.668457 0.683594 +v 1.829102 0.700684 0.661621 +v 1.766113 0.662598 0.620117 +v 1.233887 0.662598 0.620117 +v 1.170898 0.700684 0.661621 +v 1.994141 0.582520 0.618652 +v 1.877441 0.621094 0.596191 +v 1.122559 0.621094 0.596191 +v 1.005859 0.582520 0.618652 +v 2.186035 0.476074 0.562500 +v 2.080078 0.506836 0.519043 +v 0.919922 0.506836 0.519043 +v 0.813965 0.476074 0.562500 +v 2.308105 0.391602 0.516602 +v 2.236816 0.433105 0.472168 +v 0.763184 0.433105 0.472168 +v 0.691895 0.391602 0.516602 +v 2.281250 0.166992 0.433105 +v 2.292969 0.290039 0.402832 +v 0.707031 0.290039 0.402832 +v 0.718750 0.166992 0.433105 +v 2.117676 -0.009766 0.471191 +v 2.206055 0.080078 0.365234 +v 0.793945 0.080078 0.365234 +v 0.882324 -0.009766 0.471191 +v 1.930664 -0.112793 0.500977 +v 2.027832 -0.060059 0.411621 +v 0.972168 -0.060059 0.411621 +v 1.069336 -0.112793 0.500977 +v 1.566895 -0.569824 0.333008 +v 1.500000 -0.514648 0.302734 +v 1.588379 -0.459473 0.266602 +v 1.644531 -0.476562 0.318848 +v 1.355469 -0.476562 0.318848 +v 1.411621 -0.459473 0.266602 +v 1.433105 -0.569824 0.333008 +v 1.570801 -0.775391 0.365234 +v 1.500000 -0.677734 0.339844 +v 1.633301 -0.647949 0.362305 +v 1.366699 -0.647949 0.362305 +v 1.429199 -0.775391 0.365234 +v 1.581543 -0.940430 0.452148 +v 1.500000 -0.880859 0.402344 +v 1.652832 -0.851562 0.400879 +v 1.347168 -0.851562 0.400879 +v 1.418457 -0.940430 0.452148 +v 1.669922 -0.956543 0.494629 +v 1.500000 -0.974609 0.513672 +v 1.330078 -0.956543 0.494629 +v 1.808594 -0.916992 0.464844 +v 1.743164 -0.908691 0.427734 +v 1.256836 -0.908691 0.427734 +v 1.191406 -0.916992 0.464844 +v 1.824707 -0.791504 0.460449 +v 1.793945 -0.830566 0.409180 +v 1.206055 -0.830566 0.409180 +v 1.175293 -0.791504 0.460449 +v 1.800781 -0.597656 0.478516 +v 1.763672 -0.634277 0.404297 +v 1.236328 -0.634277 0.404297 +v 1.199219 -0.597656 0.478516 +v 1.715332 -0.731934 0.380371 +v 1.693359 -0.529297 0.369629 +v 1.306641 -0.529297 0.369629 +v 1.284668 -0.731934 0.380371 +v 1.705566 -0.394043 0.333008 +v 1.742188 -0.449707 0.408691 +v 1.257812 -0.449707 0.408691 +v 1.294434 -0.394043 0.333008 +v 1.772461 -0.407715 0.487793 +v 1.227539 -0.407715 0.487793 +v 1.740723 -0.301758 0.494141 +v 1.744629 -0.242188 0.444824 +v 1.722168 -0.238281 0.511719 +v 1.277832 -0.238281 0.511719 +v 1.255371 -0.242188 0.444824 +v 1.259277 -0.301758 0.494141 +v 1.729980 -0.334473 0.410156 +v 1.270020 -0.334473 0.410156 +v 1.734863 -0.179199 0.524902 +v 1.727702 -0.192871 0.492350 +v 1.272298 -0.192871 0.492350 +v 1.265137 -0.179199 0.524902 +v 1.811198 -0.144531 0.490885 +v 1.188802 -0.144531 0.490885 +v 1.500000 -0.058594 -0.712891 +v 1.676270 0.087891 -0.732422 +v 1.809408 -0.042969 -0.615560 +v 1.668457 -0.164551 -0.585938 +v 1.331543 -0.164551 -0.585938 +v 1.190592 -0.042969 -0.615560 +v 1.323730 0.087891 -0.732422 +v 1.500000 -0.274414 -0.484375 +v 1.797363 -0.219727 -0.413086 +v 1.645996 -0.335449 -0.285156 +v 1.354004 -0.335449 -0.285156 +v 1.202637 -0.219727 -0.413086 +v 1.500000 -0.404297 -0.074219 +v 1.742676 -0.339355 -0.052246 +v 1.608887 -0.418945 0.126953 +v 1.391113 -0.418945 0.126953 +v 1.257324 -0.339355 -0.052246 +v 1.500000 -0.455078 0.228516 +v 1.674805 -0.400391 0.239746 +v 1.325195 -0.400391 0.239746 +v 1.729818 -0.328125 0.288900 +v 1.270182 -0.328125 0.288900 +v 2.288086 0.197266 0.241211 +v 2.155273 -0.009277 0.247070 +v 2.279785 0.100586 0.088867 +v 0.720215 0.100586 0.088867 +v 0.844727 -0.009277 0.247070 +v 0.711914 0.197266 0.241211 +v 1.500000 0.298828 -0.800781 +v 1.722168 0.493164 -0.734375 +v 1.867676 0.246094 -0.688477 +v 1.132324 0.246094 -0.688477 +v 1.277832 0.493164 -0.734375 +v 1.500000 0.928711 0.099609 +v 1.727051 0.844238 0.249512 +v 1.919922 0.876465 0.065918 +v 1.726562 0.937500 -0.081055 +v 1.273438 0.937500 -0.081055 +v 1.080078 0.876465 0.065918 +v 1.272949 0.844238 0.249512 +v 1.500000 0.930664 -0.291016 +v 1.919922 0.880859 -0.249023 +v 1.727051 0.844238 -0.455078 +v 1.272949 0.844238 -0.455078 +v 1.080078 0.880859 -0.249023 +v 1.500000 0.710938 -0.660156 +v 1.921387 0.643555 -0.559082 +v 1.078613 0.643555 -0.559082 +v 2.146484 0.458008 0.401367 +v 2.254883 0.386230 0.374023 +v 2.191895 0.455078 0.302246 +v 0.808105 0.455078 0.302246 +v 0.745117 0.386230 0.374023 +v 0.853516 0.458008 0.401367 +v 2.129883 0.580078 0.196289 +v 2.257812 0.470215 0.194336 +v 2.213867 0.613770 0.086426 +v 0.786133 0.613770 0.086426 +v 0.742188 0.470215 0.194336 +v 0.870117 0.580078 0.196289 +v 2.136719 0.729980 -0.041992 +v 2.282715 0.573730 -0.021484 +v 2.218750 0.667969 -0.156250 +v 0.781250 0.667969 -0.156250 +v 0.717285 0.573730 -0.021484 +v 0.863281 0.729980 -0.041992 +v 2.136719 0.720703 -0.298340 +v 2.277344 0.560059 -0.258789 +v 2.215820 0.579590 -0.385254 +v 0.784180 0.579590 -0.385254 +v 0.722656 0.560059 -0.258789 +v 0.863281 0.720703 -0.298340 +v 2.268555 0.423828 -0.383301 +v 2.181641 0.299805 -0.495117 +v 2.126953 0.509766 -0.504395 +v 0.873047 0.509766 -0.504395 +v 0.818359 0.299805 -0.495117 +v 0.731445 0.423828 -0.383301 +v 2.023926 0.388672 -0.610840 +v 2.045898 0.732910 -0.407715 +v 0.954102 0.732910 -0.407715 +v 0.976074 0.388672 -0.610840 +v 2.046875 0.823730 -0.133301 +v 0.953125 0.823730 -0.133301 +v 2.046875 0.749023 0.136230 +v 0.953125 0.749023 0.136230 +v 1.922363 0.679688 0.323730 +v 2.051270 0.526367 0.350098 +v 0.948730 0.526367 0.350098 +v 1.077637 0.679688 0.323730 +v 1.943359 0.525391 0.491211 +v 1.056641 0.525391 0.491211 +v 1.500000 0.722656 0.405273 +v 1.738281 0.583008 0.480469 +v 1.261719 0.583008 0.480469 +v 1.784668 0.533691 0.574707 +v 1.215332 0.533691 0.574707 +v 1.602376 0.509440 0.578613 +v 1.397624 0.509440 0.578613 +v 1.500000 0.483724 0.589844 +v 2.293457 0.331055 0.203613 +v 0.706543 0.331055 0.203613 +v 2.328125 0.265625 0.031738 +v 2.320801 0.430176 0.033691 +v 0.679199 0.430176 0.033691 +v 0.671875 0.265625 0.031738 +v 2.332031 0.347656 -0.119629 +v 2.308105 0.459961 -0.165039 +v 0.691895 0.459961 -0.165039 +v 0.667969 0.347656 -0.119629 +v 2.306641 0.344238 -0.308594 +v 0.693359 0.344238 -0.308594 +v 1.807943 -0.277832 0.129720 +v 1.862793 -0.233398 -0.227051 +v 1.928223 -0.192383 -0.035645 +v 1.071777 -0.192383 -0.035645 +v 1.137207 -0.233398 -0.227051 +v 1.192057 -0.277832 0.129720 +v 2.140625 -0.088867 -0.054199 +v 2.056641 -0.107910 0.113770 +v 2.025391 -0.132812 -0.187988 +v 0.974609 -0.132812 -0.187988 +v 0.943359 -0.107910 0.113770 +v 0.859375 -0.088867 -0.054199 +v 1.926758 -0.134277 0.317871 +v 1.073242 -0.134277 0.317871 +v 1.812663 -0.169434 0.448893 +v 1.805501 -0.231934 0.301107 +v 1.194499 -0.231934 0.301107 +v 1.187337 -0.169434 0.448893 +v 2.202148 0.134766 -0.440430 +v 2.072754 0.022949 -0.453613 +v 2.051270 0.178711 -0.564453 +v 0.948730 0.178711 -0.564453 +v 0.927246 0.022949 -0.453613 +v 0.797852 0.134766 -0.440430 +v 1.920736 0.066406 -0.604818 +v 1.079264 0.066406 -0.604818 +v 2.117676 -0.077148 -0.298340 +v 1.959961 -0.101562 -0.371582 +v 1.040039 -0.101562 -0.371582 +v 0.882324 -0.077148 -0.298340 +v 1.901204 -0.076660 -0.514974 +v 1.098796 -0.076660 -0.514974 +v 2.529297 0.440918 -0.304688 +v 2.456543 0.430664 -0.291016 +v 2.411133 0.381348 -0.233398 +v 2.469238 0.385742 -0.265137 +v 0.530762 0.385742 -0.265137 +v 0.588867 0.381348 -0.233398 +v 0.543457 0.430664 -0.291016 +v 0.470703 0.440918 -0.304688 +v 2.626465 0.479004 -0.382324 +v 2.604492 0.424805 -0.350586 +v 2.699219 0.448242 -0.394043 +v 0.300781 0.448242 -0.394043 +v 0.395508 0.424805 -0.350586 +v 0.373535 0.479004 -0.382324 +v 2.786621 0.403809 -0.431641 +v 2.731934 0.362305 -0.406738 +v 2.788574 0.295898 -0.413574 +v 0.211426 0.295898 -0.413574 +v 0.268066 0.362305 -0.406738 +v 0.213379 0.403809 -0.431641 +v 2.809570 0.185547 -0.434570 +v 2.744629 0.182617 -0.413574 +v 2.727539 0.079102 -0.404785 +v 0.272461 0.079102 -0.404785 +v 0.255371 0.182617 -0.413574 +v 0.190430 0.185547 -0.434570 +v 2.657227 -0.017090 -0.392578 +v 2.625000 0.017578 -0.364746 +v 2.532227 -0.057617 -0.305664 +v 0.467773 -0.057617 -0.305664 +v 0.375000 0.017578 -0.364746 +v 0.342773 -0.017090 -0.392578 +v 2.410156 -0.110840 -0.248535 +v 2.430664 -0.057617 -0.228516 +v 2.312012 -0.097168 -0.157227 +v 0.687988 -0.097168 -0.157227 +v 0.569336 -0.057617 -0.228516 +v 0.589844 -0.110840 -0.248535 +v 2.533203 -0.009766 -0.326660 +v 2.457520 -0.016602 -0.287109 +v 2.366699 -0.040039 -0.198730 +v 0.633301 -0.040039 -0.198730 +v 0.542480 -0.016602 -0.287109 +v 0.466797 -0.009766 -0.326660 +v 2.685059 0.095703 -0.414551 +v 2.616211 0.042969 -0.405762 +v 0.383789 0.042969 -0.405762 +v 0.314941 0.095703 -0.414551 +v 2.734863 0.262695 -0.424316 +v 2.717285 0.172363 -0.445801 +v 0.282715 0.172363 -0.445801 +v 0.265137 0.262695 -0.424316 +v 2.668457 0.379883 -0.404297 +v 2.708496 0.310547 -0.441895 +v 0.291504 0.310547 -0.441895 +v 0.331543 0.379883 -0.404297 +v 2.528809 0.375488 -0.326660 +v 2.600098 0.358887 -0.397461 +v 0.399902 0.358887 -0.397461 +v 0.471191 0.375488 -0.326660 +v 2.436035 0.329590 -0.260742 +v 2.483887 0.330078 -0.322266 +v 0.516113 0.330078 -0.322266 +v 0.563965 0.329590 -0.260742 +v 2.236816 0.007812 -0.020508 +v 2.183594 -0.071777 -0.142090 +v 2.215007 -0.016764 -0.117350 +v 0.784993 -0.016764 -0.117350 +v 0.816406 -0.071777 -0.142090 +v 0.763184 0.007812 -0.020508 +v 2.198730 -0.113770 -0.174805 +v 2.271484 -0.054199 -0.162598 +v 0.728516 -0.054199 -0.162598 +v 0.801270 -0.113770 -0.174805 +v 2.288574 0.146973 -0.061035 +v 0.711426 0.146973 -0.061035 +v 2.354004 0.356445 -0.242188 +v 2.340820 0.312012 -0.199707 +v 2.383789 0.323242 -0.223145 +v 0.616211 0.323242 -0.223145 +v 0.659180 0.312012 -0.199707 +v 0.645996 0.356445 -0.242188 +v 2.338379 -0.022461 -0.237305 +v 2.278809 -0.017090 -0.217285 +v 0.721191 -0.017090 -0.217285 +v 0.661621 -0.022461 -0.237305 +v 2.314941 0.000977 -0.267578 +v 2.280273 0.029297 -0.234863 +v 2.233073 0.006185 -0.182292 +v 0.766927 0.006185 -0.182292 +v 0.719727 0.029297 -0.234863 +v 0.685059 0.000977 -0.267578 +v 2.289062 0.081543 -0.273926 +v 2.259766 0.079590 -0.237305 +v 2.321289 0.052246 -0.273926 +v 0.678711 0.052246 -0.273926 +v 0.740234 0.079590 -0.237305 +v 0.710938 0.081543 -0.273926 +v 2.292969 0.131348 -0.270020 +v 2.312988 0.182129 -0.240234 +v 2.267090 0.127441 -0.190918 +v 0.732910 0.127441 -0.190918 +v 0.687012 0.182129 -0.240234 +v 0.707031 0.131348 -0.270020 +v 2.369141 0.264160 -0.240723 +v 2.328125 0.250977 -0.207520 +v 2.358398 0.211426 -0.268555 +v 0.641602 0.211426 -0.268555 +v 0.671875 0.250977 -0.207520 +v 0.630859 0.264160 -0.240723 +v 2.414062 0.278320 -0.276367 +v 0.585938 0.278320 -0.276367 +v 2.315430 0.237305 -0.138672 +v 0.684570 0.237305 -0.138672 +v 2.235514 0.046224 -0.132487 +v 0.764486 0.046224 -0.132487 +v 2.452148 0.294434 -0.322266 +v 2.391602 0.237305 -0.296387 +v 2.429688 0.255859 -0.329102 +v 0.570312 0.255859 -0.329102 +v 0.608398 0.237305 -0.296387 +v 0.547852 0.294434 -0.322266 +v 2.336426 0.170410 -0.296387 +v 2.374023 0.195801 -0.316406 +v 0.625977 0.195801 -0.316406 +v 0.663574 0.170410 -0.296387 +v 2.279297 0.102051 -0.296875 +v 2.310547 0.127930 -0.314941 +v 0.689453 0.127930 -0.314941 +v 0.720703 0.102051 -0.296875 +v 2.319336 0.075195 -0.296875 +v 2.304688 0.093262 -0.314941 +v 0.695312 0.093262 -0.314941 +v 0.680664 0.075195 -0.296875 +v 2.340332 0.020020 -0.296875 +v 2.348145 0.052246 -0.315918 +v 0.651855 0.052246 -0.315918 +v 0.659668 0.020020 -0.296875 +v 2.325684 -0.012207 -0.289551 +v 2.341309 0.002930 -0.312012 +v 0.658691 0.002930 -0.312012 +v 0.674316 -0.012207 -0.289551 +v 2.394043 -0.016602 -0.265137 +v 2.353516 -0.009277 -0.291016 +v 0.646484 -0.009277 -0.291016 +v 0.605957 -0.016602 -0.265137 +v 2.539551 0.333008 -0.387207 +v 2.501465 0.303711 -0.372559 +v 0.498535 0.303711 -0.372559 +v 0.460449 0.333008 -0.387207 +v 2.669434 0.336426 -0.452637 +v 2.609049 0.332682 -0.437988 +v 0.390951 0.332682 -0.437988 +v 0.330566 0.336426 -0.452637 +v 2.731934 0.239746 -0.467285 +v 2.704590 0.288086 -0.470215 +v 0.295410 0.288086 -0.470215 +v 0.268066 0.239746 -0.467285 +v 2.685547 0.098145 -0.456543 +v 2.712402 0.169434 -0.470215 +v 0.287598 0.169434 -0.470215 +v 0.314453 0.098145 -0.456543 +v 2.542480 0.008789 -0.383789 +v 2.614258 0.057617 -0.437500 +v 0.385742 0.057617 -0.437500 +v 0.457520 0.008789 -0.383789 +v 2.464844 0.004395 -0.337891 +v 0.535156 0.004395 -0.337891 +v 2.356934 0.091797 -0.324219 +v 2.384277 0.039062 -0.323242 +v 2.413086 0.088867 -0.333984 +v 0.586914 0.088867 -0.333984 +v 0.615723 0.039062 -0.323242 +v 0.643066 0.091797 -0.324219 +v 2.423828 0.142578 -0.338867 +v 2.462891 0.086914 -0.349121 +v 2.479004 0.148438 -0.358398 +v 0.520996 0.148438 -0.358398 +v 0.537109 0.086914 -0.349121 +v 0.576172 0.142578 -0.338867 +v 2.484863 0.204590 -0.360840 +v 2.535156 0.147949 -0.383301 +v 2.536133 0.207031 -0.377930 +v 0.463867 0.207031 -0.377930 +v 0.464844 0.147949 -0.383301 +v 0.515137 0.204590 -0.360840 +v 2.547852 0.253906 -0.382812 +v 2.597168 0.201660 -0.398926 +v 2.605469 0.244629 -0.401367 +v 0.394531 0.244629 -0.401367 +v 0.402832 0.201660 -0.398926 +v 0.452148 0.253906 -0.382812 +v 2.563151 0.299479 -0.403809 +v 2.486816 0.259277 -0.361816 +v 0.513184 0.259277 -0.361816 +v 0.436849 0.299479 -0.403809 +v 2.425781 0.202637 -0.337402 +v 0.574219 0.202637 -0.337402 +v 2.365723 0.141602 -0.325195 +v 0.634277 0.141602 -0.325195 +v 2.414551 0.025391 -0.314941 +v 0.585449 0.025391 -0.314941 +v 2.522949 0.066895 -0.387695 +v 0.477051 0.066895 -0.387695 +v 2.625488 0.138672 -0.429688 +v 0.374512 0.138672 -0.429688 +v 2.671387 0.225586 -0.439941 +v 0.328613 0.225586 -0.439941 +v 2.634440 0.299967 -0.436035 +v 0.365560 0.299967 -0.436035 +v 2.539062 -0.080078 -0.395996 +v 2.292969 -0.119629 -0.258301 +v 2.416504 -0.042969 -0.390137 +v 0.583496 -0.042969 -0.390137 +v 0.707031 -0.119629 -0.258301 +v 0.460938 -0.080078 -0.395996 +v 2.772461 0.067871 -0.469238 +v 2.668945 0.041992 -0.495605 +v 0.331055 0.041992 -0.495605 +v 0.227539 0.067871 -0.469238 +v 2.836914 0.299316 -0.466309 +v 2.829427 0.201660 -0.506999 +v 0.170573 0.201660 -0.506999 +v 0.163086 0.299316 -0.466309 +v 2.729492 0.461914 -0.470703 +v 2.806966 0.359375 -0.511393 +v 0.193034 0.359375 -0.511393 +v 0.270508 0.461914 -0.470703 +v 2.532227 0.453125 -0.397949 +v 2.640625 0.399414 -0.496582 +v 0.359375 0.399414 -0.496582 +v 0.467773 0.453125 -0.397949 +v 2.383789 0.390137 -0.321289 +v 2.439941 0.349609 -0.410645 +v 0.560059 0.349609 -0.410645 +v 0.616211 0.390137 -0.321289 +v 2.536621 0.180664 -0.478027 +v 2.335449 0.134766 -0.381836 +v 0.664551 0.134766 -0.381836 +v 0.463379 0.180664 -0.478027 +v 2.757162 0.253906 -0.529460 +v 0.242839 0.253906 -0.529460 +v 2.308594 0.280762 -0.382324 +v 0.691406 0.280762 -0.382324 +v 2.223633 -0.025879 -0.353516 +v 0.776367 -0.025879 -0.353516 +v 1.992188 0.185547 0.720703 +v 1.007812 0.185547 0.720703 +v 2.058594 0.158203 0.625000 +v 0.941406 0.158203 0.625000 +v 1.937500 0.039062 0.650391 +v 1.062500 0.039062 0.650391 +v 1.910156 0.105469 0.738281 +v 1.089844 0.105469 0.738281 +v 1.794922 0.105469 0.759766 +v 1.205078 0.105469 0.759766 +v 1.765625 0.039062 0.681641 +v 1.234375 0.039062 0.681641 +v 1.644531 0.158203 0.697266 +v 1.355469 0.158203 0.697266 +v 1.714844 0.185547 0.769531 +v 1.285156 0.185547 0.769531 +v 1.714844 0.300781 0.769531 +v 1.285156 0.300781 0.769531 +v 1.644531 0.328125 0.697266 +v 1.355469 0.328125 0.697266 +v 1.765625 0.449219 0.681641 +v 1.234375 0.449219 0.681641 +v 1.794922 0.382812 0.759766 +v 1.205078 0.382812 0.759766 +v 1.910156 0.382812 0.738281 +v 1.089844 0.382812 0.738281 +v 1.937500 0.449219 0.650391 +v 1.062500 0.449219 0.650391 +v 2.058594 0.328125 0.625000 +v 0.941406 0.328125 0.625000 +v 1.992188 0.300781 0.720703 +v 1.007812 0.300781 0.720703 +v 1.957031 0.287109 0.769531 +v 1.042969 0.287109 0.769531 +v 1.896484 0.349609 0.783203 +v 1.103516 0.349609 0.783203 +v 1.810547 0.349609 0.800781 +v 1.189453 0.349609 0.800781 +v 1.751953 0.287109 0.808594 +v 1.248047 0.287109 0.808594 +v 1.751953 0.201172 0.808594 +v 1.248047 0.201172 0.808594 +v 1.810547 0.142578 0.800781 +v 1.189453 0.142578 0.800781 +v 1.896484 0.142578 0.783203 +v 1.103516 0.142578 0.783203 +v 1.957031 0.201172 0.769531 +v 1.042969 0.201172 0.769531 +v 1.924479 0.213542 0.794271 +v 1.075521 0.213542 0.794271 +v 1.882812 0.171875 0.804688 +v 1.117188 0.171875 0.804688 +v 1.822917 0.171875 0.817708 +v 1.177083 0.171875 0.817708 +v 1.781250 0.213542 0.822917 +v 1.218750 0.213542 0.822917 +v 1.781250 0.273438 0.822917 +v 1.218750 0.273438 0.822917 +v 1.822917 0.317708 0.817708 +v 1.177083 0.317708 0.817708 +v 1.882812 0.317708 0.804688 +v 1.117188 0.317708 0.804688 +v 1.924479 0.273438 0.794271 +v 1.075521 0.273438 0.794271 +v 1.585938 -0.957031 0.601562 +v 1.414062 -0.957031 0.601562 +v 1.726562 -0.939453 0.585938 +v 1.273438 -0.939453 0.585938 +v 1.798828 -0.892578 0.587891 +v 1.201172 -0.892578 0.587891 +v 1.808594 -0.777344 0.613281 +v 1.191406 -0.777344 0.613281 +v 1.781250 -0.570312 0.634766 +v 1.218750 -0.570312 0.634766 +v 1.791016 -0.119141 0.644531 +v 1.208984 -0.119141 0.644531 +v 2.021484 -0.042969 0.591797 +v 0.978516 -0.042969 0.591797 +v 2.201172 0.091797 0.552734 +v 0.798828 0.091797 0.552734 +v 2.289062 0.289062 0.574219 +v 0.710938 0.289062 0.574219 +v 2.250000 0.425781 0.650391 +v 0.750000 0.425781 0.650391 +v 2.082031 0.511719 0.708984 +v 0.917969 0.511719 0.708984 +v 1.890625 0.636719 0.763672 +v 1.109375 0.636719 0.763672 +v 1.748047 0.683594 0.794922 +v 1.251953 0.683594 0.794922 +v 1.630859 0.564453 0.800781 +v 1.369141 0.564453 0.800781 +v 1.541016 0.425781 0.789062 +v 1.458984 0.425781 0.789062 +v 1.679688 0.482422 0.806641 +v 1.320312 0.482422 0.806641 +v 1.773438 0.550781 0.796875 +v 1.226562 0.550781 0.796875 +v 1.876953 0.525391 0.773438 +v 1.123047 0.525391 0.773438 +v 2.039062 0.443359 0.726562 +v 0.960938 0.443359 0.726562 +v 2.167969 0.365234 0.673828 +v 0.832031 0.365234 0.673828 +v 2.183594 0.265625 0.638672 +v 0.816406 0.265625 0.638672 +v 2.115234 0.126953 0.636719 +v 0.884766 0.126953 0.636719 +v 1.970703 0.021484 0.667969 +v 1.029297 0.021484 0.667969 +v 1.775391 -0.009766 0.732422 +v 1.224609 -0.009766 0.732422 +v 1.623047 0.044922 0.757812 +v 1.376953 0.044922 0.757812 +v 1.597656 0.375000 0.800781 +v 1.402344 0.375000 0.800781 +v 1.564453 0.269531 0.777344 +v 1.435547 0.269531 0.777344 +v 1.574219 0.152344 0.750000 +v 1.425781 0.152344 0.750000 +v 1.556641 -0.912109 0.664062 +v 1.443359 -0.912109 0.664062 +v 1.644531 -0.890625 0.667969 +v 1.355469 -0.890625 0.667969 +v 1.681641 -0.822266 0.685547 +v 1.318359 -0.822266 0.685547 +v 1.664062 -0.570312 0.720703 +v 1.335938 -0.570312 0.720703 +v 1.685547 -0.732422 0.705078 +v 1.314453 -0.732422 0.705078 +v 1.541016 -0.376953 0.746094 +v 1.458984 -0.376953 0.746094 +v 1.548828 -0.564453 0.742188 +v 1.451172 -0.564453 0.742188 +v 1.556641 -0.712891 0.734375 +v 1.443359 -0.712891 0.734375 +v 1.609375 -0.253906 0.767578 +v 1.390625 -0.253906 0.767578 +v 1.617188 -0.183594 0.767578 +v 1.382812 -0.183594 0.767578 +v 1.562500 -0.136719 0.761719 +v 1.437500 -0.136719 0.761719 +v 1.509766 -0.162109 0.767578 +v 1.490234 -0.162109 0.767578 +v 1.544922 -0.302734 0.761719 +v 1.455078 -0.302734 0.761719 +v 1.542969 -0.283203 0.792969 +v 1.457031 -0.283203 0.792969 +v 1.521484 -0.166016 0.804688 +v 1.478516 -0.166016 0.804688 +v 1.572266 -0.140625 0.796875 +v 1.427734 -0.140625 0.796875 +v 1.611328 -0.185547 0.804688 +v 1.388672 -0.185547 0.804688 +v 1.603516 -0.244141 0.802734 +v 1.396484 -0.244141 0.802734 +v 1.562500 -0.183594 0.820312 +v 1.437500 -0.183594 0.820312 +v 1.546875 -0.242188 0.816406 +v 1.453125 -0.242188 0.816406 +v 1.556641 -0.085938 0.755859 +v 1.443359 -0.085938 0.755859 +v 1.628906 -0.179688 0.753906 +v 1.371094 -0.179688 0.753906 +v 1.638672 -0.267578 0.728516 +v 1.361328 -0.267578 0.728516 +v 1.638672 -0.373047 0.728516 +v 1.361328 -0.373047 0.728516 +v 1.740234 -0.376953 0.636719 +v 1.259766 -0.376953 0.636719 +v 1.708984 -0.279297 0.632812 +v 1.291016 -0.279297 0.632812 +v 1.681641 -0.195312 0.660156 +v 1.318359 -0.195312 0.660156 +v 1.550781 -0.750000 0.728516 +v 1.449219 -0.750000 0.728516 +v 1.603516 -0.779297 0.720703 +v 1.396484 -0.779297 0.720703 +v 1.580078 -0.851562 0.701172 +v 1.419922 -0.851562 0.701172 +v 1.527344 -0.878906 0.689453 +v 1.472656 -0.878906 0.689453 +v 1.523438 -0.863281 0.660156 +v 1.476562 -0.863281 0.660156 +v 1.570312 -0.837891 0.667969 +v 1.429688 -0.837891 0.667969 +v 1.593750 -0.781250 0.685547 +v 1.406250 -0.781250 0.685547 +v 1.546875 -0.761719 0.691406 +v 1.453125 -0.761719 0.691406 +v 1.535156 -0.810547 0.646484 +v 1.464844 -0.810547 0.646484 +v 1.578125 -0.804688 0.645833 +v 1.421875 -0.804688 0.645833 +v 1.664062 0.181641 0.765625 +v 1.335938 0.181641 0.765625 +v 1.652344 0.257812 0.771484 +v 1.347656 0.257812 0.771484 +v 1.669922 0.347656 0.775391 +v 1.330078 0.347656 0.775391 +v 1.695312 0.125000 0.761719 +v 1.304688 0.125000 0.761719 +v 1.794922 0.070312 0.742188 +v 1.205078 0.070312 0.742188 +v 1.929688 0.060547 0.708984 +v 1.070312 0.060547 0.708984 +v 2.042969 0.136719 0.679688 +v 0.957031 0.136719 0.679688 +v 2.107422 0.242188 0.666016 +v 0.892578 0.242188 0.666016 +v 2.097656 0.328125 0.673828 +v 0.902344 0.328125 0.673828 +v 2.003906 0.390625 0.712891 +v 0.996094 0.390625 0.712891 +v 1.878906 0.435547 0.748047 +v 1.121094 0.435547 0.748047 +v 1.796875 0.449219 0.757812 +v 1.203125 0.449219 0.757812 +v 1.724609 0.419922 0.771484 +v 1.275391 0.419922 0.771484 +v 1.750000 0.388672 0.769531 +v 1.250000 0.388672 0.769531 +v 1.806641 0.414062 0.761719 +v 1.193359 0.414062 0.761719 +v 1.876953 0.406250 0.757812 +v 1.123047 0.406250 0.757812 +v 1.982422 0.369141 0.724609 +v 1.017578 0.369141 0.724609 +v 2.058594 0.314453 0.683594 +v 0.941406 0.314453 0.683594 +v 2.066406 0.244141 0.677734 +v 0.933594 0.244141 0.677734 +v 2.015625 0.156250 0.693359 +v 0.984375 0.156250 0.693359 +v 1.921875 0.091797 0.722656 +v 1.078125 0.091797 0.722656 +v 1.804688 0.095703 0.751953 +v 1.195312 0.095703 0.751953 +v 1.714844 0.140625 0.765625 +v 1.285156 0.140625 0.765625 +v 1.705078 0.332031 0.769531 +v 1.294922 0.332031 0.769531 +v 1.685547 0.259766 0.767578 +v 1.314453 0.259766 0.767578 +v 1.689453 0.193359 0.763672 +v 1.310547 0.193359 0.763672 +v 1.542969 0.447266 0.675781 +v 1.457031 0.447266 0.675781 +v 1.630859 0.583984 0.683594 +v 1.369141 0.583984 0.683594 +v 1.751953 0.707031 0.675781 +v 1.248047 0.707031 0.675781 +v 1.908203 0.650391 0.642578 +v 1.091797 0.650391 0.642578 +v 2.091797 0.523438 0.589844 +v 0.908203 0.523438 0.589844 +v 2.261719 0.443359 0.542969 +v 0.738281 0.443359 0.542969 +v 2.314453 0.287109 0.468750 +v 0.685547 0.287109 0.468750 +v 2.208984 0.068359 0.443359 +v 0.791016 0.068359 0.443359 +v 2.027344 -0.068359 0.488281 +v 0.972656 -0.068359 0.488281 +v 1.576172 -0.501953 0.304688 +v 1.423828 -0.501953 0.304688 +v 1.566406 -0.667969 0.347656 +v 1.433594 -0.667969 0.347656 +v 1.576172 -0.871094 0.402344 +v 1.423828 -0.871094 0.402344 +v 1.585938 -0.968750 0.507812 +v 1.414062 -0.968750 0.507812 +v 1.750000 -0.943359 0.478516 +v 1.250000 -0.943359 0.478516 +v 1.828125 -0.865234 0.458984 +v 1.171875 -0.865234 0.458984 +v 1.814453 -0.699219 0.468750 +v 1.185547 -0.699219 0.468750 +v 1.701172 -0.626953 0.375000 +v 1.298828 -0.626953 0.375000 +v 1.730469 -0.832031 0.396484 +v 1.269531 -0.832031 0.396484 +v 1.697266 -0.451172 0.353516 +v 1.302734 -0.451172 0.353516 +v 1.787109 -0.496094 0.484375 +v 1.212891 -0.496094 0.484375 +v 1.730469 -0.267578 0.501953 +v 1.269531 -0.267578 0.501953 +v 1.755859 -0.345703 0.490234 +v 1.244141 -0.345703 0.490234 +v 1.712891 -0.208984 0.521484 +v 1.287109 -0.208984 0.521484 +v 1.820312 -0.148438 0.515625 +v 1.179688 -0.148438 0.515625 +v 1.669922 -0.054688 -0.675781 +v 1.330078 -0.054688 -0.675781 +v 1.660156 -0.259766 -0.457031 +v 1.339844 -0.259766 -0.457031 +v 1.626953 -0.386719 -0.066406 +v 1.373047 -0.386719 -0.066406 +v 1.597656 -0.437500 0.222656 +v 1.402344 -0.437500 0.222656 +v 1.710938 -0.359375 0.314453 +v 1.289062 -0.359375 0.314453 +v 2.240234 0.087891 0.228516 +v 0.759766 0.087891 0.228516 +v 1.699219 0.281250 -0.761719 +v 1.300781 0.281250 -0.761719 +v 1.726562 0.916016 0.093750 +v 1.273438 0.916016 0.093750 +v 1.726562 0.919922 -0.269531 +v 1.273438 0.919922 -0.269531 +v 1.728516 0.691406 -0.621094 +v 1.271484 0.691406 -0.621094 +v 2.208984 0.429688 0.392578 +v 0.791016 0.429688 0.392578 +v 2.199219 0.531250 0.199219 +v 0.800781 0.531250 0.199219 +v 2.218750 0.658203 -0.033203 +v 0.781250 0.658203 -0.033203 +v 2.218750 0.646484 -0.279297 +v 0.781250 0.646484 -0.279297 +v 2.207031 0.453125 -0.457031 +v 0.792969 0.453125 -0.457031 +v 2.042969 0.578125 -0.529297 +v 0.957031 0.578125 -0.529297 +v 2.046875 0.806641 -0.273438 +v 0.953125 0.806641 -0.273438 +v 2.046875 0.808594 0.005859 +v 0.953125 0.808594 0.005859 +v 2.046875 0.632812 0.250000 +v 0.953125 0.632812 0.250000 +v 2.064453 0.496094 0.439453 +v 0.935547 0.496094 0.439453 +v 1.728516 0.710938 0.380859 +v 1.271484 0.710938 0.380859 +v 1.781250 0.591797 0.593750 +v 1.218750 0.591797 0.593750 +v 1.763672 0.527344 0.541016 +v 1.236328 0.527344 0.541016 +v 1.536458 0.479167 0.593750 +v 1.463542 0.479167 0.593750 +v 2.287109 0.302734 0.306641 +v 0.712891 0.302734 0.306641 +v 2.308594 0.380859 0.117188 +v 0.691406 0.380859 0.117188 +v 2.318359 0.457031 -0.060547 +v 0.681641 0.457031 -0.060547 +v 2.296875 0.437500 -0.279297 +v 0.703125 0.437500 -0.279297 +v 1.835938 -0.267578 -0.041016 +v 1.164062 -0.267578 -0.041016 +v 2.041016 -0.134766 -0.039062 +v 0.958984 -0.134766 -0.039062 +v 2.044922 -0.078125 0.275391 +v 0.955078 -0.078125 0.275391 +v 1.818359 -0.193359 0.378906 +v 1.181641 -0.193359 0.378906 +v 1.778646 -0.281250 0.247396 +v 1.221354 -0.281250 0.247396 +v 1.783854 -0.164062 0.479167 +v 1.216146 -0.164062 0.479167 +v 2.128906 0.152344 -0.500000 +v 0.871094 0.152344 -0.500000 +v 1.974609 0.210938 -0.625000 +v 1.025391 0.210938 -0.625000 +v 2.037109 -0.076172 -0.337891 +v 0.962891 -0.076172 -0.337891 +v 1.888672 -0.158203 -0.390625 +v 1.111328 -0.158203 -0.390625 +v 1.888021 -0.023438 -0.583333 +v 1.111979 -0.023438 -0.583333 +v 2.462891 0.414062 -0.263672 +v 0.537109 0.414062 -0.263672 +v 2.615234 0.458984 -0.353516 +v 0.384766 0.458984 -0.353516 +v 2.759766 0.388672 -0.410156 +v 0.240234 0.388672 -0.410156 +v 2.777344 0.185547 -0.416016 +v 0.222656 0.185547 -0.416016 +v 2.640625 -0.001953 -0.367188 +v 0.359375 -0.001953 -0.367188 +v 2.417969 -0.087891 -0.222656 +v 0.582031 -0.087891 -0.222656 +v 2.445312 -0.033203 -0.253906 +v 0.554688 -0.033203 -0.253906 +v 2.617188 0.033203 -0.380859 +v 0.382812 0.033203 -0.380859 +v 2.724609 0.177734 -0.425781 +v 0.275391 0.177734 -0.425781 +v 2.714844 0.333984 -0.419922 +v 0.285156 0.333984 -0.419922 +v 2.599609 0.388672 -0.369141 +v 0.400391 0.388672 -0.369141 +v 2.476562 0.355469 -0.289062 +v 0.523438 0.355469 -0.289062 +v 2.193359 -0.048828 -0.083984 +v 0.806641 -0.048828 -0.083984 +v 2.228516 -0.089844 -0.148438 +v 0.771484 -0.089844 -0.148438 +v 2.292969 0.126953 0.001953 +v 0.707031 0.126953 0.001953 +v 2.369141 0.345703 -0.216797 +v 0.630859 0.345703 -0.216797 +v 2.310547 -0.033203 -0.197266 +v 0.689453 -0.033203 -0.197266 +v 2.273438 0.003906 -0.226562 +v 0.726562 0.003906 -0.226562 +v 2.285156 0.058594 -0.251953 +v 0.714844 0.058594 -0.251953 +v 2.277344 0.126953 -0.236328 +v 0.722656 0.126953 -0.236328 +v 2.341797 0.226562 -0.240234 +v 0.658203 0.226562 -0.240234 +v 2.400391 0.298828 -0.246094 +v 0.599609 0.298828 -0.246094 +v 2.330078 0.285156 -0.167969 +v 0.669922 0.285156 -0.167969 +v 2.275391 0.140625 -0.128906 +v 0.724609 0.140625 -0.128906 +v 2.221354 0.005208 -0.143229 +v 0.778646 0.005208 -0.143229 +v 2.419922 0.267578 -0.304688 +v 0.580078 0.267578 -0.304688 +v 2.365234 0.205078 -0.294922 +v 0.634766 0.205078 -0.294922 +v 2.300781 0.132812 -0.296875 +v 0.699219 0.132812 -0.296875 +v 2.292969 0.087891 -0.296875 +v 0.707031 0.087891 -0.296875 +v 2.335938 0.048828 -0.296875 +v 0.664062 0.048828 -0.296875 +v 2.330078 0.000000 -0.296875 +v 0.669922 0.000000 -0.296875 +v 2.347656 -0.017578 -0.267578 +v 0.652344 -0.017578 -0.267578 +v 2.490234 0.316406 -0.351562 +v 0.509766 0.316406 -0.351562 +v 2.605469 0.343750 -0.423828 +v 0.394531 0.343750 -0.423828 +v 2.712891 0.298828 -0.464844 +v 0.287109 0.298828 -0.464844 +v 2.722656 0.167969 -0.466797 +v 0.277344 0.167969 -0.466797 +v 2.621094 0.044922 -0.429688 +v 0.378906 0.044922 -0.429688 +v 2.462891 -0.009766 -0.316406 +v 0.537109 -0.009766 -0.316406 +v 2.376953 0.066406 -0.326172 +v 0.623047 0.066406 -0.326172 +v 2.447266 0.117188 -0.345703 +v 0.552734 0.117188 -0.345703 +v 2.507812 0.179688 -0.369141 +v 0.492188 0.179688 -0.369141 +v 2.566406 0.226562 -0.384766 +v 0.433594 0.226562 -0.384766 +v 2.523438 0.281250 -0.380859 +v 0.476562 0.281250 -0.380859 +v 2.455078 0.232422 -0.347656 +v 0.544922 0.232422 -0.347656 +v 2.396484 0.171875 -0.330078 +v 0.603516 0.171875 -0.330078 +v 2.332031 0.113281 -0.322266 +v 0.667969 0.113281 -0.322266 +v 2.371094 0.011719 -0.310547 +v 0.628906 0.011719 -0.310547 +v 2.466797 0.042969 -0.347656 +v 0.533203 0.042969 -0.347656 +v 2.578125 0.099609 -0.414062 +v 0.421875 0.099609 -0.414062 +v 2.658203 0.181641 -0.437500 +v 0.341797 0.181641 -0.437500 +v 2.660156 0.267578 -0.439453 +v 0.339844 0.267578 -0.439453 +v 2.604167 0.315104 -0.429688 +v 0.395833 0.315104 -0.429688 +v 2.410156 -0.113281 -0.318359 +v 0.589844 -0.113281 -0.318359 +v 2.667969 -0.019531 -0.445312 +v 0.332031 -0.019531 -0.445312 +v 2.828125 0.181641 -0.470703 +v 0.171875 0.181641 -0.470703 +v 2.800781 0.398438 -0.472656 +v 0.199219 0.398438 -0.472656 +v 2.632812 0.472656 -0.441406 +v 0.367188 0.472656 -0.441406 +v 2.449219 0.425781 -0.353516 +v 0.550781 0.425781 -0.353516 +v 2.427734 0.152344 -0.421875 +v 0.572266 0.152344 -0.421875 +v 2.656250 0.218750 -0.513672 +v 0.343750 0.218750 -0.513672 +v 2.809896 0.273438 -0.526042 +v 0.190104 0.273438 -0.526042 +v 2.335938 0.345703 -0.314453 +v 0.664062 0.345703 -0.314453 +v 2.265625 0.128906 -0.394531 +v 0.734375 0.128906 -0.394531 +v 2.199219 -0.099609 -0.261719 +v 0.800781 -0.099609 -0.261719 +vt 0.891692 0.588839 +vt 0.880961 0.586564 +vt 0.881557 0.574808 +vt 0.896488 0.577834 +vt 0.870121 0.588631 +vt 0.866440 0.577724 +vt 0.862025 0.562834 +vt 0.882667 0.558933 +vt 0.903005 0.563061 +vt 0.858288 0.847917 +vt 0.863360 0.833238 +vt 0.878333 0.836822 +vt 0.878737 0.852730 +vt 0.867521 0.822505 +vt 0.878258 0.825051 +vt 0.889080 0.823254 +vt 0.893383 0.834461 +vt 0.899238 0.849510 +vt 0.884459 0.541407 +vt 0.910227 0.547014 +vt 0.858169 0.545895 +vt 0.853018 0.521562 +vt 0.886592 0.523054 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.853685 0.864668 +vt 0.879749 0.870319 +vt 0.881065 0.888748 +vt 0.905740 0.865861 +vt 0.914672 0.888748 +vt 0.844401 0.574426 +vt 0.835120 0.560496 +vt 0.832125 0.591507 +vt 0.818536 0.582644 +vt 0.798481 0.569535 +vt 0.825750 0.545548 +vt 0.795104 0.838402 +vt 0.815721 0.826196 +vt 0.831306 0.849059 +vt 0.821281 0.863575 +vt 0.829690 0.817945 +vt 0.841196 0.835554 +vt 0.860653 0.594966 +vt 0.853501 0.586322 +vt 0.854032 0.604170 +vt 0.844549 0.598858 +vt 0.842429 0.811153 +vt 0.850816 0.824074 +vt 0.852138 0.806266 +vt 0.858344 0.815756 +vt 0.851729 0.614846 +vt 0.841395 0.613584 +vt 0.853473 0.625708 +vt 0.843729 0.628701 +vt 0.830502 0.632828 +vt 0.827527 0.611871 +vt 0.829903 0.776592 +vt 0.842933 0.781303 +vt 0.839931 0.796301 +vt 0.826001 0.797397 +vt 0.852535 0.784725 +vt 0.850311 0.795499 +vt 0.811643 0.609776 +vt 0.815003 0.637757 +vt 0.791018 0.645443 +vt 0.794749 0.607489 +vt 0.791018 0.762238 +vt 0.814639 0.770981 +vt 0.810039 0.798785 +vt 0.793061 0.800320 +vt 0.840944 0.651686 +vt 0.829182 0.662454 +vt 0.857367 0.664845 +vt 0.851481 0.679473 +vt 0.842358 0.702491 +vt 0.816688 0.673967 +vt 0.844839 0.707525 +vt 0.852931 0.730925 +vt 0.829899 0.746938 +vt 0.817928 0.734882 +vt 0.858163 0.745800 +vt 0.841172 0.758218 +vt 0.858989 0.635473 +vt 0.851242 0.642408 +vt 0.867665 0.642345 +vt 0.863079 0.652037 +vt 0.863300 0.758849 +vt 0.851048 0.767943 +vt 0.867452 0.768735 +vt 0.858480 0.775215 +vt 0.878887 0.644529 +vt 0.878385 0.654923 +vt 0.890382 0.642464 +vt 0.894097 0.651799 +vt 0.899630 0.664227 +vt 0.878286 0.668708 +vt 0.900356 0.748294 +vt 0.894278 0.760463 +vt 0.878719 0.756645 +vt 0.879233 0.742869 +vt 0.890152 0.769624 +vt 0.878760 0.767051 +vt 0.879203 0.684420 +vt 0.907091 0.678322 +vt 0.918898 0.699697 +vt 0.880628 0.701094 +vt 0.921180 0.713713 +vt 0.908436 0.734543 +vt 0.880846 0.727214 +vt 0.883009 0.710619 +vt 0.917327 0.652351 +vt 0.929888 0.662207 +vt 0.929409 0.635102 +vt 0.945192 0.639156 +vt 0.968392 0.645333 +vt 0.943645 0.672515 +vt 0.968213 0.770220 +vt 0.944761 0.775361 +vt 0.930496 0.751654 +vt 0.944697 0.741966 +vt 0.928814 0.778711 +vt 0.917509 0.760943 +vt 0.899876 0.636590 +vt 0.907155 0.643402 +vt 0.906348 0.627709 +vt 0.916089 0.631003 +vt 0.915325 0.782214 +vt 0.906950 0.769432 +vt 0.905448 0.785074 +vt 0.899376 0.775914 +vt 0.908777 0.616619 +vt 0.919430 0.615878 +vt 0.906995 0.605249 +vt 0.917062 0.600430 +vt 0.930714 0.593624 +vt 0.933908 0.614500 +vt 0.928276 0.820207 +vt 0.914940 0.812801 +vt 0.917991 0.797473 +vt 0.932394 0.799492 +vt 0.905097 0.807540 +vt 0.907382 0.796260 +vt 0.950598 0.612253 +vt 0.946105 0.585451 +vt 0.968392 0.573812 +vt 0.968392 0.609573 +vt 0.965038 0.841671 +vt 0.943289 0.829055 +vt 0.948967 0.802477 +vt 0.966626 0.805946 +vt 0.919717 0.575551 +vt 0.931712 0.562700 +vt 0.944279 0.549179 +vt 0.927900 0.851144 +vt 0.939855 0.865209 +vt 0.916488 0.837774 +vt 0.900835 0.595528 +vt 0.908869 0.587062 +vt 0.906161 0.825792 +vt 0.898511 0.816977 +vt 0.897284 0.599247 +vt 0.889634 0.593581 +vt 0.902360 0.607463 +vt 0.898689 0.609003 +vt 0.894921 0.601583 +vt 0.888110 0.597049 +vt 0.896965 0.803421 +vt 0.900564 0.805122 +vt 0.895129 0.813105 +vt 0.892872 0.810667 +vt 0.887235 0.818426 +vt 0.885867 0.814894 +vt 0.903563 0.616952 +vt 0.901305 0.626065 +vt 0.897259 0.624521 +vt 0.899888 0.617003 +vt 0.896226 0.787855 +vt 0.900336 0.786492 +vt 0.902188 0.795696 +vt 0.898518 0.795483 +vt 0.895995 0.633149 +vt 0.888373 0.637644 +vt 0.886679 0.633759 +vt 0.893156 0.630591 +vt 0.886066 0.778156 +vt 0.887931 0.774350 +vt 0.895346 0.779179 +vt 0.892396 0.781608 +vt 0.879183 0.638993 +vt 0.870175 0.637066 +vt 0.872102 0.632914 +vt 0.879329 0.635048 +vt 0.871465 0.778354 +vt 0.869725 0.774120 +vt 0.878810 0.772595 +vt 0.878780 0.776542 +vt 0.863101 0.631734 +vt 0.858526 0.624180 +vt 0.862476 0.622856 +vt 0.865988 0.629039 +vt 0.861403 0.787974 +vt 0.857515 0.786476 +vt 0.862421 0.779132 +vt 0.865186 0.781954 +vt 0.857013 0.615585 +vt 0.858792 0.606916 +vt 0.862520 0.608863 +vt 0.860718 0.615982 +vt 0.860826 0.801955 +vt 0.857015 0.803735 +vt 0.855623 0.794995 +vt 0.859342 0.794764 +vt 0.864088 0.599137 +vt 0.871771 0.593621 +vt 0.872990 0.597353 +vt 0.866415 0.601876 +vt 0.870775 0.813919 +vt 0.869391 0.817593 +vt 0.861961 0.811741 +vt 0.864406 0.809109 +vt 0.880708 0.591737 +vt 0.880545 0.595056 +vt 0.878235 0.819872 +vt 0.878220 0.816549 +vt 0.879569 0.616335 +vt 0.875381 0.604486 +vt 0.880218 0.601249 +vt 0.884915 0.604234 +vt 0.878169 0.810347 +vt 0.882993 0.807574 +vt 0.873480 0.806899 +vt 0.878190 0.795247 +vt 0.870243 0.606220 +vt 0.868906 0.611783 +vt 0.868423 0.804939 +vt 0.867334 0.799322 +vt 0.868915 0.620475 +vt 0.866315 0.616213 +vt 0.864943 0.794781 +vt 0.867730 0.790638 +vt 0.874939 0.626604 +vt 0.870063 0.625233 +vt 0.869088 0.785936 +vt 0.874020 0.784783 +vt 0.883908 0.627225 +vt 0.879383 0.629428 +vt 0.878585 0.782159 +vt 0.883008 0.784561 +vt 0.890509 0.621523 +vt 0.889008 0.626432 +vt 0.888067 0.785579 +vt 0.889349 0.790550 +vt 0.891514 0.611803 +vt 0.893847 0.616893 +vt 0.892478 0.795324 +vt 0.889922 0.800305 +vt 0.890450 0.605899 +vt 0.888597 0.806156 +vt 0.539314 0.053345 +vt 0.537040 0.057979 +vt 0.528630 0.056463 +vt 0.529796 0.050810 +vt 0.534325 0.061941 +vt 0.527228 0.060718 +vt 0.518927 0.060123 +vt 0.518925 0.055721 +vt 0.518925 0.049546 +vt 0.510632 0.060704 +vt 0.509230 0.056447 +vt 0.503543 0.061915 +vt 0.500834 0.057948 +vt 0.498567 0.053309 +vt 0.508066 0.050791 +vt 0.550838 0.058385 +vt 0.546647 0.061563 +vt 0.542849 0.059576 +vt 0.546114 0.055913 +vt 0.541991 0.065324 +vt 0.539009 0.063244 +vt 0.498862 0.063209 +vt 0.495029 0.059533 +vt 0.495878 0.065284 +vt 0.491230 0.061512 +vt 0.487046 0.058322 +vt 0.491773 0.055863 +vt 0.557459 0.064110 +vt 0.550940 0.068207 +vt 0.549020 0.064249 +vt 0.554132 0.060628 +vt 0.545459 0.073526 +vt 0.543983 0.068878 +vt 0.493881 0.068835 +vt 0.488852 0.064193 +vt 0.492398 0.073483 +vt 0.486924 0.068151 +vt 0.480407 0.064032 +vt 0.483748 0.060557 +vt 0.568627 0.080034 +vt 0.557062 0.083355 +vt 0.553377 0.074012 +vt 0.562286 0.070296 +vt 0.548931 0.087707 +vt 0.546894 0.078888 +vt 0.490953 0.078848 +vt 0.484473 0.073956 +vt 0.488904 0.087676 +vt 0.480762 0.083308 +vt 0.469163 0.079950 +vt 0.475552 0.070210 +vt 0.584301 0.109492 +vt 0.568768 0.114105 +vt 0.562725 0.097931 +vt 0.576499 0.094172 +vt 0.555797 0.119762 +vt 0.552211 0.102723 +vt 0.485603 0.102716 +vt 0.475056 0.097908 +vt 0.482003 0.119791 +vt 0.468969 0.114124 +vt 0.453338 0.109484 +vt 0.461217 0.094114 +vt 0.606157 0.171638 +vt 0.623405 0.186359 +vt 0.606884 0.200763 +vt 0.586464 0.187024 +vt 0.644385 0.202482 +vt 0.632076 0.214445 +vt 0.621002 0.227303 +vt 0.592977 0.218210 +vt 0.558793 0.209623 +vt 0.416962 0.228987 +vt 0.405473 0.216015 +vt 0.430888 0.201769 +vt 0.445231 0.219311 +vt 0.392747 0.203928 +vt 0.413973 0.187311 +vt 0.431395 0.172229 +vt 0.451442 0.187610 +vt 0.479659 0.210128 +vt 0.661887 0.218192 +vt 0.652512 0.228696 +vt 0.678158 0.233870 +vt 0.669687 0.243281 +vt 0.660913 0.251049 +vt 0.643415 0.238482 +vt 0.376630 0.254079 +vt 0.367417 0.246239 +vt 0.384811 0.230909 +vt 0.394310 0.240811 +vt 0.358459 0.236653 +vt 0.375004 0.220227 +vt 0.695442 0.249895 +vt 0.685098 0.257963 +vt 0.708176 0.267594 +vt 0.695713 0.273774 +vt 0.682849 0.278473 +vt 0.674192 0.264305 +vt 0.354754 0.283002 +vt 0.341241 0.278500 +vt 0.351801 0.261791 +vt 0.363279 0.268087 +vt 0.328067 0.272424 +vt 0.340831 0.253653 +vt 0.710799 0.288295 +vt 0.698505 0.291745 +vt 0.707738 0.307724 +vt 0.696383 0.308222 +vt 0.686069 0.307434 +vt 0.686480 0.293780 +vt 0.352515 0.313128 +vt 0.341893 0.314378 +vt 0.339014 0.297300 +vt 0.351555 0.298991 +vt 0.330125 0.314386 +vt 0.326116 0.294166 +vt 0.703422 0.321607 +vt 0.692260 0.319551 +vt 0.695343 0.334923 +vt 0.683891 0.330694 +vt 0.674331 0.325948 +vt 0.682599 0.316647 +vt 0.365353 0.331659 +vt 0.355756 0.336965 +vt 0.346649 0.325920 +vt 0.356469 0.322489 +vt 0.344203 0.341867 +vt 0.335240 0.328591 +vt 0.680993 0.352654 +vt 0.669034 0.346615 +vt 0.663496 0.370552 +vt 0.651914 0.362916 +vt 0.643166 0.354229 +vt 0.659524 0.339869 +vt 0.398430 0.359143 +vt 0.389912 0.368382 +vt 0.371689 0.352552 +vt 0.381103 0.345227 +vt 0.378483 0.376706 +vt 0.359757 0.359299 +vt 0.645975 0.384372 +vt 0.636756 0.375199 +vt 0.629889 0.393629 +vt 0.623653 0.383198 +vt 0.619606 0.371731 +vt 0.630242 0.364845 +vt 0.423128 0.375860 +vt 0.419544 0.387656 +vt 0.405892 0.380159 +vt 0.412042 0.369355 +vt 0.413721 0.398510 +vt 0.396965 0.389904 +vt 0.616695 0.397839 +vt 0.612698 0.386651 +vt 0.601508 0.398118 +vt 0.599483 0.385777 +vt 0.598403 0.373750 +vt 0.610113 0.374904 +vt 0.444643 0.376983 +vt 0.444079 0.389172 +vt 0.430786 0.390645 +vt 0.432874 0.378651 +vt 0.442602 0.401710 +vt 0.427272 0.402137 +vt 0.579440 0.395584 +vt 0.579601 0.380796 +vt 0.556312 0.392010 +vt 0.557829 0.374417 +vt 0.561672 0.359562 +vt 0.581121 0.367656 +vt 0.481024 0.361159 +vt 0.485493 0.375925 +vt 0.463880 0.383280 +vt 0.461797 0.370110 +vt 0.487774 0.393516 +vt 0.464695 0.398151 +vt 0.537944 0.389169 +vt 0.538944 0.369350 +vt 0.521980 0.388104 +vt 0.521543 0.367321 +vt 0.521061 0.342410 +vt 0.543462 0.352409 +vt 0.504220 0.370059 +vt 0.499012 0.353258 +vt 0.506063 0.389860 +vt 0.576492 0.338892 +vt 0.588070 0.344127 +vt 0.584401 0.354960 +vt 0.568874 0.347883 +vt 0.599057 0.346360 +vt 0.598421 0.359397 +vt 0.444019 0.362487 +vt 0.457972 0.357441 +vt 0.442838 0.349341 +vt 0.453843 0.346655 +vt 0.465321 0.340933 +vt 0.473324 0.349694 +vt 0.607932 0.346220 +vt 0.608629 0.359957 +vt 0.616122 0.343912 +vt 0.617334 0.357203 +vt 0.424802 0.361046 +vt 0.433732 0.363472 +vt 0.425468 0.347532 +vt 0.433859 0.349548 +vt 0.635618 0.333132 +vt 0.638389 0.343234 +vt 0.626846 0.351699 +vt 0.625058 0.339638 +vt 0.414922 0.355865 +vt 0.402821 0.347745 +vt 0.405220 0.337354 +vt 0.416228 0.343550 +vt 0.660206 0.314651 +vt 0.666553 0.319974 +vt 0.653188 0.331596 +vt 0.648683 0.324125 +vt 0.387230 0.336504 +vt 0.373083 0.325196 +vt 0.379378 0.319477 +vt 0.391528 0.328696 +vt 0.667992 0.298745 +vt 0.676436 0.303224 +vt 0.673796 0.311559 +vt 0.666139 0.306742 +vt 0.365319 0.316873 +vt 0.362283 0.308393 +vt 0.370802 0.303443 +vt 0.372998 0.311601 +vt 0.662811 0.278039 +vt 0.671750 0.278936 +vt 0.675991 0.291841 +vt 0.667274 0.289008 +vt 0.362322 0.296617 +vt 0.366247 0.283149 +vt 0.375432 0.281942 +vt 0.371202 0.293380 +vt 0.641178 0.255826 +vt 0.650468 0.254124 +vt 0.663002 0.266035 +vt 0.653428 0.266347 +vt 0.374870 0.269594 +vt 0.387430 0.257018 +vt 0.397003 0.258546 +vt 0.384728 0.269661 +vt 0.612614 0.245298 +vt 0.615193 0.237332 +vt 0.634875 0.244188 +vt 0.628116 0.248367 +vt 0.403166 0.246488 +vt 0.423081 0.239096 +vt 0.425893 0.247131 +vt 0.410175 0.250607 +vt 0.575330 0.254115 +vt 0.567220 0.237521 +vt 0.590391 0.234661 +vt 0.593043 0.247945 +vt 0.448181 0.235931 +vt 0.471694 0.238405 +vt 0.463886 0.255283 +vt 0.445806 0.249401 +vt 0.565405 0.261613 +vt 0.552431 0.247258 +vt 0.560180 0.270496 +vt 0.544078 0.261210 +vt 0.519748 0.247463 +vt 0.539890 0.229722 +vt 0.495583 0.261777 +vt 0.486848 0.247926 +vt 0.499170 0.230035 +vt 0.479598 0.271478 +vt 0.474105 0.262644 +vt 0.554142 0.339407 +vt 0.565846 0.330030 +vt 0.543239 0.327870 +vt 0.557974 0.318586 +vt 0.487805 0.340609 +vt 0.498341 0.328625 +vt 0.475717 0.331615 +vt 0.483239 0.319819 +vt 0.539203 0.311610 +vt 0.554719 0.305611 +vt 0.520605 0.315606 +vt 0.520283 0.294503 +vt 0.539155 0.293575 +vt 0.554708 0.292543 +vt 0.501854 0.312181 +vt 0.501351 0.294108 +vt 0.486090 0.306659 +vt 0.485701 0.293519 +vt 0.540216 0.276712 +vt 0.520023 0.274395 +vt 0.556571 0.280822 +vt 0.483500 0.281781 +vt 0.499839 0.277239 +vt 0.526391 0.068708 +vt 0.522781 0.067683 +vt 0.524939 0.064655 +vt 0.530205 0.065733 +vt 0.518928 0.067374 +vt 0.518928 0.064220 +vt 0.512920 0.064645 +vt 0.515077 0.067676 +vt 0.511468 0.068696 +vt 0.507658 0.065715 +vt 0.531713 0.073805 +vt 0.529517 0.070555 +vt 0.533980 0.067239 +vt 0.536458 0.069915 +vt 0.503884 0.067214 +vt 0.508342 0.070538 +vt 0.506144 0.073786 +vt 0.501405 0.069887 +vt 0.531225 0.085306 +vt 0.532534 0.079044 +vt 0.537832 0.074505 +vt 0.538680 0.079646 +vt 0.500025 0.074475 +vt 0.505319 0.079025 +vt 0.506623 0.085290 +vt 0.499172 0.079617 +vt 0.544035 0.123768 +vt 0.542166 0.106319 +vt 0.533926 0.126157 +vt 0.533130 0.108797 +vt 0.532778 0.094453 +vt 0.540687 0.091527 +vt 0.505070 0.094443 +vt 0.504724 0.108798 +vt 0.495672 0.106319 +vt 0.497156 0.091509 +vt 0.503945 0.126173 +vt 0.493809 0.123794 +vt 0.539578 0.083978 +vt 0.532163 0.087925 +vt 0.498269 0.083952 +vt 0.505684 0.087910 +vt 0.538348 0.156626 +vt 0.527985 0.152668 +vt 0.527019 0.141551 +vt 0.535871 0.141734 +vt 0.518978 0.151208 +vt 0.518960 0.140806 +vt 0.518943 0.126975 +vt 0.525912 0.126964 +vt 0.510900 0.141567 +vt 0.511972 0.126972 +vt 0.509972 0.152692 +vt 0.499609 0.156683 +vt 0.502034 0.141769 +vt 0.525644 0.110236 +vt 0.525656 0.096120 +vt 0.518932 0.110696 +vt 0.518927 0.096637 +vt 0.512218 0.110236 +vt 0.512196 0.096115 +vt 0.518926 0.086472 +vt 0.524945 0.086835 +vt 0.525385 0.089371 +vt 0.518925 0.089467 +vt 0.512464 0.089364 +vt 0.512904 0.086828 +vt 0.547150 0.173975 +vt 0.542049 0.175206 +vt 0.539912 0.168679 +vt 0.544567 0.165720 +vt 0.538113 0.176101 +vt 0.536881 0.171060 +vt 0.533511 0.166606 +vt 0.535266 0.163215 +vt 0.504503 0.166651 +vt 0.501153 0.171120 +vt 0.498108 0.168754 +vt 0.502729 0.163266 +vt 0.499949 0.176162 +vt 0.496015 0.175290 +vt 0.490904 0.174097 +vt 0.493427 0.165818 +vt 0.542087 0.193360 +vt 0.539006 0.189238 +vt 0.541963 0.182617 +vt 0.546610 0.183905 +vt 0.536530 0.186910 +vt 0.538179 0.181821 +vt 0.499923 0.181859 +vt 0.496167 0.182681 +vt 0.501611 0.186905 +vt 0.499260 0.189262 +vt 0.496310 0.193451 +vt 0.491548 0.184024 +vt 0.519585 0.200761 +vt 0.525614 0.194544 +vt 0.532532 0.193393 +vt 0.532726 0.200192 +vt 0.527756 0.190822 +vt 0.532619 0.190057 +vt 0.505552 0.189995 +vt 0.505986 0.193367 +vt 0.510391 0.190728 +vt 0.512872 0.194488 +vt 0.506139 0.200234 +vt 0.519186 0.192623 +vt 0.518619 0.190064 +vt 0.521327 0.192154 +vt 0.518797 0.193930 +vt 0.518974 0.187013 +vt 0.523255 0.188764 +vt 0.514776 0.188701 +vt 0.516442 0.192115 +vt 0.527826 0.158992 +vt 0.518991 0.157196 +vt 0.527032 0.162649 +vt 0.519000 0.160800 +vt 0.510157 0.159017 +vt 0.510971 0.162672 +vt 0.526090 0.165766 +vt 0.519009 0.164045 +vt 0.531718 0.169248 +vt 0.529697 0.170661 +vt 0.525478 0.169088 +vt 0.519023 0.167804 +vt 0.508343 0.170695 +vt 0.506311 0.169287 +vt 0.511931 0.165788 +vt 0.512566 0.169108 +vt 0.519086 0.184064 +vt 0.523803 0.185735 +vt 0.519080 0.179599 +vt 0.524925 0.183297 +vt 0.527818 0.185477 +vt 0.528180 0.187827 +vt 0.510239 0.185427 +vt 0.513176 0.183269 +vt 0.514309 0.185681 +vt 0.509857 0.187746 +vt 0.531939 0.187473 +vt 0.530566 0.184922 +vt 0.532840 0.183728 +vt 0.534565 0.185097 +vt 0.505231 0.183720 +vt 0.507488 0.184890 +vt 0.506111 0.187416 +vt 0.503521 0.185086 +vt 0.535546 0.181124 +vt 0.532774 0.180940 +vt 0.532096 0.177133 +vt 0.535348 0.176654 +vt 0.505971 0.177171 +vt 0.505299 0.180956 +vt 0.502535 0.181150 +vt 0.502711 0.176703 +vt 0.534438 0.172786 +vt 0.531173 0.173628 +vt 0.506881 0.173668 +vt 0.503603 0.172837 +vt 0.526699 0.177809 +vt 0.528574 0.181682 +vt 0.509509 0.181678 +vt 0.511405 0.177826 +vt 0.519049 0.172948 +vt 0.525674 0.173357 +vt 0.512407 0.173378 +vt 0.534250 0.213168 +vt 0.519646 0.219043 +vt 0.545871 0.200552 +vt 0.492604 0.200768 +vt 0.504734 0.213297 +vt 0.551833 0.186076 +vt 0.553412 0.172419 +vt 0.563647 0.168321 +vt 0.561716 0.184013 +vt 0.474292 0.168551 +vt 0.484615 0.172594 +vt 0.486345 0.186292 +vt 0.476391 0.184328 +vt 0.551880 0.162260 +vt 0.548945 0.152313 +vt 0.561164 0.147206 +vt 0.563129 0.157240 +vt 0.476663 0.147328 +vt 0.488961 0.152405 +vt 0.486067 0.162392 +vt 0.474729 0.157411 +vt 0.546313 0.139291 +vt 0.558750 0.134651 +vt 0.491557 0.139347 +vt 0.479056 0.134725 +vt 0.590430 0.122775 +vt 0.573592 0.128247 +vt 0.594811 0.133874 +vt 0.577198 0.140149 +vt 0.460500 0.140293 +vt 0.464117 0.128325 +vt 0.442725 0.134028 +vt 0.447147 0.122844 +vt 0.597367 0.142638 +vt 0.579588 0.149602 +vt 0.598809 0.150811 +vt 0.580668 0.159466 +vt 0.457083 0.159742 +vt 0.458117 0.149807 +vt 0.438729 0.151122 +vt 0.440157 0.142869 +vt 0.580343 0.172599 +vt 0.599848 0.160133 +vt 0.457516 0.172972 +vt 0.437728 0.160537 +vt 0.524451 0.085358 +vt 0.528614 0.084539 +vt 0.518925 0.084939 +vt 0.518925 0.083754 +vt 0.523789 0.084048 +vt 0.527444 0.083330 +vt 0.513399 0.085351 +vt 0.514061 0.084042 +vt 0.509234 0.084527 +vt 0.510406 0.083320 +vt 0.530055 0.080412 +vt 0.529424 0.075463 +vt 0.528681 0.080010 +vt 0.528076 0.075978 +vt 0.507797 0.080397 +vt 0.509171 0.079997 +vt 0.508431 0.075448 +vt 0.509779 0.075966 +vt 0.527375 0.072183 +vt 0.524595 0.070217 +vt 0.526202 0.073130 +vt 0.523725 0.071312 +vt 0.510482 0.072171 +vt 0.511655 0.073120 +vt 0.513262 0.070208 +vt 0.514132 0.071305 +vt 0.521773 0.069210 +vt 0.518929 0.068946 +vt 0.521311 0.070372 +vt 0.518929 0.070120 +vt 0.516084 0.069206 +vt 0.516546 0.070368 +vt 0.520792 0.072301 +vt 0.518928 0.072082 +vt 0.522687 0.073045 +vt 0.522119 0.075131 +vt 0.520571 0.074660 +vt 0.518928 0.074477 +vt 0.515737 0.075127 +vt 0.515170 0.073039 +vt 0.517065 0.072298 +vt 0.517285 0.074658 +vt 0.524646 0.074400 +vt 0.526155 0.076440 +vt 0.524746 0.076798 +vt 0.523477 0.075811 +vt 0.513109 0.076790 +vt 0.511700 0.076430 +vt 0.513211 0.074391 +vt 0.514379 0.075804 +vt 0.526702 0.079241 +vt 0.525770 0.081523 +vt 0.524030 0.079411 +vt 0.524751 0.078250 +vt 0.513823 0.079405 +vt 0.512081 0.081515 +vt 0.511151 0.079231 +vt 0.513103 0.078243 +vt 0.522846 0.082010 +vt 0.518925 0.081803 +vt 0.518926 0.079423 +vt 0.521844 0.079585 +vt 0.515005 0.082005 +vt 0.516008 0.079581 +vt 0.518927 0.076953 +vt 0.521004 0.077111 +vt 0.522658 0.077287 +vt 0.516851 0.077109 +vt 0.515197 0.077283 +vt 0.523466 0.077182 +vt 0.514389 0.077176 +vt 0.565241 0.283355 +vt 0.563684 0.292624 +vt 0.568319 0.275320 +vt 0.572243 0.277777 +vt 0.569831 0.285006 +vt 0.569010 0.293225 +vt 0.467623 0.279114 +vt 0.471518 0.276529 +vt 0.474842 0.284556 +vt 0.470260 0.286350 +vt 0.476677 0.293863 +vt 0.471328 0.294625 +vt 0.564222 0.303025 +vt 0.567317 0.313741 +vt 0.570071 0.302291 +vt 0.573142 0.311497 +vt 0.476455 0.304364 +vt 0.470539 0.303808 +vt 0.473683 0.315267 +vt 0.467739 0.313198 +vt 0.573436 0.323961 +vt 0.581581 0.332100 +vt 0.578352 0.320136 +vt 0.585105 0.327137 +vt 0.467866 0.325779 +vt 0.462776 0.322092 +vt 0.459942 0.334276 +vt 0.456204 0.329397 +vt 0.572342 0.268622 +vt 0.580216 0.262425 +vt 0.583200 0.266123 +vt 0.575954 0.271684 +vt 0.456225 0.267598 +vt 0.459147 0.263778 +vt 0.467276 0.269863 +vt 0.463706 0.273050 +vt 0.594847 0.255893 +vt 0.611230 0.251963 +vt 0.610754 0.257158 +vt 0.596216 0.260490 +vt 0.428062 0.259163 +vt 0.427457 0.253882 +vt 0.444168 0.257490 +vt 0.442893 0.262195 +vt 0.624361 0.253572 +vt 0.635866 0.259477 +vt 0.633046 0.263505 +vt 0.622561 0.258500 +vt 0.405517 0.266204 +vt 0.402535 0.262154 +vt 0.414133 0.255836 +vt 0.416083 0.260823 +vt 0.647372 0.268436 +vt 0.656424 0.278659 +vt 0.651897 0.280071 +vt 0.643616 0.271163 +vt 0.386714 0.283696 +vt 0.382022 0.282383 +vt 0.391003 0.271638 +vt 0.394925 0.274331 +vt 0.660566 0.288359 +vt 0.661246 0.297150 +vt 0.656019 0.296899 +vt 0.655512 0.288824 +vt 0.383039 0.301103 +vt 0.377677 0.301548 +vt 0.378081 0.292480 +vt 0.383289 0.292791 +vt 0.659916 0.304646 +vt 0.654935 0.311857 +vt 0.650639 0.310282 +vt 0.654971 0.303771 +vt 0.389015 0.314625 +vt 0.384672 0.316404 +vt 0.379310 0.309202 +vt 0.384353 0.308119 +vt 0.644668 0.319791 +vt 0.632887 0.327126 +vt 0.630529 0.323708 +vt 0.641296 0.317272 +vt 0.410025 0.327565 +vt 0.407758 0.331135 +vt 0.395459 0.324113 +vt 0.398809 0.321411 +vt 0.623366 0.332538 +vt 0.615257 0.336155 +vt 0.614615 0.331821 +vt 0.621931 0.328558 +vt 0.426508 0.335214 +vt 0.426027 0.339635 +vt 0.417654 0.336274 +vt 0.418956 0.332175 +vt 0.607708 0.338104 +vt 0.599835 0.338280 +vt 0.600616 0.333421 +vt 0.607698 0.333496 +vt 0.440754 0.336316 +vt 0.441730 0.341203 +vt 0.433755 0.341324 +vt 0.433586 0.336655 +vt 0.590753 0.336576 +vt 0.592806 0.331433 +vt 0.450844 0.339136 +vt 0.448579 0.334018 +vt 0.594583 0.327825 +vt 0.601265 0.330046 +vt 0.588029 0.323634 +vt 0.590644 0.321516 +vt 0.596222 0.324984 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.453126 0.325966 +vt 0.446650 0.330437 +vt 0.444890 0.327625 +vt 0.439971 0.332925 +vt 0.439372 0.331331 +vt 0.607644 0.330283 +vt 0.614074 0.328799 +vt 0.607567 0.327768 +vt 0.613335 0.327083 +vt 0.433517 0.333397 +vt 0.433497 0.330845 +vt 0.426939 0.332127 +vt 0.427623 0.330358 +vt 0.620908 0.325858 +vt 0.628881 0.321370 +vt 0.620093 0.323798 +vt 0.626851 0.320513 +vt 0.419888 0.329392 +vt 0.420636 0.327267 +vt 0.411613 0.325121 +vt 0.413648 0.324175 +vt 0.638723 0.315246 +vt 0.647218 0.308618 +vt 0.636549 0.313467 +vt 0.646248 0.306421 +vt 0.401361 0.319243 +vt 0.403515 0.317343 +vt 0.392457 0.312790 +vt 0.393381 0.310510 +vt 0.651151 0.302617 +vt 0.652130 0.296452 +vt 0.647895 0.301323 +vt 0.649541 0.296225 +vt 0.388229 0.306793 +vt 0.391522 0.305346 +vt 0.387015 0.300507 +vt 0.389662 0.300183 +vt 0.651762 0.289330 +vt 0.648537 0.281545 +vt 0.648663 0.289856 +vt 0.647785 0.283486 +vt 0.387155 0.293188 +vt 0.390351 0.293627 +vt 0.390206 0.285109 +vt 0.391040 0.287071 +vt 0.640941 0.273393 +vt 0.631234 0.266340 +vt 0.638807 0.275375 +vt 0.629829 0.267263 +vt 0.397726 0.276543 +vt 0.399966 0.278515 +vt 0.407439 0.269058 +vt 0.408893 0.269959 +vt 0.621671 0.261850 +vt 0.610899 0.260715 +vt 0.621235 0.264412 +vt 0.612641 0.261560 +vt 0.417069 0.264222 +vt 0.417574 0.266826 +vt 0.427998 0.262789 +vt 0.426254 0.263693 +vt 0.597565 0.263724 +vt 0.585604 0.268884 +vt 0.598903 0.266275 +vt 0.585166 0.270991 +vt 0.441606 0.265513 +vt 0.440311 0.268138 +vt 0.453864 0.270454 +vt 0.454369 0.272583 +vt 0.578953 0.274202 +vt 0.575703 0.279966 +vt 0.581645 0.276446 +vt 0.578124 0.281900 +vt 0.460743 0.275672 +vt 0.458084 0.278012 +vt 0.464190 0.281418 +vt 0.461798 0.283441 +vt 0.582033 0.317488 +vt 0.577323 0.310016 +vt 0.579548 0.309340 +vt 0.585096 0.315428 +vt 0.461204 0.311233 +vt 0.463474 0.311842 +vt 0.458970 0.319548 +vt 0.455806 0.317576 +vt 0.574627 0.301852 +vt 0.573612 0.293750 +vt 0.577524 0.293776 +vt 0.578536 0.301558 +vt 0.462754 0.295432 +vt 0.466703 0.295291 +vt 0.465932 0.303507 +vt 0.461979 0.303333 +vt 0.573946 0.286469 +vt 0.577824 0.287838 +vt 0.466150 0.287943 +vt 0.462276 0.289437 +vt 0.537814 0.410803 +vt 0.522486 0.410487 +vt 0.556089 0.411900 +vt 0.553209 0.433063 +vt 0.538120 0.433345 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.488908 0.413457 +vt 0.507174 0.411509 +vt 0.507920 0.434083 +vt 0.580237 0.413224 +vt 0.604324 0.413413 +vt 0.609819 0.431516 +vt 0.581514 0.432289 +vt 0.435860 0.435740 +vt 0.440490 0.417253 +vt 0.464714 0.415920 +vt 0.464334 0.435139 +vt 0.622415 0.411107 +vt 0.638729 0.405048 +vt 0.648174 0.419316 +vt 0.628996 0.425416 +vt 0.396518 0.425416 +vt 0.405331 0.410500 +vt 0.422136 0.415812 +vt 0.416189 0.430578 +vt 0.657485 0.393976 +vt 0.676771 0.378394 +vt 0.692106 0.388274 +vt 0.670140 0.403795 +vt 0.350292 0.396229 +vt 0.365355 0.385357 +vt 0.385755 0.400221 +vt 0.373405 0.410823 +vt 0.694675 0.358805 +vt 0.708795 0.339345 +vt 0.726332 0.341754 +vt 0.709219 0.365014 +vt 0.312756 0.350588 +vt 0.330606 0.347118 +vt 0.346077 0.366293 +vt 0.331524 0.373408 +vt 0.716728 0.324148 +vt 0.720489 0.308075 +vt 0.735879 0.312112 +vt 0.731106 0.326933 +vt 0.301067 0.320593 +vt 0.316923 0.315395 +vt 0.321627 0.331925 +vt 0.306911 0.335590 +vt 0.722094 0.285988 +vt 0.718071 0.262689 +vt 0.731519 0.256780 +vt 0.735791 0.282538 +vt 0.303229 0.261534 +vt 0.317592 0.267554 +vt 0.314279 0.292209 +vt 0.299718 0.289022 +vt 0.704948 0.242983 +vt 0.687690 0.225865 +vt 0.702798 0.217013 +vt 0.719338 0.235312 +vt 0.332486 0.219303 +vt 0.348426 0.228476 +vt 0.330762 0.246617 +vt 0.315457 0.238665 +vt 0.671262 0.210330 +vt 0.653897 0.195135 +vt 0.662317 0.184641 +vt 0.685445 0.200761 +vt 0.374195 0.185721 +vt 0.382918 0.196478 +vt 0.365218 0.212210 +vt 0.350400 0.202336 +vt 0.626908 0.015608 +vt 0.638176 0.018993 +vt 0.639561 0.040540 +vt 0.621541 0.032099 +vt 0.649444 0.022378 +vt 0.654195 0.047117 +vt 0.653501 0.070933 +vt 0.637878 0.060791 +vt 0.619529 0.049057 +vt 0.383906 0.070216 +vt 0.383583 0.046313 +vt 0.398340 0.039911 +vt 0.399749 0.060219 +vt 0.388827 0.021586 +vt 0.400073 0.018359 +vt 0.411318 0.015131 +vt 0.416466 0.031641 +vt 0.418298 0.048624 +vt 0.567460 0.000144 +vt 0.597184 0.007876 +vt 0.598253 0.024161 +vt 0.573917 0.020499 +vt 0.598430 0.039835 +vt 0.577728 0.035019 +vt 0.439789 0.023890 +vt 0.439501 0.039552 +vt 0.440977 0.007638 +vt 0.470636 0.000144 +vt 0.464105 0.020382 +vt 0.460236 0.034862 +vt 0.518922 0.024886 +vt 0.543191 0.012515 +vt 0.552750 0.024889 +vt 0.537616 0.033544 +vt 0.560569 0.036503 +vt 0.548263 0.041578 +vt 0.485213 0.024839 +vt 0.477380 0.036413 +vt 0.494779 0.012515 +vt 0.500285 0.033512 +vt 0.489654 0.041519 +vt 0.531378 0.042677 +vt 0.542117 0.047535 +vt 0.518927 0.040128 +vt 0.506494 0.042655 +vt 0.495779 0.047492 +vt 0.549415 0.051935 +vt 0.554977 0.055543 +vt 0.554949 0.048532 +vt 0.558366 0.052915 +vt 0.488483 0.051874 +vt 0.482963 0.048454 +vt 0.482915 0.055466 +vt 0.479532 0.052826 +vt 0.560503 0.058027 +vt 0.567352 0.061653 +vt 0.565105 0.054124 +vt 0.576047 0.057402 +vt 0.477380 0.057933 +vt 0.472789 0.054013 +vt 0.470506 0.061537 +vt 0.461815 0.057251 +vt 0.576881 0.068688 +vt 0.587176 0.079305 +vt 0.590585 0.064811 +vt 0.605153 0.075955 +vt 0.460918 0.068542 +vt 0.447196 0.064600 +vt 0.450534 0.079148 +vt 0.432505 0.075705 +vt 0.578971 0.047922 +vt 0.596821 0.054289 +vt 0.615002 0.064774 +vt 0.441013 0.054029 +vt 0.422701 0.064421 +vt 0.458932 0.047755 +vt 0.564907 0.046599 +vt 0.473014 0.046489 +vt 0.624013 0.104750 +vt 0.616184 0.090438 +vt 0.630060 0.078450 +vt 0.642020 0.091166 +vt 0.407441 0.078039 +vt 0.421316 0.090206 +vt 0.413334 0.104572 +vt 0.395272 0.090713 +vt 0.596324 0.093677 +vt 0.603744 0.108616 +vt 0.441273 0.093555 +vt 0.433741 0.108565 +vt 0.611761 0.131114 +vt 0.612571 0.139641 +vt 0.635943 0.127696 +vt 0.630860 0.142201 +vt 0.626197 0.150966 +vt 0.612401 0.147309 +vt 0.410974 0.151389 +vt 0.406192 0.142474 +vt 0.424780 0.139885 +vt 0.424973 0.147644 +vt 0.401083 0.127719 +vt 0.425593 0.131262 +vt 0.608855 0.120934 +vt 0.628976 0.115380 +vt 0.408262 0.115272 +vt 0.428547 0.120978 +vt 0.612370 0.154914 +vt 0.617753 0.164731 +vt 0.622617 0.156830 +vt 0.625724 0.164649 +vt 0.425034 0.155339 +vt 0.414640 0.157330 +vt 0.419599 0.165321 +vt 0.411492 0.165278 +vt 0.633828 0.179037 +vt 0.637884 0.173830 +vt 0.399140 0.174660 +vt 0.403302 0.179942 +vt 0.945900 0.079569 +vt 0.914838 0.105981 +vt 0.893260 0.084498 +vt 0.918840 0.058242 +vt 0.889132 0.123361 +vt 0.873282 0.106442 +vt 0.851852 0.096591 +vt 0.866972 0.069553 +vt 0.891780 0.036916 +vt 0.180084 0.088507 +vt 0.156552 0.097152 +vt 0.136417 0.071699 +vt 0.165727 0.058422 +vt 0.137530 0.114165 +vt 0.110425 0.092953 +vt 0.078961 0.060719 +vt 0.110619 0.041093 +vt 0.142277 0.021467 +vt 0.833734 0.057065 +vt 0.848682 0.023851 +vt 0.822965 0.086651 +vt 0.785804 0.079347 +vt 0.791534 0.049108 +vt 0.805584 0.010786 +vt 0.249093 0.074797 +vt 0.210628 0.080245 +vt 0.201098 0.048397 +vt 0.244703 0.043157 +vt 0.187463 0.012475 +vt 0.232648 0.003484 +vt 0.738361 0.047754 +vt 0.738984 0.016493 +vt 0.739549 0.077405 +vt 0.689992 0.080919 +vt 0.691272 0.049157 +vt 0.672384 0.022201 +vt 0.346775 0.079604 +vt 0.296387 0.074595 +vt 0.298714 0.044235 +vt 0.346234 0.047410 +vt 0.299313 0.012237 +vt 0.365979 0.020991 +vt 0.667324 0.049467 +vt 0.660914 0.022289 +vt 0.666424 0.075383 +vt 0.370819 0.074495 +vt 0.370369 0.048457 +vt 0.377403 0.021288 +vt 0.650904 0.098775 +vt 0.661183 0.105558 +vt 0.386234 0.098272 +vt 0.375694 0.105035 +vt 0.744333 0.224966 +vt 0.754642 0.247585 +vt 0.727991 0.205063 +vt 0.758274 0.191148 +vt 0.769779 0.215877 +vt 0.778667 0.239039 +vt 0.273755 0.191843 +vt 0.305809 0.206728 +vt 0.288775 0.227778 +vt 0.261579 0.218114 +vt 0.278389 0.252011 +vt 0.252527 0.243095 +vt 0.994525 0.167705 +vt 0.948074 0.176349 +vt 0.933945 0.138078 +vt 0.970213 0.123637 +vt 0.913217 0.182923 +vt 0.902861 0.149999 +vt 0.118945 0.142532 +vt 0.085008 0.126913 +vt 0.103932 0.178783 +vt 0.064870 0.169124 +vt 0.011829 0.155367 +vt 0.045395 0.108043 +vt 0.911671 0.402429 +vt 0.884003 0.369161 +vt 0.907892 0.346905 +vt 0.937286 0.373591 +vt 0.862686 0.339578 +vt 0.883515 0.321821 +vt 0.898768 0.301660 +vt 0.926996 0.320953 +vt 0.962901 0.344752 +vt 0.118375 0.315370 +vt 0.136374 0.338312 +vt 0.108675 0.368008 +vt 0.085783 0.338181 +vt 0.160786 0.357984 +vt 0.137159 0.392880 +vt 0.106400 0.432652 +vt 0.075184 0.399845 +vt 0.043968 0.367038 +vt 0.943061 0.290270 +vt 0.981378 0.299696 +vt 0.911263 0.279326 +vt 0.918742 0.252459 +vt 0.953248 0.255267 +vt 0.999856 0.254640 +vt 0.095172 0.258408 +vt 0.103698 0.289559 +vt 0.066713 0.302159 +vt 0.055135 0.260843 +vt 0.022056 0.313076 +vt 0.000144 0.259113 +vt 0.954713 0.216353 +vt 0.997190 0.211173 +vt 0.918953 0.218701 +vt 0.095629 0.219445 +vt 0.054717 0.215133 +vt 0.005987 0.207240 +vt 0.749542 0.334683 +vt 0.742710 0.323398 +vt 0.760230 0.315333 +vt 0.768682 0.327936 +vt 0.754434 0.300978 +vt 0.773434 0.293137 +vt 0.779994 0.306487 +vt 0.789564 0.318101 +vt 0.259496 0.301950 +vt 0.280510 0.309658 +vt 0.274913 0.325696 +vt 0.252703 0.316963 +vt 0.294625 0.333544 +vt 0.288183 0.346496 +vt 0.266464 0.340272 +vt 0.242718 0.330414 +vt 0.804247 0.296080 +vt 0.815676 0.307660 +vt 0.795245 0.283595 +vt 0.816175 0.273268 +vt 0.827684 0.284720 +vt 0.840737 0.296140 +vt 0.212022 0.281565 +vt 0.235299 0.292296 +vt 0.225501 0.306460 +vt 0.199173 0.294636 +vt 0.213124 0.319871 +vt 0.184690 0.307842 +vt 0.845003 0.273015 +vt 0.858466 0.283068 +vt 0.832533 0.263076 +vt 0.844821 0.251955 +vt 0.857419 0.260335 +vt 0.870829 0.268571 +vt 0.179781 0.258393 +vt 0.193764 0.270623 +vt 0.179588 0.281936 +vt 0.165402 0.267814 +vt 0.164426 0.293526 +vt 0.150180 0.277239 +vt 0.866150 0.246053 +vt 0.879792 0.252772 +vt 0.853541 0.238846 +vt 0.858615 0.227900 +vt 0.869522 0.229610 +vt 0.883757 0.234124 +vt 0.162811 0.231605 +vt 0.169328 0.243794 +vt 0.155267 0.251726 +vt 0.150917 0.233273 +vt 0.139801 0.259297 +vt 0.135112 0.238149 +vt 0.842355 0.195160 +vt 0.859121 0.189704 +vt 0.865865 0.210451 +vt 0.852806 0.214647 +vt 0.874671 0.186176 +vt 0.881130 0.211077 +vt 0.137932 0.212248 +vt 0.154082 0.212059 +vt 0.146173 0.184629 +vt 0.162167 0.189401 +vt 0.176788 0.196179 +vt 0.168313 0.217094 +vt 0.896625 0.215385 +vt 0.890727 0.185058 +vt 0.897871 0.243576 +vt 0.119181 0.248685 +vt 0.120908 0.216597 +vt 0.128897 0.182520 +vt 0.892501 0.265345 +vt 0.882329 0.283273 +vt 0.137173 0.294074 +vt 0.125336 0.273589 +vt 0.869172 0.299940 +vt 0.850334 0.314832 +vt 0.174262 0.329298 +vt 0.152490 0.312902 +vt 0.833464 0.354702 +vt 0.823123 0.327435 +vt 0.805060 0.366763 +vt 0.795591 0.338307 +vt 0.237000 0.353494 +vt 0.205465 0.342487 +vt 0.227594 0.386342 +vt 0.194700 0.373985 +vt 0.770185 0.379538 +vt 0.759863 0.357111 +vt 0.775794 0.348002 +vt 0.786680 0.375335 +vt 0.259768 0.363344 +vt 0.278152 0.372616 +vt 0.268122 0.398737 +vt 0.248944 0.395082 +vt 0.845499 0.449967 +vt 0.824956 0.403130 +vt 0.853581 0.388754 +vt 0.878585 0.426198 +vt 0.173003 0.414041 +vt 0.206543 0.429096 +vt 0.185281 0.484099 +vt 0.145840 0.458376 +vt 0.815858 0.445381 +vt 0.793215 0.444821 +vt 0.778079 0.421946 +vt 0.792645 0.414150 +vt 0.770572 0.444261 +vt 0.763136 0.431432 +vt 0.755700 0.418603 +vt 0.762942 0.399071 +vt 0.287033 0.442912 +vt 0.279198 0.458114 +vt 0.261445 0.448038 +vt 0.277577 0.420825 +vt 0.271364 0.473316 +vt 0.245312 0.475251 +vt 0.219260 0.477186 +vt 0.244234 0.439904 +vt 0.806457 0.409737 +vt 0.823720 0.439889 +vt 0.228110 0.435654 +vt 0.209866 0.471309 +vt 0.819845 0.468071 +vt 0.817852 0.456726 +vt 0.827067 0.454473 +vt 0.832672 0.459019 +vt 0.206812 0.488297 +vt 0.200587 0.493852 +vt 0.217577 0.490395 +vt 0.215894 0.503605 +vt 0.755291 0.275659 +vt 0.776439 0.267723 +vt 0.278652 0.282200 +vt 0.255635 0.274184 +vt 0.794820 0.235072 +vt 0.795082 0.261102 +vt 0.808235 0.230663 +vt 0.811209 0.254481 +vt 0.217549 0.260513 +vt 0.235224 0.267418 +vt 0.220518 0.234225 +vt 0.235095 0.238903 +vt 0.820950 0.229143 +vt 0.824810 0.246547 +vt 0.829287 0.219562 +vt 0.835759 0.236818 +vt 0.190262 0.241569 +vt 0.202740 0.252082 +vt 0.199067 0.222464 +vt 0.206983 0.233036 +vt 0.843931 0.224810 +vt 0.837701 0.211668 +vt 0.179580 0.228419 +vt 0.187927 0.209321 +vt 0.744359 0.103837 +vt 0.706047 0.109141 +vt 0.784963 0.102809 +vt 0.786447 0.122246 +vt 0.752059 0.127970 +vt 0.712371 0.140499 +vt 0.246597 0.119486 +vt 0.248893 0.099247 +vt 0.290608 0.101681 +vt 0.281936 0.126431 +vt 0.329760 0.108091 +vt 0.322678 0.140136 +vt 0.736714 0.167208 +vt 0.761916 0.150723 +vt 0.772211 0.168449 +vt 0.787690 0.140415 +vt 0.785486 0.152330 +vt 0.270931 0.149783 +vt 0.244699 0.138495 +vt 0.296879 0.167286 +vt 0.259495 0.167887 +vt 0.245969 0.151002 +vt 0.709243 0.185137 +vt 0.686430 0.166862 +vt 0.349277 0.167406 +vt 0.325495 0.186083 +vt 0.644947 0.163787 +vt 0.657890 0.151913 +vt 0.670045 0.134473 +vt 0.378600 0.152258 +vt 0.366202 0.134395 +vt 0.391891 0.164438 +vt 0.677327 0.115796 +vt 0.359020 0.115319 +vt 0.635300 0.165769 +vt 0.401750 0.166464 +vt 0.839869 0.175761 +vt 0.853235 0.168500 +vt 0.837382 0.156361 +vt 0.841417 0.150913 +vt 0.853765 0.137677 +vt 0.867144 0.161965 +vt 0.175775 0.132589 +vt 0.189019 0.148124 +vt 0.172572 0.166616 +vt 0.157745 0.158328 +vt 0.196622 0.155241 +vt 0.186705 0.175710 +vt 0.882140 0.156879 +vt 0.872766 0.134048 +vt 0.141530 0.151652 +vt 0.154964 0.127182 +vt 0.816880 0.141014 +vt 0.811434 0.154345 +vt 0.820522 0.126340 +vt 0.211373 0.122359 +vt 0.215227 0.138347 +vt 0.221296 0.153122 +vt 0.820556 0.108981 +vt 0.848088 0.116562 +vt 0.183019 0.110167 +vt 0.211947 0.103945 +vt 0.864510 0.119761 +vt 0.165361 0.112301 +vt 0.506166 0.904851 +vt 0.469277 0.899897 +vt 0.467102 0.887934 +vt 0.502009 0.889062 +vt 0.432388 0.894943 +vt 0.438605 0.880072 +vt 0.442570 0.867282 +vt 0.467297 0.874740 +vt 0.497540 0.875977 +vt 0.312156 0.865143 +vt 0.315792 0.878106 +vt 0.286936 0.885229 +vt 0.287103 0.871964 +vt 0.321637 0.893225 +vt 0.284422 0.897192 +vt 0.247207 0.901159 +vt 0.251822 0.885397 +vt 0.256678 0.872371 +vt 0.543710 0.881749 +vt 0.555496 0.892398 +vt 0.534426 0.869293 +vt 0.566292 0.853087 +vt 0.579330 0.863421 +vt 0.604825 0.879946 +vt 0.188235 0.847442 +vt 0.219796 0.864624 +vt 0.210113 0.876880 +vt 0.174834 0.857456 +vt 0.197968 0.887254 +vt 0.148729 0.873349 +vt 0.595994 0.831506 +vt 0.612393 0.835781 +vt 0.581472 0.825753 +vt 0.581825 0.795308 +vt 0.595536 0.796225 +vt 0.619962 0.791615 +vt 0.174295 0.788956 +vt 0.173769 0.819544 +vt 0.159006 0.824902 +vt 0.160488 0.789473 +vt 0.142396 0.828721 +vt 0.136063 0.784093 +vt 0.579793 0.767804 +vt 0.589729 0.763265 +vt 0.569205 0.769767 +vt 0.548861 0.748164 +vt 0.555739 0.744297 +vt 0.563952 0.739636 +vt 0.208752 0.742636 +vt 0.187712 0.763703 +vt 0.177137 0.761422 +vt 0.201967 0.738564 +vt 0.167303 0.756572 +vt 0.193875 0.733657 +vt 0.530349 0.723761 +vt 0.537882 0.718127 +vt 0.526039 0.729528 +vt 0.500239 0.712664 +vt 0.502360 0.705108 +vt 0.509441 0.697811 +vt 0.258441 0.708419 +vt 0.232145 0.724609 +vt 0.227988 0.718717 +vt 0.256518 0.700799 +vt 0.220609 0.712866 +vt 0.249633 0.693309 +vt 0.470507 0.687247 +vt 0.476553 0.677761 +vt 0.470964 0.696376 +vt 0.442627 0.684437 +vt 0.439691 0.671552 +vt 0.445649 0.657308 +vt 0.316870 0.681612 +vt 0.288185 0.692861 +vt 0.288873 0.683732 +vt 0.320103 0.668780 +vt 0.283075 0.674093 +vt 0.314481 0.654423 +vt 0.501210 0.721182 +vt 0.474394 0.705845 +vt 0.503339 0.729425 +vt 0.478400 0.714693 +vt 0.455602 0.705126 +vt 0.449084 0.695707 +vt 0.303354 0.702018 +vt 0.280263 0.711016 +vt 0.284505 0.702256 +vt 0.310125 0.692742 +vt 0.254889 0.725123 +vt 0.257242 0.716923 +vt 0.544487 0.752313 +vt 0.524464 0.736210 +vt 0.541615 0.756550 +vt 0.524268 0.742875 +vt 0.233553 0.738029 +vt 0.233538 0.731346 +vt 0.215780 0.751246 +vt 0.213020 0.746918 +vt 0.571714 0.792317 +vt 0.561605 0.770877 +vt 0.563856 0.789235 +vt 0.555810 0.771958 +vt 0.201098 0.766285 +vt 0.195311 0.765036 +vt 0.192523 0.783381 +vt 0.184541 0.786248 +vt 0.557285 0.839277 +vt 0.570708 0.817045 +vt 0.551540 0.826015 +vt 0.562758 0.808517 +vt 0.193070 0.802770 +vt 0.184837 0.811108 +vt 0.203833 0.820663 +vt 0.197682 0.833823 +vt 0.498666 0.859595 +vt 0.530144 0.853227 +vt 0.502835 0.844149 +vt 0.529227 0.837942 +vt 0.225907 0.833272 +vt 0.224553 0.848601 +vt 0.252242 0.840246 +vt 0.256002 0.855880 +vt 0.472229 0.859085 +vt 0.450313 0.852917 +vt 0.459439 0.839671 +vt 0.479382 0.844489 +vt 0.295958 0.836942 +vt 0.304767 0.850499 +vt 0.282577 0.856098 +vt 0.275792 0.841237 +vt 0.781229 0.177498 +vt 0.777540 0.192542 +vt 0.790753 0.164650 +vt 0.796021 0.176969 +vt 0.788561 0.181231 +vt 0.787311 0.191440 +vt 0.233625 0.175620 +vt 0.239797 0.163311 +vt 0.249526 0.176892 +vt 0.241448 0.180379 +vt 0.253192 0.192916 +vt 0.242627 0.191415 +vt 0.391039 0.611891 +vt 0.423162 0.635783 +vt 0.414812 0.659395 +vt 0.392902 0.649008 +vt 0.419641 0.680620 +vt 0.394766 0.686125 +vt 0.345258 0.657206 +vt 0.339989 0.678347 +vt 0.337396 0.633508 +vt 0.369913 0.610196 +vt 0.367375 0.647321 +vt 0.364838 0.684445 +vt 0.785521 0.211976 +vt 0.795291 0.208892 +vt 0.244733 0.213828 +vt 0.234116 0.210430 +vt 0.391747 0.862097 +vt 0.396676 0.851779 +vt 0.416134 0.867182 +vt 0.412068 0.878520 +vt 0.401605 0.841460 +vt 0.422232 0.855297 +vt 0.332920 0.853649 +vt 0.338727 0.865760 +vt 0.354026 0.840297 +vt 0.358701 0.850802 +vt 0.363377 0.861308 +vt 0.342507 0.877267 +vt 0.430345 0.696278 +vt 0.441095 0.707171 +vt 0.433108 0.714624 +vt 0.418039 0.702943 +vt 0.325667 0.712108 +vt 0.317846 0.704438 +vt 0.328898 0.693778 +vt 0.341075 0.700759 +vt 0.428970 0.728065 +vt 0.411160 0.720916 +vt 0.412028 0.711091 +vt 0.429871 0.721278 +vt 0.384658 0.710299 +vt 0.389712 0.698212 +vt 0.369619 0.696707 +vt 0.346905 0.709081 +vt 0.374400 0.708969 +vt 0.347534 0.718963 +vt 0.329482 0.725693 +vt 0.328747 0.718861 +vt 0.412713 0.748810 +vt 0.402384 0.737539 +vt 0.414283 0.732612 +vt 0.419552 0.742929 +vt 0.427993 0.735917 +vt 0.426851 0.741709 +vt 0.344106 0.730624 +vt 0.330264 0.733596 +vt 0.355924 0.735873 +vt 0.345272 0.746925 +vt 0.338558 0.740847 +vt 0.331263 0.739437 +vt 0.416980 0.784528 +vt 0.402816 0.787448 +vt 0.399599 0.759583 +vt 0.412712 0.764696 +vt 0.384657 0.795423 +vt 0.384658 0.752861 +vt 0.373335 0.751720 +vt 0.358163 0.758083 +vt 0.372270 0.794472 +vt 0.354223 0.785988 +vt 0.340072 0.782683 +vt 0.344867 0.762877 +vt 0.393131 0.818442 +vt 0.408920 0.809841 +vt 0.418563 0.827788 +vt 0.422947 0.802247 +vt 0.431514 0.817618 +vt 0.347510 0.808325 +vt 0.333617 0.800325 +vt 0.363148 0.817384 +vt 0.337347 0.826103 +vt 0.324605 0.815540 +vt 0.432392 0.842316 +vt 0.443580 0.830404 +vt 0.323061 0.840331 +vt 0.312141 0.828061 +vt 0.812198 0.213951 +vt 0.820073 0.216574 +vt 0.816266 0.203086 +vt 0.820686 0.206424 +vt 0.825107 0.209762 +vt 0.827197 0.214662 +vt 0.199767 0.214827 +vt 0.204798 0.210494 +vt 0.206958 0.220210 +vt 0.199417 0.218645 +vt 0.209828 0.206161 +vt 0.215391 0.216797 +vt 0.802821 0.202258 +vt 0.795502 0.189331 +vt 0.802192 0.184609 +vt 0.809229 0.193848 +vt 0.226485 0.183086 +vt 0.233684 0.188879 +vt 0.225609 0.203428 +vt 0.218157 0.194624 +vt 0.793802 0.183009 +vt 0.799106 0.180789 +vt 0.230055 0.179353 +vt 0.235688 0.181927 +vt 0.452764 0.821724 +vt 0.467554 0.830235 +vt 0.441512 0.810137 +vt 0.451051 0.802964 +vt 0.461899 0.813742 +vt 0.475726 0.821844 +vt 0.305373 0.800299 +vt 0.314760 0.807757 +vt 0.303149 0.819093 +vt 0.294190 0.810831 +vt 0.288063 0.827242 +vt 0.280085 0.818591 +vt 0.433448 0.796668 +vt 0.427392 0.781944 +vt 0.436210 0.778061 +vt 0.442865 0.790824 +vt 0.320932 0.775685 +vt 0.329683 0.779815 +vt 0.323216 0.794443 +vt 0.313915 0.788326 +vt 0.422167 0.766592 +vt 0.420500 0.754265 +vt 0.426815 0.757343 +vt 0.429958 0.765413 +vt 0.330900 0.755130 +vt 0.337317 0.752202 +vt 0.335326 0.764535 +vt 0.327537 0.763150 +vt 0.425119 0.748614 +vt 0.431772 0.744946 +vt 0.437934 0.749084 +vt 0.431216 0.753471 +vt 0.319953 0.746555 +vt 0.326243 0.742561 +vt 0.332826 0.746412 +vt 0.326582 0.751130 +vt 0.436206 0.738566 +vt 0.438509 0.731576 +vt 0.445433 0.734403 +vt 0.442947 0.742075 +vt 0.312804 0.731633 +vt 0.319822 0.728975 +vt 0.321956 0.736046 +vt 0.315103 0.739394 +vt 0.438769 0.726080 +vt 0.440211 0.720712 +vt 0.444070 0.722997 +vt 0.444570 0.728023 +vt 0.314462 0.720230 +vt 0.318390 0.718037 +vt 0.319700 0.723457 +vt 0.313832 0.725256 +vt 0.446061 0.714104 +vt 0.458719 0.712454 +vt 0.461005 0.720964 +vt 0.448865 0.720462 +vt 0.297533 0.717756 +vt 0.300043 0.709284 +vt 0.312691 0.711265 +vt 0.309718 0.717567 +vt 0.486234 0.834477 +vt 0.507497 0.833869 +vt 0.492848 0.825954 +vt 0.511534 0.825802 +vt 0.269185 0.830990 +vt 0.262777 0.822248 +vt 0.247846 0.829790 +vt 0.244016 0.821576 +vt 0.530038 0.827833 +vt 0.548289 0.817326 +vt 0.530052 0.821112 +vt 0.543283 0.811964 +vt 0.225378 0.823096 +vt 0.225553 0.816345 +vt 0.207347 0.812028 +vt 0.212526 0.806786 +vt 0.556681 0.803304 +vt 0.556901 0.788047 +vt 0.548593 0.800602 +vt 0.547784 0.788523 +vt 0.199322 0.797709 +vt 0.207519 0.795227 +vt 0.199540 0.782389 +vt 0.208678 0.783127 +vt 0.550636 0.773835 +vt 0.539246 0.760680 +vt 0.542657 0.777226 +vt 0.533477 0.766384 +vt 0.206237 0.768316 +vt 0.214148 0.771943 +vt 0.218040 0.755453 +vt 0.223666 0.761335 +vt 0.524091 0.748593 +vt 0.504695 0.736157 +vt 0.520508 0.755673 +vt 0.503273 0.744104 +vt 0.233573 0.743764 +vt 0.236970 0.750961 +vt 0.253350 0.731832 +vt 0.254563 0.739837 +vt 0.480584 0.721958 +vt 0.481289 0.730690 +vt 0.277885 0.718239 +vt 0.276949 0.726974 +vt 0.452240 0.747962 +vt 0.445761 0.755176 +vt 0.455400 0.739499 +vt 0.466859 0.747047 +vt 0.462582 0.756036 +vt 0.454669 0.763299 +vt 0.290987 0.743759 +vt 0.302676 0.736487 +vt 0.305629 0.745059 +vt 0.295043 0.752888 +vt 0.311943 0.752465 +vt 0.302793 0.760384 +vt 0.472472 0.766110 +vt 0.464072 0.773530 +vt 0.478260 0.757229 +vt 0.488959 0.768081 +vt 0.481838 0.776645 +vt 0.473719 0.784314 +vt 0.268265 0.764268 +vt 0.279285 0.753671 +vt 0.284855 0.762733 +vt 0.275177 0.773052 +vt 0.293086 0.770402 +vt 0.283117 0.780967 +vt 0.490606 0.786100 +vt 0.483357 0.794099 +vt 0.498311 0.777638 +vt 0.506764 0.785137 +vt 0.499283 0.793344 +vt 0.493518 0.801648 +vt 0.249939 0.780890 +vt 0.258625 0.773601 +vt 0.266123 0.782302 +vt 0.257217 0.789333 +vt 0.273180 0.790528 +vt 0.262775 0.797826 +vt 0.508378 0.797243 +vt 0.504736 0.805721 +vt 0.514765 0.789813 +vt 0.522193 0.793010 +vt 0.519588 0.798948 +vt 0.517494 0.807630 +vt 0.234236 0.788355 +vt 0.241781 0.785358 +vt 0.247981 0.792993 +vt 0.236682 0.794389 +vt 0.251401 0.801603 +vt 0.238540 0.803163 +vt 0.499287 0.815830 +vt 0.513829 0.816992 +vt 0.485023 0.811731 +vt 0.271027 0.808182 +vt 0.256591 0.811904 +vt 0.241957 0.812666 +vt 0.462622 0.793722 +vt 0.472942 0.803924 +vt 0.283368 0.800673 +vt 0.294004 0.790710 +vt 0.453638 0.782440 +vt 0.445590 0.771244 +vt 0.311696 0.768596 +vt 0.303323 0.779623 +vt 0.438078 0.761300 +vt 0.319494 0.758811 +vt 0.453126 0.729630 +vt 0.465025 0.733926 +vt 0.293165 0.730648 +vt 0.305209 0.726649 +vt 0.497066 0.755990 +vt 0.480857 0.743935 +vt 0.277032 0.740268 +vt 0.260464 0.751923 +vt 0.520406 0.775343 +vt 0.510097 0.766425 +vt 0.247114 0.762030 +vt 0.236527 0.770686 +vt 0.533439 0.790435 +vt 0.528445 0.782846 +vt 0.228249 0.777983 +vt 0.223021 0.785453 +vt 0.532275 0.808688 +vt 0.534611 0.799609 +vt 0.221583 0.794627 +vt 0.223671 0.803807 +vt 0.526743 0.815988 +vt 0.229019 0.811294 +vt 0.492632 0.667222 +vt 0.523352 0.690074 +vt 0.465874 0.641962 +vt 0.507960 0.626656 +vt 0.528528 0.655847 +vt 0.553068 0.682536 +vt 0.253280 0.623071 +vt 0.294662 0.638716 +vt 0.267297 0.663165 +vt 0.231929 0.651281 +vt 0.235945 0.685198 +vt 0.206572 0.677006 +vt 0.549123 0.711844 +vt 0.572334 0.733105 +vt 0.572286 0.706958 +vt 0.588280 0.728364 +vt 0.209549 0.706259 +vt 0.186581 0.700741 +vt 0.185684 0.726865 +vt 0.169886 0.721631 +vt 0.595375 0.754431 +vt 0.620810 0.767292 +vt 0.603149 0.746004 +vt 0.619756 0.755543 +vt 0.161926 0.747534 +vt 0.154420 0.738822 +vt 0.136030 0.759585 +vt 0.137477 0.747836 +vt 0.707492 0.759884 +vt 0.663727 0.775750 +vt 0.651200 0.763158 +vt 0.679266 0.742526 +vt 0.637004 0.751745 +vt 0.653228 0.735238 +vt 0.105751 0.754337 +vt 0.120342 0.743429 +vt 0.092794 0.766459 +vt 0.049526 0.748824 +vt 0.078675 0.732719 +vt 0.104797 0.726450 +vt 0.745511 0.652100 +vt 0.726501 0.705992 +vt 0.697726 0.705897 +vt 0.707312 0.662584 +vt 0.662804 0.705755 +vt 0.665943 0.669383 +vt 0.062384 0.695666 +vt 0.096615 0.696979 +vt 0.034467 0.694286 +vt 0.019409 0.639749 +vt 0.055680 0.652866 +vt 0.095280 0.661418 +vt 0.740843 0.572428 +vt 0.743177 0.612264 +vt 0.708753 0.621905 +vt 0.706123 0.582542 +vt 0.662860 0.632212 +vt 0.671403 0.592656 +vt 0.057364 0.614013 +vt 0.100277 0.626171 +vt 0.026537 0.602076 +vt 0.033664 0.564403 +vt 0.066133 0.582039 +vt 0.111371 0.595474 +vt 0.607563 0.675836 +vt 0.594028 0.643852 +vt 0.579497 0.612535 +vt 0.167361 0.638772 +vt 0.182968 0.608904 +vt 0.152631 0.669272 +vt 0.615585 0.705518 +vt 0.619188 0.729077 +vt 0.138972 0.721397 +vt 0.143475 0.698159 +vt 0.619467 0.742688 +vt 0.138198 0.734952 +vt 0.835231 0.207140 +vt 0.838530 0.201059 +vt 0.831932 0.213221 +vt 0.834578 0.206879 +vt 0.834641 0.206919 +vt 0.834705 0.206959 +vt 0.042440 0.543531 +vt 0.080685 0.559880 +vt 0.051216 0.522659 +vt 0.098128 0.542627 +vt 0.145041 0.562595 +vt 0.128325 0.573563 +vt 0.620420 0.565675 +vt 0.645911 0.579166 +vt 0.568491 0.584855 +vt 0.559246 0.558995 +vt 0.500657 0.594728 +vt 0.498072 0.552315 +vt 0.194754 0.581916 +vt 0.261251 0.591882 +vt 0.204630 0.556368 +vt 0.264218 0.550140 +vt 0.444556 0.582103 +vt 0.451996 0.612966 +vt 0.309096 0.610407 +vt 0.317066 0.580168 +vn 0.7273 -0.1123 0.6770 +vn 0.6470 -0.3278 0.6885 +vn 0.6658 -0.3430 0.6626 +vn 0.7475 -0.1217 0.6530 +vn -0.6658 -0.3430 0.6626 +vn -0.6470 -0.3278 0.6885 +vn -0.7273 -0.1123 0.6770 +vn -0.7475 -0.1217 0.6530 +vn 0.8357 -0.1487 0.5287 +vn 0.7404 -0.4154 0.5284 +vn 0.7666 -0.4493 0.4586 +vn 0.8709 -0.1601 0.4646 +vn -0.7666 -0.4493 0.4586 +vn -0.7404 -0.4154 0.5284 +vn -0.8357 -0.1487 0.5287 +vn -0.8709 -0.1601 0.4646 +vn 0.5368 -0.6566 0.5298 +vn 0.2687 -0.7999 0.5366 +vn 0.2578 -0.8623 0.4359 +vn 0.5454 -0.7103 0.4450 +vn -0.2578 -0.8623 0.4359 +vn -0.2687 -0.7999 0.5366 +vn -0.5368 -0.6566 0.5298 +vn -0.5454 -0.7103 0.4450 +vn 0.4685 -0.5130 0.7193 +vn 0.2654 -0.6038 0.7516 +vn 0.2708 -0.6392 0.7198 +vn 0.4893 -0.5353 0.6885 +vn -0.2708 -0.6392 0.7198 +vn -0.2654 -0.6038 0.7516 +vn -0.4685 -0.5130 0.7193 +vn -0.4893 -0.5353 0.6885 +vn 0.0158 -0.6277 0.7783 +vn -0.2383 -0.5553 0.7968 +vn -0.2682 -0.5807 0.7687 +vn -0.0056 -0.6633 0.7483 +vn 0.2682 -0.5807 0.7687 +vn 0.2383 -0.5553 0.7968 +vn -0.0158 -0.6277 0.7783 +vn 0.0056 -0.6633 0.7483 +vn -0.0755 -0.8283 0.5551 +vn -0.3820 -0.7169 0.5832 +vn -0.4211 -0.7697 0.4799 +vn -0.1034 -0.8883 0.4476 +vn 0.4211 -0.7697 0.4799 +vn 0.3820 -0.7169 0.5832 +vn 0.0755 -0.8283 0.5551 +vn 0.1034 -0.8883 0.4476 +vn -0.6383 -0.4619 0.6159 +vn -0.7558 -0.1624 0.6343 +vn -0.8211 -0.1789 0.5420 +vn -0.6910 -0.5023 0.5198 +vn 0.8211 -0.1789 0.5420 +vn 0.7558 -0.1624 0.6343 +vn 0.6383 -0.4619 0.6159 +vn 0.6910 -0.5023 0.5198 +vn -0.4701 -0.3509 0.8099 +vn -0.5701 -0.1161 0.8133 +vn -0.5928 -0.1243 0.7957 +vn -0.4956 -0.3679 0.7868 +vn 0.5928 -0.1243 0.7957 +vn 0.5701 -0.1161 0.8133 +vn 0.4701 -0.3509 0.8099 +vn 0.4956 -0.3679 0.7868 +vn -0.5732 0.1137 0.8115 +vn -0.4898 0.3470 0.7998 +vn -0.5053 0.3667 0.7811 +vn -0.5944 0.1232 0.7946 +vn 0.5053 0.3667 0.7811 +vn 0.4898 0.3470 0.7998 +vn 0.5732 0.1137 0.8115 +vn 0.5944 0.1232 0.7946 +vn -0.7547 0.1607 0.6361 +vn -0.6355 0.4531 0.6252 +vn -0.6861 0.4865 0.5409 +vn -0.8191 0.1757 0.5462 +vn 0.6861 0.4865 0.5409 +vn 0.6355 0.4531 0.6252 +vn 0.7547 0.1607 0.6361 +vn 0.8191 0.1757 0.5462 +vn -0.3748 0.7043 0.6028 +vn -0.0681 0.8125 0.5789 +vn -0.0889 0.8613 0.5002 +vn -0.4079 0.7482 0.5233 +vn 0.0889 0.8613 0.5002 +vn 0.0681 0.8125 0.5789 +vn 0.3748 0.7043 0.6028 +vn 0.4079 0.7482 0.5233 +vn -0.2643 0.5756 0.7738 +vn 0.0034 0.6622 0.7493 +vn -0.0121 0.6811 0.7321 +vn -0.2810 0.5914 0.7559 +vn 0.0121 0.6811 0.7321 +vn -0.0034 0.6622 0.7493 +vn 0.2643 0.5756 0.7738 +vn 0.2810 0.5914 0.7559 +vn 0.2665 0.6372 0.7231 +vn 0.4834 0.5317 0.6955 +vn 0.4964 0.5449 0.6758 +vn 0.2712 0.6563 0.7041 +vn -0.4964 0.5449 0.6758 +vn -0.4834 0.5317 0.6955 +vn -0.2665 0.6372 0.7231 +vn -0.2712 0.6563 0.7041 +vn 0.2698 0.7839 0.5592 +vn 0.5355 0.6437 0.5467 +vn 0.5442 0.6864 0.4824 +vn 0.2616 0.8339 0.4859 +vn -0.5442 0.6864 0.4824 +vn -0.5355 0.6437 0.5467 +vn -0.2698 0.7839 0.5592 +vn -0.2616 0.8339 0.4859 +vn 0.7396 0.4071 0.5360 +vn 0.8350 0.1471 0.5302 +vn 0.8697 0.1571 0.4679 +vn 0.7654 0.4336 0.4755 +vn -0.8697 0.1571 0.4679 +vn -0.8350 0.1471 0.5302 +vn -0.7396 0.4071 0.5360 +vn -0.7654 0.4336 0.4755 +vn 0.6612 0.3238 0.6768 +vn 0.7296 0.1099 0.6750 +vn 0.7487 0.1206 0.6518 +vn 0.6727 0.3417 0.6563 +vn -0.7487 0.1206 0.6518 +vn -0.7296 0.1099 0.6750 +vn -0.6612 0.3238 0.6768 +vn -0.6727 0.3417 0.6563 +vn 0.8979 0.1457 0.4155 +vn 0.8088 0.4421 0.3878 +vn 0.7208 0.3667 0.5882 +vn 0.7994 0.0976 0.5928 +vn -0.7208 0.3667 0.5882 +vn -0.8088 0.4421 0.3878 +vn -0.8979 0.1457 0.4155 +vn -0.7994 0.0976 0.5928 +vn 0.5572 0.7508 0.3547 +vn 0.2459 0.9127 0.3264 +vn 0.2579 0.8107 0.5255 +vn 0.5565 0.6116 0.5624 +vn -0.2579 0.8107 0.5255 +vn -0.2459 0.9127 0.3264 +vn -0.5572 0.7508 0.3547 +vn -0.5565 0.6116 0.5624 +vn -0.1284 0.9357 0.3286 +vn -0.4835 0.7944 0.3676 +vn -0.4298 0.7033 0.5662 +vn -0.0514 0.8484 0.5268 +vn 0.4298 0.7033 0.5662 +vn 0.4835 0.7944 0.3676 +vn 0.1284 0.9357 0.3286 +vn 0.0514 0.8484 0.5268 +vn -0.7740 0.4956 0.3941 +vn -0.9044 0.1782 0.3877 +vn -0.8385 0.1470 0.5247 +vn -0.6746 0.4757 0.5644 +vn 0.8385 0.1470 0.5247 +vn 0.9044 0.1782 0.3877 +vn 0.7740 0.4956 0.3941 +vn 0.6746 0.4757 0.5644 +vn -0.9014 -0.1851 0.3913 +vn -0.7496 -0.5180 0.4121 +vn -0.6662 -0.5074 0.5465 +vn -0.8390 -0.1538 0.5220 +vn 0.6662 -0.5074 0.5465 +vn 0.7496 -0.5180 0.4121 +vn 0.9014 -0.1851 0.3913 +vn 0.8390 -0.1538 0.5220 +vn -0.4559 -0.7923 0.4054 +vn -0.1155 -0.9190 0.3771 +vn -0.0661 -0.8733 0.4827 +vn -0.4326 -0.7287 0.5310 +vn 0.0661 -0.8733 0.4827 +vn 0.1155 -0.9190 0.3771 +vn 0.4559 -0.7923 0.4054 +vn 0.4326 -0.7287 0.5310 +vn 0.2516 -0.8928 0.3737 +vn 0.5426 -0.7431 0.3916 +vn 0.5520 -0.6403 0.5341 +vn 0.2546 -0.8374 0.4836 +vn -0.5520 -0.6403 0.5341 +vn -0.5426 -0.7431 0.3916 +vn -0.2516 -0.8928 0.3737 +vn -0.2546 -0.8374 0.4836 +vn 0.7901 -0.4607 0.4043 +vn 0.8956 -0.1513 0.4183 +vn 0.7999 -0.1021 0.5914 +vn 0.7153 -0.3948 0.5766 +vn -0.7999 -0.1021 0.5914 +vn -0.8956 -0.1513 0.4183 +vn -0.7901 -0.4607 0.4043 +vn -0.7153 -0.3948 0.5766 +vn 0.3463 -0.0436 0.9371 +vn 0.4246 -0.1483 0.8932 +vn 0.4653 -0.0290 0.8847 +vn -0.4653 -0.0290 0.8847 +vn -0.4246 -0.1483 0.8932 +vn -0.3463 -0.0436 0.9371 +vn 0.2531 -0.2854 0.9244 +vn 0.3780 -0.2127 0.9010 +vn 0.2775 -0.1178 0.9535 +vn -0.2775 -0.1178 0.9535 +vn -0.3780 -0.2127 0.9010 +vn -0.2531 -0.2854 0.9244 +vn 0.1272 -0.1176 0.9849 +vn -0.0284 -0.2304 0.9727 +vn 0.1457 -0.2960 0.9440 +vn -0.1457 -0.2960 0.9440 +vn 0.0284 -0.2304 0.9727 +vn -0.1272 -0.1176 0.9849 +vn 0.0156 -0.0210 0.9997 +vn -0.1662 -0.0169 0.9859 +vn -0.1075 -0.1515 0.9826 +vn 0.1075 -0.1515 0.9826 +vn 0.1662 -0.0169 0.9859 +vn -0.0156 -0.0210 0.9997 +vn 0.0156 0.0200 0.9997 +vn -0.1069 0.1401 0.9843 +vn -0.1659 0.0162 0.9860 +vn 0.1659 0.0162 0.9860 +vn 0.1069 0.1401 0.9843 +vn -0.0156 0.0200 0.9997 +vn 0.1282 0.1118 0.9854 +vn 0.1503 0.2778 0.9488 +vn -0.0240 0.2162 0.9761 +vn 0.0240 0.2162 0.9761 +vn -0.1503 0.2778 0.9488 +vn -0.1282 0.1118 0.9854 +vn 0.2768 0.1120 0.9544 +vn 0.3758 0.1997 0.9049 +vn 0.2510 0.2681 0.9301 +vn -0.2510 0.2681 0.9301 +vn -0.3758 0.1997 0.9049 +vn -0.2768 0.1120 0.9544 +vn 0.3465 0.0413 0.9372 +vn 0.4650 0.0277 0.8849 +vn 0.4247 0.1372 0.8949 +vn -0.4247 0.1372 0.8949 +vn -0.4650 0.0277 0.8849 +vn -0.3465 0.0413 0.9372 +vn 0.1386 -0.9493 0.2823 +vn 0.1343 -0.8291 0.5428 +vn 0.0586 -0.8311 0.5530 +vn 0.0617 -0.9498 0.3066 +vn -0.0586 -0.8311 0.5530 +vn -0.1343 -0.8291 0.5428 +vn -0.1386 -0.9493 0.2823 +vn -0.0617 -0.9498 0.3066 +vn 0.3460 -0.8864 0.3076 +vn 0.3308 -0.7099 0.6218 +vn 0.1854 -0.8199 0.5416 +vn 0.1804 -0.9479 0.2627 +vn -0.1854 -0.8199 0.5416 +vn -0.3308 -0.7099 0.6218 +vn -0.3460 -0.8864 0.3076 +vn -0.1804 -0.9479 0.2627 +vn 0.8726 -0.2473 0.4212 +vn 0.5837 -0.3099 0.7505 +vn 0.4816 -0.5002 0.7196 +vn 0.6655 -0.6181 0.4184 +vn -0.4816 -0.5002 0.7196 +vn -0.5837 -0.3099 0.7505 +vn -0.8726 -0.2473 0.4212 +vn -0.6655 -0.6181 0.4184 +vn 0.9246 0.0556 0.3769 +vn 0.6879 -0.0206 0.7255 +vn 0.6616 -0.1407 0.7365 +vn 0.9240 -0.0404 0.3803 +vn -0.6616 -0.1407 0.7365 +vn -0.6879 -0.0206 0.7255 +vn -0.9246 0.0556 0.3769 +vn -0.9240 -0.0404 0.3803 +vn 0.9095 0.1563 0.3852 +vn 0.7133 0.0892 0.6952 +vn 0.6931 0.0419 0.7196 +vn 0.9166 0.1049 0.3859 +vn -0.6931 0.0419 0.7196 +vn -0.7133 0.0892 0.6952 +vn -0.9095 0.1563 0.3852 +vn -0.9166 0.1049 0.3859 +vn 0.3722 -0.8474 0.3788 +vn 0.3239 -0.8441 0.4273 +vn 0.3732 -0.6960 0.6134 +vn 0.4153 -0.6949 0.5870 +vn -0.3732 -0.6960 0.6134 +vn -0.3239 -0.8441 0.4273 +vn -0.3722 -0.8474 0.3788 +vn -0.4153 -0.6949 0.5870 +vn 0.3888 -0.7907 0.4728 +vn 0.5118 -0.7186 0.4709 +vn 0.4603 -0.5651 0.6847 +vn 0.3919 -0.6473 0.6538 +vn -0.4603 -0.5651 0.6847 +vn -0.5118 -0.7186 0.4709 +vn -0.3888 -0.7907 0.4728 +vn -0.3919 -0.6473 0.6538 +vn 0.6692 -0.6010 0.4370 +vn 0.7616 -0.4716 0.4444 +vn 0.6577 -0.3656 0.6586 +vn 0.5934 -0.4448 0.6708 +vn -0.6577 -0.3656 0.6586 +vn -0.7616 -0.4716 0.4444 +vn -0.6692 -0.6010 0.4370 +vn -0.5934 -0.4448 0.6708 +vn 0.7994 -0.3620 0.4796 +vn 0.8281 -0.2154 0.5176 +vn 0.5973 -0.3152 0.7375 +vn 0.6416 -0.3429 0.6861 +vn -0.5973 -0.3152 0.7375 +vn -0.8281 -0.2154 0.5176 +vn -0.7994 -0.3620 0.4796 +vn -0.6416 -0.3429 0.6861 +vn 0.7792 0.3032 0.5486 +vn 0.4971 0.7392 0.4544 +vn 0.5156 0.2235 0.8271 +vn 0.5907 -0.1699 0.7888 +vn -0.5156 0.2235 0.8271 +vn -0.4971 0.7392 0.4544 +vn -0.7792 0.3032 0.5486 +vn -0.5907 -0.1699 0.7888 +vn 0.5118 0.7686 0.3839 +vn 0.5510 0.7439 0.3782 +vn 0.4628 0.4217 0.7798 +vn 0.4688 0.4069 0.7840 +vn -0.4628 0.4217 0.7798 +vn -0.5510 0.7439 0.3782 +vn -0.5118 0.7686 0.3839 +vn -0.4688 0.4069 0.7840 +vn 0.6225 0.6683 0.4072 +vn 0.5438 0.7126 0.4432 +vn 0.4234 0.3740 0.8251 +vn 0.4880 0.3713 0.7900 +vn -0.4234 0.3740 0.8251 +vn -0.5438 0.7126 0.4432 +vn -0.6225 0.6683 0.4072 +vn -0.4880 0.3713 0.7900 +vn 0.1427 0.8502 0.5068 +vn -0.3976 0.7662 0.5048 +vn -0.1175 0.3644 0.9238 +vn 0.1878 0.4009 0.8967 +vn 0.1175 0.3644 0.9238 +vn 0.3976 0.7662 0.5048 +vn -0.1427 0.8502 0.5068 +vn -0.1878 0.4009 0.8967 +vn -0.7677 0.4928 0.4097 +vn -0.8422 0.4179 0.3407 +vn -0.5150 0.2551 0.8184 +vn -0.3953 0.2739 0.8768 +vn 0.5150 0.2551 0.8184 +vn 0.8422 0.4179 0.3407 +vn 0.7677 0.4928 0.4097 +vn 0.3953 0.2739 0.8768 +vn -0.7543 0.5615 0.3403 +vn -0.3883 0.8222 0.4162 +vn -0.3145 0.4157 0.8534 +vn -0.5073 0.3177 0.8011 +vn 0.3145 0.4157 0.8534 +vn 0.3883 0.8222 0.4162 +vn 0.7543 0.5615 0.3403 +vn 0.5073 0.3177 0.8011 +vn 0.4513 -0.3587 0.8171 +vn 0.4014 -0.3659 0.8397 +vn 0.3053 -0.2281 0.9245 +vn 0.2972 -0.2387 0.9245 +vn -0.3053 -0.2281 0.9245 +vn -0.4014 -0.3659 0.8397 +vn -0.4513 -0.3587 0.8171 +vn -0.2972 -0.2387 0.9245 +vn 0.2871 -0.3945 0.8729 +vn 0.1555 -0.4262 0.8911 +vn 0.1692 -0.2712 0.9475 +vn 0.2389 -0.2508 0.9381 +vn -0.1692 -0.2712 0.9475 +vn -0.1555 -0.4262 0.8911 +vn -0.2871 -0.3945 0.8729 +vn -0.2389 -0.2508 0.9381 +vn 0.0208 -0.4510 0.8923 +vn 0.0869 -0.3102 0.9467 +vn 0.1083 -0.2879 0.9515 +vn 0.0379 -0.4411 0.8967 +vn -0.1083 -0.2879 0.9515 +vn -0.0869 -0.3102 0.9467 +vn -0.0208 -0.4510 0.8923 +vn -0.0379 -0.4411 0.8967 +vn -0.0053 -0.5709 0.8210 +vn 0.0941 -0.4058 0.9091 +vn 0.0853 -0.3560 0.9306 +vn 0.0342 -0.5096 0.8597 +vn -0.0853 -0.3560 0.9306 +vn -0.0941 -0.4058 0.9091 +vn 0.0053 -0.5709 0.8210 +vn -0.0342 -0.5096 0.8597 +vn 0.0967 -0.3017 0.9485 +vn 0.2907 -0.4003 0.8691 +vn 0.1877 -0.4405 0.8779 +vn 0.0029 -0.4905 0.8714 +vn -0.1877 -0.4405 0.8779 +vn -0.2907 -0.4003 0.8691 +vn -0.0967 -0.3017 0.9485 +vn -0.0029 -0.4905 0.8714 +vn 0.3645 -0.1702 0.9155 +vn 0.4821 -0.2710 0.8332 +vn 0.3780 -0.2958 0.8773 +vn 0.2342 -0.1821 0.9550 +vn -0.3780 -0.2958 0.8773 +vn -0.4821 -0.2710 0.8332 +vn -0.3645 -0.1702 0.9155 +vn -0.2342 -0.1821 0.9550 +vn 0.4084 -0.2560 0.8761 +vn 0.4697 -0.3069 0.8278 +vn 0.5088 -0.2748 0.8159 +vn 0.4167 -0.2150 0.8832 +vn -0.5088 -0.2748 0.8159 +vn -0.4697 -0.3069 0.8278 +vn -0.4084 -0.2560 0.8761 +vn -0.4167 -0.2150 0.8832 +vn 0.3237 -0.3313 0.8863 +vn 0.3712 -0.4418 0.8167 +vn 0.4106 -0.4069 0.8160 +vn 0.3841 -0.3255 0.8640 +vn -0.4106 -0.4069 0.8160 +vn -0.3712 -0.4418 0.8167 +vn -0.3237 -0.3313 0.8863 +vn -0.3841 -0.3255 0.8640 +vn 0.2773 0.0217 0.9605 +vn 0.3758 -0.1066 0.9205 +vn 0.3752 -0.3377 0.8632 +vn 0.3038 -0.1254 0.9444 +vn -0.3752 -0.3377 0.8632 +vn -0.3758 -0.1066 0.9205 +vn -0.2773 0.0217 0.9605 +vn -0.3038 -0.1254 0.9444 +vn 0.0730 0.0954 0.9928 +vn -0.0891 0.0895 0.9920 +vn -0.1548 0.1570 0.9754 +vn -0.0195 0.1299 0.9913 +vn 0.1548 0.1570 0.9754 +vn 0.0891 0.0895 0.9920 +vn -0.0730 0.0954 0.9928 +vn 0.0195 0.1299 0.9913 +vn 0.4037 -0.3369 0.8506 +vn 0.2042 -0.2888 0.9354 +vn 0.1507 -0.2779 0.9487 +vn 0.3030 -0.2626 0.9161 +vn -0.1507 -0.2779 0.9487 +vn -0.2042 -0.2888 0.9354 +vn -0.4037 -0.3369 0.8506 +vn -0.3030 -0.2626 0.9161 +vn 0.1957 -0.1996 0.9601 +vn 0.1170 -0.2806 0.9527 +vn 0.0657 -0.2660 0.9617 +vn 0.0804 -0.1875 0.9790 +vn -0.0657 -0.2660 0.9617 +vn -0.1170 -0.2806 0.9527 +vn -0.1957 -0.1996 0.9601 +vn -0.0804 -0.1875 0.9790 +vn -0.0210 -0.0864 0.9960 +vn -0.0535 -0.0981 0.9937 +vn -0.0077 -0.1827 0.9831 +vn 0.0243 -0.2264 0.9737 +vn 0.0077 -0.1827 0.9831 +vn 0.0535 -0.0981 0.9937 +vn 0.0210 -0.0864 0.9960 +vn -0.0243 -0.2264 0.9737 +vn 0.0882 -0.6473 0.7571 +vn 0.0268 -0.6653 0.7461 +vn 0.0468 -0.7500 0.6598 +vn 0.1148 -0.7353 0.6679 +vn -0.0468 -0.7500 0.6598 +vn -0.0268 -0.6653 0.7461 +vn -0.0882 -0.6473 0.7571 +vn -0.1148 -0.7353 0.6679 +vn 0.2442 -0.4371 0.8656 +vn 0.1519 -0.5765 0.8028 +vn 0.1717 -0.6888 0.7044 +vn 0.2892 -0.5401 0.7904 +vn -0.1717 -0.6888 0.7044 +vn -0.1519 -0.5765 0.8028 +vn -0.2442 -0.4371 0.8656 +vn -0.2892 -0.5401 0.7904 +vn 0.3063 -0.1983 0.9311 +vn 0.3152 -0.2848 0.9053 +vn 0.3730 -0.3737 0.8493 +vn 0.3970 -0.2731 0.8762 +vn -0.3730 -0.3737 0.8493 +vn -0.3152 -0.2848 0.9053 +vn -0.3063 -0.1983 0.9311 +vn -0.3970 -0.2731 0.8762 +vn 0.4643 0.0168 0.8855 +vn 0.2465 -0.0215 0.9689 +vn 0.2582 -0.0387 0.9653 +vn 0.4618 -0.0107 0.8869 +vn -0.2582 -0.0387 0.9653 +vn -0.2465 -0.0215 0.9689 +vn -0.4643 0.0168 0.8855 +vn -0.4618 -0.0107 0.8869 +vn 0.2860 -0.1432 0.9475 +vn 0.4332 -0.1748 0.8842 +vn 0.4652 -0.0608 0.8831 +vn 0.2759 -0.0656 0.9589 +vn -0.4652 -0.0608 0.8831 +vn -0.4332 -0.1748 0.8842 +vn -0.2860 -0.1432 0.9475 +vn -0.2759 -0.0656 0.9589 +vn 0.1046 -0.0387 0.9938 +vn 0.0063 -0.0386 0.9992 +vn -0.0009 0.0123 0.9999 +vn 0.0991 0.0114 0.9950 +vn 0.0009 0.0123 0.9999 +vn -0.0063 -0.0386 0.9992 +vn -0.1046 -0.0387 0.9938 +vn -0.0991 0.0114 0.9950 +vn 0.0992 -0.0540 0.9936 +vn 0.1006 -0.0381 0.9942 +vn 0.0000 -0.0462 0.9989 +vn -0.0006 -0.0602 0.9982 +vn -0.1006 -0.0381 0.9942 +vn -0.0992 -0.0540 0.9936 +vn 0.0006 -0.0602 0.9982 +vn 0.0057 -0.0606 0.9981 +vn 0.1152 -0.0604 0.9915 +vn 0.1106 -0.0465 0.9928 +vn 0.0016 -0.0360 0.9994 +vn -0.1106 -0.0465 0.9928 +vn -0.1152 -0.0604 0.9915 +vn -0.0057 -0.0606 0.9981 +vn -0.0016 -0.0360 0.9994 +vn 0.9181 -0.3140 0.2419 +vn 0.9298 -0.3663 0.0365 +vn 0.6495 -0.7310 0.2091 +vn 0.6386 -0.5515 0.5367 +vn -0.6495 -0.7310 0.2091 +vn -0.9298 -0.3663 0.0365 +vn -0.9181 -0.3140 0.2419 +vn -0.6386 -0.5515 0.5367 +vn 0.8574 0.5147 -0.0009 +vn 0.8786 0.4623 -0.1194 +vn 0.9952 0.0944 -0.0247 +vn 0.9890 0.1168 0.0907 +vn -0.9952 0.0944 -0.0247 +vn -0.8786 0.4623 -0.1194 +vn -0.8574 0.5147 -0.0009 +vn -0.9890 0.1168 0.0907 +vn -0.1074 0.7962 0.5954 +vn -0.1392 0.9876 -0.0731 +vn 0.3922 0.8867 -0.2450 +vn 0.3756 0.8780 0.2967 +vn -0.3922 0.8867 -0.2450 +vn 0.1392 0.9876 -0.0731 +vn 0.1074 0.7962 0.5954 +vn -0.3756 0.8780 0.2967 +vn -0.0108 0.7592 0.6508 +vn -0.7251 0.6838 0.0816 +vn -0.6736 0.6928 0.2575 +vn -0.5064 0.3843 0.7719 +vn 0.6736 0.6928 0.2575 +vn 0.7251 0.6838 0.0816 +vn 0.0108 0.7592 0.6508 +vn 0.5064 0.3843 0.7719 +vn 0.1232 -0.5545 0.8230 +vn 0.3364 -0.5638 0.7543 +vn 0.4669 -0.8186 0.3345 +vn 0.2183 -0.8974 0.3834 +vn -0.4669 -0.8186 0.3345 +vn -0.3364 -0.5638 0.7543 +vn -0.1232 -0.5545 0.8230 +vn -0.2183 -0.8974 0.3834 +vn 0.1820 -0.7319 0.6567 +vn 0.3599 -0.6937 0.6240 +vn 0.2443 -0.5823 0.7754 +vn 0.1174 -0.5306 0.8395 +vn -0.2443 -0.5823 0.7754 +vn -0.3599 -0.6937 0.6240 +vn -0.1820 -0.7319 0.6567 +vn -0.1174 -0.5306 0.8395 +vn -0.5357 0.7829 0.3162 +vn -0.2783 0.5637 0.7777 +vn -0.3046 0.5671 0.7652 +vn -0.5652 0.7127 0.4155 +vn 0.3046 0.5671 0.7652 +vn 0.2783 0.5637 0.7777 +vn 0.5357 0.7829 0.3162 +vn 0.5652 0.7127 0.4155 +vn -0.1157 0.9130 0.3912 +vn -0.0573 0.6306 0.7740 +vn 0.2624 0.5592 0.7864 +vn 0.4019 0.8455 0.3517 +vn -0.2624 0.5592 0.7864 +vn 0.0573 0.6306 0.7740 +vn 0.1157 0.9130 0.3912 +vn -0.4019 0.8455 0.3517 +vn 0.8110 0.4558 0.3668 +vn 0.4776 0.3746 0.7947 +vn 0.5212 0.1040 0.8471 +vn 0.9205 0.1167 0.3730 +vn -0.5212 0.1040 0.8471 +vn -0.4776 0.3746 0.7947 +vn -0.8110 0.4558 0.3668 +vn -0.9205 0.1167 0.3730 +vn 0.8092 -0.4216 0.4092 +vn 0.4019 -0.3967 0.8253 +vn 0.2733 -0.6372 0.7206 +vn 0.4566 -0.7153 0.5290 +vn -0.2733 -0.6372 0.7206 +vn -0.4019 -0.3967 0.8253 +vn -0.8092 -0.4216 0.4092 +vn -0.4566 -0.7153 0.5290 +vn -0.0039 0.1724 0.9850 +vn 0.1180 0.0811 0.9897 +vn 0.1769 0.3231 0.9297 +vn -0.0405 0.3806 0.9239 +vn -0.1769 0.3231 0.9297 +vn -0.1180 0.0811 0.9897 +vn 0.0039 0.1724 0.9850 +vn 0.0405 0.3806 0.9239 +vn -0.0169 -0.1911 0.9814 +vn 0.0452 -0.4015 0.9148 +vn 0.1316 -0.5000 0.8560 +vn 0.0762 -0.2808 0.9567 +vn -0.1316 -0.5000 0.8560 +vn -0.0452 -0.4015 0.9148 +vn 0.0169 -0.1911 0.9814 +vn -0.0762 -0.2808 0.9567 +vn -0.1258 -0.0262 0.9917 +vn -0.3067 -0.2224 0.9254 +vn -0.2398 -0.0343 0.9702 +vn -0.2423 0.0220 0.9700 +vn 0.2398 -0.0343 0.9702 +vn 0.3067 -0.2224 0.9254 +vn 0.1258 -0.0262 0.9917 +vn 0.2423 0.0220 0.9700 +vn -0.2695 -0.2832 0.9204 +vn 0.4785 -0.1181 0.8701 +vn 0.7159 -0.1356 0.6849 +vn 0.2945 -0.2960 0.9086 +vn -0.7159 -0.1356 0.6849 +vn -0.4785 -0.1181 0.8701 +vn 0.2695 -0.2832 0.9204 +vn -0.2945 -0.2960 0.9086 +vn 0.5980 -0.1937 0.7777 +vn 0.4002 -0.1785 0.8989 +vn 0.6366 0.0239 0.7708 +vn 0.7142 -0.0813 0.6952 +vn -0.6366 0.0239 0.7708 +vn -0.4002 -0.1785 0.8989 +vn -0.5980 -0.1937 0.7777 +vn -0.7142 -0.0813 0.6952 +vn 0.2856 -0.0108 0.9583 +vn 0.2432 0.0154 0.9699 +vn 0.4897 0.0613 0.8698 +vn 0.5478 0.0816 0.8326 +vn -0.4897 0.0613 0.8698 +vn -0.2432 0.0154 0.9699 +vn -0.2856 -0.0108 0.9583 +vn -0.5478 0.0816 0.8326 +vn 0.8932 0.2569 0.3691 +vn 0.8819 0.3300 0.3365 +vn 0.7877 0.2287 0.5720 +vn 0.7460 0.1691 0.6441 +vn -0.7877 0.2287 0.5720 +vn -0.8819 0.3300 0.3365 +vn -0.8932 0.2569 0.3691 +vn -0.7460 0.1691 0.6441 +vn 0.9006 0.2989 0.3155 +vn 0.9190 0.2536 0.3017 +vn 0.8801 0.1254 0.4579 +vn 0.8359 0.2064 0.5087 +vn -0.8801 0.1254 0.4579 +vn -0.9190 0.2536 0.3017 +vn -0.9006 0.2989 0.3155 +vn -0.8359 0.2064 0.5087 +vn 0.8200 -0.4526 0.3504 +vn 0.8136 -0.2784 0.5104 +vn 0.9110 0.0767 0.4053 +vn 0.9332 0.2382 0.2690 +vn -0.9110 0.0767 0.4053 +vn -0.8136 -0.2784 0.5104 +vn -0.8200 -0.4526 0.3504 +vn -0.9332 0.2382 0.2690 +vn 0.0798 -0.2245 0.9712 +vn 0.0520 -0.3423 0.9381 +vn 0.1527 -0.8959 0.4171 +vn 0.0593 -0.8662 0.4962 +vn -0.1527 -0.8959 0.4171 +vn -0.0520 -0.3423 0.9381 +vn -0.0798 -0.2245 0.9712 +vn -0.0593 -0.8662 0.4962 +vn 0.2086 -0.2434 0.9472 +vn 0.1842 -0.1704 0.9680 +vn -0.6732 -0.4369 0.5966 +vn -0.7792 -0.0464 0.6250 +vn 0.6732 -0.4369 0.5966 +vn -0.1842 -0.1704 0.9680 +vn -0.2086 -0.2434 0.9472 +vn 0.7792 -0.0464 0.6250 +vn 0.0328 -0.4066 0.9130 +vn 0.1141 -0.3580 0.9267 +vn -0.6856 0.1952 0.7014 +vn -0.5422 0.4296 0.7222 +vn 0.6856 0.1952 0.7014 +vn -0.1141 -0.3580 0.9267 +vn -0.0328 -0.4066 0.9130 +vn 0.5422 0.4296 0.7222 +vn -0.0048 -0.4085 0.9127 +vn 0.0028 -0.4061 0.9138 +vn -0.3110 0.6339 0.7081 +vn -0.0698 0.7044 0.7064 +vn 0.3110 0.6339 0.7081 +vn -0.0028 -0.4061 0.9138 +vn 0.0048 -0.4085 0.9127 +vn 0.0698 0.7044 0.7064 +vn -0.0780 0.9331 0.3511 +vn -0.3459 0.8768 0.3340 +vn -0.2793 0.7214 0.6337 +vn -0.0703 0.7184 0.6921 +vn 0.2793 0.7214 0.6337 +vn 0.3459 0.8768 0.3340 +vn 0.0780 0.9331 0.3511 +vn 0.0703 0.7184 0.6921 +vn -0.6231 0.7311 0.2777 +vn -0.8422 0.5039 0.1918 +vn -0.8465 0.4826 0.2250 +vn -0.5486 0.7208 0.4238 +vn 0.8465 0.4826 0.2250 +vn 0.8422 0.5039 0.1918 +vn 0.6231 0.7311 0.2777 +vn 0.5486 0.7208 0.4238 +vn -0.9846 0.1370 0.1084 +vn -0.8783 -0.4631 0.1187 +vn -0.7484 -0.5799 0.3217 +vn -0.9709 0.1792 0.1589 +vn 0.7484 -0.5799 0.3217 +vn 0.8783 -0.4631 0.1187 +vn 0.9846 0.1370 0.1084 +vn 0.9709 0.1792 0.1589 +vn 0.0703 -0.9817 0.1769 +vn 0.1584 -0.9714 0.1770 +vn 0.1269 -0.8843 0.4493 +vn 0.0888 -0.8956 0.4360 +vn -0.1269 -0.8843 0.4493 +vn -0.1584 -0.9714 0.1770 +vn -0.0703 -0.9817 0.1769 +vn -0.0888 -0.8956 0.4360 +vn 0.0412 -0.4702 0.8816 +vn -0.0091 -0.0868 0.9962 +vn -0.0145 -0.0876 0.9961 +vn 0.0673 -0.4848 0.8720 +vn 0.0145 -0.0876 0.9961 +vn 0.0091 -0.0868 0.9962 +vn -0.0412 -0.4702 0.8816 +vn -0.0673 -0.4848 0.8720 +vn -0.0608 -0.4990 0.8645 +vn -0.0210 -0.0299 0.9993 +vn -0.8477 0.2291 0.4784 +vn 0.8477 0.2291 0.4784 +vn 0.0210 -0.0299 0.9993 +vn 0.0608 -0.4990 0.8645 +vn -0.2258 -0.1698 0.9593 +vn -0.2384 -0.1937 0.9517 +vn -0.3201 -0.2054 0.9249 +vn -0.2647 -0.1414 0.9539 +vn 0.3201 -0.2054 0.9249 +vn 0.2384 -0.1937 0.9517 +vn 0.2258 -0.1698 0.9593 +vn 0.2647 -0.1414 0.9539 +vn -0.0559 -0.0784 0.9954 +vn -0.1589 -0.1119 0.9809 +vn -0.2196 -0.0592 0.9738 +vn -0.1602 -0.0133 0.9870 +vn 0.2196 -0.0592 0.9738 +vn 0.1589 -0.1119 0.9809 +vn 0.0559 -0.0784 0.9954 +vn 0.1602 -0.0133 0.9870 +vn 0.1080 -0.0820 0.9908 +vn 0.0337 -0.0812 0.9961 +vn -0.0985 0.0004 0.9951 +vn -0.0416 0.0293 0.9987 +vn 0.0985 0.0004 0.9951 +vn -0.0337 -0.0812 0.9961 +vn -0.1080 -0.0820 0.9908 +vn 0.0416 0.0293 0.9987 +vn -0.2294 -0.1590 0.9602 +vn -0.0707 -0.2584 0.9634 +vn -0.3075 -0.5433 0.7812 +vn -0.4120 -0.2694 0.8704 +vn 0.3075 -0.5433 0.7812 +vn 0.0707 -0.2584 0.9634 +vn 0.2294 -0.1590 0.9602 +vn 0.4120 -0.2694 0.8704 +vn 0.0675 -0.3683 0.9272 +vn 0.1214 -0.4982 0.8586 +vn 0.0574 -0.6162 0.7855 +vn -0.1165 -0.6608 0.7415 +vn -0.0574 -0.6162 0.7855 +vn -0.1214 -0.4982 0.8586 +vn -0.0675 -0.3683 0.9272 +vn 0.1165 -0.6608 0.7415 +vn 0.2874 -0.5650 0.7734 +vn 0.4513 -0.4912 0.7450 +vn 0.4493 -0.4744 0.7570 +vn 0.2727 -0.5515 0.7883 +vn -0.4493 -0.4744 0.7570 +vn -0.4513 -0.4912 0.7450 +vn -0.2874 -0.5650 0.7734 +vn -0.2727 -0.5515 0.7883 +vn 0.5072 -0.3954 0.7658 +vn 0.5127 -0.2828 0.8107 +vn 0.4975 -0.2184 0.8395 +vn 0.5175 -0.3628 0.7750 +vn -0.4975 -0.2184 0.8395 +vn -0.5127 -0.2828 0.8107 +vn -0.5072 -0.3954 0.7658 +vn -0.5175 -0.3628 0.7750 +vn 0.4826 -0.1550 0.8620 +vn 0.4265 -0.0825 0.9007 +vn 0.4601 -0.0647 0.8855 +vn 0.4597 -0.1218 0.8797 +vn -0.4601 -0.0647 0.8855 +vn -0.4265 -0.0825 0.9007 +vn -0.4826 -0.1550 0.8620 +vn -0.4597 -0.1218 0.8797 +vn 0.3552 -0.0597 0.9329 +vn 0.3088 -0.0828 0.9475 +vn 0.4678 0.0809 0.8801 +vn 0.4599 0.0091 0.8879 +vn -0.4678 0.0809 0.8801 +vn -0.3088 -0.0828 0.9475 +vn -0.3552 -0.0597 0.9329 +vn -0.4599 0.0091 0.8879 +vn 0.3479 -0.0238 0.9372 +vn 0.3614 0.1372 0.9223 +vn 0.4598 0.4842 0.7445 +vn 0.5038 0.2537 0.8257 +vn -0.4598 0.4842 0.7445 +vn -0.3614 0.1372 0.9223 +vn -0.3479 -0.0238 0.9372 +vn -0.5038 0.2537 0.8257 +vn 0.2612 0.1393 0.9552 +vn 0.1375 -0.0082 0.9905 +vn 0.1358 0.4258 0.8946 +vn 0.3136 0.5519 0.7727 +vn -0.1358 0.4258 0.8946 +vn -0.1375 -0.0082 0.9905 +vn -0.2612 0.1393 0.9552 +vn -0.3136 0.5519 0.7727 +vn 0.1749 -0.0932 0.9802 +vn 0.2118 -0.0874 0.9734 +vn 0.1272 0.2678 0.9550 +vn 0.1533 0.2998 0.9416 +vn -0.1272 0.2678 0.9550 +vn -0.2118 -0.0874 0.9734 +vn -0.1749 -0.0932 0.9802 +vn -0.1533 0.2998 0.9416 +vn 0.2023 -0.0731 0.9766 +vn 0.1716 -0.0703 0.9827 +vn 0.0039 0.1042 0.9946 +vn 0.0433 0.1989 0.9791 +vn -0.0039 0.1042 0.9946 +vn -0.1716 -0.0703 0.9827 +vn -0.2023 -0.0731 0.9766 +vn -0.0433 0.1989 0.9791 +vn 0.1764 -0.1175 0.9773 +vn 0.2503 -0.2080 0.9456 +vn 0.3984 -0.4479 0.8004 +vn 0.2580 -0.3856 0.8858 +vn -0.3984 -0.4479 0.8004 +vn -0.2503 -0.2080 0.9456 +vn -0.1764 -0.1175 0.9773 +vn -0.2580 -0.3856 0.8858 +vn 0.1419 -0.0502 0.9886 +vn 0.2098 -0.0241 0.9774 +vn 0.2619 -0.2812 0.9232 +vn 0.1641 -0.3470 0.9234 +vn -0.2619 -0.2812 0.9232 +vn -0.2098 -0.0241 0.9774 +vn -0.1419 -0.0502 0.9886 +vn -0.1641 -0.3470 0.9234 +vn 0.0634 -0.1816 0.9813 +vn -0.0526 -0.1007 0.9935 +vn -0.0843 -0.5566 0.8265 +vn -0.1348 -0.7754 0.6169 +vn 0.0843 -0.5566 0.8265 +vn 0.0526 -0.1007 0.9935 +vn -0.0634 -0.1816 0.9813 +vn 0.1348 -0.7754 0.6169 +vn 0.2005 -0.5067 0.8385 +vn 0.2383 -0.4064 0.8821 +vn -0.0812 -0.8427 0.5322 +vn -0.0640 -0.7747 0.6291 +vn 0.0812 -0.8427 0.5322 +vn -0.2383 -0.4064 0.8821 +vn -0.2005 -0.5067 0.8385 +vn 0.0640 -0.7747 0.6291 +vn -0.0332 -0.1172 0.9925 +vn 0.0578 -0.3461 0.9364 +vn -0.2133 -0.5362 0.8167 +vn -0.3840 -0.1907 0.9034 +vn 0.2133 -0.5362 0.8167 +vn -0.0578 -0.3461 0.9364 +vn 0.0332 -0.1172 0.9925 +vn 0.3840 -0.1907 0.9034 +vn 0.0282 0.0488 0.9984 +vn -0.0202 -0.0708 0.9973 +vn -0.3871 -0.0442 0.9210 +vn -0.2847 0.1800 0.9416 +vn 0.3871 -0.0442 0.9210 +vn 0.0202 -0.0708 0.9973 +vn -0.0282 0.0488 0.9984 +vn 0.2847 0.1800 0.9416 +vn 0.1824 0.1695 0.9685 +vn 0.1217 0.1677 0.9783 +vn -0.1675 0.3787 0.9103 +vn -0.1537 0.5074 0.8479 +vn 0.1675 0.3787 0.9103 +vn -0.1217 0.1677 0.9783 +vn -0.1824 0.1695 0.9685 +vn 0.1537 0.5074 0.8479 +vn 0.2256 0.0966 0.9694 +vn 0.2015 0.1231 0.9717 +vn -0.0956 0.6021 0.7927 +vn 0.1063 0.6268 0.7719 +vn 0.0956 0.6021 0.7927 +vn -0.2015 0.1231 0.9717 +vn -0.2256 0.0966 0.9694 +vn -0.1063 0.6268 0.7719 +vn 0.2622 0.1395 0.9549 +vn 0.2597 0.0956 0.9610 +vn 0.2912 0.6006 0.7447 +vn 0.3719 0.6010 0.7074 +vn -0.2912 0.6006 0.7447 +vn -0.2597 0.0956 0.9610 +vn -0.2622 0.1395 0.9549 +vn -0.3719 0.6010 0.7074 +vn 0.3148 0.2739 0.9088 +vn 0.2388 0.2541 0.9372 +vn 0.4401 0.5783 0.6869 +vn 0.5832 0.4491 0.6769 +vn -0.4401 0.5783 0.6869 +vn -0.2388 0.2541 0.9372 +vn -0.3148 0.2739 0.9088 +vn -0.5832 0.4491 0.6769 +vn 0.3567 -0.2066 0.9111 +vn 0.4345 -0.1666 0.8851 +vn 0.7213 -0.3143 0.6171 +vn 0.5757 -0.4001 0.7131 +vn -0.7213 -0.3143 0.6171 +vn -0.4345 -0.1666 0.8851 +vn -0.3567 -0.2066 0.9111 +vn -0.5757 -0.4001 0.7131 +vn 0.4936 -0.1029 0.8636 +vn 0.5275 -0.0396 0.8487 +vn 0.8125 -0.0300 0.5822 +vn 0.8067 -0.1577 0.5695 +vn -0.8125 -0.0300 0.5822 +vn -0.5275 -0.0396 0.8487 +vn -0.4936 -0.1029 0.8636 +vn -0.8067 -0.1577 0.5695 +vn 0.5351 0.0166 0.8446 +vn 0.4751 0.1342 0.8696 +vn 0.7355 0.2376 0.6345 +vn 0.7983 0.0611 0.5992 +vn -0.7355 0.2376 0.6345 +vn -0.4751 0.1342 0.8696 +vn -0.5351 0.0166 0.8446 +vn -0.7983 0.0611 0.5992 +vn -0.3564 0.9338 -0.0305 +vn -0.7591 0.6384 -0.1271 +vn -0.5797 0.7783 -0.2414 +vn -0.2594 0.9642 0.0554 +vn 0.5797 0.7783 -0.2414 +vn 0.7591 0.6384 -0.1271 +vn 0.3564 0.9338 -0.0305 +vn 0.2594 0.9642 0.0554 +vn -0.8771 0.4457 -0.1790 +vn -0.8328 0.5224 -0.1830 +vn -0.6598 0.4172 -0.6250 +vn -0.7028 0.4505 -0.5506 +vn 0.6598 0.4172 -0.6250 +vn 0.8328 0.5224 -0.1830 +vn 0.8771 0.4457 -0.1790 +vn 0.7028 0.4505 -0.5506 +vn -0.5042 0.8445 -0.1802 +vn 0.0443 0.9871 -0.1536 +vn -0.0365 0.7633 -0.6450 +vn -0.4474 0.6254 -0.6393 +vn 0.0365 0.7633 -0.6450 +vn -0.0443 0.9871 -0.1536 +vn 0.5042 0.8445 -0.1802 +vn 0.4474 0.6254 -0.6393 +vn 0.5129 0.8527 -0.0992 +vn 0.5986 0.7955 -0.0935 +vn 0.3523 0.7129 -0.6063 +vn 0.2944 0.7072 -0.6428 +vn -0.3523 0.7129 -0.6063 +vn -0.5986 0.7955 -0.0935 +vn -0.5129 0.8527 -0.0992 +vn -0.2944 0.7072 -0.6428 +vn 0.4899 0.8644 -0.1133 +vn 0.4236 0.8993 -0.1091 +vn 0.3649 0.8952 -0.2560 +vn 0.2923 0.8660 -0.4058 +vn -0.3649 0.8952 -0.2560 +vn -0.4236 0.8993 -0.1091 +vn -0.4899 0.8644 -0.1133 +vn -0.2923 0.8660 -0.4058 +vn 0.3764 0.9214 -0.0963 +vn 0.7040 0.6980 -0.1314 +vn 0.6182 0.7171 -0.3220 +vn 0.3362 0.9097 -0.2437 +vn -0.6182 0.7171 -0.3220 +vn -0.7040 0.6980 -0.1314 +vn -0.3764 0.9214 -0.0963 +vn -0.3362 0.9097 -0.2437 +vn 0.9785 0.1332 -0.1572 +vn 0.9637 -0.2187 -0.1534 +vn 0.9565 -0.1523 -0.2490 +vn 0.9064 0.2479 -0.3419 +vn -0.9565 -0.1523 -0.2490 +vn -0.9637 -0.2187 -0.1534 +vn -0.9785 0.1332 -0.1572 +vn -0.9064 0.2479 -0.3419 +vn 0.7948 -0.5913 -0.1362 +vn 0.6242 -0.7712 -0.1248 +vn 0.6455 -0.7567 -0.1032 +vn 0.8063 -0.5677 -0.1663 +vn -0.6455 -0.7567 -0.1032 +vn -0.6242 -0.7712 -0.1248 +vn -0.7948 -0.5913 -0.1362 +vn -0.8063 -0.5677 -0.1663 +vn 0.5227 -0.8454 -0.1101 +vn 0.3980 -0.9141 -0.0778 +vn 0.3905 -0.9135 -0.1145 +vn 0.5293 -0.8441 -0.0856 +vn -0.3905 -0.9135 -0.1145 +vn -0.3980 -0.9141 -0.0778 +vn -0.5227 -0.8454 -0.1101 +vn -0.5293 -0.8441 -0.0856 +vn 0.1166 -0.3653 -0.9235 +vn 0.1076 -0.6595 -0.7439 +vn 0.3922 -0.6625 -0.6382 +vn 0.3326 -0.4061 -0.8512 +vn -0.3922 -0.6625 -0.6382 +vn -0.1076 -0.6595 -0.7439 +vn -0.1166 -0.3653 -0.9235 +vn -0.3326 -0.4061 -0.8512 +vn 0.1160 -0.1703 -0.9785 +vn 0.1322 -0.1441 -0.9807 +vn 0.2652 -0.1327 -0.9550 +vn 0.2000 -0.1204 -0.9724 +vn -0.2652 -0.1327 -0.9550 +vn -0.1322 -0.1441 -0.9807 +vn -0.1160 -0.1703 -0.9785 +vn -0.2000 -0.1204 -0.9724 +vn 0.0451 -0.6037 -0.7959 +vn 0.0837 -0.3802 -0.9211 +vn 0.1298 -0.3022 -0.9444 +vn 0.0547 -0.5316 -0.8452 +vn -0.1298 -0.3022 -0.9444 +vn -0.0837 -0.3802 -0.9211 +vn -0.0451 -0.6037 -0.7959 +vn -0.0547 -0.5316 -0.8452 +vn 0.1217 -0.9915 -0.0468 +vn 0.0585 -0.9983 -0.0057 +vn 0.0465 -0.8981 -0.4373 +vn 0.0769 -0.8687 -0.4894 +vn -0.0465 -0.8981 -0.4373 +vn -0.0585 -0.9983 -0.0057 +vn -0.1217 -0.9915 -0.0468 +vn -0.0769 -0.8687 -0.4894 +vn 0.3393 -0.9324 -0.1249 +vn 0.1387 -0.9870 -0.0813 +vn 0.0505 -0.8376 -0.5439 +vn 0.2706 -0.7206 -0.6383 +vn -0.0505 -0.8376 -0.5439 +vn -0.1387 -0.9870 -0.0813 +vn -0.3393 -0.9324 -0.1249 +vn -0.2706 -0.7206 -0.6383 +vn 0.9901 -0.0290 -0.1370 +vn 0.8533 -0.4971 -0.1573 +vn 0.6430 -0.3347 -0.6889 +vn 0.8299 0.0726 -0.5532 +vn -0.6430 -0.3347 -0.6889 +vn -0.8533 -0.4971 -0.1573 +vn -0.9901 -0.0290 -0.1370 +vn -0.8299 0.0726 -0.5532 +vn 0.9779 0.1391 -0.1563 +vn 0.9834 0.0973 -0.1531 +vn 0.8402 0.1390 -0.5241 +vn 0.8528 0.1497 -0.5003 +vn -0.8402 0.1390 -0.5241 +vn -0.9834 0.0973 -0.1531 +vn -0.9779 0.1391 -0.1563 +vn -0.8528 0.1497 -0.5003 +vn 0.3822 0.0370 -0.9233 +vn 0.1532 -0.0625 -0.9862 +vn 0.2688 -0.0768 -0.9601 +vn 0.4965 0.0463 -0.8668 +vn -0.2688 -0.0768 -0.9601 +vn -0.1532 -0.0625 -0.9862 +vn -0.3822 0.0370 -0.9233 +vn -0.4965 0.0463 -0.8668 +vn 0.2653 -0.0694 -0.9617 +vn 0.2074 -0.3516 -0.9129 +vn -0.0068 -0.4342 -0.9008 +vn 0.0694 -0.2037 -0.9766 +vn 0.0068 -0.4342 -0.9008 +vn -0.2074 -0.3516 -0.9129 +vn -0.2653 -0.0694 -0.9617 +vn -0.0694 -0.2037 -0.9766 +vn 0.8652 -0.0990 -0.4915 +vn 0.6745 -0.0524 -0.7364 +vn 0.5096 -0.3034 -0.8051 +vn 0.7347 -0.4575 -0.5009 +vn -0.5096 -0.3034 -0.8051 +vn -0.6745 -0.0524 -0.7364 +vn -0.8652 -0.0990 -0.4915 +vn -0.7347 -0.4575 -0.5009 +vn 0.9760 0.1734 -0.1315 +vn 0.9766 0.1421 -0.1614 +vn 0.8686 0.1168 -0.4815 +vn 0.9026 0.1251 -0.4119 +vn -0.8686 0.1168 -0.4815 +vn -0.9766 0.1421 -0.1614 +vn -0.9760 0.1734 -0.1315 +vn -0.9026 0.1251 -0.4119 +vn 0.9500 0.3122 -0.0030 +vn 0.9982 -0.0173 0.0582 +vn 0.9481 0.0117 0.3177 +vn 0.9543 0.2977 0.0279 +vn -0.9481 0.0117 0.3177 +vn -0.9982 -0.0173 0.0582 +vn -0.9500 0.3122 -0.0030 +vn -0.9543 0.2977 0.0279 +vn 0.9603 0.2707 -0.0676 +vn 0.9275 0.2098 -0.3095 +vn 0.9821 0.0949 -0.1626 +vn 0.9388 0.3437 -0.0214 +vn -0.9821 0.0949 -0.1626 +vn -0.9275 0.2098 -0.3095 +vn -0.9603 0.2707 -0.0676 +vn -0.9388 0.3437 -0.0214 +vn 0.8296 -0.5488 0.1030 +vn 0.9457 0.3168 0.0726 +vn 0.8760 0.0949 0.4729 +vn 0.7087 -0.6925 0.1349 +vn -0.8760 0.0949 0.4729 +vn -0.9457 0.3168 0.0726 +vn -0.8296 -0.5488 0.1030 +vn -0.7087 -0.6925 0.1349 +vn 0.3328 -0.9408 0.0643 +vn 0.3508 -0.9237 -0.1541 +vn 0.2658 -0.9516 -0.1540 +vn 0.2867 -0.9579 -0.0140 +vn -0.2658 -0.9516 -0.1540 +vn -0.3508 -0.9237 -0.1541 +vn -0.3328 -0.9408 0.0643 +vn -0.2867 -0.9579 -0.0140 +vn 0.2001 -0.3621 -0.9104 +vn 0.3877 -0.3624 -0.8475 +vn 0.3717 -0.6029 -0.7060 +vn 0.1837 -0.6210 -0.7620 +vn -0.3717 -0.6029 -0.7060 +vn -0.3877 -0.3624 -0.8475 +vn -0.2001 -0.3621 -0.9104 +vn -0.1837 -0.6210 -0.7620 +vn 0.1674 -0.7953 -0.5827 +vn 0.3752 -0.7647 -0.5239 +vn 0.3702 -0.8633 -0.3429 +vn 0.1532 -0.9078 -0.3904 +vn -0.3702 -0.8633 -0.3429 +vn -0.3752 -0.7647 -0.5239 +vn -0.1674 -0.7953 -0.5827 +vn -0.1532 -0.9078 -0.3904 +vn 0.1434 -0.9658 -0.2160 +vn 0.3709 -0.9131 -0.1693 +vn 0.4174 -0.9043 -0.0900 +vn 0.1491 -0.9771 -0.1519 +vn -0.4174 -0.9043 -0.0900 +vn -0.3709 -0.9131 -0.1693 +vn -0.1434 -0.9658 -0.2160 +vn -0.1491 -0.9771 -0.1519 +vn 0.1583 -0.9716 -0.1759 +vn 0.4540 -0.8829 -0.1201 +vn 0.4500 -0.8195 -0.3547 +vn 0.1403 -0.8925 -0.4286 +vn -0.4500 -0.8195 -0.3547 +vn -0.4540 -0.8829 -0.1201 +vn -0.1583 -0.9716 -0.1759 +vn -0.1403 -0.8925 -0.4286 +vn 0.9614 -0.0417 -0.2720 +vn 0.8401 -0.4844 -0.2441 +vn 0.7790 -0.6253 0.0474 +vn 0.9544 -0.2980 -0.0169 +vn -0.7790 -0.6253 0.0474 +vn -0.8401 -0.4844 -0.2441 +vn -0.9614 -0.0417 -0.2720 +vn -0.9544 -0.2980 -0.0169 +vn 0.8706 -0.4755 0.1265 +vn 0.7279 -0.6600 0.1863 +vn 0.7927 -0.5636 0.2325 +vn 0.9198 -0.3521 0.1734 +vn -0.7927 -0.5636 0.2325 +vn -0.7279 -0.6600 0.1863 +vn -0.8706 -0.4755 0.1265 +vn -0.9198 -0.3521 0.1734 +vn 0.1902 0.1157 -0.9749 +vn 0.3826 0.0540 -0.9223 +vn 0.3800 -0.2095 -0.9009 +vn 0.1936 -0.1523 -0.9692 +vn -0.3800 -0.2095 -0.9009 +vn -0.3826 0.0540 -0.9223 +vn -0.1902 0.1157 -0.9749 +vn -0.1936 -0.1523 -0.9692 +vn 0.0678 0.9096 0.4099 +vn 0.2460 0.8772 0.4124 +vn 0.2136 0.9693 0.1216 +vn 0.0558 0.9914 0.1182 +vn -0.2136 0.9693 0.1216 +vn -0.2460 0.8772 0.4124 +vn -0.0678 0.9096 0.4099 +vn -0.0558 0.9914 0.1182 +vn 0.0569 0.9940 -0.0937 +vn 0.2050 0.9744 -0.0926 +vn 0.2483 0.8867 -0.3900 +vn 0.0911 0.9275 -0.3625 +vn -0.2483 0.8867 -0.3900 +vn -0.2050 0.9744 -0.0926 +vn -0.0569 0.9940 -0.0937 +vn -0.0911 0.9275 -0.3625 +vn 0.1577 0.7390 -0.6550 +vn 0.3386 0.6702 -0.6605 +vn 0.3926 0.4285 -0.8138 +vn 0.1938 0.4878 -0.8512 +vn -0.3926 0.4285 -0.8138 +vn -0.3386 0.6702 -0.6605 +vn -0.1577 0.7390 -0.6550 +vn -0.1938 0.4878 -0.8512 +vn 0.3769 0.9123 -0.1600 +vn 0.6401 0.7324 -0.2320 +vn 0.6878 0.7206 0.0877 +vn 0.4445 0.8780 0.1777 +vn -0.6878 0.7206 0.0877 +vn -0.6401 0.7324 -0.2320 +vn -0.3769 0.9123 -0.1600 +vn -0.4445 0.8780 0.1777 +vn 0.4241 0.6987 0.5761 +vn 0.6499 0.5895 0.4797 +vn 0.6527 0.5727 0.4960 +vn 0.4826 0.6630 0.5723 +vn -0.6527 0.5727 0.4960 +vn -0.6499 0.5895 0.4797 +vn -0.4241 0.6987 0.5761 +vn -0.4826 0.6630 0.5723 +vn 0.6041 0.7367 0.3037 +vn 0.7488 0.6139 0.2500 +vn 0.8015 0.5968 0.0369 +vn 0.6547 0.7534 0.0612 +vn -0.8015 0.5968 0.0369 +vn -0.7488 0.6139 0.2500 +vn -0.6041 0.7367 0.3037 +vn -0.6547 0.7534 0.0612 +vn 0.6753 0.7277 -0.1198 +vn 0.8265 0.5523 -0.1089 +vn 0.8306 0.4446 -0.3354 +vn 0.6704 0.6235 -0.4022 +vn -0.8306 0.4446 -0.3354 +vn -0.8265 0.5523 -0.1089 +vn -0.6753 0.7277 -0.1198 +vn -0.6704 0.6235 -0.4022 +vn 0.7355 0.0900 -0.6715 +vn 0.6174 0.1265 -0.7764 +vn 0.6217 0.3786 -0.6856 +vn 0.8049 0.2659 -0.5305 +vn -0.6217 0.3786 -0.6856 +vn -0.6174 0.1265 -0.7764 +vn -0.7355 0.0900 -0.6715 +vn -0.8049 0.2659 -0.5305 +vn 0.4660 0.3523 -0.8117 +vn 0.4131 0.5939 -0.6904 +vn 0.5062 0.4910 -0.7090 +vn 0.5506 0.2356 -0.8009 +vn -0.5062 0.4910 -0.7090 +vn -0.4131 0.5939 -0.6904 +vn -0.4660 0.3523 -0.8117 +vn -0.5506 0.2356 -0.8009 +vn 0.4262 0.8052 -0.4124 +vn 0.4791 0.8726 -0.0948 +vn 0.6628 0.7417 -0.1022 +vn 0.5875 0.6976 -0.4100 +vn -0.6628 0.7417 -0.1022 +vn -0.4791 0.8726 -0.0948 +vn -0.4262 0.8052 -0.4124 +vn -0.5875 0.6976 -0.4100 +vn 0.5132 0.8522 0.1014 +vn 0.5589 0.7509 0.3519 +vn 0.7048 0.6492 0.2860 +vn 0.6854 0.7248 0.0699 +vn -0.7048 0.6492 0.2860 +vn -0.5589 0.7509 0.3519 +vn -0.5132 0.8522 0.1014 +vn -0.6854 0.7248 0.0699 +vn 0.5784 0.5616 0.5917 +vn 0.5439 0.5641 0.6212 +vn 0.6419 0.5601 0.5237 +vn 0.6900 0.5185 0.5049 +vn -0.6419 0.5601 0.5237 +vn -0.5439 0.5641 0.6212 +vn -0.5784 0.5616 0.5917 +vn -0.6900 0.5185 0.5049 +vn 0.1862 0.9392 -0.2884 +vn 0.3690 0.9136 -0.1708 +vn 0.5027 0.8432 0.1906 +vn 0.3772 0.8780 0.2945 +vn -0.5027 0.8432 0.1906 +vn -0.3690 0.9136 -0.1708 +vn -0.1862 0.9392 -0.2884 +vn -0.3772 0.8780 0.2945 +vn 0.1398 0.6437 0.7524 +vn 0.3113 0.6008 0.7362 +vn 0.2926 0.6596 0.6923 +vn 0.0963 0.7117 0.6959 +vn -0.2926 0.6596 0.6923 +vn -0.3113 0.6008 0.7362 +vn -0.1398 0.6437 0.7524 +vn -0.0963 0.7117 0.6959 +vn -0.3143 0.3098 -0.8974 +vn -0.3627 0.3016 -0.8818 +vn -0.0528 0.3888 -0.9198 +vn -0.1143 0.3499 -0.9298 +vn 0.0528 0.3888 -0.9198 +vn 0.3627 0.3016 -0.8818 +vn 0.3143 0.3098 -0.8974 +vn 0.1143 0.3499 -0.9298 +vn -0.1211 0.9543 0.2731 +vn -0.1029 0.9514 -0.2902 +vn 0.2076 0.8342 0.5109 +vn 0.1206 0.7069 0.6969 +vn -0.2076 0.8342 0.5109 +vn 0.1029 0.9514 -0.2902 +vn 0.1211 0.9543 0.2731 +vn -0.1206 0.7069 0.6969 +vn -0.0946 0.5719 0.8148 +vn -0.2268 0.6795 0.6977 +vn -0.0201 0.4661 0.8845 +vn 0.0201 0.4661 0.8845 +vn 0.2268 0.6795 0.6977 +vn 0.0946 0.5719 0.8148 +vn 0.9341 0.3265 -0.1448 +vn 0.9920 -0.1200 0.0389 +vn 0.9899 0.0001 0.1418 +vn 0.9175 0.3893 0.0816 +vn -0.9899 0.0001 0.1418 +vn -0.9920 -0.1200 0.0389 +vn -0.9341 0.3265 -0.1448 +vn -0.9175 0.3893 0.0816 +vn 0.9822 0.0351 0.1847 +vn 0.9887 0.0423 0.1439 +vn 0.9233 0.2360 0.3032 +vn 0.9173 0.2553 0.3055 +vn -0.9233 0.2360 0.3032 +vn -0.9887 0.0423 0.1439 +vn -0.9822 0.0351 0.1847 +vn -0.9173 0.2553 0.3055 +vn 0.9933 0.1151 0.0108 +vn 0.9809 0.1735 -0.0877 +vn 0.9626 0.2675 -0.0418 +vn 0.9508 0.2920 0.1034 +vn -0.9626 0.2675 -0.0418 +vn -0.9809 0.1735 -0.0877 +vn -0.9933 0.1151 0.0108 +vn -0.9508 0.2920 0.1034 +vn 0.9288 0.1135 -0.3527 +vn 0.9358 0.2030 -0.2882 +vn 0.9733 0.2074 -0.0979 +vn 0.9725 0.1765 -0.1522 +vn -0.9733 0.2074 -0.0979 +vn -0.9358 0.2030 -0.2882 +vn -0.9288 0.1135 -0.3527 +vn -0.9725 0.1765 -0.1522 +vn 0.6553 -0.7551 0.0203 +vn 0.5920 -0.8020 -0.0794 +vn 0.6279 -0.7768 -0.0482 +vn 0.6575 -0.7478 0.0919 +vn -0.6279 -0.7768 -0.0482 +vn -0.5920 -0.8020 -0.0794 +vn -0.6553 -0.7551 0.0203 +vn -0.6575 -0.7478 0.0919 +vn 0.4668 -0.8741 0.1343 +vn 0.4588 -0.8824 0.1046 +vn 0.4476 -0.8920 -0.0633 +vn 0.3413 -0.9399 0.0148 +vn -0.4476 -0.8920 -0.0633 +vn -0.4588 -0.8824 0.1046 +vn -0.4668 -0.8741 0.1343 +vn -0.3413 -0.9399 0.0148 +vn 0.5613 -0.8065 0.1858 +vn 0.4668 -0.8654 0.1818 +vn 0.4767 -0.8577 0.1925 +vn 0.5263 -0.8217 0.2186 +vn -0.4767 -0.8577 0.1925 +vn -0.4668 -0.8654 0.1818 +vn -0.5613 -0.8065 0.1858 +vn -0.5263 -0.8217 0.2186 +vn 0.5216 -0.8204 0.2341 +vn 0.6578 -0.6375 0.4011 +vn 0.7511 -0.6001 0.2753 +vn 0.5984 -0.7768 0.1963 +vn -0.7511 -0.6001 0.2753 +vn -0.6578 -0.6375 0.4011 +vn -0.5216 -0.8204 0.2341 +vn -0.5984 -0.7768 0.1963 +vn 0.7592 -0.6218 0.1926 +vn 0.7187 -0.6817 0.1373 +vn 0.6862 -0.7002 0.1973 +vn -0.6862 -0.7002 0.1973 +vn -0.7187 -0.6817 0.1373 +vn -0.7592 -0.6218 0.1926 +vn 0.4177 -0.7750 0.4742 +vn 0.4704 -0.8012 0.3699 +vn 0.4993 -0.5066 0.7029 +vn -0.4993 -0.5066 0.7029 +vn -0.4704 -0.8012 0.3699 +vn -0.4177 -0.7750 0.4742 +vn 0.6287 -0.1731 -0.7581 +vn 0.4658 -0.4492 -0.7624 +vn 0.5177 -0.4475 -0.7292 +vn 0.5802 -0.1684 -0.7969 +vn -0.5177 -0.4475 -0.7292 +vn -0.4658 -0.4492 -0.7624 +vn -0.6287 -0.1731 -0.7581 +vn -0.5802 -0.1684 -0.7969 +vn 0.4618 -0.0233 -0.8867 +vn 0.5443 -0.1128 -0.8313 +vn 0.5532 -0.3757 -0.7436 +vn 0.4454 -0.2665 -0.8548 +vn -0.5532 -0.3757 -0.7436 +vn -0.5443 -0.1128 -0.8313 +vn -0.4618 -0.0233 -0.8867 +vn -0.4454 -0.2665 -0.8548 +vn 0.2208 -0.9325 -0.2857 +vn 0.4424 -0.8447 -0.3014 +vn 0.4406 -0.7369 -0.5127 +vn 0.2445 -0.7812 -0.5744 +vn -0.4406 -0.7369 -0.5127 +vn -0.4424 -0.8447 -0.3014 +vn -0.2208 -0.9325 -0.2857 +vn -0.2445 -0.7812 -0.5744 +vn 0.5828 -0.7694 -0.2615 +vn 0.5586 -0.7104 -0.4281 +vn 0.6683 -0.6368 -0.3844 +vn 0.6382 -0.7320 -0.2386 +vn -0.6683 -0.6368 -0.3844 +vn -0.5586 -0.7104 -0.4281 +vn -0.5828 -0.7694 -0.2615 +vn -0.6382 -0.7320 -0.2386 +vn 0.4367 -0.3637 -0.8228 +vn 0.6196 -0.4763 -0.6238 +vn 0.4702 -0.6134 -0.6346 +vn -0.4702 -0.6134 -0.6346 +vn -0.6196 -0.4763 -0.6238 +vn -0.4367 -0.3637 -0.8228 +vn -0.0205 0.8492 0.5277 +vn -0.1918 0.8152 0.5466 +vn 0.4724 0.0875 0.8770 +vn 0.5353 0.0226 0.8444 +vn -0.4724 0.0875 0.8770 +vn 0.1918 0.8152 0.5466 +vn 0.0205 0.8492 0.5277 +vn -0.5353 0.0226 0.8444 +vn 0.1382 0.8098 0.5702 +vn 0.5113 -0.0565 0.8575 +vn 0.4345 -0.0954 0.8956 +vn 0.3782 0.6396 0.6692 +vn -0.4345 -0.0954 0.8956 +vn -0.5113 -0.0565 0.8575 +vn -0.1382 0.8098 0.5702 +vn -0.3782 0.6396 0.6692 +vn 0.5193 0.3696 0.7705 +vn 0.2324 -0.0550 0.9711 +vn 0.0996 -0.0175 0.9949 +vn 0.5077 0.1512 0.8481 +vn -0.0996 -0.0175 0.9949 +vn -0.2324 -0.0550 0.9711 +vn -0.5193 0.3696 0.7705 +vn -0.5077 0.1512 0.8481 +vn 0.4991 -0.0694 0.8637 +vn 0.0746 -0.0289 0.9968 +vn 0.1012 0.0676 0.9926 +vn 0.5339 -0.1803 0.8261 +vn -0.1012 0.0676 0.9926 +vn -0.0746 -0.0289 0.9968 +vn -0.4991 -0.0694 0.8637 +vn -0.5339 -0.1803 0.8261 +vn 0.5960 -0.3435 0.7258 +vn 0.2560 0.1901 0.9478 +vn 0.4547 0.1312 0.8809 +vn 0.5900 -0.5478 0.5931 +vn -0.4547 0.1312 0.8809 +vn -0.2560 0.1901 0.9478 +vn -0.5960 -0.3435 0.7258 +vn -0.5900 -0.5478 0.5931 +vn 0.5327 -0.6774 0.5073 +vn 0.6046 -0.0297 0.7960 +vn 0.5400 -0.1178 0.8334 +vn 0.3758 -0.7678 0.5189 +vn -0.5400 -0.1178 0.8334 +vn -0.6046 -0.0297 0.7960 +vn -0.5327 -0.6774 0.5073 +vn -0.3758 -0.7678 0.5189 +vn 0.4221 0.5591 0.7136 +vn 0.1653 0.8690 0.4664 +vn 0.2941 0.8048 0.5156 +vn 0.4756 0.4512 0.7551 +vn -0.2941 0.8048 0.5156 +vn -0.1653 0.8690 0.4664 +vn -0.4221 0.5591 0.7136 +vn -0.4756 0.4512 0.7551 +vn -0.2542 0.6512 0.7151 +vn -0.5563 0.7759 0.2974 +vn -0.2140 0.9014 0.3764 +vn 0.0794 0.7092 0.7005 +vn 0.2140 0.9014 0.3764 +vn 0.5563 0.7759 0.2974 +vn 0.2542 0.6512 0.7151 +vn -0.0794 0.7092 0.7005 +vn -0.5416 0.0466 0.8394 +vn -0.9486 0.1144 0.2950 +vn -0.8572 0.4571 0.2373 +vn -0.5241 0.3505 0.7761 +vn 0.8572 0.4571 0.2373 +vn 0.9486 0.1144 0.2950 +vn 0.5416 0.0466 0.8394 +vn 0.5241 0.3505 0.7761 +vn -0.0686 -0.3762 0.9240 +vn -0.3293 -0.5899 0.7373 +vn -0.8190 -0.2642 0.5093 +vn -0.4092 -0.1702 0.8964 +vn 0.8190 -0.2642 0.5093 +vn 0.3293 -0.5899 0.7373 +vn 0.0686 -0.3762 0.9240 +vn 0.4092 -0.1702 0.8964 +vn 0.5220 -0.4493 0.7251 +vn 0.4795 -0.6141 0.6268 +vn 0.2706 -0.6499 0.7102 +vn 0.3580 -0.4611 0.8119 +vn -0.2706 -0.6499 0.7102 +vn -0.4795 -0.6141 0.6268 +vn -0.5220 -0.4493 0.7251 +vn -0.3580 -0.4611 0.8119 +vn 0.6248 -0.3986 0.6714 +vn 0.6587 -0.3369 0.6727 +vn 0.6943 -0.4801 0.5362 +vn 0.6141 -0.5531 0.5630 +vn -0.6943 -0.4801 0.5362 +vn -0.6587 -0.3369 0.6727 +vn -0.6248 -0.3986 0.6714 +vn -0.6141 -0.5531 0.5630 +vn 0.7007 -0.7122 0.0431 +vn 0.5427 -0.8336 0.1032 +vn 0.8132 -0.5499 0.1903 +vn 0.8700 -0.4877 -0.0722 +vn -0.8133 -0.5499 0.1903 +vn -0.5427 -0.8336 0.1032 +vn -0.7007 -0.7122 0.0431 +vn -0.8700 -0.4877 -0.0722 +vn -0.0275 -0.6205 0.7837 +vn -0.0000 -0.7270 0.6867 +vn 0.1214 0.2350 0.9644 +vn 0.1592 0.3008 0.9403 +vn -0.1214 0.2350 0.9644 +vn 0.0275 -0.6205 0.7837 +vn -0.1592 0.3008 0.9403 +vn 0.9629 -0.2654 0.0480 +vn 0.8749 -0.4801 0.0636 +vn 0.9101 -0.3839 -0.1561 +vn 0.9621 -0.2621 -0.0750 +vn -0.9101 -0.3839 -0.1561 +vn -0.8749 -0.4801 0.0636 +vn -0.9629 -0.2654 0.0480 +vn -0.9621 -0.2621 -0.0750 +vn 0.2189 0.6396 0.7369 +vn 0.5025 -0.1434 0.8526 +vn 0.3438 0.0039 0.9391 +vn -0.3999 0.7149 0.5736 +vn -0.3438 0.0039 0.9391 +vn -0.5025 -0.1434 0.8526 +vn -0.2189 0.6396 0.7369 +vn 0.3999 0.7149 0.5736 +vn 0.1416 0.7362 0.6617 +vn 0.0708 0.9263 0.3701 +vn 0.1860 0.9347 0.3027 +vn 0.2524 0.7846 0.5662 +vn -0.1860 0.9347 0.3027 +vn -0.0708 0.9263 0.3701 +vn -0.1416 0.7362 0.6617 +vn -0.2524 0.7846 0.5662 +vn 0.6620 -0.0533 0.7476 +vn 0.7321 0.0500 0.6793 +vn 0.6702 0.2898 0.6833 +vn 0.6793 0.3834 0.6258 +vn -0.6702 0.2898 0.6833 +vn -0.7321 0.0500 0.6793 +vn -0.6620 -0.0533 0.7476 +vn -0.6793 0.3834 0.6258 +vn 0.6671 0.4915 0.5599 +vn 0.7185 0.3229 0.6161 +vn 0.5895 0.2524 0.7673 +vn 0.4953 0.5448 0.6767 +vn -0.5895 0.2524 0.7673 +vn -0.7185 0.3229 0.6161 +vn -0.6671 0.4915 0.5599 +vn -0.4953 0.5448 0.6767 +vn 0.7462 -0.5303 0.4026 +vn 0.8459 -0.4455 0.2933 +vn 0.9177 -0.3399 0.2058 +vn 0.8790 -0.4117 0.2408 +vn -0.9177 -0.3399 0.2058 +vn -0.8459 -0.4455 0.2933 +vn -0.7462 -0.5303 0.4026 +vn -0.8790 -0.4117 0.2408 +vn 0.6539 -0.3645 0.6630 +vn 0.7818 -0.3994 0.4789 +vn 0.6662 -0.4851 0.5664 +vn 0.6220 -0.4608 0.6331 +vn -0.6662 -0.4851 0.5664 +vn -0.7818 -0.3994 0.4789 +vn -0.6539 -0.3645 0.6630 +vn -0.6220 -0.4608 0.6331 +vn 0.5746 -0.3515 0.7391 +vn 0.5455 -0.3604 0.7567 +vn 0.6377 -0.4508 0.6246 +vn 0.6737 -0.4640 0.5752 +vn -0.6377 -0.4508 0.6246 +vn -0.5455 -0.3604 0.7567 +vn -0.5746 -0.3515 0.7391 +vn -0.6737 -0.4640 0.5752 +vn 0.9892 -0.1431 -0.0332 +vn 0.9361 -0.3355 0.1060 +vn 0.8935 -0.2348 0.3827 +vn 0.9914 0.1179 0.0563 +vn -0.8935 -0.2348 0.3827 +vn -0.9361 -0.3355 0.1060 +vn -0.9892 -0.1431 -0.0332 +vn -0.9914 0.1179 0.0563 +vn 0.9423 -0.3297 -0.0577 +vn 0.9147 -0.3752 -0.1502 +vn 0.9298 -0.3679 -0.0089 +vn 0.9130 -0.4078 0.0129 +vn -0.9298 -0.3679 -0.0089 +vn -0.9147 -0.3752 -0.1502 +vn -0.9423 -0.3297 -0.0577 +vn -0.9130 -0.4078 0.0129 +vn 0.9354 -0.3331 -0.1189 +vn 0.9649 -0.0182 0.2620 +vn 0.9647 -0.2265 0.1348 +vn -0.9647 -0.2265 0.1348 +vn -0.9649 -0.0182 0.2620 +vn -0.9354 -0.3331 -0.1189 +vn 0.7120 -0.5876 0.3845 +vn 0.7337 -0.5770 0.3589 +vn 0.6887 -0.5163 0.5090 +vn 0.6830 -0.4932 0.5387 +vn -0.6887 -0.5163 0.5090 +vn -0.7337 -0.5770 0.3589 +vn -0.7120 -0.5876 0.3845 +vn -0.6830 -0.4932 0.5387 +vn 0.7388 -0.5816 0.3406 +vn 0.7333 -0.6043 0.3116 +vn 0.6509 -0.5579 0.5149 +vn 0.6816 -0.5313 0.5030 +vn -0.6509 -0.5579 0.5149 +vn -0.7333 -0.6043 0.3116 +vn -0.7388 -0.5816 0.3406 +vn -0.6816 -0.5313 0.5030 +vn 0.7243 -0.6494 0.2318 +vn 0.8306 -0.5336 0.1593 +vn 0.6951 -0.4454 0.5644 +vn 0.6174 -0.5989 0.5101 +vn -0.6951 -0.4454 0.5644 +vn -0.8306 -0.5336 0.1593 +vn -0.7243 -0.6494 0.2318 +vn -0.6174 -0.5989 0.5101 +vn 0.6811 0.6657 0.3050 +vn 0.4426 0.8229 0.3563 +vn 0.4269 0.7886 0.4425 +vn 0.6184 0.4156 0.6670 +vn -0.4269 0.7886 0.4425 +vn -0.4426 0.8229 0.3563 +vn -0.6811 0.6657 0.3050 +vn -0.6184 0.4156 0.6670 +vn 0.7428 0.5039 0.4407 +vn 0.8473 0.1348 0.5137 +vn 0.8098 0.1403 0.5697 +vn 0.7151 0.4634 0.5233 +vn -0.8098 0.1403 0.5697 +vn -0.8473 0.1348 0.5137 +vn -0.7428 0.5039 0.4407 +vn -0.7151 0.4634 0.5233 +vn 0.8087 -0.3438 0.4774 +vn 0.9084 0.0479 0.4153 +vn 0.6406 0.3517 0.6826 +vn 0.7902 -0.3805 0.4805 +vn -0.6406 0.3517 0.6826 +vn -0.9084 0.0479 0.4153 +vn -0.8087 -0.3438 0.4774 +vn -0.7902 -0.3805 0.4805 +vn 0.1493 0.9765 0.1554 +vn -0.0046 0.9804 0.1972 +vn -0.0662 0.9281 0.3663 +vn -0.0823 0.9430 0.3225 +vn 0.0662 0.9281 0.3663 +vn 0.0046 0.9804 0.1972 +vn -0.1493 0.9765 0.1554 +vn 0.0823 0.9430 0.3225 +vn 0.5698 -0.6825 0.4576 +vn 0.6797 -0.6052 0.4145 +vn 0.6792 -0.4446 0.5840 +vn 0.6092 -0.4742 0.6356 +vn -0.6792 -0.4446 0.5840 +vn -0.6797 -0.6052 0.4145 +vn -0.5698 -0.6825 0.4576 +vn -0.6092 -0.4742 0.6356 +vn 0.1434 -0.8406 0.5224 +vn 0.4106 -0.7628 0.4995 +vn 0.4658 -0.6095 0.6415 +vn 0.2145 -0.6668 0.7137 +vn -0.4658 -0.6095 0.6415 +vn -0.4106 -0.7628 0.4995 +vn -0.1434 -0.8406 0.5224 +vn -0.2145 -0.6668 0.7137 +vn -0.9542 -0.2910 -0.0694 +vn -0.5829 -0.7510 0.3104 +vn -0.1380 -0.4256 0.8943 +vn -0.3713 -0.1545 0.9156 +vn 0.1380 -0.4256 0.8943 +vn 0.5829 -0.7510 0.3104 +vn 0.9542 -0.2910 -0.0694 +vn 0.3713 -0.1545 0.9156 +vn -0.8679 0.4114 -0.2784 +vn -0.9569 0.1243 -0.2625 +vn -0.3893 0.0699 0.9185 +vn -0.2116 0.2604 0.9420 +vn 0.3893 0.0699 0.9185 +vn 0.9569 0.1243 -0.2625 +vn 0.8679 0.4114 -0.2784 +vn 0.2116 0.2604 0.9420 +vn -0.4099 0.9112 0.0419 +vn -0.6783 0.7208 -0.1430 +vn -0.0276 0.4645 0.8851 +vn 0.1209 0.6487 0.7513 +vn 0.0276 0.4645 0.8851 +vn 0.6783 0.7208 -0.1430 +vn 0.4099 0.9112 0.0419 +vn -0.1209 0.6487 0.7513 +vn 0.0860 0.9649 0.2483 +vn -0.0841 0.9794 0.1834 +vn 0.3082 0.7442 0.5926 +vn 0.2655 0.8263 0.4968 +vn -0.3082 0.7442 0.5926 +vn 0.0841 0.9794 0.1834 +vn -0.0860 0.9649 0.2483 +vn -0.2655 0.8263 0.4968 +vn 0.2574 0.1434 0.9556 +vn 0.2381 0.1169 0.9642 +vn 0.1210 0.1419 0.9825 +vn 0.1726 0.0265 0.9846 +vn -0.1210 0.1419 0.9825 +vn -0.2381 0.1169 0.9642 +vn -0.2574 0.1434 0.9556 +vn -0.1726 0.0265 0.9846 +vn 0.2675 0.0341 0.9630 +vn 0.2930 0.1243 0.9480 +vn 0.4064 0.0313 0.9132 +vn 0.3320 0.0177 0.9431 +vn -0.4064 0.0313 0.9132 +vn -0.2930 0.1243 0.9480 +vn -0.2675 0.0341 0.9630 +vn -0.3320 0.0177 0.9431 +vn 0.3485 0.0044 0.9373 +vn 0.4045 -0.0499 0.9132 +vn 0.3634 -0.0903 0.9272 +vn 0.3158 0.0103 0.9488 +vn -0.3634 -0.0903 0.9272 +vn -0.4045 -0.0499 0.9132 +vn -0.3485 0.0044 0.9373 +vn -0.3158 0.0103 0.9488 +vn 0.2438 0.0400 0.9690 +vn 0.3102 -0.1465 0.9393 +vn 0.4165 -0.0288 0.9087 +vn 0.3278 0.1814 0.9272 +vn -0.4165 -0.0288 0.9087 +vn -0.3102 -0.1465 0.9393 +vn -0.2438 0.0400 0.9690 +vn -0.3278 0.1814 0.9272 +vn 0.4524 0.2283 0.8621 +vn 0.5000 0.0443 0.8649 +vn 0.3320 0.1101 0.9368 +vn 0.3219 0.3049 0.8963 +vn -0.3320 0.1101 0.9368 +vn -0.5000 0.0443 0.8649 +vn -0.4524 0.2283 0.8621 +vn -0.3219 0.3049 0.8963 +vn 0.4596 -0.1697 0.8718 +vn 0.3694 -0.0290 0.9288 +vn 0.3783 0.0030 0.9257 +vn 0.4989 -0.1092 0.8598 +vn -0.3783 0.0030 0.9257 +vn -0.3694 -0.0290 0.9288 +vn -0.4596 -0.1697 0.8718 +vn -0.4989 -0.1092 0.8598 +vn 0.3907 -0.1939 0.8999 +vn 0.3001 -0.1973 0.9333 +vn 0.2293 -0.0197 0.9732 +vn 0.3158 -0.0334 0.9482 +vn -0.2293 -0.0197 0.9732 +vn -0.3001 -0.1973 0.9333 +vn -0.3907 -0.1939 0.8999 +vn -0.3158 -0.0334 0.9482 +vn 0.1769 0.1801 0.9676 +vn 0.1284 -0.0032 0.9917 +vn 0.2247 -0.1899 0.9558 +vn 0.3179 -0.0537 0.9466 +vn -0.2247 -0.1899 0.9558 +vn -0.1284 -0.0032 0.9917 +vn -0.1769 0.1801 0.9676 +vn -0.3179 -0.0537 0.9466 +vn -0.2447 0.7696 0.5897 +vn -0.1043 0.6828 0.7231 +vn -0.0510 0.4334 0.8998 +vn -0.0186 0.3169 0.9483 +vn 0.0510 0.4334 0.8998 +vn 0.1043 0.6828 0.7231 +vn 0.2447 0.7696 0.5897 +vn 0.0186 0.3169 0.9483 +vn 0.5827 0.1008 0.8064 +vn 0.5408 0.0016 0.8412 +vn 0.4163 0.1692 0.8933 +vn 0.4931 0.2814 0.8232 +vn -0.4163 0.1692 0.8933 +vn -0.5408 0.0016 0.8412 +vn -0.5827 0.1008 0.8064 +vn -0.4931 0.2814 0.8232 +vn 0.4316 -0.1456 0.8902 +vn 0.4343 -0.1822 0.8822 +vn 0.4757 -0.1189 0.8715 +vn 0.4741 -0.0525 0.8789 +vn -0.4757 -0.1189 0.8715 +vn -0.4343 -0.1822 0.8822 +vn -0.4316 -0.1456 0.8902 +vn -0.4741 -0.0525 0.8789 +vn 0.5201 -0.0786 0.8505 +vn 0.5090 -0.1171 0.8528 +vn 0.4391 -0.2271 0.8692 +vn 0.4623 -0.1564 0.8728 +vn -0.4391 -0.2271 0.8692 +vn -0.5090 -0.1171 0.8528 +vn -0.5201 -0.0786 0.8505 +vn -0.4623 -0.1564 0.8728 +vn 0.4584 0.2779 0.8442 +vn 0.4637 0.2832 0.8395 +vn 0.5251 0.1076 0.8442 +vn 0.5149 0.1364 0.8463 +vn -0.5251 0.1076 0.8442 +vn -0.4637 0.2832 0.8395 +vn -0.4584 0.2779 0.8442 +vn -0.5149 0.1364 0.8463 +vn 0.4182 0.3033 0.8562 +vn 0.3713 0.4206 0.8278 +vn 0.3842 0.3492 0.8547 +vn -0.3842 0.3492 0.8547 +vn -0.3713 0.4206 0.8278 +vn -0.4182 0.3033 0.8562 +vn 0.2752 -0.9606 0.0402 +vn 0.0743 -0.9972 0.0065 +vn -0.2865 -0.6869 -0.6679 +vn -0.2351 -0.6646 -0.7092 +vn 0.2865 -0.6869 -0.6679 +vn -0.0743 -0.9972 0.0065 +vn -0.2752 -0.9606 0.0402 +vn 0.2351 -0.6646 -0.7092 +vn 0.6745 -0.6981 0.2403 +vn 0.4664 -0.8799 0.0914 +vn 0.0273 -0.6492 -0.7601 +vn 0.3356 -0.6177 -0.7112 +vn -0.0273 -0.6492 -0.7601 +vn -0.4664 -0.8799 0.0914 +vn -0.6745 -0.6981 0.2403 +vn -0.3356 -0.6177 -0.7112 +vn 0.8891 -0.0884 0.4492 +vn 0.8268 -0.3823 0.4126 +vn 0.8267 -0.4481 -0.3404 +vn 0.9932 -0.0290 -0.1131 +vn -0.8267 -0.4481 -0.3404 +vn -0.8268 -0.3823 0.4126 +vn -0.8891 -0.0884 0.4492 +vn -0.9932 -0.0290 -0.1131 +vn 0.6766 0.7300 0.0964 +vn 0.8915 0.3241 0.3165 +vn 0.9286 0.2822 -0.2409 +vn 0.4775 0.6112 -0.6312 +vn -0.9286 0.2822 -0.2409 +vn -0.8915 0.3241 0.3165 +vn -0.6766 0.7300 0.0964 +vn -0.4775 0.6112 -0.6312 +vn -0.2459 0.9629 -0.1115 +vn 0.0806 0.9919 -0.0978 +vn -0.1731 0.5767 -0.7984 +vn -0.4004 0.5448 -0.7368 +vn 0.1731 0.5767 -0.7984 +vn -0.0806 0.9919 -0.0978 +vn 0.2459 0.9629 -0.1115 +vn 0.4004 0.5448 -0.7368 +vn -0.4907 0.8712 0.0129 +vn -0.3626 0.9299 -0.0613 +vn -0.5145 0.5403 -0.6658 +vn -0.5531 0.5711 -0.6066 +vn 0.5145 0.5403 -0.6658 +vn 0.3626 0.9299 -0.0613 +vn 0.4907 0.8712 0.0129 +vn 0.5531 0.5711 -0.6066 +vn -0.4742 0.0784 -0.8769 +vn -0.4415 -0.1127 -0.8901 +vn -0.3900 -0.1353 -0.9108 +vn -0.4209 0.0836 -0.9032 +vn 0.3900 -0.1353 -0.9108 +vn 0.4415 -0.1127 -0.8901 +vn 0.4742 0.0784 -0.8769 +vn 0.4209 0.0836 -0.9032 +vn -0.3249 0.0745 -0.9428 +vn -0.1883 0.0705 -0.9796 +vn -0.0850 -0.1226 -0.9888 +vn -0.2465 -0.1132 -0.9625 +vn 0.0850 -0.1226 -0.9888 +vn 0.1883 0.0705 -0.9796 +vn 0.3249 0.0745 -0.9428 +vn 0.2465 -0.1132 -0.9625 +vn 0.0940 0.1248 -0.9877 +vn 0.8215 0.1013 -0.5612 +vn 0.2027 -0.1366 -0.9697 +vn -0.2027 -0.1366 -0.9697 +vn -0.8214 0.1013 -0.5612 +vn -0.0940 0.1248 -0.9877 +vn 0.2613 0.7349 -0.6258 +vn -0.1992 0.9792 -0.0379 +vn -0.6616 0.7467 0.0689 +vn -0.5331 0.6611 -0.5280 +vn 0.6616 0.7467 0.0689 +vn 0.1992 0.9792 -0.0379 +vn -0.2613 0.7349 -0.6258 +vn 0.5331 0.6611 -0.5280 +vn 0.5925 -0.1146 -0.7974 +vn 0.1350 0.0215 -0.9906 +vn 0.1295 -0.2589 -0.9572 +vn 0.4466 -0.3788 -0.8106 +vn -0.1295 -0.2589 -0.9572 +vn -0.1350 0.0215 -0.9906 +vn -0.5925 -0.1146 -0.7974 +vn -0.4466 -0.3788 -0.8106 +vn -0.1199 -0.9705 -0.2090 +vn 0.0603 -0.7863 -0.6149 +vn -0.1223 -0.7503 -0.6497 +vn -0.1446 -0.9850 -0.0941 +vn 0.1223 -0.7503 -0.6497 +vn -0.0603 -0.7863 -0.6149 +vn 0.1199 -0.9705 -0.2090 +vn 0.1446 -0.9850 -0.0941 +usemtl None +s off +f 4071/4223/3933 4533/4224/3933 5537/4225/3933 4532/4226/3933 +f 4533/4224/3934 4025/4227/3934 4534/4228/3934 5537/4225/3934 +f 5537/4225/3935 4534/4228/3935 4027/4229/3935 4535/4230/3935 +f 4532/4226/3936 5537/4225/3936 4535/4230/3936 4069/4231/3936 +f 4028/4232/3937 4537/4233/3937 5538/4234/3937 4536/4235/3937 +f 4537/4233/3938 4026/4236/3938 4538/4237/3938 5538/4234/3938 +f 5538/4234/3939 4538/4237/3939 4072/4238/3939 4539/4239/3939 +f 4536/4235/3940 5538/4234/3940 4539/4239/3940 4070/4240/3940 +f 4069/4231/3941 4535/4230/3941 5539/4241/3941 4540/4242/3941 +f 4535/4230/3942 4027/4229/3942 4541/4243/3942 5539/4241/3942 +f 5539/4241/3943 4541/4243/3943 4029/4244/3943 4542/4245/3943 +f 4540/4242/3944 5539/4241/3944 4542/4245/3944 4067/4246/3944 +f 4030/4247/3945 4544/4248/3945 5540/4249/3945 4543/4250/3945 +f 4544/4248/3946 4028/4232/3946 4536/4235/3946 5540/4249/3946 +f 5540/4249/3947 4536/4235/3947 4070/4240/3947 4545/4251/3947 +f 4543/4250/3948 5540/4249/3948 4545/4251/3948 4068/4252/3948 +f 4027/4229/3949 4546/4253/3949 5541/4254/3949 4541/4243/3949 +f 4546/4253/3950 4033/4255/3950 4547/4256/3950 5541/4254/3950 +f 5541/4254/3951 4547/4256/3951 4031/4257/3951 4548/4258/3951 +f 4541/4243/3952 5541/4254/3952 4548/4258/3952 4029/4244/3952 +f 4032/4259/3953 4550/4260/3953 5542/4261/3953 4549/4262/3953 +f 4550/4260/3954 4034/4263/3954 4551/4264/3954 5542/4261/3954 +f 5542/4261/3955 4551/4264/3955 4028/4232/3955 4544/4248/3955 +f 4549/4262/3956 5542/4261/3956 4544/4248/3956 4030/4247/3956 +f 4025/4227/3957 4552/4265/3957 5543/4266/3957 4534/4228/3957 +f 4552/4265/3958 4035/4267/3958 4553/4268/3958 5543/4266/3958 +f 5543/4266/3959 4553/4268/3959 4033/4255/3959 4546/4253/3959 +f 4534/4228/3960 5543/4266/3960 4546/4253/3960 4027/4229/3960 +f 4034/4263/3961 4554/4269/3961 5544/4270/3961 4551/4264/3961 +f 4554/4269/3962 4036/4271/3962 4555/4272/3962 5544/4270/3962 +f 5544/4270/3963 4555/4272/3963 4026/4236/3963 4537/4233/3963 +f 4551/4264/3964 5544/4270/3964 4537/4233/3964 4028/4232/3964 +f 4035/4267/3965 4556/4273/3965 5545/4274/3965 4553/4268/3965 +f 4556/4273/3966 4037/4275/3966 4557/4276/3966 5545/4274/3966 +f 5545/4274/3967 4557/4276/3967 4039/4277/3967 4558/4278/3967 +f 4553/4268/3968 5545/4274/3968 4558/4278/3968 4033/4255/3968 +f 4040/4279/3969 4560/4280/3969 5546/4281/3969 4559/4282/3969 +f 4560/4280/3970 4038/4283/3970 4561/4284/3970 5546/4281/3970 +f 5546/4281/3971 4561/4284/3971 4036/4271/3971 4554/4269/3971 +f 4559/4282/3972 5546/4281/3972 4554/4269/3972 4034/4263/3972 +f 4033/4255/3973 4558/4278/3973 5547/4285/3973 4547/4256/3973 +f 4558/4278/3974 4039/4277/3974 4562/4286/3974 5547/4285/3974 +f 5547/4285/3975 4562/4286/3975 4041/4287/3975 4563/4288/3975 +f 4547/4256/3976 5547/4285/3976 4563/4288/3976 4031/4257/3976 +f 4042/4289/3977 4565/4290/3977 5548/4291/3977 4564/4292/3977 +f 4565/4290/3978 4040/4279/3978 4559/4282/3978 5548/4291/3978 +f 5548/4291/3979 4559/4282/3979 4034/4263/3979 4550/4260/3979 +f 4564/4292/3980 5548/4291/3980 4550/4260/3980 4032/4259/3980 +f 4039/4277/3981 4566/4293/3981 5549/4294/3981 4562/4286/3981 +f 4566/4293/3982 4045/4295/3982 4567/4296/3982 5549/4294/3982 +f 5549/4294/3983 4567/4296/3983 4043/4297/3983 4568/4298/3983 +f 4562/4286/3984 5549/4294/3984 4568/4298/3984 4041/4287/3984 +f 4044/4299/3985 4570/4300/3985 5550/4301/3985 4569/4302/3985 +f 4570/4300/3986 4046/4303/3986 4571/4304/3986 5550/4301/3986 +f 5550/4301/3987 4571/4304/3987 4040/4279/3987 4565/4290/3987 +f 4569/4302/3988 5550/4301/3988 4565/4290/3988 4042/4289/3988 +f 4037/4275/3989 4572/4305/3989 5551/4306/3989 4557/4276/3989 +f 4572/4305/3990 4047/4307/3990 4573/4308/3990 5551/4306/3990 +f 5551/4306/3991 4573/4308/3991 4045/4295/3991 4566/4293/3991 +f 4557/4276/3992 5551/4306/3992 4566/4293/3992 4039/4277/3992 +f 4046/4303/3993 4574/4309/3993 5552/4310/3993 4571/4304/3993 +f 4574/4309/3994 4048/4311/3994 4575/4312/3994 5552/4310/3994 +f 5552/4310/3995 4575/4312/3995 4038/4283/3995 4560/4280/3995 +f 4571/4304/3996 5552/4310/3996 4560/4280/3996 4040/4279/3996 +f 4047/4307/3997 4576/4313/3997 5553/4314/3997 4573/4308/3997 +f 4576/4313/3998 4049/4315/3998 4577/4316/3998 5553/4314/3998 +f 5553/4314/3999 4577/4316/3999 4051/4317/3999 4578/4318/3999 +f 4573/4308/4000 5553/4314/4000 4578/4318/4000 4045/4295/4000 +f 4052/4319/4001 4580/4320/4001 5554/4321/4001 4579/4322/4001 +f 4580/4320/4002 4050/4323/4002 4581/4324/4002 5554/4321/4002 +f 5554/4321/4003 4581/4324/4003 4048/4311/4003 4574/4309/4003 +f 4579/4322/4004 5554/4321/4004 4574/4309/4004 4046/4303/4004 +f 4045/4295/4005 4578/4318/4005 5555/4325/4005 4567/4296/4005 +f 4578/4318/4006 4051/4317/4006 4582/4326/4006 5555/4325/4006 +f 5555/4325/4007 4582/4326/4007 4053/4327/4007 4583/4328/4007 +f 4567/4296/4008 5555/4325/4008 4583/4328/4008 4043/4297/4008 +f 4054/4329/4009 4585/4330/4009 5556/4331/4009 4584/4332/4009 +f 4585/4330/4010 4052/4319/4010 4579/4322/4010 5556/4331/4010 +f 5556/4331/4011 4579/4322/4011 4046/4303/4011 4570/4300/4011 +f 4584/4332/4012 5556/4331/4012 4570/4300/4012 4044/4299/4012 +f 4051/4317/4013 4586/4333/4013 5557/4334/4013 4582/4326/4013 +f 4586/4333/4014 4057/4335/4014 4587/4336/4014 5557/4334/4014 +f 5557/4334/4015 4587/4336/4015 4055/4337/4015 4588/4338/4015 +f 4582/4326/4016 5557/4334/4016 4588/4338/4016 4053/4327/4016 +f 4056/4339/4017 4590/4340/4017 5558/4341/4017 4589/4342/4017 +f 4590/4340/4018 4058/4343/4018 4591/4344/4018 5558/4341/4018 +f 5558/4341/4019 4591/4344/4019 4052/4319/4019 4585/4330/4019 +f 4589/4342/4020 5558/4341/4020 4585/4330/4020 4054/4329/4020 +f 4049/4315/4021 4592/4345/4021 5559/4346/4021 4577/4316/4021 +f 4592/4345/4022 4059/4347/4022 4593/4348/4022 5559/4346/4022 +f 5559/4346/4023 4593/4348/4023 4057/4335/4023 4586/4333/4023 +f 4577/4316/4024 5559/4346/4024 4586/4333/4024 4051/4317/4024 +f 4058/4343/4025 4594/4349/4025 5560/4350/4025 4591/4344/4025 +f 4594/4349/4026 4060/4351/4026 4595/4352/4026 5560/4350/4026 +f 5560/4350/4027 4595/4352/4027 4050/4323/4027 4580/4320/4027 +f 4591/4344/4028 5560/4350/4028 4580/4320/4028 4052/4319/4028 +f 4059/4347/4029 4596/4353/4029 5561/4354/4029 4593/4348/4029 +f 4596/4353/4030 4061/4355/4030 4597/4356/4030 5561/4354/4030 +f 5561/4354/4031 4597/4356/4031 4063/4357/4031 4598/4358/4031 +f 4593/4348/4032 5561/4354/4032 4598/4358/4032 4057/4335/4032 +f 4064/4359/4033 4600/4360/4033 5562/4361/4033 4599/4362/4033 +f 4600/4360/4034 4062/4363/4034 4601/4364/4034 5562/4361/4034 +f 5562/4361/4035 4601/4364/4035 4060/4351/4035 4594/4349/4035 +f 4599/4362/4036 5562/4361/4036 4594/4349/4036 4058/4343/4036 +f 4057/4335/4037 4598/4358/4037 5563/4365/4037 4587/4336/4037 +f 4598/4358/4038 4063/4357/4038 4602/4366/4038 5563/4365/4038 +f 5563/4365/4039 4602/4366/4039 4065/4367/4039 4603/4368/4039 +f 4587/4336/4040 5563/4365/4040 4603/4368/4040 4055/4337/4040 +f 4066/4369/4041 4605/4370/4041 5564/4371/4041 4604/4372/4041 +f 4605/4370/4042 4064/4359/4042 4599/4362/4042 5564/4371/4042 +f 5564/4371/4043 4599/4362/4043 4058/4343/4043 4590/4340/4043 +f 4604/4372/4044 5564/4371/4044 4590/4340/4044 4056/4339/4044 +f 4063/4357/4045 4606/4373/4045 5565/4374/4045 4602/4366/4045 +f 4606/4373/4046 4069/4231/4046 4540/4242/4046 5565/4374/4046 +f 5565/4374/4047 4540/4242/4047 4067/4246/4047 4607/4375/4047 +f 4602/4366/4048 5565/4374/4048 4607/4375/4048 4065/4367/4048 +f 4068/4252/4049 4545/4251/4049 5566/4376/4049 4608/4377/4049 +f 4545/4251/4050 4070/4240/4050 4609/4378/4050 5566/4376/4050 +f 5566/4376/4051 4609/4378/4051 4064/4359/4051 4605/4370/4051 +f 4608/4377/4052 5566/4376/4052 4605/4370/4052 4066/4369/4052 +f 4061/4355/4053 4610/4379/4053 5567/4380/4053 4597/4356/4053 +f 4610/4379/4054 4071/4223/4054 4532/4226/4054 5567/4380/4054 +f 5567/4380/4055 4532/4226/4055 4069/4231/4055 4606/4373/4055 +f 4597/4356/4056 5567/4380/4056 4606/4373/4056 4063/4357/4056 +f 4070/4240/4057 4539/4239/4057 5568/4381/4057 4609/4378/4057 +f 4539/4239/4058 4072/4238/4058 4611/4382/4058 5568/4381/4058 +f 5568/4381/4059 4611/4382/4059 4062/4363/4059 4600/4360/4059 +f 4609/4378/4060 5568/4381/4060 4600/4360/4060 4064/4359/4060 +f 4071/4223/4061 4610/4379/4061 5569/4383/4061 4612/4384/4061 +f 4610/4379/4062 4061/4355/4062 4613/4385/4062 5569/4383/4062 +f 5569/4383/4063 4613/4385/4063 4075/4386/4063 4614/4387/4063 +f 4612/4384/4064 5569/4383/4064 4614/4387/4064 4073/4388/4064 +f 4076/4389/4065 4616/4390/4065 5570/4391/4065 4615/4392/4065 +f 4616/4390/4066 4062/4363/4066 4611/4382/4066 5570/4391/4066 +f 5570/4391/4067 4611/4382/4067 4072/4238/4067 4617/4393/4067 +f 4615/4392/4068 5570/4391/4068 4617/4393/4068 4074/4394/4068 +f 4061/4355/4069 4596/4353/4069 5571/4395/4069 4613/4385/4069 +f 4596/4353/4070 4059/4347/4070 4618/4396/4070 5571/4395/4070 +f 5571/4395/4071 4618/4396/4071 4077/4397/4071 4619/4398/4071 +f 4613/4385/4072 5571/4395/4072 4619/4398/4072 4075/4386/4072 +f 4078/4399/4073 4621/4400/4073 5572/4401/4073 4620/4402/4073 +f 4621/4400/4074 4060/4351/4074 4601/4364/4074 5572/4401/4074 +f 5572/4401/4075 4601/4364/4075 4062/4363/4075 4616/4390/4075 +f 4620/4402/4076 5572/4401/4076 4616/4390/4076 4076/4389/4076 +f 4059/4347/4077 4592/4345/4077 5573/4403/4077 4618/4396/4077 +f 4592/4345/4078 4049/4315/4078 4622/4404/4078 5573/4403/4078 +f 5573/4403/4079 4622/4404/4079 4079/4405/4079 4623/4406/4079 +f 4618/4396/4080 5573/4403/4080 4623/4406/4080 4077/4397/4080 +f 4080/4407/4081 4625/4408/4081 5574/4409/4081 4624/4410/4081 +f 4625/4408/4082 4050/4323/4082 4595/4352/4082 5574/4409/4082 +f 5574/4409/4083 4595/4352/4083 4060/4351/4083 4621/4400/4083 +f 4624/4410/4084 5574/4409/4084 4621/4400/4084 4078/4399/4084 +f 4049/4315/4085 4576/4313/4085 5575/4411/4085 4622/4404/4085 +f 4576/4313/4086 4047/4307/4086 4626/4412/4086 5575/4411/4086 +f 5575/4411/4087 4626/4412/4087 4081/4413/4087 4627/4414/4087 +f 4622/4404/4088 5575/4411/4088 4627/4414/4088 4079/4405/4088 +f 4082/4415/4089 4629/4416/4089 5576/4417/4089 4628/4418/4089 +f 4629/4416/4090 4048/4311/4090 4581/4324/4090 5576/4417/4090 +f 5576/4417/4091 4581/4324/4091 4050/4323/4091 4625/4408/4091 +f 4628/4418/4092 5576/4417/4092 4625/4408/4092 4080/4407/4092 +f 4047/4307/4093 4572/4305/4093 5577/4419/4093 4626/4412/4093 +f 4572/4305/4094 4037/4275/4094 4630/4420/4094 5577/4419/4094 +f 5577/4419/4095 4630/4420/4095 4083/4421/4095 4631/4422/4095 +f 4626/4412/4096 5577/4419/4096 4631/4422/4096 4081/4413/4096 +f 4084/4423/4097 4633/4424/4097 5578/4425/4097 4632/4426/4097 +f 4633/4424/4098 4038/4283/4098 4575/4312/4098 5578/4425/4098 +f 5578/4425/4099 4575/4312/4099 4048/4311/4099 4629/4416/4099 +f 4632/4426/4100 5578/4425/4100 4629/4416/4100 4082/4415/4100 +f 4037/4275/4101 4556/4273/4101 5579/4427/4101 4630/4420/4101 +f 4556/4273/4102 4035/4267/4102 4634/4428/4102 5579/4427/4102 +f 5579/4427/4103 4634/4428/4103 4087/4429/4103 4635/4430/4103 +f 4630/4420/4104 5579/4427/4104 4635/4430/4104 4083/4421/4104 +f 4088/4431/4105 4637/4432/4105 5580/4433/4105 4636/4434/4105 +f 4637/4432/4106 4036/4271/4106 4561/4284/4106 5580/4433/4106 +f 5580/4433/4107 4561/4284/4107 4038/4283/4107 4633/4424/4107 +f 4636/4434/4108 5580/4433/4108 4633/4424/4108 4084/4423/4108 +f 4035/4267/4109 4552/4265/4109 5581/4435/4109 4634/4428/4109 +f 4552/4265/4110 4025/4227/4110 4638/4436/4110 5581/4435/4110 +f 5581/4435/4111 4638/4436/4111 4089/4437/4111 4639/4438/4111 +f 4634/4428/4112 5581/4435/4112 4639/4438/4112 4087/4429/4112 +f 4090/4439/4113 4641/4440/4113 5582/4441/4113 4640/4442/4113 +f 4641/4440/4114 4026/4236/4114 4555/4272/4114 5582/4441/4114 +f 5582/4441/4115 4555/4272/4115 4036/4271/4115 4637/4432/4115 +f 4640/4442/4116 5582/4441/4116 4637/4432/4116 4088/4431/4116 +f 4025/4227/4117 4533/4224/4117 5583/4443/4117 4638/4436/4117 +f 4533/4224/4118 4071/4223/4118 4612/4384/4118 5583/4443/4118 +f 5583/4443/4119 4612/4384/4119 4073/4388/4119 4642/4444/4119 +f 4638/4436/4120 5583/4443/4120 4642/4444/4120 4089/4437/4120 +f 4074/4394/4121 4617/4393/4121 5584/4445/4121 4643/4446/4121 +f 4617/4393/4122 4072/4238/4122 4538/4237/4122 5584/4445/4122 +f 5584/4445/4123 4538/4237/4123 4026/4236/4123 4641/4440/4123 +f 4643/4446/4124 5584/4445/4124 4641/4440/4124 4090/4439/4124 +f 4085/4447/4125 4645/4448/4125 5585/4449/4125 4644/4450/4125 +f 4089/4437/4126 4642/4444/4126 5585/4449/4126 4645/4448/4126 +f 4073/4388/4127 4644/4450/4127 5585/4449/4127 4642/4444/4127 +f 4074/4394/4128 4643/4446/4128 5586/4451/4128 4646/4452/4128 +f 4090/4439/4129 4647/4453/4129 5586/4451/4129 4643/4446/4129 +f 4086/4454/4130 4646/4452/4130 5586/4451/4130 4647/4453/4130 +f 4087/4429/4131 4639/4438/4131 5587/4455/4131 4648/4456/4131 +f 4089/4437/4132 4645/4448/4132 5587/4455/4132 4639/4438/4132 +f 4085/4447/4133 4648/4456/4133 5587/4455/4133 4645/4448/4133 +f 4086/4454/4134 4647/4453/4134 5588/4457/4134 4649/4458/4134 +f 4090/4439/4135 4640/4442/4135 5588/4457/4135 4647/4453/4135 +f 4088/4431/4136 4649/4458/4136 5588/4457/4136 4640/4442/4136 +f 4085/4447/4137 4650/4459/4137 5589/4460/4137 4648/4456/4137 +f 4083/4421/4138 4635/4430/4138 5589/4460/4138 4650/4459/4138 +f 4087/4429/4139 4648/4456/4139 5589/4460/4139 4635/4430/4139 +f 4088/4431/4140 4636/4434/4140 5590/4461/4140 4649/4458/4140 +f 4084/4423/4141 4651/4462/4141 5590/4461/4141 4636/4434/4141 +f 4086/4454/4142 4649/4458/4142 5590/4461/4142 4651/4462/4142 +f 4085/4447/4143 4652/4463/4143 5591/4464/4143 4650/4459/4143 +f 4081/4413/4144 4631/4422/4144 5591/4464/4144 4652/4463/4144 +f 4083/4421/4145 4650/4459/4145 5591/4464/4145 4631/4422/4145 +f 4084/4423/4146 4632/4426/4146 5592/4465/4146 4651/4462/4146 +f 4082/4415/4147 4653/4466/4147 5592/4465/4147 4632/4426/4147 +f 4086/4454/4148 4651/4462/4148 5592/4465/4148 4653/4466/4148 +f 4085/4447/4149 4654/4467/4149 5593/4468/4149 4652/4463/4149 +f 4079/4405/4150 4627/4414/4150 5593/4468/4150 4654/4467/4150 +f 4081/4413/4151 4652/4463/4151 5593/4468/4151 4627/4414/4151 +f 4082/4415/4152 4628/4418/4152 5594/4469/4152 4653/4466/4152 +f 4080/4407/4153 4655/4470/4153 5594/4469/4153 4628/4418/4153 +f 4086/4454/4154 4653/4466/4154 5594/4469/4154 4655/4470/4154 +f 4085/4447/4155 4656/4471/4155 5595/4472/4155 4654/4467/4155 +f 4077/4397/4156 4623/4406/4156 5595/4472/4156 4656/4471/4156 +f 4079/4405/4157 4654/4467/4157 5595/4472/4157 4623/4406/4157 +f 4080/4407/4158 4624/4410/4158 5596/4473/4158 4655/4470/4158 +f 4078/4399/4159 4657/4474/4159 5596/4473/4159 4624/4410/4159 +f 4086/4454/4160 4655/4470/4160 5596/4473/4160 4657/4474/4160 +f 4085/4447/4161 4658/4475/4161 5597/4476/4161 4656/4471/4161 +f 4075/4386/4162 4619/4398/4162 5597/4476/4162 4658/4475/4162 +f 4077/4397/4163 4656/4471/4163 5597/4476/4163 4619/4398/4163 +f 4078/4399/4164 4620/4402/4164 5598/4477/4164 4657/4474/4164 +f 4076/4389/4165 4659/4478/4165 5598/4477/4165 4620/4402/4165 +f 4086/4454/4166 4657/4474/4166 5598/4477/4166 4659/4478/4166 +f 4085/4447/4167 4644/4450/4167 5599/4479/4167 4658/4475/4167 +f 4073/4388/4168 4614/4387/4168 5599/4479/4168 4644/4450/4168 +f 4075/4386/4169 4658/4475/4169 5599/4479/4169 4614/4387/4169 +f 4076/4389/4170 4615/4392/4170 5600/4480/4170 4659/4478/4170 +f 4074/4394/4171 4646/4452/4171 5600/4480/4171 4615/4392/4171 +f 4086/4454/4172 4659/4478/4172 5600/4480/4172 4646/4452/4172 +f 4113/4481/4173 4661/4482/4173 5601/4483/4173 4660/4484/4173 +f 4661/4482/4174 4198/4485/4174 4662/4486/4174 5601/4483/4174 +f 5601/4483/4175 4662/4486/4175 4200/4487/4175 4663/4488/4175 +f 4660/4484/4176 5601/4483/4176 4663/4488/4176 4115/4489/4176 +f 4200/4487/4177 4664/4490/4177 5602/4491/4177 4663/4488/4177 +f 4664/4490/4178 4199/4492/4178 4665/4493/4178 5602/4491/4178 +f 5602/4491/4179 4665/4493/4179 4114/4494/4179 4666/4495/4179 +f 4663/4488/4180 5602/4491/4180 4666/4495/4180 4115/4489/4180 +f 4111/4496/4181 4668/4497/4181 5603/4498/4181 4667/4499/4181 +f 4668/4497/4182 4196/4500/4182 4669/4501/4182 5603/4498/4182 +f 5603/4498/4183 4669/4501/4183 4198/4485/4183 4661/4482/4183 +f 4667/4499/4184 5603/4498/4184 4661/4482/4184 4113/4481/4184 +f 4199/4492/4185 4670/4502/4185 5604/4503/4185 4665/4493/4185 +f 4670/4502/4186 4197/4504/4186 4671/4505/4186 5604/4503/4186 +f 5604/4503/4187 4671/4505/4187 4112/4506/4187 4672/4507/4187 +f 4665/4493/4188 5604/4503/4188 4672/4507/4188 4114/4494/4188 +f 4109/4508/4189 4674/4509/4189 5605/4510/4189 4673/4511/4189 +f 4674/4509/4190 4194/4512/4190 4675/4513/4190 5605/4510/4190 +f 5605/4510/4191 4675/4513/4191 4196/4500/4191 4668/4497/4191 +f 4673/4511/4192 5605/4510/4192 4668/4497/4192 4111/4496/4192 +f 4197/4504/4193 4676/4514/4193 5606/4515/4193 4671/4505/4193 +f 4676/4514/4194 4195/4516/4194 4677/4517/4194 5606/4515/4194 +f 5606/4515/4195 4677/4517/4195 4110/4518/4195 4678/4519/4195 +f 4671/4505/4196 5606/4515/4196 4678/4519/4196 4112/4506/4196 +f 4107/4520/4197 4680/4521/4197 5607/4522/4197 4679/4523/4197 +f 4680/4521/4198 4192/4524/4198 4681/4525/4198 5607/4522/4198 +f 5607/4522/4199 4681/4525/4199 4194/4512/4199 4674/4509/4199 +f 4679/4523/4200 5607/4522/4200 4674/4509/4200 4109/4508/4200 +f 4195/4516/4201 4682/4526/4201 5608/4527/4201 4677/4517/4201 +f 4682/4526/4202 4193/4528/4202 4683/4529/4202 5608/4527/4202 +f 5608/4527/4203 4683/4529/4203 4108/4530/4203 4684/4531/4203 +f 4677/4517/4204 5608/4527/4204 4684/4531/4204 4110/4518/4204 +f 4105/4532/4205 4686/4533/4205 5609/4534/4205 4685/4535/4205 +f 4686/4533/4206 4190/4536/4206 4687/4537/4206 5609/4534/4206 +f 5609/4534/4207 4687/4537/4207 4192/4524/4207 4680/4521/4207 +f 4685/4535/4208 5609/4534/4208 4680/4521/4208 4107/4520/4208 +f 4193/4528/4209 4688/4538/4209 5610/4539/4209 4683/4529/4209 +f 4688/4538/4210 4191/4540/4210 4689/4541/4210 5610/4539/4210 +f 5610/4539/4211 4689/4541/4211 4106/4542/4211 4690/4543/4211 +f 4683/4529/4212 5610/4539/4212 4690/4543/4212 4108/4530/4212 +f 4103/4544/4213 4692/4545/4213 5611/4546/4213 4691/4547/4213 +f 4692/4545/4214 4116/4548/4214 4693/4549/4214 5611/4546/4214 +f 5611/4546/4215 4693/4549/4215 4170/4550/4215 4694/4551/4215 +f 4691/4547/4216 5611/4546/4216 4694/4551/4216 4188/4552/4216 +f 4171/4553/4217 4696/4554/4217 5612/4555/4217 4695/4556/4217 +f 4696/4554/4218 4117/4557/4218 4697/4558/4218 5612/4555/4218 +f 5612/4555/4219 4697/4558/4219 4104/4559/4219 4698/4560/4219 +f 4695/4556/4220 5612/4555/4220 4698/4560/4220 4189/4561/4220 +f 4116/4548/4221 4699/4562/4221 5613/4563/4221 4693/4549/4221 +f 4699/4562/4222 4118/4564/4222 4700/4565/4222 5613/4563/4222 +f 5613/4563/4223 4700/4565/4223 4172/4566/4223 4701/4567/4223 +f 4693/4549/4224 5613/4563/4224 4701/4567/4224 4170/4550/4224 +f 4173/4568/4225 4703/4569/4225 5614/4570/4225 4702/4571/4225 +f 4703/4569/4226 4119/4572/4226 4704/4573/4226 5614/4570/4226 +f 5614/4570/4227 4704/4573/4227 4117/4557/4227 4696/4554/4227 +f 4702/4571/4228 5614/4570/4228 4696/4554/4228 4171/4553/4228 +f 4118/4564/4229 4705/4574/4229 5615/4575/4229 4700/4565/4229 +f 4705/4574/4230 4120/4576/4230 4706/4577/4230 5615/4575/4230 +f 5615/4575/4231 4706/4577/4231 4174/4578/4231 4707/4579/4231 +f 4700/4565/4232 5615/4575/4232 4707/4579/4232 4172/4566/4232 +f 4175/4580/4233 4709/4581/4233 5616/4582/4233 4708/4583/4233 +f 4709/4581/4234 4121/4584/4234 4710/4585/4234 5616/4582/4234 +f 5616/4582/4235 4710/4585/4235 4119/4572/4235 4703/4569/4235 +f 4708/4583/4236 5616/4582/4236 4703/4569/4236 4173/4568/4236 +f 4120/4576/4237 4711/4586/4237 5617/4587/4237 4706/4577/4237 +f 4711/4586/4238 4122/4588/4238 4712/4589/4238 5617/4587/4238 +f 5617/4587/4239 4712/4589/4239 4176/4590/4239 4713/4591/4239 +f 4706/4577/4240 5617/4587/4240 4713/4591/4240 4174/4578/4240 +f 4177/4592/4241 4715/4593/4241 5618/4594/4241 4714/4595/4241 +f 4715/4593/4242 4123/4596/4242 4716/4597/4242 5618/4594/4242 +f 5618/4594/4243 4716/4597/4243 4121/4584/4243 4709/4581/4243 +f 4714/4595/4244 5618/4594/4244 4709/4581/4244 4175/4580/4244 +f 4122/4588/4245 4717/4598/4245 5619/4599/4245 4712/4589/4245 +f 4717/4598/4246 4124/4600/4246 4718/4601/4246 5619/4599/4246 +f 5619/4599/4247 4718/4601/4247 4178/4602/4247 4719/4603/4247 +f 4712/4589/4248 5619/4599/4248 4719/4603/4248 4176/4590/4248 +f 4179/4604/4249 4721/4605/4249 5620/4606/4249 4720/4607/4249 +f 4721/4605/4250 4125/4608/4250 4722/4609/4250 5620/4606/4250 +f 5620/4606/4251 4722/4609/4251 4123/4596/4251 4715/4593/4251 +f 4720/4607/4252 5620/4606/4252 4715/4593/4252 4177/4592/4252 +f 4124/4600/4253 4723/4610/4253 5621/4611/4253 4718/4601/4253 +f 4723/4610/4254 4126/4612/4254 4724/4613/4254 5621/4611/4254 +f 5621/4611/4255 4724/4613/4255 4180/4614/4255 4725/4615/4255 +f 4718/4601/4256 5621/4611/4256 4725/4615/4256 4178/4602/4256 +f 4181/4616/4257 4727/4617/4257 5622/4618/4257 4726/4619/4257 +f 4727/4617/4258 4127/4620/4258 4728/4621/4258 5622/4618/4258 +f 5622/4618/4259 4728/4621/4259 4125/4608/4259 4721/4605/4259 +f 4726/4619/4260 5622/4618/4260 4721/4605/4260 4179/4604/4260 +f 4126/4612/4261 4729/4622/4261 5623/4623/4261 4724/4613/4261 +f 4729/4622/4262 4128/4624/4262 4730/4625/4262 5623/4623/4262 +f 5623/4623/4263 4730/4625/4263 4182/4626/4263 4731/4627/4263 +f 4724/4613/4264 5623/4623/4264 4731/4627/4264 4180/4614/4264 +f 4183/4628/4265 4733/4629/4265 5624/4630/4265 4732/4631/4265 +f 4733/4629/4266 4129/4632/4266 4734/4633/4266 5624/4630/4266 +f 5624/4630/4267 4734/4633/4267 4127/4620/4267 4727/4617/4267 +f 4732/4631/4268 5624/4630/4268 4727/4617/4268 4181/4616/4268 +f 4128/4624/4269 4735/4634/4269 5625/4635/4269 4730/4625/4269 +f 4735/4634/4270 4130/4636/4270 4736/4637/4270 5625/4635/4270 +f 5625/4635/4271 4736/4637/4271 4184/4638/4271 4737/4639/4271 +f 4730/4625/4272 5625/4635/4272 4737/4639/4272 4182/4626/4272 +f 4185/4640/4273 4739/4641/4273 5626/4642/4273 4738/4643/4273 +f 4739/4641/4274 4131/4644/4274 4740/4645/4274 5626/4642/4274 +f 5626/4642/4275 4740/4645/4275 4129/4632/4275 4733/4629/4275 +f 4738/4643/4276 5626/4642/4276 4733/4629/4276 4183/4628/4276 +f 4130/4636/4277 4741/4646/4277 5627/4647/4277 4736/4637/4277 +f 4741/4646/4278 4132/4648/4278 4742/4649/4278 5627/4647/4278 +f 5627/4647/4279 4742/4649/4279 4186/4650/4279 4743/4651/4279 +f 4736/4637/4280 5627/4647/4280 4743/4651/4280 4184/4638/4280 +f 4187/4652/4281 4745/4653/4281 5628/4654/4281 4744/4655/4281 +f 4745/4653/4282 4133/4656/4282 4746/4657/4282 5628/4654/4282 +f 5628/4654/4283 4746/4657/4283 4131/4644/4283 4739/4641/4283 +f 4744/4655/4284 5628/4654/4284 4739/4641/4284 4185/4640/4284 +f 4132/4648/4285 4747/4658/4285 5629/4659/4285 4742/4649/4285 +f 4747/4658/4286 4091/4660/4286 4748/4661/4286 5629/4659/4286 +f 5629/4659/4287 4748/4661/4287 4092/4662/4287 4749/4663/4287 +f 4742/4649/4288 5629/4659/4288 4749/4663/4288 4186/4650/4288 +f 4092/4662/4289 4748/4661/4289 5630/4664/4289 4750/4665/4289 +f 4748/4661/4290 4091/4660/4290 4751/4666/4290 5630/4664/4290 +f 5630/4664/4291 4751/4666/4291 4133/4656/4291 4745/4653/4291 +f 4750/4665/4292 5630/4664/4292 4745/4653/4292 4187/4652/4292 +f 4134/4667/4293 4753/4668/4293 5631/4669/4293 4752/4670/4293 +f 4753/4668/4294 4152/4671/4294 4754/4672/4294 5631/4669/4294 +f 5631/4669/4295 4754/4672/4295 4184/4638/4295 4743/4651/4295 +f 4752/4670/4296 5631/4669/4296 4743/4651/4296 4186/4650/4296 +f 4185/4640/4297 4755/4673/4297 5632/4674/4297 4744/4655/4297 +f 4755/4673/4298 4153/4675/4298 4756/4676/4298 5632/4674/4298 +f 5632/4674/4299 4756/4676/4299 4135/4677/4299 4757/4678/4299 +f 4744/4655/4300 5632/4674/4300 4757/4678/4300 4187/4652/4300 +f 4152/4671/4301 4758/4679/4301 5633/4680/4301 4754/4672/4301 +f 4758/4679/4302 4203/4681/4302 4759/4682/4302 5633/4680/4302 +f 5633/4680/4303 4759/4682/4303 4182/4626/4303 4737/4639/4303 +f 4754/4672/4304 5633/4680/4304 4737/4639/4304 4184/4638/4304 +f 4183/4628/4305 4760/4683/4305 5634/4684/4305 4738/4643/4305 +f 4760/4683/4306 4204/4685/4306 4761/4686/4306 5634/4684/4306 +f 5634/4684/4307 4761/4686/4307 4153/4675/4307 4755/4673/4307 +f 4738/4643/4308 5634/4684/4308 4755/4673/4308 4185/4640/4308 +f 4150/4687/4309 4763/4688/4309 5635/4689/4309 4762/4690/4309 +f 4763/4688/4310 4180/4614/4310 4731/4627/4310 5635/4689/4310 +f 5635/4689/4311 4731/4627/4311 4182/4626/4311 4759/4682/4311 +f 4762/4690/4312 5635/4689/4312 4759/4682/4312 4203/4681/4312 +f 4183/4628/4313 4732/4631/4313 5636/4691/4313 4760/4683/4313 +f 4732/4631/4314 4181/4616/4314 4764/4692/4314 5636/4691/4314 +f 5636/4691/4315 4764/4692/4315 4151/4693/4315 4765/4694/4315 +f 4760/4683/4316 5636/4691/4316 4765/4694/4316 4204/4685/4316 +f 4148/4695/4317 4767/4696/4317 5637/4697/4317 4766/4698/4317 +f 4767/4696/4318 4178/4602/4318 4725/4615/4318 5637/4697/4318 +f 5637/4697/4319 4725/4615/4319 4180/4614/4319 4763/4688/4319 +f 4766/4698/4320 5637/4697/4320 4763/4688/4320 4150/4687/4320 +f 4181/4616/4321 4726/4619/4321 5638/4699/4321 4764/4692/4321 +f 4726/4619/4322 4179/4604/4322 4768/4700/4322 5638/4699/4322 +f 5638/4699/4323 4768/4700/4323 4149/4701/4323 4769/4702/4323 +f 4764/4692/4324 5638/4699/4324 4769/4702/4324 4151/4693/4324 +f 4146/4703/4325 4771/4704/4325 5639/4705/4325 4770/4706/4325 +f 4771/4704/4326 4176/4590/4326 4719/4603/4326 5639/4705/4326 +f 5639/4705/4327 4719/4603/4327 4178/4602/4327 4767/4696/4327 +f 4770/4706/4328 5639/4705/4328 4767/4696/4328 4148/4695/4328 +f 4179/4604/4329 4720/4607/4329 5640/4707/4329 4768/4700/4329 +f 4720/4607/4330 4177/4592/4330 4772/4708/4330 5640/4707/4330 +f 5640/4707/4331 4772/4708/4331 4147/4709/4331 4773/4710/4331 +f 4768/4700/4332 5640/4707/4332 4773/4710/4332 4149/4701/4332 +f 4144/4711/4333 4775/4712/4333 5641/4713/4333 4774/4714/4333 +f 4775/4712/4334 4174/4578/4334 4713/4591/4334 5641/4713/4334 +f 5641/4713/4335 4713/4591/4335 4176/4590/4335 4771/4704/4335 +f 4774/4714/4336 5641/4713/4336 4771/4704/4336 4146/4703/4336 +f 4177/4592/4337 4714/4595/4337 5642/4715/4337 4772/4708/4337 +f 4714/4595/4338 4175/4580/4338 4776/4716/4338 5642/4715/4338 +f 5642/4715/4339 4776/4716/4339 4145/4717/4339 4777/4718/4339 +f 4772/4708/4340 5642/4715/4340 4777/4718/4340 4147/4709/4340 +f 4142/4719/4341 4779/4720/4341 5643/4721/4341 4778/4722/4341 +f 4779/4720/4342 4172/4566/4342 4707/4579/4342 5643/4721/4342 +f 5643/4721/4343 4707/4579/4343 4174/4578/4343 4775/4712/4343 +f 4778/4722/4344 5643/4721/4344 4775/4712/4344 4144/4711/4344 +f 4175/4580/4345 4708/4583/4345 5644/4723/4345 4776/4716/4345 +f 4708/4583/4346 4173/4568/4346 4780/4724/4346 5644/4723/4346 +f 5644/4723/4347 4780/4724/4347 4143/4725/4347 4781/4726/4347 +f 4776/4716/4348 5644/4723/4348 4781/4726/4348 4145/4717/4348 +f 4140/4727/4349 4783/4728/4349 5645/4729/4349 4782/4730/4349 +f 4783/4728/4350 4170/4550/4350 4701/4567/4350 5645/4729/4350 +f 5645/4729/4351 4701/4567/4351 4172/4566/4351 4779/4720/4351 +f 4782/4730/4352 5645/4729/4352 4779/4720/4352 4142/4719/4352 +f 4173/4568/4353 4702/4571/4353 5646/4731/4353 4780/4724/4353 +f 4702/4571/4354 4171/4553/4354 4784/4732/4354 5646/4731/4354 +f 5646/4731/4355 4784/4732/4355 4141/4733/4355 4785/4734/4355 +f 4780/4724/4356 5646/4731/4356 4785/4734/4356 4143/4725/4356 +f 4138/4735/4357 4787/4736/4357 5647/4737/4357 4786/4738/4357 +f 4787/4736/4358 4188/4552/4358 4694/4551/4358 5647/4737/4358 +f 5647/4737/4359 4694/4551/4359 4170/4550/4359 4783/4728/4359 +f 4786/4738/4360 5647/4737/4360 4783/4728/4360 4140/4727/4360 +f 4171/4553/4361 4695/4556/4361 5648/4739/4361 4784/4732/4361 +f 4695/4556/4362 4189/4561/4362 4788/4740/4362 5648/4739/4362 +f 5648/4739/4363 4788/4740/4363 4139/4741/4363 4789/4742/4363 +f 4784/4732/4364 5648/4739/4364 4789/4742/4364 4141/4733/4364 +f 4138/4735/4365 4790/4743/4365 5649/4744/4365 4787/4736/4365 +f 4790/4743/4366 4205/4745/4366 4791/4746/4366 5649/4744/4366 +f 5649/4744/4367 4791/4746/4367 4201/4747/4367 4792/4748/4367 +f 4787/4736/4368 5649/4744/4368 4792/4748/4368 4188/4552/4368 +f 4201/4747/4369 4794/4749/4369 5650/4750/4369 4793/4751/4369 +f 4794/4749/4370 4206/4752/4370 4795/4753/4370 5650/4750/4370 +f 5650/4750/4371 4795/4753/4371 4139/4741/4371 4788/4740/4371 +f 4793/4751/4372 5650/4750/4372 4788/4740/4372 4189/4561/4372 +f 4134/4667/4373 4752/4670/4373 5651/4754/4373 4796/4755/4373 +f 4752/4670/4374 4186/4650/4374 4749/4663/4374 5651/4754/4374 +f 5651/4754/4375 4749/4663/4375 4092/4662/4375 4797/4756/4375 +f 4796/4755/4376 5651/4754/4376 4797/4756/4376 4136/4757/4376 +f 4092/4662/4377 4750/4665/4377 5652/4758/4377 4798/4759/4377 +f 4750/4665/4378 4187/4652/4378 4757/4678/4378 5652/4758/4378 +f 5652/4758/4379 4757/4678/4379 4135/4677/4379 4799/4760/4379 +f 4798/4759/4380 5652/4758/4380 4799/4760/4380 4137/4761/4380 +f 4136/4757/4381 4797/4756/4381 5653/4762/4381 4800/4763/4381 +f 4797/4756/4382 4092/4662/4382 4801/4764/4382 5653/4762/4382 +f 5653/4762/4383 4801/4764/4383 4202/4765/4383 4802/4766/4383 +f 4800/4763/4384 5653/4762/4384 4802/4766/4384 4207/4767/4384 +f 4202/4765/4385 4801/4764/4385 5654/4768/4385 4803/4769/4385 +f 4801/4764/4386 4092/4662/4386 4798/4759/4386 5654/4768/4386 +f 5654/4768/4387 4798/4759/4387 4137/4761/4387 4804/4770/4387 +f 4803/4769/4388 5654/4768/4388 4804/4770/4388 4208/4771/4388 +f 4201/4747/4389 4791/4746/4389 5655/4772/4389 4805/4773/4389 +f 4791/4746/4390 4205/4745/4390 4806/4774/4390 5655/4772/4390 +f 5655/4772/4391 4806/4774/4391 4207/4767/4391 4802/4766/4391 +f 4805/4773/4392 5655/4772/4392 4802/4766/4392 4202/4765/4392 +f 4208/4771/4393 4807/4775/4393 5656/4776/4393 4803/4769/4393 +f 4807/4775/4394 4206/4752/4394 4794/4749/4394 5656/4776/4394 +f 5656/4776/4395 4794/4749/4395 4201/4747/4395 4805/4773/4395 +f 4803/4769/4396 5656/4776/4396 4805/4773/4396 4202/4765/4396 +f 4159/4777/4397 4809/4778/4397 5657/4779/4397 4808/4780/4397 +f 4809/4778/4398 4161/4781/4398 4810/4782/4398 5657/4779/4398 +f 5657/4779/4399 4810/4782/4399 4200/4487/4399 4662/4486/4399 +f 4808/4780/4400 5657/4779/4400 4662/4486/4400 4198/4485/4400 +f 4200/4487/4401 4810/4782/4401 5658/4783/4401 4664/4490/4401 +f 4810/4782/4402 4161/4781/4402 4811/4784/4402 5658/4783/4402 +f 5658/4783/4403 4811/4784/4403 4160/4785/4403 4812/4786/4403 +f 4664/4490/4404 5658/4783/4404 4812/4786/4404 4199/4492/4404 +f 4157/4787/4405 4814/4788/4405 5659/4789/4405 4813/4790/4405 +f 4814/4788/4406 4159/4777/4406 4808/4780/4406 5659/4789/4406 +f 5659/4789/4407 4808/4780/4407 4198/4485/4407 4669/4501/4407 +f 4813/4790/4408 5659/4789/4408 4669/4501/4408 4196/4500/4408 +f 4199/4492/4409 4812/4786/4409 5660/4791/4409 4670/4502/4409 +f 4812/4786/4410 4160/4785/4410 4815/4792/4410 5660/4791/4410 +f 5660/4791/4411 4815/4792/4411 4158/4793/4411 4816/4794/4411 +f 4670/4502/4412 5660/4791/4412 4816/4794/4412 4197/4504/4412 +f 4155/4795/4413 4818/4796/4413 5661/4797/4413 4817/4798/4413 +f 4818/4796/4414 4157/4787/4414 4813/4790/4414 5661/4797/4414 +f 5661/4797/4415 4813/4790/4415 4196/4500/4415 4675/4513/4415 +f 4817/4798/4416 5661/4797/4416 4675/4513/4416 4194/4512/4416 +f 4197/4504/4417 4816/4794/4417 5662/4799/4417 4676/4514/4417 +f 4816/4794/4418 4158/4793/4418 4819/4800/4418 5662/4799/4418 +f 5662/4799/4419 4819/4800/4419 4156/4801/4419 4820/4802/4419 +f 4676/4514/4420 5662/4799/4420 4820/4802/4420 4195/4516/4420 +f 4190/4536/4421 4821/4803/4421 5663/4804/4421 4687/4537/4421 +f 4821/4803/4422 4211/4805/4422 4822/4806/4422 5663/4804/4422 +f 5663/4804/4423 4822/4806/4423 4209/4807/4423 4823/4808/4423 +f 4687/4537/4424 5663/4804/4424 4823/4808/4424 4192/4524/4424 +f 4210/4809/4425 4825/4810/4425 5664/4811/4425 4824/4812/4425 +f 4825/4810/4426 4212/4813/4426 4826/4814/4426 5664/4811/4426 +f 5664/4811/4427 4826/4814/4427 4191/4540/4427 4688/4538/4427 +f 4824/4812/4428 5664/4811/4428 4688/4538/4428 4193/4528/4428 +f 4155/4795/4429 4817/4798/4429 5665/4815/4429 4827/4816/4429 +f 4817/4798/4430 4194/4512/4430 4681/4525/4430 5665/4815/4430 +f 5665/4815/4431 4681/4525/4431 4192/4524/4431 4823/4808/4431 +f 4827/4816/4432 5665/4815/4432 4823/4808/4432 4209/4807/4432 +f 4193/4528/4433 4682/4526/4433 5666/4817/4433 4824/4812/4433 +f 4682/4526/4434 4195/4516/4434 4820/4802/4434 5666/4817/4434 +f 5666/4817/4435 4820/4802/4435 4156/4801/4435 4828/4818/4435 +f 4824/4812/4436 5666/4817/4436 4828/4818/4436 4210/4809/4436 +f 4168/4819/4437 4830/4820/4437 5667/4821/4437 4829/4822/4437 +f 4830/4820/4438 4214/4823/4438 4831/4824/4438 5667/4821/4438 +f 5667/4821/4439 4831/4824/4439 4213/4825/4439 4832/4826/4439 +f 4829/4822/4440 5667/4821/4440 4832/4826/4440 4211/4805/4440 +f 4213/4825/4441 4831/4824/4441 5668/4827/4441 4833/4828/4441 +f 4831/4824/4442 4214/4823/4442 4834/4829/4442 5668/4827/4442 +f 5668/4827/4443 4834/4829/4443 4169/4830/4443 4835/4831/4443 +f 4833/4828/4444 5668/4827/4444 4835/4831/4444 4212/4813/4444 +f 4209/4807/4445 4822/4806/4445 5669/4832/4445 4836/4833/4445 +f 4822/4806/4446 4211/4805/4446 4832/4826/4446 5669/4832/4446 +f 5669/4832/4447 4832/4826/4447 4213/4825/4447 4837/4834/4447 +f 4836/4833/4448 5669/4832/4448 4837/4834/4448 4093/4835/4448 +f 4213/4825/4447 4833/4828/4447 5670/4836/4447 4837/4834/4447 +f 4833/4828/4449 4212/4813/4449 4825/4810/4449 5670/4836/4449 +f 5670/4836/4450 4825/4810/4450 4210/4809/4450 4838/4837/4450 +f 4837/4834/4451 5670/4836/4451 4838/4837/4451 4093/4835/4451 +f 4154/4838/4452 4840/4839/4452 5671/4840/4452 4839/4841/4452 +f 4840/4839/4453 4155/4795/4453 4827/4816/4453 5671/4840/4453 +f 5671/4840/4454 4827/4816/4454 4209/4807/4454 4836/4833/4454 +f 4839/4841/4455 5671/4840/4455 4836/4833/4455 4093/4835/4455 +f 4210/4809/4456 4828/4818/4456 5672/4842/4456 4838/4837/4456 +f 4828/4818/4457 4156/4801/4457 4841/4843/4457 5672/4842/4457 +f 5672/4842/4458 4841/4843/4458 4154/4838/4458 4839/4841/4458 +f 4838/4837/4459 5672/4842/4459 4839/4841/4459 4093/4835/4459 +f 4166/4844/4460 4843/4845/4460 5673/4846/4460 4842/4847/4460 +f 4843/4845/4461 4217/4848/4461 4844/4849/4461 5673/4846/4461 +f 5673/4846/4462 4844/4849/4462 4215/4850/4462 4845/4851/4462 +f 4842/4847/4463 5673/4846/4463 4845/4851/4463 4168/4819/4463 +f 4216/4852/4464 4847/4853/4464 5674/4854/4464 4846/4855/4464 +f 4847/4853/4465 4218/4856/4465 4848/4857/4465 5674/4854/4465 +f 5674/4854/4466 4848/4857/4466 4167/4858/4466 4849/4859/4466 +f 4846/4855/4467 5674/4854/4467 4849/4859/4467 4169/4830/4467 +f 4164/4860/4468 4851/4861/4468 5675/4862/4468 4850/4863/4468 +f 4851/4861/4469 4219/4864/4469 4852/4865/4469 5675/4862/4469 +f 5675/4862/4470 4852/4865/4470 4217/4848/4470 4843/4845/4470 +f 4850/4863/4471 5675/4862/4471 4843/4845/4471 4166/4844/4471 +f 4218/4856/4472 4853/4866/4472 5676/4867/4472 4848/4857/4472 +f 4853/4866/4473 4220/4868/4473 4854/4869/4473 5676/4867/4473 +f 5676/4867/4474 4854/4869/4474 4165/4870/4474 4855/4871/4474 +f 4848/4857/4475 5676/4867/4475 4855/4871/4475 4167/4858/4475 +f 4163/4872/4476 4857/4873/4476 5677/4874/4476 4856/4875/4476 +f 4857/4873/4477 4221/4876/4477 4858/4877/4477 5677/4874/4477 +f 5677/4874/4478 4858/4877/4478 4219/4864/4478 4851/4861/4478 +f 4856/4875/4479 5677/4874/4479 4851/4861/4479 4164/4860/4479 +f 4220/4868/4480 4859/4878/4480 5678/4879/4480 4854/4869/4480 +f 4859/4878/4481 4222/4880/4481 4860/4881/4481 5678/4879/4481 +f 5678/4879/4482 4860/4881/4482 4163/4872/4482 4861/4882/4482 +f 4854/4869/4483 5678/4879/4483 4861/4882/4483 4165/4870/4483 +f 4162/4883/4484 4863/4884/4484 5679/4885/4484 4862/4886/4484 +f 4863/4884/4485 4095/4887/4485 4864/4888/4485 5679/4885/4485 +f 5679/4885/4486 4864/4888/4486 4221/4876/4486 4857/4873/4486 +f 4862/4886/4487 5679/4885/4487 4857/4873/4487 4163/4872/4487 +f 4222/4880/4488 4865/4889/4488 5680/4890/4488 4860/4881/4488 +f 4865/4889/4489 4095/4887/4489 4863/4884/4489 5680/4890/4489 +f 5680/4890/4490 4863/4884/4490 4162/4883/4490 4862/4886/4490 +f 4860/4881/4491 5680/4890/4491 4862/4886/4491 4163/4872/4491 +f 4214/4823/4492 4830/4820/4492 5681/4891/4492 4866/4892/4492 +f 4830/4820/4493 4168/4819/4493 4845/4851/4493 5681/4891/4493 +f 5681/4891/4494 4845/4851/4494 4215/4850/4494 4867/4893/4494 +f 4866/4892/4495 5681/4891/4495 4867/4893/4495 4094/4894/4495 +f 4216/4852/4496 4846/4855/4496 5682/4895/4496 4868/4896/4496 +f 4846/4855/4497 4169/4830/4497 4834/4829/4497 5682/4895/4497 +f 5682/4895/4498 4834/4829/4498 4214/4823/4498 4866/4892/4498 +f 4868/4896/4499 5682/4895/4499 4866/4892/4499 4094/4894/4499 +f 4094/4894/4500 4867/4893/4500 5683/4897/4500 4869/4898/4500 +f 4867/4893/4501 4215/4850/4501 4870/4899/4501 5683/4897/4501 +f 5683/4897/4502 4870/4899/4502 4230/4900/4502 4871/4901/4502 +f 4869/4898/4503 5683/4897/4503 4871/4901/4503 4232/4902/4503 +f 4231/4903/4504 4873/4904/4504 5684/4905/4504 4872/4906/4504 +f 4873/4904/4505 4216/4852/4505 4868/4896/4505 5684/4905/4505 +f 5684/4905/4506 4868/4896/4506 4094/4894/4506 4869/4898/4506 +f 4872/4906/4507 5684/4905/4507 4869/4898/4507 4232/4902/4507 +f 4095/4887/4508 4874/4907/4508 5685/4908/4508 4864/4888/4508 +f 4874/4907/4509 4223/4909/4509 4875/4910/4509 5685/4908/4509 +f 5685/4908/4510 4875/4910/4510 4224/4911/4510 4876/4912/4510 +f 4864/4888/4511 5685/4908/4511 4876/4912/4511 4221/4876/4511 +f 4225/4913/4512 4878/4914/4512 5686/4915/4512 4877/4916/4512 +f 4878/4914/4513 4223/4909/4513 4874/4907/4513 5686/4915/4513 +f 5686/4915/4514 4874/4907/4514 4095/4887/4514 4865/4889/4514 +f 4877/4916/4515 5686/4915/4515 4865/4889/4515 4222/4880/4515 +f 4221/4876/4516 4876/4912/4516 5687/4917/4516 4858/4877/4516 +f 4876/4912/4517 4224/4911/4517 4879/4918/4517 5687/4917/4517 +f 5687/4917/4518 4879/4918/4518 4226/4919/4518 4880/4920/4518 +f 4858/4877/4519 5687/4917/4519 4880/4920/4519 4219/4864/4519 +f 4227/4921/4520 4882/4922/4520 5688/4923/4520 4881/4924/4520 +f 4882/4922/4521 4225/4913/4521 4877/4916/4521 5688/4923/4521 +f 5688/4923/4522 4877/4916/4522 4222/4880/4522 4859/4878/4522 +f 4881/4924/4523 5688/4923/4523 4859/4878/4523 4220/4868/4523 +f 4219/4864/4524 4880/4920/4524 5689/4925/4524 4852/4865/4524 +f 4880/4920/4525 4226/4919/4525 4883/4926/4525 5689/4925/4525 +f 5689/4925/4526 4883/4926/4526 4228/4927/4526 4884/4928/4526 +f 4852/4865/4527 5689/4925/4527 4884/4928/4527 4217/4848/4527 +f 4229/4929/4528 4886/4930/4528 5690/4931/4528 4885/4932/4528 +f 4886/4930/4529 4227/4921/4529 4881/4924/4529 5690/4931/4529 +f 5690/4931/4530 4881/4924/4530 4220/4868/4530 4853/4866/4530 +f 4885/4932/4531 5690/4931/4531 4853/4866/4531 4218/4856/4531 +f 4217/4848/4532 4884/4928/4532 5691/4933/4532 4844/4849/4532 +f 4884/4928/4533 4228/4927/4533 4887/4934/4533 5691/4933/4533 +f 5691/4933/4534 4887/4934/4534 4230/4900/4534 4870/4899/4534 +f 4844/4849/4535 5691/4933/4535 4870/4899/4535 4215/4850/4535 +f 4231/4903/4536 4888/4935/4536 5692/4936/4536 4873/4904/4536 +f 4888/4935/4537 4229/4929/4537 4885/4932/4537 5692/4936/4537 +f 5692/4936/4538 4885/4932/4538 4218/4856/4538 4847/4853/4538 +f 4873/4904/4539 5692/4936/4539 4847/4853/4539 4216/4852/4539 +f 4223/4909/4540 4889/4937/4540 5693/4938/4540 4875/4910/4540 +f 4889/4937/4541 4228/4927/4541 4883/4926/4541 5693/4938/4541 +f 5693/4938/4542 4883/4926/4542 4226/4919/4542 4879/4918/4542 +f 4875/4910/4543 5693/4938/4543 4879/4918/4543 4224/4911/4543 +f 4227/4921/4544 4886/4930/4544 5694/4939/4544 4882/4922/4544 +f 4886/4930/4545 4229/4929/4545 4890/4940/4545 5694/4939/4545 +f 5694/4939/4546 4890/4940/4546 4223/4909/4546 4878/4914/4546 +f 4882/4922/4547 5694/4939/4547 4878/4914/4547 4225/4913/4547 +f 4223/4909/4548 4891/4941/4548 5695/4942/4548 4889/4937/4548 +f 4891/4941/4549 4232/4902/4549 4871/4901/4549 5695/4942/4549 +f 5695/4942/4550 4871/4901/4550 4230/4900/4550 4887/4934/4550 +f 4889/4937/4551 5695/4942/4551 4887/4934/4551 4228/4927/4551 +f 4231/4903/4552 4872/4906/4552 5696/4943/4552 4888/4935/4552 +f 4872/4906/4553 4232/4902/4553 4891/4941/4553 5696/4943/4553 +f 5696/4943/4554 4891/4941/4554 4223/4909/4554 4890/4940/4554 +f 4888/4935/4555 5696/4943/4555 4890/4940/4555 4229/4929/4555 +f 4163/4872/4556 4856/4875/4556 5697/4944/4556 4892/4945/4556 +f 4856/4875/4557 4164/4860/4557 4893/4946/4557 5697/4944/4557 +f 5697/4944/4558 4893/4946/4558 4188/4552/4558 4792/4748/4558 +f 4892/4945/4559 5697/4944/4559 4792/4748/4559 4201/4747/4559 +f 4189/4561/4560 4894/4947/4560 5698/4948/4560 4793/4751/4560 +f 4894/4947/4561 4165/4870/4561 4861/4882/4561 5698/4948/4561 +f 5698/4948/4562 4861/4882/4562 4163/4872/4562 4892/4945/4562 +f 4793/4751/4563 5698/4948/4563 4892/4945/4563 4201/4747/4563 +f 4164/4860/4564 4850/4863/4564 5699/4949/4564 4893/4946/4564 +f 4850/4863/4565 4166/4844/4565 4895/4950/4565 5699/4949/4565 +f 5699/4949/4566 4895/4950/4566 4235/4951/4566 4896/4952/4566 +f 4893/4946/4567 5699/4949/4567 4896/4952/4567 4188/4552/4567 +f 4236/4953/4568 4898/4954/4568 5700/4955/4568 4897/4956/4568 +f 4898/4954/4569 4167/4858/4569 4855/4871/4569 5700/4955/4569 +f 5700/4955/4570 4855/4871/4570 4165/4870/4570 4894/4947/4570 +f 4897/4956/4571 5700/4955/4571 4894/4947/4571 4189/4561/4571 +f 4166/4844/4572 4842/4847/4572 5701/4957/4572 4895/4950/4572 +f 4842/4847/4573 4168/4819/4573 4899/4958/4573 5701/4957/4573 +f 5701/4957/4574 4899/4958/4574 4237/4959/4574 4900/4960/4574 +f 4895/4950/4575 5701/4957/4575 4900/4960/4575 4235/4951/4575 +f 4238/4961/4576 4902/4962/4576 5702/4963/4576 4901/4964/4576 +f 4902/4962/4577 4169/4830/4577 4849/4859/4577 5702/4963/4577 +f 5702/4963/4578 4849/4859/4578 4167/4858/4578 4898/4954/4578 +f 4901/4964/4579 5702/4963/4579 4898/4954/4579 4236/4953/4579 +f 4168/4819/4580 4829/4822/4580 5703/4965/4580 4899/4958/4580 +f 4829/4822/4581 4211/4805/4581 4821/4803/4581 5703/4965/4581 +f 5703/4965/4582 4821/4803/4582 4190/4536/4582 4903/4966/4582 +f 4899/4958/4583 5703/4965/4583 4903/4966/4583 4237/4959/4583 +f 4191/4540/4584 4826/4814/4584 5704/4967/4584 4904/4968/4584 +f 4826/4814/4585 4212/4813/4585 4835/4831/4585 5704/4967/4585 +f 5704/4967/4586 4835/4831/4586 4169/4830/4586 4902/4962/4586 +f 4904/4968/4587 5704/4967/4587 4902/4962/4587 4238/4961/4587 +f 4105/4532/4588 4905/4969/4588 5705/4970/4588 4686/4533/4588 +f 4905/4969/4589 4233/4971/4589 4906/4972/4589 5705/4970/4589 +f 5705/4970/4590 4906/4972/4590 4237/4959/4590 4903/4966/4590 +f 4686/4533/4591 5705/4970/4591 4903/4966/4591 4190/4536/4591 +f 4238/4961/4592 4907/4973/4592 5706/4974/4592 4904/4968/4592 +f 4907/4973/4593 4234/4975/4593 4908/4976/4593 5706/4974/4593 +f 5706/4974/4594 4908/4976/4594 4106/4542/4594 4689/4541/4594 +f 4904/4968/4595 5706/4974/4595 4689/4541/4595 4191/4540/4595 +f 4233/4971/4596 4909/4977/4596 5707/4978/4596 4906/4972/4596 +f 4909/4977/4597 4239/4979/4597 4910/4980/4597 5707/4978/4597 +f 5707/4978/4598 4910/4980/4598 4235/4951/4598 4900/4960/4598 +f 4906/4972/4599 5707/4978/4599 4900/4960/4599 4237/4959/4599 +f 4236/4953/4600 4911/4981/4600 5708/4982/4600 4901/4964/4600 +f 4911/4981/4601 4240/4983/4601 4912/4984/4601 5708/4982/4601 +f 5708/4982/4602 4912/4984/4602 4234/4975/4602 4907/4973/4602 +f 4901/4964/4603 5708/4982/4603 4907/4973/4603 4238/4961/4603 +f 4103/4544/4604 4691/4547/4604 5709/4985/4604 4913/4986/4604 +f 4691/4547/4605 4188/4552/4605 4896/4952/4605 5709/4985/4605 +f 5709/4985/4606 4896/4952/4606 4235/4951/4606 4910/4980/4606 +f 4913/4986/4607 5709/4985/4607 4910/4980/4607 4239/4979/4607 +f 4236/4953/4608 4897/4956/4608 5710/4987/4608 4911/4981/4608 +f 4897/4956/4609 4189/4561/4609 4698/4560/4609 5710/4987/4609 +f 5710/4987/4610 4698/4560/4610 4104/4559/4610 4914/4988/4610 +f 4911/4981/4611 5710/4987/4611 4914/4988/4611 4240/4983/4611 +f 4155/4795/4612 4840/4839/4612 5711/4989/4612 4915/4990/4612 +f 4840/4839/4613 4154/4838/4613 4916/4991/4613 5711/4989/4613 +f 5711/4989/4614 4916/4991/4614 4096/4992/4614 4917/4993/4614 +f 4915/4990/4615 5711/4989/4615 4917/4993/4615 4246/4994/4615 +f 4096/4992/4616 4916/4991/4616 5712/4995/4616 4918/4996/4616 +f 4916/4991/4617 4154/4838/4617 4841/4843/4617 5712/4995/4617 +f 5712/4995/4618 4841/4843/4618 4156/4801/4618 4919/4997/4618 +f 4918/4996/4619 5712/4995/4619 4919/4997/4619 4247/4998/4619 +f 4157/4787/4620 4818/4796/4620 5713/4999/4620 4920/5000/4620 +f 4818/4796/4621 4155/4795/4621 4915/4990/4621 5713/4999/4621 +f 5713/4999/4622 4915/4990/4622 4246/4994/4622 4921/5001/4622 +f 4920/5000/4623 5713/4999/4623 4921/5001/4623 4244/5002/4623 +f 4247/4998/4624 4919/4997/4624 5714/5003/4624 4922/5004/4624 +f 4919/4997/4625 4156/4801/4625 4819/4800/4625 5714/5003/4625 +f 5714/5003/4626 4819/4800/4626 4158/4793/4626 4923/5005/4626 +f 4922/5004/4627 5714/5003/4627 4923/5005/4627 4245/5006/4627 +f 4159/4777/4628 4814/4788/4628 5715/5007/4628 4924/5008/4628 +f 4814/4788/4629 4157/4787/4629 4920/5000/4629 5715/5007/4629 +f 5715/5007/4630 4920/5000/4630 4244/5002/4630 4925/5009/4630 +f 4924/5008/4631 5715/5007/4631 4925/5009/4631 4242/5010/4631 +f 4245/5006/4632 4923/5005/4632 5716/5011/4632 4926/5012/4632 +f 4923/5005/4633 4158/4793/4633 4815/4792/4633 5716/5011/4633 +f 5716/5011/4634 4815/4792/4634 4160/4785/4634 4927/5013/4634 +f 4926/5012/4635 5716/5011/4635 4927/5013/4635 4243/5014/4635 +f 4161/4781/4636 4809/4778/4636 5717/5015/4636 4928/5016/4636 +f 4809/4778/4637 4159/4777/4637 4924/5008/4637 5717/5015/4637 +f 5717/5015/4638 4924/5008/4638 4242/5010/4638 4929/5017/4638 +f 4928/5016/4639 5717/5015/4639 4929/5017/4639 4241/5018/4639 +f 4243/5014/4640 4927/5013/4640 5718/5019/4640 4930/5020/4640 +f 4927/5013/4641 4160/4785/4641 4811/4784/4641 5718/5019/4641 +f 5718/5019/4642 4811/4784/4642 4161/4781/4642 4928/5016/4642 +f 4930/5020/4643 5718/5019/4643 4928/5016/4643 4241/5018/4643 +f 4241/5018/4644 4929/5017/4644 5719/5021/4644 4931/5022/4644 +f 4929/5017/4645 4242/5010/4645 4932/5023/4645 5719/5021/4645 +f 5719/5021/4646 4932/5023/4646 4253/5024/4646 4933/5025/4646 +f 4931/5022/4647 5719/5021/4647 4933/5025/4647 4255/5026/4647 +f 4254/5027/4648 4935/5028/4648 5720/5029/4648 4934/5030/4648 +f 4935/5028/4649 4243/5014/4649 4930/5020/4649 5720/5029/4649 +f 5720/5029/4650 4930/5020/4650 4241/5018/4650 4931/5022/4650 +f 4934/5030/4651 5720/5029/4651 4931/5022/4651 4255/5026/4651 +f 4242/5010/4652 4925/5009/4652 5721/5031/4652 4932/5023/4652 +f 4925/5009/4653 4244/5002/4653 4936/5032/4653 5721/5031/4653 +f 5721/5031/4654 4936/5032/4654 4251/5033/4654 4937/5034/4654 +f 4932/5023/4655 5721/5031/4655 4937/5034/4655 4253/5024/4655 +f 4252/5035/4656 4939/5036/4656 5722/5037/4656 4938/5038/4656 +f 4939/5036/4657 4245/5006/4657 4926/5012/4657 5722/5037/4657 +f 5722/5037/4658 4926/5012/4658 4243/5014/4658 4935/5028/4658 +f 4938/5038/4659 5722/5037/4659 4935/5028/4659 4254/5027/4659 +f 4244/5002/4660 4921/5001/4660 5723/5039/4660 4936/5032/4660 +f 4921/5001/4661 4246/4994/4661 4940/5040/4661 5723/5039/4661 +f 5723/5039/4662 4940/5040/4662 4249/5041/4662 4941/5042/4662 +f 4936/5032/4663 5723/5039/4663 4941/5042/4663 4251/5033/4663 +f 4250/5043/4664 4943/5044/4664 5724/5045/4664 4942/5046/4664 +f 4943/5044/4665 4247/4998/4665 4922/5004/4665 5724/5045/4665 +f 5724/5045/4666 4922/5004/4666 4245/5006/4666 4939/5036/4666 +f 4942/5046/4667 5724/5045/4667 4939/5036/4667 4252/5035/4667 +f 4246/4994/4668 4917/4993/4668 5725/5047/4668 4940/5040/4668 +f 4917/4993/4669 4096/4992/4669 4944/5048/4669 5725/5047/4669 +f 5725/5047/4670 4944/5048/4670 4248/5049/4670 4945/5050/4670 +f 4940/5040/4671 5725/5047/4671 4945/5050/4671 4249/5041/4671 +f 4248/5049/4672 4944/5048/4672 5726/5051/4672 4946/5052/4672 +f 4944/5048/4673 4096/4992/4673 4918/4996/4673 5726/5051/4673 +f 5726/5051/4674 4918/4996/4674 4247/4998/4674 4943/5044/4674 +f 4946/5052/4675 5726/5051/4675 4943/5044/4675 4250/5043/4675 +f 4248/5049/4676 4947/5053/4676 5727/5054/4676 4945/5050/4676 +f 4947/5053/4677 4255/5026/4677 4933/5025/4677 5727/5054/4677 +f 5727/5054/4678 4933/5025/4678 4253/5024/4678 4948/5055/4678 +f 4945/5050/4679 5727/5054/4679 4948/5055/4679 4249/5041/4679 +f 4254/5027/4680 4934/5030/4680 5728/5056/4680 4949/5057/4680 +f 4934/5030/4681 4255/5026/4681 4947/5053/4681 5728/5056/4681 +f 5728/5056/4682 4947/5053/4682 4248/5049/4682 4946/5052/4682 +f 4949/5057/4683 5728/5056/4683 4946/5052/4683 4250/5043/4683 +f 4249/5041/4684 4948/5055/4684 5729/5058/4684 4941/5042/4684 +f 4253/5024/4685 4937/5034/4685 5729/5058/4685 4948/5055/4685 +f 4251/5033/4686 4941/5042/4686 5729/5058/4686 4937/5034/4686 +f 4252/5035/4687 4938/5038/4687 5730/5059/4687 4942/5046/4687 +f 4254/5027/4688 4949/5057/4688 5730/5059/4688 4938/5038/4688 +f 4250/5043/4689 4942/5046/4689 5730/5059/4689 4949/5057/4689 +f 4207/4767/4690 4806/4774/4690 5731/5060/4690 4950/5061/4690 +f 4806/4774/4691 4205/4745/4691 4951/5062/4691 5731/5060/4691 +f 5731/5060/4692 4951/5062/4692 4258/5063/4692 4952/5064/4692 +f 4950/5061/4693 5731/5060/4693 4952/5064/4693 4256/5065/4693 +f 4259/5066/4694 4954/5067/4694 5732/5068/4694 4953/5069/4694 +f 4954/5067/4695 4206/4752/4695 4807/4775/4695 5732/5068/4695 +f 5732/5068/4696 4807/4775/4696 4208/4771/4696 4955/5070/4696 +f 4953/5069/4697 5732/5068/4697 4955/5070/4697 4257/5071/4697 +f 4136/4757/4698 4800/4763/4698 5733/5072/4698 4956/5073/4698 +f 4800/4763/4699 4207/4767/4699 4950/5061/4699 5733/5072/4699 +f 5733/5072/4700 4950/5061/4700 4256/5065/4700 4957/5074/4700 +f 4956/5073/4701 5733/5072/4701 4957/5074/4701 4278/5075/4701 +f 4257/5071/4702 4955/5070/4702 5734/5076/4702 4958/5077/4702 +f 4955/5070/4703 4208/4771/4703 4804/4770/4703 5734/5076/4703 +f 5734/5076/4704 4804/4770/4704 4137/4761/4704 4959/5078/4704 +f 4958/5077/4705 5734/5076/4705 4959/5078/4705 4279/5079/4705 +f 4134/4667/4706 4796/4755/4706 5735/5080/4706 4960/5081/4706 +f 4796/4755/4707 4136/4757/4707 4956/5073/4707 5735/5080/4707 +f 5735/5080/4708 4956/5073/4708 4278/5075/4708 4961/5082/4708 +f 4960/5081/4709 5735/5080/4709 4961/5082/4709 4280/5083/4709 +f 4279/5079/4710 4959/5078/4710 5736/5084/4710 4962/5085/4710 +f 4959/5078/4711 4137/4761/4711 4799/4760/4711 5736/5084/4711 +f 5736/5084/4712 4799/4760/4712 4135/4677/4712 4963/5086/4712 +f 4962/5085/4713 5736/5084/4713 4963/5086/4713 4281/5087/4713 +f 4205/4745/4714 4790/4743/4714 5737/5088/4714 4951/5062/4714 +f 4790/4743/4715 4138/4735/4715 4964/5089/4715 5737/5088/4715 +f 5737/5088/4716 4964/5089/4716 4276/5090/4716 4965/5091/4716 +f 4951/5062/4717 5737/5088/4717 4965/5091/4717 4258/5063/4717 +f 4277/5092/4718 4967/5093/4718 5738/5094/4718 4966/5095/4718 +f 4967/5093/4719 4139/4741/4719 4795/4753/4719 5738/5094/4719 +f 5738/5094/4720 4795/4753/4720 4206/4752/4720 4954/5067/4720 +f 4966/5095/4721 5738/5094/4721 4954/5067/4721 4259/5066/4721 +f 4138/4735/4722 4786/4738/4722 5739/5096/4722 4964/5089/4722 +f 4786/4738/4723 4140/4727/4723 4968/5097/4723 5739/5096/4723 +f 5739/5096/4724 4968/5097/4724 4274/5098/4724 4969/5099/4724 +f 4964/5089/4725 5739/5096/4725 4969/5099/4725 4276/5090/4725 +f 4275/5100/4726 4971/5101/4726 5740/5102/4726 4970/5103/4726 +f 4971/5101/4727 4141/4733/4727 4789/4742/4727 5740/5102/4727 +f 5740/5102/4728 4789/4742/4728 4139/4741/4728 4967/5093/4728 +f 4970/5103/4729 5740/5102/4729 4967/5093/4729 4277/5092/4729 +f 4140/4727/4730 4782/4730/4730 5741/5104/4730 4968/5097/4730 +f 4782/4730/4731 4142/4719/4731 4972/5105/4731 5741/5104/4731 +f 5741/5104/4732 4972/5105/4732 4272/5106/4732 4973/5107/4732 +f 4968/5097/4733 5741/5104/4733 4973/5107/4733 4274/5098/4733 +f 4273/5108/4734 4975/5109/4734 5742/5110/4734 4974/5111/4734 +f 4975/5109/4735 4143/4725/4735 4785/4734/4735 5742/5110/4735 +f 5742/5110/4736 4785/4734/4736 4141/4733/4736 4971/5101/4736 +f 4974/5111/4737 5742/5110/4737 4971/5101/4737 4275/5100/4737 +f 4142/4719/4738 4778/4722/4738 5743/5112/4738 4972/5105/4738 +f 4778/4722/4739 4144/4711/4739 4976/5113/4739 5743/5112/4739 +f 5743/5112/4740 4976/5113/4740 4270/5114/4740 4977/5115/4740 +f 4972/5105/4741 5743/5112/4741 4977/5115/4741 4272/5106/4741 +f 4271/5116/4742 4979/5117/4742 5744/5118/4742 4978/5119/4742 +f 4979/5117/4743 4145/4717/4743 4781/4726/4743 5744/5118/4743 +f 5744/5118/4744 4781/4726/4744 4143/4725/4744 4975/5109/4744 +f 4978/5119/4745 5744/5118/4745 4975/5109/4745 4273/5108/4745 +f 4144/4711/4746 4774/4714/4746 5745/5120/4746 4976/5113/4746 +f 4774/4714/4747 4146/4703/4747 4980/5121/4747 5745/5120/4747 +f 5745/5120/4748 4980/5121/4748 4268/5122/4748 4981/5123/4748 +f 4976/5113/4749 5745/5120/4749 4981/5123/4749 4270/5114/4749 +f 4269/5124/4750 4983/5125/4750 5746/5126/4750 4982/5127/4750 +f 4983/5125/4751 4147/4709/4751 4777/4718/4751 5746/5126/4751 +f 5746/5126/4752 4777/4718/4752 4145/4717/4752 4979/5117/4752 +f 4982/5127/4753 5746/5126/4753 4979/5117/4753 4271/5116/4753 +f 4146/4703/4754 4770/4706/4754 5747/5128/4754 4980/5121/4754 +f 4770/4706/4755 4148/4695/4755 4984/5129/4755 5747/5128/4755 +f 5747/5128/4756 4984/5129/4756 4266/5130/4756 4985/5131/4756 +f 4980/5121/4757 5747/5128/4757 4985/5131/4757 4268/5122/4757 +f 4267/5132/4758 4987/5133/4758 5748/5134/4758 4986/5135/4758 +f 4987/5133/4759 4149/4701/4759 4773/4710/4759 5748/5134/4759 +f 5748/5134/4760 4773/4710/4760 4147/4709/4760 4983/5125/4760 +f 4986/5135/4761 5748/5134/4761 4983/5125/4761 4269/5124/4761 +f 4148/4695/4762 4766/4698/4762 5749/5136/4762 4984/5129/4762 +f 4766/4698/4763 4150/4687/4763 4988/5137/4763 5749/5136/4763 +f 5749/5136/4764 4988/5137/4764 4264/5138/4764 4989/5139/4764 +f 4984/5129/4765 5749/5136/4765 4989/5139/4765 4266/5130/4765 +f 4265/5140/4766 4991/5141/4766 5750/5142/4766 4990/5143/4766 +f 4991/5141/4767 4151/4693/4767 4769/4702/4767 5750/5142/4767 +f 5750/5142/4768 4769/4702/4768 4149/4701/4768 4987/5133/4768 +f 4990/5143/4769 5750/5142/4769 4987/5133/4769 4267/5132/4769 +f 4150/4687/4770 4762/4690/4770 5751/5144/4770 4988/5137/4770 +f 4762/4690/4771 4203/4681/4771 4992/5145/4771 5751/5144/4771 +f 5751/5144/4772 4992/5145/4772 4260/5146/4772 4993/5147/4772 +f 4988/5137/4773 5751/5144/4773 4993/5147/4773 4264/5138/4773 +f 4261/5148/4774 4995/5149/4774 5752/5150/4774 4994/5151/4774 +f 4995/5149/4775 4204/4685/4775 4765/4694/4775 5752/5150/4775 +f 5752/5150/4776 4765/4694/4776 4151/4693/4776 4991/5141/4776 +f 4994/5151/4777 5752/5150/4777 4991/5141/4777 4265/5140/4777 +f 4203/4681/4778 4758/4679/4778 5753/5152/4778 4992/5145/4778 +f 4758/4679/4779 4152/4671/4779 4996/5153/4779 5753/5152/4779 +f 5753/5152/4780 4996/5153/4780 4262/5154/4780 4997/5155/4780 +f 4992/5145/4781 5753/5152/4781 4997/5155/4781 4260/5146/4781 +f 4263/5156/4782 4999/5157/4782 5754/5158/4782 4998/5159/4782 +f 4999/5157/4783 4153/4675/4783 4761/4686/4783 5754/5158/4783 +f 5754/5158/4784 4761/4686/4784 4204/4685/4784 4995/5149/4784 +f 4998/5159/4785 5754/5158/4785 4995/5149/4785 4261/5148/4785 +f 4152/4671/4786 4753/4668/4786 5755/5160/4786 4996/5153/4786 +f 4753/4668/4787 4134/4667/4787 4960/5081/4787 5755/5160/4787 +f 5755/5160/4788 4960/5081/4788 4280/5083/4788 5000/5161/4788 +f 4996/5153/4789 5755/5160/4789 5000/5161/4789 4262/5154/4789 +f 4281/5087/4790 4963/5086/4790 5756/5162/4790 5001/5163/4790 +f 4963/5086/4791 4135/4677/4791 4756/4676/4791 5756/5162/4791 +f 5756/5162/4792 4756/4676/4792 4153/4675/4792 4999/5157/4792 +f 5001/5163/4793 5756/5162/4793 4999/5157/4793 4263/5156/4793 +f 4262/5154/4794 5000/5161/4794 5757/5164/4794 5002/5165/4794 +f 5000/5161/4795 4280/5083/4795 5003/5166/4795 5757/5164/4795 +f 5757/5164/4796 5003/5166/4796 4282/5167/4796 5004/5168/4796 +f 5002/5165/4797 5757/5164/4797 5004/5168/4797 4300/5169/4797 +f 4283/5170/4798 5006/5171/4798 5758/5172/4798 5005/5173/4798 +f 5006/5171/4799 4281/5087/4799 5001/5163/4799 5758/5172/4799 +f 5758/5172/4800 5001/5163/4800 4263/5156/4800 5007/5174/4800 +f 5005/5173/4801 5758/5172/4801 5007/5174/4801 4301/5175/4801 +f 4260/5146/4802 4997/5155/4802 5759/5176/4802 5008/5177/4802 +f 4997/5155/4803 4262/5154/4803 5002/5165/4803 5759/5176/4803 +f 5759/5176/4804 5002/5165/4804 4300/5169/4804 5009/5178/4804 +f 5008/5177/4805 5759/5176/4805 5009/5178/4805 4302/5179/4805 +f 4301/5175/4806 5007/5174/4806 5760/5180/4806 5010/5181/4806 +f 5007/5174/4807 4263/5156/4807 4998/5159/4807 5760/5180/4807 +f 5760/5180/4808 4998/5159/4808 4261/5148/4808 5011/5182/4808 +f 5010/5181/4809 5760/5180/4809 5011/5182/4809 4303/5183/4809 +f 4264/5138/4810 4993/5147/4810 5761/5184/4810 5012/5185/4810 +f 4993/5147/4811 4260/5146/4811 5008/5177/4811 5761/5184/4811 +f 5761/5184/4812 5008/5177/4812 4302/5179/4812 5013/5186/4812 +f 5012/5185/4813 5761/5184/4813 5013/5186/4813 4298/5187/4813 +f 4303/5183/4814 5011/5182/4814 5762/5188/4814 5014/5189/4814 +f 5011/5182/4815 4261/5148/4815 4994/5151/4815 5762/5188/4815 +f 5762/5188/4816 4994/5151/4816 4265/5140/4816 5015/5190/4816 +f 5014/5189/4817 5762/5188/4817 5015/5190/4817 4299/5191/4817 +f 4266/5130/4818 4989/5139/4818 5763/5192/4818 5016/5193/4818 +f 4989/5139/4819 4264/5138/4819 5012/5185/4819 5763/5192/4819 +f 5763/5192/4820 5012/5185/4820 4298/5187/4820 5017/5194/4820 +f 5016/5193/4821 5763/5192/4821 5017/5194/4821 4296/5195/4821 +f 4299/5191/4822 5015/5190/4822 5764/5196/4822 5018/5197/4822 +f 5015/5190/4823 4265/5140/4823 4990/5143/4823 5764/5196/4823 +f 5764/5196/4824 4990/5143/4824 4267/5132/4824 5019/5198/4824 +f 5018/5197/4825 5764/5196/4825 5019/5198/4825 4297/5199/4825 +f 4268/5122/4826 4985/5131/4826 5765/5200/4826 5020/5201/4826 +f 4985/5131/4827 4266/5130/4827 5016/5193/4827 5765/5200/4827 +f 5765/5200/4828 5016/5193/4828 4296/5195/4828 5021/5202/4828 +f 5020/5201/4829 5765/5200/4829 5021/5202/4829 4294/5203/4829 +f 4297/5199/4830 5019/5198/4830 5766/5204/4830 5022/5205/4830 +f 5019/5198/4831 4267/5132/4831 4986/5135/4831 5766/5204/4831 +f 5766/5204/4832 4986/5135/4832 4269/5124/4832 5023/5206/4832 +f 5022/5205/4833 5766/5204/4833 5023/5206/4833 4295/5207/4833 +f 4270/5114/4834 4981/5123/4834 5767/5208/4834 5024/5209/4834 +f 4981/5123/4835 4268/5122/4835 5020/5201/4835 5767/5208/4835 +f 5767/5208/4836 5020/5201/4836 4294/5203/4836 5025/5210/4836 +f 5024/5209/4837 5767/5208/4837 5025/5210/4837 4292/5211/4837 +f 4295/5207/4838 5023/5206/4838 5768/5212/4838 5026/5213/4838 +f 5023/5206/4839 4269/5124/4839 4982/5127/4839 5768/5212/4839 +f 5768/5212/4840 4982/5127/4840 4271/5116/4840 5027/5214/4840 +f 5026/5213/4841 5768/5212/4841 5027/5214/4841 4293/5215/4841 +f 4272/5106/4842 4977/5115/4842 5769/5216/4842 5028/5217/4842 +f 4977/5115/4843 4270/5114/4843 5024/5209/4843 5769/5216/4843 +f 5769/5216/4844 5024/5209/4844 4292/5211/4844 5029/5218/4844 +f 5028/5217/4845 5769/5216/4845 5029/5218/4845 4290/5219/4845 +f 4293/5215/4846 5027/5214/4846 5770/5220/4846 5030/5221/4846 +f 5027/5214/4847 4271/5116/4847 4978/5119/4847 5770/5220/4847 +f 5770/5220/4848 4978/5119/4848 4273/5108/4848 5031/5222/4848 +f 5030/5221/4849 5770/5220/4849 5031/5222/4849 4291/5223/4849 +f 4274/5098/4850 4973/5107/4850 5771/5224/4850 5032/5225/4850 +f 4973/5107/4851 4272/5106/4851 5028/5217/4851 5771/5224/4851 +f 5771/5224/4852 5028/5217/4852 4290/5219/4852 5033/5226/4852 +f 5032/5225/4853 5771/5224/4853 5033/5226/4853 4288/5227/4853 +f 4291/5223/4854 5031/5222/4854 5772/5228/4854 5034/5229/4854 +f 5031/5222/4855 4273/5108/4855 4974/5111/4855 5772/5228/4855 +f 5772/5228/4856 4974/5111/4856 4275/5100/4856 5035/5230/4856 +f 5034/5229/4857 5772/5228/4857 5035/5230/4857 4289/5231/4857 +f 4276/5090/4858 4969/5099/4858 5773/5232/4858 5036/5233/4858 +f 4969/5099/4859 4274/5098/4859 5032/5225/4859 5773/5232/4859 +f 5773/5232/4860 5032/5225/4860 4288/5227/4860 5037/5234/4860 +f 5036/5233/4861 5773/5232/4861 5037/5234/4861 4286/5235/4861 +f 4289/5231/4862 5035/5230/4862 5774/5236/4862 5038/5237/4862 +f 5035/5230/4863 4275/5100/4863 4970/5103/4863 5774/5236/4863 +f 5774/5236/4864 4970/5103/4864 4277/5092/4864 5039/5238/4864 +f 5038/5237/4865 5774/5236/4865 5039/5238/4865 4287/5239/4865 +f 4258/5063/4866 4965/5091/4866 5775/5240/4866 5040/5241/4866 +f 4965/5091/4867 4276/5090/4867 5036/5233/4867 5775/5240/4867 +f 5775/5240/4868 5036/5233/4868 4286/5235/4868 5041/5242/4868 +f 5040/5241/4869 5775/5240/4869 5041/5242/4869 4304/5243/4869 +f 4287/5239/4870 5039/5238/4870 5776/5244/4870 5042/5245/4870 +f 5039/5238/4871 4277/5092/4871 4966/5095/4871 5776/5244/4871 +f 5776/5244/4872 4966/5095/4872 4259/5066/4872 5043/5246/4872 +f 5042/5245/4873 5776/5244/4873 5043/5246/4873 4305/5247/4873 +f 4280/5083/4874 4961/5082/4874 5777/5248/4874 5003/5166/4874 +f 4961/5082/4875 4278/5075/4875 5044/5249/4875 5777/5248/4875 +f 5777/5248/4876 5044/5249/4876 4284/5250/4876 5045/5251/4876 +f 5003/5166/4877 5777/5248/4877 5045/5251/4877 4282/5167/4877 +f 4285/5252/4878 5047/5253/4878 5778/5254/4878 5046/5255/4878 +f 5047/5253/4879 4279/5079/4879 4962/5085/4879 5778/5254/4879 +f 5778/5254/4880 4962/5085/4880 4281/5087/4880 5006/5171/4880 +f 5046/5255/4881 5778/5254/4881 5006/5171/4881 4283/5170/4881 +f 4278/5075/4882 4957/5074/4882 5779/5256/4882 5044/5249/4882 +f 4957/5074/4883 4256/5065/4883 5048/5257/4883 5779/5256/4883 +f 5779/5256/4884 5048/5257/4884 4306/5258/4884 5049/5259/4884 +f 5044/5249/4885 5779/5256/4885 5049/5259/4885 4284/5250/4885 +f 4307/5260/4886 5051/5261/4886 5780/5262/4886 5050/5263/4886 +f 5051/5261/4887 4257/5071/4887 4958/5077/4887 5780/5262/4887 +f 5780/5262/4888 4958/5077/4888 4279/5079/4888 5047/5253/4888 +f 5050/5263/4889 5780/5262/4889 5047/5253/4889 4285/5252/4889 +f 4256/5065/4890 4952/5064/4890 5781/5264/4890 5048/5257/4890 +f 4952/5064/4891 4258/5063/4891 5040/5241/4891 5781/5264/4891 +f 5781/5264/4892 5040/5241/4892 4304/5243/4892 5052/5265/4892 +f 5048/5257/4893 5781/5264/4893 5052/5265/4893 4306/5258/4893 +f 4305/5247/4894 5043/5246/4894 5782/5266/4894 5053/5267/4894 +f 5043/5246/4895 4259/5066/4895 4953/5069/4895 5782/5266/4895 +f 5782/5266/4896 4953/5069/4896 4257/5071/4896 5051/5261/4896 +f 5053/5267/4897 5782/5266/4897 5051/5261/4897 4307/5260/4897 +f 4091/4660/4898 4747/4658/4898 5783/5268/4898 5054/5269/4898 +f 4747/4658/4899 4132/4648/4899 5055/5270/4899 5783/5268/4899 +f 5783/5268/4900 5055/5270/4900 4308/5271/4900 5056/5272/4900 +f 5054/5269/4901 5783/5268/4901 5056/5272/4901 4097/5273/4901 +f 4309/5274/4902 5058/5275/4902 5784/5276/4902 5057/5277/4902 +f 5058/5275/4903 4133/4656/4903 4751/4666/4903 5784/5276/4903 +f 5784/5276/4904 4751/4666/4904 4091/4660/4904 5054/5269/4904 +f 5057/5277/4905 5784/5276/4905 5054/5269/4905 4097/5273/4905 +f 4132/4648/4906 4741/4646/4906 5785/5278/4906 5055/5270/4906 +f 4741/4646/4907 4130/4636/4907 5059/5279/4907 5785/5278/4907 +f 5785/5278/4908 5059/5279/4908 4310/5280/4908 5060/5281/4908 +f 5055/5270/4909 5785/5278/4909 5060/5281/4909 4308/5271/4909 +f 4311/5282/4910 5062/5283/4910 5786/5284/4910 5061/5285/4910 +f 5062/5283/4911 4131/4644/4911 4746/4657/4911 5786/5284/4911 +f 5786/5284/4912 4746/4657/4912 4133/4656/4912 5058/5275/4912 +f 5061/5285/4913 5786/5284/4913 5058/5275/4913 4309/5274/4913 +f 4130/4636/4914 4735/4634/4914 5787/5286/4914 5059/5279/4914 +f 4735/4634/4915 4128/4624/4915 5063/5287/4915 5787/5286/4915 +f 5787/5286/4916 5063/5287/4916 4312/5288/4916 5064/5289/4916 +f 5059/5279/4917 5787/5286/4917 5064/5289/4917 4310/5280/4917 +f 4313/5290/4918 5066/5291/4918 5788/5292/4918 5065/5293/4918 +f 5066/5291/4919 4129/4632/4919 4740/4645/4919 5788/5292/4919 +f 5788/5292/4920 4740/4645/4920 4131/4644/4920 5062/5283/4920 +f 5065/5293/4921 5788/5292/4921 5062/5283/4921 4311/5282/4921 +f 4128/4624/4922 4729/4622/4922 5789/5294/4922 5063/5287/4922 +f 4729/4622/4923 4126/4612/4923 5067/5295/4923 5789/5294/4923 +f 5789/5294/4924 5067/5295/4924 4314/5296/4924 5068/5297/4924 +f 5063/5287/4925 5789/5294/4925 5068/5297/4925 4312/5288/4925 +f 4315/5298/4926 5070/5299/4926 5790/5300/4926 5069/5301/4926 +f 5070/5299/4927 4127/4620/4927 4734/4633/4927 5790/5300/4927 +f 5790/5300/4928 4734/4633/4928 4129/4632/4928 5066/5291/4928 +f 5069/5301/4929 5790/5300/4929 5066/5291/4929 4313/5290/4929 +f 4126/4612/4930 4723/4610/4930 5791/5302/4930 5067/5295/4930 +f 4723/4610/4931 4124/4600/4931 5071/5303/4931 5791/5302/4931 +f 5791/5302/4932 5071/5303/4932 4316/5304/4932 5072/5305/4932 +f 5067/5295/4933 5791/5302/4933 5072/5305/4933 4314/5296/4933 +f 4317/5306/4934 5074/5307/4934 5792/5308/4934 5073/5309/4934 +f 5074/5307/4935 4125/4608/4935 4728/4621/4935 5792/5308/4935 +f 5792/5308/4936 4728/4621/4936 4127/4620/4936 5070/5299/4936 +f 5073/5309/4937 5792/5308/4937 5070/5299/4937 4315/5298/4937 +f 4124/4600/4938 4717/4598/4938 5793/5310/4938 5071/5303/4938 +f 4717/4598/4939 4122/4588/4939 5075/5311/4939 5793/5310/4939 +f 5793/5310/4940 5075/5311/4940 4318/5312/4940 5076/5313/4940 +f 5071/5303/4941 5793/5310/4941 5076/5313/4941 4316/5304/4941 +f 4319/5314/4942 5078/5315/4942 5794/5316/4942 5077/5317/4942 +f 5078/5315/4943 4123/4596/4943 4722/4609/4943 5794/5316/4943 +f 5794/5316/4944 4722/4609/4944 4125/4608/4944 5074/5307/4944 +f 5077/5317/4945 5794/5316/4945 5074/5307/4945 4317/5306/4945 +f 4122/4588/4946 4711/4586/4946 5795/5318/4946 5075/5311/4946 +f 4711/4586/4947 4120/4576/4947 5079/5319/4947 5795/5318/4947 +f 5795/5318/4948 5079/5319/4948 4320/5320/4948 5080/5321/4948 +f 5075/5311/4949 5795/5318/4949 5080/5321/4949 4318/5312/4949 +f 4321/5322/4950 5082/5323/4950 5796/5324/4950 5081/5325/4950 +f 5082/5323/4951 4121/4584/4951 4716/4597/4951 5796/5324/4951 +f 5796/5324/4952 4716/4597/4952 4123/4596/4952 5078/5315/4952 +f 5081/5325/4953 5796/5324/4953 5078/5315/4953 4319/5314/4953 +f 4120/4576/4954 4705/4574/4954 5797/5326/4954 5079/5319/4954 +f 4705/4574/4955 4118/4564/4955 5083/5327/4955 5797/5326/4955 +f 5797/5326/4956 5083/5327/4956 4322/5328/4956 5084/5329/4956 +f 5079/5319/4957 5797/5326/4957 5084/5329/4957 4320/5320/4957 +f 4323/5330/4958 5086/5331/4958 5798/5332/4958 5085/5333/4958 +f 5086/5331/4959 4119/4572/4959 4710/4585/4959 5798/5332/4959 +f 5798/5332/4960 4710/4585/4960 4121/4584/4960 5082/5323/4960 +f 5085/5333/4961 5798/5332/4961 5082/5323/4961 4321/5322/4961 +f 4118/4564/4962 4699/4562/4962 5799/5334/4962 5083/5327/4962 +f 4699/4562/4963 4116/4548/4963 5087/5335/4963 5799/5334/4963 +f 5799/5334/4964 5087/5335/4964 4324/5336/4964 5088/5337/4964 +f 5083/5327/4965 5799/5334/4965 5088/5337/4965 4322/5328/4965 +f 4325/5338/4966 5090/5339/4966 5800/5340/4966 5089/5341/4966 +f 5090/5339/4967 4117/4557/4967 4704/4573/4967 5800/5340/4967 +f 5800/5340/4968 4704/4573/4968 4119/4572/4968 5086/5331/4968 +f 5089/5341/4969 5800/5340/4969 5086/5331/4969 4323/5330/4969 +f 4332/5342/4970 5092/5343/4970 5801/5344/4970 5091/5345/4970 +f 5092/5343/4971 4333/5346/4971 5093/5347/4971 5801/5344/4971 +f 5801/5344/4972 5093/5347/4972 4352/5348/4972 5094/5349/4972 +f 5091/5345/4973 5801/5344/4973 5094/5349/4973 4362/5350/4973 +f 4353/5351/4974 5096/5352/4974 5802/5353/4974 5095/5354/4974 +f 5096/5352/4975 4333/5355/4975 5092/5356/4975 5802/5353/4975 +f 5802/5353/4976 5092/5356/4976 4332/5357/4976 5097/5358/4976 +f 5095/5354/4977 5802/5353/4977 5097/5358/4977 4363/5359/4977 +f 4331/5360/4978 5099/5361/4978 5803/5362/4978 5098/5363/4978 +f 5099/5361/4979 4332/5342/4979 5091/5345/4979 5803/5362/4979 +f 5803/5362/4980 5091/5345/4980 4362/5350/4980 5100/5364/4980 +f 5098/5363/4981 5803/5362/4981 5100/5364/4981 4360/5365/4981 +f 4363/5359/4982 5097/5358/4982 5804/5366/4982 5101/5367/4982 +f 5097/5358/4983 4332/5357/4983 5099/5368/4983 5804/5366/4983 +f 5804/5366/4984 5099/5368/4984 4331/5369/4984 5102/5370/4984 +f 5101/5367/4985 5804/5366/4985 5102/5370/4985 4361/5371/4985 +f 4330/5372/4986 5104/5373/4986 5805/5374/4986 5103/5375/4986 +f 5104/5373/4987 4331/5360/4987 5098/5363/4987 5805/5374/4987 +f 5805/5374/4988 5098/5363/4988 4360/5365/4988 5105/5376/4988 +f 5103/5375/4989 5805/5374/4989 5105/5376/4989 4364/5377/4989 +f 4361/5371/4990 5102/5370/4990 5806/5378/4990 5106/5379/4990 +f 5102/5370/4991 4331/5369/4991 5104/5380/4991 5806/5378/4991 +f 5806/5378/4992 5104/5380/4992 4330/5372/4992 5107/5381/4992 +f 5106/5379/4993 5806/5378/4993 5107/5381/4993 4365/5382/4993 +f 4113/4481/4994 4660/4484/4994 5807/5383/4994 5108/5384/4994 +f 4660/4484/4995 4115/4489/4995 5109/5385/4995 5807/5383/4995 +f 5807/5383/4996 5109/5385/4996 4330/5372/4996 5103/5375/4996 +f 5108/5384/4997 5807/5383/4997 5103/5375/4997 4364/5377/4997 +f 4330/5372/4998 5109/5385/4998 5808/5386/4998 5107/5381/4998 +f 5109/5385/4999 4115/4489/4999 4666/4495/4999 5808/5386/4999 +f 5808/5386/5000 4666/4495/5000 4114/4494/5000 5110/5387/5000 +f 5107/5381/5001 5808/5386/5001 5110/5387/5001 4365/5382/5001 +f 4111/4496/5002 4667/4499/5002 5809/5388/5002 5111/5389/5002 +f 4667/4499/5003 4113/4481/5003 5108/5384/5003 5809/5388/5003 +f 5809/5388/5004 5108/5384/5004 4364/5377/5004 5112/5390/5004 +f 5111/5389/5005 5809/5388/5005 5112/5390/5005 4358/5391/5005 +f 4365/5382/5006 5110/5387/5006 5810/5392/5006 5113/5393/5006 +f 5110/5387/5007 4114/4494/5007 4672/4507/5007 5810/5392/5007 +f 5810/5392/5008 4672/4507/5008 4112/4506/5008 5114/5394/5008 +f 5113/5393/5009 5810/5392/5009 5114/5394/5009 4359/5395/5009 +f 4109/4508/5010 4673/4511/5010 5811/5396/5010 5115/5397/5010 +f 4673/4511/5011 4111/4496/5011 5111/5389/5011 5811/5396/5011 +f 5811/5396/5012 5111/5389/5012 4358/5391/5012 5116/5398/5012 +f 5115/5397/5013 5811/5396/5013 5116/5398/5013 4354/5399/5013 +f 4359/5395/5014 5114/5394/5014 5812/5400/5014 5117/5401/5014 +f 5114/5394/5015 4112/4506/5015 4678/4519/5015 5812/5400/5015 +f 5812/5400/5016 4678/4519/5016 4110/4518/5016 5118/5402/5016 +f 5117/5401/5017 5812/5400/5017 5118/5402/5017 4355/5403/5017 +f 4107/4520/5018 4679/4523/5018 5813/5404/5018 5119/5405/5018 +f 4679/4523/5019 4109/4508/5019 5115/5397/5019 5813/5404/5019 +f 5813/5404/5020 5115/5397/5020 4354/5399/5020 5120/5406/5020 +f 5119/5405/5021 5813/5404/5021 5120/5406/5021 4356/5407/5021 +f 4355/5403/5022 5118/5402/5022 5814/5408/5022 5121/5409/5022 +f 5118/5402/5023 4110/4518/5023 4684/4531/5023 5814/5408/5023 +f 5814/5408/5024 4684/4531/5024 4108/4530/5024 5122/5410/5024 +f 5121/5409/5025 5814/5408/5025 5122/5410/5025 4357/5411/5025 +f 4354/5399/5026 5123/5412/5026 5815/5413/5026 5120/5406/5026 +f 5123/5412/5027 4360/5365/5027 5100/5364/5027 5815/5413/5027 +f 5815/5413/5028 5100/5364/5028 4362/5350/5028 5124/5414/5028 +f 5120/5406/5029 5815/5413/5029 5124/5414/5029 4356/5407/5029 +f 4363/5359/5030 5101/5367/5030 5816/5415/5030 5125/5416/5030 +f 5101/5367/5031 4361/5371/5031 5126/5417/5031 5816/5415/5031 +f 5816/5415/5032 5126/5417/5032 4355/5403/5032 5121/5409/5032 +f 5125/5416/5033 5816/5415/5033 5121/5409/5033 4357/5411/5033 +f 4354/5399/5034 5116/5398/5034 5817/5418/5034 5123/5412/5034 +f 5116/5398/5035 4358/5391/5035 5112/5390/5035 5817/5418/5035 +f 5817/5418/5036 5112/5390/5036 4364/5377/5036 5105/5376/5036 +f 5123/5412/5037 5817/5418/5037 5105/5376/5037 4360/5365/5037 +f 4365/5382/5038 5113/5393/5038 5818/5419/5038 5106/5379/5038 +f 5113/5393/5039 4359/5395/5039 5117/5401/5039 5818/5419/5039 +f 5818/5419/5040 5117/5401/5040 4355/5403/5040 5126/5417/5040 +f 5106/5379/5041 5818/5419/5041 5126/5417/5041 4361/5371/5041 +f 4350/5420/5042 5128/5421/5042 5819/5422/5042 5127/5423/5042 +f 5128/5421/5043 4356/5407/5043 5124/5414/5043 5819/5422/5043 +f 5819/5422/5044 5124/5414/5044 4362/5350/5044 5094/5349/5044 +f 5127/5423/5045 5819/5422/5045 5094/5349/5045 4352/5348/5045 +f 4363/5359/5046 5125/5416/5046 5820/5424/5046 5095/5354/5046 +f 5125/5416/5047 4357/5411/5047 5129/5425/5047 5820/5424/5047 +f 5820/5424/5048 5129/5425/5048 4351/5426/5048 5130/5427/5048 +f 5095/5354/5049 5820/5424/5049 5130/5427/5049 4353/5351/5049 +f 4105/4532/5050 4685/4535/5050 5821/5428/5050 5131/5429/5050 +f 4685/4535/5051 4107/4520/5051 5119/5405/5051 5821/5428/5051 +f 5821/5428/5052 5119/5405/5052 4356/5407/5052 5128/5421/5052 +f 5131/5429/5053 5821/5428/5053 5128/5421/5053 4350/5420/5053 +f 4357/5411/5054 5122/5410/5054 5822/5430/5054 5129/5425/5054 +f 5122/5410/5055 4108/4530/5055 4690/4543/5055 5822/5430/5055 +f 5822/5430/5056 4690/4543/5056 4106/4542/5056 5132/5431/5056 +f 5129/5425/5057 5822/5430/5057 5132/5431/5057 4351/5426/5057 +f 4233/4971/5058 5133/5432/5058 5823/5433/5058 4909/4977/5058 +f 5133/5432/5059 4366/5434/5059 5134/5435/5059 5823/5433/5059 +f 5823/5433/5060 5134/5435/5060 4368/5436/5060 5135/5437/5060 +f 4909/4977/5061 5823/5433/5061 5135/5437/5061 4239/4979/5061 +f 4369/5438/5062 5137/5439/5062 5824/5440/5062 5136/5441/5062 +f 5137/5439/5063 4367/5442/5063 5138/5443/5063 5824/5440/5063 +f 5824/5440/5064 5138/5443/5064 4234/4975/5064 4912/4984/5064 +f 5136/5441/5065 5824/5440/5065 4912/4984/5065 4240/4983/5065 +f 4105/4532/5066 5131/5429/5066 5825/5444/5066 4905/4969/5066 +f 5131/5429/5067 4350/5420/5067 5139/5445/5067 5825/5444/5067 +f 5825/5444/5068 5139/5445/5068 4366/5434/5068 5133/5432/5068 +f 4905/4969/5069 5825/5444/5069 5133/5432/5069 4233/4971/5069 +f 4367/5442/5070 5140/5446/5070 5826/5447/5070 5138/5443/5070 +f 5140/5446/5071 4351/5426/5071 5132/5431/5071 5826/5447/5071 +f 5826/5447/5072 5132/5431/5072 4106/4542/5072 4908/4976/5072 +f 5138/5443/5073 5826/5447/5073 4908/4976/5073 4234/4975/5073 +f 4103/4544/5074 4913/4986/5074 5827/5448/5074 5141/5449/5074 +f 4913/4986/5075 4239/4979/5075 5135/5437/5075 5827/5448/5075 +f 5827/5448/5076 5135/5437/5076 4368/5436/5076 5142/5450/5076 +f 5141/5449/5077 5827/5448/5077 5142/5450/5077 4370/5451/5077 +f 4369/5438/5078 5136/5441/5078 5828/5452/5078 5143/5453/5078 +f 5136/5441/5079 4240/4983/5079 4914/4988/5079 5828/5452/5079 +f 5828/5452/5080 4914/4988/5080 4104/4559/5080 5144/5454/5080 +f 5143/5453/5081 5828/5452/5081 5144/5454/5081 4371/5455/5081 +f 4103/4544/5082 5141/5449/5082 5829/5456/5082 4692/4545/5082 +f 5141/5449/5083 4370/5451/5083 5145/5457/5083 5829/5456/5083 +f 5829/5456/5084 5145/5457/5084 4324/5336/5084 5087/5335/5084 +f 4692/4545/5085 5829/5456/5085 5087/5335/5085 4116/4548/5085 +f 4325/5338/5086 5146/5458/5086 5830/5459/5086 5090/5339/5086 +f 5146/5458/5087 4371/5455/5087 5144/5454/5087 5830/5459/5087 +f 5830/5459/5088 5144/5454/5088 4104/4559/5088 4697/4558/5088 +f 5090/5339/5089 5830/5459/5089 4697/4558/5089 4117/4557/5089 +f 4101/5460/5090 5148/5461/5090 5831/5462/5090 5147/5463/5090 +f 5148/5461/5091 4348/5464/5091 5149/5465/5091 5831/5462/5091 +f 5831/5462/5092 5149/5465/5092 4376/5466/5092 5150/5467/5092 +f 5147/5463/5093 5831/5462/5093 5150/5467/5093 4328/5468/5093 +f 4377/5469/5094 5152/5470/5094 5832/5471/5094 5151/5472/5094 +f 5152/5470/5095 4349/5473/5095 5153/5474/5095 5832/5471/5095 +f 5832/5471/5096 5153/5474/5096 4101/5475/5096 5147/5476/5096 +f 5151/5472/5097 5832/5471/5097 5147/5476/5097 4328/5477/5097 +f 4328/5468/5098 5150/5467/5098 5833/5478/5098 5154/5479/5098 +f 5150/5467/5099 4376/5466/5099 5155/5480/5099 5833/5478/5099 +f 5833/5478/5100 5155/5480/5100 4374/5481/5100 5156/5482/5100 +f 5154/5479/5101 5833/5478/5101 5156/5482/5101 4102/5483/5101 +f 4375/5484/5102 5158/5485/5102 5834/5486/5102 5157/5487/5102 +f 5158/5485/5103 4377/5469/5103 5151/5472/5103 5834/5486/5103 +f 5834/5486/5104 5151/5472/5104 4328/5477/5104 5154/5488/5104 +f 5157/5487/5105 5834/5486/5105 5154/5488/5105 4102/5489/5105 +f 4102/5483/5106 5156/5482/5106 5835/5490/5106 5159/5491/5106 +f 5156/5482/5107 4374/5481/5107 5160/5492/5107 5835/5490/5107 +f 5835/5490/5108 5160/5492/5108 4372/5493/5108 5161/5494/5108 +f 5159/5491/5109 5835/5490/5109 5161/5494/5109 4329/5495/5109 +f 4373/5496/5110 5163/5497/5110 5836/5498/5110 5162/5499/5110 +f 5163/5497/5111 4375/5484/5111 5157/5487/5111 5836/5498/5111 +f 5836/5498/5112 5157/5487/5112 4102/5489/5112 5159/5500/5112 +f 5162/5499/5113 5836/5498/5113 5159/5500/5113 4329/5501/5113 +f 4329/5495/5114 5161/5494/5114 5837/5502/5114 5164/5503/5114 +f 5161/5494/5115 4372/5493/5115 5165/5504/5115 5837/5502/5115 +f 5837/5502/5116 5165/5504/5116 4352/5348/5116 5093/5347/5116 +f 5164/5503/5117 5837/5502/5117 5093/5347/5117 4333/5346/5117 +f 4353/5351/5118 5166/5505/5118 5838/5506/5118 5096/5352/5118 +f 5166/5505/5119 4373/5496/5119 5162/5499/5119 5838/5506/5119 +f 5838/5506/5120 5162/5499/5120 4329/5501/5120 5164/5507/5120 +f 5096/5352/5121 5838/5506/5121 5164/5507/5121 4333/5355/5121 +f 4350/5420/5122 5127/5423/5122 5839/5508/5122 5139/5445/5122 +f 5127/5423/5123 4352/5348/5123 5165/5504/5123 5839/5508/5123 +f 5839/5508/5124 5165/5504/5124 4372/5493/5124 5167/5509/5124 +f 5139/5445/5125 5839/5508/5125 5167/5509/5125 4366/5434/5125 +f 4373/5496/5126 5166/5505/5126 5840/5510/5126 5168/5511/5126 +f 5166/5505/5127 4353/5351/5127 5130/5427/5127 5840/5510/5127 +f 5840/5510/5128 5130/5427/5128 4351/5426/5128 5140/5446/5128 +f 5168/5511/5129 5840/5510/5129 5140/5446/5129 4367/5442/5129 +f 4320/5320/5130 5084/5329/5130 5841/5512/5130 5169/5513/5130 +f 5084/5329/5131 4322/5328/5131 5170/5514/5131 5841/5512/5131 +f 5841/5512/5132 5170/5514/5132 4342/5515/5132 5171/5516/5132 +f 5169/5513/5133 5841/5512/5133 5171/5516/5133 4334/5517/5133 +f 4343/5518/5134 5173/5519/5134 5842/5520/5134 5172/5521/5134 +f 5173/5519/5135 4323/5330/5135 5085/5333/5135 5842/5520/5135 +f 5842/5520/5136 5085/5333/5136 4321/5322/5136 5174/5522/5136 +f 5172/5521/5137 5842/5520/5137 5174/5522/5137 4335/5523/5137 +f 4100/5524/5138 5176/5525/5138 5843/5526/5138 5175/5527/5138 +f 5176/5525/5139 4340/5528/5139 5177/5529/5139 5843/5526/5139 +f 5843/5526/5140 5177/5529/5140 4348/5464/5140 5148/5461/5140 +f 5175/5527/5141 5843/5526/5141 5148/5461/5141 4101/5460/5141 +f 4349/5473/5142 5178/5530/5142 5844/5531/5142 5153/5474/5142 +f 5178/5530/5143 4341/5532/5143 5179/5533/5143 5844/5531/5143 +f 5844/5531/5144 5179/5533/5144 4100/5534/5144 5175/5535/5144 +f 5153/5474/5145 5844/5531/5145 5175/5535/5145 4101/5475/5145 +f 4326/5536/5146 5181/5537/5146 5845/5538/5146 5180/5539/5146 +f 5181/5537/5147 4382/5540/5147 5182/5541/5147 5845/5538/5147 +f 5845/5538/5148 5182/5541/5148 4380/5542/5148 5183/5543/5148 +f 5180/5539/5149 5845/5538/5149 5183/5543/5149 4327/5544/5149 +f 4381/5545/5150 5185/5546/5150 5846/5547/5150 5184/5548/5150 +f 5185/5546/5151 4383/5549/5151 5186/5550/5151 5846/5547/5151 +f 5846/5547/5152 5186/5550/5152 4326/5551/5152 5180/5552/5152 +f 5184/5548/5153 5846/5547/5153 5180/5552/5153 4327/5553/5153 +f 4327/5544/5154 5183/5543/5154 5847/5554/5154 5187/5555/5154 +f 5183/5543/5155 4380/5542/5155 5188/5556/5155 5847/5554/5155 +f 5847/5554/5156 5188/5556/5156 4378/5557/5156 5189/5558/5156 +f 5187/5555/5157 5847/5554/5157 5189/5558/5157 4099/5559/5157 +f 4379/5560/5158 5191/5561/5158 5848/5562/5158 5190/5563/5158 +f 5191/5561/5159 4381/5545/5159 5184/5548/5159 5848/5562/5159 +f 5848/5562/5160 5184/5548/5160 4327/5553/5160 5187/5564/5160 +f 5190/5563/5161 5848/5562/5161 5187/5564/5161 4099/5565/5161 +f 4099/5559/5162 5189/5558/5162 5849/5566/5162 5192/5567/5162 +f 5189/5558/5163 4378/5557/5163 5193/5568/5163 5849/5566/5163 +f 5849/5566/5164 5193/5568/5164 4340/5528/5164 5176/5525/5164 +f 5192/5567/5165 5849/5566/5165 5176/5525/5165 4100/5524/5165 +f 4341/5532/5166 5194/5569/5166 5850/5570/5166 5179/5533/5166 +f 5194/5569/5167 4379/5560/5167 5190/5563/5167 5850/5570/5167 +f 5850/5570/5168 5190/5563/5168 4099/5565/5168 5192/5571/5168 +f 5179/5533/5169 5850/5570/5169 5192/5571/5169 4100/5534/5169 +f 4316/5572/5170 5076/5573/5170 5851/5574/5170 5195/5575/5170 +f 5076/5573/5171 4318/5312/5171 5196/5576/5171 5851/5574/5171 +f 5851/5574/5172 5196/5576/5172 4386/5577/5172 5197/5578/5172 +f 5195/5575/5173 5851/5574/5173 5197/5578/5173 4388/5579/5173 +f 4387/5580/5174 5199/5581/5174 5852/5582/5174 5198/5583/5174 +f 5199/5581/5175 4319/5314/5175 5077/5584/5175 5852/5582/5175 +f 5852/5582/5176 5077/5584/5176 4317/5585/5176 5200/5586/5176 +f 5198/5583/5177 5852/5582/5177 5200/5586/5177 4389/5587/5177 +f 4388/5579/5178 5197/5578/5178 5853/5588/5178 5201/5589/5178 +f 5197/5578/5179 4386/5577/5179 5202/5590/5179 5853/5588/5179 +f 5853/5588/5180 5202/5590/5180 4392/5591/5180 5203/5592/5180 +f 5201/5589/5181 5853/5588/5181 5203/5592/5181 4390/5593/5181 +f 4393/5594/5182 5205/5595/5182 5854/5596/5182 5204/5597/5182 +f 5205/5595/5183 4387/5580/5183 5198/5583/5183 5854/5596/5183 +f 5854/5596/5184 5198/5583/5184 4389/5587/5184 5206/5598/5184 +f 5204/5597/5185 5854/5596/5185 5206/5598/5185 4391/5599/5185 +f 4390/5593/5186 5203/5592/5186 5855/5600/5186 5207/5601/5186 +f 5203/5592/5187 4392/5591/5187 5208/5602/5187 5855/5600/5187 +f 5855/5600/5188 5208/5602/5188 4394/5603/5188 5209/5604/5188 +f 5207/5601/5189 5855/5600/5189 5209/5604/5189 4396/5605/5189 +f 4395/5606/5190 5211/5607/5190 5856/5608/5190 5210/5609/5190 +f 5211/5607/5191 4393/5594/5191 5204/5597/5191 5856/5608/5191 +f 5856/5608/5192 5204/5597/5192 4391/5599/5192 5212/5610/5192 +f 5210/5609/5193 5856/5608/5193 5212/5610/5193 4397/5611/5193 +f 4396/5605/5194 5209/5604/5194 5857/5612/5194 5213/5613/5194 +f 5209/5604/5195 4394/5603/5195 5214/5614/5195 5857/5612/5195 +f 5857/5612/5196 5214/5614/5196 4400/5615/5196 5215/5616/5196 +f 5213/5613/5197 5857/5612/5197 5215/5616/5197 4398/5617/5197 +f 4401/5618/5198 5217/5619/5198 5858/5620/5198 5216/5621/5198 +f 5217/5619/5199 4395/5606/5199 5210/5609/5199 5858/5620/5199 +f 5858/5620/5200 5210/5609/5200 4397/5611/5200 5218/5622/5200 +f 5216/5621/5201 5858/5620/5201 5218/5622/5201 4399/5623/5201 +f 4338/5624/5202 5220/5625/5202 5859/5626/5202 5219/5627/5202 +f 5220/5625/5203 4402/5628/5203 5221/5629/5203 5859/5626/5203 +f 5859/5626/5204 5221/5629/5204 4398/5617/5204 5215/5616/5204 +f 5219/5627/5205 5859/5626/5205 5215/5616/5205 4400/5615/5205 +f 4399/5623/5206 5222/5630/5206 5860/5631/5206 5216/5621/5206 +f 5222/5630/5207 4403/5632/5207 5223/5633/5207 5860/5631/5207 +f 5860/5631/5208 5223/5633/5208 4339/5634/5208 5224/5635/5208 +f 5216/5621/5209 5860/5631/5209 5224/5635/5209 4401/5618/5209 +f 4340/5528/5210 5193/5568/5210 5861/5636/5210 5225/5637/5210 +f 5193/5568/5211 4378/5557/5211 5226/5638/5211 5861/5636/5211 +f 5861/5636/5212 5226/5638/5212 4398/5617/5212 5221/5629/5212 +f 5225/5637/5213 5861/5636/5213 5221/5629/5213 4402/5628/5213 +f 4399/5623/5214 5227/5639/5214 5862/5640/5214 5222/5630/5214 +f 5227/5639/5215 4379/5560/5215 5194/5569/5215 5862/5640/5215 +f 5862/5640/5216 5194/5569/5216 4341/5532/5216 5228/5641/5216 +f 5222/5630/5217 5862/5640/5217 5228/5641/5217 4403/5632/5217 +f 4378/5557/5218 5188/5556/5218 5863/5642/5218 5226/5638/5218 +f 5188/5556/5219 4380/5542/5219 5229/5643/5219 5863/5642/5219 +f 5863/5642/5220 5229/5643/5220 4396/5605/5220 5213/5613/5220 +f 5226/5638/5221 5863/5642/5221 5213/5613/5221 4398/5617/5221 +f 4397/5611/5222 5230/5644/5222 5864/5645/5222 5218/5622/5222 +f 5230/5644/5223 4381/5545/5223 5191/5561/5223 5864/5645/5223 +f 5864/5645/5224 5191/5561/5224 4379/5560/5224 5227/5639/5224 +f 5218/5622/5225 5864/5645/5225 5227/5639/5225 4399/5623/5225 +f 4380/5542/5226 5182/5541/5226 5865/5646/5226 5229/5643/5226 +f 5182/5541/5227 4382/5540/5227 5231/5647/5227 5865/5646/5227 +f 5865/5646/5228 5231/5647/5228 4390/5593/5228 5207/5601/5228 +f 5229/5643/5229 5865/5646/5229 5207/5601/5229 4396/5605/5229 +f 4391/5599/5230 5232/5648/5230 5866/5649/5230 5212/5610/5230 +f 5232/5648/5231 4383/5549/5231 5185/5546/5231 5866/5649/5231 +f 5866/5649/5232 5185/5546/5232 4381/5545/5232 5230/5644/5232 +f 5212/5610/5233 5866/5649/5233 5230/5644/5233 4397/5611/5233 +f 4382/5540/5234 5233/5650/5234 5867/5651/5234 5231/5647/5234 +f 5233/5650/5235 4384/5652/5235 5234/5653/5235 5867/5651/5235 +f 5867/5651/5236 5234/5653/5236 4388/5579/5236 5201/5589/5236 +f 5231/5647/5237 5867/5651/5237 5201/5589/5237 4390/5593/5237 +f 4389/5587/5238 5235/5654/5238 5868/5655/5238 5206/5598/5238 +f 5235/5654/5239 4385/5656/5239 5236/5657/5239 5868/5655/5239 +f 5868/5655/5240 5236/5657/5240 4383/5549/5240 5232/5648/5240 +f 5206/5598/5241 5868/5655/5241 5232/5648/5241 4391/5599/5241 +f 4314/5658/5242 5072/5659/5242 5869/5660/5242 5237/5661/5242 +f 5072/5659/5243 4316/5572/5243 5195/5575/5243 5869/5660/5243 +f 5869/5660/5244 5195/5575/5244 4388/5579/5244 5234/5653/5244 +f 5237/5661/5245 5869/5660/5245 5234/5653/5245 4384/5652/5245 +f 4389/5587/5246 5200/5586/5246 5870/5662/5246 5235/5654/5246 +f 5200/5586/5247 4317/5585/5247 5073/5663/5247 5870/5662/5247 +f 5870/5662/5248 5073/5663/5248 4315/5664/5248 5238/5665/5248 +f 5235/5654/5249 5870/5662/5249 5238/5665/5249 4385/5656/5249 +f 4098/5666/5250 5240/5667/5250 5871/5668/5250 5239/5669/5250 +f 5240/5667/5251 4384/5652/5251 5233/5650/5251 5871/5668/5251 +f 5871/5668/5252 5233/5650/5252 4382/5540/5252 5181/5537/5252 +f 5239/5669/5253 5871/5668/5253 5181/5537/5253 4326/5536/5253 +f 4383/5549/5254 5236/5657/5254 5872/5670/5254 5186/5550/5254 +f 5236/5657/5255 4385/5656/5255 5241/5671/5255 5872/5670/5255 +f 5872/5670/5256 5241/5671/5256 4098/5672/5256 5239/5673/5256 +f 5186/5550/5257 5872/5670/5257 5239/5673/5257 4326/5551/5257 +f 4308/5674/5258 5060/5675/5258 5873/5676/5258 5242/5677/5258 +f 5060/5675/5259 4310/5678/5259 5064/5679/5259 5873/5676/5259 +f 5873/5676/5260 5064/5679/5260 4312/5680/5260 5068/5681/5260 +f 5242/5677/5261 5873/5676/5261 5068/5681/5261 4314/5658/5261 +f 4313/5682/5262 5065/5683/5262 5874/5684/5262 5069/5685/5262 +f 5065/5683/5263 4311/5686/5263 5061/5687/5263 5874/5684/5263 +f 5874/5684/5264 5061/5687/5264 4309/5688/5264 5243/5689/5264 +f 5069/5685/5265 5874/5684/5265 5243/5689/5265 4315/5664/5265 +f 4308/5674/5266 5242/5677/5266 5875/5690/5266 5244/5691/5266 +f 5242/5677/5267 4314/5658/5267 5237/5661/5267 5875/5690/5267 +f 5875/5690/5268 5237/5661/5268 4384/5652/5268 5240/5667/5268 +f 5244/5691/5269 5875/5690/5269 5240/5667/5269 4098/5666/5269 +f 4385/5656/5270 5238/5665/5270 5876/5692/5270 5241/5671/5270 +f 5238/5665/5271 4315/5664/5271 5243/5689/5271 5876/5692/5271 +f 5876/5692/5272 5243/5689/5272 4309/5688/5272 5245/5693/5272 +f 5241/5671/5273 5876/5692/5273 5245/5693/5273 4098/5672/5273 +f 4097/5694/5274 5056/5695/5274 5877/5696/5274 5246/5697/5274 +f 4308/5674/5275 5244/5691/5275 5877/5696/5275 5056/5695/5275 +f 4098/5666/5276 5246/5697/5276 5877/5696/5276 5244/5691/5276 +f 4098/5672/5277 5245/5693/5277 5878/5698/5277 5246/5699/5277 +f 4309/5688/5278 5057/5700/5278 5878/5698/5278 5245/5693/5278 +f 4097/5701/5279 5246/5699/5279 5878/5698/5279 5057/5700/5279 +f 4318/5312/5280 5080/5321/5280 5879/5702/5280 5196/5576/5280 +f 5080/5321/5281 4320/5320/5281 5169/5513/5281 5879/5702/5281 +f 5879/5702/5282 5169/5513/5282 4334/5517/5282 5247/5703/5282 +f 5196/5576/5283 5879/5702/5283 5247/5703/5283 4386/5577/5283 +f 4335/5523/5284 5174/5522/5284 5880/5704/5284 5248/5705/5284 +f 5174/5522/5285 4321/5322/5285 5081/5325/5285 5880/5704/5285 +f 5880/5704/5286 5081/5325/5286 4319/5314/5286 5199/5581/5286 +f 5248/5705/5287 5880/5704/5287 5199/5581/5287 4387/5580/5287 +f 4334/5517/5288 5249/5706/5288 5881/5707/5288 5247/5703/5288 +f 5249/5706/5289 4336/5708/5289 5250/5709/5289 5881/5707/5289 +f 5881/5707/5290 5250/5709/5290 4392/5591/5290 5202/5590/5290 +f 5247/5703/5291 5881/5707/5291 5202/5590/5291 4386/5577/5291 +f 4393/5594/5292 5251/5710/5292 5882/5711/5292 5205/5595/5292 +f 5251/5710/5293 4337/5712/5293 5252/5713/5293 5882/5711/5293 +f 5882/5711/5294 5252/5713/5294 4335/5523/5294 5248/5705/5294 +f 5205/5595/5295 5882/5711/5295 5248/5705/5295 4387/5580/5295 +f 4336/5708/5296 5253/5714/5296 5883/5715/5296 5250/5709/5296 +f 5253/5714/5297 4406/5716/5297 5254/5717/5297 5883/5715/5297 +f 5883/5715/5298 5254/5717/5298 4394/5603/5298 5208/5602/5298 +f 5250/5709/5299 5883/5715/5299 5208/5602/5299 4392/5591/5299 +f 4395/5606/5300 5255/5718/5300 5884/5719/5300 5211/5607/5300 +f 5255/5718/5301 4407/5720/5301 5256/5721/5301 5884/5719/5301 +f 5884/5719/5302 5256/5721/5302 4337/5712/5302 5251/5710/5302 +f 5211/5607/5303 5884/5719/5303 5251/5710/5303 4393/5594/5303 +f 4338/5624/5304 5219/5627/5304 5885/5722/5304 5257/5723/5304 +f 5219/5627/5305 4400/5615/5305 5214/5614/5305 5885/5722/5305 +f 5885/5722/5306 5214/5614/5306 4394/5603/5306 5254/5717/5306 +f 5257/5723/5307 5885/5722/5307 5254/5717/5307 4406/5716/5307 +f 4395/5606/5308 5217/5619/5308 5886/5724/5308 5255/5718/5308 +f 5217/5619/5309 4401/5618/5309 5224/5635/5309 5886/5724/5309 +f 5886/5724/5310 5224/5635/5310 4339/5634/5310 5258/5725/5310 +f 5255/5718/5311 5886/5724/5311 5258/5725/5311 4407/5720/5311 +f 4372/5493/5312 5160/5492/5312 5887/5726/5312 5259/5727/5312 +f 5160/5492/5313 4374/5481/5313 5260/5728/5313 5887/5726/5313 +f 5887/5726/5314 5260/5728/5314 4410/5729/5314 5261/5730/5314 +f 5259/5727/5315 5887/5726/5315 5261/5730/5315 4408/5731/5315 +f 4411/5732/5316 5263/5733/5316 5888/5734/5316 5262/5735/5316 +f 5263/5733/5317 4375/5484/5317 5163/5497/5317 5888/5734/5317 +f 5888/5734/5318 5163/5497/5318 4373/5496/5318 5264/5736/5318 +f 5262/5735/5319 5888/5734/5319 5264/5736/5319 4409/5737/5319 +f 4342/5515/5320 5266/5738/5320 5889/5739/5320 5265/5740/5320 +f 5266/5738/5321 4408/5731/5321 5261/5730/5321 5889/5739/5321 +f 5889/5739/5322 5261/5730/5322 4410/5729/5322 5267/5741/5322 +f 5265/5740/5323 5889/5739/5323 5267/5741/5323 4344/5742/5323 +f 4411/5732/5324 5262/5735/5324 5890/5743/5324 5268/5744/5324 +f 5262/5735/5325 4409/5737/5325 5269/5745/5325 5890/5743/5325 +f 5890/5743/5326 5269/5745/5326 4343/5518/5326 5270/5746/5326 +f 5268/5744/5327 5890/5743/5327 5270/5746/5327 4345/5747/5327 +f 4322/5328/5328 5088/5337/5328 5891/5748/5328 5170/5514/5328 +f 5088/5337/5329 4324/5336/5329 5271/5749/5329 5891/5748/5329 +f 5891/5748/5330 5271/5749/5330 4408/5731/5330 5266/5738/5330 +f 5170/5514/5331 5891/5748/5331 5266/5738/5331 4342/5515/5331 +f 4409/5737/5332 5272/5750/5332 5892/5751/5332 5269/5745/5332 +f 5272/5750/5333 4325/5338/5333 5089/5341/5333 5892/5751/5333 +f 5892/5751/5334 5089/5341/5334 4323/5330/5334 5173/5519/5334 +f 5269/5745/5335 5892/5751/5335 5173/5519/5335 4343/5518/5335 +f 4324/5336/5336 5273/5752/5336 5893/5753/5336 5271/5749/5336 +f 5273/5752/5337 4368/5436/5337 5134/5435/5337 5893/5753/5337 +f 5893/5753/5338 5134/5435/5338 4366/5434/5338 5274/5754/5338 +f 5271/5749/5339 5893/5753/5339 5274/5754/5339 4408/5731/5339 +f 4367/5442/5340 5137/5439/5340 5894/5755/5340 5275/5756/5340 +f 5137/5439/5341 4369/5438/5341 5276/5757/5341 5894/5755/5341 +f 5894/5755/5342 5276/5757/5342 4325/5338/5342 5272/5750/5342 +f 5275/5756/5343 5894/5755/5343 5272/5750/5343 4409/5737/5343 +f 4366/5434/5344 5167/5509/5344 5895/5758/5344 5274/5754/5344 +f 4372/5493/5345 5259/5727/5345 5895/5758/5345 5167/5509/5345 +f 4408/5731/5346 5274/5754/5346 5895/5758/5346 5259/5727/5346 +f 4409/5737/5347 5264/5736/5347 5896/5759/5347 5275/5756/5347 +f 4373/5496/5348 5168/5511/5348 5896/5759/5348 5264/5736/5348 +f 4367/5442/5349 5275/5756/5349 5896/5759/5349 5168/5511/5349 +f 4324/5336/5350 5145/5457/5350 5897/5760/5350 5273/5752/5350 +f 4370/5451/5351 5142/5450/5351 5897/5760/5351 5145/5457/5351 +f 4368/5436/5352 5273/5752/5352 5897/5760/5352 5142/5450/5352 +f 4369/5438/5353 5143/5453/5353 5898/5761/5353 5276/5757/5353 +f 4371/5455/5354 5146/5458/5354 5898/5761/5354 5143/5453/5354 +f 4325/5338/5355 5276/5757/5355 5898/5761/5355 5146/5458/5355 +f 4338/5624/5356 5277/5762/5356 5899/5763/5356 5220/5625/5356 +f 5277/5762/5357 4346/5764/5357 5278/5765/5357 5899/5763/5357 +f 5899/5763/5358 5278/5765/5358 4404/5766/5358 5279/5767/5358 +f 5220/5625/5359 5899/5763/5359 5279/5767/5359 4402/5628/5359 +f 4405/5768/5360 5281/5769/5360 5900/5770/5360 5280/5771/5360 +f 5281/5769/5361 4347/5772/5361 5282/5773/5361 5900/5770/5361 +f 5900/5770/5362 5282/5773/5362 4339/5634/5362 5223/5633/5362 +f 5280/5771/5363 5900/5770/5363 5223/5633/5363 4403/5632/5363 +f 4340/5528/5364 5225/5637/5364 5901/5774/5364 5177/5529/5364 +f 5225/5637/5365 4402/5628/5365 5279/5767/5365 5901/5774/5365 +f 5901/5774/5366 5279/5767/5366 4404/5766/5366 5283/5775/5366 +f 5177/5529/5367 5901/5774/5367 5283/5775/5367 4348/5464/5367 +f 4405/5768/5368 5280/5771/5368 5902/5776/5368 5284/5777/5368 +f 5280/5771/5369 4403/5632/5369 5228/5641/5369 5902/5776/5369 +f 5902/5776/5370 5228/5641/5370 4341/5532/5370 5178/5530/5370 +f 5284/5777/5371 5902/5776/5371 5178/5530/5371 4349/5473/5371 +f 4344/5742/5372 5267/5741/5372 5903/5778/5372 5285/5779/5372 +f 5267/5741/5373 4410/5729/5373 5286/5780/5373 5903/5778/5373 +f 5903/5778/5374 5286/5780/5374 4404/5766/5374 5278/5765/5374 +f 5285/5779/5375 5903/5778/5375 5278/5765/5375 4346/5764/5375 +f 4405/5768/5376 5287/5781/5376 5904/5782/5376 5281/5769/5376 +f 5287/5781/5377 4411/5732/5377 5268/5744/5377 5904/5782/5377 +f 5904/5782/5378 5268/5744/5378 4345/5747/5378 5288/5783/5378 +f 5281/5769/5379 5904/5782/5379 5288/5783/5379 4347/5772/5379 +f 4374/5481/5380 5155/5480/5380 5905/5784/5380 5260/5728/5380 +f 5155/5480/5381 4376/5466/5381 5289/5785/5381 5905/5784/5381 +f 5905/5784/5382 5289/5785/5382 4404/5766/5382 5286/5780/5382 +f 5260/5728/5383 5905/5784/5383 5286/5780/5383 4410/5729/5383 +f 4405/5768/5384 5290/5786/5384 5906/5787/5384 5287/5781/5384 +f 5290/5786/5385 4377/5469/5385 5158/5485/5385 5906/5787/5385 +f 5906/5787/5386 5158/5485/5386 4375/5484/5386 5263/5733/5386 +f 5287/5781/5387 5906/5787/5387 5263/5733/5387 4411/5732/5387 +f 4348/5464/5388 5283/5775/5388 5907/5788/5388 5149/5465/5388 +f 4404/5766/5389 5289/5785/5389 5907/5788/5389 5283/5775/5389 +f 4376/5466/5390 5149/5465/5390 5907/5788/5390 5289/5785/5390 +f 4377/5469/5391 5290/5786/5391 5908/5789/5391 5152/5470/5391 +f 4405/5768/5392 5284/5777/5392 5908/5789/5392 5290/5786/5392 +f 4349/5473/5393 5152/5470/5393 5908/5789/5393 5284/5777/5393 +f 4424/5790/5394 5292/5791/5394 5909/5792/5394 5291/5793/5394 +f 5292/5791/5395 4412/5794/5395 5293/5795/5395 5909/5792/5395 +f 5909/5792/5396 5293/5795/5396 4438/5796/5396 5294/5797/5396 +f 5291/5793/5397 5909/5792/5397 5294/5797/5397 4426/5798/5397 +f 4439/5799/5398 5296/5800/5398 5910/5801/5398 5295/5802/5398 +f 5296/5800/5399 4413/5803/5399 5297/5804/5399 5910/5801/5399 +f 5910/5801/5400 5297/5804/5400 4425/5805/5400 5298/5806/5400 +f 5295/5802/5401 5910/5801/5401 5298/5806/5401 4427/5807/5401 +f 4424/5790/5402 5291/5793/5402 5911/5808/5402 5299/5809/5402 +f 5291/5793/5403 4426/5798/5403 5300/5810/5403 5911/5808/5403 +f 5911/5808/5404 5300/5810/5404 4428/5811/5404 5301/5812/5404 +f 5299/5809/5405 5911/5808/5405 5301/5812/5405 4422/5813/5405 +f 4429/5814/5406 5303/5815/5406 5912/5816/5406 5302/5817/5406 +f 5303/5815/5407 4427/5807/5407 5298/5806/5407 5912/5816/5407 +f 5912/5816/5408 5298/5806/5408 4425/5805/5408 5304/5818/5408 +f 5302/5817/5409 5912/5816/5409 5304/5818/5409 4423/5819/5409 +f 4422/5813/5410 5301/5812/5410 5913/5820/5410 5305/5821/5410 +f 5301/5812/5411 4428/5811/5411 5306/5822/5411 5913/5820/5411 +f 5913/5820/5412 5306/5822/5412 4430/5823/5412 5307/5824/5412 +f 5305/5821/5413 5913/5820/5413 5307/5824/5413 4420/5825/5413 +f 4431/5826/5414 5309/5827/5414 5914/5828/5414 5308/5829/5414 +f 5309/5827/5415 4429/5814/5415 5302/5817/5415 5914/5828/5415 +f 5914/5828/5416 5302/5817/5416 4423/5819/5416 5310/5830/5416 +f 5308/5829/5417 5914/5828/5417 5310/5830/5417 4421/5831/5417 +f 4420/5825/5418 5307/5824/5418 5915/5832/5418 5311/5833/5418 +f 5307/5824/5419 4430/5823/5419 5312/5834/5419 5915/5832/5419 +f 5915/5832/5420 5312/5834/5420 4432/5835/5420 5313/5836/5420 +f 5311/5833/5421 5915/5832/5421 5313/5836/5421 4418/5837/5421 +f 4433/5838/5422 5315/5839/5422 5916/5840/5422 5314/5841/5422 +f 5315/5839/5423 4431/5826/5423 5308/5829/5423 5916/5840/5423 +f 5916/5840/5424 5308/5829/5424 4421/5831/5424 5316/5842/5424 +f 5314/5841/5425 5916/5840/5425 5316/5842/5425 4419/5843/5425 +f 4418/5837/5426 5313/5836/5426 5917/5844/5426 5317/5845/5426 +f 5313/5836/5427 4432/5835/5427 5318/5846/5427 5917/5844/5427 +f 5917/5844/5428 5318/5846/5428 4434/5847/5428 5319/5848/5428 +f 5317/5845/5429 5917/5844/5429 5319/5848/5429 4416/5849/5429 +f 4435/5850/5430 5321/5851/5430 5918/5852/5430 5320/5853/5430 +f 5321/5851/5431 4433/5838/5431 5314/5841/5431 5918/5852/5431 +f 5918/5852/5432 5314/5841/5432 4419/5843/5432 5322/5854/5432 +f 5320/5853/5433 5918/5852/5433 5322/5854/5433 4417/5855/5433 +f 4416/5849/5434 5319/5848/5434 5919/5856/5434 5323/5857/5434 +f 5319/5848/5435 4434/5847/5435 5324/5858/5435 5919/5856/5435 +f 5919/5856/5436 5324/5858/5436 4436/5859/5436 5325/5860/5436 +f 5323/5857/5437 5919/5856/5437 5325/5860/5437 4414/5861/5437 +f 4437/5862/5438 5327/5863/5438 5920/5864/5438 5326/5865/5438 +f 5327/5863/5439 4435/5850/5439 5320/5853/5439 5920/5864/5439 +f 5920/5864/5440 5320/5853/5440 4417/5855/5440 5328/5866/5440 +f 5326/5865/5441 5920/5864/5441 5328/5866/5441 4415/5867/5441 +f 4434/5847/5442 5329/5868/5442 5921/5869/5442 5324/5858/5442 +f 5329/5868/5443 4444/5870/5443 5330/5871/5443 5921/5869/5443 +f 5921/5869/5444 5330/5871/5444 4442/5872/5444 5331/5873/5444 +f 5324/5858/5445 5921/5869/5445 5331/5873/5445 4436/5859/5445 +f 4443/5874/5446 5333/5875/5446 5922/5876/5446 5332/5877/5446 +f 5333/5875/5447 4445/5878/5447 5334/5879/5447 5922/5876/5447 +f 5922/5876/5448 5334/5879/5448 4435/5850/5448 5327/5863/5448 +f 5332/5877/5449 5922/5876/5449 5327/5863/5449 4437/5862/5449 +f 4432/5835/5450 5335/5880/5450 5923/5881/5450 5318/5846/5450 +f 5335/5880/5451 4446/5882/5451 5336/5883/5451 5923/5881/5451 +f 5923/5881/5452 5336/5883/5452 4444/5870/5452 5329/5868/5452 +f 5318/5846/5453 5923/5881/5453 5329/5868/5453 4434/5847/5453 +f 4445/5878/5454 5337/5884/5454 5924/5885/5454 5334/5879/5454 +f 5337/5884/5455 4447/5886/5455 5338/5887/5455 5924/5885/5455 +f 5924/5885/5456 5338/5887/5456 4433/5838/5456 5321/5851/5456 +f 5334/5879/5457 5924/5885/5457 5321/5851/5457 4435/5850/5457 +f 4430/5823/5458 5339/5888/5458 5925/5889/5458 5312/5834/5458 +f 5339/5888/5459 4448/5890/5459 5340/5891/5459 5925/5889/5459 +f 5925/5889/5460 5340/5891/5460 4446/5882/5460 5335/5880/5460 +f 5312/5834/5461 5925/5889/5461 5335/5880/5461 4432/5835/5461 +f 4447/5886/5462 5341/5892/5462 5926/5893/5462 5338/5887/5462 +f 5341/5892/5463 4449/5894/5463 5342/5895/5463 5926/5893/5463 +f 5926/5893/5464 5342/5895/5464 4431/5826/5464 5315/5839/5464 +f 5338/5887/5465 5926/5893/5465 5315/5839/5465 4433/5838/5465 +f 4428/5811/5466 5343/5896/5466 5927/5897/5466 5306/5822/5466 +f 5343/5896/5467 4450/5898/5467 5344/5899/5467 5927/5897/5467 +f 5927/5897/5468 5344/5899/5468 4448/5890/5468 5339/5888/5468 +f 5306/5822/5469 5927/5897/5469 5339/5888/5469 4430/5823/5469 +f 4449/5894/5470 5345/5900/5470 5928/5901/5470 5342/5895/5470 +f 5345/5900/5471 4451/5902/5471 5346/5903/5471 5928/5901/5471 +f 5928/5901/5472 5346/5903/5472 4429/5814/5472 5309/5827/5472 +f 5342/5895/5473 5928/5901/5473 5309/5827/5473 4431/5826/5473 +f 4426/5798/5474 5347/5904/5474 5929/5905/5474 5300/5810/5474 +f 5347/5904/5475 4452/5906/5475 5348/5907/5475 5929/5905/5475 +f 5929/5905/5476 5348/5907/5476 4450/5898/5476 5343/5896/5476 +f 5300/5810/5477 5929/5905/5477 5343/5896/5477 4428/5811/5477 +f 4451/5902/5478 5349/5908/5478 5930/5909/5478 5346/5903/5478 +f 5349/5908/5479 4453/5910/5479 5350/5911/5479 5930/5909/5479 +f 5930/5909/5480 5350/5911/5480 4427/5807/5480 5303/5815/5480 +f 5346/5903/5481 5930/5909/5481 5303/5815/5481 4429/5814/5481 +f 4426/5798/5482 5294/5797/5482 5931/5912/5482 5347/5904/5482 +f 5294/5797/5483 4438/5796/5483 5351/5913/5483 5931/5912/5483 +f 5931/5912/5484 5351/5913/5484 4440/5914/5484 5352/5915/5484 +f 5347/5904/5485 5931/5912/5485 5352/5915/5485 4452/5906/5485 +f 4441/5916/5486 5354/5917/5486 5932/5918/5486 5353/5919/5486 +f 5354/5917/5487 4439/5799/5487 5295/5802/5487 5932/5918/5487 +f 5932/5918/5488 5295/5802/5488 4427/5807/5488 5350/5911/5488 +f 5353/5919/5489 5932/5918/5489 5350/5911/5489 4453/5910/5489 +f 4342/5515/5490 5265/5740/5490 5933/5920/5490 5355/5921/5490 +f 5265/5740/5491 4344/5742/5491 5356/5922/5491 5933/5920/5491 +f 5933/5920/5492 5356/5922/5492 4468/5923/5492 5357/5924/5492 +f 5355/5921/5493 5933/5920/5493 5357/5924/5493 4466/5925/5493 +f 4469/5926/5494 5359/5927/5494 5934/5928/5494 5358/5929/5494 +f 5359/5927/5495 4345/5747/5495 5270/5746/5495 5934/5928/5495 +f 5934/5928/5496 5270/5746/5496 4343/5518/5496 5360/5930/5496 +f 5358/5929/5497 5934/5928/5497 5360/5930/5497 4467/5931/5497 +f 4344/5932/5498 5361/5933/5498 5935/5934/5498 5356/5935/5498 +f 5361/5933/5499 4414/5861/5499 5325/5860/5499 5935/5934/5499 +f 5935/5934/5500 5325/5860/5500 4436/5859/5500 5362/5936/5500 +f 5356/5935/5501 5935/5934/5501 5362/5936/5501 4468/5937/5501 +f 4437/5862/5502 5326/5865/5502 5936/5938/5502 5363/5939/5502 +f 5326/5865/5499 4415/5867/5499 5364/5940/5499 5936/5938/5499 +f 5936/5938/5503 5364/5940/5503 4345/5941/5503 5359/5942/5503 +f 5363/5939/5504 5936/5938/5504 5359/5942/5504 4469/5943/5504 +f 4334/5517/5505 5171/5516/5505 5937/5944/5505 5249/5706/5505 +f 5171/5516/5506 4342/5515/5506 5355/5921/5506 5937/5944/5506 +f 5937/5944/5507 5355/5921/5507 4466/5925/5507 5365/5945/5507 +f 5249/5706/5508 5937/5944/5508 5365/5945/5508 4336/5708/5508 +f 4467/5931/5509 5360/5930/5509 5938/5946/5509 5366/5947/5509 +f 5360/5930/5510 4343/5518/5510 5172/5521/5510 5938/5946/5510 +f 5938/5946/5511 5172/5521/5511 4335/5523/5511 5252/5713/5511 +f 5366/5947/5512 5938/5946/5512 5252/5713/5512 4337/5712/5512 +f 4406/5948/5513 5368/5949/5513 5939/5950/5513 5367/5951/5513 +f 5368/5949/5514 4454/5952/5514 5369/5953/5514 5939/5950/5514 +f 5939/5950/5515 5369/5953/5515 4438/5796/5515 5293/5795/5515 +f 5367/5951/5516 5939/5950/5516 5293/5795/5516 4412/5794/5516 +f 4439/5799/5517 5370/5954/5517 5940/5955/5517 5296/5800/5517 +f 5370/5954/5518 4455/5956/5518 5371/5957/5518 5940/5955/5518 +f 5940/5955/5519 5371/5957/5519 4407/5958/5519 5372/5959/5519 +f 5296/5800/5520 5940/5955/5520 5372/5959/5520 4413/5803/5520 +f 4436/5859/5521 5331/5873/5521 5941/5960/5521 5362/5936/5521 +f 5331/5873/5522 4442/5872/5522 5373/5961/5522 5941/5960/5522 +f 5941/5960/5523 5373/5961/5523 4464/5962/5523 5374/5963/5523 +f 5362/5936/5524 5941/5960/5524 5374/5963/5524 4468/5937/5524 +f 4465/5964/5525 5376/5965/5525 5942/5966/5525 5375/5967/5525 +f 5376/5965/5526 4443/5874/5526 5332/5877/5526 5942/5966/5526 +f 5942/5966/5527 5332/5877/5527 4437/5862/5527 5363/5939/5527 +f 5375/5967/5528 5942/5966/5528 5363/5939/5528 4469/5943/5528 +f 4462/5968/5529 5378/5969/5529 5943/5970/5529 5377/5971/5529 +f 5378/5969/5530 4470/5972/5530 5379/5973/5530 5943/5970/5530 +f 5943/5970/5531 5379/5973/5531 4468/5937/5531 5374/5963/5531 +f 5377/5971/5532 5943/5970/5532 5374/5963/5532 4464/5962/5532 +f 4469/5943/5533 5380/5974/5533 5944/5975/5533 5375/5967/5533 +f 5380/5974/5534 4471/5976/5534 5381/5977/5534 5944/5975/5534 +f 5944/5975/5535 5381/5977/5535 4463/5978/5535 5382/5979/5535 +f 5375/5967/5536 5944/5975/5536 5382/5979/5536 4465/5964/5536 +f 4458/5980/5537 5384/5981/5537 5945/5982/5537 5383/5983/5537 +f 5384/5981/5538 4470/5972/5538 5378/5969/5538 5945/5982/5538 +f 5945/5982/5539 5378/5969/5539 4462/5968/5539 5385/5984/5539 +f 5383/5983/5540 5945/5982/5540 5385/5984/5540 4460/5985/5540 +f 4463/5978/5541 5381/5977/5541 5946/5986/5541 5386/5987/5541 +f 5381/5977/5542 4471/5976/5542 5387/5988/5542 5946/5986/5542 +f 5946/5986/5543 5387/5988/5543 4459/5989/5543 5388/5990/5543 +f 5386/5987/5544 5946/5986/5544 5388/5990/5544 4461/5991/5544 +f 4456/5992/5545 5390/5993/5545 5947/5994/5545 5389/5995/5545 +f 5390/5993/5546 4472/5996/5546 5391/5997/5546 5947/5994/5546 +f 5947/5994/5547 5391/5997/5547 4470/5972/5547 5384/5981/5547 +f 5389/5995/5548 5947/5994/5548 5384/5981/5548 4458/5980/5548 +f 4471/5976/5549 5392/5998/5549 5948/5999/5549 5387/5988/5549 +f 5392/5998/5550 4473/6000/5550 5393/6001/5550 5948/5999/5550 +f 5948/5999/5551 5393/6001/5551 4457/6002/5551 5394/6003/5551 +f 5387/5988/5552 5948/5999/5552 5394/6003/5552 4459/5989/5552 +f 4454/5952/5553 5396/6004/5553 5949/6005/5553 5395/6006/5553 +f 5396/6004/5554 4472/5996/5554 5390/5993/5554 5949/6005/5554 +f 5949/6005/5555 5390/5993/5555 4456/5992/5555 5397/6007/5555 +f 5395/6006/5556 5949/6005/5556 5397/6007/5556 4474/6008/5556 +f 4457/6002/5557 5393/6001/5557 5950/6009/5557 5398/6010/5557 +f 5393/6001/5558 4473/6000/5558 5399/6011/5558 5950/6009/5558 +f 5950/6009/5559 5399/6011/5559 4455/5956/5559 5400/6012/5559 +f 5398/6010/5560 5950/6009/5560 5400/6012/5560 4475/6013/5560 +f 4438/5796/5561 5369/5953/5561 5951/6014/5561 5351/5913/5561 +f 5369/5953/5562 4454/5952/5562 5395/6006/5562 5951/6014/5562 +f 5951/6014/5563 5395/6006/5563 4474/6008/5563 5401/6015/5563 +f 5351/5913/5564 5951/6014/5564 5401/6015/5564 4440/5914/5564 +f 4475/6013/5565 5400/6012/5565 5952/6016/5565 5402/6017/5565 +f 5400/6012/5566 4455/5956/5566 5370/5954/5566 5952/6016/5566 +f 5952/6016/5567 5370/5954/5567 4439/5799/5567 5354/5917/5567 +f 5402/6017/5568 5952/6016/5568 5354/5917/5568 4441/5916/5568 +f 4336/5708/5569 5403/6018/5569 5953/6019/5569 5253/5714/5569 +f 5403/6018/5570 4472/6020/5570 5396/6021/5570 5953/6019/5570 +f 5953/6019/5571 5396/6021/5571 4454/6022/5571 5368/6023/5571 +f 5253/5714/5572 5953/6019/5572 5368/6023/5572 4406/5716/5572 +f 4455/6024/5573 5399/6025/5573 5954/6026/5573 5371/6027/5573 +f 5399/6025/5574 4473/6028/5574 5404/6029/5574 5954/6026/5574 +f 5954/6026/5575 5404/6029/5575 4337/5712/5575 5256/5721/5575 +f 5371/6027/5576 5954/6026/5576 5256/5721/5576 4407/5720/5576 +f 4336/5708/5577 5365/5945/5577 5955/6030/5577 5403/6018/5577 +f 5365/5945/5578 4466/5925/5578 5405/6031/5578 5955/6030/5578 +f 5955/6030/5579 5405/6031/5579 4470/6032/5579 5391/6033/5579 +f 5403/6018/5580 5955/6030/5580 5391/6033/5580 4472/6020/5580 +f 4471/6034/5581 5406/6035/5581 5956/6036/5581 5392/6037/5581 +f 5406/6035/5582 4467/5931/5582 5366/5947/5582 5956/6036/5582 +f 5956/6036/5583 5366/5947/5583 4337/5712/5583 5404/6029/5583 +f 5392/6037/5584 5956/6036/5584 5404/6029/5584 4473/6028/5584 +f 4466/5925/5585 5357/5924/5585 5957/6038/5585 5405/6031/5585 +f 4468/5923/5586 5379/6039/5586 5957/6038/5586 5357/5924/5586 +f 4470/6032/5587 5405/6031/5587 5957/6038/5587 5379/6039/5587 +f 4471/6034/5588 5380/6040/5588 5958/6041/5588 5406/6035/5588 +f 4469/5926/5589 5358/5929/5589 5958/6041/5589 5380/6040/5589 +f 4467/5931/5590 5406/6035/5590 5958/6041/5590 5358/5929/5590 +f 4440/5914/5591 5401/6015/5591 5959/6042/5591 5407/6043/5591 +f 5401/6015/5592 4474/6008/5592 5408/6044/5592 5959/6042/5592 +f 5959/6042/5593 5408/6044/5593 4476/6045/5593 5409/6046/5593 +f 5407/6043/5594 5959/6042/5594 5409/6046/5594 4500/6047/5594 +f 4477/6048/5595 5411/6049/5595 5960/6050/5595 5410/6051/5595 +f 5411/6049/5596 4475/6013/5596 5402/6017/5596 5960/6050/5596 +f 5960/6050/5597 5402/6017/5597 4441/5916/5597 5412/6052/5597 +f 5410/6051/5598 5960/6050/5598 5412/6052/5598 4501/6053/5598 +f 4474/6008/5599 5397/6007/5599 5961/6054/5599 5408/6044/5599 +f 5397/6007/5600 4456/5992/5600 5413/6055/5600 5961/6054/5600 +f 5961/6054/5601 5413/6055/5601 4486/6056/5601 5414/6057/5601 +f 5408/6044/5602 5961/6054/5602 5414/6057/5602 4476/6045/5602 +f 4487/6058/5603 5416/6059/5603 5962/6060/5603 5415/6061/5603 +f 5416/6059/5604 4457/6002/5604 5398/6010/5604 5962/6060/5604 +f 5962/6060/5605 5398/6010/5605 4475/6013/5605 5411/6049/5605 +f 5415/6061/5606 5962/6060/5606 5411/6049/5606 4477/6048/5606 +f 4456/5992/5607 5389/5995/5607 5963/6062/5607 5413/6055/5607 +f 5389/5995/5608 4458/5980/5608 5417/6063/5608 5963/6062/5608 +f 5963/6062/5609 5417/6063/5609 4484/6064/5609 5418/6065/5609 +f 5413/6055/5610 5963/6062/5610 5418/6065/5610 4486/6056/5610 +f 4485/6066/5611 5420/6067/5611 5964/6068/5611 5419/6069/5611 +f 5420/6067/5612 4459/5989/5612 5394/6003/5612 5964/6068/5612 +f 5964/6068/5613 5394/6003/5613 4457/6002/5613 5416/6059/5613 +f 5419/6069/5614 5964/6068/5614 5416/6059/5614 4487/6058/5614 +f 4458/5980/5615 5383/5983/5615 5965/6070/5615 5417/6063/5615 +f 5383/5983/5616 4460/5985/5616 5421/6071/5616 5965/6070/5616 +f 5965/6070/5617 5421/6071/5617 4482/6072/5617 5422/6073/5617 +f 5417/6063/5618 5965/6070/5618 5422/6073/5618 4484/6064/5618 +f 4483/6074/5619 5424/6075/5619 5966/6076/5619 5423/6077/5619 +f 5424/6075/5620 4461/5991/5620 5388/5990/5620 5966/6076/5620 +f 5966/6076/5621 5388/5990/5621 4459/5989/5621 5420/6067/5621 +f 5423/6077/5622 5966/6076/5622 5420/6067/5622 4485/6066/5622 +f 4460/5985/5623 5385/5984/5623 5967/6078/5623 5421/6071/5623 +f 5385/5984/5624 4462/5968/5624 5425/6079/5624 5967/6078/5624 +f 5967/6078/5625 5425/6079/5625 4480/6080/5625 5426/6081/5625 +f 5421/6071/5626 5967/6078/5626 5426/6081/5626 4482/6072/5626 +f 4481/6082/5627 5428/6083/5627 5968/6084/5627 5427/6085/5627 +f 5428/6083/5628 4463/5978/5628 5386/5987/5628 5968/6084/5628 +f 5968/6084/5629 5386/5987/5629 4461/5991/5629 5424/6075/5629 +f 5427/6085/5630 5968/6084/5630 5424/6075/5630 4483/6074/5630 +f 4462/5968/5631 5377/5971/5631 5969/6086/5631 5425/6079/5631 +f 5377/5971/5632 4464/5962/5632 5429/6087/5632 5969/6086/5632 +f 5969/6086/5633 5429/6087/5633 4478/6088/5633 5430/6089/5633 +f 5425/6079/5634 5969/6086/5634 5430/6089/5634 4480/6080/5634 +f 4479/6090/5635 5432/6091/5635 5970/6092/5635 5431/6093/5635 +f 5432/6091/5636 4465/5964/5636 5382/5979/5636 5970/6092/5636 +f 5970/6092/5637 5382/5979/5637 4463/5978/5637 5428/6083/5637 +f 5431/6093/5638 5970/6092/5638 5428/6083/5638 4481/6082/5638 +f 4464/5962/5639 5373/5961/5639 5971/6094/5639 5429/6087/5639 +f 5373/5961/5640 4442/5872/5640 5433/6095/5640 5971/6094/5640 +f 5971/6094/5641 5433/6095/5641 4498/6096/5641 5434/6097/5641 +f 5429/6087/5642 5971/6094/5642 5434/6097/5642 4478/6088/5642 +f 4499/6098/5643 5436/6099/5643 5972/6100/5643 5435/6101/5643 +f 5436/6099/5644 4443/5874/5644 5376/5965/5644 5972/6100/5644 +f 5972/6100/5645 5376/5965/5645 4465/5964/5645 5432/6091/5645 +f 5435/6101/5646 5972/6100/5646 5432/6091/5646 4479/6090/5646 +f 4452/5906/5647 5352/5915/5647 5973/6102/5647 5437/6103/5647 +f 5352/5915/5648 4440/5914/5648 5407/6043/5648 5973/6102/5648 +f 5973/6102/5649 5407/6043/5649 4500/6047/5649 5438/6104/5649 +f 5437/6103/5650 5973/6102/5650 5438/6104/5650 4488/6105/5650 +f 4501/6053/5651 5412/6052/5651 5974/6106/5651 5439/6107/5651 +f 5412/6052/5652 4441/5916/5652 5353/5919/5652 5974/6106/5652 +f 5974/6106/5653 5353/5919/5653 4453/5910/5653 5440/6108/5653 +f 5439/6107/5654 5974/6106/5654 5440/6108/5654 4489/6109/5654 +f 4450/5898/5655 5348/5907/5655 5975/6110/5655 5441/6111/5655 +f 5348/5907/5656 4452/5906/5656 5437/6103/5656 5975/6110/5656 +f 5975/6110/5657 5437/6103/5657 4488/6105/5657 5442/6112/5657 +f 5441/6111/5658 5975/6110/5658 5442/6112/5658 4490/6113/5658 +f 4489/6109/5659 5440/6108/5659 5976/6114/5659 5443/6115/5659 +f 5440/6108/5660 4453/5910/5660 5349/5908/5660 5976/6114/5660 +f 5976/6114/5661 5349/5908/5661 4451/5902/5661 5444/6116/5661 +f 5443/6115/5662 5976/6114/5662 5444/6116/5662 4491/6117/5662 +f 4448/5890/5663 5344/5899/5663 5977/6118/5663 5445/6119/5663 +f 5344/5899/5664 4450/5898/5664 5441/6111/5664 5977/6118/5664 +f 5977/6118/5665 5441/6111/5665 4490/6113/5665 5446/6120/5665 +f 5445/6119/5666 5977/6118/5666 5446/6120/5666 4492/6121/5666 +f 4491/6117/5667 5444/6116/5667 5978/6122/5667 5447/6123/5667 +f 5444/6116/5668 4451/5902/5668 5345/5900/5668 5978/6122/5668 +f 5978/6122/5669 5345/5900/5669 4449/5894/5669 5448/6124/5669 +f 5447/6123/5670 5978/6122/5670 5448/6124/5670 4493/6125/5670 +f 4446/5882/5671 5340/5891/5671 5979/6126/5671 5449/6127/5671 +f 5340/5891/5672 4448/5890/5672 5445/6119/5672 5979/6126/5672 +f 5979/6126/5673 5445/6119/5673 4492/6121/5673 5450/6128/5673 +f 5449/6127/5674 5979/6126/5674 5450/6128/5674 4494/6129/5674 +f 4493/6125/5675 5448/6124/5675 5980/6130/5675 5451/6131/5675 +f 5448/6124/5676 4449/5894/5676 5341/5892/5676 5980/6130/5676 +f 5980/6130/5677 5341/5892/5677 4447/5886/5677 5452/6132/5677 +f 5451/6131/5678 5980/6130/5678 5452/6132/5678 4495/6133/5678 +f 4444/5870/5679 5336/5883/5679 5981/6134/5679 5453/6135/5679 +f 5336/5883/5680 4446/5882/5680 5449/6127/5680 5981/6134/5680 +f 5981/6134/5681 5449/6127/5681 4494/6129/5681 5454/6136/5681 +f 5453/6135/5682 5981/6134/5682 5454/6136/5682 4496/6137/5682 +f 4495/6133/5683 5452/6132/5683 5982/6138/5683 5455/6139/5683 +f 5452/6132/5684 4447/5886/5684 5337/5884/5684 5982/6138/5684 +f 5982/6138/5685 5337/5884/5685 4445/5878/5685 5456/6140/5685 +f 5455/6139/5686 5982/6138/5686 5456/6140/5686 4497/6141/5686 +f 4442/5872/5687 5330/5871/5687 5983/6142/5687 5433/6095/5687 +f 5330/5871/5688 4444/5870/5688 5453/6135/5688 5983/6142/5688 +f 5983/6142/5689 5453/6135/5689 4496/6137/5689 5457/6143/5689 +f 5433/6095/5690 5983/6142/5690 5457/6143/5690 4498/6096/5690 +f 4497/6141/5691 5456/6140/5691 5984/6144/5691 5458/6145/5691 +f 5456/6140/5692 4445/5878/5692 5333/5875/5692 5984/6144/5692 +f 5984/6144/5693 5333/5875/5693 4443/5874/5693 5436/6099/5693 +f 5458/6145/5694 5984/6144/5694 5436/6099/5694 4499/6098/5694 +f 4482/6072/5695 5426/6081/5695 5985/6146/5695 5459/6147/5695 +f 5426/6081/5696 4480/6080/5696 5460/6148/5696 5985/6146/5696 +f 5985/6146/5697 5460/6148/5697 4504/6149/5697 5461/6150/5697 +f 5459/6147/5698 5985/6146/5698 5461/6150/5698 4502/6151/5698 +f 4505/6152/5699 5463/6153/5699 5986/6154/5699 5462/6155/5699 +f 5463/6153/5700 4481/6082/5700 5427/6085/5700 5986/6154/5700 +f 5986/6154/5701 5427/6085/5701 4483/6074/5701 5464/6156/5701 +f 5462/6155/5702 5986/6154/5702 5464/6156/5702 4503/6157/5702 +f 4502/6151/5703 5461/6150/5703 5987/6158/5703 5465/6159/5703 +f 5461/6150/5704 4504/6149/5704 5466/6160/5704 5987/6158/5704 +f 5987/6158/5705 5466/6160/5705 4506/6161/5705 5467/6162/5705 +f 5465/6159/5706 5987/6158/5706 5467/6162/5706 4508/6163/5706 +f 4507/6164/5707 5469/6165/5707 5988/6166/5707 5468/6167/5707 +f 5469/6165/5708 4505/6152/5708 5462/6155/5708 5988/6166/5708 +f 5988/6166/5709 5462/6155/5709 4503/6157/5709 5470/6168/5709 +f 5468/6167/5710 5988/6166/5710 5470/6168/5710 4509/6169/5710 +f 4508/6163/5711 5467/6162/5711 5989/6170/5711 5471/6171/5711 +f 5467/6162/5712 4506/6161/5712 5472/6172/5712 5989/6170/5712 +f 5989/6170/5713 5472/6172/5713 4512/6173/5713 5473/6174/5713 +f 5471/6171/5714 5989/6170/5714 5473/6174/5714 4510/6175/5714 +f 4513/6176/5715 5475/6177/5715 5990/6178/5715 5474/6179/5715 +f 5475/6177/5716 4507/6164/5716 5468/6167/5716 5990/6178/5716 +f 5990/6178/5717 5468/6167/5717 4509/6169/5717 5476/6180/5717 +f 5474/6179/5718 5990/6178/5718 5476/6180/5718 4511/6181/5718 +f 4510/6175/5719 5473/6174/5719 5991/6182/5719 5477/6183/5719 +f 5473/6174/5720 4512/6173/5720 5478/6184/5720 5991/6182/5720 +f 5991/6182/5721 5478/6184/5721 4514/6185/5721 5479/6186/5721 +f 5477/6183/5722 5991/6182/5722 5479/6186/5722 4516/6187/5722 +f 4515/6188/5723 5481/6189/5723 5992/6190/5723 5480/6191/5723 +f 5481/6189/5724 4513/6176/5724 5474/6179/5724 5992/6190/5724 +f 5992/6190/5725 5474/6179/5725 4511/6181/5725 5482/6192/5725 +f 5480/6191/5726 5992/6190/5726 5482/6192/5726 4517/6193/5726 +f 4488/6105/5727 5438/6104/5727 5993/6194/5727 5483/6195/5727 +f 5438/6104/5728 4500/6047/5728 5484/6196/5728 5993/6194/5728 +f 5993/6194/5729 5484/6196/5729 4510/6175/5729 5477/6183/5729 +f 5483/6195/5730 5993/6194/5730 5477/6183/5730 4516/6187/5730 +f 4511/6181/5731 5485/6197/5731 5994/6198/5731 5482/6192/5731 +f 5485/6197/5732 4501/6053/5732 5439/6107/5732 5994/6198/5732 +f 5994/6198/5733 5439/6107/5733 4489/6109/5733 5486/6199/5733 +f 5482/6192/5734 5994/6198/5734 5486/6199/5734 4517/6193/5734 +f 4476/6045/5735 5487/6200/5735 5995/6201/5735 5409/6046/5735 +f 5487/6200/5736 4508/6163/5736 5471/6171/5736 5995/6201/5736 +f 5995/6201/5737 5471/6171/5737 4510/6175/5737 5484/6196/5737 +f 5409/6046/5738 5995/6201/5738 5484/6196/5738 4500/6047/5738 +f 4511/6181/5739 5476/6180/5739 5996/6202/5739 5485/6197/5739 +f 5476/6180/5740 4509/6169/5740 5488/6203/5740 5996/6202/5740 +f 5996/6202/5741 5488/6203/5741 4477/6048/5741 5410/6051/5741 +f 5485/6197/5742 5996/6202/5742 5410/6051/5742 4501/6053/5742 +f 4476/6045/5743 5414/6057/5743 5997/6204/5743 5487/6200/5743 +f 5414/6057/5744 4486/6056/5744 5489/6205/5744 5997/6204/5744 +f 5997/6204/5745 5489/6205/5745 4502/6151/5745 5465/6159/5745 +f 5487/6200/5746 5997/6204/5746 5465/6159/5746 4508/6163/5746 +f 4503/6157/5747 5490/6206/5747 5998/6207/5747 5470/6168/5747 +f 5490/6206/5748 4487/6058/5748 5415/6061/5748 5998/6207/5748 +f 5998/6207/5749 5415/6061/5749 4477/6048/5749 5488/6203/5749 +f 5470/6168/5750 5998/6207/5750 5488/6203/5750 4509/6169/5750 +f 4482/6072/5751 5459/6147/5751 5999/6208/5751 5422/6073/5751 +f 5459/6147/5752 4502/6151/5752 5489/6205/5752 5999/6208/5752 +f 5999/6208/5753 5489/6205/5753 4486/6056/5753 5418/6065/5753 +f 5422/6073/5754 5999/6208/5754 5418/6065/5754 4484/6064/5754 +f 4487/6058/5755 5490/6206/5755 6000/6209/5755 5419/6069/5755 +f 5490/6206/5756 4503/6157/5756 5464/6156/5756 6000/6209/5756 +f 6000/6209/5757 5464/6156/5757 4483/6074/5757 5423/6077/5757 +f 5419/6069/5758 6000/6209/5758 5423/6077/5758 4485/6066/5758 +f 4478/6088/5759 5434/6097/5759 6001/6210/5759 5430/6089/5759 +f 5434/6097/5760 4498/6096/5760 5491/6211/5760 6001/6210/5760 +f 6001/6210/5761 5491/6211/5761 4504/6149/5761 5460/6148/5761 +f 5430/6089/5762 6001/6210/5762 5460/6148/5762 4480/6080/5762 +f 4505/6152/5763 5492/6212/5763 6002/6213/5763 5463/6153/5763 +f 5492/6212/5764 4499/6098/5764 5435/6101/5764 6002/6213/5764 +f 6002/6213/5765 5435/6101/5765 4479/6090/5765 5431/6093/5765 +f 5463/6153/5766 6002/6213/5766 5431/6093/5766 4481/6082/5766 +f 4496/6137/5767 5493/6214/5767 6003/6215/5767 5457/6143/5767 +f 5493/6214/5768 4506/6161/5768 5466/6160/5768 6003/6215/5768 +f 6003/6215/5769 5466/6160/5769 4504/6149/5769 5491/6211/5769 +f 5457/6143/5770 6003/6215/5770 5491/6211/5770 4498/6096/5770 +f 4505/6152/5771 5469/6165/5771 6004/6216/5771 5492/6212/5771 +f 5469/6165/5772 4507/6164/5772 5494/6217/5772 6004/6216/5772 +f 6004/6216/5773 5494/6217/5773 4497/6141/5773 5458/6145/5773 +f 5492/6212/5774 6004/6216/5774 5458/6145/5774 4499/6098/5774 +f 4494/6129/5775 5495/6218/5775 6005/6219/5775 5454/6136/5775 +f 5495/6218/5776 4512/6173/5776 5472/6172/5776 6005/6219/5776 +f 6005/6219/5777 5472/6172/5777 4506/6161/5777 5493/6214/5777 +f 5454/6136/5778 6005/6219/5778 5493/6214/5778 4496/6137/5778 +f 4507/6164/5779 5475/6177/5779 6006/6220/5779 5494/6217/5779 +f 5475/6177/5780 4513/6176/5780 5496/6221/5780 6006/6220/5780 +f 6006/6220/5781 5496/6221/5781 4495/6133/5781 5455/6139/5781 +f 5494/6217/5782 6006/6220/5782 5455/6139/5782 4497/6141/5782 +f 4492/6121/5783 5497/6222/5783 6007/6223/5783 5450/6128/5783 +f 5497/6222/5784 4514/6185/5784 5478/6184/5784 6007/6223/5784 +f 6007/6223/5785 5478/6184/5785 4512/6173/5785 5495/6218/5785 +f 5450/6128/5786 6007/6223/5786 5495/6218/5786 4494/6129/5786 +f 4513/6176/5787 5481/6189/5787 6008/6224/5787 5496/6221/5787 +f 5481/6189/5788 4515/6188/5788 5498/6225/5788 6008/6224/5788 +f 6008/6224/5789 5498/6225/5789 4493/6125/5789 5451/6131/5789 +f 5496/6221/5790 6008/6224/5790 5451/6131/5790 4495/6133/5790 +f 4490/6113/5791 5499/6226/5791 6009/6227/5791 5446/6120/5791 +f 5499/6226/5792 4516/6187/5792 5479/6186/5792 6009/6227/5792 +f 6009/6227/5793 5479/6186/5793 4514/6185/5793 5497/6222/5793 +f 5446/6120/5794 6009/6227/5794 5497/6222/5794 4492/6121/5794 +f 4515/6188/5795 5480/6191/5795 6010/6228/5795 5498/6225/5795 +f 5480/6191/5796 4517/6193/5796 5500/6229/5796 6010/6228/5796 +f 6010/6228/5797 5500/6229/5797 4491/6117/5797 5447/6123/5797 +f 5498/6225/5798 6010/6228/5798 5447/6123/5798 4493/6125/5798 +f 4488/6105/5799 5483/6195/5799 6011/6230/5799 5442/6112/5799 +f 4516/6187/5800 5499/6226/5800 6011/6230/5800 5483/6195/5800 +f 4490/6113/5801 5442/6112/5801 6011/6230/5801 5499/6226/5801 +f 4491/6117/5802 5500/6229/5802 6012/6231/5802 5443/6115/5802 +f 4517/6193/5803 5486/6199/5803 6012/6231/5803 5500/6229/5803 +f 4489/6109/5804 5443/6115/5804 6012/6231/5804 5486/6199/5804 +f 4416/5849/5805 5323/5857/5805 6013/6232/5805 5501/6233/5805 +f 5323/5857/5806 4414/5861/5806 5502/6234/5806 6013/6232/5806 +f 6013/6232/5807 5502/6234/5807 4528/6235/5807 5503/6236/5807 +f 5501/6233/5808 6013/6232/5808 5503/6236/5808 4526/6237/5808 +f 4529/6238/5809 5505/6239/5809 6014/6240/5809 5504/6241/5809 +f 5505/6239/5810 4415/5867/5810 5328/5866/5810 6014/6240/5810 +f 6014/6240/5811 5328/5866/5811 4417/5855/5811 5506/6242/5811 +f 5504/6241/5812 6014/6240/5812 5506/6242/5812 4527/6243/5812 +f 4418/5837/5813 5317/5845/5813 6015/6244/5813 5507/6245/5813 +f 5317/5845/5814 4416/5849/5814 5501/6233/5814 6015/6244/5814 +f 6015/6244/5815 5501/6233/5815 4526/6237/5815 5508/6246/5815 +f 5507/6245/5816 6015/6244/5816 5508/6246/5816 4524/6247/5816 +f 4527/6243/5817 5506/6242/5817 6016/6248/5817 5509/6249/5817 +f 5506/6242/5818 4417/5855/5818 5322/5854/5818 6016/6248/5818 +f 6016/6248/5819 5322/5854/5819 4419/5843/5819 5510/6250/5819 +f 5509/6249/5820 6016/6248/5820 5510/6250/5820 4525/6251/5820 +f 4420/5825/5821 5311/5833/5821 6017/6252/5821 5511/6253/5821 +f 5311/5833/5822 4418/5837/5822 5507/6245/5822 6017/6252/5822 +f 6017/6252/5823 5507/6245/5823 4524/6247/5823 5512/6254/5823 +f 5511/6253/5824 6017/6252/5824 5512/6254/5824 4522/6255/5824 +f 4525/6251/5825 5510/6250/5825 6018/6256/5825 5513/6257/5825 +f 5510/6250/5826 4419/5843/5826 5316/5842/5826 6018/6256/5826 +f 6018/6256/5827 5316/5842/5827 4421/5831/5827 5514/6258/5827 +f 5513/6257/5828 6018/6256/5828 5514/6258/5828 4523/6259/5828 +f 4422/6260/5829 5305/6261/5829 6019/6262/5829 5515/6263/5829 +f 5305/6261/5830 4420/5825/5830 5511/6253/5830 6019/6262/5830 +f 6019/6262/5831 5511/6253/5831 4522/6255/5831 5516/6264/5831 +f 5515/6263/5832 6019/6262/5832 5516/6264/5832 4520/6265/5832 +f 4523/6259/5833 5514/6258/5833 6020/6266/5833 5517/6267/5833 +f 5514/6258/5834 4421/5831/5834 5310/6268/5834 6020/6266/5834 +f 6020/6266/5835 5310/6268/5835 4423/6269/5835 5518/6270/5835 +f 5517/6267/5836 6020/6266/5836 5518/6270/5836 4521/6271/5836 +f 4424/6272/5837 5299/6273/5837 6021/6274/5837 5519/6275/5837 +f 5299/6273/5838 4422/6260/5838 5515/6263/5838 6021/6274/5838 +f 6021/6274/5839 5515/6263/5839 4520/6265/5839 5520/6276/5839 +f 5519/6275/5840 6021/6274/5840 5520/6276/5840 4518/6277/5840 +f 4521/6271/5841 5518/6270/5841 6022/6278/5841 5521/6279/5841 +f 5518/6270/5842 4423/6269/5842 5304/6280/5842 6022/6278/5842 +f 6022/6278/5843 5304/6280/5843 4425/6281/5843 5522/6282/5843 +f 5521/6279/5844 6022/6278/5844 5522/6282/5844 4519/6283/5844 +f 4412/6284/5845 5292/6285/5845 6023/6286/5845 5523/6287/5845 +f 5292/6285/5846 4424/6272/5846 5519/6275/5846 6023/6286/5846 +f 6023/6286/5847 5519/6275/5847 4518/6277/5847 5524/6288/5847 +f 5523/6287/5848 6023/6286/5848 5524/6288/5848 4530/6289/5848 +f 4519/6283/5849 5522/6282/5849 6024/6290/5849 5525/6291/5849 +f 5522/6282/5850 4425/6281/5850 5297/6292/5850 6024/6290/5850 +f 6024/6290/5851 5297/6292/5851 4413/6293/5851 5526/6294/5851 +f 5525/6291/5852 6024/6290/5852 5526/6294/5852 4531/6295/5852 +f 4518/6277/5853 5527/6296/5853 6025/6297/5853 5524/6288/5853 +f 5527/6296/5854 4526/6237/5854 5503/6236/5854 6025/6297/5854 +f 6025/6297/5855 5503/6236/5855 4528/6235/5855 5528/6298/5855 +f 5524/6288/5856 6025/6297/5856 5528/6298/5856 4530/6289/5856 +f 4529/6238/5857 5504/6241/5857 6026/6299/5857 5529/6300/5857 +f 5504/6241/5858 4527/6243/5858 5530/6301/5858 6026/6299/5858 +f 6026/6299/5859 5530/6301/5859 4519/6283/5859 5525/6291/5859 +f 5529/6300/5860 6026/6299/5860 5525/6291/5860 4531/6295/5860 +f 4518/6277/5861 5520/6276/5861 6027/6302/5861 5527/6296/5861 +f 5520/6276/5862 4520/6265/5862 5531/6303/5862 6027/6302/5862 +f 6027/6302/5863 5531/6303/5863 4524/6247/5863 5508/6246/5863 +f 5527/6296/5864 6027/6302/5864 5508/6246/5864 4526/6237/5864 +f 4525/6251/5865 5532/6304/5865 6028/6305/5865 5509/6249/5865 +f 5532/6304/5866 4521/6271/5866 5521/6279/5866 6028/6305/5866 +f 6028/6305/5867 5521/6279/5867 4519/6283/5867 5530/6301/5867 +f 5509/6249/5868 6028/6305/5868 5530/6301/5868 4527/6243/5868 +f 4520/6265/5869 5516/6264/5869 6029/6306/5869 5531/6303/5869 +f 4522/6255/5870 5512/6254/5870 6029/6306/5870 5516/6264/5870 +f 4524/6247/5871 5531/6303/5871 6029/6306/5871 5512/6254/5871 +f 4525/6251/5872 5513/6257/5872 6030/6307/5872 5532/6304/5872 +f 4523/6259/5873 5517/6267/5873 6030/6307/5873 5513/6257/5873 +f 4521/6271/5874 5532/6304/5874 6030/6307/5874 5517/6267/5874 +f 4338/5624/5875 5257/5723/5875 6031/6308/5875 5533/6309/5875 +f 5257/5723/5876 4406/5716/5876 5367/6310/5876 6031/6308/5876 +f 6031/6308/5877 5367/6310/5877 4412/6311/5877 5523/6312/5877 +f 5533/6309/5878 6031/6308/5878 5523/6312/5878 4530/6313/5878 +f 4413/6293/5879 5372/6314/5879 6032/6315/5879 5526/6294/5879 +f 5372/6314/5880 4407/6316/5880 5258/6317/5880 6032/6315/5880 +f 6032/6315/5881 5258/6317/5881 4339/6318/5881 5534/6319/5881 +f 5526/6294/5882 6032/6315/5882 5534/6319/5882 4531/6295/5882 +f 4338/6320/5883 5533/6321/5883 6033/6322/5883 5277/6323/5883 +f 5533/6321/5884 4530/6289/5884 5528/6298/5884 6033/6322/5884 +f 6033/6322/5885 5528/6298/5885 4528/6235/5885 5535/6324/5885 +f 5277/6323/5886 6033/6322/5886 5535/6324/5886 4346/6325/5886 +f 4529/6238/5887 5529/6300/5887 6034/6326/5887 5536/6327/5887 +f 5529/6300/5888 4531/6295/5888 5534/6319/5888 6034/6326/5888 +f 6034/6326/5889 5534/6319/5889 4339/6318/5889 5282/6328/5889 +f 5536/6327/5890 6034/6326/5890 5282/6328/5890 4347/6329/5890 +f 4344/5932/5891 5285/6330/5891 6035/6331/5891 5361/5933/5891 +f 5285/6330/5892 4346/6325/5892 5535/6324/5892 6035/6331/5892 +f 6035/6331/5893 5535/6324/5893 4528/6235/5893 5502/6234/5893 +f 5361/5933/5894 6035/6331/5894 5502/6234/5894 4414/5861/5894 +f 4529/6238/5895 5536/6327/5895 6036/6332/5895 5505/6239/5895 +f 5536/6327/5896 4347/6329/5896 5288/6333/5896 6036/6332/5896 +f 6036/6332/5897 5288/6333/5897 4345/5941/5897 5364/5940/5897 +f 5505/6239/5898 6036/6332/5898 5364/5940/5898 4415/5867/5898 +g SharpInterior_Suzanne.006 +v 4.938843 0.160767 0.759033 +v 4.061157 0.160767 0.759033 +v 4.987305 0.108154 0.685547 +v 4.012695 0.108154 0.685547 +v 5.032227 0.068359 0.581055 +v 3.967773 0.068359 0.581055 +v 4.851562 -0.003906 0.616211 +v 4.148438 -0.003906 0.616211 +v 4.851685 0.052246 0.713013 +v 4.148315 0.052246 0.713013 +v 4.852417 0.127197 0.776123 +v 4.147583 0.127197 0.776123 +v 4.770142 0.160767 0.790894 +v 4.229858 0.160767 0.790894 +v 4.716675 0.108154 0.734497 +v 4.283325 0.108154 0.734497 +v 4.670898 0.068359 0.645508 +v 4.329102 0.068359 0.645508 +v 4.597656 0.243164 0.654297 +v 4.402344 0.243164 0.654297 +v 4.660645 0.242432 0.738037 +v 4.339355 0.242432 0.738037 +v 4.736572 0.243042 0.792969 +v 4.263428 0.243042 0.792969 +v 4.770142 0.329590 0.790894 +v 4.229858 0.329590 0.790894 +v 4.716675 0.377930 0.734497 +v 4.283325 0.377930 0.734497 +v 4.670898 0.422852 0.645508 +v 4.329102 0.422852 0.645508 +v 4.851562 0.496094 0.616211 +v 4.148438 0.496094 0.616211 +v 4.851685 0.434082 0.713013 +v 4.148315 0.434082 0.713013 +v 4.852417 0.364014 0.776123 +v 4.147583 0.364014 0.776123 +v 4.938843 0.329590 0.759033 +v 4.061157 0.329590 0.759033 +v 4.987305 0.377930 0.685547 +v 4.012695 0.377930 0.685547 +v 5.032227 0.422852 0.581055 +v 3.967773 0.422852 0.581055 +v 5.105469 0.243164 0.566406 +v 3.894531 0.243164 0.566406 +v 5.043457 0.242432 0.672607 +v 3.956543 0.242432 0.672607 +v 4.972656 0.243042 0.751221 +v 4.027344 0.243042 0.751221 +v 4.955404 0.243083 0.778971 +v 4.044596 0.243083 0.778971 +v 4.927531 0.318929 0.785848 +v 4.072469 0.318929 0.785848 +v 4.852458 0.350505 0.803426 +v 4.147542 0.350505 0.803426 +v 4.780924 0.318929 0.816406 +v 4.219076 0.318929 0.816406 +v 4.750244 0.243083 0.818197 +v 4.249756 0.243083 0.818197 +v 4.780924 0.171549 0.816406 +v 4.219076 0.171549 0.816406 +v 4.851969 0.242798 0.822428 +v 4.148031 0.242798 0.822428 +v 4.852458 0.140869 0.803426 +v 4.147542 0.140869 0.803426 +v 4.927531 0.171549 0.785848 +v 4.072469 0.171549 0.785848 +v 4.500000 0.432861 0.736816 +v 4.500000 0.352431 0.809679 +v 4.500000 -0.661133 0.736328 +v 4.500000 -0.306152 0.779297 +v 4.500000 -0.175293 0.791260 +v 4.500000 -0.765137 0.714600 +v 4.500000 0.439046 0.617676 +v 4.500000 0.566551 0.546875 +v 4.500000 0.855713 -0.490723 +v 4.500000 0.518066 -0.772461 +v 4.500000 0.093262 -0.771973 +v 4.500000 -0.352295 -0.304688 +v 4.726929 -0.177246 0.577515 +v 4.273071 -0.177246 0.577515 +v 4.788696 -0.443359 0.565674 +v 4.211304 -0.443359 0.565674 +v 4.823975 -0.664795 0.558960 +v 4.176025 -0.664795 0.558960 +v 4.838867 -0.845703 0.532471 +v 4.161133 -0.845703 0.532471 +v 4.802368 -0.930664 0.526001 +v 4.197632 -0.930664 0.526001 +v 4.671387 -0.960205 0.548950 +v 4.328613 -0.960205 0.548950 +v 4.500000 -0.974121 0.565918 +v 4.927002 -0.116943 0.545776 +v 4.072998 -0.116943 0.545776 +v 5.125366 -0.012573 0.525269 +v 3.874634 -0.012573 0.525269 +v 5.289429 0.167603 0.481934 +v 3.710571 0.167603 0.481934 +v 5.316772 0.393555 0.573364 +v 3.683228 0.393555 0.573364 +v 5.193237 0.479858 0.624512 +v 3.806763 0.479858 0.624512 +v 4.991455 0.592407 0.682251 +v 4.008545 0.592407 0.682251 +v 4.822388 0.711792 0.726685 +v 4.177612 0.711792 0.726685 +v 4.674561 0.676270 0.748169 +v 4.325439 0.676270 0.748169 +v 4.575806 0.499878 0.743896 +v 4.424194 0.499878 0.743896 +v 4.666992 0.407227 0.780640 +v 4.333008 0.407227 0.780640 +v 4.622559 0.310059 0.773926 +v 4.377441 0.310059 0.773926 +v 4.712769 0.071533 0.748657 +v 4.287231 0.071533 0.748657 +v 4.871216 0.027466 0.706543 +v 4.128784 0.027466 0.706543 +v 5.005615 0.075317 0.672729 +v 3.994385 0.075317 0.672729 +v 5.117920 0.189331 0.650635 +v 3.882080 0.189331 0.650635 +v 5.139771 0.300171 0.656006 +v 3.860229 0.300171 0.656006 +v 5.090088 0.376709 0.680542 +v 3.909912 0.376709 0.680542 +v 4.939087 0.443237 0.730469 +v 4.060913 0.443237 0.730469 +v 4.746460 0.473877 0.770996 +v 4.253540 0.473877 0.770996 +v 4.500000 -0.746338 0.732666 +v 4.612500 -0.737188 0.726406 +v 4.387500 -0.737188 0.726406 +v 4.621704 -0.835449 0.702271 +v 4.378296 -0.835449 0.702271 +v 4.571045 -0.882446 0.687744 +v 4.428955 -0.882446 0.687744 +v 4.500000 -0.893311 0.682861 +v 4.500000 -0.163086 0.768555 +v 4.500000 -0.134440 0.747396 +v 4.596069 -0.148438 0.753906 +v 4.403931 -0.148438 0.753906 +v 4.623657 -0.225220 0.750610 +v 4.376343 -0.225220 0.750610 +v 4.589531 -0.299844 0.743984 +v 4.410469 -0.299844 0.743984 +v 4.893799 -0.043579 0.667725 +v 4.106201 -0.043579 0.667725 +v 5.093506 0.050903 0.620850 +v 3.906494 0.050903 0.620850 +v 5.213379 0.197754 0.599365 +v 3.786621 0.197754 0.599365 +v 5.233887 0.355591 0.647339 +v 3.766113 0.355591 0.647339 +v 5.158203 0.427490 0.707153 +v 3.841797 0.427490 0.707153 +v 4.956909 0.536621 0.769775 +v 4.043091 0.536621 0.769775 +v 4.817383 0.619995 0.808838 +v 4.182617 0.619995 0.808838 +v 4.704834 0.592285 0.825439 +v 4.295166 0.592285 0.825439 +v 4.605713 0.447510 0.821411 +v 4.394287 0.447510 0.821411 +v 4.642416 -0.096300 0.776693 +v 4.357584 -0.096300 0.776693 +v 4.708252 -0.459473 0.695435 +v 4.291748 -0.459473 0.695435 +v 4.742798 -0.682739 0.678345 +v 4.257202 -0.682739 0.678345 +v 4.753784 -0.813354 0.655640 +v 4.246216 -0.813354 0.655640 +v 4.725098 -0.899292 0.632568 +v 4.274902 -0.899292 0.632568 +v 4.643921 -0.927979 0.631592 +v 4.356079 -0.927979 0.631592 +v 4.500000 -0.939697 0.636719 +v 4.500000 0.041558 0.738824 +v 4.500000 0.209473 0.765137 +v 4.829956 0.484375 0.755249 +v 4.170044 0.484375 0.755249 +v 4.649536 0.133545 0.752197 +v 4.350464 0.133545 0.752197 +v 4.623657 0.213989 0.761841 +v 4.376343 0.213989 0.761841 +v 4.614380 -0.664185 0.730225 +v 4.385620 -0.664185 0.730225 +v 4.589478 -0.457153 0.742188 +v 4.410522 -0.457153 0.742188 +v 4.500000 -0.458984 0.747070 +v 4.500000 -0.333008 0.748047 +v 4.584229 -0.272339 0.781250 +v 4.415771 -0.272339 0.781250 +v 4.621338 -0.221191 0.791138 +v 4.378662 -0.221191 0.791138 +v 4.600342 -0.147827 0.782104 +v 4.399658 -0.147827 0.782104 +v 4.539673 -0.138428 0.782104 +v 4.460327 -0.138428 0.782104 +v 4.500000 -0.202365 0.823351 +v 4.547743 -0.157769 0.809028 +v 4.452257 -0.157769 0.809028 +v 4.588108 -0.165148 0.809028 +v 4.411892 -0.165148 0.809028 +v 4.593994 -0.218994 0.819458 +v 4.406006 -0.218994 0.819458 +v 4.570096 -0.256510 0.804471 +v 4.429904 -0.256510 0.804471 +v 4.500000 -0.274170 0.804688 +v 4.746460 -0.315674 0.560303 +v 4.253540 -0.315674 0.560303 +v 4.664673 -0.234375 0.705688 +v 4.335327 -0.234375 0.705688 +v 4.680176 -0.317871 0.695801 +v 4.319824 -0.317871 0.695801 +v 4.721558 -0.244995 0.565674 +v 4.278442 -0.244995 0.565674 +v 4.500000 -0.873047 0.680908 +v 4.548706 -0.862427 0.684082 +v 4.451294 -0.862427 0.684082 +v 4.590576 -0.816895 0.701782 +v 4.409424 -0.816895 0.701782 +v 4.583862 -0.754517 0.716675 +v 4.416138 -0.754517 0.716675 +v 4.500000 -0.782959 0.662842 +v 4.577393 -0.771606 0.664876 +v 4.422607 -0.771606 0.664876 +v 4.584201 -0.809245 0.658782 +v 4.415799 -0.809245 0.658782 +v 4.551025 -0.838623 0.644246 +v 4.448975 -0.838623 0.644246 +v 4.500000 -0.848877 0.642822 +v 4.672607 0.220825 0.773804 +v 4.327393 0.220825 0.773804 +v 4.689331 0.158203 0.769165 +v 4.310669 0.158203 0.769165 +v 4.837891 0.427856 0.757935 +v 4.162109 0.427856 0.757935 +v 4.771484 0.419922 0.769409 +v 4.228516 0.419922 0.769409 +v 4.928711 0.399902 0.753296 +v 4.071289 0.399902 0.753296 +v 5.048950 0.350830 0.697632 +v 3.951050 0.350830 0.697632 +v 5.084595 0.285400 0.681030 +v 3.915405 0.285400 0.681030 +v 5.068237 0.195679 0.680054 +v 3.931763 0.195679 0.680054 +v 4.976807 0.105957 0.709473 +v 4.023193 0.105957 0.709473 +v 4.869019 0.070679 0.737061 +v 4.130981 0.070679 0.737061 +v 4.739380 0.109009 0.767944 +v 4.260620 0.109009 0.767944 +v 4.678345 0.297974 0.776245 +v 4.321655 0.297974 0.776245 +v 4.711792 0.373779 0.776367 +v 4.288208 0.373779 0.776367 +v 4.735352 0.356445 0.758789 +v 4.264648 0.356445 0.758789 +v 4.700195 0.295898 0.756836 +v 4.299805 0.295898 0.756836 +v 4.753906 0.125977 0.752930 +v 4.246094 0.125977 0.752930 +v 4.869141 0.094727 0.727539 +v 4.130859 0.094727 0.727539 +v 4.960938 0.125000 0.702148 +v 4.039062 0.125000 0.702148 +v 5.037109 0.208008 0.675781 +v 3.962891 0.208008 0.675781 +v 5.050781 0.279297 0.672852 +v 3.949219 0.279297 0.672852 +v 5.019531 0.335938 0.687500 +v 3.980469 0.335938 0.687500 +v 4.918945 0.385742 0.741211 +v 4.081055 0.385742 0.741211 +v 4.782227 0.394531 0.762695 +v 4.217773 0.394531 0.762695 +v 4.838867 0.403320 0.751953 +v 4.161133 0.403320 0.751953 +v 4.707031 0.172852 0.750977 +v 4.292969 0.172852 0.750977 +v 4.696289 0.228516 0.750977 +v 4.303711 0.228516 0.750977 +v 4.625521 0.489245 0.612891 +v 4.374479 0.489245 0.612891 +v 4.705729 0.638021 0.640625 +v 4.294271 0.638021 0.640625 +v 4.827691 0.665365 0.622179 +v 4.172309 0.665365 0.622179 +v 4.958125 0.553438 0.557578 +v 4.041875 0.553438 0.557578 +v 5.168091 0.463501 0.489014 +v 3.831909 0.463501 0.489014 +v 5.280396 0.385376 0.449707 +v 3.719604 0.385376 0.449707 +v 5.269775 0.177979 0.363892 +v 3.730225 0.177979 0.363892 +v 5.119507 -0.000366 0.387573 +v 3.880493 -0.000366 0.387573 +v 4.916667 -0.110781 0.449245 +v 4.083333 -0.110781 0.449245 +v 4.500000 0.856201 0.263916 +v 4.500000 0.950195 -0.085938 +v 4.500000 -0.175049 -0.618652 +v 4.500000 -0.436523 0.129395 +v 4.500000 -0.948242 0.456543 +v 4.500000 -0.786133 0.360352 +v 4.500000 -0.579346 0.325684 +v 4.500000 -0.475830 0.270508 +v 5.314697 0.226074 0.114136 +v 3.685303 0.226074 0.114136 +v 5.336329 0.300938 -0.049844 +v 3.663672 0.300938 -0.049844 +v 5.262813 0.282891 -0.418750 +v 3.737187 0.282891 -0.418750 +v 4.908691 0.442139 -0.665405 +v 4.091309 0.442139 -0.665405 +v 5.200313 -0.032500 0.072813 +v 3.799687 -0.032500 0.072812 +v 5.116094 -0.109531 -0.167969 +v 3.883906 -0.109531 -0.167969 +v 5.149780 0.005127 -0.400513 +v 3.850220 0.005127 -0.400513 +v 4.825521 0.077148 -0.660970 +v 4.174479 0.077148 -0.660970 +v 4.736694 -0.381104 0.408813 +v 4.263306 -0.381104 0.408813 +v 4.661865 -0.426758 0.279297 +v 4.338135 -0.426758 0.279297 +v 4.779541 -0.735840 0.403076 +v 4.220459 -0.735840 0.403076 +v 4.750000 -0.535645 0.407837 +v 4.250000 -0.535645 0.407837 +v 4.786024 -0.887153 0.430339 +v 4.213976 -0.887153 0.430339 +v 4.642334 -0.753784 0.373901 +v 4.357666 -0.753784 0.373901 +v 4.631958 -0.550171 0.349487 +v 4.368042 -0.550171 0.349487 +v 4.662720 -0.924683 0.441650 +v 4.337280 -0.924683 0.441650 +v 4.735833 -0.284766 0.404818 +v 4.264167 -0.284766 0.404818 +v 4.739176 -0.215210 0.474040 +v 4.260824 -0.215210 0.474040 +v 4.753110 -0.171658 0.501808 +v 4.246890 -0.171658 0.501808 +v 4.712630 -0.369297 0.155833 +v 4.287370 -0.369297 0.155833 +v 4.773193 -0.293091 -0.251099 +v 4.226807 -0.293091 -0.251099 +v 4.810873 -0.132080 -0.535482 +v 4.189127 -0.132080 -0.535482 +v 4.920288 0.804932 -0.407593 +v 4.079712 0.804932 -0.407593 +v 4.919922 0.896362 -0.089233 +v 4.080078 0.896362 -0.089233 +v 4.920532 0.808472 0.206787 +v 4.079468 0.808472 0.206787 +v 4.928833 0.561523 0.418091 +v 4.071167 0.561523 0.418091 +v 5.243408 0.409424 0.289062 +v 3.756592 0.409424 0.289062 +v 5.130615 0.487549 0.302734 +v 3.869385 0.487549 0.302734 +v 5.135010 0.679565 0.081543 +v 3.864990 0.679565 0.081543 +v 5.277710 0.535889 0.090576 +v 3.722290 0.535889 0.090576 +v 5.280151 0.582275 -0.138916 +v 3.719849 0.582275 -0.138916 +v 5.136719 0.740601 -0.170044 +v 3.863281 0.740601 -0.170044 +v 5.134277 0.650391 -0.414062 +v 3.865723 0.650391 -0.414062 +v 5.258246 0.524089 -0.343750 +v 3.741754 0.524089 -0.343750 +v 5.103149 0.339111 -0.558228 +v 3.896851 0.339111 -0.558228 +v 4.982005 0.019531 -0.522786 +v 4.017995 0.019531 -0.522786 +v 5.324766 0.347656 -0.205313 +v 3.675234 0.347656 -0.205313 +v 4.905755 -0.181641 0.158802 +v 4.094245 -0.181641 0.158802 +v 4.938843 -0.174072 -0.207764 +v 4.061157 -0.174072 -0.207764 +v 5.397949 0.395508 -0.258789 +v 3.602051 0.395508 -0.258789 +v 5.293335 -0.121094 -0.181519 +v 3.706665 -0.121094 -0.181519 +v 5.535889 -0.077881 -0.333130 +v 3.464111 -0.077881 -0.333130 +v 5.754883 0.070923 -0.426514 +v 3.245117 0.070923 -0.426514 +v 5.820435 0.304077 -0.431396 +v 3.179565 0.304077 -0.431396 +v 5.718506 0.467773 -0.420288 +v 3.281494 0.467773 -0.420288 +v 5.531982 0.459351 -0.333862 +v 3.468018 0.459351 -0.333862 +v 5.527222 0.409180 -0.304321 +v 3.472778 0.409180 -0.304321 +v 5.679810 0.415039 -0.389526 +v 3.320190 0.415039 -0.389526 +v 5.755371 0.280273 -0.411621 +v 3.244629 0.280273 -0.411621 +v 5.700806 0.088623 -0.401611 +v 3.299194 0.088623 -0.401611 +v 5.530518 -0.031006 -0.306030 +v 3.469482 -0.031006 -0.306030 +v 5.339600 -0.064575 -0.168579 +v 3.660400 -0.064575 -0.168579 +v 5.423706 0.356445 -0.236816 +v 3.576294 0.356445 -0.236816 +v 5.446167 0.306885 -0.293213 +v 3.553833 0.306885 -0.293213 +v 5.386963 -0.023926 -0.235107 +v 3.613037 -0.023926 -0.235107 +v 5.537964 0.004150 -0.356323 +v 3.462036 0.004150 -0.356323 +v 5.680054 0.099243 -0.435547 +v 3.319946 0.099243 -0.435547 +v 5.727051 0.247681 -0.445068 +v 3.272949 0.247681 -0.445068 +v 5.665039 0.350952 -0.428589 +v 3.334961 0.350952 -0.428589 +v 5.533203 0.347534 -0.358643 +v 3.466797 0.347534 -0.358643 +v 5.351318 0.287598 -0.216064 +v 3.648682 0.287598 -0.216064 +v 5.328857 0.173584 -0.270386 +v 3.671143 0.173584 -0.270386 +v 5.272461 0.096680 -0.270264 +v 3.727539 0.096680 -0.270264 +v 5.311632 0.071181 -0.281467 +v 3.688368 0.071181 -0.281467 +v 5.323608 0.022583 -0.269653 +v 3.676392 0.022583 -0.269653 +v 5.313721 -0.013672 -0.259521 +v 3.686279 -0.013672 -0.259521 +v 5.239176 0.032064 -0.078288 +v 3.760823 0.032064 -0.078288 +v 5.227526 -0.027448 -0.168229 +v 3.772474 -0.027448 -0.168229 +v 5.238307 0.048411 -0.191979 +v 3.761693 0.048411 -0.191979 +v 5.303589 0.201538 -0.198730 +v 3.696411 0.201538 -0.198730 +v 5.385498 0.245972 -0.269043 +v 3.614502 0.245972 -0.269043 +v 5.400635 0.226685 -0.320068 +v 3.599365 0.226685 -0.320068 +v 5.337023 -0.007595 -0.299479 +v 3.662977 -0.007595 -0.299479 +v 5.353027 0.024536 -0.315186 +v 3.646973 0.024536 -0.315186 +v 5.330688 0.077881 -0.315430 +v 3.669312 0.077881 -0.315430 +v 5.294705 0.106554 -0.310113 +v 3.705295 0.106554 -0.310113 +v 5.345459 0.162964 -0.315552 +v 3.654541 0.162964 -0.315552 +v 5.549113 0.320719 -0.404785 +v 3.450887 0.320719 -0.404785 +v 5.664835 0.323649 -0.460449 +v 3.335165 0.323649 -0.460449 +v 5.722412 0.234009 -0.471924 +v 3.277588 0.234009 -0.471924 +v 5.675903 0.106567 -0.460327 +v 3.324097 0.106567 -0.460327 +v 5.539795 0.023315 -0.397949 +v 3.460205 0.023315 -0.397949 +v 5.399414 -0.004639 -0.291016 +v 3.600586 -0.004639 -0.291016 +v 5.462769 0.281982 -0.345825 +v 3.537231 0.281982 -0.345825 +v 5.390503 0.114258 -0.329834 +v 3.609497 0.114258 -0.329834 +v 5.424194 0.060791 -0.331177 +v 3.575806 0.060791 -0.331177 +v 5.500000 0.116333 -0.369141 +v 3.500000 0.116333 -0.369141 +v 5.455688 0.173706 -0.349731 +v 3.544312 0.173706 -0.349731 +v 5.514526 0.232300 -0.371948 +v 3.485474 0.232300 -0.371948 +v 5.567749 0.177734 -0.392822 +v 3.432251 0.177734 -0.392822 +v 5.623481 0.223524 -0.411024 +v 3.376519 0.223524 -0.411024 +v 5.587077 0.274699 -0.401489 +v 3.412923 0.274699 -0.401489 +v 5.532837 0.375732 -0.458740 +v 3.467163 0.375732 -0.458740 +v 5.739827 0.400635 -0.516642 +v 3.260173 0.400635 -0.516642 +v 5.828269 0.287543 -0.496600 +v 3.171731 0.287543 -0.496600 +v 5.774983 0.114136 -0.510905 +v 3.225016 0.114136 -0.510905 +v 5.539917 -0.011475 -0.456787 +v 3.460083 -0.011475 -0.456787 +v 5.307983 -0.048950 -0.340698 +v 3.692017 -0.048950 -0.340698 +v 5.364380 0.318726 -0.376953 +v 3.635620 0.318726 -0.376953 +v 5.003906 0.242676 0.717773 +v 4.963867 0.198242 0.753418 +v 4.959961 0.137207 0.728027 +v 5.028320 0.169922 0.676270 +v 3.971680 0.169922 0.676270 +v 4.040039 0.137207 0.728027 +v 4.036133 0.198242 0.753418 +v 3.996094 0.242676 0.717773 +v 5.076172 0.242676 0.621094 +v 5.010742 0.086426 0.635254 +v 5.085938 0.148438 0.570312 +v 3.914062 0.148438 0.570312 +v 3.989258 0.086426 0.635254 +v 3.923828 0.242676 0.621094 +v 4.924805 0.067383 0.698730 +v 4.851562 0.021484 0.666992 +v 4.949219 0.015625 0.597656 +v 4.050781 0.015625 0.597656 +v 4.148438 0.021484 0.666992 +v 4.075195 0.067383 0.698730 +v 4.898926 0.136230 0.767090 +v 4.852051 0.093750 0.749512 +v 4.147949 0.093750 0.749512 +v 4.101074 0.136230 0.767090 +v 4.807617 0.136230 0.784668 +v 4.746582 0.137207 0.767090 +v 4.778809 0.067383 0.725586 +v 4.221191 0.067383 0.725586 +v 4.253418 0.137207 0.767090 +v 4.192383 0.136230 0.784668 +v 4.692383 0.086426 0.692383 +v 4.753906 0.015625 0.632812 +v 4.246094 0.015625 0.632812 +v 4.307617 0.086426 0.692383 +v 4.675781 0.169922 0.737793 +v 4.626953 0.242676 0.698242 +v 4.617188 0.148438 0.652344 +v 4.382812 0.148438 0.652344 +v 4.373047 0.242676 0.698242 +v 4.324219 0.169922 0.737793 +v 4.745605 0.198242 0.792969 +v 4.703125 0.242676 0.769531 +v 4.296875 0.242676 0.769531 +v 4.254395 0.198242 0.792969 +v 4.745605 0.289551 0.792969 +v 4.746582 0.350586 0.767090 +v 4.675781 0.315430 0.737793 +v 4.324219 0.315430 0.737793 +v 4.253418 0.350586 0.767090 +v 4.254395 0.289551 0.792969 +v 4.692383 0.401367 0.692383 +v 4.617188 0.339844 0.652344 +v 4.382812 0.339844 0.652344 +v 4.307617 0.401367 0.692383 +v 4.778809 0.418945 0.725586 +v 4.851562 0.466797 0.666992 +v 4.753906 0.476562 0.632812 +v 4.246094 0.476562 0.632812 +v 4.148438 0.466797 0.666992 +v 4.221191 0.418945 0.725586 +v 4.807617 0.354980 0.784668 +v 4.852051 0.394531 0.749512 +v 4.147949 0.394531 0.749512 +v 4.192383 0.354980 0.784668 +v 4.898926 0.354980 0.767090 +v 4.959961 0.350586 0.728027 +v 4.924805 0.418945 0.698730 +v 4.075195 0.418945 0.698730 +v 4.040039 0.350586 0.728027 +v 4.101074 0.354980 0.767090 +v 5.010742 0.401367 0.635254 +v 4.949219 0.476562 0.597656 +v 4.050781 0.476562 0.597656 +v 3.989258 0.401367 0.635254 +v 5.028320 0.315430 0.676270 +v 5.085938 0.339844 0.570312 +v 3.914062 0.339844 0.570312 +v 3.971680 0.315430 0.676270 +v 4.963867 0.289551 0.753418 +v 4.036133 0.289551 0.753418 +v 4.964844 0.243164 0.767578 +v 4.934082 0.325195 0.774902 +v 4.950846 0.284668 0.779622 +v 4.049154 0.284668 0.779622 +v 4.065918 0.325195 0.774902 +v 4.035156 0.243164 0.767578 +v 4.852539 0.358398 0.792480 +v 4.894043 0.344564 0.793457 +v 4.105957 0.344564 0.793457 +v 4.147461 0.358398 0.792480 +v 4.775391 0.325195 0.806641 +v 4.812663 0.344564 0.810872 +v 4.187337 0.344564 0.810872 +v 4.224609 0.325195 0.806641 +v 4.743164 0.243164 0.808594 +v 4.756348 0.284668 0.818034 +v 4.243652 0.284668 0.818034 +v 4.256836 0.243164 0.808594 +v 4.775391 0.166016 0.806641 +v 4.756348 0.203288 0.818034 +v 4.243652 0.203288 0.818034 +v 4.224609 0.166016 0.806641 +v 4.852539 0.133789 0.792480 +v 4.812663 0.146973 0.810872 +v 4.187337 0.146973 0.810872 +v 4.147461 0.133789 0.792480 +v 4.934082 0.166016 0.774902 +v 4.894043 0.146973 0.793457 +v 4.105957 0.146973 0.793457 +v 4.065918 0.166016 0.774902 +v 4.950846 0.203288 0.779622 +v 4.049154 0.203288 0.779622 +v 4.919271 0.242839 0.797526 +v 4.901042 0.195964 0.802083 +v 4.080729 0.242839 0.797526 +v 4.098958 0.195964 0.802083 +v 4.852213 0.175781 0.813802 +v 4.147787 0.175781 0.813802 +v 4.805338 0.195964 0.822266 +v 4.194662 0.195964 0.822266 +v 4.785156 0.242839 0.823568 +v 4.214844 0.242839 0.823568 +v 4.805338 0.292318 0.822266 +v 4.194662 0.292318 0.822266 +v 4.852213 0.313151 0.813802 +v 4.147787 0.313151 0.813802 +v 4.901042 0.292318 0.802083 +v 4.098958 0.292318 0.802083 +v 4.587891 -0.969727 0.560547 +v 4.664062 -0.948730 0.593750 +v 4.576660 -0.936035 0.634766 +v 4.500000 -0.960938 0.605469 +v 4.423340 -0.936035 0.634766 +v 4.335938 -0.948730 0.593750 +v 4.412109 -0.969727 0.560547 +v 4.746094 -0.949219 0.535645 +v 4.771973 -0.922852 0.582520 +v 4.692383 -0.918457 0.629883 +v 4.307617 -0.918457 0.629883 +v 4.228027 -0.922852 0.582520 +v 4.253906 -0.949219 0.535645 +v 4.830566 -0.898438 0.525391 +v 4.810059 -0.845215 0.599121 +v 4.745117 -0.862305 0.642578 +v 4.254883 -0.862305 0.642578 +v 4.189941 -0.845215 0.599121 +v 4.169434 -0.898438 0.525391 +v 4.835449 -0.765625 0.545898 +v 4.797852 -0.686523 0.626465 +v 4.752441 -0.758301 0.667480 +v 4.247559 -0.758301 0.667480 +v 4.202148 -0.686523 0.626465 +v 4.164551 -0.765625 0.545898 +v 4.808105 -0.549805 0.564941 +v 4.761230 -0.457520 0.638184 +v 4.726562 -0.572266 0.688477 +v 4.273438 -0.572266 0.688477 +v 4.238770 -0.457520 0.638184 +v 4.191895 -0.549805 0.564941 +v 4.700195 -0.150879 0.669922 +v 4.812988 -0.148926 0.563477 +v 4.912109 -0.087402 0.609863 +v 4.772461 -0.069336 0.715332 +v 4.227539 -0.069336 0.715332 +v 4.087891 -0.087402 0.609863 +v 4.187012 -0.148926 0.563477 +v 4.299805 -0.150879 0.669922 +v 5.029785 -0.072754 0.537598 +v 5.118164 0.016113 0.577148 +v 5.001953 -0.003418 0.639160 +v 3.998047 -0.003418 0.639160 +v 3.881836 0.016113 0.577148 +v 3.970215 -0.072754 0.537598 +v 5.217773 0.067383 0.495117 +v 5.261230 0.183105 0.543457 +v 5.165039 0.119141 0.604004 +v 3.834961 0.119141 0.604004 +v 3.738770 0.183105 0.543457 +v 3.782227 0.067383 0.495117 +v 5.322754 0.288574 0.520508 +v 5.285156 0.379883 0.618652 +v 5.235352 0.283203 0.617676 +v 3.764648 0.283203 0.617676 +v 3.714844 0.379883 0.618652 +v 3.677246 0.288574 0.520508 +v 5.270508 0.445801 0.603027 +v 5.182617 0.458984 0.677734 +v 5.211914 0.395020 0.676758 +v 3.788086 0.395020 0.676758 +v 3.817383 0.458984 0.677734 +v 3.729492 0.445801 0.603027 +v 5.094238 0.530273 0.652832 +v 4.975586 0.574219 0.739258 +v 5.061523 0.479004 0.739746 +v 3.938477 0.479004 0.739746 +v 4.024414 0.574219 0.739258 +v 3.905762 0.530273 0.652832 +v 4.902832 0.661621 0.707031 +v 4.817871 0.679688 0.782227 +v 4.879395 0.587402 0.792480 +v 4.120605 0.587402 0.792480 +v 4.182129 0.679688 0.782227 +v 4.097168 0.661621 0.707031 +v 4.744141 0.716797 0.740723 +v 4.684570 0.645996 0.801270 +v 4.759277 0.623047 0.819824 +v 4.240723 0.623047 0.819824 +v 4.315430 0.645996 0.801270 +v 4.255859 0.716797 0.740723 +v 4.620117 0.589844 0.748047 +v 4.583984 0.478027 0.795898 +v 4.653809 0.523438 0.825684 +v 4.346191 0.523438 0.825684 +v 4.416016 0.478027 0.795898 +v 4.379883 0.589844 0.748047 +v 4.536621 0.448730 0.739258 +v 4.500000 0.408203 0.785156 +v 4.560059 0.395508 0.813477 +v 4.439941 0.395508 0.813477 +v 4.463379 0.448730 0.739258 +v 4.635742 0.425293 0.806152 +v 4.704590 0.446289 0.777344 +v 4.726562 0.529785 0.803223 +v 4.273438 0.529785 0.803223 +v 4.295410 0.446289 0.777344 +v 4.364258 0.425293 0.806152 +v 4.787109 0.486328 0.763672 +v 4.822754 0.548340 0.787109 +v 4.177246 0.548340 0.787109 +v 4.212891 0.486328 0.763672 +v 4.878418 0.468750 0.745605 +v 4.945801 0.488281 0.753906 +v 4.054199 0.488281 0.753906 +v 4.121582 0.468750 0.745605 +v 5.018555 0.411621 0.705566 +v 5.124023 0.399414 0.697754 +v 3.875977 0.399414 0.697754 +v 3.981445 0.411621 0.705566 +v 5.126953 0.341309 0.665039 +v 5.183594 0.325684 0.654297 +v 3.816406 0.325684 0.654297 +v 3.873047 0.341309 0.665039 +v 5.139160 0.248047 0.650391 +v 5.162598 0.195801 0.631348 +v 3.837402 0.195801 0.631348 +v 3.860840 0.248047 0.650391 +v 5.068848 0.128418 0.659180 +v 5.048828 0.066406 0.650391 +v 3.951172 0.066406 0.650391 +v 3.931152 0.128418 0.659180 +v 4.941895 0.040039 0.687988 +v 4.879883 -0.004883 0.693848 +v 4.120117 -0.004883 0.693848 +v 4.058105 0.040039 0.687988 +v 4.787109 0.042480 0.729980 +v 4.681641 0.006836 0.761230 +v 4.318359 0.006836 0.761230 +v 4.212891 0.042480 0.729980 +v 4.671387 0.101074 0.752930 +v 4.590332 0.096191 0.746094 +v 4.576172 -0.023926 0.763184 +v 4.423828 -0.023926 0.763184 +v 4.409668 0.096191 0.746094 +v 4.328613 0.101074 0.752930 +v 4.639160 0.360352 0.778809 +v 4.571777 0.325195 0.791016 +v 4.428223 0.325195 0.791016 +v 4.360840 0.360352 0.778809 +v 4.618652 0.260742 0.768066 +v 4.500000 0.275391 0.785156 +v 4.567871 0.210938 0.762695 +v 4.432129 0.210938 0.762695 +v 4.381348 0.260742 0.768066 +v 4.500000 0.140625 0.748047 +v 4.633789 0.171387 0.755859 +v 4.366211 0.171387 0.755859 +v 4.606934 -0.903809 0.665039 +v 4.536621 -0.891113 0.684082 +v 4.500000 -0.915039 0.664062 +v 4.463379 -0.891113 0.684082 +v 4.393066 -0.903809 0.665039 +v 4.669434 -0.865723 0.674316 +v 4.601074 -0.865234 0.693848 +v 4.398926 -0.865234 0.693848 +v 4.330566 -0.865723 0.674316 +v 4.685547 -0.773438 0.697266 +v 4.627930 -0.789062 0.712891 +v 4.372070 -0.789062 0.712891 +v 4.314453 -0.773438 0.697266 +v 4.647949 -0.458496 0.727539 +v 4.602051 -0.566895 0.736816 +v 4.679199 -0.673340 0.711914 +v 4.320801 -0.673340 0.711914 +v 4.397949 -0.566895 0.736816 +v 4.352051 -0.458496 0.727539 +v 4.617188 -0.712891 0.727051 +v 4.382812 -0.712891 0.727051 +v 4.585938 -0.371094 0.741699 +v 4.542969 -0.324219 0.748047 +v 4.500000 -0.381836 0.746094 +v 4.541992 -0.458008 0.747070 +v 4.458008 -0.458008 0.747070 +v 4.457031 -0.324219 0.748047 +v 4.414062 -0.371094 0.741699 +v 4.555664 -0.661133 0.736328 +v 4.500000 -0.563477 0.742188 +v 4.444336 -0.661133 0.736328 +v 4.500000 -0.717773 0.734375 +v 4.554199 -0.736816 0.732910 +v 4.445801 -0.736816 0.732910 +v 4.614746 -0.259277 0.747070 +v 4.621094 -0.222656 0.770508 +v 4.609863 -0.249512 0.787109 +v 4.583496 -0.279785 0.763184 +v 4.416504 -0.279785 0.763184 +v 4.390137 -0.249512 0.787109 +v 4.378906 -0.222656 0.770508 +v 4.385254 -0.259277 0.747070 +v 4.618164 -0.184570 0.753418 +v 4.597656 -0.150391 0.763184 +v 4.617676 -0.182129 0.787598 +v 4.382324 -0.182129 0.787598 +v 4.402344 -0.150391 0.763184 +v 4.381836 -0.184570 0.753418 +v 4.555176 -0.127930 0.750488 +v 4.527832 -0.141113 0.763184 +v 4.570801 -0.133789 0.780273 +v 4.429199 -0.133789 0.780273 +v 4.472168 -0.141113 0.763184 +v 4.444824 -0.127930 0.750488 +v 4.500000 -0.165039 0.756836 +v 4.500000 -0.176758 0.770508 +v 4.517578 -0.160156 0.787598 +v 4.482422 -0.160156 0.787598 +v 4.500000 -0.313477 0.761719 +v 4.545410 -0.294922 0.779297 +v 4.454590 -0.294922 0.779297 +v 4.500000 -0.293945 0.792969 +v 4.579590 -0.262695 0.795410 +v 4.541992 -0.266113 0.804688 +v 4.458008 -0.266113 0.804688 +v 4.420410 -0.262695 0.795410 +v 4.500000 -0.180664 0.808594 +v 4.532715 -0.175293 0.816406 +v 4.544922 -0.145020 0.798828 +v 4.455078 -0.145020 0.798828 +v 4.467285 -0.175293 0.816406 +v 4.568848 -0.157227 0.810547 +v 4.596680 -0.153809 0.798828 +v 4.403320 -0.153809 0.798828 +v 4.431152 -0.157227 0.810547 +v 4.594238 -0.187988 0.816406 +v 4.614258 -0.220703 0.808105 +v 4.385742 -0.220703 0.808105 +v 4.405762 -0.187988 0.816406 +v 4.584473 -0.240723 0.812988 +v 4.415527 -0.240723 0.812988 +v 4.554688 -0.213867 0.823242 +v 4.445312 -0.213867 0.823242 +v 4.500000 -0.244141 0.816406 +v 4.500000 -0.066406 0.745117 +v 4.603027 -0.128906 0.766113 +v 4.396973 -0.128906 0.766113 +v 4.639160 -0.229004 0.735840 +v 4.649902 -0.179688 0.734375 +v 4.350098 -0.179688 0.734375 +v 4.360840 -0.229004 0.735840 +v 4.635742 -0.310547 0.727539 +v 4.672852 -0.275391 0.695801 +v 4.327148 -0.275391 0.695801 +v 4.364258 -0.310547 0.727539 +v 4.692383 -0.376953 0.696777 +v 4.307617 -0.376953 0.696777 +v 4.766602 -0.368164 0.562988 +v 4.721680 -0.320312 0.633789 +v 4.278320 -0.320312 0.633789 +v 4.233398 -0.368164 0.562988 +v 4.732910 -0.277344 0.561035 +v 4.697266 -0.241699 0.639648 +v 4.302734 -0.241699 0.639648 +v 4.267090 -0.277344 0.561035 +v 4.708008 -0.210449 0.574707 +v 4.291992 -0.210449 0.574707 +v 4.589355 -0.747559 0.727539 +v 4.500000 -0.759766 0.727539 +v 4.547852 -0.756836 0.716309 +v 4.452148 -0.756836 0.716309 +v 4.410645 -0.747559 0.727539 +v 4.598633 -0.821777 0.710938 +v 4.596191 -0.780762 0.710938 +v 4.403809 -0.780762 0.710938 +v 4.401367 -0.821777 0.710938 +v 4.554199 -0.870117 0.693359 +v 4.572754 -0.844238 0.691895 +v 4.427246 -0.844238 0.691895 +v 4.445801 -0.870117 0.693359 +v 4.500000 -0.880859 0.688477 +v 4.524414 -0.871094 0.681152 +v 4.475586 -0.871094 0.681152 +v 4.500000 -0.865234 0.660156 +v 4.546875 -0.854980 0.662109 +v 4.526367 -0.846191 0.643066 +v 4.473633 -0.846191 0.643066 +v 4.453125 -0.854980 0.662109 +v 4.587891 -0.812988 0.676270 +v 4.572266 -0.826660 0.646810 +v 4.427734 -0.826660 0.646810 +v 4.412109 -0.812988 0.676270 +v 4.582031 -0.758789 0.691895 +v 4.589844 -0.787109 0.659017 +v 4.410156 -0.787109 0.659017 +v 4.417969 -0.758789 0.691895 +v 4.500000 -0.769531 0.689453 +v 4.543945 -0.775879 0.664551 +v 4.456055 -0.775879 0.664551 +v 4.500000 -0.815430 0.645508 +v 4.563477 -0.804199 0.647298 +v 4.436523 -0.804199 0.647298 +v 4.655273 0.217285 0.769043 +v 4.677734 0.150879 0.762695 +v 4.678223 0.187500 0.770996 +v 4.321777 0.187500 0.770996 +v 4.322266 0.150879 0.762695 +v 4.344727 0.217285 0.769043 +v 4.656738 0.301758 0.773438 +v 4.672363 0.258301 0.775391 +v 4.327637 0.258301 0.775391 +v 4.343262 0.301758 0.773438 +v 4.692383 0.389160 0.775391 +v 4.691406 0.337891 0.776855 +v 4.308594 0.337891 0.776855 +v 4.307617 0.389160 0.775391 +v 4.729980 0.099609 0.756836 +v 4.706055 0.132812 0.770508 +v 4.293945 0.132812 0.770508 +v 4.270020 0.099609 0.756836 +v 4.868652 0.052246 0.724121 +v 4.800293 0.084473 0.754395 +v 4.199707 0.084473 0.754395 +v 4.131348 0.052246 0.724121 +v 4.985352 0.090332 0.694824 +v 4.925781 0.079102 0.723145 +v 4.074219 0.079102 0.723145 +v 4.014648 0.090332 0.694824 +v 5.088379 0.190430 0.668457 +v 5.028320 0.147461 0.692871 +v 3.971680 0.147461 0.692871 +v 3.911621 0.190430 0.668457 +v 5.107910 0.289062 0.668945 +v 5.084473 0.242676 0.677734 +v 3.915527 0.242676 0.677734 +v 3.892090 0.289062 0.668945 +v 5.066406 0.361328 0.686523 +v 5.076172 0.320801 0.685059 +v 3.923828 0.320801 0.685059 +v 3.933594 0.361328 0.686523 +v 4.933594 0.415527 0.738281 +v 4.992676 0.377441 0.726562 +v 4.007324 0.377441 0.726562 +v 4.066406 0.415527 0.738281 +v 4.834961 0.447754 0.751465 +v 4.878418 0.417480 0.759277 +v 4.121582 0.417480 0.759277 +v 4.165039 0.447754 0.751465 +v 4.761230 0.439941 0.765137 +v 4.803223 0.428711 0.762695 +v 4.196777 0.428711 0.762695 +v 4.238770 0.439941 0.765137 +v 4.739746 0.401367 0.773926 +v 4.260254 0.401367 0.773926 +v 4.777832 0.405762 0.767578 +v 4.725098 0.363770 0.769531 +v 4.757812 0.378906 0.761719 +v 4.242188 0.378906 0.761719 +v 4.274902 0.363770 0.769531 +v 4.222168 0.405762 0.767578 +v 4.838867 0.414062 0.756836 +v 4.808594 0.402344 0.757812 +v 4.191406 0.402344 0.757812 +v 4.161133 0.414062 0.756836 +v 4.923828 0.391113 0.751465 +v 4.875000 0.398438 0.750000 +v 4.125000 0.398438 0.750000 +v 4.076172 0.391113 0.751465 +v 5.033691 0.342773 0.695801 +v 4.972656 0.363281 0.714844 +v 4.027344 0.363281 0.714844 +v 3.966309 0.342773 0.695801 +v 5.066406 0.282227 0.680176 +v 5.042969 0.308594 0.675781 +v 3.957031 0.308594 0.675781 +v 3.933594 0.282227 0.680176 +v 5.051758 0.201660 0.680664 +v 5.050781 0.246094 0.671875 +v 3.949219 0.246094 0.671875 +v 3.948242 0.201660 0.680664 +v 4.968750 0.116699 0.709473 +v 5.003906 0.164062 0.687500 +v 3.996094 0.164062 0.687500 +v 4.031250 0.116699 0.709473 +v 4.869141 0.083984 0.735840 +v 4.917969 0.101562 0.714844 +v 4.082031 0.101562 0.714844 +v 4.130859 0.083984 0.735840 +v 4.747070 0.117676 0.764160 +v 4.808594 0.105469 0.742188 +v 4.191406 0.105469 0.742188 +v 4.252930 0.117676 0.764160 +v 4.698730 0.165527 0.763184 +v 4.722656 0.148438 0.753906 +v 4.277344 0.148438 0.753906 +v 4.301270 0.165527 0.763184 +v 4.691406 0.296387 0.769043 +v 4.714844 0.328125 0.757812 +v 4.285156 0.328125 0.757812 +v 4.308594 0.296387 0.769043 +v 4.685547 0.224609 0.765625 +v 4.695312 0.261719 0.753906 +v 4.304688 0.261719 0.753906 +v 4.314453 0.224609 0.765625 +v 4.699219 0.199219 0.750000 +v 4.300781 0.199219 0.750000 +v 4.500000 0.432617 0.673828 +v 4.586426 0.496094 0.679688 +v 4.547201 0.448405 0.620117 +v 4.452799 0.448405 0.620117 +v 4.413574 0.496094 0.679688 +v 4.683594 0.668457 0.683594 +v 4.679199 0.575195 0.625977 +v 4.320801 0.575195 0.625977 +v 4.316406 0.668457 0.683594 +v 4.829102 0.700684 0.661621 +v 4.766113 0.662598 0.620117 +v 4.233887 0.662598 0.620117 +v 4.170898 0.700684 0.661621 +v 4.994141 0.582520 0.618652 +v 4.877441 0.621094 0.596191 +v 4.122559 0.621094 0.596191 +v 4.005859 0.582520 0.618652 +v 5.186035 0.476074 0.562500 +v 5.080078 0.506836 0.519043 +v 3.919922 0.506836 0.519043 +v 3.813965 0.476074 0.562500 +v 5.308105 0.391602 0.516602 +v 5.236816 0.433105 0.472168 +v 3.763184 0.433105 0.472168 +v 3.691895 0.391602 0.516602 +v 5.281250 0.166992 0.433105 +v 5.292969 0.290039 0.402832 +v 3.707031 0.290039 0.402832 +v 3.718750 0.166992 0.433105 +v 5.117676 -0.009766 0.471191 +v 5.206055 0.080078 0.365234 +v 3.793945 0.080078 0.365234 +v 3.882324 -0.009766 0.471191 +v 4.930664 -0.112793 0.500977 +v 5.027832 -0.060059 0.411621 +v 3.972168 -0.060059 0.411621 +v 4.069336 -0.112793 0.500977 +v 4.566895 -0.569824 0.333008 +v 4.500000 -0.514648 0.302734 +v 4.588379 -0.459473 0.266602 +v 4.644531 -0.476562 0.318848 +v 4.355469 -0.476562 0.318848 +v 4.411621 -0.459473 0.266602 +v 4.433105 -0.569824 0.333008 +v 4.570801 -0.775391 0.365234 +v 4.500000 -0.677734 0.339844 +v 4.633301 -0.647949 0.362305 +v 4.366699 -0.647949 0.362305 +v 4.429199 -0.775391 0.365234 +v 4.581543 -0.940430 0.452148 +v 4.500000 -0.880859 0.402344 +v 4.652832 -0.851562 0.400879 +v 4.347168 -0.851562 0.400879 +v 4.418457 -0.940430 0.452148 +v 4.669922 -0.956543 0.494629 +v 4.500000 -0.974609 0.513672 +v 4.330078 -0.956543 0.494629 +v 4.808594 -0.916992 0.464844 +v 4.743164 -0.908691 0.427734 +v 4.256836 -0.908691 0.427734 +v 4.191406 -0.916992 0.464844 +v 4.824707 -0.791504 0.460449 +v 4.793945 -0.830566 0.409180 +v 4.206055 -0.830566 0.409180 +v 4.175293 -0.791504 0.460449 +v 4.800781 -0.597656 0.478516 +v 4.763672 -0.634277 0.404297 +v 4.236328 -0.634277 0.404297 +v 4.199219 -0.597656 0.478516 +v 4.715332 -0.731934 0.380371 +v 4.693359 -0.529297 0.369629 +v 4.306641 -0.529297 0.369629 +v 4.284668 -0.731934 0.380371 +v 4.705566 -0.394043 0.333008 +v 4.742188 -0.449707 0.408691 +v 4.257812 -0.449707 0.408691 +v 4.294434 -0.394043 0.333008 +v 4.772461 -0.407715 0.487793 +v 4.227539 -0.407715 0.487793 +v 4.740723 -0.301758 0.494141 +v 4.744629 -0.242188 0.444824 +v 4.722168 -0.238281 0.511719 +v 4.277832 -0.238281 0.511719 +v 4.255371 -0.242188 0.444824 +v 4.259277 -0.301758 0.494141 +v 4.729980 -0.334473 0.410156 +v 4.270020 -0.334473 0.410156 +v 4.734863 -0.179199 0.524902 +v 4.727702 -0.192871 0.492350 +v 4.272298 -0.192871 0.492350 +v 4.265137 -0.179199 0.524902 +v 4.811198 -0.144531 0.490885 +v 4.188802 -0.144531 0.490885 +v 4.500000 -0.058594 -0.712891 +v 4.676270 0.087891 -0.732422 +v 4.809408 -0.042969 -0.615560 +v 4.668457 -0.164551 -0.585938 +v 4.331543 -0.164551 -0.585938 +v 4.190592 -0.042969 -0.615560 +v 4.323730 0.087891 -0.732422 +v 4.500000 -0.274414 -0.484375 +v 4.797363 -0.219727 -0.413086 +v 4.645996 -0.335449 -0.285156 +v 4.354004 -0.335449 -0.285156 +v 4.202637 -0.219727 -0.413086 +v 4.500000 -0.404297 -0.074219 +v 4.742676 -0.339355 -0.052246 +v 4.608887 -0.418945 0.126953 +v 4.391113 -0.418945 0.126953 +v 4.257324 -0.339355 -0.052246 +v 4.500000 -0.455078 0.228516 +v 4.674805 -0.400391 0.239746 +v 4.325195 -0.400391 0.239746 +v 4.729818 -0.328125 0.288900 +v 4.270182 -0.328125 0.288900 +v 5.288086 0.197266 0.241211 +v 5.155273 -0.009277 0.247070 +v 5.279785 0.100586 0.088867 +v 3.720215 0.100586 0.088867 +v 3.844727 -0.009277 0.247070 +v 3.711914 0.197266 0.241211 +v 4.500000 0.298828 -0.800781 +v 4.722168 0.493164 -0.734375 +v 4.867676 0.246094 -0.688477 +v 4.132324 0.246094 -0.688477 +v 4.277832 0.493164 -0.734375 +v 4.500000 0.928711 0.099609 +v 4.727051 0.844238 0.249512 +v 4.919922 0.876465 0.065918 +v 4.726562 0.937500 -0.081055 +v 4.273438 0.937500 -0.081055 +v 4.080078 0.876465 0.065918 +v 4.272949 0.844238 0.249512 +v 4.500000 0.930664 -0.291016 +v 4.919922 0.880859 -0.249023 +v 4.727051 0.844238 -0.455078 +v 4.272949 0.844238 -0.455078 +v 4.080078 0.880859 -0.249023 +v 4.500000 0.710938 -0.660156 +v 4.921387 0.643555 -0.559082 +v 4.078613 0.643555 -0.559082 +v 5.146484 0.458008 0.401367 +v 5.254883 0.386230 0.374023 +v 5.191895 0.455078 0.302246 +v 3.808105 0.455078 0.302246 +v 3.745117 0.386230 0.374023 +v 3.853516 0.458008 0.401367 +v 5.129883 0.580078 0.196289 +v 5.257812 0.470215 0.194336 +v 5.213867 0.613770 0.086426 +v 3.786133 0.613770 0.086426 +v 3.742188 0.470215 0.194336 +v 3.870117 0.580078 0.196289 +v 5.136719 0.729980 -0.041992 +v 5.282715 0.573730 -0.021484 +v 5.218750 0.667969 -0.156250 +v 3.781250 0.667969 -0.156250 +v 3.717285 0.573730 -0.021484 +v 3.863281 0.729980 -0.041992 +v 5.136719 0.720703 -0.298340 +v 5.277344 0.560059 -0.258789 +v 5.215820 0.579590 -0.385254 +v 3.784180 0.579590 -0.385254 +v 3.722656 0.560059 -0.258789 +v 3.863281 0.720703 -0.298340 +v 5.268555 0.423828 -0.383301 +v 5.181641 0.299805 -0.495117 +v 5.126953 0.509766 -0.504395 +v 3.873047 0.509766 -0.504395 +v 3.818359 0.299805 -0.495117 +v 3.731445 0.423828 -0.383301 +v 5.023926 0.388672 -0.610840 +v 5.045898 0.732910 -0.407715 +v 3.954102 0.732910 -0.407715 +v 3.976074 0.388672 -0.610840 +v 5.046875 0.823730 -0.133301 +v 3.953125 0.823730 -0.133301 +v 5.046875 0.749023 0.136230 +v 3.953125 0.749023 0.136230 +v 4.922363 0.679688 0.323730 +v 5.051270 0.526367 0.350098 +v 3.948730 0.526367 0.350098 +v 4.077637 0.679688 0.323730 +v 4.943359 0.525391 0.491211 +v 4.056641 0.525391 0.491211 +v 4.500000 0.722656 0.405273 +v 4.738281 0.583008 0.480469 +v 4.261719 0.583008 0.480469 +v 4.784668 0.533691 0.574707 +v 4.215332 0.533691 0.574707 +v 4.602376 0.509440 0.578613 +v 4.397624 0.509440 0.578613 +v 4.500000 0.483724 0.589844 +v 5.293457 0.331055 0.203613 +v 3.706543 0.331055 0.203613 +v 5.328125 0.265625 0.031738 +v 5.320801 0.430176 0.033691 +v 3.679199 0.430176 0.033691 +v 3.671875 0.265625 0.031738 +v 5.332031 0.347656 -0.119629 +v 5.308105 0.459961 -0.165039 +v 3.691895 0.459961 -0.165039 +v 3.667969 0.347656 -0.119629 +v 5.306641 0.344238 -0.308594 +v 3.693359 0.344238 -0.308594 +v 4.807943 -0.277832 0.129720 +v 4.862793 -0.233398 -0.227051 +v 4.928223 -0.192383 -0.035645 +v 4.071777 -0.192383 -0.035645 +v 4.137207 -0.233398 -0.227051 +v 4.192057 -0.277832 0.129720 +v 5.140625 -0.088867 -0.054199 +v 5.056641 -0.107910 0.113770 +v 5.025391 -0.132812 -0.187988 +v 3.974609 -0.132812 -0.187988 +v 3.943359 -0.107910 0.113770 +v 3.859375 -0.088867 -0.054199 +v 4.926758 -0.134277 0.317871 +v 4.073242 -0.134277 0.317871 +v 4.812663 -0.169434 0.448893 +v 4.805501 -0.231934 0.301107 +v 4.194499 -0.231934 0.301107 +v 4.187337 -0.169434 0.448893 +v 5.202148 0.134766 -0.440430 +v 5.072754 0.022949 -0.453613 +v 5.051270 0.178711 -0.564453 +v 3.948730 0.178711 -0.564453 +v 3.927246 0.022949 -0.453613 +v 3.797852 0.134766 -0.440430 +v 4.920736 0.066406 -0.604818 +v 4.079264 0.066406 -0.604818 +v 5.117676 -0.077148 -0.298340 +v 4.959961 -0.101562 -0.371582 +v 4.040039 -0.101562 -0.371582 +v 3.882324 -0.077148 -0.298340 +v 4.901205 -0.076660 -0.514974 +v 4.098795 -0.076660 -0.514974 +v 5.529297 0.440918 -0.304688 +v 5.456543 0.430664 -0.291016 +v 5.411133 0.381348 -0.233398 +v 5.469238 0.385742 -0.265137 +v 3.530762 0.385742 -0.265137 +v 3.588867 0.381348 -0.233398 +v 3.543457 0.430664 -0.291016 +v 3.470703 0.440918 -0.304688 +v 5.626465 0.479004 -0.382324 +v 5.604492 0.424805 -0.350586 +v 5.699219 0.448242 -0.394043 +v 3.300781 0.448242 -0.394043 +v 3.395508 0.424805 -0.350586 +v 3.373535 0.479004 -0.382324 +v 5.786621 0.403809 -0.431641 +v 5.731934 0.362305 -0.406738 +v 5.788574 0.295898 -0.413574 +v 3.211426 0.295898 -0.413574 +v 3.268066 0.362305 -0.406738 +v 3.213379 0.403809 -0.431641 +v 5.809570 0.185547 -0.434570 +v 5.744629 0.182617 -0.413574 +v 5.727539 0.079102 -0.404785 +v 3.272461 0.079102 -0.404785 +v 3.255371 0.182617 -0.413574 +v 3.190430 0.185547 -0.434570 +v 5.657227 -0.017090 -0.392578 +v 5.625000 0.017578 -0.364746 +v 5.532227 -0.057617 -0.305664 +v 3.467773 -0.057617 -0.305664 +v 3.375000 0.017578 -0.364746 +v 3.342773 -0.017090 -0.392578 +v 5.410156 -0.110840 -0.248535 +v 5.430664 -0.057617 -0.228516 +v 5.312012 -0.097168 -0.157227 +v 3.687988 -0.097168 -0.157227 +v 3.569336 -0.057617 -0.228516 +v 3.589844 -0.110840 -0.248535 +v 5.533203 -0.009766 -0.326660 +v 5.457520 -0.016602 -0.287109 +v 5.366699 -0.040039 -0.198730 +v 3.633301 -0.040039 -0.198730 +v 3.542480 -0.016602 -0.287109 +v 3.466797 -0.009766 -0.326660 +v 5.685059 0.095703 -0.414551 +v 5.616211 0.042969 -0.405762 +v 3.383789 0.042969 -0.405762 +v 3.314941 0.095703 -0.414551 +v 5.734863 0.262695 -0.424316 +v 5.717285 0.172363 -0.445801 +v 3.282715 0.172363 -0.445801 +v 3.265137 0.262695 -0.424316 +v 5.668457 0.379883 -0.404297 +v 5.708496 0.310547 -0.441895 +v 3.291504 0.310547 -0.441895 +v 3.331543 0.379883 -0.404297 +v 5.528809 0.375488 -0.326660 +v 5.600098 0.358887 -0.397461 +v 3.399902 0.358887 -0.397461 +v 3.471191 0.375488 -0.326660 +v 5.436035 0.329590 -0.260742 +v 5.483887 0.330078 -0.322266 +v 3.516113 0.330078 -0.322266 +v 3.563965 0.329590 -0.260742 +v 5.236816 0.007812 -0.020508 +v 5.183594 -0.071777 -0.142090 +v 5.215006 -0.016764 -0.117350 +v 3.784993 -0.016764 -0.117350 +v 3.816406 -0.071777 -0.142090 +v 3.763184 0.007812 -0.020508 +v 5.198730 -0.113770 -0.174805 +v 5.271484 -0.054199 -0.162598 +v 3.728516 -0.054199 -0.162598 +v 3.801270 -0.113770 -0.174805 +v 5.288574 0.146973 -0.061035 +v 3.711426 0.146973 -0.061035 +v 5.354004 0.356445 -0.242188 +v 5.340820 0.312012 -0.199707 +v 5.383789 0.323242 -0.223145 +v 3.616211 0.323242 -0.223145 +v 3.659180 0.312012 -0.199707 +v 3.645996 0.356445 -0.242188 +v 5.338379 -0.022461 -0.237305 +v 5.278809 -0.017090 -0.217285 +v 3.721191 -0.017090 -0.217285 +v 3.661621 -0.022461 -0.237305 +v 5.314941 0.000977 -0.267578 +v 5.280273 0.029297 -0.234863 +v 5.233073 0.006185 -0.182292 +v 3.766927 0.006185 -0.182292 +v 3.719727 0.029297 -0.234863 +v 3.685059 0.000977 -0.267578 +v 5.289062 0.081543 -0.273926 +v 5.259766 0.079590 -0.237305 +v 5.321289 0.052246 -0.273926 +v 3.678711 0.052246 -0.273926 +v 3.740234 0.079590 -0.237305 +v 3.710938 0.081543 -0.273926 +v 5.292969 0.131348 -0.270020 +v 5.312988 0.182129 -0.240234 +v 5.267090 0.127441 -0.190918 +v 3.732910 0.127441 -0.190918 +v 3.687012 0.182129 -0.240234 +v 3.707031 0.131348 -0.270020 +v 5.369141 0.264160 -0.240723 +v 5.328125 0.250977 -0.207520 +v 5.358398 0.211426 -0.268555 +v 3.641602 0.211426 -0.268555 +v 3.671875 0.250977 -0.207520 +v 3.630859 0.264160 -0.240723 +v 5.414062 0.278320 -0.276367 +v 3.585938 0.278320 -0.276367 +v 5.315430 0.237305 -0.138672 +v 3.684570 0.237305 -0.138672 +v 5.235514 0.046224 -0.132487 +v 3.764486 0.046224 -0.132487 +v 5.452148 0.294434 -0.322266 +v 5.391602 0.237305 -0.296387 +v 5.429688 0.255859 -0.329102 +v 3.570312 0.255859 -0.329102 +v 3.608398 0.237305 -0.296387 +v 3.547852 0.294434 -0.322266 +v 5.336426 0.170410 -0.296387 +v 5.374023 0.195801 -0.316406 +v 3.625977 0.195801 -0.316406 +v 3.663574 0.170410 -0.296387 +v 5.279297 0.102051 -0.296875 +v 5.310547 0.127930 -0.314941 +v 3.689453 0.127930 -0.314941 +v 3.720703 0.102051 -0.296875 +v 5.319336 0.075195 -0.296875 +v 5.304688 0.093262 -0.314941 +v 3.695312 0.093262 -0.314941 +v 3.680664 0.075195 -0.296875 +v 5.340332 0.020020 -0.296875 +v 5.348145 0.052246 -0.315918 +v 3.651855 0.052246 -0.315918 +v 3.659668 0.020020 -0.296875 +v 5.325684 -0.012207 -0.289551 +v 5.341309 0.002930 -0.312012 +v 3.658691 0.002930 -0.312012 +v 3.674316 -0.012207 -0.289551 +v 5.394043 -0.016602 -0.265137 +v 5.353516 -0.009277 -0.291016 +v 3.646484 -0.009277 -0.291016 +v 3.605957 -0.016602 -0.265137 +v 5.539551 0.333008 -0.387207 +v 5.501465 0.303711 -0.372559 +v 3.498535 0.303711 -0.372559 +v 3.460449 0.333008 -0.387207 +v 5.669434 0.336426 -0.452637 +v 5.609049 0.332682 -0.437988 +v 3.390951 0.332682 -0.437988 +v 3.330566 0.336426 -0.452637 +v 5.731934 0.239746 -0.467285 +v 5.704590 0.288086 -0.470215 +v 3.295410 0.288086 -0.470215 +v 3.268066 0.239746 -0.467285 +v 5.685547 0.098145 -0.456543 +v 5.712402 0.169434 -0.470215 +v 3.287598 0.169434 -0.470215 +v 3.314453 0.098145 -0.456543 +v 5.542480 0.008789 -0.383789 +v 5.614258 0.057617 -0.437500 +v 3.385742 0.057617 -0.437500 +v 3.457520 0.008789 -0.383789 +v 5.464844 0.004395 -0.337891 +v 3.535156 0.004395 -0.337891 +v 5.356934 0.091797 -0.324219 +v 5.384277 0.039062 -0.323242 +v 5.413086 0.088867 -0.333984 +v 3.586914 0.088867 -0.333984 +v 3.615723 0.039062 -0.323242 +v 3.643066 0.091797 -0.324219 +v 5.423828 0.142578 -0.338867 +v 5.462891 0.086914 -0.349121 +v 5.479004 0.148438 -0.358398 +v 3.520996 0.148438 -0.358398 +v 3.537109 0.086914 -0.349121 +v 3.576172 0.142578 -0.338867 +v 5.484863 0.204590 -0.360840 +v 5.535156 0.147949 -0.383301 +v 5.536133 0.207031 -0.377930 +v 3.463867 0.207031 -0.377930 +v 3.464844 0.147949 -0.383301 +v 3.515137 0.204590 -0.360840 +v 5.547852 0.253906 -0.382812 +v 5.597168 0.201660 -0.398926 +v 5.605469 0.244629 -0.401367 +v 3.394531 0.244629 -0.401367 +v 3.402832 0.201660 -0.398926 +v 3.452148 0.253906 -0.382812 +v 5.563151 0.299479 -0.403809 +v 5.486816 0.259277 -0.361816 +v 3.513184 0.259277 -0.361816 +v 3.436849 0.299479 -0.403809 +v 5.425781 0.202637 -0.337402 +v 3.574219 0.202637 -0.337402 +v 5.365723 0.141602 -0.325195 +v 3.634277 0.141602 -0.325195 +v 5.414551 0.025391 -0.314941 +v 3.585449 0.025391 -0.314941 +v 5.522949 0.066895 -0.387695 +v 3.477051 0.066895 -0.387695 +v 5.625488 0.138672 -0.429688 +v 3.374512 0.138672 -0.429688 +v 5.671387 0.225586 -0.439941 +v 3.328613 0.225586 -0.439941 +v 5.634440 0.299967 -0.436035 +v 3.365560 0.299967 -0.436035 +v 5.539062 -0.080078 -0.395996 +v 5.292969 -0.119629 -0.258301 +v 5.416504 -0.042969 -0.390137 +v 3.583496 -0.042969 -0.390137 +v 3.707031 -0.119629 -0.258301 +v 3.460938 -0.080078 -0.395996 +v 5.772461 0.067871 -0.469238 +v 5.668945 0.041992 -0.495605 +v 3.331055 0.041992 -0.495605 +v 3.227539 0.067871 -0.469238 +v 5.836914 0.299316 -0.466309 +v 5.829427 0.201660 -0.506999 +v 3.170573 0.201660 -0.506999 +v 3.163086 0.299316 -0.466309 +v 5.729492 0.461914 -0.470703 +v 5.806966 0.359375 -0.511393 +v 3.193034 0.359375 -0.511393 +v 3.270508 0.461914 -0.470703 +v 5.532227 0.453125 -0.397949 +v 5.640625 0.399414 -0.496582 +v 3.359375 0.399414 -0.496582 +v 3.467773 0.453125 -0.397949 +v 5.383789 0.390137 -0.321289 +v 5.439941 0.349609 -0.410645 +v 3.560059 0.349609 -0.410645 +v 3.616211 0.390137 -0.321289 +v 5.536621 0.180664 -0.478027 +v 5.335449 0.134766 -0.381836 +v 3.664551 0.134766 -0.381836 +v 3.463379 0.180664 -0.478027 +v 5.757162 0.253906 -0.529460 +v 3.242838 0.253906 -0.529460 +v 5.308594 0.280762 -0.382324 +v 3.691406 0.280762 -0.382324 +v 5.223633 -0.025879 -0.353516 +v 3.776367 -0.025879 -0.353516 +v 4.992188 0.185547 0.720703 +v 4.007812 0.185547 0.720703 +v 5.058594 0.158203 0.625000 +v 3.941406 0.158203 0.625000 +v 4.937500 0.039062 0.650391 +v 4.062500 0.039062 0.650391 +v 4.910156 0.105469 0.738281 +v 4.089844 0.105469 0.738281 +v 4.794922 0.105469 0.759766 +v 4.205078 0.105469 0.759766 +v 4.765625 0.039062 0.681641 +v 4.234375 0.039062 0.681641 +v 4.644531 0.158203 0.697266 +v 4.355469 0.158203 0.697266 +v 4.714844 0.185547 0.769531 +v 4.285156 0.185547 0.769531 +v 4.714844 0.300781 0.769531 +v 4.285156 0.300781 0.769531 +v 4.644531 0.328125 0.697266 +v 4.355469 0.328125 0.697266 +v 4.765625 0.449219 0.681641 +v 4.234375 0.449219 0.681641 +v 4.794922 0.382812 0.759766 +v 4.205078 0.382812 0.759766 +v 4.910156 0.382812 0.738281 +v 4.089844 0.382812 0.738281 +v 4.937500 0.449219 0.650391 +v 4.062500 0.449219 0.650391 +v 5.058594 0.328125 0.625000 +v 3.941406 0.328125 0.625000 +v 4.992188 0.300781 0.720703 +v 4.007812 0.300781 0.720703 +v 4.957031 0.287109 0.769531 +v 4.042969 0.287109 0.769531 +v 4.896484 0.349609 0.783203 +v 4.103516 0.349609 0.783203 +v 4.810547 0.349609 0.800781 +v 4.189453 0.349609 0.800781 +v 4.751953 0.287109 0.808594 +v 4.248047 0.287109 0.808594 +v 4.751953 0.201172 0.808594 +v 4.248047 0.201172 0.808594 +v 4.810547 0.142578 0.800781 +v 4.189453 0.142578 0.800781 +v 4.896484 0.142578 0.783203 +v 4.103516 0.142578 0.783203 +v 4.957031 0.201172 0.769531 +v 4.042969 0.201172 0.769531 +v 4.924479 0.213542 0.794271 +v 4.075521 0.213542 0.794271 +v 4.882812 0.171875 0.804688 +v 4.117188 0.171875 0.804688 +v 4.822917 0.171875 0.817708 +v 4.177083 0.171875 0.817708 +v 4.781250 0.213542 0.822917 +v 4.218750 0.213542 0.822917 +v 4.781250 0.273438 0.822917 +v 4.218750 0.273438 0.822917 +v 4.822917 0.317708 0.817708 +v 4.177083 0.317708 0.817708 +v 4.882812 0.317708 0.804688 +v 4.117188 0.317708 0.804688 +v 4.924479 0.273438 0.794271 +v 4.075521 0.273438 0.794271 +v 4.585938 -0.957031 0.601562 +v 4.414062 -0.957031 0.601562 +v 4.726562 -0.939453 0.585938 +v 4.273438 -0.939453 0.585938 +v 4.798828 -0.892578 0.587891 +v 4.201172 -0.892578 0.587891 +v 4.808594 -0.777344 0.613281 +v 4.191406 -0.777344 0.613281 +v 4.781250 -0.570312 0.634766 +v 4.218750 -0.570312 0.634766 +v 4.791016 -0.119141 0.644531 +v 4.208984 -0.119141 0.644531 +v 5.021484 -0.042969 0.591797 +v 3.978516 -0.042969 0.591797 +v 5.201172 0.091797 0.552734 +v 3.798828 0.091797 0.552734 +v 5.289062 0.289062 0.574219 +v 3.710938 0.289062 0.574219 +v 5.250000 0.425781 0.650391 +v 3.750000 0.425781 0.650391 +v 5.082031 0.511719 0.708984 +v 3.917969 0.511719 0.708984 +v 4.890625 0.636719 0.763672 +v 4.109375 0.636719 0.763672 +v 4.748047 0.683594 0.794922 +v 4.251953 0.683594 0.794922 +v 4.630859 0.564453 0.800781 +v 4.369141 0.564453 0.800781 +v 4.541016 0.425781 0.789062 +v 4.458984 0.425781 0.789062 +v 4.679688 0.482422 0.806641 +v 4.320312 0.482422 0.806641 +v 4.773438 0.550781 0.796875 +v 4.226562 0.550781 0.796875 +v 4.876953 0.525391 0.773438 +v 4.123047 0.525391 0.773438 +v 5.039062 0.443359 0.726562 +v 3.960938 0.443359 0.726562 +v 5.167969 0.365234 0.673828 +v 3.832031 0.365234 0.673828 +v 5.183594 0.265625 0.638672 +v 3.816406 0.265625 0.638672 +v 5.115234 0.126953 0.636719 +v 3.884766 0.126953 0.636719 +v 4.970703 0.021484 0.667969 +v 4.029297 0.021484 0.667969 +v 4.775391 -0.009766 0.732422 +v 4.224609 -0.009766 0.732422 +v 4.623047 0.044922 0.757812 +v 4.376953 0.044922 0.757812 +v 4.597656 0.375000 0.800781 +v 4.402344 0.375000 0.800781 +v 4.564453 0.269531 0.777344 +v 4.435547 0.269531 0.777344 +v 4.574219 0.152344 0.750000 +v 4.425781 0.152344 0.750000 +v 4.556641 -0.912109 0.664062 +v 4.443359 -0.912109 0.664062 +v 4.644531 -0.890625 0.667969 +v 4.355469 -0.890625 0.667969 +v 4.681641 -0.822266 0.685547 +v 4.318359 -0.822266 0.685547 +v 4.664062 -0.570312 0.720703 +v 4.335938 -0.570312 0.720703 +v 4.685547 -0.732422 0.705078 +v 4.314453 -0.732422 0.705078 +v 4.541016 -0.376953 0.746094 +v 4.458984 -0.376953 0.746094 +v 4.548828 -0.564453 0.742188 +v 4.451172 -0.564453 0.742188 +v 4.556641 -0.712891 0.734375 +v 4.443359 -0.712891 0.734375 +v 4.609375 -0.253906 0.767578 +v 4.390625 -0.253906 0.767578 +v 4.617188 -0.183594 0.767578 +v 4.382812 -0.183594 0.767578 +v 4.562500 -0.136719 0.761719 +v 4.437500 -0.136719 0.761719 +v 4.509766 -0.162109 0.767578 +v 4.490234 -0.162109 0.767578 +v 4.544922 -0.302734 0.761719 +v 4.455078 -0.302734 0.761719 +v 4.542969 -0.283203 0.792969 +v 4.457031 -0.283203 0.792969 +v 4.521484 -0.166016 0.804688 +v 4.478516 -0.166016 0.804688 +v 4.572266 -0.140625 0.796875 +v 4.427734 -0.140625 0.796875 +v 4.611328 -0.185547 0.804688 +v 4.388672 -0.185547 0.804688 +v 4.603516 -0.244141 0.802734 +v 4.396484 -0.244141 0.802734 +v 4.562500 -0.183594 0.820312 +v 4.437500 -0.183594 0.820312 +v 4.546875 -0.242188 0.816406 +v 4.453125 -0.242188 0.816406 +v 4.556641 -0.085938 0.755859 +v 4.443359 -0.085938 0.755859 +v 4.628906 -0.179688 0.753906 +v 4.371094 -0.179688 0.753906 +v 4.638672 -0.267578 0.728516 +v 4.361328 -0.267578 0.728516 +v 4.638672 -0.373047 0.728516 +v 4.361328 -0.373047 0.728516 +v 4.740234 -0.376953 0.636719 +v 4.259766 -0.376953 0.636719 +v 4.708984 -0.279297 0.632812 +v 4.291016 -0.279297 0.632812 +v 4.681641 -0.195312 0.660156 +v 4.318359 -0.195312 0.660156 +v 4.550781 -0.750000 0.728516 +v 4.449219 -0.750000 0.728516 +v 4.603516 -0.779297 0.720703 +v 4.396484 -0.779297 0.720703 +v 4.580078 -0.851562 0.701172 +v 4.419922 -0.851562 0.701172 +v 4.527344 -0.878906 0.689453 +v 4.472656 -0.878906 0.689453 +v 4.523438 -0.863281 0.660156 +v 4.476562 -0.863281 0.660156 +v 4.570312 -0.837891 0.667969 +v 4.429688 -0.837891 0.667969 +v 4.593750 -0.781250 0.685547 +v 4.406250 -0.781250 0.685547 +v 4.546875 -0.761719 0.691406 +v 4.453125 -0.761719 0.691406 +v 4.535156 -0.810547 0.646484 +v 4.464844 -0.810547 0.646484 +v 4.578125 -0.804688 0.645833 +v 4.421875 -0.804688 0.645833 +v 4.664062 0.181641 0.765625 +v 4.335938 0.181641 0.765625 +v 4.652344 0.257812 0.771484 +v 4.347656 0.257812 0.771484 +v 4.669922 0.347656 0.775391 +v 4.330078 0.347656 0.775391 +v 4.695312 0.125000 0.761719 +v 4.304688 0.125000 0.761719 +v 4.794922 0.070312 0.742188 +v 4.205078 0.070312 0.742188 +v 4.929688 0.060547 0.708984 +v 4.070312 0.060547 0.708984 +v 5.042969 0.136719 0.679688 +v 3.957031 0.136719 0.679688 +v 5.107422 0.242188 0.666016 +v 3.892578 0.242188 0.666016 +v 5.097656 0.328125 0.673828 +v 3.902344 0.328125 0.673828 +v 5.003906 0.390625 0.712891 +v 3.996094 0.390625 0.712891 +v 4.878906 0.435547 0.748047 +v 4.121094 0.435547 0.748047 +v 4.796875 0.449219 0.757812 +v 4.203125 0.449219 0.757812 +v 4.724609 0.419922 0.771484 +v 4.275391 0.419922 0.771484 +v 4.750000 0.388672 0.769531 +v 4.250000 0.388672 0.769531 +v 4.806641 0.414062 0.761719 +v 4.193359 0.414062 0.761719 +v 4.876953 0.406250 0.757812 +v 4.123047 0.406250 0.757812 +v 4.982422 0.369141 0.724609 +v 4.017578 0.369141 0.724609 +v 5.058594 0.314453 0.683594 +v 3.941406 0.314453 0.683594 +v 5.066406 0.244141 0.677734 +v 3.933594 0.244141 0.677734 +v 5.015625 0.156250 0.693359 +v 3.984375 0.156250 0.693359 +v 4.921875 0.091797 0.722656 +v 4.078125 0.091797 0.722656 +v 4.804688 0.095703 0.751953 +v 4.195312 0.095703 0.751953 +v 4.714844 0.140625 0.765625 +v 4.285156 0.140625 0.765625 +v 4.705078 0.332031 0.769531 +v 4.294922 0.332031 0.769531 +v 4.685547 0.259766 0.767578 +v 4.314453 0.259766 0.767578 +v 4.689453 0.193359 0.763672 +v 4.310547 0.193359 0.763672 +v 4.542969 0.447266 0.675781 +v 4.457031 0.447266 0.675781 +v 4.630859 0.583984 0.683594 +v 4.369141 0.583984 0.683594 +v 4.751953 0.707031 0.675781 +v 4.248047 0.707031 0.675781 +v 4.908203 0.650391 0.642578 +v 4.091797 0.650391 0.642578 +v 5.091797 0.523438 0.589844 +v 3.908203 0.523438 0.589844 +v 5.261719 0.443359 0.542969 +v 3.738281 0.443359 0.542969 +v 5.314453 0.287109 0.468750 +v 3.685547 0.287109 0.468750 +v 5.208984 0.068359 0.443359 +v 3.791016 0.068359 0.443359 +v 5.027344 -0.068359 0.488281 +v 3.972656 -0.068359 0.488281 +v 4.576172 -0.501953 0.304688 +v 4.423828 -0.501953 0.304688 +v 4.566406 -0.667969 0.347656 +v 4.433594 -0.667969 0.347656 +v 4.576172 -0.871094 0.402344 +v 4.423828 -0.871094 0.402344 +v 4.585938 -0.968750 0.507812 +v 4.414062 -0.968750 0.507812 +v 4.750000 -0.943359 0.478516 +v 4.250000 -0.943359 0.478516 +v 4.828125 -0.865234 0.458984 +v 4.171875 -0.865234 0.458984 +v 4.814453 -0.699219 0.468750 +v 4.185547 -0.699219 0.468750 +v 4.701172 -0.626953 0.375000 +v 4.298828 -0.626953 0.375000 +v 4.730469 -0.832031 0.396484 +v 4.269531 -0.832031 0.396484 +v 4.697266 -0.451172 0.353516 +v 4.302734 -0.451172 0.353516 +v 4.787109 -0.496094 0.484375 +v 4.212891 -0.496094 0.484375 +v 4.730469 -0.267578 0.501953 +v 4.269531 -0.267578 0.501953 +v 4.755859 -0.345703 0.490234 +v 4.244141 -0.345703 0.490234 +v 4.712891 -0.208984 0.521484 +v 4.287109 -0.208984 0.521484 +v 4.820312 -0.148438 0.515625 +v 4.179688 -0.148438 0.515625 +v 4.669922 -0.054688 -0.675781 +v 4.330078 -0.054688 -0.675781 +v 4.660156 -0.259766 -0.457031 +v 4.339844 -0.259766 -0.457031 +v 4.626953 -0.386719 -0.066406 +v 4.373047 -0.386719 -0.066406 +v 4.597656 -0.437500 0.222656 +v 4.402344 -0.437500 0.222656 +v 4.710938 -0.359375 0.314453 +v 4.289062 -0.359375 0.314453 +v 5.240234 0.087891 0.228516 +v 3.759766 0.087891 0.228516 +v 4.699219 0.281250 -0.761719 +v 4.300781 0.281250 -0.761719 +v 4.726562 0.916016 0.093750 +v 4.273438 0.916016 0.093750 +v 4.726562 0.919922 -0.269531 +v 4.273438 0.919922 -0.269531 +v 4.728516 0.691406 -0.621094 +v 4.271484 0.691406 -0.621094 +v 5.208984 0.429688 0.392578 +v 3.791016 0.429688 0.392578 +v 5.199219 0.531250 0.199219 +v 3.800781 0.531250 0.199219 +v 5.218750 0.658203 -0.033203 +v 3.781250 0.658203 -0.033203 +v 5.218750 0.646484 -0.279297 +v 3.781250 0.646484 -0.279297 +v 5.207031 0.453125 -0.457031 +v 3.792969 0.453125 -0.457031 +v 5.042969 0.578125 -0.529297 +v 3.957031 0.578125 -0.529297 +v 5.046875 0.806641 -0.273438 +v 3.953125 0.806641 -0.273438 +v 5.046875 0.808594 0.005859 +v 3.953125 0.808594 0.005859 +v 5.046875 0.632812 0.250000 +v 3.953125 0.632812 0.250000 +v 5.064453 0.496094 0.439453 +v 3.935547 0.496094 0.439453 +v 4.728516 0.710938 0.380859 +v 4.271484 0.710938 0.380859 +v 4.781250 0.591797 0.593750 +v 4.218750 0.591797 0.593750 +v 4.763672 0.527344 0.541016 +v 4.236328 0.527344 0.541016 +v 4.536458 0.479167 0.593750 +v 4.463542 0.479167 0.593750 +v 5.287109 0.302734 0.306641 +v 3.712891 0.302734 0.306641 +v 5.308594 0.380859 0.117188 +v 3.691406 0.380859 0.117188 +v 5.318359 0.457031 -0.060547 +v 3.681641 0.457031 -0.060547 +v 5.296875 0.437500 -0.279297 +v 3.703125 0.437500 -0.279297 +v 4.835938 -0.267578 -0.041016 +v 4.164062 -0.267578 -0.041016 +v 5.041016 -0.134766 -0.039062 +v 3.958984 -0.134766 -0.039062 +v 5.044922 -0.078125 0.275391 +v 3.955078 -0.078125 0.275391 +v 4.818359 -0.193359 0.378906 +v 4.181641 -0.193359 0.378906 +v 4.778646 -0.281250 0.247396 +v 4.221354 -0.281250 0.247396 +v 4.783854 -0.164062 0.479167 +v 4.216146 -0.164062 0.479167 +v 5.128906 0.152344 -0.500000 +v 3.871094 0.152344 -0.500000 +v 4.974609 0.210938 -0.625000 +v 4.025391 0.210938 -0.625000 +v 5.037109 -0.076172 -0.337891 +v 3.962891 -0.076172 -0.337891 +v 4.888672 -0.158203 -0.390625 +v 4.111328 -0.158203 -0.390625 +v 4.888021 -0.023438 -0.583333 +v 4.111979 -0.023438 -0.583333 +v 5.462891 0.414062 -0.263672 +v 3.537109 0.414062 -0.263672 +v 5.615234 0.458984 -0.353516 +v 3.384766 0.458984 -0.353516 +v 5.759766 0.388672 -0.410156 +v 3.240234 0.388672 -0.410156 +v 5.777344 0.185547 -0.416016 +v 3.222656 0.185547 -0.416016 +v 5.640625 -0.001953 -0.367188 +v 3.359375 -0.001953 -0.367188 +v 5.417969 -0.087891 -0.222656 +v 3.582031 -0.087891 -0.222656 +v 5.445312 -0.033203 -0.253906 +v 3.554688 -0.033203 -0.253906 +v 5.617188 0.033203 -0.380859 +v 3.382812 0.033203 -0.380859 +v 5.724609 0.177734 -0.425781 +v 3.275391 0.177734 -0.425781 +v 5.714844 0.333984 -0.419922 +v 3.285156 0.333984 -0.419922 +v 5.599609 0.388672 -0.369141 +v 3.400391 0.388672 -0.369141 +v 5.476562 0.355469 -0.289062 +v 3.523438 0.355469 -0.289062 +v 5.193359 -0.048828 -0.083984 +v 3.806641 -0.048828 -0.083984 +v 5.228516 -0.089844 -0.148438 +v 3.771484 -0.089844 -0.148438 +v 5.292969 0.126953 0.001953 +v 3.707031 0.126953 0.001953 +v 5.369141 0.345703 -0.216797 +v 3.630859 0.345703 -0.216797 +v 5.310547 -0.033203 -0.197266 +v 3.689453 -0.033203 -0.197266 +v 5.273438 0.003906 -0.226562 +v 3.726562 0.003906 -0.226562 +v 5.285156 0.058594 -0.251953 +v 3.714844 0.058594 -0.251953 +v 5.277344 0.126953 -0.236328 +v 3.722656 0.126953 -0.236328 +v 5.341797 0.226562 -0.240234 +v 3.658203 0.226562 -0.240234 +v 5.400391 0.298828 -0.246094 +v 3.599609 0.298828 -0.246094 +v 5.330078 0.285156 -0.167969 +v 3.669922 0.285156 -0.167969 +v 5.275391 0.140625 -0.128906 +v 3.724609 0.140625 -0.128906 +v 5.221354 0.005208 -0.143229 +v 3.778646 0.005208 -0.143229 +v 5.419922 0.267578 -0.304688 +v 3.580078 0.267578 -0.304688 +v 5.365234 0.205078 -0.294922 +v 3.634766 0.205078 -0.294922 +v 5.300781 0.132812 -0.296875 +v 3.699219 0.132812 -0.296875 +v 5.292969 0.087891 -0.296875 +v 3.707031 0.087891 -0.296875 +v 5.335938 0.048828 -0.296875 +v 3.664062 0.048828 -0.296875 +v 5.330078 0.000000 -0.296875 +v 3.669922 0.000000 -0.296875 +v 5.347656 -0.017578 -0.267578 +v 3.652344 -0.017578 -0.267578 +v 5.490234 0.316406 -0.351562 +v 3.509766 0.316406 -0.351562 +v 5.605469 0.343750 -0.423828 +v 3.394531 0.343750 -0.423828 +v 5.712891 0.298828 -0.464844 +v 3.287109 0.298828 -0.464844 +v 5.722656 0.167969 -0.466797 +v 3.277344 0.167969 -0.466797 +v 5.621094 0.044922 -0.429688 +v 3.378906 0.044922 -0.429688 +v 5.462891 -0.009766 -0.316406 +v 3.537109 -0.009766 -0.316406 +v 5.376953 0.066406 -0.326172 +v 3.623047 0.066406 -0.326172 +v 5.447266 0.117188 -0.345703 +v 3.552734 0.117188 -0.345703 +v 5.507812 0.179688 -0.369141 +v 3.492188 0.179688 -0.369141 +v 5.566406 0.226562 -0.384766 +v 3.433594 0.226562 -0.384766 +v 5.523438 0.281250 -0.380859 +v 3.476562 0.281250 -0.380859 +v 5.455078 0.232422 -0.347656 +v 3.544922 0.232422 -0.347656 +v 5.396484 0.171875 -0.330078 +v 3.603516 0.171875 -0.330078 +v 5.332031 0.113281 -0.322266 +v 3.667969 0.113281 -0.322266 +v 5.371094 0.011719 -0.310547 +v 3.628906 0.011719 -0.310547 +v 5.466797 0.042969 -0.347656 +v 3.533203 0.042969 -0.347656 +v 5.578125 0.099609 -0.414062 +v 3.421875 0.099609 -0.414062 +v 5.658203 0.181641 -0.437500 +v 3.341797 0.181641 -0.437500 +v 5.660156 0.267578 -0.439453 +v 3.339844 0.267578 -0.439453 +v 5.604167 0.315104 -0.429688 +v 3.395833 0.315104 -0.429688 +v 5.410156 -0.113281 -0.318359 +v 3.589844 -0.113281 -0.318359 +v 5.667969 -0.019531 -0.445312 +v 3.332031 -0.019531 -0.445312 +v 5.828125 0.181641 -0.470703 +v 3.171875 0.181641 -0.470703 +v 5.800781 0.398438 -0.472656 +v 3.199219 0.398438 -0.472656 +v 5.632812 0.472656 -0.441406 +v 3.367188 0.472656 -0.441406 +v 5.449219 0.425781 -0.353516 +v 3.550781 0.425781 -0.353516 +v 5.427734 0.152344 -0.421875 +v 3.572266 0.152344 -0.421875 +v 5.656250 0.218750 -0.513672 +v 3.343750 0.218750 -0.513672 +v 5.809896 0.273438 -0.526042 +v 3.190104 0.273438 -0.526042 +v 5.335938 0.345703 -0.314453 +v 3.664062 0.345703 -0.314453 +v 5.265625 0.128906 -0.394531 +v 3.734375 0.128906 -0.394531 +v 5.199219 -0.099609 -0.261719 +v 3.800781 -0.099609 -0.261719 +vt 0.890955 0.590063 +vt 0.880788 0.589856 +vt 0.881557 0.574808 +vt 0.897763 0.574733 +vt 0.870622 0.589649 +vt 0.865351 0.574882 +vt 0.860081 0.560115 +vt 0.882326 0.559759 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.862146 0.836029 +vt 0.878333 0.836822 +vt 0.878433 0.851889 +vt 0.868067 0.821510 +vt 0.878232 0.821755 +vt 0.888398 0.821999 +vt 0.894519 0.837615 +vt 0.900640 0.853232 +vt 0.884459 0.541407 +vt 0.912369 0.541975 +vt 0.856550 0.540838 +vt 0.853018 0.521562 +vt 0.886592 0.523054 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.851842 0.869648 +vt 0.879749 0.870319 +vt 0.881065 0.888748 +vt 0.907656 0.870990 +vt 0.914672 0.888748 +vt 0.844491 0.575443 +vt 0.835120 0.560496 +vt 0.828900 0.590771 +vt 0.813690 0.580153 +vt 0.798481 0.569535 +vt 0.825750 0.545548 +vt 0.795104 0.838402 +vt 0.810770 0.828470 +vt 0.831306 0.849059 +vt 0.821281 0.863575 +vt 0.826436 0.818537 +vt 0.841331 0.834542 +vt 0.862512 0.597201 +vt 0.853501 0.586322 +vt 0.854402 0.604754 +vt 0.841651 0.597762 +vt 0.839485 0.812119 +vt 0.850816 0.824074 +vt 0.852534 0.805700 +vt 0.860301 0.813605 +vt 0.854254 0.615106 +vt 0.841395 0.613584 +vt 0.854107 0.625459 +vt 0.841139 0.629407 +vt 0.828171 0.633354 +vt 0.828535 0.612063 +vt 0.827598 0.775964 +vt 0.840377 0.780483 +vt 0.839931 0.796301 +vt 0.827017 0.797251 +vt 0.853157 0.785002 +vt 0.852845 0.795351 +vt 0.811643 0.609776 +vt 0.809595 0.639399 +vt 0.791018 0.645443 +vt 0.794749 0.607489 +vt 0.791018 0.762238 +vt 0.809308 0.769101 +vt 0.810039 0.798785 +vt 0.793061 0.800320 +vt 0.841676 0.650941 +vt 0.829182 0.662454 +vt 0.855181 0.668527 +vt 0.848769 0.685509 +vt 0.842358 0.702491 +vt 0.816688 0.673967 +vt 0.844839 0.707525 +vt 0.850490 0.724775 +vt 0.829899 0.746938 +vt 0.817928 0.734882 +vt 0.856142 0.742025 +vt 0.841870 0.758995 +vt 0.860808 0.633875 +vt 0.851242 0.642408 +vt 0.867508 0.642291 +vt 0.861344 0.655409 +vt 0.861717 0.755404 +vt 0.851048 0.767943 +vt 0.867293 0.768782 +vt 0.860225 0.776892 +vt 0.878991 0.642100 +vt 0.878385 0.654923 +vt 0.890474 0.641909 +vt 0.895424 0.654436 +vt 0.900375 0.666964 +vt 0.877778 0.667745 +vt 0.901223 0.745592 +vt 0.895721 0.757887 +vt 0.878719 0.756645 +vt 0.878682 0.743809 +vt 0.890219 0.770183 +vt 0.878756 0.769482 +vt 0.879203 0.684420 +vt 0.909636 0.683331 +vt 0.918898 0.699697 +vt 0.880628 0.701094 +vt 0.921180 0.713713 +vt 0.911201 0.729653 +vt 0.880846 0.727214 +vt 0.883009 0.710619 +vt 0.916132 0.651898 +vt 0.929888 0.662207 +vt 0.931889 0.636832 +vt 0.950140 0.641083 +vt 0.968392 0.645333 +vt 0.943645 0.672515 +vt 0.968213 0.770220 +vt 0.949790 0.773656 +vt 0.930496 0.751654 +vt 0.944697 0.741966 +vt 0.931368 0.777093 +vt 0.916296 0.761343 +vt 0.898178 0.634905 +vt 0.907155 0.643402 +vt 0.905882 0.627902 +vt 0.918885 0.632367 +vt 0.918179 0.780977 +vt 0.906950 0.769432 +vt 0.904990 0.784860 +vt 0.897604 0.777521 +vt 0.906057 0.616822 +vt 0.919430 0.615878 +vt 0.906232 0.605742 +vt 0.919975 0.599389 +vt 0.933717 0.593037 +vt 0.932803 0.614935 +vt 0.931250 0.820926 +vt 0.917804 0.813969 +vt 0.917991 0.797473 +vt 0.931309 0.799010 +vt 0.904357 0.807013 +vt 0.904674 0.795936 +vt 0.950598 0.612253 +vt 0.951055 0.583425 +vt 0.968392 0.573812 +vt 0.968392 0.609573 +vt 0.965038 0.841671 +vt 0.948144 0.831298 +vt 0.948967 0.802477 +vt 0.966626 0.805946 +vt 0.919144 0.576221 +vt 0.931712 0.562700 +vt 0.944279 0.549179 +vt 0.927900 0.851144 +vt 0.939855 0.865209 +vt 0.915945 0.837079 +vt 0.898593 0.597902 +vt 0.908869 0.587062 +vt 0.906161 0.825792 +vt 0.896378 0.814506 +vt 0.897284 0.599247 +vt 0.890273 0.591669 +vt 0.904296 0.606825 +vt 0.902359 0.607909 +vt 0.895975 0.600592 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.902470 0.805845 +vt 0.895129 0.813105 +vt 0.893880 0.811703 +vt 0.887788 0.820364 +vt 0.887178 0.818729 +vt 0.903563 0.616952 +vt 0.902831 0.627079 +vt 0.899781 0.626257 +vt 0.901070 0.617083 +vt 0.898822 0.786233 +vt 0.901906 0.785547 +vt 0.902188 0.795696 +vt 0.899703 0.795455 +vt 0.895995 0.633149 +vt 0.889158 0.639218 +vt 0.887842 0.636527 +vt 0.893811 0.631392 +vt 0.887351 0.775442 +vt 0.888785 0.772812 +vt 0.895346 0.779179 +vt 0.893086 0.780838 +vt 0.879183 0.638993 +vt 0.869208 0.638768 +vt 0.870908 0.635245 +vt 0.879375 0.635886 +vt 0.870376 0.775972 +vt 0.868834 0.772377 +vt 0.878810 0.772595 +vt 0.878863 0.775707 +vt 0.863101 0.631734 +vt 0.856994 0.624701 +vt 0.859881 0.623942 +vt 0.865394 0.629593 +vt 0.858859 0.786774 +vt 0.856008 0.785888 +vt 0.862421 0.779132 +vt 0.864617 0.781373 +vt 0.857013 0.615585 +vt 0.857033 0.606470 +vt 0.859664 0.608186 +vt 0.859773 0.616064 +vt 0.857942 0.802505 +vt 0.855238 0.804103 +vt 0.855623 0.794995 +vt 0.858400 0.794639 +vt 0.864088 0.599137 +vt 0.871143 0.591805 +vt 0.871664 0.593961 +vt 0.865664 0.601074 +vt 0.869299 0.817249 +vt 0.868683 0.819380 +vt 0.861961 0.811741 +vt 0.863621 0.809877 +vt 0.880708 0.591737 +vt 0.880628 0.593618 +vt 0.878235 0.819872 +vt 0.878238 0.817989 +vt 0.879400 0.616512 +vt 0.875532 0.605237 +vt 0.880218 0.601249 +vt 0.884495 0.604894 +vt 0.878169 0.810347 +vt 0.882604 0.806896 +vt 0.873664 0.806156 +vt 0.878029 0.795063 +vt 0.870243 0.606220 +vt 0.869532 0.612349 +vt 0.868423 0.804939 +vt 0.867985 0.798784 +vt 0.869640 0.620227 +vt 0.866315 0.616213 +vt 0.864943 0.794781 +vt 0.868444 0.790918 +vt 0.875154 0.625879 +vt 0.870063 0.625233 +vt 0.869088 0.785936 +vt 0.874202 0.785518 +vt 0.883621 0.626520 +vt 0.879383 0.629428 +vt 0.878585 0.782159 +vt 0.882690 0.785253 +vt 0.889591 0.621385 +vt 0.889008 0.626432 +vt 0.888067 0.785579 +vt 0.888425 0.790648 +vt 0.890880 0.612211 +vt 0.893847 0.616893 +vt 0.892478 0.795324 +vt 0.889306 0.799870 +vt 0.890450 0.605899 +vt 0.888597 0.806156 +vt 0.540260 0.053805 +vt 0.538339 0.057939 +vt 0.528630 0.056463 +vt 0.529588 0.052050 +vt 0.536419 0.062072 +vt 0.527672 0.060876 +vt 0.518925 0.059681 +vt 0.518921 0.054987 +vt 0.518916 0.050294 +vt 0.510189 0.060862 +vt 0.509230 0.056447 +vt 0.501452 0.062043 +vt 0.499539 0.057907 +vt 0.497626 0.053770 +vt 0.508271 0.052032 +vt 0.551930 0.058338 +vt 0.547359 0.061214 +vt 0.542849 0.059576 +vt 0.546095 0.056072 +vt 0.542788 0.064089 +vt 0.539603 0.063081 +vt 0.498268 0.063045 +vt 0.495029 0.059533 +vt 0.495083 0.064047 +vt 0.490519 0.061160 +vt 0.485955 0.058273 +vt 0.491791 0.056021 +vt 0.555073 0.061900 +vt 0.550681 0.067285 +vt 0.549020 0.064249 +vt 0.553501 0.060119 +vt 0.546290 0.072669 +vt 0.544539 0.068379 +vt 0.493324 0.068336 +vt 0.488852 0.064193 +vt 0.491565 0.072625 +vt 0.487185 0.067227 +vt 0.482805 0.061829 +vt 0.484380 0.060051 +vt 0.563812 0.076586 +vt 0.556072 0.080739 +vt 0.553377 0.074012 +vt 0.559443 0.069243 +vt 0.548333 0.084893 +vt 0.547311 0.078781 +vt 0.490536 0.078741 +vt 0.484473 0.073956 +vt 0.489507 0.084858 +vt 0.481761 0.080684 +vt 0.474014 0.076511 +vt 0.478410 0.069170 +vt 0.583135 0.108495 +vt 0.569378 0.115122 +vt 0.562725 0.097931 +vt 0.573474 0.092541 +vt 0.555621 0.121749 +vt 0.551977 0.103321 +vt 0.485842 0.103319 +vt 0.475056 0.097908 +vt 0.482177 0.121781 +vt 0.468352 0.115131 +vt 0.454527 0.108481 +vt 0.464271 0.092496 +vt 0.605512 0.165134 +vt 0.626454 0.182818 +vt 0.606884 0.200763 +vt 0.579315 0.187367 +vt 0.647395 0.200502 +vt 0.634454 0.214160 +vt 0.621513 0.227818 +vt 0.587315 0.218709 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.403095 0.215690 +vt 0.430888 0.201769 +vt 0.450926 0.219772 +vt 0.389677 0.201890 +vt 0.410850 0.183767 +vt 0.432024 0.165644 +vt 0.458681 0.187849 +vt 0.485339 0.210053 +vt 0.661887 0.216872 +vt 0.652512 0.228696 +vt 0.676379 0.233241 +vt 0.670570 0.243233 +vt 0.664761 0.253225 +vt 0.643137 0.240521 +vt 0.372747 0.256357 +vt 0.366527 0.246128 +vt 0.384811 0.230909 +vt 0.394630 0.242923 +vt 0.360308 0.235899 +vt 0.374992 0.218895 +vt 0.695861 0.249317 +vt 0.685098 0.257963 +vt 0.715342 0.265392 +vt 0.699625 0.272694 +vt 0.683908 0.279995 +vt 0.674335 0.266610 +vt 0.353696 0.284606 +vt 0.337074 0.277454 +vt 0.351801 0.261791 +vt 0.363221 0.270482 +vt 0.320452 0.270303 +vt 0.340380 0.253101 +vt 0.711298 0.287723 +vt 0.698505 0.291745 +vt 0.707254 0.310054 +vt 0.697384 0.310796 +vt 0.687515 0.311539 +vt 0.685712 0.295767 +vt 0.351187 0.317440 +vt 0.340954 0.317146 +vt 0.339014 0.297300 +vt 0.352441 0.301023 +vt 0.330721 0.316853 +vt 0.325586 0.293578 +vt 0.702350 0.321364 +vt 0.692260 0.319551 +vt 0.697446 0.332673 +vt 0.687135 0.328305 +vt 0.676824 0.323937 +vt 0.682169 0.317738 +vt 0.362723 0.329722 +vt 0.352343 0.334695 +vt 0.346649 0.325920 +vt 0.356955 0.323581 +vt 0.341964 0.339667 +vt 0.336343 0.328260 +vt 0.680131 0.352597 +vt 0.669034 0.346615 +vt 0.662817 0.372521 +vt 0.650934 0.364926 +vt 0.639050 0.357330 +vt 0.657937 0.340634 +vt 0.402772 0.362131 +vt 0.391034 0.370409 +vt 0.371689 0.352552 +vt 0.382748 0.345926 +vt 0.379297 0.378686 +vt 0.360631 0.359177 +vt 0.644830 0.384157 +vt 0.636756 0.375199 +vt 0.626842 0.395792 +vt 0.622579 0.385472 +vt 0.618316 0.375151 +vt 0.628683 0.366241 +vt 0.424583 0.379267 +vt 0.420749 0.389910 +vt 0.405892 0.380159 +vt 0.413678 0.370699 +vt 0.416915 0.400552 +vt 0.398106 0.389619 +vt 0.615834 0.396798 +vt 0.612698 0.386651 +vt 0.604826 0.397804 +vt 0.602817 0.387830 +vt 0.600808 0.377857 +vt 0.609562 0.376504 +vt 0.442396 0.381222 +vt 0.440824 0.391381 +vt 0.430786 0.390645 +vt 0.433490 0.380244 +vt 0.439252 0.401540 +vt 0.428083 0.401046 +vt 0.578960 0.394158 +vt 0.579601 0.380796 +vt 0.553095 0.390512 +vt 0.556385 0.373761 +vt 0.559674 0.357011 +vt 0.580241 0.367434 +vt 0.482938 0.358497 +vt 0.486936 0.375179 +vt 0.463880 0.383280 +vt 0.462667 0.369860 +vt 0.490934 0.391862 +vt 0.465093 0.396701 +vt 0.537509 0.388260 +vt 0.538944 0.369350 +vt 0.521923 0.386009 +vt 0.521505 0.364938 +vt 0.521086 0.343868 +vt 0.540380 0.350439 +vt 0.504220 0.370059 +vt 0.502012 0.351182 +vt 0.506428 0.388936 +vt 0.577279 0.340156 +vt 0.588562 0.342485 +vt 0.584401 0.354960 +vt 0.568476 0.348583 +vt 0.599845 0.344815 +vt 0.600327 0.361336 +vt 0.442186 0.364519 +vt 0.457972 0.357441 +vt 0.441977 0.347815 +vt 0.453278 0.345022 +vt 0.464579 0.342230 +vt 0.473758 0.350363 +vt 0.607695 0.343410 +vt 0.608629 0.359957 +vt 0.615546 0.342005 +vt 0.616931 0.358578 +vt 0.425278 0.362424 +vt 0.433732 0.363472 +vt 0.425972 0.345582 +vt 0.433975 0.346699 +vt 0.634472 0.332311 +vt 0.636761 0.344820 +vt 0.626846 0.351699 +vt 0.625009 0.337158 +vt 0.414922 0.355865 +vt 0.404567 0.349306 +vt 0.406362 0.336480 +vt 0.416167 0.341031 +vt 0.662406 0.312804 +vt 0.669615 0.318371 +vt 0.653188 0.331596 +vt 0.648439 0.322558 +vt 0.387230 0.336504 +vt 0.369892 0.323703 +vt 0.377061 0.317685 +vt 0.391712 0.327083 +vt 0.668440 0.297958 +vt 0.677978 0.304748 +vt 0.673796 0.311559 +vt 0.665423 0.305381 +vt 0.365319 0.316873 +vt 0.360745 0.310042 +vt 0.370304 0.302644 +vt 0.373682 0.310165 +vt 0.664101 0.277872 +vt 0.674004 0.278933 +vt 0.675991 0.291841 +vt 0.666270 0.287915 +vt 0.362322 0.296617 +vt 0.363898 0.283192 +vt 0.374100 0.281778 +vt 0.372202 0.292211 +vt 0.639236 0.253047 +vt 0.651999 0.253136 +vt 0.663002 0.266035 +vt 0.651668 0.265459 +vt 0.374870 0.269594 +vt 0.385843 0.255995 +vt 0.398938 0.255633 +vt 0.386519 0.268705 +vt 0.613992 0.242662 +vt 0.617752 0.235240 +vt 0.634875 0.244188 +vt 0.626614 0.247855 +vt 0.403166 0.246488 +vt 0.420489 0.236981 +vt 0.424464 0.244473 +vt 0.411701 0.250053 +vt 0.572941 0.258564 +vt 0.563030 0.234082 +vt 0.590391 0.234661 +vt 0.593467 0.250613 +vt 0.448181 0.235931 +vt 0.475874 0.234881 +vt 0.466409 0.259709 +vt 0.445436 0.252091 +vt 0.568423 0.265285 +vt 0.552431 0.247258 +vt 0.563905 0.272007 +vt 0.541833 0.260435 +vt 0.519760 0.248864 +vt 0.536439 0.229232 +vt 0.497823 0.260971 +vt 0.486848 0.247926 +vt 0.502550 0.229458 +vt 0.475886 0.273078 +vt 0.471147 0.266393 +vt 0.554142 0.339407 +vt 0.567903 0.328375 +vt 0.539806 0.330231 +vt 0.558527 0.316594 +vt 0.487805 0.340609 +vt 0.501853 0.330855 +vt 0.473599 0.330036 +vt 0.482619 0.317843 +vt 0.539203 0.311610 +vt 0.557725 0.303904 +vt 0.520682 0.319316 +vt 0.520277 0.294764 +vt 0.538600 0.292989 +vt 0.556923 0.291214 +vt 0.501854 0.312181 +vt 0.501855 0.293507 +vt 0.483026 0.305046 +vt 0.483433 0.292249 +vt 0.540216 0.276712 +vt 0.520019 0.271814 +vt 0.560414 0.281610 +vt 0.479659 0.282663 +vt 0.499839 0.277239 +vt 0.525483 0.068967 +vt 0.522205 0.068433 +vt 0.524939 0.064655 +vt 0.530951 0.065519 +vt 0.518928 0.067899 +vt 0.518927 0.063790 +vt 0.512920 0.064645 +vt 0.515651 0.068428 +vt 0.512375 0.068956 +vt 0.506914 0.065499 +vt 0.531231 0.073829 +vt 0.528357 0.071398 +vt 0.533980 0.067239 +vt 0.537009 0.068959 +vt 0.503884 0.067214 +vt 0.509501 0.071384 +vt 0.506626 0.073811 +vt 0.500854 0.068929 +vt 0.531019 0.087431 +vt 0.531125 0.080630 +vt 0.537832 0.074505 +vt 0.538654 0.080050 +vt 0.500025 0.074475 +vt 0.506727 0.080614 +vt 0.506827 0.087416 +vt 0.499196 0.080021 +vt 0.543832 0.124731 +vt 0.542166 0.106319 +vt 0.532042 0.127713 +vt 0.532356 0.109316 +vt 0.532669 0.090920 +vt 0.540501 0.087907 +vt 0.505177 0.090908 +vt 0.505503 0.109318 +vt 0.495672 0.106319 +vt 0.497342 0.087883 +vt 0.505828 0.127728 +vt 0.494003 0.124755 +vt 0.539578 0.083978 +vt 0.531844 0.089175 +vt 0.498269 0.083952 +vt 0.506002 0.089162 +vt 0.538112 0.158382 +vt 0.528546 0.155066 +vt 0.527019 0.141551 +vt 0.535077 0.143047 +vt 0.518981 0.151749 +vt 0.518961 0.140054 +vt 0.518941 0.128358 +vt 0.525491 0.128036 +vt 0.510900 0.141567 +vt 0.512385 0.128043 +vt 0.509416 0.155091 +vt 0.499851 0.158434 +vt 0.502840 0.143081 +vt 0.525644 0.110236 +vt 0.525797 0.092436 +vt 0.518933 0.111155 +vt 0.518925 0.093952 +vt 0.512218 0.110236 +vt 0.512051 0.092430 +vt 0.518927 0.085180 +vt 0.524973 0.086305 +vt 0.525385 0.089371 +vt 0.518926 0.089566 +vt 0.512464 0.089364 +vt 0.512877 0.086298 +vt 0.548362 0.173560 +vt 0.543160 0.174763 +vt 0.539912 0.168679 +vt 0.543237 0.165971 +vt 0.537959 0.175966 +vt 0.536587 0.171387 +vt 0.535214 0.166808 +vt 0.536663 0.162595 +vt 0.502799 0.166857 +vt 0.501449 0.171445 +vt 0.498108 0.168754 +vt 0.501325 0.162646 +vt 0.500100 0.176033 +vt 0.494892 0.174863 +vt 0.489683 0.173693 +vt 0.494767 0.166064 +vt 0.544281 0.193366 +vt 0.540765 0.190472 +vt 0.541963 0.182617 +vt 0.546322 0.183463 +vt 0.537248 0.187577 +vt 0.537603 0.181771 +vt 0.500495 0.181802 +vt 0.496167 0.182681 +vt 0.500890 0.187571 +vt 0.497443 0.190499 +vt 0.493996 0.193428 +vt 0.491839 0.183560 +vt 0.519841 0.200843 +vt 0.524299 0.196314 +vt 0.532532 0.193393 +vt 0.532061 0.197105 +vt 0.528757 0.191785 +vt 0.533002 0.189681 +vt 0.505054 0.189599 +vt 0.505986 0.193367 +vt 0.509219 0.191626 +vt 0.514530 0.196234 +vt 0.506918 0.197136 +vt 0.517577 0.190607 +vt 0.518355 0.187994 +vt 0.521327 0.192154 +vt 0.518709 0.195725 +vt 0.519132 0.185382 +vt 0.523944 0.188583 +vt 0.514176 0.188504 +vt 0.516442 0.192115 +vt 0.527826 0.158992 +vt 0.518990 0.155389 +vt 0.527106 0.162918 +vt 0.518998 0.159028 +vt 0.510157 0.159017 +vt 0.510898 0.162942 +vt 0.526090 0.165766 +vt 0.519007 0.162313 +vt 0.533172 0.169219 +vt 0.531131 0.171631 +vt 0.525074 0.168615 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.504855 0.169262 +vt 0.511931 0.165788 +vt 0.512963 0.168633 +vt 0.519116 0.182419 +vt 0.523803 0.185735 +vt 0.519099 0.179457 +vt 0.523661 0.182886 +vt 0.528222 0.186316 +vt 0.528489 0.189050 +vt 0.509787 0.186260 +vt 0.514443 0.182858 +vt 0.514309 0.185681 +vt 0.509503 0.188943 +vt 0.531939 0.187473 +vt 0.530875 0.185265 +vt 0.533528 0.184215 +vt 0.535388 0.185896 +vt 0.504547 0.184206 +vt 0.507167 0.185233 +vt 0.506111 0.187416 +vt 0.502719 0.185888 +vt 0.535546 0.181124 +vt 0.533489 0.180477 +vt 0.533449 0.176739 +vt 0.535704 0.176353 +vt 0.504604 0.176791 +vt 0.504575 0.180498 +vt 0.502535 0.181150 +vt 0.502352 0.176412 +vt 0.534438 0.172786 +vt 0.532290 0.174185 +vt 0.505757 0.174229 +vt 0.503603 0.172837 +vt 0.526274 0.178098 +vt 0.528574 0.181682 +vt 0.509509 0.181678 +vt 0.511851 0.178124 +vt 0.519058 0.172528 +vt 0.525674 0.173357 +vt 0.512407 0.173378 +vt 0.534250 0.213168 +vt 0.519801 0.224854 +vt 0.548699 0.201483 +vt 0.489667 0.201741 +vt 0.504734 0.213297 +vt 0.551833 0.186076 +vt 0.554967 0.170669 +vt 0.561572 0.167779 +vt 0.557345 0.188689 +vt 0.476363 0.167996 +vt 0.483023 0.170844 +vt 0.486345 0.186292 +vt 0.480851 0.189025 +vt 0.551880 0.162260 +vt 0.548793 0.153850 +vt 0.559475 0.149319 +vt 0.560524 0.158549 +vt 0.478371 0.149447 +vt 0.489111 0.153940 +vt 0.486067 0.162392 +vt 0.477367 0.158722 +vt 0.546313 0.139291 +vt 0.557548 0.135534 +vt 0.491557 0.139347 +vt 0.480274 0.135614 +vt 0.589637 0.120960 +vt 0.573592 0.128247 +vt 0.596138 0.133426 +vt 0.577806 0.141373 +vt 0.459883 0.141519 +vt 0.464117 0.128325 +vt 0.441395 0.133592 +vt 0.447961 0.121036 +vt 0.598653 0.140655 +vt 0.579588 0.149602 +vt 0.601169 0.147885 +vt 0.581370 0.157832 +vt 0.456350 0.158095 +vt 0.458117 0.149807 +vt 0.436337 0.148194 +vt 0.438866 0.140893 +vt 0.580343 0.172599 +vt 0.603341 0.156509 +vt 0.457516 0.172972 +vt 0.434180 0.156919 +vt 0.524451 0.085358 +vt 0.529976 0.086194 +vt 0.518926 0.084523 +vt 0.518925 0.083865 +vt 0.523929 0.084411 +vt 0.528933 0.084957 +vt 0.513399 0.085351 +vt 0.513920 0.084405 +vt 0.507871 0.086181 +vt 0.508915 0.084945 +vt 0.530055 0.080412 +vt 0.530133 0.074629 +vt 0.528984 0.080193 +vt 0.529036 0.075429 +vt 0.507797 0.080397 +vt 0.508868 0.080180 +vt 0.507723 0.074613 +vt 0.508820 0.075415 +vt 0.527375 0.072183 +vt 0.524617 0.069738 +vt 0.526394 0.072968 +vt 0.523751 0.070508 +vt 0.510482 0.072171 +vt 0.511463 0.072958 +vt 0.513240 0.069729 +vt 0.514106 0.070501 +vt 0.521773 0.069210 +vt 0.518929 0.068684 +vt 0.521340 0.069988 +vt 0.518929 0.069468 +vt 0.516084 0.069206 +vt 0.516518 0.069984 +vt 0.520792 0.072301 +vt 0.518929 0.071864 +vt 0.522655 0.072739 +vt 0.521560 0.074970 +vt 0.520244 0.074614 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.515201 0.072733 +vt 0.517065 0.072298 +vt 0.517612 0.074612 +vt 0.524646 0.074400 +vt 0.526636 0.076060 +vt 0.524236 0.076691 +vt 0.522898 0.075831 +vt 0.513619 0.076684 +vt 0.511220 0.076049 +vt 0.513211 0.074391 +vt 0.514958 0.075825 +vt 0.526702 0.079241 +vt 0.526767 0.082421 +vt 0.524601 0.079886 +vt 0.524418 0.078288 +vt 0.513252 0.079879 +vt 0.511083 0.082412 +vt 0.511151 0.079231 +vt 0.513435 0.078281 +vt 0.522846 0.082010 +vt 0.518926 0.081598 +vt 0.518926 0.079331 +vt 0.521764 0.079609 +vt 0.515005 0.082005 +vt 0.516089 0.079605 +vt 0.518927 0.076795 +vt 0.521004 0.077111 +vt 0.523080 0.077428 +vt 0.516851 0.077109 +vt 0.514775 0.077422 +vt 0.523466 0.077182 +vt 0.514389 0.077176 +vt 0.565241 0.283355 +vt 0.562637 0.292059 +vt 0.567846 0.274651 +vt 0.571787 0.277295 +vt 0.570069 0.285100 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.275847 +vt 0.474842 0.284556 +vt 0.470024 0.286449 +vt 0.477706 0.293265 +vt 0.471978 0.294282 +vt 0.564222 0.303025 +vt 0.565806 0.313990 +vt 0.570718 0.302145 +vt 0.573085 0.311386 +vt 0.476455 0.304364 +vt 0.469884 0.303681 +vt 0.475204 0.315462 +vt 0.467790 0.313081 +vt 0.573436 0.323961 +vt 0.581067 0.333932 +vt 0.578970 0.319547 +vt 0.584855 0.327708 +vt 0.467866 0.325779 +vt 0.462133 0.321521 +vt 0.460528 0.336096 +vt 0.456477 0.329961 +vt 0.572342 0.268622 +vt 0.576838 0.262592 +vt 0.580734 0.266620 +vt 0.576261 0.271958 +vt 0.458737 0.268049 +vt 0.462573 0.263879 +vt 0.467276 0.269863 +vt 0.463403 0.273333 +vt 0.594847 0.255893 +vt 0.612856 0.249193 +vt 0.611720 0.255725 +vt 0.596227 0.261173 +vt 0.427062 0.257728 +vt 0.425763 0.251101 +vt 0.444168 0.257490 +vt 0.442899 0.262888 +vt 0.624361 0.253572 +vt 0.635865 0.257950 +vt 0.632494 0.262853 +vt 0.622107 0.259289 +vt 0.406068 0.265508 +vt 0.402503 0.260570 +vt 0.414133 0.255836 +vt 0.416565 0.261618 +vt 0.647372 0.268436 +vt 0.658880 0.278921 +vt 0.653658 0.279971 +vt 0.643076 0.271412 +vt 0.384904 0.283634 +vt 0.379502 0.282706 +vt 0.391003 0.271638 +vt 0.395486 0.274571 +vt 0.660566 0.288359 +vt 0.662252 0.297797 +vt 0.656064 0.297636 +vt 0.654861 0.288804 +vt 0.383015 0.301864 +vt 0.376660 0.302254 +vt 0.378081 0.292480 +vt 0.383960 0.292749 +vt 0.659916 0.304646 +vt 0.657579 0.311495 +vt 0.652752 0.310186 +vt 0.654408 0.303911 +vt 0.386858 0.314615 +vt 0.381959 0.316150 +vt 0.379310 0.309202 +vt 0.384937 0.308240 +vt 0.644668 0.319791 +vt 0.631756 0.328088 +vt 0.629040 0.323864 +vt 0.640896 0.317025 +vt 0.411556 0.327673 +vt 0.408959 0.332076 +vt 0.395459 0.324113 +vt 0.399207 0.321144 +vt 0.623366 0.332538 +vt 0.614977 0.336989 +vt 0.614408 0.331972 +vt 0.621724 0.327918 +vt 0.426727 0.335361 +vt 0.426350 0.340472 +vt 0.417654 0.336274 +vt 0.419142 0.331517 +vt 0.607708 0.338104 +vt 0.600439 0.339220 +vt 0.601033 0.333624 +vt 0.607720 0.332798 +vt 0.440344 0.336537 +vt 0.441161 0.342176 +vt 0.433755 0.341324 +vt 0.433536 0.335949 +vt 0.590753 0.336576 +vt 0.592944 0.330666 +vt 0.450844 0.339136 +vt 0.448411 0.333249 +vt 0.594583 0.327825 +vt 0.601416 0.331039 +vt 0.587749 0.324612 +vt 0.590644 0.321516 +vt 0.596222 0.324984 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.453443 0.326940 +vt 0.446650 0.330437 +vt 0.444890 0.327625 +vt 0.439858 0.333934 +vt 0.439372 0.331331 +vt 0.607644 0.330283 +vt 0.613872 0.329527 +vt 0.607567 0.327768 +vt 0.613335 0.327083 +vt 0.433517 0.333397 +vt 0.433497 0.330845 +vt 0.427175 0.332860 +vt 0.427623 0.330358 +vt 0.620908 0.325858 +vt 0.627946 0.322188 +vt 0.620093 0.323798 +vt 0.626851 0.320513 +vt 0.419888 0.329392 +vt 0.420636 0.327267 +vt 0.412602 0.325924 +vt 0.413648 0.324175 +vt 0.638723 0.315246 +vt 0.649500 0.308304 +vt 0.636549 0.313467 +vt 0.646248 0.306421 +vt 0.401361 0.319243 +vt 0.403515 0.317343 +vt 0.390119 0.312563 +vt 0.393381 0.310510 +vt 0.651151 0.302617 +vt 0.652802 0.296930 +vt 0.647895 0.301323 +vt 0.649541 0.296225 +vt 0.388229 0.306793 +vt 0.391522 0.305346 +vt 0.386339 0.301023 +vt 0.389662 0.300183 +vt 0.651762 0.289330 +vt 0.650721 0.281729 +vt 0.648663 0.289856 +vt 0.647785 0.283486 +vt 0.387155 0.293188 +vt 0.390351 0.293627 +vt 0.387972 0.285352 +vt 0.391040 0.287071 +vt 0.640941 0.273393 +vt 0.631161 0.265058 +vt 0.638807 0.275375 +vt 0.629829 0.267263 +vt 0.397726 0.276543 +vt 0.399966 0.278515 +vt 0.407480 0.267734 +vt 0.408893 0.269959 +vt 0.621671 0.261850 +vt 0.612180 0.258642 +vt 0.621235 0.264412 +vt 0.612641 0.261560 +vt 0.417069 0.264222 +vt 0.417574 0.266826 +vt 0.426658 0.260711 +vt 0.426254 0.263693 +vt 0.597565 0.263724 +vt 0.582950 0.268806 +vt 0.598903 0.266275 +vt 0.585166 0.270991 +vt 0.441606 0.265513 +vt 0.440311 0.268138 +vt 0.456553 0.270316 +vt 0.454369 0.272583 +vt 0.578953 0.274202 +vt 0.574955 0.279597 +vt 0.581645 0.276446 +vt 0.578124 0.281900 +vt 0.460743 0.275672 +vt 0.458084 0.278012 +vt 0.464934 0.281029 +vt 0.461798 0.283441 +vt 0.582033 0.317488 +vt 0.576316 0.310363 +vt 0.579548 0.309340 +vt 0.585096 0.315428 +vt 0.461204 0.311233 +vt 0.464497 0.312157 +vt 0.458970 0.319548 +vt 0.455806 0.317576 +vt 0.574627 0.301852 +vt 0.572937 0.293340 +vt 0.577524 0.293776 +vt 0.578536 0.301558 +vt 0.462754 0.295432 +vt 0.467366 0.294857 +vt 0.465932 0.303507 +vt 0.461979 0.303333 +vt 0.573946 0.286469 +vt 0.577824 0.287838 +vt 0.466150 0.287943 +vt 0.462276 0.289437 +vt 0.537814 0.410803 +vt 0.522477 0.409819 +vt 0.553152 0.411788 +vt 0.553209 0.433063 +vt 0.538120 0.433345 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.491872 0.413200 +vt 0.507174 0.411509 +vt 0.507920 0.434083 +vt 0.580237 0.413224 +vt 0.607322 0.414660 +vt 0.609819 0.431516 +vt 0.581514 0.432289 +vt 0.435860 0.435740 +vt 0.437556 0.418640 +vt 0.464714 0.415920 +vt 0.464334 0.435139 +vt 0.622415 0.411107 +vt 0.637508 0.407554 +vt 0.648174 0.419316 +vt 0.628996 0.425416 +vt 0.396518 0.425416 +vt 0.406716 0.412984 +vt 0.422136 0.415812 +vt 0.416189 0.430578 +vt 0.657485 0.393976 +vt 0.677462 0.380397 +vt 0.692106 0.388274 +vt 0.670140 0.403795 +vt 0.350292 0.396229 +vt 0.364794 0.387457 +vt 0.385755 0.400221 +vt 0.373405 0.410823 +vt 0.694675 0.358805 +vt 0.711889 0.337214 +vt 0.726332 0.341754 +vt 0.709219 0.365014 +vt 0.312756 0.350588 +vt 0.327360 0.345127 +vt 0.346077 0.366293 +vt 0.331524 0.373408 +vt 0.716728 0.324148 +vt 0.721566 0.311083 +vt 0.735879 0.312112 +vt 0.731106 0.326933 +vt 0.301067 0.320593 +vt 0.315894 0.318723 +vt 0.321627 0.331925 +vt 0.306911 0.335590 +vt 0.722094 0.285988 +vt 0.722621 0.260893 +vt 0.729900 0.256393 +vt 0.732890 0.284252 +vt 0.304876 0.261087 +vt 0.312664 0.265695 +vt 0.314279 0.292209 +vt 0.302971 0.290840 +vt 0.704948 0.242983 +vt 0.687276 0.225074 +vt 0.698172 0.216906 +vt 0.714036 0.236649 +vt 0.337414 0.219179 +vt 0.348861 0.227539 +vt 0.330762 0.246617 +vt 0.321145 0.240133 +vt 0.671262 0.210330 +vt 0.655249 0.195587 +vt 0.663103 0.190671 +vt 0.680637 0.203788 +vt 0.373474 0.191872 +vt 0.381575 0.196881 +vt 0.365218 0.212210 +vt 0.355444 0.205526 +vt 0.626908 0.015608 +vt 0.638176 0.018993 +vt 0.639561 0.040540 +vt 0.624174 0.031849 +vt 0.649444 0.022378 +vt 0.654948 0.049231 +vt 0.660451 0.076084 +vt 0.640945 0.062087 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.382811 0.048441 +vt 0.398340 0.039911 +vt 0.396608 0.061463 +vt 0.388827 0.021586 +vt 0.400073 0.018359 +vt 0.411318 0.015131 +vt 0.413868 0.031381 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.597184 0.007876 +vt 0.598253 0.024161 +vt 0.572333 0.016472 +vt 0.599323 0.040445 +vt 0.577206 0.032801 +vt 0.439789 0.023890 +vt 0.438600 0.040143 +vt 0.440977 0.007638 +vt 0.470636 0.000144 +vt 0.465709 0.016400 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.543191 0.012515 +vt 0.552750 0.024889 +vt 0.533167 0.033305 +vt 0.562310 0.037262 +vt 0.547413 0.041724 +vt 0.485213 0.024839 +vt 0.475646 0.037162 +vt 0.494779 0.012515 +vt 0.504717 0.033278 +vt 0.490511 0.041669 +vt 0.531378 0.042677 +vt 0.543836 0.047765 +vt 0.518919 0.037590 +vt 0.506494 0.042655 +vt 0.494069 0.047720 +vt 0.549415 0.051935 +vt 0.554994 0.056104 +vt 0.552736 0.047798 +vt 0.558059 0.053871 +vt 0.488483 0.051874 +vt 0.485177 0.047727 +vt 0.482899 0.056029 +vt 0.479842 0.053785 +vt 0.560503 0.058027 +vt 0.566012 0.059949 +vt 0.567505 0.055934 +vt 0.576951 0.057998 +vt 0.477380 0.057933 +vt 0.470381 0.055815 +vt 0.471862 0.059837 +vt 0.460920 0.057845 +vt 0.576881 0.068688 +vt 0.587749 0.077427 +vt 0.594319 0.068133 +vt 0.611687 0.078268 +vt 0.460918 0.068542 +vt 0.443426 0.067915 +vt 0.449973 0.077248 +vt 0.425932 0.077985 +vt 0.577079 0.045400 +vt 0.596821 0.054289 +vt 0.616563 0.063179 +vt 0.441013 0.054029 +vt 0.421175 0.062808 +vt 0.460851 0.045250 +vt 0.564907 0.046599 +vt 0.473014 0.046489 +vt 0.626663 0.111357 +vt 0.619175 0.094812 +vt 0.630060 0.078450 +vt 0.643557 0.093721 +vt 0.407441 0.078039 +vt 0.418275 0.094615 +vt 0.410618 0.111244 +vt 0.393707 0.093270 +vt 0.596324 0.093677 +vt 0.604899 0.109926 +vt 0.441273 0.093555 +vt 0.432572 0.109862 +vt 0.612810 0.131941 +vt 0.612571 0.139641 +vt 0.629482 0.130456 +vt 0.626488 0.138626 +vt 0.623495 0.146796 +vt 0.612332 0.147341 +vt 0.413741 0.147158 +vt 0.410694 0.138876 +vt 0.424780 0.139885 +vt 0.425039 0.147676 +vt 0.407648 0.130594 +vt 0.424522 0.132093 +vt 0.608855 0.120934 +vt 0.628073 0.120907 +vt 0.409133 0.120919 +vt 0.428547 0.120978 +vt 0.612370 0.154914 +vt 0.612408 0.162488 +vt 0.621399 0.153318 +vt 0.619303 0.159841 +vt 0.425034 0.155339 +vt 0.415888 0.153760 +vt 0.425030 0.163003 +vt 0.418035 0.160361 +vt 0.633828 0.179037 +vt 0.641203 0.175256 +vt 0.395755 0.176116 +vt 0.403302 0.179942 +vt 0.945900 0.079569 +vt 0.916072 0.100673 +vt 0.893260 0.084498 +vt 0.918840 0.058242 +vt 0.886245 0.121777 +vt 0.867679 0.110754 +vt 0.849114 0.099732 +vt 0.870447 0.068324 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.162215 0.102305 +vt 0.136417 0.071699 +vt 0.162696 0.056797 +vt 0.141314 0.112482 +vt 0.110137 0.086600 +vt 0.078961 0.060719 +vt 0.110619 0.041093 +vt 0.142277 0.021467 +vt 0.833734 0.057065 +vt 0.848682 0.023851 +vt 0.818786 0.090279 +vt 0.788458 0.080826 +vt 0.797021 0.045806 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.214734 0.084319 +vt 0.201098 0.048397 +vt 0.239500 0.039997 +vt 0.187463 0.012475 +vt 0.232648 0.003484 +vt 0.738361 0.047754 +vt 0.738984 0.016493 +vt 0.737738 0.079015 +vt 0.687018 0.077204 +vt 0.679701 0.049702 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.298114 0.076233 +vt 0.298714 0.044235 +vt 0.357927 0.048473 +vt 0.299313 0.012237 +vt 0.365979 0.020991 +vt 0.667324 0.049467 +vt 0.660914 0.022289 +vt 0.673734 0.076644 +vt 0.363335 0.075626 +vt 0.370369 0.048457 +vt 0.377403 0.021288 +vt 0.650904 0.098775 +vt 0.658250 0.103830 +vt 0.386234 0.098272 +vt 0.378762 0.103275 +vt 0.744333 0.224966 +vt 0.759473 0.244858 +vt 0.729193 0.205075 +vt 0.760215 0.193244 +vt 0.774630 0.213283 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.304484 0.206525 +vt 0.288775 0.227778 +vt 0.256404 0.215424 +vt 0.273066 0.249032 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.951818 0.175483 +vt 0.933945 0.138078 +vt 0.970213 0.123637 +vt 0.909112 0.183261 +vt 0.897678 0.152519 +vt 0.124621 0.145783 +vt 0.085008 0.126913 +vt 0.107928 0.179083 +vt 0.059878 0.167225 +vt 0.011829 0.155367 +vt 0.045395 0.108043 +vt 0.911671 0.402429 +vt 0.887269 0.370493 +vt 0.907892 0.346905 +vt 0.937286 0.373591 +vt 0.862868 0.338556 +vt 0.878498 0.320220 +vt 0.894128 0.301884 +vt 0.928514 0.323318 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.142166 0.336170 +vt 0.108675 0.368008 +vt 0.083872 0.341278 +vt 0.160557 0.356821 +vt 0.133478 0.394736 +vt 0.106400 0.432652 +vt 0.075184 0.399845 +vt 0.043968 0.367038 +vt 0.943061 0.290270 +vt 0.981378 0.299696 +vt 0.904744 0.280844 +vt 0.915360 0.259804 +vt 0.957608 0.257222 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.111371 0.291243 +vt 0.066713 0.302159 +vt 0.049554 0.263041 +vt 0.022056 0.313076 +vt 0.000144 0.259113 +vt 0.954713 0.216353 +vt 0.997190 0.211173 +vt 0.912236 0.221533 +vt 0.103446 0.223026 +vt 0.054717 0.215133 +vt 0.005987 0.207240 +vt 0.749542 0.334683 +vt 0.742710 0.323398 +vt 0.760230 0.315333 +vt 0.769352 0.324205 +vt 0.751108 0.306460 +vt 0.766337 0.300809 +vt 0.777749 0.307268 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.284238 0.315368 +vt 0.274913 0.325696 +vt 0.255200 0.317847 +vt 0.294625 0.333544 +vt 0.288183 0.346496 +vt 0.265588 0.336024 +vt 0.242992 0.325552 +vt 0.804247 0.296080 +vt 0.817668 0.303562 +vt 0.790825 0.288598 +vt 0.815314 0.276388 +vt 0.830744 0.284892 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.240237 0.297653 +vt 0.225501 0.306460 +vt 0.195801 0.295074 +vt 0.210764 0.315268 +vt 0.178537 0.304983 +vt 0.845003 0.273015 +vt 0.859846 0.279660 +vt 0.830160 0.266370 +vt 0.845007 0.256352 +vt 0.859262 0.261137 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.196364 0.274238 +vt 0.179588 0.281936 +vt 0.163375 0.268798 +vt 0.162813 0.289634 +vt 0.147089 0.274284 +vt 0.866150 0.246053 +vt 0.880258 0.249846 +vt 0.852041 0.242260 +vt 0.859075 0.228168 +vt 0.873037 0.230969 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.171232 0.247516 +vt 0.155267 0.251726 +vt 0.147159 0.234654 +vt 0.139302 0.255935 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.858693 0.189932 +vt 0.865865 0.210451 +vt 0.850715 0.211664 +vt 0.875030 0.184705 +vt 0.881014 0.209237 +vt 0.138369 0.210168 +vt 0.154082 0.212059 +vt 0.145224 0.182749 +vt 0.161006 0.189464 +vt 0.176788 0.196179 +vt 0.169795 0.213950 +vt 0.896625 0.215385 +vt 0.892071 0.183983 +vt 0.901179 0.246787 +vt 0.115240 0.252277 +vt 0.120908 0.216597 +vt 0.126576 0.180916 +vt 0.892501 0.265345 +vt 0.883823 0.283903 +vt 0.135433 0.294901 +vt 0.125336 0.273589 +vt 0.869172 0.299940 +vt 0.854521 0.315977 +vt 0.169547 0.330902 +vt 0.152490 0.312902 +vt 0.828577 0.351309 +vt 0.823123 0.327435 +vt 0.794286 0.364062 +vt 0.791724 0.338894 +vt 0.241384 0.354072 +vt 0.205465 0.342487 +vt 0.239776 0.382592 +vt 0.200166 0.369707 +vt 0.770185 0.379538 +vt 0.759863 0.357111 +vt 0.775794 0.348002 +vt 0.782236 0.371800 +vt 0.259768 0.363344 +vt 0.278152 0.372616 +vt 0.268122 0.398737 +vt 0.253949 0.390665 +vt 0.845499 0.449967 +vt 0.819893 0.407014 +vt 0.853581 0.388754 +vt 0.878585 0.426198 +vt 0.173003 0.414041 +vt 0.212528 0.433345 +vt 0.185281 0.484099 +vt 0.145840 0.458376 +vt 0.815858 0.445381 +vt 0.793215 0.444821 +vt 0.778079 0.421946 +vt 0.793022 0.412459 +vt 0.770572 0.444261 +vt 0.763136 0.431432 +vt 0.755700 0.418603 +vt 0.762942 0.399071 +vt 0.287033 0.442912 +vt 0.279198 0.458114 +vt 0.261445 0.448038 +vt 0.277577 0.420825 +vt 0.271364 0.473316 +vt 0.245312 0.475251 +vt 0.219260 0.477186 +vt 0.243691 0.437962 +vt 0.806457 0.409737 +vt 0.830678 0.447674 +vt 0.228110 0.435654 +vt 0.202271 0.480642 +vt 0.819845 0.468071 +vt 0.817852 0.456726 +vt 0.827067 0.454473 +vt 0.832672 0.459019 +vt 0.206812 0.488297 +vt 0.200587 0.493852 +vt 0.217577 0.490395 +vt 0.215894 0.503605 +vt 0.755291 0.275659 +vt 0.777691 0.267066 +vt 0.278652 0.282200 +vt 0.254331 0.273560 +vt 0.799338 0.233605 +vt 0.795082 0.261102 +vt 0.809631 0.233887 +vt 0.812472 0.255138 +vt 0.216117 0.261276 +vt 0.235224 0.267418 +vt 0.219168 0.237388 +vt 0.230211 0.237182 +vt 0.819459 0.226725 +vt 0.824810 0.246547 +vt 0.829287 0.219562 +vt 0.837147 0.237957 +vt 0.189364 0.242888 +vt 0.202740 0.252082 +vt 0.199067 0.222464 +vt 0.209118 0.229926 +vt 0.843931 0.224810 +vt 0.835821 0.207361 +vt 0.179580 0.228419 +vt 0.187927 0.209321 +vt 0.744359 0.103837 +vt 0.701250 0.108465 +vt 0.787469 0.099209 +vt 0.786480 0.117591 +vt 0.750981 0.128659 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.246509 0.095680 +vt 0.290608 0.101681 +vt 0.283102 0.127129 +vt 0.334706 0.107682 +vt 0.319538 0.139409 +vt 0.737849 0.166485 +vt 0.761916 0.150723 +vt 0.772851 0.172787 +vt 0.785983 0.134961 +vt 0.785486 0.152330 +vt 0.270931 0.149783 +vt 0.246318 0.132926 +vt 0.295546 0.166640 +vt 0.258761 0.172437 +vt 0.245969 0.151002 +vt 0.709243 0.185137 +vt 0.689292 0.165199 +vt 0.346506 0.165641 +vt 0.325495 0.186083 +vt 0.643299 0.168734 +vt 0.657890 0.151913 +vt 0.672482 0.135091 +vt 0.378600 0.152258 +vt 0.363593 0.135002 +vt 0.393607 0.169515 +vt 0.677327 0.115796 +vt 0.359020 0.115319 +vt 0.635300 0.165769 +vt 0.401750 0.166464 +vt 0.839869 0.175761 +vt 0.853235 0.168500 +vt 0.837382 0.156361 +vt 0.847777 0.147068 +vt 0.858171 0.137775 +vt 0.866601 0.161240 +vt 0.171653 0.132294 +vt 0.184137 0.143768 +vt 0.172572 0.166616 +vt 0.158439 0.157522 +vt 0.196622 0.155241 +vt 0.186705 0.175710 +vt 0.882140 0.156879 +vt 0.872208 0.129776 +vt 0.141530 0.151652 +vt 0.156484 0.122388 +vt 0.816880 0.141014 +vt 0.811434 0.154345 +vt 0.822325 0.127683 +vt 0.209159 0.123572 +vt 0.215227 0.138347 +vt 0.221296 0.153122 +vt 0.820556 0.108981 +vt 0.853642 0.118754 +vt 0.177384 0.112210 +vt 0.211947 0.103945 +vt 0.864510 0.119761 +vt 0.165361 0.112301 +vt 0.506166 0.904851 +vt 0.469277 0.899897 +vt 0.467102 0.887934 +vt 0.498612 0.893283 +vt 0.432388 0.894943 +vt 0.435593 0.882586 +vt 0.438797 0.870229 +vt 0.464927 0.875971 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.318752 0.880717 +vt 0.286936 0.885229 +vt 0.289450 0.873265 +vt 0.321637 0.893225 +vt 0.284422 0.897192 +vt 0.247207 0.901159 +vt 0.255120 0.889740 +vt 0.263032 0.878321 +vt 0.543710 0.881749 +vt 0.555496 0.892398 +vt 0.531925 0.871099 +vt 0.572792 0.860484 +vt 0.588809 0.870215 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.222259 0.866507 +vt 0.210113 0.876880 +vt 0.165107 0.864021 +vt 0.197968 0.887254 +vt 0.148729 0.873349 +vt 0.595994 0.831506 +vt 0.612393 0.835781 +vt 0.579594 0.827231 +vt 0.586396 0.793977 +vt 0.603179 0.792796 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.175615 0.821083 +vt 0.159006 0.824902 +vt 0.152904 0.785784 +vt 0.142396 0.828721 +vt 0.136063 0.784093 +vt 0.579793 0.767804 +vt 0.591874 0.765413 +vt 0.567711 0.770195 +vt 0.549027 0.746412 +vt 0.556406 0.742812 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.189200 0.764176 +vt 0.177137 0.761422 +vt 0.201371 0.737060 +vt 0.165074 0.758667 +vt 0.194086 0.733241 +vt 0.530349 0.723761 +vt 0.536028 0.718452 +vt 0.524670 0.729070 +vt 0.500314 0.711729 +vt 0.504292 0.704711 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.233528 0.724188 +vt 0.227988 0.718717 +vt 0.254605 0.700373 +vt 0.222448 0.713245 +vt 0.250811 0.693249 +vt 0.470507 0.687247 +vt 0.471537 0.678288 +vt 0.469478 0.696206 +vt 0.438641 0.680683 +vt 0.436722 0.669783 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.289681 0.692728 +vt 0.288873 0.683732 +vt 0.323140 0.667091 +vt 0.288065 0.674736 +vt 0.325318 0.656224 +vt 0.502990 0.721336 +vt 0.474394 0.705845 +vt 0.505666 0.730944 +vt 0.479311 0.715483 +vt 0.452955 0.700023 +vt 0.445798 0.690353 +vt 0.306136 0.696976 +vt 0.279330 0.711784 +vt 0.284505 0.702256 +vt 0.313549 0.687468 +vt 0.252524 0.726592 +vt 0.255462 0.717044 +vt 0.545938 0.751082 +vt 0.524464 0.736210 +vt 0.542850 0.755753 +vt 0.524258 0.743348 +vt 0.233549 0.738503 +vt 0.233538 0.731346 +vt 0.214575 0.750414 +vt 0.211616 0.745646 +vt 0.577272 0.790672 +vt 0.561605 0.770877 +vt 0.568148 0.787367 +vt 0.555499 0.771560 +vt 0.201422 0.765895 +vt 0.195311 0.765036 +vt 0.188269 0.781375 +vt 0.179007 0.784424 +vt 0.564144 0.843418 +vt 0.570708 0.817045 +vt 0.555495 0.826352 +vt 0.561822 0.806859 +vt 0.194059 0.801132 +vt 0.184837 0.811108 +vt 0.199850 0.820889 +vt 0.190668 0.837791 +vt 0.496145 0.863035 +vt 0.530144 0.853227 +vt 0.501231 0.844356 +vt 0.528363 0.835354 +vt 0.226848 0.830696 +vt 0.224553 0.848601 +vt 0.253846 0.840502 +vt 0.258439 0.859411 +vt 0.472229 0.859085 +vt 0.448314 0.855134 +vt 0.457832 0.840040 +vt 0.479532 0.842198 +vt 0.297562 0.837358 +vt 0.306715 0.852784 +vt 0.282577 0.856098 +vt 0.275704 0.838930 +vt 0.781229 0.177498 +vt 0.771704 0.190346 +vt 0.790753 0.164650 +vt 0.796021 0.176969 +vt 0.789607 0.182209 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.239797 0.163311 +vt 0.249526 0.176892 +vt 0.240290 0.181348 +vt 0.259254 0.190473 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.412921 0.635386 +vt 0.414812 0.659395 +vt 0.392902 0.649008 +vt 0.416704 0.683404 +vt 0.394766 0.686125 +vt 0.345258 0.657206 +vt 0.342900 0.681202 +vt 0.347616 0.633210 +vt 0.369913 0.610196 +vt 0.367375 0.647321 +vt 0.364838 0.684445 +vt 0.785521 0.211976 +vt 0.796412 0.210668 +vt 0.244733 0.213828 +vt 0.233062 0.212232 +vt 0.391747 0.862097 +vt 0.396676 0.851779 +vt 0.416134 0.867182 +vt 0.412068 0.878520 +vt 0.401605 0.841460 +vt 0.420201 0.855844 +vt 0.334947 0.854253 +vt 0.338727 0.865760 +vt 0.354026 0.840297 +vt 0.358701 0.850802 +vt 0.363377 0.861308 +vt 0.342507 0.877267 +vt 0.430345 0.696278 +vt 0.443987 0.709152 +vt 0.435018 0.718280 +vt 0.414892 0.702202 +vt 0.323658 0.715731 +vt 0.314897 0.706354 +vt 0.328898 0.693778 +vt 0.344248 0.700088 +vt 0.433669 0.729661 +vt 0.409164 0.719980 +vt 0.412028 0.711091 +vt 0.434344 0.723971 +vt 0.384658 0.710299 +vt 0.389712 0.698212 +vt 0.369619 0.696707 +vt 0.346905 0.709081 +vt 0.374400 0.708969 +vt 0.349563 0.718073 +vt 0.324726 0.727177 +vt 0.324192 0.721454 +vt 0.410995 0.747662 +vt 0.397826 0.728981 +vt 0.414283 0.732612 +vt 0.419403 0.745245 +vt 0.430741 0.736244 +vt 0.427812 0.742828 +vt 0.344106 0.730624 +vt 0.327498 0.733856 +vt 0.360714 0.727392 +vt 0.347028 0.745816 +vt 0.338649 0.743176 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.401371 0.790184 +vt 0.399599 0.759583 +vt 0.414540 0.766304 +vt 0.384657 0.795423 +vt 0.384658 0.752861 +vt 0.373335 0.751720 +vt 0.358163 0.758083 +vt 0.372270 0.794472 +vt 0.355611 0.788772 +vt 0.338952 0.783073 +vt 0.342990 0.764444 +vt 0.393131 0.818442 +vt 0.408920 0.809841 +vt 0.416469 0.829497 +vt 0.424709 0.801241 +vt 0.431333 0.817535 +vt 0.347510 0.808325 +vt 0.331871 0.799267 +vt 0.363148 0.817384 +vt 0.339408 0.827878 +vt 0.324790 0.815460 +vt 0.432392 0.842316 +vt 0.444583 0.828788 +vt 0.323061 0.840331 +vt 0.311176 0.826409 +vt 0.812948 0.218487 +vt 0.820073 0.216574 +vt 0.816266 0.203086 +vt 0.820686 0.206424 +vt 0.825107 0.209762 +vt 0.827197 0.214662 +vt 0.199767 0.214827 +vt 0.204798 0.210494 +vt 0.206958 0.220210 +vt 0.199417 0.218645 +vt 0.209828 0.206161 +vt 0.214498 0.221775 +vt 0.802821 0.202258 +vt 0.792692 0.186029 +vt 0.802192 0.184609 +vt 0.809229 0.193848 +vt 0.226485 0.183086 +vt 0.236720 0.185080 +vt 0.225609 0.203428 +vt 0.218157 0.194624 +vt 0.793802 0.183009 +vt 0.799106 0.180789 +vt 0.230055 0.179353 +vt 0.235688 0.181927 +vt 0.452764 0.821724 +vt 0.465609 0.832370 +vt 0.439919 0.811078 +vt 0.448505 0.804621 +vt 0.460945 0.814660 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.316338 0.808746 +vt 0.303149 0.819093 +vt 0.295121 0.811778 +vt 0.289959 0.829441 +vt 0.282357 0.821525 +vt 0.433448 0.796668 +vt 0.426977 0.782257 +vt 0.435868 0.779569 +vt 0.442187 0.792095 +vt 0.321237 0.777208 +vt 0.330095 0.780141 +vt 0.323216 0.794443 +vt 0.314561 0.789619 +vt 0.422167 0.766592 +vt 0.417356 0.750926 +vt 0.423718 0.754191 +vt 0.429793 0.766880 +vt 0.334089 0.752045 +vt 0.340558 0.748930 +vt 0.335326 0.764535 +vt 0.327663 0.764627 +vt 0.425119 0.748614 +vt 0.432881 0.746302 +vt 0.437950 0.749777 +vt 0.430834 0.751984 +vt 0.319919 0.747250 +vt 0.325094 0.743893 +vt 0.332826 0.746412 +vt 0.327004 0.749647 +vt 0.436206 0.738566 +vt 0.439530 0.730829 +vt 0.445392 0.731997 +vt 0.441671 0.740887 +vt 0.312907 0.729222 +vt 0.318816 0.728199 +vt 0.321956 0.736046 +vt 0.316413 0.738236 +vt 0.438769 0.726080 +vt 0.438007 0.721331 +vt 0.440995 0.724383 +vt 0.443193 0.728190 +vt 0.317510 0.721697 +vt 0.320584 0.718714 +vt 0.319700 0.723457 +vt 0.315208 0.725459 +vt 0.446061 0.714104 +vt 0.454116 0.706877 +vt 0.455277 0.713731 +vt 0.448136 0.719057 +vt 0.303460 0.710657 +vt 0.304798 0.703817 +vt 0.312691 0.711265 +vt 0.310485 0.716177 +vt 0.486234 0.834477 +vt 0.506858 0.836583 +vt 0.492936 0.826756 +vt 0.512485 0.828811 +vt 0.269185 0.830990 +vt 0.262666 0.823049 +vt 0.248410 0.832538 +vt 0.242975 0.824574 +vt 0.530038 0.827833 +vt 0.553218 0.819083 +vt 0.531713 0.820312 +vt 0.550942 0.811814 +vt 0.225378 0.823096 +vt 0.223907 0.815495 +vt 0.202345 0.813653 +vt 0.204839 0.806417 +vt 0.556681 0.803304 +vt 0.560143 0.787524 +vt 0.551540 0.799748 +vt 0.552139 0.787682 +vt 0.199322 0.797709 +vt 0.204585 0.794286 +vt 0.196300 0.781765 +vt 0.204331 0.782156 +vt 0.550636 0.773835 +vt 0.541129 0.760146 +vt 0.545773 0.776111 +vt 0.539407 0.764539 +vt 0.206237 0.768316 +vt 0.211053 0.770738 +vt 0.216174 0.754866 +vt 0.217774 0.759319 +vt 0.524091 0.748593 +vt 0.507053 0.737039 +vt 0.523923 0.753837 +vt 0.508439 0.743135 +vt 0.233573 0.743764 +vt 0.233597 0.749025 +vt 0.250971 0.732662 +vt 0.249419 0.738732 +vt 0.480584 0.721958 +vt 0.481858 0.728433 +vt 0.277885 0.718239 +vt 0.276439 0.724694 +vt 0.452240 0.747962 +vt 0.446363 0.755721 +vt 0.458117 0.740203 +vt 0.470841 0.748408 +vt 0.462808 0.755036 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.299933 0.737121 +vt 0.305629 0.745059 +vt 0.294845 0.751881 +vt 0.311324 0.752996 +vt 0.302729 0.758742 +vt 0.472472 0.766110 +vt 0.465089 0.772784 +vt 0.479855 0.759436 +vt 0.488870 0.770464 +vt 0.482136 0.777184 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.277626 0.755840 +vt 0.284855 0.762733 +vt 0.274865 0.773586 +vt 0.292084 0.769626 +vt 0.281439 0.780511 +vt 0.490606 0.786100 +vt 0.484940 0.793187 +vt 0.496271 0.779013 +vt 0.503673 0.787562 +vt 0.499075 0.795016 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.260632 0.775036 +vt 0.266123 0.782302 +vt 0.257381 0.791018 +vt 0.271614 0.789569 +vt 0.261790 0.798626 +vt 0.508378 0.797243 +vt 0.505639 0.804905 +vt 0.511118 0.789582 +vt 0.518562 0.791602 +vt 0.517682 0.799471 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.245446 0.785228 +vt 0.247981 0.792993 +vt 0.238582 0.794968 +vt 0.250517 0.800758 +vt 0.239243 0.802891 +vt 0.499287 0.815830 +vt 0.514644 0.818075 +vt 0.483931 0.813585 +vt 0.272074 0.810076 +vt 0.256591 0.811904 +vt 0.241109 0.813733 +vt 0.461954 0.794263 +vt 0.472942 0.803924 +vt 0.283368 0.800673 +vt 0.294663 0.791271 +vt 0.453638 0.782440 +vt 0.445322 0.770617 +vt 0.311983 0.767975 +vt 0.303323 0.779623 +vt 0.438078 0.761300 +vt 0.319494 0.758811 +vt 0.453126 0.729630 +vt 0.463059 0.731070 +vt 0.295210 0.727839 +vt 0.305209 0.726649 +vt 0.498654 0.756799 +vt 0.480857 0.743935 +vt 0.277032 0.740268 +vt 0.258855 0.752697 +vt 0.521540 0.776051 +vt 0.510097 0.766425 +vt 0.247114 0.762030 +vt 0.235373 0.771365 +vt 0.535351 0.789642 +vt 0.528445 0.782846 +vt 0.228249 0.777983 +vt 0.221125 0.784600 +vt 0.533872 0.809577 +vt 0.534611 0.799609 +vt 0.221583 0.794627 +vt 0.222041 0.804654 +vt 0.526743 0.815988 +vt 0.229019 0.811294 +vt 0.492632 0.667222 +vt 0.525828 0.690616 +vt 0.459436 0.643829 +vt 0.484068 0.628776 +vt 0.513727 0.656157 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.301127 0.640646 +vt 0.267297 0.663165 +vt 0.246529 0.651594 +vt 0.233467 0.685685 +vt 0.216123 0.678120 +vt 0.549123 0.711844 +vt 0.572419 0.733072 +vt 0.562219 0.705235 +vt 0.581052 0.726933 +vt 0.209549 0.706259 +vt 0.196649 0.699273 +vt 0.185631 0.726834 +vt 0.177176 0.720426 +vt 0.595375 0.754431 +vt 0.618331 0.775790 +vt 0.598876 0.743449 +vt 0.616701 0.759965 +vt 0.161926 0.747534 +vt 0.158778 0.736401 +vt 0.138221 0.768235 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.663727 0.775750 +vt 0.651200 0.763158 +vt 0.684070 0.750525 +vt 0.638674 0.750566 +vt 0.660647 0.741167 +vt 0.105751 0.754337 +vt 0.118708 0.742215 +vt 0.092794 0.766459 +vt 0.049526 0.748824 +vt 0.073282 0.740438 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.726501 0.705992 +vt 0.697726 0.705897 +vt 0.711383 0.661268 +vt 0.668952 0.705801 +vt 0.677256 0.670436 +vt 0.062384 0.695666 +vt 0.090301 0.697045 +vt 0.034467 0.694286 +vt 0.019409 0.639749 +vt 0.051486 0.650894 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.743177 0.612264 +vt 0.708753 0.621905 +vt 0.706123 0.582542 +vt 0.674330 0.631546 +vt 0.671403 0.592656 +vt 0.057364 0.614013 +vt 0.088192 0.625950 +vt 0.026537 0.602076 +vt 0.033664 0.564403 +vt 0.063242 0.577132 +vt 0.092820 0.589862 +vt 0.610321 0.676987 +vt 0.594028 0.643852 +vt 0.577735 0.610716 +vt 0.167361 0.638772 +vt 0.184878 0.607464 +vt 0.149843 0.670079 +vt 0.615585 0.705518 +vt 0.620849 0.734050 +vt 0.137107 0.726239 +vt 0.143475 0.698159 +vt 0.619467 0.742688 +vt 0.138198 0.734952 +vt 0.835231 0.207140 +vt 0.838530 0.201059 +vt 0.831932 0.213221 +vt 0.834578 0.206879 +vt 0.834641 0.206919 +vt 0.834705 0.206959 +vt 0.042440 0.543531 +vt 0.080685 0.559880 +vt 0.051216 0.522659 +vt 0.098128 0.542627 +vt 0.145041 0.562595 +vt 0.118931 0.576228 +vt 0.620420 0.565675 +vt 0.645911 0.579166 +vt 0.568491 0.584855 +vt 0.559246 0.558995 +vt 0.491070 0.590546 +vt 0.498072 0.552315 +vt 0.194754 0.581916 +vt 0.270577 0.587604 +vt 0.204630 0.556368 +vt 0.264218 0.550140 +vt 0.444556 0.582103 +vt 0.451996 0.612966 +vt 0.309096 0.610407 +vt 0.317066 0.580168 +vn 0.7273 -0.1123 0.6770 +vn 0.6470 -0.3278 0.6885 +vn 0.6658 -0.3430 0.6626 +vn 0.7475 -0.1217 0.6530 +vn -0.6658 -0.3430 0.6626 +vn -0.6470 -0.3278 0.6885 +vn -0.7273 -0.1123 0.6770 +vn -0.7475 -0.1217 0.6530 +vn 0.8357 -0.1487 0.5287 +vn 0.7404 -0.4154 0.5284 +vn 0.7666 -0.4493 0.4586 +vn 0.8709 -0.1601 0.4646 +vn -0.7666 -0.4493 0.4586 +vn -0.7404 -0.4154 0.5284 +vn -0.8357 -0.1487 0.5287 +vn -0.8709 -0.1601 0.4646 +vn 0.5368 -0.6566 0.5298 +vn 0.2687 -0.7999 0.5366 +vn 0.2578 -0.8623 0.4359 +vn 0.5454 -0.7103 0.4450 +vn -0.2578 -0.8623 0.4359 +vn -0.2687 -0.7999 0.5366 +vn -0.5368 -0.6566 0.5298 +vn -0.5454 -0.7103 0.4450 +vn 0.4685 -0.5130 0.7193 +vn 0.2654 -0.6038 0.7516 +vn 0.2708 -0.6392 0.7198 +vn 0.4893 -0.5353 0.6885 +vn -0.2708 -0.6392 0.7198 +vn -0.2654 -0.6038 0.7516 +vn -0.4685 -0.5130 0.7193 +vn -0.4893 -0.5353 0.6885 +vn 0.0158 -0.6277 0.7783 +vn -0.2383 -0.5553 0.7968 +vn -0.2682 -0.5807 0.7687 +vn -0.0056 -0.6633 0.7483 +vn 0.2682 -0.5807 0.7687 +vn 0.2384 -0.5553 0.7968 +vn -0.0158 -0.6277 0.7783 +vn 0.0056 -0.6633 0.7483 +vn -0.0755 -0.8283 0.5551 +vn -0.3820 -0.7169 0.5832 +vn -0.4211 -0.7697 0.4799 +vn -0.1034 -0.8883 0.4476 +vn 0.4211 -0.7697 0.4799 +vn 0.3820 -0.7169 0.5832 +vn 0.0755 -0.8283 0.5551 +vn 0.1034 -0.8883 0.4476 +vn -0.6383 -0.4619 0.6159 +vn -0.7558 -0.1624 0.6343 +vn -0.8211 -0.1789 0.5420 +vn -0.6910 -0.5023 0.5198 +vn 0.8211 -0.1789 0.5420 +vn 0.7558 -0.1624 0.6343 +vn 0.6383 -0.4619 0.6159 +vn 0.6910 -0.5023 0.5198 +vn -0.4701 -0.3509 0.8099 +vn -0.5701 -0.1161 0.8133 +vn -0.5928 -0.1243 0.7957 +vn -0.4956 -0.3679 0.7868 +vn 0.5928 -0.1243 0.7957 +vn 0.5701 -0.1161 0.8133 +vn 0.4701 -0.3509 0.8099 +vn 0.4956 -0.3679 0.7868 +vn -0.5732 0.1137 0.8115 +vn -0.4898 0.3470 0.7998 +vn -0.5053 0.3667 0.7811 +vn -0.5944 0.1232 0.7946 +vn 0.5053 0.3667 0.7811 +vn 0.4898 0.3470 0.7998 +vn 0.5732 0.1137 0.8115 +vn 0.5944 0.1232 0.7946 +vn -0.7547 0.1607 0.6361 +vn -0.6355 0.4531 0.6252 +vn -0.6861 0.4865 0.5409 +vn -0.8191 0.1757 0.5462 +vn 0.6861 0.4865 0.5409 +vn 0.6355 0.4531 0.6252 +vn 0.7547 0.1607 0.6361 +vn 0.8191 0.1757 0.5462 +vn -0.3748 0.7043 0.6028 +vn -0.0681 0.8125 0.5789 +vn -0.0889 0.8613 0.5002 +vn -0.4079 0.7482 0.5233 +vn 0.0889 0.8613 0.5002 +vn 0.0681 0.8125 0.5789 +vn 0.3748 0.7043 0.6028 +vn 0.4079 0.7482 0.5233 +vn -0.2643 0.5756 0.7738 +vn 0.0034 0.6622 0.7493 +vn -0.0121 0.6811 0.7321 +vn -0.2810 0.5914 0.7559 +vn 0.0121 0.6811 0.7321 +vn -0.0034 0.6622 0.7493 +vn 0.2643 0.5756 0.7738 +vn 0.2810 0.5914 0.7559 +vn 0.2665 0.6372 0.7231 +vn 0.4834 0.5317 0.6955 +vn 0.4964 0.5449 0.6758 +vn 0.2712 0.6563 0.7041 +vn -0.4964 0.5449 0.6758 +vn -0.4834 0.5317 0.6955 +vn -0.2665 0.6372 0.7231 +vn -0.2712 0.6563 0.7041 +vn 0.2698 0.7839 0.5592 +vn 0.5355 0.6437 0.5467 +vn 0.5442 0.6864 0.4824 +vn 0.2616 0.8339 0.4859 +vn -0.5442 0.6864 0.4824 +vn -0.5355 0.6437 0.5467 +vn -0.2698 0.7839 0.5592 +vn -0.2616 0.8339 0.4859 +vn 0.7396 0.4071 0.5360 +vn 0.8350 0.1471 0.5302 +vn 0.8697 0.1571 0.4679 +vn 0.7654 0.4336 0.4755 +vn -0.8697 0.1571 0.4679 +vn -0.8350 0.1471 0.5302 +vn -0.7396 0.4071 0.5360 +vn -0.7654 0.4336 0.4755 +vn 0.6612 0.3238 0.6768 +vn 0.7296 0.1099 0.6750 +vn 0.7487 0.1206 0.6518 +vn 0.6727 0.3417 0.6563 +vn -0.7487 0.1206 0.6518 +vn -0.7296 0.1099 0.6750 +vn -0.6612 0.3238 0.6768 +vn -0.6727 0.3417 0.6563 +vn 0.8979 0.1457 0.4155 +vn 0.8088 0.4421 0.3878 +vn 0.7208 0.3667 0.5882 +vn 0.7994 0.0976 0.5928 +vn -0.7208 0.3667 0.5882 +vn -0.8088 0.4421 0.3878 +vn -0.8979 0.1457 0.4155 +vn -0.7994 0.0976 0.5928 +vn 0.5572 0.7508 0.3547 +vn 0.2459 0.9127 0.3264 +vn 0.2579 0.8107 0.5255 +vn 0.5565 0.6116 0.5624 +vn -0.2579 0.8107 0.5255 +vn -0.2459 0.9127 0.3264 +vn -0.5572 0.7508 0.3547 +vn -0.5565 0.6116 0.5624 +vn -0.1284 0.9357 0.3286 +vn -0.4835 0.7944 0.3676 +vn -0.4298 0.7033 0.5662 +vn -0.0514 0.8484 0.5268 +vn 0.4298 0.7033 0.5662 +vn 0.4835 0.7944 0.3676 +vn 0.1284 0.9357 0.3286 +vn 0.0514 0.8484 0.5268 +vn -0.7740 0.4956 0.3941 +vn -0.9044 0.1782 0.3877 +vn -0.8385 0.1470 0.5247 +vn -0.6747 0.4757 0.5644 +vn 0.8385 0.1470 0.5247 +vn 0.9044 0.1782 0.3877 +vn 0.7740 0.4956 0.3941 +vn 0.6747 0.4757 0.5644 +vn -0.9014 -0.1851 0.3913 +vn -0.7496 -0.5180 0.4121 +vn -0.6662 -0.5074 0.5465 +vn -0.8390 -0.1538 0.5220 +vn 0.6662 -0.5074 0.5465 +vn 0.7496 -0.5180 0.4121 +vn 0.9014 -0.1851 0.3913 +vn 0.8390 -0.1538 0.5220 +vn -0.4559 -0.7923 0.4054 +vn -0.1155 -0.9190 0.3771 +vn -0.0661 -0.8733 0.4827 +vn -0.4326 -0.7287 0.5310 +vn 0.0661 -0.8733 0.4827 +vn 0.1155 -0.9190 0.3771 +vn 0.4559 -0.7923 0.4054 +vn 0.4326 -0.7287 0.5310 +vn 0.2516 -0.8928 0.3737 +vn 0.5426 -0.7431 0.3916 +vn 0.5520 -0.6403 0.5341 +vn 0.2546 -0.8374 0.4836 +vn -0.5520 -0.6403 0.5341 +vn -0.5426 -0.7431 0.3916 +vn -0.2516 -0.8928 0.3737 +vn -0.2546 -0.8374 0.4836 +vn 0.7901 -0.4607 0.4043 +vn 0.8956 -0.1513 0.4183 +vn 0.7999 -0.1022 0.5914 +vn 0.7153 -0.3948 0.5766 +vn -0.7999 -0.1022 0.5914 +vn -0.8956 -0.1513 0.4183 +vn -0.7901 -0.4607 0.4043 +vn -0.7153 -0.3948 0.5766 +vn 0.3463 -0.0436 0.9371 +vn 0.4246 -0.1483 0.8932 +vn 0.4653 -0.0290 0.8847 +vn -0.4653 -0.0290 0.8847 +vn -0.4246 -0.1483 0.8932 +vn -0.3463 -0.0436 0.9371 +vn 0.2531 -0.2854 0.9244 +vn 0.3781 -0.2127 0.9010 +vn 0.2775 -0.1178 0.9535 +vn -0.2775 -0.1178 0.9535 +vn -0.3781 -0.2127 0.9010 +vn -0.2531 -0.2854 0.9244 +vn 0.1272 -0.1176 0.9849 +vn -0.0284 -0.2304 0.9727 +vn 0.1457 -0.2960 0.9440 +vn -0.1457 -0.2960 0.9440 +vn 0.0284 -0.2304 0.9727 +vn -0.1272 -0.1176 0.9849 +vn 0.0156 -0.0210 0.9997 +vn -0.1662 -0.0169 0.9859 +vn -0.1075 -0.1515 0.9826 +vn 0.1075 -0.1515 0.9826 +vn 0.1662 -0.0169 0.9859 +vn -0.0156 -0.0210 0.9997 +vn 0.0156 0.0200 0.9997 +vn -0.1069 0.1401 0.9843 +vn -0.1659 0.0162 0.9860 +vn 0.1659 0.0162 0.9860 +vn 0.1069 0.1401 0.9843 +vn -0.0156 0.0200 0.9997 +vn 0.1282 0.1118 0.9854 +vn 0.1503 0.2778 0.9488 +vn -0.0240 0.2162 0.9761 +vn 0.0240 0.2162 0.9761 +vn -0.1503 0.2778 0.9488 +vn -0.1282 0.1118 0.9854 +vn 0.2768 0.1120 0.9544 +vn 0.3758 0.1997 0.9049 +vn 0.2510 0.2681 0.9301 +vn -0.2510 0.2681 0.9301 +vn -0.3758 0.1997 0.9049 +vn -0.2768 0.1120 0.9544 +vn 0.3465 0.0413 0.9372 +vn 0.4650 0.0277 0.8849 +vn 0.4247 0.1372 0.8949 +vn -0.4247 0.1372 0.8949 +vn -0.4650 0.0277 0.8849 +vn -0.3465 0.0413 0.9372 +vn 0.1386 -0.9493 0.2823 +vn 0.1343 -0.8291 0.5428 +vn 0.0586 -0.8311 0.5530 +vn 0.0617 -0.9498 0.3066 +vn -0.0586 -0.8311 0.5530 +vn -0.1343 -0.8291 0.5428 +vn -0.1386 -0.9493 0.2823 +vn -0.0617 -0.9498 0.3066 +vn 0.3460 -0.8864 0.3076 +vn 0.3308 -0.7099 0.6218 +vn 0.1854 -0.8199 0.5416 +vn 0.1804 -0.9479 0.2627 +vn -0.1854 -0.8199 0.5416 +vn -0.3308 -0.7099 0.6218 +vn -0.3460 -0.8864 0.3076 +vn -0.1804 -0.9479 0.2627 +vn 0.8726 -0.2473 0.4212 +vn 0.5837 -0.3099 0.7505 +vn 0.4816 -0.5002 0.7196 +vn 0.6655 -0.6181 0.4184 +vn -0.4816 -0.5002 0.7196 +vn -0.5837 -0.3099 0.7505 +vn -0.8726 -0.2473 0.4212 +vn -0.6655 -0.6181 0.4184 +vn 0.9246 0.0556 0.3769 +vn 0.6879 -0.0206 0.7255 +vn 0.6616 -0.1407 0.7365 +vn 0.9240 -0.0404 0.3803 +vn -0.6616 -0.1407 0.7365 +vn -0.6879 -0.0206 0.7255 +vn -0.9246 0.0556 0.3769 +vn -0.9240 -0.0404 0.3803 +vn 0.9095 0.1563 0.3852 +vn 0.7133 0.0892 0.6952 +vn 0.6931 0.0419 0.7196 +vn 0.9166 0.1049 0.3859 +vn -0.6931 0.0419 0.7196 +vn -0.7133 0.0892 0.6952 +vn -0.9095 0.1563 0.3852 +vn -0.9166 0.1049 0.3859 +vn 0.3722 -0.8474 0.3788 +vn 0.3239 -0.8441 0.4273 +vn 0.3732 -0.6960 0.6134 +vn 0.4153 -0.6949 0.5870 +vn -0.3732 -0.6960 0.6134 +vn -0.3239 -0.8441 0.4273 +vn -0.3722 -0.8474 0.3788 +vn -0.4153 -0.6949 0.5870 +vn 0.3888 -0.7907 0.4728 +vn 0.5118 -0.7186 0.4709 +vn 0.4603 -0.5651 0.6847 +vn 0.3919 -0.6473 0.6538 +vn -0.4603 -0.5651 0.6847 +vn -0.5118 -0.7186 0.4709 +vn -0.3888 -0.7907 0.4728 +vn -0.3919 -0.6473 0.6538 +vn 0.6692 -0.6010 0.4370 +vn 0.7616 -0.4716 0.4444 +vn 0.6577 -0.3656 0.6586 +vn 0.5934 -0.4448 0.6708 +vn -0.6577 -0.3656 0.6586 +vn -0.7616 -0.4716 0.4444 +vn -0.6692 -0.6010 0.4370 +vn -0.5934 -0.4448 0.6708 +vn 0.7994 -0.3620 0.4796 +vn 0.8281 -0.2154 0.5176 +vn 0.5973 -0.3152 0.7375 +vn 0.6416 -0.3429 0.6861 +vn -0.5973 -0.3152 0.7375 +vn -0.8281 -0.2154 0.5176 +vn -0.7994 -0.3620 0.4796 +vn -0.6416 -0.3429 0.6861 +vn 0.7792 0.3032 0.5486 +vn 0.4971 0.7392 0.4544 +vn 0.5156 0.2235 0.8271 +vn 0.5907 -0.1699 0.7888 +vn -0.5156 0.2235 0.8271 +vn -0.4971 0.7392 0.4544 +vn -0.7792 0.3032 0.5486 +vn -0.5907 -0.1699 0.7888 +vn 0.5118 0.7686 0.3839 +vn 0.5510 0.7439 0.3782 +vn 0.4628 0.4217 0.7798 +vn 0.4688 0.4069 0.7840 +vn -0.4628 0.4217 0.7798 +vn -0.5510 0.7439 0.3782 +vn -0.5118 0.7686 0.3839 +vn -0.4688 0.4069 0.7840 +vn 0.6225 0.6683 0.4072 +vn 0.5438 0.7126 0.4432 +vn 0.4234 0.3740 0.8251 +vn 0.4880 0.3713 0.7900 +vn -0.4234 0.3740 0.8251 +vn -0.5438 0.7126 0.4432 +vn -0.6225 0.6683 0.4072 +vn -0.4880 0.3713 0.7900 +vn 0.1427 0.8502 0.5068 +vn -0.3976 0.7662 0.5048 +vn -0.1175 0.3644 0.9238 +vn 0.1878 0.4009 0.8967 +vn 0.1175 0.3644 0.9238 +vn 0.3976 0.7662 0.5048 +vn -0.1427 0.8502 0.5068 +vn -0.1878 0.4009 0.8967 +vn -0.7677 0.4928 0.4097 +vn -0.8422 0.4179 0.3407 +vn -0.5150 0.2551 0.8184 +vn -0.3953 0.2739 0.8768 +vn 0.5150 0.2551 0.8184 +vn 0.8422 0.4179 0.3407 +vn 0.7677 0.4928 0.4097 +vn 0.3953 0.2739 0.8768 +vn -0.7543 0.5615 0.3403 +vn -0.3883 0.8222 0.4162 +vn -0.3145 0.4157 0.8534 +vn -0.5073 0.3177 0.8011 +vn 0.3145 0.4157 0.8534 +vn 0.3883 0.8222 0.4162 +vn 0.7543 0.5615 0.3403 +vn 0.5073 0.3177 0.8011 +vn 0.4513 -0.3587 0.8171 +vn 0.4014 -0.3659 0.8397 +vn 0.3053 -0.2281 0.9245 +vn 0.2972 -0.2387 0.9245 +vn -0.3053 -0.2281 0.9245 +vn -0.4014 -0.3659 0.8397 +vn -0.4513 -0.3587 0.8171 +vn -0.2972 -0.2387 0.9245 +vn 0.2871 -0.3945 0.8729 +vn 0.1555 -0.4262 0.8911 +vn 0.1692 -0.2712 0.9475 +vn 0.2389 -0.2508 0.9381 +vn -0.1692 -0.2712 0.9475 +vn -0.1555 -0.4262 0.8911 +vn -0.2871 -0.3945 0.8729 +vn -0.2389 -0.2508 0.9381 +vn 0.0208 -0.4510 0.8923 +vn 0.0869 -0.3102 0.9467 +vn 0.1083 -0.2879 0.9515 +vn 0.0379 -0.4411 0.8967 +vn -0.1083 -0.2879 0.9515 +vn -0.0869 -0.3102 0.9467 +vn -0.0208 -0.4510 0.8923 +vn -0.0379 -0.4411 0.8967 +vn -0.0053 -0.5709 0.8210 +vn 0.0941 -0.4058 0.9091 +vn 0.0853 -0.3560 0.9306 +vn 0.0342 -0.5096 0.8597 +vn -0.0853 -0.3560 0.9306 +vn -0.0941 -0.4058 0.9091 +vn 0.0053 -0.5709 0.8210 +vn -0.0342 -0.5096 0.8597 +vn 0.0967 -0.3017 0.9485 +vn 0.2907 -0.4003 0.8691 +vn 0.1877 -0.4405 0.8779 +vn 0.0029 -0.4905 0.8714 +vn -0.1877 -0.4405 0.8779 +vn -0.2907 -0.4003 0.8691 +vn -0.0967 -0.3017 0.9485 +vn -0.0029 -0.4905 0.8714 +vn 0.3645 -0.1702 0.9155 +vn 0.4821 -0.2710 0.8332 +vn 0.3780 -0.2958 0.8773 +vn 0.2342 -0.1821 0.9550 +vn -0.3780 -0.2958 0.8773 +vn -0.4821 -0.2710 0.8332 +vn -0.3645 -0.1702 0.9155 +vn -0.2342 -0.1821 0.9550 +vn 0.4084 -0.2560 0.8761 +vn 0.4697 -0.3069 0.8278 +vn 0.5088 -0.2748 0.8159 +vn 0.4167 -0.2150 0.8832 +vn -0.5088 -0.2748 0.8159 +vn -0.4697 -0.3069 0.8278 +vn -0.4084 -0.2560 0.8761 +vn -0.4167 -0.2150 0.8832 +vn 0.3237 -0.3313 0.8863 +vn 0.3712 -0.4418 0.8167 +vn 0.4106 -0.4069 0.8160 +vn 0.3841 -0.3255 0.8640 +vn -0.4106 -0.4069 0.8160 +vn -0.3712 -0.4418 0.8167 +vn -0.3237 -0.3313 0.8863 +vn -0.3841 -0.3255 0.8640 +vn 0.2773 0.0217 0.9605 +vn 0.3758 -0.1066 0.9205 +vn 0.3752 -0.3377 0.8632 +vn 0.3038 -0.1254 0.9444 +vn -0.3752 -0.3377 0.8632 +vn -0.3758 -0.1066 0.9205 +vn -0.2773 0.0217 0.9605 +vn -0.3038 -0.1254 0.9444 +vn 0.0730 0.0954 0.9928 +vn -0.0891 0.0895 0.9920 +vn -0.1548 0.1570 0.9754 +vn -0.0195 0.1299 0.9913 +vn 0.1548 0.1570 0.9754 +vn 0.0891 0.0895 0.9920 +vn -0.0730 0.0954 0.9928 +vn 0.0195 0.1299 0.9913 +vn 0.4037 -0.3369 0.8506 +vn 0.2042 -0.2888 0.9354 +vn 0.1507 -0.2779 0.9487 +vn 0.3030 -0.2626 0.9161 +vn -0.1507 -0.2779 0.9487 +vn -0.2042 -0.2888 0.9354 +vn -0.4037 -0.3369 0.8506 +vn -0.3030 -0.2626 0.9161 +vn 0.1957 -0.1996 0.9601 +vn 0.1170 -0.2806 0.9527 +vn 0.0657 -0.2660 0.9617 +vn 0.0804 -0.1875 0.9790 +vn -0.0657 -0.2660 0.9617 +vn -0.1170 -0.2806 0.9527 +vn -0.1957 -0.1996 0.9601 +vn -0.0804 -0.1875 0.9790 +vn -0.0210 -0.0864 0.9960 +vn -0.0535 -0.0981 0.9937 +vn -0.0077 -0.1827 0.9831 +vn 0.0243 -0.2264 0.9737 +vn 0.0077 -0.1827 0.9831 +vn 0.0535 -0.0981 0.9937 +vn 0.0210 -0.0864 0.9960 +vn -0.0243 -0.2264 0.9737 +vn 0.0882 -0.6473 0.7571 +vn 0.0268 -0.6653 0.7461 +vn 0.0468 -0.7500 0.6598 +vn 0.1148 -0.7353 0.6679 +vn -0.0468 -0.7500 0.6598 +vn -0.0268 -0.6653 0.7461 +vn -0.0882 -0.6473 0.7571 +vn -0.1148 -0.7353 0.6679 +vn 0.2442 -0.4371 0.8656 +vn 0.1519 -0.5765 0.8028 +vn 0.1717 -0.6888 0.7044 +vn 0.2892 -0.5401 0.7904 +vn -0.1717 -0.6888 0.7044 +vn -0.1519 -0.5765 0.8028 +vn -0.2442 -0.4371 0.8656 +vn -0.2892 -0.5401 0.7904 +vn 0.3063 -0.1983 0.9311 +vn 0.3152 -0.2848 0.9053 +vn 0.3730 -0.3737 0.8493 +vn 0.3970 -0.2731 0.8762 +vn -0.3730 -0.3737 0.8493 +vn -0.3152 -0.2848 0.9053 +vn -0.3063 -0.1983 0.9311 +vn -0.3970 -0.2731 0.8762 +vn 0.4643 0.0168 0.8855 +vn 0.2465 -0.0215 0.9689 +vn 0.2582 -0.0387 0.9653 +vn 0.4618 -0.0107 0.8869 +vn -0.2582 -0.0387 0.9653 +vn -0.2465 -0.0215 0.9689 +vn -0.4643 0.0168 0.8855 +vn -0.4618 -0.0107 0.8869 +vn 0.2860 -0.1432 0.9475 +vn 0.4332 -0.1748 0.8842 +vn 0.4652 -0.0608 0.8831 +vn 0.2759 -0.0656 0.9589 +vn -0.4652 -0.0608 0.8831 +vn -0.4332 -0.1748 0.8842 +vn -0.2860 -0.1432 0.9475 +vn -0.2759 -0.0656 0.9589 +vn 0.1046 -0.0387 0.9938 +vn 0.0063 -0.0386 0.9992 +vn -0.0009 0.0123 0.9999 +vn 0.0991 0.0114 0.9950 +vn 0.0009 0.0123 0.9999 +vn -0.0063 -0.0386 0.9992 +vn -0.1046 -0.0387 0.9938 +vn -0.0991 0.0114 0.9950 +vn 0.0992 -0.0540 0.9936 +vn 0.1006 -0.0381 0.9942 +vn 0.0000 -0.0462 0.9989 +vn -0.0006 -0.0602 0.9982 +vn -0.1006 -0.0381 0.9942 +vn -0.0992 -0.0540 0.9936 +vn 0.0006 -0.0602 0.9982 +vn 0.0057 -0.0606 0.9981 +vn 0.1152 -0.0604 0.9915 +vn 0.1106 -0.0465 0.9928 +vn 0.0016 -0.0360 0.9994 +vn -0.1106 -0.0465 0.9928 +vn -0.1152 -0.0604 0.9915 +vn -0.0057 -0.0606 0.9981 +vn -0.0016 -0.0360 0.9994 +vn 0.9181 -0.3140 0.2419 +vn 0.9298 -0.3663 0.0365 +vn 0.6495 -0.7310 0.2091 +vn 0.6386 -0.5515 0.5367 +vn -0.6495 -0.7310 0.2091 +vn -0.9298 -0.3663 0.0365 +vn -0.9181 -0.3140 0.2419 +vn -0.6386 -0.5515 0.5367 +vn 0.8574 0.5147 -0.0009 +vn 0.8786 0.4623 -0.1194 +vn 0.9952 0.0944 -0.0247 +vn 0.9890 0.1168 0.0907 +vn -0.9952 0.0944 -0.0247 +vn -0.8786 0.4623 -0.1194 +vn -0.8574 0.5147 -0.0009 +vn -0.9890 0.1168 0.0907 +vn -0.1074 0.7962 0.5954 +vn -0.1392 0.9876 -0.0731 +vn 0.3922 0.8867 -0.2450 +vn 0.3756 0.8780 0.2967 +vn -0.3922 0.8867 -0.2450 +vn 0.1392 0.9876 -0.0731 +vn 0.1074 0.7962 0.5954 +vn -0.3756 0.8780 0.2967 +vn -0.0108 0.7592 0.6508 +vn -0.7251 0.6838 0.0816 +vn -0.6736 0.6928 0.2575 +vn -0.5064 0.3843 0.7719 +vn 0.6736 0.6928 0.2575 +vn 0.7251 0.6838 0.0816 +vn 0.0108 0.7592 0.6508 +vn 0.5064 0.3843 0.7719 +vn 0.1232 -0.5545 0.8230 +vn 0.3364 -0.5638 0.7543 +vn 0.4669 -0.8186 0.3345 +vn 0.2183 -0.8974 0.3834 +vn -0.4669 -0.8186 0.3345 +vn -0.3364 -0.5638 0.7543 +vn -0.1232 -0.5545 0.8230 +vn -0.2183 -0.8974 0.3834 +vn 0.1820 -0.7319 0.6567 +vn 0.3599 -0.6937 0.6240 +vn 0.2443 -0.5823 0.7754 +vn 0.1174 -0.5306 0.8395 +vn -0.2443 -0.5823 0.7754 +vn -0.3599 -0.6937 0.6240 +vn -0.1820 -0.7319 0.6567 +vn -0.1174 -0.5306 0.8395 +vn -0.5357 0.7829 0.3162 +vn -0.2783 0.5637 0.7777 +vn -0.3046 0.5671 0.7652 +vn -0.5652 0.7127 0.4155 +vn 0.3046 0.5672 0.7652 +vn 0.2783 0.5637 0.7777 +vn 0.5357 0.7829 0.3162 +vn 0.5652 0.7127 0.4155 +vn -0.1157 0.9130 0.3912 +vn -0.0573 0.6306 0.7740 +vn 0.2624 0.5592 0.7864 +vn 0.4019 0.8455 0.3517 +vn -0.2624 0.5592 0.7864 +vn 0.0573 0.6306 0.7740 +vn 0.1157 0.9130 0.3912 +vn -0.4019 0.8455 0.3517 +vn 0.8110 0.4558 0.3668 +vn 0.4776 0.3746 0.7947 +vn 0.5212 0.1040 0.8471 +vn 0.9205 0.1167 0.3730 +vn -0.5212 0.1040 0.8471 +vn -0.4776 0.3746 0.7947 +vn -0.8110 0.4558 0.3668 +vn -0.9205 0.1167 0.3730 +vn 0.8092 -0.4216 0.4092 +vn 0.4019 -0.3967 0.8253 +vn 0.2733 -0.6372 0.7206 +vn 0.4566 -0.7153 0.5290 +vn -0.2733 -0.6372 0.7206 +vn -0.4019 -0.3967 0.8253 +vn -0.8092 -0.4216 0.4092 +vn -0.4566 -0.7153 0.5290 +vn -0.0039 0.1724 0.9850 +vn 0.1180 0.0811 0.9897 +vn 0.1769 0.3231 0.9297 +vn -0.0405 0.3806 0.9239 +vn -0.1769 0.3231 0.9297 +vn -0.1180 0.0811 0.9897 +vn 0.0039 0.1723 0.9850 +vn 0.0405 0.3806 0.9239 +vn -0.0169 -0.1911 0.9814 +vn 0.0452 -0.4015 0.9148 +vn 0.1316 -0.5000 0.8560 +vn 0.0762 -0.2808 0.9567 +vn -0.1316 -0.5000 0.8560 +vn -0.0452 -0.4015 0.9148 +vn 0.0169 -0.1911 0.9814 +vn -0.0762 -0.2808 0.9567 +vn -0.1258 -0.0262 0.9917 +vn -0.3067 -0.2224 0.9254 +vn -0.2398 -0.0343 0.9702 +vn -0.2423 0.0220 0.9700 +vn 0.2398 -0.0343 0.9702 +vn 0.3067 -0.2224 0.9254 +vn 0.1258 -0.0262 0.9917 +vn 0.2423 0.0220 0.9700 +vn -0.2695 -0.2832 0.9204 +vn 0.4785 -0.1181 0.8701 +vn 0.7159 -0.1356 0.6849 +vn 0.2945 -0.2960 0.9086 +vn -0.7159 -0.1356 0.6849 +vn -0.4785 -0.1181 0.8701 +vn 0.2695 -0.2832 0.9204 +vn -0.2945 -0.2960 0.9086 +vn 0.5980 -0.1937 0.7777 +vn 0.4002 -0.1785 0.8989 +vn 0.6366 0.0239 0.7708 +vn 0.7142 -0.0813 0.6952 +vn -0.6366 0.0239 0.7708 +vn -0.4002 -0.1785 0.8989 +vn -0.5980 -0.1937 0.7777 +vn -0.7142 -0.0813 0.6952 +vn 0.2856 -0.0108 0.9583 +vn 0.2432 0.0154 0.9699 +vn 0.4897 0.0613 0.8698 +vn 0.5478 0.0816 0.8326 +vn -0.4897 0.0613 0.8698 +vn -0.2432 0.0154 0.9699 +vn -0.2856 -0.0108 0.9583 +vn -0.5478 0.0816 0.8326 +vn 0.8932 0.2569 0.3691 +vn 0.8819 0.3300 0.3365 +vn 0.7877 0.2287 0.5720 +vn 0.7460 0.1691 0.6441 +vn -0.7877 0.2287 0.5720 +vn -0.8819 0.3300 0.3365 +vn -0.8932 0.2569 0.3691 +vn -0.7460 0.1691 0.6441 +vn 0.9006 0.2989 0.3155 +vn 0.9190 0.2537 0.3017 +vn 0.8801 0.1254 0.4579 +vn 0.8359 0.2064 0.5087 +vn -0.8801 0.1254 0.4579 +vn -0.9190 0.2537 0.3017 +vn -0.9006 0.2989 0.3155 +vn -0.8359 0.2064 0.5087 +vn 0.8200 -0.4526 0.3504 +vn 0.8136 -0.2784 0.5104 +vn 0.9110 0.0767 0.4053 +vn 0.9332 0.2382 0.2690 +vn -0.9110 0.0767 0.4053 +vn -0.8136 -0.2784 0.5104 +vn -0.8200 -0.4526 0.3504 +vn -0.9332 0.2382 0.2690 +vn 0.0798 -0.2245 0.9712 +vn 0.0520 -0.3423 0.9381 +vn 0.1527 -0.8959 0.4171 +vn 0.0593 -0.8662 0.4962 +vn -0.1527 -0.8959 0.4171 +vn -0.0520 -0.3423 0.9381 +vn -0.0798 -0.2245 0.9712 +vn -0.0593 -0.8662 0.4962 +vn 0.2086 -0.2434 0.9472 +vn 0.1842 -0.1704 0.9680 +vn -0.6732 -0.4369 0.5966 +vn -0.7792 -0.0464 0.6250 +vn 0.6732 -0.4369 0.5966 +vn -0.1842 -0.1704 0.9680 +vn -0.2086 -0.2434 0.9472 +vn 0.7792 -0.0464 0.6250 +vn 0.0328 -0.4066 0.9130 +vn 0.1141 -0.3580 0.9267 +vn -0.6856 0.1952 0.7014 +vn -0.5422 0.4296 0.7222 +vn 0.6856 0.1952 0.7014 +vn -0.1141 -0.3580 0.9267 +vn -0.0328 -0.4066 0.9130 +vn 0.5422 0.4296 0.7222 +vn -0.0048 -0.4085 0.9127 +vn 0.0028 -0.4061 0.9138 +vn -0.3110 0.6339 0.7081 +vn -0.0698 0.7044 0.7064 +vn 0.3110 0.6339 0.7081 +vn -0.0028 -0.4061 0.9138 +vn 0.0048 -0.4085 0.9127 +vn 0.0698 0.7044 0.7064 +vn -0.0780 0.9331 0.3511 +vn -0.3459 0.8768 0.3340 +vn -0.2793 0.7214 0.6337 +vn -0.0703 0.7184 0.6921 +vn 0.2793 0.7214 0.6337 +vn 0.3459 0.8768 0.3340 +vn 0.0780 0.9331 0.3511 +vn 0.0703 0.7184 0.6921 +vn -0.6231 0.7311 0.2777 +vn -0.8422 0.5039 0.1918 +vn -0.8465 0.4826 0.2250 +vn -0.5486 0.7208 0.4238 +vn 0.8465 0.4826 0.2250 +vn 0.8422 0.5039 0.1918 +vn 0.6231 0.7311 0.2777 +vn 0.5486 0.7208 0.4238 +vn -0.9846 0.1370 0.1084 +vn -0.8783 -0.4631 0.1187 +vn -0.7485 -0.5799 0.3217 +vn -0.9709 0.1792 0.1589 +vn 0.7485 -0.5799 0.3217 +vn 0.8783 -0.4631 0.1187 +vn 0.9846 0.1370 0.1084 +vn 0.9709 0.1792 0.1589 +vn 0.0703 -0.9817 0.1769 +vn 0.1584 -0.9714 0.1770 +vn 0.1269 -0.8843 0.4493 +vn 0.0888 -0.8956 0.4360 +vn -0.1269 -0.8843 0.4493 +vn -0.1584 -0.9714 0.1770 +vn -0.0703 -0.9817 0.1769 +vn -0.0888 -0.8956 0.4360 +vn 0.0412 -0.4702 0.8816 +vn -0.0091 -0.0868 0.9962 +vn -0.0145 -0.0876 0.9961 +vn 0.0673 -0.4848 0.8720 +vn 0.0145 -0.0876 0.9961 +vn 0.0091 -0.0868 0.9962 +vn -0.0412 -0.4702 0.8816 +vn -0.0673 -0.4848 0.8720 +vn -0.0608 -0.4990 0.8645 +vn -0.0210 -0.0299 0.9993 +vn -0.8477 0.2291 0.4784 +vn 0.8477 0.2291 0.4784 +vn 0.0210 -0.0299 0.9993 +vn 0.0608 -0.4990 0.8645 +vn -0.2258 -0.1698 0.9593 +vn -0.2384 -0.1937 0.9517 +vn -0.3201 -0.2054 0.9249 +vn -0.2647 -0.1414 0.9539 +vn 0.3201 -0.2054 0.9249 +vn 0.2384 -0.1937 0.9517 +vn 0.2258 -0.1698 0.9593 +vn 0.2647 -0.1414 0.9539 +vn -0.0559 -0.0784 0.9954 +vn -0.1589 -0.1119 0.9809 +vn -0.2196 -0.0592 0.9738 +vn -0.1602 -0.0133 0.9870 +vn 0.2196 -0.0592 0.9738 +vn 0.1589 -0.1119 0.9809 +vn 0.0559 -0.0784 0.9954 +vn 0.1602 -0.0133 0.9870 +vn 0.1080 -0.0820 0.9908 +vn 0.0337 -0.0812 0.9961 +vn -0.0985 0.0004 0.9951 +vn -0.0416 0.0293 0.9987 +vn 0.0985 0.0004 0.9951 +vn -0.0337 -0.0812 0.9961 +vn -0.1080 -0.0820 0.9908 +vn 0.0416 0.0293 0.9987 +vn -0.2294 -0.1590 0.9602 +vn -0.0707 -0.2584 0.9634 +vn -0.3075 -0.5433 0.7812 +vn -0.4120 -0.2694 0.8704 +vn 0.3075 -0.5433 0.7812 +vn 0.0707 -0.2584 0.9634 +vn 0.2294 -0.1590 0.9602 +vn 0.4120 -0.2694 0.8704 +vn 0.0675 -0.3683 0.9272 +vn 0.1214 -0.4982 0.8586 +vn 0.0574 -0.6162 0.7855 +vn -0.1165 -0.6608 0.7415 +vn -0.0574 -0.6162 0.7855 +vn -0.1214 -0.4982 0.8586 +vn -0.0675 -0.3683 0.9272 +vn 0.1165 -0.6608 0.7415 +vn 0.2874 -0.5650 0.7734 +vn 0.4513 -0.4912 0.7450 +vn 0.4493 -0.4744 0.7570 +vn 0.2727 -0.5515 0.7883 +vn -0.4493 -0.4744 0.7570 +vn -0.4513 -0.4912 0.7450 +vn -0.2874 -0.5650 0.7734 +vn -0.2727 -0.5515 0.7883 +vn 0.5072 -0.3954 0.7658 +vn 0.5127 -0.2828 0.8107 +vn 0.4975 -0.2184 0.8395 +vn 0.5175 -0.3628 0.7750 +vn -0.4975 -0.2184 0.8395 +vn -0.5127 -0.2828 0.8107 +vn -0.5072 -0.3954 0.7658 +vn -0.5175 -0.3628 0.7750 +vn 0.4826 -0.1550 0.8620 +vn 0.4265 -0.0825 0.9007 +vn 0.4601 -0.0647 0.8855 +vn 0.4597 -0.1218 0.8797 +vn -0.4601 -0.0647 0.8855 +vn -0.4265 -0.0825 0.9007 +vn -0.4826 -0.1550 0.8620 +vn -0.4597 -0.1218 0.8797 +vn 0.3552 -0.0597 0.9329 +vn 0.3088 -0.0828 0.9475 +vn 0.4678 0.0809 0.8801 +vn 0.4599 0.0091 0.8879 +vn -0.4678 0.0809 0.8801 +vn -0.3088 -0.0828 0.9475 +vn -0.3552 -0.0597 0.9329 +vn -0.4599 0.0091 0.8879 +vn 0.3479 -0.0238 0.9372 +vn 0.3614 0.1372 0.9223 +vn 0.4598 0.4842 0.7445 +vn 0.5038 0.2537 0.8257 +vn -0.4598 0.4842 0.7445 +vn -0.3614 0.1372 0.9223 +vn -0.3479 -0.0238 0.9372 +vn -0.5038 0.2537 0.8257 +vn 0.2612 0.1393 0.9552 +vn 0.1375 -0.0082 0.9905 +vn 0.1358 0.4258 0.8946 +vn 0.3136 0.5519 0.7727 +vn -0.1358 0.4258 0.8946 +vn -0.1375 -0.0082 0.9905 +vn -0.2612 0.1393 0.9552 +vn -0.3136 0.5519 0.7727 +vn 0.1749 -0.0932 0.9802 +vn 0.2118 -0.0874 0.9734 +vn 0.1272 0.2678 0.9550 +vn 0.1533 0.2998 0.9416 +vn -0.1272 0.2678 0.9550 +vn -0.2118 -0.0874 0.9734 +vn -0.1749 -0.0932 0.9802 +vn -0.1533 0.2998 0.9416 +vn 0.2023 -0.0731 0.9766 +vn 0.1716 -0.0703 0.9827 +vn 0.0039 0.1042 0.9946 +vn 0.0433 0.1989 0.9791 +vn -0.0039 0.1042 0.9946 +vn -0.1716 -0.0703 0.9827 +vn -0.2023 -0.0731 0.9766 +vn -0.0433 0.1989 0.9791 +vn 0.1764 -0.1175 0.9773 +vn 0.2503 -0.2080 0.9456 +vn 0.3984 -0.4479 0.8004 +vn 0.2580 -0.3856 0.8858 +vn -0.3984 -0.4479 0.8004 +vn -0.2503 -0.2080 0.9456 +vn -0.1764 -0.1175 0.9773 +vn -0.2580 -0.3856 0.8858 +vn 0.1419 -0.0502 0.9886 +vn 0.2098 -0.0241 0.9774 +vn 0.2619 -0.2812 0.9232 +vn 0.1641 -0.3470 0.9234 +vn -0.2619 -0.2812 0.9232 +vn -0.2098 -0.0241 0.9774 +vn -0.1419 -0.0502 0.9886 +vn -0.1641 -0.3470 0.9234 +vn 0.0634 -0.1816 0.9813 +vn -0.0526 -0.1007 0.9935 +vn -0.0843 -0.5566 0.8265 +vn -0.1348 -0.7754 0.6169 +vn 0.0843 -0.5566 0.8265 +vn 0.0526 -0.1007 0.9935 +vn -0.0634 -0.1816 0.9813 +vn 0.1348 -0.7754 0.6169 +vn 0.2005 -0.5067 0.8385 +vn 0.2383 -0.4064 0.8821 +vn -0.0812 -0.8427 0.5322 +vn -0.0640 -0.7747 0.6291 +vn 0.0812 -0.8427 0.5322 +vn -0.2383 -0.4064 0.8821 +vn -0.2005 -0.5067 0.8385 +vn 0.0640 -0.7747 0.6291 +vn -0.0332 -0.1172 0.9925 +vn 0.0578 -0.3461 0.9364 +vn -0.2133 -0.5362 0.8167 +vn -0.3840 -0.1907 0.9034 +vn 0.2133 -0.5362 0.8167 +vn -0.0578 -0.3461 0.9364 +vn 0.0332 -0.1172 0.9925 +vn 0.3840 -0.1907 0.9034 +vn 0.0282 0.0488 0.9984 +vn -0.0202 -0.0708 0.9973 +vn -0.3871 -0.0442 0.9210 +vn -0.2847 0.1800 0.9416 +vn 0.3871 -0.0442 0.9210 +vn 0.0202 -0.0708 0.9973 +vn -0.0282 0.0488 0.9984 +vn 0.2847 0.1800 0.9416 +vn 0.1824 0.1695 0.9685 +vn 0.1217 0.1677 0.9783 +vn -0.1675 0.3787 0.9103 +vn -0.1537 0.5074 0.8479 +vn 0.1675 0.3787 0.9103 +vn -0.1217 0.1677 0.9783 +vn -0.1824 0.1695 0.9685 +vn 0.1537 0.5074 0.8479 +vn 0.2256 0.0966 0.9694 +vn 0.2015 0.1231 0.9717 +vn -0.0956 0.6021 0.7927 +vn 0.1063 0.6268 0.7719 +vn 0.0956 0.6021 0.7927 +vn -0.2015 0.1231 0.9717 +vn -0.2256 0.0966 0.9694 +vn -0.1063 0.6268 0.7719 +vn 0.2622 0.1395 0.9549 +vn 0.2597 0.0956 0.9610 +vn 0.2912 0.6006 0.7447 +vn 0.3719 0.6010 0.7074 +vn -0.2912 0.6006 0.7447 +vn -0.2597 0.0956 0.9610 +vn -0.2622 0.1395 0.9549 +vn -0.3719 0.6010 0.7074 +vn 0.3148 0.2739 0.9088 +vn 0.2388 0.2541 0.9372 +vn 0.4401 0.5783 0.6869 +vn 0.5832 0.4491 0.6769 +vn -0.4401 0.5783 0.6869 +vn -0.2388 0.2541 0.9372 +vn -0.3148 0.2739 0.9088 +vn -0.5832 0.4491 0.6769 +vn 0.3567 -0.2066 0.9111 +vn 0.4345 -0.1666 0.8851 +vn 0.7213 -0.3143 0.6171 +vn 0.5757 -0.4001 0.7131 +vn -0.7213 -0.3143 0.6171 +vn -0.4345 -0.1666 0.8851 +vn -0.3567 -0.2066 0.9111 +vn -0.5757 -0.4001 0.7131 +vn 0.4936 -0.1029 0.8636 +vn 0.5275 -0.0396 0.8487 +vn 0.8125 -0.0300 0.5822 +vn 0.8067 -0.1577 0.5695 +vn -0.8125 -0.0300 0.5822 +vn -0.5275 -0.0396 0.8487 +vn -0.4936 -0.1029 0.8636 +vn -0.8067 -0.1577 0.5695 +vn 0.5351 0.0166 0.8446 +vn 0.4751 0.1342 0.8696 +vn 0.7355 0.2376 0.6345 +vn 0.7983 0.0611 0.5992 +vn -0.7355 0.2376 0.6345 +vn -0.4751 0.1342 0.8696 +vn -0.5351 0.0166 0.8446 +vn -0.7983 0.0611 0.5992 +vn -0.3564 0.9338 -0.0305 +vn -0.7591 0.6384 -0.1271 +vn -0.5797 0.7783 -0.2414 +vn -0.2594 0.9642 0.0554 +vn 0.5797 0.7783 -0.2414 +vn 0.7591 0.6384 -0.1271 +vn 0.3564 0.9338 -0.0305 +vn 0.2594 0.9642 0.0554 +vn -0.8771 0.4457 -0.1790 +vn -0.8328 0.5224 -0.1830 +vn -0.6598 0.4172 -0.6250 +vn -0.7028 0.4505 -0.5506 +vn 0.6598 0.4172 -0.6250 +vn 0.8328 0.5224 -0.1830 +vn 0.8771 0.4457 -0.1790 +vn 0.7028 0.4505 -0.5506 +vn -0.5042 0.8445 -0.1802 +vn 0.0443 0.9871 -0.1536 +vn -0.0365 0.7633 -0.6450 +vn -0.4474 0.6254 -0.6393 +vn 0.0365 0.7633 -0.6450 +vn -0.0443 0.9871 -0.1536 +vn 0.5042 0.8445 -0.1802 +vn 0.4474 0.6254 -0.6393 +vn 0.5129 0.8527 -0.0992 +vn 0.5986 0.7955 -0.0935 +vn 0.3523 0.7129 -0.6063 +vn 0.2944 0.7072 -0.6428 +vn -0.3523 0.7129 -0.6063 +vn -0.5986 0.7955 -0.0935 +vn -0.5129 0.8527 -0.0992 +vn -0.2944 0.7072 -0.6428 +vn 0.4899 0.8644 -0.1133 +vn 0.4236 0.8993 -0.1091 +vn 0.3649 0.8952 -0.2560 +vn 0.2923 0.8660 -0.4058 +vn -0.3649 0.8952 -0.2560 +vn -0.4236 0.8993 -0.1091 +vn -0.4899 0.8644 -0.1133 +vn -0.2923 0.8660 -0.4058 +vn 0.3764 0.9214 -0.0963 +vn 0.7040 0.6980 -0.1314 +vn 0.6182 0.7171 -0.3220 +vn 0.3362 0.9097 -0.2437 +vn -0.6182 0.7171 -0.3220 +vn -0.7040 0.6980 -0.1314 +vn -0.3764 0.9214 -0.0963 +vn -0.3362 0.9097 -0.2437 +vn 0.9785 0.1332 -0.1572 +vn 0.9637 -0.2187 -0.1534 +vn 0.9565 -0.1523 -0.2490 +vn 0.9064 0.2479 -0.3419 +vn -0.9565 -0.1523 -0.2490 +vn -0.9637 -0.2187 -0.1534 +vn -0.9785 0.1332 -0.1572 +vn -0.9064 0.2479 -0.3419 +vn 0.7948 -0.5913 -0.1362 +vn 0.6242 -0.7712 -0.1248 +vn 0.6455 -0.7567 -0.1032 +vn 0.8063 -0.5677 -0.1663 +vn -0.6455 -0.7567 -0.1032 +vn -0.6242 -0.7712 -0.1248 +vn -0.7948 -0.5913 -0.1362 +vn -0.8063 -0.5677 -0.1663 +vn 0.5227 -0.8454 -0.1101 +vn 0.3980 -0.9141 -0.0778 +vn 0.3905 -0.9135 -0.1145 +vn 0.5293 -0.8441 -0.0856 +vn -0.3905 -0.9135 -0.1145 +vn -0.3980 -0.9141 -0.0778 +vn -0.5227 -0.8454 -0.1101 +vn -0.5293 -0.8441 -0.0856 +vn 0.1166 -0.3653 -0.9235 +vn 0.1076 -0.6595 -0.7439 +vn 0.3922 -0.6625 -0.6382 +vn 0.3326 -0.4061 -0.8512 +vn -0.3922 -0.6625 -0.6382 +vn -0.1076 -0.6595 -0.7439 +vn -0.1166 -0.3653 -0.9235 +vn -0.3326 -0.4061 -0.8512 +vn 0.1160 -0.1703 -0.9785 +vn 0.1322 -0.1441 -0.9807 +vn 0.2652 -0.1327 -0.9550 +vn 0.2000 -0.1204 -0.9724 +vn -0.2652 -0.1327 -0.9550 +vn -0.1322 -0.1441 -0.9807 +vn -0.1160 -0.1703 -0.9785 +vn -0.2000 -0.1204 -0.9724 +vn 0.0451 -0.6037 -0.7959 +vn 0.0837 -0.3802 -0.9211 +vn 0.1298 -0.3022 -0.9444 +vn 0.0547 -0.5316 -0.8452 +vn -0.1298 -0.3022 -0.9444 +vn -0.0837 -0.3802 -0.9211 +vn -0.0451 -0.6037 -0.7959 +vn -0.0547 -0.5316 -0.8452 +vn 0.1217 -0.9915 -0.0468 +vn 0.0585 -0.9983 -0.0057 +vn 0.0465 -0.8981 -0.4373 +vn 0.0769 -0.8687 -0.4894 +vn -0.0465 -0.8981 -0.4373 +vn -0.0585 -0.9983 -0.0057 +vn -0.1217 -0.9915 -0.0468 +vn -0.0769 -0.8687 -0.4894 +vn 0.3393 -0.9324 -0.1249 +vn 0.1387 -0.9870 -0.0813 +vn 0.0505 -0.8376 -0.5439 +vn 0.2706 -0.7206 -0.6383 +vn -0.0505 -0.8376 -0.5439 +vn -0.1387 -0.9870 -0.0813 +vn -0.3393 -0.9324 -0.1249 +vn -0.2706 -0.7206 -0.6383 +vn 0.9901 -0.0290 -0.1370 +vn 0.8533 -0.4971 -0.1573 +vn 0.6430 -0.3347 -0.6889 +vn 0.8299 0.0726 -0.5532 +vn -0.6430 -0.3347 -0.6889 +vn -0.8533 -0.4971 -0.1573 +vn -0.9901 -0.0290 -0.1370 +vn -0.8299 0.0726 -0.5532 +vn 0.9779 0.1391 -0.1563 +vn 0.9834 0.0973 -0.1531 +vn 0.8402 0.1390 -0.5241 +vn 0.8528 0.1497 -0.5003 +vn -0.8402 0.1390 -0.5241 +vn -0.9834 0.0973 -0.1531 +vn -0.9779 0.1391 -0.1563 +vn -0.8528 0.1497 -0.5003 +vn 0.3822 0.0370 -0.9233 +vn 0.1532 -0.0625 -0.9862 +vn 0.2688 -0.0768 -0.9601 +vn 0.4965 0.0463 -0.8668 +vn -0.2688 -0.0768 -0.9601 +vn -0.1532 -0.0625 -0.9862 +vn -0.3822 0.0370 -0.9233 +vn -0.4965 0.0463 -0.8668 +vn 0.2653 -0.0694 -0.9617 +vn 0.2074 -0.3516 -0.9129 +vn -0.0068 -0.4342 -0.9008 +vn 0.0694 -0.2037 -0.9766 +vn 0.0068 -0.4342 -0.9008 +vn -0.2074 -0.3516 -0.9129 +vn -0.2653 -0.0694 -0.9617 +vn -0.0694 -0.2037 -0.9766 +vn 0.8652 -0.0990 -0.4915 +vn 0.6745 -0.0524 -0.7364 +vn 0.5096 -0.3034 -0.8051 +vn 0.7347 -0.4575 -0.5009 +vn -0.5096 -0.3034 -0.8051 +vn -0.6745 -0.0524 -0.7364 +vn -0.8652 -0.0990 -0.4915 +vn -0.7347 -0.4575 -0.5009 +vn 0.9760 0.1734 -0.1315 +vn 0.9766 0.1420 -0.1614 +vn 0.8686 0.1168 -0.4815 +vn 0.9026 0.1251 -0.4119 +vn -0.8686 0.1168 -0.4815 +vn -0.9766 0.1420 -0.1614 +vn -0.9760 0.1734 -0.1315 +vn -0.9026 0.1251 -0.4119 +vn 0.9500 0.3122 -0.0030 +vn 0.9982 -0.0173 0.0582 +vn 0.9481 0.0117 0.3177 +vn 0.9543 0.2977 0.0279 +vn -0.9481 0.0117 0.3177 +vn -0.9982 -0.0173 0.0582 +vn -0.9500 0.3122 -0.0030 +vn -0.9543 0.2977 0.0279 +vn 0.9603 0.2707 -0.0676 +vn 0.9275 0.2098 -0.3095 +vn 0.9821 0.0949 -0.1626 +vn 0.9388 0.3437 -0.0214 +vn -0.9821 0.0949 -0.1626 +vn -0.9275 0.2098 -0.3095 +vn -0.9603 0.2707 -0.0676 +vn -0.9388 0.3437 -0.0214 +vn 0.8296 -0.5488 0.1030 +vn 0.9457 0.3168 0.0726 +vn 0.8760 0.0949 0.4729 +vn 0.7087 -0.6925 0.1349 +vn -0.8760 0.0949 0.4729 +vn -0.9457 0.3168 0.0726 +vn -0.8296 -0.5488 0.1030 +vn -0.7087 -0.6925 0.1349 +vn 0.3328 -0.9408 0.0643 +vn 0.3508 -0.9237 -0.1541 +vn 0.2658 -0.9516 -0.1540 +vn 0.2867 -0.9579 -0.0140 +vn -0.2658 -0.9516 -0.1540 +vn -0.3508 -0.9237 -0.1541 +vn -0.3328 -0.9408 0.0643 +vn -0.2867 -0.9579 -0.0140 +vn 0.2001 -0.3621 -0.9104 +vn 0.3877 -0.3624 -0.8475 +vn 0.3717 -0.6029 -0.7060 +vn 0.1837 -0.6210 -0.7620 +vn -0.3717 -0.6029 -0.7060 +vn -0.3877 -0.3624 -0.8475 +vn -0.2001 -0.3621 -0.9104 +vn -0.1837 -0.6210 -0.7620 +vn 0.1674 -0.7953 -0.5827 +vn 0.3752 -0.7647 -0.5239 +vn 0.3702 -0.8633 -0.3429 +vn 0.1532 -0.9078 -0.3904 +vn -0.3702 -0.8633 -0.3429 +vn -0.3752 -0.7647 -0.5239 +vn -0.1674 -0.7953 -0.5827 +vn -0.1532 -0.9078 -0.3904 +vn 0.1434 -0.9658 -0.2160 +vn 0.3709 -0.9131 -0.1693 +vn 0.4174 -0.9043 -0.0900 +vn 0.1491 -0.9771 -0.1519 +vn -0.4174 -0.9043 -0.0900 +vn -0.3709 -0.9131 -0.1693 +vn -0.1434 -0.9658 -0.2160 +vn -0.1491 -0.9771 -0.1519 +vn 0.1583 -0.9716 -0.1759 +vn 0.4540 -0.8829 -0.1201 +vn 0.4500 -0.8195 -0.3547 +vn 0.1403 -0.8925 -0.4286 +vn -0.4500 -0.8195 -0.3547 +vn -0.4540 -0.8829 -0.1201 +vn -0.1583 -0.9716 -0.1759 +vn -0.1403 -0.8925 -0.4286 +vn 0.9614 -0.0417 -0.2720 +vn 0.8401 -0.4844 -0.2441 +vn 0.7790 -0.6253 0.0474 +vn 0.9544 -0.2980 -0.0169 +vn -0.7790 -0.6253 0.0474 +vn -0.8401 -0.4844 -0.2441 +vn -0.9614 -0.0417 -0.2720 +vn -0.9544 -0.2980 -0.0169 +vn 0.8706 -0.4755 0.1265 +vn 0.7279 -0.6600 0.1863 +vn 0.7927 -0.5636 0.2325 +vn 0.9198 -0.3521 0.1734 +vn -0.7927 -0.5636 0.2325 +vn -0.7279 -0.6600 0.1863 +vn -0.8706 -0.4755 0.1265 +vn -0.9198 -0.3521 0.1734 +vn 0.1902 0.1157 -0.9749 +vn 0.3826 0.0540 -0.9223 +vn 0.3800 -0.2095 -0.9009 +vn 0.1936 -0.1523 -0.9692 +vn -0.3800 -0.2095 -0.9009 +vn -0.3826 0.0540 -0.9223 +vn -0.1902 0.1157 -0.9749 +vn -0.1936 -0.1523 -0.9692 +vn 0.0678 0.9096 0.4099 +vn 0.2460 0.8772 0.4124 +vn 0.2136 0.9693 0.1216 +vn 0.0558 0.9914 0.1182 +vn -0.2136 0.9693 0.1216 +vn -0.2460 0.8772 0.4124 +vn -0.0678 0.9096 0.4099 +vn -0.0558 0.9914 0.1182 +vn 0.0569 0.9940 -0.0937 +vn 0.2050 0.9744 -0.0926 +vn 0.2483 0.8867 -0.3900 +vn 0.0911 0.9275 -0.3625 +vn -0.2483 0.8867 -0.3900 +vn -0.2050 0.9744 -0.0926 +vn -0.0569 0.9940 -0.0937 +vn -0.0911 0.9275 -0.3625 +vn 0.1577 0.7390 -0.6550 +vn 0.3386 0.6702 -0.6605 +vn 0.3926 0.4285 -0.8138 +vn 0.1938 0.4878 -0.8512 +vn -0.3926 0.4285 -0.8138 +vn -0.3386 0.6702 -0.6605 +vn -0.1577 0.7390 -0.6550 +vn -0.1938 0.4878 -0.8512 +vn 0.3769 0.9123 -0.1600 +vn 0.6401 0.7324 -0.2320 +vn 0.6878 0.7206 0.0877 +vn 0.4445 0.8780 0.1777 +vn -0.6878 0.7206 0.0877 +vn -0.6401 0.7324 -0.2320 +vn -0.3769 0.9123 -0.1600 +vn -0.4445 0.8780 0.1777 +vn 0.4241 0.6987 0.5761 +vn 0.6499 0.5895 0.4797 +vn 0.6527 0.5727 0.4960 +vn 0.4826 0.6630 0.5723 +vn -0.6527 0.5727 0.4960 +vn -0.6499 0.5895 0.4797 +vn -0.4241 0.6987 0.5761 +vn -0.4826 0.6630 0.5723 +vn 0.6041 0.7367 0.3037 +vn 0.7488 0.6139 0.2500 +vn 0.8015 0.5968 0.0369 +vn 0.6547 0.7534 0.0612 +vn -0.8015 0.5968 0.0369 +vn -0.7488 0.6139 0.2500 +vn -0.6041 0.7367 0.3037 +vn -0.6547 0.7534 0.0612 +vn 0.6753 0.7277 -0.1198 +vn 0.8265 0.5523 -0.1089 +vn 0.8306 0.4446 -0.3354 +vn 0.6704 0.6235 -0.4022 +vn -0.8306 0.4446 -0.3354 +vn -0.8265 0.5523 -0.1089 +vn -0.6753 0.7277 -0.1198 +vn -0.6704 0.6235 -0.4022 +vn 0.7355 0.0900 -0.6715 +vn 0.6174 0.1265 -0.7764 +vn 0.6217 0.3786 -0.6856 +vn 0.8049 0.2659 -0.5305 +vn -0.6217 0.3786 -0.6856 +vn -0.6174 0.1265 -0.7764 +vn -0.7355 0.0900 -0.6715 +vn -0.8049 0.2659 -0.5305 +vn 0.4660 0.3523 -0.8117 +vn 0.4131 0.5939 -0.6904 +vn 0.5062 0.4910 -0.7090 +vn 0.5506 0.2356 -0.8009 +vn -0.5062 0.4910 -0.7090 +vn -0.4131 0.5939 -0.6904 +vn -0.4660 0.3523 -0.8117 +vn -0.5506 0.2356 -0.8009 +vn 0.4262 0.8052 -0.4124 +vn 0.4791 0.8726 -0.0948 +vn 0.6628 0.7417 -0.1022 +vn 0.5875 0.6976 -0.4100 +vn -0.6628 0.7417 -0.1022 +vn -0.4791 0.8726 -0.0948 +vn -0.4262 0.8052 -0.4124 +vn -0.5875 0.6976 -0.4100 +vn 0.5132 0.8522 0.1014 +vn 0.5589 0.7509 0.3519 +vn 0.7048 0.6492 0.2860 +vn 0.6854 0.7248 0.0699 +vn -0.7048 0.6492 0.2860 +vn -0.5589 0.7509 0.3519 +vn -0.5132 0.8522 0.1014 +vn -0.6854 0.7248 0.0699 +vn 0.5784 0.5616 0.5917 +vn 0.5439 0.5641 0.6212 +vn 0.6419 0.5601 0.5237 +vn 0.6900 0.5185 0.5049 +vn -0.6419 0.5601 0.5237 +vn -0.5439 0.5641 0.6212 +vn -0.5784 0.5616 0.5917 +vn -0.6900 0.5185 0.5049 +vn 0.1862 0.9392 -0.2884 +vn 0.3690 0.9136 -0.1708 +vn 0.5027 0.8432 0.1906 +vn 0.3772 0.8780 0.2945 +vn -0.5027 0.8432 0.1906 +vn -0.3690 0.9136 -0.1708 +vn -0.1862 0.9392 -0.2884 +vn -0.3772 0.8780 0.2945 +vn 0.1398 0.6437 0.7524 +vn 0.3113 0.6008 0.7362 +vn 0.2926 0.6596 0.6923 +vn 0.0963 0.7117 0.6959 +vn -0.2926 0.6596 0.6923 +vn -0.3113 0.6008 0.7362 +vn -0.1398 0.6437 0.7524 +vn -0.0963 0.7117 0.6959 +vn -0.3143 0.3098 -0.8974 +vn -0.3627 0.3016 -0.8818 +vn -0.0528 0.3888 -0.9198 +vn -0.1143 0.3499 -0.9298 +vn 0.0528 0.3888 -0.9198 +vn 0.3627 0.3016 -0.8818 +vn 0.3143 0.3098 -0.8974 +vn 0.1143 0.3499 -0.9298 +vn -0.1211 0.9543 0.2731 +vn -0.1029 0.9514 -0.2902 +vn 0.2076 0.8342 0.5109 +vn 0.1206 0.7069 0.6969 +vn -0.2076 0.8342 0.5109 +vn 0.1029 0.9514 -0.2902 +vn 0.1211 0.9543 0.2731 +vn -0.1206 0.7069 0.6969 +vn -0.0946 0.5719 0.8148 +vn -0.2268 0.6795 0.6977 +vn -0.0201 0.4661 0.8845 +vn 0.0201 0.4661 0.8845 +vn 0.2268 0.6795 0.6977 +vn 0.0946 0.5719 0.8148 +vn 0.9341 0.3265 -0.1448 +vn 0.9920 -0.1200 0.0389 +vn 0.9899 0.0001 0.1418 +vn 0.9175 0.3893 0.0816 +vn -0.9899 0.0001 0.1418 +vn -0.9920 -0.1200 0.0389 +vn -0.9341 0.3265 -0.1448 +vn -0.9175 0.3893 0.0816 +vn 0.9822 0.0351 0.1847 +vn 0.9887 0.0423 0.1439 +vn 0.9233 0.2360 0.3032 +vn 0.9173 0.2553 0.3055 +vn -0.9233 0.2360 0.3032 +vn -0.9887 0.0423 0.1439 +vn -0.9822 0.0351 0.1847 +vn -0.9173 0.2553 0.3055 +vn 0.9933 0.1151 0.0108 +vn 0.9809 0.1735 -0.0877 +vn 0.9626 0.2675 -0.0418 +vn 0.9508 0.2920 0.1034 +vn -0.9626 0.2675 -0.0418 +vn -0.9809 0.1735 -0.0877 +vn -0.9933 0.1151 0.0108 +vn -0.9508 0.2920 0.1034 +vn 0.9288 0.1135 -0.3527 +vn 0.9358 0.2030 -0.2882 +vn 0.9733 0.2074 -0.0979 +vn 0.9725 0.1765 -0.1522 +vn -0.9733 0.2074 -0.0979 +vn -0.9358 0.2030 -0.2882 +vn -0.9288 0.1135 -0.3527 +vn -0.9725 0.1765 -0.1522 +vn 0.6553 -0.7551 0.0203 +vn 0.5920 -0.8020 -0.0794 +vn 0.6279 -0.7768 -0.0482 +vn 0.6575 -0.7478 0.0919 +vn -0.6279 -0.7768 -0.0482 +vn -0.5920 -0.8020 -0.0794 +vn -0.6553 -0.7551 0.0203 +vn -0.6575 -0.7478 0.0919 +vn 0.4668 -0.8741 0.1343 +vn 0.4588 -0.8824 0.1046 +vn 0.4476 -0.8920 -0.0633 +vn 0.3413 -0.9399 0.0148 +vn -0.4476 -0.8920 -0.0633 +vn -0.4588 -0.8824 0.1046 +vn -0.4668 -0.8741 0.1343 +vn -0.3413 -0.9399 0.0148 +vn 0.5613 -0.8065 0.1858 +vn 0.4668 -0.8654 0.1818 +vn 0.4767 -0.8577 0.1925 +vn 0.5263 -0.8217 0.2186 +vn -0.4767 -0.8577 0.1925 +vn -0.4668 -0.8654 0.1818 +vn -0.5613 -0.8065 0.1858 +vn -0.5263 -0.8217 0.2186 +vn 0.5216 -0.8204 0.2341 +vn 0.6578 -0.6375 0.4011 +vn 0.7511 -0.6001 0.2753 +vn 0.5984 -0.7768 0.1963 +vn -0.7511 -0.6001 0.2753 +vn -0.6578 -0.6375 0.4011 +vn -0.5216 -0.8204 0.2341 +vn -0.5984 -0.7768 0.1963 +vn 0.7592 -0.6218 0.1926 +vn 0.7187 -0.6817 0.1373 +vn 0.6862 -0.7002 0.1973 +vn -0.6862 -0.7002 0.1973 +vn -0.7187 -0.6817 0.1373 +vn -0.7592 -0.6218 0.1926 +vn 0.4177 -0.7750 0.4742 +vn 0.4704 -0.8012 0.3699 +vn 0.4993 -0.5066 0.7029 +vn -0.4993 -0.5066 0.7029 +vn -0.4704 -0.8012 0.3699 +vn -0.4177 -0.7750 0.4742 +vn 0.6287 -0.1731 -0.7581 +vn 0.4658 -0.4492 -0.7624 +vn 0.5177 -0.4475 -0.7292 +vn 0.5802 -0.1684 -0.7969 +vn -0.5177 -0.4475 -0.7292 +vn -0.4658 -0.4492 -0.7624 +vn -0.6287 -0.1731 -0.7581 +vn -0.5802 -0.1684 -0.7969 +vn 0.4618 -0.0233 -0.8867 +vn 0.5443 -0.1128 -0.8313 +vn 0.5532 -0.3757 -0.7436 +vn 0.4454 -0.2665 -0.8548 +vn -0.5532 -0.3757 -0.7436 +vn -0.5443 -0.1128 -0.8313 +vn -0.4618 -0.0233 -0.8867 +vn -0.4454 -0.2665 -0.8548 +vn 0.2208 -0.9325 -0.2857 +vn 0.4424 -0.8447 -0.3014 +vn 0.4406 -0.7369 -0.5127 +vn 0.2445 -0.7812 -0.5744 +vn -0.4406 -0.7369 -0.5127 +vn -0.4424 -0.8447 -0.3014 +vn -0.2208 -0.9325 -0.2857 +vn -0.2445 -0.7812 -0.5744 +vn 0.5828 -0.7694 -0.2615 +vn 0.5586 -0.7104 -0.4281 +vn 0.6683 -0.6368 -0.3844 +vn 0.6382 -0.7320 -0.2386 +vn -0.6683 -0.6368 -0.3844 +vn -0.5586 -0.7104 -0.4281 +vn -0.5828 -0.7694 -0.2615 +vn -0.6382 -0.7320 -0.2386 +vn 0.4367 -0.3637 -0.8228 +vn 0.6197 -0.4763 -0.6238 +vn 0.4702 -0.6134 -0.6346 +vn -0.4702 -0.6134 -0.6346 +vn -0.6197 -0.4763 -0.6238 +vn -0.4367 -0.3637 -0.8228 +vn -0.0205 0.8492 0.5277 +vn -0.1918 0.8152 0.5466 +vn 0.4724 0.0875 0.8770 +vn 0.5353 0.0226 0.8444 +vn -0.4724 0.0875 0.8770 +vn 0.1918 0.8152 0.5466 +vn 0.0205 0.8492 0.5277 +vn -0.5353 0.0226 0.8444 +vn 0.1382 0.8098 0.5702 +vn 0.5113 -0.0565 0.8575 +vn 0.4345 -0.0954 0.8956 +vn 0.3782 0.6396 0.6692 +vn -0.4345 -0.0954 0.8956 +vn -0.5113 -0.0565 0.8575 +vn -0.1382 0.8098 0.5702 +vn -0.3782 0.6396 0.6692 +vn 0.5193 0.3696 0.7705 +vn 0.2324 -0.0550 0.9711 +vn 0.0996 -0.0175 0.9949 +vn 0.5077 0.1512 0.8481 +vn -0.0996 -0.0175 0.9949 +vn -0.2324 -0.0550 0.9711 +vn -0.5193 0.3696 0.7705 +vn -0.5077 0.1512 0.8481 +vn 0.4991 -0.0694 0.8637 +vn 0.0746 -0.0289 0.9968 +vn 0.1012 0.0676 0.9926 +vn 0.5339 -0.1803 0.8261 +vn -0.1012 0.0676 0.9926 +vn -0.0746 -0.0289 0.9968 +vn -0.4991 -0.0694 0.8637 +vn -0.5339 -0.1803 0.8261 +vn 0.5960 -0.3435 0.7258 +vn 0.2560 0.1901 0.9478 +vn 0.4547 0.1312 0.8809 +vn 0.5900 -0.5478 0.5931 +vn -0.4547 0.1312 0.8809 +vn -0.2560 0.1901 0.9478 +vn -0.5960 -0.3435 0.7258 +vn -0.5900 -0.5478 0.5931 +vn 0.5327 -0.6774 0.5073 +vn 0.6046 -0.0297 0.7960 +vn 0.5400 -0.1178 0.8334 +vn 0.3758 -0.7678 0.5189 +vn -0.5400 -0.1178 0.8334 +vn -0.6046 -0.0297 0.7960 +vn -0.5327 -0.6774 0.5073 +vn -0.3758 -0.7678 0.5189 +vn 0.4221 0.5591 0.7136 +vn 0.1653 0.8690 0.4664 +vn 0.2941 0.8048 0.5156 +vn 0.4756 0.4512 0.7551 +vn -0.2941 0.8048 0.5156 +vn -0.1653 0.8690 0.4664 +vn -0.4221 0.5591 0.7136 +vn -0.4756 0.4512 0.7551 +vn -0.2542 0.6512 0.7151 +vn -0.5563 0.7759 0.2974 +vn -0.2140 0.9014 0.3764 +vn 0.0794 0.7092 0.7005 +vn 0.2140 0.9014 0.3764 +vn 0.5563 0.7759 0.2974 +vn 0.2542 0.6512 0.7151 +vn -0.0794 0.7092 0.7005 +vn -0.5416 0.0466 0.8394 +vn -0.9486 0.1144 0.2950 +vn -0.8572 0.4571 0.2373 +vn -0.5241 0.3505 0.7761 +vn 0.8572 0.4571 0.2373 +vn 0.9486 0.1144 0.2950 +vn 0.5416 0.0466 0.8394 +vn 0.5241 0.3505 0.7761 +vn -0.0686 -0.3762 0.9240 +vn -0.3293 -0.5899 0.7373 +vn -0.8190 -0.2642 0.5093 +vn -0.4092 -0.1702 0.8964 +vn 0.8190 -0.2642 0.5093 +vn 0.3293 -0.5899 0.7373 +vn 0.0686 -0.3762 0.9240 +vn 0.4092 -0.1702 0.8964 +vn 0.5220 -0.4493 0.7251 +vn 0.4795 -0.6141 0.6268 +vn 0.2706 -0.6499 0.7102 +vn 0.3580 -0.4611 0.8119 +vn -0.2706 -0.6499 0.7102 +vn -0.4795 -0.6141 0.6268 +vn -0.5220 -0.4493 0.7251 +vn -0.3580 -0.4611 0.8119 +vn 0.6248 -0.3986 0.6714 +vn 0.6587 -0.3369 0.6727 +vn 0.6943 -0.4801 0.5362 +vn 0.6141 -0.5531 0.5630 +vn -0.6943 -0.4801 0.5362 +vn -0.6587 -0.3369 0.6727 +vn -0.6248 -0.3986 0.6714 +vn -0.6141 -0.5531 0.5630 +vn 0.7007 -0.7122 0.0431 +vn 0.5427 -0.8336 0.1032 +vn 0.8132 -0.5499 0.1903 +vn 0.8700 -0.4877 -0.0722 +vn -0.8132 -0.5499 0.1903 +vn -0.5427 -0.8336 0.1032 +vn -0.7007 -0.7122 0.0431 +vn -0.8700 -0.4877 -0.0722 +vn -0.0275 -0.6205 0.7837 +vn -0.0000 -0.7270 0.6867 +vn 0.1214 0.2350 0.9644 +vn 0.1592 0.3008 0.9403 +vn -0.1214 0.2350 0.9644 +vn 0.0275 -0.6205 0.7837 +vn -0.1592 0.3008 0.9403 +vn 0.9629 -0.2654 0.0480 +vn 0.8749 -0.4801 0.0636 +vn 0.9101 -0.3839 -0.1561 +vn 0.9621 -0.2621 -0.0750 +vn -0.9101 -0.3839 -0.1561 +vn -0.8749 -0.4801 0.0636 +vn -0.9629 -0.2654 0.0480 +vn -0.9621 -0.2621 -0.0750 +vn 0.2189 0.6396 0.7369 +vn 0.5025 -0.1434 0.8526 +vn 0.3438 0.0039 0.9391 +vn -0.3999 0.7149 0.5736 +vn -0.3438 0.0039 0.9391 +vn -0.5025 -0.1434 0.8526 +vn -0.2189 0.6396 0.7369 +vn 0.3999 0.7149 0.5736 +vn 0.1416 0.7362 0.6617 +vn 0.0708 0.9263 0.3701 +vn 0.1860 0.9347 0.3027 +vn 0.2524 0.7846 0.5662 +vn -0.1860 0.9347 0.3027 +vn -0.0708 0.9263 0.3701 +vn -0.1416 0.7362 0.6617 +vn -0.2524 0.7846 0.5662 +vn 0.6620 -0.0533 0.7476 +vn 0.7321 0.0500 0.6793 +vn 0.6702 0.2898 0.6832 +vn 0.6793 0.3834 0.6258 +vn -0.6702 0.2898 0.6833 +vn -0.7321 0.0500 0.6793 +vn -0.6620 -0.0533 0.7476 +vn -0.6793 0.3834 0.6258 +vn 0.6671 0.4915 0.5599 +vn 0.7185 0.3229 0.6161 +vn 0.5895 0.2524 0.7673 +vn 0.4953 0.5448 0.6767 +vn -0.5895 0.2524 0.7673 +vn -0.7185 0.3229 0.6161 +vn -0.6671 0.4915 0.5599 +vn -0.4953 0.5448 0.6767 +vn 0.7462 -0.5303 0.4026 +vn 0.8459 -0.4455 0.2933 +vn 0.9177 -0.3399 0.2058 +vn 0.8790 -0.4117 0.2408 +vn -0.9177 -0.3399 0.2058 +vn -0.8459 -0.4455 0.2933 +vn -0.7462 -0.5303 0.4026 +vn -0.8790 -0.4117 0.2408 +vn 0.6539 -0.3645 0.6630 +vn 0.7818 -0.3994 0.4789 +vn 0.6662 -0.4851 0.5664 +vn 0.6220 -0.4608 0.6331 +vn -0.6662 -0.4851 0.5664 +vn -0.7818 -0.3994 0.4789 +vn -0.6539 -0.3645 0.6630 +vn -0.6220 -0.4608 0.6331 +vn 0.5746 -0.3515 0.7391 +vn 0.5455 -0.3604 0.7567 +vn 0.6377 -0.4508 0.6246 +vn 0.6737 -0.4640 0.5752 +vn -0.6377 -0.4508 0.6246 +vn -0.5455 -0.3604 0.7567 +vn -0.5746 -0.3515 0.7391 +vn -0.6737 -0.4640 0.5752 +vn 0.9892 -0.1431 -0.0332 +vn 0.9361 -0.3355 0.1060 +vn 0.8935 -0.2348 0.3827 +vn 0.9914 0.1179 0.0563 +vn -0.8935 -0.2348 0.3827 +vn -0.9361 -0.3355 0.1060 +vn -0.9892 -0.1431 -0.0332 +vn -0.9914 0.1179 0.0563 +vn 0.9423 -0.3297 -0.0577 +vn 0.9147 -0.3752 -0.1502 +vn 0.9298 -0.3679 -0.0089 +vn 0.9130 -0.4078 0.0129 +vn -0.9298 -0.3679 -0.0089 +vn -0.9147 -0.3752 -0.1502 +vn -0.9423 -0.3297 -0.0577 +vn -0.9130 -0.4078 0.0129 +vn 0.9354 -0.3331 -0.1189 +vn 0.9649 -0.0182 0.2620 +vn 0.9646 -0.2265 0.1348 +vn -0.9647 -0.2265 0.1348 +vn -0.9649 -0.0182 0.2620 +vn -0.9354 -0.3331 -0.1189 +vn 0.7120 -0.5876 0.3845 +vn 0.7337 -0.5770 0.3589 +vn 0.6887 -0.5163 0.5090 +vn 0.6830 -0.4932 0.5387 +vn -0.6887 -0.5163 0.5090 +vn -0.7337 -0.5770 0.3589 +vn -0.7120 -0.5876 0.3845 +vn -0.6830 -0.4932 0.5387 +vn 0.7388 -0.5816 0.3406 +vn 0.7333 -0.6043 0.3116 +vn 0.6509 -0.5579 0.5149 +vn 0.6816 -0.5313 0.5030 +vn -0.6509 -0.5579 0.5149 +vn -0.7333 -0.6043 0.3116 +vn -0.7388 -0.5816 0.3406 +vn -0.6816 -0.5313 0.5030 +vn 0.7243 -0.6494 0.2318 +vn 0.8306 -0.5336 0.1593 +vn 0.6951 -0.4454 0.5644 +vn 0.6174 -0.5989 0.5101 +vn -0.6951 -0.4454 0.5644 +vn -0.8306 -0.5336 0.1593 +vn -0.7243 -0.6494 0.2318 +vn -0.6174 -0.5989 0.5101 +vn 0.6811 0.6657 0.3050 +vn 0.4426 0.8229 0.3563 +vn 0.4269 0.7886 0.4425 +vn 0.6184 0.4156 0.6670 +vn -0.4269 0.7886 0.4425 +vn -0.4426 0.8229 0.3563 +vn -0.6811 0.6657 0.3050 +vn -0.6184 0.4156 0.6670 +vn 0.7428 0.5039 0.4407 +vn 0.8473 0.1348 0.5137 +vn 0.8098 0.1403 0.5697 +vn 0.7151 0.4634 0.5233 +vn -0.8098 0.1403 0.5697 +vn -0.8473 0.1348 0.5137 +vn -0.7428 0.5039 0.4407 +vn -0.7151 0.4634 0.5233 +vn 0.8087 -0.3438 0.4774 +vn 0.9084 0.0479 0.4153 +vn 0.6406 0.3517 0.6826 +vn 0.7902 -0.3805 0.4805 +vn -0.6406 0.3517 0.6826 +vn -0.9084 0.0479 0.4153 +vn -0.8087 -0.3438 0.4774 +vn -0.7902 -0.3805 0.4805 +vn 0.1493 0.9765 0.1554 +vn -0.0046 0.9804 0.1972 +vn -0.0662 0.9281 0.3663 +vn -0.0823 0.9430 0.3225 +vn 0.0662 0.9281 0.3663 +vn 0.0046 0.9804 0.1972 +vn -0.1493 0.9765 0.1554 +vn 0.0823 0.9430 0.3225 +vn 0.5698 -0.6825 0.4576 +vn 0.6797 -0.6052 0.4145 +vn 0.6792 -0.4446 0.5840 +vn 0.6092 -0.4742 0.6355 +vn -0.6792 -0.4446 0.5840 +vn -0.6797 -0.6052 0.4145 +vn -0.5698 -0.6825 0.4576 +vn -0.6092 -0.4742 0.6356 +vn 0.1434 -0.8406 0.5224 +vn 0.4106 -0.7628 0.4995 +vn 0.4658 -0.6095 0.6415 +vn 0.2145 -0.6668 0.7137 +vn -0.4658 -0.6095 0.6415 +vn -0.4106 -0.7628 0.4995 +vn -0.1434 -0.8406 0.5224 +vn -0.2145 -0.6668 0.7137 +vn -0.9542 -0.2910 -0.0694 +vn -0.5829 -0.7510 0.3104 +vn -0.1380 -0.4256 0.8943 +vn -0.3713 -0.1545 0.9156 +vn 0.1380 -0.4256 0.8943 +vn 0.5829 -0.7510 0.3104 +vn 0.9542 -0.2910 -0.0694 +vn 0.3713 -0.1545 0.9156 +vn -0.8679 0.4114 -0.2784 +vn -0.9569 0.1243 -0.2625 +vn -0.3893 0.0699 0.9185 +vn -0.2116 0.2604 0.9420 +vn 0.3893 0.0699 0.9185 +vn 0.9569 0.1243 -0.2625 +vn 0.8679 0.4114 -0.2784 +vn 0.2116 0.2604 0.9420 +vn -0.4099 0.9112 0.0419 +vn -0.6783 0.7208 -0.1430 +vn -0.0276 0.4645 0.8851 +vn 0.1209 0.6487 0.7513 +vn 0.0276 0.4645 0.8851 +vn 0.6783 0.7208 -0.1430 +vn 0.4099 0.9112 0.0419 +vn -0.1209 0.6487 0.7513 +vn 0.0860 0.9649 0.2483 +vn -0.0841 0.9794 0.1834 +vn 0.3082 0.7442 0.5926 +vn 0.2655 0.8263 0.4968 +vn -0.3082 0.7442 0.5926 +vn 0.0841 0.9794 0.1834 +vn -0.0860 0.9649 0.2483 +vn -0.2655 0.8263 0.4968 +vn 0.2574 0.1434 0.9556 +vn 0.2381 0.1169 0.9642 +vn 0.1210 0.1419 0.9825 +vn 0.1726 0.0265 0.9846 +vn -0.1210 0.1419 0.9825 +vn -0.2381 0.1169 0.9642 +vn -0.2574 0.1434 0.9556 +vn -0.1726 0.0265 0.9846 +vn 0.2675 0.0341 0.9630 +vn 0.2930 0.1243 0.9480 +vn 0.4064 0.0313 0.9132 +vn 0.3320 0.0177 0.9431 +vn -0.4064 0.0313 0.9132 +vn -0.2930 0.1243 0.9480 +vn -0.2675 0.0341 0.9630 +vn -0.3320 0.0177 0.9431 +vn 0.3485 0.0044 0.9373 +vn 0.4045 -0.0499 0.9132 +vn 0.3634 -0.0903 0.9272 +vn 0.3158 0.0103 0.9488 +vn -0.3634 -0.0903 0.9272 +vn -0.4045 -0.0499 0.9132 +vn -0.3485 0.0044 0.9373 +vn -0.3158 0.0103 0.9488 +vn 0.2438 0.0400 0.9690 +vn 0.3102 -0.1465 0.9393 +vn 0.4165 -0.0288 0.9087 +vn 0.3278 0.1814 0.9272 +vn -0.4165 -0.0288 0.9087 +vn -0.3102 -0.1465 0.9393 +vn -0.2438 0.0400 0.9690 +vn -0.3278 0.1814 0.9272 +vn 0.4524 0.2283 0.8621 +vn 0.5000 0.0443 0.8649 +vn 0.3320 0.1101 0.9368 +vn 0.3219 0.3049 0.8963 +vn -0.3320 0.1101 0.9368 +vn -0.5000 0.0443 0.8649 +vn -0.4524 0.2283 0.8621 +vn -0.3219 0.3049 0.8963 +vn 0.4596 -0.1697 0.8718 +vn 0.3694 -0.0290 0.9288 +vn 0.3783 0.0030 0.9257 +vn 0.4989 -0.1092 0.8598 +vn -0.3783 0.0030 0.9257 +vn -0.3694 -0.0290 0.9288 +vn -0.4596 -0.1697 0.8718 +vn -0.4989 -0.1092 0.8598 +vn 0.3907 -0.1939 0.8999 +vn 0.3001 -0.1973 0.9333 +vn 0.2293 -0.0197 0.9732 +vn 0.3158 -0.0334 0.9482 +vn -0.2293 -0.0197 0.9732 +vn -0.3001 -0.1973 0.9333 +vn -0.3907 -0.1939 0.8999 +vn -0.3158 -0.0334 0.9482 +vn 0.1769 0.1801 0.9676 +vn 0.1284 -0.0032 0.9917 +vn 0.2247 -0.1899 0.9558 +vn 0.3179 -0.0537 0.9466 +vn -0.2247 -0.1899 0.9558 +vn -0.1284 -0.0032 0.9917 +vn -0.1769 0.1801 0.9676 +vn -0.3179 -0.0537 0.9466 +vn -0.2447 0.7696 0.5897 +vn -0.1043 0.6828 0.7231 +vn -0.0510 0.4334 0.8998 +vn -0.0186 0.3169 0.9483 +vn 0.0510 0.4334 0.8998 +vn 0.1043 0.6828 0.7231 +vn 0.2447 0.7696 0.5897 +vn 0.0186 0.3169 0.9483 +vn 0.5827 0.1008 0.8064 +vn 0.5408 0.0016 0.8412 +vn 0.4163 0.1692 0.8933 +vn 0.4931 0.2814 0.8232 +vn -0.4163 0.1692 0.8933 +vn -0.5408 0.0016 0.8412 +vn -0.5827 0.1008 0.8064 +vn -0.4931 0.2814 0.8232 +vn 0.4316 -0.1456 0.8902 +vn 0.4343 -0.1822 0.8822 +vn 0.4757 -0.1189 0.8715 +vn 0.4741 -0.0525 0.8789 +vn -0.4757 -0.1189 0.8715 +vn -0.4343 -0.1822 0.8822 +vn -0.4316 -0.1456 0.8902 +vn -0.4741 -0.0525 0.8789 +vn 0.5201 -0.0786 0.8505 +vn 0.5090 -0.1171 0.8528 +vn 0.4391 -0.2271 0.8692 +vn 0.4623 -0.1564 0.8728 +vn -0.4391 -0.2271 0.8692 +vn -0.5090 -0.1171 0.8528 +vn -0.5201 -0.0786 0.8505 +vn -0.4623 -0.1564 0.8728 +vn 0.4584 0.2779 0.8442 +vn 0.4637 0.2832 0.8395 +vn 0.5251 0.1076 0.8442 +vn 0.5149 0.1364 0.8463 +vn -0.5251 0.1076 0.8442 +vn -0.4637 0.2832 0.8395 +vn -0.4584 0.2779 0.8442 +vn -0.5149 0.1364 0.8463 +vn 0.4182 0.3033 0.8562 +vn 0.3713 0.4206 0.8278 +vn 0.3842 0.3492 0.8547 +vn -0.3842 0.3492 0.8547 +vn -0.3713 0.4206 0.8278 +vn -0.4182 0.3033 0.8562 +vn 0.2752 -0.9606 0.0402 +vn 0.0743 -0.9972 0.0065 +vn -0.2865 -0.6869 -0.6679 +vn -0.2351 -0.6646 -0.7092 +vn 0.2865 -0.6869 -0.6679 +vn -0.0743 -0.9972 0.0065 +vn -0.2752 -0.9606 0.0402 +vn 0.2351 -0.6646 -0.7092 +vn 0.6745 -0.6981 0.2403 +vn 0.4664 -0.8799 0.0914 +vn 0.0273 -0.6492 -0.7601 +vn 0.3356 -0.6177 -0.7112 +vn -0.0273 -0.6492 -0.7601 +vn -0.4664 -0.8799 0.0914 +vn -0.6745 -0.6981 0.2403 +vn -0.3356 -0.6177 -0.7112 +vn 0.8891 -0.0884 0.4492 +vn 0.8268 -0.3823 0.4126 +vn 0.8267 -0.4481 -0.3404 +vn 0.9932 -0.0290 -0.1131 +vn -0.8267 -0.4481 -0.3404 +vn -0.8268 -0.3823 0.4126 +vn -0.8891 -0.0884 0.4492 +vn -0.9932 -0.0290 -0.1131 +vn 0.6766 0.7300 0.0964 +vn 0.8915 0.3241 0.3165 +vn 0.9286 0.2822 -0.2409 +vn 0.4775 0.6112 -0.6312 +vn -0.9286 0.2822 -0.2409 +vn -0.8915 0.3241 0.3165 +vn -0.6766 0.7300 0.0964 +vn -0.4775 0.6112 -0.6312 +vn -0.2459 0.9629 -0.1115 +vn 0.0806 0.9919 -0.0978 +vn -0.1731 0.5767 -0.7984 +vn -0.4004 0.5448 -0.7368 +vn 0.1731 0.5767 -0.7984 +vn -0.0806 0.9919 -0.0978 +vn 0.2459 0.9629 -0.1115 +vn 0.4004 0.5448 -0.7368 +vn -0.4907 0.8712 0.0129 +vn -0.3626 0.9299 -0.0613 +vn -0.5145 0.5403 -0.6658 +vn -0.5531 0.5711 -0.6066 +vn 0.5145 0.5403 -0.6658 +vn 0.3626 0.9299 -0.0613 +vn 0.4907 0.8712 0.0129 +vn 0.5531 0.5711 -0.6066 +vn -0.4742 0.0784 -0.8769 +vn -0.4415 -0.1127 -0.8901 +vn -0.3900 -0.1353 -0.9108 +vn -0.4209 0.0836 -0.9032 +vn 0.3900 -0.1353 -0.9108 +vn 0.4415 -0.1127 -0.8901 +vn 0.4742 0.0784 -0.8769 +vn 0.4209 0.0836 -0.9032 +vn -0.3249 0.0745 -0.9428 +vn -0.1883 0.0705 -0.9796 +vn -0.0850 -0.1226 -0.9888 +vn -0.2465 -0.1132 -0.9625 +vn 0.0850 -0.1226 -0.9888 +vn 0.1883 0.0705 -0.9796 +vn 0.3249 0.0745 -0.9428 +vn 0.2465 -0.1132 -0.9625 +vn 0.0940 0.1248 -0.9877 +vn 0.8215 0.1014 -0.5612 +vn 0.2027 -0.1366 -0.9697 +vn -0.2027 -0.1366 -0.9697 +vn -0.8215 0.1013 -0.5612 +vn -0.0940 0.1248 -0.9877 +vn 0.2613 0.7349 -0.6258 +vn -0.1992 0.9792 -0.0379 +vn -0.6616 0.7467 0.0689 +vn -0.5331 0.6611 -0.5280 +vn 0.6616 0.7467 0.0689 +vn 0.1992 0.9792 -0.0379 +vn -0.2613 0.7349 -0.6258 +vn 0.5331 0.6611 -0.5280 +vn 0.5925 -0.1146 -0.7974 +vn 0.1350 0.0215 -0.9906 +vn 0.1295 -0.2589 -0.9572 +vn 0.4466 -0.3788 -0.8106 +vn -0.1295 -0.2589 -0.9572 +vn -0.1350 0.0215 -0.9906 +vn -0.5925 -0.1146 -0.7974 +vn -0.4466 -0.3788 -0.8106 +vn -0.1199 -0.9705 -0.2090 +vn 0.0603 -0.7863 -0.6149 +vn -0.1223 -0.7503 -0.6497 +vn -0.1446 -0.9850 -0.0941 +vn 0.1223 -0.7503 -0.6497 +vn -0.0603 -0.7863 -0.6149 +vn 0.1199 -0.9705 -0.2090 +vn 0.1446 -0.9850 -0.0941 +usemtl None +s off +f 6083/6334/5899 6545/6335/5899 7549/6336/5899 6544/6337/5899 +f 6545/6335/5900 6037/6338/5900 6546/6339/5900 7549/6336/5900 +f 7549/6336/5901 6546/6339/5901 6039/6340/5901 6547/6341/5901 +f 6544/6337/5902 7549/6336/5902 6547/6341/5902 6081/6342/5902 +f 6040/6343/5903 6549/6344/5903 7550/6345/5903 6548/6346/5903 +f 6549/6344/5904 6038/6347/5904 6550/6348/5904 7550/6345/5904 +f 7550/6345/5905 6550/6348/5905 6084/6349/5905 6551/6350/5905 +f 6548/6346/5906 7550/6345/5906 6551/6350/5906 6082/6351/5906 +f 6081/6342/5907 6547/6341/5907 7551/6352/5907 6552/6353/5907 +f 6547/6341/5908 6039/6340/5908 6553/6354/5908 7551/6352/5908 +f 7551/6352/5909 6553/6354/5909 6041/6355/5909 6554/6356/5909 +f 6552/6353/5910 7551/6352/5910 6554/6356/5910 6079/6357/5910 +f 6042/6358/5911 6556/6359/5911 7552/6360/5911 6555/6361/5911 +f 6556/6359/5912 6040/6343/5912 6548/6346/5912 7552/6360/5912 +f 7552/6360/5913 6548/6346/5913 6082/6351/5913 6557/6362/5913 +f 6555/6361/5914 7552/6360/5914 6557/6362/5914 6080/6363/5914 +f 6039/6340/5915 6558/6364/5915 7553/6365/5915 6553/6354/5915 +f 6558/6364/5916 6045/6366/5916 6559/6367/5916 7553/6365/5916 +f 7553/6365/5917 6559/6367/5917 6043/6368/5917 6560/6369/5917 +f 6553/6354/5918 7553/6365/5918 6560/6369/5918 6041/6355/5918 +f 6044/6370/5919 6562/6371/5919 7554/6372/5919 6561/6373/5919 +f 6562/6371/5920 6046/6374/5920 6563/6375/5920 7554/6372/5920 +f 7554/6372/5921 6563/6375/5921 6040/6343/5921 6556/6359/5921 +f 6561/6373/5922 7554/6372/5922 6556/6359/5922 6042/6358/5922 +f 6037/6338/5923 6564/6376/5923 7555/6377/5923 6546/6339/5923 +f 6564/6376/5924 6047/6378/5924 6565/6379/5924 7555/6377/5924 +f 7555/6377/5925 6565/6379/5925 6045/6366/5925 6558/6364/5925 +f 6546/6339/5926 7555/6377/5926 6558/6364/5926 6039/6340/5926 +f 6046/6374/5927 6566/6380/5927 7556/6381/5927 6563/6375/5927 +f 6566/6380/5928 6048/6382/5928 6567/6383/5928 7556/6381/5928 +f 7556/6381/5929 6567/6383/5929 6038/6347/5929 6549/6344/5929 +f 6563/6375/5930 7556/6381/5930 6549/6344/5930 6040/6343/5930 +f 6047/6378/5931 6568/6384/5931 7557/6385/5931 6565/6379/5931 +f 6568/6384/5932 6049/6386/5932 6569/6387/5932 7557/6385/5932 +f 7557/6385/5933 6569/6387/5933 6051/6388/5933 6570/6389/5933 +f 6565/6379/5934 7557/6385/5934 6570/6389/5934 6045/6366/5934 +f 6052/6390/5935 6572/6391/5935 7558/6392/5935 6571/6393/5935 +f 6572/6391/5936 6050/6394/5936 6573/6395/5936 7558/6392/5936 +f 7558/6392/5937 6573/6395/5937 6048/6382/5937 6566/6380/5937 +f 6571/6393/5938 7558/6392/5938 6566/6380/5938 6046/6374/5938 +f 6045/6366/5939 6570/6389/5939 7559/6396/5939 6559/6367/5939 +f 6570/6389/5940 6051/6388/5940 6574/6397/5940 7559/6396/5940 +f 7559/6396/5941 6574/6397/5941 6053/6398/5941 6575/6399/5941 +f 6559/6367/5942 7559/6396/5942 6575/6399/5942 6043/6368/5942 +f 6054/6400/5943 6577/6401/5943 7560/6402/5943 6576/6403/5943 +f 6577/6401/5944 6052/6390/5944 6571/6393/5944 7560/6402/5944 +f 7560/6402/5945 6571/6393/5945 6046/6374/5945 6562/6371/5945 +f 6576/6403/5946 7560/6402/5946 6562/6371/5946 6044/6370/5946 +f 6051/6388/5947 6578/6404/5947 7561/6405/5947 6574/6397/5947 +f 6578/6404/5948 6057/6406/5948 6579/6407/5948 7561/6405/5948 +f 7561/6405/5949 6579/6407/5949 6055/6408/5949 6580/6409/5949 +f 6574/6397/5950 7561/6405/5950 6580/6409/5950 6053/6398/5950 +f 6056/6410/5951 6582/6411/5951 7562/6412/5951 6581/6413/5951 +f 6582/6411/5952 6058/6414/5952 6583/6415/5952 7562/6412/5952 +f 7562/6412/5953 6583/6415/5953 6052/6390/5953 6577/6401/5953 +f 6581/6413/5954 7562/6412/5954 6577/6401/5954 6054/6400/5954 +f 6049/6386/5955 6584/6416/5955 7563/6417/5955 6569/6387/5955 +f 6584/6416/5956 6059/6418/5956 6585/6419/5956 7563/6417/5956 +f 7563/6417/5957 6585/6419/5957 6057/6406/5957 6578/6404/5957 +f 6569/6387/5958 7563/6417/5958 6578/6404/5958 6051/6388/5958 +f 6058/6414/5959 6586/6420/5959 7564/6421/5959 6583/6415/5959 +f 6586/6420/5960 6060/6422/5960 6587/6423/5960 7564/6421/5960 +f 7564/6421/5961 6587/6423/5961 6050/6394/5961 6572/6391/5961 +f 6583/6415/5962 7564/6421/5962 6572/6391/5962 6052/6390/5962 +f 6059/6418/5963 6588/6424/5963 7565/6425/5963 6585/6419/5963 +f 6588/6424/5964 6061/6426/5964 6589/6427/5964 7565/6425/5964 +f 7565/6425/5965 6589/6427/5965 6063/6428/5965 6590/6429/5965 +f 6585/6419/5966 7565/6425/5966 6590/6429/5966 6057/6406/5966 +f 6064/6430/5967 6592/6431/5967 7566/6432/5967 6591/6433/5967 +f 6592/6431/5968 6062/6434/5968 6593/6435/5968 7566/6432/5968 +f 7566/6432/5969 6593/6435/5969 6060/6422/5969 6586/6420/5969 +f 6591/6433/5970 7566/6432/5970 6586/6420/5970 6058/6414/5970 +f 6057/6406/5971 6590/6429/5971 7567/6436/5971 6579/6407/5971 +f 6590/6429/5972 6063/6428/5972 6594/6437/5972 7567/6436/5972 +f 7567/6436/5973 6594/6437/5973 6065/6438/5973 6595/6439/5973 +f 6579/6407/5974 7567/6436/5974 6595/6439/5974 6055/6408/5974 +f 6066/6440/5975 6597/6441/5975 7568/6442/5975 6596/6443/5975 +f 6597/6441/5976 6064/6430/5976 6591/6433/5976 7568/6442/5976 +f 7568/6442/5977 6591/6433/5977 6058/6414/5977 6582/6411/5977 +f 6596/6443/5978 7568/6442/5978 6582/6411/5978 6056/6410/5978 +f 6063/6428/5979 6598/6444/5979 7569/6445/5979 6594/6437/5979 +f 6598/6444/5980 6069/6446/5980 6599/6447/5980 7569/6445/5980 +f 7569/6445/5981 6599/6447/5981 6067/6448/5981 6600/6449/5981 +f 6594/6437/5982 7569/6445/5982 6600/6449/5982 6065/6438/5982 +f 6068/6450/5983 6602/6451/5983 7570/6452/5983 6601/6453/5983 +f 6602/6451/5984 6070/6454/5984 6603/6455/5984 7570/6452/5984 +f 7570/6452/5985 6603/6455/5985 6064/6430/5985 6597/6441/5985 +f 6601/6453/5986 7570/6452/5986 6597/6441/5986 6066/6440/5986 +f 6061/6426/5987 6604/6456/5987 7571/6457/5987 6589/6427/5987 +f 6604/6456/5988 6071/6458/5988 6605/6459/5988 7571/6457/5988 +f 7571/6457/5989 6605/6459/5989 6069/6446/5989 6598/6444/5989 +f 6589/6427/5990 7571/6457/5990 6598/6444/5990 6063/6428/5990 +f 6070/6454/5991 6606/6460/5991 7572/6461/5991 6603/6455/5991 +f 6606/6460/5992 6072/6462/5992 6607/6463/5992 7572/6461/5992 +f 7572/6461/5993 6607/6463/5993 6062/6434/5993 6592/6431/5993 +f 6603/6455/5994 7572/6461/5994 6592/6431/5994 6064/6430/5994 +f 6071/6458/5995 6608/6464/5995 7573/6465/5995 6605/6459/5995 +f 6608/6464/5996 6073/6466/5996 6609/6467/5996 7573/6465/5996 +f 7573/6465/5997 6609/6467/5997 6075/6468/5997 6610/6469/5997 +f 6605/6459/5998 7573/6465/5998 6610/6469/5998 6069/6446/5998 +f 6076/6470/5999 6612/6471/5999 7574/6472/5999 6611/6473/5999 +f 6612/6471/6000 6074/6474/6000 6613/6475/6000 7574/6472/6000 +f 7574/6472/6001 6613/6475/6001 6072/6462/6001 6606/6460/6001 +f 6611/6473/6002 7574/6472/6002 6606/6460/6002 6070/6454/6002 +f 6069/6446/6003 6610/6469/6003 7575/6476/6003 6599/6447/6003 +f 6610/6469/6004 6075/6468/6004 6614/6477/6004 7575/6476/6004 +f 7575/6476/6005 6614/6477/6005 6077/6478/6005 6615/6479/6005 +f 6599/6447/6006 7575/6476/6006 6615/6479/6006 6067/6448/6006 +f 6078/6480/6007 6617/6481/6007 7576/6482/6007 6616/6483/6007 +f 6617/6481/6008 6076/6470/6008 6611/6473/6008 7576/6482/6008 +f 7576/6482/6009 6611/6473/6009 6070/6454/6009 6602/6451/6009 +f 6616/6483/6010 7576/6482/6010 6602/6451/6010 6068/6450/6010 +f 6075/6468/6011 6618/6484/6011 7577/6485/6011 6614/6477/6011 +f 6618/6484/6012 6081/6342/6012 6552/6353/6012 7577/6485/6012 +f 7577/6485/6013 6552/6353/6013 6079/6357/6013 6619/6486/6013 +f 6614/6477/6014 7577/6485/6014 6619/6486/6014 6077/6478/6014 +f 6080/6363/6015 6557/6362/6015 7578/6487/6015 6620/6488/6015 +f 6557/6362/6016 6082/6351/6016 6621/6489/6016 7578/6487/6016 +f 7578/6487/6017 6621/6489/6017 6076/6470/6017 6617/6481/6017 +f 6620/6488/6018 7578/6487/6018 6617/6481/6018 6078/6480/6018 +f 6073/6466/6019 6622/6490/6019 7579/6491/6019 6609/6467/6019 +f 6622/6490/6020 6083/6334/6020 6544/6337/6020 7579/6491/6020 +f 7579/6491/6021 6544/6337/6021 6081/6342/6021 6618/6484/6021 +f 6609/6467/6022 7579/6491/6022 6618/6484/6022 6075/6468/6022 +f 6082/6351/6023 6551/6350/6023 7580/6492/6023 6621/6489/6023 +f 6551/6350/6024 6084/6349/6024 6623/6493/6024 7580/6492/6024 +f 7580/6492/6025 6623/6493/6025 6074/6474/6025 6612/6471/6025 +f 6621/6489/6026 7580/6492/6026 6612/6471/6026 6076/6470/6026 +f 6083/6334/6027 6622/6490/6027 7581/6494/6027 6624/6495/6027 +f 6622/6490/6028 6073/6466/6028 6625/6496/6028 7581/6494/6028 +f 7581/6494/6029 6625/6496/6029 6087/6497/6029 6626/6498/6029 +f 6624/6495/6030 7581/6494/6030 6626/6498/6030 6085/6499/6030 +f 6088/6500/6031 6628/6501/6031 7582/6502/6031 6627/6503/6031 +f 6628/6501/6032 6074/6474/6032 6623/6493/6032 7582/6502/6032 +f 7582/6502/6033 6623/6493/6033 6084/6349/6033 6629/6504/6033 +f 6627/6503/6034 7582/6502/6034 6629/6504/6034 6086/6505/6034 +f 6073/6466/6035 6608/6464/6035 7583/6506/6035 6625/6496/6035 +f 6608/6464/6036 6071/6458/6036 6630/6507/6036 7583/6506/6036 +f 7583/6506/6037 6630/6507/6037 6089/6508/6037 6631/6509/6037 +f 6625/6496/6038 7583/6506/6038 6631/6509/6038 6087/6497/6038 +f 6090/6510/6039 6633/6511/6039 7584/6512/6039 6632/6513/6039 +f 6633/6511/6040 6072/6462/6040 6613/6475/6040 7584/6512/6040 +f 7584/6512/6041 6613/6475/6041 6074/6474/6041 6628/6501/6041 +f 6632/6513/6042 7584/6512/6042 6628/6501/6042 6088/6500/6042 +f 6071/6458/6043 6604/6456/6043 7585/6514/6043 6630/6507/6043 +f 6604/6456/6044 6061/6426/6044 6634/6515/6044 7585/6514/6044 +f 7585/6514/6045 6634/6515/6045 6091/6516/6045 6635/6517/6045 +f 6630/6507/6046 7585/6514/6046 6635/6517/6046 6089/6508/6046 +f 6092/6518/6047 6637/6519/6047 7586/6520/6047 6636/6521/6047 +f 6637/6519/6048 6062/6434/6048 6607/6463/6048 7586/6520/6048 +f 7586/6520/6049 6607/6463/6049 6072/6462/6049 6633/6511/6049 +f 6636/6521/6050 7586/6520/6050 6633/6511/6050 6090/6510/6050 +f 6061/6426/6051 6588/6424/6051 7587/6522/6051 6634/6515/6051 +f 6588/6424/6052 6059/6418/6052 6638/6523/6052 7587/6522/6052 +f 7587/6522/6053 6638/6523/6053 6093/6524/6053 6639/6525/6053 +f 6634/6515/6054 7587/6522/6054 6639/6525/6054 6091/6516/6054 +f 6094/6526/6055 6641/6527/6055 7588/6528/6055 6640/6529/6055 +f 6641/6527/6056 6060/6422/6056 6593/6435/6056 7588/6528/6056 +f 7588/6528/6057 6593/6435/6057 6062/6434/6057 6637/6519/6057 +f 6640/6529/6058 7588/6528/6058 6637/6519/6058 6092/6518/6058 +f 6059/6418/6059 6584/6416/6059 7589/6530/6059 6638/6523/6059 +f 6584/6416/6060 6049/6386/6060 6642/6531/6060 7589/6530/6060 +f 7589/6530/6061 6642/6531/6061 6095/6532/6061 6643/6533/6061 +f 6638/6523/6062 7589/6530/6062 6643/6533/6062 6093/6524/6062 +f 6096/6534/6063 6645/6535/6063 7590/6536/6063 6644/6537/6063 +f 6645/6535/6064 6050/6394/6064 6587/6423/6064 7590/6536/6064 +f 7590/6536/6065 6587/6423/6065 6060/6422/6065 6641/6527/6065 +f 6644/6537/6066 7590/6536/6066 6641/6527/6066 6094/6526/6066 +f 6049/6386/6067 6568/6384/6067 7591/6538/6067 6642/6531/6067 +f 6568/6384/6068 6047/6378/6068 6646/6539/6068 7591/6538/6068 +f 7591/6538/6069 6646/6539/6069 6099/6540/6069 6647/6541/6069 +f 6642/6531/6070 7591/6538/6070 6647/6541/6070 6095/6532/6070 +f 6100/6542/6071 6649/6543/6071 7592/6544/6071 6648/6545/6071 +f 6649/6543/6072 6048/6382/6072 6573/6395/6072 7592/6544/6072 +f 7592/6544/6073 6573/6395/6073 6050/6394/6073 6645/6535/6073 +f 6648/6545/6074 7592/6544/6074 6645/6535/6074 6096/6534/6074 +f 6047/6378/6075 6564/6376/6075 7593/6546/6075 6646/6539/6075 +f 6564/6376/6076 6037/6338/6076 6650/6547/6076 7593/6546/6076 +f 7593/6546/6077 6650/6547/6077 6101/6548/6077 6651/6549/6077 +f 6646/6539/6078 7593/6546/6078 6651/6549/6078 6099/6540/6078 +f 6102/6550/6079 6653/6551/6079 7594/6552/6079 6652/6553/6079 +f 6653/6551/6080 6038/6347/6080 6567/6383/6080 7594/6552/6080 +f 7594/6552/6081 6567/6383/6081 6048/6382/6081 6649/6543/6081 +f 6652/6553/6082 7594/6552/6082 6649/6543/6082 6100/6542/6082 +f 6037/6338/6083 6545/6335/6083 7595/6554/6083 6650/6547/6083 +f 6545/6335/6084 6083/6334/6084 6624/6495/6084 7595/6554/6084 +f 7595/6554/6085 6624/6495/6085 6085/6499/6085 6654/6555/6085 +f 6650/6547/6086 7595/6554/6086 6654/6555/6086 6101/6548/6086 +f 6086/6505/6087 6629/6504/6087 7596/6556/6087 6655/6557/6087 +f 6629/6504/6088 6084/6349/6088 6550/6348/6088 7596/6556/6088 +f 7596/6556/6089 6550/6348/6089 6038/6347/6089 6653/6551/6089 +f 6655/6557/6090 7596/6556/6090 6653/6551/6090 6102/6550/6090 +f 6097/6558/6091 6657/6559/6091 7597/6560/6091 6656/6561/6091 +f 6101/6548/6092 6654/6555/6092 7597/6560/6092 6657/6559/6092 +f 6085/6499/6093 6656/6561/6093 7597/6560/6093 6654/6555/6093 +f 6086/6505/6094 6655/6557/6094 7598/6562/6094 6658/6563/6094 +f 6102/6550/6095 6659/6564/6095 7598/6562/6095 6655/6557/6095 +f 6098/6565/6096 6658/6563/6096 7598/6562/6096 6659/6564/6096 +f 6099/6540/6097 6651/6549/6097 7599/6566/6097 6660/6567/6097 +f 6101/6548/6098 6657/6559/6098 7599/6566/6098 6651/6549/6098 +f 6097/6558/6099 6660/6567/6099 7599/6566/6099 6657/6559/6099 +f 6098/6565/6100 6659/6564/6100 7600/6568/6100 6661/6569/6100 +f 6102/6550/6101 6652/6553/6101 7600/6568/6101 6659/6564/6101 +f 6100/6542/6102 6661/6569/6102 7600/6568/6102 6652/6553/6102 +f 6097/6558/6103 6662/6570/6103 7601/6571/6103 6660/6567/6103 +f 6095/6532/6104 6647/6541/6104 7601/6571/6104 6662/6570/6104 +f 6099/6540/6105 6660/6567/6105 7601/6571/6105 6647/6541/6105 +f 6100/6542/6106 6648/6545/6106 7602/6572/6106 6661/6569/6106 +f 6096/6534/6107 6663/6573/6107 7602/6572/6107 6648/6545/6107 +f 6098/6565/6108 6661/6569/6108 7602/6572/6108 6663/6573/6108 +f 6097/6558/6109 6664/6574/6109 7603/6575/6109 6662/6570/6109 +f 6093/6524/6110 6643/6533/6110 7603/6575/6110 6664/6574/6110 +f 6095/6532/6111 6662/6570/6111 7603/6575/6111 6643/6533/6111 +f 6096/6534/6112 6644/6537/6112 7604/6576/6112 6663/6573/6112 +f 6094/6526/6113 6665/6577/6113 7604/6576/6113 6644/6537/6113 +f 6098/6565/6114 6663/6573/6114 7604/6576/6114 6665/6577/6114 +f 6097/6558/6115 6666/6578/6115 7605/6579/6115 6664/6574/6115 +f 6091/6516/6116 6639/6525/6116 7605/6579/6116 6666/6578/6116 +f 6093/6524/6117 6664/6574/6117 7605/6579/6117 6639/6525/6117 +f 6094/6526/6118 6640/6529/6118 7606/6580/6118 6665/6577/6118 +f 6092/6518/6119 6667/6581/6119 7606/6580/6119 6640/6529/6119 +f 6098/6565/6120 6665/6577/6120 7606/6580/6120 6667/6581/6120 +f 6097/6558/6121 6668/6582/6121 7607/6583/6121 6666/6578/6121 +f 6089/6508/6122 6635/6517/6122 7607/6583/6122 6668/6582/6122 +f 6091/6516/6123 6666/6578/6123 7607/6583/6123 6635/6517/6123 +f 6092/6518/6124 6636/6521/6124 7608/6584/6124 6667/6581/6124 +f 6090/6510/6125 6669/6585/6125 7608/6584/6125 6636/6521/6125 +f 6098/6565/6126 6667/6581/6126 7608/6584/6126 6669/6585/6126 +f 6097/6558/6127 6670/6586/6127 7609/6587/6127 6668/6582/6127 +f 6087/6497/6128 6631/6509/6128 7609/6587/6128 6670/6586/6128 +f 6089/6508/6129 6668/6582/6129 7609/6587/6129 6631/6509/6129 +f 6090/6510/6130 6632/6513/6130 7610/6588/6130 6669/6585/6130 +f 6088/6500/6131 6671/6589/6131 7610/6588/6131 6632/6513/6131 +f 6098/6565/6132 6669/6585/6132 7610/6588/6132 6671/6589/6132 +f 6097/6558/6133 6656/6561/6133 7611/6590/6133 6670/6586/6133 +f 6085/6499/6134 6626/6498/6134 7611/6590/6134 6656/6561/6134 +f 6087/6497/6135 6670/6586/6135 7611/6590/6135 6626/6498/6135 +f 6088/6500/6136 6627/6503/6136 7612/6591/6136 6671/6589/6136 +f 6086/6505/6137 6658/6563/6137 7612/6591/6137 6627/6503/6137 +f 6098/6565/6138 6671/6589/6138 7612/6591/6138 6658/6563/6138 +f 6125/6592/6139 6673/6593/6139 7613/6594/6139 6672/6595/6139 +f 6673/6593/6140 6210/6596/6140 6674/6597/6140 7613/6594/6140 +f 7613/6594/6141 6674/6597/6141 6212/6598/6141 6675/6599/6141 +f 6672/6595/6142 7613/6594/6142 6675/6599/6142 6127/6600/6142 +f 6212/6598/6143 6676/6601/6143 7614/6602/6143 6675/6599/6143 +f 6676/6601/6144 6211/6603/6144 6677/6604/6144 7614/6602/6144 +f 7614/6602/6145 6677/6604/6145 6126/6605/6145 6678/6606/6145 +f 6675/6599/6146 7614/6602/6146 6678/6606/6146 6127/6600/6146 +f 6123/6607/6147 6680/6608/6147 7615/6609/6147 6679/6610/6147 +f 6680/6608/6148 6208/6611/6148 6681/6612/6148 7615/6609/6148 +f 7615/6609/6149 6681/6612/6149 6210/6596/6149 6673/6593/6149 +f 6679/6610/6150 7615/6609/6150 6673/6593/6150 6125/6592/6150 +f 6211/6603/6151 6682/6613/6151 7616/6614/6151 6677/6604/6151 +f 6682/6613/6152 6209/6615/6152 6683/6616/6152 7616/6614/6152 +f 7616/6614/6153 6683/6616/6153 6124/6617/6153 6684/6618/6153 +f 6677/6604/6154 7616/6614/6154 6684/6618/6154 6126/6605/6154 +f 6121/6619/6155 6686/6620/6155 7617/6621/6155 6685/6622/6155 +f 6686/6620/6156 6206/6623/6156 6687/6624/6156 7617/6621/6156 +f 7617/6621/6157 6687/6624/6157 6208/6611/6157 6680/6608/6157 +f 6685/6622/6158 7617/6621/6158 6680/6608/6158 6123/6607/6158 +f 6209/6615/6159 6688/6625/6159 7618/6626/6159 6683/6616/6159 +f 6688/6625/6160 6207/6627/6160 6689/6628/6160 7618/6626/6160 +f 7618/6626/6161 6689/6628/6161 6122/6629/6161 6690/6630/6161 +f 6683/6616/6162 7618/6626/6162 6690/6630/6162 6124/6617/6162 +f 6119/6631/6163 6692/6632/6163 7619/6633/6163 6691/6634/6163 +f 6692/6632/6164 6204/6635/6164 6693/6636/6164 7619/6633/6164 +f 7619/6633/6165 6693/6636/6165 6206/6623/6165 6686/6620/6165 +f 6691/6634/6166 7619/6633/6166 6686/6620/6166 6121/6619/6166 +f 6207/6627/6167 6694/6637/6167 7620/6638/6167 6689/6628/6167 +f 6694/6637/6168 6205/6639/6168 6695/6640/6168 7620/6638/6168 +f 7620/6638/6169 6695/6640/6169 6120/6641/6169 6696/6642/6169 +f 6689/6628/6170 7620/6638/6170 6696/6642/6170 6122/6629/6170 +f 6117/6643/6171 6698/6644/6171 7621/6645/6171 6697/6646/6171 +f 6698/6644/6172 6202/6647/6172 6699/6648/6172 7621/6645/6172 +f 7621/6645/6173 6699/6648/6173 6204/6635/6173 6692/6632/6173 +f 6697/6646/6174 7621/6645/6174 6692/6632/6174 6119/6631/6174 +f 6205/6639/6175 6700/6649/6175 7622/6650/6175 6695/6640/6175 +f 6700/6649/6176 6203/6651/6176 6701/6652/6176 7622/6650/6176 +f 7622/6650/6177 6701/6652/6177 6118/6653/6177 6702/6654/6177 +f 6695/6640/6178 7622/6650/6178 6702/6654/6178 6120/6641/6178 +f 6115/6655/6179 6704/6656/6179 7623/6657/6179 6703/6658/6179 +f 6704/6656/6180 6128/6659/6180 6705/6660/6180 7623/6657/6180 +f 7623/6657/6181 6705/6660/6181 6182/6661/6181 6706/6662/6181 +f 6703/6658/6182 7623/6657/6182 6706/6662/6182 6200/6663/6182 +f 6183/6664/6183 6708/6665/6183 7624/6666/6183 6707/6667/6183 +f 6708/6665/6184 6129/6668/6184 6709/6669/6184 7624/6666/6184 +f 7624/6666/6185 6709/6669/6185 6116/6670/6185 6710/6671/6185 +f 6707/6667/6186 7624/6666/6186 6710/6671/6186 6201/6672/6186 +f 6128/6659/6187 6711/6673/6187 7625/6674/6187 6705/6660/6187 +f 6711/6673/6188 6130/6675/6188 6712/6676/6188 7625/6674/6188 +f 7625/6674/6189 6712/6676/6189 6184/6677/6189 6713/6678/6189 +f 6705/6660/6190 7625/6674/6190 6713/6678/6190 6182/6661/6190 +f 6185/6679/6191 6715/6680/6191 7626/6681/6191 6714/6682/6191 +f 6715/6680/6192 6131/6683/6192 6716/6684/6192 7626/6681/6192 +f 7626/6681/6193 6716/6684/6193 6129/6668/6193 6708/6665/6193 +f 6714/6682/6194 7626/6681/6194 6708/6665/6194 6183/6664/6194 +f 6130/6675/6195 6717/6685/6195 7627/6686/6195 6712/6676/6195 +f 6717/6685/6196 6132/6687/6196 6718/6688/6196 7627/6686/6196 +f 7627/6686/6197 6718/6688/6197 6186/6689/6197 6719/6690/6197 +f 6712/6676/6198 7627/6686/6198 6719/6690/6198 6184/6677/6198 +f 6187/6691/6199 6721/6692/6199 7628/6693/6199 6720/6694/6199 +f 6721/6692/6200 6133/6695/6200 6722/6696/6200 7628/6693/6200 +f 7628/6693/6201 6722/6696/6201 6131/6683/6201 6715/6680/6201 +f 6720/6694/6202 7628/6693/6202 6715/6680/6202 6185/6679/6202 +f 6132/6687/6203 6723/6697/6203 7629/6698/6203 6718/6688/6203 +f 6723/6697/6204 6134/6699/6204 6724/6700/6204 7629/6698/6204 +f 7629/6698/6205 6724/6700/6205 6188/6701/6205 6725/6702/6205 +f 6718/6688/6206 7629/6698/6206 6725/6702/6206 6186/6689/6206 +f 6189/6703/6207 6727/6704/6207 7630/6705/6207 6726/6706/6207 +f 6727/6704/6208 6135/6707/6208 6728/6708/6208 7630/6705/6208 +f 7630/6705/6209 6728/6708/6209 6133/6695/6209 6721/6692/6209 +f 6726/6706/6210 7630/6705/6210 6721/6692/6210 6187/6691/6210 +f 6134/6699/6211 6729/6709/6211 7631/6710/6211 6724/6700/6211 +f 6729/6709/6212 6136/6711/6212 6730/6712/6212 7631/6710/6212 +f 7631/6710/6213 6730/6712/6213 6190/6713/6213 6731/6714/6213 +f 6724/6700/6214 7631/6710/6214 6731/6714/6214 6188/6701/6214 +f 6191/6715/6215 6733/6716/6215 7632/6717/6215 6732/6718/6215 +f 6733/6716/6216 6137/6719/6216 6734/6720/6216 7632/6717/6216 +f 7632/6717/6217 6734/6720/6217 6135/6707/6217 6727/6704/6217 +f 6732/6718/6218 7632/6717/6218 6727/6704/6218 6189/6703/6218 +f 6136/6711/6219 6735/6721/6219 7633/6722/6219 6730/6712/6219 +f 6735/6721/6220 6138/6723/6220 6736/6724/6220 7633/6722/6220 +f 7633/6722/6221 6736/6724/6221 6192/6725/6221 6737/6726/6221 +f 6730/6712/6222 7633/6722/6222 6737/6726/6222 6190/6713/6222 +f 6193/6727/6223 6739/6728/6223 7634/6729/6223 6738/6730/6223 +f 6739/6728/6224 6139/6731/6224 6740/6732/6224 7634/6729/6224 +f 7634/6729/6225 6740/6732/6225 6137/6719/6225 6733/6716/6225 +f 6738/6730/6226 7634/6729/6226 6733/6716/6226 6191/6715/6226 +f 6138/6723/6227 6741/6733/6227 7635/6734/6227 6736/6724/6227 +f 6741/6733/6228 6140/6735/6228 6742/6736/6228 7635/6734/6228 +f 7635/6734/6229 6742/6736/6229 6194/6737/6229 6743/6738/6229 +f 6736/6724/6230 7635/6734/6230 6743/6738/6230 6192/6725/6230 +f 6195/6739/6231 6745/6740/6231 7636/6741/6231 6744/6742/6231 +f 6745/6740/6232 6141/6743/6232 6746/6744/6232 7636/6741/6232 +f 7636/6741/6233 6746/6744/6233 6139/6731/6233 6739/6728/6233 +f 6744/6742/6234 7636/6741/6234 6739/6728/6234 6193/6727/6234 +f 6140/6735/6235 6747/6745/6235 7637/6746/6235 6742/6736/6235 +f 6747/6745/6236 6142/6747/6236 6748/6748/6236 7637/6746/6236 +f 7637/6746/6237 6748/6748/6237 6196/6749/6237 6749/6750/6237 +f 6742/6736/6238 7637/6746/6238 6749/6750/6238 6194/6737/6238 +f 6197/6751/6239 6751/6752/6239 7638/6753/6239 6750/6754/6239 +f 6751/6752/6240 6143/6755/6240 6752/6756/6240 7638/6753/6240 +f 7638/6753/6241 6752/6756/6241 6141/6743/6241 6745/6740/6241 +f 6750/6754/6242 7638/6753/6242 6745/6740/6242 6195/6739/6242 +f 6142/6747/6243 6753/6757/6243 7639/6758/6243 6748/6748/6243 +f 6753/6757/6244 6144/6759/6244 6754/6760/6244 7639/6758/6244 +f 7639/6758/6245 6754/6760/6245 6198/6761/6245 6755/6762/6245 +f 6748/6748/6246 7639/6758/6246 6755/6762/6246 6196/6749/6246 +f 6199/6763/6247 6757/6764/6247 7640/6765/6247 6756/6766/6247 +f 6757/6764/6248 6145/6767/6248 6758/6768/6248 7640/6765/6248 +f 7640/6765/6249 6758/6768/6249 6143/6755/6249 6751/6752/6249 +f 6756/6766/6250 7640/6765/6250 6751/6752/6250 6197/6751/6250 +f 6144/6759/6251 6759/6769/6251 7641/6770/6251 6754/6760/6251 +f 6759/6769/6252 6103/6771/6252 6760/6772/6252 7641/6770/6252 +f 7641/6770/6253 6760/6772/6253 6104/6773/6253 6761/6774/6253 +f 6754/6760/6254 7641/6770/6254 6761/6774/6254 6198/6761/6254 +f 6104/6773/6255 6760/6772/6255 7642/6775/6255 6762/6776/6255 +f 6760/6772/6256 6103/6771/6256 6763/6777/6256 7642/6775/6256 +f 7642/6775/6257 6763/6777/6257 6145/6767/6257 6757/6764/6257 +f 6762/6776/6258 7642/6775/6258 6757/6764/6258 6199/6763/6258 +f 6146/6778/6259 6765/6779/6259 7643/6780/6259 6764/6781/6259 +f 6765/6779/6260 6164/6782/6260 6766/6783/6260 7643/6780/6260 +f 7643/6780/6261 6766/6783/6261 6196/6749/6261 6755/6762/6261 +f 6764/6781/6262 7643/6780/6262 6755/6762/6262 6198/6761/6262 +f 6197/6751/6263 6767/6784/6263 7644/6785/6263 6756/6766/6263 +f 6767/6784/6264 6165/6786/6264 6768/6787/6264 7644/6785/6264 +f 7644/6785/6265 6768/6787/6265 6147/6788/6265 6769/6789/6265 +f 6756/6766/6266 7644/6785/6266 6769/6789/6266 6199/6763/6266 +f 6164/6782/6267 6770/6790/6267 7645/6791/6267 6766/6783/6267 +f 6770/6790/6268 6215/6792/6268 6771/6793/6268 7645/6791/6268 +f 7645/6791/6269 6771/6793/6269 6194/6737/6269 6749/6750/6269 +f 6766/6783/6270 7645/6791/6270 6749/6750/6270 6196/6749/6270 +f 6195/6739/6271 6772/6794/6271 7646/6795/6271 6750/6754/6271 +f 6772/6794/6272 6216/6796/6272 6773/6797/6272 7646/6795/6272 +f 7646/6795/6273 6773/6797/6273 6165/6786/6273 6767/6784/6273 +f 6750/6754/6274 7646/6795/6274 6767/6784/6274 6197/6751/6274 +f 6162/6798/6275 6775/6799/6275 7647/6800/6275 6774/6801/6275 +f 6775/6799/6276 6192/6725/6276 6743/6738/6276 7647/6800/6276 +f 7647/6800/6277 6743/6738/6277 6194/6737/6277 6771/6793/6277 +f 6774/6801/6278 7647/6800/6278 6771/6793/6278 6215/6792/6278 +f 6195/6739/6279 6744/6742/6279 7648/6802/6279 6772/6794/6279 +f 6744/6742/6280 6193/6727/6280 6776/6803/6280 7648/6802/6280 +f 7648/6802/6281 6776/6803/6281 6163/6804/6281 6777/6805/6281 +f 6772/6794/6282 7648/6802/6282 6777/6805/6282 6216/6796/6282 +f 6160/6806/6283 6779/6807/6283 7649/6808/6283 6778/6809/6283 +f 6779/6807/6284 6190/6713/6284 6737/6726/6284 7649/6808/6284 +f 7649/6808/6285 6737/6726/6285 6192/6725/6285 6775/6799/6285 +f 6778/6809/6286 7649/6808/6286 6775/6799/6286 6162/6798/6286 +f 6193/6727/6287 6738/6730/6287 7650/6810/6287 6776/6803/6287 +f 6738/6730/6288 6191/6715/6288 6780/6811/6288 7650/6810/6288 +f 7650/6810/6289 6780/6811/6289 6161/6812/6289 6781/6813/6289 +f 6776/6803/6290 7650/6810/6290 6781/6813/6290 6163/6804/6290 +f 6158/6814/6291 6783/6815/6291 7651/6816/6291 6782/6817/6291 +f 6783/6815/6292 6188/6701/6292 6731/6714/6292 7651/6816/6292 +f 7651/6816/6293 6731/6714/6293 6190/6713/6293 6779/6807/6293 +f 6782/6817/6294 7651/6816/6294 6779/6807/6294 6160/6806/6294 +f 6191/6715/6295 6732/6718/6295 7652/6818/6295 6780/6811/6295 +f 6732/6718/6296 6189/6703/6296 6784/6819/6296 7652/6818/6296 +f 7652/6818/6297 6784/6819/6297 6159/6820/6297 6785/6821/6297 +f 6780/6811/6298 7652/6818/6298 6785/6821/6298 6161/6812/6298 +f 6156/6822/6299 6787/6823/6299 7653/6824/6299 6786/6825/6299 +f 6787/6823/6300 6186/6689/6300 6725/6702/6300 7653/6824/6300 +f 7653/6824/6301 6725/6702/6301 6188/6701/6301 6783/6815/6301 +f 6786/6825/6302 7653/6824/6302 6783/6815/6302 6158/6814/6302 +f 6189/6703/6303 6726/6706/6303 7654/6826/6303 6784/6819/6303 +f 6726/6706/6304 6187/6691/6304 6788/6827/6304 7654/6826/6304 +f 7654/6826/6305 6788/6827/6305 6157/6828/6305 6789/6829/6305 +f 6784/6819/6306 7654/6826/6306 6789/6829/6306 6159/6820/6306 +f 6154/6830/6307 6791/6831/6307 7655/6832/6307 6790/6833/6307 +f 6791/6831/6308 6184/6677/6308 6719/6690/6308 7655/6832/6308 +f 7655/6832/6309 6719/6690/6309 6186/6689/6309 6787/6823/6309 +f 6790/6833/6310 7655/6832/6310 6787/6823/6310 6156/6822/6310 +f 6187/6691/6311 6720/6694/6311 7656/6834/6311 6788/6827/6311 +f 6720/6694/6312 6185/6679/6312 6792/6835/6312 7656/6834/6312 +f 7656/6834/6313 6792/6835/6313 6155/6836/6313 6793/6837/6313 +f 6788/6827/6314 7656/6834/6314 6793/6837/6314 6157/6828/6314 +f 6152/6838/6315 6795/6839/6315 7657/6840/6315 6794/6841/6315 +f 6795/6839/6316 6182/6661/6316 6713/6678/6316 7657/6840/6316 +f 7657/6840/6317 6713/6678/6317 6184/6677/6317 6791/6831/6317 +f 6794/6841/6318 7657/6840/6318 6791/6831/6318 6154/6830/6318 +f 6185/6679/6319 6714/6682/6319 7658/6842/6319 6792/6835/6319 +f 6714/6682/6320 6183/6664/6320 6796/6843/6320 7658/6842/6320 +f 7658/6842/6321 6796/6843/6321 6153/6844/6321 6797/6845/6321 +f 6792/6835/6322 7658/6842/6322 6797/6845/6322 6155/6836/6322 +f 6150/6846/6323 6799/6847/6323 7659/6848/6323 6798/6849/6323 +f 6799/6847/6324 6200/6663/6324 6706/6662/6324 7659/6848/6324 +f 7659/6848/6325 6706/6662/6325 6182/6661/6325 6795/6839/6325 +f 6798/6849/6326 7659/6848/6326 6795/6839/6326 6152/6838/6326 +f 6183/6664/6327 6707/6667/6327 7660/6850/6327 6796/6843/6327 +f 6707/6667/6328 6201/6672/6328 6800/6851/6328 7660/6850/6328 +f 7660/6850/6329 6800/6851/6329 6151/6852/6329 6801/6853/6329 +f 6796/6843/6330 7660/6850/6330 6801/6853/6330 6153/6844/6330 +f 6150/6846/6331 6802/6854/6331 7661/6855/6331 6799/6847/6331 +f 6802/6854/6332 6217/6856/6332 6803/6857/6332 7661/6855/6332 +f 7661/6855/6333 6803/6857/6333 6213/6858/6333 6804/6859/6333 +f 6799/6847/6334 7661/6855/6334 6804/6859/6334 6200/6663/6334 +f 6213/6858/6335 6806/6860/6335 7662/6861/6335 6805/6862/6335 +f 6806/6860/6336 6218/6863/6336 6807/6864/6336 7662/6861/6336 +f 7662/6861/6337 6807/6864/6337 6151/6852/6337 6800/6851/6337 +f 6805/6862/6338 7662/6861/6338 6800/6851/6338 6201/6672/6338 +f 6146/6778/6339 6764/6781/6339 7663/6865/6339 6808/6866/6339 +f 6764/6781/6340 6198/6761/6340 6761/6774/6340 7663/6865/6340 +f 7663/6865/6341 6761/6774/6341 6104/6773/6341 6809/6867/6341 +f 6808/6866/6342 7663/6865/6342 6809/6867/6342 6148/6868/6342 +f 6104/6773/6343 6762/6776/6343 7664/6869/6343 6810/6870/6343 +f 6762/6776/6344 6199/6763/6344 6769/6789/6344 7664/6869/6344 +f 7664/6869/6345 6769/6789/6345 6147/6788/6345 6811/6871/6345 +f 6810/6870/6346 7664/6869/6346 6811/6871/6346 6149/6872/6346 +f 6148/6868/6347 6809/6867/6347 7665/6873/6347 6812/6874/6347 +f 6809/6867/6348 6104/6773/6348 6813/6875/6348 7665/6873/6348 +f 7665/6873/6349 6813/6875/6349 6214/6876/6349 6814/6877/6349 +f 6812/6874/6350 7665/6873/6350 6814/6877/6350 6219/6878/6350 +f 6214/6876/6351 6813/6875/6351 7666/6879/6351 6815/6880/6351 +f 6813/6875/6352 6104/6773/6352 6810/6870/6352 7666/6879/6352 +f 7666/6879/6353 6810/6870/6353 6149/6872/6353 6816/6881/6353 +f 6815/6880/6354 7666/6879/6354 6816/6881/6354 6220/6882/6354 +f 6213/6858/6355 6803/6857/6355 7667/6883/6355 6817/6884/6355 +f 6803/6857/6356 6217/6856/6356 6818/6885/6356 7667/6883/6356 +f 7667/6883/6357 6818/6885/6357 6219/6878/6357 6814/6877/6357 +f 6817/6884/6358 7667/6883/6358 6814/6877/6358 6214/6876/6358 +f 6220/6882/6359 6819/6886/6359 7668/6887/6359 6815/6880/6359 +f 6819/6886/6360 6218/6863/6360 6806/6860/6360 7668/6887/6360 +f 7668/6887/6361 6806/6860/6361 6213/6858/6361 6817/6884/6361 +f 6815/6880/6362 7668/6887/6362 6817/6884/6362 6214/6876/6362 +f 6171/6888/6363 6821/6889/6363 7669/6890/6363 6820/6891/6363 +f 6821/6889/6364 6173/6892/6364 6822/6893/6364 7669/6890/6364 +f 7669/6890/6365 6822/6893/6365 6212/6598/6365 6674/6597/6365 +f 6820/6891/6366 7669/6890/6366 6674/6597/6366 6210/6596/6366 +f 6212/6598/6367 6822/6893/6367 7670/6894/6367 6676/6601/6367 +f 6822/6893/6368 6173/6892/6368 6823/6895/6368 7670/6894/6368 +f 7670/6894/6369 6823/6895/6369 6172/6896/6369 6824/6897/6369 +f 6676/6601/6370 7670/6894/6370 6824/6897/6370 6211/6603/6370 +f 6169/6898/6371 6826/6899/6371 7671/6900/6371 6825/6901/6371 +f 6826/6899/6372 6171/6888/6372 6820/6891/6372 7671/6900/6372 +f 7671/6900/6373 6820/6891/6373 6210/6596/6373 6681/6612/6373 +f 6825/6901/6374 7671/6900/6374 6681/6612/6374 6208/6611/6374 +f 6211/6603/6375 6824/6897/6375 7672/6902/6375 6682/6613/6375 +f 6824/6897/6376 6172/6896/6376 6827/6903/6376 7672/6902/6376 +f 7672/6902/6377 6827/6903/6377 6170/6904/6377 6828/6905/6377 +f 6682/6613/6378 7672/6902/6378 6828/6905/6378 6209/6615/6378 +f 6167/6906/6379 6830/6907/6379 7673/6908/6379 6829/6909/6379 +f 6830/6907/6380 6169/6898/6380 6825/6901/6380 7673/6908/6380 +f 7673/6908/6381 6825/6901/6381 6208/6611/6381 6687/6624/6381 +f 6829/6909/6382 7673/6908/6382 6687/6624/6382 6206/6623/6382 +f 6209/6615/6383 6828/6905/6383 7674/6910/6383 6688/6625/6383 +f 6828/6905/6384 6170/6904/6384 6831/6911/6384 7674/6910/6384 +f 7674/6910/6385 6831/6911/6385 6168/6912/6385 6832/6913/6385 +f 6688/6625/6386 7674/6910/6386 6832/6913/6386 6207/6627/6386 +f 6202/6647/6387 6833/6914/6387 7675/6915/6387 6699/6648/6387 +f 6833/6914/6388 6223/6916/6388 6834/6917/6388 7675/6915/6388 +f 7675/6915/6389 6834/6917/6389 6221/6918/6389 6835/6919/6389 +f 6699/6648/6390 7675/6915/6390 6835/6919/6390 6204/6635/6390 +f 6222/6920/6391 6837/6921/6391 7676/6922/6391 6836/6923/6391 +f 6837/6921/6392 6224/6924/6392 6838/6925/6392 7676/6922/6392 +f 7676/6922/6393 6838/6925/6393 6203/6651/6393 6700/6649/6393 +f 6836/6923/6394 7676/6922/6394 6700/6649/6394 6205/6639/6394 +f 6167/6906/6395 6829/6909/6395 7677/6926/6395 6839/6927/6395 +f 6829/6909/6396 6206/6623/6396 6693/6636/6396 7677/6926/6396 +f 7677/6926/6397 6693/6636/6397 6204/6635/6397 6835/6919/6397 +f 6839/6927/6398 7677/6926/6398 6835/6919/6398 6221/6918/6398 +f 6205/6639/6399 6694/6637/6399 7678/6928/6399 6836/6923/6399 +f 6694/6637/6400 6207/6627/6400 6832/6913/6400 7678/6928/6400 +f 7678/6928/6401 6832/6913/6401 6168/6912/6401 6840/6929/6401 +f 6836/6923/6402 7678/6928/6402 6840/6929/6402 6222/6920/6402 +f 6180/6930/6403 6842/6931/6403 7679/6932/6403 6841/6933/6403 +f 6842/6931/6404 6226/6934/6404 6843/6935/6404 7679/6932/6404 +f 7679/6932/6405 6843/6935/6405 6225/6936/6405 6844/6937/6405 +f 6841/6933/6406 7679/6932/6406 6844/6937/6406 6223/6916/6406 +f 6225/6936/6407 6843/6935/6407 7680/6938/6407 6845/6939/6407 +f 6843/6935/6408 6226/6934/6408 6846/6940/6408 7680/6938/6408 +f 7680/6938/6409 6846/6940/6409 6181/6941/6409 6847/6942/6409 +f 6845/6939/6410 7680/6938/6410 6847/6942/6410 6224/6924/6410 +f 6221/6918/6411 6834/6917/6411 7681/6943/6411 6848/6944/6411 +f 6834/6917/6412 6223/6916/6412 6844/6937/6412 7681/6943/6412 +f 7681/6943/6413 6844/6937/6413 6225/6936/6413 6849/6945/6413 +f 6848/6944/6414 7681/6943/6414 6849/6945/6414 6105/6946/6414 +f 6225/6936/6413 6845/6939/6413 7682/6947/6413 6849/6945/6413 +f 6845/6939/6415 6224/6924/6415 6837/6921/6415 7682/6947/6415 +f 7682/6947/6416 6837/6921/6416 6222/6920/6416 6850/6948/6416 +f 6849/6945/6417 7682/6947/6417 6850/6948/6417 6105/6946/6417 +f 6166/6949/6418 6852/6950/6418 7683/6951/6418 6851/6952/6418 +f 6852/6950/6419 6167/6906/6419 6839/6927/6419 7683/6951/6419 +f 7683/6951/6420 6839/6927/6420 6221/6918/6420 6848/6944/6420 +f 6851/6952/6421 7683/6951/6421 6848/6944/6421 6105/6946/6421 +f 6222/6920/6422 6840/6929/6422 7684/6953/6422 6850/6948/6422 +f 6840/6929/6423 6168/6912/6423 6853/6954/6423 7684/6953/6423 +f 7684/6953/6424 6853/6954/6424 6166/6949/6424 6851/6952/6424 +f 6850/6948/6425 7684/6953/6425 6851/6952/6425 6105/6946/6425 +f 6178/6955/6426 6855/6956/6426 7685/6957/6426 6854/6958/6426 +f 6855/6956/6427 6229/6959/6427 6856/6960/6427 7685/6957/6427 +f 7685/6957/6428 6856/6960/6428 6227/6961/6428 6857/6962/6428 +f 6854/6958/6429 7685/6957/6429 6857/6962/6429 6180/6930/6429 +f 6228/6963/6430 6859/6964/6430 7686/6965/6430 6858/6966/6430 +f 6859/6964/6431 6230/6967/6431 6860/6968/6431 7686/6965/6431 +f 7686/6965/6432 6860/6968/6432 6179/6969/6432 6861/6970/6432 +f 6858/6966/6433 7686/6965/6433 6861/6970/6433 6181/6941/6433 +f 6176/6971/6434 6863/6972/6434 7687/6973/6434 6862/6974/6434 +f 6863/6972/6435 6231/6975/6435 6864/6976/6435 7687/6973/6435 +f 7687/6973/6436 6864/6976/6436 6229/6959/6436 6855/6956/6436 +f 6862/6974/6437 7687/6973/6437 6855/6956/6437 6178/6955/6437 +f 6230/6967/6438 6865/6977/6438 7688/6978/6438 6860/6968/6438 +f 6865/6977/6439 6232/6979/6439 6866/6980/6439 7688/6978/6439 +f 7688/6978/6440 6866/6980/6440 6177/6981/6440 6867/6982/6440 +f 6860/6968/6441 7688/6978/6441 6867/6982/6441 6179/6969/6441 +f 6175/6983/6442 6869/6984/6442 7689/6985/6442 6868/6986/6442 +f 6869/6984/6443 6233/6987/6443 6870/6988/6443 7689/6985/6443 +f 7689/6985/6444 6870/6988/6444 6231/6975/6444 6863/6972/6444 +f 6868/6986/6445 7689/6985/6445 6863/6972/6445 6176/6971/6445 +f 6232/6979/6446 6871/6989/6446 7690/6990/6446 6866/6980/6446 +f 6871/6989/6447 6234/6991/6447 6872/6992/6447 7690/6990/6447 +f 7690/6990/6448 6872/6992/6448 6175/6983/6448 6873/6993/6448 +f 6866/6980/6449 7690/6990/6449 6873/6993/6449 6177/6981/6449 +f 6174/6994/6450 6875/6995/6450 7691/6996/6450 6874/6997/6450 +f 6875/6995/6451 6107/6998/6451 6876/6999/6451 7691/6996/6451 +f 7691/6996/6452 6876/6999/6452 6233/6987/6452 6869/6984/6452 +f 6874/6997/6453 7691/6996/6453 6869/6984/6453 6175/6983/6453 +f 6234/6991/6454 6877/7000/6454 7692/7001/6454 6872/6992/6454 +f 6877/7000/6455 6107/6998/6455 6875/6995/6455 7692/7001/6455 +f 7692/7001/6456 6875/6995/6456 6174/6994/6456 6874/6997/6456 +f 6872/6992/6457 7692/7001/6457 6874/6997/6457 6175/6983/6457 +f 6226/6934/6458 6842/6931/6458 7693/7002/6458 6878/7003/6458 +f 6842/6931/6459 6180/6930/6459 6857/6962/6459 7693/7002/6459 +f 7693/7002/6460 6857/6962/6460 6227/6961/6460 6879/7004/6460 +f 6878/7003/6461 7693/7002/6461 6879/7004/6461 6106/7005/6461 +f 6228/6963/6462 6858/6966/6462 7694/7006/6462 6880/7007/6462 +f 6858/6966/6463 6181/6941/6463 6846/6940/6463 7694/7006/6463 +f 7694/7006/6464 6846/6940/6464 6226/6934/6464 6878/7003/6464 +f 6880/7007/6465 7694/7006/6465 6878/7003/6465 6106/7005/6465 +f 6106/7005/6466 6879/7004/6466 7695/7008/6466 6881/7009/6466 +f 6879/7004/6467 6227/6961/6467 6882/7010/6467 7695/7008/6467 +f 7695/7008/6468 6882/7010/6468 6242/7011/6468 6883/7012/6468 +f 6881/7009/6469 7695/7008/6469 6883/7012/6469 6244/7013/6469 +f 6243/7014/6470 6885/7015/6470 7696/7016/6470 6884/7017/6470 +f 6885/7015/6471 6228/6963/6471 6880/7007/6471 7696/7016/6471 +f 7696/7016/6472 6880/7007/6472 6106/7005/6472 6881/7009/6472 +f 6884/7017/6473 7696/7016/6473 6881/7009/6473 6244/7013/6473 +f 6107/6998/6474 6886/7018/6474 7697/7019/6474 6876/6999/6474 +f 6886/7018/6475 6235/7020/6475 6887/7021/6475 7697/7019/6475 +f 7697/7019/6476 6887/7021/6476 6236/7022/6476 6888/7023/6476 +f 6876/6999/6477 7697/7019/6477 6888/7023/6477 6233/6987/6477 +f 6237/7024/6478 6890/7025/6478 7698/7026/6478 6889/7027/6478 +f 6890/7025/6479 6235/7020/6479 6886/7018/6479 7698/7026/6479 +f 7698/7026/6480 6886/7018/6480 6107/6998/6480 6877/7000/6480 +f 6889/7027/6481 7698/7026/6481 6877/7000/6481 6234/6991/6481 +f 6233/6987/6482 6888/7023/6482 7699/7028/6482 6870/6988/6482 +f 6888/7023/6483 6236/7022/6483 6891/7029/6483 7699/7028/6483 +f 7699/7028/6484 6891/7029/6484 6238/7030/6484 6892/7031/6484 +f 6870/6988/6485 7699/7028/6485 6892/7031/6485 6231/6975/6485 +f 6239/7032/6486 6894/7033/6486 7700/7034/6486 6893/7035/6486 +f 6894/7033/6487 6237/7024/6487 6889/7027/6487 7700/7034/6487 +f 7700/7034/6488 6889/7027/6488 6234/6991/6488 6871/6989/6488 +f 6893/7035/6489 7700/7034/6489 6871/6989/6489 6232/6979/6489 +f 6231/6975/6490 6892/7031/6490 7701/7036/6490 6864/6976/6490 +f 6892/7031/6491 6238/7030/6491 6895/7037/6491 7701/7036/6491 +f 7701/7036/6492 6895/7037/6492 6240/7038/6492 6896/7039/6492 +f 6864/6976/6493 7701/7036/6493 6896/7039/6493 6229/6959/6493 +f 6241/7040/6494 6898/7041/6494 7702/7042/6494 6897/7043/6494 +f 6898/7041/6495 6239/7032/6495 6893/7035/6495 7702/7042/6495 +f 7702/7042/6496 6893/7035/6496 6232/6979/6496 6865/6977/6496 +f 6897/7043/6497 7702/7042/6497 6865/6977/6497 6230/6967/6497 +f 6229/6959/6498 6896/7039/6498 7703/7044/6498 6856/6960/6498 +f 6896/7039/6499 6240/7038/6499 6899/7045/6499 7703/7044/6499 +f 7703/7044/6500 6899/7045/6500 6242/7011/6500 6882/7010/6500 +f 6856/6960/6501 7703/7044/6501 6882/7010/6501 6227/6961/6501 +f 6243/7014/6502 6900/7046/6502 7704/7047/6502 6885/7015/6502 +f 6900/7046/6503 6241/7040/6503 6897/7043/6503 7704/7047/6503 +f 7704/7047/6504 6897/7043/6504 6230/6967/6504 6859/6964/6504 +f 6885/7015/6505 7704/7047/6505 6859/6964/6505 6228/6963/6505 +f 6235/7020/6506 6901/7048/6506 7705/7049/6506 6887/7021/6506 +f 6901/7048/6507 6240/7038/6507 6895/7037/6507 7705/7049/6507 +f 7705/7049/6508 6895/7037/6508 6238/7030/6508 6891/7029/6508 +f 6887/7021/6509 7705/7049/6509 6891/7029/6509 6236/7022/6509 +f 6239/7032/6510 6898/7041/6510 7706/7050/6510 6894/7033/6510 +f 6898/7041/6511 6241/7040/6511 6902/7051/6511 7706/7050/6511 +f 7706/7050/6512 6902/7051/6512 6235/7020/6512 6890/7025/6512 +f 6894/7033/6513 7706/7050/6513 6890/7025/6513 6237/7024/6513 +f 6235/7020/6514 6903/7052/6514 7707/7053/6514 6901/7048/6514 +f 6903/7052/6515 6244/7013/6515 6883/7012/6515 7707/7053/6515 +f 7707/7053/6516 6883/7012/6516 6242/7011/6516 6899/7045/6516 +f 6901/7048/6517 7707/7053/6517 6899/7045/6517 6240/7038/6517 +f 6243/7014/6518 6884/7017/6518 7708/7054/6518 6900/7046/6518 +f 6884/7017/6519 6244/7013/6519 6903/7052/6519 7708/7054/6519 +f 7708/7054/6520 6903/7052/6520 6235/7020/6520 6902/7051/6520 +f 6900/7046/6521 7708/7054/6521 6902/7051/6521 6241/7040/6521 +f 6175/6983/6522 6868/6986/6522 7709/7055/6522 6904/7056/6522 +f 6868/6986/6523 6176/6971/6523 6905/7057/6523 7709/7055/6523 +f 7709/7055/6524 6905/7057/6524 6200/6663/6524 6804/6859/6524 +f 6904/7056/6525 7709/7055/6525 6804/6859/6525 6213/6858/6525 +f 6201/6672/6526 6906/7058/6526 7710/7059/6526 6805/6862/6526 +f 6906/7058/6527 6177/6981/6527 6873/6993/6527 7710/7059/6527 +f 7710/7059/6528 6873/6993/6528 6175/6983/6528 6904/7056/6528 +f 6805/6862/6529 7710/7059/6529 6904/7056/6529 6213/6858/6529 +f 6176/6971/6530 6862/6974/6530 7711/7060/6530 6905/7057/6530 +f 6862/6974/6531 6178/6955/6531 6907/7061/6531 7711/7060/6531 +f 7711/7060/6532 6907/7061/6532 6247/7062/6532 6908/7063/6532 +f 6905/7057/6533 7711/7060/6533 6908/7063/6533 6200/6663/6533 +f 6248/7064/6534 6910/7065/6534 7712/7066/6534 6909/7067/6534 +f 6910/7065/6535 6179/6969/6535 6867/6982/6535 7712/7066/6535 +f 7712/7066/6536 6867/6982/6536 6177/6981/6536 6906/7058/6536 +f 6909/7067/6537 7712/7066/6537 6906/7058/6537 6201/6672/6537 +f 6178/6955/6538 6854/6958/6538 7713/7068/6538 6907/7061/6538 +f 6854/6958/6539 6180/6930/6539 6911/7069/6539 7713/7068/6539 +f 7713/7068/6540 6911/7069/6540 6249/7070/6540 6912/7071/6540 +f 6907/7061/6541 7713/7068/6541 6912/7071/6541 6247/7062/6541 +f 6250/7072/6542 6914/7073/6542 7714/7074/6542 6913/7075/6542 +f 6914/7073/6543 6181/6941/6543 6861/6970/6543 7714/7074/6543 +f 7714/7074/6544 6861/6970/6544 6179/6969/6544 6910/7065/6544 +f 6913/7075/6545 7714/7074/6545 6910/7065/6545 6248/7064/6545 +f 6180/6930/6546 6841/6933/6546 7715/7076/6546 6911/7069/6546 +f 6841/6933/6547 6223/6916/6547 6833/6914/6547 7715/7076/6547 +f 7715/7076/6548 6833/6914/6548 6202/6647/6548 6915/7077/6548 +f 6911/7069/6549 7715/7076/6549 6915/7077/6549 6249/7070/6549 +f 6203/6651/6550 6838/6925/6550 7716/7078/6550 6916/7079/6550 +f 6838/6925/6551 6224/6924/6551 6847/6942/6551 7716/7078/6551 +f 7716/7078/6552 6847/6942/6552 6181/6941/6552 6914/7073/6552 +f 6916/7079/6553 7716/7078/6553 6914/7073/6553 6250/7072/6553 +f 6117/6643/6554 6917/7080/6554 7717/7081/6554 6698/6644/6554 +f 6917/7080/6555 6245/7082/6555 6918/7083/6555 7717/7081/6555 +f 7717/7081/6556 6918/7083/6556 6249/7070/6556 6915/7077/6556 +f 6698/6644/6557 7717/7081/6557 6915/7077/6557 6202/6647/6557 +f 6250/7072/6558 6919/7084/6558 7718/7085/6558 6916/7079/6558 +f 6919/7084/6559 6246/7086/6559 6920/7087/6559 7718/7085/6559 +f 7718/7085/6560 6920/7087/6560 6118/6653/6560 6701/6652/6560 +f 6916/7079/6561 7718/7085/6561 6701/6652/6561 6203/6651/6561 +f 6245/7082/6562 6921/7088/6562 7719/7089/6562 6918/7083/6562 +f 6921/7088/6563 6251/7090/6563 6922/7091/6563 7719/7089/6563 +f 7719/7089/6564 6922/7091/6564 6247/7062/6564 6912/7071/6564 +f 6918/7083/6565 7719/7089/6565 6912/7071/6565 6249/7070/6565 +f 6248/7064/6566 6923/7092/6566 7720/7093/6566 6913/7075/6566 +f 6923/7092/6567 6252/7094/6567 6924/7095/6567 7720/7093/6567 +f 7720/7093/6568 6924/7095/6568 6246/7086/6568 6919/7084/6568 +f 6913/7075/6569 7720/7093/6569 6919/7084/6569 6250/7072/6569 +f 6115/6655/6570 6703/6658/6570 7721/7096/6570 6925/7097/6570 +f 6703/6658/6571 6200/6663/6571 6908/7063/6571 7721/7096/6571 +f 7721/7096/6572 6908/7063/6572 6247/7062/6572 6922/7091/6572 +f 6925/7097/6573 7721/7096/6573 6922/7091/6573 6251/7090/6573 +f 6248/7064/6574 6909/7067/6574 7722/7098/6574 6923/7092/6574 +f 6909/7067/6575 6201/6672/6575 6710/6671/6575 7722/7098/6575 +f 7722/7098/6576 6710/6671/6576 6116/6670/6576 6926/7099/6576 +f 6923/7092/6577 7722/7098/6577 6926/7099/6577 6252/7094/6577 +f 6167/6906/6578 6852/6950/6578 7723/7100/6578 6927/7101/6578 +f 6852/6950/6579 6166/6949/6579 6928/7102/6579 7723/7100/6579 +f 7723/7100/6580 6928/7102/6580 6108/7103/6580 6929/7104/6580 +f 6927/7101/6581 7723/7100/6581 6929/7104/6581 6258/7105/6581 +f 6108/7103/6582 6928/7102/6582 7724/7106/6582 6930/7107/6582 +f 6928/7102/6583 6166/6949/6583 6853/6954/6583 7724/7106/6583 +f 7724/7106/6584 6853/6954/6584 6168/6912/6584 6931/7108/6584 +f 6930/7107/6585 7724/7106/6585 6931/7108/6585 6259/7109/6585 +f 6169/6898/6586 6830/6907/6586 7725/7110/6586 6932/7111/6586 +f 6830/6907/6587 6167/6906/6587 6927/7101/6587 7725/7110/6587 +f 7725/7110/6588 6927/7101/6588 6258/7105/6588 6933/7112/6588 +f 6932/7111/6589 7725/7110/6589 6933/7112/6589 6256/7113/6589 +f 6259/7109/6590 6931/7108/6590 7726/7114/6590 6934/7115/6590 +f 6931/7108/6591 6168/6912/6591 6831/6911/6591 7726/7114/6591 +f 7726/7114/6592 6831/6911/6592 6170/6904/6592 6935/7116/6592 +f 6934/7115/6593 7726/7114/6593 6935/7116/6593 6257/7117/6593 +f 6171/6888/6594 6826/6899/6594 7727/7118/6594 6936/7119/6594 +f 6826/6899/6595 6169/6898/6595 6932/7111/6595 7727/7118/6595 +f 7727/7118/6596 6932/7111/6596 6256/7113/6596 6937/7120/6596 +f 6936/7119/6597 7727/7118/6597 6937/7120/6597 6254/7121/6597 +f 6257/7117/6598 6935/7116/6598 7728/7122/6598 6938/7123/6598 +f 6935/7116/6599 6170/6904/6599 6827/6903/6599 7728/7122/6599 +f 7728/7122/6600 6827/6903/6600 6172/6896/6600 6939/7124/6600 +f 6938/7123/6601 7728/7122/6601 6939/7124/6601 6255/7125/6601 +f 6173/6892/6602 6821/6889/6602 7729/7126/6602 6940/7127/6602 +f 6821/6889/6603 6171/6888/6603 6936/7119/6603 7729/7126/6603 +f 7729/7126/6604 6936/7119/6604 6254/7121/6604 6941/7128/6604 +f 6940/7127/6605 7729/7126/6605 6941/7128/6605 6253/7129/6605 +f 6255/7125/6606 6939/7124/6606 7730/7130/6606 6942/7131/6606 +f 6939/7124/6607 6172/6896/6607 6823/6895/6607 7730/7130/6607 +f 7730/7130/6608 6823/6895/6608 6173/6892/6608 6940/7127/6608 +f 6942/7131/6609 7730/7130/6609 6940/7127/6609 6253/7129/6609 +f 6253/7129/6610 6941/7128/6610 7731/7132/6610 6943/7133/6610 +f 6941/7128/6611 6254/7121/6611 6944/7134/6611 7731/7132/6611 +f 7731/7132/6612 6944/7134/6612 6265/7135/6612 6945/7136/6612 +f 6943/7133/6613 7731/7132/6613 6945/7136/6613 6267/7137/6613 +f 6266/7138/6614 6947/7139/6614 7732/7140/6614 6946/7141/6614 +f 6947/7139/6615 6255/7125/6615 6942/7131/6615 7732/7140/6615 +f 7732/7140/6616 6942/7131/6616 6253/7129/6616 6943/7133/6616 +f 6946/7141/6617 7732/7140/6617 6943/7133/6617 6267/7137/6617 +f 6254/7121/6618 6937/7120/6618 7733/7142/6618 6944/7134/6618 +f 6937/7120/6619 6256/7113/6619 6948/7143/6619 7733/7142/6619 +f 7733/7142/6620 6948/7143/6620 6263/7144/6620 6949/7145/6620 +f 6944/7134/6621 7733/7142/6621 6949/7145/6621 6265/7135/6621 +f 6264/7146/6622 6951/7147/6622 7734/7148/6622 6950/7149/6622 +f 6951/7147/6623 6257/7117/6623 6938/7123/6623 7734/7148/6623 +f 7734/7148/6624 6938/7123/6624 6255/7125/6624 6947/7139/6624 +f 6950/7149/6625 7734/7148/6625 6947/7139/6625 6266/7138/6625 +f 6256/7113/6626 6933/7112/6626 7735/7150/6626 6948/7143/6626 +f 6933/7112/6627 6258/7105/6627 6952/7151/6627 7735/7150/6627 +f 7735/7150/6628 6952/7151/6628 6261/7152/6628 6953/7153/6628 +f 6948/7143/6629 7735/7150/6629 6953/7153/6629 6263/7144/6629 +f 6262/7154/6630 6955/7155/6630 7736/7156/6630 6954/7157/6630 +f 6955/7155/6631 6259/7109/6631 6934/7115/6631 7736/7156/6631 +f 7736/7156/6632 6934/7115/6632 6257/7117/6632 6951/7147/6632 +f 6954/7157/6633 7736/7156/6633 6951/7147/6633 6264/7146/6633 +f 6258/7105/6634 6929/7104/6634 7737/7158/6634 6952/7151/6634 +f 6929/7104/6635 6108/7103/6635 6956/7159/6635 7737/7158/6635 +f 7737/7158/6636 6956/7159/6636 6260/7160/6636 6957/7161/6636 +f 6952/7151/6637 7737/7158/6637 6957/7161/6637 6261/7152/6637 +f 6260/7160/6638 6956/7159/6638 7738/7162/6638 6958/7163/6638 +f 6956/7159/6639 6108/7103/6639 6930/7107/6639 7738/7162/6639 +f 7738/7162/6640 6930/7107/6640 6259/7109/6640 6955/7155/6640 +f 6958/7163/6641 7738/7162/6641 6955/7155/6641 6262/7154/6641 +f 6260/7160/6642 6959/7164/6642 7739/7165/6642 6957/7161/6642 +f 6959/7164/6643 6267/7137/6643 6945/7136/6643 7739/7165/6643 +f 7739/7165/6644 6945/7136/6644 6265/7135/6644 6960/7166/6644 +f 6957/7161/6645 7739/7165/6645 6960/7166/6645 6261/7152/6645 +f 6266/7138/6646 6946/7141/6646 7740/7167/6646 6961/7168/6646 +f 6946/7141/6647 6267/7137/6647 6959/7164/6647 7740/7167/6647 +f 7740/7167/6648 6959/7164/6648 6260/7160/6648 6958/7163/6648 +f 6961/7168/6649 7740/7167/6649 6958/7163/6649 6262/7154/6649 +f 6261/7152/6650 6960/7166/6650 7741/7169/6650 6953/7153/6650 +f 6265/7135/6651 6949/7145/6651 7741/7169/6651 6960/7166/6651 +f 6263/7144/6652 6953/7153/6652 7741/7169/6652 6949/7145/6652 +f 6264/7146/6653 6950/7149/6653 7742/7170/6653 6954/7157/6653 +f 6266/7138/6654 6961/7168/6654 7742/7170/6654 6950/7149/6654 +f 6262/7154/6655 6954/7157/6655 7742/7170/6655 6961/7168/6655 +f 6219/6878/6656 6818/6885/6656 7743/7171/6656 6962/7172/6656 +f 6818/6885/6657 6217/6856/6657 6963/7173/6657 7743/7171/6657 +f 7743/7171/6658 6963/7173/6658 6270/7174/6658 6964/7175/6658 +f 6962/7172/6659 7743/7171/6659 6964/7175/6659 6268/7176/6659 +f 6271/7177/6660 6966/7178/6660 7744/7179/6660 6965/7180/6660 +f 6966/7178/6661 6218/6863/6661 6819/6886/6661 7744/7179/6661 +f 7744/7179/6662 6819/6886/6662 6220/6882/6662 6967/7181/6662 +f 6965/7180/6663 7744/7179/6663 6967/7181/6663 6269/7182/6663 +f 6148/6868/6664 6812/6874/6664 7745/7183/6664 6968/7184/6664 +f 6812/6874/6665 6219/6878/6665 6962/7172/6665 7745/7183/6665 +f 7745/7183/6666 6962/7172/6666 6268/7176/6666 6969/7185/6666 +f 6968/7184/6667 7745/7183/6667 6969/7185/6667 6290/7186/6667 +f 6269/7182/6668 6967/7181/6668 7746/7187/6668 6970/7188/6668 +f 6967/7181/6669 6220/6882/6669 6816/6881/6669 7746/7187/6669 +f 7746/7187/6670 6816/6881/6670 6149/6872/6670 6971/7189/6670 +f 6970/7188/6671 7746/7187/6671 6971/7189/6671 6291/7190/6671 +f 6146/6778/6672 6808/6866/6672 7747/7191/6672 6972/7192/6672 +f 6808/6866/6673 6148/6868/6673 6968/7184/6673 7747/7191/6673 +f 7747/7191/6674 6968/7184/6674 6290/7186/6674 6973/7193/6674 +f 6972/7192/6675 7747/7191/6675 6973/7193/6675 6292/7194/6675 +f 6291/7190/6676 6971/7189/6676 7748/7195/6676 6974/7196/6676 +f 6971/7189/6677 6149/6872/6677 6811/6871/6677 7748/7195/6677 +f 7748/7195/6678 6811/6871/6678 6147/6788/6678 6975/7197/6678 +f 6974/7196/6679 7748/7195/6679 6975/7197/6679 6293/7198/6679 +f 6217/6856/6680 6802/6854/6680 7749/7199/6680 6963/7173/6680 +f 6802/6854/6681 6150/6846/6681 6976/7200/6681 7749/7199/6681 +f 7749/7199/6682 6976/7200/6682 6288/7201/6682 6977/7202/6682 +f 6963/7173/6683 7749/7199/6683 6977/7202/6683 6270/7174/6683 +f 6289/7203/6684 6979/7204/6684 7750/7205/6684 6978/7206/6684 +f 6979/7204/6685 6151/6852/6685 6807/6864/6685 7750/7205/6685 +f 7750/7205/6686 6807/6864/6686 6218/6863/6686 6966/7178/6686 +f 6978/7206/6687 7750/7205/6687 6966/7178/6687 6271/7177/6687 +f 6150/6846/6688 6798/6849/6688 7751/7207/6688 6976/7200/6688 +f 6798/6849/6689 6152/6838/6689 6980/7208/6689 7751/7207/6689 +f 7751/7207/6690 6980/7208/6690 6286/7209/6690 6981/7210/6690 +f 6976/7200/6691 7751/7207/6691 6981/7210/6691 6288/7201/6691 +f 6287/7211/6692 6983/7212/6692 7752/7213/6692 6982/7214/6692 +f 6983/7212/6693 6153/6844/6693 6801/6853/6693 7752/7213/6693 +f 7752/7213/6694 6801/6853/6694 6151/6852/6694 6979/7204/6694 +f 6982/7214/6695 7752/7213/6695 6979/7204/6695 6289/7203/6695 +f 6152/6838/6696 6794/6841/6696 7753/7215/6696 6980/7208/6696 +f 6794/6841/6697 6154/6830/6697 6984/7216/6697 7753/7215/6697 +f 7753/7215/6698 6984/7216/6698 6284/7217/6698 6985/7218/6698 +f 6980/7208/6699 7753/7215/6699 6985/7218/6699 6286/7209/6699 +f 6285/7219/6700 6987/7220/6700 7754/7221/6700 6986/7222/6700 +f 6987/7220/6701 6155/6836/6701 6797/6845/6701 7754/7221/6701 +f 7754/7221/6702 6797/6845/6702 6153/6844/6702 6983/7212/6702 +f 6986/7222/6703 7754/7221/6703 6983/7212/6703 6287/7211/6703 +f 6154/6830/6704 6790/6833/6704 7755/7223/6704 6984/7216/6704 +f 6790/6833/6705 6156/6822/6705 6988/7224/6705 7755/7223/6705 +f 7755/7223/6706 6988/7224/6706 6282/7225/6706 6989/7226/6706 +f 6984/7216/6707 7755/7223/6707 6989/7226/6707 6284/7217/6707 +f 6283/7227/6708 6991/7228/6708 7756/7229/6708 6990/7230/6708 +f 6991/7228/6709 6157/6828/6709 6793/6837/6709 7756/7229/6709 +f 7756/7229/6710 6793/6837/6710 6155/6836/6710 6987/7220/6710 +f 6990/7230/6711 7756/7229/6711 6987/7220/6711 6285/7219/6711 +f 6156/6822/6712 6786/6825/6712 7757/7231/6712 6988/7224/6712 +f 6786/6825/6713 6158/6814/6713 6992/7232/6713 7757/7231/6713 +f 7757/7231/6714 6992/7232/6714 6280/7233/6714 6993/7234/6714 +f 6988/7224/6715 7757/7231/6715 6993/7234/6715 6282/7225/6715 +f 6281/7235/6716 6995/7236/6716 7758/7237/6716 6994/7238/6716 +f 6995/7236/6717 6159/6820/6717 6789/6829/6717 7758/7237/6717 +f 7758/7237/6718 6789/6829/6718 6157/6828/6718 6991/7228/6718 +f 6994/7238/6719 7758/7237/6719 6991/7228/6719 6283/7227/6719 +f 6158/6814/6720 6782/6817/6720 7759/7239/6720 6992/7232/6720 +f 6782/6817/6721 6160/6806/6721 6996/7240/6721 7759/7239/6721 +f 7759/7239/6722 6996/7240/6722 6278/7241/6722 6997/7242/6722 +f 6992/7232/6723 7759/7239/6723 6997/7242/6723 6280/7233/6723 +f 6279/7243/6724 6999/7244/6724 7760/7245/6724 6998/7246/6724 +f 6999/7244/6725 6161/6812/6725 6785/6821/6725 7760/7245/6725 +f 7760/7245/6726 6785/6821/6726 6159/6820/6726 6995/7236/6726 +f 6998/7246/6727 7760/7245/6727 6995/7236/6727 6281/7235/6727 +f 6160/6806/6728 6778/6809/6728 7761/7247/6728 6996/7240/6728 +f 6778/6809/6729 6162/6798/6729 7000/7248/6729 7761/7247/6729 +f 7761/7247/6730 7000/7248/6730 6276/7249/6730 7001/7250/6730 +f 6996/7240/6731 7761/7247/6731 7001/7250/6731 6278/7241/6731 +f 6277/7251/6732 7003/7252/6732 7762/7253/6732 7002/7254/6732 +f 7003/7252/6733 6163/6804/6733 6781/6813/6733 7762/7253/6733 +f 7762/7253/6734 6781/6813/6734 6161/6812/6734 6999/7244/6734 +f 7002/7254/6735 7762/7253/6735 6999/7244/6735 6279/7243/6735 +f 6162/6798/6736 6774/6801/6736 7763/7255/6736 7000/7248/6736 +f 6774/6801/6737 6215/6792/6737 7004/7256/6737 7763/7255/6737 +f 7763/7255/6738 7004/7256/6738 6272/7257/6738 7005/7258/6738 +f 7000/7248/6739 7763/7255/6739 7005/7258/6739 6276/7249/6739 +f 6273/7259/6740 7007/7260/6740 7764/7261/6740 7006/7262/6740 +f 7007/7260/6741 6216/6796/6741 6777/6805/6741 7764/7261/6741 +f 7764/7261/6742 6777/6805/6742 6163/6804/6742 7003/7252/6742 +f 7006/7262/6743 7764/7261/6743 7003/7252/6743 6277/7251/6743 +f 6215/6792/6744 6770/6790/6744 7765/7263/6744 7004/7256/6744 +f 6770/6790/6745 6164/6782/6745 7008/7264/6745 7765/7263/6745 +f 7765/7263/6746 7008/7264/6746 6274/7265/6746 7009/7266/6746 +f 7004/7256/6747 7765/7263/6747 7009/7266/6747 6272/7257/6747 +f 6275/7267/6748 7011/7268/6748 7766/7269/6748 7010/7270/6748 +f 7011/7268/6749 6165/6786/6749 6773/6797/6749 7766/7269/6749 +f 7766/7269/6750 6773/6797/6750 6216/6796/6750 7007/7260/6750 +f 7010/7270/6751 7766/7269/6751 7007/7260/6751 6273/7259/6751 +f 6164/6782/6752 6765/6779/6752 7767/7271/6752 7008/7264/6752 +f 6765/6779/6753 6146/6778/6753 6972/7192/6753 7767/7271/6753 +f 7767/7271/6754 6972/7192/6754 6292/7194/6754 7012/7272/6754 +f 7008/7264/6755 7767/7271/6755 7012/7272/6755 6274/7265/6755 +f 6293/7198/6756 6975/7197/6756 7768/7273/6756 7013/7274/6756 +f 6975/7197/6757 6147/6788/6757 6768/6787/6757 7768/7273/6757 +f 7768/7273/6758 6768/6787/6758 6165/6786/6758 7011/7268/6758 +f 7013/7274/6759 7768/7273/6759 7011/7268/6759 6275/7267/6759 +f 6274/7265/6760 7012/7272/6760 7769/7275/6760 7014/7276/6760 +f 7012/7272/6761 6292/7194/6761 7015/7277/6761 7769/7275/6761 +f 7769/7275/6762 7015/7277/6762 6294/7278/6762 7016/7279/6762 +f 7014/7276/6763 7769/7275/6763 7016/7279/6763 6312/7280/6763 +f 6295/7281/6764 7018/7282/6764 7770/7283/6764 7017/7284/6764 +f 7018/7282/6765 6293/7198/6765 7013/7274/6765 7770/7283/6765 +f 7770/7283/6766 7013/7274/6766 6275/7267/6766 7019/7285/6766 +f 7017/7284/6767 7770/7283/6767 7019/7285/6767 6313/7286/6767 +f 6272/7257/6768 7009/7266/6768 7771/7287/6768 7020/7288/6768 +f 7009/7266/6769 6274/7265/6769 7014/7276/6769 7771/7287/6769 +f 7771/7287/6770 7014/7276/6770 6312/7280/6770 7021/7289/6770 +f 7020/7288/6771 7771/7287/6771 7021/7289/6771 6314/7290/6771 +f 6313/7286/6772 7019/7285/6772 7772/7291/6772 7022/7292/6772 +f 7019/7285/6773 6275/7267/6773 7010/7270/6773 7772/7291/6773 +f 7772/7291/6774 7010/7270/6774 6273/7259/6774 7023/7293/6774 +f 7022/7292/6775 7772/7291/6775 7023/7293/6775 6315/7294/6775 +f 6276/7249/6776 7005/7258/6776 7773/7295/6776 7024/7296/6776 +f 7005/7258/6777 6272/7257/6777 7020/7288/6777 7773/7295/6777 +f 7773/7295/6778 7020/7288/6778 6314/7290/6778 7025/7297/6778 +f 7024/7296/6779 7773/7295/6779 7025/7297/6779 6310/7298/6779 +f 6315/7294/6780 7023/7293/6780 7774/7299/6780 7026/7300/6780 +f 7023/7293/6781 6273/7259/6781 7006/7262/6781 7774/7299/6781 +f 7774/7299/6782 7006/7262/6782 6277/7251/6782 7027/7301/6782 +f 7026/7300/6783 7774/7299/6783 7027/7301/6783 6311/7302/6783 +f 6278/7241/6784 7001/7250/6784 7775/7303/6784 7028/7304/6784 +f 7001/7250/6785 6276/7249/6785 7024/7296/6785 7775/7303/6785 +f 7775/7303/6786 7024/7296/6786 6310/7298/6786 7029/7305/6786 +f 7028/7304/6787 7775/7303/6787 7029/7305/6787 6308/7306/6787 +f 6311/7302/6788 7027/7301/6788 7776/7307/6788 7030/7308/6788 +f 7027/7301/6789 6277/7251/6789 7002/7254/6789 7776/7307/6789 +f 7776/7307/6790 7002/7254/6790 6279/7243/6790 7031/7309/6790 +f 7030/7308/6791 7776/7307/6791 7031/7309/6791 6309/7310/6791 +f 6280/7233/6792 6997/7242/6792 7777/7311/6792 7032/7312/6792 +f 6997/7242/6793 6278/7241/6793 7028/7304/6793 7777/7311/6793 +f 7777/7311/6794 7028/7304/6794 6308/7306/6794 7033/7313/6794 +f 7032/7312/6795 7777/7311/6795 7033/7313/6795 6306/7314/6795 +f 6309/7310/6796 7031/7309/6796 7778/7315/6796 7034/7316/6796 +f 7031/7309/6797 6279/7243/6797 6998/7246/6797 7778/7315/6797 +f 7778/7315/6798 6998/7246/6798 6281/7235/6798 7035/7317/6798 +f 7034/7316/6799 7778/7315/6799 7035/7317/6799 6307/7318/6799 +f 6282/7225/6800 6993/7234/6800 7779/7319/6800 7036/7320/6800 +f 6993/7234/6801 6280/7233/6801 7032/7312/6801 7779/7319/6801 +f 7779/7319/6802 7032/7312/6802 6306/7314/6802 7037/7321/6802 +f 7036/7320/6803 7779/7319/6803 7037/7321/6803 6304/7322/6803 +f 6307/7318/6804 7035/7317/6804 7780/7323/6804 7038/7324/6804 +f 7035/7317/6805 6281/7235/6805 6994/7238/6805 7780/7323/6805 +f 7780/7323/6806 6994/7238/6806 6283/7227/6806 7039/7325/6806 +f 7038/7324/6807 7780/7323/6807 7039/7325/6807 6305/7326/6807 +f 6284/7217/6808 6989/7226/6808 7781/7327/6808 7040/7328/6808 +f 6989/7226/6809 6282/7225/6809 7036/7320/6809 7781/7327/6809 +f 7781/7327/6810 7036/7320/6810 6304/7322/6810 7041/7329/6810 +f 7040/7328/6811 7781/7327/6811 7041/7329/6811 6302/7330/6811 +f 6305/7326/6812 7039/7325/6812 7782/7331/6812 7042/7332/6812 +f 7039/7325/6813 6283/7227/6813 6990/7230/6813 7782/7331/6813 +f 7782/7331/6814 6990/7230/6814 6285/7219/6814 7043/7333/6814 +f 7042/7332/6815 7782/7331/6815 7043/7333/6815 6303/7334/6815 +f 6286/7209/6816 6985/7218/6816 7783/7335/6816 7044/7336/6816 +f 6985/7218/6817 6284/7217/6817 7040/7328/6817 7783/7335/6817 +f 7783/7335/6818 7040/7328/6818 6302/7330/6818 7045/7337/6818 +f 7044/7336/6819 7783/7335/6819 7045/7337/6819 6300/7338/6819 +f 6303/7334/6820 7043/7333/6820 7784/7339/6820 7046/7340/6820 +f 7043/7333/6821 6285/7219/6821 6986/7222/6821 7784/7339/6821 +f 7784/7339/6822 6986/7222/6822 6287/7211/6822 7047/7341/6822 +f 7046/7340/6823 7784/7339/6823 7047/7341/6823 6301/7342/6823 +f 6288/7201/6824 6981/7210/6824 7785/7343/6824 7048/7344/6824 +f 6981/7210/6825 6286/7209/6825 7044/7336/6825 7785/7343/6825 +f 7785/7343/6826 7044/7336/6826 6300/7338/6826 7049/7345/6826 +f 7048/7344/6827 7785/7343/6827 7049/7345/6827 6298/7346/6827 +f 6301/7342/6828 7047/7341/6828 7786/7347/6828 7050/7348/6828 +f 7047/7341/6829 6287/7211/6829 6982/7214/6829 7786/7347/6829 +f 7786/7347/6830 6982/7214/6830 6289/7203/6830 7051/7349/6830 +f 7050/7348/6831 7786/7347/6831 7051/7349/6831 6299/7350/6831 +f 6270/7174/6832 6977/7202/6832 7787/7351/6832 7052/7352/6832 +f 6977/7202/6833 6288/7201/6833 7048/7344/6833 7787/7351/6833 +f 7787/7351/6834 7048/7344/6834 6298/7346/6834 7053/7353/6834 +f 7052/7352/6835 7787/7351/6835 7053/7353/6835 6316/7354/6835 +f 6299/7350/6836 7051/7349/6836 7788/7355/6836 7054/7356/6836 +f 7051/7349/6837 6289/7203/6837 6978/7206/6837 7788/7355/6837 +f 7788/7355/6838 6978/7206/6838 6271/7177/6838 7055/7357/6838 +f 7054/7356/6839 7788/7355/6839 7055/7357/6839 6317/7358/6839 +f 6292/7194/6840 6973/7193/6840 7789/7359/6840 7015/7277/6840 +f 6973/7193/6841 6290/7186/6841 7056/7360/6841 7789/7359/6841 +f 7789/7359/6842 7056/7360/6842 6296/7361/6842 7057/7362/6842 +f 7015/7277/6843 7789/7359/6843 7057/7362/6843 6294/7278/6843 +f 6297/7363/6844 7059/7364/6844 7790/7365/6844 7058/7366/6844 +f 7059/7364/6845 6291/7190/6845 6974/7196/6845 7790/7365/6845 +f 7790/7365/6846 6974/7196/6846 6293/7198/6846 7018/7282/6846 +f 7058/7366/6847 7790/7365/6847 7018/7282/6847 6295/7281/6847 +f 6290/7186/6848 6969/7185/6848 7791/7367/6848 7056/7360/6848 +f 6969/7185/6849 6268/7176/6849 7060/7368/6849 7791/7367/6849 +f 7791/7367/6850 7060/7368/6850 6318/7369/6850 7061/7370/6850 +f 7056/7360/6851 7791/7367/6851 7061/7370/6851 6296/7361/6851 +f 6319/7371/6852 7063/7372/6852 7792/7373/6852 7062/7374/6852 +f 7063/7372/6853 6269/7182/6853 6970/7188/6853 7792/7373/6853 +f 7792/7373/6854 6970/7188/6854 6291/7190/6854 7059/7364/6854 +f 7062/7374/6855 7792/7373/6855 7059/7364/6855 6297/7363/6855 +f 6268/7176/6856 6964/7175/6856 7793/7375/6856 7060/7368/6856 +f 6964/7175/6857 6270/7174/6857 7052/7352/6857 7793/7375/6857 +f 7793/7375/6858 7052/7352/6858 6316/7354/6858 7064/7376/6858 +f 7060/7368/6859 7793/7375/6859 7064/7376/6859 6318/7369/6859 +f 6317/7358/6860 7055/7357/6860 7794/7377/6860 7065/7378/6860 +f 7055/7357/6861 6271/7177/6861 6965/7180/6861 7794/7377/6861 +f 7794/7377/6862 6965/7180/6862 6269/7182/6862 7063/7372/6862 +f 7065/7378/6863 7794/7377/6863 7063/7372/6863 6319/7371/6863 +f 6103/6771/6864 6759/6769/6864 7795/7379/6864 7066/7380/6864 +f 6759/6769/6865 6144/6759/6865 7067/7381/6865 7795/7379/6865 +f 7795/7379/6866 7067/7381/6866 6320/7382/6866 7068/7383/6866 +f 7066/7380/6867 7795/7379/6867 7068/7383/6867 6109/7384/6867 +f 6321/7385/6868 7070/7386/6868 7796/7387/6868 7069/7388/6868 +f 7070/7386/6869 6145/6767/6869 6763/6777/6869 7796/7387/6869 +f 7796/7387/6870 6763/6777/6870 6103/6771/6870 7066/7380/6870 +f 7069/7388/6871 7796/7387/6871 7066/7380/6871 6109/7384/6871 +f 6144/6759/6872 6753/6757/6872 7797/7389/6872 7067/7381/6872 +f 6753/6757/6873 6142/6747/6873 7071/7390/6873 7797/7389/6873 +f 7797/7389/6874 7071/7390/6874 6322/7391/6874 7072/7392/6874 +f 7067/7381/6875 7797/7389/6875 7072/7392/6875 6320/7382/6875 +f 6323/7393/6876 7074/7394/6876 7798/7395/6876 7073/7396/6876 +f 7074/7394/6877 6143/6755/6877 6758/6768/6877 7798/7395/6877 +f 7798/7395/6878 6758/6768/6878 6145/6767/6878 7070/7386/6878 +f 7073/7396/6879 7798/7395/6879 7070/7386/6879 6321/7385/6879 +f 6142/6747/6880 6747/6745/6880 7799/7397/6880 7071/7390/6880 +f 6747/6745/6881 6140/6735/6881 7075/7398/6881 7799/7397/6881 +f 7799/7397/6882 7075/7398/6882 6324/7399/6882 7076/7400/6882 +f 7071/7390/6883 7799/7397/6883 7076/7400/6883 6322/7391/6883 +f 6325/7401/6884 7078/7402/6884 7800/7403/6884 7077/7404/6884 +f 7078/7402/6885 6141/6743/6885 6752/6756/6885 7800/7403/6885 +f 7800/7403/6886 6752/6756/6886 6143/6755/6886 7074/7394/6886 +f 7077/7404/6887 7800/7403/6887 7074/7394/6887 6323/7393/6887 +f 6140/6735/6888 6741/6733/6888 7801/7405/6888 7075/7398/6888 +f 6741/6733/6889 6138/6723/6889 7079/7406/6889 7801/7405/6889 +f 7801/7405/6890 7079/7406/6890 6326/7407/6890 7080/7408/6890 +f 7075/7398/6891 7801/7405/6891 7080/7408/6891 6324/7399/6891 +f 6327/7409/6892 7082/7410/6892 7802/7411/6892 7081/7412/6892 +f 7082/7410/6893 6139/6731/6893 6746/6744/6893 7802/7411/6893 +f 7802/7411/6894 6746/6744/6894 6141/6743/6894 7078/7402/6894 +f 7081/7412/6895 7802/7411/6895 7078/7402/6895 6325/7401/6895 +f 6138/6723/6896 6735/6721/6896 7803/7413/6896 7079/7406/6896 +f 6735/6721/6897 6136/6711/6897 7083/7414/6897 7803/7413/6897 +f 7803/7413/6898 7083/7414/6898 6328/7415/6898 7084/7416/6898 +f 7079/7406/6899 7803/7413/6899 7084/7416/6899 6326/7407/6899 +f 6329/7417/6900 7086/7418/6900 7804/7419/6900 7085/7420/6900 +f 7086/7418/6901 6137/6719/6901 6740/6732/6901 7804/7419/6901 +f 7804/7419/6902 6740/6732/6902 6139/6731/6902 7082/7410/6902 +f 7085/7420/6903 7804/7419/6903 7082/7410/6903 6327/7409/6903 +f 6136/6711/6904 6729/6709/6904 7805/7421/6904 7083/7414/6904 +f 6729/6709/6905 6134/6699/6905 7087/7422/6905 7805/7421/6905 +f 7805/7421/6906 7087/7422/6906 6330/7423/6906 7088/7424/6906 +f 7083/7414/6907 7805/7421/6907 7088/7424/6907 6328/7415/6907 +f 6331/7425/6908 7090/7426/6908 7806/7427/6908 7089/7428/6908 +f 7090/7426/6909 6135/6707/6909 6734/6720/6909 7806/7427/6909 +f 7806/7427/6910 6734/6720/6910 6137/6719/6910 7086/7418/6910 +f 7089/7428/6911 7806/7427/6911 7086/7418/6911 6329/7417/6911 +f 6134/6699/6912 6723/6697/6912 7807/7429/6912 7087/7422/6912 +f 6723/6697/6913 6132/6687/6913 7091/7430/6913 7807/7429/6913 +f 7807/7429/6914 7091/7430/6914 6332/7431/6914 7092/7432/6914 +f 7087/7422/6915 7807/7429/6915 7092/7432/6915 6330/7423/6915 +f 6333/7433/6916 7094/7434/6916 7808/7435/6916 7093/7436/6916 +f 7094/7434/6917 6133/6695/6917 6728/6708/6917 7808/7435/6917 +f 7808/7435/6918 6728/6708/6918 6135/6707/6918 7090/7426/6918 +f 7093/7436/6919 7808/7435/6919 7090/7426/6919 6331/7425/6919 +f 6132/6687/6920 6717/6685/6920 7809/7437/6920 7091/7430/6920 +f 6717/6685/6921 6130/6675/6921 7095/7438/6921 7809/7437/6921 +f 7809/7437/6922 7095/7438/6922 6334/7439/6922 7096/7440/6922 +f 7091/7430/6923 7809/7437/6923 7096/7440/6923 6332/7431/6923 +f 6335/7441/6924 7098/7442/6924 7810/7443/6924 7097/7444/6924 +f 7098/7442/6925 6131/6683/6925 6722/6696/6925 7810/7443/6925 +f 7810/7443/6926 6722/6696/6926 6133/6695/6926 7094/7434/6926 +f 7097/7444/6927 7810/7443/6927 7094/7434/6927 6333/7433/6927 +f 6130/6675/6928 6711/6673/6928 7811/7445/6928 7095/7438/6928 +f 6711/6673/6929 6128/6659/6929 7099/7446/6929 7811/7445/6929 +f 7811/7445/6930 7099/7446/6930 6336/7447/6930 7100/7448/6930 +f 7095/7438/6931 7811/7445/6931 7100/7448/6931 6334/7439/6931 +f 6337/7449/6932 7102/7450/6932 7812/7451/6932 7101/7452/6932 +f 7102/7450/6933 6129/6668/6933 6716/6684/6933 7812/7451/6933 +f 7812/7451/6934 6716/6684/6934 6131/6683/6934 7098/7442/6934 +f 7101/7452/6935 7812/7451/6935 7098/7442/6935 6335/7441/6935 +f 6344/7453/6936 7104/7454/6936 7813/7455/6936 7103/7456/6936 +f 7104/7454/6937 6345/7457/6937 7105/7458/6937 7813/7455/6937 +f 7813/7455/6938 7105/7458/6938 6364/7459/6938 7106/7460/6938 +f 7103/7456/6939 7813/7455/6939 7106/7460/6939 6374/7461/6939 +f 6365/7462/6940 7108/7463/6940 7814/7464/6940 7107/7465/6940 +f 7108/7463/6941 6345/7466/6941 7104/7467/6941 7814/7464/6941 +f 7814/7464/6942 7104/7467/6942 6344/7468/6942 7109/7469/6942 +f 7107/7465/6943 7814/7464/6943 7109/7469/6943 6375/7470/6943 +f 6343/7471/6944 7111/7472/6944 7815/7473/6944 7110/7474/6944 +f 7111/7472/6945 6344/7453/6945 7103/7456/6945 7815/7473/6945 +f 7815/7473/6946 7103/7456/6946 6374/7461/6946 7112/7475/6946 +f 7110/7474/6947 7815/7473/6947 7112/7475/6947 6372/7476/6947 +f 6375/7470/6948 7109/7469/6948 7816/7477/6948 7113/7478/6948 +f 7109/7469/6949 6344/7468/6949 7111/7479/6949 7816/7477/6949 +f 7816/7477/6950 7111/7479/6950 6343/7480/6950 7114/7481/6950 +f 7113/7478/6951 7816/7477/6951 7114/7481/6951 6373/7482/6951 +f 6342/7483/6952 7116/7484/6952 7817/7485/6952 7115/7486/6952 +f 7116/7484/6953 6343/7471/6953 7110/7474/6953 7817/7485/6953 +f 7817/7485/6954 7110/7474/6954 6372/7476/6954 7117/7487/6954 +f 7115/7486/6955 7817/7485/6955 7117/7487/6955 6376/7488/6955 +f 6373/7482/6956 7114/7481/6956 7818/7489/6956 7118/7490/6956 +f 7114/7481/6957 6343/7480/6957 7116/7491/6957 7818/7489/6957 +f 7818/7489/6958 7116/7491/6958 6342/7483/6958 7119/7492/6958 +f 7118/7490/6959 7818/7489/6959 7119/7492/6959 6377/7493/6959 +f 6125/6592/6960 6672/6595/6960 7819/7494/6960 7120/7495/6960 +f 6672/6595/6961 6127/6600/6961 7121/7496/6961 7819/7494/6961 +f 7819/7494/6962 7121/7496/6962 6342/7483/6962 7115/7486/6962 +f 7120/7495/6963 7819/7494/6963 7115/7486/6963 6376/7488/6963 +f 6342/7483/6964 7121/7496/6964 7820/7497/6964 7119/7492/6964 +f 7121/7496/6965 6127/6600/6965 6678/6606/6965 7820/7497/6965 +f 7820/7497/6966 6678/6606/6966 6126/6605/6966 7122/7498/6966 +f 7119/7492/6967 7820/7497/6967 7122/7498/6967 6377/7493/6967 +f 6123/6607/6968 6679/6610/6968 7821/7499/6968 7123/7500/6968 +f 6679/6610/6969 6125/6592/6969 7120/7495/6969 7821/7499/6969 +f 7821/7499/6970 7120/7495/6970 6376/7488/6970 7124/7501/6970 +f 7123/7500/6971 7821/7499/6971 7124/7501/6971 6370/7502/6971 +f 6377/7493/6972 7122/7498/6972 7822/7503/6972 7125/7504/6972 +f 7122/7498/6973 6126/6605/6973 6684/6618/6973 7822/7503/6973 +f 7822/7503/6974 6684/6618/6974 6124/6617/6974 7126/7505/6974 +f 7125/7504/6975 7822/7503/6975 7126/7505/6975 6371/7506/6975 +f 6121/6619/6976 6685/6622/6976 7823/7507/6976 7127/7508/6976 +f 6685/6622/6977 6123/6607/6977 7123/7500/6977 7823/7507/6977 +f 7823/7507/6978 7123/7500/6978 6370/7502/6978 7128/7509/6978 +f 7127/7508/6979 7823/7507/6979 7128/7509/6979 6366/7510/6979 +f 6371/7506/6980 7126/7505/6980 7824/7511/6980 7129/7512/6980 +f 7126/7505/6981 6124/6617/6981 6690/6630/6981 7824/7511/6981 +f 7824/7511/6982 6690/6630/6982 6122/6629/6982 7130/7513/6982 +f 7129/7512/6983 7824/7511/6983 7130/7513/6983 6367/7514/6983 +f 6119/6631/6984 6691/6634/6984 7825/7515/6984 7131/7516/6984 +f 6691/6634/6985 6121/6619/6985 7127/7508/6985 7825/7515/6985 +f 7825/7515/6986 7127/7508/6986 6366/7510/6986 7132/7517/6986 +f 7131/7516/6987 7825/7515/6987 7132/7517/6987 6368/7518/6987 +f 6367/7514/6988 7130/7513/6988 7826/7519/6988 7133/7520/6988 +f 7130/7513/6989 6122/6629/6989 6696/6642/6989 7826/7519/6989 +f 7826/7519/6990 6696/6642/6990 6120/6641/6990 7134/7521/6990 +f 7133/7520/6991 7826/7519/6991 7134/7521/6991 6369/7522/6991 +f 6366/7510/6992 7135/7523/6992 7827/7524/6992 7132/7517/6992 +f 7135/7523/6993 6372/7476/6993 7112/7475/6993 7827/7524/6993 +f 7827/7524/6994 7112/7475/6994 6374/7461/6994 7136/7525/6994 +f 7132/7517/6995 7827/7524/6995 7136/7525/6995 6368/7518/6995 +f 6375/7470/6996 7113/7478/6996 7828/7526/6996 7137/7527/6996 +f 7113/7478/6997 6373/7482/6997 7138/7528/6997 7828/7526/6997 +f 7828/7526/6998 7138/7528/6998 6367/7514/6998 7133/7520/6998 +f 7137/7527/6999 7828/7526/6999 7133/7520/6999 6369/7522/6999 +f 6366/7510/7000 7128/7509/7000 7829/7529/7000 7135/7523/7000 +f 7128/7509/7001 6370/7502/7001 7124/7501/7001 7829/7529/7001 +f 7829/7529/7002 7124/7501/7002 6376/7488/7002 7117/7487/7002 +f 7135/7523/7003 7829/7529/7003 7117/7487/7003 6372/7476/7003 +f 6377/7493/7004 7125/7504/7004 7830/7530/7004 7118/7490/7004 +f 7125/7504/7005 6371/7506/7005 7129/7512/7005 7830/7530/7005 +f 7830/7530/7006 7129/7512/7006 6367/7514/7006 7138/7528/7006 +f 7118/7490/7007 7830/7530/7007 7138/7528/7007 6373/7482/7007 +f 6362/7531/7008 7140/7532/7008 7831/7533/7008 7139/7534/7008 +f 7140/7532/7009 6368/7518/7009 7136/7525/7009 7831/7533/7009 +f 7831/7533/7010 7136/7525/7010 6374/7461/7010 7106/7460/7010 +f 7139/7534/7011 7831/7533/7011 7106/7460/7011 6364/7459/7011 +f 6375/7470/7012 7137/7527/7012 7832/7535/7012 7107/7465/7012 +f 7137/7527/7013 6369/7522/7013 7141/7536/7013 7832/7535/7013 +f 7832/7535/7014 7141/7536/7014 6363/7537/7014 7142/7538/7014 +f 7107/7465/7015 7832/7535/7015 7142/7538/7015 6365/7462/7015 +f 6117/6643/7016 6697/6646/7016 7833/7539/7016 7143/7540/7016 +f 6697/6646/7017 6119/6631/7017 7131/7516/7017 7833/7539/7017 +f 7833/7539/7018 7131/7516/7018 6368/7518/7018 7140/7532/7018 +f 7143/7540/7019 7833/7539/7019 7140/7532/7019 6362/7531/7019 +f 6369/7522/7020 7134/7521/7020 7834/7541/7020 7141/7536/7020 +f 7134/7521/7021 6120/6641/7021 6702/6654/7021 7834/7541/7021 +f 7834/7541/7022 6702/6654/7022 6118/6653/7022 7144/7542/7022 +f 7141/7536/7023 7834/7541/7023 7144/7542/7023 6363/7537/7023 +f 6245/7082/7024 7145/7543/7024 7835/7544/7024 6921/7088/7024 +f 7145/7543/7025 6378/7545/7025 7146/7546/7025 7835/7544/7025 +f 7835/7544/7026 7146/7546/7026 6380/7547/7026 7147/7548/7026 +f 6921/7088/7027 7835/7544/7027 7147/7548/7027 6251/7090/7027 +f 6381/7549/7028 7149/7550/7028 7836/7551/7028 7148/7552/7028 +f 7149/7550/7029 6379/7553/7029 7150/7554/7029 7836/7551/7029 +f 7836/7551/7030 7150/7554/7030 6246/7086/7030 6924/7095/7030 +f 7148/7552/7031 7836/7551/7031 6924/7095/7031 6252/7094/7031 +f 6117/6643/7032 7143/7540/7032 7837/7555/7032 6917/7080/7032 +f 7143/7540/7033 6362/7531/7033 7151/7556/7033 7837/7555/7033 +f 7837/7555/7034 7151/7556/7034 6378/7545/7034 7145/7543/7034 +f 6917/7080/7035 7837/7555/7035 7145/7543/7035 6245/7082/7035 +f 6379/7553/7036 7152/7557/7036 7838/7558/7036 7150/7554/7036 +f 7152/7557/7037 6363/7537/7037 7144/7542/7037 7838/7558/7037 +f 7838/7558/7038 7144/7542/7038 6118/6653/7038 6920/7087/7038 +f 7150/7554/7039 7838/7558/7039 6920/7087/7039 6246/7086/7039 +f 6115/6655/7040 6925/7097/7040 7839/7559/7040 7153/7560/7040 +f 6925/7097/7041 6251/7090/7041 7147/7548/7041 7839/7559/7041 +f 7839/7559/7042 7147/7548/7042 6380/7547/7042 7154/7561/7042 +f 7153/7560/7043 7839/7559/7043 7154/7561/7043 6382/7562/7043 +f 6381/7549/7044 7148/7552/7044 7840/7563/7044 7155/7564/7044 +f 7148/7552/7045 6252/7094/7045 6926/7099/7045 7840/7563/7045 +f 7840/7563/7046 6926/7099/7046 6116/6670/7046 7156/7565/7046 +f 7155/7564/7047 7840/7563/7047 7156/7565/7047 6383/7566/7047 +f 6115/6655/7048 7153/7560/7048 7841/7567/7048 6704/6656/7048 +f 7153/7560/7049 6382/7562/7049 7157/7568/7049 7841/7567/7049 +f 7841/7567/7050 7157/7568/7050 6336/7447/7050 7099/7446/7050 +f 6704/6656/7051 7841/7567/7051 7099/7446/7051 6128/6659/7051 +f 6337/7449/7052 7158/7569/7052 7842/7570/7052 7102/7450/7052 +f 7158/7569/7053 6383/7566/7053 7156/7565/7053 7842/7570/7053 +f 7842/7570/7054 7156/7565/7054 6116/6670/7054 6709/6669/7054 +f 7102/7450/7055 7842/7570/7055 6709/6669/7055 6129/6668/7055 +f 6113/7571/7056 7160/7572/7056 7843/7573/7056 7159/7574/7056 +f 7160/7572/7057 6360/7575/7057 7161/7576/7057 7843/7573/7057 +f 7843/7573/7058 7161/7576/7058 6388/7577/7058 7162/7578/7058 +f 7159/7574/7059 7843/7573/7059 7162/7578/7059 6340/7579/7059 +f 6389/7580/7060 7164/7581/7060 7844/7582/7060 7163/7583/7060 +f 7164/7581/7061 6361/7584/7061 7165/7585/7061 7844/7582/7061 +f 7844/7582/7062 7165/7585/7062 6113/7586/7062 7159/7587/7062 +f 7163/7583/7063 7844/7582/7063 7159/7587/7063 6340/7588/7063 +f 6340/7579/7064 7162/7578/7064 7845/7589/7064 7166/7590/7064 +f 7162/7578/7065 6388/7577/7065 7167/7591/7065 7845/7589/7065 +f 7845/7589/7066 7167/7591/7066 6386/7592/7066 7168/7593/7066 +f 7166/7590/7067 7845/7589/7067 7168/7593/7067 6114/7594/7067 +f 6387/7595/7068 7170/7596/7068 7846/7597/7068 7169/7598/7068 +f 7170/7596/7069 6389/7580/7069 7163/7583/7069 7846/7597/7069 +f 7846/7597/7070 7163/7583/7070 6340/7588/7070 7166/7599/7070 +f 7169/7598/7071 7846/7597/7071 7166/7599/7071 6114/7600/7071 +f 6114/7594/7072 7168/7593/7072 7847/7601/7072 7171/7602/7072 +f 7168/7593/7073 6386/7592/7073 7172/7603/7073 7847/7601/7073 +f 7847/7601/7074 7172/7603/7074 6384/7604/7074 7173/7605/7074 +f 7171/7602/7075 7847/7601/7075 7173/7605/7075 6341/7606/7075 +f 6385/7607/7076 7175/7608/7076 7848/7609/7076 7174/7610/7076 +f 7175/7608/7077 6387/7595/7077 7169/7598/7077 7848/7609/7077 +f 7848/7609/7078 7169/7598/7078 6114/7600/7078 7171/7611/7078 +f 7174/7610/7079 7848/7609/7079 7171/7611/7079 6341/7612/7079 +f 6341/7606/7080 7173/7605/7080 7849/7613/7080 7176/7614/7080 +f 7173/7605/7081 6384/7604/7081 7177/7615/7081 7849/7613/7081 +f 7849/7613/7082 7177/7615/7082 6364/7459/7082 7105/7458/7082 +f 7176/7614/7083 7849/7613/7083 7105/7458/7083 6345/7457/7083 +f 6365/7462/7084 7178/7616/7084 7850/7617/7084 7108/7463/7084 +f 7178/7616/7085 6385/7607/7085 7174/7610/7085 7850/7617/7085 +f 7850/7617/7086 7174/7610/7086 6341/7612/7086 7176/7618/7086 +f 7108/7463/7087 7850/7617/7087 7176/7618/7087 6345/7466/7087 +f 6362/7531/7088 7139/7534/7088 7851/7619/7088 7151/7556/7088 +f 7139/7534/7089 6364/7459/7089 7177/7615/7089 7851/7619/7089 +f 7851/7619/7090 7177/7615/7090 6384/7604/7090 7179/7620/7090 +f 7151/7556/7091 7851/7619/7091 7179/7620/7091 6378/7545/7091 +f 6385/7607/7092 7178/7616/7092 7852/7621/7092 7180/7622/7092 +f 7178/7616/7093 6365/7462/7093 7142/7538/7093 7852/7621/7093 +f 7852/7621/7094 7142/7538/7094 6363/7537/7094 7152/7557/7094 +f 7180/7622/7095 7852/7621/7095 7152/7557/7095 6379/7553/7095 +f 6332/7431/7096 7096/7440/7096 7853/7623/7096 7181/7624/7096 +f 7096/7440/7097 6334/7439/7097 7182/7625/7097 7853/7623/7097 +f 7853/7623/7098 7182/7625/7098 6354/7626/7098 7183/7627/7098 +f 7181/7624/7099 7853/7623/7099 7183/7627/7099 6346/7628/7099 +f 6355/7629/7100 7185/7630/7100 7854/7631/7100 7184/7632/7100 +f 7185/7630/7101 6335/7441/7101 7097/7444/7101 7854/7631/7101 +f 7854/7631/7102 7097/7444/7102 6333/7433/7102 7186/7633/7102 +f 7184/7632/7103 7854/7631/7103 7186/7633/7103 6347/7634/7103 +f 6112/7635/7104 7188/7636/7104 7855/7637/7104 7187/7638/7104 +f 7188/7636/7105 6352/7639/7105 7189/7640/7105 7855/7637/7105 +f 7855/7637/7106 7189/7640/7106 6360/7575/7106 7160/7572/7106 +f 7187/7638/7107 7855/7637/7107 7160/7572/7107 6113/7571/7107 +f 6361/7584/7108 7190/7641/7108 7856/7642/7108 7165/7585/7108 +f 7190/7641/7109 6353/7643/7109 7191/7644/7109 7856/7642/7109 +f 7856/7642/7110 7191/7644/7110 6112/7645/7110 7187/7646/7110 +f 7165/7585/7111 7856/7642/7111 7187/7646/7111 6113/7586/7111 +f 6338/7647/7112 7193/7648/7112 7857/7649/7112 7192/7650/7112 +f 7193/7648/7113 6394/7651/7113 7194/7652/7113 7857/7649/7113 +f 7857/7649/7114 7194/7652/7114 6392/7653/7114 7195/7654/7114 +f 7192/7650/7115 7857/7649/7115 7195/7654/7115 6339/7655/7115 +f 6393/7656/7116 7197/7657/7116 7858/7658/7116 7196/7659/7116 +f 7197/7657/7117 6395/7660/7117 7198/7661/7117 7858/7658/7117 +f 7858/7658/7118 7198/7661/7118 6338/7662/7118 7192/7663/7118 +f 7196/7659/7119 7858/7658/7119 7192/7663/7119 6339/7664/7119 +f 6339/7655/7120 7195/7654/7120 7859/7665/7120 7199/7666/7120 +f 7195/7654/7121 6392/7653/7121 7200/7667/7121 7859/7665/7121 +f 7859/7665/7122 7200/7667/7122 6390/7668/7122 7201/7669/7122 +f 7199/7666/7123 7859/7665/7123 7201/7669/7123 6111/7670/7123 +f 6391/7671/7124 7203/7672/7124 7860/7673/7124 7202/7674/7124 +f 7203/7672/7125 6393/7656/7125 7196/7659/7125 7860/7673/7125 +f 7860/7673/7126 7196/7659/7126 6339/7664/7126 7199/7675/7126 +f 7202/7674/7127 7860/7673/7127 7199/7675/7127 6111/7676/7127 +f 6111/7670/7128 7201/7669/7128 7861/7677/7128 7204/7678/7128 +f 7201/7669/7129 6390/7668/7129 7205/7679/7129 7861/7677/7129 +f 7861/7677/7130 7205/7679/7130 6352/7639/7130 7188/7636/7130 +f 7204/7678/7131 7861/7677/7131 7188/7636/7131 6112/7635/7131 +f 6353/7643/7132 7206/7680/7132 7862/7681/7132 7191/7644/7132 +f 7206/7680/7133 6391/7671/7133 7202/7674/7133 7862/7681/7133 +f 7862/7681/7134 7202/7674/7134 6111/7676/7134 7204/7682/7134 +f 7191/7644/7135 7862/7681/7135 7204/7682/7135 6112/7645/7135 +f 6328/7683/7136 7088/7684/7136 7863/7685/7136 7207/7686/7136 +f 7088/7684/7137 6330/7423/7137 7208/7687/7137 7863/7685/7137 +f 7863/7685/7138 7208/7687/7138 6398/7688/7138 7209/7689/7138 +f 7207/7686/7139 7863/7685/7139 7209/7689/7139 6400/7690/7139 +f 6399/7691/7140 7211/7692/7140 7864/7693/7140 7210/7694/7140 +f 7211/7692/7141 6331/7425/7141 7089/7695/7141 7864/7693/7141 +f 7864/7693/7142 7089/7695/7142 6329/7696/7142 7212/7697/7142 +f 7210/7694/7143 7864/7693/7143 7212/7697/7143 6401/7698/7143 +f 6400/7690/7144 7209/7689/7144 7865/7699/7144 7213/7700/7144 +f 7209/7689/7145 6398/7688/7145 7214/7701/7145 7865/7699/7145 +f 7865/7699/7146 7214/7701/7146 6404/7702/7146 7215/7703/7146 +f 7213/7700/7147 7865/7699/7147 7215/7703/7147 6402/7704/7147 +f 6405/7705/7148 7217/7706/7148 7866/7707/7148 7216/7708/7148 +f 7217/7706/7149 6399/7691/7149 7210/7694/7149 7866/7707/7149 +f 7866/7707/7150 7210/7694/7150 6401/7698/7150 7218/7709/7150 +f 7216/7708/7151 7866/7707/7151 7218/7709/7151 6403/7710/7151 +f 6402/7704/7152 7215/7703/7152 7867/7711/7152 7219/7712/7152 +f 7215/7703/7153 6404/7702/7153 7220/7713/7153 7867/7711/7153 +f 7867/7711/7154 7220/7713/7154 6406/7714/7154 7221/7715/7154 +f 7219/7712/7155 7867/7711/7155 7221/7715/7155 6408/7716/7155 +f 6407/7717/7156 7223/7718/7156 7868/7719/7156 7222/7720/7156 +f 7223/7718/7157 6405/7705/7157 7216/7708/7157 7868/7719/7157 +f 7868/7719/7158 7216/7708/7158 6403/7710/7158 7224/7721/7158 +f 7222/7720/7159 7868/7719/7159 7224/7721/7159 6409/7722/7159 +f 6408/7716/7160 7221/7715/7160 7869/7723/7160 7225/7724/7160 +f 7221/7715/7161 6406/7714/7161 7226/7725/7161 7869/7723/7161 +f 7869/7723/7162 7226/7725/7162 6412/7726/7162 7227/7727/7162 +f 7225/7724/7163 7869/7723/7163 7227/7727/7163 6410/7728/7163 +f 6413/7729/7164 7229/7730/7164 7870/7731/7164 7228/7732/7164 +f 7229/7730/7165 6407/7717/7165 7222/7720/7165 7870/7731/7165 +f 7870/7731/7166 7222/7720/7166 6409/7722/7166 7230/7733/7166 +f 7228/7732/7167 7870/7731/7167 7230/7733/7167 6411/7734/7167 +f 6350/7735/7168 7232/7736/7168 7871/7737/7168 7231/7738/7168 +f 7232/7736/7169 6414/7739/7169 7233/7740/7169 7871/7737/7169 +f 7871/7737/7170 7233/7740/7170 6410/7728/7170 7227/7727/7170 +f 7231/7738/7171 7871/7737/7171 7227/7727/7171 6412/7726/7171 +f 6411/7734/7172 7234/7741/7172 7872/7742/7172 7228/7732/7172 +f 7234/7741/7173 6415/7743/7173 7235/7744/7173 7872/7742/7173 +f 7872/7742/7174 7235/7744/7174 6351/7745/7174 7236/7746/7174 +f 7228/7732/7175 7872/7742/7175 7236/7746/7175 6413/7729/7175 +f 6352/7639/7176 7205/7679/7176 7873/7747/7176 7237/7748/7176 +f 7205/7679/7177 6390/7668/7177 7238/7749/7177 7873/7747/7177 +f 7873/7747/7178 7238/7749/7178 6410/7728/7178 7233/7740/7178 +f 7237/7748/7179 7873/7747/7179 7233/7740/7179 6414/7739/7179 +f 6411/7734/7180 7239/7750/7180 7874/7751/7180 7234/7741/7180 +f 7239/7750/7181 6391/7671/7181 7206/7680/7181 7874/7751/7181 +f 7874/7751/7182 7206/7680/7182 6353/7643/7182 7240/7752/7182 +f 7234/7741/7183 7874/7751/7183 7240/7752/7183 6415/7743/7183 +f 6390/7668/7184 7200/7667/7184 7875/7753/7184 7238/7749/7184 +f 7200/7667/7185 6392/7653/7185 7241/7754/7185 7875/7753/7185 +f 7875/7753/7186 7241/7754/7186 6408/7716/7186 7225/7724/7186 +f 7238/7749/7187 7875/7753/7187 7225/7724/7187 6410/7728/7187 +f 6409/7722/7188 7242/7755/7188 7876/7756/7188 7230/7733/7188 +f 7242/7755/7189 6393/7656/7189 7203/7672/7189 7876/7756/7189 +f 7876/7756/7190 7203/7672/7190 6391/7671/7190 7239/7750/7190 +f 7230/7733/7191 7876/7756/7191 7239/7750/7191 6411/7734/7191 +f 6392/7653/7192 7194/7652/7192 7877/7757/7192 7241/7754/7192 +f 7194/7652/7193 6394/7651/7193 7243/7758/7193 7877/7757/7193 +f 7877/7757/7194 7243/7758/7194 6402/7704/7194 7219/7712/7194 +f 7241/7754/7195 7877/7757/7195 7219/7712/7195 6408/7716/7195 +f 6403/7710/7196 7244/7759/7196 7878/7760/7196 7224/7721/7196 +f 7244/7759/7197 6395/7660/7197 7197/7657/7197 7878/7760/7197 +f 7878/7760/7198 7197/7657/7198 6393/7656/7198 7242/7755/7198 +f 7224/7721/7199 7878/7760/7199 7242/7755/7199 6409/7722/7199 +f 6394/7651/7200 7245/7761/7200 7879/7762/7200 7243/7758/7200 +f 7245/7761/7201 6396/7763/7201 7246/7764/7201 7879/7762/7201 +f 7879/7762/7202 7246/7764/7202 6400/7690/7202 7213/7700/7202 +f 7243/7758/7203 7879/7762/7203 7213/7700/7203 6402/7704/7203 +f 6401/7698/7204 7247/7765/7204 7880/7766/7204 7218/7709/7204 +f 7247/7765/7205 6397/7767/7205 7248/7768/7205 7880/7766/7205 +f 7880/7766/7206 7248/7768/7206 6395/7660/7206 7244/7759/7206 +f 7218/7709/7207 7880/7766/7207 7244/7759/7207 6403/7710/7207 +f 6326/7769/7208 7084/7770/7208 7881/7771/7208 7249/7772/7208 +f 7084/7770/7209 6328/7683/7209 7207/7686/7209 7881/7771/7209 +f 7881/7771/7210 7207/7686/7210 6400/7690/7210 7246/7764/7210 +f 7249/7772/7211 7881/7771/7211 7246/7764/7211 6396/7763/7211 +f 6401/7698/7212 7212/7697/7212 7882/7773/7212 7247/7765/7212 +f 7212/7697/7213 6329/7696/7213 7085/7774/7213 7882/7773/7213 +f 7882/7773/7214 7085/7774/7214 6327/7775/7214 7250/7776/7214 +f 7247/7765/7215 7882/7773/7215 7250/7776/7215 6397/7767/7215 +f 6110/7777/7216 7252/7778/7216 7883/7779/7216 7251/7780/7216 +f 7252/7778/7217 6396/7763/7217 7245/7761/7217 7883/7779/7217 +f 7883/7779/7218 7245/7761/7218 6394/7651/7218 7193/7648/7218 +f 7251/7780/7219 7883/7779/7219 7193/7648/7219 6338/7647/7219 +f 6395/7660/7220 7248/7768/7220 7884/7781/7220 7198/7661/7220 +f 7248/7768/7221 6397/7767/7221 7253/7782/7221 7884/7781/7221 +f 7884/7781/7222 7253/7782/7222 6110/7783/7222 7251/7784/7222 +f 7198/7661/7223 7884/7781/7223 7251/7784/7223 6338/7662/7223 +f 6320/7785/7224 7072/7786/7224 7885/7787/7224 7254/7788/7224 +f 7072/7786/7225 6322/7789/7225 7076/7790/7225 7885/7787/7225 +f 7885/7787/7226 7076/7790/7226 6324/7791/7226 7080/7792/7226 +f 7254/7788/7227 7885/7787/7227 7080/7792/7227 6326/7769/7227 +f 6325/7793/7228 7077/7794/7228 7886/7795/7228 7081/7796/7228 +f 7077/7794/7229 6323/7797/7229 7073/7798/7229 7886/7795/7229 +f 7886/7795/7230 7073/7798/7230 6321/7799/7230 7255/7800/7230 +f 7081/7796/7231 7886/7795/7231 7255/7800/7231 6327/7775/7231 +f 6320/7785/7232 7254/7788/7232 7887/7801/7232 7256/7802/7232 +f 7254/7788/7233 6326/7769/7233 7249/7772/7233 7887/7801/7233 +f 7887/7801/7234 7249/7772/7234 6396/7763/7234 7252/7778/7234 +f 7256/7802/7235 7887/7801/7235 7252/7778/7235 6110/7777/7235 +f 6397/7767/7236 7250/7776/7236 7888/7803/7236 7253/7782/7236 +f 7250/7776/7237 6327/7775/7237 7255/7800/7237 7888/7803/7237 +f 7888/7803/7238 7255/7800/7238 6321/7799/7238 7257/7804/7238 +f 7253/7782/7239 7888/7803/7239 7257/7804/7239 6110/7783/7239 +f 6109/7805/7240 7068/7806/7240 7889/7807/7240 7258/7808/7240 +f 6320/7785/7241 7256/7802/7241 7889/7807/7241 7068/7806/7241 +f 6110/7777/7242 7258/7808/7242 7889/7807/7242 7256/7802/7242 +f 6110/7783/7243 7257/7804/7243 7890/7809/7243 7258/7810/7243 +f 6321/7799/7244 7069/7811/7244 7890/7809/7244 7257/7804/7244 +f 6109/7812/7245 7258/7810/7245 7890/7809/7245 7069/7811/7245 +f 6330/7423/7246 7092/7432/7246 7891/7813/7246 7208/7687/7246 +f 7092/7432/7247 6332/7431/7247 7181/7624/7247 7891/7813/7247 +f 7891/7813/7248 7181/7624/7248 6346/7628/7248 7259/7814/7248 +f 7208/7687/7249 7891/7813/7249 7259/7814/7249 6398/7688/7249 +f 6347/7634/7250 7186/7633/7250 7892/7815/7250 7260/7816/7250 +f 7186/7633/7251 6333/7433/7251 7093/7436/7251 7892/7815/7251 +f 7892/7815/7252 7093/7436/7252 6331/7425/7252 7211/7692/7252 +f 7260/7816/7253 7892/7815/7253 7211/7692/7253 6399/7691/7253 +f 6346/7628/7254 7261/7817/7254 7893/7818/7254 7259/7814/7254 +f 7261/7817/7255 6348/7819/7255 7262/7820/7255 7893/7818/7255 +f 7893/7818/7256 7262/7820/7256 6404/7702/7256 7214/7701/7256 +f 7259/7814/7257 7893/7818/7257 7214/7701/7257 6398/7688/7257 +f 6405/7705/7258 7263/7821/7258 7894/7822/7258 7217/7706/7258 +f 7263/7821/7259 6349/7823/7259 7264/7824/7259 7894/7822/7259 +f 7894/7822/7260 7264/7824/7260 6347/7634/7260 7260/7816/7260 +f 7217/7706/7261 7894/7822/7261 7260/7816/7261 6399/7691/7261 +f 6348/7819/7262 7265/7825/7262 7895/7826/7262 7262/7820/7262 +f 7265/7825/7263 6418/7827/7263 7266/7828/7263 7895/7826/7263 +f 7895/7826/7264 7266/7828/7264 6406/7714/7264 7220/7713/7264 +f 7262/7820/7265 7895/7826/7265 7220/7713/7265 6404/7702/7265 +f 6407/7717/7266 7267/7829/7266 7896/7830/7266 7223/7718/7266 +f 7267/7829/7267 6419/7831/7267 7268/7832/7267 7896/7830/7267 +f 7896/7830/7268 7268/7832/7268 6349/7823/7268 7263/7821/7268 +f 7223/7718/7269 7896/7830/7269 7263/7821/7269 6405/7705/7269 +f 6350/7735/7270 7231/7738/7270 7897/7833/7270 7269/7834/7270 +f 7231/7738/7271 6412/7726/7271 7226/7725/7271 7897/7833/7271 +f 7897/7833/7272 7226/7725/7272 6406/7714/7272 7266/7828/7272 +f 7269/7834/7273 7897/7833/7273 7266/7828/7273 6418/7827/7273 +f 6407/7717/7274 7229/7730/7274 7898/7835/7274 7267/7829/7274 +f 7229/7730/7275 6413/7729/7275 7236/7746/7275 7898/7835/7275 +f 7898/7835/7276 7236/7746/7276 6351/7745/7276 7270/7836/7276 +f 7267/7829/7277 7898/7835/7277 7270/7836/7277 6419/7831/7277 +f 6384/7604/7278 7172/7603/7278 7899/7837/7278 7271/7838/7278 +f 7172/7603/7279 6386/7592/7279 7272/7839/7279 7899/7837/7279 +f 7899/7837/7280 7272/7839/7280 6422/7840/7280 7273/7841/7280 +f 7271/7838/7281 7899/7837/7281 7273/7841/7281 6420/7842/7281 +f 6423/7843/7282 7275/7844/7282 7900/7845/7282 7274/7846/7282 +f 7275/7844/7283 6387/7595/7283 7175/7608/7283 7900/7845/7283 +f 7900/7845/7284 7175/7608/7284 6385/7607/7284 7276/7847/7284 +f 7274/7846/7285 7900/7845/7285 7276/7847/7285 6421/7848/7285 +f 6354/7626/7286 7278/7849/7286 7901/7850/7286 7277/7851/7286 +f 7278/7849/7287 6420/7842/7287 7273/7841/7287 7901/7850/7287 +f 7901/7850/7288 7273/7841/7288 6422/7840/7288 7279/7852/7288 +f 7277/7851/7289 7901/7850/7289 7279/7852/7289 6356/7853/7289 +f 6423/7843/7290 7274/7846/7290 7902/7854/7290 7280/7855/7290 +f 7274/7846/7291 6421/7848/7291 7281/7856/7291 7902/7854/7291 +f 7902/7854/7292 7281/7856/7292 6355/7629/7292 7282/7857/7292 +f 7280/7855/7293 7902/7854/7293 7282/7857/7293 6357/7858/7293 +f 6334/7439/7294 7100/7448/7294 7903/7859/7294 7182/7625/7294 +f 7100/7448/7295 6336/7447/7295 7283/7860/7295 7903/7859/7295 +f 7903/7859/7296 7283/7860/7296 6420/7842/7296 7278/7849/7296 +f 7182/7625/7297 7903/7859/7297 7278/7849/7297 6354/7626/7297 +f 6421/7848/7298 7284/7861/7298 7904/7862/7298 7281/7856/7298 +f 7284/7861/7299 6337/7449/7299 7101/7452/7299 7904/7862/7299 +f 7904/7862/7300 7101/7452/7300 6335/7441/7300 7185/7630/7300 +f 7281/7856/7301 7904/7862/7301 7185/7630/7301 6355/7629/7301 +f 6336/7447/7302 7285/7863/7302 7905/7864/7302 7283/7860/7302 +f 7285/7863/7303 6380/7547/7303 7146/7546/7303 7905/7864/7303 +f 7905/7864/7304 7146/7546/7304 6378/7545/7304 7286/7865/7304 +f 7283/7860/7305 7905/7864/7305 7286/7865/7305 6420/7842/7305 +f 6379/7553/7306 7149/7550/7306 7906/7866/7306 7287/7867/7306 +f 7149/7550/7307 6381/7549/7307 7288/7868/7307 7906/7866/7307 +f 7906/7866/7308 7288/7868/7308 6337/7449/7308 7284/7861/7308 +f 7287/7867/7309 7906/7866/7309 7284/7861/7309 6421/7848/7309 +f 6378/7545/7310 7179/7620/7310 7907/7869/7310 7286/7865/7310 +f 6384/7604/7311 7271/7838/7311 7907/7869/7311 7179/7620/7311 +f 6420/7842/7312 7286/7865/7312 7907/7869/7312 7271/7838/7312 +f 6421/7848/7313 7276/7847/7313 7908/7870/7313 7287/7867/7313 +f 6385/7607/7314 7180/7622/7314 7908/7870/7314 7276/7847/7314 +f 6379/7553/7315 7287/7867/7315 7908/7870/7315 7180/7622/7315 +f 6336/7447/7316 7157/7568/7316 7909/7871/7316 7285/7863/7316 +f 6382/7562/7317 7154/7561/7317 7909/7871/7317 7157/7568/7317 +f 6380/7547/7318 7285/7863/7318 7909/7871/7318 7154/7561/7318 +f 6381/7549/7319 7155/7564/7319 7910/7872/7319 7288/7868/7319 +f 6383/7566/7320 7158/7569/7320 7910/7872/7320 7155/7564/7320 +f 6337/7449/7321 7288/7868/7321 7910/7872/7321 7158/7569/7321 +f 6350/7735/7322 7289/7873/7322 7911/7874/7322 7232/7736/7322 +f 7289/7873/7323 6358/7875/7323 7290/7876/7323 7911/7874/7323 +f 7911/7874/7324 7290/7876/7324 6416/7877/7324 7291/7878/7324 +f 7232/7736/7325 7911/7874/7325 7291/7878/7325 6414/7739/7325 +f 6417/7879/7326 7293/7880/7326 7912/7881/7326 7292/7882/7326 +f 7293/7880/7327 6359/7883/7327 7294/7884/7327 7912/7881/7327 +f 7912/7881/7328 7294/7884/7328 6351/7745/7328 7235/7744/7328 +f 7292/7882/7329 7912/7881/7329 7235/7744/7329 6415/7743/7329 +f 6352/7639/7330 7237/7748/7330 7913/7885/7330 7189/7640/7330 +f 7237/7748/7331 6414/7739/7331 7291/7878/7331 7913/7885/7331 +f 7913/7885/7332 7291/7878/7332 6416/7877/7332 7295/7886/7332 +f 7189/7640/7333 7913/7885/7333 7295/7886/7333 6360/7575/7333 +f 6417/7879/7334 7292/7882/7334 7914/7887/7334 7296/7888/7334 +f 7292/7882/7335 6415/7743/7335 7240/7752/7335 7914/7887/7335 +f 7914/7887/7336 7240/7752/7336 6353/7643/7336 7190/7641/7336 +f 7296/7888/7337 7914/7887/7337 7190/7641/7337 6361/7584/7337 +f 6356/7853/7338 7279/7852/7338 7915/7889/7338 7297/7890/7338 +f 7279/7852/7339 6422/7840/7339 7298/7891/7339 7915/7889/7339 +f 7915/7889/7340 7298/7891/7340 6416/7877/7340 7290/7876/7340 +f 7297/7890/7341 7915/7889/7341 7290/7876/7341 6358/7875/7341 +f 6417/7879/7342 7299/7892/7342 7916/7893/7342 7293/7880/7342 +f 7299/7892/7343 6423/7843/7343 7280/7855/7343 7916/7893/7343 +f 7916/7893/7344 7280/7855/7344 6357/7858/7344 7300/7894/7344 +f 7293/7880/7345 7916/7893/7345 7300/7894/7345 6359/7883/7345 +f 6386/7592/7346 7167/7591/7346 7917/7895/7346 7272/7839/7346 +f 7167/7591/7347 6388/7577/7347 7301/7896/7347 7917/7895/7347 +f 7917/7895/7348 7301/7896/7348 6416/7877/7348 7298/7891/7348 +f 7272/7839/7349 7917/7895/7349 7298/7891/7349 6422/7840/7349 +f 6417/7879/7350 7302/7897/7350 7918/7898/7350 7299/7892/7350 +f 7302/7897/7351 6389/7580/7351 7170/7596/7351 7918/7898/7351 +f 7918/7898/7352 7170/7596/7352 6387/7595/7352 7275/7844/7352 +f 7299/7892/7353 7918/7898/7353 7275/7844/7353 6423/7843/7353 +f 6360/7575/7354 7295/7886/7354 7919/7899/7354 7161/7576/7354 +f 6416/7877/7355 7301/7896/7355 7919/7899/7355 7295/7886/7355 +f 6388/7577/7356 7161/7576/7356 7919/7899/7356 7301/7896/7356 +f 6389/7580/7357 7302/7897/7357 7920/7900/7357 7164/7581/7357 +f 6417/7879/7358 7296/7888/7358 7920/7900/7358 7302/7897/7358 +f 6361/7584/7359 7164/7581/7359 7920/7900/7359 7296/7888/7359 +f 6436/7901/7360 7304/7902/7360 7921/7903/7360 7303/7904/7360 +f 7304/7902/7361 6424/7905/7361 7305/7906/7361 7921/7903/7361 +f 7921/7903/7362 7305/7906/7362 6450/7907/7362 7306/7908/7362 +f 7303/7904/7363 7921/7903/7363 7306/7908/7363 6438/7909/7363 +f 6451/7910/7364 7308/7911/7364 7922/7912/7364 7307/7913/7364 +f 7308/7911/7365 6425/7914/7365 7309/7915/7365 7922/7912/7365 +f 7922/7912/7366 7309/7915/7366 6437/7916/7366 7310/7917/7366 +f 7307/7913/7367 7922/7912/7367 7310/7917/7367 6439/7918/7367 +f 6436/7901/7368 7303/7904/7368 7923/7919/7368 7311/7920/7368 +f 7303/7904/7369 6438/7909/7369 7312/7921/7369 7923/7919/7369 +f 7923/7919/7370 7312/7921/7370 6440/7922/7370 7313/7923/7370 +f 7311/7920/7371 7923/7919/7371 7313/7923/7371 6434/7924/7371 +f 6441/7925/7372 7315/7926/7372 7924/7927/7372 7314/7928/7372 +f 7315/7926/7373 6439/7918/7373 7310/7917/7373 7924/7927/7373 +f 7924/7927/7374 7310/7917/7374 6437/7916/7374 7316/7929/7374 +f 7314/7928/7375 7924/7927/7375 7316/7929/7375 6435/7930/7375 +f 6434/7924/7376 7313/7923/7376 7925/7931/7376 7317/7932/7376 +f 7313/7923/7377 6440/7922/7377 7318/7933/7377 7925/7931/7377 +f 7925/7931/7378 7318/7933/7378 6442/7934/7378 7319/7935/7378 +f 7317/7932/7379 7925/7931/7379 7319/7935/7379 6432/7936/7379 +f 6443/7937/7380 7321/7938/7380 7926/7939/7380 7320/7940/7380 +f 7321/7938/7381 6441/7925/7381 7314/7928/7381 7926/7939/7381 +f 7926/7939/7382 7314/7928/7382 6435/7930/7382 7322/7941/7382 +f 7320/7940/7383 7926/7939/7383 7322/7941/7383 6433/7942/7383 +f 6432/7936/7384 7319/7935/7384 7927/7943/7384 7323/7944/7384 +f 7319/7935/7385 6442/7934/7385 7324/7945/7385 7927/7943/7385 +f 7927/7943/7386 7324/7945/7386 6444/7946/7386 7325/7947/7386 +f 7323/7944/7387 7927/7943/7387 7325/7947/7387 6430/7948/7387 +f 6445/7949/7388 7327/7950/7388 7928/7951/7388 7326/7952/7388 +f 7327/7950/7389 6443/7937/7389 7320/7940/7389 7928/7951/7389 +f 7928/7951/7390 7320/7940/7390 6433/7942/7390 7328/7953/7390 +f 7326/7952/7391 7928/7951/7391 7328/7953/7391 6431/7954/7391 +f 6430/7948/7392 7325/7947/7392 7929/7955/7392 7329/7956/7392 +f 7325/7947/7393 6444/7946/7393 7330/7957/7393 7929/7955/7393 +f 7929/7955/7394 7330/7957/7394 6446/7958/7394 7331/7959/7394 +f 7329/7956/7395 7929/7955/7395 7331/7959/7395 6428/7960/7395 +f 6447/7961/7396 7333/7962/7396 7930/7963/7396 7332/7964/7396 +f 7333/7962/7397 6445/7949/7397 7326/7952/7397 7930/7963/7397 +f 7930/7963/7398 7326/7952/7398 6431/7954/7398 7334/7965/7398 +f 7332/7964/7399 7930/7963/7399 7334/7965/7399 6429/7966/7399 +f 6428/7960/7400 7331/7959/7400 7931/7967/7400 7335/7968/7400 +f 7331/7959/7401 6446/7958/7401 7336/7969/7401 7931/7967/7401 +f 7931/7967/7402 7336/7969/7402 6448/7970/7402 7337/7971/7402 +f 7335/7968/7403 7931/7967/7403 7337/7971/7403 6426/7972/7403 +f 6449/7973/7404 7339/7974/7404 7932/7975/7404 7338/7976/7404 +f 7339/7974/7405 6447/7961/7405 7332/7964/7405 7932/7975/7405 +f 7932/7975/7406 7332/7964/7406 6429/7966/7406 7340/7977/7406 +f 7338/7976/7407 7932/7975/7407 7340/7977/7407 6427/7978/7407 +f 6446/7958/7408 7341/7979/7408 7933/7980/7408 7336/7969/7408 +f 7341/7979/7409 6456/7981/7409 7342/7982/7409 7933/7980/7409 +f 7933/7980/7410 7342/7982/7410 6454/7983/7410 7343/7984/7410 +f 7336/7969/7411 7933/7980/7411 7343/7984/7411 6448/7970/7411 +f 6455/7985/7412 7345/7986/7412 7934/7987/7412 7344/7988/7412 +f 7345/7986/7413 6457/7989/7413 7346/7990/7413 7934/7987/7413 +f 7934/7987/7414 7346/7990/7414 6447/7961/7414 7339/7974/7414 +f 7344/7988/7415 7934/7987/7415 7339/7974/7415 6449/7973/7415 +f 6444/7946/7416 7347/7991/7416 7935/7992/7416 7330/7957/7416 +f 7347/7991/7417 6458/7993/7417 7348/7994/7417 7935/7992/7417 +f 7935/7992/7418 7348/7994/7418 6456/7981/7418 7341/7979/7418 +f 7330/7957/7419 7935/7992/7419 7341/7979/7419 6446/7958/7419 +f 6457/7989/7420 7349/7995/7420 7936/7996/7420 7346/7990/7420 +f 7349/7995/7421 6459/7997/7421 7350/7998/7421 7936/7996/7421 +f 7936/7996/7422 7350/7998/7422 6445/7949/7422 7333/7962/7422 +f 7346/7990/7423 7936/7996/7423 7333/7962/7423 6447/7961/7423 +f 6442/7934/7424 7351/7999/7424 7937/8000/7424 7324/7945/7424 +f 7351/7999/7425 6460/8001/7425 7352/8002/7425 7937/8000/7425 +f 7937/8000/7426 7352/8002/7426 6458/7993/7426 7347/7991/7426 +f 7324/7945/7427 7937/8000/7427 7347/7991/7427 6444/7946/7427 +f 6459/7997/7428 7353/8003/7428 7938/8004/7428 7350/7998/7428 +f 7353/8003/7429 6461/8005/7429 7354/8006/7429 7938/8004/7429 +f 7938/8004/7430 7354/8006/7430 6443/7937/7430 7327/7950/7430 +f 7350/7998/7431 7938/8004/7431 7327/7950/7431 6445/7949/7431 +f 6440/7922/7432 7355/8007/7432 7939/8008/7432 7318/7933/7432 +f 7355/8007/7433 6462/8009/7433 7356/8010/7433 7939/8008/7433 +f 7939/8008/7434 7356/8010/7434 6460/8001/7434 7351/7999/7434 +f 7318/7933/7435 7939/8008/7435 7351/7999/7435 6442/7934/7435 +f 6461/8005/7436 7357/8011/7436 7940/8012/7436 7354/8006/7436 +f 7357/8011/7437 6463/8013/7437 7358/8014/7437 7940/8012/7437 +f 7940/8012/7438 7358/8014/7438 6441/7925/7438 7321/7938/7438 +f 7354/8006/7439 7940/8012/7439 7321/7938/7439 6443/7937/7439 +f 6438/7909/7440 7359/8015/7440 7941/8016/7440 7312/7921/7440 +f 7359/8015/7441 6464/8017/7441 7360/8018/7441 7941/8016/7441 +f 7941/8016/7442 7360/8018/7442 6462/8009/7442 7355/8007/7442 +f 7312/7921/7443 7941/8016/7443 7355/8007/7443 6440/7922/7443 +f 6463/8013/7444 7361/8019/7444 7942/8020/7444 7358/8014/7444 +f 7361/8019/7445 6465/8021/7445 7362/8022/7445 7942/8020/7445 +f 7942/8020/7446 7362/8022/7446 6439/7918/7446 7315/7926/7446 +f 7358/8014/7447 7942/8020/7447 7315/7926/7447 6441/7925/7447 +f 6438/7909/7448 7306/7908/7448 7943/8023/7448 7359/8015/7448 +f 7306/7908/7449 6450/7907/7449 7363/8024/7449 7943/8023/7449 +f 7943/8023/7450 7363/8024/7450 6452/8025/7450 7364/8026/7450 +f 7359/8015/7451 7943/8023/7451 7364/8026/7451 6464/8017/7451 +f 6453/8027/7452 7366/8028/7452 7944/8029/7452 7365/8030/7452 +f 7366/8028/7453 6451/7910/7453 7307/7913/7453 7944/8029/7453 +f 7944/8029/7454 7307/7913/7454 6439/7918/7454 7362/8022/7454 +f 7365/8030/7455 7944/8029/7455 7362/8022/7455 6465/8021/7455 +f 6354/7626/7456 7277/7851/7456 7945/8031/7456 7367/8032/7456 +f 7277/7851/7457 6356/7853/7457 7368/8033/7457 7945/8031/7457 +f 7945/8031/7458 7368/8033/7458 6480/8034/7458 7369/8035/7458 +f 7367/8032/7459 7945/8031/7459 7369/8035/7459 6478/8036/7459 +f 6481/8037/7460 7371/8038/7460 7946/8039/7460 7370/8040/7460 +f 7371/8038/7461 6357/7858/7461 7282/7857/7461 7946/8039/7461 +f 7946/8039/7462 7282/7857/7462 6355/7629/7462 7372/8041/7462 +f 7370/8040/7463 7946/8039/7463 7372/8041/7463 6479/8042/7463 +f 6356/8043/7464 7373/8044/7464 7947/8045/7464 7368/8046/7464 +f 7373/8044/7465 6426/7972/7465 7337/7971/7465 7947/8045/7465 +f 7947/8045/7466 7337/7971/7466 6448/7970/7466 7374/8047/7466 +f 7368/8046/7467 7947/8045/7467 7374/8047/7467 6480/8048/7467 +f 6449/7973/7468 7338/7976/7468 7948/8049/7468 7375/8050/7468 +f 7338/7976/7465 6427/7978/7465 7376/8051/7465 7948/8049/7465 +f 7948/8049/7469 7376/8051/7469 6357/8052/7469 7371/8053/7469 +f 7375/8050/7470 7948/8049/7470 7371/8053/7470 6481/8054/7470 +f 6346/7628/7471 7183/7627/7471 7949/8055/7471 7261/7817/7471 +f 7183/7627/7472 6354/7626/7472 7367/8032/7472 7949/8055/7472 +f 7949/8055/7473 7367/8032/7473 6478/8036/7473 7377/8056/7473 +f 7261/7817/7474 7949/8055/7474 7377/8056/7474 6348/7819/7474 +f 6479/8042/7475 7372/8041/7475 7950/8057/7475 7378/8058/7475 +f 7372/8041/7476 6355/7629/7476 7184/7632/7476 7950/8057/7476 +f 7950/8057/7477 7184/7632/7477 6347/7634/7477 7264/7824/7477 +f 7378/8058/7478 7950/8057/7478 7264/7824/7478 6349/7823/7478 +f 6418/8059/7479 7380/8060/7479 7951/8061/7479 7379/8062/7479 +f 7380/8060/7480 6466/8063/7480 7381/8064/7480 7951/8061/7480 +f 7951/8061/7481 7381/8064/7481 6450/7907/7481 7305/7906/7481 +f 7379/8062/7482 7951/8061/7482 7305/7906/7482 6424/7905/7482 +f 6451/7910/7483 7382/8065/7483 7952/8066/7483 7308/7911/7483 +f 7382/8065/7484 6467/8067/7484 7383/8068/7484 7952/8066/7484 +f 7952/8066/7485 7383/8068/7485 6419/8069/7485 7384/8070/7485 +f 7308/7911/7486 7952/8066/7486 7384/8070/7486 6425/7914/7486 +f 6448/7970/7487 7343/7984/7487 7953/8071/7487 7374/8047/7487 +f 7343/7984/7488 6454/7983/7488 7385/8072/7488 7953/8071/7488 +f 7953/8071/7489 7385/8072/7489 6476/8073/7489 7386/8074/7489 +f 7374/8047/7490 7953/8071/7490 7386/8074/7490 6480/8048/7490 +f 6477/8075/7491 7388/8076/7491 7954/8077/7491 7387/8078/7491 +f 7388/8076/7492 6455/7985/7492 7344/7988/7492 7954/8077/7492 +f 7954/8077/7493 7344/7988/7493 6449/7973/7493 7375/8050/7493 +f 7387/8078/7494 7954/8077/7494 7375/8050/7494 6481/8054/7494 +f 6474/8079/7495 7390/8080/7495 7955/8081/7495 7389/8082/7495 +f 7390/8080/7496 6482/8083/7496 7391/8084/7496 7955/8081/7496 +f 7955/8081/7497 7391/8084/7497 6480/8048/7497 7386/8074/7497 +f 7389/8082/7498 7955/8081/7498 7386/8074/7498 6476/8073/7498 +f 6481/8054/7499 7392/8085/7499 7956/8086/7499 7387/8078/7499 +f 7392/8085/7500 6483/8087/7500 7393/8088/7500 7956/8086/7500 +f 7956/8086/7501 7393/8088/7501 6475/8089/7501 7394/8090/7501 +f 7387/8078/7502 7956/8086/7502 7394/8090/7502 6477/8075/7502 +f 6470/8091/7503 7396/8092/7503 7957/8093/7503 7395/8094/7503 +f 7396/8092/7504 6482/8083/7504 7390/8080/7504 7957/8093/7504 +f 7957/8093/7505 7390/8080/7505 6474/8079/7505 7397/8095/7505 +f 7395/8094/7506 7957/8093/7506 7397/8095/7506 6472/8096/7506 +f 6475/8089/7507 7393/8088/7507 7958/8097/7507 7398/8098/7507 +f 7393/8088/7508 6483/8087/7508 7399/8099/7508 7958/8097/7508 +f 7958/8097/7509 7399/8099/7509 6471/8100/7509 7400/8101/7509 +f 7398/8098/7510 7958/8097/7510 7400/8101/7510 6473/8102/7510 +f 6468/8103/7511 7402/8104/7511 7959/8105/7511 7401/8106/7511 +f 7402/8104/7512 6484/8107/7512 7403/8108/7512 7959/8105/7512 +f 7959/8105/7513 7403/8108/7513 6482/8083/7513 7396/8092/7513 +f 7401/8106/7514 7959/8105/7514 7396/8092/7514 6470/8091/7514 +f 6483/8087/7515 7404/8109/7515 7960/8110/7515 7399/8099/7515 +f 7404/8109/7516 6485/8111/7516 7405/8112/7516 7960/8110/7516 +f 7960/8110/7517 7405/8112/7517 6469/8113/7517 7406/8114/7517 +f 7399/8099/7518 7960/8110/7518 7406/8114/7518 6471/8100/7518 +f 6466/8063/7519 7408/8115/7519 7961/8116/7519 7407/8117/7519 +f 7408/8115/7520 6484/8107/7520 7402/8104/7520 7961/8116/7520 +f 7961/8116/7521 7402/8104/7521 6468/8103/7521 7409/8118/7521 +f 7407/8117/7522 7961/8116/7522 7409/8118/7522 6486/8119/7522 +f 6469/8113/7523 7405/8112/7523 7962/8120/7523 7410/8121/7523 +f 7405/8112/7524 6485/8111/7524 7411/8122/7524 7962/8120/7524 +f 7962/8120/7525 7411/8122/7525 6467/8067/7525 7412/8123/7525 +f 7410/8121/7526 7962/8120/7526 7412/8123/7526 6487/8124/7526 +f 6450/7907/7527 7381/8064/7527 7963/8125/7527 7363/8024/7527 +f 7381/8064/7528 6466/8063/7528 7407/8117/7528 7963/8125/7528 +f 7963/8125/7529 7407/8117/7529 6486/8119/7529 7413/8126/7529 +f 7363/8024/7530 7963/8125/7530 7413/8126/7530 6452/8025/7530 +f 6487/8124/7531 7412/8123/7531 7964/8127/7531 7414/8128/7531 +f 7412/8123/7532 6467/8067/7532 7382/8065/7532 7964/8127/7532 +f 7964/8127/7533 7382/8065/7533 6451/7910/7533 7366/8028/7533 +f 7414/8128/7534 7964/8127/7534 7366/8028/7534 6453/8027/7534 +f 6348/7819/7535 7415/8129/7535 7965/8130/7535 7265/7825/7535 +f 7415/8129/7536 6484/8131/7536 7408/8132/7536 7965/8130/7536 +f 7965/8130/7537 7408/8132/7537 6466/8133/7537 7380/8134/7537 +f 7265/7825/7538 7965/8130/7538 7380/8134/7538 6418/7827/7538 +f 6467/8135/7539 7411/8136/7539 7966/8137/7539 7383/8138/7539 +f 7411/8136/7540 6485/8139/7540 7416/8140/7540 7966/8137/7540 +f 7966/8137/7541 7416/8140/7541 6349/7823/7541 7268/7832/7541 +f 7383/8138/7542 7966/8137/7542 7268/7832/7542 6419/7831/7542 +f 6348/7819/7543 7377/8056/7543 7967/8141/7543 7415/8129/7543 +f 7377/8056/7544 6478/8036/7544 7417/8142/7544 7967/8141/7544 +f 7967/8141/7545 7417/8142/7545 6482/8143/7545 7403/8144/7545 +f 7415/8129/7546 7967/8141/7546 7403/8144/7546 6484/8131/7546 +f 6483/8145/7547 7418/8146/7547 7968/8147/7547 7404/8148/7547 +f 7418/8146/7548 6479/8042/7548 7378/8058/7548 7968/8147/7548 +f 7968/8147/7549 7378/8058/7549 6349/7823/7549 7416/8140/7549 +f 7404/8148/7550 7968/8147/7550 7416/8140/7550 6485/8139/7550 +f 6478/8036/7551 7369/8035/7551 7969/8149/7551 7417/8142/7551 +f 6480/8034/7552 7391/8150/7552 7969/8149/7552 7369/8035/7552 +f 6482/8143/7553 7417/8142/7553 7969/8149/7553 7391/8150/7553 +f 6483/8145/7554 7392/8151/7554 7970/8152/7554 7418/8146/7554 +f 6481/8037/7555 7370/8040/7555 7970/8152/7555 7392/8151/7555 +f 6479/8042/7556 7418/8146/7556 7970/8152/7556 7370/8040/7556 +f 6452/8025/7557 7413/8126/7557 7971/8153/7557 7419/8154/7557 +f 7413/8126/7558 6486/8119/7558 7420/8155/7558 7971/8153/7558 +f 7971/8153/7559 7420/8155/7559 6488/8156/7559 7421/8157/7559 +f 7419/8154/7560 7971/8153/7560 7421/8157/7560 6512/8158/7560 +f 6489/8159/7561 7423/8160/7561 7972/8161/7561 7422/8162/7561 +f 7423/8160/7562 6487/8124/7562 7414/8128/7562 7972/8161/7562 +f 7972/8161/7563 7414/8128/7563 6453/8027/7563 7424/8163/7563 +f 7422/8162/7564 7972/8161/7564 7424/8163/7564 6513/8164/7564 +f 6486/8119/7565 7409/8118/7565 7973/8165/7565 7420/8155/7565 +f 7409/8118/7566 6468/8103/7566 7425/8166/7566 7973/8165/7566 +f 7973/8165/7567 7425/8166/7567 6498/8167/7567 7426/8168/7567 +f 7420/8155/7568 7973/8165/7568 7426/8168/7568 6488/8156/7568 +f 6499/8169/7569 7428/8170/7569 7974/8171/7569 7427/8172/7569 +f 7428/8170/7570 6469/8113/7570 7410/8121/7570 7974/8171/7570 +f 7974/8171/7571 7410/8121/7571 6487/8124/7571 7423/8160/7571 +f 7427/8172/7572 7974/8171/7572 7423/8160/7572 6489/8159/7572 +f 6468/8103/7573 7401/8106/7573 7975/8173/7573 7425/8166/7573 +f 7401/8106/7574 6470/8091/7574 7429/8174/7574 7975/8173/7574 +f 7975/8173/7575 7429/8174/7575 6496/8175/7575 7430/8176/7575 +f 7425/8166/7576 7975/8173/7576 7430/8176/7576 6498/8167/7576 +f 6497/8177/7577 7432/8178/7577 7976/8179/7577 7431/8180/7577 +f 7432/8178/7578 6471/8100/7578 7406/8114/7578 7976/8179/7578 +f 7976/8179/7579 7406/8114/7579 6469/8113/7579 7428/8170/7579 +f 7431/8180/7580 7976/8179/7580 7428/8170/7580 6499/8169/7580 +f 6470/8091/7581 7395/8094/7581 7977/8181/7581 7429/8174/7581 +f 7395/8094/7582 6472/8096/7582 7433/8182/7582 7977/8181/7582 +f 7977/8181/7583 7433/8182/7583 6494/8183/7583 7434/8184/7583 +f 7429/8174/7584 7977/8181/7584 7434/8184/7584 6496/8175/7584 +f 6495/8185/7585 7436/8186/7585 7978/8187/7585 7435/8188/7585 +f 7436/8186/7586 6473/8102/7586 7400/8101/7586 7978/8187/7586 +f 7978/8187/7587 7400/8101/7587 6471/8100/7587 7432/8178/7587 +f 7435/8188/7588 7978/8187/7588 7432/8178/7588 6497/8177/7588 +f 6472/8096/7589 7397/8095/7589 7979/8189/7589 7433/8182/7589 +f 7397/8095/7590 6474/8079/7590 7437/8190/7590 7979/8189/7590 +f 7979/8189/7591 7437/8190/7591 6492/8191/7591 7438/8192/7591 +f 7433/8182/7592 7979/8189/7592 7438/8192/7592 6494/8183/7592 +f 6493/8193/7593 7440/8194/7593 7980/8195/7593 7439/8196/7593 +f 7440/8194/7594 6475/8089/7594 7398/8098/7594 7980/8195/7594 +f 7980/8195/7595 7398/8098/7595 6473/8102/7595 7436/8186/7595 +f 7439/8196/7596 7980/8195/7596 7436/8186/7596 6495/8185/7596 +f 6474/8079/7597 7389/8082/7597 7981/8197/7597 7437/8190/7597 +f 7389/8082/7598 6476/8073/7598 7441/8198/7598 7981/8197/7598 +f 7981/8197/7599 7441/8198/7599 6490/8199/7599 7442/8200/7599 +f 7437/8190/7600 7981/8197/7600 7442/8200/7600 6492/8191/7600 +f 6491/8201/7601 7444/8202/7601 7982/8203/7601 7443/8204/7601 +f 7444/8202/7602 6477/8075/7602 7394/8090/7602 7982/8203/7602 +f 7982/8203/7603 7394/8090/7603 6475/8089/7603 7440/8194/7603 +f 7443/8204/7604 7982/8203/7604 7440/8194/7604 6493/8193/7604 +f 6476/8073/7605 7385/8072/7605 7983/8205/7605 7441/8198/7605 +f 7385/8072/7606 6454/7983/7606 7445/8206/7606 7983/8205/7606 +f 7983/8205/7607 7445/8206/7607 6510/8207/7607 7446/8208/7607 +f 7441/8198/7608 7983/8205/7608 7446/8208/7608 6490/8199/7608 +f 6511/8209/7609 7448/8210/7609 7984/8211/7609 7447/8212/7609 +f 7448/8210/7610 6455/7985/7610 7388/8076/7610 7984/8211/7610 +f 7984/8211/7611 7388/8076/7611 6477/8075/7611 7444/8202/7611 +f 7447/8212/7612 7984/8211/7612 7444/8202/7612 6491/8201/7612 +f 6464/8017/7613 7364/8026/7613 7985/8213/7613 7449/8214/7613 +f 7364/8026/7614 6452/8025/7614 7419/8154/7614 7985/8213/7614 +f 7985/8213/7615 7419/8154/7615 6512/8158/7615 7450/8215/7615 +f 7449/8214/7616 7985/8213/7616 7450/8215/7616 6500/8216/7616 +f 6513/8164/7617 7424/8163/7617 7986/8217/7617 7451/8218/7617 +f 7424/8163/7618 6453/8027/7618 7365/8030/7618 7986/8217/7618 +f 7986/8217/7619 7365/8030/7619 6465/8021/7619 7452/8219/7619 +f 7451/8218/7620 7986/8217/7620 7452/8219/7620 6501/8220/7620 +f 6462/8009/7621 7360/8018/7621 7987/8221/7621 7453/8222/7621 +f 7360/8018/7622 6464/8017/7622 7449/8214/7622 7987/8221/7622 +f 7987/8221/7623 7449/8214/7623 6500/8216/7623 7454/8223/7623 +f 7453/8222/7624 7987/8221/7624 7454/8223/7624 6502/8224/7624 +f 6501/8220/7625 7452/8219/7625 7988/8225/7625 7455/8226/7625 +f 7452/8219/7626 6465/8021/7626 7361/8019/7626 7988/8225/7626 +f 7988/8225/7627 7361/8019/7627 6463/8013/7627 7456/8227/7627 +f 7455/8226/7628 7988/8225/7628 7456/8227/7628 6503/8228/7628 +f 6460/8001/7629 7356/8010/7629 7989/8229/7629 7457/8230/7629 +f 7356/8010/7630 6462/8009/7630 7453/8222/7630 7989/8229/7630 +f 7989/8229/7631 7453/8222/7631 6502/8224/7631 7458/8231/7631 +f 7457/8230/7632 7989/8229/7632 7458/8231/7632 6504/8232/7632 +f 6503/8228/7633 7456/8227/7633 7990/8233/7633 7459/8234/7633 +f 7456/8227/7634 6463/8013/7634 7357/8011/7634 7990/8233/7634 +f 7990/8233/7635 7357/8011/7635 6461/8005/7635 7460/8235/7635 +f 7459/8234/7636 7990/8233/7636 7460/8235/7636 6505/8236/7636 +f 6458/7993/7637 7352/8002/7637 7991/8237/7637 7461/8238/7637 +f 7352/8002/7638 6460/8001/7638 7457/8230/7638 7991/8237/7638 +f 7991/8237/7639 7457/8230/7639 6504/8232/7639 7462/8239/7639 +f 7461/8238/7640 7991/8237/7640 7462/8239/7640 6506/8240/7640 +f 6505/8236/7641 7460/8235/7641 7992/8241/7641 7463/8242/7641 +f 7460/8235/7642 6461/8005/7642 7353/8003/7642 7992/8241/7642 +f 7992/8241/7643 7353/8003/7643 6459/7997/7643 7464/8243/7643 +f 7463/8242/7644 7992/8241/7644 7464/8243/7644 6507/8244/7644 +f 6456/7981/7645 7348/7994/7645 7993/8245/7645 7465/8246/7645 +f 7348/7994/7646 6458/7993/7646 7461/8238/7646 7993/8245/7646 +f 7993/8245/7647 7461/8238/7647 6506/8240/7647 7466/8247/7647 +f 7465/8246/7648 7993/8245/7648 7466/8247/7648 6508/8248/7648 +f 6507/8244/7649 7464/8243/7649 7994/8249/7649 7467/8250/7649 +f 7464/8243/7650 6459/7997/7650 7349/7995/7650 7994/8249/7650 +f 7994/8249/7651 7349/7995/7651 6457/7989/7651 7468/8251/7651 +f 7467/8250/7652 7994/8249/7652 7468/8251/7652 6509/8252/7652 +f 6454/7983/7653 7342/7982/7653 7995/8253/7653 7445/8206/7653 +f 7342/7982/7654 6456/7981/7654 7465/8246/7654 7995/8253/7654 +f 7995/8253/7655 7465/8246/7655 6508/8248/7655 7469/8254/7655 +f 7445/8206/7656 7995/8253/7656 7469/8254/7656 6510/8207/7656 +f 6509/8252/7657 7468/8251/7657 7996/8255/7657 7470/8256/7657 +f 7468/8251/7658 6457/7989/7658 7345/7986/7658 7996/8255/7658 +f 7996/8255/7659 7345/7986/7659 6455/7985/7659 7448/8210/7659 +f 7470/8256/7660 7996/8255/7660 7448/8210/7660 6511/8209/7660 +f 6494/8183/7661 7438/8192/7661 7997/8257/7661 7471/8258/7661 +f 7438/8192/7662 6492/8191/7662 7472/8259/7662 7997/8257/7662 +f 7997/8257/7663 7472/8259/7663 6516/8260/7663 7473/8261/7663 +f 7471/8258/7664 7997/8257/7664 7473/8261/7664 6514/8262/7664 +f 6517/8263/7665 7475/8264/7665 7998/8265/7665 7474/8266/7665 +f 7475/8264/7666 6493/8193/7666 7439/8196/7666 7998/8265/7666 +f 7998/8265/7667 7439/8196/7667 6495/8185/7667 7476/8267/7667 +f 7474/8266/7668 7998/8265/7668 7476/8267/7668 6515/8268/7668 +f 6514/8262/7669 7473/8261/7669 7999/8269/7669 7477/8270/7669 +f 7473/8261/7670 6516/8260/7670 7478/8271/7670 7999/8269/7670 +f 7999/8269/7671 7478/8271/7671 6518/8272/7671 7479/8273/7671 +f 7477/8270/7672 7999/8269/7672 7479/8273/7672 6520/8274/7672 +f 6519/8275/7673 7481/8276/7673 8000/8277/7673 7480/8278/7673 +f 7481/8276/7674 6517/8263/7674 7474/8266/7674 8000/8277/7674 +f 8000/8277/7675 7474/8266/7675 6515/8268/7675 7482/8279/7675 +f 7480/8278/7676 8000/8277/7676 7482/8279/7676 6521/8280/7676 +f 6520/8274/7677 7479/8273/7677 8001/8281/7677 7483/8282/7677 +f 7479/8273/7678 6518/8272/7678 7484/8283/7678 8001/8281/7678 +f 8001/8281/7679 7484/8283/7679 6524/8284/7679 7485/8285/7679 +f 7483/8282/7680 8001/8281/7680 7485/8285/7680 6522/8286/7680 +f 6525/8287/7681 7487/8288/7681 8002/8289/7681 7486/8290/7681 +f 7487/8288/7682 6519/8275/7682 7480/8278/7682 8002/8289/7682 +f 8002/8289/7683 7480/8278/7683 6521/8280/7683 7488/8291/7683 +f 7486/8290/7684 8002/8289/7684 7488/8291/7684 6523/8292/7684 +f 6522/8286/7685 7485/8285/7685 8003/8293/7685 7489/8294/7685 +f 7485/8285/7686 6524/8284/7686 7490/8295/7686 8003/8293/7686 +f 8003/8293/7687 7490/8295/7687 6526/8296/7687 7491/8297/7687 +f 7489/8294/7688 8003/8293/7688 7491/8297/7688 6528/8298/7688 +f 6527/8299/7689 7493/8300/7689 8004/8301/7689 7492/8302/7689 +f 7493/8300/7690 6525/8287/7690 7486/8290/7690 8004/8301/7690 +f 8004/8301/7691 7486/8290/7691 6523/8292/7691 7494/8303/7691 +f 7492/8302/7692 8004/8301/7692 7494/8303/7692 6529/8304/7692 +f 6500/8216/7693 7450/8215/7693 8005/8305/7693 7495/8306/7693 +f 7450/8215/7694 6512/8158/7694 7496/8307/7694 8005/8305/7694 +f 8005/8305/7695 7496/8307/7695 6522/8286/7695 7489/8294/7695 +f 7495/8306/7696 8005/8305/7696 7489/8294/7696 6528/8298/7696 +f 6523/8292/7697 7497/8308/7697 8006/8309/7697 7494/8303/7697 +f 7497/8308/7698 6513/8164/7698 7451/8218/7698 8006/8309/7698 +f 8006/8309/7699 7451/8218/7699 6501/8220/7699 7498/8310/7699 +f 7494/8303/7700 8006/8309/7700 7498/8310/7700 6529/8304/7700 +f 6488/8156/7701 7499/8311/7701 8007/8312/7701 7421/8157/7701 +f 7499/8311/7702 6520/8274/7702 7483/8282/7702 8007/8312/7702 +f 8007/8312/7703 7483/8282/7703 6522/8286/7703 7496/8307/7703 +f 7421/8157/7704 8007/8312/7704 7496/8307/7704 6512/8158/7704 +f 6523/8292/7705 7488/8291/7705 8008/8313/7705 7497/8308/7705 +f 7488/8291/7706 6521/8280/7706 7500/8314/7706 8008/8313/7706 +f 8008/8313/7707 7500/8314/7707 6489/8159/7707 7422/8162/7707 +f 7497/8308/7708 8008/8313/7708 7422/8162/7708 6513/8164/7708 +f 6488/8156/7709 7426/8168/7709 8009/8315/7709 7499/8311/7709 +f 7426/8168/7710 6498/8167/7710 7501/8316/7710 8009/8315/7710 +f 8009/8315/7711 7501/8316/7711 6514/8262/7711 7477/8270/7711 +f 7499/8311/7712 8009/8315/7712 7477/8270/7712 6520/8274/7712 +f 6515/8268/7713 7502/8317/7713 8010/8318/7713 7482/8279/7713 +f 7502/8317/7714 6499/8169/7714 7427/8172/7714 8010/8318/7714 +f 8010/8318/7715 7427/8172/7715 6489/8159/7715 7500/8314/7715 +f 7482/8279/7716 8010/8318/7716 7500/8314/7716 6521/8280/7716 +f 6494/8183/7717 7471/8258/7717 8011/8319/7717 7434/8184/7717 +f 7471/8258/7718 6514/8262/7718 7501/8316/7718 8011/8319/7718 +f 8011/8319/7719 7501/8316/7719 6498/8167/7719 7430/8176/7719 +f 7434/8184/7720 8011/8319/7720 7430/8176/7720 6496/8175/7720 +f 6499/8169/7721 7502/8317/7721 8012/8320/7721 7431/8180/7721 +f 7502/8317/7722 6515/8268/7722 7476/8267/7722 8012/8320/7722 +f 8012/8320/7723 7476/8267/7723 6495/8185/7723 7435/8188/7723 +f 7431/8180/7724 8012/8320/7724 7435/8188/7724 6497/8177/7724 +f 6490/8199/7725 7446/8208/7725 8013/8321/7725 7442/8200/7725 +f 7446/8208/7726 6510/8207/7726 7503/8322/7726 8013/8321/7726 +f 8013/8321/7727 7503/8322/7727 6516/8260/7727 7472/8259/7727 +f 7442/8200/7728 8013/8321/7728 7472/8259/7728 6492/8191/7728 +f 6517/8263/7729 7504/8323/7729 8014/8324/7729 7475/8264/7729 +f 7504/8323/7730 6511/8209/7730 7447/8212/7730 8014/8324/7730 +f 8014/8324/7731 7447/8212/7731 6491/8201/7731 7443/8204/7731 +f 7475/8264/7732 8014/8324/7732 7443/8204/7732 6493/8193/7732 +f 6508/8248/7733 7505/8325/7733 8015/8326/7733 7469/8254/7733 +f 7505/8325/7734 6518/8272/7734 7478/8271/7734 8015/8326/7734 +f 8015/8326/7735 7478/8271/7735 6516/8260/7735 7503/8322/7735 +f 7469/8254/7736 8015/8326/7736 7503/8322/7736 6510/8207/7736 +f 6517/8263/7737 7481/8276/7737 8016/8327/7737 7504/8323/7737 +f 7481/8276/7738 6519/8275/7738 7506/8328/7738 8016/8327/7738 +f 8016/8327/7739 7506/8328/7739 6509/8252/7739 7470/8256/7739 +f 7504/8323/7740 8016/8327/7740 7470/8256/7740 6511/8209/7740 +f 6506/8240/7741 7507/8329/7741 8017/8330/7741 7466/8247/7741 +f 7507/8329/7742 6524/8284/7742 7484/8283/7742 8017/8330/7742 +f 8017/8330/7743 7484/8283/7743 6518/8272/7743 7505/8325/7743 +f 7466/8247/7744 8017/8330/7744 7505/8325/7744 6508/8248/7744 +f 6519/8275/7745 7487/8288/7745 8018/8331/7745 7506/8328/7745 +f 7487/8288/7746 6525/8287/7746 7508/8332/7746 8018/8331/7746 +f 8018/8331/7747 7508/8332/7747 6507/8244/7747 7467/8250/7747 +f 7506/8328/7748 8018/8331/7748 7467/8250/7748 6509/8252/7748 +f 6504/8232/7749 7509/8333/7749 8019/8334/7749 7462/8239/7749 +f 7509/8333/7750 6526/8296/7750 7490/8295/7750 8019/8334/7750 +f 8019/8334/7751 7490/8295/7751 6524/8284/7751 7507/8329/7751 +f 7462/8239/7752 8019/8334/7752 7507/8329/7752 6506/8240/7752 +f 6525/8287/7753 7493/8300/7753 8020/8335/7753 7508/8332/7753 +f 7493/8300/7754 6527/8299/7754 7510/8336/7754 8020/8335/7754 +f 8020/8335/7755 7510/8336/7755 6505/8236/7755 7463/8242/7755 +f 7508/8332/7756 8020/8335/7756 7463/8242/7756 6507/8244/7756 +f 6502/8224/7757 7511/8337/7757 8021/8338/7757 7458/8231/7757 +f 7511/8337/7758 6528/8298/7758 7491/8297/7758 8021/8338/7758 +f 8021/8338/7759 7491/8297/7759 6526/8296/7759 7509/8333/7759 +f 7458/8231/7760 8021/8338/7760 7509/8333/7760 6504/8232/7760 +f 6527/8299/7761 7492/8302/7761 8022/8339/7761 7510/8336/7761 +f 7492/8302/7762 6529/8304/7762 7512/8340/7762 8022/8339/7762 +f 8022/8339/7763 7512/8340/7763 6503/8228/7763 7459/8234/7763 +f 7510/8336/7764 8022/8339/7764 7459/8234/7764 6505/8236/7764 +f 6500/8216/7765 7495/8306/7765 8023/8341/7765 7454/8223/7765 +f 6528/8298/7766 7511/8337/7766 8023/8341/7766 7495/8306/7766 +f 6502/8224/7767 7454/8223/7767 8023/8341/7767 7511/8337/7767 +f 6503/8228/7768 7512/8340/7768 8024/8342/7768 7455/8226/7768 +f 6529/8304/7769 7498/8310/7769 8024/8342/7769 7512/8340/7769 +f 6501/8220/7770 7455/8226/7770 8024/8342/7770 7498/8310/7770 +f 6428/7960/7771 7335/7968/7771 8025/8343/7771 7513/8344/7771 +f 7335/7968/7772 6426/7972/7772 7514/8345/7772 8025/8343/7772 +f 8025/8343/7773 7514/8345/7773 6540/8346/7773 7515/8347/7773 +f 7513/8344/7774 8025/8343/7774 7515/8347/7774 6538/8348/7774 +f 6541/8349/7775 7517/8350/7775 8026/8351/7775 7516/8352/7775 +f 7517/8350/7776 6427/7978/7776 7340/7977/7776 8026/8351/7776 +f 8026/8351/7777 7340/7977/7777 6429/7966/7777 7518/8353/7777 +f 7516/8352/7778 8026/8351/7778 7518/8353/7778 6539/8354/7778 +f 6430/7948/7779 7329/7956/7779 8027/8355/7779 7519/8356/7779 +f 7329/7956/7780 6428/7960/7780 7513/8344/7780 8027/8355/7780 +f 8027/8355/7781 7513/8344/7781 6538/8348/7781 7520/8357/7781 +f 7519/8356/7782 8027/8355/7782 7520/8357/7782 6536/8358/7782 +f 6539/8354/7783 7518/8353/7783 8028/8359/7783 7521/8360/7783 +f 7518/8353/7784 6429/7966/7784 7334/7965/7784 8028/8359/7784 +f 8028/8359/7785 7334/7965/7785 6431/7954/7785 7522/8361/7785 +f 7521/8360/7786 8028/8359/7786 7522/8361/7786 6537/8362/7786 +f 6432/7936/7787 7323/7944/7787 8029/8363/7787 7523/8364/7787 +f 7323/7944/7788 6430/7948/7788 7519/8356/7788 8029/8363/7788 +f 8029/8363/7789 7519/8356/7789 6536/8358/7789 7524/8365/7789 +f 7523/8364/7790 8029/8363/7790 7524/8365/7790 6534/8366/7790 +f 6537/8362/7791 7522/8361/7791 8030/8367/7791 7525/8368/7791 +f 7522/8361/7792 6431/7954/7792 7328/7953/7792 8030/8367/7792 +f 8030/8367/7793 7328/7953/7793 6433/7942/7793 7526/8369/7793 +f 7525/8368/7794 8030/8367/7794 7526/8369/7794 6535/8370/7794 +f 6434/8371/7795 7317/8372/7795 8031/8373/7795 7527/8374/7795 +f 7317/8372/7796 6432/7936/7796 7523/8364/7796 8031/8373/7796 +f 8031/8373/7797 7523/8364/7797 6534/8366/7797 7528/8375/7797 +f 7527/8374/7798 8031/8373/7798 7528/8375/7798 6532/8376/7798 +f 6535/8370/7799 7526/8369/7799 8032/8377/7799 7529/8378/7799 +f 7526/8369/7800 6433/7942/7800 7322/8379/7800 8032/8377/7800 +f 8032/8377/7801 7322/8379/7801 6435/8380/7801 7530/8381/7801 +f 7529/8378/7802 8032/8377/7802 7530/8381/7802 6533/8382/7802 +f 6436/8383/7803 7311/8384/7803 8033/8385/7803 7531/8386/7803 +f 7311/8384/7804 6434/8371/7804 7527/8374/7804 8033/8385/7804 +f 8033/8385/7805 7527/8374/7805 6532/8376/7805 7532/8387/7805 +f 7531/8386/7806 8033/8385/7806 7532/8387/7806 6530/8388/7806 +f 6533/8382/7807 7530/8381/7807 8034/8389/7807 7533/8390/7807 +f 7530/8381/7808 6435/8380/7808 7316/8391/7808 8034/8389/7808 +f 8034/8389/7809 7316/8391/7809 6437/8392/7809 7534/8393/7809 +f 7533/8390/7810 8034/8389/7810 7534/8393/7810 6531/8394/7810 +f 6424/8395/7811 7304/8396/7811 8035/8397/7811 7535/8398/7811 +f 7304/8396/7812 6436/8383/7812 7531/8386/7812 8035/8397/7812 +f 8035/8397/7813 7531/8386/7813 6530/8388/7813 7536/8399/7813 +f 7535/8398/7814 8035/8397/7814 7536/8399/7814 6542/8400/7814 +f 6531/8394/7815 7534/8393/7815 8036/8401/7815 7537/8402/7815 +f 7534/8393/7816 6437/8392/7816 7309/8403/7816 8036/8401/7816 +f 8036/8401/7817 7309/8403/7817 6425/8404/7817 7538/8405/7817 +f 7537/8402/7818 8036/8401/7818 7538/8405/7818 6543/8406/7818 +f 6530/8388/7819 7539/8407/7819 8037/8408/7819 7536/8399/7819 +f 7539/8407/7820 6538/8348/7820 7515/8347/7820 8037/8408/7820 +f 8037/8408/7821 7515/8347/7821 6540/8346/7821 7540/8409/7821 +f 7536/8399/7822 8037/8408/7822 7540/8409/7822 6542/8400/7822 +f 6541/8349/7823 7516/8352/7823 8038/8410/7823 7541/8411/7823 +f 7516/8352/7824 6539/8354/7824 7542/8412/7824 8038/8410/7824 +f 8038/8410/7825 7542/8412/7825 6531/8394/7825 7537/8402/7825 +f 7541/8411/7826 8038/8410/7826 7537/8402/7826 6543/8406/7826 +f 6530/8388/7827 7532/8387/7827 8039/8413/7827 7539/8407/7827 +f 7532/8387/7828 6532/8376/7828 7543/8414/7828 8039/8413/7828 +f 8039/8413/7829 7543/8414/7829 6536/8358/7829 7520/8357/7829 +f 7539/8407/7830 8039/8413/7830 7520/8357/7830 6538/8348/7830 +f 6537/8362/7831 7544/8415/7831 8040/8416/7831 7521/8360/7831 +f 7544/8415/7832 6533/8382/7832 7533/8390/7832 8040/8416/7832 +f 8040/8416/7833 7533/8390/7833 6531/8394/7833 7542/8412/7833 +f 7521/8360/7834 8040/8416/7834 7542/8412/7834 6539/8354/7834 +f 6532/8376/7835 7528/8375/7835 8041/8417/7835 7543/8414/7835 +f 6534/8366/7836 7524/8365/7836 8041/8417/7836 7528/8375/7836 +f 6536/8358/7837 7543/8414/7837 8041/8417/7837 7524/8365/7837 +f 6537/8362/7838 7525/8368/7838 8042/8418/7838 7544/8415/7838 +f 6535/8370/7839 7529/8378/7839 8042/8418/7839 7525/8368/7839 +f 6533/8382/7840 7544/8415/7840 8042/8418/7840 7529/8378/7840 +f 6350/7735/7841 7269/7834/7841 8043/8419/7841 7545/8420/7841 +f 7269/7834/7842 6418/7827/7842 7379/8421/7842 8043/8419/7842 +f 8043/8419/7843 7379/8421/7843 6424/8422/7843 7535/8423/7843 +f 7545/8420/7844 8043/8419/7844 7535/8423/7844 6542/8424/7844 +f 6425/8404/7845 7384/8425/7845 8044/8426/7845 7538/8405/7845 +f 7384/8425/7846 6419/8427/7846 7270/8428/7846 8044/8426/7846 +f 8044/8426/7847 7270/8428/7847 6351/8429/7847 7546/8430/7847 +f 7538/8405/7848 8044/8426/7848 7546/8430/7848 6543/8406/7848 +f 6350/8431/7849 7545/8432/7849 8045/8433/7849 7289/8434/7849 +f 7545/8432/7850 6542/8400/7850 7540/8409/7850 8045/8433/7850 +f 8045/8433/7851 7540/8409/7851 6540/8346/7851 7547/8435/7851 +f 7289/8434/7852 8045/8433/7852 7547/8435/7852 6358/8436/7852 +f 6541/8349/7853 7541/8411/7853 8046/8437/7853 7548/8438/7853 +f 7541/8411/7854 6543/8406/7854 7546/8430/7854 8046/8437/7854 +f 8046/8437/7855 7546/8430/7855 6351/8429/7855 7294/8439/7855 +f 7548/8438/7856 8046/8437/7856 7294/8439/7856 6359/8440/7856 +f 6356/8043/7857 7297/8441/7857 8047/8442/7857 7373/8044/7857 +f 7297/8441/7858 6358/8436/7858 7547/8435/7858 8047/8442/7858 +f 8047/8442/7859 7547/8435/7859 6540/8346/7859 7514/8345/7859 +f 7373/8044/7860 8047/8442/7860 7514/8345/7860 6426/7972/7860 +f 6541/8349/7861 7548/8438/7861 8048/8443/7861 7517/8350/7861 +f 7548/8438/7862 6359/8440/7862 7300/8444/7862 8048/8443/7862 +f 8048/8443/7863 7300/8444/7863 6357/8052/7863 7376/8051/7863 +f 7517/8350/7864 8048/8443/7864 7376/8051/7864 6427/7978/7864 diff --git a/modules/ufbx/data/blender_293_suzanne_subsurf_uv_7400_binary.fbx b/modules/ufbx/data/blender_293_suzanne_subsurf_uv_7400_binary.fbx new file mode 100644 index 0000000..58c2174 Binary files /dev/null and b/modules/ufbx/data/blender_293_suzanne_subsurf_uv_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293_textures_7400_binary.fbx b/modules/ufbx/data/blender_293_textures_7400_binary.fbx new file mode 100644 index 0000000..6155b94 Binary files /dev/null and b/modules/ufbx/data/blender_293_textures_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293x_nonmanifold_subsurf.obj b/modules/ufbx/data/blender_293x_nonmanifold_subsurf.obj new file mode 100644 index 0000000..bdd985c --- /dev/null +++ b/modules/ufbx/data/blender_293x_nonmanifold_subsurf.obj @@ -0,0 +1,71 @@ +# ufbx:line_faces +# Blender v2.93.1 OBJ File: '' +# www.blender.org +g Plane +v -0.750000 0.000000 0.875000 +v 0.750000 0.000000 0.875000 +v -0.750000 0.000000 -0.875000 +v 0.750000 0.000000 -0.875000 +v -1.000000 0.000000 0.000000 +v 1.000000 0.000000 0.000000 +v -0.750000 0.875000 0.000000 +v 0.750000 0.875000 0.000000 +v 1.000000 -1.000000 0.000000 +v -1.000000 0.000000 0.500000 +v 0.000000 0.000000 1.000000 +v 1.000000 0.000000 -0.500000 +v 0.000000 0.000000 -1.000000 +v -1.000000 0.000000 -0.500000 +v 1.000000 0.000000 0.500000 +v 0.000000 0.000000 0.000000 +v 0.000000 1.000000 0.000000 +v 1.000000 0.500000 0.000000 +v -1.000000 0.500000 0.000000 +v 1.000000 -0.500000 0.000000 +v 0.000000 0.000000 -0.500000 +v 0.000000 0.000000 0.500000 +v 0.000000 0.500000 0.000000 +vt 0.666243 0.666525 +vt 0.333192 0.666525 +vt 0.333192 0.500000 +vt 0.666243 0.500000 +vt 0.000141 0.666525 +vt 0.000141 0.500000 +vt 0.000141 0.333475 +vt 0.333192 0.333475 +vt 0.666243 0.333475 +vt 0.666243 0.333192 +vt 0.333192 0.333192 +vt 0.333192 0.166667 +vt 0.666243 0.166667 +vt 0.000141 0.333192 +vt 0.000141 0.166667 +vt 0.000141 0.000141 +vt 0.333192 0.000141 +vt 0.666243 0.000141 +vt 0.666243 0.999859 +vt 0.333192 0.999859 +vt 0.333192 0.833333 +vt 0.666243 0.833333 +vt 0.000141 0.999859 +vt 0.000141 0.833333 +vt 0.000141 0.666808 +vt 0.333192 0.666808 +vt 0.666243 0.666808 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +s off +f 5/1/1 16/2/1 21/3/1 14/4/1 +f 16/2/1 6/5/1 12/6/1 21/3/1 +f 21/3/1 12/6/1 4/7/1 13/8/1 +f 14/4/1 21/3/1 13/8/1 3/9/1 +f 1/10/1 11/11/1 22/12/1 10/13/1 +f 11/11/1 2/14/1 15/15/1 22/12/1 +f 22/12/1 15/15/1 6/16/1 16/17/1 +f 10/13/1 22/12/1 16/17/1 5/18/1 +f 5/19/2 16/20/2 23/21/2 19/22/2 +f 16/20/2 6/23/2 18/24/2 23/21/2 +f 23/21/2 18/24/2 8/25/2 17/26/2 +f 19/22/2 23/21/2 17/26/2 7/27/2 +l 6 20 +l 20 9 diff --git a/modules/ufbx/data/blender_293x_nonmanifold_subsurf_7400_binary.fbx b/modules/ufbx/data/blender_293x_nonmanifold_subsurf_7400_binary.fbx new file mode 100644 index 0000000..23bfca7 Binary files /dev/null and b/modules/ufbx/data/blender_293x_nonmanifold_subsurf_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293x_subsurf_boundary.obj b/modules/ufbx/data/blender_293x_subsurf_boundary.obj new file mode 100644 index 0000000..2a4f3f2 --- /dev/null +++ b/modules/ufbx/data/blender_293x_subsurf_boundary.obj @@ -0,0 +1,52 @@ +# Blender v2.93.1 OBJ File: '' +# www.blender.org +g All_Plane +v 0.750000 0.000000 0.750000 +v 2.250000 0.000000 0.750000 +v 0.750000 0.000000 -0.750000 +v 2.250000 0.000000 -0.750000 +v 0.500000 0.000000 0.000000 +v 1.500000 0.000000 1.000000 +v 2.500000 0.000000 0.000000 +v 1.500000 0.000000 -1.000000 +v 1.500000 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.000000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.500000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 1.0000 0.0000 +s off +f 1/1/1 6/2/1 9/3/1 5/4/1 +f 6/2/1 2/5/1 7/6/1 9/3/1 +f 9/3/1 7/6/1 4/7/1 8/8/1 +f 5/4/1 9/3/1 8/8/1 3/9/1 +g KeepCorners_Plane.001 +v -2.500000 0.000000 1.000000 +v -0.500000 0.000000 1.000000 +v -2.500000 0.000000 -1.000000 +v -0.500000 0.000000 -1.000000 +v -2.500000 0.000000 0.000000 +v -1.500000 0.000000 1.000000 +v -0.500000 0.000000 0.000000 +v -1.500000 0.000000 -1.000000 +v -1.500000 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.000000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.500000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 1.0000 0.0000 +s off +f 10/10/2 15/11/2 18/12/2 14/13/2 +f 15/11/2 11/14/2 16/15/2 18/12/2 +f 18/12/2 16/15/2 13/16/2 17/17/2 +f 14/13/2 18/12/2 17/17/2 12/18/2 diff --git a/modules/ufbx/data/blender_293x_subsurf_boundary_7400_binary.fbx b/modules/ufbx/data/blender_293x_subsurf_boundary_7400_binary.fbx new file mode 100644 index 0000000..42e299e Binary files /dev/null and b/modules/ufbx/data/blender_293x_subsurf_boundary_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_293x_subsurf_max_crease_7400_binary.fbx b/modules/ufbx/data/blender_293x_subsurf_max_crease_7400_binary.fbx new file mode 100644 index 0000000..46266ba Binary files /dev/null and b/modules/ufbx/data/blender_293x_subsurf_max_crease_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_300_ngon_abstract_7400_binary.fbx b/modules/ufbx/data/blender_300_ngon_abstract_7400_binary.fbx new file mode 100644 index 0000000..8a33c0a Binary files /dev/null and b/modules/ufbx/data/blender_300_ngon_abstract_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_300_ngon_big_7400_binary.fbx b/modules/ufbx/data/blender_300_ngon_big_7400_binary.fbx new file mode 100644 index 0000000..35a1936 Binary files /dev/null and b/modules/ufbx/data/blender_300_ngon_big_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_300_ngon_e_7400_binary.fbx b/modules/ufbx/data/blender_300_ngon_e_7400_binary.fbx new file mode 100644 index 0000000..f5c37ef Binary files /dev/null and b/modules/ufbx/data/blender_300_ngon_e_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_300_ngon_intersection_7400_binary.fbx b/modules/ufbx/data/blender_300_ngon_intersection_7400_binary.fbx new file mode 100644 index 0000000..eab49d7 Binary files /dev/null and b/modules/ufbx/data/blender_300_ngon_intersection_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_300_ngon_irregular_7400_binary.fbx b/modules/ufbx/data/blender_300_ngon_irregular_7400_binary.fbx new file mode 100644 index 0000000..0d05397 Binary files /dev/null and b/modules/ufbx/data/blender_300_ngon_irregular_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_312x_vertex_crease.obj b/modules/ufbx/data/blender_312x_vertex_crease.obj new file mode 100644 index 0000000..751744d --- /dev/null +++ b/modules/ufbx/data/blender_312x_vertex_crease.obj @@ -0,0 +1,414 @@ +# ufbx:bad_normals +# Blender v3.1.2 OBJ File: 'vertex_crease.blend' +# www.blender.org +g Cube_Cube.001 +v -0.950000 -1.000000 0.950000 +v -0.877778 0.877778 0.877778 +v -0.856250 -1.000000 -0.856250 +v -0.675926 0.675926 -0.675926 +v 1.000000 -1.000000 1.000000 +v 1.000000 1.000000 1.000000 +v 0.762500 -1.000000 -0.762500 +v 0.583333 0.583333 -0.583333 +v -0.987500 -1.000000 -0.487500 +v -0.996875 -1.000000 0.003125 +v -1.000000 -1.000000 0.500000 +v -0.781250 -0.500000 0.781250 +v -0.730469 -0.007812 0.730469 +v -0.765625 0.468750 0.765625 +v -0.765625 0.765625 0.468750 +v -0.722396 0.722396 0.004167 +v -0.748958 0.748958 -0.452083 +v -0.748958 0.452083 -0.748958 +v -0.723958 -0.011979 -0.723958 +v -0.771875 -0.500000 -0.771875 +v 0.425000 -1.000000 -0.925000 +v -0.015625 -1.000000 -0.978125 +v -0.487500 -1.000000 -0.987500 +v -0.452083 0.748958 -0.748958 +v -0.020833 0.697396 -0.697396 +v 0.368750 0.665625 -0.665625 +v 0.665625 0.368750 -0.665625 +v 0.691406 -0.032812 -0.691406 +v 0.725000 -0.500000 -0.725000 +v 1.000000 -1.000000 0.500000 +v 0.981250 -1.000000 0.018750 +v 0.925000 -1.000000 -0.425000 +v 0.665625 0.665625 -0.368750 +v 0.701563 0.701563 0.025000 +v 0.765625 0.765625 0.468750 +v 0.765625 0.468750 0.765625 +v 0.730469 -0.007812 0.730469 +v 0.781250 -0.500000 0.781250 +v -0.500000 -1.000000 1.000000 +v 0.000000 -1.000000 1.000000 +v 0.500000 -1.000000 1.000000 +v 0.468750 0.765625 0.765625 +v 0.000000 0.726562 0.726562 +v -0.468750 0.765625 0.765625 +v -0.937500 -0.500000 0.437500 +v -0.890625 -0.015625 0.406250 +v -0.875000 0.437500 0.437500 +v -0.967187 -0.500000 0.001562 +v -0.928602 -0.024132 0.001085 +v -0.872222 0.403472 0.002778 +v -0.931250 -0.500000 -0.431250 +v -0.886285 -0.018403 -0.401910 +v -0.863889 0.426389 -0.426389 +v -0.431250 -0.500000 -0.931250 +v -0.401910 -0.018403 -0.886285 +v -0.426389 0.426389 -0.863889 +v -0.007813 -0.500000 -0.957813 +v -0.005425 -0.028299 -0.922092 +v -0.013889 0.386806 -0.855556 +v 0.400000 -0.500000 -0.900000 +v 0.380208 -0.032292 -0.864583 +v 0.370833 0.370833 -0.808333 +v 0.900000 -0.500000 -0.400000 +v 0.864583 -0.032292 -0.380208 +v 0.808333 0.370833 -0.370833 +v 0.959375 -0.500000 0.009375 +v 0.923177 -0.027604 0.006510 +v 0.858333 0.389583 0.016667 +v 0.937500 -0.500000 0.437500 +v 0.890625 -0.015625 0.406250 +v 0.875000 0.437500 0.437500 +v 0.437500 -0.500000 0.937500 +v 0.406250 -0.015625 0.890625 +v 0.437500 0.437500 0.875000 +v 0.000000 -0.500000 0.968750 +v 0.000000 -0.023438 0.929688 +v 0.000000 0.406250 0.875000 +v -0.437500 -0.500000 0.937500 +v -0.406250 -0.015625 0.890625 +v -0.437500 0.437500 0.875000 +v -0.493750 -1.000000 -0.493750 +v -0.007812 -1.000000 -0.489063 +v 0.462500 -1.000000 -0.462500 +v -0.498437 -1.000000 0.001562 +v -0.001953 -1.000000 0.002734 +v 0.490625 -1.000000 0.009375 +v -0.500000 -1.000000 0.500000 +v 0.000000 -1.000000 0.500000 +v 0.500000 -1.000000 0.500000 +v 0.370833 0.808333 -0.370833 +v -0.013889 0.855556 -0.386806 +v -0.426389 0.863889 -0.426389 +v 0.389583 0.858333 0.016667 +v -0.003472 0.901389 0.004861 +v -0.403472 0.872222 0.002778 +v 0.437500 0.875000 0.437500 +v 0.000000 0.875000 0.406250 +v -0.437500 0.875000 0.437500 +vt 0.437500 0.062500 +vt 0.500000 0.062500 +vt 0.500000 0.125000 +vt 0.437500 0.125000 +vt 0.562500 0.062500 +vt 0.562500 0.125000 +vt 0.500000 0.187500 +vt 0.437500 0.187500 +vt 0.562500 0.187500 +vt 0.381250 0.006250 +vt 0.437500 0.000000 +vt 0.375000 0.062500 +vt 0.500000 0.000000 +vt 0.562500 0.000000 +vt 0.618750 0.006250 +vt 0.625000 0.062500 +vt 0.625000 0.125000 +vt 0.625000 0.187500 +vt 0.625000 0.250000 +vt 0.562500 0.250000 +vt 0.500000 0.250000 +vt 0.437500 0.250000 +vt 0.375000 0.187500 +vt 0.375000 0.250000 +vt 0.375000 0.125000 +vt 0.437500 0.312500 +vt 0.500000 0.312500 +vt 0.500293 0.374707 +vt 0.437500 0.375000 +vt 0.562500 0.312500 +vt 0.563672 0.373828 +vt 0.501172 0.436328 +vt 0.437500 0.437500 +vt 0.567187 0.432813 +vt 0.375000 0.312500 +vt 0.625000 0.312500 +vt 0.627344 0.372656 +vt 0.634375 0.428125 +vt 0.654688 0.470313 +vt 0.569531 0.492969 +vt 0.501758 0.498242 +vt 0.437500 0.500000 +vt 0.375000 0.437500 +vt 0.375000 0.500000 +vt 0.375000 0.375000 +vt 0.437500 0.562500 +vt 0.501172 0.561328 +vt 0.500293 0.624707 +vt 0.437500 0.625000 +vt 0.567187 0.557812 +vt 0.563672 0.623828 +vt 0.500000 0.687500 +vt 0.437500 0.687500 +vt 0.562500 0.687500 +vt 0.375000 0.562500 +vt 0.632031 0.555469 +vt 0.626758 0.623242 +vt 0.625000 0.687500 +vt 0.625000 0.750000 +vt 0.562500 0.750000 +vt 0.500000 0.750000 +vt 0.437500 0.750000 +vt 0.375000 0.687500 +vt 0.375000 0.750000 +vt 0.375000 0.625000 +vt 0.437500 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.875000 +vt 0.437500 0.875000 +vt 0.562500 0.812500 +vt 0.562500 0.875000 +vt 0.500000 0.937500 +vt 0.437500 0.937500 +vt 0.562500 0.937500 +vt 0.375000 0.812500 +vt 0.625000 0.812500 +vt 0.625000 0.875000 +vt 0.625000 0.937500 +vt 0.618750 0.993750 +vt 0.562500 1.000000 +vt 0.500000 1.000000 +vt 0.437500 1.000000 +vt 0.375000 0.937500 +vt 0.381250 0.993750 +vt 0.375000 0.875000 +vt 0.188281 0.563281 +vt 0.250195 0.562695 +vt 0.250049 0.625049 +vt 0.187695 0.625195 +vt 0.312500 0.562500 +vt 0.312500 0.625000 +vt 0.250000 0.687500 +vt 0.187500 0.687500 +vt 0.312500 0.687500 +vt 0.142969 0.517969 +vt 0.189062 0.501562 +vt 0.126562 0.564063 +vt 0.250391 0.500391 +vt 0.312500 0.500000 +vt 0.312500 0.750000 +vt 0.250000 0.750000 +vt 0.187500 0.750000 +vt 0.125000 0.687500 +vt 0.131250 0.743750 +vt 0.125391 0.625391 +vt 0.692187 0.557813 +vt 0.750977 0.561523 +vt 0.750244 0.624756 +vt 0.688672 0.623828 +vt 0.811719 0.563281 +vt 0.812305 0.625195 +vt 0.750000 0.687500 +vt 0.687500 0.687500 +vt 0.812500 0.687500 +vt 0.696875 0.490625 +vt 0.751953 0.498047 +vt 0.810937 0.501562 +vt 0.857031 0.517969 +vt 0.873437 0.564063 +vt 0.874609 0.625391 +vt 0.875000 0.687500 +vt 0.868750 0.743750 +vt 0.812500 0.750000 +vt 0.750000 0.750000 +vt 0.687500 0.750000 +vn -0.9700 0.1459 0.1945 +vn -0.9711 0.0658 0.2294 +vn -0.9961 0.0874 -0.0083 +vn -0.9958 0.0907 -0.0085 +vn -0.9889 0.1131 0.0967 +vn -0.9735 0.2282 -0.0143 +vn -0.9672 0.0713 -0.2437 +vn -0.9637 0.1207 -0.2380 +vn -0.9621 0.1965 -0.1890 +vn -0.6313 -0.4505 0.6313 +vn -0.6890 0.2250 0.6890 +vn -0.7719 -0.6252 0.1150 +vn -0.7065 0.0414 0.7065 +vn -0.7068 -0.0279 0.7068 +vn -0.5774 0.5774 0.5774 +vn -0.7064 0.7064 -0.0458 +vn -0.7069 0.7069 -0.0217 +vn -0.6978 0.6978 -0.1616 +vn -0.5774 0.5774 -0.5774 +vn -0.6969 0.1696 -0.6969 +vn -0.7062 0.0509 -0.7062 +vn -0.6978 0.1621 -0.6978 +vn -0.7637 -0.6208 -0.1769 +vn -0.5940 -0.5425 -0.5940 +vn -0.7397 -0.6729 -0.0075 +vn -0.2261 0.1174 -0.9670 +vn -0.2316 0.0744 -0.9700 +vn 0.0453 0.1044 -0.9935 +vn 0.0453 0.0724 -0.9963 +vn -0.1633 0.2072 -0.9646 +vn 0.0823 0.2732 -0.9584 +vn 0.3075 0.1086 -0.9453 +vn 0.3048 0.0759 -0.9494 +vn 0.2878 0.2835 -0.9148 +vn -0.1666 -0.6185 -0.7679 +vn -0.1278 0.7013 -0.7013 +vn 0.1198 0.7020 -0.7020 +vn 0.2762 0.6796 -0.6796 +vn 0.5774 0.5774 -0.5774 +vn 0.6806 0.2714 -0.6806 +vn 0.7032 0.1052 -0.7032 +vn 0.7041 0.0918 -0.7041 +vn 0.2282 -0.6475 -0.7271 +vn 0.5631 -0.6048 -0.5631 +vn 0.0403 -0.6736 -0.7380 +vn 0.9488 0.0764 -0.3066 +vn 0.9448 0.1082 -0.3094 +vn 0.9933 0.1020 -0.0536 +vn 0.9957 0.0750 -0.0537 +vn 0.9141 0.2818 -0.2916 +vn 0.9590 0.2663 -0.0964 +vn 0.9733 0.0684 0.2191 +vn 0.9739 0.1529 0.1677 +vn 0.9938 0.0988 0.0515 +vn 0.7263 -0.6479 -0.2297 +vn 0.6785 0.6785 -0.2818 +vn 0.7001 0.7001 -0.1408 +vn 0.6981 0.6981 -0.1593 +vn 0.5774 0.5774 0.5774 +vn 0.7029 -0.1092 0.7029 +vn 0.7065 0.0414 0.7065 +vn 0.6837 0.2551 0.6837 +vn 0.7740 -0.6286 0.0764 +vn 0.6459 -0.4069 0.6459 +vn 0.7377 -0.6735 -0.0478 +vn 0.1799 0.1563 0.9712 +vn 0.2313 0.0653 0.9707 +vn 0.0000 0.0849 0.9964 +vn 0.0000 0.0936 0.9956 +vn 0.0783 0.0890 0.9929 +vn 0.0000 0.2212 0.9752 +vn -0.2313 0.0653 0.9707 +vn -0.1965 0.1464 0.9695 +vn -0.1009 0.1115 0.9886 +vn 0.0870 -0.6312 0.7707 +vn -0.1221 0.7018 0.7018 +vn 0.0000 0.7071 0.7071 +vn 0.0401 0.7065 0.7065 +vn -0.1167 -0.6256 0.7714 +vn 0.0000 -0.6728 0.7399 +vn -0.0000 -1.0000 0.0000 +vn 0.2764 0.9187 -0.2820 +vn 0.0792 0.9630 -0.2578 +vn 0.0293 0.9988 -0.0396 +vn 0.2488 0.9640 -0.0936 +vn -0.1579 0.9681 -0.1944 +vn -0.1996 0.9797 -0.0193 +vn 0.0048 0.9817 0.1904 +vn 0.0832 0.9955 0.0465 +vn -0.0960 0.9913 0.0902 +s 1 +f 45/1/1 46/2/2 49/3/3 48/4/4 +f 46/2/2 47/5/5 50/6/6 49/3/3 +f 48/4/4 49/3/3 52/7/7 51/8/8 +f 49/3/3 50/6/6 53/9/9 52/7/7 +f 1/10/10 12/11/11 45/1/1 11/12/12 +f 12/11/11 13/13/13 46/2/2 45/1/1 +f 13/13/13 14/14/14 47/5/5 46/2/2 +f 14/14/14 2/15/15 15/16/16 47/5/5 +f 47/5/5 15/16/16 16/17/17 50/6/6 +f 50/6/6 16/17/17 17/18/18 53/9/9 +f 53/9/9 17/18/18 4/19/19 18/20/20 +f 52/7/7 53/9/9 18/20/20 19/21/21 +f 51/8/8 52/7/7 19/21/21 20/22/22 +f 9/23/23 51/8/8 20/22/22 3/24/24 +f 10/25/25 48/4/4 51/8/8 9/23/23 +f 11/12/12 45/1/1 48/4/4 10/25/25 +f 54/26/26 55/27/27 58/28/28 57/29/29 +f 55/27/27 56/30/30 59/31/31 58/28/28 +f 57/29/29 58/28/28 61/32/32 60/33/33 +f 58/28/28 59/31/31 62/34/34 61/32/32 +f 3/24/24 20/22/22 54/26/26 23/35/35 +f 20/22/22 19/21/21 55/27/27 54/26/26 +f 19/21/21 18/20/20 56/30/30 55/27/27 +f 18/20/20 4/19/19 24/36/36 56/30/30 +f 56/30/30 24/36/36 25/37/37 59/31/31 +f 59/31/31 25/37/37 26/38/38 62/34/34 +f 62/34/34 26/38/38 8/39/39 27/40/40 +f 61/32/32 62/34/34 27/40/40 28/41/41 +f 60/33/33 61/32/32 28/41/41 29/42/42 +f 21/43/43 60/33/33 29/42/42 7/44/44 +f 22/45/45 57/29/29 60/33/33 21/43/43 +f 23/35/35 54/26/26 57/29/29 22/45/45 +f 63/46/46 64/47/47 67/48/48 66/49/49 +f 64/47/47 65/50/50 68/51/51 67/48/48 +f 66/49/49 67/48/48 70/52/52 69/53/53 +f 67/48/48 68/51/51 71/54/54 70/52/52 +f 7/44/44 29/42/42 63/46/46 32/55/55 +f 29/42/42 28/41/41 64/47/47 63/46/46 +f 28/41/41 27/40/40 65/50/50 64/47/47 +f 27/40/40 8/39/39 33/56/56 65/50/50 +f 65/50/50 33/56/56 34/57/57 68/51/51 +f 68/51/51 34/57/57 35/58/58 71/54/54 +f 71/54/54 35/58/58 6/59/59 36/60/60 +f 70/52/52 71/54/54 36/60/60 37/61/61 +f 69/53/53 70/52/52 37/61/61 38/62/62 +f 30/63/63 69/53/53 38/62/62 5/64/64 +f 31/65/65 66/49/49 69/53/53 30/63/63 +f 32/55/55 63/46/46 66/49/49 31/65/65 +f 72/66/66 73/67/67 76/68/68 75/69/69 +f 73/67/67 74/70/70 77/71/71 76/68/68 +f 75/69/69 76/68/68 79/72/72 78/73/73 +f 76/68/68 77/71/71 80/74/74 79/72/72 +f 5/64/64 38/62/62 72/66/66 41/75/75 +f 38/62/62 37/61/61 73/67/67 72/66/66 +f 37/61/61 36/60/60 74/70/70 73/67/67 +f 36/60/60 6/59/59 42/76/76 74/70/70 +f 74/70/70 42/76/76 43/77/77 77/71/71 +f 77/71/71 43/77/77 44/78/78 80/74/74 +f 80/74/74 44/78/78 2/79/15 14/80/14 +f 79/72/72 80/74/74 14/80/14 13/81/13 +f 78/73/73 79/72/72 13/81/13 12/82/11 +f 39/83/79 78/73/73 12/82/11 1/84/10 +f 40/85/80 75/69/69 78/73/73 39/83/79 +f 41/75/75 72/66/66 75/69/69 40/85/80 +f 81/86/81 82/87/81 85/88/81 84/89/81 +f 82/87/81 83/90/81 86/91/81 85/88/81 +f 84/89/81 85/88/81 88/92/81 87/93/81 +f 85/88/81 86/91/81 89/94/81 88/92/81 +f 3/95/24 23/96/35 81/86/81 9/97/23 +f 23/96/35 22/98/45 82/87/81 81/86/81 +f 22/98/45 21/99/43 83/90/81 82/87/81 +f 21/99/43 7/44/44 32/55/55 83/90/81 +f 83/90/81 32/55/55 31/65/65 86/91/81 +f 86/91/81 31/65/65 30/63/63 89/94/81 +f 89/94/81 30/63/63 5/64/64 41/100/75 +f 88/92/81 89/94/81 41/100/75 40/101/80 +f 87/93/81 88/92/81 40/101/80 39/102/79 +f 11/103/12 87/93/81 39/102/79 1/104/10 +f 10/105/25 84/89/81 87/93/81 11/103/12 +f 9/97/23 81/86/81 84/89/81 10/105/25 +f 90/106/82 91/107/83 94/108/84 93/109/85 +f 91/107/83 92/110/86 95/111/87 94/108/84 +f 93/109/85 94/108/84 97/112/88 96/113/89 +f 94/108/84 95/111/87 98/114/90 97/112/88 +f 8/39/39 26/115/38 90/106/82 33/56/56 +f 26/115/38 25/116/37 91/107/83 90/106/82 +f 25/116/37 24/117/36 92/110/86 91/107/83 +f 24/117/36 4/118/19 17/119/18 92/110/86 +f 92/110/86 17/119/18 16/120/17 95/111/87 +f 95/111/87 16/120/17 15/121/16 98/114/90 +f 98/114/90 15/121/16 2/122/15 44/123/78 +f 97/112/88 98/114/90 44/123/78 43/124/77 +f 96/113/89 97/112/88 43/124/77 42/125/76 +f 35/58/58 96/113/89 42/125/76 6/59/59 +f 34/57/57 93/109/85 96/113/89 35/58/58 +f 33/56/56 90/106/82 93/109/85 34/57/57 diff --git a/modules/ufbx/data/blender_312x_vertex_crease_7400_binary.fbx b/modules/ufbx/data/blender_312x_vertex_crease_7400_binary.fbx new file mode 100644 index 0000000..869e309 Binary files /dev/null and b/modules/ufbx/data/blender_312x_vertex_crease_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_331_space texture_0_mtl.mtl b/modules/ufbx/data/blender_331_space texture_0_mtl.mtl new file mode 100644 index 0000000..99dbaa7 --- /dev/null +++ b/modules/ufbx/data/blender_331_space texture_0_mtl.mtl @@ -0,0 +1,12 @@ +# Blender 3.3.1 MTL File: 'None' +# www.blender.org + +newmtl Material +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd space dir/space tex.png diff --git a/modules/ufbx/data/blender_331_space texture_0_obj.obj b/modules/ufbx/data/blender_331_space texture_0_obj.obj new file mode 100644 index 0000000..cbb8a42 --- /dev/null +++ b/modules/ufbx/data/blender_331_space texture_0_obj.obj @@ -0,0 +1,40 @@ +# Blender 3.3.1 +# www.blender.org +mtllib blender_331_space texture_0_mtl.mtl +o Cube +v 1.000000 1.000000 -1.000000 +v 1.000000 -1.000000 -1.000000 +v 1.000000 1.000000 1.000000 +v 1.000000 -1.000000 1.000000 +v -1.000000 1.000000 -1.000000 +v -1.000000 -1.000000 -1.000000 +v -1.000000 1.000000 1.000000 +v -1.000000 -1.000000 1.000000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vt 0.625000 0.500000 +vt 0.375000 0.500000 +vt 0.625000 0.750000 +vt 0.375000 0.750000 +vt 0.875000 0.500000 +vt 0.625000 0.250000 +vt 0.125000 0.500000 +vt 0.375000 0.250000 +vt 0.875000 0.750000 +vt 0.625000 1.000000 +vt 0.625000 0.000000 +vt 0.375000 1.000000 +vt 0.375000 0.000000 +vt 0.125000 0.750000 +s 0 +usemtl Material +f 1/1/1 5/5/1 7/9/1 3/3/1 +f 4/4/2 3/3/2 7/10/2 8/12/2 +f 8/13/3 7/11/3 5/6/3 6/8/3 +f 6/7/4 2/2/4 4/4/4 8/14/4 +f 2/2/5 1/1/5 3/3/5 4/4/5 +f 6/8/6 5/6/6 1/1/6 2/2/6 diff --git a/modules/ufbx/data/blender_340_default_unscaled_7400_binary.fbx b/modules/ufbx/data/blender_340_default_unscaled_7400_binary.fbx new file mode 100644 index 0000000..56bf8db Binary files /dev/null and b/modules/ufbx/data/blender_340_default_unscaled_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_340_line_point_0_obj.obj b/modules/ufbx/data/blender_340_line_point_0_obj.obj new file mode 100644 index 0000000..ee52836 --- /dev/null +++ b/modules/ufbx/data/blender_340_line_point_0_obj.obj @@ -0,0 +1,23 @@ +# Blender 3.4.0 +# www.blender.org +o Cube +v -1.000000 -1.000000 1.000000 +v -1.000000 1.000000 1.000000 +v -1.000000 -1.000000 -1.000000 +v -1.000000 1.000000 -1.000000 +v 1.000000 -1.000000 1.000000 +v 1.000000 1.000000 1.000000 +v 1.000000 -1.000000 -1.000000 +v 1.000000 1.000000 -1.000000 +vn -1.0000 -0.0000 -0.0000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +s 0 +f 1/1/1 2/2/1 4/4/1 3/3/1 +l 1 5 +l 6 5 +l 7 3 +l 6 2 +l 5 7 diff --git a/modules/ufbx/data/blender_340_y_up.obj b/modules/ufbx/data/blender_340_y_up.obj new file mode 100644 index 0000000..a39a74a --- /dev/null +++ b/modules/ufbx/data/blender_340_y_up.obj @@ -0,0 +1,84 @@ +# Blender 3.4.0 +# www.blender.org +o Cube +v 1.000000 2.000000 3.000000 +v 1.000000 2.000000 1.000000 +v 1.000000 0.000000 3.000000 +v 1.000000 0.000000 1.000000 +v -1.000000 2.000000 3.000000 +v -1.000000 2.000000 1.000000 +v -1.000000 0.000000 3.000000 +v -1.000000 0.000000 1.000000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.625000 0.500000 +vt 0.375000 0.500000 +vt 0.625000 0.750000 +vt 0.375000 0.750000 +vt 0.875000 0.500000 +vt 0.625000 0.250000 +vt 0.125000 0.500000 +vt 0.375000 0.250000 +vt 0.875000 0.750000 +vt 0.625000 1.000000 +vt 0.625000 0.000000 +vt 0.375000 1.000000 +vt 0.375000 0.000000 +vt 0.125000 0.750000 +s 0 +f 1/1/1 5/5/1 7/9/1 3/3/1 +f 4/4/2 3/3/2 7/10/2 8/12/2 +f 8/13/3 7/11/3 5/6/3 6/8/3 +f 6/7/4 2/2/4 4/4/4 8/14/4 +f 2/2/5 1/1/5 3/3/5 4/4/5 +f 6/8/6 5/6/6 1/1/6 2/2/6 +o Cone +v 0.000000 2.000000 5.000000 +v -0.707107 1.707107 5.000000 +v -1.000000 1.000000 5.000000 +v -0.707107 0.292893 5.000000 +v 0.000000 0.000000 5.000000 +v 0.707107 0.292893 5.000000 +v 1.000000 1.000000 5.000000 +v 0.707107 1.707107 5.000000 +v -0.000000 1.000000 4.000000 +vn -0.0000 0.7042 0.7100 +vn -0.0000 -0.0000 -1.0000 +vn -0.4979 0.4979 0.7100 +vn -0.7042 -0.0000 0.7100 +vn -0.4979 -0.4979 0.7100 +vn -0.0000 -0.7042 0.7100 +vn 0.4979 -0.4979 0.7100 +vn 0.7042 -0.0000 0.7100 +vn 0.4979 0.4979 0.7100 +vt 0.750000 0.490000 +vt 0.250000 0.490000 +vt 0.419706 0.419706 +vt 0.919706 0.419706 +vt 0.490000 0.250000 +vt 0.990000 0.250000 +vt 0.419706 0.080294 +vt 0.919706 0.080294 +vt 0.250000 0.010000 +vt 0.750000 0.010000 +vt 0.080294 0.080294 +vt 0.580294 0.080294 +vt 0.510000 0.250000 +vt 0.010000 0.250000 +vt 0.580294 0.419706 +vt 0.080294 0.419706 +vt 0.250000 0.250000 +s 1 +f 9/16/7 17/31/8 10/17/9 +f 10/17/9 17/31/8 11/19/10 +f 11/19/10 17/31/8 12/21/11 +f 12/21/11 17/31/8 13/23/12 +f 13/23/12 17/31/8 14/25/13 +f 14/25/13 17/31/8 15/28/14 +f 9/15/7 10/18/9 11/20/10 12/22/11 13/24/12 14/26/13 15/27/14 16/29/15 +f 15/28/14 17/31/8 16/30/15 +f 16/30/15 17/31/8 9/16/7 diff --git a/modules/ufbx/data/blender_340_y_up_7400_binary.fbx b/modules/ufbx/data/blender_340_y_up_7400_binary.fbx new file mode 100644 index 0000000..ca8aca5 Binary files /dev/null and b/modules/ufbx/data/blender_340_y_up_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_340_z_up.obj b/modules/ufbx/data/blender_340_z_up.obj new file mode 100644 index 0000000..fa5d98f --- /dev/null +++ b/modules/ufbx/data/blender_340_z_up.obj @@ -0,0 +1,38 @@ +# Blender 3.4.0 +# www.blender.org +o Cube +v 1.000000 3.000000 -2.000000 +v 1.000000 1.000000 -2.000000 +v 1.000000 3.000000 0.000000 +v 1.000000 1.000000 0.000000 +v -1.000000 3.000000 -2.000000 +v -1.000000 1.000000 -2.000000 +v -1.000000 3.000000 0.000000 +v -1.000000 1.000000 0.000000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vt 0.625000 0.500000 +vt 0.375000 0.500000 +vt 0.625000 0.750000 +vt 0.375000 0.750000 +vt 0.875000 0.500000 +vt 0.625000 0.250000 +vt 0.125000 0.500000 +vt 0.375000 0.250000 +vt 0.875000 0.750000 +vt 0.625000 1.000000 +vt 0.625000 0.000000 +vt 0.375000 1.000000 +vt 0.375000 0.000000 +vt 0.125000 0.750000 +s 0 +f 1/1/1 5/5/1 7/9/1 3/3/1 +f 4/4/2 3/3/2 7/10/2 8/12/2 +f 8/13/3 7/11/3 5/6/3 6/8/3 +f 6/7/4 2/2/4 4/4/4 8/14/4 +f 2/2/5 1/1/5 3/3/5 4/4/5 +f 6/8/6 5/6/6 1/1/6 2/2/6 diff --git a/modules/ufbx/data/blender_340_z_up_7400_binary.fbx b/modules/ufbx/data/blender_340_z_up_7400_binary.fbx new file mode 100644 index 0000000..23a95fb Binary files /dev/null and b/modules/ufbx/data/blender_340_z_up_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nxny_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nxny_7400_binary.fbx new file mode 100644 index 0000000..4568da2 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nxny_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nxnz_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nxnz_7400_binary.fbx new file mode 100644 index 0000000..5640137 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nxnz_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nxpy_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nxpy_7400_binary.fbx new file mode 100644 index 0000000..c675e59 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nxpy_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nxpz_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nxpz_7400_binary.fbx new file mode 100644 index 0000000..4b6b092 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nxpz_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nynx_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nynx_7400_binary.fbx new file mode 100644 index 0000000..c009ef3 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nynx_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nynz_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nynz_7400_binary.fbx new file mode 100644 index 0000000..b340d15 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nynz_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nypx_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nypx_7400_binary.fbx new file mode 100644 index 0000000..ff11acd Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nypx_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nypz_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nypz_7400_binary.fbx new file mode 100644 index 0000000..480d995 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nypz_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nznx_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nznx_7400_binary.fbx new file mode 100644 index 0000000..72cb468 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nznx_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nzny_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nzny_7400_binary.fbx new file mode 100644 index 0000000..fada497 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nzny_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nzpx_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nzpx_7400_binary.fbx new file mode 100644 index 0000000..eb5b985 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nzpx_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_nzpy_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_nzpy_7400_binary.fbx new file mode 100644 index 0000000..c2ecddd Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_nzpy_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pxny_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pxny_7400_binary.fbx new file mode 100644 index 0000000..6eb1f72 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pxny_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pxnz_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pxnz_7400_binary.fbx new file mode 100644 index 0000000..7e58d66 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pxnz_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pxpy_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pxpy_7400_binary.fbx new file mode 100644 index 0000000..6c27e24 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pxpy_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pxpz_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pxpz_7400_binary.fbx new file mode 100644 index 0000000..cc632f3 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pxpz_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pynx_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pynx_7400_binary.fbx new file mode 100644 index 0000000..5e141e5 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pynx_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pynz_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pynz_7400_binary.fbx new file mode 100644 index 0000000..597f772 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pynz_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pypx_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pypx_7400_binary.fbx new file mode 100644 index 0000000..5ce3962 Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pypx_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pypz_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pypz_7400_binary.fbx new file mode 100644 index 0000000..b5dd6ef Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pypz_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pznx_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pznx_7400_binary.fbx new file mode 100644 index 0000000..1c9ae1a Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pznx_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pzny_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pzny_7400_binary.fbx new file mode 100644 index 0000000..994000c Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pzny_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pzpx_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pzpx_7400_binary.fbx new file mode 100644 index 0000000..05c791d Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pzpx_7400_binary.fbx differ diff --git a/modules/ufbx/data/blender_axes/axes_pzpy_7400_binary.fbx b/modules/ufbx/data/blender_axes/axes_pzpy_7400_binary.fbx new file mode 100644 index 0000000..5916bef Binary files /dev/null and b/modules/ufbx/data/blender_axes/axes_pzpy_7400_binary.fbx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0000.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0000.mcx new file mode 100644 index 0000000..f4ad47d Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0000.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0001.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0001.mcx new file mode 100644 index 0000000..b028665 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0001.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0002.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0002.mcx new file mode 100644 index 0000000..83b6507 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0002.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0003.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0003.mcx new file mode 100644 index 0000000..ca61dc7 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0003.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0004.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0004.mcx new file mode 100644 index 0000000..742b629 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0004.mcx @@ -0,0 +1 @@ +>>>><>>#>>>BaR8<>P\<>P@<>>#>>ET¼M>=B>>>``````#>>ET™M>pCub>>V/>>><;>BaP>FOR8<>>#>aP@>><>> ">>aP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>O#>aPW<>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ET#>>>>> >aP@<+>=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛSR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M8<>>#>aP@>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>*>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>FBCA><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>>pCubeSha >aP@>#>aP@>><>> ">>*aP>FOR8<>>>#>>ET™M>=B(>>>>Q>pCubephape1>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCu>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>O#>aPW<>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ET#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M8<>>#>aP@M><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe198<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>*aP>FOR8<>>>#>>ET™M>=B(>>>>Q>pCubephape1>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

ape1eShape1>=>O#>aPW<>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ET#>>>>> >aP@>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=Ob>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>N>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>BaapaR8<>P\<>P@<>>#>>ET¼M>=B>>>``````#>>ET™M>pCub>>V/>>><;>BaP>FOR8<>>#>aP@>><>> ">>aP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>O#>aPW<>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ET#>>>>> >aP@<+>=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛSR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>BaP>FOR8<>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>FBCA><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>>pCubeSha >aP@>#>aP@>><>> ">>*aP>FOR8<>>>#>>ET™M>=B(>>>>Q>pCubephape1>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCu>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>O#>aPW<>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ET#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M8<>>#>aP@M><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe198<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>*aP>FOR8<>>>#>>ET™M>=B(>>>>Q>pCubephape1>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

ape1eShape1>=>O#>aPW<>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ET#>>>>> >aP@>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=Ob>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>N>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

ape1eShap1>=>O#>aPW<>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ET#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=Oe1R8<>>#>aP@<>>#>>>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

ape1eShap1>=>O#>aPW<>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ET#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Ba`pe1R8<>>#>?P@<>>#>>Q>>

>>>>#>>>>> >aP@=O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>BaP>FOR8#>>ET™M>pCub>>V/>>><;>BaP>ÛOR8<>>#>aP@>><>> "â>BaP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R5<>>#>aP@<>>#>>ET™M>pCub>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

>>>>#>>>>> >aP@>#>aP@>><>> ">>*aP>FOR8<>>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

ape1eShape1>=>O#>aPW<>><;>BaP>FOR8<>>#>aP@>><>> ">>BaP>FOR8=¾>#>aP@<>>#>>ETªM>pCub>>=>/>BaP>¼>>#>Baape1R8<>>#>aP@<>>#>>pCub>>>>BaP>FOR8<>>#>aP@>><>ET¼M>=B>>>>>Q>>

ape1eShape1>= \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0005.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0005.mcx new file mode 100644 index 0000000..c9c23ae Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0005.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0006.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0006.mcx new file mode 100644 index 0000000..70429db --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0006.mcx @@ -0,0 +1 @@ +>>>><>>#>>>BaR8<>P@<>P@<>>#>>>>>>Q>>

>>>>#>>>>> >aP@<ꃡM>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aPd>><>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BXP>FOR8<>>#>aP@<>>#>ÿÿBaP>>>…M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>#>>>>> >>><>>#¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>O#>R8<>P@<>P@<>>#>>>>>>Q>>

>>>>#>>>>> >aP@<ꃡM>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aPd>><>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>F///>pCub>>#>>ET™M>=B>>>>>Q>OR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BXP>FOR8<>>#>aP@<>>#>ÿÿBaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>#>>>>> >>><>>#¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>O#>aP@<>>#>>ET™M>=B>>>>>Q>>BP@<>>#>>$>BaR8<>P@<>P@<>>#>>ET™M>=B>>>>>Q>>

>>>>#>>>>> >aP@<>ꃡM>pCub>>=>O# aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FaP@<>>#>>ET™M>=B>>>>>Q>>BP@<>>#>>$>BaR8<>P@<>P@<>>#>>ET™M>=B>>>>>Q>>

>>>>#>>>>> >aP@<>ꃡM>pCub>>=>O# aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FORMYCH8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FORDBLA#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M¾pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BXP>FOR8<>>#>aP@<>>#>ÿÿBaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>#>>>>> >>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aPd>><>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>Ã>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BaP>FOR8<>>#>aP@<>>#>>Exape1T™M>pCub>>=>/>BaP>¼>>#>aP@<>Q>>BƒP>>>>>#>>>>, >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@¹>Q>>BaP>>>ePhape>> >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>O#>aP@<>>#>>ET™M>=B>>>>>Q>>BP@<>>#>>$>BaR8<>P@<>>BaR8<>P@<>P@<>>#>>>>>>Q>>

>>>>#>>>>> >aP@<ꃡM>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>€;>BaP>FOR$<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aPd>><>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>D>><;>BaP>FOR8<>>#>aP@>><>>aP>FORDBLA#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M¾pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BXP>FOR8<>>#>aP@<>>#>ÿÿBaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>#>>>>> >>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aPd>><>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BXP>FOR8<>>#>aP@<>>#>ÿÿBaP>>>…M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>#>>>>> >>><>>#¼>># >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>O#>R8<>P@<>P@<>>#>>>>>>Q>>

>>>>#>>>>> >aP@<ꃡM>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><:>fP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aPd>><>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>F///>pCub>>#>>ET™M>=B>>>>>Q>OR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>> >ePhapeXP>FOR8<>>#>aP@<>>#>ÿÿBaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>PT™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>#>>>>> >>><>>#¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>O#>aP@<>>#>>ET™M>=B>>>>>Q>>BP@<>>#>>$>BaR8<>P@<>P@<>>#>>ET™M>=B>>>>>Q>>

>>>>#>>>>> >aP@<>ꃡM>pCub>>=>O# aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FaP@<>>#>>ET™M>=B>>>>>Q>>BP@<>>#>>$>BaR8<>P@<>P@<>>#>>ET™M>=B>>>>>Q>>

>>>>#>>>>> >aP@<>ꃡM>pCub>>=>O# aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FORMYCH8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BaP>FOR8<>>#>aP@<>>#>>Exape1T™M>pCub>>=>/>BaP>¼>>#>aP@<>Q>>BƒP>>>>>#>>>>, >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@¹>Q>>BaP>>>ePhape>> >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>O#>aP@<>>#>>ET™M>=B>>>>>Q>>BP@<>>#>>$>BaR8<>P@<>>BaR8<>P@<>P@<>>#>>>>>>Q>>

>>>>#>>>>> >aP@<ꃡM>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>€;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aPd>><>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FORDBLA#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M¾pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BXP>FOR8<>>#>aP@<>>#>ÿÿBaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>#>>>>> >>><>>#¼>>#>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aaP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>O#>R8<>P@<>P@<>>#>>>>>>Q>>

>>>>#>>>>> >aP@<ꃡM>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCu>Q>>BaP>>>>>#>>>>> >>><>>#>>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>Ba/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aPd>><>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>Ã>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BaP>FOR8<>>#>aP@<>>#>>Exape1T™M>pCub>>=>/>BaP>¼>>#>aP@<>Q>>BƒP>>>>>#>>>>, >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@¹>Q>>BaP>>>ePhape>> >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>O#>aP@<>>#>>ET™M>=B>>>>>Q>>BP@<>>#>>$>BaR8<>P@<>>BaR8<>P@<>P@<>>#>>>>>>Q>>

>>>>#>>>>> >aP@<ꃡM>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>€;>BaP>FOR$<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aPd>><>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FORDBLA#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M¾pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BXP>FOR8<>>#>aP@<>>#>ÿÿBaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>#>>>>> >>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aPd>><>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BXP>FOR8<>>#>aP@<>>#>ÿÿBaP>>>…M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>#>>>>> >>><>>#¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>O#>R8<>P@<>P@<>>#>>>>>>Q>>

>>>>#>>>>> >aP@<ꃡM>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><:>fP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aPd>><>> >>>BXP>FOR8<>>#>aP@<>>#>>ET>BaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#M>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>>aP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>F///>pCub>>#>>ET™M>=B>>>>>Q>OR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>> >ePhapeXP>FOR8<>>#>aP@<>>#>ÿÿBaP>>>™M>pCub]>=>/>BaP>¼>>#>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FO/////////////////////////////////////////////////////>pCub>>#>>ET™M>=B>>>>>Q>>BaP>>>>>#>>>>> >pe1>>BaP>FOR8<>aP>¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>PT™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>#>>>>> >>><>>#¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>O#>aP@<>>#>>ET™M>=B>>>>>Q>>BP@<>>#>>$>BaR8<>P@<>P@<>>#>>ET™M>=B>>>>>Q>>

>>>>#>>>>> >aP@<>ꃡM>pCub>>=>O# aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FaP@<>>#>>ET™M>=B>>>>>Q>>BP@<>>#>>$>BaR8<>P@<>P@<>>#>>ET™M>=B>>>>>Q>>

>>>>#>>>>> >aP@<>ꃡM>pCub>>=>O# aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FORMYCH8<>>#>aP@<>>#>>ET™M>pCub>>>><;>BaP>FOR8<>>#>aP@>><>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>/>BaP>¼>>#>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>BaP>FOR8<>>#>aP@>><>> >>>BaP>FOR8<>>#>aP@<>>#>>Exape1T™M>pCub>>=>/>BaP>¼>>#>aP@<>Q>>BƒP>>>>>#>>>>, >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@<>Q>>BaP>>>>>#>>>>> >>><>>#¼>>#>aP@<>>#>>#/>BaP>¼>>#aaP@<>>#>>ET™FOR8<>>#>aP@<>>#>>ET™f>pCub>>>>BaP>aP@¹>Q>>BaP>>>ePhape>> >>><>>#>#>>>>> >>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>=>O#>aP@<>>#>>ET™M>=B>>>>>Q>>BP@<>>#>>$>BaR8<>P@<>>BaR8<>P@<>P@<>>#>>>>>>Q>>

>>>>#>>>>> >aP@<ꃡM>pCub>>=>O#>aP@<>>#>>ET™M>=B(>>>>Q>>>>BaP>FOR8<>>#>aP@<>>#>>ET™M>pCub>>>>€;=BaP>FOR8<>>#>aP \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0007.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0007.mcx new file mode 100644 index 0000000..d865070 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0007.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0008.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0008.mcx new file mode 100644 index 0000000..9f0c522 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0008.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0009.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0009.mcx new file mode 100644 index 0000000..28a082d Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0009.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0010.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0010.mcx new file mode 100644 index 0000000..437182f Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0010.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0011.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0011.mcx new file mode 100644 index 0000000..7305623 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0011.mcx @@ -0,0 +1 @@ +v \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0012.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0012.mcx new file mode 100644 index 0000000..e46a595 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0012.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0013.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0013.mcx new file mode 100644 index 0000000..db8610d Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0013.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0014.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0014.mcx new file mode 100644 index 0000000..6e56436 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0014.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0015.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0015.mcx new file mode 100644 index 0000000..6c573ca Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0015.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0016.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0016.mcx new file mode 100644 index 0000000..cb94b6b Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0016.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0017.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0017.mcx new file mode 100644 index 0000000..d1c0508 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0017.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0018.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0018.mcx new file mode 100644 index 0000000..e610899 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0018.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0019.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0019.mcx new file mode 100644 index 0000000..322e76e Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0019.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0020.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0020.mcx new file mode 100644 index 0000000..bf00343 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0020.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0021.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0021.mcx new file mode 100644 index 0000000..ef461f2 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0021.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0022.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0022.mcx new file mode 100644 index 0000000..07e5d41 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0022.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0023.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0023.mcx new file mode 100644 index 0000000..0f338ca Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0023.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0024.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0024.mcx new file mode 100644 index 0000000..5aa167c Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0024.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0025.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0025.mcx new file mode 100644 index 0000000..70a3c39 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0025.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0026.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0026.mcx new file mode 100644 index 0000000..707e77f Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0026.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0027.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0027.mcx new file mode 100644 index 0000000..8a0a8c9 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0027.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0028.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0028.mcx new file mode 100644 index 0000000..447f44b Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0028.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0029.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0029.mcx new file mode 100644 index 0000000..babb441 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0029.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0030.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0030.mcx new file mode 100644 index 0000000..f2459f7 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0030.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0031.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0031.mcx new file mode 100644 index 0000000..fd675dc Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0031.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0032.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0032.mcx new file mode 100644 index 0000000..24b1530 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0032.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0033.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0033.mcx new file mode 100644 index 0000000..7a77151 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0033.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0034.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0034.mcx new file mode 100644 index 0000000..0e174ed Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0034.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0035.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0035.mcx new file mode 100644 index 0000000..39bdd92 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0035.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0036.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0036.mcx new file mode 100644 index 0000000..ea6fcc8 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0036.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0037.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0037.mcx new file mode 100644 index 0000000..777b821 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0037.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0038.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0038.mcx new file mode 100644 index 0000000..4f3a523 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0038.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0039.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0039.mcx new file mode 100644 index 0000000..6af1bd8 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0039.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0040.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0040.mcx new file mode 100644 index 0000000..cbb7bce Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0040.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0041.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0041.mcx new file mode 100644 index 0000000..2cac70b Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0041.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0042.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0042.mcx new file mode 100644 index 0000000..7769bda Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0042.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0043.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0043.mcx new file mode 100644 index 0000000..c4d9aed Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0043.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0044.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0044.mcx new file mode 100644 index 0000000..7f796ba Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0044.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0045.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0045.mcx new file mode 100644 index 0000000..a2aceed Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0045.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0046.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0046.mcx new file mode 100644 index 0000000..66bab50 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0046.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0047.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0047.mcx new file mode 100644 index 0000000..7271cd8 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0047.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0048.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0048.mcx new file mode 100644 index 0000000..9f0f2b4 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0048.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0049.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0049.mcx new file mode 100644 index 0000000..aa22cd9 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0049.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0050.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0050.mcx new file mode 100644 index 0000000..8a1628f Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0050.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0051.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0051.mcx new file mode 100644 index 0000000..eff8759 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0051.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0052.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0052.mcx new file mode 100644 index 0000000..f0745f0 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0052.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0053.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0053.mcx new file mode 100644 index 0000000..2180a51 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0053.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0054.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0054.mcx new file mode 100644 index 0000000..c0b716c Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0054.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0055.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0055.mcx new file mode 100644 index 0000000..179e0db Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0055.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0056.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0056.mcx new file mode 100644 index 0000000..2ebfd97 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0056.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0057.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0057.mcx new file mode 100644 index 0000000..8c01037 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0057.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0058.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0058.mcx new file mode 100644 index 0000000..ac5f154 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0058.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0059.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0059.mcx new file mode 100644 index 0000000..4c2049d Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0059.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0060.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0060.mcx new file mode 100644 index 0000000..872a208 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0060.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0061.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0061.mcx new file mode 100644 index 0000000..d92f403 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0061.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0062.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0062.mcx new file mode 100644 index 0000000..3eda58d Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0062.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0063.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0063.mcx new file mode 100644 index 0000000..25eb449 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0063.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0064.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0064.mcx new file mode 100644 index 0000000..5a7ea66 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0064.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0065.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0065.mcx new file mode 100644 index 0000000..c431d80 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0065.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0066.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0066.mcx new file mode 100644 index 0000000..1ba7685 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0066.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0067.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0067.mcx new file mode 100644 index 0000000..d71fc2c Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0067.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0068.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0068.mcx new file mode 100644 index 0000000..9c94887 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0068.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0069.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0069.mcx new file mode 100644 index 0000000..a719645 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0069.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0070.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0070.mcx new file mode 100644 index 0000000..f9c6a4d Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0070.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0071.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0071.mcx new file mode 100644 index 0000000..a6e83bc Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0071.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0072.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0072.mcx new file mode 100644 index 0000000..5dc32f9 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0072.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0073.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0073.mcx new file mode 100644 index 0000000..0e67c70 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0073.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0074.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0074.mcx new file mode 100644 index 0000000..77a974f Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0074.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0075.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0075.mcx new file mode 100644 index 0000000..2330fda Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0075.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0076.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0076.mcx new file mode 100644 index 0000000..51f402f Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0076.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0077.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0077.mcx new file mode 100644 index 0000000..2209680 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0077.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0078.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0078.mcx new file mode 100644 index 0000000..c7d073a Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0078.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0079.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0079.mcx new file mode 100644 index 0000000..a749006 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0079.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0080.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0080.mcx new file mode 100644 index 0000000..b34dee4 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0080.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0081.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0081.mcx new file mode 100644 index 0000000..66aaa6e Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0081.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0082.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0082.mcx new file mode 100644 index 0000000..6c573ca Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0082.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0083.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0083.mcx new file mode 100644 index 0000000..cb94b6b Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0083.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0084.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0084.mcx new file mode 100644 index 0000000..d1c0508 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0084.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0085.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0085.mcx new file mode 100644 index 0000000..e610899 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0085.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0086.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0086.mcx new file mode 100644 index 0000000..322e76e Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0086.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0087.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0087.mcx new file mode 100644 index 0000000..bf00343 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0087.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0088.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0088.mcx new file mode 100644 index 0000000..ef461f2 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0088.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0089.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0089.mcx new file mode 100644 index 0000000..0f338ca Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0089.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0090.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0090.mcx new file mode 100644 index 0000000..5aa167c Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0090.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0091.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0091.mcx new file mode 100644 index 0000000..70a3c39 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0091.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0092.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0092.mcx new file mode 100644 index 0000000..3d9bba7 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0092.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0093.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0093.mcx new file mode 100644 index 0000000..3b8ee27 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0093.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0094.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0094.mcx new file mode 100644 index 0000000..3b4e26e Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0094.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0095.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0095.mcx new file mode 100644 index 0000000..09e6a12 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0095.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0096.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0096.mcx new file mode 100644 index 0000000..5b297ba Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0096.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0097.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0097.mcx new file mode 100644 index 0000000..5f1c57b Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0097.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0098.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0098.mcx new file mode 100644 index 0000000..abc32df Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0098.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0099.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0099.mcx new file mode 100644 index 0000000..f549d31 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0099.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0100.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0100.mcx new file mode 100644 index 0000000..3858575 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0100.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0101.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0101.mcx new file mode 100644 index 0000000..5a3182c Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0101.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0102.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0102.mcx new file mode 100644 index 0000000..eed9847 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0102.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0103.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0103.mcx new file mode 100644 index 0000000..7e48409 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0103.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0104.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0104.mcx new file mode 100644 index 0000000..e843d5c --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0104.mcx @@ -0,0 +1 @@ +FèOR \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0105.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0105.mcx new file mode 100644 index 0000000..db41aa9 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0105.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0106.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0106.mcx new file mode 100644 index 0000000..e67d178 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0106.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0107.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0107.mcx new file mode 100644 index 0000000..f5babee --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0107.mcx @@ -0,0 +1 @@ +FORRRRRRÿÿÿ€RCHVRS \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0108.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0108.mcx new file mode 100644 index 0000000..5aaa3e3 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0108.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0109.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0109.mcx new file mode 100644 index 0000000..1d6334b Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0109.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0110.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0110.mcx new file mode 100644 index 0000000..1e8dcc5 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0110.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0111.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0111.mcx new file mode 100644 index 0000000..39a9306 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0111.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0112.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0112.mcx new file mode 100644 index 0000000..52380ee Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0112.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0113.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0113.mcx new file mode 100644 index 0000000..bcdc14b Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0113.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0114.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0114.mcx new file mode 100644 index 0000000..1f53200 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0114.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0115.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0115.mcx new file mode 100644 index 0000000..fe3fde4 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0115.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0116.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0116.mcx new file mode 100644 index 0000000..27d5ff9 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0116.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0117.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0117.mcx new file mode 100644 index 0000000..68286d2 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0117.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0118.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0118.mcx new file mode 100644 index 0000000..83e1002 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0118.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0119.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0119.mcx new file mode 100644 index 0000000..4c4323c --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0119.mcx @@ -0,0 +1 @@ +ÿ%Tÿ@@@@@@@@@@@@@@@@@@@@@@@@%T@@@@@@@@@@@@@@@@@@@%TIMEVKIME \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0120.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0120.mcx new file mode 100644 index 0000000..268d96b Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0120.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0121.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0121.mcx new file mode 100644 index 0000000..eb6c04f Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0121.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0122.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0122.mcx new file mode 100644 index 0000000..aafa0d6 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0122.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0123.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0123.mcx new file mode 100644 index 0000000..f0883df Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0123.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0124.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0124.mcx new file mode 100644 index 0000000..bffc7b9 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0124.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0125.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0125.mcx new file mode 100644 index 0000000..351e4bf --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0125.mcx @@ -0,0 +1 @@ +HH&FVCHHHHHHHHHHÿÿÿ€4EMYCHTIM8oh! \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0142.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0142.mcx new file mode 100644 index 0000000..9e4f183 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0142.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0143.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0143.mcx new file mode 100644 index 0000000..6c1ce3c --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0143.mcx @@ -0,0 +1 @@ + Ÿ HBBBB- — õH>VRSRSNÿåÿ \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0144.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0144.mcx new file mode 100644 index 0000000..7caf759 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0144.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0145.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0145.mcx new file mode 100644 index 0000000..1d197a1 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0145.mcx @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0146.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0146.mcx new file mode 100644 index 0000000..1634433 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0146.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0147.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0147.mcx new file mode 100644 index 0000000..57a347c Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0147.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0148.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0148.mcx new file mode 100644 index 0000000..9910517 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0148.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0149.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0149.mcx new file mode 100644 index 0000000..d546088 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0149.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0150.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0150.mcx new file mode 100644 index 0000000..798168a Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0150.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0151.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0151.mcx new file mode 100644 index 0000000..519e02c Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0151.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0152.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0152.mcx new file mode 100644 index 0000000..3e5d2d7 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0152.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0153.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0153.mcx new file mode 100644 index 0000000..0c7f0f7 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0153.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0154.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0154.mcx new file mode 100644 index 0000000..a21d328 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0154.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0155.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0155.mcx new file mode 100644 index 0000000..b10384f Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0155.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0156.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0156.mcx new file mode 100644 index 0000000..8e4aedc Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0156.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0157.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0157.mcx new file mode 100644 index 0000000..84a52c6 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0157.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0158.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0158.mcx new file mode 100644 index 0000000..7613149 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0158.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0159.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0159.mcx new file mode 100644 index 0000000..2e06956 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0159.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0160.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0160.mcx new file mode 100644 index 0000000..0f4228b Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0160.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0161.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0161.mcx new file mode 100644 index 0000000..4f47a54 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0161.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0162.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0162.mcx new file mode 100644 index 0000000..7b2b10e --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0162.mcx @@ -0,0 +1 @@ +Cò7MFSTIM2< \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0166.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0166.mcx new file mode 100644 index 0000000..7fd02b4 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0166.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0167.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0167.mcx new file mode 100644 index 0000000..7d469eb Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0167.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0168.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0168.mcx new file mode 100644 index 0000000..9532bc9 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0168.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0169.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0169.mcx new file mode 100644 index 0000000..ba02e9f --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0169.mcx @@ -0,0 +1 @@ +CCACHACVR3F= \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0177.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0177.mcx new file mode 100644 index 0000000..2d7ef0c --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0177.mcx @@ -0,0 +1 @@ +<<<<<<<<<TTACVRACVR3F= \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0211.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0211.mcx new file mode 100644 index 0000000..fff6932 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0211.mcx @@ -0,0 +1 @@ +??????????????û \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0212.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0212.mcx new file mode 100644 index 0000000..c24f8ea Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0212.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0213.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0213.mcx new file mode 100644 index 0000000..447a30a Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0213.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0214.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0214.mcx new file mode 100644 index 0000000..09eff06 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0214.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0215.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0215.mcx new file mode 100644 index 0000000..e25954d Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0215.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0216.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0216.mcx new file mode 100644 index 0000000..5ba7a9c --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0216.mcx @@ -0,0 +1 @@ +ACVR \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0217.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0217.mcx new file mode 100644 index 0000000..f40c195 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0217.mcx @@ -0,0 +1 @@ +ACVRApCuApCuApCub<>A<>A_VR_VR<>A__VR<>A_VRAACVR^VR3F \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0222.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0222.mcx new file mode 100644 index 0000000..ce9a565 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0222.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0223.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0223.mcx new file mode 100644 index 0000000..25df0fc Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0223.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0224.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0224.mcx new file mode 100644 index 0000000..fe864ca Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0224.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0225.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0225.mcx new file mode 100644 index 0000000..58f73f6 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0225.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0226.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0226.mcx new file mode 100644 index 0000000..91781d3 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0226.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0227.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0227.mcx new file mode 100644 index 0000000..8923cc3 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0227.mcx @@ -0,0 +1 @@ +RACVR \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0228.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0228.mcx new file mode 100644 index 0000000..645a564 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0228.mcx @@ -0,0 +1 @@ +AA:VRCVR \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0229.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0229.mcx new file mode 100644 index 0000000..6af6344 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0229.mcx @@ -0,0 +1 @@ +GSCVRSCVR \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0230.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0230.mcx new file mode 100644 index 0000000..ee94d52 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0230.mcx @@ -0,0 +1 @@ +S5ZEAæAæTRACVRAR< \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0231.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0231.mcx new file mode 100644 index 0000000..624565d --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0231.mcx @@ -0,0 +1 @@ +ACRAC«FOR>AC«F \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0232.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0232.mcx new file mode 100644 index 0000000..ef1cc48 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0232.mcx @@ -0,0 +1 @@ +<>RGFOR>ACVRdAæTRACVRAR< \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0235.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0235.mcx new file mode 100644 index 0000000..1a91314 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0235.mcx @@ -0,0 +1 @@ +S5ZEAæ<ÿR>AæTRACVRAsAs< \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0236.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0236.mcx new file mode 100644 index 0000000..69086fa --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0236.mcx @@ -0,0 +1 @@ +S5ZEAæAæAæRCVRæTRACAæRAR< \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0237.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0237.mcx new file mode 100644 index 0000000..4c4e9af --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0237.mcx @@ -0,0 +1 @@ +SRZE.FO>Ap!!!F>AR<æTRo \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0241.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0241.mcx new file mode 100644 index 0000000..378d632 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0241.mcx @@ -0,0 +1 @@ +S5ZEAæAæT`RRARAR' \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0242.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0242.mcx new file mode 100644 index 0000000..a1e572e --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0242.mcx @@ -0,0 +1 @@ + ßACVR h dAæTRdRRAR \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0244.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0244.mcx new file mode 100644 index 0000000..2909b57 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0244.mcx @@ -0,0 +1 @@ +S5ZES5ZAædæd<dO>AR< \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0245.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0245.mcx new file mode 100644 index 0000000..1d86cde --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0245.mcx @@ -0,0 +1 @@ +S5ZES5ZEAæd<>SAæd<>TRAR< \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0246.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0246.mcx new file mode 100644 index 0000000..9d87c86 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0246.mcx @@ -0,0 +1 @@ +Spe15STdRæTRACVddAæTRACæTRACVR \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0247.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0247.mcx new file mode 100644 index 0000000..d776c0f --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0247.mcx @@ -0,0 +1 @@ +S5R>CVRddAæTRACVRZDBACVR \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0248.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0248.mcx new file mode 100644 index 0000000..fd4e818 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0248.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0249.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0249.mcx new file mode 100644 index 0000000..a5e2276 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0249.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0250.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0250.mcx new file mode 100644 index 0000000..d515dd3 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0250.mcx @@ -0,0 +1 @@ +&ORDòÿÿ@FOR4RAChV@RSNm8ÿòLDŒUIMESFOR4IZFÿNI:@@moUIDV¥AMFOV¥AMFORQQQºNm¿B4SFQQQQQQQQQQQQQQ8ÿòEÿIMChV@RSNm8ÿòLDŒUIMESFOR4LDœ \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0251.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0251.mcx new file mode 100644 index 0000000..b706297 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0251.mcx @@ -0,0 +1 @@ +xETIMap!!!Ap!!!Ap!!!!>Ap!!!!6Ap!!!Ap!!!!>!!!6A \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0324.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0324.mcx new file mode 100644 index 0000000..d5256f4 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0324.mcx @@ -0,0 +1 @@ +xE!!!!!!!>Ap!!!=p!!!!6!=p!!!!>Ap!!!!6Ap!Ap!!!!!>Ap!!!Ap!Ap!!!Ap!!!Ap!Ap!!!!!>Ap!!!Ap!Ap!!!!6!6!A!!Apd!!Ap!!!Ap!!!Cÿÿ!)!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0355.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0355.mcx new file mode 100644 index 0000000..63fd669 Binary files /dev/null and b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0355.mcx differ diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0356.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0356.mcx new file mode 100644 index 0000000..8933f93 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0356.mcx @@ -0,0 +1 @@ +EYIMCaCÿÿ!<·STIJ>MYE!FOR귡MYE!FOR&#!!MYE!FOR&#!!¹!!?!;S;€_CMYCHKp!d!!!FBCA!Ap!C!¹!!!?!;S;€peMYCHAš!IMM5!MYE!FOR&#!!MYE!FOR&#!!MYE!FOR&#!!MYE!FOR&#!!MYE!FOR&#!!d!!!;;€_ !;S!MY5ubeS>!Ud!!!;S;€_ MOR!!;S;€_ MOR!MY!<!MOR!MY!<!!!MOR!MY!<!MOR!MOR!MY!<!MOR!MY!YIM CSTIJ>!MOR!MY!<!MOR!MOR!MY!<!MOR!MY!<MYE!FOR­''''''''''''''VCAd!!!FBCA!@MYE!FOR­VCAá!A!ÿS;€pSM­''@; \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0363.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0363.mcx new file mode 100644 index 0000000..78b0126 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0363.mcx @@ -0,0 +1 @@ +EYICÿIJ>MYE!FR­VS;€pSM­VCS!A;OR­VCAd!A!ÿS;€pSMYE!FR­VCAd!!!FBCA!A; \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0364.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0364.mcx new file mode 100644 index 0000000..b91457a --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0364.mcx @@ -0,0 +1 @@ +EYICÿIJ>MYE!FOR­VCAd!A!ÿapdhÿJ>MYE!E!FOR­VcAd!A!ÿS;€pSMYE!FOR OS;€pSMYE!FOR­VS;€pSMYE!FOR­VCAd!!!FBCÿS;€pSMYE!E!FOR­VCAd!A!ÿS;€pSMYE!FOR ORS;€pSMYE!FOR­VCAd!A!ÿS;€pSMYE!FOR­VCAd!!!FBCA!A;FOR; \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0365.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0365.mcx new file mode 100644 index 0000000..0095e05 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0365.mcx @@ -0,0 +1 @@ +EYIMCaCÿÿ!<·ST귡MYE!FOR귡MYE!FOR귡MYE!FOR귡MYE!FOR&ÿÿÿe1MYE!FOR&ÿÿÿe1MYE!FOR귡MYE!FOR귡MYE!FOR귡!!!?!;S;€YEYIMCaCÿÿ!<·STIJ>MYE!FOR귡MYE!FOR&#!!MYE!FOR&#!!¹!!?!;S; _CMYCHKp!d!!!FBCA!Ap!C!¹!!!?!;S;€peMYCHAš!IMM5!MYE!FORd!!!FBCA!Ap!C!¹!!!?!;S;€_CMYCHKp!!bpSsapeMYCHAš!IMM5!pe1MYE!FOR&#!!¹!!?!;S; _CMYCHKp!d!!!FBCA!Ap!C!¹!!!?!;S;€peMYCHAš!IMM5!MYE!FOR&#!!MYE!FOR&#!!MYE!FOR&#!!¹!!?!;S; _CMYCHKp!d!!!FBCA!Ap!C!¹!!!?!;S;€peMYCHAš!IMM5!MYE!FOR&#!!MYE!FOR&#!!¹!!?!;S; _CMYCHKp!d!!!FBCA!Ap!C!¹!!!?!;S;€peMYCHAš!IMM5!MYE!FOR&#!!??4ÿ???ÿ?4ÿ??eeShape1TTeeSh??D?~pChape1TTeeSh??D?~pChape1TN?>TT¼?4?>TTTTpChTpe1 TTT?4??G?>TTTpChTpe1 pC1Tpe1TTTIJ>MPE!FOR�A!Ap!C!¹!!a?!;S;€_CMYC€555pe15755555555555555555�ÿ5555555555555555ubeShapÿÿ!TIJ>MPE!FOR�!TIJ>MPE!FOR򇨣SIZE5555555551!MPE)!FOR�!TIJ>MPE!FOR�SIZE5555555551!MPE)!FOR�!TIJ>MPE!FOR!C!¹!!a?!;S;€_CMYC€555pe15755555555555555555�ÿ5555555555555555ubeShapÿÿ!TIJ>MPE!FOR�!TIJ>MPE!FOR5555555555555A!Ap!C!¹!!a?!;S;€_CMYC€555pe1575555555555555555YGM CaaCpC5555555555555555555555555555ÿ555555MPE!FOR�!TIJ>MPE!FOR�A!Ap!C!¹!!a?!;S;€_CMYC€555pe15755555555555555555�ÿ5555555555555555ubeShapÿÿ!TIJ>MPE!FOR�!TIJ>MPE!FOR�!TIAp!!!TIAp!!! RR RR> R  R RR> RR RR> R  R RR> \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/mcx/fuzz_0392.mcx b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0392.mcx new file mode 100644 index 0000000..5a79092 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/mcx/fuzz_0392.mcx @@ -0,0 +1 @@ + RR RR> RR RGFGR>R RR> R  RR> R  R RGFGR>R RR> R RR RR> RR RR RR> R  RR> RR RGFGR>R RR> RR RGFGR>R RR> <R> R  RR> RR RGFGR>R RR> + + + \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/xml/fuzz_0135.xml b/modules/ufbx/data/cache_fuzz/xml/fuzz_0135.xml new file mode 100644 index 0000000..7c7383a --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/xml/fuzz_0135.xml @@ -0,0 +1,11 @@ + + + diff --git a/modules/ufbx/data/cache_fuzz/xml/fuzz_0136.xml b/modules/ufbx/data/cache_fuzz/xml/fuzz_0136.xml new file mode 100644 index 0000000..63c6944 --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/xml/fuzz_0136.xml @@ -0,0 +1 @@ +< 9 ! a \ No newline at end of file diff --git a/modules/ufbx/data/cache_fuzz/xml/fuzz_0137.xml b/modules/ufbx/data/cache_fuzz/xml/fuzz_0137.xml new file mode 100644 index 0000000..a0d65ed --- /dev/null +++ b/modules/ufbx/data/cache_fuzz/xml/fuzz_0137.xml @@ -0,0 +1,10 @@ + + + !cacheType Type="OneFile" Format="mcx"/> +

Bitmap Random Tiling

"&cr;&lf; "Look up a bitmap from passed in UV coordinates and modify each "&cr;&lf; "repetition of the bitmap such that tiling is not evident. Has "&cr;&lf; "a mode to properly transform normal maps. Outputs the "&cr;&lf; "modified UV so it can be hooked up to other Bitmap Lookup shaders "&cr;&lf; "to apply the identical randomness, plus outputs the Random Index "&cr;&lf; "itself to drive downstream modifications that are in sync with it.",&cr;&lf; string label = "Bitmap Random Tiling",&cr;&lf; string version = "1.0" ]]&cr;&lf;( &cr;&lf; point Pos = point(u,v,0) &cr;&lf; [[ string label= "UV Coordinate", &cr;&lf; string help = "The 2D coordinate at which the texture is looked up." ]],&cr;&lf; float Scale = 0.25&cr;&lf; [[ string help = "A linear scale factor. For more complex UV manipulation, connect the UVWTransform." ]], &cr;&lf; &cr;&lf; string Filename = "uv-grid.png" &cr;&lf; [[ string widget="filename", &cr;&lf; string label="File name",&cr;&lf; string help="The name of the texture to look up" ]], &cr;&lf; int NormalMap = 0 &cr;&lf; [[ string widget="checkBox", &cr;&lf; string packName = "Normal Map",&cr;&lf; string label = "Normal Map",&cr;&lf; int connectable = 0,&cr;&lf; string help="If the texture is a normal map, special transformations have to be applied to retain the proper orientation upon rotation. Check this box if the texture is a normal map." ]],&cr;&lf; int NormalFlipR = 0 &cr;&lf; [[ string widget="checkBox", &cr;&lf; string packName = "Normal Map",&cr;&lf; string label = "Flip Red",&cr;&lf; int connectable = 0,&cr;&lf; string help="Invert red component for rotation of normal maps." ]],&cr;&lf; int NormalFlipG = 0 &cr;&lf; [[ string widget="checkBox", &cr;&lf; string packName = "Normal Map",&cr;&lf; string label = "Flip Green",&cr;&lf; int connectable = 0, &cr;&lf; string help="Invert green component for rotation of normal maps." ]],&cr;&lf; string Filename_UDIMList = "" &cr;&lf; [[ string label="Viewport UDIM List",&cr;&lf; int connectable = 0,&cr;&lf; string help="The list of UDIM items to load into the viewport. If empty, will be deduced from the file system automatically. " ]], &cr;&lf; string LoadUDIM = "Load UDIM..." &cr;&lf; [[ string widget="max:actionButton", &cr;&lf; string actionID="loadUDIM(\"Filename\")",&cr;&lf; string help="Select a set of files to load as an UDIM.",&cr;&lf; int connectable = 0 ]], &cr;&lf; int UDIM = 0&cr;&lf; [[ string widget="checkBox", string label="UDIM-compatible lookup",&cr;&lf; int connectable = 0,&cr;&lf; string help ="Modifies the UV coordinate so that UDIM's are looked up similar to the max MultiTile map" ]], &cr;&lf; string WrapMode = "periodic"&cr;&lf; [[ string widget="popup", string options = "default|black|clamp|periodic|mirror",&cr;&lf; string label="Wrap Mode",&cr;&lf; string help="How the texture wraps: (black, clamp, periodic or mirror)." ]], &cr;&lf;&cr;&lf; int Randomize = 1 &cr;&lf; [[ string help = &cr;&lf; "Enables all randomization. Can be disabled for debugging purposes. ",&cr;&lf; int connectable=0 ]],&cr;&lf; int RandomizePos = 1 &cr;&lf; [[ string help = &cr;&lf; "Enables randomization in UV space by making a 'distorted grid' and "&cr;&lf; "apply one variation in each 'square' of the grid. "&cr;&lf; "If this is OFF, no spatially varying randomness occurs. "&cr;&lf; "There is still variation per Seed value. If Seed is driven from "&cr;&lf; "e.g. a Node Handle map, this gives one random value per object.",&cr;&lf; int connectable=0 ]],&cr;&lf; float RandScale = 1.0&cr;&lf; [[ string help = &cr;&lf; "Scale of the 'distorted grid' in relation to UV space. "&cr;&lf; "A value of 1.0 means the 'distorted grid' is the same size as a "&cr;&lf; "unit square in UV space, a smaller number makes the grid smaller and "&cr;&lf; "a larger value makes it larger. "&cr;&lf; "A value of zero disables spatially varying randomness "&cr;&lf; "but still makes a variation per Seed value. If Seed is driven from "&cr;&lf; "e.g. a Node Handle map, this gives one random value per object." ]],&cr;&lf;&cr;&lf;&cr;&lf; float WiggleScale = 0.2 [[ string help="Scale of the 'wiggliness' of edges, in relation to the UV space" ]],&cr;&lf; float WiggleAmount = 0.25 &cr;&lf; [[ float min=0.0, float max=10.0,&cr;&lf; string help="Amount of 'wiggliness' on the edge of the randomness grid, to obscure the fact that it is a grid."&cr;&lf; ]],&cr;&lf; float EdgeFuzz = 0.1 &cr;&lf; [[ float min=0.0, float max=10.0,&cr;&lf; string help="Amount of 'crossfade' at the edge of the randomness grid. Note this is computed stochastically and may introduce some noisiness. "&cr;&lf; ]],&cr;&lf;&cr;&lf; &cr;&lf; float RotMin = 0.0 [[ float min=-360.0, float max=360.0 ]],&cr;&lf; float RotMax = 360.0 [[ float min=-360.0, float max=360.0 ]],&cr;&lf; float ScaleMin = 1.0 [[ float min= 0.1, float max=10.0 ]],&cr;&lf; float ScaleMax = 1.0 [[ float min= 0.1, float max=10.0 ]],&cr;&lf; float UOffset = 0.0,&cr;&lf; float VOffset = 0.0,&cr;&lf; &cr;&lf; int Seed = 0 [[ string help = "Random seed. Connect to e.g. Node Handle map to have per-object randomness" ]],&cr;&lf; &cr;&lf; vector HSVMin = vector(0.0,1.0,1.0),&cr;&lf; vector HSVMax = vector(0.0,1.0,1.0), &cr;&lf;&cr;&lf;&cr;&lf; int AutoGamma = 1 &cr;&lf; [[ string widget="checkBox", int connectable=0 ]],&cr;&lf; float ManualGamma = 1.0 &cr;&lf; [[ string label="Manual Gamma" ]],&cr;&lf;&cr;&lf; &cr;&lf; &cr;&lf; output color Col = 0 [[ string label="Col (RGB)" ]],&cr;&lf; output float R = 0,&cr;&lf; output float G = 0,&cr;&lf; output float B = 0,&cr;&lf; output float A = 1,&cr;&lf; output float Luminance = 0,&cr;&lf; output float Average = 0,&cr;&lf; output point UV = 0,&cr;&lf; output int RandomIndex = 0,&cr;&lf;)&cr;&lf;{&cr;&lf; // Skip empty files&cr;&lf; if (Filename == "")&cr;&lf; return;&cr;&lf; &cr;&lf; point p = Pos / Scale;&cr;&lf; &cr;&lf; point noisepoint = 0; &cr;&lf; &cr;&lf; if (RandomizePos) &cr;&lf; {&cr;&lf; point wigglepoint = p / WiggleScale;&cr;&lf; noisepoint = p / RandScale + (noise(wigglepoint, Seed)-point(0.5,0.5,0.0)) * WiggleAmount + noise("hash", p) * EdgeFuzz;&cr;&lf; }&cr;&lf; &cr;&lf; point rotscale = Randomize?noise("cell", noisepoint, Seed + 10):0;&cr;&lf; point position = Randomize?noise("cell", noisepoint, Seed + 11) - point(0.5,0.5,0.0):0; &cr;&lf; point hsvchange = Randomize?noise("cell", noisepoint, Seed + 12):0; &cr;&lf;&cr;&lf; // Output one of the randomizers so people can do external randomization&cr;&lf; // based on these&cr;&lf; RandomIndex = int(rotscale[2] * 500000000);&cr;&lf;&cr;&lf; // Compute the actual rotation (in radians) &cr;&lf; float rotation = radians(mix(RotMin, RotMax, rotscale[0]));&cr;&lf;&cr;&lf; vector hsvTweak = mix(HSVMin, HSVMax, hsvchange);&cr;&lf; &cr;&lf; p -= point(0.5,0.5,0.0);&cr;&lf; &cr;&lf; p = rotate(p, rotation, 0.0, vector(0.0,0.0,1.0));&cr;&lf; p /= mix(ScaleMin, ScaleMax, rotscale[1]);&cr;&lf; p += point(position[0] * UOffset, position[1] * VOffset, 0.0);&cr;&lf; &cr;&lf; p += point(0.5,0.5,0.0);&cr;&lf; &cr;&lf; UV = p;&cr;&lf;&cr;&lf; // Default lookup, just use u and inverted v...&cr;&lf; float ulookup = p[0];&cr;&lf; float vlookup = 1.0 - p[1];&cr;&lf; &cr;&lf; // But for UDIM compatibility and max's idea that 0,0 is in &cr;&lf; // lower left corner, we need this juggling of v....&cr;&lf; if (UDIM)&cr;&lf; {&cr;&lf; float vfloor = floor(p[1]);&cr;&lf; float vfrac = p[1] - vfloor;&cr;&lf; vlookup = vfloor + (1.0 - vfrac);&cr;&lf; }&cr;&lf; &cr;&lf; Col = texture(Filename, ulookup, vlookup, "wrap", WrapMode, "alpha", A);&cr;&lf;&cr;&lf; if (NormalMap == 0)&cr;&lf; { &cr;&lf; color hsv = transformc("rgb", "hsv", Col);&cr;&lf; hsv[0] += hsvTweak[0]; // Offset the hue&cr;&lf; //hsv[1] *= hsvTweak[1]; // Scale the saturation&cr;&lf; hsv[2] *= hsvTweak[2]; // Scale the value&cr;&lf; Col = transformc("hsv", "rgb", hsv); &cr;&lf; // Simulate saturation via gamma - more visually pleasing&cr;&lf; Col = pow(Col, hsvTweak[1]); &cr;&lf; }&cr;&lf; else&cr;&lf; {&cr;&lf; // Flip components if needed&cr;&lf; if (NormalFlipR) Col[0] = 1.0 - Col[0];&cr;&lf; if (NormalFlipG) Col[1] = 1.0 - Col[1];&cr;&lf; &cr;&lf; Col = rotate(Col, rotation, point(0.5,0.5,0.0), point(0.5,0.5,1.0));&cr;&lf; &cr;&lf; // Flip components back if needed&cr;&lf; if (NormalFlipR) Col[0] = 1.0 - Col[0];&cr;&lf; if (NormalFlipG) Col[1] = 1.0 - Col[1];&cr;&lf; }&cr;&lf; &cr;&lf; &cr;&lf; int channels;&cr;&lf; gettextureinfo(Filename, "channels", channels);&cr;&lf; if (channels < 4) // No alpha? Set it to opaque&cr;&lf; {&cr;&lf; A = 1.0;&cr;&lf;&cr;&lf; if (WrapMode == "black") // 2018-04-25: Allow Decals&cr;&lf; {&cr;&lf; if (p[0] < 0.0 || p[0] > 1.0 ||&cr;&lf; p[1] < 0.0 || p[1] > 1.0)&cr;&lf; A = 0.0;&cr;&lf; }&cr;&lf; }&cr;&lf; &cr;&lf; if (!NormalMap)&cr;&lf; {&cr;&lf; // Temporary workaround for color space issues&cr;&lf; if (AutoGamma)&cr;&lf; {&cr;&lf; if (!endswith(Filename, ".exr") &&&cr;&lf; !endswith(Filename, ".EXR") &&&cr;&lf; !endswith(Filename, ".hdr") &&&cr;&lf; !endswith(Filename, ".HDR") &&&cr;&lf; !endswith(Filename, ".tx") &&&cr;&lf; !endswith(Filename, ".TX"))&cr;&lf; {&cr;&lf; // Gamma 2.2 for sRGB approx)&cr;&lf; Col = pow(Col, 2.2);&cr;&lf; }&cr;&lf; }&cr;&lf; else&cr;&lf; {&cr;&lf; if (ManualGamma != 1.0)&cr;&lf; Col = pow(Col, ManualGamma);&cr;&lf; }&cr;&lf; }&cr;&lf; &cr;&lf; R = Col[0];&cr;&lf; G = Col[1];&cr;&lf; B = Col[2];&cr;&lf; Luminance = luminance(Col);&cr;&lf; Average = (R + G + B) / 3.0;&cr;&lf;}" + + Property: "3dsMax|params|OSLAutoUpdate", "Bool", "A",1 + Property: "3dsMax|params|OSLShaderName", "KString", "A", "RandomTilingBitmap" + Property: "3dsMax|params|OSLPresetName", "KString", "A", "" + Property: "3dsMax|RandomTilingBitmap|Scale", "Float", "A",0.25 + Property: "3dsMax|RandomTilingBitmap|Filename", "KString", "A", "D:\Dev\clean\ufbx\data\textures\checkerboard_diffuse.png" + + Property: "3dsMax|RandomTilingBitmap|NormalMap", "Integer", "A",0 + Property: "3dsMax|RandomTilingBitmap|NormalFlipR", "Integer", "A",0 + Property: "3dsMax|RandomTilingBitmap|NormalFlipG", "Integer", "A",0 + Property: "3dsMax|RandomTilingBitmap|Filename_UDIMList", "KString", "A", "" + Property: "3dsMax|RandomTilingBitmap|LoadUDIM", "KString", "A", "Load UDIM..." + Property: "3dsMax|RandomTilingBitmap|UDIM", "Integer", "A",0 + Property: "3dsMax|RandomTilingBitmap|WrapMode", "KString", "A", "periodic" + Property: "3dsMax|RandomTilingBitmap|Randomize", "Integer", "A",1 + Property: "3dsMax|RandomTilingBitmap|RandomizePos", "Integer", "A",1 + Property: "3dsMax|RandomTilingBitmap|RandScale", "Float", "A",1 + Property: "3dsMax|RandomTilingBitmap|WiggleScale", "Float", "A",0.2 + Property: "3dsMax|RandomTilingBitmap|WiggleAmount", "Float", "A",0.25 + Property: "3dsMax|RandomTilingBitmap|EdgeFuzz", "Float", "A",0.1 + Property: "3dsMax|RandomTilingBitmap|RotMin", "Float", "A",0 + Property: "3dsMax|RandomTilingBitmap|RotMax", "Float", "A",360 + Property: "3dsMax|RandomTilingBitmap|ScaleMin", "Float", "A",1 + Property: "3dsMax|RandomTilingBitmap|ScaleMax", "Float", "A",1 + Property: "3dsMax|RandomTilingBitmap|UOffset", "Float", "A",0 + Property: "3dsMax|RandomTilingBitmap|VOffset", "Float", "A",0 + Property: "3dsMax|RandomTilingBitmap|Seed", "Integer", "A",0 + Property: "3dsMax|RandomTilingBitmap|HSVMin", "Vector", "A",0,1,1 + Property: "3dsMax|RandomTilingBitmap|HSVMax", "Vector", "A",0,1,1 + Property: "3dsMax|RandomTilingBitmap|AutoGamma", "Integer", "A",1 + Property: "3dsMax|RandomTilingBitmap|ManualGamma", "Float", "A",1 + Property: "3dsMax|RandomTilingBitmap|Pos_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|Scale_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|Filename_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|WrapMode_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|RandScale_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|WiggleScale_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|WiggleAmount_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|EdgeFuzz_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|RotMin_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|RotMax_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|ScaleMin_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|ScaleMax_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|UOffset_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|VOffset_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|Seed_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|HSVMin_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|HSVMax_map", "Reference", "A" + Property: "3dsMax|RandomTilingBitmap|ManualGamma_map", "Reference", "A" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::Map #7", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #7" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",0 + Property: "UseMipMap", "bool", "",0 + Property: "3dsMax|ClassIDa", "int", "",2140830621 + Property: "3dsMax|ClassIDb", "int", "",1875767309 + Property: "3dsMax|SuperClassID", "int", "",3088 + Property: "3dsMax|MaxTexture", "KString", "", "OSLMap" + Property: "3dsMax|params|OSLPath", "KString", "A", "C:\Program Files\Autodesk\3ds Max 2023\OSL\ColorTweak.osl" + Property: "3dsMax|params|OSLCode", "KString", "A", "// Tweak a color.&cr;&lf;// ColorTweak.osl, by Zap Andersson&cr;&lf;// Modified: 2019-11-25&cr;&lf;// Copyright 2019 Autodesk Inc, All rights reserved. This file is licensed under Apache 2.0 license&cr;&lf;// https://github.com/ADN-DevTech/3dsMax-OSL-Shaders/blob/license/LICENSE.txt&cr;&lf;&cr;&lf;shader ColorTweak&cr;&lf;[[ string help = "Tweaks a color (Levels)",&cr;&lf; string label= "Tweak/Levels",&cr;&lf; // string category = "Color Correction" &cr;&lf;]]&cr;&lf;(&cr;&lf; color Input = 0.0,&cr;&lf; &cr;&lf; vector HSV = vector(0.0,1.0,1.0)&cr;&lf; [[ string help = "Hue shift and Saturation / Value multiplier " ]], &cr;&lf; color InputMin = 0.0&cr;&lf; [[ string help = "The input value that maps to the darkest output. Incoming black level. " ]], &cr;&lf; color InputMax = 1.0&cr;&lf; [[ string help = "The input value that maps to the brightst output. Incoming white level. " ]], &cr;&lf; float MidTones = 1.0&cr;&lf; [[ string help = "Adjusts the MidTones/Gamma.",&cr;&lf; float min = 0.01, float max = 9.99 ]],&cr;&lf; color OutputMin = 0.0&cr;&lf; [[ string help = "The output black level." ]], &cr;&lf; color OutputMax = 1.0&cr;&lf; [[ string help = "The output white level." ]],&cr;&lf;&cr;&lf; int Clamp = 1&cr;&lf; [[ string widget = "checkBox",&cr;&lf; string help = "Clamp the output to the 0-1 range for each component" ]],&cr;&lf; &cr;&lf; output color Out = 0.0,&cr;&lf;)&cr;&lf;{&cr;&lf; color col = (Input - InputMin) / InputMax;&cr;&lf;&cr;&lf; // Tramsform to HSV space &cr;&lf; color hsv = transformc("rgb", "hsv", col);&cr;&lf;&cr;&lf; hsv[0] += HSV[0]; // Add to hue (offset)&cr;&lf; hsv[1] *= HSV[1]; // Scale saturation&cr;&lf; hsv[2] *= HSV[2]; // Scale value&cr;&lf; &cr;&lf; // Convert back to RGB&cr;&lf; col = transformc("hsv", "rgb", hsv);&cr;&lf; &cr;&lf; Out = mix(OutputMin, OutputMax, pow(col, 1.0/MidTones));&cr;&lf; &cr;&lf; if (Clamp)&cr;&lf; Out = clamp(Out, 0.0, 1.0);&cr;&lf;}&cr;&lf;" + + Property: "3dsMax|params|OSLAutoUpdate", "Bool", "A",1 + Property: "3dsMax|params|OSLShaderName", "KString", "A", "ColorTweak" + Property: "3dsMax|params|OSLPresetName", "KString", "A", "" + Property: "3dsMax|ColorTweak|Input", "ColorAndAlpha", "A",0,0,0,1 + Property: "3dsMax|ColorTweak|HSV", "Vector", "A",0,1,1 + Property: "3dsMax|ColorTweak|InputMin", "ColorAndAlpha", "A",0,0,0,1 + Property: "3dsMax|ColorTweak|InputMax", "ColorAndAlpha", "A",1,1,1,1 + Property: "3dsMax|ColorTweak|MidTones", "Float", "A",1 + Property: "3dsMax|ColorTweak|OutputMin", "ColorAndAlpha", "A",0,0,0,1 + Property: "3dsMax|ColorTweak|OutputMax", "ColorAndAlpha", "A",1,1,1,1 + Property: "3dsMax|ColorTweak|Clamp", "Integer", "A",1 + Property: "3dsMax|ColorTweak|Input_map", "Reference", "A" + Property: "3dsMax|ColorTweak|HSV_map", "Reference", "A" + Property: "3dsMax|ColorTweak|InputMin_map", "Reference", "A" + Property: "3dsMax|ColorTweak|InputMax_map", "Reference", "A" + Property: "3dsMax|ColorTweak|MidTones_map", "Reference", "A" + Property: "3dsMax|ColorTweak|OutputMin_map", "Reference", "A" + Property: "3dsMax|ColorTweak|OutputMax_map", "Reference", "A" + Property: "3dsMax|ColorTweak|Clamp_map", "Reference", "A" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::Map #8", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #8" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "UVChannel_1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::Map #8" + FileName: "D:\Dev\clean\ufbx\data\textures\checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "Alpha_Black" + Cropping: 0,0,0,0 + } + Texture: "Texture::Map #16", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #16" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",0 + Property: "UseMipMap", "bool", "",0 + Property: "3dsMax|ClassIDa", "int", "",-1989217540 + Property: "3dsMax|ClassIDb", "int", "",1153266751 + Property: "3dsMax|SuperClassID", "int", "",3088 + Property: "3dsMax|MaxTexture", "KString", "", "MULTIOUTPUT_TO_OSLMap" + Property: "3dsMax|parameters|sourceMap", "Reference", "A" + Property: "3dsMax|parameters|outputChannelIndex", "Integer", "A",0 + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::Map #4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #4" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",0 + Property: "UseMipMap", "bool", "",0 + Property: "3dsMax|ClassIDa", "int", "",2140830621 + Property: "3dsMax|ClassIDb", "int", "",1875767309 + Property: "3dsMax|SuperClassID", "int", "",3088 + Property: "3dsMax|MaxTexture", "KString", "", "OSLMap" + Property: "3dsMax|params|OSLPath", "KString", "A", "C:\Program Files\Autodesk\3ds Max 2023\OSL\UberBitmap.osl" + Property: "3dsMax|params|OSLCode", "KString", "A", "// Load a bitmap into OSL (UBER version, with everything built-in)&cr;&lf;// UberBitmap.osl, by Zap Andersson&cr;&lf;// Modified: 2020-04-14&cr;&lf;// Copyright 2020 Autodesk Inc, All rights reserved. This file is licensed under Apache 2.0 license&cr;&lf;// https://github.com/ADN-DevTech/3dsMax-OSL-Shaders/blob/license/LICENSE.txt&cr;&lf;&cr;&lf;shader UberBitmap2&cr;&lf;[[ string help = "All-in-one shader for loading a bitmap via OpenImageIO.
Includes UVW channels and transforms in a monolithic version.",&cr;&lf; string label = "Uber Bitmap",&cr;&lf; string version = "2.0" &cr;&lf;]]&cr;&lf;( &cr;&lf; int UVSet = 1 &cr;&lf; [[ string label="Map Channel",&cr;&lf; string help ="The 3ds max Map channel to look up",&cr;&lf; int min = 0, int max = 99 ]],&cr;&lf; float Scale = 1.0 &cr;&lf; [[ string help="The overall Scale. Larger number = bigger." ]],&cr;&lf; vector Tiling = 1.0 &cr;&lf; [[ string help="A per-axis dividing scale, to subdivide the values. Larger number = smaller." ]],&cr;&lf; vector Offset = 0.0&cr;&lf; [[ string help="Moves the UVW coordinates around" ]],&cr;&lf; &cr;&lf; // Real world parameters &cr;&lf; int RealWorld = 0 &cr;&lf; [[ string widget = "checkBox",&cr;&lf; int connectable = 0,&cr;&lf; string help = "Enable Real-World Scaling" ]],&cr;&lf; float RealWidth = 0.2 &cr;&lf; [[ int worldunits=1,&cr;&lf; string help = "Real Width of one unit of texture space" ]], &cr;&lf; float RealHeight = 0.2 &cr;&lf; [[ int worldunits=1,&cr;&lf; string help = "Real Height of one unit of texture space" ]], &cr;&lf; &cr;&lf; float Rotate = 0.0&cr;&lf; [[ string help="A rotation angle in degrees." ]],,&cr;&lf; point RotCenter = point(0.5,0.5,0) &cr;&lf; [[ string label = "Rotation Center",&cr;&lf; string help = "The center of rotation in UVW space" ]],&cr;&lf; vector RotAxis = vector(0.0,0.0,1.0) &cr;&lf; [[ string label = "Rotation Axis",&cr;&lf; string help = "An axis around which the rotation occurs." ]],&cr;&lf; &cr;&lf; string Filename = "" &cr;&lf; [[ string widget="filename", &cr;&lf; string label="File name",&cr;&lf; string help="The name of the texture to look up" ]], &cr;&lf; &cr;&lf; string Filename_UDIMList = "" &cr;&lf; [[ string widget = "null",&cr;&lf; string label="Viewport UDIM List",&cr;&lf; string help="The list of UDIM items to load into the viewport. If empty, will be deduced from the file system automatically. " ]], &cr;&lf; string LoadUDIM = "Load UDIM..." &cr;&lf; [[ string widget="max:actionButton", &cr;&lf; string actionID="loadUDIM(\"Filename\")",&cr;&lf; string help="Select a set of files to load as an UDIM.",&cr;&lf; int connectable = 0 ]], &cr;&lf; &cr;&lf; int UDIM = 0&cr;&lf; [[ string widget="checkBox", string label="UDIM-compatible lookup",&cr;&lf; int connectable = 0,&cr;&lf; string help ="Modifies the UV coordinate so that UDIM's are looked up similar to the max MultiTile map" ]], &cr;&lf; string WrapMode = "periodic"&cr;&lf; [[ string widget="popup", string options = "default|black|clamp|periodic|mirror",&cr;&lf; string label="Wrap Mode",&cr;&lf; string help="How the texture wraps: (black, clamp, periodic or mirror)." ]],&cr;&lf; &cr;&lf; int AutoGamma = 1 &cr;&lf; [[ string widget="checkBox", int connectable = 0 ]],&cr;&lf; float ManualGamma = 1.0 &cr;&lf; [[ string label="Manual Gamma" ]],&cr;&lf; &cr;&lf; output color Col = 0 [[ string label="Col (RGB)" ]],&cr;&lf; output float R = 0,&cr;&lf; output float G = 0,&cr;&lf; output float B = 0,&cr;&lf; output float A = 1,&cr;&lf; output float Luminance = 0,&cr;&lf; output float Average = 0&cr;&lf;)&cr;&lf;{&cr;&lf; // Skip empty filenames&cr;&lf; if (Filename == "")&cr;&lf; return;&cr;&lf; &cr;&lf; point UVW = point(u,v,0);&cr;&lf;&cr;&lf; // Get UVW channel&cr;&lf; if (!getattribute(format("UV%d", UVSet), UVW))&cr;&lf; {&cr;&lf; // Get MAXtoA style UV&cr;&lf; float w = 0.0;&cr;&lf; &cr;&lf; // Default UV set handled in&cr;&lf; // a special way in MAXtoA&cr;&lf; if (UVSet == 1)&cr;&lf; {&cr;&lf; UVW = vector(u,v,0);&cr;&lf; getattribute("w", w);&cr;&lf; }&cr;&lf; else // ...the others are just attributes&cr;&lf; {&cr;&lf; getattribute(format("uv_%d", UVSet), UVW);&cr;&lf; getattribute(format("w_%d", UVSet), w);&cr;&lf; }&cr;&lf; // Insert 3rd dimension if any&cr;&lf; UVW[2] = w;&cr;&lf; }&cr;&lf;&cr;&lf; vector worldScale = 1.0;&cr;&lf; &cr;&lf; if (RealWorld)&cr;&lf; worldScale = vector(RealWidth, RealHeight, 1.0);&cr;&lf;&cr;&lf; // Do the transform stuff&cr;&lf; point p = rotate(UVW - Offset, radians(Rotate), RotCenter, RotCenter + RotAxis) * Tiling / worldScale / Scale;&cr;&lf;&cr;&lf; // Default lookup, just use u and inverted v...&cr;&lf; float ulookup = p[0];&cr;&lf; float vlookup = 1.0 - p[1];&cr;&lf; &cr;&lf; // But for UDIM compatibility and max's idea that 0,0 is in &cr;&lf; // lower left corner, we need this juggling of v....&cr;&lf; if (UDIM)&cr;&lf; {&cr;&lf; float vfloor = floor(p[1]);&cr;&lf; float vfrac = p[1] - vfloor;&cr;&lf; vlookup = vfloor + (1.0 - vfrac);&cr;&lf; }&cr;&lf; &cr;&lf; Col = texture(Filename, ulookup, vlookup, "wrap", WrapMode, "alpha", A);&cr;&lf; &cr;&lf; int channels;&cr;&lf; gettextureinfo(Filename, "channels", channels);&cr;&lf; if (channels < 4) // No alpha? Set it to opaque&cr;&lf; {&cr;&lf; A = 1.0;&cr;&lf;&cr;&lf; if (WrapMode == "black") // 2018-04-25: Allow Decals&cr;&lf; {&cr;&lf; if (p[0] < 0.0 || p[0] > 1.0 ||&cr;&lf; p[1] < 0.0 || p[1] > 1.0)&cr;&lf; A = 0.0;&cr;&lf; }&cr;&lf; }&cr;&lf;&cr;&lf; // Temporary workaround for color space issues&cr;&lf; if (AutoGamma)&cr;&lf; {&cr;&lf; if (!endswith(Filename, ".exr") &&&cr;&lf; !endswith(Filename, ".EXR") &&&cr;&lf; !endswith(Filename, ".hdr") &&&cr;&lf; !endswith(Filename, ".HDR") &&&cr;&lf; !endswith(Filename, ".tx") &&&cr;&lf; !endswith(Filename, ".TX"))&cr;&lf; {&cr;&lf; // Gamma 2.2 for sRGB approx)&cr;&lf; Col = pow(Col, 2.2);&cr;&lf; }&cr;&lf; }&cr;&lf; else&cr;&lf; {&cr;&lf; if (ManualGamma != 1.0)&cr;&lf; Col = pow(Col, ManualGamma);&cr;&lf; }&cr;&lf; &cr;&lf; R = Col[0];&cr;&lf; G = Col[1];&cr;&lf; B = Col[2];&cr;&lf; Luminance = luminance(Col);&cr;&lf; Average = (R + G + B) / 3.0;&cr;&lf;}" + + Property: "3dsMax|params|OSLAutoUpdate", "Bool", "A",1 + Property: "3dsMax|params|OSLShaderName", "KString", "A", "UberBitmap2" + Property: "3dsMax|params|OSLPresetName", "KString", "A", "" + Property: "3dsMax|UberBitmap2|UVSet", "Integer", "A",1 + Property: "3dsMax|UberBitmap2|Scale", "Float", "A",1 + Property: "3dsMax|UberBitmap2|Tiling", "Vector", "A",1,1,1 + Property: "3dsMax|UberBitmap2|Offset", "Vector", "A",0,0,0 + Property: "3dsMax|UberBitmap2|RealWorld", "Integer", "A",0 + Property: "3dsMax|UberBitmap2|RealWidth", "Float", "A",7.874016 + Property: "3dsMax|UberBitmap2|RealHeight", "Float", "A",7.874016 + Property: "3dsMax|UberBitmap2|Rotate", "Float", "A",0 + Property: "3dsMax|UberBitmap2|RotCenter", "Vector", "A",0.5,0.5,0 + Property: "3dsMax|UberBitmap2|RotAxis", "Vector", "A",0,0,1 + Property: "3dsMax|UberBitmap2|Filename", "KString", "A", "D:\Dev\clean\ufbx\data\textures\checkerboard_roughness.png" + Property: "3dsMax|UberBitmap2|Filename_UDIMList", "KString", "A", "" + Property: "3dsMax|UberBitmap2|LoadUDIM", "KString", "A", "Load UDIM..." + Property: "3dsMax|UberBitmap2|UDIM", "Integer", "A",0 + Property: "3dsMax|UberBitmap2|WrapMode", "KString", "A", "periodic" + Property: "3dsMax|UberBitmap2|AutoGamma", "Integer", "A",1 + Property: "3dsMax|UberBitmap2|ManualGamma", "Float", "A",1 + Property: "3dsMax|UberBitmap2|UVSet_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|Scale_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|Tiling_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|Offset_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|RealWidth_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|RealHeight_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|Rotate_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|RotCenter_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|RotAxis_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|Filename_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|Filename_UDIMList_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|WrapMode_map", "Reference", "A" + Property: "3dsMax|UberBitmap2|ManualGamma_map", "Reference", "A" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::Map #9", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #9" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",0 + Property: "UseMipMap", "bool", "",0 + Property: "3dsMax|ClassIDa", "int", "",2121471519 + Property: "3dsMax|ClassIDb", "int", "",-1235266194 + Property: "3dsMax|SuperClassID", "int", "",3088 + Property: "3dsMax|ai_bump2d Parameter Wrapper|TheList", "Reference", "A" + Property: "3dsMax|ai_bump2d Parameter Wrapper|Shader Version", "Integer", "A",0 + Property: "3dsMax|ai_bump2d Parameters/Connections|bump_map", "Float", "A",0 + Property: "3dsMax|ai_bump2d Parameters/Connections|bump_map.connected", "Bool", "A",1 + Property: "3dsMax|ai_bump2d Parameters/Connections|bump_map.shader", "Reference", "A" + Property: "3dsMax|ai_bump2d Parameters/Connections|bump_height", "Float", "A",1 + Property: "3dsMax|ai_bump2d Parameters/Connections|bump_height.connected", "Bool", "A",1 + Property: "3dsMax|ai_bump2d Parameters/Connections|bump_height.shader", "Reference", "A" + Property: "3dsMax|ai_bump2d Parameters/Connections|normal", "Vector", "A",0,0,0 + Property: "3dsMax|ai_bump2d Parameters/Connections|normal.connected", "Bool", "A",1 + Property: "3dsMax|ai_bump2d Parameters/Connections|normal.shader", "Reference", "A" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::Map #10", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #10" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "UVChannel_1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::Map #10" + FileName: "D:\Dev\clean\ufbx\data\textures\checkerboard_normal.png" + RelativeFilename: "textures\checkerboard_normal.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "Alpha_Black" + Cropping: 0,0,0,0 + } + Texture: "Texture::Map #12", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #12" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",0 + Property: "UseMipMap", "bool", "",0 + Property: "3dsMax|ClassIDa", "int", "",-1989217540 + Property: "3dsMax|ClassIDb", "int", "",1153266751 + Property: "3dsMax|SuperClassID", "int", "",3088 + Property: "3dsMax|MaxTexture", "KString", "", "MULTIOUTPUT_TO_OSLMap" + Property: "3dsMax|parameters|sourceMap", "Reference", "A" + Property: "3dsMax|parameters|outputChannelIndex", "Integer", "A",0 + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::Map #2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #2" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",0 + Property: "UseMipMap", "bool", "",0 + Property: "3dsMax|ClassIDa", "int", "",2140830621 + Property: "3dsMax|ClassIDb", "int", "",1875767309 + Property: "3dsMax|SuperClassID", "int", "",3088 + Property: "3dsMax|MaxTexture", "KString", "", "OSLMap" + Property: "3dsMax|params|OSLPath", "KString", "A", "C:\Program Files\Autodesk\3ds Max 2023\OSL\OSLBitmap.osl" + Property: "3dsMax|params|OSLCode", "KString", "A", "// Lookup a bitmap bitmap with OSL&cr;&lf;// OSLBitmap.osl, by Zap Andersson&cr;&lf;// Modified: 2020-06-23&cr;&lf;// Copyright 2020 Autodesk Inc, All rights reserved. This file is licensed under Apache 2.0 license&cr;&lf;// https://github.com/ADN-DevTech/3dsMax-OSL-Shaders/blob/license/LICENSE.txt&cr;&lf;&cr;&lf;shader OSLBitmap2&cr;&lf;[[ string help = "Look up a bitmap from passed in UV coordinates
(through OpenImageIO)",&cr;&lf; string label = "Bitmap Lookup",&cr;&lf; string version = "2.0" ]]&cr;&lf;( &cr;&lf; point Pos = point(u,v,0) &cr;&lf; [[ string label= "UV Coordinate", &cr;&lf; string help = "The 2D coordinate at which the texture is looked up." ]],&cr;&lf; float Scale = 1.0&cr;&lf; [[ string help = "A linear scale factor. For more complex UV manipulation, connect the UVWTransform." ]], &cr;&lf; &cr;&lf; string Filename = "" &cr;&lf; [[ string widget="filename", &cr;&lf; string label="File name",&cr;&lf; string help="The name of the texture to look up" ]], &cr;&lf; string Filename_UDIMList = "" &cr;&lf; [[ string widget = "null",&cr;&lf; string label="Viewport UDIM List",&cr;&lf; string help="The list of UDIM items to load into the viewport. If empty, will be deduced from the file system automatically. " ]], &cr;&lf; string LoadUDIM = "Load UDIM..." &cr;&lf; [[ string widget="max:actionButton", &cr;&lf; string actionID="loadUDIM(\"Filename\")",&cr;&lf; string help="Select a set of files to load as an UDIM.",&cr;&lf; int connectable = 0 ]], &cr;&lf; int UDIM = 0&cr;&lf; [[ string widget="checkBox", string label="UDIM-compatible lookup",&cr;&lf; int connectable = 0,&cr;&lf; string help ="Modifies the UV coordinate so that UDIM's are looked up similar to the max MultiTile map" ]], &cr;&lf; string WrapMode = "periodic"&cr;&lf; [[ string widget="popup", string options = "default|black|clamp|periodic|mirror",&cr;&lf; string label="Wrap Mode",&cr;&lf; string help="How the texture wraps: (black, clamp, periodic or mirror)." ]],&cr;&lf; &cr;&lf; int AutoGamma = 1 &cr;&lf; [[ string widget="checkBox", int connectable=0 ]],&cr;&lf; float ManualGamma = 1.0 &cr;&lf; [[ string label="Manual Gamma" ]],&cr;&lf; &cr;&lf; output color Col = 0 [[ string label="Col (RGB)" ]],&cr;&lf; output float R = 0,&cr;&lf; output float G = 0,&cr;&lf; output float B = 0,&cr;&lf; output float A = 1,&cr;&lf; output float Luminance = 0,&cr;&lf; output float Average = 0&cr;&lf;)&cr;&lf;{&cr;&lf; // Skip empty files&cr;&lf; if (Filename == "")&cr;&lf; return;&cr;&lf; &cr;&lf; point p = Pos / Scale;&cr;&lf;&cr;&lf; // Default lookup, just use u and inverted v...&cr;&lf; float ulookup = p[0];&cr;&lf; float vlookup = 1.0 - p[1];&cr;&lf; &cr;&lf; // But for UDIM compatibility and max's idea that 0,0 is in &cr;&lf; // lower left corner, we need this juggling of v....&cr;&lf; if (UDIM)&cr;&lf; {&cr;&lf; float vfloor = floor(p[1]);&cr;&lf; float vfrac = p[1] - vfloor;&cr;&lf; vlookup = vfloor + (1.0 - vfrac);&cr;&lf; }&cr;&lf; &cr;&lf; Col = texture(Filename, ulookup, vlookup, "wrap", WrapMode, "alpha", A);&cr;&lf; &cr;&lf; int channels;&cr;&lf; gettextureinfo(Filename, "channels", channels);&cr;&lf; if (channels < 4) // No alpha? Set it to opaque&cr;&lf; {&cr;&lf; A = 1.0;&cr;&lf;&cr;&lf; if (WrapMode == "black") // 2018-04-25: Allow Decals&cr;&lf; {&cr;&lf; if (p[0] < 0.0 || p[0] > 1.0 ||&cr;&lf; p[1] < 0.0 || p[1] > 1.0)&cr;&lf; A = 0.0;&cr;&lf; }&cr;&lf; }&cr;&lf; &cr;&lf;&cr;&lf; // Temporary workaround for color space issues&cr;&lf; if (AutoGamma)&cr;&lf; {&cr;&lf; if (!endswith(Filename, ".exr") &&&cr;&lf; !endswith(Filename, ".EXR") &&&cr;&lf; !endswith(Filename, ".hdr") &&&cr;&lf; !endswith(Filename, ".HDR") &&&cr;&lf; !endswith(Filename, ".tx") &&&cr;&lf; !endswith(Filename, ".TX"))&cr;&lf; {&cr;&lf; // Gamma 2.2 for sRGB approx)&cr;&lf; Col = pow(Col, 2.2);&cr;&lf; }&cr;&lf; }&cr;&lf; else&cr;&lf; {&cr;&lf; if (ManualGamma != 1.0)&cr;&lf; Col = pow(Col, ManualGamma);&cr;&lf; }&cr;&lf; &cr;&lf; R = Col[0];&cr;&lf; G = Col[1];&cr;&lf; B = Col[2];&cr;&lf; Luminance = luminance(Col);&cr;&lf; Average = (R + G + B) / 3.0;&cr;&lf;}" + + Property: "3dsMax|params|OSLAutoUpdate", "Bool", "A",1 + Property: "3dsMax|params|OSLShaderName", "KString", "A", "OSLBitmap2" + Property: "3dsMax|params|OSLPresetName", "KString", "A", "" + Property: "3dsMax|OSLBitmap2|Scale", "Float", "A",1 + Property: "3dsMax|OSLBitmap2|Filename", "KString", "A", "D:\Dev\clean\ufbx\data\textures\checkerboard_weight.png" + Property: "3dsMax|OSLBitmap2|Filename_UDIMList", "KString", "A", "" + Property: "3dsMax|OSLBitmap2|LoadUDIM", "KString", "A", "Load UDIM..." + Property: "3dsMax|OSLBitmap2|UDIM", "Integer", "A",0 + Property: "3dsMax|OSLBitmap2|WrapMode", "KString", "A", "periodic" + Property: "3dsMax|OSLBitmap2|AutoGamma", "Integer", "A",1 + Property: "3dsMax|OSLBitmap2|ManualGamma", "Float", "A",1 + Property: "3dsMax|OSLBitmap2|Pos_map", "Reference", "A" + Property: "3dsMax|OSLBitmap2|Scale_map", "Reference", "A" + Property: "3dsMax|OSLBitmap2|Filename_map", "Reference", "A" + Property: "3dsMax|OSLBitmap2|Filename_UDIMList_map", "Reference", "A" + Property: "3dsMax|OSLBitmap2|WrapMode_map", "Reference", "A" + Property: "3dsMax|OSLBitmap2|ManualGamma_map", "Reference", "A" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::Map #5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #5" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "UVChannel_1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::Map #5" + FileName: "D:\Dev\clean\ufbx\data\textures\checkerboard_metallic.png" + RelativeFilename: "textures\checkerboard_metallic.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "Alpha_Black" + Cropping: 0,0,0,0 + } + Texture: "Texture::Map #6", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #6" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",0 + Property: "UseMipMap", "bool", "",0 + Property: "3dsMax|ClassIDa", "int", "",2121471519 + Property: "3dsMax|ClassIDb", "int", "",-1387024086 + Property: "3dsMax|SuperClassID", "int", "",3088 + Property: "3dsMax|ai_image Parameter Wrapper|TheList", "Reference", "A" + Property: "3dsMax|ai_image Parameter Wrapper|Shader Version", "Integer", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|filename", "KString", "A", "D:\Dev\clean\ufbx\data\textures\checkerboard_transparency.png" + + Property: "3dsMax|ai_image Parameters/Connections|Image Frame Number", "Integer", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|color_space", "Integer", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|filter", "Integer", "A",3 + Property: "3dsMax|ai_image Parameters/Connections|mipmap_bias", "Integer", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|single_channel", "Bool", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|start_channel", "Integer", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|swrap", "Integer", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|twrap", "Integer", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|sscale", "Float", "A",1 + Property: "3dsMax|ai_image Parameters/Connections|tscale", "Float", "A",1 + Property: "3dsMax|ai_image Parameters/Connections|sflip", "Bool", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|tflip", "Bool", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|soffset", "Float", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|toffset", "Float", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|swap_st", "Bool", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|uvcoords.connected", "Bool", "A",1 + Property: "3dsMax|ai_image Parameters/Connections|uvcoords.shader", "Reference", "A" + Property: "3dsMax|ai_image Parameters/Connections|uvset", "Integer", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|multiply", "Color", "A",1,1,1 + Property: "3dsMax|ai_image Parameters/Connections|multiply.connected", "Bool", "A",1 + Property: "3dsMax|ai_image Parameters/Connections|multiply.shader", "Reference", "A" + Property: "3dsMax|ai_image Parameters/Connections|offset", "Color", "A",0,0,0 + Property: "3dsMax|ai_image Parameters/Connections|offset.connected", "Bool", "A",1 + Property: "3dsMax|ai_image Parameters/Connections|offset.shader", "Reference", "A" + Property: "3dsMax|ai_image Parameters/Connections|ignore_missing_textures", "Bool", "A",0 + Property: "3dsMax|ai_image Parameters/Connections|missing_texture_color", "ColorAndAlpha", "A",0,0,0,0 + Property: "3dsMax|ai_image Parameters/Connections|missing_texture_color.connected", "Bool", "A",1 + Property: "3dsMax|ai_image Parameters/Connections|missing_texture_color.shader", "Reference", "A" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Implementation: "Implementation::01 - Default_Implementation", "" { + Version: 100 + Properties60: { + Property: "ShaderLanguage", "KString", "", "StandardSSL" + Property: "ShaderLanguageVersion", "KString", "", "1.0.1" + Property: "RenderAPI", "KString", "", "OSL" + Property: "RenderAPIVersion", "KString", "", "" + Property: "RootBindingName", "KString", "", "root" + } + } + BindingTable: "BindingTable::root 4", "" { + Version: 100 + Properties60: { + Property: "TargetName", "KString", "", "root" + Property: "TargetType", "KString", "", "shader" + Property: "CodeAbsoluteURL", "KString", "", "" + Property: "CodeRelativeURL", "KString", "", "" + Property: "CodeTAG", "KString", "", "shader" + Property: "DescAbsoluteURL", "KString", "", "" + Property: "DescRelativeURL", "KString", "", "" + Property: "DescTAG", "KString", "", "shader" + } + Entry: "3dsMax|Parameters|material_mode", "FbxPropertyEntry", "material_mode", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_weight", "FbxPropertyEntry", "base", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_color", "FbxPropertyEntry", "base_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|reflectivity", "FbxPropertyEntry", "specular", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|roughness", "FbxPropertyEntry", "specular_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|roughness_inv", "FbxPropertyEntry", "roughness_inv", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|metalness", "FbxPropertyEntry", "metalness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|refl_color", "FbxPropertyEntry", "specular_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|diff_roughness", "FbxPropertyEntry", "diffuse_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|brdf_mode", "FbxPropertyEntry", "brdf_mode", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|brdf_low", "FbxPropertyEntry", "brdf_low", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|brdf_high", "FbxPropertyEntry", "brdf_high", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|brdf_curve", "FbxPropertyEntry", "brdf_curve", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|anisotropy", "FbxPropertyEntry", "specular_anisotropy", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|anisoangle", "FbxPropertyEntry", "specular_rotation", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|aniso_mode", "FbxPropertyEntry", "aniso_mode", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|aniso_channel", "FbxPropertyEntry", "aniso_channel", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|transparency", "FbxPropertyEntry", "transmission", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_color", "FbxPropertyEntry", "transmission_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_depth", "FbxPropertyEntry", "transmission_depth", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_roughness", "FbxPropertyEntry", "transmission_extra_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_roughness_inv", "FbxPropertyEntry", "trans_roughness_inv", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_roughness_lock", "FbxPropertyEntry", "trans_roughness_lock", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_ior", "FbxPropertyEntry", "specular_IOR", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_walled", "FbxPropertyEntry", "thin_walled", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|dispersion", "FbxPropertyEntry", "transmisison_dispersion", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_scatter_color", "FbxPropertyEntry", "transmission_scatter", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_scatter_aniso", "FbxPropertyEntry", "transmission_scatter_anisotropy", "FbxSemanticEntry" + + Entry: "3dsMax|Parameters|scattering", "FbxPropertyEntry", "subsurface", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_color", "FbxPropertyEntry", "subsurface_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_depth", "FbxPropertyEntry", "sss_depth", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_scale", "FbxPropertyEntry", "subsurface_scale", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_scatter_color", "FbxPropertyEntry", "subsurface_radius", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emission", "FbxPropertyEntry", "emission", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emit_color", "FbxPropertyEntry", "emission_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emit_luminance", "FbxPropertyEntry", "emit_luminance", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emit_kelvin", "FbxPropertyEntry", "emit_kelvin", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coating", "FbxPropertyEntry", "coat", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_color", "FbxPropertyEntry", "coat_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_roughness", "FbxPropertyEntry", "coat_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_roughness_inv", "FbxPropertyEntry", "coat_roughness_inv", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_affect_color", "FbxPropertyEntry", "coat_affect_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_affect_roughness", "FbxPropertyEntry", "coat_affect_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_ior", "FbxPropertyEntry", "coat_IOR", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_anisotropy", "FbxPropertyEntry", "coat_anisotropy", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_anisoangle", "FbxPropertyEntry", "coat_rotation", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen", "FbxPropertyEntry", "sheen", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_color", "FbxPropertyEntry", "sheen_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_roughness", "FbxPropertyEntry", "sheen_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film", "FbxPropertyEntry", "thin_film", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_thickness", "FbxPropertyEntry", "thin_film_thickness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_ior", "FbxPropertyEntry", "thin_film_IOR", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_weight_map", "FbxPropertyEntry", "base", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_color_map", "FbxPropertyEntry", "base_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|reflectivity_map", "FbxPropertyEntry", "specular", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|refl_color_map", "FbxPropertyEntry", "specular_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|roughness_map", "FbxPropertyEntry", "specular_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|metalness_map", "FbxPropertyEntry", "metalness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|diff_rough_map", "FbxPropertyEntry", "diffuse_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|anisotropy_map", "FbxPropertyEntry", "specular_anisotropy", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|aniso_angle_map", "FbxPropertyEntry", "specular_rotation", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|transparency_map", "FbxPropertyEntry", "transmission", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_color_map", "FbxPropertyEntry", "transmission_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_rough_map", "FbxPropertyEntry", "transmission_extra_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_ior_map", "FbxPropertyEntry", "specular_IOR", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|scattering_map", "FbxPropertyEntry", "subsurface", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_color_map", "FbxPropertyEntry", "subsurface_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_scale_map", "FbxPropertyEntry", "subsurface_scale", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emission_map", "FbxPropertyEntry", "emission", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emit_color_map", "FbxPropertyEntry", "emission_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_map", "FbxPropertyEntry", "coat", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_color_map", "FbxPropertyEntry", "coat_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_rough_map", "FbxPropertyEntry", "coat_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|bump_map", "FbxPropertyEntry", "normal", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|normalCamera", "FbxPropertyEntry", "normalCamera", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|normalCameraUsedAs", "FbxPropertyEntry", "normalCameraUsedAs", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|normalCameraFactor", "FbxPropertyEntry", "normalCameraFactor", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|displacement_map", "FbxPropertyEntry", "displacement_map", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|cutout_map", "FbxPropertyEntry", "opacity", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_aniso_map", "FbxPropertyEntry", "coat_anisotropy", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_aniso_angle_map", "FbxPropertyEntry", "coat_rotation", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_map", "FbxPropertyEntry", "sheen", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_color_map", "FbxPropertyEntry", "sheen_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_rough_map", "FbxPropertyEntry", "sheen_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_map", "FbxPropertyEntry", "thin_film_thickness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_ior_map", "FbxPropertyEntry", "thin_film_IOR", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_weight_map_on", "FbxPropertyEntry", "base_weight_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_color_map_on", "FbxPropertyEntry", "base_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|reflectivity_map_on", "FbxPropertyEntry", "reflectivity_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|refl_color_map_on", "FbxPropertyEntry", "refl_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|roughness_map_on", "FbxPropertyEntry", "roughness_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|metalness_map_on", "FbxPropertyEntry", "metalness_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|diff_rough_map_on", "FbxPropertyEntry", "diff_rough_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|anisotropy_map_on", "FbxPropertyEntry", "anisotropy_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|aniso_angle_map_on", "FbxPropertyEntry", "aniso_angle_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|transparency_map_on", "FbxPropertyEntry", "transparency_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_color_map_on", "FbxPropertyEntry", "trans_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_rough_map_on", "FbxPropertyEntry", "trans_rough_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_ior_map_on", "FbxPropertyEntry", "trans_ior_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|scattering_map_on", "FbxPropertyEntry", "scattering_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_color_map_on", "FbxPropertyEntry", "sss_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_scale_map_on", "FbxPropertyEntry", "sss_scale_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emission_map_on", "FbxPropertyEntry", "emission_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emit_color_map_on", "FbxPropertyEntry", "emit_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_map_on", "FbxPropertyEntry", "coat_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_color_map_on", "FbxPropertyEntry", "coat_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_rough_map_on", "FbxPropertyEntry", "coat_rough_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_aniso_map_on", "FbxPropertyEntry", "coat_aniso_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_aniso_angle_map_on", "FbxPropertyEntry", "coat_aniso_angle_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_map_on", "FbxPropertyEntry", "sheen_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_color_map_on", "FbxPropertyEntry", "sheen_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_rough_map_on", "FbxPropertyEntry", "sheen_rough_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_map_on", "FbxPropertyEntry", "thin_film_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_ior_map_on", "FbxPropertyEntry", "thin_film_ior_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|displacement_map_on", "FbxPropertyEntry", "displacement_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|cutout_map_on", "FbxPropertyEntry", "cutout_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|displacement_map_amt", "FbxPropertyEntry", "displacement_map_amt", "FbxSemanticEntry" + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",2 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",1 + Property: "FrontAxisSign", "int", "",-1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",2 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",2.54 + Property: "OriginalUnitScaleFactor", "double", "",2.54 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Top" + Property: "TimeMode", "enum", "",6 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",0 + Property: "TimeSpanStop", "KTime", "",153953860000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Box001", "Model::Scene" + Connect: "OO", "Material::01 - Default", "Model::Box001" + Connect: "OO", "Texture::Map #14", "Model::Box001" + Connect: "OO", "Texture::Map #7", "Model::Box001" + Connect: "OO", "Texture::Map #16", "Model::Box001" + Connect: "OP", "Texture::Map #12", "Material::01 - Default", "3dsMax|Parameters|base_weight_map" + Connect: "OP", "Texture::Map #14", "Material::01 - Default", "3dsMax|Parameters|base_color_map" + Connect: "OP", "Texture::Map #16", "Material::01 - Default", "3dsMax|Parameters|roughness_map" + Connect: "OP", "Texture::Map #5", "Material::01 - Default", "3dsMax|Parameters|metalness_map" + Connect: "OP", "Texture::Map #6", "Material::01 - Default", "3dsMax|Parameters|trans_color_map" + Connect: "OP", "Texture::Map #7", "Material::01 - Default", "3dsMax|Parameters|emit_color_map" + Connect: "OP", "Texture::Map #9", "Material::01 - Default", "3dsMax|Parameters|bump_map" + Connect: "OP", "Texture::Map #9", "Material::01 - Default", "3dsMax|Parameters|normalCamera" + Connect: "OP", "Texture::Map #3", "Texture::Map #14", "3dsMax|parameters|sourceMap" + Connect: "OP", "Texture::Map #8", "Texture::Map #7", "3dsMax|ColorTweak|Input_map" + Connect: "OO", "Video::Map #8", "Texture::Map #8" + Connect: "OP", "Texture::Map #4", "Texture::Map #16", "3dsMax|parameters|sourceMap" + Connect: "OP", "Texture::Map #10", "Texture::Map #9", "3dsMax|ai_bump2d Parameters/Connections|bump_map.shader" + Connect: "OO", "Video::Map #10", "Texture::Map #10" + Connect: "OP", "Texture::Map #2", "Texture::Map #12", "3dsMax|parameters|sourceMap" + Connect: "OO", "Video::Map #5", "Texture::Map #5" + Connect: "OO", "Material::01 - Default", "Implementation::01 - Default_Implementation" + Connect: "OO", "BindingTable::root 4", "Implementation::01 - Default_Implementation" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,153953860000 + ReferenceTime: 0,153953860000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "30" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 470400000 + } + RendererSetting: { + DefaultCamera: "Producer Top" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/max_texture_mapping_6100_binary.fbx b/modules/ufbx/data/max_texture_mapping_6100_binary.fbx new file mode 100644 index 0000000..cd6f1f4 Binary files /dev/null and b/modules/ufbx/data/max_texture_mapping_6100_binary.fbx differ diff --git a/modules/ufbx/data/max_texture_mapping_7700_ascii.fbx b/modules/ufbx/data/max_texture_mapping_7700_ascii.fbx new file mode 100644 index 0000000..9c6937c --- /dev/null +++ b/modules/ufbx/data/max_texture_mapping_7700_ascii.fbx @@ -0,0 +1,1211 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 17 + Hour: 15 + Minute: 25 + Second: 0 + Millisecond: 606 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\max_texture_mapping_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\max_texture_mapping_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "3ds Max" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "17/06/2022 12:25:00.604" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\max_texture_mapping_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "3ds Max" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "17/06/2022 12:25:00.604" + P: "Original|ApplicationActiveProject", "KString", "", "", "C:\Users\Datacube\Documents\3ds Max 2023" + P: "Original|ApplicationNativeFile", "KString", "", "", "C:\Users\Datacube\Documents\3ds Max 2023\scenes\maxmaps.max" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",2 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",1 + P: "FrontAxisSign", "int", "Integer", "",-1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",2 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",2.54 + P: "OriginalUnitScaleFactor", "double", "Number", "",2.54 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Top" + P: "TimeMode", "enum", "", "",6 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",153953860000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2629272558432, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 23 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceMaterial" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Unknown" + P: "MultiLayer", "bool", "", "",0 + } + } + } + ObjectType: "Texture" { + Count: 12 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Implementation" { + Count: 1 + PropertyTemplate: "FbxImplementation" { + Properties70: { + P: "ShaderLanguage", "KString", "", "", "MentalRaySL" + P: "ShaderLanguageVersion", "KString", "", "", "" + P: "RenderAPI", "KString", "", "", "MentalRay" + P: "RenderAPIVersion", "KString", "", "", "" + P: "RootBindingName", "KString", "", "", "" + P: "Constants", "Compound", "", "" + } + } + } + ObjectType: "BindingTable" { + Count: 1 + PropertyTemplate: "FbxBindingTable" { + Properties70: { + P: "TargetName", "KString", "", "", "" + P: "TargetType", "KString", "", "", "" + P: "CodeAbsoluteURL", "KString", "XRefUrl", "", "" + P: "CodeRelativeURL", "KString", "XRefUrl", "", "" + P: "CodeTAG", "KString", "", "", "shader" + P: "DescAbsoluteURL", "KString", "XRefUrl", "", "" + P: "DescRelativeURL", "KString", "XRefUrl", "", "" + P: "DescTAG", "KString", "", "", "shader" + } + } + } + ObjectType: "Video" { + Count: 3 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2629283310640, "Geometry::", "Mesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.443137254901961,0.529411764705882,0.0235294117647059 + } + Vertices: *24 { + a: -10.0000047683716,-10.0000047683716,0,10.0000047683716,-10.0000047683716,0,-10.0000047683716,10.0000047683716,0,10.0000047683716,10.0000047683716,0,-10.0000047683716,-10.0000047683716,20.0000095367432,10.0000047683716,-10.0000047683716,20.0000095367432,-10.0000047683716,10.0000047683716,20.0000095367432,10.0000047683716,10.0000047683716,20.0000095367432 + } + PolygonVertexIndex: *24 { + a: 0,2,3,-2,4,5,7,-7,0,1,5,-5,1,3,7,-6,3,2,6,-8,2,0,4,-7 + } + Edges: *12 { + a: 0,1,2,3,4,5,6,7,9,11,13,17 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "UVChannel_1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *48 { + a: 1,0,0,0,1,1,0,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1 + } + UVIndex: *24 { + a: 0,2,3,1,4,5,7,6,8,9,11,10,12,13,15,14,16,17,19,18,20,21,23,22 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2629269223296, "Model::Box001", "Mesh" { + Version: 232 + Properties70: { + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "MaxHandle", "int", "Integer", "UH",2 + } + Shading: T + Culling: "CullingOff" + } + Material: 2629355879840, "Material::01 - Default", "" { + Version: 102 + ShadingModel: "unknown" + MultiLayer: 0 + Properties70: { + P: "ShadingModel", "KString", "", "", "unknown" + P: "AmbientColor", "ColorRGB", "Color", "",0.5,0.5,0.5 + P: "DiffuseColor", "ColorRGB", "Color", "",0.5,0.5,0.5 + P: "SpecularColor", "ColorRGB", "Color", "",1,1,1 + P: "SpecularFactor", "double", "Number", "",2 + P: "ShininessExponent", "double", "Number", "",1024 + P: "TransparencyFactor", "double", "Number", "",0 + P: "EmissiveColor", "ColorRGB", "Color", "",0,0,0 + P: "EmissiveFactor", "double", "Number", "",0 + P: "3dsMax", "Compound", "", "" + P: "3dsMax|ClassIDa", "int", "Integer", "",1030429932 + P: "3dsMax|ClassIDb", "int", "Integer", "",-559038463 + P: "3dsMax|SuperClassID", "int", "Integer", "",3072 + P: "3dsMax|Parameters", "Compound", "", "" + P: "3dsMax|ORIGINAL_MTL", "KString", "", "", "PHYSICAL_MTL" + P: "3dsMax|Parameters|material_mode", "Integer", "", "A",0 + P: "3dsMax|Parameters|base_weight", "Float", "", "A",1 + P: "3dsMax|Parameters|base_color", "ColorAndAlpha", "", "A",0.5,0.5,0.5,1 + P: "3dsMax|Parameters|reflectivity", "Float", "", "A",1 + P: "3dsMax|Parameters|roughness", "Float", "", "A",0 + P: "3dsMax|Parameters|roughness_inv", "Bool", "", "A",0 + P: "3dsMax|Parameters|metalness", "Float", "", "A",0 + P: "3dsMax|Parameters|refl_color", "ColorAndAlpha", "", "A",1,1,1,1 + P: "3dsMax|Parameters|diff_roughness", "Float", "", "A",0 + P: "3dsMax|Parameters|brdf_mode", "Bool", "", "A",1 + P: "3dsMax|Parameters|brdf_low", "Float", "", "A",0.05 + P: "3dsMax|Parameters|brdf_high", "Float", "", "A",1 + P: "3dsMax|Parameters|brdf_curve", "Float", "", "A",5 + P: "3dsMax|Parameters|anisotropy", "Float", "", "A",0 + P: "3dsMax|Parameters|anisoangle", "Float", "", "A",0.25 + P: "3dsMax|Parameters|aniso_mode", "Integer", "", "A",0 + P: "3dsMax|Parameters|aniso_channel", "Integer", "", "A",0 + P: "3dsMax|Parameters|transparency", "Float", "", "A",0 + P: "3dsMax|Parameters|trans_color", "ColorAndAlpha", "", "A",1,1,1,1 + P: "3dsMax|Parameters|trans_depth", "Float", "", "A",0 + P: "3dsMax|Parameters|trans_roughness", "Float", "", "A",0 + P: "3dsMax|Parameters|trans_roughness_inv", "Bool", "", "A",0 + P: "3dsMax|Parameters|trans_roughness_lock", "Bool", "", "A",1 + P: "3dsMax|Parameters|trans_ior", "Float", "", "A",1.52 + P: "3dsMax|Parameters|thin_walled", "Bool", "", "A",0 + P: "3dsMax|Parameters|dispersion", "Float", "", "A",0 + P: "3dsMax|Parameters|trans_scatter_color", "ColorAndAlpha", "", "A",0,0,0,1 + P: "3dsMax|Parameters|trans_scatter_aniso", "Float", "", "A",0 + P: "3dsMax|Parameters|scattering", "Float", "", "A",0 + P: "3dsMax|Parameters|sss_color", "ColorAndAlpha", "", "A",1,1,1,1 + P: "3dsMax|Parameters|sss_depth", "Float", "", "A",10 + P: "3dsMax|Parameters|sss_scale", "Float", "", "A",1 + P: "3dsMax|Parameters|sss_scatter_color", "ColorAndAlpha", "", "A",100,50,25,1 + P: "3dsMax|Parameters|emission", "Float", "", "A",1 + P: "3dsMax|Parameters|emit_color", "ColorAndAlpha", "", "A",0,0,0,1 + P: "3dsMax|Parameters|emit_luminance", "Float", "", "A",1500 + P: "3dsMax|Parameters|emit_kelvin", "Float", "", "A",6500 + P: "3dsMax|Parameters|coating", "Float", "", "A",0 + P: "3dsMax|Parameters|coat_color", "ColorAndAlpha", "", "A",1,1,1,1 + P: "3dsMax|Parameters|coat_roughness", "Float", "", "A",0 + P: "3dsMax|Parameters|coat_roughness_inv", "Bool", "", "A",0 + P: "3dsMax|Parameters|coat_affect_color", "Float", "", "A",0.5 + P: "3dsMax|Parameters|coat_affect_roughness", "Float", "", "A",0.5 + P: "3dsMax|Parameters|coat_ior", "Float", "", "A",1.52 + P: "3dsMax|Parameters|coat_anisotropy", "Float", "", "A",0 + P: "3dsMax|Parameters|coat_anisoangle", "Float", "", "A",0.25 + P: "3dsMax|Parameters|sheen", "Float", "", "A",0 + P: "3dsMax|Parameters|sheen_color", "ColorAndAlpha", "", "A",1,1,1,1 + P: "3dsMax|Parameters|sheen_roughness", "Float", "", "A",0.3 + P: "3dsMax|Parameters|thin_film", "Float", "", "A",0 + P: "3dsMax|Parameters|thin_film_thickness", "Float", "", "A",0 + P: "3dsMax|Parameters|thin_film_ior", "Float", "", "A",1.3 + P: "3dsMax|Parameters|base_weight_map", "Reference", "", "A" + P: "3dsMax|Parameters|base_color_map", "Reference", "", "A" + P: "3dsMax|Parameters|reflectivity_map", "Reference", "", "A" + P: "3dsMax|Parameters|refl_color_map", "Reference", "", "A" + P: "3dsMax|Parameters|roughness_map", "Reference", "", "A" + P: "3dsMax|Parameters|metalness_map", "Reference", "", "A" + P: "3dsMax|Parameters|diff_rough_map", "Reference", "", "A" + P: "3dsMax|Parameters|anisotropy_map", "Reference", "", "A" + P: "3dsMax|Parameters|aniso_angle_map", "Reference", "", "A" + P: "3dsMax|Parameters|transparency_map", "Reference", "", "A" + P: "3dsMax|Parameters|trans_color_map", "Reference", "", "A" + P: "3dsMax|Parameters|trans_rough_map", "Reference", "", "A" + P: "3dsMax|Parameters|trans_ior_map", "Reference", "", "A" + P: "3dsMax|Parameters|scattering_map", "Reference", "", "A" + P: "3dsMax|Parameters|sss_color_map", "Reference", "", "A" + P: "3dsMax|Parameters|sss_scale_map", "Reference", "", "A" + P: "3dsMax|Parameters|emission_map", "Reference", "", "A" + P: "3dsMax|Parameters|emit_color_map", "Reference", "", "A" + P: "3dsMax|Parameters|coat_map", "Reference", "", "A" + P: "3dsMax|Parameters|coat_color_map", "Reference", "", "A" + P: "3dsMax|Parameters|coat_rough_map", "Reference", "", "A" + P: "3dsMax|Parameters|bump_map", "ReferenceProperty", "Reference", "" + P: "3dsMax|Parameters|normalCamera", "Vector3D", "Vector", "",0,0,0 + P: "3dsMax|Parameters|normalCameraUsedAs", "int", "Integer", "",0 + P: "3dsMax|Parameters|normalCameraFactor", "double", "Number", "",0.300000011920929 + P: "3dsMax|Parameters|displacement_map", "Reference", "", "A" + P: "3dsMax|Parameters|cutout_map", "Reference", "", "A" + P: "3dsMax|Parameters|coat_aniso_map", "Reference", "", "A" + P: "3dsMax|Parameters|coat_aniso_angle_map", "Reference", "", "A" + P: "3dsMax|Parameters|sheen_map", "Reference", "", "A" + P: "3dsMax|Parameters|sheen_color_map", "Reference", "", "A" + P: "3dsMax|Parameters|sheen_rough_map", "Reference", "", "A" + P: "3dsMax|Parameters|thin_film_map", "Reference", "", "A" + P: "3dsMax|Parameters|thin_film_ior_map", "Reference", "", "A" + P: "3dsMax|Parameters|base_weight_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|base_color_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|reflectivity_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|refl_color_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|roughness_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|metalness_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|diff_rough_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|anisotropy_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|aniso_angle_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|transparency_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|trans_color_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|trans_rough_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|trans_ior_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|scattering_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|sss_color_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|sss_scale_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|emission_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|emit_color_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|coat_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|coat_color_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|coat_rough_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|coat_aniso_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|coat_aniso_angle_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|sheen_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|sheen_color_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|sheen_rough_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|thin_film_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|thin_film_ior_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|displacement_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|cutout_map_on", "Bool", "", "A",1 + P: "3dsMax|Parameters|displacement_map_amt", "Float", "", "A",1 + } + } + Video: 2629360425328, "Video::Map #8", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:\Dev\clean\ufbx\data\textures\checkerboard_emissive.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_emissive.png" + } + UseMipMap: 0 + Filename: "D:\Dev\clean\ufbx\data\textures\checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC40NARS3AAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAIYUlEQVR42u2ce1CU1xmHH+KCLhoVFZRRiCIYwFvwEpFFiIgg3qOIsU6ixKixGafJ1MSZdJrpTGPbNFanUzM2atSMMY234JUqXrBGWFHEK2AAMaJGROTiXdjF/kFBEVBhbS3we/6B2f3e71z22fec833fHrvQeab72EB2Yo4t4XgEuKPyn1/5LyCaNBJAAggJICSAkABCAggJICSAkABCAggJICSAkABCAojGip1HgJtNzwPofn7DLl8ZQEOAkABCAggJICSAkABCAggJICSAkABCAggJICSAkACiUWLQ/XTtDyA0BAgJICSAkABCAggJICSAkABCAggJICSAkABCAggJIBod2h9A+wMIDQFCAggJICSAkABCAoimg8GW4LMJT7eGHf5hYOX/uz8/CMCde3eYumBCjcc72DtwMCaJ9k7tAehucn9imQ+XAWDqFUT4gJH0cPOmjWMbLGVWbty+zsWrFzhzIY2k9ERSfzpV7TxhwSOIHDmJ3t59cGrTDovVQtH1Is5dyOZE6nHizfs4evJItfbUVJ+l76/Cs7MXv/v6YxJOH3hsH4UFj2DpH5aRlpHKmOiIevfv/1QAWzA2NzJ68HhO7E2t9t64sPGVH35dcTA48Ns3f4+/r+mRhtrTwqEFzm1d8PPqz5SQN6t0XHOH5iz5dCkhptAqcfb29hhbGHF1cSWgv4k5b71XRcjHEZcci2fnXxHWP+KJAkyMmATAptgNDScD2GLg2Z8zGWeayGfNPsNitVR5b3rUDNIz0/Dx8q0WV9H5Fd+OR8t+O2I2/r4mfr52iTVxK0nJTKboZhH2BgNtWznh5vwSvbr1JrjvsCpx82bPJ8QUSs6l8/z1q8UkJh/kWtE17A32tHfqQPeXutO/z0BGDRtTY9srMsHD9dmbEsfMUb9koLc/Lxpbc+PO9Rr7wqmNE0H+wZSUlrAlLqbWNtdEg70SGPPDBtq37sDYsPFVXh/k54+3pw8r162o13lD/IYD8PGKeexJ2UXBjWuU3bdyr/QeVwpzSc5IYvWuFUT/eUqVuIp6RP/6LTbv+p68a3lYrVbu3rvLpdyLHEj6F4uXLyT0jeCnrsv128UcPmPG3mBPiF9orceNGT4OB3sH9pvjKSwubBqTwL0pcRTcKGDGGzOrvB49+R3y8q+wNW5zvc7r2NwRgNt3b9UprpVjSwBu3rr5TNu560hseWboH1HrMRNGRJan/x3rm84qwFJmYbs5Bm9PHwIGlKfNLq5uhAQMY82mr6sNC09Lek4aAO9HfkS7F59+HnEs9RgACz76E87tXZ5ZO5PSzRTeKOBldx/cXF6q9r5nVy96+/QhvyCfePO+hrUKeNJM+ElzhK2JMUQFT+WdKbNITD7ItMhoSkpL+HbzN/Wuy5fbl7Bw9t8I6BmIv08A2ZfPkn05i59yszl/5Rzp59NqHIv/uORT1i5ZR+iQ4YSYhnEmK530rHQyz/1I5rkMjqceo+h6UZ3rU3bfSvyxPUwIiiKsfwRf/fPvVb/9ERMB2LZ7C1artV6rrQa5CgAovlXE9j1biRwVRV/fV4gcHcXmnd/Xq6MryLqUwbuLp/OLYdMI7B2EZ2cvPDt7Pcg8Vgsns4+zeudy0nMerEBSM04zetoI3ps2l/DgEfj26Ilvj54P4iwWDh8/xKJlCzmWmlK3YSB5BxOCogjxG15NgLFhrwOwMXb9c/kMbN4f4Emz1NqouA8e12kHkaOiWPGXVbRybEXcj9urzWwfV8ea7qdnk0PijiTssKObuweeXT3x7OqFb4+e+PcLoJ/XAPp6+DFr/tsQUDV2+YElLD+wBDdnd9xduuLesSuenb3o270fAQMCGeQ3mE9Wz+fwmUM1ll9bfdJGp+Lboyed7rmReDQBgIABgbi6uJJ1KZMSl1t4uLjX+Rtu6/MEzzUDAJzLPUtKZjL9vAaQlG7mYv6FZ3bu+9wnO+cs2TlniTuwC4BmzZrxm7mfMG1SNB/MnMcHK+bUGHvhag4XruaQkFq+fn/Brhlzxs5lfGAk08NnVgrwtGyK3YBvj568HjGxUoCK9B+XHPvc+v//4lLwpgPr/vP3u/96WVarlUXLPi/PLO7d6zSWr9q5rHyy6lz3jLclLoaS0hLCgyMwtjBibGEkPDiCUkspe1PimrYAh8+YGf5hIMeyjtp8ru++2Eg3N4/HHtPZtQsAuXmXK19bNOcLunRwe2xcRydXAPKL8+pcr8LiQvab42np2JIRr40kYugoHI2OHD5j5vrt4ufW9wYaGQNfeZVda/eyN2EPO/fHknLqKFeu5mIwGHDp0JGhg0OYNfVdAFZvWFkZ19ujLyvmfcOh9AR+OLmf1POnyC/Ox9DMQPvWHXjV25/JQ6eWX8Q6uLF+mW7HesKCwstTv51dlesEDVqAJy1T6jNJfNolZ0XZFWVczruMq4srYUHhhAWF15zOy8pY/u2XrI1ZUznBvFqUh3NbF0y9gjD1Cqo1bsP+f7DNHFNr2x+tz8PEm/eRX5DPIL/B2NnZkV+QT1K62eZlti392+gywJAJ/gT7v0ZoYBi9ffrg5uqGo7ElpZZScvMuc+TEYdbGrCE143SVuKkLJjLQexCDfYfwsps3ndq5YnQwUmq1kF+cx6lzJ9lmjiHrUoZN849tu7cQPXlG5dq/7L71ufaXXeg8k02Pheuxbm0TJxowEkACCAkgJICQAEICCAkgmhTaH0D7AwgNAUICCAkgJICQAEICCAkgJICQAEICCAkgJICQAEICiMaHQffT9cMQoSFASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJASADR6ND+ANofQGgIEBJASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJAND7+DXtbEsjx2g+IAAAAAElFTkSuQmCC" + } + Video: 2629360426288, "Video::Map #10", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:\Dev\clean\ufbx\data\textures\checkerboard_normal.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_normal.png" + } + UseMipMap: 0 + Filename: "D:\Dev\clean\ufbx\data\textures\checkerboard_normal.png" + RelativeFilename: "textures\checkerboard_normal.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEDEczOv0uAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAHDUlEQVR42u2de0xX5xnHPy8XndeJdsqYTLBgycTRFaRixcIwbZmDxtJ2bWa2zLGaNulq9sduXbJk6Wq2Zkv/mku0tlsWGmMva91gipXVqquIrFWbgnbFDQpYZxhgucOzP14ugvwuhjap/L6f5OQ9nPOc857L5zzve8755eB2FpkxBU42MyUyE6a2vOqf2vJRiIhGAkgAIQGEBBASQEgAIQGEBBASQEgAIQGEBBASQEgAMV2J0fv0yK5fGUBNgJAAQgIICSAkgJAAQgIICSAkgJAAQgIICSAkgJAAYloSo/fpkV2/MoCaACEBhAQQEkBIACEBhAQQEkBIACEBhAQQEkBIACEBxLRE3wfQ9wGEmgAhAYQEEBJASAAhAUQEPQf4pFZc+urY+KGnjPffcJPGlAIPZ02+jqUrjPX3QuotELfET2u7AGdPwut7ofk9F7JugKFBo78HLn8ITbVw6mXo7bh62R01vuztNn66EbomiYmONbaXw7w4P29XceBjcOt3jVV3+7jTrxjHn3EBY0fqDnQsrtsM0N9jZNwHxrX8f0pj0/eNn/wJcu9xxCc5Zs7yQ3ySY32J4/Ey2PSoQRjrjYp2zJzjWJTsyChxbHoa5i4OvNzMWY7cksnnZReOnfxguCjjxtthcMAYHPDjLsoiJwOMULcfVt3tWJZt/Kc6vGU2PgR3fMsxOGj8fY9xbB+0Nvh58cmwthhyS+CObztqZxi1z0++ntGr0xkz5sKSNMjaDIuSHWtKjYNPTr5c41kj736o/KMxNDj+ZH/1QT8/cUVwCRKzYPYCR+NJf9ITMx2JWeEfg2mTAU69BAN9xs33hxe/KMEo3AJDQ8auH8OepxyNdY7+Xj801jn2/Nqx+3Efn3Ff8KvZJxRHX6ej8YSj6jd+0ufTA4dXPQ8LPufILhw/PTXTWJrqOFQWej9WbPDluUN+uHJaRAnQ3eY49xosXuFIyAidAnNLIDrGcbwc3qoKfJXVHnQcLzeiYxxpd4W/PR3Dz96D/cfk6grouGQUfHP89IIH4X8XjeqK4HXMnGckZkLvR8b5N+H8m348MdPPi7i7gLdf9G1hOFngpuFO0D/2hY49NtzZS/hy+NuSkOHL/74XOGZwwHH4BVia6kjLttHMlJ7rO58Tm4WJpORBdKyj4SgM9TuG+v14dKwjJS8CbwMvf+j412FIWOVYnBb8CrjhC75sOht6vSMx85aE6pEZs+KML33duH2bl/FkiDT++gvQ12ts2Oz/zv8GDPTB4RdDb1dqwXD6rxqbdva18fMiphM4mgX2QkqezwIHfhE47jNzfNnzURjNy2VfzpgT6lZ07IrtbjcqfwkX64NfxZfbHDX7jbXFjqSVRk4xVJdDV3vw5eKSjBuWOzpajdZ3xmq+8C60t/h5cUlG23n36RDgk3qfXTpxfrPjxkPGLRscF+YZTfVuNObKbRjogZhYuHU59HcFr3vkxHd1jt+O0gDxrQ3Gk5uhv3fs4E+2/yPTWiqBYnj0aS9mS+XV8RP3/94HfHnkL1DbfOVJdsS/ahRthQVr4OCxyeu/1vNxXX0foOJZXxZuCRzTeWH4bmB5GHcMwzGXAhyEh7P8sG290dJgxCc78h8If3vb/u344G1jdpyjqRY6ml2I5w3G6uEO6ddKHTtqGDcUbfXLr77Lx0ZMH2C0za53nDli3JwP8UmTH4CW08O3TGG0lSPtaX1N8LjeLseOH0BXp1H8CKSvC//gn35luPxz6Nj0dTB/YejUPn+hI30dkScAQMVuiIpy3Pmdyee/W+Ef3abkw7I1gU/UshwjJc936N4Io2N2sdGx+2d+fMsTEJ8cngRNNY5dxdByKvSJzSnyZdl2G80+E4ey7TYuNuIEeP+Uo77GWH1ngCag1fHWXi9JwY8gZ6uxaLkRPcMPC5ONnIeMgh/6mPJn4FJzeB2qd4469v0eZs11PPJbmD3/40vDcz5rpN8G/X1GzYHAcTUHfEz6bX6ZiLkLuJK/7YbHfhfkIU8ZRM8wMu5xrNwIKzcGer5glO+8trr3P+v44k2+M/q9XxlHnjCwqffIswshJtbxzyqjuzPw+ro7HWeOGl/Jd2QXGh2HA925XE2wF0/XTQYAqKt2NJwJZr/jxHOOlx4z6vYb7c1Gf48f2puN+krj5W3GiT+4cbd44fLcz+GDc0baasfarR/PPo2k9ON/DR07EvNpaAbcziKbUh7Sz7qv7/r1g5AIRwJIACEBhAQQEkBIACEBRESh7wPo+wBCTYCQAEICCAkgJICQAEICCAkgJICQAEICCAkgJICQAGL6EaP36ZFdvzKAmgAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJASAAhAcS0RN8H0PcBhJoAIQGEBBASQEgAIQGEBBASQEgAIQGEBBASQEgAIQHE9OP/ec9ayCY5dBkAAAAASUVORK5CYII=" + } + Video: 2629360428208, "Video::Map #5", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:\Dev\clean\ufbx\data\textures\checkerboard_metallic.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_metallic.png" + } + UseMipMap: 0 + Filename: "D:\Dev\clean\ufbx\data\textures\checkerboard_metallic.png" + RelativeFilename: "textures\checkerboard_metallic.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEQcOt4x+sgAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAGN0lEQVR42u3ca0xTZwDG8afQdiiIBaa4oUxAVlSKsYm2jqpIUVBEcOAFJ6jDLOzisrkNv7hsiUaXJVsMbmZZtmQTnYPhDRG5I4gIbKAC8TrRDZ2izqFglVJgHxQCpWC10R7q80v40h76npb/Oe9pTzmihGD/Tlig+uJ1S34dSq+R4PjWG98O9FxjAAyAGAAxAGIAxACIARADIAZADIAYADEAYgDEAMhWiSZ7jbTo+wA8nz+4x+cegFMAMQBiAMQAiAEQAyAGQAyAGAAxAGIAxACIARADIJsk5vl0Xh+AOAUQAyAGQAyAGAAxAGIAxACIARADIAZADIAYADEAsjm8PgCvD0CcAogBEAMgBkDPG7GlD/BDQS0A4P49HZJiZ0PXfKfvIBIJvvw1H84yVwDAaq2i95FwfaN5R7ze7mYv28V4rCXvJGF2dBwAIG93Cqo/+bj/I/SHYym93c1+HYzH6285U8/NmJePLxbFrcLUaRq4v+QBsViMxmtXcbKqEof270F56WHh7AEchgxFUMRik/eptPO7//hW3d3Z2UMVPA/tBgPaDQaogufB3t5ekFvmW+9/hLTsYiyNT4C3rxyOTk54wcEBnmO9EBG9BNu2p2JnRp719wBdGi6cRXDUMmSn/oSOdkOv+0JefwMNF85ijI/8kVu4OXsB4/fB5m59AeoZcHZxQ23FEUAkgmKqBppZs1Gcn/3M/rBd69i1zqae88rENUj8IAkdHR1I3/kz9qbuQP35c7Czt4PnWG9ow+ZjSXwCxvsHCGcPkL97B2RuI6DSzut1u3zSFIzxkSM3fbvVt6rXQiMBAGV5GSjL3Q8AWBCzVFBb/qiXR+PtD9cBANavfRebPk3C6boatLbexz2dDmdP1WHb118gcpYKR4sLhRNAeUEmbt+6iTkx8b23/ujlaPr3BioKsqz6wjo6y6BQTYeupRnHSwtxvLQQupZmBAZpIXNxFUwAi5evhEQiQU7mPmRn7Ol3uab/bmHNqljhBNBuMODwgTSM8ZFjvFINAHAb5YEA9UwU7tvVZ1p41tQh4ZBIpKgqyYOhTQ9Dmx5/lORCKpVibmS0YAKYMk0DANiftmvwvQ08nJEKfWsr5ixaAQDQLlwGQ5sexQfSzPr96vrGAX8sERga9WD3n5vRfVtZjvCmAQ/PVwAAp+tODr4AmptuobIoC4qpGnj5KaAJW4jyvEzcbb5t1Rd1tPer8BznhxtXL+N8bVX37X/WHUfDX5cgn+APX78JggjA0WnYg9fyzu3BFwAA5KWnAADe25AMh6GOj3Xwp/R2H/Dnibf+sAdbf3l+Zp/7Du5Ne7gXiBVEALq7LQAAp2HOg+ODIGNXLp7HqepyTFCqUVNRgsbLlwTx3h8AIuISERGXaHK5uQsWYsvmz9He3m7V9b165TKGy1zg5x+AyqMlTz8AS88nd8/fPc5rf/ftViT/qMa2rckmz3f3vK3n+E+yLj0fy9RYM0PC4Ozi9sjHcX1xBFYsjcGJsqK+e6YB1st4zMc9v2/82A1nTsBvogIJCath+OfMYz1/QUwBAFBalA+ltzsqy45YfZfadYC3aX2SyWlltVaBlC0ben1OYE3Fmb+ho6MDU4JCoQ6J6He5IY7DsGbjN8I7BhASmYsrAoO00Le2IidzX7/L/V50CG16PRSq6XB0lll1na/9fbH7OOrNdRsRv/YzjJVPhFgihdRhCDy8fBERl4jNKVmYNG2m8I4BLNHfiZIuj/qot8+8HhkNqVSKwpysAY+qdS3NqK08AqVGC3VIOAr27DR7vYwPTgd6u2rqZJapj7HTv/8KEqkUwVGxmBEegxnhMSYfr/50jW0F8LR2/11H+gM5lpsBpUaLwNCoPgE8a52dnfhl6yYcyzuAoIjFGOc/GcPdRkAkEqHp5nWcq6lCRcFBnDlRafFYooRgf4u+FMovdfIiUTSIMQAGQAyAGAAxAGIAxACIARADoOcErw/A6wMQpwBiAMQAiAEQAyAGQAyAGAAxAGIAxACIARADIAZAtkfM8+n81zDiFEAMgBgAMQBiAMQAiAEQAyAGQAyAGAAxAGIAxADI5vD6ALw+AHEKIAZADIAYADEAYgDEAIgBEAMgBkAMgBgAMQBiAGR7/ge2GSlguckQUwAAAABJRU5ErkJggg==" + } + Texture: 2629283312560, "Texture::Map #14", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #14" + Properties70: { + P: "3dsMax", "Compound", "", "" + P: "3dsMax|ClassIDa", "int", "Integer", "",-1989217540 + P: "3dsMax|ClassIDb", "int", "Integer", "",1153266751 + P: "3dsMax|SuperClassID", "int", "Integer", "",3088 + P: "3dsMax|parameters", "Compound", "", "" + P: "3dsMax|MaxTexture", "KString", "", "", "MULTIOUTPUT_TO_OSLMap" + P: "3dsMax|parameters|sourceMap", "Reference", "", "A" + P: "3dsMax|parameters|outputChannelIndex", "Integer", "", "A",0 + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2629283311120, "Texture::Map #3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #3" + Properties70: { + P: "3dsMax", "Compound", "", "" + P: "3dsMax|ClassIDa", "int", "Integer", "",2140830621 + P: "3dsMax|ClassIDb", "int", "Integer", "",1875767309 + P: "3dsMax|SuperClassID", "int", "Integer", "",3088 + P: "3dsMax|params", "Compound", "", "" + P: "3dsMax|MaxTexture", "KString", "", "", "OSLMap" + P: "3dsMax|params|OSLPath", "KString", "", "A", "C:\Program Files\Autodesk\3ds Max 2023\OSL\RandomTilingBitmap.osl" + P: "3dsMax|params|OSLCode", "KString", "", "A", "// Lookup a bitmap and make random variations so no tiling is evident&cr;&lf;// RandomTilingBitmap.osl, by Zap Andersson&cr;&lf;// Modified: 2020-06-23&cr;&lf;// Copyright 2020 Autodesk Inc, All rights reserved. This file is licensed under Apache 2.0 license&cr;&lf;// https://github.com/ADN-DevTech/3dsMax-OSL-Shaders/blob/license/LICENSE.txt&cr;&lf;&cr;&lf;shader RandomTilingBitmap&cr;&lf;[[ string help = &cr;&lf; "

Bitmap Random Tiling

"&cr;&lf; "Look up a bitmap from passed in UV coordinates and modify each "&cr;&lf; "repetition of the bitmap such that tiling is not evident. Has "&cr;&lf; "a mode to properly transform normal maps. Outputs the "&cr;&lf; "modified UV so it can be hooked up to other Bitmap Lookup shaders "&cr;&lf; "to apply the identical randomness, plus outputs the Random Index "&cr;&lf; "itself to drive downstream modifications that are in sync with it.",&cr;&lf; string label = "Bitmap Random Tiling",&cr;&lf; string version = "1.0" ]]&cr;&lf;( &cr;&lf; point Pos = point(u,v,0) &cr;&lf; [[ string label= "UV Coordinate", &cr;&lf; string help = "The 2D coordinate at which the texture is looked up." ]],&cr;&lf; float Scale = 0.25&cr;&lf; [[ string help = "A linear scale factor. For more complex UV manipulation, connect the UVWTransform." ]], &cr;&lf; &cr;&lf; string Filename = "uv-grid.png" &cr;&lf; [[ string widget="filename", &cr;&lf; string label="File name",&cr;&lf; string help="The name of the texture to look up" ]], &cr;&lf; int NormalMap = 0 &cr;&lf; [[ string widget="checkBox", &cr;&lf; string packName = "Normal Map",&cr;&lf; string label = "Normal Map",&cr;&lf; int connectable = 0,&cr;&lf; string help="If the texture is a normal map, special transformations have to be applied to retain the proper orientation upon rotation. Check this box if the texture is a normal map." ]],&cr;&lf; int NormalFlipR = 0 &cr;&lf; [[ string widget="checkBox", &cr;&lf; string packName = "Normal Map",&cr;&lf; string label = "Flip Red",&cr;&lf; int connectable = 0,&cr;&lf; string help="Invert red component for rotation of normal maps." ]],&cr;&lf; int NormalFlipG = 0 &cr;&lf; [[ string widget="checkBox", &cr;&lf; string packName = "Normal Map",&cr;&lf; string label = "Flip Green",&cr;&lf; int connectable = 0, &cr;&lf; string help="Invert green component for rotation of normal maps." ]],&cr;&lf; string Filename_UDIMList = "" &cr;&lf; [[ string label="Viewport UDIM List",&cr;&lf; int connectable = 0,&cr;&lf; string help="The list of UDIM items to load into the viewport. If empty, will be deduced from the file system automatically. " ]], &cr;&lf; string LoadUDIM = "Load UDIM..." &cr;&lf; [[ string widget="max:actionButton", &cr;&lf; string actionID="loadUDIM(\"Filename\")",&cr;&lf; string help="Select a set of files to load as an UDIM.",&cr;&lf; int connectable = 0 ]], &cr;&lf; int UDIM = 0&cr;&lf; [[ string widget="checkBox", string label="UDIM-compatible lookup",&cr;&lf; int connectable = 0,&cr;&lf; string help ="Modifies the UV coordinate so that UDIM's are looked up similar to the max MultiTile map" ]], &cr;&lf; string WrapMode = "periodic"&cr;&lf; [[ string widget="popup", string options = "default|black|clamp|periodic|mirror",&cr;&lf; string label="Wrap Mode",&cr;&lf; string help="How the texture wraps: (black, clamp, periodic or mirror)." ]], &cr;&lf;&cr;&lf; int Randomize = 1 &cr;&lf; [[ string help = &cr;&lf; "Enables all randomization. Can be disabled for debugging purposes. ",&cr;&lf; int connectable=0 ]],&cr;&lf; int RandomizePos = 1 &cr;&lf; [[ string help = &cr;&lf; "Enables randomization in UV space by making a 'distorted grid' and "&cr;&lf; "apply one variation in each 'square' of the grid. "&cr;&lf; "If this is OFF, no spatially varying randomness occurs. "&cr;&lf; "There is still variation per Seed value. If Seed is driven from "&cr;&lf; "e.g. a Node Handle map, this gives one random value per object.",&cr;&lf; int connectable=0 ]],&cr;&lf; float RandScale = 1.0&cr;&lf; [[ string help = &cr;&lf; "Scale of the 'distorted grid' in relation to UV space. "&cr;&lf; "A value of 1.0 means the 'distorted grid' is the same size as a "&cr;&lf; "unit square in UV space, a smaller number makes the grid smaller and "&cr;&lf; "a larger value makes it larger. "&cr;&lf; "A value of zero disables spatially varying randomness "&cr;&lf; "but still makes a variation per Seed value. If Seed is driven from "&cr;&lf; "e.g. a Node Handle map, this gives one random value per object." ]],&cr;&lf;&cr;&lf;&cr;&lf; float WiggleScale = 0.2 [[ string help="Scale of the 'wiggliness' of edges, in relation to the UV space" ]],&cr;&lf; float WiggleAmount = 0.25 &cr;&lf; [[ float min=0.0, float max=10.0,&cr;&lf; string help="Amount of 'wiggliness' on the edge of the randomness grid, to obscure the fact that it is a grid."&cr;&lf; ]],&cr;&lf; float EdgeFuzz = 0.1 &cr;&lf; [[ float min=0.0, float max=10.0,&cr;&lf; string help="Amount of 'crossfade' at the edge of the randomness grid. Note this is computed stochastically and may introduce some noisiness. "&cr;&lf; ]],&cr;&lf;&cr;&lf; &cr;&lf; float RotMin = 0.0 [[ float min=-360.0, float max=360.0 ]],&cr;&lf; float RotMax = 360.0 [[ float min=-360.0, float max=360.0 ]],&cr;&lf; float ScaleMin = 1.0 [[ float min= 0.1, float max=10.0 ]],&cr;&lf; float ScaleMax = 1.0 [[ float min= 0.1, float max=10.0 ]],&cr;&lf; float UOffset = 0.0,&cr;&lf; float VOffset = 0.0,&cr;&lf; &cr;&lf; int Seed = 0 [[ string help = "Random seed. Connect to e.g. Node Handle map to have per-object randomness" ]],&cr;&lf; &cr;&lf; vector HSVMin = vector(0.0,1.0,1.0),&cr;&lf; vector HSVMax = vector(0.0,1.0,1.0), &cr;&lf;&cr;&lf;&cr;&lf; int AutoGamma = 1 &cr;&lf; [[ string widget="checkBox", int connectable=0 ]],&cr;&lf; float ManualGamma = 1.0 &cr;&lf; [[ string label="Manual Gamma" ]],&cr;&lf;&cr;&lf; &cr;&lf; &cr;&lf; output color Col = 0 [[ string label="Col (RGB)" ]],&cr;&lf; output float R = 0,&cr;&lf; output float G = 0,&cr;&lf; output float B = 0,&cr;&lf; output float A = 1,&cr;&lf; output float Luminance = 0,&cr;&lf; output float Average = 0,&cr;&lf; output point UV = 0,&cr;&lf; output int RandomIndex = 0,&cr;&lf;)&cr;&lf;{&cr;&lf; // Skip empty files&cr;&lf; if (Filename == "")&cr;&lf; return;&cr;&lf; &cr;&lf; point p = Pos / Scale;&cr;&lf; &cr;&lf; point noisepoint = 0; &cr;&lf; &cr;&lf; if (RandomizePos) &cr;&lf; {&cr;&lf; point wigglepoint = p / WiggleScale;&cr;&lf; noisepoint = p / RandScale + (noise(wigglepoint, Seed)-point(0.5,0.5,0.0)) * WiggleAmount + noise("hash", p) * EdgeFuzz;&cr;&lf; }&cr;&lf; &cr;&lf; point rotscale = Randomize?noise("cell", noisepoint, Seed + 10):0;&cr;&lf; point position = Randomize?noise("cell", noisepoint, Seed + 11) - point(0.5,0.5,0.0):0; &cr;&lf; point hsvchange = Randomize?noise("cell", noisepoint, Seed + 12):0; &cr;&lf;&cr;&lf; // Output one of the randomizers so people can do external randomization&cr;&lf; // based on these&cr;&lf; RandomIndex = int(rotscale[2] * 500000000);&cr;&lf;&cr;&lf; // Compute the actual rotation (in radians) &cr;&lf; float rotation = radians(mix(RotMin, RotMax, rotscale[0]));&cr;&lf;&cr;&lf; vector hsvTweak = mix(HSVMin, HSVMax, hsvchange);&cr;&lf; &cr;&lf; p -= point(0.5,0.5,0.0);&cr;&lf; &cr;&lf; p = rotate(p, rotation, 0.0, vector(0.0,0.0,1.0));&cr;&lf; p /= mix(ScaleMin, ScaleMax, rotscale[1]);&cr;&lf; p += point(position[0] * UOffset, position[1] * VOffset, 0.0);&cr;&lf; &cr;&lf; p += point(0.5,0.5,0.0);&cr;&lf; &cr;&lf; UV = p;&cr;&lf;&cr;&lf; // Default lookup, just use u and inverted v...&cr;&lf; float ulookup = p[0];&cr;&lf; float vlookup = 1.0 - p[1];&cr;&lf; &cr;&lf; // But for UDIM compatibility and max's idea that 0,0 is in &cr;&lf; // lower left corner, we need this juggling of v....&cr;&lf; if (UDIM)&cr;&lf; {&cr;&lf; float vfloor = floor(p[1]);&cr;&lf; float vfrac = p[1] - vfloor;&cr;&lf; vlookup = vfloor + (1.0 - vfrac);&cr;&lf; }&cr;&lf; &cr;&lf; Col = texture(Filename, ulookup, vlookup, "wrap", WrapMode, "alpha", A);&cr;&lf;&cr;&lf; if (NormalMap == 0)&cr;&lf; { &cr;&lf; color hsv = transformc("rgb", "hsv", Col);&cr;&lf; hsv[0] += hsvTweak[0]; // Offset the hue&cr;&lf; //hsv[1] *= hsvTweak[1]; // Scale the saturation&cr;&lf; hsv[2] *= hsvTweak[2]; // Scale the value&cr;&lf; Col = transformc("hsv", "rgb", hsv); &cr;&lf; // Simulate saturation via gamma - more visually pleasing&cr;&lf; Col = pow(Col, hsvTweak[1]); &cr;&lf; }&cr;&lf; else&cr;&lf; {&cr;&lf; // Flip components if needed&cr;&lf; if (NormalFlipR) Col[0] = 1.0 - Col[0];&cr;&lf; if (NormalFlipG) Col[1] = 1.0 - Col[1];&cr;&lf; &cr;&lf; Col = rotate(Col, rotation, point(0.5,0.5,0.0), point(0.5,0.5,1.0));&cr;&lf; &cr;&lf; // Flip components back if needed&cr;&lf; if (NormalFlipR) Col[0] = 1.0 - Col[0];&cr;&lf; if (NormalFlipG) Col[1] = 1.0 - Col[1];&cr;&lf; }&cr;&lf; &cr;&lf; &cr;&lf; int channels;&cr;&lf; gettextureinfo(Filename, "channels", channels);&cr;&lf; if (channels < 4) // No alpha? Set it to opaque&cr;&lf; {&cr;&lf; A = 1.0;&cr;&lf;&cr;&lf; if (WrapMode == "black") // 2018-04-25: Allow Decals&cr;&lf; {&cr;&lf; if (p[0] < 0.0 || p[0] > 1.0 ||&cr;&lf; p[1] < 0.0 || p[1] > 1.0)&cr;&lf; A = 0.0;&cr;&lf; }&cr;&lf; }&cr;&lf; &cr;&lf; if (!NormalMap)&cr;&lf; {&cr;&lf; // Temporary workaround for color space issues&cr;&lf; if (AutoGamma)&cr;&lf; {&cr;&lf; if (!endswith(Filename, ".exr") &&&cr;&lf; !endswith(Filename, ".EXR") &&&cr;&lf; !endswith(Filename, ".hdr") &&&cr;&lf; !endswith(Filename, ".HDR") &&&cr;&lf; !endswith(Filename, ".tx") &&&cr;&lf; !endswith(Filename, ".TX"))&cr;&lf; {&cr;&lf; // Gamma 2.2 for sRGB approx)&cr;&lf; Col = pow(Col, 2.2);&cr;&lf; }&cr;&lf; }&cr;&lf; else&cr;&lf; {&cr;&lf; if (ManualGamma != 1.0)&cr;&lf; Col = pow(Col, ManualGamma);&cr;&lf; }&cr;&lf; }&cr;&lf; &cr;&lf; R = Col[0];&cr;&lf; G = Col[1];&cr;&lf; B = Col[2];&cr;&lf; Luminance = luminance(Col);&cr;&lf; Average = (R + G + B) / 3.0;&cr;&lf;}" + + P: "3dsMax|params|OSLAutoUpdate", "Bool", "", "A",1 + P: "3dsMax|params|OSLShaderName", "KString", "", "A", "RandomTilingBitmap" + P: "3dsMax|params|OSLPresetName", "KString", "", "A", "" + P: "3dsMax|RandomTilingBitmap", "Compound", "", "" + P: "3dsMax|RandomTilingBitmap|Scale", "Float", "", "A",0.25 + P: "3dsMax|RandomTilingBitmap|Filename", "KString", "", "A", "D:\Dev\clean\ufbx\data\textures\checkerboard_diffuse.png" + P: "3dsMax|RandomTilingBitmap|NormalMap", "Integer", "", "A",0 + P: "3dsMax|RandomTilingBitmap|NormalFlipR", "Integer", "", "A",0 + P: "3dsMax|RandomTilingBitmap|NormalFlipG", "Integer", "", "A",0 + P: "3dsMax|RandomTilingBitmap|Filename_UDIMList", "KString", "", "A", "" + P: "3dsMax|RandomTilingBitmap|LoadUDIM", "KString", "", "A", "Load UDIM..." + P: "3dsMax|RandomTilingBitmap|UDIM", "Integer", "", "A",0 + P: "3dsMax|RandomTilingBitmap|WrapMode", "KString", "", "A", "periodic" + P: "3dsMax|RandomTilingBitmap|Randomize", "Integer", "", "A",1 + P: "3dsMax|RandomTilingBitmap|RandomizePos", "Integer", "", "A",1 + P: "3dsMax|RandomTilingBitmap|RandScale", "Float", "", "A",1 + P: "3dsMax|RandomTilingBitmap|WiggleScale", "Float", "", "A",0.2 + P: "3dsMax|RandomTilingBitmap|WiggleAmount", "Float", "", "A",0.25 + P: "3dsMax|RandomTilingBitmap|EdgeFuzz", "Float", "", "A",0.1 + P: "3dsMax|RandomTilingBitmap|RotMin", "Float", "", "A",0 + P: "3dsMax|RandomTilingBitmap|RotMax", "Float", "", "A",360 + P: "3dsMax|RandomTilingBitmap|ScaleMin", "Float", "", "A",1 + P: "3dsMax|RandomTilingBitmap|ScaleMax", "Float", "", "A",1 + P: "3dsMax|RandomTilingBitmap|UOffset", "Float", "", "A",0 + P: "3dsMax|RandomTilingBitmap|VOffset", "Float", "", "A",0 + P: "3dsMax|RandomTilingBitmap|Seed", "Integer", "", "A",0 + P: "3dsMax|RandomTilingBitmap|HSVMin", "Vector", "", "A",0,1,1 + P: "3dsMax|RandomTilingBitmap|HSVMax", "Vector", "", "A",0,1,1 + P: "3dsMax|RandomTilingBitmap|AutoGamma", "Integer", "", "A",1 + P: "3dsMax|RandomTilingBitmap|ManualGamma", "Float", "", "A",1 + P: "3dsMax|RandomTilingBitmap|Pos_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|Scale_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|Filename_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|WrapMode_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|RandScale_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|WiggleScale_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|WiggleAmount_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|EdgeFuzz_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|RotMin_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|RotMax_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|ScaleMin_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|ScaleMax_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|UOffset_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|VOffset_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|Seed_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|HSVMin_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|HSVMax_map", "Reference", "", "A" + P: "3dsMax|RandomTilingBitmap|ManualGamma_map", "Reference", "", "A" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2629283311600, "Texture::Map #7", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #7" + Properties70: { + P: "3dsMax", "Compound", "", "" + P: "3dsMax|ClassIDa", "int", "Integer", "",2140830621 + P: "3dsMax|ClassIDb", "int", "Integer", "",1875767309 + P: "3dsMax|SuperClassID", "int", "Integer", "",3088 + P: "3dsMax|params", "Compound", "", "" + P: "3dsMax|MaxTexture", "KString", "", "", "OSLMap" + P: "3dsMax|params|OSLPath", "KString", "", "A", "C:\Program Files\Autodesk\3ds Max 2023\OSL\ColorTweak.osl" + P: "3dsMax|params|OSLCode", "KString", "", "A", "// Tweak a color.&cr;&lf;// ColorTweak.osl, by Zap Andersson&cr;&lf;// Modified: 2019-11-25&cr;&lf;// Copyright 2019 Autodesk Inc, All rights reserved. This file is licensed under Apache 2.0 license&cr;&lf;// https://github.com/ADN-DevTech/3dsMax-OSL-Shaders/blob/license/LICENSE.txt&cr;&lf;&cr;&lf;shader ColorTweak&cr;&lf;[[ string help = "Tweaks a color (Levels)",&cr;&lf; string label= "Tweak/Levels",&cr;&lf; // string category = "Color Correction" &cr;&lf;]]&cr;&lf;(&cr;&lf; color Input = 0.0,&cr;&lf; &cr;&lf; vector HSV = vector(0.0,1.0,1.0)&cr;&lf; [[ string help = "Hue shift and Saturation / Value multiplier " ]], &cr;&lf; color InputMin = 0.0&cr;&lf; [[ string help = "The input value that maps to the darkest output. Incoming black level. " ]], &cr;&lf; color InputMax = 1.0&cr;&lf; [[ string help = "The input value that maps to the brightst output. Incoming white level. " ]], &cr;&lf; float MidTones = 1.0&cr;&lf; [[ string help = "Adjusts the MidTones/Gamma.",&cr;&lf; float min = 0.01, float max = 9.99 ]],&cr;&lf; color OutputMin = 0.0&cr;&lf; [[ string help = "The output black level." ]], &cr;&lf; color OutputMax = 1.0&cr;&lf; [[ string help = "The output white level." ]],&cr;&lf;&cr;&lf; int Clamp = 1&cr;&lf; [[ string widget = "checkBox",&cr;&lf; string help = "Clamp the output to the 0-1 range for each component" ]],&cr;&lf; &cr;&lf; output color Out = 0.0,&cr;&lf;)&cr;&lf;{&cr;&lf; color col = (Input - InputMin) / InputMax;&cr;&lf;&cr;&lf; // Tramsform to HSV space &cr;&lf; color hsv = transformc("rgb", "hsv", col);&cr;&lf;&cr;&lf; hsv[0] += HSV[0]; // Add to hue (offset)&cr;&lf; hsv[1] *= HSV[1]; // Scale saturation&cr;&lf; hsv[2] *= HSV[2]; // Scale value&cr;&lf; &cr;&lf; // Convert back to RGB&cr;&lf; col = transformc("hsv", "rgb", hsv);&cr;&lf; &cr;&lf; Out = mix(OutputMin, OutputMax, pow(col, 1.0/MidTones));&cr;&lf; &cr;&lf; if (Clamp)&cr;&lf; Out = clamp(Out, 0.0, 1.0);&cr;&lf;}&cr;&lf;" + + P: "3dsMax|params|OSLAutoUpdate", "Bool", "", "A",1 + P: "3dsMax|params|OSLShaderName", "KString", "", "A", "ColorTweak" + P: "3dsMax|params|OSLPresetName", "KString", "", "A", "" + P: "3dsMax|ColorTweak", "Compound", "", "" + P: "3dsMax|ColorTweak|Input", "ColorAndAlpha", "", "A",0,0,0,1 + P: "3dsMax|ColorTweak|HSV", "Vector", "", "A",0,1,1 + P: "3dsMax|ColorTweak|InputMin", "ColorAndAlpha", "", "A",0,0,0,1 + P: "3dsMax|ColorTweak|InputMax", "ColorAndAlpha", "", "A",1,1,1,1 + P: "3dsMax|ColorTweak|MidTones", "Float", "", "A",1 + P: "3dsMax|ColorTweak|OutputMin", "ColorAndAlpha", "", "A",0,0,0,1 + P: "3dsMax|ColorTweak|OutputMax", "ColorAndAlpha", "", "A",1,1,1,1 + P: "3dsMax|ColorTweak|Clamp", "Integer", "", "A",1 + P: "3dsMax|ColorTweak|Input_map", "Reference", "", "A" + P: "3dsMax|ColorTweak|HSV_map", "Reference", "", "A" + P: "3dsMax|ColorTweak|InputMin_map", "Reference", "", "A" + P: "3dsMax|ColorTweak|InputMax_map", "Reference", "", "A" + P: "3dsMax|ColorTweak|MidTones_map", "Reference", "", "A" + P: "3dsMax|ColorTweak|OutputMin_map", "Reference", "", "A" + P: "3dsMax|ColorTweak|OutputMax_map", "Reference", "", "A" + P: "3dsMax|ColorTweak|Clamp_map", "Reference", "", "A" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2629283312080, "Texture::Map #8", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #8" + Properties70: { + P: "UVSet", "KString", "", "", "UVChannel_1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::Map #8" + FileName: "D:\Dev\clean\ufbx\data\textures\checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "Alpha_Black" + Cropping: 0,0,0,0 + } + Texture: 2627031770624, "Texture::Map #16", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #16" + Properties70: { + P: "3dsMax", "Compound", "", "" + P: "3dsMax|ClassIDa", "int", "Integer", "",-1989217540 + P: "3dsMax|ClassIDb", "int", "Integer", "",1153266751 + P: "3dsMax|SuperClassID", "int", "Integer", "",3088 + P: "3dsMax|parameters", "Compound", "", "" + P: "3dsMax|MaxTexture", "KString", "", "", "MULTIOUTPUT_TO_OSLMap" + P: "3dsMax|parameters|sourceMap", "Reference", "", "A" + P: "3dsMax|parameters|outputChannelIndex", "Integer", "", "A",0 + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2627031769664, "Texture::Map #4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #4" + Properties70: { + P: "3dsMax", "Compound", "", "" + P: "3dsMax|ClassIDa", "int", "Integer", "",2140830621 + P: "3dsMax|ClassIDb", "int", "Integer", "",1875767309 + P: "3dsMax|SuperClassID", "int", "Integer", "",3088 + P: "3dsMax|params", "Compound", "", "" + P: "3dsMax|MaxTexture", "KString", "", "", "OSLMap" + P: "3dsMax|params|OSLPath", "KString", "", "A", "C:\Program Files\Autodesk\3ds Max 2023\OSL\UberBitmap.osl" + P: "3dsMax|params|OSLCode", "KString", "", "A", "// Load a bitmap into OSL (UBER version, with everything built-in)&cr;&lf;// UberBitmap.osl, by Zap Andersson&cr;&lf;// Modified: 2020-04-14&cr;&lf;// Copyright 2020 Autodesk Inc, All rights reserved. This file is licensed under Apache 2.0 license&cr;&lf;// https://github.com/ADN-DevTech/3dsMax-OSL-Shaders/blob/license/LICENSE.txt&cr;&lf;&cr;&lf;shader UberBitmap2&cr;&lf;[[ string help = "All-in-one shader for loading a bitmap via OpenImageIO.
Includes UVW channels and transforms in a monolithic version.",&cr;&lf; string label = "Uber Bitmap",&cr;&lf; string version = "2.0" &cr;&lf;]]&cr;&lf;( &cr;&lf; int UVSet = 1 &cr;&lf; [[ string label="Map Channel",&cr;&lf; string help ="The 3ds max Map channel to look up",&cr;&lf; int min = 0, int max = 99 ]],&cr;&lf; float Scale = 1.0 &cr;&lf; [[ string help="The overall Scale. Larger number = bigger." ]],&cr;&lf; vector Tiling = 1.0 &cr;&lf; [[ string help="A per-axis dividing scale, to subdivide the values. Larger number = smaller." ]],&cr;&lf; vector Offset = 0.0&cr;&lf; [[ string help="Moves the UVW coordinates around" ]],&cr;&lf; &cr;&lf; // Real world parameters &cr;&lf; int RealWorld = 0 &cr;&lf; [[ string widget = "checkBox",&cr;&lf; int connectable = 0,&cr;&lf; string help = "Enable Real-World Scaling" ]],&cr;&lf; float RealWidth = 0.2 &cr;&lf; [[ int worldunits=1,&cr;&lf; string help = "Real Width of one unit of texture space" ]], &cr;&lf; float RealHeight = 0.2 &cr;&lf; [[ int worldunits=1,&cr;&lf; string help = "Real Height of one unit of texture space" ]], &cr;&lf; &cr;&lf; float Rotate = 0.0&cr;&lf; [[ string help="A rotation angle in degrees." ]],,&cr;&lf; point RotCenter = point(0.5,0.5,0) &cr;&lf; [[ string label = "Rotation Center",&cr;&lf; string help = "The center of rotation in UVW space" ]],&cr;&lf; vector RotAxis = vector(0.0,0.0,1.0) &cr;&lf; [[ string label = "Rotation Axis",&cr;&lf; string help = "An axis around which the rotation occurs." ]],&cr;&lf; &cr;&lf; string Filename = "" &cr;&lf; [[ string widget="filename", &cr;&lf; string label="File name",&cr;&lf; string help="The name of the texture to look up" ]], &cr;&lf; &cr;&lf; string Filename_UDIMList = "" &cr;&lf; [[ string widget = "null",&cr;&lf; string label="Viewport UDIM List",&cr;&lf; string help="The list of UDIM items to load into the viewport. If empty, will be deduced from the file system automatically. " ]], &cr;&lf; string LoadUDIM = "Load UDIM..." &cr;&lf; [[ string widget="max:actionButton", &cr;&lf; string actionID="loadUDIM(\"Filename\")",&cr;&lf; string help="Select a set of files to load as an UDIM.",&cr;&lf; int connectable = 0 ]], &cr;&lf; &cr;&lf; int UDIM = 0&cr;&lf; [[ string widget="checkBox", string label="UDIM-compatible lookup",&cr;&lf; int connectable = 0,&cr;&lf; string help ="Modifies the UV coordinate so that UDIM's are looked up similar to the max MultiTile map" ]], &cr;&lf; string WrapMode = "periodic"&cr;&lf; [[ string widget="popup", string options = "default|black|clamp|periodic|mirror",&cr;&lf; string label="Wrap Mode",&cr;&lf; string help="How the texture wraps: (black, clamp, periodic or mirror)." ]],&cr;&lf; &cr;&lf; int AutoGamma = 1 &cr;&lf; [[ string widget="checkBox", int connectable = 0 ]],&cr;&lf; float ManualGamma = 1.0 &cr;&lf; [[ string label="Manual Gamma" ]],&cr;&lf; &cr;&lf; output color Col = 0 [[ string label="Col (RGB)" ]],&cr;&lf; output float R = 0,&cr;&lf; output float G = 0,&cr;&lf; output float B = 0,&cr;&lf; output float A = 1,&cr;&lf; output float Luminance = 0,&cr;&lf; output float Average = 0&cr;&lf;)&cr;&lf;{&cr;&lf; // Skip empty filenames&cr;&lf; if (Filename == "")&cr;&lf; return;&cr;&lf; &cr;&lf; point UVW = point(u,v,0);&cr;&lf;&cr;&lf; // Get UVW channel&cr;&lf; if (!getattribute(format("UV%d", UVSet), UVW))&cr;&lf; {&cr;&lf; // Get MAXtoA style UV&cr;&lf; float w = 0.0;&cr;&lf; &cr;&lf; // Default UV set handled in&cr;&lf; // a special way in MAXtoA&cr;&lf; if (UVSet == 1)&cr;&lf; {&cr;&lf; UVW = vector(u,v,0);&cr;&lf; getattribute("w", w);&cr;&lf; }&cr;&lf; else // ...the others are just attributes&cr;&lf; {&cr;&lf; getattribute(format("uv_%d", UVSet), UVW);&cr;&lf; getattribute(format("w_%d", UVSet), w);&cr;&lf; }&cr;&lf; // Insert 3rd dimension if any&cr;&lf; UVW[2] = w;&cr;&lf; }&cr;&lf;&cr;&lf; vector worldScale = 1.0;&cr;&lf; &cr;&lf; if (RealWorld)&cr;&lf; worldScale = vector(RealWidth, RealHeight, 1.0);&cr;&lf;&cr;&lf; // Do the transform stuff&cr;&lf; point p = rotate(UVW - Offset, radians(Rotate), RotCenter, RotCenter + RotAxis) * Tiling / worldScale / Scale;&cr;&lf;&cr;&lf; // Default lookup, just use u and inverted v...&cr;&lf; float ulookup = p[0];&cr;&lf; float vlookup = 1.0 - p[1];&cr;&lf; &cr;&lf; // But for UDIM compatibility and max's idea that 0,0 is in &cr;&lf; // lower left corner, we need this juggling of v....&cr;&lf; if (UDIM)&cr;&lf; {&cr;&lf; float vfloor = floor(p[1]);&cr;&lf; float vfrac = p[1] - vfloor;&cr;&lf; vlookup = vfloor + (1.0 - vfrac);&cr;&lf; }&cr;&lf; &cr;&lf; Col = texture(Filename, ulookup, vlookup, "wrap", WrapMode, "alpha", A);&cr;&lf; &cr;&lf; int channels;&cr;&lf; gettextureinfo(Filename, "channels", channels);&cr;&lf; if (channels < 4) // No alpha? Set it to opaque&cr;&lf; {&cr;&lf; A = 1.0;&cr;&lf;&cr;&lf; if (WrapMode == "black") // 2018-04-25: Allow Decals&cr;&lf; {&cr;&lf; if (p[0] < 0.0 || p[0] > 1.0 ||&cr;&lf; p[1] < 0.0 || p[1] > 1.0)&cr;&lf; A = 0.0;&cr;&lf; }&cr;&lf; }&cr;&lf;&cr;&lf; // Temporary workaround for color space issues&cr;&lf; if (AutoGamma)&cr;&lf; {&cr;&lf; if (!endswith(Filename, ".exr") &&&cr;&lf; !endswith(Filename, ".EXR") &&&cr;&lf; !endswith(Filename, ".hdr") &&&cr;&lf; !endswith(Filename, ".HDR") &&&cr;&lf; !endswith(Filename, ".tx") &&&cr;&lf; !endswith(Filename, ".TX"))&cr;&lf; {&cr;&lf; // Gamma 2.2 for sRGB approx)&cr;&lf; Col = pow(Col, 2.2);&cr;&lf; }&cr;&lf; }&cr;&lf; else&cr;&lf; {&cr;&lf; if (ManualGamma != 1.0)&cr;&lf; Col = pow(Col, ManualGamma);&cr;&lf; }&cr;&lf; &cr;&lf; R = Col[0];&cr;&lf; G = Col[1];&cr;&lf; B = Col[2];&cr;&lf; Luminance = luminance(Col);&cr;&lf; Average = (R + G + B) / 3.0;&cr;&lf;}" + + P: "3dsMax|params|OSLAutoUpdate", "Bool", "", "A",1 + P: "3dsMax|params|OSLShaderName", "KString", "", "A", "UberBitmap2" + P: "3dsMax|params|OSLPresetName", "KString", "", "A", "" + P: "3dsMax|UberBitmap2", "Compound", "", "" + P: "3dsMax|UberBitmap2|UVSet", "Integer", "", "A",1 + P: "3dsMax|UberBitmap2|Scale", "Float", "", "A",1 + P: "3dsMax|UberBitmap2|Tiling", "Vector", "", "A",1,1,1 + P: "3dsMax|UberBitmap2|Offset", "Vector", "", "A",0,0,0 + P: "3dsMax|UberBitmap2|RealWorld", "Integer", "", "A",0 + P: "3dsMax|UberBitmap2|RealWidth", "Float", "", "A",7.874016 + P: "3dsMax|UberBitmap2|RealHeight", "Float", "", "A",7.874016 + P: "3dsMax|UberBitmap2|Rotate", "Float", "", "A",0 + P: "3dsMax|UberBitmap2|RotCenter", "Vector", "", "A",0.5,0.5,0 + P: "3dsMax|UberBitmap2|RotAxis", "Vector", "", "A",0,0,1 + P: "3dsMax|UberBitmap2|Filename", "KString", "", "A", "D:\Dev\clean\ufbx\data\textures\checkerboard_roughness.png" + P: "3dsMax|UberBitmap2|Filename_UDIMList", "KString", "", "A", "" + P: "3dsMax|UberBitmap2|LoadUDIM", "KString", "", "A", "Load UDIM..." + P: "3dsMax|UberBitmap2|UDIM", "Integer", "", "A",0 + P: "3dsMax|UberBitmap2|WrapMode", "KString", "", "A", "periodic" + P: "3dsMax|UberBitmap2|AutoGamma", "Integer", "", "A",1 + P: "3dsMax|UberBitmap2|ManualGamma", "Float", "", "A",1 + P: "3dsMax|UberBitmap2|UVSet_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|Scale_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|Tiling_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|Offset_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|RealWidth_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|RealHeight_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|Rotate_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|RotCenter_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|RotAxis_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|Filename_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|Filename_UDIMList_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|WrapMode_map", "Reference", "", "A" + P: "3dsMax|UberBitmap2|ManualGamma_map", "Reference", "", "A" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2627031771584, "Texture::Map #9", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #9" + Properties70: { + P: "3dsMax", "Compound", "", "" + P: "3dsMax|ClassIDa", "int", "Integer", "",2121471519 + P: "3dsMax|ClassIDb", "int", "Integer", "",-1235266194 + P: "3dsMax|SuperClassID", "int", "Integer", "",3088 + P: "3dsMax|ai_bump2d Parameter Wrapper", "Compound", "", "" + P: "3dsMax|ai_bump2d Parameter Wrapper|TheList", "Reference", "", "A" + P: "3dsMax|ai_bump2d Parameter Wrapper|Shader Version", "Integer", "", "A",0 + P: "3dsMax|ai_bump2d Parameters/Connections", "Compound", "", "" + P: "3dsMax|ai_bump2d Parameters/Connections|bump_map", "Float", "", "A",0 + P: "3dsMax|ai_bump2d Parameters/Connections|bump_map.connected", "Bool", "", "A",1 + P: "3dsMax|ai_bump2d Parameters/Connections|bump_map.shader", "Reference", "", "A" + P: "3dsMax|ai_bump2d Parameters/Connections|bump_height", "Float", "", "A",1 + P: "3dsMax|ai_bump2d Parameters/Connections|bump_height.connected", "Bool", "", "A",1 + P: "3dsMax|ai_bump2d Parameters/Connections|bump_height.shader", "Reference", "", "A" + P: "3dsMax|ai_bump2d Parameters/Connections|normal", "Vector", "", "A",0,0,0 + P: "3dsMax|ai_bump2d Parameters/Connections|normal.connected", "Bool", "", "A",1 + P: "3dsMax|ai_bump2d Parameters/Connections|normal.shader", "Reference", "", "A" + P: "3dsMax|ai_bump2d Results", "Compound", "", "" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2627031772064, "Texture::Map #10", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #10" + Properties70: { + P: "UVSet", "KString", "", "", "UVChannel_1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::Map #10" + FileName: "D:\Dev\clean\ufbx\data\textures\checkerboard_normal.png" + RelativeFilename: "textures\checkerboard_normal.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "Alpha_Black" + Cropping: 0,0,0,0 + } + Texture: 2627031772544, "Texture::Map #12", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #12" + Properties70: { + P: "3dsMax", "Compound", "", "" + P: "3dsMax|ClassIDa", "int", "Integer", "",-1989217540 + P: "3dsMax|ClassIDb", "int", "Integer", "",1153266751 + P: "3dsMax|SuperClassID", "int", "Integer", "",3088 + P: "3dsMax|parameters", "Compound", "", "" + P: "3dsMax|MaxTexture", "KString", "", "", "MULTIOUTPUT_TO_OSLMap" + P: "3dsMax|parameters|sourceMap", "Reference", "", "A" + P: "3dsMax|parameters|outputChannelIndex", "Integer", "", "A",0 + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2627031773024, "Texture::Map #2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #2" + Properties70: { + P: "3dsMax", "Compound", "", "" + P: "3dsMax|ClassIDa", "int", "Integer", "",2140830621 + P: "3dsMax|ClassIDb", "int", "Integer", "",1875767309 + P: "3dsMax|SuperClassID", "int", "Integer", "",3088 + P: "3dsMax|params", "Compound", "", "" + P: "3dsMax|MaxTexture", "KString", "", "", "OSLMap" + P: "3dsMax|params|OSLPath", "KString", "", "A", "C:\Program Files\Autodesk\3ds Max 2023\OSL\OSLBitmap.osl" + P: "3dsMax|params|OSLCode", "KString", "", "A", "// Lookup a bitmap bitmap with OSL&cr;&lf;// OSLBitmap.osl, by Zap Andersson&cr;&lf;// Modified: 2020-06-23&cr;&lf;// Copyright 2020 Autodesk Inc, All rights reserved. This file is licensed under Apache 2.0 license&cr;&lf;// https://github.com/ADN-DevTech/3dsMax-OSL-Shaders/blob/license/LICENSE.txt&cr;&lf;&cr;&lf;shader OSLBitmap2&cr;&lf;[[ string help = "Look up a bitmap from passed in UV coordinates
(through OpenImageIO)",&cr;&lf; string label = "Bitmap Lookup",&cr;&lf; string version = "2.0" ]]&cr;&lf;( &cr;&lf; point Pos = point(u,v,0) &cr;&lf; [[ string label= "UV Coordinate", &cr;&lf; string help = "The 2D coordinate at which the texture is looked up." ]],&cr;&lf; float Scale = 1.0&cr;&lf; [[ string help = "A linear scale factor. For more complex UV manipulation, connect the UVWTransform." ]], &cr;&lf; &cr;&lf; string Filename = "" &cr;&lf; [[ string widget="filename", &cr;&lf; string label="File name",&cr;&lf; string help="The name of the texture to look up" ]], &cr;&lf; string Filename_UDIMList = "" &cr;&lf; [[ string widget = "null",&cr;&lf; string label="Viewport UDIM List",&cr;&lf; string help="The list of UDIM items to load into the viewport. If empty, will be deduced from the file system automatically. " ]], &cr;&lf; string LoadUDIM = "Load UDIM..." &cr;&lf; [[ string widget="max:actionButton", &cr;&lf; string actionID="loadUDIM(\"Filename\")",&cr;&lf; string help="Select a set of files to load as an UDIM.",&cr;&lf; int connectable = 0 ]], &cr;&lf; int UDIM = 0&cr;&lf; [[ string widget="checkBox", string label="UDIM-compatible lookup",&cr;&lf; int connectable = 0,&cr;&lf; string help ="Modifies the UV coordinate so that UDIM's are looked up similar to the max MultiTile map" ]], &cr;&lf; string WrapMode = "periodic"&cr;&lf; [[ string widget="popup", string options = "default|black|clamp|periodic|mirror",&cr;&lf; string label="Wrap Mode",&cr;&lf; string help="How the texture wraps: (black, clamp, periodic or mirror)." ]],&cr;&lf; &cr;&lf; int AutoGamma = 1 &cr;&lf; [[ string widget="checkBox", int connectable=0 ]],&cr;&lf; float ManualGamma = 1.0 &cr;&lf; [[ string label="Manual Gamma" ]],&cr;&lf; &cr;&lf; output color Col = 0 [[ string label="Col (RGB)" ]],&cr;&lf; output float R = 0,&cr;&lf; output float G = 0,&cr;&lf; output float B = 0,&cr;&lf; output float A = 1,&cr;&lf; output float Luminance = 0,&cr;&lf; output float Average = 0&cr;&lf;)&cr;&lf;{&cr;&lf; // Skip empty files&cr;&lf; if (Filename == "")&cr;&lf; return;&cr;&lf; &cr;&lf; point p = Pos / Scale;&cr;&lf;&cr;&lf; // Default lookup, just use u and inverted v...&cr;&lf; float ulookup = p[0];&cr;&lf; float vlookup = 1.0 - p[1];&cr;&lf; &cr;&lf; // But for UDIM compatibility and max's idea that 0,0 is in &cr;&lf; // lower left corner, we need this juggling of v....&cr;&lf; if (UDIM)&cr;&lf; {&cr;&lf; float vfloor = floor(p[1]);&cr;&lf; float vfrac = p[1] - vfloor;&cr;&lf; vlookup = vfloor + (1.0 - vfrac);&cr;&lf; }&cr;&lf; &cr;&lf; Col = texture(Filename, ulookup, vlookup, "wrap", WrapMode, "alpha", A);&cr;&lf; &cr;&lf; int channels;&cr;&lf; gettextureinfo(Filename, "channels", channels);&cr;&lf; if (channels < 4) // No alpha? Set it to opaque&cr;&lf; {&cr;&lf; A = 1.0;&cr;&lf;&cr;&lf; if (WrapMode == "black") // 2018-04-25: Allow Decals&cr;&lf; {&cr;&lf; if (p[0] < 0.0 || p[0] > 1.0 ||&cr;&lf; p[1] < 0.0 || p[1] > 1.0)&cr;&lf; A = 0.0;&cr;&lf; }&cr;&lf; }&cr;&lf; &cr;&lf;&cr;&lf; // Temporary workaround for color space issues&cr;&lf; if (AutoGamma)&cr;&lf; {&cr;&lf; if (!endswith(Filename, ".exr") &&&cr;&lf; !endswith(Filename, ".EXR") &&&cr;&lf; !endswith(Filename, ".hdr") &&&cr;&lf; !endswith(Filename, ".HDR") &&&cr;&lf; !endswith(Filename, ".tx") &&&cr;&lf; !endswith(Filename, ".TX"))&cr;&lf; {&cr;&lf; // Gamma 2.2 for sRGB approx)&cr;&lf; Col = pow(Col, 2.2);&cr;&lf; }&cr;&lf; }&cr;&lf; else&cr;&lf; {&cr;&lf; if (ManualGamma != 1.0)&cr;&lf; Col = pow(Col, ManualGamma);&cr;&lf; }&cr;&lf; &cr;&lf; R = Col[0];&cr;&lf; G = Col[1];&cr;&lf; B = Col[2];&cr;&lf; Luminance = luminance(Col);&cr;&lf; Average = (R + G + B) / 3.0;&cr;&lf;}" + + P: "3dsMax|params|OSLAutoUpdate", "Bool", "", "A",1 + P: "3dsMax|params|OSLShaderName", "KString", "", "A", "OSLBitmap2" + P: "3dsMax|params|OSLPresetName", "KString", "", "A", "" + P: "3dsMax|OSLBitmap2", "Compound", "", "" + P: "3dsMax|OSLBitmap2|Scale", "Float", "", "A",1 + P: "3dsMax|OSLBitmap2|Filename", "KString", "", "A", "D:\Dev\clean\ufbx\data\textures\checkerboard_weight.png" + P: "3dsMax|OSLBitmap2|Filename_UDIMList", "KString", "", "A", "" + P: "3dsMax|OSLBitmap2|LoadUDIM", "KString", "", "A", "Load UDIM..." + P: "3dsMax|OSLBitmap2|UDIM", "Integer", "", "A",0 + P: "3dsMax|OSLBitmap2|WrapMode", "KString", "", "A", "periodic" + P: "3dsMax|OSLBitmap2|AutoGamma", "Integer", "", "A",1 + P: "3dsMax|OSLBitmap2|ManualGamma", "Float", "", "A",1 + P: "3dsMax|OSLBitmap2|Pos_map", "Reference", "", "A" + P: "3dsMax|OSLBitmap2|Scale_map", "Reference", "", "A" + P: "3dsMax|OSLBitmap2|Filename_map", "Reference", "", "A" + P: "3dsMax|OSLBitmap2|Filename_UDIMList_map", "Reference", "", "A" + P: "3dsMax|OSLBitmap2|WrapMode_map", "Reference", "", "A" + P: "3dsMax|OSLBitmap2|ManualGamma_map", "Reference", "", "A" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2627031770144, "Texture::Map #5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #5" + Properties70: { + P: "UVSet", "KString", "", "", "UVChannel_1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::Map #5" + FileName: "D:\Dev\clean\ufbx\data\textures\checkerboard_metallic.png" + RelativeFilename: "textures\checkerboard_metallic.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "Alpha_Black" + Cropping: 0,0,0,0 + } + Texture: 2629283309200, "Texture::Map #6", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Map #6" + Properties70: { + P: "3dsMax", "Compound", "", "" + P: "3dsMax|ClassIDa", "int", "Integer", "",2121471519 + P: "3dsMax|ClassIDb", "int", "Integer", "",-1387024086 + P: "3dsMax|SuperClassID", "int", "Integer", "",3088 + P: "3dsMax|ai_image Parameter Wrapper", "Compound", "", "" + P: "3dsMax|ai_image Parameter Wrapper|TheList", "Reference", "", "A" + P: "3dsMax|ai_image Parameter Wrapper|Shader Version", "Integer", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections", "Compound", "", "" + P: "3dsMax|ai_image Parameters/Connections|filename", "KString", "", "A", "D:\Dev\clean\ufbx\data\textures\checkerboard_transparency.png" + P: "3dsMax|ai_image Parameters/Connections|Image Frame Number", "Integer", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|color_space", "Integer", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|filter", "Integer", "", "A",3 + P: "3dsMax|ai_image Parameters/Connections|mipmap_bias", "Integer", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|single_channel", "Bool", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|start_channel", "Integer", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|swrap", "Integer", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|twrap", "Integer", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|sscale", "Float", "", "A",1 + P: "3dsMax|ai_image Parameters/Connections|tscale", "Float", "", "A",1 + P: "3dsMax|ai_image Parameters/Connections|sflip", "Bool", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|tflip", "Bool", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|soffset", "Float", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|toffset", "Float", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|swap_st", "Bool", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|uvcoords.connected", "Bool", "", "A",1 + P: "3dsMax|ai_image Parameters/Connections|uvcoords.shader", "Reference", "", "A" + P: "3dsMax|ai_image Parameters/Connections|uvset", "Integer", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|multiply", "Color", "", "A",1,1,1 + P: "3dsMax|ai_image Parameters/Connections|multiply.connected", "Bool", "", "A",1 + P: "3dsMax|ai_image Parameters/Connections|multiply.shader", "Reference", "", "A" + P: "3dsMax|ai_image Parameters/Connections|offset", "Color", "", "A",0,0,0 + P: "3dsMax|ai_image Parameters/Connections|offset.connected", "Bool", "", "A",1 + P: "3dsMax|ai_image Parameters/Connections|offset.shader", "Reference", "", "A" + P: "3dsMax|ai_image Parameters/Connections|ignore_missing_textures", "Bool", "", "A",0 + P: "3dsMax|ai_image Parameters/Connections|missing_texture_color", "ColorAndAlpha", "", "A",0,0,0,0 + P: "3dsMax|ai_image Parameters/Connections|missing_texture_color.connected", "Bool", "", "A",1 + P: "3dsMax|ai_image Parameters/Connections|missing_texture_color.shader", "Reference", "", "A" + P: "3dsMax|ai_image Results", "Compound", "", "" + } + Media: "" + FileName: "" + RelativeFilename: "" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Implementation: 2629397946768, "Implementation::01 - Default_Implementation", "" { + Version: 100 + Properties70: { + P: "ShaderLanguage", "KString", "", "", "StandardSSL" + P: "ShaderLanguageVersion", "KString", "", "", "1.0.1" + P: "RenderAPI", "KString", "", "", "OSL" + P: "RootBindingName", "KString", "", "", "root" + } + } + BindingTable: 2629360321232, "BindingTable::root 1", "" { + Version: 100 + Properties70: { + P: "TargetName", "KString", "", "", "root" + P: "TargetType", "KString", "", "", "shader" + } + Entry: "3dsMax|Parameters|material_mode", "FbxPropertyEntry", "material_mode", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_weight", "FbxPropertyEntry", "base", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_color", "FbxPropertyEntry", "base_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|reflectivity", "FbxPropertyEntry", "specular", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|roughness", "FbxPropertyEntry", "specular_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|roughness_inv", "FbxPropertyEntry", "roughness_inv", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|metalness", "FbxPropertyEntry", "metalness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|refl_color", "FbxPropertyEntry", "specular_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|diff_roughness", "FbxPropertyEntry", "diffuse_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|brdf_mode", "FbxPropertyEntry", "brdf_mode", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|brdf_low", "FbxPropertyEntry", "brdf_low", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|brdf_high", "FbxPropertyEntry", "brdf_high", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|brdf_curve", "FbxPropertyEntry", "brdf_curve", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|anisotropy", "FbxPropertyEntry", "specular_anisotropy", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|anisoangle", "FbxPropertyEntry", "specular_rotation", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|aniso_mode", "FbxPropertyEntry", "aniso_mode", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|aniso_channel", "FbxPropertyEntry", "aniso_channel", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|transparency", "FbxPropertyEntry", "transmission", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_color", "FbxPropertyEntry", "transmission_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_depth", "FbxPropertyEntry", "transmission_depth", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_roughness", "FbxPropertyEntry", "transmission_extra_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_roughness_inv", "FbxPropertyEntry", "trans_roughness_inv", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_roughness_lock", "FbxPropertyEntry", "trans_roughness_lock", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_ior", "FbxPropertyEntry", "specular_IOR", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_walled", "FbxPropertyEntry", "thin_walled", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|dispersion", "FbxPropertyEntry", "transmisison_dispersion", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_scatter_color", "FbxPropertyEntry", "transmission_scatter", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_scatter_aniso", "FbxPropertyEntry", "transmission_scatter_anisotropy", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|scattering", "FbxPropertyEntry", "subsurface", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_color", "FbxPropertyEntry", "subsurface_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_depth", "FbxPropertyEntry", "sss_depth", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_scale", "FbxPropertyEntry", "subsurface_scale", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_scatter_color", "FbxPropertyEntry", "subsurface_radius", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emission", "FbxPropertyEntry", "emission", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emit_color", "FbxPropertyEntry", "emission_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emit_luminance", "FbxPropertyEntry", "emit_luminance", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emit_kelvin", "FbxPropertyEntry", "emit_kelvin", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coating", "FbxPropertyEntry", "coat", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_color", "FbxPropertyEntry", "coat_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_roughness", "FbxPropertyEntry", "coat_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_roughness_inv", "FbxPropertyEntry", "coat_roughness_inv", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_affect_color", "FbxPropertyEntry", "coat_affect_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_affect_roughness", "FbxPropertyEntry", "coat_affect_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_ior", "FbxPropertyEntry", "coat_IOR", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_anisotropy", "FbxPropertyEntry", "coat_anisotropy", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_anisoangle", "FbxPropertyEntry", "coat_rotation", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen", "FbxPropertyEntry", "sheen", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_color", "FbxPropertyEntry", "sheen_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_roughness", "FbxPropertyEntry", "sheen_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film", "FbxPropertyEntry", "thin_film", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_thickness", "FbxPropertyEntry", "thin_film_thickness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_ior", "FbxPropertyEntry", "thin_film_IOR", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_weight_map", "FbxPropertyEntry", "base", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_color_map", "FbxPropertyEntry", "base_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|reflectivity_map", "FbxPropertyEntry", "specular", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|refl_color_map", "FbxPropertyEntry", "specular_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|roughness_map", "FbxPropertyEntry", "specular_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|metalness_map", "FbxPropertyEntry", "metalness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|diff_rough_map", "FbxPropertyEntry", "diffuse_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|anisotropy_map", "FbxPropertyEntry", "specular_anisotropy", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|aniso_angle_map", "FbxPropertyEntry", "specular_rotation", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|transparency_map", "FbxPropertyEntry", "transmission", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_color_map", "FbxPropertyEntry", "transmission_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_rough_map", "FbxPropertyEntry", "transmission_extra_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_ior_map", "FbxPropertyEntry", "specular_IOR", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|scattering_map", "FbxPropertyEntry", "subsurface", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_color_map", "FbxPropertyEntry", "subsurface_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_scale_map", "FbxPropertyEntry", "subsurface_scale", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emission_map", "FbxPropertyEntry", "emission", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emit_color_map", "FbxPropertyEntry", "emission_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_map", "FbxPropertyEntry", "coat", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_color_map", "FbxPropertyEntry", "coat_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_rough_map", "FbxPropertyEntry", "coat_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|bump_map", "FbxPropertyEntry", "normal", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|normalCamera", "FbxPropertyEntry", "normalCamera", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|normalCameraUsedAs", "FbxPropertyEntry", "normalCameraUsedAs", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|normalCameraFactor", "FbxPropertyEntry", "normalCameraFactor", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|displacement_map", "FbxPropertyEntry", "displacement_map", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|cutout_map", "FbxPropertyEntry", "opacity", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_aniso_map", "FbxPropertyEntry", "coat_anisotropy", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_aniso_angle_map", "FbxPropertyEntry", "coat_rotation", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_map", "FbxPropertyEntry", "sheen", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_color_map", "FbxPropertyEntry", "sheen_color", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_rough_map", "FbxPropertyEntry", "sheen_roughness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_map", "FbxPropertyEntry", "thin_film_thickness", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_ior_map", "FbxPropertyEntry", "thin_film_IOR", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_weight_map_on", "FbxPropertyEntry", "base_weight_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|base_color_map_on", "FbxPropertyEntry", "base_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|reflectivity_map_on", "FbxPropertyEntry", "reflectivity_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|refl_color_map_on", "FbxPropertyEntry", "refl_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|roughness_map_on", "FbxPropertyEntry", "roughness_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|metalness_map_on", "FbxPropertyEntry", "metalness_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|diff_rough_map_on", "FbxPropertyEntry", "diff_rough_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|anisotropy_map_on", "FbxPropertyEntry", "anisotropy_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|aniso_angle_map_on", "FbxPropertyEntry", "aniso_angle_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|transparency_map_on", "FbxPropertyEntry", "transparency_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_color_map_on", "FbxPropertyEntry", "trans_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_rough_map_on", "FbxPropertyEntry", "trans_rough_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|trans_ior_map_on", "FbxPropertyEntry", "trans_ior_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|scattering_map_on", "FbxPropertyEntry", "scattering_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_color_map_on", "FbxPropertyEntry", "sss_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sss_scale_map_on", "FbxPropertyEntry", "sss_scale_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emission_map_on", "FbxPropertyEntry", "emission_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|emit_color_map_on", "FbxPropertyEntry", "emit_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_map_on", "FbxPropertyEntry", "coat_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_color_map_on", "FbxPropertyEntry", "coat_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_rough_map_on", "FbxPropertyEntry", "coat_rough_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_aniso_map_on", "FbxPropertyEntry", "coat_aniso_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|coat_aniso_angle_map_on", "FbxPropertyEntry", "coat_aniso_angle_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_map_on", "FbxPropertyEntry", "sheen_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_color_map_on", "FbxPropertyEntry", "sheen_color_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|sheen_rough_map_on", "FbxPropertyEntry", "sheen_rough_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_map_on", "FbxPropertyEntry", "thin_film_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|thin_film_ior_map_on", "FbxPropertyEntry", "thin_film_ior_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|displacement_map_on", "FbxPropertyEntry", "displacement_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|cutout_map_on", "FbxPropertyEntry", "cutout_map_on", "FbxSemanticEntry" + Entry: "3dsMax|Parameters|displacement_map_amt", "FbxPropertyEntry", "displacement_map_amt", "FbxSemanticEntry" + } + AnimationStack: 2629359884896, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",153953860000 + P: "ReferenceStop", "KTime", "Time", "",153953860000 + } + } + AnimationLayer: 2629272900496, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Box001, Model::RootNode + C: "OO",2629269223296,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2629272900496,2629359884896 + + ;Geometry::, Model::Box001 + C: "OO",2629283310640,2629269223296 + + ;Material::01 - Default, Model::Box001 + C: "OO",2629355879840,2629269223296 + + ;Texture::Map #14, Material::01 - Default + C: "OP",2629283312560,2629355879840, "DiffuseColor" + + ;Texture::Map #16, Material::01 - Default + C: "OP",2627031770624,2629355879840, "ShininessExponent" + + ;Texture::Map #7, Material::01 - Default + C: "OP",2629283311600,2629355879840, "EmissiveColor" + + ;Texture::Map #12, Material::01 - Default + C: "OP",2627031772544,2629355879840, "3dsMax|Parameters|base_weight_map" + + ;Texture::Map #14, Material::01 - Default + C: "OP",2629283312560,2629355879840, "3dsMax|Parameters|base_color_map" + + ;Texture::Map #16, Material::01 - Default + C: "OP",2627031770624,2629355879840, "3dsMax|Parameters|roughness_map" + + ;Texture::Map #5, Material::01 - Default + C: "OP",2627031770144,2629355879840, "3dsMax|Parameters|metalness_map" + + ;Texture::Map #6, Material::01 - Default + C: "OP",2629283309200,2629355879840, "3dsMax|Parameters|trans_color_map" + + ;Texture::Map #7, Material::01 - Default + C: "OP",2629283311600,2629355879840, "3dsMax|Parameters|emit_color_map" + + ;Texture::Map #9, Material::01 - Default + C: "OP",2627031771584,2629355879840, "3dsMax|Parameters|bump_map" + + ;Texture::Map #9, Material::01 - Default + C: "OP",2627031771584,2629355879840, "3dsMax|Parameters|normalCamera" + + ;Texture::Map #3, Texture::Map #14 + C: "OP",2629283311120,2629283312560, "3dsMax|parameters|sourceMap" + + ;Texture::Map #8, Texture::Map #7 + C: "OP",2629283312080,2629283311600, "3dsMax|ColorTweak|Input_map" + + ;Video::Map #8, Texture::Map #8 + C: "OO",2629360425328,2629283312080 + + ;Texture::Map #4, Texture::Map #16 + C: "OP",2627031769664,2627031770624, "3dsMax|parameters|sourceMap" + + ;Texture::Map #10, Texture::Map #9 + C: "OP",2627031772064,2627031771584, "3dsMax|ai_bump2d Parameters/Connections|bump_map.shader" + + ;Video::Map #10, Texture::Map #10 + C: "OO",2629360426288,2627031772064 + + ;Texture::Map #2, Texture::Map #12 + C: "OP",2627031773024,2627031772544, "3dsMax|parameters|sourceMap" + + ;Video::Map #5, Texture::Map #5 + C: "OO",2629360428208,2627031770144 + + ;Material::01 - Default, Implementation::01 - Default_Implementation + C: "OO",2629355879840,2629397946768 + + ;BindingTable::root 1, Implementation::01 - Default_Implementation + C: "OO",2629360321232,2629397946768 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,153953860000 + ReferenceTime: 0,153953860000 + } +} diff --git a/modules/ufbx/data/max_texture_mapping_7700_binary.fbx b/modules/ufbx/data/max_texture_mapping_7700_binary.fbx new file mode 100644 index 0000000..85180c2 Binary files /dev/null and b/modules/ufbx/data/max_texture_mapping_7700_binary.fbx differ diff --git a/modules/ufbx/data/max_transformed_skin_15.obj b/modules/ufbx/data/max_transformed_skin_15.obj new file mode 100644 index 0000000..5a0cd3e --- /dev/null +++ b/modules/ufbx/data/max_transformed_skin_15.obj @@ -0,0 +1,313 @@ +# ufbx:bad_order +# ufbx:bad_normals +# ufbx:tolerance=0.01 +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 20.09.2021 22:30:18 + +# +# object Box001 +# + +v -27.6460 -13.0741 7.6475 +v -30.8606 -14.2645 1.7602 +v -27.2565 -22.1700 1.2989 +v -25.1888 -19.2299 9.2222 +v -26.9666 -12.1195 -3.4018 +v -24.2716 -17.9412 -5.6945 +v -17.8846 -18.5210 -3.3964 +v -18.5998 -22.9065 1.7675 +v -18.5640 -19.4756 7.6529 +v 7.3747 31.5499 -1.9759 +v 12.7916 25.8936 -3.1438 +v 7.9149 22.4200 -8.9392 +v 2.4980 28.0763 -7.7712 +v 15.0001 18.6967 -0.6886 +v 10.1234 15.2231 -6.4840 +v 4.6358 13.9742 -9.1058 +v 1.9213 18.5232 -12.3439 +v -1.0126 23.4951 -10.0593 +v -17.7629 -8.6912 13.1033 +v -23.7404 -4.1554 10.6136 +v -11.4797 -12.7974 10.6209 +v -1.9865 0.6523 10.1598 +v -7.7408 5.5018 12.5832 +v -14.2461 9.2958 10.1772 +v -8.9776 -13.5934 3.1637 +v -10.5625 -11.5087 -4.2958 +v -4.2398 -2.5146 -4.3282 +v -1.0699 -2.3718 2.9129 +v -16.5400 -6.9729 -6.7855 +v -22.8232 -2.8667 -4.3031 +v -16.4994 6.1289 -4.3108 +v -10.7452 1.2794 -6.7341 +v -25.3253 -2.0707 3.1540 +v -17.4160 9.1529 2.9361 +v -4.0370 10.7585 10.8581 +v -10.5424 14.5525 8.4522 +v 1.7173 5.9090 8.4348 +v 4.9728 8.9640 8.7442 +v -2.6614 12.7092 11.0798 +v -8.7580 18.6447 8.7637 +v 2.6339 2.8850 1.1879 +v -0.5360 2.7421 -6.0532 +v 2.1272 6.5220 -7.2937 +v 5.2971 6.6649 -0.0526 +v -7.0414 6.5361 -8.4592 +v -12.7957 11.3856 -6.0358 +v -10.1325 15.1656 -7.2763 +v -4.3782 10.3160 -9.6996 +v -13.7123 14.4097 1.2111 +v -11.0491 18.1896 -0.0294 +v 22.1392 46.2592 28.6031 +v 25.0126 43.7891 34.3558 +v 33.1149 46.0907 31.5166 +v 27.5010 49.6595 25.7747 +v 26.3784 37.1215 33.2929 +v 33.2239 37.3236 32.1059 +v 34.3041 36.6807 25.2699 +v 35.7123 43.1940 23.5248 +v 30.0649 45.8184 20.5801 +v 9.9520 13.2715 -2.2206 +v 11.4585 14.2436 4.9607 +v 6.7820 13.1287 -9.4617 +v 0.2767 16.9226 -11.8677 +v -5.4776 21.7722 -9.4443 +v -6.3942 24.7962 -2.1974 +v 1.2913 31.3813 3.2443 +v 15.7166 27.9770 0.3321 +v 17.9251 20.7801 2.7873 +v 10.2997 33.6333 1.5001 +v 14.4415 36.5834 6.4221 +v 19.8584 30.9271 5.2541 +v 22.0669 23.7302 7.7094 +v 2.8831 21.8148 14.8248 +v 0.6746 29.0117 12.3696 +v 8.3000 16.1584 13.6568 +v 12.4418 19.1086 18.5788 +v 7.0249 24.7649 19.7468 +v 4.8164 31.9618 17.2916 +v 14.3834 16.3270 8.4366 +v 18.5252 19.2772 13.3587 +v 4.2162 33.4647 6.7203 +v 8.3581 36.4148 11.6423 +v 14.9719 36.0906 28.4320 +v 13.8937 42.1594 23.4612 +v 19.6166 29.8235 29.7924 +v 25.9202 27.4700 25.4321 +v 30.3163 29.2285 18.9614 +v 29.2381 35.2973 13.9906 +v 24.5934 41.5644 12.6302 +v 18.2897 43.9179 16.9905 +# 90 vertices + +vn -0.7939 0.4098 -0.4491 +vn -0.9964 -0.0192 0.0829 +vn -0.5772 0.4991 0.6463 +vn -0.4111 0.9051 -0.1083 +vn -0.7041 -0.5864 0.4005 +vn -0.3036 -0.2872 0.9085 +vn 0.3639 -0.0380 0.9307 +vn 0.2817 0.6372 0.7174 +vn 0.2740 0.9583 0.0811 +vn 0.0924 -0.9799 -0.1769 +vn 0.6385 -0.7111 0.2944 +vn 0.5387 -0.7333 0.4148 +vn -0.0874 -0.9943 -0.0616 +vn 0.8062 -0.0211 0.5912 +vn 0.6389 -0.0889 0.7641 +vn 0.7576 -0.6339 -0.1557 +vn 0.1272 -0.7052 0.6975 +vn -0.1848 -0.9420 0.2800 +vn -0.0828 0.7712 -0.6312 +vn -0.6632 0.2933 -0.6886 +vn 0.4682 0.8744 -0.1272 +vn 0.6174 0.7312 -0.2903 +vn 0.0803 0.6099 -0.7884 +vn -0.5046 0.1567 -0.8490 +vn 0.7576 0.4707 0.4522 +vn 0.5240 -0.1438 0.8395 +vn 0.5407 -0.1271 0.8316 +vn 0.8136 0.4341 0.3868 +vn -0.0140 -0.6805 0.7326 +vn -0.6239 -0.7334 0.2701 +vn -0.6379 -0.7303 0.2445 +vn -0.0667 -0.6258 0.7771 +vn -0.8632 -0.3617 -0.3521 +vn -0.8134 -0.3989 -0.4234 +vn 0.0395 0.6558 -0.7539 +vn -0.5845 0.2148 -0.7825 +vn 0.5597 0.8009 -0.2126 +vn 0.4738 0.8800 0.0324 +vn -0.1212 0.8089 -0.5753 +vn -0.7017 0.1657 -0.6929 +vn 0.8137 0.4168 0.4052 +vn 0.4729 -0.0797 0.8775 +vn 0.8011 0.3775 0.4645 +vn -0.1449 -0.5296 0.8358 +vn -0.6779 -0.6692 0.3044 +vn -0.6778 -0.6692 0.3045 +vn -0.8137 -0.4168 -0.4052 +vn -0.8220 -0.4540 -0.3438 +vn -0.4926 -0.2843 -0.8225 +vn -0.1870 0.3645 -0.9123 +vn 0.6008 -0.0032 -0.7994 +vn 0.0726 -0.7018 -0.7087 +vn 0.0031 0.8906 -0.4547 +vn 0.6632 0.6979 -0.2705 +vn 0.9282 0.2819 0.2429 +vn 0.9268 -0.3684 -0.0723 +vn 0.4325 -0.8930 -0.1249 +vn 0.8253 0.2545 0.5042 +vn 0.6512 0.4946 0.5756 +vn 0.7107 -0.5997 0.3677 +vn -0.1423 -0.5590 0.8169 +vn -0.5367 -0.8251 0.1767 +vn -0.7162 -0.5611 -0.4149 +vn -0.5490 -0.6696 -0.5003 +vn 0.6384 -0.7112 0.2943 +vn 0.0923 -0.9799 -0.1769 +vn 0.0313 -0.9861 -0.1633 +vn 0.6098 -0.7271 0.3154 +vn 0.8171 -0.0281 0.5758 +vn -0.5590 0.7006 -0.4435 +vn -0.7775 -0.0507 -0.6268 +vn -0.0117 0.9999 -0.0037 +vn -0.0161 0.9931 0.1158 +vn -0.5745 0.7441 -0.3411 +vn -0.7854 0.0814 -0.6136 +vn 0.5024 0.6748 0.5406 +vn 0.5463 0.6807 0.4880 +vn -0.5024 -0.6748 -0.5406 +vn -0.5384 -0.6529 -0.5327 +vn -0.6786 0.4496 -0.5808 +vn -0.6886 -0.3255 -0.6480 +vn -0.2038 0.9441 -0.2590 +vn 0.3851 0.8944 0.2275 +vn 0.8056 0.3374 0.4870 +vn 0.7597 -0.4387 0.4801 +vn 0.3302 -0.9376 0.1089 +vn -0.3095 -0.8926 -0.3279 +# 87 vertex normals + +vt 1.0000 0.0000 0.0000 +vt 1.0000 0.5000 0.0000 +vt 0.5000 0.5000 0.0000 +vt 0.5000 0.0000 0.0000 +vt 1.0000 1.0000 0.0000 +vt 0.5000 1.0000 0.0000 +vt 0.0000 1.0000 0.0000 +vt 0.0000 0.5000 0.0000 +vt 0.0000 0.0000 0.0000 +vt 0.1250 0.1250 0.0000 +vt 0.5000 0.1250 0.0000 +vt 0.1250 0.5000 0.0000 +vt 0.8750 0.1250 0.0000 +vt 0.8750 0.5000 0.0000 +vt 0.7778 0.7778 0.0000 +vt 0.5000 0.8750 0.0000 +vt 0.2222 0.7778 0.0000 +vt 0.9200 0.0800 0.0000 +vt 0.0800 0.0800 0.0000 +vt 0.8750 0.8750 0.0000 +vt 0.1250 0.8750 0.0000 +vt 0.2222 0.0000 0.0000 +vt 0.1250 0.0000 0.0000 +vt 0.7778 0.0000 0.0000 +vt 0.8750 0.0000 0.0000 +vt 1.0000 0.1250 0.0000 +vt 0.0000 0.1250 0.0000 +# 27 texture coords + +o Box001 +g Box001 +s 1 +f 1/1/1 2/2/2 3/3/3 4/4/4 +f 5/5/5 6/6/6 3/3/3 2/2/2 +f 7/7/7 8/8/8 3/3/3 6/6/6 +f 9/9/9 4/4/4 3/3/3 8/8/8 +f 10/10/10 11/11/11 12/3/12 13/12/13 +f 14/13/14 15/14/15 12/3/12 11/11/11 +f 16/15/16 17/16/17 12/3/12 15/14/15 +f 18/17/18 13/12/13 12/3/12 17/16/17 +f 1/9/1 4/4/4 19/3/19 20/8/20 +f 9/1/9 21/2/21 19/3/19 4/4/4 +f 22/5/22 23/6/23 19/3/19 21/2/21 +f 24/7/24 20/8/20 19/3/19 23/6/23 +f 9/9/9 8/4/8 25/3/25 21/8/21 +f 7/1/7 26/2/26 25/3/25 8/4/8 +f 27/5/27 28/6/28 25/3/25 26/2/26 +f 22/7/22 21/8/21 25/3/25 28/6/28 +f 7/9/7 6/4/6 29/3/29 26/8/26 +f 5/1/5 30/2/30 29/3/29 6/4/6 +f 31/5/31 32/6/32 29/3/29 30/2/30 +f 27/7/27 26/8/26 29/3/29 32/6/32 +f 5/9/5 2/4/2 33/3/33 30/8/30 +f 1/1/1 20/2/20 33/3/33 2/4/2 +f 24/5/24 34/6/34 33/3/33 20/2/20 +f 31/7/31 30/8/30 33/3/33 34/6/34 +f 24/9/24 23/4/23 35/4/35 36/10/36 +f 22/1/22 37/13/37 35/4/35 23/4/23 +f 38/18/38 39/4/39 35/4/35 37/13/37 +f 40/19/40 36/10/36 35/4/35 39/4/39 +f 22/1/22 28/2/28 41/2/41 37/13/37 +f 27/5/27 42/20/42 41/2/41 28/2/28 +f 43/20/42 44/2/43 41/2/41 42/20/42 +f 38/18/38 37/13/37 41/2/41 44/2/43 +f 27/5/27 32/6/32 45/6/44 42/20/42 +f 31/7/31 46/21/45 45/6/44 32/6/32 +f 47/21/46 48/6/44 45/6/44 46/21/45 +f 43/20/42 42/20/42 45/6/44 48/6/44 +f 31/7/31 34/8/34 49/8/47 46/21/45 +f 24/9/24 36/10/36 49/8/47 34/8/34 +f 40/19/40 50/8/48 49/8/47 36/10/36 +f 47/21/46 46/21/45 49/8/47 50/8/48 +f 51/22/49 52/4/50 53/4/51 54/23/52 +f 55/24/53 56/25/54 53/4/51 52/4/50 +f 57/24/55 58/4/56 53/4/51 56/25/54 +f 59/22/57 54/23/52 53/4/51 58/4/56 +f 38/18/38 44/2/43 60/2/58 61/26/59 +f 43/20/42 62/20/60 60/2/58 44/2/43 +f 16/15/16 15/14/15 60/2/58 62/20/60 +f 14/13/14 61/26/59 60/2/58 15/14/15 +f 43/20/42 48/6/44 63/6/61 62/20/60 +f 47/21/46 64/21/62 63/6/61 48/6/44 +f 18/17/18 17/16/17 63/6/61 64/21/62 +f 16/15/16 62/20/60 63/6/61 17/16/17 +f 47/21/46 50/8/48 65/8/63 64/21/62 +f 40/19/40 66/27/64 65/8/63 50/8/48 +f 10/10/10 13/12/13 65/8/63 66/27/64 +f 18/17/18 64/21/62 65/8/63 13/12/13 +f 14/13/14 11/11/11 67/4/65 68/25/14 +f 10/10/10 69/23/66 67/4/65 11/11/11 +f 70/23/67 71/4/68 67/4/65 69/23/66 +f 72/25/69 68/25/14 67/4/65 71/4/68 +f 40/19/40 39/4/39 73/4/70 74/23/71 +f 38/18/38 75/25/72 73/4/70 39/4/39 +f 76/25/73 77/4/74 73/4/70 75/25/72 +f 78/23/75 74/23/71 73/4/70 77/4/74 +f 38/18/38 61/26/59 79/1/76 75/25/72 +f 14/13/14 68/25/14 79/1/76 61/26/59 +f 72/25/69 80/1/77 79/1/76 68/25/14 +f 76/25/73 75/25/72 79/1/76 80/1/77 +f 10/10/10 66/27/64 81/9/78 69/23/66 +f 40/19/40 74/23/71 81/9/78 66/27/64 +f 78/23/75 82/9/79 81/9/78 74/23/71 +f 70/23/67 69/23/66 81/9/78 82/9/79 +f 78/23/75 77/4/74 83/4/80 84/23/81 +f 76/25/73 85/25/82 83/4/80 77/4/74 +f 55/24/53 52/4/50 83/4/80 85/25/82 +f 51/22/49 84/23/81 83/4/80 52/4/50 +f 76/25/73 80/1/77 86/1/83 85/25/82 +f 72/25/69 87/25/84 86/1/83 80/1/77 +f 57/24/55 56/25/54 86/1/83 87/25/84 +f 55/24/53 85/25/82 86/1/83 56/25/54 +f 72/25/69 71/4/68 88/4/85 87/25/84 +f 70/23/67 89/23/86 88/4/85 71/4/68 +f 59/22/57 58/4/56 88/4/85 89/23/86 +f 57/24/55 87/25/84 88/4/85 58/4/56 +f 70/23/67 82/9/79 90/9/87 89/23/86 +f 78/23/75 84/23/81 90/9/87 82/9/79 +f 51/22/49 54/23/52 90/9/87 84/23/81 +f 59/22/57 89/23/86 90/9/87 54/23/52 +# 88 polygons + diff --git a/modules/ufbx/data/max_transformed_skin_5.obj b/modules/ufbx/data/max_transformed_skin_5.obj new file mode 100644 index 0000000..e136073 --- /dev/null +++ b/modules/ufbx/data/max_transformed_skin_5.obj @@ -0,0 +1,313 @@ +# ufbx:bad_order +# ufbx:bad_normals +# ufbx:tolerance=0.01 +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 20.09.2021 22:26:25 + +# +# object Box001 +# + +v -22.5210 -13.3501 7.6475 +v -25.6202 -11.8854 1.7602 +v -28.7489 -19.9908 1.2989 +v -25.2015 -19.4119 9.2222 +v -21.3636 -13.1679 -3.4018 +v -23.6389 -19.1660 -5.6945 +v -19.5858 -24.1361 -3.3964 +v -23.2202 -26.6925 1.7675 +v -20.7432 -24.3183 7.6529 +v 23.0209 -4.7056 22.1444 +v 26.1952 -11.9214 22.8901 +v 30.0411 -10.9874 15.5572 +v 26.8668 -3.7715 14.8115 +v 24.9097 -19.5592 21.2430 +v 28.7556 -18.6251 13.9101 +v 29.3405 -16.2410 8.2074 +v 31.2728 -10.3576 7.7606 +v 27.9414 -5.2383 8.8751 +v -12.4757 -17.3473 13.1033 +v -13.4153 -9.9028 10.6136 +v -11.0153 -24.7099 10.6209 +v 1.3131 -22.7045 12.6527 +v -0.5651 -15.4077 15.0470 +v -1.0847 -7.8971 12.6340 +v -9.8340 -27.0548 3.1637 +v -9.4527 -24.4640 -4.2958 +v 5.3886 -22.0628 -1.7690 +v 3.7505 -24.8515 5.4450 +v -10.3923 -17.0194 -6.7855 +v -11.8528 -9.6569 -4.3031 +v 2.9908 -7.2554 -1.7878 +v 4.8690 -14.5521 -4.1820 +v -13.0340 -7.3120 3.1540 +v 0.5534 -5.1083 5.4200 +v 5.7533 -14.3823 16.8781 +v 5.2337 -6.8716 14.4651 +v 7.6315 -21.6790 14.4839 +v 11.3178 -21.9906 17.0021 +v 7.6605 -14.0716 18.2969 +v 8.6323 -5.4063 16.9811 +v 10.0689 -23.8261 7.2761 +v 11.7070 -21.0373 0.0621 +v 16.2503 -20.2999 1.3789 +v 14.6122 -23.0887 8.5929 +v 11.1874 -13.5267 -2.3509 +v 9.3092 -6.2299 0.0434 +v 13.8525 -5.4925 1.3601 +v 15.7307 -12.7893 -1.0341 +v 6.8718 -4.0829 7.2511 +v 11.4151 -3.3455 8.5679 +v -8.9100 -11.1949 43.3423 +v -12.4112 -17.0880 44.0238 +v -10.1683 -17.6423 52.6068 +v -7.5038 -9.6908 49.9809 +v -8.1280 -22.2406 42.4246 +v -6.4481 -24.6026 48.7420 +v -0.0758 -22.3275 50.3323 +v -1.5406 -17.2053 54.6992 +v -0.8578 -11.2818 51.2500 +v 22.5531 -21.7999 10.8943 +v 18.5347 -22.6677 17.5035 +v 24.1912 -19.0111 3.6803 +v 23.6716 -11.5005 1.2673 +v 21.7934 -4.2037 3.6615 +v 19.3560 -2.0567 10.8693 +v 16.0162 -2.8629 18.7054 +v 23.8885 -12.4817 27.2882 +v 22.6030 -20.1194 25.6411 +v 20.7142 -5.2658 26.5425 +v 17.4479 -6.0591 32.7703 +v 20.6222 -13.2750 33.5161 +v 19.3367 -20.9127 31.8689 +v 6.0490 -14.1694 17.7169 +v 7.3345 -6.5316 19.3640 +v 9.2234 -21.3852 18.4626 +v 5.9570 -22.1785 24.6905 +v 2.7827 -14.9627 23.9448 +v 4.0682 -7.3249 25.5919 +v 16.2280 -23.2279 21.9016 +v 12.9617 -24.0212 28.1295 +v 13.7096 -3.4231 23.1035 +v 10.4432 -4.2164 29.3313 +v -4.6457 -15.5816 32.5085 +v -3.3617 -8.1453 34.9071 +v -2.3060 -23.0570 33.6683 +v 3.3052 -25.6010 38.7995 +v 8.5645 -23.1743 44.3437 +v 9.8484 -15.7380 46.7424 +v 7.5088 -8.2626 45.5826 +v 1.8976 -5.7186 40.4513 +# 90 vertices + +vn -0.5396 0.0144 -0.8418 +vn -0.7286 -0.5345 -0.4283 +vn -0.9818 0.0301 0.1873 +vn -0.6950 0.5757 -0.4308 +vn -0.3939 -0.9164 0.0719 +vn -0.5206 -0.5383 0.6627 +vn -0.1920 0.0080 0.9814 +vn -0.4870 0.5718 0.6602 +vn -0.3377 0.9388 0.0677 +vn 0.5307 -0.2745 -0.8019 +vn 0.8754 0.2799 -0.3941 +vn 0.9382 0.1672 -0.3030 +vn 0.6088 -0.4258 -0.6694 +vn 0.7014 0.6685 0.2472 +vn 0.7906 0.4971 0.3574 +vn 0.8158 0.1074 0.5683 +vn 0.9332 -0.3317 0.1380 +vn 0.6387 -0.7013 -0.3166 +vn -0.2266 0.7079 -0.6690 +vn -0.3332 0.0022 -0.9429 +vn -0.1168 0.9926 0.0319 +vn -0.0453 0.9986 0.0263 +vn -0.2210 0.7075 -0.6713 +vn -0.2652 -0.0098 -0.9641 +vn 0.0643 0.6999 0.7114 +vn 0.0779 -0.0064 0.9969 +vn 0.2681 -0.0132 0.9633 +vn 0.1556 0.6966 0.7003 +vn 0.0507 -0.7061 0.7063 +vn -0.1370 -0.9901 0.0289 +vn 0.0533 -0.9986 -0.0045 +vn 0.2257 -0.7073 0.6699 +vn -0.2421 -0.7028 -0.6689 +vn -0.1517 -0.7131 -0.6844 +vn -0.4472 0.6745 -0.5874 +vn -0.4858 -0.0335 -0.8734 +vn -0.2697 0.9577 0.1003 +vn -0.3084 0.7875 0.5336 +vn -0.7726 -0.4008 0.4924 +vn -0.5907 -0.4188 -0.6897 +vn 0.1537 0.7049 0.6925 +vn 0.3056 0.0011 0.9522 +vn 0.1734 0.6523 0.7379 +vn 0.2785 -0.7033 0.6541 +vn 0.0882 -0.9957 -0.0272 +vn 0.0883 -0.9957 -0.0271 +vn -0.1537 -0.7049 -0.6925 +vn -0.1332 -0.7538 -0.6434 +vn -0.7614 -0.5553 -0.3346 +vn -0.9910 -0.0472 0.1253 +vn -0.7026 0.5684 -0.4280 +vn -0.4815 -0.1658 -0.8606 +vn -0.6755 0.3075 0.6702 +vn -0.3791 0.8621 0.3364 +vn 0.2519 0.9674 0.0242 +vn 0.1256 0.7473 -0.6525 +vn 0.1660 0.1046 -0.9806 +vn 0.3467 0.5928 0.7269 +vn 0.1494 0.6753 0.7223 +vn 0.5083 0.0124 0.8611 +vn 0.4639 -0.6708 0.5787 +vn 0.3077 -0.9477 -0.0849 +vn 0.0688 -0.7656 -0.6396 +vn -0.0683 -0.6526 -0.7547 +vn 0.7015 0.6685 0.2471 +vn 0.5308 -0.2744 -0.8018 +vn 0.5093 -0.2174 -0.8327 +vn 0.8250 0.3456 -0.4471 +vn 0.6732 0.7159 0.1852 +vn -0.4248 -0.6382 0.6421 +vn -0.7552 -0.6004 -0.2631 +vn -0.5483 0.1697 0.8189 +vn -0.4754 0.2520 0.8429 +vn -0.8148 -0.3524 0.4604 +vn -0.6505 -0.7299 -0.2100 +vn 0.1202 0.6637 0.7383 +vn 0.1338 0.6818 0.7192 +vn -0.1201 -0.6637 -0.7383 +vn -0.1023 -0.6632 -0.7414 +vn -0.7884 -0.4358 0.4341 +vn -0.6360 -0.7247 -0.2651 +vn -0.5549 0.1917 0.8095 +vn 0.0058 0.6996 0.7145 +vn 0.4768 0.8670 0.1449 +vn 0.6776 0.5308 -0.5091 +vn 0.3919 -0.0401 -0.9191 +vn -0.1162 -0.5926 -0.7971 +# 87 vertex normals + +vt 1.0000 0.0000 0.0000 +vt 1.0000 0.5000 0.0000 +vt 0.5000 0.5000 0.0000 +vt 0.5000 0.0000 0.0000 +vt 1.0000 1.0000 0.0000 +vt 0.5000 1.0000 0.0000 +vt 0.0000 1.0000 0.0000 +vt 0.0000 0.5000 0.0000 +vt 0.0000 0.0000 0.0000 +vt 0.1250 0.1250 0.0000 +vt 0.5000 0.1250 0.0000 +vt 0.1250 0.5000 0.0000 +vt 0.8750 0.1250 0.0000 +vt 0.8750 0.5000 0.0000 +vt 0.7778 0.7778 0.0000 +vt 0.5000 0.8750 0.0000 +vt 0.2222 0.7778 0.0000 +vt 0.9200 0.0800 0.0000 +vt 0.0800 0.0800 0.0000 +vt 0.8750 0.8750 0.0000 +vt 0.1250 0.8750 0.0000 +vt 0.2222 0.0000 0.0000 +vt 0.1250 0.0000 0.0000 +vt 0.7778 0.0000 0.0000 +vt 0.8750 0.0000 0.0000 +vt 1.0000 0.1250 0.0000 +vt 0.0000 0.1250 0.0000 +# 27 texture coords + +o Box001 +g Box001 +s 1 +f 1/1/1 2/2/2 3/3/3 4/4/4 +f 5/5/5 6/6/6 3/3/3 2/2/2 +f 7/7/7 8/8/8 3/3/3 6/6/6 +f 9/9/9 4/4/4 3/3/3 8/8/8 +f 10/10/10 11/11/11 12/3/12 13/12/13 +f 14/13/14 15/14/15 12/3/12 11/11/11 +f 16/15/16 17/16/17 12/3/12 15/14/15 +f 18/17/18 13/12/13 12/3/12 17/16/17 +f 1/9/1 4/4/4 19/3/19 20/8/20 +f 9/1/9 21/2/21 19/3/19 4/4/4 +f 22/5/22 23/6/23 19/3/19 21/2/21 +f 24/7/24 20/8/20 19/3/19 23/6/23 +f 9/9/9 8/4/8 25/3/25 21/8/21 +f 7/1/7 26/2/26 25/3/25 8/4/8 +f 27/5/27 28/6/28 25/3/25 26/2/26 +f 22/7/22 21/8/21 25/3/25 28/6/28 +f 7/9/7 6/4/6 29/3/29 26/8/26 +f 5/1/5 30/2/30 29/3/29 6/4/6 +f 31/5/31 32/6/32 29/3/29 30/2/30 +f 27/7/27 26/8/26 29/3/29 32/6/32 +f 5/9/5 2/4/2 33/3/33 30/8/30 +f 1/1/1 20/2/20 33/3/33 2/4/2 +f 24/5/24 34/6/34 33/3/33 20/2/20 +f 31/7/31 30/8/30 33/3/33 34/6/34 +f 24/9/24 23/4/23 35/4/35 36/10/36 +f 22/1/22 37/13/37 35/4/35 23/4/23 +f 38/18/38 39/4/39 35/4/35 37/13/37 +f 40/19/40 36/10/36 35/4/35 39/4/39 +f 22/1/22 28/2/28 41/2/41 37/13/37 +f 27/5/27 42/20/42 41/2/41 28/2/28 +f 43/20/42 44/2/43 41/2/41 42/20/42 +f 38/18/38 37/13/37 41/2/41 44/2/43 +f 27/5/27 32/6/32 45/6/44 42/20/42 +f 31/7/31 46/21/45 45/6/44 32/6/32 +f 47/21/46 48/6/44 45/6/44 46/21/45 +f 43/20/42 42/20/42 45/6/44 48/6/44 +f 31/7/31 34/8/34 49/8/47 46/21/45 +f 24/9/24 36/10/36 49/8/47 34/8/34 +f 40/19/40 50/8/48 49/8/47 36/10/36 +f 47/21/46 46/21/45 49/8/47 50/8/48 +f 51/22/49 52/4/50 53/4/51 54/23/52 +f 55/24/53 56/25/54 53/4/51 52/4/50 +f 57/24/55 58/4/56 53/4/51 56/25/54 +f 59/22/57 54/23/52 53/4/51 58/4/56 +f 38/18/38 44/2/43 60/2/58 61/26/59 +f 43/20/42 62/20/60 60/2/58 44/2/43 +f 16/15/16 15/14/15 60/2/58 62/20/60 +f 14/13/14 61/26/59 60/2/58 15/14/15 +f 43/20/42 48/6/44 63/6/61 62/20/60 +f 47/21/46 64/21/62 63/6/61 48/6/44 +f 18/17/18 17/16/17 63/6/61 64/21/62 +f 16/15/16 62/20/60 63/6/61 17/16/17 +f 47/21/46 50/8/48 65/8/63 64/21/62 +f 40/19/40 66/27/64 65/8/63 50/8/48 +f 10/10/10 13/12/13 65/8/63 66/27/64 +f 18/17/18 64/21/62 65/8/63 13/12/13 +f 14/13/14 11/11/11 67/4/11 68/25/65 +f 10/10/10 69/23/66 67/4/11 11/11/11 +f 70/23/67 71/4/68 67/4/11 69/23/66 +f 72/25/69 68/25/65 67/4/11 71/4/68 +f 40/19/40 39/4/39 73/4/70 74/23/71 +f 38/18/38 75/25/72 73/4/70 39/4/39 +f 76/25/73 77/4/74 73/4/70 75/25/72 +f 78/23/75 74/23/71 73/4/70 77/4/74 +f 38/18/38 61/26/59 79/1/76 75/25/72 +f 14/13/14 68/25/65 79/1/76 61/26/59 +f 72/25/69 80/1/77 79/1/76 68/25/65 +f 76/25/73 75/25/72 79/1/76 80/1/77 +f 10/10/10 66/27/64 81/9/78 69/23/66 +f 40/19/40 74/23/71 81/9/78 66/27/64 +f 78/23/75 82/9/79 81/9/78 74/23/71 +f 70/23/67 69/23/66 81/9/78 82/9/79 +f 78/23/75 77/4/74 83/4/80 84/23/81 +f 76/25/73 85/25/82 83/4/80 77/4/74 +f 55/24/53 52/4/50 83/4/80 85/25/82 +f 51/22/49 84/23/81 83/4/80 52/4/50 +f 76/25/73 80/1/77 86/1/83 85/25/82 +f 72/25/69 87/25/84 86/1/83 80/1/77 +f 57/24/55 56/25/54 86/1/83 87/25/84 +f 55/24/53 85/25/82 86/1/83 56/25/54 +f 72/25/69 71/4/68 88/4/85 87/25/84 +f 70/23/67 89/23/86 88/4/85 71/4/68 +f 59/22/57 58/4/56 88/4/85 89/23/86 +f 57/24/55 87/25/84 88/4/85 58/4/56 +f 70/23/67 82/9/79 90/9/87 89/23/86 +f 78/23/75 84/23/81 90/9/87 82/9/79 +f 51/22/49 54/23/52 90/9/87 84/23/81 +f 59/22/57 89/23/86 90/9/87 54/23/52 +# 88 polygons + diff --git a/modules/ufbx/data/max_transformed_skin_6100_ascii.fbx b/modules/ufbx/data/max_transformed_skin_6100_ascii.fbx new file mode 100644 index 0000000..27cd796 --- /dev/null +++ b/modules/ufbx/data/max_transformed_skin_6100_ascii.fbx @@ -0,0 +1,1230 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 20 + Hour: 22 + Minute: 31 + Second: 57 + Millisecond: 619 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 15 + ObjectType: "Model" { + Count: 6 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 6 + } + ObjectType: "Pose" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Box001", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",-9.20781326293945,23.6171798706055,0 + Property: "GeometricRotation", "Vector3D", "",0,-0,135.374984741211 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-28.9443359375,3.67995834350586,-8.67447662353516 + Property: "Lcl Rotation", "Lcl Rotation", "A",90.171358296453,-44.6248772966915,90.1381603927014 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "MaxHandle", "int", "UH",2 + Property: "Color", "ColorRGB", "N",0.603921568627451,0.603921568627451,0.898039215686275 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -5.55567026138306,-5.55565738677979,7.83971691131592,5.55567026138306,-5.55565738677979,7.83971691131592,-5.55567026138306 + ,5.55565738677979,7.83971691131592,5.55567026138306,5.55565738677979,7.83971691131592,-7.50015449523926,-7.50013732910156 + ,31.6182174682617,7.50015449523926,-7.50013732910156,31.6182174682617,-7.50015449523926,7.50013732910156,31.6182174682617 + ,7.50015449523926,7.50013732910156,31.6182174682617,-8.40017318725586,-8.93301200866699,42.419017791748,8.40017318725586 + ,-8.93301105499268,42.419017791748,-7.50015449523926,7.50013732910156,43.0634422302246,7.50015449523926,7.50013732910156 + ,43.0634422302246,-7.50015449523926,-8.33272743225098,59.0491676330566,7.50015449523926,-8.33272743225098,59.0491676330566 + ,-5.55567026138306,5.55565738677979,57.0740852355957,5.55567026138306,5.55565738677979,57.0740852355957,-7.50015449523926 + ,-20.4075603485107,43.8127746582031,7.50015449523926,-20.4075603485107,43.8127708435059,-7.50015449523926,-20.4075603485107 + ,59.0491676330566,7.50015449523926,-20.4075603485107,59.0491676330566,-5.55567026138306,-45.153995513916,45.7878646850586 + ,5.55567026138306,-45.153995513916,45.7878646850586,-5.55567026138306,-45.153995513916,57.0740852355957,5.55567026138306 + ,-45.153995513916,57.0740852355957,0,0,0,0,0,61.5885696411133,0,-10.0001831054688,17.6393623352051,10.0002059936523 + ,0,17.6393623352051,0,10.0001831054688,17.6393623352051,-10.0002059936523,0,17.6393623352051,0,-10.0001831054688,38.276050567627 + ,10.0002059936523,0,38.276050567627,0,10.0001831054688,38.276050567627,-10.0002059936523,0,38.276050567627,0,-53.2948722839355 + ,51.4309692382813,10.0002059936523,0,51.4309692382813,0,10.0001831054688,51.4309692382813,-10.0002059936523,0,51.4309692382813 + ,0,-13.3305435180664,61.5885696411133,0,-13.3305435180664,41.2733726501465,10.0002059936523,-13.3305435180664,51.4309692382813 + ,-10.0002059936523,-13.3305435180664,51.4309692382813,0,-34.9778900146484,41.2733726501465,10.0002059936523,-34.9778900146484 + ,51.4309692382813,0,-34.9778900146484,61.5885696411133,-10.0002059936523,-34.9778900146484,51.4309692382813,-7.50015449523926 + ,0,4.40984058380127,0,7.50013732910156,4.40984058380127,7.50015449523926,0,4.40984058380127,0,-7.50013732910156,4.40984058380127 + ,0,-8.33272743225098,61.5885696411133,7.50015449523926,0,59.0491714477539,0,7.50013732910156,59.0491714477539,-7.50015449523926 + ,0,59.0491714477539,7.50015449523926,-7.50013732910156,17.6393623352051,0,-10.0001831054688,31.6182155609131,-7.50015449523926 + ,-7.50013732910156,17.6393623352051,7.50015449523926,7.50013732910156,17.6393623352051,10.0002059936523,0,31.6182155609131 + ,-7.50015449523926,7.50013732910156,17.6393623352051,0,10.0001831054688,31.6182155609131,-10.0002059936523,0,31.6182155609131 + ,7.50015449523926,-7.50013732910156,38.2760467529297,0,-10.8327732086182,40.524040222168,-7.50015449523926,-7.50013732910156 + ,38.2760467529297,7.50015449523926,7.50013732910156,38.2760467529297,10.0002059936523,0,43.0634384155273,-7.50015449523926 + ,7.50013732910156,38.2760467529297,0,10.0001831054688,43.0634384155273,-10.0002059936523,0,43.0634384155273,0,-48.7156295776367 + ,43.8127746582031,7.50015449523926,-48.7156295776367,51.4309692382813,0,-48.7156295776367,59.0491714477539,-7.50015449523926 + ,-48.7156295776367,51.4309692382813,7.50015449523926,7.50013732910156,51.4309692382813,10.0002059936523,-8.33272743225098 + ,51.4309692382813,-7.50015449523926,7.50013732910156,51.4309692382813,-10.0002059936523,-8.33272743225098,51.4309692382813 + ,-7.50015449523926,-13.3305435180664,59.0491714477539,0,-20.4075603485107,61.5885696411133,7.50015449523926,-13.3305435180664 + ,59.0491714477539,7.50015449523926,-13.3305435180664,43.8127746582031,0,-20.4075603485107,41.2733726501465,-7.50015449523926 + ,-13.3305435180664,43.8127746582031,10.0002059936523,-20.4075603485107,51.4309692382813,-10.0002059936523,-20.4075603485107 + ,51.4309692382813,7.50015449523926,-34.9778900146484,43.8127746582031,-7.50015449523926,-34.9778900146484,43.8127746582031 + ,7.50015449523926,-34.9778900146484,59.0491714477539,-7.50015449523926,-34.9778900146484,59.0491714477539 + PolygonVertexIndex: 0,46,24,-50,2,47,24,-47,3,48,24,-48,1,49,24,-49,12,50,25,-54,13,51,25,-51,15,52,25,-52,14,53,25,-53,0,49,26,-57,1 + ,54,26,-50,5,55,26,-55,4,56,26,-56,1,48,27,-55,3,57,27,-49,7,58,27,-58,5,54,27,-59,3,47,28,-58,2,59,28,-48,6,60,28 + ,-60,7,57,28,-61,2,46,29,-60,0,56,29,-47,4,61,29,-57,6,59,29,-62,4,55,30,-65,5,62,30,-56,9,63,30,-63,8,64,30,-64,5 + ,58,31,-63,7,65,31,-59,11,66,31,-66,9,62,31,-67,7,60,32,-66,6,67,32,-61,10,68,32,-68,11,65,32,-69,6,61,33,-68,4,64 + ,33,-62,8,69,33,-65,10,67,33,-70,20,70,34,-74,21,71,34,-71,23,72,34,-72,22,73,34,-73,9,66,35,-76,11,74,35,-67,15,51 + ,35,-75,13,75,35,-52,11,68,36,-75,10,76,36,-69,14,52,36,-77,15,74,36,-53,10,69,37,-77,8,77,37,-70,12,53,37,-78,14 + ,76,37,-54,13,50,38,-81,12,78,38,-51,18,79,38,-79,19,80,38,-80,8,63,39,-84,9,81,39,-64,17,82,39,-82,16,83,39,-83,9 + ,75,40,-82,13,80,40,-76,19,84,40,-81,17,81,40,-85,12,77,41,-79,8,83,41,-78,16,85,41,-84,18,78,41,-86,16,82,42,-88 + ,17,86,42,-83,21,70,42,-87,20,87,42,-71,17,84,43,-87,19,88,43,-85,23,71,43,-89,21,86,43,-72,19,79,44,-89,18,89,44 + ,-80,22,72,44,-90,23,88,44,-73,18,85,45,-90,16,87,45,-86,20,73,45,-88,22,89,45,-74 + Edges: 0,1,2,3,4,5,7,8,9,11,12,15,16,17,18,19,20,21,23,24,25,27,28,31,33,34,35,36,37,40,41,43,44,47,49,50,52,53,56,57,59 + ,63,65,66,68,69,72,73,75,79,81,82,85,88,89,95,97,98,99,100,101,104,105,107,108,111,113,114,116,117,120,121,123,127 + ,129,130,132,133,136,137,139,143,145,146,149,152,153,159,160,161,162,163,164,165,167,168,169,171,172,175,177,178,179 + ,180,181,185,187,188,193,194,196,197,201,203,209,210,212,213,217,219,225,226,227,228,229,232,233,235,236,239,241,242 + ,243,244,245,248,249,251,252,255,257,258,261,264,265,271,273,274,277,280,281,287,289,290,291,292,293,297,299,300,305 + ,306,308,309,313,315,321,322,324,325,329,331,337,338,341,345 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: -0.652862071990967,-0.652863264083862,-0.384110331535339,-0.800568282604218,-1.98758485225881e-08,-0.599241495132446 + ,0,0,-1,3.31263692032735e-08,-0.800568759441376,-0.599240958690643,-0.652862131595612,0.652863204479218,-0.384110301733017 + ,-3.31263692032735e-08,0.800568759441376,-0.599240958690643,0,0,-1,-0.800568282604218,-1.98758485225881e-08,-0.599241495132446 + ,0.652862071990967,0.652863264083862,-0.384110271930695,0.800568282604218,1.98758485225881e-08,-0.599241495132446 + ,0,0,-1,-3.31263692032735e-08,0.800568759441376,-0.599240958690643,0.652862131595612,-0.652863204479218,-0.384110301733017 + ,3.31263692032735e-08,-0.800568759441376,-0.599240958690643,0,0,-1,0.800568282604218,1.98758485225881e-08,-0.599241495132446 + ,-0.710411846637726,5.37463158423179e-08,0.703786075115204,0,7.63673995152203e-08,1,0,0.1841099858284,0.982905626296997 + ,-0.698267579078674,0.182694166898727,0.692130982875824,0.710411906242371,5.37463193950316e-08,0.703786194324493 + ,0.698267579078674,0.182694122195244,0.692130923271179,0,0.1841099858284,0.982905626296997,0,7.63673995152203e-08 + ,1,0.579942047595978,0.579943180084229,0.572130262851715,0,0.709993481636047,0.704208314418793,0,0.1841099858284 + ,0.982905626296997,0.698267579078674,0.182694122195244,0.692130923271179,-0.579941987991333,0.579943180084229 + ,0.572130262851715,-0.698267579078674,0.182694166898727,0.692130982875824,0,0.1841099858284,0.982905626296997 + ,0,0.709993481636047,0.704208314418793,-0.652862071990967,-0.652863264083862,-0.384110331535339,3.31263692032735e-08 + ,-0.800568759441376,-0.599240958690643,2.58623611415487e-08,-0.994135916233063,-0.108138211071491,-0.702846705913544 + ,-0.70284765958786,-0.10959754139185,0.652862131595612,-0.652863204479218,-0.384110301733017,0.702846765518188 + ,-0.70284765958786,-0.109597563743591,2.58623611415487e-08,-0.994135916233063,-0.108138211071491,3.31263692032735e-08 + ,-0.800568759441376,-0.599240958690643,0.707106232643127,-0.707107245922089,0,9.99951410562971e-09,-0.999999940395355 + ,0,2.58623611415487e-08,-0.994135916233063,-0.108138211071491,0.702846765518188,-0.70284765958786,-0.109597563743591 + ,-0.707106232643127,-0.707107245922089,0,-0.702846705913544,-0.70284765958786,-0.10959754139185,2.58623611415487e-08 + ,-0.994135916233063,-0.108138211071491,9.99951410562971e-09,-0.999999940395355,0,0.652862131595612,-0.652863204479218 + ,-0.384110301733017,0.800568282604218,1.98758485225881e-08,-0.599241495132446,0.994135916233063,1.03449506738684e-08 + ,-0.108138419687748,0.702846765518188,-0.70284765958786,-0.109597563743591,0.652862071990967,0.652863264083862 + ,-0.384110271930695,0.702846705913544,0.702847719192505,-0.10959754139185,0.994135916233063,1.03449506738684e-08 + ,-0.108138419687748,0.800568282604218,1.98758485225881e-08,-0.599241495132446,0.707106292247772,0.707107245922089 + ,0,1,4.9997588291717e-09,0,0.994135916233063,1.03449506738684e-08,-0.108138419687748,0.702846705913544,0.702847719192505 + ,-0.10959754139185,0.707106232643127,-0.707107245922089,0,0.702846765518188,-0.70284765958786,-0.109597563743591 + ,0.994135916233063,1.03449506738684e-08,-0.108138419687748,1,4.9997588291717e-09,0,0.652862071990967,0.652863264083862 + ,-0.384110271930695,-3.31263692032735e-08,0.800568759441376,-0.599240958690643,-2.58623611415487e-08,0.994135916233063 + ,-0.108138211071491,0.702846705913544,0.702847719192505,-0.10959754139185,-0.652862131595612,0.652863204479218 + ,-0.384110301733017,-0.702846765518188,0.70284765958786,-0.109597563743591,-2.58623611415487e-08,0.994135916233063 + ,-0.108138211071491,-3.31263692032735e-08,0.800568759441376,-0.599240958690643,-0.707106232643127,0.707107245922089 + ,0,-9.99951410562971e-09,0.999999940395355,0,-2.58623611415487e-08,0.994135916233063,-0.108138211071491,-0.702846765518188 + ,0.70284765958786,-0.109597563743591,0.707106292247772,0.707107245922089,0,0.702846705913544,0.702847719192505 + ,-0.10959754139185,-2.58623611415487e-08,0.994135916233063,-0.108138211071491,-9.99951410562971e-09,0.999999940395355 + ,0,-0.652862131595612,0.652863204479218,-0.384110301733017,-0.800568282604218,-1.98758485225881e-08,-0.599241495132446 + ,-0.994135916233063,-1.03449506738684e-08,-0.108138419687748,-0.702846765518188,0.70284765958786,-0.109597563743591 + ,-0.652862071990967,-0.652863264083862,-0.384110331535339,-0.702846705913544,-0.70284765958786,-0.10959754139185 + ,-0.994135916233063,-1.03449506738684e-08,-0.108138419687748,-0.800568282604218,-1.98758485225881e-08,-0.599241495132446 + ,-0.707106232643127,-0.707107245922089,0,-1,-4.9997588291717e-09,0,-0.994135916233063,-1.03449506738684e-08,-0.108138419687748 + ,-0.702846705913544,-0.70284765958786,-0.10959754139185,-0.707106232643127,0.707107245922089,0,-0.702846765518188 + ,0.70284765958786,-0.109597563743591,-0.994135916233063,-1.03449506738684e-08,-0.108138419687748,-1,-4.9997588291717e-09 + ,0,-0.707106232643127,-0.707107245922089,0,9.99951410562971e-09,-0.999999940395355,0,9.79135528211827e-09,-0.98051393032074 + ,-0.196449548006058,-0.726994812488556,-0.671344578266144,-0.144135817885399,0.707106232643127,-0.707107245922089 + ,0,0.726994812488556,-0.671344578266144,-0.144135773181915,9.79135528211827e-09,-0.98051393032074,-0.196449548006058 + ,9.99951410562971e-09,-0.999999940395355,0,0.841134011745453,-0.375836849212646,-0.388896316289902,1.50185499592226e-08 + ,-0.690597236156464,-0.723239421844482,9.79135528211827e-09,-0.98051393032074,-0.196449548006058,0.726994812488556 + ,-0.671344578266144,-0.144135773181915,-0.841133952140808,-0.375836879014969,-0.388896316289902,-0.726994812488556 + ,-0.671344578266144,-0.144135817885399,9.79135528211827e-09,-0.98051393032074,-0.196449548006058,1.50185499592226e-08 + ,-0.690597236156464,-0.723239421844482,0.707106232643127,-0.707107245922089,0,1,4.9997588291717e-09,0,0.999147593975067 + ,0.0213359203189611,-0.0353379249572754,0.726994812488556,-0.671344578266144,-0.144135773181915,0.707106292247772 + ,0.707107245922089,0,0.707106292247772,0.707107305526733,0,0.999147593975067,0.0213359203189611,-0.0353379249572754 + ,1,4.9997588291717e-09,0,0.707106232643127,0.707107245922089,0,0.995042204856873,0.0814711675047874,-0.0570379979908466 + ,0.999147593975067,0.0213359203189611,-0.0353379249572754,0.707106292247772,0.707107305526733,0,0.841134011745453 + ,-0.375836849212646,-0.388896316289902,0.726994812488556,-0.671344578266144,-0.144135773181915,0.999147593975067 + ,0.0213359203189611,-0.0353379249572754,0.995042204856873,0.0814711675047874,-0.0570379979908466,0.707106292247772 + ,0.707107245922089,0,-9.99951410562971e-09,0.999999940395355,0,0,0.999999940395355,0,0.707106292247772,0.707107305526733 + ,0,-0.707106232643127,0.707107245922089,0,-0.707106232643127,0.707107245922089,0,0,0.999999940395355,0,-9.99951410562971e-09 + ,0.999999940395355,0,-0.707106292247772,0.707107245922089,0,-9.99951321745129e-09,0.999999940395355,0,0,0.999999940395355 + ,0,-0.707106232643127,0.707107245922089,0,0.707106232643127,0.707107245922089,0,0.707106292247772,0.707107305526733 + ,0,0,0.999999940395355,0,-9.99951321745129e-09,0.999999940395355,0,-0.707106232643127,0.707107245922089,0,-1 + ,-4.9997588291717e-09,0,-0.999147593975067,0.0213359259068966,-0.035337932407856,-0.707106232643127,0.707107245922089 + ,0,-0.707106232643127,-0.707107245922089,0,-0.726994812488556,-0.671344578266144,-0.144135817885399,-0.999147593975067 + ,0.0213359259068966,-0.035337932407856,-1,-4.9997588291717e-09,0,-0.841133952140808,-0.375836879014969,-0.388896316289902 + ,-0.995042204856873,0.0814711898565292,-0.0570380054414272,-0.999147593975067,0.0213359259068966,-0.035337932407856 + ,-0.726994812488556,-0.671344578266144,-0.144135817885399,-0.707106292247772,0.707107245922089,0,-0.707106232643127 + ,0.707107245922089,0,-0.999147593975067,0.0213359259068966,-0.035337932407856,-0.995042204856873,0.0814711898565292 + ,-0.0570380054414272,-0.659748792648315,-0.374187439680099,-0.651701867580414,1.3334736870263e-08,-0.595272123813629 + ,-0.803524017333984,0,-1,-3.61959962447145e-07,-0.806484878063202,-0.591254770755768,-2.44395920390161e-07,0.659748792648315 + ,-0.374187439680099,-0.651701867580414,0.806484878063202,-0.591254770755768,-2.44395920390161e-07,0,-1,-3.61959962447145e-07 + ,1.3334736870263e-08,-0.595272123813629,-0.803524017333984,0.659748792648315,-0.374187499284744,0.651701807975769 + ,-2.00021119667326e-08,-0.595272481441498,0.803524017333984,0,-1,-3.61959962447145e-07,0.806484878063202,-0.591254770755768 + ,-2.44395920390161e-07,-0.659748792648315,-0.374187499284744,0.651701807975769,-0.806484878063202,-0.591254770755768 + ,-2.44395920390161e-07,0,-1,-3.61959962447145e-07,-2.00021119667326e-08,-0.595272481441498,0.803524017333984 + ,0.841134011745453,-0.375836849212646,-0.388896316289902,0.995042204856873,0.0814711675047874,-0.0570379979908466 + ,0.978707313537598,0.146339476108551,0.143932938575745,0.995302379131317,-0.0552102141082287,0.0795305594801903 + ,0.707106232643127,0.707107245922089,0,0.695669531822205,0.695670485496521,0.17912694811821,0.978707313537598 + ,0.146339476108551,0.143932938575745,0.995042204856873,0.0814711675047874,-0.0570379979908466,0.579942047595978 + ,0.579943180084229,0.572130262851715,0.698267579078674,0.182694122195244,0.692130923271179,0.978707313537598 + ,0.146339476108551,0.143932938575745,0.695669531822205,0.695670485496521,0.17912694811821,0.710411906242371,5.37463193950316e-08 + ,0.703786194324493,0.995302379131317,-0.0552102141082287,0.0795305594801903,0.978707313537598,0.146339476108551 + ,0.143932938575745,0.698267579078674,0.182694122195244,0.692130923271179,0.707106232643127,0.707107245922089 + ,0,-9.99951321745129e-09,0.999999940395355,0,-1.05700381780593e-08,0.983797073364258,0.179285451769829,0.695669531822205 + ,0.695670485496521,0.17912694811821,-0.707106292247772,0.707107245922089,0,-0.695669531822205,0.695670485496521 + ,0.179126963019371,-1.05700381780593e-08,0.983797073364258,0.179285451769829,-9.99951321745129e-09,0.999999940395355 + ,0,-0.579941987991333,0.579943180084229,0.572130262851715,0,0.709993481636047,0.704208314418793,-1.05700381780593e-08 + ,0.983797073364258,0.179285451769829,-0.695669531822205,0.695670485496521,0.179126963019371,0.579942047595978 + ,0.579943180084229,0.572130262851715,0.695669531822205,0.695670485496521,0.17912694811821,-1.05700381780593e-08 + ,0.983797073364258,0.179285451769829,0,0.709993481636047,0.704208314418793,-0.707106292247772,0.707107245922089 + ,0,-0.995042204856873,0.0814711898565292,-0.0570380054414272,-0.978707313537598,0.146339491009712,0.143932968378067 + ,-0.695669531822205,0.695670485496521,0.179126963019371,-0.841133952140808,-0.375836879014969,-0.388896316289902 + ,-0.995302379131317,-0.0552102141082287,0.0795305743813515,-0.978707313537598,0.146339491009712,0.143932968378067 + ,-0.995042204856873,0.0814711898565292,-0.0570380054414272,-0.710411846637726,5.37463158423179e-08,0.703786075115204 + ,-0.698267579078674,0.182694166898727,0.692130982875824,-0.978707313537598,0.146339491009712,0.143932968378067 + ,-0.995302379131317,-0.0552102141082287,0.0795305743813515,-0.579941987991333,0.579943180084229,0.572130262851715 + ,-0.695669531822205,0.695670485496521,0.179126963019371,-0.978707313537598,0.146339491009712,0.143932968378067 + ,-0.698267579078674,0.182694166898727,0.692130982875824,0.710411906242371,5.37463193950316e-08,0.703786194324493 + ,0,7.63673995152203e-08,1,0,5.60605144528381e-08,1,0.710411727428436,3.94546262327822e-08,0.703786313533783,-0.710411846637726 + ,5.37463158423179e-08,0.703786075115204,-0.710411727428436,3.94546262327822e-08,0.703786313533783,0,5.60605144528381e-08 + ,1,0,7.63673995152203e-08,1,-0.710411906242371,-4.87737423782164e-08,0.703786134719849,0,-6.93019472919332e-08 + ,1,0,5.60605144528381e-08,1,-0.710411727428436,3.94546262327822e-08,0.703786313533783,0.710411906242371,-4.87737494836438e-08 + ,0.703786134719849,0.710411727428436,3.94546262327822e-08,0.703786313533783,0,5.60605144528381e-08,1,0,-6.93019472919332e-08 + ,1,-0.841133952140808,-0.375836879014969,-0.388896316289902,1.50185499592226e-08,-0.690597236156464,-0.723239421844482 + ,-4.90903246941343e-08,-0.17442087829113,-0.984671115875244,-0.727758407592773,-0.130680873990059,-0.673268377780914 + ,0.841134011745453,-0.375836849212646,-0.388896316289902,0.727758526802063,-0.130680739879608,-0.673268377780914 + ,-4.90903246941343e-08,-0.17442087829113,-0.984671115875244,1.50185499592226e-08,-0.690597236156464,-0.723239421844482 + ,0.710411727428436,4.87737707999258e-08,-0.703786373138428,-1.10169025901996e-07,3.46509771986803e-08,-1,-4.90903246941343e-08 + ,-0.17442087829113,-0.984671115875244,0.727758526802063,-0.130680739879608,-0.673268377780914,-0.710411787033081 + ,0,-0.703786194324493,-0.727758407592773,-0.130680873990059,-0.673268377780914,-4.90903246941343e-08,-0.17442087829113 + ,-0.984671115875244,-1.10169025901996e-07,3.46509771986803e-08,-1,0.841134011745453,-0.375836849212646,-0.388896316289902 + ,0.995302379131317,-0.0552102141082287,0.0795305594801903,0.99923437833786,-0.0332521721720695,0.0206125881522894 + ,0.727758526802063,-0.130680739879608,-0.673268377780914,0.710411906242371,5.37463193950316e-08,0.703786194324493 + ,0.710411727428436,3.94546262327822e-08,0.703786313533783,0.99923437833786,-0.0332521721720695,0.0206125881522894 + ,0.995302379131317,-0.0552102141082287,0.0795305594801903,0.710411906242371,-4.87737494836438e-08,0.703786134719849 + ,1,1.19020089194444e-14,-7.98730326323494e-08,0.99923437833786,-0.0332521721720695,0.0206125881522894,0.710411727428436 + ,3.94546262327822e-08,0.703786313533783,0.710411727428436,4.87737707999258e-08,-0.703786373138428,0.727758526802063 + ,-0.130680739879608,-0.673268377780914,0.99923437833786,-0.0332521721720695,0.0206125881522894,1,1.19020089194444e-14 + ,-7.98730326323494e-08,-0.710411846637726,5.37463158423179e-08,0.703786075115204,-0.995302379131317,-0.0552102141082287 + ,0.0795305743813515,-0.99923437833786,-0.0332522056996822,0.0206125862896442,-0.710411727428436,3.94546262327822e-08 + ,0.703786313533783,-0.841133952140808,-0.375836879014969,-0.388896316289902,-0.727758407592773,-0.130680873990059 + ,-0.673268377780914,-0.99923437833786,-0.0332522056996822,0.0206125862896442,-0.995302379131317,-0.0552102141082287 + ,0.0795305743813515,-0.710411787033081,0,-0.703786194324493,-1,-1.13713474192423e-08,-1.14817495955322e-07,-0.99923437833786 + ,-0.0332522056996822,0.0206125862896442,-0.727758407592773,-0.130680873990059,-0.673268377780914,-0.710411906242371 + ,-4.87737423782164e-08,0.703786134719849,-0.710411727428436,3.94546262327822e-08,0.703786313533783,-0.99923437833786 + ,-0.0332522056996822,0.0206125862896442,-1,-1.13713474192423e-08,-1.14817495955322e-07,-0.710411787033081,0,-0.703786194324493 + ,-1.10169025901996e-07,3.46509771986803e-08,-1,-5.18024592111033e-08,-0.105841346085072,-0.994383037090302,-0.70633864402771 + ,-0.106598734855652,-0.699801683425903,0.710411727428436,4.87737707999258e-08,-0.703786373138428,0.706338584423065 + ,-0.106598787009716,-0.699801683425903,-5.18024592111033e-08,-0.105841346085072,-0.994383037090302,-1.10169025901996e-07 + ,3.46509771986803e-08,-1,0.659748792648315,-0.374187439680099,-0.651701867580414,1.3334736870263e-08,-0.595272123813629 + ,-0.803524017333984,-5.18024592111033e-08,-0.105841346085072,-0.994383037090302,0.706338584423065,-0.106598787009716 + ,-0.699801683425903,-0.659748792648315,-0.374187439680099,-0.651701867580414,-0.70633864402771,-0.106598734855652 + ,-0.699801683425903,-5.18024592111033e-08,-0.105841346085072,-0.994383037090302,1.3334736870263e-08,-0.595272123813629 + ,-0.803524017333984,0.710411727428436,4.87737707999258e-08,-0.703786373138428,1,1.19020089194444e-14,-7.98730326323494e-08 + ,0.994535982608795,-0.10439445823431,-1.54703414523283e-07,0.706338584423065,-0.106598787009716,-0.699801683425903 + ,0.710411906242371,-4.87737494836438e-08,0.703786134719849,0.706338703632355,-0.106598608195782,0.699801743030548 + ,0.994535982608795,-0.10439445823431,-1.54703414523283e-07,1,1.19020089194444e-14,-7.98730326323494e-08,0.659748792648315 + ,-0.374187499284744,0.651701807975769,0.806484878063202,-0.591254770755768,-2.44395920390161e-07,0.994535982608795 + ,-0.10439445823431,-1.54703414523283e-07,0.706338703632355,-0.106598608195782,0.699801743030548,0.659748792648315 + ,-0.374187439680099,-0.651701867580414,0.706338584423065,-0.106598787009716,-0.699801683425903,0.994535982608795 + ,-0.10439445823431,-1.54703414523283e-07,0.806484878063202,-0.591254770755768,-2.44395920390161e-07,0.710411906242371 + ,-4.87737494836438e-08,0.703786134719849,0,-6.93019472919332e-08,1,-1.03604902434995e-08,-0.105841070413589,0.994383037090302 + ,0.706338703632355,-0.106598608195782,0.699801743030548,-0.710411906242371,-4.87737423782164e-08,0.703786134719849 + ,-0.706338703632355,-0.106598608195782,0.699801683425903,-1.03604902434995e-08,-0.105841070413589,0.994383037090302 + ,0,-6.93019472919332e-08,1,-0.659748792648315,-0.374187499284744,0.651701807975769,-2.00021119667326e-08,-0.595272481441498 + ,0.803524017333984,-1.03604902434995e-08,-0.105841070413589,0.994383037090302,-0.706338703632355,-0.106598608195782 + ,0.699801683425903,0.659748792648315,-0.374187499284744,0.651701807975769,0.706338703632355,-0.106598608195782 + ,0.699801743030548,-1.03604902434995e-08,-0.105841070413589,0.994383037090302,-2.00021119667326e-08,-0.595272481441498 + ,0.803524017333984,-0.710411906242371,-4.87737423782164e-08,0.703786134719849,-1,-1.13713474192423e-08,-1.14817495955322e-07 + ,-0.994535982608795,-0.10439445823431,-1.85644097427939e-07,-0.706338703632355,-0.106598608195782,0.699801683425903 + ,-0.710411787033081,0,-0.703786194324493,-0.70633864402771,-0.106598734855652,-0.699801683425903,-0.994535982608795 + ,-0.10439445823431,-1.85644097427939e-07,-1,-1.13713474192423e-08,-1.14817495955322e-07,-0.659748792648315,-0.374187439680099 + ,-0.651701867580414,-0.806484878063202,-0.591254770755768,-2.44395920390161e-07,-0.994535982608795,-0.10439445823431 + ,-1.85644097427939e-07,-0.70633864402771,-0.106598734855652,-0.699801683425903,-0.659748792648315,-0.374187499284744 + ,0.651701807975769,-0.706338703632355,-0.106598608195782,0.699801683425903,-0.994535982608795,-0.10439445823431 + ,-1.85644097427939e-07,-0.806484878063202,-0.591254770755768,-2.44395920390161e-07 + } + LayerElementUV: 0 { + Version: 101 + Name: "UVChannel_1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0.0799999982118607,0.0799999982118607,0.920000016689301,0.0799999982118607 + ,0.875,0.875,0.125,0.875,0.125,0.125,0.875,0.125,0.777777850627899,0.777777850627899,0.222222223877907,0.777777850627899 + ,0.125,0,0.875,0,0.875,0,0.125,0,0.222222223877907,0,0.777777850627899,0,0.777777850627899,0,0.222222223877907 + ,0,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,1,0.5 + ,0.5,1,0,0.5,0.5,0,1,0.5,0.5,1,0,0.5,0.5,0,0.5,0,1,0,0,0,0.5,0,1,0,0.5,0,0,0,1,0.5,0.5,0,0.5,1,0.5,0,0,0.5,0.5 + ,0,0.5,0,0.5,0,0.5,0.125,0.875,0.5,0.5,0.875,0.125,0.5,1,0.5,0,0.5,0.5,1,0.5,0,0,0.5,1,0.5,1,0.5,0,0.5,0.5,1 + ,1,0.5,1,0.5,0,0.5,0.5,1,0.5,1,0.5,1,0,0.5,0.875,0.125,0.5,0,0.125,0.125,0.875,0.875,1,0.5,0.125,0.875,0.5,1 + ,0,0.5,0.5,0,0.875,0,0.5,0,0.125,0,0.875,0.875,1,0.125,0.125,0.875,0,0.125,0.125,0,0.5,0,0.875,0,0.875,0,0.5 + ,0,0.125,0,1,0,0,0,0.875,0,0.125,0,0.875,0,0.125,0 + UVIndex: 9,62,40,68,11,64,40,62,10,66,40,64,8,68,40,66,16,70,41,73,17,71,41,70,18,72,41,71,19,73,41,72,4,69,42,78,5,74 + ,42,69,7,76,42,74,6,78,42,76,0,67,43,75,1,80,43,67,3,82,43,80,2,75,43,82,32,65,44,81,33,84,44,65,35,86,44,84 + ,34,81,44,86,28,63,45,85,29,79,45,63,31,88,45,79,30,85,45,88,36,77,46,92,37,90,46,77,13,91,46,90,12,92,46,91 + ,37,83,47,90,39,93,47,83,14,94,47,93,13,90,47,94,39,87,48,93,38,95,48,87,15,96,48,95,14,93,48,96,38,89,49,95 + ,36,92,49,89,12,97,49,92,15,95,49,97,24,98,50,101,25,99,50,98,26,100,50,99,27,101,50,100,13,94,51,103,14,102 + ,51,94,18,71,51,102,17,103,51,71,14,96,52,102,15,104,52,96,19,72,52,104,18,102,52,72,15,97,53,104,12,105,53,97 + ,16,73,53,105,19,104,53,73,17,70,54,108,16,106,54,70,23,107,54,106,22,108,54,107,12,91,55,111,13,109,55,91,21 + ,110,55,109,20,111,55,110,13,103,56,109,17,108,56,103,22,112,56,108,21,109,56,112,16,105,57,106,12,111,57,105 + ,20,113,57,111,23,106,57,113,20,110,58,115,21,114,58,110,25,98,58,114,24,115,58,98,21,112,59,114,22,116,59,112 + ,26,99,59,116,25,114,59,99,22,107,60,116,23,117,60,107,27,100,60,117,26,116,60,100,23,113,61,117,20,115,61,113 + ,24,101,61,115,27,117,61,101 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::Box001_ncl1_1" + } + Model: "Model::Bone001", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-25.4116115570068,-19.3058376312256,1.51081693172455 + Property: "Lcl Rotation", "Lcl Rotation", "A+",90.0000229950473,-6.66469196204984,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "MaxHandle", "int", "UH",5 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",164.628293991089 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Bone001_ncl1_1" + } + Model: "Model::Bone002", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",23.5183258056641,-5.7220458984375e-06,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-2.7320756042735e-05,1.28686155409888e-07,16.409965515542 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "MaxHandle", "int", "UH",6 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",177.309545516968 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Bone002_ncl1_1" + } + Model: "Model::Bone003", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",25.3299350738525,4.76837158203125e-07,-1.9073486328125e-06 + Property: "Lcl Rotation", "Lcl Rotation", "A+",5.10181308418683e-08,-6.10666477250204e-13,110.050180799657 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "MaxHandle", "int", "UH",7 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",167.443071365356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Bone003_ncl1_1" + } + Model: "Model::Bone004", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",23.9204406738281,0,5.7220458984375e-06 + Property: "Lcl Rotation", "Lcl Rotation", "A+",6.80058561036385e-09,1.01777748665986e-13,21.6378382174936 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "MaxHandle", "int", "UH",8 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",189.954908370972 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Bone004_ncl1_1" + } + Model: "Model::Bone005", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",27.136417388916,-5.7220458984375e-06,1.9073486328125e-06 + Property: "Lcl Rotation", "Lcl Rotation", "A",-1.01777749806833e-12,-4.0711099922733e-13,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "MaxHandle", "int", "UH",9 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",189.954908370972 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Bone005_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\max_transformed_skin_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\max_transformed_skin_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "3ds Max" + Property: "Original|ApplicationVersion", "KString", "", "2020" + Property: "Original|DateTime_GMT", "DateTime", "", "20/09/2021 19:31:57.619" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\max_transformed_skin_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "3ds Max" + Property: "LastSaved|ApplicationVersion", "KString", "", "2020" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "20/09/2021 19:31:57.619" + Property: "Original|ApplicationActiveProject", "KString", "", "C:\Users\Datacube\Documents\3dsMax\Projects\galleria_oma" + + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\transformed_skin.max" + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 6 + PoseNode: { + Node: "Model::Bone005" + Matrix: -0.00740736909210682,7.55009850195165e-08,0.999972581863403,0,-0.999972581863403,3.23770843468907e-10,-0.00740736909210682 + ,0,-8.83025597087084e-10,-1,7.54964872839992e-08,0,23.030590057373,-19.3058414459229,53.1690979003906,1 + } + PoseNode: { + Node: "Model::Bone004" + Matrix: -0.00740736909210682,7.55009850195165e-08,0.999972581863403,0,-0.999972581863403,3.23770843468907e-10,-0.00740736909210682 + ,0,-8.83025597087084e-10,-1,7.54964872839992e-08,0,23.231595993042,-19.3058395385742,26.03342628479,1 + } + PoseNode: { + Node: "Model::Bone003" + Matrix: -0.00840297341346741,7.55013829234485e-08,0.999964714050293,0,-0.999964714050293,3.67306407511592e-10,-0.00840297341346741 + ,0,-1.00172958816813e-09,-1,7.54956062110068e-08,0,23.4325981140137,-19.3058376312256,2.11383175849915,1 + } + PoseNode: { + Node: "Model::Bone002" + Matrix: 0.99987405538559,-6.93811674778999e-10,0.0158711820840836,0,-0.0158711820840836,7.55086659864901e-08,0.99987405538559 + ,0,-1.89213600343408e-09,-1,7.54881170905719e-08,0,-1.89414596557617,-19.3058376312256,1.7118159532547,1 + } + PoseNode: { + Node: "Model::Bone001" + Matrix: 0.999963462352753,0,0.00854672491550446,0,-0.00854672491550446,-4.01339264044509e-07,0.999963462352753,0,3.43013639714229e-09 + ,-1,-4.01324598442443e-07,0,-25.4116115570068,-19.3058376312256,1.51081693172455,1 + } + PoseNode: { + Node: "Model::Box001" + Matrix: -0.00171620969194919,0.711719036102295,0.702462136745453,0,0.00468462845310569,-0.70244973897934,0.711717963218689 + ,0,0.999987542629242,0.0045122317969799,-0.00212858850136399,0,-28.9443359375,3.67995834350586,-8.67447662353516 + ,1 + } + } + Deformer: "Deformer::Skin Box001", "Skin" { + Version: 100 + Properties60: { + } + Link_DeformAcuracy: 50 + } + Deformer: "SubDeformer::Cluster Bone001", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 0,1,2,3,24,26,27,28,29,46,47,48,49,54,56,57,59 + Weights: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + Transform: 0.00428760377834238,0.702450872047115,-0.711719318023402,0,0.0107673155149419,0.711652200683946,0.70244947490105,0 + ,0.999932840429407,-0.0106751312139609,-0.00451222727311554,0,-3.61964630462551,-10.1547376889899,-22.9857918992366 + ,1 + TransformLink: 0.999963462352753,0,0.00854672491550446,0,-0.00854672491550446,-4.01339251368945e-07,0.999963462352753,0,3.43013627341142e-09 + ,-1,-4.01324598394401e-07,0,-25.4116115570068,-19.3058376312256,1.51081693172455,1 + } + Deformer: "SubDeformer::Cluster Bone002", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 4,5,6,7,8,9,10,11,30,31,32,33,35,36,37,55,58,60,61,62,63,64,65,66,67,68,69,74,76 + Weights: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + Transform: 0.00943291024248103,0.702400942651622,-0.7117189830715,0,0.0159798441138131,0.711553886298029,0.702449814232391,0 + ,0.999827795316832,-0.0179993040047691,-0.00451223361025988,0,-27.2116253298779,-9.95566404349015,-22.9857967075904 + ,1 + TransformLink: 0.999874055385589,-6.93811674778999e-10,0.0158711820840836,0,-0.0158711820840835,7.55086402272677e-08,0.999874055385589 + ,0,-1.8921356310667e-09,-1,7.54881171199424e-08,0,-1.89414596557617,-19.3058376312256,1.7118159532547,1 + } + Deformer: "SubDeformer::Cluster Bone003", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 12,13,14,15,16,17,18,19,25,38,39,40,41,50,51,52,53,75,77,78,79,80,81,82,83,84,85 + Weights: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + Transform: 0.70245179709012,-0.00418662109723308,-0.711718983067762,0,0.711653382495144,-0.0106650104006349,0.702449814241879 + ,0,-0.0105313813083971,-0.99993433134131,-0.00451223272263469,0,-10.3478035798039,52.4657376963531,-22.9857967365894 + ,1 + TransformLink: -0.00840297341346743,7.55013829240934e-08,0.999964714050293,0,-0.999964714050293,3.70060431876627e-10,-0.00840297341346745 + ,0,-1.00448344785251e-09,-1,7.54956062105507e-08,0,23.4325981140137,-19.3058376312256,2.11383175849915,1 + } + Deformer: "SubDeformer::Cluster Bone004", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 20,21,22,23,34,42,43,44,45,70,71,72,73,86,87,88,89 + Weights: 1,1,1,1,0.456600040197372,1,1,1,1,1,1,1,1,1,1,1,1 + Transform: 0.702455619277449,-0.00348723333326101,-0.711718983067345,0,0.711663650260907,-0.0099564578545681,0.702449814243058 + ,0,-0.00953580623059204,-0.999944324000181,-0.00451223260479986,0,-34.3204620083069,52.4315938570318,-22.9858004561432 + ,1 + TransformLink: -0.00740736909210688,7.55009850192737e-08,0.999972581863403,0,-0.999972581863403,3.27390615882644e-10,-0.0074073690921069 + ,0,-8.86645272509993e-10,-1,7.54964872834873e-08,0,23.231595993042,-19.3058395385742,26.03342628479,1 + } + Deformer: "SubDeformer::Cluster Bone005", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 34 + Weights: 0.543399930000305 + Transform: 0.702455619277449,-0.00348723333326101,-0.711718983067345,0,0.711663650260907,-0.0099564578545681,0.702449814243058 + ,0,-0.00953580623059204,-0.999944324000181,-0.00451223260479986,0,-61.4568776278519,52.4315973677899,-22.9858044123179 + ,1 + TransformLink: -0.00740736909210688,7.55009850192737e-08,0.999972581863403,0,-0.999972581863403,3.27390615882644e-10,-0.0074073690921069 + ,0,-8.86645272509993e-10,-1,7.54964872834873e-08,0,23.030590057373,-19.3058414459229,53.1690979003906,1 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",2 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",1 + Property: "FrontAxisSign", "int", "",-1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",2 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",6 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",0 + Property: "TimeSpanStop", "KTime", "",153953860000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Box001", "Model::Scene" + Connect: "OO", "Model::Bone001", "Model::Scene" + Connect: "OO", "Model::Bone002", "Model::Bone001" + Connect: "OO", "Model::Bone003", "Model::Bone002" + Connect: "OO", "Model::Bone004", "Model::Bone003" + Connect: "OO", "Model::Bone005", "Model::Bone004" + Connect: "OO", "Deformer::Skin Box001", "Model::Box001" + Connect: "OO", "SubDeformer::Cluster Bone001", "Deformer::Skin Box001" + Connect: "OO", "SubDeformer::Cluster Bone002", "Deformer::Skin Box001" + Connect: "OO", "SubDeformer::Cluster Bone003", "Deformer::Skin Box001" + Connect: "OO", "SubDeformer::Cluster Bone004", "Deformer::Skin Box001" + Connect: "OO", "SubDeformer::Cluster Bone005", "Deformer::Skin Box001" + Connect: "OO", "Model::Bone001", "SubDeformer::Cluster Bone001" + Connect: "OO", "Model::Bone002", "SubDeformer::Cluster Bone002" + Connect: "OO", "Model::Bone003", "SubDeformer::Cluster Bone003" + Connect: "OO", "Model::Bone004", "SubDeformer::Cluster Bone004" + Connect: "OO", "Model::Bone005", "SubDeformer::Cluster Bone005" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,153953860000 + ReferenceTime: 0,153953860000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Bone001" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -25.4116115570068 + KeyVer: 4005 + KeyCount: 1 + Key: 0,-25.4116115570068,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: -19.3058376312256 + KeyVer: 4005 + KeyCount: 1 + Key: 0,-19.3058376312256,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1.51081693172455 + KeyVer: 4005 + KeyCount: 1 + Key: 0,1.51081693172455,U,a,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 90.0000228881836 + KeyVer: 4005 + KeyCount: 2 + Key: 0,90.0000228881836,U,a,n,36948926400,90.0000228881836,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: -6.66469192504883 + KeyVer: 4005 + KeyCount: 2 + Key: 0,-6.66469192504883,U,a,n,36948926400,-6.66469192504883,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 2 + Key: 0,0,U,a,n,36948926400,79.8205184936523,U,a,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 1 + Key: 0,1,U,s,0,0,r,0.333233326673508 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 1 + Key: 0,1,U,s,0,0,r,0.333233326673508 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 1 + Key: 0,1,U,s,0,0,r,0.333233326673508 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Bone002" { + Version: 1.1 + Channel: "Transform" { + Channel: "R" { + Channel: "X" { + Default: -2.73207551799715e-05 + KeyVer: 4005 + KeyCount: 2 + Key: 0,-2.73207569989609e-05,U,a,n,36948926400,-2.73207569989609e-05,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1.28686153288982e-07 + KeyVer: 4005 + KeyCount: 2 + Key: 0,1.28685186950861e-07,U,a,n,36948926400,1.28685186950861e-07,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 16.4099655151367 + KeyVer: 4005 + KeyCount: 2 + Key: 0,16.4099655151367,U,a,n,36948926400,-37.8041076660156,U,a,n + Color: 1,1,1 + } + LayerType: 2 + } + } + } + Model: "Model::Bone003" { + Version: 1.1 + Channel: "Transform" { + Channel: "R" { + Channel: "X" { + Default: 5.10181301649482e-08 + KeyVer: 4005 + KeyCount: 2 + Key: 0,5.10183362223415e-08,U,a,n,36948926400,-30.422700881958,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: -6.10666465311605e-13 + KeyVer: 4005 + KeyCount: 2 + Key: 0,1.95604112334519e-13,U,a,n,36948926400,-19.5842571258545,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 110.050178527832 + KeyVer: 4005 + KeyCount: 2 + Key: 0,110.050178527832,U,a,n,36948926400,37.2074508666992,U,a,n + Color: 1,1,1 + } + LayerType: 2 + } + } + } + Model: "Model::Bone004" { + Version: 1.1 + Channel: "Transform" { + Channel: "R" { + Channel: "X" { + Default: 6.8005854281239e-09 + KeyVer: 4005 + KeyCount: 2 + Key: 0,6.80142475673051e-09,U,a,n,36948926400,-28.2969284057617,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1.01777750994864e-13 + KeyVer: 4005 + KeyCount: 2 + Key: 0,1.28974752427492e-13,U,a,n,36948926400,11.4626045227051,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 21.6378383636475 + KeyVer: 4005 + KeyCount: 2 + Key: 0,21.6378402709961,U,a,n,36948926400,-22.8644142150879,U,a,n + Color: 1,1,1 + } + LayerType: 2 + } + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "30" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 153953860000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/max_transformed_skin_6100_binary.fbx b/modules/ufbx/data/max_transformed_skin_6100_binary.fbx new file mode 100644 index 0000000..03bb9f3 Binary files /dev/null and b/modules/ufbx/data/max_transformed_skin_6100_binary.fbx differ diff --git a/modules/ufbx/data/max_transformed_skin_7500_ascii.fbx b/modules/ufbx/data/max_transformed_skin_7500_ascii.fbx new file mode 100644 index 0000000..ad2704a --- /dev/null +++ b/modules/ufbx/data/max_transformed_skin_7500_ascii.fbx @@ -0,0 +1,1164 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 20 + Hour: 22 + Minute: 20 + Second: 56 + Millisecond: 696 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\max_transformed_skin_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\max_transformed_skin_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "3ds Max" + P: "Original|ApplicationVersion", "KString", "", "", "2020" + P: "Original|DateTime_GMT", "DateTime", "", "", "20/09/2021 19:20:56.695" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\max_transformed_skin_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "3ds Max" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2020" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "20/09/2021 19:20:56.695" + P: "Original|ApplicationActiveProject", "KString", "", "", "C:\Users\Datacube\Documents\3dsMax\Projects\galleria_oma" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\transformed_skin.max" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",2 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",1 + P: "FrontAxisSign", "int", "Integer", "",-1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",2 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Left" + P: "TimeMode", "enum", "", "",6 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",153953860000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2426728282656, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 46 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 6 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 5 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "AnimationCurve" { + Count: 18 + } + ObjectType: "AnimationCurveNode" { + Count: 6 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "Deformer" { + Count: 6 + } + ObjectType: "Pose" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2426728793152, "Geometry::", "Mesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.603921568627451,0.603921568627451,0.898039215686275 + } + Vertices: *270 { + a: -5.55567026138306,-5.55565738677979,7.83971691131592,5.55567026138306,-5.55565738677979,7.83971691131592,-5.55567026138306,5.55565738677979,7.83971691131592,5.55567026138306,5.55565738677979,7.83971691131592,-7.50015449523926,-7.50013732910156,31.6182174682617,7.50015449523926,-7.50013732910156,31.6182174682617,-7.50015449523926,7.50013732910156,31.6182174682617,7.50015449523926,7.50013732910156,31.6182174682617,-8.40017318725586,-8.93301200866699,42.419017791748,8.40017318725586,-8.93301105499268,42.419017791748,-7.50015449523926,7.50013732910156,43.0634422302246,7.50015449523926,7.50013732910156,43.0634422302246,-7.50015449523926,-8.33272743225098,59.0491676330566,7.50015449523926,-8.33272743225098,59.0491676330566,-5.55567026138306,5.55565738677979,57.0740852355957,5.55567026138306,5.55565738677979,57.0740852355957,-7.50015449523926,-20.4075603485107,43.8127746582031,7.50015449523926,-20.4075603485107,43.8127708435059,-7.50015449523926,-20.4075603485107,59.0491676330566,7.50015449523926,-20.4075603485107,59.0491676330566,-5.55567026138306,-45.153995513916,45.7878646850586,5.55567026138306,-45.153995513916,45.7878646850586,-5.55567026138306,-45.153995513916,57.0740852355957,5.55567026138306,-45.153995513916,57.0740852355957,0,0,0,0,0,61.5885696411133,0,-10.0001831054688,17.6393623352051,10.0002059936523,0,17.6393623352051,0,10.0001831054688,17.6393623352051,-10.0002059936523,0,17.6393623352051,0,-10.0001831054688,38.276050567627,10.0002059936523,0,38.276050567627,0,10.0001831054688,38.276050567627,-10.0002059936523,0,38.276050567627,0,-53.2948722839355,51.4309692382813,10.0002059936523,0,51.4309692382813,0,10.0001831054688,51.4309692382813,-10.0002059936523,0,51.4309692382813,0,-13.3305435180664,61.5885696411133,0,-13.3305435180664,41.2733726501465,10.0002059936523,-13.3305435180664,51.4309692382813,-10.0002059936523,-13.3305435180664,51.4309692382813,0,-34.9778900146484,41.2733726501465,10.0002059936523,-34.9778900146484,51.4309692382813,0,-34.9778900146484,61.5885696411133,-10.0002059936523,-34.9778900146484,51.4309692382813, +-7.50015449523926,0,4.40984058380127,0,7.50013732910156,4.40984058380127,7.50015449523926,0,4.40984058380127,0,-7.50013732910156,4.40984058380127,0,-8.33272743225098,61.5885696411133,7.50015449523926,0,59.0491714477539,0,7.50013732910156,59.0491714477539,-7.50015449523926,0,59.0491714477539,7.50015449523926,-7.50013732910156,17.6393623352051,0,-10.0001831054688,31.6182155609131,-7.50015449523926,-7.50013732910156,17.6393623352051,7.50015449523926,7.50013732910156,17.6393623352051,10.0002059936523,0,31.6182155609131,-7.50015449523926,7.50013732910156,17.6393623352051,0,10.0001831054688,31.6182155609131,-10.0002059936523,0,31.6182155609131,7.50015449523926,-7.50013732910156,38.2760467529297,0,-10.8327732086182,40.524040222168,-7.50015449523926,-7.50013732910156,38.2760467529297,7.50015449523926,7.50013732910156,38.2760467529297,10.0002059936523,0,43.0634384155273,-7.50015449523926,7.50013732910156,38.2760467529297,0,10.0001831054688,43.0634384155273,-10.0002059936523,0,43.0634384155273,0,-48.7156295776367,43.8127746582031,7.50015449523926,-48.7156295776367,51.4309692382813,0,-48.7156295776367,59.0491714477539,-7.50015449523926,-48.7156295776367,51.4309692382813,7.50015449523926,7.50013732910156,51.4309692382813,10.0002059936523,-8.33272743225098,51.4309692382813,-7.50015449523926,7.50013732910156,51.4309692382813,-10.0002059936523,-8.33272743225098,51.4309692382813,-7.50015449523926,-13.3305435180664,59.0491714477539,0,-20.4075603485107,61.5885696411133,7.50015449523926,-13.3305435180664,59.0491714477539,7.50015449523926,-13.3305435180664,43.8127746582031,0,-20.4075603485107,41.2733726501465,-7.50015449523926,-13.3305435180664,43.8127746582031,10.0002059936523,-20.4075603485107,51.4309692382813,-10.0002059936523,-20.4075603485107,51.4309692382813,7.50015449523926,-34.9778900146484,43.8127746582031,-7.50015449523926,-34.9778900146484,43.8127746582031,7.50015449523926,-34.9778900146484,59.0491714477539,-7.50015449523926,-34.9778900146484,59.0491714477539 + } + PolygonVertexIndex: *352 { + a: 0,46,24,-50,2,47,24,-47,3,48,24,-48,1,49,24,-49,12,50,25,-54,13,51,25,-51,15,52,25,-52,14,53,25,-53,0,49,26,-57,1,54,26,-50,5,55,26,-55,4,56,26,-56,1,48,27,-55,3,57,27,-49,7,58,27,-58,5,54,27,-59,3,47,28,-58,2,59,28,-48,6,60,28,-60,7,57,28,-61,2,46,29,-60,0,56,29,-47,4,61,29,-57,6,59,29,-62,4,55,30,-65,5,62,30,-56,9,63,30,-63,8,64,30,-64,5,58,31,-63,7,65,31,-59,11,66,31,-66,9,62,31,-67,7,60,32,-66,6,67,32,-61,10,68,32,-68,11,65,32,-69,6,61,33,-68,4,64,33,-62,8,69,33,-65,10,67,33,-70,20,70,34,-74,21,71,34,-71,23,72,34,-72,22,73,34,-73,9,66,35,-76,11,74,35,-67,15,51,35,-75,13,75,35,-52,11,68,36,-75,10,76,36,-69,14,52,36,-77,15,74,36,-53,10,69,37,-77,8,77,37,-70,12,53,37,-78,14,76,37,-54,13,50,38,-81,12,78,38,-51,18,79,38,-79,19,80,38,-80,8,63,39,-84,9,81,39,-64,17,82,39,-82,16,83,39,-83,9,75,40,-82,13,80,40,-76,19,84,40,-81,17,81,40,-85,12,77,41,-79,8,83,41,-78,16,85,41,-84,18,78,41,-86,16,82,42,-88,17,86,42,-83,21,70,42,-87,20,87,42,-71,17,84,43,-87,19,88,43,-85,23,71,43,-89,21,86,43,-72,19,79,44,-89,18,89,44,-80,22,72,44,-90,23,88,44,-73,18,85,45,-90,16,87,45,-86,20,73,45,-88,22,89,45,-74 + } + Edges: *176 { + a: 0,1,2,3,4,5,7,8,9,11,12,15,16,17,18,19,20,21,23,24,25,27,28,31,33,34,35,36,37,40,41,43,44,47,49,50,52,53,56,57,59,63,65,66,68,69,72,73,75,79,81,82,85,88,89,95,97,98,99,100,101,104,105,107,108,111,113,114,116,117,120,121,123,127,129,130,132,133,136,137,139,143,145,146,149,152,153,159,160,161,162,163,164,165,167,168,169,171,172,175,177,178,179,180,181,185,187,188,193,194,196,197,201,203,209,210,212,213,217,219,225,226,227,228,229,232,233,235,236,239,241,242,243,244,245,248,249,251,252,255,257,258,261,264,265,271,273,274,277,280,281,287,289,290,291,292,293,297,299,300,305,306,308,309,313,315,321,322,324,325,329,331,337,338,341,345 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *1056 { + a: -0.652862071990967,-0.652863264083862,-0.384110331535339,-0.800568282604218,-1.98758485225881e-08,-0.599241495132446,0,0,-1,3.31263692032735e-08,-0.800568759441376,-0.599240958690643,-0.652862131595612,0.652863204479218,-0.384110301733017,-3.31263692032735e-08,0.800568759441376,-0.599240958690643,0,0,-1,-0.800568282604218,-1.98758485225881e-08,-0.599241495132446,0.652862071990967,0.652863264083862,-0.384110271930695,0.800568282604218,1.98758485225881e-08,-0.599241495132446,0,0,-1,-3.31263692032735e-08,0.800568759441376,-0.599240958690643,0.652862131595612,-0.652863204479218,-0.384110301733017,3.31263692032735e-08,-0.800568759441376,-0.599240958690643,0,0,-1,0.800568282604218,1.98758485225881e-08,-0.599241495132446,-0.710411846637726,5.37463158423179e-08,0.703786075115204,0,7.63673995152203e-08,1,0,0.1841099858284,0.982905626296997,-0.698267579078674,0.182694166898727,0.692130982875824,0.710411906242371,5.37463193950316e-08,0.703786194324493,0.698267579078674,0.182694122195244,0.692130923271179,0,0.1841099858284,0.982905626296997,0,7.63673995152203e-08,1,0.579942047595978,0.579943180084229,0.572130262851715,0,0.709993481636047,0.704208314418793,0,0.1841099858284,0.982905626296997,0.698267579078674,0.182694122195244,0.692130923271179,-0.579941987991333,0.579943180084229,0.572130262851715,-0.698267579078674,0.182694166898727,0.692130982875824,0,0.1841099858284,0.982905626296997,0,0.709993481636047,0.704208314418793,-0.652862071990967,-0.652863264083862,-0.384110331535339,3.31263692032735e-08,-0.800568759441376,-0.599240958690643,2.58623611415487e-08,-0.994135916233063,-0.108138211071491,-0.702846705913544,-0.70284765958786,-0.10959754139185,0.652862131595612,-0.652863204479218,-0.384110301733017,0.702846765518188,-0.70284765958786,-0.109597563743591,2.58623611415487e-08,-0.994135916233063,-0.108138211071491,3.31263692032735e-08,-0.800568759441376,-0.599240958690643,0.707106232643127,-0.707107245922089,0,9.99951410562971e-09,-0.999999940395355,0,2.58623611415487e-08,-0.994135916233063,-0.108138211071491, +0.702846765518188,-0.70284765958786,-0.109597563743591,-0.707106232643127,-0.707107245922089,0,-0.702846705913544,-0.70284765958786,-0.10959754139185,2.58623611415487e-08,-0.994135916233063,-0.108138211071491,9.99951410562971e-09,-0.999999940395355,0,0.652862131595612,-0.652863204479218,-0.384110301733017,0.800568282604218,1.98758485225881e-08,-0.599241495132446,0.994135916233063,1.03449506738684e-08,-0.108138419687748,0.702846765518188,-0.70284765958786,-0.109597563743591,0.652862071990967,0.652863264083862,-0.384110271930695,0.702846705913544,0.702847719192505,-0.10959754139185,0.994135916233063,1.03449506738684e-08,-0.108138419687748,0.800568282604218,1.98758485225881e-08,-0.599241495132446,0.707106292247772,0.707107245922089,0,1,4.9997588291717e-09,0,0.994135916233063,1.03449506738684e-08,-0.108138419687748,0.702846705913544,0.702847719192505,-0.10959754139185,0.707106232643127,-0.707107245922089,0,0.702846765518188,-0.70284765958786,-0.109597563743591,0.994135916233063,1.03449506738684e-08,-0.108138419687748,1,4.9997588291717e-09,0,0.652862071990967,0.652863264083862,-0.384110271930695,-3.31263692032735e-08,0.800568759441376,-0.599240958690643,-2.58623611415487e-08,0.994135916233063,-0.108138211071491,0.702846705913544,0.702847719192505,-0.10959754139185,-0.652862131595612,0.652863204479218,-0.384110301733017,-0.702846765518188,0.70284765958786,-0.109597563743591,-2.58623611415487e-08,0.994135916233063,-0.108138211071491,-3.31263692032735e-08,0.800568759441376,-0.599240958690643,-0.707106232643127,0.707107245922089,0,-9.99951410562971e-09,0.999999940395355,0,-2.58623611415487e-08,0.994135916233063,-0.108138211071491,-0.702846765518188,0.70284765958786,-0.109597563743591,0.707106292247772,0.707107245922089,0,0.702846705913544,0.702847719192505,-0.10959754139185,-2.58623611415487e-08,0.994135916233063,-0.108138211071491,-9.99951410562971e-09,0.999999940395355,0,-0.652862131595612,0.652863204479218,-0.384110301733017,-0.800568282604218,-1.98758485225881e-08,-0.599241495132446,-0.994135916233063,-1.03449506738684e-08,-0.108138419687748, +-0.702846765518188,0.70284765958786,-0.109597563743591,-0.652862071990967,-0.652863264083862,-0.384110331535339,-0.702846705913544,-0.70284765958786,-0.10959754139185,-0.994135916233063,-1.03449506738684e-08,-0.108138419687748,-0.800568282604218,-1.98758485225881e-08,-0.599241495132446,-0.707106232643127,-0.707107245922089,0,-1,-4.9997588291717e-09,0,-0.994135916233063,-1.03449506738684e-08,-0.108138419687748,-0.702846705913544,-0.70284765958786,-0.10959754139185,-0.707106232643127,0.707107245922089,0,-0.702846765518188,0.70284765958786,-0.109597563743591,-0.994135916233063,-1.03449506738684e-08,-0.108138419687748,-1,-4.9997588291717e-09,0,-0.707106232643127,-0.707107245922089,0,9.99951410562971e-09,-0.999999940395355,0,9.79135528211827e-09,-0.98051393032074,-0.196449548006058,-0.726994812488556,-0.671344578266144,-0.144135817885399,0.707106232643127,-0.707107245922089,0,0.726994812488556,-0.671344578266144,-0.144135773181915,9.79135528211827e-09,-0.98051393032074,-0.196449548006058,9.99951410562971e-09,-0.999999940395355,0,0.841134011745453,-0.375836849212646,-0.388896316289902,1.50185499592226e-08,-0.690597236156464,-0.723239421844482,9.79135528211827e-09,-0.98051393032074,-0.196449548006058,0.726994812488556,-0.671344578266144,-0.144135773181915,-0.841133952140808,-0.375836879014969,-0.388896316289902,-0.726994812488556,-0.671344578266144,-0.144135817885399,9.79135528211827e-09,-0.98051393032074,-0.196449548006058,1.50185499592226e-08,-0.690597236156464,-0.723239421844482,0.707106232643127,-0.707107245922089,0,1,4.9997588291717e-09,0,0.999147593975067,0.0213359203189611,-0.0353379249572754,0.726994812488556,-0.671344578266144,-0.144135773181915,0.707106292247772,0.707107245922089,0,0.707106292247772,0.707107305526733,0,0.999147593975067,0.0213359203189611,-0.0353379249572754,1,4.9997588291717e-09,0,0.707106232643127,0.707107245922089,0,0.995042204856873,0.0814711675047874,-0.0570379979908466,0.999147593975067,0.0213359203189611,-0.0353379249572754,0.707106292247772,0.707107305526733,0,0.841134011745453,-0.375836849212646,-0.388896316289902, +0.726994812488556,-0.671344578266144,-0.144135773181915,0.999147593975067,0.0213359203189611,-0.0353379249572754,0.995042204856873,0.0814711675047874,-0.0570379979908466,0.707106292247772,0.707107245922089,0,-9.99951410562971e-09,0.999999940395355,0,0,0.999999940395355,0,0.707106292247772,0.707107305526733,0,-0.707106232643127,0.707107245922089,0,-0.707106232643127,0.707107245922089,0,0,0.999999940395355,0,-9.99951410562971e-09,0.999999940395355,0,-0.707106292247772,0.707107245922089,0,-9.99951321745129e-09,0.999999940395355,0,0,0.999999940395355,0,-0.707106232643127,0.707107245922089,0,0.707106232643127,0.707107245922089,0,0.707106292247772,0.707107305526733,0,0,0.999999940395355,0,-9.99951321745129e-09,0.999999940395355,0,-0.707106232643127,0.707107245922089,0,-1,-4.9997588291717e-09,0,-0.999147593975067,0.0213359259068966,-0.035337932407856,-0.707106232643127,0.707107245922089,0,-0.707106232643127,-0.707107245922089,0,-0.726994812488556,-0.671344578266144,-0.144135817885399,-0.999147593975067,0.0213359259068966,-0.035337932407856,-1,-4.9997588291717e-09,0,-0.841133952140808,-0.375836879014969,-0.388896316289902,-0.995042204856873,0.0814711898565292,-0.0570380054414272,-0.999147593975067,0.0213359259068966,-0.035337932407856,-0.726994812488556,-0.671344578266144,-0.144135817885399,-0.707106292247772,0.707107245922089,0,-0.707106232643127,0.707107245922089,0,-0.999147593975067,0.0213359259068966,-0.035337932407856,-0.995042204856873,0.0814711898565292,-0.0570380054414272,-0.659748792648315,-0.374187439680099,-0.651701867580414,1.3334736870263e-08,-0.595272123813629,-0.803524017333984,0,-1,-3.61959962447145e-07,-0.806484878063202,-0.591254770755768,-2.44395920390161e-07,0.659748792648315,-0.374187439680099,-0.651701867580414,0.806484878063202,-0.591254770755768,-2.44395920390161e-07,0,-1,-3.61959962447145e-07,1.3334736870263e-08,-0.595272123813629,-0.803524017333984,0.659748792648315,-0.374187499284744,0.651701807975769,-2.00021119667326e-08,-0.595272481441498,0.803524017333984,0,-1,-3.61959962447145e-07,0.806484878063202,-0.591254770755768,-2.44395920390161e-07, +-0.659748792648315,-0.374187499284744,0.651701807975769,-0.806484878063202,-0.591254770755768,-2.44395920390161e-07,0,-1,-3.61959962447145e-07,-2.00021119667326e-08,-0.595272481441498,0.803524017333984,0.841134011745453,-0.375836849212646,-0.388896316289902,0.995042204856873,0.0814711675047874,-0.0570379979908466,0.978707313537598,0.146339476108551,0.143932938575745,0.995302379131317,-0.0552102141082287,0.0795305594801903,0.707106232643127,0.707107245922089,0,0.695669531822205,0.695670485496521,0.17912694811821,0.978707313537598,0.146339476108551,0.143932938575745,0.995042204856873,0.0814711675047874,-0.0570379979908466,0.579942047595978,0.579943180084229,0.572130262851715,0.698267579078674,0.182694122195244,0.692130923271179,0.978707313537598,0.146339476108551,0.143932938575745,0.695669531822205,0.695670485496521,0.17912694811821,0.710411906242371,5.37463193950316e-08,0.703786194324493,0.995302379131317,-0.0552102141082287,0.0795305594801903,0.978707313537598,0.146339476108551,0.143932938575745,0.698267579078674,0.182694122195244,0.692130923271179,0.707106232643127,0.707107245922089,0,-9.99951321745129e-09,0.999999940395355,0,-1.05700381780593e-08,0.983797073364258,0.179285451769829,0.695669531822205,0.695670485496521,0.17912694811821,-0.707106292247772,0.707107245922089,0,-0.695669531822205,0.695670485496521,0.179126963019371,-1.05700381780593e-08,0.983797073364258,0.179285451769829,-9.99951321745129e-09,0.999999940395355,0,-0.579941987991333,0.579943180084229,0.572130262851715,0,0.709993481636047,0.704208314418793,-1.05700381780593e-08,0.983797073364258,0.179285451769829,-0.695669531822205,0.695670485496521,0.179126963019371,0.579942047595978,0.579943180084229,0.572130262851715,0.695669531822205,0.695670485496521,0.17912694811821,-1.05700381780593e-08,0.983797073364258,0.179285451769829,0,0.709993481636047,0.704208314418793,-0.707106292247772,0.707107245922089,0,-0.995042204856873,0.0814711898565292,-0.0570380054414272,-0.978707313537598,0.146339491009712,0.143932968378067,-0.695669531822205,0.695670485496521,0.179126963019371, +-0.841133952140808,-0.375836879014969,-0.388896316289902,-0.995302379131317,-0.0552102141082287,0.0795305743813515,-0.978707313537598,0.146339491009712,0.143932968378067,-0.995042204856873,0.0814711898565292,-0.0570380054414272,-0.710411846637726,5.37463158423179e-08,0.703786075115204,-0.698267579078674,0.182694166898727,0.692130982875824,-0.978707313537598,0.146339491009712,0.143932968378067,-0.995302379131317,-0.0552102141082287,0.0795305743813515,-0.579941987991333,0.579943180084229,0.572130262851715,-0.695669531822205,0.695670485496521,0.179126963019371,-0.978707313537598,0.146339491009712,0.143932968378067,-0.698267579078674,0.182694166898727,0.692130982875824,0.710411906242371,5.37463193950316e-08,0.703786194324493,0,7.63673995152203e-08,1,0,5.60605144528381e-08,1,0.710411727428436,3.94546262327822e-08,0.703786313533783,-0.710411846637726,5.37463158423179e-08,0.703786075115204,-0.710411727428436,3.94546262327822e-08,0.703786313533783,0,5.60605144528381e-08,1,0,7.63673995152203e-08,1,-0.710411906242371,-4.87737423782164e-08,0.703786134719849,0,-6.93019472919332e-08,1,0,5.60605144528381e-08,1,-0.710411727428436,3.94546262327822e-08,0.703786313533783,0.710411906242371,-4.87737494836438e-08,0.703786134719849,0.710411727428436,3.94546262327822e-08,0.703786313533783,0,5.60605144528381e-08,1,0,-6.93019472919332e-08,1,-0.841133952140808,-0.375836879014969,-0.388896316289902,1.50185499592226e-08,-0.690597236156464,-0.723239421844482,-4.90903246941343e-08,-0.17442087829113,-0.984671115875244,-0.727758407592773,-0.130680873990059,-0.673268377780914,0.841134011745453,-0.375836849212646,-0.388896316289902,0.727758526802063,-0.130680739879608,-0.673268377780914,-4.90903246941343e-08,-0.17442087829113,-0.984671115875244,1.50185499592226e-08,-0.690597236156464,-0.723239421844482,0.710411727428436,4.87737707999258e-08,-0.703786373138428,-1.10169025901996e-07,3.46509771986803e-08,-1,-4.90903246941343e-08,-0.17442087829113,-0.984671115875244,0.727758526802063,-0.130680739879608,-0.673268377780914,-0.710411787033081,0,-0.703786194324493, +-0.727758407592773,-0.130680873990059,-0.673268377780914,-4.90903246941343e-08,-0.17442087829113,-0.984671115875244,-1.10169025901996e-07,3.46509771986803e-08,-1,0.841134011745453,-0.375836849212646,-0.388896316289902,0.995302379131317,-0.0552102141082287,0.0795305594801903,0.99923437833786,-0.0332521721720695,0.0206125881522894,0.727758526802063,-0.130680739879608,-0.673268377780914,0.710411906242371,5.37463193950316e-08,0.703786194324493,0.710411727428436,3.94546262327822e-08,0.703786313533783,0.99923437833786,-0.0332521721720695,0.0206125881522894,0.995302379131317,-0.0552102141082287,0.0795305594801903,0.710411906242371,-4.87737494836438e-08,0.703786134719849,1,1.19020089194444e-14,-7.98730326323494e-08,0.99923437833786,-0.0332521721720695,0.0206125881522894,0.710411727428436,3.94546262327822e-08,0.703786313533783,0.710411727428436,4.87737707999258e-08,-0.703786373138428,0.727758526802063,-0.130680739879608,-0.673268377780914,0.99923437833786,-0.0332521721720695,0.0206125881522894,1,1.19020089194444e-14,-7.98730326323494e-08,-0.710411846637726,5.37463158423179e-08,0.703786075115204,-0.995302379131317,-0.0552102141082287,0.0795305743813515,-0.99923437833786,-0.0332522056996822,0.0206125862896442,-0.710411727428436,3.94546262327822e-08,0.703786313533783,-0.841133952140808,-0.375836879014969,-0.388896316289902,-0.727758407592773,-0.130680873990059,-0.673268377780914,-0.99923437833786,-0.0332522056996822,0.0206125862896442,-0.995302379131317,-0.0552102141082287,0.0795305743813515,-0.710411787033081,0,-0.703786194324493,-1,-1.13713474192423e-08,-1.14817495955322e-07,-0.99923437833786,-0.0332522056996822,0.0206125862896442,-0.727758407592773,-0.130680873990059,-0.673268377780914,-0.710411906242371,-4.87737423782164e-08,0.703786134719849,-0.710411727428436,3.94546262327822e-08,0.703786313533783,-0.99923437833786,-0.0332522056996822,0.0206125862896442,-1,-1.13713474192423e-08,-1.14817495955322e-07,-0.710411787033081,0,-0.703786194324493,-1.10169025901996e-07,3.46509771986803e-08,-1,-5.18024592111033e-08,-0.105841346085072,-0.994383037090302, +-0.70633864402771,-0.106598734855652,-0.699801683425903,0.710411727428436,4.87737707999258e-08,-0.703786373138428,0.706338584423065,-0.106598787009716,-0.699801683425903,-5.18024592111033e-08,-0.105841346085072,-0.994383037090302,-1.10169025901996e-07,3.46509771986803e-08,-1,0.659748792648315,-0.374187439680099,-0.651701867580414,1.3334736870263e-08,-0.595272123813629,-0.803524017333984,-5.18024592111033e-08,-0.105841346085072,-0.994383037090302,0.706338584423065,-0.106598787009716,-0.699801683425903,-0.659748792648315,-0.374187439680099,-0.651701867580414,-0.70633864402771,-0.106598734855652,-0.699801683425903,-5.18024592111033e-08,-0.105841346085072,-0.994383037090302,1.3334736870263e-08,-0.595272123813629,-0.803524017333984,0.710411727428436,4.87737707999258e-08,-0.703786373138428,1,1.19020089194444e-14,-7.98730326323494e-08,0.994535982608795,-0.10439445823431,-1.54703414523283e-07,0.706338584423065,-0.106598787009716,-0.699801683425903,0.710411906242371,-4.87737494836438e-08,0.703786134719849,0.706338703632355,-0.106598608195782,0.699801743030548,0.994535982608795,-0.10439445823431,-1.54703414523283e-07,1,1.19020089194444e-14,-7.98730326323494e-08,0.659748792648315,-0.374187499284744,0.651701807975769,0.806484878063202,-0.591254770755768,-2.44395920390161e-07,0.994535982608795,-0.10439445823431,-1.54703414523283e-07,0.706338703632355,-0.106598608195782,0.699801743030548,0.659748792648315,-0.374187439680099,-0.651701867580414,0.706338584423065,-0.106598787009716,-0.699801683425903,0.994535982608795,-0.10439445823431,-1.54703414523283e-07,0.806484878063202,-0.591254770755768,-2.44395920390161e-07,0.710411906242371,-4.87737494836438e-08,0.703786134719849,0,-6.93019472919332e-08,1,-1.03604902434995e-08,-0.105841070413589,0.994383037090302,0.706338703632355,-0.106598608195782,0.699801743030548,-0.710411906242371,-4.87737423782164e-08,0.703786134719849,-0.706338703632355,-0.106598608195782,0.699801683425903,-1.03604902434995e-08,-0.105841070413589,0.994383037090302,0,-6.93019472919332e-08,1,-0.659748792648315,-0.374187499284744,0.651701807975769, +-2.00021119667326e-08,-0.595272481441498,0.803524017333984,-1.03604902434995e-08,-0.105841070413589,0.994383037090302,-0.706338703632355,-0.106598608195782,0.699801683425903,0.659748792648315,-0.374187499284744,0.651701807975769,0.706338703632355,-0.106598608195782,0.699801743030548,-1.03604902434995e-08,-0.105841070413589,0.994383037090302,-2.00021119667326e-08,-0.595272481441498,0.803524017333984,-0.710411906242371,-4.87737423782164e-08,0.703786134719849,-1,-1.13713474192423e-08,-1.14817495955322e-07,-0.994535982608795,-0.10439445823431,-1.85644097427939e-07,-0.706338703632355,-0.106598608195782,0.699801683425903,-0.710411787033081,0,-0.703786194324493,-0.70633864402771,-0.106598734855652,-0.699801683425903,-0.994535982608795,-0.10439445823431,-1.85644097427939e-07,-1,-1.13713474192423e-08,-1.14817495955322e-07,-0.659748792648315,-0.374187439680099,-0.651701867580414,-0.806484878063202,-0.591254770755768,-2.44395920390161e-07,-0.994535982608795,-0.10439445823431,-1.85644097427939e-07,-0.70633864402771,-0.106598734855652,-0.699801683425903,-0.659748792648315,-0.374187499284744,0.651701807975769,-0.706338703632355,-0.106598608195782,0.699801683425903,-0.994535982608795,-0.10439445823431,-1.85644097427939e-07,-0.806484878063202,-0.591254770755768,-2.44395920390161e-07 + } + NormalsW: *352 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "UVChannel_1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *236 { + a: 0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0.0799999982118607,0.0799999982118607,0.920000016689301,0.0799999982118607,0.875,0.875,0.125,0.875,0.125,0.125,0.875,0.125,0.777777850627899,0.777777850627899,0.222222223877907,0.777777850627899,0.125,0,0.875,0,0.875,0,0.125,0,0.222222223877907,0,0.777777850627899,0,0.777777850627899,0,0.222222223877907,0,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,1,0.5,0.5,1,0,0.5,0.5,0,1,0.5,0.5,1,0,0.5,0.5,0,0.5,0,1,0,0,0,0.5,0,1,0,0.5,0,0,0,1,0.5,0.5,0,0.5,1,0.5,0,0,0.5,0.5,0,0.5,0,0.5,0,0.5,0.125,0.875,0.5,0.5,0.875,0.125,0.5,1,0.5,0,0.5,0.5,1,0.5,0,0,0.5,1,0.5,1,0.5,0,0.5,0.5,1,1,0.5,1,0.5,0,0.5,0.5,1,0.5,1,0.5,1,0,0.5,0.875,0.125,0.5,0,0.125,0.125,0.875,0.875,1,0.5,0.125,0.875,0.5,1,0,0.5,0.5,0,0.875,0,0.5,0,0.125,0,0.875,0.875,1,0.125,0.125,0.875,0,0.125,0.125,0,0.5,0,0.875,0,0.875,0,0.5,0,0.125,0,1,0,0,0,0.875,0,0.125,0,0.875,0,0.125,0 + } + UVIndex: *352 { + a: 9,62,40,68,11,64,40,62,10,66,40,64,8,68,40,66,16,70,41,73,17,71,41,70,18,72,41,71,19,73,41,72,4,69,42,78,5,74,42,69,7,76,42,74,6,78,42,76,0,67,43,75,1,80,43,67,3,82,43,80,2,75,43,82,32,65,44,81,33,84,44,65,35,86,44,84,34,81,44,86,28,63,45,85,29,79,45,63,31,88,45,79,30,85,45,88,36,77,46,92,37,90,46,77,13,91,46,90,12,92,46,91,37,83,47,90,39,93,47,83,14,94,47,93,13,90,47,94,39,87,48,93,38,95,48,87,15,96,48,95,14,93,48,96,38,89,49,95,36,92,49,89,12,97,49,92,15,95,49,97,24,98,50,101,25,99,50,98,26,100,50,99,27,101,50,100,13,94,51,103,14,102,51,94,18,71,51,102,17,103,51,71,14,96,52,102,15,104,52,96,19,72,52,104,18,102,52,72,15,97,53,104,12,105,53,97,16,73,53,105,19,104,53,73,17,70,54,108,16,106,54,70,23,107,54,106,22,108,54,107,12,91,55,111,13,109,55,91,21,110,55,109,20,111,55,110,13,103,56,109,17,108,56,103,22,112,56,108,21,109,56,112,16,105,57,106,12,111,57,105,20,113,57,111,23,106,57,113,20,110,58,115,21,114,58,110,25,98,58,114,24,115,58,98,21,112,59,114,22,116,59,112,26,99,59,116,25,114,59,99,22,107,60,116,23,117,60,107,27,100,60,117,26,116,60,100,23,113,61,117,20,115,61,113,24,101,61,115,27,117,61,101 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2426741356400, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",164.628293991089 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2426741353520, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",177.309545516968 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2426741354096, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",167.443071365356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2424735512176, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",189.954908370972 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2425779048240, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",189.954908370972 + } + TypeFlags: "Skeleton" + } + Model: 2426744489968, "Model::Box001", "Mesh" { + Version: 232 + Properties70: { + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "GeometricTranslation", "Vector3D", "Vector", "",-9.20781326293945,23.6171798706055,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,-0,135.374984741211 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-28.9443359375,3.67995834350586,-8.67447662353516 + P: "Lcl Rotation", "Lcl Rotation", "", "A",90.171358296453,-44.6248772966915,90.1381603927014 + P: "MaxHandle", "int", "Integer", "UH",2 + } + Shading: T + Culling: "CullingOff" + } + Model: 2426744498736, "Model::Bone001", "LimbNode" { + Version: 232 + Properties70: { + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-25.4116115570068,-19.3058376312256,1.51081693172455 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",90.0000229950473,-6.66469196204984,0 + P: "MaxHandle", "int", "Integer", "UH",5 + } + Shading: T + Culling: "CullingOff" + } + Model: 2426744494352, "Model::Bone002", "LimbNode" { + Version: 232 + Properties70: { + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",23.5183258056641,-5.7220458984375e-06,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-2.7320756042735e-05,1.28686155409888e-07,16.409965515542 + P: "MaxHandle", "int", "Integer", "UH",6 + } + Shading: T + Culling: "CullingOff" + } + Model: 2426744496544, "Model::Bone003", "LimbNode" { + Version: 232 + Properties70: { + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",25.3299350738525,4.76837158203125e-07,-1.9073486328125e-06 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",5.10181308418683e-08,-6.10666477250204e-13,110.050180799657 + P: "MaxHandle", "int", "Integer", "UH",7 + } + Shading: T + Culling: "CullingOff" + } + Model: 2426744483392, "Model::Bone004", "LimbNode" { + Version: 232 + Properties70: { + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",23.9204406738281,0,5.7220458984375e-06 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",6.80058561036385e-09,1.01777748665986e-13,21.6378382174936 + P: "MaxHandle", "int", "Integer", "UH",8 + } + Shading: T + Culling: "CullingOff" + } + Model: 2426744500928, "Model::Bone005", "LimbNode" { + Version: 232 + Properties70: { + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",27.136417388916,-5.7220458984375e-06,1.9073486328125e-06 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-1.01777749806833e-12,-4.0711099922733e-13,0 + P: "MaxHandle", "int", "Integer", "UH",9 + } + Shading: T + Culling: "CullingOff" + } + Pose: 2426735387904, "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 6 + PoseNode: { + Node: 2426744500928 + Matrix: *16 { + a: -0.00740736909210682,7.55009850195165e-08,0.999972581863403,0,-0.999972581863403,3.23770843468907e-10,-0.00740736909210682,0,-8.83025597087084e-10,-1,7.54964872839992e-08,0,23.030590057373,-19.3058414459229,53.1690979003906,1 + } + } + PoseNode: { + Node: 2426744483392 + Matrix: *16 { + a: -0.00740736909210682,7.55009850195165e-08,0.999972581863403,0,-0.999972581863403,3.23770843468907e-10,-0.00740736909210682,0,-8.83025597087084e-10,-1,7.54964872839992e-08,0,23.231595993042,-19.3058395385742,26.03342628479,1 + } + } + PoseNode: { + Node: 2426744496544 + Matrix: *16 { + a: -0.00840297341346741,7.55013829234485e-08,0.999964714050293,0,-0.999964714050293,3.67306407511592e-10,-0.00840297341346741,0,-1.00172958816813e-09,-1,7.54956062110068e-08,0,23.4325981140137,-19.3058376312256,2.11383175849915,1 + } + } + PoseNode: { + Node: 2426744494352 + Matrix: *16 { + a: 0.99987405538559,-6.93811674778999e-10,0.0158711820840836,0,-0.0158711820840836,7.55086659864901e-08,0.99987405538559,0,-1.89213600343408e-09,-1,7.54881170905719e-08,0,-1.89414596557617,-19.3058376312256,1.7118159532547,1 + } + } + PoseNode: { + Node: 2426744498736 + Matrix: *16 { + a: 0.999963462352753,0,0.00854672491550446,0,-0.00854672491550446,-4.01339264044509e-07,0.999963462352753,0,3.43013639714229e-09,-1,-4.01324598442443e-07,0,-25.4116115570068,-19.3058376312256,1.51081693172455,1 + } + } + PoseNode: { + Node: 2426744489968 + Matrix: *16 { + a: -0.00171620969194919,0.711719036102295,0.702462136745453,0,0.00468462845310569,-0.70244973897934,0.711717963218689,0,0.999987542629242,0.0045122317969799,-0.00212858850136399,0,-28.9443359375,3.67995834350586,-8.67447662353516,1 + } + } + } + Deformer: 2425781325696, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "Blend" + Indexes: *90 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89 + } + BlendWeights: *90 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Deformer: 2426259424096, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *17 { + a: 0,1,2,3,24,26,27,28,29,46,47,48,49,54,56,57,59 + } + Weights: *17 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 0.00428760377834238,0.702450872047115,-0.711719318023402,0,0.0107673155149419,0.711652200683946,0.70244947490105,0,0.999932840429407,-0.0106751312139609,-0.00451222727311554,0,-3.61964630462551,-10.1547376889899,-22.9857918992366,1 + } + TransformLink: *16 { + a: 0.999963462352753,0,0.00854672491550446,0,-0.00854672491550446,-4.01339251368945e-07,0.999963462352753,0,3.43013627341142e-09,-1,-4.01324598394401e-07,0,-25.4116115570068,-19.3058376312256,1.51081693172455,1 + } + } + Deformer: 2426259427104, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *29 { + a: 4,5,6,7,8,9,10,11,30,31,32,33,35,36,37,55,58,60,61,62,63,64,65,66,67,68,69,74,76 + } + Weights: *29 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 0.00943291024248103,0.702400942651622,-0.7117189830715,0,0.0159798441138131,0.711553886298029,0.702449814232391,0,0.999827795316832,-0.0179993040047691,-0.00451223361025988,0,-27.2116253298779,-9.95566404349015,-22.9857967075904,1 + } + TransformLink: *16 { + a: 0.999874055385589,-6.93811674778999e-10,0.0158711820840836,0,-0.0158711820840835,7.55086402272677e-08,0.999874055385589,0,-1.8921356310667e-09,-1,7.54881171199424e-08,0,-1.89414596557617,-19.3058376312256,1.7118159532547,1 + } + } + Deformer: 2426259434624, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *27 { + a: 12,13,14,15,16,17,18,19,25,38,39,40,41,50,51,52,53,75,77,78,79,80,81,82,83,84,85 + } + Weights: *27 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 0.70245179709012,-0.00418662109723308,-0.711718983067762,0,0.711653382495144,-0.0106650104006349,0.702449814241879,0,-0.0105313813083971,-0.99993433134131,-0.00451223272263469,0,-10.3478035798039,52.4657376963531,-22.9857967365894,1 + } + TransformLink: *16 { + a: -0.00840297341346743,7.55013829240934e-08,0.999964714050293,0,-0.999964714050293,3.70060431876627e-10,-0.00840297341346745,0,-1.00448344785251e-09,-1,7.54956062105507e-08,0,23.4325981140137,-19.3058376312256,2.11383175849915,1 + } + } + Deformer: 2426259427856, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *17 { + a: 20,21,22,23,34,42,43,44,45,70,71,72,73,86,87,88,89 + } + Weights: *17 { + a: 1,1,1,1,0.456600040197372,1,1,1,1,1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 0.702455619277449,-0.00348723333326101,-0.711718983067345,0,0.711663650260907,-0.0099564578545681,0.702449814243058,0,-0.00953580623059204,-0.999944324000181,-0.00451223260479986,0,-34.3204620083069,52.4315938570318,-22.9858004561432,1 + } + TransformLink: *16 { + a: -0.00740736909210688,7.55009850192737e-08,0.999972581863403,0,-0.999972581863403,3.27390615882644e-10,-0.0074073690921069,0,-8.86645272509993e-10,-1,7.54964872834873e-08,0,23.231595993042,-19.3058395385742,26.03342628479,1 + } + } + Deformer: 2424740126464, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *1 { + a: 34 + } + Weights: *1 { + a: 0.543399930000305 + } + Transform: *16 { + a: 0.702455619277449,-0.00348723333326101,-0.711718983067345,0,0.711663650260907,-0.0099564578545681,0.702449814243058,0,-0.00953580623059204,-0.999944324000181,-0.00451223260479986,0,-61.4568776278519,52.4315973677899,-22.9858044123179,1 + } + TransformLink: *16 { + a: -0.00740736909210688,7.55009850192737e-08,0.999972581863403,0,-0.999972581863403,3.27390615882644e-10,-0.0074073690921069,0,-8.86645272509993e-10,-1,7.54964872834873e-08,0,23.030590057373,-19.3058414459229,53.1690979003906,1 + } + } + AnimationStack: 2426741256160, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",153953860000 + P: "ReferenceStop", "KTime", "Time", "",153953860000 + } + } + AnimationCurve: 2426741283552, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 0 + } + KeyValueFloat: *1 { + a: -25.41161 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *1 { + a: 16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434820,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2426741280832, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 0 + } + KeyValueFloat: *1 { + a: -19.30584 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *1 { + a: 16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434820,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2426741282112, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 0 + } + KeyValueFloat: *1 { + a: 1.510817 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *1 { + a: 16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434820,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2426741285312, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: 90.00002,90.00002 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218441387,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2426741288192, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: -6.664692,-6.664692 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218441387,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2426741288032, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: 0,79.82052 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218441387,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2426741284032, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 0 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight + KeyAttrFlags: *1 { + a: 16778248 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333233, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434820,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2426741285792, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 0 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight + KeyAttrFlags: *1 { + a: 16778248 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333233, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434820,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2426741283072, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 0 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight + KeyAttrFlags: *1 { + a: 16778248 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333233, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434820,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2426741279552, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: -2.732076e-05,-2.732076e-05 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218434820,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2426741284992, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: 1.286852e-07,1.286852e-07 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218434820,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2426741279712, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: 16.40997,-37.80411 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218441387,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2426741280512, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: 5.101834e-08,-30.4227 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218441387,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2426741280992, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: 1.956041e-13,-19.58426 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218441387,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2426741286752, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: 110.0502,37.20745 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218441387,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2426741284352, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: 6.801425e-09,-28.29693 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218441387,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2426741282592, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: 1.289748e-13,11.4626 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218441387,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2426742197024, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,36948926400 + } + KeyValueFloat: *2 { + a: 21.63784,-22.86441 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight + KeyAttrFlags: *2 { + a: 50356488,16802056 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:-0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,-2147483648,218369284,0,0,0,218441387,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2426741256576, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-25.4116115570068 + P: "d|Y", "Number", "", "A",-19.3058376312256 + P: "d|Z", "Number", "", "A",1.51081693172455 + } + } + AnimationCurveNode: 2426741255120, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",90.0000229950473 + P: "d|Y", "Number", "", "A",-6.66469196204984 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2426741256368, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2426741256784, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-2.7320756042735e-05 + P: "d|Y", "Number", "", "A",1.28686155409888e-07 + P: "d|Z", "Number", "", "A",16.409965515542 + } + } + AnimationCurveNode: 2426741257200, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",5.10181308418683e-08 + P: "d|Y", "Number", "", "A",-6.10666477250204e-13 + P: "d|Z", "Number", "", "A",110.050180799657 + } + } + AnimationCurveNode: 2426741257408, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",6.80058561036385e-09 + P: "d|Y", "Number", "", "A",1.01777748665986e-13 + P: "d|Z", "Number", "", "A",21.6378382174936 + } + } + AnimationLayer: 2426741559952, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Box001, Model::RootNode + C: "OO",2426744489968,0 + + ;Model::Bone001, Model::RootNode + C: "OO",2426744498736,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2426741559952,2426741256160 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2426741256576,2426741559952 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2426741255120,2426741559952 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2426741256368,2426741559952 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2426741256784,2426741559952 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2426741257200,2426741559952 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2426741257408,2426741559952 + + ;Geometry::, Model::Box001 + C: "OO",2426728793152,2426744489968 + + ;Model::Bone002, Model::Bone001 + C: "OO",2426744494352,2426744498736 + + ;NodeAttribute::, Model::Bone001 + C: "OO",2426741356400,2426744498736 + + ;AnimCurveNode::T, Model::Bone001 + C: "OP",2426741256576,2426744498736, "Lcl Translation" + + ;AnimCurveNode::R, Model::Bone001 + C: "OP",2426741255120,2426744498736, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Bone001 + C: "OP",2426741256368,2426744498736, "Lcl Scaling" + + ;Model::Bone003, Model::Bone002 + C: "OO",2426744496544,2426744494352 + + ;NodeAttribute::, Model::Bone002 + C: "OO",2426741353520,2426744494352 + + ;AnimCurveNode::R, Model::Bone002 + C: "OP",2426741256784,2426744494352, "Lcl Rotation" + + ;Model::Bone004, Model::Bone003 + C: "OO",2426744483392,2426744496544 + + ;NodeAttribute::, Model::Bone003 + C: "OO",2426741354096,2426744496544 + + ;AnimCurveNode::R, Model::Bone003 + C: "OP",2426741257200,2426744496544, "Lcl Rotation" + + ;Model::Bone005, Model::Bone004 + C: "OO",2426744500928,2426744483392 + + ;NodeAttribute::, Model::Bone004 + C: "OO",2424735512176,2426744483392 + + ;AnimCurveNode::R, Model::Bone004 + C: "OP",2426741257408,2426744483392, "Lcl Rotation" + + ;NodeAttribute::, Model::Bone005 + C: "OO",2425779048240,2426744500928 + + ;Deformer::, Geometry:: + C: "OO",2425781325696,2426728793152 + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2426741283552,2426741256576, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2426741280832,2426741256576, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2426741282112,2426741256576, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426741285312,2426741255120, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426741288192,2426741255120, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426741288032,2426741255120, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2426741284032,2426741256368, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2426741285792,2426741256368, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2426741283072,2426741256368, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426741279552,2426741256784, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426741284992,2426741256784, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426741279712,2426741256784, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426741280512,2426741257200, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426741280992,2426741257200, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426741286752,2426741257200, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426741284352,2426741257408, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426741282592,2426741257408, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2426742197024,2426741257408, "d|Z" + + ;SubDeformer::, Deformer:: + C: "OO",2426259424096,2425781325696 + + ;SubDeformer::, Deformer:: + C: "OO",2426259427104,2425781325696 + + ;SubDeformer::, Deformer:: + C: "OO",2426259434624,2425781325696 + + ;SubDeformer::, Deformer:: + C: "OO",2426259427856,2425781325696 + + ;SubDeformer::, Deformer:: + C: "OO",2424740126464,2425781325696 + + ;Model::Bone001, SubDeformer:: + C: "OO",2426744498736,2426259424096 + + ;Model::Bone002, SubDeformer:: + C: "OO",2426744494352,2426259427104 + + ;Model::Bone003, SubDeformer:: + C: "OO",2426744496544,2426259434624 + + ;Model::Bone004, SubDeformer:: + C: "OO",2426744483392,2426259427856 + + ;Model::Bone005, SubDeformer:: + C: "OO",2426744500928,2424740126464 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,153953860000 + ReferenceTime: 0,153953860000 + } +} diff --git a/modules/ufbx/data/max_transformed_skin_7500_binary.fbx b/modules/ufbx/data/max_transformed_skin_7500_binary.fbx new file mode 100644 index 0000000..6f56c9d Binary files /dev/null and b/modules/ufbx/data/max_transformed_skin_7500_binary.fbx differ diff --git a/modules/ufbx/data/max_unicode_6100_ascii.fbx b/modules/ufbx/data/max_unicode_6100_ascii.fbx new file mode 100644 index 0000000..3c3c763 --- /dev/null +++ b/modules/ufbx/data/max_unicode_6100_ascii.fbx @@ -0,0 +1,290 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 5 + Day: 11 + Hour: 18 + Minute: 4 + Second: 58 + Millisecond: 868 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 3 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::aβカ😂", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "MaxHandle", "int", "UH",4 + Property: "Color", "ColorRGB", "N",0.0313725490196078,0.23921568627451,0.541176470588235 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -10.0000047683716,-10.0000047683716,0,10.0000047683716,-10.0000047683716,0,-10.0000047683716,10.0000047683716,0,10.0000047683716 + ,10.0000047683716,0,-10.0000047683716,-10.0000047683716,20.0000095367432,10.0000047683716,-10.0000047683716,20.0000095367432 + ,-10.0000047683716,10.0000047683716,20.0000095367432,10.0000047683716,10.0000047683716,20.0000095367432 + PolygonVertexIndex: 0,2,3,-2,4,5,7,-7,0,1,5,-5,1,3,7,-6,3,2,6,-8,2,0,4,-7 + Edges: 0,1,2,3,4,5,6,7,9,11,13,17 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0 + ,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "UVChannel_1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 1,0,0,0,1,1,0,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1 + UVIndex: 0,2,3,1,4,5,7,6,8,9,11,10,12,13,15,14,16,17,19,18,20,21,23,22 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::aβカ😂_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\max_unicode_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\max_unicode_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "3ds Max" + Property: "Original|ApplicationVersion", "KString", "", "2020" + Property: "Original|DateTime_GMT", "DateTime", "", "11/05/2022 15:04:58.867" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\max_unicode_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "3ds Max" + Property: "LastSaved|ApplicationVersion", "KString", "", "2020" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "11/05/2022 15:04:58.867" + Property: "Original|ApplicationActiveProject", "KString", "", "C:\Users\Datacube\Documents\3dsMax\Projects\galleria_oma" + + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",2 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",1 + Property: "FrontAxisSign", "int", "",-1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",2 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",2.54 + Property: "OriginalUnitScaleFactor", "double", "",2.54 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",6 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",0 + Property: "TimeSpanStop", "KTime", "",153953860000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::aβカ😂", "Model::Scene" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,153953860000 + ReferenceTime: 0,153953860000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "30" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 153953860000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/max_unicode_6100_binary.fbx b/modules/ufbx/data/max_unicode_6100_binary.fbx new file mode 100644 index 0000000..517b7e2 Binary files /dev/null and b/modules/ufbx/data/max_unicode_6100_binary.fbx differ diff --git a/modules/ufbx/data/max_unicode_7500_ascii.fbx b/modules/ufbx/data/max_unicode_7500_ascii.fbx new file mode 100644 index 0000000..c80af17 --- /dev/null +++ b/modules/ufbx/data/max_unicode_7500_ascii.fbx @@ -0,0 +1,323 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 5 + Day: 11 + Hour: 18 + Minute: 5 + Second: 51 + Millisecond: 241 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\max_unicode_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\max_unicode_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "3ds Max" + P: "Original|ApplicationVersion", "KString", "", "", "2020" + P: "Original|DateTime_GMT", "DateTime", "", "", "11/05/2022 15:05:51.238" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\max_unicode_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "3ds Max" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2020" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "11/05/2022 15:05:51.238" + P: "Original|ApplicationActiveProject", "KString", "", "", "C:\Users\Datacube\Documents\3dsMax\Projects\galleria_oma" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",2 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",1 + P: "FrontAxisSign", "int", "Integer", "",-1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",2 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",2.54 + P: "OriginalUnitScaleFactor", "double", "Number", "",2.54 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",6 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",153953860000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2401156086736, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 5 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2401035385792, "Geometry::", "Mesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.0313725490196078,0.23921568627451,0.541176470588235 + } + Vertices: *24 { + a: -10.0000047683716,-10.0000047683716,0,10.0000047683716,-10.0000047683716,0,-10.0000047683716,10.0000047683716,0,10.0000047683716,10.0000047683716,0,-10.0000047683716,-10.0000047683716,20.0000095367432,10.0000047683716,-10.0000047683716,20.0000095367432,-10.0000047683716,10.0000047683716,20.0000095367432,10.0000047683716,10.0000047683716,20.0000095367432 + } + PolygonVertexIndex: *24 { + a: 0,2,3,-2,4,5,7,-7,0,1,5,-5,1,3,7,-6,3,2,6,-8,2,0,4,-7 + } + Edges: *12 { + a: 0,1,2,3,4,5,6,7,9,11,13,17 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "UVChannel_1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *48 { + a: 1,0,0,0,1,1,0,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,1,1,1 + } + UVIndex: *24 { + a: 0,2,3,1,4,5,7,6,8,9,11,10,12,13,15,14,16,17,19,18,20,21,23,22 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2401557963936, "Model::aβカ😂", "Mesh" { + Version: 232 + Properties70: { + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "MaxHandle", "int", "Integer", "UH",4 + } + Shading: T + Culling: "CullingOff" + } + AnimationStack: 2402039242208, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",153953860000 + P: "ReferenceStop", "KTime", "Time", "",153953860000 + } + } + AnimationLayer: 2402043918496, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::aβカ😂, Model::RootNode + C: "OO",2401557963936,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2402043918496,2402039242208 + + ;Geometry::, Model::aβカ😂 + C: "OO",2401035385792,2401557963936 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,153953860000 + ReferenceTime: 0,153953860000 + } +} diff --git a/modules/ufbx/data/max_unicode_7500_binary.fbx b/modules/ufbx/data/max_unicode_7500_binary.fbx new file mode 100644 index 0000000..812568c Binary files /dev/null and b/modules/ufbx/data/max_unicode_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_anim_interpolation_6100_ascii.fbx b/modules/ufbx/data/maya_anim_interpolation_6100_ascii.fbx new file mode 100644 index 0000000..13289bd --- /dev/null +++ b/modules/ufbx/data/maya_anim_interpolation_6100_ascii.fbx @@ -0,0 +1,418 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2023 + Month: 1 + Day: 15 + Hour: 1 + Minute: 30 + Second: 8 + Millisecond: 942 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-14,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_anim_interpolation_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_anim_interpolation_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2023" + Property: "Original|DateTime_GMT", "DateTime", "", "14/01/2023 23:30:08.940" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_anim_interpolation_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2023" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "14/01/2023 23:30:08.940" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\animation_interpolation.mb" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",6 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",0 + Property: "TimeSpanStop", "KTime", "",4664801958000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,92372316000 + ReferenceTime: 0,92372316000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::pCube1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -14 + KeyVer: 4005 + KeyCount: 10 + Key: 0,0,U,s,-44.2699165344238,-43.9210891723633,a,0.202120214700699,0.205020502209663 + ,15395386000,-2,L,30790772000,-4,C,s,38488465000,-6,C,n,46186158000,-8,C,s,53883851000 + ,-10,L,61581544000,-12,C,n,69279237000,-14,C,s,76976930000,-16,C,n,84674623000,-14 + ,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "30" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 14253120000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_anim_interpolation_6100_binary.fbx b/modules/ufbx/data/maya_anim_interpolation_6100_binary.fbx new file mode 100644 index 0000000..146e89c Binary files /dev/null and b/modules/ufbx/data/maya_anim_interpolation_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_anim_interpolation_7700_ascii.fbx b/modules/ufbx/data/maya_anim_interpolation_7700_ascii.fbx new file mode 100644 index 0000000..46e9f8c --- /dev/null +++ b/modules/ufbx/data/maya_anim_interpolation_7700_ascii.fbx @@ -0,0 +1,488 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2023 + Month: 1 + Day: 15 + Hour: 1 + Minute: 29 + Second: 43 + Millisecond: 336 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_anim_interpolation_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_anim_interpolation_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "14/01/2023 23:29:43.335" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_anim_interpolation_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "14/01/2023 23:29:43.335" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\animation_interpolation.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",6 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",4664801958000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2089657499264, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 10 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurve" { + Count: 1 + } + ObjectType: "AnimationCurveNode" { + Count: 3 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2089642595488, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2092721204448, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-14,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2092379284128, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2092763622112, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",92372316000 + P: "ReferenceStop", "KTime", "Time", "",92372316000 + } + } + AnimationCurve: 2092758031616, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *10 { + a: 0,15395386000,30790772000,38488465000,46186158000,53883851000,61581544000,69279237000,76976930000,84674623000 + } + KeyValueFloat: *10 { + a: 0,-2,-4,-6,-8,-10,-12,-14,-16,-14 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Linear, Constant|ConstantStandard, Constant|ConstantNext, Constant|ConstantStandard, Linear, Constant|ConstantNext, Constant|ConstantStandard, Constant|ConstantNext, Cubic|TangeantUser + KeyAttrFlags: *10 { + a: 50332680,1028,2,258,2,1028,258,2,258,1032 + } + ;KeyAttrDataFloat: RightSlope:-44.2699, NextLeftSlope:-43.9211, RightWeight:0.20212, NextLeftWeight:0.205021, RightVelocity:0, NextLeftVelocity:0; RightSlope:-6, NextLeftSlope:-6, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:-12; RightSlope:0, NextLeftSlope:-12, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:-12, NextLeftSlope:-12, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:-12; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *40 { + a: -1036970907,-1037062350,134350821,0,-1061158912,-1061158912,218434821,0,0,0,218434821,0,0,-1052770304,218434821,0,0,-1052770304,218434821,0,-1052770304,-1052770304,218434821,0,0,-1052770304,218434821,0,0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *10 { + a: 1,1,1,1,1,1,1,1,1,1 + } + } + AnimationCurveNode: 2092763624192, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-14 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2092763622528, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2092763622944, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2093561911968, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2092721204448,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2093561911968,2092763622112 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2092763624192,2093561911968 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2092763622528,2093561911968 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2092763622944,2093561911968 + + ;Geometry::, Model::pCube1 + C: "OO",2089642595488,2092721204448 + + ;Material::lambert1, Model::pCube1 + C: "OO",2092379284128,2092721204448 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2092763624192,2092721204448, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2092763622944,2092721204448, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2092763622528,2092721204448, "Lcl Scaling" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2092758031616,2092763624192, "d|X" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,92372316000 + ReferenceTime: 0,92372316000 + } +} diff --git a/modules/ufbx/data/maya_anim_interpolation_7700_binary.fbx b/modules/ufbx/data/maya_anim_interpolation_7700_binary.fbx new file mode 100644 index 0000000..886da3d Binary files /dev/null and b/modules/ufbx/data/maya_anim_interpolation_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_anim_layer_quat_to_euler_7700_ascii.fbx b/modules/ufbx/data/maya_anim_layer_quat_to_euler_7700_ascii.fbx new file mode 100644 index 0000000..e01fbb6 --- /dev/null +++ b/modules/ufbx/data/maya_anim_layer_quat_to_euler_7700_ascii.fbx @@ -0,0 +1,552 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 7 + Day: 27 + Hour: 18 + Minute: 39 + Second: 37 + Millisecond: 969 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_anim_layer_quat_to_euler_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_anim_layer_quat_to_euler_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "27/07/2021 15:39:37.968" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_anim_layer_quat_to_euler_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "27/07/2021 15:39:37.968" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1870346995168, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 17 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 2 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 8 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 2 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1870354512576, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1869864976064, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",3 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-32.6201849698532,114.227574435624,-50.1459464864136 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1868724137296, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1870920567632, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 1870354821952, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 180 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1870354820992, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: -0,180 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 1870920568672, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 1870920568256, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 1870920567008, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1870920566800, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1870920566176, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1870920567424, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 1870920567216, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.6201849698532 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1870920566384, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",114.227574435624 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 1870607210048, "AnimLayer::BaseLayer", "" { + } + AnimationLayer: 1870607211872, "AnimLayer::AnimLayer1", "" { + Properties70: { + P: "Weight", "Number", "", "A",31.85185181 + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + P: "ScaleAccumulationMode", "enum", "", "",1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1869864976064,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1870607210048,1870920567632 + + ;AnimLayer::AnimLayer1, AnimStack::Take 001 + C: "OO",1870607211872,1870920567632 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",1870920568672,1870607210048 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1870920566800,1870607210048 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1870920567424,1870607210048 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1870920566384,1870607210048 + + ;Geometry::, Model::pCube1 + C: "OO",1870354512576,1869864976064 + + ;Material::lambert1, Model::pCube1 + C: "OO",1868724137296,1869864976064 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",1870920567008,1869864976064, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",1870920566800,1869864976064, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",1870920567216,1869864976064, "Lcl Rotation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",1870920566384,1869864976064, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",1870920566176,1869864976064, "Lcl Scaling" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",1870920567424,1869864976064, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",1870920568672,1869864976064, "Visibility" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",1870920568256,1869864976064, "Visibility" + + ;AnimCurveNode::Visibility, AnimLayer::AnimLayer1 + C: "OO",1870920568256,1870607211872 + + ;AnimCurveNode::T, AnimLayer::AnimLayer1 + C: "OO",1870920567008,1870607211872 + + ;AnimCurveNode::S, AnimLayer::AnimLayer1 + C: "OO",1870920566176,1870607211872 + + ;AnimCurveNode::R, AnimLayer::AnimLayer1 + C: "OO",1870920567216,1870607211872 + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1870354821952,1870920567216, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1870354820992,1870920566384, "d|Y" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_anim_layers_7500_ascii.fbx b/modules/ufbx/data/maya_anim_layers_7500_ascii.fbx new file mode 100644 index 0000000..cf09fff --- /dev/null +++ b/modules/ufbx/data/maya_anim_layers_7500_ascii.fbx @@ -0,0 +1,1027 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 8 + Hour: 20 + Minute: 0 + Second: 1 + Millisecond: 194 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_anim_layers_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_anim_layers_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "08/04/2020 17:00:01.191" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_anim_layers_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "08/04/2020 17:00:01.191" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\animation_layers.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2425763803584, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 38 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 3 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 13 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 17 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2425302025920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2425299435328, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",2,2,2 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2425735506160, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2425829828848, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2425217120608, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,100 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Cubic|TangeantUser + KeyAttrFlags: *2 { + a: 50332680,1032 + } + ;KeyAttrDataFloat: RightSlope:1.31541, NextLeftSlope:0.212543, RightWeight:0.562756, NextLeftWeight:0.829183, RightVelocity:0, NextLeftVelocity:0; RightSlope:0.212511, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 1067999030,1046062303,543364603,0,1046060188,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217126208, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217121728, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217127008, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216869248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216874848, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216877248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216878208, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425216878528, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216877728, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216878688, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0.2,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216882848, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216978048, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: -45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425216977728, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216985248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216978208, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216980768, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2425829827184, "AnimCurveNode::Weight", "" { + Properties70: { + P: "d|Weight", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829834048, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425829827392, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425829830304, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425829830512, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829835920, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829828640, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829837792, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",2 + P: "d|Y", "Number", "", "A",2 + P: "d|Z", "Number", "", "A",2 + } + } + AnimationCurveNode: 2425829829264, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",2 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",2 + } + } + AnimationCurveNode: 2425829833632, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2425829834464, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829834672, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829825728, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2425581321344, "AnimLayer::BaseLayer", "" { + } + AnimationLayer: 2425581317088, "AnimLayer::X", "" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + P: "RotationAccumulationMode", "enum", "", "",1 + P: "ScaleAccumulationMode", "enum", "", "",1 + } + } + AnimationLayer: 2425581322864, "AnimLayer::Y", "" { + Properties70: { + P: "Weight", "Number", "", "A+",0 + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + P: "RotationAccumulationMode", "enum", "", "",1 + P: "ScaleAccumulationMode", "enum", "", "",1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2425299435328,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2425581321344,2425829828848 + + ;AnimLayer::X, AnimStack::Take 001 + C: "OO",2425581317088,2425829828848 + + ;AnimLayer::Y, AnimStack::Take 001 + C: "OO",2425581322864,2425829828848 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2425829834048,2425581321344 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2425829828640,2425581321344 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2425829833632,2425581321344 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2425829825728,2425581321344 + + ;Geometry::, Model::pCube1 + C: "OO",2425302025920,2425299435328 + + ;Material::lambert1, Model::pCube1 + C: "OO",2425735506160,2425299435328 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425829830512,2425299435328, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425829835920,2425299435328, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425829828640,2425299435328, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425829834464,2425299435328, "Lcl Rotation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425829834672,2425299435328, "Lcl Rotation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425829825728,2425299435328, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425829837792,2425299435328, "Lcl Scaling" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425829829264,2425299435328, "Lcl Scaling" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425829833632,2425299435328, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425829834048,2425299435328, "Visibility" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425829827392,2425299435328, "Visibility" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425829830304,2425299435328, "Visibility" + + ;AnimCurveNode::Visibility, AnimLayer::X + C: "OO",2425829830304,2425581317088 + + ;AnimCurveNode::T, AnimLayer::X + C: "OO",2425829835920,2425581317088 + + ;AnimCurveNode::S, AnimLayer::X + C: "OO",2425829829264,2425581317088 + + ;AnimCurveNode::R, AnimLayer::X + C: "OO",2425829834672,2425581317088 + + ;AnimCurveNode::Weight, AnimLayer::Y + C: "OO",2425829827184,2425581322864 + + ;AnimCurveNode::Visibility, AnimLayer::Y + C: "OO",2425829827392,2425581322864 + + ;AnimCurveNode::T, AnimLayer::Y + C: "OO",2425829830512,2425581322864 + + ;AnimCurveNode::S, AnimLayer::Y + C: "OO",2425829837792,2425581322864 + + ;AnimCurveNode::R, AnimLayer::Y + C: "OO",2425829834464,2425581322864 + + ;AnimCurveNode::Weight, AnimLayer::Y + C: "OP",2425829827184,2425581322864, "Weight" + + ;AnimCurve::, AnimCurveNode::Weight + C: "OP",2425217120608,2425829827184, "d|Weight" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2425217126208,2425829827392, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217121728,2425829830512, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425216869248,2425829830512, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425216874848,2425829830512, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217127008,2425829835920, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425216877248,2425829835920, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425216878208,2425829837792, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425216877728,2425829837792, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425216878688,2425829837792, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425216878528,2425829829264, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425216882848,2425829829264, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216978048,2425829834464, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216985248,2425829834464, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216978208,2425829834464, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216977728,2425829834672, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216980768,2425829834672, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_anim_layers_7500_binary.fbx b/modules/ufbx/data/maya_anim_layers_7500_binary.fbx new file mode 100644 index 0000000..b86a9da Binary files /dev/null and b/modules/ufbx/data/maya_anim_layers_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_anim_layers_acc_7500_ascii.fbx b/modules/ufbx/data/maya_anim_layers_acc_7500_ascii.fbx new file mode 100644 index 0000000..3e78566 --- /dev/null +++ b/modules/ufbx/data/maya_anim_layers_acc_7500_ascii.fbx @@ -0,0 +1,1025 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 8 + Hour: 20 + Minute: 0 + Second: 44 + Millisecond: 622 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_anim_layers_7500_transform_acc_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_anim_layers_7500_transform_acc_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "08/04/2020 17:00:44.620" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_anim_layers_7500_transform_acc_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "08/04/2020 17:00:44.620" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\animation_layers.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2425763727808, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 38 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 3 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 13 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 17 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2425735210112, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2425299456208, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",2,2,2 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2425735494560, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2425831151568, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2425217118048, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,100 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Cubic|TangeantUser + KeyAttrFlags: *2 { + a: 50332680,1032 + } + ;KeyAttrDataFloat: RightSlope:1.31541, NextLeftSlope:0.212543, RightWeight:0.562756, NextLeftWeight:0.829183, RightVelocity:0, NextLeftVelocity:0; RightSlope:0.212511, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 1067999030,1046062303,543364603,0,1046060188,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217118208, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217118688, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217118848, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217119008, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217119648, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217126368, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217126848, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217121248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217120608, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217120768, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0.2,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217121728, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216872608, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: -45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425216875488, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216879648, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216876288, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216877728, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2425831138256, "AnimCurveNode::Weight", "" { + Properties70: { + P: "d|Weight", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829831552, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425829829264, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425829835296, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425829831344, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829826768, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829830304, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829829472, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",2 + P: "d|Y", "Number", "", "A",2 + P: "d|Z", "Number", "", "A",2 + } + } + AnimationCurveNode: 2425829836752, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",2 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",2 + } + } + AnimationCurveNode: 2425829833632, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2425829834048, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829830720, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425829826352, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2425581312224, "AnimLayer::BaseLayer", "" { + } + AnimationLayer: 2425581312832, "AnimLayer::X", "" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + P: "RotationAccumulationMode", "enum", "", "",1 + P: "ScaleAccumulationMode", "enum", "", "",1 + } + } + AnimationLayer: 2425581313136, "AnimLayer::Y", "" { + Properties70: { + P: "Weight", "Number", "", "A+",0 + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2425299456208,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2425581312224,2425831151568 + + ;AnimLayer::X, AnimStack::Take 001 + C: "OO",2425581312832,2425831151568 + + ;AnimLayer::Y, AnimStack::Take 001 + C: "OO",2425581313136,2425831151568 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2425829831552,2425581312224 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2425829830304,2425581312224 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2425829833632,2425581312224 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2425829826352,2425581312224 + + ;Geometry::, Model::pCube1 + C: "OO",2425735210112,2425299456208 + + ;Material::lambert1, Model::pCube1 + C: "OO",2425735494560,2425299456208 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425829831344,2425299456208, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425829826768,2425299456208, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425829830304,2425299456208, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425829834048,2425299456208, "Lcl Rotation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425829830720,2425299456208, "Lcl Rotation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425829826352,2425299456208, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425829829472,2425299456208, "Lcl Scaling" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425829836752,2425299456208, "Lcl Scaling" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425829833632,2425299456208, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425829831552,2425299456208, "Visibility" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425829829264,2425299456208, "Visibility" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425829835296,2425299456208, "Visibility" + + ;AnimCurveNode::Visibility, AnimLayer::X + C: "OO",2425829835296,2425581312832 + + ;AnimCurveNode::T, AnimLayer::X + C: "OO",2425829826768,2425581312832 + + ;AnimCurveNode::S, AnimLayer::X + C: "OO",2425829836752,2425581312832 + + ;AnimCurveNode::R, AnimLayer::X + C: "OO",2425829830720,2425581312832 + + ;AnimCurveNode::Weight, AnimLayer::Y + C: "OO",2425831138256,2425581313136 + + ;AnimCurveNode::Visibility, AnimLayer::Y + C: "OO",2425829829264,2425581313136 + + ;AnimCurveNode::T, AnimLayer::Y + C: "OO",2425829831344,2425581313136 + + ;AnimCurveNode::S, AnimLayer::Y + C: "OO",2425829829472,2425581313136 + + ;AnimCurveNode::R, AnimLayer::Y + C: "OO",2425829834048,2425581313136 + + ;AnimCurveNode::Weight, AnimLayer::Y + C: "OP",2425831138256,2425581313136, "Weight" + + ;AnimCurve::, AnimCurveNode::Weight + C: "OP",2425217118048,2425831138256, "d|Weight" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2425217118208,2425829829264, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217118688,2425829831344, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217119008,2425829831344, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217119648,2425829831344, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217118848,2425829826768, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217126368,2425829826768, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217126848,2425829829472, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217120608,2425829829472, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217120768,2425829829472, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217121248,2425829836752, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217121728,2425829836752, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216872608,2425829834048, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216879648,2425829834048, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216876288,2425829834048, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216875488,2425829830720, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216877728,2425829830720, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_anim_layers_acc_7500_binary.fbx b/modules/ufbx/data/maya_anim_layers_acc_7500_binary.fbx new file mode 100644 index 0000000..d37a1dd Binary files /dev/null and b/modules/ufbx/data/maya_anim_layers_acc_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_anim_layers_over_7500_ascii.fbx b/modules/ufbx/data/maya_anim_layers_over_7500_ascii.fbx new file mode 100644 index 0000000..c7fa7bb --- /dev/null +++ b/modules/ufbx/data/maya_anim_layers_over_7500_ascii.fbx @@ -0,0 +1,1028 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 8 + Hour: 20 + Minute: 4 + Second: 24 + Millisecond: 875 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_anim_layers_over_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_anim_layers_over_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "08/04/2020 17:04:24.873" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_anim_layers_over_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "08/04/2020 17:04:24.873" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\animation_layers.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2425763851456, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 38 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 3 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 13 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 17 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2425820584608, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2425299446928, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",2,2,2 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2425735506160, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2425833569328, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2425217113568, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,100 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Cubic|TangeantUser + KeyAttrFlags: *2 { + a: 50332680,1032 + } + ;KeyAttrDataFloat: RightSlope:1.31541, NextLeftSlope:0.212543, RightWeight:0.562756, NextLeftWeight:0.829183, RightVelocity:0, NextLeftVelocity:0; RightSlope:0.212511, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 1067999030,1046062303,543364603,0,1046060188,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217117568, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217119008, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217115648, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217115328, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217116608, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217118528, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217117088, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217118048, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217119488, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217117248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0.2,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217117728, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217117888, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: -45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217110688, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217120768, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216878688, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216982048, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2425833565792, "AnimCurveNode::Weight", "" { + Properties70: { + P: "d|Weight", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425833563088, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425833565584, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425833566000, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425833567664, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425833568288, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425833566208, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425833566416, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",2 + P: "d|Y", "Number", "", "A",2 + P: "d|Z", "Number", "", "A",2 + } + } + AnimationCurveNode: 2425833567248, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",2 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",2 + } + } + AnimationCurveNode: 2425833569952, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2425833567456, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425833570160, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425833570368, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2425581313136, "AnimLayer::BaseLayer", "" { + } + AnimationLayer: 2425581313440, "AnimLayer::X", "" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + P: "RotationAccumulationMode", "enum", "", "",1 + P: "ScaleAccumulationMode", "enum", "", "",1 + } + } + AnimationLayer: 2425581322560, "AnimLayer::Y", "" { + Properties70: { + P: "Weight", "Number", "", "A+",0 + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + P: "BlendMode", "enum", "", "",2 + P: "RotationAccumulationMode", "enum", "", "",1 + P: "ScaleAccumulationMode", "enum", "", "",1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2425299446928,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2425581313136,2425833569328 + + ;AnimLayer::X, AnimStack::Take 001 + C: "OO",2425581313440,2425833569328 + + ;AnimLayer::Y, AnimStack::Take 001 + C: "OO",2425581322560,2425833569328 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2425833563088,2425581313136 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2425833566208,2425581313136 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2425833569952,2425581313136 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2425833570368,2425581313136 + + ;Geometry::, Model::pCube1 + C: "OO",2425820584608,2425299446928 + + ;Material::lambert1, Model::pCube1 + C: "OO",2425735506160,2425299446928 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425833567664,2425299446928, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425833568288,2425299446928, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425833566208,2425299446928, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425833567456,2425299446928, "Lcl Rotation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425833570160,2425299446928, "Lcl Rotation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425833570368,2425299446928, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425833566416,2425299446928, "Lcl Scaling" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425833567248,2425299446928, "Lcl Scaling" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425833569952,2425299446928, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425833563088,2425299446928, "Visibility" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425833565584,2425299446928, "Visibility" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425833566000,2425299446928, "Visibility" + + ;AnimCurveNode::Visibility, AnimLayer::X + C: "OO",2425833566000,2425581313440 + + ;AnimCurveNode::T, AnimLayer::X + C: "OO",2425833568288,2425581313440 + + ;AnimCurveNode::S, AnimLayer::X + C: "OO",2425833567248,2425581313440 + + ;AnimCurveNode::R, AnimLayer::X + C: "OO",2425833570160,2425581313440 + + ;AnimCurveNode::Weight, AnimLayer::Y + C: "OO",2425833565792,2425581322560 + + ;AnimCurveNode::Visibility, AnimLayer::Y + C: "OO",2425833565584,2425581322560 + + ;AnimCurveNode::T, AnimLayer::Y + C: "OO",2425833567664,2425581322560 + + ;AnimCurveNode::S, AnimLayer::Y + C: "OO",2425833566416,2425581322560 + + ;AnimCurveNode::R, AnimLayer::Y + C: "OO",2425833567456,2425581322560 + + ;AnimCurveNode::Weight, AnimLayer::Y + C: "OP",2425833565792,2425581322560, "Weight" + + ;AnimCurve::, AnimCurveNode::Weight + C: "OP",2425217113568,2425833565792, "d|Weight" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2425217117568,2425833565584, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217119008,2425833567664, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217115328,2425833567664, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217116608,2425833567664, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217115648,2425833568288, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217118528,2425833568288, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217117088,2425833566416, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217119488,2425833566416, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217117248,2425833566416, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217118048,2425833567248, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217117728,2425833567248, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425217117888,2425833567456, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425217120768,2425833567456, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216878688,2425833567456, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425217110688,2425833570160, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216982048,2425833570160, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_anim_layers_over_7500_binary.fbx b/modules/ufbx/data/maya_anim_layers_over_7500_binary.fbx new file mode 100644 index 0000000..aa98dd0 Binary files /dev/null and b/modules/ufbx/data/maya_anim_layers_over_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_anim_layers_over_acc_7500_ascii.fbx b/modules/ufbx/data/maya_anim_layers_over_acc_7500_ascii.fbx new file mode 100644 index 0000000..ebb9cd7 --- /dev/null +++ b/modules/ufbx/data/maya_anim_layers_over_acc_7500_ascii.fbx @@ -0,0 +1,1026 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 8 + Hour: 20 + Minute: 5 + Second: 24 + Millisecond: 302 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_anim_layers_over_acc_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_anim_layers_over_acc_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "08/04/2020 17:05:24.300" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_anim_layers_over_acc_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "08/04/2020 17:05:24.300" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\animation_layers.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2425763730880, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 38 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 3 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 13 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 17 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2425302036672, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2425299463168, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",2,2,2 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2425735506160, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2425784486736, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2425217116288, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,100 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Cubic|TangeantUser + KeyAttrFlags: *2 { + a: 50332680,1032 + } + ;KeyAttrDataFloat: RightSlope:1.31541, NextLeftSlope:0.212543, RightWeight:0.562756, NextLeftWeight:0.829183, RightVelocity:0, NextLeftVelocity:0; RightSlope:0.212511, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 1067999030,1046062303,543364603,0,1046060188,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217116928, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217117568, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217117888, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217119488, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217119008, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217111328, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217126368, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425217120768, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217127008, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425217127168, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0.2,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216869248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216876768, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: -45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2425216875488, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216881568, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216877728, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2425216878528, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2425784487984, "AnimCurveNode::Weight", "" { + Properties70: { + P: "d|Weight", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425784490688, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425784485904, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425784486112, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2425784486528, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425784487360, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425784480704, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425784485280, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",2 + P: "d|Y", "Number", "", "A",2 + P: "d|Z", "Number", "", "A",2 + } + } + AnimationCurveNode: 2425784491728, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",2 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",2 + } + } + AnimationCurveNode: 2425784482576, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2425784488400, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425784482160, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2425784483616, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2425581322560, "AnimLayer::BaseLayer", "" { + } + AnimationLayer: 2425581324992, "AnimLayer::X", "" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + P: "RotationAccumulationMode", "enum", "", "",1 + P: "ScaleAccumulationMode", "enum", "", "",1 + } + } + AnimationLayer: 2425581319520, "AnimLayer::Y", "" { + Properties70: { + P: "Weight", "Number", "", "A+",0 + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + P: "BlendMode", "enum", "", "",2 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2425299463168,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2425581322560,2425784486736 + + ;AnimLayer::X, AnimStack::Take 001 + C: "OO",2425581324992,2425784486736 + + ;AnimLayer::Y, AnimStack::Take 001 + C: "OO",2425581319520,2425784486736 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2425784490688,2425581322560 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2425784480704,2425581322560 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2425784482576,2425581322560 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2425784483616,2425581322560 + + ;Geometry::, Model::pCube1 + C: "OO",2425302036672,2425299463168 + + ;Material::lambert1, Model::pCube1 + C: "OO",2425735506160,2425299463168 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425784486528,2425299463168, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425784487360,2425299463168, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2425784480704,2425299463168, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425784488400,2425299463168, "Lcl Rotation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425784482160,2425299463168, "Lcl Rotation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2425784483616,2425299463168, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425784485280,2425299463168, "Lcl Scaling" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425784491728,2425299463168, "Lcl Scaling" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2425784482576,2425299463168, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425784490688,2425299463168, "Visibility" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425784485904,2425299463168, "Visibility" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2425784486112,2425299463168, "Visibility" + + ;AnimCurveNode::Visibility, AnimLayer::X + C: "OO",2425784486112,2425581324992 + + ;AnimCurveNode::T, AnimLayer::X + C: "OO",2425784487360,2425581324992 + + ;AnimCurveNode::S, AnimLayer::X + C: "OO",2425784491728,2425581324992 + + ;AnimCurveNode::R, AnimLayer::X + C: "OO",2425784482160,2425581324992 + + ;AnimCurveNode::Weight, AnimLayer::Y + C: "OO",2425784487984,2425581319520 + + ;AnimCurveNode::Visibility, AnimLayer::Y + C: "OO",2425784485904,2425581319520 + + ;AnimCurveNode::T, AnimLayer::Y + C: "OO",2425784486528,2425581319520 + + ;AnimCurveNode::S, AnimLayer::Y + C: "OO",2425784485280,2425581319520 + + ;AnimCurveNode::R, AnimLayer::Y + C: "OO",2425784488400,2425581319520 + + ;AnimCurveNode::Weight, AnimLayer::Y + C: "OP",2425784487984,2425581319520, "Weight" + + ;AnimCurve::, AnimCurveNode::Weight + C: "OP",2425217116288,2425784487984, "d|Weight" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2425217116928,2425784485904, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217117568,2425784486528, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217119488,2425784486528, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217119008,2425784486528, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217117888,2425784487360, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2425217111328,2425784487360, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217126368,2425784485280, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217127008,2425784485280, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217127168,2425784485280, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425217120768,2425784491728, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2425216869248,2425784491728, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216876768,2425784488400, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216881568,2425784488400, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216877728,2425784488400, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216875488,2425784482160, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2425216878528,2425784482160, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_anim_layers_over_acc_7500_binary.fbx b/modules/ufbx/data/maya_anim_layers_over_acc_7500_binary.fbx new file mode 100644 index 0000000..a67dba9 Binary files /dev/null and b/modules/ufbx/data/maya_anim_layers_over_acc_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_anim_layers_over_acc_orders_18.obj b/modules/ufbx/data/maya_anim_layers_over_acc_orders_18.obj new file mode 100644 index 0000000..0e11b9d --- /dev/null +++ b/modules/ufbx/data/maya_anim_layers_over_acc_orders_18.obj @@ -0,0 +1,339 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_anim_layers_over_acc_orders_18.mtl +g default +v 3.462311 9.603509 5.517389 +v 3.511605 9.613827 4.507791 +v 0.061068 13.058423 5.386632 +v 0.110362 13.068741 4.377033 +v -3.393458 9.649859 5.183127 +v -3.344164 9.660178 4.173528 +v 0.007785 6.194946 5.313884 +v 0.057079 6.205264 4.304285 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.711201 0.701739 0.041897 +vn 0.711201 0.701739 0.041897 +vn 0.711201 0.701739 0.041897 +vn 0.711201 0.701739 0.041897 +vn -0.701295 0.712361 -0.026961 +vn -0.701295 0.712361 -0.026961 +vn -0.701295 0.712361 -0.026961 +vn -0.701295 0.712361 -0.026961 +vn -0.711201 -0.701739 -0.041897 +vn -0.711201 -0.701739 -0.041897 +vn -0.711201 -0.701739 -0.041897 +vn -0.711201 -0.701739 -0.041897 +vn 0.701295 -0.712361 0.026961 +vn 0.701295 -0.712361 0.026961 +vn 0.701295 -0.712361 0.026961 +vn 0.701295 -0.712361 0.026961 +vn 0.048765 0.010208 -0.998758 +vn 0.048765 0.010208 -0.998758 +vn 0.048765 0.010208 -0.998758 +vn 0.048765 0.010208 -0.998758 +vn -0.048765 -0.010208 0.998758 +vn -0.048765 -0.010208 0.998758 +vn -0.048765 -0.010208 0.998758 +vn -0.048765 -0.010208 0.998758 +s off +g XYZ +usemtl pCube1SG +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/5 4/4/6 6/6/7 5/5/8 +f 5/5/9 6/6/10 8/8/11 7/7/12 +f 7/7/13 8/8/14 2/10/15 1/9/16 +f 2/2/17 8/11/18 6/12/19 4/4/20 +f 7/13/21 1/1/22 3/3/23 5/14/24 +g default +v 2.905441 8.388087 6.389991 +v 2.954735 7.850429 5.535404 +v 1.911780 12.380044 3.821159 +v 1.961074 11.842386 2.966572 +v -2.836588 11.413258 4.155513 +v -2.787294 10.875599 3.300926 +v -1.842927 7.421301 6.724345 +v -1.793633 6.883643 5.869758 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.977571 0.199037 -0.068835 +vn 0.977571 0.199037 -0.068835 +vn 0.977571 0.199037 -0.068835 +vn 0.977571 0.199037 -0.068835 +vn -0.204881 0.823093 -0.529662 +vn -0.204881 0.823093 -0.529662 +vn -0.204881 0.823093 -0.529662 +vn -0.204881 0.823093 -0.529662 +vn -0.977571 -0.199037 0.068835 +vn -0.977571 -0.199037 0.068835 +vn -0.977571 -0.199037 0.068835 +vn -0.977571 -0.199037 0.068835 +vn 0.204881 -0.823093 0.529662 +vn 0.204881 -0.823093 0.529662 +vn 0.204881 -0.823093 0.529662 +vn 0.204881 -0.823093 0.529662 +vn 0.048765 -0.531885 -0.845411 +vn 0.048765 -0.531885 -0.845411 +vn 0.048765 -0.531885 -0.845411 +vn 0.048765 -0.531885 -0.845411 +vn -0.048765 0.531885 0.845411 +vn -0.048765 0.531885 0.845411 +vn -0.048765 0.531885 0.845411 +vn -0.048765 0.531885 0.845411 +s off +g YZX +usemtl pCube1SG +f 9/15/25 10/16/26 12/18/27 11/17/28 +f 11/17/29 12/18/30 14/20/31 13/19/32 +f 13/19/33 14/20/34 16/22/35 15/21/36 +f 15/21/37 16/22/38 10/24/39 9/23/40 +f 10/16/41 16/25/42 14/26/43 12/18/44 +f 15/27/45 9/15/46 11/17/47 13/28/48 +g default +v 3.437764 8.863030 5.011872 +v 3.375125 9.037191 4.018107 +v 0.822616 12.854987 5.876315 +v 0.759977 13.029148 4.882550 +v -3.256977 10.226496 5.672810 +v -3.319617 10.400656 4.679045 +v -0.641830 6.234539 4.808367 +v -0.704469 6.408700 3.814602 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.839887 0.541141 0.041897 +vn 0.839887 0.541141 0.041897 +vn 0.839887 0.541141 0.041897 +vn 0.839887 0.541141 0.041897 +vn -0.539212 0.823093 0.178238 +vn -0.539212 0.823093 0.178238 +vn -0.539212 0.823093 0.178238 +vn -0.539212 0.823093 0.178238 +vn -0.839887 -0.541141 -0.041897 +vn -0.839887 -0.541141 -0.041897 +vn -0.839887 -0.541141 -0.041897 +vn -0.839887 -0.541141 -0.041897 +vn 0.539212 -0.823093 -0.178238 +vn 0.539212 -0.823093 -0.178238 +vn 0.539212 -0.823093 -0.178238 +vn 0.539212 -0.823093 -0.178238 +vn -0.061967 0.172291 -0.983095 +vn -0.061967 0.172291 -0.983095 +vn -0.061967 0.172291 -0.983095 +vn -0.061967 0.172291 -0.983095 +vn 0.061967 -0.172291 0.983095 +vn 0.061967 -0.172291 0.983095 +vn 0.061967 -0.172291 0.983095 +vn 0.061967 -0.172291 0.983095 +s off +g ZXY +usemtl pCube1SG +f 17/29/49 18/30/50 20/32/51 19/31/52 +f 19/31/53 20/32/54 22/34/55 21/33/56 +f 21/33/57 22/34/58 24/36/59 23/35/60 +f 23/35/61 24/36/62 18/38/63 17/37/64 +f 18/30/65 24/39/66 22/40/67 20/32/68 +f 23/41/69 17/29/70 19/31/71 21/42/72 +g default +v 3.392247 8.818679 5.358328 +v 3.441541 9.025784 4.370147 +v 0.729370 12.810636 6.062134 +v 0.778664 13.017740 5.073952 +v -3.323394 10.237903 5.320770 +v -3.274100 10.445007 4.332589 +v -0.660516 6.245947 4.616965 +v -0.611222 6.453051 3.628783 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.834364 0.529662 0.152628 +vn 0.834364 0.529662 0.152628 +vn 0.834364 0.529662 0.152628 +vn 0.834364 0.529662 0.152628 +vn -0.549053 0.823093 0.145116 +vn -0.549053 0.823093 0.145116 +vn -0.549053 0.823093 0.145116 +vn -0.549053 0.823093 0.145116 +vn -0.834364 -0.529662 -0.152628 +vn -0.834364 -0.529662 -0.152628 +vn -0.834364 -0.529662 -0.152628 +vn -0.834364 -0.529662 -0.152628 +vn 0.549053 -0.823093 -0.145116 +vn 0.549053 -0.823093 -0.145116 +vn 0.549053 -0.823093 -0.145116 +vn 0.549053 -0.823093 -0.145116 +vn 0.048765 0.204881 -0.977571 +vn 0.048765 0.204881 -0.977571 +vn 0.048765 0.204881 -0.977571 +vn 0.048765 0.204881 -0.977571 +vn -0.048765 -0.204881 0.977571 +vn -0.048765 -0.204881 0.977571 +vn -0.048765 -0.204881 0.977571 +vn -0.048765 -0.204881 0.977571 +s off +g XZY +usemtl pCube1SG +f 25/43/73 26/44/74 28/46/75 27/45/76 +f 27/45/77 28/46/78 30/48/79 29/47/80 +f 29/47/81 30/48/82 32/50/83 31/49/84 +f 31/49/85 32/50/86 26/52/87 25/51/88 +f 26/44/89 32/53/90 30/54/91 28/46/92 +f 31/55/93 25/43/94 27/45/95 29/56/96 +g default +v 2.757029 8.459135 6.683966 +v 2.918257 7.934707 5.834962 +v 1.921428 12.451091 4.059460 +v 2.082656 11.926664 3.210456 +v -2.800109 11.328980 3.855955 +v -2.638882 10.804552 3.006951 +v -1.964509 7.337023 6.480461 +v -1.803281 6.812596 5.631457 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.972048 0.231015 0.041897 +vn 0.972048 0.231015 0.041897 +vn 0.972048 0.231015 0.041897 +vn 0.972048 0.231015 0.041897 +vn -0.172291 0.823093 -0.541141 +vn -0.172291 0.823093 -0.541141 +vn -0.172291 0.823093 -0.541141 +vn -0.172291 0.823093 -0.541141 +vn -0.972048 -0.231015 -0.041897 +vn -0.972048 -0.231015 -0.041897 +vn -0.972048 -0.231015 -0.041897 +vn -0.972048 -0.231015 -0.041897 +vn 0.172291 -0.823093 0.541141 +vn 0.172291 -0.823093 0.541141 +vn 0.172291 -0.823093 0.541141 +vn 0.172291 -0.823093 0.541141 +vn 0.159497 -0.518797 -0.839887 +vn 0.159497 -0.518797 -0.839887 +vn 0.159497 -0.518797 -0.839887 +vn 0.159497 -0.518797 -0.839887 +vn -0.159497 0.518797 0.839887 +vn -0.159497 0.518797 0.839887 +vn -0.159497 0.518797 0.839887 +vn -0.159497 0.518797 0.839887 +s off +g YXZ +usemtl pCube1SG +f 33/57/97 34/58/98 36/60/99 35/59/100 +f 35/59/101 36/60/102 38/62/103 37/61/104 +f 37/61/105 38/62/106 40/64/107 39/63/108 +f 39/63/109 40/64/110 34/66/111 33/65/112 +f 34/58/113 40/67/114 38/68/115 36/60/116 +f 39/69/117 33/57/118 35/59/119 37/70/120 +g default +v 2.484819 7.613114 6.285879 +v 2.534113 7.252529 5.342813 +v 2.435313 12.142114 4.551610 +v 2.484607 11.781528 3.608543 +v -2.415966 12.011158 4.348105 +v -2.366671 11.650573 3.405038 +v -2.366460 7.482158 6.082374 +v -2.317166 7.121573 5.139307 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.998758 0.026961 0.041897 +vn 0.998758 0.026961 0.041897 +vn 0.998758 0.026961 0.041897 +vn 0.998758 0.026961 0.041897 +vn -0.010208 0.933825 -0.357585 +vn -0.010208 0.933825 -0.357585 +vn -0.010208 0.933825 -0.357585 +vn -0.010208 0.933825 -0.357585 +vn -0.998758 -0.026961 -0.041897 +vn -0.998758 -0.026961 -0.041897 +vn -0.998758 -0.026961 -0.041897 +vn -0.998758 -0.026961 -0.041897 +vn 0.010208 -0.933825 0.357585 +vn 0.010208 -0.933825 0.357585 +vn 0.010208 -0.933825 0.357585 +vn 0.010208 -0.933825 0.357585 +vn 0.048765 -0.356714 -0.932940 +vn 0.048765 -0.356714 -0.932940 +vn 0.048765 -0.356714 -0.932940 +vn 0.048765 -0.356714 -0.932940 +vn -0.048765 0.356714 0.932940 +vn -0.048765 0.356714 0.932940 +vn -0.048765 0.356714 0.932940 +vn -0.048765 0.356714 0.932940 +s off +g ZYX +usemtl pCube1SG +f 41/71/121 42/72/122 44/74/123 43/73/124 +f 43/73/125 44/74/126 46/76/127 45/75/128 +f 45/75/129 46/76/130 48/78/131 47/77/132 +f 47/77/133 48/78/134 42/80/135 41/79/136 +f 42/72/137 48/81/138 46/82/139 44/74/140 +f 47/83/141 41/71/142 43/73/143 45/84/144 diff --git a/modules/ufbx/data/maya_anim_layers_over_acc_orders_7500_ascii.fbx b/modules/ufbx/data/maya_anim_layers_over_acc_orders_7500_ascii.fbx new file mode 100644 index 0000000..28d2c38 --- /dev/null +++ b/modules/ufbx/data/maya_anim_layers_over_acc_orders_7500_ascii.fbx @@ -0,0 +1,4077 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 7 + Day: 28 + Hour: 21 + Minute: 55 + Second: 10 + Millisecond: 387 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_anim_layers_ocer_acc_orders_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_anim_layers_ocer_acc_orders_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "28/07/2021 18:55:10.386" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_anim_layers_ocer_acc_orders_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "28/07/2021 18:55:10.386" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\anim_layer_orders.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2612802923648, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 188 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 3 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 6 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 6 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 73 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 97 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2612819104512, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,1,2,3,5,6,7,9,10,11,13,15 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2612819092032, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,1,2,3,5,6,7,9,10,11,13,15 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2612819090368, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,1,2,3,5,6,7,9,10,11,13,15 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2612819099104, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,1,2,3,5,6,7,9,10,11,13,15 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2612819114912, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,1,2,3,5,6,7,9,10,11,13,15 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2612819094112, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,1,2,3,5,6,7,9,10,11,13,15 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2612317187616, "Model::XYZ", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0.0590736544104594,9.63184338889031,4.84545852165039 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-32.7613629935531,87.144244449146,11.8225185640273 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",1.01085372347869,4.84994593852313,4.85731061426879 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2612317159776, "Model::YZX", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",2 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0.0590736544104594,9.63184338889031,4.84545852165039 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-32.7613629935531,87.144244449146,11.8225185640273 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",1.01085372347869,4.84994593852313,4.85731061426879 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2612317199216, "Model::ZXY", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",4 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0.0590736544104594,9.63184338889031,4.84545852165039 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-32.7613629935531,87.144244449146,11.8225185640273 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",1.01085372347869,4.84994593852313,4.85731061426879 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2612317217776, "Model::XZY", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",1 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0.0590736544104594,9.63184338889031,4.84545852165039 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-32.7613629935531,87.144244449146,11.8225185640273 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",1.01085372347869,4.84994593852313,4.85731061426879 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2612317210816, "Model::YXZ", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",3 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0.0590736544104594,9.63184338889031,4.84545852165039 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-32.7613629935531,87.144244449146,11.8225185640273 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",1.01085372347869,4.84994593852313,4.85731061426879 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2612317213136, "Model::ZYX", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",5 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0.0590736544104594,9.63184338889031,4.84545852165039 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-32.7613629935531,87.144244449146,11.8225185640273 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",1.01085372347869,4.84994593852313,4.85731061426879 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2612804542576, "Material::lambert2", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2612818002064, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2612206199088, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,100 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Cubic|TangeantUser + KeyAttrFlags: *2 { + a: 50332680,1032 + } + ;KeyAttrDataFloat: RightSlope:1.31541, NextLeftSlope:0.212543, RightWeight:0.562756, NextLeftWeight:0.829183, RightVelocity:0, NextLeftVelocity:0; RightSlope:0.212543, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 1067999030,1046062303,543364603,0,1046062303,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206199888, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2612206202128, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2612206199248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206201168, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206198928, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206195888, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206201808, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2612206199568, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206199408, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206200208, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0.2,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206200368, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206200688, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: -45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2612206200048, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206202608, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206201488, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206201648, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206200528, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2612206164368, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2612206201008, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206164528, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2611872654448, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2611872658448, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2611872659408, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2611872649488, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2611872663408, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2611872680688, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0.2,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2611872681008, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2611872681168, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: -45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2612111515248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612111491408, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612111492368, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612802467920, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206200848, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2612206159408, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2612206201968, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206202288, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206202448, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206139248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612802459120, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2612802468240, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2612206163728, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2611872659248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0.2,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654071072, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654065472, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: -45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654072032, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654065632, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654070112, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654071232, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654064832, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654065792, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654071712, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654064192, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654065312, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654072672, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654068352, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654065952, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654071552, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654064352, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0.2,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654066752, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654063072, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: -45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654072192, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654069632, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654071872, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654072352, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654068832, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654072832, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654064512, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654070752, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654069792, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654066112, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654068032, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654066272, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654069952, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654066912, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0.2,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654067712, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654067072, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: -45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654067232, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654070272, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654063872, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654066432, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654064032, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654064672, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654071392, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654072512, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654069312, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654066592, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654070432, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654068512, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654069152, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654067392, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0.2,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654067552, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 1,5 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654064992, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 38488465000 + } + KeyValueFloat: *1 { + a: -45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2613654069472, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654073152, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,90 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654072992, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2613654070912, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,38488465000 + } + KeyValueFloat: *2 { + a: 0,45 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2612817996032, "AnimCurveNode::Weight", "" { + Properties70: { + P: "d|Weight", "Number", "", "A",99.3904224528338 + } + } + AnimationCurveNode: 2612817995824, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2612817996448, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2612817997904, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2612817998320, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",9.63184338889031 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2612817998736, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2612817999776, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2612818001440, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",4.84994593852313 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2613647888848, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2613647886768, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2613647892384, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",87.144244449146 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2613647883440, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2613647887392, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2613647894464, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2613641666416, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2613641667248, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2613641661424, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",9.63184338889031 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2613641662880, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2613641665168, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2613641664336, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",4.84994593852313 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2613641664960, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2612822593248, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2612822589712, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",87.144244449146 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2612822591168, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2612822589920, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2612822591792, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2612822590128, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2612822590336, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2613643395744, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",9.63184338889031 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2613643394288, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2613643392624, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2613643392416, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",4.84994593852313 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2613643392832, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2613643393248, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2613643394704, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",87.144244449146 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2612803550272, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2612803549648, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2612803549856, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2612803550064, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2612803550480, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2613643365328, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",9.63184338889031 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2613643364912, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2613643365120, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2613647698768, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",4.84994593852313 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2613647704800, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2613642816112, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2613642817360, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",87.144244449146 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2613647895504, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2612391398752, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2613643428352, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2613657383696, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2613657394720, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2613657388272, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",9.63184338889031 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2613657387856, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2613657389104, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2613657385152, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",4.84994593852313 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2613657384320, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2613657387024, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2613657392224, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",87.144244449146 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2613657386400, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2613657395552, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2613657394928, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2613657395136, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2613657385360, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2613657390976, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",9.63184338889031 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2613657395344, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.0590736544104594 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",4.84545852165039 + } + } + AnimationCurveNode: 2613657384112, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2613657387648, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",4.84994593852313 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2613657395760, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.01085372347869 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",4.85731061426879 + } + } + AnimationCurveNode: 2613657384528, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2613657395968, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",87.144244449146 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2613657384736, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-32.7613629935531 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",11.8225185640273 + } + } + AnimationCurveNode: 2613657384944, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2613649081856, "AnimLayer::BaseLayer", "" { + } + AnimationLayer: 2613649070912, "AnimLayer::X", "" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + P: "RotationAccumulationMode", "enum", "", "",1 + P: "ScaleAccumulationMode", "enum", "", "",1 + } + } + AnimationLayer: 2613649096448, "AnimLayer::Y", "" { + Properties70: { + P: "Weight", "Number", "", "A+",99.3904224528338 + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + P: "BlendMode", "enum", "", "",2 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::XYZ, Model::RootNode + C: "OO",2612317187616,0 + + ;Model::YZX, Model::RootNode + C: "OO",2612317159776,0 + + ;Model::ZXY, Model::RootNode + C: "OO",2612317199216,0 + + ;Model::XZY, Model::RootNode + C: "OO",2612317217776,0 + + ;Model::YXZ, Model::RootNode + C: "OO",2612317210816,0 + + ;Model::ZYX, Model::RootNode + C: "OO",2612317213136,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2613649081856,2612818002064 + + ;AnimLayer::X, AnimStack::Take 001 + C: "OO",2613649070912,2612818002064 + + ;AnimLayer::Y, AnimStack::Take 001 + C: "OO",2613649096448,2612818002064 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2612817995824,2613649081856 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2612817999776,2613649081856 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2613647886768,2613649081856 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2613647887392,2613649081856 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2613647894464,2613649081856 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2613641665168,2613649081856 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2612822593248,2613649081856 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2612822589920,2613649081856 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2612822591792,2613649081856 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2613643392624,2613649081856 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2613643393248,2613649081856 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2612803549648,2613649081856 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2612803549856,2613649081856 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2613643365120,2613649081856 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2613642816112,2613649081856 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2612391398752,2613649081856 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2613643428352,2613649081856 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2613657389104,2613649081856 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2613657387024,2613649081856 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2613657395552,2613649081856 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2613657394928,2613649081856 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2613657384112,2613649081856 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2613657384528,2613649081856 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2613657384944,2613649081856 + + ;Geometry::, Model::XYZ + C: "OO",2612819104512,2612317187616 + + ;Material::lambert2, Model::XYZ + C: "OO",2612804542576,2612317187616 + + ;AnimCurveNode::T, Model::XYZ + C: "OP",2612817998320,2612317187616, "Lcl Translation" + + ;AnimCurveNode::T, Model::XYZ + C: "OP",2612817998736,2612317187616, "Lcl Translation" + + ;AnimCurveNode::T, Model::XYZ + C: "OP",2612817999776,2612317187616, "Lcl Translation" + + ;AnimCurveNode::R, Model::XYZ + C: "OP",2613647892384,2612317187616, "Lcl Rotation" + + ;AnimCurveNode::R, Model::XYZ + C: "OP",2613647883440,2612317187616, "Lcl Rotation" + + ;AnimCurveNode::R, Model::XYZ + C: "OP",2613647887392,2612317187616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::XYZ + C: "OP",2612818001440,2612317187616, "Lcl Scaling" + + ;AnimCurveNode::S, Model::XYZ + C: "OP",2613647888848,2612317187616, "Lcl Scaling" + + ;AnimCurveNode::S, Model::XYZ + C: "OP",2613647886768,2612317187616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::XYZ + C: "OP",2612817995824,2612317187616, "Visibility" + + ;AnimCurveNode::Visibility, Model::XYZ + C: "OP",2612817996448,2612317187616, "Visibility" + + ;AnimCurveNode::Visibility, Model::XYZ + C: "OP",2612817997904,2612317187616, "Visibility" + + ;Geometry::, Model::YZX + C: "OO",2612819092032,2612317159776 + + ;Material::lambert2, Model::YZX + C: "OO",2612804542576,2612317159776 + + ;AnimCurveNode::T, Model::YZX + C: "OP",2613641661424,2612317159776, "Lcl Translation" + + ;AnimCurveNode::T, Model::YZX + C: "OP",2613641662880,2612317159776, "Lcl Translation" + + ;AnimCurveNode::T, Model::YZX + C: "OP",2613641665168,2612317159776, "Lcl Translation" + + ;AnimCurveNode::R, Model::YZX + C: "OP",2612822589712,2612317159776, "Lcl Rotation" + + ;AnimCurveNode::R, Model::YZX + C: "OP",2612822591168,2612317159776, "Lcl Rotation" + + ;AnimCurveNode::R, Model::YZX + C: "OP",2612822589920,2612317159776, "Lcl Rotation" + + ;AnimCurveNode::S, Model::YZX + C: "OP",2613641664336,2612317159776, "Lcl Scaling" + + ;AnimCurveNode::S, Model::YZX + C: "OP",2613641664960,2612317159776, "Lcl Scaling" + + ;AnimCurveNode::S, Model::YZX + C: "OP",2612822593248,2612317159776, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::YZX + C: "OP",2613647894464,2612317159776, "Visibility" + + ;AnimCurveNode::Visibility, Model::YZX + C: "OP",2613641666416,2612317159776, "Visibility" + + ;AnimCurveNode::Visibility, Model::YZX + C: "OP",2613641667248,2612317159776, "Visibility" + + ;Geometry::, Model::ZXY + C: "OO",2612819090368,2612317199216 + + ;Material::lambert2, Model::ZXY + C: "OO",2612804542576,2612317199216 + + ;AnimCurveNode::T, Model::ZXY + C: "OP",2613643395744,2612317199216, "Lcl Translation" + + ;AnimCurveNode::T, Model::ZXY + C: "OP",2613643394288,2612317199216, "Lcl Translation" + + ;AnimCurveNode::T, Model::ZXY + C: "OP",2613643392624,2612317199216, "Lcl Translation" + + ;AnimCurveNode::R, Model::ZXY + C: "OP",2613643394704,2612317199216, "Lcl Rotation" + + ;AnimCurveNode::R, Model::ZXY + C: "OP",2612803550272,2612317199216, "Lcl Rotation" + + ;AnimCurveNode::R, Model::ZXY + C: "OP",2612803549648,2612317199216, "Lcl Rotation" + + ;AnimCurveNode::S, Model::ZXY + C: "OP",2613643392416,2612317199216, "Lcl Scaling" + + ;AnimCurveNode::S, Model::ZXY + C: "OP",2613643392832,2612317199216, "Lcl Scaling" + + ;AnimCurveNode::S, Model::ZXY + C: "OP",2613643393248,2612317199216, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::ZXY + C: "OP",2612822591792,2612317199216, "Visibility" + + ;AnimCurveNode::Visibility, Model::ZXY + C: "OP",2612822590128,2612317199216, "Visibility" + + ;AnimCurveNode::Visibility, Model::ZXY + C: "OP",2612822590336,2612317199216, "Visibility" + + ;Geometry::, Model::XZY + C: "OO",2612819099104,2612317217776 + + ;Material::lambert2, Model::XZY + C: "OO",2612804542576,2612317217776 + + ;AnimCurveNode::T, Model::XZY + C: "OP",2613643365328,2612317217776, "Lcl Translation" + + ;AnimCurveNode::T, Model::XZY + C: "OP",2613643364912,2612317217776, "Lcl Translation" + + ;AnimCurveNode::T, Model::XZY + C: "OP",2613643365120,2612317217776, "Lcl Translation" + + ;AnimCurveNode::R, Model::XZY + C: "OP",2613642817360,2612317217776, "Lcl Rotation" + + ;AnimCurveNode::R, Model::XZY + C: "OP",2613647895504,2612317217776, "Lcl Rotation" + + ;AnimCurveNode::R, Model::XZY + C: "OP",2612391398752,2612317217776, "Lcl Rotation" + + ;AnimCurveNode::S, Model::XZY + C: "OP",2613647698768,2612317217776, "Lcl Scaling" + + ;AnimCurveNode::S, Model::XZY + C: "OP",2613647704800,2612317217776, "Lcl Scaling" + + ;AnimCurveNode::S, Model::XZY + C: "OP",2613642816112,2612317217776, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::XZY + C: "OP",2612803549856,2612317217776, "Visibility" + + ;AnimCurveNode::Visibility, Model::XZY + C: "OP",2612803550064,2612317217776, "Visibility" + + ;AnimCurveNode::Visibility, Model::XZY + C: "OP",2612803550480,2612317217776, "Visibility" + + ;Geometry::, Model::YXZ + C: "OO",2612819114912,2612317210816 + + ;Material::lambert2, Model::YXZ + C: "OO",2612804542576,2612317210816 + + ;AnimCurveNode::T, Model::YXZ + C: "OP",2613657388272,2612317210816, "Lcl Translation" + + ;AnimCurveNode::T, Model::YXZ + C: "OP",2613657387856,2612317210816, "Lcl Translation" + + ;AnimCurveNode::T, Model::YXZ + C: "OP",2613657389104,2612317210816, "Lcl Translation" + + ;AnimCurveNode::R, Model::YXZ + C: "OP",2613657392224,2612317210816, "Lcl Rotation" + + ;AnimCurveNode::R, Model::YXZ + C: "OP",2613657386400,2612317210816, "Lcl Rotation" + + ;AnimCurveNode::R, Model::YXZ + C: "OP",2613657395552,2612317210816, "Lcl Rotation" + + ;AnimCurveNode::S, Model::YXZ + C: "OP",2613657385152,2612317210816, "Lcl Scaling" + + ;AnimCurveNode::S, Model::YXZ + C: "OP",2613657384320,2612317210816, "Lcl Scaling" + + ;AnimCurveNode::S, Model::YXZ + C: "OP",2613657387024,2612317210816, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::YXZ + C: "OP",2613643428352,2612317210816, "Visibility" + + ;AnimCurveNode::Visibility, Model::YXZ + C: "OP",2613657383696,2612317210816, "Visibility" + + ;AnimCurveNode::Visibility, Model::YXZ + C: "OP",2613657394720,2612317210816, "Visibility" + + ;Geometry::, Model::ZYX + C: "OO",2612819094112,2612317213136 + + ;Material::lambert2, Model::ZYX + C: "OO",2612804542576,2612317213136 + + ;AnimCurveNode::T, Model::ZYX + C: "OP",2613657390976,2612317213136, "Lcl Translation" + + ;AnimCurveNode::T, Model::ZYX + C: "OP",2613657395344,2612317213136, "Lcl Translation" + + ;AnimCurveNode::T, Model::ZYX + C: "OP",2613657384112,2612317213136, "Lcl Translation" + + ;AnimCurveNode::R, Model::ZYX + C: "OP",2613657395968,2612317213136, "Lcl Rotation" + + ;AnimCurveNode::R, Model::ZYX + C: "OP",2613657384736,2612317213136, "Lcl Rotation" + + ;AnimCurveNode::R, Model::ZYX + C: "OP",2613657384944,2612317213136, "Lcl Rotation" + + ;AnimCurveNode::S, Model::ZYX + C: "OP",2613657387648,2612317213136, "Lcl Scaling" + + ;AnimCurveNode::S, Model::ZYX + C: "OP",2613657395760,2612317213136, "Lcl Scaling" + + ;AnimCurveNode::S, Model::ZYX + C: "OP",2613657384528,2612317213136, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::ZYX + C: "OP",2613657394928,2612317213136, "Visibility" + + ;AnimCurveNode::Visibility, Model::ZYX + C: "OP",2613657395136,2612317213136, "Visibility" + + ;AnimCurveNode::Visibility, Model::ZYX + C: "OP",2613657385360,2612317213136, "Visibility" + + ;AnimCurveNode::Visibility, AnimLayer::X + C: "OO",2612817997904,2613649070912 + + ;AnimCurveNode::T, AnimLayer::X + C: "OO",2612817998736,2613649070912 + + ;AnimCurveNode::S, AnimLayer::X + C: "OO",2613647888848,2613649070912 + + ;AnimCurveNode::R, AnimLayer::X + C: "OO",2613647883440,2613649070912 + + ;AnimCurveNode::Visibility, AnimLayer::X + C: "OO",2613641667248,2613649070912 + + ;AnimCurveNode::T, AnimLayer::X + C: "OO",2613641662880,2613649070912 + + ;AnimCurveNode::S, AnimLayer::X + C: "OO",2613641664960,2613649070912 + + ;AnimCurveNode::R, AnimLayer::X + C: "OO",2612822591168,2613649070912 + + ;AnimCurveNode::Visibility, AnimLayer::X + C: "OO",2612822590336,2613649070912 + + ;AnimCurveNode::T, AnimLayer::X + C: "OO",2613643394288,2613649070912 + + ;AnimCurveNode::S, AnimLayer::X + C: "OO",2613643392832,2613649070912 + + ;AnimCurveNode::R, AnimLayer::X + C: "OO",2612803550272,2613649070912 + + ;AnimCurveNode::Visibility, AnimLayer::X + C: "OO",2612803550480,2613649070912 + + ;AnimCurveNode::T, AnimLayer::X + C: "OO",2613643364912,2613649070912 + + ;AnimCurveNode::S, AnimLayer::X + C: "OO",2613647704800,2613649070912 + + ;AnimCurveNode::R, AnimLayer::X + C: "OO",2613647895504,2613649070912 + + ;AnimCurveNode::Visibility, AnimLayer::X + C: "OO",2613657394720,2613649070912 + + ;AnimCurveNode::T, AnimLayer::X + C: "OO",2613657387856,2613649070912 + + ;AnimCurveNode::S, AnimLayer::X + C: "OO",2613657384320,2613649070912 + + ;AnimCurveNode::R, AnimLayer::X + C: "OO",2613657386400,2613649070912 + + ;AnimCurveNode::Visibility, AnimLayer::X + C: "OO",2613657385360,2613649070912 + + ;AnimCurveNode::T, AnimLayer::X + C: "OO",2613657395344,2613649070912 + + ;AnimCurveNode::S, AnimLayer::X + C: "OO",2613657395760,2613649070912 + + ;AnimCurveNode::R, AnimLayer::X + C: "OO",2613657384736,2613649070912 + + ;AnimCurveNode::Weight, AnimLayer::Y + C: "OO",2612817996032,2613649096448 + + ;AnimCurveNode::Visibility, AnimLayer::Y + C: "OO",2612817996448,2613649096448 + + ;AnimCurveNode::T, AnimLayer::Y + C: "OO",2612817998320,2613649096448 + + ;AnimCurveNode::S, AnimLayer::Y + C: "OO",2612818001440,2613649096448 + + ;AnimCurveNode::R, AnimLayer::Y + C: "OO",2613647892384,2613649096448 + + ;AnimCurveNode::Visibility, AnimLayer::Y + C: "OO",2613641666416,2613649096448 + + ;AnimCurveNode::T, AnimLayer::Y + C: "OO",2613641661424,2613649096448 + + ;AnimCurveNode::S, AnimLayer::Y + C: "OO",2613641664336,2613649096448 + + ;AnimCurveNode::R, AnimLayer::Y + C: "OO",2612822589712,2613649096448 + + ;AnimCurveNode::Visibility, AnimLayer::Y + C: "OO",2612822590128,2613649096448 + + ;AnimCurveNode::T, AnimLayer::Y + C: "OO",2613643395744,2613649096448 + + ;AnimCurveNode::S, AnimLayer::Y + C: "OO",2613643392416,2613649096448 + + ;AnimCurveNode::R, AnimLayer::Y + C: "OO",2613643394704,2613649096448 + + ;AnimCurveNode::Visibility, AnimLayer::Y + C: "OO",2612803550064,2613649096448 + + ;AnimCurveNode::T, AnimLayer::Y + C: "OO",2613643365328,2613649096448 + + ;AnimCurveNode::S, AnimLayer::Y + C: "OO",2613647698768,2613649096448 + + ;AnimCurveNode::R, AnimLayer::Y + C: "OO",2613642817360,2613649096448 + + ;AnimCurveNode::Visibility, AnimLayer::Y + C: "OO",2613657383696,2613649096448 + + ;AnimCurveNode::T, AnimLayer::Y + C: "OO",2613657388272,2613649096448 + + ;AnimCurveNode::S, AnimLayer::Y + C: "OO",2613657385152,2613649096448 + + ;AnimCurveNode::R, AnimLayer::Y + C: "OO",2613657392224,2613649096448 + + ;AnimCurveNode::Visibility, AnimLayer::Y + C: "OO",2613657395136,2613649096448 + + ;AnimCurveNode::T, AnimLayer::Y + C: "OO",2613657390976,2613649096448 + + ;AnimCurveNode::S, AnimLayer::Y + C: "OO",2613657387648,2613649096448 + + ;AnimCurveNode::R, AnimLayer::Y + C: "OO",2613657395968,2613649096448 + + ;AnimCurveNode::Weight, AnimLayer::Y + C: "OP",2612817996032,2613649096448, "Weight" + + ;AnimCurve::, AnimCurveNode::Weight + C: "OP",2612206199088,2612817996032, "d|Weight" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2612206199888,2612817996448, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206202128,2612817998320, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206201168,2612817998320, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206198928,2612817998320, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206199248,2612817998736, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206195888,2612817998736, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2612206201808,2612818001440, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2612206199408,2612818001440, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2612206200208,2612818001440, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2612206199568,2613647888848, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2612206200368,2613647888848, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2612206200688,2613647892384, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2612206202608,2613647892384, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2612206201488,2613647892384, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2612206200048,2613647883440, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2612206201648,2613647883440, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2612206200528,2613641666416, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206164368,2613641661424, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206164528,2613641661424, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2611872654448,2613641661424, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206201008,2613641662880, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2611872658448,2613641662880, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2611872659408,2613641664336, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2611872663408,2613641664336, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2611872680688,2613641664336, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2611872649488,2613641664960, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2611872681008,2613641664960, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2611872681168,2612822589712, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2612111491408,2612822589712, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2612111492368,2612822589712, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2612111515248,2612822591168, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2612802467920,2612822591168, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2612206200848,2612822590128, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206159408,2613643395744, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206202288,2613643395744, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206202448,2613643395744, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206201968,2613643394288, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2612206139248,2613643394288, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2612802459120,2613643392416, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2612206163728,2613643392416, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2611872659248,2613643392416, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2612802468240,2613643392832, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654071072,2613643392832, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654065472,2613643394704, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654065632,2613643394704, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654070112,2613643394704, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654072032,2612803550272, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654071232,2612803550272, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2613654064832,2612803550064, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654065792,2613643365328, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654064192,2613643365328, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654065312,2613643365328, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654071712,2613643364912, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654072672,2613643364912, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654068352,2613647698768, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654071552,2613647698768, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654064352,2613647698768, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654065952,2613647704800, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654066752,2613647704800, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654063072,2613642817360, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654069632,2613642817360, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654071872,2613642817360, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654072192,2613647895504, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654072352,2613647895504, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2613654068832,2613657383696, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654072832,2613657388272, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654070752,2613657388272, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654069792,2613657388272, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654064512,2613657387856, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654066112,2613657387856, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654068032,2613657385152, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654069952,2613657385152, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654066912,2613657385152, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654066272,2613657384320, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654067712,2613657384320, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654067072,2613657392224, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654070272,2613657392224, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654063872,2613657392224, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654067232,2613657386400, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654066432,2613657386400, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2613654064032,2613657395136, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654064672,2613657390976, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654072512,2613657390976, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654069312,2613657390976, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654071392,2613657395344, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2613654066592,2613657395344, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654070432,2613657387648, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654069152,2613657387648, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654067392,2613657387648, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654068512,2613657395760, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2613654067552,2613657395760, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654064992,2613657395968, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654073152,2613657395968, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654072992,2613657395968, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654069472,2613657384736, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2613654070912,2613657384736, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_anim_layers_over_acc_orders_7500_binary.fbx b/modules/ufbx/data/maya_anim_layers_over_acc_orders_7500_binary.fbx new file mode 100644 index 0000000..6b81f8f Binary files /dev/null and b/modules/ufbx/data/maya_anim_layers_over_acc_orders_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_anim_light_6100_ascii.fbx b/modules/ufbx/data/maya_anim_light_6100_ascii.fbx new file mode 100644 index 0000000..427193c --- /dev/null +++ b/modules/ufbx/data/maya_anim_light_6100_ascii.fbx @@ -0,0 +1,363 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 22 + Hour: 13 + Minute: 20 + Second: 20 + Millisecond: 453 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 3 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pointLight1", "Light" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "Color", "A+N",0.148112133145332,0.0950400084257126,0.439999997615814 + Property: "LightType", "enum", "N",0 + Property: "CastLightOnObject", "bool", "N",1 + Property: "DrawVolumetricLight", "bool", "N",1 + Property: "DrawGroundProjection", "bool", "N",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "N",0 + Property: "Intensity", "Number", "A+N",307.228912353516 + Property: "Fog", "Number", "AN",50 + Property: "DecayType", "enum", "N",0 + Property: "DecayStart", "Number", "AN",0 + Property: "FileName", "KString", "N", "" + Property: "EnableNearAttenuation", "bool", "N",0 + Property: "NearAttenuationStart", "Number", "AN",0 + Property: "NearAttenuationEnd", "Number", "AN",0 + Property: "EnableFarAttenuation", "bool", "N",0 + Property: "FarAttenuationStart", "Number", "AN",0 + Property: "FarAttenuationEnd", "Number", "AN",0 + Property: "CastShadows", "bool", "N",1 + Property: "ShadowColor", "Color", "AN",0,0,0 + Property: "HotSpot", "Number", "AN",0 + Property: "Cone angle", "Number", "AN",45 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Light" + GeometryVersion: 124 + NodeAttributeName: "NodeAttribute::pointLight1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_anim_light_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_anim_light_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "22/03/2020 11:20:20.452" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_anim_light_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "22/03/2020 11:20:20.452" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\maya_anim_light.mb" + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",115465395000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pointLight1", "Model::Scene" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,115465395000 + ReferenceTime: 1924423250,115465395000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::pointLight1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Color" { + Channel: "X" { + Default: 0.148112133145332 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0.148112133145332,U,s,0,0,n,57732697500,0.00430000014603138,U,s,0,0,n,115465395000 + ,0.44200000166893,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0.0950400084257126 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0.0950400084257126,U,s,0,0,n,57732697500,0.221799999475479,U,s,0,0,n,115465395000 + ,0.118897996842861,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0.439999997615814 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0.439999997615814,U,s,0,0,n,57732697500,0.112999998033047,U,s,0,0,n,115465395000,0.118897996842861 + ,U,s,0,0,n + Color: 1,1,1 + } + } + Channel: "Intensity" { + Default: 307.228912353516 + KeyVer: 4005 + KeyCount: 4 + Key: 1924423250,307.228912353516,U,s,0,0,n,32715195250,120.48193359375,U,s,0,0,n,78901353250,481.927734375 + ,U,s,0,0,n,115465395000,114.457832336426,U,s,0,0,n + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 115465395000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_anim_light_6100_binary.fbx b/modules/ufbx/data/maya_anim_light_6100_binary.fbx new file mode 100644 index 0000000..727eefe Binary files /dev/null and b/modules/ufbx/data/maya_anim_light_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_anim_light_7500_ascii.fbx b/modules/ufbx/data/maya_anim_light_7500_ascii.fbx new file mode 100644 index 0000000..79f1527 --- /dev/null +++ b/modules/ufbx/data/maya_anim_light_7500_ascii.fbx @@ -0,0 +1,476 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 22 + Hour: 13 + Minute: 19 + Second: 53 + Millisecond: 760 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_anim_light_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_anim_light_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "22/03/2020 11:19:53.759" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_anim_light_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "22/03/2020 11:19:53.759" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\maya_anim_light.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",115465395000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2416536715232, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 14 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 1 + PropertyTemplate: "FbxLight" { + Properties70: { + P: "Color", "Color", "", "A",1,1,1 + P: "LightType", "enum", "", "",0 + P: "CastLightOnObject", "bool", "", "",1 + P: "DrawVolumetricLight", "bool", "", "",1 + P: "DrawGroundProjection", "bool", "", "",1 + P: "DrawFrontFacingVolumetricLight", "bool", "", "",0 + P: "Intensity", "Number", "", "A",100 + P: "InnerAngle", "Number", "", "A",0 + P: "OuterAngle", "Number", "", "A",45 + P: "Fog", "Number", "", "A",50 + P: "DecayType", "enum", "", "",0 + P: "DecayStart", "Number", "", "A",0 + P: "FileName", "KString", "", "", "" + P: "EnableNearAttenuation", "bool", "", "",0 + P: "NearAttenuationStart", "Number", "", "A",0 + P: "NearAttenuationEnd", "Number", "", "A",0 + P: "EnableFarAttenuation", "bool", "", "",0 + P: "FarAttenuationStart", "Number", "", "A",0 + P: "FarAttenuationEnd", "Number", "", "A",0 + P: "CastShadows", "bool", "", "",0 + P: "ShadowColor", "Color", "", "A",0,0,0 + P: "AreaLightShape", "enum", "", "",0 + P: "LeftBarnDoor", "Float", "", "A",20 + P: "RightBarnDoor", "Float", "", "A",20 + P: "TopBarnDoor", "Float", "", "A",20 + P: "BottomBarnDoor", "Float", "", "A",20 + P: "EnableBarnDoor", "Bool", "", "A",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 5 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 4 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 2416857718800, "NodeAttribute::", "Light" { + Properties70: { + P: "Color", "Color", "", "A+",0.148112133145332,0.0950400084257126,0.439999997615814 + P: "Intensity", "Number", "", "A+",307.228912353516 + P: "CastShadows", "bool", "", "",1 + } + TypeFlags: "Light" + GeometryVersion: 124 + } + Model: 2416858911136, "Model::pointLight1", "Light" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + AnimationStack: 2416706021984, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",115465395000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",115465395000 + } + } + AnimationCurve: 2416527703216, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,57732697500,115465395000 + } + KeyValueFloat: *3 { + a: 0.1481121,0.0043,0.442 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2416527702896, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,57732697500,115465395000 + } + KeyValueFloat: *3 { + a: 0.09504001,0.2218,0.118898 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2416527698736, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,57732697500,115465395000 + } + KeyValueFloat: *3 { + a: 0.44,0.113,0.118898 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2416527703856, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *4 { + a: 1924423250,32715195250,78901353250,115465395000 + } + KeyValueFloat: *4 { + a: 307.2289,120.4819,481.9277,114.4578 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *4 { + a: 24840,24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *16 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *4 { + a: 1,1,1,1 + } + } + AnimationCurveNode: 2416706022192, "AnimCurveNode::Color", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.148112133145332 + P: "d|Y", "Number", "", "A",0.0950400084257126 + P: "d|Z", "Number", "", "A",0.439999997615814 + } + } + AnimationCurveNode: 2416706028848, "AnimCurveNode::Intensity", "" { + Properties70: { + P: "d|Intensity", "Number", "", "A",307.228922843933 + } + } + AnimationCurveNode: 2416706029680, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2416706030304, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2416706030512, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2416857824112, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pointLight1, Model::RootNode + C: "OO",2416858911136,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2416857824112,2416706021984 + + ;AnimCurveNode::Color, AnimLayer::BaseLayer + C: "OO",2416706022192,2416857824112 + + ;AnimCurveNode::Intensity, AnimLayer::BaseLayer + C: "OO",2416706028848,2416857824112 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2416706029680,2416857824112 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2416706030304,2416857824112 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2416706030512,2416857824112 + + ;AnimCurveNode::Color, NodeAttribute:: + C: "OP",2416706022192,2416857718800, "Color" + + ;AnimCurveNode::Intensity, NodeAttribute:: + C: "OP",2416706028848,2416857718800, "Intensity" + + ;NodeAttribute::, Model::pointLight1 + C: "OO",2416857718800,2416858911136 + + ;AnimCurveNode::T, Model::pointLight1 + C: "OP",2416706029680,2416858911136, "Lcl Translation" + + ;AnimCurveNode::R, Model::pointLight1 + C: "OP",2416706030512,2416858911136, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pointLight1 + C: "OP",2416706030304,2416858911136, "Lcl Scaling" + + ;AnimCurve::, AnimCurveNode::Color + C: "OP",2416527703216,2416706022192, "d|X" + + ;AnimCurve::, AnimCurveNode::Color + C: "OP",2416527702896,2416706022192, "d|Y" + + ;AnimCurve::, AnimCurveNode::Color + C: "OP",2416527698736,2416706022192, "d|Z" + + ;AnimCurve::, AnimCurveNode::Intensity + C: "OP",2416527703856,2416706028848, "d|Intensity" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,115465395000 + ReferenceTime: 1924423250,115465395000 + } +} diff --git a/modules/ufbx/data/maya_anim_light_7500_binary.fbx b/modules/ufbx/data/maya_anim_light_7500_binary.fbx new file mode 100644 index 0000000..76c5fa7 Binary files /dev/null and b/modules/ufbx/data/maya_anim_light_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_arnold_properties_7500_ascii.fbx b/modules/ufbx/data/maya_arnold_properties_7500_ascii.fbx new file mode 100644 index 0000000..f068082 --- /dev/null +++ b/modules/ufbx/data/maya_arnold_properties_7500_ascii.fbx @@ -0,0 +1,545 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 12 + Hour: 21 + Minute: 53 + Second: 9 + Millisecond: 65 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_arnold_properties_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_arnold_properties_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "12/08/2021 18:53:09.064" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_arnold_properties_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "12/08/2021 18:53:09.064" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2512964000960, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceMaterial" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Unknown" + P: "MultiLayer", "bool", "", "",0 + } + } + } + ObjectType: "Implementation" { + Count: 1 + PropertyTemplate: "FbxImplementation" { + Properties70: { + P: "ShaderLanguage", "KString", "", "", "MentalRaySL" + P: "ShaderLanguageVersion", "KString", "", "", "" + P: "RenderAPI", "KString", "", "", "MentalRay" + P: "RenderAPIVersion", "KString", "", "", "" + P: "RootBindingName", "KString", "", "", "" + P: "Constants", "Compound", "", "" + } + } + } + ObjectType: "BindingTable" { + Count: 1 + PropertyTemplate: "FbxBindingTable" { + Properties70: { + P: "TargetName", "KString", "", "", "" + P: "TargetType", "KString", "", "", "" + P: "CodeAbsoluteURL", "KString", "XRefUrl", "", "" + P: "CodeRelativeURL", "KString", "XRefUrl", "", "" + P: "CodeTAG", "KString", "", "", "shader" + P: "DescAbsoluteURL", "KString", "XRefUrl", "", "" + P: "DescRelativeURL", "KString", "XRefUrl", "", "" + P: "DescTAG", "KString", "", "", "shader" + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2514759673456, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2512975565040, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2512963803488, "Material::aiStandardSurface1", "" { + Version: 102 + ShadingModel: "unknown" + MultiLayer: 0 + Properties70: { + P: "Maya", "Compound", "", "" + P: "Maya|TypeId", "int", "Integer", "",1138001 + P: "Maya|outAlpha", "float", "", "",0 + P: "Maya|normalCamera", "Vector3D", "Vector", "",1,1,1 + P: "Maya|aiEnableMatte", "bool", "", "",1 + P: "Maya|aiMatteColor", "Vector3D", "Vector", "",0.649999976158142,0.660000026226044,0.670000016689301 + P: "Maya|aiMatteColorA", "float", "", "",0.68 + P: "Maya|base", "float", "", "",0.01 + P: "Maya|baseColor", "Vector3D", "Vector", "",0.0199999995529652,0.0299999993294477,0.0399999991059303 + P: "Maya|diffuseRoughness", "float", "", "",0.05 + P: "Maya|specular", "float", "", "",0.07 + P: "Maya|specularColor", "Vector3D", "Vector", "",0.0799999982118607,0.0900000035762787,0.100000001490116 + P: "Maya|specularRoughness", "float", "", "",0.11 + P: "Maya|specularIOR", "float", "", "",0.12 + P: "Maya|specularAnisotropy", "float", "", "",0.13 + P: "Maya|specularRotation", "float", "", "",0.14 + P: "Maya|metalness", "float", "", "",0.06 + P: "Maya|transmission", "float", "", "",0.15 + P: "Maya|transmissionColor", "Vector3D", "Vector", "",0.159999996423721,0.170000001788139,0.180000007152557 + P: "Maya|transmissionDepth", "float", "", "",0.19 + P: "Maya|transmissionScatter", "Vector3D", "Vector", "",0.200000002980232,0.209999993443489,0.219999998807907 + P: "Maya|transmissionScatterAnisotropy", "float", "", "",0.23 + P: "Maya|transmissionDispersion", "float", "", "",0.24 + P: "Maya|transmissionExtraRoughness", "float", "", "",0.25 + P: "Maya|transmitAovs", "bool", "", "",1 + P: "Maya|subsurface", "float", "", "",0.26 + P: "Maya|subsurfaceColor", "Vector3D", "Vector", "",0.270000010728836,0.280000001192093,0.28999999165535 + P: "Maya|subsurfaceRadius", "Vector3D", "Vector", "",0.300000011920929,0.310000002384186,0.319999992847443 + P: "Maya|subsurfaceScale", "float", "", "",0.33 + P: "Maya|subsurfaceAnisotropy", "float", "", "",0.34 + P: "Maya|subsurfaceType", "enum", "", "",1 + P: "Maya|sheen", "float", "", "",0.46 + P: "Maya|sheenColor", "Vector3D", "Vector", "",0.469999998807907,0.479999989271164,0.490000009536743 + P: "Maya|sheenRoughness", "float", "", "",0.5 + P: "Maya|thinWalled", "bool", "", "",1 + P: "Maya|tangent", "Vector3D", "Vector", "",0.600000023841858,0.610000014305115,0.620000004768372 + P: "Maya|coat", "float", "", "",0.35 + P: "Maya|coatColor", "Vector3D", "Vector", "",0.360000014305115,0.370000004768372,0.379999995231628 + P: "Maya|coatRoughness", "float", "", "",0.39 + P: "Maya|coatIOR", "float", "", "",0.4 + P: "Maya|coatAnisotropy", "float", "", "",0.41 + P: "Maya|coatRotation", "float", "", "",0.42 + P: "Maya|coatNormal", "Vector3D", "Vector", "",0.430000007152557,0.439999997615814,0.449999988079071 + P: "Maya|thinFilmThickness", "float", "", "",0.55 + P: "Maya|thinFilmIOR", "float", "", "",0.56 + P: "Maya|emission", "float", "", "",0.51 + P: "Maya|emissionColor", "Vector3D", "Vector", "",0.519999980926514,0.529900014400482,0.540000021457672 + P: "Maya|opacity", "Vector3D", "Vector", "",0.569999992847443,0.579999983310699,0.589900016784668 + P: "Maya|caustics", "bool", "", "",1 + P: "Maya|internalReflections", "bool", "", "",1 + P: "Maya|exitToBackground", "bool", "", "",1 + P: "Maya|indirectDiffuse", "float", "", "",0.63 + P: "Maya|indirectSpecular", "float", "", "",0.64 + P: "Maya|dielectricPriority", "int", "Integer", "",69 + P: "Maya|aovId1", "KString", "", "", "" + P: "Maya|id1", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId2", "KString", "", "", "" + P: "Maya|id2", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId3", "KString", "", "", "" + P: "Maya|id3", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId4", "KString", "", "", "" + P: "Maya|id4", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId5", "KString", "", "", "" + P: "Maya|id5", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId6", "KString", "", "", "" + P: "Maya|id6", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId7", "KString", "", "", "" + P: "Maya|id7", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId8", "KString", "", "", "" + P: "Maya|id8", "Vector3D", "Vector", "",0,0,0 + P: "Maya|normalCameraUsedAs", "int", "Integer", "",0 + P: "Maya|normalCameraFactor", "double", "Number", "",0 + } + } + Implementation: 2512963419088, "Implementation::aiStandardSurface1_Implementation", "" { + Version: 100 + Properties70: { + P: "ShaderLanguage", "KString", "", "", "AiOSL" + P: "RenderAPI", "KString", "", "", "ARNOLD_SHADER_ID" + P: "RenderAPIVersion", "KString", "", "", "4.2" + P: "RootBindingName", "KString", "", "", "root" + } + } + BindingTable: 2514692641264, "BindingTable::root 4", "" { + Version: 100 + Properties70: { + P: "TargetName", "KString", "", "", "root" + P: "TargetType", "KString", "", "", "shader" + } + Entry: "Maya|specularIOR", "FbxPropertyEntry", "specularIOR", "FbxSemanticEntry" + Entry: "Maya|aiEnableMatte", "FbxPropertyEntry", "aiEnableMatte", "FbxSemanticEntry" + Entry: "Maya|id5", "FbxPropertyEntry", "id5", "FbxSemanticEntry" + Entry: "Maya|emission", "FbxPropertyEntry", "emission", "FbxSemanticEntry" + Entry: "Maya|thinFilmThickness", "FbxPropertyEntry", "thinFilmThickness", "FbxSemanticEntry" + Entry: "Maya|sheenColor", "FbxPropertyEntry", "sheenColor", "FbxSemanticEntry" + Entry: "Maya|aovId2", "FbxPropertyEntry", "aovId2", "FbxSemanticEntry" + Entry: "Maya|sheen", "FbxPropertyEntry", "sheen", "FbxSemanticEntry" + Entry: "Maya|transmissionDepth", "FbxPropertyEntry", "transmissionDepth", "FbxSemanticEntry" + Entry: "Maya|transmissionColor", "FbxPropertyEntry", "transmissionColor", "FbxSemanticEntry" + Entry: "Maya|specularColor", "FbxPropertyEntry", "specularColor", "FbxSemanticEntry" + Entry: "Maya|id4", "FbxPropertyEntry", "id4", "FbxSemanticEntry" + Entry: "Maya|aiMatteColor", "FbxPropertyEntry", "aiMatteColor", "FbxSemanticEntry" + Entry: "Maya|sheenRoughness", "FbxPropertyEntry", "sheenRoughness", "FbxSemanticEntry" + Entry: "Maya|exitToBackground", "FbxPropertyEntry", "exitToBackground", "FbxSemanticEntry" + Entry: "Maya|tangent", "FbxPropertyEntry", "tangent", "FbxSemanticEntry" + Entry: "Maya|metalness", "FbxPropertyEntry", "metalness", "FbxSemanticEntry" + Entry: "Maya|id7", "FbxPropertyEntry", "id7", "FbxSemanticEntry" + Entry: "Maya|baseColor", "FbxPropertyEntry", "baseColor", "FbxSemanticEntry" + Entry: "Maya|base", "FbxPropertyEntry", "base", "FbxSemanticEntry" + Entry: "Maya|id2", "FbxPropertyEntry", "id2", "FbxSemanticEntry" + Entry: "Maya|indirectSpecular", "FbxPropertyEntry", "indirectSpecular", "FbxSemanticEntry" + Entry: "Maya|coatNormal", "FbxPropertyEntry", "coatNormal", "FbxSemanticEntry" + Entry: "Maya|coatRoughness", "FbxPropertyEntry", "coatRoughness", "FbxSemanticEntry" + Entry: "Maya|subsurfaceType", "FbxPropertyEntry", "subsurfaceType", "FbxSemanticEntry" + Entry: "Maya|transmissionExtraRoughness", "FbxPropertyEntry", "transmissionExtraRoughness", "FbxSemanticEntry" + Entry: "Maya|specular", "FbxPropertyEntry", "specular", "FbxSemanticEntry" + Entry: "Maya|aovId7", "FbxPropertyEntry", "aovId7", "FbxSemanticEntry" + Entry: "Maya|aovId6", "FbxPropertyEntry", "aovId6", "FbxSemanticEntry" + Entry: "Maya|caustics", "FbxPropertyEntry", "caustics", "FbxSemanticEntry" + Entry: "Maya|subsurfaceScale", "FbxPropertyEntry", "subsurfaceScale", "FbxSemanticEntry" + Entry: "Maya|specularAnisotropy", "FbxPropertyEntry", "specularAnisotropy", "FbxSemanticEntry" + Entry: "Maya|diffuseRoughness", "FbxPropertyEntry", "diffuseRoughness", "FbxSemanticEntry" + Entry: "Maya|aiMatteColorA", "FbxPropertyEntry", "aiMatteColorA", "FbxSemanticEntry" + Entry: "Maya|aovId4", "FbxPropertyEntry", "aovId4", "FbxSemanticEntry" + Entry: "Maya|aovId3", "FbxPropertyEntry", "aovId3", "FbxSemanticEntry" + Entry: "Maya|internalReflections", "FbxPropertyEntry", "internalReflections", "FbxSemanticEntry" + Entry: "Maya|transmissionDispersion", "FbxPropertyEntry", "transmissionDispersion", "FbxSemanticEntry" + Entry: "Maya|dielectricPriority", "FbxPropertyEntry", "dielectricPriority", "FbxSemanticEntry" + Entry: "Maya|transmission", "FbxPropertyEntry", "transmission", "FbxSemanticEntry" + Entry: "Maya|id8", "FbxPropertyEntry", "id8", "FbxSemanticEntry" + Entry: "Maya|outAlpha", "FbxPropertyEntry", "outAlpha", "FbxSemanticEntry" + Entry: "Maya|emissionColor", "FbxPropertyEntry", "emissionColor", "FbxSemanticEntry" + Entry: "Maya|subsurfaceAnisotropy", "FbxPropertyEntry", "subsurfaceAnisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurface", "FbxPropertyEntry", "subsurface", "FbxSemanticEntry" + Entry: "Maya|specularRoughness", "FbxPropertyEntry", "specularRoughness", "FbxSemanticEntry" + Entry: "Maya|coatColor", "FbxPropertyEntry", "coatColor", "FbxSemanticEntry" + Entry: "Maya|aovId5", "FbxPropertyEntry", "aovId5", "FbxSemanticEntry" + Entry: "Maya|transmissionScatterAnisotropy", "FbxPropertyEntry", "transmissionScatterAnisotropy", "FbxSemanticEntry" + Entry: "Maya|indirectDiffuse", "FbxPropertyEntry", "indirectDiffuse", "FbxSemanticEntry" + Entry: "Maya|coatIOR", "FbxPropertyEntry", "coatIOR", "FbxSemanticEntry" + Entry: "Maya|specularRotation", "FbxPropertyEntry", "specularRotation", "FbxSemanticEntry" + Entry: "Maya|coatRotation", "FbxPropertyEntry", "coatRotation", "FbxSemanticEntry" + Entry: "Maya|transmitAovs", "FbxPropertyEntry", "transmitAovs", "FbxSemanticEntry" + Entry: "Maya|aovId1", "FbxPropertyEntry", "aovId1", "FbxSemanticEntry" + Entry: "Maya|coat", "FbxPropertyEntry", "coat", "FbxSemanticEntry" + Entry: "Maya|thinWalled", "FbxPropertyEntry", "thinWalled", "FbxSemanticEntry" + Entry: "Maya|id6", "FbxPropertyEntry", "id6", "FbxSemanticEntry" + Entry: "Maya|id1", "FbxPropertyEntry", "id1", "FbxSemanticEntry" + Entry: "Maya|opacity", "FbxPropertyEntry", "opacity", "FbxSemanticEntry" + Entry: "Maya|thinFilmIOR", "FbxPropertyEntry", "thinFilmIOR", "FbxSemanticEntry" + Entry: "Maya|aovId8", "FbxPropertyEntry", "aovId8", "FbxSemanticEntry" + Entry: "Maya|coatAnisotropy", "FbxPropertyEntry", "coatAnisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurfaceRadius", "FbxPropertyEntry", "subsurfaceRadius", "FbxSemanticEntry" + Entry: "Maya|normalCamera", "FbxPropertyEntry", "normalCamera", "FbxSemanticEntry" + Entry: "Maya|subsurfaceColor", "FbxPropertyEntry", "subsurfaceColor", "FbxSemanticEntry" + Entry: "Maya|transmissionScatter", "FbxPropertyEntry", "transmissionScatter", "FbxSemanticEntry" + Entry: "Maya|id3", "FbxPropertyEntry", "id3", "FbxSemanticEntry" + } + AnimationStack: 2514671360864, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2514768844080, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2512975565040,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2514768844080,2514671360864 + + ;Material::aiStandardSurface1, Implementation::aiStandardSurface1_Implementation + C: "OO",2512963803488,2512963419088 + + ;BindingTable::root 4, Implementation::aiStandardSurface1_Implementation + C: "OO",2514692641264,2512963419088 + + ;Geometry::, Model::pCube1 + C: "OO",2514759673456,2512975565040 + + ;Material::aiStandardSurface1, Model::pCube1 + C: "OO",2512963803488,2512975565040 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_arnold_textures_6100_ascii.fbx b/modules/ufbx/data/maya_arnold_textures_6100_ascii.fbx new file mode 100644 index 0000000..f6e9a28 --- /dev/null +++ b/modules/ufbx/data/maya_arnold_textures_6100_ascii.fbx @@ -0,0 +1,854 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 1 + Hour: 20 + Minute: 14 + Second: 28 + Millisecond: 161 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 18 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Texture" { + Count: 6 + } + ObjectType: "Video" { + Count: 6 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Implementation" { + Count: 1 + } + ObjectType: "BindingTable" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_arnold_textures_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_arnold_textures_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "01/08/2021 17:14:28.160" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_arnold_textures_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "01/08/2021 17:14:28.160" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\arnold_material.mb" + } + } + Material: "Material::aiStandardSurface1", "" { + Version: 102 + ShadingModel: "unknown" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Unknown" + Property: "MultiLayer", "bool", "",0 + Property: "Maya|TypeId", "int", "",1138001 + Property: "Maya|outAlpha", "float", "",0 + Property: "Maya|normalCamera", "Vector3D", "",1,1,1 + Property: "Maya|aiEnableMatte", "bool", "",0 + Property: "Maya|aiMatteColor", "Vector3D", "",0,0,0 + Property: "Maya|aiMatteColorA", "float", "",0 + Property: "Maya|base", "float", "",0.8 + Property: "Maya|baseColor", "Vector3D", "",0,0,0 + Property: "Maya|diffuseRoughness", "float", "",1 + Property: "Maya|specular", "float", "",1 + Property: "Maya|specularColor", "Vector3D", "",0,0,0 + Property: "Maya|specularRoughness", "float", "",1 + Property: "Maya|specularIOR", "float", "",1.52 + Property: "Maya|specularAnisotropy", "float", "",0 + Property: "Maya|specularRotation", "float", "",0 + Property: "Maya|metalness", "float", "",1 + Property: "Maya|transmission", "float", "",0 + Property: "Maya|transmissionColor", "Vector3D", "",1,1,1 + Property: "Maya|transmissionDepth", "float", "",0 + Property: "Maya|transmissionScatter", "Vector3D", "",0,0,0 + Property: "Maya|transmissionScatterAnisotropy", "float", "",0 + Property: "Maya|transmissionDispersion", "float", "",0 + Property: "Maya|transmissionExtraRoughness", "float", "",0 + Property: "Maya|transmitAovs", "bool", "",0 + Property: "Maya|subsurface", "float", "",0 + Property: "Maya|subsurfaceColor", "Vector3D", "",1,1,1 + Property: "Maya|subsurfaceRadius", "Vector3D", "",1,1,1 + Property: "Maya|subsurfaceScale", "float", "",1 + Property: "Maya|subsurfaceAnisotropy", "float", "",0 + Property: "Maya|subsurfaceType", "enum", "",1 + Property: "Maya|sheen", "float", "",0 + Property: "Maya|sheenColor", "Vector3D", "",1,1,1 + Property: "Maya|sheenRoughness", "float", "",0.3 + Property: "Maya|thinWalled", "bool", "",0 + Property: "Maya|tangent", "Vector3D", "",0,0,0 + Property: "Maya|coat", "float", "",1 + Property: "Maya|coatColor", "Vector3D", "",1,1,1 + Property: "Maya|coatRoughness", "float", "",0 + Property: "Maya|coatIOR", "float", "",1.5 + Property: "Maya|coatAnisotropy", "float", "",0 + Property: "Maya|coatRotation", "float", "",0 + Property: "Maya|coatNormal", "Vector3D", "",0,0,0 + Property: "Maya|thinFilmThickness", "float", "",0 + Property: "Maya|thinFilmIOR", "float", "",1.5 + Property: "Maya|emission", "float", "",0 + Property: "Maya|emissionColor", "Vector3D", "",1,1,1 + Property: "Maya|opacity", "Vector3D", "",1,1,1 + Property: "Maya|caustics", "bool", "",0 + Property: "Maya|internalReflections", "bool", "",1 + Property: "Maya|exitToBackground", "bool", "",0 + Property: "Maya|indirectDiffuse", "float", "",1 + Property: "Maya|indirectSpecular", "float", "",1 + Property: "Maya|dielectricPriority", "int", "",0 + Property: "Maya|aovId1", "KString", "", "" + Property: "Maya|id1", "Vector3D", "",0,0,0 + Property: "Maya|aovId2", "KString", "", "" + Property: "Maya|id2", "Vector3D", "",0,0,0 + Property: "Maya|aovId3", "KString", "", "" + Property: "Maya|id3", "Vector3D", "",0,0,0 + Property: "Maya|aovId4", "KString", "", "" + Property: "Maya|id4", "Vector3D", "",0,0,0 + Property: "Maya|aovId5", "KString", "", "" + Property: "Maya|id5", "Vector3D", "",0,0,0 + Property: "Maya|aovId6", "KString", "", "" + Property: "Maya|id6", "Vector3D", "",0,0,0 + Property: "Maya|aovId7", "KString", "", "" + Property: "Maya|id7", "Vector3D", "",0,0,0 + Property: "Maya|aovId8", "KString", "", "" + Property: "Maya|id8", "Vector3D", "",0,0,0 + Property: "Maya|normalCameraUsedAs", "int", "",0 + Property: "Maya|normalCameraFactor", "double", "",0 + } + } + Video: "Video::file2", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + Property: "RelPath", "KString", "", "textures\checkerboard_metallic.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + RelativeFilename: "textures\checkerboard_metallic.png" + } + Video: "Video::file1", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + Property: "RelPath", "KString", "", "textures\checkerboard_diffuse.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + } + Video: "Video::file5", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + Property: "RelPath", "KString", "", "textures\checkerboard_roughness.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + } + Video: "Video::file4", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + Property: "RelPath", "KString", "", "textures\checkerboard_roughness.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + } + Video: "Video::file3_ncl1_1", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + Property: "RelPath", "KString", "", "textures\checkerboard_specular.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + } + Video: "Video::file3", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + Property: "RelPath", "KString", "", "textures\checkerboard_specular.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + } + Texture: "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + RelativeFilename: "textures\checkerboard_metallic.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file5" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file5" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file3_ncl1_1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3_ncl1_1" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file3_ncl1_1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Implementation: "Implementation::aiStandardSurface1_Implementation", "" { + Version: 100 + Properties60: { + Property: "ShaderLanguage", "KString", "", "AiOSL" + Property: "ShaderLanguageVersion", "KString", "", "" + Property: "RenderAPI", "KString", "", "ARNOLD_SHADER_ID" + Property: "RenderAPIVersion", "KString", "", "4.2" + Property: "RootBindingName", "KString", "", "root" + } + } + BindingTable: "BindingTable::root 3", "" { + Version: 100 + Properties60: { + Property: "TargetName", "KString", "", "root" + Property: "TargetType", "KString", "", "shader" + Property: "CodeAbsoluteURL", "KString", "", "" + Property: "CodeRelativeURL", "KString", "", "" + Property: "CodeTAG", "KString", "", "shader" + Property: "DescAbsoluteURL", "KString", "", "" + Property: "DescRelativeURL", "KString", "", "" + Property: "DescTAG", "KString", "", "shader" + } + Entry: "Maya|specularIOR", "FbxPropertyEntry", "specularIOR", "FbxSemanticEntry" + Entry: "Maya|aiEnableMatte", "FbxPropertyEntry", "aiEnableMatte", "FbxSemanticEntry" + Entry: "Maya|id5", "FbxPropertyEntry", "id5", "FbxSemanticEntry" + Entry: "Maya|emission", "FbxPropertyEntry", "emission", "FbxSemanticEntry" + Entry: "Maya|thinFilmThickness", "FbxPropertyEntry", "thinFilmThickness", "FbxSemanticEntry" + Entry: "Maya|sheenColor", "FbxPropertyEntry", "sheenColor", "FbxSemanticEntry" + Entry: "Maya|aovId2", "FbxPropertyEntry", "aovId2", "FbxSemanticEntry" + Entry: "Maya|sheen", "FbxPropertyEntry", "sheen", "FbxSemanticEntry" + Entry: "Maya|transmissionDepth", "FbxPropertyEntry", "transmissionDepth", "FbxSemanticEntry" + Entry: "Maya|transmissionColor", "FbxPropertyEntry", "transmissionColor", "FbxSemanticEntry" + Entry: "Maya|specularColor", "FbxPropertyEntry", "specularColor", "FbxSemanticEntry" + Entry: "Maya|id4", "FbxPropertyEntry", "id4", "FbxSemanticEntry" + Entry: "Maya|aiMatteColor", "FbxPropertyEntry", "aiMatteColor", "FbxSemanticEntry" + Entry: "Maya|sheenRoughness", "FbxPropertyEntry", "sheenRoughness", "FbxSemanticEntry" + Entry: "Maya|exitToBackground", "FbxPropertyEntry", "exitToBackground", "FbxSemanticEntry" + Entry: "Maya|tangent", "FbxPropertyEntry", "tangent", "FbxSemanticEntry" + Entry: "Maya|metalness", "FbxPropertyEntry", "metalness", "FbxSemanticEntry" + Entry: "Maya|id7", "FbxPropertyEntry", "id7", "FbxSemanticEntry" + Entry: "Maya|baseColor", "FbxPropertyEntry", "baseColor", "FbxSemanticEntry" + Entry: "Maya|base", "FbxPropertyEntry", "base", "FbxSemanticEntry" + Entry: "Maya|id2", "FbxPropertyEntry", "id2", "FbxSemanticEntry" + Entry: "Maya|indirectSpecular", "FbxPropertyEntry", "indirectSpecular", "FbxSemanticEntry" + Entry: "Maya|coatNormal", "FbxPropertyEntry", "coatNormal", "FbxSemanticEntry" + Entry: "Maya|coatRoughness", "FbxPropertyEntry", "coatRoughness", "FbxSemanticEntry" + Entry: "Maya|subsurfaceType", "FbxPropertyEntry", "subsurfaceType", "FbxSemanticEntry" + Entry: "Maya|transmissionExtraRoughness", "FbxPropertyEntry", "transmissionExtraRoughness", "FbxSemanticEntry" + Entry: "Maya|specular", "FbxPropertyEntry", "specular", "FbxSemanticEntry" + Entry: "Maya|aovId7", "FbxPropertyEntry", "aovId7", "FbxSemanticEntry" + Entry: "Maya|aovId6", "FbxPropertyEntry", "aovId6", "FbxSemanticEntry" + Entry: "Maya|caustics", "FbxPropertyEntry", "caustics", "FbxSemanticEntry" + Entry: "Maya|subsurfaceScale", "FbxPropertyEntry", "subsurfaceScale", "FbxSemanticEntry" + Entry: "Maya|specularAnisotropy", "FbxPropertyEntry", "specularAnisotropy", "FbxSemanticEntry" + Entry: "Maya|diffuseRoughness", "FbxPropertyEntry", "diffuseRoughness", "FbxSemanticEntry" + Entry: "Maya|aiMatteColorA", "FbxPropertyEntry", "aiMatteColorA", "FbxSemanticEntry" + Entry: "Maya|aovId4", "FbxPropertyEntry", "aovId4", "FbxSemanticEntry" + Entry: "Maya|aovId3", "FbxPropertyEntry", "aovId3", "FbxSemanticEntry" + Entry: "Maya|internalReflections", "FbxPropertyEntry", "internalReflections", "FbxSemanticEntry" + Entry: "Maya|transmissionDispersion", "FbxPropertyEntry", "transmissionDispersion", "FbxSemanticEntry" + Entry: "Maya|dielectricPriority", "FbxPropertyEntry", "dielectricPriority", "FbxSemanticEntry" + Entry: "Maya|transmission", "FbxPropertyEntry", "transmission", "FbxSemanticEntry" + Entry: "Maya|id8", "FbxPropertyEntry", "id8", "FbxSemanticEntry" + Entry: "Maya|outAlpha", "FbxPropertyEntry", "outAlpha", "FbxSemanticEntry" + Entry: "Maya|emissionColor", "FbxPropertyEntry", "emissionColor", "FbxSemanticEntry" + Entry: "Maya|subsurfaceAnisotropy", "FbxPropertyEntry", "subsurfaceAnisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurface", "FbxPropertyEntry", "subsurface", "FbxSemanticEntry" + Entry: "Maya|specularRoughness", "FbxPropertyEntry", "specularRoughness", "FbxSemanticEntry" + Entry: "Maya|coatColor", "FbxPropertyEntry", "coatColor", "FbxSemanticEntry" + Entry: "Maya|aovId5", "FbxPropertyEntry", "aovId5", "FbxSemanticEntry" + Entry: "Maya|transmissionScatterAnisotropy", "FbxPropertyEntry", "transmissionScatterAnisotropy", "FbxSemanticEntry" + Entry: "Maya|indirectDiffuse", "FbxPropertyEntry", "indirectDiffuse", "FbxSemanticEntry" + Entry: "Maya|coatIOR", "FbxPropertyEntry", "coatIOR", "FbxSemanticEntry" + Entry: "Maya|specularRotation", "FbxPropertyEntry", "specularRotation", "FbxSemanticEntry" + Entry: "Maya|coatRotation", "FbxPropertyEntry", "coatRotation", "FbxSemanticEntry" + Entry: "Maya|transmitAovs", "FbxPropertyEntry", "transmitAovs", "FbxSemanticEntry" + Entry: "Maya|aovId1", "FbxPropertyEntry", "aovId1", "FbxSemanticEntry" + Entry: "Maya|coat", "FbxPropertyEntry", "coat", "FbxSemanticEntry" + Entry: "Maya|thinWalled", "FbxPropertyEntry", "thinWalled", "FbxSemanticEntry" + Entry: "Maya|id6", "FbxPropertyEntry", "id6", "FbxSemanticEntry" + Entry: "Maya|id1", "FbxPropertyEntry", "id1", "FbxSemanticEntry" + Entry: "Maya|opacity", "FbxPropertyEntry", "opacity", "FbxSemanticEntry" + Entry: "Maya|thinFilmIOR", "FbxPropertyEntry", "thinFilmIOR", "FbxSemanticEntry" + Entry: "Maya|aovId8", "FbxPropertyEntry", "aovId8", "FbxSemanticEntry" + Entry: "Maya|coatAnisotropy", "FbxPropertyEntry", "coatAnisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurfaceRadius", "FbxPropertyEntry", "subsurfaceRadius", "FbxSemanticEntry" + Entry: "Maya|normalCamera", "FbxPropertyEntry", "normalCamera", "FbxSemanticEntry" + Entry: "Maya|subsurfaceColor", "FbxPropertyEntry", "subsurfaceColor", "FbxSemanticEntry" + Entry: "Maya|transmissionScatter", "FbxPropertyEntry", "transmissionScatter", "FbxSemanticEntry" + Entry: "Maya|id3", "FbxPropertyEntry", "id3", "FbxSemanticEntry" + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OP", "Texture::file1", "Material::aiStandardSurface1", "Maya|baseColor" + Connect: "OP", "Texture::file5", "Material::aiStandardSurface1", "Maya|diffuseRoughness" + Connect: "OP", "Texture::file3", "Material::aiStandardSurface1", "Maya|specularColor" + Connect: "OP", "Texture::file4", "Material::aiStandardSurface1", "Maya|specularRoughness" + Connect: "OP", "Texture::file2", "Material::aiStandardSurface1", "Maya|metalness" + Connect: "OO", "Material::aiStandardSurface1", "Implementation::aiStandardSurface1_Implementation" + Connect: "OO", "BindingTable::root 3", "Implementation::aiStandardSurface1_Implementation" + Connect: "OO", "Video::file3", "Texture::file3" + Connect: "OO", "Video::file2", "Texture::file2" + Connect: "OO", "Video::file1", "Texture::file1" + Connect: "OO", "Video::file5", "Texture::file5" + Connect: "OO", "Video::file4", "Texture::file4" + Connect: "OO", "Video::file3_ncl1_1", "Texture::file3_ncl1_1" + Connect: "OO", "Material::aiStandardSurface1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_arnold_textures_6100_binary.fbx b/modules/ufbx/data/maya_arnold_textures_6100_binary.fbx new file mode 100644 index 0000000..425272c Binary files /dev/null and b/modules/ufbx/data/maya_arnold_textures_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_arnold_textures_7500_ascii.fbx b/modules/ufbx/data/maya_arnold_textures_7500_ascii.fbx new file mode 100644 index 0000000..224fe10 --- /dev/null +++ b/modules/ufbx/data/maya_arnold_textures_7500_ascii.fbx @@ -0,0 +1,791 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 1 + Hour: 20 + Minute: 9 + Second: 28 + Millisecond: 152 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_arnold_textures_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_arnold_textures_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "01/08/2021 17:09:28.151" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_arnold_textures_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "01/08/2021 17:09:28.151" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\arnold_material.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2180062775728, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 20 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceMaterial" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Unknown" + P: "MultiLayer", "bool", "", "",0 + } + } + } + ObjectType: "Implementation" { + Count: 1 + PropertyTemplate: "FbxImplementation" { + Properties70: { + P: "ShaderLanguage", "KString", "", "", "MentalRaySL" + P: "ShaderLanguageVersion", "KString", "", "", "" + P: "RenderAPI", "KString", "", "", "MentalRay" + P: "RenderAPIVersion", "KString", "", "", "" + P: "RootBindingName", "KString", "", "", "" + P: "Constants", "Compound", "", "" + } + } + } + ObjectType: "BindingTable" { + Count: 1 + PropertyTemplate: "FbxBindingTable" { + Properties70: { + P: "TargetName", "KString", "", "", "" + P: "TargetType", "KString", "", "", "" + P: "CodeAbsoluteURL", "KString", "XRefUrl", "", "" + P: "CodeRelativeURL", "KString", "XRefUrl", "", "" + P: "CodeTAG", "KString", "", "", "shader" + P: "DescAbsoluteURL", "KString", "XRefUrl", "", "" + P: "DescRelativeURL", "KString", "XRefUrl", "", "" + P: "DescTAG", "KString", "", "", "shader" + } + } + } + ObjectType: "Texture" { + Count: 6 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Video" { + Count: 6 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2179445938592, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2179263672048, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2180256982016, "Material::aiStandardSurface1", "" { + Version: 102 + ShadingModel: "unknown" + MultiLayer: 0 + Properties70: { + P: "Maya", "Compound", "", "" + P: "Maya|TypeId", "int", "Integer", "",1138001 + P: "Maya|outAlpha", "float", "", "",0 + P: "Maya|normalCamera", "Vector3D", "Vector", "",1,1,1 + P: "Maya|aiEnableMatte", "bool", "", "",0 + P: "Maya|aiMatteColor", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aiMatteColorA", "float", "", "",0 + P: "Maya|base", "float", "", "",0.8 + P: "Maya|baseColor", "Vector3D", "Vector", "",0,0,0 + P: "Maya|diffuseRoughness", "float", "", "",1 + P: "Maya|specular", "float", "", "",1 + P: "Maya|specularColor", "Vector3D", "Vector", "",0,0,0 + P: "Maya|specularRoughness", "float", "", "",1 + P: "Maya|specularIOR", "float", "", "",1.52 + P: "Maya|specularAnisotropy", "float", "", "",0 + P: "Maya|specularRotation", "float", "", "",0 + P: "Maya|metalness", "float", "", "",1 + P: "Maya|transmission", "float", "", "",0 + P: "Maya|transmissionColor", "Vector3D", "Vector", "",1,1,1 + P: "Maya|transmissionDepth", "float", "", "",0 + P: "Maya|transmissionScatter", "Vector3D", "Vector", "",0,0,0 + P: "Maya|transmissionScatterAnisotropy", "float", "", "",0 + P: "Maya|transmissionDispersion", "float", "", "",0 + P: "Maya|transmissionExtraRoughness", "float", "", "",0 + P: "Maya|transmitAovs", "bool", "", "",0 + P: "Maya|subsurface", "float", "", "",0 + P: "Maya|subsurfaceColor", "Vector3D", "Vector", "",1,1,1 + P: "Maya|subsurfaceRadius", "Vector3D", "Vector", "",1,1,1 + P: "Maya|subsurfaceScale", "float", "", "",1 + P: "Maya|subsurfaceAnisotropy", "float", "", "",0 + P: "Maya|subsurfaceType", "enum", "", "",1 + P: "Maya|sheen", "float", "", "",0 + P: "Maya|sheenColor", "Vector3D", "Vector", "",1,1,1 + P: "Maya|sheenRoughness", "float", "", "",0.3 + P: "Maya|thinWalled", "bool", "", "",0 + P: "Maya|tangent", "Vector3D", "Vector", "",0,0,0 + P: "Maya|coat", "float", "", "",1 + P: "Maya|coatColor", "Vector3D", "Vector", "",1,1,1 + P: "Maya|coatRoughness", "float", "", "",0 + P: "Maya|coatIOR", "float", "", "",1.5 + P: "Maya|coatAnisotropy", "float", "", "",0 + P: "Maya|coatRotation", "float", "", "",0 + P: "Maya|coatNormal", "Vector3D", "Vector", "",0,0,0 + P: "Maya|thinFilmThickness", "float", "", "",0 + P: "Maya|thinFilmIOR", "float", "", "",1.5 + P: "Maya|emission", "float", "", "",0 + P: "Maya|emissionColor", "Vector3D", "Vector", "",1,1,1 + P: "Maya|opacity", "Vector3D", "Vector", "",1,1,1 + P: "Maya|caustics", "bool", "", "",0 + P: "Maya|internalReflections", "bool", "", "",1 + P: "Maya|exitToBackground", "bool", "", "",0 + P: "Maya|indirectDiffuse", "float", "", "",1 + P: "Maya|indirectSpecular", "float", "", "",1 + P: "Maya|dielectricPriority", "int", "Integer", "",0 + P: "Maya|aovId1", "KString", "", "", "" + P: "Maya|id1", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId2", "KString", "", "", "" + P: "Maya|id2", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId3", "KString", "", "", "" + P: "Maya|id3", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId4", "KString", "", "", "" + P: "Maya|id4", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId5", "KString", "", "", "" + P: "Maya|id5", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId6", "KString", "", "", "" + P: "Maya|id6", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId7", "KString", "", "", "" + P: "Maya|id7", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId8", "KString", "", "", "" + P: "Maya|id8", "Vector3D", "Vector", "",0,0,0 + P: "Maya|normalCameraUsedAs", "int", "Integer", "",0 + P: "Maya|normalCameraFactor", "double", "Number", "",0 + } + } + Video: 2179864919296, "Video::file3", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_specular.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC0BSZrFPAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAJS0lEQVR42u2ceVTVVQLHP48HDxRZBZcRlE1QUUIpAdGULUpya6yjx9Kw0hmbbB21daZjajaTU01mecZ0ss3cjtqmpqaJ+6ASSSopiggCGiKyv8f88dREQFBEy76fc94f/N6993d/9/e5++MaZgyYUk0TWHt4U1OiE+97O7r/jbu/DeJ3jQSQAEICCAkgJICQAEICCAkgJICQAEICCAkgJICQAOJmxRDTqU+Tfg+g/fzf9v3VAqgLEBJASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJA3JTYaj9d5wMIdQFCAggJICSAkABCAggJICSAkABCAggJICSAkABCAoibDp0PoPMBhLoAIQGEBBASQEgAIQHE7wfbq4nUN6E/CfcOJCikC67urpirLJQVlXDqWAE56VlkbNtPdtqRGnGmbJhR4++KsgpO55zCc4kPKxcuo7iouMb36zKTG5WXV6OfrXXNvaMnYUMj6NjTH+c2LtgYjZzJP0122hF+WLeHzF0Zdd4r1ieq3vvUF+b8c9WVj8sR+2gitw3vyxRg6bxFvDP1rQbvfR6z2UxZSRm5x3LI35PN9kWbKD1d0vwCmOxNvPTOK0TG1iwEoy2YHEw4t3HFp1cAkaOiGywQk4MJT992PPTX8SSOGMxj94znVP7JJtlcDfQdHUPU6BhsjMaaUnh54O7lQY87w8g9kM2C8W/fsFpnsDHQLfYWzFVmqqkmZkg8706fjcVsblR8o9GIo5Mj/l0D8O8aQLe4UD6a+B6nc39uXgEemjSeyNgojh/N5r//msfu5F2EOXXHaGekpWsrWnf0xKuHD12jQxqssbYOdnj38OG2sf3x6+LPw5P/xGvPTKtdUy5TK6HmSljEyP70S4rHYrGQsnIbe7/YSUFmHjY2Bty8PAi6vTthwyJpF9jhhja7/hFdcHRz4qft+zlZ+jO9B0QQERPJlrWbL99qnCsLg8FAKxcngsN68PhzT9LGvz2xjyay7MUPm1eA2CF3WJu9MU+TfTjLWuscq6kqr6LoRCFFJwo5vPMg372/tsG0qsoqObzzIN+mJzNn1Txu6x/RpEJ1buvK7WPjAPh8+mfsW7f3lyYTyMvIIS8jh51Lkhn0/H03VICQu8IASFudwvf5P9J7QAQJwxMbFOBCS1ddzZnCIratS8bX0p6H5z9Jx1v8mn8Q2LJVSwBKis9es8I4mpEJQCvnVk1Kp+eQcIy2tuxbv7fGy7+UsqISFk9ecMNevoNzS/zCgygrLuXA5h/YvGYTxUXFhEdH4uzmcsXpnco+eUGKZhdg3+4fAHhq+iTcPVtfkwIJvtXaXeQey2lSOp16+gOQ+tWuX/WoOzg+FFs7W/ZvTMNcaaayvIJNX67HzmRH3NA7rjg9n17W5849kN38g8D3pr3N65+8TZ/4fkTERnEoPYPSrDPkZ56gIPMEx9OzKCsqbdRgzcHRAb/wQKLGWZvtb5avbtQIuL4xhWt79yYVxHVr/hOszf/3a1IuXFu95CsGjhhMwvCBLJu/uOFBpMGAm4c7/ROjufuJ+zBXmflu/trmF+Bg2gHG3TWGUY+Nod+d/QkIDoTgi6YnVWay9h5m0/trOL4vq840Lp0OAuzZmsKi9z5qUsHaO9oDUF5c9qt9+Z7+7Wjb+Q8U5pwiKzUTw7nrabtSyT5yjIDgQPy6BnAoPaPRleFsYTFLX/ig3vJuUICr2U9OfXcLqe9uwd3bg2MtCugU4ENAcCChkb3wCQvAO9SXFx6ezI4NW3958ZekUXK2hOzMY2R9l8GupclEe/Vp9Dz/Ys7vp08oPouzqwtbC1I4c/pMo5/l4udvTFnUF6Yx+/oT7p8IwKrFK/jmXPjz6R1an06HJC/GPfQI62Z/0ai8FxzJY3TCCMrLyq/vQtCFAUhWAcmHN5G82vowNkYjE158jGEP3kvS04/UEKC+aV1Tf9BwnhPZJ3B2daFz9yBSkq9sHFBRVoHJwYSNnRFLZe25uNHOuqZQUXr1BW1jNBIzJB6AByYm8cDEpDrDdYu9hfVzvqTaUl1vZbBrYWLMnAl4dGrLsKR7+XTOh1efr2vZxFnMZt7/51wAvP06XtfmNXXbbgASRw6+4rglP1tXIVt7e9T5feuOntbm9lTxVecvIiYSNw/3BsM5ujnhH9HlsmEqSytY8vxCys6UMvaZcUTE9Lk+Aox6cxxu9RTSedp6tQcgPyfvugrw+ScrsFgsDLg7lrhhCfUXsHMrXpn3Wo1rx9Ot/WfPQeF1xgk9d/18uKshYXgiAG88/w9ifaIufF6NfvbC5+tZy2usE1yOwuyTrJz2KQDPvfl3OgX4NL8A3iG+PDL/Ce6Zej/BcaG4tHfDzmSHQ8sWdPD15p6x9zHzg1kALF+w+LoKcDTjCEvmLQJg8usv8NSMyQSFdMHO3oRDCwd8u/jzwONJLNz4Wa2l7D2rdlhf9OBw+iXF4eTpjMHGgJOnM30fjCN0UG9ruM93XN0ilZsL4dGRVJRXsGHVN/WGS9+QSlVFJX7hQTg4t2ww3UPbD7Bg1n9wdHJk6ryZOLk4Ne8YoCivEOc2rgT2DSawr3X4/2cm1ewGLBY+m/sxKxcuvyYvtq5ZQ43B10VjirnTZ2OyNzF09B9JHDm43u4g/dx6xgV59hxi6yffEjlyAFGjY4kaHVsrztaPvyVr7+F683G56ersl9/AzmTH5tUba216XUx5cRk/bd9PUL/uBMeH8r+lWxosn49nf0BAcCD9B0bztznTmHT/E1gsluYR4J0RM/HrHUjnqG60D/KytgAOdlRWVpGfk0fazr2s/HA5B9MO3JBpVnV1Nf9+aRZrl33NoFFD6X5rCK3bemAwGCjIzSd1xx7WrVjDni0pteJunLua7LSj9BoaQbvOHbBvZU95cTm5B7JJWbGVjC0/NqH5HwjAmmVfNxg2bc1ugvp1JyQhrFECAMx8airefh3p2SeMv7z8JG+9+Hqj82aYMWBKk34Wrp9165g48RtGAkgAIQGEBBASQEgAIQHE7wqdD6DzAYS6ACEBhAQQEkBIACEBhAQQEkBIACEBhAQQEkBIACEBxM2HrfbT9Y8hQl2AkABCAggJICSAkABCAggJICSAkABCAggJICSAkADipkPnA+h8AKEuQEgAIQGEBBASQEgAIQGEBBASQEgAIQGEBBASQEgAcfPxf2A9OVhQt049AAAAAElFTkSuQmCC" + } + Video: 2179864916896, "Video::file2", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_metallic.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + RelativeFilename: "textures\checkerboard_metallic.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEQcOt4x+sgAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAGN0lEQVR42u3ca0xTZwDG8afQdiiIBaa4oUxAVlSKsYm2jqpIUVBEcOAFJ6jDLOzisrkNv7hsiUaXJVsMbmZZtmQTnYPhDRG5I4gIbKAC8TrRDZ2izqFglVJgHxQCpWC10R7q80v40h76npb/Oe9pTzmihGD/Tlig+uJ1S34dSq+R4PjWG98O9FxjAAyAGAAxAGIAxACIARADIAZADIAYADEAYgDEAMhWiSZ7jbTo+wA8nz+4x+cegFMAMQBiAMQAiAEQAyAGQAyAGAAxAGIAxACIARADIJsk5vl0Xh+AOAUQAyAGQAyAGAAxAGIAxACIARADIAZADIAYADEAsjm8PgCvD0CcAogBEAMgBkDPG7GlD/BDQS0A4P49HZJiZ0PXfKfvIBIJvvw1H84yVwDAaq2i95FwfaN5R7ze7mYv28V4rCXvJGF2dBwAIG93Cqo/+bj/I/SHYym93c1+HYzH6285U8/NmJePLxbFrcLUaRq4v+QBsViMxmtXcbKqEof270F56WHh7AEchgxFUMRik/eptPO7//hW3d3Z2UMVPA/tBgPaDQaogufB3t5ekFvmW+9/hLTsYiyNT4C3rxyOTk54wcEBnmO9EBG9BNu2p2JnRp719wBdGi6cRXDUMmSn/oSOdkOv+0JefwMNF85ijI/8kVu4OXsB4/fB5m59AeoZcHZxQ23FEUAkgmKqBppZs1Gcn/3M/rBd69i1zqae88rENUj8IAkdHR1I3/kz9qbuQP35c7Czt4PnWG9ow+ZjSXwCxvsHCGcPkL97B2RuI6DSzut1u3zSFIzxkSM3fbvVt6rXQiMBAGV5GSjL3Q8AWBCzVFBb/qiXR+PtD9cBANavfRebPk3C6boatLbexz2dDmdP1WHb118gcpYKR4sLhRNAeUEmbt+6iTkx8b23/ujlaPr3BioKsqz6wjo6y6BQTYeupRnHSwtxvLQQupZmBAZpIXNxFUwAi5evhEQiQU7mPmRn7Ol3uab/bmHNqljhBNBuMODwgTSM8ZFjvFINAHAb5YEA9UwU7tvVZ1p41tQh4ZBIpKgqyYOhTQ9Dmx5/lORCKpVibmS0YAKYMk0DANiftmvwvQ08nJEKfWsr5ixaAQDQLlwGQ5sexQfSzPr96vrGAX8sERga9WD3n5vRfVtZjvCmAQ/PVwAAp+tODr4AmptuobIoC4qpGnj5KaAJW4jyvEzcbb5t1Rd1tPer8BznhxtXL+N8bVX37X/WHUfDX5cgn+APX78JggjA0WnYg9fyzu3BFwAA5KWnAADe25AMh6GOj3Xwp/R2H/Dnibf+sAdbf3l+Zp/7Du5Ne7gXiBVEALq7LQAAp2HOg+ODIGNXLp7HqepyTFCqUVNRgsbLlwTx3h8AIuISERGXaHK5uQsWYsvmz9He3m7V9b165TKGy1zg5x+AyqMlTz8AS88nd8/fPc5rf/ftViT/qMa2rckmz3f3vK3n+E+yLj0fy9RYM0PC4Ozi9sjHcX1xBFYsjcGJsqK+e6YB1st4zMc9v2/82A1nTsBvogIJCath+OfMYz1/QUwBAFBalA+ltzsqy45YfZfadYC3aX2SyWlltVaBlC0ben1OYE3Fmb+ho6MDU4JCoQ6J6He5IY7DsGbjN8I7BhASmYsrAoO00Le2IidzX7/L/V50CG16PRSq6XB0lll1na/9fbH7OOrNdRsRv/YzjJVPhFgihdRhCDy8fBERl4jNKVmYNG2m8I4BLNHfiZIuj/qot8+8HhkNqVSKwpysAY+qdS3NqK08AqVGC3VIOAr27DR7vYwPTgd6u2rqZJapj7HTv/8KEqkUwVGxmBEegxnhMSYfr/50jW0F8LR2/11H+gM5lpsBpUaLwNCoPgE8a52dnfhl6yYcyzuAoIjFGOc/GcPdRkAkEqHp5nWcq6lCRcFBnDlRafFYooRgf4u+FMovdfIiUTSIMQAGQAyAGAAxAGIAxACIARADoOcErw/A6wMQpwBiAMQAiAEQAyAGQAyAGAAxAGIAxACIARADIAZAtkfM8+n81zDiFEAMgBgAMQBiAMQAiAEQAyAGQAyAGAAxAGIAxADI5vD6ALw+AHEKIAZADIAYADEAYgDEAIgBEAMgBkAMgBgAMQBiAGR7/ge2GSlguckQUwAAAABJRU5ErkJggg==" + } + Video: 2179864896256, "Video::file1", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_diffuse.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBECwZQ+1sKwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAFq0lEQVR42u3cW0xTdwDH8S/QymUqYuqi4gVsnBQZc0sFF0QGAx0PCwEdYMLTeNCYzAcTjEucD/K2B2Nc9rTERHFeF3SZCQs4TZlOxyAypyAggojKbUMuStFS9yAlIrTimArl93mCHtrTNt9z/ud/Wo7PzvT0J4yDrbp6PHcnwWJB639z6/dFpjQFoABEAYgCEAUgCkAUgCgAUQCiAEQBiAIQBSAKQLyVT3xExLi+D6DP8yf3+rUH0BAgCkAUgCgAUQCiAEQBiAIQBSAKQBSAKABRAKIAxCsZ9Hm6rg8gGgJEAYgCEAUgCkAUgCgAUQCiAEQBiAIQBSAKQBSAeB1dH0DXBxANAaIARAGIAhAFIApApg7Dq3jQ/MLCoZ+dTieP+/uxP3hAW3MzNyoruXz2LH29vSPuV+pmTrzmmblu6RjnzV9lZIx4Lp641uF6/DUe5tee/sYSG8sHSUnMN5sJmjkTp8NBX28vHXfv0lxXR21FBU3Xr4/pdXt6HyZ0AMN2Mb6++AcG4h8YSLDJxNIVK0jMzKRw3z6qy8q8Z0syGsnKyyPCan1ugYFpAQEEm0yYo6NJWL9+KE6v3QM8vxX6+vkxIySEhcuWEZuaSlhkJFl5eZzYs2fYmbCX2Qpdy8Z6Jszdmz7eM3EuyTk5RFit/NPSwtljx6i/coUHXV34GQxMDw7GFBrKYouFqLi417qFv/E9AIBzYICujg66Ojq4euECiZmZJGVn8+mmTXx/8iRdnZ2Tfg/wXnw8AAfz8/n73r2h2x2PHnG/vZ377e3cqKzklyNHdBB47vhxaioqeGvmTD5JS/OKIWBaYCAA9r4+zQLGoqyo6OluLyXFKwJorq0FIG3zZqbPmjW1ZwFjcae+HoC5oaH/6f6ejpxHG+89zQb+j7H35wMH+Hz3biwxMSyzWmm9dYuWxkZam5pou32b5traUWc+LzMbmJSzAHdcb0bwJNpaPLl38ybfbtvGRxs2YFm1innh4cwLDx9aPuBw0FhVxZnDh4f2FhNiD/AqP8/2tGzW7NlPQ+jpcXsk7+m5ubZy2zjn0AkWy6jrGcv7kmCxDF9/dTU/2mzg48OisDAWm82Emc0stVh4PyYGc3Q0YcuX8+WWLVwqLR2xnhdND0d7TuOdxbyxPcA7kZEAw46YJ4JHdjvTAgLwMxgYcDhGLPczGgHot9vdP8iTJzQ1NNDU0MCvZ84MTYW/2LGD9Tk55G7dOhTAlD0ITMvOBuDaxYsTKoDeri4ATG6OTeYM3t77klNX58AA3+3dC8CiZ4aGKRnAxtxc4j/+mI62Nv602SZUAHfq6gBYuXbtqMutg7c3D/6dyzcFBSwMC/P42K4D3vbW1qk1CzAYjcw2mYiIiiItK4uVcXE4HA6+3rUL/wk2b/6juJh3V69m5bp1POzpobykhJ7OTmaEhGBNSRkKo7ykZPiJIKuVg6dP89u5c9iKi/nr8mU6WlvxMxoxzZnDhwkJbMzNBeCHgoKpEYC7aU1Pdzf527dzyWYbdmDz/FTN9fvrPHfecPUqpYWFrMnIIDEzk8TMzJGvq7CQxmvXht3W1tLC23PnEp+cTHxy8ujDgNPJkf37OeXmbOCLPrh6Fe/Da9kD2O12eru7aWpooOz8eX46cYKewbF2Iio5dIjbNTXEpKYyf8kS/IOC6H/4kLv19fxeVERNefmI+3yWlERsfDxxSUlEREUxb8ECAoOCcDx+THtrK1fKyzl19Ci1VVUT6rX67ExPH9fXwvW1bl0mTiYxBaAARAGIAhAFIApAFIBMKbo+gK4PIBoCRAGIAhAFIApAFIAoAFEAogBEAYgCEAUgCkAUgHgfgz5P1z+GiIYAUQCiAEQBiAIQBSAKQBSAKABRAKIARAGIAhAFIF5H1wfQ9QFEQ4AoAFEAogBEAYgCEAUgCkAUgCgAUQCiAEQBiAIQ7/Mvxl4LkLfMIrUAAAAASUVORK5CYII=" + } + Video: 2179864897216, "Video::file5", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_roughness.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEQgLQH6W8gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAKS0lEQVR42u2cfVzN9x7A33UqlEp69LBSoWPCeiIxz5s8TVY2JgkzD2PGMpu5d3d3u2aXYdidx6sl11w2okQTmadQiOVEvBJpK1YqdUrU/qi1To+nlbs7+7xfr/NH39/5/L7n/L7v3+f7dPrpTHJVltIILvxwtzHhPNPGAqn/96tfF+FPjQggAggigCACCCKAIAIIIoAgAggigCACCCKAIAIIIoAgAghPKjo92lg06vcAsp//x65fMoB0AYIIIIgAggggiACCCCCIAIIIIIgAggggiACCCCCIAIIIIDyR6Ml+ujwfQJAuQBABBBFAEAEEEUAQAQQRQBABBBFAEAEEEUAQAQQRQBABhCcOeT6APB9AkC5AEAEEEUAQAYQ/G3oaI9L0OxoHHxQVkZ2VxcX4s/x77WpUFxNqnkro6OA5bCS9vUdi16UrhsbGFOTmckOVyMmIvZyOigSqTzaC41VlI9m2ljWPkMs/T23HLW1sGDNjJl08PLGx64BhS2MeFj8gOzOTtGtXuXw2lrjoKPKys6rVGejWpUF1Vr42vgP6cv3qlRq/S9Xz/lJe50i+Ul3NWxjyyqvTGDJiFHYODhg0a05+Xh63bqSQEB9HzIFI4k6d0Ig3aN6C58b74z54KDa2dugbNEOdf5/MWze5dukC52MOkxR/pv5pYFUBNGR48IB5kwM4cSRao7yPkyNvrFiLk4t7rbFJ8WdY/dYcCvJym0yAidNnMufdxRgYGNR5cR89fMjUXt1qbaiq07D6BMjNyeFQxD7+HjRPYxrWFAJY2tiwadce7BwctRZmQPeneWfDl9jYdqgzpjbh9eqqQE9fH9sO9rw2LwhvnzG8sWhxNQFmLPkUJxd3crOz2L1uDediosnLzsKktTku/QcxZsYclG49mbV0Bctff7VJ0tb0+QuYGfQ2JSUlfBf2Ncf27uZWchJFajXNDY0wNmtNOwdHlG49cR04uElT5jfbtjJu8lRWL/mQe1lZWsfVmnEqCfjuP5Zi5+BIfOwp1i3/J6pLCRTk52NsakoHx464evZmhO9YzRth4WJsbDuQdO4se9avJVV1mUJ1AYbGxrSxs6ezqwdew0dptxBUm/2mZmYcTbxKoVqNp6Ptr3f/wMF8vu0r8vNy+cB/LJlpN6tVYNXelvdDd2JkbMLKuTNJOB7TqAzQUdmFHd8eobS0lKBpk7l3Ma5BDdjYDDDUvQcRsfGsX7Gcjas+1ToDaCPAyeQUDI1aMsDZSWu5Yq/doLmhEbMH9eZ+zr3HMwhs1bo1AHczMzTKR/q9BEDElo01Nj5AZtpNIoI3AeA1YlSj78DxU15FoVDw1ZbNxBw88D8fNGWkpxMdEc7LgZPR09dv0nPn5ZR1kVY2bbSOKcjLA8DMyrrpZwGGRka4eXrx8efrAQjftVPjeHc3NwDOxUTXWcn58uMOzt0bfZE8+vQFYO+O7Y06T3C8iuB4FRfS72i8tGHrhi+wsLJmmM+LDa6v6qtynYf2hwOwJuQ/jJ86DcfOTujq1n2Pxh2OAmDeZ+sYMs6ftg4d0dHVfnKnV1fqrcyhiH1sWr1So8zc0qosM6Sn1VnJnfLjJmbmjRbA0toGgJRryb/b1On78+dIiDvLhGnTWXo8usnOu+bjjzC3sMTbZwwLP1xSMRNLuZaM6mIChw/s58ThaB49elQRs3PNSkxam+M5dAT+C94DoPhBET/cSOGGKpFzRw5x8eQxSirF1CtAVZa//xdCN677v5i3lpZPJxUKBcW19O/aDMDqGwPUR+iGdSzbsBmle0+S4s40ySCwUK3mnVmvsfGzFQx43pturm50VCpx6uqMU1dnfMZPIOn7S8wN9CcjPb2ssYsKWbcoiH2b1+PSbyAO3XrQ3rETtp2V2HZW0m+0L6lXVKyaN4vsjB8bNgt4ccJE/rpsBb7+AewKDaFQXaDxvp/u3qHdU7ZYtG3Hj6k3av3yFm3alU2hsn7SKH9YXIyevj66urqUlJRo9k3laay4WLOZ72ZkYGvvgEMnJy5fvPC7iXgoIpz0tFsMnRColQAN4fqVJK5fSar426hlS9x6ezEraCHKbt1Z+NHHzJ8ySSPm9vVkbl//NSs2NzJC6erBmBlzsFM+jf+C91gTNKdhY4Bvtm0lal8Y9p06sfiTZdWOJ54/D4BL/7qnWi79BwFwrUqDFdwvG8CYW1lVi7FpWy5NlZHtudhTAPiMf6XGu6zy67FmotIStm/eSI++/bF6yu6x1pV//z7ffRvF/KmBALh7etUbU5ifz4VjMawub3Slm0fNXUBN+8mVy3Yv+wgXVzdG+r3Ej4kXOL53d8UxVUwUz78wGu+AqYRs/4rbN1OrnaudrR3eAVPL0mZoqEbKu6JS4eHVhyn+/hzcFqwR5/3KuLJRd8p1jc+TEBmGz/gJ+PoH8NOVRNYHf1nvxahpz/2Xstr207UpT47ej/qtBbiOHltnXXWVN2Q/38zCtEy+Rw8r4ur7PYG1TtlCWWFRUY3vrXe4qM6/zxeLgnhYXIz/24tpa//rKtX5o4c5c/wYpmZmhIRH4jdxEpbW1igUCiytrfGbOImQ8EhMzcw4efRItUWkg2FlMvlMfx1P75E0a2GIQfMW9Hp+OKOnzQLg9MFIjZiUxEtEbQ9BoVAwc8lylv5rA72e7YexqSm6urq0NDamQ8eOjPD1e+zdQGF+PmE7tvPCy+Oa5Hyf7DmA7+tv4ty7L+Zt2qJnYICuQoGJuQXug4fy1poNAJyKDK+I2XviNLPfWYTXgEG0bf8UBs2aoVAoMLe0YsjIUXy+bQcA+7/5uuaFoEmuylJtFi2GB07jpTnzSbuezAcTx1JcVFTWIIWPWLUlBJeenrVPA8/EMjdwIrn37lXr50N3h/G0R82xl8/GsmzmFEpLq+4j6OA3+02GBUxFoVDUeVHvZmYw5BnnWhd6qt6BDV3QuaNvxN4Tpys+R117CPUNELVZNk48c4pVb86iuKhQ65jTx75jbqA/hWr1b5sFAOwP3kTXnp507eVFwLvvs/lviwDIyc5mypjRDPf1ZcSLfjg5d8PEtBV5uTlcTUwk4uudhO/aSWlpSbVzlpSU8Ons1xg6YRKew0Zi3d4WHR0dMtNuEnsggsitW2po/LK5wK61Kzm6ZxfKIcNx790HW3sHWpqYoC4o4HZqKglxZzgUEU5c7MnHmgVu30zl6LcHGeQ9vNHneu/lF+jRdwDdPPtg08EeI5OyrJafl0uqKpET4WGcjtqvEeM3qB/PDnkOr/4DsXPsiGmrVugqFOTm3EN1MYF9O/9bkWnrzQC/BflNnzwjSPgDIwKIAIIIIIgAggggiACCCCCIAIIIIIgAwp8BeT6APB9AkC5AEAEEEUAQAQQRQBABBBFAEAEEEUAQAQQRQBABBBFAEAGEJw892U+X/w0UpAsQRABBBBBEAEEEEEQAQQQQRABBBBBEAEEEEEQAQQQQRADhiUOeDyDPBxCkCxBEAEEEEEQAQQQQRABBBBBEAEEEEEQAQQQQRABBBBBEAOHJ42d71wzQGgPAkwAAAABJRU5ErkJggg==" + } + Video: 2179864922176, "Video::file4", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_roughness.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + Content: + } + Video: 2179864904896, "Video::file3", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_specular.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + Content: + } + Texture: 2179864914496, "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2179864921216, "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + RelativeFilename: "textures\checkerboard_metallic.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2179864896736, "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2179864895776, "Texture::file5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file5" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file5" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2179864899136, "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2179864893376, "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Implementation: 2180248285648, "Implementation::aiStandardSurface1_Implementation", "" { + Version: 100 + Properties70: { + P: "ShaderLanguage", "KString", "", "", "AiOSL" + P: "RenderAPI", "KString", "", "", "ARNOLD_SHADER_ID" + P: "RenderAPIVersion", "KString", "", "", "4.2" + P: "RootBindingName", "KString", "", "", "root" + } + } + BindingTable: 2180224700272, "BindingTable::root 2", "" { + Version: 100 + Properties70: { + P: "TargetName", "KString", "", "", "root" + P: "TargetType", "KString", "", "", "shader" + } + Entry: "Maya|specularIOR", "FbxPropertyEntry", "specularIOR", "FbxSemanticEntry" + Entry: "Maya|aiEnableMatte", "FbxPropertyEntry", "aiEnableMatte", "FbxSemanticEntry" + Entry: "Maya|id5", "FbxPropertyEntry", "id5", "FbxSemanticEntry" + Entry: "Maya|emission", "FbxPropertyEntry", "emission", "FbxSemanticEntry" + Entry: "Maya|thinFilmThickness", "FbxPropertyEntry", "thinFilmThickness", "FbxSemanticEntry" + Entry: "Maya|sheenColor", "FbxPropertyEntry", "sheenColor", "FbxSemanticEntry" + Entry: "Maya|aovId2", "FbxPropertyEntry", "aovId2", "FbxSemanticEntry" + Entry: "Maya|sheen", "FbxPropertyEntry", "sheen", "FbxSemanticEntry" + Entry: "Maya|transmissionDepth", "FbxPropertyEntry", "transmissionDepth", "FbxSemanticEntry" + Entry: "Maya|transmissionColor", "FbxPropertyEntry", "transmissionColor", "FbxSemanticEntry" + Entry: "Maya|specularColor", "FbxPropertyEntry", "specularColor", "FbxSemanticEntry" + Entry: "Maya|id4", "FbxPropertyEntry", "id4", "FbxSemanticEntry" + Entry: "Maya|aiMatteColor", "FbxPropertyEntry", "aiMatteColor", "FbxSemanticEntry" + Entry: "Maya|sheenRoughness", "FbxPropertyEntry", "sheenRoughness", "FbxSemanticEntry" + Entry: "Maya|exitToBackground", "FbxPropertyEntry", "exitToBackground", "FbxSemanticEntry" + Entry: "Maya|tangent", "FbxPropertyEntry", "tangent", "FbxSemanticEntry" + Entry: "Maya|metalness", "FbxPropertyEntry", "metalness", "FbxSemanticEntry" + Entry: "Maya|id7", "FbxPropertyEntry", "id7", "FbxSemanticEntry" + Entry: "Maya|baseColor", "FbxPropertyEntry", "baseColor", "FbxSemanticEntry" + Entry: "Maya|base", "FbxPropertyEntry", "base", "FbxSemanticEntry" + Entry: "Maya|id2", "FbxPropertyEntry", "id2", "FbxSemanticEntry" + Entry: "Maya|indirectSpecular", "FbxPropertyEntry", "indirectSpecular", "FbxSemanticEntry" + Entry: "Maya|coatNormal", "FbxPropertyEntry", "coatNormal", "FbxSemanticEntry" + Entry: "Maya|coatRoughness", "FbxPropertyEntry", "coatRoughness", "FbxSemanticEntry" + Entry: "Maya|subsurfaceType", "FbxPropertyEntry", "subsurfaceType", "FbxSemanticEntry" + Entry: "Maya|transmissionExtraRoughness", "FbxPropertyEntry", "transmissionExtraRoughness", "FbxSemanticEntry" + Entry: "Maya|specular", "FbxPropertyEntry", "specular", "FbxSemanticEntry" + Entry: "Maya|aovId7", "FbxPropertyEntry", "aovId7", "FbxSemanticEntry" + Entry: "Maya|aovId6", "FbxPropertyEntry", "aovId6", "FbxSemanticEntry" + Entry: "Maya|caustics", "FbxPropertyEntry", "caustics", "FbxSemanticEntry" + Entry: "Maya|subsurfaceScale", "FbxPropertyEntry", "subsurfaceScale", "FbxSemanticEntry" + Entry: "Maya|specularAnisotropy", "FbxPropertyEntry", "specularAnisotropy", "FbxSemanticEntry" + Entry: "Maya|diffuseRoughness", "FbxPropertyEntry", "diffuseRoughness", "FbxSemanticEntry" + Entry: "Maya|aiMatteColorA", "FbxPropertyEntry", "aiMatteColorA", "FbxSemanticEntry" + Entry: "Maya|aovId4", "FbxPropertyEntry", "aovId4", "FbxSemanticEntry" + Entry: "Maya|aovId3", "FbxPropertyEntry", "aovId3", "FbxSemanticEntry" + Entry: "Maya|internalReflections", "FbxPropertyEntry", "internalReflections", "FbxSemanticEntry" + Entry: "Maya|transmissionDispersion", "FbxPropertyEntry", "transmissionDispersion", "FbxSemanticEntry" + Entry: "Maya|dielectricPriority", "FbxPropertyEntry", "dielectricPriority", "FbxSemanticEntry" + Entry: "Maya|transmission", "FbxPropertyEntry", "transmission", "FbxSemanticEntry" + Entry: "Maya|id8", "FbxPropertyEntry", "id8", "FbxSemanticEntry" + Entry: "Maya|outAlpha", "FbxPropertyEntry", "outAlpha", "FbxSemanticEntry" + Entry: "Maya|emissionColor", "FbxPropertyEntry", "emissionColor", "FbxSemanticEntry" + Entry: "Maya|subsurfaceAnisotropy", "FbxPropertyEntry", "subsurfaceAnisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurface", "FbxPropertyEntry", "subsurface", "FbxSemanticEntry" + Entry: "Maya|specularRoughness", "FbxPropertyEntry", "specularRoughness", "FbxSemanticEntry" + Entry: "Maya|coatColor", "FbxPropertyEntry", "coatColor", "FbxSemanticEntry" + Entry: "Maya|aovId5", "FbxPropertyEntry", "aovId5", "FbxSemanticEntry" + Entry: "Maya|transmissionScatterAnisotropy", "FbxPropertyEntry", "transmissionScatterAnisotropy", "FbxSemanticEntry" + Entry: "Maya|indirectDiffuse", "FbxPropertyEntry", "indirectDiffuse", "FbxSemanticEntry" + Entry: "Maya|coatIOR", "FbxPropertyEntry", "coatIOR", "FbxSemanticEntry" + Entry: "Maya|specularRotation", "FbxPropertyEntry", "specularRotation", "FbxSemanticEntry" + Entry: "Maya|coatRotation", "FbxPropertyEntry", "coatRotation", "FbxSemanticEntry" + Entry: "Maya|transmitAovs", "FbxPropertyEntry", "transmitAovs", "FbxSemanticEntry" + Entry: "Maya|aovId1", "FbxPropertyEntry", "aovId1", "FbxSemanticEntry" + Entry: "Maya|coat", "FbxPropertyEntry", "coat", "FbxSemanticEntry" + Entry: "Maya|thinWalled", "FbxPropertyEntry", "thinWalled", "FbxSemanticEntry" + Entry: "Maya|id6", "FbxPropertyEntry", "id6", "FbxSemanticEntry" + Entry: "Maya|id1", "FbxPropertyEntry", "id1", "FbxSemanticEntry" + Entry: "Maya|opacity", "FbxPropertyEntry", "opacity", "FbxSemanticEntry" + Entry: "Maya|thinFilmIOR", "FbxPropertyEntry", "thinFilmIOR", "FbxSemanticEntry" + Entry: "Maya|aovId8", "FbxPropertyEntry", "aovId8", "FbxSemanticEntry" + Entry: "Maya|coatAnisotropy", "FbxPropertyEntry", "coatAnisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurfaceRadius", "FbxPropertyEntry", "subsurfaceRadius", "FbxSemanticEntry" + Entry: "Maya|normalCamera", "FbxPropertyEntry", "normalCamera", "FbxSemanticEntry" + Entry: "Maya|subsurfaceColor", "FbxPropertyEntry", "subsurfaceColor", "FbxSemanticEntry" + Entry: "Maya|transmissionScatter", "FbxPropertyEntry", "transmissionScatter", "FbxSemanticEntry" + Entry: "Maya|id3", "FbxPropertyEntry", "id3", "FbxSemanticEntry" + } + AnimationStack: 2180067674304, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2180150852624, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2179263672048,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2180150852624,2180067674304 + + ;Texture::file1, Material::aiStandardSurface1 + C: "OP",2179864896736,2180256982016, "Maya|baseColor" + + ;Texture::file5, Material::aiStandardSurface1 + C: "OP",2179864895776,2180256982016, "Maya|diffuseRoughness" + + ;Texture::file3, Material::aiStandardSurface1 + C: "OP",2179864914496,2180256982016, "Maya|specularColor" + + ;Texture::file4, Material::aiStandardSurface1 + C: "OP",2179864899136,2180256982016, "Maya|specularRoughness" + + ;Texture::file2, Material::aiStandardSurface1 + C: "OP",2179864921216,2180256982016, "Maya|metalness" + + ;Material::aiStandardSurface1, Implementation::aiStandardSurface1_Implementation + C: "OO",2180256982016,2180248285648 + + ;BindingTable::root 2, Implementation::aiStandardSurface1_Implementation + C: "OO",2180224700272,2180248285648 + + ;Video::file3, Texture::file3 + C: "OO",2179864919296,2179864914496 + + ;Video::file2, Texture::file2 + C: "OO",2179864916896,2179864921216 + + ;Video::file1, Texture::file1 + C: "OO",2179864896256,2179864896736 + + ;Video::file5, Texture::file5 + C: "OO",2179864897216,2179864895776 + + ;Video::file4, Texture::file4 + C: "OO",2179864922176,2179864899136 + + ;Video::file3, Texture::file3 + C: "OO",2179864904896,2179864893376 + + ;Geometry::, Model::pCube1 + C: "OO",2179445938592,2179263672048 + + ;Material::aiStandardSurface1, Model::pCube1 + C: "OO",2180256982016,2179263672048 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_arnold_textures_7500_binary.fbx b/modules/ufbx/data/maya_arnold_textures_7500_binary.fbx new file mode 100644 index 0000000..96f50bc Binary files /dev/null and b/modules/ufbx/data/maya_arnold_textures_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_auto_clamp_6100_ascii.fbx b/modules/ufbx/data/maya_auto_clamp_6100_ascii.fbx new file mode 100644 index 0000000..3a2539f --- /dev/null +++ b/modules/ufbx/data/maya_auto_clamp_6100_ascii.fbx @@ -0,0 +1,393 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 22 + Hour: 0 + Minute: 0 + Second: 25 + Millisecond: 548 + } + Creator: "FBX SDK/FBX Plugins version 2020.0" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_auto_clamp_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_auto_clamp_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "202000" + Property: "Original|DateTime_GMT", "DateTime", "", "21/03/2020 22:00:25.546" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_auto_clamp_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "202000" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "21/03/2020 22:00:25.546" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",57732697500 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,57732697500 + ReferenceTime: 1924423250,57732697500 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::pCube1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 4 + Key: 1924423250,0,U,s,6.86190509796143,5.37557697296143,a,0.722972273826599,0.333333343267441 + ,21168655750,0.746607899665833,U,s,5.37557697296143,3.9690523147583,a,0.333333343267441 + ,0.333333343267441,38488465000,9.44874286651611,U,s,3.9690523147583,-6.61502313613892 + ,a,0.333333343267441,0.773677349090576,57732697500,10,U,s,-6.61502504348755,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 176400000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_auto_clamp_6100_binary.fbx b/modules/ufbx/data/maya_auto_clamp_6100_binary.fbx new file mode 100644 index 0000000..4f7d38f Binary files /dev/null and b/modules/ufbx/data/maya_auto_clamp_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_auto_clamp_7100_ascii.fbx b/modules/ufbx/data/maya_auto_clamp_7100_ascii.fbx new file mode 100644 index 0000000..887f6dc --- /dev/null +++ b/modules/ufbx/data/maya_auto_clamp_7100_ascii.fbx @@ -0,0 +1,450 @@ +; FBX 7.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 22 + Hour: 0 + Minute: 27 + Second: 54 + Millisecond: 501 + } + Creator: "FBX SDK/FBX Plugins version 2020.0" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_auto_clamp_7100_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_auto_clamp_7100_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "202000" + P: "Original|DateTime_GMT", "DateTime", "", "", "21/03/2020 22:27:54.500" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_auto_clamp_7100_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "202000" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "21/03/2020 22:27:54.500" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\maya_auto_clamp.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",57732697500 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1832172364976, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 10 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurve" { + Count: 1 + } + ObjectType: "AnimationCurveNode" { + Count: 3 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1832060564880, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1831923981536, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",10,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1832050404896, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1832155396944, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",57732697500 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",57732697500 + } + } + AnimationCurve: 1832182317136, "AnimCurve::", "" { + Default: 0 + KeyVer: 4007 + KeyTime: *4 { + a: 1924423250,21168655750,38488465000,57732697500 + } + KeyValueFloat: *4 { + a: 0,0.7466079,9.448743,10 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Cubic|TangeantUser + KeyAttrFlags: *4 { + a: 50332680,50332680,50332680,1032 + } + KeyAttrDataFloat: *16 { + a: 6.861905,5.375577,4.101778e-31,0,5.375577,3.969051,4.099946e-31,0,3.969051,-6.615023,9.743571e-21,0,-6.615025,0,4.099946e-31,0 + } + KeyAttrRefCount: *4 { + a: 1,1,1,1 + } + } + AnimationCurveNode: 1832155390288, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",10 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1832155388624, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 1832155395072, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 1831811944368, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1831923981536,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1831811944368,1832155396944 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1832155390288,1831811944368 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1832155388624,1831811944368 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1832155395072,1831811944368 + + ;Geometry::, Model::pCube1 + C: "OO",1832060564880,1831923981536 + + ;Material::lambert1, Model::pCube1 + C: "OO",1832050404896,1831923981536 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",1832155390288,1831923981536, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",1832155395072,1831923981536, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",1832155388624,1831923981536, "Lcl Scaling" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1832182317136,1832155390288, "d|X" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,57732697500 + ReferenceTime: 1924423250,57732697500 + } +} diff --git a/modules/ufbx/data/maya_auto_clamp_7100_binary.fbx b/modules/ufbx/data/maya_auto_clamp_7100_binary.fbx new file mode 100644 index 0000000..2e24da1 Binary files /dev/null and b/modules/ufbx/data/maya_auto_clamp_7100_binary.fbx differ diff --git a/modules/ufbx/data/maya_auto_clamp_7700_ascii.fbx b/modules/ufbx/data/maya_auto_clamp_7700_ascii.fbx new file mode 100644 index 0000000..a158eb1 --- /dev/null +++ b/modules/ufbx/data/maya_auto_clamp_7700_ascii.fbx @@ -0,0 +1,456 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 21 + Hour: 23 + Minute: 54 + Second: 26 + Millisecond: 430 + } + Creator: "FBX SDK/FBX Plugins version 2020.0" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_auto_clamp_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_auto_clamp_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "202000" + P: "Original|DateTime_GMT", "DateTime", "", "", "21/03/2020 21:54:26.428" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_auto_clamp_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "202000" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "21/03/2020 21:54:26.428" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",57732697500 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1831313853696, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 10 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurve" { + Count: 1 + } + ObjectType: "AnimationCurveNode" { + Count: 3 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1832060545744, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1831923979216, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0.746607910455113,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1832050398096, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1832061113936, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",57732697500 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",57732697500 + } + } + AnimationCurve: 1830452967344, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *4 { + a: 1924423250,21168655750,38488465000,57732697500 + } + KeyValueFloat: *4 { + a: 0,0.7466079,9.448743,10 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive|WeightedRight|WeightedNextLeft, Cubic|TangeantUser + KeyAttrFlags: *4 { + a: 50332680,50356488,50356488,1032 + } + ;KeyAttrDataFloat: RightSlope:6.86191, NextLeftSlope:5.37558, RightWeight:0.722972, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:3.96905; RightAuto:0, NextLeftAuto:-6.61502; RightSlope:-6.61503, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *16 { + a: 1088132282,1085015226,218438717,0,0,1082000628,218434821,0,0,-1059869115,506989829,0,-1059869111,0,218434821,0 + } + KeyAttrRefCount: *4 { + a: 1,1,1,1 + } + } + AnimationCurveNode: 1832060137456, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.746607910455113 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1832172693184, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 1832172693808, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 1831811945888, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1831923979216,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1831811945888,1832061113936 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1832060137456,1831811945888 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1832172693184,1831811945888 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1832172693808,1831811945888 + + ;Geometry::, Model::pCube1 + C: "OO",1832060545744,1831923979216 + + ;Material::lambert1, Model::pCube1 + C: "OO",1832050398096,1831923979216 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",1832060137456,1831923979216, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",1832172693808,1831923979216, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",1832172693184,1831923979216, "Lcl Scaling" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1830452967344,1832060137456, "d|X" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,57732697500 + ReferenceTime: 1924423250,57732697500 + } +} diff --git a/modules/ufbx/data/maya_auto_clamp_7700_binary.fbx b/modules/ufbx/data/maya_auto_clamp_7700_binary.fbx new file mode 100644 index 0000000..af3d730 Binary files /dev/null and b/modules/ufbx/data/maya_auto_clamp_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_bad_face_6100_ascii.fbx b/modules/ufbx/data/maya_bad_face_6100_ascii.fbx new file mode 100644 index 0000000..bd74776 --- /dev/null +++ b/modules/ufbx/data/maya_bad_face_6100_ascii.fbx @@ -0,0 +1,372 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 33 + Second: 51 + Millisecond: 520 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: -3,5,-5,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "31/03/2020 18:33:51.517" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "31/03/2020 18:33:51.517" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_blend_inbetween_1.obj b/modules/ufbx/data/maya_blend_inbetween_1.obj new file mode 100644 index 0000000..05d35e8 --- /dev/null +++ b/modules/ufbx/data/maya_blend_inbetween_1.obj @@ -0,0 +1,155 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_blend_between_1.mtl +g blendShape1Set tweakSet1 +v -0.500000 -0.500000 0.500000 +v 0.000000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.000000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.746650 -0.433965 +v 0.000000 0.746650 -0.433965 +v 0.500000 0.500000 -0.433965 +v -0.500000 0.746650 -0.933965 +v 0.000000 0.746650 -0.933965 +v 0.500000 0.500000 -0.933965 +v -0.500000 0.500000 -1.433965 +v 0.000000 0.500000 -1.433965 +v 0.500000 0.500000 -1.433965 +v -0.500000 0.000000 -0.500000 +v 0.000000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.000000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.000000 +v 0.000000 -0.500000 0.000000 +v 0.500000 -0.500000 0.000000 +v 0.500000 0.000000 0.000000 +v -0.500000 0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.500000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.125000 +vt 0.500000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.250000 +vt 0.500000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.375000 +vt 0.500000 0.375000 +vt 0.625000 0.375000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 1.000000 +vt 0.500000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.250000 +vt 0.750000 0.250000 +vt 0.125000 0.000000 +vt 0.250000 0.000000 +vt 0.125000 0.125000 +vt 0.250000 0.125000 +vt 0.125000 0.250000 +vt 0.250000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.076118 0.617215 0.783104 +vn 0.000000 0.599580 0.800315 +vn 0.000000 0.000000 1.000000 +vn 0.155763 0.631517 0.759556 +vn 0.089088 0.800693 0.592413 +vn 0.000000 0.781082 0.624429 +vn 0.200970 0.814800 0.543794 +vn 0.000000 1.000000 0.000000 +vn 0.239473 0.970903 0.000000 +vn 0.177155 0.968108 -0.177155 +vn 0.000000 0.970903 -0.239473 +vn 0.442400 0.896818 0.000000 +vn 0.344690 0.931659 -0.114897 +vn 0.114897 0.931659 -0.344690 +vn 0.000000 0.896818 -0.442400 +vn 0.232888 0.944207 -0.232888 +vn 0.000000 -0.881613 -0.471973 +vn 0.000000 -0.881613 -0.471973 +vn 0.000000 -0.682565 -0.730825 +vn 0.000000 -0.682565 -0.730825 +vn 0.000000 -0.881613 -0.471973 +vn 0.000000 -0.682565 -0.730825 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +s 1 +g pCube1 +usemtl initialShadingGroup +f 1/1/1 2/2/2 5/5/3 4/4/4 +f 2/2/2 3/3/5 6/6/6 5/5/3 +f 4/4/4 5/5/3 8/8/7 7/7/8 +f 5/5/3 6/6/6 9/9/9 8/8/7 +s 2 +f 7/7/10 8/8/11 11/11/12 10/10/13 +f 8/8/11 9/9/14 12/12/15 11/11/12 +f 10/10/13 11/11/12 14/14/16 13/13/17 +f 11/11/12 12/12/15 15/15/18 14/14/16 +s 3 +f 13/13/19 14/14/20 17/17/21 16/16/22 +f 14/14/20 15/15/23 18/18/24 17/17/21 +f 16/16/22 17/17/21 20/20/25 19/19/26 +f 17/17/21 18/18/24 21/21/27 20/20/25 +s 4 +f 19/19/28 20/20/29 23/23/30 22/22/31 +f 20/20/29 21/21/32 24/24/33 23/23/30 +f 22/22/31 23/23/30 2/26/34 1/25/35 +f 23/23/30 24/24/33 3/27/36 2/26/34 +s 5 +f 24/29/37 21/28/38 18/30/39 25/31/40 +f 3/3/41 24/29/37 25/31/40 6/6/42 +f 25/31/40 18/30/39 15/32/43 12/33/44 +f 6/6/42 25/31/40 12/33/44 9/9/45 +s 6 +f 19/34/46 22/35/47 26/37/48 16/36/49 +f 22/35/47 1/1/50 4/4/51 26/37/48 +f 16/36/49 26/37/48 10/39/52 13/38/53 +f 26/37/48 4/4/51 7/7/54 10/39/52 diff --git a/modules/ufbx/data/maya_blend_inbetween_120.obj b/modules/ufbx/data/maya_blend_inbetween_120.obj new file mode 100644 index 0000000..46d8047 --- /dev/null +++ b/modules/ufbx/data/maya_blend_inbetween_120.obj @@ -0,0 +1,155 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_blend_between_120.mtl +g blendShape1Set tweakSet1 +v -0.500000 -0.500000 0.500000 +v 0.000000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.000000 0.000000 0.500000 +v 0.500000 -0.000000 0.500000 +v -2.027958 1.269195 0.656076 +v -1.527958 1.269195 0.656076 +v -1.027958 0.500000 0.656076 +v -2.027958 1.269195 0.156076 +v -1.527958 1.269195 0.156076 +v -1.027958 0.500000 0.156076 +v -2.027958 0.500000 -0.343924 +v -1.527958 0.500000 -0.343924 +v -1.027958 0.500000 -0.343924 +v -0.500000 0.000000 -0.500000 +v 0.000000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.000000 -0.025316 -0.500000 +v 0.500000 -0.025316 -0.500000 +v -0.500000 -0.500000 0.000000 +v 0.000000 -0.025316 0.000000 +v 0.500000 -0.025316 0.000000 +v 0.500000 0.000000 0.000000 +v -0.500000 0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.500000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.125000 +vt 0.500000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.250000 +vt 0.500000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.375000 +vt 0.500000 0.375000 +vt 0.625000 0.375000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 1.000000 +vt 0.500000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.250000 +vt 0.750000 0.250000 +vt 0.125000 0.000000 +vt 0.250000 0.000000 +vt 0.125000 0.125000 +vt 0.250000 0.125000 +vt 0.125000 0.250000 +vt 0.250000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.159880 -0.267100 0.950314 +vn 0.000000 -0.097664 0.995219 +vn 0.000000 0.000000 1.000000 +vn -0.057257 -0.074437 0.995581 +vn -0.012268 -0.141331 0.989886 +vn 0.000000 -0.122053 0.992524 +vn -0.341923 -0.444520 -0.827943 +vn 0.000000 1.000000 0.000000 +vn 0.609693 0.792638 0.000000 +vn 0.433967 0.789522 -0.433967 +vn 0.000000 0.792638 -0.609693 +vn 0.838432 0.545006 0.000000 +vn 0.732784 0.635109 -0.244261 +vn 0.244261 0.635109 -0.732784 +vn 0.000000 0.545006 -0.838432 +vn 0.520568 0.676770 -0.520568 +vn 0.000000 0.297973 -0.954574 +vn 0.000000 0.297973 -0.954574 +vn 0.000000 0.235540 -0.971865 +vn 0.000000 0.234587 -0.972095 +vn 0.000000 0.297973 -0.954574 +vn 0.000000 0.243967 -0.969784 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.688508 -0.725228 0.000000 +vn 0.428824 -0.903388 0.000000 +vn 0.310708 -0.898288 -0.310708 +vn 0.569473 -0.799792 -0.189824 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -0.903388 -0.428824 +vn 0.189824 -0.799792 -0.569473 +vn 0.394115 -0.830269 -0.394115 +vn 0.000000 -0.725228 -0.688508 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.326044 0.945355 0.000000 +vn 0.388383 0.921498 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.439406 0.898289 0.000000 +vn 0.311006 0.950408 0.000000 +vn 0.311006 0.950408 0.000000 +vn 0.311006 0.950408 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.674205 -0.684821 0.276528 +vn -0.558344 -0.657580 0.505807 +vn -1.000000 0.000000 0.000000 +vn -0.752424 -0.658679 0.000000 +vn -0.563873 -0.794805 0.224346 +vn -0.368674 -0.736803 0.566745 +vn -0.638964 -0.769236 0.000000 +s 1 +g pCube1 +usemtl initialShadingGroup +f 1/1/1 2/2/2 5/5/3 4/4/4 +f 2/2/2 3/3/5 6/6/6 5/5/3 +f 4/4/4 5/5/3 8/8/7 7/7/8 +f 5/5/3 6/6/6 9/9/9 8/8/7 +s 2 +f 7/7/10 8/8/11 11/11/12 10/10/13 +f 8/8/11 9/9/14 12/12/15 11/11/12 +f 10/10/13 11/11/12 14/14/16 13/13/17 +f 11/11/12 12/12/15 15/15/18 14/14/16 +s 3 +f 13/13/19 14/14/20 17/17/21 16/16/22 +f 14/14/20 15/15/23 18/18/24 17/17/21 +f 16/16/22 17/17/21 20/20/25 19/19/26 +f 17/17/21 18/18/24 21/21/27 20/20/25 +s 4 +f 19/19/28 20/20/29 23/23/30 22/22/31 +f 20/20/29 21/21/32 24/24/33 23/23/30 +f 22/22/31 23/23/30 2/26/34 1/25/35 +f 23/23/30 24/24/33 3/27/36 2/26/34 +s 5 +f 24/29/37 21/28/38 18/30/39 25/31/40 +f 3/3/41 24/29/37 25/31/40 6/6/42 +f 25/31/40 18/30/39 15/32/43 12/33/44 +f 6/6/42 25/31/40 12/33/44 9/9/45 +s 6 +f 19/34/46 22/35/47 26/37/48 16/36/49 +f 22/35/47 1/1/50 4/4/51 26/37/48 +f 16/36/49 26/37/48 10/39/52 13/38/53 +f 26/37/48 4/4/51 7/7/54 10/39/52 diff --git a/modules/ufbx/data/maya_blend_inbetween_30.obj b/modules/ufbx/data/maya_blend_inbetween_30.obj new file mode 100644 index 0000000..802dc19 --- /dev/null +++ b/modules/ufbx/data/maya_blend_inbetween_30.obj @@ -0,0 +1,155 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_blend_between_30.mtl +g blendShape1Set tweakSet1 +v -0.500000 -0.500000 0.500000 +v 0.000000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.000000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.636235 -0.224916 +v 0.000000 0.636235 -0.224916 +v 0.500000 0.500000 -0.224916 +v -0.500000 0.636235 -0.724916 +v 0.000000 0.636235 -0.724916 +v 0.500000 0.500000 -0.724916 +v -0.500000 0.500000 -1.224916 +v 0.000000 0.500000 -1.224916 +v 0.500000 0.500000 -1.224916 +v -0.500000 0.000000 -0.500000 +v 0.000000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.000000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.000000 +v 0.000000 -0.500000 0.000000 +v 0.500000 -0.500000 0.000000 +v 0.500000 0.000000 0.000000 +v -0.500000 0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.500000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.125000 +vt 0.500000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.250000 +vt 0.500000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.375000 +vt 0.500000 0.375000 +vt 0.625000 0.375000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 1.000000 +vt 0.500000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.250000 +vt 0.750000 0.250000 +vt 0.125000 0.000000 +vt 0.250000 0.000000 +vt 0.125000 0.125000 +vt 0.250000 0.125000 +vt 0.125000 0.250000 +vt 0.250000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.037405 0.549126 0.834902 +vn -0.000000 0.537856 0.843037 +vn 0.000000 0.000000 1.000000 +vn 0.076282 0.559930 0.825021 +vn 0.049193 0.767250 0.639459 +vn -0.000000 0.751583 0.659639 +vn 0.106617 0.782601 0.613325 +vn -0.000000 1.000000 0.000000 +vn 0.134988 0.990847 0.000000 +vn 0.100758 0.989796 -0.100758 +vn -0.000000 0.990847 -0.134988 +vn 0.262886 0.964827 0.000000 +vn 0.199770 0.977578 -0.066590 +vn 0.066590 0.977578 -0.199770 +vn 0.000000 0.964827 -0.262886 +vn 0.133774 0.981941 -0.133774 +vn 0.000000 -0.823182 -0.567778 +vn 0.000000 -0.823182 -0.567778 +vn 0.000000 -0.586923 -0.809643 +vn 0.000000 -0.586923 -0.809643 +vn 0.000000 -0.823182 -0.567778 +vn 0.000000 -0.586923 -0.809643 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +s 1 +g pCube1 +usemtl initialShadingGroup +f 1/1/1 2/2/2 5/5/3 4/4/4 +f 2/2/2 3/3/5 6/6/6 5/5/3 +f 4/4/4 5/5/3 8/8/7 7/7/8 +f 5/5/3 6/6/6 9/9/9 8/8/7 +s 2 +f 7/7/10 8/8/11 11/11/12 10/10/13 +f 8/8/11 9/9/14 12/12/15 11/11/12 +f 10/10/13 11/11/12 14/14/16 13/13/17 +f 11/11/12 12/12/15 15/15/18 14/14/16 +s 3 +f 13/13/19 14/14/20 17/17/21 16/16/22 +f 14/14/20 15/15/23 18/18/24 17/17/21 +f 16/16/22 17/17/21 20/20/25 19/19/26 +f 17/17/21 18/18/24 21/21/27 20/20/25 +s 4 +f 19/19/28 20/20/29 23/23/30 22/22/31 +f 20/20/29 21/21/32 24/24/33 23/23/30 +f 22/22/31 23/23/30 2/26/34 1/25/35 +f 23/23/30 24/24/33 3/27/36 2/26/34 +s 5 +f 24/29/37 21/28/38 18/30/39 25/31/40 +f 3/3/41 24/29/37 25/31/40 6/6/42 +f 25/31/40 18/30/39 15/32/43 12/33/44 +f 6/6/42 25/31/40 12/33/44 9/9/45 +s 6 +f 19/34/46 22/35/47 26/37/48 16/36/49 +f 22/35/47 1/1/50 4/4/51 26/37/48 +f 16/36/49 26/37/48 10/39/52 13/38/53 +f 26/37/48 4/4/51 7/7/54 10/39/52 diff --git a/modules/ufbx/data/maya_blend_inbetween_60.obj b/modules/ufbx/data/maya_blend_inbetween_60.obj new file mode 100644 index 0000000..4cb16f4 --- /dev/null +++ b/modules/ufbx/data/maya_blend_inbetween_60.obj @@ -0,0 +1,155 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_blend_between_60.mtl +g blendShape1Set tweakSet1 +v -0.500000 -0.500000 0.500000 +v 0.000000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.000000 0.000000 0.500000 +v 0.500000 -0.000000 0.500000 +v -0.500000 0.381339 0.257679 +v 0.000000 0.381339 0.257679 +v 0.500000 0.500000 0.257679 +v -0.500000 0.381339 -0.242321 +v 0.000000 0.381339 -0.242321 +v 0.500000 0.500000 -0.242321 +v -0.500000 0.500000 -0.742321 +v 0.000000 0.500000 -0.742321 +v 0.500000 0.500000 -0.742321 +v -0.500000 0.000000 -0.500000 +v 0.000000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.000000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.000000 +v 0.000000 -0.500000 0.000000 +v 0.500000 -0.500000 0.000000 +v 0.500000 0.000000 0.000000 +v -0.500000 0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.500000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.125000 +vt 0.500000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.250000 +vt 0.500000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.375000 +vt 0.500000 0.375000 +vt 0.625000 0.375000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 1.000000 +vt 0.500000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.250000 +vt 0.750000 0.250000 +vt 0.125000 0.000000 +vt 0.250000 0.000000 +vt 0.125000 0.125000 +vt 0.250000 0.125000 +vt 0.125000 0.250000 +vt 0.250000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.015249 0.257025 0.966285 +vn 0.000000 0.265108 0.964219 +vn 0.000000 0.000000 1.000000 +vn -0.029588 0.249351 0.967961 +vn -0.031788 0.506031 0.861929 +vn 0.000000 0.536325 0.844012 +vn -0.057083 0.481060 0.874827 +vn 0.000000 1.000000 0.000000 +vn -0.117835 0.993033 0.000000 +vn -0.088051 0.992217 0.088051 +vn 0.000000 0.993033 0.117835 +vn -0.230909 0.972975 0.000000 +vn -0.174940 0.982851 0.058313 +vn -0.058313 0.982851 0.174940 +vn 0.000000 0.972975 0.230909 +vn -0.117025 0.986210 0.117025 +vn 0.000000 -0.436122 -0.899887 +vn 0.000000 -0.436122 -0.899887 +vn 0.000000 -0.235505 -0.971873 +vn 0.000000 -0.235505 -0.971873 +vn 0.000000 -0.436122 -0.899887 +vn 0.000000 -0.235505 -0.971873 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 -0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 -0.000000 0.000000 +vn -1.000000 -0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 -0.000000 0.000000 +s 1 +g pCube1 +usemtl initialShadingGroup +f 1/1/1 2/2/2 5/5/3 4/4/4 +f 2/2/2 3/3/5 6/6/6 5/5/3 +f 4/4/4 5/5/3 8/8/7 7/7/8 +f 5/5/3 6/6/6 9/9/9 8/8/7 +s 2 +f 7/7/10 8/8/11 11/11/12 10/10/13 +f 8/8/11 9/9/14 12/12/15 11/11/12 +f 10/10/13 11/11/12 14/14/16 13/13/17 +f 11/11/12 12/12/15 15/15/18 14/14/16 +s 3 +f 13/13/19 14/14/20 17/17/21 16/16/22 +f 14/14/20 15/15/23 18/18/24 17/17/21 +f 16/16/22 17/17/21 20/20/25 19/19/26 +f 17/17/21 18/18/24 21/21/27 20/20/25 +s 4 +f 19/19/28 20/20/29 23/23/30 22/22/31 +f 20/20/29 21/21/32 24/24/33 23/23/30 +f 22/22/31 23/23/30 2/26/34 1/25/35 +f 23/23/30 24/24/33 3/27/36 2/26/34 +s 5 +f 24/29/37 21/28/38 18/30/39 25/31/40 +f 3/3/41 24/29/37 25/31/40 6/6/42 +f 25/31/40 18/30/39 15/32/43 12/33/44 +f 6/6/42 25/31/40 12/33/44 9/9/45 +s 6 +f 19/34/46 22/35/47 26/37/48 16/36/49 +f 22/35/47 1/1/50 4/4/51 26/37/48 +f 16/36/49 26/37/48 10/39/52 13/38/53 +f 26/37/48 4/4/51 7/7/54 10/39/52 diff --git a/modules/ufbx/data/maya_blend_inbetween_65.obj b/modules/ufbx/data/maya_blend_inbetween_65.obj new file mode 100644 index 0000000..6a57796 --- /dev/null +++ b/modules/ufbx/data/maya_blend_inbetween_65.obj @@ -0,0 +1,155 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_blend_between_65.mtl +g blendShape1Set tweakSet1 +v -0.500000 -0.500000 0.500000 +v 0.000000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.000000 0.000000 0.500000 +v 0.500000 -0.000000 0.500000 +v -0.500000 0.477734 0.345823 +v 0.000000 0.477734 0.345823 +v 0.500000 0.500000 0.345823 +v -0.500000 0.477734 -0.154177 +v 0.000000 0.477734 -0.154177 +v 0.500000 0.500000 -0.154177 +v -0.500000 0.500000 -0.654177 +v 0.000000 0.500000 -0.654177 +v 0.500000 0.500000 -0.654177 +v -0.500000 0.000000 -0.500000 +v 0.000000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.000000 -0.446252 -0.500000 +v 0.500000 -0.446252 -0.500000 +v -0.500000 -0.500000 0.000000 +v 0.000000 -0.446252 0.000000 +v 0.500000 -0.446252 0.000000 +v 0.500000 0.000000 0.000000 +v -0.500000 0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.500000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.125000 +vt 0.500000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.250000 +vt 0.500000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.375000 +vt 0.500000 0.375000 +vt 0.625000 0.375000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 1.000000 +vt 0.500000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.250000 +vt 0.750000 0.250000 +vt 0.125000 0.000000 +vt 0.250000 0.000000 +vt 0.125000 0.125000 +vt 0.250000 0.125000 +vt 0.125000 0.250000 +vt 0.250000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.001725 0.154903 0.987928 +vn 0.000000 0.155764 0.987794 +vn 0.000000 0.000000 1.000000 +vn -0.003430 0.154051 0.988057 +vn -0.003428 0.303875 0.952706 +vn 0.000000 0.307128 0.951668 +vn -0.006697 0.300767 0.953674 +vn 0.000000 1.000000 0.000000 +vn -0.022260 0.999752 0.000000 +vn -0.016693 0.999721 0.016693 +vn 0.000000 0.999752 0.022260 +vn -0.044487 0.999010 0.000000 +vn -0.033378 0.999381 0.011126 +vn -0.011126 0.999381 0.033378 +vn 0.000000 0.999010 0.044487 +vn -0.022255 0.999505 0.022255 +vn 0.000000 -0.294664 -0.955601 +vn 0.000000 -0.294664 -0.955601 +vn 0.000000 -0.158619 -0.987340 +vn 0.000000 -0.156483 -0.987681 +vn 0.000000 -0.294664 -0.955601 +vn 0.000000 -0.160814 -0.986985 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.106880 -0.994272 0.000000 +vn 0.053671 -0.998559 0.000000 +vn 0.040221 -0.998381 -0.040221 +vn 0.080332 -0.996408 -0.026777 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -0.998559 -0.053671 +vn 0.026777 -0.996408 -0.080332 +vn 0.053593 -0.997124 -0.053593 +vn 0.000000 -0.994272 -0.106880 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +s 1 +g pCube1 +usemtl initialShadingGroup +f 1/1/1 2/2/2 5/5/3 4/4/4 +f 2/2/2 3/3/5 6/6/6 5/5/3 +f 4/4/4 5/5/3 8/8/7 7/7/8 +f 5/5/3 6/6/6 9/9/9 8/8/7 +s 2 +f 7/7/10 8/8/11 11/11/12 10/10/13 +f 8/8/11 9/9/14 12/12/15 11/11/12 +f 10/10/13 11/11/12 14/14/16 13/13/17 +f 11/11/12 12/12/15 15/15/18 14/14/16 +s 3 +f 13/13/19 14/14/20 17/17/21 16/16/22 +f 14/14/20 15/15/23 18/18/24 17/17/21 +f 16/16/22 17/17/21 20/20/25 19/19/26 +f 17/17/21 18/18/24 21/21/27 20/20/25 +s 4 +f 19/19/28 20/20/29 23/23/30 22/22/31 +f 20/20/29 21/21/32 24/24/33 23/23/30 +f 22/22/31 23/23/30 2/26/34 1/25/35 +f 23/23/30 24/24/33 3/27/36 2/26/34 +s 5 +f 24/29/37 21/28/38 18/30/39 25/31/40 +f 3/3/41 24/29/37 25/31/40 6/6/42 +f 25/31/40 18/30/39 15/32/43 12/33/44 +f 6/6/42 25/31/40 12/33/44 9/9/45 +s 6 +f 19/34/46 22/35/47 26/37/48 16/36/49 +f 22/35/47 1/1/50 4/4/51 26/37/48 +f 16/36/49 26/37/48 10/39/52 13/38/53 +f 26/37/48 4/4/51 7/7/54 10/39/52 diff --git a/modules/ufbx/data/maya_blend_inbetween_71.obj b/modules/ufbx/data/maya_blend_inbetween_71.obj new file mode 100644 index 0000000..5163681 --- /dev/null +++ b/modules/ufbx/data/maya_blend_inbetween_71.obj @@ -0,0 +1,155 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_blend_between_71.mtl +g blendShape1Set tweakSet1 +v -0.500000 -0.500000 0.500000 +v 0.000000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.000000 0.000000 0.500000 +v 0.500000 -0.000000 0.500000 +v -0.500000 0.610478 0.450004 +v 0.000000 0.610478 0.450004 +v 0.500000 0.500000 0.450004 +v -0.500000 0.610478 -0.049996 +v 0.000000 0.610478 -0.049996 +v 0.500000 0.500000 -0.049996 +v -0.500000 0.500000 -0.549996 +v 0.000000 0.500000 -0.549996 +v 0.500000 0.500000 -0.549996 +v -0.500000 0.000000 -0.500000 +v 0.000000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.000000 -0.375653 -0.500000 +v 0.500000 -0.375653 -0.500000 +v -0.500000 -0.500000 0.000000 +v 0.000000 -0.375653 0.000000 +v 0.500000 -0.375653 0.000000 +v 0.500000 0.000000 0.000000 +v -0.500000 0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.500000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.125000 +vt 0.500000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.250000 +vt 0.500000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.375000 +vt 0.500000 0.375000 +vt 0.625000 0.375000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 1.000000 +vt 0.500000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.250000 +vt 0.750000 0.250000 +vt 0.125000 0.000000 +vt 0.250000 0.000000 +vt 0.125000 0.125000 +vt 0.250000 0.125000 +vt 0.125000 0.250000 +vt 0.250000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.002548 0.046122 0.998933 +vn 0.000000 0.044977 0.998988 +vn 0.000000 0.000000 1.000000 +vn 0.005228 0.047326 0.998866 +vn 0.004356 0.085167 0.996357 +vn 0.000000 0.081624 0.996663 +vn 0.009907 0.089678 0.995922 +vn 0.000000 1.000000 0.000000 +vn 0.109810 0.993953 0.000000 +vn 0.082093 0.993238 -0.082093 +vn 0.000000 0.993953 -0.109810 +vn 0.215752 0.976448 0.000000 +vn 0.163245 0.985084 -0.054415 +vn 0.054415 0.985084 -0.163245 +vn 0.000000 0.976448 -0.215752 +vn 0.109154 0.988014 -0.109154 +vn 0.000000 -0.099497 -0.995038 +vn 0.000000 -0.099497 -0.995038 +vn 0.000000 -0.055055 -0.998483 +vn 0.000000 -0.053235 -0.998582 +vn 0.000000 -0.099497 -0.995038 +vn 0.000000 -0.057003 -0.998374 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.241343 -0.970440 0.000000 +vn 0.123397 -0.992357 0.000000 +vn 0.092176 -0.991467 -0.092176 +vn 0.183017 -0.981215 -0.061006 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -0.992357 -0.123397 +vn 0.061006 -0.981215 -0.183017 +vn 0.122468 -0.984887 -0.122468 +vn 0.000000 -0.970440 -0.241343 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +s 1 +g pCube1 +usemtl initialShadingGroup +f 1/1/1 2/2/2 5/5/3 4/4/4 +f 2/2/2 3/3/5 6/6/6 5/5/3 +f 4/4/4 5/5/3 8/8/7 7/7/8 +f 5/5/3 6/6/6 9/9/9 8/8/7 +s 2 +f 7/7/10 8/8/11 11/11/12 10/10/13 +f 8/8/11 9/9/14 12/12/15 11/11/12 +f 10/10/13 11/11/12 14/14/16 13/13/17 +f 11/11/12 12/12/15 15/15/18 14/14/16 +s 3 +f 13/13/19 14/14/20 17/17/21 16/16/22 +f 14/14/20 15/15/23 18/18/24 17/17/21 +f 16/16/22 17/17/21 20/20/25 19/19/26 +f 17/17/21 18/18/24 21/21/27 20/20/25 +s 4 +f 19/19/28 20/20/29 23/23/30 22/22/31 +f 20/20/29 21/21/32 24/24/33 23/23/30 +f 22/22/31 23/23/30 2/26/34 1/25/35 +f 23/23/30 24/24/33 3/27/36 2/26/34 +s 5 +f 24/29/37 21/28/38 18/30/39 25/31/40 +f 3/3/41 24/29/37 25/31/40 6/6/42 +f 25/31/40 18/30/39 15/32/43 12/33/44 +f 6/6/42 25/31/40 12/33/44 9/9/45 +s 6 +f 19/34/46 22/35/47 26/37/48 16/36/49 +f 22/35/47 1/1/50 4/4/51 26/37/48 +f 16/36/49 26/37/48 10/39/52 13/38/53 +f 26/37/48 4/4/51 7/7/54 10/39/52 diff --git a/modules/ufbx/data/maya_blend_inbetween_7500_ascii.fbx b/modules/ufbx/data/maya_blend_inbetween_7500_ascii.fbx new file mode 100644 index 0000000..2f7ff15 --- /dev/null +++ b/modules/ufbx/data/maya_blend_inbetween_7500_ascii.fbx @@ -0,0 +1,585 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 7 + Day: 17 + Hour: 19 + Minute: 42 + Second: 58 + Millisecond: 672 + } + Creator: "FBX SDK/FBX Plugins version 2020.1.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_blend_inbetween_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_blend_inbetween_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "202004" + P: "Original|DateTime_GMT", "DateTime", "", "", "17/07/2021 16:42:58.670" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_blend_inbetween_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "202004" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "17/07/2021 16:42:58.670" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\blend_between.ma" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2044649186144, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 18 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 6 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Deformer" { + Count: 3 + } + ObjectType: "AnimationCurveNode" { + Count: 2 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 2 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2044249333584, "Geometry::", "Mesh" { + Vertices: *78 { + a: -0.5,-0.5,0.5,0,-0.5,0.5,0.5,-0.5,0.5,-0.5,0,0.5,0,0,0.5,0.5,0,0.5,-0.5,0.5,0.5,0,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,0,0,0.5,0,0.5,0.5,0,-0.5,0.5,-0.5,0,0.5,-0.5,0.5,0.5,-0.5,-0.5,0,-0.5,0,0,-0.5,0.5,0,-0.5,-0.5,-0.5,-0.5,0,-0.5,-0.5,0.5,-0.5,-0.5,-0.5,-0.5,0,0,-0.5,0,0.5,-0.5,0,0.5,0,0,-0.5,0,0 + } + PolygonVertexIndex: *96 { + a: 0,1,4,-4,1,2,5,-5,3,4,7,-7,4,5,8,-8,6,7,10,-10,7,8,11,-11,9,10,13,-13,10,11,14,-14,12,13,16,-16,13,14,17,-17,15,16,19,-19,16,17,20,-20,18,19,22,-22,19,20,23,-23,21,22,1,-1,22,23,2,-2,23,20,17,-25,2,23,24,-6,24,17,14,-12,5,24,11,-9,18,21,25,-16,21,0,3,-26,15,25,9,-13,25,3,6,-10 + } + Edges: *48 { + a: 0,4,2,6,10,14,18,22,26,30,34,38,42,46,50,54,3,1,5,11,9,13,19,17,21,27,25,29,35,33,37,43,41,45,51,49,53,59,57,61,66,70,67,75,82,86,81,89 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *288 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *96 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *78 { + a: 0.375,0,0.5,0,0.625,0,0.375,0.125,0.5,0.125,0.625,0.125,0.375,0.25,0.5,0.25,0.625,0.25,0.375,0.375,0.5,0.375,0.625,0.375,0.375,0.5,0.5,0.5,0.625,0.5,0.375,0.625,0.5,0.625,0.625,0.625,0.375,0.75,0.5,0.75,0.625,0.75,0.375,0.875,0.5,0.875,0.625,0.875,0.375,1,0.5,1,0.625,1,0.875,0,0.75,0,0.875,0.125,0.75,0.125,0.875,0.25,0.75,0.25,0.125,0,0.25,0,0.125,0.125,0.25,0.125,0.125,0.25,0.25,0.25 + } + UVIndex: *96 { + a: 0,1,4,3,1,2,5,4,3,4,7,6,4,5,8,7,6,7,10,9,7,8,11,10,9,10,13,12,10,11,14,13,12,13,16,15,13,14,17,16,15,16,19,18,16,17,20,19,18,19,22,21,19,20,23,22,21,22,25,24,22,23,26,25,28,27,29,30,2,28,30,5,30,29,31,32,5,30,32,8,33,34,36,35,34,0,3,36,35,36,38,37,36,3,6,38 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2044643181632, "Geometry::KeyBlend.LiftTop0", "Shape" { + Properties70: { + } + Version: 100 + Indexes: *4 { + a: 6,7,9,10 + } + Vertices: *12 { + a: 0,-0.123324779287941,0,0,-0.12332478594908,0,0,-0.12332478594908,0,0,-0.12332478594908,0 + } + Normals: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Geometry: 2044643187392, "Geometry::LiftTop", "Shape" { + Properties70: { + } + Version: 100 + Indexes: *8 { + a: 6,7,9,10,19,20,22,23 + } + Vertices: *24 { + a: 0,0.174181823233084,0,0,0.174181809910806,0,0,0.174181809910806,0,0,0.174181809910806,0,0,0.15822790893435,0,0,0.15822790893435,0,0,0.15822790893435,0,0,0.15822790893435,0 + } + Normals: *24 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Geometry: 2044643187680, "Geometry::KeyBlend.MoveToSide0", "Shape" { + Properties70: { + } + Version: 100 + Indexes: *9 { + a: 6,7,8,9,10,11,12,13,14 + } + Vertices: *27 { + a: 0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0 + } + Normals: *27 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Geometry: 2044643186240, "Geometry::KeyBlend.MoveToSide1", "Shape" { + Properties70: { + } + Version: 100 + Indexes: *9 { + a: 6,7,8,9,10,11,12,13,14 + } + Vertices: *27 { + a: 0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515 + } + Normals: *27 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Geometry: 2044643181920, "Geometry::MoveToSide", "Shape" { + Properties70: { + } + Version: 100 + Indexes: *9 { + a: 6,7,8,9,10,11,12,13,14 + } + Vertices: *27 { + a: 0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162 + } + Normals: *27 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Model: 2044251505088, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2044478081744, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2044652614080, "Deformer::KeyBlend", "BlendShape" { + Version: 100 + Properties70: { + P: "RootGroup", "KString", "", "", "" + P: "RootGroup|LiftTop", "KString", "", "", "" + P: "RootGroup|MoveToSide", "KString", "", "", "" + } + } + Deformer: 2044639025232, "SubDeformer::KeyBlend.LiftTop", "BlendShapeChannel" { + Version: 100 + Properties70: { + P: "DeformPercent", "Number", "", "A+",-100 + } + DeformPercent: -100 + FullWeights: *2 { + a: 50,100 + } + } + Deformer: 2044639025392, "SubDeformer::KeyBlend.MoveToSide", "BlendShapeChannel" { + Version: 100 + Properties70: { + P: "DeformPercent", "Number", "", "A+",200 + } + DeformPercent: 200 + FullWeights: *3 { + a: -49.9,-24.9,100 + } + } + AnimationStack: 2044625016480, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2044639029872, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,230930790000 + } + KeyValueFloat: *2 { + a: -100,200 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2044639026192, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,230930790000 + } + KeyValueFloat: *2 { + a: 200,-100 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2044625020848, "AnimCurveNode::DeformPercent", "" { + Properties70: { + P: "d|DeformPercent", "Number", "", "A",-100 + } + } + AnimationCurveNode: 2044625016688, "AnimCurveNode::DeformPercent", "" { + Properties70: { + P: "d|DeformPercent", "Number", "", "A",200 + } + } + AnimationLayer: 2044591074064, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2044251505088,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2044591074064,2044625016480 + + ;AnimCurveNode::DeformPercent, AnimLayer::BaseLayer + C: "OO",2044625020848,2044591074064 + + ;AnimCurveNode::DeformPercent, AnimLayer::BaseLayer + C: "OO",2044625016688,2044591074064 + + ;Deformer::KeyBlend, Geometry:: + C: "OO",2044652614080,2044249333584 + + ;Geometry::, Model::pCube1 + C: "OO",2044249333584,2044251505088 + + ;Material::lambert1, Model::pCube1 + C: "OO",2044478081744,2044251505088 + + ;SubDeformer::KeyBlend.LiftTop, Deformer::KeyBlend + C: "OO",2044639025232,2044652614080 + + ;SubDeformer::KeyBlend.MoveToSide, Deformer::KeyBlend + C: "OO",2044639025392,2044652614080 + + ;Geometry::KeyBlend.LiftTop0, SubDeformer::KeyBlend.LiftTop + C: "OO",2044643181632,2044639025232 + + ;Geometry::LiftTop, SubDeformer::KeyBlend.LiftTop + C: "OO",2044643187392,2044639025232 + + ;AnimCurveNode::DeformPercent, SubDeformer::KeyBlend.LiftTop + C: "OP",2044625020848,2044639025232, "DeformPercent" + + ;AnimCurve::, AnimCurveNode::DeformPercent + C: "OP",2044639029872,2044625020848, "d|DeformPercent" + + ;Geometry::KeyBlend.MoveToSide0, SubDeformer::KeyBlend.MoveToSide + C: "OO",2044643187680,2044639025392 + + ;Geometry::KeyBlend.MoveToSide1, SubDeformer::KeyBlend.MoveToSide + C: "OO",2044643186240,2044639025392 + + ;Geometry::MoveToSide, SubDeformer::KeyBlend.MoveToSide + C: "OO",2044643181920,2044639025392 + + ;AnimCurveNode::DeformPercent, SubDeformer::KeyBlend.MoveToSide + C: "OP",2044625016688,2044639025392, "DeformPercent" + + ;AnimCurve::, AnimCurveNode::DeformPercent + C: "OP",2044639026192,2044625016688, "d|DeformPercent" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_blend_inbetween_7500_binary.fbx b/modules/ufbx/data/maya_blend_inbetween_7500_binary.fbx new file mode 100644 index 0000000..2153124 Binary files /dev/null and b/modules/ufbx/data/maya_blend_inbetween_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_blend_inbetween_80.obj b/modules/ufbx/data/maya_blend_inbetween_80.obj new file mode 100644 index 0000000..8b3f221 --- /dev/null +++ b/modules/ufbx/data/maya_blend_inbetween_80.obj @@ -0,0 +1,155 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_blend_between_80.mtl +g blendShape1Set tweakSet1 +v -0.500000 -0.500000 0.500000 +v 0.000000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.000000 0.000000 0.500000 +v 0.500000 -0.000000 0.500000 +v 0.151532 0.799726 0.434005 +v 0.651532 0.799726 0.434005 +v 1.151532 0.500000 0.434005 +v 0.151532 0.799726 -0.065995 +v 0.651532 0.799726 -0.065995 +v 1.151532 0.500000 -0.065995 +v 0.151532 0.500000 -0.565995 +v 0.651532 0.500000 -0.565995 +v 1.151532 0.500000 -0.565995 +v -0.500000 0.000000 -0.500000 +v 0.000000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.000000 -0.275002 -0.500000 +v 0.500000 -0.275002 -0.500000 +v -0.500000 -0.500000 0.000000 +v 0.000000 -0.275002 0.000000 +v 0.500000 -0.275002 0.000000 +v 0.500000 0.000000 0.000000 +v -0.500000 0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.500000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.125000 +vt 0.500000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.250000 +vt 0.500000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.375000 +vt 0.500000 0.375000 +vt 0.625000 0.375000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 1.000000 +vt 0.500000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.250000 +vt 0.750000 0.250000 +vt 0.125000 0.000000 +vt 0.250000 0.000000 +vt 0.125000 0.125000 +vt 0.250000 0.125000 +vt 0.125000 0.250000 +vt 0.250000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.004258 0.050215 0.998729 +vn 0.000000 0.039174 0.999232 +vn 0.000000 0.000000 1.000000 +vn 0.017001 0.056720 0.998245 +vn 0.015650 0.079287 0.996729 +vn 0.000000 0.082242 0.996612 +vn 0.023327 0.077829 0.996694 +vn 0.000000 1.000000 -0.000000 +vn 0.287107 0.957899 -0.000000 +vn 0.211339 0.954291 -0.211339 +vn 0.000000 0.957898 -0.287107 +vn 0.514150 0.857700 0.000000 +vn 0.406276 0.903659 -0.135425 +vn 0.135425 0.903659 -0.406276 +vn 0.000000 0.857700 -0.514150 +vn 0.275959 0.920703 -0.275959 +vn 0.000000 -0.130855 -0.991402 +vn 0.000000 -0.130855 -0.991402 +vn 0.000000 -0.079143 -0.996863 +vn 0.000000 -0.046294 -0.998928 +vn 0.000000 -0.130855 -0.991402 +vn 0.000000 -0.097452 -0.995240 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.410362 -0.911923 0.000000 +vn 0.219511 -0.975610 0.000000 +vn 0.162706 -0.973167 -0.162706 +vn 0.317975 -0.942156 -0.105992 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -0.975610 -0.219511 +vn 0.105992 -0.942156 -0.317975 +vn 0.214406 -0.952922 -0.214406 +vn 0.000000 -0.911923 -0.410362 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.759901 -0.650039 0.000000 +vn 0.787051 -0.616888 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.812584 -0.582845 0.000000 +vn 0.608809 -0.793317 0.000000 +vn 0.608809 -0.793317 0.000000 +vn 0.608809 -0.793317 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.882850 0.464876 -0.066834 +vn -0.859818 0.489103 -0.146597 +vn -1.000000 0.000000 0.000000 +vn -0.896839 0.442356 0.000000 +vn -0.748287 0.657486 -0.088192 +vn -0.701572 0.682597 -0.204592 +vn -0.775281 0.631617 0.000000 +s 1 +g pCube1 +usemtl initialShadingGroup +f 1/1/1 2/2/2 5/5/3 4/4/4 +f 2/2/2 3/3/5 6/6/6 5/5/3 +f 4/4/4 5/5/3 8/8/7 7/7/8 +f 5/5/3 6/6/6 9/9/9 8/8/7 +s 2 +f 7/7/10 8/8/11 11/11/12 10/10/13 +f 8/8/11 9/9/14 12/12/15 11/11/12 +f 10/10/13 11/11/12 14/14/16 13/13/17 +f 11/11/12 12/12/15 15/15/18 14/14/16 +s 3 +f 13/13/19 14/14/20 17/17/21 16/16/22 +f 14/14/20 15/15/23 18/18/24 17/17/21 +f 16/16/22 17/17/21 20/20/25 19/19/26 +f 17/17/21 18/18/24 21/21/27 20/20/25 +s 4 +f 19/19/28 20/20/29 23/23/30 22/22/31 +f 20/20/29 21/21/32 24/24/33 23/23/30 +f 22/22/31 23/23/30 2/26/34 1/25/35 +f 23/23/30 24/24/33 3/27/36 2/26/34 +s 5 +f 24/29/37 21/28/38 18/30/39 25/31/40 +f 3/3/41 24/29/37 25/31/40 6/6/42 +f 25/31/40 18/30/39 15/32/43 12/33/44 +f 6/6/42 25/31/40 12/33/44 9/9/45 +s 6 +f 19/34/46 22/35/47 26/37/48 16/36/49 +f 22/35/47 1/1/50 4/4/51 26/37/48 +f 16/36/49 26/37/48 10/39/52 13/38/53 +f 26/37/48 4/4/51 7/7/54 10/39/52 diff --git a/modules/ufbx/data/maya_blend_inbetween_89.obj b/modules/ufbx/data/maya_blend_inbetween_89.obj new file mode 100644 index 0000000..a5d625c --- /dev/null +++ b/modules/ufbx/data/maya_blend_inbetween_89.obj @@ -0,0 +1,155 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_blend_between_89.mtl +g blendShape1Set tweakSet1 +v -0.500000 -0.500000 0.500000 +v 0.000000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.000000 0.000000 0.500000 +v 0.500000 -0.000000 0.500000 +v -0.484417 0.968897 0.498850 +v 0.015583 0.968897 0.498850 +v 0.515583 0.500000 0.498850 +v -0.484417 0.968897 -0.001150 +v 0.015583 0.968897 -0.001150 +v 0.515583 0.500000 -0.001150 +v -0.484417 0.500000 -0.501150 +v 0.015583 0.500000 -0.501150 +v 0.515583 0.500000 -0.501150 +v -0.500000 0.000000 -0.500000 +v 0.000000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.000000 -0.185029 -0.500000 +v 0.500000 -0.185029 -0.500000 +v -0.500000 -0.500000 0.000000 +v 0.000000 -0.185029 0.000000 +v 0.500000 -0.185029 0.000000 +v 0.500000 0.000000 0.000000 +v -0.500000 0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.500000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.125000 +vt 0.500000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.250000 +vt 0.500000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.375000 +vt 0.500000 0.375000 +vt 0.625000 0.375000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 1.000000 +vt 0.500000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.250000 +vt 0.750000 0.250000 +vt 0.125000 0.000000 +vt 0.250000 0.000000 +vt 0.125000 0.125000 +vt 0.250000 0.125000 +vt 0.125000 0.250000 +vt 0.250000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000197 0.000848 1.000000 +vn 0.000000 0.000780 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000438 0.000933 1.000000 +vn 0.000212 0.001293 0.999999 +vn 0.000000 0.001187 0.999999 +vn 0.000727 0.001550 0.999999 +vn 0.000000 1.000000 -0.000000 +vn 0.424543 0.905408 -0.000000 +vn 0.307752 0.900321 -0.307752 +vn 0.000000 0.905408 -0.424543 +vn 0.684055 0.729430 0.000000 +vn 0.565003 0.803307 -0.188334 +vn 0.188334 0.803307 -0.565003 +vn 0.000000 0.729430 -0.684055 +vn 0.390784 0.833412 -0.390784 +vn 0.000000 -0.002300 -0.999997 +vn 0.000000 -0.002300 -0.999997 +vn 0.000000 -0.001506 -0.999999 +vn 0.000000 -0.001354 -0.999999 +vn 0.000000 -0.002300 -0.999997 +vn 0.000000 -0.001688 -0.999999 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.533003 -0.846114 0.000000 +vn 0.300422 -0.953807 0.000000 +vn 0.220820 -0.949988 -0.220820 +vn 0.422914 -0.895137 -0.140971 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -0.953807 -0.300422 +vn 0.140971 -0.895137 -0.422914 +vn 0.287718 -0.913475 -0.287718 +vn 0.000000 -0.846114 -0.533003 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.999741 -0.022751 0.000000 +vn 0.999792 -0.020398 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.999829 -0.018481 0.000000 +vn 0.999515 -0.031150 0.000000 +vn 0.999515 -0.031150 0.000000 +vn 0.999515 -0.031150 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.999930 0.011525 -0.002700 +vn -0.999903 0.012624 -0.005919 +vn -1.000000 0.000000 0.000000 +vn -0.999944 0.010605 -0.000000 +vn -0.999842 0.017531 -0.002818 +vn -0.999726 0.021196 -0.009939 +vn -0.999871 0.016081 -0.000000 +s 1 +g pCube1 +usemtl initialShadingGroup +f 1/1/1 2/2/2 5/5/3 4/4/4 +f 2/2/2 3/3/5 6/6/6 5/5/3 +f 4/4/4 5/5/3 8/8/7 7/7/8 +f 5/5/3 6/6/6 9/9/9 8/8/7 +s 2 +f 7/7/10 8/8/11 11/11/12 10/10/13 +f 8/8/11 9/9/14 12/12/15 11/11/12 +f 10/10/13 11/11/12 14/14/16 13/13/17 +f 11/11/12 12/12/15 15/15/18 14/14/16 +s 3 +f 13/13/19 14/14/20 17/17/21 16/16/22 +f 14/14/20 15/15/23 18/18/24 17/17/21 +f 16/16/22 17/17/21 20/20/25 19/19/26 +f 17/17/21 18/18/24 21/21/27 20/20/25 +s 4 +f 19/19/28 20/20/29 23/23/30 22/22/31 +f 20/20/29 21/21/32 24/24/33 23/23/30 +f 22/22/31 23/23/30 2/26/34 1/25/35 +f 23/23/30 24/24/33 3/27/36 2/26/34 +s 5 +f 24/29/37 21/28/38 18/30/39 25/31/40 +f 3/3/41 24/29/37 25/31/40 6/6/42 +f 25/31/40 18/30/39 15/32/43 12/33/44 +f 6/6/42 25/31/40 12/33/44 9/9/45 +s 6 +f 19/34/46 22/35/47 26/37/48 16/36/49 +f 22/35/47 1/1/50 4/4/51 26/37/48 +f 16/36/49 26/37/48 10/39/52 13/38/53 +f 26/37/48 4/4/51 7/7/54 10/39/52 diff --git a/modules/ufbx/data/maya_blend_shape_cube_6100_ascii.fbx b/modules/ufbx/data/maya_blend_shape_cube_6100_ascii.fbx new file mode 100644 index 0000000..df242d2 --- /dev/null +++ b/modules/ufbx/data/maya_blend_shape_cube_6100_ascii.fbx @@ -0,0 +1,369 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 7 + Day: 15 + Hour: 12 + Minute: 9 + Second: 49 + Millisecond: 62 + } + Creator: "FBX SDK/FBX Plugins version 2020.1.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + Property: "TopH", "Number", "A+N",100 + Property: "TopV", "Number", "A+N",100 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.499999970197678,0.5,0.5,-0.5,0.5,-0.5,0.500000059604645,0.5,-0.5,-0.5,-0.5 + ,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,-5.96046447753906e-08,0,1,-5.96046447753906e-08,0,1,-5.96046447753906e-08,0,1,-5.96046447753906e-08 + ,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,4.4703483581543e-08,1,0,4.4703483581543e-08,1,0 + ,4.4703483581543e-08,1,0,4.4703483581543e-08,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Shape: "TopH" { + Indexes: 2,3,4,5 + Vertices: 0.316956400871277,0,0,-0.316956371068954,0,0,0.316956400871277,0,0,-0.316956400871277,0,0 + Normals: 0,0,0,0,0,0,0,0,0,0,0,0 + } + Shape: "TopV" { + Indexes: 2,3,4,5 + Vertices: 0,0,-0.283916115760803,0,0,-0.283916115760803,0,0,0.283916115760803,0,0,0.283916115760803 + Normals: 0,0,0,0,0,0,0,0,0,0,0,0 + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_blend_shape_cube_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_blend_shape_cube_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "202004" + Property: "Original|DateTime_GMT", "DateTime", "", "15/07/2021 09:09:49.062" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_blend_shape_cube_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "202004" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "15/07/2021 09:09:49.062" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\cube_blend.ma" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::pCube1" { + Version: 1.1 + Channel: "TopH" { + Default: 100 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,100,U,s,0,0,n,46186158000,0,U,s,0,0,n,115465395000,100,U,s,0,0,n + Color: 1,1,1 + } + Channel: "TopV" { + Default: 100 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,100,U,s,0,0,n,76976930000,0,U,s,0,0,n,173198092500,100,U,s,0,0,n + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_blend_shape_cube_6100_binary.fbx b/modules/ufbx/data/maya_blend_shape_cube_6100_binary.fbx new file mode 100644 index 0000000..26d6fa8 Binary files /dev/null and b/modules/ufbx/data/maya_blend_shape_cube_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_blend_shape_cube_7100_ascii.fbx b/modules/ufbx/data/maya_blend_shape_cube_7100_ascii.fbx new file mode 100644 index 0000000..5912cd3 --- /dev/null +++ b/modules/ufbx/data/maya_blend_shape_cube_7100_ascii.fbx @@ -0,0 +1,534 @@ +; FBX 7.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7100 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 1 + Hour: 17 + Minute: 13 + Second: 46 + Millisecond: 408 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_blend_shape_cube_7100_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_blend_shape_cube_7100_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "01/09/2021 14:13:46.406" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_blend_shape_cube_7100_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "01/09/2021 14:13:46.406" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2191579273584, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 11 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 2 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 2 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 2 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2191613840144, "Geometry::", "Mesh" { + Properties70: { + P: "TopH", "Number", "", "A+",100 + P: "TopV", "Number", "", "A+",100 + } + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.499999970197678,0.5,0.5,-0.5,0.5,-0.5,0.500000059604645,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,1,2,3,5,6,7,9,10,11,13,15 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,-5.96046447753906e-08,0,1,-5.96046447753906e-08,0,1,-5.96046447753906e-08,0,1,-5.96046447753906e-08,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,4.4703483581543e-08,1,0,4.4703483581543e-08,1,0,4.4703483581543e-08,1,0,4.4703483581543e-08,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,-5.96046447753906e-08,-1,0,-5.96046447753906e-08,-1,0,-5.96046447753906e-08,-1,0,-5.96046447753906e-08,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,4.4703483581543e-08,0,-1,4.4703483581543e-08,0,-1,4.4703483581543e-08,-0,-1,4.4703483581543e-08,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Shape: "TopH" { + Indexes: *4 { + a: 2,3,4,5 + } + Vertices: *12 { + a: 0.316956400871277,0,0,-0.316956371068954,0,0,0.316956400871277,0,0,-0.316956400871277,0,0 + } + Normals: *12 { + a: 0,0,0,0,0,0,0,0,5.96046447753906e-08,0,0,5.96046447753906e-08 + } + } + Shape: "TopV" { + Indexes: *4 { + a: 2,3,4,5 + } + Vertices: *12 { + a: 0,0,-0.283916115760803,0,0,-0.283916115760803,0,0,0.283916115760803,0,0,0.283916115760803 + } + Normals: *12 { + a: 0,0.273121476173401,-0.0380204319953918,0,0.273121476173401,-0.0380204319953918,0,0,-7.83155087447085e-08,0,0,-7.83155087447085e-08 + } + } + } + Model: 2191595724400, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2192722144752, "Material::lambert2", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Material: 2192722148752, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2191568712048, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2191566981504, "AnimCurve::", "" { + Default: 0 + KeyVer: 4007 + KeyTime: *3 { + a: 1924423250,46186158000,115465395000 + } + KeyValueFloat: *3 { + a: 100,0,100 + } + ;KeyAttrFlags: Cubic|TangeantUser, Cubic|TangeantUser, Cubic|TangeantUser + KeyAttrFlags: *3 { + a: 1032,1032,1032 + } + KeyAttrDataFloat: *12 { + a: 0,0,4.099946e-31,0,0,0,4.099946e-31,0,0,0,4.099946e-31,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2191566989344, "AnimCurve::", "" { + Default: 0 + KeyVer: 4007 + KeyTime: *3 { + a: 1924423250,76976930000,173198092500 + } + KeyValueFloat: *3 { + a: 100,0,100 + } + ;KeyAttrFlags: Cubic|TangeantUser, Cubic|TangeantUser, Cubic|TangeantUser + KeyAttrFlags: *3 { + a: 1032,1032,1032 + } + KeyAttrDataFloat: *12 { + a: 0,0,4.099946e-31,0,0,0,4.099946e-31,0,0,0,4.099946e-31,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurveNode: 2192724844800, "AnimCurveNode::TopH", "" { + Properties70: { + P: "d|TopH", "Number", "", "A",100 + } + } + AnimationCurveNode: 2192724845216, "AnimCurveNode::TopV", "" { + Properties70: { + P: "d|TopV", "Number", "", "A",100 + } + } + AnimationLayer: 2191579084400, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2191595724400,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2191579084400,2191568712048 + + ;AnimCurveNode::TopH, AnimLayer::BaseLayer + C: "OO",2192724844800,2191579084400 + + ;AnimCurveNode::TopV, AnimLayer::BaseLayer + C: "OO",2192724845216,2191579084400 + + ;AnimCurveNode::TopH, Geometry:: + C: "OP",2192724844800,2191613840144, "TopH" + + ;AnimCurveNode::TopV, Geometry:: + C: "OP",2192724845216,2191613840144, "TopV" + + ;Geometry::, Model::pCube1 + C: "OO",2191613840144,2191595724400 + + ;Material::lambert2, Model::pCube1 + C: "OO",2192722144752,2191595724400 + + ;AnimCurve::, AnimCurveNode::TopH + C: "OP",2191566981504,2192724844800, "d|TopH" + + ;AnimCurve::, AnimCurveNode::TopV + C: "OP",2191566989344,2192724845216, "d|TopV" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_blend_shape_cube_7100_binary.fbx b/modules/ufbx/data/maya_blend_shape_cube_7100_binary.fbx new file mode 100644 index 0000000..419afd8 Binary files /dev/null and b/modules/ufbx/data/maya_blend_shape_cube_7100_binary.fbx differ diff --git a/modules/ufbx/data/maya_blend_shape_cube_7700_ascii.fbx b/modules/ufbx/data/maya_blend_shape_cube_7700_ascii.fbx new file mode 100644 index 0000000..0e254bd --- /dev/null +++ b/modules/ufbx/data/maya_blend_shape_cube_7700_ascii.fbx @@ -0,0 +1,534 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 7 + Day: 15 + Hour: 12 + Minute: 8 + Second: 58 + Millisecond: 196 + } + Creator: "FBX SDK/FBX Plugins version 2020.1.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_blend_shape_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_blend_shape_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "202004" + P: "Original|DateTime_GMT", "DateTime", "", "", "15/07/2021 09:08:58.196" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_blend_shape_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "202004" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "15/07/2021 09:08:58.196" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\cube_blend.ma" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2111027756896, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 15 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 3 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Deformer" { + Count: 3 + } + ObjectType: "AnimationCurveNode" { + Count: 2 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 2 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2109941184304, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.499999970197678,0.5,0.5,-0.5,0.5,-0.5,0.500000059604645,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,-5.96046447753906e-08,0,1,-5.96046447753906e-08,0,1,-5.96046447753906e-08,0,1,-5.96046447753906e-08,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,4.4703483581543e-08,1,0,4.4703483581543e-08,1,0,4.4703483581543e-08,1,0,4.4703483581543e-08,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2111026653664, "Geometry::TopH", "Shape" { + Properties70: { + P: "LegacyStyle", "bool", "", "",0 + } + Version: 101 + Indexes: *4 { + a: 2,3,4,5 + } + Vertices: *12 { + a: 0.316956400871277,0,0,-0.316956371068954,0,0,0.316956400871277,0,0,-0.316956400871277,0,0 + } + } + Geometry: 2111026656256, "Geometry::TopV", "Shape" { + Properties70: { + P: "LegacyStyle", "bool", "", "",0 + } + Version: 101 + Indexes: *4 { + a: 2,3,4,5 + } + Vertices: *12 { + a: 0,0,-0.283916115760803,0,0,-0.283916115760803,0,0,0.283916115760803,0,0,0.283916115760803 + } + } + Model: 2110163928912, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2110650859536, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2111029908624, "Deformer::Squish", "BlendShape" { + Version: 100 + Properties70: { + P: "RootGroup", "KString", "", "", "" + P: "RootGroup|Top", "KString", "", "", "" + P: "RootGroup|Top|TopH", "KString", "", "", "" + P: "RootGroup|Top|TopV", "KString", "", "", "" + } + } + Deformer: 2111027942368, "SubDeformer::Squish.TopH", "BlendShapeChannel" { + Version: 100 + Properties70: { + P: "DeformPercent", "Number", "", "A+",100 + } + DeformPercent: 100 + FullWeights: *1 { + a: 100 + } + } + Deformer: 2111027940448, "SubDeformer::Squish.TopV", "BlendShapeChannel" { + Version: 100 + Properties70: { + P: "DeformPercent", "Number", "", "A+",100 + } + DeformPercent: 100 + FullWeights: *1 { + a: 100 + } + } + AnimationStack: 2110996893728, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2111027945728, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,46186158000,115465395000 + } + KeyValueFloat: *3 { + a: 100,0,100 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2111027942688, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,76976930000,173198092500 + } + KeyValueFloat: *3 { + a: 100,0,100 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurveNode: 2110996899344, "AnimCurveNode::DeformPercent", "" { + Properties70: { + P: "d|DeformPercent", "Number", "", "A",100 + } + } + AnimationCurveNode: 2110996897056, "AnimCurveNode::DeformPercent", "" { + Properties70: { + P: "d|DeformPercent", "Number", "", "A",100 + } + } + AnimationLayer: 2110994045456, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2110163928912,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2110994045456,2110996893728 + + ;AnimCurveNode::DeformPercent, AnimLayer::BaseLayer + C: "OO",2110996899344,2110994045456 + + ;AnimCurveNode::DeformPercent, AnimLayer::BaseLayer + C: "OO",2110996897056,2110994045456 + + ;Deformer::Squish, Geometry:: + C: "OO",2111029908624,2109941184304 + + ;Geometry::, Model::pCube1 + C: "OO",2109941184304,2110163928912 + + ;Material::lambert1, Model::pCube1 + C: "OO",2110650859536,2110163928912 + + ;SubDeformer::Squish.TopH, Deformer::Squish + C: "OO",2111027942368,2111029908624 + + ;SubDeformer::Squish.TopV, Deformer::Squish + C: "OO",2111027940448,2111029908624 + + ;Geometry::TopH, SubDeformer::Squish.TopH + C: "OO",2111026653664,2111027942368 + + ;AnimCurveNode::DeformPercent, SubDeformer::Squish.TopH + C: "OP",2110996899344,2111027942368, "DeformPercent" + + ;AnimCurve::, AnimCurveNode::DeformPercent + C: "OP",2111027945728,2110996899344, "d|DeformPercent" + + ;Geometry::TopV, SubDeformer::Squish.TopV + C: "OO",2111026656256,2111027940448 + + ;AnimCurveNode::DeformPercent, SubDeformer::Squish.TopV + C: "OP",2110996897056,2111027940448, "DeformPercent" + + ;AnimCurve::, AnimCurveNode::DeformPercent + C: "OP",2111027942688,2110996897056, "d|DeformPercent" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_blend_shape_cube_7700_binary.fbx b/modules/ufbx/data/maya_blend_shape_cube_7700_binary.fbx new file mode 100644 index 0000000..f9716a0 Binary files /dev/null and b/modules/ufbx/data/maya_blend_shape_cube_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_bone_radius_6100_ascii.fbx b/modules/ufbx/data/maya_bone_radius_6100_ascii.fbx new file mode 100644 index 0000000..eddefdc --- /dev/null +++ b/modules/ufbx/data/maya_bone_radius_6100_ascii.fbx @@ -0,0 +1,854 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Front" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 23 + Hour: 22 + Minute: 3 + Second: 42 + Millisecond: 111 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 10 + ObjectType: "Model" { + Count: 8 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::joint1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,1.05933751153204e-30,135 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1,0,-2.45763754361911e-31 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",6.66666666666667 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint1_ncl1_1" + } + Model: "Model::joint2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-2.05514657192616e-15,-4.96156272660872e-15,45 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.82842712474619,1.11022302462516e-15,1.4791141972894e-31 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",13.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint2_ncl1_1" + } + Model: "Model::joint3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,-7.01670929853488e-15,45 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,-5.55111512312578e-16,2.59786816870648e-16 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint3_ncl1_1" + } + Model: "Model::joint4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-4.11029314385232e-15,9.92312545321743e-15,-45 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.82842712474619,-2.22044604925031e-16,-3.46382422494197e-16 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",26.6666666666667 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint4_ncl1_1" + } + Model: "Model::joint5", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-2.90641615468255e-15,7.01670929853487e-15,-45 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,1.27675647831893e-15,-5.19573633741296e-16 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint5_ncl1_1" + } + Model: "Model::joint6", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",3.90037301695231e-31,-9.41633343584034e-31,-45 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.82842712474619,4.44089209850063e-16,-3.46382422494197e-16 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",40 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint6_ncl1_1" + } + Model: "Model::joint7", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",179.999999146226,-7.01670932034726e-15,-45 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,-1.11022302462516e-16,1.76508820120713e-31 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",46.6666666666667 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint7_ncl1_1" + } + Model: "Model::joint8", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",179.999999396291,-0,-135 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.82842712474619,-8.88178414538625e-16,-3.46382435729087e-16 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",53.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint8_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_bone_radius_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_bone_radius_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "23/08/2021 19:03:42.110" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_bone_radius_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "23/08/2021 19:03:42.110" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Front" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::joint1", "Model::Scene" + Connect: "OO", "Model::joint2", "Model::joint1" + Connect: "OO", "Model::joint3", "Model::joint2" + Connect: "OO", "Model::joint4", "Model::joint3" + Connect: "OO", "Model::joint5", "Model::joint4" + Connect: "OO", "Model::joint6", "Model::joint5" + Connect: "OO", "Model::joint7", "Model::joint6" + Connect: "OO", "Model::joint8", "Model::joint7" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Front" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_bone_radius_7500_ascii.fbx b/modules/ufbx/data/maya_bone_radius_7500_ascii.fbx new file mode 100644 index 0000000..b538cf9 --- /dev/null +++ b/modules/ufbx/data/maya_bone_radius_7500_ascii.fbx @@ -0,0 +1,455 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 23 + Hour: 22 + Minute: 3 + Second: 32 + Millisecond: 224 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_bone_radius_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_bone_radius_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "23/08/2021 19:03:32.223" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_bone_radius_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "23/08/2021 19:03:32.223" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Front" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2299394100064, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 19 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 8 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "Model" { + Count: 8 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 2299396162592, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",6.66666666666667 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2299396159328, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",13.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2299396157600, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2299396166624, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",26.6666666666667 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2299396166816, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2299396157792, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",40 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2299396159904, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",46.6666666666667 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2299396163168, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",53.3333333333333 + } + TypeFlags: "Skeleton" + } + Model: 2298910464432, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,1.05933751153204e-30,135 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-1,0,-2.45763754361911e-31 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2298910531712, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-2.05514657192616e-15,-4.96156272660872e-15,45 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.82842712474619,1.11022302462516e-15,1.4791141972894e-31 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2298710631152, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,-7.01670929853488e-15,45 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,-5.55111512312578e-16,2.59786816870648e-16 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2298710621872, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-4.11029314385232e-15,9.92312545321743e-15,-45 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.82842712474619,-2.22044604925031e-16,-3.46382422494197e-16 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2299792609008, "Model::joint5", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-2.90641615468255e-15,7.01670929853487e-15,-45 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,1.27675647831893e-15,-5.19573633741296e-16 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2299915703488, "Model::joint6", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",3.90037301695231e-31,-9.41633343584034e-31,-45 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.82842712474619,4.44089209850063e-16,-3.46382422494197e-16 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2299915715088, "Model::joint7", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",179.999999146226,-7.01670932034726e-15,-45 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,-1.11022302462516e-16,1.76508820120713e-31 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2299915719728, "Model::joint8", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",179.999999396291,-0,-135 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.82842712474619,-8.88178414538625e-16,-3.46382435729087e-16 + } + Shading: Y + Culling: "CullingOff" + } + AnimationStack: 2299398607488, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2299425591088, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::joint1, Model::RootNode + C: "OO",2298910464432,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2299425591088,2299398607488 + + ;NodeAttribute::, Model::joint1 + C: "OO",2299396162592,2298910464432 + + ;Model::joint2, Model::joint1 + C: "OO",2298910531712,2298910464432 + + ;NodeAttribute::, Model::joint2 + C: "OO",2299396159328,2298910531712 + + ;Model::joint3, Model::joint2 + C: "OO",2298710631152,2298910531712 + + ;NodeAttribute::, Model::joint3 + C: "OO",2299396157600,2298710631152 + + ;Model::joint4, Model::joint3 + C: "OO",2298710621872,2298710631152 + + ;NodeAttribute::, Model::joint4 + C: "OO",2299396166624,2298710621872 + + ;Model::joint5, Model::joint4 + C: "OO",2299792609008,2298710621872 + + ;NodeAttribute::, Model::joint5 + C: "OO",2299396166816,2299792609008 + + ;Model::joint6, Model::joint5 + C: "OO",2299915703488,2299792609008 + + ;NodeAttribute::, Model::joint6 + C: "OO",2299396157792,2299915703488 + + ;Model::joint7, Model::joint6 + C: "OO",2299915715088,2299915703488 + + ;NodeAttribute::, Model::joint7 + C: "OO",2299396159904,2299915715088 + + ;Model::joint8, Model::joint7 + C: "OO",2299915719728,2299915715088 + + ;NodeAttribute::, Model::joint8 + C: "OO",2299396163168,2299915719728 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_cache_sine_12.obj b/modules/ufbx/data/maya_cache_sine_12.obj new file mode 100644 index 0000000..7594caa --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_12.obj @@ -0,0 +1,430 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -0.250367 -0.500000 0.500000 +v 0.749633 -0.500000 0.500000 +v -0.333053 -0.375000 0.500000 +v 0.666947 -0.375000 0.500000 +v -0.513535 -0.250000 0.500000 +v 0.486465 -0.250000 0.500000 +v -0.686088 -0.125000 0.500000 +v 0.313912 -0.125000 0.500000 +v -0.749633 0.000000 0.500000 +v 0.250367 0.000000 0.500000 +v -0.666947 0.125000 0.500000 +v 0.333053 0.125000 0.500000 +v -0.486465 0.250000 0.500000 +v 0.513535 0.250000 0.500000 +v -0.313912 0.375000 0.500000 +v 0.686088 0.375000 0.500000 +v -0.250367 0.500000 0.500000 +v 0.749633 0.500000 0.500000 +v -0.250367 0.500000 -0.500000 +v 0.749633 0.500000 -0.500000 +v -0.313912 0.375000 -0.500000 +v 0.686088 0.375000 -0.500000 +v -0.486465 0.250000 -0.500000 +v 0.513535 0.250000 -0.500000 +v -0.666947 0.125000 -0.500000 +v 0.333053 0.125000 -0.500000 +v -0.749633 0.000000 -0.500000 +v 0.250367 0.000000 -0.500000 +v -0.686088 -0.125000 -0.500000 +v 0.313912 -0.125000 -0.500000 +v -0.513535 -0.250000 -0.500000 +v 0.486465 -0.250000 -0.500000 +v -0.333053 -0.375000 -0.500000 +v 0.666947 -0.375000 -0.500000 +v -0.250367 -0.500000 -0.500000 +v 0.749633 -0.500000 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.031250 +vt 0.625000 0.031250 +vt 0.375000 0.062500 +vt 0.625000 0.062500 +vt 0.375000 0.093750 +vt 0.625000 0.093750 +vt 0.375000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.156250 +vt 0.625000 0.156250 +vt 0.375000 0.187500 +vt 0.625000 0.187500 +vt 0.375000 0.218750 +vt 0.625000 0.218750 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.531250 +vt 0.625000 0.531250 +vt 0.375000 0.562500 +vt 0.625000 0.562500 +vt 0.375000 0.593750 +vt 0.625000 0.593750 +vt 0.375000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.656250 +vt 0.625000 0.656250 +vt 0.375000 0.687500 +vt 0.625000 0.687500 +vt 0.375000 0.718750 +vt 0.625000 0.718750 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.031250 +vt 0.875000 0.062500 +vt 0.875000 0.093750 +vt 0.875000 0.125000 +vt 0.875000 0.156250 +vt 0.875000 0.187500 +vt 0.875000 0.218750 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.031250 +vt 0.125000 0.062500 +vt 0.125000 0.093750 +vt 0.125000 0.125000 +vt 0.125000 0.156250 +vt 0.125000 0.187500 +vt 0.125000 0.218750 +vt 0.125000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.834037 0.551708 0.000000 +vn 0.834037 0.551708 0.000000 +vn 0.688735 0.725013 0.000000 +vn 0.688735 0.725013 0.000000 +vn 0.577915 0.816097 0.000000 +vn 0.577915 0.816097 0.000000 +vn 0.727031 0.686604 0.000000 +vn 0.727031 0.686604 0.000000 +vn 0.997082 -0.076341 0.000000 +vn 0.997082 -0.076341 0.000000 +vn 0.688735 -0.725013 0.000000 +vn 0.688735 -0.725013 0.000000 +vn 0.577915 -0.816097 0.000000 +vn 0.577915 -0.816097 0.000000 +vn 0.727031 -0.686604 0.000000 +vn 0.727031 -0.686604 0.000000 +vn 0.891425 -0.453168 0.000000 +vn 0.891425 -0.453168 0.000000 +vn -0.834037 -0.551708 0.000000 +vn -0.834037 -0.551708 0.000000 +vn -0.688735 -0.725013 0.000000 +vn -0.688735 -0.725013 0.000000 +vn -0.577915 -0.816097 0.000000 +vn -0.577915 -0.816097 0.000000 +vn -0.727031 -0.686604 0.000000 +vn -0.727031 -0.686604 0.000000 +vn -0.997082 0.076340 0.000000 +vn -0.997082 0.076340 0.000000 +vn -0.688735 0.725013 0.000000 +vn -0.688735 0.725013 0.000000 +vn -0.577915 0.816097 0.000000 +vn -0.577915 0.816097 0.000000 +vn -0.727031 0.686604 0.000000 +vn -0.727031 0.686604 0.000000 +vn -0.891425 0.453168 0.000000 +vn -0.891425 0.453168 0.000000 +s 1 +g pCube1 +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/4 4/4/3 6/6/5 5/5/6 +f 5/5/6 6/6/5 8/8/7 7/7/8 +f 7/7/8 8/8/7 10/10/9 9/9/10 +f 9/9/10 10/10/9 12/12/11 11/11/12 +f 11/11/12 12/12/11 14/14/13 13/13/14 +f 13/13/14 14/14/13 16/16/15 15/15/16 +f 15/15/16 16/16/15 18/18/17 17/17/18 +s off +f 17/17/19 18/18/20 20/20/21 19/19/22 +s 2 +f 19/19/23 20/20/24 22/22/25 21/21/26 +f 21/21/26 22/22/25 24/24/27 23/23/28 +f 23/23/28 24/24/27 26/26/29 25/25/30 +f 25/25/30 26/26/29 28/28/31 27/27/32 +f 27/27/32 28/28/31 30/30/33 29/29/34 +f 29/29/34 30/30/33 32/32/35 31/31/36 +f 31/31/36 32/32/35 34/34/37 33/33/38 +f 33/33/38 34/34/37 36/36/39 35/35/40 +s off +f 35/35/41 36/36/42 2/38/43 1/37/44 +s 3 +f 2/2/45 36/39/46 34/40/47 4/4/48 +f 4/4/48 34/40/47 32/41/49 6/6/50 +f 6/6/50 32/41/49 30/42/51 8/8/52 +f 8/8/52 30/42/51 28/43/53 10/10/54 +f 10/10/54 28/43/53 26/44/55 12/12/56 +f 12/12/56 26/44/55 24/45/57 14/14/58 +f 14/14/58 24/45/57 22/46/59 16/16/60 +f 16/16/60 22/46/59 20/47/61 18/18/62 +s 4 +f 35/48/63 1/1/64 3/3/65 33/49/66 +f 33/49/66 3/3/65 5/5/67 31/50/68 +f 31/50/68 5/5/67 7/7/69 29/51/70 +f 29/51/70 7/7/69 9/9/71 27/52/72 +f 27/52/72 9/9/71 11/11/73 25/53/74 +f 25/53/74 11/11/73 13/13/75 23/54/76 +f 23/54/76 13/13/75 15/15/77 21/55/78 +f 21/55/78 15/15/77 17/17/79 19/56/80 +g default +v -0.500000 1.411241 0.500000 +v 0.500000 1.411241 0.500000 +v -0.449388 1.558431 0.449388 +v 0.449388 1.558431 0.449388 +v -0.435746 1.705620 0.435746 +v 0.435746 1.705620 0.435746 +v -0.429235 1.852810 0.429235 +v 0.429235 1.852810 0.429235 +v -0.427252 2.000000 0.427252 +v 0.427252 2.000000 0.427252 +v -0.429235 2.147190 0.429235 +v 0.429235 2.147190 0.429235 +v -0.435746 2.294380 0.435746 +v 0.435746 2.294380 0.435746 +v -0.449388 2.441569 0.449388 +v 0.449388 2.441569 0.449388 +v -0.500000 2.588759 0.500000 +v 0.500000 2.588759 0.500000 +v -0.500000 2.588759 -0.500000 +v 0.500000 2.588759 -0.500000 +v -0.449388 2.441569 -0.449388 +v 0.449388 2.441569 -0.449388 +v -0.435746 2.294380 -0.435746 +v 0.435746 2.294380 -0.435746 +v -0.429235 2.147190 -0.429235 +v 0.429235 2.147190 -0.429235 +v -0.427252 2.000000 -0.427252 +v 0.427252 2.000000 -0.427252 +v -0.429235 1.852810 -0.429235 +v 0.429235 1.852810 -0.429235 +v -0.435746 1.705620 -0.435746 +v 0.435746 1.705620 -0.435746 +v -0.449388 1.558431 -0.449388 +v 0.449388 1.558431 -0.449388 +v -0.500000 1.411241 -0.500000 +v 0.500000 1.411241 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.031250 +vt 0.625000 0.031250 +vt 0.375000 0.062500 +vt 0.625000 0.062500 +vt 0.375000 0.093750 +vt 0.625000 0.093750 +vt 0.375000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.156250 +vt 0.625000 0.156250 +vt 0.375000 0.187500 +vt 0.625000 0.187500 +vt 0.375000 0.218750 +vt 0.625000 0.218750 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.531250 +vt 0.625000 0.531250 +vt 0.375000 0.562500 +vt 0.625000 0.562500 +vt 0.375000 0.593750 +vt 0.625000 0.593750 +vt 0.375000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.656250 +vt 0.625000 0.656250 +vt 0.375000 0.687500 +vt 0.625000 0.687500 +vt 0.375000 0.718750 +vt 0.625000 0.718750 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.031250 +vt 0.875000 0.062500 +vt 0.875000 0.093750 +vt 0.875000 0.125000 +vt 0.875000 0.156250 +vt 0.875000 0.187500 +vt 0.875000 0.218750 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.031250 +vt 0.125000 0.062500 +vt 0.125000 0.093750 +vt 0.125000 0.125000 +vt 0.125000 0.156250 +vt 0.125000 0.187500 +vt 0.125000 0.218750 +vt 0.125000 0.250000 +vn 0.000000 0.325167 0.945657 +vn 0.000000 0.325167 0.945657 +vn 0.000000 0.231311 0.972880 +vn 0.000000 0.231311 0.972880 +vn 0.000000 0.069605 0.997575 +vn 0.000000 0.069605 0.997575 +vn 0.000000 0.029196 0.999574 +vn 0.000000 0.029196 0.999574 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.029196 0.999574 +vn 0.000000 -0.029196 0.999574 +vn 0.000000 -0.069605 0.997575 +vn 0.000000 -0.069605 0.997575 +vn 0.000000 -0.231311 0.972880 +vn 0.000000 -0.231311 0.972880 +vn 0.000000 -0.325167 0.945657 +vn 0.000000 -0.325167 0.945657 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -0.325167 -0.945657 +vn 0.000000 -0.325167 -0.945657 +vn 0.000000 -0.231311 -0.972880 +vn 0.000000 -0.231311 -0.972880 +vn 0.000000 -0.069605 -0.997575 +vn 0.000000 -0.069605 -0.997575 +vn 0.000000 -0.029196 -0.999574 +vn 0.000000 -0.029196 -0.999574 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.029196 -0.999574 +vn 0.000000 0.029196 -0.999574 +vn 0.000000 0.069605 -0.997575 +vn 0.000000 0.069605 -0.997575 +vn 0.000000 0.231311 -0.972880 +vn 0.000000 0.231311 -0.972880 +vn 0.000000 0.325167 -0.945657 +vn 0.000000 0.325167 -0.945657 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.945657 0.325167 0.000000 +vn 0.945657 0.325167 0.000000 +vn 0.972880 0.231311 0.000000 +vn 0.972880 0.231311 0.000000 +vn 0.997575 0.069605 0.000000 +vn 0.997575 0.069605 0.000000 +vn 0.999574 0.029197 0.000000 +vn 0.999574 0.029197 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.999574 -0.029197 0.000000 +vn 0.999574 -0.029197 0.000000 +vn 0.997575 -0.069605 0.000000 +vn 0.997575 -0.069605 0.000000 +vn 0.972880 -0.231311 0.000000 +vn 0.972880 -0.231311 0.000000 +vn 0.945657 -0.325167 0.000000 +vn 0.945657 -0.325167 0.000000 +vn -0.945657 0.325167 0.000000 +vn -0.945657 0.325167 0.000000 +vn -0.972880 0.231311 0.000000 +vn -0.972880 0.231311 0.000000 +vn -0.997575 0.069605 0.000000 +vn -0.997575 0.069605 0.000000 +vn -0.999574 0.029197 0.000000 +vn -0.999574 0.029197 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.999574 -0.029197 0.000000 +vn -0.999574 -0.029197 0.000000 +vn -0.997575 -0.069605 0.000000 +vn -0.997575 -0.069605 0.000000 +vn -0.972880 -0.231311 0.000000 +vn -0.972880 -0.231311 0.000000 +vn -0.945657 -0.325167 0.000000 +vn -0.945657 -0.325167 0.000000 +s 1 +g pCube2 +f 37/57/81 38/58/82 40/60/83 39/59/84 +f 39/59/84 40/60/83 42/62/85 41/61/86 +f 41/61/86 42/62/85 44/64/87 43/63/88 +f 43/63/88 44/64/87 46/66/89 45/65/90 +f 45/65/90 46/66/89 48/68/91 47/67/92 +f 47/67/92 48/68/91 50/70/93 49/69/94 +f 49/69/94 50/70/93 52/72/95 51/71/96 +f 51/71/96 52/72/95 54/74/97 53/73/98 +s off +f 53/73/99 54/74/100 56/76/101 55/75/102 +s 2 +f 55/75/103 56/76/104 58/78/105 57/77/106 +f 57/77/106 58/78/105 60/80/107 59/79/108 +f 59/79/108 60/80/107 62/82/109 61/81/110 +f 61/81/110 62/82/109 64/84/111 63/83/112 +f 63/83/112 64/84/111 66/86/113 65/85/114 +f 65/85/114 66/86/113 68/88/115 67/87/116 +f 67/87/116 68/88/115 70/90/117 69/89/118 +f 69/89/118 70/90/117 72/92/119 71/91/120 +s off +f 71/91/121 72/92/122 38/94/123 37/93/124 +s 3 +f 38/58/125 72/95/126 70/96/127 40/60/128 +f 40/60/128 70/96/127 68/97/129 42/62/130 +f 42/62/130 68/97/129 66/98/131 44/64/132 +f 44/64/132 66/98/131 64/99/133 46/66/134 +f 46/66/134 64/99/133 62/100/135 48/68/136 +f 48/68/136 62/100/135 60/101/137 50/70/138 +f 50/70/138 60/101/137 58/102/139 52/72/140 +f 52/72/140 58/102/139 56/103/141 54/74/142 +s 4 +f 71/104/143 37/57/144 39/59/145 69/105/146 +f 69/105/146 39/59/145 41/61/147 67/106/148 +f 67/106/148 41/61/147 43/63/149 65/107/150 +f 65/107/150 43/63/149 45/65/151 63/108/152 +f 63/108/152 45/65/151 47/67/153 61/109/154 +f 61/109/154 47/67/153 49/69/155 59/110/156 +f 59/110/156 49/69/155 51/71/157 57/111/158 +f 57/111/158 51/71/157 53/73/159 55/112/160 diff --git a/modules/ufbx/data/maya_cache_sine_18.obj b/modules/ufbx/data/maya_cache_sine_18.obj new file mode 100644 index 0000000..38f7f31 --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_18.obj @@ -0,0 +1,430 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -0.720878 -0.500000 0.500000 +v 0.279122 -0.500000 0.500000 +v -0.738988 -0.375000 0.500000 +v 0.261012 -0.375000 0.500000 +v -0.617102 -0.250000 0.500000 +v 0.382898 -0.250000 0.500000 +v -0.426619 -0.125000 0.500000 +v 0.573381 -0.125000 0.500000 +v -0.279122 0.000000 0.500000 +v 0.720878 0.000000 0.500000 +v -0.261012 0.125000 0.500000 +v 0.738988 0.125000 0.500000 +v -0.382898 0.250000 0.500000 +v 0.617102 0.250000 0.500000 +v -0.573381 0.375000 0.500000 +v 0.426619 0.375000 0.500000 +v -0.720878 0.500000 0.500000 +v 0.279122 0.500000 0.500000 +v -0.720878 0.500000 -0.500000 +v 0.279122 0.500000 -0.500000 +v -0.573381 0.375000 -0.500000 +v 0.426619 0.375000 -0.500000 +v -0.382898 0.250000 -0.500000 +v 0.617102 0.250000 -0.500000 +v -0.261012 0.125000 -0.500000 +v 0.738988 0.125000 -0.500000 +v -0.279122 0.000000 -0.500000 +v 0.720878 0.000000 -0.500000 +v -0.426619 -0.125000 -0.500000 +v 0.573381 -0.125000 -0.500000 +v -0.617102 -0.250000 -0.500000 +v 0.382898 -0.250000 -0.500000 +v -0.738988 -0.375000 -0.500000 +v 0.261012 -0.375000 -0.500000 +v -0.720878 -0.500000 -0.500000 +v 0.279122 -0.500000 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.031250 +vt 0.625000 0.031250 +vt 0.375000 0.062500 +vt 0.625000 0.062500 +vt 0.375000 0.093750 +vt 0.625000 0.093750 +vt 0.375000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.156250 +vt 0.625000 0.156250 +vt 0.375000 0.187500 +vt 0.625000 0.187500 +vt 0.375000 0.218750 +vt 0.625000 0.218750 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.531250 +vt 0.625000 0.531250 +vt 0.375000 0.562500 +vt 0.625000 0.562500 +vt 0.375000 0.593750 +vt 0.625000 0.593750 +vt 0.375000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.656250 +vt 0.625000 0.656250 +vt 0.375000 0.687500 +vt 0.625000 0.687500 +vt 0.375000 0.718750 +vt 0.625000 0.718750 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.031250 +vt 0.875000 0.062500 +vt 0.875000 0.093750 +vt 0.875000 0.125000 +vt 0.875000 0.156250 +vt 0.875000 0.187500 +vt 0.875000 0.218750 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.031250 +vt 0.125000 0.062500 +vt 0.125000 0.093750 +vt 0.125000 0.125000 +vt 0.125000 0.156250 +vt 0.125000 0.187500 +vt 0.125000 0.218750 +vt 0.125000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.989667 0.143383 0.000000 +vn 0.989667 0.143383 0.000000 +vn 0.923589 -0.383385 0.000000 +vn 0.923589 -0.383385 0.000000 +vn 0.624855 -0.780741 0.000000 +vn 0.624855 -0.780741 0.000000 +vn 0.594681 -0.803962 0.000000 +vn 0.594681 -0.803962 0.000000 +vn 0.833677 -0.552252 0.000000 +vn 0.833677 -0.552252 0.000000 +vn 0.923589 0.383385 0.000000 +vn 0.923589 0.383385 0.000000 +vn 0.624855 0.780741 0.000000 +vn 0.624855 0.780741 0.000000 +vn 0.594681 0.803962 0.000000 +vn 0.594681 0.803962 0.000000 +vn 0.646528 0.762890 0.000000 +vn 0.646528 0.762890 0.000000 +vn -0.989667 -0.143383 0.000000 +vn -0.989667 -0.143383 0.000000 +vn -0.923589 0.383385 0.000000 +vn -0.923589 0.383385 0.000000 +vn -0.624855 0.780741 0.000000 +vn -0.624855 0.780741 0.000000 +vn -0.594681 0.803962 0.000000 +vn -0.594681 0.803962 0.000000 +vn -0.833677 0.552252 0.000000 +vn -0.833677 0.552252 0.000000 +vn -0.923589 -0.383385 0.000000 +vn -0.923589 -0.383385 0.000000 +vn -0.624855 -0.780741 0.000000 +vn -0.624855 -0.780741 0.000000 +vn -0.594681 -0.803962 0.000000 +vn -0.594681 -0.803962 0.000000 +vn -0.646528 -0.762890 0.000000 +vn -0.646528 -0.762890 0.000000 +s 1 +g pCube1 +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/4 4/4/3 6/6/5 5/5/6 +f 5/5/6 6/6/5 8/8/7 7/7/8 +f 7/7/8 8/8/7 10/10/9 9/9/10 +f 9/9/10 10/10/9 12/12/11 11/11/12 +f 11/11/12 12/12/11 14/14/13 13/13/14 +f 13/13/14 14/14/13 16/16/15 15/15/16 +f 15/15/16 16/16/15 18/18/17 17/17/18 +s off +f 17/17/19 18/18/20 20/20/21 19/19/22 +s 2 +f 19/19/23 20/20/24 22/22/25 21/21/26 +f 21/21/26 22/22/25 24/24/27 23/23/28 +f 23/23/28 24/24/27 26/26/29 25/25/30 +f 25/25/30 26/26/29 28/28/31 27/27/32 +f 27/27/32 28/28/31 30/30/33 29/29/34 +f 29/29/34 30/30/33 32/32/35 31/31/36 +f 31/31/36 32/32/35 34/34/37 33/33/38 +f 33/33/38 34/34/37 36/36/39 35/35/40 +s off +f 35/35/41 36/36/42 2/38/43 1/37/44 +s 3 +f 2/2/45 36/39/46 34/40/47 4/4/48 +f 4/4/48 34/40/47 32/41/49 6/6/50 +f 6/6/50 32/41/49 30/42/51 8/8/52 +f 8/8/52 30/42/51 28/43/53 10/10/54 +f 10/10/54 28/43/53 26/44/55 12/12/56 +f 12/12/56 26/44/55 24/45/57 14/14/58 +f 14/14/58 24/45/57 22/46/59 16/16/60 +f 16/16/60 22/46/59 20/47/61 18/18/62 +s 4 +f 35/48/63 1/1/64 3/3/65 33/49/66 +f 33/49/66 3/3/65 5/5/67 31/50/68 +f 31/50/68 5/5/67 7/7/69 29/51/70 +f 29/51/70 7/7/69 9/9/71 27/52/72 +f 27/52/72 9/9/71 11/11/73 25/53/74 +f 25/53/74 11/11/73 13/13/75 23/54/76 +f 23/54/76 13/13/75 15/15/77 21/55/78 +f 21/55/78 15/15/77 17/17/79 19/56/80 +g default +v -0.500000 1.556749 0.500000 +v 0.500000 1.556749 0.500000 +v -0.541907 1.667562 0.541907 +v 0.541907 1.667562 0.541907 +v -0.556329 1.778374 0.556329 +v 0.556329 1.778374 0.556329 +v -0.563827 1.889187 0.563827 +v 0.563827 1.889187 0.563827 +v -0.566197 2.000000 0.566197 +v 0.566197 2.000000 0.566197 +v -0.563827 2.110813 0.563827 +v 0.563827 2.110813 0.563827 +v -0.556329 2.221626 0.556329 +v 0.556329 2.221626 0.556329 +v -0.541907 2.332438 0.541907 +v 0.541907 2.332438 0.541907 +v -0.500000 2.443251 0.500000 +v 0.500000 2.443251 0.500000 +v -0.500000 2.443251 -0.500000 +v 0.500000 2.443251 -0.500000 +v -0.541907 2.332438 -0.541907 +v 0.541907 2.332438 -0.541907 +v -0.556329 2.221626 -0.556329 +v 0.556329 2.221626 -0.556329 +v -0.563827 2.110813 -0.563827 +v 0.563827 2.110813 -0.563827 +v -0.566197 2.000000 -0.566197 +v 0.566197 2.000000 -0.566197 +v -0.563827 1.889187 -0.563827 +v 0.563827 1.889187 -0.563827 +v -0.556329 1.778374 -0.556329 +v 0.556329 1.778374 -0.556329 +v -0.541907 1.667562 -0.541907 +v 0.541907 1.667562 -0.541907 +v -0.500000 1.556749 -0.500000 +v 0.500000 1.556749 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.031250 +vt 0.625000 0.031250 +vt 0.375000 0.062500 +vt 0.625000 0.062500 +vt 0.375000 0.093750 +vt 0.625000 0.093750 +vt 0.375000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.156250 +vt 0.625000 0.156250 +vt 0.375000 0.187500 +vt 0.625000 0.187500 +vt 0.375000 0.218750 +vt 0.625000 0.218750 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.531250 +vt 0.625000 0.531250 +vt 0.375000 0.562500 +vt 0.625000 0.562500 +vt 0.375000 0.593750 +vt 0.625000 0.593750 +vt 0.375000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.656250 +vt 0.625000 0.656250 +vt 0.375000 0.687500 +vt 0.625000 0.687500 +vt 0.375000 0.718750 +vt 0.625000 0.718750 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.031250 +vt 0.875000 0.062500 +vt 0.875000 0.093750 +vt 0.875000 0.125000 +vt 0.875000 0.156250 +vt 0.875000 0.187500 +vt 0.875000 0.218750 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.031250 +vt 0.125000 0.062500 +vt 0.125000 0.093750 +vt 0.125000 0.125000 +vt 0.125000 0.156250 +vt 0.125000 0.187500 +vt 0.125000 0.218750 +vt 0.125000 0.250000 +vn 0.000000 -0.353727 0.935349 +vn 0.000000 -0.353727 0.935349 +vn 0.000000 -0.225234 0.974305 +vn 0.000000 -0.225234 0.974305 +vn 0.000000 -0.096165 0.995366 +vn 0.000000 -0.096165 0.995366 +vn 0.000000 -0.043718 0.999044 +vn 0.000000 -0.043718 0.999044 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.043718 0.999044 +vn 0.000000 0.043718 0.999044 +vn 0.000000 0.096165 0.995366 +vn 0.000000 0.096165 0.995366 +vn 0.000000 0.225234 0.974305 +vn 0.000000 0.225234 0.974305 +vn 0.000000 0.353727 0.935349 +vn 0.000000 0.353727 0.935349 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.353727 -0.935349 +vn 0.000000 0.353727 -0.935349 +vn 0.000000 0.225234 -0.974305 +vn 0.000000 0.225234 -0.974305 +vn 0.000000 0.096165 -0.995366 +vn 0.000000 0.096165 -0.995366 +vn 0.000000 0.043718 -0.999044 +vn 0.000000 0.043718 -0.999044 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.043718 -0.999044 +vn 0.000000 -0.043718 -0.999044 +vn 0.000000 -0.096165 -0.995366 +vn 0.000000 -0.096165 -0.995366 +vn 0.000000 -0.225234 -0.974305 +vn 0.000000 -0.225234 -0.974305 +vn 0.000000 -0.353727 -0.935349 +vn 0.000000 -0.353727 -0.935349 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.935349 -0.353727 0.000000 +vn 0.935349 -0.353727 0.000000 +vn 0.974305 -0.225234 0.000000 +vn 0.974305 -0.225234 0.000000 +vn 0.995366 -0.096164 0.000000 +vn 0.995366 -0.096164 0.000000 +vn 0.999044 -0.043718 0.000000 +vn 0.999044 -0.043718 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.999044 0.043718 0.000000 +vn 0.999044 0.043718 0.000000 +vn 0.995366 0.096164 0.000000 +vn 0.995366 0.096164 0.000000 +vn 0.974305 0.225234 0.000000 +vn 0.974305 0.225234 0.000000 +vn 0.935349 0.353727 0.000000 +vn 0.935349 0.353727 0.000000 +vn -0.935349 -0.353727 0.000000 +vn -0.935349 -0.353727 0.000000 +vn -0.974305 -0.225234 0.000000 +vn -0.974305 -0.225234 0.000000 +vn -0.995366 -0.096164 0.000000 +vn -0.995366 -0.096164 0.000000 +vn -0.999044 -0.043718 0.000000 +vn -0.999044 -0.043718 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.999044 0.043718 0.000000 +vn -0.999044 0.043718 0.000000 +vn -0.995366 0.096164 0.000000 +vn -0.995366 0.096164 0.000000 +vn -0.974305 0.225234 0.000000 +vn -0.974305 0.225234 0.000000 +vn -0.935349 0.353727 0.000000 +vn -0.935349 0.353727 0.000000 +s 1 +g pCube2 +f 37/57/81 38/58/82 40/60/83 39/59/84 +f 39/59/84 40/60/83 42/62/85 41/61/86 +f 41/61/86 42/62/85 44/64/87 43/63/88 +f 43/63/88 44/64/87 46/66/89 45/65/90 +f 45/65/90 46/66/89 48/68/91 47/67/92 +f 47/67/92 48/68/91 50/70/93 49/69/94 +f 49/69/94 50/70/93 52/72/95 51/71/96 +f 51/71/96 52/72/95 54/74/97 53/73/98 +s off +f 53/73/99 54/74/100 56/76/101 55/75/102 +s 2 +f 55/75/103 56/76/104 58/78/105 57/77/106 +f 57/77/106 58/78/105 60/80/107 59/79/108 +f 59/79/108 60/80/107 62/82/109 61/81/110 +f 61/81/110 62/82/109 64/84/111 63/83/112 +f 63/83/112 64/84/111 66/86/113 65/85/114 +f 65/85/114 66/86/113 68/88/115 67/87/116 +f 67/87/116 68/88/115 70/90/117 69/89/118 +f 69/89/118 70/90/117 72/92/119 71/91/120 +s off +f 71/91/121 72/92/122 38/94/123 37/93/124 +s 3 +f 38/58/125 72/95/126 70/96/127 40/60/128 +f 40/60/128 70/96/127 68/97/129 42/62/130 +f 42/62/130 68/97/129 66/98/131 44/64/132 +f 44/64/132 66/98/131 64/99/133 46/66/134 +f 46/66/134 64/99/133 62/100/135 48/68/136 +f 48/68/136 62/100/135 60/101/137 50/70/138 +f 50/70/138 60/101/137 58/102/139 52/72/140 +f 52/72/140 58/102/139 56/103/141 54/74/142 +s 4 +f 71/104/143 37/57/144 39/59/145 69/105/146 +f 69/105/146 39/59/145 41/61/147 67/106/148 +f 67/106/148 41/61/147 43/63/149 65/107/150 +f 65/107/150 43/63/149 45/65/151 63/108/152 +f 63/108/152 45/65/151 47/67/153 61/109/154 +f 61/109/154 47/67/153 49/69/155 59/110/156 +f 59/110/156 49/69/155 51/71/157 57/111/158 +f 57/111/158 51/71/157 53/73/159 55/112/160 diff --git a/modules/ufbx/data/maya_cache_sine_6100_ascii.fbx b/modules/ufbx/data/maya_cache_sine_6100_ascii.fbx new file mode 100644 index 0000000..f4a02a2 --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_6100_ascii.fbx @@ -0,0 +1,952 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 25 + Hour: 22 + Minute: 50 + Second: 59 + Millisecond: 73 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 4 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Cache" { + Count: 2 + } + ObjectType: "Deformer" { + Count: 4 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.676776707172394,-0.375,0.5,0.323223292827606,-0.375,0.5,-0.75,-0.25,0.5,0.25,-0.25,0.5 + ,-0.676776707172394,-0.125,0.5,0.323223292827606,-0.125,0.5,-0.5,0,0.5,0.5,0,0.5,-0.323223292827606,0.125,0.5,0.676776707172394 + ,0.125,0.5,-0.25,0.25,0.5,0.75,0.25,0.5,-0.323223292827606,0.375,0.5,0.676776707172394,0.375,0.5,-0.5,0.5,0.5,0.5 + ,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.323223292827606,0.375,-0.5,0.676776707172394,0.375,-0.5,-0.25,0.25,-0.5,0.75 + ,0.25,-0.5,-0.323223292827606,0.125,-0.5,0.676776707172394,0.125,-0.5,-0.5,0,-0.5,0.5,0,-0.5,-0.676776707172394,-0.125 + ,-0.5,0.323223292827606,-0.125,-0.5,-0.75,-0.25,-0.5,0.25,-0.25,-0.5,-0.676776707172394,-0.375,-0.5,0.323223292827606 + ,-0.375,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,9,-9,8,9,11,-11,10,11,13,-13,12,13,15,-15,14,15,17,-17,16,17,19,-19,18,19,21,-21,20 + ,21,23,-23,22,23,25,-25,24,25,27,-27,26,27,29,-29,28,29,31,-31,30,31,33,-33,32,33,35,-35,34,35,1,-1,1,35,33,-4,3,33 + ,31,-6,5,31,29,-8,7,29,27,-10,9,27,25,-12,11,25,23,-14,13,23,21,-16,15,21,19,-18,34,0,2,-33,32,2,4,-31,30,4,6,-29 + ,28,6,8,-27,26,8,10,-25,24,10,12,-23,22,12,14,-21,20,14,16,-19 + Edges: 0,2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,3,1,7,5,11,9,15,13,19,17,23,21,27,25,31,29,35,33,39,37,43,41,47 + ,45,51,49,55,53,59,57,63,61,67,65,71,69,74,78,82,86,90,94,98,106,110,114,118,122,126,130 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + ,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0 + ,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1 + ,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + ,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.577350199222565,0.816496551036835,0,0.577350199222565,0.816496551036835,0,0.707106709480286 + ,0.70710676908493,0,0.707106709480286,0.70710676908493,0,0.707106709480286,0.70710676908493,0,0.707106709480286 + ,0.70710676908493,0,1,0,0,1,0,0,1,0,0,1,0,0,0.707106709480286,-0.70710676908493,0,0.707106709480286,-0.70710676908493 + ,0,0.707106709480286,-0.70710676908493,0,0.707106709480286,-0.70710676908493,0,0.577350199222565,-0.816496551036835 + ,0,0.577350199222565,-0.816496551036835,0,0.577350199222565,-0.816496551036835,0,0.577350199222565,-0.816496551036835 + ,0,0.707106709480286,-0.70710676908493,0,0.707106709480286,-0.70710676908493,0,0.707106709480286,-0.70710676908493 + ,0,0.707106709480286,-0.70710676908493,0,1,0,0,1,0,0,1,0,0,1,0,0,0.707106709480286,0.70710676908493,0,0.707106709480286 + ,0.70710676908493,0,0.707106709480286,0.70710676908493,0,0.707106709480286,0.70710676908493,0,0.577350199222565 + ,0.816496551036835,0,0.577350199222565,0.816496551036835,0,-0.577350199222565,-0.816496551036835,0,-0.577350199222565 + ,-0.816496551036835,0,-0.707106709480286,-0.70710676908493,0,-0.707106709480286,-0.70710676908493,0,-0.707106709480286 + ,-0.70710676908493,0,-0.707106709480286,-0.70710676908493,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.707106709480286,0.70710676908493 + ,0,-0.707106709480286,0.70710676908493,0,-0.707106709480286,0.70710676908493,0,-0.707106709480286,0.70710676908493 + ,0,-0.577350199222565,0.816496551036835,0,-0.577350199222565,0.816496551036835,0,-0.577350199222565,0.816496551036835 + ,0,-0.577350199222565,0.816496551036835,0,-0.707106709480286,0.70710676908493,0,-0.707106709480286,0.70710676908493 + ,0,-0.707106709480286,0.70710676908493,0,-0.707106709480286,0.70710676908493,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.707106709480286 + ,-0.70710676908493,0,-0.707106709480286,-0.70710676908493,0,-0.707106709480286,-0.70710676908493,0,-0.707106709480286 + ,-0.70710676908493,0,-0.577350199222565,-0.816496551036835,0,-0.577350199222565,-0.816496551036835,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1 + ,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0 + ,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1 + ,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,0,0,-1,0,0,-1 + ,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0.816496670246124,0.577350258827209 + ,-0,-0.816496670246124,0.577350258827209,-0,-0.707106828689575,0.70710676908493,-0,-0.707106828689575,0.70710676908493 + ,-0,-0.707106828689575,0.70710676908493,-0,-0.707106828689575,0.70710676908493,-0,-0,1,0,-0,1,0,-0,1,0,-0,1,0 + ,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493 + ,0,0.707106828689575,0.70710676908493,0,0.816496670246124,0.577350258827209,0,0.816496670246124,0.577350258827209 + ,0,0.816496670246124,0.577350258827209,0,0.816496670246124,0.577350258827209,0,0.707106828689575,0.70710676908493 + ,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493 + ,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0.707106828689575,0.70710676908493,-0,-0.707106828689575,0.70710676908493,-0 + ,-0.707106828689575,0.70710676908493,-0,-0.707106828689575,0.70710676908493,-0,-0.816496670246124,0.577350258827209 + ,-0,-0.816496670246124,0.577350258827209,-0,-0.816496670246124,0.577350258827209,0,-0.816496670246124,0.577350258827209 + ,0,-0.707106828689575,0.70710676908493,0,-0.707106828689575,0.70710676908493,0,-0.707106828689575,0.70710676908493 + ,0,-0.707106828689575,0.70710676908493,0,0,1,0,0,1,0,0,1,0,0,1,0,0.707106828689575,0.70710676908493,0,0.707106828689575 + ,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.816496670246124 + ,0.577350258827209,0,0.816496670246124,0.577350258827209,0,0.816496670246124,0.577350258827209,0,0.816496670246124 + ,0.577350258827209,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575 + ,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0,1,0,0,1,0,0,1,0,0,1,0,-0.707106828689575,0.70710676908493 + ,0,-0.707106828689575,0.70710676908493,0,-0.707106828689575,0.70710676908493,0,-0.707106828689575,0.70710676908493 + ,0,-0.816496670246124,0.577350258827209,0,-0.816496670246124,0.577350258827209,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,0,1,-0,-0,1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0 + ,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0 + ,-0,1,-0,-0,1,-0,-0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0 + ,0,-1,0,0,-1,0,0,-1,0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0 + ,0,-1,-0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,0,1,0,0,1,0,0,1,0 + ,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0 + ,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.03125,0.625,0.03125,0.375,0.0625,0.625,0.0625,0.375,0.09375,0.625,0.09375,0.375,0.125 + ,0.625,0.125,0.375,0.15625,0.625,0.15625,0.375,0.1875,0.625,0.1875,0.375,0.21875,0.625,0.21875,0.375,0.25,0.625 + ,0.25,0.375,0.5,0.625,0.5,0.375,0.53125,0.625,0.53125,0.375,0.5625,0.625,0.5625,0.375,0.59375,0.625,0.59375,0.375 + ,0.625,0.625,0.625,0.375,0.65625,0.625,0.65625,0.375,0.6875,0.625,0.6875,0.375,0.71875,0.625,0.71875,0.375,0.75 + ,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.03125,0.875,0.0625,0.875,0.09375,0.875,0.125,0.875,0.15625,0.875 + ,0.1875,0.875,0.21875,0.875,0.25,0.125,0,0.125,0.03125,0.125,0.0625,0.125,0.09375,0.125,0.125,0.125,0.15625,0.125 + ,0.1875,0.125,0.21875,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,8,9,11,10,10,11,13,12,12,13,15,14,14,15,17,16,16,17,19,18,18,19,21,20,20,21,23 + ,22,22,23,25,24,24,25,27,26,26,27,29,28,28,29,31,30,30,31,33,32,32,33,35,34,34,35,37,36,1,38,39,3,3,39,40,5,5 + ,40,41,7,7,41,42,9,9,42,43,11,11,43,44,13,13,44,45,15,15,45,46,17,47,0,2,48,48,2,4,49,49,4,6,50,50,6,8,51,51 + ,8,10,52,52,10,12,53,53,12,14,54,54,14,16,55 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 + ,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::sine1Handle", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",0.5,0.5,0.5 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::sine1Handle_ncl1_1" + } + Model: "Model::pCube2", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,2,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.333333343267441,0.5,0.5,-0.333333343267441,0.5,-0.660285830497742,-0.25,0.660285830497742,0.660285830497742 + ,-0.25,0.660285830497742,-0.732962906360626,-0.16666667163372,0.732962906360626,0.732962906360626,-0.16666667163372 + ,0.732962906360626,-0.775618076324463,-0.0833333358168602,0.775618076324463,0.775618076324463,-0.0833333358168602 + ,0.775618076324463,-0.789897978305817,0,0.789897978305817,0.789897978305817,0,0.789897978305817,-0.775618076324463 + ,0.0833333358168602,0.775618076324463,0.775618076324463,0.0833333358168602,0.775618076324463,-0.732962906360626,0.16666667163372 + ,0.732962906360626,0.732962906360626,0.16666667163372,0.732962906360626,-0.660285830497742,0.25,0.660285830497742 + ,0.660285830497742,0.25,0.660285830497742,-0.5,0.333333343267441,0.5,0.5,0.333333343267441,0.5,-0.5,0.333333343267441 + ,-0.5,0.5,0.333333343267441,-0.5,-0.660285830497742,0.25,-0.660285830497742,0.660285830497742,0.25,-0.660285830497742 + ,-0.732962906360626,0.16666667163372,-0.732962906360626,0.732962906360626,0.16666667163372,-0.732962906360626,-0.775618076324463 + ,0.0833333358168602,-0.775618076324463,0.775618076324463,0.0833333358168602,-0.775618076324463,-0.789897978305817 + ,0,-0.789897978305817,0.789897978305817,0,-0.789897978305817,-0.775618076324463,-0.0833333358168602,-0.775618076324463 + ,0.775618076324463,-0.0833333358168602,-0.775618076324463,-0.732962906360626,-0.16666667163372,-0.732962906360626 + ,0.732962906360626,-0.16666667163372,-0.732962906360626,-0.660285830497742,-0.25,-0.660285830497742,0.660285830497742 + ,-0.25,-0.660285830497742,-0.5,-0.333333343267441,-0.5,0.5,-0.333333343267441,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,9,-9,8,9,11,-11,10,11,13,-13,12,13,15,-15,14,15,17,-17,16,17,19,-19,18,19,21,-21,20 + ,21,23,-23,22,23,25,-25,24,25,27,-27,26,27,29,-29,28,29,31,-31,30,31,33,-33,32,33,35,-35,34,35,1,-1,1,35,33,-4,3,33 + ,31,-6,5,31,29,-8,7,29,27,-10,9,27,25,-12,11,25,23,-14,13,23,21,-16,15,21,19,-18,34,0,2,-33,32,2,4,-31,30,4,6,-29 + ,28,6,8,-27,26,8,10,-25,24,10,12,-23,22,12,14,-21,20,14,16,-19 + Edges: 0,2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,3,1,7,5,11,9,15,13,19,17,23,21,27,25,31,29,35,33,39,37,43,41,47 + ,45,51,49,55,53,59,57,63,61,67,65,71,69,74,78,82,86,90,94,98,106,110,114,118,122,126,130 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,-0.887251436710358,0.461286157369614,0,-0.887251436710358,0.461286157369614,0,-0.749213457107544,0.662328660488129 + ,0,-0.749213457107544,0.662328660488129,0,-0.749213457107544,0.662328660488129,0,-0.749213457107544,0.662328660488129 + ,0,-0.52993780374527,0.848036527633667,0,-0.52993780374527,0.848036527633667,0,-0.52993780374527,0.848036527633667 + ,0,-0.52993780374527,0.848036527633667,0,-0.290379613637924,0.956911563873291,0,-0.290379613637924,0.956911563873291 + ,0,-0.290379613637924,0.956911563873291,0,-0.290379613637924,0.956911563873291,0,-1.01729762391756e-08,1,0,-1.01729762391756e-08 + ,1,0,-1.01729762391756e-08,1,0,-1.01729762391756e-08,1,0,0.290379613637924,0.956911504268646,0,0.290379613637924 + ,0.956911504268646,0,0.290379613637924,0.956911504268646,0,0.290379613637924,0.956911504268646,0,0.52993780374527 + ,0.848036468029022,0,0.52993780374527,0.848036468029022,0,0.52993780374527,0.848036468029022,0,0.52993780374527 + ,0.848036468029022,0,0.749213576316833,0.662328600883484,0,0.749213576316833,0.662328600883484,0,0.749213576316833 + ,0.662328600883484,0,0.749213576316833,0.662328600883484,0,0.887251436710358,0.461286157369614,0,0.887251436710358 + ,0.461286157369614,0,1,0,0,1,0,0,1,0,0,1,0,0,0.887251436710358,-0.461286157369614,0,0.887251436710358,-0.461286157369614 + ,0,0.749213457107544,-0.662328660488129,0,0.749213457107544,-0.662328660488129,0,0.749213457107544,-0.662328660488129 + ,0,0.749213457107544,-0.662328660488129,0,0.52993780374527,-0.848036527633667,0,0.52993780374527,-0.848036527633667 + ,0,0.52993780374527,-0.848036527633667,0,0.52993780374527,-0.848036527633667,0,0.290379613637924,-0.956911563873291 + ,0,0.290379613637924,-0.956911563873291,0,0.290379613637924,-0.956911563873291,0,0.290379613637924,-0.956911563873291 + ,0,1.01729762391756e-08,-1,0,1.01729762391756e-08,-1,0,1.01729762391756e-08,-1,0,1.01729762391756e-08,-1,0,-0.290379613637924 + ,-0.956911504268646,0,-0.290379613637924,-0.956911504268646,0,-0.290379613637924,-0.956911504268646,0,-0.290379613637924 + ,-0.956911504268646,0,-0.52993780374527,-0.848036468029022,0,-0.52993780374527,-0.848036468029022,0,-0.52993780374527 + ,-0.848036468029022,0,-0.52993780374527,-0.848036468029022,0,-0.749213576316833,-0.662328600883484,0,-0.749213576316833 + ,-0.662328600883484,0,-0.749213576316833,-0.662328600883484,0,-0.749213576316833,-0.662328600883484,0,-0.887251436710358 + ,-0.461286157369614,0,-0.887251436710358,-0.461286157369614,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.461286157369614,-0.887251436710358 + ,0,0.461286157369614,-0.887251436710358,0,0.662328660488129,-0.749213457107544,0,0.662328660488129,-0.749213457107544 + ,0,0.662328660488129,-0.749213457107544,0,0.662328660488129,-0.749213457107544,0,0.848036229610443,-0.529938220977783 + ,0,0.848036229610443,-0.529938220977783,0,0.848036229610443,-0.529938220977783,0,0.848036229610443,-0.529938220977783 + ,0,0.956911385059357,-0.290379852056503,0,0.956911385059357,-0.290379852056503,0,0.956911385059357,-0.290379852056503 + ,0,0.956911385059357,-0.290379852056503,0,1,0,0,1,0,0,1,0,0,1,0,0,0.956911385059357,0.290379852056503,0,0.956911385059357 + ,0.290379852056503,0,0.956911385059357,0.290379852056503,0,0.956911385059357,0.290379852056503,0,0.848036348819733 + ,0.529938161373138,0,0.848036348819733,0.529938161373138,0,0.848036348819733,0.529938161373138,0,0.848036348819733 + ,0.529938161373138,0,0.662328720092773,0.749213397502899,0,0.662328720092773,0.749213397502899,0,0.662328720092773 + ,0.749213397502899,0,0.662328720092773,0.749213397502899,0,0.461286157369614,0.887251436710358,0,0.461286157369614 + ,0.887251436710358,0,-0.461286157369614,-0.887251436710358,0,-0.461286157369614,-0.887251436710358,0,-0.662328660488129 + ,-0.749213457107544,0,-0.662328660488129,-0.749213457107544,0,-0.662328660488129,-0.749213457107544,0,-0.662328660488129 + ,-0.749213457107544,0,-0.848036229610443,-0.529938220977783,0,-0.848036229610443,-0.529938220977783,0,-0.848036229610443 + ,-0.529938220977783,0,-0.848036229610443,-0.529938220977783,0,-0.956911385059357,-0.290379852056503,0,-0.956911385059357 + ,-0.290379852056503,0,-0.956911385059357,-0.290379852056503,0,-0.956911385059357,-0.290379852056503,0,-1,0,0 + ,-1,0,0,-1,0,0,-1,0,0,-0.956911385059357,0.290379852056503,0,-0.956911385059357,0.290379852056503,0,-0.956911385059357 + ,0.290379852056503,0,-0.956911385059357,0.290379852056503,0,-0.848036348819733,0.529938161373138,0,-0.848036348819733 + ,0.529938161373138,0,-0.848036348819733,0.529938161373138,0,-0.848036348819733,0.529938161373138,0,-0.662328720092773 + ,0.749213397502899,0,-0.662328720092773,0.749213397502899,0,-0.662328720092773,0.749213397502899,0,-0.662328720092773 + ,0.749213397502899,0,-0.461286157369614,0.887251436710358,0,-0.461286157369614,0.887251436710358,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,0.461286157369614,0.887251436710358,0,0.461286157369614,0.887251436710358,0,0.662328660488129,0.749213457107544 + ,0,0.662328660488129,0.749213457107544,0,0.662328660488129,0.749213457107544,0,0.662328660488129,0.749213457107544 + ,0,0.848036527633667,0.52993780374527,0,0.848036527633667,0.52993780374527,0,0.848036527633667,0.52993780374527 + ,0,0.848036527633667,0.52993780374527,0,0.956911563873291,0.290379613637924,0,0.956911563873291,0.290379613637924 + ,0,0.956911563873291,0.290379613637924,0,0.956911563873291,0.290379613637924,-0,1,1.01729762391756e-08,-0,1,1.01729762391756e-08 + ,-0,1,1.01729762391756e-08,-0,1,1.01729762391756e-08,0,0.956911623477936,-0.290379643440247,0,0.956911623477936 + ,-0.290379643440247,0,0.956911623477936,-0.290379643440247,0,0.956911623477936,-0.290379643440247,0,0.848036587238312 + ,-0.529937863349915,0,0.848036587238312,-0.529937863349915,0,0.848036587238312,-0.529937863349915,0,0.848036587238312 + ,-0.529937863349915,0,0.662328600883484,-0.749213576316833,0,0.662328600883484,-0.749213576316833,0,0.662328600883484 + ,-0.749213576316833,0,0.662328600883484,-0.749213576316833,0,0.461286157369614,-0.887251436710358,0,0.461286157369614 + ,-0.887251436710358,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-0.461286157369614,-0.887251436710358,0,-0.461286157369614 + ,-0.887251436710358,0,-0.662328660488129,-0.749213457107544,0,-0.662328660488129,-0.749213457107544,0,-0.662328660488129 + ,-0.749213457107544,0,-0.662328660488129,-0.749213457107544,0,-0.848036527633667,-0.52993780374527,0,-0.848036527633667 + ,-0.52993780374527,0,-0.848036527633667,-0.52993780374527,0,-0.848036527633667,-0.52993780374527,0,-0.956911563873291 + ,-0.290379613637924,0,-0.956911563873291,-0.290379613637924,0,-0.956911563873291,-0.290379613637924,0,-0.956911563873291 + ,-0.290379613637924,0,-1,-1.01729762391756e-08,0,-1,-1.01729762391756e-08,0,-1,-1.01729762391756e-08,0,-1,-1.01729762391756e-08 + ,0,-0.956911623477936,0.290379643440247,0,-0.956911623477936,0.290379643440247,0,-0.956911623477936,0.290379643440247 + ,0,-0.956911623477936,0.290379643440247,0,-0.848036587238312,0.529937863349915,0,-0.848036587238312,0.529937863349915 + ,0,-0.848036587238312,0.529937863349915,0,-0.848036587238312,0.529937863349915,0,-0.662328600883484,0.749213576316833 + ,0,-0.662328600883484,0.749213576316833,0,-0.662328600883484,0.749213576316833,0,-0.662328600883484,0.749213576316833 + ,0,-0.461286157369614,0.887251436710358,0,-0.461286157369614,0.887251436710358,0,0,1,0,0,1,0,0,1,0,0,1,0.887251436710358 + ,0.461286157369614,0,0.887251436710358,0.461286157369614,0,0.749213457107544,0.662328660488129,0,0.749213457107544 + ,0.662328660488129,0,0.749213457107544,0.662328660488129,0,0.749213457107544,0.662328660488129,0,0.529938220977783 + ,0.848036229610443,0,0.529938220977783,0.848036229610443,0,0.529938220977783,0.848036229610443,0,0.529938220977783 + ,0.848036229610443,0,0.290379881858826,0.956911504268646,0,0.290379881858826,0.956911504268646,0,0.290379881858826 + ,0.956911504268646,0,0.290379881858826,0.956911504268646,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0.290379881858826,0.956911504268646 + ,-0,-0.290379881858826,0.956911504268646,-0,-0.290379881858826,0.956911504268646,-0,-0.290379881858826,0.956911504268646 + ,-0,-0.529938161373138,0.848036348819733,-0,-0.529938161373138,0.848036348819733,-0,-0.529938161373138,0.848036348819733 + ,-0,-0.529938161373138,0.848036348819733,-0,-0.749213397502899,0.662328720092773,-0,-0.749213397502899,0.662328720092773 + ,-0,-0.749213397502899,0.662328720092773,-0,-0.749213397502899,0.662328720092773,-0,-0.887251436710358,0.461286157369614 + ,-0,-0.887251436710358,0.461286157369614,-0,-0.887251436710358,0.461286157369614,0,-0.887251436710358,0.461286157369614 + ,0,-0.749213457107544,0.662328660488129,0,-0.749213457107544,0.662328660488129,0,-0.749213457107544,0.662328660488129 + ,0,-0.749213457107544,0.662328660488129,0,-0.529938220977783,0.848036229610443,0,-0.529938220977783,0.848036229610443 + ,0,-0.529938220977783,0.848036229610443,0,-0.529938220977783,0.848036229610443,0,-0.290379881858826,0.956911504268646 + ,0,-0.290379881858826,0.956911504268646,0,-0.290379881858826,0.956911504268646,0,-0.290379881858826,0.956911504268646 + ,0,0,1,0,0,1,0,0,1,0,0,1,0,0.290379881858826,0.956911504268646,0,0.290379881858826,0.956911504268646,0,0.290379881858826 + ,0.956911504268646,0,0.290379881858826,0.956911504268646,0,0.529938161373138,0.848036348819733,0,0.529938161373138 + ,0.848036348819733,0,0.529938161373138,0.848036348819733,0,0.529938161373138,0.848036348819733,0,0.749213397502899 + ,0.662328720092773,0,0.749213397502899,0.662328720092773,0,0.749213397502899,0.662328720092773,0,0.749213397502899 + ,0.662328720092773,0,0.887251436710358,0.461286157369614,0,0.887251436710358,0.461286157369614,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,0,1,0,0 + ,1,0,0,1,0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0 + ,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + ,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + ,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1 + ,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1 + ,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + ,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0 + ,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.03125,0.625,0.03125,0.375,0.0625,0.625,0.0625,0.375,0.09375,0.625,0.09375,0.375,0.125 + ,0.625,0.125,0.375,0.15625,0.625,0.15625,0.375,0.1875,0.625,0.1875,0.375,0.21875,0.625,0.21875,0.375,0.25,0.625 + ,0.25,0.375,0.5,0.625,0.5,0.375,0.53125,0.625,0.53125,0.375,0.5625,0.625,0.5625,0.375,0.59375,0.625,0.59375,0.375 + ,0.625,0.625,0.625,0.375,0.65625,0.625,0.65625,0.375,0.6875,0.625,0.6875,0.375,0.71875,0.625,0.71875,0.375,0.75 + ,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.03125,0.875,0.0625,0.875,0.09375,0.875,0.125,0.875,0.15625,0.875 + ,0.1875,0.875,0.21875,0.875,0.25,0.125,0,0.125,0.03125,0.125,0.0625,0.125,0.09375,0.125,0.125,0.125,0.15625,0.125 + ,0.1875,0.125,0.21875,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,8,9,11,10,10,11,13,12,12,13,15,14,14,15,17,16,16,17,19,18,18,19,21,20,20,21,23 + ,22,22,23,25,24,24,25,27,26,26,27,29,28,28,29,31,30,30,31,33,32,32,33,35,34,34,35,37,36,1,38,39,3,3,39,40,5,5 + ,40,41,7,7,41,42,9,9,42,43,11,11,43,44,13,13,44,45,15,15,45,46,17,47,0,2,48,48,2,4,49,49,4,6,50,50,6,8,51,51 + ,8,10,52,52,10,12,53,53,12,14,54,54,14,16,55 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 + ,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube2_ncl1_1" + } + Model: "Model::squash1Handle", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,2,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",0.5,0.5,0.5 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::squash1Handle_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_cache_sine_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_cache_sine_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "25/09/2021 19:50:59.071" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_cache_sine_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "25/09/2021 19:50:59.071" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\sine_cube.mb" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + Deformer: "Deformer::VertexCacheDeformer", "VertexCacheDeformer" { + Version: 100 + Properties60: { + Property: "ChannelName", "KString", "", "pCubeShape2" + Property: "Active", "bool", "",1 + Property: "CacheSet", "KString", "", "FbxCacheExport" + Property: "ChannelType", "enum", "",0 + } + } + Deformer: "Deformer::VertexCacheDeformer_ncl1_1", "VertexCacheDeformer" { + Version: 100 + Properties60: { + Property: "ChannelName", "KString", "", "pCubeShape2_normals" + Property: "Active", "bool", "",1 + Property: "CacheSet", "KString", "", "FbxCacheExport" + Property: "ChannelType", "enum", "",0 + } + } + Deformer: "Deformer::VertexCacheDeformer_ncl1_2", "VertexCacheDeformer" { + Version: 100 + Properties60: { + Property: "ChannelName", "KString", "", "pCubeShape1" + Property: "Active", "bool", "",1 + Property: "CacheSet", "KString", "", "FbxCacheExport" + Property: "ChannelType", "enum", "",0 + } + } + Deformer: "Deformer::VertexCacheDeformer_ncl1_3", "VertexCacheDeformer" { + Version: 100 + Properties60: { + Property: "ChannelName", "KString", "", "pCubeShape1_normals" + Property: "Active", "bool", "",1 + Property: "CacheSet", "KString", "", "FbxCacheExport" + Property: "ChannelType", "enum", "",0 + } + } + Cache: "Cache::VertexCache_pCubeShape2.xml", "" { + Version: 100 + Properties60: { + Property: "CacheFileName", "KString", "", "maya_cache_sine_6100_ascii_fpc\pCubeShape2.xml" + Property: "CacheAbsoluteFileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_cache_sine_6100_ascii_fpc\pCubeShape2.xml" + + Property: "CacheFileType", "enum", "",2 + } + } + Cache: "Cache::VertexCache_pCubeShape1.xml", "" { + Version: 100 + Properties60: { + Property: "CacheFileName", "KString", "", "maya_cache_sine_6100_ascii_fpc\pCubeShape1.xml" + Property: "CacheAbsoluteFileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_cache_sine_6100_ascii_fpc\pCubeShape1.xml" + + Property: "CacheFileType", "enum", "",2 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",57732697500 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::sine1Handle", "Model::Scene" + Connect: "OO", "Model::pCube2", "Model::Scene" + Connect: "OO", "Model::squash1Handle", "Model::Scene" + Connect: "OO", "Deformer::VertexCacheDeformer_ncl1_2", "Model::pCube1" + Connect: "OO", "Deformer::VertexCacheDeformer_ncl1_3", "Model::pCube1" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Deformer::VertexCacheDeformer", "Model::pCube2" + Connect: "OO", "Deformer::VertexCacheDeformer_ncl1_1", "Model::pCube2" + Connect: "OO", "Material::lambert1", "Model::pCube2" + Connect: "OO", "Cache::VertexCache_pCubeShape2.xml", "Deformer::VertexCacheDeformer" + Connect: "OO", "Cache::VertexCache_pCubeShape2.xml", "Deformer::VertexCacheDeformer_ncl1_1" + Connect: "OO", "Cache::VertexCache_pCubeShape1.xml", "Deformer::VertexCacheDeformer_ncl1_2" + Connect: "OO", "Cache::VertexCache_pCubeShape1.xml", "Deformer::VertexCacheDeformer_ncl1_3" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,57732697500 + ReferenceTime: 1924423250,57732697500 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 176400000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape1.mcx b/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape1.mcx new file mode 100644 index 0000000..612ebbd Binary files /dev/null and b/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape1.mcx differ diff --git a/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape1.xml b/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape1.xml new file mode 100644 index 0000000..43fb384 --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape1.xml @@ -0,0 +1,14 @@ + + + + diff --git a/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape2.mcx b/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape2.mcx new file mode 100644 index 0000000..f26b999 Binary files /dev/null and b/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape2.mcx differ diff --git a/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape2.xml b/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape2.xml new file mode 100644 index 0000000..fadcea5 --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_6100_ascii_fpc/pCubeShape2.xml @@ -0,0 +1,14 @@ + + + + diff --git a/modules/ufbx/data/maya_cache_sine_6100_binary.fbx b/modules/ufbx/data/maya_cache_sine_6100_binary.fbx new file mode 100644 index 0000000..45efde4 Binary files /dev/null and b/modules/ufbx/data/maya_cache_sine_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape1.mcx b/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape1.mcx new file mode 100644 index 0000000..9207ee1 Binary files /dev/null and b/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape1.mcx differ diff --git a/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape1.xml b/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape1.xml new file mode 100644 index 0000000..43fb384 --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape1.xml @@ -0,0 +1,14 @@ + + + + diff --git a/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape2.mcx b/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape2.mcx new file mode 100644 index 0000000..f26b999 Binary files /dev/null and b/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape2.mcx differ diff --git a/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape2.xml b/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape2.xml new file mode 100644 index 0000000..fadcea5 --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_6100_binary_fpc/pCubeShape2.xml @@ -0,0 +1,14 @@ + + + + diff --git a/modules/ufbx/data/maya_cache_sine_7500_ascii.fbx b/modules/ufbx/data/maya_cache_sine_7500_ascii.fbx new file mode 100644 index 0000000..863ee71 --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_7500_ascii.fbx @@ -0,0 +1,703 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 25 + Hour: 22 + Minute: 46 + Second: 47 + Millisecond: 506 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_cache_sine_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_cache_sine_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "25/09/2021 19:46:47.505" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_cache_sine_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "25/09/2021 19:46:47.505" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\sine_cube.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",57732697500 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1840034955392, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 18 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 2 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 4 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 2 + PropertyTemplate: "FbxNull" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "Look", "enum", "", "",1 + } + } + } + ObjectType: "Cache" { + Count: 2 + PropertyTemplate: "FbxCache" { + Properties70: { + P: "CacheFileName", "KString", "", "", "" + P: "CacheAbsoluteFileName", "KString", "", "", "" + P: "CacheFileType", "enum", "", "",0 + } + } + } + ObjectType: "Deformer" { + Count: 4 + PropertyTemplate: "FbxVertexCacheDeformer" { + Properties70: { + P: "ChannelName", "KString", "", "", "" + P: "Active", "bool", "", "",1 + P: "CacheSet", "KString", "", "", "FbxCacheExport" + P: "ChannelType", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1840073156672, "Geometry::", "Mesh" { + Vertices: *108 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.676776707172394,-0.375,0.5,0.323223292827606,-0.375,0.5,-0.75,-0.25,0.5,0.25,-0.25,0.5,-0.676776707172394,-0.125,0.5,0.323223292827606,-0.125,0.5,-0.5,0,0.5,0.5,0,0.5,-0.323223292827606,0.125,0.5,0.676776707172394,0.125,0.5,-0.25,0.25,0.5,0.75,0.25,0.5,-0.323223292827606,0.375,0.5,0.676776707172394,0.375,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.323223292827606,0.375,-0.5,0.676776707172394,0.375,-0.5,-0.25,0.25,-0.5,0.75,0.25,-0.5,-0.323223292827606,0.125,-0.5,0.676776707172394,0.125,-0.5,-0.5,0,-0.5,0.5,0,-0.5,-0.676776707172394,-0.125,-0.5,0.323223292827606,-0.125,-0.5,-0.75,-0.25,-0.5,0.25,-0.25,-0.5,-0.676776707172394,-0.375,-0.5,0.323223292827606,-0.375,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *136 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,9,-9,8,9,11,-11,10,11,13,-13,12,13,15,-15,14,15,17,-17,16,17,19,-19,18,19,21,-21,20,21,23,-23,22,23,25,-25,24,25,27,-27,26,27,29,-29,28,29,31,-31,30,31,33,-33,32,33,35,-35,34,35,1,-1,1,35,33,-4,3,33,31,-6,5,31,29,-8,7,29,27,-10,9,27,25,-12,11,25,23,-14,13,23,21,-16,15,21,19,-18,34,0,2,-33,32,2,4,-31,30,4,6,-29,28,6,8,-27,26,8,10,-25,24,10,12,-23,22,12,14,-21,20,14,16,-19 + } + Edges: *68 { + a: 0,2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,3,1,7,5,11,9,15,13,19,17,23,21,27,25,31,29,35,33,39,37,43,41,47,45,51,49,55,53,59,57,63,61,67,65,71,69,74,78,82,86,90,94,98,106,110,114,118,122,126,130 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *408 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.577350199222565,0.816496551036835,0,0.577350199222565,0.816496551036835,0,0.707106709480286,0.70710676908493,0,0.707106709480286,0.70710676908493,0,0.707106709480286,0.70710676908493,0,0.707106709480286,0.70710676908493,0,1,0,0,1,0,0,1,0,0,1,0,0,0.707106709480286,-0.70710676908493,0,0.707106709480286,-0.70710676908493,0,0.707106709480286,-0.70710676908493,0,0.707106709480286,-0.70710676908493,0,0.577350199222565,-0.816496551036835,0,0.577350199222565,-0.816496551036835,0,0.577350199222565,-0.816496551036835,0,0.577350199222565,-0.816496551036835,0,0.707106709480286,-0.70710676908493,0,0.707106709480286,-0.70710676908493,0,0.707106709480286,-0.70710676908493,0,0.707106709480286,-0.70710676908493,0,1,0,0,1,0,0,1,0,0,1,0,0,0.707106709480286,0.70710676908493,0,0.707106709480286,0.70710676908493,0,0.707106709480286,0.70710676908493,0,0.707106709480286,0.70710676908493,0,0.577350199222565,0.816496551036835,0,0.577350199222565,0.816496551036835,0,-0.577350199222565,-0.816496551036835,0,-0.577350199222565,-0.816496551036835,0,-0.707106709480286,-0.70710676908493,0,-0.707106709480286,-0.70710676908493,0,-0.707106709480286,-0.70710676908493,0,-0.707106709480286,-0.70710676908493,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.707106709480286,0.70710676908493,0,-0.707106709480286,0.70710676908493,0,-0.707106709480286,0.70710676908493,0,-0.707106709480286,0.70710676908493,0,-0.577350199222565,0.816496551036835,0,-0.577350199222565,0.816496551036835,0,-0.577350199222565,0.816496551036835,0,-0.577350199222565,0.816496551036835,0,-0.707106709480286,0.70710676908493,0, +-0.707106709480286,0.70710676908493,0,-0.707106709480286,0.70710676908493,0,-0.707106709480286,0.70710676908493,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.707106709480286,-0.70710676908493,0,-0.707106709480286,-0.70710676908493,0,-0.707106709480286,-0.70710676908493,0,-0.707106709480286,-0.70710676908493,0,-0.577350199222565,-0.816496551036835,0,-0.577350199222565,-0.816496551036835,0 + } + NormalsW: *136 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *408 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0.816496670246124,0.577350258827209,-0,-0.816496670246124,0.577350258827209,-0,-0.707106828689575,0.70710676908493,-0,-0.707106828689575,0.70710676908493,-0,-0.707106828689575,0.70710676908493,-0,-0.707106828689575,0.70710676908493,-0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.816496670246124,0.577350258827209,0,0.816496670246124,0.577350258827209,0,0.816496670246124,0.577350258827209,0,0.816496670246124,0.577350258827209,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0.707106828689575,0.70710676908493,-0,-0.707106828689575,0.70710676908493,-0,-0.707106828689575,0.70710676908493,-0,-0.707106828689575,0.70710676908493,-0,-0.816496670246124,0.577350258827209,-0,-0.816496670246124,0.577350258827209,-0,-0.816496670246124,0.577350258827209,0,-0.816496670246124,0.577350258827209,0,-0.707106828689575,0.70710676908493,0,-0.707106828689575,0.70710676908493,0,-0.707106828689575,0.70710676908493,0,-0.707106828689575,0.70710676908493,0,0,1,0,0,1,0,0,1,0,0,1,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.816496670246124,0.577350258827209,0,0.816496670246124,0.577350258827209,0,0.816496670246124,0.577350258827209,0,0.816496670246124,0.577350258827209,0, +0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0.707106828689575,0.70710676908493,0,0,1,0,0,1,0,0,1,0,0,1,0,-0.707106828689575,0.70710676908493,0,-0.707106828689575,0.70710676908493,0,-0.707106828689575,0.70710676908493,0,-0.707106828689575,0.70710676908493,0,-0.816496670246124,0.577350258827209,0,-0.816496670246124,0.577350258827209,0 + } + BinormalsW: *136 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *408 { + a: 1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,0,1,-0,-0,1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1 + } + TangentsW: *136 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *112 { + a: 0.375,0,0.625,0,0.375,0.03125,0.625,0.03125,0.375,0.0625,0.625,0.0625,0.375,0.09375,0.625,0.09375,0.375,0.125,0.625,0.125,0.375,0.15625,0.625,0.15625,0.375,0.1875,0.625,0.1875,0.375,0.21875,0.625,0.21875,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.53125,0.625,0.53125,0.375,0.5625,0.625,0.5625,0.375,0.59375,0.625,0.59375,0.375,0.625,0.625,0.625,0.375,0.65625,0.625,0.65625,0.375,0.6875,0.625,0.6875,0.375,0.71875,0.625,0.71875,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.03125,0.875,0.0625,0.875,0.09375,0.875,0.125,0.875,0.15625,0.875,0.1875,0.875,0.21875,0.875,0.25,0.125,0,0.125,0.03125,0.125,0.0625,0.125,0.09375,0.125,0.125,0.125,0.15625,0.125,0.1875,0.125,0.21875,0.125,0.25 + } + UVIndex: *136 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,8,9,11,10,10,11,13,12,12,13,15,14,14,15,17,16,16,17,19,18,18,19,21,20,20,21,23,22,22,23,25,24,24,25,27,26,26,27,29,28,28,29,31,30,30,31,33,32,32,33,35,34,34,35,37,36,1,38,39,3,3,39,40,5,5,40,41,7,7,41,42,9,9,42,43,11,11,43,44,13,13,44,45,15,15,45,46,17,47,0,2,48,48,2,4,49,49,4,6,50,50,6,8,51,51,8,10,52,52,10,12,53,53,12,14,54,54,14,16,55 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *68 { + a: 0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 1840078029520, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 1840073151264, "Geometry::", "Mesh" { + Vertices: *108 { + a: -0.5,-0.333333343267441,0.5,0.5,-0.333333343267441,0.5,-0.660285830497742,-0.25,0.660285830497742,0.660285830497742,-0.25,0.660285830497742,-0.732962906360626,-0.16666667163372,0.732962906360626,0.732962906360626,-0.16666667163372,0.732962906360626,-0.775618076324463,-0.0833333358168602,0.775618076324463,0.775618076324463,-0.0833333358168602,0.775618076324463,-0.789897978305817,0,0.789897978305817,0.789897978305817,0,0.789897978305817,-0.775618076324463,0.0833333358168602,0.775618076324463,0.775618076324463,0.0833333358168602,0.775618076324463,-0.732962906360626,0.16666667163372,0.732962906360626,0.732962906360626,0.16666667163372,0.732962906360626,-0.660285830497742,0.25,0.660285830497742,0.660285830497742,0.25,0.660285830497742,-0.5,0.333333343267441,0.5,0.5,0.333333343267441,0.5,-0.5,0.333333343267441,-0.5,0.5,0.333333343267441,-0.5,-0.660285830497742,0.25,-0.660285830497742,0.660285830497742,0.25,-0.660285830497742,-0.732962906360626,0.16666667163372,-0.732962906360626,0.732962906360626,0.16666667163372,-0.732962906360626,-0.775618076324463,0.0833333358168602,-0.775618076324463,0.775618076324463,0.0833333358168602,-0.775618076324463,-0.789897978305817,0,-0.789897978305817,0.789897978305817,0,-0.789897978305817,-0.775618076324463,-0.0833333358168602,-0.775618076324463,0.775618076324463,-0.0833333358168602,-0.775618076324463,-0.732962906360626,-0.16666667163372,-0.732962906360626,0.732962906360626,-0.16666667163372,-0.732962906360626,-0.660285830497742,-0.25,-0.660285830497742,0.660285830497742,-0.25,-0.660285830497742,-0.5,-0.333333343267441,-0.5,0.5,-0.333333343267441,-0.5 + } + PolygonVertexIndex: *136 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,9,-9,8,9,11,-11,10,11,13,-13,12,13,15,-15,14,15,17,-17,16,17,19,-19,18,19,21,-21,20,21,23,-23,22,23,25,-25,24,25,27,-27,26,27,29,-29,28,29,31,-31,30,31,33,-33,32,33,35,-35,34,35,1,-1,1,35,33,-4,3,33,31,-6,5,31,29,-8,7,29,27,-10,9,27,25,-12,11,25,23,-14,13,23,21,-16,15,21,19,-18,34,0,2,-33,32,2,4,-31,30,4,6,-29,28,6,8,-27,26,8,10,-25,24,10,12,-23,22,12,14,-21,20,14,16,-19 + } + Edges: *68 { + a: 0,2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,3,1,7,5,11,9,15,13,19,17,23,21,27,25,31,29,35,33,39,37,43,41,47,45,51,49,55,53,59,57,63,61,67,65,71,69,74,78,82,86,90,94,98,106,110,114,118,122,126,130 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *408 { + a: 0,-0.887251436710358,0.461286157369614,0,-0.887251436710358,0.461286157369614,0,-0.749213457107544,0.662328660488129,0,-0.749213457107544,0.662328660488129,0,-0.749213457107544,0.662328660488129,0,-0.749213457107544,0.662328660488129,0,-0.52993780374527,0.848036527633667,0,-0.52993780374527,0.848036527633667,0,-0.52993780374527,0.848036527633667,0,-0.52993780374527,0.848036527633667,0,-0.290379613637924,0.956911563873291,0,-0.290379613637924,0.956911563873291,0,-0.290379613637924,0.956911563873291,0,-0.290379613637924,0.956911563873291,0,-1.01729762391756e-08,1,0,-1.01729762391756e-08,1,0,-1.01729762391756e-08,1,0,-1.01729762391756e-08,1,0,0.290379613637924,0.956911504268646,0,0.290379613637924,0.956911504268646,0,0.290379613637924,0.956911504268646,0,0.290379613637924,0.956911504268646,0,0.52993780374527,0.848036468029022,0,0.52993780374527,0.848036468029022,0,0.52993780374527,0.848036468029022,0,0.52993780374527,0.848036468029022,0,0.749213576316833,0.662328600883484,0,0.749213576316833,0.662328600883484,0,0.749213576316833,0.662328600883484,0,0.749213576316833,0.662328600883484,0,0.887251436710358,0.461286157369614,0,0.887251436710358,0.461286157369614,0,1,0,0,1,0,0,1,0,0,1,0,0,0.887251436710358,-0.461286157369614,0,0.887251436710358,-0.461286157369614,0,0.749213457107544,-0.662328660488129,0,0.749213457107544,-0.662328660488129,0,0.749213457107544,-0.662328660488129,0,0.749213457107544,-0.662328660488129,0,0.52993780374527,-0.848036527633667,0,0.52993780374527,-0.848036527633667,0,0.52993780374527,-0.848036527633667,0,0.52993780374527,-0.848036527633667,0,0.290379613637924,-0.956911563873291,0,0.290379613637924,-0.956911563873291,0,0.290379613637924,-0.956911563873291,0,0.290379613637924,-0.956911563873291,0,1.01729762391756e-08,-1,0,1.01729762391756e-08,-1,0,1.01729762391756e-08,-1,0,1.01729762391756e-08,-1,0,-0.290379613637924,-0.956911504268646,0,-0.290379613637924,-0.956911504268646,0,-0.290379613637924,-0.956911504268646,0,-0.290379613637924,-0.956911504268646,0,-0.52993780374527,-0.848036468029022, +0,-0.52993780374527,-0.848036468029022,0,-0.52993780374527,-0.848036468029022,0,-0.52993780374527,-0.848036468029022,0,-0.749213576316833,-0.662328600883484,0,-0.749213576316833,-0.662328600883484,0,-0.749213576316833,-0.662328600883484,0,-0.749213576316833,-0.662328600883484,0,-0.887251436710358,-0.461286157369614,0,-0.887251436710358,-0.461286157369614,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.461286157369614,-0.887251436710358,0,0.461286157369614,-0.887251436710358,0,0.662328660488129,-0.749213457107544,0,0.662328660488129,-0.749213457107544,0,0.662328660488129,-0.749213457107544,0,0.662328660488129,-0.749213457107544,0,0.848036229610443,-0.529938220977783,0,0.848036229610443,-0.529938220977783,0,0.848036229610443,-0.529938220977783,0,0.848036229610443,-0.529938220977783,0,0.956911385059357,-0.290379852056503,0,0.956911385059357,-0.290379852056503,0,0.956911385059357,-0.290379852056503,0,0.956911385059357,-0.290379852056503,0,1,0,0,1,0,0,1,0,0,1,0,0,0.956911385059357,0.290379852056503,0,0.956911385059357,0.290379852056503,0,0.956911385059357,0.290379852056503,0,0.956911385059357,0.290379852056503,0,0.848036348819733,0.529938161373138,0,0.848036348819733,0.529938161373138,0,0.848036348819733,0.529938161373138,0,0.848036348819733,0.529938161373138,0,0.662328720092773,0.749213397502899,0,0.662328720092773,0.749213397502899,0,0.662328720092773,0.749213397502899,0,0.662328720092773,0.749213397502899,0,0.461286157369614,0.887251436710358,0,0.461286157369614,0.887251436710358,0,-0.461286157369614,-0.887251436710358,0,-0.461286157369614,-0.887251436710358,0,-0.662328660488129,-0.749213457107544,0,-0.662328660488129,-0.749213457107544,0,-0.662328660488129,-0.749213457107544,0,-0.662328660488129,-0.749213457107544,0,-0.848036229610443,-0.529938220977783,0,-0.848036229610443,-0.529938220977783,0,-0.848036229610443,-0.529938220977783,0,-0.848036229610443,-0.529938220977783,0,-0.956911385059357,-0.290379852056503,0,-0.956911385059357,-0.290379852056503,0,-0.956911385059357,-0.290379852056503,0,-0.956911385059357,-0.290379852056503,0,-1,0,0, +-1,0,0,-1,0,0,-1,0,0,-0.956911385059357,0.290379852056503,0,-0.956911385059357,0.290379852056503,0,-0.956911385059357,0.290379852056503,0,-0.956911385059357,0.290379852056503,0,-0.848036348819733,0.529938161373138,0,-0.848036348819733,0.529938161373138,0,-0.848036348819733,0.529938161373138,0,-0.848036348819733,0.529938161373138,0,-0.662328720092773,0.749213397502899,0,-0.662328720092773,0.749213397502899,0,-0.662328720092773,0.749213397502899,0,-0.662328720092773,0.749213397502899,0,-0.461286157369614,0.887251436710358,0,-0.461286157369614,0.887251436710358,0 + } + NormalsW: *136 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *408 { + a: 0,0.461286157369614,0.887251436710358,0,0.461286157369614,0.887251436710358,0,0.662328660488129,0.749213457107544,0,0.662328660488129,0.749213457107544,0,0.662328660488129,0.749213457107544,0,0.662328660488129,0.749213457107544,0,0.848036527633667,0.52993780374527,0,0.848036527633667,0.52993780374527,0,0.848036527633667,0.52993780374527,0,0.848036527633667,0.52993780374527,0,0.956911563873291,0.290379613637924,0,0.956911563873291,0.290379613637924,0,0.956911563873291,0.290379613637924,0,0.956911563873291,0.290379613637924,-0,1,1.01729762391756e-08,-0,1,1.01729762391756e-08,-0,1,1.01729762391756e-08,-0,1,1.01729762391756e-08,0,0.956911623477936,-0.290379643440247,0,0.956911623477936,-0.290379643440247,0,0.956911623477936,-0.290379643440247,0,0.956911623477936,-0.290379643440247,0,0.848036587238312,-0.529937863349915,0,0.848036587238312,-0.529937863349915,0,0.848036587238312,-0.529937863349915,0,0.848036587238312,-0.529937863349915,0,0.662328600883484,-0.749213576316833,0,0.662328600883484,-0.749213576316833,0,0.662328600883484,-0.749213576316833,0,0.662328600883484,-0.749213576316833,0,0.461286157369614,-0.887251436710358,0,0.461286157369614,-0.887251436710358,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-0.461286157369614,-0.887251436710358,0,-0.461286157369614,-0.887251436710358,0,-0.662328660488129,-0.749213457107544,0,-0.662328660488129,-0.749213457107544,0,-0.662328660488129,-0.749213457107544,0,-0.662328660488129,-0.749213457107544,0,-0.848036527633667,-0.52993780374527,0,-0.848036527633667,-0.52993780374527,0,-0.848036527633667,-0.52993780374527,0,-0.848036527633667,-0.52993780374527,0,-0.956911563873291,-0.290379613637924,0,-0.956911563873291,-0.290379613637924,0,-0.956911563873291,-0.290379613637924,0,-0.956911563873291,-0.290379613637924,0,-1,-1.01729762391756e-08,0,-1,-1.01729762391756e-08,0,-1,-1.01729762391756e-08,0,-1,-1.01729762391756e-08,0,-0.956911623477936,0.290379643440247,0,-0.956911623477936,0.290379643440247,0,-0.956911623477936,0.290379643440247,0,-0.956911623477936,0.290379643440247, +0,-0.848036587238312,0.529937863349915,0,-0.848036587238312,0.529937863349915,0,-0.848036587238312,0.529937863349915,0,-0.848036587238312,0.529937863349915,0,-0.662328600883484,0.749213576316833,0,-0.662328600883484,0.749213576316833,0,-0.662328600883484,0.749213576316833,0,-0.662328600883484,0.749213576316833,0,-0.461286157369614,0.887251436710358,0,-0.461286157369614,0.887251436710358,0,0,1,0,0,1,0,0,1,0,0,1,0.887251436710358,0.461286157369614,0,0.887251436710358,0.461286157369614,0,0.749213457107544,0.662328660488129,0,0.749213457107544,0.662328660488129,0,0.749213457107544,0.662328660488129,0,0.749213457107544,0.662328660488129,0,0.529938220977783,0.848036229610443,0,0.529938220977783,0.848036229610443,0,0.529938220977783,0.848036229610443,0,0.529938220977783,0.848036229610443,0,0.290379881858826,0.956911504268646,0,0.290379881858826,0.956911504268646,0,0.290379881858826,0.956911504268646,0,0.290379881858826,0.956911504268646,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0.290379881858826,0.956911504268646,-0,-0.290379881858826,0.956911504268646,-0,-0.290379881858826,0.956911504268646,-0,-0.290379881858826,0.956911504268646,-0,-0.529938161373138,0.848036348819733,-0,-0.529938161373138,0.848036348819733,-0,-0.529938161373138,0.848036348819733,-0,-0.529938161373138,0.848036348819733,-0,-0.749213397502899,0.662328720092773,-0,-0.749213397502899,0.662328720092773,-0,-0.749213397502899,0.662328720092773,-0,-0.749213397502899,0.662328720092773,-0,-0.887251436710358,0.461286157369614,-0,-0.887251436710358,0.461286157369614,-0,-0.887251436710358,0.461286157369614,0,-0.887251436710358,0.461286157369614,0,-0.749213457107544,0.662328660488129,0,-0.749213457107544,0.662328660488129,0,-0.749213457107544,0.662328660488129,0,-0.749213457107544,0.662328660488129,0,-0.529938220977783,0.848036229610443,0,-0.529938220977783,0.848036229610443,0,-0.529938220977783,0.848036229610443,0,-0.529938220977783,0.848036229610443,0,-0.290379881858826,0.956911504268646,0,-0.290379881858826,0.956911504268646,0,-0.290379881858826,0.956911504268646,0,-0.290379881858826,0.956911504268646,0, +0,1,0,0,1,0,0,1,0,0,1,0,0.290379881858826,0.956911504268646,0,0.290379881858826,0.956911504268646,0,0.290379881858826,0.956911504268646,0,0.290379881858826,0.956911504268646,0,0.529938161373138,0.848036348819733,0,0.529938161373138,0.848036348819733,0,0.529938161373138,0.848036348819733,0,0.529938161373138,0.848036348819733,0,0.749213397502899,0.662328720092773,0,0.749213397502899,0.662328720092773,0,0.749213397502899,0.662328720092773,0,0.749213397502899,0.662328720092773,0,0.887251436710358,0.461286157369614,0,0.887251436710358,0.461286157369614,0 + } + BinormalsW: *136 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *408 { + a: 1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,-0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *136 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *112 { + a: 0.375,0,0.625,0,0.375,0.03125,0.625,0.03125,0.375,0.0625,0.625,0.0625,0.375,0.09375,0.625,0.09375,0.375,0.125,0.625,0.125,0.375,0.15625,0.625,0.15625,0.375,0.1875,0.625,0.1875,0.375,0.21875,0.625,0.21875,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.53125,0.625,0.53125,0.375,0.5625,0.625,0.5625,0.375,0.59375,0.625,0.59375,0.375,0.625,0.625,0.625,0.375,0.65625,0.625,0.65625,0.375,0.6875,0.625,0.6875,0.375,0.71875,0.625,0.71875,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.03125,0.875,0.0625,0.875,0.09375,0.875,0.125,0.875,0.15625,0.875,0.1875,0.875,0.21875,0.875,0.25,0.125,0,0.125,0.03125,0.125,0.0625,0.125,0.09375,0.125,0.125,0.125,0.15625,0.125,0.1875,0.125,0.21875,0.125,0.25 + } + UVIndex: *136 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,8,9,11,10,10,11,13,12,12,13,15,14,14,15,17,16,16,17,19,18,18,19,21,20,20,21,23,22,22,23,25,24,24,25,27,26,26,27,29,28,28,29,31,30,30,31,33,32,32,33,35,34,34,35,37,36,1,38,39,3,3,39,40,5,5,40,41,7,7,41,42,9,9,42,43,11,11,43,44,13,13,44,45,15,15,45,46,17,47,0,2,48,48,2,4,49,49,4,6,50,50,6,8,51,51,8,10,52,52,10,12,53,53,12,14,54,54,14,16,55 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *68 { + a: 0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 1840078035680, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Model: 1839849128080, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1839849104880, "Model::sine1Handle", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.5,0.5,0.5 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1839849118800, "Model::pCube2", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,2,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1839849109520, "Model::squash1Handle", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,2,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.5,0.5,0.5 + } + Shading: Y + Culling: "CullingOff" + } + Material: 1840041489744, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 1840044142864, "Deformer::VertexCacheDeformer", "VertexCacheDeformer" { + Version: 100 + Properties70: { + P: "ChannelName", "KString", "", "", "pCubeShape2" + } + } + Deformer: 1840044143072, "Deformer::VertexCacheDeformer", "VertexCacheDeformer" { + Version: 100 + Properties70: { + P: "ChannelName", "KString", "", "", "pCubeShape2_normals" + } + } + Deformer: 1840044141408, "Deformer::VertexCacheDeformer", "VertexCacheDeformer" { + Version: 100 + Properties70: { + P: "ChannelName", "KString", "", "", "pCubeShape1" + } + } + Deformer: 1840044141616, "Deformer::VertexCacheDeformer", "VertexCacheDeformer" { + Version: 100 + Properties70: { + P: "ChannelName", "KString", "", "", "pCubeShape1_normals" + } + } + Cache: 1840031335856, "Cache::VertexCache_pCubeShape2.xml", "" { + Version: 100 + Properties70: { + P: "CacheFileName", "KString", "", "", "maya_cache_sine_7500_ascii_fpc\pCubeShape2.xml" + P: "CacheAbsoluteFileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_cache_sine_7500_ascii_fpc\pCubeShape2.xml" + P: "CacheFileType", "enum", "", "",2 + } + } + Cache: 1840031334960, "Cache::VertexCache_pCubeShape1.xml", "" { + Version: 100 + Properties70: { + P: "CacheFileName", "KString", "", "", "maya_cache_sine_7500_ascii_fpc\pCubeShape1.xml" + P: "CacheAbsoluteFileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_cache_sine_7500_ascii_fpc\pCubeShape1.xml" + P: "CacheFileType", "enum", "", "",2 + } + } + AnimationStack: 1840072393280, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",57732697500 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",57732697500 + } + } + AnimationLayer: 1840038921024, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1839849128080,0 + + ;Model::sine1Handle, Model::RootNode + C: "OO",1839849104880,0 + + ;Model::pCube2, Model::RootNode + C: "OO",1839849118800,0 + + ;Model::squash1Handle, Model::RootNode + C: "OO",1839849109520,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1840038921024,1840072393280 + + ;Deformer::VertexCacheDeformer, Geometry:: + C: "OO",1840044141408,1840073156672 + + ;Deformer::VertexCacheDeformer, Geometry:: + C: "OO",1840044141616,1840073156672 + + ;Geometry::, Model::pCube1 + C: "OO",1840073156672,1839849128080 + + ;Material::lambert1, Model::pCube1 + C: "OO",1840041489744,1839849128080 + + ;NodeAttribute::, Model::sine1Handle + C: "OO",1840078029520,1839849104880 + + ;Deformer::VertexCacheDeformer, Geometry:: + C: "OO",1840044142864,1840073151264 + + ;Deformer::VertexCacheDeformer, Geometry:: + C: "OO",1840044143072,1840073151264 + + ;Geometry::, Model::pCube2 + C: "OO",1840073151264,1839849118800 + + ;Material::lambert1, Model::pCube2 + C: "OO",1840041489744,1839849118800 + + ;NodeAttribute::, Model::squash1Handle + C: "OO",1840078035680,1839849109520 + + ;Cache::VertexCache_pCubeShape2.xml, Deformer::VertexCacheDeformer + C: "OO",1840031335856,1840044142864 + + ;Cache::VertexCache_pCubeShape2.xml, Deformer::VertexCacheDeformer + C: "OO",1840031335856,1840044143072 + + ;Cache::VertexCache_pCubeShape1.xml, Deformer::VertexCacheDeformer + C: "OO",1840031334960,1840044141408 + + ;Cache::VertexCache_pCubeShape1.xml, Deformer::VertexCacheDeformer + C: "OO",1840031334960,1840044141616 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,57732697500 + ReferenceTime: 1924423250,57732697500 + } +} diff --git a/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape1.mcx b/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape1.mcx new file mode 100644 index 0000000..9207ee1 Binary files /dev/null and b/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape1.mcx differ diff --git a/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape1.xml b/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape1.xml new file mode 100644 index 0000000..43fb384 --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape1.xml @@ -0,0 +1,14 @@ + + + + diff --git a/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape2.mcx b/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape2.mcx new file mode 100644 index 0000000..f26b999 Binary files /dev/null and b/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape2.mcx differ diff --git a/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape2.xml b/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape2.xml new file mode 100644 index 0000000..fadcea5 --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_7500_ascii_fpc/pCubeShape2.xml @@ -0,0 +1,14 @@ + + + + diff --git a/modules/ufbx/data/maya_cache_sine_7500_binary.fbx b/modules/ufbx/data/maya_cache_sine_7500_binary.fbx new file mode 100644 index 0000000..416001e Binary files /dev/null and b/modules/ufbx/data/maya_cache_sine_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape1.mcx b/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape1.mcx new file mode 100644 index 0000000..77090e9 Binary files /dev/null and b/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape1.mcx differ diff --git a/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape1.xml b/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape1.xml new file mode 100644 index 0000000..43fb384 --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape1.xml @@ -0,0 +1,14 @@ + + + + diff --git a/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape2.mcx b/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape2.mcx new file mode 100644 index 0000000..f26b999 Binary files /dev/null and b/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape2.mcx differ diff --git a/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape2.xml b/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape2.xml new file mode 100644 index 0000000..fadcea5 --- /dev/null +++ b/modules/ufbx/data/maya_cache_sine_7500_binary_fpc/pCubeShape2.xml @@ -0,0 +1,14 @@ + + + + diff --git a/modules/ufbx/data/maya_camera_light_axes_y_up_6100_ascii.fbx b/modules/ufbx/data/maya_camera_light_axes_y_up_6100_ascii.fbx new file mode 100644 index 0000000..14805ea --- /dev/null +++ b/modules/ufbx/data/maya_camera_light_axes_y_up_6100_ascii.fbx @@ -0,0 +1,474 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 8 + Hour: 22 + Minute: 13 + Second: 17 + Millisecond: 688 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 2 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::forwardCamera", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",960 + Property: "AspectHeight", "double", "N",540 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",1.41732 + Property: "FilmHeight", "Number", "AN",0.94488 + Property: "FilmAspectRatio", "double", "N",1.5 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",3 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",35 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",0 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + NodeAttributeName: "NodeAttribute::forwardCamera_ncl1_1" + } + Model: "Model::forwardLight", "Light" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",-90,-0,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "Color", "AN",1,1,1 + Property: "LightType", "enum", "N",1 + Property: "CastLightOnObject", "bool", "N",1 + Property: "DrawVolumetricLight", "bool", "N",1 + Property: "DrawGroundProjection", "bool", "N",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "N",0 + Property: "Intensity", "Number", "AN",100 + Property: "Fog", "Number", "AN",50 + Property: "DecayType", "enum", "N",0 + Property: "DecayStart", "Number", "AN",0 + Property: "FileName", "KString", "N", "" + Property: "EnableNearAttenuation", "bool", "N",0 + Property: "NearAttenuationStart", "Number", "AN",0 + Property: "NearAttenuationEnd", "Number", "AN",0 + Property: "EnableFarAttenuation", "bool", "N",0 + Property: "FarAttenuationStart", "Number", "AN",0 + Property: "FarAttenuationEnd", "Number", "AN",0 + Property: "CastShadows", "bool", "N",1 + Property: "ShadowColor", "Color", "AN",0,0,0 + Property: "HotSpot", "Number", "AN",0 + Property: "Cone angle", "Number", "AN",45 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Light" + GeometryVersion: 124 + NodeAttributeName: "NodeAttribute::forwardLight_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_camera_light_axes_y_up_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_camera_light_axes_y_up_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2023" + Property: "Original|DateTime_GMT", "DateTime", "", "08/12/2022 20:13:17.687" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_camera_light_axes_y_up_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2023" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "08/12/2022 20:13:17.687" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",0 + Property: "TimeSpanStop", "KTime", "",192442325000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::forwardCamera", "Model::Scene" + Connect: "OO", "Model::forwardLight", "Model::Scene" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 588000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_camera_light_axes_y_up_6100_binary.fbx b/modules/ufbx/data/maya_camera_light_axes_y_up_6100_binary.fbx new file mode 100644 index 0000000..2321ca7 Binary files /dev/null and b/modules/ufbx/data/maya_camera_light_axes_y_up_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_camera_light_axes_y_up_7700_ascii.fbx b/modules/ufbx/data/maya_camera_light_axes_y_up_7700_ascii.fbx new file mode 100644 index 0000000..9261ea1 --- /dev/null +++ b/modules/ufbx/data/maya_camera_light_axes_y_up_7700_ascii.fbx @@ -0,0 +1,430 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 8 + Hour: 22 + Minute: 11 + Second: 21 + Millisecond: 632 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_camera_axes_y_up_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_camera_axes_y_up_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "08/12/2022 20:11:21.630" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_camera_axes_y_up_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "08/12/2022 20:11:21.630" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",192442325000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1340983907024, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 7 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 2 + PropertyTemplate: "FbxCamera" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Position", "Vector", "", "A",0,0,0 + P: "UpVector", "Vector", "", "A",0,1,0 + P: "InterestPosition", "Vector", "", "A",0,0,0 + P: "Roll", "Roll", "", "A",0 + P: "OpticalCenterX", "OpticalCenterX", "", "A",0 + P: "OpticalCenterY", "OpticalCenterY", "", "A",0 + P: "BackgroundColor", "Color", "", "A",0.63,0.63,0.63 + P: "TurnTable", "Number", "", "A",0 + P: "DisplayTurnTableIcon", "bool", "", "",0 + P: "UseMotionBlur", "bool", "", "",0 + P: "UseRealTimeMotionBlur", "bool", "", "",1 + P: "Motion Blur Intensity", "Number", "", "A",1 + P: "AspectRatioMode", "enum", "", "",0 + P: "AspectWidth", "double", "Number", "",320 + P: "AspectHeight", "double", "Number", "",200 + P: "PixelAspectRatio", "double", "Number", "",1 + P: "FilmOffsetX", "Number", "", "A",0 + P: "FilmOffsetY", "Number", "", "A",0 + P: "FilmWidth", "double", "Number", "",0.816 + P: "FilmHeight", "double", "Number", "",0.612 + P: "FilmAspectRatio", "double", "Number", "",1.33333333333333 + P: "FilmSqueezeRatio", "double", "Number", "",1 + P: "FilmFormatIndex", "enum", "", "",0 + P: "PreScale", "Number", "", "A",1 + P: "FilmTranslateX", "Number", "", "A",0 + P: "FilmTranslateY", "Number", "", "A",0 + P: "FilmRollPivotX", "Number", "", "A",0 + P: "FilmRollPivotY", "Number", "", "A",0 + P: "FilmRollValue", "Number", "", "A",0 + P: "FilmRollOrder", "enum", "", "",0 + P: "ApertureMode", "enum", "", "",2 + P: "GateFit", "enum", "", "",0 + P: "FieldOfView", "FieldOfView", "", "A",25.1149997711182 + P: "FieldOfViewX", "FieldOfViewX", "", "A",40 + P: "FieldOfViewY", "FieldOfViewY", "", "A",40 + P: "FocalLength", "Number", "", "A",34.8932762167263 + P: "CameraFormat", "enum", "", "",0 + P: "UseFrameColor", "bool", "", "",0 + P: "FrameColor", "ColorRGB", "Color", "",0.3,0.3,0.3 + P: "ShowName", "bool", "", "",1 + P: "ShowInfoOnMoving", "bool", "", "",1 + P: "ShowGrid", "bool", "", "",1 + P: "ShowOpticalCenter", "bool", "", "",0 + P: "ShowAzimut", "bool", "", "",1 + P: "ShowTimeCode", "bool", "", "",0 + P: "ShowAudio", "bool", "", "",0 + P: "AudioColor", "Vector3D", "Vector", "",0,1,0 + P: "NearPlane", "double", "Number", "",10 + P: "FarPlane", "double", "Number", "",4000 + P: "AutoComputeClipPanes", "bool", "", "",0 + P: "ViewCameraToLookAt", "bool", "", "",1 + P: "ViewFrustumNearFarPlane", "bool", "", "",0 + P: "ViewFrustumBackPlaneMode", "enum", "", "",2 + P: "BackPlaneDistance", "Number", "", "A",4000 + P: "BackPlaneDistanceMode", "enum", "", "",1 + P: "ViewFrustumFrontPlaneMode", "enum", "", "",2 + P: "FrontPlaneDistance", "Number", "", "A",10 + P: "FrontPlaneDistanceMode", "enum", "", "",1 + P: "LockMode", "bool", "", "",0 + P: "LockInterestNavigation", "bool", "", "",0 + P: "BackPlateFitImage", "bool", "", "",0 + P: "BackPlateCrop", "bool", "", "",0 + P: "BackPlateCenter", "bool", "", "",1 + P: "BackPlateKeepRatio", "bool", "", "",1 + P: "BackgroundAlphaTreshold", "double", "Number", "",0.5 + P: "ShowBackplate", "bool", "", "",1 + P: "BackPlaneOffsetX", "Number", "", "A",0 + P: "BackPlaneOffsetY", "Number", "", "A",0 + P: "BackPlaneRotation", "Number", "", "A",0 + P: "BackPlaneScaleX", "Number", "", "A",1 + P: "BackPlaneScaleY", "Number", "", "A",1 + P: "Background Texture", "object", "", "" + P: "FrontPlateFitImage", "bool", "", "",1 + P: "FrontPlateCrop", "bool", "", "",0 + P: "FrontPlateCenter", "bool", "", "",1 + P: "FrontPlateKeepRatio", "bool", "", "",1 + P: "Foreground Opacity", "double", "Number", "",1 + P: "ShowFrontplate", "bool", "", "",1 + P: "FrontPlaneOffsetX", "Number", "", "A",0 + P: "FrontPlaneOffsetY", "Number", "", "A",0 + P: "FrontPlaneRotation", "Number", "", "A",0 + P: "FrontPlaneScaleX", "Number", "", "A",1 + P: "FrontPlaneScaleY", "Number", "", "A",1 + P: "Foreground Texture", "object", "", "" + P: "DisplaySafeArea", "bool", "", "",0 + P: "DisplaySafeAreaOnRender", "bool", "", "",0 + P: "SafeAreaDisplayStyle", "enum", "", "",1 + P: "SafeAreaAspectRatio", "double", "Number", "",1.33333333333333 + P: "Use2DMagnifierZoom", "bool", "", "",0 + P: "2D Magnifier Zoom", "Number", "", "A",100 + P: "2D Magnifier X", "Number", "", "A",50 + P: "2D Magnifier Y", "Number", "", "A",50 + P: "CameraProjectionType", "enum", "", "",0 + P: "OrthoZoom", "double", "Number", "",1 + P: "UseRealTimeDOFAndAA", "bool", "", "",0 + P: "UseDepthOfField", "bool", "", "",0 + P: "FocusSource", "enum", "", "",0 + P: "FocusAngle", "double", "Number", "",3.5 + P: "FocusDistance", "double", "Number", "",200 + P: "UseAntialiasing", "bool", "", "",0 + P: "AntialiasingIntensity", "double", "Number", "",0.77777 + P: "AntialiasingMethod", "enum", "", "",0 + P: "UseAccumulationBuffer", "bool", "", "",0 + P: "FrameSamplingCount", "int", "Integer", "",7 + P: "FrameSamplingType", "enum", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 2 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 1340572281792, "NodeAttribute::forwardCamera", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",960 + P: "AspectHeight", "double", "Number", "",540 + P: "FilmWidth", "Number", "", "A",1.41732 + P: "FilmHeight", "Number", "", "A",0.94488 + P: "FilmAspectRatio", "double", "Number", "",1.5 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",3 + P: "FocalLength", "Number", "", "A",35 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + NodeAttribute: 1340574893488, "NodeAttribute::", "Light" { + Properties70: { + P: "LightType", "enum", "", "",1 + P: "CastShadows", "bool", "", "",1 + } + TypeFlags: "Light" + GeometryVersion: 124 + } + Model: 1340573593520, "Model::forwardCamera", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1340573626000, "Model::forwardLight", "Light" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",-90,-0,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + AnimationStack: 1340544045648, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationLayer: 1340969521840, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::forwardCamera, Model::RootNode + C: "OO",1340573593520,0 + + ;Model::forwardLight, Model::RootNode + C: "OO",1340573626000,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1340969521840,1340544045648 + + ;NodeAttribute::forwardCamera, Model::forwardCamera + C: "OO",1340572281792,1340573593520 + + ;NodeAttribute::, Model::forwardLight + C: "OO",1340574893488,1340573626000 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + } +} diff --git a/modules/ufbx/data/maya_camera_light_axes_y_up_7700_binary.fbx b/modules/ufbx/data/maya_camera_light_axes_y_up_7700_binary.fbx new file mode 100644 index 0000000..87b4e46 Binary files /dev/null and b/modules/ufbx/data/maya_camera_light_axes_y_up_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_character_6100_ascii.fbx b/modules/ufbx/data/maya_character_6100_ascii.fbx new file mode 100644 index 0000000..7f9cb0f --- /dev/null +++ b/modules/ufbx/data/maya_character_6100_ascii.fbx @@ -0,0 +1,6907 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 11 + Hour: 1 + Minute: 13 + Second: 31 + Millisecond: 314 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 66 + ObjectType: "Model" { + Count: 63 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Character" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Character1_Reference", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::Character1_Reference_ncl1_1" + } + Model: "Model::Character1_Hips", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,100,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Hips_ncl1_1" + } + Model: "Model::Character1_LeftUpLeg", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.910000801,-6.27000046000001,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftUpLeg_ncl1_1" + } + Model: "Model::Character1_LeftLeg", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,-44.87864494,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftLeg_ncl1_1" + } + Model: "Model::Character1_LeftFoot", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,-40.700958253,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftFoot_ncl1_1" + } + Model: "Model::Character1_LeftToeBase", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.42699999914487e-06,-6.262317193,12.9547209 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftToeBase_ncl1_1" + } + Model: "Model::Character1_RightUpLeg", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.910000801,-6.27000046000001,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightUpLeg_ncl1_1" + } + Model: "Model::Character1_RightLeg", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.71599999912553e-06,-44.87864494,0.000439024 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightLeg_ncl1_1" + } + Model: "Model::Character1_RightFoot", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",9.18999999655057e-07,-40.700958249,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightFoot_ncl1_1" + } + Model: "Model::Character1_RightToeBase", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0.004800386,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-0.00108538100000111,-6.26231718,12.954749066 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightToeBase_ncl1_1" + } + Model: "Model::Character1_Spine", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,7,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Spine_ncl1_1" + } + Model: "Model::Character1_Spine1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,12.6666666666667,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Spine1_ncl1_1" + } + Model: "Model::Character1_Spine2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,12.6666666666667,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Spine2_ncl1_1" + } + Model: "Model::Character1_LeftShoulder", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",7.000000477,14.2552134666666,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftShoulder_ncl1_1" + } + Model: "Model::Character1_LeftArm", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-0.000735282 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",10.707250593,0.000137399999971421,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftArm_ncl1_1" + } + Model: "Model::Character1_LeftForeArm", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,0.001470564 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",27.3054656977515,0.00035041354882992,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftForeArm_ncl1_1" + } + Model: "Model::Character1_LeftHand", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-0.000735282000000001 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",26.6971473678016,-0.000342606943803503,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHand_ncl1_1" + } + Model: "Model::Character1_LeftHandThumb1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,9.70628259723974e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4.34875684999999,-0.798502499999984,4.282433967 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandThumb1_ncl1_1" + } + Model: "Model::Character1_LeftHandThumb2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,9.70628259723974e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.51258994000001,-0.536099400000012,0.707454324 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandThumb2_ncl1_1" + } + Model: "Model::Character1_LeftHandThumb3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,0.000297862 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.54314040999998,-1.31999999837262e-05,9.34200000024532e-06 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandThumb3_ncl1_1" + } + Model: "Model::Character1_LeftHandThumb4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-0.000595724 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.66674613997908,-1.0963540148623e-05,-8.21100000170105e-06 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandThumb4_ncl1_1" + } + Model: "Model::Character1_LeftHandIndex1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,9.70628259723974e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.82197671999999,0.199729200000007,3.471669416 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandIndex1_ncl1_1" + } + Model: "Model::Character1_LeftHandIndex2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",1.04532179819187e-05,1.99999998497269,0.000299523461597212 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4.22275459999999,-2.20999999953619e-05,0.147199018999999 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandIndex2_ncl1_1" + } + Model: "Model::Character1_LeftHandIndex3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-6.07012437898178e-21,-1.999999985,-0.000299341 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.6474830577704,-2.76317382201796e-05,0.184964480918186 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandIndex3_ncl1_1" + } + Model: "Model::Character1_LeftHandIndex4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-6.06642662327484e-21,7.95138670365879e-16,9.73662968835331e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.95703422999998,-1.02000000197222e-05,0.0682189000000015 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandIndex4_ncl1_1" + } + Model: "Model::Character1_LeftHandMiddle1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,9.70628259723974e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.80987936,0.500890499999997,1.304684381 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandMiddle1_ncl1_1" + } + Model: "Model::Character1_LeftHandMiddle2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0.003563334,9.70628259723974e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4.86325168,0,0.000302455000000146 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandMiddle2_ncl1_1" + } + Model: "Model::Character1_LeftHandMiddle3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-6.03652260792567e-24,-0.003563334,9.70628261601088e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.76523659396877,0,0.000343758347727263 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandMiddle3_ncl1_1" + } + Model: "Model::Character1_LeftHandMiddle4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",1.3154465848357e-39,7.76502607779179e-19,9.70628259723974e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.00563215999999,2.8421709430404e-14,0.000123596000000337 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandMiddle4_ncl1_1" + } + Model: "Model::Character1_LeftHandRing1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,9.70628259723974e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.89375978999999,0.379919600000022,-0.793158909 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandRing1_ncl1_1" + } + Model: "Model::Character1_LeftHandRing2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0.003563529,9.70628259723974e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4.53775882999999,0,8.89999999253988e-08 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandRing2_ncl1_1" + } + Model: "Model::Character1_LeftHandRing3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-6.03685295077637e-24,-0.003563529,9.70628261601294e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.30452585555004,0,0.000143213709484669 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandRing3_ncl1_1" + } + Model: "Model::Character1_LeftHandRing4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-1.3154465848357e-39,-7.76502607779179e-19,9.70628259723974e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.92334735999999,0,-8.17000000208346e-07 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandRing4_ncl1_1" + } + Model: "Model::Character1_LeftHandPinky1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,9.70628259723974e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.88227468999999,-0.313026999999977,-2.490356465 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandPinky1_ncl1_1" + } + Model: "Model::Character1_LeftHandPinky2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-0.000763025999999999 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3.04409933000001,4.06000000054973e-05,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandPinky2_ncl1_1" + } + Model: "Model::Character1_LeftHandPinky3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,0.000763025999999999 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.97450148947465,5.25950601399927e-05,-1.42999999841464e-07 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandPinky3_ncl1_1" + } + Model: "Model::Character1_LeftHandPinky4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,9.70628259723974e-20 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.66661465000001,2.2200000103112e-05,7.9099999972243e-07 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandPinky4_ncl1_1" + } + Model: "Model::Character1_RightShoulder", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-6.999999523,14.2552134666666,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightShoulder_ncl1_1" + } + Model: "Model::Character1_RightArm", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,0.002318361 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-10.707275387,0.000433200000031775,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightArm_ncl1_1" + } + Model: "Model::Character1_RightForeArm", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-0.004636722 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-27.3055982276469,0.00110486731455239,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightForeArm_ncl1_1" + } + Model: "Model::Character1_RightHand", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,0.002318361 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-26.6969880880925,-0.00108154110256464,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHand_ncl1_1" + } + Model: "Model::Character1_RightHandThumb1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-4.34838078999999,-0.798498100000018,4.282814738 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandThumb1_ncl1_1" + } + Model: "Model::Character1_RightHandThumb2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.51252751,-0.536098899999985,0.70767665 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandThumb2_ncl1_1" + } + Model: "Model::Character1_RightHandThumb3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,0.000602085999999999 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.54158935999999,2.68000000005486e-05,0.0888203150000004 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandThumb3_ncl1_1" + } + Model: "Model::Character1_RightHandThumb4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-0.000812677999999999 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.66511975966058,4.63060993638464e-05,0.0931373170000009 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandThumb4_ncl1_1" + } + Model: "Model::Character1_RightHandIndex1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.82167265999999,0.199733699999996,3.472444296 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandIndex1_ncl1_1" + } + Model: "Model::Character1_RightHandIndex2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064658,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-4.22275022000001,-3.00000010611257e-07,-0.147351788 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandIndex2_ncl1_1" + } + Model: "Model::Character1_RightHandIndex3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",1.35584729619604e-20,-2.000064658,-3.88487975568133e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.64747684463245,-3.00000095876385e-07,-0.185063479213413 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandIndex3_ncl1_1" + } + Model: "Model::Character1_RightHandIndex4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1.95703222,-9.99999372197635e-08,-0.0682901520000003 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandIndex4_ncl1_1" + } + Model: "Model::Character1_RightHandMiddle1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.80976602999999,0.500893099999985,1.305458427 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandMiddle1_ncl1_1" + } + Model: "Model::Character1_RightHandMiddle2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064658,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-4.86029449000002,-4.00000033096148e-07,-0.169598752 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandMiddle2_ncl1_1" + } + Model: "Model::Character1_RightHandMiddle3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",1.35584729619604e-20,-2.000064658,-3.88487975568133e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.75850591652296,-2.00000016548074e-07,-0.19282461233943 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandMiddle3_ncl1_1" + } + Model: "Model::Character1_RightHandMiddle4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.00441268,-1.99999988126365e-07,-0.0699434750000005 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandMiddle4_ncl1_1" + } + Model: "Model::Character1_RightHandRing1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.89383242999999,0.379920299999981,-0.792376756 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandRing1_ncl1_1" + } + Model: "Model::Character1_RightHandRing2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064658,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-4.53499961000001,-4.00000033096148e-07,-0.158247672 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandRing2_ncl1_1" + } + Model: "Model::Character1_RightHandRing3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",1.35584729619604e-20,-2.000064658,-3.88487975568133e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.29891662121804,-1.99999959704655e-07,-0.160698477276434 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandRing3_ncl1_1" + } + Model: "Model::Character1_RightHandRing4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1.92217792,-9.9999965641473e-08,-0.0670739159999998 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandRing4_ncl1_1" + } + Model: "Model::Character1_RightHandPinky1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,-3.88251303889589e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.8824961,-0.313027800000015,-2.489574194 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandPinky1_ncl1_1" + } + Model: "Model::Character1_RightHandPinky2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-4.33455853143664e-05,2.0000646575305,-0.00124197162447093 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-3.04594261999999,-6.60000000038963e-05,-0.106287401000001 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandPinky2_ncl1_1" + } + Model: "Model::Character1_RightHandPinky3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-2.42804984730083e-20,-2.000064658,0.001241215 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1.97208741982242,-8.5521898654406e-05,-0.137852514044825 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandPinky3_ncl1_1" + } + Model: "Model::Character1_RightHandPinky4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-3.33671942990681e-20,-2.25825461155437e-40,-3.87771465434942e-19 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1.66762384999998,-3.62000000109219e-05,-0.0581913190000005 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandPinky4_ncl1_1" + } + Model: "Model::Character1_Neck", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,12.6666666666667,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Neck_ncl1_1" + } + Model: "Model::Character1_Head", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,20,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Head_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_skeleton_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_skeleton_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "10/09/2021 22:13:31.312" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_skeleton_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "10/09/2021 22:13:31.312" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Constraint: "Constraint::Character1", "Character" { + Type: "Character" + MultiLayer: 0 + Properties60: { + Property: "Active", "bool", "",0 + Property: "Lock", "bool", "",0 + Property: "Weight", "Weight", "A",100 + Property: "SourceObject", "object", "" + Property: "DestinationObject", "object", "" + Property: "Actor", "object", "" + Property: "Character", "object", "" + Property: "ControlSet", "object", "" + Property: "PullIterationCount", "int", "",10 + Property: "Posture", "enum", "",0 + Property: "ForceActorSpace", "bool", "",0 + Property: "ScaleCompensation", "Number", "A",100 + Property: "ScaleCompensationMode", "enum", "",1 + Property: "HipsHeightCompensation", "Number", "A",0 + Property: "HipsHeightCompensationMode", "enum", "",1 + Property: "AnkleHeightCompensation", "Number", "A",0 + Property: "AnkleHeightCompensationMode", "enum", "",1 + Property: "AnkleProximityCompensation", "Number", "A",0 + Property: "AnkleProximityCompensationMode", "enum", "",1 + Property: "MassCenterCompensation", "Number", "A",80 + Property: "ApplyLimits", "bool", "",0 + Property: "ChestReduction", "Number", "A",0 + Property: "CollarReduction", "Number", "A",0 + Property: "NeckReduction", "Number", "A",0 + Property: "HeadReduction", "Number", "A",0 + Property: "ReachActorLeftAnkle", "Number", "A",100 + Property: "ReachActorRightAnkle", "Number", "A",100 + Property: "ReachActorLeftKnee", "Number", "A",0 + Property: "ReachActorRightKnee", "Number", "A",0 + Property: "ReachActorChest", "Number", "A",0 + Property: "ReachActorHead", "Number", "A",0 + Property: "ReachActorLeftWrist", "Number", "A",0 + Property: "ReachActorRightWrist", "Number", "A",0 + Property: "ReachActorLeftElbow", "Number", "A",0 + Property: "ReachActorRightElbow", "Number", "A",0 + Property: "ReachActorLeftFingerBase", "Number", "A",0 + Property: "ReachActorRightFingerBase", "Number", "A",0 + Property: "ReachActorLeftToesBase", "Number", "A",0 + Property: "ReachActorRightToesBase", "Number", "A",0 + Property: "ReachActorLeftFingerBaseRotation", "Number", "A",0 + Property: "ReachActorRightFingerBaseRotation", "Number", "A",0 + Property: "ReachActorLeftToesBaseRotation", "Number", "A",0 + Property: "ReachActorRightToesBaseRotation", "Number", "A",0 + Property: "ReachActorLeftAnkleRotation", "Number", "A",100 + Property: "ReachActorRightAnkleRotation", "Number", "A",100 + Property: "ReachActorHeadRotation", "Number", "A",0 + Property: "ReachActorLeftWristRotation", "Number", "A",0 + Property: "ReachActorRightWristRotation", "Number", "A",0 + Property: "ReachActorChestRotation", "Number", "A",0 + Property: "ReachActorLowerChestRotation", "Number", "A",0 + Property: "HipsTOffset", "Vector", "A",0,0,0 + Property: "ChestTOffset", "Vector", "A",0,0,0 + Property: "LeftUpLegRoll", "Number", "A",0 + Property: "LeftUpLegRollMode", "bool", "",0 + Property: "LeftLegRoll", "Number", "A",100 + Property: "LeftLegRollMode", "bool", "",0 + Property: "RightUpLegRoll", "Number", "A",0 + Property: "RightUpLegRollMode", "bool", "",0 + Property: "RightLegRoll", "Number", "A",100 + Property: "RightLegRollMode", "bool", "",0 + Property: "LeftArmRoll", "Number", "A",0 + Property: "LeftArmRollMode", "bool", "",0 + Property: "LeftForeArmRoll", "Number", "A",100 + Property: "LeftForeArmRollMode", "bool", "",0 + Property: "RightArmRoll", "Number", "A",0 + Property: "RightArmRollMode", "bool", "",0 + Property: "RightForeArmRoll", "Number", "A",100 + Property: "RightForeArmRollMode", "bool", "",0 + Property: "RollExtractionMode", "enum", "",0 + Property: "FootFloorContact", "bool", "",0 + Property: "FootAutomaticToes", "bool", "",0 + Property: "FootFloorPivot", "enum", "",0 + Property: "FootBottomToAnkle", "double", "",0 + Property: "FootBackToAnkle", "double", "",4.5 + Property: "FootMiddleToAnkle", "double", "",13 + Property: "FootFrontToMiddle", "double", "",7 + Property: "FootInToAnkle", "double", "",5 + Property: "FootOutToAnkle", "double", "",5 + Property: "FootContactSize", "double", "",100 + Property: "FootContactStiffness", "Number", "A",0 + Property: "FootFingerContactRollStiffness", "Number", "A",0 + Property: "HandFloorContact", "bool", "",0 + Property: "HandAutomaticFingers", "bool", "",0 + Property: "HandFloorPivot", "enum", "",0 + Property: "HandBottomToWrist", "double", "",0 + Property: "HandBackToWrist", "double", "",4.5 + Property: "HandMiddleToWrist", "double", "",13 + Property: "HandFrontToMiddle", "double", "",7 + Property: "HandInToWrist", "double", "",5 + Property: "HandOutToWrist", "double", "",5 + Property: "HandContactSize", "double", "",100 + Property: "HandContactStiffness", "Number", "A",0 + Property: "HandFingerContactRollStiffness", "Number", "A",0 + Property: "CtrlPullLeftToeBase", "Number", "A",0 + Property: "CtrlPullLeftFoot", "Number", "A",100 + Property: "CtrlPullLeftKnee", "Number", "A",0 + Property: "CtrlPullRightToeBase", "Number", "A",0 + Property: "CtrlPullRightFoot", "Number", "A",100 + Property: "CtrlPullRightKnee", "Number", "A",0 + Property: "CtrlPullLeftFingerBase", "Number", "A",0 + Property: "CtrlPullLeftHand", "Number", "A",100 + Property: "CtrlPullLeftElbow", "Number", "A",0 + Property: "CtrlPullRightFingerBase", "Number", "A",0 + Property: "CtrlPullRightHand", "Number", "A",100 + Property: "CtrlPullRightElbow", "Number", "A",0 + Property: "CtrlChestPullLeftHand", "Number", "A",100 + Property: "CtrlChestPullRightHand", "Number", "A",100 + Property: "CtrlPullHead", "Number", "A",0 + Property: "CtrlResistHipsPosition", "Number", "A",0 + Property: "CtrlEnforceGravity", "Number", "A",60.0000023841858 + Property: "CtrlResistHipsOrientation", "Number", "A",0 + Property: "CtrlResistChestPosition", "Number", "A",0 + Property: "CtrlResistChestOrientation", "Number", "A",0 + Property: "CtrlResistLeftCollar", "Number", "A",50 + Property: "CtrlResistRightCollar", "Number", "A",50 + Property: "CtrlResistLeftKnee", "Number", "A",50 + Property: "CtrlResistMaximumExtensionLeftKnee", "Number", "A",50 + Property: "CtrlResistCompressionFactorLeftKnee", "Number", "A",50 + Property: "CtrlResistRightKnee", "Number", "A",50 + Property: "CtrlResistMaximumExtensionRightKnee", "Number", "A",50 + Property: "CtrlResistCompressionFactorRightKnee", "Number", "A",50 + Property: "CtrlResistLeftElbow", "Number", "A",50 + Property: "CtrlResistMaximumExtensionLeftElbow", "Number", "A",50 + Property: "CtrlResistCompressionFactorLeftElbow", "Number", "A",50 + Property: "CtrlResistRightElbow", "Number", "A",50 + Property: "CtrlResistMaximumExtensionRightElbow", "Number", "A",50 + Property: "CtrlResistCompressionFactorRightElbow", "Number", "A",50 + Property: "CtrlSpineStiffness", "Number", "A",0 + Property: "CtrlNeckStiffness", "Number", "A",0 + Property: "MirrorMode", "bool", "",0 + Property: "ShoulderCorrection", "Number", "A",0 + Property: "LeftKneeKillPitch", "bool", "",0 + Property: "RightKneeKillPitch", "bool", "",0 + Property: "LeftElbowKillPitch", "bool", "",0 + Property: "RightElbowKillPitch", "bool", "",0 + Property: "HipsTranslationMode", "enum", "",0 + Property: "WriteReference", "bool", "",0 + Property: "SyncMode", "bool", "H",1 + Property: "Damping", "Number", "A",0 + Property: "OrientationDamping", "Number", "A",0 + Property: "OrientationDampingMode", "enum", "",1 + Property: "DisplacementDamping", "Number", "A",0 + Property: "DisplacementDampingMode", "enum", "",1 + Property: "DisplacementMemory", "Number", "A",0 + Property: "DisplacementMemoryMode", "enum", "",0 + Property: "HipsDisplacementDamping", "Number", "A",0 + Property: "HipsDisplacementDampingMode", "enum", "",0 + Property: "AnkleDisplacementDamping", "Number", "A",0 + Property: "AnkleDisplacementDampingMode", "enum", "",0 + Property: "WristDisplacementDamping", "Number", "A",0 + Property: "WristDisplacementDampingMode", "enum", "",0 + Property: "Stabilization", "Number", "A",0 + Property: "AnkleStabilizationTime", "Number", "A",0 + Property: "AnkleStabilizationTimeMode", "enum", "",0 + Property: "AnkleStabilizationPerimeter", "Number", "A",0 + Property: "AnkleStabilizationPerimeterMode", "enum", "",0 + Property: "AnkleStabilizationAngularPerimeter", "Number", "A",0 + Property: "AnkleStabilizationAngularPerimeterMode", "enum", "",1 + Property: "AnkleStabilizationFloorProximity", "Number", "A",0 + Property: "AnkleStabilizationFloorProximityMode", "enum", "",1 + Property: "AnkleStabilizationDamping", "Number", "A",0 + Property: "AnkleStabilizationDampingMode", "enum", "",0 + Property: "AnkleStabilizationRecoveryTime", "Number", "A",0 + Property: "AnkleStabilizationRecoveryTimeMode", "enum", "",1 + Property: "LeftHandThumbTip", "double", "",0.5 + Property: "LeftHandIndexTip", "double", "",0.5 + Property: "LeftHandMiddleTip", "double", "",0.5 + Property: "LeftHandRingTip", "double", "",0.5 + Property: "LeftHandPinkyTip", "double", "",0.5 + Property: "LeftHandExtraFingerTip", "double", "",0.5 + Property: "RightHandThumbTip", "double", "",0.5 + Property: "RightHandIndexTip", "double", "",0.5 + Property: "RightHandMiddleTip", "double", "",0.5 + Property: "RightHandRingTip", "double", "",0.5 + Property: "RightHandPinkyTip", "double", "",0.5 + Property: "RightHandExtraFingerTip", "double", "",0.5 + Property: "LeftFootThumbTip", "double", "",0.5 + Property: "LeftFootIndexTip", "double", "",0.5 + Property: "LeftFootMiddleTip", "double", "",0.5 + Property: "LeftFootRingTip", "double", "",0.5 + Property: "LeftFootPinkyTip", "double", "",0.5 + Property: "LeftFootExtraFingerTip", "double", "",0.5 + Property: "RightFootThumbTip", "double", "",0.5 + Property: "RightFootIndexTip", "double", "",0.5 + Property: "RightFootMiddleTip", "double", "",0.5 + Property: "RightFootRingTip", "double", "",0.5 + Property: "RightFootPinkyTip", "double", "",0.5 + Property: "RightFootExtraFingerTip", "double", "",0.5 + Property: "FingerSolving", "bool", "",1 + Property: "FootFingerContact", "bool", "",0 + Property: "FootContactType", "enum", "",0 + Property: "FootFingerContactMode", "enum", "",1 + Property: "HandFingerContact", "bool", "",0 + Property: "HandContactType", "enum", "",0 + Property: "HandFingerContactMode", "enum", "",1 + Property: "ContactBehaviour", "enum", "",0 + Property: "HikVersion", "double", "",2016.5 + Property: "Characterize", "bool", "",0 + Property: "HipsLink", "object", "" + Property: "LeftUpLegLink", "object", "" + Property: "LeftLegLink", "object", "" + Property: "LeftFootLink", "object", "" + Property: "LeftToeBaseLink", "object", "" + Property: "RightUpLegLink", "object", "" + Property: "RightLegLink", "object", "" + Property: "RightFootLink", "object", "" + Property: "RightToeBaseLink", "object", "" + Property: "SpineLink", "object", "" + Property: "Spine1Link", "object", "" + Property: "LeftShoulderLink", "object", "" + Property: "LeftArmLink", "object", "" + Property: "LeftForeArmLink", "object", "" + Property: "LeftHandLink", "object", "" + Property: "RightShoulderLink", "object", "" + Property: "RightArmLink", "object", "" + Property: "RightForeArmLink", "object", "" + Property: "RightHandLink", "object", "" + Property: "NeckLink", "object", "" + Property: "HeadLink", "object", "" + Property: "LeftUpLegRollLink", "object", "" + Property: "LeftLegRollLink", "object", "" + Property: "RightUpLegRollLink", "object", "" + Property: "RightLegRollLink", "object", "" + Property: "LeftArmRollLink", "object", "" + Property: "LeftForeArmRollLink", "object", "" + Property: "RightArmRollLink", "object", "" + Property: "RightForeArmRollLink", "object", "" + Property: "Spine2Link", "object", "" + Property: "Spine3Link", "object", "" + Property: "Spine4Link", "object", "" + Property: "Spine5Link", "object", "" + Property: "Spine6Link", "object", "" + Property: "Spine7Link", "object", "" + Property: "Spine8Link", "object", "" + Property: "Spine9Link", "object", "" + Property: "LeftHandThumb1Link", "object", "" + Property: "LeftHandThumb2Link", "object", "" + Property: "LeftHandThumb3Link", "object", "" + Property: "LeftHandIndex1Link", "object", "" + Property: "LeftHandIndex2Link", "object", "" + Property: "LeftHandIndex3Link", "object", "" + Property: "LeftHandMiddle1Link", "object", "" + Property: "LeftHandMiddle2Link", "object", "" + Property: "LeftHandMiddle3Link", "object", "" + Property: "LeftHandRing1Link", "object", "" + Property: "LeftHandRing2Link", "object", "" + Property: "LeftHandRing3Link", "object", "" + Property: "LeftHandPinky1Link", "object", "" + Property: "LeftHandPinky2Link", "object", "" + Property: "LeftHandPinky3Link", "object", "" + Property: "RightHandThumb1Link", "object", "" + Property: "RightHandThumb2Link", "object", "" + Property: "RightHandThumb3Link", "object", "" + Property: "RightHandIndex1Link", "object", "" + Property: "RightHandIndex2Link", "object", "" + Property: "RightHandIndex3Link", "object", "" + Property: "RightHandMiddle1Link", "object", "" + Property: "RightHandMiddle2Link", "object", "" + Property: "RightHandMiddle3Link", "object", "" + Property: "RightHandRing1Link", "object", "" + Property: "RightHandRing2Link", "object", "" + Property: "RightHandRing3Link", "object", "" + Property: "RightHandPinky1Link", "object", "" + Property: "RightHandPinky2Link", "object", "" + Property: "RightHandPinky3Link", "object", "" + Property: "ReferenceLink", "object", "" + Property: "LeftFloorContactLink", "object", "" + Property: "RightFloorContactLink", "object", "" + Property: "HipsTranslationLink", "object", "" + Property: "Props0Link", "object", "" + Property: "Props1Link", "object", "" + Property: "Props2Link", "object", "" + Property: "Props3Link", "object", "" + Property: "Props4Link", "object", "" + Property: "GameModeParentLeftHipRollLink", "object", "" + Property: "GameModeParentLeftKneeLink", "object", "" + Property: "GameModeParentLeftKneeRollLink", "object", "" + Property: "GameModeParentRightHipRollLink", "object", "" + Property: "GameModeParentRightKneeLink", "object", "" + Property: "GameModeParentRightKneeRollLink", "object", "" + Property: "GameModeParentLeftShoulderRollLink", "object", "" + Property: "GameModeParentLeftElbowLink", "object", "" + Property: "GameModeParentLeftElbowRollLink", "object", "" + Property: "GameModeParentRightShoulderRollLink", "object", "" + Property: "GameModeParentRightElbowLink", "object", "" + Property: "GameModeParentRightElbowRollLink", "object", "" + Property: "LeftHandFloorContactLink", "object", "" + Property: "RightHandFloorContactLink", "object", "" + Property: "LeftFingerBaseLink", "object", "" + Property: "RightFingerBaseLink", "object", "" + Property: "Neck1Link", "object", "" + Property: "Neck2Link", "object", "" + Property: "Neck3Link", "object", "" + Property: "Neck4Link", "object", "" + Property: "Neck5Link", "object", "" + Property: "Neck6Link", "object", "" + Property: "Neck7Link", "object", "" + Property: "Neck8Link", "object", "" + Property: "Neck9Link", "object", "" + Property: "LeftInHandThumbLink", "object", "" + Property: "LeftHandThumb4Link", "object", "" + Property: "LeftInHandIndexLink", "object", "" + Property: "LeftHandIndex4Link", "object", "" + Property: "LeftInHandMiddleLink", "object", "" + Property: "LeftHandMiddle4Link", "object", "" + Property: "LeftInHandRingLink", "object", "" + Property: "LeftHandRing4Link", "object", "" + Property: "LeftInHandPinkyLink", "object", "" + Property: "LeftHandPinky4Link", "object", "" + Property: "LeftInHandExtraFingerLink", "object", "" + Property: "LeftHandExtraFinger1Link", "object", "" + Property: "LeftHandExtraFinger2Link", "object", "" + Property: "LeftHandExtraFinger3Link", "object", "" + Property: "LeftHandExtraFinger4Link", "object", "" + Property: "RightInHandThumbLink", "object", "" + Property: "RightHandThumb4Link", "object", "" + Property: "RightInHandIndexLink", "object", "" + Property: "RightHandIndex4Link", "object", "" + Property: "RightInHandMiddleLink", "object", "" + Property: "RightHandMiddle4Link", "object", "" + Property: "RightInHandRingLink", "object", "" + Property: "RightHandRing4Link", "object", "" + Property: "RightInHandPinkyLink", "object", "" + Property: "RightHandPinky4Link", "object", "" + Property: "RightInHandExtraFingerLink", "object", "" + Property: "RightHandExtraFinger1Link", "object", "" + Property: "RightHandExtraFinger2Link", "object", "" + Property: "RightHandExtraFinger3Link", "object", "" + Property: "RightHandExtraFinger4Link", "object", "" + Property: "LeftInFootThumbLink", "object", "" + Property: "LeftFootThumb1Link", "object", "" + Property: "LeftFootThumb2Link", "object", "" + Property: "LeftFootThumb3Link", "object", "" + Property: "LeftFootThumb4Link", "object", "" + Property: "LeftInFootIndexLink", "object", "" + Property: "LeftFootIndex1Link", "object", "" + Property: "LeftFootIndex2Link", "object", "" + Property: "LeftFootIndex3Link", "object", "" + Property: "LeftFootIndex4Link", "object", "" + Property: "LeftInFootMiddleLink", "object", "" + Property: "LeftFootMiddle1Link", "object", "" + Property: "LeftFootMiddle2Link", "object", "" + Property: "LeftFootMiddle3Link", "object", "" + Property: "LeftFootMiddle4Link", "object", "" + Property: "LeftInFootRingLink", "object", "" + Property: "LeftFootRing1Link", "object", "" + Property: "LeftFootRing2Link", "object", "" + Property: "LeftFootRing3Link", "object", "" + Property: "LeftFootRing4Link", "object", "" + Property: "LeftInFootPinkyLink", "object", "" + Property: "LeftFootPinky1Link", "object", "" + Property: "LeftFootPinky2Link", "object", "" + Property: "LeftFootPinky3Link", "object", "" + Property: "LeftFootPinky4Link", "object", "" + Property: "LeftInFootExtraFingerLink", "object", "" + Property: "LeftFootExtraFinger1Link", "object", "" + Property: "LeftFootExtraFinger2Link", "object", "" + Property: "LeftFootExtraFinger3Link", "object", "" + Property: "LeftFootExtraFinger4Link", "object", "" + Property: "RightInFootThumbLink", "object", "" + Property: "RightFootThumb1Link", "object", "" + Property: "RightFootThumb2Link", "object", "" + Property: "RightFootThumb3Link", "object", "" + Property: "RightFootThumb4Link", "object", "" + Property: "RightInFootIndexLink", "object", "" + Property: "RightFootIndex1Link", "object", "" + Property: "RightFootIndex2Link", "object", "" + Property: "RightFootIndex3Link", "object", "" + Property: "RightFootIndex4Link", "object", "" + Property: "RightInFootMiddleLink", "object", "" + Property: "RightFootMiddle1Link", "object", "" + Property: "RightFootMiddle2Link", "object", "" + Property: "RightFootMiddle3Link", "object", "" + Property: "RightFootMiddle4Link", "object", "" + Property: "RightInFootRingLink", "object", "" + Property: "RightFootRing1Link", "object", "" + Property: "RightFootRing2Link", "object", "" + Property: "RightFootRing3Link", "object", "" + Property: "RightFootRing4Link", "object", "" + Property: "RightInFootPinkyLink", "object", "" + Property: "RightFootPinky1Link", "object", "" + Property: "RightFootPinky2Link", "object", "" + Property: "RightFootPinky3Link", "object", "" + Property: "RightFootPinky4Link", "object", "" + Property: "RightInFootExtraFingerLink", "object", "" + Property: "RightFootExtraFinger1Link", "object", "" + Property: "RightFootExtraFinger2Link", "object", "" + Property: "RightFootExtraFinger3Link", "object", "" + Property: "RightFootExtraFinger4Link", "object", "" + Property: "LeftShoulderExtraLink", "object", "" + Property: "RightShoulderExtraLink", "object", "" + } + CHARACTERIZE: 0 + LOCK_XFORM: 0 + LOCK_PICK: 0 + REFERENCE: { + TOFFSETX: 0 + TOFFSETY: 0 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LEFT_FLOOR: { + } + RIGHT_FLOOR: { + } + LEFT_HANDFLOOR: { + } + RIGHT_HANDFLOOR: { + } + BASE: { + LINK: "Hips" { + TOFFSETX: 0 + TOFFSETY: 100 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftUpLeg" { + TOFFSETX: 8.910000801 + TOFFSETY: 93.72999954 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftLeg" { + TOFFSETX: 8.910000801 + TOFFSETY: 48.8513546 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftFoot" { + TOFFSETX: 8.910000801 + TOFFSETY: 8.150396347 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightUpLeg" { + TOFFSETX: -8.910000801 + TOFFSETY: 93.72999954 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightLeg" { + TOFFSETX: -8.910003517 + TOFFSETY: 48.8513546 + TOFFSETZ: 0.000439024 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightFoot" { + TOFFSETX: -8.910002598 + TOFFSETY: 8.150396351 + TOFFSETZ: 0.000439024 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Spine" { + TOFFSETX: 0 + TOFFSETY: 107 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftArm" { + TOFFSETX: 17.70725107 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000735282 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftForeArm" { + TOFFSETX: 45.01271677 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000735282000000001 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHand" { + TOFFSETX: 71.70986414 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightArm" { + TOFFSETX: -17.70727491 + TOFFSETY: 146.58898 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.002318361 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightForeArm" { + TOFFSETX: -45.01287316 + TOFFSETY: 146.58898 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.002318361 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHand" { + TOFFSETX: -71.70986127 + TOFFSETY: 146.5889787 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Head" { + TOFFSETX: 0 + TOFFSETY: 165 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + AUXILIARY: { + LINK: "LeftToeBase" { + TOFFSETX: 8.910009228 + TOFFSETY: 1.888079154 + TOFFSETZ: 12.9547209 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightToeBase" { + TOFFSETX: -8.911087979 + TOFFSETY: 1.888079171 + TOFFSETZ: 12.95518809 + ROFFSETX: 0 + ROFFSETY: 0.004800386 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftShoulder" { + TOFFSETX: 7.000000477 + TOFFSETY: 146.5885468 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightShoulder" { + TOFFSETX: -6.999999523 + TOFFSETY: 146.5885468 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Neck" { + TOFFSETX: 0 + TOFFSETY: 145 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + SPINE: { + LINK: "Spine1" { + TOFFSETX: 0 + TOFFSETY: 119.666666666667 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Spine2" { + TOFFSETX: 0 + TOFFSETY: 132.333333333333 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + NECK: { + } + ROLL: { + } + SPECIAL: { + } + LEFTHAND: { + LINK: "LeftHandThumb1" { + TOFFSETX: 76.05862099 + TOFFSETY: 145.7901817 + TOFFSETZ: 4.282433967 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb2" { + TOFFSETX: 78.57121093 + TOFFSETY: 145.2540823 + TOFFSETZ: 4.989888291 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb3" { + TOFFSETX: 81.11435134 + TOFFSETY: 145.2540691 + TOFFSETZ: 4.989897633 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000297862 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex1" { + TOFFSETX: 80.53184086 + TOFFSETY: 146.7884134 + TOFFSETZ: 3.471669416 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex2" { + TOFFSETX: 84.75459546 + TOFFSETY: 146.7883913 + TOFFSETZ: 3.618868435 + ROFFSETX: 0 + ROFFSETY: 1.99999998497269 + ROFFSETZ: 0.000299523461597212 + SOFFSETX: 1 + SOFFSETY: 0.999999999999983 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex3" { + TOFFSETX: 87.40692091 + TOFFSETY: 146.7883775 + TOFFSETZ: 3.711324415 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle1" { + TOFFSETX: 80.5197435 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.304684381 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle2" { + TOFFSETX: 85.38299518 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.304986836 + ROFFSETX: 0 + ROFFSETY: 0.003563334 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle3" { + TOFFSETX: 88.14823179 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.305158619 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing1" { + TOFFSETX: 80.60362393 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793158909 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing2" { + TOFFSETX: 85.14138276 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.79315882 + ROFFSETX: 0 + ROFFSETY: 0.003563529 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing3" { + TOFFSETX: 87.44590862 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793158937 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky1" { + TOFFSETX: 80.59213883 + TOFFSETY: 146.2756572 + TOFFSETZ: -2.490356465 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky2" { + TOFFSETX: 83.63623816 + TOFFSETY: 146.2756978 + TOFFSETZ: -2.490356465 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000763025999999999 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky3" { + TOFFSETX: 85.61073965 + TOFFSETY: 146.2757241 + TOFFSETZ: -2.490356608 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb4" { + TOFFSETX: 83.78109748 + TOFFSETY: 145.254072 + TOFFSETZ: 4.989889422 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000297862 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex4" { + TOFFSETX: 89.36395514 + TOFFSETY: 146.7883673 + TOFFSETZ: 3.779543315 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle4" { + TOFFSETX: 90.15386395 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.305282215 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing4" { + TOFFSETX: 89.36925598 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793159754 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky4" { + TOFFSETX: 87.2773543 + TOFFSETY: 146.2757463 + TOFFSETZ: -2.490355817 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + RIGHTHAND: { + LINK: "RightHandThumb1" { + TOFFSETX: -76.05824206 + TOFFSETY: 145.7904806 + TOFFSETZ: 4.282814738 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb2" { + TOFFSETX: -78.57076957 + TOFFSETY: 145.2543817 + TOFFSETZ: 4.990491388 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb3" { + TOFFSETX: -81.11235893 + TOFFSETY: 145.2544085 + TOFFSETZ: 5.079311703 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000602086 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex1" { + TOFFSETX: -80.53153393 + TOFFSETY: 146.7887124 + TOFFSETZ: 3.472444296 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex2" { + TOFFSETX: -84.75428415 + TOFFSETY: 146.7887121 + TOFFSETZ: 3.325092508 + ROFFSETX: 0 + ROFFSETY: 2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex3" { + TOFFSETX: -87.40660695 + TOFFSETY: 146.7887118 + TOFFSETZ: 3.232540367 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle1" { + TOFFSETX: -80.5196273 + TOFFSETY: 147.0898718 + TOFFSETZ: 1.305458427 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle2" { + TOFFSETX: -85.37992179 + TOFFSETY: 147.0898714 + TOFFSETZ: 1.135859675 + ROFFSETX: 0 + ROFFSETY: 2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle3" { + TOFFSETX: -88.14347689 + TOFFSETY: 147.0898712 + TOFFSETZ: 1.039426113 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing1" { + TOFFSETX: -80.6036937 + TOFFSETY: 146.968899 + TOFFSETZ: -0.792376756 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing2" { + TOFFSETX: -85.13869331 + TOFFSETY: 146.9688986 + TOFFSETZ: -0.950624428 + ROFFSETX: 0 + ROFFSETY: 2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing3" { + TOFFSETX: -87.44181788 + TOFFSETY: 146.9688984 + TOFFSETZ: -1.03099138 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky1" { + TOFFSETX: -80.59235737 + TOFFSETY: 146.2759509 + TOFFSETZ: -2.489574194 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky2" { + TOFFSETX: -83.63829999 + TOFFSETY: 146.2758849 + TOFFSETZ: -2.595861595 + ROFFSETX: 0 + ROFFSETY: 2.0000646575305 + ROFFSETZ: -0.00124197162447093 + SOFFSETX: 1 + SOFFSETY: 0.999999999999714 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky3" { + TOFFSETX: -85.61399713 + TOFFSETY: 146.2758421 + TOFFSETZ: -2.664803045 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb4" { + TOFFSETX: -83.77747869 + TOFFSETY: 145.2544268 + TOFFSETZ: 5.17244902 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000210591999999999 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex4" { + TOFFSETX: -89.36363917 + TOFFSETY: 146.7887117 + TOFFSETZ: 3.164250215 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle4" { + TOFFSETX: -90.14788957 + TOFFSETY: 147.089871 + TOFFSETZ: 0.969482638 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing4" { + TOFFSETX: -89.3639958 + TOFFSETY: 146.9688983 + TOFFSETZ: -1.098065296 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky4" { + TOFFSETX: -87.28162098 + TOFFSETY: 146.2758059 + TOFFSETZ: -2.722994364 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + LEFTFOOT: { + } + RIGHTFOOT: { + } + PROPS: { + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Character1_Reference", "Model::Scene" + Connect: "OO", "Model::Character1_Hips", "Model::Character1_Reference" + Connect: "OO", "Model::Character1_LeftUpLeg", "Model::Character1_Hips" + Connect: "OO", "Model::Character1_RightUpLeg", "Model::Character1_Hips" + Connect: "OO", "Model::Character1_Spine", "Model::Character1_Hips" + Connect: "OO", "Model::Character1_LeftLeg", "Model::Character1_LeftUpLeg" + Connect: "OO", "Model::Character1_LeftFoot", "Model::Character1_LeftLeg" + Connect: "OO", "Model::Character1_LeftToeBase", "Model::Character1_LeftFoot" + Connect: "OO", "Model::Character1_RightLeg", "Model::Character1_RightUpLeg" + Connect: "OO", "Model::Character1_RightFoot", "Model::Character1_RightLeg" + Connect: "OO", "Model::Character1_RightToeBase", "Model::Character1_RightFoot" + Connect: "OO", "Model::Character1_Spine1", "Model::Character1_Spine" + Connect: "OO", "Model::Character1_Spine2", "Model::Character1_Spine1" + Connect: "OO", "Model::Character1_LeftShoulder", "Model::Character1_Spine2" + Connect: "OO", "Model::Character1_RightShoulder", "Model::Character1_Spine2" + Connect: "OO", "Model::Character1_Neck", "Model::Character1_Spine2" + Connect: "OO", "Model::Character1_LeftArm", "Model::Character1_LeftShoulder" + Connect: "OO", "Model::Character1_LeftForeArm", "Model::Character1_LeftArm" + Connect: "OO", "Model::Character1_LeftHand", "Model::Character1_LeftForeArm" + Connect: "OO", "Model::Character1_LeftHandThumb1", "Model::Character1_LeftHand" + Connect: "OO", "Model::Character1_LeftHandIndex1", "Model::Character1_LeftHand" + Connect: "OO", "Model::Character1_LeftHandMiddle1", "Model::Character1_LeftHand" + Connect: "OO", "Model::Character1_LeftHandRing1", "Model::Character1_LeftHand" + Connect: "OO", "Model::Character1_LeftHandPinky1", "Model::Character1_LeftHand" + Connect: "OO", "Model::Character1_LeftHandThumb2", "Model::Character1_LeftHandThumb1" + Connect: "OO", "Model::Character1_LeftHandThumb3", "Model::Character1_LeftHandThumb2" + Connect: "OO", "Model::Character1_LeftHandThumb4", "Model::Character1_LeftHandThumb3" + Connect: "OO", "Model::Character1_LeftHandIndex2", "Model::Character1_LeftHandIndex1" + Connect: "OO", "Model::Character1_LeftHandIndex3", "Model::Character1_LeftHandIndex2" + Connect: "OO", "Model::Character1_LeftHandIndex4", "Model::Character1_LeftHandIndex3" + Connect: "OO", "Model::Character1_LeftHandMiddle2", "Model::Character1_LeftHandMiddle1" + Connect: "OO", "Model::Character1_LeftHandMiddle3", "Model::Character1_LeftHandMiddle2" + Connect: "OO", "Model::Character1_LeftHandMiddle4", "Model::Character1_LeftHandMiddle3" + Connect: "OO", "Model::Character1_LeftHandRing2", "Model::Character1_LeftHandRing1" + Connect: "OO", "Model::Character1_LeftHandRing3", "Model::Character1_LeftHandRing2" + Connect: "OO", "Model::Character1_LeftHandRing4", "Model::Character1_LeftHandRing3" + Connect: "OO", "Model::Character1_LeftHandPinky2", "Model::Character1_LeftHandPinky1" + Connect: "OO", "Model::Character1_LeftHandPinky3", "Model::Character1_LeftHandPinky2" + Connect: "OO", "Model::Character1_LeftHandPinky4", "Model::Character1_LeftHandPinky3" + Connect: "OO", "Model::Character1_RightArm", "Model::Character1_RightShoulder" + Connect: "OO", "Model::Character1_RightForeArm", "Model::Character1_RightArm" + Connect: "OO", "Model::Character1_RightHand", "Model::Character1_RightForeArm" + Connect: "OO", "Model::Character1_RightHandThumb1", "Model::Character1_RightHand" + Connect: "OO", "Model::Character1_RightHandIndex1", "Model::Character1_RightHand" + Connect: "OO", "Model::Character1_RightHandMiddle1", "Model::Character1_RightHand" + Connect: "OO", "Model::Character1_RightHandRing1", "Model::Character1_RightHand" + Connect: "OO", "Model::Character1_RightHandPinky1", "Model::Character1_RightHand" + Connect: "OO", "Model::Character1_RightHandThumb2", "Model::Character1_RightHandThumb1" + Connect: "OO", "Model::Character1_RightHandThumb3", "Model::Character1_RightHandThumb2" + Connect: "OO", "Model::Character1_RightHandThumb4", "Model::Character1_RightHandThumb3" + Connect: "OO", "Model::Character1_RightHandIndex2", "Model::Character1_RightHandIndex1" + Connect: "OO", "Model::Character1_RightHandIndex3", "Model::Character1_RightHandIndex2" + Connect: "OO", "Model::Character1_RightHandIndex4", "Model::Character1_RightHandIndex3" + Connect: "OO", "Model::Character1_RightHandMiddle2", "Model::Character1_RightHandMiddle1" + Connect: "OO", "Model::Character1_RightHandMiddle3", "Model::Character1_RightHandMiddle2" + Connect: "OO", "Model::Character1_RightHandMiddle4", "Model::Character1_RightHandMiddle3" + Connect: "OO", "Model::Character1_RightHandRing2", "Model::Character1_RightHandRing1" + Connect: "OO", "Model::Character1_RightHandRing3", "Model::Character1_RightHandRing2" + Connect: "OO", "Model::Character1_RightHandRing4", "Model::Character1_RightHandRing3" + Connect: "OO", "Model::Character1_RightHandPinky2", "Model::Character1_RightHandPinky1" + Connect: "OO", "Model::Character1_RightHandPinky3", "Model::Character1_RightHandPinky2" + Connect: "OO", "Model::Character1_RightHandPinky4", "Model::Character1_RightHandPinky3" + Connect: "OO", "Model::Character1_Head", "Model::Character1_Neck" + Connect: "OP", "Model::Character1_Hips", "Constraint::Character1", "HipsLink" + Connect: "OP", "Model::Character1_LeftUpLeg", "Constraint::Character1", "LeftUpLegLink" + Connect: "OP", "Model::Character1_LeftLeg", "Constraint::Character1", "LeftLegLink" + Connect: "OP", "Model::Character1_LeftFoot", "Constraint::Character1", "LeftFootLink" + Connect: "OP", "Model::Character1_LeftToeBase", "Constraint::Character1", "LeftToeBaseLink" + Connect: "OP", "Model::Character1_RightUpLeg", "Constraint::Character1", "RightUpLegLink" + Connect: "OP", "Model::Character1_RightLeg", "Constraint::Character1", "RightLegLink" + Connect: "OP", "Model::Character1_RightFoot", "Constraint::Character1", "RightFootLink" + Connect: "OP", "Model::Character1_RightToeBase", "Constraint::Character1", "RightToeBaseLink" + Connect: "OP", "Model::Character1_Spine", "Constraint::Character1", "SpineLink" + Connect: "OP", "Model::Character1_Spine1", "Constraint::Character1", "Spine1Link" + Connect: "OP", "Model::Character1_LeftShoulder", "Constraint::Character1", "LeftShoulderLink" + Connect: "OP", "Model::Character1_LeftArm", "Constraint::Character1", "LeftArmLink" + Connect: "OP", "Model::Character1_LeftForeArm", "Constraint::Character1", "LeftForeArmLink" + Connect: "OP", "Model::Character1_LeftHand", "Constraint::Character1", "LeftHandLink" + Connect: "OP", "Model::Character1_RightShoulder", "Constraint::Character1", "RightShoulderLink" + Connect: "OP", "Model::Character1_RightArm", "Constraint::Character1", "RightArmLink" + Connect: "OP", "Model::Character1_RightForeArm", "Constraint::Character1", "RightForeArmLink" + Connect: "OP", "Model::Character1_RightHand", "Constraint::Character1", "RightHandLink" + Connect: "OP", "Model::Character1_Neck", "Constraint::Character1", "NeckLink" + Connect: "OP", "Model::Character1_Head", "Constraint::Character1", "HeadLink" + Connect: "OP", "Model::Character1_Spine2", "Constraint::Character1", "Spine2Link" + Connect: "OP", "Model::Character1_LeftHandThumb1", "Constraint::Character1", "LeftHandThumb1Link" + Connect: "OP", "Model::Character1_LeftHandThumb2", "Constraint::Character1", "LeftHandThumb2Link" + Connect: "OP", "Model::Character1_LeftHandThumb3", "Constraint::Character1", "LeftHandThumb3Link" + Connect: "OP", "Model::Character1_LeftHandIndex1", "Constraint::Character1", "LeftHandIndex1Link" + Connect: "OP", "Model::Character1_LeftHandIndex2", "Constraint::Character1", "LeftHandIndex2Link" + Connect: "OP", "Model::Character1_LeftHandIndex3", "Constraint::Character1", "LeftHandIndex3Link" + Connect: "OP", "Model::Character1_LeftHandMiddle1", "Constraint::Character1", "LeftHandMiddle1Link" + Connect: "OP", "Model::Character1_LeftHandMiddle2", "Constraint::Character1", "LeftHandMiddle2Link" + Connect: "OP", "Model::Character1_LeftHandMiddle3", "Constraint::Character1", "LeftHandMiddle3Link" + Connect: "OP", "Model::Character1_LeftHandRing1", "Constraint::Character1", "LeftHandRing1Link" + Connect: "OP", "Model::Character1_LeftHandRing2", "Constraint::Character1", "LeftHandRing2Link" + Connect: "OP", "Model::Character1_LeftHandRing3", "Constraint::Character1", "LeftHandRing3Link" + Connect: "OP", "Model::Character1_LeftHandPinky1", "Constraint::Character1", "LeftHandPinky1Link" + Connect: "OP", "Model::Character1_LeftHandPinky2", "Constraint::Character1", "LeftHandPinky2Link" + Connect: "OP", "Model::Character1_LeftHandPinky3", "Constraint::Character1", "LeftHandPinky3Link" + Connect: "OP", "Model::Character1_RightHandThumb1", "Constraint::Character1", "RightHandThumb1Link" + Connect: "OP", "Model::Character1_RightHandThumb2", "Constraint::Character1", "RightHandThumb2Link" + Connect: "OP", "Model::Character1_RightHandThumb3", "Constraint::Character1", "RightHandThumb3Link" + Connect: "OP", "Model::Character1_RightHandIndex1", "Constraint::Character1", "RightHandIndex1Link" + Connect: "OP", "Model::Character1_RightHandIndex2", "Constraint::Character1", "RightHandIndex2Link" + Connect: "OP", "Model::Character1_RightHandIndex3", "Constraint::Character1", "RightHandIndex3Link" + Connect: "OP", "Model::Character1_RightHandMiddle1", "Constraint::Character1", "RightHandMiddle1Link" + Connect: "OP", "Model::Character1_RightHandMiddle2", "Constraint::Character1", "RightHandMiddle2Link" + Connect: "OP", "Model::Character1_RightHandMiddle3", "Constraint::Character1", "RightHandMiddle3Link" + Connect: "OP", "Model::Character1_RightHandRing1", "Constraint::Character1", "RightHandRing1Link" + Connect: "OP", "Model::Character1_RightHandRing2", "Constraint::Character1", "RightHandRing2Link" + Connect: "OP", "Model::Character1_RightHandRing3", "Constraint::Character1", "RightHandRing3Link" + Connect: "OP", "Model::Character1_RightHandPinky1", "Constraint::Character1", "RightHandPinky1Link" + Connect: "OP", "Model::Character1_RightHandPinky2", "Constraint::Character1", "RightHandPinky2Link" + Connect: "OP", "Model::Character1_RightHandPinky3", "Constraint::Character1", "RightHandPinky3Link" + Connect: "OP", "Model::Character1_Reference", "Constraint::Character1", "ReferenceLink" + Connect: "OP", "Model::Character1_LeftHandThumb4", "Constraint::Character1", "LeftHandThumb4Link" + Connect: "OP", "Model::Character1_LeftHandIndex4", "Constraint::Character1", "LeftHandIndex4Link" + Connect: "OP", "Model::Character1_LeftHandMiddle4", "Constraint::Character1", "LeftHandMiddle4Link" + Connect: "OP", "Model::Character1_LeftHandRing4", "Constraint::Character1", "LeftHandRing4Link" + Connect: "OP", "Model::Character1_LeftHandPinky4", "Constraint::Character1", "LeftHandPinky4Link" + Connect: "OP", "Model::Character1_RightHandThumb4", "Constraint::Character1", "RightHandThumb4Link" + Connect: "OP", "Model::Character1_RightHandIndex4", "Constraint::Character1", "RightHandIndex4Link" + Connect: "OP", "Model::Character1_RightHandMiddle4", "Constraint::Character1", "RightHandMiddle4Link" + Connect: "OP", "Model::Character1_RightHandRing4", "Constraint::Character1", "RightHandRing4Link" + Connect: "OP", "Model::Character1_RightHandPinky4", "Constraint::Character1", "RightHandPinky4Link" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_character_6100_binary.fbx b/modules/ufbx/data/maya_character_6100_binary.fbx new file mode 100644 index 0000000..0c794d8 Binary files /dev/null and b/modules/ufbx/data/maya_character_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_character_7500_ascii.fbx b/modules/ufbx/data/maya_character_7500_ascii.fbx new file mode 100644 index 0000000..41bc32d --- /dev/null +++ b/modules/ufbx/data/maya_character_7500_ascii.fbx @@ -0,0 +1,3811 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 11 + Hour: 1 + Minute: 10 + Second: 48 + Millisecond: 992 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_skeleton_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_skeleton_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "10/09/2021 22:10:48.991" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_skeleton_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "10/09/2021 22:10:48.991" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2888737970400, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 130 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 63 + PropertyTemplate: "FbxNull" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "Look", "enum", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 63 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Character" { + Count: 1 + PropertyTemplate: "FbxCharacter" { + Properties70: { + P: "Active", "bool", "", "",1 + P: "Lock", "bool", "", "",0 + P: "Weight", "Weight", "", "A",100 + P: "SourceObject", "object", "", "" + P: "DestinationObject", "object", "", "" + P: "Actor", "object", "", "" + P: "Character", "object", "", "" + P: "ControlSet", "object", "", "" + P: "PullIterationCount", "int", "Integer", "",10 + P: "Posture", "enum", "", "",0 + P: "ForceActorSpace", "bool", "", "",0 + P: "ScaleCompensation", "Number", "", "A",100 + P: "ScaleCompensationMode", "enum", "", "",1 + P: "HipsHeightCompensation", "Number", "", "A",0 + P: "HipsHeightCompensationMode", "enum", "", "",1 + P: "AnkleHeightCompensation", "Number", "", "A",0 + P: "AnkleHeightCompensationMode", "enum", "", "",1 + P: "AnkleProximityCompensation", "Number", "", "A",0 + P: "AnkleProximityCompensationMode", "enum", "", "",1 + P: "MassCenterCompensation", "Number", "", "A",80 + P: "ApplyLimits", "bool", "", "",0 + P: "ChestReduction", "Number", "", "A",0 + P: "CollarReduction", "Number", "", "A",0 + P: "NeckReduction", "Number", "", "A",0 + P: "HeadReduction", "Number", "", "A",0 + P: "ReachActorLeftAnkle", "Number", "", "A",100 + P: "ReachActorRightAnkle", "Number", "", "A",100 + P: "ReachActorLeftKnee", "Number", "", "A",0 + P: "ReachActorRightKnee", "Number", "", "A",0 + P: "ReachActorChest", "Number", "", "A",0 + P: "ReachActorHead", "Number", "", "A",0 + P: "ReachActorLeftWrist", "Number", "", "A",0 + P: "ReachActorRightWrist", "Number", "", "A",0 + P: "ReachActorLeftElbow", "Number", "", "A",0 + P: "ReachActorRightElbow", "Number", "", "A",0 + P: "ReachActorLeftFingerBase", "Number", "", "A",0 + P: "ReachActorRightFingerBase", "Number", "", "A",0 + P: "ReachActorLeftToesBase", "Number", "", "A",0 + P: "ReachActorRightToesBase", "Number", "", "A",0 + P: "ReachActorLeftFingerBaseRotation", "Number", "", "A",0 + P: "ReachActorRightFingerBaseRotation", "Number", "", "A",0 + P: "ReachActorLeftToesBaseRotation", "Number", "", "A",0 + P: "ReachActorRightToesBaseRotation", "Number", "", "A",0 + P: "ReachActorLeftAnkleRotation", "Number", "", "A",100 + P: "ReachActorRightAnkleRotation", "Number", "", "A",100 + P: "ReachActorHeadRotation", "Number", "", "A",0 + P: "ReachActorLeftWristRotation", "Number", "", "A",0 + P: "ReachActorRightWristRotation", "Number", "", "A",0 + P: "ReachActorChestRotation", "Number", "", "A",0 + P: "ReachActorLowerChestRotation", "Number", "", "A",0 + P: "HipsTOffset", "Vector", "", "A",0,0,0 + P: "ChestTOffset", "Vector", "", "A",0,0,0 + P: "LeftUpLegRoll", "Number", "", "A",0 + P: "LeftUpLegRollMode", "bool", "", "",1 + P: "LeftLegRoll", "Number", "", "A",60 + P: "LeftLegRollMode", "bool", "", "",1 + P: "RightUpLegRoll", "Number", "", "A",0 + P: "RightUpLegRollMode", "bool", "", "",1 + P: "RightLegRoll", "Number", "", "A",60 + P: "RightLegRollMode", "bool", "", "",1 + P: "LeftArmRoll", "Number", "", "A",0 + P: "LeftArmRollMode", "bool", "", "",1 + P: "LeftForeArmRoll", "Number", "", "A",0 + P: "LeftForeArmRollMode", "bool", "", "",1 + P: "RightArmRoll", "Number", "", "A",0 + P: "RightArmRollMode", "bool", "", "",1 + P: "RightForeArmRoll", "Number", "", "A",0 + P: "RightForeArmRollMode", "bool", "", "",1 + P: "LeftUpLegRollEx", "Number", "", "A",40 + P: "LeftUpLegRollExMode", "bool", "", "",1 + P: "LeftLegRollEx", "Number", "", "A",80 + P: "LeftLegRollExMode", "bool", "", "",1 + P: "RightUpLegRollEx", "Number", "", "A",40 + P: "RightUpLegRollExMode", "bool", "", "",1 + P: "RightLegRollEx", "Number", "", "A",80 + P: "RightLegRollExMode", "bool", "", "",1 + P: "LeftArmRollEx", "Number", "", "A",40 + P: "LeftArmRollExMode", "bool", "", "",1 + P: "LeftForeArmRollEx", "Number", "", "A",40 + P: "LeftForeArmRollExMode", "bool", "", "",1 + P: "RightArmRollEx", "Number", "", "A",40 + P: "RightArmRollExMode", "bool", "", "",1 + P: "RightForeArmRollEx", "Number", "", "A",40 + P: "RightForeArmRollExMode", "bool", "", "",1 + P: "LeafLeftUpLegRoll1", "Number", "", "A",50 + P: "LeafLeftUpLegRoll1Mode", "bool", "", "",1 + P: "LeafLeftLegRoll1", "Number", "", "A",50 + P: "LeafLeftLegRoll1Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll1", "Number", "", "A",50 + P: "LeafRightUpLegRoll1Mode", "bool", "", "",1 + P: "LeafRightLegRoll1", "Number", "", "A",50 + P: "LeafRightLegRoll1Mode", "bool", "", "",1 + P: "LeafLeftArmRoll1", "Number", "", "A",50 + P: "LeafLeftArmRoll1Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll1", "Number", "", "A",50 + P: "LeafLeftForeArmRoll1Mode", "bool", "", "",1 + P: "LeafRightArmRoll1", "Number", "", "A",50 + P: "LeafRightArmRoll1Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll1", "Number", "", "A",50 + P: "LeafRightForeArmRoll1Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll2", "Number", "", "A",50 + P: "LeafLeftUpLegRoll2Mode", "bool", "", "",1 + P: "LeafLeftLegRoll2", "Number", "", "A",50 + P: "LeafLeftLegRoll2Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll2", "Number", "", "A",50 + P: "LeafRightUpLegRoll2Mode", "bool", "", "",1 + P: "LeafRightLegRoll2", "Number", "", "A",50 + P: "LeafRightLegRoll2Mode", "bool", "", "",1 + P: "LeafLeftArmRoll2", "Number", "", "A",50 + P: "LeafLeftArmRoll2Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll2", "Number", "", "A",50 + P: "LeafLeftForeArmRoll2Mode", "bool", "", "",1 + P: "LeafRightArmRoll2", "Number", "", "A",50 + P: "LeafRightArmRoll2Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll2", "Number", "", "A",50 + P: "LeafRightForeArmRoll2Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll3", "Number", "", "A",50 + P: "LeafLeftUpLegRoll3Mode", "bool", "", "",1 + P: "LeafLeftLegRoll3", "Number", "", "A",50 + P: "LeafLeftLegRoll3Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll3", "Number", "", "A",50 + P: "LeafRightUpLegRoll3Mode", "bool", "", "",1 + P: "LeafRightLegRoll3", "Number", "", "A",50 + P: "LeafRightLegRoll3Mode", "bool", "", "",1 + P: "LeafLeftArmRoll3", "Number", "", "A",50 + P: "LeafLeftArmRoll3Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll3", "Number", "", "A",50 + P: "LeafLeftForeArmRoll3Mode", "bool", "", "",1 + P: "LeafRightArmRoll3", "Number", "", "A",50 + P: "LeafRightArmRoll3Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll3", "Number", "", "A",50 + P: "LeafRightForeArmRoll3Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll4", "Number", "", "A",50 + P: "LeafLeftUpLegRoll4Mode", "bool", "", "",1 + P: "LeafLeftLegRoll4", "Number", "", "A",50 + P: "LeafLeftLegRoll4Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll4", "Number", "", "A",50 + P: "LeafRightUpLegRoll4Mode", "bool", "", "",1 + P: "LeafRightLegRoll4", "Number", "", "A",50 + P: "LeafRightLegRoll4Mode", "bool", "", "",1 + P: "LeafLeftArmRoll4", "Number", "", "A",50 + P: "LeafLeftArmRoll4Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll4", "Number", "", "A",50 + P: "LeafLeftForeArmRoll4Mode", "bool", "", "",1 + P: "LeafRightArmRoll4", "Number", "", "A",50 + P: "LeafRightArmRoll4Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll4", "Number", "", "A",50 + P: "LeafRightForeArmRoll4Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll5", "Number", "", "A",50 + P: "LeafLeftUpLegRoll5Mode", "bool", "", "",1 + P: "LeafLeftLegRoll5", "Number", "", "A",50 + P: "LeafLeftLegRoll5Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll5", "Number", "", "A",50 + P: "LeafRightUpLegRoll5Mode", "bool", "", "",1 + P: "LeafRightLegRoll5", "Number", "", "A",50 + P: "LeafRightLegRoll5Mode", "bool", "", "",1 + P: "LeafLeftArmRoll5", "Number", "", "A",50 + P: "LeafLeftArmRoll5Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll5", "Number", "", "A",50 + P: "LeafLeftForeArmRoll5Mode", "bool", "", "",1 + P: "LeafRightArmRoll5", "Number", "", "A",50 + P: "LeafRightArmRoll5Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll5", "Number", "", "A",50 + P: "LeafRightForeArmRoll5Mode", "bool", "", "",1 + P: "LeftLegFullRollExtraction", "Number", "", "A",0 + P: "RightLegFullRollExtraction", "Number", "", "A",0 + P: "LeftArmFullRollExtraction", "Number", "", "A",0 + P: "RightArmFullRollExtraction", "Number", "", "A",0 + P: "RollExtractionMode", "enum", "", "",0 + P: "FootFloorContact", "bool", "", "",0 + P: "FootAutomaticToes", "bool", "", "",0 + P: "FootFloorPivot", "enum", "", "",0 + P: "FootBottomToAnkle", "double", "Number", "",0 + P: "FootBackToAnkle", "double", "Number", "",4.5 + P: "FootMiddleToAnkle", "double", "Number", "",13 + P: "FootFrontToMiddle", "double", "Number", "",7 + P: "FootInToAnkle", "double", "Number", "",5 + P: "FootOutToAnkle", "double", "Number", "",5 + P: "FootContactSize", "double", "Number", "",100 + P: "FootContactStiffness", "Number", "", "A",0 + P: "FootFingerContactRollStiffness", "Number", "", "A",0 + P: "HandFloorContact", "bool", "", "",0 + P: "HandAutomaticFingers", "bool", "", "",0 + P: "HandFloorPivot", "enum", "", "",0 + P: "HandBottomToWrist", "double", "Number", "",0 + P: "HandBackToWrist", "double", "Number", "",4.5 + P: "HandMiddleToWrist", "double", "Number", "",13 + P: "HandFrontToMiddle", "double", "Number", "",7 + P: "HandInToWrist", "double", "Number", "",5 + P: "HandOutToWrist", "double", "Number", "",5 + P: "HandContactSize", "double", "Number", "",100 + P: "HandContactStiffness", "Number", "", "A",0 + P: "HandFingerContactRollStiffness", "Number", "", "A",0 + P: "CtrlPullLeftToeBase", "Number", "", "A",0 + P: "CtrlPullLeftFoot", "Number", "", "A",0 + P: "CtrlPullLeftKnee", "Number", "", "A",0 + P: "CtrlPullRightToeBase", "Number", "", "A",0 + P: "CtrlPullRightFoot", "Number", "", "A",0 + P: "CtrlPullRightKnee", "Number", "", "A",0 + P: "CtrlPullLeftFingerBase", "Number", "", "A",0 + P: "CtrlPullLeftHand", "Number", "", "A",100 + P: "CtrlPullLeftElbow", "Number", "", "A",0 + P: "CtrlPullRightFingerBase", "Number", "", "A",0 + P: "CtrlPullRightHand", "Number", "", "A",100 + P: "CtrlPullRightElbow", "Number", "", "A",0 + P: "CtrlChestPullLeftHand", "Number", "", "A",0 + P: "CtrlChestPullRightHand", "Number", "", "A",0 + P: "CtrlPullHead", "Number", "", "A",0 + P: "CtrlResistHipsPosition", "Number", "", "A",0 + P: "CtrlEnforceGravity", "Number", "", "A",60 + P: "CtrlResistHipsOrientation", "Number", "", "A",0 + P: "CtrlResistChestPosition", "Number", "", "A",0 + P: "CtrlResistChestOrientation", "Number", "", "A",0 + P: "CtrlResistLeftCollar", "Number", "", "A",50 + P: "CtrlResistRightCollar", "Number", "", "A",50 + P: "CtrlResistLeftKnee", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionLeftKnee", "Number", "", "A",50 + P: "CtrlResistCompressionFactorLeftKnee", "Number", "", "A",50 + P: "CtrlResistRightKnee", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionRightKnee", "Number", "", "A",50 + P: "CtrlResistCompressionFactorRightKnee", "Number", "", "A",50 + P: "CtrlResistLeftElbow", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionLeftElbow", "Number", "", "A",50 + P: "CtrlResistCompressionFactorLeftElbow", "Number", "", "A",50 + P: "CtrlResistRightElbow", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionRightElbow", "Number", "", "A",50 + P: "CtrlResistCompressionFactorRightElbow", "Number", "", "A",50 + P: "CtrlSpineStiffness", "Number", "", "A",0 + P: "CtrlNeckStiffness", "Number", "", "A",0 + P: "MirrorMode", "bool", "", "",0 + P: "ShoulderCorrection", "Number", "", "A",0 + P: "LeftKneeKillPitch", "bool", "", "",0 + P: "RightKneeKillPitch", "bool", "", "",0 + P: "LeftElbowKillPitch", "bool", "", "",0 + P: "RightElbowKillPitch", "bool", "", "",0 + P: "HipsTranslationMode", "enum", "", "",0 + P: "WriteReference", "bool", "", "",0 + P: "SyncMode", "bool", "", "H",0 + P: "Damping", "Number", "", "A",0 + P: "OrientationDamping", "Number", "", "A",0 + P: "OrientationDampingMode", "enum", "", "",1 + P: "DisplacementDamping", "Number", "", "A",0 + P: "DisplacementDampingMode", "enum", "", "",1 + P: "DisplacementMemory", "Number", "", "A",0 + P: "DisplacementMemoryMode", "enum", "", "",0 + P: "HipsDisplacementDamping", "Number", "", "A",0 + P: "HipsDisplacementDampingMode", "enum", "", "",0 + P: "AnkleDisplacementDamping", "Number", "", "A",0 + P: "AnkleDisplacementDampingMode", "enum", "", "",0 + P: "WristDisplacementDamping", "Number", "", "A",0 + P: "WristDisplacementDampingMode", "enum", "", "",0 + P: "Stabilization", "Number", "", "A",0 + P: "AnkleStabilizationTime", "Number", "", "A",0 + P: "AnkleStabilizationTimeMode", "enum", "", "",0 + P: "AnkleStabilizationPerimeter", "Number", "", "A",0 + P: "AnkleStabilizationPerimeterMode", "enum", "", "",0 + P: "AnkleStabilizationAngularPerimeter", "Number", "", "A",0 + P: "AnkleStabilizationAngularPerimeterMode", "enum", "", "",1 + P: "AnkleStabilizationFloorProximity", "Number", "", "A",0 + P: "AnkleStabilizationFloorProximityMode", "enum", "", "",1 + P: "AnkleStabilizationDamping", "Number", "", "A",0 + P: "AnkleStabilizationDampingMode", "enum", "", "",0 + P: "AnkleStabilizationRecoveryTime", "Number", "", "A",0 + P: "AnkleStabilizationRecoveryTimeMode", "enum", "", "",1 + P: "LeftHandThumbTip", "double", "Number", "",0.5 + P: "LeftHandIndexTip", "double", "Number", "",0.5 + P: "LeftHandMiddleTip", "double", "Number", "",0.5 + P: "LeftHandRingTip", "double", "Number", "",0.5 + P: "LeftHandPinkyTip", "double", "Number", "",0.5 + P: "LeftHandExtraFingerTip", "double", "Number", "",0.5 + P: "RightHandThumbTip", "double", "Number", "",0.5 + P: "RightHandIndexTip", "double", "Number", "",0.5 + P: "RightHandMiddleTip", "double", "Number", "",0.5 + P: "RightHandRingTip", "double", "Number", "",0.5 + P: "RightHandPinkyTip", "double", "Number", "",0.5 + P: "RightHandExtraFingerTip", "double", "Number", "",0.5 + P: "LeftFootThumbTip", "double", "Number", "",0.5 + P: "LeftFootIndexTip", "double", "Number", "",0.5 + P: "LeftFootMiddleTip", "double", "Number", "",0.5 + P: "LeftFootRingTip", "double", "Number", "",0.5 + P: "LeftFootPinkyTip", "double", "Number", "",0.5 + P: "LeftFootExtraFingerTip", "double", "Number", "",0.5 + P: "RightFootThumbTip", "double", "Number", "",0.5 + P: "RightFootIndexTip", "double", "Number", "",0.5 + P: "RightFootMiddleTip", "double", "Number", "",0.5 + P: "RightFootRingTip", "double", "Number", "",0.5 + P: "RightFootPinkyTip", "double", "Number", "",0.5 + P: "RightFootExtraFingerTip", "double", "Number", "",0.5 + P: "FingerSolving", "bool", "", "",1 + P: "FootFingerContact", "bool", "", "",0 + P: "FootContactType", "enum", "", "",0 + P: "FootFingerContactMode", "enum", "", "",1 + P: "HandFingerContact", "bool", "", "",0 + P: "HandContactType", "enum", "", "",0 + P: "HandFingerContactMode", "enum", "", "",1 + P: "ContactBehaviour", "enum", "", "",0 + P: "HikVersion", "double", "Number", "",1 + P: "Characterize", "bool", "", "",1 + P: "RealisticShoulder", "Number", "", "A",0 + P: "CollarStiffnessX", "Number", "", "A",0 + P: "CollarStiffnessY", "Number", "", "A",0 + P: "CollarStiffnessZ", "Number", "", "A",0 + P: "ExtraCollarRatio", "Number", "", "A",50 + P: "LeftLegMaxExtensionAngle", "Number", "", "A",180 + P: "RightLegMaxExtensionAngle", "Number", "", "A",180 + P: "LeftArmMaxExtensionAngle", "Number", "", "A",180 + P: "RightArmMaxExtensionAngle", "Number", "", "A",180 + P: "StretchStartArmsAndLegs", "Number", "", "A",90 + P: "StretchStopArmsAndLegs", "Number", "", "A",110 + P: "SnSScaleArmsAndLegs", "Number", "", "A",0 + P: "SnSReachLeftWrist", "Number", "", "A",0 + P: "SnSReachRightWrist", "Number", "", "A",0 + P: "SnSReachLeftAnkle", "Number", "", "A",0 + P: "SnSReachRightAnkle", "Number", "", "A",0 + P: "SnSScaleSpine", "Number", "", "A",0 + P: "SnSScaleSpineChildren", "Number", "", "A",0 + P: "SnSSpineFreedom", "Number", "", "A",10 + P: "SnSReachChestEnd", "Number", "", "A",0 + P: "SnSScaleNeck", "Number", "", "A",0 + P: "SnSNeckFreedom", "Number", "", "A",10 + P: "SnSReachHead", "Number", "", "A",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 2888760502960, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 2888740181248, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740179712, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740181440, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740184512, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740181824, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740182784, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740163584, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740183936, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740163008, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740165312, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740161088, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740163776, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740165696, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740164928, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740159936, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740165888, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740157824, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740158208, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740164160, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740154176, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740157248, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740162048, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740161472, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740154560, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740165504, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740153792, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740160320, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740161664, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740157440, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740155520, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740164544, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740160128, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740153984, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740155136, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740161280, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740160512, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740163200, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740162624, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740162816, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740154752, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740159552, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740163392, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740159360, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740156096, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740154944, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740155328, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740164736, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740155904, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740163968, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740155712, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740160704, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740160896, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740159168, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740158976, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740159744, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740161856, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740165120, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740156288, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740156480, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740156672, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740162240, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2888740156864, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + Model: 2888573868528, "Model::Character1_Reference", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573866208, "Model::Character1_Hips", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,100,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573884768, "Model::Character1_LeftUpLeg", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",8.910000801,-6.27000046000001,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573880128, "Model::Character1_LeftLeg", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,-44.87864494,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573875488, "Model::Character1_LeftFoot", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,-40.700958253,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573873168, "Model::Character1_LeftToeBase", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",8.42699999914487e-06,-6.262317193,12.9547209 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573870848, "Model::Character1_RightUpLeg", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-8.910000801,-6.27000046000001,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573877808, "Model::Character1_RightLeg", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2.71599999912553e-06,-44.87864494,0.000439024 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573882448, "Model::Character1_RightFoot", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",9.18999999655057e-07,-40.700958249,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573854608, "Model::Character1_RightToeBase", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0.004800386,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-0.00108538100000111,-6.26231718,12.954749066 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573887088, "Model::Character1_Spine", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,7,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573856928, "Model::Character1_Spine1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,12.6666666666667,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573859248, "Model::Character1_Spine2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,12.6666666666667,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573891728, "Model::Character1_LeftShoulder", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",7.000000477,14.2552134666666,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573889408, "Model::Character1_LeftArm", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-0.000735282 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",10.707250593,0.000137399999971421,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573861568, "Model::Character1_LeftForeArm", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,0.001470564 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",27.3054656977515,0.00035041354882992,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573894048, "Model::Character1_LeftHand", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-0.000735282000000001 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",26.6971473678016,-0.000342606943803503,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573863888, "Model::Character1_LeftHandThumb1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,9.70628259723974e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",4.34875684999999,-0.798502499999984,4.282433967 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573896368, "Model::Character1_LeftHandThumb2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,9.70628259723974e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.51258994000001,-0.536099400000012,0.707454324 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573901008, "Model::Character1_LeftHandThumb3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,0.000297862 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.54314040999998,-1.31999999837262e-05,9.34200000024532e-06 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573898688, "Model::Character1_LeftHandThumb4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-0.000595724 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.66674613997908,-1.0963540148623e-05,-8.21100000170105e-06 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573903328, "Model::Character1_LeftHandIndex1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,9.70628259723974e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",8.82197671999999,0.199729200000007,3.471669416 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573907968, "Model::Character1_LeftHandIndex2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",1.04532179819187e-05,1.99999998497269,0.000299523461597212 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",4.22275459999999,-2.20999999953619e-05,0.147199018999999 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573914928, "Model::Character1_LeftHandIndex3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-6.07012437898178e-21,-1.999999985,-0.000299341 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.6474830577704,-2.76317382201796e-05,0.184964480918186 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573905648, "Model::Character1_LeftHandIndex4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-6.06642662327484e-21,7.95138670365879e-16,9.73662968835331e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.95703422999998,-1.02000000197222e-05,0.0682189000000015 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573910288, "Model::Character1_LeftHandMiddle1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,9.70628259723974e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",8.80987936,0.500890499999997,1.304684381 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573912608, "Model::Character1_LeftHandMiddle2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0.003563334,9.70628259723974e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",4.86325168,0,0.000302455000000146 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573938128, "Model::Character1_LeftHandMiddle3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-6.03652260792567e-24,-0.003563334,9.70628261601088e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.76523659396877,0,0.000343758347727263 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573947408, "Model::Character1_LeftHandMiddle4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",1.3154465848357e-39,7.76502607779179e-19,9.70628259723974e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.00563215999999,2.8421709430404e-14,0.000123596000000337 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573928848, "Model::Character1_LeftHandRing1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,9.70628259723974e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",8.89375978999999,0.379919600000022,-0.793158909 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573931168, "Model::Character1_LeftHandRing2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0.003563529,9.70628259723974e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",4.53775882999999,0,8.89999999253988e-08 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573933488, "Model::Character1_LeftHandRing3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-6.03685295077637e-24,-0.003563529,9.70628261601294e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.30452585555004,0,0.000143213709484669 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573921888, "Model::Character1_LeftHandRing4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-1.3154465848357e-39,-7.76502607779179e-19,9.70628259723974e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.92334735999999,0,-8.17000000208346e-07 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573940448, "Model::Character1_LeftHandPinky1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,9.70628259723974e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",8.88227468999999,-0.313026999999977,-2.490356465 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573917248, "Model::Character1_LeftHandPinky2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-0.000763025999999999 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3.04409933000001,4.06000000054973e-05,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573935808, "Model::Character1_LeftHandPinky3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,0.000763025999999999 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.97450148947465,5.25950601399927e-05,-1.42999999841464e-07 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573949728, "Model::Character1_LeftHandPinky4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,9.70628259723974e-20 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.66661465000001,2.2200000103112e-05,7.9099999972243e-07 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573942768, "Model::Character1_RightShoulder", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-6.999999523,14.2552134666666,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573945088, "Model::Character1_RightArm", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,0.002318361 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-10.707275387,0.000433200000031775,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573924208, "Model::Character1_RightForeArm", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-0.004636722 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-27.3055982276469,0.00110486731455239,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573919568, "Model::Character1_RightHand", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,0.002318361 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-26.6969880880925,-0.00108154110256464,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573952048, "Model::Character1_RightHandThumb1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-4.34838078999999,-0.798498100000018,4.282814738 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573954368, "Model::Character1_RightHandThumb2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2.51252751,-0.536098899999985,0.70767665 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573956688, "Model::Character1_RightHandThumb3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,0.000602085999999999 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2.54158935999999,2.68000000005486e-05,0.0888203150000004 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573926528, "Model::Character1_RightHandThumb4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-0.000812677999999999 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2.66511975966058,4.63060993638464e-05,0.0931373170000009 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573982208, "Model::Character1_RightHandIndex1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-8.82167265999999,0.199733699999996,3.472444296 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573975248, "Model::Character1_RightHandIndex2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064658,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-4.22275022000001,-3.00000010611257e-07,-0.147351788 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573977568, "Model::Character1_RightHandIndex3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",1.35584729619604e-20,-2.000064658,-3.88487975568133e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2.64747684463245,-3.00000095876385e-07,-0.185063479213413 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573965968, "Model::Character1_RightHandIndex4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-1.95703222,-9.99999372197635e-08,-0.0682901520000003 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573984528, "Model::Character1_RightHandMiddle1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-8.80976602999999,0.500893099999985,1.305458427 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573959008, "Model::Character1_RightHandMiddle2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064658,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-4.86029449000002,-4.00000033096148e-07,-0.169598752 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573963648, "Model::Character1_RightHandMiddle3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",1.35584729619604e-20,-2.000064658,-3.88487975568133e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2.75850591652296,-2.00000016548074e-07,-0.19282461233943 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573986848, "Model::Character1_RightHandMiddle4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2.00441268,-1.99999988126365e-07,-0.0699434750000005 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573989168, "Model::Character1_RightHandRing1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-8.89383242999999,0.379920299999981,-0.792376756 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573979888, "Model::Character1_RightHandRing2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064658,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-4.53499961000001,-4.00000033096148e-07,-0.158247672 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573991488, "Model::Character1_RightHandRing3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",1.35584729619604e-20,-2.000064658,-3.88487975568133e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2.29891662121804,-1.99999959704655e-07,-0.160698477276434 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573970608, "Model::Character1_RightHandRing4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-1.92217792,-9.9999965641473e-08,-0.0670739159999998 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573972928, "Model::Character1_RightHandPinky1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,-3.88251303889589e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-8.8824961,-0.313027800000015,-2.489574194 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573968288, "Model::Character1_RightHandPinky2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-4.33455853143664e-05,2.0000646575305,-0.00124197162447093 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-3.04594261999999,-6.60000000038963e-05,-0.106287401000001 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573961328, "Model::Character1_RightHandPinky3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-2.42804984730083e-20,-2.000064658,0.001241215 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-1.97208741982242,-8.5521898654406e-05,-0.137852514044825 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888573993808, "Model::Character1_RightHandPinky4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-3.33671942990681e-20,-2.25825461155437e-40,-3.87771465434942e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-1.66762384999998,-3.62000000109219e-05,-0.0581913190000005 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888574014688, "Model::Character1_Neck", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,12.6666666666667,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2888574023968, "Model::Character1_Head", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,20,0 + } + Shading: Y + Culling: "CullingOff" + } + Constraint: 2888547746720, "Constraint::Character1", "Character" { + Type: "Character" + MultiLayer: 0 + Version: 201650 + Properties70: { + P: "Active", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Weight", "Weight", "", "A",100 + P: "SourceObject", "object", "", "" + P: "DestinationObject", "object", "", "" + P: "Actor", "object", "", "" + P: "Character", "object", "", "" + P: "ControlSet", "object", "", "" + P: "PullIterationCount", "int", "Integer", "",10 + P: "Posture", "enum", "", "",0 + P: "ForceActorSpace", "bool", "", "",0 + P: "ScaleCompensation", "Number", "", "A",100 + P: "ScaleCompensationMode", "enum", "", "",1 + P: "HipsHeightCompensation", "Number", "", "A",0 + P: "HipsHeightCompensationMode", "enum", "", "",1 + P: "AnkleHeightCompensation", "Number", "", "A",0 + P: "AnkleHeightCompensationMode", "enum", "", "",1 + P: "AnkleProximityCompensation", "Number", "", "A",0 + P: "AnkleProximityCompensationMode", "enum", "", "",1 + P: "MassCenterCompensation", "Number", "", "A",80 + P: "ApplyLimits", "bool", "", "",0 + P: "ChestReduction", "Number", "", "A",0 + P: "CollarReduction", "Number", "", "A",0 + P: "NeckReduction", "Number", "", "A",0 + P: "HeadReduction", "Number", "", "A",0 + P: "ReachActorLeftAnkle", "Number", "", "A",100 + P: "ReachActorRightAnkle", "Number", "", "A",100 + P: "ReachActorLeftKnee", "Number", "", "A",0 + P: "ReachActorRightKnee", "Number", "", "A",0 + P: "ReachActorChest", "Number", "", "A",0 + P: "ReachActorHead", "Number", "", "A",0 + P: "ReachActorLeftWrist", "Number", "", "A",0 + P: "ReachActorRightWrist", "Number", "", "A",0 + P: "ReachActorLeftElbow", "Number", "", "A",0 + P: "ReachActorRightElbow", "Number", "", "A",0 + P: "ReachActorLeftFingerBase", "Number", "", "A",0 + P: "ReachActorRightFingerBase", "Number", "", "A",0 + P: "ReachActorLeftToesBase", "Number", "", "A",0 + P: "ReachActorRightToesBase", "Number", "", "A",0 + P: "ReachActorLeftFingerBaseRotation", "Number", "", "A",0 + P: "ReachActorRightFingerBaseRotation", "Number", "", "A",0 + P: "ReachActorLeftToesBaseRotation", "Number", "", "A",0 + P: "ReachActorRightToesBaseRotation", "Number", "", "A",0 + P: "ReachActorLeftAnkleRotation", "Number", "", "A",100 + P: "ReachActorRightAnkleRotation", "Number", "", "A",100 + P: "ReachActorHeadRotation", "Number", "", "A",0 + P: "ReachActorLeftWristRotation", "Number", "", "A",0 + P: "ReachActorRightWristRotation", "Number", "", "A",0 + P: "ReachActorChestRotation", "Number", "", "A",0 + P: "ReachActorLowerChestRotation", "Number", "", "A",0 + P: "HipsTOffset", "Vector", "", "A",0,0,0 + P: "ChestTOffset", "Vector", "", "A",0,0,0 + P: "LeftUpLegRoll", "Number", "", "A",0 + P: "LeftUpLegRollMode", "bool", "", "",0 + P: "LeftLegRoll", "Number", "", "A",0 + P: "LeftLegRollMode", "bool", "", "",0 + P: "RightUpLegRoll", "Number", "", "A",0 + P: "RightUpLegRollMode", "bool", "", "",0 + P: "RightLegRoll", "Number", "", "A",0 + P: "RightLegRollMode", "bool", "", "",0 + P: "LeftArmRoll", "Number", "", "A",0 + P: "LeftArmRollMode", "bool", "", "",0 + P: "LeftForeArmRoll", "Number", "", "A",0 + P: "LeftForeArmRollMode", "bool", "", "",0 + P: "RightArmRoll", "Number", "", "A",0 + P: "RightArmRollMode", "bool", "", "",0 + P: "RightForeArmRoll", "Number", "", "A",0 + P: "RightForeArmRollMode", "bool", "", "",0 + P: "LeftUpLegRollEx", "Number", "", "A",0 + P: "LeftUpLegRollExMode", "bool", "", "",1 + P: "LeftLegRollEx", "Number", "", "A",0 + P: "LeftLegRollExMode", "bool", "", "",1 + P: "RightUpLegRollEx", "Number", "", "A",0 + P: "RightUpLegRollExMode", "bool", "", "",1 + P: "RightLegRollEx", "Number", "", "A",0 + P: "RightLegRollExMode", "bool", "", "",1 + P: "LeftArmRollEx", "Number", "", "A",0 + P: "LeftArmRollExMode", "bool", "", "",1 + P: "LeftForeArmRollEx", "Number", "", "A",0 + P: "LeftForeArmRollExMode", "bool", "", "",1 + P: "RightArmRollEx", "Number", "", "A",0 + P: "RightArmRollExMode", "bool", "", "",1 + P: "RightForeArmRollEx", "Number", "", "A",0 + P: "RightForeArmRollExMode", "bool", "", "",1 + P: "LeafLeftUpLegRoll1", "Number", "", "A",50 + P: "LeafLeftUpLegRoll1Mode", "bool", "", "",1 + P: "LeafLeftLegRoll1", "Number", "", "A",50 + P: "LeafLeftLegRoll1Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll1", "Number", "", "A",50 + P: "LeafRightUpLegRoll1Mode", "bool", "", "",1 + P: "LeafRightLegRoll1", "Number", "", "A",50 + P: "LeafRightLegRoll1Mode", "bool", "", "",1 + P: "LeafLeftArmRoll1", "Number", "", "A",50 + P: "LeafLeftArmRoll1Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll1", "Number", "", "A",50 + P: "LeafLeftForeArmRoll1Mode", "bool", "", "",1 + P: "LeafRightArmRoll1", "Number", "", "A",50 + P: "LeafRightArmRoll1Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll1", "Number", "", "A",50 + P: "LeafRightForeArmRoll1Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll2", "Number", "", "A",50 + P: "LeafLeftUpLegRoll2Mode", "bool", "", "",1 + P: "LeafLeftLegRoll2", "Number", "", "A",50 + P: "LeafLeftLegRoll2Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll2", "Number", "", "A",50 + P: "LeafRightUpLegRoll2Mode", "bool", "", "",1 + P: "LeafRightLegRoll2", "Number", "", "A",50 + P: "LeafRightLegRoll2Mode", "bool", "", "",1 + P: "LeafLeftArmRoll2", "Number", "", "A",50 + P: "LeafLeftArmRoll2Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll2", "Number", "", "A",50 + P: "LeafLeftForeArmRoll2Mode", "bool", "", "",1 + P: "LeafRightArmRoll2", "Number", "", "A",50 + P: "LeafRightArmRoll2Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll2", "Number", "", "A",50 + P: "LeafRightForeArmRoll2Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll3", "Number", "", "A",50 + P: "LeafLeftUpLegRoll3Mode", "bool", "", "",1 + P: "LeafLeftLegRoll3", "Number", "", "A",50 + P: "LeafLeftLegRoll3Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll3", "Number", "", "A",50 + P: "LeafRightUpLegRoll3Mode", "bool", "", "",1 + P: "LeafRightLegRoll3", "Number", "", "A",50 + P: "LeafRightLegRoll3Mode", "bool", "", "",1 + P: "LeafLeftArmRoll3", "Number", "", "A",50 + P: "LeafLeftArmRoll3Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll3", "Number", "", "A",50 + P: "LeafLeftForeArmRoll3Mode", "bool", "", "",1 + P: "LeafRightArmRoll3", "Number", "", "A",50 + P: "LeafRightArmRoll3Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll3", "Number", "", "A",50 + P: "LeafRightForeArmRoll3Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll4", "Number", "", "A",50 + P: "LeafLeftUpLegRoll4Mode", "bool", "", "",1 + P: "LeafLeftLegRoll4", "Number", "", "A",50 + P: "LeafLeftLegRoll4Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll4", "Number", "", "A",50 + P: "LeafRightUpLegRoll4Mode", "bool", "", "",1 + P: "LeafRightLegRoll4", "Number", "", "A",50 + P: "LeafRightLegRoll4Mode", "bool", "", "",1 + P: "LeafLeftArmRoll4", "Number", "", "A",50 + P: "LeafLeftArmRoll4Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll4", "Number", "", "A",50 + P: "LeafLeftForeArmRoll4Mode", "bool", "", "",1 + P: "LeafRightArmRoll4", "Number", "", "A",50 + P: "LeafRightArmRoll4Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll4", "Number", "", "A",50 + P: "LeafRightForeArmRoll4Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll5", "Number", "", "A",50 + P: "LeafLeftUpLegRoll5Mode", "bool", "", "",1 + P: "LeafLeftLegRoll5", "Number", "", "A",50 + P: "LeafLeftLegRoll5Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll5", "Number", "", "A",50 + P: "LeafRightUpLegRoll5Mode", "bool", "", "",1 + P: "LeafRightLegRoll5", "Number", "", "A",50 + P: "LeafRightLegRoll5Mode", "bool", "", "",1 + P: "LeafLeftArmRoll5", "Number", "", "A",50 + P: "LeafLeftArmRoll5Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll5", "Number", "", "A",50 + P: "LeafLeftForeArmRoll5Mode", "bool", "", "",1 + P: "LeafRightArmRoll5", "Number", "", "A",50 + P: "LeafRightArmRoll5Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll5", "Number", "", "A",50 + P: "LeafRightForeArmRoll5Mode", "bool", "", "",1 + P: "LeftLegFullRollExtraction", "Number", "", "A",0 + P: "RightLegFullRollExtraction", "Number", "", "A",0 + P: "LeftArmFullRollExtraction", "Number", "", "A",0 + P: "RightArmFullRollExtraction", "Number", "", "A",0 + P: "RollExtractionMode", "enum", "", "",0 + P: "FootFloorContact", "bool", "", "",0 + P: "FootAutomaticToes", "bool", "", "",0 + P: "FootFloorPivot", "enum", "", "",0 + P: "FootBottomToAnkle", "double", "Number", "",0 + P: "FootBackToAnkle", "double", "Number", "",4.5 + P: "FootMiddleToAnkle", "double", "Number", "",13 + P: "FootFrontToMiddle", "double", "Number", "",7 + P: "FootInToAnkle", "double", "Number", "",5 + P: "FootOutToAnkle", "double", "Number", "",5 + P: "FootContactSize", "double", "Number", "",100 + P: "FootContactStiffness", "Number", "", "A",0 + P: "FootFingerContactRollStiffness", "Number", "", "A",0 + P: "HandFloorContact", "bool", "", "",0 + P: "HandAutomaticFingers", "bool", "", "",0 + P: "HandFloorPivot", "enum", "", "",0 + P: "HandBottomToWrist", "double", "Number", "",0 + P: "HandBackToWrist", "double", "Number", "",4.5 + P: "HandMiddleToWrist", "double", "Number", "",13 + P: "HandFrontToMiddle", "double", "Number", "",7 + P: "HandInToWrist", "double", "Number", "",5 + P: "HandOutToWrist", "double", "Number", "",5 + P: "HandContactSize", "double", "Number", "",100 + P: "HandContactStiffness", "Number", "", "A",0 + P: "HandFingerContactRollStiffness", "Number", "", "A",0 + P: "CtrlPullLeftToeBase", "Number", "", "A",0 + P: "CtrlPullLeftFoot", "Number", "", "A",100 + P: "CtrlPullLeftKnee", "Number", "", "A",0 + P: "CtrlPullRightToeBase", "Number", "", "A",0 + P: "CtrlPullRightFoot", "Number", "", "A",100 + P: "CtrlPullRightKnee", "Number", "", "A",0 + P: "CtrlPullLeftFingerBase", "Number", "", "A",0 + P: "CtrlPullLeftHand", "Number", "", "A",100 + P: "CtrlPullLeftElbow", "Number", "", "A",0 + P: "CtrlPullRightFingerBase", "Number", "", "A",0 + P: "CtrlPullRightHand", "Number", "", "A",100 + P: "CtrlPullRightElbow", "Number", "", "A",0 + P: "CtrlChestPullLeftHand", "Number", "", "A",100 + P: "CtrlChestPullRightHand", "Number", "", "A",100 + P: "CtrlPullHead", "Number", "", "A",0 + P: "CtrlResistHipsPosition", "Number", "", "A",0 + P: "CtrlEnforceGravity", "Number", "", "A",60.0000023841858 + P: "CtrlResistHipsOrientation", "Number", "", "A",0 + P: "CtrlResistChestPosition", "Number", "", "A",0 + P: "CtrlResistChestOrientation", "Number", "", "A",0 + P: "CtrlResistLeftCollar", "Number", "", "A",50 + P: "CtrlResistRightCollar", "Number", "", "A",50 + P: "CtrlResistLeftKnee", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionLeftKnee", "Number", "", "A",50 + P: "CtrlResistCompressionFactorLeftKnee", "Number", "", "A",50 + P: "CtrlResistRightKnee", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionRightKnee", "Number", "", "A",50 + P: "CtrlResistCompressionFactorRightKnee", "Number", "", "A",50 + P: "CtrlResistLeftElbow", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionLeftElbow", "Number", "", "A",50 + P: "CtrlResistCompressionFactorLeftElbow", "Number", "", "A",50 + P: "CtrlResistRightElbow", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionRightElbow", "Number", "", "A",50 + P: "CtrlResistCompressionFactorRightElbow", "Number", "", "A",50 + P: "CtrlSpineStiffness", "Number", "", "A",0 + P: "CtrlNeckStiffness", "Number", "", "A",0 + P: "MirrorMode", "bool", "", "",0 + P: "ShoulderCorrection", "Number", "", "A",0 + P: "LeftKneeKillPitch", "bool", "", "",0 + P: "RightKneeKillPitch", "bool", "", "",0 + P: "LeftElbowKillPitch", "bool", "", "",0 + P: "RightElbowKillPitch", "bool", "", "",0 + P: "HipsTranslationMode", "enum", "", "",0 + P: "WriteReference", "bool", "", "",0 + P: "SyncMode", "bool", "", "H",1 + P: "Damping", "Number", "", "A",0 + P: "OrientationDamping", "Number", "", "A",0 + P: "OrientationDampingMode", "enum", "", "",1 + P: "DisplacementDamping", "Number", "", "A",0 + P: "DisplacementDampingMode", "enum", "", "",1 + P: "DisplacementMemory", "Number", "", "A",0 + P: "DisplacementMemoryMode", "enum", "", "",0 + P: "HipsDisplacementDamping", "Number", "", "A",0 + P: "HipsDisplacementDampingMode", "enum", "", "",0 + P: "AnkleDisplacementDamping", "Number", "", "A",0 + P: "AnkleDisplacementDampingMode", "enum", "", "",0 + P: "WristDisplacementDamping", "Number", "", "A",0 + P: "WristDisplacementDampingMode", "enum", "", "",0 + P: "Stabilization", "Number", "", "A",0 + P: "AnkleStabilizationTime", "Number", "", "A",0 + P: "AnkleStabilizationTimeMode", "enum", "", "",0 + P: "AnkleStabilizationPerimeter", "Number", "", "A",0 + P: "AnkleStabilizationPerimeterMode", "enum", "", "",0 + P: "AnkleStabilizationAngularPerimeter", "Number", "", "A",0 + P: "AnkleStabilizationAngularPerimeterMode", "enum", "", "",1 + P: "AnkleStabilizationFloorProximity", "Number", "", "A",0 + P: "AnkleStabilizationFloorProximityMode", "enum", "", "",1 + P: "AnkleStabilizationDamping", "Number", "", "A",0 + P: "AnkleStabilizationDampingMode", "enum", "", "",0 + P: "AnkleStabilizationRecoveryTime", "Number", "", "A",0 + P: "AnkleStabilizationRecoveryTimeMode", "enum", "", "",1 + P: "LeftHandThumbTip", "double", "Number", "",0.5 + P: "LeftHandIndexTip", "double", "Number", "",0.5 + P: "LeftHandMiddleTip", "double", "Number", "",0.5 + P: "LeftHandRingTip", "double", "Number", "",0.5 + P: "LeftHandPinkyTip", "double", "Number", "",0.5 + P: "LeftHandExtraFingerTip", "double", "Number", "",0.5 + P: "RightHandThumbTip", "double", "Number", "",0.5 + P: "RightHandIndexTip", "double", "Number", "",0.5 + P: "RightHandMiddleTip", "double", "Number", "",0.5 + P: "RightHandRingTip", "double", "Number", "",0.5 + P: "RightHandPinkyTip", "double", "Number", "",0.5 + P: "RightHandExtraFingerTip", "double", "Number", "",0.5 + P: "LeftFootThumbTip", "double", "Number", "",0.5 + P: "LeftFootIndexTip", "double", "Number", "",0.5 + P: "LeftFootMiddleTip", "double", "Number", "",0.5 + P: "LeftFootRingTip", "double", "Number", "",0.5 + P: "LeftFootPinkyTip", "double", "Number", "",0.5 + P: "LeftFootExtraFingerTip", "double", "Number", "",0.5 + P: "RightFootThumbTip", "double", "Number", "",0.5 + P: "RightFootIndexTip", "double", "Number", "",0.5 + P: "RightFootMiddleTip", "double", "Number", "",0.5 + P: "RightFootRingTip", "double", "Number", "",0.5 + P: "RightFootPinkyTip", "double", "Number", "",0.5 + P: "RightFootExtraFingerTip", "double", "Number", "",0.5 + P: "FingerSolving", "bool", "", "",1 + P: "FootFingerContact", "bool", "", "",0 + P: "FootContactType", "enum", "", "",0 + P: "FootFingerContactMode", "enum", "", "",1 + P: "HandFingerContact", "bool", "", "",0 + P: "HandContactType", "enum", "", "",0 + P: "HandFingerContactMode", "enum", "", "",1 + P: "ContactBehaviour", "enum", "", "",0 + P: "HikVersion", "double", "Number", "",2016.5 + P: "Characterize", "bool", "", "",0 + P: "RealisticShoulder", "Number", "", "A",0 + P: "CollarStiffnessX", "Number", "", "A",0 + P: "CollarStiffnessY", "Number", "", "A",0 + P: "CollarStiffnessZ", "Number", "", "A",0 + P: "ExtraCollarRatio", "Number", "", "A",0 + P: "LeftLegMaxExtensionAngle", "Number", "", "A",180 + P: "RightLegMaxExtensionAngle", "Number", "", "A",180 + P: "LeftArmMaxExtensionAngle", "Number", "", "A",180 + P: "RightArmMaxExtensionAngle", "Number", "", "A",180 + P: "StretchStartArmsAndLegs", "Number", "", "A",90 + P: "StretchStopArmsAndLegs", "Number", "", "A",110 + P: "SnSScaleArmsAndLegs", "Number", "", "A",0 + P: "SnSReachLeftWrist", "Number", "", "A",0 + P: "SnSReachRightWrist", "Number", "", "A",0 + P: "SnSReachLeftAnkle", "Number", "", "A",0 + P: "SnSReachRightAnkle", "Number", "", "A",0 + P: "SnSScaleSpine", "Number", "", "A",0 + P: "SnSScaleSpineChildren", "Number", "", "A",0 + P: "SnSSpineFreedom", "Number", "", "A",10 + P: "SnSReachChestEnd", "Number", "", "A",0 + P: "SnSScaleNeck", "Number", "", "A",0 + P: "SnSNeckFreedom", "Number", "", "A",10 + P: "SnSReachHead", "Number", "", "A",0 + P: "HipsLink", "object", "", "" + P: "LeftUpLegLink", "object", "", "" + P: "LeftLegLink", "object", "", "" + P: "LeftFootLink", "object", "", "" + P: "LeftToeBaseLink", "object", "", "" + P: "RightUpLegLink", "object", "", "" + P: "RightLegLink", "object", "", "" + P: "RightFootLink", "object", "", "" + P: "RightToeBaseLink", "object", "", "" + P: "SpineLink", "object", "", "" + P: "Spine1Link", "object", "", "" + P: "LeftShoulderLink", "object", "", "" + P: "LeftArmLink", "object", "", "" + P: "LeftForeArmLink", "object", "", "" + P: "LeftHandLink", "object", "", "" + P: "RightShoulderLink", "object", "", "" + P: "RightArmLink", "object", "", "" + P: "RightForeArmLink", "object", "", "" + P: "RightHandLink", "object", "", "" + P: "NeckLink", "object", "", "" + P: "HeadLink", "object", "", "" + P: "LeftUpLegRollLink", "object", "", "" + P: "LeftLegRollLink", "object", "", "" + P: "RightUpLegRollLink", "object", "", "" + P: "RightLegRollLink", "object", "", "" + P: "LeftArmRollLink", "object", "", "" + P: "LeftForeArmRollLink", "object", "", "" + P: "RightArmRollLink", "object", "", "" + P: "RightForeArmRollLink", "object", "", "" + P: "Spine2Link", "object", "", "" + P: "Spine3Link", "object", "", "" + P: "Spine4Link", "object", "", "" + P: "Spine5Link", "object", "", "" + P: "Spine6Link", "object", "", "" + P: "Spine7Link", "object", "", "" + P: "Spine8Link", "object", "", "" + P: "Spine9Link", "object", "", "" + P: "LeftHandThumb1Link", "object", "", "" + P: "LeftHandThumb2Link", "object", "", "" + P: "LeftHandThumb3Link", "object", "", "" + P: "LeftHandIndex1Link", "object", "", "" + P: "LeftHandIndex2Link", "object", "", "" + P: "LeftHandIndex3Link", "object", "", "" + P: "LeftHandMiddle1Link", "object", "", "" + P: "LeftHandMiddle2Link", "object", "", "" + P: "LeftHandMiddle3Link", "object", "", "" + P: "LeftHandRing1Link", "object", "", "" + P: "LeftHandRing2Link", "object", "", "" + P: "LeftHandRing3Link", "object", "", "" + P: "LeftHandPinky1Link", "object", "", "" + P: "LeftHandPinky2Link", "object", "", "" + P: "LeftHandPinky3Link", "object", "", "" + P: "RightHandThumb1Link", "object", "", "" + P: "RightHandThumb2Link", "object", "", "" + P: "RightHandThumb3Link", "object", "", "" + P: "RightHandIndex1Link", "object", "", "" + P: "RightHandIndex2Link", "object", "", "" + P: "RightHandIndex3Link", "object", "", "" + P: "RightHandMiddle1Link", "object", "", "" + P: "RightHandMiddle2Link", "object", "", "" + P: "RightHandMiddle3Link", "object", "", "" + P: "RightHandRing1Link", "object", "", "" + P: "RightHandRing2Link", "object", "", "" + P: "RightHandRing3Link", "object", "", "" + P: "RightHandPinky1Link", "object", "", "" + P: "RightHandPinky2Link", "object", "", "" + P: "RightHandPinky3Link", "object", "", "" + P: "ReferenceLink", "object", "", "" + P: "LeftFloorContactLink", "object", "", "" + P: "RightFloorContactLink", "object", "", "" + P: "HipsTranslationLink", "object", "", "" + P: "Props0Link", "object", "", "" + P: "Props1Link", "object", "", "" + P: "Props2Link", "object", "", "" + P: "Props3Link", "object", "", "" + P: "Props4Link", "object", "", "" + P: "GameModeParentLeftHipRollLink", "object", "", "" + P: "GameModeParentLeftKneeLink", "object", "", "" + P: "GameModeParentLeftKneeRollLink", "object", "", "" + P: "GameModeParentRightHipRollLink", "object", "", "" + P: "GameModeParentRightKneeLink", "object", "", "" + P: "GameModeParentRightKneeRollLink", "object", "", "" + P: "GameModeParentLeftShoulderRollLink", "object", "", "" + P: "GameModeParentLeftElbowLink", "object", "", "" + P: "GameModeParentLeftElbowRollLink", "object", "", "" + P: "GameModeParentRightShoulderRollLink", "object", "", "" + P: "GameModeParentRightElbowLink", "object", "", "" + P: "GameModeParentRightElbowRollLink", "object", "", "" + P: "LeftUpLegRollExLink", "object", "", "" + P: "LeftLegRollExLink", "object", "", "" + P: "RightUpLegRollExLink", "object", "", "" + P: "RightLegRollExLink", "object", "", "" + P: "LeftArmRollExLink", "object", "", "" + P: "LeftForeArmRollExLink", "object", "", "" + P: "RightArmRollExLink", "object", "", "" + P: "RightForeArmRollExLink", "object", "", "" + P: "LeftHandFloorContactLink", "object", "", "" + P: "RightHandFloorContactLink", "object", "", "" + P: "LeftFingerBaseLink", "object", "", "" + P: "RightFingerBaseLink", "object", "", "" + P: "Neck1Link", "object", "", "" + P: "Neck2Link", "object", "", "" + P: "Neck3Link", "object", "", "" + P: "Neck4Link", "object", "", "" + P: "Neck5Link", "object", "", "" + P: "Neck6Link", "object", "", "" + P: "Neck7Link", "object", "", "" + P: "Neck8Link", "object", "", "" + P: "Neck9Link", "object", "", "" + P: "LeftInHandThumbLink", "object", "", "" + P: "LeftHandThumb4Link", "object", "", "" + P: "LeftInHandIndexLink", "object", "", "" + P: "LeftHandIndex4Link", "object", "", "" + P: "LeftInHandMiddleLink", "object", "", "" + P: "LeftHandMiddle4Link", "object", "", "" + P: "LeftInHandRingLink", "object", "", "" + P: "LeftHandRing4Link", "object", "", "" + P: "LeftInHandPinkyLink", "object", "", "" + P: "LeftHandPinky4Link", "object", "", "" + P: "LeftInHandExtraFingerLink", "object", "", "" + P: "LeftHandExtraFinger1Link", "object", "", "" + P: "LeftHandExtraFinger2Link", "object", "", "" + P: "LeftHandExtraFinger3Link", "object", "", "" + P: "LeftHandExtraFinger4Link", "object", "", "" + P: "RightInHandThumbLink", "object", "", "" + P: "RightHandThumb4Link", "object", "", "" + P: "RightInHandIndexLink", "object", "", "" + P: "RightHandIndex4Link", "object", "", "" + P: "RightInHandMiddleLink", "object", "", "" + P: "RightHandMiddle4Link", "object", "", "" + P: "RightInHandRingLink", "object", "", "" + P: "RightHandRing4Link", "object", "", "" + P: "RightInHandPinkyLink", "object", "", "" + P: "RightHandPinky4Link", "object", "", "" + P: "RightInHandExtraFingerLink", "object", "", "" + P: "RightHandExtraFinger1Link", "object", "", "" + P: "RightHandExtraFinger2Link", "object", "", "" + P: "RightHandExtraFinger3Link", "object", "", "" + P: "RightHandExtraFinger4Link", "object", "", "" + P: "LeftInFootThumbLink", "object", "", "" + P: "LeftFootThumb1Link", "object", "", "" + P: "LeftFootThumb2Link", "object", "", "" + P: "LeftFootThumb3Link", "object", "", "" + P: "LeftFootThumb4Link", "object", "", "" + P: "LeftInFootIndexLink", "object", "", "" + P: "LeftFootIndex1Link", "object", "", "" + P: "LeftFootIndex2Link", "object", "", "" + P: "LeftFootIndex3Link", "object", "", "" + P: "LeftFootIndex4Link", "object", "", "" + P: "LeftInFootMiddleLink", "object", "", "" + P: "LeftFootMiddle1Link", "object", "", "" + P: "LeftFootMiddle2Link", "object", "", "" + P: "LeftFootMiddle3Link", "object", "", "" + P: "LeftFootMiddle4Link", "object", "", "" + P: "LeftInFootRingLink", "object", "", "" + P: "LeftFootRing1Link", "object", "", "" + P: "LeftFootRing2Link", "object", "", "" + P: "LeftFootRing3Link", "object", "", "" + P: "LeftFootRing4Link", "object", "", "" + P: "LeftInFootPinkyLink", "object", "", "" + P: "LeftFootPinky1Link", "object", "", "" + P: "LeftFootPinky2Link", "object", "", "" + P: "LeftFootPinky3Link", "object", "", "" + P: "LeftFootPinky4Link", "object", "", "" + P: "LeftInFootExtraFingerLink", "object", "", "" + P: "LeftFootExtraFinger1Link", "object", "", "" + P: "LeftFootExtraFinger2Link", "object", "", "" + P: "LeftFootExtraFinger3Link", "object", "", "" + P: "LeftFootExtraFinger4Link", "object", "", "" + P: "RightInFootThumbLink", "object", "", "" + P: "RightFootThumb1Link", "object", "", "" + P: "RightFootThumb2Link", "object", "", "" + P: "RightFootThumb3Link", "object", "", "" + P: "RightFootThumb4Link", "object", "", "" + P: "RightInFootIndexLink", "object", "", "" + P: "RightFootIndex1Link", "object", "", "" + P: "RightFootIndex2Link", "object", "", "" + P: "RightFootIndex3Link", "object", "", "" + P: "RightFootIndex4Link", "object", "", "" + P: "RightInFootMiddleLink", "object", "", "" + P: "RightFootMiddle1Link", "object", "", "" + P: "RightFootMiddle2Link", "object", "", "" + P: "RightFootMiddle3Link", "object", "", "" + P: "RightFootMiddle4Link", "object", "", "" + P: "RightInFootRingLink", "object", "", "" + P: "RightFootRing1Link", "object", "", "" + P: "RightFootRing2Link", "object", "", "" + P: "RightFootRing3Link", "object", "", "" + P: "RightFootRing4Link", "object", "", "" + P: "RightInFootPinkyLink", "object", "", "" + P: "RightFootPinky1Link", "object", "", "" + P: "RightFootPinky2Link", "object", "", "" + P: "RightFootPinky3Link", "object", "", "" + P: "RightFootPinky4Link", "object", "", "" + P: "RightInFootExtraFingerLink", "object", "", "" + P: "RightFootExtraFinger1Link", "object", "", "" + P: "RightFootExtraFinger2Link", "object", "", "" + P: "RightFootExtraFinger3Link", "object", "", "" + P: "RightFootExtraFinger4Link", "object", "", "" + P: "LeftShoulderExtraLink", "object", "", "" + P: "RightShoulderExtraLink", "object", "", "" + P: "LeafLeftUpLegRoll1Link", "object", "", "" + P: "LeafLeftLegRoll1Link", "object", "", "" + P: "LeafRightUpLegRoll1Link", "object", "", "" + P: "LeafRightLegRoll1Link", "object", "", "" + P: "LeafLeftArmRoll1Link", "object", "", "" + P: "LeafLeftForeArmRoll1Link", "object", "", "" + P: "LeafRightArmRoll1Link", "object", "", "" + P: "LeafRightForeArmRoll1Link", "object", "", "" + P: "LeafLeftUpLegRoll2Link", "object", "", "" + P: "LeafLeftLegRoll2Link", "object", "", "" + P: "LeafRightUpLegRoll2Link", "object", "", "" + P: "LeafRightLegRoll2Link", "object", "", "" + P: "LeafLeftArmRoll2Link", "object", "", "" + P: "LeafLeftForeArmRoll2Link", "object", "", "" + P: "LeafRightArmRoll2Link", "object", "", "" + P: "LeafRightForeArmRoll2Link", "object", "", "" + P: "LeafLeftUpLegRoll3Link", "object", "", "" + P: "LeafLeftLegRoll3Link", "object", "", "" + P: "LeafRightUpLegRoll3Link", "object", "", "" + P: "LeafRightLegRoll3Link", "object", "", "" + P: "LeafLeftArmRoll3Link", "object", "", "" + P: "LeafLeftForeArmRoll3Link", "object", "", "" + P: "LeafRightArmRoll3Link", "object", "", "" + P: "LeafRightForeArmRoll3Link", "object", "", "" + P: "LeafLeftUpLegRoll4Link", "object", "", "" + P: "LeafLeftLegRoll4Link", "object", "", "" + P: "LeafRightUpLegRoll4Link", "object", "", "" + P: "LeafRightLegRoll4Link", "object", "", "" + P: "LeafLeftArmRoll4Link", "object", "", "" + P: "LeafLeftForeArmRoll4Link", "object", "", "" + P: "LeafRightArmRoll4Link", "object", "", "" + P: "LeafRightForeArmRoll4Link", "object", "", "" + P: "LeafLeftUpLegRoll5Link", "object", "", "" + P: "LeafLeftLegRoll5Link", "object", "", "" + P: "LeafRightUpLegRoll5Link", "object", "", "" + P: "LeafRightLegRoll5Link", "object", "", "" + P: "LeafLeftArmRoll5Link", "object", "", "" + P: "LeafLeftForeArmRoll5Link", "object", "", "" + P: "LeafRightArmRoll5Link", "object", "", "" + P: "LeafRightForeArmRoll5Link", "object", "", "" + } + CHARACTERIZE: 1 + LOCK_XFORM: 0 + LOCK_PICK: 0 + REFERENCE: { + TOFFSETX: 0 + TOFFSETY: 0 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LEFT_FLOOR: { + } + RIGHT_FLOOR: { + } + LEFT_HANDFLOOR: { + } + RIGHT_HANDFLOOR: { + } + BASE: { + LINK: "Hips" { + TOFFSETX: 0 + TOFFSETY: 100 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftUpLeg" { + TOFFSETX: 8.910000801 + TOFFSETY: 93.72999954 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftLeg" { + TOFFSETX: 8.910000801 + TOFFSETY: 48.8513546 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftFoot" { + TOFFSETX: 8.910000801 + TOFFSETY: 8.150396347 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightUpLeg" { + TOFFSETX: -8.910000801 + TOFFSETY: 93.72999954 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightLeg" { + TOFFSETX: -8.910003517 + TOFFSETY: 48.8513546 + TOFFSETZ: 0.000439024 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightFoot" { + TOFFSETX: -8.910002598 + TOFFSETY: 8.150396351 + TOFFSETZ: 0.000439024 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Spine" { + TOFFSETX: 0 + TOFFSETY: 107 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftArm" { + TOFFSETX: 17.70725107 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000735282 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftForeArm" { + TOFFSETX: 45.01271677 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000735282000000001 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHand" { + TOFFSETX: 71.70986414 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightArm" { + TOFFSETX: -17.70727491 + TOFFSETY: 146.58898 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.002318361 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightForeArm" { + TOFFSETX: -45.01287316 + TOFFSETY: 146.58898 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.002318361 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHand" { + TOFFSETX: -71.70986127 + TOFFSETY: 146.5889787 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Head" { + TOFFSETX: 0 + TOFFSETY: 165 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + AUXILIARY: { + LINK: "LeftToeBase" { + TOFFSETX: 8.910009228 + TOFFSETY: 1.888079154 + TOFFSETZ: 12.9547209 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightToeBase" { + TOFFSETX: -8.911087979 + TOFFSETY: 1.888079171 + TOFFSETZ: 12.95518809 + ROFFSETX: 0 + ROFFSETY: 0.004800386 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftShoulder" { + TOFFSETX: 7.000000477 + TOFFSETY: 146.5885468 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightShoulder" { + TOFFSETX: -6.999999523 + TOFFSETY: 146.5885468 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Neck" { + TOFFSETX: 0 + TOFFSETY: 145 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + SPINE: { + LINK: "Spine1" { + TOFFSETX: 0 + TOFFSETY: 119.666666666667 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Spine2" { + TOFFSETX: 0 + TOFFSETY: 132.333333333333 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + NECK: { + } + ROLL: { + } + SPECIAL: { + } + LEFTHAND: { + LINK: "LeftHandThumb1" { + TOFFSETX: 76.05862099 + TOFFSETY: 145.7901817 + TOFFSETZ: 4.282433967 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb2" { + TOFFSETX: 78.57121093 + TOFFSETY: 145.2540823 + TOFFSETZ: 4.989888291 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb3" { + TOFFSETX: 81.11435134 + TOFFSETY: 145.2540691 + TOFFSETZ: 4.989897633 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000297862 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex1" { + TOFFSETX: 80.53184086 + TOFFSETY: 146.7884134 + TOFFSETZ: 3.471669416 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex2" { + TOFFSETX: 84.75459546 + TOFFSETY: 146.7883913 + TOFFSETZ: 3.618868435 + ROFFSETX: 0 + ROFFSETY: 1.99999998497269 + ROFFSETZ: 0.000299523461597212 + SOFFSETX: 1 + SOFFSETY: 0.999999999999983 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex3" { + TOFFSETX: 87.40692091 + TOFFSETY: 146.7883775 + TOFFSETZ: 3.711324415 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle1" { + TOFFSETX: 80.5197435 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.304684381 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle2" { + TOFFSETX: 85.38299518 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.304986836 + ROFFSETX: 0 + ROFFSETY: 0.003563334 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle3" { + TOFFSETX: 88.14823179 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.305158619 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing1" { + TOFFSETX: 80.60362393 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793158909 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing2" { + TOFFSETX: 85.14138276 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.79315882 + ROFFSETX: 0 + ROFFSETY: 0.003563529 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing3" { + TOFFSETX: 87.44590862 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793158937 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky1" { + TOFFSETX: 80.59213883 + TOFFSETY: 146.2756572 + TOFFSETZ: -2.490356465 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky2" { + TOFFSETX: 83.63623816 + TOFFSETY: 146.2756978 + TOFFSETZ: -2.490356465 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000763025999999999 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky3" { + TOFFSETX: 85.61073965 + TOFFSETY: 146.2757241 + TOFFSETZ: -2.490356608 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb4" { + TOFFSETX: 83.78109748 + TOFFSETY: 145.254072 + TOFFSETZ: 4.989889422 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000297862 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex4" { + TOFFSETX: 89.36395514 + TOFFSETY: 146.7883673 + TOFFSETZ: 3.779543315 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle4" { + TOFFSETX: 90.15386395 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.305282215 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing4" { + TOFFSETX: 89.36925598 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793159754 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky4" { + TOFFSETX: 87.2773543 + TOFFSETY: 146.2757463 + TOFFSETZ: -2.490355817 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + RIGHTHAND: { + LINK: "RightHandThumb1" { + TOFFSETX: -76.05824206 + TOFFSETY: 145.7904806 + TOFFSETZ: 4.282814738 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb2" { + TOFFSETX: -78.57076957 + TOFFSETY: 145.2543817 + TOFFSETZ: 4.990491388 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb3" { + TOFFSETX: -81.11235893 + TOFFSETY: 145.2544085 + TOFFSETZ: 5.079311703 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000602086 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex1" { + TOFFSETX: -80.53153393 + TOFFSETY: 146.7887124 + TOFFSETZ: 3.472444296 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex2" { + TOFFSETX: -84.75428415 + TOFFSETY: 146.7887121 + TOFFSETZ: 3.325092508 + ROFFSETX: 0 + ROFFSETY: 2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex3" { + TOFFSETX: -87.40660695 + TOFFSETY: 146.7887118 + TOFFSETZ: 3.232540367 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle1" { + TOFFSETX: -80.5196273 + TOFFSETY: 147.0898718 + TOFFSETZ: 1.305458427 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle2" { + TOFFSETX: -85.37992179 + TOFFSETY: 147.0898714 + TOFFSETZ: 1.135859675 + ROFFSETX: 0 + ROFFSETY: 2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle3" { + TOFFSETX: -88.14347689 + TOFFSETY: 147.0898712 + TOFFSETZ: 1.039426113 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing1" { + TOFFSETX: -80.6036937 + TOFFSETY: 146.968899 + TOFFSETZ: -0.792376756 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing2" { + TOFFSETX: -85.13869331 + TOFFSETY: 146.9688986 + TOFFSETZ: -0.950624428 + ROFFSETX: 0 + ROFFSETY: 2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing3" { + TOFFSETX: -87.44181788 + TOFFSETY: 146.9688984 + TOFFSETZ: -1.03099138 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky1" { + TOFFSETX: -80.59235737 + TOFFSETY: 146.2759509 + TOFFSETZ: -2.489574194 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky2" { + TOFFSETX: -83.63829999 + TOFFSETY: 146.2758849 + TOFFSETZ: -2.595861595 + ROFFSETX: 0 + ROFFSETY: 2.0000646575305 + ROFFSETZ: -0.00124197162447093 + SOFFSETX: 1 + SOFFSETY: 0.999999999999714 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky3" { + TOFFSETX: -85.61399713 + TOFFSETY: 146.2758421 + TOFFSETZ: -2.664803045 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb4" { + TOFFSETX: -83.77747869 + TOFFSETY: 145.2544268 + TOFFSETZ: 5.17244902 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000210591999999999 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex4" { + TOFFSETX: -89.36363917 + TOFFSETY: 146.7887117 + TOFFSETZ: 3.164250215 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle4" { + TOFFSETX: -90.14788957 + TOFFSETY: 147.089871 + TOFFSETZ: 0.969482638 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing4" { + TOFFSETX: -89.3639958 + TOFFSETY: 146.9688983 + TOFFSETZ: -1.098065296 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky4" { + TOFFSETX: -87.28162098 + TOFFSETY: 146.2758059 + TOFFSETZ: -2.722994364 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + LEFTFOOT: { + } + RIGHTFOOT: { + } + PROPS: { + } + } + AnimationStack: 2888581200544, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2888571478112, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Character1_Hips, Constraint::Character1 + C: "OP",2888573866208,2888547746720, "HipsLink" + + ;Model::Character1_LeftUpLeg, Constraint::Character1 + C: "OP",2888573884768,2888547746720, "LeftUpLegLink" + + ;Model::Character1_LeftLeg, Constraint::Character1 + C: "OP",2888573880128,2888547746720, "LeftLegLink" + + ;Model::Character1_LeftFoot, Constraint::Character1 + C: "OP",2888573875488,2888547746720, "LeftFootLink" + + ;Model::Character1_LeftToeBase, Constraint::Character1 + C: "OP",2888573873168,2888547746720, "LeftToeBaseLink" + + ;Model::Character1_RightUpLeg, Constraint::Character1 + C: "OP",2888573870848,2888547746720, "RightUpLegLink" + + ;Model::Character1_RightLeg, Constraint::Character1 + C: "OP",2888573877808,2888547746720, "RightLegLink" + + ;Model::Character1_RightFoot, Constraint::Character1 + C: "OP",2888573882448,2888547746720, "RightFootLink" + + ;Model::Character1_RightToeBase, Constraint::Character1 + C: "OP",2888573854608,2888547746720, "RightToeBaseLink" + + ;Model::Character1_Spine, Constraint::Character1 + C: "OP",2888573887088,2888547746720, "SpineLink" + + ;Model::Character1_Spine1, Constraint::Character1 + C: "OP",2888573856928,2888547746720, "Spine1Link" + + ;Model::Character1_LeftShoulder, Constraint::Character1 + C: "OP",2888573891728,2888547746720, "LeftShoulderLink" + + ;Model::Character1_LeftArm, Constraint::Character1 + C: "OP",2888573889408,2888547746720, "LeftArmLink" + + ;Model::Character1_LeftForeArm, Constraint::Character1 + C: "OP",2888573861568,2888547746720, "LeftForeArmLink" + + ;Model::Character1_LeftHand, Constraint::Character1 + C: "OP",2888573894048,2888547746720, "LeftHandLink" + + ;Model::Character1_RightShoulder, Constraint::Character1 + C: "OP",2888573942768,2888547746720, "RightShoulderLink" + + ;Model::Character1_RightArm, Constraint::Character1 + C: "OP",2888573945088,2888547746720, "RightArmLink" + + ;Model::Character1_RightForeArm, Constraint::Character1 + C: "OP",2888573924208,2888547746720, "RightForeArmLink" + + ;Model::Character1_RightHand, Constraint::Character1 + C: "OP",2888573919568,2888547746720, "RightHandLink" + + ;Model::Character1_Neck, Constraint::Character1 + C: "OP",2888574014688,2888547746720, "NeckLink" + + ;Model::Character1_Head, Constraint::Character1 + C: "OP",2888574023968,2888547746720, "HeadLink" + + ;Model::Character1_Spine2, Constraint::Character1 + C: "OP",2888573859248,2888547746720, "Spine2Link" + + ;Model::Character1_LeftHandThumb1, Constraint::Character1 + C: "OP",2888573863888,2888547746720, "LeftHandThumb1Link" + + ;Model::Character1_LeftHandThumb2, Constraint::Character1 + C: "OP",2888573896368,2888547746720, "LeftHandThumb2Link" + + ;Model::Character1_LeftHandThumb3, Constraint::Character1 + C: "OP",2888573901008,2888547746720, "LeftHandThumb3Link" + + ;Model::Character1_LeftHandIndex1, Constraint::Character1 + C: "OP",2888573903328,2888547746720, "LeftHandIndex1Link" + + ;Model::Character1_LeftHandIndex2, Constraint::Character1 + C: "OP",2888573907968,2888547746720, "LeftHandIndex2Link" + + ;Model::Character1_LeftHandIndex3, Constraint::Character1 + C: "OP",2888573914928,2888547746720, "LeftHandIndex3Link" + + ;Model::Character1_LeftHandMiddle1, Constraint::Character1 + C: "OP",2888573910288,2888547746720, "LeftHandMiddle1Link" + + ;Model::Character1_LeftHandMiddle2, Constraint::Character1 + C: "OP",2888573912608,2888547746720, "LeftHandMiddle2Link" + + ;Model::Character1_LeftHandMiddle3, Constraint::Character1 + C: "OP",2888573938128,2888547746720, "LeftHandMiddle3Link" + + ;Model::Character1_LeftHandRing1, Constraint::Character1 + C: "OP",2888573928848,2888547746720, "LeftHandRing1Link" + + ;Model::Character1_LeftHandRing2, Constraint::Character1 + C: "OP",2888573931168,2888547746720, "LeftHandRing2Link" + + ;Model::Character1_LeftHandRing3, Constraint::Character1 + C: "OP",2888573933488,2888547746720, "LeftHandRing3Link" + + ;Model::Character1_LeftHandPinky1, Constraint::Character1 + C: "OP",2888573940448,2888547746720, "LeftHandPinky1Link" + + ;Model::Character1_LeftHandPinky2, Constraint::Character1 + C: "OP",2888573917248,2888547746720, "LeftHandPinky2Link" + + ;Model::Character1_LeftHandPinky3, Constraint::Character1 + C: "OP",2888573935808,2888547746720, "LeftHandPinky3Link" + + ;Model::Character1_RightHandThumb1, Constraint::Character1 + C: "OP",2888573952048,2888547746720, "RightHandThumb1Link" + + ;Model::Character1_RightHandThumb2, Constraint::Character1 + C: "OP",2888573954368,2888547746720, "RightHandThumb2Link" + + ;Model::Character1_RightHandThumb3, Constraint::Character1 + C: "OP",2888573956688,2888547746720, "RightHandThumb3Link" + + ;Model::Character1_RightHandIndex1, Constraint::Character1 + C: "OP",2888573982208,2888547746720, "RightHandIndex1Link" + + ;Model::Character1_RightHandIndex2, Constraint::Character1 + C: "OP",2888573975248,2888547746720, "RightHandIndex2Link" + + ;Model::Character1_RightHandIndex3, Constraint::Character1 + C: "OP",2888573977568,2888547746720, "RightHandIndex3Link" + + ;Model::Character1_RightHandMiddle1, Constraint::Character1 + C: "OP",2888573984528,2888547746720, "RightHandMiddle1Link" + + ;Model::Character1_RightHandMiddle2, Constraint::Character1 + C: "OP",2888573959008,2888547746720, "RightHandMiddle2Link" + + ;Model::Character1_RightHandMiddle3, Constraint::Character1 + C: "OP",2888573963648,2888547746720, "RightHandMiddle3Link" + + ;Model::Character1_RightHandRing1, Constraint::Character1 + C: "OP",2888573989168,2888547746720, "RightHandRing1Link" + + ;Model::Character1_RightHandRing2, Constraint::Character1 + C: "OP",2888573979888,2888547746720, "RightHandRing2Link" + + ;Model::Character1_RightHandRing3, Constraint::Character1 + C: "OP",2888573991488,2888547746720, "RightHandRing3Link" + + ;Model::Character1_RightHandPinky1, Constraint::Character1 + C: "OP",2888573972928,2888547746720, "RightHandPinky1Link" + + ;Model::Character1_RightHandPinky2, Constraint::Character1 + C: "OP",2888573968288,2888547746720, "RightHandPinky2Link" + + ;Model::Character1_RightHandPinky3, Constraint::Character1 + C: "OP",2888573961328,2888547746720, "RightHandPinky3Link" + + ;Model::Character1_Reference, Constraint::Character1 + C: "OP",2888573868528,2888547746720, "ReferenceLink" + + ;Model::Character1_LeftHandThumb4, Constraint::Character1 + C: "OP",2888573898688,2888547746720, "LeftHandThumb4Link" + + ;Model::Character1_LeftHandIndex4, Constraint::Character1 + C: "OP",2888573905648,2888547746720, "LeftHandIndex4Link" + + ;Model::Character1_LeftHandMiddle4, Constraint::Character1 + C: "OP",2888573947408,2888547746720, "LeftHandMiddle4Link" + + ;Model::Character1_LeftHandRing4, Constraint::Character1 + C: "OP",2888573921888,2888547746720, "LeftHandRing4Link" + + ;Model::Character1_LeftHandPinky4, Constraint::Character1 + C: "OP",2888573949728,2888547746720, "LeftHandPinky4Link" + + ;Model::Character1_RightHandThumb4, Constraint::Character1 + C: "OP",2888573926528,2888547746720, "RightHandThumb4Link" + + ;Model::Character1_RightHandIndex4, Constraint::Character1 + C: "OP",2888573965968,2888547746720, "RightHandIndex4Link" + + ;Model::Character1_RightHandMiddle4, Constraint::Character1 + C: "OP",2888573986848,2888547746720, "RightHandMiddle4Link" + + ;Model::Character1_RightHandRing4, Constraint::Character1 + C: "OP",2888573970608,2888547746720, "RightHandRing4Link" + + ;Model::Character1_RightHandPinky4, Constraint::Character1 + C: "OP",2888573993808,2888547746720, "RightHandPinky4Link" + + ;Model::Character1_Reference, Model::RootNode + C: "OO",2888573868528,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2888571478112,2888581200544 + + ;NodeAttribute::, Model::Character1_Reference + C: "OO",2888760502960,2888573868528 + + ;Model::Character1_Hips, Model::Character1_Reference + C: "OO",2888573866208,2888573868528 + + ;NodeAttribute::, Model::Character1_Hips + C: "OO",2888740181248,2888573866208 + + ;Model::Character1_LeftUpLeg, Model::Character1_Hips + C: "OO",2888573884768,2888573866208 + + ;Model::Character1_RightUpLeg, Model::Character1_Hips + C: "OO",2888573870848,2888573866208 + + ;Model::Character1_Spine, Model::Character1_Hips + C: "OO",2888573887088,2888573866208 + + ;NodeAttribute::, Model::Character1_LeftUpLeg + C: "OO",2888740179712,2888573884768 + + ;Model::Character1_LeftLeg, Model::Character1_LeftUpLeg + C: "OO",2888573880128,2888573884768 + + ;NodeAttribute::, Model::Character1_LeftLeg + C: "OO",2888740181440,2888573880128 + + ;Model::Character1_LeftFoot, Model::Character1_LeftLeg + C: "OO",2888573875488,2888573880128 + + ;NodeAttribute::, Model::Character1_LeftFoot + C: "OO",2888740184512,2888573875488 + + ;Model::Character1_LeftToeBase, Model::Character1_LeftFoot + C: "OO",2888573873168,2888573875488 + + ;NodeAttribute::, Model::Character1_LeftToeBase + C: "OO",2888740181824,2888573873168 + + ;NodeAttribute::, Model::Character1_RightUpLeg + C: "OO",2888740182784,2888573870848 + + ;Model::Character1_RightLeg, Model::Character1_RightUpLeg + C: "OO",2888573877808,2888573870848 + + ;NodeAttribute::, Model::Character1_RightLeg + C: "OO",2888740163584,2888573877808 + + ;Model::Character1_RightFoot, Model::Character1_RightLeg + C: "OO",2888573882448,2888573877808 + + ;NodeAttribute::, Model::Character1_RightFoot + C: "OO",2888740183936,2888573882448 + + ;Model::Character1_RightToeBase, Model::Character1_RightFoot + C: "OO",2888573854608,2888573882448 + + ;NodeAttribute::, Model::Character1_RightToeBase + C: "OO",2888740163008,2888573854608 + + ;NodeAttribute::, Model::Character1_Spine + C: "OO",2888740165312,2888573887088 + + ;Model::Character1_Spine1, Model::Character1_Spine + C: "OO",2888573856928,2888573887088 + + ;NodeAttribute::, Model::Character1_Spine1 + C: "OO",2888740161088,2888573856928 + + ;Model::Character1_Spine2, Model::Character1_Spine1 + C: "OO",2888573859248,2888573856928 + + ;NodeAttribute::, Model::Character1_Spine2 + C: "OO",2888740163776,2888573859248 + + ;Model::Character1_LeftShoulder, Model::Character1_Spine2 + C: "OO",2888573891728,2888573859248 + + ;Model::Character1_RightShoulder, Model::Character1_Spine2 + C: "OO",2888573942768,2888573859248 + + ;Model::Character1_Neck, Model::Character1_Spine2 + C: "OO",2888574014688,2888573859248 + + ;NodeAttribute::, Model::Character1_LeftShoulder + C: "OO",2888740165696,2888573891728 + + ;Model::Character1_LeftArm, Model::Character1_LeftShoulder + C: "OO",2888573889408,2888573891728 + + ;NodeAttribute::, Model::Character1_LeftArm + C: "OO",2888740164928,2888573889408 + + ;Model::Character1_LeftForeArm, Model::Character1_LeftArm + C: "OO",2888573861568,2888573889408 + + ;NodeAttribute::, Model::Character1_LeftForeArm + C: "OO",2888740159936,2888573861568 + + ;Model::Character1_LeftHand, Model::Character1_LeftForeArm + C: "OO",2888573894048,2888573861568 + + ;NodeAttribute::, Model::Character1_LeftHand + C: "OO",2888740165888,2888573894048 + + ;Model::Character1_LeftHandThumb1, Model::Character1_LeftHand + C: "OO",2888573863888,2888573894048 + + ;Model::Character1_LeftHandIndex1, Model::Character1_LeftHand + C: "OO",2888573903328,2888573894048 + + ;Model::Character1_LeftHandMiddle1, Model::Character1_LeftHand + C: "OO",2888573910288,2888573894048 + + ;Model::Character1_LeftHandRing1, Model::Character1_LeftHand + C: "OO",2888573928848,2888573894048 + + ;Model::Character1_LeftHandPinky1, Model::Character1_LeftHand + C: "OO",2888573940448,2888573894048 + + ;NodeAttribute::, Model::Character1_LeftHandThumb1 + C: "OO",2888740157824,2888573863888 + + ;Model::Character1_LeftHandThumb2, Model::Character1_LeftHandThumb1 + C: "OO",2888573896368,2888573863888 + + ;NodeAttribute::, Model::Character1_LeftHandThumb2 + C: "OO",2888740158208,2888573896368 + + ;Model::Character1_LeftHandThumb3, Model::Character1_LeftHandThumb2 + C: "OO",2888573901008,2888573896368 + + ;NodeAttribute::, Model::Character1_LeftHandThumb3 + C: "OO",2888740164160,2888573901008 + + ;Model::Character1_LeftHandThumb4, Model::Character1_LeftHandThumb3 + C: "OO",2888573898688,2888573901008 + + ;NodeAttribute::, Model::Character1_LeftHandThumb4 + C: "OO",2888740154176,2888573898688 + + ;NodeAttribute::, Model::Character1_LeftHandIndex1 + C: "OO",2888740157248,2888573903328 + + ;Model::Character1_LeftHandIndex2, Model::Character1_LeftHandIndex1 + C: "OO",2888573907968,2888573903328 + + ;NodeAttribute::, Model::Character1_LeftHandIndex2 + C: "OO",2888740162048,2888573907968 + + ;Model::Character1_LeftHandIndex3, Model::Character1_LeftHandIndex2 + C: "OO",2888573914928,2888573907968 + + ;NodeAttribute::, Model::Character1_LeftHandIndex3 + C: "OO",2888740161472,2888573914928 + + ;Model::Character1_LeftHandIndex4, Model::Character1_LeftHandIndex3 + C: "OO",2888573905648,2888573914928 + + ;NodeAttribute::, Model::Character1_LeftHandIndex4 + C: "OO",2888740154560,2888573905648 + + ;NodeAttribute::, Model::Character1_LeftHandMiddle1 + C: "OO",2888740165504,2888573910288 + + ;Model::Character1_LeftHandMiddle2, Model::Character1_LeftHandMiddle1 + C: "OO",2888573912608,2888573910288 + + ;NodeAttribute::, Model::Character1_LeftHandMiddle2 + C: "OO",2888740153792,2888573912608 + + ;Model::Character1_LeftHandMiddle3, Model::Character1_LeftHandMiddle2 + C: "OO",2888573938128,2888573912608 + + ;NodeAttribute::, Model::Character1_LeftHandMiddle3 + C: "OO",2888740160320,2888573938128 + + ;Model::Character1_LeftHandMiddle4, Model::Character1_LeftHandMiddle3 + C: "OO",2888573947408,2888573938128 + + ;NodeAttribute::, Model::Character1_LeftHandMiddle4 + C: "OO",2888740161664,2888573947408 + + ;NodeAttribute::, Model::Character1_LeftHandRing1 + C: "OO",2888740157440,2888573928848 + + ;Model::Character1_LeftHandRing2, Model::Character1_LeftHandRing1 + C: "OO",2888573931168,2888573928848 + + ;NodeAttribute::, Model::Character1_LeftHandRing2 + C: "OO",2888740155520,2888573931168 + + ;Model::Character1_LeftHandRing3, Model::Character1_LeftHandRing2 + C: "OO",2888573933488,2888573931168 + + ;NodeAttribute::, Model::Character1_LeftHandRing3 + C: "OO",2888740164544,2888573933488 + + ;Model::Character1_LeftHandRing4, Model::Character1_LeftHandRing3 + C: "OO",2888573921888,2888573933488 + + ;NodeAttribute::, Model::Character1_LeftHandRing4 + C: "OO",2888740160128,2888573921888 + + ;NodeAttribute::, Model::Character1_LeftHandPinky1 + C: "OO",2888740153984,2888573940448 + + ;Model::Character1_LeftHandPinky2, Model::Character1_LeftHandPinky1 + C: "OO",2888573917248,2888573940448 + + ;NodeAttribute::, Model::Character1_LeftHandPinky2 + C: "OO",2888740155136,2888573917248 + + ;Model::Character1_LeftHandPinky3, Model::Character1_LeftHandPinky2 + C: "OO",2888573935808,2888573917248 + + ;NodeAttribute::, Model::Character1_LeftHandPinky3 + C: "OO",2888740161280,2888573935808 + + ;Model::Character1_LeftHandPinky4, Model::Character1_LeftHandPinky3 + C: "OO",2888573949728,2888573935808 + + ;NodeAttribute::, Model::Character1_LeftHandPinky4 + C: "OO",2888740160512,2888573949728 + + ;NodeAttribute::, Model::Character1_RightShoulder + C: "OO",2888740163200,2888573942768 + + ;Model::Character1_RightArm, Model::Character1_RightShoulder + C: "OO",2888573945088,2888573942768 + + ;NodeAttribute::, Model::Character1_RightArm + C: "OO",2888740162624,2888573945088 + + ;Model::Character1_RightForeArm, Model::Character1_RightArm + C: "OO",2888573924208,2888573945088 + + ;NodeAttribute::, Model::Character1_RightForeArm + C: "OO",2888740162816,2888573924208 + + ;Model::Character1_RightHand, Model::Character1_RightForeArm + C: "OO",2888573919568,2888573924208 + + ;NodeAttribute::, Model::Character1_RightHand + C: "OO",2888740154752,2888573919568 + + ;Model::Character1_RightHandThumb1, Model::Character1_RightHand + C: "OO",2888573952048,2888573919568 + + ;Model::Character1_RightHandIndex1, Model::Character1_RightHand + C: "OO",2888573982208,2888573919568 + + ;Model::Character1_RightHandMiddle1, Model::Character1_RightHand + C: "OO",2888573984528,2888573919568 + + ;Model::Character1_RightHandRing1, Model::Character1_RightHand + C: "OO",2888573989168,2888573919568 + + ;Model::Character1_RightHandPinky1, Model::Character1_RightHand + C: "OO",2888573972928,2888573919568 + + ;NodeAttribute::, Model::Character1_RightHandThumb1 + C: "OO",2888740159552,2888573952048 + + ;Model::Character1_RightHandThumb2, Model::Character1_RightHandThumb1 + C: "OO",2888573954368,2888573952048 + + ;NodeAttribute::, Model::Character1_RightHandThumb2 + C: "OO",2888740163392,2888573954368 + + ;Model::Character1_RightHandThumb3, Model::Character1_RightHandThumb2 + C: "OO",2888573956688,2888573954368 + + ;NodeAttribute::, Model::Character1_RightHandThumb3 + C: "OO",2888740159360,2888573956688 + + ;Model::Character1_RightHandThumb4, Model::Character1_RightHandThumb3 + C: "OO",2888573926528,2888573956688 + + ;NodeAttribute::, Model::Character1_RightHandThumb4 + C: "OO",2888740156096,2888573926528 + + ;NodeAttribute::, Model::Character1_RightHandIndex1 + C: "OO",2888740154944,2888573982208 + + ;Model::Character1_RightHandIndex2, Model::Character1_RightHandIndex1 + C: "OO",2888573975248,2888573982208 + + ;NodeAttribute::, Model::Character1_RightHandIndex2 + C: "OO",2888740155328,2888573975248 + + ;Model::Character1_RightHandIndex3, Model::Character1_RightHandIndex2 + C: "OO",2888573977568,2888573975248 + + ;NodeAttribute::, Model::Character1_RightHandIndex3 + C: "OO",2888740164736,2888573977568 + + ;Model::Character1_RightHandIndex4, Model::Character1_RightHandIndex3 + C: "OO",2888573965968,2888573977568 + + ;NodeAttribute::, Model::Character1_RightHandIndex4 + C: "OO",2888740155904,2888573965968 + + ;NodeAttribute::, Model::Character1_RightHandMiddle1 + C: "OO",2888740163968,2888573984528 + + ;Model::Character1_RightHandMiddle2, Model::Character1_RightHandMiddle1 + C: "OO",2888573959008,2888573984528 + + ;NodeAttribute::, Model::Character1_RightHandMiddle2 + C: "OO",2888740155712,2888573959008 + + ;Model::Character1_RightHandMiddle3, Model::Character1_RightHandMiddle2 + C: "OO",2888573963648,2888573959008 + + ;NodeAttribute::, Model::Character1_RightHandMiddle3 + C: "OO",2888740160704,2888573963648 + + ;Model::Character1_RightHandMiddle4, Model::Character1_RightHandMiddle3 + C: "OO",2888573986848,2888573963648 + + ;NodeAttribute::, Model::Character1_RightHandMiddle4 + C: "OO",2888740160896,2888573986848 + + ;NodeAttribute::, Model::Character1_RightHandRing1 + C: "OO",2888740159168,2888573989168 + + ;Model::Character1_RightHandRing2, Model::Character1_RightHandRing1 + C: "OO",2888573979888,2888573989168 + + ;NodeAttribute::, Model::Character1_RightHandRing2 + C: "OO",2888740158976,2888573979888 + + ;Model::Character1_RightHandRing3, Model::Character1_RightHandRing2 + C: "OO",2888573991488,2888573979888 + + ;NodeAttribute::, Model::Character1_RightHandRing3 + C: "OO",2888740159744,2888573991488 + + ;Model::Character1_RightHandRing4, Model::Character1_RightHandRing3 + C: "OO",2888573970608,2888573991488 + + ;NodeAttribute::, Model::Character1_RightHandRing4 + C: "OO",2888740161856,2888573970608 + + ;NodeAttribute::, Model::Character1_RightHandPinky1 + C: "OO",2888740165120,2888573972928 + + ;Model::Character1_RightHandPinky2, Model::Character1_RightHandPinky1 + C: "OO",2888573968288,2888573972928 + + ;NodeAttribute::, Model::Character1_RightHandPinky2 + C: "OO",2888740156288,2888573968288 + + ;Model::Character1_RightHandPinky3, Model::Character1_RightHandPinky2 + C: "OO",2888573961328,2888573968288 + + ;NodeAttribute::, Model::Character1_RightHandPinky3 + C: "OO",2888740156480,2888573961328 + + ;Model::Character1_RightHandPinky4, Model::Character1_RightHandPinky3 + C: "OO",2888573993808,2888573961328 + + ;NodeAttribute::, Model::Character1_RightHandPinky4 + C: "OO",2888740156672,2888573993808 + + ;NodeAttribute::, Model::Character1_Neck + C: "OO",2888740162240,2888574014688 + + ;Model::Character1_Head, Model::Character1_Neck + C: "OO",2888574023968,2888574014688 + + ;NodeAttribute::, Model::Character1_Head + C: "OO",2888740156864,2888574023968 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_character_7500_binary.fbx b/modules/ufbx/data/maya_character_7500_binary.fbx new file mode 100644 index 0000000..9d0eea9 Binary files /dev/null and b/modules/ufbx/data/maya_character_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_color_sets_6100_ascii.fbx b/modules/ufbx/data/maya_color_sets_6100_ascii.fbx new file mode 100644 index 0000000..d8bc68e --- /dev/null +++ b/modules/ufbx/data/maya_color_sets_6100_ascii.fbx @@ -0,0 +1,437 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 14 + Minute: 36 + Second: 29 + Millisecond: 422 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementColor: 0 { + Version: 101 + Name: "RGBCube" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 0,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,1,0,0,0,1,0,0,0,1,1,0,0 + ,1,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,1,0,0,0,1,0,0,1,1,0,1,1,1,0,1,0,1 + ColorIndex: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + LayerElementColor: 1 { + Version: 101 + Name: "White" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + ColorIndex: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + LayerElementColor: 2 { + Version: 101 + Name: "Black" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0 + ,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1 + ColorIndex: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + LayerElementColor: 3 { + Version: 101 + Name: "Alpha" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 1,1,1,0.400000005960464,1,1,1,0.5,1,1,1,0.699999988079071,1,1,1,0.600000023841858,1,1,1,0.600000023841858,1,1 + ,1,0.699999988079071,1,1,1,0.300000011920929,1,1,1,0.200000002980232,1,1,1,0.200000002980232,1,1,1,0.300000011920929 + ,1,1,1,0.100000001490116,1,1,1,0,1,1,1,0,1,1,1,0.100000001490116,1,1,1,0.5,1,1,1,0.400000005960464,1,1,1,0.5 + ,1,1,1,0.100000001490116,1,1,1,0.300000011920929,1,1,1,0.699999988079071,1,1,1,0,1,1,1,0.400000005960464,1,1 + ,1,0.600000023841858,1,1,1,0.200000002980232 + ColorIndex: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 2 + } + } + Layer: 3 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 3 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_color_sets_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_color_sets_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "31/03/2020 11:36:29.421" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_color_sets_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "31/03/2020 11:36:29.421" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\color_sets.mb" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_color_sets_6100_binary.fbx b/modules/ufbx/data/maya_color_sets_6100_binary.fbx new file mode 100644 index 0000000..962705f Binary files /dev/null and b/modules/ufbx/data/maya_color_sets_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_color_sets_7500_ascii.fbx b/modules/ufbx/data/maya_color_sets_7500_ascii.fbx new file mode 100644 index 0000000..21a48b5 --- /dev/null +++ b/modules/ufbx/data/maya_color_sets_7500_ascii.fbx @@ -0,0 +1,498 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 14 + Minute: 37 + Second: 31 + Millisecond: 840 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_color_sets_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_color_sets_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 11:37:31.839" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_color_sets_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 11:37:31.839" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\color_sets.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1736561724144, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1736564455536, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementColor: 0 { + Version: 101 + Name: "RGBCube" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: *96 { + a: 0,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,1,0,0,0,1,0,0,0,1,1,0,0,1,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,1,0,0,0,1,0,0,1,1,0,1,1,1,0,1,0,1 + } + ColorIndex: *24 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + } + LayerElementColor: 1 { + Version: 101 + Name: "White" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: *96 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ColorIndex: *24 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + } + LayerElementColor: 2 { + Version: 101 + Name: "Black" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: *96 { + a: 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1 + } + ColorIndex: *24 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + } + LayerElementColor: 3 { + Version: 101 + Name: "Alpha" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: *96 { + a: 1,1,1,0.400000005960464,1,1,1,0.5,1,1,1,0.699999988079071,1,1,1,0.600000023841858,1,1,1,0.600000023841858,1,1,1,0.699999988079071,1,1,1,0.300000011920929,1,1,1,0.200000002980232,1,1,1,0.200000002980232,1,1,1,0.300000011920929,1,1,1,0.100000001490116,1,1,1,0,1,1,1,0,1,1,1,0.100000001490116,1,1,1,0.5,1,1,1,0.400000005960464,1,1,1,0.5,1,1,1,0.100000001490116,1,1,1,0.300000011920929,1,1,1,0.699999988079071,1,1,1,0,1,1,1,0.400000005960464,1,1,1,0.600000023841858,1,1,1,0.200000002980232 + } + ColorIndex: *24 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 2 + } + } + Layer: 3 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 3 + } + } + } + Model: 1737135377728, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1736555903712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1737131601744, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1735996382512, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1737135377728,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1735996382512,1737131601744 + + ;Geometry::, Model::pCube1 + C: "OO",1736564455536,1737135377728 + + ;Material::lambert1, Model::pCube1 + C: "OO",1736555903712,1737135377728 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_color_sets_7500_binary.fbx b/modules/ufbx/data/maya_color_sets_7500_binary.fbx new file mode 100644 index 0000000..dd2c411 Binary files /dev/null and b/modules/ufbx/data/maya_color_sets_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_cone_6100_ascii.fbx b/modules/ufbx/data/maya_cone_6100_ascii.fbx new file mode 100644 index 0000000..c059eaa --- /dev/null +++ b/modules/ufbx/data/maya_cone_6100_ascii.fbx @@ -0,0 +1,493 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 1 + Hour: 15 + Minute: 25 + Second: 19 + Millisecond: 820 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCone1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: 0.923879742622375,-1,-0.382682889699936,0.707107126712799,-1,-0.707106351852417,0.382683902978897,-1,-0.923879265785217 + ,5.0663948059082e-07,-1,-0.999999940395355,-0.382682979106903,-1,-0.923879683017731,-0.707106471061707,-1,-0.707107067108154 + ,-0.923879384994507,-1,-0.382683783769608,-1,-1,-3.57627868652344e-07,-0.923879623413086,-1,0.382683128118515,-0.707106947898865 + ,-1,0.707106590270996,-0.382683604955673,-1,0.923879444599152,-1.49011611938477e-07,-1,1,0.382683306932449,-1,0.923879563808441 + ,0.707106709480286,-1,0.707106828689575,0.923879504203796,-1,0.382683455944061,1,-1,0,0,1,0 + PolygonVertexIndex: 0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,-2,0,1,-17,1,2,-17,2,3,-17,3,4,-17,4,5,-17,5,6,-17,6,7,-17,7,8,-17,8,9,-17,9,10 + ,-17,10,11,-17,11,12,-17,12,13,-17,13,14,-17,14,15,-17,15,0,-17 + Edges: 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,18,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1 + ,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08 + ,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1 + ,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0.826343059539795,0.447213590145111 + ,-0.342282295227051,0.632455885410309,0.447213619947433,-0.632455229759216,2.22867598154153e-07,1,-5.15381316290586e-07 + ,0.632455885410309,0.447213619947433,-0.632455229759216,0.342282891273499,0.447213560342789,-0.826342761516571 + ,2.22867598154153e-07,1,-5.15381316290586e-07,0.342282891273499,0.447213560342789,-0.826342761516571,4.93032132453664e-07 + ,0.447213590145111,-0.894427180290222,2.22867598154153e-07,1,-5.15381316290586e-07,4.93032132453664e-07,0.447213590145111 + ,-0.894427180290222,-0.342282027006149,0.447213560342789,-0.826343178749084,2.22867598154153e-07,1,-5.15381316290586e-07 + ,-0.342282027006149,0.447213560342789,-0.826343178749084,-0.632455229759216,0.447213560342789,-0.632455825805664 + ,2.22867598154153e-07,1,-5.15381316290586e-07,-0.632455229759216,0.447213560342789,-0.632455825805664,-0.826342880725861 + ,0.447213619947433,-0.342282772064209,2.22867598154153e-07,1,-5.15381316290586e-07,-0.826342880725861,0.447213619947433 + ,-0.342282772064209,-0.894427180290222,0.447213590145111,-2.87602091475492e-07,2.22867598154153e-07,1,-5.15381316290586e-07 + ,-0.894427180290222,0.447213590145111,-2.87602091475492e-07,-0.826343059539795,0.447213590145111,0.342282235622406 + ,2.22867598154153e-07,1,-5.15381316290586e-07,-0.826343059539795,0.447213590145111,0.342282235622406,-0.632455706596375 + ,0.447213590145111,0.632455348968506,2.22867598154153e-07,1,-5.15381316290586e-07,-0.632455706596375,0.447213590145111 + ,0.632455348968506,-0.342282623052597,0.447213590145111,0.826342880725861,2.22867598154153e-07,1,-5.15381316290586e-07 + ,-0.342282623052597,0.447213590145111,0.826342880725861,-1.408663337088e-07,0.447213560342789,0.894427120685577 + ,2.22867598154153e-07,1,-5.15381316290586e-07,-1.408663337088e-07,0.447213560342789,0.894427120685577,0.34228241443634 + ,0.447213590145111,0.82634299993515,2.22867598154153e-07,1,-5.15381316290586e-07,0.34228241443634,0.447213590145111 + ,0.82634299993515,0.632455408573151,0.447213590145111,0.63245564699173,2.22867598154153e-07,1,-5.15381316290586e-07 + ,0.632455408573151,0.447213590145111,0.63245564699173,0.82634299993515,0.447213619947433,0.34228253364563,2.22867598154153e-07 + ,1,-5.15381316290586e-07,0.82634299993515,0.447213619947433,0.34228253364563,0.894427180290222,0.447213590145111 + ,2.58255113294581e-07,2.22867598154153e-07,1,-5.15381316290586e-07,0.894427180290222,0.447213590145111,2.58255113294581e-07 + ,0.826343059539795,0.447213590145111,-0.342282295227051,2.22867598154153e-07,1,-5.15381316290586e-07 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -3.61713318852708e-07,2.92039619154139e-08,1,-3.07873335714248e-07,2.92039619154139e-08,1,1.04652144727879e-08 + ,2.92039619154139e-08,1,4.5619458433066e-08,2.92039619154139e-08,1,-6.99262159287173e-09,2.92039619154139e-08 + ,1,1.5681897025388e-07,2.92039619154139e-08,1,1.68816640666591e-08,2.92039619154139e-08,1,-8.26012325205738e-08 + ,2.92039619154139e-08,1,-1.26326007432453e-08,2.92039619154139e-08,1,-2.67595545722088e-09,2.92039619154139e-08 + ,1,-1.75771202037822e-08,2.92039619154139e-08,1,-2.32302699076708e-14,2.92039619154139e-08,1,0,2.92039619154139e-08 + ,1,0,2.92039619154139e-08,1,0,2.92039619154139e-08,1,-2.7244588807207e-08,2.92039619154139e-08,1,-0.377638250589371 + ,0.890909194946289,0.252329558134079,-0.316227942705154,0.894427180290222,0.316227614879608,-0.997003793716431 + ,1.82333181442118e-07,-0.0773537382483482,-0.316227942705154,0.894427180290222,0.316227614879608,-0.17114146053791 + ,0.894427180290222,0.413171380758286,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,-0.17114146053791 + ,0.894427180290222,0.413171380758286,-2.45869159698486e-07,0.894427239894867,0.447213619947433,-0.997003793716431 + ,1.82333181442118e-07,-0.0773537382483482,-2.45869159698486e-07,0.894427239894867,0.447213619947433,0.171140983700752 + ,0.894427239894867,0.41317155957222,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,0.171140983700752 + ,0.894427239894867,0.41317155957222,0.316227644681931,0.894427299499512,0.316227912902832,-0.997003793716431 + ,1.82333181442118e-07,-0.0773537382483482,0.316227644681931,0.894427299499512,0.316227912902832,0.413171499967575 + ,0.894427299499512,0.171141415834427,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,0.413171499967575 + ,0.894427299499512,0.171141415834427,0.447213619947433,0.894427239894867,1.40496666745094e-07,-0.997003793716431 + ,1.82333181442118e-07,-0.0773537382483482,0.447213619947433,0.894427239894867,1.40496666745094e-07,0.413171589374542 + ,0.894427299499512,-0.171141117811203,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,0.413171589374542 + ,0.894427299499512,-0.171141117811203,0.316227853298187,0.894427239894867,-0.316227704286575,-0.997003793716431 + ,1.82333181442118e-07,-0.0773537382483482,0.316227853298187,0.894427239894867,-0.316227704286575,0.17114132642746 + ,0.894427180290222,-0.413171470165253,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,0.17114132642746 + ,0.894427180290222,-0.413171470165253,6.60668888485816e-08,0.894427299499512,-0.447213649749756,-0.997003793716431 + ,1.82333181442118e-07,-0.0773537382483482,6.60668888485816e-08,0.894427299499512,-0.447213649749756,-0.17114120721817 + ,0.894427299499512,-0.413171529769897,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,-0.17114120721817 + ,0.894427299499512,-0.413171529769897,-0.31622776389122,0.894427239894867,-0.316227793693542,-0.997003793716431 + ,1.82333181442118e-07,-0.0773537382483482,-0.31622776389122,0.894427239894867,-0.316227793693542,-0.413171499967575 + ,0.894427239894867,-0.171141251921654,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,-0.413171499967575 + ,0.894427239894867,-0.171141251921654,-0.447213619947433,0.894427239894867,-7.02483262671194e-08,-0.997003793716431 + ,1.82333181442118e-07,-0.0773537382483482,-0.447213619947433,0.894427239894867,-7.02483262671194e-08,-0.445454597473145 + ,0.890909194946289,0.0886063128709793,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,1.05634622346563e-14,3.61713318852708e-07,1,8.99112175093168e-15,3.07873335714248e-07,1,-3.05625580995349e-16 + ,-1.04652144727879e-08,1,-1.33226868834137e-15,-4.5619458433066e-08,1,2.0421244380296e-16,6.99262159287173e-09 + ,1,-4.57973519811571e-15,-1.5681897025388e-07,1,-4.93011397663748e-16,-1.68816640666591e-08,1,2.41228334169389e-15 + ,8.26012325205738e-08,1,3.68921997333279e-16,1.26326007432453e-08,1,7.81485567328822e-17,2.67595545722088e-09 + ,1,5.1332160661257e-16,1.75771202037822e-08,1,6.78415935625452e-22,2.32302699076708e-14,1,0,-0,1,0,-0,1,0,-0 + ,1,7.95650075789282e-16,2.7244588807207e-08,-0.41778764128685,0.0792519003152847,-0.905081570148468,-0.707106471061707 + ,1.12200027047038e-08,-0.707107186317444,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,-0.707106471061707 + ,1.12200027047038e-08,-0.707107186317444,-0.923879384994507,0,-0.382683962583542,0.0773537307977676,-2.4590090674792e-07 + ,-0.997003674507141,-0.923879384994507,0,-0.382683962583542,-0.999999940395355,0,-5.49780111214204e-07,0.0773537307977676 + ,-2.4590090674792e-07,-0.997003674507141,-0.999999940395355,0,-5.49780111214204e-07,-0.923879742622375,7.48000150707639e-09 + ,0.382682919502258,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,-0.923879742622375,7.48000150707639e-09 + ,0.382682919502258,-0.707107126712799,3.7400007535382e-09,0.707106471061707,0.0773537307977676,-2.4590090674792e-07 + ,-0.997003674507141,-0.707107126712799,3.7400007535382e-09,0.707106471061707,-0.382683753967285,-1.87000033236018e-08 + ,0.923879384994507,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,-0.382683753967285,-1.87000033236018e-08 + ,0.923879384994507,-3.21640072797891e-07,3.7400007535382e-09,0.999999940395355,0.0773537307977676,-2.4590090674792e-07 + ,-0.997003674507141,-3.21640072797891e-07,3.7400007535382e-09,0.999999940395355,0.382683157920837,-3.7400007535382e-09 + ,0.923879623413086,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,0.382683157920837,-3.7400007535382e-09 + ,0.923879623413086,0.707106649875641,3.74000119762741e-09,0.70710700750351,0.0773537307977676,-2.4590090674792e-07 + ,-0.997003674507141,0.707106649875641,3.74000119762741e-09,0.70710700750351,0.923879384994507,-7.48000150707639e-09 + ,0.382683604955673,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,0.923879384994507,-7.48000150707639e-09 + ,0.382683604955673,0.999999940395355,3.7400007535382e-09,1.5521003149388e-07,0.0773537307977676,-2.4590090674792e-07 + ,-0.997003674507141,0.999999940395355,3.7400007535382e-09,1.5521003149388e-07,0.923879504203796,-1.49600030141528e-08 + ,-0.382683366537094,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,0.923879504203796,-1.49600030141528e-08 + ,-0.382683366537094,0.707106947898865,4.48800108188152e-08,-0.707106709480286,0.0773537307977676,-2.4590090674792e-07 + ,-0.997003674507141,0.707106947898865,4.48800108188152e-08,-0.707106709480286,0.382683455944061,0,-0.923879504203796 + ,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,0.382683455944061,0,-0.923879504203796,2.61800039424998e-07 + ,5.23600114377132e-08,-0.999999940395355,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,2.61800039424998e-07 + ,5.23600114377132e-08,-0.999999940395355,-0.344568371772766,-0.0792520120739937,-0.935409963130951,0.0773537307977676 + ,-2.4590090674792e-07,-0.997003674507141 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.730969905853271,0.154329270124435,0.676776766777039,0.0732234120368958,0.595670998096466,0.0190301835536957 + ,0.50000011920929,1.49011611938477e-08,0.404329240322113,0.0190300792455673,0.323223382234573,0.0732232332229614 + ,0.269030153751373,0.154329061508179,0.25,0.249999910593033,0.269030094146729,0.345670789480209,0.323223263025284 + ,0.426776647567749,0.404329091310501,0.480969846248627,0.499999970197678,0.5,0.595670819282532,0.480969905853271 + ,0.676776647567749,0.426776707172394,0.730969905853271,0.345670878887177,0.75,0.25,0.25,0.5,0.28125,0.5,0.3125 + ,0.5,0.34375,0.5,0.375,0.5,0.40625,0.5,0.4375,0.5,0.46875,0.5,0.5,0.5,0.53125,0.5,0.5625,0.5,0.59375,0.5,0.625 + ,0.5,0.65625,0.5,0.6875,0.5,0.71875,0.5,0.75,0.5,0.5,1 + UVIndex: 0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,16,17,33,17,18,33,18,19,33,19,20,33,20,21,33,21,22,33,22,23,33,23,24,33 + ,24,25,33,25,26,33,26,27,33,27,28,33,28,29,33,29,30,33,30,31,33,31,32,33 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + LayerElementEdgeCrease: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: 0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048 + ,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048 + ,0.583000421524048,0.583000421524048,0.583000421524048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementVertexCrease: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + VertexCrease: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.998009490966797 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementVertexCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCone1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_cone_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_cone_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "01/04/2020 12:25:19.818" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_cone_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "01/04/2020 12:25:19.818" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCone1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCone1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_cone_6100_binary.fbx b/modules/ufbx/data/maya_cone_6100_binary.fbx new file mode 100644 index 0000000..181f15d Binary files /dev/null and b/modules/ufbx/data/maya_cone_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_cone_7500_ascii.fbx b/modules/ufbx/data/maya_cone_7500_ascii.fbx new file mode 100644 index 0000000..12daaae --- /dev/null +++ b/modules/ufbx/data/maya_cone_7500_ascii.fbx @@ -0,0 +1,461 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 1 + Hour: 14 + Minute: 38 + Second: 42 + Millisecond: 25 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cone_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cone_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "01/04/2020 11:38:42.024" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cone_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "01/04/2020 11:38:42.024" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2694166538112, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2693889147424, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *51 { + a: 0.923879742622375,-1,-0.382682889699936,0.707107126712799,-1,-0.707106351852417,0.382683902978897,-1,-0.923879265785217,5.0663948059082e-07,-1,-0.999999940395355,-0.382682979106903,-1,-0.923879683017731,-0.707106471061707,-1,-0.707107067108154,-0.923879384994507,-1,-0.382683783769608,-1,-1,-3.57627868652344e-07,-0.923879623413086,-1,0.382683128118515,-0.707106947898865,-1,0.707106590270996,-0.382683604955673,-1,0.923879444599152,-1.49011611938477e-07,-1,1,0.382683306932449,-1,0.923879563808441,0.707106709480286,-1,0.707106828689575,0.923879504203796,-1,0.382683455944061,1,-1,0,0,1,0 + } + PolygonVertexIndex: *64 { + a: 0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,-2,0,1,-17,1,2,-17,2,3,-17,3,4,-17,4,5,-17,5,6,-17,6,7,-17,7,8,-17,8,9,-17,9,10,-17,10,11,-17,11,12,-17,12,13,-17,13,14,-17,14,15,-17,15,0,-17 + } + Edges: *32 { + a: 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,18,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *192 { + a: 0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0,-1,2.92039619154139e-08,0.826343059539795,0.447213590145111,-0.342282295227051,0.632455885410309,0.447213619947433,-0.632455229759216,2.22867598154153e-07,1,-5.15381316290586e-07,0.632455885410309,0.447213619947433,-0.632455229759216,0.342282891273499,0.447213560342789,-0.826342761516571,2.22867598154153e-07,1,-5.15381316290586e-07,0.342282891273499,0.447213560342789,-0.826342761516571,4.93032132453664e-07,0.447213590145111,-0.894427180290222,2.22867598154153e-07,1,-5.15381316290586e-07,4.93032132453664e-07,0.447213590145111,-0.894427180290222,-0.342282027006149,0.447213560342789,-0.826343178749084,2.22867598154153e-07,1,-5.15381316290586e-07,-0.342282027006149,0.447213560342789,-0.826343178749084,-0.632455229759216,0.447213560342789,-0.632455825805664,2.22867598154153e-07,1,-5.15381316290586e-07,-0.632455229759216,0.447213560342789,-0.632455825805664,-0.826342880725861,0.447213619947433,-0.342282772064209,2.22867598154153e-07,1,-5.15381316290586e-07,-0.826342880725861,0.447213619947433,-0.342282772064209,-0.894427180290222,0.447213590145111,-2.87602091475492e-07,2.22867598154153e-07,1,-5.15381316290586e-07,-0.894427180290222,0.447213590145111,-2.87602091475492e-07,-0.826343059539795,0.447213590145111,0.342282235622406,2.22867598154153e-07,1,-5.15381316290586e-07,-0.826343059539795,0.447213590145111,0.342282235622406,-0.632455706596375,0.447213590145111,0.632455348968506,2.22867598154153e-07,1,-5.15381316290586e-07,-0.632455706596375,0.447213590145111,0.632455348968506,-0.342282623052597,0.447213590145111,0.826342880725861,2.22867598154153e-07,1,-5.15381316290586e-07,-0.342282623052597,0.447213590145111,0.826342880725861, +-1.408663337088e-07,0.447213560342789,0.894427120685577,2.22867598154153e-07,1,-5.15381316290586e-07,-1.408663337088e-07,0.447213560342789,0.894427120685577,0.34228241443634,0.447213590145111,0.82634299993515,2.22867598154153e-07,1,-5.15381316290586e-07,0.34228241443634,0.447213590145111,0.82634299993515,0.632455408573151,0.447213590145111,0.63245564699173,2.22867598154153e-07,1,-5.15381316290586e-07,0.632455408573151,0.447213590145111,0.63245564699173,0.82634299993515,0.447213619947433,0.34228253364563,2.22867598154153e-07,1,-5.15381316290586e-07,0.82634299993515,0.447213619947433,0.34228253364563,0.894427180290222,0.447213590145111,2.58255113294581e-07,2.22867598154153e-07,1,-5.15381316290586e-07,0.894427180290222,0.447213590145111,2.58255113294581e-07,0.826343059539795,0.447213590145111,-0.342282295227051,2.22867598154153e-07,1,-5.15381316290586e-07 + } + NormalsW: *64 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *192 { + a: -3.61713318852708e-07,2.92039619154139e-08,1,-3.07873335714248e-07,2.92039619154139e-08,1,1.04652144727879e-08,2.92039619154139e-08,1,4.5619458433066e-08,2.92039619154139e-08,1,-6.99262159287173e-09,2.92039619154139e-08,1,1.5681897025388e-07,2.92039619154139e-08,1,1.68816640666591e-08,2.92039619154139e-08,1,-8.26012325205738e-08,2.92039619154139e-08,1,-1.26326007432453e-08,2.92039619154139e-08,1,-2.67595545722088e-09,2.92039619154139e-08,1,-1.75771202037822e-08,2.92039619154139e-08,1,-2.32302699076708e-14,2.92039619154139e-08,1,0,2.92039619154139e-08,1,0,2.92039619154139e-08,1,0,2.92039619154139e-08,1,-2.7244588807207e-08,2.92039619154139e-08,1,-0.377638250589371,0.890909194946289,0.252329558134079,-0.316227942705154,0.894427180290222,0.316227614879608,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,-0.316227942705154,0.894427180290222,0.316227614879608,-0.17114146053791,0.894427180290222,0.413171380758286,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,-0.17114146053791,0.894427180290222,0.413171380758286,-2.45869159698486e-07,0.894427239894867,0.447213619947433,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,-2.45869159698486e-07,0.894427239894867,0.447213619947433,0.171140983700752,0.894427239894867,0.41317155957222,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,0.171140983700752,0.894427239894867,0.41317155957222,0.316227644681931,0.894427299499512,0.316227912902832,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,0.316227644681931,0.894427299499512,0.316227912902832,0.413171499967575,0.894427299499512,0.171141415834427,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,0.413171499967575,0.894427299499512,0.171141415834427,0.447213619947433,0.894427239894867,1.40496666745094e-07,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,0.447213619947433,0.894427239894867,1.40496666745094e-07,0.413171589374542,0.894427299499512,-0.171141117811203,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,0.413171589374542,0.894427299499512,-0.171141117811203, +0.316227853298187,0.894427239894867,-0.316227704286575,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,0.316227853298187,0.894427239894867,-0.316227704286575,0.17114132642746,0.894427180290222,-0.413171470165253,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,0.17114132642746,0.894427180290222,-0.413171470165253,6.60668888485816e-08,0.894427299499512,-0.447213649749756,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,6.60668888485816e-08,0.894427299499512,-0.447213649749756,-0.17114120721817,0.894427299499512,-0.413171529769897,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,-0.17114120721817,0.894427299499512,-0.413171529769897,-0.31622776389122,0.894427239894867,-0.316227793693542,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,-0.31622776389122,0.894427239894867,-0.316227793693542,-0.413171499967575,0.894427239894867,-0.171141251921654,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,-0.413171499967575,0.894427239894867,-0.171141251921654,-0.447213619947433,0.894427239894867,-7.02483262671194e-08,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482,-0.447213619947433,0.894427239894867,-7.02483262671194e-08,-0.445454597473145,0.890909194946289,0.0886063128709793,-0.997003793716431,1.82333181442118e-07,-0.0773537382483482 + } + BinormalsW: *64 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *192 { + a: 1,1.05634622346563e-14,3.61713318852708e-07,1,8.99112175093168e-15,3.07873335714248e-07,1,-3.05625580995349e-16,-1.04652144727879e-08,1,-1.33226868834137e-15,-4.5619458433066e-08,1,2.0421244380296e-16,6.99262159287173e-09,1,-4.57973519811571e-15,-1.5681897025388e-07,1,-4.93011397663748e-16,-1.68816640666591e-08,1,2.41228334169389e-15,8.26012325205738e-08,1,3.68921997333279e-16,1.26326007432453e-08,1,7.81485567328822e-17,2.67595545722088e-09,1,5.1332160661257e-16,1.75771202037822e-08,1,6.78415935625452e-22,2.32302699076708e-14,1,0,-0,1,0,-0,1,0,-0,1,7.95650075789282e-16,2.7244588807207e-08,-0.41778764128685,0.0792519003152847,-0.905081570148468,-0.707106471061707,1.12200027047038e-08,-0.707107186317444,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,-0.707106471061707,1.12200027047038e-08,-0.707107186317444,-0.923879384994507,0,-0.382683962583542,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,-0.923879384994507,0,-0.382683962583542,-0.999999940395355,0,-5.49780111214204e-07,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,-0.999999940395355,0,-5.49780111214204e-07,-0.923879742622375,7.48000150707639e-09,0.382682919502258,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,-0.923879742622375,7.48000150707639e-09,0.382682919502258,-0.707107126712799,3.7400007535382e-09,0.707106471061707,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,-0.707107126712799,3.7400007535382e-09,0.707106471061707,-0.382683753967285,-1.87000033236018e-08,0.923879384994507,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,-0.382683753967285,-1.87000033236018e-08,0.923879384994507,-3.21640072797891e-07,3.7400007535382e-09,0.999999940395355,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,-3.21640072797891e-07,3.7400007535382e-09,0.999999940395355,0.382683157920837,-3.7400007535382e-09,0.923879623413086,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,0.382683157920837,-3.7400007535382e-09,0.923879623413086,0.707106649875641,3.74000119762741e-09,0.70710700750351, +0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,0.707106649875641,3.74000119762741e-09,0.70710700750351,0.923879384994507,-7.48000150707639e-09,0.382683604955673,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,0.923879384994507,-7.48000150707639e-09,0.382683604955673,0.999999940395355,3.7400007535382e-09,1.5521003149388e-07,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,0.999999940395355,3.7400007535382e-09,1.5521003149388e-07,0.923879504203796,-1.49600030141528e-08,-0.382683366537094,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,0.923879504203796,-1.49600030141528e-08,-0.382683366537094,0.707106947898865,4.48800108188152e-08,-0.707106709480286,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,0.707106947898865,4.48800108188152e-08,-0.707106709480286,0.382683455944061,0,-0.923879504203796,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,0.382683455944061,0,-0.923879504203796,2.61800039424998e-07,5.23600114377132e-08,-0.999999940395355,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141,2.61800039424998e-07,5.23600114377132e-08,-0.999999940395355,-0.344568371772766,-0.0792520120739937,-0.935409963130951,0.0773537307977676,-2.4590090674792e-07,-0.997003674507141 + } + TangentsW: *64 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *68 { + a: 0.730969905853271,0.154329270124435,0.676776766777039,0.0732234120368958,0.595670998096466,0.0190301835536957,0.50000011920929,1.49011611938477e-08,0.404329240322113,0.0190300792455673,0.323223382234573,0.0732232332229614,0.269030153751373,0.154329061508179,0.25,0.249999910593033,0.269030094146729,0.345670789480209,0.323223263025284,0.426776647567749,0.404329091310501,0.480969846248627,0.499999970197678,0.5,0.595670819282532,0.480969905853271,0.676776647567749,0.426776707172394,0.730969905853271,0.345670878887177,0.75,0.25,0.25,0.5,0.28125,0.5,0.3125,0.5,0.34375,0.5,0.375,0.5,0.40625,0.5,0.4375,0.5,0.46875,0.5,0.5,0.5,0.53125,0.5,0.5625,0.5,0.59375,0.5,0.625,0.5,0.65625,0.5,0.6875,0.5,0.71875,0.5,0.75,0.5,0.5,1 + } + UVIndex: *64 { + a: 0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,16,17,33,17,18,33,18,19,33,19,20,33,20,21,33,21,22,33,22,23,33,23,24,33,24,25,33,25,26,33,26,27,33,27,28,33,28,29,33,29,30,33,30,31,33,31,32,33 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *32 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *32 { + a: 0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0.583000421524048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementVertexCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + VertexCrease: *17 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.998009490966797 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementVertexCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2693169627232, "Model::pCone1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2694068338704, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2694075767392, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2694011348384, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCone1, Model::RootNode + C: "OO",2693169627232,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2694011348384,2694075767392 + + ;Geometry::, Model::pCone1 + C: "OO",2693889147424,2693169627232 + + ;Material::lambert1, Model::pCone1 + C: "OO",2694068338704,2693169627232 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_cone_7500_binary.fbx b/modules/ufbx/data/maya_cone_7500_binary.fbx new file mode 100644 index 0000000..d967395 Binary files /dev/null and b/modules/ufbx/data/maya_cone_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_constraint_multi_7500_ascii.fbx b/modules/ufbx/data/maya_constraint_multi_7500_ascii.fbx new file mode 100644 index 0000000..94fb674 --- /dev/null +++ b/modules/ufbx/data/maya_constraint_multi_7500_ascii.fbx @@ -0,0 +1,354 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 11 + Hour: 13 + Minute: 26 + Second: 4 + Millisecond: 178 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_constraint_multi_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_constraint_multi_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "11/09/2021 10:26:04.173" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_constraint_multi_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "11/09/2021 10:26:04.173" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\constraint_multi.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2238877743744, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 10 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 3 + PropertyTemplate: "FbxNull" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "Look", "enum", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 3 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Constraint" { + Count: 1 + PropertyTemplate: "FbxConstraintPosition" { + Properties70: { + P: "Active", "bool", "", "",1 + P: "Lock", "bool", "", "",0 + P: "Weight", "Weight", "", "A",100 + P: "Constrained Object", "object", "", "" + P: "Source", "object", "", "" + P: "AffectX", "bool", "", "",1 + P: "AffectY", "bool", "", "",1 + P: "AffectZ", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 2238173360848, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 2238173358384, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 2238173360672, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + Model: 2238385220896, "Model::Node", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-0.666666666666667,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2238385244096, "Model::TargetA", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2238385223216, "Model::TargetB", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Constraint: 2238885653408, "Constraint::Node_pointConstraint1", "Position From Positions" { + Type: "Position From Positions" + MultiLayer: 0 + Properties70: { + P: "Constrained Object", "object", "", "" + P: "Translation", "Vector", "", "A",0,0,0 + P: "TargetA.Weight", "Number", "", "A",100 + P: "TargetB.Weight", "Number", "", "A",200 + } + } + AnimationStack: 2239984449936, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2238865695216, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Node, Model::RootNode + C: "OO",2238385220896,0 + + ;Model::TargetA, Model::RootNode + C: "OO",2238385244096,0 + + ;Model::TargetB, Model::RootNode + C: "OO",2238385223216,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2238865695216,2239984449936 + + ;NodeAttribute::, Model::Node + C: "OO",2238173360848,2238385220896 + + ;NodeAttribute::, Model::TargetA + C: "OO",2238173358384,2238385244096 + + ;NodeAttribute::, Model::TargetB + C: "OO",2238173360672,2238385223216 + + ;Model::Node, Constraint::Node_pointConstraint1 + C: "OP",2238385220896,2238885653408, "Constrained Object" + + ;Model::TargetA, Constraint::Node_pointConstraint1 + C: "OP",2238385244096,2238885653408, "Source" + + ;Model::TargetB, Constraint::Node_pointConstraint1 + C: "OP",2238385223216,2238885653408, "Source" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_constraint_zoo_6100_ascii.fbx b/modules/ufbx/data/maya_constraint_zoo_6100_ascii.fbx new file mode 100644 index 0000000..8eb17c3 --- /dev/null +++ b/modules/ufbx/data/maya_constraint_zoo_6100_ascii.fbx @@ -0,0 +1,1945 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 12 + Hour: 1 + Minute: 34 + Second: 42 + Millisecond: 620 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 28 + ObjectType: "Model" { + Count: 19 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Constraint" { + Count: 7 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::joint1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20.1149425287356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint1_ncl1_1" + } + Model: "Model::joint2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0.444330274742021,25.5455595589343,-57.9392480644365 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20.1149425287356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint2_ncl1_1" + } + Model: "Model::joint3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",-22.2749923850074,-12.8456234600839,60.5791493101964 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20.1149425287356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint3_ncl1_1" + } + Model: "Model::joint4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",2,2,2 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20.1149425287356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint4_ncl1_1" + } + Model: "Model::joint5", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.41236547659571,0.949860417350409,0.380945792880864 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20.1149425287356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint5_ncl1_1" + } + Model: "Model::joint6", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20.1149425287356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint6_ncl1_1" + } + Model: "Model::Parent", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::Parent_ncl1_1" + } + Model: "Model::Aim", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4.27421416884445,5.34354137740366,-2.32830200480351 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::Aim_ncl1_1" + } + Model: "Model::Scale", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.51154091427894,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",2,2,2 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::Scale_ncl1_1" + } + Model: "Model::Position", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0.394192546942977,10.2615113643208,-0.531794406939157 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::Position_ncl1_1" + } + Model: "Model::IKTarget", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-3.46988313950911,4.81927571557342,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::IKTarget_ncl1_1" + } + Model: "Model::joint7", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",-94.4115025541647,51.1291504637495,54.6145712201467 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20.1149425287356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint7_ncl1_1" + } + Model: "Model::joint8", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",90 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,105.851156240876,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20.1149425287356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint8_ncl1_1" + } + Model: "Model::joint9", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,7.92557812043821,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20.1149425287356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint9_ncl1_1" + } + Model: "Model::joint10", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",137.098046324539,0,51.0195972726957 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20.1149425287356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint10_ncl1_1" + } + Model: "Model::joint11", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",20.1149425287356 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint11_ncl1_1" + } + Model: "Model::IKHandle", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-5.52051536424075,5.12559916008072,-0.484195450250965 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::IKHandle_ncl1_1" + } + Model: "Model::Pole", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-10.5815595983431,3.65612323105588,-5.05498666321991 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::Pole_ncl1_1" + } + Model: "Model::Up", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-5.52012664315342,9.95124501466168,0.548221590719692 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::Up_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_constraint_zoo_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_constraint_zoo_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "11/09/2021 22:34:42.619" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_constraint_zoo_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "11/09/2021 22:34:42.619" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\maya_constraints.mb" + } + } + Constraint: "Constraint::joint5_pointConstraint1", "Position From Positions" { + Type: "Position From Positions" + MultiLayer: 0 + Properties60: { + Property: "Active", "bool", "",1 + Property: "Lock", "bool", "",0 + Property: "Weight", "Weight", "A",100 + Property: "Constrained Object", "object", "" + Property: "Source", "object", "" + Property: "AffectX", "bool", "",1 + Property: "AffectY", "bool", "",1 + Property: "AffectZ", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Position.Weight", "Number", "A",100 + } + } + Constraint: "Constraint::joint3_orientConstraint1", "Rotation From Rotations" { + Type: "Rotation From Rotations" + MultiLayer: 0 + Properties60: { + Property: "Active", "bool", "",1 + Property: "Lock", "bool", "",0 + Property: "Weight", "Weight", "A",100 + Property: "Constrained Object", "object", "" + Property: "Source", "object", "" + Property: "AffectX", "bool", "",1 + Property: "AffectY", "bool", "",1 + Property: "AffectZ", "bool", "",1 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "joint1.Weight", "Number", "A",100 + } + } + Constraint: "Constraint::joint4_scaleConstraint1", "Scale From Scales" { + Type: "Scale From Scales" + MultiLayer: 0 + Properties60: { + Property: "Active", "bool", "",1 + Property: "Lock", "bool", "",0 + Property: "Weight", "Weight", "A",100 + Property: "Constrained Object", "object", "" + Property: "Source", "object", "" + Property: "AffectX", "bool", "",1 + Property: "AffectY", "bool", "",1 + Property: "AffectZ", "bool", "",1 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "Scale.Weight", "Number", "A",100 + } + } + Constraint: "Constraint::joint1_parentConstraint1", "Parent-Child" { + Type: "Parent-Child" + MultiLayer: 0 + Properties60: { + Property: "Active", "bool", "",1 + Property: "Lock", "bool", "",0 + Property: "Weight", "Weight", "A",100 + Property: "Constrained object (Child)", "object", "" + Property: "Source (Parent)", "object", "" + Property: "AffectTranslationX", "bool", "",1 + Property: "AffectTranslationY", "bool", "",1 + Property: "AffectTranslationZ", "bool", "",1 + Property: "AffectRotationX", "bool", "",1 + Property: "AffectRotationY", "bool", "",1 + Property: "AffectRotationZ", "bool", "",1 + Property: "AffectScalingX", "bool", "",0 + Property: "AffectScalingY", "bool", "",0 + Property: "AffectScalingZ", "bool", "",0 + Property: "Parent.Weight", "Number", "A",100 + Property: "Parent.Offset T", "Translation", "A",0,0,0 + Property: "Parent.Offset R", "Translation", "A",0,0,90 + } + Version: 101 + Offset: 0,0,90,0,0,0,0,0,0 + } + Constraint: "Constraint::joint2_aimConstraint1", "Aim" { + Type: "Aim" + MultiLayer: 0 + Properties60: { + Property: "Active", "bool", "",1 + Property: "Lock", "bool", "",0 + Property: "Weight", "Weight", "A",100 + Property: "Constrained Object", "object", "" + Property: "Aim At Object", "object", "" + Property: "World Up Object", "object", "" + Property: "WorldUpType", "enum", "",1 + Property: "RotationOffset", "Vector", "A",0,0,3 + Property: "WorldUpVector", "Vector", "A",0,1,0 + Property: "UpVector", "Vector", "A",0,1,0 + Property: "AimVector", "Vector", "A",1,0,0 + Property: "AffectX", "bool", "",1 + Property: "AffectY", "bool", "",1 + Property: "AffectZ", "bool", "",1 + Property: "Aim.Weight", "Number", "A",100 + } + } + Constraint: "Constraint::joint10_aimConstraint1", "Aim" { + Type: "Aim" + MultiLayer: 0 + Properties60: { + Property: "Active", "bool", "",1 + Property: "Lock", "bool", "",0 + Property: "Weight", "Weight", "A",100 + Property: "Constrained Object", "object", "" + Property: "Aim At Object", "object", "" + Property: "World Up Object", "object", "" + Property: "WorldUpType", "enum", "",0 + Property: "RotationOffset", "Vector", "A",0,0,0 + Property: "WorldUpVector", "Vector", "A",0,1,0 + Property: "UpVector", "Vector", "A",0,1,0 + Property: "AimVector", "Vector", "A",1,0,0 + Property: "AffectX", "bool", "",1 + Property: "AffectY", "bool", "",0 + Property: "AffectZ", "bool", "",1 + Property: "Aim.Weight", "Number", "A",100 + } + } + Constraint: "Constraint::IKHandle_ncl1_2", "Single Chain IK" { + Type: "Single Chain IK" + MultiLayer: 0 + Properties60: { + Property: "Active", "bool", "",1 + Property: "Lock", "bool", "",0 + Property: "Weight", "Weight", "A",100 + Property: "First Joint", "object", "" + Property: "End Joint", "object", "" + Property: "Effector", "object", "" + Property: "Pole Vector Object", "object", "" + Property: "SolverType", "enum", "",0 + Property: "PoleVectorType", "enum", "",1 + Property: "EvaluateTSAnim", "enum", "",0 + Property: "PoleVector", "Vector", "A",-2.58155959834308,3.65612323105588,-5.05498666321991 + Property: "Twist", "Number", "A",0 + Property: "Pole.Weight", "Number", "A",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::joint1", "Model::Scene" + Connect: "OO", "Model::Parent", "Model::Scene" + Connect: "OO", "Model::Aim", "Model::Scene" + Connect: "OO", "Model::Scale", "Model::Scene" + Connect: "OO", "Model::Position", "Model::Scene" + Connect: "OO", "Model::IKTarget", "Model::Scene" + Connect: "OO", "Model::joint7", "Model::Scene" + Connect: "OO", "Model::IKHandle", "Model::Scene" + Connect: "OO", "Model::Pole", "Model::Scene" + Connect: "OO", "Model::Up", "Model::Scene" + Connect: "OO", "Model::joint2", "Model::joint1" + Connect: "PO", "Constraint::joint1_parentConstraint1", "Constrained object (Child)", "Model::joint1" + Connect: "OO", "Model::joint3", "Model::joint2" + Connect: "PO", "Constraint::joint2_aimConstraint1", "Constrained Object", "Model::joint2" + Connect: "OO", "Model::joint4", "Model::joint3" + Connect: "PO", "Constraint::joint3_orientConstraint1", "Constrained Object", "Model::joint3" + Connect: "OO", "Model::joint5", "Model::joint4" + Connect: "PO", "Constraint::joint4_scaleConstraint1", "Constrained Object", "Model::joint4" + Connect: "OO", "Model::joint6", "Model::joint5" + Connect: "PO", "Constraint::joint5_pointConstraint1", "Constrained Object", "Model::joint5" + Connect: "OO", "Model::joint8", "Model::joint7" + Connect: "PO", "Constraint::IKHandle_ncl1_2", "First Joint", "Model::joint7" + Connect: "OO", "Model::joint9", "Model::joint8" + Connect: "OO", "Model::joint10", "Model::joint9" + Connect: "OO", "Model::joint11", "Model::joint10" + Connect: "PO", "Constraint::joint10_aimConstraint1", "Constrained Object", "Model::joint10" + Connect: "PO", "Constraint::IKHandle_ncl1_2", "End Joint", "Model::joint10" + Connect: "OP", "Model::Position", "Constraint::joint5_pointConstraint1", "Source" + Connect: "OP", "Model::joint1", "Constraint::joint3_orientConstraint1", "Source" + Connect: "OP", "Model::Scale", "Constraint::joint4_scaleConstraint1", "Source" + Connect: "OP", "Model::Parent", "Constraint::joint1_parentConstraint1", "Source (Parent)" + Connect: "OP", "Model::Aim", "Constraint::joint2_aimConstraint1", "Aim At Object" + Connect: "OP", "Model::Up", "Constraint::joint2_aimConstraint1", "World Up Object" + Connect: "OP", "Model::Aim", "Constraint::joint10_aimConstraint1", "Aim At Object" + Connect: "OP", "Model::Up", "Constraint::joint10_aimConstraint1", "World Up Object" + Connect: "OP", "Model::IKHandle", "Constraint::IKHandle_ncl1_2", "Effector" + Connect: "OP", "Model::Pole", "Constraint::IKHandle_ncl1_2", "Pole Vector Object" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_constraint_zoo_6100_binary.fbx b/modules/ufbx/data/maya_constraint_zoo_6100_binary.fbx new file mode 100644 index 0000000..336bbd9 Binary files /dev/null and b/modules/ufbx/data/maya_constraint_zoo_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_constraint_zoo_7500_ascii.fbx b/modules/ufbx/data/maya_constraint_zoo_7500_ascii.fbx new file mode 100644 index 0000000..7158db1 --- /dev/null +++ b/modules/ufbx/data/maya_constraint_zoo_7500_ascii.fbx @@ -0,0 +1,844 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 12 + Hour: 1 + Minute: 33 + Second: 31 + Millisecond: 88 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_constraint_zoo_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_constraint_zoo_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "11/09/2021 22:33:31.086" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_constraint_zoo_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "11/09/2021 22:33:31.086" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\maya_constraints.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1625214668928, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 48 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 19 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "Model" { + Count: 19 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Constraint" { + Count: 7 + PropertyTemplate: "FbxConstraintPosition" { + Properties70: { + P: "Active", "bool", "", "",1 + P: "Lock", "bool", "", "",0 + P: "Weight", "Weight", "", "A",100 + P: "Constrained Object", "object", "", "" + P: "Source", "object", "", "" + P: "AffectX", "bool", "", "",1 + P: "AffectY", "bool", "", "",1 + P: "AffectZ", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 1624596136896, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20.1149425287356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1624596134016, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20.1149425287356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1624596134208, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20.1149425287356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1624596134400, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20.1149425287356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1624596134592, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20.1149425287356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1624596135168, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20.1149425287356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1625200986032, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 1625200996064, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 1625200988144, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 1625200996592, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 1625200995008, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 1624596136512, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20.1149425287356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1624596134976, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20.1149425287356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1624596134784, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20.1149425287356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1624596135744, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20.1149425287356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1625201489888, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",20.1149425287356 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1625200995184, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + NodeAttribute: 1625200991136, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 1625200987440, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + Model: 1624514847632, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1624514829072, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0.444330274742021,25.5455595589343,-57.9392480644365 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1624514833712, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-22.2749923850074,-12.8456234600839,60.5791493101964 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1624514873152, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",2,2,2 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1624516029856, "Model::joint5", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.41236547659571,0.949860417350409,0.380945792880864 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1624515876736, "Model::joint6", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1624515577408, "Model::Parent", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1624515584368, "Model::Aim", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",4.27421416884445,5.34354137740366,-2.32830200480351 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1623540966624, "Model::Scale", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2.51154091427894,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",2,2,2 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1625696975760, "Model::Position", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0.394192546942977,10.2615113643208,-0.531794406939157 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1625696985040, "Model::IKTarget", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-3.46988313950911,4.81927571557342,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1625696968800, "Model::joint7", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-8,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-94.4115025541647,51.1291504637495,54.6145712201467 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1625696996640, "Model::joint8", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "PreferedAngleY", "double", "Number", "",90 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,105.851156240876,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1625696978080, "Model::joint9", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,7.92557812043821,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1625696989680, "Model::joint10", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",137.098046324539,0,51.0195972726957 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1625696980400, "Model::joint11", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1625696971120, "Model::IKHandle", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-5.52051536424075,5.12559916008072,-0.484195450250965 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1625696987360, "Model::Pole", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-10.5815595983431,3.65612323105588,-5.05498666321991 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1625696998960, "Model::Up", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-5.52012664315342,9.95124501466168,0.548221590719692 + } + Shading: Y + Culling: "CullingOff" + } + Constraint: 1624786444592, "Constraint::joint5_pointConstraint1", "Position From Positions" { + Type: "Position From Positions" + MultiLayer: 0 + Properties70: { + P: "Constrained Object", "object", "", "" + P: "Translation", "Vector", "", "A",0,0,0 + P: "Position.Weight", "Number", "", "A",100 + } + } + Constraint: 1624786445680, "Constraint::joint3_orientConstraint1", "Rotation From Rotations" { + Type: "Rotation From Rotations" + MultiLayer: 0 + Properties70: { + P: "Constrained Object", "object", "", "" + P: "Rotation", "Vector", "", "A",0,0,0 + P: "joint1.Weight", "Number", "", "A",100 + } + } + Constraint: 1624786445408, "Constraint::joint4_scaleConstraint1", "Scale From Scales" { + Type: "Scale From Scales" + MultiLayer: 0 + Properties70: { + P: "Constrained Object", "object", "", "" + P: "Scaling", "Vector", "", "A",1,1,1 + P: "Scale.Weight", "Number", "", "A",100 + } + } + Constraint: 1625212688800, "Constraint::joint1_parentConstraint1", "Parent-Child" { + Type: "Parent-Child" + MultiLayer: 0 + Properties70: { + P: "Constrained object (Child)", "object", "", "" + P: "Parent.Weight", "Number", "", "A",100 + P: "Parent.Offset T", "Translation", "", "A",0,0,0 + P: "Parent.Offset R", "Translation", "", "A",0,0,90 + } + } + Constraint: 1625212678944, "Constraint::joint2_aimConstraint1", "Aim" { + Type: "Aim" + MultiLayer: 0 + Properties70: { + P: "Constrained Object", "object", "", "" + P: "World Up Object", "object", "", "" + P: "WorldUpType", "enum", "", "",1 + P: "RotationOffset", "Vector", "", "A",0,0,3 + P: "Aim.Weight", "Number", "", "A",100 + } + } + Constraint: 1625212680704, "Constraint::joint10_aimConstraint1", "Aim" { + Type: "Aim" + MultiLayer: 0 + Properties70: { + P: "Constrained Object", "object", "", "" + P: "World Up Object", "object", "", "" + P: "WorldUpType", "enum", "", "",0 + P: "RotationOffset", "Vector", "", "A",0,0,0 + P: "AffectY", "bool", "", "",0 + P: "Aim.Weight", "Number", "", "A",100 + } + } + Constraint: 1625689871552, "Constraint::IKHandle", "Single Chain IK" { + Type: "Single Chain IK" + MultiLayer: 0 + Properties70: { + P: "First Joint", "object", "", "" + P: "End Joint", "object", "", "" + P: "Effector", "object", "", "" + P: "PoleVectorType", "enum", "", "",1 + P: "PoleVector", "Vector", "", "A",-2.58155959834308,3.65612323105588,-5.05498666321991 + P: "Pole.Weight", "Number", "", "A",1 + } + } + AnimationStack: 1625197392144, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1625207441056, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::joint1, Model::RootNode + C: "OO",1624514847632,0 + + ;Model::Parent, Model::RootNode + C: "OO",1624515577408,0 + + ;Model::Aim, Model::RootNode + C: "OO",1624515584368,0 + + ;Model::Scale, Model::RootNode + C: "OO",1623540966624,0 + + ;Model::Position, Model::RootNode + C: "OO",1625696975760,0 + + ;Model::IKTarget, Model::RootNode + C: "OO",1625696985040,0 + + ;Model::joint7, Model::RootNode + C: "OO",1625696968800,0 + + ;Model::IKHandle, Model::RootNode + C: "OO",1625696971120,0 + + ;Model::Pole, Model::RootNode + C: "OO",1625696987360,0 + + ;Model::Up, Model::RootNode + C: "OO",1625696998960,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1625207441056,1625197392144 + + ;NodeAttribute::, Model::joint1 + C: "OO",1624596136896,1624514847632 + + ;Model::joint2, Model::joint1 + C: "OO",1624514829072,1624514847632 + + ;NodeAttribute::, Model::joint2 + C: "OO",1624596134016,1624514829072 + + ;Model::joint3, Model::joint2 + C: "OO",1624514833712,1624514829072 + + ;NodeAttribute::, Model::joint3 + C: "OO",1624596134208,1624514833712 + + ;Model::joint4, Model::joint3 + C: "OO",1624514873152,1624514833712 + + ;NodeAttribute::, Model::joint4 + C: "OO",1624596134400,1624514873152 + + ;Model::joint5, Model::joint4 + C: "OO",1624516029856,1624514873152 + + ;NodeAttribute::, Model::joint5 + C: "OO",1624596134592,1624516029856 + + ;Model::joint6, Model::joint5 + C: "OO",1624515876736,1624516029856 + + ;NodeAttribute::, Model::joint6 + C: "OO",1624596135168,1624515876736 + + ;NodeAttribute::, Model::Parent + C: "OO",1625200986032,1624515577408 + + ;NodeAttribute::, Model::Aim + C: "OO",1625200996064,1624515584368 + + ;NodeAttribute::, Model::Scale + C: "OO",1625200988144,1623540966624 + + ;NodeAttribute::, Model::Position + C: "OO",1625200996592,1625696975760 + + ;NodeAttribute::, Model::IKTarget + C: "OO",1625200995008,1625696985040 + + ;NodeAttribute::, Model::joint7 + C: "OO",1624596136512,1625696968800 + + ;Model::joint8, Model::joint7 + C: "OO",1625696996640,1625696968800 + + ;NodeAttribute::, Model::joint8 + C: "OO",1624596134976,1625696996640 + + ;Model::joint9, Model::joint8 + C: "OO",1625696978080,1625696996640 + + ;NodeAttribute::, Model::joint9 + C: "OO",1624596134784,1625696978080 + + ;Model::joint10, Model::joint9 + C: "OO",1625696989680,1625696978080 + + ;NodeAttribute::, Model::joint10 + C: "OO",1624596135744,1625696989680 + + ;Model::joint11, Model::joint10 + C: "OO",1625696980400,1625696989680 + + ;NodeAttribute::, Model::joint11 + C: "OO",1625201489888,1625696980400 + + ;NodeAttribute::, Model::IKHandle + C: "OO",1625200995184,1625696971120 + + ;NodeAttribute::, Model::Pole + C: "OO",1625200991136,1625696987360 + + ;NodeAttribute::, Model::Up + C: "OO",1625200987440,1625696998960 + + ;Model::joint5, Constraint::joint5_pointConstraint1 + C: "OP",1624516029856,1624786444592, "Constrained Object" + + ;Model::Position, Constraint::joint5_pointConstraint1 + C: "OP",1625696975760,1624786444592, "Source" + + ;Model::joint3, Constraint::joint3_orientConstraint1 + C: "OP",1624514833712,1624786445680, "Constrained Object" + + ;Model::joint1, Constraint::joint3_orientConstraint1 + C: "OP",1624514847632,1624786445680, "Source" + + ;Model::joint4, Constraint::joint4_scaleConstraint1 + C: "OP",1624514873152,1624786445408, "Constrained Object" + + ;Model::Scale, Constraint::joint4_scaleConstraint1 + C: "OP",1623540966624,1624786445408, "Source" + + ;Model::joint1, Constraint::joint1_parentConstraint1 + C: "OP",1624514847632,1625212688800, "Constrained object (Child)" + + ;Model::Parent, Constraint::joint1_parentConstraint1 + C: "OP",1624515577408,1625212688800, "Source (Parent)" + + ;Model::joint2, Constraint::joint2_aimConstraint1 + C: "OP",1624514829072,1625212678944, "Constrained Object" + + ;Model::Aim, Constraint::joint2_aimConstraint1 + C: "OP",1624515584368,1625212678944, "Aim At Object" + + ;Model::Up, Constraint::joint2_aimConstraint1 + C: "OP",1625696998960,1625212678944, "World Up Object" + + ;Model::joint10, Constraint::joint10_aimConstraint1 + C: "OP",1625696989680,1625212680704, "Constrained Object" + + ;Model::Aim, Constraint::joint10_aimConstraint1 + C: "OP",1624515584368,1625212680704, "Aim At Object" + + ;Model::Up, Constraint::joint10_aimConstraint1 + C: "OP",1625696998960,1625212680704, "World Up Object" + + ;Model::joint7, Constraint::IKHandle + C: "OP",1625696968800,1625689871552, "First Joint" + + ;Model::joint10, Constraint::IKHandle + C: "OP",1625696989680,1625689871552, "End Joint" + + ;Model::IKHandle, Constraint::IKHandle + C: "OP",1625696971120,1625689871552, "Effector" + + ;Model::Pole, Constraint::IKHandle + C: "OP",1625696987360,1625689871552, "Pole Vector Object" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_constraint_zoo_7500_binary.fbx b/modules/ufbx/data/maya_constraint_zoo_7500_binary.fbx new file mode 100644 index 0000000..d03600e Binary files /dev/null and b/modules/ufbx/data/maya_constraint_zoo_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_cube.obj b/modules/ufbx/data/maya_cube.obj new file mode 100644 index 0000000..fff26d6 --- /dev/null +++ b/modules/ufbx/data/maya_cube.obj @@ -0,0 +1,57 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +s off +g pCube1 +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/5 4/4/6 6/6/7 5/5/8 +f 5/5/9 6/6/10 8/8/11 7/7/12 +f 7/7/13 8/8/14 2/10/15 1/9/16 +f 2/2/17 8/11/18 6/12/19 4/4/20 +f 7/13/21 1/1/22 3/3/23 5/14/24 diff --git a/modules/ufbx/data/maya_cube_6100_ascii.fbx b/modules/ufbx/data/maya_cube_6100_ascii.fbx new file mode 100644 index 0000000..b0aa64e --- /dev/null +++ b/modules/ufbx/data/maya_cube_6100_ascii.fbx @@ -0,0 +1,372 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 33 + Second: 51 + Millisecond: 520 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "31/03/2020 18:33:51.517" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "31/03/2020 18:33:51.517" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_cube_6100_binary.fbx b/modules/ufbx/data/maya_cube_6100_binary.fbx new file mode 100644 index 0000000..685daab Binary files /dev/null and b/modules/ufbx/data/maya_cube_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_cube_7100_ascii.fbx b/modules/ufbx/data/maya_cube_7100_ascii.fbx new file mode 100644 index 0000000..ce6f442 --- /dev/null +++ b/modules/ufbx/data/maya_cube_7100_ascii.fbx @@ -0,0 +1,414 @@ +; FBX 7.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 34 + Second: 52 + Millisecond: 327 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7100_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7100_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:34:52.325" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7100_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:34:52.325" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658663136, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1907294989424, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1908526488528, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1907671561600, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907652240096, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631750464, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1908526488528,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631750464,1907652240096 + + ;Geometry::, Model::pCube1 + C: "OO",1907294989424,1908526488528 + + ;Material::lambert1, Model::pCube1 + C: "OO",1907671561600,1908526488528 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_cube_7100_binary.fbx b/modules/ufbx/data/maya_cube_7100_binary.fbx new file mode 100644 index 0000000..b035a6c Binary files /dev/null and b/modules/ufbx/data/maya_cube_7100_binary.fbx differ diff --git a/modules/ufbx/data/maya_cube_7400_ascii.fbx b/modules/ufbx/data/maya_cube_7400_ascii.fbx new file mode 100644 index 0000000..fa0a016 --- /dev/null +++ b/modules/ufbx/data/maya_cube_7400_ascii.fbx @@ -0,0 +1,424 @@ +; FBX 7.4.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7400 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 10 + Millisecond: 814 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7400_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7400_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:10.811" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7400_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:10.811" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658701024, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1907663073408, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1907292236800, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1908464858960, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907674289488, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631731008, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1907292236800,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631731008,1907674289488 + + ;Geometry::, Model::pCube1 + C: "OO",1907663073408,1907292236800 + + ;Material::lambert1, Model::pCube1 + C: "OO",1908464858960,1907292236800 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_cube_7400_binary.fbx b/modules/ufbx/data/maya_cube_7400_binary.fbx new file mode 100644 index 0000000..9cf8eca Binary files /dev/null and b/modules/ufbx/data/maya_cube_7400_binary.fbx differ diff --git a/modules/ufbx/data/maya_cube_7500_ascii.fbx b/modules/ufbx/data/maya_cube_7500_ascii.fbx new file mode 100644 index 0000000..6bd14e6 --- /dev/null +++ b/modules/ufbx/data/maya_cube_7500_ascii.fbx @@ -0,0 +1,424 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 34 + Millisecond: 164 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658664160, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1908558533920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1907292239120, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1907674217712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907680138928, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631740128, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1907292239120,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631740128,1907680138928 + + ;Geometry::, Model::pCube1 + C: "OO",1908558533920,1907292239120 + + ;Material::lambert1, Model::pCube1 + C: "OO",1907674217712,1907292239120 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_cube_7500_binary.fbx b/modules/ufbx/data/maya_cube_7500_binary.fbx new file mode 100644 index 0000000..388a6ef Binary files /dev/null and b/modules/ufbx/data/maya_cube_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_cube_big_endian.obj b/modules/ufbx/data/maya_cube_big_endian.obj new file mode 100644 index 0000000..fff26d6 --- /dev/null +++ b/modules/ufbx/data/maya_cube_big_endian.obj @@ -0,0 +1,57 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +s off +g pCube1 +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/5 4/4/6 6/6/7 5/5/8 +f 5/5/9 6/6/10 8/8/11 7/7/12 +f 7/7/13 8/8/14 2/10/15 1/9/16 +f 2/2/17 8/11/18 6/12/19 4/4/20 +f 7/13/21 1/1/22 3/3/23 5/14/24 diff --git a/modules/ufbx/data/maya_cube_big_endian_6100_binary.fbx b/modules/ufbx/data/maya_cube_big_endian_6100_binary.fbx new file mode 100644 index 0000000..ea5a338 Binary files /dev/null and b/modules/ufbx/data/maya_cube_big_endian_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_cube_big_endian_7100_binary.fbx b/modules/ufbx/data/maya_cube_big_endian_7100_binary.fbx new file mode 100644 index 0000000..7620123 Binary files /dev/null and b/modules/ufbx/data/maya_cube_big_endian_7100_binary.fbx differ diff --git a/modules/ufbx/data/maya_cube_big_endian_7400_binary.fbx b/modules/ufbx/data/maya_cube_big_endian_7400_binary.fbx new file mode 100644 index 0000000..4ce871f Binary files /dev/null and b/modules/ufbx/data/maya_cube_big_endian_7400_binary.fbx differ diff --git a/modules/ufbx/data/maya_cube_big_endian_7500_binary.fbx b/modules/ufbx/data/maya_cube_big_endian_7500_binary.fbx new file mode 100644 index 0000000..bc3ce4d Binary files /dev/null and b/modules/ufbx/data/maya_cube_big_endian_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_cube_blinky_6100_ascii.fbx b/modules/ufbx/data/maya_cube_blinky_6100_ascii.fbx new file mode 100644 index 0000000..9cc5f39 --- /dev/null +++ b/modules/ufbx/data/maya_cube_blinky_6100_ascii.fbx @@ -0,0 +1,347 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 28 + Hour: 22 + Minute: 51 + Second: 31 + Millisecond: 977 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_cube_blinky_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_cube_blinky_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "28/08/2021 19:51:31.976" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_cube_blinky_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "28/08/2021 19:51:31.976" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::pCube1" { + Version: 1.1 + Channel: "Visibility" { + Default: 0 + KeyVer: 4005 + KeyCount: 5 + Key: 1924423250,0,C,s,19244232500,1,C,n,21168655750,1,C,n,38488465000,0,C,s,57732697500,1,C,s + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_cube_blinky_7500_ascii.fbx b/modules/ufbx/data/maya_cube_blinky_7500_ascii.fbx new file mode 100644 index 0000000..1b6520f --- /dev/null +++ b/modules/ufbx/data/maya_cube_blinky_7500_ascii.fbx @@ -0,0 +1,424 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 28 + Hour: 22 + Minute: 52 + Second: 35 + Millisecond: 931 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_cube_blinky_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_cube_blinky_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "28/08/2021 19:52:35.930" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_cube_blinky_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "28/08/2021 19:52:35.930" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2522048566960, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 1 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2523397584416, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2521609231664, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2522067517344, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2521615077616, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2521615044688, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *5 { + a: 1924423250,19244232500,21168655750,38488465000,57732697500 + } + KeyValueFloat: *5 { + a: 0,1,1,0,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Constant|ConstantNext, Constant|ConstantNext, Constant|ConstantStandard, Constant|ConstantStandard + KeyAttrFlags: *5 { + a: 2,258,258,2,2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:-2.4; RightAuto:0, NextLeftAuto:0; RightSlope:0, NextLeftSlope:2.4, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *20 { + a: 0,0,218434821,0,0,-1072064102,218434821,0,0,0,218434821,0,0,1075419546,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *5 { + a: 1,1,1,1,1 + } + } + AnimationCurveNode: 2521615080320, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",0 + } + } + AnimationLayer: 2522034456000, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2521609231664,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2522034456000,2521615077616 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2521615080320,2522034456000 + + ;Geometry::, Model::pCube1 + C: "OO",2523397584416,2521609231664 + + ;Material::lambert1, Model::pCube1 + C: "OO",2522067517344,2521609231664 + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2521615080320,2521609231664, "Visibility" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2521615044688,2521615080320, "d|Visibility" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_cube_hidden_6100_ascii.fbx b/modules/ufbx/data/maya_cube_hidden_6100_ascii.fbx new file mode 100644 index 0000000..1687eba --- /dev/null +++ b/modules/ufbx/data/maya_cube_hidden_6100_ascii.fbx @@ -0,0 +1,337 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 28 + Hour: 22 + Minute: 54 + Second: 16 + Millisecond: 226 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",0 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_cube_hidden_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_cube_hidden_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "28/08/2021 19:54:16.225" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_cube_hidden_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "28/08/2021 19:54:16.225" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_cube_hidden_6100_binary.fbx b/modules/ufbx/data/maya_cube_hidden_6100_binary.fbx new file mode 100644 index 0000000..650a1a8 Binary files /dev/null and b/modules/ufbx/data/maya_cube_hidden_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_cube_hidden_7500_ascii.fbx b/modules/ufbx/data/maya_cube_hidden_7500_ascii.fbx new file mode 100644 index 0000000..8c91a51 --- /dev/null +++ b/modules/ufbx/data/maya_cube_hidden_7500_ascii.fbx @@ -0,0 +1,379 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 28 + Hour: 22 + Minute: 53 + Second: 28 + Millisecond: 368 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_cube_hidden_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_cube_hidden_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "28/08/2021 19:53:28.367" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_cube_hidden_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "28/08/2021 19:53:28.367" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2522032759584, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2523397470848, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2521609233984, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Visibility", "Visibility", "", "A",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2522067517744, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2522068543264, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2522024008144, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2521609233984,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2522024008144,2522068543264 + + ;Geometry::, Model::pCube1 + C: "OO",2523397470848,2521609233984 + + ;Material::lambert1, Model::pCube1 + C: "OO",2522067517744,2521609233984 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_cube_hidden_7500_binary.fbx b/modules/ufbx/data/maya_cube_hidden_7500_binary.fbx new file mode 100644 index 0000000..ffe501e Binary files /dev/null and b/modules/ufbx/data/maya_cube_hidden_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_different_shaders_6100_ascii.fbx b/modules/ufbx/data/maya_different_shaders_6100_ascii.fbx new file mode 100644 index 0000000..4958219 --- /dev/null +++ b/modules/ufbx/data/maya_different_shaders_6100_ascii.fbx @@ -0,0 +1,817 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 2 + Hour: 20 + Minute: 28 + Second: 51 + Millisecond: 297 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 10 + ObjectType: "Model" { + Count: 3 + } + ObjectType: "Material" { + Count: 3 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Implementation" { + Count: 1 + } + ObjectType: "BindingTable" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::pCube2", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube2_ncl1_1" + } + Model: "Model::pCube3", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube3_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_different_shaders_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_different_shaders_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "02/08/2021 17:28:51.295" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_different_shaders_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "02/08/2021 17:28:51.295" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\different_materials.mb" + } + } + Material: "Material::aiStandardSurface1", "" { + Version: 102 + ShadingModel: "unknown" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Unknown" + Property: "MultiLayer", "bool", "",0 + Property: "Maya|TypeId", "int", "",1138001 + Property: "Maya|outAlpha", "float", "",0 + Property: "Maya|normalCamera", "Vector3D", "",1,1,1 + Property: "Maya|aiEnableMatte", "bool", "",0 + Property: "Maya|aiMatteColor", "Vector3D", "",0,0,0 + Property: "Maya|aiMatteColorA", "float", "",0 + Property: "Maya|base", "float", "",1 + Property: "Maya|baseColor", "Vector3D", "",1,0,0 + Property: "Maya|diffuseRoughness", "float", "",0 + Property: "Maya|specular", "float", "",1 + Property: "Maya|specularColor", "Vector3D", "",1,1,1 + Property: "Maya|specularRoughness", "float", "",0.2 + Property: "Maya|specularIOR", "float", "",1.5 + Property: "Maya|specularAnisotropy", "float", "",0 + Property: "Maya|specularRotation", "float", "",0 + Property: "Maya|metalness", "float", "",0 + Property: "Maya|transmission", "float", "",0 + Property: "Maya|transmissionColor", "Vector3D", "",1,1,1 + Property: "Maya|transmissionDepth", "float", "",0 + Property: "Maya|transmissionScatter", "Vector3D", "",0,0,0 + Property: "Maya|transmissionScatterAnisotropy", "float", "",0 + Property: "Maya|transmissionDispersion", "float", "",0 + Property: "Maya|transmissionExtraRoughness", "float", "",0 + Property: "Maya|transmitAovs", "bool", "",0 + Property: "Maya|subsurface", "float", "",0 + Property: "Maya|subsurfaceColor", "Vector3D", "",1,1,1 + Property: "Maya|subsurfaceRadius", "Vector3D", "",1,1,1 + Property: "Maya|subsurfaceScale", "float", "",1 + Property: "Maya|subsurfaceAnisotropy", "float", "",0 + Property: "Maya|subsurfaceType", "enum", "",1 + Property: "Maya|sheen", "float", "",0 + Property: "Maya|sheenColor", "Vector3D", "",1,1,1 + Property: "Maya|sheenRoughness", "float", "",0.3 + Property: "Maya|thinWalled", "bool", "",0 + Property: "Maya|tangent", "Vector3D", "",0,0,0 + Property: "Maya|coat", "float", "",0 + Property: "Maya|coatColor", "Vector3D", "",1,1,1 + Property: "Maya|coatRoughness", "float", "",0.1 + Property: "Maya|coatIOR", "float", "",1.5 + Property: "Maya|coatAnisotropy", "float", "",0 + Property: "Maya|coatRotation", "float", "",0 + Property: "Maya|coatNormal", "Vector3D", "",0,0,0 + Property: "Maya|thinFilmThickness", "float", "",0 + Property: "Maya|thinFilmIOR", "float", "",1.5 + Property: "Maya|emission", "float", "",0 + Property: "Maya|emissionColor", "Vector3D", "",1,1,1 + Property: "Maya|opacity", "Vector3D", "",1,1,1 + Property: "Maya|caustics", "bool", "",0 + Property: "Maya|internalReflections", "bool", "",1 + Property: "Maya|exitToBackground", "bool", "",0 + Property: "Maya|indirectDiffuse", "float", "",1 + Property: "Maya|indirectSpecular", "float", "",1 + Property: "Maya|dielectricPriority", "int", "",0 + Property: "Maya|aovId1", "KString", "", "" + Property: "Maya|id1", "Vector3D", "",0,0,0 + Property: "Maya|aovId2", "KString", "", "" + Property: "Maya|id2", "Vector3D", "",0,0,0 + Property: "Maya|aovId3", "KString", "", "" + Property: "Maya|id3", "Vector3D", "",0,0,0 + Property: "Maya|aovId4", "KString", "", "" + Property: "Maya|id4", "Vector3D", "",0,0,0 + Property: "Maya|aovId5", "KString", "", "" + Property: "Maya|id5", "Vector3D", "",0,0,0 + Property: "Maya|aovId6", "KString", "", "" + Property: "Maya|id6", "Vector3D", "",0,0,0 + Property: "Maya|aovId7", "KString", "", "" + Property: "Maya|id7", "Vector3D", "",0,0,0 + Property: "Maya|aovId8", "KString", "", "" + Property: "Maya|id8", "Vector3D", "",0,0,0 + Property: "Maya|normalCameraUsedAs", "int", "",0 + Property: "Maya|normalCameraFactor", "double", "",0 + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0,1,0 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0,0.800000011920929,0 + Property: "Opacity", "double", "",1 + } + } + Material: "Material::phong1", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0,0,1 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "SpecularColor", "Color", "A",0.5,0.5,0.5 + Property: "SpecularFactor", "Number", "A",1 + Property: "ShininessExponent", "Number", "A",20 + Property: "ReflectionColor", "Color", "A",0,0,0 + Property: "ReflectionFactor", "Number", "A",0.5 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0,0,0.800000011920929 + Property: "Specular", "Vector3D", "",0.5,0.5,0.5 + Property: "Shininess", "double", "",20 + Property: "Opacity", "double", "",1 + Property: "Reflectivity", "double", "",0 + } + } + Implementation: "Implementation::aiStandardSurface1_Implementation", "" { + Version: 100 + Properties60: { + Property: "ShaderLanguage", "KString", "", "AiOSL" + Property: "ShaderLanguageVersion", "KString", "", "" + Property: "RenderAPI", "KString", "", "ARNOLD_SHADER_ID" + Property: "RenderAPIVersion", "KString", "", "4.2" + Property: "RootBindingName", "KString", "", "root" + } + } + BindingTable: "BindingTable::root 3", "" { + Version: 100 + Properties60: { + Property: "TargetName", "KString", "", "root" + Property: "TargetType", "KString", "", "shader" + Property: "CodeAbsoluteURL", "KString", "", "" + Property: "CodeRelativeURL", "KString", "", "" + Property: "CodeTAG", "KString", "", "shader" + Property: "DescAbsoluteURL", "KString", "", "" + Property: "DescRelativeURL", "KString", "", "" + Property: "DescTAG", "KString", "", "shader" + } + Entry: "Maya|specularIOR", "FbxPropertyEntry", "specularIOR", "FbxSemanticEntry" + Entry: "Maya|aiEnableMatte", "FbxPropertyEntry", "aiEnableMatte", "FbxSemanticEntry" + Entry: "Maya|id5", "FbxPropertyEntry", "id5", "FbxSemanticEntry" + Entry: "Maya|emission", "FbxPropertyEntry", "emission", "FbxSemanticEntry" + Entry: "Maya|thinFilmThickness", "FbxPropertyEntry", "thinFilmThickness", "FbxSemanticEntry" + Entry: "Maya|sheenColor", "FbxPropertyEntry", "sheenColor", "FbxSemanticEntry" + Entry: "Maya|aovId2", "FbxPropertyEntry", "aovId2", "FbxSemanticEntry" + Entry: "Maya|sheen", "FbxPropertyEntry", "sheen", "FbxSemanticEntry" + Entry: "Maya|transmissionDepth", "FbxPropertyEntry", "transmissionDepth", "FbxSemanticEntry" + Entry: "Maya|transmissionColor", "FbxPropertyEntry", "transmissionColor", "FbxSemanticEntry" + Entry: "Maya|specularColor", "FbxPropertyEntry", "specularColor", "FbxSemanticEntry" + Entry: "Maya|id4", "FbxPropertyEntry", "id4", "FbxSemanticEntry" + Entry: "Maya|aiMatteColor", "FbxPropertyEntry", "aiMatteColor", "FbxSemanticEntry" + Entry: "Maya|sheenRoughness", "FbxPropertyEntry", "sheenRoughness", "FbxSemanticEntry" + Entry: "Maya|exitToBackground", "FbxPropertyEntry", "exitToBackground", "FbxSemanticEntry" + Entry: "Maya|tangent", "FbxPropertyEntry", "tangent", "FbxSemanticEntry" + Entry: "Maya|metalness", "FbxPropertyEntry", "metalness", "FbxSemanticEntry" + Entry: "Maya|id7", "FbxPropertyEntry", "id7", "FbxSemanticEntry" + Entry: "Maya|baseColor", "FbxPropertyEntry", "baseColor", "FbxSemanticEntry" + Entry: "Maya|base", "FbxPropertyEntry", "base", "FbxSemanticEntry" + Entry: "Maya|id2", "FbxPropertyEntry", "id2", "FbxSemanticEntry" + Entry: "Maya|indirectSpecular", "FbxPropertyEntry", "indirectSpecular", "FbxSemanticEntry" + Entry: "Maya|coatNormal", "FbxPropertyEntry", "coatNormal", "FbxSemanticEntry" + Entry: "Maya|coatRoughness", "FbxPropertyEntry", "coatRoughness", "FbxSemanticEntry" + Entry: "Maya|subsurfaceType", "FbxPropertyEntry", "subsurfaceType", "FbxSemanticEntry" + Entry: "Maya|transmissionExtraRoughness", "FbxPropertyEntry", "transmissionExtraRoughness", "FbxSemanticEntry" + Entry: "Maya|specular", "FbxPropertyEntry", "specular", "FbxSemanticEntry" + Entry: "Maya|aovId7", "FbxPropertyEntry", "aovId7", "FbxSemanticEntry" + Entry: "Maya|aovId6", "FbxPropertyEntry", "aovId6", "FbxSemanticEntry" + Entry: "Maya|caustics", "FbxPropertyEntry", "caustics", "FbxSemanticEntry" + Entry: "Maya|subsurfaceScale", "FbxPropertyEntry", "subsurfaceScale", "FbxSemanticEntry" + Entry: "Maya|specularAnisotropy", "FbxPropertyEntry", "specularAnisotropy", "FbxSemanticEntry" + Entry: "Maya|diffuseRoughness", "FbxPropertyEntry", "diffuseRoughness", "FbxSemanticEntry" + Entry: "Maya|aiMatteColorA", "FbxPropertyEntry", "aiMatteColorA", "FbxSemanticEntry" + Entry: "Maya|aovId4", "FbxPropertyEntry", "aovId4", "FbxSemanticEntry" + Entry: "Maya|aovId3", "FbxPropertyEntry", "aovId3", "FbxSemanticEntry" + Entry: "Maya|internalReflections", "FbxPropertyEntry", "internalReflections", "FbxSemanticEntry" + Entry: "Maya|transmissionDispersion", "FbxPropertyEntry", "transmissionDispersion", "FbxSemanticEntry" + Entry: "Maya|dielectricPriority", "FbxPropertyEntry", "dielectricPriority", "FbxSemanticEntry" + Entry: "Maya|transmission", "FbxPropertyEntry", "transmission", "FbxSemanticEntry" + Entry: "Maya|id8", "FbxPropertyEntry", "id8", "FbxSemanticEntry" + Entry: "Maya|outAlpha", "FbxPropertyEntry", "outAlpha", "FbxSemanticEntry" + Entry: "Maya|emissionColor", "FbxPropertyEntry", "emissionColor", "FbxSemanticEntry" + Entry: "Maya|subsurfaceAnisotropy", "FbxPropertyEntry", "subsurfaceAnisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurface", "FbxPropertyEntry", "subsurface", "FbxSemanticEntry" + Entry: "Maya|specularRoughness", "FbxPropertyEntry", "specularRoughness", "FbxSemanticEntry" + Entry: "Maya|coatColor", "FbxPropertyEntry", "coatColor", "FbxSemanticEntry" + Entry: "Maya|aovId5", "FbxPropertyEntry", "aovId5", "FbxSemanticEntry" + Entry: "Maya|transmissionScatterAnisotropy", "FbxPropertyEntry", "transmissionScatterAnisotropy", "FbxSemanticEntry" + Entry: "Maya|indirectDiffuse", "FbxPropertyEntry", "indirectDiffuse", "FbxSemanticEntry" + Entry: "Maya|coatIOR", "FbxPropertyEntry", "coatIOR", "FbxSemanticEntry" + Entry: "Maya|specularRotation", "FbxPropertyEntry", "specularRotation", "FbxSemanticEntry" + Entry: "Maya|coatRotation", "FbxPropertyEntry", "coatRotation", "FbxSemanticEntry" + Entry: "Maya|transmitAovs", "FbxPropertyEntry", "transmitAovs", "FbxSemanticEntry" + Entry: "Maya|aovId1", "FbxPropertyEntry", "aovId1", "FbxSemanticEntry" + Entry: "Maya|coat", "FbxPropertyEntry", "coat", "FbxSemanticEntry" + Entry: "Maya|thinWalled", "FbxPropertyEntry", "thinWalled", "FbxSemanticEntry" + Entry: "Maya|id6", "FbxPropertyEntry", "id6", "FbxSemanticEntry" + Entry: "Maya|id1", "FbxPropertyEntry", "id1", "FbxSemanticEntry" + Entry: "Maya|opacity", "FbxPropertyEntry", "opacity", "FbxSemanticEntry" + Entry: "Maya|thinFilmIOR", "FbxPropertyEntry", "thinFilmIOR", "FbxSemanticEntry" + Entry: "Maya|aovId8", "FbxPropertyEntry", "aovId8", "FbxSemanticEntry" + Entry: "Maya|coatAnisotropy", "FbxPropertyEntry", "coatAnisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurfaceRadius", "FbxPropertyEntry", "subsurfaceRadius", "FbxSemanticEntry" + Entry: "Maya|normalCamera", "FbxPropertyEntry", "normalCamera", "FbxSemanticEntry" + Entry: "Maya|subsurfaceColor", "FbxPropertyEntry", "subsurfaceColor", "FbxSemanticEntry" + Entry: "Maya|transmissionScatter", "FbxPropertyEntry", "transmissionScatter", "FbxSemanticEntry" + Entry: "Maya|id3", "FbxPropertyEntry", "id3", "FbxSemanticEntry" + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::pCube2", "Model::Scene" + Connect: "OO", "Model::pCube3", "Model::Scene" + Connect: "OO", "Material::phong1", "Model::pCube1" + Connect: "OO", "Material::aiStandardSurface1", "Implementation::aiStandardSurface1_Implementation" + Connect: "OO", "BindingTable::root 3", "Implementation::aiStandardSurface1_Implementation" + Connect: "OO", "Material::aiStandardSurface1", "Model::pCube2" + Connect: "OO", "Material::lambert1", "Model::pCube3" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_different_shaders_7500_ascii.fbx b/modules/ufbx/data/maya_different_shaders_7500_ascii.fbx new file mode 100644 index 0000000..94735b7 --- /dev/null +++ b/modules/ufbx/data/maya_different_shaders_7500_ascii.fbx @@ -0,0 +1,764 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 2 + Hour: 19 + Minute: 47 + Second: 30 + Millisecond: 645 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_different_shaders_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_different_shaders_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "02/08/2021 16:47:30.644" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_different_shaders_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "02/08/2021 16:47:30.644" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2912406200464, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 14 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 3 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 3 + PropertyTemplate: "FbxSurfacePhong" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Phong" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + P: "SpecularColor", "Color", "", "A",0.2,0.2,0.2 + P: "SpecularFactor", "Number", "", "A",1 + P: "ShininessExponent", "Number", "", "A",20 + P: "ReflectionColor", "Color", "", "A",0,0,0 + P: "ReflectionFactor", "Number", "", "A",1 + } + } + } + ObjectType: "Model" { + Count: 3 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Implementation" { + Count: 1 + PropertyTemplate: "FbxImplementation" { + Properties70: { + P: "ShaderLanguage", "KString", "", "", "MentalRaySL" + P: "ShaderLanguageVersion", "KString", "", "", "" + P: "RenderAPI", "KString", "", "", "MentalRay" + P: "RenderAPIVersion", "KString", "", "", "" + P: "RootBindingName", "KString", "", "", "" + P: "Constants", "Compound", "", "" + } + } + } + ObjectType: "BindingTable" { + Count: 1 + PropertyTemplate: "FbxBindingTable" { + Properties70: { + P: "TargetName", "KString", "", "", "" + P: "TargetType", "KString", "", "", "" + P: "CodeAbsoluteURL", "KString", "XRefUrl", "", "" + P: "CodeRelativeURL", "KString", "XRefUrl", "", "" + P: "CodeTAG", "KString", "", "", "shader" + P: "DescAbsoluteURL", "KString", "XRefUrl", "", "" + P: "DescRelativeURL", "KString", "XRefUrl", "", "" + P: "DescTAG", "KString", "", "", "shader" + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2914114597376, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2914114586560, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2914114583648, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2914048646784, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2914048704784, "Model::pCube2", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2914048697824, "Model::pCube3", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2914644936224, "Material::phong1", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0,0,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "SpecularColor", "Color", "", "A",0.5,0.5,0.5 + P: "ReflectionFactor", "Number", "", "A",0.5 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0,0,0.800000011920929 + P: "Specular", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Shininess", "double", "Number", "",20 + P: "Opacity", "double", "Number", "",1 + P: "Reflectivity", "double", "Number", "",0 + } + } + Material: 2912409121856, "Material::aiStandardSurface1", "" { + Version: 102 + ShadingModel: "unknown" + MultiLayer: 0 + Properties70: { + P: "Maya", "Compound", "", "" + P: "Maya|TypeId", "int", "Integer", "",1138001 + P: "Maya|outAlpha", "float", "", "",0 + P: "Maya|normalCamera", "Vector3D", "Vector", "",1,1,1 + P: "Maya|aiEnableMatte", "bool", "", "",0 + P: "Maya|aiMatteColor", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aiMatteColorA", "float", "", "",0 + P: "Maya|base", "float", "", "",1 + P: "Maya|baseColor", "Vector3D", "Vector", "",1,0,0 + P: "Maya|diffuseRoughness", "float", "", "",0 + P: "Maya|specular", "float", "", "",1 + P: "Maya|specularColor", "Vector3D", "Vector", "",1,1,1 + P: "Maya|specularRoughness", "float", "", "",0.2 + P: "Maya|specularIOR", "float", "", "",1.5 + P: "Maya|specularAnisotropy", "float", "", "",0 + P: "Maya|specularRotation", "float", "", "",0 + P: "Maya|metalness", "float", "", "",0 + P: "Maya|transmission", "float", "", "",0 + P: "Maya|transmissionColor", "Vector3D", "Vector", "",1,1,1 + P: "Maya|transmissionDepth", "float", "", "",0 + P: "Maya|transmissionScatter", "Vector3D", "Vector", "",0,0,0 + P: "Maya|transmissionScatterAnisotropy", "float", "", "",0 + P: "Maya|transmissionDispersion", "float", "", "",0 + P: "Maya|transmissionExtraRoughness", "float", "", "",0 + P: "Maya|transmitAovs", "bool", "", "",0 + P: "Maya|subsurface", "float", "", "",0 + P: "Maya|subsurfaceColor", "Vector3D", "Vector", "",1,1,1 + P: "Maya|subsurfaceRadius", "Vector3D", "Vector", "",1,1,1 + P: "Maya|subsurfaceScale", "float", "", "",1 + P: "Maya|subsurfaceAnisotropy", "float", "", "",0 + P: "Maya|subsurfaceType", "enum", "", "",1 + P: "Maya|sheen", "float", "", "",0 + P: "Maya|sheenColor", "Vector3D", "Vector", "",1,1,1 + P: "Maya|sheenRoughness", "float", "", "",0.3 + P: "Maya|thinWalled", "bool", "", "",0 + P: "Maya|tangent", "Vector3D", "Vector", "",0,0,0 + P: "Maya|coat", "float", "", "",0 + P: "Maya|coatColor", "Vector3D", "Vector", "",1,1,1 + P: "Maya|coatRoughness", "float", "", "",0.1 + P: "Maya|coatIOR", "float", "", "",1.5 + P: "Maya|coatAnisotropy", "float", "", "",0 + P: "Maya|coatRotation", "float", "", "",0 + P: "Maya|coatNormal", "Vector3D", "Vector", "",0,0,0 + P: "Maya|thinFilmThickness", "float", "", "",0 + P: "Maya|thinFilmIOR", "float", "", "",1.5 + P: "Maya|emission", "float", "", "",0 + P: "Maya|emissionColor", "Vector3D", "Vector", "",1,1,1 + P: "Maya|opacity", "Vector3D", "Vector", "",1,1,1 + P: "Maya|caustics", "bool", "", "",0 + P: "Maya|internalReflections", "bool", "", "",1 + P: "Maya|exitToBackground", "bool", "", "",0 + P: "Maya|indirectDiffuse", "float", "", "",1 + P: "Maya|indirectSpecular", "float", "", "",1 + P: "Maya|dielectricPriority", "int", "Integer", "",0 + P: "Maya|aovId1", "KString", "", "", "" + P: "Maya|id1", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId2", "KString", "", "", "" + P: "Maya|id2", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId3", "KString", "", "", "" + P: "Maya|id3", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId4", "KString", "", "", "" + P: "Maya|id4", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId5", "KString", "", "", "" + P: "Maya|id5", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId6", "KString", "", "", "" + P: "Maya|id6", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId7", "KString", "", "", "" + P: "Maya|id7", "Vector3D", "Vector", "",0,0,0 + P: "Maya|aovId8", "KString", "", "", "" + P: "Maya|id8", "Vector3D", "Vector", "",0,0,0 + P: "Maya|normalCameraUsedAs", "int", "Integer", "",0 + P: "Maya|normalCameraFactor", "double", "Number", "",0 + } + } + Material: 2912399597936, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0,1,0 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0,0.800000011920929,0 + P: "Opacity", "double", "Number", "",1 + } + } + Implementation: 2914187581280, "Implementation::aiStandardSurface1_Implementation", "" { + Version: 100 + Properties70: { + P: "ShaderLanguage", "KString", "", "", "AiOSL" + P: "RenderAPI", "KString", "", "", "ARNOLD_SHADER_ID" + P: "RenderAPIVersion", "KString", "", "", "4.2" + P: "RootBindingName", "KString", "", "", "root" + } + } + BindingTable: 2914408417120, "BindingTable::root 2", "" { + Version: 100 + Properties70: { + P: "TargetName", "KString", "", "", "root" + P: "TargetType", "KString", "", "", "shader" + } + Entry: "Maya|specularIOR", "FbxPropertyEntry", "specularIOR", "FbxSemanticEntry" + Entry: "Maya|aiEnableMatte", "FbxPropertyEntry", "aiEnableMatte", "FbxSemanticEntry" + Entry: "Maya|id5", "FbxPropertyEntry", "id5", "FbxSemanticEntry" + Entry: "Maya|emission", "FbxPropertyEntry", "emission", "FbxSemanticEntry" + Entry: "Maya|thinFilmThickness", "FbxPropertyEntry", "thinFilmThickness", "FbxSemanticEntry" + Entry: "Maya|sheenColor", "FbxPropertyEntry", "sheenColor", "FbxSemanticEntry" + Entry: "Maya|aovId2", "FbxPropertyEntry", "aovId2", "FbxSemanticEntry" + Entry: "Maya|sheen", "FbxPropertyEntry", "sheen", "FbxSemanticEntry" + Entry: "Maya|transmissionDepth", "FbxPropertyEntry", "transmissionDepth", "FbxSemanticEntry" + Entry: "Maya|transmissionColor", "FbxPropertyEntry", "transmissionColor", "FbxSemanticEntry" + Entry: "Maya|specularColor", "FbxPropertyEntry", "specularColor", "FbxSemanticEntry" + Entry: "Maya|id4", "FbxPropertyEntry", "id4", "FbxSemanticEntry" + Entry: "Maya|aiMatteColor", "FbxPropertyEntry", "aiMatteColor", "FbxSemanticEntry" + Entry: "Maya|sheenRoughness", "FbxPropertyEntry", "sheenRoughness", "FbxSemanticEntry" + Entry: "Maya|exitToBackground", "FbxPropertyEntry", "exitToBackground", "FbxSemanticEntry" + Entry: "Maya|tangent", "FbxPropertyEntry", "tangent", "FbxSemanticEntry" + Entry: "Maya|metalness", "FbxPropertyEntry", "metalness", "FbxSemanticEntry" + Entry: "Maya|id7", "FbxPropertyEntry", "id7", "FbxSemanticEntry" + Entry: "Maya|baseColor", "FbxPropertyEntry", "baseColor", "FbxSemanticEntry" + Entry: "Maya|base", "FbxPropertyEntry", "base", "FbxSemanticEntry" + Entry: "Maya|id2", "FbxPropertyEntry", "id2", "FbxSemanticEntry" + Entry: "Maya|indirectSpecular", "FbxPropertyEntry", "indirectSpecular", "FbxSemanticEntry" + Entry: "Maya|coatNormal", "FbxPropertyEntry", "coatNormal", "FbxSemanticEntry" + Entry: "Maya|coatRoughness", "FbxPropertyEntry", "coatRoughness", "FbxSemanticEntry" + Entry: "Maya|subsurfaceType", "FbxPropertyEntry", "subsurfaceType", "FbxSemanticEntry" + Entry: "Maya|transmissionExtraRoughness", "FbxPropertyEntry", "transmissionExtraRoughness", "FbxSemanticEntry" + Entry: "Maya|specular", "FbxPropertyEntry", "specular", "FbxSemanticEntry" + Entry: "Maya|aovId7", "FbxPropertyEntry", "aovId7", "FbxSemanticEntry" + Entry: "Maya|aovId6", "FbxPropertyEntry", "aovId6", "FbxSemanticEntry" + Entry: "Maya|caustics", "FbxPropertyEntry", "caustics", "FbxSemanticEntry" + Entry: "Maya|subsurfaceScale", "FbxPropertyEntry", "subsurfaceScale", "FbxSemanticEntry" + Entry: "Maya|specularAnisotropy", "FbxPropertyEntry", "specularAnisotropy", "FbxSemanticEntry" + Entry: "Maya|diffuseRoughness", "FbxPropertyEntry", "diffuseRoughness", "FbxSemanticEntry" + Entry: "Maya|aiMatteColorA", "FbxPropertyEntry", "aiMatteColorA", "FbxSemanticEntry" + Entry: "Maya|aovId4", "FbxPropertyEntry", "aovId4", "FbxSemanticEntry" + Entry: "Maya|aovId3", "FbxPropertyEntry", "aovId3", "FbxSemanticEntry" + Entry: "Maya|internalReflections", "FbxPropertyEntry", "internalReflections", "FbxSemanticEntry" + Entry: "Maya|transmissionDispersion", "FbxPropertyEntry", "transmissionDispersion", "FbxSemanticEntry" + Entry: "Maya|dielectricPriority", "FbxPropertyEntry", "dielectricPriority", "FbxSemanticEntry" + Entry: "Maya|transmission", "FbxPropertyEntry", "transmission", "FbxSemanticEntry" + Entry: "Maya|id8", "FbxPropertyEntry", "id8", "FbxSemanticEntry" + Entry: "Maya|outAlpha", "FbxPropertyEntry", "outAlpha", "FbxSemanticEntry" + Entry: "Maya|emissionColor", "FbxPropertyEntry", "emissionColor", "FbxSemanticEntry" + Entry: "Maya|subsurfaceAnisotropy", "FbxPropertyEntry", "subsurfaceAnisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurface", "FbxPropertyEntry", "subsurface", "FbxSemanticEntry" + Entry: "Maya|specularRoughness", "FbxPropertyEntry", "specularRoughness", "FbxSemanticEntry" + Entry: "Maya|coatColor", "FbxPropertyEntry", "coatColor", "FbxSemanticEntry" + Entry: "Maya|aovId5", "FbxPropertyEntry", "aovId5", "FbxSemanticEntry" + Entry: "Maya|transmissionScatterAnisotropy", "FbxPropertyEntry", "transmissionScatterAnisotropy", "FbxSemanticEntry" + Entry: "Maya|indirectDiffuse", "FbxPropertyEntry", "indirectDiffuse", "FbxSemanticEntry" + Entry: "Maya|coatIOR", "FbxPropertyEntry", "coatIOR", "FbxSemanticEntry" + Entry: "Maya|specularRotation", "FbxPropertyEntry", "specularRotation", "FbxSemanticEntry" + Entry: "Maya|coatRotation", "FbxPropertyEntry", "coatRotation", "FbxSemanticEntry" + Entry: "Maya|transmitAovs", "FbxPropertyEntry", "transmitAovs", "FbxSemanticEntry" + Entry: "Maya|aovId1", "FbxPropertyEntry", "aovId1", "FbxSemanticEntry" + Entry: "Maya|coat", "FbxPropertyEntry", "coat", "FbxSemanticEntry" + Entry: "Maya|thinWalled", "FbxPropertyEntry", "thinWalled", "FbxSemanticEntry" + Entry: "Maya|id6", "FbxPropertyEntry", "id6", "FbxSemanticEntry" + Entry: "Maya|id1", "FbxPropertyEntry", "id1", "FbxSemanticEntry" + Entry: "Maya|opacity", "FbxPropertyEntry", "opacity", "FbxSemanticEntry" + Entry: "Maya|thinFilmIOR", "FbxPropertyEntry", "thinFilmIOR", "FbxSemanticEntry" + Entry: "Maya|aovId8", "FbxPropertyEntry", "aovId8", "FbxSemanticEntry" + Entry: "Maya|coatAnisotropy", "FbxPropertyEntry", "coatAnisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurfaceRadius", "FbxPropertyEntry", "subsurfaceRadius", "FbxSemanticEntry" + Entry: "Maya|normalCamera", "FbxPropertyEntry", "normalCamera", "FbxSemanticEntry" + Entry: "Maya|subsurfaceColor", "FbxPropertyEntry", "subsurfaceColor", "FbxSemanticEntry" + Entry: "Maya|transmissionScatter", "FbxPropertyEntry", "transmissionScatter", "FbxSemanticEntry" + Entry: "Maya|id3", "FbxPropertyEntry", "id3", "FbxSemanticEntry" + } + AnimationStack: 2912408088736, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2912401716464, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2914048646784,0 + + ;Model::pCube2, Model::RootNode + C: "OO",2914048704784,0 + + ;Model::pCube3, Model::RootNode + C: "OO",2914048697824,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2912401716464,2912408088736 + + ;Geometry::, Model::pCube1 + C: "OO",2914114597376,2914048646784 + + ;Material::phong1, Model::pCube1 + C: "OO",2914644936224,2914048646784 + + ;Material::aiStandardSurface1, Implementation::aiStandardSurface1_Implementation + C: "OO",2912409121856,2914187581280 + + ;BindingTable::root 2, Implementation::aiStandardSurface1_Implementation + C: "OO",2914408417120,2914187581280 + + ;Geometry::, Model::pCube2 + C: "OO",2914114586560,2914048704784 + + ;Material::aiStandardSurface1, Model::pCube2 + C: "OO",2912409121856,2914048704784 + + ;Geometry::, Model::pCube3 + C: "OO",2914114583648,2914048697824 + + ;Material::lambert1, Model::pCube3 + C: "OO",2912399597936,2914048697824 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_display_layers_6100_ascii.fbx b/modules/ufbx/data/maya_display_layers_6100_ascii.fbx new file mode 100644 index 0000000..ba0a74e --- /dev/null +++ b/modules/ufbx/data/maya_display_layers_6100_ascii.fbx @@ -0,0 +1,908 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 11 + Hour: 0 + Minute: 44 + Second: 50 + Millisecond: 333 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 10 + ObjectType: "Model" { + Count: 4 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "CollectionExclusive" { + Count: 3 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::NodeA", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::NodeA_ncl1_1" + } + Model: "Model::NodeB", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",1 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.499999940395355,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.499999940395355,0.5,-0.5,-0.5,-0.5 + ,-0.5,0.499999940395355,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,-2.98023223876953e-08 + ,-2.98023223876953e-08,1,-2.98023223876953e-08,-2.98023223876953e-08,1,-2.98023223876953e-08,-2.98023223876953e-08 + ,1,-2.98023223876953e-08,-2.98023223876953e-08,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,2.98023223876953e-08 + ,1,0,2.98023223876953e-08,1,-8.88178419700125e-16,2.98023223876953e-08,1,-1.77635683940025e-15,2.98023223876953e-08 + ,1,-8.88178419700125e-16,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,-2.98023223876953e-08 + ,8.88178419700125e-16,-1,-2.98023223876953e-08,0,-1,-2.98023223876953e-08,-8.88178419700125e-16,-1,-2.98023223876953e-08 + ,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::NodeB_ncl1_1" + } + Model: "Model::NodeC", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::NodeC_ncl1_1" + } + Model: "Model::NodeFree", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,2,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::NodeFree_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_display_layers_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_display_layers_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "10/09/2021 21:44:50.332" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_display_layers_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "10/09/2021 21:44:50.332" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\maya_display_layers.mb" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } + CollectionExclusive: "DisplayLayer::LayerA", "DisplayLayer" { + Properties60: { + Property: "Color", "ColorRGB", "",1,0,0 + Property: "Show", "bool", "",1 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + } + } + CollectionExclusive: "DisplayLayer::LayerB", "DisplayLayer" { + Properties60: { + Property: "Color", "ColorRGB", "",0,1,0 + Property: "Show", "bool", "",1 + Property: "Freeze", "bool", "",1 + Property: "LODBox", "bool", "",0 + } + } + CollectionExclusive: "DisplayLayer::LayerC", "DisplayLayer" { + Properties60: { + Property: "Color", "ColorRGB", "",0,0,1 + Property: "Show", "bool", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::NodeA", "Model::Scene" + Connect: "OO", "Model::NodeB", "Model::Scene" + Connect: "OO", "Model::NodeC", "Model::Scene" + Connect: "OO", "Model::NodeFree", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::NodeA" + Connect: "OO", "Material::lambert1", "Model::NodeB" + Connect: "OO", "Material::lambert1", "Model::NodeC" + Connect: "OO", "Material::lambert1", "Model::NodeFree" + Connect: "OO", "Model::NodeA", "DisplayLayer::LayerA" + Connect: "OO", "Model::NodeB", "DisplayLayer::LayerB" + Connect: "OO", "Model::NodeC", "DisplayLayer::LayerC" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_display_layers_6100_binary.fbx b/modules/ufbx/data/maya_display_layers_6100_binary.fbx new file mode 100644 index 0000000..d9d189a Binary files /dev/null and b/modules/ufbx/data/maya_display_layers_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_display_layers_7500_ascii.fbx b/modules/ufbx/data/maya_display_layers_7500_ascii.fbx new file mode 100644 index 0000000..de2fe79 --- /dev/null +++ b/modules/ufbx/data/maya_display_layers_7500_ascii.fbx @@ -0,0 +1,847 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 11 + Hour: 0 + Minute: 46 + Second: 7 + Millisecond: 943 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_display_layers_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_display_layers_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "10/09/2021 21:46:07.941" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_display_layers_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "10/09/2021 21:46:07.941" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\maya_display_layers.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2111360153536, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 15 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 4 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 4 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "CollectionExclusive" { + Count: 3 + PropertyTemplate: "FbxDisplayLayer" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Show", "bool", "", "",1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2109565419936, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2109565413696, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.499999940395355,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.499999940395355,0.5,-0.5,-0.5,-0.5,-0.5,0.499999940395355,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,-2.98023223876953e-08,-2.98023223876953e-08,1,-2.98023223876953e-08,-2.98023223876953e-08,1,-2.98023223876953e-08,-2.98023223876953e-08,1,-2.98023223876953e-08,-2.98023223876953e-08,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,2.98023223876953e-08,1,0,2.98023223876953e-08,1,-8.88178419700125e-16,2.98023223876953e-08,1,-1.77635683940025e-15,2.98023223876953e-08,1,-8.88178419700125e-16,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,-2.98023223876953e-08,8.88178419700125e-16,-1,-2.98023223876953e-08,0,-1,-2.98023223876953e-08,-8.88178419700125e-16,-1,-2.98023223876953e-08,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2109565421184, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2109565414944, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2109545892176, "Model::NodeA", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2109545920016, "Model::NodeB", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Freeze", "bool", "", "",1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2109545889856, "Model::NodeC", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2109545922336, "Model::NodeFree", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,2,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2109566220224, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2109865570192, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2109764311968, "AnimLayer::BaseLayer", "" { + } + CollectionExclusive: 2111525884016, "DisplayLayer::LayerA", "DisplayLayer" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0,0 + } + } + CollectionExclusive: 2111525886128, "DisplayLayer::LayerB", "DisplayLayer" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0,1,0 + P: "Freeze", "bool", "", "",1 + } + } + CollectionExclusive: 2111525886320, "DisplayLayer::LayerC", "DisplayLayer" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0,0,1 + P: "Show", "bool", "", "",0 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::NodeA, Model::RootNode + C: "OO",2109545892176,0 + + ;Model::NodeB, Model::RootNode + C: "OO",2109545920016,0 + + ;Model::NodeC, Model::RootNode + C: "OO",2109545889856,0 + + ;Model::NodeFree, Model::RootNode + C: "OO",2109545922336,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2109764311968,2109865570192 + + ;Geometry::, Model::NodeA + C: "OO",2109565419936,2109545892176 + + ;Material::lambert1, Model::NodeA + C: "OO",2109566220224,2109545892176 + + ;Geometry::, Model::NodeB + C: "OO",2109565413696,2109545920016 + + ;Material::lambert1, Model::NodeB + C: "OO",2109566220224,2109545920016 + + ;Geometry::, Model::NodeC + C: "OO",2109565421184,2109545889856 + + ;Material::lambert1, Model::NodeC + C: "OO",2109566220224,2109545889856 + + ;Geometry::, Model::NodeFree + C: "OO",2109565414944,2109545922336 + + ;Material::lambert1, Model::NodeFree + C: "OO",2109566220224,2109545922336 + + ;Model::NodeA, DisplayLayer::LayerA + C: "OO",2109545892176,2111525884016 + + ;Model::NodeB, DisplayLayer::LayerB + C: "OO",2109545920016,2111525886128 + + ;Model::NodeC, DisplayLayer::LayerC + C: "OO",2109545889856,2111525886320 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_display_layers_7500_binary.fbx b/modules/ufbx/data/maya_display_layers_7500_binary.fbx new file mode 100644 index 0000000..ac7b42c Binary files /dev/null and b/modules/ufbx/data/maya_display_layers_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_double_parent_7500_ascii.fbx b/modules/ufbx/data/maya_double_parent_7500_ascii.fbx new file mode 100644 index 0000000..f43a1c6 --- /dev/null +++ b/modules/ufbx/data/maya_double_parent_7500_ascii.fbx @@ -0,0 +1,366 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 11 + Hour: 23 + Minute: 48 + Second: 15 + Millisecond: 912 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_double_parent_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_double_parent_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "11/09/2021 20:48:15.910" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_double_parent_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "11/09/2021 20:48:15.910" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1624714739200, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 10 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 3 + PropertyTemplate: "FbxNull" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "Look", "enum", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 3 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Constraint" { + Count: 1 + PropertyTemplate: "FbxConstraintParent" { + Properties70: { + P: "Active", "bool", "", "",1 + P: "Lock", "bool", "", "",0 + P: "Weight", "Weight", "", "A",100 + P: "Constrained object (Child)", "object", "", "" + P: "Source (Parent)", "object", "", "" + P: "AffectTranslationX", "bool", "", "",1 + P: "AffectTranslationY", "bool", "", "",1 + P: "AffectTranslationZ", "bool", "", "",1 + P: "AffectRotationX", "bool", "", "",1 + P: "AffectRotationY", "bool", "", "",1 + P: "AffectRotationZ", "bool", "", "",1 + P: "AffectScalingX", "bool", "", "",0 + P: "AffectScalingY", "bool", "", "",0 + P: "AffectScalingZ", "bool", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 1625692789712, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 1625692796928, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 1625692786896, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + Model: 1624514833712, "Model::ParentA", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2.69830878056614,0,2.18758667935404 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-5.439657582921,34.2250629463,-31.6179832479649 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1.33033428544757,0.760155914838598,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1624514824432, "Model::ParentB", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3.36976014453766,0,1.95187674609402 + P: "Lcl Rotation", "Lcl Rotation", "", "A",32.6247282006729,-20.51492917242,-30.9409494916594 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.83078313526659,1,0.886063896542895 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1624514873152, "Model::Node", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,1.38777878078145e-17,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-2.38541601109764e-15,3.08116234766778e-15,3.27994701525925e-15 + } + Shading: Y + Culling: "CullingOff" + } + Constraint: 1624021849392, "Constraint::Node_parentConstraint1", "Parent-Child" { + Type: "Parent-Child" + MultiLayer: 0 + Properties70: { + P: "Constrained object (Child)", "object", "", "" + P: "ParentA.Weight", "Number", "", "A",100 + P: "ParentA.Offset T", "Translation", "", "A",2.35300269785509,1.91694846782763,-0.379972541704709 + P: "ParentA.Offset R", "Translation", "", "A",-14.4960128761788,-31.7691437688546,34.0874987065544 + P: "ParentB.Weight", "Number", "", "A",100 + P: "ParentB.Offset T", "Translation", "", "A",-4.08166358709878,-1.89871471290918,0.279337980741469 + P: "ParentB.Offset R", "Translation", "", "A",-21.496138217977,32.029366682896,18.6407284879826 + } + } + AnimationStack: 1624716002816, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1625247782512, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::ParentA, Model::RootNode + C: "OO",1624514833712,0 + + ;Model::ParentB, Model::RootNode + C: "OO",1624514824432,0 + + ;Model::Node, Model::RootNode + C: "OO",1624514873152,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1625247782512,1624716002816 + + ;NodeAttribute::, Model::ParentA + C: "OO",1625692789712,1624514833712 + + ;NodeAttribute::, Model::ParentB + C: "OO",1625692796928,1624514824432 + + ;NodeAttribute::, Model::Node + C: "OO",1625692786896,1624514873152 + + ;Model::Node, Constraint::Node_parentConstraint1 + C: "OP",1624514873152,1624021849392, "Constrained object (Child)" + + ;Model::ParentA, Constraint::Node_parentConstraint1 + C: "OP",1624514833712,1624021849392, "Source (Parent)" + + ;Model::ParentB, Constraint::Node_parentConstraint1 + C: "OP",1624514824432,1624021849392, "Source (Parent)" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_dq_weights_10.obj b/modules/ufbx/data/maya_dq_weights_10.obj new file mode 100644 index 0000000..3fb4513 --- /dev/null +++ b/modules/ufbx/data/maya_dq_weights_10.obj @@ -0,0 +1,2726 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -2.942308 -1.645979 2.060003 +v 2.957357 -1.645999 2.036243 +v -3.735829 2.568838 2.888018 +v 3.942693 2.576423 2.532753 +v -3.955499 2.567000 -2.586139 +v 3.729032 2.588827 -2.914231 +v -2.958060 -1.646110 -2.035890 +v 2.941716 -1.646130 -2.061049 +v -2.480623 5.927017 3.324889 +v 3.811298 5.938550 1.404701 +v 2.499530 6.004471 -3.420088 +v -3.892018 5.915206 -1.572748 +v -2.236741 10.492166 2.965042 +v 4.110157 10.365102 -0.471826 +v 2.672819 10.987743 -3.654841 +v -3.772751 10.479312 -0.395096 +v -2.224297 14.195909 2.724784 +v 4.088787 14.006660 0.135881 +v 2.604279 14.377494 -3.063904 +v -3.596652 14.184427 -0.235774 +v 6.222870 10.777702 -3.112823 +v 5.530798 13.168728 -4.588817 +v 6.323199 14.456811 -2.890776 +v 7.025758 12.112736 -1.391827 +v 9.628867 10.992020 -4.739834 +v 9.053675 13.113451 -6.029036 +v 9.693559 14.207652 -4.484430 +v 10.290091 12.080390 -3.215068 +v 12.483238 11.514514 -5.261503 +v 11.913033 13.598451 -6.489098 +v 11.137695 14.329642 -4.892626 +v 11.705301 12.252883 -3.651711 +v 16.237712 13.299865 -4.012707 +v 15.659374 15.378415 -5.245567 +v 14.792349 16.092414 -3.635073 +v 15.370686 14.013862 -2.402213 +v 17.484695 14.340513 -3.492432 +v 17.056296 15.880180 -4.405662 +v 16.414054 16.409068 -3.212702 +v 16.842452 14.869401 -2.299472 +v -1.731390 15.654716 1.886210 +v 1.109058 15.622864 0.598963 +v 0.202613 15.638815 -1.356327 +v -2.642500 15.647091 -0.079311 +v -3.904725 14.191019 1.705382 +v 4.205819 12.955216 -4.256884 +v 5.730592 11.746225 -4.164183 +v 5.091975 10.565690 -2.355731 +v 4.910467 14.625579 -2.673138 +v 5.794606 14.230523 -4.022432 +v 4.109606 14.461552 -1.475324 +v 5.887017 12.594676 -0.580906 +v 6.798781 13.552664 -1.874977 +v 6.755551 10.997727 -1.972391 +v 7.313873 13.160228 -5.276785 +v 9.231798 11.851842 -5.671779 +v 7.940283 10.909591 -3.939299 +v 8.062497 14.328698 -3.663526 +v 9.261479 14.045307 -5.489206 +v 8.690190 12.079573 -2.325498 +v 10.104757 13.336899 -3.577540 +v 10.070052 11.139912 -3.763695 +v 10.273692 13.123096 -6.527865 +v 12.363335 12.435887 -6.156115 +v 10.841581 11.039500 -5.285894 +v 10.563045 14.108750 -5.001830 +v 11.416197 14.331366 -5.931004 +v 11.097939 12.002644 -3.782331 +v 11.303950 13.423409 -3.994233 +v 12.204677 11.498704 -4.246846 +v 13.795541 14.495250 -5.860219 +v 16.106183 14.209323 -4.921954 +v 14.373911 12.416766 -4.627263 +v 12.930924 15.209172 -4.250985 +v 15.120707 16.113333 -4.664476 +v 13.509033 13.130878 -3.017585 +v 14.923876 15.182955 -2.725827 +v 15.909350 13.278946 -2.983303 +v 16.718879 15.859945 -4.850115 +v 17.278597 13.848318 -3.656951 +v 15.879770 16.550954 -3.291475 +v 16.439488 14.539325 -2.098310 +v 2.360393 15.151982 0.503304 +v -2.044602 15.218359 2.468862 +v 1.116604 15.222067 -2.179330 +v -3.288251 15.207953 -0.214043 +v 0.005019 -2.079033 2.590697 +v 3.868607 0.098679 2.587539 +v 0.122752 2.568698 3.740642 +v -3.809993 0.093763 2.712032 +v -0.271275 15.743124 1.503069 +v 0.849628 15.720144 -0.455124 +v -1.401870 15.740408 -0.935896 +v -2.508821 15.747108 1.052281 +v -0.092511 2.566897 -3.755007 +v 3.793822 0.102541 -2.734657 +v -0.004764 -2.079115 -2.591107 +v -3.864310 0.093308 -2.635342 +v 3.723954 -2.079104 -0.015701 +v -3.724257 -2.079049 0.014327 +v 5.217455 2.591048 -0.259586 +v -5.238907 2.568053 0.206818 +v 3.821354 4.333635 2.178192 +v 1.008051 5.927960 3.235487 +v -3.266959 4.322074 3.044398 +v 3.234386 4.366870 -3.123150 +v 4.312257 6.037664 -1.227776 +v -3.825825 4.317397 -2.346310 +v -0.858857 5.925631 -3.380222 +v -4.383593 5.921431 1.129300 +v 3.776335 8.113084 0.435549 +v 1.083921 10.490575 2.185473 +v -2.167552 8.107268 3.241825 +v 2.175471 8.353875 -3.510230 +v 3.924619 10.544854 -3.074570 +v -3.888530 8.092867 -0.817863 +v -1.031704 10.491231 -2.415514 +v -4.094097 10.486630 1.770269 +v 4.181295 12.467788 0.440690 +v 0.834718 14.192095 1.994504 +v -2.282559 12.582996 2.825212 +v 17.429464 15.076024 -4.081486 +v 16.753320 16.382387 -3.904827 +v 16.618271 15.744046 -2.574696 +v 17.294416 14.437683 -2.751355 +v -3.705349 12.571089 -0.251347 +v -1.057903 14.193201 -2.088295 +v 2.293238 12.713325 -3.636060 +v 0.031322 0.054452 3.650420 +v -0.953801 15.911264 0.336887 +v -0.016832 0.054049 -3.655101 +v -0.000008 -2.839439 -0.000036 +v 5.217000 0.065331 -0.114084 +v -5.233451 0.054302 0.060661 +v 0.357808 4.322812 3.632017 +v 4.816636 4.369588 -0.547310 +v -0.310728 4.323738 -3.686417 +v -4.852990 4.319867 0.478765 +v 1.195892 8.107233 2.663933 +v 3.927168 8.362382 -2.187160 +v -1.207392 8.102715 -2.836351 +v -4.148574 8.100731 1.590407 +v 0.995444 12.579751 2.048216 +v 17.154670 15.471923 -3.285109 +v -0.994941 12.574171 -2.245530 +v -4.070800 12.577956 1.783557 +v 4.540913 11.539118 -3.708623 +v 4.292724 13.896648 -3.964053 +v 5.582138 13.845819 -1.353921 +v 5.675300 11.154676 -1.000976 +v 7.494065 11.821169 -4.908318 +v 7.573638 14.152045 -4.715144 +v 8.512435 13.417594 -2.701764 +v 8.429935 11.084951 -2.888810 +v 10.635746 11.908143 -6.235454 +v 10.312725 13.972201 -6.027570 +v 10.715782 13.165129 -4.153772 +v 11.101910 11.145245 -4.316782 +v 14.243181 13.327856 -5.534132 +v 13.257940 15.229428 -5.280874 +v 13.062369 14.300297 -3.340714 +v 14.046550 12.395385 -3.599106 +v 17.158485 14.731343 -4.535488 +v 16.204033 16.575412 -4.286115 +v 16.013397 15.674324 -2.408495 +v 16.967848 13.830254 -2.657868 +v 0.344105 15.220545 1.959626 +v 2.525042 15.163551 -1.076551 +v -1.351213 15.215606 -1.697589 +v -3.441702 15.222522 1.486749 +v -1.878099 -1.054859 3.082462 +v 1.910345 -1.054811 3.059026 +v 2.230916 1.354436 3.418190 +v -2.084803 1.350833 3.544210 +v -1.440457 15.832523 1.307649 +v 0.221022 15.819754 0.552340 +v -0.348956 15.823826 -0.677200 +v -2.012164 15.830456 0.074334 +v -2.193249 1.349926 -3.483761 +v 2.093307 1.349824 -3.544591 +v 1.876272 -1.055096 -3.083832 +v -1.900666 -1.055047 -3.069642 +v -1.893423 -2.469095 -1.310552 +v 1.889128 -2.469096 -1.317397 +v 1.892772 -2.469066 1.311628 +v -1.888984 -2.469058 1.317347 +v 4.424559 -1.049513 1.252141 +v 4.406069 -1.055142 -1.352862 +v 4.943672 1.366522 -1.643338 +v 5.012637 1.362472 1.322416 +v -4.429482 -1.054994 -1.278614 +v -4.412160 -1.054849 1.340964 +v -4.956713 1.350782 1.613238 +v -5.024159 1.350218 -1.401123 +v -1.808484 3.521278 3.586769 +v 2.245371 3.524452 3.291326 +v 2.406785 5.088773 2.881204 +v -1.175502 5.087177 3.613558 +v 4.793510 3.541654 1.109284 +v 4.611608 3.558788 -1.838110 +v 4.068796 5.166559 -2.163486 +v 4.469004 5.123410 0.641212 +v 1.836949 3.533095 -3.602527 +v -2.236836 3.517694 -3.356596 +v -2.382916 5.077073 -3.027348 +v 1.329323 5.103459 -3.630972 +v -4.823369 3.518973 -1.200277 +v -4.591851 3.520910 1.851566 +v -4.061298 5.084364 2.126753 +v -4.536272 5.080390 -0.795646 +v -0.559116 6.958569 3.429195 +v 2.706381 6.955408 2.086028 +v 2.757546 9.305812 1.396619 +v -0.588580 9.309421 2.994694 +v 4.227609 7.027622 -0.428894 +v 3.428458 7.139189 -2.810289 +v 3.325452 9.752693 -3.282771 +v 4.098530 9.342743 -1.452996 +v 0.578285 6.989033 -3.558111 +v -2.781871 6.939968 -2.242469 +v -2.703546 9.291723 -1.668213 +v 0.668965 9.396625 -3.264481 +v -4.377423 6.946895 0.110497 +v -3.491020 6.954313 2.597786 +v -3.386533 9.306022 2.614602 +v -4.272579 9.298607 0.607552 +v -0.712388 11.589643 2.687359 +v 2.774153 11.572606 1.226709 +v 2.666336 13.442593 1.204871 +v -0.765750 13.457886 2.585107 +v 17.434048 14.778900 -3.395686 +v 17.159484 15.765688 -3.980982 +v 16.747865 16.104656 -3.216405 +v 17.022429 15.117868 -2.631108 +v 0.777825 11.634543 -3.096722 +v -2.580811 11.574009 -1.352986 +v -2.545271 13.442994 -1.253825 +v 0.740238 13.496738 -2.949771 +v -4.217268 11.580328 0.796645 +v -3.420278 11.586997 2.529241 +v -3.371533 13.455426 2.460480 +v -4.134159 13.449043 0.813075 +v 4.377077 10.533646 -2.706701 +v 3.779613 11.824640 -4.003758 +v 4.912158 12.419396 -4.239423 +v 5.318710 11.068472 -3.370391 +v 3.380816 12.503933 -4.147636 +v 3.524150 13.958459 -3.694746 +v 5.323241 14.508041 -3.355633 +v 4.916024 13.724982 -4.228040 +v 4.480761 14.591469 -2.074541 +v 5.203564 13.445001 -0.523425 +v 6.342876 13.026179 -1.174303 +v 5.929597 14.195951 -2.057538 +v 5.215348 12.718873 -0.055245 +v 5.056740 11.125720 -0.532456 +v 5.909244 10.702512 -2.106885 +v 6.357389 11.532608 -1.145849 +v 6.781122 11.213885 -4.058173 +v 6.426073 12.484455 -4.815080 +v 8.267524 12.492662 -5.574358 +v 8.605219 11.297128 -4.877757 +v 6.471083 13.762746 -4.716086 +v 6.893651 14.427310 -3.810556 +v 8.697308 14.310272 -4.625312 +v 8.308826 13.693937 -5.482192 +v 7.412571 14.027842 -2.701135 +v 7.767847 12.773338 -1.943626 +v 9.512475 12.738634 -2.873031 +v 9.181363 13.930440 -3.579005 +v 7.727089 11.478959 -2.033558 +v 7.302876 10.810290 -2.942666 +v 9.080929 10.916414 -3.829024 +v 9.471070 11.531542 -2.974959 +v 10.029155 11.344789 -5.520863 +v 9.707843 12.490509 -6.198158 +v 11.374147 12.709054 -6.597493 +v 11.700160 11.578045 -5.925348 +v 9.718412 13.628435 -6.124390 +v 9.984291 14.174117 -5.329117 +v 10.694979 14.187368 -5.607795 +v 10.965589 13.751208 -6.470086 +v 10.415842 13.822297 -4.284940 +v 10.700442 12.654289 -3.628002 +v 10.981798 12.576817 -3.904474 +v 10.830954 13.744089 -4.597654 +v 10.737438 11.514393 -3.727401 +v 10.477868 10.945625 -4.564555 +v 11.687563 11.101579 -4.901464 +v 11.428889 11.541581 -4.038293 +v 13.370733 12.321519 -5.455550 +v 13.049904 13.449742 -6.134828 +v 15.035878 14.395522 -5.471904 +v 15.351336 13.261767 -4.799437 +v 12.531422 14.467572 -5.996861 +v 12.068282 14.858618 -5.120313 +v 14.037368 15.800448 -4.456130 +v 14.510293 15.410994 -5.334583 +v 11.967829 14.365000 -4.084133 +v 12.280880 13.232360 -3.408656 +v 14.247848 14.170492 -2.749714 +v 13.932391 15.304247 -3.422184 +v 12.803871 12.213786 -3.549989 +v 13.266479 11.819819 -4.431215 +v 15.246358 12.765566 -3.765489 +v 14.773435 13.155020 -2.887036 +v 16.859607 13.975394 -4.303824 +v 16.544151 15.109149 -4.976293 +v 17.192092 15.423408 -4.573349 +v 17.466656 14.436621 -3.988052 +v 16.018561 16.124621 -4.838970 +v 15.545641 16.514075 -3.960518 +v 16.320586 16.650915 -3.688614 +v 16.732203 16.311946 -4.453193 +v 15.440661 16.017874 -2.926571 +v 15.756119 14.884120 -2.254101 +v 16.503295 15.229951 -2.198614 +v 16.228729 16.216738 -2.783910 +v 16.281705 13.868647 -2.391423 +v 16.754629 13.479193 -3.269876 +v 17.374801 14.002445 -3.083348 +v 16.963182 14.341413 -2.318770 +v -0.841503 14.782608 2.500157 +v 2.056505 14.760569 1.232065 +v 0.989488 15.500823 1.260272 +v -0.961936 15.522476 2.150868 +v 3.486232 14.727240 -0.544148 +v 2.784259 14.866896 -2.057471 +v 1.274438 15.492596 -1.389478 +v 1.862439 15.460953 -0.121251 +v 0.329127 14.799195 -2.494002 +v -2.533323 14.768450 -1.149579 +v -2.346064 15.513710 -0.835069 +v -0.390694 15.512447 -1.717007 +v -3.857035 14.774040 0.730866 +v -3.131968 14.780108 2.295038 +v -2.602268 15.523056 1.876703 +v -3.197672 15.518073 0.592247 +v 0.012641 -1.133426 3.298891 +v 2.134918 0.074150 3.374893 +v 0.081231 1.350973 3.754928 +v -2.067583 0.074074 3.422830 +v -0.619582 15.868604 0.981044 +v -0.054379 15.861592 -0.066270 +v -1.228611 15.867762 -0.332776 +v -1.790297 15.871033 0.722099 +v -0.037348 1.349980 -3.768511 +v 2.070579 0.073612 -3.423209 +v -0.008112 -1.133599 -3.300533 +v -2.116381 0.073666 -3.395356 +v -0.001133 -2.648656 -1.412996 +v 2.031654 -2.648651 -0.002575 +v 0.001095 -2.648638 1.412864 +v -2.031647 -2.648642 0.002607 +v 4.733114 -1.127178 -0.057984 +v 4.852372 0.084219 -1.543055 +v 5.325787 1.367146 -0.183881 +v 4.893446 0.081725 1.353592 +v -4.741630 -1.133473 0.031419 +v -4.866463 0.074075 1.513775 +v -5.348179 1.350504 0.114417 +v -4.900424 0.073791 -1.402444 +v 0.212715 3.520999 3.711408 +v 2.286170 4.325195 3.148670 +v 0.605283 5.086693 3.488326 +v -1.556363 4.322557 3.605400 +v 5.037528 3.553890 -0.382152 +v 4.358095 4.377281 -1.978302 +v 4.576937 5.155177 -0.783281 +v 4.630992 4.349823 0.921535 +v -0.178044 3.517729 -3.733909 +v -2.308340 4.316264 -3.212831 +v -0.518742 5.086771 -3.577157 +v 1.623907 4.337148 -3.624188 +v -5.064127 3.519824 0.327542 +v -4.333372 4.321449 1.987705 +v -4.627723 5.082292 0.694071 +v -4.675561 4.318585 -1.042089 +v 1.184495 6.957440 2.950692 +v 2.730395 8.104532 1.716353 +v 1.147034 9.309526 2.395565 +v -0.531363 8.108410 3.218292 +v 4.086323 7.121786 -1.744025 +v 3.303324 8.396724 -3.042326 +v 3.865282 9.594854 -2.623351 +v 4.135096 8.187705 -0.934105 +v -1.166763 6.951236 -3.102806 +v -2.772851 8.089653 -1.928540 +v -1.124995 9.307651 -2.600685 +v 0.544136 8.164919 -3.403850 +v -4.237589 6.950599 1.388289 +v -3.402194 8.104467 2.637521 +v -4.105244 9.302508 1.719720 +v -4.319911 8.096786 0.409372 +v 1.041524 11.588296 2.093111 +v 2.719151 12.562470 1.260911 +v 0.942249 13.452732 2.012387 +v -0.742187 12.583482 2.622381 +v 17.342984 15.274290 -3.706651 +v 16.974345 15.986531 -3.610335 +v 16.900714 15.638502 -2.885134 +v 17.269356 14.926261 -2.981452 +v -0.995243 11.582673 -2.310200 +v -2.555899 12.568304 -1.290310 +v -1.001807 13.453495 -2.181371 +v 0.722401 12.604661 -3.051515 +v -4.090382 11.583891 1.787122 +v -3.413701 12.580973 2.498693 +v -4.015467 13.452456 1.757383 +v -4.189400 12.574482 0.819651 +v 4.088319 11.197771 -3.585495 +v 4.331689 12.266929 -4.095219 +v 5.073712 11.690634 -3.894635 +v 4.824002 10.875563 -3.037153 +v 3.377451 13.146303 -4.011721 +v 4.516846 14.376216 -3.482947 +v 5.076178 14.197333 -3.885003 +v 4.209059 13.483794 -4.176565 +v 5.013035 14.042467 -1.116660 +v 5.785503 13.225961 -0.872257 +v 6.151344 13.688897 -1.583745 +v 5.298478 14.350520 -1.914904 +v 5.175380 12.009356 -0.141250 +v 5.420713 10.700158 -1.580648 +v 6.171696 11.003956 -1.544378 +v 5.840496 11.788808 -0.645891 +v 6.568059 11.794699 -4.512780 +v 7.353802 12.491749 -5.192981 +v 8.411549 11.839007 -5.308636 +v 7.696318 11.262002 -4.464897 +v 6.652544 14.200125 -4.326910 +v 7.806332 14.369276 -4.213542 +v 8.475059 14.101168 -5.112815 +v 7.398801 13.729248 -5.095980 +v 7.618936 13.462113 -2.260870 +v 8.649866 12.750893 -2.409364 +v 9.379191 13.385279 -3.155611 +v 8.307649 13.977207 -3.138885 +v 7.544992 11.038581 -2.424128 +v 8.196894 10.868495 -3.389125 +v 9.303644 11.123912 -3.344445 +v 8.605428 11.506600 -2.511110 +v 9.866480 11.866177 -5.945342 +v 10.344177 12.514662 -6.445537 +v 11.602137 12.118099 -6.334812 +v 10.675326 11.378526 -5.777508 +v 9.835137 13.998738 -5.784801 +v 10.400301 14.156717 -5.529329 +v 10.802489 14.063639 -6.094488 +v 10.271526 13.628054 -6.360224 +v 10.497120 13.231981 -3.938486 +v 10.880357 12.558031 -3.885090 +v 10.800796 13.179802 -4.168914 +v 10.749723 13.776021 -4.509181 +v 10.632703 11.126232 -4.102722 +v 11.002341 10.977472 -4.781171 +v 11.591332 11.226477 -4.418088 +v 11.106282 11.481345 -3.980420 +v 13.252690 12.856532 -5.864123 +v 14.045100 13.925670 -5.799279 +v 15.233016 13.796191 -5.208874 +v 14.361500 12.793435 -5.124690 +v 12.273484 14.756300 -5.616738 +v 13.048997 15.329161 -4.787052 +v 14.247541 15.700202 -4.951395 +v 13.519960 14.940620 -5.663048 +v 12.086449 13.830903 -3.674286 +v 13.260234 13.700240 -3.079249 +v 14.050709 14.769825 -3.012742 +v 12.944012 14.834656 -3.750244 +v 13.062132 11.921863 -3.935653 +v 14.256001 12.295085 -4.094123 +v 15.036184 12.865814 -3.270222 +v 13.784473 12.684925 -3.215672 +v 16.741289 14.509818 -4.713261 +v 16.964172 15.309803 -4.790766 +v 17.377920 14.907560 -4.341329 +v 17.269405 14.212789 -4.140089 +v 15.755812 16.413829 -4.455781 +v 15.997414 16.670374 -3.807751 +v 16.516542 16.571807 -4.116274 +v 16.455009 16.293541 -4.657734 +v 15.558980 15.483452 -2.517130 +v 16.200950 15.092667 -2.155437 +v 16.344494 15.758589 -2.421748 +v 15.895715 16.189679 -2.806112 +v 16.544455 13.579441 -2.774610 +v 17.167708 13.732095 -3.138452 +v 17.205874 14.094342 -2.646805 +v 16.710111 14.108927 -2.288469 +v 0.620895 14.777398 1.998964 +v 1.507929 15.196037 1.296731 +v 0.048195 15.535088 1.811499 +v -0.900021 15.223293 2.381425 +v 3.338354 14.782542 -1.309053 +v 2.005941 15.208742 -1.742718 +v 1.696943 15.488797 -0.803727 +v 2.659485 15.153922 -0.333266 +v -1.201360 14.774706 -1.932067 +v -2.481841 15.210055 -1.031008 +v -1.430541 15.530178 -1.378502 +v -0.079390 15.217619 -2.127318 +v -3.720388 14.777266 1.617660 +v -2.909520 15.220845 2.129264 +v -3.048353 15.538097 1.303189 +v -3.588075 15.215167 0.665428 +v -1.743146 -1.935919 2.416585 +v 1.756583 -1.935930 2.406432 +v 3.484948 -0.976290 2.378096 +v 3.980424 1.356942 2.621964 +v 2.248833 2.572712 3.353697 +v -1.981370 2.568779 3.561100 +v -3.867725 1.350902 2.833437 +v -3.454491 -0.976271 2.428327 +v -1.113705 15.715850 1.796125 +v 0.545774 15.700166 1.039973 +v 1.056270 15.686065 0.143346 +v 0.522297 15.696826 -1.008478 +v -0.511489 15.706792 -1.240733 +v -2.173628 15.710240 -0.490406 +v -2.675732 15.713068 0.424243 +v -2.137329 15.717575 1.585732 +v -2.208456 2.566879 -3.435862 +v 1.993039 2.577260 -3.571986 +v 3.857657 1.363571 -2.854513 +v 3.449878 -0.976584 -2.433516 +v 1.744721 -1.936030 -2.416287 +v -1.755053 -1.936019 -2.408746 +v -3.482822 -0.976508 -2.385657 +v -3.979970 1.349962 -2.677870 +v 3.463532 -1.936043 -1.229362 +v 3.472713 -1.935966 1.200979 +v -3.463206 -1.935917 1.229446 +v -3.473196 -1.936001 -1.199342 +v 4.815126 2.593465 -1.724920 +v 4.930122 2.583701 1.241091 +v -4.817737 2.568629 1.708149 +v -4.949385 2.567527 -1.312641 +v 3.879511 3.530673 2.396363 +v 3.769517 5.097195 1.922857 +v 2.554578 5.927712 2.529486 +v -0.758549 5.928506 3.576966 +v -2.938828 5.085755 3.143317 +v -3.529689 3.521202 2.963027 +v 3.518002 3.551831 -3.006059 +v 2.940926 5.141599 -3.212792 +v 3.722860 6.052047 -2.481714 +v 4.331433 5.980500 0.149626 +v -3.887555 3.518207 -2.500793 +v -3.803161 5.078523 -2.082508 +v -2.658708 5.912605 -2.616572 +v 0.839823 5.947522 -3.655261 +v -3.700381 5.924563 2.441470 +v -4.438778 5.918384 -0.356479 +v 3.805694 6.968916 0.902655 +v 3.784656 9.269584 -0.057342 +v 2.791524 10.483036 1.213615 +v -0.664687 10.491749 2.801402 +v -2.187633 9.308547 3.099343 +v -2.238806 6.957187 3.339375 +v 2.229214 7.085212 -3.500045 +v 2.289102 9.669741 -3.536331 +v 3.546160 10.804235 -3.454383 +v 4.272125 10.130557 -1.845631 +v -3.920952 6.943110 -1.144067 +v -3.829340 9.294809 -0.571782 +v -2.629126 10.476372 -1.468204 +v 0.792306 10.575590 -3.153731 +v -3.404361 10.489899 2.567185 +v -4.238518 10.482919 0.732738 +v 4.188492 11.496258 0.252636 +v 4.149994 13.277414 0.385127 +v 2.489495 14.187983 1.164922 +v -0.794345 14.196413 2.552400 +v -2.267255 13.457414 2.781424 +v -2.271395 11.589106 2.879239 +v 17.503990 14.630714 -3.766866 +v 17.249872 15.544017 -4.308577 +v 16.937805 16.146953 -4.227043 +v 16.556839 16.460680 -3.519400 +v 16.494508 16.166060 -2.905494 +v 16.748626 15.252757 -2.363783 +v 17.060694 14.649821 -2.445318 +v 17.441660 14.336094 -3.152960 +v -3.735811 11.576851 -0.297156 +v -3.664907 13.445717 -0.236734 +v -2.540978 14.181798 -1.215584 +v 0.660292 14.233642 -2.780754 +v 2.358574 13.570440 -3.477289 +v 2.381229 11.857381 -3.665498 +v -3.281883 14.193938 2.397588 +v -4.030441 14.187674 0.782738 +v 3.480069 12.439420 -4.218402 +v 4.850274 13.123523 -4.369310 +v 5.579033 12.464280 -4.486969 +v 5.953583 11.150590 -3.688300 +v 5.607636 10.701943 -2.752688 +v 4.619923 10.343308 -1.754776 +v 3.961926 14.625173 -2.895110 +v 5.632229 14.540802 -2.693682 +v 6.043162 14.482202 -3.490046 +v 5.610073 13.760254 -4.418265 +v 3.566648 14.589674 -2.301550 +v 4.314596 14.197110 -0.690842 +v 5.231245 13.102141 -0.167706 +v 6.430009 12.230746 -0.989078 +v 6.963719 12.874179 -1.523052 +v 6.590016 14.095033 -2.320555 +v 6.503531 10.747071 -2.512249 +v 6.943255 11.471463 -1.569702 +v 6.384218 13.171357 -4.903186 +v 8.228715 13.141355 -5.658582 +v 9.080017 12.489990 -5.925326 +v 9.400831 11.328501 -5.232767 +v 8.834869 10.958651 -4.360045 +v 7.036234 10.849986 -3.513108 +v 7.159296 14.388662 -3.242255 +v 8.943748 14.270750 -4.089893 +v 9.462528 14.245602 -5.012387 +v 9.119633 13.646921 -5.860889 +v 7.813256 12.075930 -1.847922 +v 9.551913 12.087421 -2.793351 +v 10.244234 12.712839 -3.294472 +v 9.925295 13.879659 -3.978921 +v 9.866551 10.943148 -4.233410 +v 10.219266 11.537100 -3.397489 +v 9.664685 13.108637 -6.285631 +v 11.168983 13.289064 -6.661675 +v 12.160320 13.031064 -6.423394 +v 12.475557 11.897184 -5.751032 +v 11.732284 11.206485 -5.428553 +v 10.248897 11.008977 -5.040251 +v 10.177246 14.130807 -4.802739 +v 10.675395 14.088590 -5.082163 +v 11.234689 14.444628 -5.427244 +v 11.650868 14.043453 -6.298838 +v 10.782761 12.048037 -3.538875 +v 11.212529 12.001967 -3.843585 +v 11.461785 12.825593 -3.710211 +v 11.170762 13.957297 -4.397600 +v 12.372716 11.383127 -4.748192 +v 11.968347 11.800350 -3.855081 +v 12.804530 14.022325 -6.192667 +v 14.786208 14.965285 -5.532486 +v 15.909043 14.808654 -5.184986 +v 16.224500 13.674899 -4.512517 +v 15.364546 12.886734 -4.299626 +v 13.382682 11.943539 -4.960116 +v 11.953242 14.739104 -4.584864 +v 13.919183 15.679282 -3.921992 +v 14.910533 16.213580 -4.169211 +v 15.383456 15.824126 -5.047663 +v 12.530003 12.661557 -3.349573 +v 14.497520 13.600732 -2.689131 +v 15.121013 14.583623 -2.462795 +v 14.805556 15.717379 -3.135264 +v 16.119521 13.178698 -3.478569 +v 15.646598 13.568152 -2.600117 +v 16.294479 15.678912 -5.036873 +v 16.959931 15.914692 -4.629005 +v 17.463787 14.103833 -3.554922 +v 16.872817 13.600361 -3.804013 +v 15.427453 16.392911 -3.426377 +v 16.204569 16.536736 -3.225922 +v 16.005792 14.314359 -2.193519 +v 16.708423 14.725877 -2.151839 +v 3.125654 14.716585 0.339279 +v 1.662447 15.456266 0.589045 +v -1.895142 15.507326 2.197239 +v -2.152200 14.782056 2.632653 +v 1.767613 14.851457 -2.589365 +v 0.580958 15.490868 -1.743724 +v -3.481487 14.770933 -0.234997 +v -2.985238 15.498205 -0.154409 +vt 0.375000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.125000 0.250000 +vt 0.625000 0.500000 +vt 0.875000 0.250000 +vt 0.375000 0.750000 +vt 0.125000 0.000000 +vt 0.625000 0.750000 +vt 0.875000 0.000000 +vt 0.414062 0.289062 +vt 0.585938 0.289062 +vt 0.585938 0.460938 +vt 0.414062 0.460938 +vt 0.414062 0.289062 +vt 0.598250 0.276750 +vt 0.598250 0.473250 +vt 0.414062 0.460938 +vt 0.414062 0.289062 +vt 0.598250 0.276750 +vt 0.598250 0.473250 +vt 0.414062 0.460938 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.289062 +vt 0.625000 0.311343 +vt 0.625000 0.438657 +vt 0.625000 0.438657 +vt 0.625000 0.311343 +vt 0.436343 0.311343 +vt 0.563657 0.311343 +vt 0.563657 0.438657 +vt 0.436343 0.438657 +vt 0.500000 0.122070 +vt 0.500000 0.375000 +vt 0.500000 0.627930 +vt 0.500000 0.875000 +vt 0.750000 0.125000 +vt 0.250000 0.125000 +vt 0.500000 0.253906 +vt 0.618164 0.375000 +vt 0.500000 0.496094 +vt 0.381836 0.375000 +vt 0.500176 0.257637 +vt 0.617539 0.375000 +vt 0.500176 0.492363 +vt 0.382812 0.375000 +vt 0.500352 0.254531 +vt 0.625000 0.375000 +vt 0.500352 0.495469 +vt 0.382812 0.375000 +vt 0.624375 0.375000 +vt 0.621445 0.492539 +vt 0.624375 0.375000 +vt 0.621445 0.257461 +vt 0.625000 0.375000 +vt 0.625000 0.492188 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.375000 +vt 0.625000 0.492188 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.375000 +vt 0.625000 0.492188 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.375000 +vt 0.625000 0.488498 +vt 0.625000 0.375000 +vt 0.625000 0.261502 +vt 0.500176 0.261326 +vt 0.613850 0.375000 +vt 0.500176 0.488674 +vt 0.386502 0.375000 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.625000 0.124512 +vt 0.500000 0.217773 +vt 0.375000 0.124512 +vt 0.500000 0.294596 +vt 0.580404 0.375000 +vt 0.500000 0.455404 +vt 0.419596 0.375000 +vt 0.500000 0.532227 +vt 0.625000 0.625000 +vt 0.875000 0.125000 +vt 0.500000 0.750000 +vt 0.375000 0.625000 +vt 0.125000 0.125000 +vt 0.625000 0.875000 +vt 0.750000 0.000000 +vt 0.375000 0.875000 +vt 0.250000 0.000000 +vt 0.750000 0.250000 +vt 0.625000 0.375000 +vt 0.250000 0.250000 +vt 0.375000 0.375000 +vt 0.588867 0.285645 +vt 0.500000 0.257812 +vt 0.411133 0.285645 +vt 0.588867 0.464355 +vt 0.617188 0.375000 +vt 0.411133 0.464355 +vt 0.500000 0.492188 +vt 0.382812 0.375000 +vt 0.586992 0.288008 +vt 0.501055 0.256270 +vt 0.414062 0.289062 +vt 0.586992 0.461992 +vt 0.620273 0.375000 +vt 0.414062 0.460938 +vt 0.501055 0.493730 +vt 0.382812 0.375000 +vt 0.588047 0.254727 +vt 0.501055 0.256270 +vt 0.414062 0.289062 +vt 0.625000 0.375000 +vt 0.625000 0.455404 +vt 0.625000 0.375000 +vt 0.625000 0.294596 +vt 0.414062 0.460938 +vt 0.501055 0.493730 +vt 0.588047 0.495273 +vt 0.382812 0.375000 +vt 0.622637 0.461992 +vt 0.625000 0.375000 +vt 0.622637 0.288008 +vt 0.622637 0.461992 +vt 0.625000 0.492188 +vt 0.620273 0.375000 +vt 0.622637 0.288008 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.460938 +vt 0.625000 0.375000 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.492188 +vt 0.625000 0.289062 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.460938 +vt 0.625000 0.375000 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.492188 +vt 0.625000 0.289062 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.460938 +vt 0.625000 0.375000 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.492188 +vt 0.625000 0.289062 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.458171 +vt 0.625000 0.291829 +vt 0.625000 0.458171 +vt 0.625000 0.291829 +vt 0.584225 0.290775 +vt 0.416829 0.291829 +vt 0.584225 0.459225 +vt 0.416829 0.458171 +vt 0.437500 0.062500 +vt 0.562500 0.062500 +vt 0.562500 0.179688 +vt 0.437500 0.179688 +vt 0.459201 0.334201 +vt 0.540799 0.334201 +vt 0.540799 0.415799 +vt 0.459201 0.415799 +vt 0.437500 0.570312 +vt 0.562500 0.570312 +vt 0.562500 0.687500 +vt 0.437500 0.687500 +vt 0.437500 0.812500 +vt 0.562500 0.812500 +vt 0.562500 0.937500 +vt 0.437500 0.937500 +vt 0.687500 0.062500 +vt 0.812500 0.062500 +vt 0.812500 0.187500 +vt 0.687500 0.187500 +vt 0.187500 0.062500 +vt 0.312500 0.062500 +vt 0.312500 0.187500 +vt 0.187500 0.187500 +vt 0.445312 0.250000 +vt 0.554688 0.250000 +vt 0.546875 0.265625 +vt 0.453125 0.265625 +vt 0.617188 0.320312 +vt 0.617188 0.429688 +vt 0.609375 0.421875 +vt 0.609375 0.328125 +vt 0.554688 0.500000 +vt 0.445312 0.500000 +vt 0.453125 0.484375 +vt 0.546875 0.484375 +vt 0.382812 0.429688 +vt 0.382812 0.320312 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.453125 0.265625 +vt 0.546875 0.265625 +vt 0.549688 0.262812 +vt 0.453125 0.265625 +vt 0.609375 0.328125 +vt 0.609375 0.421875 +vt 0.612188 0.424688 +vt 0.612188 0.325312 +vt 0.546875 0.484375 +vt 0.453125 0.484375 +vt 0.453125 0.484375 +vt 0.549688 0.487188 +vt 0.390625 0.421875 +vt 0.390625 0.328125 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.453125 0.265625 +vt 0.549688 0.255000 +vt 0.549688 0.255000 +vt 0.453125 0.265625 +vt 0.625000 0.334201 +vt 0.625000 0.415799 +vt 0.625000 0.415799 +vt 0.625000 0.334201 +vt 0.549688 0.495000 +vt 0.453125 0.484375 +vt 0.453125 0.484375 +vt 0.549688 0.495000 +vt 0.390625 0.421875 +vt 0.390625 0.328125 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.620000 0.325312 +vt 0.620000 0.424688 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.612188 0.487188 +vt 0.612188 0.487188 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.620000 0.424688 +vt 0.620000 0.325312 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.612188 0.262812 +vt 0.612188 0.262812 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.415799 +vt 0.625000 0.334201 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.470486 +vt 0.625000 0.470486 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.334201 +vt 0.625000 0.415799 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.279514 +vt 0.625000 0.279514 +vt 0.453125 0.265625 +vt 0.549688 0.262812 +vt 0.540799 0.279514 +vt 0.459201 0.279514 +vt 0.612188 0.325312 +vt 0.612188 0.424688 +vt 0.595486 0.415799 +vt 0.595486 0.334201 +vt 0.549688 0.487188 +vt 0.453125 0.484375 +vt 0.459201 0.470486 +vt 0.540799 0.470486 +vt 0.390625 0.421875 +vt 0.390625 0.328125 +vt 0.404514 0.334201 +vt 0.404514 0.415799 +vt 0.500000 0.062500 +vt 0.562500 0.123047 +vt 0.500000 0.175781 +vt 0.437500 0.123047 +vt 0.500000 0.331163 +vt 0.543837 0.375000 +vt 0.500000 0.418837 +vt 0.456163 0.375000 +vt 0.500000 0.574219 +vt 0.562500 0.626953 +vt 0.500000 0.687500 +vt 0.437500 0.626953 +vt 0.500000 0.812500 +vt 0.562500 0.875000 +vt 0.500000 0.937500 +vt 0.437500 0.875000 +vt 0.750000 0.062500 +vt 0.812500 0.125000 +vt 0.750000 0.187500 +vt 0.687500 0.125000 +vt 0.250000 0.062500 +vt 0.312500 0.125000 +vt 0.250000 0.187500 +vt 0.187500 0.125000 +vt 0.500000 0.242188 +vt 0.548828 0.261719 +vt 0.500000 0.257812 +vt 0.451172 0.261719 +vt 0.621094 0.375000 +vt 0.611328 0.423828 +vt 0.617188 0.375000 +vt 0.611328 0.326172 +vt 0.500000 0.507812 +vt 0.451172 0.488281 +vt 0.500000 0.492188 +vt 0.548828 0.488281 +vt 0.378906 0.375000 +vt 0.388672 0.326172 +vt 0.382812 0.375000 +vt 0.388672 0.423828 +vt 0.500000 0.257812 +vt 0.547578 0.264922 +vt 0.500703 0.257109 +vt 0.453125 0.265625 +vt 0.617188 0.375000 +vt 0.610078 0.422578 +vt 0.618594 0.375000 +vt 0.610078 0.327422 +vt 0.500000 0.492188 +vt 0.453125 0.484375 +vt 0.500703 0.492891 +vt 0.547578 0.485078 +vt 0.382812 0.375000 +vt 0.390625 0.328125 +vt 0.382812 0.375000 +vt 0.390625 0.421875 +vt 0.500703 0.255156 +vt 0.548281 0.252500 +vt 0.500703 0.255156 +vt 0.453125 0.265625 +vt 0.625000 0.375000 +vt 0.625000 0.418837 +vt 0.625000 0.375000 +vt 0.625000 0.331163 +vt 0.500703 0.494844 +vt 0.453125 0.484375 +vt 0.500703 0.494844 +vt 0.548281 0.497500 +vt 0.382812 0.375000 +vt 0.390625 0.328125 +vt 0.382812 0.375000 +vt 0.390625 0.421875 +vt 0.622500 0.375000 +vt 0.623750 0.422578 +vt 0.625000 0.375000 +vt 0.623750 0.327422 +vt 0.610781 0.493594 +vt 0.621797 0.485078 +vt 0.625000 0.492188 +vt 0.621797 0.485078 +vt 0.622500 0.375000 +vt 0.623750 0.327422 +vt 0.625000 0.375000 +vt 0.623750 0.422578 +vt 0.610781 0.256406 +vt 0.621797 0.264922 +vt 0.625000 0.257812 +vt 0.621797 0.264922 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.375000 +vt 0.625000 0.420356 +vt 0.625000 0.375000 +vt 0.625000 0.329644 +vt 0.625000 0.492188 +vt 0.625000 0.480903 +vt 0.625000 0.477431 +vt 0.625000 0.480903 +vt 0.625000 0.375000 +vt 0.625000 0.329644 +vt 0.625000 0.375000 +vt 0.625000 0.420356 +vt 0.625000 0.257812 +vt 0.625000 0.269097 +vt 0.625000 0.272569 +vt 0.625000 0.269097 +vt 0.500703 0.257109 +vt 0.546059 0.268394 +vt 0.500000 0.272569 +vt 0.454644 0.269097 +vt 0.618594 0.375000 +vt 0.606606 0.421059 +vt 0.602431 0.375000 +vt 0.606606 0.328941 +vt 0.500703 0.492891 +vt 0.454644 0.480903 +vt 0.500000 0.477431 +vt 0.546059 0.481606 +vt 0.382812 0.375000 +vt 0.394097 0.329644 +vt 0.397569 0.375000 +vt 0.394097 0.420356 +vt 0.437500 0.000000 +vt 0.437500 1.000000 +vt 0.562500 0.000000 +vt 0.562500 1.000000 +vt 0.625000 0.062500 +vt 0.625000 0.185547 +vt 0.560547 0.224609 +vt 0.439453 0.224609 +vt 0.375000 0.185547 +vt 0.375000 0.062500 +vt 0.462240 0.300130 +vt 0.537760 0.300130 +vt 0.574870 0.337240 +vt 0.574870 0.412760 +vt 0.537760 0.449870 +vt 0.462240 0.449870 +vt 0.425130 0.412760 +vt 0.425130 0.337240 +vt 0.439453 0.525391 +vt 0.560547 0.525391 +vt 0.625000 0.562500 +vt 0.875000 0.187500 +vt 0.625000 0.687500 +vt 0.875000 0.062500 +vt 0.562500 0.750000 +vt 0.437500 0.750000 +vt 0.375000 0.687500 +vt 0.125000 0.062500 +vt 0.375000 0.562500 +vt 0.125000 0.187500 +vt 0.625000 0.812500 +vt 0.812500 0.000000 +vt 0.625000 0.937500 +vt 0.687500 0.000000 +vt 0.375000 0.937500 +vt 0.312500 0.000000 +vt 0.375000 0.812500 +vt 0.187500 0.000000 +vt 0.812500 0.250000 +vt 0.625000 0.437500 +vt 0.687500 0.250000 +vt 0.625000 0.312500 +vt 0.312500 0.250000 +vt 0.375000 0.312500 +vt 0.187500 0.250000 +vt 0.375000 0.437500 +vt 0.597656 0.275391 +vt 0.585938 0.289062 +vt 0.546875 0.265625 +vt 0.453125 0.265625 +vt 0.414062 0.289062 +vt 0.402344 0.275391 +vt 0.597656 0.474609 +vt 0.585938 0.460938 +vt 0.609375 0.421875 +vt 0.609375 0.328125 +vt 0.402344 0.474609 +vt 0.414062 0.460938 +vt 0.453125 0.484375 +vt 0.546875 0.484375 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.585938 0.289062 +vt 0.590156 0.284844 +vt 0.551094 0.259453 +vt 0.453125 0.265625 +vt 0.414062 0.289062 +vt 0.414062 0.289062 +vt 0.585938 0.460938 +vt 0.590156 0.465156 +vt 0.615547 0.426094 +vt 0.615547 0.323906 +vt 0.414062 0.460938 +vt 0.414062 0.460938 +vt 0.453125 0.484375 +vt 0.551094 0.490547 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.590156 0.259453 +vt 0.590156 0.259453 +vt 0.551094 0.259453 +vt 0.453125 0.265625 +vt 0.414062 0.289062 +vt 0.414062 0.289062 +vt 0.625000 0.337240 +vt 0.625000 0.412760 +vt 0.625000 0.449870 +vt 0.625000 0.449870 +vt 0.625000 0.412760 +vt 0.625000 0.337240 +vt 0.625000 0.300130 +vt 0.625000 0.300130 +vt 0.414062 0.460938 +vt 0.414062 0.460938 +vt 0.453125 0.484375 +vt 0.551094 0.490547 +vt 0.590156 0.490547 +vt 0.590156 0.490547 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.615547 0.465156 +vt 0.625000 0.460938 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.289062 +vt 0.615547 0.284844 +vt 0.615547 0.465156 +vt 0.625000 0.460938 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.615547 0.426094 +vt 0.615547 0.323906 +vt 0.615547 0.284844 +vt 0.625000 0.289062 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.460938 +vt 0.625000 0.449870 +vt 0.625000 0.300130 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.449870 +vt 0.625000 0.289062 +vt 0.625000 0.300130 +vt 0.590156 0.284844 +vt 0.574870 0.300130 +vt 0.425130 0.300130 +vt 0.414062 0.289062 +vt 0.590156 0.465156 +vt 0.574870 0.449870 +vt 0.414062 0.460938 +vt 0.425130 0.449870 +vn -0.396612 -0.715279 0.575391 +vn -0.197100 -0.764297 0.614005 +vn -0.221929 -0.444726 0.867736 +vn -0.499152 -0.472851 0.726126 +vn 0.002062 -0.779214 0.626755 +vn 0.005957 -0.444288 0.895864 +vn 0.014259 -0.177208 0.984070 +vn -0.233838 -0.195905 0.952335 +vn -0.549874 -0.222484 0.805071 +vn 0.202129 -0.762527 0.614570 +vn 0.237212 -0.435664 0.868290 +vn 0.407434 -0.710761 0.573425 +vn 0.520295 -0.456328 0.721843 +vn 0.581778 -0.193293 0.790046 +vn 0.264763 -0.174277 0.948435 +vn 0.281358 -0.011530 0.959534 +vn 0.029458 -0.030930 0.999087 +vn 0.602549 0.000624 0.798082 +vn 0.616792 0.100274 0.780713 +vn 0.302745 0.055770 0.951438 +vn 0.047202 0.020207 0.998681 +vn -0.227743 -0.044617 0.972699 +vn -0.558096 -0.040486 0.828788 +vn -0.216403 0.010401 0.976249 +vn -0.548106 0.036764 0.835600 +vn -0.065580 0.929465 0.363036 +vn 0.042482 0.940317 0.337637 +vn -0.031581 0.986969 0.157782 +vn -0.151485 0.960817 0.232129 +vn 0.134410 0.949419 0.283790 +vn 0.056821 0.992045 0.112334 +vn 0.003668 0.999992 -0.001882 +vn -0.088368 0.995310 0.039352 +vn -0.218138 0.970988 0.097974 +vn 0.208391 0.954228 0.214526 +vn 0.132185 0.989074 0.065265 +vn 0.262056 0.954504 0.142297 +vn 0.221525 0.974742 0.028374 +vn 0.179956 0.981060 -0.071675 +vn 0.087304 0.995475 -0.037518 +vn 0.037271 0.989175 -0.141926 +vn -0.050150 0.991865 -0.117001 +vn 0.130490 0.976614 -0.170872 +vn 0.065853 0.957165 -0.281955 +vn -0.030641 0.952585 -0.302725 +vn -0.130394 0.948447 -0.288868 +vn -0.139081 0.987142 -0.078783 +vn -0.269062 0.962267 -0.040589 +vn -0.225789 0.943013 -0.244428 +vn -0.315923 0.930679 -0.184471 +vn -0.611495 0.087351 -0.786411 +vn -0.287550 0.048333 -0.956545 +vn -0.268860 -0.023379 -0.962896 +vn -0.593710 -0.009319 -0.804625 +vn -0.032194 0.016292 -0.999349 +vn -0.015894 -0.039374 -0.999098 +vn -0.007669 -0.184430 -0.982816 +vn -0.255601 -0.187602 -0.948406 +vn -0.570727 -0.208001 -0.794359 +vn 0.215805 0.002585 -0.976433 +vn 0.227902 -0.049002 -0.972450 +vn 0.550054 0.030994 -0.834554 +vn 0.556297 -0.043183 -0.829861 +vn 0.546610 -0.224156 -0.806828 +vn 0.233335 -0.199328 -0.951747 +vn 0.221311 -0.446529 -0.866968 +vn -0.003651 -0.446630 -0.894711 +vn 0.498060 -0.474186 -0.726005 +vn 0.395900 -0.715846 -0.575176 +vn 0.197122 -0.764761 -0.613420 +vn -0.001549 -0.779955 -0.625834 +vn -0.232764 -0.441856 -0.866363 +vn -0.511966 -0.467346 -0.720749 +vn -0.201777 -0.763607 -0.613344 +vn -0.404011 -0.713367 -0.572611 +vn -0.196173 -0.939552 -0.280638 +vn -0.465667 -0.829079 -0.309488 +vn -0.000444 -0.959091 -0.283099 +vn -0.000001 -1.000000 0.000006 +vn -0.201081 -0.979575 0.000091 +vn -0.487887 -0.872905 0.001780 +vn 0.194467 -0.939862 -0.280788 +vn 0.462209 -0.830115 -0.311885 +vn 0.489890 -0.871784 -0.000144 +vn 0.201088 -0.979573 0.000039 +vn 0.196128 -0.939538 0.280719 +vn 0.000447 -0.959075 0.283151 +vn 0.469399 -0.826740 0.310104 +vn -0.194539 -0.939827 0.280856 +vn -0.462079 -0.829970 0.312463 +vn 0.753331 -0.528240 0.391734 +vn 0.819931 -0.572434 -0.005694 +vn 0.972507 -0.232457 -0.013927 +vn 0.872467 -0.217993 0.437355 +vn 0.737897 -0.539887 -0.405005 +vn 0.852206 -0.238068 -0.465906 +vn 0.876938 -0.021635 -0.480116 +vn 0.999698 -0.002592 -0.024452 +vn 0.869737 0.087908 -0.485623 +vn 0.991574 0.124258 -0.036624 +vn 0.902280 0.003795 0.431135 +vn 0.902230 0.126767 0.412202 +vn -0.745290 -0.537578 -0.394401 +vn -0.815993 -0.578035 0.005465 +vn -0.971301 -0.237565 0.011740 +vn -0.866871 -0.229077 -0.442786 +vn -0.737847 -0.541052 0.403541 +vn -0.854400 -0.238055 0.461877 +vn -0.878867 -0.020287 0.476636 +vn -0.999729 -0.004377 0.022874 +vn -0.870324 0.091045 0.483990 +vn -0.991421 0.123518 0.042746 +vn -0.898571 -0.002344 -0.438821 +vn -0.902322 0.118756 -0.414382 +vn -0.195738 0.029647 0.980208 +vn -0.528799 0.069560 0.845892 +vn 0.074152 0.048742 0.996055 +vn 0.120958 0.103526 0.987244 +vn -0.158923 0.058494 0.985557 +vn -0.499940 0.099425 0.860334 +vn 0.333614 0.107091 0.936607 +vn 0.636994 0.176464 0.750399 +vn 0.665810 0.248117 0.703658 +vn 0.375407 0.183831 0.908447 +vn 0.439232 0.241284 0.865365 +vn 0.198528 0.146382 0.969102 +vn 0.696151 0.297551 0.653328 +vn 0.767507 0.284440 0.574480 +vn 0.520038 0.263048 0.812630 +vn 0.298431 0.184069 0.936513 +vn -0.082716 0.065278 0.994433 +vn -0.451379 0.077903 0.888925 +vn 0.027242 0.100064 0.994608 +vn -0.348521 0.057353 0.935544 +vn 0.900421 0.214067 0.378706 +vn 0.976904 0.205572 -0.058303 +vn 0.963974 0.250978 -0.088121 +vn 0.901806 0.273141 0.334872 +vn 0.855855 0.148326 -0.495491 +vn 0.537564 0.058294 -0.841205 +vn 0.509030 0.079558 -0.857064 +vn 0.838174 0.180146 -0.514793 +vn 0.817019 0.145593 -0.557928 +vn 0.963085 0.233609 -0.133773 +vn 0.468628 0.053450 -0.881777 +vn 0.358521 0.009438 -0.933474 +vn 0.762723 0.050770 -0.644729 +vn 0.964724 0.137433 -0.224544 +vn 0.916743 0.286233 0.278664 +vn 0.953697 0.229871 0.193961 +vn 0.193169 0.012389 -0.981087 +vn -0.060521 0.039310 -0.997392 +vn -0.102660 0.080146 -0.991482 +vn 0.156918 0.037827 -0.986887 +vn -0.313811 0.089854 -0.945224 +vn -0.630521 0.147973 -0.761936 +vn -0.655588 0.217009 -0.723265 +vn -0.353993 0.150630 -0.923038 +vn -0.406470 0.216092 -0.887743 +vn -0.173093 0.117924 -0.977820 +vn -0.689672 0.269233 -0.672210 +vn -0.761791 0.245767 -0.599394 +vn -0.497856 0.235194 -0.834759 +vn -0.275516 0.152536 -0.949118 +vn 0.095511 0.033085 -0.994878 +vn -0.018012 0.050249 -0.998574 +vn -0.904741 0.194343 -0.379045 +vn -0.977011 0.200770 0.071701 +vn -0.964966 0.239704 0.106693 +vn -0.909125 0.247903 -0.334717 +vn -0.853243 0.152785 0.498632 +vn -0.833069 0.187404 0.520458 +vn -0.811479 0.153761 0.563791 +vn -0.964551 0.213063 0.155707 +vn -0.748541 0.076588 0.658651 +vn -0.958164 0.114717 0.262225 +vn -0.927463 0.251891 -0.276338 +vn -0.964995 0.182405 -0.188448 +vn 0.109216 0.149810 0.982664 +vn -0.267279 0.087004 0.959683 +vn 0.366377 0.209799 0.906505 +vn 0.404353 0.212266 0.889630 +vn 0.163756 0.175965 0.970680 +vn -0.197827 0.108182 0.974249 +vn 0.592567 0.246199 0.766975 +vn 0.825968 0.232243 0.513654 +vn 0.864253 0.186271 0.467301 +vn 0.634966 0.220009 0.740550 +vn 0.662828 0.148118 0.733976 +vn 0.418265 0.185917 0.889095 +vn 0.889219 0.062960 0.453129 +vn 0.792787 -0.295813 0.532902 +vn 0.632540 -0.010274 0.774459 +vn 0.411739 0.120133 0.903349 +vn 0.199970 0.172032 0.964581 +vn -0.138426 0.111896 0.984031 +vn 0.221521 0.132210 0.966152 +vn -0.092762 0.092771 0.991357 +vn 0.982303 0.147388 0.115575 +vn 0.948326 0.036753 -0.315161 +vn 0.925091 -0.045660 -0.376992 +vn 0.993985 0.086082 0.067705 +vn 0.682630 -0.027330 -0.730253 +vn 0.245835 0.010833 -0.969251 +vn 0.125115 -0.001870 -0.992141 +vn 0.594018 -0.094444 -0.798889 +vn 0.461889 -0.180026 -0.868475 +vn 0.875398 -0.184179 -0.446941 +vn -0.008480 -0.022140 -0.999719 +vn -0.130646 -0.117796 -0.984406 +vn 0.232969 -0.343919 -0.909640 +vn 0.634411 -0.480332 -0.605644 +vn 0.996996 -0.076084 0.014520 +vn 0.912232 -0.401852 -0.079670 +vn -0.117084 0.096906 -0.988383 +vn -0.356791 0.174583 -0.917726 +vn -0.399138 0.188050 -0.897400 +vn -0.196337 0.116880 -0.973545 +vn -0.559602 0.213161 -0.800880 +vn -0.807041 0.193190 -0.557999 +vn -0.820656 0.163144 -0.547639 +vn -0.585399 0.203599 -0.784764 +vn -0.590498 0.180894 -0.786505 +vn -0.423452 0.175460 -0.888765 +vn -0.815965 0.137718 -0.561457 +vn -0.806328 0.102179 -0.582576 +vn -0.590856 0.134757 -0.795443 +vn -0.442091 0.127884 -0.887807 +vn -0.262320 0.108178 -0.958898 +vn -0.315302 0.067013 -0.946622 +vn -0.986710 0.104214 -0.124674 +vn -0.943222 0.042505 0.329431 +vn -0.925760 0.012895 0.377893 +vn -0.991207 0.074222 -0.109545 +vn -0.693220 0.041686 0.719520 +vn -0.639872 0.031672 0.767829 +vn -0.588426 0.031588 0.807934 +vn -0.914760 0.003600 0.403982 +vn -0.547283 0.030090 0.836407 +vn -0.910277 0.003452 0.413986 +vn -0.991296 0.056582 -0.118875 +vn -0.989214 0.040898 -0.140654 +vn 0.229528 0.082318 0.969815 +vn -0.063595 0.064954 0.995860 +vn 0.389671 0.059800 0.919011 +vn 0.372931 0.054026 0.926285 +vn 0.230970 0.057548 0.971258 +vn -0.050880 0.052311 0.997334 +vn 0.532604 -0.066193 0.843772 +vn 0.591432 -0.273564 0.758532 +vn 0.492428 -0.047930 0.869033 +vn 0.464437 0.026449 0.885211 +vn 0.466516 0.131238 0.874723 +vn 0.374826 0.076476 0.923936 +vn 0.492169 0.167486 0.854235 +vn 0.579717 0.517668 0.629244 +vn 0.496845 0.261803 0.827408 +vn 0.386220 0.120046 0.914562 +vn 0.232017 0.055111 0.971149 +vn -0.051476 0.063761 0.996637 +vn 0.230066 0.083729 0.969566 +vn -0.064026 0.115440 0.991249 +vn 0.996507 -0.036851 0.074944 +vn 0.995639 0.092836 -0.009203 +vn 0.951005 0.229808 0.206827 +vn 0.963729 0.023994 0.265802 +vn 0.971306 0.222367 -0.084362 +vn 0.927083 0.345363 0.145742 +vn 0.866058 0.410796 0.284940 +vn 0.889411 0.295250 0.348962 +vn 0.892002 0.090609 0.442857 +vn 0.925039 0.350271 -0.147011 +vn 0.889054 0.450980 0.078733 +vn 0.857250 0.468448 -0.213725 +vn 0.809233 0.584308 -0.061047 +vn 0.726549 0.680681 0.093807 +vn 0.826761 0.519386 0.216112 +vn 0.741678 0.572500 0.349511 +vn 0.781050 0.465528 0.416228 +vn 0.632529 0.728713 0.262458 +vn 0.516495 0.745425 0.421397 +vn 0.565258 0.643239 0.516455 +vn 0.601149 0.527610 0.600206 +vn 0.804047 0.352633 0.478705 +vn 0.788298 0.178862 0.588723 +vn 0.633488 0.397051 0.664111 +vn 0.651973 0.256939 0.713382 +vn -0.361262 0.026624 -0.932084 +vn -0.342959 -0.017916 -0.939179 +vn -0.458932 0.071193 -0.885615 +vn -0.466324 0.059330 -0.882622 +vn -0.380506 0.069527 -0.922161 +vn -0.358173 0.111381 -0.926988 +vn -0.591290 0.082628 -0.802215 +vn -0.797145 0.066490 -0.600115 +vn -0.792568 0.049602 -0.607763 +vn -0.591238 0.053924 -0.804693 +vn -0.589594 0.050618 -0.806112 +vn -0.457045 0.080893 -0.885757 +vn -0.793570 0.059070 -0.605605 +vn -0.798090 0.110061 -0.592400 +vn -0.588779 0.078261 -0.804497 +vn -0.438345 0.122283 -0.890450 +vn -0.343329 0.185533 -0.920708 +vn -0.286528 0.339967 -0.895725 +vn -0.273586 0.306359 -0.911754 +vn -0.115040 0.664957 -0.737969 +vn -0.986333 0.032985 -0.161429 +vn -0.908270 0.013043 0.418181 +vn -0.906605 0.043976 0.419683 +vn -0.984195 0.045752 -0.171078 +vn -0.520072 0.029685 0.853607 +vn -0.507344 0.046037 0.860513 +vn -0.506401 0.092066 0.857369 +vn -0.901812 0.108650 0.418247 +vn -0.511371 0.187608 0.838632 +vn -0.883150 0.227466 0.410250 +vn -0.981699 0.089962 -0.167853 +vn -0.970950 0.185496 -0.151154 +vn 0.312129 -0.836567 -0.450257 +vn 0.460828 -0.861178 0.214501 +vn 0.211539 -0.622023 -0.753882 +vn 0.030657 -0.589401 -0.807259 +vn 0.083483 -0.810323 -0.580006 +vn 0.202320 -0.971949 -0.119920 +vn 0.079292 -0.419642 -0.904220 +vn -0.146316 -0.179548 -0.972807 +vn -0.141144 -0.028730 -0.989572 +vn -0.006724 -0.341544 -0.939842 +vn -0.229410 -0.332586 -0.914745 +vn -0.203893 -0.574950 -0.792376 +vn -0.244710 0.023677 -0.969307 +vn -0.328833 0.061695 -0.942371 +vn -0.323122 -0.313490 -0.892926 +vn -0.283658 -0.558911 -0.779202 +vn -0.145110 -0.782604 -0.605371 +vn 0.007050 -0.965296 -0.261064 +vn -0.208967 -0.767282 -0.606309 +vn -0.057855 -0.953805 -0.294803 +vn -0.382405 0.052605 -0.922496 +vn -0.343205 0.279242 -0.896791 +vn -0.219466 0.575838 -0.787557 +vn -0.247505 0.313158 -0.916882 +vn -0.224930 0.603646 -0.764865 +vn -0.101904 0.939812 -0.326142 +vn 0.053529 0.997824 -0.038493 +vn -0.114240 0.858653 -0.499665 +vn -0.032644 0.962876 -0.267965 +vn -0.153726 0.773729 -0.614583 +vn 0.142265 0.977982 0.152684 +vn 0.181626 0.955464 0.232595 +vn 0.000884 0.981630 -0.190791 +vn -0.151371 0.818397 -0.554358 +vn -0.223353 0.458228 -0.860314 +vn -0.267029 0.503227 -0.821863 +vn 0.115825 0.984246 -0.133583 +vn 0.106161 0.972246 0.208488 +vn 0.317109 0.936278 0.151080 +vn 0.380715 0.818920 0.429448 +vn 0.423307 0.722889 0.546116 +vn 0.257093 0.887435 0.382574 +vn 0.522829 0.794890 0.307895 +vn 0.572781 0.666346 0.477394 +vn 0.579598 0.404007 0.707704 +vn 0.635887 0.155248 0.756007 +vn 0.572718 0.527868 0.627176 +vn 0.546087 0.415648 0.727342 +vn 0.435905 0.638708 0.634065 +vn 0.584967 0.004709 0.811043 +vn 0.523117 -0.044187 0.851115 +vn 0.492971 0.346184 0.798208 +vn 0.420515 0.584393 0.694012 +vn 0.309724 0.820793 0.479969 +vn 0.324249 0.778128 0.537940 +vn 0.506337 0.017637 0.862155 +vn 0.483908 -0.278955 0.829468 +vn 0.473958 -0.608641 0.636333 +vn 0.537446 -0.288551 0.792395 +vn 0.533289 -0.612402 0.583581 +vn 0.334519 -0.885194 0.323308 +vn 0.203784 -0.964699 0.166816 +vn 0.369011 -0.775898 0.511677 +vn 0.150364 -0.980876 0.123586 +vn 0.327329 -0.815603 0.477125 +vn 0.504586 -0.443151 0.740952 +vn 0.459260 -0.497131 0.736166 +vn -0.223740 -0.760098 -0.610075 +vn -0.074497 -0.949003 -0.306340 +vn -0.303478 -0.549450 -0.778463 +vn -0.318826 -0.546430 -0.774445 +vn -0.237385 -0.759422 -0.605745 +vn -0.088246 -0.947699 -0.306724 +vn -0.348810 -0.299722 -0.887975 +vn -0.358273 0.080779 -0.930116 +vn -0.376220 0.086047 -0.922526 +vn -0.365188 -0.292965 -0.883634 +vn -0.377001 -0.292506 -0.878812 +vn -0.326700 -0.544899 -0.772238 +vn -0.392090 0.081254 -0.916331 +vn -0.398107 0.064663 -0.915057 +vn -0.380109 -0.297870 -0.875666 +vn -0.328559 -0.545466 -0.771049 +vn -0.244287 -0.759962 -0.602314 +vn -0.100543 -0.946387 -0.306991 +vn -0.250123 -0.757963 -0.602437 +vn -0.118916 -0.941687 -0.314776 +vn -0.292605 0.526362 -0.798327 +vn -0.169466 0.830480 -0.530645 +vn -0.179618 0.833706 -0.522179 +vn -0.309508 0.527790 -0.790976 +vn -0.004961 0.985766 -0.168051 +vn 0.183925 0.949224 0.255236 +vn 0.184964 0.948184 0.258332 +vn -0.009117 0.986709 -0.162239 +vn -0.004583 0.986642 -0.162837 +vn -0.184317 0.834710 -0.518929 +vn 0.195051 0.948181 0.250816 +vn 0.228039 0.947267 0.225128 +vn 0.014151 0.985398 -0.169675 +vn -0.190215 0.832024 -0.521109 +vn -0.322123 0.528837 -0.785218 +vn -0.334898 0.515365 -0.788823 +vn 0.320931 0.761613 0.562982 +vn 0.400957 0.557073 0.727258 +vn 0.399296 0.548623 0.734558 +vn 0.323107 0.757870 0.566776 +vn 0.459189 0.310612 0.832265 +vn 0.486461 -0.073747 0.870585 +vn 0.476023 -0.086243 0.875194 +vn 0.452343 0.299755 0.839960 +vn 0.468909 0.299192 0.831028 +vn 0.419765 0.546888 0.724370 +vn 0.484291 -0.087702 0.870500 +vn 0.518999 -0.080698 0.850957 +vn 0.530670 0.318567 0.785433 +vn 0.497083 0.536726 0.681787 +vn 0.340415 0.755869 0.559266 +vn 0.404158 0.740960 0.536316 +vn 0.428748 -0.518825 0.739592 +vn 0.301957 -0.828380 0.471814 +vn 0.287818 -0.833244 0.472087 +vn 0.415667 -0.527271 0.741085 +vn 0.129185 -0.985212 0.112559 +vn 0.114676 -0.987178 0.111039 +vn 0.101957 -0.988618 0.110630 +vn 0.281422 -0.834839 0.473122 +vn 0.080752 -0.991138 0.105470 +vn 0.274807 -0.837287 0.472685 +vn 0.416268 -0.528926 0.739566 +vn 0.428460 -0.529255 0.732333 +vn -0.232846 -0.750197 -0.618859 +vn -0.116258 -0.933367 -0.339573 +vn -0.299392 -0.547970 -0.781085 +vn -0.106987 -0.535315 -0.837850 +vn -0.068973 -0.734903 -0.674656 +vn 0.011614 -0.913466 -0.406750 +vn -0.351918 -0.310332 -0.883090 +vn -0.380921 0.050405 -0.923233 +vn -0.239472 0.019622 -0.970705 +vn -0.185410 -0.302984 -0.934785 +vn 0.091523 -0.235127 -0.967646 +vn 0.166332 -0.465802 -0.869115 +vn 0.007728 0.086201 -0.996248 +vn 0.189683 0.196325 -0.962017 +vn 0.327276 -0.146190 -0.933552 +vn 0.404120 -0.383009 -0.830657 +vn 0.210239 -0.677849 -0.704500 +vn 0.244357 -0.866329 -0.435619 +vn 0.451477 -0.593967 -0.665862 +vn 0.462473 -0.806712 -0.367878 +vn -0.337435 0.499189 -0.798090 +vn -0.203786 0.828849 -0.521039 +vn -0.230185 0.797399 -0.557826 +vn -0.272482 0.457228 -0.846579 +vn -0.000925 0.985888 -0.167406 +vn 0.240904 0.946926 0.212830 +vn 0.214836 0.950539 0.224324 +vn -0.070851 0.983496 -0.166481 +vn -0.313605 0.935787 -0.161102 +vn -0.214872 0.804935 -0.553092 +vn -0.387105 0.867239 0.313122 +vn -0.532892 0.777346 0.334303 +vn -0.405080 0.906598 -0.118281 +vn -0.223795 0.828127 -0.513928 +vn -0.106674 0.500482 -0.859150 +vn -0.018253 0.580797 -0.813844 +vn 0.479603 0.701820 0.526715 +vn 0.623979 0.487432 0.610787 +vn 0.612748 0.452162 0.648143 +vn 0.477892 0.688529 0.545478 +vn 0.652935 0.354674 0.669240 +vn 0.597307 -0.054435 0.800163 +vn 0.556995 -0.078030 0.826842 +vn 0.645763 0.372685 0.666406 +vn -0.312042 0.122733 0.942107 +vn -0.382058 0.375706 0.844320 +vn -0.083659 -0.274308 0.957996 +vn -0.221951 -0.260756 0.939545 +vn -0.397933 0.105759 0.911298 +vn -0.498128 0.349489 0.793552 +vn -0.428631 0.601741 0.673931 +vn -0.548990 0.536343 0.641051 +vn 0.444986 -0.525524 0.725129 +vn 0.258326 -0.848498 0.461865 +vn 0.241948 -0.861784 0.445859 +vn 0.366500 -0.566587 0.738009 +vn 0.068014 -0.994632 0.077979 +vn 0.129934 -0.991238 0.023744 +vn 0.275294 -0.961344 0.005549 +vn 0.246930 -0.867564 0.431692 +vn 0.392970 -0.916622 0.073343 +vn 0.241348 -0.844530 0.478037 +vn 0.130973 -0.630398 0.765143 +vn 0.025806 -0.624086 0.780929 +vn 0.491227 -0.577177 -0.652352 +vn 0.496457 -0.797677 -0.342405 +vn 0.444296 -0.365904 -0.817750 +vn 0.444467 -0.363906 -0.818548 +vn 0.490853 -0.578285 -0.651652 +vn 0.493943 -0.801363 -0.337398 +vn 0.364585 -0.122877 -0.923027 +vn 0.209830 0.227818 -0.950826 +vn 0.205530 0.233923 -0.950283 +vn 0.363715 -0.118052 -0.923999 +vn 0.360052 -0.116394 -0.925643 +vn 0.441532 -0.362544 -0.820738 +vn 0.201062 0.237152 -0.950438 +vn 0.197437 0.242398 -0.949875 +vn 0.358112 -0.113230 -0.926787 +vn 0.440644 -0.360296 -0.822204 +vn 0.488680 -0.579228 -0.652447 +vn 0.491429 -0.803208 -0.336680 +vn 0.488336 -0.578144 -0.653665 +vn 0.490880 -0.803360 -0.337119 +vn -0.018299 0.602961 -0.797561 +vn -0.232339 0.835040 -0.498725 +vn -0.233101 0.836465 -0.495975 +vn -0.024565 0.608023 -0.793539 +vn -0.404179 0.907900 -0.111162 +vn -0.508434 0.794187 0.332808 +vn -0.495654 0.801918 0.333549 +vn -0.398822 0.910566 -0.108675 +vn -0.397465 0.911426 -0.106411 +vn -0.234274 0.837534 -0.493611 +vn -0.492000 0.803659 0.334765 +vn -0.490646 0.804469 0.334807 +vn -0.397133 0.911811 -0.104335 +vn -0.235879 0.839037 -0.490283 +vn -0.028275 0.610645 -0.791400 +vn -0.031599 0.614336 -0.788411 +vn -0.513611 0.564258 0.646387 +vn -0.468967 0.351255 0.810364 +vn -0.447622 0.360595 0.818294 +vn -0.494742 0.577897 0.649050 +vn -0.383147 0.112833 0.916770 +vn -0.213793 -0.245154 0.945617 +vn -0.206401 -0.235357 0.949740 +vn -0.365557 0.116270 0.923498 +vn -0.362550 0.119639 0.924253 +vn -0.443351 0.364054 0.819088 +vn -0.205704 -0.229898 0.951227 +vn -0.206897 -0.224120 0.952346 +vn -0.362148 0.123789 0.923864 +vn -0.442512 0.367003 0.818225 +vn -0.490183 0.580937 0.649794 +vn -0.489021 0.582871 0.648937 +vn 0.021282 -0.615047 0.788203 +vn 0.233829 -0.838028 0.492983 +vn 0.232423 -0.836439 0.496336 +vn 0.024219 -0.609202 0.792645 +vn 0.402932 -0.909392 0.103204 +vn 0.398420 -0.910836 0.107884 +vn 0.396095 -0.911674 0.109360 +vn 0.231313 -0.835392 0.498613 +vn 0.394948 -0.911951 0.111183 +vn 0.229632 -0.833893 0.501889 +vn 0.024084 -0.605450 0.795519 +vn 0.022061 -0.601323 0.798702 +vn 0.517421 -0.564252 -0.643348 +vn 0.521676 -0.789013 -0.324521 +vn 0.468709 -0.345786 -0.812862 +vn 0.600042 -0.271377 -0.752532 +vn 0.653131 -0.484658 -0.581830 +vn 0.667067 -0.696482 -0.264452 +vn 0.386841 -0.096309 -0.917103 +vn 0.228150 0.263396 -0.937321 +vn 0.379952 0.344806 -0.858339 +vn 0.524018 -0.017894 -0.851519 +vn 0.793600 0.155353 -0.588272 +vn 0.862906 -0.050452 -0.502840 +vn 0.668828 0.445247 -0.595336 +vn 0.895860 -0.238848 -0.374682 +vn 0.904463 -0.410652 -0.115373 +vn 0.003153 0.634228 -0.773140 +vn -0.197785 0.857197 -0.475495 +vn -0.019057 0.916872 -0.398727 +vn 0.171862 0.703394 -0.689710 +vn -0.357212 0.929486 -0.091954 +vn -0.452955 0.822704 0.343496 +vn -0.271729 0.882846 0.383074 +vn -0.171736 0.984735 -0.028345 +vn 0.249202 0.961361 0.116974 +vn 0.391074 0.904302 -0.171168 +vn 0.116949 0.887443 0.445833 +vn 0.528906 0.737673 -0.419639 +vn -0.456989 0.599274 0.657292 +vn -0.412347 0.381858 0.827136 +vn -0.261012 0.444354 0.856985 +vn -0.296115 0.663295 0.687281 +vn -0.330696 0.138637 0.933499 +vn -0.172291 -0.207392 0.962966 +vn -0.006998 -0.119592 0.992798 +vn -0.173744 0.206695 0.962855 +vn 0.199745 0.345775 0.916810 +vn 0.149816 0.543392 0.826002 +vn 0.332568 0.080848 0.939607 +vn 0.107937 0.715840 0.689872 +vn 0.057213 -0.583122 0.810368 +vn 0.263471 -0.816052 0.514433 +vn 0.423833 -0.712365 0.559376 +vn 0.221900 -0.480997 0.848176 +vn 0.427321 -0.895490 0.124476 +vn 0.582130 -0.793608 0.176948 +vn 0.855130 -0.447835 0.261147 +vn 0.739737 -0.357594 0.570015 +vn 0.565005 -0.181955 0.804774 +vn 0.218817 0.186851 0.957709 +vn -0.085146 0.247868 0.965045 +vn 0.389402 0.233469 0.890987 +vn 0.360327 0.473183 0.803905 +vn 0.188297 0.433088 0.881464 +vn -0.100807 0.507016 0.856021 +vn 0.504776 0.410045 0.759647 +vn 0.563593 0.662732 0.493101 +vn 0.484319 0.801148 0.351564 +vn 0.460512 0.617342 0.637823 +vn 0.348277 0.826248 0.442738 +vn 0.260707 0.781122 0.567345 +vn 0.374961 0.896179 0.237207 +vn 0.128148 0.753495 0.644844 +vn -0.091225 0.784638 0.613206 +vn 0.515182 0.844719 0.145045 +vn 0.399669 0.914368 -0.064781 +vn 0.362865 0.924389 -0.117617 +vn 0.432971 0.899011 0.065698 +vn 0.270156 0.907994 -0.320255 +vn 0.042549 0.726313 -0.686046 +vn 0.079908 0.821904 -0.563993 +vn 0.267126 0.916314 -0.298349 +vn 0.212768 0.947528 -0.238579 +vn 0.279668 0.954245 -0.105843 +vn 0.077036 0.904180 -0.420148 +vn 0.332978 0.942346 0.033300 +vn -0.220631 0.430314 -0.875301 +vn -0.417135 0.234655 -0.878029 +vn -0.372114 0.473319 -0.798436 +vn -0.171128 0.625447 -0.761270 +vn -0.586361 0.181348 -0.789489 +vn -0.791647 0.243999 -0.560143 +vn -0.715966 0.509916 -0.476841 +vn -0.547823 0.430403 -0.717386 +vn -0.405881 0.757612 -0.511160 +vn -0.262070 0.778958 -0.569688 +vn -0.521475 0.788728 -0.325533 +vn -0.108836 0.825067 -0.554454 +vn -0.922980 0.365402 -0.120785 +vn -0.821566 0.424303 0.380784 +vn -0.668226 0.677518 0.307316 +vn -0.772027 0.630509 -0.080209 +vn -0.504241 0.365249 0.782518 +vn -0.441752 0.627581 0.641091 +vn -0.308169 0.855833 0.415429 +vn -0.429173 0.881989 0.194697 +vn -0.509710 0.859352 -0.041339 +s 1 +g pCube1 +f 1/1/1 507/520/2 171/184/3 514/529/4 +f 507/520/2 87/93/5 339/352/6 171/184/3 +f 171/184/3 339/352/6 129/51/7 342/355/8 +f 514/529/4 171/184/3 342/355/8 90/97/9 +f 87/93/5 508/522/10 172/185/11 339/352/6 +f 508/522/10 2/3/12 509/524/13 172/185/11 +f 172/185/11 509/524/13 88/95/14 340/353/15 +f 339/352/6 172/185/11 340/353/15 129/51/7 +f 129/51/7 340/353/15 173/186/16 341/354/17 +f 340/353/15 88/95/14 510/525/18 173/186/16 +f 173/186/16 510/525/18 4/6/19 511/526/20 +f 341/354/17 173/186/16 511/526/20 89/96/21 +f 90/97/9 342/355/8 174/187/22 513/528/23 +f 342/355/8 129/51/7 341/354/17 174/187/22 +f 174/187/22 341/354/17 89/96/21 512/527/24 +f 513/528/23 174/187/22 512/527/24 3/5/25 +f 41/47/26 515/530/27 175/188/28 522/537/29 +f 515/530/27 91/98/30 343/356/31 175/188/28 +f 175/188/28 343/356/31 130/52/32 346/359/33 +f 522/537/29 175/188/28 346/359/33 94/101/34 +f 91/98/30 516/531/35 176/189/36 343/356/31 +f 516/531/35 42/48/37 517/532/38 176/189/36 +f 176/189/36 517/532/38 92/99/39 344/357/40 +f 343/356/31 176/189/36 344/357/40 130/52/32 +f 130/52/32 344/357/40 177/190/41 345/358/42 +f 344/357/40 92/99/39 518/533/43 177/190/41 +f 177/190/41 518/533/43 43/49/44 519/534/45 +f 345/358/42 177/190/41 519/534/45 93/100/46 +f 94/101/34 346/359/33 178/191/47 521/536/48 +f 346/359/33 130/52/32 345/358/42 178/191/47 +f 178/191/47 345/358/42 93/100/46 520/535/49 +f 521/536/48 178/191/47 520/535/49 44/50/50 +f 5/7/51 523/538/52 179/192/53 530/548/54 +f 523/538/52 95/102/55 347/360/56 179/192/53 +f 179/192/53 347/360/56 131/53/57 350/363/58 +f 530/548/54 179/192/53 350/363/58 98/106/59 +f 95/102/55 524/539/60 180/193/61 347/360/56 +f 524/539/60 6/9/62 525/540/63 180/193/61 +f 180/193/61 525/540/63 96/103/64 348/361/65 +f 347/360/56 180/193/61 348/361/65 131/53/57 +f 131/53/57 348/361/65 181/194/66 349/362/67 +f 348/361/65 96/103/64 526/542/68 181/194/66 +f 181/194/66 526/542/68 8/13/69 527/544/70 +f 349/362/67 181/194/66 527/544/70 97/105/71 +f 98/106/59 350/363/58 182/195/72 529/546/73 +f 350/363/58 131/53/57 349/362/67 182/195/72 +f 182/195/72 349/362/67 97/105/71 528/545/74 +f 529/546/73 182/195/72 528/545/74 7/11/75 +f 7/11/75 528/545/74 183/196/76 534/556/77 +f 528/545/74 97/105/71 351/364/78 183/196/76 +f 183/196/76 351/364/78 132/54/79 354/367/80 +f 534/556/77 183/196/76 354/367/80 100/110/81 +f 97/105/71 527/544/70 184/197/82 351/364/78 +f 527/544/70 8/13/69 531/550/83 184/197/82 +f 184/197/82 531/550/83 99/108/84 352/365/85 +f 351/364/78 184/197/82 352/365/85 132/54/79 +f 132/54/79 352/365/85 185/198/86 353/366/87 +f 352/365/85 99/108/84 532/552/88 185/198/86 +f 185/198/86 532/552/88 2/4/12 508/523/10 +f 353/366/87 185/198/86 508/523/10 87/94/5 +f 100/110/81 354/367/80 186/199/89 533/554/90 +f 354/367/80 132/54/79 353/366/87 186/199/89 +f 186/199/89 353/366/87 87/94/5 507/521/2 +f 533/554/90 186/199/89 507/521/2 1/2/1 +f 2/3/12 532/553/88 187/200/91 509/524/13 +f 532/553/88 99/109/84 355/368/92 187/200/91 +f 187/200/91 355/368/92 133/55/93 358/371/94 +f 509/524/13 187/200/91 358/371/94 88/95/14 +f 99/109/84 531/551/83 188/201/95 355/368/92 +f 531/551/83 8/14/69 526/543/68 188/201/95 +f 188/201/95 526/543/68 96/104/64 356/369/96 +f 355/368/92 188/201/95 356/369/96 133/55/93 +f 133/55/93 356/369/96 189/202/97 357/370/98 +f 356/369/96 96/104/64 525/541/63 189/202/97 +f 189/202/97 525/541/63 6/10/62 535/558/99 +f 357/370/98 189/202/97 535/558/99 101/112/100 +f 88/95/14 358/371/94 190/203/101 510/525/18 +f 358/371/94 133/55/93 357/370/98 190/203/101 +f 190/203/101 357/370/98 101/112/100 536/560/102 +f 510/525/18 190/203/101 536/560/102 4/6/19 +f 7/12/75 534/557/77 191/204/103 529/547/73 +f 534/557/77 100/111/81 359/372/104 191/204/103 +f 191/204/103 359/372/104 134/56/105 362/375/106 +f 529/547/73 191/204/103 362/375/106 98/107/59 +f 100/111/81 533/555/90 192/205/107 359/372/104 +f 533/555/90 1/1/1 514/529/4 192/205/107 +f 192/205/107 514/529/4 90/97/9 360/373/108 +f 359/372/104 192/205/107 360/373/108 134/56/105 +f 134/56/105 360/373/108 193/206/109 361/374/110 +f 360/373/108 90/97/9 513/528/23 193/206/109 +f 193/206/109 513/528/23 3/5/25 537/562/111 +f 361/374/110 193/206/109 537/562/111 102/114/112 +f 98/107/59 362/375/106 194/207/113 530/549/54 +f 362/375/106 134/56/105 361/374/110 194/207/113 +f 194/207/113 361/374/110 102/114/112 538/564/114 +f 530/549/54 194/207/113 538/564/114 5/8/51 +f 3/5/25 512/527/24 195/208/115 544/571/116 +f 512/527/24 89/96/21 363/376/117 195/208/115 +f 195/208/115 363/376/117 135/57/118 366/379/119 +f 544/571/116 195/208/115 366/379/119 105/118/120 +f 89/96/21 511/526/20 196/209/121 363/376/117 +f 511/526/20 4/6/19 539/566/122 196/209/121 +f 196/209/121 539/566/122 103/116/123 364/377/124 +f 363/376/117 196/209/121 364/377/124 135/57/118 +f 135/57/118 364/377/124 197/210/125 365/378/126 +f 364/377/124 103/116/123 540/567/127 197/210/125 +f 197/210/125 540/567/127 10/16/128 541/568/129 +f 365/378/126 197/210/125 541/568/129 104/117/130 +f 105/118/120 366/379/119 198/211/131 543/570/132 +f 366/379/119 135/57/118 365/378/126 198/211/131 +f 198/211/131 365/378/126 104/117/130 542/569/133 +f 543/570/132 198/211/131 542/569/133 9/15/134 +f 4/6/19 536/561/102 199/212/135 539/566/122 +f 536/561/102 101/113/100 367/380/136 199/212/135 +f 199/212/135 367/380/136 136/58/137 370/383/138 +f 539/566/122 199/212/135 370/383/138 103/116/123 +f 101/113/100 535/559/99 200/213/139 367/380/136 +f 535/559/99 6/9/62 545/572/140 200/213/139 +f 200/213/139 545/572/140 106/119/141 368/381/142 +f 367/380/136 200/213/139 368/381/142 136/58/137 +f 136/58/137 368/381/142 201/214/143 369/382/144 +f 368/381/142 106/119/141 546/573/145 201/214/143 +f 201/214/143 546/573/145 11/17/146 547/574/147 +f 369/382/144 201/214/143 547/574/147 107/120/148 +f 103/116/123 370/383/138 202/215/149 540/567/127 +f 370/383/138 136/58/137 369/382/144 202/215/149 +f 202/215/149 369/382/144 107/120/148 548/575/150 +f 540/567/127 202/215/149 548/575/150 10/16/128 +f 6/9/62 524/539/60 203/216/151 545/572/140 +f 524/539/60 95/102/55 371/384/152 203/216/151 +f 203/216/151 371/384/152 137/59/153 374/387/154 +f 545/572/140 203/216/151 374/387/154 106/119/141 +f 95/102/55 523/538/52 204/217/155 371/384/152 +f 523/538/52 5/7/51 549/576/156 204/217/155 +f 204/217/155 549/576/156 108/121/157 372/385/158 +f 371/384/152 204/217/155 372/385/158 137/59/153 +f 137/59/153 372/385/158 205/218/159 373/386/160 +f 372/385/158 108/121/157 550/577/161 205/218/159 +f 205/218/159 550/577/161 12/18/162 551/578/163 +f 373/386/160 205/218/159 551/578/163 109/122/164 +f 106/119/141 374/387/154 206/219/165 546/573/145 +f 374/387/154 137/59/153 373/386/160 206/219/165 +f 206/219/165 373/386/160 109/122/164 552/579/166 +f 546/573/145 206/219/165 552/579/166 11/17/146 +f 5/7/51 538/565/114 207/220/167 549/576/156 +f 538/565/114 102/115/112 375/388/168 207/220/167 +f 207/220/167 375/388/168 138/60/169 378/391/170 +f 549/576/156 207/220/167 378/391/170 108/121/157 +f 102/115/112 537/563/111 208/221/171 375/388/168 +f 537/563/111 3/5/25 544/571/116 208/221/171 +f 208/221/171 544/571/116 105/118/120 376/389/172 +f 375/388/168 208/221/171 376/389/172 138/60/169 +f 138/60/169 376/389/172 209/222/173 377/390/174 +f 376/389/172 105/118/120 543/570/132 209/222/173 +f 209/222/173 543/570/132 9/15/134 553/580/175 +f 377/390/174 209/222/173 553/580/175 110/123/176 +f 108/121/157 378/391/170 210/223/177 550/577/161 +f 378/391/170 138/60/169 377/390/174 210/223/177 +f 210/223/177 377/390/174 110/123/176 554/581/178 +f 550/577/161 210/223/177 554/581/178 12/18/162 +f 9/15/134 542/569/133 211/224/179 560/587/180 +f 542/569/133 104/117/130 379/392/181 211/224/179 +f 211/224/179 379/392/181 139/61/182 382/395/183 +f 560/587/180 211/224/179 382/395/183 113/126/184 +f 104/117/130 541/568/129 212/225/185 379/392/181 +f 541/568/129 10/16/128 555/582/186 212/225/185 +f 212/225/185 555/582/186 111/124/187 380/393/188 +f 379/392/181 212/225/185 380/393/188 139/61/182 +f 139/61/182 380/393/188 213/226/189 381/394/190 +f 380/393/188 111/124/187 556/583/191 213/226/189 +f 213/226/189 556/583/191 14/20/192 557/584/193 +f 381/394/190 213/226/189 557/584/193 112/125/194 +f 113/126/184 382/395/183 214/227/195 559/586/196 +f 382/395/183 139/61/182 381/394/190 214/227/195 +f 214/227/195 381/394/190 112/125/194 558/585/197 +f 559/586/196 214/227/195 558/585/197 13/19/198 +f 10/16/128 548/575/150 215/228/199 555/582/186 +f 548/575/150 107/120/148 383/396/200 215/228/199 +f 215/228/199 383/396/200 140/62/201 386/399/202 +f 555/582/186 215/228/199 386/399/202 111/124/187 +f 107/120/148 547/574/147 216/229/203 383/396/200 +f 547/574/147 11/17/146 561/588/204 216/229/203 +f 216/229/203 561/588/204 114/127/205 384/397/206 +f 383/396/200 216/229/203 384/397/206 140/62/201 +f 140/62/201 384/397/206 217/230/207 385/398/208 +f 384/397/206 114/127/205 562/589/209 217/230/207 +f 217/230/207 562/589/209 15/21/210 563/590/211 +f 385/398/208 217/230/207 563/590/211 115/128/212 +f 111/124/187 386/399/202 218/231/213 556/583/191 +f 386/399/202 140/62/201 385/398/208 218/231/213 +f 218/231/213 385/398/208 115/128/212 564/591/214 +f 556/583/191 218/231/213 564/591/214 14/20/192 +f 11/17/146 552/579/166 219/232/215 561/588/204 +f 552/579/166 109/122/164 387/400/216 219/232/215 +f 219/232/215 387/400/216 141/63/217 390/403/218 +f 561/588/204 219/232/215 390/403/218 114/127/205 +f 109/122/164 551/578/163 220/233/219 387/400/216 +f 551/578/163 12/18/162 565/592/220 220/233/219 +f 220/233/219 565/592/220 116/129/221 388/401/222 +f 387/400/216 220/233/219 388/401/222 141/63/217 +f 141/63/217 388/401/222 221/234/223 389/402/224 +f 388/401/222 116/129/221 566/593/225 221/234/223 +f 221/234/223 566/593/225 16/22/226 567/594/227 +f 389/402/224 221/234/223 567/594/227 117/130/228 +f 114/127/205 390/403/218 222/235/229 562/589/209 +f 390/403/218 141/63/217 389/402/224 222/235/229 +f 222/235/229 389/402/224 117/130/228 568/595/230 +f 562/589/209 222/235/229 568/595/230 15/21/210 +f 12/18/162 554/581/178 223/236/231 565/592/220 +f 554/581/178 110/123/176 391/404/232 223/236/231 +f 223/236/231 391/404/232 142/64/233 394/407/234 +f 565/592/220 223/236/231 394/407/234 116/129/221 +f 110/123/176 553/580/175 224/237/235 391/404/232 +f 553/580/175 9/15/134 560/587/180 224/237/235 +f 224/237/235 560/587/180 113/126/184 392/405/236 +f 391/404/232 224/237/235 392/405/236 142/64/233 +f 142/64/233 392/405/236 225/238/237 393/406/238 +f 392/405/236 113/126/184 559/586/196 225/238/237 +f 225/238/237 559/586/196 13/19/198 569/596/239 +f 393/406/238 225/238/237 569/596/239 118/131/240 +f 116/129/221 394/407/234 226/239/241 566/593/225 +f 394/407/234 142/64/233 393/406/238 226/239/241 +f 226/239/241 393/406/238 118/131/240 570/597/242 +f 566/593/225 226/239/241 570/597/242 16/22/226 +f 13/19/198 558/585/197 227/240/243 576/603/244 +f 558/585/197 112/125/194 395/408/245 227/240/243 +f 227/240/243 395/408/245 143/65/246 398/411/247 +f 576/603/244 227/240/243 398/411/247 121/134/248 +f 112/125/194 557/584/193 228/241/249 395/408/245 +f 557/584/193 14/20/192 571/598/250 228/241/249 +f 228/241/249 571/598/250 119/132/251 396/409/252 +f 395/408/245 228/241/249 396/409/252 143/65/246 +f 143/65/246 396/409/252 229/242/253 397/410/254 +f 396/409/252 119/132/251 572/599/255 229/242/253 +f 229/242/253 572/599/255 18/24/256 573/600/257 +f 397/410/254 229/242/253 573/600/257 120/133/258 +f 121/134/248 398/411/247 230/243/259 575/602/260 +f 398/411/247 143/65/246 397/410/254 230/243/259 +f 230/243/259 397/410/254 120/133/258 574/601/261 +f 575/602/260 230/243/259 574/601/261 17/23/262 +f 37/43/263 577/604/264 231/244/265 584/611/266 +f 577/604/264 122/135/267 399/412/268 231/244/265 +f 231/244/265 399/412/268 144/66/269 402/415/270 +f 584/611/266 231/244/265 402/415/270 125/138/271 +f 122/135/267 578/605/272 232/245/273 399/412/268 +f 578/605/272 38/44/274 579/606/275 232/245/273 +f 232/245/273 579/606/275 123/136/276 400/413/277 +f 399/412/268 232/245/273 400/413/277 144/66/269 +f 144/66/269 400/413/277 233/246/278 401/414/279 +f 400/413/277 123/136/276 580/607/280 233/246/278 +f 233/246/278 580/607/280 39/45/281 581/608/282 +f 401/414/279 233/246/278 581/608/282 124/137/283 +f 125/138/271 402/415/270 234/247/284 583/610/285 +f 402/415/270 144/66/269 401/414/279 234/247/284 +f 234/247/284 401/414/279 124/137/283 582/609/286 +f 583/610/285 234/247/284 582/609/286 40/46/287 +f 15/21/210 568/595/230 235/248/288 590/617/289 +f 568/595/230 117/130/228 403/416/290 235/248/288 +f 235/248/288 403/416/290 145/67/291 406/419/292 +f 590/617/289 235/248/288 406/419/292 128/141/293 +f 117/130/228 567/594/227 236/249/294 403/416/290 +f 567/594/227 16/22/226 585/612/295 236/249/294 +f 236/249/294 585/612/295 126/139/296 404/417/297 +f 403/416/290 236/249/294 404/417/297 145/67/291 +f 145/67/291 404/417/297 237/250/298 405/418/299 +f 404/417/297 126/139/296 586/613/300 237/250/298 +f 237/250/298 586/613/300 20/26/301 587/614/302 +f 405/418/299 237/250/298 587/614/302 127/140/303 +f 128/141/293 406/419/292 238/251/304 589/616/305 +f 406/419/292 145/67/291 405/418/299 238/251/304 +f 238/251/304 405/418/299 127/140/303 588/615/306 +f 589/616/305 238/251/304 588/615/306 19/25/307 +f 16/22/226 570/597/242 239/252/308 585/612/295 +f 570/597/242 118/131/240 407/420/309 239/252/308 +f 239/252/308 407/420/309 146/68/310 410/423/311 +f 585/612/295 239/252/308 410/423/311 126/139/296 +f 118/131/240 569/596/239 240/253/312 407/420/309 +f 569/596/239 13/19/198 576/603/244 240/253/312 +f 240/253/312 576/603/244 121/134/248 408/421/313 +f 407/420/309 240/253/312 408/421/313 146/68/310 +f 146/68/310 408/421/313 241/254/314 409/422/315 +f 408/421/313 121/134/248 575/602/260 241/254/314 +f 241/254/314 575/602/260 17/23/262 591/618/316 +f 409/422/315 241/254/314 591/618/316 45/142/317 +f 126/139/296 410/423/311 242/255/318 586/613/300 +f 410/423/311 146/68/310 409/422/315 242/255/318 +f 242/255/318 409/422/315 45/142/317 592/619/319 +f 586/613/300 242/255/318 592/619/319 20/26/301 +f 14/20/192 564/591/214 243/256/320 598/625/321 +f 564/591/214 115/128/212 411/424/322 243/256/320 +f 243/256/320 411/424/322 147/69/323 414/427/324 +f 598/625/321 243/256/320 414/427/324 48/145/325 +f 115/128/212 563/590/211 244/257/326 411/424/322 +f 563/590/211 15/21/210 593/620/327 244/257/326 +f 244/257/326 593/620/327 46/143/328 412/425/329 +f 411/424/322 244/257/326 412/425/329 147/69/323 +f 147/69/323 412/425/329 245/258/330 413/426/331 +f 412/425/329 46/143/328 594/621/332 245/258/330 +f 245/258/330 594/621/332 22/28/333 595/622/334 +f 413/426/331 245/258/330 595/622/334 47/144/335 +f 48/145/325 414/427/324 246/259/336 597/624/337 +f 414/427/324 147/69/323 413/426/331 246/259/336 +f 246/259/336 413/426/331 47/144/335 596/623/338 +f 597/624/337 246/259/336 596/623/338 21/27/339 +f 15/21/210 590/617/289 247/260/340 593/620/327 +f 590/617/289 128/141/293 415/428/341 247/260/340 +f 247/260/340 415/428/341 148/70/342 418/431/343 +f 593/620/327 247/260/340 418/431/343 46/143/328 +f 128/141/293 589/616/305 248/261/344 415/428/341 +f 589/616/305 19/25/307 599/626/345 248/261/344 +f 248/261/344 599/626/345 49/146/346 416/429/347 +f 415/428/341 248/261/344 416/429/347 148/70/342 +f 148/70/342 416/429/347 249/262/348 417/430/349 +f 416/429/347 49/146/346 600/627/350 249/262/348 +f 249/262/348 600/627/350 23/29/351 601/628/352 +f 417/430/349 249/262/348 601/628/352 50/147/353 +f 46/143/328 418/431/343 250/263/354 594/621/332 +f 418/431/343 148/70/342 417/430/349 250/263/354 +f 250/263/354 417/430/349 50/147/353 602/629/355 +f 594/621/332 250/263/354 602/629/355 22/28/333 +f 19/25/307 603/630/356 251/264/357 599/626/345 +f 603/630/356 51/148/358 419/432/359 251/264/357 +f 251/264/357 419/432/359 149/71/360 422/435/361 +f 599/626/345 251/264/357 422/435/361 49/146/346 +f 51/148/358 604/631/362 252/265/363 419/432/359 +f 604/631/362 18/24/256 605/632/364 252/265/363 +f 252/265/363 605/632/364 52/149/365 420/433/366 +f 419/432/359 252/265/363 420/433/366 149/71/360 +f 149/71/360 420/433/366 253/266/367 421/434/368 +f 420/433/366 52/149/365 606/633/369 253/266/367 +f 253/266/367 606/633/369 24/30/370 607/634/371 +f 421/434/368 253/266/367 607/634/371 53/150/372 +f 49/146/346 422/435/361 254/267/373 600/627/350 +f 422/435/361 149/71/360 421/434/368 254/267/373 +f 254/267/373 421/434/368 53/150/372 608/635/374 +f 600/627/350 254/267/373 608/635/374 23/29/351 +f 18/24/256 572/599/255 255/268/375 605/632/364 +f 572/599/255 119/132/251 423/436/376 255/268/375 +f 255/268/375 423/436/376 150/72/377 426/439/378 +f 605/632/364 255/268/375 426/439/378 52/149/365 +f 119/132/251 571/598/250 256/269/379 423/436/376 +f 571/598/250 14/20/192 598/625/321 256/269/379 +f 256/269/379 598/625/321 48/145/325 424/437/380 +f 423/436/376 256/269/379 424/437/380 150/72/377 +f 150/72/377 424/437/380 257/270/381 425/438/382 +f 424/437/380 48/145/325 597/624/337 257/270/381 +f 257/270/381 597/624/337 21/27/339 609/636/383 +f 425/438/382 257/270/381 609/636/383 54/151/384 +f 52/149/365 426/439/378 258/271/385 606/633/369 +f 426/439/378 150/72/377 425/438/382 258/271/385 +f 258/271/385 425/438/382 54/151/384 610/637/386 +f 606/633/369 258/271/385 610/637/386 24/30/370 +f 21/27/339 596/623/338 259/272/387 616/643/388 +f 596/623/338 47/144/335 427/440/389 259/272/387 +f 259/272/387 427/440/389 151/73/390 430/443/391 +f 616/643/388 259/272/387 430/443/391 57/154/392 +f 47/144/335 595/622/334 260/273/393 427/440/389 +f 595/622/334 22/28/333 611/638/394 260/273/393 +f 260/273/393 611/638/394 55/152/395 428/441/396 +f 427/440/389 260/273/393 428/441/396 151/73/390 +f 151/73/390 428/441/396 261/274/397 429/442/398 +f 428/441/396 55/152/395 612/639/399 261/274/397 +f 261/274/397 612/639/399 26/32/400 613/640/401 +f 429/442/398 261/274/397 613/640/401 56/153/402 +f 57/154/392 430/443/391 262/275/403 615/642/404 +f 430/443/391 151/73/390 429/442/398 262/275/403 +f 262/275/403 429/442/398 56/153/402 614/641/405 +f 615/642/404 262/275/403 614/641/405 25/31/406 +f 22/28/333 602/629/355 263/276/407 611/638/394 +f 602/629/355 50/147/353 431/444/408 263/276/407 +f 263/276/407 431/444/408 152/74/409 434/447/410 +f 611/638/394 263/276/407 434/447/410 55/152/395 +f 50/147/353 601/628/352 264/277/411 431/444/408 +f 601/628/352 23/29/351 617/644/412 264/277/411 +f 264/277/411 617/644/412 58/155/413 432/445/414 +f 431/444/408 264/277/411 432/445/414 152/74/409 +f 152/74/409 432/445/414 265/278/415 433/446/416 +f 432/445/414 58/155/413 618/645/417 265/278/415 +f 265/278/415 618/645/417 27/33/418 619/646/419 +f 433/446/416 265/278/415 619/646/419 59/156/420 +f 55/152/395 434/447/410 266/279/421 612/639/399 +f 434/447/410 152/74/409 433/446/416 266/279/421 +f 266/279/421 433/446/416 59/156/420 620/647/422 +f 612/639/399 266/279/421 620/647/422 26/32/400 +f 23/29/351 608/635/374 267/280/423 617/644/412 +f 608/635/374 53/150/372 435/448/424 267/280/423 +f 267/280/423 435/448/424 153/75/425 438/451/426 +f 617/644/412 267/280/423 438/451/426 58/155/413 +f 53/150/372 607/634/371 268/281/427 435/448/424 +f 607/634/371 24/30/370 621/648/428 268/281/427 +f 268/281/427 621/648/428 60/157/429 436/449/430 +f 435/448/424 268/281/427 436/449/430 153/75/425 +f 153/75/425 436/449/430 269/282/431 437/450/432 +f 436/449/430 60/157/429 622/649/433 269/282/431 +f 269/282/431 622/649/433 28/34/434 623/650/435 +f 437/450/432 269/282/431 623/650/435 61/158/436 +f 58/155/413 438/451/426 270/283/437 618/645/417 +f 438/451/426 153/75/425 437/450/432 270/283/437 +f 270/283/437 437/450/432 61/158/436 624/651/438 +f 618/645/417 270/283/437 624/651/438 27/33/418 +f 24/30/370 610/637/386 271/284/439 621/648/428 +f 610/637/386 54/151/384 439/452/440 271/284/439 +f 271/284/439 439/452/440 154/76/441 442/455/442 +f 621/648/428 271/284/439 442/455/442 60/157/429 +f 54/151/384 609/636/383 272/285/443 439/452/440 +f 609/636/383 21/27/339 616/643/388 272/285/443 +f 272/285/443 616/643/388 57/154/392 440/453/444 +f 439/452/440 272/285/443 440/453/444 154/76/441 +f 154/76/441 440/453/444 273/286/445 441/454/446 +f 440/453/444 57/154/392 615/642/404 273/286/445 +f 273/286/445 615/642/404 25/31/406 625/652/447 +f 441/454/446 273/286/445 625/652/447 62/159/448 +f 60/157/429 442/455/442 274/287/449 622/649/433 +f 442/455/442 154/76/441 441/454/446 274/287/449 +f 274/287/449 441/454/446 62/159/448 626/653/450 +f 622/649/433 274/287/449 626/653/450 28/34/434 +f 25/31/406 614/641/405 275/288/451 632/659/452 +f 614/641/405 56/153/402 443/456/453 275/288/451 +f 275/288/451 443/456/453 155/77/454 446/459/455 +f 632/659/452 275/288/451 446/459/455 65/162/456 +f 56/153/402 613/640/401 276/289/457 443/456/453 +f 613/640/401 26/32/400 627/654/458 276/289/457 +f 276/289/457 627/654/458 63/160/459 444/457/460 +f 443/456/453 276/289/457 444/457/460 155/77/454 +f 155/77/454 444/457/460 277/290/461 445/458/462 +f 444/457/460 63/160/459 628/655/463 277/290/461 +f 277/290/461 628/655/463 30/36/464 629/656/465 +f 445/458/462 277/290/461 629/656/465 64/161/466 +f 65/162/456 446/459/455 278/291/467 631/658/468 +f 446/459/455 155/77/454 445/458/462 278/291/467 +f 278/291/467 445/458/462 64/161/466 630/657/469 +f 631/658/468 278/291/467 630/657/469 29/35/470 +f 26/32/400 620/647/422 279/292/471 627/654/458 +f 620/647/422 59/156/420 447/460/472 279/292/471 +f 279/292/471 447/460/472 156/78/473 450/463/474 +f 627/654/458 279/292/471 450/463/474 63/160/459 +f 59/156/420 619/646/419 280/293/475 447/460/472 +f 619/646/419 27/33/418 633/660/476 280/293/475 +f 280/293/475 633/660/476 66/163/477 448/461/478 +f 447/460/472 280/293/475 448/461/478 156/78/473 +f 156/78/473 448/461/478 281/294/479 449/462/480 +f 448/461/478 66/163/477 634/661/481 281/294/479 +f 281/294/479 634/661/481 31/37/482 635/662/483 +f 449/462/480 281/294/479 635/662/483 67/164/484 +f 63/160/459 450/463/474 282/295/485 628/655/463 +f 450/463/474 156/78/473 449/462/480 282/295/485 +f 282/295/485 449/462/480 67/164/484 636/663/486 +f 628/655/463 282/295/485 636/663/486 30/36/464 +f 27/33/418 624/651/438 283/296/487 633/660/476 +f 624/651/438 61/158/436 451/464/488 283/296/487 +f 283/296/487 451/464/488 157/79/489 454/467/490 +f 633/660/476 283/296/487 454/467/490 66/163/477 +f 61/158/436 623/650/435 284/297/491 451/464/488 +f 623/650/435 28/34/434 637/664/492 284/297/491 +f 284/297/491 637/664/492 68/165/493 452/465/494 +f 451/464/488 284/297/491 452/465/494 157/79/489 +f 157/79/489 452/465/494 285/298/495 453/466/496 +f 452/465/494 68/165/493 638/665/497 285/298/495 +f 285/298/495 638/665/497 32/38/498 639/666/499 +f 453/466/496 285/298/495 639/666/499 69/166/500 +f 66/163/477 454/467/490 286/299/501 634/661/481 +f 454/467/490 157/79/489 453/466/496 286/299/501 +f 286/299/501 453/466/496 69/166/500 640/667/502 +f 634/661/481 286/299/501 640/667/502 31/37/482 +f 28/34/434 626/653/450 287/300/503 637/664/492 +f 626/653/450 62/159/448 455/468/504 287/300/503 +f 287/300/503 455/468/504 158/80/505 458/471/506 +f 637/664/492 287/300/503 458/471/506 68/165/493 +f 62/159/448 625/652/447 288/301/507 455/468/504 +f 625/652/447 25/31/406 632/659/452 288/301/507 +f 288/301/507 632/659/452 65/162/456 456/469/508 +f 455/468/504 288/301/507 456/469/508 158/80/505 +f 158/80/505 456/469/508 289/302/509 457/470/510 +f 456/469/508 65/162/456 631/658/468 289/302/509 +f 289/302/509 631/658/468 29/35/470 641/668/511 +f 457/470/510 289/302/509 641/668/511 70/167/512 +f 68/165/493 458/471/506 290/303/513 638/665/497 +f 458/471/506 158/80/505 457/470/510 290/303/513 +f 290/303/513 457/470/510 70/167/512 642/669/514 +f 638/665/497 290/303/513 642/669/514 32/38/498 +f 29/35/470 630/657/469 291/304/515 648/675/516 +f 630/657/469 64/161/466 459/472/517 291/304/515 +f 291/304/515 459/472/517 159/81/518 462/475/519 +f 648/675/516 291/304/515 462/475/519 73/170/520 +f 64/161/466 629/656/465 292/305/521 459/472/517 +f 629/656/465 30/36/464 643/670/522 292/305/521 +f 292/305/521 643/670/522 71/168/523 460/473/524 +f 459/472/517 292/305/521 460/473/524 159/81/518 +f 159/81/518 460/473/524 293/306/525 461/474/526 +f 460/473/524 71/168/523 644/671/527 293/306/525 +f 293/306/525 644/671/527 34/40/528 645/672/529 +f 461/474/526 293/306/525 645/672/529 72/169/530 +f 73/170/520 462/475/519 294/307/531 647/674/532 +f 462/475/519 159/81/518 461/474/526 294/307/531 +f 294/307/531 461/474/526 72/169/530 646/673/533 +f 647/674/532 294/307/531 646/673/533 33/39/534 +f 30/36/464 636/663/486 295/308/535 643/670/522 +f 636/663/486 67/164/484 463/476/536 295/308/535 +f 295/308/535 463/476/536 160/82/537 466/479/538 +f 643/670/522 295/308/535 466/479/538 71/168/523 +f 67/164/484 635/662/483 296/309/539 463/476/536 +f 635/662/483 31/37/482 649/676/540 296/309/539 +f 296/309/539 649/676/540 74/171/541 464/477/542 +f 463/476/536 296/309/539 464/477/542 160/82/537 +f 160/82/537 464/477/542 297/310/543 465/478/544 +f 464/477/542 74/171/541 650/677/545 297/310/543 +f 297/310/543 650/677/545 35/41/546 651/678/547 +f 465/478/544 297/310/543 651/678/547 75/172/548 +f 71/168/523 466/479/538 298/311/549 644/671/527 +f 466/479/538 160/82/537 465/478/544 298/311/549 +f 298/311/549 465/478/544 75/172/548 652/679/550 +f 644/671/527 298/311/549 652/679/550 34/40/528 +f 31/37/482 640/667/502 299/312/551 649/676/540 +f 640/667/502 69/166/500 467/480/552 299/312/551 +f 299/312/551 467/480/552 161/83/553 470/483/554 +f 649/676/540 299/312/551 470/483/554 74/171/541 +f 69/166/500 639/666/499 300/313/555 467/480/552 +f 639/666/499 32/38/498 653/680/556 300/313/555 +f 300/313/555 653/680/556 76/173/557 468/481/558 +f 467/480/552 300/313/555 468/481/558 161/83/553 +f 161/83/553 468/481/558 301/314/559 469/482/560 +f 468/481/558 76/173/557 654/681/561 301/314/559 +f 301/314/559 654/681/561 36/42/562 655/682/563 +f 469/482/560 301/314/559 655/682/563 77/174/564 +f 74/171/541 470/483/554 302/315/565 650/677/545 +f 470/483/554 161/83/553 469/482/560 302/315/565 +f 302/315/565 469/482/560 77/174/564 656/683/566 +f 650/677/545 302/315/565 656/683/566 35/41/546 +f 32/38/498 642/669/514 303/316/567 653/680/556 +f 642/669/514 70/167/512 471/484/568 303/316/567 +f 303/316/567 471/484/568 162/84/569 474/487/570 +f 653/680/556 303/316/567 474/487/570 76/173/557 +f 70/167/512 641/668/511 304/317/571 471/484/568 +f 641/668/511 29/35/470 648/675/516 304/317/571 +f 304/317/571 648/675/516 73/170/520 472/485/572 +f 471/484/568 304/317/571 472/485/572 162/84/569 +f 162/84/569 472/485/572 305/318/573 473/486/574 +f 472/485/572 73/170/520 647/674/532 305/318/573 +f 305/318/573 647/674/532 33/39/534 657/684/575 +f 473/486/574 305/318/573 657/684/575 78/175/576 +f 76/173/557 474/487/570 306/319/577 654/681/561 +f 474/487/570 162/84/569 473/486/574 306/319/577 +f 306/319/577 473/486/574 78/175/576 658/685/578 +f 654/681/561 306/319/577 658/685/578 36/42/562 +f 33/39/534 646/673/533 307/320/579 662/689/580 +f 646/673/533 72/169/530 475/488/581 307/320/579 +f 307/320/579 475/488/581 163/85/582 478/491/583 +f 662/689/580 307/320/579 478/491/583 80/177/584 +f 72/169/530 645/672/529 308/321/585 475/488/581 +f 645/672/529 34/40/528 659/686/586 308/321/585 +f 308/321/585 659/686/586 79/176/587 476/489/588 +f 475/488/581 308/321/585 476/489/588 163/85/582 +f 163/85/582 476/489/588 309/322/589 477/490/590 +f 476/489/588 79/176/587 660/687/591 309/322/589 +f 309/322/589 660/687/591 38/44/274 578/605/272 +f 477/490/590 309/322/589 578/605/272 122/135/267 +f 80/177/584 478/491/583 310/323/592 661/688/593 +f 478/491/583 163/85/582 477/490/590 310/323/592 +f 310/323/592 477/490/590 122/135/267 577/604/264 +f 661/688/593 310/323/592 577/604/264 37/43/263 +f 34/40/528 652/679/550 311/324/594 659/686/586 +f 652/679/550 75/172/548 479/492/595 311/324/594 +f 311/324/594 479/492/595 164/86/596 482/495/597 +f 659/686/586 311/324/594 482/495/597 79/176/587 +f 75/172/548 651/678/547 312/325/598 479/492/595 +f 651/678/547 35/41/546 663/690/599 312/325/598 +f 312/325/598 663/690/599 81/178/600 480/493/601 +f 479/492/595 312/325/598 480/493/601 164/86/596 +f 164/86/596 480/493/601 313/326/602 481/494/603 +f 480/493/601 81/178/600 664/691/604 313/326/602 +f 313/326/602 664/691/604 39/45/281 580/607/280 +f 481/494/603 313/326/602 580/607/280 123/136/276 +f 79/176/587 482/495/597 314/327/605 660/687/591 +f 482/495/597 164/86/596 481/494/603 314/327/605 +f 314/327/605 481/494/603 123/136/276 579/606/275 +f 660/687/591 314/327/605 579/606/275 38/44/274 +f 35/41/546 656/683/566 315/328/606 663/690/599 +f 656/683/566 77/174/564 483/496/607 315/328/606 +f 315/328/606 483/496/607 165/87/608 486/499/609 +f 663/690/599 315/328/606 486/499/609 81/178/600 +f 77/174/564 655/682/563 316/329/610 483/496/607 +f 655/682/563 36/42/562 665/692/611 316/329/610 +f 316/329/610 665/692/611 82/179/612 484/497/613 +f 483/496/607 316/329/610 484/497/613 165/87/608 +f 165/87/608 484/497/613 317/330/614 485/498/615 +f 484/497/613 82/179/612 666/693/616 317/330/614 +f 317/330/614 666/693/616 40/46/287 582/609/286 +f 485/498/615 317/330/614 582/609/286 124/137/283 +f 81/178/600 486/499/609 318/331/617 664/691/604 +f 486/499/609 165/87/608 485/498/615 318/331/617 +f 318/331/617 485/498/615 124/137/283 581/608/282 +f 664/691/604 318/331/617 581/608/282 39/45/281 +f 36/42/562 658/685/578 319/332/618 665/692/611 +f 658/685/578 78/175/576 487/500/619 319/332/618 +f 319/332/618 487/500/619 166/88/620 490/503/621 +f 665/692/611 319/332/618 490/503/621 82/179/612 +f 78/175/576 657/684/575 320/333/622 487/500/619 +f 657/684/575 33/39/534 662/689/580 320/333/622 +f 320/333/622 662/689/580 80/177/584 488/501/623 +f 487/500/619 320/333/622 488/501/623 166/88/620 +f 166/88/620 488/501/623 321/334/624 489/502/625 +f 488/501/623 80/177/584 661/688/593 321/334/624 +f 321/334/624 661/688/593 37/43/263 584/611/266 +f 489/502/625 321/334/624 584/611/266 125/138/271 +f 82/179/612 490/503/621 322/335/626 666/693/616 +f 490/503/621 166/88/620 489/502/625 322/335/626 +f 322/335/626 489/502/625 125/138/271 583/610/285 +f 666/693/616 322/335/626 583/610/285 40/46/287 +f 17/23/262 574/601/261 323/336/627 670/697/628 +f 574/601/261 120/133/258 491/504/629 323/336/627 +f 323/336/627 491/504/629 167/89/630 494/507/631 +f 670/697/628 323/336/627 494/507/631 84/181/632 +f 120/133/258 573/600/257 324/337/633 491/504/629 +f 573/600/257 18/24/256 667/694/634 324/337/633 +f 324/337/633 667/694/634 83/180/635 492/505/636 +f 491/504/629 324/337/633 492/505/636 167/89/630 +f 167/89/630 492/505/636 325/338/637 493/506/638 +f 492/505/636 83/180/635 668/695/639 325/338/637 +f 325/338/637 668/695/639 42/48/37 516/531/35 +f 493/506/638 325/338/637 516/531/35 91/98/30 +f 84/181/632 494/507/631 326/339/640 669/696/641 +f 494/507/631 167/89/630 493/506/638 326/339/640 +f 326/339/640 493/506/638 91/98/30 515/530/27 +f 669/696/641 326/339/640 515/530/27 41/47/26 +f 18/24/256 604/631/362 327/340/642 667/694/634 +f 604/631/362 51/148/358 495/508/643 327/340/642 +f 327/340/642 495/508/643 168/90/644 498/511/645 +f 667/694/634 327/340/642 498/511/645 83/180/635 +f 51/148/358 603/630/356 328/341/646 495/508/643 +f 603/630/356 19/25/307 671/698/647 328/341/646 +f 328/341/646 671/698/647 85/182/648 496/509/649 +f 495/508/643 328/341/646 496/509/649 168/90/644 +f 168/90/644 496/509/649 329/342/650 497/510/651 +f 496/509/649 85/182/648 672/699/652 329/342/650 +f 329/342/650 672/699/652 43/49/44 518/533/43 +f 497/510/651 329/342/650 518/533/43 92/99/39 +f 83/180/635 498/511/645 330/343/653 668/695/639 +f 498/511/645 168/90/644 497/510/651 330/343/653 +f 330/343/653 497/510/651 92/99/39 517/532/38 +f 668/695/639 330/343/653 517/532/38 42/48/37 +f 19/25/307 588/615/306 331/344/654 671/698/647 +f 588/615/306 127/140/303 499/512/655 331/344/654 +f 331/344/654 499/512/655 169/91/656 502/515/657 +f 671/698/647 331/344/654 502/515/657 85/182/648 +f 127/140/303 587/614/302 332/345/658 499/512/655 +f 587/614/302 20/26/301 673/700/659 332/345/658 +f 332/345/658 673/700/659 86/183/660 500/513/661 +f 499/512/655 332/345/658 500/513/661 169/91/656 +f 169/91/656 500/513/661 333/346/662 501/514/663 +f 500/513/661 86/183/660 674/701/664 333/346/662 +f 333/346/662 674/701/664 44/50/50 520/535/49 +f 501/514/663 333/346/662 520/535/49 93/100/46 +f 85/182/648 502/515/657 334/347/665 672/699/652 +f 502/515/657 169/91/656 501/514/663 334/347/665 +f 334/347/665 501/514/663 93/100/46 519/534/45 +f 672/699/652 334/347/665 519/534/45 43/49/44 +f 20/26/301 592/619/319 335/348/666 673/700/659 +f 592/619/319 45/142/317 503/516/667 335/348/666 +f 335/348/666 503/516/667 170/92/668 506/519/669 +f 673/700/659 335/348/666 506/519/669 86/183/660 +f 45/142/317 591/618/316 336/349/670 503/516/667 +f 591/618/316 17/23/262 670/697/628 336/349/670 +f 336/349/670 670/697/628 84/181/632 504/517/671 +f 503/516/667 336/349/670 504/517/671 170/92/668 +f 170/92/668 504/517/671 337/350/672 505/518/673 +f 504/517/671 84/181/632 669/696/641 337/350/672 +f 337/350/672 669/696/641 41/47/26 522/537/29 +f 505/518/673 337/350/672 522/537/29 94/101/34 +f 86/183/660 506/519/669 338/351/674 674/701/664 +f 506/519/669 170/92/668 505/518/673 338/351/674 +f 338/351/674 505/518/673 94/101/34 521/536/48 +f 674/701/664 338/351/674 521/536/48 44/50/50 diff --git a/modules/ufbx/data/maya_dq_weights_18.obj b/modules/ufbx/data/maya_dq_weights_18.obj new file mode 100644 index 0000000..5a57b62 --- /dev/null +++ b/modules/ufbx/data/maya_dq_weights_18.obj @@ -0,0 +1,2728 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_dq_weights_18.mtl +g default +v -2.952848 -1.646067 2.023021 +v 2.912388 -1.646376 2.069207 +v -3.909113 2.567388 2.309134 +v 3.417115 2.621678 2.960303 +v -3.420862 2.571474 -2.943895 +v 3.899312 2.631139 -2.307614 +v -2.910536 -1.645713 -2.068608 +v 2.952074 -1.646044 -2.020149 +v -3.719674 5.916648 -0.320218 +v 0.865081 6.079536 3.583278 +v 3.581605 6.160102 0.272995 +v -0.770253 5.941330 -3.499223 +v -3.199141 10.484112 -1.947207 +v 1.004154 11.064447 3.996968 +v 3.081092 11.362048 2.935238 +v 0.092054 10.511653 -3.566138 +v -2.975204 14.189626 -1.964465 +v -0.017076 13.742673 4.175509 +v 2.641575 14.075237 2.903001 +v -0.032024 14.214256 -3.373535 +v 4.521865 12.451711 5.651749 +v 2.591536 14.386575 6.578062 +v 1.232774 12.708855 7.236293 +v 3.075171 10.778219 6.352084 +v 5.987563 12.522567 9.201035 +v 4.258332 14.162080 10.105834 +v 3.113512 12.710432 10.542648 +v 4.860305 11.059549 9.696562 +v 5.684234 11.002102 11.620811 +v 3.955120 12.584060 12.447193 +v 3.702062 13.171331 10.777760 +v 5.410891 11.579436 9.928425 +v 2.536115 8.014093 10.869917 +v 0.821653 9.613703 11.692511 +v 0.611656 10.323780 9.874020 +v 2.326118 8.724170 9.051427 +v 1.101588 7.197141 10.441757 +v -0.168384 8.382038 11.051085 +v -0.323937 8.908022 9.704053 +v 0.946035 7.723125 9.094725 +v -2.142623 15.651276 -1.469823 +v -0.796401 15.558291 1.342805 +v 1.114810 15.594390 0.427820 +v -0.188639 15.667627 -2.405308 +v -1.976866 14.207151 -3.657407 +v 2.488411 14.621815 5.132857 +v 3.795443 13.733679 5.999214 +v 4.045533 11.961852 4.387938 +v 0.710141 13.637164 5.965579 +v 1.590076 13.921776 7.061791 +v 1.227644 13.827720 4.353395 +v 1.395428 10.796987 5.634352 +v 1.888205 11.544250 6.922946 +v 4.160709 11.227984 5.828084 +v 3.385408 14.250009 8.322205 +v 5.336951 13.602725 9.593088 +v 5.240364 12.519340 7.429089 +v 2.152912 12.629310 8.911202 +v 3.373782 13.743671 10.475347 +v 4.004446 10.899959 8.023340 +v 3.795587 11.635123 10.206739 +v 5.768357 11.505424 9.322622 +v 4.715428 13.924365 11.435017 +v 4.832409 11.640186 12.357858 +v 6.432920 12.332339 10.584935 +v 3.813257 12.992410 11.366975 +v 3.546382 13.191150 11.779569 +v 5.592040 11.473150 10.503131 +v 4.514026 12.459874 10.100316 +v 5.879434 11.007006 10.653295 +v 2.365593 11.067498 12.083372 +v 1.717065 8.684793 11.611849 +v 4.079871 9.467740 11.260685 +v 2.155946 11.775274 10.270087 +v 0.404935 10.259581 10.932826 +v 3.869677 10.175446 9.446391 +v 1.430707 9.653080 9.132090 +v 2.742838 8.078294 9.811109 +v -0.033334 8.771149 11.428116 +v 1.625928 7.223041 10.632009 +v -0.236569 9.458363 9.668176 +v 1.422692 7.910256 8.872068 +v -0.633039 15.025937 2.565741 +v -2.725515 15.212661 -1.779413 +v 1.921436 15.113287 1.342839 +v -0.058359 15.234982 -3.056335 +v -0.011082 -2.079168 2.585529 +v 3.671683 0.121520 2.755923 +v -0.270939 2.565404 3.614061 +v -3.851785 0.093413 2.565131 +v -1.735904 15.719839 -0.016830 +v 0.239677 15.645413 1.077732 +v 0.680736 15.749918 -1.173805 +v -1.319261 15.757063 -2.256751 +v 0.192699 2.569284 -3.641366 +v 3.853653 0.121973 -2.524727 +v 0.009920 -2.078992 -2.585248 +v -3.731492 0.094419 -2.726874 +v 3.706205 -2.079253 0.033673 +v -3.708061 -2.078913 -0.030725 +v 5.018189 2.658072 0.456405 +v -5.005109 2.570009 -0.443547 +v 2.474635 4.423309 3.199969 +v -2.238558 5.921103 2.224680 +v -3.758119 4.317964 1.562935 +v 3.721979 4.457937 -1.481733 +v 3.400370 6.377233 2.126103 +v -2.616847 4.327514 -3.105024 +v 1.761074 5.965652 -2.294510 +v -3.106969 5.932114 -2.421929 +v 0.134695 8.478292 3.766607 +v -2.319344 10.486123 1.316731 +v -3.504647 8.096080 -1.565733 +v 3.293445 8.733353 1.676634 +v 3.232750 12.218584 3.839129 +v 0.165707 8.126794 -3.647279 +v 2.186952 10.525166 -0.877061 +v -2.092887 10.503377 -3.796564 +v -0.410790 12.449010 4.310376 +v -2.192916 14.158871 1.078464 +v -3.064611 12.576451 -2.029316 +v 0.425518 7.662428 10.908072 +v -0.474751 8.742905 10.442187 +v 0.229042 8.326779 9.206679 +v 1.129310 7.246300 9.672563 +v -0.016400 12.601959 -3.492397 +v 1.842562 14.207470 -0.853536 +v 3.278623 12.693589 2.539173 +v -0.068862 0.053614 3.617689 +v -0.584708 15.905783 -0.709990 +v 0.035203 0.054485 -3.634650 +v -0.000048 -2.839440 0.000077 +v 5.132847 0.097310 0.196940 +v -5.164876 0.054876 -0.130095 +v -0.789049 4.328461 3.266221 +v 4.401703 4.514734 0.956746 +v 0.638661 4.342445 -3.298205 +v -4.311768 4.324396 -1.026774 +v -2.661508 8.097656 1.530281 +v 2.671728 9.239504 3.394454 +v 2.471017 8.149526 -1.244482 +v -2.350689 8.115776 -3.410829 +v -2.237063 12.554044 1.229123 +v 0.219211 7.892800 10.030103 +v 2.015848 12.598209 -0.806981 +v -2.054569 12.594828 -3.825061 +v 3.514050 13.745849 4.714000 +v 2.159326 14.714814 5.251093 +v 0.860203 11.924600 5.949755 +v 2.915040 10.568252 4.884707 +v 4.544175 13.683914 7.782891 +v 2.436032 13.755716 8.779241 +v 2.854390 11.470683 8.573252 +v 4.958962 11.394182 7.566950 +v 5.728603 13.155031 11.279960 +v 4.015225 13.789756 11.605685 +v 4.724937 12.354667 10.744485 +v 6.317940 11.578800 10.442338 +v 3.256283 10.134774 12.000288 +v 1.951006 11.713593 11.327709 +v 2.973354 11.103637 9.526553 +v 4.287943 9.531738 10.205084 +v 0.827768 7.866541 11.349530 +v -0.443054 9.391752 10.691886 +v 0.550425 8.804345 8.947835 +v 1.821248 7.279136 9.605480 +v -2.178614 15.190934 0.598924 +v 0.916157 14.864253 2.726173 +v 1.444468 15.229596 -1.135645 +v -1.760997 15.236588 -3.188520 +v -1.907345 -1.055104 3.047613 +v 1.824611 -1.055528 3.078979 +v 1.856109 1.375867 3.517618 +v -2.227604 1.349638 3.375633 +v -1.560132 15.826059 -1.185503 +v -0.776368 15.783053 0.462598 +v 0.435100 15.805011 -0.117389 +v -0.335910 15.844485 -1.771600 +v -2.002391 1.351523 -3.518049 +v 2.211966 1.350817 -3.389754 +v 1.908183 -1.054829 -3.042020 +v -1.860120 -1.054708 -3.077119 +v -1.879626 -2.468979 -1.319910 +v 1.891566 -2.469076 -1.307512 +v 1.882644 -2.469151 1.319150 +v -1.891908 -2.469082 1.307350 +v 4.341950 -1.030842 1.394742 +v 4.397368 -1.055214 -1.213214 +v 4.939512 1.404451 -1.210327 +v 4.747892 1.407666 1.757219 +v -4.357895 -1.054395 -1.374744 +v -4.407335 -1.054808 1.244762 +v -4.938954 1.350931 1.227075 +v -4.809635 1.352013 -1.686708 +v -2.363670 3.516632 2.961618 +v 1.385757 3.555740 3.496106 +v 0.214426 5.138944 3.353515 +v -2.870218 5.072995 1.792758 +v 4.217451 3.631770 2.027203 +v 4.603930 3.646881 -0.739166 +v 4.067608 5.348873 0.179322 +v 3.257923 5.308093 2.528543 +v 2.296397 3.561751 -3.014161 +v -1.457362 3.524217 -3.477886 +v -0.403597 5.093636 -3.288152 +v 2.581335 5.153786 -2.075600 +v -4.209324 3.524111 -1.994810 +v -4.549782 3.521262 0.547550 +v -4.016783 5.084737 -0.397543 +v -3.167187 5.091847 -2.514619 +v -3.412688 6.934690 0.254756 +v -1.318819 7.008247 3.065159 +v -1.336495 9.410911 2.937954 +v -3.166647 9.287847 -0.291574 +v 1.760142 7.420911 3.599874 +v 3.321675 7.522413 2.175939 +v 2.961183 10.687208 3.250521 +v 1.899463 10.407287 3.935898 +v 3.165990 7.078498 -0.131242 +v 1.324054 6.974328 -2.856044 +v 1.365945 9.325777 -2.558355 +v 2.985647 9.506936 0.707723 +v -1.517950 6.970823 -3.592377 +v -3.332983 6.955635 -2.243652 +v -2.955989 9.309624 -2.960516 +v -1.064381 9.325454 -3.952168 +v -2.895993 11.571370 -0.467086 +v -1.318218 11.576876 2.965734 +v -1.343367 13.398023 2.878985 +v -2.811226 13.440768 -0.513991 +v 0.728667 7.394129 10.279786 +v -0.085271 8.153539 10.670310 +v -0.184965 8.490647 9.806987 +v 0.628972 7.731236 9.416463 +v 2.849491 11.667066 0.953450 +v 1.110907 11.604901 -2.394876 +v 1.005172 13.472705 -2.341122 +v 2.685141 13.478233 0.950357 +v -1.084544 11.606544 -3.981909 +v -2.793388 11.592244 -3.150965 +v -2.719139 13.460885 -3.121050 +v -1.087319 13.474540 -3.900368 +v 3.995302 12.234957 3.844152 +v 3.441873 14.066176 4.095537 +v 2.965101 14.234360 5.608531 +v 4.042561 13.070644 5.091633 +v 3.768452 13.406938 3.634304 +v 2.948853 14.485815 3.974381 +v 1.065554 13.742722 6.528583 +v 1.900823 14.458758 6.124061 +v 0.675624 13.900512 5.270935 +v 0.497955 11.528716 5.353381 +v 1.765414 11.084343 6.194188 +v 1.037193 12.194414 6.544060 +v 0.067469 11.797264 5.350927 +v 1.180766 10.519801 4.882170 +v 4.136563 11.564366 5.050470 +v 3.169327 10.663465 5.517968 +v 4.592986 13.147124 6.622242 +v 3.547227 14.126063 7.123997 +v 4.400461 14.036491 8.948921 +v 5.395270 13.120752 8.500697 +v 2.400725 14.160269 7.676286 +v 1.706892 13.253335 8.012486 +v 2.670613 13.233026 9.774199 +v 3.322027 14.083859 9.477363 +v 1.934348 12.003158 7.905552 +v 2.959351 11.046755 7.413759 +v 3.865834 11.128734 9.186693 +v 2.881856 12.044343 9.657741 +v 4.111697 10.976397 6.858632 +v 4.816469 11.881278 6.517194 +v 5.608521 11.942053 8.369011 +v 4.960588 11.091657 8.672255 +v 6.005473 13.036698 10.019109 +v 5.059399 13.919963 10.465727 +v 4.953650 12.831667 12.340830 +v 5.881704 11.943673 11.907429 +v 4.068447 14.024559 10.954329 +v 3.567517 13.397374 11.129901 +v 3.951442 13.607508 11.472950 +v 4.185599 13.506517 12.157369 +v 3.731299 12.265482 10.914976 +v 4.737832 11.458354 10.446310 +v 5.383550 12.300368 10.175541 +v 4.363648 12.947766 10.885370 +v 5.736994 11.309113 10.061638 +v 6.303051 11.970334 9.955615 +v 6.378631 11.492252 11.091330 +v 6.134368 11.574449 10.422393 +v 4.544215 10.513397 11.901119 +v 3.624274 11.401032 12.352127 +v 1.961352 9.832916 11.935589 +v 2.896513 8.960400 11.486904 +v 2.918254 12.229602 11.999031 +v 2.799795 12.604240 11.023616 +v 1.147005 11.060117 10.581539 +v 1.261549 10.672801 11.573446 +v 3.339881 12.271674 10.066342 +v 4.271779 11.399643 9.609914 +v 2.629245 9.864135 9.172458 +v 1.694084 10.736650 9.621147 +v 4.980137 10.567809 9.974231 +v 5.106765 10.198830 10.955670 +v 3.443592 8.636934 10.526509 +v 3.329048 9.024249 9.534604 +v 1.650375 7.786508 11.172428 +v 0.715214 8.659022 11.621116 +v 0.182532 8.116938 11.299643 +v 0.996469 7.357527 10.909118 +v 0.015412 9.498910 11.258970 +v -0.099133 9.886223 10.267065 +v -0.529491 9.188946 10.119441 +v -0.429795 8.851839 10.982766 +v 0.447947 9.562758 9.306670 +v 1.383107 8.690243 8.857983 +v 0.763139 8.146502 8.888573 +v -0.050797 8.905914 9.279096 +v 2.082911 7.850357 9.220128 +v 2.197454 7.463041 10.212034 +v 1.475162 7.074494 10.068773 +v 1.375468 7.411602 9.205450 +v -2.738179 14.766736 -0.579707 +v -1.389330 14.692520 2.280684 +v -1.460784 15.450722 1.231737 +v -2.393997 15.506840 -0.699499 +v 0.510771 14.415472 3.636909 +v 1.773772 14.428273 3.032240 +v 1.162320 15.373788 1.497927 +v -0.047659 15.332907 2.077180 +v 2.242091 14.770565 0.542165 +v 0.890133 14.797099 -2.316789 +v 0.571838 15.538128 -2.119409 +v 1.468334 15.499370 -0.170574 +v -1.006680 14.797893 -3.616948 +v -2.561671 14.784880 -2.872484 +v -2.142906 15.526900 -2.341823 +v -0.865990 15.537585 -2.953155 +v -0.027795 -1.133764 3.285688 +v 1.962337 0.072706 3.414987 +v -0.178882 1.348796 3.670513 +v -2.131764 0.073537 3.346331 +v -1.221396 15.851893 -0.369541 +v -0.167327 15.832902 0.182631 +v 0.080143 15.870490 -0.992654 +v -0.980514 15.873050 -1.541689 +v 0.077980 1.350945 -3.722923 +v 2.125830 0.074074 -3.350873 +v 0.016963 -1.133389 -3.290674 +v -2.030574 0.074384 -3.411193 +v 0.002308 -2.648627 -1.411520 +v 2.028744 -2.648676 0.005522 +v -0.002469 -2.648668 1.411819 +v -2.028700 -2.648617 -0.005590 +v 4.693071 -1.108911 0.097191 +v 4.851192 0.109171 -1.282949 +v 5.185792 1.415476 0.322068 +v 4.744606 0.109895 1.602494 +v -4.706113 -1.133176 -0.067381 +v -4.856993 0.074154 1.319748 +v -5.218836 1.351586 -0.245382 +v -4.783928 0.074766 -1.558441 +v -0.470357 3.515283 3.493415 +v 0.936471 4.364011 3.450400 +v -1.338729 5.089181 2.874413 +v -2.531173 4.314400 2.538187 +v 4.745188 3.653305 0.670824 +v 4.354131 4.504259 -0.364108 +v 3.989988 5.367978 1.361916 +v 3.791099 4.478699 2.239676 +v 0.370169 3.522317 -3.514102 +v -0.932765 4.327776 -3.407213 +v 1.065507 5.114215 -2.926065 +v 2.391134 4.375681 -2.661018 +v -4.693856 3.522922 -0.702456 +v -4.289568 4.321815 0.114354 +v -3.843106 5.088858 -1.488527 +v -3.756781 4.326274 -2.209377 +v -2.642953 6.946448 1.782961 +v -1.475563 8.181151 2.959672 +v -2.502063 9.302828 1.395894 +v -3.336164 8.084939 -0.094638 +v 2.813442 7.620685 2.996188 +v 3.095898 9.003746 2.794607 +v 2.711671 10.906729 3.696315 +v 1.600279 8.839310 3.851503 +v 2.384920 6.997366 -1.610909 +v 1.460139 8.125075 -2.690198 +v 2.344318 9.349644 -1.019675 +v 3.106512 8.274525 0.353994 +v -2.668190 6.963732 -2.977362 +v -3.115849 8.106863 -2.697459 +v -2.161178 9.318776 -3.688155 +v -1.174776 8.123106 -3.845113 +v -2.265642 11.566829 1.271822 +v -1.389430 12.534995 2.926901 +v -2.204518 13.423346 1.180586 +v -2.840976 12.565919 -0.497284 +v 0.299887 7.737239 10.500753 +v -0.190948 8.326325 10.246747 +v 0.192766 8.099449 9.573136 +v 0.683600 7.510361 9.827142 +v 2.085574 11.610460 -0.820697 +v 1.048747 12.598469 -2.359520 +v 1.940610 13.471284 -0.803911 +v 2.809141 12.615754 0.911743 +v -2.070120 11.600797 -3.832706 +v -2.756724 12.586471 -3.160140 +v -2.028824 13.469080 -3.768928 +v -1.096310 12.600366 -3.957206 +v 3.755775 13.593966 4.062038 +v 2.969532 14.297520 4.947340 +v 3.557722 13.755659 5.323518 +v 3.978574 12.774206 4.463616 +v 3.528639 13.678012 3.693460 +v 1.526454 14.535987 5.556588 +v 1.464075 14.231417 6.335617 +v 2.240183 14.702253 5.225936 +v 0.386605 12.250700 5.494431 +v 1.131813 11.272783 5.796917 +v 1.328613 11.680078 6.404422 +v 0.638162 12.599216 6.034724 +v 0.328439 11.292811 5.222979 +v 3.589673 11.040945 4.576577 +v 3.741242 10.993485 5.241812 +v 2.202234 10.461035 5.228551 +v 4.127694 13.714150 6.845216 +v 3.972768 14.081282 8.038929 +v 4.965275 13.649812 8.726868 +v 4.988084 13.135631 7.554591 +v 1.968026 13.787733 7.885545 +v 2.182316 13.234911 8.898772 +v 2.915010 13.735606 9.664789 +v 2.859842 14.118107 8.581285 +v 2.401175 11.478613 7.681890 +v 3.414440 11.071565 8.304814 +v 3.321300 11.516826 9.448265 +v 2.404618 12.013670 8.789079 +v 4.550112 11.346027 6.646633 +v 5.210810 11.913705 7.444243 +v 5.368655 11.441811 8.483316 +v 4.539187 11.035203 7.771197 +v 5.592147 13.520736 10.284409 +v 5.229065 13.709807 11.212424 +v 5.409016 12.317273 12.242970 +v 6.166047 12.819153 10.792413 +v 3.734170 13.770418 11.096493 +v 3.817075 13.462341 11.487316 +v 3.990864 13.631468 11.849726 +v 4.285651 13.925607 11.563065 +v 4.333412 11.984412 10.648461 +v 5.218930 11.929311 10.548796 +v 4.897086 12.746189 10.341930 +v 4.063625 12.473931 11.186673 +v 6.122054 11.582395 9.988093 +v 6.468446 11.889033 10.494815 +v 6.336564 11.454837 10.735205 +v 6.068018 11.494277 10.427878 +v 4.084542 10.916069 12.207256 +v 2.783366 10.606922 12.143716 +v 2.438478 9.364382 11.793904 +v 3.714317 9.730793 11.693282 +v 2.784667 12.491942 11.551665 +v 1.973180 11.834199 10.798188 +v 1.126347 10.939169 11.114882 +v 2.085056 11.447272 11.783780 +v 3.797020 11.866819 9.759173 +v 3.452562 10.635643 9.388161 +v 2.152119 10.332670 9.314141 +v 2.515503 11.507774 9.833639 +v 5.122710 10.310738 10.430080 +v 4.267397 9.411618 10.737052 +v 3.464250 8.757883 9.993164 +v 4.151846 9.796843 9.747109 +v 1.192340 8.190489 11.479430 +v 0.368852 8.322670 11.486945 +v 0.586819 7.698024 11.175035 +v 1.273708 7.478433 11.052799 +v -0.119791 9.765276 10.800406 +v -0.419913 9.511073 10.176358 +v -0.560081 9.074505 10.581521 +v -0.309081 9.136311 11.136117 +v 0.905981 9.158777 8.999666 +v 1.014923 8.353477 8.811828 +v 0.336520 8.544380 9.007540 +v 0.110069 9.197717 9.245972 +v 2.218112 7.583989 9.678689 +v 1.803689 7.165073 10.122416 +v 1.483420 7.167898 9.601056 +v 1.692859 7.539838 9.162657 +v -2.207863 14.744667 0.871044 +v -1.478798 15.136670 1.743496 +v -2.038068 15.508639 0.304448 +v -2.623833 15.208867 -0.636005 +v 1.189600 14.276674 3.519854 +v 1.501977 14.952072 2.234419 +v 0.609103 15.348940 1.914612 +v 0.208874 14.964998 2.853528 +v 1.683452 14.790260 -0.991939 +v 0.768570 15.237255 -2.260145 +v 1.123438 15.543219 -1.209139 +v 1.877942 15.197867 0.136466 +v -1.891695 14.792569 -3.469275 +v -2.396780 15.225136 -2.648431 +v -1.575153 15.550424 -2.794855 +v -0.941536 15.237313 -3.345141 +v -1.758319 -1.936046 2.395479 +v 1.727412 -1.936175 2.415666 +v 3.384351 -0.977132 2.451620 +v 3.659657 1.388590 2.889742 +v 1.633556 2.600962 3.509989 +v -2.276682 2.566308 3.219063 +v -3.956099 1.350162 2.528167 +v -3.474095 -0.976435 2.359145 +v -2.042658 15.703019 -0.854103 +v -1.253950 15.657860 0.790001 +v -0.346030 15.615915 1.286804 +v 0.776519 15.633965 0.749384 +v 0.993497 15.694681 -0.285962 +v 0.227744 15.730335 -1.941066 +v -0.693097 15.729658 -2.431730 +v -1.847768 15.719997 -1.878922 +v -1.799640 2.570300 -3.505340 +v 2.245423 2.596902 -3.242745 +v 3.953836 1.390976 -2.511247 +v 3.473195 -0.976389 -2.341980 +v 1.756065 -1.935935 -2.398744 +v -1.734132 -1.935844 -2.414251 +v -3.401246 -0.975825 -2.442002 +v -3.712972 1.352197 -2.860058 +v 3.462805 -1.936049 -1.183258 +v 3.439268 -1.936246 1.242813 +v -3.463233 -1.935917 1.182544 +v -3.435569 -1.935686 -1.244858 +v 4.807668 2.652259 -1.014933 +v 4.546860 2.645566 1.861901 +v -4.787174 2.568885 0.958755 +v -4.560700 2.570780 -1.824521 +v 3.030404 3.595181 3.063622 +v 1.892670 5.204864 3.312148 +v -0.566213 5.984140 3.214729 +v -3.275132 5.907446 0.870891 +v -3.708769 5.079313 0.893673 +v -3.834459 3.518652 1.995986 +v 3.813137 3.615294 -1.981958 +v 3.633526 5.254589 -0.912074 +v 3.702526 6.327886 1.123676 +v 2.491993 6.260374 3.038505 +v -3.099311 3.524804 -3.011917 +v -1.933118 5.094171 -3.231154 +v 0.730799 5.940969 -3.064624 +v 3.008599 6.016893 -0.930923 +v -3.624888 5.925195 -1.495097 +v -2.291543 5.936353 -3.061016 +v 0.239043 7.180861 3.727220 +v 0.528053 9.918410 3.743412 +v -1.236037 10.554548 2.963724 +v -2.994186 10.475579 -0.410696 +v -3.340373 9.298901 -1.811409 +v -3.647669 6.945397 -1.117567 +v 3.462744 7.316113 1.154877 +v 3.130617 10.135742 2.218809 +v 2.939310 11.829977 3.770040 +v 2.422481 11.038197 4.083313 +v -0.086381 6.975199 -3.625829 +v 0.172745 9.328299 -3.614279 +v 1.215784 10.508547 -2.457468 +v 2.888353 10.648061 0.933749 +v -2.849787 10.494540 -3.095670 +v -1.063907 10.509485 -3.982205 +v -0.098256 11.626084 4.256916 +v -0.327901 13.169515 4.266624 +v -1.310903 14.128970 2.707461 +v -2.784983 14.179755 -0.536810 +v -3.026272 13.451063 -2.012894 +v -3.114346 11.582052 -2.010462 +v 0.815757 7.353020 10.673932 +v 0.062433 8.055879 11.035375 +v -0.353075 8.554561 10.820352 +v -0.445346 8.866565 10.021317 +v -0.120518 8.674507 9.451083 +v 0.632806 7.971648 9.089640 +v 1.048314 7.472966 9.304664 +v 1.140585 7.160962 10.103700 +v 0.024343 11.608317 -3.528236 +v -0.031856 13.476120 -3.446176 +v 0.960883 14.211101 -2.330172 +v 2.523908 14.203176 0.871562 +v 3.098081 13.456851 2.626694 +v 3.241341 11.937392 2.639800 +v -2.661238 14.199132 -3.026013 +v -1.055867 14.212566 -3.794597 +v 3.237082 14.422636 4.008461 +v 2.401138 14.479167 5.882296 +v 3.192811 14.182759 6.288665 +v 4.264480 13.137505 5.774433 +v 4.265559 12.300219 4.987268 +v 3.559563 11.088917 3.867627 +v 1.422589 14.694860 4.775034 +v 0.863237 12.981911 6.626861 +v 1.291839 13.375066 7.206579 +v 2.067846 14.287668 6.830851 +v 1.890151 14.056529 3.875991 +v 0.758263 13.602908 4.417402 +v 0.212079 11.622011 5.351196 +v 2.478593 10.651669 5.850911 +v 2.406140 11.069060 6.674018 +v 1.479917 12.043063 7.118538 +v 4.463589 11.784928 5.681086 +v 3.674105 10.853880 6.063248 +v 2.947170 14.296700 7.412726 +v 3.833280 14.206690 9.228474 +v 4.784345 13.990916 9.785667 +v 5.740150 13.097090 9.317493 +v 5.630805 12.524986 8.357477 +v 4.851507 12.507163 6.499018 +v 1.674182 12.632307 8.029550 +v 2.640733 12.644955 9.779895 +v 3.144934 13.275814 10.558302 +v 3.774906 14.064651 10.337330 +v 3.561240 10.852415 7.124125 +v 4.440123 10.962309 8.914613 +v 4.307976 11.234709 9.954110 +v 3.337319 12.117305 10.413166 +v 5.987158 11.969576 9.225932 +v 5.371012 11.179091 9.478924 +v 4.529207 14.099105 10.735684 +v 4.509123 13.229099 12.347516 +v 4.366609 12.121937 12.497445 +v 5.302108 11.249865 12.048603 +v 6.234038 11.651745 11.503430 +v 6.261081 12.483249 9.904738 +v 3.551227 12.885791 11.056763 +v 4.080257 13.411865 11.098261 +v 3.532145 13.260331 11.274162 +v 3.676370 12.950912 12.176453 +v 5.236915 11.218827 10.228944 +v 5.815042 11.868048 10.209530 +v 4.984682 12.028428 9.873026 +v 4.056656 12.879830 10.377640 +v 5.899406 10.955498 11.136290 +v 5.710823 11.224885 10.219395 +v 3.198312 11.852123 12.293163 +v 1.543065 10.293291 11.874566 +v 1.239941 9.153329 11.753534 +v 2.175102 8.280814 11.304847 +v 3.257527 8.693681 11.051973 +v 4.913423 10.253112 11.470759 +v 2.981400 12.541417 10.500673 +v 1.333068 11.003368 10.056075 +v 0.425594 10.380530 10.399484 +v 0.540138 9.993215 11.391388 +v 4.692956 10.941644 9.672341 +v 3.047530 9.403759 9.233481 +v 1.907834 9.184548 8.990403 +v 0.972673 10.057063 9.439090 +v 2.722180 7.957348 10.344452 +v 2.607637 8.344662 9.352549 +v 0.296927 9.119398 11.560091 +v -0.171352 8.529725 11.247398 +v 1.322308 7.136126 10.530745 +v 2.011389 7.519788 10.737498 +v 0.086930 9.829476 9.741598 +v -0.354304 9.148353 9.663106 +v 1.801392 8.229865 8.919007 +v 1.139357 7.754754 8.946453 +v -0.405879 14.552340 3.301263 +v -0.760714 15.365014 1.886221 +v -2.454444 15.502647 -1.630926 +v -2.887027 14.775908 -1.888615 +v 2.292678 14.668213 2.009411 +v 1.497938 15.421342 0.804914 +v -0.036210 14.799764 -3.253466 +v -0.116600 15.522210 -2.750187 +vt 0.375000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.125000 0.250000 +vt 0.625000 0.500000 +vt 0.875000 0.250000 +vt 0.375000 0.750000 +vt 0.125000 0.000000 +vt 0.625000 0.750000 +vt 0.875000 0.000000 +vt 0.414062 0.289062 +vt 0.585938 0.289062 +vt 0.585938 0.460938 +vt 0.414062 0.460938 +vt 0.414062 0.289062 +vt 0.598250 0.276750 +vt 0.598250 0.473250 +vt 0.414062 0.460938 +vt 0.414062 0.289062 +vt 0.598250 0.276750 +vt 0.598250 0.473250 +vt 0.414062 0.460938 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.289062 +vt 0.625000 0.311343 +vt 0.625000 0.438657 +vt 0.625000 0.438657 +vt 0.625000 0.311343 +vt 0.436343 0.311343 +vt 0.563657 0.311343 +vt 0.563657 0.438657 +vt 0.436343 0.438657 +vt 0.500000 0.122070 +vt 0.500000 0.375000 +vt 0.500000 0.627930 +vt 0.500000 0.875000 +vt 0.750000 0.125000 +vt 0.250000 0.125000 +vt 0.500000 0.253906 +vt 0.618164 0.375000 +vt 0.500000 0.496094 +vt 0.381836 0.375000 +vt 0.500176 0.257637 +vt 0.617539 0.375000 +vt 0.500176 0.492363 +vt 0.382812 0.375000 +vt 0.500352 0.254531 +vt 0.625000 0.375000 +vt 0.500352 0.495469 +vt 0.382812 0.375000 +vt 0.624375 0.375000 +vt 0.621445 0.492539 +vt 0.624375 0.375000 +vt 0.621445 0.257461 +vt 0.625000 0.375000 +vt 0.625000 0.492188 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.375000 +vt 0.625000 0.492188 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.375000 +vt 0.625000 0.492188 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.375000 +vt 0.625000 0.488498 +vt 0.625000 0.375000 +vt 0.625000 0.261502 +vt 0.500176 0.261326 +vt 0.613850 0.375000 +vt 0.500176 0.488674 +vt 0.386502 0.375000 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.625000 0.124512 +vt 0.500000 0.217773 +vt 0.375000 0.124512 +vt 0.500000 0.294596 +vt 0.580404 0.375000 +vt 0.500000 0.455404 +vt 0.419596 0.375000 +vt 0.500000 0.532227 +vt 0.625000 0.625000 +vt 0.875000 0.125000 +vt 0.500000 0.750000 +vt 0.375000 0.625000 +vt 0.125000 0.125000 +vt 0.625000 0.875000 +vt 0.750000 0.000000 +vt 0.375000 0.875000 +vt 0.250000 0.000000 +vt 0.750000 0.250000 +vt 0.625000 0.375000 +vt 0.250000 0.250000 +vt 0.375000 0.375000 +vt 0.588867 0.285645 +vt 0.500000 0.257812 +vt 0.411133 0.285645 +vt 0.588867 0.464355 +vt 0.617188 0.375000 +vt 0.411133 0.464355 +vt 0.500000 0.492188 +vt 0.382812 0.375000 +vt 0.586992 0.288008 +vt 0.501055 0.256270 +vt 0.414062 0.289062 +vt 0.586992 0.461992 +vt 0.620273 0.375000 +vt 0.414062 0.460938 +vt 0.501055 0.493730 +vt 0.382812 0.375000 +vt 0.588047 0.254727 +vt 0.501055 0.256270 +vt 0.414062 0.289062 +vt 0.625000 0.375000 +vt 0.625000 0.455404 +vt 0.625000 0.375000 +vt 0.625000 0.294596 +vt 0.414062 0.460938 +vt 0.501055 0.493730 +vt 0.588047 0.495273 +vt 0.382812 0.375000 +vt 0.622637 0.461992 +vt 0.625000 0.375000 +vt 0.622637 0.288008 +vt 0.622637 0.461992 +vt 0.625000 0.492188 +vt 0.620273 0.375000 +vt 0.622637 0.288008 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.460938 +vt 0.625000 0.375000 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.492188 +vt 0.625000 0.289062 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.460938 +vt 0.625000 0.375000 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.492188 +vt 0.625000 0.289062 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.460938 +vt 0.625000 0.375000 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.492188 +vt 0.625000 0.289062 +vt 0.625000 0.375000 +vt 0.625000 0.257812 +vt 0.625000 0.458171 +vt 0.625000 0.291829 +vt 0.625000 0.458171 +vt 0.625000 0.291829 +vt 0.584225 0.290775 +vt 0.416829 0.291829 +vt 0.584225 0.459225 +vt 0.416829 0.458171 +vt 0.437500 0.062500 +vt 0.562500 0.062500 +vt 0.562500 0.179688 +vt 0.437500 0.179688 +vt 0.459201 0.334201 +vt 0.540799 0.334201 +vt 0.540799 0.415799 +vt 0.459201 0.415799 +vt 0.437500 0.570312 +vt 0.562500 0.570312 +vt 0.562500 0.687500 +vt 0.437500 0.687500 +vt 0.437500 0.812500 +vt 0.562500 0.812500 +vt 0.562500 0.937500 +vt 0.437500 0.937500 +vt 0.687500 0.062500 +vt 0.812500 0.062500 +vt 0.812500 0.187500 +vt 0.687500 0.187500 +vt 0.187500 0.062500 +vt 0.312500 0.062500 +vt 0.312500 0.187500 +vt 0.187500 0.187500 +vt 0.445312 0.250000 +vt 0.554688 0.250000 +vt 0.546875 0.265625 +vt 0.453125 0.265625 +vt 0.617188 0.320312 +vt 0.617188 0.429688 +vt 0.609375 0.421875 +vt 0.609375 0.328125 +vt 0.554688 0.500000 +vt 0.445312 0.500000 +vt 0.453125 0.484375 +vt 0.546875 0.484375 +vt 0.382812 0.429688 +vt 0.382812 0.320312 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.453125 0.265625 +vt 0.546875 0.265625 +vt 0.549688 0.262812 +vt 0.453125 0.265625 +vt 0.609375 0.328125 +vt 0.609375 0.421875 +vt 0.612188 0.424688 +vt 0.612188 0.325312 +vt 0.546875 0.484375 +vt 0.453125 0.484375 +vt 0.453125 0.484375 +vt 0.549688 0.487188 +vt 0.390625 0.421875 +vt 0.390625 0.328125 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.453125 0.265625 +vt 0.549688 0.255000 +vt 0.549688 0.255000 +vt 0.453125 0.265625 +vt 0.625000 0.334201 +vt 0.625000 0.415799 +vt 0.625000 0.415799 +vt 0.625000 0.334201 +vt 0.549688 0.495000 +vt 0.453125 0.484375 +vt 0.453125 0.484375 +vt 0.549688 0.495000 +vt 0.390625 0.421875 +vt 0.390625 0.328125 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.620000 0.325312 +vt 0.620000 0.424688 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.612188 0.487188 +vt 0.612188 0.487188 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.620000 0.424688 +vt 0.620000 0.325312 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.612188 0.262812 +vt 0.612188 0.262812 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.415799 +vt 0.625000 0.334201 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.470486 +vt 0.625000 0.470486 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.334201 +vt 0.625000 0.415799 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.279514 +vt 0.625000 0.279514 +vt 0.453125 0.265625 +vt 0.549688 0.262812 +vt 0.540799 0.279514 +vt 0.459201 0.279514 +vt 0.612188 0.325312 +vt 0.612188 0.424688 +vt 0.595486 0.415799 +vt 0.595486 0.334201 +vt 0.549688 0.487188 +vt 0.453125 0.484375 +vt 0.459201 0.470486 +vt 0.540799 0.470486 +vt 0.390625 0.421875 +vt 0.390625 0.328125 +vt 0.404514 0.334201 +vt 0.404514 0.415799 +vt 0.500000 0.062500 +vt 0.562500 0.123047 +vt 0.500000 0.175781 +vt 0.437500 0.123047 +vt 0.500000 0.331163 +vt 0.543837 0.375000 +vt 0.500000 0.418837 +vt 0.456163 0.375000 +vt 0.500000 0.574219 +vt 0.562500 0.626953 +vt 0.500000 0.687500 +vt 0.437500 0.626953 +vt 0.500000 0.812500 +vt 0.562500 0.875000 +vt 0.500000 0.937500 +vt 0.437500 0.875000 +vt 0.750000 0.062500 +vt 0.812500 0.125000 +vt 0.750000 0.187500 +vt 0.687500 0.125000 +vt 0.250000 0.062500 +vt 0.312500 0.125000 +vt 0.250000 0.187500 +vt 0.187500 0.125000 +vt 0.500000 0.242188 +vt 0.548828 0.261719 +vt 0.500000 0.257812 +vt 0.451172 0.261719 +vt 0.621094 0.375000 +vt 0.611328 0.423828 +vt 0.617188 0.375000 +vt 0.611328 0.326172 +vt 0.500000 0.507812 +vt 0.451172 0.488281 +vt 0.500000 0.492188 +vt 0.548828 0.488281 +vt 0.378906 0.375000 +vt 0.388672 0.326172 +vt 0.382812 0.375000 +vt 0.388672 0.423828 +vt 0.500000 0.257812 +vt 0.547578 0.264922 +vt 0.500703 0.257109 +vt 0.453125 0.265625 +vt 0.617188 0.375000 +vt 0.610078 0.422578 +vt 0.618594 0.375000 +vt 0.610078 0.327422 +vt 0.500000 0.492188 +vt 0.453125 0.484375 +vt 0.500703 0.492891 +vt 0.547578 0.485078 +vt 0.382812 0.375000 +vt 0.390625 0.328125 +vt 0.382812 0.375000 +vt 0.390625 0.421875 +vt 0.500703 0.255156 +vt 0.548281 0.252500 +vt 0.500703 0.255156 +vt 0.453125 0.265625 +vt 0.625000 0.375000 +vt 0.625000 0.418837 +vt 0.625000 0.375000 +vt 0.625000 0.331163 +vt 0.500703 0.494844 +vt 0.453125 0.484375 +vt 0.500703 0.494844 +vt 0.548281 0.497500 +vt 0.382812 0.375000 +vt 0.390625 0.328125 +vt 0.382812 0.375000 +vt 0.390625 0.421875 +vt 0.622500 0.375000 +vt 0.623750 0.422578 +vt 0.625000 0.375000 +vt 0.623750 0.327422 +vt 0.610781 0.493594 +vt 0.621797 0.485078 +vt 0.625000 0.492188 +vt 0.621797 0.485078 +vt 0.622500 0.375000 +vt 0.623750 0.327422 +vt 0.625000 0.375000 +vt 0.623750 0.422578 +vt 0.610781 0.256406 +vt 0.621797 0.264922 +vt 0.625000 0.257812 +vt 0.621797 0.264922 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.492188 +vt 0.625000 0.484375 +vt 0.625000 0.375000 +vt 0.625000 0.328125 +vt 0.625000 0.375000 +vt 0.625000 0.421875 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.257812 +vt 0.625000 0.265625 +vt 0.625000 0.375000 +vt 0.625000 0.420356 +vt 0.625000 0.375000 +vt 0.625000 0.329644 +vt 0.625000 0.492188 +vt 0.625000 0.480903 +vt 0.625000 0.477431 +vt 0.625000 0.480903 +vt 0.625000 0.375000 +vt 0.625000 0.329644 +vt 0.625000 0.375000 +vt 0.625000 0.420356 +vt 0.625000 0.257812 +vt 0.625000 0.269097 +vt 0.625000 0.272569 +vt 0.625000 0.269097 +vt 0.500703 0.257109 +vt 0.546059 0.268394 +vt 0.500000 0.272569 +vt 0.454644 0.269097 +vt 0.618594 0.375000 +vt 0.606606 0.421059 +vt 0.602431 0.375000 +vt 0.606606 0.328941 +vt 0.500703 0.492891 +vt 0.454644 0.480903 +vt 0.500000 0.477431 +vt 0.546059 0.481606 +vt 0.382812 0.375000 +vt 0.394097 0.329644 +vt 0.397569 0.375000 +vt 0.394097 0.420356 +vt 0.437500 0.000000 +vt 0.437500 1.000000 +vt 0.562500 0.000000 +vt 0.562500 1.000000 +vt 0.625000 0.062500 +vt 0.625000 0.185547 +vt 0.560547 0.224609 +vt 0.439453 0.224609 +vt 0.375000 0.185547 +vt 0.375000 0.062500 +vt 0.462240 0.300130 +vt 0.537760 0.300130 +vt 0.574870 0.337240 +vt 0.574870 0.412760 +vt 0.537760 0.449870 +vt 0.462240 0.449870 +vt 0.425130 0.412760 +vt 0.425130 0.337240 +vt 0.439453 0.525391 +vt 0.560547 0.525391 +vt 0.625000 0.562500 +vt 0.875000 0.187500 +vt 0.625000 0.687500 +vt 0.875000 0.062500 +vt 0.562500 0.750000 +vt 0.437500 0.750000 +vt 0.375000 0.687500 +vt 0.125000 0.062500 +vt 0.375000 0.562500 +vt 0.125000 0.187500 +vt 0.625000 0.812500 +vt 0.812500 0.000000 +vt 0.625000 0.937500 +vt 0.687500 0.000000 +vt 0.375000 0.937500 +vt 0.312500 0.000000 +vt 0.375000 0.812500 +vt 0.187500 0.000000 +vt 0.812500 0.250000 +vt 0.625000 0.437500 +vt 0.687500 0.250000 +vt 0.625000 0.312500 +vt 0.312500 0.250000 +vt 0.375000 0.312500 +vt 0.187500 0.250000 +vt 0.375000 0.437500 +vt 0.597656 0.275391 +vt 0.585938 0.289062 +vt 0.546875 0.265625 +vt 0.453125 0.265625 +vt 0.414062 0.289062 +vt 0.402344 0.275391 +vt 0.597656 0.474609 +vt 0.585938 0.460938 +vt 0.609375 0.421875 +vt 0.609375 0.328125 +vt 0.402344 0.474609 +vt 0.414062 0.460938 +vt 0.453125 0.484375 +vt 0.546875 0.484375 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.585938 0.289062 +vt 0.590156 0.284844 +vt 0.551094 0.259453 +vt 0.453125 0.265625 +vt 0.414062 0.289062 +vt 0.414062 0.289062 +vt 0.585938 0.460938 +vt 0.590156 0.465156 +vt 0.615547 0.426094 +vt 0.615547 0.323906 +vt 0.414062 0.460938 +vt 0.414062 0.460938 +vt 0.453125 0.484375 +vt 0.551094 0.490547 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.590156 0.259453 +vt 0.590156 0.259453 +vt 0.551094 0.259453 +vt 0.453125 0.265625 +vt 0.414062 0.289062 +vt 0.414062 0.289062 +vt 0.625000 0.337240 +vt 0.625000 0.412760 +vt 0.625000 0.449870 +vt 0.625000 0.449870 +vt 0.625000 0.412760 +vt 0.625000 0.337240 +vt 0.625000 0.300130 +vt 0.625000 0.300130 +vt 0.414062 0.460938 +vt 0.414062 0.460938 +vt 0.453125 0.484375 +vt 0.551094 0.490547 +vt 0.590156 0.490547 +vt 0.590156 0.490547 +vt 0.390625 0.328125 +vt 0.390625 0.421875 +vt 0.615547 0.465156 +vt 0.625000 0.460938 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.289062 +vt 0.615547 0.284844 +vt 0.615547 0.465156 +vt 0.625000 0.460938 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.615547 0.426094 +vt 0.615547 0.323906 +vt 0.615547 0.284844 +vt 0.625000 0.289062 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.421875 +vt 0.625000 0.328125 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.460938 +vt 0.625000 0.484375 +vt 0.625000 0.484375 +vt 0.625000 0.289062 +vt 0.625000 0.289062 +vt 0.625000 0.328125 +vt 0.625000 0.421875 +vt 0.625000 0.265625 +vt 0.625000 0.265625 +vt 0.625000 0.460938 +vt 0.625000 0.449870 +vt 0.625000 0.300130 +vt 0.625000 0.289062 +vt 0.625000 0.460938 +vt 0.625000 0.449870 +vt 0.625000 0.289062 +vt 0.625000 0.300130 +vt 0.590156 0.284844 +vt 0.574870 0.300130 +vt 0.425130 0.300130 +vt 0.414062 0.289062 +vt 0.590156 0.465156 +vt 0.574870 0.449870 +vt 0.414062 0.460938 +vt 0.425130 0.449870 +vn -0.410242 -0.708975 0.573633 +vn -0.204801 -0.761223 0.615302 +vn -0.239590 -0.429445 0.870731 +vn -0.524611 -0.449959 0.722717 +vn -0.003455 -0.777889 0.628392 +vn -0.008689 -0.437516 0.899169 +vn -0.017756 -0.157433 0.987370 +vn -0.269179 -0.156033 0.950366 +vn -0.590874 -0.168164 0.789043 +vn 0.196166 -0.762306 0.616773 +vn 0.217892 -0.435233 0.873554 +vn 0.398615 -0.709450 0.581195 +vn 0.497096 -0.457171 0.737489 +vn 0.533110 -0.196582 0.822891 +vn 0.222109 -0.173654 0.959433 +vn 0.201028 -0.014573 0.979477 +vn -0.038877 0.001648 0.999243 +vn 0.523283 -0.010201 0.852098 +vn 0.496913 0.074493 0.864597 +vn 0.171174 0.045914 0.984170 +vn -0.073615 0.081722 0.993933 +vn -0.293649 0.031847 0.955383 +vn -0.623090 0.062926 0.779614 +vn -0.332498 0.146125 0.931715 +vn -0.652887 0.213912 0.726623 +vn -0.361845 0.931362 -0.040408 +vn -0.326347 0.943471 0.057966 +vn -0.158199 0.987304 -0.014305 +vn -0.235162 0.963293 -0.129484 +vn -0.277533 0.947904 0.156378 +vn -0.114059 0.990414 0.077912 +vn -0.003775 0.999713 0.023678 +vn -0.048587 0.995998 -0.075017 +vn -0.110448 0.971389 -0.210249 +vn -0.211654 0.945988 0.245580 +vn -0.060489 0.984125 0.166853 +vn -0.126963 0.941352 0.312628 +vn -0.004961 0.961375 0.275195 +vn 0.089689 0.968722 0.231374 +vn 0.041268 0.991692 0.121832 +vn 0.138540 0.988043 0.067660 +vn 0.109844 0.993451 -0.031464 +vn 0.178867 0.967706 0.177627 +vn 0.284538 0.952744 0.106383 +vn 0.294619 0.955608 -0.003668 +vn 0.280086 0.953085 -0.114807 +vn 0.071163 0.988864 -0.130702 +vn 0.028840 0.962045 -0.271362 +vn 0.245376 0.943802 -0.221425 +vn 0.183847 0.930906 -0.315618 +vn -0.516322 0.090562 -0.851593 +vn -0.191523 0.064477 -0.979368 +vn -0.219185 -0.017787 -0.975521 +vn -0.547013 -0.005992 -0.837103 +vn 0.064541 0.090217 -0.993829 +vn 0.033198 -0.001555 -0.999448 +vn 0.016797 -0.169080 -0.985459 +vn -0.231417 -0.184748 -0.955151 +vn -0.547025 -0.204995 -0.811628 +vn 0.334620 0.144388 -0.931226 +vn 0.301238 0.024821 -0.953226 +vn 0.640322 0.196170 -0.742634 +vn 0.623804 0.050551 -0.779945 +vn 0.599964 -0.169123 -0.781947 +vn 0.278862 -0.163093 -0.946381 +vn 0.246328 -0.427475 -0.869820 +vn 0.008371 -0.440248 -0.897837 +vn 0.535158 -0.439045 -0.721696 +vn 0.415023 -0.704704 -0.575454 +vn 0.205701 -0.759850 -0.616696 +vn 0.003389 -0.777846 -0.628446 +vn -0.220475 -0.440036 -0.870494 +vn -0.498458 -0.464669 -0.731862 +vn -0.196384 -0.762967 -0.615885 +vn -0.397420 -0.711584 -0.579402 +vn -0.194545 -0.939545 -0.281792 +vn -0.464592 -0.826897 -0.316852 +vn 0.000842 -0.958932 -0.283636 +vn -0.000017 -1.000000 -0.000017 +vn -0.202117 -0.979361 -0.000426 +vn -0.492516 -0.870288 -0.005196 +vn 0.197830 -0.939058 -0.281130 +vn 0.477190 -0.823182 -0.307671 +vn 0.498552 -0.866840 0.005927 +vn 0.201977 -0.979390 0.000026 +vn 0.194542 -0.939549 0.281781 +vn -0.000938 -0.958924 0.283661 +vn 0.470308 -0.823685 0.316785 +vn -0.197763 -0.939072 0.281131 +vn -0.471654 -0.826209 0.308094 +vn 0.746041 -0.517568 0.418982 +vn 0.834928 -0.550008 0.019660 +vn 0.979722 -0.196563 0.038835 +vn 0.849654 -0.206765 0.485115 +vn 0.770102 -0.509254 -0.384191 +vn 0.889023 -0.185794 -0.418472 +vn 0.914189 0.053728 -0.401712 +vn 0.997244 0.039588 0.062745 +vn 0.906530 0.205720 -0.368622 +vn 0.979837 0.179581 0.087576 +vn 0.858420 0.014733 0.512736 +vn 0.835549 0.136393 0.532217 +vn -0.740030 -0.530381 -0.413585 +vn -0.824655 -0.565458 -0.014212 +vn -0.978345 -0.205395 -0.025558 +vn -0.853291 -0.213854 -0.475564 +vn -0.758479 -0.521403 0.390959 +vn -0.882117 -0.187929 0.431916 +vn -0.908005 0.073422 0.412475 +vn -0.997474 0.055810 -0.043939 +vn -0.900508 0.242883 0.360685 +vn -0.973037 0.217779 -0.075963 +vn -0.865848 0.025948 -0.499634 +vn -0.837777 0.157142 -0.522911 +vn -0.389719 0.253819 0.885265 +vn -0.689818 0.333079 0.642814 +vn -0.140879 0.156751 0.977539 +vn -0.254790 0.223501 0.940813 +vn -0.470885 0.359159 0.805774 +vn -0.725554 0.425371 0.540953 +vn 0.119346 0.080926 0.989549 +vn 0.456487 0.117217 0.881975 +vn 0.375911 0.126793 0.917940 +vn 0.018571 0.104934 0.994306 +vn -0.162439 0.000247 0.986719 +vn -0.441254 0.168991 0.881327 +vn 0.268499 0.022333 0.963021 +vn 0.047871 -0.149544 0.987595 +vn -0.377690 -0.114393 0.918839 +vn -0.663152 0.018984 0.748244 +vn -0.634310 0.327610 0.700230 +vn -0.813073 0.422713 0.400284 +vn -0.840430 0.191795 0.506844 +vn -0.961107 0.228802 0.154672 +vn 0.792192 0.213369 0.571757 +vn 0.950382 0.281384 0.132658 +vn 0.921316 0.331708 0.202848 +vn 0.735706 0.236979 0.634490 +vn 0.889093 0.327695 -0.319577 +vn 0.657634 0.325725 -0.679280 +vn 0.681855 0.424072 -0.596017 +vn 0.877913 0.407518 -0.251393 +vn 0.886726 0.438399 -0.146711 +vn 0.900103 0.289116 0.325926 +vn 0.712800 0.495839 -0.496044 +vn 0.861174 0.387561 -0.328902 +vn 0.957522 0.277000 0.080138 +vn 0.830660 0.073510 0.551905 +vn 0.657600 0.144195 0.739439 +vn 0.497201 -0.056913 0.865767 +vn 0.387417 0.253310 -0.886421 +vn 0.119207 0.163120 -0.979378 +vn 0.210932 0.252306 -0.944378 +vn 0.454682 0.365025 -0.812417 +vn -0.140755 0.112969 -0.983578 +vn -0.470467 0.147151 -0.870062 +vn -0.388919 0.172566 -0.904966 +vn -0.047024 0.143316 -0.988559 +vn 0.125435 0.014141 -0.992001 +vn 0.391852 0.249550 -0.885538 +vn -0.253206 0.044223 -0.966401 +vn 0.026121 -0.174421 -0.984325 +vn 0.426021 -0.117581 -0.897040 +vn 0.658112 0.135605 -0.740607 +vn 0.565404 0.419650 -0.710079 +vn 0.761060 0.323341 -0.562350 +vn -0.797658 0.239370 -0.553574 +vn -0.937383 0.324576 -0.126343 +vn -0.902999 0.374821 -0.210005 +vn -0.739478 0.287503 -0.608699 +vn -0.893226 0.351183 0.280747 +vn -0.898019 0.397691 0.188159 +vn -0.931953 0.360709 0.036770 +vn -0.879971 0.294946 -0.372368 +vn -0.956759 0.127000 -0.261694 +vn -0.760127 0.017570 -0.649537 +vn -0.644945 0.186186 -0.741202 +vn -0.433502 -0.064438 -0.898846 +vn -0.932492 0.122777 0.339684 +vn -0.995348 0.094531 -0.018611 +vn -0.791819 0.037591 0.609598 +vn -0.843584 0.124933 0.522262 +vn -0.951110 0.154208 0.267601 +vn -0.991492 0.104332 -0.077834 +vn -0.541678 -0.062435 0.838264 +vn -0.137919 -0.118735 0.983301 +vn -0.252672 0.001774 0.967550 +vn -0.612838 0.067256 0.787341 +vn -0.627624 0.095141 0.772681 +vn -0.863334 0.148788 0.482199 +vn -0.291309 0.005301 0.956614 +vn -0.420010 -0.745871 0.516980 +vn -0.655450 -0.063557 0.752559 +vn -0.885452 0.093560 0.455215 +vn -0.954055 0.162941 0.251453 +vn -0.990602 0.112757 -0.077416 +vn -0.959780 0.123096 0.252328 +vn -0.994017 0.091807 -0.059177 +vn 0.306733 -0.135529 0.942097 +vn 0.670150 -0.104243 0.734869 +vn 0.593066 -0.132366 0.794199 +vn 0.180524 -0.087048 0.979711 +vn 0.954059 0.053634 0.294779 +vn 0.974479 0.186087 -0.125546 +vn 0.991755 0.123040 -0.035825 +vn 0.937306 -0.011602 0.348316 +vn 0.934256 -0.070595 0.349546 +vn 0.671580 -0.263874 0.692351 +vn 0.995724 0.089617 -0.022410 +vn 0.993339 -0.094812 0.065488 +vn 0.992236 -0.123031 -0.018194 +vn 0.066749 0.025008 -0.997456 +vn 0.162900 -0.145937 0.975790 +vn 0.596525 -0.390446 0.701221 +vn 0.899848 0.176708 -0.398807 +vn 0.812824 0.076798 -0.577425 +vn 0.862744 0.140739 -0.485659 +vn 0.936426 0.168092 -0.307979 +vn 0.625266 -0.058588 -0.778209 +vn 0.246460 -0.143283 -0.958503 +vn 0.395833 -0.028441 -0.917882 +vn 0.714256 0.070763 -0.696298 +vn 0.755161 0.130964 -0.642324 +vn 0.877043 0.166325 -0.450702 +vn 0.488850 0.048249 -0.871032 +vn 0.546587 0.068498 -0.834596 +vn 0.778917 0.121401 -0.615265 +vn 0.885037 0.129334 -0.447194 +vn 0.947743 0.160254 -0.275865 +vn 0.960789 0.084332 -0.264144 +vn -0.231963 -0.163704 -0.958850 +vn -0.604561 -0.121732 -0.787202 +vn -0.513191 -0.114788 -0.850564 +vn -0.091444 -0.112499 -0.989435 +vn -0.892091 -0.026165 -0.451099 +vn -0.852346 -0.017883 -0.522672 +vn -0.846404 0.009487 -0.532457 +vn -0.463816 -0.069435 -0.883206 +vn -0.854707 0.022034 -0.518643 +vn -0.444519 -0.026893 -0.895366 +vn 0.019567 -0.047135 -0.998697 +vn 0.094697 -0.003223 -0.995501 +vn -0.965499 0.070719 0.250619 +vn -0.997220 0.061094 -0.042654 +vn -0.906083 0.033474 0.421773 +vn -0.916178 0.040515 0.398720 +vn -0.967658 0.048802 0.247501 +vn -0.998256 0.046861 -0.035899 +vn -0.764111 -0.166668 0.623182 +vn -0.682657 -0.564280 0.464293 +vn -0.847895 -0.134207 0.512896 +vn -0.847767 0.000568 0.530369 +vn -0.828695 0.152122 0.538631 +vn -0.914048 0.069633 0.399584 +vn -0.690909 0.251306 0.677857 +vn -0.401467 0.499657 0.767572 +vn -0.769810 0.271007 0.577882 +vn -0.903634 0.114480 0.412723 +vn -0.967519 0.046770 0.248432 +vn -0.997617 0.056902 -0.039012 +vn -0.966050 0.074112 0.247499 +vn -0.992759 0.108389 -0.051774 +vn -0.377144 -0.921202 0.095649 +vn -0.496392 -0.853183 0.160229 +vn -0.589592 -0.804980 -0.066251 +vn -0.409864 -0.907269 -0.094205 +vn -0.600719 -0.767688 0.223140 +vn -0.686771 -0.726440 -0.025108 +vn -0.714900 -0.675452 -0.180783 +vn -0.616497 -0.755135 -0.222940 +vn -0.428966 -0.857989 -0.282567 +vn -0.700254 -0.661816 0.267665 +vn -0.771161 -0.636330 0.019850 +vn -0.786622 -0.538384 0.302271 +vn -0.865803 -0.484481 0.125157 +vn -0.910375 -0.410239 -0.054054 +vn -0.800210 -0.584262 -0.135282 +vn -0.807725 -0.514346 -0.288146 +vn -0.722517 -0.606575 -0.331717 +vn -0.911356 -0.334358 -0.240072 +vn -0.872383 -0.249279 -0.420486 +vn -0.789424 -0.358375 -0.498374 +vn -0.691985 -0.463273 -0.553655 +vn -0.626466 -0.684840 -0.372202 +vn -0.454014 -0.766293 -0.454606 +vn -0.584463 -0.563978 -0.583379 +vn -0.458247 -0.648564 -0.607762 +vn 0.953374 0.005324 -0.301745 +vn 0.974143 -0.194435 0.115066 +vn 0.885097 0.075842 -0.459186 +vn 0.882152 0.072763 -0.465311 +vn 0.936982 0.080955 -0.339868 +vn 0.934534 0.144702 -0.325126 +vn 0.791437 0.084043 -0.605445 +vn 0.579185 0.058988 -0.813059 +vn 0.592606 0.053179 -0.803735 +vn 0.796387 0.062492 -0.601549 +vn 0.799108 0.061345 -0.598049 +vn 0.886107 0.095274 -0.453583 +vn 0.592769 0.065811 -0.802679 +vn 0.580248 0.118993 -0.805700 +vn 0.797860 0.088234 -0.596350 +vn 0.891172 0.129641 -0.434748 +vn 0.930703 0.221903 -0.290775 +vn 0.847087 0.447637 -0.286469 +vn 0.924010 0.324288 -0.202591 +vn 0.482846 0.863204 -0.147441 +vn 0.136655 0.018894 -0.990438 +vn -0.436413 0.002132 -0.899744 +vn -0.431896 0.041156 -0.900984 +vn 0.154422 0.044822 -0.986988 +vn -0.864263 0.025927 -0.502371 +vn -0.867752 0.043102 -0.495125 +vn -0.863277 0.089594 -0.496715 +vn -0.428481 0.109014 -0.896950 +vn -0.844622 0.186310 -0.501899 +vn -0.419661 0.228516 -0.878445 +vn 0.153948 0.092954 -0.983697 +vn 0.138136 0.189928 -0.972032 +vn 0.511768 -0.011499 -0.859047 +vn 0.241475 -0.784487 -0.571200 +vn 0.712845 0.345074 -0.610554 +vn 0.833720 0.551965 0.015657 +vn 0.959169 0.255117 -0.122109 +vn 0.907447 -0.341248 -0.245133 +vn 0.987794 0.155156 -0.013758 +vn 0.442825 0.421956 -0.791113 +vn -0.395891 0.770115 -0.500193 +vn 0.675266 0.717167 0.172299 +vn 0.539767 0.841800 -0.004938 +vn 0.706062 0.691447 -0.152898 +vn 0.283786 0.949116 0.136545 +vn 0.136906 0.987894 0.072956 +vn 0.441908 0.891477 -0.099931 +vn 0.632437 0.743555 -0.217140 +vn 0.839527 0.465200 -0.280684 +vn 0.932888 0.037705 -0.358189 +vn 0.790860 0.526775 -0.311526 +vn 0.914613 0.157615 -0.372345 +vn 0.859227 -0.296763 0.416725 +vn 0.788264 0.532676 -0.308054 +vn 0.290713 0.936512 0.196037 +vn 0.189636 0.981097 0.038552 +vn 0.323046 0.917751 -0.231027 +vn -0.485203 0.838510 -0.247948 +vn -0.789637 0.530832 0.307718 +vn -0.229224 0.937280 0.262609 +vn -0.725113 0.551469 0.412424 +vn -0.440925 0.826674 0.349565 +vn -0.893952 0.055758 0.444680 +vn -0.866270 -0.149752 0.476603 +vn -0.818586 0.317265 0.478810 +vn -0.601471 0.687134 0.407528 +vn -0.153000 0.958332 0.241228 +vn -0.270909 0.922862 0.273742 +vn -0.604183 0.727550 -0.325012 +vn -0.907131 0.341464 -0.246000 +vn -0.759272 0.639560 -0.120290 +vn -0.961691 0.137923 0.236913 +vn -0.783338 -0.317965 0.534116 +vn -0.920826 -0.005102 0.389940 +vn -0.366810 0.582705 0.725193 +vn -0.510148 0.086317 0.855745 +vn -0.451711 0.120953 0.883928 +vn -0.415889 -0.896986 0.149839 +vn -0.574106 -0.503410 0.645741 +vn -0.424881 -0.731502 0.533274 +vn -0.644336 -0.576176 0.502844 +vn -0.106389 -0.929250 0.353801 +vn -0.051204 -0.976821 0.207842 +vn -0.382426 -0.850032 0.362209 +vn -0.576819 -0.709103 0.405528 +vn -0.817483 -0.365754 0.444911 +vn -0.742455 -0.518473 0.424201 +vn -0.789266 0.038012 0.612874 +vn -0.692523 -0.706779 0.144484 +vn 0.176967 -0.971266 0.159138 +vn -0.152238 -0.986259 0.064154 +vn -0.194902 -0.962162 -0.190415 +vn 0.523824 -0.846351 -0.096434 +vn 0.844178 -0.435251 -0.312922 +vn 0.599860 -0.784118 -0.159142 +vn 0.887513 -0.310801 -0.340182 +vn 0.695932 -0.682696 -0.222722 +vn 0.254673 -0.963498 0.082539 +vn 0.372757 -0.927304 -0.034035 +vn 0.773972 0.549665 -0.314380 +vn 0.907987 0.189886 -0.373501 +vn 0.606595 0.760469 -0.231795 +vn 0.598067 0.764648 -0.240063 +vn 0.766544 0.556778 -0.320014 +vn 0.902648 0.200120 -0.381023 +vn 0.400368 0.908000 -0.123460 +vn 0.068720 0.996483 0.047944 +vn 0.046619 0.998538 0.027349 +vn 0.384745 0.912892 -0.136381 +vn 0.389976 0.910999 -0.134162 +vn 0.599434 0.766048 -0.232054 +vn 0.055052 0.998241 0.021986 +vn 0.079844 0.996241 0.033586 +vn 0.411613 0.904743 -0.109612 +vn 0.615005 0.764501 -0.193149 +vn 0.765133 0.562190 -0.313869 +vn 0.900405 0.209243 -0.381430 +vn 0.771037 0.572035 -0.279781 +vn 0.902326 0.230738 -0.364098 +vn -0.347912 0.904764 0.245681 +vn -0.655583 0.649100 0.385849 +vn -0.666951 0.644283 0.374267 +vn -0.362378 0.904581 0.224532 +vn -0.842278 0.270831 0.466067 +vn -0.863298 -0.194879 0.465551 +vn -0.857776 -0.199423 0.473762 +vn -0.844451 0.265587 0.465151 +vn -0.838964 0.255147 0.480666 +vn -0.668639 0.641550 0.375947 +vn -0.840490 -0.202503 0.502562 +vn -0.783796 -0.209931 0.584460 +vn -0.821274 0.223396 0.524980 +vn -0.668833 0.640151 0.377981 +vn -0.358505 0.907812 0.217602 +vn -0.339845 0.916049 0.212976 +vn -0.729242 -0.562097 0.390195 +vn -0.569824 -0.759215 0.314472 +vn -0.559351 -0.766432 0.315766 +vn -0.723583 -0.561207 0.401839 +vn -0.373510 -0.897158 0.235791 +vn -0.031821 -0.995429 0.090050 +vn -0.010121 -0.997891 0.064120 +vn -0.354446 -0.908664 0.220676 +vn -0.330474 -0.904813 0.268514 +vn -0.529827 -0.762500 0.371319 +vn 0.001616 -0.995692 0.092713 +vn 0.011441 -0.982049 0.188277 +vn -0.291437 -0.854876 0.429245 +vn -0.419348 -0.728934 0.541112 +vn -0.697323 -0.561443 0.445559 +vn -0.577647 -0.586252 0.568007 +vn 0.395816 -0.912132 -0.106514 +vn 0.709883 -0.653979 -0.261490 +vn 0.708079 -0.647675 -0.281321 +vn 0.401610 -0.906306 -0.131601 +vn 0.892056 -0.277321 -0.356831 +vn 0.889114 -0.267928 -0.371068 +vn 0.889425 -0.257550 -0.377612 +vn 0.708869 -0.645553 -0.284194 +vn 0.894317 -0.230149 -0.383703 +vn 0.709820 -0.643684 -0.286055 +vn 0.404180 -0.906659 -0.120864 +vn 0.402476 -0.911809 -0.081342 +vn 0.796331 0.595111 -0.108169 +vn 0.922307 0.290418 -0.254963 +vn 0.680108 0.733092 -0.005431 +vn 0.706345 0.542923 0.454215 +vn 0.825510 0.485949 0.287030 +vn 0.934048 0.303273 0.188627 +vn 0.509022 0.860377 0.025456 +vn 0.182399 0.976882 0.111500 +vn 0.369409 0.819436 0.438248 +vn 0.593363 0.712909 0.373738 +vn 0.438406 0.393334 0.808139 +vn 0.569554 0.217193 0.792739 +vn 0.238281 0.524789 0.817201 +vn -0.204362 0.181845 0.961857 +vn 0.041037 -0.045315 0.998130 +vn 0.227460 -0.234783 0.945060 +vn 0.720391 0.096063 0.686883 +vn 0.831066 -0.068091 0.551990 +vn 0.397425 -0.400653 0.825548 +vn 0.569145 -0.575516 0.587244 +vn -0.257269 0.939022 0.228144 +vn -0.660342 0.649587 0.376810 +vn -0.538278 0.733493 0.415024 +vn -0.026709 0.896895 0.441436 +vn -0.809205 0.185902 0.557340 +vn -0.696064 -0.224719 0.681906 +vn 0.090508 -0.136396 0.986511 +vn -0.355800 0.024080 0.934252 +vn -0.532935 0.838775 0.111523 +vn -0.571959 0.705243 0.418921 +vn 0.407971 0.912854 -0.016061 +vn -0.259666 0.810587 -0.524902 +vn -0.608921 0.784918 -0.114536 +vn -0.678041 0.649099 0.344863 +vn -0.145923 0.677604 0.720804 +vn -0.511694 0.443367 0.735932 +vn -0.328346 -0.601139 0.728575 +vn -0.077584 -0.597427 0.798162 +vn 0.509344 -0.012704 0.860470 +vn 0.219946 -0.293382 0.930350 +vn -0.157709 -0.617529 0.770575 +vn 0.032469 -0.881851 0.470409 +vn 0.157355 -0.378692 0.912048 +vn 0.328620 0.041212 0.943563 +vn 0.668262 0.719351 -0.189628 +vn 0.553636 0.832363 -0.025671 +vn 0.823801 0.491638 -0.282211 +vn 0.400658 0.017946 -0.916052 +vn 0.178127 0.352990 -0.918514 +vn 0.035419 0.561360 -0.826813 +vn 0.733933 0.594514 0.328474 +vn -0.074928 0.713752 -0.696379 +vn 0.387054 -0.921204 0.039661 +vn 0.726528 -0.625357 -0.284756 +vn 0.801971 -0.550476 -0.231991 +vn 0.414130 -0.750609 0.514861 +vn 0.924824 -0.156814 -0.346568 +vn 0.998570 -0.042203 -0.032818 +vn 0.901912 -0.361530 0.236328 +vn 0.782064 -0.568495 -0.255320 +vn 0.698154 -0.696104 0.167394 +vn 0.700372 -0.639365 -0.317317 +vn 0.783635 -0.239058 -0.573382 +vn 0.600577 -0.371034 -0.708266 +vn 0.305349 -0.509936 0.804194 +vn 0.514101 -0.669747 0.535854 +vn 0.120820 -0.346116 0.930380 +vn 0.107665 -0.361064 0.926305 +vn 0.293221 -0.524674 0.799212 +vn 0.509978 -0.682686 0.523319 +vn -0.073096 -0.154821 0.985235 +vn -0.327300 0.119683 0.937310 +vn -0.341718 0.112700 0.933020 +vn -0.086276 -0.169976 0.981664 +vn -0.085428 -0.172588 0.981283 +vn 0.108827 -0.363471 0.925227 +vn -0.341119 0.111275 0.933411 +vn -0.336714 0.106816 0.935529 +vn -0.081887 -0.175874 0.981001 +vn 0.111720 -0.366086 0.923850 +vn 0.294877 -0.526831 0.797180 +vn 0.512602 -0.683880 0.519180 +vn 0.297854 -0.529051 0.794599 +vn 0.514990 -0.684805 0.515584 +vn -0.574302 0.428657 0.697446 +vn -0.688259 0.645838 0.330444 +vn -0.689703 0.644092 0.330842 +vn -0.581892 0.431102 0.689604 +vn -0.653463 0.751116 -0.093860 +vn -0.463391 0.715333 -0.523036 +vn -0.503103 0.690547 -0.519646 +vn -0.667260 0.739702 -0.087210 +vn -0.670073 0.737145 -0.087282 +vn -0.689756 0.643408 0.332058 +vn -0.508513 0.684055 -0.522957 +vn -0.508407 0.680914 -0.527142 +vn -0.671264 0.736030 -0.087550 +vn -0.689570 0.642459 0.334275 +vn -0.581118 0.431171 0.690213 +vn -0.579037 0.428930 0.693351 +vn -0.225812 0.573851 -0.787213 +vn -0.065618 0.429358 -0.900748 +vn -0.098062 0.371113 -0.923396 +vn -0.282999 0.535022 -0.796030 +vn 0.113502 0.221767 -0.968471 +vn 0.360294 -0.082626 -0.929172 +vn 0.348946 -0.108361 -0.930857 +vn 0.095186 0.177961 -0.979423 +vn 0.092125 0.169767 -0.981169 +vn -0.102151 0.361427 -0.926788 +vn 0.347834 -0.116894 -0.930241 +vn 0.351022 -0.123989 -0.928122 +vn 0.093623 0.163700 -0.982058 +vn -0.102198 0.357202 -0.928419 +vn -0.289568 0.525814 -0.799794 +vn -0.288848 0.521677 -0.802757 +vn 0.589010 -0.416349 -0.692619 +vn 0.691632 -0.642358 -0.330184 +vn 0.690106 -0.643522 -0.331110 +vn 0.584542 -0.430037 -0.688026 +vn 0.670457 -0.734721 0.103310 +vn 0.670043 -0.737061 0.088222 +vn 0.671223 -0.736247 0.086022 +vn 0.690089 -0.644167 -0.329886 +vn 0.671689 -0.735898 0.085373 +vn 0.690326 -0.645016 -0.327726 +vn 0.583772 -0.434670 -0.685763 +vn 0.585080 -0.438297 -0.682332 +vn 0.272780 -0.554704 0.786063 +vn 0.484856 -0.713867 0.505281 +vn 0.088266 -0.390106 0.916530 +vn -0.028674 -0.495859 0.867930 +vn 0.147086 -0.664167 0.732972 +vn 0.334233 -0.828328 0.449624 +vn -0.105602 -0.200762 0.973932 +vn -0.361606 0.079134 0.928967 +vn -0.480268 -0.053190 0.875508 +vn -0.223119 -0.313549 0.922987 +vn -0.470000 -0.535656 0.701551 +vn -0.321888 -0.697212 0.640534 +vn -0.680858 -0.321607 0.658029 +vn -0.170784 -0.831717 0.528279 +vn -0.007739 -0.955235 0.295748 +vn -0.606064 0.400642 0.687148 +vn -0.717253 0.614983 0.327634 +vn -0.838559 0.464677 0.284419 +vn -0.727119 0.253593 0.637957 +vn -0.698206 0.709591 -0.094810 +vn -0.532951 0.655860 -0.534613 +vn -0.648086 0.517649 -0.558591 +vn -0.817817 0.560555 -0.130210 +vn -0.971640 0.140198 -0.190420 +vn -0.990646 0.032960 0.132417 +vn -0.824404 0.160033 -0.542906 +vn -0.897752 -0.114624 0.425327 +vn -0.311929 0.497790 -0.809262 +vn -0.124823 0.333474 -0.934459 +vn -0.236490 0.215656 -0.947399 +vn -0.424424 0.373920 -0.824650 +vn 0.069944 0.137727 -0.987998 +vn 0.323623 -0.154393 -0.933505 +vn 0.183084 -0.288298 -0.939875 +vn -0.048944 0.013271 -0.998713 +vn -0.335027 -0.275580 -0.901006 +vn -0.495803 -0.106883 -0.861832 +vn -0.134165 -0.516637 -0.845627 +vn -0.641153 0.044540 -0.766119 +vn 0.553188 -0.469320 -0.688274 +vn 0.656783 -0.675662 -0.334838 +vn 0.485639 -0.796610 -0.359953 +vn 0.389140 -0.596333 -0.702110 +vn 0.638083 -0.766129 0.076785 +vn 0.467970 -0.882902 0.038581 +vn 0.045939 -0.997616 -0.051499 +vn 0.029249 -0.933385 -0.357684 +vn -0.014384 -0.777140 -0.629164 +vn -0.955056 0.177555 0.237364 +vn -0.967108 0.243694 -0.072908 +vn -0.879483 0.226980 0.418319 +vn -0.792798 0.468344 0.390033 +vn -0.878260 0.430867 0.207398 +vn -0.854864 0.511501 -0.087028 +vn -0.718985 0.403817 0.565679 +vn -0.412480 0.615492 0.671588 +vn -0.298761 0.780380 0.549317 +vn -0.609031 0.609858 0.507105 +vn -0.429764 0.814455 0.389828 +vn -0.554572 0.781456 0.285967 +vn -0.207071 0.878171 0.431205 +vn -0.633069 0.760486 0.144514 +vn -0.609888 0.789432 -0.069533 +vn -0.001796 0.770748 0.637137 +vn 0.126307 0.852221 0.507707 +vn 0.220796 0.852203 0.474341 +vn 0.038317 0.855516 0.516357 +vn 0.321181 0.850711 0.416093 +vn 0.704241 0.689173 0.170545 +vn 0.571384 0.802632 0.171179 +vn 0.326297 0.856783 0.399316 +vn 0.266907 0.916772 0.297136 +vn 0.161860 0.915462 0.368417 +vn 0.427735 0.894000 0.133444 +vn 0.022866 0.914992 0.402823 +vn 0.885358 0.432905 -0.169514 +vn 0.876572 0.243609 -0.415062 +vn 0.793686 0.484571 -0.367768 +vn 0.760507 0.634993 -0.135696 +vn 0.781131 0.192573 -0.593928 +vn 0.545986 0.255311 -0.797945 +vn 0.463543 0.516163 -0.720211 +vn 0.706169 0.442402 -0.552817 +vn 0.507772 0.760867 -0.404040 +vn 0.561264 0.788624 -0.251106 +vn 0.324272 0.788407 -0.522746 +vn 0.550020 0.831273 -0.080402 +vn 0.107317 0.368500 -0.923413 +vn -0.392541 0.423654 -0.816351 +vn -0.323746 0.673900 -0.664114 +vn 0.067182 0.626119 -0.776828 +vn -0.788483 0.366317 -0.494071 +vn -0.649022 0.629489 -0.427216 +vn -0.425624 0.858642 -0.285620 +vn -0.212356 0.879843 -0.425184 +vn 0.030206 0.854995 -0.517756 +s 1 +g pCube1 +usemtl pCube1SG +f 1/1/1 507/520/2 171/184/3 514/529/4 +f 507/520/2 87/93/5 339/352/6 171/184/3 +f 171/184/3 339/352/6 129/51/7 342/355/8 +f 514/529/4 171/184/3 342/355/8 90/97/9 +f 87/93/5 508/522/10 172/185/11 339/352/6 +f 508/522/10 2/3/12 509/524/13 172/185/11 +f 172/185/11 509/524/13 88/95/14 340/353/15 +f 339/352/6 172/185/11 340/353/15 129/51/7 +f 129/51/7 340/353/15 173/186/16 341/354/17 +f 340/353/15 88/95/14 510/525/18 173/186/16 +f 173/186/16 510/525/18 4/6/19 511/526/20 +f 341/354/17 173/186/16 511/526/20 89/96/21 +f 90/97/9 342/355/8 174/187/22 513/528/23 +f 342/355/8 129/51/7 341/354/17 174/187/22 +f 174/187/22 341/354/17 89/96/21 512/527/24 +f 513/528/23 174/187/22 512/527/24 3/5/25 +f 41/47/26 515/530/27 175/188/28 522/537/29 +f 515/530/27 91/98/30 343/356/31 175/188/28 +f 175/188/28 343/356/31 130/52/32 346/359/33 +f 522/537/29 175/188/28 346/359/33 94/101/34 +f 91/98/30 516/531/35 176/189/36 343/356/31 +f 516/531/35 42/48/37 517/532/38 176/189/36 +f 176/189/36 517/532/38 92/99/39 344/357/40 +f 343/356/31 176/189/36 344/357/40 130/52/32 +f 130/52/32 344/357/40 177/190/41 345/358/42 +f 344/357/40 92/99/39 518/533/43 177/190/41 +f 177/190/41 518/533/43 43/49/44 519/534/45 +f 345/358/42 177/190/41 519/534/45 93/100/46 +f 94/101/34 346/359/33 178/191/47 521/536/48 +f 346/359/33 130/52/32 345/358/42 178/191/47 +f 178/191/47 345/358/42 93/100/46 520/535/49 +f 521/536/48 178/191/47 520/535/49 44/50/50 +f 5/7/51 523/538/52 179/192/53 530/548/54 +f 523/538/52 95/102/55 347/360/56 179/192/53 +f 179/192/53 347/360/56 131/53/57 350/363/58 +f 530/548/54 179/192/53 350/363/58 98/106/59 +f 95/102/55 524/539/60 180/193/61 347/360/56 +f 524/539/60 6/9/62 525/540/63 180/193/61 +f 180/193/61 525/540/63 96/103/64 348/361/65 +f 347/360/56 180/193/61 348/361/65 131/53/57 +f 131/53/57 348/361/65 181/194/66 349/362/67 +f 348/361/65 96/103/64 526/542/68 181/194/66 +f 181/194/66 526/542/68 8/13/69 527/544/70 +f 349/362/67 181/194/66 527/544/70 97/105/71 +f 98/106/59 350/363/58 182/195/72 529/546/73 +f 350/363/58 131/53/57 349/362/67 182/195/72 +f 182/195/72 349/362/67 97/105/71 528/545/74 +f 529/546/73 182/195/72 528/545/74 7/11/75 +f 7/11/75 528/545/74 183/196/76 534/556/77 +f 528/545/74 97/105/71 351/364/78 183/196/76 +f 183/196/76 351/364/78 132/54/79 354/367/80 +f 534/556/77 183/196/76 354/367/80 100/110/81 +f 97/105/71 527/544/70 184/197/82 351/364/78 +f 527/544/70 8/13/69 531/550/83 184/197/82 +f 184/197/82 531/550/83 99/108/84 352/365/85 +f 351/364/78 184/197/82 352/365/85 132/54/79 +f 132/54/79 352/365/85 185/198/86 353/366/87 +f 352/365/85 99/108/84 532/552/88 185/198/86 +f 185/198/86 532/552/88 2/4/12 508/523/10 +f 353/366/87 185/198/86 508/523/10 87/94/5 +f 100/110/81 354/367/80 186/199/89 533/554/90 +f 354/367/80 132/54/79 353/366/87 186/199/89 +f 186/199/89 353/366/87 87/94/5 507/521/2 +f 533/554/90 186/199/89 507/521/2 1/2/1 +f 2/3/12 532/553/88 187/200/91 509/524/13 +f 532/553/88 99/109/84 355/368/92 187/200/91 +f 187/200/91 355/368/92 133/55/93 358/371/94 +f 509/524/13 187/200/91 358/371/94 88/95/14 +f 99/109/84 531/551/83 188/201/95 355/368/92 +f 531/551/83 8/14/69 526/543/68 188/201/95 +f 188/201/95 526/543/68 96/104/64 356/369/96 +f 355/368/92 188/201/95 356/369/96 133/55/93 +f 133/55/93 356/369/96 189/202/97 357/370/98 +f 356/369/96 96/104/64 525/541/63 189/202/97 +f 189/202/97 525/541/63 6/10/62 535/558/99 +f 357/370/98 189/202/97 535/558/99 101/112/100 +f 88/95/14 358/371/94 190/203/101 510/525/18 +f 358/371/94 133/55/93 357/370/98 190/203/101 +f 190/203/101 357/370/98 101/112/100 536/560/102 +f 510/525/18 190/203/101 536/560/102 4/6/19 +f 7/12/75 534/557/77 191/204/103 529/547/73 +f 534/557/77 100/111/81 359/372/104 191/204/103 +f 191/204/103 359/372/104 134/56/105 362/375/106 +f 529/547/73 191/204/103 362/375/106 98/107/59 +f 100/111/81 533/555/90 192/205/107 359/372/104 +f 533/555/90 1/1/1 514/529/4 192/205/107 +f 192/205/107 514/529/4 90/97/9 360/373/108 +f 359/372/104 192/205/107 360/373/108 134/56/105 +f 134/56/105 360/373/108 193/206/109 361/374/110 +f 360/373/108 90/97/9 513/528/23 193/206/109 +f 193/206/109 513/528/23 3/5/25 537/562/111 +f 361/374/110 193/206/109 537/562/111 102/114/112 +f 98/107/59 362/375/106 194/207/113 530/549/54 +f 362/375/106 134/56/105 361/374/110 194/207/113 +f 194/207/113 361/374/110 102/114/112 538/564/114 +f 530/549/54 194/207/113 538/564/114 5/8/51 +f 3/5/25 512/527/24 195/208/115 544/571/116 +f 512/527/24 89/96/21 363/376/117 195/208/115 +f 195/208/115 363/376/117 135/57/118 366/379/119 +f 544/571/116 195/208/115 366/379/119 105/118/120 +f 89/96/21 511/526/20 196/209/121 363/376/117 +f 511/526/20 4/6/19 539/566/122 196/209/121 +f 196/209/121 539/566/122 103/116/123 364/377/124 +f 363/376/117 196/209/121 364/377/124 135/57/118 +f 135/57/118 364/377/124 197/210/125 365/378/126 +f 364/377/124 103/116/123 540/567/127 197/210/125 +f 197/210/125 540/567/127 10/16/128 541/568/129 +f 365/378/126 197/210/125 541/568/129 104/117/130 +f 105/118/120 366/379/119 198/211/131 543/570/132 +f 366/379/119 135/57/118 365/378/126 198/211/131 +f 198/211/131 365/378/126 104/117/130 542/569/133 +f 543/570/132 198/211/131 542/569/133 9/15/134 +f 4/6/19 536/561/102 199/212/135 539/566/122 +f 536/561/102 101/113/100 367/380/136 199/212/135 +f 199/212/135 367/380/136 136/58/137 370/383/138 +f 539/566/122 199/212/135 370/383/138 103/116/123 +f 101/113/100 535/559/99 200/213/139 367/380/136 +f 535/559/99 6/9/62 545/572/140 200/213/139 +f 200/213/139 545/572/140 106/119/141 368/381/142 +f 367/380/136 200/213/139 368/381/142 136/58/137 +f 136/58/137 368/381/142 201/214/143 369/382/144 +f 368/381/142 106/119/141 546/573/145 201/214/143 +f 201/214/143 546/573/145 11/17/146 547/574/147 +f 369/382/144 201/214/143 547/574/147 107/120/148 +f 103/116/123 370/383/138 202/215/149 540/567/127 +f 370/383/138 136/58/137 369/382/144 202/215/149 +f 202/215/149 369/382/144 107/120/148 548/575/150 +f 540/567/127 202/215/149 548/575/150 10/16/128 +f 6/9/62 524/539/60 203/216/151 545/572/140 +f 524/539/60 95/102/55 371/384/152 203/216/151 +f 203/216/151 371/384/152 137/59/153 374/387/154 +f 545/572/140 203/216/151 374/387/154 106/119/141 +f 95/102/55 523/538/52 204/217/155 371/384/152 +f 523/538/52 5/7/51 549/576/156 204/217/155 +f 204/217/155 549/576/156 108/121/157 372/385/158 +f 371/384/152 204/217/155 372/385/158 137/59/153 +f 137/59/153 372/385/158 205/218/159 373/386/160 +f 372/385/158 108/121/157 550/577/161 205/218/159 +f 205/218/159 550/577/161 12/18/162 551/578/163 +f 373/386/160 205/218/159 551/578/163 109/122/164 +f 106/119/141 374/387/154 206/219/165 546/573/145 +f 374/387/154 137/59/153 373/386/160 206/219/165 +f 206/219/165 373/386/160 109/122/164 552/579/166 +f 546/573/145 206/219/165 552/579/166 11/17/146 +f 5/7/51 538/565/114 207/220/167 549/576/156 +f 538/565/114 102/115/112 375/388/168 207/220/167 +f 207/220/167 375/388/168 138/60/169 378/391/170 +f 549/576/156 207/220/167 378/391/170 108/121/157 +f 102/115/112 537/563/111 208/221/171 375/388/168 +f 537/563/111 3/5/25 544/571/116 208/221/171 +f 208/221/171 544/571/116 105/118/120 376/389/172 +f 375/388/168 208/221/171 376/389/172 138/60/169 +f 138/60/169 376/389/172 209/222/173 377/390/174 +f 376/389/172 105/118/120 543/570/132 209/222/173 +f 209/222/173 543/570/132 9/15/134 553/580/175 +f 377/390/174 209/222/173 553/580/175 110/123/176 +f 108/121/157 378/391/170 210/223/177 550/577/161 +f 378/391/170 138/60/169 377/390/174 210/223/177 +f 210/223/177 377/390/174 110/123/176 554/581/178 +f 550/577/161 210/223/177 554/581/178 12/18/162 +f 9/15/134 542/569/133 211/224/179 560/587/180 +f 542/569/133 104/117/130 379/392/181 211/224/179 +f 211/224/179 379/392/181 139/61/182 382/395/183 +f 560/587/180 211/224/179 382/395/183 113/126/184 +f 104/117/130 541/568/129 212/225/185 379/392/181 +f 541/568/129 10/16/128 555/582/186 212/225/185 +f 212/225/185 555/582/186 111/124/187 380/393/188 +f 379/392/181 212/225/185 380/393/188 139/61/182 +f 139/61/182 380/393/188 213/226/189 381/394/190 +f 380/393/188 111/124/187 556/583/191 213/226/189 +f 213/226/189 556/583/191 14/20/192 557/584/193 +f 381/394/190 213/226/189 557/584/193 112/125/194 +f 113/126/184 382/395/183 214/227/195 559/586/196 +f 382/395/183 139/61/182 381/394/190 214/227/195 +f 214/227/195 381/394/190 112/125/194 558/585/197 +f 559/586/196 214/227/195 558/585/197 13/19/198 +f 10/16/128 548/575/150 215/228/199 555/582/186 +f 548/575/150 107/120/148 383/396/200 215/228/199 +f 215/228/199 383/396/200 140/62/201 386/399/202 +f 555/582/186 215/228/199 386/399/202 111/124/187 +f 107/120/148 547/574/147 216/229/203 383/396/200 +f 547/574/147 11/17/146 561/588/204 216/229/203 +f 216/229/203 561/588/204 114/127/205 384/397/206 +f 383/396/200 216/229/203 384/397/206 140/62/201 +f 140/62/201 384/397/206 217/230/207 385/398/208 +f 384/397/206 114/127/205 562/589/209 217/230/207 +f 217/230/207 562/589/209 15/21/210 563/590/211 +f 385/398/208 217/230/207 563/590/211 115/128/212 +f 111/124/187 386/399/202 218/231/213 556/583/191 +f 386/399/202 140/62/201 385/398/208 218/231/213 +f 218/231/213 385/398/208 115/128/212 564/591/214 +f 556/583/191 218/231/213 564/591/214 14/20/192 +f 11/17/146 552/579/166 219/232/215 561/588/204 +f 552/579/166 109/122/164 387/400/216 219/232/215 +f 219/232/215 387/400/216 141/63/217 390/403/218 +f 561/588/204 219/232/215 390/403/218 114/127/205 +f 109/122/164 551/578/163 220/233/219 387/400/216 +f 551/578/163 12/18/162 565/592/220 220/233/219 +f 220/233/219 565/592/220 116/129/221 388/401/222 +f 387/400/216 220/233/219 388/401/222 141/63/217 +f 141/63/217 388/401/222 221/234/223 389/402/224 +f 388/401/222 116/129/221 566/593/225 221/234/223 +f 221/234/223 566/593/225 16/22/226 567/594/227 +f 389/402/224 221/234/223 567/594/227 117/130/228 +f 114/127/205 390/403/218 222/235/229 562/589/209 +f 390/403/218 141/63/217 389/402/224 222/235/229 +f 222/235/229 389/402/224 117/130/228 568/595/230 +f 562/589/209 222/235/229 568/595/230 15/21/210 +f 12/18/162 554/581/178 223/236/231 565/592/220 +f 554/581/178 110/123/176 391/404/232 223/236/231 +f 223/236/231 391/404/232 142/64/233 394/407/234 +f 565/592/220 223/236/231 394/407/234 116/129/221 +f 110/123/176 553/580/175 224/237/235 391/404/232 +f 553/580/175 9/15/134 560/587/180 224/237/235 +f 224/237/235 560/587/180 113/126/184 392/405/236 +f 391/404/232 224/237/235 392/405/236 142/64/233 +f 142/64/233 392/405/236 225/238/237 393/406/238 +f 392/405/236 113/126/184 559/586/196 225/238/237 +f 225/238/237 559/586/196 13/19/198 569/596/239 +f 393/406/238 225/238/237 569/596/239 118/131/240 +f 116/129/221 394/407/234 226/239/241 566/593/225 +f 394/407/234 142/64/233 393/406/238 226/239/241 +f 226/239/241 393/406/238 118/131/240 570/597/242 +f 566/593/225 226/239/241 570/597/242 16/22/226 +f 13/19/198 558/585/197 227/240/243 576/603/244 +f 558/585/197 112/125/194 395/408/245 227/240/243 +f 227/240/243 395/408/245 143/65/246 398/411/247 +f 576/603/244 227/240/243 398/411/247 121/134/248 +f 112/125/194 557/584/193 228/241/249 395/408/245 +f 557/584/193 14/20/192 571/598/250 228/241/249 +f 228/241/249 571/598/250 119/132/251 396/409/252 +f 395/408/245 228/241/249 396/409/252 143/65/246 +f 143/65/246 396/409/252 229/242/253 397/410/254 +f 396/409/252 119/132/251 572/599/255 229/242/253 +f 229/242/253 572/599/255 18/24/256 573/600/257 +f 397/410/254 229/242/253 573/600/257 120/133/258 +f 121/134/248 398/411/247 230/243/259 575/602/260 +f 398/411/247 143/65/246 397/410/254 230/243/259 +f 230/243/259 397/410/254 120/133/258 574/601/261 +f 575/602/260 230/243/259 574/601/261 17/23/262 +f 37/43/263 577/604/264 231/244/265 584/611/266 +f 577/604/264 122/135/267 399/412/268 231/244/265 +f 231/244/265 399/412/268 144/66/269 402/415/270 +f 584/611/266 231/244/265 402/415/270 125/138/271 +f 122/135/267 578/605/272 232/245/273 399/412/268 +f 578/605/272 38/44/274 579/606/275 232/245/273 +f 232/245/273 579/606/275 123/136/276 400/413/277 +f 399/412/268 232/245/273 400/413/277 144/66/269 +f 144/66/269 400/413/277 233/246/278 401/414/279 +f 400/413/277 123/136/276 580/607/280 233/246/278 +f 233/246/278 580/607/280 39/45/281 581/608/282 +f 401/414/279 233/246/278 581/608/282 124/137/283 +f 125/138/271 402/415/270 234/247/284 583/610/285 +f 402/415/270 144/66/269 401/414/279 234/247/284 +f 234/247/284 401/414/279 124/137/283 582/609/286 +f 583/610/285 234/247/284 582/609/286 40/46/287 +f 15/21/210 568/595/230 235/248/288 590/617/289 +f 568/595/230 117/130/228 403/416/290 235/248/288 +f 235/248/288 403/416/290 145/67/291 406/419/292 +f 590/617/289 235/248/288 406/419/292 128/141/293 +f 117/130/228 567/594/227 236/249/294 403/416/290 +f 567/594/227 16/22/226 585/612/295 236/249/294 +f 236/249/294 585/612/295 126/139/296 404/417/297 +f 403/416/290 236/249/294 404/417/297 145/67/291 +f 145/67/291 404/417/297 237/250/298 405/418/299 +f 404/417/297 126/139/296 586/613/300 237/250/298 +f 237/250/298 586/613/300 20/26/301 587/614/302 +f 405/418/299 237/250/298 587/614/302 127/140/303 +f 128/141/293 406/419/292 238/251/304 589/616/305 +f 406/419/292 145/67/291 405/418/299 238/251/304 +f 238/251/304 405/418/299 127/140/303 588/615/306 +f 589/616/305 238/251/304 588/615/306 19/25/307 +f 16/22/226 570/597/242 239/252/308 585/612/295 +f 570/597/242 118/131/240 407/420/309 239/252/308 +f 239/252/308 407/420/309 146/68/310 410/423/311 +f 585/612/295 239/252/308 410/423/311 126/139/296 +f 118/131/240 569/596/239 240/253/312 407/420/309 +f 569/596/239 13/19/198 576/603/244 240/253/312 +f 240/253/312 576/603/244 121/134/248 408/421/313 +f 407/420/309 240/253/312 408/421/313 146/68/310 +f 146/68/310 408/421/313 241/254/314 409/422/315 +f 408/421/313 121/134/248 575/602/260 241/254/314 +f 241/254/314 575/602/260 17/23/262 591/618/316 +f 409/422/315 241/254/314 591/618/316 45/142/317 +f 126/139/296 410/423/311 242/255/318 586/613/300 +f 410/423/311 146/68/310 409/422/315 242/255/318 +f 242/255/318 409/422/315 45/142/317 592/619/319 +f 586/613/300 242/255/318 592/619/319 20/26/301 +f 14/20/192 564/591/214 243/256/320 598/625/321 +f 564/591/214 115/128/212 411/424/322 243/256/320 +f 243/256/320 411/424/322 147/69/323 414/427/324 +f 598/625/321 243/256/320 414/427/324 48/145/325 +f 115/128/212 563/590/211 244/257/326 411/424/322 +f 563/590/211 15/21/210 593/620/327 244/257/326 +f 244/257/326 593/620/327 46/143/328 412/425/329 +f 411/424/322 244/257/326 412/425/329 147/69/323 +f 147/69/323 412/425/329 245/258/330 413/426/331 +f 412/425/329 46/143/328 594/621/332 245/258/330 +f 245/258/330 594/621/332 22/28/333 595/622/334 +f 413/426/331 245/258/330 595/622/334 47/144/335 +f 48/145/325 414/427/324 246/259/336 597/624/337 +f 414/427/324 147/69/323 413/426/331 246/259/336 +f 246/259/336 413/426/331 47/144/335 596/623/338 +f 597/624/337 246/259/336 596/623/338 21/27/339 +f 15/21/210 590/617/289 247/260/340 593/620/327 +f 590/617/289 128/141/293 415/428/341 247/260/340 +f 247/260/340 415/428/341 148/70/342 418/431/343 +f 593/620/327 247/260/340 418/431/343 46/143/328 +f 128/141/293 589/616/305 248/261/344 415/428/341 +f 589/616/305 19/25/307 599/626/345 248/261/344 +f 248/261/344 599/626/345 49/146/346 416/429/347 +f 415/428/341 248/261/344 416/429/347 148/70/342 +f 148/70/342 416/429/347 249/262/348 417/430/349 +f 416/429/347 49/146/346 600/627/350 249/262/348 +f 249/262/348 600/627/350 23/29/351 601/628/352 +f 417/430/349 249/262/348 601/628/352 50/147/353 +f 46/143/328 418/431/343 250/263/354 594/621/332 +f 418/431/343 148/70/342 417/430/349 250/263/354 +f 250/263/354 417/430/349 50/147/353 602/629/355 +f 594/621/332 250/263/354 602/629/355 22/28/333 +f 19/25/307 603/630/356 251/264/357 599/626/345 +f 603/630/356 51/148/358 419/432/359 251/264/357 +f 251/264/357 419/432/359 149/71/360 422/435/361 +f 599/626/345 251/264/357 422/435/361 49/146/346 +f 51/148/358 604/631/362 252/265/363 419/432/359 +f 604/631/362 18/24/256 605/632/364 252/265/363 +f 252/265/363 605/632/364 52/149/365 420/433/366 +f 419/432/359 252/265/363 420/433/366 149/71/360 +f 149/71/360 420/433/366 253/266/367 421/434/368 +f 420/433/366 52/149/365 606/633/369 253/266/367 +f 253/266/367 606/633/369 24/30/370 607/634/371 +f 421/434/368 253/266/367 607/634/371 53/150/372 +f 49/146/346 422/435/361 254/267/373 600/627/350 +f 422/435/361 149/71/360 421/434/368 254/267/373 +f 254/267/373 421/434/368 53/150/372 608/635/374 +f 600/627/350 254/267/373 608/635/374 23/29/351 +f 18/24/256 572/599/255 255/268/375 605/632/364 +f 572/599/255 119/132/251 423/436/376 255/268/375 +f 255/268/375 423/436/376 150/72/377 426/439/378 +f 605/632/364 255/268/375 426/439/378 52/149/365 +f 119/132/251 571/598/250 256/269/379 423/436/376 +f 571/598/250 14/20/192 598/625/321 256/269/379 +f 256/269/379 598/625/321 48/145/325 424/437/380 +f 423/436/376 256/269/379 424/437/380 150/72/377 +f 150/72/377 424/437/380 257/270/381 425/438/382 +f 424/437/380 48/145/325 597/624/337 257/270/381 +f 257/270/381 597/624/337 21/27/339 609/636/383 +f 425/438/382 257/270/381 609/636/383 54/151/384 +f 52/149/365 426/439/378 258/271/385 606/633/369 +f 426/439/378 150/72/377 425/438/382 258/271/385 +f 258/271/385 425/438/382 54/151/384 610/637/386 +f 606/633/369 258/271/385 610/637/386 24/30/370 +f 21/27/339 596/623/338 259/272/387 616/643/388 +f 596/623/338 47/144/335 427/440/389 259/272/387 +f 259/272/387 427/440/389 151/73/390 430/443/391 +f 616/643/388 259/272/387 430/443/391 57/154/392 +f 47/144/335 595/622/334 260/273/393 427/440/389 +f 595/622/334 22/28/333 611/638/394 260/273/393 +f 260/273/393 611/638/394 55/152/395 428/441/396 +f 427/440/389 260/273/393 428/441/396 151/73/390 +f 151/73/390 428/441/396 261/274/397 429/442/398 +f 428/441/396 55/152/395 612/639/399 261/274/397 +f 261/274/397 612/639/399 26/32/400 613/640/401 +f 429/442/398 261/274/397 613/640/401 56/153/402 +f 57/154/392 430/443/391 262/275/403 615/642/404 +f 430/443/391 151/73/390 429/442/398 262/275/403 +f 262/275/403 429/442/398 56/153/402 614/641/405 +f 615/642/404 262/275/403 614/641/405 25/31/406 +f 22/28/333 602/629/355 263/276/407 611/638/394 +f 602/629/355 50/147/353 431/444/408 263/276/407 +f 263/276/407 431/444/408 152/74/409 434/447/410 +f 611/638/394 263/276/407 434/447/410 55/152/395 +f 50/147/353 601/628/352 264/277/411 431/444/408 +f 601/628/352 23/29/351 617/644/412 264/277/411 +f 264/277/411 617/644/412 58/155/413 432/445/414 +f 431/444/408 264/277/411 432/445/414 152/74/409 +f 152/74/409 432/445/414 265/278/415 433/446/416 +f 432/445/414 58/155/413 618/645/417 265/278/415 +f 265/278/415 618/645/417 27/33/418 619/646/419 +f 433/446/416 265/278/415 619/646/419 59/156/420 +f 55/152/395 434/447/410 266/279/421 612/639/399 +f 434/447/410 152/74/409 433/446/416 266/279/421 +f 266/279/421 433/446/416 59/156/420 620/647/422 +f 612/639/399 266/279/421 620/647/422 26/32/400 +f 23/29/351 608/635/374 267/280/423 617/644/412 +f 608/635/374 53/150/372 435/448/424 267/280/423 +f 267/280/423 435/448/424 153/75/425 438/451/426 +f 617/644/412 267/280/423 438/451/426 58/155/413 +f 53/150/372 607/634/371 268/281/427 435/448/424 +f 607/634/371 24/30/370 621/648/428 268/281/427 +f 268/281/427 621/648/428 60/157/429 436/449/430 +f 435/448/424 268/281/427 436/449/430 153/75/425 +f 153/75/425 436/449/430 269/282/431 437/450/432 +f 436/449/430 60/157/429 622/649/433 269/282/431 +f 269/282/431 622/649/433 28/34/434 623/650/435 +f 437/450/432 269/282/431 623/650/435 61/158/436 +f 58/155/413 438/451/426 270/283/437 618/645/417 +f 438/451/426 153/75/425 437/450/432 270/283/437 +f 270/283/437 437/450/432 61/158/436 624/651/438 +f 618/645/417 270/283/437 624/651/438 27/33/418 +f 24/30/370 610/637/386 271/284/439 621/648/428 +f 610/637/386 54/151/384 439/452/440 271/284/439 +f 271/284/439 439/452/440 154/76/441 442/455/442 +f 621/648/428 271/284/439 442/455/442 60/157/429 +f 54/151/384 609/636/383 272/285/443 439/452/440 +f 609/636/383 21/27/339 616/643/388 272/285/443 +f 272/285/443 616/643/388 57/154/392 440/453/444 +f 439/452/440 272/285/443 440/453/444 154/76/441 +f 154/76/441 440/453/444 273/286/445 441/454/446 +f 440/453/444 57/154/392 615/642/404 273/286/445 +f 273/286/445 615/642/404 25/31/406 625/652/447 +f 441/454/446 273/286/445 625/652/447 62/159/448 +f 60/157/429 442/455/442 274/287/449 622/649/433 +f 442/455/442 154/76/441 441/454/446 274/287/449 +f 274/287/449 441/454/446 62/159/448 626/653/450 +f 622/649/433 274/287/449 626/653/450 28/34/434 +f 25/31/406 614/641/405 275/288/451 632/659/452 +f 614/641/405 56/153/402 443/456/453 275/288/451 +f 275/288/451 443/456/453 155/77/454 446/459/455 +f 632/659/452 275/288/451 446/459/455 65/162/456 +f 56/153/402 613/640/401 276/289/457 443/456/453 +f 613/640/401 26/32/400 627/654/458 276/289/457 +f 276/289/457 627/654/458 63/160/459 444/457/460 +f 443/456/453 276/289/457 444/457/460 155/77/454 +f 155/77/454 444/457/460 277/290/461 445/458/462 +f 444/457/460 63/160/459 628/655/463 277/290/461 +f 277/290/461 628/655/463 30/36/464 629/656/465 +f 445/458/462 277/290/461 629/656/465 64/161/466 +f 65/162/456 446/459/455 278/291/467 631/658/468 +f 446/459/455 155/77/454 445/458/462 278/291/467 +f 278/291/467 445/458/462 64/161/466 630/657/469 +f 631/658/468 278/291/467 630/657/469 29/35/470 +f 26/32/400 620/647/422 279/292/471 627/654/458 +f 620/647/422 59/156/420 447/460/472 279/292/471 +f 279/292/471 447/460/472 156/78/473 450/463/474 +f 627/654/458 279/292/471 450/463/474 63/160/459 +f 59/156/420 619/646/419 280/293/475 447/460/472 +f 619/646/419 27/33/418 633/660/476 280/293/475 +f 280/293/475 633/660/476 66/163/477 448/461/478 +f 447/460/472 280/293/475 448/461/478 156/78/473 +f 156/78/473 448/461/478 281/294/479 449/462/480 +f 448/461/478 66/163/477 634/661/481 281/294/479 +f 281/294/479 634/661/481 31/37/482 635/662/483 +f 449/462/480 281/294/479 635/662/483 67/164/484 +f 63/160/459 450/463/474 282/295/485 628/655/463 +f 450/463/474 156/78/473 449/462/480 282/295/485 +f 282/295/485 449/462/480 67/164/484 636/663/486 +f 628/655/463 282/295/485 636/663/486 30/36/464 +f 27/33/418 624/651/438 283/296/487 633/660/476 +f 624/651/438 61/158/436 451/464/488 283/296/487 +f 283/296/487 451/464/488 157/79/489 454/467/490 +f 633/660/476 283/296/487 454/467/490 66/163/477 +f 61/158/436 623/650/435 284/297/491 451/464/488 +f 623/650/435 28/34/434 637/664/492 284/297/491 +f 284/297/491 637/664/492 68/165/493 452/465/494 +f 451/464/488 284/297/491 452/465/494 157/79/489 +f 157/79/489 452/465/494 285/298/495 453/466/496 +f 452/465/494 68/165/493 638/665/497 285/298/495 +f 285/298/495 638/665/497 32/38/498 639/666/499 +f 453/466/496 285/298/495 639/666/499 69/166/500 +f 66/163/477 454/467/490 286/299/501 634/661/481 +f 454/467/490 157/79/489 453/466/496 286/299/501 +f 286/299/501 453/466/496 69/166/500 640/667/502 +f 634/661/481 286/299/501 640/667/502 31/37/482 +f 28/34/434 626/653/450 287/300/503 637/664/492 +f 626/653/450 62/159/448 455/468/504 287/300/503 +f 287/300/503 455/468/504 158/80/505 458/471/506 +f 637/664/492 287/300/503 458/471/506 68/165/493 +f 62/159/448 625/652/447 288/301/507 455/468/504 +f 625/652/447 25/31/406 632/659/452 288/301/507 +f 288/301/507 632/659/452 65/162/456 456/469/508 +f 455/468/504 288/301/507 456/469/508 158/80/505 +f 158/80/505 456/469/508 289/302/509 457/470/510 +f 456/469/508 65/162/456 631/658/468 289/302/509 +f 289/302/509 631/658/468 29/35/470 641/668/511 +f 457/470/510 289/302/509 641/668/511 70/167/512 +f 68/165/493 458/471/506 290/303/513 638/665/497 +f 458/471/506 158/80/505 457/470/510 290/303/513 +f 290/303/513 457/470/510 70/167/512 642/669/514 +f 638/665/497 290/303/513 642/669/514 32/38/498 +f 29/35/470 630/657/469 291/304/515 648/675/516 +f 630/657/469 64/161/466 459/472/517 291/304/515 +f 291/304/515 459/472/517 159/81/518 462/475/519 +f 648/675/516 291/304/515 462/475/519 73/170/520 +f 64/161/466 629/656/465 292/305/521 459/472/517 +f 629/656/465 30/36/464 643/670/522 292/305/521 +f 292/305/521 643/670/522 71/168/523 460/473/524 +f 459/472/517 292/305/521 460/473/524 159/81/518 +f 159/81/518 460/473/524 293/306/525 461/474/526 +f 460/473/524 71/168/523 644/671/527 293/306/525 +f 293/306/525 644/671/527 34/40/528 645/672/529 +f 461/474/526 293/306/525 645/672/529 72/169/530 +f 73/170/520 462/475/519 294/307/531 647/674/532 +f 462/475/519 159/81/518 461/474/526 294/307/531 +f 294/307/531 461/474/526 72/169/530 646/673/533 +f 647/674/532 294/307/531 646/673/533 33/39/534 +f 30/36/464 636/663/486 295/308/535 643/670/522 +f 636/663/486 67/164/484 463/476/536 295/308/535 +f 295/308/535 463/476/536 160/82/537 466/479/538 +f 643/670/522 295/308/535 466/479/538 71/168/523 +f 67/164/484 635/662/483 296/309/539 463/476/536 +f 635/662/483 31/37/482 649/676/540 296/309/539 +f 296/309/539 649/676/540 74/171/541 464/477/542 +f 463/476/536 296/309/539 464/477/542 160/82/537 +f 160/82/537 464/477/542 297/310/543 465/478/544 +f 464/477/542 74/171/541 650/677/545 297/310/543 +f 297/310/543 650/677/545 35/41/546 651/678/547 +f 465/478/544 297/310/543 651/678/547 75/172/548 +f 71/168/523 466/479/538 298/311/549 644/671/527 +f 466/479/538 160/82/537 465/478/544 298/311/549 +f 298/311/549 465/478/544 75/172/548 652/679/550 +f 644/671/527 298/311/549 652/679/550 34/40/528 +f 31/37/482 640/667/502 299/312/551 649/676/540 +f 640/667/502 69/166/500 467/480/552 299/312/551 +f 299/312/551 467/480/552 161/83/553 470/483/554 +f 649/676/540 299/312/551 470/483/554 74/171/541 +f 69/166/500 639/666/499 300/313/555 467/480/552 +f 639/666/499 32/38/498 653/680/556 300/313/555 +f 300/313/555 653/680/556 76/173/557 468/481/558 +f 467/480/552 300/313/555 468/481/558 161/83/553 +f 161/83/553 468/481/558 301/314/559 469/482/560 +f 468/481/558 76/173/557 654/681/561 301/314/559 +f 301/314/559 654/681/561 36/42/562 655/682/563 +f 469/482/560 301/314/559 655/682/563 77/174/564 +f 74/171/541 470/483/554 302/315/565 650/677/545 +f 470/483/554 161/83/553 469/482/560 302/315/565 +f 302/315/565 469/482/560 77/174/564 656/683/566 +f 650/677/545 302/315/565 656/683/566 35/41/546 +f 32/38/498 642/669/514 303/316/567 653/680/556 +f 642/669/514 70/167/512 471/484/568 303/316/567 +f 303/316/567 471/484/568 162/84/569 474/487/570 +f 653/680/556 303/316/567 474/487/570 76/173/557 +f 70/167/512 641/668/511 304/317/571 471/484/568 +f 641/668/511 29/35/470 648/675/516 304/317/571 +f 304/317/571 648/675/516 73/170/520 472/485/572 +f 471/484/568 304/317/571 472/485/572 162/84/569 +f 162/84/569 472/485/572 305/318/573 473/486/574 +f 472/485/572 73/170/520 647/674/532 305/318/573 +f 305/318/573 647/674/532 33/39/534 657/684/575 +f 473/486/574 305/318/573 657/684/575 78/175/576 +f 76/173/557 474/487/570 306/319/577 654/681/561 +f 474/487/570 162/84/569 473/486/574 306/319/577 +f 306/319/577 473/486/574 78/175/576 658/685/578 +f 654/681/561 306/319/577 658/685/578 36/42/562 +f 33/39/534 646/673/533 307/320/579 662/689/580 +f 646/673/533 72/169/530 475/488/581 307/320/579 +f 307/320/579 475/488/581 163/85/582 478/491/583 +f 662/689/580 307/320/579 478/491/583 80/177/584 +f 72/169/530 645/672/529 308/321/585 475/488/581 +f 645/672/529 34/40/528 659/686/586 308/321/585 +f 308/321/585 659/686/586 79/176/587 476/489/588 +f 475/488/581 308/321/585 476/489/588 163/85/582 +f 163/85/582 476/489/588 309/322/589 477/490/590 +f 476/489/588 79/176/587 660/687/591 309/322/589 +f 309/322/589 660/687/591 38/44/274 578/605/272 +f 477/490/590 309/322/589 578/605/272 122/135/267 +f 80/177/584 478/491/583 310/323/592 661/688/593 +f 478/491/583 163/85/582 477/490/590 310/323/592 +f 310/323/592 477/490/590 122/135/267 577/604/264 +f 661/688/593 310/323/592 577/604/264 37/43/263 +f 34/40/528 652/679/550 311/324/594 659/686/586 +f 652/679/550 75/172/548 479/492/595 311/324/594 +f 311/324/594 479/492/595 164/86/596 482/495/597 +f 659/686/586 311/324/594 482/495/597 79/176/587 +f 75/172/548 651/678/547 312/325/598 479/492/595 +f 651/678/547 35/41/546 663/690/599 312/325/598 +f 312/325/598 663/690/599 81/178/600 480/493/601 +f 479/492/595 312/325/598 480/493/601 164/86/596 +f 164/86/596 480/493/601 313/326/602 481/494/603 +f 480/493/601 81/178/600 664/691/604 313/326/602 +f 313/326/602 664/691/604 39/45/281 580/607/280 +f 481/494/603 313/326/602 580/607/280 123/136/276 +f 79/176/587 482/495/597 314/327/605 660/687/591 +f 482/495/597 164/86/596 481/494/603 314/327/605 +f 314/327/605 481/494/603 123/136/276 579/606/275 +f 660/687/591 314/327/605 579/606/275 38/44/274 +f 35/41/546 656/683/566 315/328/606 663/690/599 +f 656/683/566 77/174/564 483/496/607 315/328/606 +f 315/328/606 483/496/607 165/87/608 486/499/609 +f 663/690/599 315/328/606 486/499/609 81/178/600 +f 77/174/564 655/682/563 316/329/610 483/496/607 +f 655/682/563 36/42/562 665/692/611 316/329/610 +f 316/329/610 665/692/611 82/179/612 484/497/613 +f 483/496/607 316/329/610 484/497/613 165/87/608 +f 165/87/608 484/497/613 317/330/614 485/498/615 +f 484/497/613 82/179/612 666/693/616 317/330/614 +f 317/330/614 666/693/616 40/46/287 582/609/286 +f 485/498/615 317/330/614 582/609/286 124/137/283 +f 81/178/600 486/499/609 318/331/617 664/691/604 +f 486/499/609 165/87/608 485/498/615 318/331/617 +f 318/331/617 485/498/615 124/137/283 581/608/282 +f 664/691/604 318/331/617 581/608/282 39/45/281 +f 36/42/562 658/685/578 319/332/618 665/692/611 +f 658/685/578 78/175/576 487/500/619 319/332/618 +f 319/332/618 487/500/619 166/88/620 490/503/621 +f 665/692/611 319/332/618 490/503/621 82/179/612 +f 78/175/576 657/684/575 320/333/622 487/500/619 +f 657/684/575 33/39/534 662/689/580 320/333/622 +f 320/333/622 662/689/580 80/177/584 488/501/623 +f 487/500/619 320/333/622 488/501/623 166/88/620 +f 166/88/620 488/501/623 321/334/624 489/502/625 +f 488/501/623 80/177/584 661/688/593 321/334/624 +f 321/334/624 661/688/593 37/43/263 584/611/266 +f 489/502/625 321/334/624 584/611/266 125/138/271 +f 82/179/612 490/503/621 322/335/626 666/693/616 +f 490/503/621 166/88/620 489/502/625 322/335/626 +f 322/335/626 489/502/625 125/138/271 583/610/285 +f 666/693/616 322/335/626 583/610/285 40/46/287 +f 17/23/262 574/601/261 323/336/627 670/697/628 +f 574/601/261 120/133/258 491/504/629 323/336/627 +f 323/336/627 491/504/629 167/89/630 494/507/631 +f 670/697/628 323/336/627 494/507/631 84/181/632 +f 120/133/258 573/600/257 324/337/633 491/504/629 +f 573/600/257 18/24/256 667/694/634 324/337/633 +f 324/337/633 667/694/634 83/180/635 492/505/636 +f 491/504/629 324/337/633 492/505/636 167/89/630 +f 167/89/630 492/505/636 325/338/637 493/506/638 +f 492/505/636 83/180/635 668/695/639 325/338/637 +f 325/338/637 668/695/639 42/48/37 516/531/35 +f 493/506/638 325/338/637 516/531/35 91/98/30 +f 84/181/632 494/507/631 326/339/640 669/696/641 +f 494/507/631 167/89/630 493/506/638 326/339/640 +f 326/339/640 493/506/638 91/98/30 515/530/27 +f 669/696/641 326/339/640 515/530/27 41/47/26 +f 18/24/256 604/631/362 327/340/642 667/694/634 +f 604/631/362 51/148/358 495/508/643 327/340/642 +f 327/340/642 495/508/643 168/90/644 498/511/645 +f 667/694/634 327/340/642 498/511/645 83/180/635 +f 51/148/358 603/630/356 328/341/646 495/508/643 +f 603/630/356 19/25/307 671/698/647 328/341/646 +f 328/341/646 671/698/647 85/182/648 496/509/649 +f 495/508/643 328/341/646 496/509/649 168/90/644 +f 168/90/644 496/509/649 329/342/650 497/510/651 +f 496/509/649 85/182/648 672/699/652 329/342/650 +f 329/342/650 672/699/652 43/49/44 518/533/43 +f 497/510/651 329/342/650 518/533/43 92/99/39 +f 83/180/635 498/511/645 330/343/653 668/695/639 +f 498/511/645 168/90/644 497/510/651 330/343/653 +f 330/343/653 497/510/651 92/99/39 517/532/38 +f 668/695/639 330/343/653 517/532/38 42/48/37 +f 19/25/307 588/615/306 331/344/654 671/698/647 +f 588/615/306 127/140/303 499/512/655 331/344/654 +f 331/344/654 499/512/655 169/91/656 502/515/657 +f 671/698/647 331/344/654 502/515/657 85/182/648 +f 127/140/303 587/614/302 332/345/658 499/512/655 +f 587/614/302 20/26/301 673/700/659 332/345/658 +f 332/345/658 673/700/659 86/183/660 500/513/661 +f 499/512/655 332/345/658 500/513/661 169/91/656 +f 169/91/656 500/513/661 333/346/662 501/514/663 +f 500/513/661 86/183/660 674/701/664 333/346/662 +f 333/346/662 674/701/664 44/50/50 520/535/49 +f 501/514/663 333/346/662 520/535/49 93/100/46 +f 85/182/648 502/515/657 334/347/665 672/699/652 +f 502/515/657 169/91/656 501/514/663 334/347/665 +f 334/347/665 501/514/663 93/100/46 519/534/45 +f 672/699/652 334/347/665 519/534/45 43/49/44 +f 20/26/301 592/619/319 335/348/666 673/700/659 +f 592/619/319 45/142/317 503/516/667 335/348/666 +f 335/348/666 503/516/667 170/92/668 506/519/669 +f 673/700/659 335/348/666 506/519/669 86/183/660 +f 45/142/317 591/618/316 336/349/670 503/516/667 +f 591/618/316 17/23/262 670/697/628 336/349/670 +f 336/349/670 670/697/628 84/181/632 504/517/671 +f 503/516/667 336/349/670 504/517/671 170/92/668 +f 170/92/668 504/517/671 337/350/672 505/518/673 +f 504/517/671 84/181/632 669/696/641 337/350/672 +f 337/350/672 669/696/641 41/47/26 522/537/29 +f 505/518/673 337/350/672 522/537/29 94/101/34 +f 86/183/660 506/519/669 338/351/674 674/701/664 +f 506/519/669 170/92/668 505/518/673 338/351/674 +f 338/351/674 505/518/673 94/101/34 521/536/48 +f 674/701/664 338/351/674 521/536/48 44/50/50 diff --git a/modules/ufbx/data/maya_dq_weights_7500_ascii.fbx b/modules/ufbx/data/maya_dq_weights_7500_ascii.fbx new file mode 100644 index 0000000..df7369b --- /dev/null +++ b/modules/ufbx/data/maya_dq_weights_7500_ascii.fbx @@ -0,0 +1,2634 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 6 + Hour: 13 + Minute: 38 + Second: 29 + Millisecond: 266 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_dq_weights_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_dq_weights_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "06/08/2021 10:38:29.266" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_dq_weights_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "06/08/2021 10:38:29.266" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\maya_dq_blend.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2092832335264, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 116 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 7 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 6 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 30 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 60 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 7 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2091970014944, "Geometry::", "Mesh" { + Vertices: *2022 { + a: -0.254629492759705,-0.254629671573639,0.254629671573639,0.254629492759705,-0.254629671573639,0.254629671573639,-0.334374964237213,0.397196114063263,0.343234300613403,0.334374994039536,0.397196114063263,0.343234270811081,-0.334374994039536,0.397196114063263,-0.343234449625015,0.33437505364418,0.397196114063263,-0.343234449625015,-0.254629492759705,-0.254629671573639,-0.254629671573639,0.254629492759705,-0.254629671573639,-0.254629671573639,-0.293126106262207,0.915670871734619,0.320395141839981,0.293126076459885,0.915670871734619,0.320395141839981,0.293126106262207,0.915670871734619,-0.32039600610733,-0.293126076459885,0.915670871734619,-0.320396035909653,-0.283751368522644,1.62168431282043,0.229371517896652,0.339721411466599,1.63540208339691,0.249702602624893,0.339721411466599,1.63540208339691,-0.249703541398048,-0.283751368522644,1.62168431282043,-0.229372471570969,-0.274803519248962,2.19473934173584,0.20244824886322,0.313261896371841,2.21016120910645,0.231155887246132,0.313261866569519,2.21016120910645,-0.231156840920448,-0.274803519248962,2.19473958015442,-0.202449202537537,0.598288118839264,1.7771942615509,0.179923072457314,0.598288118839264,1.77719438076019,-0.179924011230469,0.598288118839264,2.131676197052,-0.179924011230469,0.598288118839264,2.131676197052,0.179923057556152,0.920651257038116,1.79871356487274,0.158078029751778,0.920651257038116,1.79871356487274,-0.158078968524933,0.920651257038116,2.11015677452087,-0.158078953623772,0.920651257038116,2.11015677452087,0.158078014850616,1.12779891490936,1.80256938934326,0.15416394174099,1.12779891490936,1.80256927013397,-0.154164865612984,1.12779891490936,2.10630106925964,-0.154164880514145,1.12779891490936,2.10630106925964,0.154163926839828,1.49694085121155,1.80256938934326,0.15416394174099,1.49694085121155,1.80256927013397,-0.154164865612984,1.49694085121155,2.10630106925964,-0.154164880514145,1.49694085121155,2.10630106925964,0.154163926839828,1.63976681232452,1.84194219112396,0.114195391535759,1.63976681232452,1.84194219112396,-0.114196345210075, +1.63976681232452,2.06692886352539,-0.114196352660656,1.63976681232452,2.06692886352539,0.114195384085178,-0.205886021256447,2.42079997062683,0.134405672550201,0.0631731376051903,2.42079997062683,0.134405672550201,0.0631731301546097,2.42079997062683,-0.134406626224518,-0.205886006355286,2.42079997062683,-0.134406626224518,-0.36935943365097,2.19473958015442,-4.76662535220385e-07,0.482371807098389,1.75335919857025,-0.197393238544464,0.598288118839264,1.71274304389954,-4.82599716633558e-07,0.482371777296066,1.75335931777954,0.197392284870148,0.479804396629333,2.14991807937622,-0.195983439683914,0.598288118839264,1.95443534851074,-0.245350778102875,0.373352885246277,2.26911044120789,-4.83007170259953e-07,0.479804396629333,2.14991807937622,0.195982486009598,0.598288118839264,2.19612741470337,-4.86441422253847e-07,0.598288118839264,1.95443534851074,0.245349824428558,0.762434184551239,1.78977572917938,-0.167152270674706,0.920651316642761,1.74208748340607,-4.67232894152403e-07,0.762434184551239,1.7897754907608,0.16715133190155,0.762434184551239,2.11909484863281,-0.167152270674706,0.920651257038116,1.95443522930145,-0.215562075376511,0.762434184551239,2.11909461021423,0.16715133190155,0.920651257038116,2.16678261756897,-4.65486664324999e-07,0.920651257038116,1.95443546772003,0.215561151504517,1.01951205730438,1.80218374729156,-0.154556274414063,1.12779891490936,1.74734544754028,-4.75149136036634e-07,1.01951217651367,1.80218374729156,0.154555350542068,1.01951205730438,2.10668659210205,-0.154556274414063,1.12779891490936,1.95443534851074,-0.210224658250809,1.01951205730438,2.10668683052063,0.154555350542068,1.12779891490936,2.16152477264404,-4.77128196507692e-07,1.12779891490936,1.95443534851074,0.210223734378815,1.31143081188202,1.80256938934326,-0.154164865612984,1.49694085121155,1.74734544754028,-4.75149136036634e-07,1.31143081188202,1.80256938934326,0.154163926839828,1.31143081188202,2.10630083084106,-0.154164865612984,1.49694073200226,1.95443534851074,-0.210224658250809,1.31143081188202,2.10630106925964,0.15416394174099, +1.49694073200226,2.16152477264404,-4.77128196507692e-07,1.49694073200226,1.95443534851074,0.210223734378815,1.60290467739105,1.80745899677277,-0.149201244115829,1.60290467739105,1.80745887756348,0.149200305342674,1.60290467739105,2.10141134262085,-0.149201244115829,1.60290467739105,2.10141134262085,0.149200320243835,0.164617076516151,2.35545754432678,0.185969337821007,-0.251518368721008,2.35302019119263,0.183461710810661,0.164617076516151,2.35545754432678,-0.185970306396484,-0.251518338918686,2.35302019119263,-0.183462679386139,0,-0.321614563465118,0.321614563465118,0.33174455165863,0.0144591992720962,0.332630723714828,-9.31322574615479e-10,0.397196114063263,0.46804678440094,-0.33174455165863,0.0144592067226768,0.332630723714828,-0.0776904076337814,2.43563938140869,0.166785463690758,0.0811094045639038,2.43563938140869,-4.69968654215336e-07,-0.0776904076337814,2.43563938140869,-0.166786387562752,-0.236490204930305,2.43563938140869,-4.71831299364567e-07,0,0.397196114063263,-0.468046903610229,0.33174455165863,0.0144592067226768,-0.332630723714828,-4.65661287307739e-10,-0.321614563465118,-0.321614563465118,-0.33174455165863,0.0144592067226768,-0.332630723714828,0.321614325046539,-0.321614563465118,-7.45058059692383e-09,-0.321614354848862,-0.321614563465118,1.23400241136551e-08,0.455965876579285,0.397196114063263,-7.3225237429142e-08,-0.455965876579285,0.397196114063263,-7.29924067854881e-08,0.313750565052032,0.668108701705933,0.340042740106583,9.31322574615479e-10,0.915670931339264,0.436902701854706,-0.31375053524971,0.668108701705933,0.340042740106583,0.313750565052032,0.668108701705933,-0.340043216943741,0.399717420339584,0.915670931339264,-4.17756382375956e-07,-0.313750565052032,0.668108701705933,-0.340043216943741,2.79396772384644e-09,0.915670931339264,-0.436903476715088,-0.399717420339584,0.915670931339264,-4.12983354181051e-07,0.289524376392365,1.25271713733673,0.276391714811325,0.00483555439859629,1.6228289604187,0.315596461296082,-0.284688800573349,1.25265800952911,0.274677067995071,0.289524346590042,1.25271713733673,-0.276392638683319, +0.418281227350235,1.55230557918549,-4.8027141019702e-07,-0.284688830375671,1.25265800952911,-0.274678021669388,0.00483555439859629,1.62282919883728,-0.315597414970398,-0.38693368434906,1.62168443202972,-4.71191015094519e-07,0.309738337993622,1.94884192943573,0.287198513746262,-0.00884151086211205,2.19609093666077,0.279675930738449,-0.282856553792953,1.94519031047821,0.210223197937012,1.64718437194824,1.81234848499298,-4.77535650134087e-07,1.64718449115753,1.95443511009216,-0.144237622618675,1.64718449115753,2.09652185440063,-4.78699803352356e-07,1.64718449115753,1.95443522930145,0.14423668384552,-0.282856553792953,1.94519031047821,-0.210224166512489,-0.00884151179343462,2.19609093666077,-0.279676914215088,0.309738397598267,1.94884216785431,-0.2871994972229,4.65661287307739e-10,0.00838279910385609,0.453922748565674,-0.0888124853372574,2.46169757843018,-4.75440174341202e-07,9.31322574615479e-10,0.00838279910385609,-0.453922748565674,7.91624188423157e-09,-0.439236134290695,6.05359673500061e-09,0.45271435379982,0.00838280282914639,-8.73114913702011e-10,-0.45271435379982,0.00838280282914639,8.73114913702011e-10,0,0.668108701705933,0.463694751262665,0.427841663360596,0.668108701705933,-2.38273059949279e-07,0,0.668108701705933,-0.463695168495178,-0.427841663360596,0.668108701705933,-2.37865606322885e-07,0.000759322196245193,1.25284862518311,0.374845564365387,0.391408115625381,1.24652433395386,-4.68404323328286e-07,0.000759322720114142,1.25284862518311,-0.374846518039703,-0.38821205496788,1.25265800952911,-4.72326064482331e-07,0.00190158060286194,1.94560635089874,0.293985784053802,1.66020917892456,1.95443522930145,-4.83356416225433e-07,0.00190158106852323,1.94560635089874,-0.293986737728119,-0.385176301002502,1.9451904296875,-4.74501575808972e-07,0.488513797521591,1.68189966678619,-4.75956767331809e-07,0.478515207767487,1.95369529724121,-0.265047162771225,0.48416730761528,2.21855783462524,-4.74574335385114e-07,0.478515177965164,1.9536954164505,0.265046268701553,0.762434244155884,1.72989892959595,-4.76538843940943e-07,0.762434244155884,1.95443499088287,-0.227934747934341, +0.762434244155884,2.1789710521698,-4.75738488603383e-07,0.762434244155884,1.95443499088287,0.227933824062347,1.01951217651367,1.7468193769455,-4.7665525926277e-07,1.01951217651367,1.95443511009216,-0.21075838804245,1.01951217651367,2.16205048561096,-4.78416041005403e-07,1.01951217651367,1.95443511009216,0.210757464170456,1.31143093109131,1.74734508991241,-4.7665525926277e-07,1.31143093109131,1.95443499088287,-0.210224643349648,1.31143093109131,2.16152477264404,-4.78183210361749e-07,1.31143093109131,1.95443499088287,0.210223734378815,1.60357761383057,1.75386476516724,-4.76604327559471e-07,1.60357749462128,1.95443522930145,-0.203606516122818,1.60357749462128,2.15500569343567,-4.77535650134087e-07,1.60357749462128,1.95443534851074,0.20360554754734,-0.0460495464503765,2.35459136962891,0.250340670347214,0.234826877713203,2.36133193969727,-4.69590304419398e-07,-0.0460495464503765,2.35459160804749,-0.250341653823853,-0.325248509645462,2.35436654090881,-4.7590583562851e-07,-0.163194328546524,-0.163194477558136,0.381944477558136,0.163194313645363,-0.163194462656975,0.381944507360458,0.185454487800598,0.208878457546234,0.437237471342087,-0.185454457998276,0.208878442645073,0.437237471342087,-0.162129655480385,2.4490053653717,0.0841365903615952,-0.00466052815318108,2.44900512695313,0.0841365903615952,-0.00466052815318108,2.4490053653717,-0.0841375440359116,-0.162129655480385,2.4490053653717,-0.0841375514864922,-0.185454457998276,0.208878457546234,-0.437237530946732,0.185454457998276,0.208878442645073,-0.437237530946732,0.163194328546524,-0.163194477558136,-0.381944477558136,-0.163194358348846,-0.163194447755814,-0.381944477558136,-0.163194328546524,-0.381944477558136,-0.163194432854652,0.163194328546524,-0.381944477558136,-0.163194447755814,0.163194328546524,-0.381944477558136,0.163194462656975,-0.163194358348846,-0.381944477558136,0.163194447755814,0.381944179534912,-0.163194462656975,0.163194462656975,0.381944179534912,-0.163194447755814,-0.163194447755814,0.432727098464966,0.208878457546234,-0.187387526035309,0.432727128267288,0.208878442645073,0.187387481331825, +-0.381944179534912,-0.163194462656975,-0.163194462656975,-0.381944179534912,-0.163194447755814,0.163194447755814,-0.432727098464966,0.208878457546234,0.187387481331825,-0.432727128267288,0.208878442645073,-0.187387526035309,-0.177272886037827,0.544392228126526,0.436187326908112,0.177272886037827,0.544392228126526,0.436187297105789,0.165000468492508,0.785987675189972,0.424140125513077,-0.165000468492508,0.785987675189972,0.424140125513077,0.413636684417725,0.544392228126526,0.186937347054482,0.413636684417725,0.544392228126526,-0.186937630176544,0.385001122951508,0.785987675189972,-0.181774795055389,0.385001093149185,0.785987675189972,0.181774169206619,0.177272886037827,0.544392228126526,-0.436187624931335,-0.177272886037827,0.544392228126526,-0.436187624931335,-0.165000468492508,0.785987675189972,-0.424140751361847,0.16500049829483,0.785987675189972,-0.424140751361847,-0.413636684417725,0.544392228126526,-0.186937645077705,-0.413636684417725,0.544392228126526,0.186937347054482,-0.385001122951508,0.785987675189972,0.181774169206619,-0.385001093149185,0.785987675189972,-0.181774780154228,-0.156818866729736,1.07480049133301,0.381202012300491,0.156818896532059,1.07480049133301,0.381202012300491,0.166922748088837,1.44157814979553,0.322679817676544,-0.154773473739624,1.43852555751801,0.318107485771179,0.365910708904266,1.07480037212372,0.163372054696083,0.365910649299622,1.07480049133301,-0.163372918963432,0.377760618925095,1.42420411109924,-0.140904769301414,0.377760589122772,1.42420411109924,0.140903830528259,0.156818866729736,1.07480037212372,-0.381202906370163,-0.156818896532059,1.07480049133301,-0.381202906370163,-0.154773473739624,1.43852555751801,-0.318108439445496,0.166922762989998,1.44157814979553,-0.322680741548538,-0.365910708904266,1.07480037212372,-0.163372918963432,-0.365910649299622,1.07480049133301,0.163372039794922,-0.361138164997101,1.43852555751801,0.136331528425217,-0.361138075590134,1.43852555751801,-0.136332452297211,-0.154773473739624,1.79141628742218,0.276219516992569,0.17139595746994,1.794468998909,0.298428952693939, +0.163237318396568,2.08407878875732,0.2868372797966,-0.155507519841194,2.08047533035278,0.262513130903244,1.65386486053467,1.88233733177185,0.0731886923313141,1.65386497974396,1.88233733177185,-0.0731896460056305,1.65386486053467,2.02653312683105,-0.0731896460056305,1.65386486053467,2.02653312683105,0.0731886997818947,0.171395972371101,1.794468998909,-0.298429906368256,-0.154773473739624,1.79141640663147,-0.276220470666885,-0.155507519841194,2.08047533035278,-0.262514114379883,0.163237318396568,2.08407855033875,-0.286838233470917,-0.361138105392456,1.79141640663147,-0.118380457162857,-0.361138105392456,1.79141640663147,0.118379533290863,-0.354971081018448,2.08047533035278,0.112505353987217,-0.354971021413803,2.08047533035278,-0.112506307661533,0.439341813325882,1.65547573566437,0.118917189538479,0.439341843128204,1.65547585487366,-0.118918135762215,0.537052750587463,1.72011518478394,-0.101943209767342,0.537052690982819,1.72011518478394,0.101942270994186,0.413546234369278,1.82385611534119,-0.264049708843231,0.40834254026413,2.07318091392517,-0.260290294885635,0.537052750587463,2.05485820770264,-0.23786686360836,0.537052690982819,1.85401237010956,-0.23786686360836,0.424282044172287,2.22307181358337,-0.115158677101135,0.424282073974609,2.22307205200195,0.115157723426819,0.537052750587463,2.18875479698181,0.101942270994186,0.537052690982819,2.18875503540039,-0.101943209767342,0.40834254026413,2.07318115234375,0.260289311408997,0.413546204566956,1.8238559961319,0.264048784971237,0.537052750587463,1.85401225090027,0.237865924835205,0.537052690982819,2.05485820770264,0.237865939736366,0.676490187644958,1.73724067211151,0.094491682946682,0.676490187644958,1.73724067211151,-0.0944926366209984,0.846896111965179,1.75133657455444,-0.0883600637316704,0.846896111965179,1.75133657455444,0.0883591249585152,0.676490128040314,1.86135184764862,-0.22048220038414,0.676490187644958,2.047518491745,-0.22048220038414,0.846896111965179,2.0414776802063,-0.206172868609428,0.846896111965179,1.8673928976059,-0.206172868609428,0.676490128040314,2.1716296672821,-0.094492644071579, +0.676490187644958,2.17162990570068,0.094491682946682,0.846896111965179,2.1575334072113,0.0883591175079346,0.846896111965179,2.1575334072113,-0.0883600786328316,0.676490128040314,2.047518491745,0.220481246709824,0.676490187644958,1.86135184764862,0.220481246709824,0.846896111965179,1.8673928976059,0.206171900033951,0.846896111965179,2.04147744178772,0.206171914935112,0.974475383758545,1.75918829441071,0.0849431827664375,0.974475383758545,1.75918817520142,-0.0849441364407539,1.06690549850464,1.76115131378174,-0.0840901508927345,1.06690561771393,1.76115107536316,0.0840891897678375,0.974475383758545,1.87075793743134,-0.19820237159729,0.974475383758545,2.0381121635437,-0.198202356696129,1.06690549850464,2.03727126121521,-0.196209713816643,1.06690561771393,1.87159907817841,-0.196209713816643,0.974475383758545,2.14968228340149,-0.0849441364407539,0.974475383758545,2.14968228340149,0.0849431827664375,1.06690549850464,2.14771914482117,0.0840891897678375,1.06690561771393,2.14771890640259,-0.0840901434421539,0.974475383758545,2.03811240196228,0.198201417922974,0.974475383758545,1.87075793743134,0.198201403021812,1.06690549850464,1.8715991973877,0.196208775043488,1.06690561771393,2.03727126121521,0.196208775043488,1.21333658695221,1.76115119457245,0.0840891972184181,1.2133367061615,1.76115107536316,-0.0840901508927345,1.40999460220337,1.76115131378174,-0.0840901508927345,1.40999460220337,1.76115107536316,0.0840891897678375,1.21333646774292,1.87159931659698,-0.196209728717804,1.2133367061615,2.03727102279663,-0.196209728717804,1.40999460220337,2.03727126121521,-0.196209713816643,1.40999460220337,1.87159907817841,-0.196209713816643,1.21333646774292,2.14771914482117,-0.0840901583433151,1.2133367061615,2.14771914482117,0.0840892046689987,1.40999460220337,2.14771914482117,0.0840891897678375,1.40999460220337,2.14771890640259,-0.0840901434421539,1.21333646774292,2.03727126121521,0.196208775043488,1.2133367061615,1.8715991973877,0.196208760142326,1.40999460220337,1.8715991973877,0.196208775043488,1.40999460220337,2.03727126121521,0.196208775043488, +1.5601818561554,1.76115119457245,0.0840891972184181,1.5601818561554,1.76115107536316,-0.0840901508927345,1.62964177131653,1.78569531440735,-0.0731896460056305,1.62964177131653,1.78569531440735,0.0731886997818947,1.56018173694611,1.87159931659698,-0.196209728717804,1.5601818561554,2.03727102279663,-0.196209728717804,1.62964177131653,2.02653312683105,-0.171294286847115,1.62964165210724,1.88233721256256,-0.171294271945953,1.56018173694611,2.14771914482117,-0.0840901583433151,1.5601818561554,2.14771914482117,0.0840892046689987,1.62964177131653,2.12317490577698,0.0731886923313141,1.62964165210724,2.12317514419556,-0.0731896609067917,1.56018173694611,2.03727126121521,0.196208775043488,1.5601818561554,1.8715991973877,0.196208760142326,1.62964177131653,1.88233733177185,0.171293318271637,1.62964165210724,2.02653312683105,0.171293318271637,-0.158443748950958,2.28545212745667,0.249575555324554,0.114421226084232,2.28905534744263,0.256262570619583,0.0298263095319271,2.40054297447205,0.204073026776314,-0.155247271060944,2.40054297447205,0.204073026776314,0.2907535135746,2.3064296245575,0.113647684454918,0.290753483772278,2.3064296245575,-0.113648638129234,0.14828534424305,2.40054297447205,-0.0878339931368828,0.14828534424305,2.40054297447205,0.0878330394625664,0.114421226084232,2.28905558586121,-0.256263554096222,-0.158443734049797,2.28545212745667,-0.24957649409771,-0.155247271060944,2.40054297447205,-0.204073965549469,0.0298263058066368,2.40054297447205,-0.204073965549469,-0.330302804708481,2.28545212745667,-0.106961622834206,-0.330302774906158,2.28545212745667,0.10696068406105,-0.273706316947937,2.40054297447205,0.087833046913147,-0.273706287145615,2.40054297447205,-0.0878339782357216,-7.45058059692383e-09,-0.175347238779068,0.409722238779068,0.180912166833878,0.0114209866151214,0.423545479774475,0,0.208878457546234,0.468468725681305,-0.180912137031555,0.0114209726452827,0.423545479774475,-0.086021713912487,2.45515918731689,0.0897729471325874,-0.00377325154840946,2.45515918731689,-4.71132807433605e-07,-0.0860217064619064,2.45515918731689,-0.0897738933563232, +-0.168270170688629,2.45515918731689,-4.82308678328991e-07,0,0.208878457546234,-0.46846878528595,0.180912137031555,0.0114209800958633,-0.423545479774475,0,-0.175347238779068,-0.40972226858139,-0.180912166833878,0.0114209866151214,-0.423545509576797,-7.45058059692383e-09,-0.409722238779068,-0.175347238779068,0.175347119569778,-0.409722238779068,-7.45058059692383e-09,0,-0.40972226858139,0.175347238779068,-0.175347119569778,-0.409722208976746,1.49011611938477e-08,0.409721970558167,-0.175347238779068,7.45058059692383e-09,0.42241770029068,0.0114209866151214,-0.181395500898361,0.463636219501495,0.208878457546234,-2.95694917440414e-08,0.42241770029068,0.0114209726452827,0.1813954859972,-0.409721970558167,-0.175347238779068,-7.45058059692383e-09,-0.42241770029068,0.0114209866151214,0.1813954859972,-0.463636219501495,0.208878457546234,-3.00351530313492e-08,-0.42241770029068,0.0114209726452827,-0.181395500898361,0,0.544392228126526,0.46734356880188,0.171136662364006,0.668108701705933,0.432781726121902,0,0.785987675189972,0.45443594455719,-0.171136677265167,0.668108761310577,0.432781726121902,0.443182170391083,0.544392228126526,-1.46450474858284e-07,0.399318903684616,0.668108701705933,-0.185478210449219,0.412501245737076,0.785987675189972,-3.22121195495129e-07,0.399318933486938,0.668108761310577,0.185477733612061,0,0.544392228126526,-0.467343866825104,-0.171136662364006,0.668108701705933,-0.432782202959061,0,0.785987675189972,-0.454436540603638,0.171136677265167,0.668108761310577,-0.432782173156738,-0.443182170391083,0.544392228126526,-1.45984813570976e-07,-0.399318903684616,0.668108701705933,0.185477733612061,-0.412501245737076,0.785987675189972,-3.22354026138783e-07,-0.399318933486938,0.668108761310577,-0.185478210449219,0,1.07480037212372,0.40843078494072,0.158322125673294,1.25342118740082,0.350732237100601,0.00303731113672256,1.43928873538971,0.341972559690475,-0.155284821987152,1.25265789031982,0.349589079618454,0.392047166824341,1.07480037212372,-4.42494638264179e-07,0.366486847400665,1.24907767772675,-0.150967672467232, +0.399718046188354,1.41399049758911,-4.74770786240697e-07,0.366486847400665,1.24907767772675,0.150966748595238,0,1.07480037212372,-0.408431649208069,-0.155284821987152,1.25265800952911,-0.34959003329277,0.00303731835447252,1.43928873538971,-0.341973543167114,0.158322140574455,1.25342118740082,-0.350733160972595,-0.392047166824341,1.07480037212372,-4.42261807620525e-07,-0.362331241369247,1.25265800952911,0.149823620915413,-0.386933714151382,1.43852543830872,-4.76022250950336e-07,-0.36233127117157,1.25265789031982,-0.149824574589729,0.00415561627596617,1.79217982292175,0.301501870155334,0.165518283843994,1.94685459136963,0.296827435493469,-0.00102250510826707,2.08137583732605,0.287345111370087,-0.154956981539726,1.9451904296875,0.267556875944138,1.65694105625153,1.87696838378906,-4.71016392111778e-07,1.65694117546082,1.95443534851074,-0.0786398947238922,1.65694117546082,2.031902551651,-4.7474168241024e-07,1.65694117546082,1.95443534851074,0.0786389410495758,0.00415562000125647,1.79217982292175,-0.301502823829651,-0.154956981539726,1.9451904296875,-0.267557829618454,-0.0010224983561784,2.08137607574463,-0.287346065044403,0.165518283843994,1.94685459136963,-0.296828389167786,-0.38693368434906,1.79141628742218,-4.79281879961491e-07,-0.359596341848373,1.9451904296875,0.114666968584061,-0.379904001951218,2.08047533035278,-4.83094481751323e-07,-0.359596371650696,1.9451904296875,-0.114667937159538,0.448401540517807,1.63657534122467,-4.74858097732067e-07,0.486248940229416,1.69949626922607,-0.108126930892467,0.537052690982819,1.70337796211243,-4.68891812488437e-07,0.486248940229416,1.69949626922607,0.10812596976757,0.408407330513,1.95147705078125,-0.276216804981232,0.478499114513397,2.06134986877441,-0.247999370098114,0.537052690982819,1.95443522930145,-0.254857301712036,0.479800015687943,1.844562292099,-0.248939201235771,0.431015700101852,2.23864364624023,-4.74843545816839e-07,0.482484012842178,2.20179343223572,0.107186116278172,0.537052690982819,2.20549297332764,-4.68018697574735e-07,0.482484012842178,2.20179343223572,-0.107187077403069, +0.408407330513,1.95147705078125,0.276215940713882,0.479800015687943,1.84456241130829,0.248938262462616,0.537052690982819,1.95443511009216,0.254856407642365,0.478499114513397,2.06134986877441,0.247998401522636,0.676490187644958,1.72172701358795,-4.72296960651875e-07,0.762434184551239,1.74486839771271,-0.0911742001771927,0.84689599275589,1.73682975769043,-4.75876731798053e-07,0.762434184551239,1.74486839771271,0.0911732390522957,0.676490187644958,1.95443522930145,-0.236230865120888,0.762434184551239,2.04424977302551,-0.212739154696465,0.84689599275589,1.95443534851074,-0.22089946269989,0.762434184551239,1.86462092399597,-0.212739154696465,0.676490187644958,2.18714380264282,-4.72529791295528e-07,0.762434184551239,2.16400241851807,0.0911732390522957,0.84689599275589,2.17204117774963,-4.75934939458966e-07,0.762434184551239,2.16400241851807,-0.0911741927266121,0.676490187644958,1.95443534851074,0.236229911446571,0.762434184551239,1.86462092399597,0.212738171219826,0.84689599275589,1.95443534851074,0.220898509025574,0.762434184551239,2.04424977302551,0.212738171219826,0.974475264549255,1.74524235725403,-4.79747541248798e-07,1.01951217651367,1.76066076755524,-0.0843036696314812,1.06690537929535,1.74734544754028,-4.83327312394977e-07,1.01951229572296,1.76066076755524,0.0843026861548424,0.974475264549255,1.95443546772003,-0.212359607219696,1.01951217651367,2.03748178482056,-0.196707874536514,1.06690537929535,1.95443534851074,-0.210224658250809,1.01951229572296,1.87138915061951,-0.196707874536514,0.974475264549255,2.16362833976746,-4.79514710605145e-07,1.01951217651367,2.14821028709412,0.0843026861548424,1.06690537929535,2.16152548789978,-4.75934939458966e-07,1.01951229572296,2.14821028709412,-0.0843036621809006,0.974475264549255,1.95443534851074,0.212358638644218,1.01951217651367,1.87138903141022,0.196706920862198,1.06690537929535,1.95443546772003,0.210223704576492,1.01951229572296,2.03748178482056,0.196706920862198,1.21333646774292,1.74734544754028,-4.79747541248798e-07,1.3114310503006,1.76115155220032,-0.0840901732444763, +1.40999460220337,1.74734544754028,-4.83327312394977e-07,1.3114310503006,1.76115155220032,0.0840891897678375,1.21333646774292,1.95443546772003,-0.210224658250809,1.3114310503006,2.03727149963379,-0.196209728717804,1.40999460220337,1.95443534851074,-0.210224658250809,1.3114310503006,1.87159955501556,-0.196209728717804,1.21333646774292,2.16152548789978,-4.79747541248798e-07,1.3114310503006,2.14771962165833,0.0840891897678375,1.40999460220337,2.16152548789978,-4.75934939458966e-07,1.3114310503006,2.14771962165833,-0.0840901657938957,1.21333646774292,1.95443534851074,0.210223689675331,1.3114310503006,1.87159943580627,0.196208775043488,1.40999460220337,1.95443546772003,0.210223704576492,1.3114310503006,2.03727149963379,0.196208775043488,1.5601818561554,1.74734544754028,-4.79747541248798e-07,1.60324108600616,1.76728737354279,-0.0813650414347649,1.63098752498627,1.77342355251312,-4.7474168241024e-07,1.60324096679688,1.76728737354279,0.0813640803098679,1.5601818561554,1.95443546772003,-0.210224658250809,1.60324108600616,2.03458666801453,-0.18998084962368,1.63098752498627,1.95443534851074,-0.183751985430717,1.60324096679688,1.87428390979767,-0.189980864524841,1.5601818561554,2.16152548789978,-4.79747541248798e-07,1.60324108600616,2.14158344268799,0.0813640654087067,1.63098752498627,2.13544750213623,-4.7474168241024e-07,1.60324096679688,2.14158368110657,-0.0813650414347649,1.5601818561554,1.95443534851074,0.210223689675331,1.60324108600616,1.87428390979767,0.189979910850525,1.63098752498627,1.95443534851074,0.183751061558723,1.60324096679688,2.03458690643311,0.189979910850525,-0.0257803499698639,2.28635287284851,0.26907417178154,0.0691057294607162,2.35459399223328,0.235020086169243,-0.0638596192002296,2.40323543548584,0.218276277184486,-0.158745720982552,2.35369348526001,0.233348339796066,0.306934207677841,2.31331467628479,-4.74858097732067e-07,0.218381389975548,2.35893726348877,-0.101772211492062,0.16009733080864,2.40323543548584,-4.75789420306683e-07,0.218381404876709,2.35893750190735,0.101771257817745,-0.0257803481072187,2.28635287284851,-0.269075125455856, +-0.15874570608139,2.35369348526001,-0.233349323272705,-0.0638596341013908,2.40323543548584,-0.21827720105648,0.0691057220101357,2.35459423065186,-0.235021039843559,-0.351785242557526,2.28545188903809,-4.79980371892452e-07,-0.306903094053268,2.35369348526001,0.100099518895149,-0.287816643714905,2.40323543548584,-4.75789420306683e-07,-0.306903123855591,2.35369348526001,-0.100100480020046,-0.151041552424431,-0.299479156732559,0.299479156732559,0.151041567325592,-0.299479156732559,0.299479156732559,0.299478977918625,-0.151041656732559,0.299479156732559,0.339999854564667,0.208878442645073,0.343543738126755,0.182386368513107,0.397196114063263,0.436843693256378,-0.182386383414268,0.397196114063263,0.436843663454056,-0.339999854564667,0.208878442645073,0.343543738126755,-0.299478977918625,-0.151041656732559,0.299479156732559,-0.154268532991409,2.43073558807373,0.15618921816349,0.00307389255613089,2.43073582649231,0.15618921816349,0.0755698308348656,2.43073558807373,0.0794243514537811,0.0755698308348656,2.43073582649231,-0.0794253051280975,0.00307389255613089,2.43073558807373,-0.156190171837807,-0.154268532991409,2.43073582649231,-0.156190186738968,-0.226764470338821,2.43073558807373,-0.0794253051280975,-0.226764470338821,2.43073582649231,0.0794243514537811,-0.182386368513107,0.397196114063263,-0.436843812465668,0.182386383414268,0.397196114063263,-0.436843812465668,0.339999854564667,0.208878442645073,-0.343543767929077,0.299478977918625,-0.151041656732559,-0.299479156732559,0.151041552424431,-0.299479156732559,-0.299479156732559,-0.151041567325592,-0.299479156732559,-0.299479156732559,-0.299478977918625,-0.151041656732559,-0.299479156732559,-0.339999854564667,0.208878442645073,-0.343543767929077,0.299478977918625,-0.299479156732559,-0.151041656732559,0.299478977918625,-0.299479156732559,0.151041641831398,-0.299478977918625,-0.299479156732559,0.151041656732559,-0.299478977918625,-0.299479156732559,-0.151041656732559,0.42556819319725,0.397196114063263,-0.187218829989433,0.42556819319725,0.397196114063263,0.18721866607666,-0.42556819319725,0.397196114063263,0.18721866607666, +-0.42556819319725,0.397196114063263,-0.187218829989433,0.325000286102295,0.544392228126526,0.342718601226807,0.302500903606415,0.785987555980682,0.333252876996994,0.159886956214905,0.915670871734619,0.407775789499283,-0.159886986017227,0.915670871734619,0.407775789499283,-0.302500903606415,0.785987555980682,0.333252876996994,-0.325000286102295,0.544392228126526,0.342718601226807,0.325000286102295,0.544392228126526,-0.342718869447708,0.302500873804092,0.785987555980682,-0.333253562450409,0.373069584369659,0.915670871734619,-0.17476162314415,0.373069584369659,0.915670871734619,0.174760818481445,-0.325000286102295,0.544392228126526,-0.342718869447708,-0.302500903606415,0.785987555980682,-0.333253592252731,-0.159886956214905,0.915670871734619,-0.407776594161987,0.159886986017227,0.915670871734619,-0.407776594161987,-0.373069584369659,0.915670871734619,0.174760818481445,-0.373069584369659,0.915670871734619,-0.17476162314415,0.287501275539398,1.07480049133301,0.299515753984451,0.303093522787094,1.43876099586487,0.2567999958992,0.174115687608719,1.62626338005066,0.303195297718048,-0.154773473739624,1.62168419361115,0.291927516460419,-0.283751368522644,1.43852531909943,0.249941512942314,-0.287501275539398,1.07480049133301,0.299515753984451,0.287501275539398,1.07480049133301,-0.299516677856445,0.303093522787094,1.43876099586487,-0.256800919771194,0.401467084884644,1.56979739665985,-0.130962267518044,0.401467084884644,1.56979739665985,0.130961328744888,-0.287501275539398,1.07480049133301,-0.299516707658768,-0.283751368522644,1.43852531909943,-0.249942436814308,-0.154773473739624,1.62168419361115,-0.291928499937057,0.174115687608719,1.62626338005066,-0.30319619178772,-0.361138105392456,1.62168419361115,0.125111520290375,-0.361138105392456,1.62168419361115,-0.125112488865852,0.317631423473358,1.80334210395813,0.281208604574203,0.309087187051773,2.0831561088562,0.27361136674881,0.150792002677917,2.20014476776123,0.27210134267807,-0.15660859644413,2.19473958015442,0.257661551237106,-0.280172228813171,2.08047556877136,0.206260219216347, +-0.283751398324966,1.79141628742218,0.21702952682972,1.64473307132721,1.82212781906128,0.0677384361624718,1.64473307132721,1.82212781906128,-0.0677393898367882,1.64473307132721,1.88770616054535,-0.134310394525528,1.64473307132721,2.02116417884827,-0.134310394525528,1.64473307132721,2.08674263954163,-0.0677393823862076,1.64473307132721,2.08674263954163,0.0677384361624718,1.64473307132721,2.02116417884827,0.13430942595005,1.64473307132721,1.88770616054535,0.13430942595005,-0.283751398324966,1.79141628742218,-0.217030495405197,-0.280172228813171,2.08047556877136,-0.206261187791824,-0.15660859644413,2.19473958015442,-0.257662504911423,0.150792002677917,2.20014476776123,-0.272102236747742,0.309087187051773,2.08315587043762,-0.273612290620804,0.317631423473358,1.80334222316742,-0.28120955824852,-0.345720440149307,2.19473958015442,0.110426105558872,-0.34572046995163,2.19473958015442,-0.110427059233189,0.423833131790161,1.71647131443024,-0.214659854769707,0.537052750587463,1.77032649517059,-0.18689551949501,0.598288178443909,1.72885572910309,-0.0981405898928642,0.598288238048553,1.72885572910309,0.0981396362185478,0.537052750587463,1.77032649517059,0.186894550919533,0.423833131790161,1.71647131443024,0.214658930897713,0.413563579320908,2.17002654075623,-0.209020659327507,0.537052750587463,2.13854384422302,-0.18689551949501,0.598288178443909,2.05111217498779,-0.228994071483612,0.598288238048553,1.85775828361511,-0.228994071483612,0.360890626907349,2.25661087036133,-0.119448900222778,0.360890626907349,2.25661063194275,0.119447946548462,0.413563579320908,2.17002654075623,0.209019735455513,0.537052750587463,2.13854384422302,0.186894550919533,0.598288178443909,2.18001461029053,0.0981396362185478,0.598288238048553,2.18001484870911,-0.0981405898928642,0.598288178443909,1.85775828361511,0.228993117809296,0.598288238048553,2.05111217498779,0.228993102908134,0.676490128040314,1.78378236293793,-0.17323611676693,0.84689599275589,1.79485785961151,-0.161993086338043,0.920651137828827,1.75624418258667,-0.0862251147627831,0.920651137828827,1.75624418258667,0.086224153637886, +0.84689599275589,1.79485785961151,0.161992102861404,0.676490128040314,1.78378236293793,0.173235133290291,0.676490128040314,2.12508797645569,-0.173236101865768,0.84689599275589,2.11401271820068,-0.161993071436882,0.920651137828827,2.03937458992004,-0.201191291213036,0.920651137828827,1.86949622631073,-0.201191291213036,0.676490128040314,2.12508797645569,0.173235133290291,0.84689599275589,2.11401271820068,0.161992102861404,0.920651137828827,2.15262651443481,0.086224153637886,0.920651137828827,2.15262651443481,-0.0862251147627831,0.920651137828827,1.86949622631073,0.201190322637558,0.920651137828827,2.03937458992004,0.201190337538719,0.974475383758545,1.80102705955505,-0.15573051571846,1.06690537929535,1.80256938934326,-0.154164895415306,1.12779903411865,1.76115131378174,-0.0840901508927345,1.12779915332794,1.76115131378174,0.0840891972184181,1.06690537929535,1.80256938934326,0.154163926839828,0.974475383758545,1.80102705955505,0.155729547142982,0.974475383758545,2.10784339904785,-0.15573051571846,1.06690537929535,2.10630106925964,-0.154164895415306,1.12779903411865,2.03727126121521,-0.196209713816643,1.12779915332794,1.87159943580627,-0.196209713816643,0.974475383758545,2.10784363746643,0.155729547142982,1.06690537929535,2.10630130767822,0.154163926839828,1.12779903411865,2.14771914482117,0.0840891972184181,1.12779915332794,2.14771914482117,-0.0840901359915733,1.12779903411865,1.87159943580627,0.196208730340004,1.12779915332794,2.03727126121521,0.196208745241165,1.2133367061615,1.80256938934326,-0.154164880514145,1.40999472141266,1.80256938934326,-0.154164895415306,1.49694061279297,1.76115131378174,-0.0840901508927345,1.49694061279297,1.76115131378174,0.0840891972184181,1.40999472141266,1.80256938934326,0.154163926839828,1.2133367061615,1.80256938934326,0.154163911938667,1.2133367061615,2.10630130767822,-0.154164880514145,1.40999472141266,2.10630106925964,-0.154164895415306,1.49694061279297,2.03727126121521,-0.196209713816643,1.49694061279297,1.87159943580627,-0.196209713816643,1.2133367061615,2.10630106925964,0.154163911938667, +1.40999472141266,2.10630130767822,0.154163926839828,1.49694061279297,2.14771914482117,0.0840891972184181,1.49694061279297,2.14771914482117,-0.0840901359915733,1.49694061279297,1.87159943580627,0.196208730340004,1.49694061279297,2.03727126121521,0.196208745241165,1.56018197536469,1.80256938934326,-0.154164880514145,1.6282958984375,1.82212781906128,-0.134310394525528,1.6282958984375,1.82212781906128,0.13430942595005,1.56018197536469,1.80256938934326,0.154163911938667,1.56018197536469,2.10630130767822,-0.154164880514145,1.6282958984375,2.08674263954163,-0.134310394525528,1.56018197536469,2.10630106925964,0.154163911938667,1.6282958984375,2.08674263954163,0.13430942595005,0.230489611625671,2.29520082473755,0.206125482916832,0.106858603656292,2.39785051345825,0.16080978512764,-0.229981273412704,2.39785051345825,0.16080978512764,-0.265855669975281,2.28545212745667,0.19609497487545,0.230489626526833,2.29520082473755,-0.206126436591148,0.106858603656292,2.39785051345825,-0.160810723900795,-0.265855669975281,2.28545212745667,-0.196095943450928,-0.229981273412704,2.39785051345825,-0.160810738801956 + } + PolygonVertexIndex: *2688 { + a: 0,506,170,-514,506,86,338,-171,170,338,128,-342,513,170,341,-90,86,507,171,-339,507,1,508,-172,171,508,87,-340,338,171,339,-129,128,339,172,-341,339,87,509,-173,172,509,3,-511,340,172,510,-89,89,341,173,-513,341,128,340,-174,173,340,88,-512,512,173,511,-3,40,514,174,-522,514,90,342,-175,174,342,129,-346,521,174,345,-94,90,515,175,-343,515,41,516,-176,175,516,91,-344,342,175,343,-130,129,343,176,-345,343,91,517,-177,176,517,42,-519,344,176,518,-93,93,345,177,-521,345,129,344,-178,177,344,92,-520,520,177,519,-44,4,522,178,-530,522,94,346,-179,178,346,130,-350,529,178,349,-98,94,523,179,-347,523,5,524,-180,179,524,95,-348,346,179,347,-131,130,347,180,-349,347,95,525,-181,180,525,7,-527,348,180,526,-97,97,349,181,-529,349,130,348,-182,181,348,96,-528,528,181,527,-7,6,527,182,-534,527,96,350,-183,182,350,131,-354,533,182,353,-100,96,526,183,-351,526,7,530,-184,183,530,98,-352,350,183,351,-132,131,351,184,-353,351,98,531,-185,184,531,1,-508,352,184,507,-87,99,353,185,-533,353,131,352,-186,185,352,86,-507,532,185,506,-1,1,531,186,-509,531,98,354,-187,186,354,132,-358,508,186,357,-88,98,530,187,-355,530,7,525,-188,187,525,95,-356,354,187,355,-133,132,355,188,-357,355,95,524,-189,188,524,5,-535,356,188,534,-101,87,357,189,-510,357,132,356,-190,189,356,100,-536,509,189,535,-4,6,533,190,-529,533,99,358,-191,190,358,133,-362,528,190,361,-98,99,532,191,-359,532,0,513,-192,191,513,89,-360,358,191,359,-134,133,359,192,-361,359,89,512,-193,192,512,2,-537,360,192,536,-102,97,361,193,-530,361,133,360,-194,193,360,101,-538,529,193,537,-5,2,511,194,-544,511,88,362,-195,194,362,134,-366,543,194,365,-105,88,510,195,-363,510,3,538,-196,195,538,102,-364,362,195,363,-135,134,363,196,-365,363,102,539,-197,196,539,9,-541,364,196,540,-104,104,365,197,-543,365,134,364,-198,197,364,103,-542,542,197,541,-9,3,535,198,-539,535,100,366,-199,198,366,135,-370,538,198,369,-103,100,534,199,-367,534,5,544,-200,199,544,105,-368,366,199,367,-136,135,367,200,-369,367,105,545,-201,200,545,10,-547,368,200,546,-107,102,369,201,-540,369,135, +368,-202,201,368,106,-548,539,201,547,-10,5,523,202,-545,523,94,370,-203,202,370,136,-374,544,202,373,-106,94,522,203,-371,522,4,548,-204,203,548,107,-372,370,203,371,-137,136,371,204,-373,371,107,549,-205,204,549,11,-551,372,204,550,-109,105,373,205,-546,373,136,372,-206,205,372,108,-552,545,205,551,-11,4,537,206,-549,537,101,374,-207,206,374,137,-378,548,206,377,-108,101,536,207,-375,536,2,543,-208,207,543,104,-376,374,207,375,-138,137,375,208,-377,375,104,542,-209,208,542,8,-553,376,208,552,-110,107,377,209,-550,377,137,376,-210,209,376,109,-554,549,209,553,-12,8,541,210,-560,541,103,378,-211,210,378,138,-382,559,210,381,-113,103,540,211,-379,540,9,554,-212,211,554,110,-380,378,211,379,-139,138,379,212,-381,379,110,555,-213,212,555,13,-557,380,212,556,-112,112,381,213,-559,381,138,380,-214,213,380,111,-558,558,213,557,-13,9,547,214,-555,547,106,382,-215,214,382,139,-386,554,214,385,-111,106,546,215,-383,546,10,560,-216,215,560,113,-384,382,215,383,-140,139,383,216,-385,383,113,561,-217,216,561,14,-563,384,216,562,-115,110,385,217,-556,385,139,384,-218,217,384,114,-564,555,217,563,-14,10,551,218,-561,551,108,386,-219,218,386,140,-390,560,218,389,-114,108,550,219,-387,550,11,564,-220,219,564,115,-388,386,219,387,-141,140,387,220,-389,387,115,565,-221,220,565,15,-567,388,220,566,-117,113,389,221,-562,389,140,388,-222,221,388,116,-568,561,221,567,-15,11,553,222,-565,553,109,390,-223,222,390,141,-394,564,222,393,-116,109,552,223,-391,552,8,559,-224,223,559,112,-392,390,223,391,-142,141,391,224,-393,391,112,558,-225,224,558,12,-569,392,224,568,-118,115,393,225,-566,393,141,392,-226,225,392,117,-570,565,225,569,-16,12,557,226,-576,557,111,394,-227,226,394,142,-398,575,226,397,-121,111,556,227,-395,556,13,570,-228,227,570,118,-396,394,227,395,-143,142,395,228,-397,395,118,571,-229,228,571,17,-573,396,228,572,-120,120,397,229,-575,397,142,396,-230,229,396,119,-574,574,229,573,-17,36,576,230,-584,576,121,398,-231,230,398,143,-402,583,230,401,-125,121,577,231,-399,577,37,578,-232,231,578,122,-400,398,231,399,-144,143,399, +232,-401,399,122,579,-233,232,579,38,-581,400,232,580,-124,124,401,233,-583,401,143,400,-234,233,400,123,-582,582,233,581,-40,14,567,234,-590,567,116,402,-235,234,402,144,-406,589,234,405,-128,116,566,235,-403,566,15,584,-236,235,584,125,-404,402,235,403,-145,144,403,236,-405,403,125,585,-237,236,585,19,-587,404,236,586,-127,127,405,237,-589,405,144,404,-238,237,404,126,-588,588,237,587,-19,15,569,238,-585,569,117,406,-239,238,406,145,-410,584,238,409,-126,117,568,239,-407,568,12,575,-240,239,575,120,-408,406,239,407,-146,145,407,240,-409,407,120,574,-241,240,574,16,-591,408,240,590,-45,125,409,241,-586,409,145,408,-242,241,408,44,-592,585,241,591,-20,13,563,242,-598,563,114,410,-243,242,410,146,-414,597,242,413,-48,114,562,243,-411,562,14,592,-244,243,592,45,-412,410,243,411,-147,146,411,244,-413,411,45,593,-245,244,593,21,-595,412,244,594,-47,47,413,245,-597,413,146,412,-246,245,412,46,-596,596,245,595,-21,14,589,246,-593,589,127,414,-247,246,414,147,-418,592,246,417,-46,127,588,247,-415,588,18,598,-248,247,598,48,-416,414,247,415,-148,147,415,248,-417,415,48,599,-249,248,599,22,-601,416,248,600,-50,45,417,249,-594,417,147,416,-250,249,416,49,-602,593,249,601,-22,18,602,250,-599,602,50,418,-251,250,418,148,-422,598,250,421,-49,50,603,251,-419,603,17,604,-252,251,604,51,-420,418,251,419,-149,148,419,252,-421,419,51,605,-253,252,605,23,-607,420,252,606,-53,48,421,253,-600,421,148,420,-254,253,420,52,-608,599,253,607,-23,17,571,254,-605,571,118,422,-255,254,422,149,-426,604,254,425,-52,118,570,255,-423,570,13,597,-256,255,597,47,-424,422,255,423,-150,149,423,256,-425,423,47,596,-257,256,596,20,-609,424,256,608,-54,51,425,257,-606,425,149,424,-258,257,424,53,-610,605,257,609,-24,20,595,258,-616,595,46,426,-259,258,426,150,-430,615,258,429,-57,46,594,259,-427,594,21,610,-260,259,610,54,-428,426,259,427,-151,150,427,260,-429,427,54,611,-261,260,611,25,-613,428,260,612,-56,56,429,261,-615,429,150,428,-262,261,428,55,-614,614,261,613,-25,21,601,262,-611,601,49,430,-263,262,430,151,-434,610,262,433,-55,49,600,263,-431,600, +22,616,-264,263,616,57,-432,430,263,431,-152,151,431,264,-433,431,57,617,-265,264,617,26,-619,432,264,618,-59,54,433,265,-612,433,151,432,-266,265,432,58,-620,611,265,619,-26,22,607,266,-617,607,52,434,-267,266,434,152,-438,616,266,437,-58,52,606,267,-435,606,23,620,-268,267,620,59,-436,434,267,435,-153,152,435,268,-437,435,59,621,-269,268,621,27,-623,436,268,622,-61,57,437,269,-618,437,152,436,-270,269,436,60,-624,617,269,623,-27,23,609,270,-621,609,53,438,-271,270,438,153,-442,620,270,441,-60,53,608,271,-439,608,20,615,-272,271,615,56,-440,438,271,439,-154,153,439,272,-441,439,56,614,-273,272,614,24,-625,440,272,624,-62,59,441,273,-622,441,153,440,-274,273,440,61,-626,621,273,625,-28,24,613,274,-632,613,55,442,-275,274,442,154,-446,631,274,445,-65,55,612,275,-443,612,25,626,-276,275,626,62,-444,442,275,443,-155,154,443,276,-445,443,62,627,-277,276,627,29,-629,444,276,628,-64,64,445,277,-631,445,154,444,-278,277,444,63,-630,630,277,629,-29,25,619,278,-627,619,58,446,-279,278,446,155,-450,626,278,449,-63,58,618,279,-447,618,26,632,-280,279,632,65,-448,446,279,447,-156,155,447,280,-449,447,65,633,-281,280,633,30,-635,448,280,634,-67,62,449,281,-628,449,155,448,-282,281,448,66,-636,627,281,635,-30,26,623,282,-633,623,60,450,-283,282,450,156,-454,632,282,453,-66,60,622,283,-451,622,27,636,-284,283,636,67,-452,450,283,451,-157,156,451,284,-453,451,67,637,-285,284,637,31,-639,452,284,638,-69,65,453,285,-634,453,156,452,-286,285,452,68,-640,633,285,639,-31,27,625,286,-637,625,61,454,-287,286,454,157,-458,636,286,457,-68,61,624,287,-455,624,24,631,-288,287,631,64,-456,454,287,455,-158,157,455,288,-457,455,64,630,-289,288,630,28,-641,456,288,640,-70,67,457,289,-638,457,157,456,-290,289,456,69,-642,637,289,641,-32,28,629,290,-648,629,63,458,-291,290,458,158,-462,647,290,461,-73,63,628,291,-459,628,29,642,-292,291,642,70,-460,458,291,459,-159,158,459,292,-461,459,70,643,-293,292,643,33,-645,460,292,644,-72,72,461,293,-647,461,158,460,-294,293,460,71,-646,646,293,645,-33,29,635,294,-643,635,66,462,-295,294,462,159,-466,642,294, +465,-71,66,634,295,-463,634,30,648,-296,295,648,73,-464,462,295,463,-160,159,463,296,-465,463,73,649,-297,296,649,34,-651,464,296,650,-75,70,465,297,-644,465,159,464,-298,297,464,74,-652,643,297,651,-34,30,639,298,-649,639,68,466,-299,298,466,160,-470,648,298,469,-74,68,638,299,-467,638,31,652,-300,299,652,75,-468,466,299,467,-161,160,467,300,-469,467,75,653,-301,300,653,35,-655,468,300,654,-77,73,469,301,-650,469,160,468,-302,301,468,76,-656,649,301,655,-35,31,641,302,-653,641,69,470,-303,302,470,161,-474,652,302,473,-76,69,640,303,-471,640,28,647,-304,303,647,72,-472,470,303,471,-162,161,471,304,-473,471,72,646,-305,304,646,32,-657,472,304,656,-78,75,473,305,-654,473,161,472,-306,305,472,77,-658,653,305,657,-36,32,645,306,-662,645,71,474,-307,306,474,162,-478,661,306,477,-80,71,644,307,-475,644,33,658,-308,307,658,78,-476,474,307,475,-163,162,475,308,-477,475,78,659,-309,308,659,37,-578,476,308,577,-122,79,477,309,-661,477,162,476,-310,309,476,121,-577,660,309,576,-37,33,651,310,-659,651,74,478,-311,310,478,163,-482,658,310,481,-79,74,650,311,-479,650,34,662,-312,311,662,80,-480,478,311,479,-164,163,479,312,-481,479,80,663,-313,312,663,38,-580,480,312,579,-123,78,481,313,-660,481,163,480,-314,313,480,122,-579,659,313,578,-38,34,655,314,-663,655,76,482,-315,314,482,164,-486,662,314,485,-81,76,654,315,-483,654,35,664,-316,315,664,81,-484,482,315,483,-165,164,483,316,-485,483,81,665,-317,316,665,39,-582,484,316,581,-124,80,485,317,-664,485,164,484,-318,317,484,123,-581,663,317,580,-39,35,657,318,-665,657,77,486,-319,318,486,165,-490,664,318,489,-82,77,656,319,-487,656,32,661,-320,319,661,79,-488,486,319,487,-166,165,487,320,-489,487,79,660,-321,320,660,36,-584,488,320,583,-125,81,489,321,-666,489,165,488,-322,321,488,124,-583,665,321,582,-40,16,573,322,-670,573,119,490,-323,322,490,166,-494,669,322,493,-84,119,572,323,-491,572,17,666,-324,323,666,82,-492,490,323,491,-167,166,491,324,-493,491,82,667,-325,324,667,41,-516,492,324,515,-91,83,493,325,-669,493,166,492,-326,325,492,90,-515,668,325,514,-41,17,603,326,-667, +603,50,494,-327,326,494,167,-498,666,326,497,-83,50,602,327,-495,602,18,670,-328,327,670,84,-496,494,327,495,-168,167,495,328,-497,495,84,671,-329,328,671,42,-518,496,328,517,-92,82,497,329,-668,497,167,496,-330,329,496,91,-517,667,329,516,-42,18,587,330,-671,587,126,498,-331,330,498,168,-502,670,330,501,-85,126,586,331,-499,586,19,672,-332,331,672,85,-500,498,331,499,-169,168,499,332,-501,499,85,673,-333,332,673,43,-520,500,332,519,-93,84,501,333,-672,501,168,500,-334,333,500,92,-519,671,333,518,-43,19,591,334,-673,591,44,502,-335,334,502,169,-506,672,334,505,-86,44,590,335,-503,590,16,669,-336,335,669,83,-504,502,335,503,-170,169,503,336,-505,503,83,668,-337,336,668,40,-522,504,336,521,-94,85,505,337,-674,505,169,504,-338,337,504,93,-521,673,337,520,-44 + } + Edges: *1344 { + a: 0,4,16,20,62,58,46,42,128,132,144,148,190,186,174,170,3,15,51,63,21,25,37,41,362,366,378,382,318,314,302,298,131,143,179,191,149,153,165,169,195,207,243,255,213,217,229,233,387,399,435,447,405,409,421,425,446,442,430,426,469,473,485,489,510,506,494,490,533,537,549,553,554,558,570,574,618,622,634,638,643,655,691,703,661,665,677,681,702,698,686,682,725,729,741,745,766,762,750,746,789,793,805,809,810,814,826,830,874,878,890,894,899,911,947,959,917,921,933,937,958,954,942,938,1027,1039,1075,1087,1300,1296,1284,1280,1045,1049,1061,1065,1066,1070,1082,1086,1130,1134,1146,1150,1155,1167,1203,1215,1173,1177,1189,1193,1214,1210,1198,1194,1237,1241,1253,1257,1278,1274,1262,1258,1301,1305,1317,1321,1322,1326,1338,1342,1386,1390,1402,1406,1411,1423,1459,1471,1429,1433,1445,1449,1470,1466,1454,1450,1493,1497,1509,1513,1534,1530,1518,1514,1557,1561,1573,1577,1578,1582,1594,1598,1642,1646,1658,1662,1667,1679,1715,1727,1685,1689,1701,1705,1726,1722,1710,1706,1749,1753,1765,1769,1790,1786,1774,1770,1813,1817,1829,1833,1834,1838,1850,1854,1898,1902,1914,1918,1923,1935,1971,1983,1941,1945,1957,1961,1982,1978,1966,1962,2005,2009,2021,2025,2046,2042,2030,2026,2069,2073,2085,2089,2090,2094,2106,2110,2154,2158,2170,2174,2179,2191,2227,2239,2197,2201,2213,2217,960,964,976,980,2261,2265,2277,2281,981,985,997,1001,2325,2329,2341,2345,1022,1018,1006,1002,963,975,1011,1023,2435,2447,2483,2495,2453,2457,2469,2473,64,68,80,84,2517,2521,2533,2537,85,89,101,105,2581,2585,2597,2601,126,122,110,106,67,79,115,127,1,2,5,6,9,10,11,14,17,18,22,26,27,30,33,34,35,38,43,47,49,50,54,59,65,66,69,70,73,74,75,78,81,82,86,90,91,94,97,98,99,102,107,111,113,114,118,123,129,130,133,134,137,138,139,142,145,146,150,154,155,158,161,162,163,166,171,175,177,178,182,187,193,194,197,198,201,202,203,206,209,210,214,218,219,222,225,226,227,230,235,239,241,242,246,251,257,258,261,262,265,266,267,270,273,274,278,282,283,286,289,290,291,294,299,303,305,306,310,315,321,322,325,326,329,330,331,334,337,338,342,346,347,350,353,354,355,358,363,367,369,370,374, +379,385,386,389,390,393,394,395,398,401,402,406,410,411,414,417,418,419,422,427,431,433,434,438,443,449,450,453,454,457,458,459,462,465,466,470,474,475,478,481,482,483,486,491,495,497,498,502,507,513,514,517,518,521,522,523,526,529,530,534,538,539,542,545,546,547,550,555,559,561,562,566,571,577,578,581,582,585,586,587,590,593,594,598,602,603,606,609,610,611,614,619,623,625,626,630,635,641,642,645,646,649,650,651,654,657,658,662,666,667,670,673,674,675,678,683,687,689,690,694,699,705,706,709,710,713,714,715,718,721,722,726,730,731,734,737,738,739,742,747,751,753,754,758,763,769,770,773,774,777,778,779,782,785,786,790,794,795,798,801,802,803,806,811,815,817,818,822,827,833,834,837,838,841,842,843,846,849,850,854,858,859,862,865,866,867,870,875,879,881,882,886,891,897,898,901,902,905,906,907,910,913,914,918,922,923,926,929,930,931,934,939,943,945,946,950,955,961,962,965,966,969,970,971,974,977,978,982,986,987,990,993,994,995,998,1003,1007,1009,1010,1014,1019,1025,1026,1029,1030,1033,1034,1035,1038,1041,1042,1046,1050,1051,1054,1057,1058,1059,1062,1067,1071,1073,1074,1078,1083,1089,1090,1093,1094,1097,1098,1099,1102,1105,1106,1110,1114,1115,1118,1121,1122,1123,1126,1131,1135,1137,1138,1142,1147,1153,1154,1157,1158,1161,1162,1163,1166,1169,1170,1174,1178,1179,1182,1185,1186,1187,1190,1195,1199,1201,1202,1206,1211,1217,1218,1221,1222,1225,1226,1227,1230,1233,1234,1238,1242,1243,1246,1249,1250,1251,1254,1259,1263,1265,1266,1270,1275,1281,1282,1285,1286,1289,1290,1291,1294,1297,1298,1302,1306,1307,1310,1313,1314,1315,1318,1323,1327,1329,1330,1334,1339,1345,1346,1349,1350,1353,1354,1355,1358,1361,1362,1366,1370,1371,1374,1377,1378,1379,1382,1387,1391,1393,1394,1398,1403,1409,1410,1413,1414,1417,1418,1419,1422,1425,1426,1430,1434,1435,1438,1441,1442,1443,1446,1451,1455,1457,1458,1462,1467,1473,1474,1477,1478,1481,1482,1483,1486,1489,1490,1494,1498,1499,1502,1505,1506,1507,1510,1515,1519,1521,1522,1526,1531,1537,1538,1541,1542,1545,1546,1547,1550,1553,1554,1558,1562,1563,1566,1569,1570,1571,1574,1579,1583,1585,1586,1590,1595, +1601,1602,1605,1606,1609,1610,1611,1614,1617,1618,1622,1626,1627,1630,1633,1634,1635,1638,1643,1647,1649,1650,1654,1659,1665,1666,1669,1670,1673,1674,1675,1678,1681,1682,1686,1690,1691,1694,1697,1698,1699,1702,1707,1711,1713,1714,1718,1723,1729,1730,1733,1734,1737,1738,1739,1742,1745,1746,1750,1754,1755,1758,1761,1762,1763,1766,1771,1775,1777,1778,1782,1787,1793,1794,1797,1798,1801,1802,1803,1806,1809,1810,1814,1818,1819,1822,1825,1826,1827,1830,1835,1839,1841,1842,1846,1851,1857,1858,1861,1862,1865,1866,1867,1870,1873,1874,1878,1882,1883,1886,1889,1890,1891,1894,1899,1903,1905,1906,1910,1915,1921,1922,1925,1926,1929,1930,1931,1934,1937,1938,1942,1946,1947,1950,1953,1954,1955,1958,1963,1967,1969,1970,1974,1979,1985,1986,1989,1990,1993,1994,1995,1998,2001,2002,2006,2010,2011,2014,2017,2018,2019,2022,2027,2031,2033,2034,2038,2043,2049,2050,2053,2054,2057,2058,2059,2062,2065,2066,2070,2074,2075,2078,2081,2082,2083,2086,2091,2095,2097,2098,2102,2107,2113,2114,2117,2118,2121,2122,2123,2126,2129,2130,2134,2138,2139,2142,2145,2146,2147,2150,2155,2159,2161,2162,2166,2171,2177,2178,2181,2182,2185,2186,2187,2190,2193,2194,2198,2202,2203,2206,2209,2210,2211,2214,2219,2223,2225,2226,2230,2235,2241,2242,2245,2246,2249,2250,2251,2254,2257,2258,2262,2266,2267,2270,2273,2274,2275,2278,2283,2287,2289,2290,2294,2299,2305,2306,2309,2310,2313,2314,2315,2318,2321,2322,2326,2330,2331,2334,2337,2338,2339,2342,2347,2351,2353,2354,2358,2363,2369,2370,2373,2374,2377,2378,2379,2382,2385,2386,2390,2394,2395,2398,2401,2402,2403,2406,2411,2415,2417,2418,2422,2427,2433,2434,2437,2438,2441,2442,2443,2446,2449,2450,2454,2458,2459,2462,2465,2466,2467,2470,2475,2479,2481,2482,2486,2491,2497,2498,2501,2502,2505,2506,2507,2510,2513,2514,2518,2522,2523,2526,2529,2530,2531,2534,2539,2543,2545,2546,2550,2555,2561,2562,2565,2566,2569,2570,2571,2574,2577,2578,2582,2586,2587,2590,2593,2594,2595,2598,2603,2607,2609,2610,2614,2619,2625,2626,2629,2630,2633,2634,2635,2638,2641,2642,2646,2650,2651,2654,2657,2658,2659,2662,2667,2671,2673,2674,2678,2683 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *2022 { + a: -0.576597571372986,-0.571470439434052,0.583914995193481,0.604590535163879,-0.550025880336761,0.576143801212311,-0.645378351211548,0.1164885237813,0.754928529262543,0.772152423858643,0.179440900683403,0.609574973583221,-0.779603838920593,0.173628881573677,-0.60172313451767,0.657825708389282,0.103292308747768,-0.746053636074066,-0.600658655166626,-0.560335993766785,-0.570291757583618,0.577861189842224,-0.569469213485718,-0.584620594978333,0.446106374263763,-0.261085391044617,0.8560511469841,0.983118772506714,0.181173205375671,0.0255698729306459,-0.281290084123611,-0.275435149669647,-0.919245004653931,-0.991096496582031,0.132120788097382,0.0164867620915174,0.898391902446747,0.0358641110360622,0.437727957963943,0.971613168716431,-0.100346319377422,-0.214239150285721,-0.923993706703186,-0.180992126464844,-0.336864084005356,-0.947524011135101,0.0463789291679859,0.316302359104156,0.913628816604614,0.0744914934039116,0.399666607379913,0.914465665817261,0.378284960985184,-0.143712028861046,-0.901539325714111,0.371720314025879,-0.221473962068558,-0.948998987674713,0.063969150185585,0.308721244335175,0.823349595069885,-0.566177845001221,-0.0392177850008011,-0.804365396499634,-0.584810316562653,-0.104849226772785,-0.81317675113678,0.570035338401794,-0.117486596107483,0.813714444637299,0.579182326793671,-0.0491593033075333,0.821794152259827,-0.569781720638275,0.00177580979652703,-0.80939394235611,-0.583346128463745,-0.0677392482757568,-0.81804370880127,0.569695472717285,-0.0790673121809959,0.813089072704315,0.582049250602722,-0.0102460794150829,0.820661306381226,-0.569982290267944,0.0404370725154877,-0.811222553253174,-0.584032475948334,-0.0287091732025146,-0.819847524166107,0.571153938770294,-0.0404133014380932,0.811922669410706,0.583056569099426,0.028747970238328,0.819873094558716,-0.571117162704468,0.0404146015644073,-0.811900794506073,-0.583087384700775,-0.0287466812878847,-0.820635557174683,0.57001930475235,-0.0404357612133026,0.811243772506714,0.584002912044525,0.0287098288536072,0.49982613325119,-0.294264048337936,-0.81460577249527, +-0.358078509569168,-0.308209866285324,-0.881354928016663,-0.364782631397247,0.29171159863472,-0.884216010570526,0.492514342069626,0.288188993930817,-0.821204423904419,0.467413365840912,0.849227607250214,0.245636805891991,0.408187687397003,0.895583629608154,-0.176954716444016,-0.401146054267883,0.891104936599731,-0.212164893746376,-0.521138966083527,0.829952836036682,0.19897885620594,-0.0891853868961334,0.186032488942146,0.978487610816956,-0.81195604801178,-0.512341439723969,-0.27970290184021,0.0228248257189989,-0.996446192264557,-0.0810802355408669,0.855213582515717,-0.468574404716492,-0.221467524766922,-0.817993462085724,0.538893461227417,-0.201197430491447,-0.994300007820129,-0.00564391817897558,-0.106468990445137,0.020646508783102,0.917726874351501,-0.396674931049347,0.827295899391174,0.546115040779114,-0.131680428981781,-0.00532084750011563,0.994802296161652,-0.101686149835587,0.99972003698349,0.00483819888904691,-0.0231618862599134,-0.807725489139557,-0.583972156047821,-0.0809688046574593,0.0170210860669613,-0.999227106571198,-0.035432193428278,0.822305381298065,-0.56892853975296,-0.0115803927183151,-0.816302239894867,0.570195913314819,-0.0923432111740112,-0.997186601161957,-0.00491033587604761,-0.0747977644205093,0.813486576080322,0.581103980541229,-0.0236185844987631,-0.011155148036778,0.998355865478516,-0.0562242567539215,0.999940752983093,0.00440428871661425,0.00996185187250376,-0.810889661312103,-0.583677172660828,-0.042175717651844,0.0151974707841873,-0.999829769134521,0.0104598272591829,0.821208894252777,-0.569986343383789,0.0270483195781708,-0.819527626037598,0.570513248443604,-0.053750466555357,-0.999091267585754,-0.00462208827957511,-0.0423728004097939,0.812499284744263,0.582762956619263,0.0152336312457919,-0.012977747246623,0.99986207485199,-0.0103646321222186,0.999090790748596,0.00470450334250927,0.0423718169331551,-0.811567723751068,-0.583551704883575,-0.0287291333079338,0.013045628555119,-0.999861240386963,0.0103676775470376,0.820259869098663,-0.570560693740845,0.0404259003698826,-0.820248484611511,0.570576965808868,-0.0404262766242027, +-0.999090909957886,-0.00470203254371881,-0.0423719324171543,0.811577320098877,0.583538174629211,0.0287296045571566,-0.0151299452409148,0.999830842018127,-0.0104555105790496,0.99909120798111,0.00462467735633254,0.0423726513981819,-0.779024600982666,-0.578898012638092,-0.24082712829113,0.811551034450531,-0.559812247753143,-0.167317613959312,-0.787639141082764,0.562962055206299,-0.250396132469177,0.802355349063873,0.568988859653473,-0.180215701460838,0.735210120677948,0.635737240314484,-0.235168486833572,0.841137528419495,0.350831508636475,0.411588281393051,-0.713299334049225,0.633826017379761,-0.299113184213638,-0.885639488697052,0.331422537565231,0.32527169585228,0.0104898493736982,-0.699871718883514,0.714191436767578,0.743496537208557,-0.0786207392811775,0.664102077484131,0.17540542781353,0.107249774038792,0.978636980056763,-0.689144134521484,-0.127499371767044,0.713319182395935,0.497359424829483,0.867377817630768,0.0170096755027771,0.00564937200397253,0.97337019443512,-0.229169175028801,-0.517697036266327,0.855150699615479,-0.0265899505466223,-0.0399748682975769,0.955385506153107,0.292643964290619,-0.115065418183804,0.110364079475403,-0.987208127975464,0.689241111278534,-0.131647422909737,-0.712471485137939,-0.00606052251532674,-0.70401519536972,-0.710159063339233,-0.735427021980286,-0.103962995111942,-0.669581055641174,0.718850910663605,-0.695156633853912,-0.00324027193710208,-0.715282201766968,-0.698828816413879,0.00312829902395606,0.987226843833923,0.147216141223907,-0.0609142184257507,-0.98235023021698,0.164382457733154,0.0892544165253639,0.814377546310425,0.385360181331635,0.433920234441757,0.935691952705383,-0.0295921266078949,0.351574808359146,-0.395596265792847,0.204302117228508,0.895412802696228,0.478743553161621,0.190305054187775,-0.857081472873688,0.799087405204773,0.02162423171103,-0.600825786590576,-0.819355845451355,0.36254557967186,-0.444090962409973,-0.908990383148193,-0.0417754612863064,-0.414718270301819,-0.733938634395599,-0.0423132702708244,0.6778963804245,0.952974855899811,-0.00856901984661818,-0.302928268909454, +0.995522201061249,0.0681692510843277,0.0654873847961426,0.812068223953247,-0.0558025278151035,0.580888390541077,-0.766573190689087,-0.147058442234993,-0.625091433525085,0.125771790742874,-0.463687986135483,-0.87702614068985,-0.945545017719269,0.0133436871692538,0.32521790266037,-0.998018145561218,0.0519193597137928,-0.0355547815561295,-0.116475522518158,-0.0401387847959995,0.992382109165192,0.999570608139038,0.0284097213298082,-0.00717944419011474,0.995158076286316,0.0736746564507484,0.065056636929512,0.919413626194,0.0317125171422958,0.392011523246765,0.0862421691417694,-0.359823971986771,-0.929025828838348,-0.390188485383987,-0.00796908140182495,-0.920700550079346,0.0762319415807724,0.347356051206589,-0.934629559516907,0.528286576271057,-0.00334892538376153,-0.849059522151947,-0.954385876655579,0.0266374163329601,0.297385483980179,-0.997752726078033,0.063990131020546,-0.0198650732636452,-0.995497643947601,0.0119391297921538,-0.0940309092402458,0.0614473037421703,-0.100277341902256,0.993060231208801,-0.0142488945275545,0.999865531921387,-0.00811127107590437,-0.0267195012420416,-0.127216011285782,-0.991515100002289,-4.30245418101549e-05,-1,3.89378328691237e-05,0.995591878890991,-0.0916193574666977,-0.0200679488480091,-0.994818449020386,-0.0994876101613045,0.0209422186017036,0.424199819564819,0.289293348789215,0.858116507530212,0.937539279460907,0.296880841255188,-0.181333616375923,-0.39000928401947,0.25897490978241,-0.883642911911011,-0.928979396820068,0.273934304714203,0.248912021517754,0.995041012763977,0.0527325719594955,0.0843373090028763,0.303933054208755,-0.243924975395203,-0.920937240123749,-0.99458110332489,0.0177102014422417,-0.102444037795067,-0.278320014476776,-0.165458604693413,0.946129739284515,0.995983064174652,0.0355748310685158,0.0821716263890266,0.0873081758618355,-0.00630093924701214,-0.996161460876465,-0.999661982059479,0.0256344620138407,-0.00433778902515769,-0.0929109528660774,0.0315253101289272,0.995175182819366,0.0557894222438335,-0.891200065612793,-0.450166583061218,-0.991024553775787,-0.000292016455205157,-0.133679881691933, +0.00507697509601712,0.973828434944153,-0.227227509021759,0.998530089855194,0.0144400410354137,-0.0522414594888687,0.0192874278873205,-0.998506188392639,-0.0511211752891541,-0.996293008327484,-0.00502782734110951,-0.0858777761459351,-0.00883334688842297,0.997372925281525,-0.0718967318534851,0.999989628791809,0.00439222855493426,-0.00122087635099888,0.0156387276947498,-0.999863088130951,-0.00540880998596549,-0.998553693294525,-0.00472649047151208,-0.053555253893137,-0.012553877197206,0.99957686662674,-0.0262372922152281,0.999504089355469,0.00459124008193612,0.0311558935791254,0.014103015884757,-0.999846339225769,0.0104123279452324,-0.999091029167175,-0.00466298498213291,-0.0423721969127655,-0.0140725914388895,0.999846756458282,-0.0104117086157203,0.999091029167175,0.00466371653601527,0.0423723757266998,0.0327320098876953,-0.972777426242828,-0.229418024420738,-0.975833177566528,-0.00586741650477052,-0.218438223004341,0.005635398440063,0.968443095684052,-0.249171361327171,0.991311192512512,0.00345781142823398,-0.13149231672287,0.954612374305725,0.294148474931717,0.0468166470527649,0.02354178391397,0.90991872549057,-0.414117962121964,-0.958366274833679,0.283436954021454,-0.0346049033105373,-0.0794597640633583,0.587955832481384,0.80498069524765,-0.315410554409027,-0.346689671278,0.883358657360077,0.369892209768295,-0.32024672627449,0.872136235237122,0.443548381328583,0.069061353802681,0.893585741519928,-0.279402643442154,0.0134619008749723,0.960079610347748,0.204639136791229,0.971611082553864,0.118721999228001,0.197815269231796,0.974936544895172,-0.101822428405285,-0.207955658435822,0.970823347568512,-0.119400098919868,-0.249948590993881,0.963286280632019,0.0980074629187584,-0.429251939058304,0.0487072579562664,-0.901870548725128,0.309723109006882,0.00362453586421907,-0.950819909572601,0.321433633565903,-0.351207166910172,-0.879394054412842,-0.357335656881332,-0.341741293668747,-0.869208931922913,-0.336116790771484,-0.881883859634399,-0.330615073442459,0.32904714345932,-0.884259819984436,-0.331379801034927,0.336464583873749,-0.881551325321198,0.33114767074585, +-0.32940199971199,-0.884037613868713,0.331620246171951,0.897261798381805,-0.312702298164368,0.311670362949371,0.879498302936554,-0.333724915981293,-0.339279323816299,0.927756667137146,0.035851813852787,-0.371459513902664,0.956813812255859,0.062151774764061,0.28397998213768,-0.888556182384491,-0.331407576799393,-0.317233383655548,-0.878216087818146,-0.339407473802567,0.33695575594902,-0.926421999931335,0.0466355793178082,0.373587071895599,-0.953113913536072,0.0661199688911438,-0.295299917459488,-0.139950588345528,0.164383143186569,0.97641795873642,0.569696187973022,0.252654433250427,0.782056272029877,0.819446504116058,0.313821047544479,0.479607909917831,0.45476233959198,-0.0425122752785683,0.889597594738007,0.936527729034424,0.273999065160751,0.218724563717842,0.867349147796631,0.211718156933784,-0.450423091650009,0.704353034496307,0.179804772138596,-0.686700105667114,0.934087932109833,0.356701999902725,0.0156008899211884,0.181823059916496,0.142575889825821,-0.97294020652771,-0.549890637397766,0.249126642942429,-0.797217845916748,-0.798437356948853,0.289671272039413,-0.527814626693726,-0.342675149440765,-0.023250550031662,-0.939166247844696,-0.948379635810852,0.253502041101456,-0.190559312701225,-0.860765039920807,0.222349807620049,0.457869172096252,-0.671270370483398,0.116710774600506,0.731966435909271,-0.950376570224762,0.307483315467834,0.0473115406930447,0.921729862689972,-0.0960175544023514,0.375759065151215,0.999454617500305,0.0330108664929867,-0.000922114762943238,0.995926856994629,0.0575539730489254,-0.0694059133529663,0.97160404920578,0.0670609921216965,0.226910650730133,0.827308058738708,-0.108664616942406,-0.551138341426849,-0.00382961612194777,-0.274267494678497,-0.961645781993866,-0.445245295763016,-0.298746556043625,-0.844101309776306,0.725360155105591,-0.187408223748207,-0.662367463111877,-0.89097785949707,-0.163875818252563,-0.423442095518112,-0.999799370765686,-0.00480737769976258,-0.0194443017244339,-0.992826581001282,0.0739720612764359,0.0939345210790634,-0.969577431678772,-0.0153672443702817,-0.244301870465279, +-0.80669629573822,-0.1129185333848,0.58007800579071,0.0960660576820374,-0.219813361763954,0.970800340175629,0.497182965278625,-0.0675234720110893,0.865014314651489,-0.716516435146332,-0.0302656330168247,0.696913301944733,0.981018900871277,0.046209529042244,0.188325792551041,0.999967694282532,0.00776166329160333,0.00210487400181592,0.995973289012909,0.0890680775046349,0.010201808065176,0.982582926750183,0.034691397100687,0.18255752325058,0.271292060613632,-0.1363215893507,-0.952794313430786,-0.100863002240658,-0.140502408146858,-0.984929263591766,-0.10425953567028,0.126032263040543,-0.986532211303711,0.267764657735825,0.126023381948471,-0.95520681142807,-0.995413661003113,-0.0151933711022139,-0.0944496989250183,-0.994493782520294,0.0412834100425243,0.0963214412331581,-0.995054185390472,0.0255365371704102,0.0959945470094681,-0.994062483310699,0.0788386985659599,-0.0749946087598801,-0.743620872497559,0.0129910623654723,0.668475389480591,0.633734405040741,0.00811543595045805,0.773508131504059,0.649922132492065,0.0692491084337234,0.756839334964752,-0.746656060218811,0.0607787631452084,0.66242790222168,0.63259369134903,-0.549783945083618,-0.545493304729462,-0.495579123497009,-0.623184680938721,-0.605014264583588,-0.434145957231522,-0.881298780441284,-0.18662691116333,0.485905468463898,-0.859784066677094,-0.157058104872704,-0.971635222434998,-0.156675696372986,-0.177137285470963,-0.97242546081543,0.183568239212036,-0.143844842910767,-0.962279796600342,0.237789630889893,-0.132188826799393,-0.95964127779007,-0.246800005435944,-0.134827941656113,-0.468152076005936,0.827518463134766,-0.309914380311966,0.490299671888351,0.829125821590424,-0.268620043992996,0.455287665128708,0.8818399310112,-0.122766338288784,-0.455428808927536,0.875636875629425,-0.160763114690781,0.979038059711456,0.19440396130085,-0.0607586875557899,0.98811811208725,-0.119827933609486,-0.0962483957409859,0.97160667181015,-0.229278653860092,-0.0584098100662231,0.967571079730988,0.247282832860947,-0.0515513047575951,0.472582221031189,-0.880314528942108,-0.0413811728358269, +-0.439751386642456,-0.894581079483032,-0.0796454027295113,-0.442412376403809,-0.894685983657837,-0.0617117173969746,0.470988541841507,-0.881849527359009,-0.0226107928901911,-0.962635099887848,-0.254746913909912,-0.0918567180633545,-0.965056419372559,0.243435457348824,-0.0969812795519829,-0.96635365486145,0.243457406759262,-0.083000935614109,-0.963971197605133,-0.254261255264282,-0.0781707540154457,-0.461112886667252,0.881927728652954,-0.0978691950440407,0.450959742069244,0.890547633171082,-0.0596676468849182,0.449545413255692,0.892301201820374,-0.0413220897316933,-0.463751494884491,0.882376730442047,-0.0796602293848991,0.967441916465759,0.252626150846481,-0.015370829962194,0.970024287700653,-0.242779120802879,-0.0105418339371681,0.969931840896606,-0.243342936038971,0.00405850727111101,0.967472434043884,0.252974063158035,-0.00109322881326079,0.469825237989426,-0.882753252983093,-0.0033186012879014,-0.444434344768524,-0.894814491271973,-0.0422503910958767,-0.445579588413239,-0.895142316818237,-0.0133801335468888,0.468798577785492,-0.882941961288452,0.0253237094730139,-0.96512758731842,-0.254036128520966,-0.0632013380527496,-0.967521786689758,0.243450254201889,-0.0680703371763229,-0.968719720840454,0.243855565786362,-0.0460062436759472,-0.966324687004089,-0.254033923149109,-0.0410284399986267,-0.46580183506012,0.882828414440155,-0.0603535436093807,0.448408603668213,0.89356005191803,-0.021916002035141,0.447379231452942,0.894317507743835,0.00693970872089267,-0.466941446065903,0.883718907833099,-0.0317262820899487,0.967287719249725,0.253302663564682,0.0138668119907379,0.969718813896179,-0.243486911058426,0.0189624987542629,0.969028174877167,-0.243518203496933,0.0410275347530842,0.96659517288208,0.253762871026993,0.0360303372144699,0.468166559934616,-0.883178949356079,0.0285455882549286,-0.446049630641937,-0.89495062828064,-0.0101539324969053,-0.446735113859177,-0.894608318805695,-0.0101857101544738,0.467454880475998,-0.88355678319931,0.0285192485898733,-0.96643203496933,-0.254015386104584,-0.0385382585227489,-0.96883887052536,0.243837103247643,-0.0435272231698036, +-0.968880951404572,0.243670120835304,-0.0435270629823208,-0.966457188129425,-0.253919422626495,-0.0385401882231236,-0.467423588037491,0.883573353290558,-0.0285171587020159,0.446765065193176,0.894593358039856,0.0101883411407471,0.446079760789871,0.894935667514801,0.0101542500779033,-0.468136310577393,0.883195102214813,-0.0285445153713226,0.966458320617676,0.253915041685104,0.0385406985878944,0.96888267993927,-0.243662923574448,0.0435273088514805,0.968840777873993,-0.243829965591431,0.0435269810259342,0.966433107852936,0.254011243581772,0.0385381691157818,0.468579977750778,-0.883342683315277,-0.011771297082305,-0.443024307489395,-0.895055711269379,-0.0510361567139626,-0.302794367074966,-0.701741337776184,-0.644883453845978,0.419938236474991,-0.682898581027985,-0.597746849060059,-0.964360892772675,-0.255117356777191,-0.0701639428734779,-0.966787755489349,0.244325563311577,-0.0750096067786217,-0.78673130273819,0.208410546183586,-0.581049680709839,-0.784047663211823,-0.224251016974449,-0.578775227069855,-0.464351177215576,0.882957518100739,-0.069022424519062,0.447230905294418,0.893902122974396,-0.0303866229951382,0.402024239301682,0.680411994457245,-0.612712025642395,-0.319887191057205,0.684621155261993,-0.65495502948761,0.967099845409393,0.254294335842133,0.00722744641825557,0.969553530216217,-0.244567185640335,0.012365366332233,0.848524034023285,-0.208244055509567,-0.486457914113998,0.845194160938263,0.209595039486885,-0.491647034883499,0.975937843322754,0.111719101667404,0.187254443764687,0.96457713842392,0.256954342126846,-0.0597087703645229,0.76453971862793,0.638620316982269,-0.0874244123697281,0.811089813709259,0.559512078762054,0.170527562499046,0.482824891805649,0.790180027484894,-0.377486109733582,-0.440127313137054,0.79349011182785,-0.420311123132706,-0.257164746522903,0.906823694705963,-0.333971530199051,0.286349445581436,0.906913995742798,-0.309048444032669,-0.958159565925598,0.248654067516327,-0.14177930355072,-0.989714741706848,0.100991182029247,0.101318895816803,-0.834485828876495,0.542243301868439,0.0980087593197823, +-0.761537253856659,0.629989922046661,-0.152228817343712,-0.696688115596771,0.260146141052246,0.668543040752411,0.592767655849457,0.277705579996109,0.755980253219604,0.360519647598267,0.775725185871124,0.51795357465744,-0.459068685770035,0.75456178188324,0.468926787376404,0.0290413871407509,-0.350475281476974,0.93612152338028,0.40780708193779,-0.0805832594633102,0.909505248069763,0.116005674004555,0.0374443903565407,0.992542505264282,-0.309867084026337,-0.124003082513809,0.94265878200531,0.207294777035713,0.978276431560516,0.00203721947036684,-0.00474078208208084,0.99327290058136,-0.115700423717499,-0.234195977449417,0.972043037414551,-0.0168721321970224,-0.0249993577599525,0.992917895317078,0.116142146289349,-0.0561985969543457,0.0178080257028341,-0.998260796070099,0.328048497438431,-0.13637401163578,-0.934765338897705,-0.0124431615695357,-0.362413465976715,-0.931934297084808,-0.391679316759109,-0.114050827920437,-0.913005948066711,-0.00212017772719264,-0.937921047210693,-0.346842288970947,0.348007202148438,-0.937491774559021,0.000290852971374989,0.00209992402233183,-0.937780261039734,0.347223073244095,-0.347889214754105,-0.937535583972931,1.12244524643756e-05,0.94159334897995,-0.336580991744995,-0.0107334479689598,0.926812291145325,-0.11130690574646,-0.358649909496307,0.998097717761993,0.0504627637565136,-0.0354184806346893,0.947685718536377,-0.0820562243461609,0.308477848768234,-0.937368154525757,-0.348224312067032,0.0089801512658596,-0.92706972360611,-0.110413052141666,0.35826051235199,-0.997299611568451,0.0583244189620018,0.0446287281811237,-0.942948222160339,-0.0991170927882195,-0.317843198776245,0.26249685883522,0.197802230715752,0.944441437721252,0.664162576198578,0.363168329000473,0.653450012207031,0.730358183383942,0.153042778372765,0.665698885917664,0.0611555464565754,0.193354040384293,0.979221224784851,0.965294361114502,0.237381041049957,-0.108890347182751,0.805907607078552,0.252986282110214,-0.535267114639282,0.906789004802704,0.276946902275085,-0.317858755588531,0.92514580488205,0.348839461803436,0.14972048997879, +-0.223979130387306,0.194623842835426,-0.954963326454163,-0.643388330936432,0.325649678707123,-0.692823052406311,-0.663438737392426,0.1501554697752,-0.733009159564972,0.00894706975668669,0.180918216705322,-0.983457386493683,-0.957243740558624,0.240950703620911,0.160085037350655,-0.800827324390411,0.241204649209976,0.548175096511841,-0.893716931343079,0.212504580616951,0.395110011100769,-0.941357910633087,0.321283489465714,-0.10306453704834,0.987818002700806,-0.022841552272439,0.153927907347679,0.996221899986267,0.0512852482497692,-0.0700834095478058,0.994434654712677,0.0835148990154266,0.0642261132597923,0.959902405738831,0.016712075099349,0.279836088418961,0.508427381515503,-0.219679266214371,-0.832611978054047,-0.287315845489502,-0.253260582685471,-0.92374712228775,0.19401328265667,-0.308092951774597,-0.931363224983215,0.737406730651855,-0.139095231890678,-0.660971820354462,-0.977106928825378,-0.0712832733988762,-0.200451731681824,-0.996433138847351,0.0445531234145164,0.0716666206717491,-0.996322214603424,0.0598493330180645,-0.0613215118646622,-0.944066047668457,-0.0467492416501045,-0.326425820589066,-0.479627013206482,-0.179661095142365,0.858882904052734,0.331486254930496,-0.146687984466553,0.931986927986145,-0.163183271884918,-0.0994429513812065,0.9815713763237,-0.726179480552673,-0.08700080960989,0.681978225708008,0.996340215206146,0.0405073836445808,0.0752679854631424,0.999140918254852,0.0330490656197071,0.0250070132315159,0.995850026607513,0.0481146164238453,0.0772501528263092,0.982216715812683,0.0346013195812702,0.184535026550293,0.0883734449744225,-0.141384214162827,-0.986002326011658,-0.100886039435863,-0.00713126920163631,-0.994872510433197,0.0845228433609009,0.128789708018303,-0.988063335418701,0.269368469715118,-0.0052733295597136,-0.963022708892822,-0.999449372291565,0.0296029634773731,-0.014985010959208,-0.994958996772766,0.0268952045589685,0.0966091901063919,-0.999228537082672,0.0384208969771862,-0.00813156366348267,-0.997848570346832,0.019994705915451,-0.0624378547072411,-0.0989818945527077,-0.00506269047036767,0.995076358318329, +0.650693535804749,0.030584255233407,0.758724331855774,-0.0907894521951675,0.0889017209410667,0.991894006729126,-0.749943435192108,0.0282063912600279,0.660900354385376,0.08159089833498,-0.683836817741394,-0.725058674812317,-0.434876143932343,-0.804262042045593,-0.405024945735931,0.0315858088433743,-0.982211828231812,-0.185100644826889,0.525992333889008,-0.76292097568512,-0.375876992940903,-0.993001282215118,0.00500811077654362,-0.117997281253338,-0.964177131652832,0.219247117638588,-0.149309381842613,-0.992236196994781,-0.00474529340863228,-0.124277286231518,-0.961428701877594,-0.213718637824059,-0.17314475774765,0.0128783658146858,0.949192643165588,-0.314432084560394,0.462679147720337,0.864417672157288,-0.196748778223991,-0.00151127821300179,0.988951683044434,-0.148230701684952,-0.451942354440689,0.860436916351318,-0.235364362597466,0.99917209148407,0.0223855935037136,-0.0339680202305317,0.977108895778656,-0.18843699991703,-0.098740428686142,0.999078154563904,0.007227071095258,-0.0423151701688766,0.970915496349335,0.229578003287315,-0.0679488480091095,0.0204285942018032,-0.997855842113495,-0.062180433422327,-0.441306978464127,-0.894670903682709,-0.069368913769722,0.0182343944907188,-0.998904585838318,-0.0430942326784134,0.47166845202446,-0.881253480911255,-0.0303495675325394,-0.995607733726501,-0.00524111278355122,-0.093476302921772,-0.965817451477051,0.243495345115662,-0.088920533657074,-0.996764123439789,-0.00494621973484755,-0.0802301689982414,-0.963427126407623,-0.254453539848328,-0.0840325951576233,-0.00749322166666389,0.996529161930084,-0.0829060301184654,0.450198382139206,0.891580522060394,-0.049047764390707,-0.00991603918373585,0.997908473014832,-0.0638787820935249,-0.462592482566833,0.882258772850037,-0.0873360708355904,0.99994683265686,0.00449434807524085,-0.00928350817412138,0.96997743844986,-0.24318715929985,-0.00194727396592498,0.999980211257935,0.00439393939450383,0.00451295403763652,0.967488646507263,0.252815425395966,-0.00707279378548265,0.0163969900459051,-0.99960321187973,-0.0229019913822412,-0.445230692625046,-0.895055592060089,-0.0253972616046667, +0.015205018222332,-0.999859392642975,0.00707372091710567,0.469248235225677,-0.882964789867401,0.0133910262957215,-0.997813105583191,-0.00483271013945341,-0.065921887755394,-0.96828818321228,0.243665561079979,-0.0551817528903484,-0.998987317085266,-0.00464667286723852,-0.0447517745196819,-0.965893924236298,-0.25401559472084,-0.0502495542168617,-0.0117909070104361,0.998974442481995,-0.043715376406908,0.447827786207199,0.894105315208435,-0.00509046670049429,-0.0129780825227499,0.999821245670319,-0.0137545820325613,-0.46659791469574,0.883392155170441,-0.0436439886689186,0.99981302022934,0.00448001828044653,0.0188108999282122,0.969376146793365,-0.243508711457253,0.0318328775465488,0.999189794063568,0.00467655109241605,0.0399749390780926,0.966946065425873,0.253569304943085,0.0267936643213034,0.0145393377169967,-0.999839961528778,0.0104311360046268,-0.446395844221115,-0.894777715206146,-0.0101707279682159,0.0136730568483472,-0.999852478504181,0.0103945499286056,0.467808812856674,-0.883368968963623,0.0285323448479176,-0.99909108877182,-0.00464639021083713,-0.0423724539577961,-0.968860030174255,0.243753224611282,-0.043527252972126,-0.999090909957886,-0.00467865588143468,-0.0423721596598625,-0.966444849967957,-0.253966748714447,-0.0385391674935818,-0.013636794872582,0.999853074550629,-0.0103919133543968,0.44641900062561,0.89476615190506,0.0101713556796312,-0.0145018072798848,0.999840497970581,-0.0104299262166023,-0.467782437801361,0.88338303565979,-0.0285323262214661,0.999090909957886,0.00468018092215061,0.0423722974956036,0.968861639499664,-0.243746817111969,0.0435270853340626,0.999091148376465,0.00464814295992255,0.0423722751438618,0.966445624828339,0.253963559865952,0.0385395474731922,0.0163966957479715,-0.999367654323578,-0.031551793217659,-0.417467355728149,-0.875120639801025,-0.244714066386223,0.066434882581234,-0.756216108798981,-0.650940537452698,0.471827298402786,-0.858101844787598,-0.20258355140686,-0.997367322444916,-0.00492612505331635,-0.0723478421568871,-0.942527294158936,0.24364273250103,-0.22864893078804,-0.810221493244171,-0.00763807119801641,-0.58607405424118, +-0.940106809139252,-0.25644850730896,-0.224573880434036,-0.0116434888914227,0.998563647270203,-0.0522966049611568,0.450763761997223,0.864703118801117,-0.221586689352989,0.0453136414289474,0.745801329612732,-0.664625644683838,-0.438083708286285,0.860336720943451,-0.260582596063614,0.99990975856781,0.00444152439013124,0.0126791736111045,0.959999620914459,-0.242871627211571,-0.139334619045258,0.870688140392303,0.000525414943695068,-0.491835236549377,0.957223653793335,0.250380039215088,-0.145026341080666,0.98874819278717,0.13912570476532,0.0549649521708488,0.907980620861053,0.41114142537117,-0.0808336362242699,0.812991857528687,0.581246137619019,0.0345994047820568,0.943510711193085,0.270943999290466,0.190727606415749,0.0252144690603018,0.899299085140228,-0.436606734991074,-0.346629858016968,0.847470939159393,-0.402045637369156,0.0161850098520517,0.940791130065918,-0.338600307703018,0.387246072292328,0.845410048961639,-0.367861777544022,-0.99116587638855,0.129356607794762,-0.0292762778699398,-0.960390567779541,0.257342040538788,0.106887854635715,-0.822212755680084,0.568093836307526,-0.0351486355066299,-0.901279151439667,0.40340793132782,-0.157980889081955,-0.0869649648666382,0.350298255681992,0.932592213153839,0.509315371513367,0.509224057197571,0.693749725818634,-0.0616426020860672,0.827720701694489,0.557744264602661,-0.616601943969727,0.485986053943634,0.619370400905609,-0.308993220329285,-0.667544782161713,0.677426874637604,0.331102222204208,-0.656740844249725,0.677541673183441,0.700194656848907,-0.294160962104797,0.650535762310028,0.7575563788414,0.0765135735273361,0.648270010948181,0.496816247701645,0.149446964263916,0.854891300201416,-0.234095543622971,0.0912821665406227,0.967918813228607,-0.680170297622681,0.023469602689147,0.732678234577179,-0.660653710365295,-0.333408385515213,0.672588646411896,0.496580123901367,0.858092367649078,0.130711853504181,0.472108781337738,0.877043962478638,-0.0889229327440262,0.203136369585991,0.956104099750519,-0.211188435554504,-0.193155229091644,0.95403790473938,-0.229134857654572, +-0.478514552116394,0.868460357189178,-0.129617154598236,-0.5313680768013,0.842843174934387,0.0852255076169968,-0.295589953660965,0.920387029647827,0.255957365036011,0.224211558699608,0.932540655136108,0.283014178276062,-0.482883095741272,0.152106538414955,-0.862373173236847,0.268551349639893,0.0835547149181366,-0.959634721279144,0.685726225376129,0.0145570700988173,-0.727713882923126,0.661564230918884,-0.331541508436203,-0.672616600990295,0.310680240392685,-0.668118834495544,-0.676088094711304,-0.328419417142868,-0.663749814033508,-0.671994745731354,-0.692372739315033,-0.320077568292618,-0.646660983562469,-0.757078647613525,0.0697199776768684,-0.649593114852905,0.677601516246796,-0.663012742996216,-0.318229764699936,0.690545439720154,-0.653133809566498,0.310746341943741,-0.674976766109467,-0.665593862533569,0.318419814109802,-0.684722363948822,-0.658953487873077,-0.311344772577286,0.907639265060425,0.132607161998749,-0.398254156112671,0.951349139213562,0.163748770952225,0.261000484228134,-0.90280956029892,0.151830062270164,0.402346342802048,-0.951951861381531,0.169932797551155,-0.254775673151016,0.791398048400879,0.296666830778122,0.534488499164581,0.87937730550766,0.378243148326874,0.289184540510178,0.971100807189941,0.13070023059845,0.199701935052872,0.801380455493927,-0.19397097826004,0.565830886363983,-0.0432910397648811,-0.0203383564949036,0.998855471611023,-0.565479695796967,0.184507682919502,0.803859293460846,0.598597824573517,0.169589161872864,-0.782892167568207,0.24023574590683,0.0393816046416759,-0.969915390014648,0.40658113360405,-0.117475509643555,-0.906030535697937,0.949448943138123,0.13400237262249,-0.283883899450302,-0.794213056564331,0.269905030727386,-0.544404923915863,-0.891650259494781,0.360149621963501,-0.274320930242538,-0.966431975364685,0.0907085984945297,-0.240377187728882,-0.73788994550705,-0.237550988793373,-0.631734192371368,-0.252695739269257,-0.17413355410099,0.951747000217438,-0.933829963207245,0.0693388432264328,0.350932657718658,0.977167308330536,0.00673854537308216,-0.212364554405212, +0.958590626716614,-0.0261128842830658,-0.283587664365768,0.998842239379883,0.0273245889693499,-0.0395916253328323,0.977631509304047,0.0663113221526146,0.19959856569767,0.868920862674713,0.0143569251522422,0.494742631912231,0.695755362510681,-0.177860498428345,0.69590961933136,-0.60739928483963,-0.236434772610664,-0.758396148681641,-0.860921025276184,-0.144915834069252,-0.487662255764008,-0.524416387081146,-0.426965355873108,-0.736673653125763,0.706087052822113,-0.331045091152191,-0.625979244709015,-0.968572378158569,-0.0181156173348427,0.248071536421776,-0.94282341003418,0.0454486943781376,0.330179423093796,-0.993239939212799,0.0648105442523956,0.0963012352585793,-0.986275494098663,-0.0218751784414053,-0.163652434945107,0.590107798576355,-0.0154371159151196,0.807176887989044,-0.729991018772125,0.000909919675905257,0.683456003665924,0.99756920337677,-0.0463913343846798,-0.0519956052303314,0.989540696144104,0.140752211213112,-0.0315911881625652,0.985772430896759,0.165922790765762,-0.0268785860389471,0.981809318065643,0.0514419227838516,0.182768195867538,0.919423758983612,0.0419605225324631,0.391023367643356,0.913381934165955,0.0331083834171295,0.405755221843719,0.303392380475998,-0.334592670202255,-0.892188847064972,-0.138775199651718,-0.343079566955566,-0.928998351097107,-0.37906476855278,-0.158005028963089,-0.911780774593353,-0.381938546895981,0.14191447198391,-0.913226842880249,-0.147519156336784,0.327658206224442,-0.933208584785461,0.294253289699554,0.325695514678955,-0.898519575595856,0.516684234142303,0.141812518239021,-0.844349920749664,0.519854724407196,-0.148361772298813,-0.84127277135849,-0.952306032180786,0.0336726307868958,0.303281038999557,-0.953539371490479,0.0331481732428074,0.299439400434494,-0.994449317455292,0.0417360700666904,0.0965850576758385,-0.981421411037445,0.156664684414864,-0.110761158168316,-0.984683215618134,0.130127713084221,-0.116041600704193,-0.985853791236877,-0.081207387149334,-0.146621197462082,0.633078157901764,0.140267103910446,0.761273384094238,-0.731992423534393,0.128122165799141,0.6691575050354, +-0.861256659030914,-0.373565882444382,-0.344507575035095,-0.804814040660858,-0.570628583431244,-0.163270503282547,-0.436927199363708,-0.894275009632111,-0.0967820808291435,0.473991602659225,-0.878426969051361,-0.0608114786446095,0.832443654537201,-0.544326841831207,-0.103662095963955,0.913999080657959,-0.306443423032761,-0.265891313552856,-0.84695041179657,0.479607760906219,-0.229458913207054,-0.812692046165466,0.562395453453064,-0.152456521987915,-0.963630437850952,0.243224292993546,-0.110717602074146,-0.96111398935318,-0.255355149507523,-0.105136655271053,-0.474078983068466,0.796094417572021,-0.376142024993896,0.507861256599426,0.794894158840179,-0.33199417591095,0.859262764453888,0.48690328001976,-0.156820550560951,0.81678581237793,0.570751130580902,-0.0842868313193321,0.452071666717529,0.888583958148956,-0.0777806341648102,-0.458589643239975,0.881064772605896,-0.115846216678619,0.970026314258575,-0.241646990180016,-0.0256034657359123,0.967193126678467,0.25231745839119,-0.0295539833605289,-0.806580066680908,-0.584241330623627,-0.089948333799839,-0.808538019657135,-0.583739876747131,-0.0742572620511055,-0.443674147129059,-0.894539654254913,-0.0543337687849998,0.470190912485123,-0.882432401180267,-0.0152802737429738,0.822071015834808,-0.569365441799164,-0.00470719905570149,0.822648227214813,-0.568144023418427,-0.0215025693178177,-0.815181374549866,0.570219218730927,-0.101633250713348,-0.817146360874176,0.570045173168182,-0.0855589210987091,-0.966859400272369,0.243318691849709,-0.077323742210865,-0.964465498924255,-0.254068553447723,-0.0724952593445778,0.813640117645264,0.580428540706635,-0.0330545678734779,0.813310980796814,0.581587433815002,-0.016774645075202,0.448776066303253,0.892999172210693,-0.0339505970478058,-0.46504133939743,0.88232958316803,-0.0723258703947067,0.969862163066864,-0.24345937371254,0.00973909255117178,0.96742582321167,0.253112971782684,0.00460650306195021,-0.810125231742859,-0.583473443984985,-0.0570598244667053,-0.811233222484589,-0.583869695663452,-0.0315733924508095,-0.445527106523514,-0.895211219787598,-0.0101277157664299, +0.468709141016006,-0.882890641689301,0.0285658612847328,0.820797979831696,-0.569981336593628,0.0375742167234421,0.821617603302002,-0.569905877113342,0.0123187266290188,-0.818770170211792,0.570021271705627,-0.0684909969568253,-0.819863021373749,0.570923626422882,-0.0432514362037182,-0.968806803226471,0.243964925408363,-0.0435268394649029,-0.966412901878357,-0.254088491201401,-0.0385369770228863,0.81291675567627,0.582379758358002,0.000379144883481786,0.812071979045868,0.582984149456024,0.0258568841964006,0.447287529706955,0.894331932067871,0.0102115487679839,-0.466881275177002,0.88386070728302,-0.0284964982420206,0.968914866447449,-0.243534877896309,0.0435272604227066,0.966477572917938,0.253841668367386,0.0385416857898235,-0.811430871486664,-0.583742260932922,-0.0287213250994682,-0.81170243024826,-0.583363831043243,-0.028736075386405,-0.447231769561768,-0.894359827041626,-0.0102087538689375,0.46693742275238,-0.883831024169922,0.0284992177039385,0.82010281085968,-0.570786654949188,0.0404216460883617,0.820419371128082,-0.570330917835236,0.0404302887618542,-0.820088863372803,0.570806980133057,-0.0404208712279797,-0.820404946804047,0.570351660251617,-0.0404295921325684,-0.968911528587341,0.243548437952995,-0.0435269884765148,-0.96647572517395,-0.253848701715469,-0.0385417155921459,0.811714649200439,0.583346784114838,0.028737498447299,0.811441898345947,0.583726942539215,0.0287210289388895,0.445582032203674,0.895183801651001,0.0101307658478618,-0.468652606010437,0.882920622825623,-0.0285624135285616,0.968810141086578,-0.243951097130775,0.043526966124773,0.966414749622345,0.254081606864929,0.0385365225374699,-0.808327734470367,-0.585105895996094,-0.0652484074234962,-0.63852059841156,-0.491402953863144,-0.592295944690704,0.720170259475708,-0.468142956495285,-0.512051701545715,0.820331215858459,-0.571869969367981,0.00464279530569911,-0.817056834697723,0.571445524692535,-0.0766040086746216,-0.646807491779327,0.473535656929016,-0.597832798957825,0.811588644981384,0.584182739257813,-0.00736765749752522,0.710758924484253,0.469626873731613,-0.523710191249847, +0.850121676921844,0.486037105321884,-0.202635854482651,0.58837503194809,0.77891206741333,-0.217050060629845,0.697240591049194,0.625258564949036,0.350581467151642,0.89635705947876,0.160230234265327,0.413364619016647,-0.830986559391022,0.482739299535751,-0.276449203491211,-0.571108400821686,0.776016533374786,-0.26764452457428,-0.935024380683899,0.146664127707481,0.322829782962799,-0.748154520988464,0.601603984832764,0.279888361692429 + } + NormalsW: *674 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *1402 { + a: 0.375,0,0.375,1,0.625,0,0.625,1,0.375,0.25,0.625,0.25,0.375,0.5,0.125,0.25,0.625,0.5,0.875,0.25,0.375,0.75,0.125,0,0.625,0.75,0.875,0,0.4140625,0.2890625,0.5859375,0.2890625,0.5859375,0.4609375,0.4140625,0.4609375,0.4140625,0.2890625,0.598250031471252,0.27674999833107,0.598250031471252,0.473250031471252,0.4140625,0.4609375,0.4140625,0.2890625,0.598250031471252,0.27674999833107,0.598250031471252,0.473250031471252,0.4140625,0.4609375,0.625,0.2890625,0.625,0.4609375,0.625,0.4609375,0.625,0.2890625,0.625,0.2890625,0.625,0.4609375,0.625,0.4609375,0.625,0.2890625,0.625,0.2890625,0.625,0.4609375,0.625,0.4609375,0.625,0.2890625,0.625,0.2890625,0.625,0.4609375,0.625,0.4609375,0.625,0.2890625,0.625,0.311342597007751,0.625,0.438657402992249,0.625,0.438657402992249,0.625,0.311342597007751,0.436342597007751,0.311342597007751,0.563657402992249,0.311342597007751,0.563657402992249,0.438657402992249,0.436342597007751,0.438657402992249,0.5,0.1220703125,0.5,0.375,0.5,0.6279296875,0.5,0.875,0.75,0.125,0.25,0.125,0.5,0.25390625,0.6181640625,0.375,0.5,0.49609375,0.3818359375,0.375,0.500175774097443,0.257636725902557,0.617539048194885,0.375,0.500175774097443,0.492363274097443,0.3828125,0.375,0.500351548194885,0.254531264305115,0.625,0.375,0.500351548194885,0.495468735694885,0.3828125,0.375,0.624374985694885,0.375,0.621445298194885,0.492539048194885,0.624374985694885,0.375,0.621445298194885,0.257460951805115,0.625,0.375,0.625,0.4921875,0.625,0.375,0.625,0.2578125,0.625,0.375,0.625,0.4921875,0.625,0.375,0.625,0.2578125,0.625,0.375,0.625,0.4921875,0.625,0.375,0.625,0.2578125,0.625,0.375,0.625,0.488498270511627,0.625,0.375,0.625,0.261501729488373,0.500175774097443,0.26132595539093,0.613849818706512,0.375,0.500175774097443,0.48867404460907,0.386501729488373,0.375,0.5,0,0.5,1,0.625,0.12451171875,0.5,0.2177734375,0.375,0.12451171875,0.5,0.294596374034882,0.580403625965118,0.375,0.5,0.455403625965118,0.419596374034882,0.375,0.5,0.5322265625,0.625,0.625,0.875,0.125,0.5,0.75,0.375,0.625,0.125,0.125,0.625,0.875,0.75,0,0.375, +0.875,0.25,0,0.75,0.25,0.625,0.375,0.25,0.25,0.375,0.375,0.5888671875,0.28564453125,0.5,0.2578125,0.4111328125,0.28564453125,0.5888671875,0.46435546875,0.6171875,0.375,0.4111328125,0.46435546875,0.5,0.4921875,0.3828125,0.375,0.586992204189301,0.288007795810699,0.501054704189301,0.256269514560699,0.4140625,0.2890625,0.586992204189301,0.461992204189301,0.620273470878601,0.375,0.4140625,0.4609375,0.501054704189301,0.493730485439301,0.3828125,0.375,0.588046908378601,0.254726558923721,0.501054704189301,0.256269514560699,0.4140625,0.2890625,0.625,0.375,0.625,0.455403625965118,0.625,0.375,0.625,0.294596374034882,0.4140625,0.4609375,0.501054704189301,0.493730485439301,0.588046908378601,0.495273441076279,0.3828125,0.375,0.622636735439301,0.461992204189301,0.625,0.375,0.622636735439301,0.288007795810699,0.622636735439301,0.461992204189301,0.625,0.4921875,0.620273470878601,0.375,0.622636735439301,0.288007795810699,0.625,0.375,0.625,0.2578125,0.625,0.4609375,0.625,0.375,0.625,0.2890625,0.625,0.4609375,0.625,0.4921875,0.625,0.2890625,0.625,0.375,0.625,0.2578125,0.625,0.4609375,0.625,0.375,0.625,0.2890625,0.625,0.4609375,0.625,0.4921875,0.625,0.2890625,0.625,0.375,0.625,0.2578125,0.625,0.4609375,0.625,0.375,0.625,0.2890625,0.625,0.4609375,0.625,0.4921875,0.625,0.2890625,0.625,0.375,0.625,0.2578125,0.625,0.458170592784882,0.625,0.291829407215118,0.625,0.458170592784882,0.625,0.291829437017441,0.584225237369537,0.290774762630463,0.416829407215118,0.291829407215118,0.584225237369537,0.45922526717186,0.416829407215118,0.458170592784882,0.4375,0.0625,0.5625,0.0625,0.5625,0.1796875,0.4375,0.1796875,0.459201395511627,0.334201395511627,0.540798604488373,0.334201395511627,0.540798604488373,0.415798604488373,0.459201395511627,0.415798604488373,0.4375,0.5703125,0.5625,0.5703125,0.5625,0.6875,0.4375,0.6875,0.4375,0.8125,0.5625,0.8125,0.5625,0.9375,0.4375,0.9375,0.6875,0.0625,0.8125,0.0625,0.8125,0.1875,0.6875,0.1875,0.1875,0.0625,0.3125,0.0625,0.3125,0.1875,0.1875,0.1875,0.4453125,0.25,0.5546875,0.25,0.546875,0.265625,0.453125,0.265625,0.6171875, +0.3203125,0.6171875,0.4296875,0.609375,0.421875,0.609375,0.328125,0.5546875,0.5,0.4453125,0.5,0.453125,0.484375,0.546875,0.484375,0.3828125,0.4296875,0.3828125,0.3203125,0.390625,0.328125,0.390625,0.421875,0.453125,0.265625,0.546875,0.265625,0.549687504768372,0.262812495231628,0.453125,0.265625,0.609375,0.328125,0.609375,0.421875,0.612187504768372,0.424687504768372,0.612187504768372,0.325312495231628,0.546875,0.484375,0.453125,0.484375,0.453125,0.484375,0.549687504768372,0.487187504768372,0.390625,0.421875,0.390625,0.328125,0.390625,0.328125,0.390625,0.421875,0.453125,0.265625,0.549687504768372,0.254999995231628,0.549687504768372,0.254999995231628,0.453125,0.265625,0.625,0.334201395511627,0.625,0.415798604488373,0.625,0.415798604488373,0.625,0.334201395511627,0.549687504768372,0.495000004768372,0.453125,0.484375,0.453125,0.484375,0.549687504768372,0.495000004768372,0.390625,0.421875,0.390625,0.328125,0.390625,0.328125,0.390625,0.421875,0.620000004768372,0.325312495231628,0.620000004768372,0.424687504768372,0.625,0.421875,0.625,0.328125,0.612187504768372,0.487187504768372,0.612187504768372,0.487187504768372,0.625,0.484375,0.625,0.484375,0.620000004768372,0.424687504768372,0.620000004768372,0.325312495231628,0.625,0.328125,0.625,0.421875,0.612187504768372,0.262812495231628,0.612187504768372,0.262812495231628,0.625,0.265625,0.625,0.265625,0.625,0.328125,0.625,0.421875,0.625,0.421875,0.625,0.328125,0.625,0.484375,0.625,0.484375,0.625,0.484375,0.625,0.484375,0.625,0.421875,0.625,0.328125,0.625,0.328125,0.625,0.421875,0.625,0.265625,0.625,0.265625,0.625,0.265625,0.625,0.265625,0.625,0.328125,0.625,0.421875,0.625,0.421875,0.625,0.328125,0.625,0.484375,0.625,0.484375,0.625,0.484375,0.625,0.484375,0.625,0.421875,0.625,0.328125,0.625,0.328125,0.625,0.421875,0.625,0.265625,0.625,0.265625,0.625,0.265625,0.625,0.265625,0.625,0.328125,0.625,0.421875,0.625,0.421875,0.625,0.328125,0.625,0.484375,0.625,0.484375,0.625,0.484375,0.625,0.484375,0.625,0.421875,0.625,0.328125,0.625,0.328125,0.625,0.421875,0.625,0.265625,0.625,0.265625,0.625, +0.265625,0.625,0.265625,0.625,0.328125,0.625,0.421875,0.625,0.415798604488373,0.625,0.334201395511627,0.625,0.484375,0.625,0.484375,0.625,0.470486104488373,0.625,0.470486104488373,0.625,0.421875,0.625,0.328125,0.625,0.334201395511627,0.625,0.415798604488373,0.625,0.265625,0.625,0.265625,0.625,0.279513895511627,0.625,0.279513895511627,0.453125,0.265625,0.549687504768372,0.262812495231628,0.540798604488373,0.279513895511627,0.459201395511627,0.279513895511627,0.612187504768372,0.325312495231628,0.612187504768372,0.424687504768372,0.595486104488373,0.415798604488373,0.595486104488373,0.334201395511627,0.549687504768372,0.487187504768372,0.453125,0.484375,0.459201395511627,0.470486104488373,0.540798604488373,0.470486104488373,0.390625,0.421875,0.390625,0.328125,0.404513895511627,0.334201395511627,0.404513895511627,0.415798604488373,0.5,0.0625,0.5625,0.123046875,0.5,0.17578125,0.4375,0.123046875,0.5,0.331163197755814,0.543836832046509,0.375,0.5,0.418836832046509,0.456163167953491,0.375,0.5,0.57421875,0.5625,0.626953125,0.5,0.6875,0.4375,0.626953125,0.5,0.8125,0.5625,0.875,0.5,0.9375,0.4375,0.875,0.75,0.0625,0.8125,0.125,0.75,0.1875,0.6875,0.125,0.25,0.0625,0.3125,0.125,0.25,0.1875,0.1875,0.125,0.5,0.2421875,0.548828125,0.26171875,0.5,0.2578125,0.451171875,0.26171875,0.62109375,0.375,0.611328125,0.423828125,0.6171875,0.375,0.611328125,0.326171875,0.5,0.5078125,0.451171875,0.48828125,0.5,0.4921875,0.548828125,0.48828125,0.37890625,0.375,0.388671875,0.326171875,0.3828125,0.375,0.388671875,0.423828125,0.5,0.2578125,0.547578096389771,0.264921873807907,0.500703096389771,0.257109373807907,0.453125,0.265625,0.6171875,0.375,0.610078096389771,0.422578126192093,0.618593752384186,0.375,0.610078096389771,0.327421873807907,0.5,0.4921875,0.453125,0.484375,0.500703096389771,0.492890626192093,0.547578096389771,0.485078126192093,0.3828125,0.375,0.390625,0.328125,0.3828125,0.375,0.390625,0.421875,0.500703096389771,0.255156248807907,0.548281252384186,0.252499997615814,0.500703096389771,0.255156248807907,0.453125,0.265625,0.625,0.375,0.625, +0.418836832046509,0.625,0.375,0.625,0.331163197755814,0.500703096389771,0.494843751192093,0.453125,0.484375,0.500703096389771,0.494843751192093,0.548281252384186,0.497500002384186,0.3828125,0.375,0.390625,0.328125,0.3828125,0.375,0.390625,0.421875,0.622500002384186,0.375,0.623749971389771,0.422578126192093,0.625,0.375,0.623749971389771,0.327421873807907,0.610781252384186,0.493593752384186,0.621796846389771,0.485078126192093,0.625,0.4921875,0.621796846389771,0.485078126192093,0.622500002384186,0.375,0.623749971389771,0.327421873807907,0.625,0.375,0.623749971389771,0.422578126192093,0.610781252384186,0.256406247615814,0.621796846389771,0.264921873807907,0.625,0.2578125,0.621796846389771,0.264921873807907,0.625,0.375,0.625,0.421875,0.625,0.375,0.625,0.328125,0.625,0.4921875,0.625,0.484375,0.625,0.4921875,0.625,0.484375,0.625,0.375,0.625,0.328125,0.625,0.375,0.625,0.421875,0.625,0.2578125,0.625,0.265625,0.625,0.2578125,0.625,0.265625,0.625,0.375,0.625,0.421875,0.625,0.375,0.625,0.328125,0.625,0.4921875,0.625,0.484375,0.625,0.4921875,0.625,0.484375,0.625,0.375,0.625,0.328125,0.625,0.375,0.625,0.421875,0.625,0.2578125,0.625,0.265625,0.625,0.2578125,0.625,0.265625,0.625,0.375,0.625,0.421875,0.625,0.375,0.625,0.328125,0.625,0.4921875,0.625,0.484375,0.625,0.4921875,0.625,0.484375,0.625,0.375,0.625,0.328125,0.625,0.375,0.625,0.421875,0.625,0.2578125,0.625,0.265625,0.625,0.2578125,0.625,0.265625,0.625,0.375,0.625,0.420355916023254,0.625,0.375,0.625,0.329644083976746,0.625,0.4921875,0.625,0.480902791023254,0.625,0.477430582046509,0.625,0.480902791023254,0.625,0.375,0.625,0.329644083976746,0.625,0.375,0.625,0.420355916023254,0.625,0.2578125,0.625,0.269097208976746,0.625,0.272569447755814,0.625,0.269097208976746,0.500703096389771,0.257109373807907,0.546059012413025,0.268394112586975,0.5,0.272569447755814,0.454644083976746,0.269097208976746,0.618593752384186,0.375,0.606605887413025,0.421059012413025,0.602430582046509,0.375,0.606605887413025,0.328940987586975,0.500703096389771,0.492890626192093,0.454644083976746,0.480902791023254, +0.5,0.477430582046509,0.546059012413025,0.481605917215347,0.3828125,0.375,0.394097208976746,0.329644083976746,0.397569417953491,0.375,0.394097208976746,0.420355916023254,0.4375,0,0.4375,1,0.5625,0,0.5625,1,0.625,0.0625,0.625,0.185546875,0.560546875,0.224609375,0.439453125,0.224609375,0.375,0.185546875,0.375,0.0625,0.462239563465118,0.300130218267441,0.537760436534882,0.300130218267441,0.574869811534882,0.337239563465118,0.574869811534882,0.412760436534882,0.537760436534882,0.449869811534882,0.462239563465118,0.449869811534882,0.425130188465118,0.412760436534882,0.425130188465118,0.337239563465118,0.439453125,0.525390625,0.560546875,0.525390625,0.625,0.5625,0.875,0.1875,0.625,0.6875,0.875,0.0625,0.5625,0.75,0.4375,0.75,0.375,0.6875,0.125,0.0625,0.375,0.5625,0.125,0.1875,0.625,0.8125,0.8125,0,0.625,0.9375,0.6875,0,0.375,0.9375,0.3125,0,0.375,0.8125,0.1875,0,0.8125,0.25,0.625,0.4375,0.6875,0.25,0.625,0.3125,0.3125,0.25,0.375,0.3125,0.1875,0.25,0.375,0.4375,0.59765625,0.275390625,0.5859375,0.2890625,0.546875,0.265625,0.453125,0.265625,0.4140625,0.2890625,0.40234375,0.275390625,0.59765625,0.474609375,0.5859375,0.4609375,0.609375,0.421875,0.609375,0.328125,0.40234375,0.474609375,0.4140625,0.4609375,0.453125,0.484375,0.546875,0.484375,0.390625,0.328125,0.390625,0.421875,0.5859375,0.2890625,0.590156257152557,0.284843742847443,0.551093757152557,0.259453117847443,0.453125,0.265625,0.4140625,0.2890625,0.4140625,0.2890625,0.5859375,0.4609375,0.590156257152557,0.465156257152557,0.615546882152557,0.426093757152557,0.615546882152557,0.323906242847443,0.4140625,0.4609375,0.4140625,0.4609375,0.453125,0.484375,0.551093757152557,0.490546882152557,0.390625,0.328125,0.390625,0.421875,0.590156257152557,0.259453117847443,0.590156257152557,0.259453117847443,0.551093757152557,0.259453117847443,0.453125,0.265625,0.4140625,0.2890625,0.4140625,0.2890625,0.625,0.337239563465118,0.625,0.412760436534882,0.625,0.449869811534882,0.625,0.449869811534882,0.625,0.412760436534882,0.625,0.337239563465118,0.625,0.300130218267441,0.625,0.300130218267441, +0.4140625,0.4609375,0.4140625,0.4609375,0.453125,0.484375,0.551093757152557,0.490546882152557,0.590156257152557,0.490546882152557,0.590156257152557,0.490546882152557,0.390625,0.328125,0.390625,0.421875,0.615546882152557,0.465156257152557,0.625,0.4609375,0.625,0.421875,0.625,0.328125,0.625,0.2890625,0.615546882152557,0.284843742847443,0.615546882152557,0.465156257152557,0.625,0.4609375,0.625,0.484375,0.625,0.484375,0.615546882152557,0.426093757152557,0.615546882152557,0.323906242847443,0.615546882152557,0.284843742847443,0.625,0.2890625,0.625,0.328125,0.625,0.421875,0.625,0.265625,0.625,0.265625,0.625,0.4609375,0.625,0.4609375,0.625,0.421875,0.625,0.328125,0.625,0.2890625,0.625,0.2890625,0.625,0.4609375,0.625,0.4609375,0.625,0.484375,0.625,0.484375,0.625,0.2890625,0.625,0.2890625,0.625,0.328125,0.625,0.421875,0.625,0.265625,0.625,0.265625,0.625,0.4609375,0.625,0.4609375,0.625,0.421875,0.625,0.328125,0.625,0.2890625,0.625,0.2890625,0.625,0.4609375,0.625,0.4609375,0.625,0.484375,0.625,0.484375,0.625,0.2890625,0.625,0.2890625,0.625,0.328125,0.625,0.421875,0.625,0.265625,0.625,0.265625,0.625,0.4609375,0.625,0.4609375,0.625,0.421875,0.625,0.328125,0.625,0.2890625,0.625,0.2890625,0.625,0.4609375,0.625,0.4609375,0.625,0.484375,0.625,0.484375,0.625,0.2890625,0.625,0.2890625,0.625,0.328125,0.625,0.421875,0.625,0.265625,0.625,0.265625,0.625,0.4609375,0.625,0.449869811534882,0.625,0.300130218267441,0.625,0.2890625,0.625,0.4609375,0.625,0.449869811534882,0.625,0.2890625,0.625,0.300130218267441,0.590156257152557,0.284843742847443,0.574869811534882,0.300130218267441,0.425130188465118,0.300130218267441,0.4140625,0.2890625,0.590156257152557,0.465156257152557,0.574869811534882,0.449869811534882,0.4140625,0.4609375,0.425130188465118,0.449869811534882 + } + UVIndex: *2688 { + a: 0,519,183,528,519,92,351,183,183,351,50,354,528,183,354,96,92,521,184,351,521,2,523,184,184,523,94,352,351,184,352,50,50,352,185,353,352,94,524,185,185,524,5,525,353,185,525,95,96,354,186,527,354,50,353,186,186,353,95,526,527,186,526,4,46,529,187,536,529,97,355,187,187,355,51,358,536,187,358,100,97,530,188,355,530,47,531,188,188,531,98,356,355,188,356,51,51,356,189,357,356,98,532,189,189,532,48,533,357,189,533,99,100,358,190,535,358,51,357,190,190,357,99,534,535,190,534,49,6,537,191,547,537,101,359,191,191,359,52,362,547,191,362,105,101,538,192,359,538,8,539,192,192,539,102,360,359,192,360,52,52,360,193,361,360,102,541,193,193,541,12,543,361,193,543,104,105,362,194,545,362,52,361,194,194,361,104,544,545,194,544,10,10,544,195,555,544,104,363,195,195,363,53,366,555,195,366,109,104,543,196,363,543,12,549,196,196,549,107,364,363,196,364,53,53,364,197,365,364,107,551,197,197,551,3,522,365,197,522,93,109,366,198,553,366,53,365,198,198,365,93,520,553,198,520,1,2,552,199,523,552,108,367,199,199,367,54,370,523,199,370,94,108,550,200,367,550,13,542,200,200,542,103,368,367,200,368,54,54,368,201,369,368,103,540,201,201,540,9,557,369,201,557,111,94,370,202,524,370,54,369,202,202,369,111,559,524,202,559,5,11,556,203,546,556,110,371,203,203,371,55,374,546,203,374,106,110,554,204,371,554,0,528,204,204,528,96,372,371,204,372,55,55,372,205,373,372,96,527,205,205,527,4,561,373,205,561,113,106,374,206,548,374,55,373,206,206,373,113,563,548,206,563,7,4,526,207,570,526,95,375,207,207,375,56,378,570,207,378,117,95,525,208,375,525,5,565,208,208,565,115,376,375,208,376,56,56,376,209,377,376,115,566,209,209,566,15,567,377,209,567,116,117,378,210,569,378,56,377,210,210,377,116,568,569,210,568,14,5,560,211,565,560,112,379,211,211,379,57,382,565,211,382,115,112,558,212,379,558,8,571,212,212,571,118,380,379,212,380,57,57,380,213,381,380,118,572,213,213,572,16,573,381,213,573,119,115,382,214,566,382,57,381,214,214,381,119,574,566,214,574,15,8,538,215,571,538,101,383,215,215,383,58,386,571,215,386,118,101,537,216,383,537, +6,575,216,216,575,120,384,383,216,384,58,58,384,217,385,384,120,576,217,217,576,17,577,385,217,577,121,118,386,218,572,386,58,385,218,218,385,121,578,572,218,578,16,6,564,219,575,564,114,387,219,219,387,59,390,575,219,390,120,114,562,220,387,562,4,570,220,220,570,117,388,387,220,388,59,59,388,221,389,388,117,569,221,221,569,14,579,389,221,579,122,120,390,222,576,390,59,389,222,222,389,122,580,576,222,580,17,14,568,223,586,568,116,391,223,223,391,60,394,586,223,394,125,116,567,224,391,567,15,581,224,224,581,123,392,391,224,392,60,60,392,225,393,392,123,582,225,225,582,19,583,393,225,583,124,125,394,226,585,394,60,393,226,226,393,124,584,585,226,584,18,15,574,227,581,574,119,395,227,227,395,61,398,581,227,398,123,119,573,228,395,573,16,587,228,228,587,126,396,395,228,396,61,61,396,229,397,396,126,588,229,229,588,20,589,397,229,589,127,123,398,230,582,398,61,397,230,230,397,127,590,582,230,590,19,16,578,231,587,578,121,399,231,231,399,62,402,587,231,402,126,121,577,232,399,577,17,591,232,232,591,128,400,399,232,400,62,62,400,233,401,400,128,592,233,233,592,21,593,401,233,593,129,126,402,234,588,402,62,401,234,234,401,129,594,588,234,594,20,17,580,235,591,580,122,403,235,235,403,63,406,591,235,406,128,122,579,236,403,579,14,586,236,236,586,125,404,403,236,404,63,63,404,237,405,404,125,585,237,237,585,18,595,405,237,595,130,128,406,238,592,406,63,405,238,238,405,130,596,592,238,596,21,18,584,239,602,584,124,407,239,239,407,64,410,602,239,410,133,124,583,240,407,583,19,597,240,240,597,131,408,407,240,408,64,64,408,241,409,408,131,598,241,241,598,23,599,409,241,599,132,133,410,242,601,410,64,409,242,242,409,132,600,601,242,600,22,42,603,243,610,603,134,411,243,243,411,65,414,610,243,414,137,134,604,244,411,604,43,605,244,244,605,135,412,411,244,412,65,65,412,245,413,412,135,606,245,245,606,44,607,413,245,607,136,137,414,246,609,414,65,413,246,246,413,136,608,609,246,608,45,20,594,247,616,594,129,415,247,247,415,66,418,616,247,418,140,129,593,248,415,593,21,611,248,248,611,138,416,415,248,416,66,66,416,249,417,416,138,612, +249,249,612,25,613,417,249,613,139,140,418,250,615,418,66,417,250,250,417,139,614,615,250,614,24,21,596,251,611,596,130,419,251,251,419,67,422,611,251,422,138,130,595,252,419,595,18,602,252,252,602,133,420,419,252,420,67,67,420,253,421,420,133,601,253,253,601,22,617,421,253,617,141,138,422,254,612,422,67,421,254,254,421,141,618,612,254,618,25,19,590,255,624,590,127,423,255,255,423,68,426,624,255,426,144,127,589,256,423,589,20,619,256,256,619,142,424,423,256,424,68,68,424,257,425,424,142,620,257,257,620,27,621,425,257,621,143,144,426,258,623,426,68,425,258,258,425,143,622,623,258,622,26,20,616,259,619,616,140,427,259,259,427,69,430,619,259,430,142,140,615,260,427,615,24,625,260,260,625,145,428,427,260,428,69,69,428,261,429,428,145,626,261,261,626,28,627,429,261,627,146,142,430,262,620,430,69,429,262,262,429,146,628,620,262,628,27,24,629,263,625,629,147,431,263,263,431,70,434,625,263,434,145,147,630,264,431,630,23,631,264,264,631,148,432,431,264,432,70,70,432,265,433,432,148,632,265,265,632,29,633,433,265,633,149,145,434,266,626,434,70,433,266,266,433,149,634,626,266,634,28,23,598,267,631,598,131,435,267,267,435,71,438,631,267,438,148,131,597,268,435,597,19,624,268,268,624,144,436,435,268,436,71,71,436,269,437,436,144,623,269,269,623,26,635,437,269,635,150,148,438,270,632,438,71,437,270,270,437,150,636,632,270,636,29,26,622,271,642,622,143,439,271,271,439,72,442,642,271,442,153,143,621,272,439,621,27,637,272,272,637,151,440,439,272,440,72,72,440,273,441,440,151,638,273,273,638,31,639,441,273,639,152,153,442,274,641,442,72,441,274,274,441,152,640,641,274,640,30,27,628,275,637,628,146,443,275,275,443,73,446,637,275,446,151,146,627,276,443,627,28,643,276,276,643,154,444,443,276,444,73,73,444,277,445,444,154,644,277,277,644,32,645,445,277,645,155,151,446,278,638,446,73,445,278,278,445,155,646,638,278,646,31,28,634,279,643,634,149,447,279,279,447,74,450,643,279,450,154,149,633,280,447,633,29,647,280,280,647,156,448,447,280,448,74,74,448,281,449,448,156,648,281,281,648,33,649,449,281,649,157,154,450,282,644,450,74,449,282, +282,449,157,650,644,282,650,32,29,636,283,647,636,150,451,283,283,451,75,454,647,283,454,156,150,635,284,451,635,26,642,284,284,642,153,452,451,284,452,75,75,452,285,453,452,153,641,285,285,641,30,651,453,285,651,158,156,454,286,648,454,75,453,286,286,453,158,652,648,286,652,33,30,640,287,658,640,152,455,287,287,455,76,458,658,287,458,161,152,639,288,455,639,31,653,288,288,653,159,456,455,288,456,76,76,456,289,457,456,159,654,289,289,654,35,655,457,289,655,160,161,458,290,657,458,76,457,290,290,457,160,656,657,290,656,34,31,646,291,653,646,155,459,291,291,459,77,462,653,291,462,159,155,645,292,459,645,32,659,292,292,659,162,460,459,292,460,77,77,460,293,461,460,162,660,293,293,660,36,661,461,293,661,163,159,462,294,654,462,77,461,294,294,461,163,662,654,294,662,35,32,650,295,659,650,157,463,295,295,463,78,466,659,295,466,162,157,649,296,463,649,33,663,296,296,663,164,464,463,296,464,78,78,464,297,465,464,164,664,297,297,664,37,665,465,297,665,165,162,466,298,660,466,78,465,298,298,465,165,666,660,298,666,36,33,652,299,663,652,158,467,299,299,467,79,470,663,299,470,164,158,651,300,467,651,30,658,300,300,658,161,468,467,300,468,79,79,468,301,469,468,161,657,301,301,657,34,667,469,301,667,166,164,470,302,664,470,79,469,302,302,469,166,668,664,302,668,37,34,656,303,674,656,160,471,303,303,471,80,474,674,303,474,169,160,655,304,471,655,35,669,304,304,669,167,472,471,304,472,80,80,472,305,473,472,167,670,305,305,670,39,671,473,305,671,168,169,474,306,673,474,80,473,306,306,473,168,672,673,306,672,38,35,662,307,669,662,163,475,307,307,475,81,478,669,307,478,167,163,661,308,475,661,36,675,308,308,675,170,476,475,308,476,81,81,476,309,477,476,170,676,309,309,676,40,677,477,309,677,171,167,478,310,670,478,81,477,310,310,477,171,678,670,310,678,39,36,666,311,675,666,165,479,311,311,479,82,482,675,311,482,170,165,665,312,479,665,37,679,312,312,679,172,480,479,312,480,82,82,480,313,481,480,172,680,313,313,680,41,681,481,313,681,173,170,482,314,676,482,82,481,314,314,481,173,682,676,314,682,40,37,668,315,679,668,166,483,315,315, +483,83,486,679,315,486,172,166,667,316,483,667,34,674,316,316,674,169,484,483,316,484,83,83,484,317,485,484,169,673,317,317,673,38,683,485,317,683,174,172,486,318,680,486,83,485,318,318,485,174,684,680,318,684,41,38,672,319,688,672,168,487,319,319,487,84,490,688,319,490,176,168,671,320,487,671,39,685,320,320,685,175,488,487,320,488,84,84,488,321,489,488,175,686,321,321,686,43,604,489,321,604,134,176,490,322,687,490,84,489,322,322,489,134,603,687,322,603,42,39,678,323,685,678,171,491,323,323,491,85,494,685,323,494,175,171,677,324,491,677,40,689,324,324,689,177,492,491,324,492,85,85,492,325,493,492,177,690,325,325,690,44,606,493,325,606,135,175,494,326,686,494,85,493,326,326,493,135,605,686,326,605,43,40,682,327,689,682,173,495,327,327,495,86,498,689,327,498,177,173,681,328,495,681,41,691,328,328,691,178,496,495,328,496,86,86,496,329,497,496,178,692,329,329,692,45,608,497,329,608,136,177,498,330,690,498,86,497,330,330,497,136,607,690,330,607,44,41,684,331,691,684,174,499,331,331,499,87,502,691,331,502,178,174,683,332,499,683,38,688,332,332,688,176,500,499,332,500,87,87,500,333,501,500,176,687,333,333,687,42,610,501,333,610,137,178,502,334,692,502,87,501,334,334,501,137,609,692,334,609,45,22,600,335,696,600,132,503,335,335,503,88,506,696,335,506,180,132,599,336,503,599,23,693,336,336,693,179,504,503,336,504,88,88,504,337,505,504,179,694,337,337,694,47,530,505,337,530,97,180,506,338,695,506,88,505,338,338,505,97,529,695,338,529,46,23,630,339,693,630,147,507,339,339,507,89,510,693,339,510,179,147,629,340,507,629,24,697,340,340,697,181,508,507,340,508,89,89,508,341,509,508,181,698,341,341,698,48,532,509,341,532,98,179,510,342,694,510,89,509,342,342,509,98,531,694,342,531,47,24,614,343,697,614,139,511,343,343,511,90,514,697,343,514,181,139,613,344,511,613,25,699,344,344,699,182,512,511,344,512,90,90,512,345,513,512,182,700,345,345,700,49,534,513,345,534,99,181,514,346,698,514,90,513,346,346,513,99,533,698,346,533,48,25,618,347,699,618,141,515,347,347,515,91,518,699,347,518,182,141,617,348,515,617,22,696,348,348,696,180,516, +515,348,516,91,91,516,349,517,516,180,695,349,349,695,46,536,517,349,536,100,182,518,350,700,518,91,517,350,350,517,100,535,700,350,535,49 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2091468415152, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",25.1205987336346 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2091468418992, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",26.5260219912678 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2091468423792, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",23.6243592261476 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2091468425520, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",27.8342571905336 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2091468422640, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",26.4336958132877 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2091468425712, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",26.4336958132877 + } + TypeFlags: "Skeleton" + } + Model: 2090157687952, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",11.5897041187686,6.46449050260551,8.05929541680987 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2090157727392, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,7.06225007688025e-31,90.5456575934157 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-0.0983835482429377,-0.21082188909201,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2090157729712, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-4.68441570169517e-21,-8.10791862815841e-18,0.0662061946196055 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",5.9032805988414,-1.24206200879939e-15,-1.52533651595469e-31 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",86.5100284619626,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2090157725072, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,-7.01364338249052e-15,88.2399754608442 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",6.71842608826867,-5.46160339176538e-14,9.50723639603367e-19 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2090157732032, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-1.28327865653963e-16,7.26441939957378e-15,-2.02407928534475 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",5.03546168449893,-3.05311331771918e-15,-6.16396754200832e-16 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2090157701872, "Model::joint5", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-1.24710393484422e-16,7.49242324230104e-15,-1.90718522087147 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",7.4772025038428,-1.4134526882259e-14,-9.48019825981377e-16 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2090157704192, "Model::joint6", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,1.69178856826431 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",5.85581074617959,-0.0238964688271248,-7.68554800865196e-16 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 2091426232656, "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 7 + PoseNode: { + Node: 2090157687952 + Matrix: *16 { + a: 11.5897041187686,0,0,0,0,6.46449050260551,0,0,0,0,8.05929541680987,0,0,0,0,1 + } + } + PoseNode: { + Node: 2090157727392 + Matrix: *16 { + a: -0.00952337763438993,0.999954651610978,0,0,0.999954651610978,0.00952337763439004,1.22464679914735e-16,0,1.22459126338789e-16,1.16627739370271e-18,-1,0,-0.0983835482429377,-0.21082188909201,0,1 + } + } + PoseNode: { + Node: 2090157729712 + Matrix: *16 { + a: -0.00836790785309783,0.999964988446177,1.41509875545116e-19,0,0.999964988446177,0.00836790785309794,1.22464598156258e-16,0,1.22459126338789e-16,1.16627739370271e-18,-1,0,-0.154602718667473,5.69219100548428,4.24925253598182e-34,1 + } + } + PoseNode: { + Node: 2090157725072 + Matrix: *16 { + a: 0.999236230609243,0.0390762771746637,1.22411169585172e-16,0,-0.0390762771746636,0.999236230609243,-1.26084540051389e-16,0,-1.27244590115244e-16,1.21204867747065e-16,1,0,-0.210821889092008,12.4103818712164,-9.58715719657636e-32,1 + } + } + PoseNode: { + Node: 2090157732032 + Matrix: *16 { + a: 0.999992933536376,0.00375937193058927,1.26788036768317e-16,0,-0.00375937193058916,0.999992933536376,-1.21682370997675e-16,0,-1.27244590115244e-16,1.21204867747065e-16,1,0,4.82079386390397,12.6071489677022,1.01343654339489e-31,1 + } + } + PoseNode: { + Node: 2090157701872 + Matrix: *16 { + a: 0.999564101516944,-0.0295229903401599,1.30767454531112e-16,0,0.02952299034016,0.999564101516944,-1.17395393924265e-16,0,-1.27244590115244e-16,1.21204867747065e-16,1,0,12.2979435303673,12.6352585529145,4.95774106949995e-31,1 + } + } + PoseNode: { + Node: 2090157704192 + Matrix: *16 { + a: 1,-8.32667268468867e-17,1.27244590115244e-16,0,1.94289029309402e-16,1,-1.21204867747065e-16,0,-1.27244590115244e-16,1.21204867747065e-16,1,0,18.1504962423072,12.4384914564286,1.67906546478151e-30,1 + } + } + } + Material: 2092279128160, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2091426237056, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "Blend" + Indexes: *674 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535, +536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673 + } + BlendWeights: *674 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0.0503652468323708,0,0,0,0.0388927347958088,0.0156247606500983,0,0.961345374584198,0.943418681621552,0.666787564754486,0.707144618034363,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0.969926774501801,1,1,0.836209058761597,0.263909906148911,1,0.637759923934937,0.892028510570526,0,0,0.00784313771873713,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.263847261667252,0,0,0,0.0580545961856842,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.998877882957458,0.933170795440674,0.999787390232086,0.99998152256012,0.913128197193146,0.975244641304016,0.999922513961792,1,0.98842978477478,0.985041081905365,0.999829351902008,0.999697387218475,0.966538310050964,0.972419500350952,0.999916076660156,0.999901354312897,0.425310999155045,0.321671396493912,0,0,0.1971395611763,0.0799533724784851,0,0,0.0579623244702816,0.069136306643486,0,0,0.181617453694344,0.224527627229691,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.987818419933319,1,1,1,0.861720263957977,1,0.99985545873642,1,0.998417317867279,1,0.99997740983963,1,0.965420365333557,1,0.999811887741089,1,0.369686603546143,0,0,0.00392156885936856,0.13236628472805,0,0,0,0.054148405790329,0,0,0,0.17980083823204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0919646322727203,0.317815959453583,0,0,0,0,0,0,0.0427066534757614,0.0618992708623409,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0.00392156885936856,0,0,0,0.976265013217926,1,0.961557865142822,0.986547112464905,0.999943971633911,0.992039263248444,0.991556823253632,0.999967277050018,0.778753519058228,0.883309066295624,0.154632836580276,0.165947735309601,0.965517818927765,0.998327910900116,0.665111362934113,0.598892748355865,0.91436368227005,0.889839053153992,0.283244907855988,0,0,0,0,0.341458827257156,0.0725478827953339,0,0,0,0.101222611963749,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Deformer: 2089569466656, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *258 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,45,47,86,87,88,89,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,120,125,127,128,130,131,132,133,134,135,136,137,138,139,140,141,145,146,170,171,172,173,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,234,235,238,239,241,242,243,244,245,246,255,338,339,340,341,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,402,405,406,407,408,409,410,411,412,413,423,506,507,508,509,510,511,512,513,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,575,584,585,589,592,597 + } + Weights: *258 { + a: 0.992066416090107,0.988024353138464,0.90759482422409,0.896165800516671,0.901636795857505,0.911117934716063,0.988124244283822,0.99083544705869,0.338804757842125,0.38474768075383,0.389482988007959,0.369980767619682,0.0117275595938058,0.0236832939503177,0.0170820687599745,0.0129766076991319,0.00193759397107349,0.00259572761849913,0.995097235307819,0.959301208082957,0.921359181851376,0.976003830744307,0.941694258931881,0.969009653896384,0.995419650544799,0.974674871587838,0.988921736659786,0.990479072278854,0.903571491996192,0.904586538772674,0.73091666099863,0.308058732998413,0.74974553833267,0.746223074099213,0.490966938797265,0.7711394535082,0.428210539759958,0.400056757940357,0.10181175687463,0.00900964536360143,0.0727619212605474,0.129752213706186,0.0373530010084201,0.0813131567076996,0.005506671402805,0.018738899823219,0.00127488929339453,0.00119276177630652,0.00252418446148737,0.00105943523508594,0.978557068325321,0.988642276118773,0.998910440717351,0.957802710943557,0.971532424144528,0.767305837362267,0.785315620565794,0.805446768941753,0.763546783128022,0.0468810846860399,0.157358360643519,0.0578103414276778,0.125512847153526,0.00257033357451172,0.00433238312286651,0.990659071779948,0.981515947932925,0.930019371653353,0.960590572829908,0.965506253878701,0.966099891472592,0.988839284783689,0.991577392942295,0.994566614576798,0.99661230585848,0.995831410693532,0.996593975525032,0.974629183051863,0.977923867064395,0.944434515966975,0.930968310612524,0.980859918589367,0.984615282887995,0.945603791138663,0.94972009388868,0.851172213726627,0.841005147239034,0.585886837274545,0.539477251130938,0.84711047424238,0.853368730215792,0.667004864981987,0.661917827300195,0.873976499037006,0.859608846201951,0.630348066112921,0.647469952910572,0.85398215128228,0.810285188803103,0.605509817494516,0.656614250653992,0.129231361856775,0.172564711841683,0.0289339411128142,0.0180689880604585,0.249327822839412,0.254184018496359,0.0756519171395533,0.0724584943905131,0.17001542911138,0.153072034684807,0.0206728088194815, +0.0316141799308276,0.22271976380038,0.19522348394753,0.040962406450819,0.0437745093063298,0.00208726553192705,0.00367462868031299,0.00350166177353797,0.00221600799834485,0.00695486428132105,0.00682476658777555,0.00124685103655786,0.0103621722772715,0.00976144474663545,0.00104118044500374,0.00146254508653404,0.00195967621584959,0.00249736104011991,0.990352750478129,0.968218218041117,0.947905369727824,0.981593236327549,0.975757902902305,0.982641690546088,0.993891715077648,0.983979953961418,0.998011917039323,0.996770838494042,0.998018502922661,0.996745795341982,0.976873190159268,0.965835079149157,0.932885785424893,0.95964192102982,0.98369472501943,0.971994359030556,0.947516252421659,0.971928495349264,0.863784237809799,0.749197776730015,0.599534166930648,0.738883823412657,0.854461301901905,0.777924868987371,0.683484655651188,0.772276599497385,0.887846502912788,0.749041559590595,0.668193403418089,0.788287726746037,0.844189600967606,0.717884781632112,0.64360359887483,0.776346829709474,0.129748913077987,0.0696416005707036,0.0162498851319841,0.0503048957812003,0.26942157823765,0.135748896236562,0.0854021794688776,0.128931482027909,0.168788285075884,0.0590018841399712,0.018240336490394,0.0741201134237618,0.246060244825899,0.0952255028742279,0.0489516877530527,0.103998920697849,0.00232299334890919,0.00114496293243779,0.00157320467813908,0.001046084551321,0.00727385666983604,0.00203707925076763,0.00113365833888273,0.00308011296790853,0.0119054864047542,0.00339825869676481,0.00135891876347697,0.00518706438905768,0.00111551001302624,0.993495150143879,0.992200149718368,0.978685378592716,0.93642179190639,0.885860860100961,0.920238741545369,0.951423764976378,0.987444940935914,0.925948056789606,0.930897457762454,0.950461648455484,0.983788887680031,0.994627701958126,0.994612578201909,0.982712866661557,0.950608650313686,0.990137825845695,0.988623370379782,0.990546548108347,0.988105928319456,0.90755238087169,0.899659677101704,0.893959110751098,0.909127206466025,0.831828422082559,0.618612883999834,0.391251133337751,0.288848679754222,0.606296116034957, +0.841731418639326,0.846331393733278,0.632221953307291,0.47189507725504,0.467611973048461,0.85335980811008,0.636612857991242,0.342009003375917,0.361063885916489,0.363058938876359,0.44133666223672,0.20467578963924,0.0595063867655073,0.0112579193992556,0.00651804915677303,0.0299622788396015,0.164689962848285,0.213547638661883,0.0668964281868947,0.0260887494851193,0.0265601362340639,0.183742707122297,0.0332073112801109,0.00691741204224454,0.0113718513962886,0.016381951529296,0.0173849966451057,0.0053047356615153,0.00436121316015392,0.00517465026468204,0.00129880928293066,0.00400475234317488,0.0052586156803838,0.00660798807589232 + } + Transform: *16 { + a: -0.110373128993877,11.5891785443576,1.41926504090947e-15,0,6.46419734837537,0.0615637842702388,7.53938913499461e-18,0,0,9.86979033557914e-16,-8.05929541680987,0,0.209875384976041,0.100386823170937,1.2293840167286e-17,1 + } + TransformLink: *16 { + a: -0.00952337763438982,0.999954651610978,-0,0,0.999954651610978,0.00952337763438982,1.22464679914735e-16,0,1.22459126338789e-16,1.1662773937027e-18,-1,0,-0.0983835482429377,-0.21082188909201,1.54074395550979e-33,1 + } + } + Deformer: 2089569461504, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *397 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,40,41,42,43,44,45,46,47,48,50,51,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,144,145,146,147,148,149,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,254,255,256,257,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,601,602,603,604,608,666,667,668,669,670,671,672,673 + } + Weights: *397 { + a: 0.00777596026562906,0.0107938791909828,0.0911935445626917,0.0934465875249012,0.0970595595100497,0.0791226345797692,0.0116667372450768,0.008168919238021,0.654642148025862,0.561722327112365,0.550560929650751,0.623978277356773,0.857263571955551,0.195803832515179,0.118630224716073,0.880279441426938,0.504900652253002,0.0156088400927841,0.0176015031490988,0.525028406809659,0.0017134379117669,0.00133419341064542,0.48022427251157,0.226894018813701,0.220450865949744,0.48652019800127,0.518189985369335,0.0114120377103384,0.00277658604615819,0.0171912147532993,0.00172072570071911,0.0100902475425312,0.00193655544758041,0.123324772488878,0.492714738484587,0.102144794066513,0.500208595751131,0.00463839835641238,0.0365685320372173,0.0759359841875623,0.0236208440593805,0.418200216954499,0.204207603365654,0.440551760032561,0.488328290533583,0.0564058198314438,0.0275040372555592,0.00433669394100565,0.0249472246690661,0.00976820853682027,0.00936290046774472,0.0823430792290979,0.0940378857851889,0.243332841888183,0.680551725314702,0.247400331802677,0.227267891284203,0.409579484948523,0.226200782443888,0.558775217066018,0.589916253704469,0.698910162974707,0.749707712702789,0.902052329461624,0.606010202878837,0.160093772403343,0.897412867406498,0.867068223658621,0.8335731585812,0.0226436222982146,0.323944522533311,0.555792978343907,0.620932828853918,0.378914707964029,0.022563009541518,0.0204714149159401,0.440315316588898,0.0108645599101806,0.00102562444627208,0.0367109756104075,0.0280539990912374,0.22703307334308,0.178871396416052,0.189359454774996,0.232864949558218,0.917428584272702,0.511195915053238,0.912481031487225,0.83535347728112,0.302222864004444,0.319486507553374,0.583613846421236,0.0197574987608669,0.00488099335844001,0.00239725889666941,0.00421734897463946,0.39852284352001,0.0678165759994524,0.42083444757977,0.503150239564816,0.00908482554403091,0.0170652661286023,0.0650352126115365,0.0386206035125614,0.463164128488696,0.319980206816685,0.295294844006589,0.473843087103213,0.0339053713754099,0.0313128921723515, +0.0102015599955673,0.00823379168828174,0.00531106192717291,0.00304936374796859,0.00377826813708281,0.00331807471219972,0.0223934157898763,0.0193578166826989,0.0482058626480985,0.0603712259638998,0.0188470111995373,0.0151470514440061,0.0536365116946073,0.0495616840183127,0.146781432085951,0.148886874426544,0.390317076849285,0.455672083053607,0.131966899214309,0.125436497780003,0.279947343672553,0.287485832032664,0.118172400010077,0.138474542135253,0.365732481135887,0.33506419907634,0.143906828926976,0.187164382770858,0.389263856020985,0.338112225932143,0.86058914656781,0.778504697441621,0.709484354248342,0.936187578057652,0.612921039603913,0.59730931222867,0.349550276098134,0.373421874118623,0.778852789510275,0.838142971668387,0.942990672340137,0.703179692011145,0.762158183273302,0.78882732937769,0.888673664507509,0.894635521226439,0.761957451506208,0.150502680205634,0.0674149207396377,0.497017659150558,0.153868343854059,0.775389821289464,0.503725601086825,0.106939226489053,0.751614908905451,0.692572289462736,0.528369911749702,0.545737550149377,0.0545843227587982,0.0463635710061942,0.00505269672149227,0.00767999920611767,0.0162430329955894,0.00499499995445531,0.00127687036574416,0.0027109964853935,0.00511490561959473,0.00316230552680437,0.00140013211293846,0.00458400005331453,0.0221354150996589,0.0034696272468877,0.00110858954229995,0.479009453411457,0.159592792669135,0.286114242402159,0.469870037153323,0.0272806324078635,0.039367287818305,0.119120825886863,0.135967121440814,0.145724600776258,0.487316593788678,0.478320821242836,0.271805292718129,0.510664713948483,0.505777608671644,0.494160777405297,0.497203272624654,0.00915782081193351,0.0294201623422685,0.0499694220049917,0.0179770008786889,0.421195813886025,0.295975276758824,0.439475662845782,0.469056628074693,0.0233394361661222,0.0159164852442764,0.0058016562106764,0.0157109009027696,0.00188148698625735,0.00289102348299449,0.00186674902743514,0.00318255384110948,0.0202499720837706,0.0298170485998532,0.0579390396800855,0.0354768602311453,0.0160584692093927,0.0275991690671686, +0.0517317547765163,0.0276616275553663,0.132331118087811,0.235749485197353,0.392190405542845,0.257981146098104,0.122803442265467,0.188549503255667,0.25977726979931,0.195269824105122,0.108874526896826,0.247886969530478,0.323617677770418,0.199869218381539,0.153517510668745,0.278354883607316,0.350757514287352,0.220343411703553,0.852320547265376,0.828415484450673,0.89721207954106,0.929525306202226,0.565846245905442,0.57472527559267,0.339631654790901,0.600988015215962,0.814244888840059,0.924536100803623,0.92227921337524,0.816004219029256,0.733429773519021,0.872081480237237,0.879280332739084,0.866368049203264,0.716895914816587,0.0818954447802389,0.317652321182564,0.530922049314836,0.743594314240009,0.538138599978585,0.352776910958388,0.0901905652655246,0.722447767422673,0.563662564320144,0.537305689767158,0.614827752436281,0.0524600720999024,0.0162456753199101,0.00638040163242835,0.0271537857504447,0.00827429986850045,0.00321157897490146,0.00190330495479982,0.00658033831102618,0.00372316258286569,0.00223698412904569,0.00142939128785135,0.00188305057480922,0.00927626740224879,0.00873593478669337,0.00187652373016458,0.00229850369589423,0.333511223089559,0.213283890039259,0.419363482498713,0.475246434159398,0.033690053189549,0.0764585416955069,0.109681450614142,0.0670604265779913,0.418564796738231,0.483026794727408,0.435021009510933,0.220272821001445,0.509099925382156,0.499936730927573,0.49693179816381,0.503668346517062,0.00631308658896234,0.00716766403168083,0.019169114879944,0.0571636589136824,0.106447720630595,0.078466864443811,0.0478804159904631,0.0123356383812519,0.462864136806157,0.321677309444791,0.202818570372737,0.210282276375689,0.301145678374968,0.473059013740591,0.488783457373101,0.485003728449367,0.0729217158137596,0.0643433551547122,0.0440020093741053,0.0144058009071968,0.00489427156609449,0.00525437544530767,0.0170076908075107,0.0486995695392751,0.00870696201311289,0.0101127773834706,0.00928793854399413,0.011694308339827,0.0796483728286665,0.087188342221755,0.104596455275886,0.0895769432855505,0.151600918758931, +0.346394456410304,0.574363822667128,0.704898970484904,0.389510366968277,0.156338777671663,0.13717634887214,0.330539816304716,0.43762649475118,0.447297199358093,0.144811088472868,0.359510201703224,0.652374506354062,0.611086272520457,0.628515919929834,0.549521310987843,0.700942696656419,0.47252531088195,0.278911400123655,0.884548273557794,0.912626403670043,0.823300240880771,0.671945001827489,0.419960687622356,0.124334441238805,0.142703962941875,0.805701507736253,0.919545465448816,0.902956308603129,0.281029907210311,0.829875993695275,0.853150035900749,0.0602704010994801,0.0154286193616354,0.0855929107265741,0.484860139241447,0.518265539831025,0.730866407913302,0.77672663587919,0.554907005517782,0.493317262205044,0.0953840210777557,0.018423575072611,0.0461756401290384,0.513073856164313,0.521772113112038,0.0327385626732636,0.00414203166483047,0.00152418875908081,0.00201938515551659,0.00607420461032902,0.0484248180966634,0.00256755122092936,0.00129163167619561,0.0118365693488774,0.00904104323301695,0.00216109334000249,0.00114421920639965,0.0520290872485777,0.182385643093311,0.487158875180315,0.498063784169312,0.0523440457172184,0.175605443622168,0.5096065607277,0.492949529718147 + } + Transform: *16 { + a: -0.0969815761105248,11.5892983452191,1.41926598843286e-15,0,6.46426417074834,0.0540942608430293,7.53939355765913e-18,0,1.14046989141409e-18,9.86979033557915e-16,-8.05929541680987,0,-5.69328541433617,0.106965575969942,1.22938489126287e-17,1 + } + TransformLink: *16 { + a: -0.00836790785309786,0.999964988446176,1.41509875545116e-19,0,0.999964988446176,0.00836790785309786,1.22464679914735e-16,0,1.22459208094404e-16,1.16627807785012e-18,-1,0,-0.154602718667473,5.69219100548428,3.85185988877447e-34,1 + } + } + Deformer: 2089569462240, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *382 { + a: 2,3,4,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,57,59,82,83,84,85,87,88,90,91,92,93,94,95,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,125,126,127,129,132,134,135,136,137,138,139,140,141,142,144,145,146,147,148,149,151,152,153,166,167,168,169,172,174,175,176,177,179,186,187,188,189,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,262,263,266,267,270,271,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,339,340,342,343,344,345,354,355,356,357,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,430,431,433,434,435,437,438,439,441,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,508,509,510,511,514,515,516,517,518,519,520,521,523,524,525,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,615,616,620,666,667,668,669,670,671,672,673 + } + Weights: *382 { + a: 0.00111814531183743,0.00674303020402968,0.00121759086792154,0.00650894626719764,0.00632852649485438,0.0355478233615924,0.042158574547884,0.00584633184947815,0.130732406172376,0.523643875233693,0.701059715576477,0.106559301180342,0.494653471432072,0.861096128566264,0.860602984252981,0.473925382445695,0.0154041341373052,0.0204765379658644,0.0312285021036387,0.0451347379499073,0.518923879891658,0.760196517209457,0.767081769684428,0.512715041133135,0.481091607664921,0.132811441679567,0.011815350171357,0.123465283359464,0.240985215131385,0.0378921246228019,0.720200454555124,0.304561305685454,0.0724936131500338,0.0277260788016825,0.00153615912986715,0.00158211683945779,0.00227808837900061,0.844529890476872,0.506758784223259,0.866702135766778,0.499090071912333,0.00267580957690647,0.00197040799162173,0.578886826381361,0.778818760058526,0.557583459207718,0.511010707328931,0.00144901987506167,0.00229003924271233,0.0088451520255246,0.00133605032248833,0.0168424188161122,0.0092223842091377,0.00269492283233117,0.018060657796733,0.0596811001169341,0.00252430750293108,0.0107639326451002,0.00994391778605637,0.136469689483485,0.233820652875506,0.0249063304807138,0.196427448352006,0.294020906784672,0.0210545925626687,0.124325577963713,0.147587659704282,0.906818121103111,0.671106594800619,0.442914111609208,0.376335747434926,0.616926153704346,0.911561963505036,0.557666192997233,0.00349212173324725,0.00433556426607704,0.0220780330817974,0.00412717347369635,0.00352954387852155,0.0321606798776044,0.181940289047928,0.0266788210516669,0.0390164060922856,0.694157583793547,0.677295939796654,0.413737562765291,0.0563811427551156,0.350696337714061,0.221158034405781,0.235962364176751,0.00199367421294469,0.00292497835727838,0.00165235643565033,0.598620064591255,0.84999064868386,0.576617407047254,0.496305308583793,0.00334475241887558,0.535426250583928,0.673052899923985,0.698836902559041,0.525156137064881,0.00178550980039489,0.00190659674304691,0.00175076486828814,0.00472526822183517,0.00549594977454418,0.00173143272066479,0.00703300343310151, +0.0172434043278144,0.00425467813296766,0.0131078033395236,0.0135812695079797,0.0339492452295663,0.0313074406819598,0.00563307387253305,0.00165844355222122,0.00346403379943856,0.0131177934695322,0.00205258065670855,0.00247357765122531,0.00512851453332707,0.00518560995674838,0.0094795128619818,0.0380517489733868,0.232363152644454,0.0447711657113541,0.0835250813688,0.0946793509393486,0.352749614513389,0.321298021634685,0.0411487191715864,0.0081726079258209,0.0356907936984087,0.241196221293192,0.0150078134884727,0.0158235579393752,0.0702206697598741,0.0614746478237726,0.235385892084057,0.823873913057858,0.916611520901208,0.502459518066274,0.824680048134328,0.222014107628882,0.495680615667962,0.870523499877892,0.241318337014428,0.300492001525529,0.470639414246051,0.452893496038278,0.205682064894378,0.208516532742152,0.0283292493797232,0.0341715374517232,0.649709491840016,0.697562985512618,0.119946590399865,0.0879164701964827,0.458590525387542,0.342973504898259,0.156891959381853,0.0790830319145281,0.675826150997861,0.626022133537198,0.070450252061201,0.0987958219931295,0.00221811981551307,0.00304192112425921,0.00877414968719415,0.00848224912279597,0.00935225062406799,0.0153286246601884,0.00851270348192532,0.0051162248439436,0.520231821570983,0.824487933163999,0.705374445045516,0.529028402688226,0.871674369614261,0.825571007812417,0.850979252593983,0.833532496386523,0.840475602433854,0.511961935818456,0.520797293227589,0.721194237233275,0.488721160003563,0.493685841601353,0.505303511513087,0.502236775402786,0.00158279929216686,0.00151336472904053,0.575932397449151,0.697500189344352,0.558616362314495,0.529747218849564,0.0018398082907976,0.00279604239539792,0.00580720621080855,0.00311329614859806,0.00290635207939806,0.0106818574461238,0.00648799908835619,0.0027025771364536,0.0141504907281889,0.0214711764169526,0.0345785389865505,0.0202112357347154,0.00255493309600348,0.00268265988037728,0.00663163064168212,0.00867825500422223,0.00224319815735094,0.00366894936064567,0.00557148153736862,0.00323796219494567,0.0152962912946291, +0.0844706976486283,0.0815811078447302,0.0193471355276584,0.0957464236507926,0.182430822755225,0.282871435532449,0.160572067964843,0.0145330660257994,0.0158007905965079,0.0560401470152271,0.0933396386243253,0.0204025740483808,0.0325536381265748,0.0716623663069769,0.029514653820693,0.277272373023583,0.902138492409787,0.67754135300848,0.468377918312445,0.252476432602913,0.461088928851465,0.642528779103305,0.894216603638827,0.27018624612068,0.434229518644931,0.461470258761724,0.381967742289406,0.120380493385117,0.0792775851075271,0.0219924734347231,0.110312146806003,0.734858241049315,0.349656439958333,0.118398044172096,0.232812419419787,0.303458336458546,0.256211194362149,0.140382466870791,0.18382083132636,0.706305808137836,0.200062201360866,0.0857149207645891,0.255097802239166,0.00218196651237419,0.00883370440421406,0.00174799172498613,0.00254494445218345,0.0233736901053949,0.00246865577267146,0.00175653334218875,0.00673538604539312,0.00111008198031368,0.00265687451089646,0.662664210117011,0.77542990860267,0.578018777585215,0.523857509791274,0.807372460099015,0.853652406319594,0.856197509804438,0.881937079864309,0.578708038281153,0.516193655257809,0.562920466564045,0.770102514425915,0.49033945606649,0.499573638590816,0.502525143615774,0.495777861389779,0.00139140419725041,0.00415793410744987,0.00526376707056878,0.00106778020483498,0.535749877534808,0.671159879915653,0.78234758616621,0.774169875180491,0.693072180368863,0.52590833463497,0.510545459849343,0.514263214471329,0.00334861917815595,0.0036587869542454,0.00118255416781178,0.0082088122769236,0.008292794583522,0.00138943690079561,0.00124963334258555,0.0107862925012626,0.0230445204718111,0.0255443464577287,0.00562440792442509,0.00399774087747045,0.00180502649919378,0.0111122079670131,0.0257257132712509,0.0578611494286363,0.0522622716916611,0.00172263445890219,0.00371258767256556,0.00505988181857821,0.0215223325834209,0.00831508758882079,0.00903043359876622,0.0635265441276142,0.324144906816694,0.676761735503126,0.10788996140006,0.0571119011008385,0.0117591941670703, +0.0826518913687583,0.396025503817858,0.507879321304039,0.475157708936148,0.0103432033545133,0.0470385410146093,0.089598171337845,0.683276389610251,0.153608756094576,0.129354221521197,0.823885778429149,0.897529230752285,0.898302767074556,0.51450894043238,0.481120356164737,0.264593257667275,0.217923690792589,0.443542687413054,0.506035161332098,0.886238664019813,0.90299841228459,0.859449294100719,0.486317405634835,0.477421482395045,0.309981114921271,0.0551355455402349,0.010261653249098,0.0102588044070143,0.0496774082373805,0.274961873127235,0.527309378652403,0.093606836228061,0.0368115782480599,0.0389748198975144,0.762697744687004,0.748817815504273,0.519676295464435,0.120960959462854,0.0770621820890158,0.0315055914444411,0.0219486890403274,0.0340939094739034,0.00782969375972564,0.00348571865894262,0.00777520591402094,0.0108877587319006,0.896239952350771,0.797542499788718,0.512191118433526,0.501492831523241,0.889576149322939,0.805215633900169,0.489575523257942,0.50633108414814 + } + Transform: *16 { + a: 11.5808522575148,-0.452882490517345,-1.47472715014967e-15,0,0.252608222672794,6.45955312263279,7.83527716420459e-16,0,9.86547778004109e-16,-1.01615255576674e-15,8.05929541680987,0,-0.274290652056853,-12.4091413359882,-1.53102463825618e-15,1 + } + TransformLink: *16 { + a: 0.999236230609243,0.0390762771746637,1.22411169585172e-16,0,-0.0390762771746637,0.999236230609243,-1.26084540051389e-16,0,-1.27244590115244e-16,1.21204867747065e-16,1,0,-0.210821889092008,12.4103818712163,1.97215226305253e-31,1 + } + } + Deformer: 2089569462976, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *386 { + a: 3,5,9,10,13,14,17,18,20,21,22,23,24,25,26,27,28,29,30,31,41,42,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,72,73,75,82,84,87,90,91,92,95,100,102,103,105,106,108,110,111,113,114,116,118,119,126,127,129,132,134,135,136,138,139,140,142,144,146,147,148,149,150,151,152,153,154,155,156,157,159,160,161,166,167,168,172,174,175,176,186,188,189,195,196,198,199,200,201,202,205,211,212,214,215,216,217,218,221,227,228,234,237,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,294,295,298,299,302,303,323,324,325,326,327,328,329,330,333,342,343,344,345,354,355,356,357,363,364,366,367,368,369,372,373,378,379,380,382,383,384,385,386,388,389,394,395,396,402,404,405,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,462,463,465,466,467,469,470,471,473,490,491,492,494,495,496,497,498,500,501,509,510,514,515,516,517,518,523,524,534,535,538,539,540,544,545,546,547,551,554,555,556,557,560,561,562,563,567,570,571,572,587,588,589,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,647,648,652,666,667,670,671 + } + Weights: *386 { + a: 0.003644552628592,0.00325045751005034,0.0179820267974403,0.0177973571253264,0.25686714263758,0.163226347444087,0.123162369563841,0.12167887480653,0.98250838229496,0.977778552101845,0.968362097172461,0.954329769448889,0.970271876584305,0.94959517753128,0.960848938934569,0.965604719431351,0.0630200040579709,0.0521902725732696,0.0647559406849198,0.0515169073751689,0.0128409322504972,0.0124059283529273,0.853819778587983,0.984634049272502,0.856735677205438,0.757220994541076,0.961129466627361,0.269682173754478,0.693410400686137,0.926626929963371,0.971390196054903,0.996145352287654,0.95267639242307,0.997441945209047,0.996943338855104,0.95262838131594,0.996131485548226,0.957521880049202,0.954088775004401,0.737034798826033,0.0344969929725862,0.751891798085633,0.743227910306426,0.0883789383416195,0.684374151126616,0.0796832257379706,0.0829276984716026,0.00124224401561757,0.00119384058244458,0.00176523553495819,0.00151046405355411,0.0320485703835958,0.0310723597334875,0.00145443862768354,0.00284918722807361,0.0169168499284706,0.00180832204978384,0.00119626960534427,0.00524023424420701,0.0089080074636024,0.00216714049901089,0.00844830622979957,0.0397721544599921,0.00225029079681687,0.0628079039829187,0.00746192898927704,0.0678095425356808,0.508528318597363,0.00309949213899568,0.0692625405000337,0.00471241723677751,0.00396051794399974,0.0648142461652707,0.00197220172914434,0.00199417553519951,0.00132551459063904,0.0137348386359291,0.00106660280955442,0.00352962368758764,0.149504234074255,0.00302977811682822,0.00289876908548444,0.00267395905517953,0.919513050291807,0.643911260887157,0.776386266819399,0.759368947931621,0.994394982632351,0.995561025733911,0.996040347263579,0.996231376125235,0.623059755538982,0.628291083072919,0.561233484630652,0.702525978011647,0.00205421698667317,0.00126829172531196,0.00176477651685988,0.00277952483222374,0.0821367976097313,0.00246180894403176,0.00160065056711516,0.00132769112360597,0.0069064618157984,0.00581801416773606,0.00107080441521421,0.00263433163022082,0.00316448813815551, +0.00307495054602882,0.00655262995690834,0.00781476039527929,0.00761344004649411,0.0190983889899188,0.0192887454176129,0.00221800837536804,0.00434801734123927,0.0108787568872845,0.0292183270701541,0.0542256232638298,0.05382687377475,0.222046361480793,0.232819744162366,0.00998297446136865,0.0240096771129737,0.0219485774060845,0.0155669866260069,0.0179496792590351,0.0219895938658896,0.729365295226405,0.735352518533044,0.965539112773016,0.956654747095885,0.332080985666174,0.297224340190045,0.878636147892029,0.908916426488672,0.536254490276793,0.653826792585636,0.84160950879213,0.920087059326886,0.319345787270827,0.349341189148141,0.925570030056245,0.899968070346835,0.996919065843363,0.996097449595464,0.991645366978918,0.986118570957871,0.990193681919378,0.990972457198822,0.99001560288376,0.988154726506435,0.990314643518976,0.984267005494541,0.993234065361636,0.993707588797438,0.990895429864461,0.994194576066475,0.99079984374503,0.990833877376383,0.915307767590967,0.917842925466987,0.218025986331805,0.207384503407308,0.885923964308891,0.838018309893485,0.241000818930475,0.234010043165411,0.897070373195165,0.861720741631745,0.180229877888338,0.345547202693832,0.862660386854147,0.852106945473042,0.267252600400324,0.235958568479316,0.00610195312257219,0.0119105612134099,0.0109463730068527,0.0118595663027782,0.0097830497379189,0.00751617329607157,0.0109031215957325,0.0137815506508975,0.0157680329869571,0.00842758792547652,0.00103722616314485,0.100997385190584,0.134996451862155,0.0298437104271001,0.0304343998936936,0.0136623820609539,0.00692794261925839,0.00281051071600591,0.00647455599720335,0.00185786749593745,0.00110783302178793,0.00103702946616393,0.00155181718949619,0.00336794136368386,0.00176790832353335,0.00437084611182227,0.00178741439532273,0.00858469549851183,0.0120543523132855,0.0221593561349099,0.012242242416567,0.00155727463842819,0.00316477300439767,0.00263422780450445,0.0174720820872253,0.00495688865440212,0.068985195604688,0.107094120095268,0.29209240002217,0.109507561216251,0.00243373834694502,0.00344026936455316, +0.0165358795516013,0.00350868726699343,0.0148209408626665,0.00440197716852827,0.0023560157531253,0.00435601686761393,0.0145465076992739,0.815247656193959,0.901064078443736,0.970221874142428,0.857330310230401,0.256192339191909,0.646895879488382,0.879435061166359,0.759697041050771,0.69278890165099,0.741480922709465,0.858095718027947,0.814259396781745,0.283608934179993,0.790074555375028,0.912157853554214,0.742426803667907,0.996709527178943,0.997141148469149,0.982583153832243,0.996957710012115,0.990418883441114,0.996309958136625,0.988954504522872,0.994056578865388,0.976025336207575,0.996397476098268,0.992991320876662,0.997173120938923,0.99263474605188,0.996996968230416,0.990055502371138,0.994748358500181,0.895157513514212,0.759165072714391,0.174432207504323,0.744509686756549,0.861080412237557,0.702003429197265,0.229631561096985,0.709695552798063,0.797993086724426,0.568272606343208,0.183366571054485,0.758349499960342,0.838349063024992,0.725638637577938,0.330070283214571,0.623547841259272,0.00538977513104527,0.00107221002451929,0.0131053481835536,0.00271458356336954,0.00158883326381325,0.00943712341553846,0.00200767918516735,0.00131665469340099,0.013176063251925,0.00167194583541599,0.00161965968842691,0.00369412303869585,0.0111791101143086,0.0025557054250645,0.158890310577358,0.0698215926640212,0.0340692942643635,0.0509466088938413,0.00262434944305311,0.00199190020845953,0.00953220864477288,0.00225659699236877,0.00242763291292373,0.00131354968564645,0.00709329749452719,0.0147742772942148,0.0154893748974418,0.00572320821361452,0.00141055608105766,0.00187753972761465,0.00459039643075574,0.00485914697914897,0.0057843205469018,0.0119480443990644,0.00884062816998064,0.00538000467065841,0.0115124203900653,0.032617009771766,0.0328282932566506,0.00632745428060911,0.0308547277163901,0.14382230269598,0.0330686856809111,0.0010437158853726,0.0318551949589331,0.11711631880521,0.341694686799714,0.355575291792697,0.0243215806779947,0.110538042840469,0.0866485324403324,0.0159098283817988,0.0181404759208935,0.0782494655555892,0.0903688140671209, +0.652015491338844,0.939944122049177,0.987782476396476,0.987233382029309,0.943253132726689,0.670000998887263,0.470076332301226,0.905524190123671,0.962570212975815,0.959315557731959,0.22542551423856,0.242102465030316,0.478109898189394,0.87800760221188,0.922073925191006,0.968101029144141,0.976644641296709,0.96530607146825,0.990869186929478,0.989778708321497,0.970232740532655,0.972683607920559,0.991580087117833,0.995746263847994,0.991829486058024,0.991869328713902,0.954019352234702,0.943048566452203,0.988663128091967,0.992394864852219,0.96488405222058,0.969642133607655,0.95876051844844,0.959345168726759,0.903816990886856,0.220488065453432,0.0431351976938232,0.0433652018093354,0.239796395006348,0.903832028990237,0.85392085713421,0.257700799140314,0.0686791787284902,0.0642449723853084,0.88239188468843,0.20506537583605,0.0468125575744374,0.0706828000253228,0.100134542110591,0.0633950141547988,0.00943724756470783,0.00969802153371892,0.0106111686085033,0.00875548879587844,0.0516393873336303,0.0199890257725732,0.0579833372902601,0.0191069284230436 + } + Transform: *16 { + a: 11.5896222205461,-0.0435700083479337,-1.47472715014967e-15,0,0.0243024241410561,6.46444482151853,7.83527716420458e-16,0,1.02182224363322e-15,-9.80674174888117e-16,8.05929541680987,0,-4.86815475989343,-12.5889367226075,-9.14627884055352e-16,1 + } + TransformLink: *16 { + a: 0.999992933536376,0.00375937193058927,1.26788036768317e-16,0,-0.00375937193058927,0.999992933536376,-1.21682370997675e-16,0,-1.27244590115244e-16,1.21204867747065e-16,1,0,4.82079386390397,12.6071489677022,7.88860905221012e-31,1 + } + } + Deformer: 2089569463712, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *249 { + a: 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,121,122,123,124,143,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,230,231,232,233,260,261,264,265,268,269,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,398,399,400,401,427,428,429,431,432,433,435,436,437,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,576,577,578,579,580,581,582,583,611,612,613,614,617,618,619,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665 + } + Weights: *249 { + a: 0.0296755169819614,0.0502721362921151,0.0390766344961964,0.0343055279837793,0.936940194096039,0.9477637955611,0.935183517454239,0.948429996475803,0.900139132198309,0.946128820325527,0.932925631912084,0.927832164791289,0.514364057314926,0.522386089975556,0.517017456491688,0.522360024802675,0.00221845902697942,0.0472091331878316,0.00176172254366924,0.00145220972195051,0.0472555909312286,0.00156059337685129,0.0424039527372885,0.0458226497557814,0.26294803667182,0.9654843242316,0.248096760110682,0.256752665177251,0.911513197416182,0.315607785081831,0.920247215042352,0.91701215962706,0.997348422732994,0.967890064748924,0.997284987867791,0.996111418162873,0.931605261519725,0.996417415080769,0.908978224025,0.926522256082435,0.560552704337011,0.552635881492091,0.558734946826348,0.565566778376218,0.517094180243093,0.51579510683154,0.514924733613337,0.516012777126292,0.502258627502736,0.00459763486911347,0.00238370124808251,0.00100471657964948,0.002066958286536,0.376925344408509,0.371676514348489,0.438740343411197,0.297449413685407,0.998773119070434,0.995146531251985,0.997068717376404,0.996322964211704,0.608750908713292,0.574159094908099,0.565667034972623,0.560264762709399,0.503548042435927,0.505287085092512,0.512677451954727,0.512018742070579,0.0081485894998044,0.0135895646255682,0.00962260333583656,0.0113922682061994,0.00636925036033599,0.00598672309772991,0.00894245857069884,0.00870258485792841,0.0846728261113137,0.0821340342136096,0.781962544889801,0.792607273315997,0.114027123417157,0.161931528716545,0.758971048272413,0.765965631909969,0.102903854506272,0.138251567557692,0.819751714718036,0.654427051075114,0.137302464430269,0.147855851725443,0.732724578517558,0.764018337664726,0.993775431597564,0.987822269799919,0.988572376627245,0.990081366835862,0.988744946573785,0.987712165897012,0.985267143262841,0.985290865533005,0.989998120907179,0.992180717534949,0.988853859013619,0.988886528979527,0.98880240259218,0.985971771793167,0.986913068740664,0.985881891034592,0.821647237713464,0.827868814896894,0.519315610523631, +0.518167920769124,0.804009294029963,0.778943162810617,0.530008849250107,0.537667466219563,0.785261159999376,0.802434818917573,0.537588091659072,0.524167300200097,0.715585829588377,0.780621112745168,0.523599539330129,0.52621956077315,0.503310520906673,0.509643060542199,0.510306238740986,0.504196746358485,0.00203028362115935,0.0170592042168741,0.0024385844922273,0.00190637333068575,0.0106270624821969,0.00328616144031962,0.00110785092396556,0.00660769024091763,0.00105093661465084,0.00183186667642211,0.00958689091868841,0.00254522380286108,0.104815066994099,0.24082424218597,0.825559834694862,0.255481184620449,0.138873186183759,0.297971110842401,0.770335828918817,0.290280426210562,0.201967481764228,0.431704704778187,0.816612962037839,0.241634055291972,0.161605637677339,0.274342542681782,0.669899266168713,0.376426154226717,0.994506720773382,0.997854436647159,0.994598259830431,0.99829273444345,0.986498717654278,0.993870356128828,0.980021300148243,0.996348545148124,0.990350239182805,0.995185368494623,0.987536259214697,0.997126807719222,0.98654439488457,0.996578888704723,0.986469562491019,0.996363553478733,0.868888611403546,0.550695878865428,0.533009017303682,0.549296307931504,0.793592166691711,0.564560913897527,0.541864906111175,0.602690465344825,0.800744302163851,0.605578948341675,0.536963717806478,0.557466849776752,0.769281073206966,0.556883860694707,0.527459902718279,0.555571144922157,0.50795735648065,0.509401144405802,0.515178262281965,0.519881579739914,0.512750674171167,0.516726329566267,0.514322199877321,0.510704981768067,0.00990438902442783,0.0296995158443634,0.0272527888944235,0.00821825487872175,0.00781924006774288,0.0458875999879046,0.056790906057135,0.00718141709975087,0.0350383409566724,0.0302937288869112,0.0411719775865885,0.0405547266851736,0.0961441711031505,0.779495937252347,0.956828479004288,0.956612654238868,0.760189702182873,0.0961466936261803,0.146037367398495,0.742276621440776,0.931237874129065,0.935687209284567,0.117577710779627,0.794916511390546,0.953135865363811,0.929270842981778,0.899795302611827, +0.936548205902819,0.990329239499072,0.989654803087532,0.963739043393605,0.913783407154009,0.986492113937357,0.990108282884056,0.989074952394049,0.987515897947204,0.932517060287453,0.917958781569027,0.990950004896936,0.987219555646734,0.936447048970985,0.934490483959259,0.926301321218685,0.91819876812431,0.799443097818776,0.536910501667277,0.529178315302271,0.787092819016016,0.771545608919524,0.524892515862086,0.76176208962097,0.540300226257575 + } + Transform: *16 { + a: 11.5846521843242,0.342162722743718,-1.47472715014967e-15,0,-0.190851090662478,6.4616726410017,7.83527716420458e-16,0,1.05389354697049e-15,-9.46124160208418e-16,8.05929541680987,0,-11.9195522592346,-12.9928229309291,3.33919419260256e-17,1 + } + TransformLink: *16 { + a: 0.999564101516944,-0.0295229903401599,1.30767454531112e-16,0,0.0295229903401599,0.999564101516944,-1.17395393924265e-16,0,-1.27244590115244e-16,1.21204867747065e-16,1,0,12.2979435303673,12.6352585529145,1.38050658413677e-30,1 + } + } + Deformer: 2089569468128, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *120 { + a: 32,33,34,35,36,37,38,39,70,71,72,73,74,75,76,77,78,79,80,81,121,122,123,124,143,159,160,161,162,163,164,165,230,231,232,233,292,293,296,297,300,301,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,398,399,400,401,459,460,461,463,464,465,467,468,469,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,576,577,578,579,580,581,582,583,643,644,645,646,649,650,651,653,654,655,656,657,658,659,660,661,662,663,664,665 + } + Weights: *120 { + a: 0.0998165963539491,0.0538303322446255,0.0670232038124303,0.0721270481729147,0.485635558281929,0.477613148518383,0.482981805963869,0.477639113523097,0.00140930987482331,0.0320951642040315,0.00152115307558112,0.00212330963049023,0.0683169977802225,0.00207208863349601,0.090968955834037,0.0734361275213818,0.439445276389852,0.447362640195219,0.441262465357619,0.434430620229067,0.482905605599084,0.484204128138055,0.4850747444093,0.483986623720809,0.497741292075823,0.0027992055455128,0.00166296337972712,0.0019122255142064,0.391248074564442,0.425836953227111,0.434330742034225,0.43973298349833,0.496451864842289,0.494712733217632,0.487322021948983,0.487980810763882,0.0111812856820447,0.0098322247936104,0.014341324238792,0.0144224751911368,0.0109134301263344,0.0109201194618774,0.012873284969256,0.0138789254774798,0.178347299477954,0.172126184213341,0.480684038987042,0.481831773600237,0.19597488847858,0.221041970556242,0.46998964226263,0.462330743991817,0.214729622935607,0.197555342192725,0.462410616664511,0.475831847101051,0.284401960376236,0.219370229211606,0.476399705628477,0.473779255696518,0.496689417395238,0.490356528575461,0.489693380428112,0.495803103314675,0.00107333631030039,0.00531732763576652,0.00100360546342028,0.00341500073806741,0.0195065743427396,0.00206258750169334,0.00280690813881338,0.0122885326558264,0.00155651121457157,0.00174913643026749,0.0132881050038412,0.00201675360862702,0.131108540826962,0.449303289907054,0.466990634442056,0.450702864641569,0.206391547767553,0.435435742422833,0.458132942084385,0.397304463024104,0.199245541466186,0.394417495438123,0.46303501788952,0.442531197289912,0.230709240476839,0.443114344320735,0.472539059302281,0.444426087911797,0.49204249985098,0.490598647803497,0.484821085575698,0.480117482130239,0.487248847812155,0.483273079361936,0.485677216971182,0.489294679833232,0.0101395585316142,0.0362325252142946,0.0861839052101131,0.0133578095310756,0.012207072995257,0.0674155229536858,0.0819639439416297,0.0125529782251095,0.0635119127654791,0.0654701624803801,0.0736595359310803, +0.0817591007055068,0.200547566690442,0.463088256798349,0.470820895239057,0.212898750597653,0.228442344062702,0.47510640145305,0.23822748732399,0.459698206175574 + } + Transform: *16 { + a: 11.5897041187686,9.65036727093747e-16,-1.47472715014967e-15,0,-5.38276964884747e-16,6.46449050260551,7.83527716420458e-16,0,1.02550174192963e-15,-9.76825835128967e-16,8.05929541680987,0,-18.1504962423072,-12.4384914564286,8.01946742791222e-16,1 + } + TransformLink: *16 { + a: 1,-8.32667268468867e-17,1.27244590115244e-16,0,8.32667268468868e-17,1,-1.21204867747065e-16,0,-1.27244590115244e-16,1.21204867747065e-16,1,0,18.1504962423072,12.4384914564286,1.97215226305253e-30,1 + } + } + AnimationStack: 2092003096320, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2091388422608, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091388430288, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: -0.09838355 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091388427088, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: -0.2108219 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091388429488, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091388427728, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091388430448, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091388427248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091388432368, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091388430608, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091388423248, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091388423088, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Constant|ConstantStandard + KeyAttrFlags: *2 { + a: 2,2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311060016, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 5.903281,5.903281 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311055696, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: -1.242062e-15,-1.242062e-15 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311058736, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: -1.525337e-31,-1.525337e-31 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311052176, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311057616, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311056976, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311057776, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 86.51003,-95.0359 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311058416, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311058096, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311059056, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311053456, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 6.718426 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311060816, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: -5.461603e-14 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311050896, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 9.507237e-19 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311053136, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311060656, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311051856, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311053616, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311054416, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311051696, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311054256, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Constant|ConstantStandard + KeyAttrFlags: *2 { + a: 2,2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311055056, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 5.035462,5.035462 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311055216, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: -3.053113e-15,-3.053113e-15 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311065776, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: -6.163967e-16,-6.163967e-16 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311062416, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311062576, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311068816, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311065936, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 0,167.7964 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311067376, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311077616, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311051376, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Constant|ConstantStandard + KeyAttrFlags: *2 { + a: 2,2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311072176, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 7.477202,7.477202 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311077776, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: -1.413453e-14,-1.413453e-14 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311074256, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: -9.480198e-16,-9.480198e-16 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311074416, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311074736, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311087376, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311088976, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311091376, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311089136, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 0,142.3507 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2091311080336, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311081616, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 5.855811 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311085776, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: -0.02389647 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311083696, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: -7.685548e-16 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311089616, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311091536, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311083856, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311082416, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311084016, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 2091311085136, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurveNode: 2092003076352, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2092003081136, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2092003088000, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2092003090288, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2092003091744, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2092003092160, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2092003084464, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2092003092576, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-0.0983835482429377 + P: "d|Y", "Number", "", "A",-0.21082188909201 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2092003087168, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2092003084048, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2092003084256, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2092003096528, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",5.9032805988414 + P: "d|Y", "Number", "", "A",-1.24206200879939e-15 + P: "d|Z", "Number", "", "A",-1.52533651595469e-31 + } + } + AnimationCurveNode: 2092003092992, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2092003090704, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",86.5100284619626 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2092003084672, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2092003095280, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",6.71842608826867 + P: "d|Y", "Number", "", "A",-5.46160339176538e-14 + P: "d|Z", "Number", "", "A",9.50723639603367e-19 + } + } + AnimationCurveNode: 2092003085088, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2092003094032, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2092003084880, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2092003095696, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",5.03546168449893 + P: "d|Y", "Number", "", "A",-3.05311331771918e-15 + P: "d|Z", "Number", "", "A",-6.16396754200832e-16 + } + } + AnimationCurveNode: 2092003088208, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2092003091952, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2092003088624, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2092003093200, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",7.4772025038428 + P: "d|Y", "Number", "", "A",-1.4134526882259e-14 + P: "d|Z", "Number", "", "A",-9.48019825981377e-16 + } + } + AnimationCurveNode: 2092003093408, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2092003091120, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2092003091536, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2092003093824, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",5.85581074617959 + P: "d|Y", "Number", "", "A",-0.0238964688271248 + P: "d|Z", "Number", "", "A",-7.68554800865196e-16 + } + } + AnimationCurveNode: 2092003109424, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2092003106720, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2093627114384, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2090157687952,0 + + ;Model::joint1, Model::RootNode + C: "OO",2090157727392,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2093627114384,2092003096320 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2092003076352,2093627114384 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2092003081136,2093627114384 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2092003088000,2093627114384 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2092003090288,2093627114384 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2092003091744,2093627114384 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2092003092160,2093627114384 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2092003084464,2093627114384 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2092003092576,2093627114384 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2092003087168,2093627114384 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2092003084048,2093627114384 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2092003084256,2093627114384 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2092003096528,2093627114384 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2092003092992,2093627114384 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2092003090704,2093627114384 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2092003084672,2093627114384 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2092003095280,2093627114384 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2092003085088,2093627114384 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2092003094032,2093627114384 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2092003084880,2093627114384 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2092003095696,2093627114384 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2092003088208,2093627114384 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2092003091952,2093627114384 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2092003088624,2093627114384 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2092003093200,2093627114384 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2092003093408,2093627114384 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2092003091120,2093627114384 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2092003091536,2093627114384 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2092003093824,2093627114384 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2092003109424,2093627114384 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2092003106720,2093627114384 + + ;Deformer::, Geometry:: + C: "OO",2091426237056,2091970014944 + + ;Geometry::, Model::pCube1 + C: "OO",2091970014944,2090157687952 + + ;Material::lambert1, Model::pCube1 + C: "OO",2092279128160,2090157687952 + + ;NodeAttribute::, Model::joint1 + C: "OO",2091468415152,2090157727392 + + ;Model::joint2, Model::joint1 + C: "OO",2090157729712,2090157727392 + + ;AnimCurveNode::T, Model::joint1 + C: "OP",2092003092576,2090157727392, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint1 + C: "OP",2092003084048,2090157727392, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint1 + C: "OP",2092003087168,2090157727392, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint1 + C: "OP",2092003084464,2090157727392, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",2092003076352,2090157727392, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint2 + C: "OO",2091468418992,2090157729712 + + ;Model::joint3, Model::joint2 + C: "OO",2090157725072,2090157729712 + + ;AnimCurveNode::T, Model::joint2 + C: "OP",2092003096528,2090157729712, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint2 + C: "OP",2092003090704,2090157729712, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint2 + C: "OP",2092003092992,2090157729712, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint2 + C: "OP",2092003084256,2090157729712, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",2092003081136,2090157729712, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint3 + C: "OO",2091468423792,2090157725072 + + ;Model::joint4, Model::joint3 + C: "OO",2090157732032,2090157725072 + + ;AnimCurveNode::T, Model::joint3 + C: "OP",2092003095280,2090157725072, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint3 + C: "OP",2092003094032,2090157725072, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint3 + C: "OP",2092003085088,2090157725072, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint3 + C: "OP",2092003084672,2090157725072, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",2092003088000,2090157725072, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint4 + C: "OO",2091468425520,2090157732032 + + ;Model::joint5, Model::joint4 + C: "OO",2090157701872,2090157732032 + + ;AnimCurveNode::T, Model::joint4 + C: "OP",2092003095696,2090157732032, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint4 + C: "OP",2092003091952,2090157732032, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint4 + C: "OP",2092003088208,2090157732032, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint4 + C: "OP",2092003084880,2090157732032, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint4 + C: "OP",2092003090288,2090157732032, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint5 + C: "OO",2091468422640,2090157701872 + + ;Model::joint6, Model::joint5 + C: "OO",2090157704192,2090157701872 + + ;AnimCurveNode::T, Model::joint5 + C: "OP",2092003093200,2090157701872, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint5 + C: "OP",2092003091120,2090157701872, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint5 + C: "OP",2092003093408,2090157701872, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint5 + C: "OP",2092003088624,2090157701872, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint5 + C: "OP",2092003091744,2090157701872, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint6 + C: "OO",2091468425712,2090157704192 + + ;AnimCurveNode::T, Model::joint6 + C: "OP",2092003093824,2090157704192, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint6 + C: "OP",2092003106720,2090157704192, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint6 + C: "OP",2092003109424,2090157704192, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint6 + C: "OP",2092003091536,2090157704192, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint6 + C: "OP",2092003092160,2090157704192, "lockInfluenceWeights" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2091388422608,2092003084464, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091388430288,2092003092576, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091388427088,2092003092576, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091388429488,2092003092576, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091388427728,2092003087168, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091388430448,2092003087168, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091388427248,2092003087168, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091388432368,2092003084048, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091388430608,2092003084048, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091388423248,2092003084048, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2091388423088,2092003084256, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311060016,2092003096528, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311055696,2092003096528, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311058736,2092003096528, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311052176,2092003092992, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311057616,2092003092992, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311056976,2092003092992, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311057776,2092003090704, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311058416,2092003090704, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311058096,2092003090704, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2091311059056,2092003084672, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311053456,2092003095280, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311060816,2092003095280, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311050896,2092003095280, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311053136,2092003085088, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311060656,2092003085088, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311051856,2092003085088, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311053616,2092003094032, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311054416,2092003094032, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311051696,2092003094032, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2091311054256,2092003084880, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311055056,2092003095696, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311055216,2092003095696, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311065776,2092003095696, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311062416,2092003088208, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311062576,2092003088208, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311068816,2092003088208, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311065936,2092003091952, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311067376,2092003091952, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311077616,2092003091952, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2091311051376,2092003088624, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311072176,2092003093200, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311077776,2092003093200, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311074256,2092003093200, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311074416,2092003093408, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311074736,2092003093408, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311087376,2092003093408, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311088976,2092003091120, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311091376,2092003091120, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311089136,2092003091120, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2091311080336,2092003091536, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311081616,2092003093824, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311085776,2092003093824, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2091311083696,2092003093824, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311089616,2092003109424, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311091536,2092003109424, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2091311083856,2092003109424, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311082416,2092003106720, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311084016,2092003106720, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2091311085136,2092003106720, "d|Z" + + ;SubDeformer::, Deformer:: + C: "OO",2089569466656,2091426237056 + + ;SubDeformer::, Deformer:: + C: "OO",2089569461504,2091426237056 + + ;SubDeformer::, Deformer:: + C: "OO",2089569462240,2091426237056 + + ;SubDeformer::, Deformer:: + C: "OO",2089569462976,2091426237056 + + ;SubDeformer::, Deformer:: + C: "OO",2089569463712,2091426237056 + + ;SubDeformer::, Deformer:: + C: "OO",2089569468128,2091426237056 + + ;Model::joint1, SubDeformer:: + C: "OO",2090157727392,2089569466656 + + ;Model::joint2, SubDeformer:: + C: "OO",2090157729712,2089569461504 + + ;Model::joint3, SubDeformer:: + C: "OO",2090157725072,2089569462240 + + ;Model::joint4, SubDeformer:: + C: "OO",2090157732032,2089569462976 + + ;Model::joint5, SubDeformer:: + C: "OO",2090157701872,2089569463712 + + ;Model::joint6, SubDeformer:: + C: "OO",2090157704192,2089569468128 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_dq_weights_7500_binary.fbx b/modules/ufbx/data/maya_dq_weights_7500_binary.fbx new file mode 100644 index 0000000..de00d39 Binary files /dev/null and b/modules/ufbx/data/maya_dq_weights_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_dual_quaternion.obj b/modules/ufbx/data/maya_dual_quaternion.obj new file mode 100644 index 0000000..1c8e62c --- /dev/null +++ b/modules/ufbx/data/maya_dual_quaternion.obj @@ -0,0 +1,262 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_dual_quaternion.mtl +g default +v -0.496327 -2.000000 0.506701 +v 0.503650 -2.000000 0.499988 +v -0.496327 -1.600000 0.506701 +v 0.503650 -1.600000 0.499988 +v -0.487032 -1.200000 0.523200 +v 0.512696 -1.200000 0.499852 +v -0.442050 -0.800000 0.595160 +v 0.553159 -0.800000 0.497395 +v -0.198134 -0.400000 0.855292 +v 0.717987 -0.400000 0.454392 +v 0.954520 -0.000000 0.999841 +v 1.041675 -0.000000 0.003646 +v 1.633764 0.400000 0.057433 +v 0.801176 0.400000 -0.496459 +v 1.609433 0.800000 -0.298336 +v 0.646319 0.800000 -0.567432 +v 1.587382 1.200000 -0.380283 +v 0.606897 1.200000 -0.576877 +v 1.581633 1.600000 -0.398326 +v 0.598013 1.600000 -0.578582 +v 1.581633 2.000000 -0.398326 +v 0.598013 2.000000 -0.578582 +v 1.401377 2.000000 0.585293 +v 0.417757 2.000000 0.405038 +v 1.401377 1.600000 0.585293 +v 0.417757 1.600000 0.405038 +v 1.390787 1.200000 0.600202 +v 0.410303 1.200000 0.403607 +v 1.340337 0.800000 0.664777 +v 0.377223 0.800000 0.395682 +v 1.079871 0.400000 0.890021 +v 0.247283 0.400000 0.336129 +v -0.041675 0.000000 0.912685 +v 0.045481 0.000000 -0.083510 +v -0.599035 -0.400000 -0.060830 +v 0.317087 -0.400000 -0.461730 +v -0.539815 -0.800000 -0.400049 +v 0.455394 -0.800000 -0.497814 +v -0.510380 -1.200000 -0.476527 +v 0.489347 -1.200000 -0.499876 +v -0.503040 -1.600000 -0.493276 +v 0.496937 -1.600000 -0.499990 +v -0.503040 -2.000000 -0.493276 +v 0.496937 -2.000000 -0.499990 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.025000 +vt 0.625000 0.025000 +vt 0.375000 0.050000 +vt 0.625000 0.050000 +vt 0.375000 0.075000 +vt 0.625000 0.075000 +vt 0.375000 0.100000 +vt 0.625000 0.100000 +vt 0.375000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.150000 +vt 0.625000 0.150000 +vt 0.375000 0.175000 +vt 0.625000 0.175000 +vt 0.375000 0.200000 +vt 0.625000 0.200000 +vt 0.375000 0.225000 +vt 0.625000 0.225000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.525000 +vt 0.625000 0.525000 +vt 0.375000 0.550000 +vt 0.625000 0.550000 +vt 0.375000 0.575000 +vt 0.625000 0.575000 +vt 0.375000 0.600000 +vt 0.625000 0.600000 +vt 0.375000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.650000 +vt 0.625000 0.650000 +vt 0.375000 0.675000 +vt 0.625000 0.675000 +vt 0.375000 0.700000 +vt 0.625000 0.700000 +vt 0.375000 0.725000 +vt 0.625000 0.725000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.025000 +vt 0.875000 0.050000 +vt 0.875000 0.075000 +vt 0.875000 0.100000 +vt 0.875000 0.125000 +vt 0.875000 0.150000 +vt 0.875000 0.175000 +vt 0.875000 0.200000 +vt 0.875000 0.225000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.025000 +vt 0.125000 0.050000 +vt 0.125000 0.075000 +vt 0.125000 0.100000 +vt 0.125000 0.125000 +vt 0.125000 0.150000 +vt 0.125000 0.175000 +vt 0.125000 0.200000 +vt 0.125000 0.225000 +vt 0.125000 0.250000 +vn 0.006713 0.000000 0.999978 +vn 0.006713 0.000000 0.999978 +vn 0.010902 -0.010472 0.999886 +vn 0.010841 -0.010321 0.999888 +vn 0.038626 -0.058287 0.997552 +vn 0.036805 -0.055392 0.997786 +vn 0.164997 -0.255608 0.952597 +vn 0.136121 -0.210682 0.968031 +vn 0.452922 -0.710017 0.539201 +vn 0.338731 -0.528677 0.778307 +vn 0.563623 -0.818375 -0.112212 +vn 0.539350 -0.821141 0.186625 +vn 0.476659 -0.546236 -0.688784 +vn 0.529170 -0.677313 -0.511103 +vn 0.302632 -0.211513 -0.929342 +vn 0.324547 -0.249691 -0.912318 +vn 0.209545 -0.055451 -0.976226 +vn 0.211209 -0.058199 -0.975707 +vn 0.184306 -0.010322 -0.982815 +vn 0.184364 -0.010471 -0.982802 +vn 0.180256 0.000000 -0.983620 +vn 0.180256 0.000000 -0.983620 +vn 0.000000 1.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +vn -0.180256 0.000000 0.983620 +vn -0.180256 0.000000 0.983620 +vn -0.184360 0.010460 0.982803 +vn -0.184310 0.010333 0.982814 +vn -0.211131 0.058070 0.975731 +vn -0.209652 0.055627 0.976193 +vn -0.326355 0.252872 0.910796 +vn -0.304160 0.214152 0.928238 +vn -0.538035 0.704597 0.462667 +vn -0.475042 0.542621 0.692746 +vn -0.537755 0.819999 -0.196014 +vn -0.563282 0.823226 0.070792 +vn -0.357379 0.558232 -0.748771 +vn -0.427373 0.669351 -0.607718 +vn -0.139212 0.215491 -0.966532 +vn -0.159529 0.247099 -0.955768 +vn -0.036991 0.055689 -0.997763 +vn -0.038435 0.057984 -0.997577 +vn -0.010847 0.010334 -0.999888 +vn -0.010896 0.010459 -0.999886 +vn -0.006713 0.000000 -0.999977 +vn -0.006713 0.000000 -0.999977 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.999977 0.000000 -0.006713 +vn 0.999977 0.000000 -0.006713 +vn 0.999941 -0.000910 -0.010872 +vn 0.999941 -0.000910 -0.010872 +vn 0.999273 -0.004983 -0.037795 +vn 0.999273 -0.004983 -0.037791 +vn 0.987672 -0.021016 -0.155120 +vn 0.987713 -0.020980 -0.154862 +vn 0.860143 -0.069167 -0.505341 +vn 0.861868 -0.068768 -0.502449 +vn 0.086431 -0.128699 -0.987910 +vn 0.086431 -0.128699 -0.987910 +vn -0.759324 -0.069167 -0.647026 +vn -0.761525 -0.068768 -0.644477 +vn -0.945731 -0.021016 -0.324270 +vn -0.945816 -0.020981 -0.324024 +vn -0.977529 -0.004984 -0.210743 +vn -0.977530 -0.004983 -0.210739 +vn -0.982861 -0.000910 -0.184345 +vn -0.982861 -0.000910 -0.184345 +vn -0.983620 0.000000 -0.180256 +vn -0.983620 0.000000 -0.180256 +vn -0.999977 0.000000 0.006713 +vn -0.999977 0.000000 0.006713 +vn -0.999940 0.000922 0.010926 +vn -0.999941 0.000897 0.010816 +vn -0.999212 0.005200 0.039354 +vn -0.999338 0.004745 0.036082 +vn -0.983912 0.023998 0.177034 +vn -0.991974 0.016958 0.125303 +vn -0.746569 0.090421 0.659135 +vn -0.942273 0.045206 0.331780 +vn 0.310478 0.118426 0.943175 +vn -0.465067 0.118680 0.877284 +vn 0.872588 0.044616 0.486415 +vn 0.616873 0.090928 0.781793 +vn 0.955111 0.016973 0.295761 +vn 0.938081 0.024052 0.345581 +vn 0.977890 0.004745 0.209065 +vn 0.977197 0.005201 0.212273 +vn 0.982872 0.000897 0.184290 +vn 0.982851 0.000921 0.184398 +vn 0.983620 0.000000 0.180256 +vn 0.983620 0.000000 0.180256 +s 1 +g pCube1 +usemtl initialShadingGroup +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/4 4/4/3 6/6/5 5/5/6 +f 5/5/6 6/6/5 8/8/7 7/7/8 +f 7/7/8 8/8/7 10/10/9 9/9/10 +f 9/9/10 10/10/9 12/12/11 11/11/12 +f 11/11/12 12/12/11 14/14/13 13/13/14 +f 13/13/14 14/14/13 16/16/15 15/15/16 +f 15/15/16 16/16/15 18/18/17 17/17/18 +f 17/17/18 18/18/17 20/20/19 19/19/20 +f 19/19/20 20/20/19 22/22/21 21/21/22 +s off +f 21/21/23 22/22/24 24/24/25 23/23/26 +s 2 +f 23/23/27 24/24/28 26/26/29 25/25/30 +f 25/25/30 26/26/29 28/28/31 27/27/32 +f 27/27/32 28/28/31 30/30/33 29/29/34 +f 29/29/34 30/30/33 32/32/35 31/31/36 +f 31/31/36 32/32/35 34/34/37 33/33/38 +f 33/33/38 34/34/37 36/36/39 35/35/40 +f 35/35/40 36/36/39 38/38/41 37/37/42 +f 37/37/42 38/38/41 40/40/43 39/39/44 +f 39/39/44 40/40/43 42/42/45 41/41/46 +f 41/41/46 42/42/45 44/44/47 43/43/48 +s off +f 43/43/49 44/44/50 2/46/51 1/45/52 +s 3 +f 2/2/53 44/47/54 42/48/55 4/4/56 +f 4/4/56 42/48/55 40/49/57 6/6/58 +f 6/6/58 40/49/57 38/50/59 8/8/60 +f 8/8/60 38/50/59 36/51/61 10/10/62 +f 10/10/62 36/51/61 34/52/63 12/12/64 +f 12/12/64 34/52/63 32/53/65 14/14/66 +f 14/14/66 32/53/65 30/54/67 16/16/68 +f 16/16/68 30/54/67 28/55/69 18/18/70 +f 18/18/70 28/55/69 26/56/71 20/20/72 +f 20/20/72 26/56/71 24/57/73 22/22/74 +s 4 +f 43/58/75 1/1/76 3/3/77 41/59/78 +f 41/59/78 3/3/77 5/5/79 39/60/80 +f 39/60/80 5/5/79 7/7/81 37/61/82 +f 37/61/82 7/7/81 9/9/83 35/62/84 +f 35/62/84 9/9/83 11/11/85 33/63/86 +f 33/63/86 11/11/85 13/13/87 31/64/88 +f 31/64/88 13/13/87 15/15/89 29/65/90 +f 29/65/90 15/15/89 17/17/91 27/66/92 +f 27/66/92 17/17/91 19/19/93 25/67/94 +f 25/67/94 19/19/93 21/21/95 23/68/96 diff --git a/modules/ufbx/data/maya_dual_quaternion_7500_ascii.fbx b/modules/ufbx/data/maya_dual_quaternion_7500_ascii.fbx new file mode 100644 index 0000000..4eb3fb6 --- /dev/null +++ b/modules/ufbx/data/maya_dual_quaternion_7500_ascii.fbx @@ -0,0 +1,591 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 15 + Hour: 22 + Minute: 58 + Second: 42 + Millisecond: 338 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_dual_quaternion_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_dual_quaternion_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "15/08/2021 19:58:42.337" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_dual_quaternion_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "15/08/2021 19:58:42.337" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2258578357360, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 19 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 4 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 3 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 3 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 3 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2259119305632, "Geometry::", "Mesh" { + Vertices: *132 { + a: -0.5,-2,0.5,0.5,-2,0.5,-0.5,-1.60000002384186,0.5,0.5,-1.60000002384186,0.5,-0.5,-1.20000004768372,0.5,0.5,-1.20000004768372,0.5,-0.5,-0.800000071525574,0.5,0.5,-0.800000071525574,0.5,-0.5,-0.400000065565109,0.5,0.5,-0.400000065565109,0.5,-0.5,-5.96046447753906e-08,0.5,0.5,-5.96046447753906e-08,0.5,-0.5,0.39999994635582,0.5,0.5,0.39999994635582,0.5,-0.5,0.799999952316284,0.5,0.5,0.799999952316284,0.5,-0.5,1.19999992847443,0.5,0.5,1.19999992847443,0.5,-0.5,1.59999990463257,0.5,0.5,1.59999990463257,0.5,-0.5,2,0.5,0.5,2,0.5,-0.5,2,-0.5,0.5,2,-0.5,-0.5,1.60000002384186,-0.5,0.5,1.60000002384186,-0.5,-0.5,1.20000004768372,-0.5,0.5,1.20000004768372,-0.5,-0.5,0.800000071525574,-0.5,0.5,0.800000071525574,-0.5,-0.5,0.400000065565109,-0.5,0.5,0.400000065565109,-0.5,-0.5,5.96046447753906e-08,-0.5,0.5,5.96046447753906e-08,-0.5,-0.5,-0.39999994635582,-0.5,0.5,-0.39999994635582,-0.5,-0.5,-0.799999952316284,-0.5,0.5,-0.799999952316284,-0.5,-0.5,-1.19999992847443,-0.5,0.5,-1.19999992847443,-0.5,-0.5,-1.59999990463257,-0.5,0.5,-1.59999990463257,-0.5,-0.5,-2,-0.5,0.5,-2,-0.5 + } + PolygonVertexIndex: *168 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,9,-9,8,9,11,-11,10,11,13,-13,12,13,15,-15,14,15,17,-17,16,17,19,-19,18,19,21,-21,20,21,23,-23,22,23,25,-25,24,25,27,-27,26,27,29,-29,28,29,31,-31,30,31,33,-33,32,33,35,-35,34,35,37,-37,36,37,39,-39,38,39,41,-41,40,41,43,-43,42,43,1,-1,1,43,41,-4,3,41,39,-6,5,39,37,-8,7,37,35,-10,9,35,33,-12,11,33,31,-14,13,31,29,-16,15,29,27,-18,17,27,25,-20,19,25,23,-22,42,0,2,-41,40,2,4,-39,38,4,6,-37,36,6,8,-35,34,8,10,-33,32,10,12,-31,30,12,14,-29,28,14,16,-27,26,16,18,-25,24,18,20,-23 + } + Edges: *84 { + a: 0,2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,3,1,7,5,11,9,15,13,19,17,23,21,27,25,31,29,35,33,39,37,43,41,47,45,51,49,55,53,59,57,63,61,67,65,71,69,75,73,79,77,83,81,87,85,90,94,98,102,106,110,114,118,122,130,134,138,142,146,150,154,158,162 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *504 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *168 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *136 { + a: 0.375,0,0.625,0,0.375,0.025000000372529,0.625,0.025000000372529,0.375,0.0500000007450581,0.625,0.0500000007450581,0.375,0.0750000029802322,0.625,0.0750000029802322,0.375,0.100000001490116,0.625,0.100000001490116,0.375,0.125,0.625,0.125,0.375,0.150000005960464,0.625,0.150000005960464,0.375,0.175000011920929,0.625,0.175000011920929,0.375,0.200000017881393,0.625,0.200000017881393,0.375,0.225000023841858,0.625,0.225000023841858,0.375,0.250000029802322,0.625,0.250000029802322,0.375,0.5,0.625,0.5,0.375,0.524999976158142,0.625,0.524999976158142,0.375,0.549999952316284,0.625,0.549999952316284,0.375,0.574999928474426,0.625,0.574999928474426,0.375,0.599999904632568,0.625,0.599999904632568,0.375,0.62499988079071,0.625,0.62499988079071,0.375,0.649999856948853,0.625,0.649999856948853,0.375,0.674999833106995,0.625,0.674999833106995,0.375,0.699999809265137,0.625,0.699999809265137,0.375,0.724999785423279,0.625,0.724999785423279,0.375,0.749999761581421,0.625,0.749999761581421,0.375,0.999999761581421,0.625,0.999999761581421,0.875,0,0.875,0.025000000372529,0.875,0.0500000007450581,0.875,0.0750000029802322,0.875,0.100000001490116,0.875,0.125,0.875,0.150000005960464,0.875,0.175000011920929,0.875,0.200000017881393,0.875,0.225000023841858,0.875,0.250000029802322,0.125,0,0.125,0.025000000372529,0.125,0.0500000007450581,0.125,0.0750000029802322,0.125,0.100000001490116,0.125,0.125,0.125,0.150000005960464,0.125,0.175000011920929,0.125,0.200000017881393,0.125,0.225000023841858,0.125,0.250000029802322 + } + UVIndex: *168 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,8,9,11,10,10,11,13,12,12,13,15,14,14,15,17,16,16,17,19,18,18,19,21,20,20,21,23,22,22,23,25,24,24,25,27,26,26,27,29,28,28,29,31,30,30,31,33,32,32,33,35,34,34,35,37,36,36,37,39,38,38,39,41,40,40,41,43,42,42,43,45,44,1,46,47,3,3,47,48,5,5,48,49,7,7,49,50,9,9,50,51,11,11,51,52,13,13,52,53,15,15,53,54,17,17,54,55,19,19,55,56,21,57,0,2,58,58,2,4,59,59,4,6,60,60,6,8,61,61,8,10,62,62,10,12,63,63,12,14,64,64,14,16,65,65,16,18,66,66,18,20,67 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2255454038848, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",18.3908045977012 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2255454043840, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",18.3908045977012 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2255454040192, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",18.3908045977012 + } + TypeFlags: "Skeleton" + } + Model: 2256094539888, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2256094537568, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,-2,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2256094532928, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,-1,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",170,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2256094523648, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 2256168414880, "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 3 + PoseNode: { + Node: 2256094539888 + Matrix: *16 { + a: 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 2256094537568 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,-2,0,1 + } + } + PoseNode: { + Node: 2256094532928 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + } + Material: 2256094207216, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2256168415760, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "DualQuaternion" + } + Deformer: 2259698727088, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *44 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43 + } + Weights: *44 { + a: 0.996640787441516,0.99664078757101,0.996640787551029,0.99664078775304,0.988403631958435,0.988403632378423,0.952926638928621,0.952926640607189,0.823763779214635,0.823763784794747,0.499999986644694,0.499999986380779,0.176236299345892,0.176236289561308,0.0470733747306146,0.0470733717665865,0.0115963753812439,0.0115963741054561,0.00335921314763779,0.00335921303421446,0.00335921311275215,0.00335921304004493,0.00335921306086784,0.00335921298816079,0.00335921306669821,0.00335921295327524,0.0115963685510642,0.0115963672752786,0.0470733473432489,0.0470733443792254,0.176236215522909,0.176236205738331,0.500000005917051,0.500000005653138,0.823763737358751,0.823763742938864,0.952926624896244,0.952926626574813,0.988403628212988,0.988403628632977,0.996640786738869,0.996640786940881,0.9966407869209,0.996640787050394 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1,6.12323399573677e-17,0,0,0,0,1,0,2,1.22464679914735e-16,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,-2,0,1 + } + } + Deformer: 2259698722672, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *44 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43 + } + Weights: *44 { + a: 0.00335921255848459,0.00335921242899025,0.00335921244897072,0.00335921224695957,0.0115963680415656,0.0115963676215773,0.0470733610713789,0.0470733593928108,0.176236220785365,0.176236215205253,0.500000013355306,0.500000013619221,0.823763700654108,0.823763710438692,0.952926625269385,0.952926628233413,0.988403624618756,0.988403625894544,0.996640786852362,0.996640786965786,0.996640786887248,0.996640786959955,0.996640786939132,0.996640787011839,0.996640786933302,0.996640787046725,0.988403631448936,0.988403632724722,0.952926652656751,0.952926655620774,0.823763784477091,0.823763794261669,0.499999994082949,0.499999994346862,0.17623626264125,0.176236257061136,0.0470733751037565,0.0470733734251872,0.0115963717870119,0.0115963713670232,0.00335921326113073,0.00335921305911941,0.00335921307909994,0.00335921294960553 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1,6.12323399573677e-17,0,0,0,0,1,0,0,0,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + } + AnimationStack: 2256158931680, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurveNode: 2256158933760, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2256158931888, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2256158934384, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationLayer: 2259998362976, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2256094539888,0 + + ;Model::joint1, Model::RootNode + C: "OO",2256094537568,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2259998362976,2256158931680 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2256158933760,2259998362976 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2256158931888,2259998362976 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2256158934384,2259998362976 + + ;Deformer::, Geometry:: + C: "OO",2256168415760,2259119305632 + + ;Geometry::, Model::pCube1 + C: "OO",2259119305632,2256094539888 + + ;Material::lambert1, Model::pCube1 + C: "OO",2256094207216,2256094539888 + + ;NodeAttribute::, Model::joint1 + C: "OO",2255454038848,2256094537568 + + ;Model::joint2, Model::joint1 + C: "OO",2256094532928,2256094537568 + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",2256158933760,2256094537568, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint2 + C: "OO",2255454043840,2256094532928 + + ;Model::joint3, Model::joint2 + C: "OO",2256094523648,2256094532928 + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",2256158931888,2256094532928, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint3 + C: "OO",2255454040192,2256094523648 + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",2256158934384,2256094523648, "lockInfluenceWeights" + + ;SubDeformer::, Deformer:: + C: "OO",2259698727088,2256168415760 + + ;SubDeformer::, Deformer:: + C: "OO",2259698722672,2256168415760 + + ;Model::joint1, SubDeformer:: + C: "OO",2256094537568,2259698727088 + + ;Model::joint2, SubDeformer:: + C: "OO",2256094532928,2259698722672 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_dual_quaternion_scale.obj b/modules/ufbx/data/maya_dual_quaternion_scale.obj new file mode 100644 index 0000000..d91169e --- /dev/null +++ b/modules/ufbx/data/maya_dual_quaternion_scale.obj @@ -0,0 +1,260 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -0.495476 -2.000000 0.508375 +v 0.502822 -2.000000 0.501673 +v -0.495476 -1.600000 0.508375 +v 0.502822 -1.600000 0.501673 +v -0.483998 -1.200000 0.528929 +v 0.509933 -1.200000 0.505716 +v -0.428037 -0.800000 0.617433 +v 0.543748 -0.800000 0.521970 +v -0.122444 -0.400000 0.918356 +v 0.712950 -0.400000 0.552782 +v 1.214463 -0.000000 0.897105 +v 1.279830 -0.000000 0.149959 +v 1.690439 0.400000 -0.399564 +v 1.200778 0.400000 -0.725318 +v 1.508203 0.800000 -0.821331 +v 1.003978 0.800000 -0.962213 +v 1.442261 1.200000 -0.913419 +v 0.946333 1.200000 -1.012856 +v 1.426379 1.600000 -0.933397 +v 0.932917 1.600000 -1.023827 +v 1.426379 2.000000 -0.933397 +v 0.932917 2.000000 -1.023827 +v 1.066473 2.000000 1.030539 +v 0.573011 2.000000 0.940108 +v 1.066473 1.600000 1.030539 +v 0.573011 1.600000 0.940108 +v 1.051351 1.200000 1.036181 +v 0.555424 1.200000 0.936744 +v 0.982678 0.800000 1.059559 +v 0.478453 0.800000 0.918677 +v 0.680269 0.400000 1.118880 +v 0.190609 0.400000 0.793126 +v -0.279829 0.000000 0.766372 +v -0.214463 0.000000 0.019226 +v -0.593998 -0.400000 -0.159220 +v 0.241397 -0.400000 -0.524794 +v -0.530404 -0.800000 -0.424624 +v 0.441381 -0.800000 -0.520088 +v -0.507617 -1.200000 -0.482391 +v 0.486313 -1.200000 -0.505605 +v -0.502212 -1.600000 -0.494962 +v 0.496086 -1.600000 -0.501664 +v -0.502212 -2.000000 -0.494962 +v 0.496086 -2.000000 -0.501664 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.025000 +vt 0.625000 0.025000 +vt 0.375000 0.050000 +vt 0.625000 0.050000 +vt 0.375000 0.075000 +vt 0.625000 0.075000 +vt 0.375000 0.100000 +vt 0.625000 0.100000 +vt 0.375000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.150000 +vt 0.625000 0.150000 +vt 0.375000 0.175000 +vt 0.625000 0.175000 +vt 0.375000 0.200000 +vt 0.625000 0.200000 +vt 0.375000 0.225000 +vt 0.625000 0.225000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.525000 +vt 0.625000 0.525000 +vt 0.375000 0.550000 +vt 0.625000 0.550000 +vt 0.375000 0.575000 +vt 0.625000 0.575000 +vt 0.375000 0.600000 +vt 0.625000 0.600000 +vt 0.375000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.650000 +vt 0.625000 0.650000 +vt 0.375000 0.675000 +vt 0.625000 0.675000 +vt 0.375000 0.700000 +vt 0.625000 0.700000 +vt 0.375000 0.725000 +vt 0.625000 0.725000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.025000 +vt 0.875000 0.050000 +vt 0.875000 0.075000 +vt 0.875000 0.100000 +vt 0.875000 0.125000 +vt 0.875000 0.150000 +vt 0.875000 0.175000 +vt 0.875000 0.200000 +vt 0.875000 0.225000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.025000 +vt 0.125000 0.050000 +vt 0.125000 0.075000 +vt 0.125000 0.100000 +vt 0.125000 0.125000 +vt 0.125000 0.150000 +vt 0.125000 0.175000 +vt 0.125000 0.200000 +vt 0.125000 0.225000 +vt 0.125000 0.250000 +vn 0.006713 0.000000 0.999977 +vn 0.006713 0.000000 0.999977 +vn 0.010881 -0.015615 0.999819 +vn 0.010821 -0.015387 0.999823 +vn 0.038088 -0.085353 0.995623 +vn 0.036220 -0.080958 0.996059 +vn 0.154586 -0.344589 0.925938 +vn 0.126217 -0.282311 0.950984 +vn 0.385361 -0.768804 0.510330 +vn 0.279364 -0.590722 0.756970 +vn 0.512536 -0.858006 -0.033652 +vn 0.452266 -0.850927 0.267168 +vn 0.465451 -0.663506 -0.585760 +vn 0.513083 -0.779167 -0.360063 +vn 0.297007 -0.285229 -0.911280 +vn 0.329522 -0.364094 -0.871121 +vn 0.209135 -0.080980 -0.974528 +vn 0.212211 -0.088481 -0.973210 +vn 0.184298 -0.015385 -0.982750 +vn 0.184409 -0.015809 -0.982722 +vn 0.180256 0.000000 -0.983620 +vn 0.180256 0.000000 -0.983620 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.180256 0.000000 0.983620 +vn -0.180256 0.000000 0.983620 +vn -0.184425 0.005335 0.982832 +vn -0.184322 0.005203 0.982852 +vn -0.212879 0.031339 0.976576 +vn -0.209837 0.028735 0.977314 +vn -0.351545 0.167556 0.921055 +vn -0.305920 0.121083 0.944326 +vn -0.626892 0.669849 0.397880 +vn -0.500956 0.379303 0.777928 +vn -0.585359 0.746006 -0.317537 +vn -0.642396 0.763484 0.066481 +vn -0.341468 0.379386 -0.859922 +vn -0.452948 0.554790 -0.697887 +vn -0.131887 0.119978 -0.983977 +vn -0.157547 0.145463 -0.976739 +vn -0.036501 0.028737 -0.998920 +vn -0.038024 0.030030 -0.998826 +vn -0.010827 0.005204 -0.999928 +vn -0.010877 0.005268 -0.999927 +vn -0.006713 0.000000 -0.999977 +vn -0.006713 0.000000 -0.999977 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.999978 0.000000 -0.006713 +vn 0.999978 0.000000 -0.006713 +vn 0.999939 0.001673 -0.010911 +vn 0.999939 0.001673 -0.010912 +vn 0.999210 0.008807 -0.038759 +vn 0.999209 0.008814 -0.038787 +vn 0.985206 0.031004 -0.168545 +vn 0.984905 0.031273 -0.170247 +vn 0.812401 0.065225 -0.579439 +vn 0.789232 0.066906 -0.610440 +vn -0.042719 0.095115 -0.994549 +vn -0.175103 0.094621 -0.979993 +vn -0.789309 0.064213 -0.610629 +vn -0.832818 0.058878 -0.550407 +vn -0.947372 0.029484 -0.318774 +vn -0.951174 0.027434 -0.307434 +vn -0.977572 0.008635 -0.210423 +vn -0.977742 0.008445 -0.209639 +vn -0.982863 0.001662 -0.184332 +vn -0.982868 0.001651 -0.184305 +vn -0.983620 0.000000 -0.180256 +vn -0.983620 0.000000 -0.180256 +vn -0.999977 0.000000 0.006713 +vn -0.999977 0.000000 0.006713 +vn -0.999934 0.003546 0.010965 +vn -0.999935 0.003455 0.010856 +vn -0.998995 0.019651 0.040284 +vn -0.999150 0.018039 0.037079 +vn -0.978960 0.078907 0.188179 +vn -0.988459 0.060074 0.139070 +vn -0.684815 0.120672 0.718656 +vn -0.920524 0.112504 0.374137 +vn 0.379965 0.163866 0.910371 +vn -0.325279 0.139311 0.935300 +vn 0.871531 0.118788 0.475735 +vn 0.705296 0.144864 0.693954 +vn 0.954034 0.057678 0.294096 +vn 0.940869 0.074109 0.330565 +vn 0.977809 0.017662 0.208754 +vn 0.977259 0.018951 0.211200 +vn 0.982868 0.003433 0.184276 +vn 0.982853 0.003503 0.184358 +vn 0.983620 0.000000 0.180256 +vn 0.983620 0.000000 0.180256 +s 1 +g pCube1 +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/4 4/4/3 6/6/5 5/5/6 +f 5/5/6 6/6/5 8/8/7 7/7/8 +f 7/7/8 8/8/7 10/10/9 9/9/10 +f 9/9/10 10/10/9 12/12/11 11/11/12 +f 11/11/12 12/12/11 14/14/13 13/13/14 +f 13/13/14 14/14/13 16/16/15 15/15/16 +f 15/15/16 16/16/15 18/18/17 17/17/18 +f 17/17/18 18/18/17 20/20/19 19/19/20 +f 19/19/20 20/20/19 22/22/21 21/21/22 +s off +f 21/21/23 22/22/24 24/24/25 23/23/26 +s 2 +f 23/23/27 24/24/28 26/26/29 25/25/30 +f 25/25/30 26/26/29 28/28/31 27/27/32 +f 27/27/32 28/28/31 30/30/33 29/29/34 +f 29/29/34 30/30/33 32/32/35 31/31/36 +f 31/31/36 32/32/35 34/34/37 33/33/38 +f 33/33/38 34/34/37 36/36/39 35/35/40 +f 35/35/40 36/36/39 38/38/41 37/37/42 +f 37/37/42 38/38/41 40/40/43 39/39/44 +f 39/39/44 40/40/43 42/42/45 41/41/46 +f 41/41/46 42/42/45 44/44/47 43/43/48 +s off +f 43/43/49 44/44/50 2/46/51 1/45/52 +s 3 +f 2/2/53 44/47/54 42/48/55 4/4/56 +f 4/4/56 42/48/55 40/49/57 6/6/58 +f 6/6/58 40/49/57 38/50/59 8/8/60 +f 8/8/60 38/50/59 36/51/61 10/10/62 +f 10/10/62 36/51/61 34/52/63 12/12/64 +f 12/12/64 34/52/63 32/53/65 14/14/66 +f 14/14/66 32/53/65 30/54/67 16/16/68 +f 16/16/68 30/54/67 28/55/69 18/18/70 +f 18/18/70 28/55/69 26/56/71 20/20/72 +f 20/20/72 26/56/71 24/57/73 22/22/74 +s 4 +f 43/58/75 1/1/76 3/3/77 41/59/78 +f 41/59/78 3/3/77 5/5/79 39/60/80 +f 39/60/80 5/5/79 7/7/81 37/61/82 +f 37/61/82 7/7/81 9/9/83 35/62/84 +f 35/62/84 9/9/83 11/11/85 33/63/86 +f 33/63/86 11/11/85 13/13/87 31/64/88 +f 31/64/88 13/13/87 15/15/89 29/65/90 +f 29/65/90 15/15/89 17/17/91 27/66/92 +f 27/66/92 17/17/91 19/19/93 25/67/94 +f 25/67/94 19/19/93 21/21/95 23/68/96 diff --git a/modules/ufbx/data/maya_dual_quaternion_scale_7500_ascii.fbx b/modules/ufbx/data/maya_dual_quaternion_scale_7500_ascii.fbx new file mode 100644 index 0000000..db5e82a --- /dev/null +++ b/modules/ufbx/data/maya_dual_quaternion_scale_7500_ascii.fbx @@ -0,0 +1,593 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 16 + Hour: 18 + Minute: 47 + Second: 36 + Millisecond: 250 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_dual_quaternion_scale_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_dual_quaternion_scale_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "16/08/2021 15:47:36.249" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_dual_quaternion_scale_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "16/08/2021 15:47:36.249" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\dual_quaternion.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 3081902606512, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 19 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 4 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 3 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 3 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 3 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 3081872526352, "Geometry::", "Mesh" { + Vertices: *132 { + a: -0.5,-2,0.5,0.5,-2,0.5,-0.5,-1.60000002384186,0.5,0.5,-1.60000002384186,0.5,-0.5,-1.20000004768372,0.5,0.5,-1.20000004768372,0.5,-0.5,-0.800000071525574,0.5,0.5,-0.800000071525574,0.5,-0.5,-0.400000065565109,0.5,0.5,-0.400000065565109,0.5,-0.5,-5.96046447753906e-08,0.5,0.5,-5.96046447753906e-08,0.5,-0.5,0.39999994635582,0.5,0.5,0.39999994635582,0.5,-0.5,0.799999952316284,0.5,0.5,0.799999952316284,0.5,-0.5,1.19999992847443,0.5,0.5,1.19999992847443,0.5,-0.5,1.59999990463257,0.5,0.5,1.59999990463257,0.5,-0.5,2,0.5,0.5,2,0.5,-0.5,2,-0.5,0.5,2,-0.5,-0.5,1.60000002384186,-0.5,0.5,1.60000002384186,-0.5,-0.5,1.20000004768372,-0.5,0.5,1.20000004768372,-0.5,-0.5,0.800000071525574,-0.5,0.5,0.800000071525574,-0.5,-0.5,0.400000065565109,-0.5,0.5,0.400000065565109,-0.5,-0.5,5.96046447753906e-08,-0.5,0.5,5.96046447753906e-08,-0.5,-0.5,-0.39999994635582,-0.5,0.5,-0.39999994635582,-0.5,-0.5,-0.799999952316284,-0.5,0.5,-0.799999952316284,-0.5,-0.5,-1.19999992847443,-0.5,0.5,-1.19999992847443,-0.5,-0.5,-1.59999990463257,-0.5,0.5,-1.59999990463257,-0.5,-0.5,-2,-0.5,0.5,-2,-0.5 + } + PolygonVertexIndex: *168 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,9,-9,8,9,11,-11,10,11,13,-13,12,13,15,-15,14,15,17,-17,16,17,19,-19,18,19,21,-21,20,21,23,-23,22,23,25,-25,24,25,27,-27,26,27,29,-29,28,29,31,-31,30,31,33,-33,32,33,35,-35,34,35,37,-37,36,37,39,-39,38,39,41,-41,40,41,43,-43,42,43,1,-1,1,43,41,-4,3,41,39,-6,5,39,37,-8,7,37,35,-10,9,35,33,-12,11,33,31,-14,13,31,29,-16,15,29,27,-18,17,27,25,-20,19,25,23,-22,42,0,2,-41,40,2,4,-39,38,4,6,-37,36,6,8,-35,34,8,10,-33,32,10,12,-31,30,12,14,-29,28,14,16,-27,26,16,18,-25,24,18,20,-23 + } + Edges: *84 { + a: 0,2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,3,1,7,5,11,9,15,13,19,17,23,21,27,25,31,29,35,33,39,37,43,41,47,45,51,49,55,53,59,57,63,61,67,65,71,69,75,73,79,77,83,81,87,85,90,94,98,102,106,110,114,118,122,130,134,138,142,146,150,154,158,162 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *504 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *168 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *136 { + a: 0.375,0,0.625,0,0.375,0.025000000372529,0.625,0.025000000372529,0.375,0.0500000007450581,0.625,0.0500000007450581,0.375,0.0750000029802322,0.625,0.0750000029802322,0.375,0.100000001490116,0.625,0.100000001490116,0.375,0.125,0.625,0.125,0.375,0.150000005960464,0.625,0.150000005960464,0.375,0.175000011920929,0.625,0.175000011920929,0.375,0.200000017881393,0.625,0.200000017881393,0.375,0.225000023841858,0.625,0.225000023841858,0.375,0.250000029802322,0.625,0.250000029802322,0.375,0.5,0.625,0.5,0.375,0.524999976158142,0.625,0.524999976158142,0.375,0.549999952316284,0.625,0.549999952316284,0.375,0.574999928474426,0.625,0.574999928474426,0.375,0.599999904632568,0.625,0.599999904632568,0.375,0.62499988079071,0.625,0.62499988079071,0.375,0.649999856948853,0.625,0.649999856948853,0.375,0.674999833106995,0.625,0.674999833106995,0.375,0.699999809265137,0.625,0.699999809265137,0.375,0.724999785423279,0.625,0.724999785423279,0.375,0.749999761581421,0.625,0.749999761581421,0.375,0.999999761581421,0.625,0.999999761581421,0.875,0,0.875,0.025000000372529,0.875,0.0500000007450581,0.875,0.0750000029802322,0.875,0.100000001490116,0.875,0.125,0.875,0.150000005960464,0.875,0.175000011920929,0.875,0.200000017881393,0.875,0.225000023841858,0.875,0.250000029802322,0.125,0,0.125,0.025000000372529,0.125,0.0500000007450581,0.125,0.0750000029802322,0.125,0.100000001490116,0.125,0.125,0.125,0.150000005960464,0.125,0.175000011920929,0.125,0.200000017881393,0.125,0.225000023841858,0.125,0.250000029802322 + } + UVIndex: *168 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,8,9,11,10,10,11,13,12,12,13,15,14,14,15,17,16,16,17,19,18,18,19,21,20,20,21,23,22,22,23,25,24,24,25,27,26,26,27,29,28,28,29,31,30,30,31,33,32,32,33,35,34,34,35,37,36,36,37,39,38,38,39,41,40,40,41,43,42,42,43,45,44,1,46,47,3,3,47,48,5,5,48,49,7,7,49,50,9,9,50,51,11,11,51,52,13,13,52,53,15,15,53,54,17,17,54,55,19,19,55,56,21,57,0,2,58,58,2,4,59,59,4,6,60,60,6,8,61,61,8,10,62,62,10,12,63,63,12,14,64,64,14,16,65,65,16,18,66,66,18,20,67 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 3081856171456, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",18.3908045977012 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 3081856170880, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",18.3908045977012 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 3081856171840, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",18.3908045977012 + } + TypeFlags: "Skeleton" + } + Model: 3081435974800, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 3081435956240, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,-2,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 3081435958560, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,-1,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",170,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,0.5,2 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 3081435946960, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 3081864324992, "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 3 + PoseNode: { + Node: 3081435974800 + Matrix: *16 { + a: 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 3081435956240 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,-2,0,1 + } + } + PoseNode: { + Node: 3081435958560 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + } + Material: 3081899223712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 3081864325168, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "DualQuaternion" + } + Deformer: 3081904743552, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *44 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43 + } + Weights: *44 { + a: 0.996640787441516,0.99664078757101,0.996640787551029,0.99664078775304,0.988403631958435,0.988403632378423,0.952926638928621,0.952926640607189,0.823763779214635,0.823763784794747,0.499999986644694,0.499999986380779,0.176236299345892,0.176236289561308,0.0470733747306146,0.0470733717665865,0.0115963753812439,0.0115963741054561,0.00335921314763779,0.00335921303421446,0.00335921311275215,0.00335921304004493,0.00335921306086784,0.00335921298816079,0.00335921306669821,0.00335921295327524,0.0115963685510642,0.0115963672752786,0.0470733473432489,0.0470733443792254,0.176236215522909,0.176236205738331,0.500000005917051,0.500000005653138,0.823763737358751,0.823763742938864,0.952926624896244,0.952926626574813,0.988403628212988,0.988403628632977,0.996640786738869,0.996640786940881,0.9966407869209,0.996640787050394 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1,6.12323399573677e-17,0,0,0,0,1,0,2,1.22464679914735e-16,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,-2,0,1 + } + } + Deformer: 3081904746496, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *44 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43 + } + Weights: *44 { + a: 0.00335921255848459,0.00335921242899025,0.00335921244897072,0.00335921224695957,0.0115963680415656,0.0115963676215773,0.0470733610713789,0.0470733593928108,0.176236220785365,0.176236215205253,0.500000013355306,0.500000013619221,0.823763700654108,0.823763710438692,0.952926625269385,0.952926628233413,0.988403624618756,0.988403625894544,0.996640786852362,0.996640786965786,0.996640786887248,0.996640786959955,0.996640786939132,0.996640787011839,0.996640786933302,0.996640787046725,0.988403631448936,0.988403632724722,0.952926652656751,0.952926655620774,0.823763784477091,0.823763794261669,0.499999994082949,0.499999994346862,0.17623626264125,0.176236257061136,0.0470733751037565,0.0470733734251872,0.0115963717870119,0.0115963713670232,0.00335921326113073,0.00335921305911941,0.00335921307909994,0.00335921294960553 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1,6.12323399573677e-17,0,0,0,0,1,0,0,0,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + } + AnimationStack: 3081996380736, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurveNode: 3081996379904, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 3081996381152, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 3081996380944, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationLayer: 3081901871440, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",3081435974800,0 + + ;Model::joint1, Model::RootNode + C: "OO",3081435956240,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",3081901871440,3081996380736 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",3081996379904,3081901871440 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",3081996381152,3081901871440 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",3081996380944,3081901871440 + + ;Deformer::, Geometry:: + C: "OO",3081864325168,3081872526352 + + ;Geometry::, Model::pCube1 + C: "OO",3081872526352,3081435974800 + + ;Material::lambert1, Model::pCube1 + C: "OO",3081899223712,3081435974800 + + ;NodeAttribute::, Model::joint1 + C: "OO",3081856171456,3081435956240 + + ;Model::joint2, Model::joint1 + C: "OO",3081435958560,3081435956240 + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",3081996379904,3081435956240, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint2 + C: "OO",3081856170880,3081435958560 + + ;Model::joint3, Model::joint2 + C: "OO",3081435946960,3081435958560 + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",3081996381152,3081435958560, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint3 + C: "OO",3081856171840,3081435946960 + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",3081996380944,3081435946960, "lockInfluenceWeights" + + ;SubDeformer::, Deformer:: + C: "OO",3081904743552,3081864325168 + + ;SubDeformer::, Deformer:: + C: "OO",3081904746496,3081864325168 + + ;Model::joint1, SubDeformer:: + C: "OO",3081435956240,3081904743552 + + ;Model::joint2, SubDeformer:: + C: "OO",3081435958560,3081904746496 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_duplicated_texture_7700_ascii.fbx b/modules/ufbx/data/maya_duplicated_texture_7700_ascii.fbx new file mode 100644 index 0000000..4033fe1 --- /dev/null +++ b/modules/ufbx/data/maya_duplicated_texture_7700_ascii.fbx @@ -0,0 +1,636 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 3 + Hour: 20 + Minute: 8 + Second: 28 + Millisecond: 414 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_duplicated_texture_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_duplicated_texture_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "03/12/2022 18:08:28.413" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_duplicated_texture_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "03/12/2022 18:08:28.413" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\duplicate_textures.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",192442325000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2129058861568, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 17 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 4 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Texture" { + Count: 4 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Video" { + Count: 4 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2129146195072, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementUV: 1 { + Version: 101 + Name: "second" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.625469446182251,0.999882400035858,0.375469565391541,1.00011718273163,0.625234723091125,0.749882519245148,0.375234812498093,0.750117301940918,0.624999940395355,0.499882608652115,0.375000059604645,0.500117361545563,0.624765157699585,0.249882698059082,0.374765276908875,0.250117480754852,0.624530434608459,-0.000117182731628418,0.374530524015427,0.000117599964141846,0.12546968460083,1.00035190582275,0.12523490190506,0.750352025032043,0.875469386577606,0.999647617340088,0.875234603881836,0.749647736549377 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: *6 { + a: 0,1,2,2,3,2 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + } + } + Model: 2128708560512, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "second" + } + Shading: T + Culling: "CullingOff" + } + Material: 2129234776064, "Material::lambert4", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Opacity", "double", "Number", "",1 + } + } + Material: 2129234785664, "Material::lambert2", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Opacity", "double", "Number", "",1 + } + } + Material: 2129234846464, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Opacity", "double", "Number", "",1 + } + } + Material: 2129234688464, "Material::lambert3", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Opacity", "double", "Number", "",1 + } + } + Video: 2129246918656, "Video::file4", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\tiny_clouds.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + } + Video: 2129246921056, "Video::file2", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\tiny_clouds.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + } + Video: 2129246919136, "Video::file1", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\tiny_clouds.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + } + Video: 2129246920576, "Video::file3", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\tiny_clouds.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + } + Texture: 2129246917216, "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "second" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2129246921536, "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2129246923936, "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2129246920096, "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties70: { + P: "Scaling", "Vector", "", "A",2,2,1 + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + AnimationStack: 2129060549408, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationLayer: 2129155696240, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2128708560512,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2129155696240,2129060549408 + + ;Texture::file4, Material::lambert4 + C: "OP",2129246917216,2129234776064, "DiffuseColor" + + ;Texture::file2, Material::lambert2 + C: "OP",2129246921536,2129234785664, "DiffuseColor" + + ;Texture::file1, Material::lambert1 + C: "OP",2129246923936,2129234846464, "DiffuseColor" + + ;Texture::file3, Material::lambert3 + C: "OP",2129246920096,2129234688464, "DiffuseColor" + + ;Video::file4, Texture::file4 + C: "OO",2129246918656,2129246917216 + + ;Video::file2, Texture::file2 + C: "OO",2129246921056,2129246921536 + + ;Video::file1, Texture::file1 + C: "OO",2129246919136,2129246923936 + + ;Video::file3, Texture::file3 + C: "OO",2129246920576,2129246920096 + + ;Geometry::, Model::pCube1 + C: "OO",2129146195072,2128708560512 + + ;Material::lambert4, Model::pCube1 + C: "OO",2129234776064,2128708560512 + + ;Material::lambert2, Model::pCube1 + C: "OO",2129234785664,2128708560512 + + ;Material::lambert1, Model::pCube1 + C: "OO",2129234846464,2128708560512 + + ;Material::lambert3, Model::pCube1 + C: "OO",2129234688464,2128708560512 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + } +} diff --git a/modules/ufbx/data/maya_edge_smoothing_7500_ascii.fbx b/modules/ufbx/data/maya_edge_smoothing_7500_ascii.fbx new file mode 100644 index 0000000..b32c1b4 --- /dev/null +++ b/modules/ufbx/data/maya_edge_smoothing_7500_ascii.fbx @@ -0,0 +1,391 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 8 + Hour: 15 + Minute: 11 + Second: 42 + Millisecond: 965 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_edge_smoothing_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_edge_smoothing_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "08/08/2021 12:11:42.964" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_edge_smoothing_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "08/08/2021 12:11:42.964" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1127163631840, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1127950282592, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.49999988079071,-0.49999988079071,0.215589791536331,0.49999988079071,-0.49999988079071,0.215589791536331,-0.49999988079071,0.49999988079071,0.215589791536331,0.49999988079071,0.49999988079071,0.215589791536331,-0.49999988079071,0.49999988079071,-0.215589791536331,0.49999988079071,0.49999988079071,-0.215589791536331,-0.49999988079071,-0.49999988079071,-0.215589791536331,0.49999988079071,-0.49999988079071,-0.215589791536331 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: -0.395941823720932,0,0.918275654315948,0.395941823720932,0,0.918275654315948,0.395941823720932,0,0.918275654315948,-0.395941823720932,0,0.918275654315948,0,1,0,0,1,0,0,1,0,0,1,0,-0.395941823720932,0,-0.918275654315948,0.395941823720932,0,-0.918275654315948,0.395941823720932,0,-0.918275654315948,-0.395941823720932,0,-0.918275654315948,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.395941823720932,0,0.918275654315948,0.395941823720932,0,-0.918275654315948,0.395941823720932,0,-0.918275654315948,0.395941823720932,0,0.918275654315948,-0.395941823720932,0,-0.918275654315948,-0.395941823720932,0,0.918275654315948,-0.395941823720932,0,0.918275654315948,-0.395941823720932,0,-0.918275654315948 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,1,1,0,0,1,1,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1127166761008, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1127672259168, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1127687869456, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1127676178928, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1127166761008,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1127676178928,1127687869456 + + ;Geometry::, Model::pCube1 + C: "OO",1127950282592,1127166761008 + + ;Material::lambert1, Model::pCube1 + C: "OO",1127672259168,1127166761008 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_game_sausage_6100_ascii.fbx b/modules/ufbx/data/maya_game_sausage_6100_ascii.fbx new file mode 100644 index 0000000..c82e622 --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_6100_ascii.fbx @@ -0,0 +1,814 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 51 + Second: 2 + Millisecond: 950 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 5 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1.23333332718325,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292 + ,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5 + ,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336 + ,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321 + ,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307 + ,-0.5 + PolygonVertexIndex: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13 + ,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22 + ,18,19,23,-23,20,23,19,-17 + Edges: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0 + ,81,16,10 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07 + ,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0 + ,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1 + ,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355 + ,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355 + ,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + ,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355 + ,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355 + ,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0 + ,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1 + ,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1.78813934326172e-07,1 + ,0,1.78813934326172e-07,1,0,1.78813934326172e-07,1,0,1.78813934326172e-07,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0 + ,0,1,0,0,1,0,0,1,0,0,1,-1.78813934326172e-07,0,1,-1.49011611938477e-07,0,1,-1.19209289550781e-07,0,1,-1.39077513949815e-07 + ,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-1.78813934326172e-07,0,1,-1.49011611938477e-07,0,1,-1.19209289550781e-07,0 + ,1,-1.39077513949815e-07,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,-1.39077513949815e-07,0,1,-1.19209289550781e-07,0,1 + ,-7.94728620689966e-08,0,1,-1.19209289550781e-07,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-1.39077513949815e-07,0,1,-1.19209289550781e-07 + ,0,1,-7.94728620689966e-08,0,1,-1.19209289550781e-07,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,-1.19209289550781e-07,0 + ,1,-7.94728620689966e-08,0,1,0,0,1,-3.97364310344983e-08,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-1.19209289550781e-07 + ,0,1,-7.94728620689966e-08,-0,1,0,0,1,-3.97364310344983e-08,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,-3.97364310344983e-08 + ,0,1,0,0,1,0,0,1,0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-3.97364310344983e-08,-0,1,0,-0,1,0,-0,1,0,0,-1,0,0,-1,0,0 + ,-1,0,0,-1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,1.78813934326172e-07,1,0,1.49011611938477e-07,1,0,1.19209289550781e-07 + ,1,0,1.39077513949815e-07,1,1,-0,-0,1,-0,0,1,-0,0,1,-0,0,0,-1.78813934326172e-07,-1,0,-1.49011611938477e-07,-1 + ,0,-1.19209289550781e-07,-1,0,-1.39077513949815e-07,-1,1,0,0,1,0,0,1,0,0,1,0,0,0,1.39077513949815e-07,1,0,1.19209289550781e-07 + ,1,0,7.94728620689966e-08,1,0,1.19209289550781e-07,1,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1.39077513949815e-07,-1,0 + ,-1.19209289550781e-07,-1,0,-7.94728620689966e-08,-1,0,-1.19209289550781e-07,-1,1,0,0,1,0,0,1,0,0,1,0,0,0,1.19209289550781e-07 + ,1,0,7.94728620689966e-08,1,0,-0,1,0,3.97364310344983e-08,1,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1.19209289550781e-07 + ,-1,0,-7.94728620689966e-08,-1,0,0,-1,0,-3.97364310344983e-08,-1,1,0,0,1,0,0,1,0,0,1,0,0,0,3.97364310344983e-08 + ,1,0,-0,1,0,-0,1,0,-0,1,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-3.97364310344983e-08,-1,0,0,-1,0,0,-1,0,0,-1,1,0,0,1,0 + ,0,1,0,0,1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678 + ,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355 + ,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858 + ,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232 + ,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + + UVIndex: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22 + ,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35 + ,34,29,31,37,35,33,36,30,27 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::joint1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint1_ncl1_1" + } + Model: "Model::joint2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint2_ncl1_1" + } + Model: "Model::joint3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.15431302203923,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint3_ncl1_1" + } + Model: "Model::joint4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.07370048859635,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint4_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "04/04/2020 12:51:02.948" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "04/04/2020 12:51:02.948" + Property: "Original|ApplicationActiveProject", "KString", "", "W:\Temp\ufbx_test_source" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } + Pose: "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 4 + PoseNode: { + Node: "Model::pCube1" + Matrix: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + PoseNode: { + Node: "Model::joint3" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + PoseNode: { + Node: "Model::joint2" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + PoseNode: { + Node: "Model::joint1" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + Deformer: "Deformer::Skin pCube1", "Skin" { + Version: 100 + Properties60: { + } + Link_DeformAcuracy: 50 + } + Deformer: "SubDeformer::Cluster joint3", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 2,3,4,5,20,21,22,23 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16 + ,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + Deformer: "SubDeformer::Cluster joint2", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 12,13,14,15,16,17,18,19 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + Deformer: "SubDeformer::Cluster joint1", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 0,1,6,7,8,9,10,11 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::joint1", "Model::Scene" + Connect: "OO", "Deformer::Skin pCube1", "Model::pCube1" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Model::joint2", "Model::joint1" + Connect: "OO", "Model::joint3", "Model::joint2" + Connect: "OO", "Model::joint4", "Model::joint3" + Connect: "OO", "SubDeformer::Cluster joint3", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint2", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint1", "Deformer::Skin pCube1" + Connect: "OO", "Model::joint3", "SubDeformer::Cluster joint3" + Connect: "OO", "Model::joint2", "SubDeformer::Cluster joint2" + Connect: "OO", "Model::joint1", "SubDeformer::Cluster joint1" +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_game_sausage_6100_ascii_combined.fbx b/modules/ufbx/data/maya_game_sausage_6100_ascii_combined.fbx new file mode 100644 index 0000000..6806c3d --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_6100_ascii_combined.fbx @@ -0,0 +1,2179 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 51 + Second: 57 + Millisecond: 398 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 5 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1.23333332718325,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292 + ,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5 + ,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336 + ,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321 + ,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307 + ,-0.5 + PolygonVertexIndex: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13 + ,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22 + ,18,19,23,-23,20,23,19,-17 + Edges: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0 + ,81,16,10 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07 + ,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0 + ,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1 + ,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355 + ,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355 + ,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + ,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355 + ,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355 + ,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0 + ,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1 + ,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678 + ,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355 + ,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858 + ,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232 + ,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + + UVIndex: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22 + ,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35 + ,34,29,31,37,35,33,36,30,27 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::joint1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint1_ncl1_1" + } + Model: "Model::joint2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint2_ncl1_1" + } + Model: "Model::joint3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1.15431302203923,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint3_ncl1_1" + } + Model: "Model::joint4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.07370048859635,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint4_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_combined.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_combined.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "04/04/2020 12:51:57.396" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_combined.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "04/04/2020 12:51:57.396" + Property: "Original|ApplicationActiveProject", "KString", "", "W:\Temp\ufbx_test_source" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } + Pose: "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 4 + PoseNode: { + Node: "Model::pCube1" + Matrix: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + PoseNode: { + Node: "Model::joint3" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + PoseNode: { + Node: "Model::joint2" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + PoseNode: { + Node: "Model::joint1" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + Deformer: "Deformer::Skin pCube1", "Skin" { + Version: 100 + Properties60: { + } + Link_DeformAcuracy: 50 + } + Deformer: "SubDeformer::Cluster joint3", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 2,3,4,5,20,21,22,23 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16 + ,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + Deformer: "SubDeformer::Cluster joint2", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 12,13,14,15,16,17,18,19 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + Deformer: "SubDeformer::Cluster joint1", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 0,1,6,7,8,9,10,11 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::joint1", "Model::Scene" + Connect: "OO", "Deformer::Skin pCube1", "Model::pCube1" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Model::joint2", "Model::joint1" + Connect: "OO", "Model::joint3", "Model::joint2" + Connect: "OO", "Model::joint4", "Model::joint3" + Connect: "OO", "SubDeformer::Cluster joint3", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint2", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint1", "Deformer::Skin pCube1" + Connect: "OO", "Model::joint3", "SubDeformer::Cluster joint3" + Connect: "OO", "Model::joint2", "SubDeformer::Cluster joint2" + Connect: "OO", "Model::joint1", "SubDeformer::Cluster joint1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "wiggle" { + FileName: "wiggle.tak" + LocalTime: 1924423250,38488465000 + ReferenceTime: 1924423250,38488465000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::joint1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,149.82275390625,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,-46.0104217529297,U,s,0,109.28205871582,n,3848846500,-43.6388473510742 + ,U,s,109.28205871582,191.243606567383,n,5773269750,-37.2830352783203,U,s,191.243606567383 + ,245.884628295898,n,7697693000,-28.0813331604004,U,s,245.884628295898,273.205139160156 + ,n,9622116250,-17.1721038818359,U,s,273.205139160156,273.205139160156,n,11546539500 + ,-5.69369220733643,U,s,273.205139160156,245.884628295898,n,13470962750,5.21554279327393 + ,U,s,245.884628295898,191.243591308594,n,15395386000,14.4172439575195,U,s,191.243591308594 + ,109.282051086426,n,17319809250,20.7730579376221,U,s,109.282051086426,0,n,19244232500 + ,23.1446304321289,U,s,0,-107.657447814941,n,21168655750,20.7949638366699,U,s,-107.657447814941 + ,-184.555633544922,n,23093079000,14.6003875732422,U,s,-184.555633544922,-230.694549560547 + ,n,25017502250,5.84254026412964,U,s,-230.694549560547,-246.074172973633,n,26941925500 + ,-4.19694519042969,U,s,-246.074172973633,-230.694549560547,n,28866348750,-14.2364292144775 + ,U,s,-230.694549560547,-184.555633544922,n,30790772000,-22.9942779541016,U,s,-184.555633544922 + ,-107.657447814941,n,32715195250,-29.1888523101807,U,s,-107.657447814941,0,n,34639618500 + ,-31.5385189056396,U,s,0,567.693298339844,n,36564041750,-15.7692594528198,U,s,567.693298339844 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint2" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,125.077178955078,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,67.3346862792969,U,s,0,-221.996795654297,n,3848846500,62.5170440673828 + ,U,s,-221.996795654297,-388.494384765625,n,5773269750,49.6057739257813,U,s,-388.494384765625 + ,-499.492767333984,n,7697693000,30.9133358001709,U,s,-499.492767333984,-554.992004394531 + ,n,9622116250,8.75220108032227,U,s,-554.992004394531,-554.992004394531,n,11546539500 + ,-14.5651721954346,U,s,-554.992004394531,-499.492767333984,n,13470962750,-36.7263107299805 + ,U,s,-499.492767333984,-388.494384765625,n,15395386000,-55.4187469482422,U,s,-388.494384765625 + ,-221.996780395508,n,17319809250,-68.3300170898438,U,s,-221.996780395508,0,n,19244232500 + ,-73.1476593017578,U,s,0,245.2412109375,n,21168655750,-67.7951736450195,U,s,245.2412109375 + ,420.413482666016,n,23093079000,-53.6840744018555,U,s,420.413482666016,525.516906738281 + ,n,25017502250,-33.7338943481445,U,s,525.516906738281,560.551330566406,n,26941925500 + ,-10.8641777038574,U,s,560.551330566406,525.516906738281,n,28866348750,12.0055389404297 + ,U,s,525.516906738281,420.413482666016,n,30790772000,31.9557151794434,U,s,420.413482666016 + ,245.2412109375,n,32715195250,46.0668182373047,U,s,245.2412109375,0,n,34639618500 + ,51.419303894043,U,s,0,-925.547424316406,n,36564041750,25.7096519470215,U,s,-925.547424316406 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint3" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.15431296825409 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1.15431296825409,U,s,0,0,n,3848846500,1.15431296825409,U,s,0,0,n,5773269750 + ,1.15431296825409,U,s,0,0,n,7697693000,1.15431296825409,U,s,0,0,n,9622116250,1.15431296825409 + ,U,s,0,0,n,11546539500,1.15431296825409,U,s,0,0,n,13470962750,1.15431296825409,U,s + ,0,0,n,15395386000,1.15431296825409,U,s,0,0,n,17319809250,1.15431296825409,U,s,0,0 + ,n,19244232500,1.15431296825409,U,s,0,0,n,21168655750,1.15431296825409,U,s,0,0,n,23093079000 + ,1.15431296825409,U,s,0,0,n,25017502250,1.15431296825409,U,s,0,0,n,26941925500,1.15431296825409 + ,U,s,0,0,n,28866348750,1.15431296825409,U,s,0,0,n,30790772000,1.15431296825409,U,s + ,0,0,n,32715195250,1.15431296825409,U,s,0,0,n,34639618500,1.15431296825409,U,s,0,0 + ,n,36564041750,1.15431296825409,U,s,0,0,n,38488465000,1.15431296825409,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,-144.71484375,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,39.172191619873,U,s,0,-124.010719299316,n,3848846500,36.4809875488281,U + ,s,-124.010719299316,-217.018753051758,n,5773269750,29.2685585021973,U,s,-217.018753051758 + ,-279.024108886719,n,7697693000,18.8266830444336,U,s,-279.024108886719,-310.026794433594 + ,n,9622116250,6.44714164733887,U,s,-310.026794433594,-310.026794433594,n,11546539500 + ,-6.57829093933105,U,s,-310.026794433594,-279.024108886719,n,13470962750,-18.9578304290771 + ,U,s,-279.024108886719,-217.018753051758,n,15395386000,-29.3997058868408,U,s,-217.018753051758 + ,-124.010711669922,n,17319809250,-36.6121368408203,U,s,-124.010711669922,0,n,19244232500 + ,-39.3033409118652,U,s,0,151.208068847656,n,21168655750,-36.0031623840332,U,s,151.208068847656 + ,259.213806152344,n,23093079000,-27.3027019500732,U,s,259.213806152344,324.017303466797 + ,n,25017502250,-15.0020446777344,U,s,324.017303466797,345.618438720703,n,26941925500 + ,-0.901290893554688,U,s,345.618438720703,324.017303466797,n,28866348750,13.199462890625 + ,U,s,324.017303466797,259.213806152344,n,30790772000,25.5001182556152,U,s,259.213806152344 + ,151.208068847656,n,32715195250,34.2005805969238,U,s,151.208068847656,0,n,34639618500 + ,37.5007591247559,U,s,0,-675.013671875,n,36564041750,18.7503795623779,U,s,-675.013671875 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } + Take: "spin" { + FileName: "spin.tak" + LocalTime: 38488465000,76976930000 + ReferenceTime: 38488465000,76976930000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::joint1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,149.82275390625,n,40412888250,3.26072907447815,U,s,149.82275390625 + ,259.492004394531,n,42337311500,11.9275407791138,U,s,259.492004394531,329.007690429688 + ,n,44261734750,24.32737159729,U,s,329.007690429688,358.369903564453,n,46186158000 + ,38.7871589660645,U,s,358.369903564453,347.578552246094,n,48110581250,53.6338386535645 + ,U,s,347.578552246094,296.633758544922,n,50035004500,67.1943511962891,U,s,296.633758544922 + ,205.535415649414,n,51959427750,77.7956314086914,U,s,205.535415649414,219.148864746094 + ,n,53883851000,86.6626281738281,U,s,219.148864746094,227.172958374023,n,55808274250 + ,95.9804077148438,U,s,227.172958374023,229.607711791992,n,57732697500,105.516067504883 + ,U,s,229.607711791992,226.453094482422,n,59657120750,115.036743164063,U,s,226.453094482422 + ,217.70915222168,n,61581544000,124.309539794922,U,s,217.70915222168,203.375885009766 + ,n,63505967250,133.101547241211,U,s,203.375885009766,183.453262329102,n,65430390500 + ,141.179901123047,U,s,183.453262329102,157.941299438477,n,67354813750,148.31169128418 + ,U,s,157.941299438477,126.839996337891,n,69279237000,154.264038085938,U,s,126.839996337891 + ,90.1493377685547,n,71203660250,158.804061889648,U,s,90.1493377685547,47.8693237304688 + ,n,73128083500,161.698852539063,U,s,47.8693237304688,0,n,75052506750,162.715545654297 + ,U,s,0,-1735.63256835938,n,76976930000,120.53003692627,U,s,-1735.63256835938,-1735.63232421875 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,C,s,40412888250,1,C,s,42337311500,1,C,s,44261734750,1,C,s,46186158000,1,C,s,48110581250 + ,1,C,s,50035004500,1,C,s,51959427750,1,C,s,53883851000,1,C,s,55808274250,1,C,s,57732697500,1,C,s,59657120750 + ,1,C,s,61581544000,1,C,s,63505967250,1,C,s,65430390500,1,C,s,67354813750,1,C,s,69279237000,1,C,s,71203660250 + ,1,C,s,73128083500,1,C,s,75052506750,1,C,s,76976930000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint2" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,125.077178955078,n,40412888250,2.72235298156738,U,s,125.077178955078 + ,216.579727172852,n,42337311500,9.95678329467773,U,s,216.579727172852,274.507659912109 + ,n,44261734750,20.304349899292,U,s,274.507659912109,298.860961914063,n,46186158000 + ,32.3661079406738,U,s,298.860961914063,289.639678955078,n,48110581250,44.7431144714355 + ,U,s,289.639678955078,246.84375,n,50035004500,56.0364303588867,U,s,246.84375,170.473205566406 + ,n,51959427750,64.8471145629883,U,s,170.473205566406,181.46858215332,n,53883851000 + ,72.1951446533203,U,s,181.46858215332,187.881896972656,n,55808274250,79.9058609008789 + ,U,s,187.881896972656,189.713104248047,n,57732697500,87.788330078125,U,s,189.713104248047 + ,186.962219238281,n,59657120750,95.6516418457031,U,s,186.962219238281,179.629257202148 + ,n,61581544000,103.304870605469,U,s,179.629257202148,167.714202880859,n,63505967250 + ,110.557098388672,U,s,167.714202880859,151.217056274414,n,65430390500,117.217422485352 + ,U,s,151.217056274414,130.137802124023,n,67354813750,123.094886779785,U,s,130.137802124023 + ,104.476486206055,n,69279237000,127.998588562012,U,s,104.476486206055,74.2330932617188 + ,n,71203660250,131.73762512207,U,s,74.2330932617188,39.4075775146484,n,73128083500 + ,134.121032714844,U,s,39.4075775146484,0,n,75052506750,134.957946777344,U,s,0,-1439.55151367188 + ,n,76976930000,99.9688491821289,U,s,-1439.55151367188,-1439.55139160156,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,C,s,40412888250,1,C,s,42337311500,1,C,s,44261734750,1,C,s,46186158000,1,C,s,48110581250 + ,1,C,s,50035004500,1,C,s,51959427750,1,C,s,53883851000,1,C,s,55808274250,1,C,s,57732697500,1,C,s,59657120750 + ,1,C,s,61581544000,1,C,s,63505967250,1,C,s,65430390500,1,C,s,67354813750,1,C,s,69279237000,1,C,s,71203660250 + ,1,C,s,73128083500,1,C,s,75052506750,1,C,s,76976930000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint3" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.15431296825409 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1.15431296825409,U,s,0,0,n,40412888250,1.15431296825409,U,s,0,0,n,42337311500 + ,1.15431296825409,U,s,0,0,n,44261734750,1.15431296825409,U,s,0,0,n,46186158000,1.15431296825409 + ,U,s,0,0,n,48110581250,1.15431296825409,U,s,0,0,n,50035004500,1.15431296825409,U,s + ,0,0,n,51959427750,1.15431296825409,U,s,0,0,n,53883851000,1.15431296825409,U,s,0,0 + ,n,55808274250,1.15431296825409,U,s,0,0,n,57732697500,1.15431296825409,U,s,0,0,n,59657120750 + ,1.15431296825409,U,s,0,0,n,61581544000,1.15431296825409,U,s,0,0,n,63505967250,1.15431296825409 + ,U,s,0,0,n,65430390500,1.15431296825409,U,s,0,0,n,67354813750,1.15431296825409,U,s + ,0,0,n,69279237000,1.15431296825409,U,s,0,0,n,71203660250,1.15431296825409,U,s,0,0 + ,n,73128083500,1.15431296825409,U,s,0,0,n,75052506750,1.15431296825409,U,s,0,0,n,76976930000 + ,1.15431296825409,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,-144.71484375,n,40412888250,-3.15094780921936,U,s,-144.71484375 + ,-250.245712280273,n,42337311500,-11.5153474807739,U,s,-250.245712280273,-316.592590332031 + ,n,44261734750,-23.4605312347412,U,s,-316.592590332031,-343.755523681641,n,46186158000 + ,-37.3538398742676,U,s,-343.755523681641,-331.734436035156,n,48110581250,-51.5626029968262 + ,U,s,-331.734436035156,-280.529418945313,n,50035004500,-64.4541549682617,U,s,-280.529418945313 + ,-190.140380859375,n,51959427750,-74.3958282470703,U,s,-190.140380859375,-200.509140014648 + ,n,53883851000,-82.550910949707,U,s,-200.509140014648,-206.111785888672,n,55808274250 + ,-91.0387268066406,U,s,-206.111785888672,-206.948272705078,n,57732697500,-99.6606903076172 + ,U,s,-206.948272705078,-203.018600463867,n,59657120750,-108.218223571777,U,s,-203.018600463867 + ,-194.322784423828,n,61581544000,-116.512718200684,U,s,-194.322784423828,-180.860824584961 + ,n,63505967250,-124.345596313477,U,s,-180.860824584961,-162.632720947266,n,65430390500 + ,-131.518249511719,U,s,-162.632720947266,-139.638458251953,n,67354813750,-137.832122802734 + ,U,s,-139.638458251953,-111.878067016602,n,69279237000,-143.088592529297,U,s,-111.878067016602 + ,-79.3515319824219,n,71203660250,-147.089096069336,U,s,-79.3515319824219,-42.0588302612305 + ,n,73128083500,-149.635025024414,U,s,-42.0588302612305,0,n,75052506750,-150.527801513672 + ,U,s,0,1605.6298828125,n,76976930000,-111.502075195313,U,s,1605.6298828125,1605.6298828125 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,C,s,40412888250,1,C,s,42337311500,1,C,s,44261734750,1,C,s,46186158000,1,C,s,48110581250 + ,1,C,s,50035004500,1,C,s,51959427750,1,C,s,53883851000,1,C,s,55808274250,1,C,s,57732697500,1,C,s,59657120750 + ,1,C,s,61581544000,1,C,s,63505967250,1,C,s,65430390500,1,C,s,67354813750,1,C,s,69279237000,1,C,s,71203660250 + ,1,C,s,73128083500,1,C,s,75052506750,1,C,s,76976930000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } + Take: "deform" { + FileName: "deform.tak" + LocalTime: 76976930000,115465395000 + ReferenceTime: 76976930000,115465395000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::joint1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,120.53003692627,U,s,-1735.63256835938,-1735.63232421875,n,78901353250 + ,42.1855125427246,U,s,-1735.63232421875,0,n,80825776500,0,U,s,0,0,n,82750199750,0 + ,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0,n + ,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,-0.998422801494598 + ,n,82750199750,0.97820907831192,U,s,-0.998422801494598,-1.71158194541931,n,84674623000 + ,0.920760095119476,U,s,-1.71158194541931,-2.13947725296021,n,86599046250,0.839539229869843 + ,U,s,-2.13947725296021,-2.28210926055908,n,88523469500,0.746432304382324,U,s,-2.28210926055908 + ,-2.13947725296021,n,90447892750,0.653325438499451,U,s,-2.13947725296021,-1.71158194541931 + ,n,92372316000,0.572104513645172,U,s,-1.71158194541931,-0.998422801494598,n,94296739250 + ,0.514655590057373,U,s,-0.998422801494598,0,n,96221162500,0.492864638566971,U,s,0 + ,0,n,98145585750,0.492864638566971,U,a,n,100070009000,0.492864638566971,U,a,n,101994432250 + ,0.492864638566971,U,a,n,103918855500,0.492864638566971,U,a,n,105843278750,0.492864638566971 + ,U,a,n,107767702000,0.492864638566971,U,a,n,109692125250,0.492864638566971,U,a,n,111616548500 + ,0.492864638566971,U,a,n,113540971750,0.492864638566971,U,a,n,115465395000,0.492864638566971 + ,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,a,n,100070009000,1,U,a,n,101994432250,1,U,a,n,103918855500 + ,1,U,a,n,105843278750,1,U,a,n,107767702000,1,U,a,n,109692125250,1,U,a,n,111616548500 + ,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,a,n,100070009000,1,U,a,n,101994432250,1,U,a,n,103918855500 + ,1,U,a,n,105843278750,1,U,a,n,107767702000,1,U,a,n,109692125250,1,U,a,n,111616548500 + ,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,C,s,78901353250,1,C,s,80825776500,1,C,s,82750199750,1,C,s,84674623000,1,C,s,86599046250 + ,1,C,s,88523469500,1,C,s,90447892750,1,C,s,92372316000,1,C,s,94296739250,1,C,s,96221162500,1,C,s,98145585750 + ,1,U,a,n,100070009000,1,U,a,n,101994432250,1,U,a,n,103918855500,1,U,a,n,105843278750,1,U,a,n,107767702000 + ,1,U,a,n,109692125250,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint2" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,s,0,0,n,100070009000,1,U,s,0,0,n,101994432250,1,U,s,0 + ,0,n,103918855500,1,U,s,0,0,n,105843278750,1,U,s,0,0,n,107767702000,1,U,a,n,109692125250 + ,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,3.00915336608887,n,98145585750,0.0679149180650711,U,s,3.00915336608887,4.5137300491333 + ,n,100070009000,0.229865878820419,U,s,4.5137300491333,4.5137300491333,n,101994432250 + ,0.423162192106247,U,s,4.5137300491333,3.00915336608887,n,103918855500,0.585113108158112 + ,U,s,3.00915336608887,0,n,105843278750,0.653028070926666,U,s,0,0,n,107767702000,0.653028070926666 + ,U,a,n,109692125250,0.653028070926666,U,a,n,111616548500,0.653028070926666,U,a,n,113540971750 + ,0.653028070926666,U,a,n,115465395000,0.653028070926666,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,99.9688491821289,U,s,-1439.55151367188,-1439.55139160156,n,78901353250 + ,34.9890937805176,U,s,-1439.55139160156,0,n,80825776500,0,U,s,0,0,n,82750199750,0 + ,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0,n + ,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,-1.17206144332886 + ,n,82750199750,0.974419295787811,U,s,-1.17206144332886,-2.00924825668335,n,84674623000 + ,0.906979203224182,U,s,-2.00924825668335,-2.51156044006348,n,86599046250,0.811632990837097 + ,U,s,-2.51156044006348,-2.67899775505066,n,88523469500,0.702333569526672,U,s,-2.67899775505066 + ,-2.51156044006348,n,90447892750,0.593034148216248,U,s,-2.51156044006348,-2.00924825668335 + ,n,92372316000,0.49768790602684,U,s,-2.00924825668335,-1.17206144332886,n,94296739250 + ,0.430247873067856,U,s,-1.17206144332886,0,n,96221162500,0.404667168855667,U,s,0,0 + ,n,98145585750,0.404667168855667,U,s,0,0,n,100070009000,0.404667168855667,U,s,0,0 + ,n,101994432250,0.404667168855667,U,s,0,0,n,103918855500,0.404667168855667,U,s,0,0 + ,n,105843278750,0.404667168855667,U,s,0,0,n,107767702000,0.404667168855667,U,a,n,109692125250 + ,0.404667168855667,U,a,n,111616548500,0.404667168855667,U,a,n,113540971750,0.404667168855667 + ,U,a,n,115465395000,0.404667168855667,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,s,0,0,n,100070009000,1,U,s,0,0,n,101994432250,1,U,s,0 + ,0,n,103918855500,1,U,s,0,0,n,105843278750,1,U,s,0,0,n,107767702000,1,U,a,n,109692125250 + ,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,s,0,0,n,100070009000,1,U,s,0,0,n,101994432250,1,U,s,0 + ,0,n,103918855500,1,U,s,0,0,n,105843278750,1,U,s,0,0,n,107767702000,1,U,a,n,109692125250 + ,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,C,s,78901353250,1,C,s,80825776500,1,C,s,82750199750,1,C,s,84674623000,1,C,s,86599046250 + ,1,C,s,88523469500,1,C,s,90447892750,1,C,s,92372316000,1,C,s,94296739250,1,C,s,96221162500,1,C,s,98145585750 + ,1,C,s,100070009000,1,C,s,101994432250,1,C,s,103918855500,1,C,s,105843278750,1,C,s,107767702000,1,U,a + ,n,109692125250,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint3" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.15431296825409 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1.15431296825409,U,s,0,0,n,78901353250,1.15431296825409,U,s,0,0,n,80825776500 + ,1.15431296825409,U,s,0,0,n,82750199750,1.15431296825409,U,s,0,0,n,84674623000,1.15431296825409 + ,U,s,0,0,n,86599046250,1.15431296825409,U,s,0,0,n,88523469500,1.15431296825409,U,s + ,0,0,n,90447892750,1.15431296825409,U,s,0,0,n,92372316000,1.15431296825409,U,s,0,0 + ,n,94296739250,1.15431296825409,U,s,0,0,n,96221162500,1.15431296825409,U,s,0,0,n,98145585750 + ,1.15431296825409,U,s,0,0,n,100070009000,1.15431296825409,U,s,0,0,n,101994432250,1.15431296825409 + ,U,s,0,0,n,103918855500,1.15431296825409,U,s,0,0,n,105843278750,1.15431296825409,U + ,s,0,0,n,107767702000,1.15431296825409,U,a,n,109692125250,1.15431296825409,U,a,n,111616548500 + ,1.15431296825409,U,a,n,113540971750,1.15431296825409,U,a,n,115465395000,1.15431296825409 + ,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,-111.502075195313,U,s,1605.6298828125,1605.6298828125,n,78901353250,-39.0257263183594 + ,U,s,1605.6298828125,0,n,80825776500,0,U,s,0,0,n,82750199750,0,U,s,0,0,n,84674623000 + ,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0,n,90447892750,0,U,s,0,0 + ,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500,0,U,s,0,0,n,98145585750 + ,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0,0,n,103918855500,0,U,s + ,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,-267.092803955078,n,98145585750,-6.02813625335693,U,s,-267.092803955078,-400.639221191406 + ,n,100070009000,-20.4029216766357,U,s,-400.639221191406,-400.639221191406,n,101994432250 + ,-37.5599250793457,U,s,-400.639221191406,-267.092803955078,n,103918855500,-51.9347114562988 + ,U,s,-267.092803955078,0,n,105843278750,-57.9628486633301,U,s,0,0,n,107767702000,-57.9628486633301 + ,U,a,n,109692125250,-57.9628486633301,U,a,n,111616548500,-57.9628486633301,U,a,n,113540971750 + ,-57.9628486633301,U,a,n,115465395000,-57.9628486633301,U,a,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,-1.19376635551453 + ,n,82750199750,0.973945558071136,U,s,-1.19376635551453,-2.04645657539368,n,84674623000 + ,0.905256628990173,U,s,-2.04645657539368,-2.55807065963745,n,86599046250,0.808144688606262 + ,U,s,-2.55807065963745,-2.72860884666443,n,88523469500,0.696821212768555,U,s,-2.72860884666443 + ,-2.55807065963745,n,90447892750,0.585497796535492,U,s,-2.55807065963745,-2.04645657539368 + ,n,92372316000,0.488385856151581,U,s,-2.04645657539368,-1.19376635551453,n,94296739250 + ,0.419696927070618,U,s,-1.19376635551453,0,n,96221162500,0.393642485141754,U,s,0,2.33973336219788 + ,n,98145585750,0.446448981761932,U,s,2.33973336219788,3.5096001625061,n,100070009000 + ,0.572372138500214,U,s,3.5096001625061,3.50959992408752,n,101994432250,0.722667455673218 + ,U,s,3.50959992408752,2.33973336219788,n,103918855500,0.848590672016144,U,s,2.33973336219788 + ,0,n,105843278750,0.901397109031677,U,s,0,0,n,107767702000,0.901397109031677,U,a,n + ,109692125250,0.901397109031677,U,a,n,111616548500,0.901397109031677,U,a,n,113540971750 + ,0.901397109031677,U,a,n,115465395000,0.901397109031677,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,s,0,0,n,100070009000,1,U,s,0,0,n,101994432250,1,U,s,0 + ,0,n,103918855500,1,U,s,0,0,n,105843278750,1,U,s,0,0,n,107767702000,1,U,a,n,109692125250 + ,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,s,0,0,n,100070009000,1,U,s,0,0,n,101994432250,1,U,s,0 + ,0,n,103918855500,1,U,s,0,0,n,105843278750,1,U,s,0,0,n,107767702000,1,U,a,n,109692125250 + ,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,C,s,78901353250,1,C,s,80825776500,1,C,s,82750199750,1,C,s,84674623000,1,C,s,86599046250 + ,1,C,s,88523469500,1,C,s,90447892750,1,C,s,92372316000,1,C,s,94296739250,1,C,s,96221162500,1,C,s,98145585750 + ,1,C,s,100070009000,1,C,s,101994432250,1,C,s,103918855500,1,C,s,105843278750,1,C,s,107767702000,1,U,a + ,n,109692125250,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_game_sausage_6100_ascii_deform.fbx b/modules/ufbx/data/maya_game_sausage_6100_ascii_deform.fbx new file mode 100644 index 0000000..7196f3f --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_6100_ascii_deform.fbx @@ -0,0 +1,1232 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 52 + Second: 12 + Millisecond: 167 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 5 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1.23333332718325,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292 + ,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5 + ,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336 + ,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321 + ,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307 + ,-0.5 + PolygonVertexIndex: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13 + ,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22 + ,18,19,23,-23,20,23,19,-17 + Edges: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0 + ,81,16,10 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07 + ,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0 + ,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1 + ,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355 + ,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355 + ,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + ,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355 + ,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355 + ,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0 + ,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1 + ,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678 + ,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355 + ,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858 + ,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232 + ,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + + UVIndex: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22 + ,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35 + ,34,29,31,37,35,33,36,30,27 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::joint1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint1_ncl1_1" + } + Model: "Model::joint2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint2_ncl1_1" + } + Model: "Model::joint3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1.15431302203923,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint3_ncl1_1" + } + Model: "Model::joint4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.07370048859635,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint4_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_deform.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_deform.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "04/04/2020 12:52:12.165" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_deform.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "04/04/2020 12:52:12.165" + Property: "Original|ApplicationActiveProject", "KString", "", "W:\Temp\ufbx_test_source" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } + Pose: "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 4 + PoseNode: { + Node: "Model::pCube1" + Matrix: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + PoseNode: { + Node: "Model::joint3" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + PoseNode: { + Node: "Model::joint2" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + PoseNode: { + Node: "Model::joint1" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + Deformer: "Deformer::Skin pCube1", "Skin" { + Version: 100 + Properties60: { + } + Link_DeformAcuracy: 50 + } + Deformer: "SubDeformer::Cluster joint3", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 2,3,4,5,20,21,22,23 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16 + ,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + Deformer: "SubDeformer::Cluster joint2", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 12,13,14,15,16,17,18,19 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + Deformer: "SubDeformer::Cluster joint1", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 0,1,6,7,8,9,10,11 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::joint1", "Model::Scene" + Connect: "OO", "Deformer::Skin pCube1", "Model::pCube1" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Model::joint2", "Model::joint1" + Connect: "OO", "Model::joint3", "Model::joint2" + Connect: "OO", "Model::joint4", "Model::joint3" + Connect: "OO", "SubDeformer::Cluster joint3", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint2", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint1", "Deformer::Skin pCube1" + Connect: "OO", "Model::joint3", "SubDeformer::Cluster joint3" + Connect: "OO", "Model::joint2", "SubDeformer::Cluster joint2" + Connect: "OO", "Model::joint1", "SubDeformer::Cluster joint1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "deform" { + FileName: "deform.tak" + LocalTime: 76976930000,115465395000 + ReferenceTime: 76976930000,115465395000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::joint1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,120.53003692627,U,s,-1735.63256835938,-1735.63232421875,n,78901353250 + ,42.1855125427246,U,s,-1735.63232421875,0,n,80825776500,0,U,s,0,0,n,82750199750,0 + ,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0,n + ,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,a,n,100070009000,0,U,a,n,101994432250,0,U,a,n,103918855500 + ,0,U,a,n,105843278750,0,U,a,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,-0.998422801494598 + ,n,82750199750,0.97820907831192,U,s,-0.998422801494598,-1.71158194541931,n,84674623000 + ,0.920760095119476,U,s,-1.71158194541931,-2.13947725296021,n,86599046250,0.839539229869843 + ,U,s,-2.13947725296021,-2.28210926055908,n,88523469500,0.746432304382324,U,s,-2.28210926055908 + ,-2.13947725296021,n,90447892750,0.653325438499451,U,s,-2.13947725296021,-1.71158194541931 + ,n,92372316000,0.572104513645172,U,s,-1.71158194541931,-0.998422801494598,n,94296739250 + ,0.514655590057373,U,s,-0.998422801494598,0,n,96221162500,0.492864638566971,U,s,0 + ,0,n,98145585750,0.492864638566971,U,a,n,100070009000,0.492864638566971,U,a,n,101994432250 + ,0.492864638566971,U,a,n,103918855500,0.492864638566971,U,a,n,105843278750,0.492864638566971 + ,U,a,n,107767702000,0.492864638566971,U,a,n,109692125250,0.492864638566971,U,a,n,111616548500 + ,0.492864638566971,U,a,n,113540971750,0.492864638566971,U,a,n,115465395000,0.492864638566971 + ,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,a,n,100070009000,1,U,a,n,101994432250,1,U,a,n,103918855500 + ,1,U,a,n,105843278750,1,U,a,n,107767702000,1,U,a,n,109692125250,1,U,a,n,111616548500 + ,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,a,n,100070009000,1,U,a,n,101994432250,1,U,a,n,103918855500 + ,1,U,a,n,105843278750,1,U,a,n,107767702000,1,U,a,n,109692125250,1,U,a,n,111616548500 + ,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,C,s,78901353250,1,C,s,80825776500,1,C,s,82750199750,1,C,s,84674623000,1,C,s,86599046250 + ,1,C,s,88523469500,1,C,s,90447892750,1,C,s,92372316000,1,C,s,94296739250,1,C,s,96221162500,1,C,s,98145585750 + ,1,U,a,n,100070009000,1,U,a,n,101994432250,1,U,a,n,103918855500,1,U,a,n,105843278750,1,U,a,n,107767702000 + ,1,U,a,n,109692125250,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint2" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,s,0,0,n,100070009000,1,U,s,0,0,n,101994432250,1,U,s,0 + ,0,n,103918855500,1,U,s,0,0,n,105843278750,1,U,s,0,0,n,107767702000,1,U,a,n,109692125250 + ,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,3.00915336608887,n,98145585750,0.0679149180650711,U,s,3.00915336608887,4.5137300491333 + ,n,100070009000,0.229865878820419,U,s,4.5137300491333,4.5137300491333,n,101994432250 + ,0.423162192106247,U,s,4.5137300491333,3.00915336608887,n,103918855500,0.585113108158112 + ,U,s,3.00915336608887,0,n,105843278750,0.653028070926666,U,s,0,0,n,107767702000,0.653028070926666 + ,U,a,n,109692125250,0.653028070926666,U,a,n,111616548500,0.653028070926666,U,a,n,113540971750 + ,0.653028070926666,U,a,n,115465395000,0.653028070926666,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,99.9688491821289,U,s,-1439.55151367188,-1439.55139160156,n,78901353250 + ,34.9890937805176,U,s,-1439.55139160156,0,n,80825776500,0,U,s,0,0,n,82750199750,0 + ,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0,n + ,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,-1.17206144332886 + ,n,82750199750,0.974419295787811,U,s,-1.17206144332886,-2.00924825668335,n,84674623000 + ,0.906979203224182,U,s,-2.00924825668335,-2.51156044006348,n,86599046250,0.811632990837097 + ,U,s,-2.51156044006348,-2.67899775505066,n,88523469500,0.702333569526672,U,s,-2.67899775505066 + ,-2.51156044006348,n,90447892750,0.593034148216248,U,s,-2.51156044006348,-2.00924825668335 + ,n,92372316000,0.49768790602684,U,s,-2.00924825668335,-1.17206144332886,n,94296739250 + ,0.430247873067856,U,s,-1.17206144332886,0,n,96221162500,0.404667168855667,U,s,0,0 + ,n,98145585750,0.404667168855667,U,s,0,0,n,100070009000,0.404667168855667,U,s,0,0 + ,n,101994432250,0.404667168855667,U,s,0,0,n,103918855500,0.404667168855667,U,s,0,0 + ,n,105843278750,0.404667168855667,U,s,0,0,n,107767702000,0.404667168855667,U,a,n,109692125250 + ,0.404667168855667,U,a,n,111616548500,0.404667168855667,U,a,n,113540971750,0.404667168855667 + ,U,a,n,115465395000,0.404667168855667,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,s,0,0,n,100070009000,1,U,s,0,0,n,101994432250,1,U,s,0 + ,0,n,103918855500,1,U,s,0,0,n,105843278750,1,U,s,0,0,n,107767702000,1,U,a,n,109692125250 + ,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,s,0,0,n,100070009000,1,U,s,0,0,n,101994432250,1,U,s,0 + ,0,n,103918855500,1,U,s,0,0,n,105843278750,1,U,s,0,0,n,107767702000,1,U,a,n,109692125250 + ,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,C,s,78901353250,1,C,s,80825776500,1,C,s,82750199750,1,C,s,84674623000,1,C,s,86599046250 + ,1,C,s,88523469500,1,C,s,90447892750,1,C,s,92372316000,1,C,s,94296739250,1,C,s,96221162500,1,C,s,98145585750 + ,1,C,s,100070009000,1,C,s,101994432250,1,C,s,103918855500,1,C,s,105843278750,1,C,s,107767702000,1,U,a + ,n,109692125250,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint3" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.15431296825409 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1.15431296825409,U,s,0,0,n,78901353250,1.15431296825409,U,s,0,0,n,80825776500 + ,1.15431296825409,U,s,0,0,n,82750199750,1.15431296825409,U,s,0,0,n,84674623000,1.15431296825409 + ,U,s,0,0,n,86599046250,1.15431296825409,U,s,0,0,n,88523469500,1.15431296825409,U,s + ,0,0,n,90447892750,1.15431296825409,U,s,0,0,n,92372316000,1.15431296825409,U,s,0,0 + ,n,94296739250,1.15431296825409,U,s,0,0,n,96221162500,1.15431296825409,U,s,0,0,n,98145585750 + ,1.15431296825409,U,s,0,0,n,100070009000,1.15431296825409,U,s,0,0,n,101994432250,1.15431296825409 + ,U,s,0,0,n,103918855500,1.15431296825409,U,s,0,0,n,105843278750,1.15431296825409,U + ,s,0,0,n,107767702000,1.15431296825409,U,a,n,109692125250,1.15431296825409,U,a,n,111616548500 + ,1.15431296825409,U,a,n,113540971750,1.15431296825409,U,a,n,115465395000,1.15431296825409 + ,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,-111.502075195313,U,s,1605.6298828125,1605.6298828125,n,78901353250,-39.0257263183594 + ,U,s,1605.6298828125,0,n,80825776500,0,U,s,0,0,n,82750199750,0,U,s,0,0,n,84674623000 + ,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0,n,90447892750,0,U,s,0,0 + ,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500,0,U,s,0,0,n,98145585750 + ,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0,0,n,103918855500,0,U,s + ,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250,0,U,a,n,111616548500 + ,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,0,n,98145585750,0,U,s,0,0,n,100070009000,0,U,s,0,0,n,101994432250,0,U,s,0 + ,0,n,103918855500,0,U,s,0,0,n,105843278750,0,U,s,0,0,n,107767702000,0,U,a,n,109692125250 + ,0,U,a,n,111616548500,0,U,a,n,113540971750,0,U,a,n,115465395000,0,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,0,U,s,0,0,n,78901353250,0,U,s,0,0,n,80825776500,0,U,s,0,0,n,82750199750 + ,0,U,s,0,0,n,84674623000,0,U,s,0,0,n,86599046250,0,U,s,0,0,n,88523469500,0,U,s,0,0 + ,n,90447892750,0,U,s,0,0,n,92372316000,0,U,s,0,0,n,94296739250,0,U,s,0,0,n,96221162500 + ,0,U,s,0,-267.092803955078,n,98145585750,-6.02813625335693,U,s,-267.092803955078,-400.639221191406 + ,n,100070009000,-20.4029216766357,U,s,-400.639221191406,-400.639221191406,n,101994432250 + ,-37.5599250793457,U,s,-400.639221191406,-267.092803955078,n,103918855500,-51.9347114562988 + ,U,s,-267.092803955078,0,n,105843278750,-57.9628486633301,U,s,0,0,n,107767702000,-57.9628486633301 + ,U,a,n,109692125250,-57.9628486633301,U,a,n,111616548500,-57.9628486633301,U,a,n,113540971750 + ,-57.9628486633301,U,a,n,115465395000,-57.9628486633301,U,a,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,-1.19376635551453 + ,n,82750199750,0.973945558071136,U,s,-1.19376635551453,-2.04645657539368,n,84674623000 + ,0.905256628990173,U,s,-2.04645657539368,-2.55807065963745,n,86599046250,0.808144688606262 + ,U,s,-2.55807065963745,-2.72860884666443,n,88523469500,0.696821212768555,U,s,-2.72860884666443 + ,-2.55807065963745,n,90447892750,0.585497796535492,U,s,-2.55807065963745,-2.04645657539368 + ,n,92372316000,0.488385856151581,U,s,-2.04645657539368,-1.19376635551453,n,94296739250 + ,0.419696927070618,U,s,-1.19376635551453,0,n,96221162500,0.393642485141754,U,s,0,2.33973336219788 + ,n,98145585750,0.446448981761932,U,s,2.33973336219788,3.5096001625061,n,100070009000 + ,0.572372138500214,U,s,3.5096001625061,3.50959992408752,n,101994432250,0.722667455673218 + ,U,s,3.50959992408752,2.33973336219788,n,103918855500,0.848590672016144,U,s,2.33973336219788 + ,0,n,105843278750,0.901397109031677,U,s,0,0,n,107767702000,0.901397109031677,U,a,n + ,109692125250,0.901397109031677,U,a,n,111616548500,0.901397109031677,U,a,n,113540971750 + ,0.901397109031677,U,a,n,115465395000,0.901397109031677,U,a,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,s,0,0,n,100070009000,1,U,s,0,0,n,101994432250,1,U,s,0 + ,0,n,103918855500,1,U,s,0,0,n,105843278750,1,U,s,0,0,n,107767702000,1,U,a,n,109692125250 + ,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,U,s,0,0,n,78901353250,1,U,s,0,0,n,80825776500,1,U,s,0,0,n,82750199750 + ,1,U,s,0,0,n,84674623000,1,U,s,0,0,n,86599046250,1,U,s,0,0,n,88523469500,1,U,s,0,0 + ,n,90447892750,1,U,s,0,0,n,92372316000,1,U,s,0,0,n,94296739250,1,U,s,0,0,n,96221162500 + ,1,U,s,0,0,n,98145585750,1,U,s,0,0,n,100070009000,1,U,s,0,0,n,101994432250,1,U,s,0 + ,0,n,103918855500,1,U,s,0,0,n,105843278750,1,U,s,0,0,n,107767702000,1,U,a,n,109692125250 + ,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 76976930000,1,C,s,78901353250,1,C,s,80825776500,1,C,s,82750199750,1,C,s,84674623000,1,C,s,86599046250 + ,1,C,s,88523469500,1,C,s,90447892750,1,C,s,92372316000,1,C,s,94296739250,1,C,s,96221162500,1,C,s,98145585750 + ,1,C,s,100070009000,1,C,s,101994432250,1,C,s,103918855500,1,C,s,105843278750,1,C,s,107767702000,1,U,a + ,n,109692125250,1,U,a,n,111616548500,1,U,a,n,113540971750,1,U,a,n,115465395000,1,U,a,n + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_game_sausage_6100_ascii_spin.fbx b/modules/ufbx/data/maya_game_sausage_6100_ascii_spin.fbx new file mode 100644 index 0000000..5e5bb72 --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_6100_ascii_spin.fbx @@ -0,0 +1,1259 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 52 + Second: 12 + Millisecond: 80 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 5 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1.23333332718325,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292 + ,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5 + ,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336 + ,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321 + ,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307 + ,-0.5 + PolygonVertexIndex: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13 + ,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22 + ,18,19,23,-23,20,23,19,-17 + Edges: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0 + ,81,16,10 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07 + ,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0 + ,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1 + ,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355 + ,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355 + ,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + ,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355 + ,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355 + ,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0 + ,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1 + ,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678 + ,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355 + ,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858 + ,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232 + ,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + + UVIndex: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22 + ,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35 + ,34,29,31,37,35,33,36,30,27 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::joint1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint1_ncl1_1" + } + Model: "Model::joint2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint2_ncl1_1" + } + Model: "Model::joint3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1.15431302203923,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint3_ncl1_1" + } + Model: "Model::joint4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.07370048859635,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint4_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_spin.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_spin.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "04/04/2020 12:52:12.078" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_spin.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "04/04/2020 12:52:12.078" + Property: "Original|ApplicationActiveProject", "KString", "", "W:\Temp\ufbx_test_source" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } + Pose: "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 4 + PoseNode: { + Node: "Model::pCube1" + Matrix: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + PoseNode: { + Node: "Model::joint3" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + PoseNode: { + Node: "Model::joint2" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + PoseNode: { + Node: "Model::joint1" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + Deformer: "Deformer::Skin pCube1", "Skin" { + Version: 100 + Properties60: { + } + Link_DeformAcuracy: 50 + } + Deformer: "SubDeformer::Cluster joint3", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 2,3,4,5,20,21,22,23 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16 + ,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + Deformer: "SubDeformer::Cluster joint2", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 12,13,14,15,16,17,18,19 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + Deformer: "SubDeformer::Cluster joint1", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 0,1,6,7,8,9,10,11 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::joint1", "Model::Scene" + Connect: "OO", "Deformer::Skin pCube1", "Model::pCube1" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Model::joint2", "Model::joint1" + Connect: "OO", "Model::joint3", "Model::joint2" + Connect: "OO", "Model::joint4", "Model::joint3" + Connect: "OO", "SubDeformer::Cluster joint3", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint2", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint1", "Deformer::Skin pCube1" + Connect: "OO", "Model::joint3", "SubDeformer::Cluster joint3" + Connect: "OO", "Model::joint2", "SubDeformer::Cluster joint2" + Connect: "OO", "Model::joint1", "SubDeformer::Cluster joint1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "spin" { + FileName: "spin.tak" + LocalTime: 38488465000,76976930000 + ReferenceTime: 38488465000,76976930000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::joint1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,149.82275390625,n,40412888250,3.26072907447815,U,s,149.82275390625 + ,259.492004394531,n,42337311500,11.9275407791138,U,s,259.492004394531,329.007690429688 + ,n,44261734750,24.32737159729,U,s,329.007690429688,358.369903564453,n,46186158000 + ,38.7871589660645,U,s,358.369903564453,347.578552246094,n,48110581250,53.6338386535645 + ,U,s,347.578552246094,296.633758544922,n,50035004500,67.1943511962891,U,s,296.633758544922 + ,205.535415649414,n,51959427750,77.7956314086914,U,s,205.535415649414,219.148864746094 + ,n,53883851000,86.6626281738281,U,s,219.148864746094,227.172958374023,n,55808274250 + ,95.9804077148438,U,s,227.172958374023,229.607711791992,n,57732697500,105.516067504883 + ,U,s,229.607711791992,226.453094482422,n,59657120750,115.036743164063,U,s,226.453094482422 + ,217.70915222168,n,61581544000,124.309539794922,U,s,217.70915222168,203.375885009766 + ,n,63505967250,133.101547241211,U,s,203.375885009766,183.453262329102,n,65430390500 + ,141.179901123047,U,s,183.453262329102,157.941299438477,n,67354813750,148.31169128418 + ,U,s,157.941299438477,126.839996337891,n,69279237000,154.264038085938,U,s,126.839996337891 + ,90.1493377685547,n,71203660250,158.804061889648,U,s,90.1493377685547,47.8693237304688 + ,n,73128083500,161.698852539063,U,s,47.8693237304688,0,n,75052506750,162.715545654297 + ,U,s,0,-1735.63256835938,n,76976930000,120.53003692627,U,s,-1735.63256835938,-1735.63232421875 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,C,s,40412888250,1,C,s,42337311500,1,C,s,44261734750,1,C,s,46186158000,1,C,s,48110581250 + ,1,C,s,50035004500,1,C,s,51959427750,1,C,s,53883851000,1,C,s,55808274250,1,C,s,57732697500,1,C,s,59657120750 + ,1,C,s,61581544000,1,C,s,63505967250,1,C,s,65430390500,1,C,s,67354813750,1,C,s,69279237000,1,C,s,71203660250 + ,1,C,s,73128083500,1,C,s,75052506750,1,C,s,76976930000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint2" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,125.077178955078,n,40412888250,2.72235298156738,U,s,125.077178955078 + ,216.579727172852,n,42337311500,9.95678329467773,U,s,216.579727172852,274.507659912109 + ,n,44261734750,20.304349899292,U,s,274.507659912109,298.860961914063,n,46186158000 + ,32.3661079406738,U,s,298.860961914063,289.639678955078,n,48110581250,44.7431144714355 + ,U,s,289.639678955078,246.84375,n,50035004500,56.0364303588867,U,s,246.84375,170.473205566406 + ,n,51959427750,64.8471145629883,U,s,170.473205566406,181.46858215332,n,53883851000 + ,72.1951446533203,U,s,181.46858215332,187.881896972656,n,55808274250,79.9058609008789 + ,U,s,187.881896972656,189.713104248047,n,57732697500,87.788330078125,U,s,189.713104248047 + ,186.962219238281,n,59657120750,95.6516418457031,U,s,186.962219238281,179.629257202148 + ,n,61581544000,103.304870605469,U,s,179.629257202148,167.714202880859,n,63505967250 + ,110.557098388672,U,s,167.714202880859,151.217056274414,n,65430390500,117.217422485352 + ,U,s,151.217056274414,130.137802124023,n,67354813750,123.094886779785,U,s,130.137802124023 + ,104.476486206055,n,69279237000,127.998588562012,U,s,104.476486206055,74.2330932617188 + ,n,71203660250,131.73762512207,U,s,74.2330932617188,39.4075775146484,n,73128083500 + ,134.121032714844,U,s,39.4075775146484,0,n,75052506750,134.957946777344,U,s,0,-1439.55151367188 + ,n,76976930000,99.9688491821289,U,s,-1439.55151367188,-1439.55139160156,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,C,s,40412888250,1,C,s,42337311500,1,C,s,44261734750,1,C,s,46186158000,1,C,s,48110581250 + ,1,C,s,50035004500,1,C,s,51959427750,1,C,s,53883851000,1,C,s,55808274250,1,C,s,57732697500,1,C,s,59657120750 + ,1,C,s,61581544000,1,C,s,63505967250,1,C,s,65430390500,1,C,s,67354813750,1,C,s,69279237000,1,C,s,71203660250 + ,1,C,s,73128083500,1,C,s,75052506750,1,C,s,76976930000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint3" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.15431296825409 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1.15431296825409,U,s,0,0,n,40412888250,1.15431296825409,U,s,0,0,n,42337311500 + ,1.15431296825409,U,s,0,0,n,44261734750,1.15431296825409,U,s,0,0,n,46186158000,1.15431296825409 + ,U,s,0,0,n,48110581250,1.15431296825409,U,s,0,0,n,50035004500,1.15431296825409,U,s + ,0,0,n,51959427750,1.15431296825409,U,s,0,0,n,53883851000,1.15431296825409,U,s,0,0 + ,n,55808274250,1.15431296825409,U,s,0,0,n,57732697500,1.15431296825409,U,s,0,0,n,59657120750 + ,1.15431296825409,U,s,0,0,n,61581544000,1.15431296825409,U,s,0,0,n,63505967250,1.15431296825409 + ,U,s,0,0,n,65430390500,1.15431296825409,U,s,0,0,n,67354813750,1.15431296825409,U,s + ,0,0,n,69279237000,1.15431296825409,U,s,0,0,n,71203660250,1.15431296825409,U,s,0,0 + ,n,73128083500,1.15431296825409,U,s,0,0,n,75052506750,1.15431296825409,U,s,0,0,n,76976930000 + ,1.15431296825409,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,-144.71484375,n,40412888250,-3.15094780921936,U,s,-144.71484375 + ,-250.245712280273,n,42337311500,-11.5153474807739,U,s,-250.245712280273,-316.592590332031 + ,n,44261734750,-23.4605312347412,U,s,-316.592590332031,-343.755523681641,n,46186158000 + ,-37.3538398742676,U,s,-343.755523681641,-331.734436035156,n,48110581250,-51.5626029968262 + ,U,s,-331.734436035156,-280.529418945313,n,50035004500,-64.4541549682617,U,s,-280.529418945313 + ,-190.140380859375,n,51959427750,-74.3958282470703,U,s,-190.140380859375,-200.509140014648 + ,n,53883851000,-82.550910949707,U,s,-200.509140014648,-206.111785888672,n,55808274250 + ,-91.0387268066406,U,s,-206.111785888672,-206.948272705078,n,57732697500,-99.6606903076172 + ,U,s,-206.948272705078,-203.018600463867,n,59657120750,-108.218223571777,U,s,-203.018600463867 + ,-194.322784423828,n,61581544000,-116.512718200684,U,s,-194.322784423828,-180.860824584961 + ,n,63505967250,-124.345596313477,U,s,-180.860824584961,-162.632720947266,n,65430390500 + ,-131.518249511719,U,s,-162.632720947266,-139.638458251953,n,67354813750,-137.832122802734 + ,U,s,-139.638458251953,-111.878067016602,n,69279237000,-143.088592529297,U,s,-111.878067016602 + ,-79.3515319824219,n,71203660250,-147.089096069336,U,s,-79.3515319824219,-42.0588302612305 + ,n,73128083500,-149.635025024414,U,s,-42.0588302612305,0,n,75052506750,-150.527801513672 + ,U,s,0,1605.6298828125,n,76976930000,-111.502075195313,U,s,1605.6298828125,1605.6298828125 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,0,U,s,0,0,n,40412888250,0,U,s,0,0,n,42337311500,0,U,s,0,0,n,44261734750 + ,0,U,s,0,0,n,46186158000,0,U,s,0,0,n,48110581250,0,U,s,0,0,n,50035004500,0,U,s,0,0 + ,n,51959427750,0,U,s,0,0,n,53883851000,0,U,s,0,0,n,55808274250,0,U,s,0,0,n,57732697500 + ,0,U,s,0,0,n,59657120750,0,U,s,0,0,n,61581544000,0,U,s,0,0,n,63505967250,0,U,s,0,0 + ,n,65430390500,0,U,s,0,0,n,67354813750,0,U,s,0,0,n,69279237000,0,U,s,0,0,n,71203660250 + ,0,U,s,0,0,n,73128083500,0,U,s,0,0,n,75052506750,0,U,s,0,0,n,76976930000,0,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,U,s,0,0,n,40412888250,1,U,s,0,0,n,42337311500,1,U,s,0,0,n,44261734750 + ,1,U,s,0,0,n,46186158000,1,U,s,0,0,n,48110581250,1,U,s,0,0,n,50035004500,1,U,s,0,0 + ,n,51959427750,1,U,s,0,0,n,53883851000,1,U,s,0,0,n,55808274250,1,U,s,0,0,n,57732697500 + ,1,U,s,0,0,n,59657120750,1,U,s,0,0,n,61581544000,1,U,s,0,0,n,63505967250,1,U,s,0,0 + ,n,65430390500,1,U,s,0,0,n,67354813750,1,U,s,0,0,n,69279237000,1,U,s,0,0,n,71203660250 + ,1,U,s,0,0,n,73128083500,1,U,s,0,0,n,75052506750,1,U,s,0,0,n,76976930000,1,U,s,0,0 + ,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 21 + Key: 38488465000,1,C,s,40412888250,1,C,s,42337311500,1,C,s,44261734750,1,C,s,46186158000,1,C,s,48110581250 + ,1,C,s,50035004500,1,C,s,51959427750,1,C,s,53883851000,1,C,s,55808274250,1,C,s,57732697500,1,C,s,59657120750 + ,1,C,s,61581544000,1,C,s,63505967250,1,C,s,65430390500,1,C,s,67354813750,1,C,s,69279237000,1,C,s,71203660250 + ,1,C,s,73128083500,1,C,s,75052506750,1,C,s,76976930000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_game_sausage_6100_ascii_wiggle.fbx b/modules/ufbx/data/maya_game_sausage_6100_ascii_wiggle.fbx new file mode 100644 index 0000000..8e7fa7a --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_6100_ascii_wiggle.fbx @@ -0,0 +1,1230 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 52 + Second: 11 + Millisecond: 993 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 5 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1.23333332718325,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292 + ,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5 + ,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336 + ,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321 + ,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307 + ,-0.5 + PolygonVertexIndex: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13 + ,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22 + ,18,19,23,-23,20,23,19,-17 + Edges: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0 + ,81,16,10 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07 + ,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0 + ,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1 + ,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355 + ,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355 + ,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + ,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355 + ,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355 + ,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0 + ,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1 + ,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678 + ,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355 + ,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858 + ,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232 + ,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + + UVIndex: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22 + ,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35 + ,34,29,31,37,35,33,36,30,27 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::joint1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint1_ncl1_1" + } + Model: "Model::joint2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint2_ncl1_1" + } + Model: "Model::joint3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1.15431302203923,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint3_ncl1_1" + } + Model: "Model::joint4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.07370048859635,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint4_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_wiggle.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_wiggle.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "04/04/2020 12:52:11.991" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_wiggle.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "04/04/2020 12:52:11.991" + Property: "Original|ApplicationActiveProject", "KString", "", "W:\Temp\ufbx_test_source" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } + Pose: "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 4 + PoseNode: { + Node: "Model::pCube1" + Matrix: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + PoseNode: { + Node: "Model::joint3" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + PoseNode: { + Node: "Model::joint2" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + PoseNode: { + Node: "Model::joint1" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + Deformer: "Deformer::Skin pCube1", "Skin" { + Version: 100 + Properties60: { + } + Link_DeformAcuracy: 50 + } + Deformer: "SubDeformer::Cluster joint3", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 2,3,4,5,20,21,22,23 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16 + ,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + Deformer: "SubDeformer::Cluster joint2", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 12,13,14,15,16,17,18,19 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + Deformer: "SubDeformer::Cluster joint1", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 0,1,6,7,8,9,10,11 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::joint1", "Model::Scene" + Connect: "OO", "Deformer::Skin pCube1", "Model::pCube1" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Model::joint2", "Model::joint1" + Connect: "OO", "Model::joint3", "Model::joint2" + Connect: "OO", "Model::joint4", "Model::joint3" + Connect: "OO", "SubDeformer::Cluster joint3", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint2", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint1", "Deformer::Skin pCube1" + Connect: "OO", "Model::joint3", "SubDeformer::Cluster joint3" + Connect: "OO", "Model::joint2", "SubDeformer::Cluster joint2" + Connect: "OO", "Model::joint1", "SubDeformer::Cluster joint1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "wiggle" { + FileName: "wiggle.tak" + LocalTime: 1924423250,38488465000 + ReferenceTime: 1924423250,38488465000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::joint1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,149.82275390625,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,-46.0104217529297,U,s,0,109.28205871582,n,3848846500,-43.6388473510742 + ,U,s,109.28205871582,191.243606567383,n,5773269750,-37.2830352783203,U,s,191.243606567383 + ,245.884628295898,n,7697693000,-28.0813331604004,U,s,245.884628295898,273.205139160156 + ,n,9622116250,-17.1721038818359,U,s,273.205139160156,273.205139160156,n,11546539500 + ,-5.69369220733643,U,s,273.205139160156,245.884628295898,n,13470962750,5.21554279327393 + ,U,s,245.884628295898,191.243591308594,n,15395386000,14.4172439575195,U,s,191.243591308594 + ,109.282051086426,n,17319809250,20.7730579376221,U,s,109.282051086426,0,n,19244232500 + ,23.1446304321289,U,s,0,-107.657447814941,n,21168655750,20.7949638366699,U,s,-107.657447814941 + ,-184.555633544922,n,23093079000,14.6003875732422,U,s,-184.555633544922,-230.694549560547 + ,n,25017502250,5.84254026412964,U,s,-230.694549560547,-246.074172973633,n,26941925500 + ,-4.19694519042969,U,s,-246.074172973633,-230.694549560547,n,28866348750,-14.2364292144775 + ,U,s,-230.694549560547,-184.555633544922,n,30790772000,-22.9942779541016,U,s,-184.555633544922 + ,-107.657447814941,n,32715195250,-29.1888523101807,U,s,-107.657447814941,0,n,34639618500 + ,-31.5385189056396,U,s,0,567.693298339844,n,36564041750,-15.7692594528198,U,s,567.693298339844 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint2" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,125.077178955078,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,67.3346862792969,U,s,0,-221.996795654297,n,3848846500,62.5170440673828 + ,U,s,-221.996795654297,-388.494384765625,n,5773269750,49.6057739257813,U,s,-388.494384765625 + ,-499.492767333984,n,7697693000,30.9133358001709,U,s,-499.492767333984,-554.992004394531 + ,n,9622116250,8.75220108032227,U,s,-554.992004394531,-554.992004394531,n,11546539500 + ,-14.5651721954346,U,s,-554.992004394531,-499.492767333984,n,13470962750,-36.7263107299805 + ,U,s,-499.492767333984,-388.494384765625,n,15395386000,-55.4187469482422,U,s,-388.494384765625 + ,-221.996780395508,n,17319809250,-68.3300170898438,U,s,-221.996780395508,0,n,19244232500 + ,-73.1476593017578,U,s,0,245.2412109375,n,21168655750,-67.7951736450195,U,s,245.2412109375 + ,420.413482666016,n,23093079000,-53.6840744018555,U,s,420.413482666016,525.516906738281 + ,n,25017502250,-33.7338943481445,U,s,525.516906738281,560.551330566406,n,26941925500 + ,-10.8641777038574,U,s,560.551330566406,525.516906738281,n,28866348750,12.0055389404297 + ,U,s,525.516906738281,420.413482666016,n,30790772000,31.9557151794434,U,s,420.413482666016 + ,245.2412109375,n,32715195250,46.0668182373047,U,s,245.2412109375,0,n,34639618500 + ,51.419303894043,U,s,0,-925.547424316406,n,36564041750,25.7096519470215,U,s,-925.547424316406 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint3" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.15431296825409 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1.15431296825409,U,s,0,0,n,3848846500,1.15431296825409,U,s,0,0,n,5773269750 + ,1.15431296825409,U,s,0,0,n,7697693000,1.15431296825409,U,s,0,0,n,9622116250,1.15431296825409 + ,U,s,0,0,n,11546539500,1.15431296825409,U,s,0,0,n,13470962750,1.15431296825409,U,s + ,0,0,n,15395386000,1.15431296825409,U,s,0,0,n,17319809250,1.15431296825409,U,s,0,0 + ,n,19244232500,1.15431296825409,U,s,0,0,n,21168655750,1.15431296825409,U,s,0,0,n,23093079000 + ,1.15431296825409,U,s,0,0,n,25017502250,1.15431296825409,U,s,0,0,n,26941925500,1.15431296825409 + ,U,s,0,0,n,28866348750,1.15431296825409,U,s,0,0,n,30790772000,1.15431296825409,U,s + ,0,0,n,32715195250,1.15431296825409,U,s,0,0,n,34639618500,1.15431296825409,U,s,0,0 + ,n,36564041750,1.15431296825409,U,s,0,0,n,38488465000,1.15431296825409,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,-144.71484375,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,39.172191619873,U,s,0,-124.010719299316,n,3848846500,36.4809875488281,U + ,s,-124.010719299316,-217.018753051758,n,5773269750,29.2685585021973,U,s,-217.018753051758 + ,-279.024108886719,n,7697693000,18.8266830444336,U,s,-279.024108886719,-310.026794433594 + ,n,9622116250,6.44714164733887,U,s,-310.026794433594,-310.026794433594,n,11546539500 + ,-6.57829093933105,U,s,-310.026794433594,-279.024108886719,n,13470962750,-18.9578304290771 + ,U,s,-279.024108886719,-217.018753051758,n,15395386000,-29.3997058868408,U,s,-217.018753051758 + ,-124.010711669922,n,17319809250,-36.6121368408203,U,s,-124.010711669922,0,n,19244232500 + ,-39.3033409118652,U,s,0,151.208068847656,n,21168655750,-36.0031623840332,U,s,151.208068847656 + ,259.213806152344,n,23093079000,-27.3027019500732,U,s,259.213806152344,324.017303466797 + ,n,25017502250,-15.0020446777344,U,s,324.017303466797,345.618438720703,n,26941925500 + ,-0.901290893554688,U,s,345.618438720703,324.017303466797,n,28866348750,13.199462890625 + ,U,s,324.017303466797,259.213806152344,n,30790772000,25.5001182556152,U,s,259.213806152344 + ,151.208068847656,n,32715195250,34.2005805969238,U,s,151.208068847656,0,n,34639618500 + ,37.5007591247559,U,s,0,-675.013671875,n,36564041750,18.7503795623779,U,s,-675.013671875 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_game_sausage_6100_binary.fbx b/modules/ufbx/data/maya_game_sausage_6100_binary.fbx new file mode 100644 index 0000000..7f76cac Binary files /dev/null and b/modules/ufbx/data/maya_game_sausage_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_game_sausage_6100_binary_combined.fbx b/modules/ufbx/data/maya_game_sausage_6100_binary_combined.fbx new file mode 100644 index 0000000..9654b05 Binary files /dev/null and b/modules/ufbx/data/maya_game_sausage_6100_binary_combined.fbx differ diff --git a/modules/ufbx/data/maya_game_sausage_6100_binary_deform.fbx b/modules/ufbx/data/maya_game_sausage_6100_binary_deform.fbx new file mode 100644 index 0000000..5e46d62 Binary files /dev/null and b/modules/ufbx/data/maya_game_sausage_6100_binary_deform.fbx differ diff --git a/modules/ufbx/data/maya_game_sausage_6100_binary_spin.fbx b/modules/ufbx/data/maya_game_sausage_6100_binary_spin.fbx new file mode 100644 index 0000000..c8faefb Binary files /dev/null and b/modules/ufbx/data/maya_game_sausage_6100_binary_spin.fbx differ diff --git a/modules/ufbx/data/maya_game_sausage_6100_binary_wiggle.fbx b/modules/ufbx/data/maya_game_sausage_6100_binary_wiggle.fbx new file mode 100644 index 0000000..e801e95 Binary files /dev/null and b/modules/ufbx/data/maya_game_sausage_6100_binary_wiggle.fbx differ diff --git a/modules/ufbx/data/maya_game_sausage_7500_ascii.fbx b/modules/ufbx/data/maya_game_sausage_7500_ascii.fbx new file mode 100644 index 0000000..b3c0c04 --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_7500_ascii.fbx @@ -0,0 +1,603 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 48 + Second: 47 + Millisecond: 311 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:47.308" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:47.308" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2519378084720, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 17 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 5 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2518685506688, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *72 { + a: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307,-0.5 + } + PolygonVertexIndex: *88 { + a: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22,18,19,23,-23,20,23,19,-17 + } + Edges: *44 { + a: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0,81,16,10 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *264 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + NormalsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *264 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1.78813934326172e-07,1,0,1.78813934326172e-07,1,0,1.78813934326172e-07,1,0,1.78813934326172e-07,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,-1.78813934326172e-07,0,1,-1.49011611938477e-07,0,1,-1.19209289550781e-07,0,1,-1.39077513949815e-07,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-1.78813934326172e-07,0,1,-1.49011611938477e-07,0,1,-1.19209289550781e-07,0,1,-1.39077513949815e-07,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,-1.39077513949815e-07,0,1,-1.19209289550781e-07,0,1,-7.94728620689966e-08,0,1,-1.19209289550781e-07,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-1.39077513949815e-07,0,1,-1.19209289550781e-07,0,1,-7.94728620689966e-08,0,1,-1.19209289550781e-07,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,-1.19209289550781e-07,0,1,-7.94728620689966e-08,0,1,0,0,1,-3.97364310344983e-08,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-1.19209289550781e-07,0,1,-7.94728620689966e-08,-0,1,0,0,1,-3.97364310344983e-08,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,-3.97364310344983e-08,0,1,0,0,1,0,0,1,0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-3.97364310344983e-08,-0,1,0,-0,1,0,-0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0 + } + BinormalsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *264 { + a: 1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,1.78813934326172e-07,1,0,1.49011611938477e-07,1,0,1.19209289550781e-07,1,0,1.39077513949815e-07,1,1,-0,-0,1,-0,0,1,-0,0,1,-0,0,0,-1.78813934326172e-07,-1,0,-1.49011611938477e-07,-1,0,-1.19209289550781e-07,-1,0,-1.39077513949815e-07,-1,1,0,0,1,0,0,1,0,0,1,0,0,0,1.39077513949815e-07,1,0,1.19209289550781e-07,1,0,7.94728620689966e-08,1,0,1.19209289550781e-07,1,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1.39077513949815e-07,-1,0,-1.19209289550781e-07,-1,0,-7.94728620689966e-08,-1,0,-1.19209289550781e-07,-1,1,0,0,1,0,0,1,0,0,1,0,0,0,1.19209289550781e-07,1,0,7.94728620689966e-08,1,0,-0,1,0,3.97364310344983e-08,1,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1.19209289550781e-07,-1,0,-7.94728620689966e-08,-1,0,0,-1,0,-3.97364310344983e-08,-1,1,0,0,1,0,0,1,0,0,1,0,0,0,3.97364310344983e-08,1,0,-0,1,0,-0,1,0,-0,1,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-3.97364310344983e-08,-1,0,0,-1,0,0,-1,0,0,-1,1,0,0,1,0,0,1,0,0,1,0,0 + } + TangentsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *76 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + } + UVIndex: *88 { + a: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35,34,29,31,37,35,33,36,30,27 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *44 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2517875174288, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2517875173904, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2517875175824, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2517875176592, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + Model: 2520147267648, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1.23333332718325,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2519924281408, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519950487616, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519261335616, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.15431302203923,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519866011712, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.07370048859635,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 2517703382240, "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 4 + PoseNode: { + Node: 2520147267648 + Matrix: *16 { + a: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 2519261335616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + } + PoseNode: { + Node: 2519950487616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + } + PoseNode: { + Node: 2519924281408 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + } + Material: 2520702827376, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2517867820672, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "Linear" + } + Deformer: 2517866673152, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 2,3,4,5,20,21,22,23 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + } + Deformer: 2519914550608, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 12,13,14,15,16,17,18,19 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + } + Deformer: 2519914546096, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 0,1,6,7,8,9,10,11 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2520147267648,0 + + ;Model::joint1, Model::RootNode + C: "OO",2519924281408,0 + + ;Deformer::, Geometry:: + C: "OO",2517867820672,2518685506688 + + ;Geometry::, Model::pCube1 + C: "OO",2518685506688,2520147267648 + + ;Material::lambert1, Model::pCube1 + C: "OO",2520702827376,2520147267648 + + ;NodeAttribute::, Model::joint1 + C: "OO",2517875174288,2519924281408 + + ;Model::joint2, Model::joint1 + C: "OO",2519950487616,2519924281408 + + ;NodeAttribute::, Model::joint2 + C: "OO",2517875173904,2519950487616 + + ;Model::joint3, Model::joint2 + C: "OO",2519261335616,2519950487616 + + ;NodeAttribute::, Model::joint3 + C: "OO",2517875175824,2519261335616 + + ;Model::joint4, Model::joint3 + C: "OO",2519866011712,2519261335616 + + ;NodeAttribute::, Model::joint4 + C: "OO",2517875176592,2519866011712 + + ;SubDeformer::, Deformer:: + C: "OO",2517866673152,2517867820672 + + ;SubDeformer::, Deformer:: + C: "OO",2519914550608,2517867820672 + + ;SubDeformer::, Deformer:: + C: "OO",2519914546096,2517867820672 + + ;Model::joint3, SubDeformer:: + C: "OO",2519261335616,2517866673152 + + ;Model::joint2, SubDeformer:: + C: "OO",2519950487616,2519914550608 + + ;Model::joint1, SubDeformer:: + C: "OO",2519924281408,2519914546096 +} diff --git a/modules/ufbx/data/maya_game_sausage_7500_ascii_combined.fbx b/modules/ufbx/data/maya_game_sausage_7500_ascii_combined.fbx new file mode 100644 index 0000000..a37fcca --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_7500_ascii_combined.fbx @@ -0,0 +1,3370 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 50 + Second: 13 + Millisecond: 420 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_combined.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_combined.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:50:13.417" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_combined.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:50:13.417" + P: "Original|ApplicationActiveProject", "KString", "", "", "W:\Temp\ufbx_test_source" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2519914552256, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 158 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 5 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } + ObjectType: "AnimationStack" { + Count: 3 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 3 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 45 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 90 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2518830167680, "Geometry::", "Mesh" { + Vertices: *72 { + a: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307,-0.5 + } + PolygonVertexIndex: *88 { + a: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22,18,19,23,-23,20,23,19,-17 + } + Edges: *44 { + a: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0,81,16,10 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *264 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + NormalsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *76 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + } + UVIndex: *88 { + a: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35,34,29,31,37,35,33,36,30,27 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *44 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2516901313840, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901323632, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901329776, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901319792, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + Model: 2520543580240, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1.23333332718325,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2520439423056, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519924281408, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519950487616, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1.15431302203923,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519866011712, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.07370048859635,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 2519376665984, "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 4 + PoseNode: { + Node: 2520543580240 + Matrix: *16 { + a: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 2519950487616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + } + PoseNode: { + Node: 2519924281408 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + } + PoseNode: { + Node: 2520439423056 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + } + Material: 2520702825376, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2516901321520, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "Linear" + } + Deformer: 2519910039680, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 2,3,4,5,20,21,22,23 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + } + Deformer: 2519910047952, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 12,13,14,15,16,17,18,19 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + } + Deformer: 2519910054720, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 0,1,6,7,8,9,10,11 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + } + AnimationStack: 2520543545760, "AnimStack::wiggle", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationStack: 2520543565520, "AnimStack::spin", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",38488465000 + P: "LocalStop", "KTime", "Time", "",76976930000 + P: "ReferenceStart", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",76976930000 + } + } + AnimationStack: 2520543564480, "AnimStack::deform", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",76976930000 + P: "LocalStop", "KTime", "Time", "",115465395000 + P: "ReferenceStart", "KTime", "Time", "",76976930000 + P: "ReferenceStop", "KTime", "Time", "",115465395000 + } + } + AnimationCurve: 2516914087504, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914090704, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914084144, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914091984, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914091184, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914085264, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914084304, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914094224, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914093264, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914087664, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: -46.01042,-43.63885,-37.28304,-28.08133,-17.1721,-5.693692,5.215543,14.41724,20.77306,23.14463,20.79496,14.60039,5.84254,-4.196945,-14.23643,-22.99428,-29.18885,-31.53852,-15.76926,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914093744, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914084944, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914090064, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914088304, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914091024, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914085424, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914088944, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914089264, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914085584, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914092304, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 67.33469,62.51704,49.60577,30.91334,8.752201,-14.56517,-36.72631,-55.41875,-68.33002,-73.14766,-67.79517,-53.68407,-33.73389,-10.86418,12.00554,31.95572,46.06682,51.4193,25.70965,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914089424, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914091664, "AnimCurve::", "" { + Default: 1.15431296825409 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914090544, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914084464, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914093104, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914091344, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914094064, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914091824, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914085904, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914092624, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 39.17219,36.48099,29.26856,18.82668,6.447142,-6.578291,-18.95783,-29.39971,-36.61214,-39.30334,-36.00316,-27.3027,-15.00204,-0.9012909,13.19946,25.50012,34.20058,37.50076,18.75038,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914086384, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914086544, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914101904, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914094864, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914096464, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914096624, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914098704, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914104144, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,3.260729,11.92754,24.32737,38.78716,53.63384,67.19435,77.79563,86.66263,95.98041,105.5161,115.0367,124.3095,133.1015,141.1799,148.3117,154.264,158.8041,161.6989,162.7155,120.53 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914099344, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914097904, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914097264, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914100304, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914094704, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914099664, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914097424, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914097744, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914098864, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914100144, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,2.722353,9.956783,20.30435,32.36611,44.74311,56.03643,64.84711,72.19514,79.90586,87.78833,95.65164,103.3049,110.5571,117.2174,123.0949,127.9986,131.7376,134.121,134.9579,99.96885 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914099024, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914102544, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914099824, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914100464, "AnimCurve::", "" { + Default: 1.15431296825409 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914102704, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914100784, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914095184, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914104464, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914095504, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914095664, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,-3.150948,-11.51535,-23.46053,-37.35384,-51.5626,-64.45415,-74.39583,-82.55091,-91.03873,-99.66069,-108.2182,-116.5127,-124.3456,-131.5182,-137.8321,-143.0886,-147.0891,-149.635,-150.5278,-111.5021 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914101584, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914102864, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914103024, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 2,8456 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914103344, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914095984, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914096144, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914106704, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,0.9782091,0.9207601,0.8395392,0.7464323,0.6533254,0.5721045,0.5146556,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914104624, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914112784, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914105584, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 120.53,42.18551,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914106864, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914104784, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914112464, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 2,8456 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914111664, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914111824, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0.06791492,0.2298659,0.4231622,0.5851131,0.6530281,0.6530281,0.6530281,0.6530281,0.6530281,0.6530281 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914110384, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914110704, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,0.9744193,0.9069792,0.811633,0.7023336,0.5930341,0.4976879,0.4302479,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914110864, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914107984, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914107504, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 99.96885,34.98909,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914108624, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914108464, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914111024, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 2,8456 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914108784, "AnimCurve::", "" { + Default: 1.15431296825409 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914109904, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914109584, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914111184, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,0.9739456,0.9052566,0.8081447,0.6968212,0.5854978,0.4883859,0.4196969,0.3936425,0.446449,0.5723721,0.7226675,0.8485907,0.9013971,0.9013971,0.9013971,0.9013971,0.9013971,0.9013971 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914111344, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914111504, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914113104, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: -111.5021,-39.02573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914113424, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914113904, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,-6.028136,-20.40292,-37.55993,-51.93471,-57.96285,-57.96285,-57.96285,-57.96285,-57.96285,-57.96285 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurveNode: 2520543546384, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543547008, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543546592, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543561360, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543562400, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543558656, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543567392, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543565104, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543559488, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543559696, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543565312, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543564272, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543559072, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.15431302203923 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543567600, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543561568, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543559904, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543560944, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543566768, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543565728, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543564896, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543556784, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543559280, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543560528, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543563856, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543560112, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543558448, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543561152, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543560320, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.15431302203923 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543565936, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543566144, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543557616, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543560736, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543563648, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543556992, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543561776, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543557200, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543566352, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543564064, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543558864, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543564688, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543561984, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543563232, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543566560, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.15431302203923 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543557408, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543557824, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2518375244544, "AnimLayer::BaseLayer", "" { + } + AnimationLayer: 2518375243024, "AnimLayer::BaseLayer", "" { + } + AnimationLayer: 2518375238464, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2520543580240,0 + + ;Model::joint1, Model::RootNode + C: "OO",2520439423056,0 + + ;Deformer::, Geometry:: + C: "OO",2516901321520,2518830167680 + + ;Geometry::, Model::pCube1 + C: "OO",2518830167680,2520543580240 + + ;Material::lambert1, Model::pCube1 + C: "OO",2520702825376,2520543580240 + + ;NodeAttribute::, Model::joint1 + C: "OO",2516901313840,2520439423056 + + ;Model::joint2, Model::joint1 + C: "OO",2519924281408,2520439423056 + + ;AnimCurveNode::T, Model::joint1 + C: "OP",2520543562400,2520439423056, "Lcl Translation" + + ;AnimCurveNode::T, Model::joint1 + C: "OP",2520543564896,2520439423056, "Lcl Translation" + + ;AnimCurveNode::T, Model::joint1 + C: "OP",2520543561776,2520439423056, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint1 + C: "OP",2520543567392,2520439423056, "Lcl Rotation" + + ;AnimCurveNode::R, Model::joint1 + C: "OP",2520543559280,2520439423056, "Lcl Rotation" + + ;AnimCurveNode::R, Model::joint1 + C: "OP",2520543566352,2520439423056, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint1 + C: "OP",2520543558656,2520439423056, "Lcl Scaling" + + ;AnimCurveNode::S, Model::joint1 + C: "OP",2520543556784,2520439423056, "Lcl Scaling" + + ;AnimCurveNode::S, Model::joint1 + C: "OP",2520543557200,2520439423056, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint1 + C: "OP",2520543561360,2520439423056, "Visibility" + + ;AnimCurveNode::Visibility, Model::joint1 + C: "OP",2520543565728,2520439423056, "Visibility" + + ;AnimCurveNode::Visibility, Model::joint1 + C: "OP",2520543556992,2520439423056, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",2520543546384,2520439423056, "lockInfluenceWeights" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",2520543559904,2520439423056, "lockInfluenceWeights" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",2520543557616,2520439423056, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint2 + C: "OO",2516901323632,2519924281408 + + ;Model::joint3, Model::joint2 + C: "OO",2519950487616,2519924281408 + + ;AnimCurveNode::T, Model::joint2 + C: "OP",2520543559488,2519924281408, "Lcl Translation" + + ;AnimCurveNode::T, Model::joint2 + C: "OP",2520543563856,2519924281408, "Lcl Translation" + + ;AnimCurveNode::T, Model::joint2 + C: "OP",2520543558864,2519924281408, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint2 + C: "OP",2520543565312,2519924281408, "Lcl Rotation" + + ;AnimCurveNode::R, Model::joint2 + C: "OP",2520543558448,2519924281408, "Lcl Rotation" + + ;AnimCurveNode::R, Model::joint2 + C: "OP",2520543561984,2519924281408, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint2 + C: "OP",2520543559696,2519924281408, "Lcl Scaling" + + ;AnimCurveNode::S, Model::joint2 + C: "OP",2520543560112,2519924281408, "Lcl Scaling" + + ;AnimCurveNode::S, Model::joint2 + C: "OP",2520543564688,2519924281408, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint2 + C: "OP",2520543565104,2519924281408, "Visibility" + + ;AnimCurveNode::Visibility, Model::joint2 + C: "OP",2520543560528,2519924281408, "Visibility" + + ;AnimCurveNode::Visibility, Model::joint2 + C: "OP",2520543564064,2519924281408, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",2520543547008,2519924281408, "lockInfluenceWeights" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",2520543560944,2519924281408, "lockInfluenceWeights" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",2520543560736,2519924281408, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint3 + C: "OO",2516901329776,2519950487616 + + ;Model::joint4, Model::joint3 + C: "OO",2519866011712,2519950487616 + + ;AnimCurveNode::T, Model::joint3 + C: "OP",2520543559072,2519950487616, "Lcl Translation" + + ;AnimCurveNode::T, Model::joint3 + C: "OP",2520543560320,2519950487616, "Lcl Translation" + + ;AnimCurveNode::T, Model::joint3 + C: "OP",2520543566560,2519950487616, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint3 + C: "OP",2520543561568,2519950487616, "Lcl Rotation" + + ;AnimCurveNode::R, Model::joint3 + C: "OP",2520543566144,2519950487616, "Lcl Rotation" + + ;AnimCurveNode::R, Model::joint3 + C: "OP",2520543557824,2519950487616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint3 + C: "OP",2520543567600,2519950487616, "Lcl Scaling" + + ;AnimCurveNode::S, Model::joint3 + C: "OP",2520543565936,2519950487616, "Lcl Scaling" + + ;AnimCurveNode::S, Model::joint3 + C: "OP",2520543557408,2519950487616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint3 + C: "OP",2520543564272,2519950487616, "Visibility" + + ;AnimCurveNode::Visibility, Model::joint3 + C: "OP",2520543561152,2519950487616, "Visibility" + + ;AnimCurveNode::Visibility, Model::joint3 + C: "OP",2520543563232,2519950487616, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",2520543546592,2519950487616, "lockInfluenceWeights" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",2520543566768,2519950487616, "lockInfluenceWeights" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",2520543563648,2519950487616, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint4 + C: "OO",2516901319792,2519866011712 + + ;SubDeformer::, Deformer:: + C: "OO",2519910039680,2516901321520 + + ;SubDeformer::, Deformer:: + C: "OO",2519910047952,2516901321520 + + ;SubDeformer::, Deformer:: + C: "OO",2519910054720,2516901321520 + + ;Model::joint3, SubDeformer:: + C: "OO",2519950487616,2519910039680 + + ;Model::joint2, SubDeformer:: + C: "OO",2519924281408,2519910047952 + + ;Model::joint1, SubDeformer:: + C: "OO",2520439423056,2519910054720 + + ;AnimLayer::BaseLayer, AnimStack::wiggle + C: "OO",2518375244544,2520543545760 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543546384,2518375244544 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543547008,2518375244544 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543546592,2518375244544 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543561360,2518375244544 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543562400,2518375244544 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543558656,2518375244544 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543567392,2518375244544 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543565104,2518375244544 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543559488,2518375244544 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543559696,2518375244544 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543565312,2518375244544 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543564272,2518375244544 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543559072,2518375244544 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543567600,2518375244544 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543561568,2518375244544 + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914087504,2520543561360, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914090704,2520543562400, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914084144,2520543562400, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914091984,2520543562400, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914091184,2520543558656, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914085264,2520543558656, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914084304,2520543558656, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914094224,2520543567392, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914093264,2520543567392, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914087664,2520543567392, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914093744,2520543565104, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914084944,2520543559488, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914090064,2520543559488, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914088304,2520543559488, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914091024,2520543559696, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914085424,2520543559696, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914088944,2520543559696, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914089264,2520543565312, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914085584,2520543565312, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914092304,2520543565312, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914089424,2520543564272, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914091664,2520543559072, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914090544,2520543559072, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914084464,2520543559072, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914093104,2520543567600, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914091344,2520543567600, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914094064,2520543567600, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914091824,2520543561568, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914085904,2520543561568, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914092624,2520543561568, "d|Z" + + ;AnimLayer::BaseLayer, AnimStack::spin + C: "OO",2518375243024,2520543565520 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543559904,2518375243024 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543560944,2518375243024 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543566768,2518375243024 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543565728,2518375243024 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543564896,2518375243024 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543556784,2518375243024 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543559280,2518375243024 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543560528,2518375243024 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543563856,2518375243024 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543560112,2518375243024 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543558448,2518375243024 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543561152,2518375243024 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543560320,2518375243024 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543565936,2518375243024 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543566144,2518375243024 + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914086384,2520543565728, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914086544,2520543564896, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914101904,2520543564896, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914094864,2520543564896, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914096464,2520543556784, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914096624,2520543556784, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914098704,2520543556784, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914104144,2520543559280, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914099344,2520543559280, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914097904,2520543559280, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914097264,2520543560528, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914100304,2520543563856, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914094704,2520543563856, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914099664,2520543563856, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914097424,2520543560112, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914097744,2520543560112, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914098864,2520543560112, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914100144,2520543558448, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914099024,2520543558448, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914102544,2520543558448, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914099824,2520543561152, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914100464,2520543560320, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914102704,2520543560320, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914100784,2520543560320, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914095184,2520543565936, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914104464,2520543565936, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914095504,2520543565936, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914095664,2520543566144, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914101584,2520543566144, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914102864,2520543566144, "d|Z" + + ;AnimLayer::BaseLayer, AnimStack::deform + C: "OO",2518375238464,2520543564480 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543557616,2518375238464 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543560736,2518375238464 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543563648,2518375238464 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543556992,2518375238464 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543561776,2518375238464 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543557200,2518375238464 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543566352,2518375238464 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543564064,2518375238464 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543558864,2518375238464 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543564688,2518375238464 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543561984,2518375238464 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543563232,2518375238464 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543566560,2518375238464 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543557408,2518375238464 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543557824,2518375238464 + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914103024,2520543556992, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914103344,2520543561776, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914095984,2520543561776, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914096144,2520543561776, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914106704,2520543557200, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914104624,2520543557200, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914112784,2520543557200, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914105584,2520543566352, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914106864,2520543566352, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914104784,2520543566352, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914112464,2520543564064, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914111664,2520543558864, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914111824,2520543558864, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914110384,2520543558864, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914110704,2520543564688, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914110864,2520543564688, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914107984,2520543564688, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914107504,2520543561984, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914108624,2520543561984, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914108464,2520543561984, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914111024,2520543563232, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914108784,2520543566560, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914109904,2520543566560, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914109584,2520543566560, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914111184,2520543557408, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914111344,2520543557408, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914111504,2520543557408, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914113104,2520543557824, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914113424,2520543557824, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914113904,2520543557824, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "wiggle" { + FileName: "wiggle.tak" + LocalTime: 1924423250,38488465000 + ReferenceTime: 1924423250,38488465000 + } + Take: "spin" { + FileName: "spin.tak" + LocalTime: 38488465000,76976930000 + ReferenceTime: 38488465000,76976930000 + } + Take: "deform" { + FileName: "deform.tak" + LocalTime: 76976930000,115465395000 + ReferenceTime: 76976930000,115465395000 + } +} diff --git a/modules/ufbx/data/maya_game_sausage_7500_ascii_deform.fbx b/modules/ufbx/data/maya_game_sausage_7500_ascii_deform.fbx new file mode 100644 index 0000000..46f39dd --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_7500_ascii_deform.fbx @@ -0,0 +1,1528 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 48 + Second: 4 + Millisecond: 85 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_deform.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_deform.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:04.083" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_deform.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:04.083" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2516915527024, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 64 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 5 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 15 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 30 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2516906940624, "Geometry::", "Mesh" { + Vertices: *72 { + a: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307,-0.5 + } + PolygonVertexIndex: *88 { + a: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22,18,19,23,-23,20,23,19,-17 + } + Edges: *44 { + a: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0,81,16,10 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *264 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + NormalsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *76 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + } + UVIndex: *88 { + a: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35,34,29,31,37,35,33,36,30,27 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *44 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2516901326704, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901323056, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901322864, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901327856, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + Model: 2519866011712, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1.23333332718325,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2519261335616, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519950487616, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519924281408, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1.15431302203923,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2520147267648, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.07370048859635,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 2519376663168, "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 4 + PoseNode: { + Node: 2519866011712 + Matrix: *16 { + a: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 2519924281408 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + } + PoseNode: { + Node: 2519950487616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + } + PoseNode: { + Node: 2519261335616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + } + Material: 2520702837376, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2516901323632, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "Linear" + } + Deformer: 2517866673152, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 2,3,4,5,20,21,22,23 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + } + Deformer: 2519593291888, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 12,13,14,15,16,17,18,19 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + } + Deformer: 2519593297152, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 0,1,6,7,8,9,10,11 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + } + AnimationStack: 2520543566144, "AnimStack::deform", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",76976930000 + P: "LocalStop", "KTime", "Time", "",115465395000 + P: "ReferenceStart", "KTime", "Time", "",76976930000 + P: "ReferenceStop", "KTime", "Time", "",115465395000 + } + } + AnimationCurve: 2516914034704, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 2,8456 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914034864, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914033904, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914036464, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914039504, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,0.9782091,0.9207601,0.8395392,0.7464323,0.6533254,0.5721045,0.5146556,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646,0.4928646 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914038224, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914034384, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914038064, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 120.53,42.18551,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914032944, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914038384, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 11,10 + } + } + AnimationCurve: 2516914035504, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 2,8456 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914042704, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914039984, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0.06791492,0.2298659,0.4231622,0.5851131,0.6530281,0.6530281,0.6530281,0.6530281,0.6530281,0.6530281 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914036304, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914035824, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,0.9744193,0.9069792,0.811633,0.7023336,0.5930341,0.4976879,0.4302479,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672,0.4046672 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914040304, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914038704, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914036784, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 99.96885,34.98909,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914039184, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914041104, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914041424, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 2,8456 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914042224, "AnimCurve::", "" { + Default: 1.15431296825409 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914034544, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914041904, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914042064, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,0.9739456,0.9052566,0.8081447,0.6968212,0.5854978,0.4883859,0.4196969,0.3936425,0.446449,0.5723721,0.7226675,0.8485907,0.9013971,0.9013971,0.9013971,0.9013971,0.9013971,0.9013971 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914042864, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914043344, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914051664, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: -111.5021,-39.02573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914052624, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurve: 2516914052304, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 76976930000,78901353250,80825776500,82750199750,84674623000,86599046250,88523469500,90447892750,92372316000,94296739250,96221162500,98145585750,100070009000,101994432250,103918855500,105843278750,107767702000,109692125250,111616548500,113540971750,115465395000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,-6.028136,-20.40292,-37.55993,-51.93471,-57.96285,-57.96285,-57.96285,-57.96285,-57.96285,-57.96285 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 16,5 + } + } + AnimationCurveNode: 2520543557616, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543558864, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543565728, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543566352, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543560944, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543564272, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543566768, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543557824, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543558448, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543558656, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543559072, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543559280, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543562400, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.15431302203923 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543559488, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543561152, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2518375211712, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2519866011712,0 + + ;Model::joint1, Model::RootNode + C: "OO",2519261335616,0 + + ;Deformer::, Geometry:: + C: "OO",2516901323632,2516906940624 + + ;Geometry::, Model::pCube1 + C: "OO",2516906940624,2519866011712 + + ;Material::lambert1, Model::pCube1 + C: "OO",2520702837376,2519866011712 + + ;NodeAttribute::, Model::joint1 + C: "OO",2516901326704,2519261335616 + + ;Model::joint2, Model::joint1 + C: "OO",2519950487616,2519261335616 + + ;AnimCurveNode::T, Model::joint1 + C: "OP",2520543560944,2519261335616, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint1 + C: "OP",2520543566768,2519261335616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint1 + C: "OP",2520543564272,2519261335616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint1 + C: "OP",2520543566352,2519261335616, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",2520543557616,2519261335616, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint2 + C: "OO",2516901323056,2519950487616 + + ;Model::joint3, Model::joint2 + C: "OO",2519924281408,2519950487616 + + ;AnimCurveNode::T, Model::joint2 + C: "OP",2520543558448,2519950487616, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint2 + C: "OP",2520543559072,2519950487616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint2 + C: "OP",2520543558656,2519950487616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint2 + C: "OP",2520543557824,2519950487616, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",2520543558864,2519950487616, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint3 + C: "OO",2516901322864,2519924281408 + + ;Model::joint4, Model::joint3 + C: "OO",2520147267648,2519924281408 + + ;AnimCurveNode::T, Model::joint3 + C: "OP",2520543562400,2519924281408, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint3 + C: "OP",2520543561152,2519924281408, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint3 + C: "OP",2520543559488,2519924281408, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint3 + C: "OP",2520543559280,2519924281408, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",2520543565728,2519924281408, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint4 + C: "OO",2516901327856,2520147267648 + + ;SubDeformer::, Deformer:: + C: "OO",2517866673152,2516901323632 + + ;SubDeformer::, Deformer:: + C: "OO",2519593291888,2516901323632 + + ;SubDeformer::, Deformer:: + C: "OO",2519593297152,2516901323632 + + ;Model::joint3, SubDeformer:: + C: "OO",2519924281408,2517866673152 + + ;Model::joint2, SubDeformer:: + C: "OO",2519950487616,2519593291888 + + ;Model::joint1, SubDeformer:: + C: "OO",2519261335616,2519593297152 + + ;AnimLayer::BaseLayer, AnimStack::deform + C: "OO",2518375211712,2520543566144 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543557616,2518375211712 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543558864,2518375211712 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543565728,2518375211712 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543566352,2518375211712 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543560944,2518375211712 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543564272,2518375211712 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543566768,2518375211712 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543557824,2518375211712 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543558448,2518375211712 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543558656,2518375211712 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543559072,2518375211712 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543559280,2518375211712 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543562400,2518375211712 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543559488,2518375211712 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543561152,2518375211712 + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914034704,2520543566352, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914034864,2520543560944, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914033904,2520543560944, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914036464,2520543560944, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914039504,2520543564272, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914038224,2520543564272, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914034384,2520543564272, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914038064,2520543566768, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914032944,2520543566768, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914038384,2520543566768, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914035504,2520543557824, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914042704,2520543558448, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914039984,2520543558448, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914036304,2520543558448, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914035824,2520543558656, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914040304,2520543558656, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914038704,2520543558656, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914036784,2520543559072, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914039184,2520543559072, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914041104,2520543559072, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914041424,2520543559280, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914042224,2520543562400, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914034544,2520543562400, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914041904,2520543562400, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914042064,2520543559488, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914042864,2520543559488, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914043344,2520543559488, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914051664,2520543561152, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914052624,2520543561152, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914052304,2520543561152, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "deform" { + FileName: "deform.tak" + LocalTime: 76976930000,115465395000 + ReferenceTime: 76976930000,115465395000 + } +} diff --git a/modules/ufbx/data/maya_game_sausage_7500_ascii_spin.fbx b/modules/ufbx/data/maya_game_sausage_7500_ascii_spin.fbx new file mode 100644 index 0000000..e38602b --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_7500_ascii_spin.fbx @@ -0,0 +1,1528 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 48 + Second: 3 + Millisecond: 968 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_spin.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_spin.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:03.966" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_spin.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:03.966" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2516915531120, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 64 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 5 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 15 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 30 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2516906922704, "Geometry::", "Mesh" { + Vertices: *72 { + a: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307,-0.5 + } + PolygonVertexIndex: *88 { + a: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22,18,19,23,-23,20,23,19,-17 + } + Edges: *44 { + a: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0,81,16,10 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *264 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + NormalsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *76 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + } + UVIndex: *88 { + a: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35,34,29,31,37,35,33,36,30,27 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *44 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2516901312880, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901314608, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901322096, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901324400, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + Model: 2520147267648, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1.23333332718325,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2519924281408, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519950487616, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519261335616, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1.15431302203923,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519866011712, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.07370048859635,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 2519376667040, "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 4 + PoseNode: { + Node: 2520147267648 + Matrix: *16 { + a: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 2519261335616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + } + PoseNode: { + Node: 2519950487616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + } + PoseNode: { + Node: 2519924281408 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + } + Material: 2520702837376, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2516901319984, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "Linear" + } + Deformer: 2517866673152, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 2,3,4,5,20,21,22,23 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + } + Deformer: 2519593297152, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 12,13,14,15,16,17,18,19 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + } + Deformer: 2519593291888, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 0,1,6,7,8,9,10,11 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + } + AnimationStack: 2520543558240, "AnimStack::spin", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",38488465000 + P: "LocalStop", "KTime", "Time", "",76976930000 + P: "ReferenceStart", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",76976930000 + } + } + AnimationCurve: 2516914039824, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914035984, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914035824, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914042544, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914032944, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914040784, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914039504, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914043024, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,3.260729,11.92754,24.32737,38.78716,53.63384,67.19435,77.79563,86.66263,95.98041,105.5161,115.0367,124.3095,133.1015,141.1799,148.3117,154.264,158.8041,161.6989,162.7155,120.53 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914037744, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914033904, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914037904, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914041904, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914035504, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914034064, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914039344, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914033264, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914041744, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914040144, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,2.722353,9.956783,20.30435,32.36611,44.74311,56.03643,64.84711,72.19514,79.90586,87.78833,95.65164,103.3049,110.5571,117.2174,123.0949,127.9986,131.7376,134.121,134.9579,99.96885 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914042384, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914042864, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914038704, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914033424, "AnimCurve::", "" { + Default: 1.15431296825409 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914034864, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914039184, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914034544, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914036144, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914049904, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914047664, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,-3.150948,-11.51535,-23.46053,-37.35384,-51.5626,-64.45415,-74.39583,-82.55091,-91.03873,-99.66069,-108.2182,-116.5127,-124.3456,-131.5182,-137.8321,-143.0886,-147.0891,-149.635,-150.5278,-111.5021 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914046224, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurve: 2516914051344, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *21 { + a: 38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500,59657120750,61581544000,63505967250,65430390500,67354813750,69279237000,71203660250,73128083500,75052506750,76976930000 + } + KeyValueFloat: *21 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 21 + } + } + AnimationCurveNode: 2520543564064, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543559280, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543564896, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543562816, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543563440, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543565312, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543559904, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543565520, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543560112, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543562608, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543558448, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543565728, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543560528, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.15431302203923 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543567184, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543565936, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2518375224176, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2520147267648,0 + + ;Model::joint1, Model::RootNode + C: "OO",2519924281408,0 + + ;Deformer::, Geometry:: + C: "OO",2516901319984,2516906922704 + + ;Geometry::, Model::pCube1 + C: "OO",2516906922704,2520147267648 + + ;Material::lambert1, Model::pCube1 + C: "OO",2520702837376,2520147267648 + + ;NodeAttribute::, Model::joint1 + C: "OO",2516901312880,2519924281408 + + ;Model::joint2, Model::joint1 + C: "OO",2519950487616,2519924281408 + + ;AnimCurveNode::T, Model::joint1 + C: "OP",2520543563440,2519924281408, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint1 + C: "OP",2520543559904,2519924281408, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint1 + C: "OP",2520543565312,2519924281408, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint1 + C: "OP",2520543562816,2519924281408, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",2520543564064,2519924281408, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint2 + C: "OO",2516901314608,2519950487616 + + ;Model::joint3, Model::joint2 + C: "OO",2519261335616,2519950487616 + + ;AnimCurveNode::T, Model::joint2 + C: "OP",2520543560112,2519950487616, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint2 + C: "OP",2520543558448,2519950487616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint2 + C: "OP",2520543562608,2519950487616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint2 + C: "OP",2520543565520,2519950487616, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",2520543559280,2519950487616, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint3 + C: "OO",2516901322096,2519261335616 + + ;Model::joint4, Model::joint3 + C: "OO",2519866011712,2519261335616 + + ;AnimCurveNode::T, Model::joint3 + C: "OP",2520543560528,2519261335616, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint3 + C: "OP",2520543565936,2519261335616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint3 + C: "OP",2520543567184,2519261335616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint3 + C: "OP",2520543565728,2519261335616, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",2520543564896,2519261335616, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint4 + C: "OO",2516901324400,2519866011712 + + ;SubDeformer::, Deformer:: + C: "OO",2517866673152,2516901319984 + + ;SubDeformer::, Deformer:: + C: "OO",2519593297152,2516901319984 + + ;SubDeformer::, Deformer:: + C: "OO",2519593291888,2516901319984 + + ;Model::joint3, SubDeformer:: + C: "OO",2519261335616,2517866673152 + + ;Model::joint2, SubDeformer:: + C: "OO",2519950487616,2519593297152 + + ;Model::joint1, SubDeformer:: + C: "OO",2519924281408,2519593291888 + + ;AnimLayer::BaseLayer, AnimStack::spin + C: "OO",2518375224176,2520543558240 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543564064,2518375224176 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543559280,2518375224176 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543564896,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543562816,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543563440,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543565312,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543559904,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543565520,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543560112,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543562608,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543558448,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543565728,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543560528,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543567184,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543565936,2518375224176 + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914039824,2520543562816, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914035984,2520543563440, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914035824,2520543563440, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914042544,2520543563440, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914032944,2520543565312, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914040784,2520543565312, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914039504,2520543565312, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914043024,2520543559904, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914037744,2520543559904, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914033904,2520543559904, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914037904,2520543565520, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914041904,2520543560112, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914035504,2520543560112, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914034064,2520543560112, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914039344,2520543562608, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914033264,2520543562608, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914041744,2520543562608, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914040144,2520543558448, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914042384,2520543558448, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914042864,2520543558448, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914038704,2520543565728, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914033424,2520543560528, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914034864,2520543560528, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914039184,2520543560528, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914034544,2520543567184, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914036144,2520543567184, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914049904,2520543567184, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914047664,2520543565936, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914046224,2520543565936, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914051344,2520543565936, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "spin" { + FileName: "spin.tak" + LocalTime: 38488465000,76976930000 + ReferenceTime: 38488465000,76976930000 + } +} diff --git a/modules/ufbx/data/maya_game_sausage_7500_ascii_wiggle.fbx b/modules/ufbx/data/maya_game_sausage_7500_ascii_wiggle.fbx new file mode 100644 index 0000000..dd7cfda --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_7500_ascii_wiggle.fbx @@ -0,0 +1,1528 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 48 + Second: 3 + Millisecond: 851 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_wiggle.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_wiggle.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:03.848" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_wiggle.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:03.848" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2520147257712, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 64 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 5 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 15 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 30 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2516906940624, "Geometry::", "Mesh" { + Vertices: *72 { + a: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307,-0.5 + } + PolygonVertexIndex: *88 { + a: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22,18,19,23,-23,20,23,19,-17 + } + Edges: *44 { + a: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0,81,16,10 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *264 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + NormalsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *76 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + } + UVIndex: *88 { + a: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35,34,29,31,37,35,33,36,30,27 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *44 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2516901326896, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901324784, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901323056, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901324592, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + Model: 2519866011712, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1.23333332718325,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2519261335616, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519950487616, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519924281408, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1.15431302203923,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2520147267648, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.07370048859635,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 2519376671616, "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 4 + PoseNode: { + Node: 2519866011712 + Matrix: *16 { + a: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 2519924281408 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + } + PoseNode: { + Node: 2519950487616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + } + PoseNode: { + Node: 2519261335616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + } + Material: 2520702829776, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2516901325168, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "Linear" + } + Deformer: 2517866673152, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 2,3,4,5,20,21,22,23 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + } + Deformer: 2519593291888, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 12,13,14,15,16,17,18,19 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + } + Deformer: 2519593292640, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 0,1,6,7,8,9,10,11 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + } + AnimationStack: 2520543546384, "AnimStack::wiggle", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationCurve: 2516914037264, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914034704, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914037104, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039344, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914041904, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914042224, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914037424, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039024, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914033264, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914038064, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: -46.01042,-43.63885,-37.28304,-28.08133,-17.1721,-5.693692,5.215543,14.41724,20.77306,23.14463,20.79496,14.60039,5.84254,-4.196945,-14.23643,-22.99428,-29.18885,-31.53852,-15.76926,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039824, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914038544, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039664, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914041424, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914034224, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914035504, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914034544, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914035344, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914043664, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914049264, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 67.33469,62.51704,49.60577,30.91334,8.752201,-14.56517,-36.72631,-55.41875,-68.33002,-73.14766,-67.79517,-53.68407,-33.73389,-10.86418,12.00554,31.95572,46.06682,51.4193,25.70965,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914052304, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914047984, "AnimCurve::", "" { + Default: 1.15431296825409 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914047824, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914046544, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914052944, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914052784, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914044464, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914045744, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914051824, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914048784, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 39.17219,36.48099,29.26856,18.82668,6.447142,-6.578291,-18.95783,-29.39971,-36.61214,-39.30334,-36.00316,-27.3027,-15.00204,-0.9012909,13.19946,25.50012,34.20058,37.50076,18.75038,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurveNode: 2520543546592, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543556784, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543560320, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543562192, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543565936, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543566352, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543564064, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543557824, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543561360, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543559488, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543562400, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543557616, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543565520, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.15431302203923 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543560736, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543559696, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2518375224176, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2519866011712,0 + + ;Model::joint1, Model::RootNode + C: "OO",2519261335616,0 + + ;Deformer::, Geometry:: + C: "OO",2516901325168,2516906940624 + + ;Geometry::, Model::pCube1 + C: "OO",2516906940624,2519866011712 + + ;Material::lambert1, Model::pCube1 + C: "OO",2520702829776,2519866011712 + + ;NodeAttribute::, Model::joint1 + C: "OO",2516901326896,2519261335616 + + ;Model::joint2, Model::joint1 + C: "OO",2519950487616,2519261335616 + + ;AnimCurveNode::T, Model::joint1 + C: "OP",2520543565936,2519261335616, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint1 + C: "OP",2520543564064,2519261335616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint1 + C: "OP",2520543566352,2519261335616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint1 + C: "OP",2520543562192,2519261335616, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",2520543546592,2519261335616, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint2 + C: "OO",2516901324784,2519950487616 + + ;Model::joint3, Model::joint2 + C: "OO",2519924281408,2519950487616 + + ;AnimCurveNode::T, Model::joint2 + C: "OP",2520543561360,2519950487616, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint2 + C: "OP",2520543562400,2519950487616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint2 + C: "OP",2520543559488,2519950487616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint2 + C: "OP",2520543557824,2519950487616, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",2520543556784,2519950487616, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint3 + C: "OO",2516901323056,2519924281408 + + ;Model::joint4, Model::joint3 + C: "OO",2520147267648,2519924281408 + + ;AnimCurveNode::T, Model::joint3 + C: "OP",2520543565520,2519924281408, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint3 + C: "OP",2520543559696,2519924281408, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint3 + C: "OP",2520543560736,2519924281408, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint3 + C: "OP",2520543557616,2519924281408, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",2520543560320,2519924281408, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint4 + C: "OO",2516901324592,2520147267648 + + ;SubDeformer::, Deformer:: + C: "OO",2517866673152,2516901325168 + + ;SubDeformer::, Deformer:: + C: "OO",2519593291888,2516901325168 + + ;SubDeformer::, Deformer:: + C: "OO",2519593292640,2516901325168 + + ;Model::joint3, SubDeformer:: + C: "OO",2519924281408,2517866673152 + + ;Model::joint2, SubDeformer:: + C: "OO",2519950487616,2519593291888 + + ;Model::joint1, SubDeformer:: + C: "OO",2519261335616,2519593292640 + + ;AnimLayer::BaseLayer, AnimStack::wiggle + C: "OO",2518375224176,2520543546384 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543546592,2518375224176 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543556784,2518375224176 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543560320,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543562192,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543565936,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543566352,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543564064,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543557824,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543561360,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543559488,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543562400,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543557616,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543565520,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543560736,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543559696,2518375224176 + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914037264,2520543562192, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914034704,2520543565936, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914037104,2520543565936, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914039344,2520543565936, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914041904,2520543566352, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914042224,2520543566352, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914037424,2520543566352, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914039024,2520543564064, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914033264,2520543564064, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914038064,2520543564064, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914039824,2520543557824, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914038544,2520543561360, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914039664,2520543561360, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914041424,2520543561360, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914034224,2520543559488, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914035504,2520543559488, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914034544,2520543559488, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914035344,2520543562400, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914043664,2520543562400, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914049264,2520543562400, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914052304,2520543557616, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914047984,2520543565520, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914047824,2520543565520, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914046544,2520543565520, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914052944,2520543560736, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914052784,2520543560736, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914044464,2520543560736, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914045744,2520543559696, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914051824,2520543559696, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914048784,2520543559696, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "wiggle" { + FileName: "wiggle.tak" + LocalTime: 1924423250,38488465000 + ReferenceTime: 1924423250,38488465000 + } +} diff --git a/modules/ufbx/data/maya_game_sausage_7500_binary.fbx b/modules/ufbx/data/maya_game_sausage_7500_binary.fbx new file mode 100644 index 0000000..b21d291 Binary files /dev/null and b/modules/ufbx/data/maya_game_sausage_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_game_sausage_7500_binary_combined.fbx b/modules/ufbx/data/maya_game_sausage_7500_binary_combined.fbx new file mode 100644 index 0000000..78957de Binary files /dev/null and b/modules/ufbx/data/maya_game_sausage_7500_binary_combined.fbx differ diff --git a/modules/ufbx/data/maya_game_sausage_7500_binary_deform.fbx b/modules/ufbx/data/maya_game_sausage_7500_binary_deform.fbx new file mode 100644 index 0000000..84bdaf8 Binary files /dev/null and b/modules/ufbx/data/maya_game_sausage_7500_binary_deform.fbx differ diff --git a/modules/ufbx/data/maya_game_sausage_7500_binary_spin.fbx b/modules/ufbx/data/maya_game_sausage_7500_binary_spin.fbx new file mode 100644 index 0000000..d616ae1 Binary files /dev/null and b/modules/ufbx/data/maya_game_sausage_7500_binary_spin.fbx differ diff --git a/modules/ufbx/data/maya_game_sausage_7500_binary_wiggle.fbx b/modules/ufbx/data/maya_game_sausage_7500_binary_wiggle.fbx new file mode 100644 index 0000000..8271254 Binary files /dev/null and b/modules/ufbx/data/maya_game_sausage_7500_binary_wiggle.fbx differ diff --git a/modules/ufbx/data/maya_game_sausage_deform_15.obj b/modules/ufbx/data/maya_game_sausage_deform_15.obj new file mode 100644 index 0000000..f366bd8 --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_deform_15.obj @@ -0,0 +1,165 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g skinCluster1Set tweakSet1 +v -0.500000 0.008973 0.500000 +v 0.500000 0.008973 0.500000 +v -0.004569 1.955592 0.500000 +v 0.525900 1.107888 0.500000 +v -0.004569 1.955592 -0.500000 +v 0.525900 1.107888 -0.500000 +v -0.500000 0.008973 -0.500000 +v 0.500000 0.008973 -0.500000 +v -0.500000 0.337404 -0.500000 +v -0.500000 0.337404 0.500000 +v 0.500000 0.337404 0.500000 +v 0.500000 0.337404 -0.500000 +v -1.153028 0.634882 -0.500000 +v -1.153028 0.634882 0.500000 +v -0.153028 0.634882 0.500000 +v -0.153028 0.634882 -0.500000 +v -1.153028 0.904540 -0.500000 +v -1.153028 0.904540 0.500000 +v -0.153028 0.904540 0.500000 +v -0.153028 0.904540 -0.500000 +v -0.513756 1.636958 -0.500000 +v -0.513756 1.636958 0.500000 +v 0.016713 0.789254 0.500000 +v 0.016713 0.789254 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.125000 0.050000 +vt 0.375000 0.700000 +vt 0.375000 0.050000 +vt 0.625000 0.050000 +vt 0.625000 0.700000 +vt 0.875000 0.050000 +vt 0.125000 0.100000 +vt 0.375000 0.650000 +vt 0.375000 0.100000 +vt 0.625000 0.100000 +vt 0.625000 0.650000 +vt 0.875000 0.100000 +vt 0.125000 0.150000 +vt 0.375000 0.600000 +vt 0.375000 0.150000 +vt 0.625000 0.150000 +vt 0.625000 0.600000 +vt 0.875000 0.150000 +vt 0.125000 0.200000 +vt 0.375000 0.550000 +vt 0.375000 0.200000 +vt 0.625000 0.200000 +vt 0.625000 0.550000 +vt 0.875000 0.200000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.847704 0.530469 0.000000 +vn 0.847704 0.530469 0.000000 +vn 0.847704 0.530469 0.000000 +vn 0.847704 0.530469 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.286920 -0.957955 0.000000 +vn 0.286920 -0.957955 0.000000 +vn 0.530469 -0.847704 0.000000 +vn 0.530469 -0.847704 0.000000 +vn -0.675130 0.737698 0.000000 +vn -0.675130 0.737698 0.000000 +vn -0.530469 0.847704 0.000000 +vn -0.530469 0.847704 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.691957 -0.721938 0.000000 +vn -0.691957 -0.721938 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.691957 0.721938 -0.000000 +vn 0.691957 0.721938 -0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.655708 -0.755014 0.000000 +vn -0.655708 -0.755014 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.655708 0.755014 -0.000000 +vn 0.655708 0.755014 -0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.843056 0.537826 0.000000 +vn -0.843056 0.537826 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.672820 -0.739807 0.000000 +vn 0.672820 -0.739807 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +s 1 +g pCube1 +f 22/35/1 23/36/2 4/4/3 3/3/4 +s off +f 3/3/5 4/4/6 6/6/7 5/5/8 +s 2 +f 5/5/9 6/6/10 24/37/11 21/34/12 +s off +f 7/7/13 8/8/14 2/10/15 1/9/16 +s 3 +f 23/36/17 24/38/18 6/12/19 4/4/20 +s 4 +f 21/33/21 22/35/22 3/3/23 5/14/24 +f 7/13/25 1/1/26 10/17/27 9/15/28 +s 1 +f 1/1/29 2/2/30 11/18/31 10/17/32 +s 3 +f 2/2/33 8/11/34 12/20/35 11/18/36 +s 2 +f 9/16/37 12/19/38 8/8/39 7/7/40 +s 4 +f 9/15/28 10/17/27 14/23/41 13/21/42 +s 1 +f 10/17/32 11/18/31 15/24/43 14/23/44 +s 3 +f 11/18/36 12/20/35 16/26/45 15/24/46 +s 2 +f 13/22/47 16/25/48 12/19/38 9/16/37 +s 4 +f 13/21/42 14/23/41 18/29/49 17/27/50 +s 1 +f 14/23/44 15/24/43 19/30/51 18/29/52 +s 3 +f 15/24/46 16/26/45 20/32/53 19/30/54 +s 2 +f 17/28/55 20/31/56 16/25/48 13/22/47 +s 4 +f 17/27/50 18/29/49 22/35/22 21/33/21 +s 1 +f 18/29/52 19/30/51 23/36/2 22/35/1 +s 3 +f 19/30/54 20/32/53 24/38/18 23/36/17 +s 2 +f 21/34/12 24/37/11 20/31/56 17/28/55 diff --git a/modules/ufbx/data/maya_game_sausage_deform_8.obj b/modules/ufbx/data/maya_game_sausage_deform_8.obj new file mode 100644 index 0000000..1c24621 --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_deform_8.obj @@ -0,0 +1,165 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g skinCluster1Set tweakSet1 +v -0.500000 0.010416 0.500000 +v 0.500000 0.010416 0.500000 +v -0.500000 1.730579 0.500000 +v 0.500000 1.730579 0.500000 +v -0.500000 1.730579 -0.500000 +v 0.500000 1.730579 -0.500000 +v -0.500000 0.010416 -0.500000 +v 0.500000 0.010416 -0.500000 +v -0.500000 0.391650 -0.500000 +v -0.500000 0.391650 0.500000 +v 0.500000 0.391650 0.500000 +v 0.500000 0.391650 -0.500000 +v -0.500000 0.746767 -0.500000 +v -0.500000 0.746767 0.500000 +v 0.500000 0.746767 0.500000 +v 0.500000 0.746767 -0.500000 +v -0.500000 1.078412 -0.500000 +v -0.500000 1.078412 0.500000 +v 0.500000 1.078412 0.500000 +v 0.500000 1.078412 -0.500000 +v -0.500000 1.405133 -0.500000 +v -0.500000 1.405133 0.500000 +v 0.500000 1.405133 0.500000 +v 0.500000 1.405133 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.125000 0.050000 +vt 0.375000 0.700000 +vt 0.375000 0.050000 +vt 0.625000 0.050000 +vt 0.625000 0.700000 +vt 0.875000 0.050000 +vt 0.125000 0.100000 +vt 0.375000 0.650000 +vt 0.375000 0.100000 +vt 0.625000 0.100000 +vt 0.625000 0.650000 +vt 0.875000 0.100000 +vt 0.125000 0.150000 +vt 0.375000 0.600000 +vt 0.375000 0.150000 +vt 0.625000 0.150000 +vt 0.625000 0.600000 +vt 0.875000 0.150000 +vt 0.125000 0.200000 +vt 0.375000 0.550000 +vt 0.375000 0.200000 +vt 0.625000 0.200000 +vt 0.625000 0.550000 +vt 0.875000 0.200000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +s 1 +g pCube1 +f 22/35/1 23/36/2 4/4/3 3/3/4 +s off +f 3/3/5 4/4/6 6/6/7 5/5/8 +s 2 +f 5/5/9 6/6/10 24/37/11 21/34/12 +s off +f 7/7/13 8/8/14 2/10/15 1/9/16 +s 3 +f 23/36/17 24/38/18 6/12/19 4/4/20 +s 4 +f 21/33/21 22/35/22 3/3/23 5/14/24 +f 7/13/25 1/1/26 10/17/27 9/15/28 +s 1 +f 1/1/29 2/2/30 11/18/31 10/17/32 +s 3 +f 2/2/33 8/11/34 12/20/35 11/18/36 +s 2 +f 9/16/37 12/19/38 8/8/39 7/7/40 +s 4 +f 9/15/28 10/17/27 14/23/41 13/21/42 +s 1 +f 10/17/32 11/18/31 15/24/43 14/23/44 +s 3 +f 11/18/36 12/20/35 16/26/45 15/24/46 +s 2 +f 13/22/47 16/25/48 12/19/38 9/16/37 +s 4 +f 13/21/42 14/23/41 18/29/49 17/27/50 +s 1 +f 14/23/44 15/24/43 19/30/51 18/29/52 +s 3 +f 15/24/46 16/26/45 20/32/53 19/30/54 +s 2 +f 17/28/55 20/31/56 16/25/48 13/22/47 +s 4 +f 17/27/50 18/29/49 22/35/22 21/33/21 +s 1 +f 18/29/52 19/30/51 23/36/2 22/35/1 +s 3 +f 19/30/54 20/32/53 24/38/18 23/36/17 +s 2 +f 21/34/12 24/37/11 20/31/56 17/28/55 diff --git a/modules/ufbx/data/maya_game_sausage_spin_15.obj b/modules/ufbx/data/maya_game_sausage_spin_15.obj new file mode 100644 index 0000000..f9deb5b --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_spin_15.obj @@ -0,0 +1,165 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g skinCluster1Set tweakSet1 +v 0.688108 0.018206 -0.162810 +v -0.162810 0.018206 -0.688108 +v 0.706888 3.350062 0.017591 +v 0.017591 3.350062 -0.706888 +v -0.017591 3.350062 0.706888 +v -0.706888 3.350062 -0.017591 +v 0.162810 0.018206 0.688108 +v -0.688108 0.018206 0.162810 +v 0.162810 0.684577 0.688108 +v 0.688108 0.684577 -0.162810 +v -0.162810 0.684577 -0.688108 +v -0.688108 0.684577 0.162810 +v 0.487576 1.350948 -0.512123 +v -0.512123 1.350948 -0.487576 +v -0.487576 1.350948 0.512123 +v 0.512123 1.350948 0.487576 +v 0.487576 2.017319 -0.512123 +v -0.512123 2.017319 -0.487576 +v -0.487576 2.017319 0.512123 +v 0.512123 2.017319 0.487576 +v -0.017591 2.683691 0.706888 +v 0.706888 2.683691 0.017591 +v 0.017591 2.683691 -0.706888 +v -0.706888 2.683691 -0.017591 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.125000 0.050000 +vt 0.375000 0.700000 +vt 0.375000 0.050000 +vt 0.625000 0.050000 +vt 0.625000 0.700000 +vt 0.875000 0.050000 +vt 0.125000 0.100000 +vt 0.375000 0.650000 +vt 0.375000 0.100000 +vt 0.625000 0.100000 +vt 0.625000 0.650000 +vt 0.875000 0.100000 +vt 0.125000 0.150000 +vt 0.375000 0.600000 +vt 0.375000 0.150000 +vt 0.625000 0.150000 +vt 0.625000 0.600000 +vt 0.875000 0.150000 +vt 0.125000 0.200000 +vt 0.375000 0.550000 +vt 0.375000 0.200000 +vt 0.625000 0.200000 +vt 0.625000 0.550000 +vt 0.875000 0.200000 +vn 0.641094 0.000000 -0.767462 +vn 0.550820 0.000000 -0.834624 +vn 0.724479 0.000000 -0.689297 +vn 0.724479 0.000000 -0.689297 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.724479 0.000000 0.689297 +vn -0.724479 0.000000 0.689297 +vn -0.641094 0.000000 0.767462 +vn -0.550820 0.000000 0.834624 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 -1.000000 -0.000000 +vn -0.767462 -0.000000 -0.641094 +vn -0.834624 -0.000000 -0.550820 +vn -0.689297 0.000000 -0.724479 +vn -0.689297 0.000000 -0.724479 +vn 0.767462 -0.000000 0.641094 +vn 0.834624 -0.000000 0.550820 +vn 0.689297 0.000000 0.724479 +vn 0.689297 0.000000 0.724479 +vn 0.850918 0.000000 0.525298 +vn 0.850918 0.000000 0.525298 +vn 0.964310 0.000000 0.264777 +vn 0.908921 0.000000 0.416969 +vn 0.525298 0.000000 -0.850918 +vn 0.525298 0.000000 -0.850918 +vn 0.264777 0.000000 -0.964310 +vn 0.416969 0.000000 -0.908921 +vn -0.850918 0.000000 -0.525298 +vn -0.850918 0.000000 -0.525298 +vn -0.964310 0.000000 -0.264777 +vn -0.908921 0.000000 -0.416969 +vn -0.264777 0.000000 0.964310 +vn -0.416969 0.000000 0.908921 +vn -0.525298 0.000000 0.850918 +vn -0.525298 0.000000 0.850918 +vn 0.098249 0.000000 -0.995162 +vn 0.257606 0.000000 -0.966250 +vn -0.995162 0.000000 -0.098249 +vn -0.966250 0.000000 -0.257606 +vn -0.098249 0.000000 0.995162 +vn -0.257606 0.000000 0.966250 +vn 0.995162 0.000000 0.098249 +vn 0.966250 0.000000 0.257606 +vn 0.089686 -0.000000 -0.995970 +vn 0.201004 -0.000000 -0.979590 +vn -0.995970 0.000000 -0.089686 +vn -0.979591 0.000000 -0.201004 +vn -0.089686 -0.000000 0.995970 +vn -0.201004 -0.000000 0.979590 +vn 0.995970 0.000000 0.089686 +vn 0.979590 0.000000 0.201004 +s 1 +g pCube1 +f 22/35/1 23/36/2 4/4/3 3/3/4 +s off +f 3/3/5 4/4/6 6/6/7 5/5/8 +s 2 +f 5/5/9 6/6/10 24/37/11 21/34/12 +s off +f 7/7/13 8/8/14 2/10/15 1/9/16 +s 3 +f 23/36/17 24/38/18 6/12/19 4/4/20 +s 4 +f 21/33/21 22/35/22 3/3/23 5/14/24 +f 7/13/25 1/1/26 10/17/27 9/15/28 +s 1 +f 1/1/29 2/2/30 11/18/31 10/17/32 +s 3 +f 2/2/33 8/11/34 12/20/35 11/18/36 +s 2 +f 9/16/37 12/19/38 8/8/39 7/7/40 +s 4 +f 9/15/28 10/17/27 14/23/41 13/21/42 +s 1 +f 10/17/32 11/18/31 15/24/43 14/23/44 +s 3 +f 11/18/36 12/20/35 16/26/45 15/24/46 +s 2 +f 13/22/47 16/25/48 12/19/38 9/16/37 +s 4 +f 13/21/42 14/23/41 18/29/49 17/27/50 +s 1 +f 14/23/44 15/24/43 19/30/51 18/29/52 +s 3 +f 15/24/46 16/26/45 20/32/53 19/30/54 +s 2 +f 17/28/55 20/31/56 16/25/48 13/22/47 +s 4 +f 17/27/50 18/29/49 22/35/22 21/33/21 +s 1 +f 18/29/52 19/30/51 23/36/2 22/35/1 +s 3 +f 19/30/54 20/32/53 24/38/18 23/36/17 +s 2 +f 21/34/12 24/37/11 20/31/56 17/28/55 diff --git a/modules/ufbx/data/maya_game_sausage_spin_7.obj b/modules/ufbx/data/maya_game_sausage_spin_7.obj new file mode 100644 index 0000000..05ea4db --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_spin_7.obj @@ -0,0 +1,165 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g skinCluster1Set tweakSet1 +v 0.383000 0.018206 0.594400 +v 0.594400 0.018206 -0.383000 +v 0.279091 3.350062 0.649698 +v 0.649698 3.350062 -0.279091 +v -0.649698 3.350062 0.279091 +v -0.279091 3.350062 -0.649698 +v -0.594400 0.018206 0.383000 +v -0.383000 0.018206 -0.594400 +v -0.594400 0.684577 0.383000 +v 0.383000 0.684577 0.594400 +v 0.594400 0.684577 -0.383000 +v -0.383000 0.684577 -0.594400 +v 0.094042 1.350948 0.700825 +v 0.700825 1.350948 -0.094042 +v -0.094042 1.350948 -0.700825 +v -0.700825 1.350948 0.094042 +v 0.094042 2.017319 0.700825 +v 0.700825 2.017319 -0.094042 +v -0.094042 2.017319 -0.700825 +v -0.700825 2.017319 0.094042 +v -0.649698 2.683691 0.279091 +v 0.279091 2.683691 0.649698 +v 0.649698 2.683691 -0.279091 +v -0.279091 2.683691 -0.649698 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.125000 0.050000 +vt 0.375000 0.700000 +vt 0.375000 0.050000 +vt 0.625000 0.050000 +vt 0.625000 0.700000 +vt 0.875000 0.050000 +vt 0.125000 0.100000 +vt 0.375000 0.650000 +vt 0.375000 0.100000 +vt 0.625000 0.100000 +vt 0.625000 0.650000 +vt 0.875000 0.100000 +vt 0.125000 0.150000 +vt 0.375000 0.600000 +vt 0.375000 0.150000 +vt 0.625000 0.150000 +vt 0.625000 0.600000 +vt 0.875000 0.150000 +vt 0.125000 0.200000 +vt 0.375000 0.550000 +vt 0.375000 0.200000 +vt 0.625000 0.200000 +vt 0.625000 0.550000 +vt 0.875000 0.200000 +vn 0.972055 0.000000 0.234756 +vn 0.996691 0.000000 0.081283 +vn 0.928790 0.000000 0.370607 +vn 0.928790 0.000000 0.370607 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.928790 0.000000 -0.370607 +vn -0.928790 0.000000 -0.370607 +vn -0.972055 0.000000 -0.234756 +vn -0.996691 0.000000 -0.081283 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.234756 0.000000 -0.972055 +vn 0.081283 0.000000 -0.996691 +vn 0.370607 0.000000 -0.928790 +vn 0.370607 0.000000 -0.928790 +vn -0.234756 0.000000 0.972055 +vn -0.081283 0.000000 0.996691 +vn -0.370607 0.000000 0.928790 +vn -0.370607 0.000000 0.928790 +vn -0.211399 0.000000 0.977400 +vn -0.211399 0.000000 0.977400 +vn 0.060898 0.000000 0.998144 +vn -0.068971 0.000000 0.997619 +vn 0.977400 0.000000 0.211399 +vn 0.977400 0.000000 0.211399 +vn 0.998144 -0.000000 -0.060898 +vn 0.997619 -0.000000 0.068971 +vn 0.211399 0.000000 -0.977400 +vn 0.211399 0.000000 -0.977400 +vn -0.060898 0.000000 -0.998144 +vn 0.068971 0.000000 -0.997619 +vn -0.998144 -0.000000 0.060898 +vn -0.997619 -0.000000 -0.068971 +vn -0.977400 0.000000 -0.211399 +vn -0.977400 0.000000 -0.211399 +vn 0.699579 0.000000 0.714555 +vn 0.601076 0.000000 0.799192 +vn 0.714555 -0.000000 -0.699579 +vn 0.799192 -0.000000 -0.601076 +vn -0.699579 0.000000 -0.714555 +vn -0.601076 0.000000 -0.799192 +vn -0.714555 -0.000000 0.699579 +vn -0.799192 -0.000000 0.601076 +vn 0.700497 0.000000 0.713656 +vn 0.581442 0.000000 0.813588 +vn 0.713656 0.000000 -0.700497 +vn 0.813588 0.000000 -0.581441 +vn -0.700497 0.000000 -0.713656 +vn -0.581442 0.000000 -0.813588 +vn -0.713655 0.000000 0.700497 +vn -0.813588 0.000000 0.581442 +s 1 +g pCube1 +f 22/35/1 23/36/2 4/4/3 3/3/4 +s off +f 3/3/5 4/4/6 6/6/7 5/5/8 +s 2 +f 5/5/9 6/6/10 24/37/11 21/34/12 +s off +f 7/7/13 8/8/14 2/10/15 1/9/16 +s 3 +f 23/36/17 24/38/18 6/12/19 4/4/20 +s 4 +f 21/33/21 22/35/22 3/3/23 5/14/24 +f 7/13/25 1/1/26 10/17/27 9/15/28 +s 1 +f 1/1/29 2/2/30 11/18/31 10/17/32 +s 3 +f 2/2/33 8/11/34 12/20/35 11/18/36 +s 2 +f 9/16/37 12/19/38 8/8/39 7/7/40 +s 4 +f 9/15/28 10/17/27 14/23/41 13/21/42 +s 1 +f 10/17/32 11/18/31 15/24/43 14/23/44 +s 3 +f 11/18/36 12/20/35 16/26/45 15/24/46 +s 2 +f 13/22/47 16/25/48 12/19/38 9/16/37 +s 4 +f 13/21/42 14/23/41 18/29/49 17/27/50 +s 1 +f 14/23/44 15/24/43 19/30/51 18/29/52 +s 3 +f 15/24/46 16/26/45 20/32/53 19/30/54 +s 2 +f 17/28/55 20/31/56 16/25/48 13/22/47 +s 4 +f 17/27/50 18/29/49 22/35/22 21/33/21 +s 1 +f 18/29/52 19/30/51 23/36/2 22/35/1 +s 3 +f 19/30/54 20/32/53 24/38/18 23/36/17 +s 2 +f 21/34/12 24/37/11 20/31/56 17/28/55 diff --git a/modules/ufbx/data/maya_game_sausage_wiggle_10.obj b/modules/ufbx/data/maya_game_sausage_wiggle_10.obj new file mode 100644 index 0000000..6f74e5e --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_wiggle_10.obj @@ -0,0 +1,165 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g skinCluster1Set tweakSet1 +v -0.466914 -0.179786 0.500000 +v 0.452602 0.213268 0.500000 +v 1.680849 2.175886 0.500000 +v 1.692955 1.175959 0.500000 +v 1.680849 2.175886 -0.500000 +v 1.692955 1.175959 -0.500000 +v -0.466914 -0.179786 -0.500000 +v 0.452602 0.213268 -0.500000 +v -0.728833 0.432953 -0.500000 +v -0.728833 0.432953 0.500000 +v 0.190682 0.826006 0.500000 +v 0.190682 0.826006 -0.500000 +v -0.445573 1.528126 -0.500000 +v -0.445573 1.528126 0.500000 +v 0.197174 0.762047 0.500000 +v 0.197174 0.762047 -0.500000 +v 0.064919 1.956434 -0.500000 +v 0.064919 1.956434 0.500000 +v 0.707667 1.190356 0.500000 +v 0.707667 1.190356 -0.500000 +v 1.014527 2.167819 -0.500000 +v 1.014527 2.167819 0.500000 +v 1.026632 1.167892 0.500000 +v 1.026632 1.167892 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.125000 0.050000 +vt 0.375000 0.700000 +vt 0.375000 0.050000 +vt 0.625000 0.050000 +vt 0.625000 0.700000 +vt 0.875000 0.050000 +vt 0.125000 0.100000 +vt 0.375000 0.650000 +vt 0.375000 0.100000 +vt 0.625000 0.100000 +vt 0.625000 0.650000 +vt 0.875000 0.100000 +vt 0.125000 0.150000 +vt 0.375000 0.600000 +vt 0.375000 0.150000 +vt 0.625000 0.150000 +vt 0.625000 0.600000 +vt 0.875000 0.150000 +vt 0.125000 0.200000 +vt 0.375000 0.550000 +vt 0.375000 0.200000 +vt 0.625000 0.200000 +vt 0.625000 0.550000 +vt 0.875000 0.200000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.999927 0.012106 0.000000 +vn 0.999927 0.012106 0.000000 +vn 0.999927 0.012106 0.000000 +vn 0.999927 0.012106 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.393053 -0.919516 0.000000 +vn 0.393054 -0.919516 0.000000 +vn 0.393053 -0.919516 0.000000 +vn 0.393054 -0.919516 0.000000 +vn -0.014610 -0.999893 0.000000 +vn -0.014610 -0.999893 0.000000 +vn 0.012106 -0.999927 0.000000 +vn 0.012106 -0.999927 0.000000 +vn -0.134570 0.990904 0.000000 +vn -0.134570 0.990904 0.000000 +vn -0.012106 0.999927 0.000000 +vn -0.012106 0.999927 0.000000 +vn -0.919516 -0.393054 0.000000 +vn -0.919516 -0.393054 0.000000 +vn -0.999922 0.012494 -0.000000 +vn -0.999922 0.012494 -0.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.919516 0.393054 0.000000 +vn 0.919516 0.393054 0.000000 +vn 0.906606 0.421977 0.000000 +vn 0.906607 0.421977 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.886849 0.462059 0.000000 +vn -0.886849 0.462059 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.576070 -0.817400 -0.000000 +vn 0.576070 -0.817400 -0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.401292 0.915950 0.000000 +vn -0.401292 0.915950 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.439500 -0.898243 -0.000000 +vn 0.439500 -0.898243 -0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +s 1 +g pCube1 +f 22/35/1 23/36/2 4/4/3 3/3/4 +s off +f 3/3/5 4/4/6 6/6/7 5/5/8 +s 2 +f 5/5/9 6/6/10 24/37/11 21/34/12 +s off +f 7/7/13 8/8/14 2/10/15 1/9/16 +s 3 +f 23/36/17 24/38/18 6/12/19 4/4/20 +s 4 +f 21/33/21 22/35/22 3/3/23 5/14/24 +f 7/13/25 1/1/26 10/17/27 9/15/28 +s 1 +f 1/1/29 2/2/30 11/18/31 10/17/32 +s 3 +f 2/2/33 8/11/34 12/20/35 11/18/36 +s 2 +f 9/16/37 12/19/38 8/8/39 7/7/40 +s 4 +f 9/15/28 10/17/27 14/23/41 13/21/42 +s 1 +f 10/17/32 11/18/31 15/24/43 14/23/44 +s 3 +f 11/18/36 12/20/35 16/26/45 15/24/46 +s 2 +f 13/22/47 16/25/48 12/19/38 9/16/37 +s 4 +f 13/21/42 14/23/41 18/29/49 17/27/50 +s 1 +f 14/23/44 15/24/43 19/30/51 18/29/52 +s 3 +f 15/24/46 16/26/45 20/32/53 19/30/54 +s 2 +f 17/28/55 20/31/56 16/25/48 13/22/47 +s 4 +f 17/27/50 18/29/49 22/35/22 21/33/21 +s 1 +f 18/29/52 19/30/51 23/36/2 22/35/1 +s 3 +f 19/30/54 20/32/53 24/38/18 23/36/17 +s 2 +f 21/34/12 24/37/11 20/31/56 17/28/55 diff --git a/modules/ufbx/data/maya_game_sausage_wiggle_18.obj b/modules/ufbx/data/maya_game_sausage_wiggle_18.obj new file mode 100644 index 0000000..4cde052 --- /dev/null +++ b/modules/ufbx/data/maya_game_sausage_wiggle_18.obj @@ -0,0 +1,165 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g skinCluster1Set tweakSet1 +v -0.416621 0.277053 0.500000 +v 0.435668 -0.246019 0.500000 +v -1.146144 2.161227 0.500000 +v -0.607101 3.003506 0.500000 +v -1.146144 2.161227 -0.500000 +v -0.607101 3.003506 -0.500000 +v -0.416621 0.277053 -0.500000 +v 0.435667 -0.246019 -0.500000 +v -0.068061 0.844993 -0.500000 +v -0.068061 0.844993 0.500000 +v 0.784227 0.321922 0.500000 +v 0.784227 0.321922 -0.500000 +v -0.066474 1.012289 -0.500000 +v -0.066474 1.012289 0.500000 +v 0.873928 1.352354 0.500000 +v 0.873928 1.352353 -0.500000 +v -0.293083 1.638946 -0.500000 +v -0.293083 1.638946 0.500000 +v 0.647319 1.979010 0.500000 +v 0.647319 1.979010 -0.500000 +v -0.584873 1.802025 -0.500000 +v -0.584873 1.802025 0.500000 +v -0.045831 2.644303 0.500000 +v -0.045831 2.644303 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.125000 0.050000 +vt 0.375000 0.700000 +vt 0.375000 0.050000 +vt 0.625000 0.050000 +vt 0.625000 0.700000 +vt 0.875000 0.050000 +vt 0.125000 0.100000 +vt 0.375000 0.650000 +vt 0.375000 0.100000 +vt 0.625000 0.100000 +vt 0.625000 0.650000 +vt 0.875000 0.100000 +vt 0.125000 0.150000 +vt 0.375000 0.600000 +vt 0.375000 0.150000 +vt 0.625000 0.150000 +vt 0.625000 0.600000 +vt 0.875000 0.150000 +vt 0.125000 0.200000 +vt 0.375000 0.550000 +vt 0.375000 0.200000 +vt 0.625000 0.200000 +vt 0.625000 0.550000 +vt 0.875000 0.200000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.842279 0.539042 0.000000 +vn -0.842279 0.539042 0.000000 +vn -0.842279 0.539042 0.000000 +vn -0.842279 0.539042 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.523072 -0.852289 0.000000 +vn -0.523072 -0.852289 0.000000 +vn -0.523072 -0.852289 0.000000 +vn -0.523072 -0.852289 0.000000 +vn 0.632554 0.774516 0.000000 +vn 0.632554 0.774516 0.000000 +vn 0.539042 0.842279 0.000000 +vn 0.539042 0.842279 0.000000 +vn -0.522153 -0.852852 0.000000 +vn -0.522153 -0.852852 0.000000 +vn -0.539042 -0.842279 0.000000 +vn -0.539042 -0.842279 0.000000 +vn -0.852289 0.523072 -0.000000 +vn -0.852289 0.523072 -0.000000 +vn -0.902844 0.429968 -0.000000 +vn -0.902844 0.429968 -0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.852289 -0.523072 0.000000 +vn 0.852289 -0.523072 0.000000 +vn 0.964404 -0.264432 0.000000 +vn 0.964404 -0.264432 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.962105 -0.272680 0.000000 +vn -0.962105 -0.272680 0.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.996604 0.082339 0.000000 +vn 0.996604 0.082339 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.835982 -0.548756 0.000000 +vn -0.835982 -0.548756 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.814646 0.579959 0.000000 +vn 0.814646 0.579959 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +s 1 +g pCube1 +f 22/35/1 23/36/2 4/4/3 3/3/4 +s off +f 3/3/5 4/4/6 6/6/7 5/5/8 +s 2 +f 5/5/9 6/6/10 24/37/11 21/34/12 +s off +f 7/7/13 8/8/14 2/10/15 1/9/16 +s 3 +f 23/36/17 24/38/18 6/12/19 4/4/20 +s 4 +f 21/33/21 22/35/22 3/3/23 5/14/24 +f 7/13/25 1/1/26 10/17/27 9/15/28 +s 1 +f 1/1/29 2/2/30 11/18/31 10/17/32 +s 3 +f 2/2/33 8/11/34 12/20/35 11/18/36 +s 2 +f 9/16/37 12/19/38 8/8/39 7/7/40 +s 4 +f 9/15/28 10/17/27 14/23/41 13/21/42 +s 1 +f 10/17/32 11/18/31 15/24/43 14/23/44 +s 3 +f 11/18/36 12/20/35 16/26/45 15/24/46 +s 2 +f 13/22/47 16/25/48 12/19/38 9/16/37 +s 4 +f 13/21/42 14/23/41 18/29/49 17/27/50 +s 1 +f 14/23/44 15/24/43 19/30/51 18/29/52 +s 3 +f 15/24/46 16/26/45 20/32/53 19/30/54 +s 2 +f 17/28/55 20/31/56 16/25/48 13/22/47 +s 4 +f 17/27/50 18/29/49 22/35/22 21/33/21 +s 1 +f 18/29/52 19/30/51 23/36/2 22/35/1 +s 3 +f 19/30/54 20/32/53 24/38/18 23/36/17 +s 2 +f 21/34/12 24/37/11 20/31/56 17/28/55 diff --git a/modules/ufbx/data/maya_hidden_cube_7500_ascii.fbx b/modules/ufbx/data/maya_hidden_cube_7500_ascii.fbx new file mode 100644 index 0000000..aee4541 --- /dev/null +++ b/modules/ufbx/data/maya_hidden_cube_7500_ascii.fbx @@ -0,0 +1,379 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 23 + Hour: 22 + Minute: 54 + Second: 12 + Millisecond: 815 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_hidden_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_hidden_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "23/08/2021 19:54:12.814" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_hidden_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "23/08/2021 19:54:12.814" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2298913904448, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2299402309216, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2298710937488, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Visibility", "Visibility", "", "A",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2299434375312, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2299398502368, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2299397238240, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2298710937488,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2299397238240,2299398502368 + + ;Geometry::, Model::pCube1 + C: "OO",2299402309216,2298710937488 + + ;Material::lambert1, Model::pCube1 + C: "OO",2299434375312,2298710937488 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_human_ik_6100_ascii.fbx b/modules/ufbx/data/maya_human_ik_6100_ascii.fbx new file mode 100644 index 0000000..dbded62 --- /dev/null +++ b/modules/ufbx/data/maya_human_ik_6100_ascii.fbx @@ -0,0 +1,15507 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 4 + Day: 18 + Hour: 14 + Minute: 22 + Second: 41 + Millisecond: 876 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 158 + ObjectType: "Model" { + Count: 154 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Character" { + Count: 1 + } + ObjectType: "ControlSetPlug" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Character1_Reference", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::Character1_Reference_ncl1_1" + } + Model: "Model::Character1_Hips", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,99.9999923706055,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Hips_ncl1_1" + } + Model: "Model::Character1_LeftUpLeg", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",8.91000080108643,-6.27000427246094,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-0.000613368256766612,-0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftUpLeg_ncl1_1" + } + Model: "Model::Character1_LeftLeg", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-9.5367431640625e-07,-44.8786392186198,-0.000480439099329277 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000415292914140102,-0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftLeg_ncl1_1" + } + Model: "Model::Character1_LeftFoot", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-1.77635683940025e-15,-40.7009582517099,-0.000140705935401858 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000198075342616968,-0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftFoot_ncl1_1" + } + Model: "Model::Character1_LeftToeBase", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",7.62939453302636e-06,-6.26231718063355,12.9547204971313 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftToeBase_ncl1_1" + } + Model: "Model::Character1_RightUpLeg", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-8.91000080108643,-6.27000427246094,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-0.000613115991250192,-0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightUpLeg_ncl1_1" + } + Model: "Model::Character1_RightLeg", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-1.9073486328125e-06,-44.8786392233199,-4.12174983339113e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000415040648623682,-0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightLeg_ncl1_1" + } + Model: "Model::Character1_RightFoot", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",9.5367431640625e-07,-40.7009582517099,-0.000140705935401857 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000198075330348223,-0.00480038608736341,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightFoot_ncl1_1" + } + Model: "Model::Character1_RightToeBase", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0.004800386,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",9.8607513265847e-08,-6.26231718063617,12.9547488189982 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.00291259295273158,-0.00480038600005737,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightToeBase_ncl1_1" + } + Model: "Model::Character1_Spine", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,7,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Spine_ncl1_1" + } + Model: "Model::Character1_Spine1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,12.6666641235352,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Spine1_ncl1_1" + } + Model: "Model::Character1_Spine2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,12.6666564941406,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Spine2_ncl1_1" + } + Model: "Model::Character1_LeftShoulder", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",7.00000095367432,14.2552185058594,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0,0.000735282016211991 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftShoulder_ncl1_1" + } + Model: "Model::Character1_LeftArm", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-0.000735282 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",10.7072477349505,-7.79949687057524e-08,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.00067450447403495,0.00203795310655456,0.0012567684434604 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftArm_ncl1_1" + } + Model: "Model::Character1_LeftForeArm", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",27.3054694890979,-0.000598927146967299,0.000971235069153659 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-0.000674459772366627,-0.00216353911962381,-0.0012567429907804 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftForeArm_ncl1_1" + } + Model: "Model::Character1_LeftHand", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",26.6971435546234,5.6843418860808e-14,-5.85102930517871e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0.000125571218624066,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHand_ncl1_1" + } + Model: "Model::Character1_LeftHandThumb1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",4.34876251220705,-0.798507690429688,4.28243398666382 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandThumb1_ncl1_1" + } + Model: "Model::Character1_LeftHandThumb2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",2.51258850097655,-0.536087036132813,0.707454204559326 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0,-0.000297862000455712 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandThumb2_ncl1_1" + } + Model: "Model::Character1_LeftHandThumb3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,0.000297862 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",2.54313659672466,-2.03785447183691e-06,9.53674316317432e-06 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandThumb3_ncl1_1" + } + Model: "Model::Character1_LeftHandThumb4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",2.666748046875,5.6843418860808e-14,-8.10623168856495e-06 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandThumb4_ncl1_1" + } + Model: "Model::Character1_LeftHandIndex1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",8.82197570800783,0.199722290039063,3.4716694355011 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-1.99999990650714,-0.000299341005181314 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandIndex1_ncl1_1" + } + Model: "Model::Character1_LeftHandIndex2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",1.04532179819187e-05,1.99999998497269,0.000299523461597212 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",4.22532021170265,6.80293811683441e-06,-0.000262786505682566 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-1.999999985,-0.000299340999991943 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandIndex2_ncl1_1" + } + Model: "Model::Character1_LeftHandIndex3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",1.04532179819187e-05,1.99999998497269,0.000299523461597212 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",2.6539394358412,-1.40173565910118e-06,-0.000165144492167202 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-1.999999985,-0.000299340999993751 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandIndex3_ncl1_1" + } + Model: "Model::Character1_LeftHandIndex4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",1.04532179819187e-05,1.99999998497269,0.000299523461597212 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1.95821988638983,-5.03430641174418e-06,-0.000122013144632449 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-1.999999985,-0.00029934099999268 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandIndex4_ncl1_1" + } + Model: "Model::Character1_LeftHandMiddle1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",8.8098831176758,0.500885009765625,1.30468440055847 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0.00356333394791432,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandMiddle1_ncl1_1" + } + Model: "Model::Character1_LeftHandMiddle2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0.003563334,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",4.86325074182569,0,-2.08833894621563e-08 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0.00356333400000013,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandMiddle2_ncl1_1" + } + Model: "Model::Character1_LeftHandMiddle3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0.003563334,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",2.76523590621453,0,-1.94715533696765e-07 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0.0035633339999998,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandMiddle3_ncl1_1" + } + Model: "Model::Character1_LeftHandMiddle4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0.003563334,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",2.00563049697352,0,-1.11395749535781e-06 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0.00356333400000016,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandMiddle4_ncl1_1" + } + Model: "Model::Character1_LeftHandRing1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",8.89376068115236,0.379913330078125,-0.793158888816833 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0.00356352904853195,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandRing1_ncl1_1" + } + Model: "Model::Character1_LeftHandRing2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0.003563529,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",4.53775786476226,0,-0.000282167675000555 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0.00356352899999992,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandRing2_ncl1_1" + } + Model: "Model::Character1_LeftHandRing3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0.003563529,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",2.30452727825016,0,-0.000143450009211787 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0.00356352900000002,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandRing3_ncl1_1" + } + Model: "Model::Character1_LeftHandRing4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0.003563529,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1.92334746937263,0,-0.000120457666677898 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0.00356352900000002,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandRing4_ncl1_1" + } + Model: "Model::Character1_LeftHandPinky1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",8.88227844238283,-0.313034057617188,-2.4903564453125 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0,0.000763026011995871 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandPinky1_ncl1_1" + } + Model: "Model::Character1_LeftHandPinky2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-0.000763026 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",3.04409790073031,5.23715291933513e-06,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0,0.000739071406413687 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandPinky2_ncl1_1" + } + Model: "Model::Character1_LeftHandPinky3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-0.000763026 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1.97450256370597,5.04801613487871e-06,-2.38418579101563e-07 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0,0.000763026000027254 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandPinky3_ncl1_1" + } + Model: "Model::Character1_LeftHandPinky4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-0.000763026 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1.66661071783157,-6.23920536213518e-06,9.53674316850339e-07 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0,0.000763025999978541 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_LeftHandPinky4_ncl1_1" + } + Model: "Model::Character1_RightShoulder", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-7,14.2552185058594,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0,-0.00231836105352646 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightShoulder_ncl1_1" + } + Model: "Model::Character1_RightArm", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,0.002318361 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-10.7072753991474,-6.00275080842039e-06,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000685603635662701,-0.00204563686091838,-0.00125676861464934 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightArm_ncl1_1" + } + Model: "Model::Character1_RightForeArm", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-27.3055991886743,-0.000598929859222608,0.000974901665371063 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-0.000685558765454442,0.00217122311744007,0.00125674268823229 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightForeArm_ncl1_1" + } + Model: "Model::Character1_RightHand", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-26.6969871520355,2.8421709430404e-14,-5.85099502749942e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0.000125571218631082,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHand_ncl1_1" + } + Model: "Model::Character1_RightHandThumb1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-4.34838104248047,-0.798492431640653,4.28281450271606 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandThumb1_ncl1_1" + } + Model: "Model::Character1_RightHandThumb2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-2.5125274658203,-0.536102294921847,0.707676887512208 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0,-0.000602085979890121 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandThumb2_ncl1_1" + } + Model: "Model::Character1_RightHandThumb3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,0.000602085999999999 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-2.54158782977022,3.80960048573797e-06,0.088820457458497 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0,-0.000391494032984209 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandThumb3_ncl1_1" + } + Model: "Model::Character1_RightHandThumb4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,0.000391494 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-2.66512298588188,-2.95162195129706e-06,0.093137264251709 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-0,-0.000391493999975616 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandThumb4_ncl1_1" + } + Model: "Model::Character1_RightHandIndex1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-8.82167053222656,0.199737548828097,3.47244429588318 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.00006454048744,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandIndex1_ncl1_1" + } + Model: "Model::Character1_RightHandIndex2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064658,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-4.22532554511477,2.8421709430404e-14,0.000114819780703712 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.00006487131337,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandIndex2_ncl1_1" + } + Model: "Model::Character1_RightHandIndex3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064636,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-2.65393516420842,0,7.18577928200403e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.000064636,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandIndex3_ncl1_1" + } + Model: "Model::Character1_RightHandIndex4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064636,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-1.95822237416384,0,5.29857275415324e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.000064636,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandIndex4_ncl1_1" + } + Model: "Model::Character1_RightHandMiddle1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-8.80976867675781,0.500900268554659,1.30545842647553 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.00006454048744,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandMiddle1_ncl1_1" + } + Model: "Model::Character1_RightHandMiddle2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064658,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-4.86324867875288,2.8421709430404e-14,0.000131787738323119 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.000064658,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandMiddle2_ncl1_1" + } + Model: "Model::Character1_RightHandMiddle3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064636,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-2.76523943496396,0,7.49836865896469e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.000064636,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandMiddle3_ncl1_1" + } + Model: "Model::Character1_RightHandMiddle4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064636,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-2.00562974812861,0,5.43316945416095e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.000064636,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandMiddle4_ncl1_1" + } + Model: "Model::Character1_RightHandRing1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-8.89382934570313,0.379928588867159,-0.79237675666809 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.00006454048744,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandRing1_ncl1_1" + } + Model: "Model::Character1_RightHandRing2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064658,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-4.53776382360202,0,0.000123207411302229 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.00006487131337,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandRing2_ncl1_1" + } + Model: "Model::Character1_RightHandRing3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064636,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-2.30452524231353,0,6.2383298205404e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.000064636,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandRing3_ncl1_1" + } + Model: "Model::Character1_RightHandRing4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,2.000064636,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-1.92335007812626,2.8421709430404e-14,5.23319517493626e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.000064636,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandRing4_ncl1_1" + } + Model: "Model::Character1_RightHandPinky1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-8.88249206542969,-0.313018798828153,-2.48957419395447 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.00006454001851,0.00124121500074499 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandPinky1_ncl1_1" + } + Model: "Model::Character1_RightHandPinky2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-4.33455853143664e-05,2.0000646575305,-0.00124197162447093 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-3.04779808733394,-1.03087770639831e-05,8.26212895672085e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.00006465749222,0.00179132697290335 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandPinky2_ncl1_1" + } + Model: "Model::Character1_RightHandPinky3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-4.33455848371928e-05,2.0000646355305,-0.00124197162445427 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-1.97690285411784,1.59930233678551e-05,5.3818153643248e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.000064636,0.00124121500000094 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandPinky3_ncl1_1" + } + Model: "Model::Character1_RightHandPinky4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-4.33455848371928e-05,2.0000646355305,-0.00124197162445427 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-1.66864040299899,-8.89759152755687e-06,4.53168677359561e-05 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,-2.000064636,0.00124121499996102 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",33.3333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_RightHandPinky4_ncl1_1" + } + Model: "Model::Character1_Neck", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,12.6666717529297,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Neck_ncl1_1" + } + Model: "Model::Character1_Head", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",0 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,20,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",50 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Character1_Head_ncl1_1" + } + Model: "Model::Character1_Ctrl_Reference", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_Reference_ncl1_1" + } + Model: "Model::Character1_Ctrl_HipsEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,90 + Property: "PostRotation", "Vector3D", "",90,3.50835464926744e-15,90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,93.7299957275391,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",8 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",1500 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",100 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",100 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_HipsEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftAnkleEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90.0000707016612,-64.2008582414159,-89.9999214709817 + Property: "PostRotation", "Vector3D", "",-90.0000707016612,-64.2008582414159,-89.9999214709817 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.91000080108643,8.1503963470459,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",-5.08888749034163e-14,2.54444374517081e-14,2.54444374517081e-14 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",800 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",100 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",100 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftAnkleEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightAnkleEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-89.991060164131,-64.200906907443,-90.0099295579875 + Property: "PostRotation", "Vector3D", "",-89.9910601641309,-64.20090690743,-90.0099295579875 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.91000270843506,8.1503963470459,0.000439024006482214 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,2.54444374517081e-14,1.29766631003711e-11 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",800 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",100 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",100 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightAnkleEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftWristEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,0 + Property: "PostRotation", "Vector3D", "",90,0,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,90 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",71.7098617553711,146.588684082031,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",500 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftWristEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightWristEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,180 + Property: "PostRotation", "Vector3D", "",90,-7.01670929853488e-15,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,90 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-71.7098617553711,146.588973999023,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",500 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightWristEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftKneeEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90,-0,-90 + Property: "PostRotation", "Vector3D", "",-90,3.50835464926744e-15,-90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,10 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.91000080108643,48.8513565063477,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0.5,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftKneeEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightKneeEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90,-0,-89.9999986574883 + Property: "PostRotation", "Vector3D", "",-90,3.50835464926744e-15,-89.9999986574883 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,10 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.91000366210938,48.8513565063477,0.000439024006482214 + Property: "Lcl Rotation", "Lcl Rotation", "A",3.18055468146352e-15,3.18055468146352e-15,-3.18055468146352e-15 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0.5,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightKneeEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftElbowEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,0 + Property: "PostRotation", "Vector3D", "",90,0,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,-10 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",45.0127182006836,146.588684082031,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0.5,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftElbowEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightElbowEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90,-0,-0 + Property: "PostRotation", "Vector3D", "",-90,-0,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,-10 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-45.0128746032715,146.588973999023,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0.5,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightElbowEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_ChestOriginEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,90 + Property: "PostRotation", "Vector3D", "",90,3.50835464926744e-15,90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,107,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_ChestOriginEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_ChestEndEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,90 + Property: "PostRotation", "Vector3D", "",90,3.50835464926744e-15,90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4.76837158203125e-07,146.58854675293,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",1500 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_ChestEndEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftFootEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-180,-90,0 + Property: "PostRotation", "Vector3D", "",180,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",90,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.91000938415527,1.88807916641235,12.9547204971313 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,-1.72975239028591e-46,-1.41245001537605e-30 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",600 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftFootEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightFootEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-180,-90,0 + Property: "PostRotation", "Vector3D", "",180,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",90,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.91108798980713,1.88807916641235,12.9551877975464 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,-1.72975239028591e-46,-1.41245001537605e-30 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",600 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightFootEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftShoulderEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90,-0,0 + Property: "PostRotation", "Vector3D", "",-90,-0,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,90 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",17.7072505950928,146.588684082031,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0.5,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",800 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftShoulderEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightShoulderEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,0,0 + Property: "PostRotation", "Vector3D", "",90,0,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,90 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-17.707275390625,146.588973999023,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0.5,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",800 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightShoulderEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_HeadEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,90 + Property: "PostRotation", "Vector3D", "",90,3.50835464926744e-15,90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,165,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",1000 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_HeadEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHipEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90,-0,-90 + Property: "PostRotation", "Vector3D", "",-90,3.50835464926744e-15,-90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.91000080108643,93.7299957275391,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",800 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHipEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHipEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-89.9999999999643,-0.000560494326738427,-90.0000036526183 + Property: "PostRotation", "Vector3D", "",-90.0000000000357,-0.00056049432674188,-89.9999963473817 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.91000080108643,93.7299957275391,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",6.36111017397127e-15,-7.30523664548619e-06,-1.27222191313762e-14 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",7 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",800 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHipEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandThumbEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0.000174164508755786,180 + Property: "PostRotation", "Vector3D", "",90,-0.000174164508728358,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",83.7810974121094,145.25407409668,4.98988962173462 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandThumbEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandIndexEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,1.9964299099582,179.999553270182 + Property: "PostRotation", "Vector3D", "",-180,1.9964299099582,179.999553270182 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",89.3639526367188,146.788360595703,3.77954339981079 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,7.9508399495569e-16,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandIndexEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandMiddleEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,179.996468488994,0 + Property: "PostRotation", "Vector3D", "",-180,0.00353151100586447,-180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",90.1538619995117,147.089569091797,1.30528223514557 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandMiddleEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandRingEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,180.000024858391,0 + Property: "PostRotation", "Vector3D", "",-180,-2.48583913537842e-05,-180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",89.369255065918,146.968597412109,-0.793159782886505 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandRingEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandPinkyEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,179.999967213991,0.000524576137899229 + Property: "PostRotation", "Vector3D", "",-180,3.27860086400939e-05,-179.999475423862 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",87.2773513793945,146.275741577148,-2.49035573005676 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandPinkyEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandThumbEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",89.9999885431129,2.0014841297044,-0.000328038975460713 + Property: "PostRotation", "Vector3D", "",89.9999885431129,2.0014841297044,-0.000328038975460783 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-83.7774810791016,145.254425048828,5.17244911193848 + Property: "Lcl Rotation", "Lcl Rotation", "A",-2.54537554830015e-14,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandThumbEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandIndexEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-1.99851444031146,0 + Property: "PostRotation", "Vector3D", "",-0,-1.99851444031146,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-89.363639831543,146.788711547852,3.16425013542175 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandIndexEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandMiddleEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-1.99851242111289,0 + Property: "PostRotation", "Vector3D", "",-0,-1.99851242111289,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-90.1478881835938,147.089874267578,0.969482660293579 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandMiddleEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandRingEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-1.99850580725114,0 + Property: "PostRotation", "Vector3D", "",-0,-1.99850580725114,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-89.3639984130859,146.968902587891,-1.09806525707245 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,-3.9756933518294e-16,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandRingEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandPinkyEffector", "IKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-1.21402377262166e-20,-1.99850850363402,0.00157277083796773 + Property: "PostRotation", "Vector3D", "",-2.42804754524332e-20,-1.99850850363402,0.00157277083796773 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-87.281623840332,146.275802612305,-2.72299432754517 + Property: "Lcl Rotation", "Lcl Rotation", "A",6.06642662327483e-21,-7.95138670551012e-16,1.93936076112817e-19 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "pull", "Number", "A+U",0,0,100 + Property: "stiffness", "Number", "A+U",0,0,1 + Property: "Color", "ColorRGB", "N",1,0.25,0.25 + Property: "Look", "enum", "N",2 + Property: "DrawLink", "bool", "N",0 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + Property: "IK Reach Translation", "IK Reach Translation", "AN",0 + Property: "IK Reach Rotation", "IK Reach Rotation", "AN",0 + Property: "IK Pull", "Number", "AN",0 + Property: "IK Pull Hips", "Number", "AN",0 + Property: "IKSync", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandPinkyEffector_ncl1_1" + } + Model: "Model::Character1_Ctrl_Hips", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,90 + Property: "PostRotation", "Vector3D", "",90,3.50835464926744e-15,90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",10.074501870692,91.8255005547654,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_Hips_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftUpLeg", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90,-0,-90 + Property: "PostRotation", "Vector3D", "",-90,3.50835464926744e-15,-90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.91000080108643,-6.27000427246094,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftUpLeg_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftLeg", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90,-0,-90 + Property: "PostRotation", "Vector3D", "",-90,3.50835464926744e-15,-90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,-44.8786392211914,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftLeg_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftFoot", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90.0000707016612,-64.2008582414159,-89.9999214709817 + Property: "PostRotation", "Vector3D", "",-90.0000707016612,-64.2008582414159,-89.9999214709817 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,-40.7009601593018,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",-5.08888749034163e-14,2.54444374517081e-14,2.54444374517081e-14 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftFoot_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftToeBase", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-180,-90,0 + Property: "PostRotation", "Vector3D", "",180,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.58306884765625e-06,-6.26231718063354,12.9547204971313 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,-1.72975239028591e-46,-1.41245001537605e-30 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",10 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",0.75 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftToeBase_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightUpLeg", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-89.9999999999643,-0.000560494326738427,-90.0000036526183 + Property: "PostRotation", "Vector3D", "",-90.0000000000357,-0.00056049432674188,-89.9999963473817 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.91000080108643,-6.27000427246094,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",6.36111017397127e-15,-7.30523664548619e-06,-1.27222191313762e-14 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightUpLeg_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightLeg", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90,-0,-89.9999986574883 + Property: "PostRotation", "Vector3D", "",-90,3.50835464926744e-15,-89.9999986574883 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.86102294921875e-06,-44.8786392211914,0.000439024006482214 + Property: "Lcl Rotation", "Lcl Rotation", "A",3.18055468146352e-15,3.18055468146352e-15,-3.18055468146352e-15 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightLeg_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightFoot", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-89.991060164131,-64.200906907443,-90.0099295579875 + Property: "PostRotation", "Vector3D", "",-89.9910601641309,-64.20090690743,-90.0099295579875 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",9.5367431640625e-07,-40.7009601593018,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,2.54444374517081e-14,1.29766631003711e-11 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightFoot_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightToeBase", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-180,-90,0 + Property: "PostRotation", "Vector3D", "",180,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-0.00108528137207031,-6.26231718063354,12.9547487735399 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,-1.72975239028591e-46,-1.41245001537605e-30 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",10 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",0.75 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightToeBase_ncl1_1" + } + Model: "Model::Character1_Ctrl_Spine", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,90 + Property: "PostRotation", "Vector3D", "",90,3.50835464926744e-15,90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,7,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_Spine_ncl1_1" + } + Model: "Model::Character1_Ctrl_Spine1", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,90 + Property: "PostRotation", "Vector3D", "",90,3.50835464926744e-15,90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,12.6666641235351,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_Spine1_ncl1_1" + } + Model: "Model::Character1_Ctrl_Spine2", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,90 + Property: "PostRotation", "Vector3D", "",90,3.50835464926744e-15,90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,12.6666641235352,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_Spine2_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftShoulder", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,0.000734864492425355 + Property: "PostRotation", "Vector3D", "",-0,0,0.000734864492425355 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",7.00000047683716,14.2552185058594,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,1.94125651944795e-19 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftShoulder_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftArm", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90,-0,0 + Property: "PostRotation", "Vector3D", "",-90,-0,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",10.7072501182556,0.0001373291015625,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftArm_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftForeArm", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,0 + Property: "PostRotation", "Vector3D", "",90,0,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",27.3054676055908,-2.8421709430404e-14,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftForeArm_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHand", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,0 + Property: "PostRotation", "Vector3D", "",90,0,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",26.6971435546875,-2.8421709430404e-14,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHand_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandThumb1", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-86.7580085436902,-15.3957425319211,-12.0440616733739 + Property: "PostRotation", "Vector3D", "",-86.7580085436902,-15.3957425319212,-12.0440616733739 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4.34876251220703,-0.798507690429716,4.28243398666382 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandThumb1_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandThumb2", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-89.9999999987109,-0.000214858743451697,-0.00034377398952639 + Property: "PostRotation", "Vector3D", "",-89.9999999987109,-0.000214858743451697,-0.00034377398952639 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.51258850097656,-0.536087036132813,0.707454204559326 + Property: "Lcl Rotation", "Lcl Rotation", "A",-1.27222187256689e-14,-1.48171903313737e-35,-1.33461385712046e-19 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandThumb2_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandThumb3", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90,0.000174164508755786,1.21328532466057e-20 + Property: "PostRotation", "Vector3D", "",-90,0.000174164508755786,-1.46835283787459e-21 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.54313659667969,-1.52587890625e-05,9.5367431640625e-06 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,-2.42657064930993e-20 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandThumb3_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandThumb4", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0.000174164508755786,180 + Property: "PostRotation", "Vector3D", "",90,-0.000174164508728358,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.666748046875,0,-8.1062316903413e-06 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandThumb4_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandIndex1", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-180,-1.99643649428611,-0.000207036431024627 + Property: "PostRotation", "Vector3D", "",-180,-1.99643649428611,-0.000207036431025259 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.82197570800781,0.199722290039034,3.4716694355011 + Property: "Lcl Rotation", "Lcl Rotation", "A",-1.4024520519869e-14,-3.12364377824282e-32,-2.55226700894419e-16 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandIndex1_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandIndex2", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,-1.99643460947299,-0.000329621393673163 + Property: "PostRotation", "Vector3D", "",-180,-1.99643460947299,-0.00032962139367319 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4.22275543212891,-1.52587890909217e-05,0.147198915481567 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,-3.9756933518294e-16,2.64981514904644e-17 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandIndex2_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandIndex3", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-180,-1.9964299099582,-0.000446729817801282 + Property: "PostRotation", "Vector3D", "",180,-1.9964299099582,-0.000446729817801038 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.65232849121095,-1.52587890625e-05,0.0924561023712158 + Property: "Lcl Rotation", "Lcl Rotation", "A",-1.40249004298363e-14,-2.99245933672554e-32,-2.44501258624469e-16 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandIndex3_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandIndex4", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,1.9964299099582,179.999553270182 + Property: "PostRotation", "Vector3D", "",-180,1.9964299099582,179.999553270182 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.95703125000001,-1.52587890625e-05,0.0682189464569096 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,7.9508399495569e-16,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandIndex4_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandMiddle1", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,-0.00356308791287741,0 + Property: "PostRotation", "Vector3D", "",-180,-0.00356308791287741,-4.36352421321096e-19 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.80988311767578,0.500885009765597,1.30468440055847 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandMiddle1_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandMiddle2", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,-0.0035592994356103,0 + Property: "PostRotation", "Vector3D", "",-180,-0.0035592994356103,-4.35888466663423e-19 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4.86325073242186,0,0.00030243396759011 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandMiddle2_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandMiddle3", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,-0.00353151100587818,0 + Property: "PostRotation", "Vector3D", "",-180,-0.00353151100587818,-4.32485365497915e-19 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.76523590087892,0,0.000171780586242898 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandMiddle3_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandMiddle4", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,179.996468488994,0 + Property: "PostRotation", "Vector3D", "",-180,0.00353151100586447,-180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.00563049316408,0,0.000123620033264382 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandMiddle4_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandRing1", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,-7.52595153858624e-07,0 + Property: "PostRotation", "Vector3D", "",-180,-7.52595153858624e-07,-9.21663246226774e-23 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.89376068115234,0.379913330078097,-0.793158888816833 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandRing1_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandRing2", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,2.96381354269169e-06,0 + Property: "PostRotation", "Vector3D", "",180,2.96381354269169e-06,-3.62962476832696e-22 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4.53775787353516,0,5.96046447753906e-08 + Property: "Lcl Rotation", "Lcl Rotation", "A",5.57113298854492e-61,7.58303327909354e-22,8.41885814294845e-38 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandRing2_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandRing3", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,2.48583913503254e-05,0 + Property: "PostRotation", "Vector3D", "",180,2.48583913503254e-05,-3.04427493991302e-21 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2.30452728271484,0,-1.19209289550781e-07 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandRing3_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandRing4", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,180.000024858391,0 + Property: "PostRotation", "Vector3D", "",-180,-2.48583913537842e-05,-180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.92334747314453,0,-8.34465026855469e-07 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandRing4_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandPinky1", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,-0,0.000861599306891751 + Property: "PostRotation", "Vector3D", "",-180,-1.05515483329279e-19,0.000861599306891751 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",8.88227844238281,-0.313034057617216,-2.4903564453125 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,-1.29973974056846e-35,1.94125651944795e-19 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandPinky1_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandPinky2", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-180,6.91838977121489e-06,0.000885553890750767 + Property: "PostRotation", "Vector3D", "",-180,6.91838977121481e-06,0.000885553890750767 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3.04409790039063,4.57763671875e-05,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,7.88635461025729e-20,-1.94125651944795e-19 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandPinky2_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandPinky3", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",180,-3.27860086192209e-05,0.000524576137914921 + Property: "PostRotation", "Vector3D", "",-180,-3.27860086192209e-05,0.000524576137914921 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.97450256347656,3.05175780965783e-05,-2.38418579101563e-07 + Property: "Lcl Rotation", "Lcl Rotation", "A",1.4033418597142e-14,6.06642662327486e-21,-1.94125651944795e-19 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandPinky3_ncl1_1" + } + Model: "Model::Character1_Ctrl_LeftHandPinky4", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,179.999967213991,0.000524576137899229 + Property: "PostRotation", "Vector3D", "",-180,3.27860086400939e-05,-179.999475423862 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.66661071777344,1.52587890340783e-05,9.5367431640625e-07 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_LeftHandPinky4_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightShoulder", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-0,-0,-0.00228623958842071 + Property: "PostRotation", "Vector3D", "",-0,-0,-0.00228623958842071 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-6.99999952316284,14.2552185058594,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,-7.76502607779179e-19 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightShoulder_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightArm", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,0,0 + Property: "PostRotation", "Vector3D", "",90,0,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-10.7072758674622,0.00042724609375,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightArm_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightForeArm", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-90,-0,-0 + Property: "PostRotation", "Vector3D", "",-90,-0,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-27.3055992126465,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightForeArm_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHand", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,180 + Property: "PostRotation", "Vector3D", "",90,-7.01670929853488e-15,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-26.6969871520996,-2.8421709430404e-14,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHand_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandThumb1", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",86.7568251729336,-15.4006812255451,-167.955321481145 + Property: "PostRotation", "Vector3D", "",86.7568251729335,-15.4006812255451,-167.955321481145 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-4.34838104248048,-0.798492431640597,4.28281450271606 + Property: "Lcl Rotation", "Lcl Rotation", "A",1.27222187258541e-14,2.38541601109764e-15,4.77083202219528e-15 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandThumb1_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandThumb2", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90.0000240276016,-2.00149177939179,179.99931203305 + Property: "PostRotation", "Vector3D", "",90.0000240276016,-2.0014917793918,179.99931203305 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.5125274658203,-0.536102294921903,0.707676887512207 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,1.9878466759147e-16,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandThumb2_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandThumb3", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90.0000114568871,-2.0014841297044,179.999671961025 + Property: "PostRotation", "Vector3D", "",90.0000114568871,-2.0014841297044,179.999671961025 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.54158782958984,3.0517578125e-05,0.088820457458497 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,-1.9878466759147e-16,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandThumb3_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandThumb4", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",89.9999885431129,2.0014841297044,-0.000328038975460713 + Property: "PostRotation", "Vector3D", "",89.9999885431129,2.0014841297044,-0.000328038975460783 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.66512298583984,1.52587890625e-05,0.093137264251709 + Property: "Lcl Rotation", "Lcl Rotation", "A",-2.54537554830015e-14,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandThumb4_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandIndex1", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,1.9985075743396,180 + Property: "PostRotation", "Vector3D", "",-2.44845895860316e-16,1.9985075743396,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.82167053222658,0.199737548828153,3.47244429588318 + Property: "Lcl Rotation", "Lcl Rotation", "A",-2.20695314902508e-32,-7.95138670365879e-16,-3.44836429535168e-34 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandIndex1_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandIndex2", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,1.99851341663622,180 + Property: "PostRotation", "Vector3D", "",-2.44846612206494e-16,1.99851341663622,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-4.22275543212889,-2.8421709430404e-14,-0.147351741790771 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandIndex2_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandIndex3", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,1.99851444031146,180 + Property: "PostRotation", "Vector3D", "",-2.44846737723204e-16,1.99851444031146,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.65232086181641,0,-0.0925521850585942 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandIndex3_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandIndex4", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-1.99851444031146,0 + Property: "PostRotation", "Vector3D", "",-0,-1.99851444031146,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1.95703125,-2.8421709430404e-14,-0.0682902336120605 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandIndex4_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandMiddle1", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,1.99851189909598,180 + Property: "PostRotation", "Vector3D", "",-2.4484642613512e-16,1.99851189909598,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.80976867675783,0.500900268554716,1.30545842647552 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandMiddle1_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandMiddle2", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,1.99851087800219,180 + Property: "PostRotation", "Vector3D", "",-2.44846300934933e-16,1.99851087800219,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-4.86029052734374,-2.8421709430404e-14,-0.169598698616028 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandMiddle2_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandMiddle3", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,1.99851242111289,180 + Property: "PostRotation", "Vector3D", "",-2.44846490141597e-16,1.99851242111289,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.76355743408202,-2.8421709430404e-14,-0.0964336395263672 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,-7.95138670365879e-16,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandMiddle3_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandMiddle4", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-1.99851242111289,0 + Property: "PostRotation", "Vector3D", "",-0,-1.99851242111289,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.00440979003905,-2.8421709430404e-14,-0.0699434280395508 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandMiddle4_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandRing1", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,1.99850887012974,180 + Property: "PostRotation", "Vector3D", "",-2.44846054742066e-16,1.99850887012974,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.89382934570314,0.379928588867216,-0.792376756668091 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandRing1_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandRing2", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,1.99851376202481,180 + Property: "PostRotation", "Vector3D", "",-2.44846654555901e-16,1.99851376202481,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-4.53500366210936,0,-0.158247649669647 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandRing2_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandRing3", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,1.99850580725114,180 + Property: "PostRotation", "Vector3D", "",-2.44845679190889e-16,1.99850580725114,180 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-2.30312347412109,-2.8421709430404e-14,-0.0803670287132263 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandRing3_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandRing4", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-1.99850580725114,0 + Property: "PostRotation", "Vector3D", "",-0,-1.99850580725114,-0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1.92218017578125,0,-0.0670738220214844 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,-3.9756933518294e-16,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandRing4_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandPinky1", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-6.07011887358042e-21,1.99851133633239,-179.998564871593 + Property: "PostRotation", "Vector3D", "",-1.36856900123744e-16,1.99851133633239,-179.998564871593 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-8.8824920654297,-0.313018798828097,-2.48957419395447 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,-3.9756933518294e-16,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandPinky1_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandPinky2", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,1.9985047498638,-179.999114982997 + Property: "PostRotation", "Vector3D", "",-3.12756803587783e-16,1.9985047498638,-179.999114982997 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-3.04594421386717,-7.62939453125e-05,-0.106287479400634 + Property: "Lcl Rotation", "Lcl Rotation", "A",8.87333188973099e-16,1.96907496826746e-31,-2.5428933940169e-14 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandPinky2_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandPinky3", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",1.21402377262166e-20,1.99850850363402,-179.998427229162 + Property: "PostRotation", "Vector3D", "",3.74028584107007e-16,1.99850850363402,-179.998427229162 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1.97570037841795,-3.05175781534217e-05,-0.0689413547515869 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,3.9756933518294e-16,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandPinky3_ncl1_1" + } + Model: "Model::Character1_Ctrl_RightHandPinky4", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",-1.21402377262166e-20,-1.99850850363402,0.00157277083796773 + Property: "PostRotation", "Vector3D", "",-2.42804754524332e-20,-1.99850850363402,0.00157277083796773 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1.66762542724609,-4.57763671875e-05,-0.0581912994384766 + Property: "Lcl Rotation", "Lcl Rotation", "A",6.06642662327483e-21,-7.95138670551012e-16,1.93936076112817e-19 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",100 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_RightHandPinky4_ncl1_1" + } + Model: "Model::Character1_Ctrl_Neck", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,90 + Property: "PostRotation", "Vector3D", "",90,3.50835464926744e-15,90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,12.6666717529297,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_Neck_ncl1_1" + } + Model: "Model::Character1_Ctrl_Head", "FKEffector" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",90,-0,90 + Property: "PostRotation", "Vector3D", "",90,3.50835464926744e-15,90 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,20,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",1,1,0 + Property: "Look", "enum", "N",6 + Property: "DrawLink", "bool", "N",1 + Property: "Size", "double", "N",200 + Property: "ShowLabel", "bool", "N",0 + Property: "IKPivot", "Vector3D", "N",0,0,0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Marker" + NodeAttributeName: "NodeAttribute::Character1_Ctrl_Head_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_human_ik_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_human_ik_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "18/04/2022 11:22:41.874" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_human_ik_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "18/04/2022 11:22:41.874" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + ControlSetPlug: "ControlSetPlug::Character1_ControlRig", "ControlSetPlug" { + Type: "ControlSetPlug" + MultiLayer: 0 + Properties60: { + Property: "UseAxis", "bool", "",0 + Property: "ControlSetType", "enum", "",1 + Property: "Character", "object", "" + Property: "Hips", "object", "" + Property: "LeftUpLeg", "object", "" + Property: "LeftLeg", "object", "" + Property: "LeftFoot", "object", "" + Property: "LeftToeBase", "object", "" + Property: "RightUpLeg", "object", "" + Property: "RightLeg", "object", "" + Property: "RightFoot", "object", "" + Property: "RightToeBase", "object", "" + Property: "Spine", "object", "" + Property: "Spine1", "object", "" + Property: "LeftShoulder", "object", "" + Property: "LeftArm", "object", "" + Property: "LeftForeArm", "object", "" + Property: "LeftHand", "object", "" + Property: "RightShoulder", "object", "" + Property: "RightArm", "object", "" + Property: "RightForeArm", "object", "" + Property: "RightHand", "object", "" + Property: "Neck", "object", "" + Property: "Head", "object", "" + Property: "LeftUpLegRoll", "object", "" + Property: "LeftLegRoll", "object", "" + Property: "RightUpLegRoll", "object", "" + Property: "RightLegRoll", "object", "" + Property: "LeftArmRoll", "object", "" + Property: "LeftForeArmRoll", "object", "" + Property: "RightArmRoll", "object", "" + Property: "RightForeArmRoll", "object", "" + Property: "Spine2", "object", "" + Property: "Spine3", "object", "" + Property: "Spine4", "object", "" + Property: "Spine5", "object", "" + Property: "Spine6", "object", "" + Property: "Spine7", "object", "" + Property: "Spine8", "object", "" + Property: "Spine9", "object", "" + Property: "LeftHandThumb1", "object", "" + Property: "LeftHandThumb2", "object", "" + Property: "LeftHandThumb3", "object", "" + Property: "LeftHandIndex1", "object", "" + Property: "LeftHandIndex2", "object", "" + Property: "LeftHandIndex3", "object", "" + Property: "LeftHandMiddle1", "object", "" + Property: "LeftHandMiddle2", "object", "" + Property: "LeftHandMiddle3", "object", "" + Property: "LeftHandRing1", "object", "" + Property: "LeftHandRing2", "object", "" + Property: "LeftHandRing3", "object", "" + Property: "LeftHandPinky1", "object", "" + Property: "LeftHandPinky2", "object", "" + Property: "LeftHandPinky3", "object", "" + Property: "RightHandThumb1", "object", "" + Property: "RightHandThumb2", "object", "" + Property: "RightHandThumb3", "object", "" + Property: "RightHandIndex1", "object", "" + Property: "RightHandIndex2", "object", "" + Property: "RightHandIndex3", "object", "" + Property: "RightHandMiddle1", "object", "" + Property: "RightHandMiddle2", "object", "" + Property: "RightHandMiddle3", "object", "" + Property: "RightHandRing1", "object", "" + Property: "RightHandRing2", "object", "" + Property: "RightHandRing3", "object", "" + Property: "RightHandPinky1", "object", "" + Property: "RightHandPinky2", "object", "" + Property: "RightHandPinky3", "object", "" + Property: "Reference", "object", "" + Property: "LeftFloorContact", "object", "" + Property: "RightFloorContact", "object", "" + Property: "LeftUpLegRollEx", "object", "" + Property: "LeftLegRollEx", "object", "" + Property: "RightUpLegRollEx", "object", "" + Property: "RightLegRollEx", "object", "" + Property: "LeftArmRollEx", "object", "" + Property: "LeftForeArmRollEx", "object", "" + Property: "RightArmRollEx", "object", "" + Property: "RightForeArmRollEx", "object", "" + Property: "LeftFingerBase", "object", "" + Property: "RightFingerBase", "object", "" + Property: "Neck1", "object", "" + Property: "Neck2", "object", "" + Property: "Neck3", "object", "" + Property: "Neck4", "object", "" + Property: "Neck5", "object", "" + Property: "Neck6", "object", "" + Property: "Neck7", "object", "" + Property: "Neck8", "object", "" + Property: "Neck9", "object", "" + Property: "LeftInHandThumb", "object", "" + Property: "LeftHandThumb4", "object", "" + Property: "LeftInHandIndex", "object", "" + Property: "LeftHandIndex4", "object", "" + Property: "LeftInHandMiddle", "object", "" + Property: "LeftHandMiddle4", "object", "" + Property: "LeftInHandRing", "object", "" + Property: "LeftHandRing4", "object", "" + Property: "LeftInHandPinky", "object", "" + Property: "LeftHandPinky4", "object", "" + Property: "LeftInHandExtraFinger", "object", "" + Property: "LeftHandExtraFinger1", "object", "" + Property: "LeftHandExtraFinger2", "object", "" + Property: "LeftHandExtraFinger3", "object", "" + Property: "LeftHandExtraFinger4", "object", "" + Property: "RightInHandThumb", "object", "" + Property: "RightHandThumb4", "object", "" + Property: "RightInHandIndex", "object", "" + Property: "RightHandIndex4", "object", "" + Property: "RightInHandMiddle", "object", "" + Property: "RightHandMiddle4", "object", "" + Property: "RightInHandRing", "object", "" + Property: "RightHandRing4", "object", "" + Property: "RightInHandPinky", "object", "" + Property: "RightHandPinky4", "object", "" + Property: "RightInHandExtraFinger", "object", "" + Property: "RightHandExtraFinger1", "object", "" + Property: "RightHandExtraFinger2", "object", "" + Property: "RightHandExtraFinger3", "object", "" + Property: "RightHandExtraFinger4", "object", "" + Property: "LeftInFootThumb", "object", "" + Property: "LeftFootThumb1", "object", "" + Property: "LeftFootThumb2", "object", "" + Property: "LeftFootThumb3", "object", "" + Property: "LeftFootThumb4", "object", "" + Property: "LeftInFootIndex", "object", "" + Property: "LeftFootIndex1", "object", "" + Property: "LeftFootIndex2", "object", "" + Property: "LeftFootIndex3", "object", "" + Property: "LeftFootIndex4", "object", "" + Property: "LeftInFootMiddle", "object", "" + Property: "LeftFootMiddle1", "object", "" + Property: "LeftFootMiddle2", "object", "" + Property: "LeftFootMiddle3", "object", "" + Property: "LeftFootMiddle4", "object", "" + Property: "LeftInFootRing", "object", "" + Property: "LeftFootRing1", "object", "" + Property: "LeftFootRing2", "object", "" + Property: "LeftFootRing3", "object", "" + Property: "LeftFootRing4", "object", "" + Property: "LeftInFootPinky", "object", "" + Property: "LeftFootPinky1", "object", "" + Property: "LeftFootPinky2", "object", "" + Property: "LeftFootPinky3", "object", "" + Property: "LeftFootPinky4", "object", "" + Property: "LeftInFootExtraFinger", "object", "" + Property: "LeftFootExtraFinger1", "object", "" + Property: "LeftFootExtraFinger2", "object", "" + Property: "LeftFootExtraFinger3", "object", "" + Property: "LeftFootExtraFinger4", "object", "" + Property: "RightInFootThumb", "object", "" + Property: "RightFootThumb1", "object", "" + Property: "RightFootThumb2", "object", "" + Property: "RightFootThumb3", "object", "" + Property: "RightFootThumb4", "object", "" + Property: "RightInFootIndex", "object", "" + Property: "RightFootIndex1", "object", "" + Property: "RightFootIndex2", "object", "" + Property: "RightFootIndex3", "object", "" + Property: "RightFootIndex4", "object", "" + Property: "RightInFootMiddle", "object", "" + Property: "RightFootMiddle1", "object", "" + Property: "RightFootMiddle2", "object", "" + Property: "RightFootMiddle3", "object", "" + Property: "RightFootMiddle4", "object", "" + Property: "RightInFootRing", "object", "" + Property: "RightFootRing1", "object", "" + Property: "RightFootRing2", "object", "" + Property: "RightFootRing3", "object", "" + Property: "RightFootRing4", "object", "" + Property: "RightInFootPinky", "object", "" + Property: "RightFootPinky1", "object", "" + Property: "RightFootPinky2", "object", "" + Property: "RightFootPinky3", "object", "" + Property: "RightFootPinky4", "object", "" + Property: "RightInFootExtraFinger", "object", "" + Property: "RightFootExtraFinger1", "object", "" + Property: "RightFootExtraFinger2", "object", "" + Property: "RightFootExtraFinger3", "object", "" + Property: "RightFootExtraFinger4", "object", "" + Property: "LeftShoulderExtra", "object", "" + Property: "RightShoulderExtra", "object", "" + Property: "HipsEffector", "object", "" + Property: "LeftAnkleEffector", "object", "" + Property: "RightAnkleEffector", "object", "" + Property: "LeftWristEffector", "object", "" + Property: "RightWristEffector", "object", "" + Property: "LeftKneeEffector", "object", "" + Property: "RightKneeEffector", "object", "" + Property: "LeftElbowEffector", "object", "" + Property: "RightElbowEffector", "object", "" + Property: "ChestOriginEffector", "object", "" + Property: "ChestEndEffector", "object", "" + Property: "LeftFootEffector", "object", "" + Property: "RightFootEffector", "object", "" + Property: "LeftShoulderEffector", "object", "" + Property: "RightShoulderEffector", "object", "" + Property: "HeadEffector", "object", "" + Property: "LeftHipEffector", "object", "" + Property: "RightHipEffector", "object", "" + Property: "LeftHandEffector", "object", "" + Property: "RightHandEffector", "object", "" + Property: "LeftHandThumbEffector", "object", "" + Property: "LeftHandIndexEffector", "object", "" + Property: "LeftHandMiddleEffector", "object", "" + Property: "LeftHandRingEffector", "object", "" + Property: "LeftHandPinkyEffector", "object", "" + Property: "LeftHandExtraFingerEffector", "object", "" + Property: "RightHandThumbEffector", "object", "" + Property: "RightHandIndexEffector", "object", "" + Property: "RightHandMiddleEffector", "object", "" + Property: "RightHandRingEffector", "object", "" + Property: "RightHandPinkyEffector", "object", "" + Property: "RightHandExtraFingerEffector", "object", "" + Property: "LeftFootThumbEffector", "object", "" + Property: "LeftFootIndexEffector", "object", "" + Property: "LeftFootMiddleEffector", "object", "" + Property: "LeftFootRingEffector", "object", "" + Property: "LeftFootPinkyEffector", "object", "" + Property: "LeftFootExtraFingerEffector", "object", "" + Property: "RightFootThumbEffector", "object", "" + Property: "RightFootIndexEffector", "object", "" + Property: "RightFootMiddleEffector", "object", "" + Property: "RightFootRingEffector", "object", "" + Property: "RightFootPinkyEffector", "object", "" + Property: "RightFootExtraFingerEffector", "object", "" + Property: "HipsEffectorTPin", "Bool", "A",0 + Property: "HipsEffectorRPin", "Bool", "A",0 + Property: "LeftAnkleEffectorTPin", "Bool", "A",1 + Property: "LeftAnkleEffectorRPin", "Bool", "A",1 + Property: "RightAnkleEffectorTPin", "Bool", "A",1 + Property: "RightAnkleEffectorRPin", "Bool", "A",1 + Property: "LeftWristEffectorTPin", "Bool", "A",0 + Property: "LeftWristEffectorRPin", "Bool", "A",0 + Property: "RightWristEffectorTPin", "Bool", "A",0 + Property: "RightWristEffectorRPin", "Bool", "A",0 + Property: "LeftKneeEffectorTPin", "Bool", "A",0 + Property: "LeftKneeEffectorRPin", "Bool", "A",0 + Property: "RightKneeEffectorTPin", "Bool", "A",0 + Property: "RightKneeEffectorRPin", "Bool", "A",0 + Property: "LeftElbowEffectorTPin", "Bool", "A",0 + Property: "LeftElbowEffectorRPin", "Bool", "A",0 + Property: "RightElbowEffectorTPin", "Bool", "A",0 + Property: "RightElbowEffectorRPin", "Bool", "A",0 + Property: "ChestOriginEffectorTPin", "Bool", "A",0 + Property: "ChestOriginEffectorRPin", "Bool", "A",0 + Property: "ChestEndEffectorTPin", "Bool", "A",0 + Property: "ChestEndEffectorRPin", "Bool", "A",0 + Property: "LeftFootEffectorTPin", "Bool", "A",0 + Property: "LeftFootEffectorRPin", "Bool", "A",0 + Property: "RightFootEffectorTPin", "Bool", "A",0 + Property: "RightFootEffectorRPin", "Bool", "A",0 + Property: "LeftShoulderEffectorTPin", "Bool", "A",0 + Property: "LeftShoulderEffectorRPin", "Bool", "A",0 + Property: "RightShoulderEffectorTPin", "Bool", "A",0 + Property: "RightShoulderEffectorRPin", "Bool", "A",0 + Property: "HeadEffectorTPin", "Bool", "A",0 + Property: "HeadEffectorRPin", "Bool", "A",0 + Property: "LeftHipEffectorTPin", "Bool", "A",0 + Property: "LeftHipEffectorRPin", "Bool", "A",0 + Property: "RightHipEffectorTPin", "Bool", "A",0 + Property: "RightHipEffectorRPin", "Bool", "A",0 + Property: "LeftHandThumbEffectorTPin", "Bool", "A",0 + Property: "LeftHandThumbEffectorRPin", "Bool", "A",0 + Property: "LeftHandIndexEffectorTPin", "Bool", "A",0 + Property: "LeftHandIndexEffectorRPin", "Bool", "A",0 + Property: "LeftHandMiddleEffectorTPin", "Bool", "A",0 + Property: "LeftHandMiddleEffectorRPin", "Bool", "A",0 + Property: "LeftHandRingEffectorTPin", "Bool", "A",0 + Property: "LeftHandRingEffectorRPin", "Bool", "A",0 + Property: "LeftHandPinkyEffectorTPin", "Bool", "A",0 + Property: "LeftHandPinkyEffectorRPin", "Bool", "A",0 + Property: "RightHandThumbEffectorTPin", "Bool", "A",0 + Property: "RightHandThumbEffectorRPin", "Bool", "A",0 + Property: "RightHandIndexEffectorTPin", "Bool", "A",0 + Property: "RightHandIndexEffectorRPin", "Bool", "A",0 + Property: "RightHandMiddleEffectorTPin", "Bool", "A",0 + Property: "RightHandMiddleEffectorRPin", "Bool", "A",0 + Property: "RightHandRingEffectorTPin", "Bool", "A",0 + Property: "RightHandRingEffectorRPin", "Bool", "A",0 + Property: "RightHandPinkyEffectorTPin", "Bool", "A",0 + Property: "RightHandPinkyEffectorRPin", "Bool", "A",0 + } + } + Constraint: "Constraint::Character1", "Character" { + Type: "Character" + MultiLayer: 0 + Properties60: { + Property: "Active", "bool", "",1 + Property: "Lock", "bool", "",0 + Property: "Weight", "Weight", "A",100 + Property: "SourceObject", "object", "" + Property: "DestinationObject", "object", "" + Property: "Actor", "object", "" + Property: "Character", "object", "" + Property: "ControlSet", "object", "" + Property: "PullIterationCount", "int", "",10 + Property: "Posture", "enum", "",0 + Property: "ForceActorSpace", "bool", "",0 + Property: "ScaleCompensation", "Number", "A",100 + Property: "ScaleCompensationMode", "enum", "",1 + Property: "HipsHeightCompensation", "Number", "A",0 + Property: "HipsHeightCompensationMode", "enum", "",1 + Property: "AnkleHeightCompensation", "Number", "A",0 + Property: "AnkleHeightCompensationMode", "enum", "",1 + Property: "AnkleProximityCompensation", "Number", "A",0 + Property: "AnkleProximityCompensationMode", "enum", "",1 + Property: "MassCenterCompensation", "Number", "A",80 + Property: "ApplyLimits", "bool", "",0 + Property: "ChestReduction", "Number", "A",0 + Property: "CollarReduction", "Number", "A",0 + Property: "NeckReduction", "Number", "A",0 + Property: "HeadReduction", "Number", "A",0 + Property: "ReachActorLeftAnkle", "Number", "A",100 + Property: "ReachActorRightAnkle", "Number", "A",100 + Property: "ReachActorLeftKnee", "Number", "A",0 + Property: "ReachActorRightKnee", "Number", "A",0 + Property: "ReachActorChest", "Number", "A",0 + Property: "ReachActorHead", "Number", "A",0 + Property: "ReachActorLeftWrist", "Number", "A",0 + Property: "ReachActorRightWrist", "Number", "A",0 + Property: "ReachActorLeftElbow", "Number", "A",0 + Property: "ReachActorRightElbow", "Number", "A",0 + Property: "ReachActorLeftFingerBase", "Number", "A",0 + Property: "ReachActorRightFingerBase", "Number", "A",0 + Property: "ReachActorLeftToesBase", "Number", "A",0 + Property: "ReachActorRightToesBase", "Number", "A",0 + Property: "ReachActorLeftFingerBaseRotation", "Number", "A",0 + Property: "ReachActorRightFingerBaseRotation", "Number", "A",0 + Property: "ReachActorLeftToesBaseRotation", "Number", "A",0 + Property: "ReachActorRightToesBaseRotation", "Number", "A",0 + Property: "ReachActorLeftAnkleRotation", "Number", "A",100 + Property: "ReachActorRightAnkleRotation", "Number", "A",100 + Property: "ReachActorHeadRotation", "Number", "A",0 + Property: "ReachActorLeftWristRotation", "Number", "A",0 + Property: "ReachActorRightWristRotation", "Number", "A",0 + Property: "ReachActorChestRotation", "Number", "A",0 + Property: "ReachActorLowerChestRotation", "Number", "A",0 + Property: "HipsTOffset", "Vector", "A",0,0,0 + Property: "ChestTOffset", "Vector", "A",0,0,0 + Property: "LeftUpLegRoll", "Number", "A",0 + Property: "LeftUpLegRollMode", "bool", "",1 + Property: "LeftLegRoll", "Number", "A",39.9999976158142 + Property: "LeftLegRollMode", "bool", "",1 + Property: "RightUpLegRoll", "Number", "A",0 + Property: "RightUpLegRollMode", "bool", "",1 + Property: "RightLegRoll", "Number", "A",39.9999976158142 + Property: "RightLegRollMode", "bool", "",1 + Property: "LeftArmRoll", "Number", "A",0 + Property: "LeftArmRollMode", "bool", "",1 + Property: "LeftForeArmRoll", "Number", "A",100 + Property: "LeftForeArmRollMode", "bool", "",1 + Property: "RightArmRoll", "Number", "A",0 + Property: "RightArmRollMode", "bool", "",1 + Property: "RightForeArmRoll", "Number", "A",100 + Property: "RightForeArmRollMode", "bool", "",1 + Property: "RollExtractionMode", "enum", "",0 + Property: "FootFloorContact", "bool", "",0 + Property: "FootAutomaticToes", "bool", "",0 + Property: "FootFloorPivot", "enum", "",0 + Property: "FootBottomToAnkle", "double", "",8.150396347 + Property: "FootBackToAnkle", "double", "",6.47736045 + Property: "FootMiddleToAnkle", "double", "",12.9547209 + Property: "FootFrontToMiddle", "double", "",6.47736045 + Property: "FootInToAnkle", "double", "",6.47736045 + Property: "FootOutToAnkle", "double", "",6.47736045 + Property: "FootContactSize", "double", "",100 + Property: "FootContactStiffness", "Number", "A",0 + Property: "FootFingerContactRollStiffness", "Number", "A",0 + Property: "HandFloorContact", "bool", "",0 + Property: "HandAutomaticFingers", "bool", "",0 + Property: "HandFloorPivot", "enum", "",0 + Property: "HandBottomToWrist", "double", "",3.42318412772 + Property: "HandBackToWrist", "double", "",0.01 + Property: "HandMiddleToWrist", "double", "",8.550115794 + Property: "HandFrontToMiddle", "double", "",8.550115794 + Property: "HandInToWrist", "double", "",8.550115794 + Property: "HandOutToWrist", "double", "",8.550115794 + Property: "HandContactSize", "double", "",100 + Property: "HandContactStiffness", "Number", "A",0 + Property: "HandFingerContactRollStiffness", "Number", "A",0 + Property: "CtrlPullLeftToeBase", "Number", "A",0 + Property: "CtrlPullLeftFoot", "Number", "A",0 + Property: "CtrlPullLeftKnee", "Number", "A",0 + Property: "CtrlPullRightToeBase", "Number", "A",0 + Property: "CtrlPullRightFoot", "Number", "A",0 + Property: "CtrlPullRightKnee", "Number", "A",0 + Property: "CtrlPullLeftFingerBase", "Number", "A",0 + Property: "CtrlPullLeftHand", "Number", "A",100 + Property: "CtrlPullLeftElbow", "Number", "A",0 + Property: "CtrlPullRightFingerBase", "Number", "A",0 + Property: "CtrlPullRightHand", "Number", "A",100 + Property: "CtrlPullRightElbow", "Number", "A",0 + Property: "CtrlChestPullLeftHand", "Number", "A",0 + Property: "CtrlChestPullRightHand", "Number", "A",0 + Property: "CtrlPullHead", "Number", "A",0 + Property: "CtrlResistHipsPosition", "Number", "A",0 + Property: "CtrlEnforceGravity", "Number", "A",60.0000023841858 + Property: "CtrlResistHipsOrientation", "Number", "A",0 + Property: "CtrlResistChestPosition", "Number", "A",0 + Property: "CtrlResistChestOrientation", "Number", "A",0 + Property: "CtrlResistLeftCollar", "Number", "A",50 + Property: "CtrlResistRightCollar", "Number", "A",50 + Property: "CtrlResistLeftKnee", "Number", "A",50 + Property: "CtrlResistMaximumExtensionLeftKnee", "Number", "A",50 + Property: "CtrlResistCompressionFactorLeftKnee", "Number", "A",50 + Property: "CtrlResistRightKnee", "Number", "A",50 + Property: "CtrlResistMaximumExtensionRightKnee", "Number", "A",50 + Property: "CtrlResistCompressionFactorRightKnee", "Number", "A",50 + Property: "CtrlResistLeftElbow", "Number", "A",50 + Property: "CtrlResistMaximumExtensionLeftElbow", "Number", "A",50 + Property: "CtrlResistCompressionFactorLeftElbow", "Number", "A",50 + Property: "CtrlResistRightElbow", "Number", "A",50 + Property: "CtrlResistMaximumExtensionRightElbow", "Number", "A",50 + Property: "CtrlResistCompressionFactorRightElbow", "Number", "A",50 + Property: "CtrlSpineStiffness", "Number", "A",0 + Property: "CtrlNeckStiffness", "Number", "A",0 + Property: "MirrorMode", "bool", "",0 + Property: "ShoulderCorrection", "Number", "A",0 + Property: "LeftKneeKillPitch", "bool", "",0 + Property: "RightKneeKillPitch", "bool", "",0 + Property: "LeftElbowKillPitch", "bool", "",0 + Property: "RightElbowKillPitch", "bool", "",0 + Property: "HipsTranslationMode", "enum", "",0 + Property: "WriteReference", "bool", "",0 + Property: "SyncMode", "bool", "H",0 + Property: "Damping", "Number", "A",0 + Property: "OrientationDamping", "Number", "A",0 + Property: "OrientationDampingMode", "enum", "",1 + Property: "DisplacementDamping", "Number", "A",0 + Property: "DisplacementDampingMode", "enum", "",1 + Property: "DisplacementMemory", "Number", "A",0 + Property: "DisplacementMemoryMode", "enum", "",0 + Property: "HipsDisplacementDamping", "Number", "A",0 + Property: "HipsDisplacementDampingMode", "enum", "",0 + Property: "AnkleDisplacementDamping", "Number", "A",0 + Property: "AnkleDisplacementDampingMode", "enum", "",0 + Property: "WristDisplacementDamping", "Number", "A",0 + Property: "WristDisplacementDampingMode", "enum", "",0 + Property: "Stabilization", "Number", "A",0 + Property: "AnkleStabilizationTime", "Number", "A",0 + Property: "AnkleStabilizationTimeMode", "enum", "",0 + Property: "AnkleStabilizationPerimeter", "Number", "A",0 + Property: "AnkleStabilizationPerimeterMode", "enum", "",0 + Property: "AnkleStabilizationAngularPerimeter", "Number", "A",0 + Property: "AnkleStabilizationAngularPerimeterMode", "enum", "",1 + Property: "AnkleStabilizationFloorProximity", "Number", "A",0 + Property: "AnkleStabilizationFloorProximityMode", "enum", "",1 + Property: "AnkleStabilizationDamping", "Number", "A",0 + Property: "AnkleStabilizationDampingMode", "enum", "",0 + Property: "AnkleStabilizationRecoveryTime", "Number", "A",0 + Property: "AnkleStabilizationRecoveryTimeMode", "enum", "",1 + Property: "LeftHandThumbTip", "double", "",1.0697450399125 + Property: "LeftHandIndexTip", "double", "",1.0697450399125 + Property: "LeftHandMiddleTip", "double", "",1.0697450399125 + Property: "LeftHandRingTip", "double", "",1.0697450399125 + Property: "LeftHandPinkyTip", "double", "",1.0697450399125 + Property: "LeftHandExtraFingerTip", "double", "",1.0697450399125 + Property: "RightHandThumbTip", "double", "",1.0697450399125 + Property: "RightHandIndexTip", "double", "",1.0697450399125 + Property: "RightHandMiddleTip", "double", "",1.0697450399125 + Property: "RightHandRingTip", "double", "",1.0697450399125 + Property: "RightHandPinkyTip", "double", "",1.0697450399125 + Property: "RightHandExtraFingerTip", "double", "",1.0697450399125 + Property: "LeftFootThumbTip", "double", "",1.0697450399125 + Property: "LeftFootIndexTip", "double", "",1.0697450399125 + Property: "LeftFootMiddleTip", "double", "",1.0697450399125 + Property: "LeftFootRingTip", "double", "",1.0697450399125 + Property: "LeftFootPinkyTip", "double", "",1.0697450399125 + Property: "LeftFootExtraFingerTip", "double", "",1.0697450399125 + Property: "RightFootThumbTip", "double", "",1.0697450399125 + Property: "RightFootIndexTip", "double", "",1.0697450399125 + Property: "RightFootMiddleTip", "double", "",1.0697450399125 + Property: "RightFootRingTip", "double", "",1.0697450399125 + Property: "RightFootPinkyTip", "double", "",1.0697450399125 + Property: "RightFootExtraFingerTip", "double", "",1.0697450399125 + Property: "FingerSolving", "bool", "",1 + Property: "FootFingerContact", "bool", "",0 + Property: "FootContactType", "enum", "",0 + Property: "FootFingerContactMode", "enum", "",1 + Property: "HandFingerContact", "bool", "",0 + Property: "HandContactType", "enum", "",0 + Property: "HandFingerContactMode", "enum", "",1 + Property: "ContactBehaviour", "enum", "",0 + Property: "HikVersion", "double", "",2016.5 + Property: "Characterize", "bool", "",1 + Property: "HipsLink", "object", "" + Property: "LeftUpLegLink", "object", "" + Property: "LeftLegLink", "object", "" + Property: "LeftFootLink", "object", "" + Property: "LeftToeBaseLink", "object", "" + Property: "RightUpLegLink", "object", "" + Property: "RightLegLink", "object", "" + Property: "RightFootLink", "object", "" + Property: "RightToeBaseLink", "object", "" + Property: "SpineLink", "object", "" + Property: "Spine1Link", "object", "" + Property: "LeftShoulderLink", "object", "" + Property: "LeftArmLink", "object", "" + Property: "LeftForeArmLink", "object", "" + Property: "LeftHandLink", "object", "" + Property: "RightShoulderLink", "object", "" + Property: "RightArmLink", "object", "" + Property: "RightForeArmLink", "object", "" + Property: "RightHandLink", "object", "" + Property: "NeckLink", "object", "" + Property: "HeadLink", "object", "" + Property: "LeftUpLegRollLink", "object", "" + Property: "LeftLegRollLink", "object", "" + Property: "RightUpLegRollLink", "object", "" + Property: "RightLegRollLink", "object", "" + Property: "LeftArmRollLink", "object", "" + Property: "LeftForeArmRollLink", "object", "" + Property: "RightArmRollLink", "object", "" + Property: "RightForeArmRollLink", "object", "" + Property: "Spine2Link", "object", "" + Property: "Spine3Link", "object", "" + Property: "Spine4Link", "object", "" + Property: "Spine5Link", "object", "" + Property: "Spine6Link", "object", "" + Property: "Spine7Link", "object", "" + Property: "Spine8Link", "object", "" + Property: "Spine9Link", "object", "" + Property: "LeftHandThumb1Link", "object", "" + Property: "LeftHandThumb2Link", "object", "" + Property: "LeftHandThumb3Link", "object", "" + Property: "LeftHandIndex1Link", "object", "" + Property: "LeftHandIndex2Link", "object", "" + Property: "LeftHandIndex3Link", "object", "" + Property: "LeftHandMiddle1Link", "object", "" + Property: "LeftHandMiddle2Link", "object", "" + Property: "LeftHandMiddle3Link", "object", "" + Property: "LeftHandRing1Link", "object", "" + Property: "LeftHandRing2Link", "object", "" + Property: "LeftHandRing3Link", "object", "" + Property: "LeftHandPinky1Link", "object", "" + Property: "LeftHandPinky2Link", "object", "" + Property: "LeftHandPinky3Link", "object", "" + Property: "RightHandThumb1Link", "object", "" + Property: "RightHandThumb2Link", "object", "" + Property: "RightHandThumb3Link", "object", "" + Property: "RightHandIndex1Link", "object", "" + Property: "RightHandIndex2Link", "object", "" + Property: "RightHandIndex3Link", "object", "" + Property: "RightHandMiddle1Link", "object", "" + Property: "RightHandMiddle2Link", "object", "" + Property: "RightHandMiddle3Link", "object", "" + Property: "RightHandRing1Link", "object", "" + Property: "RightHandRing2Link", "object", "" + Property: "RightHandRing3Link", "object", "" + Property: "RightHandPinky1Link", "object", "" + Property: "RightHandPinky2Link", "object", "" + Property: "RightHandPinky3Link", "object", "" + Property: "ReferenceLink", "object", "" + Property: "LeftFloorContactLink", "object", "" + Property: "RightFloorContactLink", "object", "" + Property: "HipsTranslationLink", "object", "" + Property: "Props0Link", "object", "" + Property: "Props1Link", "object", "" + Property: "Props2Link", "object", "" + Property: "Props3Link", "object", "" + Property: "Props4Link", "object", "" + Property: "GameModeParentLeftHipRollLink", "object", "" + Property: "GameModeParentLeftKneeLink", "object", "" + Property: "GameModeParentLeftKneeRollLink", "object", "" + Property: "GameModeParentRightHipRollLink", "object", "" + Property: "GameModeParentRightKneeLink", "object", "" + Property: "GameModeParentRightKneeRollLink", "object", "" + Property: "GameModeParentLeftShoulderRollLink", "object", "" + Property: "GameModeParentLeftElbowLink", "object", "" + Property: "GameModeParentLeftElbowRollLink", "object", "" + Property: "GameModeParentRightShoulderRollLink", "object", "" + Property: "GameModeParentRightElbowLink", "object", "" + Property: "GameModeParentRightElbowRollLink", "object", "" + Property: "LeftHandFloorContactLink", "object", "" + Property: "RightHandFloorContactLink", "object", "" + Property: "LeftFingerBaseLink", "object", "" + Property: "RightFingerBaseLink", "object", "" + Property: "Neck1Link", "object", "" + Property: "Neck2Link", "object", "" + Property: "Neck3Link", "object", "" + Property: "Neck4Link", "object", "" + Property: "Neck5Link", "object", "" + Property: "Neck6Link", "object", "" + Property: "Neck7Link", "object", "" + Property: "Neck8Link", "object", "" + Property: "Neck9Link", "object", "" + Property: "LeftInHandThumbLink", "object", "" + Property: "LeftHandThumb4Link", "object", "" + Property: "LeftInHandIndexLink", "object", "" + Property: "LeftHandIndex4Link", "object", "" + Property: "LeftInHandMiddleLink", "object", "" + Property: "LeftHandMiddle4Link", "object", "" + Property: "LeftInHandRingLink", "object", "" + Property: "LeftHandRing4Link", "object", "" + Property: "LeftInHandPinkyLink", "object", "" + Property: "LeftHandPinky4Link", "object", "" + Property: "LeftInHandExtraFingerLink", "object", "" + Property: "LeftHandExtraFinger1Link", "object", "" + Property: "LeftHandExtraFinger2Link", "object", "" + Property: "LeftHandExtraFinger3Link", "object", "" + Property: "LeftHandExtraFinger4Link", "object", "" + Property: "RightInHandThumbLink", "object", "" + Property: "RightHandThumb4Link", "object", "" + Property: "RightInHandIndexLink", "object", "" + Property: "RightHandIndex4Link", "object", "" + Property: "RightInHandMiddleLink", "object", "" + Property: "RightHandMiddle4Link", "object", "" + Property: "RightInHandRingLink", "object", "" + Property: "RightHandRing4Link", "object", "" + Property: "RightInHandPinkyLink", "object", "" + Property: "RightHandPinky4Link", "object", "" + Property: "RightInHandExtraFingerLink", "object", "" + Property: "RightHandExtraFinger1Link", "object", "" + Property: "RightHandExtraFinger2Link", "object", "" + Property: "RightHandExtraFinger3Link", "object", "" + Property: "RightHandExtraFinger4Link", "object", "" + Property: "LeftInFootThumbLink", "object", "" + Property: "LeftFootThumb1Link", "object", "" + Property: "LeftFootThumb2Link", "object", "" + Property: "LeftFootThumb3Link", "object", "" + Property: "LeftFootThumb4Link", "object", "" + Property: "LeftInFootIndexLink", "object", "" + Property: "LeftFootIndex1Link", "object", "" + Property: "LeftFootIndex2Link", "object", "" + Property: "LeftFootIndex3Link", "object", "" + Property: "LeftFootIndex4Link", "object", "" + Property: "LeftInFootMiddleLink", "object", "" + Property: "LeftFootMiddle1Link", "object", "" + Property: "LeftFootMiddle2Link", "object", "" + Property: "LeftFootMiddle3Link", "object", "" + Property: "LeftFootMiddle4Link", "object", "" + Property: "LeftInFootRingLink", "object", "" + Property: "LeftFootRing1Link", "object", "" + Property: "LeftFootRing2Link", "object", "" + Property: "LeftFootRing3Link", "object", "" + Property: "LeftFootRing4Link", "object", "" + Property: "LeftInFootPinkyLink", "object", "" + Property: "LeftFootPinky1Link", "object", "" + Property: "LeftFootPinky2Link", "object", "" + Property: "LeftFootPinky3Link", "object", "" + Property: "LeftFootPinky4Link", "object", "" + Property: "LeftInFootExtraFingerLink", "object", "" + Property: "LeftFootExtraFinger1Link", "object", "" + Property: "LeftFootExtraFinger2Link", "object", "" + Property: "LeftFootExtraFinger3Link", "object", "" + Property: "LeftFootExtraFinger4Link", "object", "" + Property: "RightInFootThumbLink", "object", "" + Property: "RightFootThumb1Link", "object", "" + Property: "RightFootThumb2Link", "object", "" + Property: "RightFootThumb3Link", "object", "" + Property: "RightFootThumb4Link", "object", "" + Property: "RightInFootIndexLink", "object", "" + Property: "RightFootIndex1Link", "object", "" + Property: "RightFootIndex2Link", "object", "" + Property: "RightFootIndex3Link", "object", "" + Property: "RightFootIndex4Link", "object", "" + Property: "RightInFootMiddleLink", "object", "" + Property: "RightFootMiddle1Link", "object", "" + Property: "RightFootMiddle2Link", "object", "" + Property: "RightFootMiddle3Link", "object", "" + Property: "RightFootMiddle4Link", "object", "" + Property: "RightInFootRingLink", "object", "" + Property: "RightFootRing1Link", "object", "" + Property: "RightFootRing2Link", "object", "" + Property: "RightFootRing3Link", "object", "" + Property: "RightFootRing4Link", "object", "" + Property: "RightInFootPinkyLink", "object", "" + Property: "RightFootPinky1Link", "object", "" + Property: "RightFootPinky2Link", "object", "" + Property: "RightFootPinky3Link", "object", "" + Property: "RightFootPinky4Link", "object", "" + Property: "RightInFootExtraFingerLink", "object", "" + Property: "RightFootExtraFinger1Link", "object", "" + Property: "RightFootExtraFinger2Link", "object", "" + Property: "RightFootExtraFinger3Link", "object", "" + Property: "RightFootExtraFinger4Link", "object", "" + Property: "LeftShoulderExtraLink", "object", "" + Property: "RightShoulderExtraLink", "object", "" + } + CHARACTERIZE: 1 + LOCK_XFORM: 0 + LOCK_PICK: 0 + REFERENCE: { + TOFFSETX: 0 + TOFFSETY: 0 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LEFT_FLOOR: { + } + RIGHT_FLOOR: { + } + LEFT_HANDFLOOR: { + } + RIGHT_HANDFLOOR: { + } + BASE: { + LINK: "Hips" { + TOFFSETX: 0 + TOFFSETY: 100 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftUpLeg" { + TOFFSETX: 8.910000801 + TOFFSETY: 93.72999954 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftLeg" { + TOFFSETX: 8.910000801 + TOFFSETY: 48.8513546 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftFoot" { + TOFFSETX: 8.910000801 + TOFFSETY: 8.150396347 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightUpLeg" { + TOFFSETX: -8.910000801 + TOFFSETY: 93.72999954 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightLeg" { + TOFFSETX: -8.910003517 + TOFFSETY: 48.8513546 + TOFFSETZ: 0.000439024 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightFoot" { + TOFFSETX: -8.910002598 + TOFFSETY: 8.150396351 + TOFFSETZ: 0.000439024 + ROFFSETX: 0 + ROFFSETY: -0.004800386 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Spine" { + TOFFSETX: 0 + TOFFSETY: 107 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftArm" { + TOFFSETX: 17.70725107 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftForeArm" { + TOFFSETX: 45.01271677 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHand" { + TOFFSETX: 71.70986414 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightArm" { + TOFFSETX: -17.70727491 + TOFFSETY: 146.58898 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightForeArm" { + TOFFSETX: -45.01287316 + TOFFSETY: 146.58898 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHand" { + TOFFSETX: -71.70986127 + TOFFSETY: 146.5889787 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Head" { + TOFFSETX: 0 + TOFFSETY: 165 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + AUXILIARY: { + LINK: "LeftToeBase" { + TOFFSETX: 8.910009228 + TOFFSETY: 1.888079154 + TOFFSETZ: 12.9547209 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightToeBase" { + TOFFSETX: -8.911087979 + TOFFSETY: 1.888079171 + TOFFSETZ: 12.95518809 + ROFFSETX: 0.002912593 + ROFFSETY: -0.004800386 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftShoulder" { + TOFFSETX: 7.000000477 + TOFFSETY: 146.5885468 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000735282 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightShoulder" { + TOFFSETX: -6.999999523 + TOFFSETY: 146.5885468 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.002318361 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Neck" { + TOFFSETX: 0 + TOFFSETY: 145 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + SPINE: { + LINK: "Spine1" { + TOFFSETX: 0 + TOFFSETY: 119.666666666667 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Spine2" { + TOFFSETX: 0 + TOFFSETY: 132.333333333333 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + NECK: { + } + ROLL: { + } + SPECIAL: { + } + LEFTHAND: { + LINK: "LeftHandThumb1" { + TOFFSETX: 76.05862099 + TOFFSETY: 145.7901817 + TOFFSETZ: 4.282433967 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb2" { + TOFFSETX: 78.57121093 + TOFFSETY: 145.2540823 + TOFFSETZ: 4.989888291 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000297862 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb3" { + TOFFSETX: 81.11435134 + TOFFSETY: 145.2540691 + TOFFSETZ: 4.989897633 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex1" { + TOFFSETX: 80.53184086 + TOFFSETY: 146.7884134 + TOFFSETZ: 3.471669416 + ROFFSETX: 0 + ROFFSETY: -1.999999985 + ROFFSETZ: -0.000299341 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999983 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex2" { + TOFFSETX: 84.75459546 + TOFFSETY: 146.7883913 + TOFFSETZ: 3.618868435 + ROFFSETX: 0 + ROFFSETY: -1.999999985 + ROFFSETZ: -0.000299341 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999983 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex3" { + TOFFSETX: 87.40692091 + TOFFSETY: 146.7883775 + TOFFSETZ: 3.711324415 + ROFFSETX: 0 + ROFFSETY: -1.999999985 + ROFFSETZ: -0.000299341 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999983 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle1" { + TOFFSETX: 80.5197435 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.304684381 + ROFFSETX: 0 + ROFFSETY: -0.003563334 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle2" { + TOFFSETX: 85.38299518 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.304986836 + ROFFSETX: 0 + ROFFSETY: -0.003563334 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle3" { + TOFFSETX: 88.14823179 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.305158619 + ROFFSETX: 0 + ROFFSETY: -0.003563334 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing1" { + TOFFSETX: 80.60362393 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793158909 + ROFFSETX: 0 + ROFFSETY: -0.003563529 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing2" { + TOFFSETX: 85.14138276 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.79315882 + ROFFSETX: 0 + ROFFSETY: -0.003563529 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing3" { + TOFFSETX: 87.44590862 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793158937 + ROFFSETX: 0 + ROFFSETY: -0.003563529 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky1" { + TOFFSETX: 80.59213883 + TOFFSETY: 146.2756572 + TOFFSETZ: -2.490356465 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000763026 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky2" { + TOFFSETX: 83.63623816 + TOFFSETY: 146.2756978 + TOFFSETZ: -2.490356465 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000763026 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky3" { + TOFFSETX: 85.61073965 + TOFFSETY: 146.2757241 + TOFFSETZ: -2.490356608 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000763026 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb4" { + TOFFSETX: 83.78109748 + TOFFSETY: 145.254072 + TOFFSETZ: 4.989889422 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex4" { + TOFFSETX: 89.36395514 + TOFFSETY: 146.7883673 + TOFFSETZ: 3.779543315 + ROFFSETX: 0 + ROFFSETY: -1.999999985 + ROFFSETZ: -0.000299341 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999983 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle4" { + TOFFSETX: 90.15386395 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.305282215 + ROFFSETX: 0 + ROFFSETY: -0.003563334 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing4" { + TOFFSETX: 89.36925598 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793159754 + ROFFSETX: 0 + ROFFSETY: -0.003563529 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky4" { + TOFFSETX: 87.2773543 + TOFFSETY: 146.2757463 + TOFFSETZ: -2.490355817 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000763026 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + RIGHTHAND: { + LINK: "RightHandThumb1" { + TOFFSETX: -76.05824206 + TOFFSETY: 145.7904806 + TOFFSETZ: 4.282814738 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb2" { + TOFFSETX: -78.57076957 + TOFFSETY: 145.2543817 + TOFFSETZ: 4.990491388 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000602085999999999 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb3" { + TOFFSETX: -81.11235893 + TOFFSETY: 145.2544085 + TOFFSETZ: 5.079311703 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000391494 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex1" { + TOFFSETX: -80.53153393 + TOFFSETY: 146.7887124 + TOFFSETZ: 3.472444296 + ROFFSETX: 0 + ROFFSETY: -2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex2" { + TOFFSETX: -84.75428415 + TOFFSETY: 146.7887121 + TOFFSETZ: 3.325092508 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex3" { + TOFFSETX: -87.40660695 + TOFFSETY: 146.7887118 + TOFFSETZ: 3.232540367 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle1" { + TOFFSETX: -80.5196273 + TOFFSETY: 147.0898718 + TOFFSETZ: 1.305458427 + ROFFSETX: 0 + ROFFSETY: -2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle2" { + TOFFSETX: -85.37992179 + TOFFSETY: 147.0898714 + TOFFSETZ: 1.135859675 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle3" { + TOFFSETX: -88.14347689 + TOFFSETY: 147.0898712 + TOFFSETZ: 1.039426113 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing1" { + TOFFSETX: -80.6036937 + TOFFSETY: 146.968899 + TOFFSETZ: -0.792376756 + ROFFSETX: 0 + ROFFSETY: -2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing2" { + TOFFSETX: -85.13869331 + TOFFSETY: 146.9688986 + TOFFSETZ: -0.950624428 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing3" { + TOFFSETX: -87.44181788 + TOFFSETY: 146.9688984 + TOFFSETZ: -1.03099138 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky1" { + TOFFSETX: -80.59235737 + TOFFSETY: 146.2759509 + TOFFSETZ: -2.489574194 + ROFFSETX: 0 + ROFFSETY: -2.000064658 + ROFFSETZ: 0.001241215 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999714 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky2" { + TOFFSETX: -83.63829999 + TOFFSETY: 146.2758849 + TOFFSETZ: -2.595861595 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0.001241215 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999714 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky3" { + TOFFSETX: -85.61399713 + TOFFSETY: 146.2758421 + TOFFSETZ: -2.664803045 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0.001241215 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999714 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb4" { + TOFFSETX: -83.77747869 + TOFFSETY: 145.2544268 + TOFFSETZ: 5.17244902 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000391494 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex4" { + TOFFSETX: -89.36363917 + TOFFSETY: 146.7887117 + TOFFSETZ: 3.164250215 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle4" { + TOFFSETX: -90.14788957 + TOFFSETY: 147.089871 + TOFFSETZ: 0.969482638 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing4" { + TOFFSETX: -89.3639958 + TOFFSETY: 146.9688983 + TOFFSETZ: -1.098065296 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky4" { + TOFFSETX: -87.28162098 + TOFFSETY: 146.2758059 + TOFFSETZ: -2.722994364 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0.001241215 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999714 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + LEFTFOOT: { + } + RIGHTFOOT: { + } + PROPS: { + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",100 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Character1_Reference", "Model::Scene" + Connect: "OO", "Model::Character1_Ctrl_Reference", "Model::Scene" + Connect: "OO", "Model::Character1_Hips", "Model::Character1_Reference" + Connect: "OO", "Model::Character1_LeftUpLeg", "Model::Character1_Hips" + Connect: "OO", "Model::Character1_RightUpLeg", "Model::Character1_Hips" + Connect: "OO", "Model::Character1_Spine", "Model::Character1_Hips" + Connect: "OO", "Model::Character1_LeftLeg", "Model::Character1_LeftUpLeg" + Connect: "OO", "Model::Character1_LeftFoot", "Model::Character1_LeftLeg" + Connect: "OO", "Model::Character1_LeftToeBase", "Model::Character1_LeftFoot" + Connect: "OO", "Model::Character1_RightLeg", "Model::Character1_RightUpLeg" + Connect: "OO", "Model::Character1_RightFoot", "Model::Character1_RightLeg" + Connect: "OO", "Model::Character1_RightToeBase", "Model::Character1_RightFoot" + Connect: "OO", "Model::Character1_Spine1", "Model::Character1_Spine" + Connect: "OO", "Model::Character1_Spine2", "Model::Character1_Spine1" + Connect: "OO", "Model::Character1_LeftShoulder", "Model::Character1_Spine2" + Connect: "OO", "Model::Character1_RightShoulder", "Model::Character1_Spine2" + Connect: "OO", "Model::Character1_Neck", "Model::Character1_Spine2" + Connect: "OO", "Model::Character1_LeftArm", "Model::Character1_LeftShoulder" + Connect: "OO", "Model::Character1_LeftForeArm", "Model::Character1_LeftArm" + Connect: "OO", "Model::Character1_LeftHand", "Model::Character1_LeftForeArm" + Connect: "OO", "Model::Character1_LeftHandThumb1", "Model::Character1_LeftHand" + Connect: "OO", "Model::Character1_LeftHandIndex1", "Model::Character1_LeftHand" + Connect: "OO", "Model::Character1_LeftHandMiddle1", "Model::Character1_LeftHand" + Connect: "OO", "Model::Character1_LeftHandRing1", "Model::Character1_LeftHand" + Connect: "OO", "Model::Character1_LeftHandPinky1", "Model::Character1_LeftHand" + Connect: "OO", "Model::Character1_LeftHandThumb2", "Model::Character1_LeftHandThumb1" + Connect: "OO", "Model::Character1_LeftHandThumb3", "Model::Character1_LeftHandThumb2" + Connect: "OO", "Model::Character1_LeftHandThumb4", "Model::Character1_LeftHandThumb3" + Connect: "OO", "Model::Character1_LeftHandIndex2", "Model::Character1_LeftHandIndex1" + Connect: "OO", "Model::Character1_LeftHandIndex3", "Model::Character1_LeftHandIndex2" + Connect: "OO", "Model::Character1_LeftHandIndex4", "Model::Character1_LeftHandIndex3" + Connect: "OO", "Model::Character1_LeftHandMiddle2", "Model::Character1_LeftHandMiddle1" + Connect: "OO", "Model::Character1_LeftHandMiddle3", "Model::Character1_LeftHandMiddle2" + Connect: "OO", "Model::Character1_LeftHandMiddle4", "Model::Character1_LeftHandMiddle3" + Connect: "OO", "Model::Character1_LeftHandRing2", "Model::Character1_LeftHandRing1" + Connect: "OO", "Model::Character1_LeftHandRing3", "Model::Character1_LeftHandRing2" + Connect: "OO", "Model::Character1_LeftHandRing4", "Model::Character1_LeftHandRing3" + Connect: "OO", "Model::Character1_LeftHandPinky2", "Model::Character1_LeftHandPinky1" + Connect: "OO", "Model::Character1_LeftHandPinky3", "Model::Character1_LeftHandPinky2" + Connect: "OO", "Model::Character1_LeftHandPinky4", "Model::Character1_LeftHandPinky3" + Connect: "OO", "Model::Character1_RightArm", "Model::Character1_RightShoulder" + Connect: "OO", "Model::Character1_RightForeArm", "Model::Character1_RightArm" + Connect: "OO", "Model::Character1_RightHand", "Model::Character1_RightForeArm" + Connect: "OO", "Model::Character1_RightHandThumb1", "Model::Character1_RightHand" + Connect: "OO", "Model::Character1_RightHandIndex1", "Model::Character1_RightHand" + Connect: "OO", "Model::Character1_RightHandMiddle1", "Model::Character1_RightHand" + Connect: "OO", "Model::Character1_RightHandRing1", "Model::Character1_RightHand" + Connect: "OO", "Model::Character1_RightHandPinky1", "Model::Character1_RightHand" + Connect: "OO", "Model::Character1_RightHandThumb2", "Model::Character1_RightHandThumb1" + Connect: "OO", "Model::Character1_RightHandThumb3", "Model::Character1_RightHandThumb2" + Connect: "OO", "Model::Character1_RightHandThumb4", "Model::Character1_RightHandThumb3" + Connect: "OO", "Model::Character1_RightHandIndex2", "Model::Character1_RightHandIndex1" + Connect: "OO", "Model::Character1_RightHandIndex3", "Model::Character1_RightHandIndex2" + Connect: "OO", "Model::Character1_RightHandIndex4", "Model::Character1_RightHandIndex3" + Connect: "OO", "Model::Character1_RightHandMiddle2", "Model::Character1_RightHandMiddle1" + Connect: "OO", "Model::Character1_RightHandMiddle3", "Model::Character1_RightHandMiddle2" + Connect: "OO", "Model::Character1_RightHandMiddle4", "Model::Character1_RightHandMiddle3" + Connect: "OO", "Model::Character1_RightHandRing2", "Model::Character1_RightHandRing1" + Connect: "OO", "Model::Character1_RightHandRing3", "Model::Character1_RightHandRing2" + Connect: "OO", "Model::Character1_RightHandRing4", "Model::Character1_RightHandRing3" + Connect: "OO", "Model::Character1_RightHandPinky2", "Model::Character1_RightHandPinky1" + Connect: "OO", "Model::Character1_RightHandPinky3", "Model::Character1_RightHandPinky2" + Connect: "OO", "Model::Character1_RightHandPinky4", "Model::Character1_RightHandPinky3" + Connect: "OO", "Model::Character1_Head", "Model::Character1_Neck" + Connect: "OO", "Model::Character1_Ctrl_HipsEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftAnkleEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightAnkleEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftWristEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightWristEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftKneeEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightKneeEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftElbowEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightElbowEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_ChestOriginEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_ChestEndEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftFootEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightFootEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftShoulderEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightShoulderEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_HeadEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftHipEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightHipEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftHandThumbEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftHandIndexEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftHandMiddleEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftHandRingEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftHandPinkyEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightHandThumbEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightHandIndexEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightHandMiddleEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightHandRingEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_RightHandPinkyEffector", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_Hips", "Model::Character1_Ctrl_Reference" + Connect: "OO", "Model::Character1_Ctrl_LeftUpLeg", "Model::Character1_Ctrl_Hips" + Connect: "OO", "Model::Character1_Ctrl_RightUpLeg", "Model::Character1_Ctrl_Hips" + Connect: "OO", "Model::Character1_Ctrl_Spine", "Model::Character1_Ctrl_Hips" + Connect: "OO", "Model::Character1_Ctrl_LeftLeg", "Model::Character1_Ctrl_LeftUpLeg" + Connect: "OO", "Model::Character1_Ctrl_LeftFoot", "Model::Character1_Ctrl_LeftLeg" + Connect: "OO", "Model::Character1_Ctrl_LeftToeBase", "Model::Character1_Ctrl_LeftFoot" + Connect: "OO", "Model::Character1_Ctrl_RightLeg", "Model::Character1_Ctrl_RightUpLeg" + Connect: "OO", "Model::Character1_Ctrl_RightFoot", "Model::Character1_Ctrl_RightLeg" + Connect: "OO", "Model::Character1_Ctrl_RightToeBase", "Model::Character1_Ctrl_RightFoot" + Connect: "OO", "Model::Character1_Ctrl_Spine1", "Model::Character1_Ctrl_Spine" + Connect: "OO", "Model::Character1_Ctrl_Spine2", "Model::Character1_Ctrl_Spine1" + Connect: "OO", "Model::Character1_Ctrl_LeftShoulder", "Model::Character1_Ctrl_Spine2" + Connect: "OO", "Model::Character1_Ctrl_RightShoulder", "Model::Character1_Ctrl_Spine2" + Connect: "OO", "Model::Character1_Ctrl_Neck", "Model::Character1_Ctrl_Spine2" + Connect: "OO", "Model::Character1_Ctrl_LeftArm", "Model::Character1_Ctrl_LeftShoulder" + Connect: "OO", "Model::Character1_Ctrl_LeftForeArm", "Model::Character1_Ctrl_LeftArm" + Connect: "OO", "Model::Character1_Ctrl_LeftHand", "Model::Character1_Ctrl_LeftForeArm" + Connect: "OO", "Model::Character1_Ctrl_LeftHandThumb1", "Model::Character1_Ctrl_LeftHand" + Connect: "OO", "Model::Character1_Ctrl_LeftHandIndex1", "Model::Character1_Ctrl_LeftHand" + Connect: "OO", "Model::Character1_Ctrl_LeftHandMiddle1", "Model::Character1_Ctrl_LeftHand" + Connect: "OO", "Model::Character1_Ctrl_LeftHandRing1", "Model::Character1_Ctrl_LeftHand" + Connect: "OO", "Model::Character1_Ctrl_LeftHandPinky1", "Model::Character1_Ctrl_LeftHand" + Connect: "OO", "Model::Character1_Ctrl_LeftHandThumb2", "Model::Character1_Ctrl_LeftHandThumb1" + Connect: "OO", "Model::Character1_Ctrl_LeftHandThumb3", "Model::Character1_Ctrl_LeftHandThumb2" + Connect: "OO", "Model::Character1_Ctrl_LeftHandThumb4", "Model::Character1_Ctrl_LeftHandThumb3" + Connect: "OO", "Model::Character1_Ctrl_LeftHandIndex2", "Model::Character1_Ctrl_LeftHandIndex1" + Connect: "OO", "Model::Character1_Ctrl_LeftHandIndex3", "Model::Character1_Ctrl_LeftHandIndex2" + Connect: "OO", "Model::Character1_Ctrl_LeftHandIndex4", "Model::Character1_Ctrl_LeftHandIndex3" + Connect: "OO", "Model::Character1_Ctrl_LeftHandMiddle2", "Model::Character1_Ctrl_LeftHandMiddle1" + Connect: "OO", "Model::Character1_Ctrl_LeftHandMiddle3", "Model::Character1_Ctrl_LeftHandMiddle2" + Connect: "OO", "Model::Character1_Ctrl_LeftHandMiddle4", "Model::Character1_Ctrl_LeftHandMiddle3" + Connect: "OO", "Model::Character1_Ctrl_LeftHandRing2", "Model::Character1_Ctrl_LeftHandRing1" + Connect: "OO", "Model::Character1_Ctrl_LeftHandRing3", "Model::Character1_Ctrl_LeftHandRing2" + Connect: "OO", "Model::Character1_Ctrl_LeftHandRing4", "Model::Character1_Ctrl_LeftHandRing3" + Connect: "OO", "Model::Character1_Ctrl_LeftHandPinky2", "Model::Character1_Ctrl_LeftHandPinky1" + Connect: "OO", "Model::Character1_Ctrl_LeftHandPinky3", "Model::Character1_Ctrl_LeftHandPinky2" + Connect: "OO", "Model::Character1_Ctrl_LeftHandPinky4", "Model::Character1_Ctrl_LeftHandPinky3" + Connect: "OO", "Model::Character1_Ctrl_RightArm", "Model::Character1_Ctrl_RightShoulder" + Connect: "OO", "Model::Character1_Ctrl_RightForeArm", "Model::Character1_Ctrl_RightArm" + Connect: "OO", "Model::Character1_Ctrl_RightHand", "Model::Character1_Ctrl_RightForeArm" + Connect: "OO", "Model::Character1_Ctrl_RightHandThumb1", "Model::Character1_Ctrl_RightHand" + Connect: "OO", "Model::Character1_Ctrl_RightHandIndex1", "Model::Character1_Ctrl_RightHand" + Connect: "OO", "Model::Character1_Ctrl_RightHandMiddle1", "Model::Character1_Ctrl_RightHand" + Connect: "OO", "Model::Character1_Ctrl_RightHandRing1", "Model::Character1_Ctrl_RightHand" + Connect: "OO", "Model::Character1_Ctrl_RightHandPinky1", "Model::Character1_Ctrl_RightHand" + Connect: "OO", "Model::Character1_Ctrl_RightHandThumb2", "Model::Character1_Ctrl_RightHandThumb1" + Connect: "OO", "Model::Character1_Ctrl_RightHandThumb3", "Model::Character1_Ctrl_RightHandThumb2" + Connect: "OO", "Model::Character1_Ctrl_RightHandThumb4", "Model::Character1_Ctrl_RightHandThumb3" + Connect: "OO", "Model::Character1_Ctrl_RightHandIndex2", "Model::Character1_Ctrl_RightHandIndex1" + Connect: "OO", "Model::Character1_Ctrl_RightHandIndex3", "Model::Character1_Ctrl_RightHandIndex2" + Connect: "OO", "Model::Character1_Ctrl_RightHandIndex4", "Model::Character1_Ctrl_RightHandIndex3" + Connect: "OO", "Model::Character1_Ctrl_RightHandMiddle2", "Model::Character1_Ctrl_RightHandMiddle1" + Connect: "OO", "Model::Character1_Ctrl_RightHandMiddle3", "Model::Character1_Ctrl_RightHandMiddle2" + Connect: "OO", "Model::Character1_Ctrl_RightHandMiddle4", "Model::Character1_Ctrl_RightHandMiddle3" + Connect: "OO", "Model::Character1_Ctrl_RightHandRing2", "Model::Character1_Ctrl_RightHandRing1" + Connect: "OO", "Model::Character1_Ctrl_RightHandRing3", "Model::Character1_Ctrl_RightHandRing2" + Connect: "OO", "Model::Character1_Ctrl_RightHandRing4", "Model::Character1_Ctrl_RightHandRing3" + Connect: "OO", "Model::Character1_Ctrl_RightHandPinky2", "Model::Character1_Ctrl_RightHandPinky1" + Connect: "OO", "Model::Character1_Ctrl_RightHandPinky3", "Model::Character1_Ctrl_RightHandPinky2" + Connect: "OO", "Model::Character1_Ctrl_RightHandPinky4", "Model::Character1_Ctrl_RightHandPinky3" + Connect: "OO", "Model::Character1_Ctrl_Head", "Model::Character1_Ctrl_Neck" + Connect: "OP", "Model::Character1_Ctrl_Hips", "ControlSetPlug::Character1_ControlRig", "Hips" + Connect: "OP", "Model::Character1_Ctrl_LeftUpLeg", "ControlSetPlug::Character1_ControlRig", "LeftUpLeg" + Connect: "OP", "Model::Character1_Ctrl_LeftLeg", "ControlSetPlug::Character1_ControlRig", "LeftLeg" + Connect: "OP", "Model::Character1_Ctrl_LeftFoot", "ControlSetPlug::Character1_ControlRig", "LeftFoot" + Connect: "OP", "Model::Character1_Ctrl_LeftToeBase", "ControlSetPlug::Character1_ControlRig", "LeftToeBase" + Connect: "OP", "Model::Character1_Ctrl_RightUpLeg", "ControlSetPlug::Character1_ControlRig", "RightUpLeg" + Connect: "OP", "Model::Character1_Ctrl_RightLeg", "ControlSetPlug::Character1_ControlRig", "RightLeg" + Connect: "OP", "Model::Character1_Ctrl_RightFoot", "ControlSetPlug::Character1_ControlRig", "RightFoot" + Connect: "OP", "Model::Character1_Ctrl_RightToeBase", "ControlSetPlug::Character1_ControlRig", "RightToeBase" + Connect: "OP", "Model::Character1_Ctrl_Spine", "ControlSetPlug::Character1_ControlRig", "Spine" + Connect: "OP", "Model::Character1_Ctrl_Spine1", "ControlSetPlug::Character1_ControlRig", "Spine1" + Connect: "OP", "Model::Character1_Ctrl_LeftShoulder", "ControlSetPlug::Character1_ControlRig", "LeftShoulder" + Connect: "OP", "Model::Character1_Ctrl_LeftArm", "ControlSetPlug::Character1_ControlRig", "LeftArm" + Connect: "OP", "Model::Character1_Ctrl_LeftForeArm", "ControlSetPlug::Character1_ControlRig", "LeftForeArm" + Connect: "OP", "Model::Character1_Ctrl_LeftHand", "ControlSetPlug::Character1_ControlRig", "LeftHand" + Connect: "OP", "Model::Character1_Ctrl_RightShoulder", "ControlSetPlug::Character1_ControlRig", "RightShoulder" + Connect: "OP", "Model::Character1_Ctrl_RightArm", "ControlSetPlug::Character1_ControlRig", "RightArm" + Connect: "OP", "Model::Character1_Ctrl_RightForeArm", "ControlSetPlug::Character1_ControlRig", "RightForeArm" + Connect: "OP", "Model::Character1_Ctrl_RightHand", "ControlSetPlug::Character1_ControlRig", "RightHand" + Connect: "OP", "Model::Character1_Ctrl_Neck", "ControlSetPlug::Character1_ControlRig", "Neck" + Connect: "OP", "Model::Character1_Ctrl_Head", "ControlSetPlug::Character1_ControlRig", "Head" + Connect: "OP", "Model::Character1_Ctrl_Spine2", "ControlSetPlug::Character1_ControlRig", "Spine2" + Connect: "OP", "Model::Character1_Ctrl_LeftHandThumb1", "ControlSetPlug::Character1_ControlRig", "LeftHandThumb1" + Connect: "OP", "Model::Character1_Ctrl_LeftHandThumb2", "ControlSetPlug::Character1_ControlRig", "LeftHandThumb2" + Connect: "OP", "Model::Character1_Ctrl_LeftHandThumb3", "ControlSetPlug::Character1_ControlRig", "LeftHandThumb3" + Connect: "OP", "Model::Character1_Ctrl_LeftHandIndex1", "ControlSetPlug::Character1_ControlRig", "LeftHandIndex1" + Connect: "OP", "Model::Character1_Ctrl_LeftHandIndex2", "ControlSetPlug::Character1_ControlRig", "LeftHandIndex2" + Connect: "OP", "Model::Character1_Ctrl_LeftHandIndex3", "ControlSetPlug::Character1_ControlRig", "LeftHandIndex3" + Connect: "OP", "Model::Character1_Ctrl_LeftHandMiddle1", "ControlSetPlug::Character1_ControlRig", "LeftHandMiddle1" + Connect: "OP", "Model::Character1_Ctrl_LeftHandMiddle2", "ControlSetPlug::Character1_ControlRig", "LeftHandMiddle2" + Connect: "OP", "Model::Character1_Ctrl_LeftHandMiddle3", "ControlSetPlug::Character1_ControlRig", "LeftHandMiddle3" + Connect: "OP", "Model::Character1_Ctrl_LeftHandRing1", "ControlSetPlug::Character1_ControlRig", "LeftHandRing1" + Connect: "OP", "Model::Character1_Ctrl_LeftHandRing2", "ControlSetPlug::Character1_ControlRig", "LeftHandRing2" + Connect: "OP", "Model::Character1_Ctrl_LeftHandRing3", "ControlSetPlug::Character1_ControlRig", "LeftHandRing3" + Connect: "OP", "Model::Character1_Ctrl_LeftHandPinky1", "ControlSetPlug::Character1_ControlRig", "LeftHandPinky1" + Connect: "OP", "Model::Character1_Ctrl_LeftHandPinky2", "ControlSetPlug::Character1_ControlRig", "LeftHandPinky2" + Connect: "OP", "Model::Character1_Ctrl_LeftHandPinky3", "ControlSetPlug::Character1_ControlRig", "LeftHandPinky3" + Connect: "OP", "Model::Character1_Ctrl_RightHandThumb1", "ControlSetPlug::Character1_ControlRig", "RightHandThumb1" + Connect: "OP", "Model::Character1_Ctrl_RightHandThumb2", "ControlSetPlug::Character1_ControlRig", "RightHandThumb2" + Connect: "OP", "Model::Character1_Ctrl_RightHandThumb3", "ControlSetPlug::Character1_ControlRig", "RightHandThumb3" + Connect: "OP", "Model::Character1_Ctrl_RightHandIndex1", "ControlSetPlug::Character1_ControlRig", "RightHandIndex1" + Connect: "OP", "Model::Character1_Ctrl_RightHandIndex2", "ControlSetPlug::Character1_ControlRig", "RightHandIndex2" + Connect: "OP", "Model::Character1_Ctrl_RightHandIndex3", "ControlSetPlug::Character1_ControlRig", "RightHandIndex3" + Connect: "OP", "Model::Character1_Ctrl_RightHandMiddle1", "ControlSetPlug::Character1_ControlRig", "RightHandMiddle1" + Connect: "OP", "Model::Character1_Ctrl_RightHandMiddle2", "ControlSetPlug::Character1_ControlRig", "RightHandMiddle2" + Connect: "OP", "Model::Character1_Ctrl_RightHandMiddle3", "ControlSetPlug::Character1_ControlRig", "RightHandMiddle3" + Connect: "OP", "Model::Character1_Ctrl_RightHandRing1", "ControlSetPlug::Character1_ControlRig", "RightHandRing1" + Connect: "OP", "Model::Character1_Ctrl_RightHandRing2", "ControlSetPlug::Character1_ControlRig", "RightHandRing2" + Connect: "OP", "Model::Character1_Ctrl_RightHandRing3", "ControlSetPlug::Character1_ControlRig", "RightHandRing3" + Connect: "OP", "Model::Character1_Ctrl_RightHandPinky1", "ControlSetPlug::Character1_ControlRig", "RightHandPinky1" + Connect: "OP", "Model::Character1_Ctrl_RightHandPinky2", "ControlSetPlug::Character1_ControlRig", "RightHandPinky2" + Connect: "OP", "Model::Character1_Ctrl_RightHandPinky3", "ControlSetPlug::Character1_ControlRig", "RightHandPinky3" + Connect: "OP", "Model::Character1_Ctrl_Reference", "ControlSetPlug::Character1_ControlRig", "Reference" + Connect: "OP", "Model::Character1_Ctrl_LeftHandThumb4", "ControlSetPlug::Character1_ControlRig", "LeftHandThumb4" + Connect: "OP", "Model::Character1_Ctrl_LeftHandIndex4", "ControlSetPlug::Character1_ControlRig", "LeftHandIndex4" + Connect: "OP", "Model::Character1_Ctrl_LeftHandMiddle4", "ControlSetPlug::Character1_ControlRig", "LeftHandMiddle4" + Connect: "OP", "Model::Character1_Ctrl_LeftHandRing4", "ControlSetPlug::Character1_ControlRig", "LeftHandRing4" + Connect: "OP", "Model::Character1_Ctrl_LeftHandPinky4", "ControlSetPlug::Character1_ControlRig", "LeftHandPinky4" + Connect: "OP", "Model::Character1_Ctrl_RightHandThumb4", "ControlSetPlug::Character1_ControlRig", "RightHandThumb4" + Connect: "OP", "Model::Character1_Ctrl_RightHandIndex4", "ControlSetPlug::Character1_ControlRig", "RightHandIndex4" + Connect: "OP", "Model::Character1_Ctrl_RightHandMiddle4", "ControlSetPlug::Character1_ControlRig", "RightHandMiddle4" + Connect: "OP", "Model::Character1_Ctrl_RightHandRing4", "ControlSetPlug::Character1_ControlRig", "RightHandRing4" + Connect: "OP", "Model::Character1_Ctrl_RightHandPinky4", "ControlSetPlug::Character1_ControlRig", "RightHandPinky4" + Connect: "OP", "Model::Character1_Ctrl_HipsEffector", "ControlSetPlug::Character1_ControlRig", "HipsEffector" + Connect: "OP", "Model::Character1_Ctrl_LeftAnkleEffector", "ControlSetPlug::Character1_ControlRig", "LeftAnkleEffector" + Connect: "OP", "Model::Character1_Ctrl_RightAnkleEffector", "ControlSetPlug::Character1_ControlRig", "RightAnkleEffector" + Connect: "OP", "Model::Character1_Ctrl_LeftWristEffector", "ControlSetPlug::Character1_ControlRig", "LeftWristEffector" + Connect: "OP", "Model::Character1_Ctrl_RightWristEffector", "ControlSetPlug::Character1_ControlRig", "RightWristEffector" + Connect: "OP", "Model::Character1_Ctrl_LeftKneeEffector", "ControlSetPlug::Character1_ControlRig", "LeftKneeEffector" + Connect: "OP", "Model::Character1_Ctrl_RightKneeEffector", "ControlSetPlug::Character1_ControlRig", "RightKneeEffector" + Connect: "OP", "Model::Character1_Ctrl_LeftElbowEffector", "ControlSetPlug::Character1_ControlRig", "LeftElbowEffector" + Connect: "OP", "Model::Character1_Ctrl_RightElbowEffector", "ControlSetPlug::Character1_ControlRig", "RightElbowEffector" + Connect: "OP", "Model::Character1_Ctrl_ChestOriginEffector", "ControlSetPlug::Character1_ControlRig", "ChestOriginEffector" + Connect: "OP", "Model::Character1_Ctrl_ChestEndEffector", "ControlSetPlug::Character1_ControlRig", "ChestEndEffector" + Connect: "OP", "Model::Character1_Ctrl_LeftFootEffector", "ControlSetPlug::Character1_ControlRig", "LeftFootEffector" + Connect: "OP", "Model::Character1_Ctrl_RightFootEffector", "ControlSetPlug::Character1_ControlRig", "RightFootEffector" + Connect: "OP", "Model::Character1_Ctrl_LeftShoulderEffector", "ControlSetPlug::Character1_ControlRig", "LeftShoulderEffector" + + Connect: "OP", "Model::Character1_Ctrl_RightShoulderEffector", "ControlSetPlug::Character1_ControlRig", "RightShoulderEffector" + + Connect: "OP", "Model::Character1_Ctrl_HeadEffector", "ControlSetPlug::Character1_ControlRig", "HeadEffector" + Connect: "OP", "Model::Character1_Ctrl_LeftHipEffector", "ControlSetPlug::Character1_ControlRig", "LeftHipEffector" + Connect: "OP", "Model::Character1_Ctrl_RightHipEffector", "ControlSetPlug::Character1_ControlRig", "RightHipEffector" + Connect: "OP", "Model::Character1_Ctrl_LeftHandThumbEffector", "ControlSetPlug::Character1_ControlRig", "LeftHandThumbEffector" + + Connect: "OP", "Model::Character1_Ctrl_LeftHandIndexEffector", "ControlSetPlug::Character1_ControlRig", "LeftHandIndexEffector" + + Connect: "OP", "Model::Character1_Ctrl_LeftHandMiddleEffector", "ControlSetPlug::Character1_ControlRig", "LeftHandMiddleEffector" + + Connect: "OP", "Model::Character1_Ctrl_LeftHandRingEffector", "ControlSetPlug::Character1_ControlRig", "LeftHandRingEffector" + + Connect: "OP", "Model::Character1_Ctrl_LeftHandPinkyEffector", "ControlSetPlug::Character1_ControlRig", "LeftHandPinkyEffector" + + Connect: "OP", "Model::Character1_Ctrl_RightHandThumbEffector", "ControlSetPlug::Character1_ControlRig", "RightHandThumbEffector" + + Connect: "OP", "Model::Character1_Ctrl_RightHandIndexEffector", "ControlSetPlug::Character1_ControlRig", "RightHandIndexEffector" + + Connect: "OP", "Model::Character1_Ctrl_RightHandMiddleEffector", "ControlSetPlug::Character1_ControlRig", "RightHandMiddleEffector" + + Connect: "OP", "Model::Character1_Ctrl_RightHandRingEffector", "ControlSetPlug::Character1_ControlRig", "RightHandRingEffector" + + Connect: "OP", "Model::Character1_Ctrl_RightHandPinkyEffector", "ControlSetPlug::Character1_ControlRig", "RightHandPinkyEffector" + + Connect: "OO", "ControlSetPlug::Character1_ControlRig", "Constraint::Character1" + Connect: "OP", "ControlSetPlug::Character1_ControlRig", "Constraint::Character1", "SourceObject" + Connect: "OP", "ControlSetPlug::Character1_ControlRig", "Constraint::Character1", "ControlSet" + Connect: "OP", "Model::Character1_Hips", "Constraint::Character1", "HipsLink" + Connect: "OP", "Model::Character1_LeftUpLeg", "Constraint::Character1", "LeftUpLegLink" + Connect: "OP", "Model::Character1_LeftLeg", "Constraint::Character1", "LeftLegLink" + Connect: "OP", "Model::Character1_LeftFoot", "Constraint::Character1", "LeftFootLink" + Connect: "OP", "Model::Character1_LeftToeBase", "Constraint::Character1", "LeftToeBaseLink" + Connect: "OP", "Model::Character1_RightUpLeg", "Constraint::Character1", "RightUpLegLink" + Connect: "OP", "Model::Character1_RightLeg", "Constraint::Character1", "RightLegLink" + Connect: "OP", "Model::Character1_RightFoot", "Constraint::Character1", "RightFootLink" + Connect: "OP", "Model::Character1_RightToeBase", "Constraint::Character1", "RightToeBaseLink" + Connect: "OP", "Model::Character1_Spine", "Constraint::Character1", "SpineLink" + Connect: "OP", "Model::Character1_Spine1", "Constraint::Character1", "Spine1Link" + Connect: "OP", "Model::Character1_LeftShoulder", "Constraint::Character1", "LeftShoulderLink" + Connect: "OP", "Model::Character1_LeftArm", "Constraint::Character1", "LeftArmLink" + Connect: "OP", "Model::Character1_LeftForeArm", "Constraint::Character1", "LeftForeArmLink" + Connect: "OP", "Model::Character1_LeftHand", "Constraint::Character1", "LeftHandLink" + Connect: "OP", "Model::Character1_RightShoulder", "Constraint::Character1", "RightShoulderLink" + Connect: "OP", "Model::Character1_RightArm", "Constraint::Character1", "RightArmLink" + Connect: "OP", "Model::Character1_RightForeArm", "Constraint::Character1", "RightForeArmLink" + Connect: "OP", "Model::Character1_RightHand", "Constraint::Character1", "RightHandLink" + Connect: "OP", "Model::Character1_Neck", "Constraint::Character1", "NeckLink" + Connect: "OP", "Model::Character1_Head", "Constraint::Character1", "HeadLink" + Connect: "OP", "Model::Character1_Spine2", "Constraint::Character1", "Spine2Link" + Connect: "OP", "Model::Character1_LeftHandThumb1", "Constraint::Character1", "LeftHandThumb1Link" + Connect: "OP", "Model::Character1_LeftHandThumb2", "Constraint::Character1", "LeftHandThumb2Link" + Connect: "OP", "Model::Character1_LeftHandThumb3", "Constraint::Character1", "LeftHandThumb3Link" + Connect: "OP", "Model::Character1_LeftHandIndex1", "Constraint::Character1", "LeftHandIndex1Link" + Connect: "OP", "Model::Character1_LeftHandIndex2", "Constraint::Character1", "LeftHandIndex2Link" + Connect: "OP", "Model::Character1_LeftHandIndex3", "Constraint::Character1", "LeftHandIndex3Link" + Connect: "OP", "Model::Character1_LeftHandMiddle1", "Constraint::Character1", "LeftHandMiddle1Link" + Connect: "OP", "Model::Character1_LeftHandMiddle2", "Constraint::Character1", "LeftHandMiddle2Link" + Connect: "OP", "Model::Character1_LeftHandMiddle3", "Constraint::Character1", "LeftHandMiddle3Link" + Connect: "OP", "Model::Character1_LeftHandRing1", "Constraint::Character1", "LeftHandRing1Link" + Connect: "OP", "Model::Character1_LeftHandRing2", "Constraint::Character1", "LeftHandRing2Link" + Connect: "OP", "Model::Character1_LeftHandRing3", "Constraint::Character1", "LeftHandRing3Link" + Connect: "OP", "Model::Character1_LeftHandPinky1", "Constraint::Character1", "LeftHandPinky1Link" + Connect: "OP", "Model::Character1_LeftHandPinky2", "Constraint::Character1", "LeftHandPinky2Link" + Connect: "OP", "Model::Character1_LeftHandPinky3", "Constraint::Character1", "LeftHandPinky3Link" + Connect: "OP", "Model::Character1_RightHandThumb1", "Constraint::Character1", "RightHandThumb1Link" + Connect: "OP", "Model::Character1_RightHandThumb2", "Constraint::Character1", "RightHandThumb2Link" + Connect: "OP", "Model::Character1_RightHandThumb3", "Constraint::Character1", "RightHandThumb3Link" + Connect: "OP", "Model::Character1_RightHandIndex1", "Constraint::Character1", "RightHandIndex1Link" + Connect: "OP", "Model::Character1_RightHandIndex2", "Constraint::Character1", "RightHandIndex2Link" + Connect: "OP", "Model::Character1_RightHandIndex3", "Constraint::Character1", "RightHandIndex3Link" + Connect: "OP", "Model::Character1_RightHandMiddle1", "Constraint::Character1", "RightHandMiddle1Link" + Connect: "OP", "Model::Character1_RightHandMiddle2", "Constraint::Character1", "RightHandMiddle2Link" + Connect: "OP", "Model::Character1_RightHandMiddle3", "Constraint::Character1", "RightHandMiddle3Link" + Connect: "OP", "Model::Character1_RightHandRing1", "Constraint::Character1", "RightHandRing1Link" + Connect: "OP", "Model::Character1_RightHandRing2", "Constraint::Character1", "RightHandRing2Link" + Connect: "OP", "Model::Character1_RightHandRing3", "Constraint::Character1", "RightHandRing3Link" + Connect: "OP", "Model::Character1_RightHandPinky1", "Constraint::Character1", "RightHandPinky1Link" + Connect: "OP", "Model::Character1_RightHandPinky2", "Constraint::Character1", "RightHandPinky2Link" + Connect: "OP", "Model::Character1_RightHandPinky3", "Constraint::Character1", "RightHandPinky3Link" + Connect: "OP", "Model::Character1_Reference", "Constraint::Character1", "ReferenceLink" + Connect: "OP", "Model::Character1_LeftHandThumb4", "Constraint::Character1", "LeftHandThumb4Link" + Connect: "OP", "Model::Character1_LeftHandIndex4", "Constraint::Character1", "LeftHandIndex4Link" + Connect: "OP", "Model::Character1_LeftHandMiddle4", "Constraint::Character1", "LeftHandMiddle4Link" + Connect: "OP", "Model::Character1_LeftHandRing4", "Constraint::Character1", "LeftHandRing4Link" + Connect: "OP", "Model::Character1_LeftHandPinky4", "Constraint::Character1", "LeftHandPinky4Link" + Connect: "OP", "Model::Character1_RightHandThumb4", "Constraint::Character1", "RightHandThumb4Link" + Connect: "OP", "Model::Character1_RightHandIndex4", "Constraint::Character1", "RightHandIndex4Link" + Connect: "OP", "Model::Character1_RightHandMiddle4", "Constraint::Character1", "RightHandMiddle4Link" + Connect: "OP", "Model::Character1_RightHandRing4", "Constraint::Character1", "RightHandRing4Link" + Connect: "OP", "Model::Character1_RightHandPinky4", "Constraint::Character1", "RightHandPinky4Link" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_human_ik_6100_binary.fbx b/modules/ufbx/data/maya_human_ik_6100_binary.fbx new file mode 100644 index 0000000..7e153eb Binary files /dev/null and b/modules/ufbx/data/maya_human_ik_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_human_ik_7400_ascii.fbx b/modules/ufbx/data/maya_human_ik_7400_ascii.fbx new file mode 100644 index 0000000..f1554f6 --- /dev/null +++ b/modules/ufbx/data/maya_human_ik_7400_ascii.fbx @@ -0,0 +1,10468 @@ +; FBX 7.4.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7400 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 4 + Day: 18 + Hour: 14 + Minute: 19 + Second: 48 + Millisecond: 928 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_human_ik_7400_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_human_ik_7400_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "18/04/2022 11:19:48.926" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_human_ik_7400_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "18/04/2022 11:19:48.926" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",100 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2376902909520, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 555 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 154 + PropertyTemplate: "FbxNull" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "Look", "enum", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 154 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 242 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "Character" { + Count: 1 + PropertyTemplate: "FbxCharacter" { + Properties70: { + P: "Active", "bool", "", "",1 + P: "Lock", "bool", "", "",0 + P: "Weight", "Weight", "", "A",100 + P: "SourceObject", "object", "", "" + P: "DestinationObject", "object", "", "" + P: "Actor", "object", "", "" + P: "Character", "object", "", "" + P: "ControlSet", "object", "", "" + P: "PullIterationCount", "int", "Integer", "",10 + P: "Posture", "enum", "", "",0 + P: "ForceActorSpace", "bool", "", "",0 + P: "ScaleCompensation", "Number", "", "A",100 + P: "ScaleCompensationMode", "enum", "", "",1 + P: "HipsHeightCompensation", "Number", "", "A",0 + P: "HipsHeightCompensationMode", "enum", "", "",1 + P: "AnkleHeightCompensation", "Number", "", "A",0 + P: "AnkleHeightCompensationMode", "enum", "", "",1 + P: "AnkleProximityCompensation", "Number", "", "A",0 + P: "AnkleProximityCompensationMode", "enum", "", "",1 + P: "MassCenterCompensation", "Number", "", "A",80 + P: "ApplyLimits", "bool", "", "",0 + P: "ChestReduction", "Number", "", "A",0 + P: "CollarReduction", "Number", "", "A",0 + P: "NeckReduction", "Number", "", "A",0 + P: "HeadReduction", "Number", "", "A",0 + P: "ReachActorLeftAnkle", "Number", "", "A",100 + P: "ReachActorRightAnkle", "Number", "", "A",100 + P: "ReachActorLeftKnee", "Number", "", "A",0 + P: "ReachActorRightKnee", "Number", "", "A",0 + P: "ReachActorChest", "Number", "", "A",0 + P: "ReachActorHead", "Number", "", "A",0 + P: "ReachActorLeftWrist", "Number", "", "A",0 + P: "ReachActorRightWrist", "Number", "", "A",0 + P: "ReachActorLeftElbow", "Number", "", "A",0 + P: "ReachActorRightElbow", "Number", "", "A",0 + P: "ReachActorLeftFingerBase", "Number", "", "A",0 + P: "ReachActorRightFingerBase", "Number", "", "A",0 + P: "ReachActorLeftToesBase", "Number", "", "A",0 + P: "ReachActorRightToesBase", "Number", "", "A",0 + P: "ReachActorLeftFingerBaseRotation", "Number", "", "A",0 + P: "ReachActorRightFingerBaseRotation", "Number", "", "A",0 + P: "ReachActorLeftToesBaseRotation", "Number", "", "A",0 + P: "ReachActorRightToesBaseRotation", "Number", "", "A",0 + P: "ReachActorLeftAnkleRotation", "Number", "", "A",100 + P: "ReachActorRightAnkleRotation", "Number", "", "A",100 + P: "ReachActorHeadRotation", "Number", "", "A",0 + P: "ReachActorLeftWristRotation", "Number", "", "A",0 + P: "ReachActorRightWristRotation", "Number", "", "A",0 + P: "ReachActorChestRotation", "Number", "", "A",0 + P: "ReachActorLowerChestRotation", "Number", "", "A",0 + P: "HipsTOffset", "Vector", "", "A",0,0,0 + P: "ChestTOffset", "Vector", "", "A",0,0,0 + P: "LeftUpLegRoll", "Number", "", "A",0 + P: "LeftUpLegRollMode", "bool", "", "",1 + P: "LeftLegRoll", "Number", "", "A",60 + P: "LeftLegRollMode", "bool", "", "",1 + P: "RightUpLegRoll", "Number", "", "A",0 + P: "RightUpLegRollMode", "bool", "", "",1 + P: "RightLegRoll", "Number", "", "A",60 + P: "RightLegRollMode", "bool", "", "",1 + P: "LeftArmRoll", "Number", "", "A",0 + P: "LeftArmRollMode", "bool", "", "",1 + P: "LeftForeArmRoll", "Number", "", "A",0 + P: "LeftForeArmRollMode", "bool", "", "",1 + P: "RightArmRoll", "Number", "", "A",0 + P: "RightArmRollMode", "bool", "", "",1 + P: "RightForeArmRoll", "Number", "", "A",0 + P: "RightForeArmRollMode", "bool", "", "",1 + P: "LeftUpLegRollEx", "Number", "", "A",40 + P: "LeftUpLegRollExMode", "bool", "", "",1 + P: "LeftLegRollEx", "Number", "", "A",80 + P: "LeftLegRollExMode", "bool", "", "",1 + P: "RightUpLegRollEx", "Number", "", "A",40 + P: "RightUpLegRollExMode", "bool", "", "",1 + P: "RightLegRollEx", "Number", "", "A",80 + P: "RightLegRollExMode", "bool", "", "",1 + P: "LeftArmRollEx", "Number", "", "A",40 + P: "LeftArmRollExMode", "bool", "", "",1 + P: "LeftForeArmRollEx", "Number", "", "A",40 + P: "LeftForeArmRollExMode", "bool", "", "",1 + P: "RightArmRollEx", "Number", "", "A",40 + P: "RightArmRollExMode", "bool", "", "",1 + P: "RightForeArmRollEx", "Number", "", "A",40 + P: "RightForeArmRollExMode", "bool", "", "",1 + P: "LeafLeftUpLegRoll1", "Number", "", "A",50 + P: "LeafLeftUpLegRoll1Mode", "bool", "", "",1 + P: "LeafLeftLegRoll1", "Number", "", "A",50 + P: "LeafLeftLegRoll1Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll1", "Number", "", "A",50 + P: "LeafRightUpLegRoll1Mode", "bool", "", "",1 + P: "LeafRightLegRoll1", "Number", "", "A",50 + P: "LeafRightLegRoll1Mode", "bool", "", "",1 + P: "LeafLeftArmRoll1", "Number", "", "A",50 + P: "LeafLeftArmRoll1Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll1", "Number", "", "A",50 + P: "LeafLeftForeArmRoll1Mode", "bool", "", "",1 + P: "LeafRightArmRoll1", "Number", "", "A",50 + P: "LeafRightArmRoll1Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll1", "Number", "", "A",50 + P: "LeafRightForeArmRoll1Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll2", "Number", "", "A",50 + P: "LeafLeftUpLegRoll2Mode", "bool", "", "",1 + P: "LeafLeftLegRoll2", "Number", "", "A",50 + P: "LeafLeftLegRoll2Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll2", "Number", "", "A",50 + P: "LeafRightUpLegRoll2Mode", "bool", "", "",1 + P: "LeafRightLegRoll2", "Number", "", "A",50 + P: "LeafRightLegRoll2Mode", "bool", "", "",1 + P: "LeafLeftArmRoll2", "Number", "", "A",50 + P: "LeafLeftArmRoll2Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll2", "Number", "", "A",50 + P: "LeafLeftForeArmRoll2Mode", "bool", "", "",1 + P: "LeafRightArmRoll2", "Number", "", "A",50 + P: "LeafRightArmRoll2Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll2", "Number", "", "A",50 + P: "LeafRightForeArmRoll2Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll3", "Number", "", "A",50 + P: "LeafLeftUpLegRoll3Mode", "bool", "", "",1 + P: "LeafLeftLegRoll3", "Number", "", "A",50 + P: "LeafLeftLegRoll3Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll3", "Number", "", "A",50 + P: "LeafRightUpLegRoll3Mode", "bool", "", "",1 + P: "LeafRightLegRoll3", "Number", "", "A",50 + P: "LeafRightLegRoll3Mode", "bool", "", "",1 + P: "LeafLeftArmRoll3", "Number", "", "A",50 + P: "LeafLeftArmRoll3Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll3", "Number", "", "A",50 + P: "LeafLeftForeArmRoll3Mode", "bool", "", "",1 + P: "LeafRightArmRoll3", "Number", "", "A",50 + P: "LeafRightArmRoll3Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll3", "Number", "", "A",50 + P: "LeafRightForeArmRoll3Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll4", "Number", "", "A",50 + P: "LeafLeftUpLegRoll4Mode", "bool", "", "",1 + P: "LeafLeftLegRoll4", "Number", "", "A",50 + P: "LeafLeftLegRoll4Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll4", "Number", "", "A",50 + P: "LeafRightUpLegRoll4Mode", "bool", "", "",1 + P: "LeafRightLegRoll4", "Number", "", "A",50 + P: "LeafRightLegRoll4Mode", "bool", "", "",1 + P: "LeafLeftArmRoll4", "Number", "", "A",50 + P: "LeafLeftArmRoll4Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll4", "Number", "", "A",50 + P: "LeafLeftForeArmRoll4Mode", "bool", "", "",1 + P: "LeafRightArmRoll4", "Number", "", "A",50 + P: "LeafRightArmRoll4Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll4", "Number", "", "A",50 + P: "LeafRightForeArmRoll4Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll5", "Number", "", "A",50 + P: "LeafLeftUpLegRoll5Mode", "bool", "", "",1 + P: "LeafLeftLegRoll5", "Number", "", "A",50 + P: "LeafLeftLegRoll5Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll5", "Number", "", "A",50 + P: "LeafRightUpLegRoll5Mode", "bool", "", "",1 + P: "LeafRightLegRoll5", "Number", "", "A",50 + P: "LeafRightLegRoll5Mode", "bool", "", "",1 + P: "LeafLeftArmRoll5", "Number", "", "A",50 + P: "LeafLeftArmRoll5Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll5", "Number", "", "A",50 + P: "LeafLeftForeArmRoll5Mode", "bool", "", "",1 + P: "LeafRightArmRoll5", "Number", "", "A",50 + P: "LeafRightArmRoll5Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll5", "Number", "", "A",50 + P: "LeafRightForeArmRoll5Mode", "bool", "", "",1 + P: "LeftLegFullRollExtraction", "Number", "", "A",0 + P: "RightLegFullRollExtraction", "Number", "", "A",0 + P: "LeftArmFullRollExtraction", "Number", "", "A",0 + P: "RightArmFullRollExtraction", "Number", "", "A",0 + P: "RollExtractionMode", "enum", "", "",0 + P: "FootFloorContact", "bool", "", "",0 + P: "FootAutomaticToes", "bool", "", "",0 + P: "FootFloorPivot", "enum", "", "",0 + P: "FootBottomToAnkle", "double", "Number", "",0 + P: "FootBackToAnkle", "double", "Number", "",4.5 + P: "FootMiddleToAnkle", "double", "Number", "",13 + P: "FootFrontToMiddle", "double", "Number", "",7 + P: "FootInToAnkle", "double", "Number", "",5 + P: "FootOutToAnkle", "double", "Number", "",5 + P: "FootContactSize", "double", "Number", "",100 + P: "FootContactStiffness", "Number", "", "A",0 + P: "FootFingerContactRollStiffness", "Number", "", "A",0 + P: "HandFloorContact", "bool", "", "",0 + P: "HandAutomaticFingers", "bool", "", "",0 + P: "HandFloorPivot", "enum", "", "",0 + P: "HandBottomToWrist", "double", "Number", "",0 + P: "HandBackToWrist", "double", "Number", "",4.5 + P: "HandMiddleToWrist", "double", "Number", "",13 + P: "HandFrontToMiddle", "double", "Number", "",7 + P: "HandInToWrist", "double", "Number", "",5 + P: "HandOutToWrist", "double", "Number", "",5 + P: "HandContactSize", "double", "Number", "",100 + P: "HandContactStiffness", "Number", "", "A",0 + P: "HandFingerContactRollStiffness", "Number", "", "A",0 + P: "CtrlPullLeftToeBase", "Number", "", "A",0 + P: "CtrlPullLeftFoot", "Number", "", "A",0 + P: "CtrlPullLeftKnee", "Number", "", "A",0 + P: "CtrlPullRightToeBase", "Number", "", "A",0 + P: "CtrlPullRightFoot", "Number", "", "A",0 + P: "CtrlPullRightKnee", "Number", "", "A",0 + P: "CtrlPullLeftFingerBase", "Number", "", "A",0 + P: "CtrlPullLeftHand", "Number", "", "A",100 + P: "CtrlPullLeftElbow", "Number", "", "A",0 + P: "CtrlPullRightFingerBase", "Number", "", "A",0 + P: "CtrlPullRightHand", "Number", "", "A",100 + P: "CtrlPullRightElbow", "Number", "", "A",0 + P: "CtrlChestPullLeftHand", "Number", "", "A",0 + P: "CtrlChestPullRightHand", "Number", "", "A",0 + P: "CtrlPullHead", "Number", "", "A",0 + P: "CtrlResistHipsPosition", "Number", "", "A",0 + P: "CtrlEnforceGravity", "Number", "", "A",60 + P: "CtrlResistHipsOrientation", "Number", "", "A",0 + P: "CtrlResistChestPosition", "Number", "", "A",0 + P: "CtrlResistChestOrientation", "Number", "", "A",0 + P: "CtrlResistLeftCollar", "Number", "", "A",50 + P: "CtrlResistRightCollar", "Number", "", "A",50 + P: "CtrlResistLeftKnee", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionLeftKnee", "Number", "", "A",50 + P: "CtrlResistCompressionFactorLeftKnee", "Number", "", "A",50 + P: "CtrlResistRightKnee", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionRightKnee", "Number", "", "A",50 + P: "CtrlResistCompressionFactorRightKnee", "Number", "", "A",50 + P: "CtrlResistLeftElbow", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionLeftElbow", "Number", "", "A",50 + P: "CtrlResistCompressionFactorLeftElbow", "Number", "", "A",50 + P: "CtrlResistRightElbow", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionRightElbow", "Number", "", "A",50 + P: "CtrlResistCompressionFactorRightElbow", "Number", "", "A",50 + P: "CtrlSpineStiffness", "Number", "", "A",0 + P: "CtrlNeckStiffness", "Number", "", "A",0 + P: "MirrorMode", "bool", "", "",0 + P: "ShoulderCorrection", "Number", "", "A",0 + P: "LeftKneeKillPitch", "bool", "", "",0 + P: "RightKneeKillPitch", "bool", "", "",0 + P: "LeftElbowKillPitch", "bool", "", "",0 + P: "RightElbowKillPitch", "bool", "", "",0 + P: "HipsTranslationMode", "enum", "", "",0 + P: "WriteReference", "bool", "", "",0 + P: "SyncMode", "bool", "", "H",0 + P: "Damping", "Number", "", "A",0 + P: "OrientationDamping", "Number", "", "A",0 + P: "OrientationDampingMode", "enum", "", "",1 + P: "DisplacementDamping", "Number", "", "A",0 + P: "DisplacementDampingMode", "enum", "", "",1 + P: "DisplacementMemory", "Number", "", "A",0 + P: "DisplacementMemoryMode", "enum", "", "",0 + P: "HipsDisplacementDamping", "Number", "", "A",0 + P: "HipsDisplacementDampingMode", "enum", "", "",0 + P: "AnkleDisplacementDamping", "Number", "", "A",0 + P: "AnkleDisplacementDampingMode", "enum", "", "",0 + P: "WristDisplacementDamping", "Number", "", "A",0 + P: "WristDisplacementDampingMode", "enum", "", "",0 + P: "Stabilization", "Number", "", "A",0 + P: "AnkleStabilizationTime", "Number", "", "A",0 + P: "AnkleStabilizationTimeMode", "enum", "", "",0 + P: "AnkleStabilizationPerimeter", "Number", "", "A",0 + P: "AnkleStabilizationPerimeterMode", "enum", "", "",0 + P: "AnkleStabilizationAngularPerimeter", "Number", "", "A",0 + P: "AnkleStabilizationAngularPerimeterMode", "enum", "", "",1 + P: "AnkleStabilizationFloorProximity", "Number", "", "A",0 + P: "AnkleStabilizationFloorProximityMode", "enum", "", "",1 + P: "AnkleStabilizationDamping", "Number", "", "A",0 + P: "AnkleStabilizationDampingMode", "enum", "", "",0 + P: "AnkleStabilizationRecoveryTime", "Number", "", "A",0 + P: "AnkleStabilizationRecoveryTimeMode", "enum", "", "",1 + P: "LeftHandThumbTip", "double", "Number", "",0.5 + P: "LeftHandIndexTip", "double", "Number", "",0.5 + P: "LeftHandMiddleTip", "double", "Number", "",0.5 + P: "LeftHandRingTip", "double", "Number", "",0.5 + P: "LeftHandPinkyTip", "double", "Number", "",0.5 + P: "LeftHandExtraFingerTip", "double", "Number", "",0.5 + P: "RightHandThumbTip", "double", "Number", "",0.5 + P: "RightHandIndexTip", "double", "Number", "",0.5 + P: "RightHandMiddleTip", "double", "Number", "",0.5 + P: "RightHandRingTip", "double", "Number", "",0.5 + P: "RightHandPinkyTip", "double", "Number", "",0.5 + P: "RightHandExtraFingerTip", "double", "Number", "",0.5 + P: "LeftFootThumbTip", "double", "Number", "",0.5 + P: "LeftFootIndexTip", "double", "Number", "",0.5 + P: "LeftFootMiddleTip", "double", "Number", "",0.5 + P: "LeftFootRingTip", "double", "Number", "",0.5 + P: "LeftFootPinkyTip", "double", "Number", "",0.5 + P: "LeftFootExtraFingerTip", "double", "Number", "",0.5 + P: "RightFootThumbTip", "double", "Number", "",0.5 + P: "RightFootIndexTip", "double", "Number", "",0.5 + P: "RightFootMiddleTip", "double", "Number", "",0.5 + P: "RightFootRingTip", "double", "Number", "",0.5 + P: "RightFootPinkyTip", "double", "Number", "",0.5 + P: "RightFootExtraFingerTip", "double", "Number", "",0.5 + P: "FingerSolving", "bool", "", "",1 + P: "FootFingerContact", "bool", "", "",0 + P: "FootContactType", "enum", "", "",0 + P: "FootFingerContactMode", "enum", "", "",1 + P: "HandFingerContact", "bool", "", "",0 + P: "HandContactType", "enum", "", "",0 + P: "HandFingerContactMode", "enum", "", "",1 + P: "ContactBehaviour", "enum", "", "",0 + P: "HikVersion", "double", "Number", "",1 + P: "Characterize", "bool", "", "",1 + P: "RealisticShoulder", "Number", "", "A",0 + P: "CollarStiffnessX", "Number", "", "A",0 + P: "CollarStiffnessY", "Number", "", "A",0 + P: "CollarStiffnessZ", "Number", "", "A",0 + P: "ExtraCollarRatio", "Number", "", "A",50 + P: "LeftLegMaxExtensionAngle", "Number", "", "A",180 + P: "RightLegMaxExtensionAngle", "Number", "", "A",180 + P: "LeftArmMaxExtensionAngle", "Number", "", "A",180 + P: "RightArmMaxExtensionAngle", "Number", "", "A",180 + P: "StretchStartArmsAndLegs", "Number", "", "A",90 + P: "StretchStopArmsAndLegs", "Number", "", "A",110 + P: "SnSScaleArmsAndLegs", "Number", "", "A",0 + P: "SnSReachLeftWrist", "Number", "", "A",0 + P: "SnSReachRightWrist", "Number", "", "A",0 + P: "SnSReachLeftAnkle", "Number", "", "A",0 + P: "SnSReachRightAnkle", "Number", "", "A",0 + P: "SnSScaleSpine", "Number", "", "A",0 + P: "SnSScaleSpineChildren", "Number", "", "A",0 + P: "SnSSpineFreedom", "Number", "", "A",10 + P: "SnSReachChestEnd", "Number", "", "A",0 + P: "SnSScaleNeck", "Number", "", "A",0 + P: "SnSNeckFreedom", "Number", "", "A",10 + P: "SnSReachHead", "Number", "", "A",0 + } + } + } + ObjectType: "ControlSetPlug" { + Count: 1 + PropertyTemplate: "FbxControlSetPlug" { + Properties70: { + P: "UseAxis", "bool", "", "",1 + P: "ControlSetType", "enum", "", "",0 + P: "Character", "object", "", "" + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 2376877451168, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 2376782199344, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376782197232, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376782200112, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376782198000, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376782199152, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376782199536, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879668048, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879668240, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879666128, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879665744, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879666320, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879666512, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879665936, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879666896, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879667088, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879665552, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879668432, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879667280, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879667472, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879667664, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879667856, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879668624, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879668816, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879669008, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376879669200, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376782199920, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889405552, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889405168, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889402672, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889402864, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889405360, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889402480, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889404400, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889405936, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889404592, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889403056, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889404784, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889404016, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889405744, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889404976, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889403632, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889406128, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889403248, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889403440, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376889404208, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376884800384, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376884799040, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376884798656, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376884798848, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376884800192, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376884799232, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376884799424, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376884800000, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376884799616, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376884799808, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376846331072, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376846332416, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376846331840, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376846331648, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376846332800, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",33.3333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376846332608, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376846331264, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",50 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2376877451520, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + NodeAttribute: 2376903011968, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",8 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",1500 + P: "IK Reach Translation", "IK Reach Translation", "", "A",100 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",100 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903015568, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",800 + P: "IK Reach Translation", "IK Reach Translation", "", "A",100 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",100 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903007648, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",800 + P: "IK Reach Translation", "IK Reach Translation", "", "A",100 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",100 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903008368, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",500 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903022288, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",500 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903017488, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903014368, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903015088, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903010288, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903013168, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903015328, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",1500 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903015808, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",600 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903018928, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",600 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903021328, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",800 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903016288, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",800 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903013888, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",1000 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903017728, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",800 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903013408, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",7 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",800 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903008608, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903009808, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903007888, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903022528, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903019888, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903012208, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903016528, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903007408, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903008848, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903020128, "NodeAttribute::", "IKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,0.25,0.25 + P: "Look", "enum", "", "",2 + P: "DrawLink", "bool", "", "",0 + P: "Size", "double", "Number", "",200 + P: "IK Reach Translation", "IK Reach Translation", "", "A",0 + P: "IK Reach Rotation", "IK Reach Rotation", "", "A",0 + P: "IK Pull", "Number", "", "A",0 + P: "IK Pull Hips", "Number", "", "A",0 + P: "IKSync", "bool", "", "",1 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903017968, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903020608, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903018208, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903014608, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903012448, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",10 + P: "Size", "double", "Number", "",0.75 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903018448, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903016768, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903012688, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903019168, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",10 + P: "Size", "double", "Number", "",0.75 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903012928, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903013648, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903017008, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903009088, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903018688, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903020848, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903021568, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903008128, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903009328, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903009568, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903027808, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903026128, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903027088, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903028528, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903023728, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903027328, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903025888, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903023968, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903029008, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903035968, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903031408, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903036208, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903022768, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903027568, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903034768, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903036688, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903025168, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903026368, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903034288, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903031168, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903034048, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903024928, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903030688, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903028768, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903028288, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903023008, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903023488, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903025408, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903029968, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903025648, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903029248, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903036928, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903031648, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903035008, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903031888, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903034528, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903028048, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903035248, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903032128, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903030208, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903029488, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903030928, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + NodeAttribute: 2376903032848, "NodeAttribute::", "FKEffector" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",1,1,0 + P: "Look", "enum", "", "",6 + P: "Size", "double", "Number", "",200 + } + TypeFlags: "Marker" + } + Model: 2376846990080, "Model::Character1_Reference", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376846973840, "Model::Character1_Hips", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0,99.9999923706055,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376846987760, "Model::Character1_LeftUpLeg", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",8.91000080108643,-6.27000427246094,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-0.000613368256766612,-0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847006320, "Model::Character1_LeftLeg", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-9.5367431640625e-07,-44.8786392186198,-0.000480439099329277 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0.000415292914140102,-0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376846992400, "Model::Character1_LeftFoot", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-1.77635683940025e-15,-40.7009582517099,-0.000140705935401858 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0.000198075342616968,-0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376846976160, "Model::Character1_LeftToeBase", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",7.62939453302636e-06,-6.26231718063355,12.9547204971313 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376846994720, "Model::Character1_RightUpLeg", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-8.91000080108643,-6.27000427246094,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-0.000613115991250192,-0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376846978480, "Model::Character1_RightLeg", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-1.9073486328125e-06,-44.8786392233199,-4.12174983339113e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0.000415040648623682,-0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847017920, "Model::Character1_RightFoot", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",9.5367431640625e-07,-40.7009582517099,-0.000140705935401857 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0.000198075330348223,-0.00480038608736341,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847015600, "Model::Character1_RightToeBase", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0.004800386,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",9.8607513265847e-08,-6.26231718063617,12.9547488189982 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0.00291259295273158,-0.00480038600005737,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847013280, "Model::Character1_Spine", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0,7,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847008640, "Model::Character1_Spine1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0,12.6666641235352,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847010960, "Model::Character1_Spine2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0,12.6666564941406,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847020240, "Model::Character1_LeftShoulder", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",7.00000095367432,14.2552185058594,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0,0.000735282016211991 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376846999360, "Model::Character1_LeftArm", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-0.000735282 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",10.7072477349505,-7.79949687057524e-08,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0.00067450447403495,0.00203795310655456,0.0012567684434604 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376846997040, "Model::Character1_LeftForeArm", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",27.3054694890979,-0.000598927146967299,0.000971235069153659 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-0.000674459772366627,-0.00216353911962381,-0.0012567429907804 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847029520, "Model::Character1_LeftHand", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",26.6971435546234,5.6843418860808e-14,-5.85102930517871e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,0.000125571218624066,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847027200, "Model::Character1_LeftHandThumb1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",4.34876251220705,-0.798507690429688,4.28243398666382 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847022560, "Model::Character1_LeftHandThumb2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",2.51258850097655,-0.536087036132813,0.707454204559326 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0,-0.000297862000455712 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847031840, "Model::Character1_LeftHandThumb3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,0.000297862 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",2.54313659672466,-2.03785447183691e-06,9.53674316317432e-06 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847024880, "Model::Character1_LeftHandThumb4", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",2.666748046875,5.6843418860808e-14,-8.10623168856495e-06 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847001680, "Model::Character1_LeftHandIndex1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",8.82197570800783,0.199722290039063,3.4716694355011 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-1.99999990650714,-0.000299341005181314 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847041120, "Model::Character1_LeftHandIndex2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",1.04532179819187e-05,1.99999998497269,0.000299523461597212 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",4.22532021170265,6.80293811683441e-06,-0.000262786505682566 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-1.999999985,-0.000299340999991943 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847034160, "Model::Character1_LeftHandIndex3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",1.04532179819187e-05,1.99999998497269,0.000299523461597212 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",2.6539394358412,-1.40173565910118e-06,-0.000165144492167202 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-1.999999985,-0.000299340999993751 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847043440, "Model::Character1_LeftHandIndex4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",1.04532179819187e-05,1.99999998497269,0.000299523461597212 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1.95821988638983,-5.03430641174418e-06,-0.000122013144632449 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-1.999999985,-0.00029934099999268 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847036480, "Model::Character1_LeftHandMiddle1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",8.8098831176758,0.500885009765625,1.30468440055847 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0.00356333394791432,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376847038800, "Model::Character1_LeftHandMiddle2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0.003563334,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",4.86325074182569,0,-2.08833894621563e-08 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0.00356333400000013,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539752544, "Model::Character1_LeftHandMiddle3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0.003563334,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",2.76523590621453,0,-1.94715533696765e-07 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0.0035633339999998,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539750224, "Model::Character1_LeftHandMiddle4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0.003563334,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",2.00563049697352,0,-1.11395749535781e-06 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0.00356333400000016,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539754864, "Model::Character1_LeftHandRing1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",8.89376068115236,0.379913330078125,-0.793158888816833 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0.00356352904853195,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539759504, "Model::Character1_LeftHandRing2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0.003563529,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",4.53775786476226,0,-0.000282167675000555 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0.00356352899999992,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539738624, "Model::Character1_LeftHandRing3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0.003563529,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",2.30452727825016,0,-0.000143450009211787 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0.00356352900000002,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539729344, "Model::Character1_LeftHandRing4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0.003563529,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1.92334746937263,0,-0.000120457666677898 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0.00356352900000002,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539761824, "Model::Character1_LeftHandPinky1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",8.88227844238283,-0.313034057617188,-2.4903564453125 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0,0.000763026011995871 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539764144, "Model::Character1_LeftHandPinky2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-0.000763026 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",3.04409790073031,5.23715291933513e-06,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0,0.000739071406413687 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539733984, "Model::Character1_LeftHandPinky3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-0.000763026 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1.97450256370597,5.04801613487871e-06,-2.38418579101563e-07 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0,0.000763026000027254 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539766464, "Model::Character1_LeftHandPinky4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-0.000763026 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1.66661071783157,-6.23920536213518e-06,9.53674316850339e-07 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0,0.000763025999978541 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539782704, "Model::Character1_RightShoulder", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-7,14.2552185058594,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0,-0.00231836105352646 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539796624, "Model::Character1_RightArm", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,0.002318361 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-10.7072753991474,-6.00275080842039e-06,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0.000685603635662701,-0.00204563686091838,-0.00125676861464934 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539785024, "Model::Character1_RightForeArm", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-27.3055991886743,-0.000598929859222608,0.000974901665371063 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-0.000685558765454442,0.00217122311744007,0.00125674268823229 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539791984, "Model::Character1_RightHand", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-26.6969871520355,2.8421709430404e-14,-5.85099502749942e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0.000125571218631082,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539787344, "Model::Character1_RightHandThumb1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-4.34838104248047,-0.798492431640653,4.28281450271606 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539789664, "Model::Character1_RightHandThumb2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-2.5125274658203,-0.536102294921847,0.707676887512208 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0,-0.000602085979890121 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539794304, "Model::Character1_RightHandThumb3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,0.000602085999999999 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-2.54158782977022,3.80960048573797e-06,0.088820457458497 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0,-0.000391494032984209 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539798944, "Model::Character1_RightHandThumb4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,0.000391494 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-2.66512298588188,-2.95162195129706e-06,0.093137264251709 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-0,-0.000391493999975616 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539768784, "Model::Character1_RightHandIndex1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-8.82167053222656,0.199737548828097,3.47244429588318 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.00006454048744,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539801264, "Model::Character1_RightHandIndex2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064658,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-4.22532554511477,2.8421709430404e-14,0.000114819780703712 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.00006487131337,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539771104, "Model::Character1_RightHandIndex3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064636,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-2.65393516420842,0,7.18577928200403e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.000064636,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539824464, "Model::Character1_RightHandIndex4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064636,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-1.95822237416384,0,5.29857275415324e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.000064636,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539810544, "Model::Character1_RightHandMiddle1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-8.80976867675781,0.500900268554659,1.30545842647553 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.00006454048744,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539826784, "Model::Character1_RightHandMiddle2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064658,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-4.86324867875288,2.8421709430404e-14,0.000131787738323119 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.000064658,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539829104, "Model::Character1_RightHandMiddle3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064636,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-2.76523943496396,0,7.49836865896469e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.000064636,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539803584, "Model::Character1_RightHandMiddle4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064636,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-2.00562974812861,0,5.43316945416095e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.000064636,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539805904, "Model::Character1_RightHandRing1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-8.89382934570313,0.379928588867159,-0.79237675666809 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.00006454048744,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539817504, "Model::Character1_RightHandRing2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064658,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-4.53776382360202,0,0.000123207411302229 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.00006487131337,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539808224, "Model::Character1_RightHandRing3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064636,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-2.30452524231353,0,6.2383298205404e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.000064636,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539815184, "Model::Character1_RightHandRing4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,2.000064636,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-1.92335007812626,2.8421709430404e-14,5.23319517493626e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.000064636,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539812864, "Model::Character1_RightHandPinky1", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-8.88249206542969,-0.313018798828153,-2.48957419395447 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.00006454001851,0.00124121500074499 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539819824, "Model::Character1_RightHandPinky2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-4.33455853143664e-05,2.0000646575305,-0.00124197162447093 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-3.04779808733394,-1.03087770639831e-05,8.26212895672085e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.00006465749222,0.00179132697290335 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376539822144, "Model::Character1_RightHandPinky3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-4.33455848371928e-05,2.0000646355305,-0.00124197162445427 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-1.97690285411784,1.59930233678551e-05,5.3818153643248e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.000064636,0.00124121500000094 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901453008, "Model::Character1_RightHandPinky4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-4.33455848371928e-05,2.0000646355305,-0.00124197162445427 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-1.66864040299899,-8.89759152755687e-06,4.53168677359561e-05 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,-2.000064636,0.00124121499996102 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901464608, "Model::Character1_Neck", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0,12.6666717529297,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901459968, "Model::Character1_Head", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "Show", "bool", "", "",0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0,20,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901457648, "Model::Character1_Ctrl_Reference", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901450688, "Model::Character1_Ctrl_HipsEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,90 + P: "PostRotation", "Vector3D", "Vector", "",90,3.50835464926744e-15,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,93.7299957275391,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901473888, "Model::Character1_Ctrl_LeftAnkleEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90.0000707016612,-64.2008582414159,-89.9999214709817 + P: "PostRotation", "Vector3D", "Vector", "",-90.0000707016612,-64.2008582414159,-89.9999214709817 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",8.91000080108643,8.1503963470459,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-5.08888749034163e-14,2.54444374517081e-14,2.54444374517081e-14 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901455328, "Model::Character1_Ctrl_RightAnkleEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-89.991060164131,-64.200906907443,-90.0099295579875 + P: "PostRotation", "Vector3D", "Vector", "",-89.9910601641309,-64.20090690743,-90.0099295579875 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-8.91000270843506,8.1503963470459,0.000439024006482214 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,2.54444374517081e-14,1.29766631003711e-11 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901446048, "Model::Character1_Ctrl_LeftWristEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,0 + P: "PostRotation", "Vector3D", "Vector", "",90,0,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,90 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",71.7098617553711,146.588684082031,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901443728, "Model::Character1_Ctrl_RightWristEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,180 + P: "PostRotation", "Vector3D", "Vector", "",90,-7.01670929853488e-15,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,90 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-71.7098617553711,146.588973999023,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901462288, "Model::Character1_Ctrl_LeftKneeEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90,-0,-90 + P: "PostRotation", "Vector3D", "Vector", "",-90,3.50835464926744e-15,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,10 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",8.91000080108643,48.8513565063477,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0.5,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901466928, "Model::Character1_Ctrl_RightKneeEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90,-0,-89.9999986574883 + P: "PostRotation", "Vector3D", "Vector", "",-90,3.50835464926744e-15,-89.9999986574883 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,10 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-8.91000366210938,48.8513565063477,0.000439024006482214 + P: "Lcl Rotation", "Lcl Rotation", "", "A",3.18055468146352e-15,3.18055468146352e-15,-3.18055468146352e-15 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0.5,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901476208, "Model::Character1_Ctrl_LeftElbowEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,0 + P: "PostRotation", "Vector3D", "Vector", "",90,0,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,-10 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",45.0127182006836,146.588684082031,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0.5,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901469248, "Model::Character1_Ctrl_RightElbowEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90,-0,-0 + P: "PostRotation", "Vector3D", "Vector", "",-90,-0,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,-10 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-45.0128746032715,146.588973999023,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0.5,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901471568, "Model::Character1_Ctrl_ChestOriginEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,90 + P: "PostRotation", "Vector3D", "Vector", "",90,3.50835464926744e-15,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,107,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901478528, "Model::Character1_Ctrl_ChestEndEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,90 + P: "PostRotation", "Vector3D", "Vector", "",90,3.50835464926744e-15,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",4.76837158203125e-07,146.58854675293,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901448368, "Model::Character1_Ctrl_LeftFootEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-180,-90,0 + P: "PostRotation", "Vector3D", "Vector", "",180,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",90,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",8.91000938415527,1.88807916641235,12.9547204971313 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,-1.72975239028591e-46,-1.41245001537605e-30 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901497088, "Model::Character1_Ctrl_RightFootEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-180,-90,0 + P: "PostRotation", "Vector3D", "Vector", "",180,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",90,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-8.91108798980713,1.88807916641235,12.9551877975464 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,-1.72975239028591e-46,-1.41245001537605e-30 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901485488, "Model::Character1_Ctrl_LeftShoulderEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90,-0,0 + P: "PostRotation", "Vector3D", "Vector", "",-90,-0,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,90 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",17.7072505950928,146.588684082031,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0.5,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901492448, "Model::Character1_Ctrl_RightShoulderEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,0,0 + P: "PostRotation", "Vector3D", "Vector", "",90,0,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,90 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-17.707275390625,146.588973999023,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0.5,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901504048, "Model::Character1_Ctrl_HeadEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,90 + P: "PostRotation", "Vector3D", "Vector", "",90,3.50835464926744e-15,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,165,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901511008, "Model::Character1_Ctrl_LeftHipEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90,-0,-90 + P: "PostRotation", "Vector3D", "Vector", "",-90,3.50835464926744e-15,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",8.91000080108643,93.7299957275391,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901480848, "Model::Character1_Ctrl_RightHipEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-89.9999999999643,-0.000560494326738427,-90.0000036526183 + P: "PostRotation", "Vector3D", "Vector", "",-90.0000000000357,-0.00056049432674188,-89.9999963473817 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-8.91000080108643,93.7299957275391,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",6.36111017397127e-15,-7.30523664548619e-06,-1.27222191313762e-14 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901494768, "Model::Character1_Ctrl_LeftHandThumbEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0.000174164508755786,180 + P: "PostRotation", "Vector3D", "Vector", "",90,-0.000174164508728358,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",83.7810974121094,145.25407409668,4.98988962173462 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901508688, "Model::Character1_Ctrl_LeftHandIndexEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,1.9964299099582,179.999553270182 + P: "PostRotation", "Vector3D", "Vector", "",-180,1.9964299099582,179.999553270182 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",89.3639526367188,146.788360595703,3.77954339981079 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,7.9508399495569e-16,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901490128, "Model::Character1_Ctrl_LeftHandMiddleEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,179.996468488994,0 + P: "PostRotation", "Vector3D", "Vector", "",-180,0.00353151100586447,-180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",90.1538619995117,147.089569091797,1.30528223514557 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901506368, "Model::Character1_Ctrl_LeftHandRingEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,180.000024858391,0 + P: "PostRotation", "Vector3D", "Vector", "",-180,-2.48583913537842e-05,-180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",89.369255065918,146.968597412109,-0.793159782886505 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901499408, "Model::Character1_Ctrl_LeftHandPinkyEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,179.999967213991,0.000524576137899229 + P: "PostRotation", "Vector3D", "Vector", "",-180,3.27860086400939e-05,-179.999475423862 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",87.2773513793945,146.275741577148,-2.49035573005676 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901513328, "Model::Character1_Ctrl_RightHandThumbEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",89.9999885431129,2.0014841297044,-0.000328038975460713 + P: "PostRotation", "Vector3D", "Vector", "",89.9999885431129,2.0014841297044,-0.000328038975460783 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-83.7774810791016,145.254425048828,5.17244911193848 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-2.54537554830015e-14,0,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901501728, "Model::Character1_Ctrl_RightHandIndexEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-1.99851444031146,0 + P: "PostRotation", "Vector3D", "Vector", "",-0,-1.99851444031146,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-89.363639831543,146.788711547852,3.16425013542175 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901483168, "Model::Character1_Ctrl_RightHandMiddleEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-1.99851242111289,0 + P: "PostRotation", "Vector3D", "Vector", "",-0,-1.99851242111289,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-90.1478881835938,147.089874267578,0.969482660293579 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901515648, "Model::Character1_Ctrl_RightHandRingEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-1.99850580725114,0 + P: "PostRotation", "Vector3D", "Vector", "",-0,-1.99850580725114,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-89.3639984130859,146.968902587891,-1.09806525707245 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,-3.9756933518294e-16,0 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901517968, "Model::Character1_Ctrl_RightHandPinkyEffector", "IKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-1.21402377262166e-20,-1.99850850363402,0.00157277083796773 + P: "PostRotation", "Vector3D", "Vector", "",-2.42804754524332e-20,-1.99850850363402,0.00157277083796773 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-87.281623840332,146.275802612305,-2.72299432754517 + P: "Lcl Rotation", "Lcl Rotation", "", "A",6.06642662327483e-21,-7.95138670551012e-16,1.93936076112817e-19 + P: "pull", "Number", "", "A+U",0,0,100 + P: "stiffness", "Number", "", "A+U",0,0,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901487808, "Model::Character1_Ctrl_Hips", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,90 + P: "PostRotation", "Vector3D", "Vector", "",90,3.50835464926744e-15,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",10.074501870692,91.8255005547654,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901536528, "Model::Character1_Ctrl_LeftUpLeg", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90,-0,-90 + P: "PostRotation", "Vector3D", "Vector", "",-90,3.50835464926744e-15,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",8.91000080108643,-6.27000427246094,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901538848, "Model::Character1_Ctrl_LeftLeg", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90,-0,-90 + P: "PostRotation", "Vector3D", "Vector", "",-90,3.50835464926744e-15,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,-44.8786392211914,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901548128, "Model::Character1_Ctrl_LeftFoot", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90.0000707016612,-64.2008582414159,-89.9999214709817 + P: "PostRotation", "Vector3D", "Vector", "",-90.0000707016612,-64.2008582414159,-89.9999214709817 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,-40.7009601593018,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-5.08888749034163e-14,2.54444374517081e-14,2.54444374517081e-14 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901527248, "Model::Character1_Ctrl_LeftToeBase", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-180,-90,0 + P: "PostRotation", "Vector3D", "Vector", "",180,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",8.58306884765625e-06,-6.26231718063354,12.9547204971313 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,-1.72975239028591e-46,-1.41245001537605e-30 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901534208, "Model::Character1_Ctrl_RightUpLeg", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-89.9999999999643,-0.000560494326738427,-90.0000036526183 + P: "PostRotation", "Vector3D", "Vector", "",-90.0000000000357,-0.00056049432674188,-89.9999963473817 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-8.91000080108643,-6.27000427246094,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",6.36111017397127e-15,-7.30523664548619e-06,-1.27222191313762e-14 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901541168, "Model::Character1_Ctrl_RightLeg", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90,-0,-89.9999986574883 + P: "PostRotation", "Vector3D", "Vector", "",-90,3.50835464926744e-15,-89.9999986574883 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-2.86102294921875e-06,-44.8786392211914,0.000439024006482214 + P: "Lcl Rotation", "Lcl Rotation", "", "A",3.18055468146352e-15,3.18055468146352e-15,-3.18055468146352e-15 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901529568, "Model::Character1_Ctrl_RightFoot", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-89.991060164131,-64.200906907443,-90.0099295579875 + P: "PostRotation", "Vector3D", "Vector", "",-89.9910601641309,-64.20090690743,-90.0099295579875 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",9.5367431640625e-07,-40.7009601593018,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,2.54444374517081e-14,1.29766631003711e-11 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901545808, "Model::Character1_Ctrl_RightToeBase", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-180,-90,0 + P: "PostRotation", "Vector3D", "Vector", "",180,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-0.00108528137207031,-6.26231718063354,12.9547487735399 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,-1.72975239028591e-46,-1.41245001537605e-30 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901531888, "Model::Character1_Ctrl_Spine", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,90 + P: "PostRotation", "Vector3D", "Vector", "",90,3.50835464926744e-15,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,7,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901543488, "Model::Character1_Ctrl_Spine1", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,90 + P: "PostRotation", "Vector3D", "Vector", "",90,3.50835464926744e-15,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,12.6666641235351,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901524928, "Model::Character1_Ctrl_Spine2", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,90 + P: "PostRotation", "Vector3D", "Vector", "",90,3.50835464926744e-15,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,12.6666641235352,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901522608, "Model::Character1_Ctrl_LeftShoulder", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,0.000734864492425355 + P: "PostRotation", "Vector3D", "Vector", "",-0,0,0.000734864492425355 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",7.00000047683716,14.2552185058594,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,1.94125651944795e-19 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901550448, "Model::Character1_Ctrl_LeftArm", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90,-0,0 + P: "PostRotation", "Vector3D", "Vector", "",-90,-0,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",10.7072501182556,0.0001373291015625,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901520288, "Model::Character1_Ctrl_LeftForeArm", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,0 + P: "PostRotation", "Vector3D", "Vector", "",90,0,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",27.3054676055908,-2.8421709430404e-14,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901564368, "Model::Character1_Ctrl_LeftHand", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,0 + P: "PostRotation", "Vector3D", "Vector", "",90,0,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",26.6971435546875,-2.8421709430404e-14,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901555088, "Model::Character1_Ctrl_LeftHandThumb1", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-86.7580085436902,-15.3957425319211,-12.0440616733739 + P: "PostRotation", "Vector3D", "Vector", "",-86.7580085436902,-15.3957425319212,-12.0440616733739 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",4.34876251220703,-0.798507690429716,4.28243398666382 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901573648, "Model::Character1_Ctrl_LeftHandThumb2", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-89.9999999987109,-0.000214858743451697,-0.00034377398952639 + P: "PostRotation", "Vector3D", "Vector", "",-89.9999999987109,-0.000214858743451697,-0.00034377398952639 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",2.51258850097656,-0.536087036132813,0.707454204559326 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-1.27222187256689e-14,-1.48171903313737e-35,-1.33461385712046e-19 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901566688, "Model::Character1_Ctrl_LeftHandThumb3", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90,0.000174164508755786,1.21328532466057e-20 + P: "PostRotation", "Vector3D", "Vector", "",-90,0.000174164508755786,-1.46835283787459e-21 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",2.54313659667969,-1.52587890625e-05,9.5367431640625e-06 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,-2.42657064930993e-20 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901552768, "Model::Character1_Ctrl_LeftHandThumb4", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0.000174164508755786,180 + P: "PostRotation", "Vector3D", "Vector", "",90,-0.000174164508728358,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",2.666748046875,0,-8.1062316903413e-06 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901585248, "Model::Character1_Ctrl_LeftHandIndex1", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-180,-1.99643649428611,-0.000207036431024627 + P: "PostRotation", "Vector3D", "Vector", "",-180,-1.99643649428611,-0.000207036431025259 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",8.82197570800781,0.199722290039034,3.4716694355011 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-1.4024520519869e-14,-3.12364377824282e-32,-2.55226700894419e-16 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901569008, "Model::Character1_Ctrl_LeftHandIndex2", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,-1.99643460947299,-0.000329621393673163 + P: "PostRotation", "Vector3D", "Vector", "",-180,-1.99643460947299,-0.00032962139367319 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",4.22275543212891,-1.52587890909217e-05,0.147198915481567 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,-3.9756933518294e-16,2.64981514904644e-17 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901578288, "Model::Character1_Ctrl_LeftHandIndex3", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-180,-1.9964299099582,-0.000446729817801282 + P: "PostRotation", "Vector3D", "Vector", "",180,-1.9964299099582,-0.000446729817801038 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",2.65232849121095,-1.52587890625e-05,0.0924561023712158 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-1.40249004298363e-14,-2.99245933672554e-32,-2.44501258624469e-16 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901571328, "Model::Character1_Ctrl_LeftHandIndex4", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,1.9964299099582,179.999553270182 + P: "PostRotation", "Vector3D", "Vector", "",-180,1.9964299099582,179.999553270182 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",1.95703125000001,-1.52587890625e-05,0.0682189464569096 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,7.9508399495569e-16,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901562048, "Model::Character1_Ctrl_LeftHandMiddle1", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,-0.00356308791287741,0 + P: "PostRotation", "Vector3D", "Vector", "",-180,-0.00356308791287741,-4.36352421321096e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",8.80988311767578,0.500885009765597,1.30468440055847 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901575968, "Model::Character1_Ctrl_LeftHandMiddle2", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,-0.0035592994356103,0 + P: "PostRotation", "Vector3D", "Vector", "",-180,-0.0035592994356103,-4.35888466663423e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",4.86325073242186,0,0.00030243396759011 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901580608, "Model::Character1_Ctrl_LeftHandMiddle3", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,-0.00353151100587818,0 + P: "PostRotation", "Vector3D", "Vector", "",-180,-0.00353151100587818,-4.32485365497915e-19 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",2.76523590087892,0,0.000171780586242898 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901582928, "Model::Character1_Ctrl_LeftHandMiddle4", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,179.996468488994,0 + P: "PostRotation", "Vector3D", "Vector", "",-180,0.00353151100586447,-180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",2.00563049316408,0,0.000123620033264382 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901587568, "Model::Character1_Ctrl_LeftHandRing1", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,-7.52595153858624e-07,0 + P: "PostRotation", "Vector3D", "Vector", "",-180,-7.52595153858624e-07,-9.21663246226774e-23 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",8.89376068115234,0.379913330078097,-0.793158888816833 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901589888, "Model::Character1_Ctrl_LeftHandRing2", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,2.96381354269169e-06,0 + P: "PostRotation", "Vector3D", "Vector", "",180,2.96381354269169e-06,-3.62962476832696e-22 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",4.53775787353516,0,5.96046447753906e-08 + P: "Lcl Rotation", "Lcl Rotation", "", "A",5.57113298854492e-61,7.58303327909354e-22,8.41885814294845e-38 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901559728, "Model::Character1_Ctrl_LeftHandRing3", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,2.48583913503254e-05,0 + P: "PostRotation", "Vector3D", "Vector", "",180,2.48583913503254e-05,-3.04427493991302e-21 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",2.30452728271484,0,-1.19209289550781e-07 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901606128, "Model::Character1_Ctrl_LeftHandRing4", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,180.000024858391,0 + P: "PostRotation", "Vector3D", "Vector", "",-180,-2.48583913537842e-05,-180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",1.92334747314453,0,-8.34465026855469e-07 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901596848, "Model::Character1_Ctrl_LeftHandPinky1", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,-0,0.000861599306891751 + P: "PostRotation", "Vector3D", "Vector", "",-180,-1.05515483329279e-19,0.000861599306891751 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",8.88227844238281,-0.313034057617216,-2.4903564453125 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,-1.29973974056846e-35,1.94125651944795e-19 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901622368, "Model::Character1_Ctrl_LeftHandPinky2", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-180,6.91838977121489e-06,0.000885553890750767 + P: "PostRotation", "Vector3D", "Vector", "",-180,6.91838977121481e-06,0.000885553890750767 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",3.04409790039063,4.57763671875e-05,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,7.88635461025729e-20,-1.94125651944795e-19 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901617728, "Model::Character1_Ctrl_LeftHandPinky3", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,-3.27860086192209e-05,0.000524576137914921 + P: "PostRotation", "Vector3D", "Vector", "",-180,-3.27860086192209e-05,0.000524576137914921 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",1.97450256347656,3.05175780965783e-05,-2.38418579101563e-07 + P: "Lcl Rotation", "Lcl Rotation", "", "A",1.4033418597142e-14,6.06642662327486e-21,-1.94125651944795e-19 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901599168, "Model::Character1_Ctrl_LeftHandPinky4", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,179.999967213991,0.000524576137899229 + P: "PostRotation", "Vector3D", "Vector", "",-180,3.27860086400939e-05,-179.999475423862 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",1.66661071777344,1.52587890340783e-05,9.5367431640625e-07 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901594528, "Model::Character1_Ctrl_RightShoulder", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-0,-0,-0.00228623958842071 + P: "PostRotation", "Vector3D", "Vector", "",-0,-0,-0.00228623958842071 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-6.99999952316284,14.2552185058594,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,-7.76502607779179e-19 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901601488, "Model::Character1_Ctrl_RightArm", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,0,0 + P: "PostRotation", "Vector3D", "Vector", "",90,0,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-10.7072758674622,0.00042724609375,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901620048, "Model::Character1_Ctrl_RightForeArm", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-90,-0,-0 + P: "PostRotation", "Vector3D", "Vector", "",-90,-0,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-27.3055992126465,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901603808, "Model::Character1_Ctrl_RightHand", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,180 + P: "PostRotation", "Vector3D", "Vector", "",90,-7.01670929853488e-15,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-26.6969871520996,-2.8421709430404e-14,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901592208, "Model::Character1_Ctrl_RightHandThumb1", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",86.7568251729336,-15.4006812255451,-167.955321481145 + P: "PostRotation", "Vector3D", "Vector", "",86.7568251729335,-15.4006812255451,-167.955321481145 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-4.34838104248048,-0.798492431640597,4.28281450271606 + P: "Lcl Rotation", "Lcl Rotation", "", "A",1.27222187258541e-14,2.38541601109764e-15,4.77083202219528e-15 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901629328, "Model::Character1_Ctrl_RightHandThumb2", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90.0000240276016,-2.00149177939179,179.99931203305 + P: "PostRotation", "Vector3D", "Vector", "",90.0000240276016,-2.0014917793918,179.99931203305 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-2.5125274658203,-0.536102294921903,0.707676887512207 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,1.9878466759147e-16,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901624688, "Model::Character1_Ctrl_RightHandThumb3", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90.0000114568871,-2.0014841297044,179.999671961025 + P: "PostRotation", "Vector3D", "Vector", "",90.0000114568871,-2.0014841297044,179.999671961025 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-2.54158782958984,3.0517578125e-05,0.088820457458497 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,-1.9878466759147e-16,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901615408, "Model::Character1_Ctrl_RightHandThumb4", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",89.9999885431129,2.0014841297044,-0.000328038975460713 + P: "PostRotation", "Vector3D", "Vector", "",89.9999885431129,2.0014841297044,-0.000328038975460783 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-2.66512298583984,1.52587890625e-05,0.093137264251709 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-2.54537554830015e-14,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901613088, "Model::Character1_Ctrl_RightHandIndex1", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,1.9985075743396,180 + P: "PostRotation", "Vector3D", "Vector", "",-2.44845895860316e-16,1.9985075743396,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-8.82167053222658,0.199737548828153,3.47244429588318 + P: "Lcl Rotation", "Lcl Rotation", "", "A",-2.20695314902508e-32,-7.95138670365879e-16,-3.44836429535168e-34 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901627008, "Model::Character1_Ctrl_RightHandIndex2", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,1.99851341663622,180 + P: "PostRotation", "Vector3D", "Vector", "",-2.44846612206494e-16,1.99851341663622,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-4.22275543212889,-2.8421709430404e-14,-0.147351741790771 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901610768, "Model::Character1_Ctrl_RightHandIndex3", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,1.99851444031146,180 + P: "PostRotation", "Vector3D", "Vector", "",-2.44846737723204e-16,1.99851444031146,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-2.65232086181641,0,-0.0925521850585942 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901631648, "Model::Character1_Ctrl_RightHandIndex4", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-1.99851444031146,0 + P: "PostRotation", "Vector3D", "Vector", "",-0,-1.99851444031146,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-1.95703125,-2.8421709430404e-14,-0.0682902336120605 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901633968, "Model::Character1_Ctrl_RightHandMiddle1", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,1.99851189909598,180 + P: "PostRotation", "Vector3D", "Vector", "",-2.4484642613512e-16,1.99851189909598,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-8.80976867675783,0.500900268554716,1.30545842647552 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901557408, "Model::Character1_Ctrl_RightHandMiddle2", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,1.99851087800219,180 + P: "PostRotation", "Vector3D", "Vector", "",-2.44846300934933e-16,1.99851087800219,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-4.86029052734374,-2.8421709430404e-14,-0.169598698616028 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901636288, "Model::Character1_Ctrl_RightHandMiddle3", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,1.99851242111289,180 + P: "PostRotation", "Vector3D", "Vector", "",-2.44846490141597e-16,1.99851242111289,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-2.76355743408202,-2.8421709430404e-14,-0.0964336395263672 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,-7.95138670365879e-16,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901638608, "Model::Character1_Ctrl_RightHandMiddle4", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-1.99851242111289,0 + P: "PostRotation", "Vector3D", "Vector", "",-0,-1.99851242111289,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-2.00440979003905,-2.8421709430404e-14,-0.0699434280395508 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901608448, "Model::Character1_Ctrl_RightHandRing1", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,1.99850887012974,180 + P: "PostRotation", "Vector3D", "Vector", "",-2.44846054742066e-16,1.99850887012974,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-8.89382934570314,0.379928588867216,-0.792376756668091 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901640928, "Model::Character1_Ctrl_RightHandRing2", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,1.99851376202481,180 + P: "PostRotation", "Vector3D", "Vector", "",-2.44846654555901e-16,1.99851376202481,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-4.53500366210936,0,-0.158247649669647 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901659488, "Model::Character1_Ctrl_RightHandRing3", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,1.99850580725114,180 + P: "PostRotation", "Vector3D", "Vector", "",-2.44845679190889e-16,1.99850580725114,180 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-2.30312347412109,-2.8421709430404e-14,-0.0803670287132263 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901654848, "Model::Character1_Ctrl_RightHandRing4", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-1.99850580725114,0 + P: "PostRotation", "Vector3D", "Vector", "",-0,-1.99850580725114,-0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-1.92218017578125,0,-0.0670738220214844 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,-3.9756933518294e-16,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901661808, "Model::Character1_Ctrl_RightHandPinky1", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-6.07011887358042e-21,1.99851133633239,-179.998564871593 + P: "PostRotation", "Vector3D", "Vector", "",-1.36856900123744e-16,1.99851133633239,-179.998564871593 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-8.8824920654297,-0.313018798828097,-2.48957419395447 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,-3.9756933518294e-16,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901673408, "Model::Character1_Ctrl_RightHandPinky2", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,1.9985047498638,-179.999114982997 + P: "PostRotation", "Vector3D", "Vector", "",-3.12756803587783e-16,1.9985047498638,-179.999114982997 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-3.04594421386717,-7.62939453125e-05,-0.106287479400634 + P: "Lcl Rotation", "Lcl Rotation", "", "A",8.87333188973099e-16,1.96907496826746e-31,-2.5428933940169e-14 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901666448, "Model::Character1_Ctrl_RightHandPinky3", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",1.21402377262166e-20,1.99850850363402,-179.998427229162 + P: "PostRotation", "Vector3D", "Vector", "",3.74028584107007e-16,1.99850850363402,-179.998427229162 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-1.97570037841795,-3.05175781534217e-05,-0.0689413547515869 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,3.9756933518294e-16,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901652528, "Model::Character1_Ctrl_RightHandPinky4", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",-1.21402377262166e-20,-1.99850850363402,0.00157277083796773 + P: "PostRotation", "Vector3D", "Vector", "",-2.42804754524332e-20,-1.99850850363402,0.00157277083796773 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",-1.66762542724609,-4.57763671875e-05,-0.0581912994384766 + P: "Lcl Rotation", "Lcl Rotation", "", "A",6.06642662327483e-21,-7.95138670551012e-16,1.93936076112817e-19 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901657168, "Model::Character1_Ctrl_Neck", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,90 + P: "PostRotation", "Vector3D", "Vector", "",90,3.50835464926744e-15,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,12.6666717529297,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2376901643248, "Model::Character1_Ctrl_Head", "FKEffector" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",90,-0,90 + P: "PostRotation", "Vector3D", "Vector", "",90,3.50835464926744e-15,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,20,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + } + Shading: Y + Culling: "CullingOff" + } + ControlSetPlug: 2376854953056, "ControlSetPlug::Character1_ControlRig", "ControlSetPlug" { + Type: "ControlSetPlug" + MultiLayer: 0 + Properties70: { + P: "UseAxis", "bool", "", "",0 + P: "ControlSetType", "enum", "", "",1 + P: "Hips", "object", "", "" + P: "LeftUpLeg", "object", "", "" + P: "LeftLeg", "object", "", "" + P: "LeftFoot", "object", "", "" + P: "LeftToeBase", "object", "", "" + P: "RightUpLeg", "object", "", "" + P: "RightLeg", "object", "", "" + P: "RightFoot", "object", "", "" + P: "RightToeBase", "object", "", "" + P: "Spine", "object", "", "" + P: "Spine1", "object", "", "" + P: "LeftShoulder", "object", "", "" + P: "LeftArm", "object", "", "" + P: "LeftForeArm", "object", "", "" + P: "LeftHand", "object", "", "" + P: "RightShoulder", "object", "", "" + P: "RightArm", "object", "", "" + P: "RightForeArm", "object", "", "" + P: "RightHand", "object", "", "" + P: "Neck", "object", "", "" + P: "Head", "object", "", "" + P: "LeftUpLegRoll", "object", "", "" + P: "LeftLegRoll", "object", "", "" + P: "RightUpLegRoll", "object", "", "" + P: "RightLegRoll", "object", "", "" + P: "LeftArmRoll", "object", "", "" + P: "LeftForeArmRoll", "object", "", "" + P: "RightArmRoll", "object", "", "" + P: "RightForeArmRoll", "object", "", "" + P: "Spine2", "object", "", "" + P: "Spine3", "object", "", "" + P: "Spine4", "object", "", "" + P: "Spine5", "object", "", "" + P: "Spine6", "object", "", "" + P: "Spine7", "object", "", "" + P: "Spine8", "object", "", "" + P: "Spine9", "object", "", "" + P: "LeftHandThumb1", "object", "", "" + P: "LeftHandThumb2", "object", "", "" + P: "LeftHandThumb3", "object", "", "" + P: "LeftHandIndex1", "object", "", "" + P: "LeftHandIndex2", "object", "", "" + P: "LeftHandIndex3", "object", "", "" + P: "LeftHandMiddle1", "object", "", "" + P: "LeftHandMiddle2", "object", "", "" + P: "LeftHandMiddle3", "object", "", "" + P: "LeftHandRing1", "object", "", "" + P: "LeftHandRing2", "object", "", "" + P: "LeftHandRing3", "object", "", "" + P: "LeftHandPinky1", "object", "", "" + P: "LeftHandPinky2", "object", "", "" + P: "LeftHandPinky3", "object", "", "" + P: "RightHandThumb1", "object", "", "" + P: "RightHandThumb2", "object", "", "" + P: "RightHandThumb3", "object", "", "" + P: "RightHandIndex1", "object", "", "" + P: "RightHandIndex2", "object", "", "" + P: "RightHandIndex3", "object", "", "" + P: "RightHandMiddle1", "object", "", "" + P: "RightHandMiddle2", "object", "", "" + P: "RightHandMiddle3", "object", "", "" + P: "RightHandRing1", "object", "", "" + P: "RightHandRing2", "object", "", "" + P: "RightHandRing3", "object", "", "" + P: "RightHandPinky1", "object", "", "" + P: "RightHandPinky2", "object", "", "" + P: "RightHandPinky3", "object", "", "" + P: "Reference", "object", "", "" + P: "LeftFloorContact", "object", "", "" + P: "RightFloorContact", "object", "", "" + P: "LeftUpLegRollEx", "object", "", "" + P: "LeftLegRollEx", "object", "", "" + P: "RightUpLegRollEx", "object", "", "" + P: "RightLegRollEx", "object", "", "" + P: "LeftArmRollEx", "object", "", "" + P: "LeftForeArmRollEx", "object", "", "" + P: "RightArmRollEx", "object", "", "" + P: "RightForeArmRollEx", "object", "", "" + P: "LeftFingerBase", "object", "", "" + P: "RightFingerBase", "object", "", "" + P: "Neck1", "object", "", "" + P: "Neck2", "object", "", "" + P: "Neck3", "object", "", "" + P: "Neck4", "object", "", "" + P: "Neck5", "object", "", "" + P: "Neck6", "object", "", "" + P: "Neck7", "object", "", "" + P: "Neck8", "object", "", "" + P: "Neck9", "object", "", "" + P: "LeftInHandThumb", "object", "", "" + P: "LeftHandThumb4", "object", "", "" + P: "LeftInHandIndex", "object", "", "" + P: "LeftHandIndex4", "object", "", "" + P: "LeftInHandMiddle", "object", "", "" + P: "LeftHandMiddle4", "object", "", "" + P: "LeftInHandRing", "object", "", "" + P: "LeftHandRing4", "object", "", "" + P: "LeftInHandPinky", "object", "", "" + P: "LeftHandPinky4", "object", "", "" + P: "LeftInHandExtraFinger", "object", "", "" + P: "LeftHandExtraFinger1", "object", "", "" + P: "LeftHandExtraFinger2", "object", "", "" + P: "LeftHandExtraFinger3", "object", "", "" + P: "LeftHandExtraFinger4", "object", "", "" + P: "RightInHandThumb", "object", "", "" + P: "RightHandThumb4", "object", "", "" + P: "RightInHandIndex", "object", "", "" + P: "RightHandIndex4", "object", "", "" + P: "RightInHandMiddle", "object", "", "" + P: "RightHandMiddle4", "object", "", "" + P: "RightInHandRing", "object", "", "" + P: "RightHandRing4", "object", "", "" + P: "RightInHandPinky", "object", "", "" + P: "RightHandPinky4", "object", "", "" + P: "RightInHandExtraFinger", "object", "", "" + P: "RightHandExtraFinger1", "object", "", "" + P: "RightHandExtraFinger2", "object", "", "" + P: "RightHandExtraFinger3", "object", "", "" + P: "RightHandExtraFinger4", "object", "", "" + P: "LeftInFootThumb", "object", "", "" + P: "LeftFootThumb1", "object", "", "" + P: "LeftFootThumb2", "object", "", "" + P: "LeftFootThumb3", "object", "", "" + P: "LeftFootThumb4", "object", "", "" + P: "LeftInFootIndex", "object", "", "" + P: "LeftFootIndex1", "object", "", "" + P: "LeftFootIndex2", "object", "", "" + P: "LeftFootIndex3", "object", "", "" + P: "LeftFootIndex4", "object", "", "" + P: "LeftInFootMiddle", "object", "", "" + P: "LeftFootMiddle1", "object", "", "" + P: "LeftFootMiddle2", "object", "", "" + P: "LeftFootMiddle3", "object", "", "" + P: "LeftFootMiddle4", "object", "", "" + P: "LeftInFootRing", "object", "", "" + P: "LeftFootRing1", "object", "", "" + P: "LeftFootRing2", "object", "", "" + P: "LeftFootRing3", "object", "", "" + P: "LeftFootRing4", "object", "", "" + P: "LeftInFootPinky", "object", "", "" + P: "LeftFootPinky1", "object", "", "" + P: "LeftFootPinky2", "object", "", "" + P: "LeftFootPinky3", "object", "", "" + P: "LeftFootPinky4", "object", "", "" + P: "LeftInFootExtraFinger", "object", "", "" + P: "LeftFootExtraFinger1", "object", "", "" + P: "LeftFootExtraFinger2", "object", "", "" + P: "LeftFootExtraFinger3", "object", "", "" + P: "LeftFootExtraFinger4", "object", "", "" + P: "RightInFootThumb", "object", "", "" + P: "RightFootThumb1", "object", "", "" + P: "RightFootThumb2", "object", "", "" + P: "RightFootThumb3", "object", "", "" + P: "RightFootThumb4", "object", "", "" + P: "RightInFootIndex", "object", "", "" + P: "RightFootIndex1", "object", "", "" + P: "RightFootIndex2", "object", "", "" + P: "RightFootIndex3", "object", "", "" + P: "RightFootIndex4", "object", "", "" + P: "RightInFootMiddle", "object", "", "" + P: "RightFootMiddle1", "object", "", "" + P: "RightFootMiddle2", "object", "", "" + P: "RightFootMiddle3", "object", "", "" + P: "RightFootMiddle4", "object", "", "" + P: "RightInFootRing", "object", "", "" + P: "RightFootRing1", "object", "", "" + P: "RightFootRing2", "object", "", "" + P: "RightFootRing3", "object", "", "" + P: "RightFootRing4", "object", "", "" + P: "RightInFootPinky", "object", "", "" + P: "RightFootPinky1", "object", "", "" + P: "RightFootPinky2", "object", "", "" + P: "RightFootPinky3", "object", "", "" + P: "RightFootPinky4", "object", "", "" + P: "RightInFootExtraFinger", "object", "", "" + P: "RightFootExtraFinger1", "object", "", "" + P: "RightFootExtraFinger2", "object", "", "" + P: "RightFootExtraFinger3", "object", "", "" + P: "RightFootExtraFinger4", "object", "", "" + P: "LeftShoulderExtra", "object", "", "" + P: "RightShoulderExtra", "object", "", "" + P: "LeafLeftUpLegRoll1", "object", "", "" + P: "LeafLeftLegRoll1", "object", "", "" + P: "LeafRightUpLegRoll1", "object", "", "" + P: "LeafRightLegRoll1", "object", "", "" + P: "LeafLeftArmRoll1", "object", "", "" + P: "LeafLeftForeArmRoll1", "object", "", "" + P: "LeafRightArmRoll1", "object", "", "" + P: "LeafRightForeArmRoll1", "object", "", "" + P: "LeafLeftUpLegRoll2", "object", "", "" + P: "LeafLeftLegRoll2", "object", "", "" + P: "LeafRightUpLegRoll2", "object", "", "" + P: "LeafRightLegRoll2", "object", "", "" + P: "LeafLeftArmRoll2", "object", "", "" + P: "LeafLeftForeArmRoll2", "object", "", "" + P: "LeafRightArmRoll2", "object", "", "" + P: "LeafRightForeArmRoll2", "object", "", "" + P: "LeafLeftUpLegRoll3", "object", "", "" + P: "LeafLeftLegRoll3", "object", "", "" + P: "LeafRightUpLegRoll3", "object", "", "" + P: "LeafRightLegRoll3", "object", "", "" + P: "LeafLeftArmRoll3", "object", "", "" + P: "LeafLeftForeArmRoll3", "object", "", "" + P: "LeafRightArmRoll3", "object", "", "" + P: "LeafRightForeArmRoll3", "object", "", "" + P: "LeafLeftUpLegRoll4", "object", "", "" + P: "LeafLeftLegRoll4", "object", "", "" + P: "LeafRightUpLegRoll4", "object", "", "" + P: "LeafRightLegRoll4", "object", "", "" + P: "LeafLeftArmRoll4", "object", "", "" + P: "LeafLeftForeArmRoll4", "object", "", "" + P: "LeafRightArmRoll4", "object", "", "" + P: "LeafRightForeArmRoll4", "object", "", "" + P: "LeafLeftUpLegRoll5", "object", "", "" + P: "LeafLeftLegRoll5", "object", "", "" + P: "LeafRightUpLegRoll5", "object", "", "" + P: "LeafRightLegRoll5", "object", "", "" + P: "LeafLeftArmRoll5", "object", "", "" + P: "LeafLeftForeArmRoll5", "object", "", "" + P: "LeafRightArmRoll5", "object", "", "" + P: "LeafRightForeArmRoll5", "object", "", "" + P: "HipsEffector", "object", "", "" + P: "LeftAnkleEffector", "object", "", "" + P: "RightAnkleEffector", "object", "", "" + P: "LeftWristEffector", "object", "", "" + P: "RightWristEffector", "object", "", "" + P: "LeftKneeEffector", "object", "", "" + P: "RightKneeEffector", "object", "", "" + P: "LeftElbowEffector", "object", "", "" + P: "RightElbowEffector", "object", "", "" + P: "ChestOriginEffector", "object", "", "" + P: "ChestEndEffector", "object", "", "" + P: "LeftFootEffector", "object", "", "" + P: "RightFootEffector", "object", "", "" + P: "LeftShoulderEffector", "object", "", "" + P: "RightShoulderEffector", "object", "", "" + P: "HeadEffector", "object", "", "" + P: "LeftHipEffector", "object", "", "" + P: "RightHipEffector", "object", "", "" + P: "LeftHandEffector", "object", "", "" + P: "RightHandEffector", "object", "", "" + P: "LeftHandThumbEffector", "object", "", "" + P: "LeftHandIndexEffector", "object", "", "" + P: "LeftHandMiddleEffector", "object", "", "" + P: "LeftHandRingEffector", "object", "", "" + P: "LeftHandPinkyEffector", "object", "", "" + P: "LeftHandExtraFingerEffector", "object", "", "" + P: "RightHandThumbEffector", "object", "", "" + P: "RightHandIndexEffector", "object", "", "" + P: "RightHandMiddleEffector", "object", "", "" + P: "RightHandRingEffector", "object", "", "" + P: "RightHandPinkyEffector", "object", "", "" + P: "RightHandExtraFingerEffector", "object", "", "" + P: "LeftFootThumbEffector", "object", "", "" + P: "LeftFootIndexEffector", "object", "", "" + P: "LeftFootMiddleEffector", "object", "", "" + P: "LeftFootRingEffector", "object", "", "" + P: "LeftFootPinkyEffector", "object", "", "" + P: "LeftFootExtraFingerEffector", "object", "", "" + P: "RightFootThumbEffector", "object", "", "" + P: "RightFootIndexEffector", "object", "", "" + P: "RightFootMiddleEffector", "object", "", "" + P: "RightFootRingEffector", "object", "", "" + P: "RightFootPinkyEffector", "object", "", "" + P: "RightFootExtraFingerEffector", "object", "", "" + P: "HipsEffectorTPin", "Bool", "", "A",0 + P: "HipsEffectorRPin", "Bool", "", "A",0 + P: "LeftAnkleEffectorTPin", "Bool", "", "A",1 + P: "LeftAnkleEffectorRPin", "Bool", "", "A",1 + P: "RightAnkleEffectorTPin", "Bool", "", "A",1 + P: "RightAnkleEffectorRPin", "Bool", "", "A",1 + P: "LeftWristEffectorTPin", "Bool", "", "A",0 + P: "LeftWristEffectorRPin", "Bool", "", "A",0 + P: "RightWristEffectorTPin", "Bool", "", "A",0 + P: "RightWristEffectorRPin", "Bool", "", "A",0 + P: "LeftKneeEffectorTPin", "Bool", "", "A",0 + P: "LeftKneeEffectorRPin", "Bool", "", "A",0 + P: "RightKneeEffectorTPin", "Bool", "", "A",0 + P: "RightKneeEffectorRPin", "Bool", "", "A",0 + P: "LeftElbowEffectorTPin", "Bool", "", "A",0 + P: "LeftElbowEffectorRPin", "Bool", "", "A",0 + P: "RightElbowEffectorTPin", "Bool", "", "A",0 + P: "RightElbowEffectorRPin", "Bool", "", "A",0 + P: "ChestOriginEffectorTPin", "Bool", "", "A",0 + P: "ChestOriginEffectorRPin", "Bool", "", "A",0 + P: "ChestEndEffectorTPin", "Bool", "", "A",0 + P: "ChestEndEffectorRPin", "Bool", "", "A",0 + P: "LeftFootEffectorTPin", "Bool", "", "A",0 + P: "LeftFootEffectorRPin", "Bool", "", "A",0 + P: "RightFootEffectorTPin", "Bool", "", "A",0 + P: "RightFootEffectorRPin", "Bool", "", "A",0 + P: "LeftShoulderEffectorTPin", "Bool", "", "A",0 + P: "LeftShoulderEffectorRPin", "Bool", "", "A",0 + P: "RightShoulderEffectorTPin", "Bool", "", "A",0 + P: "RightShoulderEffectorRPin", "Bool", "", "A",0 + P: "HeadEffectorTPin", "Bool", "", "A",0 + P: "HeadEffectorRPin", "Bool", "", "A",0 + P: "LeftHipEffectorTPin", "Bool", "", "A",0 + P: "LeftHipEffectorRPin", "Bool", "", "A",0 + P: "RightHipEffectorTPin", "Bool", "", "A",0 + P: "RightHipEffectorRPin", "Bool", "", "A",0 + P: "LeftHandThumbEffectorTPin", "Bool", "", "A",0 + P: "LeftHandThumbEffectorRPin", "Bool", "", "A",0 + P: "LeftHandIndexEffectorTPin", "Bool", "", "A",0 + P: "LeftHandIndexEffectorRPin", "Bool", "", "A",0 + P: "LeftHandMiddleEffectorTPin", "Bool", "", "A",0 + P: "LeftHandMiddleEffectorRPin", "Bool", "", "A",0 + P: "LeftHandRingEffectorTPin", "Bool", "", "A",0 + P: "LeftHandRingEffectorRPin", "Bool", "", "A",0 + P: "LeftHandPinkyEffectorTPin", "Bool", "", "A",0 + P: "LeftHandPinkyEffectorRPin", "Bool", "", "A",0 + P: "RightHandThumbEffectorTPin", "Bool", "", "A",0 + P: "RightHandThumbEffectorRPin", "Bool", "", "A",0 + P: "RightHandIndexEffectorTPin", "Bool", "", "A",0 + P: "RightHandIndexEffectorRPin", "Bool", "", "A",0 + P: "RightHandMiddleEffectorTPin", "Bool", "", "A",0 + P: "RightHandMiddleEffectorRPin", "Bool", "", "A",0 + P: "RightHandRingEffectorTPin", "Bool", "", "A",0 + P: "RightHandRingEffectorRPin", "Bool", "", "A",0 + P: "RightHandPinkyEffectorTPin", "Bool", "", "A",0 + P: "RightHandPinkyEffectorRPin", "Bool", "", "A",0 + } + } + Constraint: 2376880742448, "Constraint::Character1", "Character" { + Type: "Character" + MultiLayer: 0 + Version: 201650 + Properties70: { + P: "Active", "bool", "", "",1 + P: "Lock", "bool", "", "",0 + P: "Weight", "Weight", "", "A",100 + P: "SourceObject", "object", "", "" + P: "DestinationObject", "object", "", "" + P: "Actor", "object", "", "" + P: "Character", "object", "", "" + P: "ControlSet", "object", "", "" + P: "PullIterationCount", "int", "Integer", "",10 + P: "Posture", "enum", "", "",0 + P: "ForceActorSpace", "bool", "", "",0 + P: "ScaleCompensation", "Number", "", "A",100 + P: "ScaleCompensationMode", "enum", "", "",1 + P: "HipsHeightCompensation", "Number", "", "A",0 + P: "HipsHeightCompensationMode", "enum", "", "",1 + P: "AnkleHeightCompensation", "Number", "", "A",0 + P: "AnkleHeightCompensationMode", "enum", "", "",1 + P: "AnkleProximityCompensation", "Number", "", "A",0 + P: "AnkleProximityCompensationMode", "enum", "", "",1 + P: "MassCenterCompensation", "Number", "", "A",80 + P: "ApplyLimits", "bool", "", "",0 + P: "ChestReduction", "Number", "", "A",0 + P: "CollarReduction", "Number", "", "A",0 + P: "NeckReduction", "Number", "", "A",0 + P: "HeadReduction", "Number", "", "A",0 + P: "ReachActorLeftAnkle", "Number", "", "A",100 + P: "ReachActorRightAnkle", "Number", "", "A",100 + P: "ReachActorLeftKnee", "Number", "", "A",0 + P: "ReachActorRightKnee", "Number", "", "A",0 + P: "ReachActorChest", "Number", "", "A",0 + P: "ReachActorHead", "Number", "", "A",0 + P: "ReachActorLeftWrist", "Number", "", "A",0 + P: "ReachActorRightWrist", "Number", "", "A",0 + P: "ReachActorLeftElbow", "Number", "", "A",0 + P: "ReachActorRightElbow", "Number", "", "A",0 + P: "ReachActorLeftFingerBase", "Number", "", "A",0 + P: "ReachActorRightFingerBase", "Number", "", "A",0 + P: "ReachActorLeftToesBase", "Number", "", "A",0 + P: "ReachActorRightToesBase", "Number", "", "A",0 + P: "ReachActorLeftFingerBaseRotation", "Number", "", "A",0 + P: "ReachActorRightFingerBaseRotation", "Number", "", "A",0 + P: "ReachActorLeftToesBaseRotation", "Number", "", "A",0 + P: "ReachActorRightToesBaseRotation", "Number", "", "A",0 + P: "ReachActorLeftAnkleRotation", "Number", "", "A",100 + P: "ReachActorRightAnkleRotation", "Number", "", "A",100 + P: "ReachActorHeadRotation", "Number", "", "A",0 + P: "ReachActorLeftWristRotation", "Number", "", "A",0 + P: "ReachActorRightWristRotation", "Number", "", "A",0 + P: "ReachActorChestRotation", "Number", "", "A",0 + P: "ReachActorLowerChestRotation", "Number", "", "A",0 + P: "HipsTOffset", "Vector", "", "A",0,0,0 + P: "ChestTOffset", "Vector", "", "A",0,0,0 + P: "LeftUpLegRoll", "Number", "", "A",0 + P: "LeftUpLegRollMode", "bool", "", "",1 + P: "LeftLegRoll", "Number", "", "A",60.0000023841858 + P: "LeftLegRollMode", "bool", "", "",1 + P: "RightUpLegRoll", "Number", "", "A",0 + P: "RightUpLegRollMode", "bool", "", "",1 + P: "RightLegRoll", "Number", "", "A",60.0000023841858 + P: "RightLegRollMode", "bool", "", "",1 + P: "LeftArmRoll", "Number", "", "A",0 + P: "LeftArmRollMode", "bool", "", "",1 + P: "LeftForeArmRoll", "Number", "", "A",0 + P: "LeftForeArmRollMode", "bool", "", "",1 + P: "RightArmRoll", "Number", "", "A",0 + P: "RightArmRollMode", "bool", "", "",1 + P: "RightForeArmRoll", "Number", "", "A",0 + P: "RightForeArmRollMode", "bool", "", "",1 + P: "LeftUpLegRollEx", "Number", "", "A",100 + P: "LeftUpLegRollExMode", "bool", "", "",1 + P: "LeftLegRollEx", "Number", "", "A",100 + P: "LeftLegRollExMode", "bool", "", "",1 + P: "RightUpLegRollEx", "Number", "", "A",100 + P: "RightUpLegRollExMode", "bool", "", "",1 + P: "RightLegRollEx", "Number", "", "A",100 + P: "RightLegRollExMode", "bool", "", "",1 + P: "LeftArmRollEx", "Number", "", "A",100 + P: "LeftArmRollExMode", "bool", "", "",1 + P: "LeftForeArmRollEx", "Number", "", "A",100 + P: "LeftForeArmRollExMode", "bool", "", "",1 + P: "RightArmRollEx", "Number", "", "A",100 + P: "RightArmRollExMode", "bool", "", "",1 + P: "RightForeArmRollEx", "Number", "", "A",100 + P: "RightForeArmRollExMode", "bool", "", "",1 + P: "LeafLeftUpLegRoll1", "Number", "", "A",50 + P: "LeafLeftUpLegRoll1Mode", "bool", "", "",1 + P: "LeafLeftLegRoll1", "Number", "", "A",50 + P: "LeafLeftLegRoll1Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll1", "Number", "", "A",50 + P: "LeafRightUpLegRoll1Mode", "bool", "", "",1 + P: "LeafRightLegRoll1", "Number", "", "A",50 + P: "LeafRightLegRoll1Mode", "bool", "", "",1 + P: "LeafLeftArmRoll1", "Number", "", "A",50 + P: "LeafLeftArmRoll1Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll1", "Number", "", "A",50 + P: "LeafLeftForeArmRoll1Mode", "bool", "", "",1 + P: "LeafRightArmRoll1", "Number", "", "A",50 + P: "LeafRightArmRoll1Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll1", "Number", "", "A",50 + P: "LeafRightForeArmRoll1Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll2", "Number", "", "A",50 + P: "LeafLeftUpLegRoll2Mode", "bool", "", "",1 + P: "LeafLeftLegRoll2", "Number", "", "A",50 + P: "LeafLeftLegRoll2Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll2", "Number", "", "A",50 + P: "LeafRightUpLegRoll2Mode", "bool", "", "",1 + P: "LeafRightLegRoll2", "Number", "", "A",50 + P: "LeafRightLegRoll2Mode", "bool", "", "",1 + P: "LeafLeftArmRoll2", "Number", "", "A",50 + P: "LeafLeftArmRoll2Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll2", "Number", "", "A",50 + P: "LeafLeftForeArmRoll2Mode", "bool", "", "",1 + P: "LeafRightArmRoll2", "Number", "", "A",50 + P: "LeafRightArmRoll2Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll2", "Number", "", "A",50 + P: "LeafRightForeArmRoll2Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll3", "Number", "", "A",50 + P: "LeafLeftUpLegRoll3Mode", "bool", "", "",1 + P: "LeafLeftLegRoll3", "Number", "", "A",50 + P: "LeafLeftLegRoll3Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll3", "Number", "", "A",50 + P: "LeafRightUpLegRoll3Mode", "bool", "", "",1 + P: "LeafRightLegRoll3", "Number", "", "A",50 + P: "LeafRightLegRoll3Mode", "bool", "", "",1 + P: "LeafLeftArmRoll3", "Number", "", "A",50 + P: "LeafLeftArmRoll3Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll3", "Number", "", "A",50 + P: "LeafLeftForeArmRoll3Mode", "bool", "", "",1 + P: "LeafRightArmRoll3", "Number", "", "A",50 + P: "LeafRightArmRoll3Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll3", "Number", "", "A",50 + P: "LeafRightForeArmRoll3Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll4", "Number", "", "A",50 + P: "LeafLeftUpLegRoll4Mode", "bool", "", "",1 + P: "LeafLeftLegRoll4", "Number", "", "A",50 + P: "LeafLeftLegRoll4Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll4", "Number", "", "A",50 + P: "LeafRightUpLegRoll4Mode", "bool", "", "",1 + P: "LeafRightLegRoll4", "Number", "", "A",50 + P: "LeafRightLegRoll4Mode", "bool", "", "",1 + P: "LeafLeftArmRoll4", "Number", "", "A",50 + P: "LeafLeftArmRoll4Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll4", "Number", "", "A",50 + P: "LeafLeftForeArmRoll4Mode", "bool", "", "",1 + P: "LeafRightArmRoll4", "Number", "", "A",50 + P: "LeafRightArmRoll4Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll4", "Number", "", "A",50 + P: "LeafRightForeArmRoll4Mode", "bool", "", "",1 + P: "LeafLeftUpLegRoll5", "Number", "", "A",50 + P: "LeafLeftUpLegRoll5Mode", "bool", "", "",1 + P: "LeafLeftLegRoll5", "Number", "", "A",50 + P: "LeafLeftLegRoll5Mode", "bool", "", "",1 + P: "LeafRightUpLegRoll5", "Number", "", "A",50 + P: "LeafRightUpLegRoll5Mode", "bool", "", "",1 + P: "LeafRightLegRoll5", "Number", "", "A",50 + P: "LeafRightLegRoll5Mode", "bool", "", "",1 + P: "LeafLeftArmRoll5", "Number", "", "A",50 + P: "LeafLeftArmRoll5Mode", "bool", "", "",1 + P: "LeafLeftForeArmRoll5", "Number", "", "A",50 + P: "LeafLeftForeArmRoll5Mode", "bool", "", "",1 + P: "LeafRightArmRoll5", "Number", "", "A",50 + P: "LeafRightArmRoll5Mode", "bool", "", "",1 + P: "LeafRightForeArmRoll5", "Number", "", "A",50 + P: "LeafRightForeArmRoll5Mode", "bool", "", "",1 + P: "LeftLegFullRollExtraction", "Number", "", "A",0 + P: "RightLegFullRollExtraction", "Number", "", "A",0 + P: "LeftArmFullRollExtraction", "Number", "", "A",0 + P: "RightArmFullRollExtraction", "Number", "", "A",0 + P: "RollExtractionMode", "enum", "", "",0 + P: "FootFloorContact", "bool", "", "",0 + P: "FootAutomaticToes", "bool", "", "",0 + P: "FootFloorPivot", "enum", "", "",0 + P: "FootBottomToAnkle", "double", "Number", "",8.150396347 + P: "FootBackToAnkle", "double", "Number", "",6.47736045 + P: "FootMiddleToAnkle", "double", "Number", "",12.9547209 + P: "FootFrontToMiddle", "double", "Number", "",6.47736045 + P: "FootInToAnkle", "double", "Number", "",6.47736045 + P: "FootOutToAnkle", "double", "Number", "",6.47736045 + P: "FootContactSize", "double", "Number", "",100 + P: "FootContactStiffness", "Number", "", "A",0 + P: "FootFingerContactRollStiffness", "Number", "", "A",0 + P: "HandFloorContact", "bool", "", "",0 + P: "HandAutomaticFingers", "bool", "", "",0 + P: "HandFloorPivot", "enum", "", "",0 + P: "HandBottomToWrist", "double", "Number", "",3.42318412772 + P: "HandBackToWrist", "double", "Number", "",0.01 + P: "HandMiddleToWrist", "double", "Number", "",8.550115794 + P: "HandFrontToMiddle", "double", "Number", "",8.550115794 + P: "HandInToWrist", "double", "Number", "",8.550115794 + P: "HandOutToWrist", "double", "Number", "",8.550115794 + P: "HandContactSize", "double", "Number", "",100 + P: "HandContactStiffness", "Number", "", "A",0 + P: "HandFingerContactRollStiffness", "Number", "", "A",0 + P: "CtrlPullLeftToeBase", "Number", "", "A",0 + P: "CtrlPullLeftFoot", "Number", "", "A",0 + P: "CtrlPullLeftKnee", "Number", "", "A",0 + P: "CtrlPullRightToeBase", "Number", "", "A",0 + P: "CtrlPullRightFoot", "Number", "", "A",0 + P: "CtrlPullRightKnee", "Number", "", "A",0 + P: "CtrlPullLeftFingerBase", "Number", "", "A",0 + P: "CtrlPullLeftHand", "Number", "", "A",100 + P: "CtrlPullLeftElbow", "Number", "", "A",0 + P: "CtrlPullRightFingerBase", "Number", "", "A",0 + P: "CtrlPullRightHand", "Number", "", "A",100 + P: "CtrlPullRightElbow", "Number", "", "A",0 + P: "CtrlChestPullLeftHand", "Number", "", "A",0 + P: "CtrlChestPullRightHand", "Number", "", "A",0 + P: "CtrlPullHead", "Number", "", "A",0 + P: "CtrlResistHipsPosition", "Number", "", "A",0 + P: "CtrlEnforceGravity", "Number", "", "A",60.0000023841858 + P: "CtrlResistHipsOrientation", "Number", "", "A",0 + P: "CtrlResistChestPosition", "Number", "", "A",0 + P: "CtrlResistChestOrientation", "Number", "", "A",0 + P: "CtrlResistLeftCollar", "Number", "", "A",50 + P: "CtrlResistRightCollar", "Number", "", "A",50 + P: "CtrlResistLeftKnee", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionLeftKnee", "Number", "", "A",50 + P: "CtrlResistCompressionFactorLeftKnee", "Number", "", "A",50 + P: "CtrlResistRightKnee", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionRightKnee", "Number", "", "A",50 + P: "CtrlResistCompressionFactorRightKnee", "Number", "", "A",50 + P: "CtrlResistLeftElbow", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionLeftElbow", "Number", "", "A",50 + P: "CtrlResistCompressionFactorLeftElbow", "Number", "", "A",50 + P: "CtrlResistRightElbow", "Number", "", "A",50 + P: "CtrlResistMaximumExtensionRightElbow", "Number", "", "A",50 + P: "CtrlResistCompressionFactorRightElbow", "Number", "", "A",50 + P: "CtrlSpineStiffness", "Number", "", "A",0 + P: "CtrlNeckStiffness", "Number", "", "A",0 + P: "MirrorMode", "bool", "", "",0 + P: "ShoulderCorrection", "Number", "", "A",0 + P: "LeftKneeKillPitch", "bool", "", "",0 + P: "RightKneeKillPitch", "bool", "", "",0 + P: "LeftElbowKillPitch", "bool", "", "",0 + P: "RightElbowKillPitch", "bool", "", "",0 + P: "HipsTranslationMode", "enum", "", "",0 + P: "WriteReference", "bool", "", "",0 + P: "SyncMode", "bool", "", "H",0 + P: "Damping", "Number", "", "A",0 + P: "OrientationDamping", "Number", "", "A",0 + P: "OrientationDampingMode", "enum", "", "",1 + P: "DisplacementDamping", "Number", "", "A",0 + P: "DisplacementDampingMode", "enum", "", "",1 + P: "DisplacementMemory", "Number", "", "A",0 + P: "DisplacementMemoryMode", "enum", "", "",0 + P: "HipsDisplacementDamping", "Number", "", "A",0 + P: "HipsDisplacementDampingMode", "enum", "", "",0 + P: "AnkleDisplacementDamping", "Number", "", "A",0 + P: "AnkleDisplacementDampingMode", "enum", "", "",0 + P: "WristDisplacementDamping", "Number", "", "A",0 + P: "WristDisplacementDampingMode", "enum", "", "",0 + P: "Stabilization", "Number", "", "A",0 + P: "AnkleStabilizationTime", "Number", "", "A",0 + P: "AnkleStabilizationTimeMode", "enum", "", "",0 + P: "AnkleStabilizationPerimeter", "Number", "", "A",0 + P: "AnkleStabilizationPerimeterMode", "enum", "", "",0 + P: "AnkleStabilizationAngularPerimeter", "Number", "", "A",0 + P: "AnkleStabilizationAngularPerimeterMode", "enum", "", "",1 + P: "AnkleStabilizationFloorProximity", "Number", "", "A",0 + P: "AnkleStabilizationFloorProximityMode", "enum", "", "",1 + P: "AnkleStabilizationDamping", "Number", "", "A",0 + P: "AnkleStabilizationDampingMode", "enum", "", "",0 + P: "AnkleStabilizationRecoveryTime", "Number", "", "A",0 + P: "AnkleStabilizationRecoveryTimeMode", "enum", "", "",1 + P: "LeftHandThumbTip", "double", "Number", "",1.0697450399125 + P: "LeftHandIndexTip", "double", "Number", "",1.0697450399125 + P: "LeftHandMiddleTip", "double", "Number", "",1.0697450399125 + P: "LeftHandRingTip", "double", "Number", "",1.0697450399125 + P: "LeftHandPinkyTip", "double", "Number", "",1.0697450399125 + P: "LeftHandExtraFingerTip", "double", "Number", "",1.0697450399125 + P: "RightHandThumbTip", "double", "Number", "",1.0697450399125 + P: "RightHandIndexTip", "double", "Number", "",1.0697450399125 + P: "RightHandMiddleTip", "double", "Number", "",1.0697450399125 + P: "RightHandRingTip", "double", "Number", "",1.0697450399125 + P: "RightHandPinkyTip", "double", "Number", "",1.0697450399125 + P: "RightHandExtraFingerTip", "double", "Number", "",1.0697450399125 + P: "LeftFootThumbTip", "double", "Number", "",1.0697450399125 + P: "LeftFootIndexTip", "double", "Number", "",1.0697450399125 + P: "LeftFootMiddleTip", "double", "Number", "",1.0697450399125 + P: "LeftFootRingTip", "double", "Number", "",1.0697450399125 + P: "LeftFootPinkyTip", "double", "Number", "",1.0697450399125 + P: "LeftFootExtraFingerTip", "double", "Number", "",1.0697450399125 + P: "RightFootThumbTip", "double", "Number", "",1.0697450399125 + P: "RightFootIndexTip", "double", "Number", "",1.0697450399125 + P: "RightFootMiddleTip", "double", "Number", "",1.0697450399125 + P: "RightFootRingTip", "double", "Number", "",1.0697450399125 + P: "RightFootPinkyTip", "double", "Number", "",1.0697450399125 + P: "RightFootExtraFingerTip", "double", "Number", "",1.0697450399125 + P: "FingerSolving", "bool", "", "",1 + P: "FootFingerContact", "bool", "", "",0 + P: "FootContactType", "enum", "", "",0 + P: "FootFingerContactMode", "enum", "", "",1 + P: "HandFingerContact", "bool", "", "",0 + P: "HandContactType", "enum", "", "",0 + P: "HandFingerContactMode", "enum", "", "",1 + P: "ContactBehaviour", "enum", "", "",0 + P: "HikVersion", "double", "Number", "",2016.5 + P: "Characterize", "bool", "", "",1 + P: "RealisticShoulder", "Number", "", "A",0 + P: "CollarStiffnessX", "Number", "", "A",0 + P: "CollarStiffnessY", "Number", "", "A",0 + P: "CollarStiffnessZ", "Number", "", "A",0 + P: "ExtraCollarRatio", "Number", "", "A",0 + P: "LeftLegMaxExtensionAngle", "Number", "", "A",180 + P: "RightLegMaxExtensionAngle", "Number", "", "A",180 + P: "LeftArmMaxExtensionAngle", "Number", "", "A",180 + P: "RightArmMaxExtensionAngle", "Number", "", "A",180 + P: "StretchStartArmsAndLegs", "Number", "", "A",90 + P: "StretchStopArmsAndLegs", "Number", "", "A",110 + P: "SnSScaleArmsAndLegs", "Number", "", "A",0 + P: "SnSReachLeftWrist", "Number", "", "A",0 + P: "SnSReachRightWrist", "Number", "", "A",0 + P: "SnSReachLeftAnkle", "Number", "", "A",0 + P: "SnSReachRightAnkle", "Number", "", "A",0 + P: "SnSScaleSpine", "Number", "", "A",0 + P: "SnSScaleSpineChildren", "Number", "", "A",0 + P: "SnSSpineFreedom", "Number", "", "A",10 + P: "SnSReachChestEnd", "Number", "", "A",0 + P: "SnSScaleNeck", "Number", "", "A",0 + P: "SnSNeckFreedom", "Number", "", "A",10 + P: "SnSReachHead", "Number", "", "A",0 + P: "HipsLink", "object", "", "" + P: "LeftUpLegLink", "object", "", "" + P: "LeftLegLink", "object", "", "" + P: "LeftFootLink", "object", "", "" + P: "LeftToeBaseLink", "object", "", "" + P: "RightUpLegLink", "object", "", "" + P: "RightLegLink", "object", "", "" + P: "RightFootLink", "object", "", "" + P: "RightToeBaseLink", "object", "", "" + P: "SpineLink", "object", "", "" + P: "Spine1Link", "object", "", "" + P: "LeftShoulderLink", "object", "", "" + P: "LeftArmLink", "object", "", "" + P: "LeftForeArmLink", "object", "", "" + P: "LeftHandLink", "object", "", "" + P: "RightShoulderLink", "object", "", "" + P: "RightArmLink", "object", "", "" + P: "RightForeArmLink", "object", "", "" + P: "RightHandLink", "object", "", "" + P: "NeckLink", "object", "", "" + P: "HeadLink", "object", "", "" + P: "LeftUpLegRollLink", "object", "", "" + P: "LeftLegRollLink", "object", "", "" + P: "RightUpLegRollLink", "object", "", "" + P: "RightLegRollLink", "object", "", "" + P: "LeftArmRollLink", "object", "", "" + P: "LeftForeArmRollLink", "object", "", "" + P: "RightArmRollLink", "object", "", "" + P: "RightForeArmRollLink", "object", "", "" + P: "Spine2Link", "object", "", "" + P: "Spine3Link", "object", "", "" + P: "Spine4Link", "object", "", "" + P: "Spine5Link", "object", "", "" + P: "Spine6Link", "object", "", "" + P: "Spine7Link", "object", "", "" + P: "Spine8Link", "object", "", "" + P: "Spine9Link", "object", "", "" + P: "LeftHandThumb1Link", "object", "", "" + P: "LeftHandThumb2Link", "object", "", "" + P: "LeftHandThumb3Link", "object", "", "" + P: "LeftHandIndex1Link", "object", "", "" + P: "LeftHandIndex2Link", "object", "", "" + P: "LeftHandIndex3Link", "object", "", "" + P: "LeftHandMiddle1Link", "object", "", "" + P: "LeftHandMiddle2Link", "object", "", "" + P: "LeftHandMiddle3Link", "object", "", "" + P: "LeftHandRing1Link", "object", "", "" + P: "LeftHandRing2Link", "object", "", "" + P: "LeftHandRing3Link", "object", "", "" + P: "LeftHandPinky1Link", "object", "", "" + P: "LeftHandPinky2Link", "object", "", "" + P: "LeftHandPinky3Link", "object", "", "" + P: "RightHandThumb1Link", "object", "", "" + P: "RightHandThumb2Link", "object", "", "" + P: "RightHandThumb3Link", "object", "", "" + P: "RightHandIndex1Link", "object", "", "" + P: "RightHandIndex2Link", "object", "", "" + P: "RightHandIndex3Link", "object", "", "" + P: "RightHandMiddle1Link", "object", "", "" + P: "RightHandMiddle2Link", "object", "", "" + P: "RightHandMiddle3Link", "object", "", "" + P: "RightHandRing1Link", "object", "", "" + P: "RightHandRing2Link", "object", "", "" + P: "RightHandRing3Link", "object", "", "" + P: "RightHandPinky1Link", "object", "", "" + P: "RightHandPinky2Link", "object", "", "" + P: "RightHandPinky3Link", "object", "", "" + P: "ReferenceLink", "object", "", "" + P: "LeftFloorContactLink", "object", "", "" + P: "RightFloorContactLink", "object", "", "" + P: "HipsTranslationLink", "object", "", "" + P: "Props0Link", "object", "", "" + P: "Props1Link", "object", "", "" + P: "Props2Link", "object", "", "" + P: "Props3Link", "object", "", "" + P: "Props4Link", "object", "", "" + P: "GameModeParentLeftHipRollLink", "object", "", "" + P: "GameModeParentLeftKneeLink", "object", "", "" + P: "GameModeParentLeftKneeRollLink", "object", "", "" + P: "GameModeParentRightHipRollLink", "object", "", "" + P: "GameModeParentRightKneeLink", "object", "", "" + P: "GameModeParentRightKneeRollLink", "object", "", "" + P: "GameModeParentLeftShoulderRollLink", "object", "", "" + P: "GameModeParentLeftElbowLink", "object", "", "" + P: "GameModeParentLeftElbowRollLink", "object", "", "" + P: "GameModeParentRightShoulderRollLink", "object", "", "" + P: "GameModeParentRightElbowLink", "object", "", "" + P: "GameModeParentRightElbowRollLink", "object", "", "" + P: "LeftUpLegRollExLink", "object", "", "" + P: "LeftLegRollExLink", "object", "", "" + P: "RightUpLegRollExLink", "object", "", "" + P: "RightLegRollExLink", "object", "", "" + P: "LeftArmRollExLink", "object", "", "" + P: "LeftForeArmRollExLink", "object", "", "" + P: "RightArmRollExLink", "object", "", "" + P: "RightForeArmRollExLink", "object", "", "" + P: "LeftHandFloorContactLink", "object", "", "" + P: "RightHandFloorContactLink", "object", "", "" + P: "LeftFingerBaseLink", "object", "", "" + P: "RightFingerBaseLink", "object", "", "" + P: "Neck1Link", "object", "", "" + P: "Neck2Link", "object", "", "" + P: "Neck3Link", "object", "", "" + P: "Neck4Link", "object", "", "" + P: "Neck5Link", "object", "", "" + P: "Neck6Link", "object", "", "" + P: "Neck7Link", "object", "", "" + P: "Neck8Link", "object", "", "" + P: "Neck9Link", "object", "", "" + P: "LeftInHandThumbLink", "object", "", "" + P: "LeftHandThumb4Link", "object", "", "" + P: "LeftInHandIndexLink", "object", "", "" + P: "LeftHandIndex4Link", "object", "", "" + P: "LeftInHandMiddleLink", "object", "", "" + P: "LeftHandMiddle4Link", "object", "", "" + P: "LeftInHandRingLink", "object", "", "" + P: "LeftHandRing4Link", "object", "", "" + P: "LeftInHandPinkyLink", "object", "", "" + P: "LeftHandPinky4Link", "object", "", "" + P: "LeftInHandExtraFingerLink", "object", "", "" + P: "LeftHandExtraFinger1Link", "object", "", "" + P: "LeftHandExtraFinger2Link", "object", "", "" + P: "LeftHandExtraFinger3Link", "object", "", "" + P: "LeftHandExtraFinger4Link", "object", "", "" + P: "RightInHandThumbLink", "object", "", "" + P: "RightHandThumb4Link", "object", "", "" + P: "RightInHandIndexLink", "object", "", "" + P: "RightHandIndex4Link", "object", "", "" + P: "RightInHandMiddleLink", "object", "", "" + P: "RightHandMiddle4Link", "object", "", "" + P: "RightInHandRingLink", "object", "", "" + P: "RightHandRing4Link", "object", "", "" + P: "RightInHandPinkyLink", "object", "", "" + P: "RightHandPinky4Link", "object", "", "" + P: "RightInHandExtraFingerLink", "object", "", "" + P: "RightHandExtraFinger1Link", "object", "", "" + P: "RightHandExtraFinger2Link", "object", "", "" + P: "RightHandExtraFinger3Link", "object", "", "" + P: "RightHandExtraFinger4Link", "object", "", "" + P: "LeftInFootThumbLink", "object", "", "" + P: "LeftFootThumb1Link", "object", "", "" + P: "LeftFootThumb2Link", "object", "", "" + P: "LeftFootThumb3Link", "object", "", "" + P: "LeftFootThumb4Link", "object", "", "" + P: "LeftInFootIndexLink", "object", "", "" + P: "LeftFootIndex1Link", "object", "", "" + P: "LeftFootIndex2Link", "object", "", "" + P: "LeftFootIndex3Link", "object", "", "" + P: "LeftFootIndex4Link", "object", "", "" + P: "LeftInFootMiddleLink", "object", "", "" + P: "LeftFootMiddle1Link", "object", "", "" + P: "LeftFootMiddle2Link", "object", "", "" + P: "LeftFootMiddle3Link", "object", "", "" + P: "LeftFootMiddle4Link", "object", "", "" + P: "LeftInFootRingLink", "object", "", "" + P: "LeftFootRing1Link", "object", "", "" + P: "LeftFootRing2Link", "object", "", "" + P: "LeftFootRing3Link", "object", "", "" + P: "LeftFootRing4Link", "object", "", "" + P: "LeftInFootPinkyLink", "object", "", "" + P: "LeftFootPinky1Link", "object", "", "" + P: "LeftFootPinky2Link", "object", "", "" + P: "LeftFootPinky3Link", "object", "", "" + P: "LeftFootPinky4Link", "object", "", "" + P: "LeftInFootExtraFingerLink", "object", "", "" + P: "LeftFootExtraFinger1Link", "object", "", "" + P: "LeftFootExtraFinger2Link", "object", "", "" + P: "LeftFootExtraFinger3Link", "object", "", "" + P: "LeftFootExtraFinger4Link", "object", "", "" + P: "RightInFootThumbLink", "object", "", "" + P: "RightFootThumb1Link", "object", "", "" + P: "RightFootThumb2Link", "object", "", "" + P: "RightFootThumb3Link", "object", "", "" + P: "RightFootThumb4Link", "object", "", "" + P: "RightInFootIndexLink", "object", "", "" + P: "RightFootIndex1Link", "object", "", "" + P: "RightFootIndex2Link", "object", "", "" + P: "RightFootIndex3Link", "object", "", "" + P: "RightFootIndex4Link", "object", "", "" + P: "RightInFootMiddleLink", "object", "", "" + P: "RightFootMiddle1Link", "object", "", "" + P: "RightFootMiddle2Link", "object", "", "" + P: "RightFootMiddle3Link", "object", "", "" + P: "RightFootMiddle4Link", "object", "", "" + P: "RightInFootRingLink", "object", "", "" + P: "RightFootRing1Link", "object", "", "" + P: "RightFootRing2Link", "object", "", "" + P: "RightFootRing3Link", "object", "", "" + P: "RightFootRing4Link", "object", "", "" + P: "RightInFootPinkyLink", "object", "", "" + P: "RightFootPinky1Link", "object", "", "" + P: "RightFootPinky2Link", "object", "", "" + P: "RightFootPinky3Link", "object", "", "" + P: "RightFootPinky4Link", "object", "", "" + P: "RightInFootExtraFingerLink", "object", "", "" + P: "RightFootExtraFinger1Link", "object", "", "" + P: "RightFootExtraFinger2Link", "object", "", "" + P: "RightFootExtraFinger3Link", "object", "", "" + P: "RightFootExtraFinger4Link", "object", "", "" + P: "LeftShoulderExtraLink", "object", "", "" + P: "RightShoulderExtraLink", "object", "", "" + P: "LeafLeftUpLegRoll1Link", "object", "", "" + P: "LeafLeftLegRoll1Link", "object", "", "" + P: "LeafRightUpLegRoll1Link", "object", "", "" + P: "LeafRightLegRoll1Link", "object", "", "" + P: "LeafLeftArmRoll1Link", "object", "", "" + P: "LeafLeftForeArmRoll1Link", "object", "", "" + P: "LeafRightArmRoll1Link", "object", "", "" + P: "LeafRightForeArmRoll1Link", "object", "", "" + P: "LeafLeftUpLegRoll2Link", "object", "", "" + P: "LeafLeftLegRoll2Link", "object", "", "" + P: "LeafRightUpLegRoll2Link", "object", "", "" + P: "LeafRightLegRoll2Link", "object", "", "" + P: "LeafLeftArmRoll2Link", "object", "", "" + P: "LeafLeftForeArmRoll2Link", "object", "", "" + P: "LeafRightArmRoll2Link", "object", "", "" + P: "LeafRightForeArmRoll2Link", "object", "", "" + P: "LeafLeftUpLegRoll3Link", "object", "", "" + P: "LeafLeftLegRoll3Link", "object", "", "" + P: "LeafRightUpLegRoll3Link", "object", "", "" + P: "LeafRightLegRoll3Link", "object", "", "" + P: "LeafLeftArmRoll3Link", "object", "", "" + P: "LeafLeftForeArmRoll3Link", "object", "", "" + P: "LeafRightArmRoll3Link", "object", "", "" + P: "LeafRightForeArmRoll3Link", "object", "", "" + P: "LeafLeftUpLegRoll4Link", "object", "", "" + P: "LeafLeftLegRoll4Link", "object", "", "" + P: "LeafRightUpLegRoll4Link", "object", "", "" + P: "LeafRightLegRoll4Link", "object", "", "" + P: "LeafLeftArmRoll4Link", "object", "", "" + P: "LeafLeftForeArmRoll4Link", "object", "", "" + P: "LeafRightArmRoll4Link", "object", "", "" + P: "LeafRightForeArmRoll4Link", "object", "", "" + P: "LeafLeftUpLegRoll5Link", "object", "", "" + P: "LeafLeftLegRoll5Link", "object", "", "" + P: "LeafRightUpLegRoll5Link", "object", "", "" + P: "LeafRightLegRoll5Link", "object", "", "" + P: "LeafLeftArmRoll5Link", "object", "", "" + P: "LeafLeftForeArmRoll5Link", "object", "", "" + P: "LeafRightArmRoll5Link", "object", "", "" + P: "LeafRightForeArmRoll5Link", "object", "", "" + } + CHARACTERIZE: 1 + LOCK_XFORM: 0 + LOCK_PICK: 0 + REFERENCE: { + TOFFSETX: 0 + TOFFSETY: 0 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LEFT_FLOOR: { + } + RIGHT_FLOOR: { + } + LEFT_HANDFLOOR: { + } + RIGHT_HANDFLOOR: { + } + BASE: { + LINK: "Hips" { + TOFFSETX: 0 + TOFFSETY: 100 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftUpLeg" { + TOFFSETX: 8.910000801 + TOFFSETY: 93.72999954 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftLeg" { + TOFFSETX: 8.910000801 + TOFFSETY: 48.8513546 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftFoot" { + TOFFSETX: 8.910000801 + TOFFSETY: 8.150396347 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightUpLeg" { + TOFFSETX: -8.910000801 + TOFFSETY: 93.72999954 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightLeg" { + TOFFSETX: -8.910003517 + TOFFSETY: 48.8513546 + TOFFSETZ: 0.000439024 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightFoot" { + TOFFSETX: -8.910002598 + TOFFSETY: 8.150396351 + TOFFSETZ: 0.000439024 + ROFFSETX: 0 + ROFFSETY: -0.004800386 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Spine" { + TOFFSETX: 0 + TOFFSETY: 107 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftArm" { + TOFFSETX: 17.70725107 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftForeArm" { + TOFFSETX: 45.01271677 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHand" { + TOFFSETX: 71.70986414 + TOFFSETY: 146.5886842 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightArm" { + TOFFSETX: -17.70727491 + TOFFSETY: 146.58898 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightForeArm" { + TOFFSETX: -45.01287316 + TOFFSETY: 146.58898 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHand" { + TOFFSETX: -71.70986127 + TOFFSETY: 146.5889787 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Head" { + TOFFSETX: 0 + TOFFSETY: 165 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + AUXILIARY: { + LINK: "LeftToeBase" { + TOFFSETX: 8.910009228 + TOFFSETY: 1.888079154 + TOFFSETZ: 12.9547209 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightToeBase" { + TOFFSETX: -8.911087979 + TOFFSETY: 1.888079171 + TOFFSETZ: 12.95518809 + ROFFSETX: 0.002912593 + ROFFSETY: -0.004800386 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftShoulder" { + TOFFSETX: 7.000000477 + TOFFSETY: 146.5885468 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000735282 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightShoulder" { + TOFFSETX: -6.999999523 + TOFFSETY: 146.5885468 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.002318361 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Neck" { + TOFFSETX: 0 + TOFFSETY: 145 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + SPINE: { + LINK: "Spine1" { + TOFFSETX: 0 + TOFFSETY: 119.666666666667 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "Spine2" { + TOFFSETX: 0 + TOFFSETY: 132.333333333333 + TOFFSETZ: 0 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + NECK: { + } + ROLL: { + } + SPECIAL: { + } + LEFTHAND: { + LINK: "LeftHandThumb1" { + TOFFSETX: 76.05862099 + TOFFSETY: 145.7901817 + TOFFSETZ: 4.282433967 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb2" { + TOFFSETX: 78.57121093 + TOFFSETY: 145.2540823 + TOFFSETZ: 4.989888291 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000297862 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb3" { + TOFFSETX: 81.11435134 + TOFFSETY: 145.2540691 + TOFFSETZ: 4.989897633 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex1" { + TOFFSETX: 80.53184086 + TOFFSETY: 146.7884134 + TOFFSETZ: 3.471669416 + ROFFSETX: 0 + ROFFSETY: -1.999999985 + ROFFSETZ: -0.000299341 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999983 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex2" { + TOFFSETX: 84.75459546 + TOFFSETY: 146.7883913 + TOFFSETZ: 3.618868435 + ROFFSETX: 0 + ROFFSETY: -1.999999985 + ROFFSETZ: -0.000299341 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999983 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex3" { + TOFFSETX: 87.40692091 + TOFFSETY: 146.7883775 + TOFFSETZ: 3.711324415 + ROFFSETX: 0 + ROFFSETY: -1.999999985 + ROFFSETZ: -0.000299341 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999983 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle1" { + TOFFSETX: 80.5197435 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.304684381 + ROFFSETX: 0 + ROFFSETY: -0.003563334 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle2" { + TOFFSETX: 85.38299518 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.304986836 + ROFFSETX: 0 + ROFFSETY: -0.003563334 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle3" { + TOFFSETX: 88.14823179 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.305158619 + ROFFSETX: 0 + ROFFSETY: -0.003563334 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing1" { + TOFFSETX: 80.60362393 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793158909 + ROFFSETX: 0 + ROFFSETY: -0.003563529 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing2" { + TOFFSETX: 85.14138276 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.79315882 + ROFFSETX: 0 + ROFFSETY: -0.003563529 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing3" { + TOFFSETX: 87.44590862 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793158937 + ROFFSETX: 0 + ROFFSETY: -0.003563529 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky1" { + TOFFSETX: 80.59213883 + TOFFSETY: 146.2756572 + TOFFSETZ: -2.490356465 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000763026 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky2" { + TOFFSETX: 83.63623816 + TOFFSETY: 146.2756978 + TOFFSETZ: -2.490356465 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000763026 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky3" { + TOFFSETX: 85.61073965 + TOFFSETY: 146.2757241 + TOFFSETZ: -2.490356608 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000763026 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandThumb4" { + TOFFSETX: 83.78109748 + TOFFSETY: 145.254072 + TOFFSETZ: 4.989889422 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandIndex4" { + TOFFSETX: 89.36395514 + TOFFSETY: 146.7883673 + TOFFSETZ: 3.779543315 + ROFFSETX: 0 + ROFFSETY: -1.999999985 + ROFFSETZ: -0.000299341 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999983 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandMiddle4" { + TOFFSETX: 90.15386395 + TOFFSETY: 147.0895747 + TOFFSETZ: 1.305282215 + ROFFSETX: 0 + ROFFSETY: -0.003563334 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandRing4" { + TOFFSETX: 89.36925598 + TOFFSETY: 146.9686038 + TOFFSETZ: -0.793159754 + ROFFSETX: 0 + ROFFSETY: -0.003563529 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "LeftHandPinky4" { + TOFFSETX: 87.2773543 + TOFFSETY: 146.2757463 + TOFFSETZ: -2.490355817 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0.000763026 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + RIGHTHAND: { + LINK: "RightHandThumb1" { + TOFFSETX: -76.05824206 + TOFFSETY: 145.7904806 + TOFFSETZ: 4.282814738 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb2" { + TOFFSETX: -78.57076957 + TOFFSETY: 145.2543817 + TOFFSETZ: 4.990491388 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000602085999999999 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb3" { + TOFFSETX: -81.11235893 + TOFFSETY: 145.2544085 + TOFFSETZ: 5.079311703 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000391494 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex1" { + TOFFSETX: -80.53153393 + TOFFSETY: 146.7887124 + TOFFSETZ: 3.472444296 + ROFFSETX: 0 + ROFFSETY: -2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex2" { + TOFFSETX: -84.75428415 + TOFFSETY: 146.7887121 + TOFFSETZ: 3.325092508 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex3" { + TOFFSETX: -87.40660695 + TOFFSETY: 146.7887118 + TOFFSETZ: 3.232540367 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle1" { + TOFFSETX: -80.5196273 + TOFFSETY: 147.0898718 + TOFFSETZ: 1.305458427 + ROFFSETX: 0 + ROFFSETY: -2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle2" { + TOFFSETX: -85.37992179 + TOFFSETY: 147.0898714 + TOFFSETZ: 1.135859675 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle3" { + TOFFSETX: -88.14347689 + TOFFSETY: 147.0898712 + TOFFSETZ: 1.039426113 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing1" { + TOFFSETX: -80.6036937 + TOFFSETY: 146.968899 + TOFFSETZ: -0.792376756 + ROFFSETX: 0 + ROFFSETY: -2.000064658 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing2" { + TOFFSETX: -85.13869331 + TOFFSETY: 146.9688986 + TOFFSETZ: -0.950624428 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing3" { + TOFFSETX: -87.44181788 + TOFFSETY: 146.9688984 + TOFFSETZ: -1.03099138 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky1" { + TOFFSETX: -80.59235737 + TOFFSETY: 146.2759509 + TOFFSETZ: -2.489574194 + ROFFSETX: 0 + ROFFSETY: -2.000064658 + ROFFSETZ: 0.001241215 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999714 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky2" { + TOFFSETX: -83.63829999 + TOFFSETY: 146.2758849 + TOFFSETZ: -2.595861595 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0.001241215 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999714 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky3" { + TOFFSETX: -85.61399713 + TOFFSETY: 146.2758421 + TOFFSETZ: -2.664803045 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0.001241215 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999714 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandThumb4" { + TOFFSETX: -83.77747869 + TOFFSETY: 145.2544268 + TOFFSETZ: 5.17244902 + ROFFSETX: 0 + ROFFSETY: -0 + ROFFSETZ: -0.000391494 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandIndex4" { + TOFFSETX: -89.36363917 + TOFFSETY: 146.7887117 + TOFFSETZ: 3.164250215 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandMiddle4" { + TOFFSETX: -90.14788957 + TOFFSETY: 147.089871 + TOFFSETZ: 0.969482638 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandRing4" { + TOFFSETX: -89.3639958 + TOFFSETY: 146.9688983 + TOFFSETZ: -1.098065296 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 1 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + LINK: "RightHandPinky4" { + TOFFSETX: -87.28162098 + TOFFSETY: 146.2758059 + TOFFSETZ: -2.722994364 + ROFFSETX: 0 + ROFFSETY: -2.000064636 + ROFFSETZ: 0.001241215 + SOFFSETX: 1 + SOFFSETY: 1 + SOFFSETZ: 0.999999999999714 + PARENTROFFSETX: 0 + PARENTROFFSETY: 0 + PARENTROFFSETZ: 0 + } + } + LEFTFOOT: { + } + RIGHTFOOT: { + } + PROPS: { + } + } + AnimationStack: 2376895519472, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurveNode: 2376889356240, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376889356656, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376889358528, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376889356864, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376889357072, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376889354784, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376906930272, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376906930896, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376902837504, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376902839584, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376853376272, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376895518016, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0.5 + } + } + AnimationCurveNode: 2376806869360, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901320848, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0.5 + } + } + AnimationCurveNode: 2376901320640, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901323760, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0.5 + } + } + AnimationCurveNode: 2376901324176, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901325632, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0.5 + } + } + AnimationCurveNode: 2376901331456, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901325840, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901329584, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901330624, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901328128, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901319184, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901323968, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901322512, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901321056, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901320224, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0.5 + } + } + AnimationCurveNode: 2376901331248, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901319600, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0.5 + } + } + AnimationCurveNode: 2376901324800, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901321264, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901331664, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901326048, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901330832, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901330208, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901325216, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901320432, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901325008, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901321472, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901328336, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901332080, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901321680, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901329792, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901331872, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901329168, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901332288, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901319392, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901328752, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901321888, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901325424, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901319808, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901331040, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901320016, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901322096, "AnimCurveNode::pull", "" { + Properties70: { + P: "d|pull", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901322928, "AnimCurveNode::stiffness", "" { + Properties70: { + P: "d|stiffness", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901322304, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",99.9999923706055 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901326880, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376901322720, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901330000, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",8.91000080108643 + P: "d|Y", "Number", "", "A",-6.27000427246094 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901323136, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376901330416, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-0.000613368256766612 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901326256, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-9.5367431640625e-07 + P: "d|Y", "Number", "", "A",-44.8786392186198 + P: "d|Z", "Number", "", "A",-0.000480439099329277 + } + } + AnimationCurveNode: 2376901327712, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376901326464, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.000415292914140102 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901323344, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-1.77635683940025e-15 + P: "d|Y", "Number", "", "A",-40.7009582517099 + P: "d|Z", "Number", "", "A",-0.000140705935401858 + } + } + AnimationCurveNode: 2376901323552, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376901326672, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.000198075342616968 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901324384, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",7.62939453302636e-06 + P: "d|Y", "Number", "", "A",-6.26231718063355 + P: "d|Z", "Number", "", "A",12.9547204971313 + } + } + AnimationCurveNode: 2376901324592, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376901327088, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901327296, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-8.91000080108643 + P: "d|Y", "Number", "", "A",-6.27000427246094 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901329376, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376901327504, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-0.000613115991250192 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901327920, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-1.9073486328125e-06 + P: "d|Y", "Number", "", "A",-44.8786392233199 + P: "d|Z", "Number", "", "A",-4.12174983339113e-05 + } + } + AnimationCurveNode: 2376901328544, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376901328960, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.000415040648623682 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901333536, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",9.5367431640625e-07 + P: "d|Y", "Number", "", "A",-40.7009582517099 + P: "d|Z", "Number", "", "A",-0.000140705935401857 + } + } + AnimationCurveNode: 2376901334784, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376901333744, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.000198075330348223 + P: "d|Y", "Number", "", "A",-0.00480038608736341 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901332496, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",9.8607513265847e-08 + P: "d|Y", "Number", "", "A",-6.26231718063617 + P: "d|Z", "Number", "", "A",12.9547488189982 + } + } + AnimationCurveNode: 2376901332704, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376901332912, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.00291259295273158 + P: "d|Y", "Number", "", "A",-0.00480038600005737 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901334160, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",7 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901333952, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376901334368, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901333328, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",12.6666641235352 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901334576, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376901334992, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901335200, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",12.6666564941406 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376901333120, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915983280, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915978288, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",7.00000095367432 + P: "d|Y", "Number", "", "A",14.2552185058594 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915974128, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915975584, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0.000735282016211991 + } + } + AnimationCurveNode: 2376915986192, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",10.7072477349505 + P: "d|Y", "Number", "", "A",-7.79949687057524e-08 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915983488, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915982448, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.00067450447403495 + P: "d|Y", "Number", "", "A",0.00203795310655456 + P: "d|Z", "Number", "", "A",0.0012567684434604 + } + } + AnimationCurveNode: 2376915973712, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",27.3054694890979 + P: "d|Y", "Number", "", "A",-0.000598927146967299 + P: "d|Z", "Number", "", "A",0.000971235069153659 + } + } + AnimationCurveNode: 2376915981616, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915986400, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-0.000674459772366627 + P: "d|Y", "Number", "", "A",-0.00216353911962381 + P: "d|Z", "Number", "", "A",-0.0012567429907804 + } + } + AnimationCurveNode: 2376915982032, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",26.6971435546234 + P: "d|Y", "Number", "", "A",5.6843418860808e-14 + P: "d|Z", "Number", "", "A",-5.85102930517871e-05 + } + } + AnimationCurveNode: 2376915978496, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915985152, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0.000125571218624066 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915975792, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",4.34876251220705 + P: "d|Y", "Number", "", "A",-0.798507690429688 + P: "d|Z", "Number", "", "A",4.28243398666382 + } + } + AnimationCurveNode: 2376915980160, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915974336, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915974544, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",2.51258850097655 + P: "d|Y", "Number", "", "A",-0.536087036132813 + P: "d|Z", "Number", "", "A",0.707454204559326 + } + } + AnimationCurveNode: 2376915985360, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915984320, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",-0.000297862000455712 + } + } + AnimationCurveNode: 2376915976416, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",2.54313659672466 + P: "d|Y", "Number", "", "A",-2.03785447183691e-06 + P: "d|Z", "Number", "", "A",9.53674316317432e-06 + } + } + AnimationCurveNode: 2376915981824, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915983696, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915976000, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",2.666748046875 + P: "d|Y", "Number", "", "A",5.6843418860808e-14 + P: "d|Z", "Number", "", "A",-8.10623168856495e-06 + } + } + AnimationCurveNode: 2376915978704, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915979536, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915978912, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",8.82197570800783 + P: "d|Y", "Number", "", "A",0.199722290039063 + P: "d|Z", "Number", "", "A",3.4716694355011 + } + } + AnimationCurveNode: 2376915983904, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915979744, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-1.99999990650714 + P: "d|Z", "Number", "", "A",-0.000299341005181314 + } + } + AnimationCurveNode: 2376915976832, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",4.22532021170265 + P: "d|Y", "Number", "", "A",6.80293811683441e-06 + P: "d|Z", "Number", "", "A",-0.000262786505682566 + } + } + AnimationCurveNode: 2376915984112, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915981408, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-1.999999985 + P: "d|Z", "Number", "", "A",-0.000299340999991943 + } + } + AnimationCurveNode: 2376915979328, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",2.6539394358412 + P: "d|Y", "Number", "", "A",-1.40173565910118e-06 + P: "d|Z", "Number", "", "A",-0.000165144492167202 + } + } + AnimationCurveNode: 2376915982240, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915974752, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-1.999999985 + P: "d|Z", "Number", "", "A",-0.000299340999993751 + } + } + AnimationCurveNode: 2376915974960, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.95821988638983 + P: "d|Y", "Number", "", "A",-5.03430641174418e-06 + P: "d|Z", "Number", "", "A",-0.000122013144632449 + } + } + AnimationCurveNode: 2376915976624, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915975168, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-1.999999985 + P: "d|Z", "Number", "", "A",-0.00029934099999268 + } + } + AnimationCurveNode: 2376915977040, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",8.8098831176758 + P: "d|Y", "Number", "", "A",0.500885009765625 + P: "d|Z", "Number", "", "A",1.30468440055847 + } + } + AnimationCurveNode: 2376915973296, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915984528, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0.00356333394791432 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915977248, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",4.86325074182569 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",-2.08833894621563e-08 + } + } + AnimationCurveNode: 2376915975376, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915976208, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0.00356333400000013 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915973504, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",2.76523590621453 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",-1.94715533696765e-07 + } + } + AnimationCurveNode: 2376915979952, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915977456, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0.0035633339999998 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915979120, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",2.00563049697352 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",-1.11395749535781e-06 + } + } + AnimationCurveNode: 2376915977664, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915980368, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0.00356333400000016 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915982656, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",8.89376068115236 + P: "d|Y", "Number", "", "A",0.379913330078125 + P: "d|Z", "Number", "", "A",-0.793158888816833 + } + } + AnimationCurveNode: 2376915977872, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915980576, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0.00356352904853195 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915985568, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",4.53775786476226 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",-0.000282167675000555 + } + } + AnimationCurveNode: 2376915978080, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915980784, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0.00356352899999992 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915980992, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",2.30452727825016 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",-0.000143450009211787 + } + } + AnimationCurveNode: 2376915981200, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915982864, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0.00356352900000002 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915983072, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.92334746937263 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",-0.000120457666677898 + } + } + AnimationCurveNode: 2376915985776, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915973920, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0.00356352900000002 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915984736, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",8.88227844238283 + P: "d|Y", "Number", "", "A",-0.313034057617188 + P: "d|Z", "Number", "", "A",-2.4903564453125 + } + } + AnimationCurveNode: 2376915984944, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915985984, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0.000763026011995871 + } + } + AnimationCurveNode: 2376915991600, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",3.04409790073031 + P: "d|Y", "Number", "", "A",5.23715291933513e-06 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915990976, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915987440, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0.000739071406413687 + } + } + AnimationCurveNode: 2376915987648, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.97450256370597 + P: "d|Y", "Number", "", "A",5.04801613487871e-06 + P: "d|Z", "Number", "", "A",-2.38418579101563e-07 + } + } + AnimationCurveNode: 2376915990560, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915989312, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0.000763026000027254 + } + } + AnimationCurveNode: 2376915991808, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.66661071783157 + P: "d|Y", "Number", "", "A",-6.23920536213518e-06 + P: "d|Z", "Number", "", "A",9.53674316850339e-07 + } + } + AnimationCurveNode: 2376915990144, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915992224, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0.000763025999978541 + } + } + AnimationCurveNode: 2376915989936, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-7 + P: "d|Y", "Number", "", "A",14.2552185058594 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915990352, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915987856, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",-0.00231836105352646 + } + } + AnimationCurveNode: 2376915989520, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-10.7072753991474 + P: "d|Y", "Number", "", "A",-6.00275080842039e-06 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915986608, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915992432, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.000685603635662701 + P: "d|Y", "Number", "", "A",-0.00204563686091838 + P: "d|Z", "Number", "", "A",-0.00125676861464934 + } + } + AnimationCurveNode: 2376915988064, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-27.3055991886743 + P: "d|Y", "Number", "", "A",-0.000598929859222608 + P: "d|Z", "Number", "", "A",0.000974901665371063 + } + } + AnimationCurveNode: 2376915992016, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915990768, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-0.000685558765454442 + P: "d|Y", "Number", "", "A",0.00217122311744007 + P: "d|Z", "Number", "", "A",0.00125674268823229 + } + } + AnimationCurveNode: 2376915989728, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-26.6969871520355 + P: "d|Y", "Number", "", "A",2.8421709430404e-14 + P: "d|Z", "Number", "", "A",-5.85099502749942e-05 + } + } + AnimationCurveNode: 2376915991184, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915988688, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0.000125571218631082 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915988272, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-4.34838104248047 + P: "d|Y", "Number", "", "A",-0.798492431640653 + P: "d|Z", "Number", "", "A",4.28281450271606 + } + } + AnimationCurveNode: 2376915988896, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915988480, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915991392, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-2.5125274658203 + P: "d|Y", "Number", "", "A",-0.536102294921847 + P: "d|Z", "Number", "", "A",0.707676887512208 + } + } + AnimationCurveNode: 2376915986816, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915989104, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",-0.000602085979890121 + } + } + AnimationCurveNode: 2376915987024, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-2.54158782977022 + P: "d|Y", "Number", "", "A",3.80960048573797e-06 + P: "d|Z", "Number", "", "A",0.088820457458497 + } + } + AnimationCurveNode: 2376915987232, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915966432, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",-0.000391494032984209 + } + } + AnimationCurveNode: 2376915971424, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-2.66512298588188 + P: "d|Y", "Number", "", "A",-2.95162195129706e-06 + P: "d|Z", "Number", "", "A",0.093137264251709 + } + } + AnimationCurveNode: 2376915969968, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915962896, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",-0.000391493999975616 + } + } + AnimationCurveNode: 2376915966640, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-8.82167053222656 + P: "d|Y", "Number", "", "A",0.199737548828097 + P: "d|Z", "Number", "", "A",3.47244429588318 + } + } + AnimationCurveNode: 2376915967888, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915971008, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.00006454048744 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915971632, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-4.22532554511477 + P: "d|Y", "Number", "", "A",2.8421709430404e-14 + P: "d|Z", "Number", "", "A",0.000114819780703712 + } + } + AnimationCurveNode: 2376915962272, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915971840, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.00006487131337 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915965184, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-2.65393516420842 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",7.18577928200403e-05 + } + } + AnimationCurveNode: 2376915960400, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915971216, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.000064636 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915959984, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-1.95822237416384 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",5.29857275415324e-05 + } + } + AnimationCurveNode: 2376915969760, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915961024, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.000064636 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915963728, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-8.80976867675781 + P: "d|Y", "Number", "", "A",0.500900268554659 + P: "d|Z", "Number", "", "A",1.30545842647553 + } + } + AnimationCurveNode: 2376915963520, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915960816, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.00006454048744 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915963936, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-4.86324867875288 + P: "d|Y", "Number", "", "A",2.8421709430404e-14 + P: "d|Z", "Number", "", "A",0.000131787738323119 + } + } + AnimationCurveNode: 2376915965392, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915969344, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.000064658 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915972464, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-2.76523943496396 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",7.49836865896469e-05 + } + } + AnimationCurveNode: 2376915964352, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915965600, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.000064636 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915965808, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-2.00562974812861 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",5.43316945416095e-05 + } + } + AnimationCurveNode: 2376915962688, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915964560, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.000064636 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915964768, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-8.89382934570313 + P: "d|Y", "Number", "", "A",0.379928588867159 + P: "d|Z", "Number", "", "A",-0.79237675666809 + } + } + AnimationCurveNode: 2376915968096, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915961232, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.00006454048744 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915962480, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-4.53776382360202 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0.000123207411302229 + } + } + AnimationCurveNode: 2376915964144, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915964976, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.00006487131337 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915968304, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-2.30452524231353 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",6.2383298205404e-05 + } + } + AnimationCurveNode: 2376915972880, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915972256, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.000064636 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915970176, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-1.92335007812626 + P: "d|Y", "Number", "", "A",2.8421709430404e-14 + P: "d|Z", "Number", "", "A",5.23319517493626e-05 + } + } + AnimationCurveNode: 2376915966016, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915968512, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.000064636 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915966848, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-8.88249206542969 + P: "d|Y", "Number", "", "A",-0.313018798828153 + P: "d|Z", "Number", "", "A",-2.48957419395447 + } + } + AnimationCurveNode: 2376915970384, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915961440, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.00006454001851 + P: "d|Z", "Number", "", "A",0.00124121500074499 + } + } + AnimationCurveNode: 2376915967056, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-3.04779808733394 + P: "d|Y", "Number", "", "A",-1.03087770639831e-05 + P: "d|Z", "Number", "", "A",8.26212895672085e-05 + } + } + AnimationCurveNode: 2376915966224, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915961856, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.00006465749222 + P: "d|Z", "Number", "", "A",0.00179132697290335 + } + } + AnimationCurveNode: 2376915963104, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-1.97690285411784 + P: "d|Y", "Number", "", "A",1.59930233678551e-05 + P: "d|Z", "Number", "", "A",5.3818153643248e-05 + } + } + AnimationCurveNode: 2376915967264, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915967472, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.000064636 + P: "d|Z", "Number", "", "A",0.00124121500000094 + } + } + AnimationCurveNode: 2376915961648, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-1.66864040299899 + P: "d|Y", "Number", "", "A",-8.89759152755687e-06 + P: "d|Z", "Number", "", "A",4.53168677359561e-05 + } + } + AnimationCurveNode: 2376915967680, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915960192, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-2.000064636 + P: "d|Z", "Number", "", "A",0.00124121499996102 + } + } + AnimationCurveNode: 2376915968720, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",12.6666717529297 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915962064, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915968928, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915969136, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",20 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2376915969552, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2376915970592, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2376790115088, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Character1_Ctrl_Hips, ControlSetPlug::Character1_ControlRig + C: "OP",2376901487808,2376854953056, "Hips" + + ;Model::Character1_Ctrl_LeftUpLeg, ControlSetPlug::Character1_ControlRig + C: "OP",2376901536528,2376854953056, "LeftUpLeg" + + ;Model::Character1_Ctrl_LeftLeg, ControlSetPlug::Character1_ControlRig + C: "OP",2376901538848,2376854953056, "LeftLeg" + + ;Model::Character1_Ctrl_LeftFoot, ControlSetPlug::Character1_ControlRig + C: "OP",2376901548128,2376854953056, "LeftFoot" + + ;Model::Character1_Ctrl_LeftToeBase, ControlSetPlug::Character1_ControlRig + C: "OP",2376901527248,2376854953056, "LeftToeBase" + + ;Model::Character1_Ctrl_RightUpLeg, ControlSetPlug::Character1_ControlRig + C: "OP",2376901534208,2376854953056, "RightUpLeg" + + ;Model::Character1_Ctrl_RightLeg, ControlSetPlug::Character1_ControlRig + C: "OP",2376901541168,2376854953056, "RightLeg" + + ;Model::Character1_Ctrl_RightFoot, ControlSetPlug::Character1_ControlRig + C: "OP",2376901529568,2376854953056, "RightFoot" + + ;Model::Character1_Ctrl_RightToeBase, ControlSetPlug::Character1_ControlRig + C: "OP",2376901545808,2376854953056, "RightToeBase" + + ;Model::Character1_Ctrl_Spine, ControlSetPlug::Character1_ControlRig + C: "OP",2376901531888,2376854953056, "Spine" + + ;Model::Character1_Ctrl_Spine1, ControlSetPlug::Character1_ControlRig + C: "OP",2376901543488,2376854953056, "Spine1" + + ;Model::Character1_Ctrl_LeftShoulder, ControlSetPlug::Character1_ControlRig + C: "OP",2376901522608,2376854953056, "LeftShoulder" + + ;Model::Character1_Ctrl_LeftArm, ControlSetPlug::Character1_ControlRig + C: "OP",2376901550448,2376854953056, "LeftArm" + + ;Model::Character1_Ctrl_LeftForeArm, ControlSetPlug::Character1_ControlRig + C: "OP",2376901520288,2376854953056, "LeftForeArm" + + ;Model::Character1_Ctrl_LeftHand, ControlSetPlug::Character1_ControlRig + C: "OP",2376901564368,2376854953056, "LeftHand" + + ;Model::Character1_Ctrl_RightShoulder, ControlSetPlug::Character1_ControlRig + C: "OP",2376901594528,2376854953056, "RightShoulder" + + ;Model::Character1_Ctrl_RightArm, ControlSetPlug::Character1_ControlRig + C: "OP",2376901601488,2376854953056, "RightArm" + + ;Model::Character1_Ctrl_RightForeArm, ControlSetPlug::Character1_ControlRig + C: "OP",2376901620048,2376854953056, "RightForeArm" + + ;Model::Character1_Ctrl_RightHand, ControlSetPlug::Character1_ControlRig + C: "OP",2376901603808,2376854953056, "RightHand" + + ;Model::Character1_Ctrl_Neck, ControlSetPlug::Character1_ControlRig + C: "OP",2376901657168,2376854953056, "Neck" + + ;Model::Character1_Ctrl_Head, ControlSetPlug::Character1_ControlRig + C: "OP",2376901643248,2376854953056, "Head" + + ;Model::Character1_Ctrl_Spine2, ControlSetPlug::Character1_ControlRig + C: "OP",2376901524928,2376854953056, "Spine2" + + ;Model::Character1_Ctrl_LeftHandThumb1, ControlSetPlug::Character1_ControlRig + C: "OP",2376901555088,2376854953056, "LeftHandThumb1" + + ;Model::Character1_Ctrl_LeftHandThumb2, ControlSetPlug::Character1_ControlRig + C: "OP",2376901573648,2376854953056, "LeftHandThumb2" + + ;Model::Character1_Ctrl_LeftHandThumb3, ControlSetPlug::Character1_ControlRig + C: "OP",2376901566688,2376854953056, "LeftHandThumb3" + + ;Model::Character1_Ctrl_LeftHandIndex1, ControlSetPlug::Character1_ControlRig + C: "OP",2376901585248,2376854953056, "LeftHandIndex1" + + ;Model::Character1_Ctrl_LeftHandIndex2, ControlSetPlug::Character1_ControlRig + C: "OP",2376901569008,2376854953056, "LeftHandIndex2" + + ;Model::Character1_Ctrl_LeftHandIndex3, ControlSetPlug::Character1_ControlRig + C: "OP",2376901578288,2376854953056, "LeftHandIndex3" + + ;Model::Character1_Ctrl_LeftHandMiddle1, ControlSetPlug::Character1_ControlRig + C: "OP",2376901562048,2376854953056, "LeftHandMiddle1" + + ;Model::Character1_Ctrl_LeftHandMiddle2, ControlSetPlug::Character1_ControlRig + C: "OP",2376901575968,2376854953056, "LeftHandMiddle2" + + ;Model::Character1_Ctrl_LeftHandMiddle3, ControlSetPlug::Character1_ControlRig + C: "OP",2376901580608,2376854953056, "LeftHandMiddle3" + + ;Model::Character1_Ctrl_LeftHandRing1, ControlSetPlug::Character1_ControlRig + C: "OP",2376901587568,2376854953056, "LeftHandRing1" + + ;Model::Character1_Ctrl_LeftHandRing2, ControlSetPlug::Character1_ControlRig + C: "OP",2376901589888,2376854953056, "LeftHandRing2" + + ;Model::Character1_Ctrl_LeftHandRing3, ControlSetPlug::Character1_ControlRig + C: "OP",2376901559728,2376854953056, "LeftHandRing3" + + ;Model::Character1_Ctrl_LeftHandPinky1, ControlSetPlug::Character1_ControlRig + C: "OP",2376901596848,2376854953056, "LeftHandPinky1" + + ;Model::Character1_Ctrl_LeftHandPinky2, ControlSetPlug::Character1_ControlRig + C: "OP",2376901622368,2376854953056, "LeftHandPinky2" + + ;Model::Character1_Ctrl_LeftHandPinky3, ControlSetPlug::Character1_ControlRig + C: "OP",2376901617728,2376854953056, "LeftHandPinky3" + + ;Model::Character1_Ctrl_RightHandThumb1, ControlSetPlug::Character1_ControlRig + C: "OP",2376901592208,2376854953056, "RightHandThumb1" + + ;Model::Character1_Ctrl_RightHandThumb2, ControlSetPlug::Character1_ControlRig + C: "OP",2376901629328,2376854953056, "RightHandThumb2" + + ;Model::Character1_Ctrl_RightHandThumb3, ControlSetPlug::Character1_ControlRig + C: "OP",2376901624688,2376854953056, "RightHandThumb3" + + ;Model::Character1_Ctrl_RightHandIndex1, ControlSetPlug::Character1_ControlRig + C: "OP",2376901613088,2376854953056, "RightHandIndex1" + + ;Model::Character1_Ctrl_RightHandIndex2, ControlSetPlug::Character1_ControlRig + C: "OP",2376901627008,2376854953056, "RightHandIndex2" + + ;Model::Character1_Ctrl_RightHandIndex3, ControlSetPlug::Character1_ControlRig + C: "OP",2376901610768,2376854953056, "RightHandIndex3" + + ;Model::Character1_Ctrl_RightHandMiddle1, ControlSetPlug::Character1_ControlRig + C: "OP",2376901633968,2376854953056, "RightHandMiddle1" + + ;Model::Character1_Ctrl_RightHandMiddle2, ControlSetPlug::Character1_ControlRig + C: "OP",2376901557408,2376854953056, "RightHandMiddle2" + + ;Model::Character1_Ctrl_RightHandMiddle3, ControlSetPlug::Character1_ControlRig + C: "OP",2376901636288,2376854953056, "RightHandMiddle3" + + ;Model::Character1_Ctrl_RightHandRing1, ControlSetPlug::Character1_ControlRig + C: "OP",2376901608448,2376854953056, "RightHandRing1" + + ;Model::Character1_Ctrl_RightHandRing2, ControlSetPlug::Character1_ControlRig + C: "OP",2376901640928,2376854953056, "RightHandRing2" + + ;Model::Character1_Ctrl_RightHandRing3, ControlSetPlug::Character1_ControlRig + C: "OP",2376901659488,2376854953056, "RightHandRing3" + + ;Model::Character1_Ctrl_RightHandPinky1, ControlSetPlug::Character1_ControlRig + C: "OP",2376901661808,2376854953056, "RightHandPinky1" + + ;Model::Character1_Ctrl_RightHandPinky2, ControlSetPlug::Character1_ControlRig + C: "OP",2376901673408,2376854953056, "RightHandPinky2" + + ;Model::Character1_Ctrl_RightHandPinky3, ControlSetPlug::Character1_ControlRig + C: "OP",2376901666448,2376854953056, "RightHandPinky3" + + ;Model::Character1_Ctrl_Reference, ControlSetPlug::Character1_ControlRig + C: "OP",2376901457648,2376854953056, "Reference" + + ;Model::Character1_Ctrl_LeftHandThumb4, ControlSetPlug::Character1_ControlRig + C: "OP",2376901552768,2376854953056, "LeftHandThumb4" + + ;Model::Character1_Ctrl_LeftHandIndex4, ControlSetPlug::Character1_ControlRig + C: "OP",2376901571328,2376854953056, "LeftHandIndex4" + + ;Model::Character1_Ctrl_LeftHandMiddle4, ControlSetPlug::Character1_ControlRig + C: "OP",2376901582928,2376854953056, "LeftHandMiddle4" + + ;Model::Character1_Ctrl_LeftHandRing4, ControlSetPlug::Character1_ControlRig + C: "OP",2376901606128,2376854953056, "LeftHandRing4" + + ;Model::Character1_Ctrl_LeftHandPinky4, ControlSetPlug::Character1_ControlRig + C: "OP",2376901599168,2376854953056, "LeftHandPinky4" + + ;Model::Character1_Ctrl_RightHandThumb4, ControlSetPlug::Character1_ControlRig + C: "OP",2376901615408,2376854953056, "RightHandThumb4" + + ;Model::Character1_Ctrl_RightHandIndex4, ControlSetPlug::Character1_ControlRig + C: "OP",2376901631648,2376854953056, "RightHandIndex4" + + ;Model::Character1_Ctrl_RightHandMiddle4, ControlSetPlug::Character1_ControlRig + C: "OP",2376901638608,2376854953056, "RightHandMiddle4" + + ;Model::Character1_Ctrl_RightHandRing4, ControlSetPlug::Character1_ControlRig + C: "OP",2376901654848,2376854953056, "RightHandRing4" + + ;Model::Character1_Ctrl_RightHandPinky4, ControlSetPlug::Character1_ControlRig + C: "OP",2376901652528,2376854953056, "RightHandPinky4" + + ;Model::Character1_Ctrl_HipsEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901450688,2376854953056, "HipsEffector" + + ;Model::Character1_Ctrl_LeftAnkleEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901473888,2376854953056, "LeftAnkleEffector" + + ;Model::Character1_Ctrl_RightAnkleEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901455328,2376854953056, "RightAnkleEffector" + + ;Model::Character1_Ctrl_LeftWristEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901446048,2376854953056, "LeftWristEffector" + + ;Model::Character1_Ctrl_RightWristEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901443728,2376854953056, "RightWristEffector" + + ;Model::Character1_Ctrl_LeftKneeEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901462288,2376854953056, "LeftKneeEffector" + + ;Model::Character1_Ctrl_RightKneeEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901466928,2376854953056, "RightKneeEffector" + + ;Model::Character1_Ctrl_LeftElbowEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901476208,2376854953056, "LeftElbowEffector" + + ;Model::Character1_Ctrl_RightElbowEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901469248,2376854953056, "RightElbowEffector" + + ;Model::Character1_Ctrl_ChestOriginEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901471568,2376854953056, "ChestOriginEffector" + + ;Model::Character1_Ctrl_ChestEndEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901478528,2376854953056, "ChestEndEffector" + + ;Model::Character1_Ctrl_LeftFootEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901448368,2376854953056, "LeftFootEffector" + + ;Model::Character1_Ctrl_RightFootEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901497088,2376854953056, "RightFootEffector" + + ;Model::Character1_Ctrl_LeftShoulderEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901485488,2376854953056, "LeftShoulderEffector" + + ;Model::Character1_Ctrl_RightShoulderEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901492448,2376854953056, "RightShoulderEffector" + + ;Model::Character1_Ctrl_HeadEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901504048,2376854953056, "HeadEffector" + + ;Model::Character1_Ctrl_LeftHipEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901511008,2376854953056, "LeftHipEffector" + + ;Model::Character1_Ctrl_RightHipEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901480848,2376854953056, "RightHipEffector" + + ;Model::Character1_Ctrl_LeftHandThumbEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901494768,2376854953056, "LeftHandThumbEffector" + + ;Model::Character1_Ctrl_LeftHandIndexEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901508688,2376854953056, "LeftHandIndexEffector" + + ;Model::Character1_Ctrl_LeftHandMiddleEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901490128,2376854953056, "LeftHandMiddleEffector" + + ;Model::Character1_Ctrl_LeftHandRingEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901506368,2376854953056, "LeftHandRingEffector" + + ;Model::Character1_Ctrl_LeftHandPinkyEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901499408,2376854953056, "LeftHandPinkyEffector" + + ;Model::Character1_Ctrl_RightHandThumbEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901513328,2376854953056, "RightHandThumbEffector" + + ;Model::Character1_Ctrl_RightHandIndexEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901501728,2376854953056, "RightHandIndexEffector" + + ;Model::Character1_Ctrl_RightHandMiddleEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901483168,2376854953056, "RightHandMiddleEffector" + + ;Model::Character1_Ctrl_RightHandRingEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901515648,2376854953056, "RightHandRingEffector" + + ;Model::Character1_Ctrl_RightHandPinkyEffector, ControlSetPlug::Character1_ControlRig + C: "OP",2376901517968,2376854953056, "RightHandPinkyEffector" + + ;ControlSetPlug::Character1_ControlRig, Constraint::Character1 + C: "OO",2376854953056,2376880742448 + + ;ControlSetPlug::Character1_ControlRig, Constraint::Character1 + C: "OP",2376854953056,2376880742448, "SourceObject" + + ;ControlSetPlug::Character1_ControlRig, Constraint::Character1 + C: "OP",2376854953056,2376880742448, "ControlSet" + + ;Model::Character1_Hips, Constraint::Character1 + C: "OP",2376846973840,2376880742448, "HipsLink" + + ;Model::Character1_LeftUpLeg, Constraint::Character1 + C: "OP",2376846987760,2376880742448, "LeftUpLegLink" + + ;Model::Character1_LeftLeg, Constraint::Character1 + C: "OP",2376847006320,2376880742448, "LeftLegLink" + + ;Model::Character1_LeftFoot, Constraint::Character1 + C: "OP",2376846992400,2376880742448, "LeftFootLink" + + ;Model::Character1_LeftToeBase, Constraint::Character1 + C: "OP",2376846976160,2376880742448, "LeftToeBaseLink" + + ;Model::Character1_RightUpLeg, Constraint::Character1 + C: "OP",2376846994720,2376880742448, "RightUpLegLink" + + ;Model::Character1_RightLeg, Constraint::Character1 + C: "OP",2376846978480,2376880742448, "RightLegLink" + + ;Model::Character1_RightFoot, Constraint::Character1 + C: "OP",2376847017920,2376880742448, "RightFootLink" + + ;Model::Character1_RightToeBase, Constraint::Character1 + C: "OP",2376847015600,2376880742448, "RightToeBaseLink" + + ;Model::Character1_Spine, Constraint::Character1 + C: "OP",2376847013280,2376880742448, "SpineLink" + + ;Model::Character1_Spine1, Constraint::Character1 + C: "OP",2376847008640,2376880742448, "Spine1Link" + + ;Model::Character1_LeftShoulder, Constraint::Character1 + C: "OP",2376847020240,2376880742448, "LeftShoulderLink" + + ;Model::Character1_LeftArm, Constraint::Character1 + C: "OP",2376846999360,2376880742448, "LeftArmLink" + + ;Model::Character1_LeftForeArm, Constraint::Character1 + C: "OP",2376846997040,2376880742448, "LeftForeArmLink" + + ;Model::Character1_LeftHand, Constraint::Character1 + C: "OP",2376847029520,2376880742448, "LeftHandLink" + + ;Model::Character1_RightShoulder, Constraint::Character1 + C: "OP",2376539782704,2376880742448, "RightShoulderLink" + + ;Model::Character1_RightArm, Constraint::Character1 + C: "OP",2376539796624,2376880742448, "RightArmLink" + + ;Model::Character1_RightForeArm, Constraint::Character1 + C: "OP",2376539785024,2376880742448, "RightForeArmLink" + + ;Model::Character1_RightHand, Constraint::Character1 + C: "OP",2376539791984,2376880742448, "RightHandLink" + + ;Model::Character1_Neck, Constraint::Character1 + C: "OP",2376901464608,2376880742448, "NeckLink" + + ;Model::Character1_Head, Constraint::Character1 + C: "OP",2376901459968,2376880742448, "HeadLink" + + ;Model::Character1_Spine2, Constraint::Character1 + C: "OP",2376847010960,2376880742448, "Spine2Link" + + ;Model::Character1_LeftHandThumb1, Constraint::Character1 + C: "OP",2376847027200,2376880742448, "LeftHandThumb1Link" + + ;Model::Character1_LeftHandThumb2, Constraint::Character1 + C: "OP",2376847022560,2376880742448, "LeftHandThumb2Link" + + ;Model::Character1_LeftHandThumb3, Constraint::Character1 + C: "OP",2376847031840,2376880742448, "LeftHandThumb3Link" + + ;Model::Character1_LeftHandIndex1, Constraint::Character1 + C: "OP",2376847001680,2376880742448, "LeftHandIndex1Link" + + ;Model::Character1_LeftHandIndex2, Constraint::Character1 + C: "OP",2376847041120,2376880742448, "LeftHandIndex2Link" + + ;Model::Character1_LeftHandIndex3, Constraint::Character1 + C: "OP",2376847034160,2376880742448, "LeftHandIndex3Link" + + ;Model::Character1_LeftHandMiddle1, Constraint::Character1 + C: "OP",2376847036480,2376880742448, "LeftHandMiddle1Link" + + ;Model::Character1_LeftHandMiddle2, Constraint::Character1 + C: "OP",2376847038800,2376880742448, "LeftHandMiddle2Link" + + ;Model::Character1_LeftHandMiddle3, Constraint::Character1 + C: "OP",2376539752544,2376880742448, "LeftHandMiddle3Link" + + ;Model::Character1_LeftHandRing1, Constraint::Character1 + C: "OP",2376539754864,2376880742448, "LeftHandRing1Link" + + ;Model::Character1_LeftHandRing2, Constraint::Character1 + C: "OP",2376539759504,2376880742448, "LeftHandRing2Link" + + ;Model::Character1_LeftHandRing3, Constraint::Character1 + C: "OP",2376539738624,2376880742448, "LeftHandRing3Link" + + ;Model::Character1_LeftHandPinky1, Constraint::Character1 + C: "OP",2376539761824,2376880742448, "LeftHandPinky1Link" + + ;Model::Character1_LeftHandPinky2, Constraint::Character1 + C: "OP",2376539764144,2376880742448, "LeftHandPinky2Link" + + ;Model::Character1_LeftHandPinky3, Constraint::Character1 + C: "OP",2376539733984,2376880742448, "LeftHandPinky3Link" + + ;Model::Character1_RightHandThumb1, Constraint::Character1 + C: "OP",2376539787344,2376880742448, "RightHandThumb1Link" + + ;Model::Character1_RightHandThumb2, Constraint::Character1 + C: "OP",2376539789664,2376880742448, "RightHandThumb2Link" + + ;Model::Character1_RightHandThumb3, Constraint::Character1 + C: "OP",2376539794304,2376880742448, "RightHandThumb3Link" + + ;Model::Character1_RightHandIndex1, Constraint::Character1 + C: "OP",2376539768784,2376880742448, "RightHandIndex1Link" + + ;Model::Character1_RightHandIndex2, Constraint::Character1 + C: "OP",2376539801264,2376880742448, "RightHandIndex2Link" + + ;Model::Character1_RightHandIndex3, Constraint::Character1 + C: "OP",2376539771104,2376880742448, "RightHandIndex3Link" + + ;Model::Character1_RightHandMiddle1, Constraint::Character1 + C: "OP",2376539810544,2376880742448, "RightHandMiddle1Link" + + ;Model::Character1_RightHandMiddle2, Constraint::Character1 + C: "OP",2376539826784,2376880742448, "RightHandMiddle2Link" + + ;Model::Character1_RightHandMiddle3, Constraint::Character1 + C: "OP",2376539829104,2376880742448, "RightHandMiddle3Link" + + ;Model::Character1_RightHandRing1, Constraint::Character1 + C: "OP",2376539805904,2376880742448, "RightHandRing1Link" + + ;Model::Character1_RightHandRing2, Constraint::Character1 + C: "OP",2376539817504,2376880742448, "RightHandRing2Link" + + ;Model::Character1_RightHandRing3, Constraint::Character1 + C: "OP",2376539808224,2376880742448, "RightHandRing3Link" + + ;Model::Character1_RightHandPinky1, Constraint::Character1 + C: "OP",2376539812864,2376880742448, "RightHandPinky1Link" + + ;Model::Character1_RightHandPinky2, Constraint::Character1 + C: "OP",2376539819824,2376880742448, "RightHandPinky2Link" + + ;Model::Character1_RightHandPinky3, Constraint::Character1 + C: "OP",2376539822144,2376880742448, "RightHandPinky3Link" + + ;Model::Character1_Reference, Constraint::Character1 + C: "OP",2376846990080,2376880742448, "ReferenceLink" + + ;Model::Character1_LeftHandThumb4, Constraint::Character1 + C: "OP",2376847024880,2376880742448, "LeftHandThumb4Link" + + ;Model::Character1_LeftHandIndex4, Constraint::Character1 + C: "OP",2376847043440,2376880742448, "LeftHandIndex4Link" + + ;Model::Character1_LeftHandMiddle4, Constraint::Character1 + C: "OP",2376539750224,2376880742448, "LeftHandMiddle4Link" + + ;Model::Character1_LeftHandRing4, Constraint::Character1 + C: "OP",2376539729344,2376880742448, "LeftHandRing4Link" + + ;Model::Character1_LeftHandPinky4, Constraint::Character1 + C: "OP",2376539766464,2376880742448, "LeftHandPinky4Link" + + ;Model::Character1_RightHandThumb4, Constraint::Character1 + C: "OP",2376539798944,2376880742448, "RightHandThumb4Link" + + ;Model::Character1_RightHandIndex4, Constraint::Character1 + C: "OP",2376539824464,2376880742448, "RightHandIndex4Link" + + ;Model::Character1_RightHandMiddle4, Constraint::Character1 + C: "OP",2376539803584,2376880742448, "RightHandMiddle4Link" + + ;Model::Character1_RightHandRing4, Constraint::Character1 + C: "OP",2376539815184,2376880742448, "RightHandRing4Link" + + ;Model::Character1_RightHandPinky4, Constraint::Character1 + C: "OP",2376901453008,2376880742448, "RightHandPinky4Link" + + ;Model::Character1_Reference, Model::RootNode + C: "OO",2376846990080,0 + + ;Model::Character1_Ctrl_Reference, Model::RootNode + C: "OO",2376901457648,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2376790115088,2376895519472 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376889356240,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376889356656,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376889358528,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376889356864,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376889357072,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376889354784,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376906930272,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376906930896,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376902837504,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376902839584,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376853376272,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376895518016,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376806869360,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901320848,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901320640,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901323760,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901324176,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901325632,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901331456,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901325840,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901329584,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901330624,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901328128,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901319184,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901323968,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901322512,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901321056,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901320224,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901331248,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901319600,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901324800,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901321264,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901331664,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901326048,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901330832,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901330208,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901325216,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901320432,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901325008,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901321472,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901328336,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901332080,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901321680,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901329792,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901331872,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901329168,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901332288,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901319392,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901328752,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901321888,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901325424,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901319808,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901331040,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901320016,2376790115088 + + ;AnimCurveNode::pull, AnimLayer::BaseLayer + C: "OO",2376901322096,2376790115088 + + ;AnimCurveNode::stiffness, AnimLayer::BaseLayer + C: "OO",2376901322928,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901322304,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901326880,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376901322720,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901330000,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901323136,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376901330416,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901326256,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901327712,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376901326464,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901323344,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901323552,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376901326672,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901324384,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901324592,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376901327088,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901327296,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901329376,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376901327504,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901327920,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901328544,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376901328960,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901333536,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901334784,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376901333744,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901332496,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901332704,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376901332912,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901334160,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901333952,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376901334368,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901333328,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901334576,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376901334992,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376901335200,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376901333120,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915983280,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915978288,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915974128,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915975584,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915986192,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915983488,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915982448,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915973712,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915981616,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915986400,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915982032,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915978496,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915985152,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915975792,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915980160,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915974336,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915974544,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915985360,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915984320,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915976416,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915981824,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915983696,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915976000,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915978704,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915979536,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915978912,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915983904,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915979744,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915976832,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915984112,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915981408,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915979328,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915982240,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915974752,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915974960,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915976624,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915975168,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915977040,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915973296,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915984528,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915977248,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915975376,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915976208,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915973504,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915979952,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915977456,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915979120,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915977664,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915980368,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915982656,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915977872,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915980576,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915985568,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915978080,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915980784,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915980992,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915981200,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915982864,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915983072,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915985776,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915973920,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915984736,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915984944,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915985984,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915991600,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915990976,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915987440,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915987648,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915990560,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915989312,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915991808,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915990144,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915992224,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915989936,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915990352,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915987856,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915989520,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915986608,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915992432,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915988064,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915992016,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915990768,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915989728,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915991184,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915988688,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915988272,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915988896,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915988480,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915991392,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915986816,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915989104,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915987024,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915987232,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915966432,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915971424,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915969968,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915962896,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915966640,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915967888,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915971008,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915971632,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915962272,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915971840,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915965184,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915960400,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915971216,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915959984,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915969760,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915961024,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915963728,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915963520,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915960816,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915963936,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915965392,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915969344,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915972464,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915964352,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915965600,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915965808,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915962688,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915964560,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915964768,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915968096,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915961232,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915962480,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915964144,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915964976,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915968304,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915972880,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915972256,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915970176,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915966016,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915968512,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915966848,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915970384,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915961440,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915967056,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915966224,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915961856,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915963104,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915967264,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915967472,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915961648,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915967680,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915960192,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915968720,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915962064,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915968928,2376790115088 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2376915969136,2376790115088 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2376915969552,2376790115088 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2376915970592,2376790115088 + + ;NodeAttribute::, Model::Character1_Reference + C: "OO",2376877451168,2376846990080 + + ;Model::Character1_Hips, Model::Character1_Reference + C: "OO",2376846973840,2376846990080 + + ;NodeAttribute::, Model::Character1_Hips + C: "OO",2376782199344,2376846973840 + + ;Model::Character1_LeftUpLeg, Model::Character1_Hips + C: "OO",2376846987760,2376846973840 + + ;Model::Character1_RightUpLeg, Model::Character1_Hips + C: "OO",2376846994720,2376846973840 + + ;Model::Character1_Spine, Model::Character1_Hips + C: "OO",2376847013280,2376846973840 + + ;AnimCurveNode::T, Model::Character1_Hips + C: "OP",2376901322304,2376846973840, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_Hips + C: "OP",2376901322720,2376846973840, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_Hips + C: "OP",2376901326880,2376846973840, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftUpLeg + C: "OO",2376782197232,2376846987760 + + ;Model::Character1_LeftLeg, Model::Character1_LeftUpLeg + C: "OO",2376847006320,2376846987760 + + ;AnimCurveNode::T, Model::Character1_LeftUpLeg + C: "OP",2376901330000,2376846987760, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftUpLeg + C: "OP",2376901330416,2376846987760, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftUpLeg + C: "OP",2376901323136,2376846987760, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftLeg + C: "OO",2376782200112,2376847006320 + + ;Model::Character1_LeftFoot, Model::Character1_LeftLeg + C: "OO",2376846992400,2376847006320 + + ;AnimCurveNode::T, Model::Character1_LeftLeg + C: "OP",2376901326256,2376847006320, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftLeg + C: "OP",2376901326464,2376847006320, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftLeg + C: "OP",2376901327712,2376847006320, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftFoot + C: "OO",2376782198000,2376846992400 + + ;Model::Character1_LeftToeBase, Model::Character1_LeftFoot + C: "OO",2376846976160,2376846992400 + + ;AnimCurveNode::T, Model::Character1_LeftFoot + C: "OP",2376901323344,2376846992400, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftFoot + C: "OP",2376901326672,2376846992400, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftFoot + C: "OP",2376901323552,2376846992400, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftToeBase + C: "OO",2376782199152,2376846976160 + + ;AnimCurveNode::T, Model::Character1_LeftToeBase + C: "OP",2376901324384,2376846976160, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftToeBase + C: "OP",2376901327088,2376846976160, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftToeBase + C: "OP",2376901324592,2376846976160, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightUpLeg + C: "OO",2376782199536,2376846994720 + + ;Model::Character1_RightLeg, Model::Character1_RightUpLeg + C: "OO",2376846978480,2376846994720 + + ;AnimCurveNode::T, Model::Character1_RightUpLeg + C: "OP",2376901327296,2376846994720, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightUpLeg + C: "OP",2376901327504,2376846994720, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightUpLeg + C: "OP",2376901329376,2376846994720, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightLeg + C: "OO",2376879668048,2376846978480 + + ;Model::Character1_RightFoot, Model::Character1_RightLeg + C: "OO",2376847017920,2376846978480 + + ;AnimCurveNode::T, Model::Character1_RightLeg + C: "OP",2376901327920,2376846978480, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightLeg + C: "OP",2376901328960,2376846978480, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightLeg + C: "OP",2376901328544,2376846978480, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightFoot + C: "OO",2376879668240,2376847017920 + + ;Model::Character1_RightToeBase, Model::Character1_RightFoot + C: "OO",2376847015600,2376847017920 + + ;AnimCurveNode::T, Model::Character1_RightFoot + C: "OP",2376901333536,2376847017920, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightFoot + C: "OP",2376901333744,2376847017920, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightFoot + C: "OP",2376901334784,2376847017920, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightToeBase + C: "OO",2376879666128,2376847015600 + + ;AnimCurveNode::T, Model::Character1_RightToeBase + C: "OP",2376901332496,2376847015600, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightToeBase + C: "OP",2376901332912,2376847015600, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightToeBase + C: "OP",2376901332704,2376847015600, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_Spine + C: "OO",2376879665744,2376847013280 + + ;Model::Character1_Spine1, Model::Character1_Spine + C: "OO",2376847008640,2376847013280 + + ;AnimCurveNode::T, Model::Character1_Spine + C: "OP",2376901334160,2376847013280, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_Spine + C: "OP",2376901334368,2376847013280, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_Spine + C: "OP",2376901333952,2376847013280, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_Spine1 + C: "OO",2376879666320,2376847008640 + + ;Model::Character1_Spine2, Model::Character1_Spine1 + C: "OO",2376847010960,2376847008640 + + ;AnimCurveNode::T, Model::Character1_Spine1 + C: "OP",2376901333328,2376847008640, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_Spine1 + C: "OP",2376901334992,2376847008640, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_Spine1 + C: "OP",2376901334576,2376847008640, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_Spine2 + C: "OO",2376879666512,2376847010960 + + ;Model::Character1_LeftShoulder, Model::Character1_Spine2 + C: "OO",2376847020240,2376847010960 + + ;Model::Character1_RightShoulder, Model::Character1_Spine2 + C: "OO",2376539782704,2376847010960 + + ;Model::Character1_Neck, Model::Character1_Spine2 + C: "OO",2376901464608,2376847010960 + + ;AnimCurveNode::T, Model::Character1_Spine2 + C: "OP",2376901335200,2376847010960, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_Spine2 + C: "OP",2376915983280,2376847010960, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_Spine2 + C: "OP",2376901333120,2376847010960, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftShoulder + C: "OO",2376879665936,2376847020240 + + ;Model::Character1_LeftArm, Model::Character1_LeftShoulder + C: "OO",2376846999360,2376847020240 + + ;AnimCurveNode::T, Model::Character1_LeftShoulder + C: "OP",2376915978288,2376847020240, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftShoulder + C: "OP",2376915975584,2376847020240, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftShoulder + C: "OP",2376915974128,2376847020240, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftArm + C: "OO",2376879666896,2376846999360 + + ;Model::Character1_LeftForeArm, Model::Character1_LeftArm + C: "OO",2376846997040,2376846999360 + + ;AnimCurveNode::T, Model::Character1_LeftArm + C: "OP",2376915986192,2376846999360, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftArm + C: "OP",2376915982448,2376846999360, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftArm + C: "OP",2376915983488,2376846999360, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftForeArm + C: "OO",2376879667088,2376846997040 + + ;Model::Character1_LeftHand, Model::Character1_LeftForeArm + C: "OO",2376847029520,2376846997040 + + ;AnimCurveNode::T, Model::Character1_LeftForeArm + C: "OP",2376915973712,2376846997040, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftForeArm + C: "OP",2376915986400,2376846997040, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftForeArm + C: "OP",2376915981616,2376846997040, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHand + C: "OO",2376879665552,2376847029520 + + ;Model::Character1_LeftHandThumb1, Model::Character1_LeftHand + C: "OO",2376847027200,2376847029520 + + ;Model::Character1_LeftHandIndex1, Model::Character1_LeftHand + C: "OO",2376847001680,2376847029520 + + ;Model::Character1_LeftHandMiddle1, Model::Character1_LeftHand + C: "OO",2376847036480,2376847029520 + + ;Model::Character1_LeftHandRing1, Model::Character1_LeftHand + C: "OO",2376539754864,2376847029520 + + ;Model::Character1_LeftHandPinky1, Model::Character1_LeftHand + C: "OO",2376539761824,2376847029520 + + ;AnimCurveNode::T, Model::Character1_LeftHand + C: "OP",2376915982032,2376847029520, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHand + C: "OP",2376915985152,2376847029520, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHand + C: "OP",2376915978496,2376847029520, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandThumb1 + C: "OO",2376879668432,2376847027200 + + ;Model::Character1_LeftHandThumb2, Model::Character1_LeftHandThumb1 + C: "OO",2376847022560,2376847027200 + + ;AnimCurveNode::T, Model::Character1_LeftHandThumb1 + C: "OP",2376915975792,2376847027200, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandThumb1 + C: "OP",2376915974336,2376847027200, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandThumb1 + C: "OP",2376915980160,2376847027200, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandThumb2 + C: "OO",2376879667280,2376847022560 + + ;Model::Character1_LeftHandThumb3, Model::Character1_LeftHandThumb2 + C: "OO",2376847031840,2376847022560 + + ;AnimCurveNode::T, Model::Character1_LeftHandThumb2 + C: "OP",2376915974544,2376847022560, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandThumb2 + C: "OP",2376915984320,2376847022560, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandThumb2 + C: "OP",2376915985360,2376847022560, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandThumb3 + C: "OO",2376879667472,2376847031840 + + ;Model::Character1_LeftHandThumb4, Model::Character1_LeftHandThumb3 + C: "OO",2376847024880,2376847031840 + + ;AnimCurveNode::T, Model::Character1_LeftHandThumb3 + C: "OP",2376915976416,2376847031840, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandThumb3 + C: "OP",2376915983696,2376847031840, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandThumb3 + C: "OP",2376915981824,2376847031840, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandThumb4 + C: "OO",2376879667664,2376847024880 + + ;AnimCurveNode::T, Model::Character1_LeftHandThumb4 + C: "OP",2376915976000,2376847024880, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandThumb4 + C: "OP",2376915979536,2376847024880, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandThumb4 + C: "OP",2376915978704,2376847024880, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandIndex1 + C: "OO",2376879667856,2376847001680 + + ;Model::Character1_LeftHandIndex2, Model::Character1_LeftHandIndex1 + C: "OO",2376847041120,2376847001680 + + ;AnimCurveNode::T, Model::Character1_LeftHandIndex1 + C: "OP",2376915978912,2376847001680, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandIndex1 + C: "OP",2376915979744,2376847001680, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandIndex1 + C: "OP",2376915983904,2376847001680, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandIndex2 + C: "OO",2376879668624,2376847041120 + + ;Model::Character1_LeftHandIndex3, Model::Character1_LeftHandIndex2 + C: "OO",2376847034160,2376847041120 + + ;AnimCurveNode::T, Model::Character1_LeftHandIndex2 + C: "OP",2376915976832,2376847041120, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandIndex2 + C: "OP",2376915981408,2376847041120, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandIndex2 + C: "OP",2376915984112,2376847041120, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandIndex3 + C: "OO",2376879668816,2376847034160 + + ;Model::Character1_LeftHandIndex4, Model::Character1_LeftHandIndex3 + C: "OO",2376847043440,2376847034160 + + ;AnimCurveNode::T, Model::Character1_LeftHandIndex3 + C: "OP",2376915979328,2376847034160, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandIndex3 + C: "OP",2376915974752,2376847034160, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandIndex3 + C: "OP",2376915982240,2376847034160, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandIndex4 + C: "OO",2376879669008,2376847043440 + + ;AnimCurveNode::T, Model::Character1_LeftHandIndex4 + C: "OP",2376915974960,2376847043440, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandIndex4 + C: "OP",2376915975168,2376847043440, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandIndex4 + C: "OP",2376915976624,2376847043440, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandMiddle1 + C: "OO",2376879669200,2376847036480 + + ;Model::Character1_LeftHandMiddle2, Model::Character1_LeftHandMiddle1 + C: "OO",2376847038800,2376847036480 + + ;AnimCurveNode::T, Model::Character1_LeftHandMiddle1 + C: "OP",2376915977040,2376847036480, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandMiddle1 + C: "OP",2376915984528,2376847036480, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandMiddle1 + C: "OP",2376915973296,2376847036480, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandMiddle2 + C: "OO",2376782199920,2376847038800 + + ;Model::Character1_LeftHandMiddle3, Model::Character1_LeftHandMiddle2 + C: "OO",2376539752544,2376847038800 + + ;AnimCurveNode::T, Model::Character1_LeftHandMiddle2 + C: "OP",2376915977248,2376847038800, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandMiddle2 + C: "OP",2376915976208,2376847038800, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandMiddle2 + C: "OP",2376915975376,2376847038800, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandMiddle3 + C: "OO",2376889405552,2376539752544 + + ;Model::Character1_LeftHandMiddle4, Model::Character1_LeftHandMiddle3 + C: "OO",2376539750224,2376539752544 + + ;AnimCurveNode::T, Model::Character1_LeftHandMiddle3 + C: "OP",2376915973504,2376539752544, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandMiddle3 + C: "OP",2376915977456,2376539752544, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandMiddle3 + C: "OP",2376915979952,2376539752544, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandMiddle4 + C: "OO",2376889405168,2376539750224 + + ;AnimCurveNode::T, Model::Character1_LeftHandMiddle4 + C: "OP",2376915979120,2376539750224, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandMiddle4 + C: "OP",2376915980368,2376539750224, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandMiddle4 + C: "OP",2376915977664,2376539750224, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandRing1 + C: "OO",2376889402672,2376539754864 + + ;Model::Character1_LeftHandRing2, Model::Character1_LeftHandRing1 + C: "OO",2376539759504,2376539754864 + + ;AnimCurveNode::T, Model::Character1_LeftHandRing1 + C: "OP",2376915982656,2376539754864, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandRing1 + C: "OP",2376915980576,2376539754864, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandRing1 + C: "OP",2376915977872,2376539754864, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandRing2 + C: "OO",2376889402864,2376539759504 + + ;Model::Character1_LeftHandRing3, Model::Character1_LeftHandRing2 + C: "OO",2376539738624,2376539759504 + + ;AnimCurveNode::T, Model::Character1_LeftHandRing2 + C: "OP",2376915985568,2376539759504, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandRing2 + C: "OP",2376915980784,2376539759504, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandRing2 + C: "OP",2376915978080,2376539759504, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandRing3 + C: "OO",2376889405360,2376539738624 + + ;Model::Character1_LeftHandRing4, Model::Character1_LeftHandRing3 + C: "OO",2376539729344,2376539738624 + + ;AnimCurveNode::T, Model::Character1_LeftHandRing3 + C: "OP",2376915980992,2376539738624, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandRing3 + C: "OP",2376915982864,2376539738624, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandRing3 + C: "OP",2376915981200,2376539738624, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandRing4 + C: "OO",2376889402480,2376539729344 + + ;AnimCurveNode::T, Model::Character1_LeftHandRing4 + C: "OP",2376915983072,2376539729344, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandRing4 + C: "OP",2376915973920,2376539729344, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandRing4 + C: "OP",2376915985776,2376539729344, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandPinky1 + C: "OO",2376889404400,2376539761824 + + ;Model::Character1_LeftHandPinky2, Model::Character1_LeftHandPinky1 + C: "OO",2376539764144,2376539761824 + + ;AnimCurveNode::T, Model::Character1_LeftHandPinky1 + C: "OP",2376915984736,2376539761824, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandPinky1 + C: "OP",2376915985984,2376539761824, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandPinky1 + C: "OP",2376915984944,2376539761824, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandPinky2 + C: "OO",2376889405936,2376539764144 + + ;Model::Character1_LeftHandPinky3, Model::Character1_LeftHandPinky2 + C: "OO",2376539733984,2376539764144 + + ;AnimCurveNode::T, Model::Character1_LeftHandPinky2 + C: "OP",2376915991600,2376539764144, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandPinky2 + C: "OP",2376915987440,2376539764144, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandPinky2 + C: "OP",2376915990976,2376539764144, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandPinky3 + C: "OO",2376889404592,2376539733984 + + ;Model::Character1_LeftHandPinky4, Model::Character1_LeftHandPinky3 + C: "OO",2376539766464,2376539733984 + + ;AnimCurveNode::T, Model::Character1_LeftHandPinky3 + C: "OP",2376915987648,2376539733984, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandPinky3 + C: "OP",2376915989312,2376539733984, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandPinky3 + C: "OP",2376915990560,2376539733984, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_LeftHandPinky4 + C: "OO",2376889403056,2376539766464 + + ;AnimCurveNode::T, Model::Character1_LeftHandPinky4 + C: "OP",2376915991808,2376539766464, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_LeftHandPinky4 + C: "OP",2376915992224,2376539766464, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_LeftHandPinky4 + C: "OP",2376915990144,2376539766464, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightShoulder + C: "OO",2376889404784,2376539782704 + + ;Model::Character1_RightArm, Model::Character1_RightShoulder + C: "OO",2376539796624,2376539782704 + + ;AnimCurveNode::T, Model::Character1_RightShoulder + C: "OP",2376915989936,2376539782704, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightShoulder + C: "OP",2376915987856,2376539782704, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightShoulder + C: "OP",2376915990352,2376539782704, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightArm + C: "OO",2376889404016,2376539796624 + + ;Model::Character1_RightForeArm, Model::Character1_RightArm + C: "OO",2376539785024,2376539796624 + + ;AnimCurveNode::T, Model::Character1_RightArm + C: "OP",2376915989520,2376539796624, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightArm + C: "OP",2376915992432,2376539796624, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightArm + C: "OP",2376915986608,2376539796624, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightForeArm + C: "OO",2376889405744,2376539785024 + + ;Model::Character1_RightHand, Model::Character1_RightForeArm + C: "OO",2376539791984,2376539785024 + + ;AnimCurveNode::T, Model::Character1_RightForeArm + C: "OP",2376915988064,2376539785024, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightForeArm + C: "OP",2376915990768,2376539785024, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightForeArm + C: "OP",2376915992016,2376539785024, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHand + C: "OO",2376889404976,2376539791984 + + ;Model::Character1_RightHandThumb1, Model::Character1_RightHand + C: "OO",2376539787344,2376539791984 + + ;Model::Character1_RightHandIndex1, Model::Character1_RightHand + C: "OO",2376539768784,2376539791984 + + ;Model::Character1_RightHandMiddle1, Model::Character1_RightHand + C: "OO",2376539810544,2376539791984 + + ;Model::Character1_RightHandRing1, Model::Character1_RightHand + C: "OO",2376539805904,2376539791984 + + ;Model::Character1_RightHandPinky1, Model::Character1_RightHand + C: "OO",2376539812864,2376539791984 + + ;AnimCurveNode::T, Model::Character1_RightHand + C: "OP",2376915989728,2376539791984, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHand + C: "OP",2376915988688,2376539791984, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHand + C: "OP",2376915991184,2376539791984, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandThumb1 + C: "OO",2376889403632,2376539787344 + + ;Model::Character1_RightHandThumb2, Model::Character1_RightHandThumb1 + C: "OO",2376539789664,2376539787344 + + ;AnimCurveNode::T, Model::Character1_RightHandThumb1 + C: "OP",2376915988272,2376539787344, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandThumb1 + C: "OP",2376915988480,2376539787344, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandThumb1 + C: "OP",2376915988896,2376539787344, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandThumb2 + C: "OO",2376889406128,2376539789664 + + ;Model::Character1_RightHandThumb3, Model::Character1_RightHandThumb2 + C: "OO",2376539794304,2376539789664 + + ;AnimCurveNode::T, Model::Character1_RightHandThumb2 + C: "OP",2376915991392,2376539789664, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandThumb2 + C: "OP",2376915989104,2376539789664, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandThumb2 + C: "OP",2376915986816,2376539789664, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandThumb3 + C: "OO",2376889403248,2376539794304 + + ;Model::Character1_RightHandThumb4, Model::Character1_RightHandThumb3 + C: "OO",2376539798944,2376539794304 + + ;AnimCurveNode::T, Model::Character1_RightHandThumb3 + C: "OP",2376915987024,2376539794304, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandThumb3 + C: "OP",2376915966432,2376539794304, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandThumb3 + C: "OP",2376915987232,2376539794304, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandThumb4 + C: "OO",2376889403440,2376539798944 + + ;AnimCurveNode::T, Model::Character1_RightHandThumb4 + C: "OP",2376915971424,2376539798944, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandThumb4 + C: "OP",2376915962896,2376539798944, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandThumb4 + C: "OP",2376915969968,2376539798944, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandIndex1 + C: "OO",2376889404208,2376539768784 + + ;Model::Character1_RightHandIndex2, Model::Character1_RightHandIndex1 + C: "OO",2376539801264,2376539768784 + + ;AnimCurveNode::T, Model::Character1_RightHandIndex1 + C: "OP",2376915966640,2376539768784, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandIndex1 + C: "OP",2376915971008,2376539768784, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandIndex1 + C: "OP",2376915967888,2376539768784, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandIndex2 + C: "OO",2376884800384,2376539801264 + + ;Model::Character1_RightHandIndex3, Model::Character1_RightHandIndex2 + C: "OO",2376539771104,2376539801264 + + ;AnimCurveNode::T, Model::Character1_RightHandIndex2 + C: "OP",2376915971632,2376539801264, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandIndex2 + C: "OP",2376915971840,2376539801264, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandIndex2 + C: "OP",2376915962272,2376539801264, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandIndex3 + C: "OO",2376884799040,2376539771104 + + ;Model::Character1_RightHandIndex4, Model::Character1_RightHandIndex3 + C: "OO",2376539824464,2376539771104 + + ;AnimCurveNode::T, Model::Character1_RightHandIndex3 + C: "OP",2376915965184,2376539771104, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandIndex3 + C: "OP",2376915971216,2376539771104, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandIndex3 + C: "OP",2376915960400,2376539771104, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandIndex4 + C: "OO",2376884798656,2376539824464 + + ;AnimCurveNode::T, Model::Character1_RightHandIndex4 + C: "OP",2376915959984,2376539824464, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandIndex4 + C: "OP",2376915961024,2376539824464, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandIndex4 + C: "OP",2376915969760,2376539824464, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandMiddle1 + C: "OO",2376884798848,2376539810544 + + ;Model::Character1_RightHandMiddle2, Model::Character1_RightHandMiddle1 + C: "OO",2376539826784,2376539810544 + + ;AnimCurveNode::T, Model::Character1_RightHandMiddle1 + C: "OP",2376915963728,2376539810544, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandMiddle1 + C: "OP",2376915960816,2376539810544, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandMiddle1 + C: "OP",2376915963520,2376539810544, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandMiddle2 + C: "OO",2376884800192,2376539826784 + + ;Model::Character1_RightHandMiddle3, Model::Character1_RightHandMiddle2 + C: "OO",2376539829104,2376539826784 + + ;AnimCurveNode::T, Model::Character1_RightHandMiddle2 + C: "OP",2376915963936,2376539826784, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandMiddle2 + C: "OP",2376915969344,2376539826784, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandMiddle2 + C: "OP",2376915965392,2376539826784, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandMiddle3 + C: "OO",2376884799232,2376539829104 + + ;Model::Character1_RightHandMiddle4, Model::Character1_RightHandMiddle3 + C: "OO",2376539803584,2376539829104 + + ;AnimCurveNode::T, Model::Character1_RightHandMiddle3 + C: "OP",2376915972464,2376539829104, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandMiddle3 + C: "OP",2376915965600,2376539829104, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandMiddle3 + C: "OP",2376915964352,2376539829104, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandMiddle4 + C: "OO",2376884799424,2376539803584 + + ;AnimCurveNode::T, Model::Character1_RightHandMiddle4 + C: "OP",2376915965808,2376539803584, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandMiddle4 + C: "OP",2376915964560,2376539803584, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandMiddle4 + C: "OP",2376915962688,2376539803584, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandRing1 + C: "OO",2376884800000,2376539805904 + + ;Model::Character1_RightHandRing2, Model::Character1_RightHandRing1 + C: "OO",2376539817504,2376539805904 + + ;AnimCurveNode::T, Model::Character1_RightHandRing1 + C: "OP",2376915964768,2376539805904, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandRing1 + C: "OP",2376915961232,2376539805904, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandRing1 + C: "OP",2376915968096,2376539805904, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandRing2 + C: "OO",2376884799616,2376539817504 + + ;Model::Character1_RightHandRing3, Model::Character1_RightHandRing2 + C: "OO",2376539808224,2376539817504 + + ;AnimCurveNode::T, Model::Character1_RightHandRing2 + C: "OP",2376915962480,2376539817504, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandRing2 + C: "OP",2376915964976,2376539817504, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandRing2 + C: "OP",2376915964144,2376539817504, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandRing3 + C: "OO",2376884799808,2376539808224 + + ;Model::Character1_RightHandRing4, Model::Character1_RightHandRing3 + C: "OO",2376539815184,2376539808224 + + ;AnimCurveNode::T, Model::Character1_RightHandRing3 + C: "OP",2376915968304,2376539808224, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandRing3 + C: "OP",2376915972256,2376539808224, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandRing3 + C: "OP",2376915972880,2376539808224, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandRing4 + C: "OO",2376846331072,2376539815184 + + ;AnimCurveNode::T, Model::Character1_RightHandRing4 + C: "OP",2376915970176,2376539815184, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandRing4 + C: "OP",2376915968512,2376539815184, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandRing4 + C: "OP",2376915966016,2376539815184, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandPinky1 + C: "OO",2376846332416,2376539812864 + + ;Model::Character1_RightHandPinky2, Model::Character1_RightHandPinky1 + C: "OO",2376539819824,2376539812864 + + ;AnimCurveNode::T, Model::Character1_RightHandPinky1 + C: "OP",2376915966848,2376539812864, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandPinky1 + C: "OP",2376915961440,2376539812864, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandPinky1 + C: "OP",2376915970384,2376539812864, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandPinky2 + C: "OO",2376846331840,2376539819824 + + ;Model::Character1_RightHandPinky3, Model::Character1_RightHandPinky2 + C: "OO",2376539822144,2376539819824 + + ;AnimCurveNode::T, Model::Character1_RightHandPinky2 + C: "OP",2376915967056,2376539819824, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandPinky2 + C: "OP",2376915961856,2376539819824, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandPinky2 + C: "OP",2376915966224,2376539819824, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandPinky3 + C: "OO",2376846331648,2376539822144 + + ;Model::Character1_RightHandPinky4, Model::Character1_RightHandPinky3 + C: "OO",2376901453008,2376539822144 + + ;AnimCurveNode::T, Model::Character1_RightHandPinky3 + C: "OP",2376915963104,2376539822144, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandPinky3 + C: "OP",2376915967472,2376539822144, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandPinky3 + C: "OP",2376915967264,2376539822144, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_RightHandPinky4 + C: "OO",2376846332800,2376901453008 + + ;AnimCurveNode::T, Model::Character1_RightHandPinky4 + C: "OP",2376915961648,2376901453008, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_RightHandPinky4 + C: "OP",2376915960192,2376901453008, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_RightHandPinky4 + C: "OP",2376915967680,2376901453008, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_Neck + C: "OO",2376846332608,2376901464608 + + ;Model::Character1_Head, Model::Character1_Neck + C: "OO",2376901459968,2376901464608 + + ;AnimCurveNode::T, Model::Character1_Neck + C: "OP",2376915968720,2376901464608, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_Neck + C: "OP",2376915968928,2376901464608, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_Neck + C: "OP",2376915962064,2376901464608, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_Head + C: "OO",2376846331264,2376901459968 + + ;AnimCurveNode::T, Model::Character1_Head + C: "OP",2376915969136,2376901459968, "Lcl Translation" + + ;AnimCurveNode::R, Model::Character1_Head + C: "OP",2376915970592,2376901459968, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Character1_Head + C: "OP",2376915969552,2376901459968, "Lcl Scaling" + + ;NodeAttribute::, Model::Character1_Ctrl_Reference + C: "OO",2376877451520,2376901457648 + + ;Model::Character1_Ctrl_HipsEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901450688,2376901457648 + + ;Model::Character1_Ctrl_LeftAnkleEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901473888,2376901457648 + + ;Model::Character1_Ctrl_RightAnkleEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901455328,2376901457648 + + ;Model::Character1_Ctrl_LeftWristEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901446048,2376901457648 + + ;Model::Character1_Ctrl_RightWristEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901443728,2376901457648 + + ;Model::Character1_Ctrl_LeftKneeEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901462288,2376901457648 + + ;Model::Character1_Ctrl_RightKneeEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901466928,2376901457648 + + ;Model::Character1_Ctrl_LeftElbowEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901476208,2376901457648 + + ;Model::Character1_Ctrl_RightElbowEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901469248,2376901457648 + + ;Model::Character1_Ctrl_ChestOriginEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901471568,2376901457648 + + ;Model::Character1_Ctrl_ChestEndEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901478528,2376901457648 + + ;Model::Character1_Ctrl_LeftFootEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901448368,2376901457648 + + ;Model::Character1_Ctrl_RightFootEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901497088,2376901457648 + + ;Model::Character1_Ctrl_LeftShoulderEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901485488,2376901457648 + + ;Model::Character1_Ctrl_RightShoulderEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901492448,2376901457648 + + ;Model::Character1_Ctrl_HeadEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901504048,2376901457648 + + ;Model::Character1_Ctrl_LeftHipEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901511008,2376901457648 + + ;Model::Character1_Ctrl_RightHipEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901480848,2376901457648 + + ;Model::Character1_Ctrl_LeftHandThumbEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901494768,2376901457648 + + ;Model::Character1_Ctrl_LeftHandIndexEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901508688,2376901457648 + + ;Model::Character1_Ctrl_LeftHandMiddleEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901490128,2376901457648 + + ;Model::Character1_Ctrl_LeftHandRingEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901506368,2376901457648 + + ;Model::Character1_Ctrl_LeftHandPinkyEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901499408,2376901457648 + + ;Model::Character1_Ctrl_RightHandThumbEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901513328,2376901457648 + + ;Model::Character1_Ctrl_RightHandIndexEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901501728,2376901457648 + + ;Model::Character1_Ctrl_RightHandMiddleEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901483168,2376901457648 + + ;Model::Character1_Ctrl_RightHandRingEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901515648,2376901457648 + + ;Model::Character1_Ctrl_RightHandPinkyEffector, Model::Character1_Ctrl_Reference + C: "OO",2376901517968,2376901457648 + + ;Model::Character1_Ctrl_Hips, Model::Character1_Ctrl_Reference + C: "OO",2376901487808,2376901457648 + + ;NodeAttribute::, Model::Character1_Ctrl_HipsEffector + C: "OO",2376903011968,2376901450688 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_HipsEffector + C: "OP",2376889356240,2376901450688, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_HipsEffector + C: "OP",2376889356656,2376901450688, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftAnkleEffector + C: "OO",2376903015568,2376901473888 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftAnkleEffector + C: "OP",2376889358528,2376901473888, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftAnkleEffector + C: "OP",2376889356864,2376901473888, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightAnkleEffector + C: "OO",2376903007648,2376901455328 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightAnkleEffector + C: "OP",2376889357072,2376901455328, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightAnkleEffector + C: "OP",2376889354784,2376901455328, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftWristEffector + C: "OO",2376903008368,2376901446048 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftWristEffector + C: "OP",2376906930272,2376901446048, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftWristEffector + C: "OP",2376906930896,2376901446048, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightWristEffector + C: "OO",2376903022288,2376901443728 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightWristEffector + C: "OP",2376902837504,2376901443728, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightWristEffector + C: "OP",2376902839584,2376901443728, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftKneeEffector + C: "OO",2376903017488,2376901462288 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftKneeEffector + C: "OP",2376853376272,2376901462288, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftKneeEffector + C: "OP",2376895518016,2376901462288, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightKneeEffector + C: "OO",2376903014368,2376901466928 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightKneeEffector + C: "OP",2376806869360,2376901466928, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightKneeEffector + C: "OP",2376901320848,2376901466928, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftElbowEffector + C: "OO",2376903015088,2376901476208 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftElbowEffector + C: "OP",2376901320640,2376901476208, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftElbowEffector + C: "OP",2376901323760,2376901476208, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightElbowEffector + C: "OO",2376903010288,2376901469248 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightElbowEffector + C: "OP",2376901324176,2376901469248, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightElbowEffector + C: "OP",2376901325632,2376901469248, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_ChestOriginEffector + C: "OO",2376903013168,2376901471568 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_ChestOriginEffector + C: "OP",2376901331456,2376901471568, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_ChestOriginEffector + C: "OP",2376901325840,2376901471568, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_ChestEndEffector + C: "OO",2376903015328,2376901478528 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_ChestEndEffector + C: "OP",2376901329584,2376901478528, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_ChestEndEffector + C: "OP",2376901330624,2376901478528, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftFootEffector + C: "OO",2376903015808,2376901448368 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftFootEffector + C: "OP",2376901328128,2376901448368, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftFootEffector + C: "OP",2376901319184,2376901448368, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightFootEffector + C: "OO",2376903018928,2376901497088 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightFootEffector + C: "OP",2376901323968,2376901497088, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightFootEffector + C: "OP",2376901322512,2376901497088, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftShoulderEffector + C: "OO",2376903021328,2376901485488 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftShoulderEffector + C: "OP",2376901321056,2376901485488, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftShoulderEffector + C: "OP",2376901320224,2376901485488, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightShoulderEffector + C: "OO",2376903016288,2376901492448 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightShoulderEffector + C: "OP",2376901331248,2376901492448, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightShoulderEffector + C: "OP",2376901319600,2376901492448, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_HeadEffector + C: "OO",2376903013888,2376901504048 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_HeadEffector + C: "OP",2376901324800,2376901504048, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_HeadEffector + C: "OP",2376901321264,2376901504048, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHipEffector + C: "OO",2376903017728,2376901511008 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftHipEffector + C: "OP",2376901331664,2376901511008, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftHipEffector + C: "OP",2376901326048,2376901511008, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightHipEffector + C: "OO",2376903013408,2376901480848 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightHipEffector + C: "OP",2376901330832,2376901480848, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightHipEffector + C: "OP",2376901330208,2376901480848, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandThumbEffector + C: "OO",2376903008608,2376901494768 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftHandThumbEffector + C: "OP",2376901325216,2376901494768, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftHandThumbEffector + C: "OP",2376901320432,2376901494768, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandIndexEffector + C: "OO",2376903009808,2376901508688 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftHandIndexEffector + C: "OP",2376901325008,2376901508688, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftHandIndexEffector + C: "OP",2376901321472,2376901508688, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandMiddleEffector + C: "OO",2376903007888,2376901490128 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftHandMiddleEffector + C: "OP",2376901328336,2376901490128, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftHandMiddleEffector + C: "OP",2376901332080,2376901490128, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandRingEffector + C: "OO",2376903022528,2376901506368 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftHandRingEffector + C: "OP",2376901321680,2376901506368, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftHandRingEffector + C: "OP",2376901329792,2376901506368, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandPinkyEffector + C: "OO",2376903019888,2376901499408 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_LeftHandPinkyEffector + C: "OP",2376901331872,2376901499408, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_LeftHandPinkyEffector + C: "OP",2376901329168,2376901499408, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandThumbEffector + C: "OO",2376903012208,2376901513328 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightHandThumbEffector + C: "OP",2376901332288,2376901513328, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightHandThumbEffector + C: "OP",2376901319392,2376901513328, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandIndexEffector + C: "OO",2376903016528,2376901501728 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightHandIndexEffector + C: "OP",2376901328752,2376901501728, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightHandIndexEffector + C: "OP",2376901321888,2376901501728, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandMiddleEffector + C: "OO",2376903007408,2376901483168 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightHandMiddleEffector + C: "OP",2376901325424,2376901483168, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightHandMiddleEffector + C: "OP",2376901319808,2376901483168, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandRingEffector + C: "OO",2376903008848,2376901515648 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightHandRingEffector + C: "OP",2376901331040,2376901515648, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightHandRingEffector + C: "OP",2376901320016,2376901515648, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandPinkyEffector + C: "OO",2376903020128,2376901517968 + + ;AnimCurveNode::pull, Model::Character1_Ctrl_RightHandPinkyEffector + C: "OP",2376901322096,2376901517968, "pull" + + ;AnimCurveNode::stiffness, Model::Character1_Ctrl_RightHandPinkyEffector + C: "OP",2376901322928,2376901517968, "stiffness" + + ;NodeAttribute::, Model::Character1_Ctrl_Hips + C: "OO",2376903017968,2376901487808 + + ;Model::Character1_Ctrl_LeftUpLeg, Model::Character1_Ctrl_Hips + C: "OO",2376901536528,2376901487808 + + ;Model::Character1_Ctrl_RightUpLeg, Model::Character1_Ctrl_Hips + C: "OO",2376901534208,2376901487808 + + ;Model::Character1_Ctrl_Spine, Model::Character1_Ctrl_Hips + C: "OO",2376901531888,2376901487808 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftUpLeg + C: "OO",2376903020608,2376901536528 + + ;Model::Character1_Ctrl_LeftLeg, Model::Character1_Ctrl_LeftUpLeg + C: "OO",2376901538848,2376901536528 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftLeg + C: "OO",2376903018208,2376901538848 + + ;Model::Character1_Ctrl_LeftFoot, Model::Character1_Ctrl_LeftLeg + C: "OO",2376901548128,2376901538848 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftFoot + C: "OO",2376903014608,2376901548128 + + ;Model::Character1_Ctrl_LeftToeBase, Model::Character1_Ctrl_LeftFoot + C: "OO",2376901527248,2376901548128 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftToeBase + C: "OO",2376903012448,2376901527248 + + ;NodeAttribute::, Model::Character1_Ctrl_RightUpLeg + C: "OO",2376903018448,2376901534208 + + ;Model::Character1_Ctrl_RightLeg, Model::Character1_Ctrl_RightUpLeg + C: "OO",2376901541168,2376901534208 + + ;NodeAttribute::, Model::Character1_Ctrl_RightLeg + C: "OO",2376903016768,2376901541168 + + ;Model::Character1_Ctrl_RightFoot, Model::Character1_Ctrl_RightLeg + C: "OO",2376901529568,2376901541168 + + ;NodeAttribute::, Model::Character1_Ctrl_RightFoot + C: "OO",2376903012688,2376901529568 + + ;Model::Character1_Ctrl_RightToeBase, Model::Character1_Ctrl_RightFoot + C: "OO",2376901545808,2376901529568 + + ;NodeAttribute::, Model::Character1_Ctrl_RightToeBase + C: "OO",2376903019168,2376901545808 + + ;NodeAttribute::, Model::Character1_Ctrl_Spine + C: "OO",2376903012928,2376901531888 + + ;Model::Character1_Ctrl_Spine1, Model::Character1_Ctrl_Spine + C: "OO",2376901543488,2376901531888 + + ;NodeAttribute::, Model::Character1_Ctrl_Spine1 + C: "OO",2376903013648,2376901543488 + + ;Model::Character1_Ctrl_Spine2, Model::Character1_Ctrl_Spine1 + C: "OO",2376901524928,2376901543488 + + ;NodeAttribute::, Model::Character1_Ctrl_Spine2 + C: "OO",2376903017008,2376901524928 + + ;Model::Character1_Ctrl_LeftShoulder, Model::Character1_Ctrl_Spine2 + C: "OO",2376901522608,2376901524928 + + ;Model::Character1_Ctrl_RightShoulder, Model::Character1_Ctrl_Spine2 + C: "OO",2376901594528,2376901524928 + + ;Model::Character1_Ctrl_Neck, Model::Character1_Ctrl_Spine2 + C: "OO",2376901657168,2376901524928 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftShoulder + C: "OO",2376903009088,2376901522608 + + ;Model::Character1_Ctrl_LeftArm, Model::Character1_Ctrl_LeftShoulder + C: "OO",2376901550448,2376901522608 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftArm + C: "OO",2376903018688,2376901550448 + + ;Model::Character1_Ctrl_LeftForeArm, Model::Character1_Ctrl_LeftArm + C: "OO",2376901520288,2376901550448 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftForeArm + C: "OO",2376903020848,2376901520288 + + ;Model::Character1_Ctrl_LeftHand, Model::Character1_Ctrl_LeftForeArm + C: "OO",2376901564368,2376901520288 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHand + C: "OO",2376903021568,2376901564368 + + ;Model::Character1_Ctrl_LeftHandThumb1, Model::Character1_Ctrl_LeftHand + C: "OO",2376901555088,2376901564368 + + ;Model::Character1_Ctrl_LeftHandIndex1, Model::Character1_Ctrl_LeftHand + C: "OO",2376901585248,2376901564368 + + ;Model::Character1_Ctrl_LeftHandMiddle1, Model::Character1_Ctrl_LeftHand + C: "OO",2376901562048,2376901564368 + + ;Model::Character1_Ctrl_LeftHandRing1, Model::Character1_Ctrl_LeftHand + C: "OO",2376901587568,2376901564368 + + ;Model::Character1_Ctrl_LeftHandPinky1, Model::Character1_Ctrl_LeftHand + C: "OO",2376901596848,2376901564368 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandThumb1 + C: "OO",2376903008128,2376901555088 + + ;Model::Character1_Ctrl_LeftHandThumb2, Model::Character1_Ctrl_LeftHandThumb1 + C: "OO",2376901573648,2376901555088 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandThumb2 + C: "OO",2376903009328,2376901573648 + + ;Model::Character1_Ctrl_LeftHandThumb3, Model::Character1_Ctrl_LeftHandThumb2 + C: "OO",2376901566688,2376901573648 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandThumb3 + C: "OO",2376903009568,2376901566688 + + ;Model::Character1_Ctrl_LeftHandThumb4, Model::Character1_Ctrl_LeftHandThumb3 + C: "OO",2376901552768,2376901566688 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandThumb4 + C: "OO",2376903027808,2376901552768 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandIndex1 + C: "OO",2376903026128,2376901585248 + + ;Model::Character1_Ctrl_LeftHandIndex2, Model::Character1_Ctrl_LeftHandIndex1 + C: "OO",2376901569008,2376901585248 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandIndex2 + C: "OO",2376903027088,2376901569008 + + ;Model::Character1_Ctrl_LeftHandIndex3, Model::Character1_Ctrl_LeftHandIndex2 + C: "OO",2376901578288,2376901569008 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandIndex3 + C: "OO",2376903028528,2376901578288 + + ;Model::Character1_Ctrl_LeftHandIndex4, Model::Character1_Ctrl_LeftHandIndex3 + C: "OO",2376901571328,2376901578288 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandIndex4 + C: "OO",2376903023728,2376901571328 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandMiddle1 + C: "OO",2376903027328,2376901562048 + + ;Model::Character1_Ctrl_LeftHandMiddle2, Model::Character1_Ctrl_LeftHandMiddle1 + C: "OO",2376901575968,2376901562048 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandMiddle2 + C: "OO",2376903025888,2376901575968 + + ;Model::Character1_Ctrl_LeftHandMiddle3, Model::Character1_Ctrl_LeftHandMiddle2 + C: "OO",2376901580608,2376901575968 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandMiddle3 + C: "OO",2376903023968,2376901580608 + + ;Model::Character1_Ctrl_LeftHandMiddle4, Model::Character1_Ctrl_LeftHandMiddle3 + C: "OO",2376901582928,2376901580608 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandMiddle4 + C: "OO",2376903029008,2376901582928 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandRing1 + C: "OO",2376903035968,2376901587568 + + ;Model::Character1_Ctrl_LeftHandRing2, Model::Character1_Ctrl_LeftHandRing1 + C: "OO",2376901589888,2376901587568 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandRing2 + C: "OO",2376903031408,2376901589888 + + ;Model::Character1_Ctrl_LeftHandRing3, Model::Character1_Ctrl_LeftHandRing2 + C: "OO",2376901559728,2376901589888 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandRing3 + C: "OO",2376903036208,2376901559728 + + ;Model::Character1_Ctrl_LeftHandRing4, Model::Character1_Ctrl_LeftHandRing3 + C: "OO",2376901606128,2376901559728 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandRing4 + C: "OO",2376903022768,2376901606128 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandPinky1 + C: "OO",2376903027568,2376901596848 + + ;Model::Character1_Ctrl_LeftHandPinky2, Model::Character1_Ctrl_LeftHandPinky1 + C: "OO",2376901622368,2376901596848 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandPinky2 + C: "OO",2376903034768,2376901622368 + + ;Model::Character1_Ctrl_LeftHandPinky3, Model::Character1_Ctrl_LeftHandPinky2 + C: "OO",2376901617728,2376901622368 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandPinky3 + C: "OO",2376903036688,2376901617728 + + ;Model::Character1_Ctrl_LeftHandPinky4, Model::Character1_Ctrl_LeftHandPinky3 + C: "OO",2376901599168,2376901617728 + + ;NodeAttribute::, Model::Character1_Ctrl_LeftHandPinky4 + C: "OO",2376903025168,2376901599168 + + ;NodeAttribute::, Model::Character1_Ctrl_RightShoulder + C: "OO",2376903026368,2376901594528 + + ;Model::Character1_Ctrl_RightArm, Model::Character1_Ctrl_RightShoulder + C: "OO",2376901601488,2376901594528 + + ;NodeAttribute::, Model::Character1_Ctrl_RightArm + C: "OO",2376903034288,2376901601488 + + ;Model::Character1_Ctrl_RightForeArm, Model::Character1_Ctrl_RightArm + C: "OO",2376901620048,2376901601488 + + ;NodeAttribute::, Model::Character1_Ctrl_RightForeArm + C: "OO",2376903031168,2376901620048 + + ;Model::Character1_Ctrl_RightHand, Model::Character1_Ctrl_RightForeArm + C: "OO",2376901603808,2376901620048 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHand + C: "OO",2376903034048,2376901603808 + + ;Model::Character1_Ctrl_RightHandThumb1, Model::Character1_Ctrl_RightHand + C: "OO",2376901592208,2376901603808 + + ;Model::Character1_Ctrl_RightHandIndex1, Model::Character1_Ctrl_RightHand + C: "OO",2376901613088,2376901603808 + + ;Model::Character1_Ctrl_RightHandMiddle1, Model::Character1_Ctrl_RightHand + C: "OO",2376901633968,2376901603808 + + ;Model::Character1_Ctrl_RightHandRing1, Model::Character1_Ctrl_RightHand + C: "OO",2376901608448,2376901603808 + + ;Model::Character1_Ctrl_RightHandPinky1, Model::Character1_Ctrl_RightHand + C: "OO",2376901661808,2376901603808 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandThumb1 + C: "OO",2376903024928,2376901592208 + + ;Model::Character1_Ctrl_RightHandThumb2, Model::Character1_Ctrl_RightHandThumb1 + C: "OO",2376901629328,2376901592208 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandThumb2 + C: "OO",2376903030688,2376901629328 + + ;Model::Character1_Ctrl_RightHandThumb3, Model::Character1_Ctrl_RightHandThumb2 + C: "OO",2376901624688,2376901629328 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandThumb3 + C: "OO",2376903028768,2376901624688 + + ;Model::Character1_Ctrl_RightHandThumb4, Model::Character1_Ctrl_RightHandThumb3 + C: "OO",2376901615408,2376901624688 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandThumb4 + C: "OO",2376903028288,2376901615408 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandIndex1 + C: "OO",2376903023008,2376901613088 + + ;Model::Character1_Ctrl_RightHandIndex2, Model::Character1_Ctrl_RightHandIndex1 + C: "OO",2376901627008,2376901613088 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandIndex2 + C: "OO",2376903023488,2376901627008 + + ;Model::Character1_Ctrl_RightHandIndex3, Model::Character1_Ctrl_RightHandIndex2 + C: "OO",2376901610768,2376901627008 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandIndex3 + C: "OO",2376903025408,2376901610768 + + ;Model::Character1_Ctrl_RightHandIndex4, Model::Character1_Ctrl_RightHandIndex3 + C: "OO",2376901631648,2376901610768 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandIndex4 + C: "OO",2376903029968,2376901631648 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandMiddle1 + C: "OO",2376903025648,2376901633968 + + ;Model::Character1_Ctrl_RightHandMiddle2, Model::Character1_Ctrl_RightHandMiddle1 + C: "OO",2376901557408,2376901633968 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandMiddle2 + C: "OO",2376903029248,2376901557408 + + ;Model::Character1_Ctrl_RightHandMiddle3, Model::Character1_Ctrl_RightHandMiddle2 + C: "OO",2376901636288,2376901557408 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandMiddle3 + C: "OO",2376903036928,2376901636288 + + ;Model::Character1_Ctrl_RightHandMiddle4, Model::Character1_Ctrl_RightHandMiddle3 + C: "OO",2376901638608,2376901636288 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandMiddle4 + C: "OO",2376903031648,2376901638608 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandRing1 + C: "OO",2376903035008,2376901608448 + + ;Model::Character1_Ctrl_RightHandRing2, Model::Character1_Ctrl_RightHandRing1 + C: "OO",2376901640928,2376901608448 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandRing2 + C: "OO",2376903031888,2376901640928 + + ;Model::Character1_Ctrl_RightHandRing3, Model::Character1_Ctrl_RightHandRing2 + C: "OO",2376901659488,2376901640928 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandRing3 + C: "OO",2376903034528,2376901659488 + + ;Model::Character1_Ctrl_RightHandRing4, Model::Character1_Ctrl_RightHandRing3 + C: "OO",2376901654848,2376901659488 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandRing4 + C: "OO",2376903028048,2376901654848 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandPinky1 + C: "OO",2376903035248,2376901661808 + + ;Model::Character1_Ctrl_RightHandPinky2, Model::Character1_Ctrl_RightHandPinky1 + C: "OO",2376901673408,2376901661808 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandPinky2 + C: "OO",2376903032128,2376901673408 + + ;Model::Character1_Ctrl_RightHandPinky3, Model::Character1_Ctrl_RightHandPinky2 + C: "OO",2376901666448,2376901673408 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandPinky3 + C: "OO",2376903030208,2376901666448 + + ;Model::Character1_Ctrl_RightHandPinky4, Model::Character1_Ctrl_RightHandPinky3 + C: "OO",2376901652528,2376901666448 + + ;NodeAttribute::, Model::Character1_Ctrl_RightHandPinky4 + C: "OO",2376903029488,2376901652528 + + ;NodeAttribute::, Model::Character1_Ctrl_Neck + C: "OO",2376903030928,2376901657168 + + ;Model::Character1_Ctrl_Head, Model::Character1_Ctrl_Neck + C: "OO",2376901643248,2376901657168 + + ;NodeAttribute::, Model::Character1_Ctrl_Head + C: "OO",2376903032848,2376901643248 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_human_ik_7400_binary.fbx b/modules/ufbx/data/maya_human_ik_7400_binary.fbx new file mode 100644 index 0000000..6d8433c Binary files /dev/null and b/modules/ufbx/data/maya_human_ik_7400_binary.fbx differ diff --git a/modules/ufbx/data/maya_interpolation_modes_6100_ascii.fbx b/modules/ufbx/data/maya_interpolation_modes_6100_ascii.fbx new file mode 100644 index 0000000..b0143e0 --- /dev/null +++ b/modules/ufbx/data/maya_interpolation_modes_6100_ascii.fbx @@ -0,0 +1,433 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 24 + Hour: 20 + Minute: 24 + Second: 40 + Millisecond: 951 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-6.19471038211257,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_interpolation_modes_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_interpolation_modes_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "24/03/2020 18:24:40.950" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_interpolation_modes_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "24/03/2020 18:24:40.950" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::pCube1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -6.19471025466919 + KeyVer: 4005 + KeyCount: 12 + Key: 1924423250,-8.65336608886719,U,s,0,2.71713280677795,a,0.333333343267441,0.333333343267441 + ,21168655750,-6.49057579040527,U,s,2.71713280677795,0,a,0.333333343267441,0.333333343267441 + ,40412888250,-6.11319637298584,L,69279237000,-3.95811319351196,L,88523469500,-5.90597677230835 + ,U,s,0,-4.29038143157959,a,0.333333343267441,0.766876697540283,101994432250,-5.11854267120361 + ,U,b,3.90671706199646,3.98060750961304,a,0.540154039859772,0.52075207233429,121238664750 + ,-5.11854267120361,U,b,-4.16532135009766,0.216843649744987,a,0.508150815963745,0.616661667823792 + ,140482897250,-3.87522530555725,C,s,153953860000,-2.9427375793457,C,s,171273669250 + ,-1.92736172676086,C,n,184744632000,-1.24353730678558,C,n,230930790000,5.60333776473999 + ,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_interpolation_modes_6100_binary.fbx b/modules/ufbx/data/maya_interpolation_modes_6100_binary.fbx new file mode 100644 index 0000000..1e2e768 Binary files /dev/null and b/modules/ufbx/data/maya_interpolation_modes_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_interpolation_modes_7500_ascii.fbx b/modules/ufbx/data/maya_interpolation_modes_7500_ascii.fbx new file mode 100644 index 0000000..0b8e299 --- /dev/null +++ b/modules/ufbx/data/maya_interpolation_modes_7500_ascii.fbx @@ -0,0 +1,499 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 24 + Hour: 20 + Minute: 19 + Second: 3 + Millisecond: 586 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_interpolation_modes_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_interpolation_modes_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "24/03/2020 18:19:03.584" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_interpolation_modes_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "24/03/2020 18:19:03.584" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2604808703856, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 10 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurve" { + Count: 1 + } + ObjectType: "AnimationCurveNode" { + Count: 3 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2604708741152, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2604805303088, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-6.19471038211257,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2604229627792, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2604795476704, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2604465698224, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *12 { + a: 1924423250,21168655750,40412888250,69279237000,88523469500,101994432250,121238664750,140482897250,153953860000,171273669250,184744632000,230930790000 + } + KeyValueFloat: *12 { + a: -8.653366,-6.490576,-6.113196,-3.958113,-5.905977,-5.118543,-5.118543,-3.875225,-2.942738,-1.927362,-1.243537,5.603338 + } + ;KeyAttrFlags: Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Linear, Linear, Cubic|TangeantUser|WeightedRight|WeightedNextLeft, Cubic|TangeantUser|GenericBreak|WeightedRight|WeightedNextLeft, Cubic|TangeantUser|GenericBreak|WeightedRight|WeightedNextLeft, Constant|ConstantStandard, Constant|ConstantStandard, Constant|ConstantNext, Constant|ConstantNext, Cubic|TangeantUser + KeyAttrFlags: *12 { + a: 50332680,50332680,1028,1028,50332680,50334728,50334728,2,2,258,258,1032 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:2.71713, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:2.71713, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:3.44813, NextLeftSlope:3.44813, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:-4.67487, NextLeftSlope:-4.67487, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:-4.29038, RightWeight:0.333333, NextLeftWeight:0.766877, RightVelocity:0, NextLeftVelocity:0; RightSlope:3.90672, NextLeftSlope:3.98061, RightWeight:0.540154, NextLeftWeight:0.520752, RightVelocity:0, NextLeftVelocity:0; RightSlope:-4.16532, NextLeftSlope:0.216844, RightWeight:0.508151, NextLeftWeight:0.616662, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:2.9218, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:2.5488, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:0.216844; RightAuto:0, NextLeftAuto:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *48 { + a: 0,1076749697,218434821,0,1076749697,0,218434821,0,1079815734,1079815734,218434821,0,-1063937905,-1063937905,218434821,0,0,-1064744242,502533381,0,1081739175,1082049094,341251353,0,-1065006512,1046350915,404100057,0,0,1077608114,218434821,0,0,1076043659,218434821,0,0,1046350915,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + AnimationCurveNode: 2604795473792, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-6.19471038211257 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2604795474832, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2604795475040, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2604796406800, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2604805303088,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2604796406800,2604795476704 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2604795473792,2604796406800 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2604795474832,2604796406800 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2604795475040,2604796406800 + + ;Geometry::, Model::pCube1 + C: "OO",2604708741152,2604805303088 + + ;Material::lambert1, Model::pCube1 + C: "OO",2604229627792,2604805303088 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2604795473792,2604805303088, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2604795475040,2604805303088, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2604795474832,2604805303088, "Lcl Scaling" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2604465698224,2604795473792, "d|X" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_interpolation_modes_7500_binary.fbx b/modules/ufbx/data/maya_interpolation_modes_7500_binary.fbx new file mode 100644 index 0000000..838e54f Binary files /dev/null and b/modules/ufbx/data/maya_interpolation_modes_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_kenney_character_4.obj b/modules/ufbx/data/maya_kenney_character_4.obj new file mode 100644 index 0000000..c864321 --- /dev/null +++ b/modules/ufbx/data/maya_kenney_character_4.obj @@ -0,0 +1,3466 @@ +# This file uses centimeters as units for non-parametric coordinates. + +v 40.588000 329.407510 54.891318 +v 17.206039 335.798309 -14.469437 +v 17.206030 291.182349 -14.525661 +v 18.889664 280.186667 83.705040 +v 18.889661 329.313124 80.348122 +v 39.573497 283.967456 56.543453 +v 39.573503 287.698152 13.515877 +v 40.588015 332.548907 13.572403 +v 18.390945 353.958402 59.589412 +v 18.390961 357.294228 12.393830 +v 18.390948 258.348443 12.269134 +v 18.390945 250.502120 62.877859 +v 33.367142 262.986979 55.244922 +v 31.886005 333.795260 -6.203703 +v 31.885982 328.246104 70.011652 +v 33.367142 348.363290 57.141945 +v 33.367148 269.413187 13.859157 +v 17.142405 271.882390 -7.986763 +v 31.885996 291.432856 -6.257093 +v 18.826047 257.631029 80.691999 +v 31.885982 283.765900 72.947063 +v 33.367157 349.734166 13.960388 +v 17.142420 350.268053 -5.154563 +v 18.826042 345.808399 75.364444 +v 17.565885 311.740229 -16.940895 +v 19.249512 305.906834 82.622514 +v 40.447962 307.162675 54.230682 +v 39.824793 309.503629 12.874593 +v 42.430016 285.119682 36.174564 +v 43.444529 331.330711 35.805452 +v 19.343264 358.476287 36.896862 +v 19.343260 251.062495 37.616200 +v 28.155240 277.049494 -1.038796 +v 28.155237 260.869109 71.427905 +v 28.155258 347.846770 -0.949574 +v 29.702234 343.580520 70.710442 +v 35.271665 264.353830 37.261813 +v 31.766567 310.839199 -7.582446 +v 32.261041 306.836783 70.793424 +v 35.271671 349.609429 36.621394 +v 42.949820 307.935411 35.354201 +v 10.640223 250.345568 23.086571 +v 12.484682 246.719771 34.026782 +v 10.525329 244.936044 44.850327 +v 9.406666 243.972400 18.778089 +v 13.539867 238.091497 28.487757 +v 9.390648 233.887226 38.682330 +v 20.384210 240.641191 17.398889 +v 24.089015 235.726838 28.452197 +v 20.367442 230.413133 38.510160 +v 26.665217 212.018801 5.690046 +v 31.486401 204.663352 21.919016 +v 26.641536 198.797601 36.727742 +v 29.941019 133.581052 -11.312492 +v 35.322997 130.993605 4.715673 +v 28.935000 132.672981 19.122342 +v 25.563914 158.125524 27.728362 +v 30.219281 163.681962 13.077705 +v 25.586444 170.505988 -2.018475 +v 24.212852 213.942033 37.701521 +v 24.235299 226.674916 8.532222 +v 11.658222 124.864606 22.287976 +v 1.552166 105.109013 3.312220 +v 17.605738 108.438347 -12.339429 +v 8.004174 336.418650 -15.296264 +v 8.004165 290.630505 -16.528153 +v 8.004148 278.407612 85.770818 +v 8.004147 329.881109 82.416850 +v 8.571979 356.456194 60.255857 +v 8.571996 358.854200 11.732489 +v 8.571982 256.437852 11.603425 +v 8.571979 248.398887 63.538511 +v 7.973674 270.680831 -9.317862 +v 7.973664 254.341520 82.033980 +v 7.973688 351.489185 -6.482606 +v 7.973661 347.013629 77.022532 +v 8.176615 312.071893 -17.870854 +v 8.176590 305.585494 85.510520 +v 9.028342 359.582430 36.898247 +v 5.535376 251.801089 19.107287 +v 4.853628 244.317730 47.220137 +v 4.270306 244.892648 17.066433 +v 4.251153 232.843096 40.872092 +v 9.530413 241.635730 15.640871 +v 9.510233 229.215056 40.936033 +v 12.536713 213.194299 2.887557 +v 12.508467 197.546000 40.018488 +v 14.152303 134.649608 -17.533783 +v 14.220157 129.240577 28.338969 +v 12.011465 171.778142 -5.283102 +v 11.984126 156.947403 30.984832 +v 11.348298 212.613971 40.889470 +v 11.375345 227.928830 5.726943 +v 4.877607 91.861659 36.680490 +v 13.277017 108.784183 48.057941 +v 23.870227 84.781652 30.991067 +v 34.987301 103.185803 39.407320 +v 6.047865 95.692200 39.723428 +v 13.168702 90.319314 52.767578 +v 24.965048 95.589560 33.750861 +v 34.934083 91.970809 47.502682 +v 7.266150 84.846172 19.771111 +v 13.624184 72.914320 32.205108 +v 23.855083 87.052914 12.199387 +v 31.942305 76.691876 26.627841 +v 10.086386 122.256558 31.456448 +v 35.865507 115.179661 20.464136 +v 2.392391 99.631713 24.853553 +v 22.917707 92.123398 14.911061 +v 5.816025 104.243754 -8.964310 +v 25.803104 129.882934 14.079724 +v 12.173800 85.718732 32.021327 +v 25.590813 108.830674 45.606887 +v 13.852023 96.171116 34.138738 +v 25.316632 90.150836 52.262780 +v 14.417535 87.188765 13.703272 +v 24.137150 72.566622 31.280285 +v 9.728746 91.612002 17.497776 +v 24.705137 122.310714 27.705408 +v 5.017554 113.017800 13.359470 +v 30.649352 117.672740 -6.049027 +v 4.988732 101.494105 43.177439 +v 32.900426 92.735970 34.216156 +v 5.656359 92.668344 47.008386 +v 33.615604 93.661309 39.188221 +v 6.894904 78.239052 27.312397 +v 31.836936 82.411924 18.032628 +v 33.376721 100.884726 15.925962 +v 2.344202 112.477784 29.132816 +v 47.174078 219.438317 14.737292 +v 48.442197 215.782646 22.924512 +v 45.283508 212.860518 29.664464 +v 28.654015 213.351609 10.401383 +v 25.312987 205.842236 19.828660 +v 25.718784 203.902321 30.620062 +v 35.180697 207.819252 30.082165 +v 68.057829 139.561885 34.318219 +v 38.105118 216.498091 11.615441 +v 56.699419 196.125985 6.708601 +v 57.367831 192.646315 13.031039 +v 54.223478 190.203229 19.093670 +v 39.402673 190.640915 1.925699 +v 36.060616 184.233655 10.437294 +v 36.876112 183.015993 18.169290 +v 45.174882 185.312668 20.352426 +v 51.960558 178.021745 26.616869 +v 47.888738 194.005406 1.758735 +v 67.088747 142.814857 39.403624 +v 66.861874 146.607609 43.559751 +v 52.389997 138.369697 34.418998 +v 49.238145 143.403287 41.790215 +v 51.413858 147.300084 46.256566 +v 58.856618 147.946151 46.782514 +v 66.482466 127.001352 41.064236 +v 59.802055 137.314587 32.640178 +v 42.989305 177.087764 26.195703 +v 43.582958 165.475966 10.948532 +v 53.221720 164.666368 8.732810 +v 40.171540 171.620229 20.814208 +v 64.720964 171.856037 16.922522 +v 63.899404 167.695882 10.329842 +v 62.333709 176.799373 22.406718 +v 36.518714 231.965737 28.258334 +v 33.664301 227.813107 37.002237 +v 29.049656 215.223433 8.862195 +v 31.980047 226.909830 11.209148 +v 27.773619 206.470734 35.562690 +v 29.777104 215.633780 36.427898 +v 31.223530 206.719879 22.165612 +v 35.362041 236.329296 16.992277 +v 65.022129 133.313793 35.556089 +v 64.820617 138.552732 42.999522 +v 64.342946 145.897039 47.421834 +v 54.537958 132.164246 34.705346 +v 53.125393 139.927740 45.643810 +v 53.847480 146.931430 52.939528 +v 58.842915 147.588488 54.267061 +v 40.438479 122.099086 49.257506 +v 59.495533 129.999154 32.856986 +v 66.416341 130.934521 49.275082 +v 65.936297 137.437531 54.862858 +v 55.992341 125.750679 40.332449 +v 54.777336 131.567022 52.440980 +v 55.443889 135.702119 59.411295 +v 60.453165 136.190365 60.744323 +v 56.071377 125.344774 55.794445 +v 60.933787 124.041802 38.011671 +v 39.596236 127.362165 54.371300 +v 41.686130 130.589519 60.253790 +v 45.879155 125.423546 44.950083 +v 45.279029 133.574053 52.155544 +v 47.189024 136.176894 59.078582 +v 44.407177 135.090218 61.531706 +v 42.074588 130.008801 52.688422 +v 42.956749 122.291715 44.635219 +v 57.520860 116.872736 47.171314 +v 57.461363 127.018105 66.257373 +v 58.592290 129.253898 62.835547 +v 54.443103 116.535399 59.441321 +v 55.612481 111.244938 53.234029 +v 56.250113 112.326832 47.492677 +v 56.584150 121.108388 65.363429 +v 57.080555 144.214140 65.203816 +v 52.153540 143.788455 63.952876 +v 58.346367 136.221252 64.604844 +v 53.419358 135.795556 63.353904 +v 55.520171 137.976098 70.837368 +v 50.575578 137.331223 69.742711 +v 57.936221 133.604573 64.218583 +v 52.991635 132.959698 63.123920 +v 55.010313 128.181589 75.611392 +v 51.542622 127.729333 74.843702 +v 56.704730 125.115811 70.969585 +v 53.237039 124.663543 70.201883 +v 22.912151 63.385231 3.632007 +v 9.246203 58.562984 12.901791 +v 23.024161 56.911143 13.031056 +v 10.978870 65.331317 3.175602 +v 23.641858 60.058625 8.231825 +v 9.301142 62.043656 7.644046 +v 17.414664 65.425372 2.023315 +v 19.659187 16.473992 29.036257 +v 30.809709 17.513321 27.440339 +v 12.960699 44.889844 -14.594930 +v 23.600507 45.671279 -15.794550 +v 10.980212 30.443038 7.587358 +v 25.360903 16.378111 29.183442 +v 33.850300 32.419462 4.553164 +v 19.280730 46.180252 -16.576147 +v 22.318190 31.374879 6.156816 +v 10.286631 23.009387 19.001511 +v 35.716131 25.306743 15.473853 +v 23.933820 23.508215 18.235493 +v 30.377519 40.295206 -7.539715 +v 7.407571 38.501983 -4.786821 +v 20.531555 40.071921 -7.197089 +v 13.318834 19.540671 24.327549 +v 34.936491 21.502425 21.315221 +v 24.741834 19.574956 24.274830 +v 27.489784 44.202364 -13.539023 +v 19.559862 44.474528 -13.957090 +v 8.398636 42.686505 -11.211917 +v 9.576124 34.190423 1.833408 +v 31.467375 35.798216 -0.634791 +v 21.510178 35.308146 0.117465 +v 35.337606 28.943412 9.890205 +v 23.126008 27.441542 12.196161 +v 9.539775 26.645886 13.417746 +v 19.833030 23.666885 33.538063 +v 32.917508 24.760329 31.859042 +v 12.051496 52.681116 -11.011926 +v 22.601183 52.282123 -11.335918 +v 9.375717 37.478416 12.330986 +v 26.511213 23.609560 33.626037 +v 34.946799 39.594711 9.082089 +v 18.044217 53.649888 -12.499296 +v 9.762830 29.518778 24.552810 +v 37.135750 31.978703 20.775523 +v 30.513144 48.017552 -3.850851 +v 6.214064 46.121240 -0.939807 +v 13.319750 25.804614 30.255722 +v 36.109146 27.890371 27.052982 +v 26.972094 49.865176 -8.227839 +v 7.623951 50.656574 -7.903438 +v 8.004919 41.490973 6.169879 +v 32.334140 43.183399 3.571783 +v 36.691594 35.872697 14.796779 +v 8.886617 33.412597 18.573934 +v 20.097081 27.012774 35.074954 +v 30.807930 27.642709 34.107648 +v 12.111282 56.785511 -7.295514 +v 22.427931 56.824898 -7.080648 +v 11.356036 41.521307 16.141874 +v 33.307528 43.156993 13.630848 +v 17.528805 57.549112 -8.403287 +v 11.712114 34.818800 26.433376 +v 35.264048 36.793134 23.401718 +v 29.242635 51.760751 0.420123 +v 7.873689 51.008803 1.945444 +v 14.059246 31.390630 31.697164 +v 34.411594 32.996299 29.231594 +v 25.710919 54.454201 -3.819440 +v 9.285530 54.310655 -3.223094 +v 10.001432 44.420265 11.690642 +v 31.971577 45.893179 9.429545 +v 34.850016 40.422639 17.829058 +v 10.932311 38.450626 20.856805 +v 20.962024 33.190068 35.202015 +v 27.800164 33.873725 34.152246 +v 12.054144 61.078155 -3.310603 +v 21.025652 61.430358 -3.306927 +v 16.585734 45.374677 18.002512 +v 28.657329 46.966994 17.501128 +v 16.642334 61.568117 -3.666676 +v 14.250512 39.555319 26.675552 +v 31.493226 41.393392 26.063489 +v 26.506513 57.534248 4.283992 +v 8.322658 55.923183 5.535221 +v 16.324876 36.598989 32.279709 +v 30.575439 37.784686 30.790195 +v 24.130389 59.265494 -0.316309 +v 9.566318 58.772743 0.403295 +v 14.861335 49.648135 14.500279 +v 26.117501 50.962927 15.508725 +v 30.676442 44.327862 21.277069 +v 15.703459 42.649839 22.539591 +v 30.449283 38.065063 -4.115445 +v 21.020865 37.690034 -3.539813 +v 8.243035 36.327931 -1.448653 +v 31.425938 45.610654 -0.155163 +v 6.793012 43.779734 2.655575 +v 30.519339 48.869390 4.859691 +v 8.378497 47.288416 7.286706 +v 26.961270 55.011065 9.293035 +v 9.537303 53.746857 11.233784 +v 22.724645 62.794400 2.146215 +v 19.576499 64.123004 -1.335455 +v 15.952864 64.604926 -0.600148 +v 13.154978 64.210844 0.682581 +v 24.609886 55.683096 10.726178 +v 24.546723 60.141219 6.475028 +v 9.328836 61.859662 2.548753 +v 8.656216 59.043427 7.536776 +v 9.427196 54.665222 12.288731 +v 15.522066 53.260764 14.833924 +v 22.543684 53.863444 13.520107 +v 15.583779 55.966797 15.532458 +v -41.513836 329.407534 54.891312 +v -18.131867 335.798309 -14.469437 +v -18.131869 291.182349 -14.525661 +v -19.815509 280.186667 83.705040 +v -19.815493 329.313124 80.348122 +v -40.499341 283.967456 56.543453 +v -40.499344 287.698152 13.515876 +v -41.513848 332.548907 13.572402 +v -19.316769 353.958402 59.589412 +v -19.316785 357.294228 12.393829 +v -19.316794 258.348443 12.269134 +v -19.316794 250.502120 62.877859 +v -34.292990 262.987003 55.244922 +v -32.811832 333.795260 -6.203704 +v -32.811818 328.246104 70.011652 +v -34.292969 348.363290 57.141939 +v -34.292993 269.413187 13.859155 +v -18.068247 271.882414 -7.986763 +v -32.811835 291.432856 -6.257094 +v -19.751896 257.631029 80.691999 +v -32.811829 283.765900 72.947063 +v -34.292987 349.734166 13.960388 +v -18.068245 350.268053 -5.154564 +v -19.751871 345.808399 75.364444 +v -18.491720 311.740229 -16.940895 +v -0.462914 336.988995 -15.717201 +v -0.462920 290.120957 -16.950452 +v -20.175350 305.906834 82.622514 +v -0.462922 276.772513 86.166885 +v -0.462916 329.838719 84.319675 +v -41.373801 307.162675 54.230682 +v -40.750632 309.503629 12.874593 +v -43.355864 285.119682 36.174561 +v -44.370362 331.330711 35.805452 +v -0.462913 357.626973 60.867663 +v -0.462912 359.791853 11.123331 +v -20.269088 358.476287 36.896859 +v -20.269109 251.062495 37.616197 +v -0.462924 255.854036 10.992351 +v -0.462926 246.463595 64.146407 +v -29.081088 277.049494 -1.038796 +v -29.081088 260.869109 71.427905 +v -29.081088 347.846770 -0.949575 +v -30.628061 343.580520 70.710442 +v -36.197510 264.353830 37.261810 +v -0.462923 269.575213 -10.542665 +v -32.692406 310.839199 -7.582447 +v -0.462925 253.607764 83.271701 +v -33.186883 306.836783 70.793424 +v -36.197498 349.609429 36.621394 +v -0.462913 352.612160 -7.139091 +v -0.462914 348.122967 78.262564 +v -0.462917 312.117621 -18.603094 +v -0.462919 305.293121 85.558585 +v -43.875659 307.935411 35.354201 +v -0.462912 360.666114 36.899609 +v -0.467204 243.608721 49.297472 +v -0.459657 252.119473 19.376553 +v -11.561588 250.349287 23.082509 +v -13.411696 246.724110 34.022047 +v -11.457475 244.939740 44.846310 +v -0.478020 231.882412 42.886988 +v -0.455727 245.882609 15.054310 +v -10.323925 243.982461 18.767374 +v -14.473704 238.105755 28.472510 +v -10.339904 233.897287 38.671616 +v -0.480067 228.112752 43.168198 +v -0.456522 242.694142 13.586114 +v -21.303254 240.662530 17.376224 +v -25.025138 235.751920 28.425476 +v -21.319968 230.434448 38.487498 +v -0.495924 196.394355 43.046466 +v -0.463508 214.275956 0.308841 +v -27.600452 212.046195 5.660355 +v -32.446828 204.695610 21.884030 +v -27.624112 198.824984 36.698050 +v -0.290917 128.877347 30.271181 +v -0.373072 135.425767 -21.355907 +v -30.631343 132.821129 -11.312491 +v -35.835934 130.210901 6.439920 +v -29.614630 130.216554 22.514000 +v -0.511298 155.863374 33.981274 +v -26.577353 158.151691 27.699767 +v -31.211063 163.712802 13.044016 +v -26.554823 170.532155 -2.047070 +v -0.479539 172.948729 -8.287034 +v -25.181267 213.967258 37.674643 +v -25.158876 226.700140 8.505338 +v -0.458706 228.588653 4.654682 +v -0.488820 211.392052 43.822871 +v -12.464928 119.783656 26.467641 +v -2.146588 104.819215 3.290853 +v -17.265451 114.312550 -18.413024 +v -0.297211 104.964114 3.301537 +v -8.930004 336.418650 -15.296264 +v -8.930007 290.630505 -16.528155 +v -8.929994 278.407612 85.770818 +v -8.929979 329.881109 82.416850 +v -9.497804 356.456194 60.255857 +v -9.497821 358.854200 11.732489 +v -9.497831 256.437852 11.603424 +v -9.497830 248.398910 63.538511 +v -8.899519 270.680831 -9.317862 +v -8.899514 254.341520 82.033980 +v -8.899514 351.489185 -6.482606 +v -8.899490 347.013629 77.022532 +v -9.102450 312.071893 -17.870854 +v -9.102429 305.585494 85.510520 +v -9.954167 359.582430 36.898247 +v -6.454654 251.803067 19.105092 +v -5.786957 244.319494 47.218191 +v -5.184761 244.897511 17.061340 +v -5.203866 232.847960 40.867002 +v -10.446528 241.646006 15.630072 +v -10.466634 229.225308 40.925239 +v -13.467704 213.207460 2.873348 +v -13.495919 197.559125 40.004281 +v -14.874402 134.285447 -17.533783 +v -14.806537 128.876417 28.338969 +v -12.974998 171.790682 -5.296805 +v -13.002332 156.959944 30.971129 +v -12.321553 212.626082 40.876652 +v -12.294585 227.940989 5.714119 +v -0.148750 117.545442 27.470352 +v -0.148750 117.545423 -18.683070 +v -8.293355 74.217923 6.843723 +v -18.192850 78.008090 26.183056 +v -26.433554 74.701833 -3.829901 +v -38.757473 81.827643 14.349459 +v -9.332329 69.799728 6.152912 +v -18.809888 60.208193 20.480733 +v -27.107802 72.952264 -3.474688 +v -39.426857 65.672596 11.915882 +v -9.391169 56.867562 -11.135523 +v -18.113254 45.414141 0.272709 +v -24.721473 60.411253 -20.613199 +v -35.273963 50.650429 -7.410466 +v -13.572542 99.095259 25.051581 +v -37.906930 103.862061 10.198529 +v -4.752021 87.979502 4.721192 +v -23.962906 91.362272 -9.279817 +v -5.630499 103.346919 -9.030433 +v -26.690274 124.224702 19.446803 +v 0.050111 102.934884 -8.053931 +v -14.931026 73.867601 -1.432614 +v -30.181739 80.586443 23.487933 +v -16.127907 72.576767 -1.634766 +v -30.773523 61.235192 18.492556 +v -15.552950 59.795669 -17.984527 +v -28.432509 45.900508 -1.913392 +v -11.108115 88.313572 -6.756395 +v -27.717692 102.767948 21.281287 +v -6.069031 112.149169 13.295428 +v -30.655000 120.386146 -8.294359 +v -0.540620 111.192753 13.213348 +v -9.287021 76.071134 18.271118 +v -35.918295 78.343416 3.381210 +v -10.298265 64.014175 14.617118 +v -36.671683 69.870365 1.971908 +v -10.448624 50.215482 -3.699458 +v -33.686307 56.385711 -15.848132 +v -34.654650 97.252374 -3.100744 +v -5.423909 93.631479 17.006974 +v -47.951743 216.419675 15.487572 +v -49.671420 216.034488 24.369988 +v -46.889839 215.563088 31.852210 +v -29.798958 208.151772 14.507906 +v -27.220413 204.365949 26.146012 +v -28.024694 206.467921 36.884617 +v -37.175304 210.452372 34.528802 +v -72.755098 137.023445 48.147078 +v -39.035329 212.048986 14.062093 +v -58.875221 192.353561 15.883240 +v -59.938854 191.427199 22.992301 +v -57.121640 191.158800 29.670806 +v -41.889629 184.553578 14.212918 +v -39.210969 181.464318 24.602860 +v -40.298563 183.160215 32.210275 +v -48.468605 186.550396 33.027392 +v -52.421224 173.709328 40.629922 +v -50.114560 188.102438 12.447376 +v -70.961958 139.814529 53.240694 +v -69.934642 143.273029 57.519556 +v -57.455951 134.322532 46.528446 +v -53.104991 138.514635 53.742279 +v -54.399765 142.287812 58.587915 +v -61.602455 143.611906 59.928918 +v -70.921117 123.397705 53.526620 +v -65.032619 134.111650 45.499953 +v -43.969780 171.398157 38.447102 +v -49.280831 161.466483 22.928738 +v -59.151876 162.410263 22.551509 +v -43.150187 166.063898 32.309618 +v -67.579687 170.566946 33.202206 +v -68.682301 166.946570 26.337602 +v -63.430887 174.546081 38.414328 +v -37.321883 232.294635 27.263294 +v -34.616661 229.241162 36.172493 +v -29.893982 214.010383 9.002883 +v -32.628703 225.108291 10.601458 +v -28.921002 207.264000 36.106174 +v -30.924594 217.006212 36.692548 +v -32.291242 206.502346 22.902473 +v -35.926941 235.239580 15.515776 +v -69.349623 129.884287 48.256415 +v -68.828034 134.795317 55.905076 +v -68.015432 141.926692 60.617525 +v -58.928961 128.421517 47.145882 +v -57.044673 135.665677 58.365937 +v -57.438904 142.432200 65.968389 +v -62.401086 143.193363 67.368615 +v -44.373217 117.746387 60.640185 +v -63.991874 126.503272 45.310444 +v -70.565069 126.977060 61.890474 +v -69.756907 133.219170 67.732217 +v -60.495734 121.828732 52.530603 +v -58.853483 127.085887 64.842758 +v -59.280509 131.037044 72.118529 +v -64.261121 131.629932 73.520061 +v -60.938656 123.329042 66.253487 +v -65.535820 120.385405 50.241838 +v -43.015304 122.548448 66.085974 +v -45.005000 125.942182 71.909294 +v -48.550367 122.266743 56.022368 +v -47.059211 129.872869 63.679608 +v -49.108198 132.584261 70.520767 +v -46.874002 130.864155 73.164048 +v -44.717345 125.705396 64.320860 +v -46.307403 118.609545 55.817513 +v -62.903708 115.107999 57.436537 +v -61.925846 124.280179 77.022336 +v -63.300914 126.879406 73.598340 +v -59.020048 113.828766 69.826835 +v -60.569489 108.756946 63.492930 +v -61.527389 110.325787 57.666153 +v -61.029142 118.160904 76.016627 +v -60.795468 139.395464 78.270305 +v -55.862349 138.925017 77.065123 +v -62.221134 131.556333 77.187684 +v -57.288021 131.085885 75.982502 +v -59.554124 132.536377 83.462568 +v -54.598111 131.874384 82.431611 +v -61.891669 128.893388 76.390043 +v -56.935662 128.231395 75.359073 +v -59.399939 122.313859 87.265060 +v -55.924237 121.849587 86.542038 +v -61.039299 119.759001 82.305036 +v -57.563597 119.294740 81.582008 +v -25.290686 36.348731 -29.521131 +v -12.123236 31.959712 -18.920533 +v -26.083428 30.086931 -19.848302 +v -13.177235 38.481177 -29.085058 +v -26.361257 33.114203 -24.835584 +v -11.797688 35.318374 -24.334699 +v -19.610795 38.444738 -30.768985 +v -19.529134 1.096654 2.936721 +v -30.658349 0.617128 0.967612 +v -13.463637 16.874115 -45.763600 +v -24.084364 16.504471 -47.287956 +v -10.842335 4.612605 -22.365505 +v -25.226945 0.859266 3.079303 +v -33.684778 4.073905 -26.121689 +v -19.809559 17.366911 -48.004457 +v -22.164446 4.304171 -24.150101 +v -10.091962 1.407446 -8.983717 +v -35.473689 0.314763 -13.340823 +v -23.721687 0.830181 -9.976957 +v -30.584568 11.204756 -38.765435 +v -7.651027 11.911203 -35.302897 +v -20.778784 11.977778 -38.162680 +v -13.160156 1.323767 -2.645566 +v -34.737101 0.394766 -6.365613 +v -24.572809 0.845356 -2.774708 +v -27.887610 14.856608 -45.009386 +v -20.010415 15.868901 -45.254463 +v -8.825577 15.421817 -42.090415 +v -9.614254 7.981211 -28.387670 +v -31.466246 7.220672 -31.524010 +v -21.537775 7.774587 -30.487339 +v -35.031432 0.608253 -20.271099 +v -22.830847 0.824380 -17.496033 +v -9.271706 1.436709 -15.917801 +v -20.056556 9.564865 2.722853 +v -33.117443 9.003740 0.643358 +v -13.421828 24.991143 -42.851440 +v -23.868869 23.533629 -43.398748 +v -10.074726 12.146099 -18.214562 +v -26.729554 9.286137 2.789114 +v -35.610679 11.463121 -22.263158 +v -19.427626 25.238727 -44.564421 +v -9.929963 9.913362 -7.941150 +v -37.251601 8.737333 -12.607413 +v -31.579152 19.159895 -35.767537 +v -7.318612 19.907791 -32.105842 +v -13.525151 9.810783 -1.156309 +v -36.271429 8.831207 -5.110371 +v -28.088728 20.970304 -40.200416 +v -8.925658 23.679806 -39.470533 +v -8.891714 15.740066 -24.666126 +v -33.173048 14.813419 -27.999144 +v -36.971670 8.395265 -18.015087 +v -9.208038 9.295050 -13.350983 +v -20.469375 13.189338 2.157558 +v -31.163862 12.733309 0.941138 +v -13.996004 29.368469 -39.509176 +v -24.270838 28.413927 -39.552276 +v -12.556864 16.282064 -14.820073 +v -34.470046 15.539667 -18.002975 +v -19.422416 29.501011 -40.812107 +v -12.098103 15.285434 -9.307499 +v -35.607496 14.275339 -13.061828 +v -30.813545 23.356264 -31.808821 +v -9.531976 24.834761 -29.698868 +v -14.481369 15.229915 -3.039665 +v -34.798077 14.358295 -6.099908 +v -27.417785 26.016063 -36.178727 +v -11.082134 27.534789 -35.168450 +v -11.339787 18.914322 -19.472197 +v -33.264193 18.029756 -22.392477 +v -35.517436 13.639242 -16.665638 +v -11.637736 14.474479 -12.902161 +v -21.533000 18.371899 -1.148984 +v -28.357562 18.077251 -2.441351 +v -14.480685 33.966565 -35.913032 +v -23.440199 33.436322 -36.160626 +v -18.189487 19.747057 -13.431224 +v -30.335191 20.099931 -14.366028 +v -19.080579 33.972466 -36.423111 +v -14.791250 19.260516 -11.732975 +v -32.060128 19.733889 -13.357410 +v -28.770494 29.675288 -28.396313 +v -10.566608 29.966413 -26.562833 +v -16.926448 19.797214 -5.439936 +v -31.160614 19.368598 -7.419019 +v -26.420572 31.237254 -33.070090 +v -11.907405 32.237516 -31.952443 +v -16.767140 23.858547 -17.248837 +v -28.124741 24.143443 -16.635797 +v -31.709769 18.590055 -14.694479 +v -16.713105 18.507191 -12.775938 +v -30.555484 9.274938 -35.162763 +v -21.158279 9.876183 -34.325011 +v -8.384275 9.954850 -31.809636 +v -32.378843 16.995207 -31.899848 +v -7.789112 17.832231 -28.335532 +v -31.953460 20.738195 -27.167061 +v -9.854361 21.546332 -24.067936 +v -29.146600 27.550917 -23.199269 +v -11.754581 28.169602 -20.727976 +v -25.440416 35.081948 -30.890417 +v -22.320741 36.414647 -34.396100 +v -18.785876 37.309859 -33.616680 +v -16.006814 37.301583 -32.236099 +v -26.918632 28.568690 -21.772714 +v -27.142042 32.637243 -26.393112 +v -12.036857 35.502664 -30.078760 +v -11.262633 33.196478 -24.849407 +v -11.767552 29.179978 -19.754625 +v -17.780839 27.404183 -17.247400 +v -24.780987 27.202451 -18.780978 +v -18.729839 29.319766 -16.695692 +v -55.533963 118.239484 57.030426 +v -56.018412 129.286218 72.359040 +v -50.756425 117.717063 68.272995 +v -53.809375 126.159404 65.263275 +v -54.181695 127.114308 75.400767 +v -52.212632 112.777672 62.384808 +v -53.691977 114.007494 57.050943 +v -52.765888 121.579993 74.279598 +v 51.207459 119.947763 46.957271 +v 52.417648 131.520877 61.848607 +v 46.342045 120.684752 57.856516 +v 50.192171 128.275880 54.858890 +v 50.374085 129.826807 64.813426 +v 47.354725 115.401527 52.200436 +v 49.022862 116.075881 46.988030 +v 48.485455 124.584840 63.757799 +v 58.530974 125.573823 56.111047 +v 61.335403 128.982006 64.266071 +v 63.737154 115.818366 49.468662 +v 61.461300 115.061886 44.930991 +v 63.982624 126.001034 62.407306 +v 59.787828 118.353422 45.804031 +v 58.591366 129.541467 62.169316 +v 63.146216 120.457194 56.656883 +v -63.242388 122.220825 67.573730 +v -65.570486 124.936772 76.344768 +v -68.665886 112.615989 60.851907 +v -66.635841 112.098965 56.159633 +v -68.346685 122.265721 74.191872 +v -64.969277 115.396056 57.066297 +v -62.928486 125.563324 74.204758 +v -67.740351 116.971969 68.180524 +v 42.627829 176.594508 1.734619 +v 39.147854 178.506901 11.106766 +v 61.651403 179.976714 2.880881 +v 59.785414 183.727386 14.926725 +v 41.268560 181.498626 17.260726 +v 51.750022 177.243149 0.188843 +v 62.109244 182.242431 9.083381 +v -47.288927 171.918514 15.350500 +v -42.289963 174.006168 24.980327 +v -65.618575 178.189769 18.020334 +v -61.648566 182.625776 30.550417 +v -43.199971 177.851527 31.586341 +v -56.478596 173.762109 14.440626 +v -64.945912 181.026653 24.575357 +v -0.517883 142.735462 29.289649 +v 33.004776 146.799255 4.175527 +v -0.530910 154.987118 -17.312317 +v 27.443287 145.178571 18.638100 +v 27.652666 152.592610 -9.342095 +v 12.974696 153.969309 -13.967620 +v 12.985450 143.353395 26.816130 +v -33.763582 147.448314 6.322785 +v -28.303072 144.919602 21.696443 +v -28.704327 152.253245 -9.357549 +v -14.031971 153.806684 -13.975025 +v -14.021209 143.190770 26.808724 +v 26.102614 178.461557 32.228038 +v 26.125723 191.262389 1.835777 +v -0.503611 176.128882 38.513873 +v 30.852732 184.172657 17.498351 +v -0.471524 193.612348 -3.989102 +v 12.246186 177.246719 35.501657 +v 12.273982 192.486238 -1.197780 +v -27.100727 178.488355 32.198913 +v -27.077633 191.289211 1.806649 +v -31.828940 184.204247 17.464030 +v -13.249117 177.259570 35.487715 +v -13.221344 192.499101 -1.211725 +v 47.498214 161.651522 36.612800 +v 56.809062 150.441900 21.077668 +v 66.156250 156.942706 28.441645 +v 55.705810 162.436777 37.089834 +v 48.282483 151.381222 23.069870 +v 45.179868 156.322949 32.156406 +v 66.277772 153.072730 22.720687 +v 64.897013 161.148804 33.378810 +v -49.586394 156.369658 48.957644 +v -62.382197 147.724265 34.427532 +v -69.583690 154.756482 43.423955 +v -57.422698 158.158430 50.689600 +v -53.653157 147.402054 35.174426 +v -48.680204 151.166375 43.933492 +v -71.031857 151.403493 37.595805 +v -67.086971 158.356615 48.329238 +v 40.507352 195.981888 24.971906 +v 43.326479 204.667665 6.441700 +v 52.266294 207.198073 10.477553 +v 53.153920 203.773358 17.792445 +v 50.083047 200.947789 24.133676 +v 30.717915 194.982793 15.109808 +v 31.626990 192.875067 24.149284 +v 34.357905 201.412178 5.918154 +v -43.185216 197.887593 33.742405 +v -44.938195 199.461927 13.219042 +v -53.776723 203.772810 15.649712 +v -55.079490 203.267292 23.654188 +v -52.368987 202.747135 30.725816 +v -33.249983 192.857198 25.371067 +v -34.524873 194.200259 34.511755 +v -36.207554 195.738878 14.324720 +v 5.670239 97.931773 41.583421 +v 13.075978 96.228454 54.894783 +v 34.976450 97.576370 49.432974 +v 25.328973 96.577790 54.374345 +v 13.347104 97.749728 36.492913 +v 33.465868 97.278089 41.585135 +v 5.331250 97.042825 49.058129 +v -9.110621 73.444964 9.256196 +v -18.788624 66.290478 24.930277 +v -39.529181 72.360751 16.296660 +v -30.839872 68.090145 23.191058 +v -15.861775 76.067806 1.858139 +v -36.701599 75.153930 6.211673 +v -10.082087 69.101307 18.534168 +vt 0.255597 0.215743 +vt 0.934928 0.054984 +vt 0.748724 0.380794 +vt 0.763261 0.656022 +vt 0.532102 0.902649 +vt 0.861307 0.830073 +vt 0.881621 0.944002 +vt 0.932294 0.095822 +vt 0.970997 0.095822 +vt 0.865123 0.635262 +vt 0.715282 0.734795 +vt 0.699215 0.546547 +vt 0.803196 0.391068 +vt 0.794904 0.677014 +vt 0.941572 0.917780 +vt 0.118265 0.286051 +vt 0.663860 0.828975 +vt 0.031049 0.275075 +vt 0.844856 0.823697 +vt 0.595682 0.204124 +vt 0.011363 0.854676 +vt 0.266383 0.646033 +vt 0.724135 0.790230 +vt 0.253997 0.479174 +vt 0.971375 0.156150 +vt 0.928252 0.156136 +vt 0.621016 0.122612 +vt 0.059475 0.326819 +vt 0.059362 0.257746 +vt 0.770492 0.925697 +vt 0.683603 0.550467 +vt 0.779342 0.664126 +vt 0.118173 0.204123 +vt 0.315031 0.842108 +vt 0.414559 0.747483 +vt 0.399518 0.701783 +vt 0.448949 0.694770 +vt 0.357633 0.299914 +vt 0.418603 0.335552 +vt 0.422363 0.207716 +vt 0.376599 0.479159 +vt 0.414096 0.254865 +vt 0.785443 0.156150 +vt 0.313716 0.329378 +vt 0.314870 0.441555 +vt 0.745241 0.200706 +vt 0.711885 0.163092 +vt 0.758294 0.814508 +vt 0.678439 0.843499 +vt 0.655078 0.156147 +vt 0.680259 0.911002 +vt 0.621056 0.095820 +vt 0.913926 0.095821 +vt 0.912643 0.364253 +vt 0.666521 0.709568 +vt 0.745182 0.648362 +vt 0.285942 0.441555 +vt 0.891403 0.648951 +vt 0.671485 0.670160 +vt 0.370455 0.709217 +vt 0.329588 0.744940 +vt 0.331063 0.794428 +vt 0.366602 0.325961 +vt 0.936018 0.819789 +vt 0.885325 0.783977 +vt 0.505141 0.748829 +vt 0.313509 0.286997 +vt 0.746362 0.095822 +vt 0.427685 0.190243 +vt 0.681635 0.941705 +vt 0.691822 0.122612 +vt 0.936061 0.627368 +vt 0.059440 0.302276 +vt 0.971794 0.122612 +vt 0.241265 0.839077 +vt 0.194143 0.656045 +vt 0.095483 0.657314 +vt 0.714237 0.884771 +vt 0.984892 0.108499 +vt 0.118260 0.275008 +vt 0.093831 0.238570 +vt 0.845604 0.622687 +vt 0.897126 0.516070 +vt 0.701529 0.627703 +vt 0.669471 0.627536 +vt 0.176090 0.220682 +vt 0.825771 0.609744 +vt 0.658998 0.614197 +vt 0.765055 0.108499 +vt 0.595550 0.302456 +vt 0.386734 0.795098 +vt 0.917720 0.427678 +vt 0.881044 0.356556 +vt 0.634500 0.156150 +vt 0.985614 0.217712 +vt 0.176196 0.286099 +vt 0.118222 0.220700 +vt 0.208695 0.372787 +vt 0.733559 0.579024 +vt 0.757870 0.677015 +vt 0.071962 0.534946 +vt 0.881647 0.520255 +vt 0.906398 0.917771 +vt 0.794526 0.663780 +vt 0.766667 0.356086 +vt 0.785862 0.122612 +vt 0.068619 0.942013 +vt 0.214951 0.441555 +vt 0.211924 0.254886 +vt 0.176168 0.302520 +vt 0.059279 0.238666 +vt 0.480612 0.326823 +vt 0.345824 0.512586 +vt 0.420373 0.176908 +vt 0.825597 0.780492 +vt 0.934622 0.732855 +vt 0.343730 0.404567 +vt 0.313963 0.358401 +vt 0.806968 0.108499 +vt 0.566790 0.204124 +vt 0.333959 0.884940 +vt 0.741199 0.848260 +vt 0.093852 0.354952 +vt 0.934523 0.917621 +vt 0.751631 0.535644 +vt 0.734432 0.824734 +vt 0.299459 0.284656 +vt 0.917882 0.833832 +vt 0.347330 0.708825 +vt 0.338145 0.328760 +vt 0.859513 0.095822 +vt 0.506734 0.204123 +vt 0.382303 0.875623 +vt 0.915423 0.782034 +vt 0.875706 0.338668 +vt 0.673889 0.744932 +vt 0.726155 0.711178 +vt 0.863677 0.647862 +vt 0.683726 0.579931 +vt 0.889616 0.328988 +vt 0.864084 0.887068 +vt 0.651369 0.848259 +vt 0.876501 0.831755 +vt 0.416751 0.128948 +vt 0.859440 0.108499 +vt 0.097049 0.903456 +vt 0.247850 0.179997 +vt 0.635921 0.656300 +vt 0.749903 0.756858 +vt 0.214392 0.891615 +vt 0.908832 0.156121 +vt 0.277433 0.794536 +vt 0.827484 0.332708 +vt 0.829185 0.383372 +vt 0.896042 0.940231 +vt 0.872376 0.787311 +vt 0.933272 0.316595 +vt 0.343869 0.535021 +vt 0.352581 0.794437 +vt 0.416158 0.512649 +vt 0.344804 0.479148 +vt 0.374336 0.441555 +vt 0.798985 0.122612 +vt 0.566812 0.275036 +vt 0.942698 0.370129 +vt 0.731506 0.809276 +vt 0.285957 0.091875 +vt 0.936057 0.576206 +vt 0.741245 0.605142 +vt 0.730059 0.016269 +vt 0.856202 0.016269 +vt 0.765027 0.054984 +vt 0.315138 0.054235 +vt 0.856880 0.054984 +vt 0.876366 0.054983 +vt 0.875816 0.016269 +vt 0.746963 0.789506 +vt 0.733420 0.750248 +vt 0.654936 0.054984 +vt 0.335864 0.210609 +vt 0.631977 0.231864 +vt 0.030921 0.220705 +vt 0.871852 0.553715 +vt 0.784753 0.387128 +vt 0.747228 0.672502 +vt 0.762619 0.936895 +vt 0.750033 0.585655 +vt 0.711877 0.936747 +vt 0.737140 0.805935 +vt 0.259406 0.709407 +vt 0.861333 0.659431 +vt 0.093876 0.257696 +vt 0.651688 0.827846 +vt 0.461737 0.792426 +vt 0.535122 0.656711 +vt 0.621565 0.796099 +vt 0.567369 0.879717 +vt 0.617289 0.699781 +vt 0.349273 0.747190 +vt 0.506526 0.274998 +vt 0.895628 0.374273 +vt 0.881207 0.690837 +vt 0.696701 0.941705 +vt 0.745745 0.941028 +vt 0.739082 0.837215 +vt 0.787716 0.631988 +vt 0.314782 0.941388 +vt 0.744669 0.663180 +vt 0.818111 0.917687 +vt 0.654909 0.122612 +vt 0.676547 0.677015 +vt 0.923354 0.589708 +vt 0.761520 0.615688 +vt 0.663963 0.911002 +vt 0.893990 0.163092 +vt 0.093919 0.302358 +vt 0.719028 0.546474 +vt 0.652656 0.811979 +vt 0.031066 0.286124 +vt 0.644711 0.596297 +vt 0.736483 0.548184 +vt 0.715467 0.563548 +vt 0.672552 0.660852 +vt 0.718851 0.717725 +vt 0.532541 0.354952 +vt 0.419137 0.937326 +vt 0.506548 0.257674 +vt 0.345500 0.054288 +vt 0.377299 0.292342 +vt 0.506639 0.354952 +vt 0.748996 0.054984 +vt 0.917673 0.409579 +vt 0.449646 0.286082 +vt 0.892080 0.360976 +vt 0.344319 0.128948 +vt 0.820014 0.122612 +vt 0.532490 0.286028 +vt 0.782896 0.016268 +vt 0.414725 0.374942 +vt 0.566822 0.326817 +vt 0.514661 0.872259 +vt 0.857000 0.744904 +vt 0.936077 0.668483 +vt 0.726011 0.777908 +vt 0.681201 0.821956 +vt 0.868635 0.564528 +vt 0.844827 0.609883 +vt 0.744649 0.834372 +vt 0.651714 0.656493 +vt 0.595706 0.220705 +vt 0.817908 0.231864 +vt 0.859366 0.122612 +vt 0.666683 0.936525 +vt 0.161589 0.882055 +vt 0.194848 0.354981 +vt 0.240092 0.219225 +vt 0.710682 0.811176 +vt 0.059492 0.354952 +vt 0.093754 0.204124 +vt 0.315731 0.512570 +vt 0.480593 0.274987 +vt 0.756045 0.773861 +vt 0.071392 0.577421 +vt 0.621289 0.016268 +vt 0.190858 0.203868 +vt 0.751861 0.659762 +vt 0.728583 0.733966 +vt 0.603163 0.577407 +vt 0.580062 0.754791 +vt 0.414742 0.441555 +vt 0.895904 0.200711 +vt 0.936053 0.746623 +vt 0.506519 0.286032 +vt 0.806711 0.156148 +vt 0.595019 0.704367 +vt 0.845674 0.754660 +vt 0.886620 0.697803 +vt 0.712850 0.911002 +vt 0.751425 0.706855 +vt 0.205395 0.840356 +vt 0.289297 0.329143 +vt 0.237038 0.193441 +vt 0.797433 0.319246 +vt 0.917897 0.663357 +vt 0.175964 0.354952 +vt 0.885620 0.549316 +vt 0.859570 0.619998 +vt 0.794901 0.848257 +vt 0.145242 0.302415 +vt 0.827672 0.401768 +vt 0.638034 0.794237 +vt 0.770097 0.809706 +vt 0.673508 0.108499 +vt 0.755280 0.669527 +vt 0.119669 0.577423 +vt 0.008122 0.795077 +vt 0.729146 0.911001 +vt 0.699642 0.883044 +vt 0.746509 0.122612 +vt 0.742320 0.156136 +vt 0.480773 0.354952 +vt 0.121499 0.706399 +vt 0.307265 0.286217 +vt 0.210380 0.317703 +vt 0.025045 0.534903 +vt 0.732176 0.523263 +vt 0.027453 0.795879 +vt 0.343495 0.091877 +vt 0.374628 0.091879 +vt 0.840838 0.016269 +vt 0.214464 0.091875 +vt 0.950999 0.016269 +vt 0.267320 0.274905 +vt 0.775283 0.328531 +vt 0.145255 0.286054 +vt 0.296112 0.884965 +vt 0.145244 0.274996 +vt 0.740023 0.822211 +vt 0.245931 0.535039 +vt 0.249624 0.292358 +vt 0.924484 0.570357 +vt 0.724212 0.618997 +vt 0.743897 0.740484 +vt 0.650728 0.911086 +vt 0.775611 0.765710 +vt 0.936077 0.838896 +vt 0.347826 0.577463 +vt 0.382847 0.535032 +vt 0.910614 0.334381 +vt 0.831510 0.796107 +vt 0.549707 0.794263 +vt 0.850748 0.805248 +vt 0.412883 0.292280 +vt 0.879460 0.743643 +vt 0.506530 0.302339 +vt 0.285805 0.479156 +vt 0.948678 0.563037 +vt 0.914714 0.939860 +vt 0.674036 0.573634 +vt 0.832383 0.595050 +vt 0.888276 0.556840 +vt 0.655630 0.626375 +vt 0.736307 0.719414 +vt 0.275598 0.840835 +vt 0.681227 0.650664 +vt 0.709972 0.232115 +vt 0.820412 0.108499 +vt 0.765025 0.095821 +vt 0.747331 0.888913 +vt 0.069552 0.635446 +vt 0.973876 0.209717 +vt 0.641034 0.610282 +vt 0.690377 0.054983 +vt 0.747050 0.618300 +vt 0.723396 0.575823 +vt 0.031124 0.326827 +vt 0.762210 0.560416 +vt 0.666038 0.813500 +vt 0.595512 0.326825 +vt 0.325529 0.253434 +vt 0.820432 0.156150 +vt 0.206881 0.967319 +vt 0.293325 0.304171 +vt 0.243254 0.323720 +vt 0.763232 0.827184 +vt 0.285068 0.404567 +vt 0.388845 0.838885 +vt 0.252561 0.404567 +vt 0.648575 0.752749 +vt 0.184361 0.577417 +vt 0.973899 0.231864 +vt 0.697013 0.172839 +vt 0.951042 0.122612 +vt 0.176147 0.274965 +vt 0.709177 0.537312 +vt 0.896530 0.917771 +vt 0.767486 0.666511 +vt 0.727561 0.938163 +vt 0.718747 0.798862 +vt 0.697257 0.814380 +vt 0.688358 0.652787 +vt 0.785169 0.791226 +vt 0.249199 0.274905 +vt 0.731965 0.694501 +vt 0.723221 0.747063 +vt 0.486594 0.948330 +vt 0.598626 0.752337 +vt 0.620532 0.750242 +vt 0.377222 0.128952 +vt 0.877753 0.122612 +vt 0.582610 0.796170 +vt 0.798960 0.108499 +vt 0.935973 0.782601 +vt 0.901378 0.423637 +vt 0.914557 0.725788 +vt 0.670948 0.054984 +vt 0.877480 0.819001 +vt 0.689760 0.595785 +vt 0.913990 0.108499 +vt 0.313408 0.304910 +vt 0.449654 0.257610 +vt 0.351430 0.248123 +vt 0.345144 0.178504 +vt 0.840859 0.095821 +vt 0.785065 0.095822 +vt 0.435707 0.203873 +vt 0.532519 0.257694 +vt 0.506529 0.326822 +vt 0.765086 0.122612 +vt 0.692503 0.712229 +vt 0.371733 0.216071 +vt 0.736641 0.940160 +vt 0.757876 0.848260 +vt 0.686221 0.838135 +vt 0.765163 0.797322 +vt 0.669891 0.677015 +vt 0.686042 0.524352 +vt 0.738188 0.889775 +vt 0.676559 0.848260 +vt 0.708647 0.518689 +vt 0.676012 0.602550 +vt 0.696555 0.911002 +vt 0.785826 0.405163 +vt 0.329344 0.703695 +vt 0.941792 0.356512 +vt 0.031763 0.751718 +vt 0.284332 0.935822 +vt 0.282127 0.577464 +vt 0.294776 0.271386 +vt 0.252661 0.512749 +vt 0.059422 0.286044 +vt 0.030934 0.204124 +vt 0.838730 0.600779 +vt 0.916266 0.917771 +vt 0.865460 0.753064 +vt 0.688336 0.824075 +vt 0.679473 0.664199 +vt 0.207156 0.229503 +vt 0.749674 0.016269 +vt 0.417869 0.054390 +vt 0.807180 0.054984 +vt 0.774189 0.910992 +vt 0.652548 0.923774 +vt 0.212078 0.054277 +vt 0.984631 0.054984 +vt 0.670270 0.016269 +vt 0.637047 0.016268 +vt 0.133578 0.975415 +vt 0.933965 0.232049 +vt 0.739084 0.666015 +vt 0.745139 0.819551 +vt 0.796272 0.333957 +vt 0.781184 0.780586 +vt 0.770153 0.638555 +vt 0.865024 0.805893 +vt 0.298944 0.794473 +vt 0.872446 0.598246 +vt 0.655822 0.561957 +vt 0.937875 0.903075 +vt 0.831347 0.917772 +vt 0.255333 0.441555 +vt 0.651216 0.838339 +vt 0.835136 0.812201 +vt 0.566815 0.302227 +vt 0.544300 0.865660 +vt 0.532485 0.275009 +vt 0.314901 0.703498 +vt 0.444090 0.534948 +vt 0.506620 0.220701 +vt 0.416097 0.891155 +vt 0.507142 0.792801 +vt 0.917627 0.391481 +vt 0.879743 0.573056 +vt 0.202444 0.993810 +vt 0.651365 0.677015 +vt 0.785249 0.620097 +vt 0.684668 0.883866 +vt 0.093936 0.326823 +vt 0.031084 0.302521 +vt 0.314171 0.231740 +vt 0.238048 0.352770 +vt 0.249789 0.357798 +vt 0.173187 0.745804 +vt 0.950965 0.095821 +vt 0.145141 0.354952 +vt 0.212772 0.376778 +vt 0.449673 0.326828 +vt 0.794502 0.834892 +vt 0.872530 0.616702 +vt 0.749140 0.351639 +vt 0.767140 0.911152 +vt 0.282503 0.708944 +vt 0.699037 0.717821 +vt 0.779389 0.677016 +vt 0.566827 0.354952 +vt 0.566782 0.220717 +vt 0.806383 0.217712 +vt 0.480859 0.204123 +vt 0.449661 0.302478 +vt 0.319754 0.286217 +vt 0.431990 0.354981 +vt 0.345577 0.936058 +vt 0.362648 0.645806 +vt 0.377580 0.274898 +vt 0.894062 0.694357 +vt 0.692397 0.606771 +vt 0.691886 0.108499 +vt 0.764617 0.362075 +vt 0.904024 0.888613 +vt 0.634082 0.122612 +vt 0.691950 0.095821 +vt 0.030929 0.238598 +vt 0.495723 0.973192 +vt 0.436532 0.655316 +vt 0.509270 0.534980 +vt 0.728733 0.562733 +vt 0.114850 0.872809 +vt 0.737870 0.373475 +vt 0.834066 0.892248 +vt 0.738203 0.591970 +vt 0.782396 0.317514 +vt 0.464884 0.838834 +vt 0.948365 0.733420 +vt 0.418691 0.370972 +vt 0.449682 0.238404 +vt 0.532558 0.220707 +vt 0.566800 0.257742 +vt 0.532482 0.302308 +vt 0.583674 0.890608 +vt 0.709972 0.200711 +vt 0.942118 0.402143 +vt 0.211458 0.128944 +vt 0.638119 0.622878 +vt 0.756154 0.602668 +vt 0.676524 0.647357 +vt 0.891428 0.633182 +vt 0.867026 0.945729 +vt 0.207736 0.335642 +vt 0.027199 0.901816 +vt 0.059305 0.204124 +vt 0.924213 0.719241 +vt 0.741198 0.677015 +vt 0.028247 0.577410 +vt 0.863938 0.917771 +vt 0.851688 0.591814 +vt 0.850848 0.634574 +vt 0.938408 0.927193 +vt 0.985209 0.156148 +vt 0.731566 0.638069 +vt 0.327559 0.284656 +vt 0.480599 0.257655 +vt 0.940634 0.420541 +vt 0.424097 0.965195 +vt 0.863138 0.381292 +vt 0.086190 0.724548 +vt 0.673434 0.122612 +vt 0.675902 0.773849 +vt 0.697044 0.156121 +vt 0.047164 0.795723 +vt 0.876523 0.661158 +vt 0.685829 0.695635 +vt 0.767474 0.837667 +vt 0.936019 0.649366 +vt 0.672536 0.832167 +vt 0.282910 0.178142 +vt 0.764725 0.156147 +vt 0.787967 0.231864 +vt 0.709972 0.171386 +vt 0.895904 0.171386 +vt 0.820810 0.095822 +vt 0.532559 0.238577 +vt 0.414680 0.091883 +vt 0.387039 0.219621 +vt 0.418946 0.229929 +vt 0.787944 0.209717 +vt 0.891695 0.833437 +vt 0.124974 0.748995 +vt 0.145087 0.204123 +vt 0.059276 0.220716 +vt 0.761358 0.338190 +vt 0.662728 0.668313 +vt 0.093909 0.286048 +vt 0.655557 0.797710 +vt 0.620779 0.156148 +vt 0.905572 0.938997 +vt 0.035870 0.704195 +vt 0.546804 0.757119 +vt 0.334433 0.243039 +vt 0.936059 0.797784 +vt 0.891324 0.803735 +vt 0.836471 0.804603 +vt 0.746436 0.108499 +vt 0.728058 0.108499 +vt 0.818658 0.776896 +vt 0.508784 0.706093 +vt 0.428443 0.990876 +vt 0.764041 0.893569 +vt 0.696225 0.747399 +vt 0.769187 0.749663 +vt 0.739015 0.911001 +vt 0.702738 0.563637 +vt 0.084989 0.865972 +vt 0.080136 0.794155 +vt 0.215164 0.479218 +vt 0.914054 0.122612 +vt 0.748883 0.911001 +vt 0.621036 0.108499 +vt 0.916692 0.634633 +vt 0.828300 0.369754 +vt 0.654009 0.898398 +vt 0.777696 0.360523 +vt 0.885267 0.719886 +vt 0.333829 0.303559 +vt 0.377808 0.356778 +vt 0.314103 0.176477 +vt 0.415450 0.479198 +vt 0.383845 0.322909 +vt 0.863555 0.156136 +vt 0.751837 0.830942 +vt 0.206812 0.794023 +vt 0.301489 0.253434 +vt 0.950969 0.054984 +vt 0.737201 0.634733 +vt 0.676496 0.818660 +vt 0.798935 0.095820 +vt 0.247827 0.250786 +vt 0.950589 0.156147 +vt 0.145191 0.220694 +vt 0.769330 0.578484 +vt 0.770171 0.848260 +vt 0.685748 0.848259 +vt 0.831637 0.625377 +vt 0.602276 0.796592 +vt 0.798255 0.363832 +vt 0.914893 0.555304 +vt 0.894491 0.523813 +vt 0.744045 0.569271 +vt 0.424701 0.840048 +vt 0.456853 0.745548 +vt 0.379110 0.250741 +vt 0.508074 0.837122 +vt 0.559814 0.940878 +vt 0.914994 0.703678 +vt 0.771025 0.901580 +vt 0.762033 0.731608 +vt 0.791133 0.816315 +vt 0.741140 0.776355 +vt 0.081566 0.837294 +vt 0.651227 0.666984 +vt 0.690416 0.564106 +vt 0.872238 0.768855 +vt 0.779325 0.835265 +vt 0.685735 0.677015 +vt 0.913751 0.650767 +vt 0.692294 0.778048 +vt 0.908862 0.172839 +vt 0.897817 0.163092 +vt 0.932368 0.108499 +vt 0.654938 0.095821 +vt 0.679462 0.835501 +vt 0.636687 0.810221 +vt 0.755272 0.840706 +vt 0.692687 0.540948 +vt 0.849446 0.644672 +vt 0.251290 0.128949 +vt 0.865716 0.582435 +vt 0.911752 0.319669 +vt 0.595566 0.286095 +vt 0.414734 0.404572 +vt 0.449670 0.274956 +vt 0.023577 0.623156 +vt 0.185223 0.534962 +vt 0.284195 0.358809 +vt 0.009998 0.749349 +vt 0.212908 0.274933 +vt 0.145236 0.326824 +vt 0.702554 0.734897 +vt 0.765233 0.626167 +vt 0.915395 0.533196 +vt 0.729510 0.054983 +vt 0.782949 0.054984 +vt 0.822926 0.054984 +vt 0.260662 0.326638 +vt 0.209691 0.018239 +vt 0.644587 0.767637 +vt 0.247220 0.018239 +vt 0.250975 0.054268 +vt 0.968881 0.054984 +vt 0.695283 0.790443 +vt 0.314749 0.091873 +vt 0.748033 0.232049 +vt 0.857842 0.232049 +vt 0.449796 0.204123 +vt 0.480685 0.220695 +vt 0.211767 0.938667 +vt 0.306484 0.250312 +vt 0.830902 0.615677 +vt 0.913129 0.887745 +vt 0.710741 0.639927 +vt 0.314290 0.247970 +vt 0.775733 0.594543 +vt 0.753212 0.799839 +vt 0.280653 0.747292 +vt 0.701454 0.798968 +vt 0.620451 0.217712 +vt 0.726110 0.606671 +vt 0.916592 0.805110 +vt 0.376072 0.404566 +vt 0.480601 0.302370 +vt 0.314357 0.535019 +vt 0.785464 0.108499 +vt 0.838529 0.771488 +vt 0.561397 0.634699 +vt 0.799277 0.156148 +vt 0.595699 0.238600 +vt 0.830746 0.786410 +vt 0.272406 0.880931 +vt 0.606192 0.534877 +vt 0.781225 0.373826 +vt 0.847642 0.917771 +vt 0.044980 0.890795 +vt 0.849018 0.887068 +vt 0.828470 0.646582 +vt 0.844654 0.780574 +vt 0.882945 0.172839 +vt 0.566782 0.238670 +vt 0.083305 0.923173 +vt 0.249910 0.749310 +vt 0.631999 0.209717 +vt 0.677624 0.156136 +vt 0.849376 0.815349 +vt 0.753283 0.628664 +vt 0.857280 0.574250 +vt 0.689595 0.809913 +vt 0.818957 0.316206 +vt 0.709972 0.163211 +vt 0.415778 0.316747 +vt 0.314985 0.741795 +vt 0.030751 0.849572 +vt 0.050209 0.754404 +vt 0.297897 0.842557 +vt 0.122778 0.792952 +vt 0.674703 0.200706 +vt 0.689838 0.016269 +vt 0.176179 0.257611 +vt 0.758344 0.643339 +vt 0.663002 0.601458 +vt 0.247489 0.577466 +vt 0.118262 0.326824 +vt 0.347504 0.018238 +vt 0.728658 0.888542 +vt 0.826158 0.420164 +vt 0.840857 0.054984 +vt 0.566812 0.286023 +vt 0.449765 0.354952 +vt 0.314959 0.577465 +vt 0.545515 0.922196 +vt 0.357743 0.880856 +vt 0.332172 0.842510 +vt 0.314578 0.640560 +vt 0.445393 0.577416 +vt 0.315019 0.885796 +vt 0.532625 0.204124 +vt 0.877882 0.095821 +vt 0.840811 0.122612 +vt 0.761434 0.786870 +vt 0.145241 0.257656 +vt 0.636994 0.054984 +vt 0.145210 0.238484 +vt 0.740064 0.651011 +vt 0.339216 0.643866 +vt 0.558656 0.534925 +vt 0.891345 0.819504 +vt 0.915135 0.377867 +vt 0.636356 0.848259 +vt 0.314003 0.207365 +vt 0.924192 0.740812 +vt 0.728122 0.122612 +vt 0.617431 0.855287 +vt 0.607811 0.622342 +vt 0.806988 0.095820 +vt 0.885913 0.762972 +vt 0.812448 0.795354 +vt 0.858562 0.774738 +vt 0.906472 0.711107 +vt 0.775239 0.650769 +vt 0.663882 0.657641 +vt 0.900278 0.405603 +vt 0.121636 0.837433 +vt 0.728493 0.586086 +vt 0.213159 0.292296 +vt 0.738081 0.763188 +vt 0.803234 0.427265 +vt 0.725417 0.642145 +vt 0.696399 0.576131 +vt 0.863616 0.818497 +vt 0.728335 0.757320 +vt 0.293315 0.242924 +vt 0.275823 0.248153 +vt 0.708432 0.689949 +vt 0.971395 0.108499 +vt 0.204472 0.190753 +vt 0.924568 0.548786 +vt 0.878275 0.634222 +vt 0.718813 0.627622 +vt 0.230402 0.702057 +vt 0.791176 0.645197 +vt 0.031128 0.354952 +vt 0.725362 0.813361 +vt 0.882975 0.156121 +vt 0.806948 0.122612 +vt 0.899177 0.387570 +vt 0.243291 0.795273 +vt 0.050187 0.844482 +vt 0.013882 0.699460 +vt 0.931173 0.200706 +vt 0.878174 0.804814 +vt 0.673582 0.095822 +vt 0.654923 0.108499 +vt 0.662889 0.772774 +vt 0.877540 0.648407 +vt 0.821392 0.930376 +vt 0.879260 0.892026 +vt 0.727889 0.595831 +vt 0.315528 0.018181 +vt 0.765051 0.016269 +vt 0.284744 0.054246 +vt 0.283530 0.018181 +vt 0.254730 0.091874 +vt 0.662989 0.848260 +vt 0.654925 0.016269 +vt 0.118252 0.257676 +vt 0.691285 0.585364 +vt 0.727994 0.095821 +vt 0.215427 0.747718 +vt 0.176125 0.238395 +vt 0.636358 0.838542 +vt 0.770165 0.677015 +vt 0.695369 0.619169 +vt 0.379817 0.180762 +vt 0.787648 0.803114 +vt 0.984867 0.095820 +vt 0.083344 0.757041 +vt 0.931424 0.935204 +vt 0.648718 0.581418 +vt 0.544177 0.724490 +vt 0.390341 0.194177 +vt 0.941824 0.333084 +vt 0.871512 0.724326 +vt 0.845468 0.793376 +vt 0.598269 0.849956 +vt 0.887944 0.727402 +vt 0.315301 0.479147 +vt 0.423209 0.793785 +vt 0.579037 0.844668 +vt 0.669298 0.887352 +vt 0.749692 0.677015 +vt 0.775207 0.821912 +vt 0.887040 0.527237 +vt 0.678758 0.763215 +vt 0.819931 0.904999 +vt 0.786898 0.423198 +vt 0.880234 0.917771 +vt 0.678881 0.591921 +vt 0.836681 0.941421 +vt 0.213861 0.404572 +vt 0.254612 0.922405 +vt 0.284898 0.535025 +vt 0.818842 0.606128 +vt 0.749698 0.848260 +vt 0.118261 0.302386 +vt 0.683428 0.721761 +vt 0.031009 0.257741 +vt 0.844902 0.653006 +vt 0.354491 0.840733 +vt 0.315002 0.794084 +vt 0.799682 0.217712 +vt 0.480577 0.286036 +vt 0.375705 0.922558 +vt 0.595621 0.257734 +vt 0.595500 0.354952 +vt 0.863509 0.352136 +vt 0.852273 0.373989 +vt 0.165057 0.839231 +vt 0.916038 0.016269 +vt 0.935975 0.612170 +vt 0.689617 0.767062 +vt 0.300463 0.703752 +vt 0.662980 0.677015 +vt 0.652694 0.640638 +vt 0.666074 0.642176 +vt 0.671987 0.788046 +vt 0.689654 0.638630 +vt 0.667739 0.587337 +vt 0.636733 0.638857 +vt 0.691125 0.756638 +vt 0.669902 0.848260 +vt 0.093911 0.275019 +vt 0.906852 0.540600 +vt 0.449700 0.220684 +vt 0.573455 0.711359 +vt 0.359600 0.274896 +vt 0.601115 0.901709 +vt 0.877818 0.108499 +vt 0.923121 0.760166 +vt 0.480652 0.238492 +vt 0.824181 0.797634 +vt 0.828406 0.817321 +vt 0.851461 0.762485 +vt 0.779396 0.848260 +vt 0.871271 0.716399 +vt 0.151460 0.924131 +vt 0.835215 0.641481 +vt 0.690265 0.735383 +vt 0.697308 0.643104 +vt 0.284433 0.128947 +vt 0.634879 0.095822 +vt 0.175901 0.204123 +vt 0.208452 0.175985 +vt 0.803215 0.409166 +vt 0.913699 0.821253 +vt 0.669398 0.798853 +vt 0.059417 0.275048 +vt 0.934937 0.562431 +vt 0.845924 0.583972 +vt 0.595577 0.275057 +vt 0.722900 0.156121 +vt 0.468357 0.881332 +vt 0.532468 0.326821 +vt 0.247916 0.875817 +vt 0.057188 0.711303 +vt 0.300327 0.744987 +vt 0.671483 0.841478 +vt 0.984917 0.122612 +vt 0.176146 0.326829 +vt 0.684166 0.635721 +vt 0.061577 0.879960 +vt 0.686228 0.666838 +vt 0.684106 0.807013 +vt 0.634480 0.108499 +vt 0.915592 0.611553 +vt 0.798699 0.054984 +vt 0.379180 0.054356 +vt 0.383732 0.018359 +vt 0.421058 0.018359 +vt 0.798648 0.016268 +vt 0.822979 0.016268 +vt 0.807221 0.016268 +vt 0.635893 0.827677 +vt 0.658905 0.785523 +vt 0.621248 0.054984 +vt 0.895904 0.163211 +vt 0.841092 0.156147 +vt 0.291825 0.210419 +vt 0.671910 0.232049 +vt 0.836574 0.633887 +vt 0.708990 0.708576 +vt 0.824304 0.626881 +vt 0.636356 0.677015 +vt 0.827416 0.356136 +vt 0.118215 0.354952 +vt 0.269410 0.300468 +vt 0.858753 0.604088 +vt 0.781285 0.609428 +vt 0.413016 0.274926 +vt 0.389352 0.351632 +vt 0.343676 0.358303 +vt 0.868327 0.735148 +vt 0.314416 0.404567 +vt 0.382595 0.577465 +vt 0.332242 0.271386 +vt 0.559529 0.577420 +vt 0.547922 0.837220 +vt 0.936048 0.768188 +vt 0.379997 0.749138 +vt 0.683588 0.751217 +vt 0.314426 0.128944 +vt 0.879002 0.362548 +vt 0.885489 0.613407 +vt 0.886139 0.592404 +vt 0.289968 0.643994 +vt 0.891712 0.662885 +vt 0.894944 0.890609 +vt 0.093831 0.220705 +vt 0.871635 0.545787 +vt 0.896674 0.686606 +vt 0.817931 0.209717 +vt 0.168249 0.792680 +vt 0.120835 0.534998 +vt 0.708058 0.163092 +vt 0.662721 0.839648 +vt 0.930002 0.891877 +vt 0.968828 0.016268 +vt 0.812578 0.624567 +vt 0.378862 0.512649 +vt 0.860635 0.200706 +vt 0.896713 0.317960 +vt 0.478349 0.922822 +vt 0.343784 0.441555 +vt 0.943603 0.383745 +vt 0.727747 0.767067 +vt 0.181086 0.695152 +vt 0.143009 0.950086 +vt 0.203883 0.206876 +vt 0.285667 0.512634 +vt 0.915498 0.054983 +vt 0.935606 0.016269 +vt 0.800726 0.377450 +vt 0.726341 0.539931 +vt 0.859427 0.790645 +vt 0.734468 0.653528 +vt 0.666728 0.538248 +vt 0.722930 0.172839 +vt 0.895904 0.232115 +vt 0.215378 0.512749 +vt 0.667608 0.758644 +vt 0.932441 0.122612 +vt 0.936052 0.597770 +vt 0.852052 0.944907 +vt 0.510735 0.577421 +vt 0.832166 0.765778 +vt 0.678437 0.672191 +vt 0.655645 0.733289 +vt 0.747224 0.843692 +vt 0.672082 0.616741 +vt 0.636372 0.667162 +vt 0.984580 0.016268 +vt 0.640929 0.781632 +vt 0.321315 0.250312 +vn 0.951160 0.136654 0.276805 +vn 0.958716 -0.005099 0.284319 +vn 0.999720 -0.021077 -0.010783 +vn 0.985099 0.171952 0.003653 +vn 0.746390 0.664535 0.035996 +vn 0.726921 0.633936 0.264030 +vn 0.670892 0.437281 0.598907 +vn 0.779759 0.092332 0.619234 +vn 0.790179 0.032001 0.612040 +vn 0.360360 0.242447 -0.900755 +vn 0.323778 0.722256 -0.611159 +vn 0.636791 0.595757 -0.489460 +vn 0.771459 0.172296 -0.612507 +vn 0.782448 -0.006142 -0.622686 +vn 0.384560 0.006893 -0.923074 +vn 0.105189 0.277467 -0.954959 +vn 0.098890 0.020905 -0.994879 +vn 0.000000 0.026802 -0.999641 +vn -0.000001 0.279905 -0.960028 +vn -0.000001 0.772772 -0.634683 +vn 0.148943 0.760342 -0.632215 +vn 0.393355 -0.198897 -0.897614 +vn 0.776505 -0.159670 -0.609545 +vn 0.683520 -0.460965 -0.565961 +vn 0.405217 -0.577270 -0.708914 +vn 0.137862 -0.199219 -0.970209 +vn 0.170744 -0.626867 -0.760187 +vn -0.000001 -0.639839 -0.768509 +vn 0.000000 -0.197569 -0.980289 +vn 0.481912 -0.047972 0.874905 +vn 0.501460 -0.459370 0.733156 +vn 0.791282 -0.407856 0.455551 +vn 0.810808 -0.066131 0.581565 +vn 0.485472 0.058555 0.872289 +vn 0.138721 -0.055039 0.988801 +vn 0.152046 0.058062 0.986667 +vn 0.000000 0.049055 0.998796 +vn -0.000000 -0.064837 0.997896 +vn -0.000000 -0.592185 0.805802 +vn 0.215224 -0.595537 0.773960 +vn 0.442345 0.138213 0.886131 +vn 0.360263 0.573600 0.735659 +vn 0.180215 0.186666 0.965753 +vn 0.200528 0.625355 0.754135 +vn 0.000000 0.647955 0.761678 +vn 0.000000 0.180629 0.983551 +vn 0.956722 -0.132964 0.258852 +vn 0.840911 -0.519725 0.150847 +vn 0.817726 -0.570308 -0.077934 +vn 0.985518 -0.168355 -0.020260 +vn 0.954140 -0.163411 -0.250826 +vn 0.780000 -0.550050 -0.298406 +vn 0.967121 -0.016621 -0.253771 +vn 0.959024 0.158827 -0.234620 +vn 0.735168 0.654790 -0.175436 +vn 0.314858 0.907923 0.276660 +vn 0.343407 0.937827 0.050518 +vn 0.169287 0.940452 0.294776 +vn 0.137209 0.989113 0.053197 +vn 0.000000 0.998933 0.046191 +vn 0.000000 0.955901 0.293688 +vn 0.327686 0.930551 -0.163390 +vn 0.137257 0.973862 -0.180981 +vn -0.000000 0.983131 -0.182905 +vn 0.609533 -0.784843 -0.111767 +vn 0.514240 -0.843311 0.156152 +vn 0.583499 -0.784917 0.208409 +vn 0.815171 -0.573948 -0.077971 +vn 0.500772 -0.773479 -0.388532 +vn 0.155680 -0.832387 -0.531879 +vn -0.000007 -0.846949 -0.531674 +vn 0.220028 -0.936505 0.273030 +vn -0.000015 -0.961029 0.276446 +vn 0.690119 -0.601025 -0.403117 +vn 0.239791 -0.636004 -0.733484 +vn 0.680637 0.654264 0.329654 +vn 0.684377 0.685262 -0.249089 +vn 0.299739 -0.847345 0.438365 +vn -0.000176 -0.899110 0.437722 +vn -0.000573 -0.263322 0.964708 +vn 0.372088 -0.237890 0.897195 +vn 0.255359 0.875353 0.410548 +vn 0.284105 0.888493 -0.360368 +vn -0.000513 0.055455 0.998461 +vn 0.226262 0.084990 0.970352 +vn 0.673639 0.221237 0.705169 +vn 0.329796 0.474523 -0.816126 +vn 0.246929 0.422101 0.872271 +vn 0.191320 0.598141 -0.778218 +vn 0.814011 0.561230 0.149687 +vn 0.550907 0.070319 -0.831599 +vn -0.580514 0.314900 -0.750894 +vn -0.976423 -0.090967 -0.195763 +vn 0.189633 0.405212 -0.894339 +vn 0.235607 0.394353 -0.888243 +vn 0.608833 0.131916 -0.782253 +vn 0.205889 0.201834 -0.957535 +vn 0.232468 -0.008224 0.972569 +vn -0.000548 -0.009947 0.999950 +vn -0.000616 -0.151032 0.988529 +vn 0.240020 -0.141522 0.960397 +vn 0.293590 -0.200916 0.934579 +vn 0.685409 -0.131826 0.716126 +vn -0.526368 -0.219808 0.821353 +vn 0.279386 -0.351450 0.893547 +vn 0.337704 -0.116186 0.934054 +vn -0.001805 -0.098676 0.995118 +vn 0.042627 -0.092578 0.994793 +vn 0.380140 -0.127847 0.916051 +vn 0.686958 0.268462 -0.675290 +vn 0.989343 0.140885 -0.036763 +vn 0.995453 0.093791 -0.016639 +vn 0.684541 0.057275 -0.726720 +vn 0.798166 -0.028579 0.601759 +vn 0.755306 -0.022911 0.654971 +vn 0.284663 0.299401 -0.910673 +vn 0.298392 0.016465 -0.954301 +vn 0.225812 0.185252 -0.956395 +vn 0.729591 0.111141 -0.674792 +vn 0.733884 0.230060 -0.639130 +vn 0.252184 0.304740 -0.918442 +vn 0.999521 -0.028719 -0.011506 +vn 0.717709 -0.168772 0.675581 +vn 0.701812 -0.205631 0.682038 +vn 0.999104 0.030610 0.029232 +vn 0.242324 -0.213788 0.946348 +vn -0.000644 -0.219226 0.975674 +vn -0.000419 -0.255742 0.966745 +vn 0.270523 -0.268899 0.924397 +vn 0.630432 0.687561 0.360298 +vn 0.467361 0.352250 0.810860 +vn 0.623411 0.013989 0.781769 +vn 0.870118 0.403111 0.283540 +vn 0.293745 0.358065 -0.886286 +vn 0.205687 0.324349 -0.923304 +vn 0.391350 0.764136 0.512777 +vn -0.367895 0.803655 0.467752 +vn -0.223771 0.669588 0.708222 +vn 0.365712 0.695720 0.618246 +vn 0.613310 0.520660 0.593940 +vn 0.807681 -0.368451 -0.460322 +vn 0.000737 0.573052 -0.819519 +vn 0.000706 0.414155 -0.910206 +vn 0.228810 -0.023142 0.973196 +vn 0.000636 0.197227 -0.980358 +vn -0.000205 0.323545 -0.946213 +vn -0.002716 0.321649 -0.946855 +vn 0.043854 0.042546 -0.998132 +vn 0.656861 -0.130836 0.742573 +vn 0.000643 0.217649 -0.976027 +vn 0.000615 0.499144 -0.866519 +vn 0.000171 -0.555848 -0.831284 +vn -0.108947 0.477688 0.871748 +vn 0.350523 -0.604135 -0.715650 +vn 0.147077 -0.688018 0.710633 +vn 0.144166 -0.865279 0.480114 +vn 0.069068 -0.929722 0.361727 +vn -0.778743 -0.624161 -0.063106 +vn -0.942819 -0.168475 0.287590 +vn 0.092985 -0.237501 -0.966927 +vn -0.069756 -0.815712 -0.574237 +vn 0.062211 -0.762969 -0.643435 +vn -0.733693 0.227819 0.640151 +vn -0.618000 -0.429809 0.658285 +vn -0.935277 0.278808 -0.218000 +vn -0.830393 -0.430298 0.353966 +vn -0.917044 0.344528 0.200828 +vn -0.960063 -0.275899 -0.046459 +vn -0.813399 -0.515236 0.270024 +vn -0.864580 0.273592 0.421484 +vn 0.839303 -0.435730 -0.325130 +vn 0.975434 0.190715 0.110256 +vn 0.901854 0.322401 0.287604 +vn 0.873846 -0.470690 -0.121837 +vn -0.350592 -0.862489 -0.364964 +vn 0.366313 -0.802977 -0.470152 +vn 0.337758 -0.926682 -0.164862 +vn -0.344432 -0.938482 -0.024850 +vn 0.930159 0.275175 -0.243069 +vn 0.737897 -0.517367 0.433404 +vn 0.885990 -0.436273 0.157123 +vn 0.849098 0.286067 -0.444069 +vn 0.984275 -0.176560 -0.005458 +vn 0.678440 0.358604 0.641189 +vn -0.252465 0.870662 -0.422148 +vn 0.204595 -0.291282 0.934503 +vn 0.292971 0.937334 -0.188609 +vn 0.273852 0.315509 0.908548 +vn -0.189178 0.271217 0.943744 +vn -0.267363 -0.676903 0.685799 +vn 0.250827 -0.684011 0.684992 +vn -0.291062 -0.721588 0.628166 +vn -0.915887 -0.330068 0.228486 +vn -0.902488 -0.315286 0.293445 +vn -0.219123 -0.668156 0.711022 +vn 0.274840 0.675794 -0.683934 +vn -0.341577 0.706072 -0.620312 +vn 0.349740 -0.738550 0.576390 +vn -0.877999 0.354302 -0.321851 +vn -0.958988 0.115247 -0.258961 +vn 0.206407 0.421975 -0.882798 +vn -0.547402 0.412382 -0.728212 +vn 0.540881 -0.639137 0.546764 +vn 0.938742 -0.344612 -0.002561 +vn -0.538773 -0.587456 0.603837 +vn -0.898233 -0.330288 -0.289978 +vn -0.888165 -0.348460 -0.299562 +vn -0.598361 -0.614474 0.514185 +vn 0.555889 -0.145432 0.818435 +vn 0.161759 -0.367530 0.915836 +vn 0.095931 -0.166039 0.981442 +vn 0.592667 -0.108137 0.798155 +vn 0.101521 0.403552 -0.909307 +vn 0.679542 0.488377 -0.547458 +vn 0.650340 0.398444 -0.646761 +vn 0.131675 0.265311 -0.955129 +vn 0.931355 0.250171 0.264560 +vn 0.932248 0.294818 0.209752 +vn 0.543561 0.791633 -0.279032 +vn 0.746097 0.541227 -0.387831 +vn 0.722273 -0.390629 -0.570728 +vn 0.990702 0.133287 0.027293 +vn 0.991763 0.001544 0.128076 +vn 0.816562 -0.368540 -0.444301 +vn -0.966605 -0.228750 0.115531 +vn -0.693476 -0.583242 -0.422988 +vn -0.734166 -0.564416 -0.377406 +vn -0.950156 -0.278303 0.140538 +vn 0.169273 0.573626 0.801436 +vn -0.554336 0.350570 0.754859 +vn -0.625822 0.336194 0.703790 +vn 0.177121 0.706936 0.684740 +vn 0.050898 -0.653725 -0.755019 +vn 0.069765 -0.549137 -0.832815 +vn -0.583815 0.045944 -0.810586 +vn -0.510041 -0.017658 -0.859969 +vn 0.776199 0.379081 0.503799 +vn 0.441393 0.792300 0.421229 +vn 0.825327 0.482512 0.293287 +vn 0.852664 -0.193470 -0.485319 +vn 0.055717 -0.460115 -0.886109 +vn 0.999028 0.020748 0.038884 +vn -0.877400 -0.338751 -0.339732 +vn -0.967253 -0.216547 0.132398 +vn 0.696572 0.472945 0.539547 +vn 0.959148 0.282904 -0.000001 +vn 0.771939 0.457450 0.441419 +vn 0.682352 0.528321 0.505245 +vn 0.983982 0.178132 0.006913 +vn -0.888694 0.015158 0.458251 +vn -0.942149 -0.287498 -0.172336 +vn -0.979653 -0.179804 0.089170 +vn -0.612131 0.419198 0.670499 +vn 0.156941 0.628138 0.762111 +vn 0.124917 -0.213122 -0.969007 +vn 0.613248 -0.018204 -0.789681 +vn 0.673629 -0.368905 -0.640417 +vn 0.058514 -0.611856 -0.788802 +vn -0.496051 -0.341099 -0.798489 +vn -0.679857 -0.557813 -0.476067 +vn 0.999003 -0.033892 -0.029066 +vn 0.922532 0.235006 0.306117 +vn 0.997134 -0.050889 0.055978 +vn -0.856785 0.486638 0.170596 +vn -0.960267 -0.249048 0.125944 +vn -0.960828 -0.257161 0.103329 +vn 0.728918 0.307952 0.611428 +vn 0.957827 -0.194996 -0.211056 +vn 0.226041 -0.649843 -0.725679 +vn -0.344009 -0.668308 -0.659562 +vn -0.594140 -0.776059 0.211496 +vn -0.902811 -0.429103 -0.028340 +vn -0.570580 -0.206776 -0.794784 +vn -0.610830 -0.590244 0.527731 +vn -0.953246 -0.186238 0.237988 +vn 0.615400 0.597316 -0.514293 +vn 0.447070 0.416694 -0.791514 +vn 0.316009 0.522612 -0.791843 +vn 0.263729 0.776427 -0.572370 +vn -0.184382 0.256502 0.948794 +vn 0.532457 0.842738 -0.079262 +vn 0.325148 0.929858 -0.172169 +vn -0.525828 0.601900 0.601017 +vn -0.914932 -0.391756 -0.097097 +vn 0.960040 -0.032306 0.277991 +vn -0.870903 -0.255065 -0.420082 +vn -0.730099 0.559883 -0.391773 +vn -0.821278 -0.047287 0.568565 +vn -0.504493 -0.392316 0.769139 +vn -0.901107 -0.342805 -0.265501 +vn 0.439028 -0.691842 -0.573245 +vn -0.002039 -0.867584 -0.497286 +vn -0.015377 0.454182 -0.890776 +vn 0.849824 -0.416924 0.322450 +vn 0.874663 -0.214573 0.434653 +vn 0.119286 -0.620303 0.775238 +vn 0.028080 -0.775233 0.631050 +vn -0.832236 0.050723 0.552097 +vn -0.971905 -0.229727 0.051250 +vn 0.253215 0.744003 -0.618338 +vn 0.266496 0.963486 -0.025961 +vn 0.507279 0.241533 0.827242 +vn 0.113763 0.104606 0.987986 +vn 0.855627 -0.508083 0.098767 +vn 0.085221 -0.922109 0.377427 +vn 0.499910 0.696869 0.514260 +vn -0.841956 0.524448 0.126745 +vn -0.921025 0.242592 0.304733 +vn 0.518523 0.422475 0.743403 +vn -0.682728 -0.388947 -0.618549 +vn -0.647939 -0.641635 -0.410462 +vn -0.920339 -0.126225 0.370194 +vn 0.963415 -0.187041 -0.191957 +vn 0.640122 0.106881 0.760803 +vn 0.912522 -0.408546 -0.019843 +vn 0.817665 0.074080 -0.570908 +vn 0.000012 -0.837955 -0.545739 +vn -0.045137 0.139742 -0.989159 +vn 0.466518 0.225171 -0.855371 +vn 0.565128 -0.326086 -0.757825 +vn -0.567413 -0.516487 -0.641314 +vn -0.417630 -0.017306 -0.908452 +vn -0.560590 -0.688686 -0.459837 +vn -0.486637 -0.740218 -0.463964 +vn 0.000009 -0.837953 -0.545743 +vn 0.000002 -0.837951 -0.545745 +vn 0.545534 -0.592353 -0.592884 +vn 0.545592 -0.652927 -0.525372 +vn -0.000004 -0.837956 -0.545738 +vn -0.000003 -0.837954 -0.545741 +vn 0.567214 -0.699153 -0.435263 +vn 0.624398 -0.741393 -0.245895 +vn -0.515257 -0.855420 -0.052595 +vn -0.546183 -0.776109 -0.315182 +vn -0.513260 -0.780423 -0.357078 +vn -0.575586 -0.675571 -0.460765 +vn 0.000012 -0.837955 -0.545739 +vn 0.000012 -0.837955 -0.545739 +vn 0.643332 -0.493472 -0.585328 +vn 0.595900 -0.611128 -0.520986 +vn -0.300012 -0.894522 0.331395 +vn 0.111767 -0.946700 0.302104 +vn 0.501527 -0.846810 0.177153 +vn 0.000012 -0.837955 -0.545739 +vn 0.543066 -0.591480 -0.596012 +vn -0.514299 -0.777479 -0.361972 +vn 0.731139 -0.365842 0.575842 +vn 0.162703 -0.484595 0.859474 +vn 0.497783 0.578277 -0.646381 +vn 0.773310 0.457075 -0.439403 +vn -0.969750 -0.150242 0.192385 +vn -0.978729 -0.087373 0.185623 +vn 0.953007 0.198724 -0.228663 +vn 0.988039 0.113353 -0.104548 +vn 0.998689 0.005094 0.050926 +vn 0.909895 0.317590 -0.266887 +vn 0.980198 0.148984 -0.130447 +vn -0.749420 -0.308056 0.586064 +vn -0.952313 -0.090439 0.291411 +vn -0.997783 0.061102 -0.026361 +vn -0.895948 0.249007 -0.367795 +vn -0.998513 -0.009968 0.053590 +vn -0.829524 0.414719 0.374030 +vn -0.839008 0.139935 0.525817 +vn -0.996852 0.060274 0.051501 +vn -0.855100 0.443042 0.269291 +vn -0.700951 0.070701 0.709696 +vn -0.862399 0.277079 0.423669 +vn 0.945838 -0.163363 0.280540 +vn 0.805360 0.254722 0.535268 +vn 0.467960 0.028609 0.883286 +vn 0.829074 0.554549 0.071491 +vn 0.861796 0.491221 0.126531 +vn 0.762038 0.542196 -0.354007 +vn 0.872790 0.471295 -0.126962 +vn -0.050977 0.565039 -0.823488 +vn 0.007045 0.711290 -0.702864 +vn 0.545121 0.632611 -0.550133 +vn -0.381812 -0.458410 0.802546 +vn -0.239981 -0.091298 0.966475 +vn -0.910782 0.365658 -0.191756 +vn -0.535356 0.619854 -0.573738 +vn -0.499812 0.456213 -0.736246 +vn -0.922594 0.034982 0.384183 +vn -0.979555 0.191722 0.060955 +vn 0.883193 0.377121 0.278836 +vn 0.956138 0.184483 -0.227520 +vn 0.865105 0.487820 0.116728 +vn 0.906641 0.409799 0.100332 +vn -0.881304 -0.033364 0.471370 +vn -0.996752 0.076758 0.024380 +vn 0.258930 0.804236 0.534939 +vn 0.270965 0.705750 0.654595 +vn 0.493621 0.667150 -0.557897 +vn 0.785966 0.543698 -0.294364 +vn 0.379337 0.604406 0.700569 +vn 0.294478 0.792652 0.533841 +vn 0.819011 0.508780 0.265262 +vn -0.572860 0.595549 -0.563163 +vn -0.050529 0.716640 -0.695610 +vn 0.260190 0.840728 0.474846 +vn -0.922915 0.283835 -0.260125 +vn -0.287488 0.684630 0.669800 +vn -0.430462 0.301937 0.850610 +vn -0.257674 0.816551 0.516574 +vn -0.275036 0.659780 0.699317 +vn -0.324294 0.773816 0.544098 +vn 0.237233 0.349268 0.906495 +vn 0.860542 0.508539 -0.029261 +vn -0.085946 0.300869 0.949785 +vn -0.894595 0.373503 -0.245348 +vn -0.454479 0.689411 -0.564057 +vn 0.386625 0.772253 -0.504130 +vn 0.697591 0.687579 -0.201497 +vn -0.995174 0.093370 0.030173 +vn -0.136322 0.793074 -0.593675 +vn -0.203808 -0.007334 0.978983 +vn -0.742927 -0.133307 0.655964 +vn 0.828443 0.543496 0.135255 +vn 0.606096 0.558912 0.565920 +vn 0.217769 0.322155 0.921299 +vn -0.951159 0.136654 0.276805 +vn -0.985099 0.171952 0.003653 +vn -0.999720 -0.021077 -0.010783 +vn -0.958716 -0.005099 0.284319 +vn -0.726920 0.633936 0.264030 +vn -0.746389 0.664535 0.035996 +vn -0.779758 0.092332 0.619235 +vn -0.670892 0.437282 0.598907 +vn -0.790179 0.032002 0.612040 +vn -0.360359 0.242447 -0.900756 +vn -0.771459 0.172296 -0.612507 +vn -0.636791 0.595757 -0.489460 +vn -0.323777 0.722256 -0.611159 +vn -0.384560 0.006894 -0.923074 +vn -0.782448 -0.006142 -0.622686 +vn -0.105189 0.277467 -0.954959 +vn -0.098890 0.020905 -0.994879 +vn -0.148943 0.760342 -0.632215 +vn -0.393356 -0.198896 -0.897614 +vn -0.776506 -0.159670 -0.609545 +vn -0.405217 -0.577269 -0.708914 +vn -0.683519 -0.460965 -0.565961 +vn -0.137862 -0.199219 -0.970209 +vn -0.170745 -0.626867 -0.760186 +vn -0.481912 -0.047972 0.874905 +vn -0.810808 -0.066130 0.581565 +vn -0.791282 -0.407856 0.455551 +vn -0.501460 -0.459370 0.733156 +vn -0.485472 0.058555 0.872289 +vn -0.138721 -0.055039 0.988801 +vn -0.152046 0.058062 0.986667 +vn -0.215224 -0.595537 0.773960 +vn -0.442345 0.138213 0.886131 +vn -0.360262 0.573600 0.735659 +vn -0.180215 0.186666 0.965753 +vn -0.200528 0.625355 0.754135 +vn -0.956722 -0.132963 0.258852 +vn -0.985518 -0.168354 -0.020260 +vn -0.817726 -0.570308 -0.077934 +vn -0.840911 -0.519725 0.150847 +vn -0.954140 -0.163411 -0.250826 +vn -0.780000 -0.550049 -0.298406 +vn -0.967121 -0.016621 -0.253771 +vn -0.959024 0.158827 -0.234620 +vn -0.735168 0.654790 -0.175436 +vn -0.314857 0.907923 0.276660 +vn -0.343407 0.937827 0.050518 +vn -0.169287 0.940452 0.294776 +vn -0.137209 0.989113 0.053197 +vn -0.327685 0.930552 -0.163390 +vn -0.137256 0.973862 -0.180981 +vn -0.609504 -0.784861 -0.111791 +vn -0.815293 -0.573722 -0.078355 +vn -0.583685 -0.784820 0.208253 +vn -0.514234 -0.843316 0.156144 +vn -0.500762 -0.773490 -0.388524 +vn -0.155689 -0.832403 -0.531852 +vn -0.220086 -0.936502 0.272995 +vn -0.239529 -0.635979 -0.733592 +vn -0.689976 -0.600991 -0.403413 +vn -0.683242 0.686216 -0.249576 +vn -0.680078 0.655136 0.329075 +vn -0.300176 -0.847267 0.438215 +vn -0.372964 -0.237491 0.896937 +vn -0.295900 0.886263 -0.356343 +vn -0.269917 0.888513 0.371065 +vn -0.227232 0.085221 0.970105 +vn -0.674034 0.222104 0.704520 +vn -0.328584 0.474970 -0.816355 +vn -0.247551 0.414932 0.875529 +vn -0.189862 0.598335 -0.778426 +vn -0.894012 0.370817 0.251471 +vn 0.957112 -0.272084 -0.099534 +vn 0.557462 -0.105754 -0.823439 +vn -0.582360 -0.087502 -0.808208 +vn -0.188244 0.405403 -0.894546 +vn -0.204636 0.202043 -0.957759 +vn -0.600316 0.136195 -0.788081 +vn -0.227318 0.391859 -0.891500 +vn -0.233537 -0.007992 0.972315 +vn -0.241212 -0.141282 0.960133 +vn -0.231549 -0.028981 0.972391 +vn -0.247687 -0.012592 0.968758 +vn 0.474561 -0.178611 0.861911 +vn -0.471538 0.179284 0.863429 +vn -0.265688 -0.095027 0.959364 +vn -0.248920 -0.021152 0.968293 +vn -0.710229 0.249586 -0.658242 +vn -0.739809 0.098487 -0.665570 +vn -0.992595 0.093704 0.077298 +vn -0.991623 0.128013 -0.017209 +vn -0.730382 0.001815 0.683036 +vn -0.770265 -0.004683 0.637707 +vn -0.287403 0.294223 -0.911500 +vn -0.261204 0.095335 -0.960564 +vn -0.224577 0.185478 -0.956642 +vn -0.252431 0.303967 -0.918631 +vn -0.735513 0.225338 -0.638939 +vn -0.728739 0.111873 -0.675591 +vn -0.999536 -0.027718 -0.012604 +vn -0.998939 0.040882 0.021189 +vn -0.704661 -0.170500 0.688755 +vn -0.718620 -0.168053 0.674792 +vn -0.243574 -0.213545 0.946082 +vn -0.251604 -0.251083 0.934694 +vn -0.633706 0.739230 0.227939 +vn -0.858467 0.499598 0.115912 +vn -0.622142 0.288510 0.727806 +vn -0.439115 0.480078 0.759410 +vn -0.211409 0.017175 -0.977247 +vn -0.325840 0.212353 -0.921268 +vn -0.538834 0.104498 0.835906 +vn -0.461532 0.101264 0.881325 +vn 0.166853 -0.009541 0.985936 +vn 0.258812 0.031666 0.965408 +vn -0.648490 -0.005943 0.761200 +vn -0.828339 -0.040388 -0.558769 +vn -0.228110 -0.014295 0.973530 +vn -0.660396 -0.133593 0.738938 +vn -0.062278 -0.194020 0.979019 +vn -0.253262 -0.198560 -0.946801 +vn 0.731168 -0.358951 0.580127 +vn 0.944156 -0.325530 0.050997 +vn 0.381472 -0.477133 -0.791721 +vn 0.779965 -0.225179 0.583908 +vn 0.831593 -0.426978 0.355167 +vn 0.975448 0.161777 -0.149428 +vn 0.991142 -0.121216 -0.054256 +vn 0.881293 -0.072445 0.466984 +vn 0.831593 -0.150525 0.534598 +vn 0.908714 -0.382456 -0.167230 +vn 0.964141 -0.229170 -0.133842 +vn -0.824171 -0.058254 -0.563337 +vn -0.856446 -0.109366 -0.504518 +vn -0.943135 0.085366 0.321260 +vn -0.976942 0.095895 0.190755 +vn 0.504862 -0.360085 -0.784508 +vn 0.439137 -0.468874 -0.766365 +vn -0.283818 -0.296384 -0.911923 +vn -0.277396 -0.256748 -0.925814 +vn -0.880257 0.286076 -0.378560 +vn -0.804089 0.260235 -0.534526 +vn -0.939471 -0.341683 0.025445 +vn -0.900775 -0.378068 0.213705 +vn -0.942640 0.093082 -0.320572 +vn -0.875536 -0.042412 0.481287 +vn 0.734721 -0.226253 -0.639527 +vn 0.495698 0.685072 -0.533816 +vn -0.263531 0.728664 -0.632139 +vn -0.433471 -0.216788 0.874703 +vn -0.430050 -0.697528 0.573159 +vn 0.189647 -0.740812 0.644384 +vn 0.156613 -0.298180 0.941574 +vn 0.200679 -0.757623 0.621076 +vn 0.117666 -0.700711 0.703675 +vn 0.860178 -0.364728 0.356464 +vn 0.876055 -0.378558 0.298698 +vn 0.507484 0.579254 -0.637907 +vn -0.180360 0.607712 -0.773406 +vn -0.489444 -0.719131 0.493250 +vn 0.954137 0.198742 -0.223886 +vn 0.979327 0.075419 -0.187699 +vn 0.614070 0.401613 -0.679430 +vn -0.126517 0.447827 -0.885124 +vn -0.953507 -0.287384 -0.090745 +vn -0.628464 -0.615941 0.475026 +vn 0.481648 -0.359846 0.799078 +vn 0.571332 -0.381838 0.726484 +vn 0.887284 -0.438557 -0.142807 +vn 0.879935 -0.462357 -0.109276 +vn -0.584562 0.190437 0.788683 +vn -0.622114 0.264662 0.736836 +vn -0.123808 0.141888 0.982110 +vn -0.209337 -0.003418 0.977838 +vn -0.050883 0.054076 -0.997240 +vn -0.112628 -0.007348 -0.993610 +vn -0.635353 0.235767 -0.735350 +vn -0.630307 0.295773 -0.717796 +vn -0.905200 0.411221 0.107284 +vn -0.917914 0.380454 0.112645 +vn -0.708137 0.400996 -0.581157 +vn -0.554771 0.727314 -0.404034 +vn -0.844797 -0.247321 -0.474501 +vn -0.894261 -0.270542 -0.356518 +vn -0.967334 0.085370 0.238698 +vn -0.949247 0.254017 0.185486 +vn 0.930252 -0.364653 -0.040750 +vn 0.924924 -0.379373 0.024326 +vn 0.622948 -0.596724 -0.505823 +vn 0.533354 -0.638925 -0.554354 +vn 0.027888 0.528944 0.848199 +vn -0.016809 0.688954 0.724610 +vn 0.726578 0.202665 0.656515 +vn 0.701631 0.214953 0.679345 +vn -0.226202 -0.481839 -0.846560 +vn -0.249819 -0.579904 -0.775436 +vn 0.605302 -0.281824 -0.744436 +vn 0.563124 -0.294401 -0.772153 +vn -0.666677 0.443453 0.599075 +vn -0.797381 0.508413 0.325116 +vn -0.408916 0.795552 0.447084 +vn -0.094124 -0.413188 -0.905768 +vn -0.870801 -0.142939 -0.470398 +vn -0.996320 0.049120 0.070237 +vn 0.961099 -0.256426 0.102638 +vn 0.855264 -0.355925 -0.376618 +vn -0.538003 0.516071 0.666501 +vn -0.914528 0.392268 0.098818 +vn -0.931534 0.312668 0.185698 +vn -0.502007 0.570086 0.650378 +vn -0.649725 0.527836 0.547035 +vn 0.879578 -0.005231 0.475727 +vn 0.787657 0.215649 0.577142 +vn 0.937393 -0.336747 -0.088856 +vn 0.910662 -0.349318 -0.220618 +vn 0.067381 0.539257 0.839441 +vn -0.240655 -0.288858 -0.926632 +vn -0.280179 -0.545846 -0.789653 +vn -0.834701 -0.211863 -0.508319 +vn -0.726234 -0.019208 -0.687180 +vn 0.437381 -0.438188 -0.785295 +vn 0.504932 -0.615027 -0.605628 +vn -0.998597 -0.038328 -0.036538 +vn -0.997588 -0.012146 0.068335 +vn -0.907786 0.260624 0.328633 +vn 0.876898 0.452544 0.162032 +vn 0.946603 -0.312251 0.080259 +vn 0.939841 -0.320829 0.117339 +vn -0.727119 0.296740 0.619067 +vn -0.260089 -0.615681 -0.743835 +vn -0.968794 -0.143175 -0.202333 +vn 0.258444 -0.634964 -0.728030 +vn 0.589039 -0.283256 -0.756835 +vn 0.802603 -0.596191 0.019615 +vn 0.496635 -0.851552 0.167968 +vn 0.876317 -0.371983 0.306100 +vn 0.496180 -0.687204 0.530618 +vn -0.434970 0.724142 -0.535182 +vn 0.010775 0.833022 -0.553134 +vn -0.063230 0.590232 -0.804754 +vn -0.333371 0.512973 -0.791026 +vn 0.140124 0.250665 0.957879 +vn 0.560941 0.465501 0.684583 +vn -0.061052 0.990737 -0.121295 +vn -0.387696 0.918377 -0.079217 +vn 0.887872 -0.447680 -0.106138 +vn 0.879012 -0.235427 -0.414623 +vn -0.963645 -0.014994 0.266765 +vn 0.865058 0.409120 -0.290337 +vn 0.732418 -0.222821 0.643362 +vn 0.419650 -0.457570 0.783915 +vn 0.830821 -0.473890 -0.291830 +vn -0.202114 0.505755 -0.838667 +vn 0.030030 -0.815570 -0.577878 +vn -0.484351 -0.663936 -0.569730 +vn -0.826538 -0.439827 0.351264 +vn 0.044363 -0.797965 0.601068 +vn -0.029987 -0.637590 0.769792 +vn -0.856453 -0.225174 0.464526 +vn 0.710418 -0.154146 0.686692 +vn -0.426259 0.901598 -0.073647 +vn -0.372700 0.746553 -0.551138 +vn 0.881379 -0.461463 0.101113 +vn -0.017402 0.112583 0.993490 +vn -0.477253 0.173424 0.861483 +vn -0.846406 -0.519554 0.116879 +vn -0.014584 -0.947017 0.320853 +vn -0.475219 0.689289 0.546852 +vn -0.522284 0.368947 0.768829 +vn 0.915337 0.193657 0.353065 +vn 0.845637 0.504710 0.173684 +vn 0.906868 -0.185252 0.378514 +vn 0.643723 -0.615057 -0.455330 +vn 0.685758 -0.343204 -0.641830 +vn -0.960538 -0.135025 -0.243178 +vn -0.657727 0.048713 0.751679 +vn -0.920873 -0.381110 -0.082153 +vn -0.764860 0.143478 -0.628015 +vn 0.098053 -0.876921 -0.470526 +vn -0.506107 -0.442649 -0.740215 +vn -0.457486 0.105431 -0.882945 +vn 0.064111 0.059618 -0.996160 +vn 0.634981 -0.510565 -0.579761 +vn 0.447043 -0.052777 -0.892954 +vn 0.510729 -0.837771 -0.193121 +vn 0.070739 -0.971249 -0.227312 +vn 0.100378 -0.878911 -0.466305 +vn 0.537789 -0.747109 -0.390655 +vn -0.372181 -0.876764 -0.304576 +vn -0.429960 -0.707962 -0.560289 +vn 0.041802 -0.999101 0.007045 +vn -0.593464 -0.779550 0.200257 +vn -0.493552 -0.869616 0.013224 +vn 0.040648 -0.999173 0.000685 +vn 0.543380 -0.720411 0.430984 +vn 0.541074 -0.824890 0.163696 +vn 0.596980 -0.753639 -0.275033 +vn 0.098053 -0.876921 -0.470526 +vn 0.098053 -0.876921 -0.470526 +vn 0.652378 -0.652294 -0.385896 +vn -0.517269 -0.708354 -0.480278 +vn -0.573589 -0.601761 -0.555770 +vn 0.318848 -0.550451 0.771583 +vn -0.090085 -0.627305 0.773546 +vn -0.479167 -0.629197 0.611972 +vn -0.464114 -0.690014 -0.555409 +vn 0.098053 -0.876921 -0.470526 +vn 0.597892 -0.751031 -0.280139 +vn -0.171183 0.062804 0.983235 +vn -0.734954 -0.018266 0.677871 +vn -0.798571 0.340369 -0.496421 +vn -0.529224 0.470127 -0.706330 +vn 0.975955 0.024990 0.216533 +vn 0.972810 -0.037663 0.228522 +vn -0.983879 -0.058438 -0.169015 +vn -0.954140 0.078663 -0.288842 +vn -0.998559 -0.024184 0.047908 +vn -0.985123 0.040612 -0.166984 +vn -0.926804 0.203200 -0.315822 +vn 0.942296 0.117737 0.313396 +vn 0.742155 0.097483 0.663101 +vn 0.987697 0.156221 -0.007048 +vn 0.879656 0.303784 -0.365952 +vn 0.995616 0.066414 0.065856 +vn 0.804018 0.265365 0.532105 +vn 0.776606 0.475852 0.412853 +vn 0.995283 0.096468 -0.010320 +vn 0.876966 0.480357 0.013705 +vn 0.847871 0.494115 0.192262 +vn 0.678270 0.479265 0.557005 +vn -0.947641 -0.021178 0.318634 +vn -0.493098 0.490904 0.718239 +vn -0.827653 0.473516 0.301286 +vn -0.923446 0.368571 -0.106790 +vn -0.883898 0.467595 0.008947 +vn -0.909188 0.371050 -0.188942 +vn -0.798304 0.433081 -0.418512 +vn 0.023813 0.495883 -0.868063 +vn -0.584682 0.527476 -0.616373 +vn -0.051861 0.645383 -0.762096 +vn 0.373597 0.076050 0.924468 +vn 0.215681 0.466417 0.857868 +vn 0.477870 0.439342 -0.760670 +vn 0.492239 0.618793 -0.612206 +vn 0.877468 0.435751 -0.200429 +vn 0.954200 0.291320 0.068088 +vn 0.901874 0.157551 0.402246 +vn -0.901810 0.431266 0.027359 +vn -0.961384 0.069991 -0.266160 +vn -0.911144 0.408730 0.052502 +vn -0.944470 0.325908 0.041947 +vn 0.983503 0.175922 0.042098 +vn 0.864457 0.093077 0.494015 +vn -0.311364 0.937546 0.155109 +vn -0.296534 0.949765 -0.100075 +vn -0.824217 0.437250 -0.359831 +vn -0.536491 0.566120 -0.625847 +vn -0.454584 0.587849 0.669169 +vn -0.458224 0.621183 0.635737 +vn -0.872178 0.446555 0.199737 +vn 0.004666 0.656946 -0.753923 +vn 0.531524 0.599262 -0.598637 +vn -0.550402 0.809336 -0.205019 +vn 0.899612 0.350040 -0.261094 +vn 0.371384 0.413315 0.831411 +vn 0.182253 0.518641 0.835341 +vn 0.359425 0.892164 -0.273602 +vn 0.302249 0.951988 -0.048619 +vn 0.234350 0.946715 0.220931 +vn -0.273392 0.780613 0.562050 +vn -0.903779 0.417418 -0.094583 +vn 0.049817 0.777645 0.626727 +vn 0.415672 0.702723 -0.577406 +vn 0.854988 0.436442 -0.280204 +vn -0.753847 0.596756 -0.274948 +vn -0.435455 0.698426 -0.567961 +vn 0.984198 0.171266 0.044968 +vn 0.074404 0.746771 -0.660907 +vn 0.759938 -0.031712 0.649221 +vn 0.183677 0.073205 0.980257 +vn -0.886286 0.459810 0.055430 +vn -0.690606 0.530790 0.491248 +vn -0.283730 0.377398 0.881515 +g characterMedium +f 1/638/1 27/854/2 41/194/3 30/522/4 +f 1/638/1 30/522/4 40/928/5 16/470/6 +f 1/638/1 16/470/6 36/133/7 15/367/8 +f 1/638/1 15/367/8 39/91/9 27/854/2 +f 2/855/10 23/197/11 35/465/12 14/973/13 +f 2/855/10 14/973/13 38/331/14 25/391/15 +f 65/851/16 77/633/17 380/196/18 353/779/19 +f 65/851/16 353/779/19 378/903/20 75/529/21 +f 3/269/22 25/391/15 38/331/14 19/587/23 +f 3/269/22 19/587/23 33/846/24 18/901/25 +f 66/387/26 73/275/27 373/198/28 354/388/29 +f 66/387/26 354/388/29 380/196/18 77/633/17 +f 4/199/30 20/129/31 34/60/32 21/975/33 +f 4/199/30 21/975/33 39/91/9 26/159/34 +f 67/61/35 78/62/36 381/876/37 356/738/38 +f 67/61/35 356/738/38 375/467/39 74/424/40 +f 5/875/41 26/159/34 39/91/9 15/367/8 +f 5/875/41 15/367/8 36/133/7 24/758/42 +f 68/759/43 76/121/44 379/762/45 357/34/46 +f 68/759/43 357/34/46 381/876/37 78/62/36 +f 6/35/47 13/36/48 37/37/49 29/639/50 +f 6/35/47 29/639/50 41/194/3 27/854/2 +f 6/35/47 27/854/2 39/91/9 21/975/33 +f 6/35/47 21/975/33 34/60/32 13/36/48 +f 7/66/51 17/595/52 33/846/24 19/587/23 +f 7/66/51 19/587/23 38/331/14 28/471/53 +f 7/66/51 28/471/53 41/194/3 29/639/50 +f 7/66/51 29/639/50 37/37/49 17/595/52 +f 8/641/54 28/471/53 38/331/14 14/973/13 +f 8/641/54 14/973/13 35/465/12 22/241/55 +f 8/641/54 22/241/55 40/928/5 30/522/4 +f 8/641/54 30/522/4 41/194/3 28/471/53 +f 9/226/56 16/470/6 40/928/5 31/998/57 +f 69/553/58 79/386/59 383/513/60 362/596/61 +f 69/502/58 362/207/61 379/762/45 76/121/44 +f 9/879/56 24/758/42 36/133/7 16/470/6 +f 10/5/62 22/241/55 35/465/12 23/197/11 +f 70/757/63 75/529/21 378/903/20 363/642/64 +f 70/757/63 363/642/64 383/513/60 79/386/59 +f 10/5/62 31/998/57 40/928/5 22/241/55 +f 32/514/65 12/503/66 44/970/67 43/761/68 +f 11/195/69 18/901/25 33/846/24 17/595/52 +f 11/195/69 17/595/52 37/37/49 32/514/65 +f 71/713/70 366/780/71 373/198/28 73/275/27 +f 12/503/66 32/514/65 37/37/49 13/36/48 +f 12/503/66 13/36/48 34/60/32 20/129/31 +f 72/771/72 74/424/40 375/467/39 367/760/73 +f 71/713/70 11/195/69 42/1020/74 80/972/75 +f 42/1020/74 43/761/68 46/468/76 45/515/77 +f 81/327/78 384/756/79 389/710/80 83/158/81 +f 11/195/69 32/514/65 43/761/68 42/1020/74 +f 72/771/72 367/760/73 384/756/79 81/327/78 +f 45/550/77 46/971/76 49/902/82 48/38/83 +f 83/1029/81 389/700/80 394/480/84 85/588/85 +f 43/761/68 44/970/67 47/328/86 46/468/76 +f 80/972/75 42/1020/74 45/515/77 82/772/87 +f 46/971/76 47/360/86 50/402/88 49/902/82 +f 82/500/87 45/550/77 48/38/83 84/613/89 +f 169/524/90 165/966/91 133/39/92 134/501/93 +f 93/130/94 61/63/95 51/614/96 86/967/97 +f 92/180/98 417/776/99 399/615/100 87/403/101 +f 168/573/102 167/847/103 135/40/104 136/574/105 +f 741/228/106 735/173/107 404/825/108 89/750/109 +f 739/41/110 736/616/111 55/160/112 54/995/113 +f 736/440/111 738/943/114 56/944/115 55/945/112 +f 740/161/116 739/41/110 54/995/113 88/113/117 +f 753/117/118 748/708/119 59/162/120 90/999/121 +f 750/144/122 747/389/123 57/309/124 58/572/125 +f 748/708/119 750/669/122 58/270/125 59/162/120 +f 752/235/126 749/977/127 409/690/128 91/308/129 +f 163/504/130 164/640/131 132/42/132 131/965/133 +f 85/588/85 394/480/84 417/776/99 92/180/98 +f 84/613/89 48/38/83 61/63/95 93/130/94 +f 165/966/91 166/617/134 138/737/135 133/39/92 +f 119/43/136 106/566/137 95/409/138 113/106/139 +f 55/877/112 56/567/115 111/575/140 +f 55/497/112 121/987/141 54/251/113 +f 395/400/142 84/613/89 93/130/94 416/44/143 +f 50/402/88 85/588/85 92/180/98 60/411/144 +f 747/389/123 752/235/126 91/308/129 57/309/124 +f 751/969/145 753/117/118 90/999/121 413/45/146 +f 737/853/147 740/161/116 88/113/117 405/260/148 +f 738/943/114 741/228/106 89/750/109 56/944/115 +f 60/411/144 92/180/98 87/403/101 53/840/149 +f 416/44/143 93/130/94 86/967/97 400/118/150 +f 390/67/151 82/500/87 84/613/89 395/400/142 +f 385/268/152 80/972/75 82/772/87 390/718/151 +f 47/360/86 83/1029/81 85/588/85 50/402/88 +f 12/503/66 72/771/72 81/327/78 44/970/67 +f 44/970/67 81/327/78 83/158/81 47/328/86 +f 366/780/71 71/713/70 80/972/75 385/268/152 +f 12/503/66 20/129/31 74/424/40 72/771/72 +f 11/195/69 71/713/70 73/275/27 18/901/25 +f 10/5/62 70/757/63 79/386/59 31/998/57 +f 10/5/62 23/197/11 75/529/21 70/757/63 +f 9/879/56 69/502/58 76/121/44 24/758/42 +f 9/226/56 31/998/57 79/386/59 69/553/58 +f 5/875/41 68/759/43 78/62/36 26/159/34 +f 5/875/41 24/758/42 76/121/44 68/759/43 +f 4/199/30 67/61/35 74/424/40 20/129/31 +f 4/199/30 26/159/34 78/62/36 67/61/35 +f 3/269/22 66/387/26 77/633/17 25/391/15 +f 3/269/22 18/901/25 73/275/27 66/387/26 +f 2/855/10 65/851/16 75/529/21 23/197/11 +f 2/855/10 25/391/15 77/633/17 65/851/16 +f 62/46/153 56/567/115 89/691/109 +f 64/996/154 88/692/117 54/251/113 +f 404/346/108 451/530/155 62/46/153 89/691/109 +f 482/568/156 421/736/157 63/47/158 120/1013/159 +f 405/1014/148 88/692/117 64/996/154 452/271/160 +f 110/725/161 63/215/158 421/952/157 471/569/162 +f 797/592/163 791/593/164 98/834/165 124/68/166 +f 129/300/167 108/927/168 94/778/169 122/299/170 +f 128/361/171 107/274/172 97/811/173 123/236/174 +f 118/618/175 109/953/176 96/765/177 112/252/178 +f 125/570/179 101/781/180 105/441/181 127/682/182 +f 796/347/183 793/119/184 101/781/180 125/570/179 +f 114/131/185 795/145/186 100/404/187 +f 794/711/188 792/89/189 99/348/190 115/405/191 +f 103/172/192 126/231/193 216/439/194 327/826/195 +f 114/131/185 100/404/187 104/753/196 116/174/197 +f 115/405/191 99/348/190 103/172/192 117/681/198 +f 124/68/166 98/834/165 102/680/199 126/231/193 +f 110/725/161 64/996/154 109/953/176 118/618/175 +f 121/987/141 55/497/112 107/274/172 128/361/171 +f 120/1013/159 63/47/158 108/927/168 129/300/167 +f 111/575/140 62/46/153 106/566/137 119/43/136 +f 55/877/112 111/575/140 119/43/136 107/714/172 +f 63/215/158 110/725/161 118/618/175 108/810/168 +f 101/625/180 115/405/191 117/681/198 105/942/181 +f 98/764/165 114/131/185 116/174/197 102/175/199 +f 126/231/193 102/680/199 220/170/200 216/439/194 +f 793/392/184 794/711/188 115/405/191 101/625/180 +f 791/904/164 795/145/186 114/131/185 98/764/165 +f 108/810/168 118/618/175 112/252/178 94/390/169 +f 64/996/154 110/725/161 471/569/162 452/271/160 +f 107/714/172 119/43/136 113/106/139 97/163/173 +f 116/174/197 104/753/196 221/310/201 218/171/202 +f 62/46/153 120/1013/159 129/300/167 106/566/137 +f 64/996/154 121/987/141 128/361/171 109/953/176 +f 99/348/190 124/68/166 126/231/193 103/172/192 +f 105/942/181 117/681/198 217/238/203 219/946/204 +f 796/347/183 125/570/179 100/404/187 +f 100/404/187 125/570/179 127/682/182 104/753/196 +f 109/953/176 128/361/171 123/236/174 96/765/177 +f 106/566/137 129/300/167 122/299/170 95/409/138 +f 792/89/189 797/592/163 124/68/166 99/348/190 +f 451/530/155 482/568/156 120/1013/159 62/46/153 +f 62/46/153 111/575/140 56/567/115 +f 64/996/154 54/251/113 121/987/141 +f 781/900/205 780/693/206 143/498/207 144/694/208 +f 779/401/209 775/525/210 145/906/211 141/551/212 +f 776/499/213 777/233/214 139/878/215 147/709/216 +f 777/233/214 778/670/217 140/261/218 139/878/215 +f 166/617/134 170/229/219 130/333/220 138/737/135 +f 164/640/131 168/573/102 136/574/105 132/42/132 +f 170/229/219 163/504/130 131/965/133 130/333/220 +f 167/847/103 169/69/90 134/406/93 135/40/104 +f 765/754/221 761/164/222 148/926/223 137/668/224 +f 764/495/225 763/240/226 150/359/227 151/881/228 +f 762/726/229 759/496/230 152/250/231 153/715/232 +f 763/240/226 760/464/233 155/90/234 150/359/227 +f 778/670/217 779/401/209 141/551/212 140/261/218 +f 782/487/235 776/499/213 147/709/216 142/112/236 +f 775/525/210 781/900/205 144/694/208 145/906/211 +f 780/755/206 782/487/235 142/112/236 143/301/207 +f 149/974/237 153/272/232 177/777/238 173/905/239 +f 155/64/234 137/589/224 171/707/240 179/921/241 +f 137/589/224 148/393/223 172/134/242 171/707/240 +f 151/667/228 150/157/227 174/848/243 175/329/244 +f 760/464/233 765/754/221 137/668/224 155/90/234 +f 766/527/245 762/726/229 153/715/232 149/880/237 +f 759/496/230 764/120/225 151/20/228 152/250/231 +f 761/164/222 766/527/245 149/880/237 148/926/223 +f 727/200/246 724/227/247 162/407/248 160/466/249 +f 725/469/250 722/132/251 159/763/252 156/526/253 +f 162/407/248 724/227/247 146/571/254 +f 726/335/255 723/273/256 161/237/257 158/528/258 +f 721/408/259 726/335/255 158/528/258 157/929/260 +f 725/469/250 156/526/253 146/571/254 +f 722/230/251 721/408/259 157/929/260 159/225/252 +f 723/273/256 727/200/246 160/466/249 161/237/257 +f 53/840/149 52/114/261 169/69/90 167/847/103 +f 48/38/83 49/902/82 163/504/130 170/229/219 +f 50/402/88 60/411/144 168/573/102 164/640/131 +f 61/63/95 48/38/83 170/229/219 166/617/134 +f 51/614/96 61/63/95 166/617/134 165/966/91 +f 49/902/82 50/402/88 164/640/131 163/504/130 +f 60/411/144 53/840/149 167/847/103 168/573/102 +f 52/239/261 51/614/96 165/966/91 169/524/90 +f 172/134/242 173/905/239 181/782/262 180/65/263 +f 176/140/264 175/329/244 183/54/265 184/234/266 +f 173/905/239 177/777/238 185/334/267 181/782/262 +f 179/921/241 171/707/240 154/590/268 187/773/269 +f 152/997/231 151/667/228 175/329/244 176/140/264 +f 148/393/223 149/974/237 173/905/239 172/134/242 +f 150/326/227 155/64/234 179/921/241 174/128/243 +f 153/272/232 152/523/231 176/116/264 177/777/238 +f 703/731/270 702/332/271 178/591/272 195/463/273 +f 702/332/271 699/850/274 188/330/275 178/591/272 +f 700/232/276 697/531/277 190/552/278 191/92/279 +f 701/712/280 698/1021/281 192/594/282 193/115/283 +f 174/128/243 179/921/241 187/773/269 182/576/284 +f 184/968/266 185/334/267 205/852/285 206/849/286 +f 175/329/244 174/848/243 182/425/284 183/54/265 +f 171/707/240 172/134/242 180/65/263 154/590/268 +f 194/907/287 193/115/283 192/594/282 191/783/279 +f 195/463/273 194/907/287 191/783/279 190/908/278 +f 178/591/272 188/330/275 194/907/287 195/463/273 +f 188/330/275 189/716/288 193/115/283 194/907/287 +f 704/724/289 701/712/280 193/115/283 189/716/288 +f 698/788/281 700/232/276 191/92/279 192/394/282 +f 699/850/274 704/724/289 189/716/288 188/330/275 +f 697/19/277 703/731/270 195/463/273 190/908/278 +f 710/143/290 708/397/291 201/796/292 196/6/293 +f 712/156/294 709/651/295 202/784/296 199/1010/297 +f 711/201/298 705/774/299 186/472/300 198/812/301 +f 709/651/295 706/435/302 197/909/303 202/784/296 +f 706/435/302 711/242/298 198/276/301 197/909/303 +f 705/774/299 710/165/290 196/1000/293 186/472/300 +f 707/817/304 712/156/294 199/1010/297 200/455/305 +f 708/397/291 707/817/304 200/455/305 201/796/292 +f 203/395/306 204/541/307 208/643/308 207/785/309 +f 176/140/264 184/234/266 206/93/286 204/135/307 +f 185/334/267 177/777/238 203/395/306 205/852/285 +f 177/777/238 176/116/264 204/541/307 203/395/306 +f 208/882/308 210/978/310 214/554/311 212/883/312 +f 204/135/307 206/93/286 210/978/310 208/882/308 +f 205/852/285 203/395/306 207/785/309 209/612/313 +f 206/849/286 205/852/285 209/612/313 210/911/310 +f 211/505/314 212/986/312 214/202/311 213/277/315 +f 209/612/313 207/785/309 211/505/314 213/277/315 +f 210/911/310 209/612/313 213/277/315 214/202/311 +f 207/785/309 208/643/308 212/986/312 211/505/314 +f 104/753/196 127/682/182 215/947/316 221/310/201 +f 127/682/182 105/441/181 219/948/204 215/947/316 +f 102/175/199 116/174/197 218/171/202 220/176/200 +f 117/681/198 103/172/192 327/826/195 217/238/203 +f 241/491/317 229/442/318 225/644/319 240/597/320 +f 242/186/321 224/30/322 229/442/318 241/491/317 +f 248/203/323 226/188/324 230/278/325 247/422/326 +f 247/422/326 230/278/325 228/78/327 246/298/328 +f 239/214/329 233/51/330 232/477/331 238/856/332 +f 237/253/333 231/70/334 233/51/330 239/214/329 +f 309/412/335 235/204/336 236/606/337 308/600/338 +f 308/600/338 236/606/337 234/349/339 307/418/340 +f 222/443/341 237/253/333 239/214/329 227/324/342 +f 227/324/342 239/214/329 238/856/332 223/610/343 +f 235/204/336 242/186/321 241/491/317 236/606/337 +f 236/606/337 241/491/317 240/597/320 234/349/339 +f 230/278/325 245/297/344 244/751/345 228/78/327 +f 226/188/324 243/378/346 245/297/344 230/278/325 +f 233/51/330 247/422/326 246/298/328 232/477/331 +f 231/70/334 248/203/323 247/422/326 233/51/330 +f 223/561/343 250/410/347 254/957/348 227/800/342 +f 225/837/319 252/462/349 263/193/350 240/949/320 +f 243/453/346 265/766/351 311/415/352 309/382/335 +f 228/685/327 255/820/353 267/1016/354 246/369/328 +f 246/369/328 267/1016/354 258/136/355 232/1023/331 +f 234/661/339 259/218/356 310/583/357 307/291/340 +f 237/279/333 261/343/358 257/323/359 231/645/334 +f 240/949/320 263/193/350 259/218/356 234/661/339 +f 309/382/335 311/415/352 260/292/360 235/841/336 +f 235/841/336 260/292/360 264/858/361 242/646/321 +f 253/262/362 273/647/363 284/177/364 265/766/351 +f 268/149/365 287/792/366 273/647/363 253/262/362 +f 261/343/358 280/267/367 276/178/368 257/323/359 +f 262/872/369 281/914/370 270/493/371 250/410/347 +f 255/820/353 274/557/372 286/860/373 267/1016/354 +f 263/193/350 282/17/374 278/358/375 259/218/356 +f 256/142/376 275/830/377 272/991/378 252/462/349 +f 249/137/379 269/224/380 280/267/367 261/343/358 +f 264/858/361 283/365/381 271/562/382 251/652/383 +f 257/323/359 276/178/368 287/792/366 268/149/365 +f 311/415/352 313/702/384 279/48/385 260/292/360 +f 258/136/355 277/976/386 281/914/370 262/872/369 +f 252/462/349 272/991/378 282/17/374 263/193/350 +f 266/950/387 285/892/388 274/557/372 255/820/353 +f 310/583/357 312/922/389 285/892/388 266/950/387 +f 251/652/383 271/562/382 275/630/377 256/910/376 +f 267/1016/354 286/860/373 277/976/386 258/136/355 +f 260/292/360 279/48/385 283/365/381 264/858/361 +f 313/702/384 315/189/390 298/451/391 279/48/385 +f 277/976/386 296/896/392 300/598/393 281/914/370 +f 272/991/378 291/933/394 301/564/395 282/17/374 +f 285/892/388 304/689/396 293/655/397 274/557/372 +f 312/922/389 314/939/398 304/689/396 285/892/388 +f 271/562/382 290/662/399 294/413/400 275/630/377 +f 286/860/373 305/887/401 296/896/392 277/976/386 +f 279/48/385 298/451/391 302/619/402 283/365/381 +f 273/647/363 292/244/403 303/23/404 284/177/364 +f 287/792/366 306/1001/405 292/244/403 273/647/363 +f 280/267/367 299/385/406 295/797/407 276/178/368 +f 281/914/370 300/598/393 289/677/408 270/493/371 +f 274/557/372 293/655/397 305/887/401 286/860/373 +f 282/17/374 301/564/395 297/624/409 278/358/375 +f 275/830/377 294/897/400 291/933/394 272/991/378 +f 269/224/380 288/11/410 299/385/406 280/267/367 +f 283/365/381 302/619/402 290/662/399 271/562/382 +f 276/178/368 295/797/407 306/1001/405 287/792/366 +f 290/662/399 302/619/402 322/248/411 319/1024/412 +f 301/564/395 291/933/394 317/49/413 316/660/414 +f 302/619/402 298/451/391 323/318/415 322/248/411 +f 291/933/394 294/897/400 318/419/416 317/49/413 +f 315/189/390 303/23/404 325/379/417 324/166/418 +f 297/624/409 301/564/395 316/660/414 321/245/419 +f 294/413/400 290/662/399 319/1024/412 318/870/416 +f 314/939/398 297/624/409 321/245/419 320/734/420 +f 303/23/404 304/689/396 326/704/421 325/379/417 +f 269/224/380 270/493/371 289/677/408 288/11/410 +f 300/598/393 296/896/392 295/797/407 299/385/406 +f 306/1001/405 295/797/407 296/896/392 305/887/401 +f 305/887/401 293/655/397 292/244/403 306/1001/405 +f 303/23/404 292/244/403 293/655/397 304/689/396 +f 304/689/396 314/939/398 320/734/420 326/704/421 +f 298/451/391 315/189/390 324/166/418 323/318/415 +f 278/358/375 297/624/409 314/939/398 312/922/389 +f 284/177/364 303/23/404 315/189/390 313/702/384 +f 259/218/356 278/358/375 312/922/389 310/583/357 +f 265/766/351 284/177/364 313/702/384 311/415/352 +f 227/800/342 254/957/348 249/137/379 222/384/341 +f 245/297/344 308/600/338 307/418/340 244/751/345 +f 243/378/346 309/412/335 308/600/338 245/297/344 +f 221/631/201 215/414/316 316/660/414 317/49/413 +f 318/870/416 319/1024/412 221/122/201 +f 221/631/201 317/49/413 318/419/416 +f 219/436/204 217/380/203 320/734/420 321/245/419 +f 220/126/200 218/205/202 322/248/411 323/318/415 +f 215/414/316 219/436/204 321/245/419 316/660/414 +f 218/205/202 221/122/201 319/1024/412 322/248/411 +f 327/257/195 216/809/194 324/166/418 325/379/417 +f 325/379/417 326/704/421 327/257/195 +f 217/380/203 327/257/195 326/704/421 320/734/420 +f 216/809/194 220/126/200 323/318/415 324/166/418 +f 222/384/341 249/137/379 261/343/358 237/279/333 +f 242/646/321 264/858/361 251/652/383 224/488/322 +f 248/599/323 268/149/365 253/262/362 226/325/324 +f 224/488/322 251/652/383 256/910/376 229/288/318 +f 231/645/334 257/323/359 268/149/365 248/599/323 +f 307/291/340 310/583/357 266/950/387 244/1028/345 +f 232/1023/331 258/136/355 262/872/369 238/55/332 +f 244/1028/345 266/950/387 255/820/353 228/685/327 +f 226/325/324 253/262/362 265/766/351 243/453/346 +f 229/775/318 256/142/376 252/462/349 225/837/319 +f 238/55/332 262/872/369 250/410/347 223/561/343 +f 299/385/406 288/11/410 289/677/408 300/598/393 +f 250/410/347 270/493/371 254/957/348 +f 254/957/348 269/224/380 249/137/379 +f 269/224/380 254/957/348 270/493/371 +f 328/280/422 361/884/423 382/988/424 358/620/425 +f 328/280/422 343/150/426 377/254/427 361/884/423 +f 328/280/422 342/75/428 371/930/429 343/150/426 +f 328/280/422 358/620/425 376/813/430 342/75/428 +f 329/814/431 341/648/432 370/602/433 350/937/434 +f 329/814/431 352/559/435 374/603/436 341/648/432 +f 422/739/437 353/21/19 380/296/18 434/307/438 +f 422/739/437 432/721/439 378/539/20 353/21/19 +f 330/740/440 346/843/441 374/603/436 352/559/435 +f 330/740/440 345/931/442 368/555/443 346/843/441 +f 423/426/444 354/674/29 373/815/28 430/586/445 +f 423/426/444 434/307/438 380/296/18 354/674/29 +f 331/703/446 348/728/447 369/190/448 347/492/449 +f 331/703/446 355/152/450 376/813/430 348/728/447 +f 424/932/451 356/738/38 381/876/37 435/456/452 +f 424/932/451 431/888/453 375/467/39 356/738/38 +f 332/344/454 342/75/428 376/813/430 355/152/450 +f 332/344/454 351/717/455 371/930/429 342/75/428 +f 425/741/456 357/34/46 379/762/45 433/316/457 +f 425/741/456 435/456/452 381/876/37 357/34/46 +f 333/835/458 360/483/459 372/1002/460 340/806/461 +f 333/835/458 358/620/425 382/988/424 360/483/459 +f 333/835/458 348/728/447 376/813/430 358/620/425 +f 333/835/458 340/806/461 369/190/448 348/728/447 +f 334/577/462 346/843/441 368/555/443 344/302/463 +f 334/577/462 359/742/464 374/603/436 346/843/441 +f 334/577/462 360/483/459 382/988/424 359/742/464 +f 334/577/462 344/302/463 372/1002/460 360/483/459 +f 335/789/465 341/648/432 374/603/436 359/742/464 +f 335/789/465 349/517/466 370/602/433 341/648/432 +f 335/789/465 361/884/423 377/254/427 349/517/466 +f 335/789/465 359/742/464 382/988/424 361/884/423 +f 336/695/467 364/912/468 377/254/427 343/150/426 +f 426/362/469 362/474/61 383/448/60 436/1003/470 +f 426/427/469 433/316/457 379/762/45 362/207/61 +f 336/867/467 343/150/426 371/930/429 351/717/455 +f 337/146/471 350/937/434 370/602/433 349/517/466 +f 427/727/472 363/107/64 378/539/20 432/721/439 +f 427/727/472 436/1003/470 383/448/60 363/107/64 +f 337/146/471 349/517/466 377/254/427 364/912/468 +f 365/76/473 387/370/474 388/748/475 339/22/476 +f 338/77/477 344/302/463 368/555/443 345/931/442 +f 338/77/477 365/76/473 372/1002/460 344/302/463 +f 428/350/478 430/586/445 373/815/28 366/671/71 +f 339/22/476 340/806/461 372/1002/460 365/76/473 +f 339/22/476 347/492/449 369/190/448 340/806/461 +f 429/981/479 367/760/73 375/467/39 431/888/453 +f 428/350/478 437/263/480 386/295/481 338/77/477 +f 386/295/481 391/989/482 392/672/483 387/370/474 +f 438/428/484 440/868/485 389/710/80 384/756/79 +f 338/77/477 386/295/481 387/370/474 365/76/473 +f 429/981/479 438/428/484 384/756/79 367/760/73 +f 391/127/482 396/962/486 397/313/487 392/429/483 +f 440/696/485 442/798/488 394/480/84 389/700/80 +f 387/370/474 392/672/483 393/319/489 388/748/475 +f 437/263/480 439/101/490 391/989/482 386/295/481 +f 392/429/483 397/313/487 398/799/491 393/621/489 +f 439/303/490 441/363/492 396/962/486 391/127/482 +f 530/98/493 495/255/494 494/538/495 526/481/496 +f 450/281/497 443/673/498 401/482/499 415/683/500 +f 449/954/501 444/565/502 399/615/100 417/776/99 +f 529/256/503 497/438/504 496/1004/505 528/282/506 +f 746/827/507 446/828/508 404/825/108 735/173/107 +f 744/24/509 406/430/510 407/1015/511 742/604/512 +f 742/444/512 407/684/511 408/686/513 743/687/514 +f 745/336/515 445/1005/516 406/430/510 744/24/509 +f 758/366/517 447/57/518 412/461/519 755/368/520 +f 756/532/521 411/311/522 410/829/523 754/665/524 +f 755/368/520 412/461/519 411/108/522 756/866/521 +f 757/916/525 448/167/526 409/690/128 749/977/127 +f 524/383/527 492/675/528 493/109/529 525/626/530 +f 442/798/488 449/954/501 417/776/99 394/480/84 +f 441/363/492 450/281/497 415/683/500 396/962/486 +f 526/481/496 494/538/495 499/304/531 527/364/532 +f 479/94/533 473/510/534 454/210/535 465/50/536 +f 407/705/511 470/729/537 408/181/513 +f 407/95/511 406/371/510 481/351/538 +f 395/400/142 416/44/143 450/281/497 441/363/492 +f 398/799/491 414/1/539 449/954/501 442/798/488 +f 754/665/524 410/829/523 448/167/526 757/916/525 +f 751/969/145 413/45/146 447/57/518 758/366/517 +f 737/853/147 405/260/148 445/1005/516 745/336/515 +f 743/687/514 408/686/513 446/828/508 746/827/507 +f 414/1/539 403/147/540 444/565/502 449/954/501 +f 416/44/143 400/118/150 443/673/498 450/281/497 +f 390/67/151 395/400/142 441/363/492 439/303/490 +f 385/543/152 390/305/151 439/101/490 437/263/480 +f 393/621/489 398/799/491 442/798/488 440/696/485 +f 339/22/476 388/748/475 438/428/484 429/981/479 +f 388/748/475 393/319/489 440/868/485 438/428/484 +f 366/671/71 385/543/152 437/263/480 428/350/478 +f 339/22/476 429/981/479 431/888/453 347/492/449 +f 338/77/477 345/931/442 430/586/445 428/350/478 +f 337/146/471 364/912/468 436/1003/470 427/727/472 +f 337/146/471 427/727/472 432/721/439 350/937/434 +f 336/867/467 351/717/455 433/316/457 426/427/469 +f 336/695/467 426/362/469 436/1003/470 364/912/468 +f 332/344/454 355/152/450 435/456/452 425/741/456 +f 332/344/454 425/741/456 433/316/457 351/717/455 +f 331/703/446 347/492/449 431/888/453 424/932/451 +f 331/703/446 424/932/451 435/456/452 355/152/450 +f 330/740/440 352/559/435 434/307/438 423/426/444 +f 330/740/440 423/426/444 430/586/445 345/931/442 +f 329/814/431 350/937/434 432/721/439 422/739/437 +f 329/814/431 422/739/437 434/307/438 352/559/435 +f 418/743/541 446/955/508 408/181/513 +f 420/816/542 406/371/510 445/449/516 +f 404/346/108 446/955/508 418/743/541 451/530/155 +f 482/568/156 480/372/543 419/990/544 421/736/157 +f 405/1014/148 452/271/160 420/816/542 445/449/516 +f 469/656/545 471/569/162 421/952/157 419/657/544 +f 804/293/546 485/818/547 457/511/548 798/507/549 +f 490/730/550 483/556/551 453/71/552 467/558/553 +f 489/25/554 484/74/555 456/934/556 466/548/557 +f 478/26/558 472/1017/559 455/373/560 468/627/561 +f 486/9/562 488/688/563 464/445/564 460/842/565 +f 803/801/566 486/9/562 460/842/565 800/79/567 +f 802/658/568 474/8/569 459/484/570 +f 801/940/571 475/917/572 458/659/573 799/819/574 +f 462/179/575 688/831/576 577/446/577 487/396/578 +f 474/8/569 476/2/579 463/622/580 459/484/570 +f 475/917/572 477/768/581 462/179/575 458/659/573 +f 485/818/547 487/396/578 461/353/582 457/511/548 +f 469/656/545 478/26/558 468/627/561 420/816/542 +f 481/351/538 489/25/554 466/548/557 407/95/511 +f 480/372/543 490/730/550 467/558/553 419/990/544 +f 470/729/537 479/94/533 465/50/536 418/743/541 +f 407/705/511 466/584/557 479/94/533 470/729/537 +f 419/657/544 467/151/553 478/26/558 469/656/545 +f 460/52/565 464/951/564 477/768/581 475/917/572 +f 457/53/548 461/1006/582 476/2/579 474/8/569 +f 487/396/578 577/446/577 581/744/583 461/353/582 +f 800/607/567 460/52/565 475/917/572 801/940/571 +f 798/399/549 457/53/548 474/8/569 802/658/568 +f 467/151/553 453/605/552 472/1017/559 478/26/558 +f 420/816/542 452/271/160 471/569/162 469/656/545 +f 466/584/557 456/27/556 473/510/534 479/94/533 +f 476/2/579 579/1007/584 582/312/585 463/622/580 +f 418/743/541 465/50/536 490/730/550 480/372/543 +f 420/816/542 468/627/561 489/25/554 481/351/538 +f 458/659/573 462/179/575 487/396/578 485/818/547 +f 464/951/564 580/264/586 578/447/587 477/768/581 +f 459/484/570 486/9/562 803/801/566 +f 459/484/570 463/622/580 488/688/563 486/9/562 +f 468/627/561 455/373/560 484/74/555 489/25/554 +f 465/50/536 454/210/535 483/556/551 490/730/550 +f 799/819/574 458/659/573 485/818/547 804/293/546 +f 451/530/155 418/743/541 480/372/543 482/568/156 +f 418/743/541 408/181/513 470/729/537 +f 420/816/542 481/351/538 406/371/510 +f 789/86/588 505/628/589 504/578/590 788/918/591 +f 787/745/592 502/767/593 506/769/594 783/836/595 +f 784/110/596 508/289/597 500/315/598 785/96/599 +f 785/96/599 500/315/598 501/317/600 786/374/601 +f 527/364/532 499/304/531 491/791/602 531/320/603 +f 525/626/530 493/109/529 497/438/504 529/256/503 +f 531/320/603 491/791/602 492/675/528 524/383/527 +f 528/282/506 496/1004/505 495/265/494 530/802/493 +f 773/431/604 498/219/605 509/18/606 769/923/607 +f 772/258/608 512/808/609 511/356/610 771/28/611 +f 770/111/612 514/512/613 513/182/614 767/579/615 +f 771/28/611 511/356/610 516/479/616 768/73/617 +f 786/374/601 501/317/600 502/767/593 787/745/592 +f 790/935/618 503/676/619 508/289/597 784/110/596 +f 783/836/595 506/769/594 505/628/589 789/86/588 +f 788/285/591 504/485/590 503/676/619 790/935/618 +f 510/1018/620 534/212/621 538/321/622 514/168/613 +f 516/563/616 540/654/623 532/608/624 498/72/605 +f 498/72/605 532/608/624 533/941/625 509/886/606 +f 512/283/609 536/452/626 535/153/627 511/735/610 +f 768/73/617 516/479/616 498/219/605 773/431/604 +f 774/29/628 510/873/620 514/512/613 770/111/612 +f 767/579/615 513/182/614 512/432/609 772/540/608 +f 769/923/607 509/18/606 510/873/620 774/29/628 +f 734/80/629 521/898/630 523/192/631 731/832/632 +f 732/97/633 517/984/634 520/259/635 729/33/636 +f 731/832/632 523/192/631 507/81/637 +f 733/871/638 519/216/639 522/582/640 730/16/641 +f 728/749/642 518/478/643 519/216/639 733/871/638 +f 507/81/637 517/984/634 732/97/633 +f 729/961/636 520/123/635 518/478/643 728/749/642 +f 730/16/641 522/582/640 521/898/630 734/80/629 +f 403/147/540 528/282/506 530/802/493 402/919/644 +f 396/962/486 531/320/603 524/383/527 397/313/487 +f 398/799/491 525/626/530 529/256/503 414/1/539 +f 415/683/500 527/364/532 531/320/603 396/962/486 +f 401/482/499 526/481/496 527/364/532 415/683/500 +f 397/313/487 524/383/527 525/626/530 398/799/491 +f 414/1/539 529/256/503 528/282/506 403/147/540 +f 402/486/644 530/98/493 526/481/496 401/482/499 +f 533/941/625 541/979/645 542/980/646 534/212/621 +f 537/314/647 545/611/648 544/634/649 536/452/626 +f 534/212/621 542/980/646 546/473/650 538/321/622 +f 540/654/623 548/58/651 515/536/652 532/608/624 +f 513/521/614 537/314/647 536/452/626 512/283/609 +f 509/886/606 533/941/625 534/212/621 510/1018/620 +f 511/243/610 535/284/627 540/654/623 516/563/616 +f 514/168/613 538/321/622 537/924/647 513/337/614 +f 695/664/653 556/913/654 539/956/655 694/546/656 +f 694/546/656 539/956/655 549/632/657 691/82/658 +f 692/920/659 552/793/660 551/752/661 689/290/662 +f 693/433/663 554/87/664 553/869/665 690/340/666 +f 535/284/627 543/982/667 548/58/651 540/654/623 +f 545/246/648 567/183/668 566/341/669 546/473/650 +f 536/452/626 544/634/649 543/960/667 535/153/627 +f 532/608/624 515/536/652 541/979/645 533/941/625 +f 555/958/670 552/994/660 553/869/665 554/87/664 +f 556/913/654 551/723/661 552/994/660 555/958/670 +f 539/956/655 556/913/654 555/958/670 549/632/657 +f 549/632/657 555/958/670 554/87/664 550/697/671 +f 696/247/672 550/697/671 554/87/664 693/433/663 +f 690/423/666 553/862/665 552/793/660 692/920/659 +f 691/82/658 549/632/657 550/697/671 696/247/672 +f 689/874/662 551/723/661 556/913/654 695/664/653 +f 718/560/673 557/191/674 562/138/675 716/821/676 +f 720/489/677 560/287/678 563/963/679 717/457/680 +f 719/719/681 559/184/682 547/13/683 713/1008/684 +f 717/457/680 563/963/679 558/545/685 714/666/686 +f 714/666/686 558/545/685 559/925/682 719/733/681 +f 713/1008/684 547/13/683 557/154/674 718/609/673 +f 715/804/687 561/10/688 560/287/678 720/489/677 +f 716/821/676 562/138/675 561/10/688 715/804/687 +f 564/635/689 568/899/690 569/679/691 565/803/692 +f 537/314/647 565/580/692 567/105/668 545/611/648 +f 546/473/650 566/341/669 564/635/689 538/321/622 +f 538/321/622 564/635/689 565/803/692 537/924/647 +f 569/490/691 573/518/693 575/3/694 571/508/695 +f 565/580/692 569/490/691 571/508/695 567/105/668 +f 566/341/669 570/286/696 568/899/690 564/635/689 +f 567/183/668 571/985/695 570/286/696 566/341/669 +f 572/636/697 574/859/698 575/102/694 573/83/693 +f 570/286/696 574/859/698 572/636/697 568/899/690 +f 571/985/695 575/102/694 574/859/698 570/286/696 +f 568/899/690 572/636/697 573/83/693 569/679/691 +f 463/622/580 582/312/585 576/993/699 488/688/563 +f 488/688/563 576/993/699 580/1027/586 464/445/564 +f 461/1006/582 581/885/583 579/1007/584 476/2/579 +f 477/768/581 578/447/587 688/831/576 462/179/575 +f 602/124/700 601/844/701 586/547/702 590/15/703 +f 603/992/704 602/124/700 590/15/703 585/459/705 +f 609/141/706 608/544/707 591/863/708 587/823/709 +f 608/544/707 607/537/710 589/7/711 591/863/708 +f 600/460/712 599/865/713 593/1019/714 594/720/715 +f 598/519/716 600/460/712 594/720/715 592/722/717 +f 670/509/718 669/103/719 597/434/720 596/698/721 +f 669/103/719 668/585/722 595/338/723 597/434/720 +f 583/861/724 588/209/725 600/460/712 598/519/716 +f 588/209/725 584/822/726 599/865/713 600/460/712 +f 596/698/721 597/434/720 602/124/700 603/992/704 +f 597/434/720 595/338/723 601/844/701 602/124/700 +f 591/863/708 589/7/711 605/155/727 606/376/728 +f 587/823/709 591/863/708 606/376/728 604/983/729 +f 594/720/715 593/1019/714 607/537/710 608/544/707 +f 592/722/717 594/720/715 608/544/707 609/141/706 +f 584/417/726 588/420/725 615/375/730 611/663/731 +f 586/1026/702 601/148/701 624/249/732 613/649/733 +f 604/964/729 670/476/718 672/678/734 626/213/735 +f 589/220/711 607/845/710 628/894/736 616/747/737 +f 607/845/710 593/458/714 619/339/738 628/894/736 +f 595/895/723 668/533/722 671/342/739 620/890/740 +f 598/125/716 592/357/717 618/637/741 622/221/742 +f 601/148/701 595/895/723 620/890/740 624/249/732 +f 670/476/718 596/206/721 621/454/743 672/678/734 +f 596/206/721 603/807/704 625/786/744 621/454/743 +f 614/534/745 626/213/735 645/354/746 634/169/747 +f 629/187/748 614/534/745 634/169/747 648/520/749 +f 622/221/742 618/637/741 637/99/750 641/516/751 +f 623/31/752 611/663/731 631/12/753 642/650/754 +f 616/747/737 628/894/736 647/864/755 635/421/756 +f 624/249/732 620/890/740 639/891/757 643/787/758 +f 617/475/759 613/649/733 633/581/760 636/889/761 +f 610/1009/762 622/221/742 641/516/751 630/217/763 +f 625/786/744 612/32/764 632/377/765 644/4/766 +f 618/637/741 629/187/748 648/520/749 637/99/750 +f 672/678/734 621/454/743 640/746/767 674/732/768 +f 619/339/738 623/31/752 642/650/754 638/139/769 +f 613/649/733 624/249/732 643/787/758 633/581/760 +f 627/88/770 616/747/737 635/421/756 646/1025/771 +f 671/342/739 627/88/770 646/1025/771 673/85/772 +f 612/32/764 617/494/759 636/838/761 632/377/765 +f 628/894/736 619/339/738 638/139/769 647/864/755 +f 621/454/743 625/786/744 644/4/766 640/746/767 +f 674/732/768 640/746/767 659/56/773 676/623/774 +f 638/139/769 642/650/754 661/795/775 657/833/776 +f 633/581/760 643/787/758 662/223/777 652/59/778 +f 646/1025/771 635/421/756 654/506/779 665/839/780 +f 673/85/772 646/1025/771 665/839/780 675/936/781 +f 632/377/765 636/838/761 655/100/782 651/294/783 +f 647/864/755 638/139/769 657/833/776 666/398/784 +f 640/746/767 644/4/766 663/266/785 659/56/773 +f 634/169/747 645/354/746 664/322/786 653/706/787 +f 648/520/749 634/169/747 653/706/787 667/824/788 +f 641/516/751 637/99/750 656/790/789 660/355/790 +f 642/650/754 631/12/753 650/601/791 661/795/775 +f 635/421/756 647/864/755 666/398/784 654/506/779 +f 643/787/758 639/891/757 658/535/792 662/223/777 +f 636/889/761 633/581/760 652/59/778 655/416/782 +f 630/217/763 641/516/751 660/355/790 649/222/793 +f 644/4/766 632/377/765 651/294/783 663/266/785 +f 637/99/750 648/520/749 667/824/788 656/790/789 +f 651/294/783 680/185/794 683/208/795 663/266/785 +f 662/223/777 677/437/796 678/1022/797 652/59/778 +f 663/266/785 683/208/795 684/770/798 659/56/773 +f 652/59/778 678/1022/797 679/211/799 655/416/782 +f 676/623/774 685/549/800 686/805/801 664/322/786 +f 658/535/792 682/345/802 677/437/796 662/223/777 +f 655/100/782 679/857/799 680/185/794 651/294/783 +f 675/936/781 681/893/803 682/345/802 658/535/792 +f 664/322/786 686/805/801 687/84/804 665/839/780 +f 630/217/763 649/222/793 650/601/791 631/12/753 +f 661/795/775 660/355/790 656/790/789 657/833/776 +f 667/824/788 666/398/784 657/833/776 656/790/789 +f 666/398/784 667/824/788 653/706/787 654/506/779 +f 664/322/786 665/839/780 654/506/779 653/706/787 +f 665/839/780 687/84/804 681/893/803 675/936/781 +f 659/56/773 684/770/798 685/549/800 676/623/774 +f 639/891/757 673/85/772 675/936/781 658/535/792 +f 645/354/746 674/732/768 676/623/774 664/322/786 +f 620/890/740 671/342/739 673/85/772 639/891/757 +f 626/213/735 672/678/734 674/732/768 645/354/746 +f 588/420/725 583/306/724 610/1009/762 615/375/730 +f 606/376/728 605/155/727 668/585/722 669/103/719 +f 604/983/729 606/376/728 669/103/719 670/509/718 +f 582/653/585 678/1022/797 677/437/796 576/938/699 +f 679/857/799 582/542/585 680/185/794 +f 582/653/585 679/211/799 678/1022/797 +f 580/381/586 682/345/802 681/893/803 578/915/587 +f 581/1011/583 684/770/798 683/208/795 579/450/584 +f 576/938/699 677/437/796 682/345/802 580/381/586 +f 579/450/584 683/208/795 680/185/794 582/542/585 +f 688/699/576 686/805/801 685/549/800 577/794/577 +f 686/805/801 688/699/576 687/84/804 +f 578/915/587 681/893/803 687/84/804 688/699/576 +f 577/794/577 685/549/800 684/770/798 581/1011/583 +f 583/306/724 598/125/716 622/221/742 610/1009/762 +f 603/807/704 585/104/705 612/32/764 625/786/744 +f 609/629/706 587/701/709 614/534/745 629/187/748 +f 585/104/705 590/14/703 617/494/759 612/32/764 +f 592/357/717 609/629/706 629/187/748 618/637/741 +f 668/533/722 605/352/727 627/88/770 671/342/739 +f 593/458/714 599/1012/713 623/31/752 619/339/738 +f 605/352/727 589/220/711 616/747/737 627/88/770 +f 587/701/709 604/964/729 626/213/735 614/534/745 +f 590/959/703 586/1026/702 613/649/733 617/475/759 +f 599/1012/713 584/417/726 611/663/731 623/31/752 +f 660/355/790 661/795/775 650/601/791 649/222/793 +f 611/663/731 615/375/730 631/12/753 +f 615/375/730 610/1009/762 630/217/763 +f 630/217/763 631/12/753 615/375/730 +f 557/191/674 689/874/662 695/664/653 562/138/675 +f 560/287/678 691/82/658 696/247/672 563/963/679 +f 559/184/682 690/423/666 692/920/659 547/13/683 +f 563/963/679 696/247/672 693/433/663 558/545/685 +f 558/545/685 693/433/663 690/340/666 559/925/682 +f 547/13/683 692/920/659 689/290/662 557/154/674 +f 561/10/688 694/546/656 691/82/658 560/287/678 +f 562/138/675 695/664/653 694/546/656 561/10/688 +f 196/6/293 201/796/292 703/731/270 697/19/277 +f 199/1010/297 202/784/296 704/724/289 699/850/274 +f 198/812/301 186/472/300 700/232/276 698/788/281 +f 202/784/296 197/909/303 701/712/280 704/724/289 +f 197/909/303 198/276/301 698/1021/281 701/712/280 +f 186/472/300 196/1000/293 697/531/277 700/232/276 +f 200/455/305 199/1010/297 699/850/274 702/332/271 +f 201/796/292 200/455/305 702/332/271 703/731/270 +f 187/773/269 154/590/268 707/817/304 708/397/291 +f 154/590/268 180/65/263 712/156/294 707/817/304 +f 183/54/265 182/425/284 710/165/290 705/774/299 +f 185/334/267 184/968/266 711/242/298 706/435/302 +f 181/782/262 185/334/267 706/435/302 709/651/295 +f 184/234/266 183/54/265 705/774/299 711/201/298 +f 180/65/263 181/782/262 709/651/295 712/156/294 +f 182/576/284 187/773/269 708/397/291 710/143/290 +f 548/58/651 716/821/676 715/804/687 515/536/652 +f 515/536/652 715/804/687 720/489/677 541/979/645 +f 544/634/649 713/1008/684 718/609/673 543/960/667 +f 546/473/650 714/666/686 719/733/681 545/246/648 +f 542/980/646 717/457/680 714/666/686 546/473/650 +f 545/611/648 719/719/681 713/1008/684 544/634/649 +f 541/979/645 720/489/677 717/457/680 542/980/646 +f 543/982/667 718/560/673 716/821/676 548/58/651 +f 139/878/215 140/261/218 727/200/246 723/273/256 +f 143/301/207 142/112/236 721/408/259 722/230/251 +f 145/906/211 144/694/208 725/469/250 +f 142/112/236 147/709/216 726/335/255 721/408/259 +f 147/709/216 139/878/215 723/273/256 726/335/255 +f 141/551/212 145/906/211 724/227/247 +f 144/694/208 143/498/207 722/132/251 725/469/250 +f 140/261/218 141/551/212 724/227/247 727/200/246 +f 500/315/598 730/16/641 734/80/629 501/317/600 +f 504/485/590 729/961/636 728/749/642 503/676/619 +f 505/628/589 506/769/594 732/97/633 +f 503/676/619 728/749/642 733/871/638 508/289/597 +f 508/289/597 733/871/638 730/16/641 500/315/598 +f 502/767/593 731/832/632 506/769/594 +f 505/628/589 732/97/633 729/33/636 504/578/590 +f 501/317/600 734/80/629 731/832/632 502/767/593 +f 410/829/523 743/687/514 746/827/507 448/167/526 +f 413/45/146 737/853/147 745/336/515 447/57/518 +f 447/57/518 745/336/515 744/24/509 412/461/519 +f 411/311/522 742/444/512 743/687/514 410/829/523 +f 412/461/519 744/24/509 742/604/512 411/108/522 +f 448/167/526 746/827/507 735/173/107 409/690/128 +f 57/309/124 91/308/129 741/228/106 738/943/114 +f 413/45/146 90/999/121 740/161/116 737/853/147 +f 90/999/121 59/162/120 739/41/110 740/161/116 +f 58/572/125 57/309/124 738/943/114 736/440/111 +f 59/162/120 58/270/125 736/616/111 739/41/110 +f 91/308/129 409/690/128 735/173/107 741/228/106 +f 400/118/150 751/969/145 758/366/517 443/673/498 +f 403/147/540 754/665/524 757/916/525 444/565/502 +f 444/565/502 757/916/525 749/977/127 399/615/100 +f 401/482/499 755/368/520 756/866/521 402/486/644 +f 402/919/644 756/532/521 754/665/524 403/147/540 +f 443/673/498 758/366/517 755/368/520 401/482/499 +f 400/118/150 86/967/97 753/117/118 751/969/145 +f 53/840/149 87/403/101 752/235/126 747/389/123 +f 87/403/101 399/615/100 749/977/127 752/235/126 +f 51/614/96 52/239/261 750/669/122 748/708/119 +f 52/114/261 53/840/149 747/389/123 750/144/122 +f 86/967/97 51/614/96 748/708/119 753/117/118 +f 160/466/249 162/407/248 766/527/245 761/164/222 +f 156/526/253 159/763/252 764/120/225 759/496/230 +f 162/407/248 146/571/254 762/726/229 766/527/245 +f 158/528/258 161/237/257 765/754/221 760/464/233 +f 157/929/260 158/528/258 760/464/233 763/240/226 +f 146/571/254 156/526/253 759/496/230 762/726/229 +f 159/225/252 157/929/260 763/240/226 764/495/225 +f 161/237/257 160/466/249 761/164/222 765/754/221 +f 521/898/630 769/923/607 774/29/628 523/192/631 +f 517/984/634 767/579/615 772/540/608 520/259/635 +f 523/192/631 774/29/628 770/111/612 507/81/637 +f 519/216/639 768/73/617 773/431/604 522/582/640 +f 518/478/643 771/28/611 768/73/617 519/216/639 +f 507/81/637 770/111/612 767/579/615 517/984/634 +f 520/123/635 772/258/608 771/28/611 518/478/643 +f 522/582/640 773/431/604 769/923/607 521/898/630 +f 134/501/93 133/39/92 782/487/235 780/755/206 +f 136/574/105 135/40/104 781/900/205 775/525/210 +f 133/39/92 138/737/135 776/499/213 782/487/235 +f 131/965/133 132/42/132 779/401/209 778/670/217 +f 130/333/220 131/965/133 778/670/217 777/233/214 +f 138/737/135 130/333/220 777/233/214 776/499/213 +f 132/42/132 136/574/105 775/525/210 779/401/209 +f 135/40/104 134/406/93 780/693/206 781/900/205 +f 495/255/494 788/285/591 790/935/618 494/538/495 +f 497/438/504 783/836/595 789/86/588 496/1004/505 +f 494/538/495 790/935/618 784/110/596 499/304/531 +f 492/675/528 786/374/601 787/745/592 493/109/529 +f 491/791/602 785/96/599 786/374/601 492/675/528 +f 499/304/531 784/110/596 785/96/599 491/791/602 +f 493/109/529 787/745/592 783/836/595 497/438/504 +f 496/1004/505 789/86/588 788/918/591 495/265/494 +f 506/769/594 507/81/637 732/97/633 +f 145/906/211 146/571/254 724/227/247 +f 506/769/594 731/832/632 507/81/637 +f 145/906/211 725/469/250 146/571/254 +f 95/409/138 122/299/170 797/592/163 792/89/189 +f 96/765/177 123/236/174 796/347/183 +f 94/390/169 112/252/178 795/145/186 791/904/164 +f 97/163/173 113/106/139 794/711/188 793/392/184 +f 113/106/139 95/409/138 792/89/189 794/711/188 +f 112/252/178 96/765/177 795/145/186 +f 123/236/174 97/811/173 793/119/184 796/347/183 +f 122/299/170 94/778/169 791/593/164 797/592/163 +f 454/210/535 799/819/574 804/293/546 483/556/551 +f 484/74/555 455/373/560 803/801/566 +f 453/605/552 798/399/549 802/658/568 472/1017/559 +f 456/27/556 800/607/567 801/940/571 473/510/534 +f 473/510/534 801/940/571 799/819/574 454/210/535 +f 472/1017/559 802/658/568 455/373/560 +f 484/74/555 803/801/566 800/79/567 456/934/556 +f 483/556/551 804/293/546 798/507/549 453/71/552 +f 455/373/560 459/484/570 803/801/566 +f 96/765/177 100/404/187 795/145/186 +f 455/373/560 802/658/568 459/484/570 +f 96/765/177 796/347/183 100/404/187 diff --git a/modules/ufbx/data/maya_kenney_character_7700_binary.fbx b/modules/ufbx/data/maya_kenney_character_7700_binary.fbx new file mode 100644 index 0000000..e8c88d2 Binary files /dev/null and b/modules/ufbx/data/maya_kenney_character_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_kenney_character_9.obj b/modules/ufbx/data/maya_kenney_character_9.obj new file mode 100644 index 0000000..b112b04 --- /dev/null +++ b/modules/ufbx/data/maya_kenney_character_9.obj @@ -0,0 +1,3466 @@ +# This file uses centimeters as units for non-parametric coordinates. + +v 43.154904 329.001531 56.302542 +v 19.772936 336.707781 -12.924403 +v 19.772930 292.100928 -13.827526 +v 21.456566 279.242601 84.176751 +v 21.456559 328.423919 81.752968 +v 42.140403 283.538303 57.091828 +v 42.140409 288.085058 14.142821 +v 43.154916 332.926681 15.050704 +v 20.957839 353.458796 61.465826 +v 20.957857 357.689908 14.342065 +v 20.957853 258.764317 12.339179 +v 20.957850 249.958764 62.789841 +v 35.934052 262.586245 55.395274 +v 34.452903 334.548186 -4.698181 +v 34.452882 327.553308 71.398104 +v 35.934040 347.911153 58.912584 +v 35.934055 269.796874 14.138948 +v 19.709308 272.680353 -7.656163 +v 34.452900 292.194437 -5.555694 +v 21.392952 256.748213 80.736095 +v 34.452888 283.025396 73.488654 +v 35.934055 350.101474 15.764835 +v 19.709316 350.998115 -3.336539 +v 21.392938 345.010818 77.083305 +v 20.132786 312.700960 -15.852092 +v 21.816413 304.978694 83.582650 +v 43.014866 306.773242 55.219773 +v 42.391697 309.898784 13.915569 +v 44.996923 285.076958 36.748479 +v 46.011433 331.286675 37.256622 +v 21.910159 358.406645 38.863118 +v 21.910165 250.998527 37.543372 +v 30.722147 277.714610 -0.611365 +v 30.722144 260.161578 71.535140 +v 30.722156 348.497439 0.821731 +v 32.269132 342.871702 72.387854 +v 37.838572 264.294201 37.441348 +v 34.333470 311.622452 -6.512433 +v 34.827945 306.132996 71.773342 +v 37.838569 349.546606 38.419389 +v 45.516723 307.904130 36.361358 +v 13.200726 250.385622 23.009969 +v 14.996488 246.602588 33.917926 +v 13.003416 244.695385 44.731783 +v 11.741016 243.711355 18.767679 +v 15.728042 237.735348 28.480399 +v 11.474675 233.632809 38.673497 +v 22.636822 240.119460 17.394656 +v 26.217905 235.120134 28.450644 +v 22.365713 229.898292 38.507525 +v 28.240418 211.353589 5.693540 +v 32.876790 203.888181 21.926146 +v 27.886054 198.141974 36.733300 +v 29.941019 133.581052 -11.312491 +v 35.313097 131.141354 5.432302 +v 29.010758 132.263783 20.733788 +v 25.844750 157.505564 27.739773 +v 30.638596 162.947085 13.090638 +v 26.177287 169.876933 -2.008997 +v 25.818220 213.340146 37.703458 +v 26.158768 226.063920 8.532170 +v 11.886015 123.371605 24.550018 +v 1.685178 104.708076 1.598892 +v 17.291372 110.488853 -15.559299 +v 10.571070 337.343714 -13.739306 +v 10.571066 291.587207 -15.840134 +v 10.571049 277.424636 86.208388 +v 10.571042 328.952541 83.832109 +v 11.138872 355.943499 62.179561 +v 11.138890 359.262159 13.710454 +v 11.138885 256.866719 11.637322 +v 11.138882 247.843371 63.410450 +v 10.540576 271.504258 -9.009831 +v 10.540567 253.433813 82.015396 +v 10.540582 352.244233 -4.641163 +v 10.540555 346.184386 78.763971 +v 10.743513 313.050220 -16.775588 +v 10.743488 304.602566 86.464034 +v 11.595236 359.512550 38.885502 +v 8.115089 251.933673 19.043382 +v 7.323060 244.091352 47.095670 +v 6.628900 244.753364 17.053235 +v 6.310654 232.711727 40.860779 +v 11.810682 241.371873 15.630894 +v 11.481813 228.959496 40.928002 +v 14.145350 212.864733 2.883598 +v 13.725507 197.227842 40.016974 +v 14.152302 134.649608 -17.533782 +v 14.220157 129.240577 28.338969 +v 12.638122 171.471440 -5.280806 +v 12.239097 156.651717 30.989446 +v 12.924060 212.319333 40.884997 +v 13.333753 227.623249 5.720074 +v 6.067352 81.763540 25.877167 +v 15.174848 93.807418 41.950932 +v 24.698552 77.117976 17.245150 +v 36.408079 91.575359 30.920151 +v 6.896234 75.063102 27.737355 +v 15.510143 76.352848 46.311578 +v 25.150803 71.755114 18.761350 +v 36.611694 75.683224 36.906439 +v 7.608071 53.296063 24.736505 +v 15.562557 52.643425 41.280282 +v 23.439252 49.851602 16.081766 +v 33.165050 51.693153 32.902882 +v 11.420368 112.131183 31.113955 +v 36.595684 109.323540 17.192920 +v 3.157737 93.099061 17.542453 +v 23.125988 89.509542 4.701128 +v 5.752588 105.434702 -11.565472 +v 26.054192 128.266838 16.864730 +v 13.072030 77.607206 19.070045 +v 27.367410 94.730145 39.099788 +v 14.092025 72.482327 19.891447 +v 27.573636 76.085307 44.699373 +v 14.144981 50.983968 18.000615 +v 25.982311 51.734818 39.830408 +v 10.059375 88.100590 7.561084 +v 25.857869 113.513116 26.939105 +v 5.263330 111.516764 13.378425 +v 30.486840 118.768643 -7.359988 +v 6.587417 88.596189 35.260708 +v 33.962020 83.521656 22.574097 +v 7.353603 75.668353 38.517323 +v 34.393993 72.788809 25.807938 +v 8.185925 53.383732 34.752548 +v 32.089815 50.243524 22.736766 +v 33.728850 97.431739 8.165174 +v 3.460629 103.709177 25.948964 +v 49.376470 223.237636 15.427672 +v 50.150287 216.161970 21.025757 +v 46.594161 210.625104 25.568850 +v 30.882990 220.770575 8.304032 +v 26.872063 209.939816 13.103283 +v 26.722789 203.227595 21.781146 +v 36.322814 206.471995 23.353729 +v 69.210118 151.117271 -35.550476 +v 40.367264 222.525503 11.072892 +v 58.486956 205.803728 -2.227871 +v 58.752596 199.773431 1.783709 +v 55.257303 194.972421 5.948337 +v 41.254944 204.014467 -9.438700 +v 37.320799 194.582271 -4.941465 +v 37.743416 189.899338 1.369058 +v 46.005213 190.512419 4.574881 +v 55.405802 174.587583 -3.051562 +v 49.845663 206.647323 -7.817360 +v 69.179064 148.078925 -30.244839 +v 69.803751 146.169170 -24.984382 +v 53.644782 149.246806 -34.485361 +v 51.899022 144.854684 -26.283672 +v 54.946721 142.908081 -21.107827 +v 62.422127 143.328270 -21.282632 +v 67.519057 139.190309 -43.337937 +v 60.651594 150.901407 -37.202520 +v 46.410429 173.821198 -2.880818 +v 44.068891 181.882831 -20.120027 +v 53.238839 184.211060 -23.113714 +v 42.481944 175.790976 -9.771493 +v 66.251582 181.249723 -14.575860 +v 64.243191 185.052689 -21.129418 +v 65.007782 178.537785 -7.412729 +v 38.540116 230.442290 29.237498 +v 35.438815 225.077063 37.195875 +v 30.840799 215.905477 9.333055 +v 34.135073 227.958228 12.881597 +v 29.089826 205.023819 34.476330 +v 31.245229 213.382202 35.358087 +v 32.677388 206.481699 21.392736 +v 37.670526 236.229089 19.307655 +v 65.867138 146.874076 -40.089858 +v 67.062771 142.744894 -32.064136 +v 67.761320 142.238077 -23.521345 +v 55.303293 146.267241 -40.104505 +v 55.962354 140.142055 -28.105958 +v 58.193940 137.038645 -18.715024 +v 63.356531 136.566350 -18.192415 +v 42.456982 127.647667 -40.490302 +v 59.785956 147.273247 -43.506760 +v 68.843132 133.786386 -36.131231 +v 69.623476 131.860073 -27.799169 +v 56.956685 138.431017 -43.386777 +v 57.806355 130.381960 -32.597277 +v 59.708840 126.222487 -25.873592 +v 64.872175 125.667663 -25.498992 +v 59.020025 124.625581 -36.723756 +v 61.398613 140.064828 -46.599900 +v 42.717373 125.532085 -33.418044 +v 45.811006 122.018786 -28.176539 +v 47.539592 133.419209 -40.239460 +v 48.545519 130.826969 -29.704833 +v 51.546735 126.091488 -24.516464 +v 49.030226 123.205658 -23.990678 +v 45.160547 128.443415 -32.179511 +v 44.357690 132.006805 -42.755128 +v 58.642387 128.383223 -48.298413 +v 61.894304 116.297049 -30.675722 +v 62.745869 120.443351 -30.411838 +v 57.175273 117.175060 -42.609538 +v 57.093209 120.266847 -50.246360 +v 57.061356 125.879708 -51.988414 +v 60.433346 114.258701 -36.171562 +v 62.769830 125.218687 -15.958477 +v 57.703543 125.736818 -16.251509 +v 63.296694 122.116133 -23.438043 +v 58.230406 122.634240 -23.731085 +v 61.459196 117.222914 -18.685025 +v 56.378227 117.499706 -19.097718 +v 62.629569 121.203478 -25.864242 +v 57.548606 121.480282 -26.276948 +v 60.787123 108.407183 -25.073656 +v 57.223791 108.601304 -25.363084 +v 61.607933 111.198802 -30.108500 +v 58.044600 111.392922 -30.397940 +v 23.535930 26.137103 25.325333 +v 10.311977 29.545635 36.059157 +v 24.240738 28.265429 36.568926 +v 11.441150 27.362726 24.272424 +v 24.565434 27.057313 30.903728 +v 10.040743 28.254532 29.863925 +v 17.869993 26.511181 23.037355 +v 20.838341 14.319169 77.389357 +v 31.972110 13.786325 75.461379 +v 13.693160 0.078976 27.367696 +v 24.320291 -0.323793 25.898847 +v 11.939961 7.324353 52.845459 +v 26.541358 14.361241 77.509103 +v 34.778136 6.309827 49.165224 +v 19.992666 -0.574527 25.039062 +v 23.262872 6.845454 51.105528 +v 11.363329 11.052288 65.952442 +v 36.755764 9.873653 61.684041 +v 25.002176 10.787814 64.955471 +v 31.181610 2.364671 35.315123 +v 8.240701 3.287446 38.673347 +v 21.339515 2.486776 35.793462 +v 14.449982 12.788258 72.039453 +v 36.035994 11.781903 68.395428 +v 25.872028 12.759040 71.880392 +v 28.232530 0.408679 28.454119 +v 20.298615 0.280400 28.042781 +v 9.165916 1.188390 31.290111 +v 10.476986 5.446938 46.253254 +v 32.342154 4.618247 43.231123 +v 22.393027 4.874227 44.180592 +v 36.320055 8.050897 55.278318 +v 24.132521 8.816635 58.030509 +v 10.559298 9.229720 59.549938 +v 20.999411 22.437439 74.919107 +v 34.066212 21.875426 72.879055 +v 12.761813 7.898349 23.852207 +v 23.311345 7.380942 23.849336 +v 10.325237 15.523434 50.668136 +v 27.678254 22.459148 74.962463 +v 35.862106 14.435995 46.718124 +v 18.739082 7.406445 22.093235 +v 10.837530 19.513989 64.692804 +v 38.170758 18.251798 60.121116 +v 31.296140 10.217526 31.912111 +v 7.027765 11.193277 35.463394 +v 14.452742 21.372470 71.207860 +v 37.208501 20.302709 67.335173 +v 27.716219 8.133374 27.675234 +v 8.366272 8.917981 27.458359 +v 8.891381 13.513033 43.608309 +v 33.193102 12.639394 40.416015 +v 37.665376 16.300106 53.262464 +v 9.900103 17.562533 57.837919 +v 21.253915 25.793353 73.402579 +v 31.954467 25.466236 72.199907 +v 12.821724 13.396335 23.196507 +v 23.139155 13.573439 23.218858 +v 12.306578 21.050275 50.104281 +v 34.231550 20.207536 47.032469 +v 18.227457 13.056599 21.846485 +v 12.768060 24.410517 61.913635 +v 36.288083 23.395818 58.230736 +v 30.031481 15.897978 31.904430 +v 8.677536 16.576994 33.657491 +v 15.169029 26.126879 67.935105 +v 35.495380 25.300391 64.929565 +v 26.456863 14.472870 27.119810 +v 10.036758 14.845584 27.761385 +v 10.906429 19.598193 45.006895 +v 32.852608 18.837046 42.221790 +v 35.816979 21.576684 51.837941 +v 11.931161 22.590341 55.519667 +v 22.083721 29.944589 68.819774 +v 28.910857 29.594617 67.555870 +v 12.765351 19.220559 22.576147 +v 21.734509 19.445204 22.235514 +v 17.525689 24.978391 48.374753 +v 29.584348 25.633194 46.740474 +v 17.348225 19.268934 21.933232 +v 15.280382 27.700735 58.478577 +v 32.507825 28.428021 56.541635 +v 27.286834 22.606120 30.110886 +v 9.121086 22.510942 32.304414 +v 17.408049 29.983924 64.370043 +v 31.641579 29.624189 62.374784 +v 24.871027 20.275905 25.805095 +v 10.315000 20.510326 26.774904 +v 15.753894 25.144992 42.867072 +v 27.008513 26.757122 42.440508 +v 31.643108 26.745894 51.192750 +v 16.688579 26.611900 53.416486 +v 31.288448 3.482745 39.244854 +v 21.866271 3.680501 39.987027 +v 9.110327 4.376611 42.497649 +v 32.246757 11.423354 36.146102 +v 7.643520 12.366744 39.585091 +v 31.353614 17.346332 36.989099 +v 9.238443 18.161835 39.966115 +v 27.788582 24.726596 35.298898 +v 10.385133 25.378418 37.677031 +v 23.460712 24.451856 24.772744 +v 20.282477 22.701723 21.511788 +v 16.660920 23.576540 21.662419 +v 13.873708 24.288126 22.826034 +v 25.442630 26.251218 35.753389 +v 25.326100 25.972508 29.600351 +v 10.073426 24.155694 25.857615 +v 9.449410 26.069062 31.262572 +v 10.276499 26.777214 37.678065 +v 16.395746 27.768163 40.355892 +v 23.405121 27.165682 38.978092 +v 16.883041 29.493705 39.417906 +v -38.946947 329.001531 56.302542 +v -15.564975 336.707781 -12.924404 +v -15.564974 292.100928 -13.827528 +v -17.248613 279.242601 84.176751 +v -17.248601 328.423919 81.752968 +v -37.932450 283.538303 57.091828 +v -37.932453 288.085081 14.142818 +v -38.946959 332.926705 15.050701 +v -16.749880 353.458796 61.465820 +v -16.749896 357.689908 14.342064 +v -16.749896 258.764341 12.339177 +v -16.749896 249.958764 62.789841 +v -31.726095 262.586269 55.395274 +v -30.244943 334.548210 -4.698182 +v -30.244929 327.553332 71.398104 +v -31.726083 347.911177 58.912584 +v -31.726098 269.796898 14.138947 +v -15.501350 272.680353 -7.656164 +v -30.244943 292.194437 -5.555696 +v -17.184998 256.748213 80.736095 +v -30.244935 283.025420 73.488654 +v -31.726098 350.101497 15.764834 +v -15.501355 350.998115 -3.336540 +v -17.184982 345.010842 77.083305 +v -15.924826 312.700960 -15.852092 +v 2.103980 337.921951 -14.149339 +v 2.103979 291.085765 -16.272029 +v -17.608458 304.978694 83.582650 +v 2.103977 275.782313 86.573347 +v 2.103978 328.874030 85.733783 +v -38.806912 306.773242 55.219767 +v -38.183740 309.898808 13.915567 +v -40.788972 285.076958 36.748476 +v -41.803476 331.286675 37.256622 +v 2.103979 357.102452 62.813480 +v 2.103980 360.211208 13.119205 +v -17.702201 358.406645 38.863118 +v -17.702210 250.998527 37.543372 +v 2.103978 256.294586 11.015276 +v 2.103977 245.896874 63.981499 +v -26.514193 277.714634 -0.611367 +v -26.514190 260.161578 71.535140 +v -26.514199 348.497439 0.821730 +v -28.061175 342.871702 72.387854 +v -33.630615 264.294225 37.441348 +v 2.103978 270.422076 -10.255402 +v -30.125514 311.622452 -6.512434 +v 2.103977 252.676715 83.238960 +v -30.619991 306.132996 71.773342 +v -33.630612 349.546606 38.419386 +v 2.103980 353.379463 -5.276213 +v 2.103979 347.269953 80.024836 +v 2.103980 313.109824 -17.506828 +v 2.103978 304.309358 86.506538 +v -41.308770 307.904154 36.361355 +v 2.103980 360.596019 38.907433 +v 1.993371 243.397458 49.165638 +v 2.122627 252.296570 19.315978 +v -8.998899 250.565556 23.002099 +v -10.897339 246.812492 33.908750 +v -8.977222 244.873555 44.723995 +v 1.558922 231.864269 42.873384 +v 1.928818 245.855239 15.038516 +v -7.983723 244.191268 18.746813 +v -12.277229 238.416700 28.450739 +v -8.250030 234.112722 38.652635 +v 1.466961 228.095753 43.155183 +v 1.852842 242.667439 13.570820 +v -19.038290 241.133478 17.350541 +v -22.881700 236.314802 28.398648 +v -19.309349 230.912286 38.463415 +v 0.695826 196.386714 43.038438 +v 1.175882 214.255214 0.298021 +v -26.009193 212.673236 5.635932 +v -31.037524 205.442909 21.858268 +v -26.363543 199.461609 36.675695 +v -0.290917 128.877347 30.271181 +v -0.373072 135.425767 -21.355906 +v -30.631343 132.821129 -11.312490 +v -35.865974 130.074395 6.663549 +v -29.640502 129.852358 22.786914 +v -0.280126 155.866068 33.979629 +v -26.281086 158.773403 27.684356 +v -30.773568 164.440789 13.025348 +v -25.948548 171.144783 -2.064414 +v 0.180072 172.938655 -8.291346 +v -23.561290 214.541584 37.651167 +v -23.220791 227.265383 8.479871 +v 1.519309 228.564478 4.641610 +v 1.059688 211.380107 43.812488 +v -12.452868 119.178693 26.592724 +v -2.029574 104.504359 1.565375 +v -17.266330 115.252659 -18.713892 +v -0.172198 104.606211 1.582134 +v -6.363111 337.343714 -13.739306 +v -6.363109 291.587231 -15.840135 +v -6.363096 277.424636 86.208388 +v -6.363086 328.952541 83.832109 +v -6.930914 355.943499 62.179561 +v -6.930930 359.262159 13.710454 +v -6.930931 256.866719 11.637321 +v -6.930929 247.843371 63.410450 +v -6.332619 271.504258 -9.009832 +v -6.332614 253.433813 82.015396 +v -6.332622 352.244233 -4.641164 +v -6.332599 346.184386 78.763971 +v -6.535554 313.050220 -16.775588 +v -6.535534 304.602566 86.464034 +v -7.387277 359.512550 38.885502 +v -3.873761 252.030829 19.039131 +v -3.316477 244.177588 47.091900 +v -2.823356 244.983390 17.043278 +v -3.141559 232.941730 40.850825 +v -8.160331 241.857865 15.609818 +v -8.489134 229.445464 40.906931 +v -11.851378 213.497138 2.856012 +v -12.271192 197.860224 39.989389 +v -14.874402 134.285447 -17.533782 +v -14.806537 128.876417 28.338969 +v -12.340947 172.079002 -5.307362 +v -12.739965 157.259267 30.962889 +v -10.738799 212.895090 40.860004 +v -10.329174 228.199054 5.695074 +v -0.148750 117.545442 27.470352 +v -0.148750 117.545423 -18.683068 +v -7.608844 74.190778 2.769577 +v -17.455547 76.081274 22.412505 +v -25.813398 75.352542 -7.741018 +v -38.140085 80.631848 11.056008 +v -8.975041 73.649014 5.910063 +v -17.387599 60.210492 11.571479 +v -27.149582 79.173285 -0.324029 +v -38.503605 66.770948 6.969920 +v -8.121229 77.941367 -15.838128 +v -15.613660 61.192707 -14.972026 +v -23.867942 85.593673 -21.395502 +v -33.297971 68.816969 -18.146037 +v -13.154401 97.252957 23.157327 +v -37.639078 102.959944 8.894429 +v -4.283569 88.139564 1.874896 +v -23.620138 92.470030 -11.685144 +v -5.743447 104.804264 -11.669197 +v -26.700079 123.411730 19.769979 +v -0.010750 104.079114 -10.745337 +v -14.286593 74.482339 -5.476757 +v -29.496139 78.707651 20.010085 +v -16.142441 78.648019 1.282881 +v -29.419014 61.212428 10.098526 +v -14.634952 84.129420 -19.405937 +v -25.973773 62.182603 -16.758273 +v -10.707738 89.403848 -9.499567 +v -27.373183 101.032606 19.791323 +v -5.871210 110.906150 13.277961 +v -30.679128 120.725320 -8.260921 +v -0.304858 109.762420 13.001643 +v -8.566195 74.997135 14.321226 +v -35.310739 78.188223 -0.192413 +v -9.325664 65.851881 9.397308 +v -36.316448 74.172759 1.821348 +v -8.465686 67.997477 -14.548284 +v -32.363978 78.759601 -20.769023 +v -34.363377 97.618990 -4.957656 +v -4.970660 92.656943 14.620805 +v -46.296176 213.618687 18.506123 +v -47.974497 217.052607 26.715523 +v -45.161808 219.727522 33.706710 +v -28.313673 205.348829 21.167026 +v -25.745904 206.777673 33.323978 +v -26.450381 213.230903 42.169423 +v -35.534292 216.030890 38.322059 +v -63.214797 182.899061 92.118484 +v -37.474599 208.877519 19.087735 +v -57.684511 192.191379 28.986259 +v -58.727151 194.373280 35.818560 +v -55.879271 196.892268 41.995562 +v -40.863606 184.077459 30.819723 +v -38.188979 185.608859 41.551482 +v -39.201730 190.378268 47.728755 +v -47.299531 193.959089 47.011889 +v -48.869199 195.592329 54.053799 +v -49.027300 186.713235 27.694368 +v -61.306262 188.670340 92.120325 +v -60.325009 194.114283 91.268502 +v -47.935086 179.865208 90.976054 +v -43.478766 188.137618 90.474217 +v -44.771272 194.264284 90.042226 +v -51.913172 196.211818 90.836380 +v -59.028435 180.238264 106.023866 +v -55.479389 178.995994 91.890479 +v -40.448964 192.389652 53.440873 +v -45.921621 174.049744 54.607047 +v -55.816811 174.378368 55.276330 +v -39.545828 184.348783 54.591048 +v -64.141470 187.857422 55.377977 +v -65.437376 180.134115 55.036718 +v -60.058755 194.321188 54.050146 +v -35.269123 232.777409 26.258660 +v -32.623509 231.007677 34.778536 +v -28.270060 213.586260 9.605792 +v -30.761155 223.609568 10.784210 +v -27.437976 209.203106 36.210473 +v -29.206136 219.409662 36.291379 +v -30.829760 207.519583 23.678759 +v -33.825022 233.938649 14.627889 +v -58.886468 179.167954 97.588522 +v -58.257419 188.247589 97.352069 +v -57.937956 196.003512 93.682269 +v -48.530567 177.293829 96.490271 +v -46.510014 190.617160 95.922087 +v -47.037989 200.651899 94.259891 +v -51.889664 202.318183 95.180765 +v -31.378332 182.886916 109.997481 +v -53.449178 174.799256 97.995581 +v -58.310878 189.223927 107.302540 +v -57.761645 197.468667 104.964796 +v -48.641974 178.405159 105.073256 +v -46.481943 191.609352 106.777935 +v -46.696621 199.879723 107.311836 +v -51.543695 201.458496 108.377543 +v -47.888851 190.853614 111.008947 +v -53.647947 175.776368 105.941446 +v -30.133629 190.026313 108.569269 +v -31.960940 196.792990 109.079150 +v -36.572182 181.418949 104.513341 +v -35.349119 191.915135 101.859395 +v -37.039867 199.186211 103.479258 +v -34.338155 200.487178 105.917612 +v -32.415041 190.221887 105.292706 +v -33.890039 179.278582 107.096536 +v -49.613905 179.055280 113.656253 +v -47.897881 200.512571 115.963844 +v -49.950179 199.000305 112.239364 +v -44.357222 188.838072 120.504778 +v -45.844486 180.805167 121.730548 +v -47.590616 176.702483 117.553336 +v -46.292737 196.411963 120.421390 +v -48.690569 209.541171 103.750636 +v -43.886879 208.194511 102.692117 +v -49.151039 204.501909 109.999647 +v -44.347352 203.155225 108.941140 +v -46.017691 210.305709 111.985888 +v -41.147998 209.005374 111.174490 +v -48.548922 202.412767 111.762908 +v -43.679228 201.112408 110.951510 +v -44.104877 208.129927 122.502078 +v -40.689710 207.217975 121.933045 +v -45.880073 202.594515 122.345701 +v -42.464906 201.682587 121.776655 +v -21.822709 71.546679 -42.029592 +v -8.580036 61.339282 -41.002114 +v -22.387798 60.417949 -42.121876 +v -9.848311 72.903877 -40.834001 +v -22.774926 66.018282 -42.194854 +v -8.381139 67.488634 -41.062026 +v -16.239740 73.925953 -41.320738 +v -18.484476 30.727845 -77.506005 +v -29.635122 32.573932 -77.035021 +v -11.782251 81.180777 -64.637853 +v -22.422205 82.568617 -64.283617 +v -9.803274 55.529976 -71.180287 +v -24.186328 30.557968 -77.549266 +v -32.673642 59.039993 -70.284489 +v -18.102278 83.472158 -64.053269 +v -21.141396 57.184887 -70.757923 +v -9.110969 42.331096 -74.546666 +v -34.540766 46.411782 -73.505552 +v -22.758400 43.217665 -74.320371 +v -29.199940 73.023487 -66.718000 +v -6.229686 69.838745 -67.530834 +v -19.353788 72.626681 -66.819441 +v -12.143635 36.172449 -76.117414 +v -33.761543 39.657011 -75.228400 +v -23.566882 36.234056 -76.101559 +v -26.311722 79.960658 -64.948703 +v -18.381600 80.443610 -64.825709 +v -7.220326 77.268518 -65.635801 +v -8.398752 62.183518 -69.483296 +v -30.290303 65.038986 -68.754469 +v -20.332944 64.168496 -68.976729 +v -34.161583 52.868510 -71.858635 +v -21.949889 50.201279 -72.539147 +v -8.363447 48.787883 -72.899886 +v -18.658186 28.779430 -69.247209 +v -31.742832 30.721728 -68.751656 +v -10.872909 80.294761 -56.108100 +v -21.422823 80.473765 -56.589843 +v -8.198708 53.301819 -62.992879 +v -25.336525 28.678078 -69.272976 +v -33.770111 57.060279 -62.033651 +v -16.865660 82.015058 -55.669184 +v -8.587101 39.169053 -66.597414 +v -35.960340 43.538509 -65.482629 +v -29.335457 72.015121 -58.219433 +v -5.036054 68.647399 -59.079032 +v -12.144523 32.574634 -68.279301 +v -34.934178 36.279447 -67.334098 +v -25.794062 76.753619 -57.878286 +v -6.445488 76.699963 -57.025081 +v -6.827448 60.426184 -61.175797 +v -31.157014 63.432004 -60.408567 +v -35.515538 50.452115 -63.719174 +v -7.710232 46.082722 -64.834113 +v -18.922161 28.400682 -65.584748 +v -29.633173 29.519845 -65.299164 +v -10.932719 78.096370 -51.026285 +v -21.249595 77.906177 -50.919599 +v -10.179100 50.994297 -57.938846 +v -32.130891 53.899291 -57.197389 +v -16.350283 79.391215 -50.659526 +v -10.536267 39.093669 -60.974086 +v -34.088492 42.600693 -60.079313 +v -28.064981 69.175378 -53.301226 +v -6.695674 67.488024 -53.523039 +v -12.883838 33.006968 -62.526500 +v -33.236450 35.859205 -61.798769 +v -24.532892 74.055866 -52.115017 +v -8.107187 73.444102 -52.059466 +v -8.824154 56.141433 -56.626073 +v -30.794615 58.757421 -55.958322 +v -33.673874 49.044713 -58.435645 +v -9.755863 45.542135 -59.329428 +v -19.786839 30.267750 -59.694945 +v -26.625055 31.482046 -59.385150 +v -10.875608 75.704305 -45.679847 +v -19.847296 75.814645 -45.344952 +v -15.408857 50.472555 -53.691610 +v -27.480629 51.460234 -52.344933 +v -15.463862 76.199327 -45.330352 +v -13.074514 40.388319 -56.411386 +v -30.317491 41.560179 -54.867406 +v -25.328770 67.374180 -46.591674 +v -7.144639 65.670143 -47.715046 +v -15.149304 34.131124 -57.407546 +v -29.400060 35.923734 -56.763643 +v -22.952314 72.286735 -46.432513 +v -8.387980 71.446048 -46.667960 +v -13.684103 55.163316 -50.772086 +v -24.940507 54.632113 -49.202484 +v -29.500198 47.036132 -53.628876 +v -14.527018 45.300031 -54.811944 +v -29.271945 69.063807 -67.727941 +v -19.843365 68.397588 -67.898088 +v -7.065404 65.978677 -68.515347 +v -30.248532 67.741641 -59.309392 +v -5.615268 64.489903 -60.139351 +v -29.342023 64.041725 -54.610567 +v -7.200875 61.233863 -55.327259 +v -25.783861 61.819730 -47.369219 +v -8.359656 59.574459 -47.942305 +v -21.546532 71.090346 -42.299026 +v -18.398106 74.814158 -42.161238 +v -14.774412 74.272781 -41.468471 +v -11.976537 72.931301 -41.429004 +v -23.432469 60.678844 -46.271918 +v -23.368944 66.138219 -43.418463 +v -8.150481 70.407729 -43.054908 +v -7.478183 64.778839 -44.116722 +v -8.249561 58.871041 -46.733371 +v -14.344732 56.009660 -47.244144 +v -21.366419 57.447932 -47.096029 +v -15.054892 57.835375 -41.594929 +v -42.811954 180.253023 109.583992 +v -43.221220 199.109202 108.357004 +v -36.892366 189.447815 115.052729 +v -41.342646 191.400069 106.926458 +v -40.810123 200.515718 111.447492 +v -38.260347 181.861813 116.383046 +v -40.424874 178.006346 112.833232 +v -38.783699 196.618290 115.267674 +v 52.624309 129.512732 -44.853464 +v 56.698751 121.887632 -28.048392 +v 49.298617 119.873672 -38.605549 +v 53.325200 126.357562 -33.791014 +v 54.929489 118.325336 -27.922405 +v 49.134237 122.470944 -45.964657 +v 50.156790 127.508251 -47.961235 +v 52.501941 116.661877 -32.770027 +v 61.510295 124.645895 -36.702895 +v 65.621209 119.270725 -30.363102 +v 64.999664 126.353482 -49.003437 +v 62.097424 129.820279 -51.432547 +v 67.753619 119.724530 -34.183572 +v 60.823667 130.455975 -47.915391 +v 62.681234 121.164400 -30.461370 +v 65.728688 122.138696 -41.570907 +v -49.876690 191.423828 113.009374 +v -51.647466 200.339765 115.673414 +v -54.612148 180.725451 118.483860 +v -53.017378 176.438255 116.142435 +v -54.242969 197.143168 117.261449 +v -51.726252 178.924627 113.569254 +v -49.344525 198.814017 113.594738 +v -53.542697 189.234014 118.478887 +v 43.386438 193.844554 -15.921137 +v 40.870097 186.814963 -7.555334 +v 62.293953 196.580670 -14.044360 +v 61.655164 188.634932 -2.429339 +v 43.594068 183.727133 -0.989901 +v 52.237236 196.291694 -17.286386 +v 63.369042 192.824744 -7.911363 +v -46.121129 173.551375 40.212248 +v -40.960824 180.880125 43.859512 +v -64.494634 180.189258 39.719472 +v -60.422528 190.902002 43.632640 +v -41.892946 187.608130 45.279627 +v -55.318725 174.613709 39.510737 +v -63.785684 186.187167 41.587817 +v -0.608326 142.738919 29.290197 +v 32.939339 147.094060 4.983281 +v -0.375549 154.983577 -17.313306 +v 27.359504 145.228461 19.931667 +v 27.756271 152.254806 -9.335537 +v 13.107817 153.805516 -13.965007 +v 12.904714 143.195705 26.820079 +v -33.793843 147.771383 6.611892 +v -28.397125 145.067779 22.014970 +v -28.592381 152.586506 -9.365487 +v -13.894853 153.964470 -13.979360 +v -14.097948 143.354659 26.805726 +v 26.865301 177.823763 32.236523 +v 27.208757 190.615273 1.842262 +v 0.207850 176.126403 38.509036 +v 31.757593 183.417633 17.508383 +v 0.677977 193.596935 -3.996670 +v 12.982202 176.939803 35.503207 +v 13.391638 192.168104 -1.198613 +v -26.322308 179.117530 32.180027 +v -25.978863 191.909039 1.785765 +v -30.905539 184.941879 17.441816 +v -12.505570 177.559775 35.476149 +v -12.096154 192.788100 -1.225672 +v 50.978333 157.794116 -12.335413 +v 57.245600 166.978891 -30.502665 +v 67.968363 164.255305 -22.662802 +v 59.214377 158.382163 -12.510883 +v 49.155968 164.995106 -27.643251 +v 47.675315 159.052762 -18.748981 +v 67.029101 167.499430 -28.688935 +v 67.708254 161.769566 -16.546750 +v -42.897692 193.456614 72.434042 +v -55.820960 176.749098 74.290408 +v -62.953305 188.211096 74.270730 +v -50.687015 195.991170 73.147795 +v -47.097591 177.080071 73.483432 +v -41.813919 186.428702 74.037468 +v -64.520693 181.514144 74.300987 +v -60.479182 194.239271 73.378615 +v 41.485053 198.071244 13.485040 +v 45.427489 214.165449 1.148500 +v 54.252732 214.099694 6.120626 +v 54.693913 207.649781 11.042767 +v 51.246762 202.377799 15.279324 +v 32.126740 202.221299 4.035657 +v 32.554120 196.142496 11.095829 +v 36.390007 211.971569 -1.046597 +v -41.792262 204.430873 42.892479 +v -43.626288 197.231261 23.616559 +v -52.365673 202.340917 23.971700 +v -53.634310 205.286889 31.437352 +v -50.895876 207.745773 38.076641 +v -32.002875 196.140009 37.459020 +v -33.201388 201.240452 45.174599 +v -34.963989 194.149022 26.218880 +v 6.631450 80.399643 27.867265 +v 15.438309 84.061791 46.246220 +v 36.689118 84.102994 36.377920 +v 27.599809 84.635050 44.376276 +v 13.763398 78.129271 20.340637 +v 34.371796 80.229549 25.876071 +v 7.088979 82.431132 38.526817 +v -8.849149 74.290545 9.201663 +v -17.628099 63.074663 17.581944 +v -38.864204 69.728353 12.737075 +v -29.775700 64.511081 16.512962 +v -15.934220 78.584177 4.541295 +v -36.502475 75.505925 6.561973 +v -9.303479 67.765906 14.304934 +vt 0.255597 0.215743 +vt 0.934928 0.054984 +vt 0.748724 0.380794 +vt 0.763261 0.656022 +vt 0.532102 0.902649 +vt 0.861307 0.830073 +vt 0.881621 0.944002 +vt 0.932294 0.095822 +vt 0.970997 0.095822 +vt 0.865123 0.635262 +vt 0.715282 0.734795 +vt 0.699215 0.546547 +vt 0.803196 0.391068 +vt 0.794904 0.677014 +vt 0.941572 0.917780 +vt 0.118265 0.286051 +vt 0.663860 0.828975 +vt 0.031049 0.275075 +vt 0.844856 0.823697 +vt 0.595682 0.204124 +vt 0.011363 0.854676 +vt 0.266383 0.646033 +vt 0.724135 0.790230 +vt 0.253997 0.479174 +vt 0.971375 0.156150 +vt 0.928252 0.156136 +vt 0.621016 0.122612 +vt 0.059475 0.326819 +vt 0.059362 0.257746 +vt 0.770492 0.925697 +vt 0.683603 0.550467 +vt 0.779342 0.664126 +vt 0.118173 0.204123 +vt 0.315031 0.842108 +vt 0.414559 0.747483 +vt 0.399518 0.701783 +vt 0.448949 0.694770 +vt 0.357633 0.299914 +vt 0.418603 0.335552 +vt 0.422363 0.207716 +vt 0.376599 0.479159 +vt 0.414096 0.254865 +vt 0.785443 0.156150 +vt 0.313716 0.329378 +vt 0.314870 0.441555 +vt 0.745241 0.200706 +vt 0.711885 0.163092 +vt 0.758294 0.814508 +vt 0.678439 0.843499 +vt 0.655078 0.156147 +vt 0.680259 0.911002 +vt 0.621056 0.095820 +vt 0.913926 0.095821 +vt 0.912643 0.364253 +vt 0.666521 0.709568 +vt 0.745182 0.648362 +vt 0.285942 0.441555 +vt 0.891403 0.648951 +vt 0.671485 0.670160 +vt 0.370455 0.709217 +vt 0.329588 0.744940 +vt 0.331063 0.794428 +vt 0.366602 0.325961 +vt 0.936018 0.819789 +vt 0.885325 0.783977 +vt 0.505141 0.748829 +vt 0.313509 0.286997 +vt 0.746362 0.095822 +vt 0.427685 0.190243 +vt 0.681635 0.941705 +vt 0.691822 0.122612 +vt 0.936061 0.627368 +vt 0.059440 0.302276 +vt 0.971794 0.122612 +vt 0.241265 0.839077 +vt 0.194143 0.656045 +vt 0.095483 0.657314 +vt 0.714237 0.884771 +vt 0.984892 0.108499 +vt 0.118260 0.275008 +vt 0.093831 0.238570 +vt 0.845604 0.622687 +vt 0.897126 0.516070 +vt 0.701529 0.627703 +vt 0.669471 0.627536 +vt 0.176090 0.220682 +vt 0.825771 0.609744 +vt 0.658998 0.614197 +vt 0.765055 0.108499 +vt 0.595550 0.302456 +vt 0.386734 0.795098 +vt 0.917720 0.427678 +vt 0.881044 0.356556 +vt 0.634500 0.156150 +vt 0.985614 0.217712 +vt 0.176196 0.286099 +vt 0.118222 0.220700 +vt 0.208695 0.372787 +vt 0.733559 0.579024 +vt 0.757870 0.677015 +vt 0.071962 0.534946 +vt 0.881647 0.520255 +vt 0.906398 0.917771 +vt 0.794526 0.663780 +vt 0.766667 0.356086 +vt 0.785862 0.122612 +vt 0.068619 0.942013 +vt 0.214951 0.441555 +vt 0.211924 0.254886 +vt 0.176168 0.302520 +vt 0.059279 0.238666 +vt 0.480612 0.326823 +vt 0.345824 0.512586 +vt 0.420373 0.176908 +vt 0.825597 0.780492 +vt 0.934622 0.732855 +vt 0.343730 0.404567 +vt 0.313963 0.358401 +vt 0.806968 0.108499 +vt 0.566790 0.204124 +vt 0.333959 0.884940 +vt 0.741199 0.848260 +vt 0.093852 0.354952 +vt 0.934523 0.917621 +vt 0.751631 0.535644 +vt 0.734432 0.824734 +vt 0.299459 0.284656 +vt 0.917882 0.833832 +vt 0.347330 0.708825 +vt 0.338145 0.328760 +vt 0.859513 0.095822 +vt 0.506734 0.204123 +vt 0.382303 0.875623 +vt 0.915423 0.782034 +vt 0.875706 0.338668 +vt 0.673889 0.744932 +vt 0.726155 0.711178 +vt 0.863677 0.647862 +vt 0.683726 0.579931 +vt 0.889616 0.328988 +vt 0.864084 0.887068 +vt 0.651369 0.848259 +vt 0.876501 0.831755 +vt 0.416751 0.128948 +vt 0.859440 0.108499 +vt 0.097049 0.903456 +vt 0.247850 0.179997 +vt 0.635921 0.656300 +vt 0.749903 0.756858 +vt 0.214392 0.891615 +vt 0.908832 0.156121 +vt 0.277433 0.794536 +vt 0.827484 0.332708 +vt 0.829185 0.383372 +vt 0.896042 0.940231 +vt 0.872376 0.787311 +vt 0.933272 0.316595 +vt 0.343869 0.535021 +vt 0.352581 0.794437 +vt 0.416158 0.512649 +vt 0.344804 0.479148 +vt 0.374336 0.441555 +vt 0.798985 0.122612 +vt 0.566812 0.275036 +vt 0.942698 0.370129 +vt 0.731506 0.809276 +vt 0.285957 0.091875 +vt 0.936057 0.576206 +vt 0.741245 0.605142 +vt 0.730059 0.016269 +vt 0.856202 0.016269 +vt 0.765027 0.054984 +vt 0.315138 0.054235 +vt 0.856880 0.054984 +vt 0.876366 0.054983 +vt 0.875816 0.016269 +vt 0.746963 0.789506 +vt 0.733420 0.750248 +vt 0.654936 0.054984 +vt 0.335864 0.210609 +vt 0.631977 0.231864 +vt 0.030921 0.220705 +vt 0.871852 0.553715 +vt 0.784753 0.387128 +vt 0.747228 0.672502 +vt 0.762619 0.936895 +vt 0.750033 0.585655 +vt 0.711877 0.936747 +vt 0.737140 0.805935 +vt 0.259406 0.709407 +vt 0.861333 0.659431 +vt 0.093876 0.257696 +vt 0.651688 0.827846 +vt 0.461737 0.792426 +vt 0.535122 0.656711 +vt 0.621565 0.796099 +vt 0.567369 0.879717 +vt 0.617289 0.699781 +vt 0.349273 0.747190 +vt 0.506526 0.274998 +vt 0.895628 0.374273 +vt 0.881207 0.690837 +vt 0.696701 0.941705 +vt 0.745745 0.941028 +vt 0.739082 0.837215 +vt 0.787716 0.631988 +vt 0.314782 0.941388 +vt 0.744669 0.663180 +vt 0.818111 0.917687 +vt 0.654909 0.122612 +vt 0.676547 0.677015 +vt 0.923354 0.589708 +vt 0.761520 0.615688 +vt 0.663963 0.911002 +vt 0.893990 0.163092 +vt 0.093919 0.302358 +vt 0.719028 0.546474 +vt 0.652656 0.811979 +vt 0.031066 0.286124 +vt 0.644711 0.596297 +vt 0.736483 0.548184 +vt 0.715467 0.563548 +vt 0.672552 0.660852 +vt 0.718851 0.717725 +vt 0.532541 0.354952 +vt 0.419137 0.937326 +vt 0.506548 0.257674 +vt 0.345500 0.054288 +vt 0.377299 0.292342 +vt 0.506639 0.354952 +vt 0.748996 0.054984 +vt 0.917673 0.409579 +vt 0.449646 0.286082 +vt 0.892080 0.360976 +vt 0.344319 0.128948 +vt 0.820014 0.122612 +vt 0.532490 0.286028 +vt 0.782896 0.016268 +vt 0.414725 0.374942 +vt 0.566822 0.326817 +vt 0.514661 0.872259 +vt 0.857000 0.744904 +vt 0.936077 0.668483 +vt 0.726011 0.777908 +vt 0.681201 0.821956 +vt 0.868635 0.564528 +vt 0.844827 0.609883 +vt 0.744649 0.834372 +vt 0.651714 0.656493 +vt 0.595706 0.220705 +vt 0.817908 0.231864 +vt 0.859366 0.122612 +vt 0.666683 0.936525 +vt 0.161589 0.882055 +vt 0.194848 0.354981 +vt 0.240092 0.219225 +vt 0.710682 0.811176 +vt 0.059492 0.354952 +vt 0.093754 0.204124 +vt 0.315731 0.512570 +vt 0.480593 0.274987 +vt 0.756045 0.773861 +vt 0.071392 0.577421 +vt 0.621289 0.016268 +vt 0.190858 0.203868 +vt 0.751861 0.659762 +vt 0.728583 0.733966 +vt 0.603163 0.577407 +vt 0.580062 0.754791 +vt 0.414742 0.441555 +vt 0.895904 0.200711 +vt 0.936053 0.746623 +vt 0.506519 0.286032 +vt 0.806711 0.156148 +vt 0.595019 0.704367 +vt 0.845674 0.754660 +vt 0.886620 0.697803 +vt 0.712850 0.911002 +vt 0.751425 0.706855 +vt 0.205395 0.840356 +vt 0.289297 0.329143 +vt 0.237038 0.193441 +vt 0.797433 0.319246 +vt 0.917897 0.663357 +vt 0.175964 0.354952 +vt 0.885620 0.549316 +vt 0.859570 0.619998 +vt 0.794901 0.848257 +vt 0.145242 0.302415 +vt 0.827672 0.401768 +vt 0.638034 0.794237 +vt 0.770097 0.809706 +vt 0.673508 0.108499 +vt 0.755280 0.669527 +vt 0.119669 0.577423 +vt 0.008122 0.795077 +vt 0.729146 0.911001 +vt 0.699642 0.883044 +vt 0.746509 0.122612 +vt 0.742320 0.156136 +vt 0.480773 0.354952 +vt 0.121499 0.706399 +vt 0.307265 0.286217 +vt 0.210380 0.317703 +vt 0.025045 0.534903 +vt 0.732176 0.523263 +vt 0.027453 0.795879 +vt 0.343495 0.091877 +vt 0.374628 0.091879 +vt 0.840838 0.016269 +vt 0.214464 0.091875 +vt 0.950999 0.016269 +vt 0.267320 0.274905 +vt 0.775283 0.328531 +vt 0.145255 0.286054 +vt 0.296112 0.884965 +vt 0.145244 0.274996 +vt 0.740023 0.822211 +vt 0.245931 0.535039 +vt 0.249624 0.292358 +vt 0.924484 0.570357 +vt 0.724212 0.618997 +vt 0.743897 0.740484 +vt 0.650728 0.911086 +vt 0.775611 0.765710 +vt 0.936077 0.838896 +vt 0.347826 0.577463 +vt 0.382847 0.535032 +vt 0.910614 0.334381 +vt 0.831510 0.796107 +vt 0.549707 0.794263 +vt 0.850748 0.805248 +vt 0.412883 0.292280 +vt 0.879460 0.743643 +vt 0.506530 0.302339 +vt 0.285805 0.479156 +vt 0.948678 0.563037 +vt 0.914714 0.939860 +vt 0.674036 0.573634 +vt 0.832383 0.595050 +vt 0.888276 0.556840 +vt 0.655630 0.626375 +vt 0.736307 0.719414 +vt 0.275598 0.840835 +vt 0.681227 0.650664 +vt 0.709972 0.232115 +vt 0.820412 0.108499 +vt 0.765025 0.095821 +vt 0.747331 0.888913 +vt 0.069552 0.635446 +vt 0.973876 0.209717 +vt 0.641034 0.610282 +vt 0.690377 0.054983 +vt 0.747050 0.618300 +vt 0.723396 0.575823 +vt 0.031124 0.326827 +vt 0.762210 0.560416 +vt 0.666038 0.813500 +vt 0.595512 0.326825 +vt 0.325529 0.253434 +vt 0.820432 0.156150 +vt 0.206881 0.967319 +vt 0.293325 0.304171 +vt 0.243254 0.323720 +vt 0.763232 0.827184 +vt 0.285068 0.404567 +vt 0.388845 0.838885 +vt 0.252561 0.404567 +vt 0.648575 0.752749 +vt 0.184361 0.577417 +vt 0.973899 0.231864 +vt 0.697013 0.172839 +vt 0.951042 0.122612 +vt 0.176147 0.274965 +vt 0.709177 0.537312 +vt 0.896530 0.917771 +vt 0.767486 0.666511 +vt 0.727561 0.938163 +vt 0.718747 0.798862 +vt 0.697257 0.814380 +vt 0.688358 0.652787 +vt 0.785169 0.791226 +vt 0.249199 0.274905 +vt 0.731965 0.694501 +vt 0.723221 0.747063 +vt 0.486594 0.948330 +vt 0.598626 0.752337 +vt 0.620532 0.750242 +vt 0.377222 0.128952 +vt 0.877753 0.122612 +vt 0.582610 0.796170 +vt 0.798960 0.108499 +vt 0.935973 0.782601 +vt 0.901378 0.423637 +vt 0.914557 0.725788 +vt 0.670948 0.054984 +vt 0.877480 0.819001 +vt 0.689760 0.595785 +vt 0.913990 0.108499 +vt 0.313408 0.304910 +vt 0.449654 0.257610 +vt 0.351430 0.248123 +vt 0.345144 0.178504 +vt 0.840859 0.095821 +vt 0.785065 0.095822 +vt 0.435707 0.203873 +vt 0.532519 0.257694 +vt 0.506529 0.326822 +vt 0.765086 0.122612 +vt 0.692503 0.712229 +vt 0.371733 0.216071 +vt 0.736641 0.940160 +vt 0.757876 0.848260 +vt 0.686221 0.838135 +vt 0.765163 0.797322 +vt 0.669891 0.677015 +vt 0.686042 0.524352 +vt 0.738188 0.889775 +vt 0.676559 0.848260 +vt 0.708647 0.518689 +vt 0.676012 0.602550 +vt 0.696555 0.911002 +vt 0.785826 0.405163 +vt 0.329344 0.703695 +vt 0.941792 0.356512 +vt 0.031763 0.751718 +vt 0.284332 0.935822 +vt 0.282127 0.577464 +vt 0.294776 0.271386 +vt 0.252661 0.512749 +vt 0.059422 0.286044 +vt 0.030934 0.204124 +vt 0.838730 0.600779 +vt 0.916266 0.917771 +vt 0.865460 0.753064 +vt 0.688336 0.824075 +vt 0.679473 0.664199 +vt 0.207156 0.229503 +vt 0.749674 0.016269 +vt 0.417869 0.054390 +vt 0.807180 0.054984 +vt 0.774189 0.910992 +vt 0.652548 0.923774 +vt 0.212078 0.054277 +vt 0.984631 0.054984 +vt 0.670270 0.016269 +vt 0.637047 0.016268 +vt 0.133578 0.975415 +vt 0.933965 0.232049 +vt 0.739084 0.666015 +vt 0.745139 0.819551 +vt 0.796272 0.333957 +vt 0.781184 0.780586 +vt 0.770153 0.638555 +vt 0.865024 0.805893 +vt 0.298944 0.794473 +vt 0.872446 0.598246 +vt 0.655822 0.561957 +vt 0.937875 0.903075 +vt 0.831347 0.917772 +vt 0.255333 0.441555 +vt 0.651216 0.838339 +vt 0.835136 0.812201 +vt 0.566815 0.302227 +vt 0.544300 0.865660 +vt 0.532485 0.275009 +vt 0.314901 0.703498 +vt 0.444090 0.534948 +vt 0.506620 0.220701 +vt 0.416097 0.891155 +vt 0.507142 0.792801 +vt 0.917627 0.391481 +vt 0.879743 0.573056 +vt 0.202444 0.993810 +vt 0.651365 0.677015 +vt 0.785249 0.620097 +vt 0.684668 0.883866 +vt 0.093936 0.326823 +vt 0.031084 0.302521 +vt 0.314171 0.231740 +vt 0.238048 0.352770 +vt 0.249789 0.357798 +vt 0.173187 0.745804 +vt 0.950965 0.095821 +vt 0.145141 0.354952 +vt 0.212772 0.376778 +vt 0.449673 0.326828 +vt 0.794502 0.834892 +vt 0.872530 0.616702 +vt 0.749140 0.351639 +vt 0.767140 0.911152 +vt 0.282503 0.708944 +vt 0.699037 0.717821 +vt 0.779389 0.677016 +vt 0.566827 0.354952 +vt 0.566782 0.220717 +vt 0.806383 0.217712 +vt 0.480859 0.204123 +vt 0.449661 0.302478 +vt 0.319754 0.286217 +vt 0.431990 0.354981 +vt 0.345577 0.936058 +vt 0.362648 0.645806 +vt 0.377580 0.274898 +vt 0.894062 0.694357 +vt 0.692397 0.606771 +vt 0.691886 0.108499 +vt 0.764617 0.362075 +vt 0.904024 0.888613 +vt 0.634082 0.122612 +vt 0.691950 0.095821 +vt 0.030929 0.238598 +vt 0.495723 0.973192 +vt 0.436532 0.655316 +vt 0.509270 0.534980 +vt 0.728733 0.562733 +vt 0.114850 0.872809 +vt 0.737870 0.373475 +vt 0.834066 0.892248 +vt 0.738203 0.591970 +vt 0.782396 0.317514 +vt 0.464884 0.838834 +vt 0.948365 0.733420 +vt 0.418691 0.370972 +vt 0.449682 0.238404 +vt 0.532558 0.220707 +vt 0.566800 0.257742 +vt 0.532482 0.302308 +vt 0.583674 0.890608 +vt 0.709972 0.200711 +vt 0.942118 0.402143 +vt 0.211458 0.128944 +vt 0.638119 0.622878 +vt 0.756154 0.602668 +vt 0.676524 0.647357 +vt 0.891428 0.633182 +vt 0.867026 0.945729 +vt 0.207736 0.335642 +vt 0.027199 0.901816 +vt 0.059305 0.204124 +vt 0.924213 0.719241 +vt 0.741198 0.677015 +vt 0.028247 0.577410 +vt 0.863938 0.917771 +vt 0.851688 0.591814 +vt 0.850848 0.634574 +vt 0.938408 0.927193 +vt 0.985209 0.156148 +vt 0.731566 0.638069 +vt 0.327559 0.284656 +vt 0.480599 0.257655 +vt 0.940634 0.420541 +vt 0.424097 0.965195 +vt 0.863138 0.381292 +vt 0.086190 0.724548 +vt 0.673434 0.122612 +vt 0.675902 0.773849 +vt 0.697044 0.156121 +vt 0.047164 0.795723 +vt 0.876523 0.661158 +vt 0.685829 0.695635 +vt 0.767474 0.837667 +vt 0.936019 0.649366 +vt 0.672536 0.832167 +vt 0.282910 0.178142 +vt 0.764725 0.156147 +vt 0.787967 0.231864 +vt 0.709972 0.171386 +vt 0.895904 0.171386 +vt 0.820810 0.095822 +vt 0.532559 0.238577 +vt 0.414680 0.091883 +vt 0.387039 0.219621 +vt 0.418946 0.229929 +vt 0.787944 0.209717 +vt 0.891695 0.833437 +vt 0.124974 0.748995 +vt 0.145087 0.204123 +vt 0.059276 0.220716 +vt 0.761358 0.338190 +vt 0.662728 0.668313 +vt 0.093909 0.286048 +vt 0.655557 0.797710 +vt 0.620779 0.156148 +vt 0.905572 0.938997 +vt 0.035870 0.704195 +vt 0.546804 0.757119 +vt 0.334433 0.243039 +vt 0.936059 0.797784 +vt 0.891324 0.803735 +vt 0.836471 0.804603 +vt 0.746436 0.108499 +vt 0.728058 0.108499 +vt 0.818658 0.776896 +vt 0.508784 0.706093 +vt 0.428443 0.990876 +vt 0.764041 0.893569 +vt 0.696225 0.747399 +vt 0.769187 0.749663 +vt 0.739015 0.911001 +vt 0.702738 0.563637 +vt 0.084989 0.865972 +vt 0.080136 0.794155 +vt 0.215164 0.479218 +vt 0.914054 0.122612 +vt 0.748883 0.911001 +vt 0.621036 0.108499 +vt 0.916692 0.634633 +vt 0.828300 0.369754 +vt 0.654009 0.898398 +vt 0.777696 0.360523 +vt 0.885267 0.719886 +vt 0.333829 0.303559 +vt 0.377808 0.356778 +vt 0.314103 0.176477 +vt 0.415450 0.479198 +vt 0.383845 0.322909 +vt 0.863555 0.156136 +vt 0.751837 0.830942 +vt 0.206812 0.794023 +vt 0.301489 0.253434 +vt 0.950969 0.054984 +vt 0.737201 0.634733 +vt 0.676496 0.818660 +vt 0.798935 0.095820 +vt 0.247827 0.250786 +vt 0.950589 0.156147 +vt 0.145191 0.220694 +vt 0.769330 0.578484 +vt 0.770171 0.848260 +vt 0.685748 0.848259 +vt 0.831637 0.625377 +vt 0.602276 0.796592 +vt 0.798255 0.363832 +vt 0.914893 0.555304 +vt 0.894491 0.523813 +vt 0.744045 0.569271 +vt 0.424701 0.840048 +vt 0.456853 0.745548 +vt 0.379110 0.250741 +vt 0.508074 0.837122 +vt 0.559814 0.940878 +vt 0.914994 0.703678 +vt 0.771025 0.901580 +vt 0.762033 0.731608 +vt 0.791133 0.816315 +vt 0.741140 0.776355 +vt 0.081566 0.837294 +vt 0.651227 0.666984 +vt 0.690416 0.564106 +vt 0.872238 0.768855 +vt 0.779325 0.835265 +vt 0.685735 0.677015 +vt 0.913751 0.650767 +vt 0.692294 0.778048 +vt 0.908862 0.172839 +vt 0.897817 0.163092 +vt 0.932368 0.108499 +vt 0.654938 0.095821 +vt 0.679462 0.835501 +vt 0.636687 0.810221 +vt 0.755272 0.840706 +vt 0.692687 0.540948 +vt 0.849446 0.644672 +vt 0.251290 0.128949 +vt 0.865716 0.582435 +vt 0.911752 0.319669 +vt 0.595566 0.286095 +vt 0.414734 0.404572 +vt 0.449670 0.274956 +vt 0.023577 0.623156 +vt 0.185223 0.534962 +vt 0.284195 0.358809 +vt 0.009998 0.749349 +vt 0.212908 0.274933 +vt 0.145236 0.326824 +vt 0.702554 0.734897 +vt 0.765233 0.626167 +vt 0.915395 0.533196 +vt 0.729510 0.054983 +vt 0.782949 0.054984 +vt 0.822926 0.054984 +vt 0.260662 0.326638 +vt 0.209691 0.018239 +vt 0.644587 0.767637 +vt 0.247220 0.018239 +vt 0.250975 0.054268 +vt 0.968881 0.054984 +vt 0.695283 0.790443 +vt 0.314749 0.091873 +vt 0.748033 0.232049 +vt 0.857842 0.232049 +vt 0.449796 0.204123 +vt 0.480685 0.220695 +vt 0.211767 0.938667 +vt 0.306484 0.250312 +vt 0.830902 0.615677 +vt 0.913129 0.887745 +vt 0.710741 0.639927 +vt 0.314290 0.247970 +vt 0.775733 0.594543 +vt 0.753212 0.799839 +vt 0.280653 0.747292 +vt 0.701454 0.798968 +vt 0.620451 0.217712 +vt 0.726110 0.606671 +vt 0.916592 0.805110 +vt 0.376072 0.404566 +vt 0.480601 0.302370 +vt 0.314357 0.535019 +vt 0.785464 0.108499 +vt 0.838529 0.771488 +vt 0.561397 0.634699 +vt 0.799277 0.156148 +vt 0.595699 0.238600 +vt 0.830746 0.786410 +vt 0.272406 0.880931 +vt 0.606192 0.534877 +vt 0.781225 0.373826 +vt 0.847642 0.917771 +vt 0.044980 0.890795 +vt 0.849018 0.887068 +vt 0.828470 0.646582 +vt 0.844654 0.780574 +vt 0.882945 0.172839 +vt 0.566782 0.238670 +vt 0.083305 0.923173 +vt 0.249910 0.749310 +vt 0.631999 0.209717 +vt 0.677624 0.156136 +vt 0.849376 0.815349 +vt 0.753283 0.628664 +vt 0.857280 0.574250 +vt 0.689595 0.809913 +vt 0.818957 0.316206 +vt 0.709972 0.163211 +vt 0.415778 0.316747 +vt 0.314985 0.741795 +vt 0.030751 0.849572 +vt 0.050209 0.754404 +vt 0.297897 0.842557 +vt 0.122778 0.792952 +vt 0.674703 0.200706 +vt 0.689838 0.016269 +vt 0.176179 0.257611 +vt 0.758344 0.643339 +vt 0.663002 0.601458 +vt 0.247489 0.577466 +vt 0.118262 0.326824 +vt 0.347504 0.018238 +vt 0.728658 0.888542 +vt 0.826158 0.420164 +vt 0.840857 0.054984 +vt 0.566812 0.286023 +vt 0.449765 0.354952 +vt 0.314959 0.577465 +vt 0.545515 0.922196 +vt 0.357743 0.880856 +vt 0.332172 0.842510 +vt 0.314578 0.640560 +vt 0.445393 0.577416 +vt 0.315019 0.885796 +vt 0.532625 0.204124 +vt 0.877882 0.095821 +vt 0.840811 0.122612 +vt 0.761434 0.786870 +vt 0.145241 0.257656 +vt 0.636994 0.054984 +vt 0.145210 0.238484 +vt 0.740064 0.651011 +vt 0.339216 0.643866 +vt 0.558656 0.534925 +vt 0.891345 0.819504 +vt 0.915135 0.377867 +vt 0.636356 0.848259 +vt 0.314003 0.207365 +vt 0.924192 0.740812 +vt 0.728122 0.122612 +vt 0.617431 0.855287 +vt 0.607811 0.622342 +vt 0.806988 0.095820 +vt 0.885913 0.762972 +vt 0.812448 0.795354 +vt 0.858562 0.774738 +vt 0.906472 0.711107 +vt 0.775239 0.650769 +vt 0.663882 0.657641 +vt 0.900278 0.405603 +vt 0.121636 0.837433 +vt 0.728493 0.586086 +vt 0.213159 0.292296 +vt 0.738081 0.763188 +vt 0.803234 0.427265 +vt 0.725417 0.642145 +vt 0.696399 0.576131 +vt 0.863616 0.818497 +vt 0.728335 0.757320 +vt 0.293315 0.242924 +vt 0.275823 0.248153 +vt 0.708432 0.689949 +vt 0.971395 0.108499 +vt 0.204472 0.190753 +vt 0.924568 0.548786 +vt 0.878275 0.634222 +vt 0.718813 0.627622 +vt 0.230402 0.702057 +vt 0.791176 0.645197 +vt 0.031128 0.354952 +vt 0.725362 0.813361 +vt 0.882975 0.156121 +vt 0.806948 0.122612 +vt 0.899177 0.387570 +vt 0.243291 0.795273 +vt 0.050187 0.844482 +vt 0.013882 0.699460 +vt 0.931173 0.200706 +vt 0.878174 0.804814 +vt 0.673582 0.095822 +vt 0.654923 0.108499 +vt 0.662889 0.772774 +vt 0.877540 0.648407 +vt 0.821392 0.930376 +vt 0.879260 0.892026 +vt 0.727889 0.595831 +vt 0.315528 0.018181 +vt 0.765051 0.016269 +vt 0.284744 0.054246 +vt 0.283530 0.018181 +vt 0.254730 0.091874 +vt 0.662989 0.848260 +vt 0.654925 0.016269 +vt 0.118252 0.257676 +vt 0.691285 0.585364 +vt 0.727994 0.095821 +vt 0.215427 0.747718 +vt 0.176125 0.238395 +vt 0.636358 0.838542 +vt 0.770165 0.677015 +vt 0.695369 0.619169 +vt 0.379817 0.180762 +vt 0.787648 0.803114 +vt 0.984867 0.095820 +vt 0.083344 0.757041 +vt 0.931424 0.935204 +vt 0.648718 0.581418 +vt 0.544177 0.724490 +vt 0.390341 0.194177 +vt 0.941824 0.333084 +vt 0.871512 0.724326 +vt 0.845468 0.793376 +vt 0.598269 0.849956 +vt 0.887944 0.727402 +vt 0.315301 0.479147 +vt 0.423209 0.793785 +vt 0.579037 0.844668 +vt 0.669298 0.887352 +vt 0.749692 0.677015 +vt 0.775207 0.821912 +vt 0.887040 0.527237 +vt 0.678758 0.763215 +vt 0.819931 0.904999 +vt 0.786898 0.423198 +vt 0.880234 0.917771 +vt 0.678881 0.591921 +vt 0.836681 0.941421 +vt 0.213861 0.404572 +vt 0.254612 0.922405 +vt 0.284898 0.535025 +vt 0.818842 0.606128 +vt 0.749698 0.848260 +vt 0.118261 0.302386 +vt 0.683428 0.721761 +vt 0.031009 0.257741 +vt 0.844902 0.653006 +vt 0.354491 0.840733 +vt 0.315002 0.794084 +vt 0.799682 0.217712 +vt 0.480577 0.286036 +vt 0.375705 0.922558 +vt 0.595621 0.257734 +vt 0.595500 0.354952 +vt 0.863509 0.352136 +vt 0.852273 0.373989 +vt 0.165057 0.839231 +vt 0.916038 0.016269 +vt 0.935975 0.612170 +vt 0.689617 0.767062 +vt 0.300463 0.703752 +vt 0.662980 0.677015 +vt 0.652694 0.640638 +vt 0.666074 0.642176 +vt 0.671987 0.788046 +vt 0.689654 0.638630 +vt 0.667739 0.587337 +vt 0.636733 0.638857 +vt 0.691125 0.756638 +vt 0.669902 0.848260 +vt 0.093911 0.275019 +vt 0.906852 0.540600 +vt 0.449700 0.220684 +vt 0.573455 0.711359 +vt 0.359600 0.274896 +vt 0.601115 0.901709 +vt 0.877818 0.108499 +vt 0.923121 0.760166 +vt 0.480652 0.238492 +vt 0.824181 0.797634 +vt 0.828406 0.817321 +vt 0.851461 0.762485 +vt 0.779396 0.848260 +vt 0.871271 0.716399 +vt 0.151460 0.924131 +vt 0.835215 0.641481 +vt 0.690265 0.735383 +vt 0.697308 0.643104 +vt 0.284433 0.128947 +vt 0.634879 0.095822 +vt 0.175901 0.204123 +vt 0.208452 0.175985 +vt 0.803215 0.409166 +vt 0.913699 0.821253 +vt 0.669398 0.798853 +vt 0.059417 0.275048 +vt 0.934937 0.562431 +vt 0.845924 0.583972 +vt 0.595577 0.275057 +vt 0.722900 0.156121 +vt 0.468357 0.881332 +vt 0.532468 0.326821 +vt 0.247916 0.875817 +vt 0.057188 0.711303 +vt 0.300327 0.744987 +vt 0.671483 0.841478 +vt 0.984917 0.122612 +vt 0.176146 0.326829 +vt 0.684166 0.635721 +vt 0.061577 0.879960 +vt 0.686228 0.666838 +vt 0.684106 0.807013 +vt 0.634480 0.108499 +vt 0.915592 0.611553 +vt 0.798699 0.054984 +vt 0.379180 0.054356 +vt 0.383732 0.018359 +vt 0.421058 0.018359 +vt 0.798648 0.016268 +vt 0.822979 0.016268 +vt 0.807221 0.016268 +vt 0.635893 0.827677 +vt 0.658905 0.785523 +vt 0.621248 0.054984 +vt 0.895904 0.163211 +vt 0.841092 0.156147 +vt 0.291825 0.210419 +vt 0.671910 0.232049 +vt 0.836574 0.633887 +vt 0.708990 0.708576 +vt 0.824304 0.626881 +vt 0.636356 0.677015 +vt 0.827416 0.356136 +vt 0.118215 0.354952 +vt 0.269410 0.300468 +vt 0.858753 0.604088 +vt 0.781285 0.609428 +vt 0.413016 0.274926 +vt 0.389352 0.351632 +vt 0.343676 0.358303 +vt 0.868327 0.735148 +vt 0.314416 0.404567 +vt 0.382595 0.577465 +vt 0.332242 0.271386 +vt 0.559529 0.577420 +vt 0.547922 0.837220 +vt 0.936048 0.768188 +vt 0.379997 0.749138 +vt 0.683588 0.751217 +vt 0.314426 0.128944 +vt 0.879002 0.362548 +vt 0.885489 0.613407 +vt 0.886139 0.592404 +vt 0.289968 0.643994 +vt 0.891712 0.662885 +vt 0.894944 0.890609 +vt 0.093831 0.220705 +vt 0.871635 0.545787 +vt 0.896674 0.686606 +vt 0.817931 0.209717 +vt 0.168249 0.792680 +vt 0.120835 0.534998 +vt 0.708058 0.163092 +vt 0.662721 0.839648 +vt 0.930002 0.891877 +vt 0.968828 0.016268 +vt 0.812578 0.624567 +vt 0.378862 0.512649 +vt 0.860635 0.200706 +vt 0.896713 0.317960 +vt 0.478349 0.922822 +vt 0.343784 0.441555 +vt 0.943603 0.383745 +vt 0.727747 0.767067 +vt 0.181086 0.695152 +vt 0.143009 0.950086 +vt 0.203883 0.206876 +vt 0.285667 0.512634 +vt 0.915498 0.054983 +vt 0.935606 0.016269 +vt 0.800726 0.377450 +vt 0.726341 0.539931 +vt 0.859427 0.790645 +vt 0.734468 0.653528 +vt 0.666728 0.538248 +vt 0.722930 0.172839 +vt 0.895904 0.232115 +vt 0.215378 0.512749 +vt 0.667608 0.758644 +vt 0.932441 0.122612 +vt 0.936052 0.597770 +vt 0.852052 0.944907 +vt 0.510735 0.577421 +vt 0.832166 0.765778 +vt 0.678437 0.672191 +vt 0.655645 0.733289 +vt 0.747224 0.843692 +vt 0.672082 0.616741 +vt 0.636372 0.667162 +vt 0.984580 0.016268 +vt 0.640929 0.781632 +vt 0.321315 0.250312 +vn 0.951160 0.131375 0.279349 +vn 0.958716 -0.010495 0.284171 +vn 0.999720 -0.020869 -0.011181 +vn 0.985099 0.171851 0.006916 +vn 0.746389 0.663733 0.048604 +vn 0.726920 0.628810 0.276016 +vn 0.670893 0.425834 0.607099 +vn 0.779759 0.080561 0.620875 +vn 0.790179 0.020378 0.612537 +vn 0.360360 0.259501 -0.895991 +vn 0.323777 0.733727 -0.597339 +vn 0.636792 0.604940 -0.478062 +vn 0.771460 0.183892 -0.609126 +vn 0.782448 0.005679 -0.622691 +vn 0.384560 0.024414 -0.922777 +vn 0.105189 0.295544 -0.949520 +vn 0.098890 0.039786 -0.994303 +vn 0.000000 0.045773 -0.998952 +vn 0.000000 0.298078 -0.954542 +vn 0.000001 0.784681 -0.619900 +vn 0.148944 0.772206 -0.617668 +vn 0.393355 -0.181822 -0.901228 +vn 0.776505 -0.148070 -0.612466 +vn 0.683520 -0.450139 -0.574609 +vn 0.405218 -0.563709 -0.719744 +vn 0.137862 -0.180767 -0.973816 +vn 0.170745 -0.612324 -0.771949 +vn -0.000001 -0.625135 -0.780516 +vn -0.000000 -0.178925 -0.983863 +vn 0.481912 -0.064571 0.873837 +vn 0.501460 -0.473204 0.724303 +vn 0.791282 -0.416430 0.447727 +vn 0.810808 -0.077158 0.580205 +vn 0.485471 0.041987 0.873244 +vn 0.138721 -0.073799 0.987578 +vn 0.152045 0.039323 0.987591 +vn 0.000000 0.030087 0.999547 +vn -0.000000 -0.083768 0.996485 +vn 0.000000 -0.607374 0.794416 +vn 0.215224 -0.610122 0.762516 +vn 0.442345 0.121367 0.888595 +vn 0.360264 0.559532 0.746414 +vn 0.180215 0.168301 0.969122 +vn 0.200527 0.610927 0.765870 +vn -0.000001 0.633380 0.773841 +vn -0.000000 0.161927 0.986803 +vn 0.956722 -0.137853 0.256281 +vn 0.840911 -0.522495 0.140955 +vn 0.817726 -0.568726 -0.088746 +vn 0.985518 -0.167940 -0.023452 +vn 0.954140 -0.158621 -0.253883 +vn 0.780000 -0.544286 -0.308793 +vn 0.967121 -0.011801 -0.254041 +vn 0.959024 0.163252 -0.231563 +vn 0.735168 0.658002 -0.162975 +vn 0.314857 0.902508 0.293845 +vn 0.343405 0.936700 0.068311 +vn 0.169287 0.934687 0.312574 +vn 0.137211 0.987924 0.071963 +vn -0.000000 0.997876 0.065145 +vn -0.000001 0.950154 0.311780 +vn 0.327683 0.933486 -0.145697 +vn 0.137259 0.977121 -0.162462 +vn 0.000000 0.986425 -0.164210 +vn 0.610371 -0.782005 -0.126158 +vn 0.514231 -0.846114 0.140209 +vn 0.583309 -0.788863 0.193513 +vn 0.811739 -0.577088 -0.089723 +vn 0.501440 -0.765392 -0.403403 +vn 0.155840 -0.820359 -0.550205 +vn -0.000618 -0.835404 -0.549636 +vn 0.218565 -0.941832 0.255307 +vn -0.000672 -0.966368 0.257163 +vn 0.688373 -0.595191 -0.414596 +vn 0.239947 -0.616783 -0.749669 +vn 0.704589 0.629952 0.326671 +vn 0.711416 0.652719 -0.260472 +vn 0.294932 -0.855740 0.425117 +vn -0.002583 -0.906556 0.422077 +vn -0.005425 -0.259759 0.965658 +vn 0.368883 -0.244799 0.896659 +vn 0.265759 0.847125 0.460165 +vn 0.308741 0.874245 -0.374666 +vn 0.000298 0.055621 0.998452 +vn 0.227726 0.079742 0.970455 +vn 0.680986 0.202025 0.703878 +vn 0.340847 0.452806 -0.823887 +vn 0.272052 0.413938 0.868702 +vn 0.205906 0.593283 -0.778214 +vn 0.751637 0.642954 0.147144 +vn 0.711401 0.386512 -0.586956 +vn -0.501671 0.514108 -0.695715 +vn -0.961889 0.077026 -0.262367 +vn 0.199685 0.400429 -0.894306 +vn 0.280749 0.386157 -0.878671 +vn 0.623427 0.114384 -0.773469 +vn 0.211126 0.196712 -0.957460 +vn 0.231709 -0.013593 0.972690 +vn -0.001295 -0.009762 0.999951 +vn -0.004717 -0.150807 0.988552 +vn 0.236091 -0.147035 0.960542 +vn 0.399238 -0.418036 0.816000 +vn 0.787674 -0.291569 0.542731 +vn -0.521050 -0.579879 0.626297 +vn 0.306338 -0.697286 0.648035 +vn 0.302299 -0.107173 0.947169 +vn -0.007146 -0.098541 0.995107 +vn 0.021748 -0.064034 0.997711 +vn 0.320719 -0.067005 0.944801 +vn 0.692390 0.259450 -0.673262 +vn 0.990389 0.134567 -0.031945 +vn 0.993875 0.108594 0.020507 +vn 0.705661 0.087496 -0.703127 +vn 0.785443 -0.023036 0.618505 +vn 0.740267 0.014889 0.672148 +vn 0.288774 0.297401 -0.910034 +vn 0.278045 0.057550 -0.958842 +vn 0.230648 0.179659 -0.956308 +vn 0.732375 0.093620 -0.674434 +vn 0.738599 0.212446 -0.639795 +vn 0.258501 0.299377 -0.918450 +vn 0.998560 -0.052516 -0.010987 +vn 0.713141 -0.185701 0.675977 +vn 0.695119 -0.212818 0.686672 +vn 0.999583 0.009967 0.027110 +vn 0.236681 -0.219337 0.946506 +vn -0.006363 -0.218983 0.975708 +vn -0.006592 -0.255494 0.966788 +vn 0.256891 -0.270080 0.927935 +vn 0.616805 0.592627 0.518021 +vn 0.498862 0.165362 0.850760 +vn 0.600628 -0.323657 0.731090 +vn 0.862428 0.232807 0.449465 +vn 0.283900 0.511622 -0.810953 +vn 0.184372 0.691295 -0.698655 +vn 0.472611 0.487932 0.733868 +vn -0.332511 0.526024 0.782774 +vn -0.221875 0.451280 0.864360 +vn 0.430164 0.490444 0.757907 +vn 0.642693 0.268428 0.717559 +vn 0.821074 -0.233750 -0.520768 +vn 0.014801 0.572732 -0.819609 +vn 0.011033 0.413866 -0.910271 +vn 0.246482 -0.039781 0.968331 +vn 0.005833 0.196989 -0.980388 +vn 0.006398 0.323308 -0.946272 +vn -0.000544 0.321603 -0.946874 +vn 0.022964 0.064102 -0.997679 +vn 0.649774 -0.143212 0.746515 +vn 0.006324 0.217407 -0.976061 +vn 0.010550 0.488685 -0.872396 +vn 0.002679 -0.535119 -0.844772 +vn 0.057944 0.092977 0.993981 +vn 0.328038 -0.435530 -0.838275 +vn 0.103449 -0.651599 0.751476 +vn 0.106521 -0.871241 0.479158 +vn 0.050076 -0.971432 0.231973 +vn -0.839251 -0.525777 -0.138621 +vn -0.855738 -0.210158 0.472806 +vn 0.052252 -0.188570 -0.980669 +vn -0.141667 -0.690868 -0.708966 +vn 0.032014 -0.729481 -0.683251 +vn -0.842920 0.094907 0.529603 +vn -0.985722 -0.117365 -0.120740 +vn -0.958637 -0.006240 -0.284564 +vn -0.877216 -0.093820 0.470839 +vn -0.912028 0.198826 0.358709 +vn -0.965300 -0.247314 -0.083860 +vn -0.936060 -0.343839 -0.074617 +vn -0.867395 0.118491 0.483307 +vn 0.836394 -0.302943 -0.456804 +vn 0.978314 0.146712 0.146210 +vn 0.933162 0.207116 0.293789 +vn 0.880855 -0.315778 -0.352674 +vn -0.415362 -0.701426 -0.579203 +vn 0.347240 -0.624822 -0.699301 +vn 0.320852 -0.629314 -0.707826 +vn -0.438683 -0.713524 -0.546297 +vn 0.897931 -0.036262 -0.438640 +vn 0.903671 -0.123721 0.409965 +vn 0.934913 -0.220174 0.278318 +vn 0.836325 -0.169955 -0.521226 +vn 0.944404 -0.087036 -0.317057 +vn 0.885207 0.173002 0.431831 +vn -0.477875 0.082153 -0.874578 +vn -0.636604 -0.296964 -0.711722 +vn 0.303796 0.054301 -0.951189 +vn 0.404615 0.264725 0.875333 +vn -0.230831 0.237411 0.943585 +vn -0.254683 -0.142226 0.956509 +vn 0.403464 -0.145963 0.903278 +vn -0.245097 -0.151313 0.957618 +vn -0.898263 -0.092588 0.429593 +vn -0.877934 -0.044816 0.476680 +vn -0.151946 -0.054556 0.986882 +vn 0.230265 -0.098013 -0.968179 +vn -0.481886 -0.040793 -0.875284 +vn 0.462730 -0.198647 0.863956 +vn -0.943953 -0.034735 -0.328246 +vn -0.972781 -0.077953 -0.218222 +vn 0.139999 -0.253762 -0.957082 +vn -0.595436 -0.158399 -0.787633 +vn 0.603327 -0.141211 0.784892 +vn 0.951203 -0.270231 0.148956 +vn -0.584663 -0.771796 0.250001 +vn -0.894471 -0.114013 -0.432346 +vn -0.897208 -0.134645 -0.420581 +vn -0.688786 -0.703513 0.175053 +vn 0.513020 -0.533882 0.672146 +vn 0.107793 -0.755810 0.645857 +vn 0.101307 -0.662475 0.742202 +vn 0.568194 -0.471914 0.674131 +vn 0.155957 0.771526 -0.616787 +vn 0.719396 0.650969 -0.242299 +vn 0.711425 0.645171 -0.278620 +vn 0.145671 0.737244 -0.659735 +vn 0.926067 0.053078 0.373607 +vn 0.929073 0.108326 0.353679 +vn 0.524606 0.843912 -0.112252 +vn 0.754079 0.651553 -0.082729 +vn 0.607664 0.377058 -0.698979 +vn 0.993291 0.115633 -0.001040 +vn 0.996850 -0.034544 -0.071389 +vn 0.719122 0.283354 -0.634488 +vn -0.958553 -0.284119 -0.021279 +vn -0.787587 0.046292 -0.614463 +vn -0.820324 0.011734 -0.571779 +vn -0.943038 -0.327984 -0.055726 +vn 0.318211 -0.425201 0.847317 +vn -0.420922 -0.544835 0.725244 +vn -0.499387 -0.512142 0.698801 +vn 0.321507 -0.259575 0.910634 +vn -0.101063 0.364154 -0.925839 +vn -0.084122 0.482969 -0.871587 +vn -0.544523 0.443511 -0.711893 +vn -0.533744 0.414993 -0.736816 +vn 0.863381 -0.206275 0.460460 +vn 0.555152 0.033083 0.831090 +vn 0.892808 0.031292 0.449349 +vn 0.763586 0.403998 -0.503708 +vn -0.097767 0.570358 -0.815557 +vn 0.993940 0.053563 -0.095992 +vn -0.938711 0.072630 -0.336967 +vn -0.956005 -0.293337 -0.002775 +vn 0.796947 -0.200203 0.569907 +vn 0.962690 0.200359 0.181890 +vn 0.737991 -0.098305 0.667612 +vn 0.796002 -0.150877 0.586189 +vn 0.987842 0.151594 0.034451 +vn -0.692501 -0.478199 0.540157 +vn -0.968754 -0.171628 -0.179054 +vn -0.969921 -0.243357 0.005545 +vn -0.499342 -0.469398 0.728233 +vn 0.298331 -0.381448 0.874926 +vn 0.037843 0.576255 -0.816393 +vn 0.618735 0.584016 -0.525445 +vn 0.578378 0.428129 -0.694395 +vn -0.089338 0.394433 -0.914572 +vn -0.637120 0.270442 -0.721761 +vn -0.793112 0.085476 -0.603049 +vn 0.998509 -0.049316 -0.023389 +vn 0.970539 -0.087889 0.224344 +vn 0.988511 0.004931 -0.151066 +vn -0.785049 0.009742 0.619358 +vn -0.952571 -0.302268 -0.035259 +vn -0.956732 -0.286173 -0.052614 +vn 0.824960 -0.337983 0.452999 +vn 0.903175 0.169881 -0.394228 +vn 0.076148 0.353816 -0.932210 +vn -0.480010 0.242363 -0.843120 +vn -0.622197 -0.594893 -0.508894 +vn -0.930480 -0.245856 -0.271592 +vn -0.684255 0.559113 -0.468175 +vn -0.582402 -0.788109 -0.199227 +vn -0.925934 -0.371126 0.070084 +vn 0.589244 0.779927 0.210962 +vn 0.372134 0.926724 -0.051952 +vn 0.251141 0.966181 0.058499 +vn 0.248633 0.887157 0.388759 +vn -0.037642 -0.730648 0.681716 +vn 0.583892 0.504680 0.635899 +vn 0.373955 0.610965 0.697768 +vn -0.392526 -0.289804 0.872890 +vn -0.948413 -0.168803 -0.268363 +vn 0.982334 -0.184900 -0.028842 +vn -0.936016 0.182975 -0.300656 +vn -0.727343 0.549282 0.411414 +vn -0.741159 -0.587216 0.325362 +vn -0.429826 -0.900129 0.070834 +vn -0.952777 0.003485 -0.303652 +vn 0.303113 0.216581 -0.928017 +vn -0.137014 0.033165 -0.990014 +vn -0.094757 0.995496 -0.002993 +vn 0.848151 -0.412142 -0.332835 +vn 0.903690 -0.414638 -0.106865 +vn 0.168935 -0.963086 -0.209585 +vn 0.047473 -0.915475 -0.399565 +vn -0.746219 -0.527836 0.405644 +vn -0.972258 -0.228357 -0.050669 +vn 0.229623 0.911705 0.340685 +vn 0.337792 0.493258 0.801619 +vn 0.628748 -0.576445 0.521907 +vn 0.249810 -0.812729 0.526371 +vn 0.817326 -0.257151 -0.515608 +vn 0.058969 -0.756088 -0.651808 +vn 0.617407 -0.088829 0.781612 +vn -0.773064 0.067178 0.630761 +vn -0.850737 -0.227326 0.473887 +vn 0.643535 -0.417280 0.641670 +vn -0.786791 0.310079 -0.533676 +vn -0.745672 0.011574 -0.666212 +vn -0.871314 -0.457026 0.178715 +vn 0.911833 0.157202 -0.379273 +vn 0.740467 -0.570345 0.355550 +vn 0.866110 -0.101763 -0.489385 +vn 0.774618 -0.311992 -0.550116 +vn 0.001365 -0.961837 0.273621 +vn -0.052336 -0.654212 -0.754498 +vn 0.459666 -0.497751 -0.735494 +vn 0.562111 -0.786265 -0.256551 +vn -0.568526 -0.822232 -0.026683 +vn -0.423378 -0.696077 -0.579851 +vn -0.559530 -0.798445 0.222288 +vn -0.485307 -0.835473 0.257803 +vn 0.001362 -0.961838 0.273618 +vn 0.001356 -0.961838 0.273615 +vn 0.545132 -0.836690 0.052734 +vn 0.545979 -0.825549 0.142747 +vn 0.001350 -0.961836 0.273624 +vn 0.001351 -0.961837 0.273620 +vn 0.568451 -0.787965 0.236589 +vn 0.627100 -0.672942 0.392294 +vn -0.510599 -0.600836 0.615048 +vn -0.543681 -0.746767 0.383080 +vn -0.511006 -0.781232 0.358539 +vn -0.574609 -0.790516 0.211916 +vn 0.001365 -0.961837 0.273621 +vn 0.001365 -0.961836 0.273622 +vn 0.642399 -0.766165 -0.017722 +vn 0.596069 -0.794846 0.113668 +vn -0.292654 -0.337134 0.894815 +vn 0.119224 -0.393919 0.911380 +vn 0.507579 -0.422973 0.750638 +vn 0.001365 -0.961836 0.273621 +vn 0.542639 -0.838474 0.050042 +vn -0.512092 -0.782989 0.353113 +vn 0.736958 0.193301 0.647709 +vn 0.171068 0.329834 0.928410 +vn 0.490225 -0.108298 -0.864842 +vn 0.767784 -0.032072 -0.639905 +vn -0.967598 0.047460 0.247996 +vn -0.976985 0.083652 0.196219 +vn 0.950339 -0.042967 -0.308238 +vn 0.986667 -0.005455 -0.162658 +vn 0.998951 0.040704 0.020983 +vn 0.906290 0.006303 -0.422610 +vn 0.978452 -0.001582 -0.206469 +vn -0.743814 0.240512 0.623614 +vn -0.949870 0.161396 0.267767 +vn -0.998271 0.021289 -0.054785 +vn -0.899736 -0.112939 -0.421568 +vn -0.998072 0.034921 0.051318 +vn -0.829490 0.555287 -0.060021 +vn -0.836395 0.489340 0.246962 +vn -0.996833 0.079468 -0.003042 +vn -0.855906 0.494919 -0.149934 +vn -0.696753 0.582413 0.418725 +vn -0.861242 0.502379 0.076662 +vn 0.948564 0.103318 0.299252 +vn 0.807303 0.570115 0.152415 +vn 0.473479 0.684466 0.554368 +vn 0.826279 0.417192 -0.378436 +vn 0.859723 0.417084 -0.294818 +vn 0.756569 0.088240 -0.647933 +vn 0.869196 0.212804 -0.446333 +vn -0.059581 -0.249988 -0.966414 +vn -0.001634 -0.063040 -0.998010 +vn 0.537866 -0.000080 -0.843030 +vn -0.373946 0.304667 0.875981 +vn -0.233200 0.669214 0.705529 +vn -0.914112 0.096443 -0.393824 +vn -0.542647 -0.025124 -0.839585 +vn -0.507201 -0.255179 -0.823183 +vn -0.920282 0.313691 0.233837 +vn -0.980239 0.172895 -0.096119 +vn 0.882766 0.457007 -0.108945 +vn 0.953560 -0.051459 -0.296774 +vn 0.862989 0.407454 -0.298718 +vn 0.904871 0.343811 -0.251001 +vn -0.878033 0.334524 0.342274 +vn -0.997003 0.069838 -0.033284 +vn 0.257693 0.931278 -0.257517 +vn 0.271073 0.956839 -0.104778 +vn 0.486117 0.016798 -0.873732 +vn 0.780873 0.134183 -0.610109 +vn 0.380329 0.924851 0.000907 +vn 0.293300 0.922806 -0.249807 +vn 0.817733 0.533290 -0.216598 +vn -0.579939 -0.033069 -0.813989 +vn -0.059189 -0.053995 -0.996785 +vn 0.258352 0.909917 -0.324508 +vn -0.926210 -0.008837 -0.376904 +vn -0.287136 0.955023 -0.074048 +vn -0.426709 0.840245 0.334526 +vn -0.259082 0.926055 -0.274408 +vn -0.274350 0.960954 -0.036032 +vn -0.325272 0.918821 -0.223530 +vn 0.241044 0.912772 0.329765 +vn 0.857363 0.310959 -0.410163 +vn -0.081561 0.913979 0.397480 +vn -0.885726 0.077771 -0.457647 +vn -0.461014 0.087242 -0.883094 +vn 0.374352 0.145284 -0.915835 +vn 0.681138 0.311874 -0.662408 +vn -0.993774 0.101644 -0.045616 +vn -0.139224 0.086586 -0.986468 +vn -0.208368 0.721215 0.660629 +vn -0.767454 0.371095 0.522784 +vn 0.823581 0.455044 -0.338600 +vn 0.599648 0.795760 -0.084780 +vn 0.209708 0.917282 0.338551 +vn -0.951160 0.131375 0.279349 +vn -0.985099 0.171851 0.006916 +vn -0.999720 -0.020869 -0.011181 +vn -0.958716 -0.010495 0.284171 +vn -0.726920 0.628810 0.276016 +vn -0.746389 0.663733 0.048604 +vn -0.779758 0.080561 0.620876 +vn -0.670892 0.425834 0.607099 +vn -0.790179 0.020378 0.612537 +vn -0.360360 0.259501 -0.895991 +vn -0.771459 0.183892 -0.609126 +vn -0.636791 0.604940 -0.478063 +vn -0.323777 0.733727 -0.597339 +vn -0.384560 0.024414 -0.922777 +vn -0.782448 0.005679 -0.622690 +vn -0.105189 0.295544 -0.949520 +vn -0.098890 0.039786 -0.994303 +vn -0.148943 0.772206 -0.617668 +vn -0.393356 -0.181822 -0.901228 +vn -0.776506 -0.148070 -0.612466 +vn -0.405218 -0.563709 -0.719743 +vn -0.683519 -0.450139 -0.574610 +vn -0.137862 -0.180766 -0.973816 +vn -0.170746 -0.612324 -0.771949 +vn -0.481912 -0.064571 0.873837 +vn -0.810808 -0.077158 0.580205 +vn -0.791282 -0.416430 0.447726 +vn -0.501460 -0.473204 0.724303 +vn -0.485471 0.041987 0.873244 +vn -0.138721 -0.073799 0.987578 +vn -0.152045 0.039323 0.987591 +vn -0.215223 -0.610122 0.762516 +vn -0.442345 0.121367 0.888595 +vn -0.360263 0.559532 0.746414 +vn -0.180215 0.168301 0.969122 +vn -0.200527 0.610927 0.765870 +vn -0.956722 -0.137853 0.256281 +vn -0.985518 -0.167940 -0.023452 +vn -0.817726 -0.568725 -0.088746 +vn -0.840911 -0.522495 0.140955 +vn -0.954140 -0.158621 -0.253883 +vn -0.780000 -0.544286 -0.308793 +vn -0.967121 -0.011800 -0.254041 +vn -0.959024 0.163252 -0.231563 +vn -0.735168 0.658003 -0.162975 +vn -0.314856 0.902508 0.293844 +vn -0.343405 0.936700 0.068311 +vn -0.169287 0.934687 0.312574 +vn -0.137211 0.987924 0.071963 +vn -0.327683 0.933486 -0.145697 +vn -0.137258 0.977121 -0.162462 +vn -0.608601 -0.783291 -0.126726 +vn -0.820144 -0.565005 -0.090184 +vn -0.586209 -0.786303 0.195157 +vn -0.514055 -0.846302 0.139716 +vn -0.500771 -0.765994 -0.403089 +vn -0.156620 -0.821638 -0.548070 +vn -0.220744 -0.941782 0.253609 +vn -0.237546 -0.619950 -0.747820 +vn -0.689026 -0.591875 -0.418242 +vn -0.665018 0.704888 -0.246748 +vn -0.656351 0.677965 0.331009 +vn -0.305472 -0.852889 0.423400 +vn -0.376038 -0.223562 0.899230 +vn -0.305547 0.881652 -0.359626 +vn -0.283917 0.901097 0.327743 +vn -0.225633 0.090773 0.969974 +vn -0.663979 0.249716 0.704822 +vn -0.319194 0.476940 -0.818928 +vn -0.257241 0.410232 0.874950 +vn -0.175163 0.602554 -0.778618 +vn -0.903761 0.326924 0.276292 +vn 0.934862 -0.349374 0.063011 +vn 0.507204 -0.478045 -0.717089 +vn -0.656447 -0.224939 -0.720055 +vn -0.178081 0.409620 -0.894706 +vn -0.199278 0.206696 -0.957896 +vn -0.595573 0.153588 -0.788482 +vn -0.235096 0.392020 -0.889410 +vn -0.234157 -0.002263 0.972196 +vn -0.244998 -0.135335 0.960032 +vn -0.158436 0.161963 0.973995 +vn -0.155590 0.392786 0.906372 +vn 0.482368 0.174545 0.858403 +vn -0.514040 0.329600 0.791913 +vn -0.260702 -0.090029 0.961212 +vn -0.238551 -0.018233 0.970959 +vn -0.712366 0.255011 -0.653838 +vn -0.746001 0.101436 -0.658175 +vn -0.992755 0.081358 0.088421 +vn -0.990350 0.137734 -0.015366 +vn -0.728165 -0.002487 0.685397 +vn -0.767538 0.008157 0.640952 +vn -0.283349 0.296069 -0.912171 +vn -0.259139 0.101465 -0.960496 +vn -0.219608 0.190611 -0.956786 +vn -0.246057 0.308851 -0.918731 +vn -0.730952 0.241380 -0.638314 +vn -0.725524 0.129080 -0.675983 +vn -0.999906 -0.003909 -0.013113 +vn -0.997513 0.067736 0.019504 +vn -0.709472 -0.146128 0.689417 +vn -0.722762 -0.150777 0.674449 +vn -0.249073 -0.207523 0.945990 +vn -0.254636 -0.241600 0.936371 +vn -0.635342 0.768106 0.079717 +vn -0.849693 0.521992 -0.074469 +vn -0.588395 0.569788 0.573701 +vn -0.399999 0.615579 0.679017 +vn -0.257722 -0.324747 -0.910010 +vn -0.402157 0.037376 -0.914808 +vn -0.540757 0.023859 0.840840 +vn -0.442519 -0.024371 0.896428 +vn 0.148264 -0.141429 0.978783 +vn 0.248394 -0.054590 0.967120 +vn -0.645576 -0.063595 0.761044 +vn -0.834879 -0.012623 -0.550288 +vn -0.246346 -0.000705 0.969182 +vn -0.667915 -0.117870 0.734844 +vn -0.085631 -0.241660 0.966575 +vn -0.268348 -0.136848 -0.953552 +vn 0.715414 -0.380337 0.586111 +vn 0.940955 -0.338405 -0.009265 +vn 0.353936 -0.412639 -0.839320 +vn 0.698728 -0.369813 0.612387 +vn 0.812261 -0.581760 0.042275 +vn 0.955291 0.285330 0.077493 +vn 0.792465 -0.604482 0.081247 +vn 0.885177 -0.103790 0.453529 +vn 0.819952 -0.203883 0.534893 +vn 0.827504 -0.532828 -0.177009 +vn 0.965951 -0.204053 -0.159064 +vn -0.826954 -0.022211 -0.561831 +vn -0.848346 -0.132312 -0.512643 +vn -0.934551 0.026923 0.354810 +vn -0.975820 0.065984 0.208377 +vn 0.506068 -0.292873 -0.811247 +vn 0.385374 -0.543555 -0.745678 +vn -0.298956 -0.379954 -0.875363 +vn -0.293792 -0.182279 -0.938329 +vn -0.907745 0.408613 -0.095051 +vn -0.797211 0.549057 -0.250981 +vn -0.900231 -0.358930 -0.246482 +vn -0.795503 -0.599311 -0.089451 +vn -0.968791 0.030966 -0.245936 +vn -0.776606 -0.210122 0.593913 +vn -0.253980 -0.908392 0.332143 +vn 0.321422 0.917934 0.232562 +vn -0.301786 0.889074 0.344198 +vn -0.376880 -0.462462 0.802552 +vn -0.323926 -0.945809 0.022752 +vn 0.214442 -0.974124 0.071399 +vn 0.113368 -0.541967 0.832718 +vn 0.242152 -0.969466 0.038694 +vn 0.175185 -0.971243 0.161237 +vn 0.831146 -0.540194 0.131858 +vn 0.895340 -0.443232 0.043723 +vn 0.397176 0.917393 -0.025335 +vn -0.217266 0.964610 -0.149410 +vn -0.410405 -0.909015 -0.072515 +vn 0.909029 0.414305 0.044923 +vn 0.987830 0.152966 -0.028149 +vn 0.629438 0.720630 -0.290689 +vn -0.114572 0.860517 -0.496370 +vn -0.920449 -0.258702 -0.292996 +vn -0.526442 -0.850147 0.010437 +vn 0.478898 0.001464 0.877869 +vn 0.494196 -0.094328 0.864218 +vn 0.857581 -0.508454 0.077647 +vn 0.870142 -0.482763 0.098959 +vn -0.576422 0.517136 0.632699 +vn -0.604582 0.534467 0.590615 +vn -0.109127 0.619563 0.777325 +vn -0.204020 0.413765 0.887228 +vn -0.055265 -0.370839 -0.927051 +vn -0.154054 -0.509581 -0.846519 +vn -0.625335 -0.193092 -0.756090 +vn -0.628332 -0.022263 -0.777627 +vn -0.907300 0.406394 -0.107937 +vn -0.909692 0.410710 -0.061462 +vn -0.690052 0.164142 -0.704901 +vn -0.575399 0.632584 -0.518415 +vn -0.847565 -0.520619 0.102907 +vn -0.881234 -0.431984 0.191877 +vn -0.940788 0.262451 0.214564 +vn -0.951044 0.306114 0.042551 +vn 0.961880 -0.241418 0.128467 +vn 0.965208 -0.193874 0.175460 +vn 0.643027 -0.754153 0.133299 +vn 0.555470 -0.816284 0.158531 +vn 0.042339 0.999071 -0.008062 +vn -0.035777 0.979385 -0.198811 +vn 0.755500 0.653330 0.048786 +vn 0.731571 0.679582 0.054515 +vn -0.243989 -0.969774 0.002698 +vn -0.246863 -0.960855 0.125763 +vn 0.595616 -0.581706 -0.553949 +vn 0.480466 -0.659801 -0.577768 +vn -0.656056 0.752994 0.050899 +vn -0.821411 0.556750 -0.123749 +vn -0.464759 0.806091 -0.366355 +vn -0.129041 -0.985770 -0.107727 +vn -0.886825 -0.461587 0.021896 +vn -0.981566 0.100736 0.162422 +vn 0.992267 -0.062985 0.106951 +vn 0.852731 -0.520777 -0.040508 +vn -0.532154 0.846641 0.003414 +vn -0.936968 0.318069 -0.144649 +vn -0.940892 0.338529 -0.010945 +vn -0.488377 0.869625 -0.072390 +vn -0.724068 0.689699 -0.006451 +vn 0.992333 0.088398 0.086373 +vn 0.786296 0.614963 -0.059665 +vn 0.961732 -0.264875 0.070091 +vn 0.878125 -0.477593 -0.028313 +vn 0.084190 0.993984 -0.070052 +vn -0.299877 -0.848901 -0.435248 +vn -0.291283 -0.954654 0.061569 +vn -0.832052 -0.553938 0.029013 +vn -0.726774 -0.541771 -0.422237 +vn 0.312334 -0.894071 -0.321068 +vn 0.490016 -0.865528 0.103657 +vn -0.999287 -0.012326 -0.035679 +vn -0.974766 0.066769 0.213008 +vn -0.896548 0.430488 0.104316 +vn 0.819913 0.363317 -0.442428 +vn 0.983220 -0.111259 0.144571 +vn 0.981468 -0.084211 0.172133 +vn -0.693870 0.693365 0.194397 +vn -0.248969 -0.952777 0.173870 +vn -0.956203 -0.232667 0.177600 +vn 0.266347 -0.957437 0.111235 +vn 0.541981 -0.801085 -0.254006 +vn 0.873327 -0.310572 0.375294 +vn 0.621129 -0.314910 0.717656 +vn 0.944875 0.049964 0.323597 +vn 0.635345 0.079782 0.768097 +vn -0.580442 -0.065070 -0.811697 +vn -0.157536 -0.029562 -0.987071 +vn -0.223337 -0.370315 -0.901658 +vn -0.477828 -0.395374 -0.784448 +vn 0.201529 0.943434 0.263282 +vn 0.559717 0.818551 -0.129195 +vn -0.205765 0.421443 -0.883203 +vn -0.513738 0.423899 -0.745911 +vn 0.924646 -0.340150 0.171255 +vn 0.856074 -0.489734 -0.165222 +vn -0.920803 0.233192 0.312640 +vn 0.768215 -0.043455 -0.638716 +vn 0.817163 0.417263 0.397663 +vn 0.554700 0.417299 0.719840 +vn 0.853105 -0.510761 0.106467 +vn -0.352306 -0.441628 -0.825134 +vn 0.080721 -0.921930 0.378853 +vn -0.445880 -0.827069 0.342269 +vn -0.719935 0.078365 0.689603 +vn 0.212030 0.087937 0.973299 +vn 0.134277 0.317032 0.938861 +vn -0.766815 0.288382 0.573438 +vn 0.790634 0.490663 0.366262 +vn -0.548927 0.420349 -0.722486 +vn -0.523695 -0.067721 -0.849210 +vn 0.941116 -0.171402 0.291415 +vn 0.068443 0.903102 0.423937 +vn -0.406406 0.830187 0.381606 +vn -0.752561 -0.162424 0.638178 +vn 0.145562 -0.227790 0.962769 +vn -0.505701 0.835645 -0.214394 +vn -0.486489 0.855529 0.177193 +vn 0.912004 0.388106 -0.132753 +vn 0.783265 0.401245 -0.474866 +vn 0.957211 0.209631 0.199504 +vn 0.671092 -0.721295 0.171378 +vn 0.657042 -0.736610 -0.160317 +vn -0.953304 -0.263157 0.148192 +vn -0.578655 0.673831 0.459467 +vn -0.864770 -0.257097 0.431362 +vn -0.753862 0.411902 -0.511888 +vn -0.000023 0.247143 -0.968979 +vn -0.565098 0.612665 -0.552545 +vn -0.466461 0.882368 -0.061976 +vn 0.045188 0.981526 -0.185916 +vn 0.567413 0.441032 -0.695365 +vn 0.417663 0.854569 -0.308657 +vn 0.560573 0.213783 -0.800034 +vn -0.000016 0.247147 -0.968978 +vn -0.000021 0.247146 -0.968978 +vn 0.486621 0.201126 -0.850146 +vn -0.545587 0.287429 -0.787223 +vn -0.545517 0.370833 -0.751595 +vn -0.000012 0.247142 -0.968979 +vn -0.624414 -0.005659 -0.781073 +vn -0.567224 0.187234 -0.801998 +vn -0.000013 0.247144 -0.968979 +vn 0.515211 -0.225433 -0.826885 +vn 0.546147 0.048702 -0.836273 +vn 0.513237 0.086994 -0.853827 +vn -0.000023 0.247145 -0.968979 +vn -0.000023 0.247144 -0.968979 +vn 0.575573 0.218899 -0.787908 +vn -0.595892 0.296715 -0.746239 +vn -0.643319 0.395493 -0.655535 +vn 0.299948 -0.601574 -0.740364 +vn -0.111823 -0.590603 -0.799177 +vn -0.501566 -0.440140 -0.744788 +vn -0.543054 0.374071 -0.751773 +vn -0.000023 0.247144 -0.968979 +vn 0.514276 0.092575 -0.852614 +vn -0.162762 -0.969674 -0.182322 +vn -0.731176 -0.662890 -0.161116 +vn -0.773264 0.563142 0.291433 +vn -0.497721 0.798090 0.339596 +vn 0.978716 -0.203923 -0.023030 +vn 0.969734 -0.230551 -0.080382 +vn -0.988024 0.135544 0.073727 +vn -0.952982 0.280512 0.114621 +vn -0.998692 -0.046511 0.021240 +vn -0.980185 0.171501 0.099119 +vn -0.909867 0.354930 0.214867 +vn 0.952291 -0.305085 0.008090 +vn 0.749372 -0.654064 -0.103157 +vn 0.997787 0.044563 0.049354 +vn 0.895970 0.428308 0.117428 +vn 0.998510 -0.054018 0.007778 +vn 0.838983 -0.452898 0.301646 +vn 0.829517 -0.220786 0.512987 +vn 0.996852 -0.029457 0.073607 +vn 0.855100 -0.112515 0.506107 +vn 0.862384 -0.312069 0.398630 +vn 0.700916 -0.649267 0.295244 +vn -0.945856 -0.318133 -0.064397 +vn -0.467992 -0.827100 0.311269 +vn -0.805367 -0.424823 0.413412 +vn -0.861771 0.038305 0.505849 +vn -0.829045 0.110779 0.548098 +vn -0.872761 0.271889 0.405419 +vn -0.761993 0.509671 0.399503 +vn 0.051038 0.961487 0.270071 +vn -0.545061 0.724443 0.422008 +vn -0.006982 0.894330 0.447354 +vn 0.381747 -0.907382 -0.175861 +vn 0.239929 -0.944481 0.224478 +vn 0.499856 0.843851 0.195090 +vn 0.535399 0.742626 0.402312 +vn 0.910801 0.299154 0.284515 +vn 0.979558 0.003911 0.201125 +vn 0.922574 -0.352563 0.156704 +vn -0.883184 -0.142627 0.446814 +vn -0.956119 0.274834 0.101500 +vn -0.865087 0.046466 0.499465 +vn -0.906627 0.036892 0.420317 +vn 0.996753 0.001554 0.080503 +vn 0.881276 -0.457103 0.120040 +vn -0.270956 -0.392730 0.878832 +vn -0.258913 -0.247746 0.933588 +vn -0.785924 0.453682 0.420114 +vn -0.493559 0.742902 0.452211 +vn -0.294458 -0.250432 0.922268 +vn -0.379336 -0.468860 0.797668 +vn -0.818998 -0.087433 0.567096 +vn 0.050589 0.889180 0.454753 +vn 0.572899 0.724793 0.382702 +vn -0.260165 -0.179100 0.948808 +vn 0.922934 0.337565 0.185045 +vn 0.430427 -0.708279 0.559530 +vn 0.287482 -0.413955 0.863710 +vn 0.257683 -0.226433 0.939323 +vn 0.324298 -0.266247 0.907713 +vn 0.275031 -0.449896 0.849678 +vn -0.237251 -0.745926 0.622340 +vn -0.860516 0.191362 0.472115 +vn 0.085916 -0.802502 0.590431 +vn 0.510097 0.826584 0.237823 +vn 0.920595 0.314255 0.231839 +vn -0.787951 0.403183 0.465377 +vn -0.381918 0.771244 0.509237 +vn 0.989451 -0.037508 0.139927 +vn 0.143050 0.845211 0.514931 +vn 0.652357 -0.714750 0.252117 +vn 0.199821 -0.902004 0.382701 +vn -0.883293 0.040968 0.467028 +vn -0.615058 -0.469136 0.633730 +vn -0.248760 -0.786021 0.565941 +g characterMedium +f 1/638/1 27/854/2 41/194/3 30/522/4 +f 1/638/1 30/522/4 40/928/5 16/470/6 +f 1/638/1 16/470/6 36/133/7 15/367/8 +f 1/638/1 15/367/8 39/91/9 27/854/2 +f 2/855/10 23/197/11 35/465/12 14/973/13 +f 2/855/10 14/973/13 38/331/14 25/391/15 +f 65/851/16 77/633/17 380/196/18 353/779/19 +f 65/851/16 353/779/19 378/903/20 75/529/21 +f 3/269/22 25/391/15 38/331/14 19/587/23 +f 3/269/22 19/587/23 33/846/24 18/901/25 +f 66/387/26 73/275/27 373/198/28 354/388/29 +f 66/387/26 354/388/29 380/196/18 77/633/17 +f 4/199/30 20/129/31 34/60/32 21/975/33 +f 4/199/30 21/975/33 39/91/9 26/159/34 +f 67/61/35 78/62/36 381/876/37 356/738/38 +f 67/61/35 356/738/38 375/467/39 74/424/40 +f 5/875/41 26/159/34 39/91/9 15/367/8 +f 5/875/41 15/367/8 36/133/7 24/758/42 +f 68/759/43 76/121/44 379/762/45 357/34/46 +f 68/759/43 357/34/46 381/876/37 78/62/36 +f 6/35/47 13/36/48 37/37/49 29/639/50 +f 6/35/47 29/639/50 41/194/3 27/854/2 +f 6/35/47 27/854/2 39/91/9 21/975/33 +f 6/35/47 21/975/33 34/60/32 13/36/48 +f 7/66/51 17/595/52 33/846/24 19/587/23 +f 7/66/51 19/587/23 38/331/14 28/471/53 +f 7/66/51 28/471/53 41/194/3 29/639/50 +f 7/66/51 29/639/50 37/37/49 17/595/52 +f 8/641/54 28/471/53 38/331/14 14/973/13 +f 8/641/54 14/973/13 35/465/12 22/241/55 +f 8/641/54 22/241/55 40/928/5 30/522/4 +f 8/641/54 30/522/4 41/194/3 28/471/53 +f 9/226/56 16/470/6 40/928/5 31/998/57 +f 69/553/58 79/386/59 383/513/60 362/596/61 +f 69/502/58 362/207/61 379/762/45 76/121/44 +f 9/879/56 24/758/42 36/133/7 16/470/6 +f 10/5/62 22/241/55 35/465/12 23/197/11 +f 70/757/63 75/529/21 378/903/20 363/642/64 +f 70/757/63 363/642/64 383/513/60 79/386/59 +f 10/5/62 31/998/57 40/928/5 22/241/55 +f 32/514/65 12/503/66 44/970/67 43/761/68 +f 11/195/69 18/901/25 33/846/24 17/595/52 +f 11/195/69 17/595/52 37/37/49 32/514/65 +f 71/713/70 366/780/71 373/198/28 73/275/27 +f 12/503/66 32/514/65 37/37/49 13/36/48 +f 12/503/66 13/36/48 34/60/32 20/129/31 +f 72/771/72 74/424/40 375/467/39 367/760/73 +f 71/713/70 11/195/69 42/1020/74 80/972/75 +f 42/1020/74 43/761/68 46/468/76 45/515/77 +f 81/327/78 384/756/79 389/710/80 83/158/81 +f 11/195/69 32/514/65 43/761/68 42/1020/74 +f 72/771/72 367/760/73 384/756/79 81/327/78 +f 45/550/77 46/971/76 49/902/82 48/38/83 +f 83/1029/81 389/700/80 394/480/84 85/588/85 +f 43/761/68 44/970/67 47/328/86 46/468/76 +f 80/972/75 42/1020/74 45/515/77 82/772/87 +f 46/971/76 47/360/86 50/402/88 49/902/82 +f 82/500/87 45/550/77 48/38/83 84/613/89 +f 169/524/90 165/966/91 133/39/92 134/501/93 +f 93/130/94 61/63/95 51/614/96 86/967/97 +f 92/180/98 417/776/99 399/615/100 87/403/101 +f 168/573/102 167/847/103 135/40/104 136/574/105 +f 741/228/106 735/173/107 404/825/108 89/750/109 +f 739/41/110 736/616/111 55/160/112 54/995/113 +f 736/440/111 738/943/114 56/944/115 55/945/112 +f 740/161/116 739/41/110 54/995/113 88/113/117 +f 753/117/118 748/708/119 59/162/120 90/999/121 +f 750/144/122 747/389/123 57/309/124 58/572/125 +f 748/708/119 750/669/122 58/270/125 59/162/120 +f 752/235/126 749/977/127 409/690/128 91/308/129 +f 163/504/130 164/640/131 132/42/132 131/965/133 +f 85/588/85 394/480/84 417/776/99 92/180/98 +f 84/613/89 48/38/83 61/63/95 93/130/94 +f 165/966/91 166/617/134 138/737/135 133/39/92 +f 119/43/136 106/566/137 95/409/138 113/106/139 +f 55/877/112 56/567/115 111/575/140 +f 55/497/112 121/987/141 54/251/113 +f 395/400/142 84/613/89 93/130/94 416/44/143 +f 50/402/88 85/588/85 92/180/98 60/411/144 +f 747/389/123 752/235/126 91/308/129 57/309/124 +f 751/969/145 753/117/118 90/999/121 413/45/146 +f 737/853/147 740/161/116 88/113/117 405/260/148 +f 738/943/114 741/228/106 89/750/109 56/944/115 +f 60/411/144 92/180/98 87/403/101 53/840/149 +f 416/44/143 93/130/94 86/967/97 400/118/150 +f 390/67/151 82/500/87 84/613/89 395/400/142 +f 385/268/152 80/972/75 82/772/87 390/718/151 +f 47/360/86 83/1029/81 85/588/85 50/402/88 +f 12/503/66 72/771/72 81/327/78 44/970/67 +f 44/970/67 81/327/78 83/158/81 47/328/86 +f 366/780/71 71/713/70 80/972/75 385/268/152 +f 12/503/66 20/129/31 74/424/40 72/771/72 +f 11/195/69 71/713/70 73/275/27 18/901/25 +f 10/5/62 70/757/63 79/386/59 31/998/57 +f 10/5/62 23/197/11 75/529/21 70/757/63 +f 9/879/56 69/502/58 76/121/44 24/758/42 +f 9/226/56 31/998/57 79/386/59 69/553/58 +f 5/875/41 68/759/43 78/62/36 26/159/34 +f 5/875/41 24/758/42 76/121/44 68/759/43 +f 4/199/30 67/61/35 74/424/40 20/129/31 +f 4/199/30 26/159/34 78/62/36 67/61/35 +f 3/269/22 66/387/26 77/633/17 25/391/15 +f 3/269/22 18/901/25 73/275/27 66/387/26 +f 2/855/10 65/851/16 75/529/21 23/197/11 +f 2/855/10 25/391/15 77/633/17 65/851/16 +f 62/46/153 56/567/115 89/691/109 +f 64/996/154 88/692/117 54/251/113 +f 404/346/108 451/530/155 62/46/153 89/691/109 +f 482/568/156 421/736/157 63/47/158 120/1013/159 +f 405/1014/148 88/692/117 64/996/154 452/271/160 +f 110/725/161 63/215/158 421/952/157 471/569/162 +f 797/592/163 791/593/164 98/834/165 124/68/166 +f 129/300/167 108/927/168 94/778/169 122/299/170 +f 128/361/171 107/274/172 97/811/173 123/236/174 +f 118/618/175 109/953/176 96/765/177 112/252/178 +f 125/570/179 101/781/180 105/441/181 127/682/182 +f 796/347/183 793/119/184 101/781/180 125/570/179 +f 114/131/185 795/145/186 100/404/187 +f 794/711/188 792/89/189 99/348/190 115/405/191 +f 103/172/192 126/231/193 216/439/194 327/826/195 +f 114/131/185 100/404/187 104/753/196 116/174/197 +f 115/405/191 99/348/190 103/172/192 117/681/198 +f 124/68/166 98/834/165 102/680/199 126/231/193 +f 110/725/161 64/996/154 109/953/176 118/618/175 +f 121/987/141 55/497/112 107/274/172 128/361/171 +f 120/1013/159 63/47/158 108/927/168 129/300/167 +f 111/575/140 62/46/153 106/566/137 119/43/136 +f 55/877/112 111/575/140 119/43/136 107/714/172 +f 63/215/158 110/725/161 118/618/175 108/810/168 +f 101/625/180 115/405/191 117/681/198 105/942/181 +f 98/764/165 114/131/185 116/174/197 102/175/199 +f 126/231/193 102/680/199 220/170/200 216/439/194 +f 793/392/184 794/711/188 115/405/191 101/625/180 +f 791/904/164 795/145/186 114/131/185 98/764/165 +f 108/810/168 118/618/175 112/252/178 94/390/169 +f 64/996/154 110/725/161 471/569/162 452/271/160 +f 107/714/172 119/43/136 113/106/139 97/163/173 +f 116/174/197 104/753/196 221/310/201 218/171/202 +f 62/46/153 120/1013/159 129/300/167 106/566/137 +f 64/996/154 121/987/141 128/361/171 109/953/176 +f 99/348/190 124/68/166 126/231/193 103/172/192 +f 105/942/181 117/681/198 217/238/203 219/946/204 +f 796/347/183 125/570/179 100/404/187 +f 100/404/187 125/570/179 127/682/182 104/753/196 +f 109/953/176 128/361/171 123/236/174 96/765/177 +f 106/566/137 129/300/167 122/299/170 95/409/138 +f 792/89/189 797/592/163 124/68/166 99/348/190 +f 451/530/155 482/568/156 120/1013/159 62/46/153 +f 62/46/153 111/575/140 56/567/115 +f 64/996/154 54/251/113 121/987/141 +f 781/900/205 780/693/206 143/498/207 144/694/208 +f 779/401/209 775/525/210 145/906/211 141/551/212 +f 776/499/213 777/233/214 139/878/215 147/709/216 +f 777/233/214 778/670/217 140/261/218 139/878/215 +f 166/617/134 170/229/219 130/333/220 138/737/135 +f 164/640/131 168/573/102 136/574/105 132/42/132 +f 170/229/219 163/504/130 131/965/133 130/333/220 +f 167/847/103 169/69/90 134/406/93 135/40/104 +f 765/754/221 761/164/222 148/926/223 137/668/224 +f 764/495/225 763/240/226 150/359/227 151/881/228 +f 762/726/229 759/496/230 152/250/231 153/715/232 +f 763/240/226 760/464/233 155/90/234 150/359/227 +f 778/670/217 779/401/209 141/551/212 140/261/218 +f 782/487/235 776/499/213 147/709/216 142/112/236 +f 775/525/210 781/900/205 144/694/208 145/906/211 +f 780/755/206 782/487/235 142/112/236 143/301/207 +f 149/974/237 153/272/232 177/777/238 173/905/239 +f 155/64/234 137/589/224 171/707/240 179/921/241 +f 137/589/224 148/393/223 172/134/242 171/707/240 +f 151/667/228 150/157/227 174/848/243 175/329/244 +f 760/464/233 765/754/221 137/668/224 155/90/234 +f 766/527/245 762/726/229 153/715/232 149/880/237 +f 759/496/230 764/120/225 151/20/228 152/250/231 +f 761/164/222 766/527/245 149/880/237 148/926/223 +f 727/200/246 724/227/247 162/407/248 160/466/249 +f 725/469/250 722/132/251 159/763/252 156/526/253 +f 162/407/248 724/227/247 146/571/254 +f 726/335/255 723/273/256 161/237/257 158/528/258 +f 721/408/259 726/335/255 158/528/258 157/929/260 +f 725/469/250 156/526/253 146/571/254 +f 722/230/251 721/408/259 157/929/260 159/225/252 +f 723/273/256 727/200/246 160/466/249 161/237/257 +f 53/840/149 52/114/261 169/69/90 167/847/103 +f 48/38/83 49/902/82 163/504/130 170/229/219 +f 50/402/88 60/411/144 168/573/102 164/640/131 +f 61/63/95 48/38/83 170/229/219 166/617/134 +f 51/614/96 61/63/95 166/617/134 165/966/91 +f 49/902/82 50/402/88 164/640/131 163/504/130 +f 60/411/144 53/840/149 167/847/103 168/573/102 +f 52/239/261 51/614/96 165/966/91 169/524/90 +f 172/134/242 173/905/239 181/782/262 180/65/263 +f 176/140/264 175/329/244 183/54/265 184/234/266 +f 173/905/239 177/777/238 185/334/267 181/782/262 +f 179/921/241 171/707/240 154/590/268 187/773/269 +f 152/997/231 151/667/228 175/329/244 176/140/264 +f 148/393/223 149/974/237 173/905/239 172/134/242 +f 150/326/227 155/64/234 179/921/241 174/128/243 +f 153/272/232 152/523/231 176/116/264 177/777/238 +f 703/731/270 702/332/271 178/591/272 195/463/273 +f 702/332/271 699/850/274 188/330/275 178/591/272 +f 700/232/276 697/531/277 190/552/278 191/92/279 +f 701/712/280 698/1021/281 192/594/282 193/115/283 +f 174/128/243 179/921/241 187/773/269 182/576/284 +f 184/968/266 185/334/267 205/852/285 206/849/286 +f 175/329/244 174/848/243 182/425/284 183/54/265 +f 171/707/240 172/134/242 180/65/263 154/590/268 +f 194/907/287 193/115/283 192/594/282 191/783/279 +f 195/463/273 194/907/287 191/783/279 190/908/278 +f 178/591/272 188/330/275 194/907/287 195/463/273 +f 188/330/275 189/716/288 193/115/283 194/907/287 +f 704/724/289 701/712/280 193/115/283 189/716/288 +f 698/788/281 700/232/276 191/92/279 192/394/282 +f 699/850/274 704/724/289 189/716/288 188/330/275 +f 697/19/277 703/731/270 195/463/273 190/908/278 +f 710/143/290 708/397/291 201/796/292 196/6/293 +f 712/156/294 709/651/295 202/784/296 199/1010/297 +f 711/201/298 705/774/299 186/472/300 198/812/301 +f 709/651/295 706/435/302 197/909/303 202/784/296 +f 706/435/302 711/242/298 198/276/301 197/909/303 +f 705/774/299 710/165/290 196/1000/293 186/472/300 +f 707/817/304 712/156/294 199/1010/297 200/455/305 +f 708/397/291 707/817/304 200/455/305 201/796/292 +f 203/395/306 204/541/307 208/643/308 207/785/309 +f 176/140/264 184/234/266 206/93/286 204/135/307 +f 185/334/267 177/777/238 203/395/306 205/852/285 +f 177/777/238 176/116/264 204/541/307 203/395/306 +f 208/882/308 210/978/310 214/554/311 212/883/312 +f 204/135/307 206/93/286 210/978/310 208/882/308 +f 205/852/285 203/395/306 207/785/309 209/612/313 +f 206/849/286 205/852/285 209/612/313 210/911/310 +f 211/505/314 212/986/312 214/202/311 213/277/315 +f 209/612/313 207/785/309 211/505/314 213/277/315 +f 210/911/310 209/612/313 213/277/315 214/202/311 +f 207/785/309 208/643/308 212/986/312 211/505/314 +f 104/753/196 127/682/182 215/947/316 221/310/201 +f 127/682/182 105/441/181 219/948/204 215/947/316 +f 102/175/199 116/174/197 218/171/202 220/176/200 +f 117/681/198 103/172/192 327/826/195 217/238/203 +f 241/491/317 229/442/318 225/644/319 240/597/320 +f 242/186/321 224/30/322 229/442/318 241/491/317 +f 248/203/323 226/188/324 230/278/325 247/422/326 +f 247/422/326 230/278/325 228/78/327 246/298/328 +f 239/214/329 233/51/330 232/477/331 238/856/332 +f 237/253/333 231/70/334 233/51/330 239/214/329 +f 309/412/335 235/204/336 236/606/337 308/600/338 +f 308/600/338 236/606/337 234/349/339 307/418/340 +f 222/443/341 237/253/333 239/214/329 227/324/342 +f 227/324/342 239/214/329 238/856/332 223/610/343 +f 235/204/336 242/186/321 241/491/317 236/606/337 +f 236/606/337 241/491/317 240/597/320 234/349/339 +f 230/278/325 245/297/344 244/751/345 228/78/327 +f 226/188/324 243/378/346 245/297/344 230/278/325 +f 233/51/330 247/422/326 246/298/328 232/477/331 +f 231/70/334 248/203/323 247/422/326 233/51/330 +f 223/561/343 250/410/347 254/957/348 227/800/342 +f 225/837/319 252/462/349 263/193/350 240/949/320 +f 243/453/346 265/766/351 311/415/352 309/382/335 +f 228/685/327 255/820/353 267/1016/354 246/369/328 +f 246/369/328 267/1016/354 258/136/355 232/1023/331 +f 234/661/339 259/218/356 310/583/357 307/291/340 +f 237/279/333 261/343/358 257/323/359 231/645/334 +f 240/949/320 263/193/350 259/218/356 234/661/339 +f 309/382/335 311/415/352 260/292/360 235/841/336 +f 235/841/336 260/292/360 264/858/361 242/646/321 +f 253/262/362 273/647/363 284/177/364 265/766/351 +f 268/149/365 287/792/366 273/647/363 253/262/362 +f 261/343/358 280/267/367 276/178/368 257/323/359 +f 262/872/369 281/914/370 270/493/371 250/410/347 +f 255/820/353 274/557/372 286/860/373 267/1016/354 +f 263/193/350 282/17/374 278/358/375 259/218/356 +f 256/142/376 275/830/377 272/991/378 252/462/349 +f 249/137/379 269/224/380 280/267/367 261/343/358 +f 264/858/361 283/365/381 271/562/382 251/652/383 +f 257/323/359 276/178/368 287/792/366 268/149/365 +f 311/415/352 313/702/384 279/48/385 260/292/360 +f 258/136/355 277/976/386 281/914/370 262/872/369 +f 252/462/349 272/991/378 282/17/374 263/193/350 +f 266/950/387 285/892/388 274/557/372 255/820/353 +f 310/583/357 312/922/389 285/892/388 266/950/387 +f 251/652/383 271/562/382 275/630/377 256/910/376 +f 267/1016/354 286/860/373 277/976/386 258/136/355 +f 260/292/360 279/48/385 283/365/381 264/858/361 +f 313/702/384 315/189/390 298/451/391 279/48/385 +f 277/976/386 296/896/392 300/598/393 281/914/370 +f 272/991/378 291/933/394 301/564/395 282/17/374 +f 285/892/388 304/689/396 293/655/397 274/557/372 +f 312/922/389 314/939/398 304/689/396 285/892/388 +f 271/562/382 290/662/399 294/413/400 275/630/377 +f 286/860/373 305/887/401 296/896/392 277/976/386 +f 279/48/385 298/451/391 302/619/402 283/365/381 +f 273/647/363 292/244/403 303/23/404 284/177/364 +f 287/792/366 306/1001/405 292/244/403 273/647/363 +f 280/267/367 299/385/406 295/797/407 276/178/368 +f 281/914/370 300/598/393 289/677/408 270/493/371 +f 274/557/372 293/655/397 305/887/401 286/860/373 +f 282/17/374 301/564/395 297/624/409 278/358/375 +f 275/830/377 294/897/400 291/933/394 272/991/378 +f 269/224/380 288/11/410 299/385/406 280/267/367 +f 283/365/381 302/619/402 290/662/399 271/562/382 +f 276/178/368 295/797/407 306/1001/405 287/792/366 +f 290/662/399 302/619/402 322/248/411 319/1024/412 +f 301/564/395 291/933/394 317/49/413 316/660/414 +f 302/619/402 298/451/391 323/318/415 322/248/411 +f 291/933/394 294/897/400 318/419/416 317/49/413 +f 315/189/390 303/23/404 325/379/417 324/166/418 +f 297/624/409 301/564/395 316/660/414 321/245/419 +f 294/413/400 290/662/399 319/1024/412 318/870/416 +f 314/939/398 297/624/409 321/245/419 320/734/420 +f 303/23/404 304/689/396 326/704/421 325/379/417 +f 269/224/380 270/493/371 289/677/408 288/11/410 +f 300/598/393 296/896/392 295/797/407 299/385/406 +f 306/1001/405 295/797/407 296/896/392 305/887/401 +f 305/887/401 293/655/397 292/244/403 306/1001/405 +f 303/23/404 292/244/403 293/655/397 304/689/396 +f 304/689/396 314/939/398 320/734/420 326/704/421 +f 298/451/391 315/189/390 324/166/418 323/318/415 +f 278/358/375 297/624/409 314/939/398 312/922/389 +f 284/177/364 303/23/404 315/189/390 313/702/384 +f 259/218/356 278/358/375 312/922/389 310/583/357 +f 265/766/351 284/177/364 313/702/384 311/415/352 +f 227/800/342 254/957/348 249/137/379 222/384/341 +f 245/297/344 308/600/338 307/418/340 244/751/345 +f 243/378/346 309/412/335 308/600/338 245/297/344 +f 221/631/201 215/414/316 316/660/414 317/49/413 +f 318/870/416 319/1024/412 221/122/201 +f 221/631/201 317/49/413 318/419/416 +f 219/436/204 217/380/203 320/734/420 321/245/419 +f 220/126/200 218/205/202 322/248/411 323/318/415 +f 215/414/316 219/436/204 321/245/419 316/660/414 +f 218/205/202 221/122/201 319/1024/412 322/248/411 +f 327/257/195 216/809/194 324/166/418 325/379/417 +f 325/379/417 326/704/421 327/257/195 +f 217/380/203 327/257/195 326/704/421 320/734/420 +f 216/809/194 220/126/200 323/318/415 324/166/418 +f 222/384/341 249/137/379 261/343/358 237/279/333 +f 242/646/321 264/858/361 251/652/383 224/488/322 +f 248/599/323 268/149/365 253/262/362 226/325/324 +f 224/488/322 251/652/383 256/910/376 229/288/318 +f 231/645/334 257/323/359 268/149/365 248/599/323 +f 307/291/340 310/583/357 266/950/387 244/1028/345 +f 232/1023/331 258/136/355 262/872/369 238/55/332 +f 244/1028/345 266/950/387 255/820/353 228/685/327 +f 226/325/324 253/262/362 265/766/351 243/453/346 +f 229/775/318 256/142/376 252/462/349 225/837/319 +f 238/55/332 262/872/369 250/410/347 223/561/343 +f 299/385/406 288/11/410 289/677/408 300/598/393 +f 250/410/347 270/493/371 254/957/348 +f 254/957/348 269/224/380 249/137/379 +f 269/224/380 254/957/348 270/493/371 +f 328/280/422 361/884/423 382/988/424 358/620/425 +f 328/280/422 343/150/426 377/254/427 361/884/423 +f 328/280/422 342/75/428 371/930/429 343/150/426 +f 328/280/422 358/620/425 376/813/430 342/75/428 +f 329/814/431 341/648/432 370/602/433 350/937/434 +f 329/814/431 352/559/435 374/603/436 341/648/432 +f 422/739/437 353/21/19 380/296/18 434/307/438 +f 422/739/437 432/721/439 378/539/20 353/21/19 +f 330/740/440 346/843/441 374/603/436 352/559/435 +f 330/740/440 345/931/442 368/555/443 346/843/441 +f 423/426/444 354/674/29 373/815/28 430/586/445 +f 423/426/444 434/307/438 380/296/18 354/674/29 +f 331/703/446 348/728/447 369/190/448 347/492/449 +f 331/703/446 355/152/450 376/813/430 348/728/447 +f 424/932/451 356/738/38 381/876/37 435/456/452 +f 424/932/451 431/888/453 375/467/39 356/738/38 +f 332/344/454 342/75/428 376/813/430 355/152/450 +f 332/344/454 351/717/455 371/930/429 342/75/428 +f 425/741/456 357/34/46 379/762/45 433/316/457 +f 425/741/456 435/456/452 381/876/37 357/34/46 +f 333/835/458 360/483/459 372/1002/460 340/806/461 +f 333/835/458 358/620/425 382/988/424 360/483/459 +f 333/835/458 348/728/447 376/813/430 358/620/425 +f 333/835/458 340/806/461 369/190/448 348/728/447 +f 334/577/462 346/843/441 368/555/443 344/302/463 +f 334/577/462 359/742/464 374/603/436 346/843/441 +f 334/577/462 360/483/459 382/988/424 359/742/464 +f 334/577/462 344/302/463 372/1002/460 360/483/459 +f 335/789/465 341/648/432 374/603/436 359/742/464 +f 335/789/465 349/517/466 370/602/433 341/648/432 +f 335/789/465 361/884/423 377/254/427 349/517/466 +f 335/789/465 359/742/464 382/988/424 361/884/423 +f 336/695/467 364/912/468 377/254/427 343/150/426 +f 426/362/469 362/474/61 383/448/60 436/1003/470 +f 426/427/469 433/316/457 379/762/45 362/207/61 +f 336/867/467 343/150/426 371/930/429 351/717/455 +f 337/146/471 350/937/434 370/602/433 349/517/466 +f 427/727/472 363/107/64 378/539/20 432/721/439 +f 427/727/472 436/1003/470 383/448/60 363/107/64 +f 337/146/471 349/517/466 377/254/427 364/912/468 +f 365/76/473 387/370/474 388/748/475 339/22/476 +f 338/77/477 344/302/463 368/555/443 345/931/442 +f 338/77/477 365/76/473 372/1002/460 344/302/463 +f 428/350/478 430/586/445 373/815/28 366/671/71 +f 339/22/476 340/806/461 372/1002/460 365/76/473 +f 339/22/476 347/492/449 369/190/448 340/806/461 +f 429/981/479 367/760/73 375/467/39 431/888/453 +f 428/350/478 437/263/480 386/295/481 338/77/477 +f 386/295/481 391/989/482 392/672/483 387/370/474 +f 438/428/484 440/868/485 389/710/80 384/756/79 +f 338/77/477 386/295/481 387/370/474 365/76/473 +f 429/981/479 438/428/484 384/756/79 367/760/73 +f 391/127/482 396/962/486 397/313/487 392/429/483 +f 440/696/485 442/798/488 394/480/84 389/700/80 +f 387/370/474 392/672/483 393/319/489 388/748/475 +f 437/263/480 439/101/490 391/989/482 386/295/481 +f 392/429/483 397/313/487 398/799/491 393/621/489 +f 439/303/490 441/363/492 396/962/486 391/127/482 +f 530/98/493 495/255/494 494/538/495 526/481/496 +f 450/281/497 443/673/498 401/482/499 415/683/500 +f 449/954/501 444/565/502 399/615/100 417/776/99 +f 529/256/503 497/438/504 496/1004/505 528/282/506 +f 746/827/507 446/828/508 404/825/108 735/173/107 +f 744/24/509 406/430/510 407/1015/511 742/604/512 +f 742/444/512 407/684/511 408/686/513 743/687/514 +f 745/336/515 445/1005/516 406/430/510 744/24/509 +f 758/366/517 447/57/518 412/461/519 755/368/520 +f 756/532/521 411/311/522 410/829/523 754/665/524 +f 755/368/520 412/461/519 411/108/522 756/866/521 +f 757/916/525 448/167/526 409/690/128 749/977/127 +f 524/383/527 492/675/528 493/109/529 525/626/530 +f 442/798/488 449/954/501 417/776/99 394/480/84 +f 441/363/492 450/281/497 415/683/500 396/962/486 +f 526/481/496 494/538/495 499/304/531 527/364/532 +f 479/94/533 473/510/534 454/210/535 465/50/536 +f 407/705/511 470/729/537 408/181/513 +f 407/95/511 406/371/510 481/351/538 +f 395/400/142 416/44/143 450/281/497 441/363/492 +f 398/799/491 414/1/539 449/954/501 442/798/488 +f 754/665/524 410/829/523 448/167/526 757/916/525 +f 751/969/145 413/45/146 447/57/518 758/366/517 +f 737/853/147 405/260/148 445/1005/516 745/336/515 +f 743/687/514 408/686/513 446/828/508 746/827/507 +f 414/1/539 403/147/540 444/565/502 449/954/501 +f 416/44/143 400/118/150 443/673/498 450/281/497 +f 390/67/151 395/400/142 441/363/492 439/303/490 +f 385/543/152 390/305/151 439/101/490 437/263/480 +f 393/621/489 398/799/491 442/798/488 440/696/485 +f 339/22/476 388/748/475 438/428/484 429/981/479 +f 388/748/475 393/319/489 440/868/485 438/428/484 +f 366/671/71 385/543/152 437/263/480 428/350/478 +f 339/22/476 429/981/479 431/888/453 347/492/449 +f 338/77/477 345/931/442 430/586/445 428/350/478 +f 337/146/471 364/912/468 436/1003/470 427/727/472 +f 337/146/471 427/727/472 432/721/439 350/937/434 +f 336/867/467 351/717/455 433/316/457 426/427/469 +f 336/695/467 426/362/469 436/1003/470 364/912/468 +f 332/344/454 355/152/450 435/456/452 425/741/456 +f 332/344/454 425/741/456 433/316/457 351/717/455 +f 331/703/446 347/492/449 431/888/453 424/932/451 +f 331/703/446 424/932/451 435/456/452 355/152/450 +f 330/740/440 352/559/435 434/307/438 423/426/444 +f 330/740/440 423/426/444 430/586/445 345/931/442 +f 329/814/431 350/937/434 432/721/439 422/739/437 +f 329/814/431 422/739/437 434/307/438 352/559/435 +f 418/743/541 446/955/508 408/181/513 +f 420/816/542 406/371/510 445/449/516 +f 404/346/108 446/955/508 418/743/541 451/530/155 +f 482/568/156 480/372/543 419/990/544 421/736/157 +f 405/1014/148 452/271/160 420/816/542 445/449/516 +f 469/656/545 471/569/162 421/952/157 419/657/544 +f 804/293/546 485/818/547 457/511/548 798/507/549 +f 490/730/550 483/556/551 453/71/552 467/558/553 +f 489/25/554 484/74/555 456/934/556 466/548/557 +f 478/26/558 472/1017/559 455/373/560 468/627/561 +f 486/9/562 488/688/563 464/445/564 460/842/565 +f 803/801/566 486/9/562 460/842/565 800/79/567 +f 802/658/568 474/8/569 459/484/570 +f 801/940/571 475/917/572 458/659/573 799/819/574 +f 462/179/575 688/831/576 577/446/577 487/396/578 +f 474/8/569 476/2/579 463/622/580 459/484/570 +f 475/917/572 477/768/581 462/179/575 458/659/573 +f 485/818/547 487/396/578 461/353/582 457/511/548 +f 469/656/545 478/26/558 468/627/561 420/816/542 +f 481/351/538 489/25/554 466/548/557 407/95/511 +f 480/372/543 490/730/550 467/558/553 419/990/544 +f 470/729/537 479/94/533 465/50/536 418/743/541 +f 407/705/511 466/584/557 479/94/533 470/729/537 +f 419/657/544 467/151/553 478/26/558 469/656/545 +f 460/52/565 464/951/564 477/768/581 475/917/572 +f 457/53/548 461/1006/582 476/2/579 474/8/569 +f 487/396/578 577/446/577 581/744/583 461/353/582 +f 800/607/567 460/52/565 475/917/572 801/940/571 +f 798/399/549 457/53/548 474/8/569 802/658/568 +f 467/151/553 453/605/552 472/1017/559 478/26/558 +f 420/816/542 452/271/160 471/569/162 469/656/545 +f 466/584/557 456/27/556 473/510/534 479/94/533 +f 476/2/579 579/1007/584 582/312/585 463/622/580 +f 418/743/541 465/50/536 490/730/550 480/372/543 +f 420/816/542 468/627/561 489/25/554 481/351/538 +f 458/659/573 462/179/575 487/396/578 485/818/547 +f 464/951/564 580/264/586 578/447/587 477/768/581 +f 459/484/570 486/9/562 803/801/566 +f 459/484/570 463/622/580 488/688/563 486/9/562 +f 468/627/561 455/373/560 484/74/555 489/25/554 +f 465/50/536 454/210/535 483/556/551 490/730/550 +f 799/819/574 458/659/573 485/818/547 804/293/546 +f 451/530/155 418/743/541 480/372/543 482/568/156 +f 418/743/541 408/181/513 470/729/537 +f 420/816/542 481/351/538 406/371/510 +f 789/86/588 505/628/589 504/578/590 788/918/591 +f 787/745/592 502/767/593 506/769/594 783/836/595 +f 784/110/596 508/289/597 500/315/598 785/96/599 +f 785/96/599 500/315/598 501/317/600 786/374/601 +f 527/364/532 499/304/531 491/791/602 531/320/603 +f 525/626/530 493/109/529 497/438/504 529/256/503 +f 531/320/603 491/791/602 492/675/528 524/383/527 +f 528/282/506 496/1004/505 495/265/494 530/802/493 +f 773/431/604 498/219/605 509/18/606 769/923/607 +f 772/258/608 512/808/609 511/356/610 771/28/611 +f 770/111/612 514/512/613 513/182/614 767/579/615 +f 771/28/611 511/356/610 516/479/616 768/73/617 +f 786/374/601 501/317/600 502/767/593 787/745/592 +f 790/935/618 503/676/619 508/289/597 784/110/596 +f 783/836/595 506/769/594 505/628/589 789/86/588 +f 788/285/591 504/485/590 503/676/619 790/935/618 +f 510/1018/620 534/212/621 538/321/622 514/168/613 +f 516/563/616 540/654/623 532/608/624 498/72/605 +f 498/72/605 532/608/624 533/941/625 509/886/606 +f 512/283/609 536/452/626 535/153/627 511/735/610 +f 768/73/617 516/479/616 498/219/605 773/431/604 +f 774/29/628 510/873/620 514/512/613 770/111/612 +f 767/579/615 513/182/614 512/432/609 772/540/608 +f 769/923/607 509/18/606 510/873/620 774/29/628 +f 734/80/629 521/898/630 523/192/631 731/832/632 +f 732/97/633 517/984/634 520/259/635 729/33/636 +f 731/832/632 523/192/631 507/81/637 +f 733/871/638 519/216/639 522/582/640 730/16/641 +f 728/749/642 518/478/643 519/216/639 733/871/638 +f 507/81/637 517/984/634 732/97/633 +f 729/961/636 520/123/635 518/478/643 728/749/642 +f 730/16/641 522/582/640 521/898/630 734/80/629 +f 403/147/540 528/282/506 530/802/493 402/919/644 +f 396/962/486 531/320/603 524/383/527 397/313/487 +f 398/799/491 525/626/530 529/256/503 414/1/539 +f 415/683/500 527/364/532 531/320/603 396/962/486 +f 401/482/499 526/481/496 527/364/532 415/683/500 +f 397/313/487 524/383/527 525/626/530 398/799/491 +f 414/1/539 529/256/503 528/282/506 403/147/540 +f 402/486/644 530/98/493 526/481/496 401/482/499 +f 533/941/625 541/979/645 542/980/646 534/212/621 +f 537/314/647 545/611/648 544/634/649 536/452/626 +f 534/212/621 542/980/646 546/473/650 538/321/622 +f 540/654/623 548/58/651 515/536/652 532/608/624 +f 513/521/614 537/314/647 536/452/626 512/283/609 +f 509/886/606 533/941/625 534/212/621 510/1018/620 +f 511/243/610 535/284/627 540/654/623 516/563/616 +f 514/168/613 538/321/622 537/924/647 513/337/614 +f 695/664/653 556/913/654 539/956/655 694/546/656 +f 694/546/656 539/956/655 549/632/657 691/82/658 +f 692/920/659 552/793/660 551/752/661 689/290/662 +f 693/433/663 554/87/664 553/869/665 690/340/666 +f 535/284/627 543/982/667 548/58/651 540/654/623 +f 545/246/648 567/183/668 566/341/669 546/473/650 +f 536/452/626 544/634/649 543/960/667 535/153/627 +f 532/608/624 515/536/652 541/979/645 533/941/625 +f 555/958/670 552/994/660 553/869/665 554/87/664 +f 556/913/654 551/723/661 552/994/660 555/958/670 +f 539/956/655 556/913/654 555/958/670 549/632/657 +f 549/632/657 555/958/670 554/87/664 550/697/671 +f 696/247/672 550/697/671 554/87/664 693/433/663 +f 690/423/666 553/862/665 552/793/660 692/920/659 +f 691/82/658 549/632/657 550/697/671 696/247/672 +f 689/874/662 551/723/661 556/913/654 695/664/653 +f 718/560/673 557/191/674 562/138/675 716/821/676 +f 720/489/677 560/287/678 563/963/679 717/457/680 +f 719/719/681 559/184/682 547/13/683 713/1008/684 +f 717/457/680 563/963/679 558/545/685 714/666/686 +f 714/666/686 558/545/685 559/925/682 719/733/681 +f 713/1008/684 547/13/683 557/154/674 718/609/673 +f 715/804/687 561/10/688 560/287/678 720/489/677 +f 716/821/676 562/138/675 561/10/688 715/804/687 +f 564/635/689 568/899/690 569/679/691 565/803/692 +f 537/314/647 565/580/692 567/105/668 545/611/648 +f 546/473/650 566/341/669 564/635/689 538/321/622 +f 538/321/622 564/635/689 565/803/692 537/924/647 +f 569/490/691 573/518/693 575/3/694 571/508/695 +f 565/580/692 569/490/691 571/508/695 567/105/668 +f 566/341/669 570/286/696 568/899/690 564/635/689 +f 567/183/668 571/985/695 570/286/696 566/341/669 +f 572/636/697 574/859/698 575/102/694 573/83/693 +f 570/286/696 574/859/698 572/636/697 568/899/690 +f 571/985/695 575/102/694 574/859/698 570/286/696 +f 568/899/690 572/636/697 573/83/693 569/679/691 +f 463/622/580 582/312/585 576/993/699 488/688/563 +f 488/688/563 576/993/699 580/1027/586 464/445/564 +f 461/1006/582 581/885/583 579/1007/584 476/2/579 +f 477/768/581 578/447/587 688/831/576 462/179/575 +f 602/124/700 601/844/701 586/547/702 590/15/703 +f 603/992/704 602/124/700 590/15/703 585/459/705 +f 609/141/706 608/544/707 591/863/708 587/823/709 +f 608/544/707 607/537/710 589/7/711 591/863/708 +f 600/460/712 599/865/713 593/1019/714 594/720/715 +f 598/519/716 600/460/712 594/720/715 592/722/717 +f 670/509/718 669/103/719 597/434/720 596/698/721 +f 669/103/719 668/585/722 595/338/723 597/434/720 +f 583/861/724 588/209/725 600/460/712 598/519/716 +f 588/209/725 584/822/726 599/865/713 600/460/712 +f 596/698/721 597/434/720 602/124/700 603/992/704 +f 597/434/720 595/338/723 601/844/701 602/124/700 +f 591/863/708 589/7/711 605/155/727 606/376/728 +f 587/823/709 591/863/708 606/376/728 604/983/729 +f 594/720/715 593/1019/714 607/537/710 608/544/707 +f 592/722/717 594/720/715 608/544/707 609/141/706 +f 584/417/726 588/420/725 615/375/730 611/663/731 +f 586/1026/702 601/148/701 624/249/732 613/649/733 +f 604/964/729 670/476/718 672/678/734 626/213/735 +f 589/220/711 607/845/710 628/894/736 616/747/737 +f 607/845/710 593/458/714 619/339/738 628/894/736 +f 595/895/723 668/533/722 671/342/739 620/890/740 +f 598/125/716 592/357/717 618/637/741 622/221/742 +f 601/148/701 595/895/723 620/890/740 624/249/732 +f 670/476/718 596/206/721 621/454/743 672/678/734 +f 596/206/721 603/807/704 625/786/744 621/454/743 +f 614/534/745 626/213/735 645/354/746 634/169/747 +f 629/187/748 614/534/745 634/169/747 648/520/749 +f 622/221/742 618/637/741 637/99/750 641/516/751 +f 623/31/752 611/663/731 631/12/753 642/650/754 +f 616/747/737 628/894/736 647/864/755 635/421/756 +f 624/249/732 620/890/740 639/891/757 643/787/758 +f 617/475/759 613/649/733 633/581/760 636/889/761 +f 610/1009/762 622/221/742 641/516/751 630/217/763 +f 625/786/744 612/32/764 632/377/765 644/4/766 +f 618/637/741 629/187/748 648/520/749 637/99/750 +f 672/678/734 621/454/743 640/746/767 674/732/768 +f 619/339/738 623/31/752 642/650/754 638/139/769 +f 613/649/733 624/249/732 643/787/758 633/581/760 +f 627/88/770 616/747/737 635/421/756 646/1025/771 +f 671/342/739 627/88/770 646/1025/771 673/85/772 +f 612/32/764 617/494/759 636/838/761 632/377/765 +f 628/894/736 619/339/738 638/139/769 647/864/755 +f 621/454/743 625/786/744 644/4/766 640/746/767 +f 674/732/768 640/746/767 659/56/773 676/623/774 +f 638/139/769 642/650/754 661/795/775 657/833/776 +f 633/581/760 643/787/758 662/223/777 652/59/778 +f 646/1025/771 635/421/756 654/506/779 665/839/780 +f 673/85/772 646/1025/771 665/839/780 675/936/781 +f 632/377/765 636/838/761 655/100/782 651/294/783 +f 647/864/755 638/139/769 657/833/776 666/398/784 +f 640/746/767 644/4/766 663/266/785 659/56/773 +f 634/169/747 645/354/746 664/322/786 653/706/787 +f 648/520/749 634/169/747 653/706/787 667/824/788 +f 641/516/751 637/99/750 656/790/789 660/355/790 +f 642/650/754 631/12/753 650/601/791 661/795/775 +f 635/421/756 647/864/755 666/398/784 654/506/779 +f 643/787/758 639/891/757 658/535/792 662/223/777 +f 636/889/761 633/581/760 652/59/778 655/416/782 +f 630/217/763 641/516/751 660/355/790 649/222/793 +f 644/4/766 632/377/765 651/294/783 663/266/785 +f 637/99/750 648/520/749 667/824/788 656/790/789 +f 651/294/783 680/185/794 683/208/795 663/266/785 +f 662/223/777 677/437/796 678/1022/797 652/59/778 +f 663/266/785 683/208/795 684/770/798 659/56/773 +f 652/59/778 678/1022/797 679/211/799 655/416/782 +f 676/623/774 685/549/800 686/805/801 664/322/786 +f 658/535/792 682/345/802 677/437/796 662/223/777 +f 655/100/782 679/857/799 680/185/794 651/294/783 +f 675/936/781 681/893/803 682/345/802 658/535/792 +f 664/322/786 686/805/801 687/84/804 665/839/780 +f 630/217/763 649/222/793 650/601/791 631/12/753 +f 661/795/775 660/355/790 656/790/789 657/833/776 +f 667/824/788 666/398/784 657/833/776 656/790/789 +f 666/398/784 667/824/788 653/706/787 654/506/779 +f 664/322/786 665/839/780 654/506/779 653/706/787 +f 665/839/780 687/84/804 681/893/803 675/936/781 +f 659/56/773 684/770/798 685/549/800 676/623/774 +f 639/891/757 673/85/772 675/936/781 658/535/792 +f 645/354/746 674/732/768 676/623/774 664/322/786 +f 620/890/740 671/342/739 673/85/772 639/891/757 +f 626/213/735 672/678/734 674/732/768 645/354/746 +f 588/420/725 583/306/724 610/1009/762 615/375/730 +f 606/376/728 605/155/727 668/585/722 669/103/719 +f 604/983/729 606/376/728 669/103/719 670/509/718 +f 582/653/585 678/1022/797 677/437/796 576/938/699 +f 679/857/799 582/542/585 680/185/794 +f 582/653/585 679/211/799 678/1022/797 +f 580/381/586 682/345/802 681/893/803 578/915/587 +f 581/1011/583 684/770/798 683/208/795 579/450/584 +f 576/938/699 677/437/796 682/345/802 580/381/586 +f 579/450/584 683/208/795 680/185/794 582/542/585 +f 688/699/576 686/805/801 685/549/800 577/794/577 +f 686/805/801 688/699/576 687/84/804 +f 578/915/587 681/893/803 687/84/804 688/699/576 +f 577/794/577 685/549/800 684/770/798 581/1011/583 +f 583/306/724 598/125/716 622/221/742 610/1009/762 +f 603/807/704 585/104/705 612/32/764 625/786/744 +f 609/629/706 587/701/709 614/534/745 629/187/748 +f 585/104/705 590/14/703 617/494/759 612/32/764 +f 592/357/717 609/629/706 629/187/748 618/637/741 +f 668/533/722 605/352/727 627/88/770 671/342/739 +f 593/458/714 599/1012/713 623/31/752 619/339/738 +f 605/352/727 589/220/711 616/747/737 627/88/770 +f 587/701/709 604/964/729 626/213/735 614/534/745 +f 590/959/703 586/1026/702 613/649/733 617/475/759 +f 599/1012/713 584/417/726 611/663/731 623/31/752 +f 660/355/790 661/795/775 650/601/791 649/222/793 +f 611/663/731 615/375/730 631/12/753 +f 615/375/730 610/1009/762 630/217/763 +f 630/217/763 631/12/753 615/375/730 +f 557/191/674 689/874/662 695/664/653 562/138/675 +f 560/287/678 691/82/658 696/247/672 563/963/679 +f 559/184/682 690/423/666 692/920/659 547/13/683 +f 563/963/679 696/247/672 693/433/663 558/545/685 +f 558/545/685 693/433/663 690/340/666 559/925/682 +f 547/13/683 692/920/659 689/290/662 557/154/674 +f 561/10/688 694/546/656 691/82/658 560/287/678 +f 562/138/675 695/664/653 694/546/656 561/10/688 +f 196/6/293 201/796/292 703/731/270 697/19/277 +f 199/1010/297 202/784/296 704/724/289 699/850/274 +f 198/812/301 186/472/300 700/232/276 698/788/281 +f 202/784/296 197/909/303 701/712/280 704/724/289 +f 197/909/303 198/276/301 698/1021/281 701/712/280 +f 186/472/300 196/1000/293 697/531/277 700/232/276 +f 200/455/305 199/1010/297 699/850/274 702/332/271 +f 201/796/292 200/455/305 702/332/271 703/731/270 +f 187/773/269 154/590/268 707/817/304 708/397/291 +f 154/590/268 180/65/263 712/156/294 707/817/304 +f 183/54/265 182/425/284 710/165/290 705/774/299 +f 185/334/267 184/968/266 711/242/298 706/435/302 +f 181/782/262 185/334/267 706/435/302 709/651/295 +f 184/234/266 183/54/265 705/774/299 711/201/298 +f 180/65/263 181/782/262 709/651/295 712/156/294 +f 182/576/284 187/773/269 708/397/291 710/143/290 +f 548/58/651 716/821/676 715/804/687 515/536/652 +f 515/536/652 715/804/687 720/489/677 541/979/645 +f 544/634/649 713/1008/684 718/609/673 543/960/667 +f 546/473/650 714/666/686 719/733/681 545/246/648 +f 542/980/646 717/457/680 714/666/686 546/473/650 +f 545/611/648 719/719/681 713/1008/684 544/634/649 +f 541/979/645 720/489/677 717/457/680 542/980/646 +f 543/982/667 718/560/673 716/821/676 548/58/651 +f 139/878/215 140/261/218 727/200/246 723/273/256 +f 143/301/207 142/112/236 721/408/259 722/230/251 +f 145/906/211 144/694/208 725/469/250 +f 142/112/236 147/709/216 726/335/255 721/408/259 +f 147/709/216 139/878/215 723/273/256 726/335/255 +f 141/551/212 145/906/211 724/227/247 +f 144/694/208 143/498/207 722/132/251 725/469/250 +f 140/261/218 141/551/212 724/227/247 727/200/246 +f 500/315/598 730/16/641 734/80/629 501/317/600 +f 504/485/590 729/961/636 728/749/642 503/676/619 +f 505/628/589 506/769/594 732/97/633 +f 503/676/619 728/749/642 733/871/638 508/289/597 +f 508/289/597 733/871/638 730/16/641 500/315/598 +f 502/767/593 731/832/632 506/769/594 +f 505/628/589 732/97/633 729/33/636 504/578/590 +f 501/317/600 734/80/629 731/832/632 502/767/593 +f 410/829/523 743/687/514 746/827/507 448/167/526 +f 413/45/146 737/853/147 745/336/515 447/57/518 +f 447/57/518 745/336/515 744/24/509 412/461/519 +f 411/311/522 742/444/512 743/687/514 410/829/523 +f 412/461/519 744/24/509 742/604/512 411/108/522 +f 448/167/526 746/827/507 735/173/107 409/690/128 +f 57/309/124 91/308/129 741/228/106 738/943/114 +f 413/45/146 90/999/121 740/161/116 737/853/147 +f 90/999/121 59/162/120 739/41/110 740/161/116 +f 58/572/125 57/309/124 738/943/114 736/440/111 +f 59/162/120 58/270/125 736/616/111 739/41/110 +f 91/308/129 409/690/128 735/173/107 741/228/106 +f 400/118/150 751/969/145 758/366/517 443/673/498 +f 403/147/540 754/665/524 757/916/525 444/565/502 +f 444/565/502 757/916/525 749/977/127 399/615/100 +f 401/482/499 755/368/520 756/866/521 402/486/644 +f 402/919/644 756/532/521 754/665/524 403/147/540 +f 443/673/498 758/366/517 755/368/520 401/482/499 +f 400/118/150 86/967/97 753/117/118 751/969/145 +f 53/840/149 87/403/101 752/235/126 747/389/123 +f 87/403/101 399/615/100 749/977/127 752/235/126 +f 51/614/96 52/239/261 750/669/122 748/708/119 +f 52/114/261 53/840/149 747/389/123 750/144/122 +f 86/967/97 51/614/96 748/708/119 753/117/118 +f 160/466/249 162/407/248 766/527/245 761/164/222 +f 156/526/253 159/763/252 764/120/225 759/496/230 +f 162/407/248 146/571/254 762/726/229 766/527/245 +f 158/528/258 161/237/257 765/754/221 760/464/233 +f 157/929/260 158/528/258 760/464/233 763/240/226 +f 146/571/254 156/526/253 759/496/230 762/726/229 +f 159/225/252 157/929/260 763/240/226 764/495/225 +f 161/237/257 160/466/249 761/164/222 765/754/221 +f 521/898/630 769/923/607 774/29/628 523/192/631 +f 517/984/634 767/579/615 772/540/608 520/259/635 +f 523/192/631 774/29/628 770/111/612 507/81/637 +f 519/216/639 768/73/617 773/431/604 522/582/640 +f 518/478/643 771/28/611 768/73/617 519/216/639 +f 507/81/637 770/111/612 767/579/615 517/984/634 +f 520/123/635 772/258/608 771/28/611 518/478/643 +f 522/582/640 773/431/604 769/923/607 521/898/630 +f 134/501/93 133/39/92 782/487/235 780/755/206 +f 136/574/105 135/40/104 781/900/205 775/525/210 +f 133/39/92 138/737/135 776/499/213 782/487/235 +f 131/965/133 132/42/132 779/401/209 778/670/217 +f 130/333/220 131/965/133 778/670/217 777/233/214 +f 138/737/135 130/333/220 777/233/214 776/499/213 +f 132/42/132 136/574/105 775/525/210 779/401/209 +f 135/40/104 134/406/93 780/693/206 781/900/205 +f 495/255/494 788/285/591 790/935/618 494/538/495 +f 497/438/504 783/836/595 789/86/588 496/1004/505 +f 494/538/495 790/935/618 784/110/596 499/304/531 +f 492/675/528 786/374/601 787/745/592 493/109/529 +f 491/791/602 785/96/599 786/374/601 492/675/528 +f 499/304/531 784/110/596 785/96/599 491/791/602 +f 493/109/529 787/745/592 783/836/595 497/438/504 +f 496/1004/505 789/86/588 788/918/591 495/265/494 +f 506/769/594 507/81/637 732/97/633 +f 145/906/211 146/571/254 724/227/247 +f 506/769/594 731/832/632 507/81/637 +f 145/906/211 725/469/250 146/571/254 +f 95/409/138 122/299/170 797/592/163 792/89/189 +f 96/765/177 123/236/174 796/347/183 +f 94/390/169 112/252/178 795/145/186 791/904/164 +f 97/163/173 113/106/139 794/711/188 793/392/184 +f 113/106/139 95/409/138 792/89/189 794/711/188 +f 112/252/178 96/765/177 795/145/186 +f 123/236/174 97/811/173 793/119/184 796/347/183 +f 122/299/170 94/778/169 791/593/164 797/592/163 +f 454/210/535 799/819/574 804/293/546 483/556/551 +f 484/74/555 455/373/560 803/801/566 +f 453/605/552 798/399/549 802/658/568 472/1017/559 +f 456/27/556 800/607/567 801/940/571 473/510/534 +f 473/510/534 801/940/571 799/819/574 454/210/535 +f 472/1017/559 802/658/568 455/373/560 +f 484/74/555 803/801/566 800/79/567 456/934/556 +f 483/556/551 804/293/546 798/507/549 453/71/552 +f 455/373/560 459/484/570 803/801/566 +f 96/765/177 100/404/187 795/145/186 +f 455/373/560 802/658/568 459/484/570 +f 96/765/177 796/347/183 100/404/187 diff --git a/modules/ufbx/data/maya_leading_comma_7500_ascii.fbx b/modules/ufbx/data/maya_leading_comma_7500_ascii.fbx new file mode 100644 index 0000000..2cfab59 --- /dev/null +++ b/modules/ufbx/data/maya_leading_comma_7500_ascii.fbx @@ -0,0 +1,424 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 34 + Millisecond: 164 + } + Creator: , "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658664160, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1908558533920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1907292239120, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1907674217712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907680138928, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631740128, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1907292239120,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631740128,1907680138928 + + ;Geometry::, Model::pCube1 + C: "OO",1908558533920,1907292239120 + + ;Material::lambert1, Model::pCube1 + C: "OO",1907674217712,1907292239120 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_lock_mute_7700_ascii.fbx b/modules/ufbx/data/maya_lock_mute_7700_ascii.fbx new file mode 100644 index 0000000..5491e84 --- /dev/null +++ b/modules/ufbx/data/maya_lock_mute_7700_ascii.fbx @@ -0,0 +1,1059 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 9 + Hour: 16 + Minute: 6 + Second: 51 + Millisecond: 124 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_lock_mute_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_lock_mute_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "09/06/2022 13:06:51.123" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_lock_mute_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "09/06/2022 13:06:51.123" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1476220459040, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 36 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 2 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 2 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 8 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 20 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1475936796512, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1475936781952, "Geometry::", "Mesh" { + Vertices: *12 { + a: -0.5,0,0.5,0.5,0,0.5,-0.5,0,-0.5,0.5,0,-0.5 + } + PolygonVertexIndex: *4 { + a: 0,1,3,-3 + } + Edges: *4 { + a: 0,3,1,2 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *12 { + a: 0,1,0,0,1,0,0,1,0,0,1,0 + } + NormalsW: *4 { + a: 1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 0,0,1,0,0,1,1,1 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1475799426016, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+L4M1",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+L2M2",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+L1M4",1,1,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1475799398176, "Model::pPlane1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+M7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+L7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+L7M7",1,1,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1476209077552, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1476072449696, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 1476208194720, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208195520, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208199520, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208196160, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208195680, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208197920, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208196320, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208195040, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208197600, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208196480, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208195200, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208198080, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208195840, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208199200, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208197280, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208196800, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208196960, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208198720, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208198240, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurve: 1476208200320, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *1 { + a: 1924423250 + } + KeyValueFloat: *1 { + a: 0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 1 + } + } + AnimationCurveNode: 1476075905136, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 1475706998144, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1475706999392, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 1475706997520, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1475706998560, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 1475706996272, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1475706997104, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 1475706997312, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 1475924175952, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1475799426016,0 + + ;Model::pPlane1, Model::RootNode + C: "OO",1475799398176,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1475924175952,1476072449696 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",1476075905136,1475924175952 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1475706998144,1475924175952 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1475706999392,1475924175952 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1475706997520,1475924175952 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",1475706998560,1475924175952 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1475706996272,1475924175952 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1475706997104,1475924175952 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1475706997312,1475924175952 + + ;Geometry::, Model::pCube1 + C: "OO",1475936796512,1475799426016 + + ;Material::lambert1, Model::pCube1 + C: "OO",1476209077552,1475799426016 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",1475706998144,1475799426016, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",1475706997520,1475799426016, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",1475706999392,1475799426016, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",1476075905136,1475799426016, "Visibility" + + ;Geometry::, Model::pPlane1 + C: "OO",1475936781952,1475799398176 + + ;Material::lambert1, Model::pPlane1 + C: "OO",1476209077552,1475799398176 + + ;AnimCurveNode::T, Model::pPlane1 + C: "OP",1475706996272,1475799398176, "Lcl Translation" + + ;AnimCurveNode::R, Model::pPlane1 + C: "OP",1475706997312,1475799398176, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pPlane1 + C: "OP",1475706997104,1475799398176, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::pPlane1 + C: "OP",1475706998560,1475799398176, "Visibility" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",1476208194720,1476075905136, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1476208195520,1475706998144, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1476208199520,1475706998144, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1476208196160,1475706998144, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1476208195680,1475706999392, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1476208197920,1475706999392, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1476208196320,1475706999392, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1476208195040,1475706997520, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1476208197600,1475706997520, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1476208196480,1475706997520, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",1476208195200,1475706998560, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1476208198080,1475706996272, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1476208195840,1475706996272, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1476208199200,1475706996272, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1476208197280,1475706997104, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1476208196800,1475706997104, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1476208196960,1475706997104, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1476208198720,1475706997312, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1476208198240,1475706997312, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1476208200320,1475706997312, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_lock_mute_7700_binary.fbx b/modules/ufbx/data/maya_lock_mute_7700_binary.fbx new file mode 100644 index 0000000..c40053c Binary files /dev/null and b/modules/ufbx/data/maya_lock_mute_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_lod_group_6100_ascii.fbx b/modules/ufbx/data/maya_lod_group_6100_ascii.fbx new file mode 100644 index 0000000..9069713 --- /dev/null +++ b/modules/ufbx/data/maya_lod_group_6100_ascii.fbx @@ -0,0 +1,2773 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 2 + Day: 10 + Hour: 19 + Minute: 30 + Second: 55 + Millisecond: 872 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 17 + ObjectType: "Model" { + Count: 14 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::LOD_Group_1", "LodGroup" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "ThresholdsUsedAsPercentage", "bool", "N",1 + Property: "MinMaxDistance", "bool", "N",0 + Property: "MinDistance", "double", "N",-100 + Property: "MaxDistance", "double", "N",100 + Property: "WorldSpace", "bool", "N",1 + Property: "DisplayLevels|Level0", "enum", "N",0 + Property: "DisplayLevels|Level1", "enum", "N",0 + Property: "DisplayLevels|Level2", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + NodeAttributeName: "NodeAttribute::LOD_Group_1_ncl1_1" + } + Model: "Model::LOD_0", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::LOD_0_ncl1_2" + } + Model: "Model::pPlatonic1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: 0,0,-1,0.723606824874878,0.525731086730957,-0.447213590145111,-0.276393264532089,0.850650906562805,-0.447213649749756 + ,-0.894427299499512,-7.81933167104398e-08,-0.447213649749756,-0.276393294334412,-0.850650787353516,-0.447213590145111 + ,0.723606765270233,-0.525731146335602,-0.447213590145111,0.894427299499512,0,0.447213649749756,0.276393175125122,0.85065084695816 + ,0.447213590145111,-0.723606884479523,0.525731086730957,0.447213649749756,-0.723606765270233,-0.525731205940247,0.447213590145111 + ,0.276393324136734,-0.850650787353516,0.447213590145111,0,0,1,-0.16245986521244,0.499999970197678,-0.85065084695816 + ,0.262865543365479,0.809016942977905,-0.525731086730957,0.42532542347908,0.309016972780228,-0.85065084695816,0.187592461705208 + ,0.577350199222565,-0.794654488563538,-0.525731086730957,-4.59608742175988e-08,-0.85065084695816,-0.688190996646881 + ,0.499999940395355,-0.525731086730957,-0.491123467683792,0.356822043657303,-0.794654488563538,-0.162459895014763,-0.499999970197678 + ,-0.85065084695816,-0.688190996646881,-0.5,-0.525731086730957,-0.491123467683792,-0.356822073459625,-0.794654488563538 + ,0.425325393676758,-0.30901700258255,-0.85065084695816,0.262865513563156,-0.809017062187195,-0.525731146335602,0.187592402100563 + ,-0.577350199222565,-0.794654488563538,0.85065084695816,-3.50347306721233e-08,-0.525731086730957,0.607061982154846 + ,-2.50023290959689e-08,-0.794654488563538,-3.50347306721233e-08,0.999999940395355,0,0.587785243988037,0.809016942977905 + ,0,0.303530991077423,0.934172332286835,-0.187592476606369,-0.95105654001236,0.309016913175583,0,-0.587785243988037 + ,0.809016942977905,0,-0.794654488563538,0.57735013961792,-0.187592461705208,-0.587785243988037,-0.80901700258255,0 + ,-0.95105642080307,-0.309017091989517,0,-0.794654488563538,-0.577350318431854,-0.187592461705208,0.587785303592682 + ,-0.809016942977905,0,1.75173653360616e-08,-0.999999940395355,0,0.303531020879745,-0.934172332286835,-0.187592476606369 + ,0.95105654001236,0.309016972780228,0,0.95105654001236,-0.309017032384872,0,0.982246935367584,-2.50023290959689e-08 + ,-0.187592461705208,0.688190937042236,0.5,0.525731086730957,0.794654488563538,0.577350258827209,0.187592476606369 + ,-0.262865573167801,0.809016942977905,0.525731086730957,-0.303531020879745,0.934172332286835,0.187592476606369,-0.85065084695816 + ,-1.0510419201637e-07,0.525731086730957,-0.982246994972229,-1.00009337700158e-07,0.18759249150753,-0.262865453958511 + ,-0.80901700258255,0.525731086730957,-0.303530961275101,-0.934172332286835,0.187592476606369,0.688190996646881,-0.499999970197678 + ,0.525731086730957,0.794654488563538,-0.577350258827209,0.187592476606369,0.162459835410118,0.5,0.85065084695816,0.525731086730957 + ,0,0.85065084695816,0.49112343788147,0.356822103261948,0.794654488563538,-0.42532542347908,0.309016942977905,0.85065084695816 + ,-0.187592476606369,0.577350199222565,0.794654428958893,-0.425325393676758,-0.309017032384872,0.85065084695816,-0.607061982154846 + ,-7.50069872879067e-08,0.794654428958893,0.162459924817085,-0.499999970197678,0.85065084695816,-0.187592417001724 + ,-0.577350258827209,0.794654488563538,0.491123467683792,-0.356822043657303,0.794654428958893 + PolygonVertexIndex: 14,0,12,-16,12,2,13,-16,13,1,14,-16,12,0,16,-19,16,3,17,-19,17,2,12,-19,16,0,19,-22,19,4,20,-22,20,3,16,-22,19,0,22 + ,-25,22,5,23,-25,23,4,19,-25,22,0,14,-27,14,1,25,-27,25,5,22,-27,28,1,13,-30,13,2,27,-30,27,7,28,-30,31,2,17,-33,17 + ,3,30,-33,30,8,31,-33,34,3,20,-36,20,4,33,-36,33,9,34,-36,37,4,23,-39,23,5,36,-39,36,10,37,-39,40,5,25,-42,25,1,39 + ,-42,39,6,40,-42,39,1,28,-44,28,7,42,-44,42,6,39,-44,27,2,31,-46,31,8,44,-46,44,7,27,-46,30,3,34,-48,34,9,46,-48,46 + ,8,30,-48,33,4,37,-50,37,10,48,-50,48,9,33,-50,36,5,40,-52,40,6,50,-52,50,10,36,-52,53,6,42,-55,42,7,52,-55,52,11 + ,53,-55,52,7,44,-57,44,8,55,-57,55,11,52,-57,55,8,46,-59,46,9,57,-59,57,11,55,-59,57,9,48,-61,48,10,59,-61,59,11,57 + ,-61,59,10,50,-62,50,6,53,-62,53,11,59,-62 + Edges: 0,1,2,3,4,5,6,8,9,13,14,15,16,17,18,20,25,26,27,28,29,30,32,37,38,39,40,41,42,44,50,51,53,54,56,60,62,63,65,66,68 + ,69,72,74,75,77,78,80,81,84,86,87,89,90,92,93,96,98,99,101,102,104,105,108,110,111,113,114,116,117,122,123,125,126 + ,128,134,135,137,138,140,146,147,149,150,152,158,159,161,162,164,170,171,173,174,176,180,182,183,185,186,188,189,194 + ,195,197,198,200,206,207,209,210,212,218,219,221,222,224,230,231,234 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0.213542863726616,0.155148163437843,-0.964535355567932,-3.30459180020171e-08,6.60918386685694e-09,-1,-0.0815661773085594 + ,0.251035004854202,-0.964535355567932,0.0990169644355774,0.304743140935898,-0.9472736120224,-0.230113461613655 + ,0.708216428756714,-0.667440950870514,-0.276393204927444,0.85065084695816,-0.447213590145111,-0.0165701843798161 + ,0.863364696502686,-0.5043084025383,-0.0468716025352478,0.753742456436157,-0.655496180057526,0.520878732204437 + ,0.688736855983734,-0.504308342933655,0.723606824874878,0.525731205940247,-0.447213560342789,0.602444887161255 + ,0.437701940536499,-0.66744077205658,0.480958789587021,0.582240223884583,-0.655496001243591,-0.0815661773085594 + ,0.251035004854202,-0.964535355567932,-3.30459180020171e-08,6.60918386685694e-09,-1,-0.263953685760498,6.29573859711741e-09 + ,-0.964535355567932,-0.259229809045792,0.188341602683067,-0.947273671627045,-0.744662821292877,-1.25914745296996e-08 + ,-0.667440831661224,-0.894427180290222,-5.82102046564614e-08,-0.447213560342789,-0.82622903585434,0.25103497505188 + ,-0.504308342933655,-0.731336057186127,0.188341647386551,-0.655496060848236,-0.494067519903183,0.708216428756714 + ,-0.50430828332901,-0.276393204927444,0.85065084695816,-0.447213590145111,-0.230113461613655,0.708216428756714 + ,-0.667440950870514,-0.405118882656097,0.6373410820961,-0.655496001243591,-0.263953685760498,6.29573859711741e-09 + ,-0.964535355567932,-3.30459180020171e-08,6.60918386685694e-09,-1,-0.0815661996603012,-0.251035034656525,-0.964535295963287 + ,-0.259229868650436,-0.188341587781906,-0.947273552417755,-0.230113551020622,-0.708216369152069,-0.667440891265869 + ,-0.276393234729767,-0.850650787353516,-0.447213560342789,-0.494067311286926,-0.708216488361359,-0.50430828332901 + ,-0.405118882656097,-0.637341141700745,-0.655496060848236,-0.82622903585434,-0.251035064458847,-0.50430828332901 + ,-0.894427180290222,-5.82102046564614e-08,-0.447213560342789,-0.744662821292877,-1.25914745296996e-08,-0.667440831661224 + ,-0.731335937976837,-0.188341706991196,-0.655496060848236,-0.0815661996603012,-0.251035034656525,-0.964535295963287 + ,-3.30459180020171e-08,6.60918386685694e-09,-1,0.213542908430099,-0.155148193240166,-0.964535295963287,0.099017009139061 + ,-0.304743200540543,-0.947273552417755,0.6024449467659,-0.437701821327209,-0.667440891265869,0.723606765270233 + ,-0.525731146335602,-0.447213649749756,0.520878612995148,-0.688736855983734,-0.5043084025383,0.480958670377731 + ,-0.582240045070648,-0.655496120452881,-0.0165704507380724,-0.863364696502686,-0.504308342933655,-0.276393234729767 + ,-0.850650787353516,-0.447213560342789,-0.230113551020622,-0.708216369152069,-0.667440891265869,-0.046871867030859 + ,-0.753742516040802,-0.655496180057526,0.213542908430099,-0.155148193240166,-0.964535295963287,-3.30459180020171e-08 + ,6.60918386685694e-09,-1,0.213542863726616,0.155148163437843,-0.964535355567932,0.320425480604172,0,-0.947273731231689 + ,0.602444887161255,0.437701940536499,-0.66744077205658,0.723606824874878,0.525731205940247,-0.447213560342789 + ,0.815988063812256,0.282553791999817,-0.504308342933655,0.702367722988129,0.277496993541718,-0.655496001243591 + ,0.815988063812256,-0.282553732395172,-0.50430828332901,0.723606765270233,-0.525731146335602,-0.447213649749756 + ,0.6024449467659,-0.437701821327209,-0.667440891265869,0.702367842197418,-0.27749690413475,-0.655495882034302 + ,0.684011161327362,0.688736855983734,-0.240354463458061,0.723606824874878,0.525731205940247,-0.447213560342789 + ,0.520878732204437,0.688736855983734,-0.504308342933655,0.542154848575592,0.770581722259521,-0.335070043802261 + ,-0.0165701843798161,0.863364696502686,-0.5043084025383,-0.276393204927444,0.85065084695816,-0.447213590145111 + ,-0.148547187447548,0.959251523017883,-0.240354388952255,0.0143243409693241,0.94208437204361,-0.335069894790649 + ,0.148547202348709,0.959251463413239,0.240354746580124,0.276393175125122,0.850650787353516,0.447213709354401 + ,0.443656623363495,0.863364636898041,0.24035470187664,0.306101739406586,0.942084312438965,0.137036234140396,-0.443656802177429 + ,0.863364636898041,-0.240354478359222,-0.276393204927444,0.85065084695816,-0.447213590145111,-0.494067519903183 + ,0.708216428756714,-0.50430828332901,-0.565331995487213,0.753742516040802,-0.335070013999939,-0.82622903585434 + ,0.25103497505188,-0.504308342933655,-0.894427180290222,-5.82102046564614e-08,-0.447213560342789,-0.958206057548523 + ,0.155148059129715,-0.240354433655739,-0.891549050807953,0.304743140935898,-0.335070073604584,-0.866398692131042 + ,0.437701851129532,0.240354403853416,-0.723606765270233,0.525731146335602,0.447213649749756,-0.684011101722717 + ,0.688736855983734,0.2403544485569,-0.801384806632996,0.582240164279938,0.137035861611366,-0.958206057548523 + ,-0.15514825284481,-0.240354374051094,-0.894427180290222,-5.82102046564614e-08,-0.447213560342789,-0.82622903585434 + ,-0.251035064458847,-0.50430828332901,-0.891549050807953,-0.304743200540543,-0.335069924592972,-0.494067311286926 + ,-0.708216488361359,-0.50430828332901,-0.276393234729767,-0.850650787353516,-0.447213560342789,-0.443656474351883 + ,-0.86336475610733,-0.240354433655739,-0.565331637859344,-0.753742814064026,-0.335069954395294,-0.684011161327362 + ,-0.688736915588379,0.240354552865028,-0.723606765270233,-0.525731146335602,0.447213619947433,-0.866398811340332 + ,-0.437701910734177,0.240354508161545,-0.801384925842285,-0.582240045070648,0.137036025524139,-0.148547202348709 + ,-0.959251582622528,-0.240354374051094,-0.276393234729767,-0.850650787353516,-0.447213560342789,-0.0165704507380724 + ,-0.863364696502686,-0.504308342933655,0.0143240755423903,-0.94208437204361,-0.335069864988327,0.520878612995148 + ,-0.688736855983734,-0.5043084025383,0.723606765270233,-0.525731146335602,-0.447213649749756,0.684011161327362 + ,-0.688736915588379,-0.2403544485569,0.542154788970947,-0.770581781864166,-0.335069894790649,0.443656504154205 + ,-0.863364636898041,0.240354537963867,0.276393204927444,-0.850650787353516,0.447213590145111,0.148547247052193 + ,-0.959251463413239,0.240354672074318,0.306101739406586,-0.942084312438965,0.137036234140396,0.866398632526398 + ,-0.437701940536499,-0.24035456776619,0.723606765270233,-0.525731146335602,-0.447213649749756,0.815988063812256 + ,-0.282553732395172,-0.50430828332901,0.900401830673218,-0.277497202157974,-0.335070103406906,0.815988063812256 + ,0.282553791999817,-0.504308342933655,0.723606824874878,0.525731205940247,-0.447213560342789,0.866398692131042 + ,0.437702000141144,-0.240354508161545,0.900401830673218,0.277497142553329,-0.335070043802261,0.958206057548523 + ,0.155148282647133,0.240354388952255,0.894427180290222,7.60056124704533e-08,0.447213590145111,0.958206057548523 + ,-0.155148163437843,0.240354374051094,0.99056613445282,0,0.137035772204399,0.866398692131042,0.437702000141144 + ,-0.240354508161545,0.723606824874878,0.525731205940247,-0.447213560342789,0.684011161327362,0.688736855983734 + ,-0.240354463458061,0.801384747028351,0.582240164279938,-0.137035995721817,0.443656623363495,0.863364636898041 + ,0.24035470187664,0.276393175125122,0.850650787353516,0.447213709354401,0.494067341089249,0.708216428756714,0.504308342933655 + ,0.565331816673279,0.753742635250092,0.335070163011551,0.826228976249695,0.251035183668137,0.5043084025383,0.894427180290222 + ,7.60056124704533e-08,0.447213590145111,0.958206057548523,0.155148282647133,0.240354388952255,0.891548931598663 + ,0.304743349552155,0.335070013999939,-0.148547187447548,0.959251523017883,-0.240354388952255,-0.276393204927444 + ,0.85065084695816,-0.447213590145111,-0.443656802177429,0.863364636898041,-0.240354478359222,-0.306101769208908 + ,0.942084312438965,-0.13703590631485,-0.684011101722717,0.688736855983734,0.2403544485569,-0.723606765270233 + ,0.525731146335602,0.447213649749756,-0.520878612995148,0.688736915588379,0.504308342933655,-0.542154788970947 + ,0.770581781864166,0.335070073604584,0.016570195555687,0.863364636898041,0.5043084025383,0.276393175125122,0.850650787353516 + ,0.447213709354401,0.148547202348709,0.959251463413239,0.240354746580124,-0.0143242459744215,0.94208425283432 + ,0.33507028222084,-0.958206057548523,0.155148059129715,-0.240354433655739,-0.894427180290222,-5.82102046564614e-08 + ,-0.447213560342789,-0.958206057548523,-0.15514825284481,-0.240354374051094,-0.990566074848175,-1.50490848227491e-07 + ,-0.137035861611366,-0.866398811340332,-0.437701910734177,0.240354508161545,-0.723606765270233,-0.525731146335602 + ,0.447213619947433,-0.815988004207611,-0.282553762197495,0.504308342933655,-0.900401771068573,-0.277497231960297 + ,0.335069954395294,-0.815988063812256,0.282553553581238,0.504308342933655,-0.723606765270233,0.525731146335602 + ,0.447213649749756,-0.866398692131042,0.437701851129532,0.240354403853416,-0.900401890277863,0.277496993541718 + ,0.335069984197617,-0.443656474351883,-0.86336475610733,-0.240354433655739,-0.276393234729767,-0.850650787353516 + ,-0.447213560342789,-0.148547202348709,-0.959251582622528,-0.240354374051094,-0.306101649999619,-0.942084312438965 + ,-0.137035921216011,0.148547247052193,-0.959251463413239,0.240354672074318,0.276393204927444,-0.850650787353516 + ,0.447213590145111,0.0165703538805246,-0.863364696502686,0.50430828332901,-0.0143241165205836,-0.942084312438965 + ,0.335070192813873,-0.520878493785858,-0.688736915588379,0.50430828332901,-0.723606765270233,-0.525731146335602 + ,0.447213619947433,-0.684011161327362,-0.688736915588379,0.240354552865028,-0.542154610157013,-0.770581841468811 + ,0.335070043802261,0.684011161327362,-0.688736915588379,-0.2403544485569,0.723606765270233,-0.525731146335602 + ,-0.447213649749756,0.866398632526398,-0.437701940536499,-0.24035456776619,0.801384747028351,-0.582240164279938 + ,-0.137036055326462,0.958206057548523,-0.155148163437843,0.240354374051094,0.894427180290222,7.60056124704533e-08 + ,0.447213590145111,0.82622903585434,-0.251035064458847,0.5043084025383,0.891549110412598,-0.30474317073822,0.335070013999939 + ,0.494067400693893,-0.708216428756714,0.5043084025383,0.276393204927444,-0.850650787353516,0.447213590145111 + ,0.443656504154205,-0.863364636898041,0.240354537963867,0.565331816673279,-0.753742754459381,0.335070013999939 + ,0.744662761688232,6.92531259005591e-08,0.667440950870514,0.894427180290222,7.60056124704533e-08,0.447213590145111 + ,0.826228976249695,0.251035183668137,0.5043084025383,0.731335937976837,0.188341721892357,0.655496060848236,0.494067341089249 + ,0.708216428756714,0.504308342933655,0.276393175125122,0.850650787353516,0.447213709354401,0.230113446712494 + ,0.708216488361359,0.667440712451935,0.40511891245842,0.637341141700745,0.655496001243591,0.0815661400556564 + ,0.251035064458847,0.964535355567932,3.30459251074444e-08,0,1,0.26395383477211,0,0.964535355567932,0.259229898452759 + ,0.18834163248539,0.9472736120224,0.230113446712494,0.708216488361359,0.667440712451935,0.276393175125122,0.850650787353516 + ,0.447213709354401,0.016570195555687,0.863364636898041,0.5043084025383,0.0468715466558933,0.753742754459381,0.655495941638947 + ,-0.520878612995148,0.688736915588379,0.504308342933655,-0.723606765270233,0.525731146335602,0.447213649749756 + ,-0.602444887161255,0.437701731920242,0.667440891265869,-0.480958759784698,0.582240223884583,0.655496001243591 + ,-0.213543057441711,0.155148208141327,0.964535295963287,3.30459251074444e-08,0,1,0.0815661400556564,0.251035064458847 + ,0.964535355567932,-0.0990171208977699,0.304743200540543,0.94727349281311,-0.602444887161255,0.437701731920242 + ,0.667440891265869,-0.723606765270233,0.525731146335602,0.447213649749756,-0.815988063812256,0.282553553581238 + ,0.504308342933655,-0.702367782592773,0.277496695518494,0.655496060848236,-0.815988004207611,-0.282553762197495 + ,0.504308342933655,-0.723606765270233,-0.525731146335602,0.447213619947433,-0.602444887161255,-0.437701910734177 + ,0.667440891265869,-0.702367722988129,-0.277496874332428,0.655496060848236,-0.213542938232422,-0.155148178339005 + ,0.964535355567932,3.30459251074444e-08,0,1,-0.213543057441711,0.155148208141327,0.964535295963287,-0.320425659418106 + ,0,0.947273671627045,-0.602444887161255,-0.437701910734177,0.667440891265869,-0.723606765270233,-0.525731146335602 + ,0.447213619947433,-0.520878493785858,-0.688736915588379,0.50430828332901,-0.480958729982376,-0.582240283489227 + ,0.655495941638947,0.0165703538805246,-0.863364696502686,0.50430828332901,0.276393204927444,-0.850650787353516 + ,0.447213590145111,0.230113551020622,-0.708216488361359,0.66744077205658,0.0468717329204082,-0.753742814064026 + ,0.655495882034302,0.0815662890672684,-0.251035034656525,0.964535236358643,3.30459251074444e-08,0,1,-0.213542938232422 + ,-0.155148178339005,0.964535355567932,-0.0990169197320938,-0.304743140935898,0.9472736120224,0.230113551020622 + ,-0.708216488361359,0.66744077205658,0.276393204927444,-0.850650787353516,0.447213590145111,0.494067400693893 + ,-0.708216428756714,0.5043084025383,0.405118942260742,-0.6373410820961,0.655496001243591,0.82622903585434,-0.251035064458847 + ,0.5043084025383,0.894427180290222,7.60056124704533e-08,0.447213590145111,0.744662761688232,6.92531259005591e-08 + ,0.667440950870514,0.731335997581482,-0.188341662287712,0.655496120452881,0.26395383477211,0,0.964535355567932 + ,3.30459251074444e-08,0,1,0.0815662890672684,-0.251035034656525,0.964535236358643,0.259230047464371,-0.188341647386551 + ,0.947273552417755 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -0.034010998904705,0.987891137599945,0.151375144720078,-1.28784847674979e-07,1,6.60918830774904e-09,0.0276072155684233 + ,0.967957735061646,0.249591112136841,-0.0179690476506948,0.952344119548798,0.304496049880981,0.0133047234266996 + ,0.688071846961975,0.725520670413971,0.0322501361370087,0.473288625478745,0.880316853523254,-0.141994655132294 + ,0.497233629226685,0.855918407440186,0.0203685071319342,0.656802237033844,0.753787815570831,-0.48936328291893 + ,0.724989235401154,0.48467943072319,-0.447213709354401,0.850650787353516,0.276393234729767,-0.268028408288956 + ,0.898606777191162,0.347371011972427,-0.206844687461853,0.80189836025238,0.560512542724609,0.0276072155684233 + ,0.967957735061646,0.249591112136841,-1.28784847674979e-07,1,6.60918830774904e-09,-1.40317794716793e-07,1,4.49264376811698e-08 + ,0.0819980949163437,0.981552362442017,0.172717556357384,9.27814447493347e-09,1,-2.92169186622004e-08,-4.20741486095721e-09 + ,1,-1.2174714925095e-07,0.210894718766212,0.967957735061646,0.136313274502754,0.117812596261501,0.981552362442017 + ,0.150583043694496,0.519481241703033,0.705592095851898,0.481953501701355,0.679604947566986,0.502025485038757 + ,0.534890174865723,0.376895189285278,0.697178959846497,0.609829187393188,0.335070043802261,0.770581901073456 + ,0.542154729366302,-1.40317794716793e-07,1,4.49264376811698e-08,-1.28784847674979e-07,1,6.60918830774904e-09 + ,-0.0276074707508087,0.967957735061646,-0.249591141939163,-0.0819985046982765,0.981552362442017,-0.172717437148094 + ,-0.376895219087601,0.697178959846497,-0.609829068183899,-0.630854725837708,0.511639773845673,-0.583306968212128 + ,-0.519481182098389,0.705591976642609,-0.481953680515289,-0.335070163011551,0.770581841468811,-0.542154729366302 + ,-0.210894703865051,0.967957735061646,-0.136313438415527,-4.20741486095721e-09,1,-1.2174714925095e-07,9.27814447493347e-09 + ,1,-2.92169186622004e-08,-0.117812499403954,0.981552362442017,-0.150583282113075,-0.0276074707508087,0.967957735061646 + ,-0.249591141939163,-1.28784847674979e-07,1,6.60918830774904e-09,0.0340110845863819,0.9878910779953,-0.151375159621239 + ,0.0179689545184374,0.952344059944153,-0.304496139287949,0.268028259277344,0.898606896400452,-0.34737104177475 + ,0.447213649749756,0.850650787353516,-0.276393175125122,0.489363253116608,0.724989295005798,-0.48467954993248 + ,0.206844255328178,0.80189847946167,-0.560512602329254,-0.0251340121030807,0.504577875137329,-0.863000333309174 + ,0.886968970298767,-0.046636912971735,-0.459468364715576,-0.0133047755807638,0.688071846961975,-0.725520610809326 + ,-0.0203684940934181,0.656802177429199,-0.753787815570831,0.0340110845863819,0.9878910779953,-0.151375159621239 + ,-1.28784847674979e-07,1,6.60918830774904e-09,-0.034010998904705,0.987891137599945,0.151375144720078,5.09250867253286e-07 + ,1,1.72259547071008e-07,-0.268028408288956,0.898606777191162,0.347371011972427,-0.447213709354401,0.850650787353516 + ,0.276393234729767,-0.240354612469673,0.959251463413239,0.148547306656837,-0.205689504742622,0.960718393325806 + ,0.186312079429626,0.240354582667351,0.959251523017883,-0.148547261953354,0.447213649749756,0.850650787353516 + ,-0.276393175125122,0.268028259277344,0.898606896400452,-0.34737104177475,0.205689460039139,0.960718393325806 + ,-0.186311975121498,-0.652360439300537,0.724989235401154,0.220944613218307,-0.447213709354401,0.850650787353516 + ,0.276393234729767,-0.48936328291893,0.724989235401154,0.48467943072319,-0.655496001243591,0.637341201305389 + ,0.40511879324913,-0.141994655132294,0.497233629226685,0.855918407440186,0.0322501361370087,0.473288625478745 + ,0.880316853523254,-0.315919697284698,0.184282243251801,0.930717349052429,-0.641049027442932,0.265826642513275 + ,0.7199946641922,-0.973742485046387,0.184282302856445,-0.133662194013596,-0.447213590145111,0.525731205940247 + ,-0.723606824874878,-0.829058647155762,0.497233629226685,-0.25577437877655,-0.930668652057648,0.265826642513275 + ,0.251380324363708,0.829058587551117,0.497233718633652,0.255774438381195,0.679604947566986,0.502025485038757 + ,0.534890174865723,0.519481241703033,0.705592095851898,0.481953501701355,0.665099143981934,0.656802177429199 + ,0.355322390794754,0.210894718766212,0.967957735061646,0.136313274502754,-4.20741486095721e-09,1,-1.2174714925095e-07 + ,0.150604128837585,0.98789119720459,0.0372766964137554,0.280385553836823,0.952344119548798,0.120102845132351 + ,0.4305639564991,0.898606836795807,-0.0843830481171608,0.447213649749756,0.850650906562805,-0.276393234729767 + ,0.652360498905182,0.724989295005798,-0.220944687724113,0.593841373920441,0.801898539066315,0.0656611993908882 + ,-0.150604337453842,0.987891137599945,-0.0372766256332397,-4.20741486095721e-09,1,-1.2174714925095e-07,-0.210894703865051 + ,0.967957735061646,-0.136313438415527,-0.280385553836823,0.952344059944153,-0.120103023946285,-0.519481182098389 + ,0.705591976642609,-0.481953680515289,-0.630854725837708,0.511639773845673,-0.583306968212128,-0.857366561889648 + ,0.33079531788826,0.394331157207489,-0.665099263191223,0.656801879405975,-0.355322957038879,-0.652360379695892 + ,0.724989235401154,0.220944687724113,-0.447213649749756,0.850650787353516,0.276393234729767,-0.430563986301422 + ,0.898606777191162,0.0843827128410339,-0.593841195106506,0.80189847946167,-0.0656611546874046,-0.61200088262558 + ,-0.101741217076778,0.784285485744476,0.188639044761658,-0.504308879375458,0.84266722202301,-0.625622391700745 + ,-0.384490460157394,0.678795754909515,-0.999414086341858,-0.0239074006676674,0.0244937129318714,0.489363253116608 + ,0.724989295005798,-0.48467954993248,0.447213649749756,0.850650787353516,-0.276393175125122,0.652360498905182 + ,0.724989235401154,-0.220944434404373,0.655496120452881,0.6373410820961,-0.405118733644485,-0.886920273303986 + ,-0.384490460157394,0.256007134914398,-0.447213560342789,-0.525731086730957,-0.723606824874878,-0.50430828332901 + ,-0.282553791999817,-0.815988063812256,-0.468859225511551,-0.0239071771502495,0.882949352264404,0.430564075708389 + ,0.898606777191162,-0.0843827277421951,0.447213649749756,0.850650787353516,-0.276393175125122,0.240354582667351 + ,0.959251523017883,-0.148547261953354,0.258629858493805,0.960718274116516,-0.100653067231178,-0.240354612469673 + ,0.959251463413239,0.148547306656837,-0.447213709354401,0.850650787353516,0.276393234729767,-0.430564194917679 + ,0.898606836795807,0.0843827798962593,-0.258629828691483,0.960718274116516,0.100653000175953,-0.150604352355003 + ,0.987891137599945,-0.0372766777873039,-9.86070958219898e-08,1,2.72604694373513e-08,0.150604262948036,0.987891137599945 + ,0.0372765362262726,6.29280805242161e-08,1,-4.54877039146595e-07,-0.430564194917679,0.898606836795807,0.0843827798962593 + ,-0.447213709354401,0.850650787353516,0.276393234729767,-0.652360439300537,0.724989235401154,0.220944613218307 + ,-0.593841433525085,0.801898419857025,-0.0656615421175957,-0.829058647155762,0.497233629226685,-0.25577437877655 + ,-0.447213590145111,0.525731205940247,-0.723606824874878,-0.519481301307678,0.705592036247253,-0.481953471899033 + ,-0.665099263191223,0.65680205821991,-0.355322390794754,-0.210894912481308,0.967957735061646,-0.13631334900856 + ,-9.86070958219898e-08,1,2.72604694373513e-08,-0.150604352355003,0.987891137599945,-0.0372766777873039,-0.280385792255402 + ,0.952344059944153,-0.120102882385254,0.973742604255676,0.184282258152962,0.133662268519402,0.679604947566986 + ,0.502025485038757,0.534890174865723,0.829058587551117,0.497233718633652,0.255774438381195,0.930668711662292 + ,0.265826731920242,-0.251380383968353,0.652360498905182,0.724989295005798,-0.220944687724113,0.447213649749756 + ,0.850650906562805,-0.276393234729767,0.489363312721252,0.724989175796509,-0.48467954993248,0.655496060848236 + ,0.637341201305389,-0.40511879324913,0.141994848847389,0.497233659029007,-0.855918407440186,-0.447213590145111 + ,0.525731205940247,-0.723606824874878,0.315919816493988,0.184282541275024,-0.93071722984314,0.641049087047577 + ,0.265826910734177,-0.71999454498291,0.150604128837585,0.98789119720459,0.0372766964137554,-4.20741486095721e-09 + ,1,-1.2174714925095e-07,-0.150604337453842,0.987891137599945,-0.0372766256332397,-2.55733567655625e-07,1,7.50388608139474e-07 + ,-0.430563986301422,0.898606777191162,0.0843827128410339,-0.447213649749756,0.850650787353516,0.276393234729767 + ,-0.240354597568512,0.959251463413239,0.148547291755676,-0.258630096912384,0.960718274116516,0.100652627646923 + ,0.240354388952255,0.959251523017883,-0.14854721724987,0.447213649749756,0.850650906562805,-0.276393234729767 + ,0.4305639564991,0.898606836795807,-0.0843830481171608,0.258629500865936,0.960718333721161,-0.100653499364853 + ,-0.857366561889648,0.33079531788826,0.394331157207489,0.886968970298767,-0.046636912971735,-0.459468364715576 + ,0.164180234074593,-0.263600498437881,0.950557589530945,0.468859255313873,-0.0239074192941189,-0.882949411869049 + ,-0.50430828332901,-0.282553791999817,-0.815988063812256,-0.447213560342789,-0.525731086730957,-0.723606824874878 + ,0.625622451305389,-0.384490519762039,-0.678795754909515,0.999414086341858,-0.0239074490964413,-0.0244936998933554 + ,-0.48936328291893,0.724989175796509,0.484679728746414,-0.447213649749756,0.850650787353516,0.276393234729767 + ,-0.652360379695892,0.724989235401154,0.220944687724113,-0.655496060848236,0.637341022491455,0.405118942260742 + ,0.652360498905182,0.724989235401154,-0.220944434404373,0.447213649749756,0.850650787353516,-0.276393175125122 + ,0.430564075708389,0.898606777191162,-0.0843827277421951,0.593841433525085,0.801898419857025,0.0656615346670151 + ,0.150604262948036,0.987891137599945,0.0372765362262726,-9.86070958219898e-08,1,2.72604694373513e-08,0.210894733667374 + ,0.967957735061646,0.136313393712044,0.280385613441467,0.952344179153442,0.120102785527706,0.519481301307678 + ,0.705592095851898,0.481953412294388,0.447213798761368,0.525731146335602,0.723606765270233,0.760650813579559 + ,0.504577875137329,0.408425837755203,0.665099382400513,0.656801998615265,0.355322420597076,-9.19884115546665e-08 + ,1,-1.12786568973178e-09,-9.86070958219898e-08,1,2.72604694373513e-08,-0.210894912481308,0.967957735061646,-0.13631334900856 + ,-0.117812655866146,0.981552362442017,-0.150583118200302,-0.519481301307678,0.705592036247253,-0.481953471899033 + ,-0.447213590145111,0.525731205940247,-0.723606824874878,-0.198753237724304,0.705591917037964,-0.680174350738525 + ,-0.335070133209229,0.770581781864166,-0.542154729366302,-0.0276073031127453,0.967957675457001,-0.249591156840324 + ,5.02944139668671e-08,1,-1.66202539097105e-15,5.66121123313224e-08,1,-1.54924162387715e-08,-0.0819982066750526 + ,0.981552302837372,-0.172717556357384,-0.198753237724304,0.705591917037964,-0.680174350738525,-0.447213590145111 + ,0.525731205940247,-0.723606824874878,0.141994848847389,0.497233659029007,-0.855918407440186,-0.0203684158623219 + ,0.65680193901062,-0.753787994384766,0.489363312721252,0.724989175796509,-0.48467954993248,0.447213649749756 + ,0.850650906562805,-0.276393234729767,0.268028318881989,0.898606896400452,-0.347370833158493,0.20684452354908 + ,0.80189836025238,-0.560512661933899,0.0340109393000603,0.987891137599945,-0.151375219225883,5.02944139668671e-08 + ,1,-1.66202539097105e-15,-0.0276073031127453,0.967957675457001,-0.249591156840324,0.017968999221921,0.952344119548798 + ,-0.304496169090271,0.268028318881989,0.898606896400452,-0.347370833158493,0.447213649749756,0.850650906562805 + ,-0.276393234729767,0.240354388952255,0.959251523017883,-0.14854721724987,0.205689534544945,0.960718393325806 + ,-0.186311528086662,-0.240354597568512,0.959251463413239,0.148547291755676,-0.447213649749756,0.850650787353516 + ,0.276393234729767,-0.268028140068054,0.898606777191162,0.347371190786362,-0.205689057707787,0.960718393325806 + ,0.186312302947044,-0.0340111777186394,0.987891137599945,0.151375129818916,5.02944139668671e-08,1,-1.66202539097105e-15 + ,0.0340109393000603,0.987891137599945,-0.151375219225883,-6.09921244176803e-07,1,-2.06312506634276e-07,-0.268028140068054 + ,0.898606777191162,0.347371190786362,-0.447213649749756,0.850650787353516,0.276393234729767,-0.48936328291893 + ,0.724989175796509,0.484679728746414,-0.206844240427017,0.80189836025238,0.560512900352478,0.0251339413225651 + ,0.504577815532684,0.863000333309174,0.447213798761368,0.525731146335602,0.723606765270233,0.198753342032433 + ,0.705591976642609,0.680174291133881,0.0203683730214834,0.656801879405975,0.753788113594055,0.0276074111461639 + ,0.96795779466629,0.249591186642647,5.02944139668671e-08,1,-1.66202539097105e-15,-0.0340111777186394,0.987891137599945 + ,0.151375129818916,-0.0179690588265657,0.952344119548798,0.304496049880981,0.198753342032433,0.705591976642609 + ,0.680174291133881,0.447213798761368,0.525731146335602,0.723606765270233,0.519481301307678,0.705592095851898 + ,0.481953412294388,0.335070103406906,0.770581841468811,0.542154669761658,0.210894733667374,0.967957735061646 + ,0.136313393712044,-9.86070958219898e-08,1,2.72604694373513e-08,-9.19884115546665e-08,1,-1.12786568973178e-09 + ,0.117812409996986,0.981552362442017,0.150583282113075,5.66121123313224e-08,1,-1.54924162387715e-08,5.02944139668671e-08 + ,1,-1.66202539097105e-15,0.0276074111461639,0.96795779466629,0.249591186642647,0.0819985121488571,0.981552362442017 + ,0.172717496752739 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: -0.976341426372528,-0.000479729264043272,-0.21623383462429,-1,-1.28784847674979e-07,3.30459180020171e-08,-0.996285498142242 + ,0.00626994157209992,0.0858829841017723,-0.99492359161377,0.0131286727264524,-0.0997741743922234,-0.973072946071625 + ,-0.158071964979172,0.167757228016853,-0.960503339767456,-0.228890910744667,0.158247366547585,-0.989728689193726 + ,-0.0857918038964272,-0.114353895187378,-0.998693227767944,-0.0219797659665346,0.046137984842062,-0.699434697628021 + ,0.0056692105717957,-0.71467399597168,-0.525731086730957,1.50124250808403e-08,-0.85065084695816,-0.751811683177948 + ,0.0303788091987371,-0.658677577972412,-0.851994097232819,0.133997544646263,-0.506113350391388,-0.996285498142242 + ,0.00626994157209992,0.0858829841017723,-1,-1.28784847674979e-07,3.30459180020171e-08,-0.964535474777222,-1.47199997968528e-07 + ,0.263953685760498,-0.962328553199768,0.0329010970890522,0.269891262054443,-0.667440891265869,2.79493654886664e-08 + ,0.744662880897522,-0.447213619947433,1.07012354533254e-07,0.894427239894867,-0.522368609905243,-0.00627000210806727 + ,0.852696716785431,-0.671764731407166,-0.0329011119902134,0.740033566951752,-0.697163224220276,0.0238610804080963 + ,0.716515183448792,-0.679517388343811,0.156088560819626,0.716862916946411,-0.897216737270355,0.111225374042988 + ,0.42735356092453,-0.850650787353516,-3.3779734565087e-08,0.525731146335602,-0.964535474777222,-1.47199997968528e-07 + ,0.263953685760498,-1,-1.28784847674979e-07,3.30459180020171e-08,-0.996285557746887,-0.00627017812803388,0.0858830809593201 + ,-0.962328493595123,-0.0329015031456947,0.269891411066055,-0.89721667766571,-0.111225344240665,0.42735368013382 + ,-0.725002884864807,-0.120904684066772,0.678050935268402,-0.69716340303421,-0.0238611251115799,0.716515064239502 + ,-0.850650787353516,-5.59097586005919e-08,0.525731205940247,-0.522368609905243,0.00627017254009843,0.85269683599472 + ,-0.447213619947433,1.07012354533254e-07,0.894427239894867,-0.667440891265869,2.79493654886664e-08,0.744662880897522 + ,-0.67176479101181,0.032901331782341,0.740033507347107,-0.996285557746887,-0.00627017812803388,0.0858830809593201 + ,-1,-1.28784847674979e-07,3.30459180020171e-08,-0.976341485977173,0.000479800102766603,-0.216233909130096,-0.99492359161377 + ,-0.0131287863478065,-0.0997741967439651,-0.751811802387238,-0.0303789097815752,-0.658677577972412,-0.525731146335602 + ,1.00583235962404e-07,-0.850650727748871,-0.699434876441956,-0.00566919799894094,-0.714673936367035,-0.851994216442108 + ,-0.133997827768326,-0.506113052368164,-0.999546766281128,0.00162500876467675,0.0300608985126019,-0.369990468025208 + ,0.523658454418182,-0.767390966415405,-0.97307288646698,0.158071979880333,0.16775731742382,-0.998693227767944 + ,0.021979970857501,0.0461381450295448,-0.976341485977173,0.000479800102766603,-0.216233909130096,-1,-1.28784847674979e-07 + ,3.30459180020171e-08,-0.976341426372528,-0.000479729264043272,-0.21623383462429,-0.947273731231689,5.37596292815579e-07 + ,-0.320425480604172,-0.751811683177948,0.0303788091987371,-0.658677577972412,-0.525731086730957,1.50124250808403e-08 + ,-0.85065084695816,-0.525731086730957,-8.40113578703949e-09,-0.850650787353516,-0.681448042392731,-0.00396904442459345 + ,-0.731855750083923,-0.525731027126312,3.73383812757311e-09,-0.850650906562805,-0.525731146335602,1.00583235962404e-07 + ,-0.850650727748871,-0.751811802387238,-0.0303789097815752,-0.658677577972412,-0.681447923183441,0.00396904768422246 + ,-0.731855869293213,-0.326427072286606,-0.00566917099058628,-0.945205330848694,-0.525731086730957,1.50124250808403e-08 + ,-0.85065084695816,-0.699434697628021,0.0056692105717957,-0.71467399597168,-0.525731086730957,6.58712622225721e-08 + ,-0.85065084695816,-0.989728689193726,-0.0857918038964272,-0.114353895187378,-0.960503339767456,-0.228890910744667 + ,0.158247366547585,-0.937085151672363,-0.214188128709793,-0.27567183971405,-0.767366230487823,-0.204482778906822 + ,-0.607730090618134,0.172508761286736,0.214188471436501,-0.961438477039337,0.85065084695816,7.12562240323678e-08 + ,-0.525731086730957,0.340338975191116,0.085792139172554,-0.936380863189697,0.200393602252007,-0.204483300447464 + ,0.958138406276703,-0.340338915586472,0.0857918635010719,0.936380863189697,-0.679517388343811,0.156088560819626 + ,0.716862916946411,-0.697163224220276,0.0238610804080963,0.716515183448792,-0.487896323204041,0.0219796784222126 + ,0.872624814510345,-0.522368609905243,-0.00627000210806727,0.852696716785431,-0.447213619947433,1.07012354533254e-07 + ,0.894427239894867,-0.243227422237396,0.000479616137454286,0.969969153404236,-0.355702519416809,-0.0131287705153227 + ,0.934507012367249,0.252918750047684,-0.0303785856813192,0.96701043844223,0.525731146335602,-3.0024846608967e-08 + ,0.850650727748871,0.326427102088928,-0.00566913420334458,0.945205271244049,0.0716582611203194,-0.133997425436974 + ,0.98838746547699,-0.24322734773159,-0.000479720212751999,0.969969213008881,-0.447213619947433,1.07012354533254e-07 + ,0.894427239894867,-0.522368609905243,0.00627017254009843,0.85269683599472,-0.355702459812164,0.0131289828568697 + ,0.934507131576538,-0.69716340303421,-0.0238611251115799,0.716515064239502,-0.725002884864807,-0.120904684066772 + ,0.678050935268402,0.260943502187729,-0.381019413471222,0.886979579925537,-0.487896680831909,-0.0219794660806656 + ,0.872624635696411,0.326427221298218,0.00566914491355419,0.945205390453339,0.525731146335602,1.3511183283299e-08 + ,0.85065084695816,0.252918660640717,0.0303789246827364,0.967010498046875,0.0716584250330925,0.133997485041618 + ,0.98838746547699,-0.776780962944031,0.263600468635559,-0.571949362754822,-0.942349255084991,0.148545563220978 + ,0.299853473901749,-0.779950022697449,0.326754540205002,-0.533769130706787,-0.0310857929289341,0.334522694349289 + ,-0.941874861717224,-0.699434876441956,-0.00566919799894094,-0.714673936367035,-0.525731146335602,1.00583235962404e-07 + ,-0.850650727748871,-0.326426923274994,0.00566928833723068,-0.945205390453339,-0.525730967521667,-7.91186565152202e-08 + ,-0.850650906562805,-0.128613501787186,-0.326754510402679,-0.936317265033722,0.85065084695816,3.10682786164307e-08 + ,-0.525731086730957,0.85065084695816,-1.57892952046268e-08,-0.525731027126312,-0.828536510467529,-0.334523022174835 + ,-0.44902291893959,-0.252918750047684,0.0303789786994457,-0.967010498046875,-0.525731146335602,1.00583235962404e-07 + ,-0.850650727748871,-0.525731027126312,3.73383812757311e-09,-0.850650906562805,-0.349838882684708,-0.00396906631067395 + ,-0.936801493167877,-0.525731086730957,-8.40113578703949e-09,-0.850650787353516,-0.525731086730957,1.50124250808403e-08 + ,-0.85065084695816,-0.252918690443039,-0.0303788986057043,-0.96701043844223,-0.349838823080063,0.00396902998909354 + ,-0.936801493167877,0.243227377533913,0.000479681097203866,-0.969969213008881,0.447213619947433,6.84809364770445e-08 + ,-0.894427239894867,0.243227332830429,-0.000479789159726351,-0.969969213008881,0.13703578710556,-4.59209218206524e-07 + ,-0.990566194057465,-0.252918690443039,-0.0303788986057043,-0.96701043844223,-0.525731086730957,1.50124250808403e-08 + ,-0.85065084695816,-0.326427072286606,-0.00566917099058628,-0.945205330848694,-0.0716581642627716,-0.133997812867165 + ,-0.988387525081635,0.340338975191116,0.085792139172554,-0.936380863189697,0.85065084695816,7.12562240323678e-08 + ,-0.525731086730957,0.697163283824921,0.023861275985837,-0.716515123844147,0.487896412611008,0.0219798665493727 + ,-0.872624754905701,0.522368669509888,-0.00626996019855142,-0.852696716785431,0.447213619947433,6.84809364770445e-08 + ,-0.894427239894867,0.243227377533913,0.000479681097203866,-0.969969213008881,0.355702489614487,-0.0131287276744843 + ,-0.934507012367249,-0.172508776187897,0.214188128709793,0.961438596248627,-0.679517388343811,0.156088560819626 + ,0.716862916946411,-0.340338915586472,0.0857918635010719,0.936380863189697,0.200393676757813,0.204482987523079 + ,0.958138346672058,0.326427102088928,-0.00566913420334458,0.945205271244049,0.525731146335602,-3.0024846608967e-08 + ,0.850650727748871,0.699434757232666,0.00566920125856996,0.71467387676239,0.525731146335602,2.04342009979541e-09 + ,0.850650906562805,0.989728629589081,-0.0857919231057167,0.11435404419899,0.85065084695816,7.12562240323678e-08 + ,-0.525731086730957,0.937085092067719,-0.214188277721405,0.275671929121017,0.767366230487823,-0.20448312163353 + ,0.607730031013489,-0.243227422237396,0.000479616137454286,0.969969153404236,-0.447213619947433,1.07012354533254e-07 + ,0.894427239894867,-0.24322734773159,-0.000479720212751999,0.969969213008881,-0.137035876512527,-7.78354262820358e-07 + ,0.990566194057465,0.252918660640717,0.0303789246827364,0.967010498046875,0.525731146335602,1.3511183283299e-08 + ,0.85065084695816,0.525731086730957,7.46767625514622e-09,0.85065084695816,0.349838644266129,-0.0039686243981123 + ,0.936801552772522,0.525731086730957,4.48060575308773e-08,0.85065084695816,0.525731146335602,-3.0024846608967e-08 + ,0.850650727748871,0.252918750047684,-0.0303785856813192,0.96701043844223,0.34983891248703,0.00396962184458971 + ,0.936801493167877,0.260943502187729,-0.381019413471222,0.886979579925537,-0.369990468025208,0.523658454418182 + ,-0.767390966415405,0.975181221961975,-0.101741202175617,-0.196647226810455,0.828536570072174,-0.334522813558578 + ,0.44902303814888,0.85065084695816,-1.57892952046268e-08,-0.525731027126312,0.85065084695816,3.10682786164307e-08 + ,-0.525731086730957,0.779950022697449,0.326754450798035,0.533769190311432,0.0310858022421598,0.334522992372513 + ,0.941874742507935,0.699434816837311,-0.00566929578781128,0.714673817157745,0.525731146335602,1.3511183283299e-08 + ,0.85065084695816,0.326427221298218,0.00566914491355419,0.945205390453339,0.525731265544891,-2.97201374621636e-08 + ,0.85065084695816,-0.326426923274994,0.00566928833723068,-0.945205390453339,-0.525731146335602,1.00583235962404e-07 + ,-0.850650727748871,-0.252918750047684,0.0303789786994457,-0.967010498046875,-0.0716582089662552,0.133997842669487 + ,-0.988387525081635,0.243227332830429,-0.000479789159726351,-0.969969213008881,0.447213619947433,6.84809364770445e-08 + ,-0.894427239894867,0.522368669509888,0.00627008872106671,-0.852696657180786,0.355702430009842,0.013128723949194 + ,-0.934507071971893,0.697163283824921,-0.0238613057881594,-0.716515183448792,0.850650727748871,-9.28839298808271e-08 + ,-0.525731265544891,0.473897993564606,-0.0016250868793577,-0.880578219890594,0.487896293401718,-0.0219797883182764 + ,-0.872624814510345,0.667441010475159,6.05569567824205e-08,-0.744662821292877,0.447213619947433,6.84809364770445e-08 + ,-0.894427239894867,0.522368669509888,-0.00626996019855142,-0.852696716785431,0.67176479101181,-0.0329011082649231 + ,-0.740033507347107,0.697163283824921,0.023861275985837,-0.716515123844147,0.85065084695816,7.12562240323678e-08 + ,-0.525731086730957,0.952651500701904,-0.0238612722605467,-0.303126513957977,0.85065084695816,-8.85299922259719e-09 + ,-0.525731265544891,0.996285557746887,0.00627003377303481,-0.0858829692006111,1,-5.02944139668671e-08,-3.30459286601581e-08 + ,0.964535415172577,-5.86936685920136e-08,-0.26395383477211,0.962328612804413,0.0329011902213097,-0.269891411066055 + ,0.952651500701904,-0.0238612722605467,-0.303126513957977,0.85065084695816,7.12562240323678e-08,-0.525731086730957 + ,0.989728629589081,-0.0857919231057167,0.11435404419899,0.998693227767944,-0.021979795768857,-0.0461378693580627 + ,0.699434757232666,0.00566920125856996,0.71467387676239,0.525731146335602,-3.0024846608967e-08,0.850650727748871 + ,0.751811802387238,0.03037871979177,0.658677637577057,0.851994156837463,0.133997723460197,0.506113231182098,0.976341485977173 + ,-0.000479626382002607,0.216234028339386,1,-5.02944139668671e-08,-3.30459286601581e-08,0.996285557746887,0.00627003377303481 + ,-0.0858829692006111,0.99492347240448,0.0131287761032581,0.0997743010520935,0.751811802387238,0.03037871979177 + ,0.658677637577057,0.525731146335602,-3.0024846608967e-08,0.850650727748871,0.525731086730957,4.48060575308773e-08 + ,0.85065084695816,0.681447923183441,-0.0039694719016552,0.731855809688568,0.525731086730957,7.46767625514622e-09 + ,0.85065084695816,0.525731146335602,1.3511183283299e-08,0.85065084695816,0.751811921596527,-0.0303790625184774 + ,0.658677458763123,0.68144816160202,0.00396861648187041,0.731855630874634,0.976341485977173,0.000479893933515996 + ,0.216233938932419,1,-5.02944139668671e-08,-3.30459286601581e-08,0.976341485977173,-0.000479626382002607,0.216234028339386 + ,0.947273671627045,6.43870123440138e-07,0.320425659418106,0.751811921596527,-0.0303790625184774,0.658677458763123 + ,0.525731146335602,1.3511183283299e-08,0.85065084695816,0.699434816837311,-0.00566929578781128,0.714673817157745 + ,0.851994216442108,-0.133998021483421,0.506112992763519,0.999546766281128,0.00162496417760849,-0.0300607904791832 + ,0.850650727748871,-9.28839298808271e-08,-0.525731265544891,0.95265144109726,0.0238612629473209,-0.303126633167267 + ,0.998693227767944,0.0219799671322107,-0.0461379550397396,0.996285557746887,-0.00627009244635701,-0.085883155465126 + ,1,-5.02944139668671e-08,-3.30459286601581e-08,0.976341485977173,0.000479893933515996,0.216233938932419,0.99492359161377 + ,-0.0131286503747106,0.0997741371393204,0.95265144109726,0.0238612629473209,-0.303126633167267,0.850650727748871 + ,-9.28839298808271e-08,-0.525731265544891,0.697163283824921,-0.0238613057881594,-0.716515183448792,0.85065084695816 + ,1.25598136335725e-08,-0.525731265544891,0.522368669509888,0.00627008872106671,-0.852696657180786,0.447213619947433 + ,6.84809364770445e-08,-0.894427239894867,0.667441010475159,6.05569567824205e-08,-0.744662821292877,0.67176479101181 + ,0.0329013913869858,-0.740033507347107,0.964535415172577,-5.86936685920136e-08,-0.26395383477211,1,-5.02944139668671e-08 + ,-3.30459286601581e-08,0.996285557746887,-0.00627009244635701,-0.085883155465126,0.962328553199768,-0.0329014584422112 + ,-0.269891619682312 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 1,0.5,0.838104069232941,0.676208138465881,0.0881041139364243,0.823791801929474,0.176208198070526,0.5,0.0881041139364243 + ,0.176208227872849,0.838104128837585,0.323791772127151,0.676208198070526,0.5,0.588104069232941,0.823791861534119 + ,0.338104099035263,0.676208138465881,0.338104099035263,0.323791772127151,0.588104128837585,0.176208227872849 + ,0.5,0.5,0.0300342254340649,0.666666686534882,0.926208198070526,0.800000011920929,0.926208198070526,0.599999964237213 + ,0.963104069232941,0.695913255214691,0.0881040766835213,0.5,0.146173998713493,0.666666686534882,0.0881040766835213 + ,0.616139769554138,0.0300342254340649,0.333333313465118,0.146173998713493,0.333333313465118,0.0881040766835213 + ,0.383860260248184,0.926208198070526,0.399999976158142,0.926208198070526,0.19999997317791,0.963104128837585,0.304086744785309 + ,0.838104069232941,0.5,0.89617395401001,0.5,0.25,1,0.75,0.800000011920929,0.838104128837585,0.883860290050507 + ,0.25,0.599999964237213,0.25,0.800000011920929,0.213104113936424,0.695913255214691,0.25,0.19999997317791,0.25 + ,0.39999994635582,0.213104113936424,0.304086685180664,0.75,0.200000047683716,0.75,1,0.838104069232941,0.116139747202396 + ,0.75,0.599999964237213,0.75,0.399999976158142,0.780034184455872,0.5,0.64617395401001,0.666666686534882,0.713104128837585 + ,0.695913255214691,0.426208168268204,0.800000011920929,0.338104069232941,0.883860290050507,0.338104069232941 + ,0.499999940395355,0.280034214258194,0.5,0.426208198070526,0.19999997317791,0.338104099035263,0.116139747202396 + ,0.646174013614655,0.333333313465118,0.713104128837585,0.304086744785309,0.530034184455872,0.666666686534882 + ,0.588104069232941,0.5,0.588104069232941,0.616139769554138,0.426208198070526,0.599999964237213,0.463104099035263 + ,0.695913255214691,0.426208198070526,0.399999976158142,0.396173983812332,0.5,0.530034244060516,0.333333313465118 + ,0.463104099035263,0.304086744785309,0.588104128837585,0.383860260248184,1.03003418445587,0.666666686534882,1.08810412883759 + ,0.823791801929474,1.08810412883759,0.5,1.08810412883759,0.616139769554138,1.03003418445587,0.333333313465118 + ,1.08810412883759,0.383860260248184,1.08810412883759,0.176208227872849,1.25,1 + UVIndex: 14,0,62,15,62,63,13,15,13,1,14,15,62,0,64,65,16,3,17,18,17,2,12,18,64,0,66,67,19,4,20,21,20,3,16,21,66,0,22,24 + ,22,5,23,24,23,68,66,24,22,0,14,26,14,1,25,26,25,5,22,26,28,1,13,29,13,63,69,29,69,7,28,29,31,2,17,32,17,3,30 + ,32,30,8,31,32,34,3,20,35,20,4,33,35,33,9,34,35,37,68,23,38,23,5,36,38,36,10,37,38,40,5,25,41,25,1,39,41,39,6 + ,40,41,39,1,28,43,28,7,42,43,42,6,39,43,27,2,31,45,31,8,44,45,44,7,27,45,30,3,34,47,34,9,46,47,46,8,30,47,33 + ,68,37,49,37,10,48,49,48,9,33,49,36,5,40,51,40,6,50,51,50,10,36,51,53,6,42,54,42,7,52,54,52,11,53,54,52,7,44 + ,56,44,8,55,56,55,11,52,56,55,8,46,58,46,9,57,58,57,11,55,58,57,9,48,60,48,10,59,60,59,11,57,60,59,10,50,61,50 + ,6,53,61,53,11,59,61 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 1,1,0,0,1,1,0,1,1,1,0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,0,1,1,1,0,0,1,0,1,1,1,0,0,1,0,1 + ,1,1,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,1,0,0,1,0,1,0,0 + ,1,0,1,0,0,1,0,1,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pPlatonic1_ncl1_3" + } + Model: "Model::LOD_1", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::LOD_1_ncl1_2" + } + Model: "Model::pPlatonic1_ncl1_1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.276393264532089,0.850650906562805,-0.447213649749756,-0.276393294334412,-0.850650787353516,-0.447213590145111,0.187592402100563 + ,-0.577350199222565,-0.794654488563538,0.688190996646881,-0.499999970197678,0.525731086730957,-0.42532542347908,0.309016942977905 + ,0.85065084695816,-0.425325393676758,-0.309017032384872,0.85065084695816,-0.303530961275101,-0.934172332286835,0.187592476606369 + ,-0.16245986521244,0.499999970197678,-0.85065084695816,0.303530991077423,0.934172332286835,-0.187592476606369,0.187592461705208 + ,0.577350199222565,-0.794654488563538,-0.491123467683792,0.356822043657303,-0.794654488563538,-0.162459895014763,-0.499999970197678 + ,-0.85065084695816,-0.794654488563538,-0.577350318431854,-0.187592461705208,-0.491123467683792,-0.356822073459625 + ,-0.794654488563538,0.85065084695816,-3.50347306721233e-08,-0.525731086730957,0.607061982154846,-2.50023290959689e-08 + ,-0.794654488563538,-3.50347306721233e-08,0.999999940395355,0,0.794654488563538,0.577350258827209,0.187592476606369 + ,-0.794654488563538,0.57735013961792,-0.187592461705208,-0.303531020879745,0.934172332286835,0.187592476606369,-0.587785243988037 + ,-0.80901700258255,0,-0.982246994972229,-1.00009337700158e-07,0.18759249150753,0.303531020879745,-0.934172332286835 + ,-0.187592476606369,0.982246935367584,-2.50023290959689e-08,-0.187592461705208,0.95105654001236,-0.309017032384872 + ,0,0.49112343788147,0.356822103261948,0.794654488563538,-0.607061982154846,-7.50069872879067e-08,0.794654428958893 + ,0.794654488563538,-0.577350258827209,0.187592476606369,0.491123467683792,-0.356822043657303,0.794654428958893,-0.187592476606369 + ,0.577350199222565,0.794654428958893,-0.187592417001724,-0.577350258827209,0.794654488563538 + PolygonVertexIndex: 9,13,-8,7,0,8,-10,7,13,-11,13,12,-11,10,0,-8,11,1,12,-14,11,13,15,-3,2,1,-12,15,13,-10,9,14,-16,14,2,-16,17,9,-9,8 + ,0,-17,16,17,-9,19,0,10,-19,10,12,-19,18,4,-20,12,1,-21,20,5,21,-13,22,1,-3,2,27,-23,27,6,-23,24,2,14,-24,14,9,-24 + ,23,3,-25,23,9,-18,17,16,-26,25,3,23,-18,16,0,-20,18,12,-22,21,5,-27,26,4,18,-22,20,1,22,-7,6,5,-21,27,2,-25,24,3 + ,-28,3,6,-28,28,3,-26,25,16,-30,29,28,-26,29,16,-20,19,4,-30,5,29,4,-27,5,6,-31,30,29,-6,30,6,3,-29,28,29,-31 + Edges: 0,1,2,3,4,5,8,9,10,11,13,19,16,17,21,23,22,24,29,30,31,33,36,38,40,41,42,45,47,48,50,52,53,60,56,57,58,59,62,64,65 + ,66,68,69,71,73,74,76,78,79,83,85,86,87,93,96,98,99,100,107,108,113,115,117,120,122,124,125,126,131,133,135,141,140 + ,142,148 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0.0325006432831287,-0.0236130561679602,-0.999192714691162,0.00811633840203285,0.0173364412039518,-0.999816834926605 + ,0.102388381958008,-0.103928864002228,-0.989300429821014,-0.0623470805585384,0.789747297763824,-0.610255718231201 + ,-0.336650013923645,0.830830097198486,-0.443157136440277,0.0411564633250237,0.858988285064697,-0.510338306427002 + ,0.0528976619243622,0.817988634109497,-0.572797000408173,0.102388381958008,-0.103928864002228,-0.989300429821014 + ,0.00811633840203285,0.0173364412039518,-0.999816834926605,-0.167955473065376,0,-0.98579466342926,-0.894427239894867 + ,0,-0.447213619947433,-0.894427180290222,0,-0.447213590145111,-0.894427120685577,0,-0.447213560342789,-0.534306526184082 + ,0.738019645214081,-0.412120759487152,-0.336650013923645,0.830830097198486,-0.443157136440277,-0.0623470805585384 + ,0.789747297763824,-0.610255718231201,-0.413761883974075,-0.675565898418427,-0.610255599021912,-0.284589648246765 + ,-0.861538767814636,-0.420427888631821,-0.538196861743927,-0.670745074748993,-0.510338246822357,-0.52359664440155 + ,-0.630674242973328,-0.572796940803528,0.024183539673686,0.07442956417799,-0.996932923793793,0.00811633840203285 + ,0.0173364412039518,-0.999816834926605,0.00594588881358504,0.0182994566857815,-0.999814808368683,0.0241835433989763 + ,0.0744295790791512,-0.996932983398438,0.0513957440853119,-0.817143797874451,-0.574138045310974,-0.284589648246765 + ,-0.861538767814636,-0.420427888631821,-0.413761883974075,-0.675565898418427,-0.610255599021912,0.00594588881358504 + ,0.0182994566857815,-0.999814808368683,0.00811633840203285,0.0173364412039518,-0.999816834926605,0.0325006432831287 + ,-0.0236130561679602,-0.999192714691162,0.717004597187042,0.534124076366425,-0.447901546955109,0.691821157932281 + ,0.631100654602051,-0.350849777460098,0.652560770511627,0.474113285541534,-0.591084659099579,0.716449022293091 + ,-0.520530819892883,-0.464487254619598,0.707422971725464,-0.540506839752197,-0.455417543649673,0.652560770511627 + ,-0.4741131067276,-0.591084718704224,0.723606824874878,0.525731086730957,-0.447213590145111,0.717004597187042 + ,0.534124076366425,-0.447901546955109,0.723606824874878,0.525731205940247,-0.447213411331177,0.0411564633250237 + ,0.858988285064697,-0.510338306427002,-0.336650013923645,0.830830097198486,-0.443157136440277,-0.143664553761482 + ,0.961938381195068,-0.232454478740692,0.284963876008987,0.840356886386871,0.461081326007843,0.333379805088043 + ,0.827407240867615,0.451946020126343,0.385134845972061,0.865853071212769,0.319326996803284,-0.512093603610992 + ,0.806383907794952,-0.295812577009201,-0.336650013923645,0.830830097198486,-0.443157136440277,-0.534306526184082 + ,0.738019645214081,-0.412120759487152,-0.565332055091858,0.753742456436157,-0.335070043802261,-0.894427120685577 + ,0,-0.447213560342789,-0.894427180290222,0,-0.447213590145111,-0.894427180290222,0,-0.447213590145111,-0.749699234962463 + ,0.514261186122894,0.416517168283463,-0.744403183460236,0.51266884803772,0.427825421094894,-0.710078299045563 + ,0.572745740413666,0.40957435965538,-0.538196861743927,-0.670745074748993,-0.510338246822357,-0.284589648246765 + ,-0.861538767814636,-0.420427888631821,-0.273777425289154,-0.943360567092896,-0.187394797801971,-0.754426777362823 + ,-0.50557142496109,0.418614089488983,-0.750925779342651,-0.498751223087311,0.432848304510117,-0.783816695213318 + ,-0.469709455966949,0.406207531690598,-0.783179938793182,-0.474925845861435,0.401340901851654,-0.0574269965291023 + ,-0.953134477138519,-0.297046929597855,-0.284589648246765,-0.861538767814636,-0.420427888631821,0.0513957440853119 + ,-0.817143797874451,-0.574138045310974,0.707422971725464,-0.540506839752197,-0.455417543649673,0.674052715301514 + ,-0.610006272792816,-0.416587620973587,0.723606884479523,-0.525731086730957,-0.447213530540466,0.289082288742065 + ,-0.889703810214996,0.353353470563889,0.24627511203289,-0.849176943302155,0.467169106006622,0.2763931453228,-0.850650727748871 + ,0.447213798761368,0.695665538311005,-0.575496852397919,-0.429945051670074,0.707422971725464,-0.540506839752197 + ,-0.455417543649673,0.716449022293091,-0.520530819892883,-0.464487254619598,0.723606705665588,-0.525731205940247 + ,-0.447213649749756,0.691821157932281,0.631100654602051,-0.350849777460098,0.717004597187042,0.534124076366425 + ,-0.447901546955109,0.720902025699615,0.55295330286026,-0.417783260345459,0.898609697818756,0.0528750568628311 + ,0.435551166534424,0.893508017063141,0.03592574223876,0.447607845067978,0.862870156764984,0.145106434822083,0.484147876501083 + ,0.720902025699615,0.55295330286026,-0.417783260345459,0.717004597187042,0.534124076366425,-0.447901546955109 + ,0.723606824874878,0.525731086730957,-0.447213590145111,0.333379805088043,0.827407240867615,0.451946020126343 + ,0.284963876008987,0.840356886386871,0.461081326007843,0.298135846853256,0.823657214641571,0.482394009828568 + ,0.896839439868927,0.0449925288558006,0.440062195062637,0.893508017063141,0.03592574223876,0.447607845067978 + ,0.898609697818756,0.0528750568628311,0.435551166534424,0.900159418582916,0.0469553284347057,0.433022171258926 + ,-0.143664553761482,0.961938381195068,-0.232454478740692,-0.336650013923645,0.830830097198486,-0.443157136440277 + ,-0.512093603610992,0.806383907794952,-0.295812577009201,-0.894427180290222,0,-0.447213590145111,-0.894427180290222 + ,0,-0.447213590145111,-0.894427239894867,0,-0.447213619947433,-0.783816695213318,-0.469709455966949,0.406207531690598 + ,-0.750925779342651,-0.498751223087311,0.432848304510117,-0.788439750671387,-0.375391125679016,0.487282663583755 + ,-0.770384013652802,0.474398642778397,0.425974816083908,-0.744403183460236,0.51266884803772,0.427825421094894 + ,-0.749699234962463,0.514261186122894,0.416517168283463,-0.770383954048157,0.474398612976074,0.425974786281586 + ,-0.273777425289154,-0.943360567092896,-0.187394797801971,-0.284589648246765,-0.861538767814636,-0.420427888631821 + ,-0.0574269965291023,-0.953134477138519,-0.297046929597855,-0.165699675679207,-0.976808786392212,-0.135602325201035 + ,-0.600659608840942,-0.633848428726196,0.487282544374466,-0.750925779342651,-0.498751223087311,0.432848304510117 + ,-0.754426777362823,-0.50557142496109,0.418614089488983,0.674052715301514,-0.610006272792816,-0.416587620973587 + ,0.707422971725464,-0.540506839752197,-0.455417543649673,0.695665538311005,-0.575496852397919,-0.429945051670074 + ,0.862870156764984,0.145106434822083,0.484147876501083,0.893508017063141,0.03592574223876,0.447607845067978,0.89546537399292 + ,-0.280045956373215,0.346000075340271,0.249634474515915,-0.863385856151581,0.438460409641266,0.24627511203289 + ,-0.849176943302155,0.467169106006622,0.289082288742065,-0.889703810214996,0.353353470563889,0.806609392166138 + ,1.20809886539064e-07,0.591084718704224,0.893508017063141,0.03592574223876,0.447607845067978,0.896839439868927 + ,0.0449925288558006,0.440062195062637,0.298135846853256,0.823657214641571,0.482394009828568,0.284963876008987 + ,0.840356886386871,0.461081326007843,0.255140691995621,0.82740730047226,0.500300347805023,0.0175177343189716 + ,6.05563910127671e-09,0.999846577644348,8.71502621180298e-08,1.97167562276945e-08,1,-1.23058143230992e-07,-8.3521520366503e-08 + ,1,0.255140691995621,0.82740730047226,0.500300347805023,0.284963876008987,0.840356886386871,0.461081326007843 + ,0.113377176225185,0.865852892398834,0.487282603979111,-0.710078299045563,0.572745740413666,0.40957435965538 + ,-0.744403183460236,0.51266884803772,0.427825421094894,-0.600659310817719,0.633848547935486,0.487282633781433 + ,0.171710252761841,5.93580580243724e-08,0.985147476196289,0.0175177343189716,6.05563910127671e-09,0.999846577644348 + ,2.29915002591952e-07,0,1,2.29915016802806e-07,0,1,-0.750925779342651,-0.498751223087311,0.432848304510117,-0.600659608840942 + ,-0.633848428726196,0.487282544374466,-0.600659430027008,-0.633848547935486,0.487282484769821,0.0401729457080364 + ,5.66608342467134e-08,0.999192774295807,0.0175177343189716,6.05563910127671e-09,0.999846577644348,0.171710252761841 + ,5.93580580243724e-08,0.985147476196289,0.226979091763496,-0.83661687374115,0.498550593852997,0.24627511203289 + ,-0.849176943302155,0.467169106006622,0.249634474515915,-0.863385856151581,0.438460409641266,0.226979076862335 + ,-0.83661687374115,0.498550564050674,8.71502621180298e-08,1.97167562276945e-08,1,0.0175177343189716,6.05563910127671e-09 + ,0.999846577644348,0.0401729457080364,5.66608342467134e-08,0.999192774295807 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0.0145729659125209,0.999625861644745,-0.0231492761522532,0.011817641556263,0.999778270721436,0.0174317080527544 + ,0.0368640907108784,0.994240522384644,-0.100632563233376,0.0207275412976742,0.612338006496429,0.790324330329895 + ,-0.0928682535886765,0.439037978649139,0.893656134605408,-0.146745637059212,0.510428905487061,0.847306430339813 + ,-0.0213487129658461,0.574395358562469,0.818299651145935,0.0368640907108784,0.994240522384644,-0.100632563233376 + ,0.011817641556263,0.999778270721436,0.0174317080527544,0.0356311649084091,0.999346554279327,-0.00607068464159966 + ,0.0161750093102455,0.999345779418945,-0.032350018620491,0.00219467235729098,0.999987959861755,-0.00438934471458197 + ,0.00329249701462686,0.999972939491272,-0.00658499402925372,0.461550444364548,0.663174569606781,0.589211940765381 + ,0.704845309257507,0.53441309928894,0.466471701860428,0.324647963047028,0.59424090385437,0.735854268074036,-0.260393440723419 + ,0.730142772197723,-0.631733179092407,-0.630541145801544,0.498569548130035,-0.59484988451004,-0.578734457492828 + ,0.734302043914795,-0.354777246713638,-0.388653844594955,0.775106310844421,-0.498155057430267,-0.0205521285533905 + ,0.997050940990448,0.0739398151636124,0.011817641556263,0.999778270721436,0.0174317080527544,-0.0161218643188477 + ,0.999704360961914,0.0182015597820282,-0.0313438586890697,0.996790826320648,0.0736586302518845,0.0213093068450689 + ,0.575664341449738,-0.817408502101898,0.0274516828358173,0.431058973073959,-0.901906073093414,-0.0159310530871153 + ,0.675597190856934,-0.737098932266235,-0.0161218643188477,0.999704360961914,0.0182015597820282,0.011817641556263 + ,0.999778270721436,0.0174317080527544,0.0145729659125209,0.999625861644745,-0.0231492761522532,-0.454373180866241 + ,0.84540331363678,0.280781805515289,-0.537473618984222,0.774557113647461,0.333441615104675,-0.351391702890396 + ,0.880463838577271,0.318288087844849,0.442815363407135,0.853789746761322,-0.273784160614014,0.446168720722198 + ,0.841241896152496,-0.305361539125443,0.351391613483429,0.880464017391205,-0.318287938833237,-0.447213590145111 + ,0.85065084695816,0.2763931453228,-0.454373180866241,0.84540331363678,0.280781805515289,-0.447213768959045,0.85065084695816 + ,0.276393234729767,-0.146745637059212,0.510428905487061,0.847306430339813,-0.0928682535886765,0.439037978649139 + ,0.893656134605408,-0.223839089274406,0.197218090295792,0.954463839530945,-0.70416659116745,0.509893953800201 + ,-0.494123011827469,-0.862285077571869,0.461424350738525,-0.208691775798798,-0.922860383987427,0.361383467912674 + ,0.133157223463058,0.779557466506958,0.580935478210449,0.234103202819824,0.704845309257507,0.53441309928894,0.466471701860428 + ,0.461550444364548,0.663174569606781,0.589211940765381,0.655759155750275,0.657100319862366,0.371751368045807 + ,0.00329249701462686,0.999972939491272,-0.00658499402925372,0.00219467235729098,0.999987959861755,-0.00438934471458197 + ,-0.00479670288041234,0.999942481517792,0.00959340576082468,0.465772569179535,0.85713917016983,-0.219928652048111 + ,0.406362384557724,0.856228351593018,-0.318971574306488,0.418003141880035,0.81097823381424,-0.409374743700027 + ,-0.578734457492828,0.734302043914795,-0.354777246713638,-0.630541145801544,0.498569548130035,-0.59484988451004 + ,-0.834196150302887,0.329882204532623,-0.441921472549438,-0.489120095968246,0.858312904834747,0.155114650726318 + ,-0.389130860567093,0.863749980926514,0.320176810026169,-0.440858334302902,0.881577730178833,0.168714940547943 + ,-0.525660574436188,0.850473880767822,-0.0193720329552889,0.0986683890223503,0.290662705898285,-0.951724648475647 + ,0.0274516828358173,0.431058973073959,-0.901906073093414,0.0213093068450689,0.575664341449738,-0.817408502101898 + ,0.446168720722198,0.841241896152496,-0.305361539125443,0.518902361392975,0.792396545410156,-0.320699274539948 + ,0.447213560342789,0.85065084695816,-0.276393175125122,0.594434797763824,0.456159114837646,0.66224330663681,0.493860065937042 + ,0.524694681167603,0.693395912647247,0.447213590145111,0.525731325149536,0.723606765270233,0.507227003574371 + ,0.817326307296753,-0.273310124874115,0.446168720722198,0.841241896152496,-0.305361539125443,0.442815363407135 + ,0.853789746761322,-0.273784160614014,0.495876789093018,0.846677899360657,-0.192984342575073,-0.537473618984222 + ,0.774557113647461,0.333441615104675,-0.454373180866241,0.84540331363678,0.280781805515289,-0.495672345161438 + ,0.832701981067657,0.246812462806702,-0.0416320450603962,0.998508453369141,-0.0353235900402069,-0.0313142985105515 + ,0.999352931976318,-0.017700582742691,-0.125192686915398,0.989412307739258,-0.0734177455306053,-0.495672345161438 + ,0.832701981067657,0.246812462806702,-0.454373180866241,0.84540331363678,0.280781805515289,-0.447213590145111 + ,0.85065084695816,0.2763931453228,-0.862285077571869,0.461424350738525,-0.208691775798798,-0.70416659116745,0.509893953800201 + ,-0.494123011827469,-0.433022141456604,0.567088067531586,-0.700644671916962,-0.0403962731361389,0.998987376689911 + ,-0.0198108274489641,-0.0313142985105515,0.999352931976318,-0.017700582742691,-0.0416320450603962,0.998508453369141 + ,-0.0353235900402069,-0.0380556844174862,0.998848915100098,-0.0292019583284855,0.953802287578583,0.197217807173729 + ,0.226641416549683,0.704845309257507,0.53441309928894,0.466471701860428,0.779557466506958,0.580935478210449,0.234103202819824 + ,-0.00479670288041234,0.999942481517792,0.00959340576082468,0.00219467235729098,0.999987959861755,-0.00438934471458197 + ,-1.04939040568297e-07,1,2.09878081136594e-07,-0.440858334302902,0.881577730178833,0.168714940547943,-0.389130860567093 + ,0.863749980926514,0.320176810026169,-0.319326728582382,0.926866471767426,0.197354778647423,0.403915226459503 + ,0.880077123641968,-0.249633446335793,0.406362384557724,0.856228351593018,-0.318971574306488,0.465772569179535 + ,0.85713917016983,-0.219928652048111,0.407575100660324,0.880203485488892,-0.243155255913734,-0.856410622596741 + ,0.327782660722733,-0.398897588253021,-0.651732623577118,0.495500385761261,-0.574216067790985,-0.50400310754776 + ,0.284517496824265,-0.815494179725647,-0.730543732643127,0.21394856274128,-0.648484289646149,-0.455344080924988 + ,0.772187352180481,0.443157464265823,-0.389130860567093,0.863749980926514,0.320176810026169,-0.489120095968246 + ,0.858312904834747,0.155114650726318,0.518902361392975,0.792396545410156,-0.320699274539948,0.446168720722198 + ,0.841241896152496,-0.305361539125443,0.507227003574371,0.817326307296753,-0.273310124874115,-0.125192686915398 + ,0.989412307739258,-0.0734177455306053,-0.0313142985105515,0.999352931976318,-0.017700582742691,0.257251739501953 + ,0.959928750991821,0.111168012022972,0.465341448783875,0.504046738147736,0.727594912052155,0.493860065937042 + ,0.524694681167603,0.693395912647247,0.594434797763824,0.456159114837646,0.66224330663681,-0.0213648024946451 + ,0.999346613883972,0.0291547551751137,-0.0313142985105515,0.999352931976318,-0.017700582742691,-0.0403962731361389 + ,0.998987376689911,-0.0198108274489641,-0.433022141456604,0.567088067531586,-0.700644671916962,-0.70416659116745 + ,0.509893953800201,-0.494123011827469,-0.153757318854332,0.54556006193161,-0.823846399784088,0.0105554284527898 + ,0.99994432926178,-0.0001849416148616,-0.00736215990036726,0.999972999095917,-1.90746085593219e-08,-0.0361682511866093 + ,0.999345719814301,7.90160754604585e-08,0.525196671485901,0.315849006175995,-0.790194928646088,0.517283797264099 + ,0.270144701004028,-0.812058746814728,0.531815111637115,0.361383616924286,-0.765881538391113,0.418003141880035 + ,0.81097823381424,-0.409374743700027,0.406362384557724,0.856228351593018,-0.318971574306488,0.297118812799454 + ,0.742801070213318,-0.599972486495972,0.0183315668255091,0.999826848506927,-0.00319523457437754,0.0105554284527898 + ,0.99994432926178,-0.0001849416148616,0.0586997978389263,0.998275756835938,-1.34959643460775e-08,-6.7348997845329e-07 + ,1,1.54845456118782e-13,-0.389130860567093,0.863749980926514,0.320176810026169,-0.455344080924988,0.772187352180481 + ,0.443157464265823,-0.297118663787842,0.742800951004028,0.599972665309906,-0.0190730318427086,0.999817848205566 + ,0.000766782206483185,0.0105554284527898,0.99994432926178,-0.0001849416148616,0.0183315668255091,0.999826848506927 + ,-0.00319523457437754,0.323510617017746,0.547613024711609,0.771661162376404,0.493860065937042,0.524694681167603 + ,0.693395912647247,0.465341448783875,0.504046738147736,0.727594912052155,0.332394987344742,0.54772162437439,0.767798662185669 + ,-0.00736215990036726,0.999972999095917,-1.90746085593219e-08,0.0105554284527898,0.99994432926178,-0.0001849416148616 + ,-0.0190730318427086,0.999817848205566,0.000766782206483185 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: -0.999365508556366,0.0138088362291455,-0.0328326001763344,-0.999897241592407,0.0119569571688771,-0.00790966488420963 + ,-0.994061172008514,0.0261660553514957,-0.105629906058311,-0.997839272022247,-0.0366253145039082,0.0545470044016838 + ,-0.937039077281952,-0.34200456738472,0.070644423365593,-0.988317668437958,-0.0400177836418152,-0.147060230374336 + ,-0.998371779918671,0.0310576613992453,-0.0478471778333187,-0.994061172008514,0.0261660553514957,-0.105629906058311 + ,-0.999897241592407,0.0119569571688771,-0.00790966488420963,-0.985150456428528,0.0361446142196655,0.167845711112022 + ,-0.446920990943909,0.0361684188246727,0.893841981887817,-0.447208195924759,0.00490743666887283,0.894416391849518 + ,-0.447201460599899,0.0073622465133667,0.894402921199799,-0.708157896995544,-0.124605275690556,0.694971740245819 + ,-0.624387621879578,0.155319526791573,0.765516757965088,-0.943777799606323,0.152239888906479,0.293439000844955 + ,-0.872351050376892,0.102480553090572,0.478018164634705,-0.722098767757416,-0.0958089679479599,0.685123383998871 + ,-0.612707495689392,-0.104410335421562,0.783382296562195,-0.75815212726593,0.0382125787436962,0.650957047939301 + ,-0.999496221542358,-0.0187009666115046,-0.0256419070065022,-0.999897241592407,0.0119569571688771,-0.00790966488420963 + ,-0.999852359294891,-0.0160106550902128,-0.00623915437608957,-0.999216079711914,-0.0294664017856121,-0.0264388471841812 + ,-0.998450934886932,-0.0297768265008926,-0.0469994582235813,-0.958256244659424,0.268214553594589,0.0990242138504982 + ,-0.910245835781097,0.295261442661285,0.290298849344254,-0.999852359294891,-0.0160106550902128,-0.00623915437608957 + ,-0.999897241592407,0.0119569571688771,-0.00790966488420963,-0.999365508556366,0.0138088362291455,-0.0328326001763344 + ,-0.528629779815674,-0.00219258526340127,-0.848849654197693,-0.482188403606415,0.0421094819903374,-0.875054955482483 + ,-0.671333253383636,7.37111562898463e-08,-0.741155624389648,-0.539087533950806,0.00952969118952751,-0.842195808887482 + ,-0.548166275024414,-0.0128267062827945,-0.836271047592163,-0.671333253383636,-9.89801485218322e-09,-0.741155624389648 + ,-0.525731086730957,-2.18471605251125e-08,-0.85065084695816,-0.528629779815674,-0.00219258526340127,-0.848849654197693 + ,-0.525730967521667,5.81208858818627e-08,-0.850650906562805,-0.988317668437958,-0.0400177836418152,-0.147060230374336 + ,-0.937039077281952,-0.34200456738472,0.070644423365593,-0.963979542255402,-0.189155012369156,-0.186986148357391 + ,0.650342285633087,0.183870866894722,-0.7370525598526,0.381211906671524,0.320132613182068,-0.867290318012238 + ,0.000104911348898895,0.345977663993835,-0.938242733478546,-0.360625058412552,0.110720112919807,0.926115870475769 + ,-0.624387621879578,0.155319526791573,0.765516757965088,-0.708157896995544,-0.124605275690556,0.694971740245819 + ,-0.50037944316864,0.00956230517476797,0.865753412246704,-0.447201460599899,0.0073622465133667,0.894402921199799 + ,-0.447208195924759,0.00490743666887283,0.894416391849518,-0.447187900543213,-0.0107257533818483,0.894375801086426 + ,0.47011387348175,-0.0291219297796488,0.88212513923645,0.529842972755432,0.063591293990612,0.845708310604095 + ,0.566623508930206,0.119484767317772,0.815267562866211,-0.612707495689392,-0.104410335421562,0.783382296562195 + ,-0.722098767757416,-0.0958089679479599,0.685123383998871,-0.47870945930481,-0.035335898399353,0.877261996269226 + ,0.437723428010941,0.0877299234271049,0.894819378852844,0.533561289310455,-0.0719944164156914,0.842691659927368 + ,0.437350481748581,0.0468384064733982,0.898070573806763,0.332129657268524,0.226140856742859,0.915723860263824 + ,-0.993461966514587,0.0839638337492943,-0.0773523524403572,-0.958256244659424,0.268214553594589,0.0990242138504982 + ,-0.998450934886932,-0.0297768265008926,-0.0469994582235813,-0.548166275024414,-0.0128267062827945,-0.836271047592163 + ,-0.525731205940247,7.39825765094793e-08,-0.850650787353516,-0.525731027126312,-4.09202485229798e-08,-0.85065084695816 + ,0.750385701656342,-0.0186027977615595,-0.660738348960876,0.833936989307404,-0.0599500350654125,-0.548593819141388 + ,0.85065084695816,-1.40070596899022e-07,-0.525731027126312,-0.508694529533386,0.0279473029077053,-0.860493361949921 + ,-0.548166275024414,-0.0128267062827945,-0.836271047592163,-0.539087533950806,0.00952969118952751,-0.842195808887482 + ,-0.480103731155396,0.0821181088685989,-0.873359620571136,-0.482188403606415,0.0421094819903374,-0.875054955482483 + ,-0.528629779815674,-0.00219258526340127,-0.848849654197693,-0.484364688396454,-0.0291560087352991,-0.874380171298981 + ,0.436769276857376,-0.0136092342436314,-0.899470686912537,0.447954058647156,-0.00179908669088036,-0.894054710865021 + ,0.489675253629684,-0.00273820385336876,-0.871900618076324,-0.484364688396454,-0.0291560087352991,-0.874380171298981 + ,-0.528629779815674,-0.00219258526340127,-0.848849654197693,-0.525731086730957,-2.18471605251125e-08,-0.85065084695816 + ,0.381211906671524,0.320132613182068,-0.867290318012238,0.650342285633087,0.183870866894722,-0.7370525598526 + ,0.85065084695816,1.56337733869805e-08,-0.525731086730957,0.440507858991623,9.74191152636195e-06,-0.897748649120331 + ,0.447954058647156,-0.00179908669088036,-0.894054710865021,0.436769276857376,-0.0136092342436314,-0.899470686912537 + ,0.433894872665405,-0.00980746280401945,-0.900910079479218,-0.263859272003174,0.18915531039238,0.945832312107086 + ,-0.624387621879578,0.155319526791573,0.765516757965088,-0.360625058412552,0.110720112919807,0.926115870475769 + ,-0.447187900543213,-0.0107257533818483,0.894375801086426,-0.447208195924759,0.00490743666887283,0.894416391849518 + ,-0.447213649749756,-2.34650840980066e-07,0.894427299499512,0.437350481748581,0.0468384064733982,0.898070573806763 + ,0.533561289310455,-0.0719944164156914,0.842691659927368,0.525731205940247,1.95143137204923e-08,0.850650787353516 + ,0.493316382169724,0.0202558990567923,0.869614064693451,0.529842972755432,0.063591293990612,0.845708310604095 + ,0.47011387348175,-0.0291219297796488,0.88212513923645,0.490297019481659,0.013706193305552,0.871447682380676 + ,0.437729060649872,0.0512777604162693,-0.897643625736237,0.703031599521637,0.110590599477291,-0.702507257461548 + ,0.861790597438812,0.102881200611591,-0.496721714735031,0.66245710849762,-0.008390205912292,-0.749052822589874 + ,0.657168030738831,-0.0443055555224419,0.752440810203552,0.533561289310455,-0.0719944164156914,0.842691659927368 + ,0.437723428010941,0.0877299234271049,0.894819378852844,-0.525731205940247,7.39825765094793e-08,-0.850650787353516 + ,-0.548166275024414,-0.0128267062827945,-0.836271047592163,-0.508694529533386,0.0279473029077053,-0.860493361949921 + ,0.489675253629684,-0.00273820385336876,-0.871900618076324,0.447954058647156,-0.00179908669088036,-0.894054710865021 + ,0.363267600536346,0.0105379903689027,-0.931625366210938,0.849199652671814,-0.0224009994417429,-0.527596652507782 + ,0.833936989307404,-0.0599500350654125,-0.548593819141388,0.750385701656342,-0.0186027977615595,-0.660738348960876 + ,0.590698540210724,0.0361449085175991,-0.806082367897034,0.447954058647156,-0.00179908669088036,-0.894054710865021 + ,0.440507858991623,9.74191152636195e-06,-0.897748649120331,0.85065084695816,1.56337733869805e-08,-0.525731086730957 + ,0.650342285633087,0.183870866894722,-0.7370525598526,0.954600393772125,-0.133271902799606,-0.266414493322372 + ,0.999790847301483,-0.010557048022747,-0.017516752704978,0.999972879886627,0.00736215896904469,-8.72930527862081e-08 + ,0.999345719814301,0.0361682511866093,1.25998454336695e-07,-0.811832368373871,0.464366912841797,-0.353965580463409 + ,-0.80697774887085,0.469917267560959,-0.357721477746964,-0.839236736297607,0.345977753400803,-0.419501036405563 + ,0.566623508930206,0.119484767317772,0.815267562866211,0.529842972755432,0.063591293990612,0.845708310604095 + ,0.74224579334259,0.215598240494728,0.634498715400696,0.984976887702942,-0.0186079517006874,-0.171680524945259 + ,0.999790847301483,-0.010557048022747,-0.017516752704978,0.998275637626648,-0.0586997903883457,-2.29518548167107e-07 + ,1,6.7348997845329e-07,-2.29915031013661e-07,0.533561289310455,-0.0719944164156914,0.842691659927368,0.657168030738831 + ,-0.0443055555224419,0.752440810203552,0.742245733737946,-0.21559850871563,0.634498655796051,0.999010741710663 + ,0.0190884377807379,-0.0401656255125999,0.999790847301483,-0.010557048022747,-0.017516752704978,0.984976887702942 + ,-0.0186079517006874,-0.171680524945259,0.91859757900238,0.013864534907043,-0.39495113492012,0.833936989307404 + ,-0.0599500350654125,-0.548593819141388,0.849199652671814,-0.0224009994417429,-0.527596652507782,0.915420174598694 + ,0.00855850614607334,-0.402408599853516,0.999972879886627,0.00736215896904469,-8.72930527862081e-08,0.999790847301483 + ,-0.010557048022747,-0.017516752704978,0.999010741710663,0.0190884377807379,-0.0401656255125999 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.0881041139364243,0.823791801929474,0.0881041139364243,0.176208227872849,0.963104128837585,0.304086744785309 + ,0.646174013614655,0.333333313465118,0.426208198070526,0.599999964237213,0.426208198070526,0.399999976158142 + ,0.338104099035263,0.116139747202396,0.0300342254340649,0.666666686534882,0.838104128837585,0.883860290050507 + ,0.963104069232941,0.695913255214691,0.0881040766835213,0.616139769554138,0.0300342254340649,0.333333313465118 + ,0.213104113936424,0.304086685180664,0.0881040766835213,0.383860260248184,0.838104069232941,0.5,0.89617395401001 + ,0.5,0.25,1,0.713104128837585,0.695913255214691,0.213104113936424,0.695913255214691,0.338104069232941,0.883860290050507 + ,0.25,0.19999997317791,0.280034214258194,0.5,0.838104069232941,0.116139747202396,0.780034184455872,0.5,0.75,0.399999976158142 + ,0.588104069232941,0.616139769554138,0.396173983812332,0.5,0.713104128837585,0.304086744785309,0.588104128837585 + ,0.383860260248184,0.463104099035263,0.695913255214691,0.463104099035263,0.304086744785309,1.03003418445587,0.666666686534882 + ,1.08810412883759,0.823791801929474,1.08810412883759,0.616139769554138,1.03003418445587,0.333333313465118,1.08810412883759 + ,0.383860260248184,1.08810412883759,0.176208227872849,1.25,1 + UVIndex: 9,35,31,31,32,8,9,31,35,33,13,12,10,10,0,7,11,1,12,13,34,35,15,2,2,36,34,15,35,9,9,14,15,14,2,15,17,9,8,8,32 + ,37,16,17,8,19,0,10,18,10,12,18,18,4,19,12,1,20,20,5,21,12,22,36,2,2,27,22,27,6,22,24,2,14,23,14,9,23,23,3,24 + ,23,9,17,17,16,25,25,3,23,17,16,0,19,18,12,21,21,5,26,26,4,18,21,20,36,22,6,6,5,20,27,2,24,24,3,27,3,6,27,28 + ,3,25,25,16,29,29,28,25,29,16,19,19,4,29,5,29,4,26,5,6,30,30,29,5,30,6,3,28,28,29,30 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,0,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,0,1,1,1,0,1,0,1,0,1,0,0,1,1,1,0,1,0,1,0 + ,0,0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pPlatonic1_ncl1_4" + } + Model: "Model::LOD_2", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::LOD_2_ncl1_2" + } + Model: "Model::pPlatonic1_ncl1_2", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: 0.187592402100563,-0.577350199222565,-0.794654488563538,-0.303530961275101,-0.934172332286835,0.187592476606369,0.607061982154846 + ,-2.50023290959689e-08,-0.794654488563538,-0.491123467683792,0.356822043657303,-0.794654488563538,-0.491123467683792 + ,-0.356822073459625,-0.794654488563538,0.982246935367584,-2.50023290959689e-08,-0.187592461705208,-3.50347306721233e-08 + ,0.999999940395355,0,-0.794654488563538,-0.577350318431854,-0.187592461705208,-0.982246994972229,-1.00009337700158e-07 + ,0.18759249150753,0.794654488563538,-0.577350258827209,0.187592476606369,0.794654488563538,0.577350258827209,0.187592476606369 + ,-0.607061982154846,-7.50069872879067e-08,0.794654428958893,0.491123467683792,-0.356822043657303,0.794654428958893 + ,-0.187592476606369,0.577350199222565,0.794654428958893,-0.187592417001724,-0.577350258827209,0.794654488563538 + PolygonVertexIndex: 2,4,-4,3,6,-3,4,7,-4,0,7,-5,0,4,-3,5,0,-3,10,2,-7,6,3,-9,3,7,-9,8,11,-7,7,14,-9,0,9,-2,9,0,-6,5,12,-10,5,2,-11,10 + ,12,-6,8,14,-12,7,0,-2,1,14,-8,12,1,-10,10,6,-14,13,12,-11,6,11,-14,14,13,-12,14,1,-13,12,13,-15 + Edges: 1,2,3,4,6,7,11,9,0,14,17,15,18,20,22,23,25,27,28,30,31,35,33,34,38,39,40,44,45,49,53,54,57,61,62,63,67,69,74 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: -4.70040184552545e-08,0,-1,1.10231995311739e-14,0,-1,7.60541212230237e-08,0,-1,-0.298135906457901,0.823657095432281 + ,-0.482393980026245,-0.298135906457901,0.823657155036926,-0.482393980026245,0.222837433218956,0.685823082923889 + ,-0.692813158035278,-0.894427239894867,0,-0.447213619947433,-0.894427180290222,0,-0.447213649749756,-0.894427180290222 + ,0,-0.447213619947433,-0.2763931453228,-0.85065084695816,-0.447213649749756,-0.276393085718155,-0.85065084695816 + ,-0.447213679552078,-0.276393175125122,-0.850650787353516,-0.447213649749756,-2.46116314883693e-07,0,-0.999999940395355 + ,1.10231995311739e-14,0,-1,-4.70040184552545e-08,0,-1,0.723606765270233,-0.525731146335602,-0.447213679552078 + ,0.495368450880051,-0.812944948673248,-0.306154489517212,0.723606765270233,-0.525731265544891,-0.447213530540466 + ,0.535126984119415,0.67966216802597,-0.501695573329926,0.566300630569458,0.658735871315002,-0.495349019765854 + ,0.494817942380905,0.704582035541534,-0.508644759654999,-0.298135906457901,0.823657155036926,-0.482393980026245 + ,-0.298135906457901,0.823657095432281,-0.482393980026245,-0.719326794147491,0.685823142528534,-0.110523477196693 + ,-0.894427180290222,0,-0.447213619947433,-0.894427180290222,0,-0.447213649749756,-0.894427180290222,0,-0.447213649749756 + ,-0.621612548828125,0.682645857334137,0.38417774438858,-0.666166245937347,0.667984426021576,0.331691712141037 + ,-0.692634522914886,0.657006621360779,0.297657042741776,-0.723606765270233,-0.525731146335602,0.447213560342789 + ,-0.723606765270233,-0.525731146335602,0.447213649749756,-0.723606765270233,-0.525731086730957,0.447213619947433 + ,0.495368450880051,-0.812944948673248,-0.306154489517212,0.519170999526978,-0.792153358459473,-0.320865333080292 + ,0.303531020879745,-0.934172391891479,-0.187592372298241,0.519170999526978,-0.792153358459473,-0.320865333080292 + ,0.495368450880051,-0.812944948673248,-0.306154489517212,0.723606765270233,-0.525731146335602,-0.447213679552078 + ,0.894427120685577,-2.90500867805576e-08,0.447213649749756,0.894427120685577,-2.22948863418202e-14,0.447213649749756 + ,0.894427120685577,1.23058143230992e-07,0.447213560342789,0.723606705665588,0.525731205940247,-0.447213590145111 + ,0.566300630569458,0.658735871315002,-0.495349019765854,0.535126984119415,0.67966216802597,-0.501695573329926 + ,0.894427180290222,-7.60541212230237e-08,0.447213679552078,0.894427120685577,-2.22948863418202e-14,0.447213649749756 + ,0.894427120685577,-2.90500867805576e-08,0.447213649749756,-0.723606765270233,-0.525731086730957,0.447213619947433 + ,-0.723606765270233,-0.525731146335602,0.447213649749756,-0.723606705665588,-0.525731027126312,0.447213768959045 + ,-0.276393085718155,-0.85065084695816,-0.447213679552078,-0.2763931453228,-0.85065084695816,-0.447213649749756 + ,-0.276393055915833,-0.850650787353516,-0.447213649749756,-0.723606884479523,-0.525731086730957,0.447213560342789 + ,-0.723606765270233,-0.525731146335602,0.447213649749756,-0.723606765270233,-0.525731146335602,0.447213560342789 + ,0.276393204927444,-0.85065084695816,0.447213560342789,0.276393294334412,-0.850650787353516,0.447213560342789 + ,0.2763931453228,-0.85065084695816,0.447213590145111,0.310544401407242,0.806898355484009,0.502471208572388,0.310544371604919 + ,0.806898295879364,0.502471208572388,0.310544401407242,0.806898295879364,0.502471208572388,0.311777174472809 + ,0.226519390940666,0.922758877277374,0.285567373037338,0.207476809620857,0.935630559921265,0.49112343788147,0.356822073459625 + ,0.794654488563538,-0.692634522914886,0.657006621360779,0.297657042741776,-0.666166245937347,0.667984426021576 + ,0.331691712141037,-0.803097367286682,0.583484411239624,0.120749987661839,5.81001522448332e-08,5.16191462907045e-08 + ,1,0.311777174472809,0.226519390940666,0.922758877277374,-2.46116286461984e-07,5.16191356325635e-08,1,0.276393413543701 + ,-0.850650668144226,0.447213500738144,0.276393294334412,-0.850650787353516,0.447213560342789,0.276393204927444 + ,-0.85065084695816,0.447213560342789,0.285567373037338,0.207476809620857,0.935630559921265,0.311777174472809 + ,0.226519390940666,0.922758877277374,5.81001522448332e-08,5.16191462907045e-08,1 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -0.00856975000351667,0.999963283538818,4.02812699862309e-10,-0.00856975000351667,0.999963283538818,-9.44660641265851e-17 + ,-3.24903446369262e-08,1,-2.4710246530695e-15,-0.107020616531372,0.473346352577209,0.87435120344162,0.433022141456604 + ,0.56708812713623,0.700644612312317,-0.0410139374434948,0.716649174690247,0.696226835250854,0.0161750093102455 + ,0.999345779418945,-0.032350018620491,0.00567160453647375,0.999919652938843,-0.0113432072103024,0.00567160407081246 + ,0.999919652938843,-0.0113432072103024,-0.304470777511597,0.518876969814301,-0.798789262771606,-0.304470777511597 + ,0.518876969814301,-0.798789322376251,-0.304470777511597,0.518876969814301,-0.798789203166962,-0.0171388387680054 + ,0.999853193759918,4.21814849715929e-09,-0.00856975000351667,0.999963283538818,-9.44660641265851e-17,-0.00856975000351667 + ,0.999963283538818,4.02812699862309e-10,0.447213649749756,0.85065084695816,-0.276393204927444,0.6915323138237 + ,0.58234053850174,-0.427390456199646,0.447213739156723,0.850650727748871,-0.276393264532089,-0.673176825046539 + ,0.701875567436218,0.232816785573959,-0.654842674732208,0.724563598632813,0.214915573596954,-0.695101141929626 + ,0.672195017337799,0.254928380250931,0.433022141456604,0.56708812713623,0.700644612312317,0.829904437065125,0.473346352577209 + ,0.295299619436264,0.641066312789917,0.716649115085602,0.274678230285645,0.00567160407081246,0.999919652938843 + ,-0.0113432072103024,0.00567160453647375,0.999919652938843,-0.0113432072103024,-0.00483493320643902,0.99994158744812 + ,0.00966986455023289,0.580693244934082,0.730749428272247,-0.358888268470764,0.478969216346741,0.724090278148651 + ,-0.496267795562744,0.476963400840759,0.726764619350433,-0.49428653717041,-0.447213560342789,0.850650787353516 + ,0.276393324136734,-0.447213590145111,0.85065084695816,0.276393294334412,-0.447213530540466,0.85065084695816 + ,0.276393294334412,0.6915323138237,0.58234053850174,-0.427390456199646,0.673845887184143,0.610322117805481,-0.416459679603577 + ,0.794654488563538,0.356822073459625,-0.491123497486115,0.673845887184143,0.610322117805481,-0.416459679603577 + ,0.6915323138237,0.58234053850174,-0.427390456199646,0.447213649749756,0.85065084695816,-0.276393204927444,-0.0062497858889401 + ,0.999902367591858,0.0124996341764927,-0.00624981196597219,0.999902367591858,0.0124996211379766,-0.00766479689627886 + ,0.999853134155273,0.0153293190523982,-0.447213709354401,0.85065084695816,0.276393264532089,-0.564687490463257 + ,0.747883558273315,0.348996073007584,-0.584368348121643,0.726689517498016,0.361159473657608,-0.00483480608090758 + ,0.99994158744812,0.00966978073120117,-0.00624981196597219,0.999902367591858,0.0124996211379766,-0.0062497858889401 + ,0.999902367591858,0.0124996341764927,-0.447213530540466,0.85065084695816,0.276393294334412,-0.447213590145111 + ,0.85065084695816,0.276393294334412,-0.447213500738144,0.85065084695816,0.276393175125122,-0.447213530540466 + ,0.525731086730957,-0.723606884479523,-0.447213530540466,0.525731146335602,-0.723606884479523,-0.447213500738144 + ,0.525731086730957,-0.723606884479523,-0.447213500738144,0.85065084695816,0.276393264532089,-0.447213590145111 + ,0.85065084695816,0.276393294334412,-0.447213560342789,0.850650787353516,0.276393324136734,0.421811163425446 + ,0.525500237941742,0.738867342472076,0.421811163425446,0.525500297546387,0.738867282867432,0.556935548782349 + ,0.521010518074036,0.646815955638885,-0.42421156167984,0.59069037437439,-0.686388731002808,-0.424211531877518 + ,0.59069037437439,-0.686388671398163,-0.424211531877518,0.59069037437439,-0.686388671398163,-0.0338348895311356 + ,0.973197340965271,-0.227469086647034,-0.0459675900638103,0.978126168251038,-0.202870309352875,-0.18759249150753 + ,0.934172391891479,-0.303530961275101,0.476963400840759,0.726764619350433,-0.49428653717041,0.478969216346741 + ,0.724090278148651,-0.496267795562744,0.392885029315948,0.670909523963928,-0.628905236721039,0.0107255857437849 + ,0.999942541122437,-5.22393364121854e-08,-0.0338348895311356,0.973197340965271,-0.227469086647034,-1.07766261692177e-07 + ,1,-5.16191605015592e-08,0.275402337312698,0.515931725502014,0.811152338981628,0.421811163425446,0.525500297546387 + ,0.738867282867432,0.421811163425446,0.525500237941742,0.738867342472076,-0.0459675900638103,0.978126168251038 + ,-0.202870309352875,-0.0338348895311356,0.973197340965271,-0.227469086647034,0.0107255857437849,0.999942541122437 + ,-5.22393364121854e-08 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: -0.999963283538818,-0.00856975000351667,4.70022953891203e-08,-0.999963283538818,-0.00856975000351667,-1.10227954964581e-14 + ,-1,-3.24903446369262e-08,-7.60541212230237e-08,-0.94850492477417,-0.31230154633522,0.0529732294380665,-0.850650787353516 + ,-5.35565938264426e-08,0.525731086730957,-0.973992466926575,0.126730412244797,-0.187824577093124,-0.446920990943909 + ,0.0361684188246727,0.893841981887817,-0.447177708148956,0.0126820914447308,0.894355297088623,-0.447177708148956 + ,0.0126820914447308,0.894355297088623,-0.911539554595947,0.0846163854002953,0.402412325143814,-0.911539614200592 + ,0.0846163257956505,0.402412295341492,-0.911539554595947,0.0846164152026176,0.402412354946136,-0.999853134155273 + ,-0.0171388387680054,2.46080162469298e-07,-0.999963283538818,-0.00856975000351667,-1.10227954964581e-14,-0.999963283538818 + ,-0.00856975000351667,4.70022953891203e-08,-0.525731146335602,5.59931159216376e-08,-0.850650787353516,-0.525731146335602 + ,-3.83996940911402e-08,-0.850650906562805,-0.525731086730957,-1.33221949027984e-08,-0.85065084695816,0.510364592075348 + ,0.213143303990364,0.833125352859497,0.500484466552734,0.202668830752373,0.841689169406891,0.521526396274567 + ,0.227416396141052,0.822369873523712,-0.850650787353516,-5.35565938264426e-08,0.525731086730957,-0.471565067768097 + ,0.312301486730576,0.824678242206573,-0.267587244510651,-0.126730531454086,0.955163061618805,-0.447177708148956 + ,0.0126820914447308,0.894355297088623,-0.447177708148956,0.0126820914447308,0.894355297088623,-0.447187513113022 + ,-0.0108112376183271,0.894374907016754,0.525731265544891,4.38327987239973e-08,0.85065084695816,0.57167387008667 + ,0.17172671854496,0.802308440208435,0.541076064109802,0.200388371944427,0.816750347614288,0.525731146335602,-1.17828520274088e-07 + ,0.850650787353516,0.525731205940247,-5.05256423366518e-08,0.850650787353516,0.525731205940247,-6.37241299727975e-08 + ,0.850650787353516,-0.525731146335602,-3.83996940911402e-08,-0.850650906562805,-0.525731146335602,-1.73548286852565e-09 + ,-0.850650787353516,-0.525731146335602,-1.03828263320338e-07,-0.850650906562805,-0.525731146335602,-1.73548286852565e-09 + ,-0.850650787353516,-0.525731146335602,-3.83996940911402e-08,-0.850650906562805,-0.525731146335602,5.59931159216376e-08 + ,-0.850650787353516,0.447169989347458,0.0139750028029084,-0.894339859485626,0.447169989347458,0.0139750028029084 + ,-0.894339859485626,0.447147905826569,0.0171387605369091,-0.894295811653137,-0.525731146335602,-2.98081381799875e-08 + ,-0.850650787353516,-0.600359618663788,-0.0820807069540024,-0.795506834983826,-0.610043287277222,-0.0999088138341904 + ,-0.786044120788574,0.447187542915344,0.0108111053705215,-0.894374907016754,0.447169989347458,0.0139750028029084 + ,-0.894339859485626,0.447169989347458,0.0139750028029084,-0.894339859485626,0.525731205940247,-6.37241299727975e-08 + ,0.850650787353516,0.525731205940247,-5.05256423366518e-08,0.850650787353516,0.525731265544891,7.38984340387105e-08 + ,0.850650727748871,0.850650906562805,7.32299909600442e-08,-0.525730967521667,0.85065084695816,1.67716596166656e-08 + ,-0.525731027126312,0.850650906562805,8.14671494708818e-08,-0.525730967521667,0.525731146335602,-1.23717313726956e-07 + ,0.850650906562805,0.525731205940247,-5.05256423366518e-08,0.850650787353516,0.525731146335602,-1.17828520274088e-07 + ,0.850650787353516,0.863528907299042,0.0155782382935286,-0.504058718681335,0.863528907299042,0.0155783044174314 + ,-0.50405877828598,0.783217489719391,-0.0702936500310898,-0.617761433124542,0.850650787353516,-8.1886085467886e-08 + ,-0.525731146335602,0.850650787353516,-6.14301001178319e-08,-0.525731146335602,0.850650787353516,-8.18860783624586e-08 + ,-0.525731146335602,0.949552655220032,-0.0396982245147228,-0.311084985733032,0.957255601882935,-0.0149244517087936 + ,-0.288858115673065,0.85065084695816,4.47039347761802e-08,-0.525731086730957,0.541076064109802,0.200388371944427 + ,0.816750347614288,0.57167387008667,0.17172671854496,0.802308440208435,0.447968721389771,0.457631289958954,0.76804792881012 + ,0.999942541122437,-0.0107255857437849,-5.75431720051256e-08,0.949552655220032,-0.0396982245147228,-0.311084985733032 + ,1,1.07766275903032e-07,2.46116286461984e-07,0.920738935470581,0.101033516228199,-0.376871347427368,0.863528907299042 + ,0.0155783044174314,-0.50405877828598,0.863528907299042,0.0155782382935286,-0.504058718681335,0.957255601882935 + ,-0.0149244517087936,-0.288858115673065,0.949552655220032,-0.0396982245147228,-0.311084985733032,0.999942541122437 + ,-0.0107255857437849,-5.75431720051256e-08 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.963104128837585,0.304086744785309,0.338104099035263,0.116139747202396,0.89617395401001,0.5,0.0881040766835213 + ,0.616139769554138,0.0300342254340649,0.333333313465118,0.0881040766835213,0.383860260248184,0.780034184455872 + ,0.5,0.25,1,0.213104113936424,0.304086685180664,0.280034214258194,0.5,0.713104128837585,0.304086744785309,0.713104128837585 + ,0.695913255214691,0.396173983812332,0.5,0.588104128837585,0.383860260248184,0.463104099035263,0.695913255214691 + ,0.463104099035263,0.304086744785309,1.08810412883759,0.616139769554138,1.08810412883759,0.383860260248184 + UVIndex: 2,17,16,16,7,2,5,8,3,4,8,5,0,17,2,6,0,2,11,2,7,7,3,9,3,8,9,9,12,7,8,15,9,0,10,1,10,0,6,6,13,10,6,2,11,11,13,6 + ,9,15,12,8,0,1,1,15,8,13,1,10,11,7,14,14,13,11,7,12,14,15,14,12,15,1,13,13,14,15 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,1,0,0,1,0,1,1,0,0,1,1,0,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pPlatonic1_ncl1_5" + } + Model: "Model::LOD_Group_2", "LodGroup" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "ThresholdsUsedAsPercentage", "bool", "N",0 + Property: "MinMaxDistance", "bool", "N",0 + Property: "MinDistance", "double", "N",-100 + Property: "MaxDistance", "double", "N",100 + Property: "WorldSpace", "bool", "N",0 + Property: "DisplayLevels|Level0", "enum", "N",0 + Property: "DisplayLevels|Level1", "enum", "N",1 + Property: "DisplayLevels|Level2", "enum", "N",2 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + NodeAttributeName: "NodeAttribute::LOD_Group_2_ncl1_1" + } + Model: "Model::LOD_0_ncl1_1", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::LOD_0_ncl1_3" + } + Model: "Model::pSphere1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: 9.27258483329751e-08,-0.70710676908493,-0.70710676908493,-0.70710676908493,-0.70710676908493,-6.18172393274108e-08 + ,-3.09086196637054e-08,-0.70710676908493,0.70710676908493,0.70710676908493,-0.70710676908493,0,1.31134157754786e-07 + ,0,-1,-1,0,-8.74227765734759e-08,-4.37113882867379e-08,0,1,1,0,0,9.27258483329751e-08,0.70710676908493,-0.70710676908493 + ,-0.70710676908493,0.70710676908493,-6.18172393274108e-08,-3.09086196637054e-08,0.70710676908493,0.70710676908493 + ,0.70710676908493,0.70710676908493,0,0,-1,0,0,1,0 + PolygonVertexIndex: 0,1,5,-5,1,2,6,-6,2,3,7,-7,3,0,4,-8,4,5,9,-9,5,6,10,-10,6,7,11,-11,7,4,8,-12,1,0,-13,2,1,-13,3,2,-13,0,3,-13,8,9,-14 + ,9,10,-14,10,11,-14,11,8,-14 + Edges: 0,4,8,12,2,6,10,14,18,22,26,30,3,1,5,9,19,17,21,25,33,34,37,40,46,45,48,51 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: -0.678598284721375,-0.281084656715393,-0.678598403930664,-0.678598284721375,-0.281084656715393,-0.678598403930664 + ,-0.678598284721375,-0.281084626913071,-0.678598403930664,-0.678598284721375,-0.281084626913071,-0.678598403930664 + ,-0.678598463535309,-0.281084626913071,0.678598284721375,-0.678598463535309,-0.281084626913071,0.678598284721375 + ,-0.678598403930664,-0.281084626913071,0.678598284721375,-0.678598403930664,-0.281084626913071,0.678598284721375 + ,0.678598403930664,-0.281084656715393,0.678598403930664,0.678598403930664,-0.281084656715393,0.678598403930664 + ,0.678598344326019,-0.281084626913071,0.678598344326019,0.678598344326019,-0.281084626913071,0.678598344326019 + ,0.678598344326019,-0.281084626913071,-0.67859822511673,0.678598344326019,-0.281084626913071,-0.67859822511673 + ,0.678598403930664,-0.281084686517715,-0.678598284721375,0.678598403930664,-0.281084686517715,-0.678598284721375 + ,-0.67859822511673,0.281084626913071,-0.678598403930664,-0.67859822511673,0.281084626913071,-0.678598403930664 + ,-0.67859822511673,0.281084656715393,-0.678598403930664,-0.67859822511673,0.281084656715393,-0.678598403930664 + ,-0.678598403930664,0.281084626913071,0.678598284721375,-0.678598403930664,0.281084626913071,0.678598284721375 + ,-0.678598463535309,0.281084626913071,0.678598284721375,-0.678598463535309,0.281084626913071,0.678598284721375 + ,0.678598344326019,0.281084626913071,0.678598344326019,0.678598344326019,0.281084626913071,0.678598344326019 + ,0.678598403930664,0.281084656715393,0.678598403930664,0.678598403930664,0.281084656715393,0.678598403930664 + ,0.678598403930664,0.281084656715393,-0.678598284721375,0.678598403930664,0.281084656715393,-0.678598284721375 + ,0.678598344326019,0.281084626913071,-0.67859822511673,0.678598344326019,0.281084626913071,-0.67859822511673 + ,-0.357406765222549,-0.862856149673462,-0.357406944036484,-0.357406765222549,-0.862856149673462,-0.357406944036484 + ,-0.357406765222549,-0.862856149673462,-0.357406944036484,-0.357406735420227,-0.862856090068817,0.357406914234161 + ,-0.357406735420227,-0.862856090068817,0.357406914234161,-0.357406765222549,-0.862856149673462,0.357406944036484 + ,0.357406765222549,-0.862856090068817,0.357406914234161,0.357406765222549,-0.862856090068817,0.357406914234161 + ,0.357406765222549,-0.862856149673462,0.357406944036484,0.357406765222549,-0.862856209278107,-0.357406854629517 + ,0.357406765222549,-0.862856209278107,-0.357406854629517,0.357406735420227,-0.862856149673462,-0.357406824827194 + ,-0.357406765222549,0.862856149673462,-0.357406944036484,-0.357406765222549,0.862856149673462,-0.357406944036484 + ,-0.357406765222549,0.862856149673462,-0.357406944036484,-0.357406735420227,0.862856090068817,0.357406914234161 + ,-0.357406735420227,0.862856090068817,0.357406914234161,-0.357406735420227,0.862856149673462,0.357406914234161 + ,0.357406765222549,0.862856090068817,0.357406914234161,0.357406765222549,0.862856090068817,0.357406914234161 + ,0.357406765222549,0.862856149673462,0.357406944036484,0.357406765222549,0.862856209278107,-0.357406824827194 + ,0.357406765222549,0.862856209278107,-0.357406824827194,0.357406735420227,0.862856149673462,-0.357406795024872 + + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -0.198756873607635,0.959683060646057,-0.198756903409958,-0.198756873607635,0.959683060646057,-0.198756903409958 + ,-0.198756858706474,0.959683060646057,-0.198756888508797,-0.198756858706474,0.959683060646057,-0.198756888508797 + ,-0.198756858706474,0.959683060646057,0.198756843805313,-0.198756858706474,0.959683060646057,0.198756843805313 + ,-0.198756888508797,0.959683060646057,0.198756858706474,-0.198756888508797,0.959683060646057,0.198756858706474 + ,0.198756843805313,0.959683001041412,0.198756843805313,0.198756843805313,0.959683001041412,0.198756843805313 + ,0.198756828904152,0.959682941436768,0.198756828904152,0.198756828904152,0.959682941436768,0.198756828904152 + ,0.198756888508797,0.959683001041412,-0.198756858706474,0.198756888508797,0.959683001041412,-0.198756858706474 + ,0.19875693321228,0.959683060646057,-0.198756903409958,0.19875693321228,0.959683060646057,-0.198756903409958 + ,0.198756858706474,0.959683060646057,0.198756903409958,0.198756858706474,0.959683060646057,0.198756903409958 + ,0.198756873607635,0.959683060646057,0.19875693321228,0.198756873607635,0.959683060646057,0.19875693321228,0.198756888508797 + ,0.959683060646057,-0.198756858706474,0.198756888508797,0.959683060646057,-0.198756858706474,0.198756858706474 + ,0.959683060646057,-0.198756843805313,0.198756858706474,0.959683060646057,-0.198756843805313,-0.198756828904152 + ,0.959682941436768,-0.198756828904152,-0.198756828904152,0.959682941436768,-0.198756828904152,-0.198756843805313 + ,0.959683001041412,-0.198756843805313,-0.198756843805313,0.959683001041412,-0.198756843805313,-0.198756903409958 + ,0.959683060646057,0.198756873607635,-0.198756903409958,0.959683060646057,0.198756873607635,-0.198756888508797 + ,0.959683001041412,0.198756858706474,-0.198756888508797,0.959683001041412,0.198756858706474,-0.610131323337555 + ,0.505449652671814,-0.610131502151489,-0.610131323337555,0.505449652671814,-0.610131502151489,-0.610131323337555 + ,0.505449652671814,-0.610131502151489,-0.610131502151489,0.505449593067169,0.6101313829422,-0.610131502151489 + ,0.505449593067169,0.6101313829422,-0.610131502151489,0.505449593067169,0.6101313829422,0.6101313829422,0.505449593067169 + ,0.610131502151489,0.6101313829422,0.505449593067169,0.610131502151489,0.610131442546844,0.505449593067169,0.610131442546844 + ,0.610131442546844,0.505449533462524,-0.610131442546844,0.610131442546844,0.505449533462524,-0.610131442546844 + ,0.610131502151489,0.505449533462524,-0.610131502151489,0.610131323337555,0.505449652671814,0.610131502151489 + ,0.610131323337555,0.505449652671814,0.610131502151489,0.610131323337555,0.505449652671814,0.610131502151489 + ,0.610131502151489,0.505449593067169,-0.6101313829422,0.610131502151489,0.505449593067169,-0.6101313829422,0.610131502151489 + ,0.505449533462524,-0.6101313829422,-0.6101313829422,0.505449593067169,-0.610131502151489,-0.6101313829422,0.505449593067169 + ,-0.610131502151489,-0.610131442546844,0.505449593067169,-0.610131442546844,-0.610131502151489,0.505449533462524 + ,0.610131442546844,-0.610131502151489,0.505449533462524,0.610131442546844,-0.610131502151489,0.505449533462524 + ,0.610131442546844 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: -0.707106828689575,5.78443737353496e-09,0.707106709480286,-0.707106828689575,5.78443737353496e-09,0.707106709480286 + ,-0.707106828689575,5.78443648535654e-09,0.707106709480286,-0.707106828689575,5.78443648535654e-09,0.707106709480286 + ,0.707106709480286,-1.78536314621169e-08,0.70710688829422,0.707106709480286,-1.78536332384738e-08,0.70710688829422 + ,0.707106709480286,-6.0068026108695e-09,0.707106828689575,0.707106709480286,-6.00680216678029e-09,0.707106828689575 + ,0.707106828689575,5.89562221264828e-09,-0.707106828689575,0.707106828689575,5.89562221264828e-09,-0.707106828689575 + ,0.707106828689575,5.89562088038065e-09,-0.707106828689575,0.707106828689575,5.89562088038065e-09,-0.707106828689575 + ,-0.707106709480286,-6.00680394313713e-09,-0.707106828689575,-0.707106709480286,-6.00680394313713e-09,-0.707106828689575 + ,-0.707106709480286,-6.00680305495871e-09,-0.707106828689575,-0.707106709480286,-6.00680305495871e-09,-0.707106828689575 + ,-0.70710688829422,6.06239591860458e-09,0.707106709480286,-0.70710688829422,6.06239591860458e-09,0.707106709480286 + ,-0.70710688829422,6.06239636269379e-09,0.707106709480286,-0.70710688829422,6.06239636269379e-09,0.707106709480286 + ,0.707106709480286,6.0068026108695e-09,0.707106828689575,0.707106709480286,6.00680216678029e-09,0.707106828689575 + ,0.707106709480286,1.78536314621169e-08,0.70710688829422,0.707106709480286,1.78536332384738e-08,0.70710688829422 + ,0.707106828689575,-5.89562088038065e-09,-0.707106828689575,0.707106828689575,-5.89562088038065e-09,-0.707106828689575 + ,0.707106828689575,-5.89562221264828e-09,-0.707106828689575,0.707106828689575,-5.89562221264828e-09,-0.707106828689575 + ,-0.707106709480286,6.0068026108695e-09,-0.707106828689575,-0.707106709480286,6.00680305495871e-09,-0.707106828689575 + ,-0.707106709480286,6.00680394313713e-09,-0.707106828689575,-0.707106709480286,6.00680394313713e-09,-0.707106828689575 + ,-0.70710688829422,-6.14403532495089e-08,0.707106649875641,-0.70710688829422,-6.14403532495089e-08,0.707106649875641 + ,-0.70710688829422,-6.14403532495089e-08,0.707106649875641,0.707106828689575,1.37695792545856e-07,0.707106828689575 + ,0.707106828689575,1.37695792545856e-07,0.707106828689575,0.707106828689575,1.3769580675671e-07,0.707106828689575 + ,0.707106828689575,-8.1384733618961e-08,-0.707106709480286,0.707106828689575,-8.1384733618961e-08,-0.707106709480286 + ,0.707106828689575,-9.95680693449685e-08,-0.707106709480286,-0.707106828689575,8.31457995786877e-08,-0.707106828689575 + ,-0.707106828689575,8.31457995786877e-08,-0.707106828689575,-0.707106828689575,8.31457924732604e-08,-0.707106828689575 + ,-0.70710688829422,6.14403532495089e-08,0.707106649875641,-0.70710688829422,6.14403532495089e-08,0.707106649875641 + ,-0.70710688829422,6.14403532495089e-08,0.707106649875641,0.707106828689575,-1.37695792545856e-07,0.707106828689575 + ,0.707106828689575,-1.37695792545856e-07,0.707106828689575,0.707106828689575,-1.3769580675671e-07,0.707106828689575 + ,0.707106828689575,8.1384733618961e-08,-0.707106709480286,0.707106828689575,8.1384733618961e-08,-0.707106709480286 + ,0.707106828689575,9.95680693449685e-08,-0.707106709480286,-0.70710676908493,-6.49624567472529e-08,-0.707106828689575 + ,-0.70710676908493,-6.49624567472529e-08,-0.707106828689575,-0.70710676908493,-6.49624496418255e-08,-0.707106828689575 + + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0,0.25,0.25,0.25,0.5,0.25,0.75,0.25,1,0.25,0,0.5,0.25,0.5,0.5,0.5,0.75,0.5,1,0.5,0,0.75,0.25,0.75,0.5,0.75,0.75 + ,0.75,1,0.75,0.125,0,0.375,0,0.625,0,0.875,0,0.125,1,0.375,1,0.625,1,0.875,1 + UVIndex: 0,1,6,5,1,2,7,6,2,3,8,7,3,4,9,8,5,6,11,10,6,7,12,11,7,8,13,12,8,9,14,13,1,0,15,2,1,16,3,2,17,4,3,18,10,11,19 + ,11,12,20,12,13,21,13,14,22 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pSphere1_ncl1_1" + } + Model: "Model::LOD_1_ncl1_1", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::LOD_1_ncl1_3" + } + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::LOD_2_ncl1_1", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::LOD_2_ncl1_3" + } + Model: "Model::pCone1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: 1.31134157754786e-07,-1,-1,-1,-1,-8.74227765734759e-08,-4.37113882867379e-08,-1,1,1,-1,0,0,1,0 + PolygonVertexIndex: 0,3,2,-2,0,1,-5,1,2,-5,2,3,-5,3,0,-5 + Edges: 3,2,1,0,6,5,8,11 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,-1,5.9604651880818e-08,0,-1,5.9604651880818e-08,0,-1,5.9604651880818e-08,0,-1,5.9604651880818e-08,-0.666666567325592 + ,0.333333313465118,-0.666666686534882,-0.666666567325592,0.333333313465118,-0.666666686534882,-0.666666626930237 + ,0.333333343267441,-0.666666746139526,-0.666666686534882,0.333333313465118,0.666666567325592,-0.666666686534882 + ,0.333333313465118,0.666666567325592,-0.666666746139526,0.333333343267441,0.666666626930237,0.666666686534882 + ,0.333333343267441,0.666666686534882,0.666666686534882,0.333333343267441,0.666666686534882,0.666666626930237 + ,0.333333313465118,0.666666626930237,0.666666686534882,0.333333343267441,-0.666666686534882,0.666666686534882 + ,0.333333343267441,-0.666666686534882,0.666666746139526,0.333333373069763,-0.666666626930237 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -1.39090658990426e-08,5.9604651880818e-08,1,-1.39090658990426e-08,5.9604651880818e-08,1,-1.39090658990426e-08 + ,5.9604651880818e-08,1,-1.39090658990426e-08,5.9604651880818e-08,1,0.235702246427536,0.942809104919434,0.23570229113102 + ,0.235702246427536,0.942809104919434,0.23570229113102,0.235702246427536,0.942809045314789,0.235702276229858,0.23570229113102 + ,0.942809104919434,-0.235702246427536,0.23570229113102,0.942809104919434,-0.235702246427536,0.235702276229858 + ,0.942809045314789,-0.235702246427536,-0.235702276229858,0.942809104919434,-0.235702276229858,-0.235702276229858 + ,0.942809104919434,-0.235702276229858,-0.235702261328697,0.942809045314789,-0.235702261328697,-0.23570229113102 + ,0.942809104919434,0.235702261328697,-0.23570229113102,0.942809104919434,0.235702261328697,-0.235702306032181 + ,0.942809045314789,0.235702261328697 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,8.29045037949053e-16,1.39090658990426e-08,1,8.29045037949053e-16,1.39090658990426e-08,1,8.29044985009494e-16 + ,1.39090658990426e-08,1,8.29045037949053e-16,1.39090658990426e-08,-0.707106828689575,-6.24500673396255e-09,0.707106709480286 + ,-0.707106828689575,-6.24500673396255e-09,0.707106709480286,-0.707106828689575,-6.24501028667623e-09,0.707106709480286 + ,0.707106709480286,7.49215445239315e-09,0.707106828689575,0.707106709480286,7.49215445239315e-09,0.707106828689575 + ,0.707106709480286,7.49215267603631e-09,0.707106828689575,0.707106828689575,-6.86858303566851e-09,-0.707106828689575 + ,0.707106828689575,-6.86858303566851e-09,-0.707106828689575,0.707106828689575,-6.86858214749009e-09,-0.707106828689575 + ,-0.707106828689575,-2.06057499951839e-08,-0.707106828689575,-0.707106828689575,-2.06057499951839e-08,-0.707106828689575 + ,-0.707106709480286,7.49215267603631e-09,-0.707106828689575 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.500000059604645,0,0.25,0.249999985098839,0.5,0.5,0.75,0.25,0.25,0.5,0.375,0.5,0.5,0.5,0.625,0.5,0.75,0.5,0.5 + ,1 + UVIndex: 0,3,2,1,4,5,9,5,6,9,6,7,9,7,8,9 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCone1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_lod_group_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_lod_group_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "10/02/2022 17:30:55.870" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_lod_group_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "10/02/2022 17:30:55.870" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\maya_suzanne_lod.mb" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::LOD_Group_1", "Model::Scene" + Connect: "OO", "Model::LOD_Group_2", "Model::Scene" + Connect: "OO", "Model::LOD_0", "Model::LOD_Group_1" + Connect: "OO", "Model::LOD_1", "Model::LOD_Group_1" + Connect: "OO", "Model::LOD_2", "Model::LOD_Group_1" + Connect: "OO", "Model::pPlatonic1", "Model::LOD_0" + Connect: "OO", "Material::lambert1", "Model::pPlatonic1" + Connect: "OO", "Model::pPlatonic1_ncl1_1", "Model::LOD_1" + Connect: "OO", "Material::lambert1", "Model::pPlatonic1_ncl1_1" + Connect: "OO", "Model::pPlatonic1_ncl1_2", "Model::LOD_2" + Connect: "OO", "Material::lambert1", "Model::pPlatonic1_ncl1_2" + Connect: "OO", "Model::LOD_0_ncl1_1", "Model::LOD_Group_2" + Connect: "OO", "Model::LOD_1_ncl1_1", "Model::LOD_Group_2" + Connect: "OO", "Model::LOD_2_ncl1_1", "Model::LOD_Group_2" + Connect: "OO", "Model::pSphere1", "Model::LOD_0_ncl1_1" + Connect: "OO", "Material::lambert1", "Model::pSphere1" + Connect: "OO", "Model::pCube1", "Model::LOD_1_ncl1_1" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Model::pCone1", "Model::LOD_2_ncl1_1" + Connect: "OO", "Material::lambert1", "Model::pCone1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_lod_group_6100_binary.fbx b/modules/ufbx/data/maya_lod_group_6100_binary.fbx new file mode 100644 index 0000000..9625e63 Binary files /dev/null and b/modules/ufbx/data/maya_lod_group_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_lod_group_7500_ascii.fbx b/modules/ufbx/data/maya_lod_group_7500_ascii.fbx new file mode 100644 index 0000000..a210b6e --- /dev/null +++ b/modules/ufbx/data/maya_lod_group_7500_ascii.fbx @@ -0,0 +1,1309 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 2 + Day: 10 + Hour: 18 + Minute: 56 + Second: 44 + Millisecond: 209 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_lod_group_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_lod_group_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "10/02/2022 16:56:44.208" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_lod_group_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "10/02/2022 16:56:44.208" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\maya_suzanne_lod.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2060819097456, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 32 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 8 + PropertyTemplate: "FbxLODGroup" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ThresholdsUsedAsPercentage", "bool", "", "",0 + P: "MinMaxDistance", "bool", "", "",0 + P: "MinDistance", "double", "Number", "",-100 + P: "MaxDistance", "double", "Number", "",100 + P: "WorldSpace", "bool", "", "",0 + P: "Thresholds", "Compound", "", "" + P: "DisplayLevels", "Compound", "", "" + } + } + } + ObjectType: "Model" { + Count: 14 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Geometry" { + Count: 6 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 2060817501920, "NodeAttribute::", "LodGroup" { + Properties70: { + P: "ThresholdsUsedAsPercentage", "bool", "", "",1 + P: "WorldSpace", "bool", "", "",1 + P: "Thresholds|Level0", "Distance", "", "",64, "cm" + P: "Thresholds|Level1", "Distance", "", "",32, "cm" + P: "DisplayLevels|Level0", "enum", "", "",0 + P: "DisplayLevels|Level1", "enum", "", "",0 + P: "DisplayLevels|Level2", "enum", "", "",0 + } + } + NodeAttribute: 2060818026784, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 2060814319840, "Geometry::", "Mesh" { + Vertices: *186 { + a: 0,0,-1,0.723606824874878,0.525731086730957,-0.447213590145111,-0.276393264532089,0.850650906562805,-0.447213649749756,-0.894427299499512,-7.81933167104398e-08,-0.447213649749756,-0.276393294334412,-0.850650787353516,-0.447213590145111,0.723606765270233,-0.525731146335602,-0.447213590145111,0.894427299499512,0,0.447213649749756,0.276393175125122,0.85065084695816,0.447213590145111,-0.723606884479523,0.525731086730957,0.447213649749756,-0.723606765270233,-0.525731205940247,0.447213590145111,0.276393324136734,-0.850650787353516,0.447213590145111,0,0,1,-0.16245986521244,0.499999970197678,-0.85065084695816,0.262865543365479,0.809016942977905,-0.525731086730957,0.42532542347908,0.309016972780228,-0.85065084695816,0.187592461705208,0.577350199222565,-0.794654488563538,-0.525731086730957,-4.59608742175988e-08,-0.85065084695816,-0.688190996646881,0.499999940395355,-0.525731086730957,-0.491123467683792,0.356822043657303,-0.794654488563538,-0.162459895014763,-0.499999970197678,-0.85065084695816,-0.688190996646881,-0.5,-0.525731086730957,-0.491123467683792,-0.356822073459625,-0.794654488563538,0.425325393676758,-0.30901700258255,-0.85065084695816,0.262865513563156,-0.809017062187195,-0.525731146335602,0.187592402100563,-0.577350199222565,-0.794654488563538,0.85065084695816,-3.50347306721233e-08,-0.525731086730957,0.607061982154846,-2.50023290959689e-08,-0.794654488563538,-3.50347306721233e-08,0.999999940395355,0,0.587785243988037,0.809016942977905,0,0.303530991077423,0.934172332286835,-0.187592476606369,-0.95105654001236,0.309016913175583,0,-0.587785243988037,0.809016942977905,0,-0.794654488563538,0.57735013961792,-0.187592461705208,-0.587785243988037,-0.80901700258255,0,-0.95105642080307,-0.309017091989517,0,-0.794654488563538,-0.577350318431854,-0.187592461705208,0.587785303592682,-0.809016942977905,0,1.75173653360616e-08,-0.999999940395355,0,0.303531020879745,-0.934172332286835,-0.187592476606369,0.95105654001236,0.309016972780228,0,0.95105654001236,-0.309017032384872,0,0.982246935367584,-2.50023290959689e-08,-0.187592461705208, +0.688190937042236,0.5,0.525731086730957,0.794654488563538,0.577350258827209,0.187592476606369,-0.262865573167801,0.809016942977905,0.525731086730957,-0.303531020879745,0.934172332286835,0.187592476606369,-0.85065084695816,-1.0510419201637e-07,0.525731086730957,-0.982246994972229,-1.00009337700158e-07,0.18759249150753,-0.262865453958511,-0.80901700258255,0.525731086730957,-0.303530961275101,-0.934172332286835,0.187592476606369,0.688190996646881,-0.499999970197678,0.525731086730957,0.794654488563538,-0.577350258827209,0.187592476606369,0.162459835410118,0.5,0.85065084695816,0.525731086730957,0,0.85065084695816,0.49112343788147,0.356822103261948,0.794654488563538,-0.42532542347908,0.309016942977905,0.85065084695816,-0.187592476606369,0.577350199222565,0.794654428958893,-0.425325393676758,-0.309017032384872,0.85065084695816,-0.607061982154846,-7.50069872879067e-08,0.794654428958893,0.162459924817085,-0.499999970197678,0.85065084695816,-0.187592417001724,-0.577350258827209,0.794654488563538,0.491123467683792,-0.356822043657303,0.794654428958893 + } + PolygonVertexIndex: *240 { + a: 14,0,12,-16,12,2,13,-16,13,1,14,-16,12,0,16,-19,16,3,17,-19,17,2,12,-19,16,0,19,-22,19,4,20,-22,20,3,16,-22,19,0,22,-25,22,5,23,-25,23,4,19,-25,22,0,14,-27,14,1,25,-27,25,5,22,-27,28,1,13,-30,13,2,27,-30,27,7,28,-30,31,2,17,-33,17,3,30,-33,30,8,31,-33,34,3,20,-36,20,4,33,-36,33,9,34,-36,37,4,23,-39,23,5,36,-39,36,10,37,-39,40,5,25,-42,25,1,39,-42,39,6,40,-42,39,1,28,-44,28,7,42,-44,42,6,39,-44,27,2,31,-46,31,8,44,-46,44,7,27,-46,30,3,34,-48,34,9,46,-48,46,8,30,-48,33,4,37,-50,37,10,48,-50,48,9,33,-50,36,5,40,-52,40,6,50,-52,50,10,36,-52,53,6,42,-55,42,7,52,-55,52,11,53,-55,52,7,44,-57,44,8,55,-57,55,11,52,-57,55,8,46,-59,46,9,57,-59,57,11,55,-59,57,9,48,-61,48,10,59,-61,59,11,57,-61,59,10,50,-62,50,6,53,-62,53,11,59,-62 + } + Edges: *120 { + a: 0,1,2,3,4,5,6,8,9,13,14,15,16,17,18,20,25,26,27,28,29,30,32,37,38,39,40,41,42,44,50,51,53,54,56,60,62,63,65,66,68,69,72,74,75,77,78,80,81,84,86,87,89,90,92,93,96,98,99,101,102,104,105,108,110,111,113,114,116,117,122,123,125,126,128,134,135,137,138,140,146,147,149,150,152,158,159,161,162,164,170,171,173,174,176,180,182,183,185,186,188,189,194,195,197,198,200,206,207,209,210,212,218,219,221,222,224,230,231,234 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *720 { + a: 0.213542863726616,0.155148163437843,-0.964535355567932,-3.30459180020171e-08,6.60918386685694e-09,-1,-0.0815661773085594,0.251035004854202,-0.964535355567932,0.0990169644355774,0.304743140935898,-0.9472736120224,-0.230113461613655,0.708216428756714,-0.667440950870514,-0.276393204927444,0.85065084695816,-0.447213590145111,-0.0165701843798161,0.863364696502686,-0.5043084025383,-0.0468716025352478,0.753742456436157,-0.655496180057526,0.520878732204437,0.688736855983734,-0.504308342933655,0.723606824874878,0.525731205940247,-0.447213560342789,0.602444887161255,0.437701940536499,-0.66744077205658,0.480958789587021,0.582240223884583,-0.655496001243591,-0.0815661773085594,0.251035004854202,-0.964535355567932,-3.30459180020171e-08,6.60918386685694e-09,-1,-0.263953685760498,6.29573859711741e-09,-0.964535355567932,-0.259229809045792,0.188341602683067,-0.947273671627045,-0.744662821292877,-1.25914745296996e-08,-0.667440831661224,-0.894427180290222,-5.82102046564614e-08,-0.447213560342789,-0.82622903585434,0.25103497505188,-0.504308342933655,-0.731336057186127,0.188341647386551,-0.655496060848236,-0.494067519903183,0.708216428756714,-0.50430828332901,-0.276393204927444,0.85065084695816,-0.447213590145111,-0.230113461613655,0.708216428756714,-0.667440950870514,-0.405118882656097,0.6373410820961,-0.655496001243591,-0.263953685760498,6.29573859711741e-09,-0.964535355567932,-3.30459180020171e-08,6.60918386685694e-09,-1,-0.0815661996603012,-0.251035034656525,-0.964535295963287,-0.259229868650436,-0.188341587781906,-0.947273552417755,-0.230113551020622,-0.708216369152069,-0.667440891265869,-0.276393234729767,-0.850650787353516,-0.447213560342789,-0.494067311286926,-0.708216488361359,-0.50430828332901,-0.405118882656097,-0.637341141700745,-0.655496060848236,-0.82622903585434,-0.251035064458847,-0.50430828332901,-0.894427180290222,-5.82102046564614e-08,-0.447213560342789,-0.744662821292877,-1.25914745296996e-08,-0.667440831661224,-0.731335937976837,-0.188341706991196,-0.655496060848236,-0.0815661996603012,-0.251035034656525,-0.964535295963287, +-3.30459180020171e-08,6.60918386685694e-09,-1,0.213542908430099,-0.155148193240166,-0.964535295963287,0.099017009139061,-0.304743200540543,-0.947273552417755,0.6024449467659,-0.437701821327209,-0.667440891265869,0.723606765270233,-0.525731146335602,-0.447213649749756,0.520878612995148,-0.688736855983734,-0.5043084025383,0.480958670377731,-0.582240045070648,-0.655496120452881,-0.0165704507380724,-0.863364696502686,-0.504308342933655,-0.276393234729767,-0.850650787353516,-0.447213560342789,-0.230113551020622,-0.708216369152069,-0.667440891265869,-0.046871867030859,-0.753742516040802,-0.655496180057526,0.213542908430099,-0.155148193240166,-0.964535295963287,-3.30459180020171e-08,6.60918386685694e-09,-1,0.213542863726616,0.155148163437843,-0.964535355567932,0.320425480604172,0,-0.947273731231689,0.602444887161255,0.437701940536499,-0.66744077205658,0.723606824874878,0.525731205940247,-0.447213560342789,0.815988063812256,0.282553791999817,-0.504308342933655,0.702367722988129,0.277496993541718,-0.655496001243591,0.815988063812256,-0.282553732395172,-0.50430828332901,0.723606765270233,-0.525731146335602,-0.447213649749756,0.6024449467659,-0.437701821327209,-0.667440891265869,0.702367842197418,-0.27749690413475,-0.655495882034302,0.684011161327362,0.688736855983734,-0.240354463458061,0.723606824874878,0.525731205940247,-0.447213560342789,0.520878732204437,0.688736855983734,-0.504308342933655,0.542154848575592,0.770581722259521,-0.335070043802261,-0.0165701843798161,0.863364696502686,-0.5043084025383,-0.276393204927444,0.85065084695816,-0.447213590145111,-0.148547187447548,0.959251523017883,-0.240354388952255,0.0143243409693241,0.94208437204361,-0.335069894790649,0.148547202348709,0.959251463413239,0.240354746580124,0.276393175125122,0.850650787353516,0.447213709354401,0.443656623363495,0.863364636898041,0.24035470187664,0.306101739406586,0.942084312438965,0.137036234140396,-0.443656802177429,0.863364636898041,-0.240354478359222,-0.276393204927444,0.85065084695816,-0.447213590145111,-0.494067519903183,0.708216428756714,-0.50430828332901, +-0.565331995487213,0.753742516040802,-0.335070013999939,-0.82622903585434,0.25103497505188,-0.504308342933655,-0.894427180290222,-5.82102046564614e-08,-0.447213560342789,-0.958206057548523,0.155148059129715,-0.240354433655739,-0.891549050807953,0.304743140935898,-0.335070073604584,-0.866398692131042,0.437701851129532,0.240354403853416,-0.723606765270233,0.525731146335602,0.447213649749756,-0.684011101722717,0.688736855983734,0.2403544485569,-0.801384806632996,0.582240164279938,0.137035861611366,-0.958206057548523,-0.15514825284481,-0.240354374051094,-0.894427180290222,-5.82102046564614e-08,-0.447213560342789,-0.82622903585434,-0.251035064458847,-0.50430828332901,-0.891549050807953,-0.304743200540543,-0.335069924592972,-0.494067311286926,-0.708216488361359,-0.50430828332901,-0.276393234729767,-0.850650787353516,-0.447213560342789,-0.443656474351883,-0.86336475610733,-0.240354433655739,-0.565331637859344,-0.753742814064026,-0.335069954395294,-0.684011161327362,-0.688736915588379,0.240354552865028,-0.723606765270233,-0.525731146335602,0.447213619947433,-0.866398811340332,-0.437701910734177,0.240354508161545,-0.801384925842285,-0.582240045070648,0.137036025524139,-0.148547202348709,-0.959251582622528,-0.240354374051094,-0.276393234729767,-0.850650787353516,-0.447213560342789,-0.0165704507380724,-0.863364696502686,-0.504308342933655,0.0143240755423903,-0.94208437204361,-0.335069864988327,0.520878612995148,-0.688736855983734,-0.5043084025383,0.723606765270233,-0.525731146335602,-0.447213649749756,0.684011161327362,-0.688736915588379,-0.2403544485569,0.542154788970947,-0.770581781864166,-0.335069894790649,0.443656504154205,-0.863364636898041,0.240354537963867,0.276393204927444,-0.850650787353516,0.447213590145111,0.148547247052193,-0.959251463413239,0.240354672074318,0.306101739406586,-0.942084312438965,0.137036234140396,0.866398632526398,-0.437701940536499,-0.24035456776619,0.723606765270233,-0.525731146335602,-0.447213649749756,0.815988063812256,-0.282553732395172,-0.50430828332901,0.900401830673218,-0.277497202157974,-0.335070103406906, +0.815988063812256,0.282553791999817,-0.504308342933655,0.723606824874878,0.525731205940247,-0.447213560342789,0.866398692131042,0.437702000141144,-0.240354508161545,0.900401830673218,0.277497142553329,-0.335070043802261,0.958206057548523,0.155148282647133,0.240354388952255,0.894427180290222,7.60056124704533e-08,0.447213590145111,0.958206057548523,-0.155148163437843,0.240354374051094,0.99056613445282,0,0.137035772204399,0.866398692131042,0.437702000141144,-0.240354508161545,0.723606824874878,0.525731205940247,-0.447213560342789,0.684011161327362,0.688736855983734,-0.240354463458061,0.801384747028351,0.582240164279938,-0.137035995721817,0.443656623363495,0.863364636898041,0.24035470187664,0.276393175125122,0.850650787353516,0.447213709354401,0.494067341089249,0.708216428756714,0.504308342933655,0.565331816673279,0.753742635250092,0.335070163011551,0.826228976249695,0.251035183668137,0.5043084025383,0.894427180290222,7.60056124704533e-08,0.447213590145111,0.958206057548523,0.155148282647133,0.240354388952255,0.891548931598663,0.304743349552155,0.335070013999939,-0.148547187447548,0.959251523017883,-0.240354388952255,-0.276393204927444,0.85065084695816,-0.447213590145111,-0.443656802177429,0.863364636898041,-0.240354478359222,-0.306101769208908,0.942084312438965,-0.13703590631485,-0.684011101722717,0.688736855983734,0.2403544485569,-0.723606765270233,0.525731146335602,0.447213649749756,-0.520878612995148,0.688736915588379,0.504308342933655,-0.542154788970947,0.770581781864166,0.335070073604584,0.016570195555687,0.863364636898041,0.5043084025383,0.276393175125122,0.850650787353516,0.447213709354401,0.148547202348709,0.959251463413239,0.240354746580124,-0.0143242459744215,0.94208425283432,0.33507028222084,-0.958206057548523,0.155148059129715,-0.240354433655739,-0.894427180290222,-5.82102046564614e-08,-0.447213560342789,-0.958206057548523,-0.15514825284481,-0.240354374051094,-0.990566074848175,-1.50490848227491e-07,-0.137035861611366,-0.866398811340332,-0.437701910734177,0.240354508161545,-0.723606765270233,-0.525731146335602,0.447213619947433, +-0.815988004207611,-0.282553762197495,0.504308342933655,-0.900401771068573,-0.277497231960297,0.335069954395294,-0.815988063812256,0.282553553581238,0.504308342933655,-0.723606765270233,0.525731146335602,0.447213649749756,-0.866398692131042,0.437701851129532,0.240354403853416,-0.900401890277863,0.277496993541718,0.335069984197617,-0.443656474351883,-0.86336475610733,-0.240354433655739,-0.276393234729767,-0.850650787353516,-0.447213560342789,-0.148547202348709,-0.959251582622528,-0.240354374051094,-0.306101649999619,-0.942084312438965,-0.137035921216011,0.148547247052193,-0.959251463413239,0.240354672074318,0.276393204927444,-0.850650787353516,0.447213590145111,0.0165703538805246,-0.863364696502686,0.50430828332901,-0.0143241165205836,-0.942084312438965,0.335070192813873,-0.520878493785858,-0.688736915588379,0.50430828332901,-0.723606765270233,-0.525731146335602,0.447213619947433,-0.684011161327362,-0.688736915588379,0.240354552865028,-0.542154610157013,-0.770581841468811,0.335070043802261,0.684011161327362,-0.688736915588379,-0.2403544485569,0.723606765270233,-0.525731146335602,-0.447213649749756,0.866398632526398,-0.437701940536499,-0.24035456776619,0.801384747028351,-0.582240164279938,-0.137036055326462,0.958206057548523,-0.155148163437843,0.240354374051094,0.894427180290222,7.60056124704533e-08,0.447213590145111,0.82622903585434,-0.251035064458847,0.5043084025383,0.891549110412598,-0.30474317073822,0.335070013999939,0.494067400693893,-0.708216428756714,0.5043084025383,0.276393204927444,-0.850650787353516,0.447213590145111,0.443656504154205,-0.863364636898041,0.240354537963867,0.565331816673279,-0.753742754459381,0.335070013999939,0.744662761688232,6.92531259005591e-08,0.667440950870514,0.894427180290222,7.60056124704533e-08,0.447213590145111,0.826228976249695,0.251035183668137,0.5043084025383,0.731335937976837,0.188341721892357,0.655496060848236,0.494067341089249,0.708216428756714,0.504308342933655,0.276393175125122,0.850650787353516,0.447213709354401,0.230113446712494,0.708216488361359,0.667440712451935,0.40511891245842,0.637341141700745,0.655496001243591, +0.0815661400556564,0.251035064458847,0.964535355567932,3.30459251074444e-08,0,1,0.26395383477211,0,0.964535355567932,0.259229898452759,0.18834163248539,0.9472736120224,0.230113446712494,0.708216488361359,0.667440712451935,0.276393175125122,0.850650787353516,0.447213709354401,0.016570195555687,0.863364636898041,0.5043084025383,0.0468715466558933,0.753742754459381,0.655495941638947,-0.520878612995148,0.688736915588379,0.504308342933655,-0.723606765270233,0.525731146335602,0.447213649749756,-0.602444887161255,0.437701731920242,0.667440891265869,-0.480958759784698,0.582240223884583,0.655496001243591,-0.213543057441711,0.155148208141327,0.964535295963287,3.30459251074444e-08,0,1,0.0815661400556564,0.251035064458847,0.964535355567932,-0.0990171208977699,0.304743200540543,0.94727349281311,-0.602444887161255,0.437701731920242,0.667440891265869,-0.723606765270233,0.525731146335602,0.447213649749756,-0.815988063812256,0.282553553581238,0.504308342933655,-0.702367782592773,0.277496695518494,0.655496060848236,-0.815988004207611,-0.282553762197495,0.504308342933655,-0.723606765270233,-0.525731146335602,0.447213619947433,-0.602444887161255,-0.437701910734177,0.667440891265869,-0.702367722988129,-0.277496874332428,0.655496060848236,-0.213542938232422,-0.155148178339005,0.964535355567932,3.30459251074444e-08,0,1,-0.213543057441711,0.155148208141327,0.964535295963287,-0.320425659418106,0,0.947273671627045,-0.602444887161255,-0.437701910734177,0.667440891265869,-0.723606765270233,-0.525731146335602,0.447213619947433,-0.520878493785858,-0.688736915588379,0.50430828332901,-0.480958729982376,-0.582240283489227,0.655495941638947,0.0165703538805246,-0.863364696502686,0.50430828332901,0.276393204927444,-0.850650787353516,0.447213590145111,0.230113551020622,-0.708216488361359,0.66744077205658,0.0468717329204082,-0.753742814064026,0.655495882034302,0.0815662890672684,-0.251035034656525,0.964535236358643,3.30459251074444e-08,0,1,-0.213542938232422,-0.155148178339005,0.964535355567932,-0.0990169197320938,-0.304743140935898,0.9472736120224,0.230113551020622,-0.708216488361359,0.66744077205658, +0.276393204927444,-0.850650787353516,0.447213590145111,0.494067400693893,-0.708216428756714,0.5043084025383,0.405118942260742,-0.6373410820961,0.655496001243591,0.82622903585434,-0.251035064458847,0.5043084025383,0.894427180290222,7.60056124704533e-08,0.447213590145111,0.744662761688232,6.92531259005591e-08,0.667440950870514,0.731335997581482,-0.188341662287712,0.655496120452881,0.26395383477211,0,0.964535355567932,3.30459251074444e-08,0,1,0.0815662890672684,-0.251035034656525,0.964535236358643,0.259230047464371,-0.188341647386551,0.947273552417755 + } + NormalsW: *240 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *720 { + a: -0.034010998904705,0.987891137599945,0.151375144720078,-1.28784847674979e-07,1,6.60918830774904e-09,0.0276072155684233,0.967957735061646,0.249591112136841,-0.0179690476506948,0.952344119548798,0.304496049880981,0.0133047234266996,0.688071846961975,0.725520670413971,0.0322501361370087,0.473288625478745,0.880316853523254,-0.141994655132294,0.497233629226685,0.855918407440186,0.0203685071319342,0.656802237033844,0.753787815570831,-0.48936328291893,0.724989235401154,0.48467943072319,-0.447213709354401,0.850650787353516,0.276393234729767,-0.268028408288956,0.898606777191162,0.347371011972427,-0.206844687461853,0.80189836025238,0.560512542724609,0.0276072155684233,0.967957735061646,0.249591112136841,-1.28784847674979e-07,1,6.60918830774904e-09,-1.40317794716793e-07,1,4.49264376811698e-08,0.0819980949163437,0.981552362442017,0.172717556357384,9.27814447493347e-09,1,-2.92169186622004e-08,-4.20741486095721e-09,1,-1.2174714925095e-07,0.210894718766212,0.967957735061646,0.136313274502754,0.117812596261501,0.981552362442017,0.150583043694496,0.519481241703033,0.705592095851898,0.481953501701355,0.679604947566986,0.502025485038757,0.534890174865723,0.376895189285278,0.697178959846497,0.609829187393188,0.335070043802261,0.770581901073456,0.542154729366302,-1.40317794716793e-07,1,4.49264376811698e-08,-1.28784847674979e-07,1,6.60918830774904e-09,-0.0276074707508087,0.967957735061646,-0.249591141939163,-0.0819985046982765,0.981552362442017,-0.172717437148094,-0.376895219087601,0.697178959846497,-0.609829068183899,-0.630854725837708,0.511639773845673,-0.583306968212128,-0.519481182098389,0.705591976642609,-0.481953680515289,-0.335070163011551,0.770581841468811,-0.542154729366302,-0.210894703865051,0.967957735061646,-0.136313438415527,-4.20741486095721e-09,1,-1.2174714925095e-07,9.27814447493347e-09,1,-2.92169186622004e-08,-0.117812499403954,0.981552362442017,-0.150583282113075,-0.0276074707508087,0.967957735061646,-0.249591141939163,-1.28784847674979e-07,1,6.60918830774904e-09,0.0340110845863819,0.9878910779953,-0.151375159621239, +0.0179689545184374,0.952344059944153,-0.304496139287949,0.268028259277344,0.898606896400452,-0.34737104177475,0.447213649749756,0.850650787353516,-0.276393175125122,0.489363253116608,0.724989295005798,-0.48467954993248,0.206844255328178,0.80189847946167,-0.560512602329254,-0.0251340121030807,0.504577875137329,-0.863000333309174,0.886968970298767,-0.046636912971735,-0.459468364715576,-0.0133047755807638,0.688071846961975,-0.725520610809326,-0.0203684940934181,0.656802177429199,-0.753787815570831,0.0340110845863819,0.9878910779953,-0.151375159621239,-1.28784847674979e-07,1,6.60918830774904e-09,-0.034010998904705,0.987891137599945,0.151375144720078,5.09250867253286e-07,1,1.72259547071008e-07,-0.268028408288956,0.898606777191162,0.347371011972427,-0.447213709354401,0.850650787353516,0.276393234729767,-0.240354612469673,0.959251463413239,0.148547306656837,-0.205689504742622,0.960718393325806,0.186312079429626,0.240354582667351,0.959251523017883,-0.148547261953354,0.447213649749756,0.850650787353516,-0.276393175125122,0.268028259277344,0.898606896400452,-0.34737104177475,0.205689460039139,0.960718393325806,-0.186311975121498,-0.652360439300537,0.724989235401154,0.220944613218307,-0.447213709354401,0.850650787353516,0.276393234729767,-0.48936328291893,0.724989235401154,0.48467943072319,-0.655496001243591,0.637341201305389,0.40511879324913,-0.141994655132294,0.497233629226685,0.855918407440186,0.0322501361370087,0.473288625478745,0.880316853523254,-0.315919697284698,0.184282243251801,0.930717349052429,-0.641049027442932,0.265826642513275,0.7199946641922,-0.973742485046387,0.184282302856445,-0.133662194013596,-0.447213590145111,0.525731205940247,-0.723606824874878,-0.829058647155762,0.497233629226685,-0.25577437877655,-0.930668652057648,0.265826642513275,0.251380324363708,0.829058587551117,0.497233718633652,0.255774438381195,0.679604947566986,0.502025485038757,0.534890174865723,0.519481241703033,0.705592095851898,0.481953501701355,0.665099143981934,0.656802177429199,0.355322390794754,0.210894718766212,0.967957735061646,0.136313274502754, +-4.20741486095721e-09,1,-1.2174714925095e-07,0.150604128837585,0.98789119720459,0.0372766964137554,0.280385553836823,0.952344119548798,0.120102845132351,0.4305639564991,0.898606836795807,-0.0843830481171608,0.447213649749756,0.850650906562805,-0.276393234729767,0.652360498905182,0.724989295005798,-0.220944687724113,0.593841373920441,0.801898539066315,0.0656611993908882,-0.150604337453842,0.987891137599945,-0.0372766256332397,-4.20741486095721e-09,1,-1.2174714925095e-07,-0.210894703865051,0.967957735061646,-0.136313438415527,-0.280385553836823,0.952344059944153,-0.120103023946285,-0.519481182098389,0.705591976642609,-0.481953680515289,-0.630854725837708,0.511639773845673,-0.583306968212128,-0.857366561889648,0.33079531788826,0.394331157207489,-0.665099263191223,0.656801879405975,-0.355322957038879,-0.652360379695892,0.724989235401154,0.220944687724113,-0.447213649749756,0.850650787353516,0.276393234729767,-0.430563986301422,0.898606777191162,0.0843827128410339,-0.593841195106506,0.80189847946167,-0.0656611546874046,-0.61200088262558,-0.101741217076778,0.784285485744476,0.188639044761658,-0.504308879375458,0.84266722202301,-0.625622391700745,-0.384490460157394,0.678795754909515,-0.999414086341858,-0.0239074006676674,0.0244937129318714,0.489363253116608,0.724989295005798,-0.48467954993248,0.447213649749756,0.850650787353516,-0.276393175125122,0.652360498905182,0.724989235401154,-0.220944434404373,0.655496120452881,0.6373410820961,-0.405118733644485,-0.886920273303986,-0.384490460157394,0.256007134914398,-0.447213560342789,-0.525731086730957,-0.723606824874878,-0.50430828332901,-0.282553791999817,-0.815988063812256,-0.468859225511551,-0.0239071771502495,0.882949352264404,0.430564075708389,0.898606777191162,-0.0843827277421951,0.447213649749756,0.850650787353516,-0.276393175125122,0.240354582667351,0.959251523017883,-0.148547261953354,0.258629858493805,0.960718274116516,-0.100653067231178,-0.240354612469673,0.959251463413239,0.148547306656837,-0.447213709354401,0.850650787353516,0.276393234729767,-0.430564194917679,0.898606836795807,0.0843827798962593, +-0.258629828691483,0.960718274116516,0.100653000175953,-0.150604352355003,0.987891137599945,-0.0372766777873039,-9.86070958219898e-08,1,2.72604694373513e-08,0.150604262948036,0.987891137599945,0.0372765362262726,6.29280805242161e-08,1,-4.54877039146595e-07,-0.430564194917679,0.898606836795807,0.0843827798962593,-0.447213709354401,0.850650787353516,0.276393234729767,-0.652360439300537,0.724989235401154,0.220944613218307,-0.593841433525085,0.801898419857025,-0.0656615421175957,-0.829058647155762,0.497233629226685,-0.25577437877655,-0.447213590145111,0.525731205940247,-0.723606824874878,-0.519481301307678,0.705592036247253,-0.481953471899033,-0.665099263191223,0.65680205821991,-0.355322390794754,-0.210894912481308,0.967957735061646,-0.13631334900856,-9.86070958219898e-08,1,2.72604694373513e-08,-0.150604352355003,0.987891137599945,-0.0372766777873039,-0.280385792255402,0.952344059944153,-0.120102882385254,0.973742604255676,0.184282258152962,0.133662268519402,0.679604947566986,0.502025485038757,0.534890174865723,0.829058587551117,0.497233718633652,0.255774438381195,0.930668711662292,0.265826731920242,-0.251380383968353,0.652360498905182,0.724989295005798,-0.220944687724113,0.447213649749756,0.850650906562805,-0.276393234729767,0.489363312721252,0.724989175796509,-0.48467954993248,0.655496060848236,0.637341201305389,-0.40511879324913,0.141994848847389,0.497233659029007,-0.855918407440186,-0.447213590145111,0.525731205940247,-0.723606824874878,0.315919816493988,0.184282541275024,-0.93071722984314,0.641049087047577,0.265826910734177,-0.71999454498291,0.150604128837585,0.98789119720459,0.0372766964137554,-4.20741486095721e-09,1,-1.2174714925095e-07,-0.150604337453842,0.987891137599945,-0.0372766256332397,-2.55733567655625e-07,1,7.50388608139474e-07,-0.430563986301422,0.898606777191162,0.0843827128410339,-0.447213649749756,0.850650787353516,0.276393234729767,-0.240354597568512,0.959251463413239,0.148547291755676,-0.258630096912384,0.960718274116516,0.100652627646923,0.240354388952255,0.959251523017883,-0.14854721724987,0.447213649749756,0.850650906562805,-0.276393234729767, +0.4305639564991,0.898606836795807,-0.0843830481171608,0.258629500865936,0.960718333721161,-0.100653499364853,-0.857366561889648,0.33079531788826,0.394331157207489,0.886968970298767,-0.046636912971735,-0.459468364715576,0.164180234074593,-0.263600498437881,0.950557589530945,0.468859255313873,-0.0239074192941189,-0.882949411869049,-0.50430828332901,-0.282553791999817,-0.815988063812256,-0.447213560342789,-0.525731086730957,-0.723606824874878,0.625622451305389,-0.384490519762039,-0.678795754909515,0.999414086341858,-0.0239074490964413,-0.0244936998933554,-0.48936328291893,0.724989175796509,0.484679728746414,-0.447213649749756,0.850650787353516,0.276393234729767,-0.652360379695892,0.724989235401154,0.220944687724113,-0.655496060848236,0.637341022491455,0.405118942260742,0.652360498905182,0.724989235401154,-0.220944434404373,0.447213649749756,0.850650787353516,-0.276393175125122,0.430564075708389,0.898606777191162,-0.0843827277421951,0.593841433525085,0.801898419857025,0.0656615346670151,0.150604262948036,0.987891137599945,0.0372765362262726,-9.86070958219898e-08,1,2.72604694373513e-08,0.210894733667374,0.967957735061646,0.136313393712044,0.280385613441467,0.952344179153442,0.120102785527706,0.519481301307678,0.705592095851898,0.481953412294388,0.447213798761368,0.525731146335602,0.723606765270233,0.760650813579559,0.504577875137329,0.408425837755203,0.665099382400513,0.656801998615265,0.355322420597076,-9.19884115546665e-08,1,-1.12786568973178e-09,-9.86070958219898e-08,1,2.72604694373513e-08,-0.210894912481308,0.967957735061646,-0.13631334900856,-0.117812655866146,0.981552362442017,-0.150583118200302,-0.519481301307678,0.705592036247253,-0.481953471899033,-0.447213590145111,0.525731205940247,-0.723606824874878,-0.198753237724304,0.705591917037964,-0.680174350738525,-0.335070133209229,0.770581781864166,-0.542154729366302,-0.0276073031127453,0.967957675457001,-0.249591156840324,5.02944139668671e-08,1,-1.66202539097105e-15,5.66121123313224e-08,1,-1.54924162387715e-08,-0.0819982066750526,0.981552302837372,-0.172717556357384, +-0.198753237724304,0.705591917037964,-0.680174350738525,-0.447213590145111,0.525731205940247,-0.723606824874878,0.141994848847389,0.497233659029007,-0.855918407440186,-0.0203684158623219,0.65680193901062,-0.753787994384766,0.489363312721252,0.724989175796509,-0.48467954993248,0.447213649749756,0.850650906562805,-0.276393234729767,0.268028318881989,0.898606896400452,-0.347370833158493,0.20684452354908,0.80189836025238,-0.560512661933899,0.0340109393000603,0.987891137599945,-0.151375219225883,5.02944139668671e-08,1,-1.66202539097105e-15,-0.0276073031127453,0.967957675457001,-0.249591156840324,0.017968999221921,0.952344119548798,-0.304496169090271,0.268028318881989,0.898606896400452,-0.347370833158493,0.447213649749756,0.850650906562805,-0.276393234729767,0.240354388952255,0.959251523017883,-0.14854721724987,0.205689534544945,0.960718393325806,-0.186311528086662,-0.240354597568512,0.959251463413239,0.148547291755676,-0.447213649749756,0.850650787353516,0.276393234729767,-0.268028140068054,0.898606777191162,0.347371190786362,-0.205689057707787,0.960718393325806,0.186312302947044,-0.0340111777186394,0.987891137599945,0.151375129818916,5.02944139668671e-08,1,-1.66202539097105e-15,0.0340109393000603,0.987891137599945,-0.151375219225883,-6.09921244176803e-07,1,-2.06312506634276e-07,-0.268028140068054,0.898606777191162,0.347371190786362,-0.447213649749756,0.850650787353516,0.276393234729767,-0.48936328291893,0.724989175796509,0.484679728746414,-0.206844240427017,0.80189836025238,0.560512900352478,0.0251339413225651,0.504577815532684,0.863000333309174,0.447213798761368,0.525731146335602,0.723606765270233,0.198753342032433,0.705591976642609,0.680174291133881,0.0203683730214834,0.656801879405975,0.753788113594055,0.0276074111461639,0.96795779466629,0.249591186642647,5.02944139668671e-08,1,-1.66202539097105e-15,-0.0340111777186394,0.987891137599945,0.151375129818916,-0.0179690588265657,0.952344119548798,0.304496049880981,0.198753342032433,0.705591976642609,0.680174291133881,0.447213798761368,0.525731146335602,0.723606765270233, +0.519481301307678,0.705592095851898,0.481953412294388,0.335070103406906,0.770581841468811,0.542154669761658,0.210894733667374,0.967957735061646,0.136313393712044,-9.86070958219898e-08,1,2.72604694373513e-08,-9.19884115546665e-08,1,-1.12786568973178e-09,0.117812409996986,0.981552362442017,0.150583282113075,5.66121123313224e-08,1,-1.54924162387715e-08,5.02944139668671e-08,1,-1.66202539097105e-15,0.0276074111461639,0.96795779466629,0.249591186642647,0.0819985121488571,0.981552362442017,0.172717496752739 + } + BinormalsW: *240 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *720 { + a: -0.976341426372528,-0.000479729264043272,-0.21623383462429,-1,-1.28784847674979e-07,3.30459180020171e-08,-0.996285498142242,0.00626994157209992,0.0858829841017723,-0.99492359161377,0.0131286727264524,-0.0997741743922234,-0.973072946071625,-0.158071964979172,0.167757228016853,-0.960503339767456,-0.228890910744667,0.158247366547585,-0.989728689193726,-0.0857918038964272,-0.114353895187378,-0.998693227767944,-0.0219797659665346,0.046137984842062,-0.699434697628021,0.0056692105717957,-0.71467399597168,-0.525731086730957,1.50124250808403e-08,-0.85065084695816,-0.751811683177948,0.0303788091987371,-0.658677577972412,-0.851994097232819,0.133997544646263,-0.506113350391388,-0.996285498142242,0.00626994157209992,0.0858829841017723,-1,-1.28784847674979e-07,3.30459180020171e-08,-0.964535474777222,-1.47199997968528e-07,0.263953685760498,-0.962328553199768,0.0329010970890522,0.269891262054443,-0.667440891265869,2.79493654886664e-08,0.744662880897522,-0.447213619947433,1.07012354533254e-07,0.894427239894867,-0.522368609905243,-0.00627000210806727,0.852696716785431,-0.671764731407166,-0.0329011119902134,0.740033566951752,-0.697163224220276,0.0238610804080963,0.716515183448792,-0.679517388343811,0.156088560819626,0.716862916946411,-0.897216737270355,0.111225374042988,0.42735356092453,-0.850650787353516,-3.3779734565087e-08,0.525731146335602,-0.964535474777222,-1.47199997968528e-07,0.263953685760498,-1,-1.28784847674979e-07,3.30459180020171e-08,-0.996285557746887,-0.00627017812803388,0.0858830809593201,-0.962328493595123,-0.0329015031456947,0.269891411066055,-0.89721667766571,-0.111225344240665,0.42735368013382,-0.725002884864807,-0.120904684066772,0.678050935268402,-0.69716340303421,-0.0238611251115799,0.716515064239502,-0.850650787353516,-5.59097586005919e-08,0.525731205940247,-0.522368609905243,0.00627017254009843,0.85269683599472,-0.447213619947433,1.07012354533254e-07,0.894427239894867,-0.667440891265869,2.79493654886664e-08,0.744662880897522,-0.67176479101181,0.032901331782341,0.740033507347107,-0.996285557746887,-0.00627017812803388,0.0858830809593201, +-1,-1.28784847674979e-07,3.30459180020171e-08,-0.976341485977173,0.000479800102766603,-0.216233909130096,-0.99492359161377,-0.0131287863478065,-0.0997741967439651,-0.751811802387238,-0.0303789097815752,-0.658677577972412,-0.525731146335602,1.00583235962404e-07,-0.850650727748871,-0.699434876441956,-0.00566919799894094,-0.714673936367035,-0.851994216442108,-0.133997827768326,-0.506113052368164,-0.999546766281128,0.00162500876467675,0.0300608985126019,-0.369990468025208,0.523658454418182,-0.767390966415405,-0.97307288646698,0.158071979880333,0.16775731742382,-0.998693227767944,0.021979970857501,0.0461381450295448,-0.976341485977173,0.000479800102766603,-0.216233909130096,-1,-1.28784847674979e-07,3.30459180020171e-08,-0.976341426372528,-0.000479729264043272,-0.21623383462429,-0.947273731231689,5.37596292815579e-07,-0.320425480604172,-0.751811683177948,0.0303788091987371,-0.658677577972412,-0.525731086730957,1.50124250808403e-08,-0.85065084695816,-0.525731086730957,-8.40113578703949e-09,-0.850650787353516,-0.681448042392731,-0.00396904442459345,-0.731855750083923,-0.525731027126312,3.73383812757311e-09,-0.850650906562805,-0.525731146335602,1.00583235962404e-07,-0.850650727748871,-0.751811802387238,-0.0303789097815752,-0.658677577972412,-0.681447923183441,0.00396904768422246,-0.731855869293213,-0.326427072286606,-0.00566917099058628,-0.945205330848694,-0.525731086730957,1.50124250808403e-08,-0.85065084695816,-0.699434697628021,0.0056692105717957,-0.71467399597168,-0.525731086730957,6.58712622225721e-08,-0.85065084695816,-0.989728689193726,-0.0857918038964272,-0.114353895187378,-0.960503339767456,-0.228890910744667,0.158247366547585,-0.937085151672363,-0.214188128709793,-0.27567183971405,-0.767366230487823,-0.204482778906822,-0.607730090618134,0.172508761286736,0.214188471436501,-0.961438477039337,0.85065084695816,7.12562240323678e-08,-0.525731086730957,0.340338975191116,0.085792139172554,-0.936380863189697,0.200393602252007,-0.204483300447464,0.958138406276703,-0.340338915586472,0.0857918635010719,0.936380863189697,-0.679517388343811,0.156088560819626,0.716862916946411, +-0.697163224220276,0.0238610804080963,0.716515183448792,-0.487896323204041,0.0219796784222126,0.872624814510345,-0.522368609905243,-0.00627000210806727,0.852696716785431,-0.447213619947433,1.07012354533254e-07,0.894427239894867,-0.243227422237396,0.000479616137454286,0.969969153404236,-0.355702519416809,-0.0131287705153227,0.934507012367249,0.252918750047684,-0.0303785856813192,0.96701043844223,0.525731146335602,-3.0024846608967e-08,0.850650727748871,0.326427102088928,-0.00566913420334458,0.945205271244049,0.0716582611203194,-0.133997425436974,0.98838746547699,-0.24322734773159,-0.000479720212751999,0.969969213008881,-0.447213619947433,1.07012354533254e-07,0.894427239894867,-0.522368609905243,0.00627017254009843,0.85269683599472,-0.355702459812164,0.0131289828568697,0.934507131576538,-0.69716340303421,-0.0238611251115799,0.716515064239502,-0.725002884864807,-0.120904684066772,0.678050935268402,0.260943502187729,-0.381019413471222,0.886979579925537,-0.487896680831909,-0.0219794660806656,0.872624635696411,0.326427221298218,0.00566914491355419,0.945205390453339,0.525731146335602,1.3511183283299e-08,0.85065084695816,0.252918660640717,0.0303789246827364,0.967010498046875,0.0716584250330925,0.133997485041618,0.98838746547699,-0.776780962944031,0.263600468635559,-0.571949362754822,-0.942349255084991,0.148545563220978,0.299853473901749,-0.779950022697449,0.326754540205002,-0.533769130706787,-0.0310857929289341,0.334522694349289,-0.941874861717224,-0.699434876441956,-0.00566919799894094,-0.714673936367035,-0.525731146335602,1.00583235962404e-07,-0.850650727748871,-0.326426923274994,0.00566928833723068,-0.945205390453339,-0.525730967521667,-7.91186565152202e-08,-0.850650906562805,-0.128613501787186,-0.326754510402679,-0.936317265033722,0.85065084695816,3.10682786164307e-08,-0.525731086730957,0.85065084695816,-1.57892952046268e-08,-0.525731027126312,-0.828536510467529,-0.334523022174835,-0.44902291893959,-0.252918750047684,0.0303789786994457,-0.967010498046875,-0.525731146335602,1.00583235962404e-07,-0.850650727748871,-0.525731027126312,3.73383812757311e-09,-0.850650906562805, +-0.349838882684708,-0.00396906631067395,-0.936801493167877,-0.525731086730957,-8.40113578703949e-09,-0.850650787353516,-0.525731086730957,1.50124250808403e-08,-0.85065084695816,-0.252918690443039,-0.0303788986057043,-0.96701043844223,-0.349838823080063,0.00396902998909354,-0.936801493167877,0.243227377533913,0.000479681097203866,-0.969969213008881,0.447213619947433,6.84809364770445e-08,-0.894427239894867,0.243227332830429,-0.000479789159726351,-0.969969213008881,0.13703578710556,-4.59209218206524e-07,-0.990566194057465,-0.252918690443039,-0.0303788986057043,-0.96701043844223,-0.525731086730957,1.50124250808403e-08,-0.85065084695816,-0.326427072286606,-0.00566917099058628,-0.945205330848694,-0.0716581642627716,-0.133997812867165,-0.988387525081635,0.340338975191116,0.085792139172554,-0.936380863189697,0.85065084695816,7.12562240323678e-08,-0.525731086730957,0.697163283824921,0.023861275985837,-0.716515123844147,0.487896412611008,0.0219798665493727,-0.872624754905701,0.522368669509888,-0.00626996019855142,-0.852696716785431,0.447213619947433,6.84809364770445e-08,-0.894427239894867,0.243227377533913,0.000479681097203866,-0.969969213008881,0.355702489614487,-0.0131287276744843,-0.934507012367249,-0.172508776187897,0.214188128709793,0.961438596248627,-0.679517388343811,0.156088560819626,0.716862916946411,-0.340338915586472,0.0857918635010719,0.936380863189697,0.200393676757813,0.204482987523079,0.958138346672058,0.326427102088928,-0.00566913420334458,0.945205271244049,0.525731146335602,-3.0024846608967e-08,0.850650727748871,0.699434757232666,0.00566920125856996,0.71467387676239,0.525731146335602,2.04342009979541e-09,0.850650906562805,0.989728629589081,-0.0857919231057167,0.11435404419899,0.85065084695816,7.12562240323678e-08,-0.525731086730957,0.937085092067719,-0.214188277721405,0.275671929121017,0.767366230487823,-0.20448312163353,0.607730031013489,-0.243227422237396,0.000479616137454286,0.969969153404236,-0.447213619947433,1.07012354533254e-07,0.894427239894867,-0.24322734773159,-0.000479720212751999,0.969969213008881, +-0.137035876512527,-7.78354262820358e-07,0.990566194057465,0.252918660640717,0.0303789246827364,0.967010498046875,0.525731146335602,1.3511183283299e-08,0.85065084695816,0.525731086730957,7.46767625514622e-09,0.85065084695816,0.349838644266129,-0.0039686243981123,0.936801552772522,0.525731086730957,4.48060575308773e-08,0.85065084695816,0.525731146335602,-3.0024846608967e-08,0.850650727748871,0.252918750047684,-0.0303785856813192,0.96701043844223,0.34983891248703,0.00396962184458971,0.936801493167877,0.260943502187729,-0.381019413471222,0.886979579925537,-0.369990468025208,0.523658454418182,-0.767390966415405,0.975181221961975,-0.101741202175617,-0.196647226810455,0.828536570072174,-0.334522813558578,0.44902303814888,0.85065084695816,-1.57892952046268e-08,-0.525731027126312,0.85065084695816,3.10682786164307e-08,-0.525731086730957,0.779950022697449,0.326754450798035,0.533769190311432,0.0310858022421598,0.334522992372513,0.941874742507935,0.699434816837311,-0.00566929578781128,0.714673817157745,0.525731146335602,1.3511183283299e-08,0.85065084695816,0.326427221298218,0.00566914491355419,0.945205390453339,0.525731265544891,-2.97201374621636e-08,0.85065084695816,-0.326426923274994,0.00566928833723068,-0.945205390453339,-0.525731146335602,1.00583235962404e-07,-0.850650727748871,-0.252918750047684,0.0303789786994457,-0.967010498046875,-0.0716582089662552,0.133997842669487,-0.988387525081635,0.243227332830429,-0.000479789159726351,-0.969969213008881,0.447213619947433,6.84809364770445e-08,-0.894427239894867,0.522368669509888,0.00627008872106671,-0.852696657180786,0.355702430009842,0.013128723949194,-0.934507071971893,0.697163283824921,-0.0238613057881594,-0.716515183448792,0.850650727748871,-9.28839298808271e-08,-0.525731265544891,0.473897993564606,-0.0016250868793577,-0.880578219890594,0.487896293401718,-0.0219797883182764,-0.872624814510345,0.667441010475159,6.05569567824205e-08,-0.744662821292877,0.447213619947433,6.84809364770445e-08,-0.894427239894867,0.522368669509888,-0.00626996019855142,-0.852696716785431,0.67176479101181,-0.0329011082649231,-0.740033507347107, +0.697163283824921,0.023861275985837,-0.716515123844147,0.85065084695816,7.12562240323678e-08,-0.525731086730957,0.952651500701904,-0.0238612722605467,-0.303126513957977,0.85065084695816,-8.85299922259719e-09,-0.525731265544891,0.996285557746887,0.00627003377303481,-0.0858829692006111,1,-5.02944139668671e-08,-3.30459286601581e-08,0.964535415172577,-5.86936685920136e-08,-0.26395383477211,0.962328612804413,0.0329011902213097,-0.269891411066055,0.952651500701904,-0.0238612722605467,-0.303126513957977,0.85065084695816,7.12562240323678e-08,-0.525731086730957,0.989728629589081,-0.0857919231057167,0.11435404419899,0.998693227767944,-0.021979795768857,-0.0461378693580627,0.699434757232666,0.00566920125856996,0.71467387676239,0.525731146335602,-3.0024846608967e-08,0.850650727748871,0.751811802387238,0.03037871979177,0.658677637577057,0.851994156837463,0.133997723460197,0.506113231182098,0.976341485977173,-0.000479626382002607,0.216234028339386,1,-5.02944139668671e-08,-3.30459286601581e-08,0.996285557746887,0.00627003377303481,-0.0858829692006111,0.99492347240448,0.0131287761032581,0.0997743010520935,0.751811802387238,0.03037871979177,0.658677637577057,0.525731146335602,-3.0024846608967e-08,0.850650727748871,0.525731086730957,4.48060575308773e-08,0.85065084695816,0.681447923183441,-0.0039694719016552,0.731855809688568,0.525731086730957,7.46767625514622e-09,0.85065084695816,0.525731146335602,1.3511183283299e-08,0.85065084695816,0.751811921596527,-0.0303790625184774,0.658677458763123,0.68144816160202,0.00396861648187041,0.731855630874634,0.976341485977173,0.000479893933515996,0.216233938932419,1,-5.02944139668671e-08,-3.30459286601581e-08,0.976341485977173,-0.000479626382002607,0.216234028339386,0.947273671627045,6.43870123440138e-07,0.320425659418106,0.751811921596527,-0.0303790625184774,0.658677458763123,0.525731146335602,1.3511183283299e-08,0.85065084695816,0.699434816837311,-0.00566929578781128,0.714673817157745,0.851994216442108,-0.133998021483421,0.506112992763519,0.999546766281128,0.00162496417760849,-0.0300607904791832, +0.850650727748871,-9.28839298808271e-08,-0.525731265544891,0.95265144109726,0.0238612629473209,-0.303126633167267,0.998693227767944,0.0219799671322107,-0.0461379550397396,0.996285557746887,-0.00627009244635701,-0.085883155465126,1,-5.02944139668671e-08,-3.30459286601581e-08,0.976341485977173,0.000479893933515996,0.216233938932419,0.99492359161377,-0.0131286503747106,0.0997741371393204,0.95265144109726,0.0238612629473209,-0.303126633167267,0.850650727748871,-9.28839298808271e-08,-0.525731265544891,0.697163283824921,-0.0238613057881594,-0.716515183448792,0.85065084695816,1.25598136335725e-08,-0.525731265544891,0.522368669509888,0.00627008872106671,-0.852696657180786,0.447213619947433,6.84809364770445e-08,-0.894427239894867,0.667441010475159,6.05569567824205e-08,-0.744662821292877,0.67176479101181,0.0329013913869858,-0.740033507347107,0.964535415172577,-5.86936685920136e-08,-0.26395383477211,1,-5.02944139668671e-08,-3.30459286601581e-08,0.996285557746887,-0.00627009244635701,-0.085883155465126,0.962328553199768,-0.0329014584422112,-0.269891619682312 + } + TangentsW: *240 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *140 { + a: 1,0.5,0.838104069232941,0.676208138465881,0.0881041139364243,0.823791801929474,0.176208198070526,0.5,0.0881041139364243,0.176208227872849,0.838104128837585,0.323791772127151,0.676208198070526,0.5,0.588104069232941,0.823791861534119,0.338104099035263,0.676208138465881,0.338104099035263,0.323791772127151,0.588104128837585,0.176208227872849,0.5,0.5,0.0300342254340649,0.666666686534882,0.926208198070526,0.800000011920929,0.926208198070526,0.599999964237213,0.963104069232941,0.695913255214691,0.0881040766835213,0.5,0.146173998713493,0.666666686534882,0.0881040766835213,0.616139769554138,0.0300342254340649,0.333333313465118,0.146173998713493,0.333333313465118,0.0881040766835213,0.383860260248184,0.926208198070526,0.399999976158142,0.926208198070526,0.19999997317791,0.963104128837585,0.304086744785309,0.838104069232941,0.5,0.89617395401001,0.5,0.25,1,0.75,0.800000011920929,0.838104128837585,0.883860290050507,0.25,0.599999964237213,0.25,0.800000011920929,0.213104113936424,0.695913255214691,0.25,0.19999997317791,0.25,0.39999994635582,0.213104113936424,0.304086685180664,0.75,0.200000047683716,0.75,1,0.838104069232941,0.116139747202396,0.75,0.599999964237213,0.75,0.399999976158142,0.780034184455872,0.5,0.64617395401001,0.666666686534882,0.713104128837585,0.695913255214691,0.426208168268204,0.800000011920929,0.338104069232941,0.883860290050507,0.338104069232941,0.499999940395355,0.280034214258194,0.5,0.426208198070526,0.19999997317791,0.338104099035263,0.116139747202396,0.646174013614655,0.333333313465118,0.713104128837585,0.304086744785309,0.530034184455872,0.666666686534882,0.588104069232941,0.5,0.588104069232941,0.616139769554138,0.426208198070526,0.599999964237213,0.463104099035263,0.695913255214691,0.426208198070526,0.399999976158142,0.396173983812332,0.5,0.530034244060516,0.333333313465118,0.463104099035263,0.304086744785309,0.588104128837585,0.383860260248184,1.03003418445587,0.666666686534882,1.08810412883759,0.823791801929474,1.08810412883759,0.5,1.08810412883759,0.616139769554138,1.03003418445587, +0.333333313465118,1.08810412883759,0.383860260248184,1.08810412883759,0.176208227872849,1.25,1 + } + UVIndex: *240 { + a: 14,0,62,15,62,63,13,15,13,1,14,15,62,0,64,65,16,3,17,18,17,2,12,18,64,0,66,67,19,4,20,21,20,3,16,21,66,0,22,24,22,5,23,24,23,68,66,24,22,0,14,26,14,1,25,26,25,5,22,26,28,1,13,29,13,63,69,29,69,7,28,29,31,2,17,32,17,3,30,32,30,8,31,32,34,3,20,35,20,4,33,35,33,9,34,35,37,68,23,38,23,5,36,38,36,10,37,38,40,5,25,41,25,1,39,41,39,6,40,41,39,1,28,43,28,7,42,43,42,6,39,43,27,2,31,45,31,8,44,45,44,7,27,45,30,3,34,47,34,9,46,47,46,8,30,47,33,68,37,49,37,10,48,49,48,9,33,49,36,5,40,51,40,6,50,51,50,10,36,51,53,6,42,54,42,7,52,54,52,11,53,54,52,7,44,56,44,8,55,56,55,11,52,56,55,8,46,58,46,9,57,58,57,11,55,58,57,9,48,60,48,10,59,60,59,11,57,60,59,10,50,61,50,6,53,61,53,11,59,61 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *120 { + a: 1,1,0,0,1,1,0,1,1,1,0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,0,1,1,1,0,0,1,0,1,1,1,0,0,1,0,1,1,1,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2060818024144, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 2060814328992, "Geometry::", "Mesh" { + Vertices: *93 { + a: -0.276393264532089,0.850650906562805,-0.447213649749756,-0.276393294334412,-0.850650787353516,-0.447213590145111,0.187592402100563,-0.577350199222565,-0.794654488563538,0.688190996646881,-0.499999970197678,0.525731086730957,-0.42532542347908,0.309016942977905,0.85065084695816,-0.425325393676758,-0.309017032384872,0.85065084695816,-0.303530961275101,-0.934172332286835,0.187592476606369,-0.16245986521244,0.499999970197678,-0.85065084695816,0.303530991077423,0.934172332286835,-0.187592476606369,0.187592461705208,0.577350199222565,-0.794654488563538,-0.491123467683792,0.356822043657303,-0.794654488563538,-0.162459895014763,-0.499999970197678,-0.85065084695816,-0.794654488563538,-0.577350318431854,-0.187592461705208,-0.491123467683792,-0.356822073459625,-0.794654488563538,0.85065084695816,-3.50347306721233e-08,-0.525731086730957,0.607061982154846,-2.50023290959689e-08,-0.794654488563538,-3.50347306721233e-08,0.999999940395355,0,0.794654488563538,0.577350258827209,0.187592476606369,-0.794654488563538,0.57735013961792,-0.187592461705208,-0.303531020879745,0.934172332286835,0.187592476606369,-0.587785243988037,-0.80901700258255,0,-0.982246994972229,-1.00009337700158e-07,0.18759249150753,0.303531020879745,-0.934172332286835,-0.187592476606369,0.982246935367584,-2.50023290959689e-08,-0.187592461705208,0.95105654001236,-0.309017032384872,0,0.49112343788147,0.356822103261948,0.794654488563538,-0.607061982154846,-7.50069872879067e-08,0.794654428958893,0.794654488563538,-0.577350258827209,0.187592476606369,0.491123467683792,-0.356822043657303,0.794654428958893,-0.187592476606369,0.577350199222565,0.794654428958893,-0.187592417001724,-0.577350258827209,0.794654488563538 + } + PolygonVertexIndex: *152 { + a: 9,13,-8,7,0,8,-10,7,13,-11,13,12,-11,10,0,-8,11,1,12,-14,11,13,15,-3,2,1,-12,15,13,-10,9,14,-16,14,2,-16,17,9,-9,8,0,-17,16,17,-9,19,0,10,-19,10,12,-19,18,4,-20,12,1,-21,20,5,21,-13,22,1,-3,2,27,-23,27,6,-23,24,2,14,-24,14,9,-24,23,3,-25,23,9,-18,17,16,-26,25,3,23,-18,16,0,-20,18,12,-22,21,5,-27,26,4,18,-22,20,1,22,-7,6,5,-21,27,2,-25,24,3,-28,3,6,-28,28,3,-26,25,16,-30,29,28,-26,29,16,-20,19,4,-30,5,29,4,-27,5,6,-31,30,29,-6,30,6,3,-29,28,29,-31 + } + Edges: *76 { + a: 0,1,2,3,4,5,8,9,10,11,13,19,16,17,21,23,22,24,29,30,31,33,36,38,40,41,42,45,47,48,50,52,53,60,56,57,58,59,62,64,65,66,68,69,71,73,74,76,78,79,83,85,86,87,93,96,98,99,100,107,108,113,115,117,120,122,124,125,126,131,133,135,141,140,142,148 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *456 { + a: 0.0325006432831287,-0.0236130561679602,-0.999192714691162,0.00811633840203285,0.0173364412039518,-0.999816834926605,0.102388381958008,-0.103928864002228,-0.989300429821014,-0.0623470805585384,0.789747297763824,-0.610255718231201,-0.336650013923645,0.830830097198486,-0.443157136440277,0.0411564633250237,0.858988285064697,-0.510338306427002,0.0528976619243622,0.817988634109497,-0.572797000408173,0.102388381958008,-0.103928864002228,-0.989300429821014,0.00811633840203285,0.0173364412039518,-0.999816834926605,-0.167955473065376,0,-0.98579466342926,-0.894427239894867,0,-0.447213619947433,-0.894427180290222,0,-0.447213590145111,-0.894427120685577,0,-0.447213560342789,-0.534306526184082,0.738019645214081,-0.412120759487152,-0.336650013923645,0.830830097198486,-0.443157136440277,-0.0623470805585384,0.789747297763824,-0.610255718231201,-0.413761883974075,-0.675565898418427,-0.610255599021912,-0.284589648246765,-0.861538767814636,-0.420427888631821,-0.538196861743927,-0.670745074748993,-0.510338246822357,-0.52359664440155,-0.630674242973328,-0.572796940803528,0.024183539673686,0.07442956417799,-0.996932923793793,0.00811633840203285,0.0173364412039518,-0.999816834926605,0.00594588881358504,0.0182994566857815,-0.999814808368683,0.0241835433989763,0.0744295790791512,-0.996932983398438,0.0513957440853119,-0.817143797874451,-0.574138045310974,-0.284589648246765,-0.861538767814636,-0.420427888631821,-0.413761883974075,-0.675565898418427,-0.610255599021912,0.00594588881358504,0.0182994566857815,-0.999814808368683,0.00811633840203285,0.0173364412039518,-0.999816834926605,0.0325006432831287,-0.0236130561679602,-0.999192714691162,0.717004597187042,0.534124076366425,-0.447901546955109,0.691821157932281,0.631100654602051,-0.350849777460098,0.652560770511627,0.474113285541534,-0.591084659099579,0.716449022293091,-0.520530819892883,-0.464487254619598,0.707422971725464,-0.540506839752197,-0.455417543649673,0.652560770511627,-0.4741131067276,-0.591084718704224,0.723606824874878,0.525731086730957,-0.447213590145111,0.717004597187042,0.534124076366425,-0.447901546955109, +0.723606824874878,0.525731205940247,-0.447213411331177,0.0411564633250237,0.858988285064697,-0.510338306427002,-0.336650013923645,0.830830097198486,-0.443157136440277,-0.143664553761482,0.961938381195068,-0.232454478740692,0.284963876008987,0.840356886386871,0.461081326007843,0.333379805088043,0.827407240867615,0.451946020126343,0.385134845972061,0.865853071212769,0.319326996803284,-0.512093603610992,0.806383907794952,-0.295812577009201,-0.336650013923645,0.830830097198486,-0.443157136440277,-0.534306526184082,0.738019645214081,-0.412120759487152,-0.565332055091858,0.753742456436157,-0.335070043802261,-0.894427120685577,0,-0.447213560342789,-0.894427180290222,0,-0.447213590145111,-0.894427180290222,0,-0.447213590145111,-0.749699234962463,0.514261186122894,0.416517168283463,-0.744403183460236,0.51266884803772,0.427825421094894,-0.710078299045563,0.572745740413666,0.40957435965538,-0.538196861743927,-0.670745074748993,-0.510338246822357,-0.284589648246765,-0.861538767814636,-0.420427888631821,-0.273777425289154,-0.943360567092896,-0.187394797801971,-0.754426777362823,-0.50557142496109,0.418614089488983,-0.750925779342651,-0.498751223087311,0.432848304510117,-0.783816695213318,-0.469709455966949,0.406207531690598,-0.783179938793182,-0.474925845861435,0.401340901851654,-0.0574269965291023,-0.953134477138519,-0.297046929597855,-0.284589648246765,-0.861538767814636,-0.420427888631821,0.0513957440853119,-0.817143797874451,-0.574138045310974,0.707422971725464,-0.540506839752197,-0.455417543649673,0.674052715301514,-0.610006272792816,-0.416587620973587,0.723606884479523,-0.525731086730957,-0.447213530540466,0.289082288742065,-0.889703810214996,0.353353470563889,0.24627511203289,-0.849176943302155,0.467169106006622,0.2763931453228,-0.850650727748871,0.447213798761368,0.695665538311005,-0.575496852397919,-0.429945051670074,0.707422971725464,-0.540506839752197,-0.455417543649673,0.716449022293091,-0.520530819892883,-0.464487254619598,0.723606705665588,-0.525731205940247,-0.447213649749756,0.691821157932281,0.631100654602051,-0.350849777460098, +0.717004597187042,0.534124076366425,-0.447901546955109,0.720902025699615,0.55295330286026,-0.417783260345459,0.898609697818756,0.0528750568628311,0.435551166534424,0.893508017063141,0.03592574223876,0.447607845067978,0.862870156764984,0.145106434822083,0.484147876501083,0.720902025699615,0.55295330286026,-0.417783260345459,0.717004597187042,0.534124076366425,-0.447901546955109,0.723606824874878,0.525731086730957,-0.447213590145111,0.333379805088043,0.827407240867615,0.451946020126343,0.284963876008987,0.840356886386871,0.461081326007843,0.298135846853256,0.823657214641571,0.482394009828568,0.896839439868927,0.0449925288558006,0.440062195062637,0.893508017063141,0.03592574223876,0.447607845067978,0.898609697818756,0.0528750568628311,0.435551166534424,0.900159418582916,0.0469553284347057,0.433022171258926,-0.143664553761482,0.961938381195068,-0.232454478740692,-0.336650013923645,0.830830097198486,-0.443157136440277,-0.512093603610992,0.806383907794952,-0.295812577009201,-0.894427180290222,0,-0.447213590145111,-0.894427180290222,0,-0.447213590145111,-0.894427239894867,0,-0.447213619947433,-0.783816695213318,-0.469709455966949,0.406207531690598,-0.750925779342651,-0.498751223087311,0.432848304510117,-0.788439750671387,-0.375391125679016,0.487282663583755,-0.770384013652802,0.474398642778397,0.425974816083908,-0.744403183460236,0.51266884803772,0.427825421094894,-0.749699234962463,0.514261186122894,0.416517168283463,-0.770383954048157,0.474398612976074,0.425974786281586,-0.273777425289154,-0.943360567092896,-0.187394797801971,-0.284589648246765,-0.861538767814636,-0.420427888631821,-0.0574269965291023,-0.953134477138519,-0.297046929597855,-0.165699675679207,-0.976808786392212,-0.135602325201035,-0.600659608840942,-0.633848428726196,0.487282544374466,-0.750925779342651,-0.498751223087311,0.432848304510117,-0.754426777362823,-0.50557142496109,0.418614089488983,0.674052715301514,-0.610006272792816,-0.416587620973587,0.707422971725464,-0.540506839752197,-0.455417543649673,0.695665538311005,-0.575496852397919,-0.429945051670074, +0.862870156764984,0.145106434822083,0.484147876501083,0.893508017063141,0.03592574223876,0.447607845067978,0.89546537399292,-0.280045956373215,0.346000075340271,0.249634474515915,-0.863385856151581,0.438460409641266,0.24627511203289,-0.849176943302155,0.467169106006622,0.289082288742065,-0.889703810214996,0.353353470563889,0.806609392166138,1.20809886539064e-07,0.591084718704224,0.893508017063141,0.03592574223876,0.447607845067978,0.896839439868927,0.0449925288558006,0.440062195062637,0.298135846853256,0.823657214641571,0.482394009828568,0.284963876008987,0.840356886386871,0.461081326007843,0.255140691995621,0.82740730047226,0.500300347805023,0.0175177343189716,6.05563910127671e-09,0.999846577644348,8.71502621180298e-08,1.97167562276945e-08,1,-1.23058143230992e-07,-8.3521520366503e-08,1,0.255140691995621,0.82740730047226,0.500300347805023,0.284963876008987,0.840356886386871,0.461081326007843,0.113377176225185,0.865852892398834,0.487282603979111,-0.710078299045563,0.572745740413666,0.40957435965538,-0.744403183460236,0.51266884803772,0.427825421094894,-0.600659310817719,0.633848547935486,0.487282633781433,0.171710252761841,5.93580580243724e-08,0.985147476196289,0.0175177343189716,6.05563910127671e-09,0.999846577644348,2.29915002591952e-07,0,1,2.29915016802806e-07,0,1,-0.750925779342651,-0.498751223087311,0.432848304510117,-0.600659608840942,-0.633848428726196,0.487282544374466,-0.600659430027008,-0.633848547935486,0.487282484769821,0.0401729457080364,5.66608342467134e-08,0.999192774295807,0.0175177343189716,6.05563910127671e-09,0.999846577644348,0.171710252761841,5.93580580243724e-08,0.985147476196289,0.226979091763496,-0.83661687374115,0.498550593852997,0.24627511203289,-0.849176943302155,0.467169106006622,0.249634474515915,-0.863385856151581,0.438460409641266,0.226979076862335,-0.83661687374115,0.498550564050674,8.71502621180298e-08,1.97167562276945e-08,1,0.0175177343189716,6.05563910127671e-09,0.999846577644348,0.0401729457080364,5.66608342467134e-08,0.999192774295807 + } + NormalsW: *152 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *456 { + a: 0.0145729659125209,0.999625861644745,-0.0231492761522532,0.011817641556263,0.999778270721436,0.0174317080527544,0.0368640907108784,0.994240522384644,-0.100632563233376,0.0207275412976742,0.612338006496429,0.790324330329895,-0.0928682535886765,0.439037978649139,0.893656134605408,-0.146745637059212,0.510428905487061,0.847306430339813,-0.0213487129658461,0.574395358562469,0.818299651145935,0.0368640907108784,0.994240522384644,-0.100632563233376,0.011817641556263,0.999778270721436,0.0174317080527544,0.0356311649084091,0.999346554279327,-0.00607068464159966,0.0161750093102455,0.999345779418945,-0.032350018620491,0.00219467235729098,0.999987959861755,-0.00438934471458197,0.00329249701462686,0.999972939491272,-0.00658499402925372,0.461550444364548,0.663174569606781,0.589211940765381,0.704845309257507,0.53441309928894,0.466471701860428,0.324647963047028,0.59424090385437,0.735854268074036,-0.260393440723419,0.730142772197723,-0.631733179092407,-0.630541145801544,0.498569548130035,-0.59484988451004,-0.578734457492828,0.734302043914795,-0.354777246713638,-0.388653844594955,0.775106310844421,-0.498155057430267,-0.0205521285533905,0.997050940990448,0.0739398151636124,0.011817641556263,0.999778270721436,0.0174317080527544,-0.0161218643188477,0.999704360961914,0.0182015597820282,-0.0313438586890697,0.996790826320648,0.0736586302518845,0.0213093068450689,0.575664341449738,-0.817408502101898,0.0274516828358173,0.431058973073959,-0.901906073093414,-0.0159310530871153,0.675597190856934,-0.737098932266235,-0.0161218643188477,0.999704360961914,0.0182015597820282,0.011817641556263,0.999778270721436,0.0174317080527544,0.0145729659125209,0.999625861644745,-0.0231492761522532,-0.454373180866241,0.84540331363678,0.280781805515289,-0.537473618984222,0.774557113647461,0.333441615104675,-0.351391702890396,0.880463838577271,0.318288087844849,0.442815363407135,0.853789746761322,-0.273784160614014,0.446168720722198,0.841241896152496,-0.305361539125443,0.351391613483429,0.880464017391205,-0.318287938833237,-0.447213590145111,0.85065084695816,0.2763931453228, +-0.454373180866241,0.84540331363678,0.280781805515289,-0.447213768959045,0.85065084695816,0.276393234729767,-0.146745637059212,0.510428905487061,0.847306430339813,-0.0928682535886765,0.439037978649139,0.893656134605408,-0.223839089274406,0.197218090295792,0.954463839530945,-0.70416659116745,0.509893953800201,-0.494123011827469,-0.862285077571869,0.461424350738525,-0.208691775798798,-0.922860383987427,0.361383467912674,0.133157223463058,0.779557466506958,0.580935478210449,0.234103202819824,0.704845309257507,0.53441309928894,0.466471701860428,0.461550444364548,0.663174569606781,0.589211940765381,0.655759155750275,0.657100319862366,0.371751368045807,0.00329249701462686,0.999972939491272,-0.00658499402925372,0.00219467235729098,0.999987959861755,-0.00438934471458197,-0.00479670288041234,0.999942481517792,0.00959340576082468,0.465772569179535,0.85713917016983,-0.219928652048111,0.406362384557724,0.856228351593018,-0.318971574306488,0.418003141880035,0.81097823381424,-0.409374743700027,-0.578734457492828,0.734302043914795,-0.354777246713638,-0.630541145801544,0.498569548130035,-0.59484988451004,-0.834196150302887,0.329882204532623,-0.441921472549438,-0.489120095968246,0.858312904834747,0.155114650726318,-0.389130860567093,0.863749980926514,0.320176810026169,-0.440858334302902,0.881577730178833,0.168714940547943,-0.525660574436188,0.850473880767822,-0.0193720329552889,0.0986683890223503,0.290662705898285,-0.951724648475647,0.0274516828358173,0.431058973073959,-0.901906073093414,0.0213093068450689,0.575664341449738,-0.817408502101898,0.446168720722198,0.841241896152496,-0.305361539125443,0.518902361392975,0.792396545410156,-0.320699274539948,0.447213560342789,0.85065084695816,-0.276393175125122,0.594434797763824,0.456159114837646,0.66224330663681,0.493860065937042,0.524694681167603,0.693395912647247,0.447213590145111,0.525731325149536,0.723606765270233,0.507227003574371,0.817326307296753,-0.273310124874115,0.446168720722198,0.841241896152496,-0.305361539125443,0.442815363407135,0.853789746761322,-0.273784160614014,0.495876789093018,0.846677899360657,-0.192984342575073, +-0.537473618984222,0.774557113647461,0.333441615104675,-0.454373180866241,0.84540331363678,0.280781805515289,-0.495672345161438,0.832701981067657,0.246812462806702,-0.0416320450603962,0.998508453369141,-0.0353235900402069,-0.0313142985105515,0.999352931976318,-0.017700582742691,-0.125192686915398,0.989412307739258,-0.0734177455306053,-0.495672345161438,0.832701981067657,0.246812462806702,-0.454373180866241,0.84540331363678,0.280781805515289,-0.447213590145111,0.85065084695816,0.2763931453228,-0.862285077571869,0.461424350738525,-0.208691775798798,-0.70416659116745,0.509893953800201,-0.494123011827469,-0.433022141456604,0.567088067531586,-0.700644671916962,-0.0403962731361389,0.998987376689911,-0.0198108274489641,-0.0313142985105515,0.999352931976318,-0.017700582742691,-0.0416320450603962,0.998508453369141,-0.0353235900402069,-0.0380556844174862,0.998848915100098,-0.0292019583284855,0.953802287578583,0.197217807173729,0.226641416549683,0.704845309257507,0.53441309928894,0.466471701860428,0.779557466506958,0.580935478210449,0.234103202819824,-0.00479670288041234,0.999942481517792,0.00959340576082468,0.00219467235729098,0.999987959861755,-0.00438934471458197,-1.04939040568297e-07,1,2.09878081136594e-07,-0.440858334302902,0.881577730178833,0.168714940547943,-0.389130860567093,0.863749980926514,0.320176810026169,-0.319326728582382,0.926866471767426,0.197354778647423,0.403915226459503,0.880077123641968,-0.249633446335793,0.406362384557724,0.856228351593018,-0.318971574306488,0.465772569179535,0.85713917016983,-0.219928652048111,0.407575100660324,0.880203485488892,-0.243155255913734,-0.856410622596741,0.327782660722733,-0.398897588253021,-0.651732623577118,0.495500385761261,-0.574216067790985,-0.50400310754776,0.284517496824265,-0.815494179725647,-0.730543732643127,0.21394856274128,-0.648484289646149,-0.455344080924988,0.772187352180481,0.443157464265823,-0.389130860567093,0.863749980926514,0.320176810026169,-0.489120095968246,0.858312904834747,0.155114650726318,0.518902361392975,0.792396545410156,-0.320699274539948,0.446168720722198,0.841241896152496,-0.305361539125443, +0.507227003574371,0.817326307296753,-0.273310124874115,-0.125192686915398,0.989412307739258,-0.0734177455306053,-0.0313142985105515,0.999352931976318,-0.017700582742691,0.257251739501953,0.959928750991821,0.111168012022972,0.465341448783875,0.504046738147736,0.727594912052155,0.493860065937042,0.524694681167603,0.693395912647247,0.594434797763824,0.456159114837646,0.66224330663681,-0.0213648024946451,0.999346613883972,0.0291547551751137,-0.0313142985105515,0.999352931976318,-0.017700582742691,-0.0403962731361389,0.998987376689911,-0.0198108274489641,-0.433022141456604,0.567088067531586,-0.700644671916962,-0.70416659116745,0.509893953800201,-0.494123011827469,-0.153757318854332,0.54556006193161,-0.823846399784088,0.0105554284527898,0.99994432926178,-0.0001849416148616,-0.00736215990036726,0.999972999095917,-1.90746085593219e-08,-0.0361682511866093,0.999345719814301,7.90160754604585e-08,0.525196671485901,0.315849006175995,-0.790194928646088,0.517283797264099,0.270144701004028,-0.812058746814728,0.531815111637115,0.361383616924286,-0.765881538391113,0.418003141880035,0.81097823381424,-0.409374743700027,0.406362384557724,0.856228351593018,-0.318971574306488,0.297118812799454,0.742801070213318,-0.599972486495972,0.0183315668255091,0.999826848506927,-0.00319523457437754,0.0105554284527898,0.99994432926178,-0.0001849416148616,0.0586997978389263,0.998275756835938,-1.34959643460775e-08,-6.7348997845329e-07,1,1.54845456118782e-13,-0.389130860567093,0.863749980926514,0.320176810026169,-0.455344080924988,0.772187352180481,0.443157464265823,-0.297118663787842,0.742800951004028,0.599972665309906,-0.0190730318427086,0.999817848205566,0.000766782206483185,0.0105554284527898,0.99994432926178,-0.0001849416148616,0.0183315668255091,0.999826848506927,-0.00319523457437754,0.323510617017746,0.547613024711609,0.771661162376404,0.493860065937042,0.524694681167603,0.693395912647247,0.465341448783875,0.504046738147736,0.727594912052155,0.332394987344742,0.54772162437439,0.767798662185669,-0.00736215990036726,0.999972999095917,-1.90746085593219e-08, +0.0105554284527898,0.99994432926178,-0.0001849416148616,-0.0190730318427086,0.999817848205566,0.000766782206483185 + } + BinormalsW: *152 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *456 { + a: -0.999365508556366,0.0138088362291455,-0.0328326001763344,-0.999897241592407,0.0119569571688771,-0.00790966488420963,-0.994061172008514,0.0261660553514957,-0.105629906058311,-0.997839272022247,-0.0366253145039082,0.0545470044016838,-0.937039077281952,-0.34200456738472,0.070644423365593,-0.988317668437958,-0.0400177836418152,-0.147060230374336,-0.998371779918671,0.0310576613992453,-0.0478471778333187,-0.994061172008514,0.0261660553514957,-0.105629906058311,-0.999897241592407,0.0119569571688771,-0.00790966488420963,-0.985150456428528,0.0361446142196655,0.167845711112022,-0.446920990943909,0.0361684188246727,0.893841981887817,-0.447208195924759,0.00490743666887283,0.894416391849518,-0.447201460599899,0.0073622465133667,0.894402921199799,-0.708157896995544,-0.124605275690556,0.694971740245819,-0.624387621879578,0.155319526791573,0.765516757965088,-0.943777799606323,0.152239888906479,0.293439000844955,-0.872351050376892,0.102480553090572,0.478018164634705,-0.722098767757416,-0.0958089679479599,0.685123383998871,-0.612707495689392,-0.104410335421562,0.783382296562195,-0.75815212726593,0.0382125787436962,0.650957047939301,-0.999496221542358,-0.0187009666115046,-0.0256419070065022,-0.999897241592407,0.0119569571688771,-0.00790966488420963,-0.999852359294891,-0.0160106550902128,-0.00623915437608957,-0.999216079711914,-0.0294664017856121,-0.0264388471841812,-0.998450934886932,-0.0297768265008926,-0.0469994582235813,-0.958256244659424,0.268214553594589,0.0990242138504982,-0.910245835781097,0.295261442661285,0.290298849344254,-0.999852359294891,-0.0160106550902128,-0.00623915437608957,-0.999897241592407,0.0119569571688771,-0.00790966488420963,-0.999365508556366,0.0138088362291455,-0.0328326001763344,-0.528629779815674,-0.00219258526340127,-0.848849654197693,-0.482188403606415,0.0421094819903374,-0.875054955482483,-0.671333253383636,7.37111562898463e-08,-0.741155624389648,-0.539087533950806,0.00952969118952751,-0.842195808887482,-0.548166275024414,-0.0128267062827945,-0.836271047592163,-0.671333253383636,-9.89801485218322e-09,-0.741155624389648, +-0.525731086730957,-2.18471605251125e-08,-0.85065084695816,-0.528629779815674,-0.00219258526340127,-0.848849654197693,-0.525730967521667,5.81208858818627e-08,-0.850650906562805,-0.988317668437958,-0.0400177836418152,-0.147060230374336,-0.937039077281952,-0.34200456738472,0.070644423365593,-0.963979542255402,-0.189155012369156,-0.186986148357391,0.650342285633087,0.183870866894722,-0.7370525598526,0.381211906671524,0.320132613182068,-0.867290318012238,0.000104911348898895,0.345977663993835,-0.938242733478546,-0.360625058412552,0.110720112919807,0.926115870475769,-0.624387621879578,0.155319526791573,0.765516757965088,-0.708157896995544,-0.124605275690556,0.694971740245819,-0.50037944316864,0.00956230517476797,0.865753412246704,-0.447201460599899,0.0073622465133667,0.894402921199799,-0.447208195924759,0.00490743666887283,0.894416391849518,-0.447187900543213,-0.0107257533818483,0.894375801086426,0.47011387348175,-0.0291219297796488,0.88212513923645,0.529842972755432,0.063591293990612,0.845708310604095,0.566623508930206,0.119484767317772,0.815267562866211,-0.612707495689392,-0.104410335421562,0.783382296562195,-0.722098767757416,-0.0958089679479599,0.685123383998871,-0.47870945930481,-0.035335898399353,0.877261996269226,0.437723428010941,0.0877299234271049,0.894819378852844,0.533561289310455,-0.0719944164156914,0.842691659927368,0.437350481748581,0.0468384064733982,0.898070573806763,0.332129657268524,0.226140856742859,0.915723860263824,-0.993461966514587,0.0839638337492943,-0.0773523524403572,-0.958256244659424,0.268214553594589,0.0990242138504982,-0.998450934886932,-0.0297768265008926,-0.0469994582235813,-0.548166275024414,-0.0128267062827945,-0.836271047592163,-0.525731205940247,7.39825765094793e-08,-0.850650787353516,-0.525731027126312,-4.09202485229798e-08,-0.85065084695816,0.750385701656342,-0.0186027977615595,-0.660738348960876,0.833936989307404,-0.0599500350654125,-0.548593819141388,0.85065084695816,-1.40070596899022e-07,-0.525731027126312,-0.508694529533386,0.0279473029077053,-0.860493361949921,-0.548166275024414,-0.0128267062827945,-0.836271047592163, +-0.539087533950806,0.00952969118952751,-0.842195808887482,-0.480103731155396,0.0821181088685989,-0.873359620571136,-0.482188403606415,0.0421094819903374,-0.875054955482483,-0.528629779815674,-0.00219258526340127,-0.848849654197693,-0.484364688396454,-0.0291560087352991,-0.874380171298981,0.436769276857376,-0.0136092342436314,-0.899470686912537,0.447954058647156,-0.00179908669088036,-0.894054710865021,0.489675253629684,-0.00273820385336876,-0.871900618076324,-0.484364688396454,-0.0291560087352991,-0.874380171298981,-0.528629779815674,-0.00219258526340127,-0.848849654197693,-0.525731086730957,-2.18471605251125e-08,-0.85065084695816,0.381211906671524,0.320132613182068,-0.867290318012238,0.650342285633087,0.183870866894722,-0.7370525598526,0.85065084695816,1.56337733869805e-08,-0.525731086730957,0.440507858991623,9.74191152636195e-06,-0.897748649120331,0.447954058647156,-0.00179908669088036,-0.894054710865021,0.436769276857376,-0.0136092342436314,-0.899470686912537,0.433894872665405,-0.00980746280401945,-0.900910079479218,-0.263859272003174,0.18915531039238,0.945832312107086,-0.624387621879578,0.155319526791573,0.765516757965088,-0.360625058412552,0.110720112919807,0.926115870475769,-0.447187900543213,-0.0107257533818483,0.894375801086426,-0.447208195924759,0.00490743666887283,0.894416391849518,-0.447213649749756,-2.34650840980066e-07,0.894427299499512,0.437350481748581,0.0468384064733982,0.898070573806763,0.533561289310455,-0.0719944164156914,0.842691659927368,0.525731205940247,1.95143137204923e-08,0.850650787353516,0.493316382169724,0.0202558990567923,0.869614064693451,0.529842972755432,0.063591293990612,0.845708310604095,0.47011387348175,-0.0291219297796488,0.88212513923645,0.490297019481659,0.013706193305552,0.871447682380676,0.437729060649872,0.0512777604162693,-0.897643625736237,0.703031599521637,0.110590599477291,-0.702507257461548,0.861790597438812,0.102881200611591,-0.496721714735031,0.66245710849762,-0.008390205912292,-0.749052822589874,0.657168030738831,-0.0443055555224419,0.752440810203552,0.533561289310455,-0.0719944164156914,0.842691659927368, +0.437723428010941,0.0877299234271049,0.894819378852844,-0.525731205940247,7.39825765094793e-08,-0.850650787353516,-0.548166275024414,-0.0128267062827945,-0.836271047592163,-0.508694529533386,0.0279473029077053,-0.860493361949921,0.489675253629684,-0.00273820385336876,-0.871900618076324,0.447954058647156,-0.00179908669088036,-0.894054710865021,0.363267600536346,0.0105379903689027,-0.931625366210938,0.849199652671814,-0.0224009994417429,-0.527596652507782,0.833936989307404,-0.0599500350654125,-0.548593819141388,0.750385701656342,-0.0186027977615595,-0.660738348960876,0.590698540210724,0.0361449085175991,-0.806082367897034,0.447954058647156,-0.00179908669088036,-0.894054710865021,0.440507858991623,9.74191152636195e-06,-0.897748649120331,0.85065084695816,1.56337733869805e-08,-0.525731086730957,0.650342285633087,0.183870866894722,-0.7370525598526,0.954600393772125,-0.133271902799606,-0.266414493322372,0.999790847301483,-0.010557048022747,-0.017516752704978,0.999972879886627,0.00736215896904469,-8.72930527862081e-08,0.999345719814301,0.0361682511866093,1.25998454336695e-07,-0.811832368373871,0.464366912841797,-0.353965580463409,-0.80697774887085,0.469917267560959,-0.357721477746964,-0.839236736297607,0.345977753400803,-0.419501036405563,0.566623508930206,0.119484767317772,0.815267562866211,0.529842972755432,0.063591293990612,0.845708310604095,0.74224579334259,0.215598240494728,0.634498715400696,0.984976887702942,-0.0186079517006874,-0.171680524945259,0.999790847301483,-0.010557048022747,-0.017516752704978,0.998275637626648,-0.0586997903883457,-2.29518548167107e-07,1,6.7348997845329e-07,-2.29915031013661e-07,0.533561289310455,-0.0719944164156914,0.842691659927368,0.657168030738831,-0.0443055555224419,0.752440810203552,0.742245733737946,-0.21559850871563,0.634498655796051,0.999010741710663,0.0190884377807379,-0.0401656255125999,0.999790847301483,-0.010557048022747,-0.017516752704978,0.984976887702942,-0.0186079517006874,-0.171680524945259,0.91859757900238,0.013864534907043,-0.39495113492012,0.833936989307404,-0.0599500350654125,-0.548593819141388, +0.849199652671814,-0.0224009994417429,-0.527596652507782,0.915420174598694,0.00855850614607334,-0.402408599853516,0.999972879886627,0.00736215896904469,-8.72930527862081e-08,0.999790847301483,-0.010557048022747,-0.017516752704978,0.999010741710663,0.0190884377807379,-0.0401656255125999 + } + TangentsW: *152 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *76 { + a: 0.0881041139364243,0.823791801929474,0.0881041139364243,0.176208227872849,0.963104128837585,0.304086744785309,0.646174013614655,0.333333313465118,0.426208198070526,0.599999964237213,0.426208198070526,0.399999976158142,0.338104099035263,0.116139747202396,0.0300342254340649,0.666666686534882,0.838104128837585,0.883860290050507,0.963104069232941,0.695913255214691,0.0881040766835213,0.616139769554138,0.0300342254340649,0.333333313465118,0.213104113936424,0.304086685180664,0.0881040766835213,0.383860260248184,0.838104069232941,0.5,0.89617395401001,0.5,0.25,1,0.713104128837585,0.695913255214691,0.213104113936424,0.695913255214691,0.338104069232941,0.883860290050507,0.25,0.19999997317791,0.280034214258194,0.5,0.838104069232941,0.116139747202396,0.780034184455872,0.5,0.75,0.399999976158142,0.588104069232941,0.616139769554138,0.396173983812332,0.5,0.713104128837585,0.304086744785309,0.588104128837585,0.383860260248184,0.463104099035263,0.695913255214691,0.463104099035263,0.304086744785309,1.03003418445587,0.666666686534882,1.08810412883759,0.823791801929474,1.08810412883759,0.616139769554138,1.03003418445587,0.333333313465118,1.08810412883759,0.383860260248184,1.08810412883759,0.176208227872849,1.25,1 + } + UVIndex: *152 { + a: 9,35,31,31,32,8,9,31,35,33,13,12,10,10,0,7,11,1,12,13,34,35,15,2,2,36,34,15,35,9,9,14,15,14,2,15,17,9,8,8,32,37,16,17,8,19,0,10,18,10,12,18,18,4,19,12,1,20,20,5,21,12,22,36,2,2,27,22,27,6,22,24,2,14,23,14,9,23,23,3,24,23,9,17,17,16,25,25,3,23,17,16,0,19,18,12,21,21,5,26,26,4,18,21,20,36,22,6,6,5,20,27,2,24,24,3,27,3,6,27,28,3,25,25,16,29,29,28,25,29,16,19,19,4,29,5,29,4,26,5,6,30,30,29,5,30,6,3,28,28,29,30 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *76 { + a: 1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,0,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,0,1,1,1,0,1,0,1,0,1,0,0,1,1,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2060818024848, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 2060814324832, "Geometry::", "Mesh" { + Vertices: *45 { + a: 0.187592402100563,-0.577350199222565,-0.794654488563538,-0.303530961275101,-0.934172332286835,0.187592476606369,0.607061982154846,-2.50023290959689e-08,-0.794654488563538,-0.491123467683792,0.356822043657303,-0.794654488563538,-0.491123467683792,-0.356822073459625,-0.794654488563538,0.982246935367584,-2.50023290959689e-08,-0.187592461705208,-3.50347306721233e-08,0.999999940395355,0,-0.794654488563538,-0.577350318431854,-0.187592461705208,-0.982246994972229,-1.00009337700158e-07,0.18759249150753,0.794654488563538,-0.577350258827209,0.187592476606369,0.794654488563538,0.577350258827209,0.187592476606369,-0.607061982154846,-7.50069872879067e-08,0.794654428958893,0.491123467683792,-0.356822043657303,0.794654428958893,-0.187592476606369,0.577350199222565,0.794654428958893,-0.187592417001724,-0.577350258827209,0.794654488563538 + } + PolygonVertexIndex: *78 { + a: 2,4,-4,3,6,-3,4,7,-4,0,7,-5,0,4,-3,5,0,-3,10,2,-7,6,3,-9,3,7,-9,8,11,-7,7,14,-9,0,9,-2,9,0,-6,5,12,-10,5,2,-11,10,12,-6,8,14,-12,7,0,-2,1,14,-8,12,1,-10,10,6,-14,13,12,-11,6,11,-14,14,13,-12,14,1,-13,12,13,-15 + } + Edges: *39 { + a: 1,2,3,4,6,7,11,9,0,14,17,15,18,20,22,23,25,27,28,30,31,35,33,34,38,39,40,44,45,49,53,54,57,61,62,63,67,69,74 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *234 { + a: -4.70040184552545e-08,0,-1,1.10231995311739e-14,0,-1,7.60541212230237e-08,0,-1,-0.298135906457901,0.823657095432281,-0.482393980026245,-0.298135906457901,0.823657155036926,-0.482393980026245,0.222837433218956,0.685823082923889,-0.692813158035278,-0.894427239894867,0,-0.447213619947433,-0.894427180290222,0,-0.447213649749756,-0.894427180290222,0,-0.447213619947433,-0.2763931453228,-0.85065084695816,-0.447213649749756,-0.276393085718155,-0.85065084695816,-0.447213679552078,-0.276393175125122,-0.850650787353516,-0.447213649749756,-2.46116314883693e-07,0,-0.999999940395355,1.10231995311739e-14,0,-1,-4.70040184552545e-08,0,-1,0.723606765270233,-0.525731146335602,-0.447213679552078,0.495368450880051,-0.812944948673248,-0.306154489517212,0.723606765270233,-0.525731265544891,-0.447213530540466,0.535126984119415,0.67966216802597,-0.501695573329926,0.566300630569458,0.658735871315002,-0.495349019765854,0.494817942380905,0.704582035541534,-0.508644759654999,-0.298135906457901,0.823657155036926,-0.482393980026245,-0.298135906457901,0.823657095432281,-0.482393980026245,-0.719326794147491,0.685823142528534,-0.110523477196693,-0.894427180290222,0,-0.447213619947433,-0.894427180290222,0,-0.447213649749756,-0.894427180290222,0,-0.447213649749756,-0.621612548828125,0.682645857334137,0.38417774438858,-0.666166245937347,0.667984426021576,0.331691712141037,-0.692634522914886,0.657006621360779,0.297657042741776,-0.723606765270233,-0.525731146335602,0.447213560342789,-0.723606765270233,-0.525731146335602,0.447213649749756,-0.723606765270233,-0.525731086730957,0.447213619947433,0.495368450880051,-0.812944948673248,-0.306154489517212,0.519170999526978,-0.792153358459473,-0.320865333080292,0.303531020879745,-0.934172391891479,-0.187592372298241,0.519170999526978,-0.792153358459473,-0.320865333080292,0.495368450880051,-0.812944948673248,-0.306154489517212,0.723606765270233,-0.525731146335602,-0.447213679552078,0.894427120685577,-2.90500867805576e-08,0.447213649749756,0.894427120685577,-2.22948863418202e-14,0.447213649749756, +0.894427120685577,1.23058143230992e-07,0.447213560342789,0.723606705665588,0.525731205940247,-0.447213590145111,0.566300630569458,0.658735871315002,-0.495349019765854,0.535126984119415,0.67966216802597,-0.501695573329926,0.894427180290222,-7.60541212230237e-08,0.447213679552078,0.894427120685577,-2.22948863418202e-14,0.447213649749756,0.894427120685577,-2.90500867805576e-08,0.447213649749756,-0.723606765270233,-0.525731086730957,0.447213619947433,-0.723606765270233,-0.525731146335602,0.447213649749756,-0.723606705665588,-0.525731027126312,0.447213768959045,-0.276393085718155,-0.85065084695816,-0.447213679552078,-0.2763931453228,-0.85065084695816,-0.447213649749756,-0.276393055915833,-0.850650787353516,-0.447213649749756,-0.723606884479523,-0.525731086730957,0.447213560342789,-0.723606765270233,-0.525731146335602,0.447213649749756,-0.723606765270233,-0.525731146335602,0.447213560342789,0.276393204927444,-0.85065084695816,0.447213560342789,0.276393294334412,-0.850650787353516,0.447213560342789,0.2763931453228,-0.85065084695816,0.447213590145111,0.310544401407242,0.806898355484009,0.502471208572388,0.310544371604919,0.806898295879364,0.502471208572388,0.310544401407242,0.806898295879364,0.502471208572388,0.311777174472809,0.226519390940666,0.922758877277374,0.285567373037338,0.207476809620857,0.935630559921265,0.49112343788147,0.356822073459625,0.794654488563538,-0.692634522914886,0.657006621360779,0.297657042741776,-0.666166245937347,0.667984426021576,0.331691712141037,-0.803097367286682,0.583484411239624,0.120749987661839,5.81001522448332e-08,5.16191462907045e-08,1,0.311777174472809,0.226519390940666,0.922758877277374,-2.46116286461984e-07,5.16191356325635e-08,1,0.276393413543701,-0.850650668144226,0.447213500738144,0.276393294334412,-0.850650787353516,0.447213560342789,0.276393204927444,-0.85065084695816,0.447213560342789,0.285567373037338,0.207476809620857,0.935630559921265,0.311777174472809,0.226519390940666,0.922758877277374,5.81001522448332e-08,5.16191462907045e-08,1 + } + NormalsW: *78 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *234 { + a: -0.00856975000351667,0.999963283538818,4.02812699862309e-10,-0.00856975000351667,0.999963283538818,-9.44660641265851e-17,-3.24903446369262e-08,1,-2.4710246530695e-15,-0.107020616531372,0.473346352577209,0.87435120344162,0.433022141456604,0.56708812713623,0.700644612312317,-0.0410139374434948,0.716649174690247,0.696226835250854,0.0161750093102455,0.999345779418945,-0.032350018620491,0.00567160453647375,0.999919652938843,-0.0113432072103024,0.00567160407081246,0.999919652938843,-0.0113432072103024,-0.304470777511597,0.518876969814301,-0.798789262771606,-0.304470777511597,0.518876969814301,-0.798789322376251,-0.304470777511597,0.518876969814301,-0.798789203166962,-0.0171388387680054,0.999853193759918,4.21814849715929e-09,-0.00856975000351667,0.999963283538818,-9.44660641265851e-17,-0.00856975000351667,0.999963283538818,4.02812699862309e-10,0.447213649749756,0.85065084695816,-0.276393204927444,0.6915323138237,0.58234053850174,-0.427390456199646,0.447213739156723,0.850650727748871,-0.276393264532089,-0.673176825046539,0.701875567436218,0.232816785573959,-0.654842674732208,0.724563598632813,0.214915573596954,-0.695101141929626,0.672195017337799,0.254928380250931,0.433022141456604,0.56708812713623,0.700644612312317,0.829904437065125,0.473346352577209,0.295299619436264,0.641066312789917,0.716649115085602,0.274678230285645,0.00567160407081246,0.999919652938843,-0.0113432072103024,0.00567160453647375,0.999919652938843,-0.0113432072103024,-0.00483493320643902,0.99994158744812,0.00966986455023289,0.580693244934082,0.730749428272247,-0.358888268470764,0.478969216346741,0.724090278148651,-0.496267795562744,0.476963400840759,0.726764619350433,-0.49428653717041,-0.447213560342789,0.850650787353516,0.276393324136734,-0.447213590145111,0.85065084695816,0.276393294334412,-0.447213530540466,0.85065084695816,0.276393294334412,0.6915323138237,0.58234053850174,-0.427390456199646,0.673845887184143,0.610322117805481,-0.416459679603577,0.794654488563538,0.356822073459625,-0.491123497486115,0.673845887184143,0.610322117805481,-0.416459679603577, +0.6915323138237,0.58234053850174,-0.427390456199646,0.447213649749756,0.85065084695816,-0.276393204927444,-0.0062497858889401,0.999902367591858,0.0124996341764927,-0.00624981196597219,0.999902367591858,0.0124996211379766,-0.00766479689627886,0.999853134155273,0.0153293190523982,-0.447213709354401,0.85065084695816,0.276393264532089,-0.564687490463257,0.747883558273315,0.348996073007584,-0.584368348121643,0.726689517498016,0.361159473657608,-0.00483480608090758,0.99994158744812,0.00966978073120117,-0.00624981196597219,0.999902367591858,0.0124996211379766,-0.0062497858889401,0.999902367591858,0.0124996341764927,-0.447213530540466,0.85065084695816,0.276393294334412,-0.447213590145111,0.85065084695816,0.276393294334412,-0.447213500738144,0.85065084695816,0.276393175125122,-0.447213530540466,0.525731086730957,-0.723606884479523,-0.447213530540466,0.525731146335602,-0.723606884479523,-0.447213500738144,0.525731086730957,-0.723606884479523,-0.447213500738144,0.85065084695816,0.276393264532089,-0.447213590145111,0.85065084695816,0.276393294334412,-0.447213560342789,0.850650787353516,0.276393324136734,0.421811163425446,0.525500237941742,0.738867342472076,0.421811163425446,0.525500297546387,0.738867282867432,0.556935548782349,0.521010518074036,0.646815955638885,-0.42421156167984,0.59069037437439,-0.686388731002808,-0.424211531877518,0.59069037437439,-0.686388671398163,-0.424211531877518,0.59069037437439,-0.686388671398163,-0.0338348895311356,0.973197340965271,-0.227469086647034,-0.0459675900638103,0.978126168251038,-0.202870309352875,-0.18759249150753,0.934172391891479,-0.303530961275101,0.476963400840759,0.726764619350433,-0.49428653717041,0.478969216346741,0.724090278148651,-0.496267795562744,0.392885029315948,0.670909523963928,-0.628905236721039,0.0107255857437849,0.999942541122437,-5.22393364121854e-08,-0.0338348895311356,0.973197340965271,-0.227469086647034,-1.07766261692177e-07,1,-5.16191605015592e-08,0.275402337312698,0.515931725502014,0.811152338981628,0.421811163425446,0.525500297546387,0.738867282867432,0.421811163425446,0.525500237941742,0.738867342472076, +-0.0459675900638103,0.978126168251038,-0.202870309352875,-0.0338348895311356,0.973197340965271,-0.227469086647034,0.0107255857437849,0.999942541122437,-5.22393364121854e-08 + } + BinormalsW: *78 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *234 { + a: -0.999963283538818,-0.00856975000351667,4.70022953891203e-08,-0.999963283538818,-0.00856975000351667,-1.10227954964581e-14,-1,-3.24903446369262e-08,-7.60541212230237e-08,-0.94850492477417,-0.31230154633522,0.0529732294380665,-0.850650787353516,-5.35565938264426e-08,0.525731086730957,-0.973992466926575,0.126730412244797,-0.187824577093124,-0.446920990943909,0.0361684188246727,0.893841981887817,-0.447177708148956,0.0126820914447308,0.894355297088623,-0.447177708148956,0.0126820914447308,0.894355297088623,-0.911539554595947,0.0846163854002953,0.402412325143814,-0.911539614200592,0.0846163257956505,0.402412295341492,-0.911539554595947,0.0846164152026176,0.402412354946136,-0.999853134155273,-0.0171388387680054,2.46080162469298e-07,-0.999963283538818,-0.00856975000351667,-1.10227954964581e-14,-0.999963283538818,-0.00856975000351667,4.70022953891203e-08,-0.525731146335602,5.59931159216376e-08,-0.850650787353516,-0.525731146335602,-3.83996940911402e-08,-0.850650906562805,-0.525731086730957,-1.33221949027984e-08,-0.85065084695816,0.510364592075348,0.213143303990364,0.833125352859497,0.500484466552734,0.202668830752373,0.841689169406891,0.521526396274567,0.227416396141052,0.822369873523712,-0.850650787353516,-5.35565938264426e-08,0.525731086730957,-0.471565067768097,0.312301486730576,0.824678242206573,-0.267587244510651,-0.126730531454086,0.955163061618805,-0.447177708148956,0.0126820914447308,0.894355297088623,-0.447177708148956,0.0126820914447308,0.894355297088623,-0.447187513113022,-0.0108112376183271,0.894374907016754,0.525731265544891,4.38327987239973e-08,0.85065084695816,0.57167387008667,0.17172671854496,0.802308440208435,0.541076064109802,0.200388371944427,0.816750347614288,0.525731146335602,-1.17828520274088e-07,0.850650787353516,0.525731205940247,-5.05256423366518e-08,0.850650787353516,0.525731205940247,-6.37241299727975e-08,0.850650787353516,-0.525731146335602,-3.83996940911402e-08,-0.850650906562805,-0.525731146335602,-1.73548286852565e-09,-0.850650787353516,-0.525731146335602,-1.03828263320338e-07,-0.850650906562805, +-0.525731146335602,-1.73548286852565e-09,-0.850650787353516,-0.525731146335602,-3.83996940911402e-08,-0.850650906562805,-0.525731146335602,5.59931159216376e-08,-0.850650787353516,0.447169989347458,0.0139750028029084,-0.894339859485626,0.447169989347458,0.0139750028029084,-0.894339859485626,0.447147905826569,0.0171387605369091,-0.894295811653137,-0.525731146335602,-2.98081381799875e-08,-0.850650787353516,-0.600359618663788,-0.0820807069540024,-0.795506834983826,-0.610043287277222,-0.0999088138341904,-0.786044120788574,0.447187542915344,0.0108111053705215,-0.894374907016754,0.447169989347458,0.0139750028029084,-0.894339859485626,0.447169989347458,0.0139750028029084,-0.894339859485626,0.525731205940247,-6.37241299727975e-08,0.850650787353516,0.525731205940247,-5.05256423366518e-08,0.850650787353516,0.525731265544891,7.38984340387105e-08,0.850650727748871,0.850650906562805,7.32299909600442e-08,-0.525730967521667,0.85065084695816,1.67716596166656e-08,-0.525731027126312,0.850650906562805,8.14671494708818e-08,-0.525730967521667,0.525731146335602,-1.23717313726956e-07,0.850650906562805,0.525731205940247,-5.05256423366518e-08,0.850650787353516,0.525731146335602,-1.17828520274088e-07,0.850650787353516,0.863528907299042,0.0155782382935286,-0.504058718681335,0.863528907299042,0.0155783044174314,-0.50405877828598,0.783217489719391,-0.0702936500310898,-0.617761433124542,0.850650787353516,-8.1886085467886e-08,-0.525731146335602,0.850650787353516,-6.14301001178319e-08,-0.525731146335602,0.850650787353516,-8.18860783624586e-08,-0.525731146335602,0.949552655220032,-0.0396982245147228,-0.311084985733032,0.957255601882935,-0.0149244517087936,-0.288858115673065,0.85065084695816,4.47039347761802e-08,-0.525731086730957,0.541076064109802,0.200388371944427,0.816750347614288,0.57167387008667,0.17172671854496,0.802308440208435,0.447968721389771,0.457631289958954,0.76804792881012,0.999942541122437,-0.0107255857437849,-5.75431720051256e-08,0.949552655220032,-0.0396982245147228,-0.311084985733032,1,1.07766275903032e-07,2.46116286461984e-07,0.920738935470581,0.101033516228199,-0.376871347427368, +0.863528907299042,0.0155783044174314,-0.50405877828598,0.863528907299042,0.0155782382935286,-0.504058718681335,0.957255601882935,-0.0149244517087936,-0.288858115673065,0.949552655220032,-0.0396982245147228,-0.311084985733032,0.999942541122437,-0.0107255857437849,-5.75431720051256e-08 + } + TangentsW: *78 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *36 { + a: 0.963104128837585,0.304086744785309,0.338104099035263,0.116139747202396,0.89617395401001,0.5,0.0881040766835213,0.616139769554138,0.0300342254340649,0.333333313465118,0.0881040766835213,0.383860260248184,0.780034184455872,0.5,0.25,1,0.213104113936424,0.304086685180664,0.280034214258194,0.5,0.713104128837585,0.304086744785309,0.713104128837585,0.695913255214691,0.396173983812332,0.5,0.588104128837585,0.383860260248184,0.463104099035263,0.695913255214691,0.463104099035263,0.304086744785309,1.08810412883759,0.616139769554138,1.08810412883759,0.383860260248184 + } + UVIndex: *78 { + a: 2,17,16,16,7,2,5,8,3,4,8,5,0,17,2,6,0,2,11,2,7,7,3,9,3,8,9,9,12,7,8,15,9,0,10,1,10,0,6,6,13,10,6,2,11,11,13,6,9,15,12,8,0,1,1,15,8,13,1,10,11,7,14,14,13,11,7,12,14,15,14,12,15,1,13,13,14,15 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *39 { + a: 0,0,1,0,0,1,0,1,1,0,0,1,1,0,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2060817503552, "NodeAttribute::", "LodGroup" { + Properties70: { + P: "Thresholds|Level0", "Distance", "", "",4.520276, "cm" + P: "Thresholds|Level1", "Distance", "", "",18.081102, "cm" + P: "DisplayLevels|Level0", "enum", "", "",0 + P: "DisplayLevels|Level1", "enum", "", "",1 + P: "DisplayLevels|Level2", "enum", "", "",2 + } + } + NodeAttribute: 2060818029072, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 2060814331072, "Geometry::", "Mesh" { + Vertices: *42 { + a: 9.27258483329751e-08,-0.70710676908493,-0.70710676908493,-0.70710676908493,-0.70710676908493,-6.18172393274108e-08,-3.09086196637054e-08,-0.70710676908493,0.70710676908493,0.70710676908493,-0.70710676908493,0,1.31134157754786e-07,0,-1,-1,0,-8.74227765734759e-08,-4.37113882867379e-08,0,1,1,0,0,9.27258483329751e-08,0.70710676908493,-0.70710676908493,-0.70710676908493,0.70710676908493,-6.18172393274108e-08,-3.09086196637054e-08,0.70710676908493,0.70710676908493,0.70710676908493,0.70710676908493,0,0,-1,0,0,1,0 + } + PolygonVertexIndex: *56 { + a: 0,1,5,-5,1,2,6,-6,2,3,7,-7,3,0,4,-8,4,5,9,-9,5,6,10,-10,6,7,11,-11,7,4,8,-12,1,0,-13,2,1,-13,3,2,-13,0,3,-13,8,9,-14,9,10,-14,10,11,-14,11,8,-14 + } + Edges: *28 { + a: 0,4,8,12,2,6,10,14,18,22,26,30,3,1,5,9,19,17,21,25,33,34,37,40,46,45,48,51 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *168 { + a: -0.678598284721375,-0.281084656715393,-0.678598403930664,-0.678598284721375,-0.281084656715393,-0.678598403930664,-0.678598284721375,-0.281084626913071,-0.678598403930664,-0.678598284721375,-0.281084626913071,-0.678598403930664,-0.678598463535309,-0.281084626913071,0.678598284721375,-0.678598463535309,-0.281084626913071,0.678598284721375,-0.678598403930664,-0.281084626913071,0.678598284721375,-0.678598403930664,-0.281084626913071,0.678598284721375,0.678598403930664,-0.281084656715393,0.678598403930664,0.678598403930664,-0.281084656715393,0.678598403930664,0.678598344326019,-0.281084626913071,0.678598344326019,0.678598344326019,-0.281084626913071,0.678598344326019,0.678598344326019,-0.281084626913071,-0.67859822511673,0.678598344326019,-0.281084626913071,-0.67859822511673,0.678598403930664,-0.281084686517715,-0.678598284721375,0.678598403930664,-0.281084686517715,-0.678598284721375,-0.67859822511673,0.281084626913071,-0.678598403930664,-0.67859822511673,0.281084626913071,-0.678598403930664,-0.67859822511673,0.281084656715393,-0.678598403930664,-0.67859822511673,0.281084656715393,-0.678598403930664,-0.678598403930664,0.281084626913071,0.678598284721375,-0.678598403930664,0.281084626913071,0.678598284721375,-0.678598463535309,0.281084626913071,0.678598284721375,-0.678598463535309,0.281084626913071,0.678598284721375,0.678598344326019,0.281084626913071,0.678598344326019,0.678598344326019,0.281084626913071,0.678598344326019,0.678598403930664,0.281084656715393,0.678598403930664,0.678598403930664,0.281084656715393,0.678598403930664,0.678598403930664,0.281084656715393,-0.678598284721375,0.678598403930664,0.281084656715393,-0.678598284721375,0.678598344326019,0.281084626913071,-0.67859822511673,0.678598344326019,0.281084626913071,-0.67859822511673,-0.357406765222549,-0.862856149673462,-0.357406944036484,-0.357406765222549,-0.862856149673462,-0.357406944036484,-0.357406765222549,-0.862856149673462,-0.357406944036484,-0.357406735420227,-0.862856090068817,0.357406914234161,-0.357406735420227,-0.862856090068817,0.357406914234161, +-0.357406765222549,-0.862856149673462,0.357406944036484,0.357406765222549,-0.862856090068817,0.357406914234161,0.357406765222549,-0.862856090068817,0.357406914234161,0.357406765222549,-0.862856149673462,0.357406944036484,0.357406765222549,-0.862856209278107,-0.357406854629517,0.357406765222549,-0.862856209278107,-0.357406854629517,0.357406735420227,-0.862856149673462,-0.357406824827194,-0.357406765222549,0.862856149673462,-0.357406944036484,-0.357406765222549,0.862856149673462,-0.357406944036484,-0.357406765222549,0.862856149673462,-0.357406944036484,-0.357406735420227,0.862856090068817,0.357406914234161,-0.357406735420227,0.862856090068817,0.357406914234161,-0.357406735420227,0.862856149673462,0.357406914234161,0.357406765222549,0.862856090068817,0.357406914234161,0.357406765222549,0.862856090068817,0.357406914234161,0.357406765222549,0.862856149673462,0.357406944036484,0.357406765222549,0.862856209278107,-0.357406824827194,0.357406765222549,0.862856209278107,-0.357406824827194,0.357406735420227,0.862856149673462,-0.357406795024872 + } + NormalsW: *56 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *168 { + a: -0.198756873607635,0.959683060646057,-0.198756903409958,-0.198756873607635,0.959683060646057,-0.198756903409958,-0.198756858706474,0.959683060646057,-0.198756888508797,-0.198756858706474,0.959683060646057,-0.198756888508797,-0.198756858706474,0.959683060646057,0.198756843805313,-0.198756858706474,0.959683060646057,0.198756843805313,-0.198756888508797,0.959683060646057,0.198756858706474,-0.198756888508797,0.959683060646057,0.198756858706474,0.198756843805313,0.959683001041412,0.198756843805313,0.198756843805313,0.959683001041412,0.198756843805313,0.198756828904152,0.959682941436768,0.198756828904152,0.198756828904152,0.959682941436768,0.198756828904152,0.198756888508797,0.959683001041412,-0.198756858706474,0.198756888508797,0.959683001041412,-0.198756858706474,0.19875693321228,0.959683060646057,-0.198756903409958,0.19875693321228,0.959683060646057,-0.198756903409958,0.198756858706474,0.959683060646057,0.198756903409958,0.198756858706474,0.959683060646057,0.198756903409958,0.198756873607635,0.959683060646057,0.19875693321228,0.198756873607635,0.959683060646057,0.19875693321228,0.198756888508797,0.959683060646057,-0.198756858706474,0.198756888508797,0.959683060646057,-0.198756858706474,0.198756858706474,0.959683060646057,-0.198756843805313,0.198756858706474,0.959683060646057,-0.198756843805313,-0.198756828904152,0.959682941436768,-0.198756828904152,-0.198756828904152,0.959682941436768,-0.198756828904152,-0.198756843805313,0.959683001041412,-0.198756843805313,-0.198756843805313,0.959683001041412,-0.198756843805313,-0.198756903409958,0.959683060646057,0.198756873607635,-0.198756903409958,0.959683060646057,0.198756873607635,-0.198756888508797,0.959683001041412,0.198756858706474,-0.198756888508797,0.959683001041412,0.198756858706474,-0.610131323337555,0.505449652671814,-0.610131502151489,-0.610131323337555,0.505449652671814,-0.610131502151489,-0.610131323337555,0.505449652671814,-0.610131502151489,-0.610131502151489,0.505449593067169,0.6101313829422,-0.610131502151489,0.505449593067169,0.6101313829422, +-0.610131502151489,0.505449593067169,0.6101313829422,0.6101313829422,0.505449593067169,0.610131502151489,0.6101313829422,0.505449593067169,0.610131502151489,0.610131442546844,0.505449593067169,0.610131442546844,0.610131442546844,0.505449533462524,-0.610131442546844,0.610131442546844,0.505449533462524,-0.610131442546844,0.610131502151489,0.505449533462524,-0.610131502151489,0.610131323337555,0.505449652671814,0.610131502151489,0.610131323337555,0.505449652671814,0.610131502151489,0.610131323337555,0.505449652671814,0.610131502151489,0.610131502151489,0.505449593067169,-0.6101313829422,0.610131502151489,0.505449593067169,-0.6101313829422,0.610131502151489,0.505449533462524,-0.6101313829422,-0.6101313829422,0.505449593067169,-0.610131502151489,-0.6101313829422,0.505449593067169,-0.610131502151489,-0.610131442546844,0.505449593067169,-0.610131442546844,-0.610131502151489,0.505449533462524,0.610131442546844,-0.610131502151489,0.505449533462524,0.610131442546844,-0.610131502151489,0.505449533462524,0.610131442546844 + } + BinormalsW: *56 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *168 { + a: -0.707106828689575,5.78443737353496e-09,0.707106709480286,-0.707106828689575,5.78443737353496e-09,0.707106709480286,-0.707106828689575,5.78443648535654e-09,0.707106709480286,-0.707106828689575,5.78443648535654e-09,0.707106709480286,0.707106709480286,-1.78536314621169e-08,0.70710688829422,0.707106709480286,-1.78536332384738e-08,0.70710688829422,0.707106709480286,-6.0068026108695e-09,0.707106828689575,0.707106709480286,-6.00680216678029e-09,0.707106828689575,0.707106828689575,5.89562221264828e-09,-0.707106828689575,0.707106828689575,5.89562221264828e-09,-0.707106828689575,0.707106828689575,5.89562088038065e-09,-0.707106828689575,0.707106828689575,5.89562088038065e-09,-0.707106828689575,-0.707106709480286,-6.00680394313713e-09,-0.707106828689575,-0.707106709480286,-6.00680394313713e-09,-0.707106828689575,-0.707106709480286,-6.00680305495871e-09,-0.707106828689575,-0.707106709480286,-6.00680305495871e-09,-0.707106828689575,-0.70710688829422,6.06239591860458e-09,0.707106709480286,-0.70710688829422,6.06239591860458e-09,0.707106709480286,-0.70710688829422,6.06239636269379e-09,0.707106709480286,-0.70710688829422,6.06239636269379e-09,0.707106709480286,0.707106709480286,6.0068026108695e-09,0.707106828689575,0.707106709480286,6.00680216678029e-09,0.707106828689575,0.707106709480286,1.78536314621169e-08,0.70710688829422,0.707106709480286,1.78536332384738e-08,0.70710688829422,0.707106828689575,-5.89562088038065e-09,-0.707106828689575,0.707106828689575,-5.89562088038065e-09,-0.707106828689575,0.707106828689575,-5.89562221264828e-09,-0.707106828689575,0.707106828689575,-5.89562221264828e-09,-0.707106828689575,-0.707106709480286,6.0068026108695e-09,-0.707106828689575,-0.707106709480286,6.00680305495871e-09,-0.707106828689575,-0.707106709480286,6.00680394313713e-09,-0.707106828689575,-0.707106709480286,6.00680394313713e-09,-0.707106828689575,-0.70710688829422,-6.14403532495089e-08,0.707106649875641,-0.70710688829422,-6.14403532495089e-08,0.707106649875641,-0.70710688829422,-6.14403532495089e-08,0.707106649875641, +0.707106828689575,1.37695792545856e-07,0.707106828689575,0.707106828689575,1.37695792545856e-07,0.707106828689575,0.707106828689575,1.3769580675671e-07,0.707106828689575,0.707106828689575,-8.1384733618961e-08,-0.707106709480286,0.707106828689575,-8.1384733618961e-08,-0.707106709480286,0.707106828689575,-9.95680693449685e-08,-0.707106709480286,-0.707106828689575,8.31457995786877e-08,-0.707106828689575,-0.707106828689575,8.31457995786877e-08,-0.707106828689575,-0.707106828689575,8.31457924732604e-08,-0.707106828689575,-0.70710688829422,6.14403532495089e-08,0.707106649875641,-0.70710688829422,6.14403532495089e-08,0.707106649875641,-0.70710688829422,6.14403532495089e-08,0.707106649875641,0.707106828689575,-1.37695792545856e-07,0.707106828689575,0.707106828689575,-1.37695792545856e-07,0.707106828689575,0.707106828689575,-1.3769580675671e-07,0.707106828689575,0.707106828689575,8.1384733618961e-08,-0.707106709480286,0.707106828689575,8.1384733618961e-08,-0.707106709480286,0.707106828689575,9.95680693449685e-08,-0.707106709480286,-0.70710676908493,-6.49624567472529e-08,-0.707106828689575,-0.70710676908493,-6.49624567472529e-08,-0.707106828689575,-0.70710676908493,-6.49624496418255e-08,-0.707106828689575 + } + TangentsW: *56 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *46 { + a: 0,0.25,0.25,0.25,0.5,0.25,0.75,0.25,1,0.25,0,0.5,0.25,0.5,0.5,0.5,0.75,0.5,1,0.5,0,0.75,0.25,0.75,0.5,0.75,0.75,0.75,1,0.75,0.125,0,0.375,0,0.625,0,0.875,0,0.125,1,0.375,1,0.625,1,0.875,1 + } + UVIndex: *56 { + a: 0,1,6,5,1,2,7,6,2,3,8,7,3,4,9,8,5,6,11,10,6,7,12,11,7,8,13,12,8,9,14,13,1,0,15,2,1,16,3,2,17,4,3,18,10,11,19,11,12,20,12,13,21,13,14,22 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *28 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2060818020976, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 2060814339808, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2060818024320, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 2060814325248, "Geometry::", "Mesh" { + Vertices: *15 { + a: 1.31134157754786e-07,-1,-1,-1,-1,-8.74227765734759e-08,-4.37113882867379e-08,-1,1,1,-1,0,0,1,0 + } + PolygonVertexIndex: *16 { + a: 0,3,2,-2,0,1,-5,1,2,-5,2,3,-5,3,0,-5 + } + Edges: *8 { + a: 3,2,1,0,6,5,8,11 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *48 { + a: 0,-1,5.9604651880818e-08,0,-1,5.9604651880818e-08,0,-1,5.9604651880818e-08,0,-1,5.9604651880818e-08,-0.666666567325592,0.333333313465118,-0.666666686534882,-0.666666567325592,0.333333313465118,-0.666666686534882,-0.666666626930237,0.333333343267441,-0.666666746139526,-0.666666686534882,0.333333313465118,0.666666567325592,-0.666666686534882,0.333333313465118,0.666666567325592,-0.666666746139526,0.333333343267441,0.666666626930237,0.666666686534882,0.333333343267441,0.666666686534882,0.666666686534882,0.333333343267441,0.666666686534882,0.666666626930237,0.333333313465118,0.666666626930237,0.666666686534882,0.333333343267441,-0.666666686534882,0.666666686534882,0.333333343267441,-0.666666686534882,0.666666746139526,0.333333373069763,-0.666666626930237 + } + NormalsW: *16 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *48 { + a: -1.39090658990426e-08,5.9604651880818e-08,1,-1.39090658990426e-08,5.9604651880818e-08,1,-1.39090658990426e-08,5.9604651880818e-08,1,-1.39090658990426e-08,5.9604651880818e-08,1,0.235702246427536,0.942809104919434,0.23570229113102,0.235702246427536,0.942809104919434,0.23570229113102,0.235702246427536,0.942809045314789,0.235702276229858,0.23570229113102,0.942809104919434,-0.235702246427536,0.23570229113102,0.942809104919434,-0.235702246427536,0.235702276229858,0.942809045314789,-0.235702246427536,-0.235702276229858,0.942809104919434,-0.235702276229858,-0.235702276229858,0.942809104919434,-0.235702276229858,-0.235702261328697,0.942809045314789,-0.235702261328697,-0.23570229113102,0.942809104919434,0.235702261328697,-0.23570229113102,0.942809104919434,0.235702261328697,-0.235702306032181,0.942809045314789,0.235702261328697 + } + BinormalsW: *16 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *48 { + a: 1,8.29045037949053e-16,1.39090658990426e-08,1,8.29045037949053e-16,1.39090658990426e-08,1,8.29044985009494e-16,1.39090658990426e-08,1,8.29045037949053e-16,1.39090658990426e-08,-0.707106828689575,-6.24500673396255e-09,0.707106709480286,-0.707106828689575,-6.24500673396255e-09,0.707106709480286,-0.707106828689575,-6.24501028667623e-09,0.707106709480286,0.707106709480286,7.49215445239315e-09,0.707106828689575,0.707106709480286,7.49215445239315e-09,0.707106828689575,0.707106709480286,7.49215267603631e-09,0.707106828689575,0.707106828689575,-6.86858303566851e-09,-0.707106828689575,0.707106828689575,-6.86858303566851e-09,-0.707106828689575,0.707106828689575,-6.86858214749009e-09,-0.707106828689575,-0.707106828689575,-2.06057499951839e-08,-0.707106828689575,-0.707106828689575,-2.06057499951839e-08,-0.707106828689575,-0.707106709480286,7.49215267603631e-09,-0.707106828689575 + } + TangentsW: *16 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *20 { + a: 0.500000059604645,0,0.25,0.249999985098839,0.5,0.5,0.75,0.25,0.25,0.5,0.375,0.5,0.5,0.5,0.625,0.5,0.75,0.5,0.5,1 + } + UVIndex: *16 { + a: 0,3,2,1,4,5,9,5,6,9,6,7,9,7,8,9 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *8 { + a: 0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2060238281552, "Model::LOD_Group_1", "LodGroup" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2060238293152, "Model::LOD_0", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2060238295472, "Model::pPlatonic1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2060238297792, "Model::LOD_1", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2060238288512, "Model::pPlatonic1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2060238300112, "Model::LOD_2", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2060238304752, "Model::pPlatonic1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2060238307072, "Model::LOD_Group_2", "LodGroup" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2060238279232, "Model::LOD_0", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2060238283872, "Model::pSphere1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2060238311712, "Model::LOD_1", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2060238309392, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2060238314032, "Model::LOD_2", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2060238316352, "Model::pCone1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2060559087424, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2060818053984, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2060231117120, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::LOD_Group_1, Model::RootNode + C: "OO",2060238281552,0 + + ;Model::LOD_Group_2, Model::RootNode + C: "OO",2060238307072,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2060231117120,2060818053984 + + ;NodeAttribute::, Model::LOD_Group_1 + C: "OO",2060817501920,2060238281552 + + ;Model::LOD_0, Model::LOD_Group_1 + C: "OO",2060238293152,2060238281552 + + ;Model::LOD_1, Model::LOD_Group_1 + C: "OO",2060238297792,2060238281552 + + ;Model::LOD_2, Model::LOD_Group_1 + C: "OO",2060238300112,2060238281552 + + ;NodeAttribute::, Model::LOD_0 + C: "OO",2060818026784,2060238293152 + + ;Model::pPlatonic1, Model::LOD_0 + C: "OO",2060238295472,2060238293152 + + ;Geometry::, Model::pPlatonic1 + C: "OO",2060814319840,2060238295472 + + ;Material::lambert1, Model::pPlatonic1 + C: "OO",2060559087424,2060238295472 + + ;NodeAttribute::, Model::LOD_1 + C: "OO",2060818024144,2060238297792 + + ;Model::pPlatonic1, Model::LOD_1 + C: "OO",2060238288512,2060238297792 + + ;Geometry::, Model::pPlatonic1 + C: "OO",2060814328992,2060238288512 + + ;Material::lambert1, Model::pPlatonic1 + C: "OO",2060559087424,2060238288512 + + ;NodeAttribute::, Model::LOD_2 + C: "OO",2060818024848,2060238300112 + + ;Model::pPlatonic1, Model::LOD_2 + C: "OO",2060238304752,2060238300112 + + ;Geometry::, Model::pPlatonic1 + C: "OO",2060814324832,2060238304752 + + ;Material::lambert1, Model::pPlatonic1 + C: "OO",2060559087424,2060238304752 + + ;NodeAttribute::, Model::LOD_Group_2 + C: "OO",2060817503552,2060238307072 + + ;Model::LOD_0, Model::LOD_Group_2 + C: "OO",2060238279232,2060238307072 + + ;Model::LOD_1, Model::LOD_Group_2 + C: "OO",2060238311712,2060238307072 + + ;Model::LOD_2, Model::LOD_Group_2 + C: "OO",2060238314032,2060238307072 + + ;NodeAttribute::, Model::LOD_0 + C: "OO",2060818029072,2060238279232 + + ;Model::pSphere1, Model::LOD_0 + C: "OO",2060238283872,2060238279232 + + ;Geometry::, Model::pSphere1 + C: "OO",2060814331072,2060238283872 + + ;Material::lambert1, Model::pSphere1 + C: "OO",2060559087424,2060238283872 + + ;NodeAttribute::, Model::LOD_1 + C: "OO",2060818020976,2060238311712 + + ;Model::pCube1, Model::LOD_1 + C: "OO",2060238309392,2060238311712 + + ;Geometry::, Model::pCube1 + C: "OO",2060814339808,2060238309392 + + ;Material::lambert1, Model::pCube1 + C: "OO",2060559087424,2060238309392 + + ;NodeAttribute::, Model::LOD_2 + C: "OO",2060818024320,2060238314032 + + ;Model::pCone1, Model::LOD_2 + C: "OO",2060238316352,2060238314032 + + ;Geometry::, Model::pCone1 + C: "OO",2060814325248,2060238316352 + + ;Material::lambert1, Model::pCone1 + C: "OO",2060559087424,2060238316352 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_lod_group_7500_binary.fbx b/modules/ufbx/data/maya_lod_group_7500_binary.fbx new file mode 100644 index 0000000..9e94a92 Binary files /dev/null and b/modules/ufbx/data/maya_lod_group_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_no_smoothing_7500_ascii.fbx b/modules/ufbx/data/maya_no_smoothing_7500_ascii.fbx new file mode 100644 index 0000000..3ac58c1 --- /dev/null +++ b/modules/ufbx/data/maya_no_smoothing_7500_ascii.fbx @@ -0,0 +1,378 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 8 + Hour: 16 + Minute: 6 + Second: 10 + Millisecond: 394 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_no_smoothing_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_no_smoothing_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "08/08/2021 13:06:10.393" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_no_smoothing_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "08/08/2021 13:06:10.393" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1127950210224, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1127948695920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.49999988079071,-0.49999988079071,0.215589791536331,0.49999988079071,-0.49999988079071,0.215589791536331,-0.49999988079071,0.49999988079071,0.215589791536331,0.49999988079071,0.49999988079071,0.215589791536331,-0.49999988079071,0.49999988079071,-0.215589791536331,0.49999988079071,0.49999988079071,-0.215589791536331,-0.49999988079071,-0.49999988079071,-0.215589791536331,0.49999988079071,-0.49999988079071,-0.215589791536331 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: -0.395941823720932,0,0.918275654315948,0.395941823720932,0,0.918275654315948,0.395941823720932,0,0.918275654315948,-0.395941823720932,0,0.918275654315948,0,1,0,0,1,0,0,1,0,0,1,0,-0.395941823720932,0,-0.918275654315948,0.395941823720932,0,-0.918275654315948,0.395941823720932,0,-0.918275654315948,-0.395941823720932,0,-0.918275654315948,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.395941823720932,0,0.918275654315948,0.395941823720932,0,-0.918275654315948,0.395941823720932,0,-0.918275654315948,0.395941823720932,0,0.918275654315948,-0.395941823720932,0,-0.918275654315948,-0.395941823720932,0,0.918275654315948,-0.395941823720932,0,0.918275654315948,-0.395941823720932,0,-0.918275654315948 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1127166742448, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1127672261968, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1127687978448, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1127676208720, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1127166742448,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1127676208720,1127687978448 + + ;Geometry::, Model::pCube1 + C: "OO",1127948695920,1127166742448 + + ;Material::lambert1, Model::pCube1 + C: "OO",1127672261968,1127166742448 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_node_attribute_zoo_6100_ascii.fbx b/modules/ufbx/data/maya_node_attribute_zoo_6100_ascii.fbx new file mode 100644 index 0000000..ac2762f --- /dev/null +++ b/modules/ufbx/data/maya_node_attribute_zoo_6100_ascii.fbx @@ -0,0 +1,2759 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 7 + Day: 31 + Hour: 23 + Minute: 13 + Second: 49 + Millisecond: 139 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 33 + ObjectType: "Model" { + Count: 15 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "NodeAttribute" { + Count: 2 + } + ObjectType: "Geometry" { + Count: 13 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Null", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::Null_ncl1_1" + } + Model: "Model::Mesh", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::Mesh_ncl1_1" + } + Model: "Model::Bone", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4.00048738794101,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",16.6666666666667 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::Bone_ncl1_1" + } + Model: "Model::Camera", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",6,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",6,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",6,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",960 + Property: "AspectHeight", "double", "N",540 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",1.41732 + Property: "FilmHeight", "Number", "AN",0.94488 + Property: "FilmAspectRatio", "double", "N",1.5 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",3 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",35 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",0 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 6,0,0 + Up: 0,1,0 + LookAt: 6,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + NodeAttributeName: "NodeAttribute::Camera_ncl1_1" + } + Model: "Model::Light", "Light" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,2 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "Color", "AN",1,1,1 + Property: "LightType", "enum", "N",0 + Property: "CastLightOnObject", "bool", "N",1 + Property: "DrawVolumetricLight", "bool", "N",1 + Property: "DrawGroundProjection", "bool", "N",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "N",0 + Property: "Intensity", "Number", "AN",100 + Property: "Fog", "Number", "AN",50 + Property: "DecayType", "enum", "N",0 + Property: "DecayStart", "Number", "AN",0 + Property: "FileName", "KString", "N", "" + Property: "EnableNearAttenuation", "bool", "N",0 + Property: "NearAttenuationStart", "Number", "AN",0 + Property: "NearAttenuationEnd", "Number", "AN",0 + Property: "EnableFarAttenuation", "bool", "N",0 + Property: "FarAttenuationStart", "Number", "AN",0 + Property: "FarAttenuationEnd", "Number", "AN",0 + Property: "CastShadows", "bool", "N",1 + Property: "ShadowColor", "Color", "AN",0,0,0 + Property: "HotSpot", "Number", "AN",0 + Property: "Cone angle", "Number", "AN",45 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Light" + GeometryVersion: 124 + NodeAttributeName: "NodeAttribute::Light_ncl1_1" + } + Model: "Model::StereoCamera", "CameraStereo" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2,0,2 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "stereoRigType", "KString", "U", "StereoCamera" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",2,0,2 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",2,0,-3 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",960 + Property: "AspectHeight", "double", "N",540 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",1.41732 + Property: "FilmHeight", "Number", "AN",0.94488 + Property: "FilmAspectRatio", "double", "N",1.5 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",2 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "A+N",35.6990219446043 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",0 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + Property: "Stereo", "enum", "N",2 + Property: "InteraxialSeparation", "Number", "AN",1.03896103992865 + Property: "ZeroParallax", "Number", "AN",254 + Property: "ToeInAdjust", "Number", "AN",0 + Property: "FilmOffsetRightCam", "Number", "AN",0 + Property: "FilmOffsetLeftCam", "Number", "AN",0 + Property: "RightCamera", "object", "N" + Property: "LeftCamera", "object", "N" + Property: "PrecompFileName", "KString", "N", "" + Property: "RelativePrecompFileName", "KString", "N", "" + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "CameraStereo" + Version: 100 + NodeAttributeName: "NodeAttribute::StereoCamera_ncl1_1" + } + Model: "Model::NurbsCurve", "NurbsCurve" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",4,0,2 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + } + Model: "Model::NurbsSurface", "NurbsSurface" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",6,0,2 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + } + Model: "Model::curve1", "NurbsCurve" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + } + Model: "Model::NurbsTrim", "TrimNurbsSurface" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,4 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + } + Model: "Model::LodGroup", "LodGroup" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2,0,4 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "ThresholdsUsedAsPercentage", "bool", "N",1 + Property: "MinMaxDistance", "bool", "N",0 + Property: "MinDistance", "double", "N",-100 + Property: "MaxDistance", "double", "N",100 + Property: "WorldSpace", "bool", "N",1 + Property: "DisplayLevels|Level0", "enum", "N",0 + Property: "DisplayLevels|Level1", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + NodeAttributeName: "NodeAttribute::LodGroup_ncl1_1" + } + Model: "Model::LOD_0", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::LOD_0_ncl1_1" + } + Model: "Model::pSphere1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: 0.250000029802322,-0.95105654001236,-0.181635692715645,0.0954914912581444,-0.95105654001236,-0.293892711400986,-0.0954915508627892 + ,-0.95105654001236,-0.293892651796341,-0.250000059604645,-0.95105654001236,-0.181635633111,-0.309017032384872,-0.95105654001236 + ,1.84188486684889e-08,-0.250000029802322,-0.95105654001236,0.181635677814484,-0.095491498708725,-0.95105654001236 + ,0.293892651796341,0.0954915136098862,-0.95105654001236,0.293892651796341,0.25,-0.95105654001236,0.181635633111,0.30901700258255 + ,-0.95105654001236,0,0.475528299808502,-0.80901700258255,-0.345491588115692,0.181635603308678,-0.80901700258255,-0.55901712179184 + ,-0.181635722517967,-0.80901700258255,-0.559017062187195,-0.475528359413147,-0.80901700258255,-0.345491498708725,-0.587785303592682 + ,-0.80901700258255,3.50347306721233e-08,-0.475528299808502,-0.80901700258255,0.34549155831337,-0.181635618209839,-0.80901700258255 + ,0.559017062187195,0.181635648012161,-0.80901700258255,0.55901700258255,0.47552827000618,-0.80901700258255,0.345491498708725 + ,0.587785243988037,-0.80901700258255,0,0.654508531093597,-0.587785243988037,-0.475528389215469,0.249999955296516,-0.587785243988037 + ,-0.76942104101181,-0.25000011920929,-0.587785243988037,-0.769420981407166,-0.654508650302887,-0.587785243988037,-0.47552827000618 + ,-0.80901712179184,-0.587785243988037,4.82211710561842e-08,-0.654508531093597,-0.587785243988037,0.475528359413147 + ,-0.249999985098839,-0.587785243988037,0.769420981407166,0.250000029802322,-0.587785243988037,0.769420921802521,0.654508531093597 + ,-0.587785243988037,0.47552827000618,0.80901700258255,-0.587785243988037,0,0.769420981407166,-0.309016972780228,-0.559017181396484 + ,0.293892592191696,-0.309016972780228,-0.904508709907532,-0.29389277100563,-0.309016972780228,-0.904508590698242,-0.769421100616455 + ,-0.309016972780228,-0.55901700258255,-0.951056659221649,-0.309016972780228,5.66873872287488e-08,-0.769420981407166 + ,-0.309016972780228,0.55901712179184,-0.293892621994019,-0.309016972780228,0.904508590698242,0.293892681598663,-0.309016972780228 + ,0.904508531093597,0.769420921802521,-0.309016972780228,0.55901700258255,0.95105654001236,-0.309016972780228,0,0.809017062187195 + ,0,-0.587785422801971,0.309016942977905,0,-0.951056718826294,-0.309017151594162,0,-0.951056599617004,-0.809017181396484 + ,0,-0.587785243988037,-1.00000011920929,0,5.96046447753906e-08,-0.809017062187195,0,0.587785363197327,-0.309016972780228 + ,0,0.951056599617004,0.309017032384872,0,0.95105654001236,0.80901700258255,0,0.587785243988037,1,0,0,0.769420981407166 + ,0.309016972780228,-0.559017181396484,0.293892592191696,0.309016972780228,-0.904508709907532,-0.29389277100563,0.309016972780228 + ,-0.904508590698242,-0.769421100616455,0.309016972780228,-0.55901700258255,-0.951056659221649,0.309016972780228,5.66873872287488e-08 + ,-0.769420981407166,0.309016972780228,0.55901712179184,-0.293892621994019,0.309016972780228,0.904508590698242,0.293892681598663 + ,0.309016972780228,0.904508531093597,0.769420921802521,0.309016972780228,0.55901700258255,0.95105654001236,0.309016972780228 + ,0,0.654508531093597,0.587785243988037,-0.475528389215469,0.249999955296516,0.587785243988037,-0.76942104101181,-0.25000011920929 + ,0.587785243988037,-0.769420981407166,-0.654508650302887,0.587785243988037,-0.47552827000618,-0.80901712179184,0.587785243988037 + ,4.82211710561842e-08,-0.654508531093597,0.587785243988037,0.475528359413147,-0.249999985098839,0.587785243988037 + ,0.769420981407166,0.250000029802322,0.587785243988037,0.769420921802521,0.654508531093597,0.587785243988037,0.47552827000618 + ,0.80901700258255,0.587785243988037,0,0.475528299808502,0.80901700258255,-0.345491588115692,0.181635603308678,0.80901700258255 + ,-0.55901712179184,-0.181635722517967,0.80901700258255,-0.559017062187195,-0.475528359413147,0.80901700258255,-0.345491498708725 + ,-0.587785303592682,0.80901700258255,3.50347306721233e-08,-0.475528299808502,0.80901700258255,0.34549155831337,-0.181635618209839 + ,0.80901700258255,0.559017062187195,0.181635648012161,0.80901700258255,0.55901700258255,0.47552827000618,0.80901700258255 + ,0.345491498708725,0.587785243988037,0.80901700258255,0,0.250000029802322,0.95105654001236,-0.181635692715645,0.0954914912581444 + ,0.95105654001236,-0.293892711400986,-0.0954915508627892,0.95105654001236,-0.293892651796341,-0.250000059604645,0.95105654001236 + ,-0.181635633111,-0.309017032384872,0.95105654001236,1.84188486684889e-08,-0.250000029802322,0.95105654001236,0.181635677814484 + ,-0.095491498708725,0.95105654001236,0.293892651796341,0.0954915136098862,0.95105654001236,0.293892651796341,0.25 + ,0.95105654001236,0.181635633111,0.30901700258255,0.95105654001236,0,0,-1,0,0,1,0 + PolygonVertexIndex: 0,1,11,-11,1,2,12,-12,2,3,13,-13,3,4,14,-14,4,5,15,-15,5,6,16,-16,6,7,17,-17,7,8,18,-18,8,9,19,-19,9,0,10,-20,10,11 + ,21,-21,11,12,22,-22,12,13,23,-23,13,14,24,-24,14,15,25,-25,15,16,26,-26,16,17,27,-27,17,18,28,-28,18,19,29,-29,19 + ,10,20,-30,20,21,31,-31,21,22,32,-32,22,23,33,-33,23,24,34,-34,24,25,35,-35,25,26,36,-36,26,27,37,-37,27,28,38,-38 + ,28,29,39,-39,29,20,30,-40,30,31,41,-41,31,32,42,-42,32,33,43,-43,33,34,44,-44,34,35,45,-45,35,36,46,-46,36,37,47 + ,-47,37,38,48,-48,38,39,49,-49,39,30,40,-50,40,41,51,-51,41,42,52,-52,42,43,53,-53,43,44,54,-54,44,45,55,-55,45,46 + ,56,-56,46,47,57,-57,47,48,58,-58,48,49,59,-59,49,40,50,-60,50,51,61,-61,51,52,62,-62,52,53,63,-63,53,54,64,-64,54 + ,55,65,-65,55,56,66,-66,56,57,67,-67,57,58,68,-68,58,59,69,-69,59,50,60,-70,60,61,71,-71,61,62,72,-72,62,63,73,-73 + ,63,64,74,-74,64,65,75,-75,65,66,76,-76,66,67,77,-77,67,68,78,-78,68,69,79,-79,69,60,70,-80,70,71,81,-81,71,72,82 + ,-82,72,73,83,-83,73,74,84,-84,74,75,85,-85,75,76,86,-86,76,77,87,-87,77,78,88,-88,78,79,89,-89,79,70,80,-90,1,0,-91 + ,2,1,-91,3,2,-91,4,3,-91,5,4,-91,6,5,-91,7,6,-91,8,7,-91,9,8,-91,0,9,-91,80,81,-92,81,82,-92,82,83,-92,83,84,-92,84 + ,85,-92,85,86,-92,86,87,-92,87,88,-92,88,89,-92,89,80,-92 + Edges: 0,4,8,12,16,20,24,28,32,36,2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110,114 + ,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230 + ,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294,298,302,306,310,314,318,3,1,5,9,13,17,21,25,29,33 + ,43,41,45,49,53,57,61,65,69,73,83,81,85,89,93,97,101,105,109,113,123,121,125,129,133,137,141,145,149,153,163,161,165 + ,169,173,177,181,185,189,193,203,201,205,209,213,217,221,225,229,233,243,241,245,249,253,257,261,265,269,273,283,281 + ,285,289,293,297,301,305,309,313,321,322,325,328,331,334,337,340,343,346,352,351,354,357,360,363,366,369,372,375 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0.277577847242355,-0.881467998027802,-0.382053256034851,0.277577847242355,-0.881468057632446,-0.382053256034851 + ,0.277577847242355,-0.881468057632446,-0.382053226232529,0.277577847242355,-0.881468057632446,-0.382053256034851 + ,-1.34078504743229e-07,-0.881467998027802,-0.472243756055832,-1.34078490532374e-07,-0.881467998027802,-0.472243696451187 + ,-1.3407847632152e-07,-0.881467998027802,-0.472243696451187,-1.34078490532374e-07,-0.881467998027802,-0.472243696451187 + ,-0.277577847242355,-0.881467998027802,-0.382053196430206,-0.277577847242355,-0.881467998027802,-0.382053196430206 + ,-0.277577877044678,-0.881468117237091,-0.382053226232529,-0.277577847242355,-0.881468057632446,-0.382053226232529 + ,-0.449130415916443,-0.881468117237091,-0.145931214094162,-0.449130356311798,-0.881468117237091,-0.145931214094162 + ,-0.44913038611412,-0.881468117237091,-0.145931199193001,-0.449130415916443,-0.881468117237091,-0.145931214094162 + ,-0.449130445718765,-0.881468117237091,0.145931243896484,-0.449130445718765,-0.881468117237091,0.145931243896484 + ,-0.449130415916443,-0.881467998027802,0.145931243896484,-0.449130415916443,-0.881467998027802,0.145931243896484 + ,-0.277577817440033,-0.881468117237091,0.382053166627884,-0.277577787637711,-0.881468117237091,0.382053166627884 + ,-0.277577787637711,-0.881468117237091,0.382053166627884,-0.277577817440033,-0.881468057632446,0.382053166627884 + ,0,-0.881467878818512,0.472243905067444,0,-0.881467878818512,0.472243905067444,0,-0.881467878818512,0.472243964672089 + ,0,-0.881467938423157,0.472243905067444,0.277577936649323,-0.881468117237091,0.382052958011627,0.277577936649323 + ,-0.881468057632446,0.382052958011627,0.277577966451645,-0.881468057632446,0.38205298781395,0.277577966451645 + ,-0.881468057632446,0.38205298781395,0.449130445718765,-0.881468117237091,0.145931243896484,0.44913050532341 + ,-0.881468117237091,0.145931258797646,0.44913050532341,-0.881468057632446,0.145931273698807,0.44913050532341 + ,-0.881468057632446,0.145931273698807,0.449130475521088,-0.881467938423157,-0.145931407809258,0.44913050532341 + ,-0.881467878818512,-0.145931407809258,0.449130564928055,-0.881467998027802,-0.14593143761158,0.449130535125732 + ,-0.881467998027802,-0.145931422710419,0.425919204950333,-0.68915182352066,-0.586227416992188,0.425919234752655 + ,-0.68915182352066,-0.586227476596832,0.425919234752655,-0.68915182352066,-0.586227476596832,0.425919204950333 + ,-0.689151763916016,-0.586227416992188,-1.13074278829117e-07,-0.689151763916016,-0.724617063999176,-1.13074264618263e-07 + ,-0.689151704311371,-0.724617004394531,-1.1307427172369e-07,-0.689151763916016,-0.724617004394531,-1.1307427172369e-07 + ,-0.689151763916016,-0.724617004394531,-0.425919234752655,-0.689151704311371,-0.586227476596832,-0.425919204950333 + ,-0.689151704311371,-0.586227476596832,-0.425919234752655,-0.689151704311371,-0.586227476596832,-0.425919234752655 + ,-0.689151704311371,-0.586227476596832,-0.689151763916016,-0.689151704311371,-0.223918959498405,-0.689151704311371 + ,-0.689151644706726,-0.223918959498405,-0.689151763916016,-0.689151704311371,-0.223918989300728,-0.689151763916016 + ,-0.689151704311371,-0.223918989300728,-0.689151644706726,-0.689151763916016,0.223919078707695,-0.689151644706726 + ,-0.689151763916016,0.223919063806534,-0.689151644706726,-0.689151763916016,0.223919063806534,-0.689151644706726 + ,-0.689151763916016,0.223919063806534,-0.425919145345688,-0.689151763916016,0.586227536201477,-0.425919145345688 + ,-0.689151763916016,0.586227536201477,-0.425919145345688,-0.689151763916016,0.586227595806122,-0.425919115543365 + ,-0.689151704311371,0.586227536201477,1.13074285934545e-07,-0.689151763916016,0.724617063999176,1.13074293039972e-07 + ,-0.68915182352066,0.724617004394531,1.13074285934545e-07,-0.689151763916016,0.724617004394531,1.13074278829117e-07 + ,-0.689151763916016,0.724617004394531,0.42591917514801,-0.689151883125305,0.586227416992188,0.42591917514801 + ,-0.689151883125305,0.586227416992188,0.425919145345688,-0.68915182352066,0.586227416992188,0.425919145345688 + ,-0.68915182352066,0.586227416992188,0.689151763916016,-0.689151763916016,0.223918870091438,0.689151763916016 + ,-0.689151763916016,0.223918884992599,0.689151763916016,-0.689151763916016,0.223918855190277,0.68915182352066 + ,-0.68915182352066,0.223918870091438,0.68915182352066,-0.689151763916016,-0.223918825387955,0.689151763916016 + ,-0.689151704311371,-0.223918825387955,0.68915182352066,-0.689151763916016,-0.223918840289116,0.68915182352066 + ,-0.689151704311371,-0.223918825387955,0.528951525688171,-0.436083436012268,-0.728039503097534,0.528951525688171 + ,-0.436083436012268,-0.728039503097534,0.528951525688171,-0.436083436012268,-0.728039443492889,0.528951525688171 + ,-0.436083436012268,-0.728039443492889,-8.84424622427105e-08,-0.436083436012268,-0.89990621805191,-8.84424622427105e-08 + ,-0.436083406209946,-0.899906277656555,-8.84424622427105e-08,-0.436083406209946,-0.899906277656555,-8.84424480318557e-08 + ,-0.436083376407623,-0.899906277656555,-0.528951585292816,-0.436083406209946,-0.728039503097534,-0.528951644897461 + ,-0.436083436012268,-0.728039503097534,-0.528951644897461,-0.436083406209946,-0.728039503097534,-0.528951644897461 + ,-0.436083376407623,-0.728039443492889,-0.855861723423004,-0.436083436012268,-0.278086215257645,-0.855861723423004 + ,-0.436083436012268,-0.278086215257645,-0.855861663818359,-0.436083436012268,-0.278086185455322,-0.855861663818359 + ,-0.436083436012268,-0.278086185455322,-0.855861783027649,-0.436083316802979,0.278086453676224,-0.855861723423004 + ,-0.436083287000656,0.278086453676224,-0.855861663818359,-0.436083287000656,0.278086423873901,-0.855861663818359 + ,-0.436083287000656,0.278086423873901,-0.528951644897461,-0.43608346581459,0.728039503097534,-0.528951585292816 + ,-0.436083406209946,0.728039443492889,-0.528951585292816,-0.436083406209946,0.728039443492889,-0.528951644897461 + ,-0.436083436012268,0.728039443492889,8.84424693481378e-08,-0.436083346605301,0.899906277656555,8.84424835589925e-08 + ,-0.436083376407623,0.899906277656555,8.84424764535652e-08,-0.436083376407623,0.899906277656555,8.84424764535652e-08 + ,-0.436083376407623,0.899906277656555,0.528951704502106,-0.436083287000656,0.728039443492889,0.528951585292816 + ,-0.436083287000656,0.728039443492889,0.528951704502106,-0.436083376407623,0.728039562702179,0.528951644897461 + ,-0.436083287000656,0.728039443492889,0.855861842632294,-0.436083257198334,0.278086304664612,0.855861842632294 + ,-0.436083257198334,0.278086304664612,0.855861783027649,-0.436083287000656,0.278086304664612,0.855861783027649 + ,-0.436083287000656,0.278086304664612,0.855861604213715,-0.436083614826202,-0.278086155653,0.855861663818359 + ,-0.436083644628525,-0.278086155653,0.855861604213715,-0.436083674430847,-0.278086125850677,0.855861663818359 + ,-0.436083644628525,-0.278086125850677,0.581228017807007,-0.148952037096024,-0.799992024898529,0.581228077411652 + ,-0.148952051997185,-0.799992024898529,0.581228017807007,-0.148952022194862,-0.799992024898529,0.581228077411652 + ,-0.148952022194862,-0.799992024898529,-1.58177030584739e-07,-0.148952126502991,-0.988844394683838,-1.58177044795593e-07 + ,-0.148952141404152,-0.988844394683838,-1.58177044795593e-07,-0.148952141404152,-0.988844394683838,-1.58177044795593e-07 + ,-0.148952141404152,-0.988844454288483,-0.581228256225586,-0.148952201008797,-0.79999178647995,-0.581228256225586 + ,-0.148952201008797,-0.79999178647995,-0.581228256225586,-0.148952230811119,-0.799991846084595,-0.581228256225586 + ,-0.148952230811119,-0.799991846084595,-0.940446972846985,-0.148952201008797,-0.305569589138031,-0.94044691324234 + ,-0.148952201008797,-0.305569589138031,-0.94044691324234,-0.148952201008797,-0.305569559335709,-0.94044691324234 + ,-0.148952201008797,-0.305569559335709,-0.940446853637695,-0.148952186107635,0.305569797754288,-0.940446853637695 + ,-0.148952186107635,0.305569797754288,-0.940446853637695,-0.148952201008797,0.305569797754288,-0.940446853637695 + ,-0.148952201008797,0.305569797754288,-0.581228137016296,-0.148952037096024,0.799991965293884,-0.581228137016296 + ,-0.148952037096024,0.799991965293884,-0.581228137016296,-0.148952022194862,0.799991965293884,-0.581228137016296 + ,-0.148952022194862,0.799991965293884,1.58177044795593e-07,-0.14895211160183,0.988844394683838,1.58177044795593e-07 + ,-0.14895211160183,0.988844394683838,1.58177059006448e-07,-0.148952126502991,0.988844394683838,1.58177059006448e-07 + ,-0.148952126502991,0.988844394683838,0.581228196620941,-0.148952051997185,0.79999190568924,0.581228256225586 + ,-0.148952066898346,0.79999190568924,0.581228196620941,-0.148952051997185,0.799991846084595,0.581228196620941 + ,-0.148952037096024,0.79999178647995,0.940446972846985,-0.148952096700668,0.305569738149643,0.94044691324234 + ,-0.148952096700668,0.305569708347321,0.94044691324234,-0.148952066898346,0.305569708347321,0.94044691324234 + ,-0.148952066898346,0.305569708347321,0.940447092056274,-0.148951828479767,-0.305569529533386,0.94044703245163 + ,-0.148951813578606,-0.305569499731064,0.94044703245163,-0.148951828479767,-0.305569529533386,0.940446972846985 + ,-0.148951813578606,-0.305569499731064,0.581228077411652,0.148952022194862,-0.799992024898529,0.581228017807007 + ,0.148952022194862,-0.799992024898529,0.581228077411652,0.148952051997185,-0.799992024898529,0.581228017807007 + ,0.148952037096024,-0.799992024898529,-1.58177044795593e-07,0.148952141404152,-0.988844454288483,-1.58177044795593e-07 + ,0.148952141404152,-0.988844394683838,-1.58177044795593e-07,0.148952141404152,-0.988844394683838,-1.58177030584739e-07 + ,0.148952126502991,-0.988844394683838,-0.581228256225586,0.148952230811119,-0.799991846084595,-0.581228256225586 + ,0.148952230811119,-0.799991846084595,-0.581228256225586,0.148952201008797,-0.79999178647995,-0.581228256225586 + ,0.148952201008797,-0.79999178647995,-0.94044691324234,0.148952186107635,-0.305569559335709,-0.94044691324234 + ,0.148952186107635,-0.305569559335709,-0.940446972846985,0.148952201008797,-0.305569589138031,-0.940446972846985 + ,0.148952201008797,-0.305569589138031,-0.940446853637695,0.148952350020409,0.305569797754288,-0.940446853637695 + ,0.148952350020409,0.305569797754288,-0.940446853637695,0.148952350020409,0.305569797754288,-0.940446853637695 + ,0.148952350020409,0.305569797754288,-0.581228137016296,0.148952007293701,0.79999190568924,-0.581228137016296 + ,0.148952007293701,0.79999190568924,-0.581228137016296,0.148952037096024,0.799991965293884,-0.581228137016296 + ,0.148952037096024,0.799991965293884,1.58177073217303e-07,0.148952141404152,0.988844454288483,1.58177073217303e-07 + ,0.148952141404152,0.988844454288483,1.58177044795593e-07,0.14895211160183,0.988844335079193,1.58177044795593e-07 + ,0.14895211160183,0.988844335079193,0.581228256225586,0.148952051997185,0.799991846084595,0.581228196620941,0.148952051997185 + ,0.799991846084595,0.581228196620941,0.148952051997185,0.79999190568924,0.581228196620941,0.148952066898346,0.79999190568924 + ,0.94044691324234,0.148952066898346,0.305569708347321,0.94044691324234,0.148952066898346,0.305569708347321,0.94044691324234 + ,0.148952096700668,0.305569708347321,0.940446972846985,0.148952096700668,0.305569738149643,0.940446972846985 + ,0.148951977491379,-0.305569499731064,0.94044703245163,0.148952007293701,-0.305569529533386,0.94044703245163 + ,0.148951977491379,-0.305569499731064,0.940447092056274,0.14895199239254,-0.305569529533386,0.528951525688171 + ,0.436083436012268,-0.728039443492889,0.528951525688171,0.436083436012268,-0.728039443492889,0.528951525688171 + ,0.436083436012268,-0.728039503097534,0.528951525688171,0.436083436012268,-0.728039503097534,-8.84424480318557e-08 + ,0.436083376407623,-0.899906277656555,-8.84424622427105e-08,0.436083406209946,-0.899906277656555,-8.84424622427105e-08 + ,0.436083406209946,-0.899906277656555,-8.84424622427105e-08,0.436083436012268,-0.89990621805191,-0.528951644897461 + ,0.436083436012268,-0.728039383888245,-0.528951644897461,0.436083436012268,-0.728039443492889,-0.528951644897461 + ,0.436083436012268,-0.728039443492889,-0.528951585292816,0.43608346581459,-0.728039383888245,-0.855861663818359 + ,0.436083436012268,-0.278086185455322,-0.855861663818359,0.436083436012268,-0.278086185455322,-0.855861723423004 + ,0.436083436012268,-0.278086215257645,-0.855861723423004,0.436083436012268,-0.278086215257645,-0.855861663818359 + ,0.436083287000656,0.278086394071579,-0.855861663818359,0.436083287000656,0.278086394071579,-0.855861723423004 + ,0.436083287000656,0.278086423873901,-0.855861783027649,0.436083316802979,0.278086423873901,-0.528951644897461 + ,0.436083436012268,0.728039443492889,-0.528951585292816,0.436083406209946,0.728039443492889,-0.528951585292816 + ,0.436083406209946,0.728039443492889,-0.528951644897461,0.43608346581459,0.728039503097534,8.84424622427105e-08 + ,0.436083316802979,0.89990621805191,8.84424622427105e-08,0.436083316802979,0.89990621805191,8.84424764535652e-08 + ,0.436083406209946,0.899906277656555,8.84424693481378e-08,0.436083376407623,0.899906277656555,0.528951585292816 + ,0.436083257198334,0.728039562702179,0.528951585292816,0.436083257198334,0.728039503097534,0.528951585292816 + ,0.436083257198334,0.728039503097534,0.528951585292816,0.436083227396011,0.728039503097534,0.855861783027649 + ,0.436083287000656,0.278086304664612,0.855861783027649,0.436083287000656,0.278086304664612,0.855861842632294 + ,0.436083257198334,0.278086304664612,0.855861842632294,0.436083257198334,0.278086304664612,0.855861663818359 + ,0.436083644628525,-0.278086125850677,0.855861604213715,0.436083674430847,-0.278086125850677,0.855861663818359 + ,0.436083644628525,-0.278086155653,0.855861604213715,0.436083614826202,-0.278086155653,0.425919204950333,0.68915182352066 + ,-0.586227416992188,0.425919145345688,0.689151763916016,-0.586227357387543,0.42591917514801,0.689151763916016 + ,-0.586227416992188,0.425919204950333,0.689151883125305,-0.586227416992188,-1.1307427172369e-07,0.689151763916016 + ,-0.724617004394531,-1.1307427172369e-07,0.689151763916016,-0.724617004394531,-1.13074264618263e-07,0.689151704311371 + ,-0.724617004394531,-1.13074278829117e-07,0.689151763916016,-0.724617063999176,-0.425919264554977,0.68915182352066 + ,-0.586227357387543,-0.425919264554977,0.68915182352066,-0.586227357387543,-0.425919324159622,0.68915182352066 + ,-0.586227416992188,-0.4259192943573,0.68915182352066,-0.586227416992188,-0.689151763916016,0.68915182352066 + ,-0.223918974399567,-0.689151763916016,0.689151763916016,-0.223918959498405,-0.689151763916016,0.689151763916016 + ,-0.223918959498405,-0.689151644706726,0.689151704311371,-0.223918944597244,-0.689151704311371,0.68915182352066 + ,0.223918959498405,-0.689151704311371,0.68915182352066,0.223918959498405,-0.689151644706726,0.689151763916016 + ,0.223918929696083,-0.689151644706726,0.689151763916016,0.223918944597244,-0.425919115543365,0.689151704311371 + ,0.586227595806122,-0.425919115543365,0.689151644706726,0.586227595806122,-0.425919145345688,0.689151763916016 + ,0.586227655410767,-0.425919145345688,0.689151763916016,0.586227655410767,1.13074278829117e-07,0.689151763916016 + ,0.724617004394531,1.13074278829117e-07,0.689151763916016,0.724617004394531,1.13074293039972e-07,0.689151763916016 + ,0.724617004394531,1.13074285934545e-07,0.68915182352066,0.724617004394531,0.425919145345688,0.689151883125305 + ,0.586227416992188,0.425919145345688,0.689151883125305,0.586227416992188,0.42591917514801,0.689151883125305,0.586227416992188 + ,0.42591917514801,0.689151883125305,0.586227416992188,0.68915182352066,0.68915182352066,0.223918870091438,0.689151763916016 + ,0.689151763916016,0.223918855190277,0.689151763916016,0.689151763916016,0.223918884992599,0.689151763916016 + ,0.689151763916016,0.223918870091438,0.689151763916016,0.68915182352066,-0.223918825387955,0.689151763916016 + ,0.68915182352066,-0.223918810486794,0.689151763916016,0.68915182352066,-0.223918825387955,0.689151704311371 + ,0.689151763916016,-0.223918810486794,0.277577847242355,0.881468057632446,-0.382053256034851,0.277577847242355 + ,0.881468057632446,-0.382053226232529,0.277577847242355,0.881468057632446,-0.382053256034851,0.277577847242355 + ,0.881467998027802,-0.382053256034851,-1.34078490532374e-07,0.881467998027802,-0.472243696451187,-1.3407847632152e-07 + ,0.881467998027802,-0.472243696451187,-1.34078490532374e-07,0.881467998027802,-0.472243696451187,-1.34078504743229e-07 + ,0.881467998027802,-0.472243756055832,-0.277577817440033,0.881468117237091,-0.382053196430206,-0.277577817440033 + ,0.881468057632446,-0.382053196430206,-0.277577847242355,0.881468117237091,-0.382053196430206,-0.277577847242355 + ,0.881468117237091,-0.382053196430206,-0.449130356311798,0.881468117237091,-0.145931199193001,-0.449130356311798 + ,0.881468057632446,-0.145931199193001,-0.449130356311798,0.881468117237091,-0.145931199193001,-0.44913038611412 + ,0.881468117237091,-0.145931199193001,-0.449130475521088,0.881468057632446,0.145931243896484,-0.449130475521088 + ,0.881468057632446,0.145931243896484,-0.449130445718765,0.881467998027802,0.145931228995323,-0.449130445718765 + ,0.881467998027802,0.145931228995323,-0.277577787637711,0.881468057632446,0.382053285837173,-0.277577757835388 + ,0.881467998027802,0.382053285837173,-0.277577728033066,0.881467998027802,0.382053285837173,-0.277577787637711 + ,0.881467998027802,0.382053285837173,0,0.881467938423157,0.472243905067444,0,0.881467878818512,0.472243964672089 + ,0,0.881467878818512,0.472243905067444,0,0.881467878818512,0.472243905067444,0.277577966451645,0.881468057632446 + ,0.382053166627884,0.277577966451645,0.881468057632446,0.382053166627884,0.277577936649323,0.881468057632446 + ,0.382053107023239,0.277577936649323,0.881468117237091,0.382053136825562,0.44913050532341,0.881468057632446,0.145931273698807 + ,0.44913050532341,0.881468057632446,0.145931273698807,0.44913050532341,0.881468117237091,0.145931258797646,0.449130445718765 + ,0.881468117237091,0.145931243896484,0.44913050532341,0.881468117237091,-0.14593106508255,0.44913050532341,0.881467998027802 + ,-0.14593106508255,0.449130535125732,0.881467998027802,-0.14593106508255,0.449130535125732,0.881468057632446 + ,-0.145931079983711,0.0965570956468582,-0.986414968967438,-0.132899314165115,0.0965570956468582,-0.986414968967438 + ,-0.132899314165115,0.0965571030974388,-0.986414968967438,-0.132899314165115,-4.91018070647442e-08,-0.986415028572083 + ,-0.164272397756577,-4.91018070647442e-08,-0.986414909362793,-0.164272382855415,-4.91018070647442e-08,-0.986414968967438 + ,-0.164272367954254,-0.0965571328997612,-0.986415028572083,-0.132899090647697,-0.0965571328997612,-0.986415028572083 + ,-0.132899090647697,-0.0965571179986,-0.986414968967438,-0.132899075746536,-0.156232699751854,-0.986414968967438 + ,-0.050763163715601,-0.156232699751854,-0.986414968967438,-0.050763163715601,-0.156232714653015,-0.986414968967438 + ,-0.0507631674408913,-0.15623265504837,-0.986414968967438,0.0507631450891495,-0.156232669949532,-0.986414968967438 + ,0.0507631450891495,-0.156232640147209,-0.986414849758148,0.0507631413638592,-0.0965571030974388,-0.986414909362793 + ,0.13289912045002,-0.0965571179986,-0.986415028572083,0.132899135351181,-0.0965571105480194,-0.986414909362793 + ,0.13289912045002,0,-0.986415028572083,0.164272427558899,0,-0.986415028572083,0.164272427558899,0,-0.986415028572083 + ,0.164272427558899,0.0965571403503418,-0.986414968967438,0.13289912045002,0.0965571478009224,-0.986415028572083 + ,0.13289912045002,0.0965571403503418,-0.986415028572083,0.13289912045002,0.156232699751854,-0.986414968967438 + ,0.0507631674408913,0.156232699751854,-0.986414909362793,0.050763163715601,0.156232714653015,-0.986414968967438 + ,0.050763163715601,0.156232669949532,-0.986414909362793,-0.0507631376385689,0.156232684850693,-0.986414968967438 + ,-0.0507631413638592,0.156232669949532,-0.986414968967438,-0.0507631339132786,0.0965571105480194,0.986415088176727 + ,-0.132899075746536,0.0965570956468582,0.986414968967438,-0.132899045944214,0.0965570956468582,0.986414968967438 + ,-0.132899060845375,-4.91018070647442e-08,0.986414909362793,-0.164272382855415,-4.91018070647442e-08,0.986415028572083 + ,-0.164272397756577,-4.91018070647442e-08,0.986414968967438,-0.164272367954254,-0.0965571030974388,0.986414909362793 + ,-0.132899343967438,-0.0965571030974388,0.986414909362793,-0.132899343967438,-0.0965571105480194,0.986414968967438 + ,-0.132899343967438,-0.156232699751854,0.986414968967438,-0.050763163715601,-0.156232699751854,0.986414968967438 + ,-0.050763163715601,-0.156232714653015,0.986414968967438,-0.0507631674408913,-0.156232669949532,0.986414968967438 + ,0.0507631450891495,-0.15623265504837,0.986414968967438,0.0507631450891495,-0.156232640147209,0.986414849758148 + ,0.0507631413638592,-0.0965571105480194,0.986415028572083,0.132899105548859,-0.0965571030974388,0.986414968967438 + ,0.132899105548859,-0.0965571030974388,0.986414968967438,0.132899090647697,0,0.986415028572083,0.164272427558899 + ,0,0.986415028572083,0.164272427558899,0,0.986415028572083,0.164272427558899,0.0965571478009224,0.986414909362793 + ,0.13289912045002,0.096557155251503,0.986415028572083,0.132899135351181,0.0965571403503418,0.986414909362793 + ,0.13289912045002,0.156232699751854,0.986414909362793,0.050763163715601,0.156232699751854,0.986414968967438,0.0507631674408913 + ,0.156232714653015,0.986414968967438,0.050763163715601,0.156232684850693,0.986414968967438,-0.0507631413638592 + ,0.156232669949532,0.986414909362793,-0.0507631376385689,0.156232669949532,0.986414968967438,-0.0507631339132786 + + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0,0.100000001490116,0.100000001490116,0.100000001490116,0.200000002980232,0.100000001490116,0.300000011920929 + ,0.100000001490116,0.400000005960464,0.100000001490116,0.5,0.100000001490116,0.600000023841858,0.100000001490116 + ,0.700000047683716,0.100000001490116,0.800000071525574,0.100000001490116,0.900000095367432,0.100000001490116 + ,1.00000011920929,0.100000001490116,0,0.200000002980232,0.100000001490116,0.200000002980232,0.200000002980232 + ,0.200000002980232,0.300000011920929,0.200000002980232,0.400000005960464,0.200000002980232,0.5,0.200000002980232 + ,0.600000023841858,0.200000002980232,0.700000047683716,0.200000002980232,0.800000071525574,0.200000002980232 + ,0.900000095367432,0.200000002980232,1.00000011920929,0.200000002980232,0,0.300000011920929,0.100000001490116 + ,0.300000011920929,0.200000002980232,0.300000011920929,0.300000011920929,0.300000011920929,0.400000005960464 + ,0.300000011920929,0.5,0.300000011920929,0.600000023841858,0.300000011920929,0.700000047683716,0.300000011920929 + ,0.800000071525574,0.300000011920929,0.900000095367432,0.300000011920929,1.00000011920929,0.300000011920929,0 + ,0.400000005960464,0.100000001490116,0.400000005960464,0.200000002980232,0.400000005960464,0.300000011920929 + ,0.400000005960464,0.400000005960464,0.400000005960464,0.5,0.400000005960464,0.600000023841858,0.400000005960464 + ,0.700000047683716,0.400000005960464,0.800000071525574,0.400000005960464,0.900000095367432,0.400000005960464 + ,1.00000011920929,0.400000005960464,0,0.5,0.100000001490116,0.5,0.200000002980232,0.5,0.300000011920929,0.5,0.400000005960464 + ,0.5,0.5,0.5,0.600000023841858,0.5,0.700000047683716,0.5,0.800000071525574,0.5,0.900000095367432,0.5,1.00000011920929 + ,0.5,0,0.600000023841858,0.100000001490116,0.600000023841858,0.200000002980232,0.600000023841858,0.300000011920929 + ,0.600000023841858,0.400000005960464,0.600000023841858,0.5,0.600000023841858,0.600000023841858,0.600000023841858 + ,0.700000047683716,0.600000023841858,0.800000071525574,0.600000023841858,0.900000095367432,0.600000023841858 + ,1.00000011920929,0.600000023841858,0,0.700000047683716,0.100000001490116,0.700000047683716,0.200000002980232 + ,0.700000047683716,0.300000011920929,0.700000047683716,0.400000005960464,0.700000047683716,0.5,0.700000047683716 + ,0.600000023841858,0.700000047683716,0.700000047683716,0.700000047683716,0.800000071525574,0.700000047683716 + ,0.900000095367432,0.700000047683716,1.00000011920929,0.700000047683716,0,0.800000071525574,0.100000001490116 + ,0.800000071525574,0.200000002980232,0.800000071525574,0.300000011920929,0.800000071525574,0.400000005960464 + ,0.800000071525574,0.5,0.800000071525574,0.600000023841858,0.800000071525574,0.700000047683716,0.800000071525574 + ,0.800000071525574,0.800000071525574,0.900000095367432,0.800000071525574,1.00000011920929,0.800000071525574,0 + ,0.900000095367432,0.100000001490116,0.900000095367432,0.200000002980232,0.900000095367432,0.300000011920929 + ,0.900000095367432,0.400000005960464,0.900000095367432,0.5,0.900000095367432,0.600000023841858,0.900000095367432 + ,0.700000047683716,0.900000095367432,0.800000071525574,0.900000095367432,0.900000095367432,0.900000095367432 + ,1.00000011920929,0.900000095367432,0.0500000007450581,0,0.150000005960464,0,0.25,0,0.350000023841858,0,0.450000017881393 + ,0,0.550000011920929,0,0.650000035762787,0,0.75,0,0.850000023841858,0,0.950000047683716,0,0.0500000007450581 + ,1,0.150000005960464,1,0.25,1,0.350000023841858,1,0.450000017881393,1,0.550000011920929,1,0.650000035762787,1 + ,0.75,1,0.850000023841858,1,0.950000047683716,1 + UVIndex: 0,1,12,11,1,2,13,12,2,3,14,13,3,4,15,14,4,5,16,15,5,6,17,16,6,7,18,17,7,8,19,18,8,9,20,19,9,10,21,20,11,12,23 + ,22,12,13,24,23,13,14,25,24,14,15,26,25,15,16,27,26,16,17,28,27,17,18,29,28,18,19,30,29,19,20,31,30,20,21,32 + ,31,22,23,34,33,23,24,35,34,24,25,36,35,25,26,37,36,26,27,38,37,27,28,39,38,28,29,40,39,29,30,41,40,30,31,42 + ,41,31,32,43,42,33,34,45,44,34,35,46,45,35,36,47,46,36,37,48,47,37,38,49,48,38,39,50,49,39,40,51,50,40,41,52 + ,51,41,42,53,52,42,43,54,53,44,45,56,55,45,46,57,56,46,47,58,57,47,48,59,58,48,49,60,59,49,50,61,60,50,51,62 + ,61,51,52,63,62,52,53,64,63,53,54,65,64,55,56,67,66,56,57,68,67,57,58,69,68,58,59,70,69,59,60,71,70,60,61,72 + ,71,61,62,73,72,62,63,74,73,63,64,75,74,64,65,76,75,66,67,78,77,67,68,79,78,68,69,80,79,69,70,81,80,70,71,82 + ,81,71,72,83,82,72,73,84,83,73,74,85,84,74,75,86,85,75,76,87,86,77,78,89,88,78,79,90,89,79,80,91,90,80,81,92 + ,91,81,82,93,92,82,83,94,93,83,84,95,94,84,85,96,95,85,86,97,96,86,87,98,97,1,0,99,2,1,100,3,2,101,4,3,102,5 + ,4,103,6,5,104,7,6,105,8,7,106,9,8,107,10,9,108,88,89,109,89,90,110,90,91,111,91,92,112,92,93,113,93,94,114,94 + ,95,115,95,96,116,96,97,117,97,98,118 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pSphere1_ncl1_2" + } + Model: "Model::LOD_1", "Null" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",100 + Property: "Look", "enum", "N",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Null" + NodeAttributeName: "NodeAttribute::LOD_1_ncl1_1" + } + Model: "Model::pSphere1_ncl1_1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: 0.769420981407166,0.309016972780228,-0.559017181396484,0.293892592191696,0.309016972780228,-0.904508709907532,-0.29389277100563 + ,0.309016972780228,-0.904508590698242,-0.769421100616455,0.309016972780228,-0.55901700258255,-0.951056659221649,0.309016972780228 + ,5.66873872287488e-08,-0.769420981407166,0.309016972780228,0.55901712179184,-0.293892621994019,0.309016972780228,0.904508590698242 + ,0.293892681598663,0.309016972780228,0.904508531093597,0.769420921802521,0.309016972780228,0.55901700258255,0.95105654001236 + ,0.309016972780228,0,0,-1,0,0,1,0 + PolygonVertexIndex: 1,0,-11,2,1,-11,3,2,-11,4,3,-11,5,4,-11,6,5,-11,7,6,-11,8,7,-11,9,8,-11,0,9,-11,0,1,-12,1,2,-12,2,3,-12,3,4,-12,4 + ,5,-12,5,6,-12,6,7,-12,7,8,-12,8,9,-12,9,0,-12 + Edges: 0,3,6,9,12,15,18,21,24,27,1,2,5,8,11,14,17,20,23,26,32,31,34,37,40,43,46,49,52,55 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0.483571887016296,-0.568473160266876,-0.665579855442047,0.483571887016296,-0.568473160266876,-0.665579855442047 + ,0.483571916818619,-0.568473160266876,-0.665579795837402,-1.27464275578859e-07,-0.568473100662231,-0.822701811790466 + ,-1.27464289789714e-07,-0.568473160266876,-0.822701811790466,-1.27464289789714e-07,-0.568473160266876,-0.822701871395111 + ,-0.483572036027908,-0.568473100662231,-0.665579795837402,-0.483572036027908,-0.568473100662231,-0.665579795837402 + ,-0.483572065830231,-0.568473100662231,-0.665579795837402,-0.782435894012451,-0.568473160266876,-0.25422877073288 + ,-0.782435894012451,-0.568473160266876,-0.25422877073288,-0.782436013221741,-0.568473219871521,-0.25422877073288 + ,-0.782435953617096,-0.568473041057587,0.254228860139847,-0.782435953617096,-0.568473100662231,0.254228889942169 + ,-0.782436013221741,-0.568473100662231,0.254228889942169,-0.483571887016296,-0.568473100662231,0.665579915046692 + ,-0.483571887016296,-0.568473100662231,0.665579915046692,-0.483571887016296,-0.568473041057587,0.665579915046692 + ,1.27464304000569e-07,-0.568473041057587,0.822701871395111,1.27464304000569e-07,-0.568473041057587,0.822701930999756 + ,1.27464289789714e-07,-0.568473041057587,0.822701871395111,0.483572036027908,-0.568472981452942,0.665579795837402 + ,0.483572036027908,-0.568473041057587,0.665579795837402,0.483572036027908,-0.568473041057587,0.665579795837402 + ,0.782435894012451,-0.568473041057587,0.254228889942169,0.782435894012451,-0.568473041057587,0.254228889942169 + ,0.782436013221741,-0.568473041057587,0.254228889942169,0.782435953617096,-0.568473160266876,-0.254228711128235 + ,0.782435953617096,-0.568473100662231,-0.254228711128235,0.782435953617096,-0.568473160266876,-0.254228740930557 + ,0.356821984052658,0.794654548168182,-0.49112343788147,0.356821984052658,0.794654548168182,-0.49112343788147 + ,0.356821984052658,0.794654488563538,-0.49112343788147,-8.90895819338766e-08,0.794654548168182,-0.607061922550201 + ,-8.9089589039304e-08,0.794654548168182,-0.607061982154846,-8.90895819338766e-08,0.794654488563538,-0.607061862945557 + ,-0.356822103261948,0.794654548168182,-0.491123348474503,-0.356822103261948,0.794654548168182,-0.491123348474503 + ,-0.356822103261948,0.794654488563538,-0.491123378276825,-0.577350258827209,0.794654488563538,-0.187592431902885 + ,-0.577350318431854,0.794654488563538,-0.187592431902885,-0.577350258827209,0.794654488563538,-0.187592402100563 + ,-0.577350318431854,0.794654428958893,0.187592417001724,-0.577350318431854,0.794654428958893,0.187592417001724 + ,-0.577350258827209,0.794654428958893,0.187592402100563,-0.356822043657303,0.794654428958893,0.491123467683792 + ,-0.356822043657303,0.794654488563538,0.491123467683792,-0.35682201385498,0.794654488563538,0.491123408079147 + ,8.9089610355586e-08,0.794654488563538,0.607061982154846,8.9089610355586e-08,0.794654488563538,0.607061982154846 + ,8.90895961447313e-08,0.794654488563538,0.607061922550201,0.35682213306427,0.794654488563538,0.491123348474503 + ,0.35682213306427,0.794654488563538,0.491123348474503,0.35682213306427,0.794654607772827,0.491123378276825,0.577350258827209 + ,0.794654369354248,0.187592431902885,0.577350258827209,0.794654369354248,0.187592431902885,0.577350318431854 + ,0.794654488563538,0.187592476606369,0.577350258827209,0.794654488563538,-0.187592387199402,0.577350318431854 + ,0.794654488563538,-0.187592387199402,0.57735013961792,0.794654488563538,-0.187592357397079 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0,0.600000023841858,0.100000001490116,0.600000023841858,0.200000002980232,0.600000023841858,0.300000011920929 + ,0.600000023841858,0.400000005960464,0.600000023841858,0.5,0.600000023841858,0.600000023841858,0.600000023841858 + ,0.700000047683716,0.600000023841858,0.800000071525574,0.600000023841858,0.900000095367432,0.600000023841858 + ,1.00000011920929,0.600000023841858,0.0500000007450581,0,0.150000005960464,0,0.25,0,0.350000023841858,0,0.450000017881393 + ,0,0.550000011920929,0,0.650000035762787,0,0.75,0,0.850000023841858,0,0.950000047683716,0,0.0500000007450581 + ,1,0.150000005960464,1,0.25,1,0.350000023841858,1,0.450000017881393,1,0.550000011920929,1,0.650000035762787,1 + ,0.75,1,0.850000023841858,1,0.950000047683716,1 + UVIndex: 1,0,11,2,1,12,3,2,13,4,3,14,5,4,15,6,5,16,7,6,17,8,7,18,9,8,19,10,9,20,0,1,21,1,2,22,2,3,23,3,4,24,4,5,25,5,6 + ,26,6,7,27,7,8,28,8,9,29,9,10,30 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pSphere1_ncl1_3" + } + NodeAttribute: "NodeAttribute::StereoLeftShape", "Camera" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "Position", "Vector", "A",0,0,0 + Property: "UpVector", "Vector", "A",0,1,0 + Property: "InterestPosition", "Vector", "A",0,0,0 + Property: "Roll", "Roll", "A",0 + Property: "OpticalCenterX", "OpticalCenterX", "A",0 + Property: "OpticalCenterY", "OpticalCenterY", "A",0 + Property: "BackgroundColor", "Color", "A",0,0,0 + Property: "TurnTable", "Number", "A",0 + Property: "DisplayTurnTableIcon", "bool", "",0 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "Motion Blur Intensity", "Number", "A",1 + Property: "AspectRatioMode", "enum", "",0 + Property: "AspectWidth", "double", "",960 + Property: "AspectHeight", "double", "",540 + Property: "PixelAspectRatio", "double", "",1 + Property: "FilmOffsetX", "Number", "A+",0.00287447241134942 + Property: "FilmOffsetY", "Number", "A",0 + Property: "FilmWidth", "Number", "A+",1.41732 + Property: "FilmHeight", "Number", "A+",0.94488 + Property: "FilmAspectRatio", "double", "",1.5 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",0 + Property: "PreScale", "Number", "A",1 + Property: "FilmTranslateX", "Number", "A",0 + Property: "FilmTranslateY", "Number", "A",0 + Property: "FilmRollPivotX", "Number", "A",0 + Property: "FilmRollPivotY", "Number", "A",0 + Property: "FilmRollValue", "Number", "A",0 + Property: "FilmRollOrder", "enum", "",0 + Property: "ApertureMode", "enum", "",3 + Property: "GateFit", "enum", "",2 + Property: "FieldOfView", "FieldOfView", "A",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "A",40 + Property: "FieldOfViewY", "FieldOfViewY", "A",40 + Property: "FocalLength", "Number", "A+",35.6990219446043 + Property: "CameraFormat", "enum", "",0 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowInfoOnMoving", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "ShowAudio", "bool", "",0 + Property: "AudioColor", "Vector3D", "",0,1,0 + Property: "NearPlane", "double", "",0.1 + Property: "FarPlane", "double", "",10000 + Property: "AutoComputeClipPanes", "bool", "",1 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "Number", "A",4000 + Property: "BackPlaneDistanceMode", "enum", "",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "",2 + Property: "FrontPlaneDistance", "Number", "A",10 + Property: "FrontPlaneDistanceMode", "enum", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "BackPlateFitImage", "bool", "",0 + Property: "BackPlateCrop", "bool", "",0 + Property: "BackPlateCenter", "bool", "",1 + Property: "BackPlateKeepRatio", "bool", "",1 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ShowBackplate", "bool", "",1 + Property: "BackPlaneOffsetX", "Number", "A",0 + Property: "BackPlaneOffsetY", "Number", "A",0 + Property: "BackPlaneRotation", "Number", "A",0 + Property: "BackPlaneScaleX", "Number", "A",1 + Property: "BackPlaneScaleY", "Number", "A",1 + Property: "Background Texture", "object", "" + Property: "FrontPlateFitImage", "bool", "",1 + Property: "FrontPlateCrop", "bool", "",0 + Property: "FrontPlateCenter", "bool", "",1 + Property: "FrontPlateKeepRatio", "bool", "",1 + Property: "Foreground Opacity", "double", "",1 + Property: "ShowFrontplate", "bool", "",1 + Property: "FrontPlaneOffsetX", "Number", "A",0 + Property: "FrontPlaneOffsetY", "Number", "A",0 + Property: "FrontPlaneRotation", "Number", "A",0 + Property: "FrontPlaneScaleX", "Number", "A",1 + Property: "FrontPlaneScaleY", "Number", "A",1 + Property: "Foreground Texture", "object", "" + Property: "DisplaySafeArea", "bool", "",0 + Property: "DisplaySafeAreaOnRender", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Number", "A",100 + Property: "2D Magnifier X", "Number", "A",50 + Property: "2D Magnifier Y", "Number", "A",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "OrthoZoom", "double", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "Number", "A+",5 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "AntialiasingMethod", "enum", "",0 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + Property: "FrameSamplingType", "enum", "",1 + } + NodeAttributeName: "NodeAttribute::StereoLeftShape" + } + NodeAttribute: "NodeAttribute::StereoRightShape", "Camera" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "Position", "Vector", "A",0,0,0 + Property: "UpVector", "Vector", "A",0,1,0 + Property: "InterestPosition", "Vector", "A",0,0,0 + Property: "Roll", "Roll", "A",0 + Property: "OpticalCenterX", "OpticalCenterX", "A",0 + Property: "OpticalCenterY", "OpticalCenterY", "A",0 + Property: "BackgroundColor", "Color", "A",0,0,0 + Property: "TurnTable", "Number", "A",0 + Property: "DisplayTurnTableIcon", "bool", "",0 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "Motion Blur Intensity", "Number", "A",1 + Property: "AspectRatioMode", "enum", "",0 + Property: "AspectWidth", "double", "",960 + Property: "AspectHeight", "double", "",540 + Property: "PixelAspectRatio", "double", "",1 + Property: "FilmOffsetX", "Number", "A+",-0.00287447241134942 + Property: "FilmOffsetY", "Number", "A",0 + Property: "FilmWidth", "Number", "A+",1.41732 + Property: "FilmHeight", "Number", "A+",0.94488 + Property: "FilmAspectRatio", "double", "",1.5 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",0 + Property: "PreScale", "Number", "A",1 + Property: "FilmTranslateX", "Number", "A",0 + Property: "FilmTranslateY", "Number", "A",0 + Property: "FilmRollPivotX", "Number", "A",0 + Property: "FilmRollPivotY", "Number", "A",0 + Property: "FilmRollValue", "Number", "A",0 + Property: "FilmRollOrder", "enum", "",0 + Property: "ApertureMode", "enum", "",3 + Property: "GateFit", "enum", "",2 + Property: "FieldOfView", "FieldOfView", "A",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "A",40 + Property: "FieldOfViewY", "FieldOfViewY", "A",40 + Property: "FocalLength", "Number", "A+",35.6990219446043 + Property: "CameraFormat", "enum", "",0 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowInfoOnMoving", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "ShowAudio", "bool", "",0 + Property: "AudioColor", "Vector3D", "",0,1,0 + Property: "NearPlane", "double", "",0.1 + Property: "FarPlane", "double", "",10000 + Property: "AutoComputeClipPanes", "bool", "",1 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "Number", "A",4000 + Property: "BackPlaneDistanceMode", "enum", "",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "",2 + Property: "FrontPlaneDistance", "Number", "A",10 + Property: "FrontPlaneDistanceMode", "enum", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "BackPlateFitImage", "bool", "",0 + Property: "BackPlateCrop", "bool", "",0 + Property: "BackPlateCenter", "bool", "",1 + Property: "BackPlateKeepRatio", "bool", "",1 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ShowBackplate", "bool", "",1 + Property: "BackPlaneOffsetX", "Number", "A",0 + Property: "BackPlaneOffsetY", "Number", "A",0 + Property: "BackPlaneRotation", "Number", "A",0 + Property: "BackPlaneScaleX", "Number", "A",1 + Property: "BackPlaneScaleY", "Number", "A",1 + Property: "Background Texture", "object", "" + Property: "FrontPlateFitImage", "bool", "",1 + Property: "FrontPlateCrop", "bool", "",0 + Property: "FrontPlateCenter", "bool", "",1 + Property: "FrontPlateKeepRatio", "bool", "",1 + Property: "Foreground Opacity", "double", "",1 + Property: "ShowFrontplate", "bool", "",1 + Property: "FrontPlaneOffsetX", "Number", "A",0 + Property: "FrontPlaneOffsetY", "Number", "A",0 + Property: "FrontPlaneRotation", "Number", "A",0 + Property: "FrontPlaneScaleX", "Number", "A",1 + Property: "FrontPlaneScaleY", "Number", "A",1 + Property: "Foreground Texture", "object", "" + Property: "DisplaySafeArea", "bool", "",0 + Property: "DisplaySafeAreaOnRender", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Number", "A",100 + Property: "2D Magnifier X", "Number", "A",50 + Property: "2D Magnifier Y", "Number", "A",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "OrthoZoom", "double", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "Number", "A+",5 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "AntialiasingMethod", "enum", "",0 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + Property: "FrameSamplingType", "enum", "",1 + } + NodeAttributeName: "NodeAttribute::StereoRightShape" + } + Geometry: "Geometry::NurbsCurve_ncl1_1", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Periodic" + Rational: 0 + Points: 0.783611624891224,4.79823734098847e-17,-0.783611624891225,1,6.78573232311091e-17,6.78573232311091e-17,-1.10819418755439 + ,1,-0.783611624891224,4.79823734098847e-17,-0.783611624891224,1,-1.10819418755439,3.51773561900603e-33,-5.74489823752483e-17 + ,1,-0.783611624891224,-4.79823734098847e-17,0.783611624891224,1,-1.11008569696032e-16,-6.78573232311092e-17,1.10819418755439 + ,1,0.783611624891224,-4.79823734098847e-17,0.783611624891224,1,1.10819418755439,-9.2536792101101e-33,1.51124050077996e-16 + ,1 + KnotVector: -3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11 + NodeAttributeName: "Geometry::NurbsCurve_ncl1_1" + } + Geometry: "Geometry::NurbsSurface_ncl1_1", "NurbsSurface" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + Type: "NurbsSurface" + NurbsSurfaceVersion: 100 + SurfaceDisplay: 4,4,4 + NurbsSurfaceOrder: 4,4 + Dimensions: 4,4 + Step: 4,4 + Form: "Open", "Open" + Points: -0.5,-3.06161699786838e-17,0.5,1,-0.166666666666667,-3.06161699786838e-17,0.5,1,0.166666666666667,-3.06161699786838e-17 + ,0.5,1,0.5,-3.06161699786838e-17,0.5,1,-0.5,-1.02053899928946e-17,0.166666666666667,1,-0.166666666666667,-1.02053899928946e-17 + ,0.166666666666667,1,0.166666666666667,-1.02053899928946e-17,0.166666666666667,1,0.5,-1.02053899928946e-17,0.166666666666667 + ,1,-0.5,1.02053899928946e-17,-0.166666666666667,1,-0.166666666666667,1.02053899928946e-17,-0.166666666666667,1,0.166666666666667 + ,1.02053899928946e-17,-0.166666666666667,1,0.5,1.02053899928946e-17,-0.166666666666667,1,-0.5,3.06161699786838e-17 + ,-0.5,1,-0.166666666666667,3.06161699786838e-17,-0.5,1,0.166666666666667,3.06161699786838e-17,-0.5,1,0.5,3.06161699786838e-17 + ,-0.5,1 + KnotVectorU: 0,0,0,0,1,1,1,1 + KnotVectorV: 0,0,0,0,1,1,1,1 + GeometryVersion: 124 + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + FlipNormals: 0 + NodeAttributeName: "Geometry::NurbsSurface_ncl1_1" + } + Geometry: "Geometry::NodeAttribute 10", "NurbsSurface" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + Type: "NurbsSurface" + NurbsSurfaceVersion: 100 + SurfaceDisplay: 4,4,4 + NurbsSurfaceOrder: 4,4 + Dimensions: 4,4 + Step: 4,4 + Form: "Open", "Open" + Points: -0.5,-3.06161699786838e-17,0.5,1,-0.166666666666667,-3.06161699786838e-17,0.5,1,0.166666666666667,-3.06161699786838e-17 + ,0.5,1,0.5,-3.06161699786838e-17,0.5,1,-0.5,-1.02053899928946e-17,0.166666666666667,1,-0.166666666666667,-1.02053899928946e-17 + ,0.166666666666667,1,0.166666666666667,-1.02053899928946e-17,0.166666666666667,1,0.5,-1.02053899928946e-17,0.166666666666667 + ,1,-0.5,1.02053899928946e-17,-0.166666666666667,1,-0.166666666666667,1.02053899928946e-17,-0.166666666666667,1,0.166666666666667 + ,1.02053899928946e-17,-0.166666666666667,1,0.5,1.02053899928946e-17,-0.166666666666667,1,-0.5,3.06161699786838e-17 + ,-0.5,1,-0.166666666666667,3.06161699786838e-17,-0.5,1,0.166666666666667,3.06161699786838e-17,-0.5,1,0.5,3.06161699786838e-17 + ,-0.5,1 + KnotVectorU: 0,0,0,0,1,1,1,1 + KnotVectorV: 0,0,0,0,1,1,1,1 + GeometryVersion: 124 + FlipNormals: 0 + NodeAttributeName: "Geometry::NodeAttribute 10" + } + Geometry: "Geometry::curve1_ncl1_1", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Periodic" + Rational: 0 + Points: 0.572822102368679,1.51351024935508,0,1,0.336853361237767,0.83226157012757,0,1,0.100884620106852,0.151012890900053 + ,0,1,0.812992373258305,0.18671292721221,0,1,0.812498379663117,0.706243877157206,0,1,0.608935895200573,0.823462790645452 + ,0,1,0.405373410738021,0.940681704133689,0,1 + KnotVector: -3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 + NodeAttributeName: "Geometry::curve1_ncl1_1" + } + Geometry: "Geometry::NurbsTrim_ncl1_1", "TrimNurbsSurface" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + TrimmedNurbVersion: 100 + Type: "TrimNurbsSurface" + FlipNormals: 0 + GeometryVersion: 124 + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::NurbsTrim_ncl1_1" + } + Geometry: "Geometry::NodeAttribute 13", "Boundary" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + Property: "OuterBoundary", "bool", "",1 + } + GeometryVersion: 124 + Type: "Boundary" + BoundaryVersion: 100 + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + Property: "OuterBoundary", "bool", "",1 + } + NodeAttributeName: "Geometry::NodeAttribute 13" + } + Geometry: "Geometry::NodeAttribute 14", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: 0.336853361237767,0.659865047701988,0,1,0.281358372583763,0.499649387173837,0,1,0.22586338392976,0.339433726645686 + ,0,1,0.22586338392976,0.221184153320755,0,1 + KnotVector: 0,0,0,0,0.705538221563189,0.705538221563189,0.705538221563189,0.705538221563189 + NodeAttributeName: "Geometry::NodeAttribute 14" + } + Geometry: "Geometry::NodeAttribute 15", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: 0.22586338392976,0.221184153320755,0,1,0.22586338392976,0.196507970942211,0,1,0.230696648186611,0.15081058826907,0 + ,1,0.274648102702034,0.0527214360746615,0,1,0.374322370959928,0.0214468379828641,0,1,0.456350425470615,0.0214468379828641 + ,0,1 + KnotVector: 0.705538221563189,0.705538221563189,0.705538221563189,0.705538221563189,0.852769110781594,1,1.48909632838425,1.48909632838425 + ,1.48909632838425,1.48909632838425 + NodeAttributeName: "Geometry::NodeAttribute 15" + } + Geometry: "Geometry::NodeAttribute 16", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: 0.456350425470615,0.0214468379828641,0,1,0.499193145598421,0.0214468379828641,0,1,0.587833467052581,0.034561735064682 + ,0,1,0.760839721881231,0.118124324406168,0,1,0.798284615087308,0.249518376050331,0,1,0.798284615087308,0.337325176505408 + ,0,1 + KnotVector: 1.48909632838425,1.48909632838425,1.48909632838425,1.48909632838425,1.74454816419212,2,2.65066794686776,2.65066794686776 + ,2.65066794686776,2.65066794686776 + NodeAttributeName: "Geometry::NodeAttribute 16" + } + Geometry: "Geometry::NodeAttribute 17", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: 0.798284615087308,0.337325176505408,0,1,0.798284615087308,0.384467086644989,0,1,0.768347851721602,0.559270884656114 + ,0,1,0.64286297594433,0.631529782638496,0,1,0.507154652969297,0.70967572496399,0,1,0.46831844305021,0.790678353163047 + ,0,1,0.46675305299182,0.856250678682611,0,1,0.46675305299182,0.862528471802623,0,1 + KnotVector: 2.65066794686776,2.65066794686776,2.65066794686776,2.65066794686776,3,4,4.5,5,5.05142997237354,5.05142997237354,5.05142997237354 + ,5.05142997237354 + NodeAttributeName: "Geometry::NodeAttribute 17" + } + Geometry: "Geometry::NodeAttribute 18", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: 0.46675305299182,0.862528471802623,0,1,0.46675305299182,0.90493859493181,0,1,0.473416110498746,0.954746081858044,0 + ,1,0.481328869224568,1,0,1 + KnotVector: 5.05142997237354,5.05142997237354,5.05142997237354,5.05142997237354,5.39886917898573,5.39886917898573,5.39886917898573 + ,5.39886917898573 + NodeAttributeName: "Geometry::NodeAttribute 18" + } + Geometry: "Geometry::NodeAttribute 19", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 2 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: 0.481328869224568,1,0,1,0.455529000266434,1,0,1 + KnotVector: 0.518671130775432,0.518671130775432,0.544470999733566,0.544470999733566 + NodeAttributeName: "Geometry::NodeAttribute 19" + } + Geometry: "Geometry::NodeAttribute 20", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: 0.455529000266434,1,0,1,0.423446522732506,0.909862045675962,0,1,0.380149941985136,0.784863546688975,0,1,0.336853361237767 + ,0.659865047701988,0,1 + KnotVector: 6.44954682717891,6.44954682717891,6.44954682717891,6.44954682717891,7,7,7,7 + NodeAttributeName: "Geometry::NodeAttribute 20" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_node_attribute_zoo_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_node_attribute_zoo_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "31/07/2021 20:13:49.138" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_node_attribute_zoo_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "31/07/2021 20:13:49.138" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\attribute_zoo.mb" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Null", "Model::Scene" + Connect: "OO", "Model::Mesh", "Model::Scene" + Connect: "OO", "Model::Bone", "Model::Scene" + Connect: "OO", "Model::Camera", "Model::Scene" + Connect: "OO", "Model::Light", "Model::Scene" + Connect: "OO", "Model::StereoCamera", "Model::Scene" + Connect: "OO", "Model::NurbsCurve", "Model::Scene" + Connect: "OO", "Model::NurbsSurface", "Model::Scene" + Connect: "OO", "Model::NurbsTrim", "Model::Scene" + Connect: "OO", "Model::LodGroup", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::Mesh" + Connect: "OP", "NodeAttribute::StereoRightShape", "NodeAttribute::StereoCamera_ncl1_1", "RightCamera" + Connect: "OP", "NodeAttribute::StereoLeftShape", "NodeAttribute::StereoCamera_ncl1_1", "LeftCamera" + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "FilmWidth", "NodeAttribute::StereoLeftShape", "FilmWidth" + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "FilmHeight", "NodeAttribute::StereoLeftShape", "FilmHeight" + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "FilmSqueezeRatio", "NodeAttribute::StereoLeftShape", "FilmSqueezeRatio" + + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "FocalLength", "NodeAttribute::StereoLeftShape", "FocalLength" + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "NearPlane", "NodeAttribute::StereoLeftShape", "NearPlane" + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "FarPlane", "NodeAttribute::StereoLeftShape", "FarPlane" + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "FilmWidth", "NodeAttribute::StereoRightShape", "FilmWidth" + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "FilmHeight", "NodeAttribute::StereoRightShape", "FilmHeight" + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "FilmSqueezeRatio", "NodeAttribute::StereoRightShape", "FilmSqueezeRatio" + + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "FocalLength", "NodeAttribute::StereoRightShape", "FocalLength" + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "NearPlane", "NodeAttribute::StereoRightShape", "NearPlane" + Connect: "PP", "NodeAttribute::StereoCamera_ncl1_1", "FarPlane", "NodeAttribute::StereoRightShape", "FarPlane" + Connect: "OO", "Geometry::NurbsCurve_ncl1_1", "Model::NurbsCurve" + Connect: "OO", "Geometry::NurbsSurface_ncl1_1", "Model::NurbsSurface" + Connect: "OO", "Material::lambert1", "Model::NurbsSurface" + Connect: "OO", "Model::curve1", "Geometry::NodeAttribute 10" + Connect: "OO", "Geometry::curve1_ncl1_1", "Model::curve1" + Connect: "OO", "Geometry::NodeAttribute 10", "Geometry::NurbsTrim_ncl1_1" + Connect: "OO", "Geometry::NodeAttribute 13", "Geometry::NurbsTrim_ncl1_1" + Connect: "OO", "Geometry::NodeAttribute 14", "Geometry::NodeAttribute 13" + Connect: "OO", "Geometry::NodeAttribute 15", "Geometry::NodeAttribute 13" + Connect: "OO", "Geometry::NodeAttribute 16", "Geometry::NodeAttribute 13" + Connect: "OO", "Geometry::NodeAttribute 17", "Geometry::NodeAttribute 13" + Connect: "OO", "Geometry::NodeAttribute 18", "Geometry::NodeAttribute 13" + Connect: "OO", "Geometry::NodeAttribute 19", "Geometry::NodeAttribute 13" + Connect: "OO", "Geometry::NodeAttribute 20", "Geometry::NodeAttribute 13" + Connect: "OO", "Geometry::NurbsTrim_ncl1_1", "Model::NurbsTrim" + Connect: "OO", "Material::lambert1", "Model::NurbsTrim" + Connect: "OO", "Model::LOD_0", "Model::LodGroup" + Connect: "OO", "Model::LOD_1", "Model::LodGroup" + Connect: "OO", "Model::pSphere1", "Model::LOD_0" + Connect: "OO", "Material::lambert1", "Model::pSphere1" + Connect: "OO", "Model::pSphere1_ncl1_1", "Model::LOD_1" + Connect: "OO", "Material::lambert1", "Model::pSphere1_ncl1_1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::StereoCamera" { + Version: 1.1 + Channel: "FocalLength" { + Default: 35.6990203857422 + KeyVer: 4005 + KeyCount: 2 + Key: 1924423250,35,U,s,0,0,n,46186158000,50,U,s,0,0,n + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_node_attribute_zoo_6100_binary.fbx b/modules/ufbx/data/maya_node_attribute_zoo_6100_binary.fbx new file mode 100644 index 0000000..968641b Binary files /dev/null and b/modules/ufbx/data/maya_node_attribute_zoo_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_node_attribute_zoo_7500_ascii.fbx b/modules/ufbx/data/maya_node_attribute_zoo_7500_ascii.fbx new file mode 100644 index 0000000..441061b --- /dev/null +++ b/modules/ufbx/data/maya_node_attribute_zoo_7500_ascii.fbx @@ -0,0 +1,1361 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 7 + Day: 31 + Hour: 23 + Minute: 14 + Second: 34 + Millisecond: 979 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_node_attribute_zoo_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_node_attribute_zoo_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/07/2021 20:14:34.978" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_node_attribute_zoo_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/07/2021 20:14:34.978" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\attribute_zoo.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2830736668000, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 57 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 10 + PropertyTemplate: "FbxNull" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "Look", "enum", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 15 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Geometry" { + Count: 16 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 11 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 2828958385040, "NodeAttribute::", "Null" { + TypeFlags: "Null" + } + Geometry: 2830728277856, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2828955901024, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",16.6666666666667 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2828957659072, "NodeAttribute::Camera", "Camera" { + Properties70: { + P: "Position", "Vector", "", "A",6,0,0 + P: "InterestPosition", "Vector", "", "A",6,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",960 + P: "AspectHeight", "double", "Number", "",540 + P: "FilmWidth", "Number", "", "A",1.41732 + P: "FilmHeight", "Number", "", "A",0.94488 + P: "FilmAspectRatio", "double", "Number", "",1.5 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",3 + P: "FocalLength", "Number", "", "A",35 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 6,0,0 + Up: 0,1,0 + LookAt: 6,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + NodeAttribute: 2830726796704, "NodeAttribute::", "Light" { + Properties70: { + P: "CastShadows", "bool", "", "",1 + } + TypeFlags: "Light" + GeometryVersion: 124 + } + NodeAttribute: 2830686558720, "NodeAttribute::StereoCamera", "CameraStereo" { + Properties70: { + P: "Position", "Vector", "", "A",2,0,2 + P: "InterestPosition", "Vector", "", "A",2,0,-3 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",960 + P: "AspectHeight", "double", "Number", "",540 + P: "FilmWidth", "Number", "", "A",1.41732 + P: "FilmHeight", "Number", "", "A",0.94488 + P: "FilmAspectRatio", "double", "Number", "",1.5 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",2 + P: "FocalLength", "Number", "", "A+",35.6990219446043 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + P: "Stereo", "enum", "", "",2 + P: "InteraxialSeparation", "Number", "", "A",1.03896103992865 + P: "ZeroParallax", "Number", "", "A",254 + P: "RightCamera", "object", "", "" + P: "LeftCamera", "object", "", "" + } + TypeFlags: "CameraStereo" + Version: 100 + } + NodeAttribute: 2828957674560, "NodeAttribute::StereoLeftShape", "Camera" { + Properties70: { + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",960 + P: "AspectHeight", "double", "Number", "",540 + P: "FilmOffsetX", "Number", "", "A+",0.00287447241134942 + P: "FilmWidth", "Number", "", "A+",1.41732 + P: "FilmHeight", "Number", "", "A+",0.94488 + P: "FilmAspectRatio", "double", "Number", "",1.5 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",2 + P: "FocalLength", "Number", "", "A+",35.6990219446043 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "FocusDistance", "Number", "", "A+",5 + } + } + NodeAttribute: 2828957661008, "NodeAttribute::StereoRightShape", "Camera" { + Properties70: { + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",960 + P: "AspectHeight", "double", "Number", "",540 + P: "FilmOffsetX", "Number", "", "A+",-0.00287447241134942 + P: "FilmWidth", "Number", "", "A+",1.41732 + P: "FilmHeight", "Number", "", "A+",0.94488 + P: "FilmAspectRatio", "double", "Number", "",1.5 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",2 + P: "FocalLength", "Number", "", "A+",35.6990219446043 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "FocusDistance", "Number", "", "A+",5 + } + } + Geometry: 2829630967760, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Periodic" + Rational: 0 + Points: *32 { + a: 0.783611624891224,4.79823734098847e-17,-0.783611624891225,1,6.78573232311091e-17,6.78573232311091e-17,-1.10819418755439,1,-0.783611624891224,4.79823734098847e-17,-0.783611624891224,1,-1.10819418755439,3.51773561900603e-33,-5.74489823752483e-17,1,-0.783611624891224,-4.79823734098847e-17,0.783611624891224,1,-1.11008569696032e-16,-6.78573232311092e-17,1.10819418755439,1,0.783611624891224,-4.79823734098847e-17,0.783611624891224,1,1.10819418755439,-9.2536792101101e-33,1.51124050077996e-16,1 + } + KnotVector: *15 { + a: -3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11 + } + } + Geometry: 2828972827328, "Geometry::", "NurbsSurface" { + Type: "NurbsSurface" + NurbsSurfaceVersion: 100 + SurfaceDisplay: 4,4,4 + NurbsSurfaceOrder: 4,4 + Dimensions: 4,4 + Step: 4,4 + Form: "Open", "Open" + Points: *64 { + a: -0.5,-3.06161699786838e-17,0.5,1,-0.166666666666667,-3.06161699786838e-17,0.5,1,0.166666666666667,-3.06161699786838e-17,0.5,1,0.5,-3.06161699786838e-17,0.5,1,-0.5,-1.02053899928946e-17,0.166666666666667,1,-0.166666666666667,-1.02053899928946e-17,0.166666666666667,1,0.166666666666667,-1.02053899928946e-17,0.166666666666667,1,0.5,-1.02053899928946e-17,0.166666666666667,1,-0.5,1.02053899928946e-17,-0.166666666666667,1,-0.166666666666667,1.02053899928946e-17,-0.166666666666667,1,0.166666666666667,1.02053899928946e-17,-0.166666666666667,1,0.5,1.02053899928946e-17,-0.166666666666667,1,-0.5,3.06161699786838e-17,-0.5,1,-0.166666666666667,3.06161699786838e-17,-0.5,1,0.166666666666667,3.06161699786838e-17,-0.5,1,0.5,3.06161699786838e-17,-0.5,1 + } + KnotVectorU: *8 { + a: 0,0,0,0,1,1,1,1 + } + KnotVectorV: *8 { + a: 0,0,0,0,1,1,1,1 + } + GeometryVersion: 124 + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + FlipNormals: 0 + } + Geometry: 2828972829008, "Geometry::", "NurbsSurface" { + Type: "NurbsSurface" + NurbsSurfaceVersion: 100 + SurfaceDisplay: 4,4,4 + NurbsSurfaceOrder: 4,4 + Dimensions: 4,4 + Step: 4,4 + Form: "Open", "Open" + Points: *64 { + a: -0.5,-3.06161699786838e-17,0.5,1,-0.166666666666667,-3.06161699786838e-17,0.5,1,0.166666666666667,-3.06161699786838e-17,0.5,1,0.5,-3.06161699786838e-17,0.5,1,-0.5,-1.02053899928946e-17,0.166666666666667,1,-0.166666666666667,-1.02053899928946e-17,0.166666666666667,1,0.166666666666667,-1.02053899928946e-17,0.166666666666667,1,0.5,-1.02053899928946e-17,0.166666666666667,1,-0.5,1.02053899928946e-17,-0.166666666666667,1,-0.166666666666667,1.02053899928946e-17,-0.166666666666667,1,0.166666666666667,1.02053899928946e-17,-0.166666666666667,1,0.5,1.02053899928946e-17,-0.166666666666667,1,-0.5,3.06161699786838e-17,-0.5,1,-0.166666666666667,3.06161699786838e-17,-0.5,1,0.166666666666667,3.06161699786838e-17,-0.5,1,0.5,3.06161699786838e-17,-0.5,1 + } + KnotVectorU: *8 { + a: 0,0,0,0,1,1,1,1 + } + KnotVectorV: *8 { + a: 0,0,0,0,1,1,1,1 + } + GeometryVersion: 124 + FlipNormals: 0 + } + Geometry: 2829630967440, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Periodic" + Rational: 0 + Points: *28 { + a: 0.572822102368679,1.51351024935508,0,1,0.336853361237767,0.83226157012757,0,1,0.100884620106852,0.151012890900053,0,1,0.812992373258305,0.18671292721221,0,1,0.812498379663117,0.706243877157206,0,1,0.608935895200573,0.823462790645452,0,1,0.405373410738021,0.940681704133689,0,1 + } + KnotVector: *14 { + a: -3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 + } + } + Geometry: 2828981358768, "Geometry::", "TrimNurbsSurface" { + TrimmedNurbVersion: 100 + Type: "TrimNurbsSurface" + FlipNormals: 0 + GeometryVersion: 124 + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + } + Geometry: 2828981363632, "Geometry::", "Boundary" { + Properties70: { + P: "OuterBoundary", "bool", "", "",1 + } + GeometryVersion: 124 + Type: "Boundary" + BoundaryVersion: 100 + Properties70: { + P: "OuterBoundary", "bool", "", "",1 + } + } + Geometry: 2829630956880, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: *16 { + a: 0.336853361237767,0.659865047701988,0,1,0.281358372583763,0.499649387173837,0,1,0.22586338392976,0.339433726645686,0,1,0.22586338392976,0.221184153320755,0,1 + } + KnotVector: *8 { + a: 0,0,0,0,0.705538221563189,0.705538221563189,0.705538221563189,0.705538221563189 + } + } + Geometry: 2829630970320, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: *24 { + a: 0.22586338392976,0.221184153320755,0,1,0.22586338392976,0.196507970942211,0,1,0.230696648186611,0.15081058826907,0,1,0.274648102702034,0.0527214360746615,0,1,0.374322370959928,0.0214468379828641,0,1,0.456350425470615,0.0214468379828641,0,1 + } + KnotVector: *10 { + a: 0.705538221563189,0.705538221563189,0.705538221563189,0.705538221563189,0.852769110781594,1,1.48909632838425,1.48909632838425,1.48909632838425,1.48909632838425 + } + } + Geometry: 2829630958160, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: *24 { + a: 0.456350425470615,0.0214468379828641,0,1,0.499193145598421,0.0214468379828641,0,1,0.587833467052581,0.034561735064682,0,1,0.760839721881231,0.118124324406168,0,1,0.798284615087308,0.249518376050331,0,1,0.798284615087308,0.337325176505408,0,1 + } + KnotVector: *10 { + a: 1.48909632838425,1.48909632838425,1.48909632838425,1.48909632838425,1.74454816419212,2,2.65066794686776,2.65066794686776,2.65066794686776,2.65066794686776 + } + } + Geometry: 2829630964880, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: *32 { + a: 0.798284615087308,0.337325176505408,0,1,0.798284615087308,0.384467086644989,0,1,0.768347851721602,0.559270884656114,0,1,0.64286297594433,0.631529782638496,0,1,0.507154652969297,0.70967572496399,0,1,0.46831844305021,0.790678353163047,0,1,0.46675305299182,0.856250678682611,0,1,0.46675305299182,0.862528471802623,0,1 + } + KnotVector: *12 { + a: 2.65066794686776,2.65066794686776,2.65066794686776,2.65066794686776,3,4,4.5,5,5.05142997237354,5.05142997237354,5.05142997237354,5.05142997237354 + } + } + Geometry: 2829630957200, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: *16 { + a: 0.46675305299182,0.862528471802623,0,1,0.46675305299182,0.90493859493181,0,1,0.473416110498746,0.954746081858044,0,1,0.481328869224568,1,0,1 + } + KnotVector: *8 { + a: 5.05142997237354,5.05142997237354,5.05142997237354,5.05142997237354,5.39886917898573,5.39886917898573,5.39886917898573,5.39886917898573 + } + } + Geometry: 2829630965200, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 2 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: *8 { + a: 0.481328869224568,1,0,1,0.455529000266434,1,0,1 + } + KnotVector: *4 { + a: 0.518671130775432,0.518671130775432,0.544470999733566,0.544470999733566 + } + } + Geometry: 2829630971280, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 2 + Form: "Open" + Rational: 0 + Points: *16 { + a: 0.455529000266434,1,0,1,0.423446522732506,0.909862045675962,0,1,0.380149941985136,0.784863546688975,0,1,0.336853361237767,0.659865047701988,0,1 + } + KnotVector: *8 { + a: 6.44954682717891,6.44954682717891,6.44954682717891,6.44954682717891,7,7,7,7 + } + } + NodeAttribute: 2830731250192, "NodeAttribute::", "LodGroup" { + Properties70: { + P: "ThresholdsUsedAsPercentage", "bool", "", "",1 + P: "WorldSpace", "bool", "", "",1 + P: "Thresholds|Level0", "Distance", "", "",64, "cm" + P: "DisplayLevels|Level0", "enum", "", "",0 + P: "DisplayLevels|Level1", "enum", "", "",0 + } + } + NodeAttribute: 2828958383104, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 2830728272864, "Geometry::", "Mesh" { + Vertices: *276 { + a: 0.250000029802322,-0.95105654001236,-0.181635692715645,0.0954914912581444,-0.95105654001236,-0.293892711400986,-0.0954915508627892,-0.95105654001236,-0.293892651796341,-0.250000059604645,-0.95105654001236,-0.181635633111,-0.309017032384872,-0.95105654001236,1.84188486684889e-08,-0.250000029802322,-0.95105654001236,0.181635677814484,-0.095491498708725,-0.95105654001236,0.293892651796341,0.0954915136098862,-0.95105654001236,0.293892651796341,0.25,-0.95105654001236,0.181635633111,0.30901700258255,-0.95105654001236,0,0.475528299808502,-0.80901700258255,-0.345491588115692,0.181635603308678,-0.80901700258255,-0.55901712179184,-0.181635722517967,-0.80901700258255,-0.559017062187195,-0.475528359413147,-0.80901700258255,-0.345491498708725,-0.587785303592682,-0.80901700258255,3.50347306721233e-08,-0.475528299808502,-0.80901700258255,0.34549155831337,-0.181635618209839,-0.80901700258255,0.559017062187195,0.181635648012161,-0.80901700258255,0.55901700258255,0.47552827000618,-0.80901700258255,0.345491498708725,0.587785243988037,-0.80901700258255,0,0.654508531093597,-0.587785243988037,-0.475528389215469,0.249999955296516,-0.587785243988037,-0.76942104101181,-0.25000011920929,-0.587785243988037,-0.769420981407166,-0.654508650302887,-0.587785243988037,-0.47552827000618,-0.80901712179184,-0.587785243988037,4.82211710561842e-08,-0.654508531093597,-0.587785243988037,0.475528359413147,-0.249999985098839,-0.587785243988037,0.769420981407166,0.250000029802322,-0.587785243988037,0.769420921802521,0.654508531093597,-0.587785243988037,0.47552827000618,0.80901700258255,-0.587785243988037,0,0.769420981407166,-0.309016972780228,-0.559017181396484,0.293892592191696,-0.309016972780228,-0.904508709907532,-0.29389277100563,-0.309016972780228,-0.904508590698242,-0.769421100616455,-0.309016972780228,-0.55901700258255,-0.951056659221649,-0.309016972780228,5.66873872287488e-08,-0.769420981407166,-0.309016972780228,0.55901712179184,-0.293892621994019,-0.309016972780228,0.904508590698242,0.293892681598663,-0.309016972780228,0.904508531093597, +0.769420921802521,-0.309016972780228,0.55901700258255,0.95105654001236,-0.309016972780228,0,0.809017062187195,0,-0.587785422801971,0.309016942977905,0,-0.951056718826294,-0.309017151594162,0,-0.951056599617004,-0.809017181396484,0,-0.587785243988037,-1.00000011920929,0,5.96046447753906e-08,-0.809017062187195,0,0.587785363197327,-0.309016972780228,0,0.951056599617004,0.309017032384872,0,0.95105654001236,0.80901700258255,0,0.587785243988037,1,0,0,0.769420981407166,0.309016972780228,-0.559017181396484,0.293892592191696,0.309016972780228,-0.904508709907532,-0.29389277100563,0.309016972780228,-0.904508590698242,-0.769421100616455,0.309016972780228,-0.55901700258255,-0.951056659221649,0.309016972780228,5.66873872287488e-08,-0.769420981407166,0.309016972780228,0.55901712179184,-0.293892621994019,0.309016972780228,0.904508590698242,0.293892681598663,0.309016972780228,0.904508531093597,0.769420921802521,0.309016972780228,0.55901700258255,0.95105654001236,0.309016972780228,0,0.654508531093597,0.587785243988037,-0.475528389215469,0.249999955296516,0.587785243988037,-0.76942104101181,-0.25000011920929,0.587785243988037,-0.769420981407166,-0.654508650302887,0.587785243988037,-0.47552827000618,-0.80901712179184,0.587785243988037,4.82211710561842e-08,-0.654508531093597,0.587785243988037,0.475528359413147,-0.249999985098839,0.587785243988037,0.769420981407166,0.250000029802322,0.587785243988037,0.769420921802521,0.654508531093597,0.587785243988037,0.47552827000618,0.80901700258255,0.587785243988037,0,0.475528299808502,0.80901700258255,-0.345491588115692,0.181635603308678,0.80901700258255,-0.55901712179184,-0.181635722517967,0.80901700258255,-0.559017062187195,-0.475528359413147,0.80901700258255,-0.345491498708725,-0.587785303592682,0.80901700258255,3.50347306721233e-08,-0.475528299808502,0.80901700258255,0.34549155831337,-0.181635618209839,0.80901700258255,0.559017062187195,0.181635648012161,0.80901700258255,0.55901700258255,0.47552827000618,0.80901700258255,0.345491498708725,0.587785243988037,0.80901700258255,0,0.250000029802322,0.95105654001236,-0.181635692715645, +0.0954914912581444,0.95105654001236,-0.293892711400986,-0.0954915508627892,0.95105654001236,-0.293892651796341,-0.250000059604645,0.95105654001236,-0.181635633111,-0.309017032384872,0.95105654001236,1.84188486684889e-08,-0.250000029802322,0.95105654001236,0.181635677814484,-0.095491498708725,0.95105654001236,0.293892651796341,0.0954915136098862,0.95105654001236,0.293892651796341,0.25,0.95105654001236,0.181635633111,0.30901700258255,0.95105654001236,0,0,-1,0,0,1,0 + } + PolygonVertexIndex: *380 { + a: 0,1,11,-11,1,2,12,-12,2,3,13,-13,3,4,14,-14,4,5,15,-15,5,6,16,-16,6,7,17,-17,7,8,18,-18,8,9,19,-19,9,0,10,-20,10,11,21,-21,11,12,22,-22,12,13,23,-23,13,14,24,-24,14,15,25,-25,15,16,26,-26,16,17,27,-27,17,18,28,-28,18,19,29,-29,19,10,20,-30,20,21,31,-31,21,22,32,-32,22,23,33,-33,23,24,34,-34,24,25,35,-35,25,26,36,-36,26,27,37,-37,27,28,38,-38,28,29,39,-39,29,20,30,-40,30,31,41,-41,31,32,42,-42,32,33,43,-43,33,34,44,-44,34,35,45,-45,35,36,46,-46,36,37,47,-47,37,38,48,-48,38,39,49,-49,39,30,40,-50,40,41,51,-51,41,42,52,-52,42,43,53,-53,43,44,54,-54,44,45,55,-55,45,46,56,-56,46,47,57,-57,47,48,58,-58,48,49,59,-59,49,40,50,-60,50,51,61,-61,51,52,62,-62,52,53,63,-63,53,54,64,-64,54,55,65,-65,55,56,66,-66,56,57,67,-67,57,58,68,-68,58,59,69,-69,59,50,60,-70,60,61,71,-71,61,62,72,-72,62,63,73,-73,63,64,74,-74,64,65,75,-75,65,66,76,-76,66,67,77,-77,67,68,78,-78,68,69,79,-79,69,60,70,-80,70,71,81,-81,71,72,82,-82,72,73,83,-83,73,74,84,-84,74,75,85,-85,75,76,86,-86,76,77,87,-87,77,78,88,-88,78,79,89,-89,79,70,80,-90,1,0,-91,2,1,-91,3,2,-91,4,3,-91,5,4,-91,6,5,-91,7,6,-91,8,7,-91,9,8,-91,0,9,-91,80,81,-92,81,82,-92,82,83,-92,83,84,-92,84,85,-92,85,86,-92,86,87,-92,87,88,-92,88,89,-92,89,80,-92 + } + Edges: *190 { + a: 0,4,8,12,16,20,24,28,32,36,2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294,298,302,306,310,314,318,3,1,5,9,13,17,21,25,29,33,43,41,45,49,53,57,61,65,69,73,83,81,85,89,93,97,101,105,109,113,123,121,125,129,133,137,141,145,149,153,163,161,165,169,173,177,181,185,189,193,203,201,205,209,213,217,221,225,229,233,243,241,245,249,253,257,261,265,269,273,283,281,285,289,293,297,301,305,309,313,321,322,325,328,331,334,337,340,343,346,352,351,354,357,360,363,366,369,372,375 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *1140 { + a: 0.277577847242355,-0.881467998027802,-0.382053256034851,0.277577847242355,-0.881468057632446,-0.382053256034851,0.277577847242355,-0.881468057632446,-0.382053226232529,0.277577847242355,-0.881468057632446,-0.382053256034851,-1.34078504743229e-07,-0.881467998027802,-0.472243756055832,-1.34078490532374e-07,-0.881467998027802,-0.472243696451187,-1.3407847632152e-07,-0.881467998027802,-0.472243696451187,-1.34078490532374e-07,-0.881467998027802,-0.472243696451187,-0.277577847242355,-0.881467998027802,-0.382053196430206,-0.277577847242355,-0.881467998027802,-0.382053196430206,-0.277577877044678,-0.881468117237091,-0.382053226232529,-0.277577847242355,-0.881468057632446,-0.382053226232529,-0.449130415916443,-0.881468117237091,-0.145931214094162,-0.449130356311798,-0.881468117237091,-0.145931214094162,-0.44913038611412,-0.881468117237091,-0.145931199193001,-0.449130415916443,-0.881468117237091,-0.145931214094162,-0.449130445718765,-0.881468117237091,0.145931243896484,-0.449130445718765,-0.881468117237091,0.145931243896484,-0.449130415916443,-0.881467998027802,0.145931243896484,-0.449130415916443,-0.881467998027802,0.145931243896484,-0.277577817440033,-0.881468117237091,0.382053166627884,-0.277577787637711,-0.881468117237091,0.382053166627884,-0.277577787637711,-0.881468117237091,0.382053166627884,-0.277577817440033,-0.881468057632446,0.382053166627884,0,-0.881467878818512,0.472243905067444,0,-0.881467878818512,0.472243905067444,0,-0.881467878818512,0.472243964672089,0,-0.881467938423157,0.472243905067444,0.277577936649323,-0.881468117237091,0.382052958011627,0.277577936649323,-0.881468057632446,0.382052958011627,0.277577966451645,-0.881468057632446,0.38205298781395,0.277577966451645,-0.881468057632446,0.38205298781395,0.449130445718765,-0.881468117237091,0.145931243896484,0.44913050532341,-0.881468117237091,0.145931258797646,0.44913050532341,-0.881468057632446,0.145931273698807,0.44913050532341,-0.881468057632446,0.145931273698807,0.449130475521088,-0.881467938423157,-0.145931407809258,0.44913050532341,-0.881467878818512,-0.145931407809258, +0.449130564928055,-0.881467998027802,-0.14593143761158,0.449130535125732,-0.881467998027802,-0.145931422710419,0.425919204950333,-0.68915182352066,-0.586227416992188,0.425919234752655,-0.68915182352066,-0.586227476596832,0.425919234752655,-0.68915182352066,-0.586227476596832,0.425919204950333,-0.689151763916016,-0.586227416992188,-1.13074278829117e-07,-0.689151763916016,-0.724617063999176,-1.13074264618263e-07,-0.689151704311371,-0.724617004394531,-1.1307427172369e-07,-0.689151763916016,-0.724617004394531,-1.1307427172369e-07,-0.689151763916016,-0.724617004394531,-0.425919234752655,-0.689151704311371,-0.586227476596832,-0.425919204950333,-0.689151704311371,-0.586227476596832,-0.425919234752655,-0.689151704311371,-0.586227476596832,-0.425919234752655,-0.689151704311371,-0.586227476596832,-0.689151763916016,-0.689151704311371,-0.223918959498405,-0.689151704311371,-0.689151644706726,-0.223918959498405,-0.689151763916016,-0.689151704311371,-0.223918989300728,-0.689151763916016,-0.689151704311371,-0.223918989300728,-0.689151644706726,-0.689151763916016,0.223919078707695,-0.689151644706726,-0.689151763916016,0.223919063806534,-0.689151644706726,-0.689151763916016,0.223919063806534,-0.689151644706726,-0.689151763916016,0.223919063806534,-0.425919145345688,-0.689151763916016,0.586227536201477,-0.425919145345688,-0.689151763916016,0.586227536201477,-0.425919145345688,-0.689151763916016,0.586227595806122,-0.425919115543365,-0.689151704311371,0.586227536201477,1.13074285934545e-07,-0.689151763916016,0.724617063999176,1.13074293039972e-07,-0.68915182352066,0.724617004394531,1.13074285934545e-07,-0.689151763916016,0.724617004394531,1.13074278829117e-07,-0.689151763916016,0.724617004394531,0.42591917514801,-0.689151883125305,0.586227416992188,0.42591917514801,-0.689151883125305,0.586227416992188,0.425919145345688,-0.68915182352066,0.586227416992188,0.425919145345688,-0.68915182352066,0.586227416992188,0.689151763916016,-0.689151763916016,0.223918870091438,0.689151763916016,-0.689151763916016,0.223918884992599,0.689151763916016,-0.689151763916016,0.223918855190277, +0.68915182352066,-0.68915182352066,0.223918870091438,0.68915182352066,-0.689151763916016,-0.223918825387955,0.689151763916016,-0.689151704311371,-0.223918825387955,0.68915182352066,-0.689151763916016,-0.223918840289116,0.68915182352066,-0.689151704311371,-0.223918825387955,0.528951525688171,-0.436083436012268,-0.728039503097534,0.528951525688171,-0.436083436012268,-0.728039503097534,0.528951525688171,-0.436083436012268,-0.728039443492889,0.528951525688171,-0.436083436012268,-0.728039443492889,-8.84424622427105e-08,-0.436083436012268,-0.89990621805191,-8.84424622427105e-08,-0.436083406209946,-0.899906277656555,-8.84424622427105e-08,-0.436083406209946,-0.899906277656555,-8.84424480318557e-08,-0.436083376407623,-0.899906277656555,-0.528951585292816,-0.436083406209946,-0.728039503097534,-0.528951644897461,-0.436083436012268,-0.728039503097534,-0.528951644897461,-0.436083406209946,-0.728039503097534,-0.528951644897461,-0.436083376407623,-0.728039443492889,-0.855861723423004,-0.436083436012268,-0.278086215257645,-0.855861723423004,-0.436083436012268,-0.278086215257645,-0.855861663818359,-0.436083436012268,-0.278086185455322,-0.855861663818359,-0.436083436012268,-0.278086185455322,-0.855861783027649,-0.436083316802979,0.278086453676224,-0.855861723423004,-0.436083287000656,0.278086453676224,-0.855861663818359,-0.436083287000656,0.278086423873901,-0.855861663818359,-0.436083287000656,0.278086423873901,-0.528951644897461,-0.43608346581459,0.728039503097534,-0.528951585292816,-0.436083406209946,0.728039443492889,-0.528951585292816,-0.436083406209946,0.728039443492889,-0.528951644897461,-0.436083436012268,0.728039443492889,8.84424693481378e-08,-0.436083346605301,0.899906277656555,8.84424835589925e-08,-0.436083376407623,0.899906277656555,8.84424764535652e-08,-0.436083376407623,0.899906277656555,8.84424764535652e-08,-0.436083376407623,0.899906277656555,0.528951704502106,-0.436083287000656,0.728039443492889,0.528951585292816,-0.436083287000656,0.728039443492889,0.528951704502106,-0.436083376407623,0.728039562702179,0.528951644897461,-0.436083287000656,0.728039443492889, +0.855861842632294,-0.436083257198334,0.278086304664612,0.855861842632294,-0.436083257198334,0.278086304664612,0.855861783027649,-0.436083287000656,0.278086304664612,0.855861783027649,-0.436083287000656,0.278086304664612,0.855861604213715,-0.436083614826202,-0.278086155653,0.855861663818359,-0.436083644628525,-0.278086155653,0.855861604213715,-0.436083674430847,-0.278086125850677,0.855861663818359,-0.436083644628525,-0.278086125850677,0.581228017807007,-0.148952037096024,-0.799992024898529,0.581228077411652,-0.148952051997185,-0.799992024898529,0.581228017807007,-0.148952022194862,-0.799992024898529,0.581228077411652,-0.148952022194862,-0.799992024898529,-1.58177030584739e-07,-0.148952126502991,-0.988844394683838,-1.58177044795593e-07,-0.148952141404152,-0.988844394683838,-1.58177044795593e-07,-0.148952141404152,-0.988844394683838,-1.58177044795593e-07,-0.148952141404152,-0.988844454288483,-0.581228256225586,-0.148952201008797,-0.79999178647995,-0.581228256225586,-0.148952201008797,-0.79999178647995,-0.581228256225586,-0.148952230811119,-0.799991846084595,-0.581228256225586,-0.148952230811119,-0.799991846084595,-0.940446972846985,-0.148952201008797,-0.305569589138031,-0.94044691324234,-0.148952201008797,-0.305569589138031,-0.94044691324234,-0.148952201008797,-0.305569559335709,-0.94044691324234,-0.148952201008797,-0.305569559335709,-0.940446853637695,-0.148952186107635,0.305569797754288,-0.940446853637695,-0.148952186107635,0.305569797754288,-0.940446853637695,-0.148952201008797,0.305569797754288,-0.940446853637695,-0.148952201008797,0.305569797754288,-0.581228137016296,-0.148952037096024,0.799991965293884,-0.581228137016296,-0.148952037096024,0.799991965293884,-0.581228137016296,-0.148952022194862,0.799991965293884,-0.581228137016296,-0.148952022194862,0.799991965293884,1.58177044795593e-07,-0.14895211160183,0.988844394683838,1.58177044795593e-07,-0.14895211160183,0.988844394683838,1.58177059006448e-07,-0.148952126502991,0.988844394683838,1.58177059006448e-07,-0.148952126502991,0.988844394683838,0.581228196620941,-0.148952051997185,0.79999190568924, +0.581228256225586,-0.148952066898346,0.79999190568924,0.581228196620941,-0.148952051997185,0.799991846084595,0.581228196620941,-0.148952037096024,0.79999178647995,0.940446972846985,-0.148952096700668,0.305569738149643,0.94044691324234,-0.148952096700668,0.305569708347321,0.94044691324234,-0.148952066898346,0.305569708347321,0.94044691324234,-0.148952066898346,0.305569708347321,0.940447092056274,-0.148951828479767,-0.305569529533386,0.94044703245163,-0.148951813578606,-0.305569499731064,0.94044703245163,-0.148951828479767,-0.305569529533386,0.940446972846985,-0.148951813578606,-0.305569499731064,0.581228077411652,0.148952022194862,-0.799992024898529,0.581228017807007,0.148952022194862,-0.799992024898529,0.581228077411652,0.148952051997185,-0.799992024898529,0.581228017807007,0.148952037096024,-0.799992024898529,-1.58177044795593e-07,0.148952141404152,-0.988844454288483,-1.58177044795593e-07,0.148952141404152,-0.988844394683838,-1.58177044795593e-07,0.148952141404152,-0.988844394683838,-1.58177030584739e-07,0.148952126502991,-0.988844394683838,-0.581228256225586,0.148952230811119,-0.799991846084595,-0.581228256225586,0.148952230811119,-0.799991846084595,-0.581228256225586,0.148952201008797,-0.79999178647995,-0.581228256225586,0.148952201008797,-0.79999178647995,-0.94044691324234,0.148952186107635,-0.305569559335709,-0.94044691324234,0.148952186107635,-0.305569559335709,-0.940446972846985,0.148952201008797,-0.305569589138031,-0.940446972846985,0.148952201008797,-0.305569589138031,-0.940446853637695,0.148952350020409,0.305569797754288,-0.940446853637695,0.148952350020409,0.305569797754288,-0.940446853637695,0.148952350020409,0.305569797754288,-0.940446853637695,0.148952350020409,0.305569797754288,-0.581228137016296,0.148952007293701,0.79999190568924,-0.581228137016296,0.148952007293701,0.79999190568924,-0.581228137016296,0.148952037096024,0.799991965293884,-0.581228137016296,0.148952037096024,0.799991965293884,1.58177073217303e-07,0.148952141404152,0.988844454288483,1.58177073217303e-07,0.148952141404152,0.988844454288483, +1.58177044795593e-07,0.14895211160183,0.988844335079193,1.58177044795593e-07,0.14895211160183,0.988844335079193,0.581228256225586,0.148952051997185,0.799991846084595,0.581228196620941,0.148952051997185,0.799991846084595,0.581228196620941,0.148952051997185,0.79999190568924,0.581228196620941,0.148952066898346,0.79999190568924,0.94044691324234,0.148952066898346,0.305569708347321,0.94044691324234,0.148952066898346,0.305569708347321,0.94044691324234,0.148952096700668,0.305569708347321,0.940446972846985,0.148952096700668,0.305569738149643,0.940446972846985,0.148951977491379,-0.305569499731064,0.94044703245163,0.148952007293701,-0.305569529533386,0.94044703245163,0.148951977491379,-0.305569499731064,0.940447092056274,0.14895199239254,-0.305569529533386,0.528951525688171,0.436083436012268,-0.728039443492889,0.528951525688171,0.436083436012268,-0.728039443492889,0.528951525688171,0.436083436012268,-0.728039503097534,0.528951525688171,0.436083436012268,-0.728039503097534,-8.84424480318557e-08,0.436083376407623,-0.899906277656555,-8.84424622427105e-08,0.436083406209946,-0.899906277656555,-8.84424622427105e-08,0.436083406209946,-0.899906277656555,-8.84424622427105e-08,0.436083436012268,-0.89990621805191,-0.528951644897461,0.436083436012268,-0.728039383888245,-0.528951644897461,0.436083436012268,-0.728039443492889,-0.528951644897461,0.436083436012268,-0.728039443492889,-0.528951585292816,0.43608346581459,-0.728039383888245,-0.855861663818359,0.436083436012268,-0.278086185455322,-0.855861663818359,0.436083436012268,-0.278086185455322,-0.855861723423004,0.436083436012268,-0.278086215257645,-0.855861723423004,0.436083436012268,-0.278086215257645,-0.855861663818359,0.436083287000656,0.278086394071579,-0.855861663818359,0.436083287000656,0.278086394071579,-0.855861723423004,0.436083287000656,0.278086423873901,-0.855861783027649,0.436083316802979,0.278086423873901,-0.528951644897461,0.436083436012268,0.728039443492889,-0.528951585292816,0.436083406209946,0.728039443492889,-0.528951585292816,0.436083406209946,0.728039443492889,-0.528951644897461,0.43608346581459,0.728039503097534, +8.84424622427105e-08,0.436083316802979,0.89990621805191,8.84424622427105e-08,0.436083316802979,0.89990621805191,8.84424764535652e-08,0.436083406209946,0.899906277656555,8.84424693481378e-08,0.436083376407623,0.899906277656555,0.528951585292816,0.436083257198334,0.728039562702179,0.528951585292816,0.436083257198334,0.728039503097534,0.528951585292816,0.436083257198334,0.728039503097534,0.528951585292816,0.436083227396011,0.728039503097534,0.855861783027649,0.436083287000656,0.278086304664612,0.855861783027649,0.436083287000656,0.278086304664612,0.855861842632294,0.436083257198334,0.278086304664612,0.855861842632294,0.436083257198334,0.278086304664612,0.855861663818359,0.436083644628525,-0.278086125850677,0.855861604213715,0.436083674430847,-0.278086125850677,0.855861663818359,0.436083644628525,-0.278086155653,0.855861604213715,0.436083614826202,-0.278086155653,0.425919204950333,0.68915182352066,-0.586227416992188,0.425919145345688,0.689151763916016,-0.586227357387543,0.42591917514801,0.689151763916016,-0.586227416992188,0.425919204950333,0.689151883125305,-0.586227416992188,-1.1307427172369e-07,0.689151763916016,-0.724617004394531,-1.1307427172369e-07,0.689151763916016,-0.724617004394531,-1.13074264618263e-07,0.689151704311371,-0.724617004394531,-1.13074278829117e-07,0.689151763916016,-0.724617063999176,-0.425919264554977,0.68915182352066,-0.586227357387543,-0.425919264554977,0.68915182352066,-0.586227357387543,-0.425919324159622,0.68915182352066,-0.586227416992188,-0.4259192943573,0.68915182352066,-0.586227416992188,-0.689151763916016,0.68915182352066,-0.223918974399567,-0.689151763916016,0.689151763916016,-0.223918959498405,-0.689151763916016,0.689151763916016,-0.223918959498405,-0.689151644706726,0.689151704311371,-0.223918944597244,-0.689151704311371,0.68915182352066,0.223918959498405,-0.689151704311371,0.68915182352066,0.223918959498405,-0.689151644706726,0.689151763916016,0.223918929696083,-0.689151644706726,0.689151763916016,0.223918944597244,-0.425919115543365,0.689151704311371,0.586227595806122,-0.425919115543365,0.689151644706726,0.586227595806122, +-0.425919145345688,0.689151763916016,0.586227655410767,-0.425919145345688,0.689151763916016,0.586227655410767,1.13074278829117e-07,0.689151763916016,0.724617004394531,1.13074278829117e-07,0.689151763916016,0.724617004394531,1.13074293039972e-07,0.689151763916016,0.724617004394531,1.13074285934545e-07,0.68915182352066,0.724617004394531,0.425919145345688,0.689151883125305,0.586227416992188,0.425919145345688,0.689151883125305,0.586227416992188,0.42591917514801,0.689151883125305,0.586227416992188,0.42591917514801,0.689151883125305,0.586227416992188,0.68915182352066,0.68915182352066,0.223918870091438,0.689151763916016,0.689151763916016,0.223918855190277,0.689151763916016,0.689151763916016,0.223918884992599,0.689151763916016,0.689151763916016,0.223918870091438,0.689151763916016,0.68915182352066,-0.223918825387955,0.689151763916016,0.68915182352066,-0.223918810486794,0.689151763916016,0.68915182352066,-0.223918825387955,0.689151704311371,0.689151763916016,-0.223918810486794,0.277577847242355,0.881468057632446,-0.382053256034851,0.277577847242355,0.881468057632446,-0.382053226232529,0.277577847242355,0.881468057632446,-0.382053256034851,0.277577847242355,0.881467998027802,-0.382053256034851,-1.34078490532374e-07,0.881467998027802,-0.472243696451187,-1.3407847632152e-07,0.881467998027802,-0.472243696451187,-1.34078490532374e-07,0.881467998027802,-0.472243696451187,-1.34078504743229e-07,0.881467998027802,-0.472243756055832,-0.277577817440033,0.881468117237091,-0.382053196430206,-0.277577817440033,0.881468057632446,-0.382053196430206,-0.277577847242355,0.881468117237091,-0.382053196430206,-0.277577847242355,0.881468117237091,-0.382053196430206,-0.449130356311798,0.881468117237091,-0.145931199193001,-0.449130356311798,0.881468057632446,-0.145931199193001,-0.449130356311798,0.881468117237091,-0.145931199193001,-0.44913038611412,0.881468117237091,-0.145931199193001,-0.449130475521088,0.881468057632446,0.145931243896484,-0.449130475521088,0.881468057632446,0.145931243896484,-0.449130445718765,0.881467998027802,0.145931228995323, +-0.449130445718765,0.881467998027802,0.145931228995323,-0.277577787637711,0.881468057632446,0.382053285837173,-0.277577757835388,0.881467998027802,0.382053285837173,-0.277577728033066,0.881467998027802,0.382053285837173,-0.277577787637711,0.881467998027802,0.382053285837173,0,0.881467938423157,0.472243905067444,0,0.881467878818512,0.472243964672089,0,0.881467878818512,0.472243905067444,0,0.881467878818512,0.472243905067444,0.277577966451645,0.881468057632446,0.382053166627884,0.277577966451645,0.881468057632446,0.382053166627884,0.277577936649323,0.881468057632446,0.382053107023239,0.277577936649323,0.881468117237091,0.382053136825562,0.44913050532341,0.881468057632446,0.145931273698807,0.44913050532341,0.881468057632446,0.145931273698807,0.44913050532341,0.881468117237091,0.145931258797646,0.449130445718765,0.881468117237091,0.145931243896484,0.44913050532341,0.881468117237091,-0.14593106508255,0.44913050532341,0.881467998027802,-0.14593106508255,0.449130535125732,0.881467998027802,-0.14593106508255,0.449130535125732,0.881468057632446,-0.145931079983711,0.0965570956468582,-0.986414968967438,-0.132899314165115,0.0965570956468582,-0.986414968967438,-0.132899314165115,0.0965571030974388,-0.986414968967438,-0.132899314165115,-4.91018070647442e-08,-0.986415028572083,-0.164272397756577,-4.91018070647442e-08,-0.986414909362793,-0.164272382855415,-4.91018070647442e-08,-0.986414968967438,-0.164272367954254,-0.0965571328997612,-0.986415028572083,-0.132899090647697,-0.0965571328997612,-0.986415028572083,-0.132899090647697,-0.0965571179986,-0.986414968967438,-0.132899075746536,-0.156232699751854,-0.986414968967438,-0.050763163715601,-0.156232699751854,-0.986414968967438,-0.050763163715601,-0.156232714653015,-0.986414968967438,-0.0507631674408913,-0.15623265504837,-0.986414968967438,0.0507631450891495,-0.156232669949532,-0.986414968967438,0.0507631450891495,-0.156232640147209,-0.986414849758148,0.0507631413638592,-0.0965571030974388,-0.986414909362793,0.13289912045002,-0.0965571179986,-0.986415028572083,0.132899135351181,-0.0965571105480194,-0.986414909362793,0.13289912045002, +0,-0.986415028572083,0.164272427558899,0,-0.986415028572083,0.164272427558899,0,-0.986415028572083,0.164272427558899,0.0965571403503418,-0.986414968967438,0.13289912045002,0.0965571478009224,-0.986415028572083,0.13289912045002,0.0965571403503418,-0.986415028572083,0.13289912045002,0.156232699751854,-0.986414968967438,0.0507631674408913,0.156232699751854,-0.986414909362793,0.050763163715601,0.156232714653015,-0.986414968967438,0.050763163715601,0.156232669949532,-0.986414909362793,-0.0507631376385689,0.156232684850693,-0.986414968967438,-0.0507631413638592,0.156232669949532,-0.986414968967438,-0.0507631339132786,0.0965571105480194,0.986415088176727,-0.132899075746536,0.0965570956468582,0.986414968967438,-0.132899045944214,0.0965570956468582,0.986414968967438,-0.132899060845375,-4.91018070647442e-08,0.986414909362793,-0.164272382855415,-4.91018070647442e-08,0.986415028572083,-0.164272397756577,-4.91018070647442e-08,0.986414968967438,-0.164272367954254,-0.0965571030974388,0.986414909362793,-0.132899343967438,-0.0965571030974388,0.986414909362793,-0.132899343967438,-0.0965571105480194,0.986414968967438,-0.132899343967438,-0.156232699751854,0.986414968967438,-0.050763163715601,-0.156232699751854,0.986414968967438,-0.050763163715601,-0.156232714653015,0.986414968967438,-0.0507631674408913,-0.156232669949532,0.986414968967438,0.0507631450891495,-0.15623265504837,0.986414968967438,0.0507631450891495,-0.156232640147209,0.986414849758148,0.0507631413638592,-0.0965571105480194,0.986415028572083,0.132899105548859,-0.0965571030974388,0.986414968967438,0.132899105548859,-0.0965571030974388,0.986414968967438,0.132899090647697,0,0.986415028572083,0.164272427558899,0,0.986415028572083,0.164272427558899,0,0.986415028572083,0.164272427558899,0.0965571478009224,0.986414909362793,0.13289912045002,0.096557155251503,0.986415028572083,0.132899135351181,0.0965571403503418,0.986414909362793,0.13289912045002,0.156232699751854,0.986414909362793,0.050763163715601,0.156232699751854,0.986414968967438,0.0507631674408913,0.156232714653015,0.986414968967438,0.050763163715601, +0.156232684850693,0.986414968967438,-0.0507631413638592,0.156232669949532,0.986414909362793,-0.0507631376385689,0.156232669949532,0.986414968967438,-0.0507631339132786 + } + NormalsW: *380 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *238 { + a: 0,0.100000001490116,0.100000001490116,0.100000001490116,0.200000002980232,0.100000001490116,0.300000011920929,0.100000001490116,0.400000005960464,0.100000001490116,0.5,0.100000001490116,0.600000023841858,0.100000001490116,0.700000047683716,0.100000001490116,0.800000071525574,0.100000001490116,0.900000095367432,0.100000001490116,1.00000011920929,0.100000001490116,0,0.200000002980232,0.100000001490116,0.200000002980232,0.200000002980232,0.200000002980232,0.300000011920929,0.200000002980232,0.400000005960464,0.200000002980232,0.5,0.200000002980232,0.600000023841858,0.200000002980232,0.700000047683716,0.200000002980232,0.800000071525574,0.200000002980232,0.900000095367432,0.200000002980232,1.00000011920929,0.200000002980232,0,0.300000011920929,0.100000001490116,0.300000011920929,0.200000002980232,0.300000011920929,0.300000011920929,0.300000011920929,0.400000005960464,0.300000011920929,0.5,0.300000011920929,0.600000023841858,0.300000011920929,0.700000047683716,0.300000011920929,0.800000071525574,0.300000011920929,0.900000095367432,0.300000011920929,1.00000011920929,0.300000011920929,0,0.400000005960464,0.100000001490116,0.400000005960464,0.200000002980232,0.400000005960464,0.300000011920929,0.400000005960464,0.400000005960464,0.400000005960464,0.5,0.400000005960464,0.600000023841858,0.400000005960464,0.700000047683716,0.400000005960464,0.800000071525574,0.400000005960464,0.900000095367432,0.400000005960464,1.00000011920929,0.400000005960464,0,0.5,0.100000001490116,0.5,0.200000002980232,0.5,0.300000011920929,0.5,0.400000005960464,0.5,0.5,0.5,0.600000023841858,0.5,0.700000047683716,0.5,0.800000071525574,0.5,0.900000095367432,0.5,1.00000011920929,0.5,0,0.600000023841858,0.100000001490116,0.600000023841858,0.200000002980232,0.600000023841858,0.300000011920929,0.600000023841858,0.400000005960464,0.600000023841858,0.5,0.600000023841858,0.600000023841858,0.600000023841858,0.700000047683716,0.600000023841858,0.800000071525574,0.600000023841858,0.900000095367432,0.600000023841858,1.00000011920929,0.600000023841858, +0,0.700000047683716,0.100000001490116,0.700000047683716,0.200000002980232,0.700000047683716,0.300000011920929,0.700000047683716,0.400000005960464,0.700000047683716,0.5,0.700000047683716,0.600000023841858,0.700000047683716,0.700000047683716,0.700000047683716,0.800000071525574,0.700000047683716,0.900000095367432,0.700000047683716,1.00000011920929,0.700000047683716,0,0.800000071525574,0.100000001490116,0.800000071525574,0.200000002980232,0.800000071525574,0.300000011920929,0.800000071525574,0.400000005960464,0.800000071525574,0.5,0.800000071525574,0.600000023841858,0.800000071525574,0.700000047683716,0.800000071525574,0.800000071525574,0.800000071525574,0.900000095367432,0.800000071525574,1.00000011920929,0.800000071525574,0,0.900000095367432,0.100000001490116,0.900000095367432,0.200000002980232,0.900000095367432,0.300000011920929,0.900000095367432,0.400000005960464,0.900000095367432,0.5,0.900000095367432,0.600000023841858,0.900000095367432,0.700000047683716,0.900000095367432,0.800000071525574,0.900000095367432,0.900000095367432,0.900000095367432,1.00000011920929,0.900000095367432,0.0500000007450581,0,0.150000005960464,0,0.25,0,0.350000023841858,0,0.450000017881393,0,0.550000011920929,0,0.650000035762787,0,0.75,0,0.850000023841858,0,0.950000047683716,0,0.0500000007450581,1,0.150000005960464,1,0.25,1,0.350000023841858,1,0.450000017881393,1,0.550000011920929,1,0.650000035762787,1,0.75,1,0.850000023841858,1,0.950000047683716,1 + } + UVIndex: *380 { + a: 0,1,12,11,1,2,13,12,2,3,14,13,3,4,15,14,4,5,16,15,5,6,17,16,6,7,18,17,7,8,19,18,8,9,20,19,9,10,21,20,11,12,23,22,12,13,24,23,13,14,25,24,14,15,26,25,15,16,27,26,16,17,28,27,17,18,29,28,18,19,30,29,19,20,31,30,20,21,32,31,22,23,34,33,23,24,35,34,24,25,36,35,25,26,37,36,26,27,38,37,27,28,39,38,28,29,40,39,29,30,41,40,30,31,42,41,31,32,43,42,33,34,45,44,34,35,46,45,35,36,47,46,36,37,48,47,37,38,49,48,38,39,50,49,39,40,51,50,40,41,52,51,41,42,53,52,42,43,54,53,44,45,56,55,45,46,57,56,46,47,58,57,47,48,59,58,48,49,60,59,49,50,61,60,50,51,62,61,51,52,63,62,52,53,64,63,53,54,65,64,55,56,67,66,56,57,68,67,57,58,69,68,58,59,70,69,59,60,71,70,60,61,72,71,61,62,73,72,62,63,74,73,63,64,75,74,64,65,76,75,66,67,78,77,67,68,79,78,68,69,80,79,69,70,81,80,70,71,82,81,71,72,83,82,72,73,84,83,73,74,85,84,74,75,86,85,75,76,87,86,77,78,89,88,78,79,90,89,79,80,91,90,80,81,92,91,81,82,93,92,82,83,94,93,83,84,95,94,84,85,96,95,85,86,97,96,86,87,98,97,1,0,99,2,1,100,3,2,101,4,3,102,5,4,103,6,5,104,7,6,105,8,7,106,9,8,107,10,9,108,88,89,109,89,90,110,90,91,111,91,92,112,92,93,113,93,94,114,94,95,115,95,96,116,96,97,117,97,98,118 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2828958386096, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 2830728273280, "Geometry::", "Mesh" { + Vertices: *36 { + a: 0.769420981407166,0.309016972780228,-0.559017181396484,0.293892592191696,0.309016972780228,-0.904508709907532,-0.29389277100563,0.309016972780228,-0.904508590698242,-0.769421100616455,0.309016972780228,-0.55901700258255,-0.951056659221649,0.309016972780228,5.66873872287488e-08,-0.769420981407166,0.309016972780228,0.55901712179184,-0.293892621994019,0.309016972780228,0.904508590698242,0.293892681598663,0.309016972780228,0.904508531093597,0.769420921802521,0.309016972780228,0.55901700258255,0.95105654001236,0.309016972780228,0,0,-1,0,0,1,0 + } + PolygonVertexIndex: *60 { + a: 1,0,-11,2,1,-11,3,2,-11,4,3,-11,5,4,-11,6,5,-11,7,6,-11,8,7,-11,9,8,-11,0,9,-11,0,1,-12,1,2,-12,2,3,-12,3,4,-12,4,5,-12,5,6,-12,6,7,-12,7,8,-12,8,9,-12,9,0,-12 + } + Edges: *30 { + a: 0,3,6,9,12,15,18,21,24,27,1,2,5,8,11,14,17,20,23,26,32,31,34,37,40,43,46,49,52,55 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *180 { + a: 0.483571887016296,-0.568473160266876,-0.665579855442047,0.483571887016296,-0.568473160266876,-0.665579855442047,0.483571916818619,-0.568473160266876,-0.665579795837402,-1.27464275578859e-07,-0.568473100662231,-0.822701811790466,-1.27464289789714e-07,-0.568473160266876,-0.822701811790466,-1.27464289789714e-07,-0.568473160266876,-0.822701871395111,-0.483572036027908,-0.568473100662231,-0.665579795837402,-0.483572036027908,-0.568473100662231,-0.665579795837402,-0.483572065830231,-0.568473100662231,-0.665579795837402,-0.782435894012451,-0.568473160266876,-0.25422877073288,-0.782435894012451,-0.568473160266876,-0.25422877073288,-0.782436013221741,-0.568473219871521,-0.25422877073288,-0.782435953617096,-0.568473041057587,0.254228860139847,-0.782435953617096,-0.568473100662231,0.254228889942169,-0.782436013221741,-0.568473100662231,0.254228889942169,-0.483571887016296,-0.568473100662231,0.665579915046692,-0.483571887016296,-0.568473100662231,0.665579915046692,-0.483571887016296,-0.568473041057587,0.665579915046692,1.27464304000569e-07,-0.568473041057587,0.822701871395111,1.27464304000569e-07,-0.568473041057587,0.822701930999756,1.27464289789714e-07,-0.568473041057587,0.822701871395111,0.483572036027908,-0.568472981452942,0.665579795837402,0.483572036027908,-0.568473041057587,0.665579795837402,0.483572036027908,-0.568473041057587,0.665579795837402,0.782435894012451,-0.568473041057587,0.254228889942169,0.782435894012451,-0.568473041057587,0.254228889942169,0.782436013221741,-0.568473041057587,0.254228889942169,0.782435953617096,-0.568473160266876,-0.254228711128235,0.782435953617096,-0.568473100662231,-0.254228711128235,0.782435953617096,-0.568473160266876,-0.254228740930557,0.356821984052658,0.794654548168182,-0.49112343788147,0.356821984052658,0.794654548168182,-0.49112343788147,0.356821984052658,0.794654488563538,-0.49112343788147,-8.90895819338766e-08,0.794654548168182,-0.607061922550201,-8.9089589039304e-08,0.794654548168182,-0.607061982154846,-8.90895819338766e-08,0.794654488563538,-0.607061862945557, +-0.356822103261948,0.794654548168182,-0.491123348474503,-0.356822103261948,0.794654548168182,-0.491123348474503,-0.356822103261948,0.794654488563538,-0.491123378276825,-0.577350258827209,0.794654488563538,-0.187592431902885,-0.577350318431854,0.794654488563538,-0.187592431902885,-0.577350258827209,0.794654488563538,-0.187592402100563,-0.577350318431854,0.794654428958893,0.187592417001724,-0.577350318431854,0.794654428958893,0.187592417001724,-0.577350258827209,0.794654428958893,0.187592402100563,-0.356822043657303,0.794654428958893,0.491123467683792,-0.356822043657303,0.794654488563538,0.491123467683792,-0.35682201385498,0.794654488563538,0.491123408079147,8.9089610355586e-08,0.794654488563538,0.607061982154846,8.9089610355586e-08,0.794654488563538,0.607061982154846,8.90895961447313e-08,0.794654488563538,0.607061922550201,0.35682213306427,0.794654488563538,0.491123348474503,0.35682213306427,0.794654488563538,0.491123348474503,0.35682213306427,0.794654607772827,0.491123378276825,0.577350258827209,0.794654369354248,0.187592431902885,0.577350258827209,0.794654369354248,0.187592431902885,0.577350318431854,0.794654488563538,0.187592476606369,0.577350258827209,0.794654488563538,-0.187592387199402,0.577350318431854,0.794654488563538,-0.187592387199402,0.57735013961792,0.794654488563538,-0.187592357397079 + } + NormalsW: *60 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *62 { + a: 0,0.600000023841858,0.100000001490116,0.600000023841858,0.200000002980232,0.600000023841858,0.300000011920929,0.600000023841858,0.400000005960464,0.600000023841858,0.5,0.600000023841858,0.600000023841858,0.600000023841858,0.700000047683716,0.600000023841858,0.800000071525574,0.600000023841858,0.900000095367432,0.600000023841858,1.00000011920929,0.600000023841858,0.0500000007450581,0,0.150000005960464,0,0.25,0,0.350000023841858,0,0.450000017881393,0,0.550000011920929,0,0.650000035762787,0,0.75,0,0.850000023841858,0,0.950000047683716,0,0.0500000007450581,1,0.150000005960464,1,0.25,1,0.350000023841858,1,0.450000017881393,1,0.550000011920929,1,0.650000035762787,1,0.75,1,0.850000023841858,1,0.950000047683716,1 + } + UVIndex: *60 { + a: 1,0,11,2,1,12,3,2,13,4,3,14,5,4,15,6,5,16,7,6,17,8,7,18,9,8,19,10,9,20,0,1,21,1,2,22,2,3,23,3,4,24,4,5,25,5,6,26,6,7,27,7,8,28,8,9,29,9,10,30 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2828884882736, "Model::Null", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2828884857216, "Model::Mesh", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2828884859536, "Model::Bone", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",4.00048738794101,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2828884866496, "Model::Camera", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",6,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2828884873456, "Model::Light", "Light" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,2 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2828884885056, "Model::StereoCamera", "CameraStereo" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,0,2 + P: "stereoRigType", "KString", "", "U", "StereoCamera" + } + Shading: Y + Culling: "CullingOff" + } + Model: 2828884875776, "Model::NurbsCurve", "NurbsCurve" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",4,0,2 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2828884854896, "Model::NurbsSurface", "NurbsSurface" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",6,0,2 + } + Shading: T + Culling: "CullingOff" + } + Model: 2828884892016, "Model::curve1", "NurbsCurve" { + Version: 232 + Properties70: { + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2828884864176, "Model::NurbsTrim", "TrimNurbsSurface" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,4 + } + Shading: T + Culling: "CullingOff" + } + Model: 2828884889696, "Model::LodGroup", "LodGroup" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,0,4 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2828884861856, "Model::LOD_0", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2828884917536, "Model::pSphere1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2828884894336, "Model::LOD_1", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2828884901296, "Model::pSphere1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2830699157376, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2829282334736, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2828967909168, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 35,50 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2829282339728, "AnimCurveNode::FocalLength", "" { + Properties70: { + P: "d|FocalLength", "Number", "", "A",35.6990219446043 + } + } + AnimationCurveNode: 2829282341600, "AnimCurveNode::FocalLength", "" { + Properties70: { + P: "d|FocalLength", "Number", "", "A",35.6990219446043 + } + } + AnimationCurveNode: 2829282340352, "AnimCurveNode::FocusDistance", "" { + Properties70: { + P: "d|FocusDistance", "Number", "", "A",5 + } + } + AnimationCurveNode: 2829282332448, "AnimCurveNode::FilmWidth", "" { + Properties70: { + P: "d|FilmWidth", "Number", "", "A",1.41732 + } + } + AnimationCurveNode: 2829282340768, "AnimCurveNode::FilmHeight", "" { + Properties70: { + P: "d|FilmHeight", "Number", "", "A",0.94488 + } + } + AnimationCurveNode: 2829282340976, "AnimCurveNode::FilmOffsetX", "" { + Properties70: { + P: "d|FilmOffsetX", "Number", "", "A",0.00287447241134942 + } + } + AnimationCurveNode: 2829282341392, "AnimCurveNode::FocalLength", "" { + Properties70: { + P: "d|FocalLength", "Number", "", "A",35.6990219446043 + } + } + AnimationCurveNode: 2829282328704, "AnimCurveNode::FocusDistance", "" { + Properties70: { + P: "d|FocusDistance", "Number", "", "A",5 + } + } + AnimationCurveNode: 2829282329120, "AnimCurveNode::FilmWidth", "" { + Properties70: { + P: "d|FilmWidth", "Number", "", "A",1.41732 + } + } + AnimationCurveNode: 2829282337232, "AnimCurveNode::FilmHeight", "" { + Properties70: { + P: "d|FilmHeight", "Number", "", "A",0.94488 + } + } + AnimationCurveNode: 2829282329952, "AnimCurveNode::FilmOffsetX", "" { + Properties70: { + P: "d|FilmOffsetX", "Number", "", "A",-0.00287447241134942 + } + } + AnimationLayer: 2828981362112, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Null, Model::RootNode + C: "OO",2828884882736,0 + + ;Model::Mesh, Model::RootNode + C: "OO",2828884857216,0 + + ;Model::Bone, Model::RootNode + C: "OO",2828884859536,0 + + ;Model::Camera, Model::RootNode + C: "OO",2828884866496,0 + + ;Model::Light, Model::RootNode + C: "OO",2828884873456,0 + + ;Model::StereoCamera, Model::RootNode + C: "OO",2828884885056,0 + + ;Model::NurbsCurve, Model::RootNode + C: "OO",2828884875776,0 + + ;Model::NurbsSurface, Model::RootNode + C: "OO",2828884854896,0 + + ;Model::NurbsTrim, Model::RootNode + C: "OO",2828884864176,0 + + ;Model::LodGroup, Model::RootNode + C: "OO",2828884889696,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2828981362112,2829282334736 + + ;AnimCurveNode::FocalLength, AnimLayer::BaseLayer + C: "OO",2829282339728,2828981362112 + + ;AnimCurveNode::FocalLength, AnimLayer::BaseLayer + C: "OO",2829282341600,2828981362112 + + ;AnimCurveNode::FocusDistance, AnimLayer::BaseLayer + C: "OO",2829282340352,2828981362112 + + ;AnimCurveNode::FilmWidth, AnimLayer::BaseLayer + C: "OO",2829282332448,2828981362112 + + ;AnimCurveNode::FilmHeight, AnimLayer::BaseLayer + C: "OO",2829282340768,2828981362112 + + ;AnimCurveNode::FilmOffsetX, AnimLayer::BaseLayer + C: "OO",2829282340976,2828981362112 + + ;AnimCurveNode::FocalLength, AnimLayer::BaseLayer + C: "OO",2829282341392,2828981362112 + + ;AnimCurveNode::FocusDistance, AnimLayer::BaseLayer + C: "OO",2829282328704,2828981362112 + + ;AnimCurveNode::FilmWidth, AnimLayer::BaseLayer + C: "OO",2829282329120,2828981362112 + + ;AnimCurveNode::FilmHeight, AnimLayer::BaseLayer + C: "OO",2829282337232,2828981362112 + + ;AnimCurveNode::FilmOffsetX, AnimLayer::BaseLayer + C: "OO",2829282329952,2828981362112 + + ;NodeAttribute::, Model::Null + C: "OO",2828958385040,2828884882736 + + ;Geometry::, Model::Mesh + C: "OO",2830728277856,2828884857216 + + ;Material::lambert1, Model::Mesh + C: "OO",2830699157376,2828884857216 + + ;NodeAttribute::, Model::Bone + C: "OO",2828955901024,2828884859536 + + ;NodeAttribute::Camera, Model::Camera + C: "OO",2828957659072,2828884866496 + + ;NodeAttribute::, Model::Light + C: "OO",2830726796704,2828884873456 + + ;AnimCurveNode::FocalLength, NodeAttribute::StereoCamera + C: "OP",2829282339728,2830686558720, "FocalLength" + + ;NodeAttribute::StereoRightShape, NodeAttribute::StereoCamera + C: "OP",2828957661008,2830686558720, "RightCamera" + + ;NodeAttribute::StereoLeftShape, NodeAttribute::StereoCamera + C: "OP",2828957674560,2830686558720, "LeftCamera" + + ;AnimCurveNode::FilmOffsetX, NodeAttribute::StereoLeftShape + C: "OP",2829282340976,2828957674560, "FilmOffsetX" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoLeftShape + C: "PP",2830686558720, "FilmWidth",2828957674560, "FilmWidth" + + ;AnimCurveNode::FilmWidth, NodeAttribute::StereoLeftShape + C: "OP",2829282332448,2828957674560, "FilmWidth" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoLeftShape + C: "PP",2830686558720, "FilmHeight",2828957674560, "FilmHeight" + + ;AnimCurveNode::FilmHeight, NodeAttribute::StereoLeftShape + C: "OP",2829282340768,2828957674560, "FilmHeight" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoLeftShape + C: "PP",2830686558720, "FilmSqueezeRatio",2828957674560, "FilmSqueezeRatio" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoLeftShape + C: "PP",2830686558720, "FocalLength",2828957674560, "FocalLength" + + ;AnimCurveNode::FocalLength, NodeAttribute::StereoLeftShape + C: "OP",2829282341600,2828957674560, "FocalLength" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoLeftShape + C: "PP",2830686558720, "NearPlane",2828957674560, "NearPlane" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoLeftShape + C: "PP",2830686558720, "FarPlane",2828957674560, "FarPlane" + + ;AnimCurveNode::FocusDistance, NodeAttribute::StereoLeftShape + C: "OP",2829282340352,2828957674560, "FocusDistance" + + ;AnimCurveNode::FilmOffsetX, NodeAttribute::StereoRightShape + C: "OP",2829282329952,2828957661008, "FilmOffsetX" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoRightShape + C: "PP",2830686558720, "FilmWidth",2828957661008, "FilmWidth" + + ;AnimCurveNode::FilmWidth, NodeAttribute::StereoRightShape + C: "OP",2829282329120,2828957661008, "FilmWidth" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoRightShape + C: "PP",2830686558720, "FilmHeight",2828957661008, "FilmHeight" + + ;AnimCurveNode::FilmHeight, NodeAttribute::StereoRightShape + C: "OP",2829282337232,2828957661008, "FilmHeight" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoRightShape + C: "PP",2830686558720, "FilmSqueezeRatio",2828957661008, "FilmSqueezeRatio" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoRightShape + C: "PP",2830686558720, "FocalLength",2828957661008, "FocalLength" + + ;AnimCurveNode::FocalLength, NodeAttribute::StereoRightShape + C: "OP",2829282341392,2828957661008, "FocalLength" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoRightShape + C: "PP",2830686558720, "NearPlane",2828957661008, "NearPlane" + + ;NodeAttribute::StereoCamera, NodeAttribute::StereoRightShape + C: "PP",2830686558720, "FarPlane",2828957661008, "FarPlane" + + ;AnimCurveNode::FocusDistance, NodeAttribute::StereoRightShape + C: "OP",2829282328704,2828957661008, "FocusDistance" + + ;NodeAttribute::StereoCamera, Model::StereoCamera + C: "OO",2830686558720,2828884885056 + + ;Geometry::, Model::NurbsCurve + C: "OO",2829630967760,2828884875776 + + ;Geometry::, Model::NurbsSurface + C: "OO",2828972827328,2828884854896 + + ;Material::lambert1, Model::NurbsSurface + C: "OO",2830699157376,2828884854896 + + ;Model::curve1, Geometry:: + C: "OO",2828884892016,2828972829008 + + ;Geometry::, Model::curve1 + C: "OO",2829630967440,2828884892016 + + ;Geometry::, Geometry:: + C: "OO",2828972829008,2828981358768 + + ;Geometry::, Geometry:: + C: "OO",2828981363632,2828981358768 + + ;Geometry::, Geometry:: + C: "OO",2829630956880,2828981363632 + + ;Geometry::, Geometry:: + C: "OO",2829630970320,2828981363632 + + ;Geometry::, Geometry:: + C: "OO",2829630958160,2828981363632 + + ;Geometry::, Geometry:: + C: "OO",2829630964880,2828981363632 + + ;Geometry::, Geometry:: + C: "OO",2829630957200,2828981363632 + + ;Geometry::, Geometry:: + C: "OO",2829630965200,2828981363632 + + ;Geometry::, Geometry:: + C: "OO",2829630971280,2828981363632 + + ;Geometry::, Model::NurbsTrim + C: "OO",2828981358768,2828884864176 + + ;Material::lambert1, Model::NurbsTrim + C: "OO",2830699157376,2828884864176 + + ;NodeAttribute::, Model::LodGroup + C: "OO",2830731250192,2828884889696 + + ;Model::LOD_0, Model::LodGroup + C: "OO",2828884861856,2828884889696 + + ;Model::LOD_1, Model::LodGroup + C: "OO",2828884894336,2828884889696 + + ;NodeAttribute::, Model::LOD_0 + C: "OO",2828958383104,2828884861856 + + ;Model::pSphere1, Model::LOD_0 + C: "OO",2828884917536,2828884861856 + + ;Geometry::, Model::pSphere1 + C: "OO",2830728272864,2828884917536 + + ;Material::lambert1, Model::pSphere1 + C: "OO",2830699157376,2828884917536 + + ;NodeAttribute::, Model::LOD_1 + C: "OO",2828958386096,2828884894336 + + ;Model::pSphere1, Model::LOD_1 + C: "OO",2828884901296,2828884894336 + + ;Geometry::, Model::pSphere1 + C: "OO",2830728273280,2828884901296 + + ;Material::lambert1, Model::pSphere1 + C: "OO",2830699157376,2828884901296 + + ;AnimCurve::, AnimCurveNode::FocalLength + C: "OP",2828967909168,2829282339728, "d|FocalLength" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_node_attribute_zoo_7500_binary.fbx b/modules/ufbx/data/maya_node_attribute_zoo_7500_binary.fbx new file mode 100644 index 0000000..14b9412 Binary files /dev/null and b/modules/ufbx/data/maya_node_attribute_zoo_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_notes_6100_ascii.fbx b/modules/ufbx/data/maya_notes_6100_ascii.fbx new file mode 100644 index 0000000..149f49a --- /dev/null +++ b/modules/ufbx/data/maya_notes_6100_ascii.fbx @@ -0,0 +1,364 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2023 + Month: 1 + Day: 19 + Hour: 18 + Minute: 36 + Second: 20 + Millisecond: 364 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "notes", "KString", "U", "pCube1 notes:&lf;0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947 7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 8015 8016 8017 8018 8019 8020 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 8035 8036 8037 8038 8039 8040 8041 8042 8043 8044 8045 8046 8047 8048 8049 8050 8051 8052 8053 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 8171 8172 8173 8174 8175 8176 8177 8178 8179 8180 8181 8182 8183 8184 8185 8186 8187 8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212 8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308 8309 8310 8311 8312 8313 8314 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433 8434 8435 8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 8464 8465 8466 8467 8468 8469 8470 8471 8472 8473 8474 8475 8476 8477 8478 8479 8480 8481 8482 8483 8484 8485 8486 8487 8488 8489 8490 8491 8492 8493 8494 8495 8496 8497 8498 8499 8500 8501 8502 8503 8504 8505 8506 8507 8508 8509 8510 8511 8512 8513 8514 8515 8516 8517 8518 8519 8520 8521 8522 8523 8524 8525 8526 8527 8528 8529 8530 8531 8532 8533 8534 8535 8536 8537 8538 8539 8540 8541 8542 8543 8544 8545 8546 8547 8548 8549 8550 8551 8552 8553 8554 8555 8556 8557 8558 8559 8560 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574 8575 8576 8577 8578 8579 8580 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592 8593 8594 8595 8596 8597 8598 8599 8600 8601 8602 8603 8604 8605 8606 8607 8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 8618 8619 8620 8621 8622 8623 8624 8625 8626 8627 8628 8629 8630 8631 8632 8633 8634 8635 8636 8637 8638 8639 8640 8641 8642 8643 8644 8645 8646 8647 8648 8649 8650 8651 8652 8653 8654 8655 8656 8657 8658 8659 8660 8661 8662 8663 8664 8665 8666 8667 8668 8669 8670 8671 8672 8673 8674 8675 8676 8677 8678 8679 8680 8681 8682 8683 8684 8685 8686 8687 8688 8689 8690 8691 8692 8693 8694 8695 8696 8697 8698 8699 8700 8701 8702 8703 8704 8705 8706 8707 8708 8709 8710 8711 8712 8713 8714 8715 8716 8717 8718 8719 8720 8721 8722 8723 8724 8725 8726 8727 8728 8729 8730 8731 8732 8733 8734 8735 8736 8737 8738 8739 8740 8741 8742 8743 8744 8745 8746 8747 8748 8749 8750 8751 8752 8753 8754 8755 8756 8757 8758 8759 8760 8761 8762 8763 8764 8765 8766 8767 8768 8769 8770 8771 8772 8773 8774 8775 8776 8777 8778 8779 8780 8781 8782 8783 8784 8785 8786 8787 8788 8789 8790 8791 8792 8793 8794 8795 8796 8797 8798 8799 8800 8801 8802 8803 8804 8805 8806 8807 8808 8809 8810 8811 8812 8813 8814 8815 8816 8817 8818 8819 8820 8821 8822 8823 8824 8825 8826 8827 8828 8829 8830 8831 8832 8833 8834 8835 8836 8837 8838 8839 8840 8841 8842 8843 8844 8845 8846 8847 8848 8849 8850 8851 8852 8853 8854 8855 8856 8857 8858 8859 8860 8861 8862 8863 8864 8865 8866 8867 8868 8869 8870 8871 8872 8873 8874 8875 8876 8877 8878 8879 8880 8881 8882 8883 8884 8885 8886 8887 8888 8889 8890 8891 8892 8893 8894 8895 8896 8897 8898 8899 8900 8901 8902 8903 8904 8905 8906 8907 8908 8909 8910 8911 8912 8913 8914 8915 8916 8917 8918 8919 8920 8921 8922 8923 8924 8925 8926 8927 8928 8929 8930 8931 8932 8933 8934 8935 8936 8937 8938 8939 8940 8941 8942 8943 8944 8945 8946 8947 8948 8949 8950 8951 8952 8953 8954 8955 8956 8957 8958 8959 8960 8961 8962 8963 8964 8965 8966 8967 8968 8969 8970 8971 8972 8973 8974 8975 8976 8977 8978 8979 8980 8981 8982 8983 8984 8985 8986 8987 8988 8989 8990 8991 8992 8993 8994 8995 8996 8997 8998 8999 9000 9001 9002 9003 9004 9005 9006 9007 9008 9009 9010 9011 9012 9013 9014 9015 9016 9017 9018 9019 9020 9021 9022 9023 9024 9025 9026 9027 9028 9029 9030 9031 9032 9033 9034 9035 9036 9037 9038 9039 9040 9041 9042 9043 9044 9045 9046 9047 9048 9049 9050 9051 9052 9053 9054 9055 9056 9057 9058 9059 9060 9061 9062 9063 9064 9065 9066 9067 9068 9069 9070 9071 9072 9073 9074 9075 9076 9077 9078 9079 9080 9081 9082 9083 9084 9085 9086 9087 9088 9089 9090 9091 9092 9093 9094 9095 9096 9097 9098 9099 9100 9101 9102 9103 9104 9105 9106 9107 9108 9109 9110 9111 9112 9113 9114 9115 9116 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129 9130 9131 9132 9133 9134 9135 9136 9137 9138 9139 9140 9141 9142 9143 9144 9145 9146 9147 9148 9149 9150 9151 9152 9153 9154 9155 9156 9157 9158 9159 9160 9161 9162 9163 9164 9165 9166 9167 9168 9169 9170 9171 9172 9173 9174 9175 9176 9177 9178 9179 9180 9181 9182 9183 9184 9185 9186 9187 9188 9189 9190 9191 9192 9193 9194 9195 9196 9197 9198 9199 9200 9201 9202 9203 9204 9205 9206 9207 9208 9209 9210 9211 9212 9213 9214 9215 9216 9217 9218 9219 9220 9221 9222 9223 9224 9225 9226 9227 9228 9229 9230 9231 9232 9233 9234 9235 9236 9237 9238 9239 9240 9241 9242 9243 9244 9245 9246 9247 9248 9249 9250 9251 9252 9253 9254 9255 9256 9257 9258 9259 9260 9261 9262 9263 9264 9265 9266 9267 9268 9269 9270 9271 9272 9273 9274 9275 9276 9277 9278 9279 9280 9281 9282 9283 9284 9285 9286 9287 9288 9289 9290 9291 9292 9293 9294 9295 9296 9297 9298 9299 9300 9301 9302 9303 9304 9305 9306 9307 9308 9309 9310 9311 9312 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 9323 9324 9325 9326 9327 9328 9329 9330 9331 9332 9333 9334 9335 9336 9337 9338 9339 9340 9341 9342 9343 9344 9345 9346 9347 9348 9349 9350 9351 9352 9353 9354 9355 9356 9357 9358 9359 9360 9361 9362 9363 9364 9365 9366 9367 9368 9369 9370 9371 9372 9373 9374 9375 9376 9377 9378 9379 9380 9381 9382 9383 9384 9385 9386 9387 9388 9389 9390 9391 9392 9393 9394 9395 9396 9397 9398 9399 9400 9401 9402 9403 9404 9405 9406 9407 9408 9409 9410 9411 9412 9413 9414 9415 9416 9417 9418 9419 9420 9421 9422 9423 9424 9425 9426 9427 9428 9429 9430 9431 9432 9433 9434 9435 9436 9437 9438 9439 9440 9441 9442 9443 9444 9445 9446 9447 9448 9449 9450 9451 9452 9453 9454 9455 9456 9457 9458 9459 9460 9461 9462 9463 9464 9465 9466 9467 9468 9469 9470 9471 9472 9473 9474 9475 9476 9477 9478 9479 9480 9481 9482 9483 9484 9485 9486 9487 9488 9489 9490 9491 9492 9493 9494 9495 9496 9497 9498 9499 9500 9501 9502 9503 9504 9505 9506 9507 9508 9509 9510 9511 9512 9513 9514 9515 9516 9517 9518 9519 9520 9521 9522 9523 9524 9525 9526 9527 9528 9529 9530 9531 9532 9533 9534 9535 9536 9537 9538 9539 9540 9541 9542 9543 9544 9545 9546 9547 9548 9549 9550 9551 9552 9553 9554 9555 9556 9557 9558 9559 9560 9561 9562 9563 9564 9565 9566 9567 9568 9569 9570 9571 9572 9573 9574 9575 9576 9577 9578 9579 9580 9581 9582 9583 9584 9585 9586 9587 9588 9589 9590 9591 9592 9593 9594 9595 9596 9597 9598 9599 9600 9601 9602 9603 9604 9605 9606 9607 9608 9609 9610 9611 9612 9613 9614 9615 9616 9617 9618 9619 9620 9621 9622 9623 9624 9625 9626 9627 9628 9629 9630 9631 9632 9633 9634 9635 9636 9637 9638 9639 9640 9641 9642 9643 9644 9645 9646 9647 9648 9649 9650 9651 9652 9653 9654 9655 9656 9657 9658 9659 9660 9661 9662 9663 9664 9665 9666 9667 9668 9669 9670 9671 9672 9673 9674 9675 9676 9677 9678 9679 9680 9681 9682 9683 9684 9685 9686 9687 9688 9689 9690 9691 9692 9693 9694 9695 9696 9697 9698 9699 9700 9701 9702 9703 9704 9705 9706 9707 9708 9709 9710 9711 9712 9713 9714 9715 9716 9717 9718 9719 9720 9721 9722 9723 9724 9725 9726 9727 9728 9729 9730 9731 9732 9733 9734 9735 9736 9737 9738 9739 9740 9741 9742 9743 9744 9745 9746 9747 9748 9749 9750 9751 9752 9753 9754 9755 9756 9757 9758 9759 9760 9761 9762 9763 9764 9765 9766 9767 9768 9769 9770 9771 9772 9773 9774 9775 9776 9777 9778 9779 9780 9781 9782 9783 9784 9785 9786 9787 9788 9789 9790 9791 9792 9793 9794 9795 9796 9797 9798 9799 9800 9801 9802 9803 9804 9805 9806 9807 9808 9809 9810 9811 9812 9813 9814 9815 9816 9817 9818 9819 9820 9821 9822 9823 9824 9825 9826 9827 9828 9829 9830 9831 9832 9833 9834 9835 9836 9837 9838 9839 9840 9841 9842 9843 9844 9845 9846 9847 9848 9849 9850 9851 9852 9853 9854 9855 9856 9857 9858 9859 9860 9861 9862 9863 9864 9865 9866 9867 9868 9869 9870 9871 9872 9873 9874 9875 9876 9877 9878 9879 9880 9881 9882 9883 9884 9885 9886 9887 9888 9889 9890 9891 9892 9893 9894 9895 9896 9897 9898 9899 9900 9901 9902 9903 9904 9905 9906 9907 9908 9909 9910 9911 9912 9913 9914 9915 9916 9917 9918 9919 9920 9921 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9954 9955 9956 9957 9958 9959 9960 9961 9962 9963 9964 9965 9966 9967 9968 9969 9970 9971 9972 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 10012 10013 10014 10015 10016 10017 10018 10019 10020 10021 10022 10023 10024 10025 10026 10027 10028 10029 10030 10031 10032 10033 10034 10035 10036 10037 10038 10039 10040 10041 10042 10043 10044 10045 10046 10047 10048 10049 10050 10051 10052 10053 10054 10055 10056 10057 10058 10059 10060 10061 10062 10063 10064 10065 10066 10067 10068 10069 10070 10071 10072 10073 10074 10075 10076 10077 10078 10079 10080 10081 10082 10083 10084 10085 10086 10087 10088 10089 10090 10091 10092 10093 10094 10095 10096 10097 10098 10099 10100 10101 10102 10103 10104 10105 10106 10107 10108 10109 10110 10111 10112 10113 10114 10115 10116 10117 10118 10119 10120 10121 10122 10123 10124 10125 10126 10127 10128 10129 10130 10131 10132 10133 10134 10135 10136 10137 10138 10139 10140 10141 10142 10143 10144 10145 10146 10147 10148 10149 10150 10151 10152 10153 10154 10155 10156 10157 10158 10159 10160 10161 10162 10163 10164 10165 10166 10167 10168 10169 10170 10171 10172 10173 10174 10175 10176 10177 10178 10179 10180 10181 10182 10183 10184 10185 10186 10187 10188 10189 10190 10191 10192 10193 10194 10195 10196 10197 10198 10199 10200 10201 10202 10203 10204 10205 10206 10207 10208 10209 10210 10211 10212 10213 10214 10215 10216 10217 10218 10219 10220 10221 10222 10223 10224 10225 10226 10227 10228 10229 10230 10231 10232 10233 10234 10235 10236 10237 10238 10239 10240 10241 10242 10243 10244 10245 10246 10247 10248 10249 10250 10251 10252 10253 10254 10255 10256 10257 10258 10259 10260 10261 10262 10263 10264 10265 10266 10267 10268 10269 10270 10271 10272 10273 10274 10275 10276 10277 10278 10279 10280 10281 10282 10283 10284 10285 10286 10287 10288 10289 10290 10291 10292 10293 10294 10295 10296 10297 10298 10299 10300 10301 10302 10303 10304 10305 10306 10307 10308 10309 10310 10311 10312 10313 10314 10315 10316 10317 10318 10319 10320 10321 10322 10323 10324 10325 10326 10327 10328 10329 10330 10331 10332 10333 10334 10335 10336 10337 10338 10339 10340 10341 10342 10343 10344 10345 10346 10347 10348 10349 10350 10351 10352 10353 10354 10355 10356 10357 10358 10359 10360 10361 10362 10363 10364 10365 10366 10367 10368 10369 10370 10371 10372 10373 10374 10375 10376 10377 10378 10379 10380 10381 10382 10383 10384 10385 10386 10387 10388 10389 10390 10391 10392 10393 10394 10395 10396 10397 10398 10399 10400 10401 10402 10403 10404 10405 10406 10407 10408 10409 10410 10411 10412 10413 10414 10415 10416 10417 10418 10419 10420 10421 10422 10423 10424 10425 10426 10427 10428 10429 10430 10431 10432 10433 10434 10435 10436 10437 10438 10439 10440 10441 10442 10443 10444 10445 10446 10447 10448 10449 10450 10451 10452 10453 10454 10455 10456 10457 10458 10459 10460 10461 10462 10463 10464 10465 10466 10467 10468 10469 10470 10471 10472 10473 10474 10475 10476 10477 10478 10479 10480 10481 10482 10483 10484 10485 10486 10487 10488 10489 10490 10491 10492 10493 10494 10495 10496 10497 10498 10499 10500 10501 10502 10503 10504 10505 10506 10507 10508 10509 10510 10511 10512 10513 10514 10515 10516 10517 10518 10519 10520 10521 10522 10523 10524 10525 10526 10527 10528 10529 10530 10531 10532 10533 10534 10535 10536 10537 10538 10539 10540 10541 10542 10543 10544 10545 10546 10547 10548 10549 10550 10551 10552 10553 10554 10555 10556 10557 10558 10559 10560 10561 10562 10563 10564 10565 10566 10567 10568 10569 10570 10571 10572 10573 10574 10575 10576 10577 10578 10579 10580 10581 10582 10583 10584 10585 10586 10587 10588 10589 10590 10591 10592 10593 10594 10595 10596 10597 10598 10599 10600 10601 10602 10603 10604 10605 10606 10607 10608 10609 10610 10611 10612 10613 10614 10615 10616 10617 10618 10619 10620 10621 10622 10623 10624 10625 10626 10627 10628 10629 10630 10631 10632 10633 10634 10635 10636 10637 10638 10639 10640 10641 10642 10643 10644 10645 10646 10647 10648 10649 10650 10651 10652 10653 10654 10655 10656 10657 10658 10659 10660 10661 10662 10663 10664 10665 10666 10667 10668 10669 10670 10671 10672 10673 10674 10675 10676 10677 10678 10679 10680 10681 10682 10683 10684 10685 10686 10687 10688 10689 10690 10691 10692 10693 10694 10695 10696 10697 10698 10699 10700 10701 10702 10703 10704 10705 10706 10707 10708 10709 10710 10711 10712 10713 10714 10715 10716 10717 10718 10719 10720 10721 10722 10723 10724 10725 10726 10727 10728 10729 10730 10731 10732 10733 10734 10735 10736 10737 10738 10739 10740 10741 10742 10743 10744 10745 10746 10747 10748 10749 10750 10751 10752 10753 10754 10755 10756 10757 10758 10759 10760 10761 10762 10763 10764 10765 10766 10767 10768 10769 10770 10771 10772 10773 10774 10775 10776 10777 10778 10779 10780 10781 10782 10783 10784 10785 10786 10787 10788 10789 10790 10791 10792 10793 10794 10795 10796 10797 10798 10799 10800 10801 10802 10803 10804 10805 10806 10807 10808 10809 10810 10811 10812 10813 10814 10815 10816 10817 10818 10819 10820 10821 10822 10823 10824 10825 10826 10827 10828 10829 10830 10831 10832 10833 10834 10835 10836 10837 10838 10839 10840 10841 10842 10843 10844 10845 10846 10847 10848 10849 10850 10851 10852 10853 10854 10855 10856 10857 10858 10859 10860 10861 10862 10863 10864 10865 10866 10867 10868 10869 10870 10871 10872 10873 10874 10875 10876 10877 10878 10879 10880 10881 10882 10883 10884 10885 10886 10887 10888 10889 10890 10891 10892 10893 10894 10895 10896 10897 10898 10899 10900 10901 10902 10903 10904 10905 10906 10907 10908 10909 10910 10911 10912 10913 10914 10915 10916 10917 10918 10919 10920 10921 10922 10923 10924 10925 10926 10927 10928 10929 10930 10931 10932 10933 10934 10935 10936 10937 10938 10939 10940 10941 10942 10943 10944 10945 10946 10947 10948 10949 10950 10951 10952 10953 10954 10955 10956 10957 10958 10959 10960 10961 10962 10963 10964 10965 10966 10967 10968 10969 10970 10971 10972 10973 10974 10975 10976 10977 10978 10979 10980 10981 10982 10983 10984 10985 10986 10987 10988 10989 10990 10991 10992 10993 10994 10995 10996 10997 10998 10999 11000 11001 11002 11003 11004 11005 11006 11007 11008 11009 11010 11011 11012 11013 11014 11015 11016 11017 11018 11019 11020 11021 11022 11023 11024 11025 11026 11027 11028 11029 11030 11031 11032 11033 11034 11035 11036 11037 11038 11039 11040 11041 11042 11043 11044 11045 11046 11047 11048 11049 11050 11051 11052 11053 11054 11055 11056 11057 11058 11059 11060 11061 11062 11063 11064 11065 11066 11067 11068 11069 11070 11071 11072 11073 11074 11075 11076 11077 11078 11079 11080 11081 11082 11083 11084 11085 11086 11087 11088 11089 11090 11091 11092 11093 11094 11095 11096 11097 11098 11099 11100 11101 11102 11103 11104 11105 11106 11107 11108 11109 11110 11111 11112 11113 11114 11115 11116 11117 11118 11119 11120 11121 11122 11123 11124 11125 11126 11127 11128 11129 11130 11131 11132 11133 11134 11135 11136 11137 11138 11139 11140 11141 11142 11143 11144 11145 11146 11147 11148 11149 11150 11151 11152 11153 11154 11155 11156 11157 11158 11159 11160 11161 11162 11163 11164 11165 11166 11167 11168 11169 11170 11171 11172 11173 11174 11175 11176 11177 11178 11179 11180 11181 11182 11183 11184 11185 11186 11187 11188 11189 11190 11191 11192 11193 11194 11195 11196 11197 11198 11199 11200 11201 11202 11203 11204 11205 11206 11207 11208 11209 11210 11211 11212 11213 11214 11215 11216 11217 11218 11219 11220 11221 11222 11223 11224 11225 11226 11227 11228 11229 11230 11231 11232 11233 11234 11235 11236 11237 11238 11239 11240 11241 11242 11243 11244 11245 11246 11247 11248 11249 11250 11251 11252 11253 11254 11255 11256 11257 11258 11259 11260 11261 11262 11263 11264 11265 11266 11267 11268 11269 11270 11271 11272 11273 11274 11275 11276 11277 11278 11279 11280 11281 11282 11283 11284 11285 11286 11287 11288 11289 11290 11291 11292 11293 11294 11295 11296 11297 11298 11299 11300 11301 11302 11303 11304 11305 11306 11307 11308 11309 11310 11311 11312 11313 11314 11315 11316 11317 11318 11319 11320 11321 11322 11323 11324 11325 11326 11327 11328 11329 11330 11331 11332 11333 11334 11335 11336 11337 11338 11339 11340 11341 11342 11343 11344 11345 11346 11347 11348 11349 11350 11351 11352 11353 11354 11355 11356 11357 11358 11359 11360 11361 11362 11363 11364 11365 11366 11367 11368 11369 11370 11371 11372 11373 11374 11375 11376 11377 11378 11379 11380 11381 11382 11383 11384 11385 11386 11387 11388 11389 11390 11391 11392 11393 11394 11395 11396 11397 11398 11399 11400 11401 11402 11403 11404 11405 11406 11407 11408 11409 11410 11411 11412 11413 11414 11415 11416 11417 11418 11419 11420 11421 11422 11423 11424 11425 11426 11427 11428 11429 11430 11431 11432 11433 11434 11435 11436 11437 11438 11439 11440 11441 11442 11443 11444 11445 11446 11447 11448 11449 11450 11451 11452 11453 11454 11455 11456 11457 11458 11459 11460 11461 11462 11463 11464 11465 11466 11467 11468 11469 11470 11471 11472 11473 11474 11475 11476 11477 11478 11479 11480 11481 11482 11483 11484 11485 11486 11487 11488 11489 11490 11491 11492 11493 11494 11495 11496 11497 11498 11499 11500 11501 11502 11503 11504 11505 11506 11507 11508 11509 11510 11511 11512 11513 11514 11515 11516 11517 11518 11519 11520 11521 11522 11523 11524 11525 11526 11527 11528 11529 11530 11531 11532 11533 11534 11535 11536 11537 11538 11539 11540 11541 11542 11543 11544 11545 11546 11547 11548 11549 11550 11551 11552 11553 11554 11555 11556 11557 11558 11559 11560 11561 11562 11563 11564 11565 11566 11567 11568 11569 11570 11571 11572 11573 11574 11575 11576 11577 11578 11579 11580 11581 11582 11583 11584 11585 11586 11587 11588 11589 11590 11591 11592 11593 11594 11595 11596 11597 11598 11599 11600 11601 11602 11603 11604 11605 11606 11607 11608 11609 11610 11611 11612 11613 11614 11615 11616 11617 11618 11619 11620 11621 11622 11623 11624 11625 11626 11627 11628 11629 11630 11631 11632 11633 11634 11635 11636 11637 11638 11639 11640 11641 11642 11643 11644 11645 11646 11647 11648 11649 11650 11651 11652 11653 11654 11655 11656 11657 11658 11659 11660 11661 11662 11663 11664 11665 11666 11667 11668 11669 11670 11671 11672 11673 11674 11675 11676 11677 11678 11679 11680 11681 11682 11683 11684 11685 11686 11687 11688 11689 11690 11691 11692 11693 11694 11695 11696 11697 11698 11699 11700 11701 11702 11703 11704 11705 11706 11707 11708 11709 11710 11711 11712 11713 11714 11715 11716 11717 11718 11719 11720 11721 11722 11723 11724 11725 11726 11727 11728 11729 11730 11731 11732 11733 11734 11735 11736 11737 11738 11739 11740 11741 11742 11743 11744 11745 11746 11747 11748 11749 11750 11751 11752 11753 11754 11755 11756 11757 11758 11759 11760 11761 11762 11763 11764 11765 11766 11767 11768 11769 11770 11771 11772 11773 11774 11775 11776 11777 11778 11779 11780 11781 11782 11783 11784 11785 11786 11787 11788 11789 11790 11791 11792 11793 11794 11795 11796 11797 11798 11799 11800 11801 11802 11803 11804 11805 11806 11807 11808 11809 11810 11811 11812 11813 11814 11815 11816 11817 11818 11819 11820 11821 11822 11823 11824 11825 11826 11827 11828 11829 11830 11831 11832 11833 11834 11835 11836 11837 11838 11839 11840 11841 11842 11843 11844 11845 11846 11847 11848 11849 11850 11851 11852 11853 11854 11855 11856 11857 11858 11859 11860 11861 11862 11863 11864 11865 11866 11867 11868 11869 11870 11871 11872 11873 11874 11875 11876 11877 11878 11879 11880 11881 11882 11883 11884 11885 11886 11887 11888 11889 11890 11891 11892 11893 11894 11895 11896 11897 11898 11899 11900 11901 11902 11903 11904 11905 11906 11907 11908 11909 11910 11911 11912 11913 11914 11915 11916 11917 11918 11919 11920 11921 11922 11923 11924 11925 11926 11927 11928 11929 11930 11931 11932 11933 11934 11935 11936 11937 11938 11939 11940 11941 11942 11943 11944 11945 11946 11947 11948 11949 11950 11951 11952 11953 11954 11955 11956 11957 11958 11959 11960 11961 11962 11963 11964 11965 11966 11967 11968 11969 11970 11971 11972 11973 11974 11975 11976 11977 11978 11979 11980 11981 11982 11983 11984 11985 11986 11987 11988 11989 11990 11991 11992 11993 11994 11995 11996 11997 11998 11999 12000 12001 12002 12003 12004 12005 12006 12007 12008 12009 12010 12011 12012 12013 12014 12015 12016 12017 12018 12019 12020 12021 12022 12023 12024 12025 12026 12027 12028 12029 12030 12031 12032 12033 12034 12035 12036 12037 12038 12039 12040 12041 12042 12043 12044 12045 12046 12047 12048 12049 12050 12051 12052 12053 12054 12055 12056 12057 12058 12059 12060 12061 12062 12063 12064 12065 12066 12067 12068 12069 12070 12071 12072 12073 12074 12075 12076 12077 12078 12079 12080 12081 12082 12083 12084 12085 12086 12087 12088 12089 12090 12091 12092 12093 12094 12095 12096 12097 12098 12099 12100 12101 12102 12103 12104 12105 12106 12107 12108 12109 12110 12111 12112 12113 12114 12115 12116 12117 12118 12119 12120 12121 12122 12123 12124 12125 12126 12127 12128 12129 12130 12131 12132 12133 12134 12135 12136 12137 12138 12139 12140 12141 12142 12143 12144 12145 12146 12147 12148 12149 12150 12151 12152 12153 12154 12155 12156 12157 12158 12159 12160 12161 12162 12163 12164 12165 12166 12167 12168 12169 12170 12171 12172 12173 12174 12175 12176 12177 12178 12179 12180 12181 12182 12183 12184 12185 12186 12187 12188 12189 12190 12191 12192 12193 12194 12195 12196 12197 12198 12199 12200 12201 12202 12203 12204 12205 12206 12207 12208 12209 12210 12211 12212 12213 12214 12215 12216 12217 12218 12219 12220 12221 12222 12223 12224 12225 12226 12227 12228 12229 12230 12231 12232 12233 12234 12235 12236 12237 12238 12239 12240 12241 12242 12243 12244 12245 12246 12247 12248 12249 12250 12251 12252 12253 12254 12255 12256 12257 12258 12259 12260 12261 12262 12263 12264 12265 12266 12267 12268 12269 12270 12271 12272 12273 12274 12275 12276 12277 12278 12279 12280 12281 12282 12283 12284 12285 12286 12287 12288 12289 12290 12291 12292 12293 12294 12295 12296 12297 12298 12299 12300 12301 12302 12303 12304 12305 12306 12307 12308 12309 12310 12311 12312 12313 12314 12315 12316 12317 12318 12319 12320 12321 12322 12323 12324 12325 12326 12327 12328 12329 12330 12331 12332 12333 12334 12335 12336 12337 12338 12339 12340 12341 12342 12343 12344 12345 12346 12347 12348 12349 12350 12351 12352 12353 12354 12355 12356 12357 12358 12359 12360 12361 12362 12363 12364 12365 12366 12367 12368 12369 12370 12371 12372 12373 12374 12375 12376 12377 12378 12379 12380 12381 12382 12383 12384 12385 12386 12387 12388 12389 12390 12391 12392 12393 12394 12395 12396 12397 12398 12399 12400 12401 12402 12403 12404 12405 12406 12407 12408 12409 12410 12411 12412 12413 12414 12415 12416 12417 12418 12419 12420 12421 12422 12423 12424 12425 12426 12427 12428 12429 12430 12431 12432 12433 12434 12435 12436 12437 12438 12439 12440 12441 12442 12443 12444 12445 12446 12447 12448 12449 12450 12451 12452 12453 12454 12455 12456 12457 12458 12459 12460 12461 12462 12463 12464 12465 12466 12467 12468 12469 12470 12471 12472 12473 12474 12475 12476 12477 12478 12479 12480 12481 12482 12483 12484 12485 12486 12487 12488 12489 12490 12491 12492 12493 12494 12495 12496 12497 12498 12499 12500 12501 12502 12503 12504 12505 12506 12507 12508 12509 12510 12511 12512 12513 12514 12515 12516 12517 12518 12519 12520 12521 12522 12523 12524 12525 12526 12527 12528 12529 12530 12531 12532 12533 12534 12535 12536 12537 12538 12539 12540 12541 12542 12543 12544 12545 12546 12547 12548 12549 12550 12551 12552 12553 12554 12555 12556 12557 12558 12559 12560 12561 12562 12563 12564 12565 12566 12567 12568 12569 12570 12571 12572 12573 12574 12575 12576 12577 12578 12579 12580 12581 12582 12583 12584 12585 12586 12587 12588 12589 12590 12591 12592 12593 12594 12595 12596 12597 12598 12599 12600 12601 12602 12603 12604 12605 12606 12607 12608 12609 12610 12611 12612 12613 12614 12615 12616 12617 12618 12619 12620 12621 12622 12623 12624 12625 12626 12627 12628 12629 12630 12631 12632 12633 12634 12635 12636 12637 12638 12639 12640 12641 12642 12643 12644 12645 12646 12647 12648 12649 12650 12651 12652 12653 12654 12655 12656 12657 12658 12659 12660 12661 12662 12663 12664 12665 12666 12667 12668 12669 12670 12671 12672 12673 12674 12675 12676 12677 12678 12679 12680 12681 12682 12683 12684 12685 12686 12687 12688 12689 12690 12691 12692 12693 12694 12695 12696 12697 12698 12699 12700 12701 12702 12703 12704 12705 12706 12707 12708 12709 12710 12711 12712 12713 12714 12715 12716 12717 12718 12719 12720 12721 12722 12723 12724 12725 12726 12727 12728 12729 12730 12731 12732 12733 12734 12735 12736 12737 12738 12739 12740 12741 12742 12743 12744 12745 12746 12747 12748 12749 12750 12751 12752 12753 12754 12755 12756 12757 12758 12759 12760 12761 12762 12763 12764 12765 12766 12767 12768 12769 12770 12771 12772 12773 12774 12775 12776 12777 12778 12779 12780 12781 12782 12783 12784 12785 12786 12787 12788 12789 12790 12791 12792 12793 12794 12795 12796 12797 12798 12799 12800 12801 12802 12803 12804 12805 12806 12807 12808 12809 12810 12811 12812 12813 12814 12815 12816 12817 12818 12819 12820 12821 12822 12823 12824 12825 12826 12827 12828 12829 12830 12831 12832 12833 12834 12835 12836 12837 12838 12839 12840 12841 12842 12843 12844 12845 12846 12847 12848 12849 12850 12851 12852 12853 12854 12855 12856 12857 12858 12859 12860 12861 12862 12863 12864 12865 12866 12867 12868 12869 12870 12871 12872 12873 12874 12875 12876 12877 12878 12879 12880 12881 12882 12883 12884 12885 12886 12887 12888 12889 12890 12891 12892 12893 12894 12895 12896 12897 12898 12899 12900 12901 12902 12903 12904 12905 12906 12907 12908 12909 12910 12911 12912 12913 12914 12915 12916 12917 12918 12919 12920 12921 12922 12923 12924 12925 12926 12927 12928 12929 12930 12931 12932 12933 12934 12935 12936 12937 12938 12939 12940 12941 12942 12943 12944 12945 12946 12947 12948 12949 12950 12951 12952 12953 12954 12955 12956 12957 12958 12959 12960 12961 12962 12963 12964 12965 12966 12967 12968 12969 12970 12971 12972 12973 12974 12975 12976 12977 12978 12979 12980 12981 12982 12983 12984 12985 12986 12987 12988 12989 12990 12991 12992 12993 12994 12995 12996 12997 12998 12999 13000 13001 13002 13003 13004 13005 13006 13007 13008 13009 13010 13011 13012 13013 13014 13015 13016 13017 13018 13019 13020 13021 13022 13023 13024 13025 13026 13027 13028 13029 13030 13031 13032 13033 13034 13035 13036 13037 13038 13039 13040 13041 13042 13043 13044 13045 13046 13047 13048 13049 13050 13051 13052 13053 13054 13055 13056 13057 13058 13059 13060 13061 13062 13063 13064 13065 13066 13067 13068 13069 13070 13071 13072 13073 13074 13075 13076 13077 13078 13079 13080 13081 13082 13083 13084 13085 13086 13087 13088 13089 13090 13091 13092 13093 13094 13095 13096 13097 13098 13099 13100 13101 13102 13103 13104 13105 13106 13107 13108 13109 13110 13111 13112 13113 13114 13115 13116 13117 13118 13119 13120 13121 13122 13123 13124 13125 13126 13127 13128 13129 13130 13131 13132 13133 13134 13135 13136 13137 13138 13139 13140 13141 13142 13143 13144 13145 13146 13147 13148 13149 13150 13151 13152 13153 13154 13155 13156 13157 13158 13159 13160 13161 13162 13163 13164 13165 13166 13167 13168 13169 13170 13171 13172 13173 13174 13175 13176 13177 13178 13179 13180 13181 13182 13183 13184 13185 13186 13187 13188 13189 13190 13191 13192 13193 13194 13195 13196 13197 13198 13199 13200 13201 13202 13203 13204 13205 13206 13207 13208 13209 13210 13211 13212 13213 13214 13215 13216 13217 13218 13219 13220 13221 13222 13223 13224 13225 13226 13227 13228 13229 13230 13231 13232 13233 13234 13235 13236 13237 13238 13239 13240 13241 13242 13243 13244 13245 13246 13247 13248 13249 13250 13251 13252 13253 13254 13255 13256 13257 13258 13259 13260 13261 13262 13263 13264 13265 13266 13267 13268 13269 13270 13271 13272 13273 13274 13275 13276 13277 13278 13279 13280 13281 13282 13283 13284 13285 13286 13287 13288 13289 13290 13291 13292 13293 13294 13295 13296 13297 13298 13299 13300 13301 13302 13303 13304 13305 13306 13307 13308 13309 13310 13311 13312 13313 13314 13315 13316 13317 13318 13319 13320 13321 13322 13323 13324 13325 13326 13327 13328 13329 13330 13331 13332 13333 13334 13335 13336 13337 13338 13339 13340 13341 13342 13343 13344 13345 13346 13347 13348 13349 13350 13351 13352 13353 13354 13355 13356 13357 13358 13359 13360 13361 13362 13363 13364 13365 13366 13367 13368 13369 13370 13371 13372 13373 13374 13375 13376 13377 13378 13379 13380 13381 13382 13383 13384 13385 13386 13387 13388 13389 13390 13391 13392 13393 13394 13395 13396 13397 13398 13399 13400 13401 13402 13403 13404 13405 13406 13407 13408 13409 13410 13411 13412 13413 13414 13415 13416 13417 13418 13419 13420 13421 13422 13423 13424 13425 13426 13427 13428 13429 13430 13431 13432 13433 13434 13435 13436 13437 13438 13439 13440 13441 13442 13443 13444 13445 13446 13447 13448 13449 13450 13451 13452 13453 13454 13455 13456 13457 13458 13459 13460 13461 13462 13463 13464 13465 13466 13467 13468 13469 13470 13471 13472 13473 13474 13475 13476 13477 13478 13479 13480 13481 13482 13483 13484 13485 13486 13487 13488 13489 13490 13491 13492 13493 13494 13495 13496 13497 13498 13499 13500 13501 13502 13503 13504 13505 13506 13507 13508 13509 13510 13511 13512 13513 13514 13515 13516 13517 13518 13519 13520 13521 13522 13523 13524 13525 13526 13527 13528 13529 13530 13531 13532 13533 13534 13535 13536 13537 13538 13539 13540 13541 13542 13543 13544 13545 13546 13547 13548 13549 13550 13551 13552 13553 13554 13555 13556 13557 13558 13559 13560 13561 13562 13563 13564 13565 13566 13567 13568 13569 13570 13571 13572 13573 13574 13575 13576 13577 13578 13579 13580 13581 13582 13583 13584 13585 13586 13587 13588 13589 13590 13591 13592 13593 13594 13595 13596 13597 13598 13599 13600 13601 13602 13603 13604 13605 13606 13607 13608 13609 13610 13611 13612 13613 13614 13615 13616 13617 13618 13619 13620 13621 13622 13623 13624 13625 13626 13627 13628 13629 13630 13631 13632 13633 13634 13635 13636 13637 13638 13639 13640 13641 13642 13643 13644 13645 13646 13647 13648 13649 13650 13651 13652 13653 13654 13655 13656 13657 13658 13659 13660 13661 13662 13663 13664 13665 13666 13667 13668 13669 13670 13671 13672 13673 13674 13675 13676 13677 13678 13679 13680 13681 13682 13683 13684 13685 13686 13687 13688 13689 13690 13691 13692 13693 13694 13695 13696 13697 13698 13699 13700 13701 13702 13703 13704 13705 13706 13707 13708 13709 13710 13711 13712 13713 13714 13715 13716 13717 13718 13719 13720 13721 13722 13723 13724 13725 13726 13727 13728 13729 13730 13731 13732 13733 13734 13735 13736 13737 13738 13739 13740 13741 13742 13743 13744 13745 13746 13747 13748 13749 13750 13751 13752 13753 13754 13755 13756 13757 13758 13759 13760 13761 13762 13763 13764 13765 13766 13767 13768 13769 13770 13771 13772 13773 13774 13775 13776 13777 13778 13779 13780 13781 13782 13783 13784 13785 13786 13787 13788 13789 13790 13791 13792 13793 13794 13795 13796 13797 13798 13799 13800 13801 13802 13803 13804 13805 13806 13807 13808 13809 13810 13811 13812 13813 13814 13815 13816 13817 13818 13819 13820 13821 13822 13823 13824 13825 13826 13827 13828 13829 13830 13831 13832 13833 13834 13835 13836 13837 13838 13839 13840 13841 13842 13843 13844 13845 13846 13847 13848 13849 13850 13851 13852 13853 13854 13855 13856 13857 13858 13859 13860 13861 13862 13863 13864 13865 13866 13867 13868 13869 13870 13871 13872 13873 13874 13875 13876 13877 13878 13879 13880 13881 13882 13883 13884 13885 13886 13887 13888 13889 13890 13891 13892 13893 13894 13895 13896 13897 13898 13899 13900 13901 13902 13903 13904 13905 13906 13907 13908 13909 13910 13911 13912 13913 13914 13915 13916 13917 13918 13919 13920 13921 13922 13923 13924 13925 13926 13927 13928 13929 13930 13931 13932 13933 13934 13935 13936 13937 13938 13939 13940 13941 13942 13943 13944 13945 13946 13947 13948 13949 13950 13951 13952 13953 13954 13955 13956 13957 13958 13959 13960 13961 13962 13963 13964 13965 13966 13967 13968 13969 13970 13971 13972 13973 13974 13975 13976 13977 13978 13979 13980 13981 13982 13983 13984 13985 13986 13987 13988 13989 13990 13991 13992 13993 13994 13995 13996 13997 13998 13999 14000 14001 14002 14003 14004 14005 14006 14007 14008 14009 14010 14011 14012 14013 14014 14015 14016 14017 14018 14019 14020 14021 14022 14023 14024 14025 14026 14027 14028 14029 14030 14031 14032 14033 14034 14035 14036 14037 14038 14039 14040 14041 14042 14043 14044 14045 14046 14047 14048 14049 14050 14051 14052 14053 14054 14055 14056 14057 14058 14059 14060 14061 14062 14063 14064 14065 14066 14067 14068 14069 14070 14071 14072 14073 14074 14075 14076 14077 14078 14079 14080 14081 14082 14083 14084 14085 14086 14087 14088 14089 14090 14091 14092 14093 14094 14095 14096 14097 14098 14099 14100 14101 14102 14103 14104 14105 14106 14107 14108 14109 14110 14111 14112 14113 14114 14115 14116 14117 14118 14119 14120 14121 14122 14123 14124 14125 14126 14127 14128 14129 14130 14131 14132 14133 14134 14135 14136 14137 14138 14139 14140 14141 14142 14143 14144 14145 14146 14147 14148 14149 14150 14151 14152 14153 14154 14155 14156 14157 14158 14159 14160 14161 14162 14163 14164 14165 14166 14167 14168 14169 14170 14171 14172 14173 14174 14175 14176 14177 14178 14179 14180 14181 14182 14183 14184 14185 14186 14187 14188 14189 14190 14191 14192 14193 14194 14195 14196 14197 14198 14199 14200 14201 14202 14203 14204 14205 14206 14207 14208 14209 14210 14211 14212 14213 14214 14215 14216 14217 14218 14219 14220 14221 14222 14223 14224 14225 14226 14227 14228 14229 14230 14231 14232 14233 14234 14235 14236 14237 14238 14239 14240 14241 14242 14243 14244 14245 14246 14247 14248 14249 14250 14251 14252 14253 14254 14255 14256 14257 14258 14259 14260 14261 14262 14263 14264 14265 14266 14267 14268 14269 14270 14271 14272 14273 14274 14275 14276 14277 14278 14279 14280 14281 14282 14283 14284 14285 14286 14287 14288 14289 14290 14291 14292 14293 14294 14295 14296 14297 14298 14299 14300 14301 14302 14303 14304 14305 14306 14307 14308 14309 14310 14311 14312 14313 14314 14315 14316 14317 14318 14319 14320 14321 14322 14323 14324 14325 14326 14327 14328 14329 14330 14331 14332 14333 14334 14335 14336 14337 14338 14339 14340 14341 14342 14343 14344 14345 14346 14347 14348 14349 14350 14351 14352 14353 14354 14355 14356 14357 14358 14359 14360 14361 14362 14363 14364 14365 14366 14367 14368 14369 14370 14371 14372 14373 14374 14375 14376 14377 14378 14379 14380 14381 14382 14383 14384 14385 14386 14387 14388 14389 14390 14391 14392 14393 14394 14395 14396 14397 14398 14399 14400 14401 14402 14403 14404 14405 14406 14407 14408 14409 14410 14411 14412 14413 14414 14415 14416 14417 14418 14419 14420 14421 14422 14423 14424 14425 14426 14427 14428 14429 14430 14431 14432 14433 14434 14435 14436 14437 14438 14439 14440 14441 14442 14443 14444 14445 14446 14447 14448 14449 14450 14451 14452 14453 14454 14455 14456 14457 14458 14459 14460 14461 14462 14463 14464 14465 14466 14467 14468 14469 14470 14471 14472 14473 14474 14475 14476 14477 14478 14479 14480 14481 14482 14483 14484 14485 14486 14487 14488 14489 14490 14491 14492 14493 14494 14495 14496 14497 14498 14499 14500 14501 14502 14503 14504 14505 14506 14507 14508 14509 14510 14511 14512 14513 14514 14515 14516 14517 14518 14519 14520 14521 14522 14523 14524 14525 14526 14527 14528 14529 14530 14531 14532 14533 14534 14535 14536 14537 14538 14539 14540 14541 14542 14543 14544 14545 14546 14547 14548 14549 14550 14551 14552 14553 14554 14555 14556 14557 14558 14559 14560 14561 14562 14563 14564 14565 14566 14567 14568 14569 14570 14571 14572 14573 14574 14575 14576 14577 14578 14579 14580 14581 14582 14583 14584 14585 14586 14587 14588 14589 14590 14591 14592 14593 14594 14595 14596 14597 14598 14599 14600 14601 14602 14603 14604 14605 14606 14607 14608 14609 14610 14611 14612 14613 14614 14615 14616 14617 14618 14619 14620 14621 14622 14623 14624 14625 14626 14627 14628 14629 14630 14631 14632 14633 14634 14635 14636 14637 14638 14639 14640 14641 14642 14643 14644 14645 14646 14647 14648 14649 14650 14651 14652 14653 14654 14655 14656 14657 14658 14659 14660 14661 14662 14663 14664 14665 14666 14667 14668 14669 14670 14671 14672 14673 14674 14675 14676 14677 14678 14679 14680 14681 14682 14683 14684 14685 14686 14687 14688 14689 14690 14691 14692 14693 14694 14695 14696 14697 14698 14699 14700 14701 14702 14703 14704 14705 14706 14707 14708 14709 14710 14711 14712 14713 14714 14715 14716 14717 14718 14719 14720 14721 14722 14723 14724 14725 14726 14727 14728 14729 14730 14731 14732 14733 14734 14735 14736 14737 14738 14739 14740 14741 14742 14743 14744 14745 14746 14747 14748 14749 14750 14751 14752 14753 14754 14755 14756 14757 14758 14759 14760 14761 14762 14763 14764 14765 14766 14767 14768 14769 14770 14771 14772 14773 14774 14775 14776 14777 14778 14779 14780 14781 14782 14783 14784 14785 14786 14787 14788 14789 14790 14791 14792 14793 14794 14795 14796 14797 14798 14799 14800 14801 14802 14803 14804 14805 14806 14807 14808 14809 14810 14811 14812 14813 14814 14815 14816 14817 14818 14819 14820 14821 14822 14823 14824 14825 14826 14827 14828 14829 14830 14831 14832 14833 14834 14835 14836 14837 14838 14839 14840 14841 14842 14843 14844 14845 14846 14847 14848 14849 14850 14851 14852 14853 14854 14855 14856 14857 14858 14859 14860 14861 14862 14863 14864 14865 14866 14867 14868 14869 14870 14871 14872 14873 14874 14875 14876 14877 14878 14879 14880 14881 14882 14883 14884 14885 14886 14887 14888 14889 14890 14891 14892 14893 14894 14895 14896 14897 14898 14899 14900 14901 14902 14903 14904 14905 14906 14907 14908 14909 14910 14911 14912 14913 14914 14915 14916 14917 14918 14919 14920 14921 14922 14923 14924 14925 14926 14927 14928 14929 14930 14931 14932 14933 14934 14935 14936 14937 14938 14939 14940 14941 14942 14943 14944 14945 14946 14947 14948 14949 14950 14951 14952 14953 14954 14955 14956 14957 14958 14959 14960 14961 14962 14963 14964 14965 14966 14967 14968 14969 14970 14971 14972 14973 14974 14975 14976 14977 14978 14979 14980 14981 14982 14983 14984 14985 14986 14987 14988 14989 14990 14991 14992 14993 14994 14995 14996 14997 14998 14999 15000 15001 15002 15003 15004 15005 15006 15007 15008 15009 15010 15011 15012 15013 15014 15015 15016 15017 15018 15019 15020 15021 15022 15023 15024 15025 15026 15027 15028 15029 15030 15031 15032 15033 15034 15035 15036 15037 15038 15039 15040 15041 15042 15043 15044 15045 15046 15047 15048 15049 15050 15051 15052 15053 15054 15055 15056 15057 15058 15059 15060 15061 15062 15063 15064 15065 15066 15067 15068 15069 15070 15071 15072 15073 15074 15075 15076 15077 15078 15079 15080 15081 15082 15083 15084 15085 15086 15087 15088 15089 15090 15091 15092 15093 15094 15095 15096 15097 15098 15099 15100 15101 15102 15103 15104 15105 15106 15107 15108 15109 15110 15111 15112 15113 15114 15115 15116 15117 15118 15119 15120 15121 15122 15123 15124 15125 15126 15127 15128 15129 15130 15131 15132 15133 15134 15135 15136 15137 15138 15139 15140 15141 15142 15143 15144 15145 15146 15147 15148 15149 15150 15151 15152 15153 15154 15155 15156 15157 15158 15159 15160 15161 15162 15163 15164 15165 15166 15167 15168 15169 15170 15171 15172 15173 15174 15175 15176 15177 15178 15179 15180 15181 15182 15183 15184 15185 15186 15187 15188 15189 15190 15191 15192 15193 15194 15195 15196 15197 15198 15199 15200 15201 15202 15203 15204 15205 15206 15207 15208 15209 15210 15211 15212 15213 15214 15215 15216 15217 15218 15219 15220 15221 15222 15223 15224 15225 15226 15227 15228 15229 15230 15231 15232 15233 15234 15235 15236 15237 15238 15239 15240 15241 15242 15243 15244 15245 15246 15247 15248 15249 15250 15251 15252 15253 15254 15255 15256 15257 15258 15259 15260 15261 15262 15263 15264 15265 15266 15267 15268 15269 15270 15271 15272 15273 15274 15275 15276 15277 15278 15279 15280 15281 15282 15283 15284 15285 15286 15287 15288 15289 15290 15291 15292 15293 15294 15295 15296 15297 15298 15299 15300 15301 15302 15303 15304 15305 15306 15307 15308 15309 15310 15311 15312 15313 15314 15315 15316 15317 15318 15319 15320 15321 15322 15323 15324 15325 15326 15327 15328 15329 15330 15331 15332 15333 15334 15335 15336 15337 15338 15339 15340 15341 15342 15343 15344 15345 15346 15347 15348 15349 15350 15351 15352 15353 15354 15355 15356 15357 15358 15359 15360 15361 15362 15363 15364 15365 15366 15367 15368 15369 15370 15371 15372 15373 15374 15375 15376 15377 15378 15379 15380 15381 15382 15383 15384 15385 15386 15387 15388 15389 15390 15391 15392 15393 15394 15395 15396 15397 15398 15399 15400 15401 15402 15403 15404 15405 15406 15407 15408 15409 15410 15411 15412 15413 15414 15415 15416 15417 15418 15419 15420 15421 15422 15423 15424 15425 15426 15427 15428 15429 15430 15431 15432 15433 15434 15435 15436 15437 15438 15439 15440 15441 15442 15443 15444 15445 15446 15447 15448 15449 15450 15451 15452 15453 15454 15455 15456 15457 15458 15459 15460 15461 15462 15463 15464 15465 15466 15467 15468 15469 15470 15471 15472 15473 15474 15475 15476 15477 15478 15479 15480 15481 15482 15483 15484 15485 15486 15487 15488 15489 15490 15491 15492 15493 15494 15495 15496 15497 15498 15499 15500 15501 15502 15503 15504 15505 15506 15507 15508 15509 15510 15511 15512 15513 15514 15515 15516 15517 15518 15519 15520 15521 15522 15523 15524 15525 15526 15527 15528 15529 15530 15531 15532 15533 15534 15535 15536 15537 15538 15539 15540 15541 15542 15543 15544 15545 15546 15547 15548 15549 15550 15551 15552 15553 15554 15555 15556 15557 15558 15559 15560 15561 15562 15563 15564 15565 15566 15567 15568 15569 15570 15571 15572 15573 15574 15575 15576 15577 15578 15579 15580 15581 15582 15583 15584 15585 15586 15587 15588 15589 15590 15591 15592 15593 15594 15595 15596 15597 15598 15599 15600 15601 15602 15603 15604 15605 15606 15607 15608 15609 15610 15611 15612 15613 15614 15615 15616 15617 15618 15619 15620 15621 15622 15623 15624 15625 15626 15627 15628 15629 15630 15631 15632 15633 15634 15635 15636 15637 15638 15639 15640 15641 15642 15643 15644 15645 15646 15647 15648 15649 15650 15651 15652 15653 15654 15655 15656 15657 15658 15659 15660 15661 15662 15663 15664 15665 15666 15667 15668 15669 15670 15671 15672 15673 15674 15675 15676 15677 15678 15679 15680 15681 15682 15683 15684 15685 15686 15687 15688 15689 15690 15691 15692 15693 15694 15695 15696 15697 15698 15699 15700 15701 15702 15703 15704 15705 15706 15707 15708 15709 15710 15711 15712 15713 15714 15715 15716 15717 15718 15719 15720 15721 15722 15723 15724 15725 15726 15727 15728 15729 15730 15731 15732 15733 15734 15735 15736 15737 15738 15739 15740 15741 15742 15743 15744 15745 15746 15747 15748 15749 15750 15751 15752 15753 15754 15755 15756 15757 15758 15759 15760 15761 15762 15763 15764 15765 15766 15767 15768 15769 15770 15771 15772 15773 15774 15775 15776 15777 15778 15779 15780 15781 15782 15783 15784 15785 15786 15787 15788 15789 15790 15791 15792 15793 15794 15795 15796 15797 15798 15799 15800 15801 15802 15803 15804 15805 15806 15807 15808 15809 15810 15811 15812 15813 15814 15815 15816 15817 15818 15819 15820 15821 15822 15823 15824 15825 15826 15827 15828 15829 15830 15831 15832 15833 15834 15835 15836 15837 15838 15839 15840 15841 15842 15843 15844 15845 15846 15847 15848 15849 15850 15851 15852 15853 15854 15855 15856 15857 15858 15859 15860 15861 15862 15863 15864 15865 15866 15867 15868 15869 15870 15871 15872 15873 15874 15875 15876 15877 15878 15879 15880 15881 15882 15883 15884 15885 15886 15887 15888 15889 15890 15891 15892 15893 15894 15895 15896 15897 15898 15899 15900 15901 15902 15903 15904 15905 15906 15907 15908 15909 15910 15911 15912 15913 15914 15915 15916 15917 15918 15919 15920 15921 15922 15923 15924 15925 15926 15927 15928 15929 15930 15931 15932 15933 15934 15935 15936 15937 15938 15939 15940 15941 15942 15943 15944 15945 15946 15947 15948 15949 15950 15951 15952 15953 15954 15955 15956 15957 15958 15959 15960 15961 15962 15963 15964 15965 15966 15967 15968 15969 15970 15971 15972 15973 15974 15975 15976 15977 15978 15979 15980 15981 15982 15983 15984 15985 15986 15987 15988 15989 15990 15991 15992 15993 15994 15995 15996 15997 15998 15999 16000 16001 16002 16003 16004 16005 16006 16007 16008 16009 16010 16011 16012 16013 16014 16015 16016 16017 16018 16019 16020 16021 16022 16023 16024 16025 16026 16027 16028 16029 16030 16031 16032 16033 16034 16035 16036 16037 16038 16039 16040 16041 16042 16043 16044 16045 16046 16047 16048 16049 16050 16051 16052 16053 16054 16055 16056 16057 16058 16059 16060 16061 16062 16063 16064 16065 16066 16067 16068 16069 16070 16071 16072 16073 16074 16075 16076 16077 16078 16079 16080 16081 16082 16083 16084 16085 16086 16087 16088 16089 16090 16091 16092 16093 16094 16095 16096 16097 16098 16099 16100 16101 16102 16103 16104 16105 16106 16107 16108 16109 16110 16111 16112 16113 16114 16115 16116 16117 16118 16119 16120 16121 16122 16123 16124 16125 16126 16127 16128 16129 16130 16131 16132 16133 16134 16135 16136 16137 16138 16139 16140 16141 16142 16143 16144 16145 16146 16147 16148 16149 16150 16151 16152 16153 16154 16155 16156 16157 16158 16159 16160 16161 16162 16163 16164 16165 16166 16167 16168 16169 16170 16171 16172 16173 16174 16175 16176 16177 16178 16179 16180 16181 16182 16183 16184 16185 16186 16187 16188 16189 16190 16191 16192 16193 16194 16195 16196 16197 16198 16199 16200 16201 16202 16203 16204 16205 16206 16207 16208 16209 16210 16211 16212 16213 16214 16215 16216 16217 16218 16219 16220 16221 16222 16223 16224 16225 16226 16227 16228 16229 16230 16231 16232 16233 16234 16235 16236 16237 16238 16239 16240 16241 16242 16243 16244 16245 16246 16247 16248 16249 16250 16251 16252 16253 16254 16255 16256 16257 16258 16259 16260 16261 16262 16263 16264 16265 16266 16267 16268 16269 16270 16271 16272 16273 16274 16275 16276 16277 16278 16279 16280 16281 16282 16283 16284 16285 16286 16287 16288 16289 16290 16291 16292 16293 16294 16295 16296 16297 16298 16299 16300 16301 16302 16303 16304 16305 16306 16307 16308 16309 16310 16311 16312 16313 16314 16315 16316 16317 16318 16319 16320 16321 16322 16323 16324 16325 16326 16327 16328 16329 16330 16331 16332 16333 16334 16335 16336 16337 16338 16339 16340 16341 16342 16343 16344 16345 16346 16347 16348 16349 16350 16351 16352 16353 16354 16355 16356 16357 16358 16359 16360 16361 16362 16363 16364 16365 16366 16367 16368 16369 16370 16371 16372 16373 16374 16375 16376 16377 16378 16379 16380 16381 16382 16383" + + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_notes_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_notes_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2023" + Property: "Original|DateTime_GMT", "DateTime", "", "19/01/2023 16:36:20.363" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_notes_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2023" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "19/01/2023 16:36:20.363" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "notes", "KString", "U", "lambert1 notes:&lf;&lf;- material&lf;- "lambertian"&lf;- unicode: aß???&lf;- tab &lf;- cr &lf;" + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",0 + Property: "TimeSpanStop", "KTime", "",192442325000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 588000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_notes_6100_binary.fbx b/modules/ufbx/data/maya_notes_6100_binary.fbx new file mode 100644 index 0000000..ba22990 Binary files /dev/null and b/modules/ufbx/data/maya_notes_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_notes_7700_ascii.fbx b/modules/ufbx/data/maya_notes_7700_ascii.fbx new file mode 100644 index 0000000..d171c9e --- /dev/null +++ b/modules/ufbx/data/maya_notes_7700_ascii.fbx @@ -0,0 +1,415 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2023 + Month: 1 + Day: 19 + Hour: 18 + Minute: 26 + Second: 28 + Millisecond: 287 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_notes_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_notes_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "19/01/2023 16:26:28.285" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_notes_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "19/01/2023 16:26:28.285" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",192442325000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1222868886000, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1222860050400, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1222455584432, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + P: "notes", "KString", "", "U", "pCube1 notes:&lf;0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947 7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 8015 8016 8017 8018 8019 8020 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 8035 8036 8037 8038 8039 8040 8041 8042 8043 8044 8045 8046 8047 8048 8049 8050 8051 8052 8053 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 8171 8172 8173 8174 8175 8176 8177 8178 8179 8180 8181 8182 8183 8184 8185 8186 8187 8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212 8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308 8309 8310 8311 8312 8313 8314 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433 8434 8435 8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 8464 8465 8466 8467 8468 8469 8470 8471 8472 8473 8474 8475 8476 8477 8478 8479 8480 8481 8482 8483 8484 8485 8486 8487 8488 8489 8490 8491 8492 8493 8494 8495 8496 8497 8498 8499 8500 8501 8502 8503 8504 8505 8506 8507 8508 8509 8510 8511 8512 8513 8514 8515 8516 8517 8518 8519 8520 8521 8522 8523 8524 8525 8526 8527 8528 8529 8530 8531 8532 8533 8534 8535 8536 8537 8538 8539 8540 8541 8542 8543 8544 8545 8546 8547 8548 8549 8550 8551 8552 8553 8554 8555 8556 8557 8558 8559 8560 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574 8575 8576 8577 8578 8579 8580 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592 8593 8594 8595 8596 8597 8598 8599 8600 8601 8602 8603 8604 8605 8606 8607 8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 8618 8619 8620 8621 8622 8623 8624 8625 8626 8627 8628 8629 8630 8631 8632 8633 8634 8635 8636 8637 8638 8639 8640 8641 8642 8643 8644 8645 8646 8647 8648 8649 8650 8651 8652 8653 8654 8655 8656 8657 8658 8659 8660 8661 8662 8663 8664 8665 8666 8667 8668 8669 8670 8671 8672 8673 8674 8675 8676 8677 8678 8679 8680 8681 8682 8683 8684 8685 8686 8687 8688 8689 8690 8691 8692 8693 8694 8695 8696 8697 8698 8699 8700 8701 8702 8703 8704 8705 8706 8707 8708 8709 8710 8711 8712 8713 8714 8715 8716 8717 8718 8719 8720 8721 8722 8723 8724 8725 8726 8727 8728 8729 8730 8731 8732 8733 8734 8735 8736 8737 8738 8739 8740 8741 8742 8743 8744 8745 8746 8747 8748 8749 8750 8751 8752 8753 8754 8755 8756 8757 8758 8759 8760 8761 8762 8763 8764 8765 8766 8767 8768 8769 8770 8771 8772 8773 8774 8775 8776 8777 8778 8779 8780 8781 8782 8783 8784 8785 8786 8787 8788 8789 8790 8791 8792 8793 8794 8795 8796 8797 8798 8799 8800 8801 8802 8803 8804 8805 8806 8807 8808 8809 8810 8811 8812 8813 8814 8815 8816 8817 8818 8819 8820 8821 8822 8823 8824 8825 8826 8827 8828 8829 8830 8831 8832 8833 8834 8835 8836 8837 8838 8839 8840 8841 8842 8843 8844 8845 8846 8847 8848 8849 8850 8851 8852 8853 8854 8855 8856 8857 8858 8859 8860 8861 8862 8863 8864 8865 8866 8867 8868 8869 8870 8871 8872 8873 8874 8875 8876 8877 8878 8879 8880 8881 8882 8883 8884 8885 8886 8887 8888 8889 8890 8891 8892 8893 8894 8895 8896 8897 8898 8899 8900 8901 8902 8903 8904 8905 8906 8907 8908 8909 8910 8911 8912 8913 8914 8915 8916 8917 8918 8919 8920 8921 8922 8923 8924 8925 8926 8927 8928 8929 8930 8931 8932 8933 8934 8935 8936 8937 8938 8939 8940 8941 8942 8943 8944 8945 8946 8947 8948 8949 8950 8951 8952 8953 8954 8955 8956 8957 8958 8959 8960 8961 8962 8963 8964 8965 8966 8967 8968 8969 8970 8971 8972 8973 8974 8975 8976 8977 8978 8979 8980 8981 8982 8983 8984 8985 8986 8987 8988 8989 8990 8991 8992 8993 8994 8995 8996 8997 8998 8999 9000 9001 9002 9003 9004 9005 9006 9007 9008 9009 9010 9011 9012 9013 9014 9015 9016 9017 9018 9019 9020 9021 9022 9023 9024 9025 9026 9027 9028 9029 9030 9031 9032 9033 9034 9035 9036 9037 9038 9039 9040 9041 9042 9043 9044 9045 9046 9047 9048 9049 9050 9051 9052 9053 9054 9055 9056 9057 9058 9059 9060 9061 9062 9063 9064 9065 9066 9067 9068 9069 9070 9071 9072 9073 9074 9075 9076 9077 9078 9079 9080 9081 9082 9083 9084 9085 9086 9087 9088 9089 9090 9091 9092 9093 9094 9095 9096 9097 9098 9099 9100 9101 9102 9103 9104 9105 9106 9107 9108 9109 9110 9111 9112 9113 9114 9115 9116 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129 9130 9131 9132 9133 9134 9135 9136 9137 9138 9139 9140 9141 9142 9143 9144 9145 9146 9147 9148 9149 9150 9151 9152 9153 9154 9155 9156 9157 9158 9159 9160 9161 9162 9163 9164 9165 9166 9167 9168 9169 9170 9171 9172 9173 9174 9175 9176 9177 9178 9179 9180 9181 9182 9183 9184 9185 9186 9187 9188 9189 9190 9191 9192 9193 9194 9195 9196 9197 9198 9199 9200 9201 9202 9203 9204 9205 9206 9207 9208 9209 9210 9211 9212 9213 9214 9215 9216 9217 9218 9219 9220 9221 9222 9223 9224 9225 9226 9227 9228 9229 9230 9231 9232 9233 9234 9235 9236 9237 9238 9239 9240 9241 9242 9243 9244 9245 9246 9247 9248 9249 9250 9251 9252 9253 9254 9255 9256 9257 9258 9259 9260 9261 9262 9263 9264 9265 9266 9267 9268 9269 9270 9271 9272 9273 9274 9275 9276 9277 9278 9279 9280 9281 9282 9283 9284 9285 9286 9287 9288 9289 9290 9291 9292 9293 9294 9295 9296 9297 9298 9299 9300 9301 9302 9303 9304 9305 9306 9307 9308 9309 9310 9311 9312 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 9323 9324 9325 9326 9327 9328 9329 9330 9331 9332 9333 9334 9335 9336 9337 9338 9339 9340 9341 9342 9343 9344 9345 9346 9347 9348 9349 9350 9351 9352 9353 9354 9355 9356 9357 9358 9359 9360 9361 9362 9363 9364 9365 9366 9367 9368 9369 9370 9371 9372 9373 9374 9375 9376 9377 9378 9379 9380 9381 9382 9383 9384 9385 9386 9387 9388 9389 9390 9391 9392 9393 9394 9395 9396 9397 9398 9399 9400 9401 9402 9403 9404 9405 9406 9407 9408 9409 9410 9411 9412 9413 9414 9415 9416 9417 9418 9419 9420 9421 9422 9423 9424 9425 9426 9427 9428 9429 9430 9431 9432 9433 9434 9435 9436 9437 9438 9439 9440 9441 9442 9443 9444 9445 9446 9447 9448 9449 9450 9451 9452 9453 9454 9455 9456 9457 9458 9459 9460 9461 9462 9463 9464 9465 9466 9467 9468 9469 9470 9471 9472 9473 9474 9475 9476 9477 9478 9479 9480 9481 9482 9483 9484 9485 9486 9487 9488 9489 9490 9491 9492 9493 9494 9495 9496 9497 9498 9499 9500 9501 9502 9503 9504 9505 9506 9507 9508 9509 9510 9511 9512 9513 9514 9515 9516 9517 9518 9519 9520 9521 9522 9523 9524 9525 9526 9527 9528 9529 9530 9531 9532 9533 9534 9535 9536 9537 9538 9539 9540 9541 9542 9543 9544 9545 9546 9547 9548 9549 9550 9551 9552 9553 9554 9555 9556 9557 9558 9559 9560 9561 9562 9563 9564 9565 9566 9567 9568 9569 9570 9571 9572 9573 9574 9575 9576 9577 9578 9579 9580 9581 9582 9583 9584 9585 9586 9587 9588 9589 9590 9591 9592 9593 9594 9595 9596 9597 9598 9599 9600 9601 9602 9603 9604 9605 9606 9607 9608 9609 9610 9611 9612 9613 9614 9615 9616 9617 9618 9619 9620 9621 9622 9623 9624 9625 9626 9627 9628 9629 9630 9631 9632 9633 9634 9635 9636 9637 9638 9639 9640 9641 9642 9643 9644 9645 9646 9647 9648 9649 9650 9651 9652 9653 9654 9655 9656 9657 9658 9659 9660 9661 9662 9663 9664 9665 9666 9667 9668 9669 9670 9671 9672 9673 9674 9675 9676 9677 9678 9679 9680 9681 9682 9683 9684 9685 9686 9687 9688 9689 9690 9691 9692 9693 9694 9695 9696 9697 9698 9699 9700 9701 9702 9703 9704 9705 9706 9707 9708 9709 9710 9711 9712 9713 9714 9715 9716 9717 9718 9719 9720 9721 9722 9723 9724 9725 9726 9727 9728 9729 9730 9731 9732 9733 9734 9735 9736 9737 9738 9739 9740 9741 9742 9743 9744 9745 9746 9747 9748 9749 9750 9751 9752 9753 9754 9755 9756 9757 9758 9759 9760 9761 9762 9763 9764 9765 9766 9767 9768 9769 9770 9771 9772 9773 9774 9775 9776 9777 9778 9779 9780 9781 9782 9783 9784 9785 9786 9787 9788 9789 9790 9791 9792 9793 9794 9795 9796 9797 9798 9799 9800 9801 9802 9803 9804 9805 9806 9807 9808 9809 9810 9811 9812 9813 9814 9815 9816 9817 9818 9819 9820 9821 9822 9823 9824 9825 9826 9827 9828 9829 9830 9831 9832 9833 9834 9835 9836 9837 9838 9839 9840 9841 9842 9843 9844 9845 9846 9847 9848 9849 9850 9851 9852 9853 9854 9855 9856 9857 9858 9859 9860 9861 9862 9863 9864 9865 9866 9867 9868 9869 9870 9871 9872 9873 9874 9875 9876 9877 9878 9879 9880 9881 9882 9883 9884 9885 9886 9887 9888 9889 9890 9891 9892 9893 9894 9895 9896 9897 9898 9899 9900 9901 9902 9903 9904 9905 9906 9907 9908 9909 9910 9911 9912 9913 9914 9915 9916 9917 9918 9919 9920 9921 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9954 9955 9956 9957 9958 9959 9960 9961 9962 9963 9964 9965 9966 9967 9968 9969 9970 9971 9972 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 10012 10013 10014 10015 10016 10017 10018 10019 10020 10021 10022 10023 10024 10025 10026 10027 10028 10029 10030 10031 10032 10033 10034 10035 10036 10037 10038 10039 10040 10041 10042 10043 10044 10045 10046 10047 10048 10049 10050 10051 10052 10053 10054 10055 10056 10057 10058 10059 10060 10061 10062 10063 10064 10065 10066 10067 10068 10069 10070 10071 10072 10073 10074 10075 10076 10077 10078 10079 10080 10081 10082 10083 10084 10085 10086 10087 10088 10089 10090 10091 10092 10093 10094 10095 10096 10097 10098 10099 10100 10101 10102 10103 10104 10105 10106 10107 10108 10109 10110 10111 10112 10113 10114 10115 10116 10117 10118 10119 10120 10121 10122 10123 10124 10125 10126 10127 10128 10129 10130 10131 10132 10133 10134 10135 10136 10137 10138 10139 10140 10141 10142 10143 10144 10145 10146 10147 10148 10149 10150 10151 10152 10153 10154 10155 10156 10157 10158 10159 10160 10161 10162 10163 10164 10165 10166 10167 10168 10169 10170 10171 10172 10173 10174 10175 10176 10177 10178 10179 10180 10181 10182 10183 10184 10185 10186 10187 10188 10189 10190 10191 10192 10193 10194 10195 10196 10197 10198 10199 10200 10201 10202 10203 10204 10205 10206 10207 10208 10209 10210 10211 10212 10213 10214 10215 10216 10217 10218 10219 10220 10221 10222 10223 10224 10225 10226 10227 10228 10229 10230 10231 10232 10233 10234 10235 10236 10237 10238 10239 10240 10241 10242 10243 10244 10245 10246 10247 10248 10249 10250 10251 10252 10253 10254 10255 10256 10257 10258 10259 10260 10261 10262 10263 10264 10265 10266 10267 10268 10269 10270 10271 10272 10273 10274 10275 10276 10277 10278 10279 10280 10281 10282 10283 10284 10285 10286 10287 10288 10289 10290 10291 10292 10293 10294 10295 10296 10297 10298 10299 10300 10301 10302 10303 10304 10305 10306 10307 10308 10309 10310 10311 10312 10313 10314 10315 10316 10317 10318 10319 10320 10321 10322 10323 10324 10325 10326 10327 10328 10329 10330 10331 10332 10333 10334 10335 10336 10337 10338 10339 10340 10341 10342 10343 10344 10345 10346 10347 10348 10349 10350 10351 10352 10353 10354 10355 10356 10357 10358 10359 10360 10361 10362 10363 10364 10365 10366 10367 10368 10369 10370 10371 10372 10373 10374 10375 10376 10377 10378 10379 10380 10381 10382 10383 10384 10385 10386 10387 10388 10389 10390 10391 10392 10393 10394 10395 10396 10397 10398 10399 10400 10401 10402 10403 10404 10405 10406 10407 10408 10409 10410 10411 10412 10413 10414 10415 10416 10417 10418 10419 10420 10421 10422 10423 10424 10425 10426 10427 10428 10429 10430 10431 10432 10433 10434 10435 10436 10437 10438 10439 10440 10441 10442 10443 10444 10445 10446 10447 10448 10449 10450 10451 10452 10453 10454 10455 10456 10457 10458 10459 10460 10461 10462 10463 10464 10465 10466 10467 10468 10469 10470 10471 10472 10473 10474 10475 10476 10477 10478 10479 10480 10481 10482 10483 10484 10485 10486 10487 10488 10489 10490 10491 10492 10493 10494 10495 10496 10497 10498 10499 10500 10501 10502 10503 10504 10505 10506 10507 10508 10509 10510 10511 10512 10513 10514 10515 10516 10517 10518 10519 10520 10521 10522 10523 10524 10525 10526 10527 10528 10529 10530 10531 10532 10533 10534 10535 10536 10537 10538 10539 10540 10541 10542 10543 10544 10545 10546 10547 10548 10549 10550 10551 10552 10553 10554 10555 10556 10557 10558 10559 10560 10561 10562 10563 10564 10565 10566 10567 10568 10569 10570 10571 10572 10573 10574 10575 10576 10577 10578 10579 10580 10581 10582 10583 10584 10585 10586 10587 10588 10589 10590 10591 10592 10593 10594 10595 10596 10597 10598 10599 10600 10601 10602 10603 10604 10605 10606 10607 10608 10609 10610 10611 10612 10613 10614 10615 10616 10617 10618 10619 10620 10621 10622 10623 10624 10625 10626 10627 10628 10629 10630 10631 10632 10633 10634 10635 10636 10637 10638 10639 10640 10641 10642 10643 10644 10645 10646 10647 10648 10649 10650 10651 10652 10653 10654 10655 10656 10657 10658 10659 10660 10661 10662 10663 10664 10665 10666 10667 10668 10669 10670 10671 10672 10673 10674 10675 10676 10677 10678 10679 10680 10681 10682 10683 10684 10685 10686 10687 10688 10689 10690 10691 10692 10693 10694 10695 10696 10697 10698 10699 10700 10701 10702 10703 10704 10705 10706 10707 10708 10709 10710 10711 10712 10713 10714 10715 10716 10717 10718 10719 10720 10721 10722 10723 10724 10725 10726 10727 10728 10729 10730 10731 10732 10733 10734 10735 10736 10737 10738 10739 10740 10741 10742 10743 10744 10745 10746 10747 10748 10749 10750 10751 10752 10753 10754 10755 10756 10757 10758 10759 10760 10761 10762 10763 10764 10765 10766 10767 10768 10769 10770 10771 10772 10773 10774 10775 10776 10777 10778 10779 10780 10781 10782 10783 10784 10785 10786 10787 10788 10789 10790 10791 10792 10793 10794 10795 10796 10797 10798 10799 10800 10801 10802 10803 10804 10805 10806 10807 10808 10809 10810 10811 10812 10813 10814 10815 10816 10817 10818 10819 10820 10821 10822 10823 10824 10825 10826 10827 10828 10829 10830 10831 10832 10833 10834 10835 10836 10837 10838 10839 10840 10841 10842 10843 10844 10845 10846 10847 10848 10849 10850 10851 10852 10853 10854 10855 10856 10857 10858 10859 10860 10861 10862 10863 10864 10865 10866 10867 10868 10869 10870 10871 10872 10873 10874 10875 10876 10877 10878 10879 10880 10881 10882 10883 10884 10885 10886 10887 10888 10889 10890 10891 10892 10893 10894 10895 10896 10897 10898 10899 10900 10901 10902 10903 10904 10905 10906 10907 10908 10909 10910 10911 10912 10913 10914 10915 10916 10917 10918 10919 10920 10921 10922 10923 10924 10925 10926 10927 10928 10929 10930 10931 10932 10933 10934 10935 10936 10937 10938 10939 10940 10941 10942 10943 10944 10945 10946 10947 10948 10949 10950 10951 10952 10953 10954 10955 10956 10957 10958 10959 10960 10961 10962 10963 10964 10965 10966 10967 10968 10969 10970 10971 10972 10973 10974 10975 10976 10977 10978 10979 10980 10981 10982 10983 10984 10985 10986 10987 10988 10989 10990 10991 10992 10993 10994 10995 10996 10997 10998 10999 11000 11001 11002 11003 11004 11005 11006 11007 11008 11009 11010 11011 11012 11013 11014 11015 11016 11017 11018 11019 11020 11021 11022 11023 11024 11025 11026 11027 11028 11029 11030 11031 11032 11033 11034 11035 11036 11037 11038 11039 11040 11041 11042 11043 11044 11045 11046 11047 11048 11049 11050 11051 11052 11053 11054 11055 11056 11057 11058 11059 11060 11061 11062 11063 11064 11065 11066 11067 11068 11069 11070 11071 11072 11073 11074 11075 11076 11077 11078 11079 11080 11081 11082 11083 11084 11085 11086 11087 11088 11089 11090 11091 11092 11093 11094 11095 11096 11097 11098 11099 11100 11101 11102 11103 11104 11105 11106 11107 11108 11109 11110 11111 11112 11113 11114 11115 11116 11117 11118 11119 11120 11121 11122 11123 11124 11125 11126 11127 11128 11129 11130 11131 11132 11133 11134 11135 11136 11137 11138 11139 11140 11141 11142 11143 11144 11145 11146 11147 11148 11149 11150 11151 11152 11153 11154 11155 11156 11157 11158 11159 11160 11161 11162 11163 11164 11165 11166 11167 11168 11169 11170 11171 11172 11173 11174 11175 11176 11177 11178 11179 11180 11181 11182 11183 11184 11185 11186 11187 11188 11189 11190 11191 11192 11193 11194 11195 11196 11197 11198 11199 11200 11201 11202 11203 11204 11205 11206 11207 11208 11209 11210 11211 11212 11213 11214 11215 11216 11217 11218 11219 11220 11221 11222 11223 11224 11225 11226 11227 11228 11229 11230 11231 11232 11233 11234 11235 11236 11237 11238 11239 11240 11241 11242 11243 11244 11245 11246 11247 11248 11249 11250 11251 11252 11253 11254 11255 11256 11257 11258 11259 11260 11261 11262 11263 11264 11265 11266 11267 11268 11269 11270 11271 11272 11273 11274 11275 11276 11277 11278 11279 11280 11281 11282 11283 11284 11285 11286 11287 11288 11289 11290 11291 11292 11293 11294 11295 11296 11297 11298 11299 11300 11301 11302 11303 11304 11305 11306 11307 11308 11309 11310 11311 11312 11313 11314 11315 11316 11317 11318 11319 11320 11321 11322 11323 11324 11325 11326 11327 11328 11329 11330 11331 11332 11333 11334 11335 11336 11337 11338 11339 11340 11341 11342 11343 11344 11345 11346 11347 11348 11349 11350 11351 11352 11353 11354 11355 11356 11357 11358 11359 11360 11361 11362 11363 11364 11365 11366 11367 11368 11369 11370 11371 11372 11373 11374 11375 11376 11377 11378 11379 11380 11381 11382 11383 11384 11385 11386 11387 11388 11389 11390 11391 11392 11393 11394 11395 11396 11397 11398 11399 11400 11401 11402 11403 11404 11405 11406 11407 11408 11409 11410 11411 11412 11413 11414 11415 11416 11417 11418 11419 11420 11421 11422 11423 11424 11425 11426 11427 11428 11429 11430 11431 11432 11433 11434 11435 11436 11437 11438 11439 11440 11441 11442 11443 11444 11445 11446 11447 11448 11449 11450 11451 11452 11453 11454 11455 11456 11457 11458 11459 11460 11461 11462 11463 11464 11465 11466 11467 11468 11469 11470 11471 11472 11473 11474 11475 11476 11477 11478 11479 11480 11481 11482 11483 11484 11485 11486 11487 11488 11489 11490 11491 11492 11493 11494 11495 11496 11497 11498 11499 11500 11501 11502 11503 11504 11505 11506 11507 11508 11509 11510 11511 11512 11513 11514 11515 11516 11517 11518 11519 11520 11521 11522 11523 11524 11525 11526 11527 11528 11529 11530 11531 11532 11533 11534 11535 11536 11537 11538 11539 11540 11541 11542 11543 11544 11545 11546 11547 11548 11549 11550 11551 11552 11553 11554 11555 11556 11557 11558 11559 11560 11561 11562 11563 11564 11565 11566 11567 11568 11569 11570 11571 11572 11573 11574 11575 11576 11577 11578 11579 11580 11581 11582 11583 11584 11585 11586 11587 11588 11589 11590 11591 11592 11593 11594 11595 11596 11597 11598 11599 11600 11601 11602 11603 11604 11605 11606 11607 11608 11609 11610 11611 11612 11613 11614 11615 11616 11617 11618 11619 11620 11621 11622 11623 11624 11625 11626 11627 11628 11629 11630 11631 11632 11633 11634 11635 11636 11637 11638 11639 11640 11641 11642 11643 11644 11645 11646 11647 11648 11649 11650 11651 11652 11653 11654 11655 11656 11657 11658 11659 11660 11661 11662 11663 11664 11665 11666 11667 11668 11669 11670 11671 11672 11673 11674 11675 11676 11677 11678 11679 11680 11681 11682 11683 11684 11685 11686 11687 11688 11689 11690 11691 11692 11693 11694 11695 11696 11697 11698 11699 11700 11701 11702 11703 11704 11705 11706 11707 11708 11709 11710 11711 11712 11713 11714 11715 11716 11717 11718 11719 11720 11721 11722 11723 11724 11725 11726 11727 11728 11729 11730 11731 11732 11733 11734 11735 11736 11737 11738 11739 11740 11741 11742 11743 11744 11745 11746 11747 11748 11749 11750 11751 11752 11753 11754 11755 11756 11757 11758 11759 11760 11761 11762 11763 11764 11765 11766 11767 11768 11769 11770 11771 11772 11773 11774 11775 11776 11777 11778 11779 11780 11781 11782 11783 11784 11785 11786 11787 11788 11789 11790 11791 11792 11793 11794 11795 11796 11797 11798 11799 11800 11801 11802 11803 11804 11805 11806 11807 11808 11809 11810 11811 11812 11813 11814 11815 11816 11817 11818 11819 11820 11821 11822 11823 11824 11825 11826 11827 11828 11829 11830 11831 11832 11833 11834 11835 11836 11837 11838 11839 11840 11841 11842 11843 11844 11845 11846 11847 11848 11849 11850 11851 11852 11853 11854 11855 11856 11857 11858 11859 11860 11861 11862 11863 11864 11865 11866 11867 11868 11869 11870 11871 11872 11873 11874 11875 11876 11877 11878 11879 11880 11881 11882 11883 11884 11885 11886 11887 11888 11889 11890 11891 11892 11893 11894 11895 11896 11897 11898 11899 11900 11901 11902 11903 11904 11905 11906 11907 11908 11909 11910 11911 11912 11913 11914 11915 11916 11917 11918 11919 11920 11921 11922 11923 11924 11925 11926 11927 11928 11929 11930 11931 11932 11933 11934 11935 11936 11937 11938 11939 11940 11941 11942 11943 11944 11945 11946 11947 11948 11949 11950 11951 11952 11953 11954 11955 11956 11957 11958 11959 11960 11961 11962 11963 11964 11965 11966 11967 11968 11969 11970 11971 11972 11973 11974 11975 11976 11977 11978 11979 11980 11981 11982 11983 11984 11985 11986 11987 11988 11989 11990 11991 11992 11993 11994 11995 11996 11997 11998 11999 12000 12001 12002 12003 12004 12005 12006 12007 12008 12009 12010 12011 12012 12013 12014 12015 12016 12017 12018 12019 12020 12021 12022 12023 12024 12025 12026 12027 12028 12029 12030 12031 12032 12033 12034 12035 12036 12037 12038 12039 12040 12041 12042 12043 12044 12045 12046 12047 12048 12049 12050 12051 12052 12053 12054 12055 12056 12057 12058 12059 12060 12061 12062 12063 12064 12065 12066 12067 12068 12069 12070 12071 12072 12073 12074 12075 12076 12077 12078 12079 12080 12081 12082 12083 12084 12085 12086 12087 12088 12089 12090 12091 12092 12093 12094 12095 12096 12097 12098 12099 12100 12101 12102 12103 12104 12105 12106 12107 12108 12109 12110 12111 12112 12113 12114 12115 12116 12117 12118 12119 12120 12121 12122 12123 12124 12125 12126 12127 12128 12129 12130 12131 12132 12133 12134 12135 12136 12137 12138 12139 12140 12141 12142 12143 12144 12145 12146 12147 12148 12149 12150 12151 12152 12153 12154 12155 12156 12157 12158 12159 12160 12161 12162 12163 12164 12165 12166 12167 12168 12169 12170 12171 12172 12173 12174 12175 12176 12177 12178 12179 12180 12181 12182 12183 12184 12185 12186 12187 12188 12189 12190 12191 12192 12193 12194 12195 12196 12197 12198 12199 12200 12201 12202 12203 12204 12205 12206 12207 12208 12209 12210 12211 12212 12213 12214 12215 12216 12217 12218 12219 12220 12221 12222 12223 12224 12225 12226 12227 12228 12229 12230 12231 12232 12233 12234 12235 12236 12237 12238 12239 12240 12241 12242 12243 12244 12245 12246 12247 12248 12249 12250 12251 12252 12253 12254 12255 12256 12257 12258 12259 12260 12261 12262 12263 12264 12265 12266 12267 12268 12269 12270 12271 12272 12273 12274 12275 12276 12277 12278 12279 12280 12281 12282 12283 12284 12285 12286 12287 12288 12289 12290 12291 12292 12293 12294 12295 12296 12297 12298 12299 12300 12301 12302 12303 12304 12305 12306 12307 12308 12309 12310 12311 12312 12313 12314 12315 12316 12317 12318 12319 12320 12321 12322 12323 12324 12325 12326 12327 12328 12329 12330 12331 12332 12333 12334 12335 12336 12337 12338 12339 12340 12341 12342 12343 12344 12345 12346 12347 12348 12349 12350 12351 12352 12353 12354 12355 12356 12357 12358 12359 12360 12361 12362 12363 12364 12365 12366 12367 12368 12369 12370 12371 12372 12373 12374 12375 12376 12377 12378 12379 12380 12381 12382 12383 12384 12385 12386 12387 12388 12389 12390 12391 12392 12393 12394 12395 12396 12397 12398 12399 12400 12401 12402 12403 12404 12405 12406 12407 12408 12409 12410 12411 12412 12413 12414 12415 12416 12417 12418 12419 12420 12421 12422 12423 12424 12425 12426 12427 12428 12429 12430 12431 12432 12433 12434 12435 12436 12437 12438 12439 12440 12441 12442 12443 12444 12445 12446 12447 12448 12449 12450 12451 12452 12453 12454 12455 12456 12457 12458 12459 12460 12461 12462 12463 12464 12465 12466 12467 12468 12469 12470 12471 12472 12473 12474 12475 12476 12477 12478 12479 12480 12481 12482 12483 12484 12485 12486 12487 12488 12489 12490 12491 12492 12493 12494 12495 12496 12497 12498 12499 12500 12501 12502 12503 12504 12505 12506 12507 12508 12509 12510 12511 12512 12513 12514 12515 12516 12517 12518 12519 12520 12521 12522 12523 12524 12525 12526 12527 12528 12529 12530 12531 12532 12533 12534 12535 12536 12537 12538 12539 12540 12541 12542 12543 12544 12545 12546 12547 12548 12549 12550 12551 12552 12553 12554 12555 12556 12557 12558 12559 12560 12561 12562 12563 12564 12565 12566 12567 12568 12569 12570 12571 12572 12573 12574 12575 12576 12577 12578 12579 12580 12581 12582 12583 12584 12585 12586 12587 12588 12589 12590 12591 12592 12593 12594 12595 12596 12597 12598 12599 12600 12601 12602 12603 12604 12605 12606 12607 12608 12609 12610 12611 12612 12613 12614 12615 12616 12617 12618 12619 12620 12621 12622 12623 12624 12625 12626 12627 12628 12629 12630 12631 12632 12633 12634 12635 12636 12637 12638 12639 12640 12641 12642 12643 12644 12645 12646 12647 12648 12649 12650 12651 12652 12653 12654 12655 12656 12657 12658 12659 12660 12661 12662 12663 12664 12665 12666 12667 12668 12669 12670 12671 12672 12673 12674 12675 12676 12677 12678 12679 12680 12681 12682 12683 12684 12685 12686 12687 12688 12689 12690 12691 12692 12693 12694 12695 12696 12697 12698 12699 12700 12701 12702 12703 12704 12705 12706 12707 12708 12709 12710 12711 12712 12713 12714 12715 12716 12717 12718 12719 12720 12721 12722 12723 12724 12725 12726 12727 12728 12729 12730 12731 12732 12733 12734 12735 12736 12737 12738 12739 12740 12741 12742 12743 12744 12745 12746 12747 12748 12749 12750 12751 12752 12753 12754 12755 12756 12757 12758 12759 12760 12761 12762 12763 12764 12765 12766 12767 12768 12769 12770 12771 12772 12773 12774 12775 12776 12777 12778 12779 12780 12781 12782 12783 12784 12785 12786 12787 12788 12789 12790 12791 12792 12793 12794 12795 12796 12797 12798 12799 12800 12801 12802 12803 12804 12805 12806 12807 12808 12809 12810 12811 12812 12813 12814 12815 12816 12817 12818 12819 12820 12821 12822 12823 12824 12825 12826 12827 12828 12829 12830 12831 12832 12833 12834 12835 12836 12837 12838 12839 12840 12841 12842 12843 12844 12845 12846 12847 12848 12849 12850 12851 12852 12853 12854 12855 12856 12857 12858 12859 12860 12861 12862 12863 12864 12865 12866 12867 12868 12869 12870 12871 12872 12873 12874 12875 12876 12877 12878 12879 12880 12881 12882 12883 12884 12885 12886 12887 12888 12889 12890 12891 12892 12893 12894 12895 12896 12897 12898 12899 12900 12901 12902 12903 12904 12905 12906 12907 12908 12909 12910 12911 12912 12913 12914 12915 12916 12917 12918 12919 12920 12921 12922 12923 12924 12925 12926 12927 12928 12929 12930 12931 12932 12933 12934 12935 12936 12937 12938 12939 12940 12941 12942 12943 12944 12945 12946 12947 12948 12949 12950 12951 12952 12953 12954 12955 12956 12957 12958 12959 12960 12961 12962 12963 12964 12965 12966 12967 12968 12969 12970 12971 12972 12973 12974 12975 12976 12977 12978 12979 12980 12981 12982 12983 12984 12985 12986 12987 12988 12989 12990 12991 12992 12993 12994 12995 12996 12997 12998 12999 13000 13001 13002 13003 13004 13005 13006 13007 13008 13009 13010 13011 13012 13013 13014 13015 13016 13017 13018 13019 13020 13021 13022 13023 13024 13025 13026 13027 13028 13029 13030 13031 13032 13033 13034 13035 13036 13037 13038 13039 13040 13041 13042 13043 13044 13045 13046 13047 13048 13049 13050 13051 13052 13053 13054 13055 13056 13057 13058 13059 13060 13061 13062 13063 13064 13065 13066 13067 13068 13069 13070 13071 13072 13073 13074 13075 13076 13077 13078 13079 13080 13081 13082 13083 13084 13085 13086 13087 13088 13089 13090 13091 13092 13093 13094 13095 13096 13097 13098 13099 13100 13101 13102 13103 13104 13105 13106 13107 13108 13109 13110 13111 13112 13113 13114 13115 13116 13117 13118 13119 13120 13121 13122 13123 13124 13125 13126 13127 13128 13129 13130 13131 13132 13133 13134 13135 13136 13137 13138 13139 13140 13141 13142 13143 13144 13145 13146 13147 13148 13149 13150 13151 13152 13153 13154 13155 13156 13157 13158 13159 13160 13161 13162 13163 13164 13165 13166 13167 13168 13169 13170 13171 13172 13173 13174 13175 13176 13177 13178 13179 13180 13181 13182 13183 13184 13185 13186 13187 13188 13189 13190 13191 13192 13193 13194 13195 13196 13197 13198 13199 13200 13201 13202 13203 13204 13205 13206 13207 13208 13209 13210 13211 13212 13213 13214 13215 13216 13217 13218 13219 13220 13221 13222 13223 13224 13225 13226 13227 13228 13229 13230 13231 13232 13233 13234 13235 13236 13237 13238 13239 13240 13241 13242 13243 13244 13245 13246 13247 13248 13249 13250 13251 13252 13253 13254 13255 13256 13257 13258 13259 13260 13261 13262 13263 13264 13265 13266 13267 13268 13269 13270 13271 13272 13273 13274 13275 13276 13277 13278 13279 13280 13281 13282 13283 13284 13285 13286 13287 13288 13289 13290 13291 13292 13293 13294 13295 13296 13297 13298 13299 13300 13301 13302 13303 13304 13305 13306 13307 13308 13309 13310 13311 13312 13313 13314 13315 13316 13317 13318 13319 13320 13321 13322 13323 13324 13325 13326 13327 13328 13329 13330 13331 13332 13333 13334 13335 13336 13337 13338 13339 13340 13341 13342 13343 13344 13345 13346 13347 13348 13349 13350 13351 13352 13353 13354 13355 13356 13357 13358 13359 13360 13361 13362 13363 13364 13365 13366 13367 13368 13369 13370 13371 13372 13373 13374 13375 13376 13377 13378 13379 13380 13381 13382 13383 13384 13385 13386 13387 13388 13389 13390 13391 13392 13393 13394 13395 13396 13397 13398 13399 13400 13401 13402 13403 13404 13405 13406 13407 13408 13409 13410 13411 13412 13413 13414 13415 13416 13417 13418 13419 13420 13421 13422 13423 13424 13425 13426 13427 13428 13429 13430 13431 13432 13433 13434 13435 13436 13437 13438 13439 13440 13441 13442 13443 13444 13445 13446 13447 13448 13449 13450 13451 13452 13453 13454 13455 13456 13457 13458 13459 13460 13461 13462 13463 13464 13465 13466 13467 13468 13469 13470 13471 13472 13473 13474 13475 13476 13477 13478 13479 13480 13481 13482 13483 13484 13485 13486 13487 13488 13489 13490 13491 13492 13493 13494 13495 13496 13497 13498 13499 13500 13501 13502 13503 13504 13505 13506 13507 13508 13509 13510 13511 13512 13513 13514 13515 13516 13517 13518 13519 13520 13521 13522 13523 13524 13525 13526 13527 13528 13529 13530 13531 13532 13533 13534 13535 13536 13537 13538 13539 13540 13541 13542 13543 13544 13545 13546 13547 13548 13549 13550 13551 13552 13553 13554 13555 13556 13557 13558 13559 13560 13561 13562 13563 13564 13565 13566 13567 13568 13569 13570 13571 13572 13573 13574 13575 13576 13577 13578 13579 13580 13581 13582 13583 13584 13585 13586 13587 13588 13589 13590 13591 13592 13593 13594 13595 13596 13597 13598 13599 13600 13601 13602 13603 13604 13605 13606 13607 13608 13609 13610 13611 13612 13613 13614 13615 13616 13617 13618 13619 13620 13621 13622 13623 13624 13625 13626 13627 13628 13629 13630 13631 13632 13633 13634 13635 13636 13637 13638 13639 13640 13641 13642 13643 13644 13645 13646 13647 13648 13649 13650 13651 13652 13653 13654 13655 13656 13657 13658 13659 13660 13661 13662 13663 13664 13665 13666 13667 13668 13669 13670 13671 13672 13673 13674 13675 13676 13677 13678 13679 13680 13681 13682 13683 13684 13685 13686 13687 13688 13689 13690 13691 13692 13693 13694 13695 13696 13697 13698 13699 13700 13701 13702 13703 13704 13705 13706 13707 13708 13709 13710 13711 13712 13713 13714 13715 13716 13717 13718 13719 13720 13721 13722 13723 13724 13725 13726 13727 13728 13729 13730 13731 13732 13733 13734 13735 13736 13737 13738 13739 13740 13741 13742 13743 13744 13745 13746 13747 13748 13749 13750 13751 13752 13753 13754 13755 13756 13757 13758 13759 13760 13761 13762 13763 13764 13765 13766 13767 13768 13769 13770 13771 13772 13773 13774 13775 13776 13777 13778 13779 13780 13781 13782 13783 13784 13785 13786 13787 13788 13789 13790 13791 13792 13793 13794 13795 13796 13797 13798 13799 13800 13801 13802 13803 13804 13805 13806 13807 13808 13809 13810 13811 13812 13813 13814 13815 13816 13817 13818 13819 13820 13821 13822 13823 13824 13825 13826 13827 13828 13829 13830 13831 13832 13833 13834 13835 13836 13837 13838 13839 13840 13841 13842 13843 13844 13845 13846 13847 13848 13849 13850 13851 13852 13853 13854 13855 13856 13857 13858 13859 13860 13861 13862 13863 13864 13865 13866 13867 13868 13869 13870 13871 13872 13873 13874 13875 13876 13877 13878 13879 13880 13881 13882 13883 13884 13885 13886 13887 13888 13889 13890 13891 13892 13893 13894 13895 13896 13897 13898 13899 13900 13901 13902 13903 13904 13905 13906 13907 13908 13909 13910 13911 13912 13913 13914 13915 13916 13917 13918 13919 13920 13921 13922 13923 13924 13925 13926 13927 13928 13929 13930 13931 13932 13933 13934 13935 13936 13937 13938 13939 13940 13941 13942 13943 13944 13945 13946 13947 13948 13949 13950 13951 13952 13953 13954 13955 13956 13957 13958 13959 13960 13961 13962 13963 13964 13965 13966 13967 13968 13969 13970 13971 13972 13973 13974 13975 13976 13977 13978 13979 13980 13981 13982 13983 13984 13985 13986 13987 13988 13989 13990 13991 13992 13993 13994 13995 13996 13997 13998 13999 14000 14001 14002 14003 14004 14005 14006 14007 14008 14009 14010 14011 14012 14013 14014 14015 14016 14017 14018 14019 14020 14021 14022 14023 14024 14025 14026 14027 14028 14029 14030 14031 14032 14033 14034 14035 14036 14037 14038 14039 14040 14041 14042 14043 14044 14045 14046 14047 14048 14049 14050 14051 14052 14053 14054 14055 14056 14057 14058 14059 14060 14061 14062 14063 14064 14065 14066 14067 14068 14069 14070 14071 14072 14073 14074 14075 14076 14077 14078 14079 14080 14081 14082 14083 14084 14085 14086 14087 14088 14089 14090 14091 14092 14093 14094 14095 14096 14097 14098 14099 14100 14101 14102 14103 14104 14105 14106 14107 14108 14109 14110 14111 14112 14113 14114 14115 14116 14117 14118 14119 14120 14121 14122 14123 14124 14125 14126 14127 14128 14129 14130 14131 14132 14133 14134 14135 14136 14137 14138 14139 14140 14141 14142 14143 14144 14145 14146 14147 14148 14149 14150 14151 14152 14153 14154 14155 14156 14157 14158 14159 14160 14161 14162 14163 14164 14165 14166 14167 14168 14169 14170 14171 14172 14173 14174 14175 14176 14177 14178 14179 14180 14181 14182 14183 14184 14185 14186 14187 14188 14189 14190 14191 14192 14193 14194 14195 14196 14197 14198 14199 14200 14201 14202 14203 14204 14205 14206 14207 14208 14209 14210 14211 14212 14213 14214 14215 14216 14217 14218 14219 14220 14221 14222 14223 14224 14225 14226 14227 14228 14229 14230 14231 14232 14233 14234 14235 14236 14237 14238 14239 14240 14241 14242 14243 14244 14245 14246 14247 14248 14249 14250 14251 14252 14253 14254 14255 14256 14257 14258 14259 14260 14261 14262 14263 14264 14265 14266 14267 14268 14269 14270 14271 14272 14273 14274 14275 14276 14277 14278 14279 14280 14281 14282 14283 14284 14285 14286 14287 14288 14289 14290 14291 14292 14293 14294 14295 14296 14297 14298 14299 14300 14301 14302 14303 14304 14305 14306 14307 14308 14309 14310 14311 14312 14313 14314 14315 14316 14317 14318 14319 14320 14321 14322 14323 14324 14325 14326 14327 14328 14329 14330 14331 14332 14333 14334 14335 14336 14337 14338 14339 14340 14341 14342 14343 14344 14345 14346 14347 14348 14349 14350 14351 14352 14353 14354 14355 14356 14357 14358 14359 14360 14361 14362 14363 14364 14365 14366 14367 14368 14369 14370 14371 14372 14373 14374 14375 14376 14377 14378 14379 14380 14381 14382 14383 14384 14385 14386 14387 14388 14389 14390 14391 14392 14393 14394 14395 14396 14397 14398 14399 14400 14401 14402 14403 14404 14405 14406 14407 14408 14409 14410 14411 14412 14413 14414 14415 14416 14417 14418 14419 14420 14421 14422 14423 14424 14425 14426 14427 14428 14429 14430 14431 14432 14433 14434 14435 14436 14437 14438 14439 14440 14441 14442 14443 14444 14445 14446 14447 14448 14449 14450 14451 14452 14453 14454 14455 14456 14457 14458 14459 14460 14461 14462 14463 14464 14465 14466 14467 14468 14469 14470 14471 14472 14473 14474 14475 14476 14477 14478 14479 14480 14481 14482 14483 14484 14485 14486 14487 14488 14489 14490 14491 14492 14493 14494 14495 14496 14497 14498 14499 14500 14501 14502 14503 14504 14505 14506 14507 14508 14509 14510 14511 14512 14513 14514 14515 14516 14517 14518 14519 14520 14521 14522 14523 14524 14525 14526 14527 14528 14529 14530 14531 14532 14533 14534 14535 14536 14537 14538 14539 14540 14541 14542 14543 14544 14545 14546 14547 14548 14549 14550 14551 14552 14553 14554 14555 14556 14557 14558 14559 14560 14561 14562 14563 14564 14565 14566 14567 14568 14569 14570 14571 14572 14573 14574 14575 14576 14577 14578 14579 14580 14581 14582 14583 14584 14585 14586 14587 14588 14589 14590 14591 14592 14593 14594 14595 14596 14597 14598 14599 14600 14601 14602 14603 14604 14605 14606 14607 14608 14609 14610 14611 14612 14613 14614 14615 14616 14617 14618 14619 14620 14621 14622 14623 14624 14625 14626 14627 14628 14629 14630 14631 14632 14633 14634 14635 14636 14637 14638 14639 14640 14641 14642 14643 14644 14645 14646 14647 14648 14649 14650 14651 14652 14653 14654 14655 14656 14657 14658 14659 14660 14661 14662 14663 14664 14665 14666 14667 14668 14669 14670 14671 14672 14673 14674 14675 14676 14677 14678 14679 14680 14681 14682 14683 14684 14685 14686 14687 14688 14689 14690 14691 14692 14693 14694 14695 14696 14697 14698 14699 14700 14701 14702 14703 14704 14705 14706 14707 14708 14709 14710 14711 14712 14713 14714 14715 14716 14717 14718 14719 14720 14721 14722 14723 14724 14725 14726 14727 14728 14729 14730 14731 14732 14733 14734 14735 14736 14737 14738 14739 14740 14741 14742 14743 14744 14745 14746 14747 14748 14749 14750 14751 14752 14753 14754 14755 14756 14757 14758 14759 14760 14761 14762 14763 14764 14765 14766 14767 14768 14769 14770 14771 14772 14773 14774 14775 14776 14777 14778 14779 14780 14781 14782 14783 14784 14785 14786 14787 14788 14789 14790 14791 14792 14793 14794 14795 14796 14797 14798 14799 14800 14801 14802 14803 14804 14805 14806 14807 14808 14809 14810 14811 14812 14813 14814 14815 14816 14817 14818 14819 14820 14821 14822 14823 14824 14825 14826 14827 14828 14829 14830 14831 14832 14833 14834 14835 14836 14837 14838 14839 14840 14841 14842 14843 14844 14845 14846 14847 14848 14849 14850 14851 14852 14853 14854 14855 14856 14857 14858 14859 14860 14861 14862 14863 14864 14865 14866 14867 14868 14869 14870 14871 14872 14873 14874 14875 14876 14877 14878 14879 14880 14881 14882 14883 14884 14885 14886 14887 14888 14889 14890 14891 14892 14893 14894 14895 14896 14897 14898 14899 14900 14901 14902 14903 14904 14905 14906 14907 14908 14909 14910 14911 14912 14913 14914 14915 14916 14917 14918 14919 14920 14921 14922 14923 14924 14925 14926 14927 14928 14929 14930 14931 14932 14933 14934 14935 14936 14937 14938 14939 14940 14941 14942 14943 14944 14945 14946 14947 14948 14949 14950 14951 14952 14953 14954 14955 14956 14957 14958 14959 14960 14961 14962 14963 14964 14965 14966 14967 14968 14969 14970 14971 14972 14973 14974 14975 14976 14977 14978 14979 14980 14981 14982 14983 14984 14985 14986 14987 14988 14989 14990 14991 14992 14993 14994 14995 14996 14997 14998 14999 15000 15001 15002 15003 15004 15005 15006 15007 15008 15009 15010 15011 15012 15013 15014 15015 15016 15017 15018 15019 15020 15021 15022 15023 15024 15025 15026 15027 15028 15029 15030 15031 15032 15033 15034 15035 15036 15037 15038 15039 15040 15041 15042 15043 15044 15045 15046 15047 15048 15049 15050 15051 15052 15053 15054 15055 15056 15057 15058 15059 15060 15061 15062 15063 15064 15065 15066 15067 15068 15069 15070 15071 15072 15073 15074 15075 15076 15077 15078 15079 15080 15081 15082 15083 15084 15085 15086 15087 15088 15089 15090 15091 15092 15093 15094 15095 15096 15097 15098 15099 15100 15101 15102 15103 15104 15105 15106 15107 15108 15109 15110 15111 15112 15113 15114 15115 15116 15117 15118 15119 15120 15121 15122 15123 15124 15125 15126 15127 15128 15129 15130 15131 15132 15133 15134 15135 15136 15137 15138 15139 15140 15141 15142 15143 15144 15145 15146 15147 15148 15149 15150 15151 15152 15153 15154 15155 15156 15157 15158 15159 15160 15161 15162 15163 15164 15165 15166 15167 15168 15169 15170 15171 15172 15173 15174 15175 15176 15177 15178 15179 15180 15181 15182 15183 15184 15185 15186 15187 15188 15189 15190 15191 15192 15193 15194 15195 15196 15197 15198 15199 15200 15201 15202 15203 15204 15205 15206 15207 15208 15209 15210 15211 15212 15213 15214 15215 15216 15217 15218 15219 15220 15221 15222 15223 15224 15225 15226 15227 15228 15229 15230 15231 15232 15233 15234 15235 15236 15237 15238 15239 15240 15241 15242 15243 15244 15245 15246 15247 15248 15249 15250 15251 15252 15253 15254 15255 15256 15257 15258 15259 15260 15261 15262 15263 15264 15265 15266 15267 15268 15269 15270 15271 15272 15273 15274 15275 15276 15277 15278 15279 15280 15281 15282 15283 15284 15285 15286 15287 15288 15289 15290 15291 15292 15293 15294 15295 15296 15297 15298 15299 15300 15301 15302 15303 15304 15305 15306 15307 15308 15309 15310 15311 15312 15313 15314 15315 15316 15317 15318 15319 15320 15321 15322 15323 15324 15325 15326 15327 15328 15329 15330 15331 15332 15333 15334 15335 15336 15337 15338 15339 15340 15341 15342 15343 15344 15345 15346 15347 15348 15349 15350 15351 15352 15353 15354 15355 15356 15357 15358 15359 15360 15361 15362 15363 15364 15365 15366 15367 15368 15369 15370 15371 15372 15373 15374 15375 15376 15377 15378 15379 15380 15381 15382 15383 15384 15385 15386 15387 15388 15389 15390 15391 15392 15393 15394 15395 15396 15397 15398 15399 15400 15401 15402 15403 15404 15405 15406 15407 15408 15409 15410 15411 15412 15413 15414 15415 15416 15417 15418 15419 15420 15421 15422 15423 15424 15425 15426 15427 15428 15429 15430 15431 15432 15433 15434 15435 15436 15437 15438 15439 15440 15441 15442 15443 15444 15445 15446 15447 15448 15449 15450 15451 15452 15453 15454 15455 15456 15457 15458 15459 15460 15461 15462 15463 15464 15465 15466 15467 15468 15469 15470 15471 15472 15473 15474 15475 15476 15477 15478 15479 15480 15481 15482 15483 15484 15485 15486 15487 15488 15489 15490 15491 15492 15493 15494 15495 15496 15497 15498 15499 15500 15501 15502 15503 15504 15505 15506 15507 15508 15509 15510 15511 15512 15513 15514 15515 15516 15517 15518 15519 15520 15521 15522 15523 15524 15525 15526 15527 15528 15529 15530 15531 15532 15533 15534 15535 15536 15537 15538 15539 15540 15541 15542 15543 15544 15545 15546 15547 15548 15549 15550 15551 15552 15553 15554 15555 15556 15557 15558 15559 15560 15561 15562 15563 15564 15565 15566 15567 15568 15569 15570 15571 15572 15573 15574 15575 15576 15577 15578 15579 15580 15581 15582 15583 15584 15585 15586 15587 15588 15589 15590 15591 15592 15593 15594 15595 15596 15597 15598 15599 15600 15601 15602 15603 15604 15605 15606 15607 15608 15609 15610 15611 15612 15613 15614 15615 15616 15617 15618 15619 15620 15621 15622 15623 15624 15625 15626 15627 15628 15629 15630 15631 15632 15633 15634 15635 15636 15637 15638 15639 15640 15641 15642 15643 15644 15645 15646 15647 15648 15649 15650 15651 15652 15653 15654 15655 15656 15657 15658 15659 15660 15661 15662 15663 15664 15665 15666 15667 15668 15669 15670 15671 15672 15673 15674 15675 15676 15677 15678 15679 15680 15681 15682 15683 15684 15685 15686 15687 15688 15689 15690 15691 15692 15693 15694 15695 15696 15697 15698 15699 15700 15701 15702 15703 15704 15705 15706 15707 15708 15709 15710 15711 15712 15713 15714 15715 15716 15717 15718 15719 15720 15721 15722 15723 15724 15725 15726 15727 15728 15729 15730 15731 15732 15733 15734 15735 15736 15737 15738 15739 15740 15741 15742 15743 15744 15745 15746 15747 15748 15749 15750 15751 15752 15753 15754 15755 15756 15757 15758 15759 15760 15761 15762 15763 15764 15765 15766 15767 15768 15769 15770 15771 15772 15773 15774 15775 15776 15777 15778 15779 15780 15781 15782 15783 15784 15785 15786 15787 15788 15789 15790 15791 15792 15793 15794 15795 15796 15797 15798 15799 15800 15801 15802 15803 15804 15805 15806 15807 15808 15809 15810 15811 15812 15813 15814 15815 15816 15817 15818 15819 15820 15821 15822 15823 15824 15825 15826 15827 15828 15829 15830 15831 15832 15833 15834 15835 15836 15837 15838 15839 15840 15841 15842 15843 15844 15845 15846 15847 15848 15849 15850 15851 15852 15853 15854 15855 15856 15857 15858 15859 15860 15861 15862 15863 15864 15865 15866 15867 15868 15869 15870 15871 15872 15873 15874 15875 15876 15877 15878 15879 15880 15881 15882 15883 15884 15885 15886 15887 15888 15889 15890 15891 15892 15893 15894 15895 15896 15897 15898 15899 15900 15901 15902 15903 15904 15905 15906 15907 15908 15909 15910 15911 15912 15913 15914 15915 15916 15917 15918 15919 15920 15921 15922 15923 15924 15925 15926 15927 15928 15929 15930 15931 15932 15933 15934 15935 15936 15937 15938 15939 15940 15941 15942 15943 15944 15945 15946 15947 15948 15949 15950 15951 15952 15953 15954 15955 15956 15957 15958 15959 15960 15961 15962 15963 15964 15965 15966 15967 15968 15969 15970 15971 15972 15973 15974 15975 15976 15977 15978 15979 15980 15981 15982 15983 15984 15985 15986 15987 15988 15989 15990 15991 15992 15993 15994 15995 15996 15997 15998 15999 16000 16001 16002 16003 16004 16005 16006 16007 16008 16009 16010 16011 16012 16013 16014 16015 16016 16017 16018 16019 16020 16021 16022 16023 16024 16025 16026 16027 16028 16029 16030 16031 16032 16033 16034 16035 16036 16037 16038 16039 16040 16041 16042 16043 16044 16045 16046 16047 16048 16049 16050 16051 16052 16053 16054 16055 16056 16057 16058 16059 16060 16061 16062 16063 16064 16065 16066 16067 16068 16069 16070 16071 16072 16073 16074 16075 16076 16077 16078 16079 16080 16081 16082 16083 16084 16085 16086 16087 16088 16089 16090 16091 16092 16093 16094 16095 16096 16097 16098 16099 16100 16101 16102 16103 16104 16105 16106 16107 16108 16109 16110 16111 16112 16113 16114 16115 16116 16117 16118 16119 16120 16121 16122 16123 16124 16125 16126 16127 16128 16129 16130 16131 16132 16133 16134 16135 16136 16137 16138 16139 16140 16141 16142 16143 16144 16145 16146 16147 16148 16149 16150 16151 16152 16153 16154 16155 16156 16157 16158 16159 16160 16161 16162 16163 16164 16165 16166 16167 16168 16169 16170 16171 16172 16173 16174 16175 16176 16177 16178 16179 16180 16181 16182 16183 16184 16185 16186 16187 16188 16189 16190 16191 16192 16193 16194 16195 16196 16197 16198 16199 16200 16201 16202 16203 16204 16205 16206 16207 16208 16209 16210 16211 16212 16213 16214 16215 16216 16217 16218 16219 16220 16221 16222 16223 16224 16225 16226 16227 16228 16229 16230 16231 16232 16233 16234 16235 16236 16237 16238 16239 16240 16241 16242 16243 16244 16245 16246 16247 16248 16249 16250 16251 16252 16253 16254 16255 16256 16257 16258 16259 16260 16261 16262 16263 16264 16265 16266 16267 16268 16269 16270 16271 16272 16273 16274 16275 16276 16277 16278 16279 16280 16281 16282 16283 16284 16285 16286 16287 16288 16289 16290 16291 16292 16293 16294 16295 16296 16297 16298 16299 16300 16301 16302 16303 16304 16305 16306 16307 16308 16309 16310 16311 16312 16313 16314 16315 16316 16317 16318 16319 16320 16321 16322 16323 16324 16325 16326 16327 16328 16329 16330 16331 16332 16333 16334 16335 16336 16337 16338 16339 16340 16341 16342 16343 16344 16345 16346 16347 16348 16349 16350 16351 16352 16353 16354 16355 16356 16357 16358 16359 16360 16361 16362 16363 16364 16365 16366 16367 16368 16369 16370 16371 16372 16373 16374 16375 16376 16377 16378 16379 16380 16381 16382 16383" + + } + Shading: T + Culling: "CullingOff" + } + Material: 1219907619056, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "notes", "KString", "", "U", "lambert1 notes:&lf;&lf;- material&lf;- "lambertian"&lf;- unicode: aß???&lf;- tab &lf;- cr &lf;" + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1220735619184, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationLayer: 1222481048224, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1222455584432,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1222481048224,1220735619184 + + ;Geometry::, Model::pCube1 + C: "OO",1222860050400,1222455584432 + + ;Material::lambert1, Model::pCube1 + C: "OO",1219907619056,1222455584432 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + } +} diff --git a/modules/ufbx/data/maya_notes_7700_binary.fbx b/modules/ufbx/data/maya_notes_7700_binary.fbx new file mode 100644 index 0000000..7754a6a Binary files /dev/null and b/modules/ufbx/data/maya_notes_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_nurbs_curve_form_6100_ascii.fbx b/modules/ufbx/data/maya_nurbs_curve_form_6100_ascii.fbx new file mode 100644 index 0000000..0b06867 --- /dev/null +++ b/modules/ufbx/data/maya_nurbs_curve_form_6100_ascii.fbx @@ -0,0 +1,485 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 1 + Day: 22 + Hour: 20 + Minute: 53 + Second: 56 + Millisecond: 679 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "Model" { + Count: 3 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 3 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::circleOpen", "NurbsCurve" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + } + Model: "Model::circleClosed", "NurbsCurve" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + } + Model: "Model::circlePeriodic", "NurbsCurve" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + } + Geometry: "Geometry::circleOpen_ncl1_1", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Open" + Rational: 0 + Points: 8.32667268468867e-17,6.12323399573676e-17,-1,1,-0.5,6.12323399573676e-17,-1,1,-1,3.06161699786838e-17,-0.5,1,-1,6.16297582203915e-33 + ,-1.11022302462516e-16,1 + KnotVector: 0,0,0,0,1,1,1,1 + NodeAttributeName: "Geometry::circleOpen_ncl1_1" + } + Geometry: "Geometry::circleClosed_ncl1_1", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Closed" + Rational: 0 + Points: -1,3.08148791101958e-33,-1.11022302462516e-16,1,-1,-3.06161699786838e-17,0.5,1,-2.58381963629825e-16,-9.18485099360515e-17 + ,1.5,1,1.5,-2.34692570239724e-32,3.83282053900155e-16,1,9.18485099360515e-17,9.18485099360515e-17,-1.5,1,-1,3.06161699786838e-17 + ,-0.5,1 + KnotVector: 1,1,1,1,2,3,4,5,5,5,5 + NodeAttributeName: "Geometry::circleClosed_ncl1_1" + } + Geometry: "Geometry::circlePeriodic_ncl1_1", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Periodic" + Rational: 0 + Points: 1.5,-2.34692570239724e-32,3.83282053900155e-16,1,9.18485099360515e-17,9.18485099360515e-17,-1.5,1,-1.5,1.12325773629504e-32 + ,-1.83441909467627e-16,1,-2.58381963629825e-16,-9.18485099360515e-17,1.5,1 + KnotVector: -3,-2,-1,0,1,2,3,4,5,6,7 + NodeAttributeName: "Geometry::circlePeriodic_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_form_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_form_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "22/01/2022 18:53:56.678" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_form_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "22/01/2022 18:53:56.678" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\nurbs_form.mb" + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::circleOpen", "Model::Scene" + Connect: "OO", "Model::circleClosed", "Model::Scene" + Connect: "OO", "Model::circlePeriodic", "Model::Scene" + Connect: "OO", "Geometry::circleOpen_ncl1_1", "Model::circleOpen" + Connect: "OO", "Geometry::circleClosed_ncl1_1", "Model::circleClosed" + Connect: "OO", "Geometry::circlePeriodic_ncl1_1", "Model::circlePeriodic" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_nurbs_curve_form_6100_binary.fbx b/modules/ufbx/data/maya_nurbs_curve_form_6100_binary.fbx new file mode 100644 index 0000000..cac5edb Binary files /dev/null and b/modules/ufbx/data/maya_nurbs_curve_form_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_nurbs_curve_form_7700_ascii.fbx b/modules/ufbx/data/maya_nurbs_curve_form_7700_ascii.fbx new file mode 100644 index 0000000..ca5e0f9 --- /dev/null +++ b/modules/ufbx/data/maya_nurbs_curve_form_7700_ascii.fbx @@ -0,0 +1,358 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 1 + Day: 21 + Hour: 23 + Minute: 30 + Second: 1 + Millisecond: 949 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_form_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_form_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "21/01/2022 21:30:01.947" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_form_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "21/01/2022 21:30:01.947" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\nurbs_form.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2221191467184, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 9 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 3 + PropertyTemplate: "FbxNurbsCurve" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 3 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2221202965408, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Open" + Rational: 0 + Points: *16 { + a: 8.32667268468867e-17,6.12323399573676e-17,-1,1,-0.5,6.12323399573676e-17,-1,1,-1,3.06161699786838e-17,-0.5,1,-1,6.16297582203915e-33,-1.11022302462516e-16,1 + } + KnotVector: *8 { + a: 0,0,0,0,1,1,1,1 + } + } + Geometry: 2221202966368, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Closed" + Rational: 0 + Points: *24 { + a: -1,3.08148791101958e-33,-1.11022302462516e-16,1,-1,-3.06161699786838e-17,0.5,1,-2.58381963629825e-16,-9.18485099360515e-17,1.5,1,1.5,-2.34692570239724e-32,3.83282053900155e-16,1,9.18485099360515e-17,9.18485099360515e-17,-1.5,1,-1,3.06161699786838e-17,-0.5,1 + } + KnotVector: *11 { + a: 1,1,1,1,2,3,4,5,5,5,5 + } + } + Geometry: 2221202966048, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Periodic" + Rational: 0 + Points: *16 { + a: 1.5,-2.34692570239724e-32,3.83282053900155e-16,1,9.18485099360515e-17,9.18485099360515e-17,-1.5,1,-1.5,1.12325773629504e-32,-1.83441909467627e-16,1,-2.58381963629825e-16,-9.18485099360515e-17,1.5,1 + } + KnotVector: *11 { + a: -3,-2,-1,0,1,2,3,4,5,6,7 + } + } + Model: 2221046271648, "Model::circleOpen", "NurbsCurve" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2221046241488, "Model::circleClosed", "NurbsCurve" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2221046250768, "Model::circlePeriodic", "NurbsCurve" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + AnimationStack: 2221044926160, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2221284472832, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::circleOpen, Model::RootNode + C: "OO",2221046271648,0 + + ;Model::circleClosed, Model::RootNode + C: "OO",2221046241488,0 + + ;Model::circlePeriodic, Model::RootNode + C: "OO",2221046250768,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2221284472832,2221044926160 + + ;Geometry::, Model::circleOpen + C: "OO",2221202965408,2221046271648 + + ;Geometry::, Model::circleClosed + C: "OO",2221202966368,2221046241488 + + ;Geometry::, Model::circlePeriodic + C: "OO",2221202966048,2221046250768 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_nurbs_curve_form_7700_binary.fbx b/modules/ufbx/data/maya_nurbs_curve_form_7700_binary.fbx new file mode 100644 index 0000000..ccecde6 Binary files /dev/null and b/modules/ufbx/data/maya_nurbs_curve_form_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_nurbs_curve_linear_6100_ascii.fbx b/modules/ufbx/data/maya_nurbs_curve_linear_6100_ascii.fbx new file mode 100644 index 0000000..4c3dd43 --- /dev/null +++ b/modules/ufbx/data/maya_nurbs_curve_linear_6100_ascii.fbx @@ -0,0 +1,279 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 1 + Day: 22 + Hour: 23 + Minute: 51 + Second: 16 + Millisecond: 555 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::curve1", "NurbsCurve" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + } + Geometry: "Geometry::curve1_ncl1_1", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 2 + Dimension: 3 + Form: "Periodic" + Rational: 0 + Points: 0,0,-1,1,1,0,-1,1,1,0,-2,1,2,0,-2,1,2,0,1,1,1,0,1,1,1,0,2,1,-1,0,2,1,-1,0,1,1,-2,0,1,1,-2,0,-2,1,-1,0,-2,1,-1,0,-1 + ,1,0,0,-1,1 + KnotVector: 0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,14 + NodeAttributeName: "Geometry::curve1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_linear_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_linear_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "22/01/2022 21:51:16.554" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_linear_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "22/01/2022 21:51:16.554" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::curve1", "Model::Scene" + Connect: "OO", "Geometry::curve1_ncl1_1", "Model::curve1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_nurbs_curve_multiplicity_6100_ascii.fbx b/modules/ufbx/data/maya_nurbs_curve_multiplicity_6100_ascii.fbx new file mode 100644 index 0000000..bab3c01 --- /dev/null +++ b/modules/ufbx/data/maya_nurbs_curve_multiplicity_6100_ascii.fbx @@ -0,0 +1,284 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 1 + Day: 22 + Hour: 23 + Minute: 34 + Second: 33 + Millisecond: 476 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::curve1", "NurbsCurve" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + } + Geometry: "Geometry::curve1_ncl1_1", "NurbsCurve" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 6 + Dimension: 3 + Form: "Open" + Rational: 0 + Points: 0,0,-1,1,0,0,0,1,1,0,0,1,1,0,-1,1,2,0,-1,1,2,0,0,1,3,0,0,1,3,0,-1,1,4,0,-1,1,4,0,4,1,2,0,6,1,-2,0,6,1,-4,0,4,1,-4 + ,0,0,1,-4,0,-1,1,-3,0,-1,1,-3,0,0,1,-2,0,0,1,-2,0,-1,1,-1,0,-1,1,-1,0,0,1,-1,0,1,1,0,0,1,1,0,0,2,1,0,0,3,1,2,0,3,1 + ,2,0,4,1,-2,0,4,1,-2,0,3,1,-1,0,3,1,1,0,3,1 + KnotVector: -8.31862581721007,-6.65490065376806,-4.99117549032604,-3.32745032688403,-1.66372516344201,0,1,2,3,13.862741699797 + ,13.862741699797,13.862741699797,13.862741699797,13.862741699797,17.5941125496954,27.6568542494924,27.6568542494924 + ,27.6568542494924,27.6568542494924,27.6568542494924,28.6568542494924,29.6568542494924,30.6568542494924,31.6568542494924 + ,32.6568542494924,39.6568542494924,39.6568542494924,39.6568542494924,39.6568542494924,39.6568542494924,41.4568542494924 + ,43.2568542494924,44.9205794129344,46.5843045763764,48.2480297398184,49.9117549032604,51.5754800667025 + NodeAttributeName: "Geometry::curve1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_multiplicity_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_multiplicity_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "22/01/2022 21:34:33.474" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_multiplicity_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "22/01/2022 21:34:33.474" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::curve1", "Model::Scene" + Connect: "OO", "Geometry::curve1_ncl1_1", "Model::curve1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_nurbs_curve_multiplicity_6100_binary.fbx b/modules/ufbx/data/maya_nurbs_curve_multiplicity_6100_binary.fbx new file mode 100644 index 0000000..fc40bf6 Binary files /dev/null and b/modules/ufbx/data/maya_nurbs_curve_multiplicity_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_nurbs_curve_multiplicity_7500_ascii.fbx b/modules/ufbx/data/maya_nurbs_curve_multiplicity_7500_ascii.fbx new file mode 100644 index 0000000..7a157a7 --- /dev/null +++ b/modules/ufbx/data/maya_nurbs_curve_multiplicity_7500_ascii.fbx @@ -0,0 +1,290 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 1 + Day: 22 + Hour: 23 + Minute: 22 + Second: 18 + Millisecond: 9 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_multiplicity_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_multiplicity_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "22/01/2022 21:22:18.008" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_nurbs_curve_multiplicity_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "22/01/2022 21:22:18.008" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1937442980480, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 5 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxNurbsCurve" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1938356174672, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 6 + Dimension: 3 + Form: "Open" + Rational: 0 + Points: *124 { + a: 0,0,-1,1,0,0,0,1,1,0,0,1,1,0,-1,1,2,0,-1,1,2,0,0,1,3,0,0,1,3,0,-1,1,4,0,-1,1,4,0,4,1,2,0,6,1,-2,0,6,1,-4,0,4,1,-4,0,0,1,-4,0,-1,1,-3,0,-1,1,-3,0,0,1,-2,0,0,1,-2,0,-1,1,-1,0,-1,1,-1,0,0,1,-1,0,1,1,0,0,1,1,0,0,2,1,0,0,3,1,2,0,3,1,2,0,4,1,-2,0,4,1,-2,0,3,1,-1,0,3,1,1,0,3,1 + } + KnotVector: *37 { + a: -8.31862581721007,-6.65490065376806,-4.99117549032604,-3.32745032688403,-1.66372516344201,0,1,2,3,13.862741699797,13.862741699797,13.862741699797,13.862741699797,13.862741699797,17.5941125496954,27.6568542494924,27.6568542494924,27.6568542494924,27.6568542494924,27.6568542494924,28.6568542494924,29.6568542494924,30.6568542494924,31.6568542494924,32.6568542494924,39.6568542494924,39.6568542494924,39.6568542494924,39.6568542494924,39.6568542494924,41.4568542494924,43.2568542494924,44.9205794129344,46.5843045763764,48.2480297398184,49.9117549032604,51.5754800667025 + } + } + Model: 1938456509104, "Model::curve1", "NurbsCurve" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + AnimationStack: 1938361350544, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1938352527824, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::curve1, Model::RootNode + C: "OO",1938456509104,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1938352527824,1938361350544 + + ;Geometry::, Model::curve1 + C: "OO",1938356174672,1938456509104 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_nurbs_curve_multiplicity_7500_binary.fbx b/modules/ufbx/data/maya_nurbs_curve_multiplicity_7500_binary.fbx new file mode 100644 index 0000000..d7214c4 Binary files /dev/null and b/modules/ufbx/data/maya_nurbs_curve_multiplicity_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_nurbs_low_sphere.obj b/modules/ufbx/data/maya_nurbs_low_sphere.obj new file mode 100644 index 0000000..c9c3c88 --- /dev/null +++ b/modules/ufbx/data/maya_nurbs_low_sphere.obj @@ -0,0 +1,134 @@ +# ufbx:bad_uvs +# ufbx:bad_normals +# This file uses centimeters as units for non-parametric coordinates. + +g default +v 1.000000 0.000000 0.000000 +v 0.000000 0.000000 1.000000 +v 0.687500 0.000000 0.687500 +v 0.676777 -0.687500 -0.000000 +v 0.465284 -0.687500 0.465284 +v 0.000000 -0.687500 0.676777 +v 0.676777 0.687500 0.000000 +v 0.465284 0.687500 0.465284 +v 0.000000 0.687500 0.676777 +v -1.000000 0.000000 0.000000 +v -0.687500 0.000000 0.687500 +v -0.465284 -0.687500 0.465284 +v -0.676777 -0.687500 -0.000000 +v -0.465284 0.687500 0.465284 +v -0.676777 0.687500 0.000000 +v -0.000000 0.000000 -1.000000 +v -0.687500 0.000000 -0.687500 +v -0.465284 -0.687500 -0.465284 +v -0.000000 -0.687500 -0.676777 +v -0.465284 0.687500 -0.465284 +v -0.000000 0.687500 -0.676777 +v -0.000000 -1.000000 -0.000000 +v 0.687500 0.000000 -0.687500 +v 0.465284 -0.687500 -0.465284 +v 0.000000 1.000000 0.000000 +v 0.465284 0.687500 -0.465284 +vt 0.500000 0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.125000 +vt 0.250000 0.000000 +vt 0.250000 0.125000 +vt 0.250000 0.250000 +vt 0.750000 1.000000 +vt 0.750000 0.125000 +vt 0.750000 0.250000 +vt 0.500000 0.500000 +vt 0.500000 0.375000 +vt 0.250000 0.375000 +vt 0.250000 0.500000 +vt 0.750000 0.375000 +vt 0.750000 0.500000 +vt 0.500000 0.750000 +vt 0.500000 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.750000 +vt 0.750000 0.625000 +vt 0.750000 0.750000 +vt 0.000000 0.000000 +vt 0.500000 0.875000 +vt 0.250000 0.875000 +vt 1.000000 1.000000 +vt 0.750000 0.875000 +vt 1.000000 0.500000 +vt 1.000000 0.250000 +vt 0.000000 0.125000 +vt 0.750000 0.000000 +vt 1.000000 0.125000 +vt 0.000000 0.250000 +vt 0.000000 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.750000 +vt 0.000000 0.500000 +vt 0.000000 0.625000 +vt 1.000000 0.625000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt 0.000000 0.750000 +vt 0.000000 0.875000 +vt 1.000000 0.875000 +vn 0.000000 1.000000 0.000000 +vn 0.835450 0.549567 0.000000 +vn 0.592585 0.545607 -0.592585 +vn -0.835450 0.549567 0.000000 +vn -0.592585 0.545607 0.592585 +vn -0.000000 0.549567 0.835450 +vn 0.592585 0.545607 0.592585 +vn 0.707107 0.000000 0.707107 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.549567 0.835450 +vn 0.592585 -0.545607 0.592585 +vn 0.835450 -0.549567 -0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.835450 -0.549567 -0.000000 +vn -0.592585 -0.545607 0.592585 +vn -0.707107 0.000000 0.707107 +vn 0.000000 0.549567 -0.835450 +vn -0.592585 0.545607 -0.592585 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.549567 -0.835450 +vn -0.592585 -0.545607 -0.592585 +vn -0.707107 0.000000 -0.707107 +vn 0.592585 -0.545607 -0.592585 +vn 0.707107 0.000000 -0.707107 +s 1 +g nurbsSphere1 +f 25/25/1 7/7/2 26/26/3 +f 25/27/1 15/15/4 14/14/5 +f 25/28/1 9/9/6 8/8/7 +f 3/3/8 2/2/9 6/6/10 5/5/11 +f 4/4/12 1/1/13 3/3/8 5/5/11 +f 22/22/14 4/4/12 5/5/11 +f 6/6/10 22/29/14 5/5/11 +f 7/30/2 25/31/1 8/8/7 +f 1/1/13 7/30/2 8/8/7 3/3/8 +f 9/9/6 2/2/9 3/3/8 8/8/7 +f 10/10/15 13/13/16 12/12/17 11/11/18 +f 6/6/10 2/2/9 11/11/18 12/12/17 +f 22/32/14 6/6/10 12/12/17 +f 13/13/16 22/33/14 12/12/17 +f 25/34/1 14/14/5 9/9/6 +f 14/14/5 11/11/18 2/2/9 9/9/6 +f 15/15/4 10/10/15 11/11/18 14/14/5 +f 25/35/1 21/21/19 20/20/20 +f 16/16/21 19/19/22 18/18/23 17/17/24 +f 13/13/16 10/10/15 17/17/24 18/18/23 +f 22/36/14 13/13/16 18/18/23 +f 19/19/22 22/37/14 18/18/23 +f 25/38/1 20/20/20 15/15/4 +f 20/20/20 17/17/24 10/10/15 15/15/4 +f 21/21/19 16/16/21 17/17/24 20/20/20 +f 1/39/13 4/40/12 24/24/25 23/23/26 +f 19/19/22 16/16/21 23/23/26 24/24/25 +f 22/41/14 19/19/22 24/24/25 +f 4/40/12 22/42/14 24/24/25 +f 25/43/1 26/26/3 21/21/19 +f 26/26/3 23/23/26 16/16/21 21/21/19 +f 7/7/2 1/39/13 23/23/26 26/26/3 diff --git a/modules/ufbx/data/maya_nurbs_low_sphere_7500_ascii.fbx b/modules/ufbx/data/maya_nurbs_low_sphere_7500_ascii.fbx new file mode 100644 index 0000000..104e8c7 --- /dev/null +++ b/modules/ufbx/data/maya_nurbs_low_sphere_7500_ascii.fbx @@ -0,0 +1,354 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 1 + Day: 23 + Hour: 4 + Minute: 32 + Second: 19 + Millisecond: 965 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_nurbs_low_sphere_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_nurbs_low_sphere_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "23/01/2022 02:32:19.964" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_nurbs_low_sphere_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "23/01/2022 02:32:19.964" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\maya_nurbs_plane.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1938734846496, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxNurbsSurface" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1938278993568, "Geometry::", "NurbsSurface" { + Type: "NurbsSurface" + NurbsSurfaceVersion: 100 + SurfaceDisplay: 4,2,2 + NurbsSurfaceOrder: 4,4 + Dimensions: 5,4 + Step: 2,2 + Form: "Open", "Periodic" + Points: *80 { + a: -9.18485099360515e-17,-1,-3.36777869765522e-16,1,-1.85933797259107e-16,-1,-0.707106781186548,1,-3.05084780733048e-16,3.45020997563063e-16,-2.29289321881345,1,-2.23677738700413e-18,1,-0.707106781186547,1,9.18485099360515e-17,1,1.53080849893419e-16,1,-9.18485099360515e-17,-1,-3.36777869765522e-16,1,0.707106781186548,-1,-1.09783047081644e-16,1,2.29289321881345,2.04621780502735e-16,1.40399217060328e-16,1,0.707106781186547,1,1.96378652705194e-16,1,9.18485099360515e-17,1,1.53080849893419e-16,1,-9.18485099360515e-17,-1,-3.36777869765522e-16,1,9.17282497380806e-17,-1,0.707106781186548,1,-3.8996061098135e-19,6.42225634424062e-17,2.29289321881345,1,-9.19687701340223e-17,1,0.707106781186548,1,9.18485099360515e-17,1,1.53080849893419e-16,1,-9.18485099360515e-17,-1,-3.36777869765522e-16,1,-0.707106781186548,-1,6.58229901010979e-17,1,-2.29289321881345,2.04621780502735e-16,1.1416306739303e-16,1,-0.707106781186547,1,4.59065014373025e-18,1,9.18485099360515e-17,1,1.53080849893419e-16,1 + } + KnotVectorU: *9 { + a: 0,0,0,0,1,2,2,2,2 + } + KnotVectorV: *11 { + a: -3,-2,-1,0,1,2,3,4,5,6,7 + } + GeometryVersion: 124 + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + FlipNormals: 0 + } + Model: 1938456527664, "Model::nurbsSphere1", "NurbsSurface" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: T + Culling: "CullingOff" + } + Material: 1938722575072, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1937264084688, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1938343619664, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::nurbsSphere1, Model::RootNode + C: "OO",1938456527664,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1938343619664,1937264084688 + + ;Geometry::, Model::nurbsSphere1 + C: "OO",1938278993568,1938456527664 + + ;Material::lambert1, Model::nurbsSphere1 + C: "OO",1938722575072,1938456527664 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_nurbs_surface_plane.obj b/modules/ufbx/data/maya_nurbs_surface_plane.obj new file mode 100644 index 0000000..a65379e --- /dev/null +++ b/modules/ufbx/data/maya_nurbs_surface_plane.obj @@ -0,0 +1,453 @@ +# ufbx:bad_normals +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -0.500000 -0.550589 0.500000 +v 0.500000 -0.550589 0.500000 +v 0.295945 0.000000 -0.349350 +v -0.500000 0.392449 -0.500000 +v 0.493623 -0.000000 0.004708 +v -0.500000 0.380185 0.000000 +v -0.000000 -0.550589 0.500000 +v -0.001594 0.095046 0.001177 +v -0.000000 0.043136 0.250000 +v -0.500000 0.198352 0.250000 +v -0.250000 -0.550589 0.500000 +v -0.250000 0.140146 0.250000 +v -0.250000 -0.209141 0.416667 +v -0.500000 -0.200087 0.416667 +v -0.375000 -0.550589 0.500000 +v -0.375000 -0.202727 0.416667 +v -0.250000 0.010509 0.333333 +v -0.500000 0.041553 0.333333 +v -0.375000 0.032498 0.333333 +v -0.375000 0.181376 0.250000 +v -0.000000 -0.224231 0.416667 +v -0.125000 -0.550589 0.500000 +v -0.125000 -0.217063 0.416667 +v -0.000000 -0.041230 0.333333 +v -0.125000 -0.016654 0.333333 +v -0.125000 0.089216 0.250000 +v -0.250199 0.273258 0.000147 +v -0.500000 0.294336 0.166667 +v -0.250000 0.211554 0.166667 +v -0.375000 0.270192 0.166667 +v -0.500000 0.351058 0.083333 +v -0.250025 0.252323 0.083352 +v -0.375003 0.322260 0.083336 +v -0.375025 0.348998 0.000018 +v -0.000000 0.073584 0.166667 +v -0.125000 0.139120 0.166667 +v -0.000199 0.087764 0.083480 +v -0.125084 0.165930 0.083395 +v -0.125673 0.179697 0.000497 +v 0.500000 -0.008603 0.250000 +v 0.250000 -0.550589 0.500000 +v 0.250000 -0.002136 0.250000 +v 0.250000 -0.231274 0.416667 +v 0.125000 -0.550589 0.500000 +v 0.125000 -0.228884 0.416667 +v 0.250000 -0.065374 0.333333 +v 0.125000 -0.057182 0.333333 +v 0.125000 0.013224 0.250000 +v 0.500000 -0.232280 0.416667 +v 0.375000 -0.550589 0.500000 +v 0.375000 -0.232154 0.416667 +v 0.500000 -0.068824 0.333333 +v 0.375000 -0.068392 0.333333 +v 0.375000 -0.007795 0.250000 +v 0.245417 0.011881 0.003384 +v 0.250000 0.009198 0.166667 +v 0.125000 0.031043 0.166667 +v 0.249427 0.010971 0.083756 +v 0.124623 0.037026 0.083611 +v 0.121986 0.040098 0.002225 +v 0.500000 -0.000000 0.166667 +v 0.375000 0.001150 0.166667 +v 0.499203 -0.000000 0.083922 +v 0.374268 0.001371 0.083874 +v 0.369146 0.001485 0.004322 +v -0.051014 0.098112 -0.462337 +v -0.500000 0.392449 -0.250000 +v -0.024112 0.098112 -0.232199 +v -0.253014 0.282072 -0.247775 +v -0.500000 0.390916 -0.083333 +v -0.250673 0.280971 -0.082837 +v -0.375084 0.358848 -0.083271 +v -0.500000 0.392449 -0.166667 +v -0.251594 0.282072 -0.165490 +v -0.375199 0.360256 -0.166520 +v -0.375377 0.360256 -0.249722 +v -0.005380 0.097729 -0.079361 +v -0.127270 0.184769 -0.081658 +v -0.012753 0.098112 -0.157251 +v -0.130380 0.185493 -0.162694 +v -0.135172 0.185493 -0.242490 +v -0.256377 0.282072 -0.495292 +v -0.500000 0.392449 -0.333333 +v -0.254583 0.282072 -0.329950 +v -0.375573 0.360256 -0.332910 +v -0.500000 0.392449 -0.416667 +v -0.255854 0.282072 -0.412345 +v -0.375732 0.360256 -0.416126 +v -0.375797 0.360256 -0.499412 +v -0.036666 0.098112 -0.306263 +v -0.140469 0.185493 -0.321913 +v -0.046829 0.098112 -0.382094 +v -0.144756 0.185493 -0.402081 +v -0.146521 0.185493 -0.484111 +v 0.403552 0.000000 -0.178794 +v 0.180678 0.012264 -0.198821 +v 0.234531 0.012216 -0.071913 +v 0.114828 0.041229 -0.075823 +v 0.213334 0.012264 -0.139597 +v 0.100888 0.041391 -0.148865 +v 0.079413 0.041391 -0.216344 +v 0.478479 0.000000 -0.067444 +v 0.355244 0.001527 -0.068748 +v 0.448986 0.000000 -0.129004 +v 0.328171 0.001533 -0.132094 +v 0.286464 0.001533 -0.184635 +v 0.103335 0.012264 -0.391720 +v 0.144585 0.012264 -0.255507 +v 0.055678 0.041391 -0.282154 +v 0.115366 0.012264 -0.317269 +v 0.036464 0.041391 -0.351302 +v 0.028552 0.041391 -0.428794 +v 0.353335 0.000000 -0.225053 +v 0.240366 0.001533 -0.233936 +v 0.312684 0.000000 -0.278374 +v 0.203049 0.001533 -0.289719 +v 0.187684 0.001533 -0.361708 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.500000 0.250000 +vt 0.000000 0.250000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.250000 0.083333 +vt 0.000000 0.083333 +vt 0.125000 0.000000 +vt 0.125000 0.083333 +vt 0.250000 0.166667 +vt 0.000000 0.166667 +vt 0.125000 0.166667 +vt 0.125000 0.250000 +vt 0.500000 0.083333 +vt 0.375000 0.000000 +vt 0.375000 0.083333 +vt 0.500000 0.166667 +vt 0.375000 0.166667 +vt 0.375000 0.250000 +vt 0.250000 0.500000 +vt 0.000000 0.333333 +vt 0.250000 0.333333 +vt 0.125000 0.333333 +vt 0.000000 0.416667 +vt 0.250000 0.416667 +vt 0.125000 0.416667 +vt 0.125000 0.500000 +vt 0.500000 0.333333 +vt 0.375000 0.333333 +vt 0.500000 0.416667 +vt 0.375000 0.416667 +vt 0.375000 0.500000 +vt 1.000000 0.250000 +vt 0.750000 0.000000 +vt 0.750000 0.250000 +vt 0.750000 0.083333 +vt 0.625000 0.000000 +vt 0.625000 0.083333 +vt 0.750000 0.166667 +vt 0.625000 0.166667 +vt 0.625000 0.250000 +vt 1.000000 0.083333 +vt 0.875000 0.000000 +vt 0.875000 0.083333 +vt 1.000000 0.166667 +vt 0.875000 0.166667 +vt 0.875000 0.250000 +vt 0.750000 0.500000 +vt 0.750000 0.333333 +vt 0.625000 0.333333 +vt 0.750000 0.416667 +vt 0.625000 0.416667 +vt 0.625000 0.500000 +vt 1.000000 0.333333 +vt 0.875000 0.333333 +vt 1.000000 0.416667 +vt 0.875000 0.416667 +vt 0.875000 0.500000 +vt 0.500000 1.000000 +vt 0.000000 0.750000 +vt 0.500000 0.750000 +vt 0.250000 0.750000 +vt 0.000000 0.583333 +vt 0.250000 0.583333 +vt 0.125000 0.583333 +vt 0.000000 0.666667 +vt 0.250000 0.666667 +vt 0.125000 0.666667 +vt 0.125000 0.750000 +vt 0.500000 0.583333 +vt 0.375000 0.583333 +vt 0.500000 0.666667 +vt 0.375000 0.666667 +vt 0.375000 0.750000 +vt 0.250000 1.000000 +vt 0.000000 0.833333 +vt 0.250000 0.833333 +vt 0.125000 0.833333 +vt 0.000000 0.916667 +vt 0.250000 0.916667 +vt 0.125000 0.916667 +vt 0.125000 1.000000 +vt 0.500000 0.833333 +vt 0.375000 0.833333 +vt 0.500000 0.916667 +vt 0.375000 0.916667 +vt 0.375000 1.000000 +vt 1.000000 0.750000 +vt 0.750000 0.750000 +vt 0.750000 0.583333 +vt 0.625000 0.583333 +vt 0.750000 0.666667 +vt 0.625000 0.666667 +vt 0.625000 0.750000 +vt 1.000000 0.583333 +vt 0.875000 0.583333 +vt 1.000000 0.666667 +vt 0.875000 0.666667 +vt 0.875000 0.750000 +vt 0.750000 1.000000 +vt 0.750000 0.833333 +vt 0.625000 0.833333 +vt 0.750000 0.916667 +vt 0.625000 0.916667 +vt 0.625000 1.000000 +vt 1.000000 0.833333 +vt 0.875000 0.833333 +vt 1.000000 0.916667 +vt 0.875000 0.916667 +vt 0.875000 1.000000 +vn 0.014600 0.999865 -0.007496 +vn 0.014422 0.999891 -0.003239 +vn 0.081662 0.996539 -0.015510 +vn 0.072124 0.996924 -0.030660 +vn 0.010736 0.999942 0.000626 +vn 0.011761 0.999930 -0.000952 +vn 0.046217 0.998928 -0.002575 +vn 0.042485 0.999090 0.003674 +vn 0.449067 0.885324 0.120586 +vn 0.487775 0.871932 0.042544 +vn 0.576707 0.812375 0.086353 +vn 0.531639 0.822140 0.203584 +vn 0.086808 0.519800 0.849866 +vn 0.236547 0.788273 0.568042 +vn 0.267814 0.699038 0.663039 +vn 0.101750 0.473736 0.874769 +vn 0.089210 0.432125 0.897390 +vn 0.229294 0.625736 0.745573 +vn 0.136206 0.581754 0.801880 +vn 0.053412 0.404325 0.913054 +vn 0.004230 0.233564 0.972332 +vn 0.006805 0.237342 0.971402 +vn 0.022325 0.285563 0.958100 +vn 0.013757 0.276710 0.960855 +vn 0.002452 0.232133 0.972681 +vn 0.007905 0.273476 0.961846 +vn 0.030265 0.394789 0.918273 +vn 0.077381 0.567146 0.819974 +vn 0.007312 0.242269 0.970182 +vn 0.005838 0.246955 0.969009 +vn 0.019703 0.309332 0.950750 +vn 0.024318 0.297523 0.954405 +vn 0.550907 0.823143 0.137614 +vn 0.379460 0.905274 0.191023 +vn 0.330624 0.859193 0.390481 +vn 0.498205 0.814086 0.298423 +vn 0.391181 0.765683 0.510594 +vn 0.243784 0.752735 0.611522 +vn 0.142445 0.749576 0.646410 +vn 0.200018 0.882043 0.426606 +vn 0.234018 0.948411 0.213896 +vn 0.375525 0.890528 0.256789 +vn 0.437272 0.813309 0.383825 +vn 0.002142 0.596620 0.802521 +vn 0.005904 0.923431 0.383719 +vn 0.023561 0.920048 0.391097 +vn 0.008509 0.593696 0.804645 +vn 0.027075 0.582897 0.812095 +vn 0.075344 0.904685 0.419366 +vn 0.154840 0.863768 0.479510 +vn 0.055721 0.558892 0.827366 +vn 0.003526 0.250346 0.968150 +vn 0.001650 0.252238 0.967664 +vn 0.005722 0.323762 0.946121 +vn 0.012093 0.318433 0.947868 +vn 0.000509 0.253031 0.967458 +vn 0.000128 0.253218 0.967409 +vn 0.000446 0.326752 0.945110 +vn 0.001777 0.326120 0.945327 +vn 0.151879 0.988396 -0.002335 +vn 0.316337 0.948582 0.011102 +vn 0.288316 0.955871 0.056433 +vn 0.138087 0.990245 0.018614 +vn 0.115270 0.989437 0.087905 +vn 0.240793 0.958553 0.152300 +vn 0.008939 0.998526 0.053544 +vn 0.035686 0.997560 0.060000 +vn 0.644338 0.764099 -0.031325 +vn 0.664782 0.746873 -0.015681 +vn 0.660815 0.750048 -0.027396 +vn 0.630071 0.774546 -0.055578 +vn 0.535348 0.842206 -0.063961 +vn 0.568702 0.817421 -0.091654 +vn 0.628937 0.776101 -0.045889 +vn 0.612178 0.790111 -0.031023 +vn 0.405246 0.914193 0.005117 +vn 0.580986 0.813886 -0.006724 +vn 0.588387 0.808427 -0.015738 +vn 0.407617 0.913148 -0.003064 +vn 0.571905 0.819519 0.036245 +vn 0.398971 0.915099 0.058445 +vn 0.246735 0.966728 0.067520 +vn 0.249565 0.968322 0.008313 +vn 0.250122 0.968214 -0.000281 +vn 0.511357 0.859182 -0.017932 +vn 0.597777 0.801606 0.009526 +vn 0.602758 0.797905 -0.005448 +vn 0.410493 0.911863 -0.001069 +vn 0.411385 0.911460 -0.001837 +vn 0.602366 0.798164 -0.009416 +vn 0.596159 0.802726 -0.015054 +vn 0.409639 0.912243 -0.002919 +vn 0.250466 0.968125 -0.000267 +vn 0.250739 0.968055 -0.000168 +vn 0.250845 0.968027 -0.000098 +vn 0.605501 0.790650 -0.090782 +vn 0.647190 0.761041 -0.044285 +vn 0.012797 0.999894 -0.007007 +vn 0.013502 0.999838 -0.011952 +vn 0.060193 0.997242 -0.043425 +vn 0.052405 0.998315 -0.024918 +vn 0.210710 0.971443 -0.109086 +vn 0.410799 0.902670 -0.128184 +vn 0.365261 0.927095 -0.084138 +vn 0.179372 0.981574 -0.065873 +vn 0.162690 0.986260 -0.028689 +vn 0.337343 0.940760 -0.034214 +vn 0.012334 0.999918 -0.003360 +vn 0.048585 0.998754 -0.011406 +vn 0.295058 0.954590 -0.041204 +vn 0.525565 0.849496 -0.046226 +vn 0.492830 0.866168 -0.082889 +vn 0.262219 0.962063 -0.075343 +vn 0.246688 0.961418 -0.121739 +vn 0.463150 0.876015 -0.134495 +vn 0.014375 0.999808 -0.013311 +vn 0.068096 0.996442 -0.049665 +s 1 +g nurbsPlane1 +f 115/115/1 3/3/2 117/117/3 116/116/4 +f 63/63/5 5/5/6 65/65/7 64/64/8 +f 37/37/9 8/8/10 39/39/11 38/38/12 +f 24/24/13 9/9/14 26/26/15 25/25/16 +f 17/17/17 12/12/18 20/20/19 19/19/20 +f 15/15/21 11/11/22 13/13/23 16/16/24 +f 1/1/25 15/15/21 16/16/24 14/14/26 +f 13/13/23 17/17/17 19/19/20 16/16/24 +f 19/19/20 18/18/27 14/14/26 16/16/24 +f 20/20/19 10/10/28 18/18/27 19/19/20 +f 22/22/29 7/7/30 21/21/31 23/23/32 +f 11/11/22 22/22/29 23/23/32 13/13/23 +f 21/21/31 24/24/13 25/25/16 23/23/32 +f 25/25/16 17/17/17 13/13/23 23/23/32 +f 26/26/15 12/12/18 17/17/17 25/25/16 +f 27/27/33 34/34/34 33/33/35 32/32/36 +f 20/20/19 12/12/18 29/29/37 30/30/38 +f 28/28/39 10/10/28 20/20/19 30/30/38 +f 30/30/38 29/29/37 32/32/36 33/33/35 +f 31/31/40 28/28/39 30/30/38 33/33/35 +f 34/34/34 6/6/41 31/31/40 33/33/35 +f 9/9/14 35/35/42 36/36/43 26/26/15 +f 36/36/43 29/29/37 12/12/18 26/26/15 +f 35/35/42 37/37/9 38/38/12 36/36/43 +f 38/38/12 32/32/36 29/29/37 36/36/43 +f 39/39/11 27/27/33 32/32/36 38/38/12 +f 52/52/44 40/40/45 54/54/46 53/53/47 +f 46/46/48 42/42/49 48/48/50 47/47/51 +f 44/44/52 41/41/53 43/43/54 45/45/55 +f 7/7/30 44/44/52 45/45/55 21/21/31 +f 43/43/54 46/46/48 47/47/51 45/45/55 +f 47/47/51 24/24/13 21/21/31 45/45/55 +f 48/48/50 9/9/14 24/24/13 47/47/51 +f 50/50/56 2/2/57 49/49/58 51/51/59 +f 41/41/53 50/50/56 51/51/59 43/43/54 +f 49/49/58 52/52/44 53/53/47 51/51/59 +f 53/53/47 46/46/48 43/43/54 51/51/59 +f 54/54/46 42/42/49 46/46/48 53/53/47 +f 55/55/60 60/60/61 59/59/62 58/58/63 +f 48/48/50 42/42/49 56/56/64 57/57/65 +f 35/35/42 9/9/14 48/48/50 57/57/65 +f 57/57/65 56/56/64 58/58/63 59/59/62 +f 37/37/9 35/35/42 57/57/65 59/59/62 +f 60/60/61 8/8/10 37/37/9 59/59/62 +f 40/40/45 61/61/66 62/62/67 54/54/46 +f 62/62/67 56/56/64 42/42/49 54/54/46 +f 61/61/66 63/63/5 64/64/8 62/62/67 +f 64/64/8 58/58/63 56/56/64 62/62/67 +f 65/65/7 55/55/60 58/58/63 64/64/8 +f 66/66/68 94/94/69 93/93/70 92/92/71 +f 79/79/72 68/68/73 81/81/74 80/80/75 +f 75/75/76 74/74/77 69/69/78 76/76/79 +f 34/34/34 27/27/33 71/71/80 72/72/81 +f 70/70/82 6/6/41 34/34/34 72/72/81 +f 72/72/81 71/71/80 74/74/77 75/75/76 +f 73/73/83 70/70/82 72/72/81 75/75/76 +f 67/67/84 73/73/83 75/75/76 76/76/79 +f 39/39/11 8/8/10 77/77/85 78/78/86 +f 27/27/33 39/39/11 78/78/86 71/71/80 +f 77/77/85 79/79/72 80/80/75 78/78/86 +f 80/80/75 74/74/77 71/71/80 78/78/86 +f 81/81/74 69/69/78 74/74/77 80/80/75 +f 82/82/87 89/89/88 88/88/89 87/87/90 +f 76/76/79 69/69/78 84/84/91 85/85/92 +f 83/83/93 67/67/84 76/76/79 85/85/92 +f 85/85/92 84/84/91 87/87/90 88/88/89 +f 86/86/94 83/83/93 85/85/92 88/88/89 +f 89/89/88 4/4/95 86/86/94 88/88/89 +f 81/81/74 68/68/73 90/90/96 91/91/97 +f 84/84/91 69/69/78 81/81/74 91/91/97 +f 91/91/97 90/90/96 92/92/71 93/93/70 +f 87/87/90 84/84/91 91/91/97 93/93/70 +f 94/94/69 82/82/87 87/87/90 93/93/70 +f 104/104/98 95/95/99 106/106/100 105/105/101 +f 96/96/102 101/101/103 100/100/104 99/99/105 +f 60/60/61 55/55/60 97/97/106 98/98/107 +f 77/77/85 8/8/10 60/60/61 98/98/107 +f 98/98/107 97/97/106 99/99/105 100/100/104 +f 79/79/72 77/77/85 98/98/107 100/100/104 +f 101/101/103 68/68/73 79/79/72 100/100/104 +f 5/5/6 102/102/108 103/103/109 65/65/7 +f 103/103/109 97/97/106 55/55/60 65/65/7 +f 102/102/108 104/104/98 105/105/101 103/103/109 +f 105/105/101 99/99/105 97/97/106 103/103/109 +f 106/106/100 96/96/102 99/99/105 105/105/101 +f 107/107/110 112/112/111 111/111/112 110/110/113 +f 101/101/103 96/96/102 108/108/114 109/109/115 +f 90/90/96 68/68/73 101/101/103 109/109/115 +f 109/109/115 108/108/114 110/110/113 111/111/112 +f 92/92/71 90/90/96 109/109/115 111/111/112 +f 112/112/111 66/66/68 92/92/71 111/111/112 +f 95/95/99 113/113/116 114/114/117 106/106/100 +f 114/114/117 108/108/114 96/96/102 106/106/100 +f 113/113/116 115/115/1 116/116/4 114/114/117 +f 116/116/4 110/110/113 108/108/114 114/114/117 +f 117/117/3 107/107/110 110/110/113 116/116/4 diff --git a/modules/ufbx/data/maya_nurbs_surface_plane_6100_ascii.fbx b/modules/ufbx/data/maya_nurbs_surface_plane_6100_ascii.fbx new file mode 100644 index 0000000..c1daefa --- /dev/null +++ b/modules/ufbx/data/maya_nurbs_surface_plane_6100_ascii.fbx @@ -0,0 +1,340 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 1 + Day: 23 + Hour: 1 + Minute: 28 + Second: 2 + Millisecond: 87 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 5 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::nurbsPlane1", "NurbsSurface" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + } + Geometry: "Geometry::nurbsPlane1_ncl1_1", "NurbsSurface" { + Properties60: { + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "",0,0,0 + Property: "BBoxMax", "Vector3D", "",0,0,0 + Property: "Primary Visibility", "bool", "",1 + Property: "Casts Shadows", "bool", "",1 + Property: "Receive Shadows", "bool", "",1 + } + Type: "NurbsSurface" + NurbsSurfaceVersion: 100 + SurfaceDisplay: 4,4,4 + NurbsSurfaceOrder: 4,4 + Dimensions: 5,6 + Step: 4,4 + Form: "Open", "Open" + Points: -0.5,-0.550588694037046,0.5,1,-0.333333333333333,-0.550588694037046,0.5,1,-2.77555756156289e-17,-0.550588694037046 + ,0.5,1,0.333333333333333,-0.550588694037046,0.5,1,0.5,-0.550588694037046,0.5,1,-0.5,3.4017966642982e-18,0.388888888888889 + ,1,-0.333333333333333,3.4017966642982e-18,0.388888888888889,1,-2.77555756156289e-17,3.4017966642982e-18,0.388888888888889 + ,1,0.333333333333333,3.4017966642982e-18,0.388888888888889,1,0.5,-2.38125766500874e-17,0.388888888888889,1,-0.5,0.39244859144358 + ,0.166666666666667,1,-0.333333333333333,0.39244859144358,0.166666666666667,1,-2.77555756156289e-17,-1.02053899928946e-17 + ,0.166666666666667,1,0.333333333333333,-1.02053899928946e-17,0.166666666666667,1,0.5,-1.02053899928946e-17,0.166666666666667 + ,1,-0.5,0.39244859144358,-0.166666666666667,1,-0.333333333333333,0.39244859144358,-0.166666666666667,1,-2.77555756156289e-17 + ,1.02053899928946e-17,-0.166666666666667,1,0.333333333333333,1.02053899928946e-17,-0.166666666666667,1,0.5,1.02053899928946e-17 + ,-0.166666666666667,1,-0.5,0.39244859144358,-0.388888888888889,1,-0.333333333333333,0.39244859144358,-0.388888888888889 + ,1,-2.77555756156289e-17,2.38125766500874e-17,-0.388888888888889,1,0.129278053569734,2.38125766500874e-17,-0.238238521826773 + ,1,0.295944720236401,2.38125766500874e-17,-0.238238521826773,1,-0.5,0.392448591443581,-0.5,1,-0.333333333333333,0.392448591443581 + ,-0.5,1,-2.77555756156289e-17,3.06161699786838e-17,-0.5,1,0.129278053569734,3.06161699786838e-17,-0.349349632937884 + ,1,0.295944720236401,3.06161699786838e-17,-0.349349632937884,1 + KnotVectorU: 0,0,0,0,0.5,1,1,1,1 + KnotVectorV: 0,0,0,0,0.333333333333333,0.666666666666667,1,1,1,1 + GeometryVersion: 124 + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + FlipNormals: 0 + NodeAttributeName: "Geometry::nurbsPlane1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_surface_plane_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_surface_plane_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "22/01/2022 23:28:02.086" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_nurbs_surface_plane_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "22/01/2022 23:28:02.086" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\maya_nurbs_plane.mb" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::nurbsPlane1", "Model::Scene" + Connect: "OO", "Geometry::nurbsPlane1_ncl1_1", "Model::nurbsPlane1" + Connect: "OO", "Material::lambert1", "Model::nurbsPlane1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_nurbs_surface_plane_6100_binary.fbx b/modules/ufbx/data/maya_nurbs_surface_plane_6100_binary.fbx new file mode 100644 index 0000000..8aa2a8d Binary files /dev/null and b/modules/ufbx/data/maya_nurbs_surface_plane_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_nurbs_surface_plane_7500_ascii.fbx b/modules/ufbx/data/maya_nurbs_surface_plane_7500_ascii.fbx new file mode 100644 index 0000000..190b909 --- /dev/null +++ b/modules/ufbx/data/maya_nurbs_surface_plane_7500_ascii.fbx @@ -0,0 +1,353 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 1 + Day: 23 + Hour: 0 + Minute: 11 + Second: 8 + Millisecond: 538 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_nurbs_surface_plane_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_nurbs_surface_plane_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "22/01/2022 22:11:08.537" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_nurbs_surface_plane_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "22/01/2022 22:11:08.537" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1938367383696, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxNurbsSurface" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1938363640960, "Geometry::", "NurbsSurface" { + Type: "NurbsSurface" + NurbsSurfaceVersion: 100 + SurfaceDisplay: 4,4,4 + NurbsSurfaceOrder: 4,4 + Dimensions: 5,6 + Step: 4,4 + Form: "Open", "Open" + Points: *120 { + a: -0.5,-0.550588694037046,0.5,1,-0.333333333333333,-0.550588694037046,0.5,1,-2.77555756156289e-17,-0.550588694037046,0.5,1,0.333333333333333,-0.550588694037046,0.5,1,0.5,-0.550588694037046,0.5,1,-0.5,3.4017966642982e-18,0.388888888888889,1,-0.333333333333333,3.4017966642982e-18,0.388888888888889,1,-2.77555756156289e-17,3.4017966642982e-18,0.388888888888889,1,0.333333333333333,3.4017966642982e-18,0.388888888888889,1,0.5,-2.38125766500874e-17,0.388888888888889,1,-0.5,0.39244859144358,0.166666666666667,1,-0.333333333333333,0.39244859144358,0.166666666666667,1,-2.77555756156289e-17,-1.02053899928946e-17,0.166666666666667,1,0.333333333333333,-1.02053899928946e-17,0.166666666666667,1,0.5,-1.02053899928946e-17,0.166666666666667,1,-0.5,0.39244859144358,-0.166666666666667,1,-0.333333333333333,0.39244859144358,-0.166666666666667,1,-2.77555756156289e-17,1.02053899928946e-17,-0.166666666666667,1,0.333333333333333,1.02053899928946e-17,-0.166666666666667,1,0.5,1.02053899928946e-17,-0.166666666666667,1,-0.5,0.39244859144358,-0.388888888888889,1,-0.333333333333333,0.39244859144358,-0.388888888888889,1,-2.77555756156289e-17,2.38125766500874e-17,-0.388888888888889,1,0.129278053569734,2.38125766500874e-17,-0.238238521826773,1,0.295944720236401,2.38125766500874e-17,-0.238238521826773,1,-0.5,0.392448591443581,-0.5,1,-0.333333333333333,0.392448591443581,-0.5,1,-2.77555756156289e-17,3.06161699786838e-17,-0.5,1,0.129278053569734,3.06161699786838e-17,-0.349349632937884,1,0.295944720236401,3.06161699786838e-17,-0.349349632937884,1 + } + KnotVectorU: *9 { + a: 0,0,0,0,0.5,1,1,1,1 + } + KnotVectorV: *10 { + a: 0,0,0,0,0.333333333333333,0.666666666666667,1,1,1,1 + } + GeometryVersion: 124 + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + FlipNormals: 0 + } + Model: 1938456516064, "Model::nurbsPlane1", "NurbsSurface" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: T + Culling: "CullingOff" + } + Material: 1937531025520, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1938416578400, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1938352642736, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::nurbsPlane1, Model::RootNode + C: "OO",1938456516064,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1938352642736,1938416578400 + + ;Geometry::, Model::nurbsPlane1 + C: "OO",1938363640960,1938456516064 + + ;Material::lambert1, Model::nurbsPlane1 + C: "OO",1937531025520,1938456516064 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_nurbs_surface_plane_7500_binary.fbx b/modules/ufbx/data/maya_nurbs_surface_plane_7500_binary.fbx new file mode 100644 index 0000000..2514bd7 Binary files /dev/null and b/modules/ufbx/data/maya_nurbs_surface_plane_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_nurbs_surface_sphere_6100_binary.fbx b/modules/ufbx/data/maya_nurbs_surface_sphere_6100_binary.fbx new file mode 100644 index 0000000..ae7b5bf Binary files /dev/null and b/modules/ufbx/data/maya_nurbs_surface_sphere_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_nurbs_surface_sphere_7500_ascii.fbx b/modules/ufbx/data/maya_nurbs_surface_sphere_7500_ascii.fbx new file mode 100644 index 0000000..2c3702e --- /dev/null +++ b/modules/ufbx/data/maya_nurbs_surface_sphere_7500_ascii.fbx @@ -0,0 +1,355 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 1 + Day: 23 + Hour: 1 + Minute: 40 + Second: 11 + Millisecond: 766 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_nurbs_surface_sphere_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_nurbs_surface_sphere_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "22/01/2022 23:40:11.765" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_nurbs_surface_sphere_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "22/01/2022 23:40:11.765" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1938337874688, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxNurbsSurface" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1938456025936, "Geometry::", "NurbsSurface" { + Type: "NurbsSurface" + NurbsSurfaceVersion: 100 + SurfaceDisplay: 4,4,4 + NurbsSurfaceOrder: 4,4 + Dimensions: 11,10 + Step: 4,4 + Form: "Open", "Periodic" + Points: *440 { + a: 1.2027966871805e-16,-1,-2.29453895523431e-16,1,0.112374817429148,-1,-0.0816450839391139,1,0.339584471147233,-0.947931871582046,-0.246722560138674,1,0.626772327646112,-0.725515644530561,-0.45537675141181,1,0.819058846920356,-0.392646237414994,-0.595081085226671,1,0.886502776408144,2.54919879898992e-16,-0.644081968255344,1,0.819058846920356,0.392646237414995,-0.59508108522667,1,0.626772327646112,0.725515644530561,-0.45537675141181,1,0.339584471147233,0.947931871582046,-0.246722560138674,1,0.112374817429147,1,-0.0816450839391133,1,-2.54281687865575e-16,1,3.26812061272696e-16,1,1.2027966871805e-16,-1,-2.29453895523431e-16,1,0.138902913301555,-1,-1.32562055891315e-16,1,0.419749490441296,-0.947931871582046,-1.37967157837889e-16,1,0.774733203386365,-0.725515644530561,-1.24968750535852e-16,1,1.01241241236615,-0.392646237414994,-9.29723944944827e-17,1,1.09577769388276,2.1548123385837e-16,-4.68140025638385e-17,1,1.01241241236615,0.392646237414995,6.46748107498785e-18,1,0.774733203386365,0.725515644530561,5.87721809723538e-17,1,0.419749490441296,0.947931871582046,1.0210193840262e-16,1,0.138902913301554,1,1.20693587723502e-16,1,-2.54281687865575e-16,1,3.26812061272696e-16,1,1.2027966871805e-16,-1,-2.29453895523431e-16,1,0.112374817429148,-1,0.0816450839391138,1,0.339584471147233,-0.947931871582046,0.246722560138674,1,0.626772327646112,-0.725515644530561,0.455376751411811,1,0.819058846920355,-0.392646237414994,0.595081085226671,1,0.886502776408144,1.76042587817748e-16,0.644081968255344,1,0.819058846920355,0.392646237414995,0.595081085226671,1,0.626772327646112,0.725515644530561,0.455376751411811,1,0.339584471147233,0.947931871582046,0.246722560138674,1,0.112374817429147,1,0.0816450839391137,1,-2.54281687865575e-16,1,3.26812061272696e-16,1,1.2027966871805e-16,-1,-2.29453895523431e-16,1,0.0429233607783704,-1,0.132104520827824,1,0.129709725926585,-0.947931871582046,0.399205488095765,1,0.239405725952929,-0.725515644530561,0.736815061470821,1,0.312852640737279,-0.392646237414994,0.962861421958926,1,0.338613929466762, +1.51668164094368e-16,1.04214651617808,1,0.312852640737279,0.392646237414995,0.962861421958926,1,0.239405725952929,0.725515644530561,0.736815061470821,1,0.129709725926585,0.947931871582046,0.399205488095765,1,0.0429233607783701,1,0.132104520827824,1,-2.54281687865575e-16,1,3.26812061272696e-16,1,1.2027966871805e-16,-1,-2.29453895523431e-16,1,-0.0429233607783703,-1,0.132104520827824,1,-0.129709725926585,-0.947931871582046,0.399205488095765,1,-0.239405725952929,-0.725515644530561,0.736815061470821,1,-0.312852640737279,-0.392646237414994,0.962861421958927,1,-0.338613929466762,1.51668164094368e-16,1.04214651617808,1,-0.312852640737279,0.392646237414995,0.962861421958927,1,-0.239405725952929,0.725515644530561,0.736815061470821,1,-0.129709725926585,0.947931871582046,0.399205488095765,1,-0.0429233607783702,1,0.132104520827824,1,-2.54281687865575e-16,1,3.26812061272696e-16,1,1.2027966871805e-16,-1,-2.29453895523431e-16,1,-0.112374817429148,-1,0.0816450839391138,1,-0.339584471147234,-0.947931871582046,0.246722560138674,1,-0.626772327646112,-0.725515644530561,0.455376751411811,1,-0.819058846920356,-0.392646237414994,0.595081085226671,1,-0.886502776408144,1.76042587817748e-16,0.644081968255344,1,-0.819058846920356,0.392646237414995,0.595081085226671,1,-0.626772327646112,0.725515644530561,0.45537675141181,1,-0.339584471147233,0.947931871582046,0.246722560138674,1,-0.112374817429147,1,0.0816450839391135,1,-2.54281687865575e-16,1,3.26812061272696e-16,1,1.2027966871805e-16,-1,-2.29453895523431e-16,1,-0.138902913301555,-1,-5.58311030797973e-18,1,-0.419749490441296,-0.947931871582046,-2.55057388076652e-17,1,-0.774733203386365,-0.725515644530561,-5.13394517526779e-17,1,-1.01241241236615,-0.392646237414994,-6.94022172527123e-17,1,-1.09577769388276,2.1548123385837e-16,-7.68862618255222e-17,1,-1.01241241236615,0.392646237414995,-7.2671501252678e-17,1,-0.774733203386364,0.725515644530561,-5.73803008997477e-17,1,-0.419749490441296,0.947931871582046,-3.33984885796317e-17,1,-0.138902913301554,1,-1.39093940933259e-17,1,-2.54281687865575e-16, +1,3.26812061272696e-16,1,1.2027966871805e-16,-1,-2.29453895523431e-16,1,-0.112374817429148,-1,-0.0816450839391139,1,-0.339584471147233,-0.947931871582046,-0.246722560138674,1,-0.626772327646112,-0.725515644530561,-0.455376751411811,1,-0.819058846920356,-0.392646237414994,-0.595081085226671,1,-0.886502776408144,2.54919879898992e-16,-0.644081968255344,1,-0.819058846920356,0.392646237414995,-0.595081085226671,1,-0.626772327646112,0.725515644530561,-0.45537675141181,1,-0.339584471147233,0.947931871582046,-0.246722560138674,1,-0.112374817429147,1,-0.0816450839391135,1,-2.54281687865575e-16,1,3.26812061272696e-16,1,1.2027966871805e-16,-1,-2.29453895523431e-16,1,-0.0429233607783704,-1,-0.132104520827824,1,-0.129709725926585,-0.947931871582046,-0.399205488095765,1,-0.239405725952929,-0.725515644530561,-0.736815061470821,1,-0.312852640737279,-0.392646237414994,-0.962861421958927,1,-0.338613929466762,2.79294303622372e-16,-1.04214651617808,1,-0.312852640737278,0.392646237414995,-0.962861421958926,1,-0.239405725952929,0.725515644530561,-0.736815061470821,1,-0.129709725926585,0.947931871582046,-0.399205488095765,1,-0.0429233607783701,1,-0.132104520827824,1,-2.54281687865575e-16,1,3.26812061272696e-16,1,1.2027966871805e-16,-1,-2.29453895523431e-16,1,0.0429233607783703,-1,-0.132104520827824,1,0.129709725926585,-0.947931871582046,-0.399205488095765,1,0.239405725952929,-0.725515644530561,-0.736815061470821,1,0.312852640737279,-0.392646237414994,-0.962861421958927,1,0.338613929466762,2.79294303622372e-16,-1.04214651617808,1,0.312852640737279,0.392646237414995,-0.962861421958927,1,0.239405725952929,0.725515644530561,-0.736815061470821,1,0.129709725926585,0.947931871582046,-0.399205488095765,1,0.0429233607783702,1,-0.132104520827824,1,-2.54281687865575e-16,1,3.26812061272696e-16,1 + } + KnotVectorU: *15 { + a: 0,0,0,0,1,2,3,4,5,6,7,8,8,8,8 + } + KnotVectorV: *17 { + a: -3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13 + } + GeometryVersion: 124 + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + FlipNormals: 0 + } + Model: 1938456488224, "Model::nurbsSphere1", "NurbsSurface" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: T + Culling: "CullingOff" + } + Material: 1938099225696, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1938413587664, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1938352581936, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::nurbsSphere1, Model::RootNode + C: "OO",1938456488224,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1938352581936,1938413587664 + + ;Geometry::, Model::nurbsSphere1 + C: "OO",1938456025936,1938456488224 + + ;Material::lambert1, Model::nurbsSphere1 + C: "OO",1938099225696,1938456488224 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_ortho_camera_200x300_6100_ascii.fbx b/modules/ufbx/data/maya_ortho_camera_200x300_6100_ascii.fbx new file mode 100644 index 0000000..b9471f0 --- /dev/null +++ b/modules/ufbx/data/maya_ortho_camera_200x300_6100_ascii.fbx @@ -0,0 +1,1121 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Overscan" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 200 + CameraResolutionH: 300 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 11 + Day: 20 + Hour: 0 + Minute: 34 + Second: 4 + Millisecond: 192 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "Model" { + Count: 5 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Fill", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",200 + Property: "AspectHeight", "double", "N",300 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",0.493 + Property: "FilmHeight", "Number", "AN",0.292 + Property: "FilmAspectRatio", "double", "N",1.68835616438356 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",3 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",59.5244560614684 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + NodeAttributeName: "NodeAttribute::Fill_ncl1_1" + } + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,-21.9695103175629 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",30,30,30 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::Vertical", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",200 + Property: "AspectHeight", "double", "N",300 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",0.493 + Property: "FilmHeight", "Number", "AN",0.292 + Property: "FilmAspectRatio", "double", "N",1.68835616438356 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",1 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",59.5244560614684 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + NodeAttributeName: "NodeAttribute::Vertical_ncl1_1" + } + Model: "Model::Horizontal", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",200 + Property: "AspectHeight", "double", "N",300 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",0.493 + Property: "FilmHeight", "Number", "AN",0.292 + Property: "FilmAspectRatio", "double", "N",1.68835616438356 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",2 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",59.5244560614684 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + NodeAttributeName: "NodeAttribute::Horizontal_ncl1_1" + } + Model: "Model::Overscan", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",200 + Property: "AspectHeight", "double", "N",300 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",0.493 + Property: "FilmHeight", "Number", "AN",0.292 + Property: "FilmAspectRatio", "double", "N",1.68835616438356 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",4 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",59.5244560614684 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + NodeAttributeName: "NodeAttribute::Overscan_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_200x300_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_200x300_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "19/11/2022 22:34:04.191" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_200x300_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "19/11/2022 22:34:04.191" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Overscan" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Fill", "Model::Scene" + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::Vertical", "Model::Scene" + Connect: "OO", "Model::Horizontal", "Model::Scene" + Connect: "OO", "Model::Overscan", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Overscan" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_ortho_camera_200x300_7700_ascii.fbx b/modules/ufbx/data/maya_ortho_camera_200x300_7700_ascii.fbx new file mode 100644 index 0000000..d2a993e --- /dev/null +++ b/modules/ufbx/data/maya_ortho_camera_200x300_7700_ascii.fbx @@ -0,0 +1,680 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 11 + Day: 20 + Hour: 0 + Minute: 32 + Second: 38 + Millisecond: 64 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_200x300_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_200x300_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "19/11/2022 22:32:38.063" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_200x300_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "19/11/2022 22:32:38.063" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Overscan" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2014706058768, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 14 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxCamera" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Position", "Vector", "", "A",0,0,0 + P: "UpVector", "Vector", "", "A",0,1,0 + P: "InterestPosition", "Vector", "", "A",0,0,0 + P: "Roll", "Roll", "", "A",0 + P: "OpticalCenterX", "OpticalCenterX", "", "A",0 + P: "OpticalCenterY", "OpticalCenterY", "", "A",0 + P: "BackgroundColor", "Color", "", "A",0.63,0.63,0.63 + P: "TurnTable", "Number", "", "A",0 + P: "DisplayTurnTableIcon", "bool", "", "",0 + P: "UseMotionBlur", "bool", "", "",0 + P: "UseRealTimeMotionBlur", "bool", "", "",1 + P: "Motion Blur Intensity", "Number", "", "A",1 + P: "AspectRatioMode", "enum", "", "",0 + P: "AspectWidth", "double", "Number", "",320 + P: "AspectHeight", "double", "Number", "",200 + P: "PixelAspectRatio", "double", "Number", "",1 + P: "FilmOffsetX", "Number", "", "A",0 + P: "FilmOffsetY", "Number", "", "A",0 + P: "FilmWidth", "double", "Number", "",0.816 + P: "FilmHeight", "double", "Number", "",0.612 + P: "FilmAspectRatio", "double", "Number", "",1.33333333333333 + P: "FilmSqueezeRatio", "double", "Number", "",1 + P: "FilmFormatIndex", "enum", "", "",0 + P: "PreScale", "Number", "", "A",1 + P: "FilmTranslateX", "Number", "", "A",0 + P: "FilmTranslateY", "Number", "", "A",0 + P: "FilmRollPivotX", "Number", "", "A",0 + P: "FilmRollPivotY", "Number", "", "A",0 + P: "FilmRollValue", "Number", "", "A",0 + P: "FilmRollOrder", "enum", "", "",0 + P: "ApertureMode", "enum", "", "",2 + P: "GateFit", "enum", "", "",0 + P: "FieldOfView", "FieldOfView", "", "A",25.1149997711182 + P: "FieldOfViewX", "FieldOfViewX", "", "A",40 + P: "FieldOfViewY", "FieldOfViewY", "", "A",40 + P: "FocalLength", "Number", "", "A",34.8932762167263 + P: "CameraFormat", "enum", "", "",0 + P: "UseFrameColor", "bool", "", "",0 + P: "FrameColor", "ColorRGB", "Color", "",0.3,0.3,0.3 + P: "ShowName", "bool", "", "",1 + P: "ShowInfoOnMoving", "bool", "", "",1 + P: "ShowGrid", "bool", "", "",1 + P: "ShowOpticalCenter", "bool", "", "",0 + P: "ShowAzimut", "bool", "", "",1 + P: "ShowTimeCode", "bool", "", "",0 + P: "ShowAudio", "bool", "", "",0 + P: "AudioColor", "Vector3D", "Vector", "",0,1,0 + P: "NearPlane", "double", "Number", "",10 + P: "FarPlane", "double", "Number", "",4000 + P: "AutoComputeClipPanes", "bool", "", "",0 + P: "ViewCameraToLookAt", "bool", "", "",1 + P: "ViewFrustumNearFarPlane", "bool", "", "",0 + P: "ViewFrustumBackPlaneMode", "enum", "", "",2 + P: "BackPlaneDistance", "Number", "", "A",4000 + P: "BackPlaneDistanceMode", "enum", "", "",1 + P: "ViewFrustumFrontPlaneMode", "enum", "", "",2 + P: "FrontPlaneDistance", "Number", "", "A",10 + P: "FrontPlaneDistanceMode", "enum", "", "",1 + P: "LockMode", "bool", "", "",0 + P: "LockInterestNavigation", "bool", "", "",0 + P: "BackPlateFitImage", "bool", "", "",0 + P: "BackPlateCrop", "bool", "", "",0 + P: "BackPlateCenter", "bool", "", "",1 + P: "BackPlateKeepRatio", "bool", "", "",1 + P: "BackgroundAlphaTreshold", "double", "Number", "",0.5 + P: "ShowBackplate", "bool", "", "",1 + P: "BackPlaneOffsetX", "Number", "", "A",0 + P: "BackPlaneOffsetY", "Number", "", "A",0 + P: "BackPlaneRotation", "Number", "", "A",0 + P: "BackPlaneScaleX", "Number", "", "A",1 + P: "BackPlaneScaleY", "Number", "", "A",1 + P: "Background Texture", "object", "", "" + P: "FrontPlateFitImage", "bool", "", "",1 + P: "FrontPlateCrop", "bool", "", "",0 + P: "FrontPlateCenter", "bool", "", "",1 + P: "FrontPlateKeepRatio", "bool", "", "",1 + P: "Foreground Opacity", "double", "Number", "",1 + P: "ShowFrontplate", "bool", "", "",1 + P: "FrontPlaneOffsetX", "Number", "", "A",0 + P: "FrontPlaneOffsetY", "Number", "", "A",0 + P: "FrontPlaneRotation", "Number", "", "A",0 + P: "FrontPlaneScaleX", "Number", "", "A",1 + P: "FrontPlaneScaleY", "Number", "", "A",1 + P: "Foreground Texture", "object", "", "" + P: "DisplaySafeArea", "bool", "", "",0 + P: "DisplaySafeAreaOnRender", "bool", "", "",0 + P: "SafeAreaDisplayStyle", "enum", "", "",1 + P: "SafeAreaAspectRatio", "double", "Number", "",1.33333333333333 + P: "Use2DMagnifierZoom", "bool", "", "",0 + P: "2D Magnifier Zoom", "Number", "", "A",100 + P: "2D Magnifier X", "Number", "", "A",50 + P: "2D Magnifier Y", "Number", "", "A",50 + P: "CameraProjectionType", "enum", "", "",0 + P: "OrthoZoom", "double", "Number", "",1 + P: "UseRealTimeDOFAndAA", "bool", "", "",0 + P: "UseDepthOfField", "bool", "", "",0 + P: "FocusSource", "enum", "", "",0 + P: "FocusAngle", "double", "Number", "",3.5 + P: "FocusDistance", "double", "Number", "",200 + P: "UseAntialiasing", "bool", "", "",0 + P: "AntialiasingIntensity", "double", "Number", "",0.77777 + P: "AntialiasingMethod", "enum", "", "",0 + P: "UseAccumulationBuffer", "bool", "", "",0 + P: "FrameSamplingCount", "int", "Integer", "",7 + P: "FrameSamplingType", "enum", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 5 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 2016416663920, "NodeAttribute::Fill", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",200 + P: "AspectHeight", "double", "Number", "",300 + P: "FilmWidth", "Number", "", "A",0.493 + P: "FilmHeight", "Number", "", "A",0.292 + P: "FilmAspectRatio", "double", "Number", "",1.68835616438356 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",3 + P: "FocalLength", "Number", "", "A",59.5244560614684 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Geometry: 2014702294464, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2016416665856, "NodeAttribute::Vertical", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",200 + P: "AspectHeight", "double", "Number", "",300 + P: "FilmWidth", "Number", "", "A",0.493 + P: "FilmHeight", "Number", "", "A",0.292 + P: "FilmAspectRatio", "double", "Number", "",1.68835616438356 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",1 + P: "FocalLength", "Number", "", "A",59.5244560614684 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + NodeAttribute: 2016416667792, "NodeAttribute::Horizontal", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",200 + P: "AspectHeight", "double", "Number", "",300 + P: "FilmWidth", "Number", "", "A",0.493 + P: "FilmHeight", "Number", "", "A",0.292 + P: "FilmAspectRatio", "double", "Number", "",1.68835616438356 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",2 + P: "FocalLength", "Number", "", "A",59.5244560614684 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + NodeAttribute: 2016416669728, "NodeAttribute::Overscan", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",200 + P: "AspectHeight", "double", "Number", "",300 + P: "FilmWidth", "Number", "", "A",0.493 + P: "FilmHeight", "Number", "", "A",0.292 + P: "FilmAspectRatio", "double", "Number", "",1.68835616438356 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",4 + P: "FocalLength", "Number", "", "A",59.5244560614684 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: 2016320820800, "Model::Fill", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2016320837040, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,-21.9695103175629 + P: "Lcl Scaling", "Lcl Scaling", "", "A",30,30,30 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2016320823120, "Model::Vertical", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2016320825440, "Model::Horizontal", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2016320827760, "Model::Overscan", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Material: 2016140169456, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2014798406000, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2014707075856, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Fill, Model::RootNode + C: "OO",2016320820800,0 + + ;Model::pCube1, Model::RootNode + C: "OO",2016320837040,0 + + ;Model::Vertical, Model::RootNode + C: "OO",2016320823120,0 + + ;Model::Horizontal, Model::RootNode + C: "OO",2016320825440,0 + + ;Model::Overscan, Model::RootNode + C: "OO",2016320827760,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2014707075856,2014798406000 + + ;NodeAttribute::Fill, Model::Fill + C: "OO",2016416663920,2016320820800 + + ;Geometry::, Model::pCube1 + C: "OO",2014702294464,2016320837040 + + ;Material::lambert1, Model::pCube1 + C: "OO",2016140169456,2016320837040 + + ;NodeAttribute::Vertical, Model::Vertical + C: "OO",2016416665856,2016320823120 + + ;NodeAttribute::Horizontal, Model::Horizontal + C: "OO",2016416667792,2016320825440 + + ;NodeAttribute::Overscan, Model::Overscan + C: "OO",2016416669728,2016320827760 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_ortho_camera_400x200_6100_ascii.fbx b/modules/ufbx/data/maya_ortho_camera_400x200_6100_ascii.fbx new file mode 100644 index 0000000..4c0bedd --- /dev/null +++ b/modules/ufbx/data/maya_ortho_camera_400x200_6100_ascii.fbx @@ -0,0 +1,1121 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Overscan" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 400 + CameraResolutionH: 200 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 11 + Day: 20 + Hour: 0 + Minute: 23 + Second: 1 + Millisecond: 934 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "Model" { + Count: 5 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Fill", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",400 + Property: "AspectHeight", "double", "N",200 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",0.493 + Property: "FilmHeight", "Number", "AN",0.292 + Property: "FilmAspectRatio", "double", "N",1.68835616438356 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",3 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",59.5244560614684 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + NodeAttributeName: "NodeAttribute::Fill_ncl1_1" + } + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,-21.9695103175629 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",30,30,30 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::Vertical", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",400 + Property: "AspectHeight", "double", "N",200 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",0.493 + Property: "FilmHeight", "Number", "AN",0.292 + Property: "FilmAspectRatio", "double", "N",1.68835616438356 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",1 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",59.5244560614684 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + NodeAttributeName: "NodeAttribute::Vertical_ncl1_1" + } + Model: "Model::Horizontal", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",400 + Property: "AspectHeight", "double", "N",200 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",0.493 + Property: "FilmHeight", "Number", "AN",0.292 + Property: "FilmAspectRatio", "double", "N",1.68835616438356 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",2 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",59.5244560614684 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + NodeAttributeName: "NodeAttribute::Horizontal_ncl1_1" + } + Model: "Model::Overscan", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",400 + Property: "AspectHeight", "double", "N",200 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",0.493 + Property: "FilmHeight", "Number", "AN",0.292 + Property: "FilmAspectRatio", "double", "N",1.68835616438356 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",4 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",59.5244560614684 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + NodeAttributeName: "NodeAttribute::Overscan_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_400x200_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_400x200_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "19/11/2022 22:23:01.933" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_400x200_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "19/11/2022 22:23:01.933" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Overscan" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Fill", "Model::Scene" + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::Vertical", "Model::Scene" + Connect: "OO", "Model::Horizontal", "Model::Scene" + Connect: "OO", "Model::Overscan", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Overscan" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_ortho_camera_400x200_7700_ascii.fbx b/modules/ufbx/data/maya_ortho_camera_400x200_7700_ascii.fbx new file mode 100644 index 0000000..849a977 --- /dev/null +++ b/modules/ufbx/data/maya_ortho_camera_400x200_7700_ascii.fbx @@ -0,0 +1,676 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 11 + Day: 20 + Hour: 0 + Minute: 23 + Second: 26 + Millisecond: 473 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_400x200_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_400x200_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "19/11/2022 22:23:26.471" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_400x200_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "19/11/2022 22:23:26.471" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Overscan" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2014693909616, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 14 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxCamera" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Position", "Vector", "", "A",0,0,0 + P: "UpVector", "Vector", "", "A",0,1,0 + P: "InterestPosition", "Vector", "", "A",0,0,0 + P: "Roll", "Roll", "", "A",0 + P: "OpticalCenterX", "OpticalCenterX", "", "A",0 + P: "OpticalCenterY", "OpticalCenterY", "", "A",0 + P: "BackgroundColor", "Color", "", "A",0.63,0.63,0.63 + P: "TurnTable", "Number", "", "A",0 + P: "DisplayTurnTableIcon", "bool", "", "",0 + P: "UseMotionBlur", "bool", "", "",0 + P: "UseRealTimeMotionBlur", "bool", "", "",1 + P: "Motion Blur Intensity", "Number", "", "A",1 + P: "AspectRatioMode", "enum", "", "",0 + P: "AspectWidth", "double", "Number", "",320 + P: "AspectHeight", "double", "Number", "",200 + P: "PixelAspectRatio", "double", "Number", "",1 + P: "FilmOffsetX", "Number", "", "A",0 + P: "FilmOffsetY", "Number", "", "A",0 + P: "FilmWidth", "double", "Number", "",0.816 + P: "FilmHeight", "double", "Number", "",0.612 + P: "FilmAspectRatio", "double", "Number", "",1.33333333333333 + P: "FilmSqueezeRatio", "double", "Number", "",1 + P: "FilmFormatIndex", "enum", "", "",0 + P: "PreScale", "Number", "", "A",1 + P: "FilmTranslateX", "Number", "", "A",0 + P: "FilmTranslateY", "Number", "", "A",0 + P: "FilmRollPivotX", "Number", "", "A",0 + P: "FilmRollPivotY", "Number", "", "A",0 + P: "FilmRollValue", "Number", "", "A",0 + P: "FilmRollOrder", "enum", "", "",0 + P: "ApertureMode", "enum", "", "",2 + P: "GateFit", "enum", "", "",0 + P: "FieldOfView", "FieldOfView", "", "A",25.1149997711182 + P: "FieldOfViewX", "FieldOfViewX", "", "A",40 + P: "FieldOfViewY", "FieldOfViewY", "", "A",40 + P: "FocalLength", "Number", "", "A",34.8932762167263 + P: "CameraFormat", "enum", "", "",0 + P: "UseFrameColor", "bool", "", "",0 + P: "FrameColor", "ColorRGB", "Color", "",0.3,0.3,0.3 + P: "ShowName", "bool", "", "",1 + P: "ShowInfoOnMoving", "bool", "", "",1 + P: "ShowGrid", "bool", "", "",1 + P: "ShowOpticalCenter", "bool", "", "",0 + P: "ShowAzimut", "bool", "", "",1 + P: "ShowTimeCode", "bool", "", "",0 + P: "ShowAudio", "bool", "", "",0 + P: "AudioColor", "Vector3D", "Vector", "",0,1,0 + P: "NearPlane", "double", "Number", "",10 + P: "FarPlane", "double", "Number", "",4000 + P: "AutoComputeClipPanes", "bool", "", "",0 + P: "ViewCameraToLookAt", "bool", "", "",1 + P: "ViewFrustumNearFarPlane", "bool", "", "",0 + P: "ViewFrustumBackPlaneMode", "enum", "", "",2 + P: "BackPlaneDistance", "Number", "", "A",4000 + P: "BackPlaneDistanceMode", "enum", "", "",1 + P: "ViewFrustumFrontPlaneMode", "enum", "", "",2 + P: "FrontPlaneDistance", "Number", "", "A",10 + P: "FrontPlaneDistanceMode", "enum", "", "",1 + P: "LockMode", "bool", "", "",0 + P: "LockInterestNavigation", "bool", "", "",0 + P: "BackPlateFitImage", "bool", "", "",0 + P: "BackPlateCrop", "bool", "", "",0 + P: "BackPlateCenter", "bool", "", "",1 + P: "BackPlateKeepRatio", "bool", "", "",1 + P: "BackgroundAlphaTreshold", "double", "Number", "",0.5 + P: "ShowBackplate", "bool", "", "",1 + P: "BackPlaneOffsetX", "Number", "", "A",0 + P: "BackPlaneOffsetY", "Number", "", "A",0 + P: "BackPlaneRotation", "Number", "", "A",0 + P: "BackPlaneScaleX", "Number", "", "A",1 + P: "BackPlaneScaleY", "Number", "", "A",1 + P: "Background Texture", "object", "", "" + P: "FrontPlateFitImage", "bool", "", "",1 + P: "FrontPlateCrop", "bool", "", "",0 + P: "FrontPlateCenter", "bool", "", "",1 + P: "FrontPlateKeepRatio", "bool", "", "",1 + P: "Foreground Opacity", "double", "Number", "",1 + P: "ShowFrontplate", "bool", "", "",1 + P: "FrontPlaneOffsetX", "Number", "", "A",0 + P: "FrontPlaneOffsetY", "Number", "", "A",0 + P: "FrontPlaneRotation", "Number", "", "A",0 + P: "FrontPlaneScaleX", "Number", "", "A",1 + P: "FrontPlaneScaleY", "Number", "", "A",1 + P: "Foreground Texture", "object", "", "" + P: "DisplaySafeArea", "bool", "", "",0 + P: "DisplaySafeAreaOnRender", "bool", "", "",0 + P: "SafeAreaDisplayStyle", "enum", "", "",1 + P: "SafeAreaAspectRatio", "double", "Number", "",1.33333333333333 + P: "Use2DMagnifierZoom", "bool", "", "",0 + P: "2D Magnifier Zoom", "Number", "", "A",100 + P: "2D Magnifier X", "Number", "", "A",50 + P: "2D Magnifier Y", "Number", "", "A",50 + P: "CameraProjectionType", "enum", "", "",0 + P: "OrthoZoom", "double", "Number", "",1 + P: "UseRealTimeDOFAndAA", "bool", "", "",0 + P: "UseDepthOfField", "bool", "", "",0 + P: "FocusSource", "enum", "", "",0 + P: "FocusAngle", "double", "Number", "",3.5 + P: "FocusDistance", "double", "Number", "",200 + P: "UseAntialiasing", "bool", "", "",0 + P: "AntialiasingIntensity", "double", "Number", "",0.77777 + P: "AntialiasingMethod", "enum", "", "",0 + P: "UseAccumulationBuffer", "bool", "", "",0 + P: "FrameSamplingCount", "int", "Integer", "",7 + P: "FrameSamplingType", "enum", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 5 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 2016416673600, "NodeAttribute::Fill", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",400 + P: "FilmWidth", "Number", "", "A",0.493 + P: "FilmHeight", "Number", "", "A",0.292 + P: "FilmAspectRatio", "double", "Number", "",1.68835616438356 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",3 + P: "FocalLength", "Number", "", "A",59.5244560614684 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Geometry: 2016460587168, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2016416663920, "NodeAttribute::Vertical", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",400 + P: "FilmWidth", "Number", "", "A",0.493 + P: "FilmHeight", "Number", "", "A",0.292 + P: "FilmAspectRatio", "double", "Number", "",1.68835616438356 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",1 + P: "FocalLength", "Number", "", "A",59.5244560614684 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + NodeAttribute: 2016416665856, "NodeAttribute::Horizontal", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",400 + P: "FilmWidth", "Number", "", "A",0.493 + P: "FilmHeight", "Number", "", "A",0.292 + P: "FilmAspectRatio", "double", "Number", "",1.68835616438356 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",2 + P: "FocalLength", "Number", "", "A",59.5244560614684 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + NodeAttribute: 2016416667792, "NodeAttribute::Overscan", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",400 + P: "FilmWidth", "Number", "", "A",0.493 + P: "FilmHeight", "Number", "", "A",0.292 + P: "FilmAspectRatio", "double", "Number", "",1.68835616438356 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",4 + P: "FocalLength", "Number", "", "A",59.5244560614684 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: 2016320818480, "Model::Fill", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2016320832400, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,-21.9695103175629 + P: "Lcl Scaling", "Lcl Scaling", "", "A",30,30,30 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2016320825440, "Model::Vertical", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2016320830080, "Model::Horizontal", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2016320834720, "Model::Overscan", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Material: 2016199787264, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2014701001008, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2014695916576, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Fill, Model::RootNode + C: "OO",2016320818480,0 + + ;Model::pCube1, Model::RootNode + C: "OO",2016320832400,0 + + ;Model::Vertical, Model::RootNode + C: "OO",2016320825440,0 + + ;Model::Horizontal, Model::RootNode + C: "OO",2016320830080,0 + + ;Model::Overscan, Model::RootNode + C: "OO",2016320834720,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2014695916576,2014701001008 + + ;NodeAttribute::Fill, Model::Fill + C: "OO",2016416673600,2016320818480 + + ;Geometry::, Model::pCube1 + C: "OO",2016460587168,2016320832400 + + ;Material::lambert1, Model::pCube1 + C: "OO",2016199787264,2016320832400 + + ;NodeAttribute::Vertical, Model::Vertical + C: "OO",2016416663920,2016320825440 + + ;NodeAttribute::Horizontal, Model::Horizontal + C: "OO",2016416665856,2016320830080 + + ;NodeAttribute::Overscan, Model::Overscan + C: "OO",2016416667792,2016320834720 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_ortho_camera_size_6100_ascii.fbx b/modules/ufbx/data/maya_ortho_camera_size_6100_ascii.fbx new file mode 100644 index 0000000..f2ef754 --- /dev/null +++ b/modules/ufbx/data/maya_ortho_camera_size_6100_ascii.fbx @@ -0,0 +1,958 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 300 + CameraResolutionH: 300 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 11 + Day: 20 + Hour: 0 + Minute: 39 + Second: 10 + Millisecond: 687 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "Model" { + Count: 4 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Ortho_30", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",300 + Property: "AspectHeight", "double", "N",300 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",1.41732 + Property: "FilmHeight", "Number", "AN",0.94488 + Property: "FilmAspectRatio", "double", "N",1.5 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",3 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",35 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",1 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + NodeAttributeName: "NodeAttribute::Ortho_30_ncl1_1" + } + Model: "Model::Ortho_10", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",300 + Property: "AspectHeight", "double", "N",300 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",1.41732 + Property: "FilmHeight", "Number", "AN",0.94488 + Property: "FilmAspectRatio", "double", "N",1.5 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",3 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",35 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",0.333333333333333 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 0.333333333333333 + NodeAttributeName: "NodeAttribute::Ortho_10_ncl1_1" + } + Model: "Model::Ortho_100", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",300 + Property: "AspectHeight", "double", "N",300 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",1.41732 + Property: "FilmHeight", "Number", "AN",0.94488 + Property: "FilmAspectRatio", "double", "N",1.5 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",3 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",35 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",3.33333333333333 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 3.33333333333333 + NodeAttributeName: "NodeAttribute::Ortho_100_ncl1_1" + } + Model: "Model::Ortho_35", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,-90,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Position", "Vector", "AN",0,0,0 + Property: "UpVector", "Vector", "AN",0,1,0 + Property: "InterestPosition", "Vector", "AN",0,0,-5 + Property: "Roll", "Roll", "AN",0 + Property: "OpticalCenterX", "OpticalCenterX", "AN",0 + Property: "OpticalCenterY", "OpticalCenterY", "AN",0 + Property: "BackgroundColor", "Color", "AN",0,0,0 + Property: "TurnTable", "Number", "AN",0 + Property: "DisplayTurnTableIcon", "bool", "N",0 + Property: "UseMotionBlur", "bool", "N",0 + Property: "UseRealTimeMotionBlur", "bool", "N",1 + Property: "Motion Blur Intensity", "Number", "AN",1 + Property: "AspectRatioMode", "enum", "N",0 + Property: "AspectWidth", "double", "N",300 + Property: "AspectHeight", "double", "N",300 + Property: "PixelAspectRatio", "double", "N",1 + Property: "FilmOffsetX", "Number", "AN",0 + Property: "FilmOffsetY", "Number", "AN",0 + Property: "FilmWidth", "Number", "AN",1.41732 + Property: "FilmHeight", "Number", "AN",0.94488 + Property: "FilmAspectRatio", "double", "N",1.5 + Property: "FilmSqueezeRatio", "double", "N",1 + Property: "FilmFormatIndex", "enum", "N",0 + Property: "PreScale", "Number", "AN",1 + Property: "FilmTranslateX", "Number", "AN",0 + Property: "FilmTranslateY", "Number", "AN",0 + Property: "FilmRollPivotX", "Number", "AN",0 + Property: "FilmRollPivotY", "Number", "AN",0 + Property: "FilmRollValue", "Number", "AN",0 + Property: "FilmRollOrder", "enum", "N",0 + Property: "ApertureMode", "enum", "N",3 + Property: "GateFit", "enum", "N",3 + Property: "FieldOfView", "FieldOfView", "AN",25.1149997711182 + Property: "FieldOfViewX", "FieldOfViewX", "AN",40 + Property: "FieldOfViewY", "FieldOfViewY", "AN",40 + Property: "FocalLength", "Number", "AN",35 + Property: "CameraFormat", "enum", "N",0 + Property: "UseFrameColor", "bool", "N",0 + Property: "FrameColor", "ColorRGB", "N",0.3,0.3,0.3 + Property: "ShowName", "bool", "N",1 + Property: "ShowInfoOnMoving", "bool", "N",1 + Property: "ShowGrid", "bool", "N",1 + Property: "ShowOpticalCenter", "bool", "N",0 + Property: "ShowAzimut", "bool", "N",1 + Property: "ShowTimeCode", "bool", "N",0 + Property: "ShowAudio", "bool", "N",0 + Property: "AudioColor", "Vector3D", "N",0,1,0 + Property: "NearPlane", "double", "N",0.1 + Property: "FarPlane", "double", "N",10000 + Property: "AutoComputeClipPanes", "bool", "N",1 + Property: "ViewCameraToLookAt", "bool", "N",1 + Property: "ViewFrustumNearFarPlane", "bool", "N",0 + Property: "ViewFrustumBackPlaneMode", "enum", "N",2 + Property: "BackPlaneDistance", "Number", "AN",4000 + Property: "BackPlaneDistanceMode", "enum", "N",1 + Property: "ViewFrustumFrontPlaneMode", "enum", "N",2 + Property: "FrontPlaneDistance", "Number", "AN",10 + Property: "FrontPlaneDistanceMode", "enum", "N",1 + Property: "LockMode", "bool", "N",0 + Property: "LockInterestNavigation", "bool", "N",0 + Property: "BackPlateFitImage", "bool", "N",0 + Property: "BackPlateCrop", "bool", "N",0 + Property: "BackPlateCenter", "bool", "N",1 + Property: "BackPlateKeepRatio", "bool", "N",1 + Property: "BackgroundAlphaTreshold", "double", "N",0.5 + Property: "ShowBackplate", "bool", "N",1 + Property: "BackPlaneOffsetX", "Number", "AN",0 + Property: "BackPlaneOffsetY", "Number", "AN",0 + Property: "BackPlaneRotation", "Number", "AN",0 + Property: "BackPlaneScaleX", "Number", "AN",1 + Property: "BackPlaneScaleY", "Number", "AN",1 + Property: "Background Texture", "object", "N" + Property: "FrontPlateFitImage", "bool", "N",1 + Property: "FrontPlateCrop", "bool", "N",0 + Property: "FrontPlateCenter", "bool", "N",1 + Property: "FrontPlateKeepRatio", "bool", "N",1 + Property: "Foreground Opacity", "double", "N",1 + Property: "ShowFrontplate", "bool", "N",1 + Property: "FrontPlaneOffsetX", "Number", "AN",0 + Property: "FrontPlaneOffsetY", "Number", "AN",0 + Property: "FrontPlaneRotation", "Number", "AN",0 + Property: "FrontPlaneScaleX", "Number", "AN",1 + Property: "FrontPlaneScaleY", "Number", "AN",1 + Property: "Foreground Texture", "object", "N" + Property: "DisplaySafeArea", "bool", "N",0 + Property: "DisplaySafeAreaOnRender", "bool", "N",0 + Property: "SafeAreaDisplayStyle", "enum", "N",1 + Property: "SafeAreaAspectRatio", "double", "N",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "N",0 + Property: "2D Magnifier Zoom", "Number", "AN",100 + Property: "2D Magnifier X", "Number", "AN",50 + Property: "2D Magnifier Y", "Number", "AN",50 + Property: "CameraProjectionType", "enum", "N",1 + Property: "OrthoZoom", "double", "N",1.16666666666667 + Property: "UseRealTimeDOFAndAA", "bool", "N",0 + Property: "UseDepthOfField", "bool", "N",0 + Property: "FocusSource", "enum", "N",0 + Property: "FocusAngle", "double", "N",3.5 + Property: "FocusDistance", "Number", "AN",5 + Property: "UseAntialiasing", "bool", "N",0 + Property: "AntialiasingIntensity", "double", "N",0.77777 + Property: "AntialiasingMethod", "enum", "N",0 + Property: "UseAccumulationBuffer", "bool", "N",0 + Property: "FrameSamplingCount", "int", "N",7 + Property: "FrameSamplingType", "enum", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1.16666666666667 + NodeAttributeName: "NodeAttribute::Ortho_35_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_size_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_size_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "19/11/2022 22:39:10.685" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_size_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "19/11/2022 22:39:10.685" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Ortho_30", "Model::Scene" + Connect: "OO", "Model::Ortho_10", "Model::Scene" + Connect: "OO", "Model::Ortho_100", "Model::Scene" + Connect: "OO", "Model::Ortho_35", "Model::Scene" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_ortho_camera_size_7700_ascii.fbx b/modules/ufbx/data/maya_ortho_camera_size_7700_ascii.fbx new file mode 100644 index 0000000..ef51764 --- /dev/null +++ b/modules/ufbx/data/maya_ortho_camera_size_7700_ascii.fbx @@ -0,0 +1,548 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 11 + Day: 20 + Hour: 0 + Minute: 39 + Second: 23 + Millisecond: 614 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_size_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_size_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "19/11/2022 22:39:23.613" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_ortho_camera_size_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "19/11/2022 22:39:23.613" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2014671538048, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 11 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxCamera" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Position", "Vector", "", "A",0,0,0 + P: "UpVector", "Vector", "", "A",0,1,0 + P: "InterestPosition", "Vector", "", "A",0,0,0 + P: "Roll", "Roll", "", "A",0 + P: "OpticalCenterX", "OpticalCenterX", "", "A",0 + P: "OpticalCenterY", "OpticalCenterY", "", "A",0 + P: "BackgroundColor", "Color", "", "A",0.63,0.63,0.63 + P: "TurnTable", "Number", "", "A",0 + P: "DisplayTurnTableIcon", "bool", "", "",0 + P: "UseMotionBlur", "bool", "", "",0 + P: "UseRealTimeMotionBlur", "bool", "", "",1 + P: "Motion Blur Intensity", "Number", "", "A",1 + P: "AspectRatioMode", "enum", "", "",0 + P: "AspectWidth", "double", "Number", "",320 + P: "AspectHeight", "double", "Number", "",200 + P: "PixelAspectRatio", "double", "Number", "",1 + P: "FilmOffsetX", "Number", "", "A",0 + P: "FilmOffsetY", "Number", "", "A",0 + P: "FilmWidth", "double", "Number", "",0.816 + P: "FilmHeight", "double", "Number", "",0.612 + P: "FilmAspectRatio", "double", "Number", "",1.33333333333333 + P: "FilmSqueezeRatio", "double", "Number", "",1 + P: "FilmFormatIndex", "enum", "", "",0 + P: "PreScale", "Number", "", "A",1 + P: "FilmTranslateX", "Number", "", "A",0 + P: "FilmTranslateY", "Number", "", "A",0 + P: "FilmRollPivotX", "Number", "", "A",0 + P: "FilmRollPivotY", "Number", "", "A",0 + P: "FilmRollValue", "Number", "", "A",0 + P: "FilmRollOrder", "enum", "", "",0 + P: "ApertureMode", "enum", "", "",2 + P: "GateFit", "enum", "", "",0 + P: "FieldOfView", "FieldOfView", "", "A",25.1149997711182 + P: "FieldOfViewX", "FieldOfViewX", "", "A",40 + P: "FieldOfViewY", "FieldOfViewY", "", "A",40 + P: "FocalLength", "Number", "", "A",34.8932762167263 + P: "CameraFormat", "enum", "", "",0 + P: "UseFrameColor", "bool", "", "",0 + P: "FrameColor", "ColorRGB", "Color", "",0.3,0.3,0.3 + P: "ShowName", "bool", "", "",1 + P: "ShowInfoOnMoving", "bool", "", "",1 + P: "ShowGrid", "bool", "", "",1 + P: "ShowOpticalCenter", "bool", "", "",0 + P: "ShowAzimut", "bool", "", "",1 + P: "ShowTimeCode", "bool", "", "",0 + P: "ShowAudio", "bool", "", "",0 + P: "AudioColor", "Vector3D", "Vector", "",0,1,0 + P: "NearPlane", "double", "Number", "",10 + P: "FarPlane", "double", "Number", "",4000 + P: "AutoComputeClipPanes", "bool", "", "",0 + P: "ViewCameraToLookAt", "bool", "", "",1 + P: "ViewFrustumNearFarPlane", "bool", "", "",0 + P: "ViewFrustumBackPlaneMode", "enum", "", "",2 + P: "BackPlaneDistance", "Number", "", "A",4000 + P: "BackPlaneDistanceMode", "enum", "", "",1 + P: "ViewFrustumFrontPlaneMode", "enum", "", "",2 + P: "FrontPlaneDistance", "Number", "", "A",10 + P: "FrontPlaneDistanceMode", "enum", "", "",1 + P: "LockMode", "bool", "", "",0 + P: "LockInterestNavigation", "bool", "", "",0 + P: "BackPlateFitImage", "bool", "", "",0 + P: "BackPlateCrop", "bool", "", "",0 + P: "BackPlateCenter", "bool", "", "",1 + P: "BackPlateKeepRatio", "bool", "", "",1 + P: "BackgroundAlphaTreshold", "double", "Number", "",0.5 + P: "ShowBackplate", "bool", "", "",1 + P: "BackPlaneOffsetX", "Number", "", "A",0 + P: "BackPlaneOffsetY", "Number", "", "A",0 + P: "BackPlaneRotation", "Number", "", "A",0 + P: "BackPlaneScaleX", "Number", "", "A",1 + P: "BackPlaneScaleY", "Number", "", "A",1 + P: "Background Texture", "object", "", "" + P: "FrontPlateFitImage", "bool", "", "",1 + P: "FrontPlateCrop", "bool", "", "",0 + P: "FrontPlateCenter", "bool", "", "",1 + P: "FrontPlateKeepRatio", "bool", "", "",1 + P: "Foreground Opacity", "double", "Number", "",1 + P: "ShowFrontplate", "bool", "", "",1 + P: "FrontPlaneOffsetX", "Number", "", "A",0 + P: "FrontPlaneOffsetY", "Number", "", "A",0 + P: "FrontPlaneRotation", "Number", "", "A",0 + P: "FrontPlaneScaleX", "Number", "", "A",1 + P: "FrontPlaneScaleY", "Number", "", "A",1 + P: "Foreground Texture", "object", "", "" + P: "DisplaySafeArea", "bool", "", "",0 + P: "DisplaySafeAreaOnRender", "bool", "", "",0 + P: "SafeAreaDisplayStyle", "enum", "", "",1 + P: "SafeAreaAspectRatio", "double", "Number", "",1.33333333333333 + P: "Use2DMagnifierZoom", "bool", "", "",0 + P: "2D Magnifier Zoom", "Number", "", "A",100 + P: "2D Magnifier X", "Number", "", "A",50 + P: "2D Magnifier Y", "Number", "", "A",50 + P: "CameraProjectionType", "enum", "", "",0 + P: "OrthoZoom", "double", "Number", "",1 + P: "UseRealTimeDOFAndAA", "bool", "", "",0 + P: "UseDepthOfField", "bool", "", "",0 + P: "FocusSource", "enum", "", "",0 + P: "FocusAngle", "double", "Number", "",3.5 + P: "FocusDistance", "double", "Number", "",200 + P: "UseAntialiasing", "bool", "", "",0 + P: "AntialiasingIntensity", "double", "Number", "",0.77777 + P: "AntialiasingMethod", "enum", "", "",0 + P: "UseAccumulationBuffer", "bool", "", "",0 + P: "FrameSamplingCount", "int", "Integer", "",7 + P: "FrameSamplingType", "enum", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 4 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 2016330322720, "NodeAttribute::Ortho_30", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",300 + P: "AspectHeight", "double", "Number", "",300 + P: "FilmWidth", "Number", "", "A",1.41732 + P: "FilmHeight", "Number", "", "A",0.94488 + P: "FilmAspectRatio", "double", "Number", "",1.5 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",3 + P: "FocalLength", "Number", "", "A",35 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + NodeAttribute: 2016330320784, "NodeAttribute::Ortho_10", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",300 + P: "AspectHeight", "double", "Number", "",300 + P: "FilmWidth", "Number", "", "A",1.41732 + P: "FilmHeight", "Number", "", "A",0.94488 + P: "FilmAspectRatio", "double", "Number", "",1.5 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",3 + P: "FocalLength", "Number", "", "A",35 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "OrthoZoom", "double", "Number", "",0.333333333333333 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 0.333333333333333 + } + NodeAttribute: 2016330305296, "NodeAttribute::Ortho_100", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",300 + P: "AspectHeight", "double", "Number", "",300 + P: "FilmWidth", "Number", "", "A",1.41732 + P: "FilmHeight", "Number", "", "A",0.94488 + P: "FilmAspectRatio", "double", "Number", "",1.5 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",3 + P: "FocalLength", "Number", "", "A",35 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "OrthoZoom", "double", "Number", "",3.33333333333333 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 3.33333333333333 + } + NodeAttribute: 2016330313040, "NodeAttribute::Ortho_35", "Camera" { + Properties70: { + P: "InterestPosition", "Vector", "", "A",0,0,-5 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",300 + P: "AspectHeight", "double", "Number", "",300 + P: "FilmWidth", "Number", "", "A",1.41732 + P: "FilmHeight", "Number", "", "A",0.94488 + P: "FilmAspectRatio", "double", "Number", "",1.5 + P: "ApertureMode", "enum", "", "",3 + P: "GateFit", "enum", "", "",3 + P: "FocalLength", "Number", "", "A",35 + P: "NearPlane", "double", "Number", "",0.1 + P: "FarPlane", "double", "Number", "",10000 + P: "AutoComputeClipPanes", "bool", "", "",1 + P: "CameraProjectionType", "enum", "", "",1 + P: "OrthoZoom", "double", "Number", "",1.16666666666667 + P: "FocusDistance", "Number", "", "A",5 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-5 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1.16666666666667 + } + Model: 2016320825440, "Model::Ortho_30", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2016320818480, "Model::Ortho_10", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2016320820800, "Model::Ortho_100", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2016320827760, "Model::Ortho_35", "Camera" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + AnimationStack: 2014751518400, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2014675386048, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Ortho_30, Model::RootNode + C: "OO",2016320825440,0 + + ;Model::Ortho_10, Model::RootNode + C: "OO",2016320818480,0 + + ;Model::Ortho_100, Model::RootNode + C: "OO",2016320820800,0 + + ;Model::Ortho_35, Model::RootNode + C: "OO",2016320827760,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2014675386048,2014751518400 + + ;NodeAttribute::Ortho_30, Model::Ortho_30 + C: "OO",2016330322720,2016320825440 + + ;NodeAttribute::Ortho_10, Model::Ortho_10 + C: "OO",2016330320784,2016320818480 + + ;NodeAttribute::Ortho_100, Model::Ortho_100 + C: "OO",2016330305296,2016320820800 + + ;NodeAttribute::Ortho_35, Model::Ortho_35 + C: "OO",2016330313040,2016320827760 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_osl_properties_6100_ascii.fbx b/modules/ufbx/data/maya_osl_properties_6100_ascii.fbx new file mode 100644 index 0000000..13d7be1 --- /dev/null +++ b/modules/ufbx/data/maya_osl_properties_6100_ascii.fbx @@ -0,0 +1,436 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 22 + Hour: 4 + Minute: 5 + Second: 26 + Millisecond: 504 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Implementation" { + Count: 1 + } + ObjectType: "BindingTable" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_osl_properties_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_osl_properties_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "22/08/2021 01:05:26.501" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_osl_properties_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "22/08/2021 01:05:26.501" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::standardSurface2", "" { + Version: 102 + ShadingModel: "unknown" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Unknown" + Property: "MultiLayer", "bool", "",0 + Property: "Maya", "Compound", "" + Property: "Maya|TypeId", "int", "",1398031443 + Property: "Maya|base", "float", "",0.01 + Property: "Maya|baseColor", "Vector3D", "",0.0199999995529652,0.0299999993294477,0.0399999991059303 + Property: "Maya|diffuseRoughness", "float", "",0.05 + Property: "Maya|specular", "float", "",0.07 + Property: "Maya|specularColor", "Vector3D", "",0.0799999982118607,0.0900000035762787,0.100000001490116 + Property: "Maya|specularRoughness", "float", "",0.11 + Property: "Maya|specularIOR", "float", "",0.12 + Property: "Maya|specularAnisotropy", "float", "",0.13 + Property: "Maya|specularRotation", "float", "",0.14 + Property: "Maya|metalness", "float", "",0.06 + Property: "Maya|transmission", "float", "",0.15 + Property: "Maya|transmissionColor", "Vector3D", "",0.159999996423721,0.170000001788139,0.180000007152557 + Property: "Maya|transmissionDepth", "float", "",0.19 + Property: "Maya|transmissionScatter", "Vector3D", "",0.200000002980232,0.209999993443489,0.219999998807907 + Property: "Maya|transmissionScatterAnisotropy", "float", "",0.23 + Property: "Maya|transmissionDispersion", "float", "",0.24 + Property: "Maya|transmissionExtraRoughness", "float", "",0.25 + Property: "Maya|subsurface", "float", "",0.26 + Property: "Maya|subsurfaceColor", "Vector3D", "",0.270000010728836,0.280000001192093,0.28999999165535 + Property: "Maya|subsurfaceRadius", "Vector3D", "",0.300000011920929,0.310000002384186,0.319999992847443 + Property: "Maya|subsurfaceScale", "float", "",0.33 + Property: "Maya|subsurfaceAnisotropy", "float", "",0.34 + Property: "Maya|sheen", "float", "",0.46 + Property: "Maya|sheenColor", "Vector3D", "",0.469999998807907,0.479999989271164,0.490000009536743 + Property: "Maya|sheenRoughness", "float", "",0.5 + Property: "Maya|thinWalled", "bool", "",1 + Property: "Maya|coat", "float", "",0.35 + Property: "Maya|coatColor", "Vector3D", "",0.360000014305115,0.370000004768372,0.379999995231628 + Property: "Maya|coatRoughness", "float", "",0.39 + Property: "Maya|coatIOR", "float", "",0.4 + Property: "Maya|coatAnisotropy", "float", "",0.41 + Property: "Maya|coatRotation", "float", "",0.42 + Property: "Maya|coatNormal", "Vector3D", "",0,0,0 + Property: "Maya|coatAffectColor", "float", "",0 + Property: "Maya|coatAffectRoughness", "float", "",0 + Property: "Maya|thinFilmThickness", "float", "",0.55 + Property: "Maya|thinFilmIOR", "float", "",0.56 + Property: "Maya|emission", "float", "",0.51 + Property: "Maya|emissionColor", "Vector3D", "",0.519999980926514,0.529900014400482,0.540000021457672 + Property: "Maya|opacity", "Vector3D", "",0.569999992847443,0.579999983310699,0.589900016784668 + Property: "Maya|normalCamera", "Vector3D", "",1,1,1 + Property: "Maya|normalCameraUsedAs", "int", "",0 + Property: "Maya|normalCameraFactor", "double", "",0 + } + } + Implementation: "Implementation::standardSurface2_Implementation", "" { + Version: 100 + Properties60: { + Property: "ShaderLanguage", "KString", "", "StandardSSL" + Property: "ShaderLanguageVersion", "KString", "", "1.0.1" + Property: "RenderAPI", "KString", "", "OSL" + Property: "RenderAPIVersion", "KString", "", "" + Property: "RootBindingName", "KString", "", "root" + Property: "Constants", "Compound", "" + } + } + BindingTable: "BindingTable::root 3", "" { + Version: 100 + Properties60: { + Property: "TargetName", "KString", "", "root" + Property: "TargetType", "KString", "", "shader" + Property: "CodeAbsoluteURL", "KString", "", "" + Property: "CodeRelativeURL", "KString", "", "" + Property: "CodeTAG", "KString", "", "shader" + Property: "DescAbsoluteURL", "KString", "", "" + Property: "DescRelativeURL", "KString", "", "" + Property: "DescTAG", "KString", "", "shader" + } + Entry: "Maya|specularIOR", "FbxPropertyEntry", "specular_IOR", "FbxSemanticEntry" + Entry: "Maya|emission", "FbxPropertyEntry", "emission", "FbxSemanticEntry" + Entry: "Maya|thinFilmThickness", "FbxPropertyEntry", "thin_film_thickness", "FbxSemanticEntry" + Entry: "Maya|coatAffectColor", "FbxPropertyEntry", "coat_affect_color", "FbxSemanticEntry" + Entry: "Maya|sheenColor", "FbxPropertyEntry", "sheen_color", "FbxSemanticEntry" + Entry: "Maya|sheen", "FbxPropertyEntry", "sheen", "FbxSemanticEntry" + Entry: "Maya|transmissionDepth", "FbxPropertyEntry", "transmission_depth", "FbxSemanticEntry" + Entry: "Maya|transmissionColor", "FbxPropertyEntry", "transmission_color", "FbxSemanticEntry" + Entry: "Maya|specularColor", "FbxPropertyEntry", "specular_color", "FbxSemanticEntry" + Entry: "Maya|sheenRoughness", "FbxPropertyEntry", "sheen_roughness", "FbxSemanticEntry" + Entry: "Maya|metalness", "FbxPropertyEntry", "metalness", "FbxSemanticEntry" + Entry: "Maya|baseColor", "FbxPropertyEntry", "base_color", "FbxSemanticEntry" + Entry: "Maya|base", "FbxPropertyEntry", "base", "FbxSemanticEntry" + Entry: "Maya|coatNormal", "FbxPropertyEntry", "coat_normal", "FbxSemanticEntry" + Entry: "Maya|coatRoughness", "FbxPropertyEntry", "coat_roughness", "FbxSemanticEntry" + Entry: "Maya|transmissionExtraRoughness", "FbxPropertyEntry", "transmission_extra_roughness", "FbxSemanticEntry" + Entry: "Maya|specular", "FbxPropertyEntry", "specular", "FbxSemanticEntry" + Entry: "Maya|subsurfaceScale", "FbxPropertyEntry", "subsurface_scale", "FbxSemanticEntry" + Entry: "Maya|specularAnisotropy", "FbxPropertyEntry", "specular_anisotropy", "FbxSemanticEntry" + Entry: "Maya|diffuseRoughness", "FbxPropertyEntry", "diffuse_roughness", "FbxSemanticEntry" + Entry: "Maya|transmissionDispersion", "FbxPropertyEntry", "transmission_dispersion", "FbxSemanticEntry" + Entry: "Maya|transmission", "FbxPropertyEntry", "transmission", "FbxSemanticEntry" + Entry: "Maya|emissionColor", "FbxPropertyEntry", "emission_color", "FbxSemanticEntry" + Entry: "Maya|subsurfaceAnisotropy", "FbxPropertyEntry", "subsurface_anisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurface", "FbxPropertyEntry", "subsurface", "FbxSemanticEntry" + Entry: "Maya|specularRoughness", "FbxPropertyEntry", "specular_roughness", "FbxSemanticEntry" + Entry: "Maya|coatColor", "FbxPropertyEntry", "coat_color", "FbxSemanticEntry" + Entry: "Maya|transmissionScatterAnisotropy", "FbxPropertyEntry", "transmission_scatter_anisotropy", "FbxSemanticEntry" + Entry: "Maya|coatIOR", "FbxPropertyEntry", "coat_IOR", "FbxSemanticEntry" + Entry: "Maya|specularRotation", "FbxPropertyEntry", "specular_rotation", "FbxSemanticEntry" + Entry: "Maya|coatAffectRoughness", "FbxPropertyEntry", "coat_affect_roughness", "FbxSemanticEntry" + Entry: "Maya|coatRotation", "FbxPropertyEntry", "coat_rotation", "FbxSemanticEntry" + Entry: "Maya|coat", "FbxPropertyEntry", "coat", "FbxSemanticEntry" + Entry: "Maya|thinWalled", "FbxPropertyEntry", "thin_walled", "FbxSemanticEntry" + Entry: "Maya|opacity", "FbxPropertyEntry", "opacity", "FbxSemanticEntry" + Entry: "Maya|thinFilmIOR", "FbxPropertyEntry", "thin_film_IOR", "FbxSemanticEntry" + Entry: "Maya|normalCamera", "FbxPropertyEntry", "normalCamera", "FbxSemanticEntry" + Entry: "Maya|coatAnisotropy", "FbxPropertyEntry", "coat_anisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurfaceRadius", "FbxPropertyEntry", "subsurface_radius", "FbxSemanticEntry" + Entry: "Maya|subsurfaceColor", "FbxPropertyEntry", "subsurface_color", "FbxSemanticEntry" + Entry: "Maya|transmissionScatter", "FbxPropertyEntry", "transmission_scatter", "FbxSemanticEntry" + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::standardSurface2", "Implementation::standardSurface2_Implementation" + Connect: "OO", "BindingTable::root 3", "Implementation::standardSurface2_Implementation" + Connect: "OO", "Material::standardSurface2", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_osl_properties_6100_binary.fbx b/modules/ufbx/data/maya_osl_properties_6100_binary.fbx new file mode 100644 index 0000000..ed5639d Binary files /dev/null and b/modules/ufbx/data/maya_osl_properties_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_osl_properties_7500_ascii.fbx b/modules/ufbx/data/maya_osl_properties_7500_ascii.fbx new file mode 100644 index 0000000..6dad3f0 --- /dev/null +++ b/modules/ufbx/data/maya_osl_properties_7500_ascii.fbx @@ -0,0 +1,491 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 22 + Hour: 4 + Minute: 4 + Second: 33 + Millisecond: 296 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_osl_properties_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_osl_properties_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "22/08/2021 01:04:33.295" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_osl_properties_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "22/08/2021 01:04:33.295" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2714513692080, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceMaterial" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Unknown" + P: "MultiLayer", "bool", "", "",0 + } + } + } + ObjectType: "Implementation" { + Count: 1 + PropertyTemplate: "FbxImplementation" { + Properties70: { + P: "ShaderLanguage", "KString", "", "", "MentalRaySL" + P: "ShaderLanguageVersion", "KString", "", "", "" + P: "RenderAPI", "KString", "", "", "MentalRay" + P: "RenderAPIVersion", "KString", "", "", "" + P: "RootBindingName", "KString", "", "", "" + P: "Constants", "Compound", "", "" + } + } + } + ObjectType: "BindingTable" { + Count: 1 + PropertyTemplate: "FbxBindingTable" { + Properties70: { + P: "TargetName", "KString", "", "", "" + P: "TargetType", "KString", "", "", "" + P: "CodeAbsoluteURL", "KString", "XRefUrl", "", "" + P: "CodeRelativeURL", "KString", "XRefUrl", "", "" + P: "CodeTAG", "KString", "", "", "shader" + P: "DescAbsoluteURL", "KString", "XRefUrl", "", "" + P: "DescRelativeURL", "KString", "XRefUrl", "", "" + P: "DescTAG", "KString", "", "", "shader" + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2714231281088, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2713766152208, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2714518451712, "Material::standardSurface2", "" { + Version: 102 + ShadingModel: "unknown" + MultiLayer: 0 + Properties70: { + P: "Maya", "Compound", "", "" + P: "Maya|TypeId", "int", "Integer", "",1398031443 + P: "Maya|base", "float", "", "",0.01 + P: "Maya|baseColor", "Vector3D", "Vector", "",0.0199999995529652,0.0299999993294477,0.0399999991059303 + P: "Maya|diffuseRoughness", "float", "", "",0.05 + P: "Maya|specular", "float", "", "",0.07 + P: "Maya|specularColor", "Vector3D", "Vector", "",0.0799999982118607,0.0900000035762787,0.100000001490116 + P: "Maya|specularRoughness", "float", "", "",0.11 + P: "Maya|specularIOR", "float", "", "",0.12 + P: "Maya|specularAnisotropy", "float", "", "",0.13 + P: "Maya|specularRotation", "float", "", "",0.14 + P: "Maya|metalness", "float", "", "",0.06 + P: "Maya|transmission", "float", "", "",0.15 + P: "Maya|transmissionColor", "Vector3D", "Vector", "",0.159999996423721,0.170000001788139,0.180000007152557 + P: "Maya|transmissionDepth", "float", "", "",0.19 + P: "Maya|transmissionScatter", "Vector3D", "Vector", "",0.200000002980232,0.209999993443489,0.219999998807907 + P: "Maya|transmissionScatterAnisotropy", "float", "", "",0.23 + P: "Maya|transmissionDispersion", "float", "", "",0.24 + P: "Maya|transmissionExtraRoughness", "float", "", "",0.25 + P: "Maya|subsurface", "float", "", "",0.26 + P: "Maya|subsurfaceColor", "Vector3D", "Vector", "",0.270000010728836,0.280000001192093,0.28999999165535 + P: "Maya|subsurfaceRadius", "Vector3D", "Vector", "",0.300000011920929,0.310000002384186,0.319999992847443 + P: "Maya|subsurfaceScale", "float", "", "",0.33 + P: "Maya|subsurfaceAnisotropy", "float", "", "",0.34 + P: "Maya|sheen", "float", "", "",0.46 + P: "Maya|sheenColor", "Vector3D", "Vector", "",0.469999998807907,0.479999989271164,0.490000009536743 + P: "Maya|sheenRoughness", "float", "", "",0.5 + P: "Maya|thinWalled", "bool", "", "",1 + P: "Maya|coat", "float", "", "",0.35 + P: "Maya|coatColor", "Vector3D", "Vector", "",0.360000014305115,0.370000004768372,0.379999995231628 + P: "Maya|coatRoughness", "float", "", "",0.39 + P: "Maya|coatIOR", "float", "", "",0.4 + P: "Maya|coatAnisotropy", "float", "", "",0.41 + P: "Maya|coatRotation", "float", "", "",0.42 + P: "Maya|coatNormal", "Vector3D", "Vector", "",0,0,0 + P: "Maya|coatAffectColor", "float", "", "",0 + P: "Maya|coatAffectRoughness", "float", "", "",0 + P: "Maya|thinFilmThickness", "float", "", "",0.55 + P: "Maya|thinFilmIOR", "float", "", "",0.56 + P: "Maya|emission", "float", "", "",0.51 + P: "Maya|emissionColor", "Vector3D", "Vector", "",0.519999980926514,0.529900014400482,0.540000021457672 + P: "Maya|opacity", "Vector3D", "Vector", "",0.569999992847443,0.579999983310699,0.589900016784668 + P: "Maya|normalCamera", "Vector3D", "Vector", "",1,1,1 + P: "Maya|normalCameraUsedAs", "int", "Integer", "",0 + P: "Maya|normalCameraFactor", "double", "Number", "",0 + } + } + Implementation: 2714508210128, "Implementation::standardSurface2_Implementation", "" { + Version: 100 + Properties70: { + P: "ShaderLanguage", "KString", "", "", "StandardSSL" + P: "ShaderLanguageVersion", "KString", "", "", "1.0.1" + P: "RenderAPI", "KString", "", "", "OSL" + P: "RootBindingName", "KString", "", "", "root" + } + } + BindingTable: 2714227043232, "BindingTable::root 2", "" { + Version: 100 + Properties70: { + P: "TargetName", "KString", "", "", "root" + P: "TargetType", "KString", "", "", "shader" + } + Entry: "Maya|specularIOR", "FbxPropertyEntry", "specular_IOR", "FbxSemanticEntry" + Entry: "Maya|emission", "FbxPropertyEntry", "emission", "FbxSemanticEntry" + Entry: "Maya|thinFilmThickness", "FbxPropertyEntry", "thin_film_thickness", "FbxSemanticEntry" + Entry: "Maya|coatAffectColor", "FbxPropertyEntry", "coat_affect_color", "FbxSemanticEntry" + Entry: "Maya|sheenColor", "FbxPropertyEntry", "sheen_color", "FbxSemanticEntry" + Entry: "Maya|sheen", "FbxPropertyEntry", "sheen", "FbxSemanticEntry" + Entry: "Maya|transmissionDepth", "FbxPropertyEntry", "transmission_depth", "FbxSemanticEntry" + Entry: "Maya|transmissionColor", "FbxPropertyEntry", "transmission_color", "FbxSemanticEntry" + Entry: "Maya|specularColor", "FbxPropertyEntry", "specular_color", "FbxSemanticEntry" + Entry: "Maya|sheenRoughness", "FbxPropertyEntry", "sheen_roughness", "FbxSemanticEntry" + Entry: "Maya|metalness", "FbxPropertyEntry", "metalness", "FbxSemanticEntry" + Entry: "Maya|baseColor", "FbxPropertyEntry", "base_color", "FbxSemanticEntry" + Entry: "Maya|base", "FbxPropertyEntry", "base", "FbxSemanticEntry" + Entry: "Maya|coatNormal", "FbxPropertyEntry", "coat_normal", "FbxSemanticEntry" + Entry: "Maya|coatRoughness", "FbxPropertyEntry", "coat_roughness", "FbxSemanticEntry" + Entry: "Maya|transmissionExtraRoughness", "FbxPropertyEntry", "transmission_extra_roughness", "FbxSemanticEntry" + Entry: "Maya|specular", "FbxPropertyEntry", "specular", "FbxSemanticEntry" + Entry: "Maya|subsurfaceScale", "FbxPropertyEntry", "subsurface_scale", "FbxSemanticEntry" + Entry: "Maya|specularAnisotropy", "FbxPropertyEntry", "specular_anisotropy", "FbxSemanticEntry" + Entry: "Maya|diffuseRoughness", "FbxPropertyEntry", "diffuse_roughness", "FbxSemanticEntry" + Entry: "Maya|transmissionDispersion", "FbxPropertyEntry", "transmission_dispersion", "FbxSemanticEntry" + Entry: "Maya|transmission", "FbxPropertyEntry", "transmission", "FbxSemanticEntry" + Entry: "Maya|emissionColor", "FbxPropertyEntry", "emission_color", "FbxSemanticEntry" + Entry: "Maya|subsurfaceAnisotropy", "FbxPropertyEntry", "subsurface_anisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurface", "FbxPropertyEntry", "subsurface", "FbxSemanticEntry" + Entry: "Maya|specularRoughness", "FbxPropertyEntry", "specular_roughness", "FbxSemanticEntry" + Entry: "Maya|coatColor", "FbxPropertyEntry", "coat_color", "FbxSemanticEntry" + Entry: "Maya|transmissionScatterAnisotropy", "FbxPropertyEntry", "transmission_scatter_anisotropy", "FbxSemanticEntry" + Entry: "Maya|coatIOR", "FbxPropertyEntry", "coat_IOR", "FbxSemanticEntry" + Entry: "Maya|specularRotation", "FbxPropertyEntry", "specular_rotation", "FbxSemanticEntry" + Entry: "Maya|coatAffectRoughness", "FbxPropertyEntry", "coat_affect_roughness", "FbxSemanticEntry" + Entry: "Maya|coatRotation", "FbxPropertyEntry", "coat_rotation", "FbxSemanticEntry" + Entry: "Maya|coat", "FbxPropertyEntry", "coat", "FbxSemanticEntry" + Entry: "Maya|thinWalled", "FbxPropertyEntry", "thin_walled", "FbxSemanticEntry" + Entry: "Maya|opacity", "FbxPropertyEntry", "opacity", "FbxSemanticEntry" + Entry: "Maya|thinFilmIOR", "FbxPropertyEntry", "thin_film_IOR", "FbxSemanticEntry" + Entry: "Maya|normalCamera", "FbxPropertyEntry", "normalCamera", "FbxSemanticEntry" + Entry: "Maya|coatAnisotropy", "FbxPropertyEntry", "coat_anisotropy", "FbxSemanticEntry" + Entry: "Maya|subsurfaceRadius", "FbxPropertyEntry", "subsurface_radius", "FbxSemanticEntry" + Entry: "Maya|subsurfaceColor", "FbxPropertyEntry", "subsurface_color", "FbxSemanticEntry" + Entry: "Maya|transmissionScatter", "FbxPropertyEntry", "transmission_scatter", "FbxSemanticEntry" + } + AnimationStack: 2713769435008, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2714444212480, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2713766152208,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2714444212480,2713769435008 + + ;Material::standardSurface2, Implementation::standardSurface2_Implementation + C: "OO",2714518451712,2714508210128 + + ;BindingTable::root 2, Implementation::standardSurface2_Implementation + C: "OO",2714227043232,2714508210128 + + ;Geometry::, Model::pCube1 + C: "OO",2714231281088,2713766152208 + + ;Material::standardSurface2, Model::pCube1 + C: "OO",2714518451712,2713766152208 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_osl_properties_7500_binary.fbx b/modules/ufbx/data/maya_osl_properties_7500_binary.fbx new file mode 100644 index 0000000..39132b8 Binary files /dev/null and b/modules/ufbx/data/maya_osl_properties_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_parented_cubes.obj b/modules/ufbx/data/maya_parented_cubes.obj new file mode 100644 index 0000000..621862a --- /dev/null +++ b/modules/ufbx/data/maya_parented_cubes.obj @@ -0,0 +1,115 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_parented_cubes.mtl +g default +v -0.183960 -0.618043 0.634913 +v 0.868507 0.220289 0.721935 +v -0.543854 0.353933 0.835684 +v 0.487994 0.886950 0.980117 +v -0.715139 0.435652 0.372232 +v 0.043368 1.099079 -0.222924 +v -0.287994 -0.486950 -0.380117 +v 0.549736 0.516523 -0.512790 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.054622 -0.246339 0.967643 +vn 0.054622 -0.246339 0.967643 +vn 0.054622 -0.246339 0.967643 +vn 0.054622 -0.246339 0.967643 +vn -0.469846 0.823173 0.318796 +vn -0.469846 0.823173 0.318796 +vn -0.469846 0.823173 0.318796 +vn -0.469846 0.823173 0.318796 +vn -0.570397 0.198172 -0.797104 +vn -0.570398 0.198172 -0.797104 +vn -0.570398 0.198172 -0.797104 +vn -0.570398 0.198173 -0.797104 +vn 0.671023 -0.695052 -0.258129 +vn 0.671024 -0.695052 -0.258129 +vn 0.671023 -0.695052 -0.258129 +vn 0.671024 -0.695052 -0.258129 +vn 0.784334 0.608888 -0.118643 +vn 0.784334 0.608888 -0.118643 +vn 0.784334 0.608888 -0.118643 +vn 0.784334 0.608888 -0.118643 +vn -0.898295 -0.426441 0.105897 +vn -0.898295 -0.426441 0.105897 +vn -0.898295 -0.426441 0.105897 +vn -0.898295 -0.426441 0.105897 +s off +g Parent +usemtl initialShadingGroup +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/5 4/4/6 6/6/7 5/5/8 +f 5/5/9 6/6/10 8/8/11 7/7/12 +f 7/7/13 8/8/14 2/10/15 1/9/16 +f 2/2/17 8/11/18 6/12/19 4/4/20 +f 7/13/21 1/1/22 3/3/23 5/14/24 +g default +v 0.720448 -1.686887 0.440369 +v 1.615625 -1.088665 0.215008 +v 0.156632 -0.699079 0.822924 +v 1.051810 -0.100857 0.597563 +v -0.287994 -0.486950 -0.380117 +v 0.607183 0.111272 -0.605479 +v 0.275822 -1.474758 -0.762672 +v 1.170999 -0.876536 -0.988034 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.342020 -0.163176 0.925417 +vn 0.342020 -0.163176 0.925417 +vn 0.342020 -0.163176 0.925417 +vn 0.342020 -0.163176 0.925417 +vn -0.469846 0.823173 0.318796 +vn -0.469846 0.823173 0.318796 +vn -0.469846 0.823173 0.318796 +vn -0.469846 0.823173 0.318796 +vn -0.342020 0.163176 -0.925417 +vn -0.342020 0.163176 -0.925417 +vn -0.342020 0.163176 -0.925417 +vn -0.342020 0.163176 -0.925417 +vn 0.469846 -0.823173 -0.318796 +vn 0.469846 -0.823173 -0.318796 +vn 0.469846 -0.823173 -0.318796 +vn 0.469846 -0.823173 -0.318796 +vn 0.813798 0.543838 -0.204874 +vn 0.813798 0.543838 -0.204874 +vn 0.813798 0.543838 -0.204874 +vn 0.813798 0.543838 -0.204874 +vn -0.813798 -0.543838 0.204874 +vn -0.813798 -0.543838 0.204874 +vn -0.813798 -0.543838 0.204874 +vn -0.813798 -0.543838 0.204874 +s off +g Child +usemtl initialShadingGroup +f 9/15/25 10/16/26 12/18/27 11/17/28 +f 11/17/29 12/18/30 14/20/31 13/19/32 +f 13/19/33 14/20/34 16/22/35 15/21/36 +f 15/21/37 16/22/38 10/24/39 9/23/40 +f 10/16/41 16/25/42 14/26/43 12/18/44 +f 15/27/45 9/15/46 11/17/47 13/28/48 diff --git a/modules/ufbx/data/maya_parented_cubes_7500_ascii.fbx b/modules/ufbx/data/maya_parented_cubes_7500_ascii.fbx new file mode 100644 index 0000000..5cbbceb --- /dev/null +++ b/modules/ufbx/data/maya_parented_cubes_7500_ascii.fbx @@ -0,0 +1,466 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 7 + Day: 29 + Hour: 23 + Minute: 0 + Second: 6 + Millisecond: 391 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_parented_cubes_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_parented_cubes_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "29/07/2021 20:00:06.390" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_parented_cubes_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "29/07/2021 20:00:06.390" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\geometric_cube.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2701963053776, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 2 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 2 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2701438951920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.676894247531891,-0.361003905534744,0.266383647918701,0.5,-0.174889624118805,0.5,-0.499999940395355,0.5,0.192616611719131,0.5,0.5,0.5,-0.5,0.5,-0.192616611719131,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.640591740608215,-0.174889624118805,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: -0.246525511145592,0.0748007670044899,0.966245293617249,-0.246525511145592,0.0748007744550705,0.966245353221893,-0.246525511145592,0.0748007670044899,0.966245353221893,-0.246525511145592,0.0748007744550705,0.966245353221893,0,1,0,0,1,0,0,1,0,0,1,0,-0.164657920598984,0.164657920598984,-0.972509860992432,-0.164657920598984,0.164657920598984,-0.972509920597076,-0.164657920598984,0.164657920598984,-0.972509920597076,-0.164657935500145,0.164657920598984,-0.972509860992432,0.203154042363167,-0.972598910331726,0.113047905266285,0.203154027462006,-0.972598850727081,0.113047897815704,0.203154042363167,-0.972598910331726,0.113047912716866,0.203154027462006,-0.972598791122437,0.113047897815704,0.992196977138519,0.103346310555935,0.0697473511099815,0.992196977138519,0.103346310555935,0.0697473511099815,0.992196977138519,0.103346310555935,0.0697473511099815,0.992196977138519,0.103346310555935,0.0697473511099815,-0.979839682579041,0.113753996789455,-0.164238050580025,-0.97983980178833,0.113754011690617,-0.164238095283508,-0.979839742183685,0.113754011690617,-0.164238065481186,-0.979839742183685,0.113754011690617,-0.164238065481186 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2701438941520, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2701003615392, "Model::Parent", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",5 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0.1,0.2,0.3 + P: "Lcl Rotation", "Lcl Rotation", "", "A",10,20,30 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1.1,1.2,1.3 + P: "currentUVSet", "KString", "", "U", "map1" + P: "notes", "KString", "", "U", " " + } + Shading: T + Culling: "CullingOff" + } + Model: 2701003620032, "Model::Child", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,-1,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2701713511664, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2701424978960, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2701718302272, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Parent, Model::RootNode + C: "OO",2701003615392,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2701718302272,2701424978960 + + ;Geometry::, Model::Parent + C: "OO",2701438951920,2701003615392 + + ;Material::lambert1, Model::Parent + C: "OO",2701713511664,2701003615392 + + ;Model::Child, Model::Parent + C: "OO",2701003620032,2701003615392 + + ;Geometry::, Model::Child + C: "OO",2701438941520,2701003620032 + + ;Material::lambert1, Model::Child + C: "OO",2701713511664,2701003620032 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_phong_properties_7700_ascii.fbx b/modules/ufbx/data/maya_phong_properties_7700_ascii.fbx new file mode 100644 index 0000000..e4a03eb --- /dev/null +++ b/modules/ufbx/data/maya_phong_properties_7700_ascii.fbx @@ -0,0 +1,426 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 10 + Hour: 20 + Minute: 27 + Second: 44 + Millisecond: 572 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_phong_properties_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_phong_properties_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "10/12/2022 18:27:44.570" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_phong_properties_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "10/12/2022 18:27:44.570" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",192442325000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1886444398064, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfacePhong" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Phong" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + P: "SpecularColor", "Color", "", "A",0.2,0.2,0.2 + P: "SpecularFactor", "Number", "", "A",1 + P: "ShininessExponent", "Number", "", "A",20 + P: "ReflectionColor", "Color", "", "A",0,0,0 + P: "ReflectionFactor", "Number", "", "A",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1886331282288, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1886040231904, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1886326511376, "Material::phong1", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "EmissiveColor", "Color", "", "A",0.100000001490116,0.109999999403954,0.119999997317791 + P: "AmbientColor", "Color", "", "A",0.0700000002980232,0.0799999982118607,0.0900000035762787 + P: "DiffuseColor", "Color", "", "A",0.00999999977648258,0.0199999995529652,0.0299999993294477 + P: "DiffuseFactor", "Number", "", "A",0.129999995231628 + P: "TransparentColor", "Color", "", "A",0.0399999991059303,0.0500000007450581,0.0599999986588955 + P: "TransparencyFactor", "Number", "", "A",1 + P: "SpecularColor", "Color", "", "A",0.180000007152557,0.189999997615814,0.200000002980232 + P: "ShininessExponent", "Number", "", "A",17 + P: "ReflectionColor", "Color", "", "A",0.219999998807907,0.230000004172325,0.239999994635582 + P: "ReflectionFactor", "Number", "", "A",0.209999993443489 + P: "Emissive", "Vector3D", "Vector", "",0.100000001490116,0.109999999403954,0.119999997317791 + P: "Ambient", "Vector3D", "Vector", "",0.0700000002980232,0.0799999982118607,0.0900000035762787 + P: "Diffuse", "Vector3D", "Vector", "",0.00129999992325902,0.00259999984651804,0.00389999976977706 + P: "Specular", "Vector3D", "Vector", "",0.180000007152557,0.189999997615814,0.200000002980232 + P: "Shininess", "double", "Number", "",17 + P: "Opacity", "double", "Number", "",0.950000000496705 + P: "Reflectivity", "double", "Number", "",0.0101429993315935 + } + } + AnimationStack: 1886444199952, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationLayer: 1886457153760, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1886040231904,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1886457153760,1886444199952 + + ;Geometry::, Model::pCube1 + C: "OO",1886331282288,1886040231904 + + ;Material::phong1, Model::pCube1 + C: "OO",1886326511376,1886040231904 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + } +} diff --git a/modules/ufbx/data/maya_pivots.obj b/modules/ufbx/data/maya_pivots.obj new file mode 100644 index 0000000..c71bc11 --- /dev/null +++ b/modules/ufbx/data/maya_pivots.obj @@ -0,0 +1,57 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v 0.861158 1.592324 -0.384592 +v 1.060182 1.759325 -0.534592 +v 0.671950 1.924232 -0.266113 +v 0.870974 2.091233 -0.416113 +v 0.382065 1.904227 -0.673012 +v 0.581089 2.071228 -0.823012 +v 0.571273 1.572320 -0.791491 +v 0.770298 1.739321 -0.941491 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.579769 0.040009 0.813798 +vn 0.579769 0.040009 0.813798 +vn 0.579769 0.040009 0.813798 +vn 0.579769 0.040009 0.813798 +vn -0.473021 0.829769 0.296198 +vn -0.473021 0.829769 0.296198 +vn -0.473021 0.829769 0.296198 +vn -0.473021 0.829769 0.296198 +vn -0.579769 -0.040009 -0.813798 +vn -0.579769 -0.040009 -0.813798 +vn -0.579769 -0.040009 -0.813798 +vn -0.579769 -0.040009 -0.813798 +vn 0.473021 -0.829769 -0.296198 +vn 0.473021 -0.829769 -0.296198 +vn 0.473021 -0.829769 -0.296198 +vn 0.473021 -0.829769 -0.296198 +vn 0.663414 0.556670 -0.500000 +vn 0.663414 0.556670 -0.500000 +vn 0.663414 0.556670 -0.500000 +vn 0.663414 0.556670 -0.500000 +vn -0.663414 -0.556670 0.500000 +vn -0.663414 -0.556670 0.500000 +vn -0.663414 -0.556670 0.500000 +vn -0.663414 -0.556670 0.500000 +s off +g pCube1 +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/5 4/4/6 6/6/7 5/5/8 +f 5/5/9 6/6/10 8/8/11 7/7/12 +f 7/7/13 8/8/14 2/10/15 1/9/16 +f 2/2/17 8/11/18 6/12/19 4/4/20 +f 7/13/21 1/1/22 3/3/23 5/14/24 diff --git a/modules/ufbx/data/maya_pivots_6100_ascii.fbx b/modules/ufbx/data/maya_pivots_6100_ascii.fbx new file mode 100644 index 0000000..6eff2ac --- /dev/null +++ b/modules/ufbx/data/maya_pivots_6100_ascii.fbx @@ -0,0 +1,372 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 26 + Hour: 13 + Minute: 36 + Second: 12 + Millisecond: 532 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",1,2,3 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",4,5,6 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1,-2,-3 + Property: "Lcl Rotation", "Lcl Rotation", "A",20,30,40 + Property: "Lcl Scaling", "Lcl Scaling", "A",0.3,0.4,0.5 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_pivots_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_pivots_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "26/03/2020 11:36:12.530" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_pivots_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "26/03/2020 11:36:12.530" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_pivots_6100_binary.fbx b/modules/ufbx/data/maya_pivots_6100_binary.fbx new file mode 100644 index 0000000..c10c64f Binary files /dev/null and b/modules/ufbx/data/maya_pivots_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_pivots_7500_ascii.fbx b/modules/ufbx/data/maya_pivots_7500_ascii.fbx new file mode 100644 index 0000000..3f68f0b --- /dev/null +++ b/modules/ufbx/data/maya_pivots_7500_ascii.fbx @@ -0,0 +1,429 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 26 + Hour: 13 + Minute: 36 + Second: 45 + Millisecond: 788 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_pivots_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_pivots_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "26/03/2020 11:36:45.786" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_pivots_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "26/03/2020 11:36:45.786" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2459250420992, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2459249891472, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2461087530672, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationPivot", "Vector3D", "Vector", "",1,2,3 + P: "ScalingPivot", "Vector3D", "Vector", "",4,5,6 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-1,-2,-3 + P: "Lcl Rotation", "Lcl Rotation", "", "A",20,30,40 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.3,0.4,0.5 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2460372910976, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2461089285728, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2460354443744, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2461087530672,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2460354443744,2461089285728 + + ;Geometry::, Model::pCube1 + C: "OO",2459249891472,2461087530672 + + ;Material::lambert1, Model::pCube1 + C: "OO",2460372910976,2461087530672 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_pivots_7500_binary.fbx b/modules/ufbx/data/maya_pivots_7500_binary.fbx new file mode 100644 index 0000000..0fbea0a Binary files /dev/null and b/modules/ufbx/data/maya_pivots_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_planar_ngon_7500_ascii.fbx b/modules/ufbx/data/maya_planar_ngon_7500_ascii.fbx new file mode 100644 index 0000000..fa63de3 --- /dev/null +++ b/modules/ufbx/data/maya_planar_ngon_7500_ascii.fbx @@ -0,0 +1,378 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 8 + Hour: 16 + Minute: 26 + Second: 59 + Millisecond: 177 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_planar_ngon_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_planar_ngon_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "08/08/2021 13:26:59.176" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_planar_ngon_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "08/08/2021 13:26:59.176" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1567917230160, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1567818941536, "Geometry::", "Mesh" { + Vertices: *30 { + a: -0.352644205093384,-0.459341019392014,0.815259337425232,0.26465368270874,-0.481840342283249,0.835337221622467,0.780862867832184,-0.320293039083481,0.536344528198242,0.998808920383453,-0.0364046916365623,0.0324865318834782,0.835243999958038,0.261389553546906,-0.483780026435852,0.352644175291061,0.459341555833817,-0.815259218215942,-0.264653772115707,0.481840252876282,-0.835337340831757,-0.780862748622894,0.320292830467224,-0.536344945430756,-0.998808979988098,0.0364045388996601,-0.0324866399168968,-0.835243761539459,-0.261389255523682,0.483780384063721 + } + PolygonVertexIndex: *10 { + a: 0,1,2,3,4,5,6,7,8,-10 + } + Edges: *10 { + a: 0,1,2,3,4,5,6,7,8,9 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *30 { + a: 0.0155160278081894,0.868239164352417,0.495903074741364,0.0155160278081894,0.868239164352417,0.495903104543686,0.0155160278081894,0.868239164352417,0.495903074741364,0.015516028739512,0.868239164352417,0.495903134346008,0.0155160278081894,0.868239164352417,0.495903104543686,0.0155160278081894,0.868239164352417,0.495903074741364,0.0155160278081894,0.868239164352417,0.495903074741364,0.0155160278081894,0.868239164352417,0.495903074741364,0.0155160296708345,0.868239283561707,0.495903164148331,0.0155160278081894,0.868239164352417,0.495903074741364 + } + NormalsW: *10 { + a: 1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *20 { + a: 0.345491468906403,2.98023223876953e-08,0.654508471488953,0,0.904508471488953,0.181635648012161,1,0.47552827000618,0.904508471488953,0.769420862197876,0.654508471488953,0.95105654001236,0.345491468906403,0.951056480407715,0.0954915583133698,0.769420981407166,0,0.475528240203857,0.0954916179180145,0.181635499000549 + } + UVIndex: *10 { + a: 0,1,2,3,4,5,6,7,8,9 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1566516184624, "Model::pDisc1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1566518213392, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1567008971712, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1567824887408, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pDisc1, Model::RootNode + C: "OO",1566516184624,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1567824887408,1567008971712 + + ;Geometry::, Model::pDisc1 + C: "OO",1567818941536,1566516184624 + + ;Material::lambert1, Model::pDisc1 + C: "OO",1566518213392,1566516184624 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_polygon_hole_6100_ascii.fbx b/modules/ufbx/data/maya_polygon_hole_6100_ascii.fbx new file mode 100644 index 0000000..ecf6f63 --- /dev/null +++ b/modules/ufbx/data/maya_polygon_hole_6100_ascii.fbx @@ -0,0 +1,368 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 7 + Hour: 14 + Minute: 12 + Second: 28 + Millisecond: 252 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementEdgeCrease: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: 0.591000318527222,0.506000185012817,0.65500020980835,0.527000617980957,0,0,0.540000200271606,0.620000410079956 + ,0,0,0.602000522613525,0.413999891281128 + } + LayerElementHole: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Hole: 0,1,0,1,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementHole" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_polygon_hole_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_polygon_hole_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "07/06/2022 11:12:28.250" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_polygon_hole_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "07/06/2022 11:12:28.250" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_polygon_hole_6100_binary.fbx b/modules/ufbx/data/maya_polygon_hole_6100_binary.fbx new file mode 100644 index 0000000..69b66d8 Binary files /dev/null and b/modules/ufbx/data/maya_polygon_hole_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_polygon_hole_7700_ascii.fbx b/modules/ufbx/data/maya_polygon_hole_7700_ascii.fbx new file mode 100644 index 0000000..4ccb89e --- /dev/null +++ b/modules/ufbx/data/maya_polygon_hole_7700_ascii.fbx @@ -0,0 +1,415 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 7 + Hour: 14 + Minute: 12 + Second: 2 + Millisecond: 615 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_polygon_hole_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_polygon_hole_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "07/06/2022 11:12:02.614" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_polygon_hole_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "07/06/2022 11:12:02.614" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2118199546576, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2117890499040, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *12 { + a: 0.591000318527222,0.506000185012817,0.65500020980835,0.527000617980957,0,0,0.540000200271606,0.620000410079956,0,0,0.602000522613525,0.413999891281128 + } + } + LayerElementHole: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Hole: *6 { + a: 0,1,0,1,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementHole" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2118225492448, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2118274011712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2118161706000, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2118094251856, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2118225492448,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2118094251856,2118161706000 + + ;Geometry::, Model::pCube1 + C: "OO",2117890499040,2118225492448 + + ;Material::lambert1, Model::pCube1 + C: "OO",2118274011712,2118225492448 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_polygon_hole_7700_binary.fbx b/modules/ufbx/data/maya_polygon_hole_7700_binary.fbx new file mode 100644 index 0000000..91280f7 Binary files /dev/null and b/modules/ufbx/data/maya_polygon_hole_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_post_rotate_order.obj b/modules/ufbx/data/maya_post_rotate_order.obj new file mode 100644 index 0000000..9e093f4 --- /dev/null +++ b/modules/ufbx/data/maya_post_rotate_order.obj @@ -0,0 +1,148 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v 0.320928 -0.141247 0.917189 +v -0.069895 0.130078 0.577238 +v 0.132621 0.138645 1.374424 +v -0.121446 0.168950 1.290372 +v 0.000323 -0.389041 1.426492 +v -0.411448 -0.039442 1.762128 +v 0.070090 -0.389213 0.936818 +v -0.025101 -0.320094 0.468041 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.572235 0.820083 -0.003337 +vn 0.572235 0.820083 -0.003337 +vn 0.572235 0.820083 -0.003337 +vn 0.245967 0.868505 -0.430347 +vn 0.245967 0.868505 -0.430347 +vn 0.245967 0.868505 -0.430347 +vn -0.291805 0.166104 0.941944 +vn -0.291805 0.166104 0.941944 +vn -0.291805 0.166104 0.941944 +vn 0.744217 0.307105 0.593151 +vn 0.744217 0.307105 0.593151 +vn 0.744217 0.307105 0.593151 +vn -0.663742 -0.747088 -0.036136 +vn -0.663742 -0.747088 -0.036136 +vn -0.663742 -0.747088 -0.036136 +vn -0.392659 -0.918001 -0.055621 +vn -0.392659 -0.918001 -0.055621 +vn -0.392659 -0.918001 -0.055621 +vn 0.672952 -0.699729 -0.239824 +vn 0.672952 -0.699728 -0.239824 +vn 0.672952 -0.699728 -0.239824 +vn 0.724627 0.229707 -0.649730 +vn 0.724627 0.229707 -0.649730 +vn 0.724627 0.229707 -0.649730 +vn -0.994303 -0.082595 -0.067373 +vn -0.994303 -0.082595 -0.067373 +vn -0.994303 -0.082595 -0.067373 +vn -0.847395 0.406811 -0.341214 +vn -0.847395 0.406811 -0.341214 +vn -0.847395 0.406811 -0.341214 +vn 0.703433 -0.703625 0.100471 +vn 0.703433 -0.703625 0.100471 +vn 0.703433 -0.703625 0.100471 +vn 0.869251 -0.172208 0.463407 +vn 0.869251 -0.172208 0.463407 +vn 0.869251 -0.172208 0.463407 +s off +g pCube1 +f 2/2/1 4/4/2 1/1/3 +f 1/1/4 4/4/5 3/3/6 +f 3/3/7 4/4/8 5/5/9 +f 5/5/10 4/4/11 6/6/12 +f 6/6/13 8/8/14 5/5/15 +f 5/5/16 8/8/17 7/7/18 +f 7/7/19 8/8/20 1/9/21 +f 1/9/22 8/8/23 2/10/24 +f 2/2/25 8/11/26 4/4/27 +f 4/4/28 8/11/29 6/12/30 +f 7/13/31 1/1/32 5/14/33 +f 5/14/34 1/1/35 3/3/36 +g default +v 0.302143 0.031041 -1.193777 +v -0.085721 0.438246 -1.033549 +v 0.167326 -0.288863 -0.743946 +v -0.088196 -0.206584 -0.722234 +v -0.004733 -0.542893 -1.196196 +v -0.363763 -0.729912 -0.705741 +v 0.033349 -0.089013 -1.389045 +v -0.085530 0.367645 -1.493550 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.636968 0.333176 0.695173 +vn 0.636968 0.333176 0.695173 +vn 0.636968 0.333176 0.695173 +vn 0.289233 0.737035 0.610839 +vn 0.289233 0.737035 0.610839 +vn 0.289233 0.737035 0.610839 +vn -0.216223 -0.813823 0.539389 +vn -0.216223 -0.813823 0.539389 +vn -0.216223 -0.813823 0.539389 +vn 0.803519 -0.409490 0.432058 +vn 0.803519 -0.409490 0.432058 +vn 0.803519 -0.409490 0.432058 +vn -0.724432 -0.271243 -0.633739 +vn -0.724432 -0.271243 -0.633739 +vn -0.724432 -0.271243 -0.633739 +vn -0.470277 -0.311397 -0.825755 +vn -0.470277 -0.311397 -0.825755 +vn -0.470277 -0.311397 -0.825755 +vn 0.595823 -0.028567 -0.802607 +vn 0.595823 -0.028567 -0.802607 +vn 0.595823 -0.028567 -0.802607 +vn 0.698200 0.707660 -0.108322 +vn 0.698200 0.707660 -0.108322 +vn 0.698200 0.707660 -0.108322 +vn -0.999994 0.003386 -0.000935 +vn -0.999994 0.003386 -0.000935 +vn -0.999994 0.003386 -0.000935 +vn -0.830753 0.447865 0.330555 +vn -0.830753 0.447865 0.330555 +vn -0.830753 0.447865 0.330555 +vn 0.647555 -0.343373 -0.680270 +vn 0.647555 -0.343373 -0.680270 +vn 0.647555 -0.343373 -0.680270 +vn 0.879777 -0.470108 -0.070652 +vn 0.879777 -0.470108 -0.070652 +vn 0.879776 -0.470108 -0.070652 +s off +g pCube2 +f 10/16/37 12/18/38 9/15/39 +f 9/15/40 12/18/41 11/17/42 +f 11/17/43 12/18/44 13/19/45 +f 13/19/46 12/18/47 14/20/48 +f 14/20/49 16/22/50 13/19/51 +f 13/19/52 16/22/53 15/21/54 +f 15/21/55 16/22/56 9/23/57 +f 9/23/58 16/22/59 10/24/60 +f 10/16/61 16/25/62 12/18/63 +f 12/18/64 16/25/65 14/26/66 +f 15/27/67 9/15/68 13/28/69 +f 13/28/70 9/15/71 11/17/72 diff --git a/modules/ufbx/data/maya_post_rotate_order_6100_ascii.fbx b/modules/ufbx/data/maya_post_rotate_order_6100_ascii.fbx new file mode 100644 index 0000000..53d66a0 --- /dev/null +++ b/modules/ufbx/data/maya_post_rotate_order_6100_ascii.fbx @@ -0,0 +1,643 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 7 + Hour: 21 + Minute: 5 + Second: 24 + Millisecond: 760 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 5 + ObjectType: "Model" { + Count: 2 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",26.0640382322082,-36.7417712642165,-61.4466190640661 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,1 + Property: "Lcl Rotation", "Lcl Rotation", "A",30,50,70 + Property: "Lcl Scaling", "Lcl Scaling", "A",0.666581577274735,0.666581577274735,0.666581577274735 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.418393850326538,-0.341942727565765,-0.0123836398124695,0.436771154403687,-0.5,0.102691292762756,-0.330338418483734 + ,0.446155309677124,0.300303280353546,0.0532375276088715,0.5,0.185364276170731,-0.5,0.5,-0.5,-0.0189733505249023,1.27946376800537 + ,-0.233094662427902,-0.263801336288452,-0.203426539897919,-0.499999821186066,0.199826151132584,-0.760887086391449 + ,-0.5 + PolygonVertexIndex: 1,3,-1,0,3,-3,2,3,-5,4,3,-6,5,7,-5,4,7,-7,6,7,-1,0,7,-2,1,7,-4,3,7,-6,6,0,-5,4,0,-3 + Edges: 2,4,11,16,5,0,8,10,17,12,20,22,1,7,13,19,25,31 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: -0.157623440027237,-0.141253903508186,0.977344512939453,-0.157623425126076,-0.141253873705864,0.977344453334808 + ,-0.157623440027237,-0.141253873705864,0.977344453334808,0.31405371427536,-0.38024565577507,0.869933068752289 + ,0.31405371427536,-0.380245625972748,0.869933068752289,0.31405371427536,-0.380245625972748,0.869933009147644 + ,-0.111860305070877,0.989612996578217,0.0902955755591393,-0.111860319972038,0.989613115787506,0.0902955904603004 + ,-0.111860312521458,0.989613056182861,0.0902955904603004,-0.752137720584869,0.256265759468079,0.607138097286224 + ,-0.752137720584869,0.256265759468079,0.607138097286224,-0.752137780189514,0.256265789270401,0.607138156890869 + ,0.277074933052063,0.153784051537514,-0.948461949825287,0.277074933052063,0.153784036636353,-0.948461890220642 + ,0.277074933052063,0.153784036636353,-0.948461949825287,-1.53259622948099e-06,-6.43530540855863e-07,-1,-1.53259645685466e-06 + ,-6.43530597699282e-07,-1,-1.53259645685466e-06,-6.43530654542701e-07,-1,-0.707492887973785,-0.588405907154083 + ,-0.39144891500473,-0.70749294757843,-0.588405966758728,-0.391448944807053,-0.70749294757843,-0.588405966758728 + ,-0.391448944807053,-0.220828086137772,-0.860413253307343,0.459264636039734,-0.22082807123661,-0.860413253307343 + ,0.459264606237411,-0.220828101038933,-0.860413253307343,0.459264606237411,0.810446739196777,0.349689304828644 + ,-0.469993084669113,0.810446679592133,0.349689275026321,-0.469993025064468,0.810446739196777,0.349689304828644 + ,-0.469993084669113,0.994361877441406,0.103788278996944,0.0217356197535992,0.994361937046051,0.103788278996944 + ,0.0217356197535992,0.994361877441406,0.103788271546364,0.0217356216162443,-0.882903635501862,-0.296464085578918 + ,-0.364129424095154,-0.882903635501862,-0.296464055776596,-0.364129394292831,-0.882903635501862,-0.296464055776596 + ,-0.364129394292831,-0.97756016254425,0.0262976530939341,0.209008753299713,-0.97756016254425,0.0262976512312889 + ,0.209008738398552,-0.977560102939606,0.0262976475059986,0.209008723497391 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0.157566100358963,0.973438918590546,0.166101261973381,0.157566100358963,0.97343897819519,0.16610124707222,0.157566100358963 + ,0.97343897819519,0.16610124707222,-0.00776232779026031,0.915233671665192,0.402848720550537,-0.00776234269142151 + ,0.915233671665192,0.402848690748215,-0.00776232872158289,0.915233731269836,0.402848750352859,-0.293559640645981 + ,0.0539021119475365,-0.954419910907745,-0.293559640645981,0.0539021156728268,-0.954419910907745,-0.293559640645981 + ,0.0539021231234074,-0.95441997051239,-0.424347221851349,0.516540288925171,-0.74371737241745,-0.424347221851349 + ,0.516540288925171,-0.74371737241745,-0.424347251653671,0.516540348529816,-0.743717432022095,0.817931115627289 + ,-0.555730640888214,0.148836448788643,0.817931056022644,-0.555730640888214,0.148836463689804,0.817931056022644 + ,-0.555730640888214,0.148836463689804,-0.768846929073334,-0.639432847499847,1.58982652465056e-06,-0.768846929073334 + ,-0.639432847499847,1.58982675202424e-06,-0.768846929073334,-0.639432847499847,1.58982675202424e-06,-0.300964176654816 + ,-0.250305503606796,0.920199871063232,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.300964176654816 + ,-0.250305503606796,0.920199871063232,-0.0301197022199631,0.476681232452393,0.878560066223145,-0.0301196910440922 + ,0.47668120265007,0.878560066223145,-0.0301196947693825,0.47668120265007,0.878560066223145,-0.47749075293541 + ,0.859119534492493,-0.1841641664505,-0.477490723133087,0.859119474887848,-0.184164151549339,-0.47749075293541 + ,0.859119534492493,-0.1841641664505,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.0680162906646729 + ,0.467008024454117,0.881633341312408,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.367951095104218 + ,0.918582439422607,0.144285723567009,-0.367951065301895,0.918582439422607,0.144285708665848,-0.367951065301895 + ,0.918582439422607,0.144285708665848,0.0393971242010593,0.997494459152222,0.0587597265839577,0.039397120475769 + ,0.997494459152222,0.0587597265839577,0.039397120475769,0.997494518756866,0.0587597265839577 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 0.974847674369812,-0.180177807807922,0.131179973483086,0.974847674369812,-0.180177807807922,0.131179973483086 + ,0.974847674369812,-0.180177807807922,0.131179988384247,0.949373483657837,0.1332688331604,-0.284480929374695 + ,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480959177017 + ,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695 + ,0.949373483657837,0.133268848061562,-0.284480929374695,0.504200637340546,0.817015290260315,0.279763787984848 + ,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763787984848 + ,0.504200637340546,0.817015290260315,0.279763758182526,0.504200637340546,0.817015290260315,0.279763758182526 + ,0.504200637340546,0.817015290260315,0.279763728380203,0.639432847499847,-0.768846929073334,-4.85215878143208e-07 + ,0.639432847499847,-0.768846929073334,-4.85215991830046e-07,0.639432847499847,-0.768846929073334,-4.85215934986627e-07 + ,0.639432847499847,-0.768846929073334,-2.47408053155596e-07,0.639432847499847,-0.768846929073334,-2.44388530745709e-07 + ,0.639432847499847,-0.768846929073334,-2.44388530745709e-07,0.974847555160522,-0.180177822709084,0.131179988384247 + ,0.974847674369812,-0.180177837610245,0.131179988384247,0.974847555160522,-0.180177852511406,0.131179988384247 + ,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.33937993645668,-0.373672544956207,-0.863243937492371 + ,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.0813524946570396,0.878140926361084,-0.471434265375137 + ,-0.0813524946570396,0.878140926361084,-0.471434265375137,-0.081352487206459,0.878140926361084,-0.471434265375137 + ,-0.291707336902618,-0.261372208595276,0.920104026794434,-0.291707336902618,-0.261372178792953,0.920104026794434 + ,-0.291707336902618,-0.261372178792953,0.920104026794434,0.206939816474915,-0.0656755045056343,0.976146817207336 + ,0.206939801573753,-0.0656755045056343,0.976146817207336,0.206939801573753,-0.0656755045056343,0.976146817207336 + + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 1,3,0,0,3,2,2,3,4,4,3,5,5,7,4,4,7,6,6,7,8,8,7,9,1,10,3,3,10,11,12,0,13,13,0,2 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::pCube2", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",5 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",26.0640382322082,-36.7417712642165,-61.4466190640661 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,-1 + Property: "Lcl Rotation", "Lcl Rotation", "A",30,50,70 + Property: "Lcl Scaling", "Lcl Scaling", "A",0.666581577274735,0.666581577274735,0.666581577274735 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.418393850326538,-0.341942727565765,-0.0123836398124695,0.436771154403687,-0.5,0.102691292762756,-0.330338418483734 + ,0.446155309677124,0.300303280353546,0.0532375276088715,0.5,0.185364276170731,-0.5,0.5,-0.5,-0.0189733505249023,1.27946376800537 + ,-0.233094662427902,-0.263801336288452,-0.203426539897919,-0.499999821186066,0.199826151132584,-0.760887086391449 + ,-0.5 + PolygonVertexIndex: 1,3,-1,0,3,-3,2,3,-5,4,3,-6,5,7,-5,4,7,-7,6,7,-1,0,7,-2,1,7,-4,3,7,-6,6,0,-5,4,0,-3 + Edges: 2,4,11,16,5,0,8,10,17,12,20,22,1,7,13,19,25,31 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: -0.157623440027237,-0.141253903508186,0.977344512939453,-0.157623425126076,-0.141253873705864,0.977344453334808 + ,-0.157623440027237,-0.141253873705864,0.977344453334808,0.31405371427536,-0.38024565577507,0.869933068752289 + ,0.31405371427536,-0.380245625972748,0.869933068752289,0.31405371427536,-0.380245625972748,0.869933009147644 + ,-0.111860305070877,0.989612996578217,0.0902955755591393,-0.111860319972038,0.989613115787506,0.0902955904603004 + ,-0.111860312521458,0.989613056182861,0.0902955904603004,-0.752137720584869,0.256265759468079,0.607138097286224 + ,-0.752137720584869,0.256265759468079,0.607138097286224,-0.752137780189514,0.256265789270401,0.607138156890869 + ,0.277074933052063,0.153784051537514,-0.948461949825287,0.277074933052063,0.153784036636353,-0.948461890220642 + ,0.277074933052063,0.153784036636353,-0.948461949825287,-1.53259622948099e-06,-6.43530540855863e-07,-1,-1.53259645685466e-06 + ,-6.43530597699282e-07,-1,-1.53259645685466e-06,-6.43530654542701e-07,-1,-0.707492887973785,-0.588405907154083 + ,-0.39144891500473,-0.70749294757843,-0.588405966758728,-0.391448944807053,-0.70749294757843,-0.588405966758728 + ,-0.391448944807053,-0.220828086137772,-0.860413253307343,0.459264636039734,-0.22082807123661,-0.860413253307343 + ,0.459264606237411,-0.220828101038933,-0.860413253307343,0.459264606237411,0.810446739196777,0.349689304828644 + ,-0.469993084669113,0.810446679592133,0.349689275026321,-0.469993025064468,0.810446739196777,0.349689304828644 + ,-0.469993084669113,0.994361877441406,0.103788278996944,0.0217356197535992,0.994361937046051,0.103788278996944 + ,0.0217356197535992,0.994361877441406,0.103788271546364,0.0217356216162443,-0.882903635501862,-0.296464085578918 + ,-0.364129424095154,-0.882903635501862,-0.296464055776596,-0.364129394292831,-0.882903635501862,-0.296464055776596 + ,-0.364129394292831,-0.97756016254425,0.0262976530939341,0.209008753299713,-0.97756016254425,0.0262976512312889 + ,0.209008738398552,-0.977560102939606,0.0262976475059986,0.209008723497391 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0.157566100358963,0.973438918590546,0.166101261973381,0.157566100358963,0.97343897819519,0.16610124707222,0.157566100358963 + ,0.97343897819519,0.16610124707222,-0.00776232779026031,0.915233671665192,0.402848720550537,-0.00776234269142151 + ,0.915233671665192,0.402848690748215,-0.00776232872158289,0.915233731269836,0.402848750352859,-0.293559640645981 + ,0.0539021119475365,-0.954419910907745,-0.293559640645981,0.0539021156728268,-0.954419910907745,-0.293559640645981 + ,0.0539021231234074,-0.95441997051239,-0.424347221851349,0.516540288925171,-0.74371737241745,-0.424347221851349 + ,0.516540288925171,-0.74371737241745,-0.424347251653671,0.516540348529816,-0.743717432022095,0.817931115627289 + ,-0.555730640888214,0.148836448788643,0.817931056022644,-0.555730640888214,0.148836463689804,0.817931056022644 + ,-0.555730640888214,0.148836463689804,-0.768846929073334,-0.639432847499847,1.58982652465056e-06,-0.768846929073334 + ,-0.639432847499847,1.58982675202424e-06,-0.768846929073334,-0.639432847499847,1.58982675202424e-06,-0.300964176654816 + ,-0.250305503606796,0.920199871063232,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.300964176654816 + ,-0.250305503606796,0.920199871063232,-0.0301197022199631,0.476681232452393,0.878560066223145,-0.0301196910440922 + ,0.47668120265007,0.878560066223145,-0.0301196947693825,0.47668120265007,0.878560066223145,-0.47749075293541 + ,0.859119534492493,-0.1841641664505,-0.477490723133087,0.859119474887848,-0.184164151549339,-0.47749075293541 + ,0.859119534492493,-0.1841641664505,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.0680162906646729 + ,0.467008024454117,0.881633341312408,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.367951095104218 + ,0.918582439422607,0.144285723567009,-0.367951065301895,0.918582439422607,0.144285708665848,-0.367951065301895 + ,0.918582439422607,0.144285708665848,0.0393971242010593,0.997494459152222,0.0587597265839577,0.039397120475769 + ,0.997494459152222,0.0587597265839577,0.039397120475769,0.997494518756866,0.0587597265839577 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 0.974847674369812,-0.180177807807922,0.131179973483086,0.974847674369812,-0.180177807807922,0.131179973483086 + ,0.974847674369812,-0.180177807807922,0.131179988384247,0.949373483657837,0.1332688331604,-0.284480929374695 + ,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480959177017 + ,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695 + ,0.949373483657837,0.133268848061562,-0.284480929374695,0.504200637340546,0.817015290260315,0.279763787984848 + ,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763787984848 + ,0.504200637340546,0.817015290260315,0.279763758182526,0.504200637340546,0.817015290260315,0.279763758182526 + ,0.504200637340546,0.817015290260315,0.279763728380203,0.639432847499847,-0.768846929073334,-4.85215878143208e-07 + ,0.639432847499847,-0.768846929073334,-4.85215991830046e-07,0.639432847499847,-0.768846929073334,-4.85215934986627e-07 + ,0.639432847499847,-0.768846929073334,-2.47408053155596e-07,0.639432847499847,-0.768846929073334,-2.44388530745709e-07 + ,0.639432847499847,-0.768846929073334,-2.44388530745709e-07,0.974847555160522,-0.180177822709084,0.131179988384247 + ,0.974847674369812,-0.180177837610245,0.131179988384247,0.974847555160522,-0.180177852511406,0.131179988384247 + ,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.33937993645668,-0.373672544956207,-0.863243937492371 + ,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.0813524946570396,0.878140926361084,-0.471434265375137 + ,-0.0813524946570396,0.878140926361084,-0.471434265375137,-0.081352487206459,0.878140926361084,-0.471434265375137 + ,-0.291707336902618,-0.261372208595276,0.920104026794434,-0.291707336902618,-0.261372178792953,0.920104026794434 + ,-0.291707336902618,-0.261372178792953,0.920104026794434,0.206939816474915,-0.0656755045056343,0.976146817207336 + ,0.206939801573753,-0.0656755045056343,0.976146817207336,0.206939801573753,-0.0656755045056343,0.976146817207336 + + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 1,3,0,0,3,2,2,3,4,4,3,5,5,7,4,4,7,6,6,7,8,8,7,9,1,10,3,3,10,11,12,0,13,13,0,2 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube2_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_post_rotate_order_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_post_rotate_order_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "07/04/2020 18:05:24.759" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_post_rotate_order_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "07/04/2020 18:05:24.759" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::pCube2", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Material::lambert1", "Model::pCube2" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_post_rotate_order_6100_binary.fbx b/modules/ufbx/data/maya_post_rotate_order_6100_binary.fbx new file mode 100644 index 0000000..cd65c72 Binary files /dev/null and b/modules/ufbx/data/maya_post_rotate_order_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_post_rotate_order_7500_ascii.fbx b/modules/ufbx/data/maya_post_rotate_order_7500_ascii.fbx new file mode 100644 index 0000000..88e5e1d --- /dev/null +++ b/modules/ufbx/data/maya_post_rotate_order_7500_ascii.fbx @@ -0,0 +1,560 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 7 + Hour: 20 + Minute: 50 + Second: 51 + Millisecond: 652 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_pre_rotate_order_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_pre_rotate_order_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "07/04/2020 17:50:51.650" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_pre_rotate_order_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "07/04/2020 17:50:51.650" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2142073008112, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 2 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 2 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2141920570240, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.418393850326538,-0.341942727565765,-0.0123836398124695,0.436771154403687,-0.5,0.102691292762756,-0.330338418483734,0.446155309677124,0.300303280353546,0.0532375276088715,0.5,0.185364276170731,-0.5,0.5,-0.5,-0.0189733505249023,1.27946376800537,-0.233094662427902,-0.263801336288452,-0.203426539897919,-0.499999821186066,0.199826151132584,-0.760887086391449,-0.5 + } + PolygonVertexIndex: *36 { + a: 1,3,-1,0,3,-3,2,3,-5,4,3,-6,5,7,-5,4,7,-7,6,7,-1,0,7,-2,1,7,-4,3,7,-6,6,0,-5,4,0,-3 + } + Edges: *18 { + a: 2,4,11,16,5,0,8,10,17,12,20,22,1,7,13,19,25,31 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *108 { + a: -0.157623440027237,-0.141253903508186,0.977344512939453,-0.157623425126076,-0.141253873705864,0.977344453334808,-0.157623440027237,-0.141253873705864,0.977344453334808,0.31405371427536,-0.38024565577507,0.869933068752289,0.31405371427536,-0.380245625972748,0.869933068752289,0.31405371427536,-0.380245625972748,0.869933009147644,-0.111860305070877,0.989612996578217,0.0902955755591393,-0.111860319972038,0.989613115787506,0.0902955904603004,-0.111860312521458,0.989613056182861,0.0902955904603004,-0.752137720584869,0.256265759468079,0.607138097286224,-0.752137720584869,0.256265759468079,0.607138097286224,-0.752137780189514,0.256265789270401,0.607138156890869,0.277074933052063,0.153784051537514,-0.948461949825287,0.277074933052063,0.153784036636353,-0.948461890220642,0.277074933052063,0.153784036636353,-0.948461949825287,-1.53259622948099e-06,-6.43530540855863e-07,-1,-1.53259645685466e-06,-6.43530597699282e-07,-1,-1.53259645685466e-06,-6.43530654542701e-07,-1,-0.707492887973785,-0.588405907154083,-0.39144891500473,-0.70749294757843,-0.588405966758728,-0.391448944807053,-0.70749294757843,-0.588405966758728,-0.391448944807053,-0.220828086137772,-0.860413253307343,0.459264636039734,-0.22082807123661,-0.860413253307343,0.459264606237411,-0.220828101038933,-0.860413253307343,0.459264606237411,0.810446739196777,0.349689304828644,-0.469993084669113,0.810446679592133,0.349689275026321,-0.469993025064468,0.810446739196777,0.349689304828644,-0.469993084669113,0.994361877441406,0.103788278996944,0.0217356197535992,0.994361937046051,0.103788278996944,0.0217356197535992,0.994361877441406,0.103788271546364,0.0217356216162443,-0.882903635501862,-0.296464085578918,-0.364129424095154,-0.882903635501862,-0.296464055776596,-0.364129394292831,-0.882903635501862,-0.296464055776596,-0.364129394292831,-0.97756016254425,0.0262976530939341,0.209008753299713,-0.97756016254425,0.0262976512312889,0.209008738398552,-0.977560102939606,0.0262976475059986,0.209008723497391 + } + NormalsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *108 { + a: 0.157566100358963,0.973438918590546,0.166101261973381,0.157566100358963,0.97343897819519,0.16610124707222,0.157566100358963,0.97343897819519,0.16610124707222,-0.00776232779026031,0.915233671665192,0.402848720550537,-0.00776234269142151,0.915233671665192,0.402848690748215,-0.00776232872158289,0.915233731269836,0.402848750352859,-0.293559640645981,0.0539021119475365,-0.954419910907745,-0.293559640645981,0.0539021156728268,-0.954419910907745,-0.293559640645981,0.0539021231234074,-0.95441997051239,-0.424347221851349,0.516540288925171,-0.74371737241745,-0.424347221851349,0.516540288925171,-0.74371737241745,-0.424347251653671,0.516540348529816,-0.743717432022095,0.817931115627289,-0.555730640888214,0.148836448788643,0.817931056022644,-0.555730640888214,0.148836463689804,0.817931056022644,-0.555730640888214,0.148836463689804,-0.768846929073334,-0.639432847499847,1.58982652465056e-06,-0.768846929073334,-0.639432847499847,1.58982675202424e-06,-0.768846929073334,-0.639432847499847,1.58982675202424e-06,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.0301197022199631,0.476681232452393,0.878560066223145,-0.0301196910440922,0.47668120265007,0.878560066223145,-0.0301196947693825,0.47668120265007,0.878560066223145,-0.47749075293541,0.859119534492493,-0.1841641664505,-0.477490723133087,0.859119474887848,-0.184164151549339,-0.47749075293541,0.859119534492493,-0.1841641664505,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.0680162906646729,0.467008024454117,0.881633341312408,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.367951095104218,0.918582439422607,0.144285723567009,-0.367951065301895,0.918582439422607,0.144285708665848,-0.367951065301895,0.918582439422607,0.144285708665848,0.0393971242010593,0.997494459152222,0.0587597265839577,0.039397120475769,0.997494459152222,0.0587597265839577,0.039397120475769,0.997494518756866,0.0587597265839577 + } + BinormalsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *108 { + a: 0.974847674369812,-0.180177807807922,0.131179973483086,0.974847674369812,-0.180177807807922,0.131179973483086,0.974847674369812,-0.180177807807922,0.131179988384247,0.949373483657837,0.1332688331604,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480959177017,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763758182526,0.504200637340546,0.817015290260315,0.279763758182526,0.504200637340546,0.817015290260315,0.279763728380203,0.639432847499847,-0.768846929073334,-4.85215878143208e-07,0.639432847499847,-0.768846929073334,-4.85215991830046e-07,0.639432847499847,-0.768846929073334,-4.85215934986627e-07,0.639432847499847,-0.768846929073334,-2.47408053155596e-07,0.639432847499847,-0.768846929073334,-2.44388530745709e-07,0.639432847499847,-0.768846929073334,-2.44388530745709e-07,0.974847555160522,-0.180177822709084,0.131179988384247,0.974847674369812,-0.180177837610245,0.131179988384247,0.974847555160522,-0.180177852511406,0.131179988384247,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.33937993645668,-0.373672544956207,-0.863243937492371,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.0813524946570396,0.878140926361084,-0.471434265375137,-0.0813524946570396,0.878140926361084,-0.471434265375137,-0.081352487206459,0.878140926361084,-0.471434265375137,-0.291707336902618,-0.261372208595276,0.920104026794434,-0.291707336902618,-0.261372178792953,0.920104026794434,-0.291707336902618,-0.261372178792953,0.920104026794434,0.206939816474915,-0.0656755045056343,0.976146817207336,0.206939801573753,-0.0656755045056343,0.976146817207336,0.206939801573753,-0.0656755045056343,0.976146817207336 + } + TangentsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *36 { + a: 1,3,0,0,3,2,2,3,4,4,3,5,5,7,4,4,7,6,6,7,8,8,7,9,1,10,3,3,10,11,12,0,13,13,0,2 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *18 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2141920587648, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.418393850326538,-0.341942727565765,-0.0123836398124695,0.436771154403687,-0.5,0.102691292762756,-0.330338418483734,0.446155309677124,0.300303280353546,0.0532375276088715,0.5,0.185364276170731,-0.5,0.5,-0.5,-0.0189733505249023,1.27946376800537,-0.233094662427902,-0.263801336288452,-0.203426539897919,-0.499999821186066,0.199826151132584,-0.760887086391449,-0.5 + } + PolygonVertexIndex: *36 { + a: 1,3,-1,0,3,-3,2,3,-5,4,3,-6,5,7,-5,4,7,-7,6,7,-1,0,7,-2,1,7,-4,3,7,-6,6,0,-5,4,0,-3 + } + Edges: *18 { + a: 2,4,11,16,5,0,8,10,17,12,20,22,1,7,13,19,25,31 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *108 { + a: -0.157623440027237,-0.141253903508186,0.977344512939453,-0.157623425126076,-0.141253873705864,0.977344453334808,-0.157623440027237,-0.141253873705864,0.977344453334808,0.31405371427536,-0.38024565577507,0.869933068752289,0.31405371427536,-0.380245625972748,0.869933068752289,0.31405371427536,-0.380245625972748,0.869933009147644,-0.111860305070877,0.989612996578217,0.0902955755591393,-0.111860319972038,0.989613115787506,0.0902955904603004,-0.111860312521458,0.989613056182861,0.0902955904603004,-0.752137720584869,0.256265759468079,0.607138097286224,-0.752137720584869,0.256265759468079,0.607138097286224,-0.752137780189514,0.256265789270401,0.607138156890869,0.277074933052063,0.153784051537514,-0.948461949825287,0.277074933052063,0.153784036636353,-0.948461890220642,0.277074933052063,0.153784036636353,-0.948461949825287,-1.53259622948099e-06,-6.43530540855863e-07,-1,-1.53259645685466e-06,-6.43530597699282e-07,-1,-1.53259645685466e-06,-6.43530654542701e-07,-1,-0.707492887973785,-0.588405907154083,-0.39144891500473,-0.70749294757843,-0.588405966758728,-0.391448944807053,-0.70749294757843,-0.588405966758728,-0.391448944807053,-0.220828086137772,-0.860413253307343,0.459264636039734,-0.22082807123661,-0.860413253307343,0.459264606237411,-0.220828101038933,-0.860413253307343,0.459264606237411,0.810446739196777,0.349689304828644,-0.469993084669113,0.810446679592133,0.349689275026321,-0.469993025064468,0.810446739196777,0.349689304828644,-0.469993084669113,0.994361877441406,0.103788278996944,0.0217356197535992,0.994361937046051,0.103788278996944,0.0217356197535992,0.994361877441406,0.103788271546364,0.0217356216162443,-0.882903635501862,-0.296464085578918,-0.364129424095154,-0.882903635501862,-0.296464055776596,-0.364129394292831,-0.882903635501862,-0.296464055776596,-0.364129394292831,-0.97756016254425,0.0262976530939341,0.209008753299713,-0.97756016254425,0.0262976512312889,0.209008738398552,-0.977560102939606,0.0262976475059986,0.209008723497391 + } + NormalsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *108 { + a: 0.157566100358963,0.973438918590546,0.166101261973381,0.157566100358963,0.97343897819519,0.16610124707222,0.157566100358963,0.97343897819519,0.16610124707222,-0.00776232779026031,0.915233671665192,0.402848720550537,-0.00776234269142151,0.915233671665192,0.402848690748215,-0.00776232872158289,0.915233731269836,0.402848750352859,-0.293559640645981,0.0539021119475365,-0.954419910907745,-0.293559640645981,0.0539021156728268,-0.954419910907745,-0.293559640645981,0.0539021231234074,-0.95441997051239,-0.424347221851349,0.516540288925171,-0.74371737241745,-0.424347221851349,0.516540288925171,-0.74371737241745,-0.424347251653671,0.516540348529816,-0.743717432022095,0.817931115627289,-0.555730640888214,0.148836448788643,0.817931056022644,-0.555730640888214,0.148836463689804,0.817931056022644,-0.555730640888214,0.148836463689804,-0.768846929073334,-0.639432847499847,1.58982652465056e-06,-0.768846929073334,-0.639432847499847,1.58982675202424e-06,-0.768846929073334,-0.639432847499847,1.58982675202424e-06,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.0301197022199631,0.476681232452393,0.878560066223145,-0.0301196910440922,0.47668120265007,0.878560066223145,-0.0301196947693825,0.47668120265007,0.878560066223145,-0.47749075293541,0.859119534492493,-0.1841641664505,-0.477490723133087,0.859119474887848,-0.184164151549339,-0.47749075293541,0.859119534492493,-0.1841641664505,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.0680162906646729,0.467008024454117,0.881633341312408,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.367951095104218,0.918582439422607,0.144285723567009,-0.367951065301895,0.918582439422607,0.144285708665848,-0.367951065301895,0.918582439422607,0.144285708665848,0.0393971242010593,0.997494459152222,0.0587597265839577,0.039397120475769,0.997494459152222,0.0587597265839577,0.039397120475769,0.997494518756866,0.0587597265839577 + } + BinormalsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *108 { + a: 0.974847674369812,-0.180177807807922,0.131179973483086,0.974847674369812,-0.180177807807922,0.131179973483086,0.974847674369812,-0.180177807807922,0.131179988384247,0.949373483657837,0.1332688331604,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480959177017,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763758182526,0.504200637340546,0.817015290260315,0.279763758182526,0.504200637340546,0.817015290260315,0.279763728380203,0.639432847499847,-0.768846929073334,-4.85215878143208e-07,0.639432847499847,-0.768846929073334,-4.85215991830046e-07,0.639432847499847,-0.768846929073334,-4.85215934986627e-07,0.639432847499847,-0.768846929073334,-2.47408053155596e-07,0.639432847499847,-0.768846929073334,-2.44388530745709e-07,0.639432847499847,-0.768846929073334,-2.44388530745709e-07,0.974847555160522,-0.180177822709084,0.131179988384247,0.974847674369812,-0.180177837610245,0.131179988384247,0.974847555160522,-0.180177852511406,0.131179988384247,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.33937993645668,-0.373672544956207,-0.863243937492371,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.0813524946570396,0.878140926361084,-0.471434265375137,-0.0813524946570396,0.878140926361084,-0.471434265375137,-0.081352487206459,0.878140926361084,-0.471434265375137,-0.291707336902618,-0.261372208595276,0.920104026794434,-0.291707336902618,-0.261372178792953,0.920104026794434,-0.291707336902618,-0.261372178792953,0.920104026794434,0.206939816474915,-0.0656755045056343,0.976146817207336,0.206939801573753,-0.0656755045056343,0.976146817207336,0.206939801573753,-0.0656755045056343,0.976146817207336 + } + TangentsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *36 { + a: 1,3,0,0,3,2,2,3,4,4,3,5,5,7,4,4,7,6,6,7,8,8,7,9,1,10,3,3,10,11,12,0,13,13,0,2 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *18 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2141638288816, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "PostRotation", "Vector3D", "Vector", "",26.0640382322082,-36.7417712642165,-61.4466190640661 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,1 + P: "Lcl Rotation", "Lcl Rotation", "", "A",30,50,70 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.666581577274735,0.666581577274735,0.666581577274735 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2141638291136, "Model::pCube2", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",5 + P: "PostRotation", "Vector3D", "Vector", "",26.0640382322082,-36.7417712642165,-61.4466190640661 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,-1 + P: "Lcl Rotation", "Lcl Rotation", "", "A",30,50,70 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.666581577274735,0.666581577274735,0.666581577274735 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2142068134096, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2142914173280, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2141923623552, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2141638288816,0 + + ;Model::pCube2, Model::RootNode + C: "OO",2141638291136,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2141923623552,2142914173280 + + ;Geometry::, Model::pCube1 + C: "OO",2141920570240,2141638288816 + + ;Material::lambert1, Model::pCube1 + C: "OO",2142068134096,2141638288816 + + ;Geometry::, Model::pCube2 + C: "OO",2141920587648,2141638291136 + + ;Material::lambert1, Model::pCube2 + C: "OO",2142068134096,2141638291136 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_post_rotate_order_7500_binary.fbx b/modules/ufbx/data/maya_post_rotate_order_7500_binary.fbx new file mode 100644 index 0000000..6d77707 Binary files /dev/null and b/modules/ufbx/data/maya_post_rotate_order_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_resampled_6100_ascii.fbx b/modules/ufbx/data/maya_resampled_6100_ascii.fbx new file mode 100644 index 0000000..402bb7b --- /dev/null +++ b/modules/ufbx/data/maya_resampled_6100_ascii.fbx @@ -0,0 +1,440 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 22 + Minute: 55 + Second: 56 + Millisecond: 351 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",-1.69996887520471,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_resampled_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_resampled_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "31/03/2020 19:55:56.349" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_resampled_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "31/03/2020 19:55:56.349" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::pCube1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -1.69996893405914 + KeyVer: 4005 + KeyCount: 24 + Key: 1924423250,0,U,s,0,-22.1537208557129,n,3848846500,-0.498079389333725,U,s,-22.1537208557129 + ,-33.7828903198242,n,5773269750,-1.69996893405914,U,s,-33.7828903198242,-34.8875160217285 + ,n,7697693000,-3.1671462059021,U,s,-34.8875160217285,-25.4675941467285,n,9622116250 + ,-4.46108770370483,U,s,-25.4675941467285,-5.52312564849854,n,11546539500,-5.14327096939087 + ,U,s,-5.52312564849854,0,n,13470962750,-5.21998119354248,U,s,0,28.1261558532715,n + ,15395386000,-4.59495544433594,U,s,28.1261558532715,45.0018463134766,n,17319809250 + ,-3.03239130973816,U,s,45.0018463134766,50.6270751953125,n,19244232500,-1.00105786323547 + ,U,s,50.6270751953125,45.0018424987793,n,21168655750,1.03027534484863,U,s,45.0018424987793 + ,28.1261558532715,n,23093079000,2.59283947944641,U,s,28.1261558532715,0,n,25017502250 + ,3.21786522865295,U,s,0,0,n,26941925500,3.21786522865295,U,s,0,0,n,28866348750,3.21786522865295 + ,U,s,0,0,n,30790772000,3.21786522865295,U,s,0,0,n,32715195250,3.21786522865295,U,s + ,0,0,n,34639618500,3.21786522865295,U,s,0,0,n,36564041750,3.21786522865295,U,s,0,0 + ,n,38488465000,3.21786522865295,U,s,0,-21.7205905914307,n,40412888250,2.71507382392883 + ,U,s,-21.7205905914307,-28.960786819458,n,42337311500,1.60893261432648,U,s,-28.960786819458 + ,-21.7205905914307,n,44261734750,0.502791404724121,U,s,-21.7205905914307,0,n,46186158000 + ,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_resampled_6100_binary.fbx b/modules/ufbx/data/maya_resampled_6100_binary.fbx new file mode 100644 index 0000000..b3792db Binary files /dev/null and b/modules/ufbx/data/maya_resampled_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_resampled_7500_ascii.fbx b/modules/ufbx/data/maya_resampled_7500_ascii.fbx new file mode 100644 index 0000000..d455148 --- /dev/null +++ b/modules/ufbx/data/maya_resampled_7500_ascii.fbx @@ -0,0 +1,498 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 22 + Minute: 40 + Second: 26 + Millisecond: 674 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_resampled_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_resampled_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 19:40:26.668" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_resampled_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 19:40:26.668" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1402442652576, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 10 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurve" { + Count: 1 + } + ObjectType: "AnimationCurveNode" { + Count: 3 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1404266332272, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1402444304784, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1402344772368, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1402443653280, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 1404437342784, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *30 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000,40412888250,42337311500,44261734750,46186158000,48110581250,50035004500,51959427750,53883851000,55808274250,57732697500 + } + KeyValueFloat: *30 { + a: 0,-0.4980793,-1.699969,-3.167145,-4.461087,-5.143271,-5.219981,-4.594955,-3.032391,-1.001058,1.030275,2.592839,3.217865,3.217865,3.217865,3.217865,3.217865,3.217865,3.217865,3.217865,2.715074,1.608933,0.5027914,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 24,6 + } + } + AnimationCurveNode: 1402444569088, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1402444569296, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 1402444569504, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 1404157987360, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1402444304784,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1404157987360,1402443653280 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1402444569088,1404157987360 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1402444569296,1404157987360 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1402444569504,1404157987360 + + ;Geometry::, Model::pCube1 + C: "OO",1404266332272,1402444304784 + + ;Material::lambert1, Model::pCube1 + C: "OO",1402344772368,1402444304784 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",1402444569088,1402444304784, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",1402444569504,1402444304784, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",1402444569296,1402444304784, "Lcl Scaling" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1404437342784,1402444569088, "d|X" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_resampled_7500_binary.fbx b/modules/ufbx/data/maya_resampled_7500_binary.fbx new file mode 100644 index 0000000..15960b4 Binary files /dev/null and b/modules/ufbx/data/maya_resampled_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_rotation_order.obj b/modules/ufbx/data/maya_rotation_order.obj new file mode 100644 index 0000000..d4b9368 --- /dev/null +++ b/modules/ufbx/data/maya_rotation_order.obj @@ -0,0 +1,194 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -4.566987 -1.332532 -0.191987 +v -4.001747 -0.484671 0.297525 +v -4.133975 -0.362731 -0.371731 +v -6.205756 0.602878 0.348072 +vt 0.375000 0.033494 +vt 0.375000 0.466506 +vt 0.750000 0.250000 +vt 0.250000 0.500000 +vt 0.416667 0.500000 +vt 0.583333 0.500000 +vt 0.750000 0.500000 +vt 0.500000 1.000000 +vn 0.866025 -0.433013 -0.250000 +vn 0.866025 -0.433013 -0.250000 +vn 0.866025 -0.433013 -0.250000 +vn -0.177175 -0.400837 0.898854 +vn -0.177175 -0.400837 0.898854 +vn -0.177175 -0.400837 0.898854 +vn 0.442633 0.893531 0.075350 +vn 0.442633 0.893531 0.075350 +vn 0.442633 0.893531 0.075350 +vn -0.337866 -0.023531 -0.940900 +vn -0.337866 -0.023531 -0.940900 +vn -0.337866 -0.023531 -0.940900 +s off +g XYZ +usemtl initialShadingGroup +f 1/1/1 3/3/2 2/2/3 +f 1/4/4 2/5/5 4/8/6 +f 2/5/7 3/6/8 4/8/9 +f 3/6/10 1/7/11 4/8/12 +g default +v -2.000000 -0.866025 -0.500000 +v -2.000000 -0.300785 0.479026 +v -2.000000 0.121731 -0.070282 +v -4.392287 0.000000 0.000000 +vt 0.375000 0.033494 +vt 0.375000 0.466506 +vt 0.750000 0.250000 +vt 0.250000 0.500000 +vt 0.416667 0.500000 +vt 0.583333 0.500000 +vt 0.750000 0.500000 +vt 0.500000 1.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -0.204584 -0.847708 0.489424 +vn -0.204584 -0.847708 0.489424 +vn -0.204584 -0.847708 0.489424 +vn -0.022416 0.792444 0.609532 +vn -0.022416 0.792444 0.609532 +vn -0.022416 0.792444 0.609532 +vn -0.047186 0.398484 -0.915961 +vn -0.047186 0.398484 -0.915961 +vn -0.047186 0.398484 -0.915961 +s off +g YZX +usemtl initialShadingGroup +f 5/9/13 7/11/14 6/10/15 +f 5/12/16 6/13/17 8/16/18 +f 6/13/19 7/14/20 8/16/21 +f 7/14/22 5/15/23 8/16/24 +g default +v -1.366025 0.000000 -1.366025 +v -0.518164 -0.565241 -0.876513 +v -0.439134 0.121731 -0.830885 +v -1.696144 0.000000 1.205756 +vt 0.375000 0.033494 +vt 0.375000 0.466506 +vt 0.750000 0.250000 +vt 0.250000 0.500000 +vt 0.416667 0.500000 +vt 0.583333 0.500000 +vt 0.750000 0.500000 +vt 0.500000 1.000000 +vn 0.500000 0.000000 -0.866025 +vn 0.500000 0.000000 -0.866025 +vn 0.500000 0.000000 -0.866025 +vn -0.526146 -0.847708 -0.067537 +vn -0.526146 -0.847708 -0.067537 +vn -0.526146 -0.847708 -0.067537 +vn 0.847060 -0.131648 0.514935 +vn 0.847060 -0.131648 0.514935 +vn 0.847060 -0.131648 0.514935 +vn -0.121353 0.992487 -0.015577 +vn -0.121353 0.992487 -0.015577 +vn -0.121353 0.992487 -0.015577 +s off +g ZXY +usemtl initialShadingGroup +f 9/17/25 11/19/26 10/18/27 +f 9/20/28 10/21/29 12/24/30 +f 10/21/31 11/22/32 12/24/33 +f 11/22/34 9/23/35 12/24/36 +g default +v 0.133974 -0.500000 -1.000000 +v 1.264456 -0.500000 -1.000000 +v 1.000000 0.140563 -1.000000 +v 1.000000 0.000000 1.392287 +vt 0.375000 0.033494 +vt 0.375000 0.466506 +vt 0.750000 0.250000 +vt 0.250000 0.500000 +vt 0.416667 0.500000 +vt 0.583333 0.500000 +vt 0.750000 0.500000 +vt 0.500000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.978849 0.204584 +vn -0.000000 -0.978849 0.204584 +vn -0.000000 -0.978849 0.204584 +vn 0.924093 0.381511 0.022416 +vn 0.924093 0.381511 0.022416 +vn 0.924093 0.381511 0.022416 +vn -0.594003 0.803078 0.047186 +vn -0.594003 0.803078 0.047186 +vn -0.594003 0.803078 0.047186 +s off +g XZY +usemtl initialShadingGroup +f 13/25/37 15/27/38 14/26/39 +f 13/28/40 14/29/41 16/32/42 +f 14/29/43 15/30/44 16/32/45 +f 15/30/46 13/31/47 16/32/48 +g default +v 3.866025 -1.000000 -0.500000 +v 4.148646 -0.020975 -0.010487 +v 3.805160 0.070282 -0.605422 +v 1.794244 0.000000 0.696144 +vt 0.375000 0.033494 +vt 0.375000 0.466506 +vt 0.750000 0.250000 +vt 0.250000 0.500000 +vt 0.416667 0.500000 +vt 0.583333 0.500000 +vt 0.750000 0.500000 +vt 0.500000 1.000000 +vn 0.866025 -0.000000 -0.500000 +vn 0.866025 -0.000000 -0.500000 +vn 0.866025 -0.000000 -0.500000 +vn 0.246679 -0.489425 0.836429 +vn 0.246679 -0.489425 0.836429 +vn 0.246679 -0.489425 0.836429 +vn 0.046411 0.991043 0.125219 +vn 0.046411 0.991043 0.125219 +vn 0.046411 0.991043 0.125219 +vn -0.537108 -0.112883 -0.835926 +vn -0.537108 -0.112883 -0.835926 +vn -0.537108 -0.112883 -0.835926 +s off +g YXZ +usemtl initialShadingGroup +f 17/33/49 19/35/50 18/34/51 +f 17/36/52 18/37/53 20/40/54 +f 18/37/55 19/38/56 20/40/57 +f 19/38/58 17/39/59 20/40/60 +g default +v 4.750000 0.216506 -1.375000 +v 5.729025 -0.066114 -0.885487 +v 5.500000 0.554744 -0.679718 +v 4.303856 -0.602878 1.044215 +vt 0.375000 0.033494 +vt 0.375000 0.466506 +vt 0.750000 0.250000 +vt 0.250000 0.500000 +vt 0.416667 0.500000 +vt 0.583333 0.500000 +vt 0.750000 0.500000 +vt 0.500000 1.000000 +vn 0.500000 0.433013 -0.750000 +vn 0.500000 0.433013 -0.750000 +vn 0.500000 0.433013 -0.750000 +vn -0.102292 -0.936296 -0.335986 +vn -0.102292 -0.936296 -0.335986 +vn -0.102292 -0.936296 -0.335986 +vn 0.789079 0.089668 0.607711 +vn 0.789080 0.089668 0.607711 +vn 0.789080 0.089668 0.607711 +vn -0.538015 0.823554 0.179718 +vn -0.538015 0.823554 0.179718 +vn -0.538015 0.823554 0.179718 +s off +g ZYX +usemtl initialShadingGroup +f 21/41/61 23/43/62 22/42/63 +f 21/44/64 22/45/65 24/48/66 +f 22/45/67 23/46/68 24/48/69 +f 23/46/70 21/47/71 24/48/72 diff --git a/modules/ufbx/data/maya_rotation_order_6100_ascii.fbx b/modules/ufbx/data/maya_rotation_order_6100_ascii.fbx new file mode 100644 index 0000000..6969056 --- /dev/null +++ b/modules/ufbx/data/maya_rotation_order_6100_ascii.fbx @@ -0,0 +1,1280 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 27 + Hour: 22 + Minute: 17 + Second: 20 + Millisecond: 200 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 9 + ObjectType: "Model" { + Count: 6 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::XYZ", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-5,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",30,60,90 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335 + ,0 + PolygonVertexIndex: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + Edges: 2,1,0,5,4,7 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681 + ,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662 + ,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211 + ,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238 + ,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877 + ,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426 + ,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756 + ,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914 + ,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07 + ,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10 + ,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09 + ,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11 + ,-0.803973257541656 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5 + ,0.750000059604645,0.5,0.5,1 + UVIndex: 0,2,1,3,4,7,4,5,7,5,6,7 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::XYZ_ncl1_1" + } + Model: "Model::YZX", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",2 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",30,60,90 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335 + ,0 + PolygonVertexIndex: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + Edges: 2,1,0,5,4,7 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681 + ,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662 + ,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211 + ,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238 + ,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877 + ,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426 + ,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756 + ,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914 + ,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07 + ,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10 + ,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09 + ,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11 + ,-0.803973257541656 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5 + ,0.750000059604645,0.5,0.5,1 + UVIndex: 0,2,1,3,4,7,4,5,7,5,6,7 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::YZX_ncl1_1" + } + Model: "Model::ZXY", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",4 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",30,60,90 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335 + ,0 + PolygonVertexIndex: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + Edges: 2,1,0,5,4,7 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681 + ,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662 + ,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211 + ,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238 + ,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877 + ,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426 + ,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756 + ,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914 + ,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07 + ,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10 + ,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09 + ,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11 + ,-0.803973257541656 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5 + ,0.750000059604645,0.5,0.5,1 + UVIndex: 0,2,1,3,4,7,4,5,7,5,6,7 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::ZXY_ncl1_1" + } + Model: "Model::XZY", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",1 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",30,60,90 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335 + ,0 + PolygonVertexIndex: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + Edges: 2,1,0,5,4,7 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681 + ,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662 + ,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211 + ,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238 + ,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877 + ,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426 + ,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756 + ,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914 + ,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07 + ,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10 + ,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09 + ,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11 + ,-0.803973257541656 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5 + ,0.750000059604645,0.5,0.5,1 + UVIndex: 0,2,1,3,4,7,4,5,7,5,6,7 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::XZY_ncl1_1" + } + Model: "Model::YXZ", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",3 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",3,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",30,60,90 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335 + ,0 + PolygonVertexIndex: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + Edges: 2,1,0,5,4,7 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681 + ,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662 + ,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211 + ,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238 + ,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877 + ,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426 + ,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756 + ,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914 + ,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07 + ,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10 + ,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09 + ,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11 + ,-0.803973257541656 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5 + ,0.750000059604645,0.5,0.5,1 + UVIndex: 0,2,1,3,4,7,4,5,7,5,6,7 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::YXZ_ncl1_1" + } + Model: "Model::ZYX", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",5 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",5,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",30,60,90 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335 + ,0 + PolygonVertexIndex: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + Edges: 2,1,0,5,4,7 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681 + ,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662 + ,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211 + ,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238 + ,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08 + ,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877 + ,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426 + ,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756 + ,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914 + ,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07 + ,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10 + ,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09 + ,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11 + ,-0.803973257541656 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5 + ,0.750000059604645,0.5,0.5,1 + UVIndex: 0,2,1,3,4,7,4,5,7,5,6,7 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::ZYX_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_rotation_order_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_rotation_order_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "27/03/2020 20:17:20.197" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_rotation_order_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "27/03/2020 20:17:20.197" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\maya_rotation_order.mb" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::XYZ", "Model::Scene" + Connect: "OO", "Model::YZX", "Model::Scene" + Connect: "OO", "Model::ZXY", "Model::Scene" + Connect: "OO", "Model::XZY", "Model::Scene" + Connect: "OO", "Model::YXZ", "Model::Scene" + Connect: "OO", "Model::ZYX", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::XYZ" + Connect: "OO", "Material::lambert1", "Model::YZX" + Connect: "OO", "Material::lambert1", "Model::ZXY" + Connect: "OO", "Material::lambert1", "Model::XZY" + Connect: "OO", "Material::lambert1", "Model::YXZ" + Connect: "OO", "Material::lambert1", "Model::ZYX" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_rotation_order_6100_binary.fbx b/modules/ufbx/data/maya_rotation_order_6100_binary.fbx new file mode 100644 index 0000000..cfd5973 Binary files /dev/null and b/modules/ufbx/data/maya_rotation_order_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_rotation_order_7500_ascii.fbx b/modules/ufbx/data/maya_rotation_order_7500_ascii.fbx new file mode 100644 index 0000000..4f62d56 --- /dev/null +++ b/modules/ufbx/data/maya_rotation_order_7500_ascii.fbx @@ -0,0 +1,1077 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 27 + Hour: 22 + Minute: 15 + Second: 2 + Millisecond: 890 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_rotation_order_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_rotation_order_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "27/03/2020 20:15:02.887" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_rotation_order_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "27/03/2020 20:15:02.887" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\maya_rotation_order.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2287369646304, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 16 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 6 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 6 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2287370611840, "Geometry::", "Mesh" { + Vertices: *12 { + a: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335,0 + } + PolygonVertexIndex: *12 { + a: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + } + Edges: *6 { + a: 2,1,0,5,4,7 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *36 { + a: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + NormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *36 { + a: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + BinormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *36 { + a: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11,-0.803973257541656 + } + TangentsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *16 { + a: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5,0.750000059604645,0.5,0.5,1 + } + UVIndex: *12 { + a: 0,2,1,3,4,7,4,5,7,5,6,7 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *6 { + a: 0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2287370615936, "Geometry::", "Mesh" { + Vertices: *12 { + a: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335,0 + } + PolygonVertexIndex: *12 { + a: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + } + Edges: *6 { + a: 2,1,0,5,4,7 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *36 { + a: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + NormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *36 { + a: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + BinormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *36 { + a: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11,-0.803973257541656 + } + TangentsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *16 { + a: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5,0.750000059604645,0.5,0.5,1 + } + UVIndex: *12 { + a: 0,2,1,3,4,7,4,5,7,5,6,7 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *6 { + a: 0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2287370623616, "Geometry::", "Mesh" { + Vertices: *12 { + a: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335,0 + } + PolygonVertexIndex: *12 { + a: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + } + Edges: *6 { + a: 2,1,0,5,4,7 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *36 { + a: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + NormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *36 { + a: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + BinormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *36 { + a: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11,-0.803973257541656 + } + TangentsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *16 { + a: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5,0.750000059604645,0.5,0.5,1 + } + UVIndex: *12 { + a: 0,2,1,3,4,7,4,5,7,5,6,7 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *6 { + a: 0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2287370619520, "Geometry::", "Mesh" { + Vertices: *12 { + a: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335,0 + } + PolygonVertexIndex: *12 { + a: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + } + Edges: *6 { + a: 2,1,0,5,4,7 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *36 { + a: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + NormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *36 { + a: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + BinormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *36 { + a: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11,-0.803973257541656 + } + TangentsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *16 { + a: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5,0.750000059604645,0.5,0.5,1 + } + UVIndex: *12 { + a: 0,2,1,3,4,7,4,5,7,5,6,7 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *6 { + a: 0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2287370615424, "Geometry::", "Mesh" { + Vertices: *12 { + a: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335,0 + } + PolygonVertexIndex: *12 { + a: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + } + Edges: *6 { + a: 2,1,0,5,4,7 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *36 { + a: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + NormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *36 { + a: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + BinormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *36 { + a: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11,-0.803973257541656 + } + TangentsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *16 { + a: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5,0.750000059604645,0.5,0.5,1 + } + UVIndex: *12 { + a: 0,2,1,3,4,7,4,5,7,5,6,7 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *6 { + a: 0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2287370610816, "Geometry::", "Mesh" { + Vertices: *12 { + a: -0.499999940395355,-1,-0.866025507450104,-0.500000059604645,-1,0.264455854892731,0.140563011169434,-1,0,0,1.3922872543335,0 + } + PolygonVertexIndex: *12 { + a: 0,2,-2,0,1,-4,1,2,-4,2,0,-4 + } + Edges: *6 { + a: 2,1,0,5,4,7 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *36 { + a: 0,-1,0,0,-1,0,0,-1,0,-0.978848934173584,0.204584315419197,-1.07867101917236e-07,-0.978848993778229,0.204584360122681,-1.07867109022663e-07,-0.978848934173584,0.204584315419197,-1.07867094811809e-07,0.381510764360428,0.0224163308739662,0.924092590808868,0.381510734558105,0.0224163308739662,0.924092531204224,0.381510734558105,0.0224163290113211,0.924092531204224,0.803077757358551,0.0471862219274044,-0.594003081321716,0.803077638149261,0.0471862144768238,-0.594003021717072,0.803077697753906,0.0471862219274044,-0.594003081321716 + } + NormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *36 { + a: -0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,-0.425037264823914,0,0.905175864696503,0.204584315419197,0.978848934173584,2.15734221598041e-08,0.204584360122681,0.978848993778229,2.15734257125177e-08,0.204584315419197,0.978848934173584,2.15734221598041e-08,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422113090754,0.999748706817627,-0.0207199715077877,-0.00855422019958496,0.999748706817627,-0.0207199696451426,-0.0379364565014839,0.998886108398438,0.0280600152909756,-0.0379364565014839,0.998886168003082,0.0280600152909756,-0.0379364602267742,0.998886108398438,0.0280600171536207 + } + BinormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *36 { + a: 0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,0.905175864696503,0,0.425037264823914,-1.09999184871867e-07,9.50796552601219e-10,1,-1.09999184871867e-07,9.50796996690428e-10,1,-1.0999917776644e-07,9.50795109311287e-10,1,0.924324810504913,-3.44479972325118e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,0.924324810504913,-2.368479579129e-10,-0.381606638431549,-0.594665467739105,1.69355718337982e-09,-0.803973257541656,-0.594665467739105,6.09731598544272e-10,-0.803973257541656,-0.594665467739105,2.10498632413625e-11,-0.803973257541656 + } + TangentsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *16 { + a: 0.375,0.0334936231374741,0.375,0.466506361961365,0.75,0.25,0.25,0.5,0.416666686534882,0.5,0.583333373069763,0.5,0.750000059604645,0.5,0.5,1 + } + UVIndex: *12 { + a: 0,2,1,3,4,7,4,5,7,5,6,7 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *6 { + a: 0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2288392114960, "Model::XYZ", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-5,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",30,60,90 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2288392124240, "Model::YZX", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",2 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-3,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",30,60,90 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2288361798896, "Model::ZXY", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",4 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-1,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",30,60,90 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2288394496320, "Model::XZY", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",1 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",30,60,90 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2288394507920, "Model::YXZ", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",3 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",3,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",30,60,90 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2288394500960, "Model::ZYX", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",5 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",5,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",30,60,90 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2287359424256, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2288391939168, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2288324120080, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::XYZ, Model::RootNode + C: "OO",2288392114960,0 + + ;Model::YZX, Model::RootNode + C: "OO",2288392124240,0 + + ;Model::ZXY, Model::RootNode + C: "OO",2288361798896,0 + + ;Model::XZY, Model::RootNode + C: "OO",2288394496320,0 + + ;Model::YXZ, Model::RootNode + C: "OO",2288394507920,0 + + ;Model::ZYX, Model::RootNode + C: "OO",2288394500960,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2288324120080,2288391939168 + + ;Geometry::, Model::XYZ + C: "OO",2287370611840,2288392114960 + + ;Material::lambert1, Model::XYZ + C: "OO",2287359424256,2288392114960 + + ;Geometry::, Model::YZX + C: "OO",2287370615936,2288392124240 + + ;Material::lambert1, Model::YZX + C: "OO",2287359424256,2288392124240 + + ;Geometry::, Model::ZXY + C: "OO",2287370623616,2288361798896 + + ;Material::lambert1, Model::ZXY + C: "OO",2287359424256,2288361798896 + + ;Geometry::, Model::XZY + C: "OO",2287370619520,2288394496320 + + ;Material::lambert1, Model::XZY + C: "OO",2287359424256,2288394496320 + + ;Geometry::, Model::YXZ + C: "OO",2287370615424,2288394507920 + + ;Material::lambert1, Model::YXZ + C: "OO",2287359424256,2288394507920 + + ;Geometry::, Model::ZYX + C: "OO",2287370610816,2288394500960 + + ;Material::lambert1, Model::ZYX + C: "OO",2287359424256,2288394500960 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_rotation_order_7500_binary.fbx b/modules/ufbx/data/maya_rotation_order_7500_binary.fbx new file mode 100644 index 0000000..1ee831b Binary files /dev/null and b/modules/ufbx/data/maya_rotation_order_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_scale_no_inherit_6100_ascii.fbx b/modules/ufbx/data/maya_scale_no_inherit_6100_ascii.fbx new file mode 100644 index 0000000..f3e8a1b --- /dev/null +++ b/modules/ufbx/data/maya_scale_no_inherit_6100_ascii.fbx @@ -0,0 +1,575 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Front" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 3 + Day: 31 + Hour: 22 + Minute: 28 + Second: 24 + Millisecond: 921 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "Model" { + Count: 4 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::joint1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",0.02,0.03,0.04 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",18.3908045977012 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint1_ncl1_1" + } + Model: "Model::joint2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-45 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",19.8191272265739 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint2_ncl1_1" + } + Model: "Model::joint3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,45 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",2.82842712474619,4.44089209850063e-16,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",18.3908045977012 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint3_ncl1_1" + } + Model: "Model::joint4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2,4.93038065763132e-31,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",0.015,0.025,0.035 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",18.3908045977012 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint4_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_scale_no_inherit_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_scale_no_inherit_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "31/03/2022 19:28:24.920" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_scale_no_inherit_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "31/03/2022 19:28:24.920" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",100 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Front" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::joint1", "Model::Scene" + Connect: "OO", "Model::joint2", "Model::joint1" + Connect: "OO", "Model::joint3", "Model::joint2" + Connect: "OO", "Model::joint4", "Model::joint3" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::joint3" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 2.82842707633972 + Color: 1,1,1 + } + Channel: "Y" { + Default: 4.44089209850063e-16 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 0.00999999977648258 + KeyVer: 4005 + KeyCount: 2 + Key: 1924423250,0.00999999977648258,U,s,0,0,n,46186158000,0.00300000002607703,U,s,0,0,n + + Color: 1,1,1 + } + Channel: "Y" { + Default: 0.00999999977648258 + KeyVer: 4005 + KeyCount: 2 + Key: 1924423250,0.00999999977648258,U,s,0,0,n,46186158000,0.00600000005215406,U,s,0,0,n + + Color: 1,1,1 + } + Channel: "Z" { + Default: 0.00999999977648258 + KeyVer: 4005 + KeyCount: 2 + Key: 1924423250,0.00999999977648258,U,s,0,0,n,46186158000,0.00899999961256981,U,s,0,0,n + + Color: 1,1,1 + } + LayerType: 3 + } + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Front" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_scale_no_inherit_7700_ascii.fbx b/modules/ufbx/data/maya_scale_no_inherit_7700_ascii.fbx new file mode 100644 index 0000000..08f890c --- /dev/null +++ b/modules/ufbx/data/maya_scale_no_inherit_7700_ascii.fbx @@ -0,0 +1,482 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 3 + Day: 31 + Hour: 22 + Minute: 43 + Second: 16 + Millisecond: 147 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_scale_no_inherit_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_scale_no_inherit_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2022 19:43:16.146" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_scale_no_inherit_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2022 19:43:16.146" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",100 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Front" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2150088127744, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 17 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "Model" { + Count: 4 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 3 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 3 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 2150761718912, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",18.3908045977012 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2150761717568, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",19.8191272265739 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2150761716416, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",18.3908045977012 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2150761717376, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",18.3908045977012 + } + TypeFlags: "Skeleton" + } + Model: 2150999217856, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.02,0.03,0.04 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2150999222496, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-45 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2150999224816, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,45 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",2.82842712474619,4.44089209850063e-16,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2150999227136, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,4.93038065763132e-31,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.015,0.025,0.035 + } + Shading: Y + Culling: "CullingOff" + } + AnimationStack: 2150998465936, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2150986935008, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 0.01,0.003 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2150986932768, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 0.01,0.006 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2150986931008, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,46186158000 + } + KeyValueFloat: *2 { + a: 0.01,0.009 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2150998466144, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",2.82842712474619 + P: "d|Y", "Number", "", "A",4.44089209850063e-16 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2150998465104, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.01 + P: "d|Y", "Number", "", "A",0.01 + P: "d|Z", "Number", "", "A",0.01 + } + } + AnimationCurveNode: 2150998464064, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2150951126128, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::joint1, Model::RootNode + C: "OO",2150999217856,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2150951126128,2150998465936 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2150998466144,2150951126128 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2150998465104,2150951126128 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2150998464064,2150951126128 + + ;NodeAttribute::, Model::joint1 + C: "OO",2150761718912,2150999217856 + + ;Model::joint2, Model::joint1 + C: "OO",2150999222496,2150999217856 + + ;NodeAttribute::, Model::joint2 + C: "OO",2150761717568,2150999222496 + + ;Model::joint3, Model::joint2 + C: "OO",2150999224816,2150999222496 + + ;NodeAttribute::, Model::joint3 + C: "OO",2150761716416,2150999224816 + + ;Model::joint4, Model::joint3 + C: "OO",2150999227136,2150999224816 + + ;AnimCurveNode::T, Model::joint3 + C: "OP",2150998466144,2150999224816, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint3 + C: "OP",2150998464064,2150999224816, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint3 + C: "OP",2150998465104,2150999224816, "Lcl Scaling" + + ;NodeAttribute::, Model::joint4 + C: "OO",2150761717376,2150999227136 + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2150986935008,2150998465104, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2150986932768,2150998465104, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2150986931008,2150998465104, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_shaderfx_pbs_material_6100_ascii.fbx b/modules/ufbx/data/maya_shaderfx_pbs_material_6100_ascii.fbx new file mode 100644 index 0000000..1ce3b8c --- /dev/null +++ b/modules/ufbx/data/maya_shaderfx_pbs_material_6100_ascii.fbx @@ -0,0 +1,938 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 13 + Hour: 15 + Minute: 15 + Second: 53 + Millisecond: 960 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 24 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Texture" { + Count: 9 + } + ObjectType: "Video" { + Count: 9 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Implementation" { + Count: 1 + } + ObjectType: "BindingTable" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_shaderfx_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_shaderfx_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "13/06/2022 12:15:53.959" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_shaderfx_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "13/06/2022 12:15:53.959" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::StingrayPBS1", "" { + Version: 102 + ShadingModel: "unknown" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Unknown" + Property: "MultiLayer", "bool", "",0 + Property: "Maya|TypeId", "int", "",1166017 + Property: "Maya|TEX_global_diffuse_cube", "Vector3D", "",0,0,0 + Property: "Maya|TEX_global_specular_cube", "Vector3D", "",0,0,0 + Property: "Maya|TEX_brdf_lut", "Vector3D", "",0,0,0 + Property: "Maya|use_normal_map", "float", "",0 + Property: "Maya|TEX_normal_map", "Vector3D", "",0,0,0 + Property: "Maya|use_color_map", "float", "",1 + Property: "Maya|TEX_color_map", "Vector3D", "",0,0,0 + Property: "Maya|base_color", "Vector3D", "",0.00999999977648258,0.0199999995529652,0.0299999993294477 + Property: "Maya|use_metallic_map", "float", "",1 + Property: "Maya|TEX_metallic_map", "Vector3D", "",0,0,0 + Property: "Maya|metallic", "float", "",0.04 + Property: "Maya|use_roughness_map", "float", "",0 + Property: "Maya|TEX_roughness_map", "Vector3D", "",0,0,0 + Property: "Maya|roughness", "float", "",0.05 + Property: "Maya|use_emissive_map", "float", "",1 + Property: "Maya|TEX_emissive_map", "Vector3D", "",0,0,0 + Property: "Maya|emissive", "Vector3D", "",0.0599999986588955,0.0700000002980232,0.0799999982118607 + Property: "Maya|emissive_intensity", "float", "",0.09 + Property: "Maya|use_ao_map", "float", "",0 + Property: "Maya|TEX_ao_map", "Vector3D", "",0,0,0 + } + } + Video: "Video::file8", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + Property: "RelPath", "KString", "", "textures\checkerboard_emissive.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + } + Video: "Video::file6", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + Property: "RelPath", "KString", "", "textures\checkerboard_metallic.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + RelativeFilename: "textures\checkerboard_metallic.png" + } + Video: "Video::file9", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + Property: "RelPath", "KString", "", "textures\checkerboard_weight.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + } + Video: "Video::file2", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + Property: "RelPath", "KString", "", "textures\tiny_clouds.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + } + Video: "Video::file1", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + Property: "RelPath", "KString", "", "textures\tiny_clouds.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + } + Video: "Video::file7", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + Property: "RelPath", "KString", "", "textures\checkerboard_roughness.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + } + Video: "Video::file3", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + Property: "RelPath", "KString", "", "textures\tiny_clouds.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + } + Video: "Video::file4", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + Property: "RelPath", "KString", "", "textures\checkerboard_diffuse.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + } + Video: "Video::file5", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_normal.png" + Property: "RelPath", "KString", "", "textures\checkerboard_normal.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_normal.png" + RelativeFilename: "textures\checkerboard_normal.png" + } + Texture: "Texture::file8", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file8" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file8" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file6", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file6" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file6" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + RelativeFilename: "textures\checkerboard_metallic.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file9", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file9" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file9" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file7", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file7" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file7" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file5" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file5" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_normal.png" + RelativeFilename: "textures\checkerboard_normal.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Implementation: "Implementation::StingrayPBS1_Implementation", "" { + Version: 100 + Properties60: { + Property: "ShaderLanguage", "KString", "", "SFX" + Property: "ShaderLanguageVersion", "KString", "", "28" + Property: "RenderAPI", "KString", "", "SFX_PBS_SHADER" + Property: "RenderAPIVersion", "KString", "", "" + Property: "RootBindingName", "KString", "", "root" + } + } + BindingTable: "BindingTable::root 8", "" { + Version: 100 + Properties60: { + Property: "TargetName", "KString", "", "root" + Property: "TargetType", "KString", "", "shader" + Property: "CodeAbsoluteURL", "KString", "", "" + Property: "CodeRelativeURL", "KString", "", "" + Property: "CodeTAG", "KString", "", "shader" + Property: "DescAbsoluteURL", "KString", "", "" + Property: "DescRelativeURL", "KString", "", "" + Property: "DescTAG", "KString", "", "shader" + } + Entry: "Maya|use_metallic_map", "FbxPropertyEntry", "use_metallic_map", "FbxSemanticEntry" + Entry: "Maya|base_color", "FbxPropertyEntry", "base_color", "FbxSemanticEntry" + Entry: "Maya|use_ao_map", "FbxPropertyEntry", "use_ao_map", "FbxSemanticEntry" + Entry: "Maya|TEX_emissive_map", "FbxPropertyEntry", "TEX_emissive_map", "FbxSemanticEntry" + Entry: "Maya|TEX_metallic_map", "FbxPropertyEntry", "TEX_metallic_map", "FbxSemanticEntry" + Entry: "Maya|TEX_ao_map", "FbxPropertyEntry", "TEX_ao_map", "FbxSemanticEntry" + Entry: "Maya|uv_offset", "FbxPropertyEntry", "uv_offset", "FbxSemanticEntry" + Entry: "Maya|emissive_intensity", "FbxPropertyEntry", "emissive_intensity", "FbxSemanticEntry" + Entry: "Maya|metallic", "FbxPropertyEntry", "metallic", "FbxSemanticEntry" + Entry: "Maya|TEX_global_specular_cube", "FbxPropertyEntry", "TEX_global_specular_cube", "FbxSemanticEntry" + Entry: "Maya|use_roughness_map", "FbxPropertyEntry", "use_roughness_map", "FbxSemanticEntry" + Entry: "Maya|use_normal_map", "FbxPropertyEntry", "use_normal_map", "FbxSemanticEntry" + Entry: "Maya|use_color_map", "FbxPropertyEntry", "use_color_map", "FbxSemanticEntry" + Entry: "Maya|emissive", "FbxPropertyEntry", "emissive", "FbxSemanticEntry" + Entry: "Maya|use_emissive_map", "FbxPropertyEntry", "use_emissive_map", "FbxSemanticEntry" + Entry: "Maya|uv_scale", "FbxPropertyEntry", "uv_scale", "FbxSemanticEntry" + Entry: "Maya|TEX_global_diffuse_cube", "FbxPropertyEntry", "TEX_global_diffuse_cube", "FbxSemanticEntry" + Entry: "Maya|TEX_roughness_map", "FbxPropertyEntry", "TEX_roughness_map", "FbxSemanticEntry" + Entry: "Maya|roughness", "FbxPropertyEntry", "roughness", "FbxSemanticEntry" + Entry: "Maya|TEX_brdf_lut", "FbxPropertyEntry", "TEX_brdf_lut", "FbxSemanticEntry" + Entry: "Maya|TEX_color_map", "FbxPropertyEntry", "TEX_color_map", "FbxSemanticEntry" + Entry: "Maya|TEX_normal_map", "FbxPropertyEntry", "TEX_normal_map", "FbxSemanticEntry" + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OP", "Texture::file1", "Material::StingrayPBS1", "Maya|TEX_global_diffuse_cube" + Connect: "OP", "Texture::file2", "Material::StingrayPBS1", "Maya|TEX_global_specular_cube" + Connect: "OP", "Texture::file3", "Material::StingrayPBS1", "Maya|TEX_brdf_lut" + Connect: "OP", "Texture::file5", "Material::StingrayPBS1", "Maya|TEX_normal_map" + Connect: "OP", "Texture::file4", "Material::StingrayPBS1", "Maya|TEX_color_map" + Connect: "OP", "Texture::file6", "Material::StingrayPBS1", "Maya|TEX_metallic_map" + Connect: "OP", "Texture::file7", "Material::StingrayPBS1", "Maya|TEX_roughness_map" + Connect: "OP", "Texture::file8", "Material::StingrayPBS1", "Maya|TEX_emissive_map" + Connect: "OP", "Texture::file9", "Material::StingrayPBS1", "Maya|TEX_ao_map" + Connect: "OO", "Material::StingrayPBS1", "Implementation::StingrayPBS1_Implementation" + Connect: "OO", "BindingTable::root 8", "Implementation::StingrayPBS1_Implementation" + Connect: "OO", "Video::file8", "Texture::file8" + Connect: "OO", "Video::file6", "Texture::file6" + Connect: "OO", "Video::file9", "Texture::file9" + Connect: "OO", "Video::file2", "Texture::file2" + Connect: "OO", "Video::file1", "Texture::file1" + Connect: "OO", "Video::file7", "Texture::file7" + Connect: "OO", "Video::file3", "Texture::file3" + Connect: "OO", "Video::file4", "Texture::file4" + Connect: "OO", "Video::file5", "Texture::file5" + Connect: "OO", "Material::StingrayPBS1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_shaderfx_pbs_material_6100_binary.fbx b/modules/ufbx/data/maya_shaderfx_pbs_material_6100_binary.fbx new file mode 100644 index 0000000..3423ba3 Binary files /dev/null and b/modules/ufbx/data/maya_shaderfx_pbs_material_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_shaderfx_pbs_material_7700_ascii.fbx b/modules/ufbx/data/maya_shaderfx_pbs_material_7700_ascii.fbx new file mode 100644 index 0000000..86351dc --- /dev/null +++ b/modules/ufbx/data/maya_shaderfx_pbs_material_7700_ascii.fbx @@ -0,0 +1,814 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 13 + Hour: 15 + Minute: 6 + Second: 47 + Millisecond: 822 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_shaderfx_pbs_textures_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_shaderfx_pbs_textures_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "13/06/2022 12:06:47.821" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_shaderfx_pbs_textures_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "13/06/2022 12:06:47.821" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1403313117040, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 26 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceMaterial" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Unknown" + P: "MultiLayer", "bool", "", "",0 + } + } + } + ObjectType: "Implementation" { + Count: 1 + PropertyTemplate: "FbxImplementation" { + Properties70: { + P: "ShaderLanguage", "KString", "", "", "MentalRaySL" + P: "ShaderLanguageVersion", "KString", "", "", "" + P: "RenderAPI", "KString", "", "", "MentalRay" + P: "RenderAPIVersion", "KString", "", "", "" + P: "RootBindingName", "KString", "", "", "" + P: "Constants", "Compound", "", "" + } + } + } + ObjectType: "BindingTable" { + Count: 1 + PropertyTemplate: "FbxBindingTable" { + Properties70: { + P: "TargetName", "KString", "", "", "" + P: "TargetType", "KString", "", "", "" + P: "CodeAbsoluteURL", "KString", "XRefUrl", "", "" + P: "CodeRelativeURL", "KString", "XRefUrl", "", "" + P: "CodeTAG", "KString", "", "", "shader" + P: "DescAbsoluteURL", "KString", "XRefUrl", "", "" + P: "DescRelativeURL", "KString", "XRefUrl", "", "" + P: "DescTAG", "KString", "", "", "shader" + } + } + } + ObjectType: "Texture" { + Count: 9 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Video" { + Count: 9 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1402996452416, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1402746762272, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1403328393152, "Material::StingrayPBS1", "" { + Version: 102 + ShadingModel: "unknown" + MultiLayer: 0 + Properties70: { + P: "Maya", "Compound", "", "" + P: "Maya|TypeId", "int", "Integer", "",1166017 + P: "Maya|TEX_global_diffuse_cube", "Vector3D", "Vector", "",0,0,0 + P: "Maya|TEX_global_specular_cube", "Vector3D", "Vector", "",0,0,0 + P: "Maya|TEX_brdf_lut", "Vector3D", "Vector", "",0,0,0 + P: "Maya|use_normal_map", "float", "", "",0 + P: "Maya|uv_offset", "Vector2D", "Vector2", "",0,0 + P: "Maya|uv_scale", "Vector2D", "Vector2", "",1,1 + P: "Maya|TEX_normal_map", "Vector3D", "Vector", "",0,0,0 + P: "Maya|use_color_map", "float", "", "",1 + P: "Maya|TEX_color_map", "Vector3D", "Vector", "",0,0,0 + P: "Maya|base_color", "Vector3D", "Vector", "",0.00999999977648258,0.0199999995529652,0.0299999993294477 + P: "Maya|use_metallic_map", "float", "", "",1 + P: "Maya|TEX_metallic_map", "Vector3D", "Vector", "",0,0,0 + P: "Maya|metallic", "float", "", "",0.04 + P: "Maya|use_roughness_map", "float", "", "",0 + P: "Maya|TEX_roughness_map", "Vector3D", "Vector", "",0,0,0 + P: "Maya|roughness", "float", "", "",0.05 + P: "Maya|use_emissive_map", "float", "", "",1 + P: "Maya|TEX_emissive_map", "Vector3D", "Vector", "",0,0,0 + P: "Maya|emissive", "Vector3D", "Vector", "",0.0599999986588955,0.0700000002980232,0.0799999982118607 + P: "Maya|emissive_intensity", "float", "", "",0.09 + P: "Maya|use_ao_map", "float", "", "",0 + P: "Maya|TEX_ao_map", "Vector3D", "Vector", "",0,0,0 + } + } + Video: 1402975333360, "Video::file8", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_emissive.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC40NARS3AAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAIYUlEQVR42u2ce1CU1xmHH+KCLhoVFZRRiCIYwFvwEpFFiIgg3qOIsU6ixKixGafJ1MSZdJrpTGPbNFanUzM2atSMMY234JUqXrBGWFHEK2AAMaJGROTiXdjF/kFBEVBhbS3we/6B2f3e71z22fec833fHrvQeab72EB2Yo4t4XgEuKPyn1/5LyCaNBJAAggJICSAkABCAggJICSAkABCAggJICSAkABCAojGip1HgJtNzwPofn7DLl8ZQEOAkABCAggJICSAkABCAggJICSAkABCAggJICSAkACiUWLQ/XTtDyA0BAgJICSAkABCAggJICSAkABCAggJICSAkABCAggJIBod2h9A+wMIDQFCAggJICSAkABCAoimg8GW4LMJT7eGHf5hYOX/uz8/CMCde3eYumBCjcc72DtwMCaJ9k7tAehucn9imQ+XAWDqFUT4gJH0cPOmjWMbLGVWbty+zsWrFzhzIY2k9ERSfzpV7TxhwSOIHDmJ3t59cGrTDovVQtH1Is5dyOZE6nHizfs4evJItfbUVJ+l76/Cs7MXv/v6YxJOH3hsH4UFj2DpH5aRlpHKmOiIevfv/1QAWzA2NzJ68HhO7E2t9t64sPGVH35dcTA48Ns3f4+/r+mRhtrTwqEFzm1d8PPqz5SQN6t0XHOH5iz5dCkhptAqcfb29hhbGHF1cSWgv4k5b71XRcjHEZcci2fnXxHWP+KJAkyMmATAptgNDScD2GLg2Z8zGWeayGfNPsNitVR5b3rUDNIz0/Dx8q0WV9H5Fd+OR8t+O2I2/r4mfr52iTVxK0nJTKboZhH2BgNtWznh5vwSvbr1JrjvsCpx82bPJ8QUSs6l8/z1q8UkJh/kWtE17A32tHfqQPeXutO/z0BGDRtTY9srMsHD9dmbEsfMUb9koLc/Lxpbc+PO9Rr7wqmNE0H+wZSUlrAlLqbWNtdEg70SGPPDBtq37sDYsPFVXh/k54+3pw8r162o13lD/IYD8PGKeexJ2UXBjWuU3bdyr/QeVwpzSc5IYvWuFUT/eUqVuIp6RP/6LTbv+p68a3lYrVbu3rvLpdyLHEj6F4uXLyT0jeCnrsv128UcPmPG3mBPiF9orceNGT4OB3sH9pvjKSwubBqTwL0pcRTcKGDGGzOrvB49+R3y8q+wNW5zvc7r2NwRgNt3b9UprpVjSwBu3rr5TNu560hseWboH1HrMRNGRJan/x3rm84qwFJmYbs5Bm9PHwIGlKfNLq5uhAQMY82mr6sNC09Lek4aAO9HfkS7F59+HnEs9RgACz76E87tXZ5ZO5PSzRTeKOBldx/cXF6q9r5nVy96+/QhvyCfePO+hrUKeNJM+ElzhK2JMUQFT+WdKbNITD7ItMhoSkpL+HbzN/Wuy5fbl7Bw9t8I6BmIv08A2ZfPkn05i59yszl/5Rzp59NqHIv/uORT1i5ZR+iQ4YSYhnEmK530rHQyz/1I5rkMjqceo+h6UZ3rU3bfSvyxPUwIiiKsfwRf/fPvVb/9ERMB2LZ7C1artV6rrQa5CgAovlXE9j1biRwVRV/fV4gcHcXmnd/Xq6MryLqUwbuLp/OLYdMI7B2EZ2cvPDt7Pcg8Vgsns4+zeudy0nMerEBSM04zetoI3ps2l/DgEfj26Ilvj54P4iwWDh8/xKJlCzmWmlK3YSB5BxOCogjxG15NgLFhrwOwMXb9c/kMbN4f4Emz1NqouA8e12kHkaOiWPGXVbRybEXcj9urzWwfV8ea7qdnk0PijiTssKObuweeXT3x7OqFb4+e+PcLoJ/XAPp6+DFr/tsQUDV2+YElLD+wBDdnd9xduuLesSuenb3o270fAQMCGeQ3mE9Wz+fwmUM1ll9bfdJGp+Lboyed7rmReDQBgIABgbi6uJJ1KZMSl1t4uLjX+Rtu6/MEzzUDAJzLPUtKZjL9vAaQlG7mYv6FZ3bu+9wnO+cs2TlniTuwC4BmzZrxm7mfMG1SNB/MnMcHK+bUGHvhag4XruaQkFq+fn/Brhlzxs5lfGAk08NnVgrwtGyK3YBvj568HjGxUoCK9B+XHPvc+v//4lLwpgPr/vP3u/96WVarlUXLPi/PLO7d6zSWr9q5rHyy6lz3jLclLoaS0hLCgyMwtjBibGEkPDiCUkspe1PimrYAh8+YGf5hIMeyjtp8ru++2Eg3N4/HHtPZtQsAuXmXK19bNOcLunRwe2xcRydXAPKL8+pcr8LiQvab42np2JIRr40kYugoHI2OHD5j5vrt4ufW9wYaGQNfeZVda/eyN2EPO/fHknLqKFeu5mIwGHDp0JGhg0OYNfVdAFZvWFkZ19ujLyvmfcOh9AR+OLmf1POnyC/Ox9DMQPvWHXjV25/JQ6eWX8Q6uLF+mW7HesKCwstTv51dlesEDVqAJy1T6jNJfNolZ0XZFWVczruMq4srYUHhhAWF15zOy8pY/u2XrI1ZUznBvFqUh3NbF0y9gjD1Cqo1bsP+f7DNHFNr2x+tz8PEm/eRX5DPIL/B2NnZkV+QT1K62eZlti392+gywJAJ/gT7v0ZoYBi9ffrg5uqGo7ElpZZScvMuc+TEYdbGrCE143SVuKkLJjLQexCDfYfwsps3ndq5YnQwUmq1kF+cx6lzJ9lmjiHrUoZN849tu7cQPXlG5dq/7L71ufaXXeg8k02Pheuxbm0TJxowEkACCAkgJICQAEICCAkgmhTaH0D7AwgNAUICCAkgJICQAEICCAkgJICQAEICCAkgJICQAEICiMaHQffT9cMQoSFASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJASADR6ND+ANofQGgIEBJASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJAND7+DXtbEsjx2g+IAAAAAElFTkSuQmCC" + } + Video: 1402975339120, "Video::file6", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_metallic.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + RelativeFilename: "textures\checkerboard_metallic.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEQcOt4x+sgAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAGN0lEQVR42u3ca0xTZwDG8afQdiiIBaa4oUxAVlSKsYm2jqpIUVBEcOAFJ6jDLOzisrkNv7hsiUaXJVsMbmZZtmQTnYPhDRG5I4gIbKAC8TrRDZ2izqFglVJgHxQCpWC10R7q80v40h76npb/Oe9pTzmihGD/Tlig+uJ1S34dSq+R4PjWG98O9FxjAAyAGAAxAGIAxACIARADIAZADIAYADEAYgDEAMhWiSZ7jbTo+wA8nz+4x+cegFMAMQBiAMQAiAEQAyAGQAyAGAAxAGIAxACIARADIJsk5vl0Xh+AOAUQAyAGQAyAGAAxAGIAxACIARADIAZADIAYADEAsjm8PgCvD0CcAogBEAMgBkDPG7GlD/BDQS0A4P49HZJiZ0PXfKfvIBIJvvw1H84yVwDAaq2i95FwfaN5R7ze7mYv28V4rCXvJGF2dBwAIG93Cqo/+bj/I/SHYym93c1+HYzH6285U8/NmJePLxbFrcLUaRq4v+QBsViMxmtXcbKqEof270F56WHh7AEchgxFUMRik/eptPO7//hW3d3Z2UMVPA/tBgPaDQaogufB3t5ekFvmW+9/hLTsYiyNT4C3rxyOTk54wcEBnmO9EBG9BNu2p2JnRp719wBdGi6cRXDUMmSn/oSOdkOv+0JefwMNF85ijI/8kVu4OXsB4/fB5m59AeoZcHZxQ23FEUAkgmKqBppZs1Gcn/3M/rBd69i1zqae88rENUj8IAkdHR1I3/kz9qbuQP35c7Czt4PnWG9ow+ZjSXwCxvsHCGcPkL97B2RuI6DSzut1u3zSFIzxkSM3fbvVt6rXQiMBAGV5GSjL3Q8AWBCzVFBb/qiXR+PtD9cBANavfRebPk3C6boatLbexz2dDmdP1WHb118gcpYKR4sLhRNAeUEmbt+6iTkx8b23/ujlaPr3BioKsqz6wjo6y6BQTYeupRnHSwtxvLQQupZmBAZpIXNxFUwAi5evhEQiQU7mPmRn7Ol3uab/bmHNqljhBNBuMODwgTSM8ZFjvFINAHAb5YEA9UwU7tvVZ1p41tQh4ZBIpKgqyYOhTQ9Dmx5/lORCKpVibmS0YAKYMk0DANiftmvwvQ08nJEKfWsr5ixaAQDQLlwGQ5sexQfSzPr96vrGAX8sERga9WD3n5vRfVtZjvCmAQ/PVwAAp+tODr4AmptuobIoC4qpGnj5KaAJW4jyvEzcbb5t1Rd1tPer8BznhxtXL+N8bVX37X/WHUfDX5cgn+APX78JggjA0WnYg9fyzu3BFwAA5KWnAADe25AMh6GOj3Xwp/R2H/Dnibf+sAdbf3l+Zp/7Du5Ne7gXiBVEALq7LQAAp2HOg+ODIGNXLp7HqepyTFCqUVNRgsbLlwTx3h8AIuISERGXaHK5uQsWYsvmz9He3m7V9b165TKGy1zg5x+AyqMlTz8AS88nd8/fPc5rf/ftViT/qMa2rckmz3f3vK3n+E+yLj0fy9RYM0PC4Ozi9sjHcX1xBFYsjcGJsqK+e6YB1st4zMc9v2/82A1nTsBvogIJCath+OfMYz1/QUwBAFBalA+ltzsqy45YfZfadYC3aX2SyWlltVaBlC0ben1OYE3Fmb+ho6MDU4JCoQ6J6He5IY7DsGbjN8I7BhASmYsrAoO00Le2IidzX7/L/V50CG16PRSq6XB0lll1na/9fbH7OOrNdRsRv/YzjJVPhFgihdRhCDy8fBERl4jNKVmYNG2m8I4BLNHfiZIuj/qot8+8HhkNqVSKwpysAY+qdS3NqK08AqVGC3VIOAr27DR7vYwPTgd6u2rqZJapj7HTv/8KEqkUwVGxmBEegxnhMSYfr/50jW0F8LR2/11H+gM5lpsBpUaLwNCoPgE8a52dnfhl6yYcyzuAoIjFGOc/GcPdRkAkEqHp5nWcq6lCRcFBnDlRafFYooRgf4u+FMovdfIiUTSIMQAGQAyAGAAxAGIAxACIARADoOcErw/A6wMQpwBiAMQAiAEQAyAGQAyAGAAxAGIAxACIARADIAZAtkfM8+n81zDiFEAMgBgAMQBiAMQAiAEQAyAGQAyAGAAxAGIAxADI5vD6ALw+AHEKIAZADIAYADEAYgDEAIgBEAMgBkAMgBgAMQBiAGR7/ge2GSlguckQUwAAAABJRU5ErkJggg==" + } + Video: 1402975339600, "Video::file9", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_weight.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEREcWK26LQAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAFgUlEQVR42u3cz0vTfwDH8aeb0ylRI1MwCZ1url94UPwFzlF06dQhukpEehBCL50q69ChSygdBnWq/gA9SB3TFaPJRDAizB8spTAolUp0+9j2/Z42/DFnte/s63w9oEP7qJ+P7vl5v98fNz85XV1d/5AGr9ebzqfT2dmJ9v/39m9C9jUFoABEAYgCEAUgCkAUgCgAUQCiAEQBiAIQBSAKQLJVjsViSev9AHo9f2/vXyOApgBRAKIARAGIAhAFIApAFIAoAFEAogBEAYgCEAUgWSlXr6fr/gCiKUAUgCgAUQCiAEQBiAIQBSAKQBSAKABRAKIARAFI1tH9AXR/ANEUIApAFIAoANlvcjO9g1u3blFUVMS9e/f4/Pnzhm3nz5+nr6+Phw8fcu3atQ3bampqGB0dJRQK4XK5Eo8bhrHjPru7uwHo6+tLuX29o0eP0t7ezpkzZ3A6ndhsNiKRCJ8+feLt27cMDw/T39/Ply9fthxLsq+3fv+pjme7YwTIy8vb+wFMTk7S3NyM3W7fEkBVVRUALS0tWz6vqakJgOHh4Yz/ELq7u7l79+6WH7jFYsHlcuFyubh48SK9vb0UFhZqBPgdU1NTNDc3U1lZyevXrxOPm81mysvLmZ+f59SpUxw+fJjFxcXE9sbGxpQBxJ+sVNfBm8+8ZGfqzZs36enpIRaL8fjxY548ecKbN29YWVnhwIEDFBcXc+LECVpbW7lw4ULaoW03AuzG2f5X1gCTk5MAVFZWbni8vLwci8XC/fv3AXC73Ru2NzQ0ADA0NJSxYystLeXGjRv8/PmTS5cu0dHRgd/v58ePH0SjUb59+8b09DSDg4Ncv36d6upqLQJ/1/LyMvPz8xQVFXHw4MHE4w6Hg3A4zKNHj1hZWaG1tTWxzWaz4XQ6ef/+/ZZp47/kdrsxm814vV4GBwe1CMzkKFBaWordbmd8fDwx/4dCIcLhMIFAYEMADQ0NmEymlPN/qsXgdouyzZxOJwBPnz5N6/tLtZDTZWCSacBkMlFRUcH09DQAL1++5PTp04kRYrcWgPH9TUxM6DIwk2ZmZohGo9jtdgCOHTtGfn4+MzMzAPh8Pu7cuUNLSwvPnz+nsbGRWCyGz+fb8RIp3RdD4gvSXx1hki3WdroM3PcjQDgc5uPHj5SVlWGxWKiqqsIwDObm5gAIBoOsrq4mpoH6+nrevXvH169fM3pc379/B+DkyZP7dgTYtd8ETk1NYTabqaiowOFwMDs7SywWS5xtIyMjuN1ujh8/js1m25Xr//gIdPny5aRn+vp/WTsF7Nbr2RMTE5w7d46lpSXKysp48OABXq83MYSvrq7idru5ffs2AFarNeXwHt/2K/uPD8WbPzYYDOL3+7l69SoFBQWMjY3t+LWSHdN2x7DdfpN9zJ8+D3vm/gB+v59IJMKVK1c4dOgQr169SjpCeDweotFoYoGYScFgEJ/Ph9lspq2tjba2NqqrqykoKCAnJwer1UpJSQl1dXVaBKYrEokQCATweDwYhkEgENiwfXZ2lrW1NY4cOcLc3BzhcPiXzupkC634kL15IRf///ohfWBgAMMwOHv2LLW1tdTW1u64ZlAAf+jFixd4PB7Gxsa2PMHRaJQPHz7gdDp35exf79mzZwQCAZqamnA4HBQXF2O1WjEMg4WFBUKhEOPj44k1QzbJ6erqSus9gXpPn+4RJLoMFAUgCkAUgCgAUQCiAEQBiAIQBSD/a7o/gO4PIJoCRAGIAhAFIApAFIAoAFEAogBEAYgCEAUgCkAUgGSfXL2err8NFE0BogBEAYgCEAUgCkAUgCgAUQCiAEQBiAIQBSAKQLKO7g+g+wOIpgBRAKIARAGIAhAFIApAFIAoAFEAogBEAYgCEAUg2edfGDwXmaBbL+EAAAAASUVORK5CYII=" + } + Video: 1402975338640, "Video::file2", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\tiny_clouds.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBECQGBjzr1gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAJLUlEQVRIxwXByY4l2UEA0Lhz3JinN2VmDbhtGiOQLBkhFmwQG3rDhg0Sn4AEe77MHwI2pru6y11Z7+UbY44bd+Yc8Lvf/McxDjQ93EXnv32p0U3PO+t7MFEVPx2HO3bX37dRFLofDju4segPwwvYP74narG/kFdRfuDmAuff+/gl/OW3UPHtX3xgn1j1Qp4Xvg1X/AhDv/Xy3qMi5w8QFAmaHzDbjybv1NJvJRkTS9YelE/L/eSFCyAYev+S8ZO4kNKzK8hV7qBt0sBR8BQmbMi/wa5Lu8Jjl+P0nYs9v7HoUfAXaidbB2zGS2CCQAm9QeH86LLcfa08xd1aL88NM8X+w1lcN07iY77O1W0J9gCDyT6NhPIzjiaCGFrp04ZOAqf4aTRpXT90ClyrWREs6N1slchocU2uRzMmgGFbqeO460tr7fuUqPPa+OSTJ8w1d+E2cetWnPMQqBRIk6IVIPMckrLt0Qv8UbIf/XKOd2cDdb77Gck+t8CbafwqwyH4sNoIv4bJUJ6si78ax/lpSTosF3F46Lu/5PWfasAtZ4U8cndPiU/14ylaM3Cddz+gAAd314fci1Xts/+lTWUzFfRxorbCX/Rk6TAmxbidTcnYbHDkZ4dAZNkmEGdI/vz+5VL7pSe5lW5hYXbibIwYheYg0E88CG2A/uHjP6Om6Ch3JPT28z5lSmE4RvcFyxJ/jpaz9lnW9dCO6As28IEsFPTVg2633Cb6sGP4DicWtNsYe1cfzOAdWTBad4JOliv0T3/99xKEeJCGoWiElN2SQLYuwHsw6u7WMF3MGk3D5gYSFrFZFPFIpvHgAXw46nVJgg7CNCpqPgEaz4jxpq2JwunwKx7uOfq38h8lmyI2uNIp58Ha/0neZ8mFu4VJIIdl3HYwWIDR0TGycF3OTNdUiIeZ7sQreA4tTOXKeLhe6b54TyeaHYiwbsvXV7El6Lu/+e2sjFsnSlyHXwfs03WxrZ7SN5GaNTwxGQyT7VAYMrP+TEEJAB1yzSasUUsKmDZrbxo7hj4vo2GON+jxWNOEenoQKjXou/JvYzbuyGY62SAgOrpf3kSUhN7MX2k86VIA9eCKoLOcILawu09DpJ3wmcIEejxZkzTbQqfQrzHZU69WrcGm80JFrlw36D+Tv8uNsc4jqwmfeql8GwvT3lWFGEo66LjQU3928DTPcoCTiLIJVyhQifaQhiKwqgsZoEEbFAYuJt6UY6URrKRIYeLwpVYJfBBBisJ/xnRjgkHJeonal9YH+c1cA3iJYbRtI92RIHw7wHQCkfYzRxYusouzPEIyFWOVNXxP67RzhDpngnCbV1pQ9O+HX+OMkZdr6wNxm1QPExj4xCqug7VFrlOr7F4naFJSOQudVlFM+iK5w1pou5UbftOjJFr5Q77ZXi7AqapoQxSVCBRxjrD7lnOD5qjsL+0zi2++/3JUqsn24DaroWcyamIAg4tr5cPTmIf0a2p1VMzjI8DJZ27z7K+yG8Vpev0f8D4mTjnSr/Ov8WmgaAEJDuvtNOtbd0wavfzxHKq8wV48/D2KVj90UrNpDJ3d2sVvikDKeuxJoz3EUYr9NluT4IyYr933S4Oj07xHRRvRsL7PKi/8YCOIP3Ny2TynFAC/f8aMi11IXN5W3PD8+T17xiOFMPEi1EcvSOg3eM2MnY1z5SNcR5F9TINksc2m+0sin/qM4hg4swub2+3m/Yo3YmEMn5Zd5YNJw30WfuWAH+X4hD6i8FT0syPLlU6sYjT13shkXHScvl+WKlQ6apgIby6vNm7CBd2axTG8cFkQgLIgp48B/ddvvlMauLvxSVapYBBo6XXaHsuxmQdNQTZDDV6ytC4Vjx/QLSAwbMMjsiSySsFgXVrn2doUdhcU5L0L3VA1rFK6yYPAnhrMv9QbuIDEohv0t0hcl04/CGQkXJwyf0BJqr4dgEURw8I2m2ziyoXYutKr9M2JuqqaKEFrZBitxw83kG7YupWhDr0+1jkWWNDLo27s8urhKDbSGs3utqrOf3Sjqg6prNqi3Tya12hnyMVEcKuLmzOyCCwgm34vJV9+uL1wZOd8Lh4HjVUnfl4qQzXG16aV+NM7yu01Tlh4eqzjK4w98p3F+ADi8xaoTlU6nDsbOMzqGoe9vARP/dOY9EWUBImtOiLGd9M8Y5TjS4zJq4o5fzsKUyGGFmLw3p1V77ZTP/l2AwK4ssbGk+/FB70yOu+BaafXj78wtGtfsLYvOLh7yzNZErbgL+1WZi4fxreXMr+tb+k1+AjKEautAFEw3ZlNMTXdzgzCXhGLRxI3w0nszGJy59TQXro1voZND+Diy8U90dnFGKxoLV4JKr2VjWO0alkc4ZP8xjxGRKb4th3DMMYLnn2wbeHAsIgBjAr7rl+Y/e8nfcM7w/cL/7PCwJYQWl9AJ0rnsiWMh1BL8vEc4vNElNtdzXx3wVQWAfzmJxe0ZttvSNsd5hV5WRaV/Vyif/1tLaLFstmHUYfhbVla3TAC1oFd4gTu+7eMVrRRt5qEm6jmv7rIcB28jOKJsYzrBMGb2I8aRLMFh4jOOU3LmXOIYBdGLoYpoj5b7gf3Zr7C8G6AmcpTZ+nP76/2cIwW0NCIIi2N3Jo7G/oBai+SPXjYHjiXvIgM4Rr5IBY8qEhFawxYYebirQbQybPFYWVEZ0B3mUs939a0yCmq7khYOlnP+7KnSzjJH1ktHabgWEUG8egWJTlutepbBw989b7Yt9H+/ep9zw4IqGQt7sp+IkkRo3/Zx8QQh2fQJY8omy/8e7coEI5sLzmM2FOr8YoiPEQYpff5eceBQXGsjh8GlHeoFptDLKB39svUnHDGLF+qjbD6MWZbNs8B1kjdgdeeaNw9vqRHbACPO+v4pK3NZBJGQsfz/iHQpVX0MFoLXgK/actYrgUTsu1ky7Mm3Az8TcjIbjMdCrtiVERfsy1ZMdh105cAVvb+hg05j9WLwmR+A9aYPF+iDj7MTspJm0MTFhJA0a8JeEwT23UVWaMVwvdP2L+p1z5rTn39brF9jhhbcxZHOP+pxGxecBp+6joRxo6GBMv+cvEw3+uPaiWCl8Fayvxh6SR5waexWEchgl8ODK3IIs64HX4AJa1eZKBEFf9fM8BAu3T7BA63Glr9/8wzw4JWXTB6AAAAAElFTkSuQmCC" + } + Video: 1402975327120, "Video::file1", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\tiny_clouds.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + Content: + } + Video: 1402975328560, "Video::file7", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_roughness.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEQgLQH6W8gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAKS0lEQVR42u2cfVzN9x7A33UqlEp69LBSoWPCeiIxz5s8TVY2JgkzD2PGMpu5d3d3u2aXYdidx6sl11w2okQTmadQiOVEvBJpK1YqdUrU/qi1To+nlbs7+7xfr/NH39/5/L7n/L7v3+f7dPrpTHJVltIILvxwtzHhPNPGAqn/96tfF+FPjQggAggigCACCCKAIAIIIoAgAggigCACCCKAIAIIIoAgAghPKjo92lg06vcAsp//x65fMoB0AYIIIIgAggggiACCCCCIAIIIIIgAggggiACCCCCIAIIIIDyR6Ml+ujwfQJAuQBABBBFAEAEEEUAQAQQRQBABBBFAEAEEEUAQAQQRQBABhCcOeT6APB9AkC5AEAEEEUAQAYQ/G3oaI9L0OxoHHxQVkZ2VxcX4s/x77WpUFxNqnkro6OA5bCS9vUdi16UrhsbGFOTmckOVyMmIvZyOigSqTzaC41VlI9m2ljWPkMs/T23HLW1sGDNjJl08PLGx64BhS2MeFj8gOzOTtGtXuXw2lrjoKPKys6rVGejWpUF1Vr42vgP6cv3qlRq/S9Xz/lJe50i+Ul3NWxjyyqvTGDJiFHYODhg0a05+Xh63bqSQEB9HzIFI4k6d0Ig3aN6C58b74z54KDa2dugbNEOdf5/MWze5dukC52MOkxR/pv5pYFUBNGR48IB5kwM4cSRao7yPkyNvrFiLk4t7rbFJ8WdY/dYcCvJym0yAidNnMufdxRgYGNR5cR89fMjUXt1qbaiq07D6BMjNyeFQxD7+HjRPYxrWFAJY2tiwadce7BwctRZmQPeneWfDl9jYdqgzpjbh9eqqQE9fH9sO9rw2LwhvnzG8sWhxNQFmLPkUJxd3crOz2L1uDediosnLzsKktTku/QcxZsYclG49mbV0Bctff7VJ0tb0+QuYGfQ2JSUlfBf2Ncf27uZWchJFajXNDY0wNmtNOwdHlG49cR04uElT5jfbtjJu8lRWL/mQe1lZWsfVmnEqCfjuP5Zi5+BIfOwp1i3/J6pLCRTk52NsakoHx464evZmhO9YzRth4WJsbDuQdO4se9avJVV1mUJ1AYbGxrSxs6ezqwdew0dptxBUm/2mZmYcTbxKoVqNp6Ptr3f/wMF8vu0r8vNy+cB/LJlpN6tVYNXelvdDd2JkbMLKuTNJOB7TqAzQUdmFHd8eobS0lKBpk7l3Ma5BDdjYDDDUvQcRsfGsX7Gcjas+1ToDaCPAyeQUDI1aMsDZSWu5Yq/doLmhEbMH9eZ+zr3HMwhs1bo1AHczMzTKR/q9BEDElo01Nj5AZtpNIoI3AeA1YlSj78DxU15FoVDw1ZbNxBw88D8fNGWkpxMdEc7LgZPR09dv0nPn5ZR1kVY2bbSOKcjLA8DMyrrpZwGGRka4eXrx8efrAQjftVPjeHc3NwDOxUTXWcn58uMOzt0bfZE8+vQFYO+O7Y06T3C8iuB4FRfS72i8tGHrhi+wsLJmmM+LDa6v6qtynYf2hwOwJuQ/jJ86DcfOTujq1n2Pxh2OAmDeZ+sYMs6ftg4d0dHVfnKnV1fqrcyhiH1sWr1So8zc0qosM6Sn1VnJnfLjJmbmjRbA0toGgJRryb/b1On78+dIiDvLhGnTWXo8usnOu+bjjzC3sMTbZwwLP1xSMRNLuZaM6mIChw/s58ThaB49elQRs3PNSkxam+M5dAT+C94DoPhBET/cSOGGKpFzRw5x8eQxSirF1CtAVZa//xdCN677v5i3lpZPJxUKBcW19O/aDMDqGwPUR+iGdSzbsBmle0+S4s40ySCwUK3mnVmvsfGzFQx43pturm50VCpx6uqMU1dnfMZPIOn7S8wN9CcjPb2ssYsKWbcoiH2b1+PSbyAO3XrQ3rETtp2V2HZW0m+0L6lXVKyaN4vsjB8bNgt4ccJE/rpsBb7+AewKDaFQXaDxvp/u3qHdU7ZYtG3Hj6k3av3yFm3alU2hsn7SKH9YXIyevj66urqUlJRo9k3laay4WLOZ72ZkYGvvgEMnJy5fvPC7iXgoIpz0tFsMnRColQAN4fqVJK5fSar426hlS9x6ezEraCHKbt1Z+NHHzJ8ySSPm9vVkbl//NSs2NzJC6erBmBlzsFM+jf+C91gTNKdhY4Bvtm0lal8Y9p06sfiTZdWOJ54/D4BL/7qnWi79BwFwrUqDFdwvG8CYW1lVi7FpWy5NlZHtudhTAPiMf6XGu6zy67FmotIStm/eSI++/bF6yu6x1pV//z7ffRvF/KmBALh7etUbU5ifz4VjMawub3Slm0fNXUBN+8mVy3Yv+wgXVzdG+r3Ej4kXOL53d8UxVUwUz78wGu+AqYRs/4rbN1OrnaudrR3eAVPL0mZoqEbKu6JS4eHVhyn+/hzcFqwR5/3KuLJRd8p1jc+TEBmGz/gJ+PoH8NOVRNYHf1nvxahpz/2Xstr207UpT47ej/qtBbiOHltnXXWVN2Q/38zCtEy+Rw8r4ur7PYG1TtlCWWFRUY3vrXe4qM6/zxeLgnhYXIz/24tpa//rKtX5o4c5c/wYpmZmhIRH4jdxEpbW1igUCiytrfGbOImQ8EhMzcw4efRItUWkg2FlMvlMfx1P75E0a2GIQfMW9Hp+OKOnzQLg9MFIjZiUxEtEbQ9BoVAwc8lylv5rA72e7YexqSm6urq0NDamQ8eOjPD1e+zdQGF+PmE7tvPCy+Oa5Hyf7DmA7+tv4ty7L+Zt2qJnYICuQoGJuQXug4fy1poNAJyKDK+I2XviNLPfWYTXgEG0bf8UBs2aoVAoMLe0YsjIUXy+bQcA+7/5uuaFoEmuylJtFi2GB07jpTnzSbuezAcTx1JcVFTWIIWPWLUlBJeenrVPA8/EMjdwIrn37lXr50N3h/G0R82xl8/GsmzmFEpLq+4j6OA3+02GBUxFoVDUeVHvZmYw5BnnWhd6qt6BDV3QuaNvxN4Tpys+R117CPUNELVZNk48c4pVb86iuKhQ65jTx75jbqA/hWr1b5sFAOwP3kTXnp507eVFwLvvs/lviwDIyc5mypjRDPf1ZcSLfjg5d8PEtBV5uTlcTUwk4uudhO/aSWlpSbVzlpSU8Ons1xg6YRKew0Zi3d4WHR0dMtNuEnsggsitW2po/LK5wK61Kzm6ZxfKIcNx790HW3sHWpqYoC4o4HZqKglxZzgUEU5c7MnHmgVu30zl6LcHGeQ9vNHneu/lF+jRdwDdPPtg08EeI5OyrJafl0uqKpET4WGcjtqvEeM3qB/PDnkOr/4DsXPsiGmrVugqFOTm3EN1MYF9O/9bkWnrzQC/BflNnzwjSPgDIwKIAIIIIIgAggggiACCCCCIAIIIIIgAwp8BeT6APB9AkC5AEAEEEUAQAQQRQBABBBFAEAEEEUAQAQQRQBABBBFAEAGEJw892U+X/w0UpAsQRABBBBBEAEEEEEQAQQQQRABBBBBEAEEEEEQAQQQQRADhiUOeDyDPBxCkCxBEAEEEEEQAQQQQRABBBBBEAEEEEEQAQQQQRABBBBBEAOHJ42d71wzQGgPAkwAAAABJRU5ErkJggg==" + } + Video: 1402975329040, "Video::file3", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\tiny_clouds.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + Content: + } + Video: 1402975329520, "Video::file4", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_diffuse.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBECwZQ+1sKwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAFq0lEQVR42u3cW0xTdwDH8S/QymUqYuqi4gVsnBQZc0sFF0QGAx0PCwEdYMLTeNCYzAcTjEucD/K2B2Nc9rTERHFeF3SZCQs4TZlOxyAypyAggojKbUMuStFS9yAlIrTimArl93mCHtrTNt9z/ud/Wo7PzvT0J4yDrbp6PHcnwWJB639z6/dFpjQFoABEAYgCEAUgCkAUgCgAUQCiAEQBiAIQBSAKQLyVT3xExLi+D6DP8yf3+rUH0BAgCkAUgCgAUQCiAEQBiAIQBSAKQBSAKABRAKIAxCsZ9Hm6rg8gGgJEAYgCEAUgCkAUgCgAUQCiAEQBiAIQBSAKQBSAeB1dH0DXBxANAaIARAGIAhAFIApApg7Dq3jQ/MLCoZ+dTieP+/uxP3hAW3MzNyoruXz2LH29vSPuV+pmTrzmmblu6RjnzV9lZIx4Lp641uF6/DUe5tee/sYSG8sHSUnMN5sJmjkTp8NBX28vHXfv0lxXR21FBU3Xr4/pdXt6HyZ0AMN2Mb6++AcG4h8YSLDJxNIVK0jMzKRw3z6qy8q8Z0syGsnKyyPCan1ugYFpAQEEm0yYo6NJWL9+KE6v3QM8vxX6+vkxIySEhcuWEZuaSlhkJFl5eZzYs2fYmbCX2Qpdy8Z6Jszdmz7eM3EuyTk5RFit/NPSwtljx6i/coUHXV34GQxMDw7GFBrKYouFqLi417qFv/E9AIBzYICujg66Ojq4euECiZmZJGVn8+mmTXx/8iRdnZ2Tfg/wXnw8AAfz8/n73r2h2x2PHnG/vZ377e3cqKzklyNHdBB47vhxaioqeGvmTD5JS/OKIWBaYCAA9r4+zQLGoqyo6OluLyXFKwJorq0FIG3zZqbPmjW1ZwFjcae+HoC5oaH/6f6ejpxHG+89zQb+j7H35wMH+Hz3biwxMSyzWmm9dYuWxkZam5pou32b5traUWc+LzMbmJSzAHdcb0bwJNpaPLl38ybfbtvGRxs2YFm1innh4cwLDx9aPuBw0FhVxZnDh4f2FhNiD/AqP8/2tGzW7NlPQ+jpcXsk7+m5ubZy2zjn0AkWy6jrGcv7kmCxDF9/dTU/2mzg48OisDAWm82Emc0stVh4PyYGc3Q0YcuX8+WWLVwqLR2xnhdND0d7TuOdxbyxPcA7kZEAw46YJ4JHdjvTAgLwMxgYcDhGLPczGgHot9vdP8iTJzQ1NNDU0MCvZ84MTYW/2LGD9Tk55G7dOhTAlD0ITMvOBuDaxYsTKoDeri4ATG6OTeYM3t77klNX58AA3+3dC8CiZ4aGKRnAxtxc4j/+mI62Nv602SZUAHfq6gBYuXbtqMutg7c3D/6dyzcFBSwMC/P42K4D3vbW1qk1CzAYjcw2mYiIiiItK4uVcXE4HA6+3rUL/wk2b/6juJh3V69m5bp1POzpobykhJ7OTmaEhGBNSRkKo7ykZPiJIKuVg6dP89u5c9iKi/nr8mU6WlvxMxoxzZnDhwkJbMzNBeCHgoKpEYC7aU1Pdzf527dzyWYbdmDz/FTN9fvrPHfecPUqpYWFrMnIIDEzk8TMzJGvq7CQxmvXht3W1tLC23PnEp+cTHxy8ujDgNPJkf37OeXmbOCLPrh6Fe/Da9kD2O12eru7aWpooOz8eX46cYKewbF2Iio5dIjbNTXEpKYyf8kS/IOC6H/4kLv19fxeVERNefmI+3yWlERsfDxxSUlEREUxb8ECAoOCcDx+THtrK1fKyzl19Ci1VVUT6rX67ExPH9fXwvW1bl0mTiYxBaAARAGIAhAFIApAFIBMKbo+gK4PIBoCRAGIAhAFIApAFIAoAFEAogBEAYgCEAUgCkAUgHgfgz5P1z+GiIYAUQCiAEQBiAIQBSAKQBSAKABRAKIARAGIAhAFIF5H1wfQ9QFEQ4AoAFEAogBEAYgCEAUgCkAUgCgAUQCiAEQBiAIQ7/Mvxl4LkLfMIrUAAAAASUVORK5CYII=" + } + Video: 1402975330480, "Video::file5", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_normal.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_normal.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_normal.png" + RelativeFilename: "textures\checkerboard_normal.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEDEczOv0uAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAHDUlEQVR42u2de0xX5xnHPy8XndeJdsqYTLBgycTRFaRixcIwbZmDxtJ2bWa2zLGaNulq9sduXbJk6Wq2Zkv/mku0tlsWGmMva91gipXVqquIrFWbgnbFDQpYZxhgucOzP14ugvwuhjap/L6f5OQ9nPOc857L5zzve8755eB2FpkxBU42MyUyE6a2vOqf2vJRiIhGAkgAIQGEBBASQEgAIQGEBBASQEgAIQGEBBASQEgAMV2J0fv0yK5fGUBNgJAAQgIICSAkgJAAQgIICSAkgJAAQgIICSAkgJAAYloSo/fpkV2/MoCaACEBhAQQEkBIACEBhAQQEkBIACEBhAQQEkBIACEBxLRE3wfQ9wGEmgAhAYQEEBJASAAhAUQEPQf4pFZc+urY+KGnjPffcJPGlAIPZ02+jqUrjPX3QuotELfET2u7AGdPwut7ofk9F7JugKFBo78HLn8ITbVw6mXo7bh62R01vuztNn66EbomiYmONbaXw7w4P29XceBjcOt3jVV3+7jTrxjHn3EBY0fqDnQsrtsM0N9jZNwHxrX8f0pj0/eNn/wJcu9xxCc5Zs7yQ3ySY32J4/Ey2PSoQRjrjYp2zJzjWJTsyChxbHoa5i4OvNzMWY7cksnnZReOnfxguCjjxtthcMAYHPDjLsoiJwOMULcfVt3tWJZt/Kc6vGU2PgR3fMsxOGj8fY9xbB+0Nvh58cmwthhyS+CObztqZxi1z0++ntGr0xkz5sKSNMjaDIuSHWtKjYNPTr5c41kj736o/KMxNDj+ZH/1QT8/cUVwCRKzYPYCR+NJf9ITMx2JWeEfg2mTAU69BAN9xs33hxe/KMEo3AJDQ8auH8OepxyNdY7+Xj801jn2/Nqx+3Efn3Ff8KvZJxRHX6ej8YSj6jd+0ufTA4dXPQ8LPufILhw/PTXTWJrqOFQWej9WbPDluUN+uHJaRAnQ3eY49xosXuFIyAidAnNLIDrGcbwc3qoKfJXVHnQcLzeiYxxpd4W/PR3Dz96D/cfk6grouGQUfHP89IIH4X8XjeqK4HXMnGckZkLvR8b5N+H8m348MdPPi7i7gLdf9G1hOFngpuFO0D/2hY49NtzZS/hy+NuSkOHL/74XOGZwwHH4BVia6kjLttHMlJ7rO58Tm4WJpORBdKyj4SgM9TuG+v14dKwjJS8CbwMvf+j412FIWOVYnBb8CrjhC75sOht6vSMx85aE6pEZs+KML33duH2bl/FkiDT++gvQ12ts2Oz/zv8GDPTB4RdDb1dqwXD6rxqbdva18fMiphM4mgX2QkqezwIHfhE47jNzfNnzURjNy2VfzpgT6lZ07IrtbjcqfwkX64NfxZfbHDX7jbXFjqSVRk4xVJdDV3vw5eKSjBuWOzpajdZ3xmq+8C60t/h5cUlG23n36RDgk3qfXTpxfrPjxkPGLRscF+YZTfVuNObKbRjogZhYuHU59HcFr3vkxHd1jt+O0gDxrQ3Gk5uhv3fs4E+2/yPTWiqBYnj0aS9mS+XV8RP3/94HfHnkL1DbfOVJdsS/ahRthQVr4OCxyeu/1vNxXX0foOJZXxZuCRzTeWH4bmB5GHcMwzGXAhyEh7P8sG290dJgxCc78h8If3vb/u344G1jdpyjqRY6ml2I5w3G6uEO6ddKHTtqGDcUbfXLr77Lx0ZMH2C0za53nDli3JwP8UmTH4CW08O3TGG0lSPtaX1N8LjeLseOH0BXp1H8CKSvC//gn35luPxz6Nj0dTB/YejUPn+hI30dkScAQMVuiIpy3Pmdyee/W+Ef3abkw7I1gU/UshwjJc936N4Io2N2sdGx+2d+fMsTEJ8cngRNNY5dxdByKvSJzSnyZdl2G80+E4ey7TYuNuIEeP+Uo77GWH1ngCag1fHWXi9JwY8gZ6uxaLkRPcMPC5ONnIeMgh/6mPJn4FJzeB2qd4469v0eZs11PPJbmD3/40vDcz5rpN8G/X1GzYHAcTUHfEz6bX6ZiLkLuJK/7YbHfhfkIU8ZRM8wMu5xrNwIKzcGer5glO+8trr3P+v44k2+M/q9XxlHnjCwqffIswshJtbxzyqjuzPw+ro7HWeOGl/Jd2QXGh2HA925XE2wF0/XTQYAqKt2NJwJZr/jxHOOlx4z6vYb7c1Gf48f2puN+krj5W3GiT+4cbd44fLcz+GDc0baasfarR/PPo2k9ON/DR07EvNpaAbcziKbUh7Sz7qv7/r1g5AIRwJIACEBhAQQEkBIACEBRESh7wPo+wBCTYCQAEICCAkgJICQAEICCAkgJICQAEICCAkgJICQAGL6EaP36ZFdvzKAmgAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJASAAhAcS0RN8H0PcBhJoAIQGEBBASQEgAIQGEBBASQEgAIQGEBBASQEgAIQHE9OP/ec9ayCY5dBkAAAAASUVORK5CYII=" + } + Texture: 1402975338160, "Texture::file8", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file8" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file8" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 1402975332400, "Texture::file6", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file6" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file6" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_metallic.png" + RelativeFilename: "textures\checkerboard_metallic.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 1402975327600, "Texture::file9", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file9" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file9" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 1402975340080, "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 1402975325200, "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 1402975335280, "Texture::file7", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file7" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file7" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_roughness.png" + RelativeFilename: "textures\checkerboard_roughness.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 1402975330000, "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 1402975332880, "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 1402975328080, "Texture::file5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file5" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file5" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_normal.png" + RelativeFilename: "textures\checkerboard_normal.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Implementation: 1402902030448, "Implementation::StingrayPBS1_Implementation", "" { + Version: 100 + Properties70: { + P: "ShaderLanguage", "KString", "", "", "SFX" + P: "ShaderLanguageVersion", "KString", "", "", "28" + P: "RenderAPI", "KString", "", "", "SFX_PBS_SHADER" + P: "RootBindingName", "KString", "", "", "root" + P: "ShaderGraph", "Blob", "", "",32918 { + BinaryData: "U0ZCX1dJTiA9IHsgcGFyZW50X21hdGVyaWFsID0gImNvcmUvc3RpbmdyYXlfcmVuZGVyZXIvc2hhZGVyX2ltcG9ydC9zdGFuZGFyZCIgLyoKVmVyc2lvbj0yOApHcm91cFZlcnNpb249LTEuMDAwMDAwCkFkdmFuY2VkPTAKSGVscElEPTAKUGFyZW50TWF0ZXJpYWw9cHJlc2V0cy9TdGFuZGFyZApOdW1iZXJPZk5vZGVzPTMyCiNOVD0yMDE4OSAwCglQQz0zCgluYW1lPTEgdj01MDAwIE1ldGFsbGljX01hcF9Td2l0Y2gKCXBvc3g9MSB2PTIwMDMgMTAyMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgMjQwLjAwMDAwMAoJZ3JvdXA9LTEKCUlTQz00CgkJU1ZUPTUwMjIgMjAwMyAxIDAgMCAKCQlTVlQ9NTAyMiAyMDAzIDIgMSAwIAoJCVNEVj0xLjAwMDAwMAoJCVNWVD01MDIyIDIwMDMgMyAwIDEgCgkJU0NTPXIKCQlTVlQ9NTAyMiAyMDAzIDQgMCAwIAoJT1NDPTEKCQlTVlQ9NTAyMiAyMDAzIDUgCgkJQ0M9MQoJCQlDPTAgMCA1IDUgNSA2IDAKCQkJQ1BDPTAKI05UPTIwMTg5IDAKCVBDPTMKCW5hbWU9MSB2PTUwMDAgRW1pc3NpdmVfTWFwX1N3aXRjaAoJcG9zeD0xIHY9MjAwMyA3NDAuMDAwMDAwCglwb3N5PTEgdj0yMDAzIDc4MC4wMDAwMDAKCWdyb3VwPS0xCglJU0M9NAoJCVNWVD01MDIyIDIwMDMgMSAwIDAgCgkJU1ZUPTUwMjIgMjAwMyAyIDEgMCAKCQlTRFY9MS4wMDAwMDAKCQlTVlQ9NTAyMiAzMDAyIDMgMCAxIAoJCVNDUz1yZ2IKCQlTVlQ9NTAyMiAzMDAyIDQgMCAwIAoJT1NDPTEKCQlTVlQ9NTAyMiAzMDAyIDUgCgkJQ0M9MQoJCQlDPTEgMCA1IDEwIDAgMSAwCgkJCUNQQz0wCiNOVD0yMDE4OSAwCglQQz0zCgluYW1lPTEgdj01MDAwIENvbG9yX01hcF9Td2l0Y2gKCXBvc3g9MSB2PTIwMDMgMTAyMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgLTM0MC4wMDAwMDAKCWdyb3VwPS0xCglJU0M9NAoJCVNWVD01MDIyIDIwMDMgMSAwIDAgCgkJU1ZUPTUwMjIgMjAwMyAyIDEgMCAKCQlTRFY9MS4wMDAwMDAKCQlTVlQ9NTAyMiAzMDAyIDMgMCAxIAoJCVNDUz1yZ2IKCQlTVlQ9NTAyMiAzMDAyIDQgMCAwIAoJT1NDPTEKCQlTVlQ9NTAyMiAzMDAyIDUgCgkJQ0M9MQoJCQlDPTIgMCA1IDUgMSAyIDAKCQkJQ1BDPTAKI05UPTIwMTg5IDAKCVBDPTMKCW5hbWU9MSB2PTUwMDAgTm9ybWFsX01hcF9Td2l0Y2gKCXBvc3g9MSB2PTIwMDMgMTAyMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgLTYwLjAwMDAwMAoJZ3JvdXA9LTEKCUlTQz00CgkJU1ZUPTUwMjIgMjAwMyAxIDAgMCAKCQlTVlQ9NTAyMiAyMDAzIDIgMSAwIAoJCVNEVj0xLjAwMDAwMAoJCVNWVD01MDIyIDMwMDIgMyAwIDAgCgkJU1ZUPTUwMjIgMzAwMiA0IDAgMCAKCU9TQz0xCgkJU1ZUPTUwMjIgMzAwMiA1IAoJCUNDPTEKCQkJQz0zIDAgNSA1IDQgNSAwCgkJCUNQQz0wCiNOVD0yMDE4OSAwCglQQz0zCgluYW1lPTEgdj01MDAwIFJvdWdobmVzc19NYXBfU3dpdGNoCglwb3N4PTEgdj0yMDAzIDEwMjAuMDAwMDAwCglwb3N5PTEgdj0yMDAzIDU0MC4wMDAwMDAKCWdyb3VwPS0xCglJU0M9NAoJCVNWVD01MDIyIDIwMDMgMSAwIDAgCgkJU1ZUPTUwMjIgMjAwMyAyIDEgMCAKCQlTRFY9MS4wMDAwMDAKCQlTVlQ9NTAyMiAyMDAzIDMgMCAxIAoJCVNDUz1yCgkJU1ZUPTUwMjIgMjAwMyA0IDAgMCAKCU9TQz0xCgkJU1ZUPTUwMjIgMjAwMyA1IAoJCUNDPTEKCQkJQz00IDAgNSA1IDYgNyAwCgkJCUNQQz0wCiNOVD0yMDE3NiAwCglQQz01Cglwb3N4PTEgdj0yMDAzIDEzNjAuMDAwMDAwCglwb3N5PTEgdj0yMDAzIDI2MC4wMDAwMDAKCXNoYWRlcnJlc291cmNlPTEgdj01MDAwIGNvcmUvc3RpbmdyYXlfcmVuZGVyZXIvc2hhZGVyX2ltcG9ydC9zdGFuZGFyZAoJcHJlc2V0X3BhdGg9MSB2PTUwMDAgcHJlc2V0cy9TdGFuZGFyZAoJbm9ybWFsc3BhY2U9MiBlPTAgdj01MDEyIDEKCWdyb3VwPS0xCglJU0M9MTMKCQlTVlQ9NTAyMiAzMDAyIDEgMCAwIAoJCVNWVD01MDIyIDMwMDIgMiAwIDAgCgkJU1ZUPTUwMjIgMjAwMyAzIDAgMCAKCQlTVlQ9NTAyMiAyMDAzIDQgMCAwIAoJCVNWVD01MDIyIDMwMDIgNSAwIDAgCgkJU1ZUPTUwMjIgMjAwMyA2IDAgMCAKCQlTVlQ9NTAyMiAyMDAzIDcgMCAwIAoJCVNWVD01MDIyIDMwMDIgOCAwIDAgCgkJU1ZUPTUwMjIgMjAwMyA5IDAgMCAKCQlTVlQ9NTAyMiAyMDAzIDEwIDAgMCAKCQlTVlQ9NTAyMiAyMDAzIDExIDAgMCAKCQlTVlQ9NTAyMiAyMDAzIDE0IDAgMCAKCQlTVlQ9NTAyMiAyMDAzIDE1IDAgMCAKCU9TQz0wCiNOVD0yMDE4OSAwCglQQz0zCgluYW1lPTEgdj01MDAwIEFvX01hcF9Td3RpY2gKCXBvc3g9MSB2PTIwMDMgMTAyMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgMTEwMC4wMDAwMDAKCWdyb3VwPS0xCglJU0M9NAoJCVNWVD01MDIyIDIwMDMgMSAwIDAgCgkJU1ZUPTUwMjIgMjAwMyAyIDEgMCAKCQlTRFY9MS4wMDAwMDAKCQlTVlQ9NTAyMiAyMDAzIDMgMCAxIAoJCVNDUz1yCgkJU1ZUPTUwMjIgMjAwMyA0IDEgMCAKCQlTRFY9MS4wMDAwMDAKCU9TQz0xCgkJU1ZUPTUwMjIgMjAwMyA1IAoJCUNDPTEKCQkJQz02IDAgNSA1IDggOSAwCgkJCUNQQz0wCiNOVD0yMDE3OCAwCglQQz0yCglwb3N4PTEgdj0yMDAzIC0yNjAuMDAwMDAwCglwb3N5PTEgdj0yMDAzIDQyMC4wMDAwMDAKCWdyb3VwPS0xCglJU0M9MAoJT1NDPTEKCQlTVlQ9NTAyMiAzMDAxIDEgCgkJQ0M9MQoJCQlDPTcgMCAxIDI4IDEgMiAwCgkJCUNQQz0wCiNOVD0yMDE3NyAwCglQQz02Cglu", + "YW1lPTEgdj01MDAwIHJvdWdobmVzc19tYXAKCXBvc3g9MSB2PTIwMDMgNzAwLjAwMDAwMAoJcG9zeT0xIHY9MjAwMyA1NDAuMDAwMDAwCgl0ZXh0dXJlcGF0aD0yIGU9MSB2PTUwMDAgRDovRGV2L2NsZWFuL3VmYngvZGF0YS90ZXh0dXJlcy9jaGVja2VyYm9hcmRfcm91Z2huZXNzLnBuZwoJZW5jb2Rpbmc9MiBlPTAgdj01MDEyIDAKCXVpb3JkZXI9MiBlPTAgdj0yMDAyIDQKCWdyb3VwPS0xCglJU0M9MgoJCVNWVD01MDIyIDMwMDEgMSAwIDAgCgkJU1ZUPTUwMjIgMjAwMyAyIDAgMCAKCU9TQz0xCgkJU1ZUPTUwMjIgMzAwMyAzIAoJCUNDPTEKCQkJQz04IDAgMyA0IDIgMyAwCgkJCUNQQz0wCiNOVD0yMDE3NyAwCglQQz01CgluYW1lPTEgdj01MDAwIGVtaXNzaXZlX21hcAoJcG9zeD0xIHY9MjAwMyA0MjAuMDAwMDAwCglwb3N5PTEgdj0yMDAzIDc4MC4wMDAwMDAKCXRleHR1cmVwYXRoPTIgZT0xIHY9NTAwMCBEOi9EZXYvY2xlYW4vdWZieC9kYXRhL3RleHR1cmVzL2NoZWNrZXJib2FyZF9lbWlzc2l2ZS5wbmcKCXVpb3JkZXI9MiBlPTAgdj0yMDAyIDUKCWdyb3VwPS0xCglJU0M9MgoJCVNWVD01MDIyIDMwMDEgMSAwIDAgCgkJU1ZUPTUwMjIgMjAwMyAyIDAgMCAKCU9TQz0xCgkJU1ZUPTUwMjIgMzAwMyAzIAoJCUNDPTEKCQkJQz05IDAgMyAxIDIgMyAwCgkJCUNQQz0wCiNOVD0yMDE4NiAwCglQQz0yCglwb3N4PTEgdj0yMDAzIDEwMjAuMDAwMDAwCglwb3N5PTEgdj0yMDAzIDg0MC4wMDAwMDAKCWdyb3VwPS0xCglJU0M9MgoJCVNWVD01MDIyIDMwMDIgMSAwIDAgCgkJU1ZUPTUwMjIgMjAwMyAyIDAgMCAKCU9TQz0xCgkJU1ZUPTUwMjIgMzAwMiAzIAoJCUNDPTEKCQkJQz0xMCAwIDMgNSA3IDggMAoJCQlDUEM9MAojTlQ9MjAxODUgMAoJUEM9NwoJbmFtZT0xIHY9NTAwMCB1c2VfY29sb3JfbWFwCglwb3N4PTEgdj0yMDAzIDcwMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgLTQwMC4wMDAwMDAKCXR5cGU9MiBlPTAgdj01MDEyIDAKCWRlZmF1bHRzY2FsYXI9MiBlPTAgdj0yMDAzIDEuMDAwMDAwCgl1aXR5cGU9MiBlPTAgdj01MDEyIDEKCXVpb3JkZXI9MiBlPTAgdj0yMDAyIDEwCglncm91cD0tMQoJSVNDPTAKCU9TQz0xCgkJU1ZUPTUwMjIgMjAwMyAxIAoJCUNDPTEKCQkJQz0xMSAwIDEgMiAwIDEgMAoJCQlDUEM9MAojTlQ9MjAxNzcgMAoJUEM9NQoJbmFtZT0xIHY9NTAwMCBjb2xvcl9tYXAKCXBvc3g9MSB2PTIwMDMgNzAwLjAwMDAwMAoJcG9zeT0xIHY9MjAwMyAtMzQwLjAwMDAwMAoJdGV4dHVyZXBhdGg9MiBlPTEgdj01MDAwIEQ6L0Rldi9jbGVhbi91ZmJ4L2RhdGEvdGV4dHVyZXMvY2hlY2tlcmJvYXJkX2RpZmZ1c2UucG5nCgl1aW9yZGVyPTIgZT0wIHY9MjAwMiAxCglncm91cD0tMQoJSVNDPTIKCQlTVlQ9NTAyMiAzMDAxIDEgMCAwIAoJCVNWVD01MDIyIDIwMDMgMiAwIDAgCglPU0M9MQoJCVNWVD01MDIyIDMwMDMgMyAKCQlDQz0xCgkJCUM9MTIgMCAzIDIgMiAzIDAKCQkJQ1BDPTAKI05UPTIwMTg1IDAKCVBDPTcKCW5hbWU9MSB2PTUwMDAgYmFzZV9jb2xvcgoJcG9zeD0xIHY9MjAwMyA3MDAuMDAwMDAwCglwb3N5PTEgdj0yMDAzIC0yNDAuMDAwMDAwCgl0eXBlPTIgZT0wIHY9NTAxMiAyCglkZWZhdWx0dmVjdGhyZWU9MiBlPTAgdj0zMDAyIDAuMDEwMDAwLDAuMDIwMDAwLDAuMDMwMDAwCglkZWZhdWx0dmVjdG9yPTIgZT0wIHY9MzAwMyAwLjUwMDAwMCwwLjUwMDAwMCwwLjUwMDAwMCwwLjAwMDAwMAoJdWlvcmRlcj0yIGU9MCB2PTIwMDIgMjAKCWdyb3VwPS0xCglJU0M9MAoJT1NDPTEKCQlTVlQ9NTAyMiAzMDAyIDEgCgkJQ0M9MQoJCQlDPTEzIDAgMSAyIDMgNCAwCgkJCUNQQz0wCiNOVD0yMDE4NSAwCglQQz02CgluYW1lPTEgdj01MDAwIHVzZV9ub3JtYWxfbWFwCglwb3N4PTEgdj0yMDAzIDcwMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgLTEyMC4wMDAwMDAKCXR5cGU9MiBlPTAgdj01MDEyIDAKCXVpdHlwZT0yIGU9MCB2PTUwMTIgMQoJdWlvcmRlcj0yIGU9MCB2PTIwMDIgMTEKCWdyb3VwPS0xCglJU0M9MAoJT1NDPTEKCQlTVlQ9NTAyMiAyMDAzIDEgCgkJQ0M9MQoJCQlDPTE0IDAgMSAzIDAgMSAwCgkJCUNQQz0wCiNOVD0yMDE5NCAwCglQQz0yCglwb3N4PTEgdj0yMDAzIDY4MC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgNjAuMDAwMDAwCglncm91cD0tMQoJSVNDPTAKCU9TQz0xCgkJU1ZUPTUwMjIgMzAwMiAxIAoJCUNDPTEKCQkJQz0xNSAwIDEgMyAzIDQgMAoJCQlDUEM9MAojTlQ9MjAxOTUgMAoJUEM9MgoJcG9zeD0xIHY9MjAwMyA3NDAuMDAwMDAwCglwb3N5PTEgdj0yMDAzIC02MC4wMDAwMDAKCWdyb3VwPS0xCglJU0M9MQoJCVNWVD01MDIyIDMwMDIgMSAwIDEgCgkJU0NTPXJnYgoJT1NDPTEKCQlTVlQ9NTAyMiAzMDAyIDIgCgkJQ0M9MQoJCQlDPTE2IDAgMiAzIDIgMyAwCgkJCUNQQz0wCiNOVD0yMDE3NyAwCglQQz02CgluYW1lPTEgdj01MDAwIG5vcm1hbF9tYXAKCXBvc3g9MSB2PTIwMDMgNDQwLjAwMDAwMAoJcG9zeT0xIHY9MjAwMyAtNjAuMDAwMDAwCgl0ZXh0dXJlcGF0aD0yIGU9MSB2PTUwMDAgRDovRGV2L2NsZWFuL3VmYngvZGF0YS90ZXh0dXJlcy9jaGVja2VyYm9hcmRfbm9ybWFsLnBuZwoJZW5jb2Rpbmc9MiBlPTAgdj01MDEyIDIKCXVpb3JkZXI9MiBlPTAgdj0yMDAyIDIKCWdyb3VwPS0xCglJU0M9MgoJCVNWVD01MDIyIDMwMDEgMSAwIDAgCgkJU1ZUPTUwMjIgMjAwMyAyIDAgMCAK", + "CU9TQz0xCgkJU1ZUPTUwMjIgMzAwMyAzIAoJCUNDPTEKCQkJQz0xNyAwIDMgMTYgMCAxIDAKCQkJQ1BDPTAKI05UPTIwMTc3IDAKCVBDPTcKCW5hbWU9MSB2PTUwMDAgbWV0YWxsaWNfbWFwCglwb3N4PTEgdj0yMDAzIDcwMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgMjQwLjAwMDAwMAoJdGV4dHVyZXBhdGg9MiBlPTEgdj01MDAwIEQ6L0Rldi9jbGVhbi91ZmJ4L2RhdGEvdGV4dHVyZXMvY2hlY2tlcmJvYXJkX21ldGFsbGljLnBuZwoJZW5jb2Rpbmc9MiBlPTAgdj01MDEyIDAKCWZpbHRlcj0yIGU9MCB2PTUwMTIgMQoJdWlvcmRlcj0yIGU9MCB2PTIwMDIgMwoJZ3JvdXA9LTEKCUlTQz0yCgkJU1ZUPTUwMjIgMzAwMSAxIDAgMCAKCQlTVlQ9NTAyMiAyMDAzIDIgMCAwIAoJT1NDPTEKCQlTVlQ9NTAyMiAzMDAzIDMgCgkJQ0M9MQoJCQlDPTE4IDAgMyAwIDIgMyAwCgkJCUNQQz0wCiNOVD0yMDE4NSAwCglQQz03CgluYW1lPTEgdj01MDAwIHVzZV9tZXRhbGxpY19tYXAKCXBvc3g9MSB2PTIwMDMgNzAwLjAwMDAwMAoJcG9zeT0xIHY9MjAwMyAxODAuMDAwMDAwCgl0eXBlPTIgZT0wIHY9NTAxMiAwCglkZWZhdWx0c2NhbGFyPTIgZT0wIHY9MjAwMyAxLjAwMDAwMAoJdWl0eXBlPTIgZT0wIHY9NTAxMiAxCgl1aW9yZGVyPTIgZT0wIHY9MjAwMiAxMgoJZ3JvdXA9LTEKCUlTQz0wCglPU0M9MQoJCVNWVD01MDIyIDIwMDMgMSAKCQlDQz0xCgkJCUM9MTkgMCAxIDAgMCAxIDAKCQkJQ1BDPTAKI05UPTIwMTg1IDAKCVBDPTYKCW5hbWU9MSB2PTUwMDAgbWV0YWxsaWMKCXBvc3g9MSB2PTIwMDMgNzAwLjAwMDAwMAoJcG9zeT0xIHY9MjAwMyAzNDAuMDAwMDAwCgl0eXBlPTIgZT0wIHY9NTAxMiAwCglkZWZhdWx0c2NhbGFyPTIgZT0wIHY9MjAwMyAwLjA0MDAwMAoJdWlvcmRlcj0yIGU9MCB2PTIwMDIgMjEKCWdyb3VwPS0xCglJU0M9MAoJT1NDPTEKCQlTVlQ9NTAyMiAyMDAzIDEgCgkJQ0M9MQoJCQlDPTIwIDAgMSAwIDMgNCAwCgkJCUNQQz0wCiNOVD0yMDE4NSAwCglQQz02CgluYW1lPTEgdj01MDAwIHVzZV9yb3VnaG5lc3NfbWFwCglwb3N4PTEgdj0yMDAzIDcwMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgNDgwLjAwMDAwMAoJdHlwZT0yIGU9MCB2PTUwMTIgMAoJdWl0eXBlPTIgZT0wIHY9NTAxMiAxCgl1aW9yZGVyPTIgZT0wIHY9MjAwMiAxMwoJZ3JvdXA9LTEKCUlTQz0wCglPU0M9MQoJCVNWVD01MDIyIDIwMDMgMSAKCQlDQz0xCgkJCUM9MjEgMCAxIDQgMCAxIDAKCQkJQ1BDPTAKI05UPTIwMTg1IDAKCVBDPTYKCW5hbWU9MSB2PTUwMDAgcm91Z2huZXNzCglwb3N4PTEgdj0yMDAzIDcwMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgNjQwLjAwMDAwMAoJdHlwZT0yIGU9MCB2PTUwMTIgMAoJZGVmYXVsdHNjYWxhcj0yIGU9MCB2PTIwMDMgMC4wNTAwMDAKCXVpb3JkZXI9MiBlPTAgdj0yMDAyIDIyCglncm91cD0tMQoJSVNDPTAKCU9TQz0xCgkJU1ZUPTUwMjIgMjAwMyAxIAoJCUNDPTEKCQkJQz0yMiAwIDEgNCAzIDQgMAoJCQlDUEM9MAojTlQ9MjAxODUgMAoJUEM9NgoJbmFtZT0xIHY9NTAwMCBlbWlzc2l2ZQoJcG9zeD0xIHY9MjAwMyA0MjAuMDAwMDAwCglwb3N5PTEgdj0yMDAzIDg4MC4wMDAwMDAKCXR5cGU9MiBlPTAgdj01MDEyIDIKCWRlZmF1bHR2ZWN0aHJlZT0yIGU9MCB2PTMwMDIgMC4wNjAwMDAsMC4wNzAwMDAsMC4wODAwMDAKCXVpb3JkZXI9MiBlPTAgdj0yMDAyIDIzCglncm91cD0tMQoJSVNDPTAKCU9TQz0xCgkJU1ZUPTUwMjIgMzAwMiAxIAoJCUNDPTEKCQkJQz0yMyAwIDEgMSAzIDQgMAoJCQlDUEM9MAojTlQ9MjAxODUgMAoJUEM9NwoJbmFtZT0xIHY9NTAwMCB1c2VfZW1pc3NpdmVfbWFwCglwb3N4PTEgdj0yMDAzIDQyMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgNzIwLjAwMDAwMAoJdHlwZT0yIGU9MCB2PTUwMTIgMAoJZGVmYXVsdHNjYWxhcj0yIGU9MCB2PTIwMDMgMS4wMDAwMDAKCXVpdHlwZT0yIGU9MCB2PTUwMTIgMQoJdWlvcmRlcj0yIGU9MCB2PTIwMDIgMTQKCWdyb3VwPS0xCglJU0M9MAoJT1NDPTEKCQlTVlQ9NTAyMiAyMDAzIDEgCgkJQ0M9MQoJCQlDPTI0IDAgMSAxIDAgMSAwCgkJCUNQQz0wCiNOVD0yMDE4NSAwCglQQz02CgluYW1lPTEgdj01MDAwIHVzZV9hb19tYXAKCXBvc3g9MSB2PTIwMDMgNzAwLjAwMDAwMAoJcG9zeT0xIHY9MjAwMyAxMTAwLjAwMDAwMAoJdHlwZT0yIGU9MCB2PTUwMTIgMAoJdWl0eXBlPTIgZT0wIHY9NTAxMiAxCgl1aW9yZGVyPTIgZT0wIHY9MjAwMiAxNQoJZ3JvdXA9LTEKCUlTQz0wCglPU0M9MQoJCVNWVD01MDIyIDIwMDMgMSAKCQlDQz0xCgkJCUM9MjUgMCAxIDYgMCAxIDAKCQkJQ1BDPTAKI05UPTIwMTc3IDAKCVBDPTcKCW5hbWU9MSB2PTUwMDAgYW9fbWFwCglwb3N4PTEgdj0yMDAzIDcwMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgMTE2MC4wMDAwMDAKCXRleHR1cmVwYXRoPTIgZT0xIHY9NTAwMCBEOi9EZXYvY2xlYW4vdWZieC9kYXRhL3RleHR1cmVzL2NoZWNrZXJib2FyZF93ZWlnaHQucG5nCgllbmNvZGluZz0yIGU9MCB2PTUwMTIgMAoJZmlsdGVyPTIgZT0wIHY9NTAxMiAxCgl1aW9yZGVyPTIgZT0wIHY9MjAwMiA2Cglncm91cD0tMQoJSVNDPTIKCQlTVlQ9NTAyMiAzMDAxIDEgMCAwIAoJCVNWVD01MDIyIDIwMDMgMiAwIDAgCglPU0M9MQoJCVNWVD01MDIyIDMwMDMgMyAKCQlDQz0xCgkJCUM9MjYgMCAzIDYgMiAzIDAKCQkJQ1BDPTAKI05UPTIwMTg1IDAKCVBD", + "PTcKCW5hbWU9MSB2PTUwMDAgZW1pc3NpdmVfaW50ZW5zaXR5Cglwb3N4PTEgdj0yMDAzIDc0MC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgOTIwLjAwMDAwMAoJdHlwZT0yIGU9MCB2PTUwMTIgMAoJZGVmYXVsdHNjYWxhcj0yIGU9MCB2PTIwMDMgMC4wOTAwMDAKCW1heHJhbmdlPTIgZT0wIHY9MjAwMyAxMC4wMDAwMDAKCXVpb3JkZXI9MiBlPTAgdj0yMDAyIDUzCglncm91cD0tMQoJSVNDPTAKCU9TQz0xCgkJU1ZUPTUwMjIgMjAwMyAxIAoJCUNDPTEKCQkJQz0yNyAwIDEgMTAgMSAyIDAKCQkJQ1BDPTAKI05UPTIwMTg2IDAKCVBDPTIKCXBvc3g9MSB2PTIwMDMgLTYwLjAwMDAwMAoJcG9zeT0xIHY9MjAwMyA0MDAuMDAwMDAwCglncm91cD0tMQoJSVNDPTIKCQlTVlQ9NTAyMiAzMDAxIDEgMCAwIAoJCVNWVD01MDIyIDMwMDEgMiAwIDAgCglPU0M9MQoJCVNWVD01MDIyIDMwMDEgMyAKCQlDQz0xCgkJCUM9MjggMCAzIDI5IDEgMiAwCgkJCUNQQz0wCiNOVD0yMDE4NyAwCglQQz0yCglwb3N4PTEgdj0yMDAzIDEyMC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgNDAwLjAwMDAwMAoJZ3JvdXA9LTEKCUlTQz0yCgkJU1ZUPTUwMjIgMzAwMSAxIDAgMCAKCQlTVlQ9NTAyMiAzMDAxIDIgMCAwIAoJT1NDPTEKCQlTVlQ9NTAyMiAzMDAxIDMgCgkJQ0M9NgoJCQlDPTI5IDAgMyAxMiAwIDEgMAoJCQlDUEM9MAoJCQlDPTI5IDAgMyAxNyAwIDEgMAoJCQlDUEM9MAoJCQlDPTI5IDAgMyAxOCAwIDEgMAoJCQlDUEM9MAoJCQlDPTI5IDAgMyA4IDAgMSAwCgkJCUNQQz0wCgkJCUM9MjkgMCAzIDkgMCAxIDAKCQkJQ1BDPTAKCQkJQz0yOSAwIDMgMjYgMCAxIDAKCQkJQ1BDPTAKI05UPTIwMTg1IDAKCVBDPTcKCW5hbWU9MSB2PTUwMDAgdXZfb2Zmc2V0Cglwb3N4PTEgdj0yMDAzIC02MC4wMDAwMDAKCXBvc3k9MSB2PTIwMDMgMzQwLjAwMDAwMAoJdHlwZT0yIGU9MCB2PTUwMTIgMQoJbWlucmFuZ2U9MiBlPTAgdj0yMDAzIC0xMDAwMDEuMDAwMDAwCgltYXhyYW5nZT0yIGU9MCB2PTIwMDMgMTAwMDAxLjAwMDAwMAoJdWlvcmRlcj0yIGU9MCB2PTIwMDIgNjAKCWdyb3VwPS0xCglJU0M9MAoJT1NDPTEKCQlTVlQ9NTAyMiAzMDAxIDEgCgkJQ0M9MQoJCQlDPTMwIDAgMSAyOSAwIDEgMAoJCQlDUEM9MAojTlQ9MjAxODUgMAoJUEM9OQoJbmFtZT0xIHY9NTAwMCB1dl9zY2FsZQoJcG9zeD0xIHY9MjAwMyAtMjQwLjAwMDAwMAoJcG9zeT0xIHY9MjAwMyAzNDAuMDAwMDAwCgl0eXBlPTIgZT0wIHY9NTAxMiAxCglkZWZhdWx0dmVjdHdvPTIgZT0wIHY9MzAwMSAxLjAwMDAwMCwxLjAwMDAwMAoJZGVmYXVsdHZlY3Rvcj0yIGU9MCB2PTMwMDMgMS4wMDAwMDAsMS4wMDAwMDAsMC4wMDAwMDAsMC4wMDAwMDAKCW1pbnJhbmdlPTIgZT0wIHY9MjAwMyAtMTAwMDAxLjAwMDAwMAoJbWF4cmFuZ2U9MiBlPTAgdj0yMDAzIDEwMDAwMS4wMDAwMDAKCXVpb3JkZXI9MiBlPTAgdj0yMDAyIDYxCglncm91cD0tMQoJSVNDPTAKCU9TQz0xCgkJU1ZUPTUwMjIgMzAwMSAxIAoJCUNDPTEKCQkJQz0zMSAwIDEgMjggMCAxIDAKCQkJQ1BDPTAKCiAqLyB9IApjb25uZWN0aW9ucyA9IFsKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiYWNhNjkwY2ItNjMwNS00YTJmLWJmM2QtNjkxODNhNDkzZGIzIiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI2IiAKCQl9IAoJCXNvdXJjZSA9IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiMyIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gIkNFRDdCQkYzLTBCNDgtNDMzNS1COTMzLTA5NUE0MUNBMDI5NCIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiMyIgCgkJfSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMTIiIAoJCX0gCgl9IAoJeyAKCQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICI0Q0JCNDQ4MC03OUU4LTRDRTctQUMwRi04QjA5QkFGMTIzOTAiIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjMiIAoJCX0gCgkJc2VsZWN0ID0gWyAKCQkJInJnYiIgCgkJCV0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjEzIiAKCQl9IAoJfSAKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiMWVlOWFmMWYtNjVmMi00NzM5LWFkMjgtNWVhNmEwZTY4ZmMzIiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjEzIiAKCQl9IAoJCXNvdXJjZSA9IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIzMCIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gIjFlZTlhZjFmLTY1ZjItNDczOS1hZDI4LTVlYTZhMGU2OGZjMyIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIxOCIgCgkJfSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMzAiIAoJ", + "CX0gCgl9IAoJeyAKCQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICIxZWU5YWYxZi02NWYyLTQ3MzktYWQyOC01ZWE2YTBlNjhmYzMiIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMTkiIAoJCX0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjMwIiAKCQl9IAoJfSAKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiMWVlOWFmMWYtNjVmMi00NzM5LWFkMjgtNWVhNmEwZTY4ZmMzIiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI5IiAKCQl9IAoJCXNvdXJjZSA9IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIzMCIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gIjFlZTlhZjFmLTY1ZjItNDczOS1hZDI4LTVlYTZhMGU2OGZjMyIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIxMCIgCgkJfSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMzAiIAoJCX0gCgl9IAoJeyAKCQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICIxZWU5YWYxZi02NWYyLTQ3MzktYWQyOC01ZWE2YTBlNjhmYzMiIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjciIAoJCX0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjMwIiAKCQl9IAoJfSAKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiZjcyNTk3YzQtNzQ4Ny00MTlhLWFmZmItZGY2OTBlNjU4MmUxIiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjMwIiAKCQl9IAoJCXNvdXJjZSA9IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIzMSIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gIjA4MDZkYjBkLTJjNGEtNDNjYS05OWNjLWY1YTJmMDM2YThlOCIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIzMCIgCgkJfSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjkiIAoJCX0gCgl9IAoJeyAKCQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICJjNTgyM2M3NS00YWU1LTRjNzEtYjA3MC0zMTVmYTRkMDNlOGUiIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjkiIAoJCX0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjMyIiAKCQl9IAoJfSAKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiMjQyZDE2NDgtYTYyNi00NDViLTk1MzQtYmNjZWMwOTQxMTJmIiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjI5IiAKCQl9IAoJCXNvdXJjZSA9IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiOCIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gIkYyRjc0RTU4LTQwMkQtNDcyQi04N0RELTMzMUUwMERCNDE2QyIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiMyIgCgkJfSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMTQiIAoJCX0gCgl9IAoJeyAKCQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICJiMWM4NjQwOC1hYWNiLTQ0NjYtYjc1NC1kZGNmMzdhM2EyYzgiIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjYiIAoJCX0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI0IiAKCQl9IAoJfSAKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiQ0VEN0JCRjMtMEI0OC00MzM1LUI5MzMtMDk1QTQxQ0EwMjk0IiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI0IiAKCQl9IAoJCXNvdXJjZSA9IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIxNSIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gIjRDQkI0NDgwLTc5RTgtNENFNy1BQzBGLThCMDlCQUYxMjM5MCIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiNCIgCgkJfSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMTciIAoJCX0gCgl9IAoJeyAK", + "CQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICJmNzI1OTdjNC03NDg3LTQxOWEtYWZmYi1kZjY5MGU2NTgyZTEiIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMTciIAoJCX0gCgkJc2VsZWN0ID0gWyAKCQkJInJnYiIgCgkJCV0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjE4IiAKCQl9IAoJfSAKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiRjJGNzRFNTgtNDAyRC00NzJCLTg3REQtMzMxRTAwREI0MTZDIiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI0IiAKCQl9IAoJCXNvdXJjZSA9IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIxNiIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gImFkNWUwNTJmLWQzMTYtNGEwZi04Yjc5LTUzYzM4MjA0ZDYxYiIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiNiIgCgkJfSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjEiIAoJCX0gCgl9IAoJeyAKCQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICJDRUQ3QkJGMy0wQjQ4LTQzMzUtQjkzMy0wOTVBNDFDQTAyOTQiIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjEiIAoJCX0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjIwIiAKCQl9IAoJfSAKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiNENCQjQ0ODAtNzlFOC00Q0U3LUFDMEYtOEIwOUJBRjEyMzkwIiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmIxIiAKCQl9IAoJCXNlbGVjdCA9IFsgCgkJCSJyIiAKCQkJXSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMTkiIAoJCX0gCgl9IAoJeyAKCQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICJGMkY3NEU1OC00MDJELTQ3MkItODdERC0zMzFFMDBEQjQxNkMiIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjEiIAoJCX0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjIxIiAKCQl9IAoJfSAKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiMzZiYTQ2ZDItZjZlYS00ZTYwLWE0MjgtZmRjMTdjNzViYzYyIiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI2IiAKCQl9IAoJCXNvdXJjZSA9IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiNSIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gIkNFRDdCQkYzLTBCNDgtNDMzNS1COTMzLTA5NUE0MUNBMDI5NCIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiNSIgCgkJfSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjIiIAoJCX0gCgl9IAoJeyAKCQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICI0Q0JCNDQ4MC03OUU4LTRDRTctQUMwRi04QjA5QkFGMTIzOTAiIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjUiIAoJCX0gCgkJc2VsZWN0ID0gWyAKCQkJInIiIAoJCQldIAoJCXNvdXJjZSA9IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiOSIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gIkYyRjc0RTU4LTQwMkQtNDcyQi04N0RELTMzMUUwMERCNDE2QyIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiNSIgCgkJfSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjMiIAoJCX0gCgl9IAoJeyAKCQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICIxMTY0YTVlZi00NTYzLTQ3OTUtYjNiNS00MjgyNWQ2ZGYwMzciIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjYiIAoJCX0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjExIiAKCQl9IAoJfSAKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiYzU4MjNjNzUtNGFlNS00YzcxLWIwNzAtMzE1ZmE0ZDAzZThlIiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjExIiAKCQl9IAoJCXNvdXJjZSA9", + "IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiMiIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gIkNFRDdCQkYzLTBCNDgtNDMzNS1COTMzLTA5NUE0MUNBMDI5NCIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiMiIgCgkJfSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjUiIAoJCX0gCgl9IAoJeyAKCQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICI0Q0JCNDQ4MC03OUU4LTRDRTctQUMwRi04QjA5QkFGMTIzOTAiIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjIiIAoJCX0gCgkJc2VsZWN0ID0gWyAKCQkJInJnYiIgCgkJCV0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjEwIiAKCQl9IAoJfSAKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiRjJGNzRFNTgtNDAyRC00NzJCLTg3REQtMzMxRTAwREI0MTZDIiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmIyIiAKCQl9IAoJCXNvdXJjZSA9IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIyNCIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gIjI0MmQxNjQ4LWE2MjYtNDQ1Yi05NTM0LWJjY2VjMDk0MTEyZiIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIxMSIgCgkJfSAKCQlzb3VyY2UgPSB7IAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjgiIAoJCX0gCgl9IAoJeyAKCQlkZXN0aW5hdGlvbiA9IHsgCgkJCWNvbm5lY3Rvcl9pZCA9ICI1OWZkMWNmNC1mNzM2LTQ3MGQtODUxMC0xZGQ3YzAxNjYzOWUiIAoJCQlpbnN0YW5jZV9pZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjYiIAoJCX0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI3IiAKCQl9IAoJfSAKCXsgCgkJZGVzdGluYXRpb24gPSB7IAoJCQljb25uZWN0b3JfaWQgPSAiQ0VEN0JCRjMtMEI0OC00MzM1LUI5MzMtMDk1QTQxQ0EwMjk0IiAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI3IiAKCQl9IAoJCXNvdXJjZSA9IHsgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIyNiIgCgkJfSAKCX0gCgl7IAoJCWRlc3RpbmF0aW9uID0geyAKCQkJY29ubmVjdG9yX2lkID0gIjRDQkI0NDgwLTc5RTgtNENFNy1BQzBGLThCMDlCQUYxMjM5MCIgCgkJCWluc3RhbmNlX2lkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiNyIgCgkJfSAKCQlzZWxlY3QgPSBbIAoJCQkiciIgCgkJCV0gCgkJc291cmNlID0geyAKCQkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjI3IiAKCQl9IAoJfSAKXQpjb25zdGFudHMgPSBbCgl7IAoJCWNvbm5lY3Rvcl9pZCA9ICIzOUJDNzYxOS0yNzY4LTQ4MEItQUNGRC02M0ZBNjZFRjY5MDUiIAoJCWlkID0gIjFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiMyIgCgkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmIzIiAKCQl2YWx1ZSA9IFsgCgkJCTEuMDAwMDAwCgkJXSAKCX0gCgl7IAoJCWNvbm5lY3Rvcl9pZCA9ICIzOUJDNzYxOS0yNzY4LTQ4MEItQUNGRC02M0ZBNjZFRjY5MDUiIAoJCWlkID0gIjFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiNCIgCgkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI0IiAKCQl2YWx1ZSA9IFsgCgkJCTEuMDAwMDAwCgkJXSAKCX0gCgl7IAoJCWNvbm5lY3Rvcl9pZCA9ICIzOUJDNzYxOS0yNzY4LTQ4MEItQUNGRC02M0ZBNjZFRjY5MDUiIAoJCWlkID0gIjFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiMSIgCgkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmIxIiAKCQl2YWx1ZSA9IFsgCgkJCTEuMDAwMDAwCgkJXSAKCX0gCgl7IAoJCWNvbm5lY3Rvcl9pZCA9ICIzOUJDNzYxOS0yNzY4LTQ4MEItQUNGRC02M0ZBNjZFRjY5MDUiIAoJCWlkID0gIjFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiNSIgCgkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI1IiAKCQl2YWx1ZSA9IFsgCgkJCTEuMDAwMDAwCgkJXSAKCX0gCgl7IAoJCWNvbm5lY3Rvcl9pZCA9ICIzOUJDNzYxOS0yNzY4LTQ4MEItQUNGRC02M0ZBNjZFRjY5MDUiIAoJCWlkID0gIjFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiMiIgCgkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmIyIiAKCQl2YWx1ZSA9IFsgCgkJCTEuMDAwMDAwCgkJ", + "XSAKCX0gCgl7IAoJCWNvbm5lY3Rvcl9pZCA9ICIzOUJDNzYxOS0yNzY4LTQ4MEItQUNGRC02M0ZBNjZFRjY5MDUiIAoJCWlkID0gIjFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiNyIgCgkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI3IiAKCQl2YWx1ZSA9IFsgCgkJCTEuMDAwMDAwCgkJXSAKCX0gCgl7IAoJCWNvbm5lY3Rvcl9pZCA9ICJGMkY3NEU1OC00MDJELTQ3MkItODdERC0zMzFFMDBEQjQxNkMiIAoJCWlkID0gIjNiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiNyIgCgkJaW5zdGFuY2VfaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI3IiAKCQl2YWx1ZSA9IFsgCgkJCTEuMDAwMDAwCgkJXSAKCX0gCl0Kbm9kZXMgPSBbCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjYiIAoJCW9wdGlvbnMgPSBbIAoJCQkiMmIxMzY0NDctNjc2ZS00OTQzLTk5N2ItMDRhMjhhZTY4NDk3IgoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQkxMzYwIAoJCQkyNjAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJfSAKCQl0aXRsZSA9ICJTdGFuZGFyZCBCYXNlIiAKCQl0eXBlID0gImNvcmUvc3RpbmdyYXlfcmVuZGVyZXIvb3V0cHV0X25vZGVzL3N0YW5kYXJkX2Jhc2UiIAoJfSAKCXsgCgkJY29udGVudF9zaXplID0gWyAKCQkJMTYwIAoJCQkwIAoJCV0gCgkJZXhwb3J0ID0geyAKCQl9IAoJCWlkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiMyIgCgkJb3B0aW9ucyA9IFsgCgkJCSI5QTg0MjgyQi1GMUEyLTQ2RDQtOUZDNC01QTc2RkM5QjMwREQiCgkJXSAKCQlwb3NpdGlvbiA9IFsgCgkJCTEwMjAgCgkJCS0zNDAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJfSAKCQl0aXRsZSA9ICJDb2xvciBNYXAgU3dpdGNoIiAKCQl0eXBlID0gImNvcmUvc2hhZGVyX25vZGVzL2lmIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJCW1hdGVyaWFsX3ZhcmlhYmxlID0geyAKCQkJCWRpc3BsYXlfbmFtZSA9ICJVc2UgQ29sb3IgTWFwIiAKCQkJCW5hbWUgPSAidXNlX2NvbG9yX21hcCIgCgkJCQl1aSA9IHsgCgkJCQkJbWF4ID0gMSAKCQkJCQltaW4gPSAwLjAwMDAwMCAKCQkJCQlzdGVwID0gMSAKCQkJCQlvcmRlciA9IDEwIAoJCQkJCXVpX3R5cGUgPSAiY2hlY2tib3giIAoJCQkJfSAKCQkJCXR5cGUgPSAiZmxvYXQiIAoJCQkJdmFsdWUgPSAxLjAwMDAwMCAKCQkJfSAKCQl9IAoJCWlkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIxMiIgCgkJb3B0aW9ucyA9IFsgCgkJXSAKCQlwb3NpdGlvbiA9IFsgCgkJCTcwMCAKCQkJLTQwMCAKCQldIAoJCXNhbXBsZXJzID0geyAKCQl9IAoJCXRpdGxlID0gIlVzZSBDb2xvciBNYXAiIAoJCXR5cGUgPSAiY29yZS9zaGFkZXJfbm9kZXMvbWF0ZXJpYWxfdmFyaWFibGUiIAoJfSAKCXsgCgkJY29udGVudF9zaXplID0gWyAKCQkJMTYwIAoJCQkwIAoJCV0gCgkJZXhwb3J0ID0geyAKCQl9IAoJCWlkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIxMyIgCgkJb3B0aW9ucyA9IFsgCgkJCSIxZTA2NzQ2NC0xMmQ4LTQ4MjYtOWI3Mi1jZmQ1NzY1MDAzZTMiCgkJCSJmYjNmNzA5Yi1hNTRhLTRlOTMtYWM5Zi1lOWZjNzZmYjhiY2QiCgkJCSI1ZGQ1OWIzZC0xNzYyLTRhMTQtOTkzMC03NTAwMjMwZWYzZGIiCgkJXSAKCQlwb3NpdGlvbiA9IFsgCgkJCTcwMCAKCQkJLTM0MCAKCQldIAoJCXNhbXBsZXJzID0geyAKCQkJdGV4dHVyZV9tYXAgPSB7IAoJCQkJZGlzcGxheV9uYW1lID0gIkNvbG9yIE1hcCIgCgkJCQlzbG90X25hbWUgPSAiY29sb3JfbWFwIiAKCQkJCXVpID0geyAKCQkJCQlvcmRlciA9IDEgCgkJCQl9IAoJCQl9IAoJCX0gCgkJdGl0bGUgPSAiQ29sb3IgTWFwIiAKCQl0eXBlID0gImNvcmUvc2hhZGVyX25vZGVzL3NhbXBsZV90ZXh0dXJlIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMzAiIAoJCW9wdGlvbnMgPSBbIAoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQkxMjAgCgkJCTQwMCAKCQldIAoJCXNhbXBsZXJzID0geyAKCQl9IAoJCXRpdGxlID0gIkFkZCIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy9hZGQiIAoJfSAKCXsgCgkJY29udGVudF9zaXplID0gWyAKCQkJMTYwIAoJCQkwIAoJCV0gCgkJZXhwb3J0ID0geyAKCQkJbWF0ZXJpYWxfdmFyaWFibGUgPSB7IAoJCQkJZGlzcGxheV9uYW1lID0gIlV2IE9mZnNldCIgCgkJCQluYW1lID0gInV2X29mZnNldCIgCgkJCQl1aSA9IHsgCgkJCQkJbWF4ID0gWyAxMDAwMDEuMDAwMDAwIDEwMDAwMS4wMDAwMDAgXSAKCQkJCQltaW4gPSBbIC0xMDAwMDEuMDAwMDAwIC0xMDAwMDEuMDAwMDAwIF0gCgkJCQkJc3RlcCA9IFsgMC4wMSAwLjAxIF0gCgkJCQkJb3JkZXIgPSA2MCAKCQkJCX0gCgkJCQl0eXBlID0gImZsb2F0MiIgCgkJCQl2YWx1ZSA9IFswLjAwMDAwMCAwLjAwMDAwMF0gCgkJCX0gCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEt", + "YWJiYS1hYmJhYWJiYWFiMzEiIAoJCW9wdGlvbnMgPSBbIAoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQktNjAgCgkJCTM0MCAKCQldIAoJCXNhbXBsZXJzID0geyAKCQl9IAoJCXRpdGxlID0gIlV2IE9mZnNldCIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy9tYXRlcmlhbF92YXJpYWJsZSIgCgl9IAoJeyAKCQljb250ZW50X3NpemUgPSBbIAoJCQkxNjAgCgkJCTAgCgkJXSAKCQlleHBvcnQgPSB7IAoJCX0gCgkJaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjI5IiAKCQlvcHRpb25zID0gWyAKCQldIAoJCXBvc2l0aW9uID0gWyAKCQkJLTYwIAoJCQk0MDAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJfSAKCQl0aXRsZSA9ICJNdWx0aXBseSIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy9tdWwiIAoJfSAKCXsgCgkJY29udGVudF9zaXplID0gWyAKCQkJMTYwIAoJCQkwIAoJCV0gCgkJZXhwb3J0ID0geyAKCQkJbWF0ZXJpYWxfdmFyaWFibGUgPSB7IAoJCQkJZGlzcGxheV9uYW1lID0gIlV2IFNjYWxlIiAKCQkJCW5hbWUgPSAidXZfc2NhbGUiIAoJCQkJdWkgPSB7IAoJCQkJCW1heCA9IFsgMTAwMDAxLjAwMDAwMCAxMDAwMDEuMDAwMDAwIF0gCgkJCQkJbWluID0gWyAtMTAwMDAxLjAwMDAwMCAtMTAwMDAxLjAwMDAwMCBdIAoJCQkJCXN0ZXAgPSBbIDAuMDEgMC4wMSBdIAoJCQkJCW9yZGVyID0gNjEgCgkJCQl9IAoJCQkJdHlwZSA9ICJmbG9hdDIiIAoJCQkJdmFsdWUgPSBbMS4wMDAwMDAgMS4wMDAwMDBdIAoJCQl9IAoJCX0gCgkJaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjMyIiAKCQlvcHRpb25zID0gWyAKCQldIAoJCXBvc2l0aW9uID0gWyAKCQkJLTI0MCAKCQkJMzQwIAoJCV0gCgkJc2FtcGxlcnMgPSB7IAoJCX0gCgkJdGl0bGUgPSAiVXYgU2NhbGUiIAoJCXR5cGUgPSAiY29yZS9zaGFkZXJfbm9kZXMvbWF0ZXJpYWxfdmFyaWFibGUiIAoJfSAKCXsgCgkJY29udGVudF9zaXplID0gWyAKCQkJMTYwIAoJCQkwIAoJCV0gCgkJZXhwb3J0ID0geyAKCQl9IAoJCWlkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiOCIgCgkJb3B0aW9ucyA9IFsgCgkJXSAKCQlwb3NpdGlvbiA9IFsgCgkJCS0yNjAgCgkJCTQyMCAKCQldIAoJCXNhbXBsZXJzID0geyAKCQl9IAoJCXRpdGxlID0gIlRleGNvb3JkMCIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy90ZXh0dXJlX2Nvb3JkaW5hdGUwIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJCW1hdGVyaWFsX3ZhcmlhYmxlID0geyAKCQkJCWRpc3BsYXlfbmFtZSA9ICJCYXNlIENvbG9yIiAKCQkJCW5hbWUgPSAiYmFzZV9jb2xvciIgCgkJCQl1aSA9IHsgCgkJCQkJbWF4ID0gWyAxLjAwMDAwMCAxLjAwMDAwMCAxLjAwMDAwMCBdIAoJCQkJCW1pbiA9IFsgMC4wMDAwMDAgMC4wMDAwMDAgMC4wMDAwMDAgXSAKCQkJCQlzdGVwID0gWyAwLjAxIDAuMDEgMC4wMSBdIAoJCQkJCW9yZGVyID0gMjAgCgkJCQkJdWlfdHlwZSA9ICJjb2xvciIgCgkJCQl9IAoJCQkJdHlwZSA9ICJmbG9hdDMiIAoJCQkJdmFsdWUgPSBbMC4wMTAwMDAgMC4wMjAwMDAgMC4wMzAwMDBdIAoJCQl9IAoJCX0gCgkJaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjE0IiAKCQlvcHRpb25zID0gWyAKCQldIAoJCXBvc2l0aW9uID0gWyAKCQkJNzAwIAoJCQktMjQwIAoJCV0gCgkJc2FtcGxlcnMgPSB7IAoJCX0gCgkJdGl0bGUgPSAiQmFzZSBDb2xvciIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy9tYXRlcmlhbF92YXJpYWJsZSIgCgl9IAoJeyAKCQljb250ZW50X3NpemUgPSBbIAoJCQkxNjAgCgkJCTAgCgkJXSAKCQlleHBvcnQgPSB7IAoJCX0gCgkJaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYmI0IiAKCQlvcHRpb25zID0gWyAKCQkJIjlBODQyODJCLUYxQTItNDZENC05RkM0LTVBNzZGQzlCMzBERCIKCQldIAoJCXBvc2l0aW9uID0gWyAKCQkJMTAyMCAKCQkJLTYwIAoJCV0gCgkJc2FtcGxlcnMgPSB7IAoJCX0gCgkJdGl0bGUgPSAiTm9ybWFsIE1hcCBTd2l0Y2giIAoJCXR5cGUgPSAiY29yZS9zaGFkZXJfbm9kZXMvaWYiIAoJfSAKCXsgCgkJY29udGVudF9zaXplID0gWyAKCQkJMTYwIAoJCQkwIAoJCV0gCgkJZXhwb3J0ID0geyAKCQkJbWF0ZXJpYWxfdmFyaWFibGUgPSB7IAoJCQkJZGlzcGxheV9uYW1lID0gIlVzZSBOb3JtYWwgTWFwIiAKCQkJCW5hbWUgPSAidXNlX25vcm1hbF9tYXAiIAoJCQkJdWkgPSB7IAoJCQkJCW1heCA9IDEgCgkJCQkJbWluID0gMC4wMDAwMDAgCgkJCQkJc3RlcCA9IDEgCgkJCQkJb3JkZXIgPSAxMSAKCQkJCQl1aV90eXBlID0gImNoZWNrYm94IiAKCQkJCX0gCgkJCQl0eXBlID0gImZsb2F0IiAKCQkJCXZhbHVlID0gMC4wMDAwMDAgCgkJCX0gCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMTUiIAoJCW9wdGlvbnMgPSBbIAoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQk3MDAgCgkJCS0xMjAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJfSAKCQl0aXRsZSA9ICJVc2UgTm9ybWFsIE1hcCIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy9tYXRlcmlhbF92YXJpYWJsZSIgCgl9IAoJeyAKCQljb250ZW50X3NpemUgPSBbIAoJCQkxNjAgCgkJ", + "CTAgCgkJXSAKCQlleHBvcnQgPSB7IAoJCX0gCgkJaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjE3IiAKCQlvcHRpb25zID0gWyAKCQkJIjBhMGZiNWFkLTE0NWQtNDIyOS1hYmQ0LTViMzY1NjI2MDdiMyIKCQldIAoJCXBvc2l0aW9uID0gWyAKCQkJNzQwIAoJCQktNjAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJfSAKCQl0aXRsZSA9ICJUYW5nZW50IFRvIFdvcmxkIiAKCQl0eXBlID0gImNvcmUvc2hhZGVyX25vZGVzL3RhbmdlbnRfdG9fd29ybGQiIAoJfSAKCXsgCgkJY29udGVudF9zaXplID0gWyAKCQkJMTYwIAoJCQkwIAoJCV0gCgkJZXhwb3J0ID0geyAKCQl9IAoJCWlkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIxOCIgCgkJb3B0aW9ucyA9IFsgCgkJCSIxZTA2NzQ2NC0xMmQ4LTQ4MjYtOWI3Mi1jZmQ1NzY1MDAzZTMiCgkJCSI5MGUyMDgyNi04Njg5LTQyZmEtOGUyNC1mNDg0ZWM2NGM1YzMiCgkJCSI1ZGQ1OWIzZC0xNzYyLTRhMTQtOTkzMC03NTAwMjMwZWYzZGIiCgkJXSAKCQlwb3NpdGlvbiA9IFsgCgkJCTQ0MCAKCQkJLTYwIAoJCV0gCgkJc2FtcGxlcnMgPSB7IAoJCQl0ZXh0dXJlX21hcCA9IHsgCgkJCQlkaXNwbGF5X25hbWUgPSAiTm9ybWFsIE1hcCIgCgkJCQlzbG90X25hbWUgPSAibm9ybWFsX21hcCIgCgkJCQl1aSA9IHsgCgkJCQkJb3JkZXIgPSAyIAoJCQkJfSAKCQkJfSAKCQl9IAoJCXRpdGxlID0gIk5vcm1hbCBNYXAiIAoJCXR5cGUgPSAiY29yZS9zaGFkZXJfbm9kZXMvc2FtcGxlX3RleHR1cmUiIAoJfSAKCXsgCgkJY29udGVudF9zaXplID0gWyAKCQkJMTYwIAoJCQkwIAoJCV0gCgkJZXhwb3J0ID0geyAKCQl9IAoJCWlkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIxNiIgCgkJb3B0aW9ucyA9IFsgCgkJXSAKCQlwb3NpdGlvbiA9IFsgCgkJCTY4MCAKCQkJNjAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJfSAKCQl0aXRsZSA9ICJXb3JsZCBOb3JtYWwiIAoJCXR5cGUgPSAiY29yZS9zaGFkZXJfbm9kZXMvd29ybGRfc3BhY2Vfbm9ybWFsIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjEiIAoJCW9wdGlvbnMgPSBbIAoJCQkiOUE4NDI4MkItRjFBMi00NkQ0LTlGQzQtNUE3NkZDOUIzMEREIgoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQkxMDIwIAoJCQkyNDAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJfSAKCQl0aXRsZSA9ICJNZXRhbGxpYyBNYXAgU3dpdGNoIiAKCQl0eXBlID0gImNvcmUvc2hhZGVyX25vZGVzL2lmIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJCW1hdGVyaWFsX3ZhcmlhYmxlID0geyAKCQkJCWRpc3BsYXlfbmFtZSA9ICJVc2UgTWV0YWxsaWMgTWFwIiAKCQkJCW5hbWUgPSAidXNlX21ldGFsbGljX21hcCIgCgkJCQl1aSA9IHsgCgkJCQkJbWF4ID0gMSAKCQkJCQltaW4gPSAwLjAwMDAwMCAKCQkJCQlzdGVwID0gMSAKCQkJCQlvcmRlciA9IDEyIAoJCQkJCXVpX3R5cGUgPSAiY2hlY2tib3giIAoJCQkJfSAKCQkJCXR5cGUgPSAiZmxvYXQiIAoJCQkJdmFsdWUgPSAxLjAwMDAwMCAKCQkJfSAKCQl9IAoJCWlkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIyMCIgCgkJb3B0aW9ucyA9IFsgCgkJXSAKCQlwb3NpdGlvbiA9IFsgCgkJCTcwMCAKCQkJMTgwIAoJCV0gCgkJc2FtcGxlcnMgPSB7IAoJCX0gCgkJdGl0bGUgPSAiVXNlIE1ldGFsbGljIE1hcCIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy9tYXRlcmlhbF92YXJpYWJsZSIgCgl9IAoJeyAKCQljb250ZW50X3NpemUgPSBbIAoJCQkxNjAgCgkJCTAgCgkJXSAKCQlleHBvcnQgPSB7IAoJCX0gCgkJaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjE5IiAKCQlvcHRpb25zID0gWyAKCQkJImY2NjlhM2E2LTAzNzYtNDE4Ny04NDBlLTgwMDAwZTI5MzlkNSIKCQkJImU5NGU1M2U2LTQ5YjYtNDE5NC1hNzQ3LThmMDY0YTU5MzJlMCIKCQkJIjVkZDU5YjNkLTE3NjItNGExNC05OTMwLTc1MDAyMzBlZjNkYiIKCQldIAoJCXBvc2l0aW9uID0gWyAKCQkJNzAwIAoJCQkyNDAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJCXRleHR1cmVfbWFwID0geyAKCQkJCWRpc3BsYXlfbmFtZSA9ICJNZXRhbGxpYyBNYXAiIAoJCQkJc2xvdF9uYW1lID0gIm1ldGFsbGljX21hcCIgCgkJCQl1aSA9IHsgCgkJCQkJb3JkZXIgPSAzIAoJCQkJfSAKCQkJfSAKCQl9IAoJCXRpdGxlID0gIk1ldGFsbGljIE1hcCIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy9zYW1wbGVfdGV4dHVyZSIgCgl9IAoJeyAKCQljb250ZW50X3NpemUgPSBbIAoJCQkxNjAgCgkJCTAgCgkJXSAKCQlleHBvcnQgPSB7IAoJCQltYXRlcmlhbF92YXJpYWJsZSA9IHsgCgkJCQlkaXNwbGF5X25hbWUgPSAiTWV0YWxsaWMiIAoJCQkJbmFtZSA9ICJtZXRhbGxpYyIgCgkJCQl1aSA9IHsgCgkJCQkJbWF4ID0gMS4wMDAwMDAgCgkJCQkJbWluID0gMC4wMDAwMDAgCgkJCQkJc3RlcCA9IDAuMDEgCgkJCQkJb3JkZXIgPSAyMSAKCQkJCX0gCgkJCQl0eXBlID0gImZsb2F0IiAKCQkJCXZhbHVlID0gMC4wNDAwMDAgCgkJCX0gCgkJfSAKCQlpZCA9ICJh", + "YmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjEiIAoJCW9wdGlvbnMgPSBbIAoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQk3MDAgCgkJCTM0MCAKCQldIAoJCXNhbXBsZXJzID0geyAKCQl9IAoJCXRpdGxlID0gIk1ldGFsbGljIiAKCQl0eXBlID0gImNvcmUvc2hhZGVyX25vZGVzL21hdGVyaWFsX3ZhcmlhYmxlIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjUiIAoJCW9wdGlvbnMgPSBbIAoJCQkiOUE4NDI4MkItRjFBMi00NkQ0LTlGQzQtNUE3NkZDOUIzMEREIgoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQkxMDIwIAoJCQk1NDAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJfSAKCQl0aXRsZSA9ICJSb3VnaG5lc3MgTWFwIFN3aXRjaCIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy9pZiIgCgl9IAoJeyAKCQljb250ZW50X3NpemUgPSBbIAoJCQkxNjAgCgkJCTAgCgkJXSAKCQlleHBvcnQgPSB7IAoJCQltYXRlcmlhbF92YXJpYWJsZSA9IHsgCgkJCQlkaXNwbGF5X25hbWUgPSAiVXNlIFJvdWdobmVzcyBNYXAiIAoJCQkJbmFtZSA9ICJ1c2Vfcm91Z2huZXNzX21hcCIgCgkJCQl1aSA9IHsgCgkJCQkJbWF4ID0gMSAKCQkJCQltaW4gPSAwLjAwMDAwMCAKCQkJCQlzdGVwID0gMSAKCQkJCQlvcmRlciA9IDEzIAoJCQkJCXVpX3R5cGUgPSAiY2hlY2tib3giIAoJCQkJfSAKCQkJCXR5cGUgPSAiZmxvYXQiIAoJCQkJdmFsdWUgPSAwLjAwMDAwMCAKCQkJfSAKCQl9IAoJCWlkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIyMiIgCgkJb3B0aW9ucyA9IFsgCgkJXSAKCQlwb3NpdGlvbiA9IFsgCgkJCTcwMCAKCQkJNDgwIAoJCV0gCgkJc2FtcGxlcnMgPSB7IAoJCX0gCgkJdGl0bGUgPSAiVXNlIFJvdWdobmVzcyBNYXAiIAoJCXR5cGUgPSAiY29yZS9zaGFkZXJfbm9kZXMvbWF0ZXJpYWxfdmFyaWFibGUiIAoJfSAKCXsgCgkJY29udGVudF9zaXplID0gWyAKCQkJMTYwIAoJCQkwIAoJCV0gCgkJZXhwb3J0ID0geyAKCQl9IAoJCWlkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWJiOSIgCgkJb3B0aW9ucyA9IFsgCgkJCSIxZTA2NzQ2NC0xMmQ4LTQ4MjYtOWI3Mi1jZmQ1NzY1MDAzZTMiCgkJCSJlOTRlNTNlNi00OWI2LTQxOTQtYTc0Ny04ZjA2NGE1OTMyZTAiCgkJCSI1ZGQ1OWIzZC0xNzYyLTRhMTQtOTkzMC03NTAwMjMwZWYzZGIiCgkJXSAKCQlwb3NpdGlvbiA9IFsgCgkJCTcwMCAKCQkJNTQwIAoJCV0gCgkJc2FtcGxlcnMgPSB7IAoJCQl0ZXh0dXJlX21hcCA9IHsgCgkJCQlkaXNwbGF5X25hbWUgPSAiUm91Z2huZXNzIE1hcCIgCgkJCQlzbG90X25hbWUgPSAicm91Z2huZXNzX21hcCIgCgkJCQl1aSA9IHsgCgkJCQkJb3JkZXIgPSA0IAoJCQkJfSAKCQkJfSAKCQl9IAoJCXRpdGxlID0gIlJvdWdobmVzcyBNYXAiIAoJCXR5cGUgPSAiY29yZS9zaGFkZXJfbm9kZXMvc2FtcGxlX3RleHR1cmUiIAoJfSAKCXsgCgkJY29udGVudF9zaXplID0gWyAKCQkJMTYwIAoJCQkwIAoJCV0gCgkJZXhwb3J0ID0geyAKCQkJbWF0ZXJpYWxfdmFyaWFibGUgPSB7IAoJCQkJZGlzcGxheV9uYW1lID0gIlJvdWdobmVzcyIgCgkJCQluYW1lID0gInJvdWdobmVzcyIgCgkJCQl1aSA9IHsgCgkJCQkJbWF4ID0gMS4wMDAwMDAgCgkJCQkJbWluID0gMC4wMDAwMDAgCgkJCQkJc3RlcCA9IDAuMDEgCgkJCQkJb3JkZXIgPSAyMiAKCQkJCX0gCgkJCQl0eXBlID0gImZsb2F0IiAKCQkJCXZhbHVlID0gMC4wNTAwMDAgCgkJCX0gCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjMiIAoJCW9wdGlvbnMgPSBbIAoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQk3MDAgCgkJCTY0MCAKCQldIAoJCXNhbXBsZXJzID0geyAKCQl9IAoJCXRpdGxlID0gIlJvdWdobmVzcyIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy9tYXRlcmlhbF92YXJpYWJsZSIgCgl9IAoJeyAKCQljb250ZW50X3NpemUgPSBbIAoJCQkxNjAgCgkJCTAgCgkJXSAKCQlleHBvcnQgPSB7IAoJCX0gCgkJaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjExIiAKCQlvcHRpb25zID0gWyAKCQldIAoJCXBvc2l0aW9uID0gWyAKCQkJMTAyMCAKCQkJODQwIAoJCV0gCgkJc2FtcGxlcnMgPSB7IAoJCX0gCgkJdGl0bGUgPSAiTXVsdGlwbHkiIAoJCXR5cGUgPSAiY29yZS9zaGFkZXJfbm9kZXMvbXVsIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjIiIAoJCW9wdGlvbnMgPSBbIAoJCQkiOUE4NDI4MkItRjFBMi00NkQ0LTlGQzQtNUE3NkZDOUIzMEREIgoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQk3NDAgCgkJCTc4MCAKCQldIAoJCXNhbXBsZXJzID0geyAKCQl9IAoJCXRpdGxlID0gIkVtaXNzaXZlIE1hcCBTd2l0Y2giIAoJCXR5cGUgPSAiY29yZS9zaGFkZXJfbm9kZXMvaWYiIAoJfSAKCXsgCgkJY29udGVudF9zaXplID0gWyAKCQkJMTYwIAoJCQkwIAoJCV0gCgkJZXhwb3J0ID0geyAKCQkJbWF0ZXJpYWxfdmFyaWFibGUgPSB7IAoJCQkJZGlzcGxheV9uYW1lID0gIlVzZSBFbWlzc2l2", + "ZSBNYXAiIAoJCQkJbmFtZSA9ICJ1c2VfZW1pc3NpdmVfbWFwIiAKCQkJCXVpID0geyAKCQkJCQltYXggPSAxIAoJCQkJCW1pbiA9IDAuMDAwMDAwIAoJCQkJCXN0ZXAgPSAxIAoJCQkJCW9yZGVyID0gMTQgCgkJCQkJdWlfdHlwZSA9ICJjaGVja2JveCIgCgkJCQl9IAoJCQkJdHlwZSA9ICJmbG9hdCIgCgkJCQl2YWx1ZSA9IDEuMDAwMDAwIAoJCQl9IAoJCX0gCgkJaWQgPSAiYWJiYWFiYmEtYWJiYS1hYmJhLWFiYmEtYWJiYWFiYmFhYjI1IiAKCQlvcHRpb25zID0gWyAKCQldIAoJCXBvc2l0aW9uID0gWyAKCQkJNDIwIAoJCQk3MjAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJfSAKCQl0aXRsZSA9ICJVc2UgRW1pc3NpdmUgTWFwIiAKCQl0eXBlID0gImNvcmUvc2hhZGVyX25vZGVzL21hdGVyaWFsX3ZhcmlhYmxlIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMTAiIAoJCW9wdGlvbnMgPSBbIAoJCQkiMWUwNjc0NjQtMTJkOC00ODI2LTliNzItY2ZkNTc2NTAwM2UzIgoJCQkiZmIzZjcwOWItYTU0YS00ZTkzLWFjOWYtZTlmYzc2ZmI4YmNkIgoJCQkiNWRkNTliM2QtMTc2Mi00YTE0LTk5MzAtNzUwMDIzMGVmM2RiIgoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQk0MjAgCgkJCTc4MCAKCQldIAoJCXNhbXBsZXJzID0geyAKCQkJdGV4dHVyZV9tYXAgPSB7IAoJCQkJZGlzcGxheV9uYW1lID0gIkVtaXNzaXZlIE1hcCIgCgkJCQlzbG90X25hbWUgPSAiZW1pc3NpdmVfbWFwIiAKCQkJCXVpID0geyAKCQkJCQlvcmRlciA9IDUgCgkJCQl9IAoJCQl9IAoJCX0gCgkJdGl0bGUgPSAiRW1pc3NpdmUgTWFwIiAKCQl0eXBlID0gImNvcmUvc2hhZGVyX25vZGVzL3NhbXBsZV90ZXh0dXJlIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJCW1hdGVyaWFsX3ZhcmlhYmxlID0geyAKCQkJCWRpc3BsYXlfbmFtZSA9ICJFbWlzc2l2ZSIgCgkJCQluYW1lID0gImVtaXNzaXZlIiAKCQkJCXVpID0geyAKCQkJCQltYXggPSBbIDEuMDAwMDAwIDEuMDAwMDAwIDEuMDAwMDAwIF0gCgkJCQkJbWluID0gWyAwLjAwMDAwMCAwLjAwMDAwMCAwLjAwMDAwMCBdIAoJCQkJCXN0ZXAgPSBbIDAuMDEgMC4wMSAwLjAxIF0gCgkJCQkJb3JkZXIgPSAyMyAKCQkJCQl1aV90eXBlID0gImNvbG9yIiAKCQkJCX0gCgkJCQl0eXBlID0gImZsb2F0MyIgCgkJCQl2YWx1ZSA9IFswLjA2MDAwMCAwLjA3MDAwMCAwLjA4MDAwMF0gCgkJCX0gCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjQiIAoJCW9wdGlvbnMgPSBbIAoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQk0MjAgCgkJCTg4MCAKCQldIAoJCXNhbXBsZXJzID0geyAKCQl9IAoJCXRpdGxlID0gIkVtaXNzaXZlIiAKCQl0eXBlID0gImNvcmUvc2hhZGVyX25vZGVzL21hdGVyaWFsX3ZhcmlhYmxlIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJCW1hdGVyaWFsX3ZhcmlhYmxlID0geyAKCQkJCWRpc3BsYXlfbmFtZSA9ICJFbWlzc2l2ZSBJbnRlbnNpdHkiIAoJCQkJbmFtZSA9ICJlbWlzc2l2ZV9pbnRlbnNpdHkiIAoJCQkJdWkgPSB7IAoJCQkJCW1heCA9IDEwLjAwMDAwMCAKCQkJCQltaW4gPSAwLjAwMDAwMCAKCQkJCQlzdGVwID0gMC4wMSAKCQkJCQlvcmRlciA9IDUzIAoJCQkJfSAKCQkJCXR5cGUgPSAiZmxvYXQiIAoJCQkJdmFsdWUgPSAwLjA5MDAwMCAKCQkJfSAKCQl9IAoJCWlkID0gImFiYmFhYmJhLWFiYmEtYWJiYS1hYmJhLWFiYmFhYmJhYWIyOCIgCgkJb3B0aW9ucyA9IFsgCgkJXSAKCQlwb3NpdGlvbiA9IFsgCgkJCTc0MCAKCQkJOTIwIAoJCV0gCgkJc2FtcGxlcnMgPSB7IAoJCX0gCgkJdGl0bGUgPSAiRW1pc3NpdmUgSW50ZW5zaXR5IiAKCQl0eXBlID0gImNvcmUvc2hhZGVyX25vZGVzL21hdGVyaWFsX3ZhcmlhYmxlIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiYjciIAoJCW9wdGlvbnMgPSBbIAoJCQkiOUE4NDI4MkItRjFBMi00NkQ0LTlGQzQtNUE3NkZDOUIzMEREIgoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQkxMDIwIAoJCQkxMTAwIAoJCV0gCgkJc2FtcGxlcnMgPSB7IAoJCX0gCgkJdGl0bGUgPSAiQW8gTWFwIFN3dGljaCIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy9pZiIgCgl9IAoJeyAKCQljb250ZW50X3NpemUgPSBbIAoJCQkxNjAgCgkJCTAgCgkJXSAKCQlleHBvcnQgPSB7IAoJCQltYXRlcmlhbF92YXJpYWJsZSA9IHsgCgkJCQlkaXNwbGF5X25hbWUgPSAiVXNlIEFvIE1hcCIgCgkJCQluYW1lID0gInVzZV9hb19tYXAiIAoJCQkJdWkgPSB7IAoJCQkJCW1heCA9IDEgCgkJCQkJbWluID0gMC4wMDAwMDAgCgkJCQkJc3RlcCA9IDEgCgkJCQkJb3JkZXIgPSAxNSAKCQkJCQl1aV90eXBlID0gImNoZWNrYm94IiAKCQkJCX0gCgkJCQl0eXBlID0gImZsb2F0IiAKCQkJCXZhbHVlID0gMC4wMDAwMDAgCgkJCX0gCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjYiIAoJCW9wdGlv", + "bnMgPSBbIAoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQk3MDAgCgkJCTExMDAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJfSAKCQl0aXRsZSA9ICJVc2UgQW8gTWFwIiAKCQl0eXBlID0gImNvcmUvc2hhZGVyX25vZGVzL21hdGVyaWFsX3ZhcmlhYmxlIiAKCX0gCgl7IAoJCWNvbnRlbnRfc2l6ZSA9IFsgCgkJCTE2MCAKCQkJMCAKCQldIAoJCWV4cG9ydCA9IHsgCgkJfSAKCQlpZCA9ICJhYmJhYWJiYS1hYmJhLWFiYmEtYWJiYS1hYmJhYWJiYWFiMjciIAoJCW9wdGlvbnMgPSBbIAoJCQkiZjY2OWEzYTYtMDM3Ni00MTg3LTg0MGUtODAwMDBlMjkzOWQ1IgoJCQkiZTk0ZTUzZTYtNDliNi00MTk0LWE3NDctOGYwNjRhNTkzMmUwIgoJCQkiNWRkNTliM2QtMTc2Mi00YTE0LTk5MzAtNzUwMDIzMGVmM2RiIgoJCV0gCgkJcG9zaXRpb24gPSBbIAoJCQk3MDAgCgkJCTExNjAgCgkJXSAKCQlzYW1wbGVycyA9IHsgCgkJCXRleHR1cmVfbWFwID0geyAKCQkJCWRpc3BsYXlfbmFtZSA9ICJBbyBNYXAiIAoJCQkJc2xvdF9uYW1lID0gImFvX21hcCIgCgkJCQl1aSA9IHsgCgkJCQkJb3JkZXIgPSA2IAoJCQkJfSAKCQkJfSAKCQl9IAoJCXRpdGxlID0gIkFvIE1hcCIgCgkJdHlwZSA9ICJjb3JlL3NoYWRlcl9ub2Rlcy9zYW1wbGVfdGV4dHVyZSIgCgl9IApdCnZlcnNpb24gPSAzCgA=" + } + } + } + BindingTable: 1403009526144, "BindingTable::root 6", "" { + Version: 100 + Properties70: { + P: "TargetName", "KString", "", "", "root" + P: "TargetType", "KString", "", "", "shader" + } + Entry: "Maya|use_metallic_map", "FbxPropertyEntry", "use_metallic_map", "FbxSemanticEntry" + Entry: "Maya|base_color", "FbxPropertyEntry", "base_color", "FbxSemanticEntry" + Entry: "Maya|use_ao_map", "FbxPropertyEntry", "use_ao_map", "FbxSemanticEntry" + Entry: "Maya|TEX_emissive_map", "FbxPropertyEntry", "TEX_emissive_map", "FbxSemanticEntry" + Entry: "Maya|TEX_metallic_map", "FbxPropertyEntry", "TEX_metallic_map", "FbxSemanticEntry" + Entry: "Maya|TEX_ao_map", "FbxPropertyEntry", "TEX_ao_map", "FbxSemanticEntry" + Entry: "Maya|uv_offset", "FbxPropertyEntry", "uv_offset", "FbxSemanticEntry" + Entry: "Maya|emissive_intensity", "FbxPropertyEntry", "emissive_intensity", "FbxSemanticEntry" + Entry: "Maya|metallic", "FbxPropertyEntry", "metallic", "FbxSemanticEntry" + Entry: "Maya|TEX_global_specular_cube", "FbxPropertyEntry", "TEX_global_specular_cube", "FbxSemanticEntry" + Entry: "Maya|use_roughness_map", "FbxPropertyEntry", "use_roughness_map", "FbxSemanticEntry" + Entry: "Maya|use_normal_map", "FbxPropertyEntry", "use_normal_map", "FbxSemanticEntry" + Entry: "Maya|use_color_map", "FbxPropertyEntry", "use_color_map", "FbxSemanticEntry" + Entry: "Maya|emissive", "FbxPropertyEntry", "emissive", "FbxSemanticEntry" + Entry: "Maya|use_emissive_map", "FbxPropertyEntry", "use_emissive_map", "FbxSemanticEntry" + Entry: "Maya|uv_scale", "FbxPropertyEntry", "uv_scale", "FbxSemanticEntry" + Entry: "Maya|TEX_global_diffuse_cube", "FbxPropertyEntry", "TEX_global_diffuse_cube", "FbxSemanticEntry" + Entry: "Maya|TEX_roughness_map", "FbxPropertyEntry", "TEX_roughness_map", "FbxSemanticEntry" + Entry: "Maya|roughness", "FbxPropertyEntry", "roughness", "FbxSemanticEntry" + Entry: "Maya|TEX_brdf_lut", "FbxPropertyEntry", "TEX_brdf_lut", "FbxSemanticEntry" + Entry: "Maya|TEX_color_map", "FbxPropertyEntry", "TEX_color_map", "FbxSemanticEntry" + Entry: "Maya|TEX_normal_map", "FbxPropertyEntry", "TEX_normal_map", "FbxSemanticEntry" + } + AnimationStack: 1403051316080, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1403030732400, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1402746762272,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1403030732400,1403051316080 + + ;Texture::file1, Material::StingrayPBS1 + C: "OP",1402975325200,1403328393152, "Maya|TEX_global_diffuse_cube" + + ;Texture::file2, Material::StingrayPBS1 + C: "OP",1402975340080,1403328393152, "Maya|TEX_global_specular_cube" + + ;Texture::file3, Material::StingrayPBS1 + C: "OP",1402975330000,1403328393152, "Maya|TEX_brdf_lut" + + ;Texture::file5, Material::StingrayPBS1 + C: "OP",1402975328080,1403328393152, "Maya|TEX_normal_map" + + ;Texture::file4, Material::StingrayPBS1 + C: "OP",1402975332880,1403328393152, "Maya|TEX_color_map" + + ;Texture::file6, Material::StingrayPBS1 + C: "OP",1402975332400,1403328393152, "Maya|TEX_metallic_map" + + ;Texture::file7, Material::StingrayPBS1 + C: "OP",1402975335280,1403328393152, "Maya|TEX_roughness_map" + + ;Texture::file8, Material::StingrayPBS1 + C: "OP",1402975338160,1403328393152, "Maya|TEX_emissive_map" + + ;Texture::file9, Material::StingrayPBS1 + C: "OP",1402975327600,1403328393152, "Maya|TEX_ao_map" + + ;Material::StingrayPBS1, Implementation::StingrayPBS1_Implementation + C: "OO",1403328393152,1402902030448 + + ;BindingTable::root 6, Implementation::StingrayPBS1_Implementation + C: "OO",1403009526144,1402902030448 + + ;Video::file8, Texture::file8 + C: "OO",1402975333360,1402975338160 + + ;Video::file6, Texture::file6 + C: "OO",1402975339120,1402975332400 + + ;Video::file9, Texture::file9 + C: "OO",1402975339600,1402975327600 + + ;Video::file2, Texture::file2 + C: "OO",1402975338640,1402975340080 + + ;Video::file1, Texture::file1 + C: "OO",1402975327120,1402975325200 + + ;Video::file7, Texture::file7 + C: "OO",1402975328560,1402975335280 + + ;Video::file3, Texture::file3 + C: "OO",1402975329040,1402975330000 + + ;Video::file4, Texture::file4 + C: "OO",1402975329520,1402975332880 + + ;Video::file5, Texture::file5 + C: "OO",1402975330480,1402975328080 + + ;Geometry::, Model::pCube1 + C: "OO",1402996452416,1402746762272 + + ;Material::StingrayPBS1, Model::pCube1 + C: "OO",1403328393152,1402746762272 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_shaderfx_pbs_material_7700_binary.fbx b/modules/ufbx/data/maya_shaderfx_pbs_material_7700_binary.fbx new file mode 100644 index 0000000..aad2b18 Binary files /dev/null and b/modules/ufbx/data/maya_shaderfx_pbs_material_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_shared_textures_6100_ascii.fbx b/modules/ufbx/data/maya_shared_textures_6100_ascii.fbx new file mode 100644 index 0000000..b19a94b --- /dev/null +++ b/modules/ufbx/data/maya_shared_textures_6100_ascii.fbx @@ -0,0 +1,1225 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 2 + Hour: 0 + Minute: 0 + Second: 11 + Millisecond: 854 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 20 + ObjectType: "Model" { + Count: 2 + } + ObjectType: "Material" { + Count: 2 + } + ObjectType: "Texture" { + Count: 7 + } + ObjectType: "Video" { + Count: 7 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::A", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementDiffuseFactorUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementEmissiveUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementAmbientUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementBumpUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementTransparentUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: 0,0,1,1,1,0 + } + LayerElementTexture: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 0,0,1,1,1,0 + } + LayerElementDiffuseFactorTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: -1,-1,2,2,2,-1 + } + LayerElementEmissive_Textures: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: -1,-1,3,3,3,-1 + } + LayerElementAmbientTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: -1,-1,4,4,4,-1 + } + LayerElementBumpTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: -1,-1,5,5,5,-1 + } + LayerElementTransparentTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: -1,-1,6,6,6,-1 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementDiffuseFactorTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementDiffuseFactorUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEmissive_Textures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEmissiveUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementAmbientTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementAmbientUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBumpTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBumpUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTransparentTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTransparentUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::A_ncl1_1" + } + Model: "Model::B", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",2,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementDiffuseFactorUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementEmissiveUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementAmbientUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementBumpUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementTransparentUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + LayerElementTexture: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementDiffuseFactorTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 1 + } + LayerElementEmissive_Textures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 2 + } + LayerElementAmbientTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 3 + } + LayerElementBumpTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 4 + } + LayerElementTransparentTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 5 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementDiffuseFactorTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementDiffuseFactorUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEmissive_Textures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEmissiveUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementAmbientTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementAmbientUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBumpTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBumpUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTransparentTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTransparentUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::B_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_shared_textures_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_shared_textures_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "01/08/2021 21:00:11.853" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_shared_textures_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "01/08/2021 21:00:11.853" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\shared_material.mb" + } + } + Material: "Material::Shared", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0.5,0.5,0.5 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0.5,0.5,0.5 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",1,1,1 + Property: "DiffuseFactor", "Number", "A",0.5 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0.5,0.5,0.5 + Property: "Ambient", "Vector3D", "",0.5,0.5,0.5 + Property: "Diffuse", "Vector3D", "",0.5,0.5,0.5 + Property: "Opacity", "double", "",1 + } + } + Material: "Material::Special", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",1,1,1 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "SpecularColor", "Color", "A",0.5,0.5,0.5 + Property: "SpecularFactor", "Number", "A",1 + Property: "ShininessExponent", "Number", "A",20 + Property: "ReflectionColor", "Color", "A",0,0,0 + Property: "ReflectionFactor", "Number", "A",0.5 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.800000011920929,0.800000011920929,0.800000011920929 + Property: "Specular", "Vector3D", "",0.5,0.5,0.5 + Property: "Shininess", "double", "",20 + Property: "Opacity", "double", "",1 + Property: "Reflectivity", "double", "",0 + } + } + Video: "Video::file1", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + Property: "RelPath", "KString", "", "textures\checkerboard_ambient.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + } + Video: "Video::file5", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + Property: "RelPath", "KString", "", "textures\checkerboard_diffuse.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + } + Video: "Video::file4", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + Property: "RelPath", "KString", "", "textures\checkerboard_emissive.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + } + Video: "Video::file2", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + Property: "RelPath", "KString", "", "textures\checkerboard_ambient.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + } + Video: "Video::file6", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_bump.png" + Property: "RelPath", "KString", "", "textures\checkerboard_bump.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_bump.png" + RelativeFilename: "textures\checkerboard_bump.png" + } + Video: "Video::file3", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + Property: "RelPath", "KString", "", "textures\checkerboard_transparency.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + } + Video: "Video::file10", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + Property: "RelPath", "KString", "", "textures\tiny_clouds.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + } + Texture: "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file5" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file5" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file6", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file6" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file6" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_bump.png" + RelativeFilename: "textures\checkerboard_bump.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file10", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file10" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file10" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::A", "Model::Scene" + Connect: "OO", "Model::B", "Model::Scene" + Connect: "OO", "Video::file10", "Texture::file10" + Connect: "OO", "Video::file1", "Texture::file1" + Connect: "OO", "Video::file5", "Texture::file5" + Connect: "OO", "Video::file4", "Texture::file4" + Connect: "OO", "Video::file2", "Texture::file2" + Connect: "OO", "Video::file6", "Texture::file6" + Connect: "OO", "Video::file3", "Texture::file3" + Connect: "OO", "Material::Special", "Model::A" + Connect: "OO", "Material::Shared", "Model::A" + Connect: "OO", "Texture::file10", "Model::A" + Connect: "OO", "Texture::file1", "Model::A" + Connect: "OO", "Texture::file5", "Model::A" + Connect: "OO", "Texture::file4", "Model::A" + Connect: "OO", "Texture::file2", "Model::A" + Connect: "OO", "Texture::file6", "Model::A" + Connect: "OO", "Texture::file3", "Model::A" + Connect: "OO", "Material::Shared", "Model::B" + Connect: "OO", "Texture::file1", "Model::B" + Connect: "OO", "Texture::file5", "Model::B" + Connect: "OO", "Texture::file4", "Model::B" + Connect: "OO", "Texture::file2", "Model::B" + Connect: "OO", "Texture::file6", "Model::B" + Connect: "OO", "Texture::file3", "Model::B" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_shared_textures_6100_binary.fbx b/modules/ufbx/data/maya_shared_textures_6100_binary.fbx new file mode 100644 index 0000000..aba76cb Binary files /dev/null and b/modules/ufbx/data/maya_shared_textures_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_shared_textures_7500_ascii.fbx b/modules/ufbx/data/maya_shared_textures_7500_ascii.fbx new file mode 100644 index 0000000..695d097 --- /dev/null +++ b/modules/ufbx/data/maya_shared_textures_7500_ascii.fbx @@ -0,0 +1,784 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 2 + Hour: 0 + Minute: 48 + Second: 37 + Millisecond: 962 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_shared_textures_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_shared_textures_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "01/08/2021 21:48:37.961" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_shared_textures_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "01/08/2021 21:48:37.961" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\shared_material.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2180381056096, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 23 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 2 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 2 + PropertyTemplate: "FbxSurfacePhong" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Phong" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + P: "SpecularColor", "Color", "", "A",0.2,0.2,0.2 + P: "SpecularFactor", "Number", "", "A",1 + P: "ShininessExponent", "Number", "", "A",20 + P: "ReflectionColor", "Color", "", "A",0,0,0 + P: "ReflectionFactor", "Number", "", "A",1 + } + } + } + ObjectType: "Texture" { + Count: 7 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 2 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Video" { + Count: 7 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2179903084528, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: *6 { + a: 0,0,1,1,1,0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2179903102832, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2179263665088, "Model::A", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2179184257856, "Model::B", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2180485950848, "Material::Special", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "SpecularColor", "Color", "", "A",0.5,0.5,0.5 + P: "ReflectionFactor", "Number", "", "A",0.5 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Specular", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Shininess", "double", "Number", "",20 + P: "Opacity", "double", "Number", "",1 + P: "Reflectivity", "double", "Number", "",0 + } + } + Material: 2180233238320, "Material::Shared", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "EmissiveColor", "Color", "", "A",0.5,0.5,0.5 + P: "AmbientColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.5 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Ambient", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Diffuse", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Opacity", "double", "Number", "",1 + } + } + Video: 2180485953248, "Video::file10", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\tiny_clouds.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBECQGBjzr1gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAJLUlEQVRIxwXByY4l2UEA0Lhz3JinN2VmDbhtGiOQLBkhFmwQG3rDhg0Sn4AEe77MHwI2pru6y11Z7+UbY44bd+Yc8Lvf/McxDjQ93EXnv32p0U3PO+t7MFEVPx2HO3bX37dRFLofDju4segPwwvYP74narG/kFdRfuDmAuff+/gl/OW3UPHtX3xgn1j1Qp4Xvg1X/AhDv/Xy3qMi5w8QFAmaHzDbjybv1NJvJRkTS9YelE/L/eSFCyAYev+S8ZO4kNKzK8hV7qBt0sBR8BQmbMi/wa5Lu8Jjl+P0nYs9v7HoUfAXaidbB2zGS2CCQAm9QeH86LLcfa08xd1aL88NM8X+w1lcN07iY77O1W0J9gCDyT6NhPIzjiaCGFrp04ZOAqf4aTRpXT90ClyrWREs6N1slchocU2uRzMmgGFbqeO460tr7fuUqPPa+OSTJ8w1d+E2cetWnPMQqBRIk6IVIPMckrLt0Qv8UbIf/XKOd2cDdb77Gck+t8CbafwqwyH4sNoIv4bJUJ6si78ax/lpSTosF3F46Lu/5PWfasAtZ4U8cndPiU/14ylaM3Cddz+gAAd314fci1Xts/+lTWUzFfRxorbCX/Rk6TAmxbidTcnYbHDkZ4dAZNkmEGdI/vz+5VL7pSe5lW5hYXbibIwYheYg0E88CG2A/uHjP6Om6Ch3JPT28z5lSmE4RvcFyxJ/jpaz9lnW9dCO6As28IEsFPTVg2633Cb6sGP4DicWtNsYe1cfzOAdWTBad4JOliv0T3/99xKEeJCGoWiElN2SQLYuwHsw6u7WMF3MGk3D5gYSFrFZFPFIpvHgAXw46nVJgg7CNCpqPgEaz4jxpq2JwunwKx7uOfq38h8lmyI2uNIp58Ha/0neZ8mFu4VJIIdl3HYwWIDR0TGycF3OTNdUiIeZ7sQreA4tTOXKeLhe6b54TyeaHYiwbsvXV7El6Lu/+e2sjFsnSlyHXwfs03WxrZ7SN5GaNTwxGQyT7VAYMrP+TEEJAB1yzSasUUsKmDZrbxo7hj4vo2GON+jxWNOEenoQKjXou/JvYzbuyGY62SAgOrpf3kSUhN7MX2k86VIA9eCKoLOcILawu09DpJ3wmcIEejxZkzTbQqfQrzHZU69WrcGm80JFrlw36D+Tv8uNsc4jqwmfeql8GwvT3lWFGEo66LjQU3928DTPcoCTiLIJVyhQifaQhiKwqgsZoEEbFAYuJt6UY6URrKRIYeLwpVYJfBBBisJ/xnRjgkHJeonal9YH+c1cA3iJYbRtI92RIHw7wHQCkfYzRxYusouzPEIyFWOVNXxP67RzhDpngnCbV1pQ9O+HX+OMkZdr6wNxm1QPExj4xCqug7VFrlOr7F4naFJSOQudVlFM+iK5w1pou5UbftOjJFr5Q77ZXi7AqapoQxSVCBRxjrD7lnOD5qjsL+0zi2++/3JUqsn24DaroWcyamIAg4tr5cPTmIf0a2p1VMzjI8DJZ27z7K+yG8Vpev0f8D4mTjnSr/Ov8WmgaAEJDuvtNOtbd0wavfzxHKq8wV48/D2KVj90UrNpDJ3d2sVvikDKeuxJoz3EUYr9NluT4IyYr933S4Oj07xHRRvRsL7PKi/8YCOIP3Ny2TynFAC/f8aMi11IXN5W3PD8+T17xiOFMPEi1EcvSOg3eM2MnY1z5SNcR5F9TINksc2m+0sin/qM4hg4swub2+3m/Yo3YmEMn5Zd5YNJw30WfuWAH+X4hD6i8FT0syPLlU6sYjT13shkXHScvl+WKlQ6apgIby6vNm7CBd2axTG8cFkQgLIgp48B/ddvvlMauLvxSVapYBBo6XXaHsuxmQdNQTZDDV6ytC4Vjx/QLSAwbMMjsiSySsFgXVrn2doUdhcU5L0L3VA1rFK6yYPAnhrMv9QbuIDEohv0t0hcl04/CGQkXJwyf0BJqr4dgEURw8I2m2ziyoXYutKr9M2JuqqaKEFrZBitxw83kG7YupWhDr0+1jkWWNDLo27s8urhKDbSGs3utqrOf3Sjqg6prNqi3Tya12hnyMVEcKuLmzOyCCwgm34vJV9+uL1wZOd8Lh4HjVUnfl4qQzXG16aV+NM7yu01Tlh4eqzjK4w98p3F+ADi8xaoTlU6nDsbOMzqGoe9vARP/dOY9EWUBImtOiLGd9M8Y5TjS4zJq4o5fzsKUyGGFmLw3p1V77ZTP/l2AwK4ssbGk+/FB70yOu+BaafXj78wtGtfsLYvOLh7yzNZErbgL+1WZi4fxreXMr+tb+k1+AjKEautAFEw3ZlNMTXdzgzCXhGLRxI3w0nszGJy59TQXro1voZND+Diy8U90dnFGKxoLV4JKr2VjWO0alkc4ZP8xjxGRKb4th3DMMYLnn2wbeHAsIgBjAr7rl+Y/e8nfcM7w/cL/7PCwJYQWl9AJ0rnsiWMh1BL8vEc4vNElNtdzXx3wVQWAfzmJxe0ZttvSNsd5hV5WRaV/Vyif/1tLaLFstmHUYfhbVla3TAC1oFd4gTu+7eMVrRRt5qEm6jmv7rIcB28jOKJsYzrBMGb2I8aRLMFh4jOOU3LmXOIYBdGLoYpoj5b7gf3Zr7C8G6AmcpTZ+nP76/2cIwW0NCIIi2N3Jo7G/oBai+SPXjYHjiXvIgM4Rr5IBY8qEhFawxYYebirQbQybPFYWVEZ0B3mUs939a0yCmq7khYOlnP+7KnSzjJH1ktHabgWEUG8egWJTlutepbBw989b7Yt9H+/ep9zw4IqGQt7sp+IkkRo3/Zx8QQh2fQJY8omy/8e7coEI5sLzmM2FOr8YoiPEQYpff5eceBQXGsjh8GlHeoFptDLKB39svUnHDGLF+qjbD6MWZbNs8B1kjdgdeeaNw9vqRHbACPO+v4pK3NZBJGQsfz/iHQpVX0MFoLXgK/actYrgUTsu1ky7Mm3Az8TcjIbjMdCrtiVERfsy1ZMdh105cAVvb+hg05j9WLwmR+A9aYPF+iDj7MTspJm0MTFhJA0a8JeEwT23UVWaMVwvdP2L+p1z5rTn39brF9jhhbcxZHOP+pxGxecBp+6joRxo6GBMv+cvEw3+uPaiWCl8Fayvxh6SR5waexWEchgl8ODK3IIs64HX4AJa1eZKBEFf9fM8BAu3T7BA63Glr9/8wzw4JWXTB6AAAAAElFTkSuQmCC" + } + Video: 2180485965728, "Video::file1", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_ambient.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC8i2cvWzAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAGZElEQVR42u2ce0xTVxzHv4VWYxUaHmEhIPwhGAoxE4QIF2MVhCoSB5mAGh8YyBaWZSyDmJi4v5xZYtRkziUmyxYfEBkOqJCBj4GCUMyojjCeazZfhEAAQWtsoA/3hxbtgMtTwPL9JIT23nPuOb18zu/87r3lSHJyIl9iBmi1nTOpDkHwBdufv/adQBY1FIACEApAKAChAIQCEApAKAChAIQCEApAKAChAIQCEEdFEhXlO6PvA/B5/vvdPiMApwBCAQgFIBSAUABCAQgFIBSAUABCAQgFIBSAUABCAYhDIuXzdK4PQDgFEApAKAChAIQCEApAKAChAIQCEApAKAChAIQCEApAHA6uD8D1AQinAEIBCAUgFIBQAEIByOJB+q4OvGNHNjZu3AUAqKkpQGnpdyLXwo8BAEbjCyQlrYfBMDiqjEy2BBrNH3Bz83h9/bvSbv+JE/V2761WKywWM4xGA7q6/kZdXRHa2upE67y5tl45qm8TkZsbNeZx8/K+RmPj76PK28rY2ppsO2P1ccFFAInEGaGh8bBYzLBYzAgNjYdE4jxhvWXL5EhO3jvmPrU6eeSPP6kP5uQEmWwJXF09EBQUhYyME4iO3jmno2toyIjY2AOLLwIolQJcXNzR1lYPiQQICoqCUimgtfW2aD29vhU7d6YjP/8sLBaz3b7U1Azo9a0IDAye9Eh0cpLCy8sPmzfvx7p1aqhUe1BX96tdWa22c2T0iY2q8faJ3Ym7c+cKVKpdCA7egNbW2imP6Mn0a0FGgIiI7QCAu3fLodOV220To7DwJ3h6foD4+CS77aGhUQgIUKKg4Mcp9cNqNaO7+1+UlJwEAKxY4Tano+vWrTyYTEPYsiV98SSBcrkCSqUAo/E5mptr0NxcA6PxOZRKAXK5QrTutWslePKkF7t3f2K3PS0tA319Pbh+XTOtPi1f/qrdR49a5/TkGgz9aGgoh59fCAIDIxaHAGFhakilMjQ1VcFsHobZPIympipIpTKEhalF65rNJhQXX0RAgBLh4RsAAN7eKxEdvQVFRedHTQsT5wFS+PmFICXlMF68eAaN5uScn+CbNy/AbDYhNnZhRoFZzwFsoV6nqxjZ1tDwG9av34GIiO2orS0UrV9cfAH79n2GPXs+hU5Xi5SUgzCZhlFScnFS7Y+X2Ws0p9DT82Dan2uiLP3t3ONtBga60dh4A+HhCfD3X4OHD/9y3Ajg7R0AH5/V6O/vwv37jSPbHzxoQl9fJ3x8VsPbO0D0GIOD/bhx4woiIzchOHgtEhPTcPVqEZ49G5xR35KSvkJW1g9YulQ+5ye5svICrFbrgswFZnV9gOzsDABAaenlUc+5NZpfkJmZA19fFYqKbo2ZRdtet7eXITExDadOnYNcvgIdHWWjsm3b+/+3Y58xS+DiosCaNWHIyjqMVavWIiQkFWfOfCPa/lRGuNjz/Df7OhERUYGYmO3o7VVAr2+ZVJuTKbNg1gdwdnZGXNyr7P3gwWxotY/tfjIzcwAAcXFJcHYWvyfQ3f0P9PoGuLp6oKPjDnp7H02zVy9hMAxCq63CkSNZAIBNm7bNy0g7f/57AEB6+heOOQUIQizc3T0nLOfu7glBiJ2wXHV1wevfl2alf52dr+Z/Dw+veTnRen0LtNoqqFRb4e8f4HhJYEJCCgDg+PHD0GjyxpmH9+LQoW+RkJCC27evix6vvV07btid3s2pDwEAPT1d83ayz507DUGIwf79nztWBFAo3CAIMRgeHkJlZZlIMlSG4eEhCEIMFIp3f1NGKpXBy8sb27Z9jGPHzgIAyssvz9vJbm6+i3v36hEX95FjRQC1Ohky2RJUV1+FwfBU5MbIU9TX34RKtRVqdTIKC3+e9Q8kdrmm1VYhP//suGVtl5BjRZ7xLi/HTj7Fo8Dp05ccKwIkJKQCACoqiiYsaytjq/MuMZlMGBjoh05Xi6NHv0Ru7oEp30yabXS6WrS0/LlgBJDk5ES+nNmI49e63+f2+YWQRQ4FoACEAhAKQCgAoQCEApBFBdcH4PoAhFMAoQCEAhAKQCgAoQCEAhAKQCgAoQCEAhAKQCgAoQDE8ZDyeTr/MYRwCiAUgFAAQgEIBSAUgFAAQgEIBSAUgFAAQgEIBSAUgDgcXB+A6wMQTgGEAhAKQCgAoQCEAhAKQCgAoQCEAhAKQCgAoQCEAhDH4z/mnUJ9Yd62LwAAAABJRU5ErkJggg==" + } + Video: 2180485967168, "Video::file5", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_diffuse.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBECwZQ+1sKwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAFq0lEQVR42u3cW0xTdwDH8S/QymUqYuqi4gVsnBQZc0sFF0QGAx0PCwEdYMLTeNCYzAcTjEucD/K2B2Nc9rTERHFeF3SZCQs4TZlOxyAypyAggojKbUMuStFS9yAlIrTimArl93mCHtrTNt9z/ud/Wo7PzvT0J4yDrbp6PHcnwWJB639z6/dFpjQFoABEAYgCEAUgCkAUgCgAUQCiAEQBiAIQBSAKQLyVT3xExLi+D6DP8yf3+rUH0BAgCkAUgCgAUQCiAEQBiAIQBSAKQBSAKABRAKIAxCsZ9Hm6rg8gGgJEAYgCEAUgCkAUgCgAUQCiAEQBiAIQBSAKQBSAeB1dH0DXBxANAaIARAGIAhAFIApApg7Dq3jQ/MLCoZ+dTieP+/uxP3hAW3MzNyoruXz2LH29vSPuV+pmTrzmmblu6RjnzV9lZIx4Lp641uF6/DUe5tee/sYSG8sHSUnMN5sJmjkTp8NBX28vHXfv0lxXR21FBU3Xr4/pdXt6HyZ0AMN2Mb6++AcG4h8YSLDJxNIVK0jMzKRw3z6qy8q8Z0syGsnKyyPCan1ugYFpAQEEm0yYo6NJWL9+KE6v3QM8vxX6+vkxIySEhcuWEZuaSlhkJFl5eZzYs2fYmbCX2Qpdy8Z6Jszdmz7eM3EuyTk5RFit/NPSwtljx6i/coUHXV34GQxMDw7GFBrKYouFqLi417qFv/E9AIBzYICujg66Ojq4euECiZmZJGVn8+mmTXx/8iRdnZ2Tfg/wXnw8AAfz8/n73r2h2x2PHnG/vZ377e3cqKzklyNHdBB47vhxaioqeGvmTD5JS/OKIWBaYCAA9r4+zQLGoqyo6OluLyXFKwJorq0FIG3zZqbPmjW1ZwFjcae+HoC5oaH/6f6ejpxHG+89zQb+j7H35wMH+Hz3biwxMSyzWmm9dYuWxkZam5pou32b5traUWc+LzMbmJSzAHdcb0bwJNpaPLl38ybfbtvGRxs2YFm1innh4cwLDx9aPuBw0FhVxZnDh4f2FhNiD/AqP8/2tGzW7NlPQ+jpcXsk7+m5ubZy2zjn0AkWy6jrGcv7kmCxDF9/dTU/2mzg48OisDAWm82Emc0stVh4PyYGc3Q0YcuX8+WWLVwqLR2xnhdND0d7TuOdxbyxPcA7kZEAw46YJ4JHdjvTAgLwMxgYcDhGLPczGgHot9vdP8iTJzQ1NNDU0MCvZ84MTYW/2LGD9Tk55G7dOhTAlD0ITMvOBuDaxYsTKoDeri4ATG6OTeYM3t77klNX58AA3+3dC8CiZ4aGKRnAxtxc4j/+mI62Nv602SZUAHfq6gBYuXbtqMutg7c3D/6dyzcFBSwMC/P42K4D3vbW1qk1CzAYjcw2mYiIiiItK4uVcXE4HA6+3rUL/wk2b/6juJh3V69m5bp1POzpobykhJ7OTmaEhGBNSRkKo7ykZPiJIKuVg6dP89u5c9iKi/nr8mU6WlvxMxoxzZnDhwkJbMzNBeCHgoKpEYC7aU1Pdzf527dzyWYbdmDz/FTN9fvrPHfecPUqpYWFrMnIIDEzk8TMzJGvq7CQxmvXht3W1tLC23PnEp+cTHxy8ujDgNPJkf37OeXmbOCLPrh6Fe/Da9kD2O12eru7aWpooOz8eX46cYKewbF2Iio5dIjbNTXEpKYyf8kS/IOC6H/4kLv19fxeVERNefmI+3yWlERsfDxxSUlEREUxb8ECAoOCcDx+THtrK1fKyzl19Ci1VVUT6rX67ExPH9fXwvW1bl0mTiYxBaAARAGIAhAFIApAFIBMKbo+gK4PIBoCRAGIAhAFIApAFIAoAFEAogBEAYgCEAUgCkAUgHgfgz5P1z+GiIYAUQCiAEQBiAIQBSAKQBSAKABRAKIARAGIAhAFIF5H1wfQ9QFEQ4AoAFEAogBEAYgCEAUgCkAUgCgAUQCiAEQBiAIQ7/Mvxl4LkLfMIrUAAAAASUVORK5CYII=" + } + Video: 2180485968608, "Video::file4", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_emissive.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC40NARS3AAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAIYUlEQVR42u2ce1CU1xmHH+KCLhoVFZRRiCIYwFvwEpFFiIgg3qOIsU6ixKixGafJ1MSZdJrpTGPbNFanUzM2atSMMY234JUqXrBGWFHEK2AAMaJGROTiXdjF/kFBEVBhbS3we/6B2f3e71z22fec833fHrvQeab72EB2Yo4t4XgEuKPyn1/5LyCaNBJAAggJICSAkABCAggJICSAkABCAggJICSAkABCAojGip1HgJtNzwPofn7DLl8ZQEOAkABCAggJICSAkABCAggJICSAkABCAggJICSAkACiUWLQ/XTtDyA0BAgJICSAkABCAggJICSAkABCAggJICSAkABCAggJIBod2h9A+wMIDQFCAggJICSAkABCAoimg8GW4LMJT7eGHf5hYOX/uz8/CMCde3eYumBCjcc72DtwMCaJ9k7tAehucn9imQ+XAWDqFUT4gJH0cPOmjWMbLGVWbty+zsWrFzhzIY2k9ERSfzpV7TxhwSOIHDmJ3t59cGrTDovVQtH1Is5dyOZE6nHizfs4evJItfbUVJ+l76/Cs7MXv/v6YxJOH3hsH4UFj2DpH5aRlpHKmOiIevfv/1QAWzA2NzJ68HhO7E2t9t64sPGVH35dcTA48Ns3f4+/r+mRhtrTwqEFzm1d8PPqz5SQN6t0XHOH5iz5dCkhptAqcfb29hhbGHF1cSWgv4k5b71XRcjHEZcci2fnXxHWP+KJAkyMmATAptgNDScD2GLg2Z8zGWeayGfNPsNitVR5b3rUDNIz0/Dx8q0WV9H5Fd+OR8t+O2I2/r4mfr52iTVxK0nJTKboZhH2BgNtWznh5vwSvbr1JrjvsCpx82bPJ8QUSs6l8/z1q8UkJh/kWtE17A32tHfqQPeXutO/z0BGDRtTY9srMsHD9dmbEsfMUb9koLc/Lxpbc+PO9Rr7wqmNE0H+wZSUlrAlLqbWNtdEg70SGPPDBtq37sDYsPFVXh/k54+3pw8r162o13lD/IYD8PGKeexJ2UXBjWuU3bdyr/QeVwpzSc5IYvWuFUT/eUqVuIp6RP/6LTbv+p68a3lYrVbu3rvLpdyLHEj6F4uXLyT0jeCnrsv128UcPmPG3mBPiF9orceNGT4OB3sH9pvjKSwubBqTwL0pcRTcKGDGGzOrvB49+R3y8q+wNW5zvc7r2NwRgNt3b9UprpVjSwBu3rr5TNu560hseWboH1HrMRNGRJan/x3rm84qwFJmYbs5Bm9PHwIGlKfNLq5uhAQMY82mr6sNC09Lek4aAO9HfkS7F59+HnEs9RgACz76E87tXZ5ZO5PSzRTeKOBldx/cXF6q9r5nVy96+/QhvyCfePO+hrUKeNJM+ElzhK2JMUQFT+WdKbNITD7ItMhoSkpL+HbzN/Wuy5fbl7Bw9t8I6BmIv08A2ZfPkn05i59yszl/5Rzp59NqHIv/uORT1i5ZR+iQ4YSYhnEmK530rHQyz/1I5rkMjqceo+h6UZ3rU3bfSvyxPUwIiiKsfwRf/fPvVb/9ERMB2LZ7C1artV6rrQa5CgAovlXE9j1biRwVRV/fV4gcHcXmnd/Xq6MryLqUwbuLp/OLYdMI7B2EZ2cvPDt7Pcg8Vgsns4+zeudy0nMerEBSM04zetoI3ps2l/DgEfj26Ilvj54P4iwWDh8/xKJlCzmWmlK3YSB5BxOCogjxG15NgLFhrwOwMXb9c/kMbN4f4Emz1NqouA8e12kHkaOiWPGXVbRybEXcj9urzWwfV8ea7qdnk0PijiTssKObuweeXT3x7OqFb4+e+PcLoJ/XAPp6+DFr/tsQUDV2+YElLD+wBDdnd9xduuLesSuenb3o270fAQMCGeQ3mE9Wz+fwmUM1ll9bfdJGp+Lboyed7rmReDQBgIABgbi6uJJ1KZMSl1t4uLjX+Rtu6/MEzzUDAJzLPUtKZjL9vAaQlG7mYv6FZ3bu+9wnO+cs2TlniTuwC4BmzZrxm7mfMG1SNB/MnMcHK+bUGHvhag4XruaQkFq+fn/Brhlzxs5lfGAk08NnVgrwtGyK3YBvj568HjGxUoCK9B+XHPvc+v//4lLwpgPr/vP3u/96WVarlUXLPi/PLO7d6zSWr9q5rHyy6lz3jLclLoaS0hLCgyMwtjBibGEkPDiCUkspe1PimrYAh8+YGf5hIMeyjtp8ru++2Eg3N4/HHtPZtQsAuXmXK19bNOcLunRwe2xcRydXAPKL8+pcr8LiQvab42np2JIRr40kYugoHI2OHD5j5vrt4ufW9wYaGQNfeZVda/eyN2EPO/fHknLqKFeu5mIwGHDp0JGhg0OYNfVdAFZvWFkZ19ujLyvmfcOh9AR+OLmf1POnyC/Ox9DMQPvWHXjV25/JQ6eWX8Q6uLF+mW7HesKCwstTv51dlesEDVqAJy1T6jNJfNolZ0XZFWVczruMq4srYUHhhAWF15zOy8pY/u2XrI1ZUznBvFqUh3NbF0y9gjD1Cqo1bsP+f7DNHFNr2x+tz8PEm/eRX5DPIL/B2NnZkV+QT1K62eZlti392+gywJAJ/gT7v0ZoYBi9ffrg5uqGo7ElpZZScvMuc+TEYdbGrCE143SVuKkLJjLQexCDfYfwsps3ndq5YnQwUmq1kF+cx6lzJ9lmjiHrUoZN849tu7cQPXlG5dq/7L71ufaXXeg8k02Pheuxbm0TJxowEkACCAkgJICQAEICCAkgmhTaH0D7AwgNAUICCAkgJICQAEICCAkgJICQAEICCAkgJICQAEICiMaHQffT9cMQoSFASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJASADR6ND+ANofQGgIEBJASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJAND7+DXtbEsjx2g+IAAAAAElFTkSuQmCC" + } + Video: 2180485966208, "Video::file2", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_ambient.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + Content: + } + Video: 2180485967648, "Video::file6", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_bump.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_bump.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_bump.png" + RelativeFilename: "textures\checkerboard_bump.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEDE0+V5cQgAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAE1UlEQVR42u3cz0uTfwDA8XeyySyjwiAPpYfGoDoUdAgiIggnDUqSFZIH/4EguhTqXTp0yGP3IihrZqewLv2iS60gSmuNDh0qdMmkHG3V9/Bl8l1q+WvfdL5fN7fn+Xyme/t89mz6rOrs7PzJAjx48GAhu7Nv3z6c/+/NX4VWNAMwABmADEAGIAOQAcgAZAAyABmADEAGIANQpQr4efrKnt8jgEuADEAGIAOQAcgAZAAyABmADEAGIAOQAcgAVJECfp7u9QHkEiADkAHIAGQAMgAZgAxABiADkAHIAGQAMgBVHK8P4PUB5BIgA5AByABkADIAraD3AZbig7p3717J1z9+/KBQKDA+Pk4qlSKRSPDo0aMp+/X09ADQ1dU149gzbVOcc2Jigng8zvj4+JR9g8EgfX19bNiwAYD9+/dPO3bRt2/f+Pz5M8+fP+fx48fkcjmPAPN6kFVVVFdXU1dXx549ezh37hytra1lmaumpoaWlpZp72tqapp88mejurqaTZs2EY1GOXnyJLW1tR4B5uK/v2GBQICGhgZOnDhBNBqlra2NGzduLPqcqVSK1tZWrly5wvfv30vui8fjpFIpwuHwb8coHl2CwSCNjY3EYjHq6+tpbm7m+vXrHgHmo1AokE6nuXDhAgDr168vyzzXrl1j48aNNDU1ldy+a9cuwuEwV69enfVY+XyeVCo1+aRHIhGXgIVat24dAK9evSrL+IODg2QyGY4fP15y+7FjxxgZGWFwcHDOY3769AmAUChkAPNeqwIBtm/fzpkzZ8hms/T29pbtSNPf3084HGb37t0A1NfXs3fvXhKJxJRlYTYaGxsBGBsb8zXAQs4Ginp7e3n37l3Z5u3v76e9vZ22tjaePHlCPB4nn89z8+bNOY0TCoWIRCIcOnQIgGQyaQCL4dSpUxw4cICzZ8+WZfyxsTHu3r1LLBZj27ZtxGIxbt++TTabndX+v54OAqTT6RmD/qsBLOXPs389V6+pqaGhoYHm5mZ27txJd3c33d3d83pMxW1+nb/49Zs3bwA4f/48q1ev5u3bt9Nu+7u5vn79yvv377lz5w59fX0UCoU5ff//x89/WR0BJiYmGB4eJpPJcPr0aXbs2FFyfy6XIxQKEQwGyefz076RUxznTz5+/Dh5yjc0NMTIyMi8Tl+X/Hssy3EJGB0dBWDt2rUlt2cyGQC2bNny2xdjxe3+5OHDh4vyW2YAi2zz5s3TvqounhrO9E7ekSNHAHj58uWs5hkeHqarq4t0Ol2xASybJaCqqora2lq2bt1KNBoF4OnTpyXbDAwMcPDgQVpaWshmswwMDDA6OkpdXR2HDx+eDODWrVtoGQQw3avpoqGhIe7fv19yWzKZ5PLly7S3t9PR0UFHR8eU/S5dusSzZ8985pfbEaBQKJDL5fjw4QPJZHLGc+qLFy/y4sULjh49SiQSYc2aNXz58oXXr1+TSCQm13X9a1VnZ+fPpXoa6Pzln98/CFnhDMAAZAAyABmADEAGoBXF6wN4fQC5BMgAZAAyABmADEAGIAOQAcgAZAAyABmADECVJ+Dn6f5jiFwCZAAyABmADEAGIAOQAcgAZAAyABmADEAGoIrj9QG8PoBcAmQAMgAZgAxABiADkAHIAGQAMgAZgAxABqDK8w8cncv884RrHwAAAABJRU5ErkJggg==" + } + Video: 2180485951808, "Video::file3", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_transparency.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC4O8giLbgAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAM/UlEQVR42u2ceVhV1d6A3yNgoCLhlOAABAiIoAIhg4SAiAM5pQ1fmpGmVFdLb15tutl8K/VmZmXKh2M5XCU0J9AIkUHFicEhVDBQSFQQUaZz4P6BB0XOOYDIdfq9z+Pz6F7r7LX29t1r2Gv9tmLA9FlVNIHMhLim/BwrLx+k/LtXfguEhxoRQAQQRABBBBBEAEEEEEQAQQQQRABBBBBEAEEEEEQAQQQQHlQUFv28mrQfQNbz7+/ypQWQLkAQAQQRQBABBBFAEAEEEUAQAQQRQBABBBFAEAEEEUAQAYQHEn1ZT5fvAwjSBQgigCACCCKAIAIIIoAgAggigCACCA86+v+LQrKS4huV32/GbABi5v+r1nGVSkVpeQV5BQXsO/4Ha2Ni6z3X+29OY+JzzwIQtmYtH3/9jda8N5f30YqfiDmcojWPuo43EzTAl7HDhuLsYI+piQlKpYrCoiIys7M5nJ7Ob/GJJKekPHwC3Cn09PRobaSHtZEZ1uZmDHTpw6i0FHJyc7XmHzEoEKVSCcCIQYF8tnARKpVKZzklZWWMG+inUQBNPNKyJd999gkB/b1rHTcwMMDIyBCzxzrh5ebKaxNexNLD++ETQNNFq1sFTU+SthZBARi3MsLR0oKJQ4OwNjfj/TenMWXW2xp/5+/lSYd27fg9IREUCgZ4euDv5Ul03B6d5f2atI+xvj54OTqQkH6s3vr949UpBPT35s+zZ/n3kjDik5O5WFCIgb4+HUxNsba0wK23M8EBATIGaApVQNG1EhKPHueTVWsA8HDpqzX/mOBhAGzYtp0NW7fVOqaLNb/FUlZRwbiBfg2q14igQQBMePPvRGzfwfkLF6u7q7IycvLyiE3ay7zFS/B75jkR4E5xNv9CtRSVlRrTTU1M8PPypKi4mKjY3UTF7qaouBg/L09MTUx0nvvSlWJ27D+Ag0V3XGyt661Lm1atACi+evX+GwTeD+vZmvL4eXoCcDLvvMY6PO3jRUsDA6IPHMbcrR8AcWlHGebhzsTQUDbEJWg9d2ZCHF+ezmDI+jWMcXdlw/JlWutk5eXDseyz9LW15usvv2D++o1culJ8R6+/Oe//fdUCKBQKOrZvz0vPjGHeB++hVCoJ3x6tMW+QuxsAUckHao5t33+gVpoucvLy2BS9E09XF1yceunM+/2mLVwtKcW7V0/Wf/AOP/59GrOeH8uzA56kn70dbVsZPdzTwOaYRl4sKOCVmbPJUtS9BGuzzth2MSf34iVSTmfVHE/LPMPZCxex7WKOtVlnTuXm6Sz3u+UrGDU4iKkhEwiZMVNrvoyz55g0bwHjBvrzpLMjtl3Mse1iXpOuVKk4ciqT/98WxdEzf4oATeVk1hmCJ4RQWlamsQkcfP0Jjz5wqE5aVPJBQgYHMtjdjUWRv+os59SZP9n+eyxD/f3o2cOWo39kaM2bd6mAues2MHfdBrp17IDFY52w6PwYtl3M6WPzOK49bOhjbcW7YSvYe/xEve9I/lfTxftCAPXNaN3KiMiwpdhYWRLyzFi+X7mqbp+mUBDg0huAFwcF8OIgzVOvAJfefL9pS71lf7tsOUP9/ZgaMoFX336vQfXNzr9Adv4F9qQdranT6yODGe3jzctDBtUSQFqARnD1WgmTZs4iMnwpb4VO5sTp02Te8okrj572mBob13suU2NjPHracyp+t858R//IICYhgSBfX2wsLW6r3pVVVYRtjWK0jzfdOnW4K0/6A9MFZOXk8OY/P2Tp3C9Y8OEcpi5azJm/ztekD7ne/M9fH8HmxL0az/GUZz9mjB3FEHc3Vi/5sd4yF4Yvx8/Li9cmvKgxfcHrU5i7bgPZ16emmujczhSA/MLL8h6gqcQkJjL/x6UYt2nNpxMnYGxUPcpu26oV/RzsKK+oIObwEe2/P3yE8ooK+jnY1ftOAOBgahqJBw4yPHCgxnRnayvC/zGdj0PGM9C1D2btTDHQ08OwZUu6dmjP00968+XklwHYeH36KV1AE1m0fAWOdj0Y6u/HnJdeYOYPYQS69sFAX5+4lDSKS0q1/ra4pJS9x07g49yLkUGDCF+3vkFjgdULF2hMO19YSKdHH6W/kyP9nRw1dwOVlayN2U1kQpIIcKeY8eHH2Nvb42Jrw9RRw3G0sqgZ6ddHVPJBfJx7MSZ4aIMEiN+fzKG0dPr2qvsf/NxH/8Ld3g7vXj2x69YVs/amGLVsSYVKRX7hZVIzs4iMTyLj7Ll7792KfClUvhQqPMSIACKAIAIIIoDwcCLfB5DvAwjSBQgPbxdwJ09269p2SUkp2bnniIyKZuWGjRTp2Cr1+ohgxvj2B+A/sXt0rtVrihe4VlJKTm4usUl7+XH1T1wqLKy3ftq4eadyQ2IF1OfVtrJnY2nB+KdH4+XmilmnTujr65N3Pp/klBT2ZueSfH2fweeTXsKjpz2/7ElkwcZIjeeaMXYUT3n2IzH9GO+ELb+3WwAjI0N6PP44M0OnsGX5Mjq2b6+5EtfX8JUqFUqVigCX3rRQKBpcjp6eHsZtWuNga0Po+BfYumIZXc3M7ui1qGMFGssbE0PYsXolE8aOwdbKijatW2P4yCNYduvKmGFD+Sp0IounTwVg0S+bqVAqCfZ4gq4d6t6rbh07MMTdjbKKChZGbLr3WgA16ifByNCQJ3o7887Uv2FvY82s10J56+NP6+RXr+HvPXYcBQrcHezw6Glf7558vxmzyUyIQ6FQYGJsjKuzE29NmYyDrY3OeIGbn9SGDsIaGysA8Or4cUx/ZRKVlZWs2hjBmsjNZGRmoqenh2W3rgzxG0DIc8/So1sXAHIuXCRiTyLPDPBhylNDeT98Za3zTQ4egr6eHj/v+p3cSwX3/higpLSU3Xv3MfOTzwDw9fDQmE+9hr9j/8GajZtDGrBxU01VVRWFRUXs2hPPGx/MqZZKR7zA7dDYWIEunR9jxuRJAEyf8xHvfTmXtBMnKCsv51pJCUf/yGDe4iW88OlX7Dt2Y4fQ8h07Kbhyhf5OjjhZWdYc72VlQX8nR/IuFbBqZ8z9NQg8mZUFQFvjNnXS1Gv4xSUl7ElLZ09aOsUlJfRzsKPt9f32jRqHZOdUS6ElXuB2aWyswLjRozEwMGBz9E4io6K15iu6do1ZS8Jr/n2trIywbVHVLcjwoTdak6eq//5d5K+UXw91u28EcHN2rm7iNMTwqdfwY4+kUaFUUaFUEXskFQN9fQJd+zS6LG+36pYjtRn23f2063eUSiXjA/3rzevl5grAus1bGl3OlqT9ZOScxcGiO359nPFxcqSnpQXJJzKIS02/d2cBdZ7uNm0Y4OnBu9P+BkDE9h118mjbvz/Mw50gd7eaAA5dKBQKOrRrx7AAP6a9HIJSqeTfS5Y2eLaiaxZwM38VFLLr0BGCnnDF0aI76Tq2eHc3N78u4vHbuncLIzbzzdRQXhk2GKVKRYVSyTdaZgb3nACabnDigYMsXrm61jEHG5sm7d+/dToIN+IFDqalN4vUq3fGEOjal3GB/ry9dJnWfG1aV3dfRcXFt1VOamYWvx06gn/f6h3Oa2N269xzeE+2AFevXSMrO4fIqGjC166j4pa+a0xwdb/W1P37N8YaN+IFGjJLacwsQE12/gXiUtPx7e2EjbkZmTqu/VETE4zbtOZy0ZXbun8/bNpaI8CyHTvv/RdBmm6wrrn7iEGBQMP271dWVWmdBjYkXuBOsir6N3x7OzEu0J/o/6zTmOds3l88amJCLzs74vcn31Y5+Zdv7CAuLS9vlmu5a6+C1bH79aHev6+7pamOF7h85QpvhU7G39ureWc153JJOnocHydHrbECSYeqW7XnRwznXuauCaCO05+/PgK/GbM1/pm/PqLB7wTU8QIACz6cg42lZbO3Ai1atNAaK/DzL5FUVlYSPDCAUYODtJ6ntaEhn02c8HAJoI7dLysvb/D+/Ya8E7g5XiBs7heYtDVutmtIP/Mnh0+e0horcDLrDGFr1gIw75/v8fnsWTg72PNIy5YYGRpib23NGxNDWP3uTDwdHe6aAM3yfYD6Blbq2P24lDRSd0Xr/k8N9CNogC8u7doSvrP2NDIzIa5OWVszMnE/kopvbyfCF33LzB/C6owf6psGahrDaLpPX1WU1IoVuLUuPycfoWN3C0b29+L5kcN5fqTm7uBQWnq96/ra0u/LXcE35v7179/fuG17rRlDQ/j8p7WcPpdbEy/QXMTvT9YZ7l0FLNi4ide+/pbt+5LJyc+npKyM0vJycvLz2ZK0n/97fSqjJk2+ay2AxAVIXIDwMCMCiACCCCCIAIIIIIgAggggiACCCCCIAIIIIIgAwoONfB9Avg8gSBcgiACCCCCIAIIIIIgAggggiACCCCCIAIIIIIgAggggiADCg4dEB0t0sCBdgCACCCKAIAIIIoAgAggigCACCCKAIAIIIoAgAggigCACCA8e/wUhxyKN56tCMgAAAABJRU5ErkJggg==" + } + Texture: 2180485959968, "Texture::file10", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file10" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file10" + FileName: "D:/Dev/clean/ufbx/data/textures/tiny_clouds.png" + RelativeFilename: "textures\tiny_clouds.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180485961408, "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180485971008, "Texture::file5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file5" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file5" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180485955168, "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180485951328, "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180485949408, "Texture::file6", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file6" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file6" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_bump.png" + RelativeFilename: "textures\checkerboard_bump.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180485969568, "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + AnimationStack: 2180348235392, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2180422076912, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::A, Model::RootNode + C: "OO",2179263665088,0 + + ;Model::B, Model::RootNode + C: "OO",2179184257856,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2180422076912,2180348235392 + + ;Texture::file10, Material::Special + C: "OP",2180485959968,2180485950848, "DiffuseColor" + + ;Texture::file4, Material::Shared + C: "OP",2180485955168,2180233238320, "EmissiveColor" + + ;Texture::file2, Material::Shared + C: "OP",2180485951328,2180233238320, "AmbientColor" + + ;Texture::file1, Material::Shared + C: "OP",2180485961408,2180233238320, "DiffuseColor" + + ;Texture::file5, Material::Shared + C: "OP",2180485971008,2180233238320, "DiffuseFactor" + + ;Texture::file6, Material::Shared + C: "OP",2180485949408,2180233238320, "Bump" + + ;Texture::file3, Material::Shared + C: "OP",2180485969568,2180233238320, "TransparentColor" + + ;Video::file10, Texture::file10 + C: "OO",2180485953248,2180485959968 + + ;Video::file1, Texture::file1 + C: "OO",2180485965728,2180485961408 + + ;Video::file5, Texture::file5 + C: "OO",2180485967168,2180485971008 + + ;Video::file4, Texture::file4 + C: "OO",2180485968608,2180485955168 + + ;Video::file2, Texture::file2 + C: "OO",2180485966208,2180485951328 + + ;Video::file6, Texture::file6 + C: "OO",2180485967648,2180485949408 + + ;Video::file3, Texture::file3 + C: "OO",2180485951808,2180485969568 + + ;Geometry::, Model::A + C: "OO",2179903084528,2179263665088 + + ;Material::Special, Model::A + C: "OO",2180485950848,2179263665088 + + ;Material::Shared, Model::A + C: "OO",2180233238320,2179263665088 + + ;Geometry::, Model::B + C: "OO",2179903102832,2179184257856 + + ;Material::Shared, Model::B + C: "OO",2180233238320,2179184257856 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_shared_textures_7500_binary.fbx b/modules/ufbx/data/maya_shared_textures_7500_binary.fbx new file mode 100644 index 0000000..e5c29f9 Binary files /dev/null and b/modules/ufbx/data/maya_shared_textures_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_slime_7500_ascii.fbx b/modules/ufbx/data/maya_slime_7500_ascii.fbx new file mode 100644 index 0000000..069f734 --- /dev/null +++ b/modules/ufbx/data/maya_slime_7500_ascii.fbx @@ -0,0 +1,3565 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 7 + Day: 31 + Hour: 17 + Minute: 51 + Second: 2 + Millisecond: 624 + } + Creator: "FBX SDK/FBX Plugins version 2020.0.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\dealers-dungeon\Assets\Temp\Slime\Slime_anim_Idle.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\dealers-dungeon\Assets\Temp\Slime\Slime_anim_Idle.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "202001" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/07/2020 14:51:02.622" + P: "Original|FileName", "KString", "", "", "D:\dealers-dungeon\Assets\Temp\Slime\Slime_anim_Idle.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "202001" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/07/2020 14:51:02.622" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\dealers-dungeon\Assets\Temp" + P: "Original|ApplicationNativeFile", "KString", "", "", "D:\Dealers_Dungeon\Dealers_Dungeon\scenes\Animations\New Folder\Slime_Idle_Variant_01.ma" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",6 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1539538600 + P: "TimeSpanStop", "KTime", "Time", "",93911854600 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1578329426896, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 151 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 6 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Texture" { + Count: 1 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 16 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 10 + PropertyTemplate: "FbxNull" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "Look", "enum", "", "",1 + } + } + } + ObjectType: "CollectionExclusive" { + Count: 1 + PropertyTemplate: "FbxDisplayLayer" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Show", "bool", "", "",1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + } + } + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 31 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 76 + } + ObjectType: "Video" { + Count: 1 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1579360673936, "Geometry::", "Mesh" { + Vertices: *5862 { + a: 16.813024520874,58.6301307678223,-6.45098829269409,9.26304721832275,62.5709457397461,-4.07682991027832,9.43667602539063,62.4704399108887,3.29239869117737,16.8798313140869,58.4573097229004,4.8819146156311,-16.8798294067383,58.4573097229004,4.8819146156311,-9.43667602539063,62.4704399108887,3.29239869117737,-9.26304817199707,62.5709457397461,-4.07682991027832,-16.813024520874,58.6301307678223,-6.45098876953125,6.12116622924805,62.3919868469238,9.30534172058105,10.2670478820801,58.0712509155273,13.9621477127075,-10.2670478820801,58.0712394714355,13.9621486663818,-6.12116622924805,62.3919868469238,9.30534172058105,-7.45058059692383e-09,62.0878105163574,11.1720361709595,0,57.578800201416,17.3736190795898,-5.7886528968811,62.4111289978027,-9.86001014709473,-10.1691026687622,58.321475982666,-15.1508369445801,10.1691026687622,58.3214797973633,-15.1508359909058,5.7886528968811,62.4111328125,-9.86001014709473,0,58.0642547607422,-18.1472282409668,7.45058059692383e-09,61.9165649414063,-11.8112869262695,14.100341796875,52.2111396789551,18.8058395385742,0,51.8219871520996,23.1636142730713,-14.100341796875,52.2111396789551,18.8058395385742,19.111291885376,30.7681884765625,25.5504760742188,-2.98023223876953e-08,30.5793228149414,31.6028614044189,-19.111291885376,30.7681865692139,25.5504760742188,22.9066715240479,52.3150405883789,6.82325792312622,-22.9066734313965,52.3150405883789,6.82325792312622,22.6631603240967,52.6304626464844,-7.98770189285278,-22.663158416748,52.6304588317871,-7.98770189285278,14.1476078033447,52.0955047607422,-19.918363571167,-14.147608757019,52.0955047607422,-19.918363571167,4.4703483581543e-08,51.5348358154297,-24.7252311706543,30.521915435791,31.0598468780518,9.73105621337891,-30.5219135284424,31.0598449707031,9.73105716705322,30.0578002929688,31.516134262085,-9.74073505401611,-30.0577983856201,31.516134262085,-9.7407341003418,18.7703857421875,31.3790645599365,-25.6918201446533,-18.7703857421875,31.3790626525879,-25.6918239593506,-4.4703483581543e-08,31.0360946655273,-31.8056602478027,11.4849376678467,2.84160161018372,15.9455804824829, +0,3.08472466468811,18.4975872039795,-11.484938621521,2.84160161018372,15.9455785751343,18.5238857269287,2.59029984474182,7.42065715789795,-18.5238857269287,2.59029984474182,7.42065715789795,18.7596435546875,2.59731960296631,-4.47334671020508,-18.7596416473389,2.59731984138489,-4.47334623336792,12.4960289001465,2.88418507575989,-14.7972974777222,-12.4960289001465,2.88418507575989,-14.7972993850708,7.45058059692383e-09,3.21299958229065,-18.3878173828125,17.5132637023926,12.2782583236694,23.9706497192383,2.98023223876953e-08,12.4891271591187,28.9996967315674,-17.5132598876953,12.2782583236694,23.9706497192383,-28.9397983551025,12.1150903701782,9.94624996185303,-29.3574962615967,12.3540420532227,-8.43022727966309,-18.3336029052734,12.0703811645508,-23.0896625518799,4.4703483581543e-08,11.8736047744751,-28.3274593353271,18.3336048126221,12.0703802108765,-23.0896625518799,29.3574962615967,12.354043006897,-8.4302282333374,28.9397983551025,12.1150903701782,9.94624996185303,17.2659473419189,42.6152191162109,22.7871723175049,28.0324745178223,42.9693336486816,8.65484523773193,27.6104526519775,43.3149032592773,-9.1652193069458,17.015832901001,42.7646179199219,-23.5520915985107,2.98023223876953e-08,41.9887619018555,-29.3505840301514,-17.015832901001,42.7646102905273,-23.5520896911621,-27.6104526519775,43.3148956298828,-9.1652193069458,-28.0324745178223,42.9693336486816,8.65484428405762,-17.2659492492676,42.6152153015137,22.7871723175049,4.4703483581543e-08,42.1665267944336,27.7970428466797,0,63.9588775634766,-7.1794958114624,3.30909132957458,63.9386978149414,-6.73507976531982,-3.30909156799316,63.9386978149414,-6.73507976531982,4.15416049957275,64.0946197509766,-2.84457468986511,-4.15416097640991,64.0946197509766,-2.84457468986511,-3.72529029846191e-09,64.2933807373047,-2.68546009063721,-4.25497722625732,64.0769119262695,2.33428382873535,4.25497722625732,64.0769119262695,2.33428406715393,0,64.0311813354492,6.87746953964233,-3.52403974533081,63.9572677612305,6.40535354614258,3.52403950691223,63.9572677612305,6.40535354614258,0,64.2933654785156,2.1829628944397, +-7.45058059692383e-09,1.09823977947235,13.3329925537109,-7.47556161880493,0.769791126251221,11.3796672821045,7.47556161880493,0.769791066646576,11.3796672821045,-11.5398502349854,0.537244319915771,5.24461650848389,11.5398502349854,0.537244379520416,5.24461698532104,-11.6679944992065,0.512921333312988,-2.99805641174316,11.6679944992065,0.512921333312988,-2.99805617332458,-7.9850172996521,0.665100932121277,-10.2096891403198,7.9850172996521,0.665100932121277,-10.2096891403198,-2.23517417907715e-08,1.10309600830078,-12.9854173660278,7.45058059692383e-09,0.252106785774231,-7.61927270889282,4.68082332611084,0.180775344371796,-6.87880754470825,-4.68082332611084,0.180775359272957,-6.87880754470825,5.57563972473145,0.141126871109009,-2.14273262023926,-5.57563924789429,0.141126871109009,-2.14273262023926,5.51813077926636,0.146058455109596,3.83382034301758,-5.51813077926636,0.146058470010757,3.83382034301758,4.48499250411987,0.219572603702545,8.2011251449585,-4.48499250411987,0.219572588801384,8.20112609863281,1.49011611938477e-08,0.255918323993683,8.70151805877686,7.45058059692383e-09,0.138249218463898,-2.08204317092896,-3.72529029846191e-09,0.138632208108902,3.59453201293945,14.9848117828369,6.15867471694946,20.0494956970215,25.1154117584229,5.94653940200806,8.84241580963135,25.669620513916,6.10382127761841,-6.5818772315979,16.1415233612061,6.31221437454224,-19.077184677124,-8.94069671630859e-08,6.36294603347778,-23.4758644104004,-16.1415233612061,6.31221437454224,-19.0771865844727,-25.669620513916,6.10382080078125,-6.5818772315979,-25.1154117584229,5.94653940200806,8.84241485595703,-14.9848117828369,6.15867471694946,20.0494937896729,-2.98023223876953e-08,6.27775001525879,23.6822776794434,-8.94069671630859e-08,21.2655010223389,32.246021270752,-19.175313949585,21.2052688598633,26.2539253234863,-30.9924163818359,21.3572883605957,10.5188808441162,-30.9736423492432,21.7486915588379,-9.35717487335205,-19.64235496521,21.4522228240967,-25.7592277526855,2.98023223876953e-08,21.3539848327637,-31.9678287506104,19.64235496521,21.4522247314453,-25.7592277526855, +30.9736404418945,21.7486877441406,-9.35717678070068,30.9924144744873,21.3572864532471,10.5188817977905,19.175313949585,21.2052688598633,26.2539253234863,18.3900547027588,36.6259956359863,24.3590965270996,31.7782154083252,31.3145179748535,0.00622780621051788,29.0985641479492,37.3912467956543,-9.56560134887695,25.6206035614014,31.5255928039551,-18.5988349914551,17.9925765991211,37.0636978149414,-24.8362464904785,9.91068649291992,31.1575775146484,-30.2197437286377,5.96046447753906e-08,36.4655303955078,-30.8228206634521,-9.91068649291992,31.1575775146484,-30.2197437286377,-17.9925765991211,37.0636940002441,-24.8362483978271,-25.6206035614014,31.5255928039551,-18.5988368988037,-29.0985641479492,37.391242980957,-9.56560134887695,-31.7782173156738,31.3145179748535,0.00622788071632385,-29.5879421234131,36.9874382019043,9.24763488769531,-26.1405200958252,30.8907909393311,18.5272979736328,-18.3900566101074,36.6259956359863,24.3590984344482,-10.0722208023071,30.6424674987793,30.0326290130615,5.96046447753906e-08,36.2785491943359,29.9286918640137,10.0722198486328,30.6424674987793,30.0326290130615,1.49011611938477e-08,63.1659393310547,-9.35706996917725,1.89065086841583,63.9856414794922,-7.03230476379395,4.25340175628662,63.4939079284668,-7.94429302215576,-4.25340270996094,63.4939079284668,-7.94429349899292,-1.89065086841583,63.9856376647949,-7.03230476379395,6.41650247573853,63.592456817627,-3.27711296081543,3.75283002853394,64.0800476074219,-5.14160871505737,-6.41650295257568,63.5924491882324,-3.27711296081543,-3.75283026695251,64.0800476074219,-5.14160871505737,2.05067181587219,64.2734909057617,-2.69595122337341,-3.72529029846191e-09,64.2599105834961,-4.97922515869141,-2.05067205429077,64.2734909057617,-2.69595146179199,-4.33137989044189,64.08349609375,-0.276206344366074,-6.57521629333496,63.5353088378906,2.71069598197937,4.33137989044189,64.08349609375,-0.276206374168396,6.57521629333496,63.5353088378906,2.71069622039795,-1.49011611938477e-08,63.3753852844238,8.90047931671143,-2.02162647247314,64.0365447998047,6.7284049987793, +-4.55155992507935,63.5232162475586,7.57465934753418,4.55155992507935,63.5232238769531,7.57465934753418,2.02162647247314,64.0365447998047,6.72840452194214,-3.93278098106384,64.0674591064453,4.74192571640015,3.93278074264526,64.0674514770508,4.74192571640015,0,64.2671432495117,4.61683034896851,-2.09805393218994,64.2717132568359,2.19545102119446,2.09805393218994,64.2717208862305,2.19545102119446,3.72529029846191e-09,64.2933654785156,-0.27853399515152,-3.99053144454956,0.98205953836441,12.8748321533203,0,1.96691989898682,15.8745374679565,-6.04091167449951,3.00420880317688,17.9203567504883,-9.46227550506592,1.64277267456055,13.6321001052856,3.99053144454956,0.982059597969055,12.8748321533203,9.46227550506592,1.64277267456055,13.6320991516113,6.04091167449951,3.0042085647583,17.9203567504883,-10.012864112854,0.618478000164032,8.74757862091064,-15.7680997848511,2.69207262992859,12.3405084609985,-14.9507856369019,1.37947404384613,6.34751749038696,10.0128631591797,0.618477940559387,8.74757862091064,14.9507856369019,1.37947404384613,6.34751749038696,15.7680988311768,2.69207286834717,12.3405075073242,-12.0674495697021,0.509563446044922,1.20459711551666,-19.4827632904053,2.55776882171631,1.61916244029999,-15.106481552124,1.35577654838562,-3.65245461463928,12.0674495697021,0.509563505649567,1.20459735393524,15.1064825057983,1.35577642917633,-3.65245461463928,19.4827651977539,2.55776858329773,1.61916255950928,-10.3807392120361,0.538445591926575,-6.96647262573242,-16.4847755432129,2.70794367790222,-10.2133312225342,-10.2307987213135,1.58372259140015,-12.4722995758057,10.3807401657104,0.53844553232193,-6.96647262573242,10.2307977676392,1.58372259140015,-12.4722995758057,16.4847736358643,2.7079439163208,-10.2133312225342,-4.33562135696411,0.937179028987885,-12.2702083587646,-6.72919750213623,3.10027408599854,-17.5162200927734,-7.45058059692383e-09,2.01909565925598,-15.7034797668457,4.33562183380127,0.937179028987885,-12.270209312439,6.72919750213623,3.10027408599854,-17.5162200927734,2.6919150352478,0.219701901078224,-7.35904932022095, +0,0.538107752799988,-10.3030681610107,6.04651832580566,0.26252755522728,-8.25128078460693,-2.6919150352478,0.219701915979385,-7.35904932022095,-6.04651832580566,0.26252755522728,-8.25128173828125,5.18159437179565,0.144878253340721,-4.90785932540894,8.51507186889648,0.183361619710922,-2.4719934463501,-5.1815938949585,0.144878253340721,-4.90785980224609,-8.51507377624512,0.183361619710922,-2.4719934463501,5.69791030883789,0.141434952616692,0.87463641166687,8.42035675048828,0.198246091604233,4.38088321685791,-5.69791030883789,0.141434952616692,0.874636471271515,-8.4203577041626,0.198246076703072,4.38088321685791,5.04447460174561,0.16485008597374,6.4318699836731,5.73316526412964,0.340697377920151,9.49965000152588,-5.04447460174561,0.16485008597374,6.43187046051025,-5.73316526412964,0.340697377920151,9.49965000152588,3.72529029846191e-09,0.546091198921204,11.000129699707,2.57290101051331,0.235503301024437,8.53459739685059,-2.57290101051331,0.235503286123276,8.5345983505249,2.75842499732971,0.138538718223572,-2.06275749206543,-1.49011611938477e-08,0.149483233690262,-4.88454723358154,-2.75842499732971,0.138538733124733,-2.06275749206543,2.73177027702332,0.139375045895576,3.62126922607422,-7.45058059692383e-09,0.150504991412163,6.24109554290771,-2.73177027702332,0.139375030994415,3.62126898765564,0,0.138442441821098,0.781907558441162,22.0571155548096,4.03671503067017,8.22001266479492,13.3497018814087,4.26412630081177,18.04465675354,22.4666080474854,4.11746501922607,-5.49101591110229,14.5035247802734,4.42079401016235,-16.9800453186035,-1.49011611938477e-08,4.6192741394043,-20.9681625366211,-14.5035257339478,4.4207935333252,-16.9800472259521,-22.4666080474854,4.11746454238892,-5.49101591110229,-22.0571155548096,4.03671503067017,8.22001361846924,-13.3497018814087,4.26412630081177,18.04465675354,0,4.42001724243164,21.0650882720947,-1.49011611938477e-08,25.7205181121826,32.4206275939941,-19.3804950714111,25.7748279571533,26.2440299987793,-31.0408725738525,26.0122776031494,10.2300577163696,-30.7611923217773,26.460355758667,-9.63925647735596, +-19.4162006378174,26.2921504974365,-26.0502777099609,-1.19209289550781e-07,26.1299304962158,-32.3055572509766,19.4162006378174,26.2921485900879,-26.0502758026123,30.7611885070801,26.4603576660156,-9.63925552368164,31.0408706665039,26.0122776031494,10.2300567626953,19.3804950714111,25.7748260498047,26.2440319061279,12.9913673400879,60.8753089904785,-5.25475168228149,9.78493499755859,62.5210151672363,-0.41702276468277,13.1031017303467,60.7447700500488,4.02668762207031,17.7453727722168,58.5899200439453,-0.809700965881348,-9.78493499755859,62.5210189819336,-0.417022734880447,-12.9913663864136,60.8753089904785,-5.25475120544434,-17.7453727722168,58.5899200439453,-0.809700965881348,-13.1031017303467,60.7447700500488,4.02668762207031,8.20581150054932,62.4571838378906,6.68848276138306,8.12414073944092,60.471435546875,11.5054883956909,14.2565279006958,58.2990951538086,9.96023464202881,-8.20581340789795,62.4571838378906,6.6884822845459,-14.2565269470215,58.2990951538086,9.96023368835449,-8.12414073944092,60.471435546875,11.5054883956909,3.26510405540466,62.2067413330078,10.7502145767212,2.98023223876953e-08,60.0372123718262,14.130181312561,5.36252880096436,57.7534980773926,16.4935283660889,-3.26510405540466,62.2067413330078,10.7502145767212,-5.36252880096436,57.7534980773926,16.4935283660889,-7.90059900283813,62.5589370727539,-7.34078454971313,-7.87996339797974,60.647777557373,-12.4034872055054,-14.1552896499634,58.5156021118164,-11.3805475234985,7.90059900283813,62.5589370727539,-7.34078550338745,14.155291557312,58.5155982971191,-11.3805465698242,7.87996387481689,60.647777557373,-12.4034881591797,-3.05637216567993,62.1028022766113,-11.3396148681641,0,60.2595596313477,-14.8043575286865,-5.3039174079895,58.1435775756836,-17.4080791473389,3.05637216567993,62.1027946472168,-11.3396148681641,5.3039174079895,58.1435813903809,-17.4080791473389,7.38880777359009,51.9786796569824,22.0638046264648,12.262092590332,55.455394744873,16.4445190429688,0,55.0127067565918,20.4223556518555,-7.38880825042725,51.9786796569824,22.0638046264648,-12.262092590332,55.455394744873,16.4445190429688, +9.04762554168701,42.3293037414551,26.5473079681396,15.8002681732178,47.9009628295898,20.9286327362061,-4.4703483581543e-08,47.4747543334961,25.5737819671631,-9.04762649536133,42.3292999267578,26.5473079681396,-15.8002681732178,47.9009628295898,20.9286346435547,19.4697437286377,52.2704467773438,13.5236682891846,20.0684642791748,55.7029151916504,5.8280029296875,-19.4697437286377,52.2704467773438,13.5236682891846,-20.0684642791748,55.7029113769531,5.82800245285034,23.9323711395264,52.5077667236328,-0.600147843360901,19.939037322998,55.9520034790039,-7.3214430809021,-19.9390354156494,55.9520034790039,-7.3214430809021,-23.9323711395264,52.5077705383301,-0.60014796257019,19.3190956115723,52.4570732116699,-14.6040458679199,12.2839879989624,55.5306129455566,-17.6723003387451,-19.3190937042236,52.4570732116699,-14.6040458679199,-12.2839889526367,55.5306129455566,-17.6723003387451,7.46766042709351,51.7165794372559,-23.4410591125488,0,55.1819267272949,-21.5656223297119,-7.46765995025635,51.7165794372559,-23.4410591125488,23.8391628265381,42.8035888671875,16.5997982025146,25.6807079315186,48.1006622314453,7.81085824966431,-23.8391609191895,42.8035888671875,16.5997982025146,-25.6807098388672,48.1006622314453,7.81085824966431,29.2462196350098,43.195140838623,-0.252985656261444,25.3403797149658,48.4322700500488,-8.61504173278809,-29.2462177276611,43.195140838623,-0.252985835075378,-25.3403797149658,48.4322662353516,-8.61504173278809,23.3987426757813,43.156909942627,-17.1453151702881,15.7327394485474,47.8277473449707,-21.8941192626953,-23.3987426757813,43.156909942627,-17.1453132629395,-15.7327394485474,47.8277473449707,-21.8941211700439,8.94406032562256,42.2567558288574,-27.8008766174316,5.96046447753906e-08,47.0876541137695,-27.3276977539063,-8.94406032562256,42.2567596435547,-27.800874710083,7.78537225723267,6.24709463119507,22.8107509613037,16.3541297912598,8.80073165893555,22.0911712646484,9.14166259765625,12.4210567474365,27.7264308929443,-4.4703483581543e-08,8.96741199493408,26.4299201965332,-7.78537225723267,6.24709463119507,22.8107509613037, +-9.14166164398193,12.4210557937622,27.7264308929443,-16.3541297912598,8.80073165893555,22.0911712646484,20.9957103729248,6.02912425994873,15.2796316146851,27.3276805877686,8.58841609954834,9.41903877258301,24.3521137237549,12.1445322036743,17.8770484924316,-20.9957103729248,6.02912425994873,15.2796325683594,-24.3521156311035,12.14453125,17.8770484924316,-27.3276786804199,8.58841609954834,9.41903877258301,26.7111549377441,5.9890775680542,1.2338250875473,27.8737125396729,8.78761196136475,-7.6010947227478,30.6492710113525,12.2467098236084,0.813896119594574,-26.7111549377441,5.98907709121704,1.23382532596588,-30.6492729187012,12.2467098236084,0.813896059989929,-27.8737106323242,8.78761100769043,-7.6010947227478,22.0214328765869,6.22214078903198,-13.6035614013672,17.3619651794434,8.74717140197754,-21.1563339233398,25.0973968505859,12.2591247558594,-16.6704196929932,-22.0214347839355,6.22214078903198,-13.6035604476929,-25.0973968505859,12.259126663208,-16.6704216003418,-17.3619651794434,8.74717044830322,-21.1563358306885,8.52061748504639,6.3541579246521,-22.384593963623,7.45058059692383e-08,8.63920021057129,-25.9453125,9.65857887268066,11.9277172088623,-27.0138244628906,-8.52061653137207,6.3541579246521,-22.3845920562744,-9.65857887268066,11.9277181625366,-27.0138244628906,18.50217628479,16.5718326568604,25.4365825653076,10.0738668441772,21.2380981445313,30.6886787414551,1.04308128356934e-07,16.7357120513916,31.0317516326904,-10.0738658905029,21.2380981445313,30.6886787414551,-18.50217628479,16.571834564209,25.4365825653076,-26.3740425109863,21.2299213409424,19.3082447052002,-30.223876953125,16.5600700378418,10.3750371932983,-32.4976768493652,21.5955905914307,0.639631032943726,-30.4464454650879,16.871021270752,-8.98474216461182,-26.6127109527588,21.6437549591064,-18.4718608856201,-19.1905670166016,16.5113372802734,-24.704963684082,-10.4152088165283,21.3658485412598,-30.3691959381104,-2.08616256713867e-07,16.358247756958,-30.4983386993408,10.4152088165283,21.3658485412598,-30.369197845459,19.1905651092529,16.5113372802734,-24.7049655914307, +26.6127090454102,21.6437549591064,-18.4718589782715,30.4464454650879,16.871021270752,-8.98474025726318,32.4976768493652,21.5955905914307,0.639630734920502,30.2238750457764,16.5600719451904,10.3750371932983,26.3740425109863,21.2299175262451,19.3082427978516,26.1405220031738,30.8907890319824,18.5272998809814,29.5879421234131,36.9874420166016,9.24763488769531,13.7235765457153,60.8352661132813,-0.639773845672607,-13.723575592041,60.8352661132813,-0.639773845672607,11.1611251831055,60.6433715820313,8.22637748718262,-11.1611251831055,60.643367767334,8.2263765335083,4.27106094360352,60.1953773498535,13.4810037612915,-4.27106094360352,60.1953735351563,13.4810028076172,-10.9484014511108,60.8156089782715,-9.30817127227783,10.9484024047852,60.8156051635742,-9.30817031860352,-4.11488962173462,60.3980369567871,-14.2225875854492,4.11489009857178,60.3980407714844,-14.2225885391235,6.411949634552,55.1791381835938,19.3997821807861,-6.41194915771484,55.1791381835938,19.3997821807861,8.27677917480469,47.6397743225098,24.4174423217773,-8.27677822113037,47.6397743225098,24.417444229126,16.9924964904785,55.5995750427246,11.7557516098022,-16.9924945831299,55.5995750427246,11.7557516098022,21.0397052764893,55.8699531555176,-0.770179688930511,-21.0397033691406,55.8699531555176,-0.770179748535156,16.910680770874,55.8014869689941,-13.11940574646,-16.9106826782227,55.8014907836914,-13.11940574646,6.45152568817139,55.2880821228027,-20.558801651001,-6.45152568817139,55.2880859375,-20.558801651001,21.8278274536133,48.0101318359375,15.1772298812866,-21.8278255462646,48.0101318359375,15.1772298812866,26.8058471679688,48.3114013671875,-0.408968240022659,-26.8058452606201,48.3113975524902,-0.408968269824982,21.5451278686523,48.2446937561035,-15.9672880172729,-21.5451316833496,48.2446937561035,-15.9672889709473,8.29033184051514,47.3368721008301,-25.8650493621826,-8.29033279418945,47.3368759155273,-25.8650493621826,8.50608062744141,8.91914844512939,25.3563175201416,-8.50608062744141,8.91914749145508,25.3563175201416,22.8744831085205,8.65676307678223,16.642297744751, +-22.8744831085205,8.65676307678223,16.6422996520996,29.0471725463867,8.67295074462891,0.982104301452637,-29.0471725463867,8.67295169830322,0.982104301452637,23.8138809204102,8.80272483825684,-15.234447479248,-23.8138809204102,8.80272388458252,-15.2344484329224,9.13511371612549,8.67564964294434,-24.7511806488037,-9.13511371612549,8.67564868927002,-24.7511806488037,9.69091796875,16.6772022247314,29.5921821594238,-9.69091701507568,16.6772022247314,29.5921840667725,-25.579797744751,16.5096855163574,18.835205078125,-31.8533687591553,16.7497501373291,0.7536381483078,-26.1126346588135,16.7361145019531,-17.7681331634521,-10.1481485366821,16.3884868621826,-29.0242767333984,10.1481485366821,16.3884887695313,-29.0242729187012,26.1126384735107,16.7361164093018,-17.7681331634521,31.8533687591553,16.7497520446777,0.753638207912445,25.579797744751,16.5096874237061,18.835205078125,25.2623767852783,36.8043327331543,17.6959228515625,30.8205490112305,37.2293739318848,-0.155422702431679,24.6936302185059,37.3293342590332,-18.0454750061035,9.46881008148193,36.6771774291992,-29.2477474212646,-9.46881008148193,36.6771774291992,-29.247745513916,-24.6936302185059,37.3293342590332,-18.0454750061035,-30.8205490112305,37.2293739318848,-0.155422762036324,-25.2623729705811,36.8043327331543,17.6959228515625,-9.66664218902588,36.400203704834,28.510534286499,9.66664218902588,36.400203704834,28.510534286499,2.29436087608337,63.2939414978027,-9.02867031097412,-2.29436087608337,63.2939414978027,-9.0286693572998,5.5984148979187,63.5941123962402,-5.93400192260742,-5.5984148979187,63.5941123962402,-5.93400144577026,1.90429484844208,64.2450256347656,-4.95668029785156,-1.90429484844208,64.2450256347656,-4.9566798210144,-6.74689102172852,63.5578765869141,-0.305294632911682,6.74689054489136,63.5578804016113,-0.30529460310936,-2.4807231426239,63.4389381408691,8.62031364440918,2.4807231426239,63.4389381408691,8.62031364440918,-5.87370777130127,63.5473327636719,5.48426055908203,5.87370777130127,63.5473327636719,5.48426008224487,-1.99291121959686,64.2486801147461,4.58360576629639, +1.99291121959686,64.2486724853516,4.58360576629639,-2.12521839141846,64.2723693847656,-0.274763554334641,2.12521839141846,64.2723770141602,-0.274763584136963,-5.01113080978394,1.85440647602081,15.3590183258057,5.01113128662109,1.85440635681152,15.35901927948,-12.8440647125244,1.47847664356232,10.5298252105713,12.8440647125244,1.47847676277161,10.5298252105713,-15.666130065918,1.34153032302856,1.46876764297485,15.666130065918,1.34153032302856,1.46876788139343,-13.3718004226685,1.42071568965912,-8.521728515625,13.3718004226685,1.42071568965912,-8.521728515625,-5.53860139846802,1.85962390899658,-14.8954925537109,5.53860139846802,1.85962390899658,-14.8954925537109,3.32329034805298,0.432143419981003,-9.78019905090332,-3.32329034805298,0.432143419981003,-9.78019905090332,7.6852445602417,0.190343141555786,-5.6930775642395,-7.68524408340454,0.190343156456947,-5.69307708740234,8.76115322113037,0.183509841561317,1.003005027771,-8.76115322113037,0.183509841561317,1.003005027771,7.44827365875244,0.245792120695114,7.32219934463501,-7.44827365875244,0.245792120695114,7.32219886779785,3.11491250991821,0.472422003746033,10.6555881500244,-3.11491227149963,0.472422033548355,10.6555891036987,2.62973690032959,0.146514862775803,-4.80371379852295,-2.62973690032959,0.146514877676964,-4.80371332168579,2.56572985649109,0.150216847658157,6.21602869033813,-2.56572961807251,0.150216862559319,6.21602773666382,2.80568289756775,0.138742581009865,0.803741693496704,-2.80568289756775,0.138742581009865,0.803741455078125,18.5649452209473,4.13108444213867,13.8892669677734,23.3544368743896,4.03553819656372,1.49891769886017,19.4844036102295,4.2589955329895,-11.9181547164917,7.72730350494385,4.55908155441284,-19.9941444396973,-7.72730350494385,4.55908155441284,-19.9941444396973,-19.4844055175781,4.25899600982666,-11.9181537628174,-23.3544368743896,4.03553819656372,1.49891781806946,-18.5649452209473,4.13108491897583,13.8892679214478,-6.96761035919189,4.37404537200928,20.366189956665,6.96761035919189,4.37404584884644,20.3661861419678,-10.2077808380127,25.733491897583,30.809253692627, +-26.5391120910645,25.8534049987793,19.1378936767578,-32.4024772644043,26.2696361541748,0.331826746463776,-26.3560543060303,26.4320735931396,-18.7470703125,-10.2849044799805,26.1762256622314,-30.6898097991943,10.2849035263062,26.1762256622314,-30.6898097991943,26.3560523986816,26.4320774078369,-18.7470703125,32.402473449707,26.2696323394775,0.331826508045197,26.5391101837158,25.8534049987793,19.1378936767578,10.2077808380127,25.733491897583,30.8092517852783,-28.4429759979248,40.4081611633301,-9.38882255554199,-24.108024597168,40.2944145202637,-17.6346836090088,-31.2743053436279,31.4324798583984,-4.92178583145142,-31.3537731170654,34.2006607055664,-0.0917831659317017,-30.3131008148193,37.3310050964355,-4.92007255554199,-31.5379447937012,31.1832942962646,4.92870855331421,-30.1159687042236,33.9515686035156,9.49155521392822,-30.5893478393555,37.1077270507813,4.60744667053223,-28.9045352935791,40.0368843078613,8.97637367248535,-30.1331596374512,40.2708168029785,-0.203040540218353,-28.6985416412354,30.9652080535889,14.2986755371094,-25.7639255523682,33.7743911743164,18.1392116546631,-27.7847690582275,36.8899040222168,13.6442441940308,-22.920539855957,30.8279819488525,22.3126525878906,-18.804386138916,33.6226272583008,25.0089683532715,-22.1032905578613,36.7199554443359,21.3013210296631,-17.8750095367432,39.6622161865234,23.6140842437744,-24.6245555877686,39.8557014465332,17.1864471435547,-14.7854719161987,30.7028141021729,28.1364974975586,-9.90024280548096,33.445987701416,29.3473358154297,-14.2052059173584,36.5116806030273,26.7678928375244,-5.10068225860596,30.5977649688721,31.2007808685303,0,33.3532791137695,30.8506355285645,-4.89227342605591,36.3147621154785,29.5698623657227,5.96046447753906e-08,39.2510032653809,28.8923797607422,-9.37968349456787,39.3972587585449,27.5634517669678,5.10068225860596,30.5977649688721,31.2007808685303,9.90024280548096,33.445987701416,29.3473358154297,4.89227342605591,36.3147621154785,29.5698623657227,14.7854709625244,30.7028160095215,28.1364974975586,14.2052059173584,36.5116806030273,26.7678928375244, +9.37968349456787,39.3972625732422,27.5634517669678,0,62.5933837890625,-10.528510093689,1.16805970668793,63.2059593200684,-9.27824687957764,2.63404631614685,62.7617721557617,-10.1223707199097,0,63.6243896484375,-8.25479221343994,0.969193875789642,63.9717788696289,-7.13800525665283,2.04093527793884,63.6997184753418,-8.01778984069824,2.71663475036621,63.9755821228027,-6.88116884231567,3.69200563430786,63.7923927307129,-7.22883129119873,3.33714509010315,63.3977813720703,-8.59523773193359,4.94882726669312,63.0364837646484,-8.81882381439209,-1.16805970668793,63.2059593200684,-9.27824687957764,-2.04093527793884,63.6997184753418,-8.01779079437256,-0.969193875789642,63.9717788696289,-7.13800525665283,-2.63404631614685,62.7617721557617,-10.1223697662354,-4.94882726669312,63.0364837646484,-8.81882286071777,-3.33714532852173,63.3977813720703,-8.59523773193359,-3.69200587272644,63.7923927307129,-7.22883129119873,-2.71663475036621,63.9755783081055,-6.88116884231567,5.24221706390381,63.895866394043,-3.01949954032898,6.06939458847046,63.6018981933594,-4.66487312316895,4.65059900283813,63.8911170959473,-5.45779323577881,3.97378325462341,64.0979309082031,-4.04715299606323,7.73683977127075,63.1592025756836,-3.62652134895325,6.6644082069397,63.1585884094238,-6.56046724319458,5.00012159347534,63.5587310791016,-7.04217767715454,3.51146006584167,64.0217742919922,-6.08299827575684,-7.73684024810791,63.1592025756836,-3.62652134895325,-6.06939458847046,63.6018943786621,-4.66487312316895,-6.66440868377686,63.1585884094238,-6.56046676635742,-5.24221706390381,63.895866394043,-3.0194993019104,-3.97378325462341,64.0979309082031,-4.04715299606323,-4.65059900283813,63.8911170959473,-5.45779323577881,-3.51146006584167,64.0217742919922,-6.08299827575684,-5.00012159347534,63.5587272644043,-7.04217767715454,1.02203488349915,64.2933578491211,-2.68320178985596,1.97651171684265,64.2738189697266,-3.84941720962524,0.956040561199188,64.2612075805664,-4.96405792236328,0,64.2933578491211,-3.84607362747192,3.09251308441162,64.2138595581055,-2.74323391914368,2.83697652816772,64.1913299560547,-4.99521732330322, +1.86038947105408,64.1581802368164,-6.01478910446167,0,64.1595687866211,-6.08900260925293,-3.09251308441162,64.2138595581055,-2.7432336807251,-1.97651171684265,64.2738189697266,-3.84941720962524,-2.83697652816772,64.1913299560547,-4.99521732330322,-1.02203488349915,64.2933578491211,-2.68320178985596,-0.956040561199188,64.2611999511719,-4.96405744552612,-1.86038947105408,64.1581802368164,-6.01478910446167,-4.32554912567139,64.0788497924805,1.03693556785583,-5.49010896682739,63.8736267089844,-0.284196853637695,-6.72508382797241,63.5426254272461,1.21349608898163,-5.37391185760498,63.8604621887207,2.49331545829773,-4.27380514144897,64.0892791748047,-1.57881796360016,-6.64318370819092,63.5761375427246,-1.81304204463959,-8.15930652618408,63.1143188476563,-0.347052395343781,-7.91182565689087,63.079345703125,2.97939920425415,4.27380514144897,64.0892791748047,-1.57881820201874,5.49010944366455,63.8736305236816,-0.284196883440018,6.6431827545166,63.5761375427246,-1.81304204463959,4.32554960250854,64.0788497924805,1.03693556785583,5.37391185760498,63.8604583740234,2.49331569671631,6.72508335113525,63.5426254272461,1.21349608898163,7.91182613372803,63.0793418884277,2.97939920425415,8.15930652618408,63.1143226623535,-0.347052454948425,-2.83910846710205,62.9166259765625,9.62484931945801,-3.59352040290833,63.4849739074707,8.21624279022217,-5.27661228179932,63.0546607971191,8.37796020507813,-1.49011611938477e-08,62.823844909668,9.96906757354736,-1.26587438583374,63.3960456848145,8.83813190460205,-2.98023223876953e-08,63.7689933776855,7.89402770996094,-1.03745293617249,64.0375518798828,6.8364462852478,-2.2002477645874,63.8012161254883,7.67949438095093,-2.89924144744873,64.0079727172852,6.5683765411377,-3.94695663452148,63.8176422119141,6.89418697357178,2.83910846710205,62.9166259765625,9.62484836578369,1.26587438583374,63.3960456848145,8.83813190460205,5.27661275863647,63.0546646118164,8.37796115875244,3.59352040290833,63.4849739074707,8.21624374389648,3.94695663452148,63.8176383972168,6.89418649673462,2.89924144744873,64.0079727172852,6.56837606430054, +2.2002477645874,63.8012161254883,7.67949390411377,1.03745293617249,64.0375518798828,6.8364462852478,-6.29474639892578,63.5408668518066,4.15367269515991,-4.8812837600708,63.8638877868652,5.0428900718689,-4.11832809448242,64.0792694091797,3.58951377868652,-6.96805191040039,63.0869941711426,6.03733444213867,-5.30213308334351,63.542724609375,6.64429330825806,-3.71551370620728,64.0230255126953,5.73081827163696,6.29474639892578,63.5408668518066,4.15367269515991,6.96805191040039,63.0869941711426,6.03733444213867,4.11832809448242,64.0792694091797,3.58951377868652,4.88128328323364,63.8638916015625,5.04288959503174,3.71551370620728,64.0230255126953,5.73081827163696,5.30213356018066,63.5427284240723,6.6442928314209,-1.96880459785461,64.1779479980469,5.69305849075317,-2.97019910812378,64.1888046264648,4.61007070541382,-7.45058059692383e-09,64.1884918212891,5.77856397628784,-1.00028920173645,64.2677764892578,4.59881019592285,1.49011611938477e-08,64.2933578491211,3.411789894104,-1.04534757137299,64.2933578491211,2.18186140060425,-2.0450758934021,64.2719497680664,3.41020083427429,-3.16547751426697,64.2067794799805,2.24062705039978,1.96880459785461,64.1779479980469,5.69305849075317,1.00028920173645,64.2677764892578,4.59881019592285,2.9701988697052,64.1888122558594,4.61007070541382,3.16547751426697,64.2067794799805,2.24062705039978,2.0450758934021,64.2719497680664,3.41020083427429,1.04534757137299,64.2933578491211,2.18186140060425,-2.10040807723999,64.2729568481445,-1.49923431873322,-1.05755019187927,64.2933578491211,-0.27705991268158,0,64.2933578491211,-1.49329566955566,-3.21312212944031,64.2094116210938,-0.273770451545715,-2.12460088729858,64.2719039916992,0.961963951587677,-1.49011611938477e-08,64.2933578491211,0.94987028837204,2.10040807723999,64.2729568481445,-1.49923431873322,3.21312236785889,64.2094116210938,-0.273770451545715,1.05755019187927,64.2933578491211,-0.27705991268158,2.12460088729858,64.2719116210938,0.961963951587677,-5.82782793045044,0.87658029794693,12.2669315338135,-4.49155855178833,1.37641441822052,14.0920448303223, +-7.34170055389404,1.75048744678497,14.662015914917,-8.45103931427002,1.15551567077637,12.4769144058228,-2.02685952186584,1.06351685523987,13.2234802246094,0,1.49595594406128,14.5824871063232,-2.54056453704834,1.93354535102844,15.7531719207764,-5.96046447753906e-08,2.50016498565674,17.1869602203369,-3.05776143074036,3.06130647659302,18.3634071350098,-5.53299808502197,2.40176248550415,16.6452827453613,-8.87483978271484,2.92658829689026,17.1279182434082,-10.4825000762939,2.21149134635925,14.8025436401367,2.02685952186584,1.06351685523987,13.2234802246094,4.49155855178833,1.37641441822052,14.0920448303223,2.54056453704834,1.93354535102844,15.7531728744507,5.82782793045044,0.87658029794693,12.2669324874878,8.45103931427002,1.15551567077637,12.4769144058228,7.34170055389404,1.75048744678497,14.662015914917,10.4825000762939,2.21149134635925,14.8025436401367,8.87483978271484,2.92658829689026,17.1279201507568,5.53299808502197,2.40176248550415,16.6452827453613,3.05776143074036,3.06130647659302,18.3634071350098,-10.9026031494141,0.570071697235107,7.0845160484314,-11.4033050537109,0.992497622966766,9.61289691925049,-14.0665016174316,1.42103004455566,8.55043506622314,-13.2148475646973,0.900213122367859,5.78098487854004,-8.87054443359375,0.684403896331787,10.1929206848145,-11.3028602600098,1.55224668979645,12.2392072677612,-13.7965898513794,2.76240491867065,14.3328218460083,-14.308032989502,2.0528552532196,11.4538631439209,-17.3577651977539,2.63367986679077,10.0195007324219,-16.7272644042969,1.95088398456573,6.90660953521729,8.87054443359375,0.684403896331787,10.1929216384888,11.4033050537109,0.992497622966766,9.61289691925049,11.3028602600098,1.55224668979645,12.2392072677612,10.9026031494141,0.570071756839752,7.0845160484314,13.2148475646973,0.900213122367859,5.78098487854004,14.0665016174316,1.42103004455566,8.55043506622314,16.7272644042969,1.95088398456573,6.90660905838013,17.3577632904053,2.63367986679077,10.0195007324219,14.308032989502,2.0528552532196,11.4538631439209,13.7965908050537,2.76240491867065,14.3328218460083,-11.9784421920776,0.508832037448883,-0.900224626064301, +-13.8336038589478,0.866331398487091,1.33815622329712,-15.535982131958,1.3427323102951,-1.09064042568207,-13.3544826507568,0.873802185058594,-3.30793929100037,-11.9246912002563,0.51805454492569,3.26876020431519,-15.4775304794312,1.35337579250336,3.96755790710449,-19.224760055542,2.56500744819641,4.59484148025513,-17.5531444549561,1.91279721260071,1.57093524932861,-19.3202686309814,2.56855082511902,-1.42927026748657,-16.9121475219727,1.93742263317108,-4.03859329223633,11.9246912002563,0.518054604530334,3.26876020431519,13.8336038589478,0.866331398487091,1.33815598487854,15.4775304794312,1.35337579250336,3.96755790710449,11.9784421920776,0.508832037448883,-0.900224685668945,13.3544826507568,0.873802185058594,-3.30793929100037,15.535982131958,1.34273219108582,-1.09064042568207,16.9121475219727,1.93742263317108,-4.03859329223633,19.3202667236328,2.56855082511902,-1.42927002906799,17.5531444549561,1.91279721260071,1.5709353685379,19.224760055542,2.56500744819641,4.59484148025513,-9.33793544769287,0.583281576633453,-8.71039581298828,-11.8475131988525,0.917125463485718,-7.71841955184937,-11.9949951171875,1.48649084568024,-10.6553192138672,-9.08643054962158,1.06482195854187,-11.3176832199097,-11.1464252471924,0.518892347812653,-5.0412483215332,-14.3970241546631,1.37945771217346,-6.1584620475769,-17.8232650756836,2.64404249191284,-7.4359564781189,-14.9265632629395,2.02554559707642,-9.3591251373291,-14.7178144454956,2.78824949264526,-12.7017002105713,-11.3800287246704,2.19808340072632,-13.6425113677979,11.1464252471924,0.518892347812653,-5.04124879837036,11.8475131988525,0.917125463485718,-7.71841955184937,14.3970241546631,1.37945771217346,-6.15846252441406,9.33793544769287,0.583281576633453,-8.71039485931396,9.08643054962158,1.06482195854187,-11.3176832199097,11.9949951171875,1.48649084568024,-10.6553192138672,11.3800287246704,2.19808340072632,-13.6425113677979,14.7178144454956,2.78824949264526,-12.7017002105713,14.9265632629395,2.02554559707642,-9.3591251373291,17.8232650756836,2.64404249191284,-7.43595600128174,-2.21069979667664,1.05221354961395,-12.8030691146851, +-4.92565536499023,1.35010051727295,-13.5727634429932,-2.82220125198364,1.97078967094421,-15.5014505386353,-2.98023223876953e-08,1.52027654647827,-14.3432140350342,-6.288987159729,0.795604050159454,-11.4010200500488,-8.04340171813965,1.71935105323792,-13.8857336044312,-9.79305839538574,2.99497604370117,-16.3963508605957,-6.14845275878906,2.44869899749756,-16.2170810699463,-3.42474699020386,3.17973160743713,-18.1742572784424,5.96046447753906e-08,2.58739042282104,-17.0553131103516,6.288987159729,0.79560399055481,-11.4010210037231,4.92565536499023,1.35010051727295,-13.5727624893188,8.04340171813965,1.71935105323792,-13.8857336044312,2.21069979667664,1.05221366882324,-12.8030691146851,2.82220125198364,1.97078967094421,-15.5014505386353,3.42474699020386,3.17973136901855,-18.1742553710938,6.14845275878906,2.44869899749756,-16.2170829772949,9.79305553436279,2.99497604370117,-16.3963527679443,3.85634183883667,0.195144206285477,-7.10901212692261,2.94292664527893,0.299724757671356,-8.57401466369629,4.79822778701782,0.343176245689392,-9.14569759368896,5.25179672241211,0.196017801761627,-7.45017290115356,1.38226389884949,0.241727232933044,-7.5434684753418,0,0.366247266530991,-8.96478462219238,1.69898653030396,0.50540417432785,-10.1696243286133,0,0.779715240001678,-11.6409912109375,3.79451060295105,0.637910783290863,-11.0091428756714,6.96465253829956,0.408279001712799,-9.17933750152588,-1.38226389884949,0.241727232933044,-7.5434684753418,-2.94292664527893,0.299724787473679,-8.57401466369629,-1.69898653030396,0.505404114723206,-10.1696243286133,-3.85634183883667,0.195144206285477,-7.10901212692261,-5.25179672241211,0.196017801761627,-7.45017290115356,-4.79822778701782,0.343176245689392,-9.14569759368896,-6.96465253829956,0.408279001712799,-9.17933750152588,-3.79451060295105,0.637910723686218,-11.0091419219971,5.40629911422729,0.140695542097092,-3.58198022842407,6.42537784576416,0.14794585108757,-5.2208080291748,8.18353843688965,0.182971149682999,-4.139075756073,7.02466440200806,0.143999457359314,-2.27737307548523,4.91762065887451,0.158726587891579,-6.06546258926392, +6.99088048934937,0.214222580194473,-7.08211040496826,8.99850654602051,0.308347284793854,-6.28316164016724,10.0588531494141,0.29455503821373,-2.7158145904541,-4.91762113571167,0.158726587891579,-6.06546211242676,-6.42537784576416,0.14794585108757,-5.2208080291748,-6.99088048934937,0.214222580194473,-7.08211040496826,-5.40629911422729,0.140695542097092,-3.58197999000549,-7.0246639251709,0.143999457359314,-2.27737307548523,-8.18353843688965,0.182971149682999,-4.13907527923584,-10.0588531494141,0.29455503821373,-2.7158145904541,-8.99850654602051,0.308347254991531,-6.28316164016724,5.64678859710693,0.142828151583672,2.37975287437439,7.20352268218994,0.144424885511398,0.930728554725647,8.66643142700195,0.187897101044655,2.72545170783997,6.94884157180786,0.15348407626152,4.06491851806641,5.67351818084717,0.141120582818985,-0.645026028156281,8.70915508270264,0.182769596576691,-0.743721842765808,10.3795461654663,0.293589472770691,1.09358739852905,9.94618892669678,0.314710736274719,4.7760157585144,-5.67351818084717,0.141120582818985,-0.645026028156281,-7.20352268218994,0.144424870610237,0.930728554725647,-8.70915603637695,0.182769626379013,-0.743721842765808,-5.64678859710693,0.142828151583672,2.37975287437439,-6.94884204864502,0.15348407626152,4.06491851806641,-8.66643142700195,0.187897086143494,2.72545146942139,-9.94618892669678,0.314710736274719,4.7760157585144,-10.3795461654663,0.293589502573013,1.09358739852905,4.74417400360107,0.189501628279686,7.48098468780518,6.24214172363281,0.184716537594795,6.79598951339722,6.69830989837646,0.287026137113571,8.52749061584473,5.00817203521729,0.252423822879791,8.74218368530273,5.30990982055664,0.151884064078331,5.20033693313599,8.01829719543457,0.216871589422226,5.92656469345093,8.69985008239746,0.379977643489838,7.97837066650391,6.5626163482666,0.505668997764587,10.3830280303955,-5.30990982055664,0.151884064078331,5.20033693313599,-6.24214172363281,0.184716522693634,6.79598903656006,-8.01829719543457,0.216871604323387,5.92656469345093,-4.74417400360107,0.189501628279686,7.48098468780518, +-5.00817203521729,0.252423822879791,8.74218368530273,-6.69830989837646,0.287026166915894,8.52749061584473,-6.5626163482666,0.505668997764587,10.3830270767212,-8.69984912872314,0.379977643489838,7.97837018966675,3.52429914474487,0.685615479946136,11.7378616333008,4.51759815216064,0.406929433345795,10.1958875656128,0,0.784738421440125,12.1482353210449,1.58841025829315,0.523874819278717,10.918140411377,1.49011611938477e-08,0.372937977313995,9.86058521270752,1.32038927078247,0.248870298266411,8.65421867370605,2.78442168235779,0.327819228172302,9.60247325897217,3.68965721130371,0.223594516515732,8.3649377822876,-3.52429914474487,0.685615479946136,11.7378606796265,-1.58841025829315,0.523874819278717,10.918140411377,-4.51759815216064,0.406929433345795,10.1958866119385,-3.68965697288513,0.223594516515732,8.3649377822876,-2.78442168235779,0.327819228172302,9.60247325897217,-1.32038927078247,0.248870298266411,8.65421867370605,4.15600919723511,0.139402151107788,-2.07885122299194,2.69117712974548,0.13841138780117,-3.45445847511292,3.91657853126526,0.144863277673721,-4.79574060440063,1.37553834915161,0.138249963521957,-2.07147860527039,1.49011611938477e-08,0.138154059648514,-3.49248051643372,1.32047379016876,0.148447036743164,-4.85104370117188,0,0.183659821748734,-6.25967025756836,2.60875082015991,0.171121805906296,-6.10376310348511,-1.37553834915161,0.138249963521957,-2.07147884368896,-2.69117712974548,0.138411372900009,-3.45445847511292,-1.32047379016876,0.148447021842003,-4.85104370117188,-4.15600967407227,0.139402151107788,-2.07885122299194,-3.91657829284668,0.14486326277256,-4.79574012756348,-2.60875082015991,0.171121805906296,-6.10376310348511,1.36247336864471,0.138632297515869,3.59570240974426,2.64755654335022,0.140038162469864,4.95175552368164,1.28892540931702,0.149799346923828,6.22378921508789,0,0.138723075389862,4.94081211090088,4.11471509933472,0.14160293340683,3.6932897567749,3.81829142570496,0.154291972517967,6.2619686126709,2.52042412757874,0.179170519113541,7.40804624557495,0,0.18567205965519,7.49484252929688,-4.11471462249756,0.14160293340683,3.6932897567749, +-2.64755654335022,0.140038162469864,4.95175552368164,-3.81829142570496,0.154291972517967,6.2619686126709,-1.36247336864471,0.138632297515869,3.59570217132568,-1.28892540931702,0.149799332022667,6.22378873825073,-2.52042412757874,0.179170504212379,7.40804624557495,2.78423643112183,0.138967990875244,2.23060941696167,4.23556900024414,0.139640390872955,0.83260715007782,-2.98023223876953e-08,0.138538300991058,2.20279264450073,1.39743232727051,0.138442814350128,0.787141382694244,0,0.138345718383789,-0.651809096336365,2.79683661460876,0.138624310493469,-0.635369062423706,-2.78423643112183,0.138967990875244,2.23060917854309,-1.39743232727051,0.138442814350128,0.7871413230896,-4.23556900024414,0.139640390872955,0.83260715007782,-2.79683637619019,0.138624295592308,-0.635369062423706,17.1971549987793,3.3725700378418,13.1452617645264,16.1382064819336,4.19685220718384,16.1817283630371,12.442813873291,3.51303219795227,17.0185279846191,20.3202476501465,3.27357864379883,7.85205698013306,20.5609188079834,4.07498502731323,11.2183399200439,23.6752510070801,4.91570377349854,8.54373073577881,19.8412132263184,5.0043568611145,14.5936765670776,14.1991777420044,5.13322591781616,19.0472259521484,21.4431056976318,3.25408267974854,1.58795261383057,22.9845409393311,4.02443504333496,4.94535160064697,20.6371250152588,3.31404638290405,-4.96370553970337,23.1780414581299,4.06741762161255,-2.01472544670105,24.1701030731201,5.03743553161621,-6.03662490844727,25.1370296478271,4.93593597412109,1.37367129325867,18.0193958282471,3.44423913955688,-11.0670728683472,21.2313747406006,4.18307256698608,-8.82539176940918,13.5407009124756,3.61830854415894,-15.9056358337402,17.2377681732178,4.33998441696167,-14.669605255127,15.3739757537842,5.31198167800903,-18.0330543518066,20.83376121521,5.17677450180054,-12.7643823623657,7.25482892990112,3.79729866981506,-18.7715930938721,11.2937421798706,4.49617528915405,-18.7497787475586,2.98023223876953e-08,3.88376140594482,-19.6900844573975,3.92309427261353,4.602463722229,-20.7284927368164,-1.19209289550781e-07,5.43913555145264,-22.2280731201172, +8.14858055114746,5.40493154525757,-21.1948318481445,-7.25482892990112,3.79729843139648,-18.7715930938721,-3.92309427261353,4.602463722229,-20.7284927368164,-13.5407018661499,3.61830854415894,-15.9056358337402,-11.2937421798706,4.49617528915405,-18.7497787475586,-15.3739757537842,5.31198167800903,-18.0330543518066,-8.14858055114746,5.40493154525757,-21.1948318481445,-18.0193996429443,3.44423937797546,-11.0670728683472,-17.2377681732178,4.33998441696167,-14.669605255127,-20.6371250152588,3.31404662132263,-4.96370553970337,-21.2313747406006,4.18307304382324,-8.82539176940918,-24.1701030731201,5.03743553161621,-6.03662490844727,-20.83376121521,5.17677450180054,-12.7643823623657,-21.4431056976318,3.25408244132996,1.58795261383057,-23.1780414581299,4.06741714477539,-2.01472544670105,-20.3202495574951,3.27357864379883,7.85205698013306,-22.9845409393311,4.02443552017212,4.94535160064697,-23.6752510070801,4.91570329666138,8.54373168945313,-25.1370296478271,4.93593645095825,1.37367141246796,-17.1971549987793,3.3725700378418,13.1452617645264,-20.5609188079834,4.07498550415039,11.2183399200439,-12.442813873291,3.51303219795227,17.0185279846191,-16.1382064819336,4.19685173034668,16.1817283630371,-14.1991777420044,5.13322591781616,19.0472259521484,-19.8412132263184,5.00435638427734,14.5936765670776,-6.51862096786499,3.64747214317322,19.1537666320801,-10.2684421539307,4.32474613189697,19.4269866943359,0,3.70963168144226,19.7842273712158,-3.5204005241394,4.40735769271851,20.8997325897217,-2.98023223876953e-08,5.26101303100586,22.3583736419678,-7.3893666267395,5.22642230987549,21.5782928466797,6.51862096786499,3.64747214317322,19.1537685394287,3.5204005241394,4.40735769271851,20.8997325897217,10.2684421539307,4.32474613189697,19.4269866943359,7.3893666267395,5.22642183303833,21.5782928466797,-10.1738805770874,23.4728889465332,30.8690071105957,-14.9882144927979,25.7504177093506,28.873462677002,-19.3383197784424,23.4768390655518,26.3467655181885,-5.96046447753906e-08,23.4811592102051,32.4631309509277,-5.16858243942261,25.7236633300781,32.0065803527832, +0,28.0608234405518,32.1300354003906,-10.1743144989014,28.0974960327148,30.5251960754395,-19.3040733337402,28.178768157959,25.9703826904297,-26.5338478088379,23.531867980957,19.2945594787598,-29.1587677001953,25.9197616577148,14.8595886230469,-31.1008338928223,23.6798572540283,10.4185037612915,-23.2552394866943,25.80712890625,22.9657745361328,-26.4034557342529,28.2784194946289,18.8711643218994,-30.839054107666,28.4428443908691,9.9890661239624,-32.5334281921387,23.9311847686768,0.502245485782623,-31.9421520233154,26.385555267334,-4.70306062698364,-30.9487686157227,24.1041946411133,-9.51325416564941,-32.1120796203613,26.137056350708,5.34850120544434,-32.1392631530762,28.7007942199707,0.156959295272827,-30.4508724212646,28.902551651001,-9.72010612487793,-26.5670146942139,24.0364513397217,-18.6631259918213,-23.1887493133545,26.3666534423828,-22.6831378936768,-19.6034088134766,23.8729457855225,-25.996337890625,-28.8896789550781,26.4695892333984,-14.3598518371582,-26.0253925323486,28.9040012359619,-18.725154876709,-19.1240787506104,28.7731018066406,-25.9418411254883,-10.3935556411743,23.7814292907715,-30.6491069793701,-5.2145528793335,26.1424617767334,-31.8929653167725,0,23.7588119506836,-32.2673263549805,-15.0668535232544,26.2273979187012,-28.7307052612305,-10.115273475647,28.6137676239014,-30.5328369140625,0,28.5335998535156,-32.1343841552734,10.3935556411743,23.7814292907715,-30.6491107940674,15.0668535232544,26.2273979187012,-28.7307071685791,19.6034088134766,23.8729457855225,-25.996337890625,5.2145528793335,26.1424617767334,-31.8929672241211,10.115273475647,28.6137676239014,-30.5328369140625,19.1240787506104,28.7731037139893,-25.9418411254883,26.5670127868652,24.0364513397217,-18.6631259918213,28.8896770477295,26.4695892333984,-14.3598518371582,30.9487686157227,24.1041946411133,-9.51325607299805,23.1887474060059,26.3666534423828,-22.6831378936768,26.025390625,28.9040012359619,-18.725154876709,30.4508743286133,28.902551651001,-9.72010612487793,32.5334243774414,23.9311847686768,0.502245366573334,32.1120758056641,26.1370582580566,5.34850072860718, +31.1008338928223,23.6798553466797,10.4185037612915,31.9421501159668,26.385555267334,-4.70306062698364,32.1392631530762,28.7007942199707,0.156959176063538,30.8390560150146,28.4428443908691,9.9890661239624,26.5338516235352,23.5318641662598,19.2945613861084,23.2552394866943,25.8071269989014,22.9657745361328,19.3383197784424,23.4768352508545,26.3467655181885,29.1587677001953,25.9197578430176,14.8595867156982,26.4034595489502,28.2784214019775,18.8711643218994,19.3040733337402,28.178768157959,25.9703826904297,10.1738805770874,23.4728889465332,30.8690071105957,5.16858243942261,25.7236633300781,32.0065803527832,14.9882125854492,25.750415802002,28.873462677002,10.1743144989014,28.0974960327148,30.5251960754395,14.9511194229126,59.810718536377,-5.87693738937378,13.5264720916748,60.865104675293,-2.98676037788391,15.786581993103,59.7746047973633,-0.743583083152771,17.5027847290039,58.6268997192383,-3.68020057678223,11.0549507141113,61.8025207519531,-4.63714456558228,9.63155174255371,62.5497627258301,-2.27474045753479,11.681360244751,61.7560424804688,-0.522758483886719,9.72078323364258,62.4921112060547,1.45309841632843,11.2027025222778,61.6864852905273,3.64266681671143,13.5825109481812,60.7928237915039,1.72008371353149,15.0310802459717,59.6626167297363,4.44094228744507,17.5384922027588,58.5298347473145,2.07338118553162,-9.72078227996826,62.4921112060547,1.45309841632843,-11.681360244751,61.7560424804688,-0.522758424282074,-13.5825109481812,60.7928237915039,1.72008371353149,-11.2027015686035,61.6864852905273,3.64266681671143,-9.63155174255371,62.5497627258301,-2.27474021911621,-11.0549507141113,61.8025207519531,-4.63714408874512,-13.5264711380005,60.865104675293,-2.98676013946533,-14.951117515564,59.810718536377,-5.87693738937378,-17.5027828216553,58.6268997192383,-3.68020057678223,-15.786581993103,59.7746047973633,-0.743583142757416,-17.5384902954102,58.5298271179199,2.07338094711304,-15.031078338623,59.6626091003418,4.44094228744507,8.93019866943359,62.4634017944336,5.05765342712402,9.62848567962646,61.6322212219238,7.42407131195068, +12.2851800918579,60.6981315612793,6.21391296386719,7.26798105239868,62.4379806518555,8.12450504302979,7.08427000045776,61.515209197998,10.3580503463745,9.76331901550293,60.5709838867188,10.0086965560913,9.19899463653564,59.307746887207,12.7170543670654,12.4044256210327,58.1977767944336,12.1225957870483,12.7287874221802,59.5219078063965,9.07767295837402,15.7670850753784,58.3830032348633,7.52876901626587,-7.26798057556152,62.4379806518555,8.12450504302979,-9.62848567962646,61.6322212219238,7.42407131195068,-9.76331901550293,60.5709838867188,10.0086965560913,-7.08427000045776,61.515209197998,10.3580503463745,-8.93019866943359,62.4634017944336,5.05765342712402,-12.2851810455322,60.6981315612793,6.21391296386719,-15.7670850753784,58.382999420166,7.52876949310303,-12.7287874221802,59.5219039916992,9.07767391204834,-12.4044256210327,58.1977767944336,12.1225967407227,-9.19899463653564,59.307746887207,12.7170543670654,4.76983022689819,62.3053741455078,10.1706094741821,3.74841022491455,61.28173828125,12.0535154342651,6.27597236633301,60.335205078125,12.6613702774048,1.65811705589294,62.1246948242188,11.0740547180176,0,61.1407470703125,12.5816211700439,2.1616542339325,60.085018157959,13.9690532684326,0,58.8317070007324,15.7500629425049,2.70988988876343,57.6310729980469,17.1490592956543,4.81508922576904,59.0013809204102,14.9789247512817,7.90066528320313,57.9116897583008,15.4251728057861,-1.65811705589294,62.1246948242188,11.0740537643433,-3.74841022491455,61.28173828125,12.0535154342651,-2.1616542339325,60.085018157959,13.9690523147583,-4.76983022689819,62.3053741455078,10.1706085205078,-6.27597236633301,60.3352012634277,12.6613693237305,-7.90066528320313,57.9116859436035,15.4251728057861,-4.81508922576904,59.0013771057129,14.9789247512817,-2.70988988876343,57.6310729980469,17.1490592956543,-8.68184280395508,62.5771713256836,-5.78006601333618,-9.35900497436523,61.7695083618164,-8.2785530090332,-12.1184339523315,60.8588829040527,-7.37762212753296,-6.9319806098938,62.5067520141602,-8.71532154083252,-6.78325080871582,61.6088638305664,-11.0754451751709, +-9.52200222015381,60.7453079223633,-10.9991941452026,-9.02613353729248,59.5459518432617,-13.7824993133545,-12.3000679016113,58.42236328125,-13.4363431930542,-12.5775718688965,59.722541809082,-10.36403465271,-15.6784019470215,58.5889434814453,-9.03493309020996,6.93198013305664,62.5067520141602,-8.71532249450684,9.35900402069092,61.7695083618164,-8.27855396270752,9.52200222015381,60.7453079223633,-10.9991941452026,6.78325080871582,61.6088638305664,-11.0754451751709,8.68184280395508,62.5771713256836,-5.78006649017334,12.1184349060059,60.8588829040527,-7.37762212753296,15.6784029006958,58.5889434814453,-9.03493213653564,12.5775718688965,59.722541809082,-10.3640356063843,12.3000679016113,58.42236328125,-13.4363422393799,9.02613353729248,59.5459518432617,-13.7824993133545,-4.48327922821045,62.262565612793,-10.7311859130859,-3.55771899223328,61.3165855407715,-12.7211284637451,-6.06301736831665,60.5228080749512,-13.4738531112671,-1.54844164848328,61.9735565185547,-11.6960611343384,-2.98023223876953e-08,61.1453094482422,-13.2475814819336,-2.07930850982666,60.301082611084,-14.6619892120361,-2.98023223876953e-08,59.2392272949219,-16.4485836029053,-2.67937922477722,58.086597442627,-17.9640979766846,-4.70468854904175,59.3420715332031,-15.7996797561646,-7.818772315979,58.2252159118652,-16.4725379943848,1.54844164848328,61.9735565185547,-11.6960601806641,3.55771899223328,61.3165855407715,-12.7211284637451,2.07930850982666,60.301082611084,-14.6619911193848,4.48327922821045,62.262565612793,-10.7311868667603,6.06301736831665,60.5228080749512,-13.4738540649414,7.818772315979,58.2252159118652,-16.4725379943848,4.70468854904175,59.3420715332031,-15.7996788024902,2.67937922477722,58.086597442627,-17.9640998840332,3.73673343658447,51.8710556030273,22.8869323730469,6.91034460067749,53.6962661743164,20.7679443359375,3.24108743667603,55.0636100769043,20.1620254516602,-2.98023223876953e-08,53.5362396240234,21.834644317627,10.8715629577637,52.1052398681641,20.7011375427246,13.1984701156616,53.9446601867676,17.6486072540283,9.44235992431641,55.3221282958984,18.1543636322021, +11.2865142822266,56.8090286254883,15.2101669311523,5.89541244506836,56.5054893493652,17.9710597991943,-2.98023223876953e-08,56.3330116271973,18.933198928833,-10.8715629577637,52.1052398681641,20.7011375427246,-6.91034460067749,53.6962661743164,20.7679443359375,-9.44235992431641,55.3221282958984,18.1543636322021,-13.1984701156616,53.9446601867676,17.6486072540283,-3.73673343658447,51.8710517883301,22.8869323730469,-3.24108743667603,55.0636100769043,20.1620254516602,-5.89541244506836,56.505485534668,17.9710597991943,-11.2865142822266,56.809024810791,15.2101669311523,4.57564449310303,42.2156524658203,27.4850616455078,8.67873191833496,45.0884780883789,25.5033206939697,4.18546962738037,47.5257530212402,25.2855186462402,5.96046447753906e-08,44.9209671020508,26.6980133056641,13.3122806549072,42.4737358093262,24.9819507598877,16.5695762634277,45.3688926696777,21.8915863037109,12.1797657012939,47.77783203125,22.9662475585938,14.9723987579346,50.1891441345215,19.8996143341064,7.84554481506348,49.9481735229492,23.2756214141846,-5.96046447753906e-08,49.7882881164551,24.4028186798096,-13.3122806549072,42.4737358093262,24.9819507598877,-8.67873191833496,45.0884780883789,25.5033206939697,-12.1797657012939,47.77783203125,22.9662475585938,-16.5695762634277,45.3688850402832,21.8915863037109,-4.57564449310303,42.2156562805176,27.4850616455078,-4.18546962738037,47.5257530212402,25.2855186462402,-7.84554481506348,49.9481735229492,23.2756214141846,-14.9723987579346,50.1891441345215,19.8996143341064,16.9904823303223,52.256778717041,16.384822845459,18.2509136199951,54.0355415344238,12.6482696533203,14.8009223937988,55.5417633056641,14.2889928817749,21.4658889770508,52.2804298400879,10.3079519271851,21.5067710876465,54.1012916564941,6.32221126556396,18.7704639434814,55.6471786499023,8.91276550292969,18.5425567626953,57.1461639404297,5.34608554840088,15.6693983078003,57.0062065124512,10.856333732605,-21.4658889770508,52.2804298400879,10.3079519271851,-18.2509155273438,54.0355415344238,12.6482696533203,-18.7704639434814,55.6471786499023,8.912766456604, +-21.5067710876465,54.1012916564941,6.32221126556396,-16.9904823303223,52.256778717041,16.384822845459,-14.8009223937988,55.5417633056641,14.2889928817749,-15.6693983078003,57.0062065124512,10.856333732605,-18.5425548553467,57.1461639404297,5.34608602523804,19.474946975708,57.2971000671387,-0.813641488552094,20.7412738800049,55.9335289001465,-4.09806060791016,18.4559059143066,57.3549270629883,-6.92419004440308,20.8201580047607,55.7851219177246,2.56943106651306,23.7198524475098,52.4025497436523,3.15516424179077,22.5040435791016,54.2822380065918,-0.694090247154236,23.5711612701416,52.5954742431641,-4.34649705886841,21.3216991424561,54.3882217407227,-7.66764736175537,-19.474946975708,57.2971038818359,-0.813641607761383,-20.8201580047607,55.7851219177246,2.56943106651306,-18.4559059143066,57.3549270629883,-6.92419004440308,-20.7412738800049,55.9335327148438,-4.09806060791016,-21.3216972351074,54.3882217407227,-7.66764736175537,-23.5711612701416,52.5954742431641,-4.34649705886841,-22.5040435791016,54.2822418212891,-0.694090247154236,-23.7198524475098,52.4025497436523,3.15516424179077,21.2353057861328,52.577507019043,-11.4275817871094,18.1442775726318,54.2253227233887,-13.8831539154053,18.6471652984619,55.9015197753906,-10.3475589752197,16.9460277557373,52.2895889282227,-17.4550018310547,13.2489461898804,53.9077186584473,-18.8288917541504,14.7746152877808,55.6713829040527,-15.5799875259399,11.25621509552,56.9924545288086,-16.4468593597412,15.5903415679932,57.2200889587402,-12.2921028137207,-16.9460296630859,52.2895851135254,-17.4550037384033,-18.1442813873291,54.2253227233887,-13.8831539154053,-14.7746152877808,55.6713829040527,-15.5799875259399,-13.2489461898804,53.90771484375,-18.8288917541504,-21.2353038787842,52.577507019043,-11.4275808334351,-18.6471652984619,55.9015197753906,-10.3475589752197,-15.5903406143188,57.2200889587402,-12.292103767395,-11.25621509552,56.9924545288086,-16.4468612670898,10.9553318023682,51.8952674865723,-21.9320373535156,6.9808030128479,53.5996856689453,-22.0470142364502,9.48383235931396,55.3986320495605,-19.3393478393555, +3.78306245803833,51.5872039794922,-24.3904438018799,-2.98023223876953e-08,53.4580993652344,-23.1992931365967,3.26445460319519,55.2116355895996,-21.3083343505859,0,56.7145690917969,-19.8672523498535,5.88938045501709,56.7974891662598,-19.0034732818604,-3.78306245803833,51.5872039794922,-24.3904438018799,-6.9808030128479,53.5996856689453,-22.0470142364502,-3.26445460319519,55.2116355895996,-21.3083362579346,-10.9553318023682,51.895263671875,-21.9320373535156,-9.48383235931396,55.3986320495605,-19.3393478393555,-5.88938045501709,56.7974891662598,-19.0034732818604,20.8049621582031,42.7199897766113,19.9611434936523,22.894889831543,45.5230941772461,15.9249925613403,19.0441265106201,47.9701881408691,18.3012981414795,26.2783870697021,42.8815307617188,12.7990560531616,26.9384689331055,45.6541976928711,8.26012516021729,24.0678596496582,48.04541015625,11.6494216918945,24.3173809051514,50.3178787231445,7.32568740844727,20.6740818023682,50.2606048583984,14.3717222213745,-26.2783870697021,42.8815307617188,12.7990560531616,-22.8948879241943,45.5230941772461,15.924991607666,-24.0678596496582,48.04541015625,11.6494216918945,-26.9384689331055,45.6541976928711,8.26012516021729,-20.8049621582031,42.7199859619141,19.961145401001,-19.0441265106201,47.9701881408691,18.3012981414795,-20.6740818023682,50.2606048583984,14.3717222213745,-24.3173809051514,50.3178787231445,7.32568740844727,29.0112628936768,43.0825233459473,4.26309061050415,28.1143341064453,45.872501373291,-0.323607861995697,26.5828628540039,48.2004928588867,3.75452709197998,28.7687892913818,43.2812538146973,-4.77016305923462,26.5562763214111,45.9891586303711,-8.9042854309082,26.381175994873,48.3998336791992,-4.56902503967285,24.0226993560791,50.6455917358398,-8.3065071105957,25.3890781402588,50.5203170776367,-0.503127694129944,-28.7687892913818,43.28125,-4.77016305923462,-28.1143341064453,45.872501373291,-0.323607921600342,-26.3811779022217,48.399829864502,-4.56902551651001,-26.5562763214111,45.9891586303711,-8.9042854309082,-29.0112648010254,43.0825233459473,4.26309061050415, +-26.5828647613525,48.2004928588867,3.75452709197998,-25.3890800476074,50.5203170776367,-0.503127694129944,-24.0227012634277,50.6455917358398,-8.3065071105957,25.8026599884033,43.2701530456543,-13.3149347305298,22.5340576171875,45.8082885742188,-16.5854911804199,23.7149753570557,48.3751983642578,-12.4364156723022,20.4520225524902,42.9850921630859,-20.5823631286621,16.4134750366211,45.3909301757813,-22.7663440704346,18.8709945678711,48.0568466186523,-19.141809463501,14.9764938354492,50.065731048584,-20.9424514770508,20.4630908966064,50.4622344970703,-15.3027820587158,-20.4520206451416,42.9850959777832,-20.5823631286621,-22.5340576171875,45.8082885742188,-16.5854911804199,-18.8709964752197,48.0568466186523,-19.141809463501,-16.4134750366211,45.3909301757813,-22.7663440704346,-25.8026599884033,43.270149230957,-13.3149337768555,-23.7149772644043,48.3751945495605,-12.4364147186279,-20.4630928039551,50.4622344970703,-15.3027820587158,-14.9764947891235,50.065731048584,-20.9424514770508,13.1435022354126,42.5053825378418,-25.9805011749268,8.63588047027588,44.8755416870117,-26.8941879272461,12.1705207824707,47.5734977722168,-24.1583671569824,4.52654838562012,42.0680961608887,-28.946475982666,1.19209289550781e-07,44.6084976196289,-28.4101181030273,4.19816160202026,47.1606597900391,-26.9446582794189,2.98023223876953e-08,49.4039001464844,-26.1003818511963,7.90254831314087,49.6230926513672,-24.7138710021973,-4.52654838562012,42.0680961608887,-28.9464778900146,-8.63588047027588,44.8755416870117,-26.8941879272461,-4.19816160202026,47.1606636047363,-26.9446601867676,-13.1435022354126,42.5053825378418,-25.9805011749268,-12.1705207824707,47.5734977722168,-24.1583671569824,-7.90254831314087,49.6231002807617,-24.7138710021973,3.92930674552917,6.26993846893311,23.4705085754395,8.15711402893066,7.47855806350708,24.0842437744141,4.29416751861572,8.95424652099609,26.1633701324463,-5.96046447753906e-08,7.51535987854004,25.0550155639648,11.4949531555176,6.20981073379517,21.6785621643066,15.700174331665,7.37881326675415,21.0747299194336,12.5534868240356,8.86651134490967,24.0013847351074, +16.9555397033691,10.4315185546875,23.067066192627,13.471851348877,12.3538799285889,26.1535186767578,8.83376693725586,10.5671997070313,26.584529876709,4.6189603805542,12.4695491790771,28.6787147521973,1.19209289550781e-07,10.627477645874,27.760368347168,-11.4949531555176,6.20981073379517,21.6785621643066,-8.15711402893066,7.47855854034424,24.0842418670654,-12.5534858703613,8.86651039123535,24.0013847351074,-15.700174331665,7.37881326675415,21.0747299194336,-3.92930674552917,6.26993846893311,23.4705085754395,-4.29416751861572,8.95424652099609,26.1633701324463,-4.6189603805542,12.4695491790771,28.6787128448486,-8.83376693725586,10.5672006607056,26.584529876709,-13.4718494415283,12.3538789749146,26.1535186767578,-16.9555377960205,10.4315185546875,23.067066192627,18.1817016601563,6.09427928924561,17.8991050720215,21.9981784820557,7.24212741851807,15.9682865142822,19.8257598876953,8.7262077331543,19.6183013916016,23.3369178771973,5.97571134567261,12.2433223724365,26.318359375,7.16521739959717,9.13527202606201,25.406421661377,8.60622501373291,13.2227001190186,28.1869659423828,10.2328147888184,9.69045066833496,26.9717922210693,12.1107063293457,14.1063022613525,23.6505069732666,10.2864322662354,17.2843322753906,21.1696434020996,12.2044305801392,21.1884956359863,-23.3369178771973,5.97571134567261,12.2433233261108,-21.9981784820557,7.24212694168091,15.9682865142822,-25.406421661377,8.60622406005859,13.2227001190186,-26.318359375,7.16521739959717,9.13527202606201,-18.1817016601563,6.09427928924561,17.8991050720215,-19.8257598876953,8.7262077331543,19.6183013916016,-21.1696434020996,12.2044296264648,21.1884956359863,-23.6505088806152,10.286431312561,17.2843322753906,-26.971794128418,12.1107063293457,14.1063022613525,-28.1869659423828,10.2328147888184,9.69045066833496,26.2412719726563,5.95410966873169,5.12915372848511,27.9970836639404,7.22876024246216,1.10099196434021,28.544376373291,8.61716270446777,5.29084587097168,26.5217208862305,6.04209613800049,-2.71328091621399,26.8871765136719,7.3464822769165,-7.10811901092529,28.8267307281494,8.73627281188965,-3.36320328712463, +28.6801719665527,10.4494018554688,-8.04654979705811,30.3809795379639,12.3175182342529,-3.86703658103943,29.9137840270996,10.3396139144897,0.884094893932343,30.1672534942627,12.1698303222656,5.4668869972229,-26.5217208862305,6.04209566116333,-2.71328115463257,-27.9970836639404,7.22876071929932,1.10099196434021,-28.8267307281494,8.73627185821533,-3.36320328712463,-26.8871765136719,7.3464822769165,-7.10811901092529,-26.2412719726563,5.95410966873169,5.12915420532227,-28.544376373291,8.61716270446777,5.29084539413452,-30.1672534942627,12.1698303222656,5.4668869972229,-29.9137840270996,10.3396148681641,0.884094893932343,-30.3809795379639,12.3175182342529,-3.86703681945801,-28.6801719665527,10.4494009017944,-8.04654979705811,24.1515140533447,6.16490602493286,-10.2416725158691,23.0013961791992,7.41965627670288,-14.4334993362427,26.178783416748,8.80745792388916,-11.5875883102417,19.3334255218506,6.27231407165527,-16.5784339904785,16.7956523895264,7.4418306350708,-20.124963760376,20.8509635925293,8.78032398223877,-18.4534435272217,17.8660774230957,10.2745752334595,-22.151252746582,21.9949245452881,12.1667222976685,-20.1556148529053,24.4991359710693,10.4047470092773,-15.9866714477539,27.5739440917969,12.3280735015869,-12.7299909591675,-19.3334255218506,6.27231407165527,-16.5784339904785,-23.0013961791992,7.41965627670288,-14.4334993362427,-20.8509616851807,8.78032398223877,-18.4534435272217,-16.7956523895264,7.4418306350708,-20.124963760376,-24.1515140533447,6.16490650177002,-10.2416725158691,-26.178783416748,8.80745792388916,-11.5875883102417,-27.5739440917969,12.3280725479126,-12.7299909591675,-24.4991359710693,10.4047470092773,-15.9866714477539,-21.9949245452881,12.1667232513428,-20.1556148529053,-17.8660774230957,10.2745761871338,-22.151252746582,12.4997673034668,6.33862972259521,-21.0107040405273,8.84537506103516,7.42607116699219,-23.5743770599365,13.4188385009766,8.71017742156982,-23.2548885345459,4.31654071807861,6.3613977432251,-23.2044448852539,0,7.41030120849609,-24.7175636291504,4.62432289123535,8.64988803863525,-25.6472988128662, +0,10.1076364517212,-27.1512317657471,4.8907618522644,11.8879528045654,-27.9983520507813,9.4020938873291,10.1578722000122,-25.9020004272461,14.1805086135864,11.9896192550659,-25.3766632080078,-4.31654071807861,6.36139726638794,-23.2044448852539,-8.84537506103516,7.42607116699219,-23.5743789672852,-4.62432289123535,8.64988899230957,-25.6472988128662,-12.4997682571411,6.33862972259521,-21.0107040405273,-13.4188394546509,8.71017742156982,-23.2548904418945,-14.1805086135864,11.9896202087402,-25.3766632080078,-9.4020938873291,10.1578712463379,-25.9020004272461,-4.8907618522644,11.8879528045654,-27.9983520507813,9.43125915527344,14.4790477752686,28.7395763397217,4.90043783187866,16.7181625366211,30.6650619506836,0,14.5459308624268,30.1012744903564,18.0361614227295,14.3480443954468,24.770170211792,14.2614831924438,16.6245288848877,27.840295791626,18.8892478942871,18.8805885314941,25.9408473968506,14.8069190979004,21.2182445526123,28.8112030029297,9.90900039672852,18.951545715332,30.252477645874,5.09770965576172,21.256591796875,31.8467979431152,-5.96046447753906e-08,18.9962940216064,31.757776260376,-9.43125820159912,14.4790468215942,28.739574432373,-14.2614822387695,16.6245288848877,27.840295791626,-18.0361595153809,14.3480443954468,24.770170211792,-4.90043783187866,16.7181606292725,30.6650619506836,-5.09770965576172,21.256591796875,31.8467960357666,-9.90900039672852,18.9515419006348,30.252477645874,-14.8069190979004,21.2182464599609,28.8112030029297,-18.8892478942871,18.8805885314941,25.9408473968506,-25.005184173584,14.2444591522217,18.4031105041504,-28.2481708526611,16.5166969299316,14.7974834442139,-29.6297740936279,14.2519283294678,10.1831722259521,-22.3030414581299,16.5308094024658,22.4082298278809,-23.0575008392334,21.2073993682861,23.0563793182373,-26.0460529327393,18.8636837005615,19.1460208892822,-29.0454940795898,21.2781219482422,15.0991868972778,-30.6890926361084,18.9562759399414,10.4956674575806,-31.3059997558594,14.4122066497803,0.778440654277802,-31.5250034332275,16.8343620300293,-4.1698055267334,-29.9566287994385,14.5237293243408,-8.73787212371826, +-31.4226379394531,16.6480388641357,5.64783716201782,-32.1353721618652,21.4727020263672,5.65699911117554,-32.2607917785645,19.1729965209961,0.715398371219635,-32.1026573181152,21.6971817016602,-4.40712547302246,-30.7958240509033,19.3084888458252,-9.18608951568604,-25.6489028930664,14.3992652893066,-17.2659549713135,-22.9515838623047,16.6208763122559,-21.5212135314941,-18.7901515960693,14.18092918396,-23.9515190124512,-28.6266250610352,16.8288860321045,-13.553412437439,-29.1339340209961,21.7213516235352,-14.0844249725342,-26.4475803375244,19.180627822876,-18.1718158721924,-23.4391288757324,21.5445137023926,-22.4024658203125,-19.4896850585938,18.9667282104492,-25.3181533813477,-9.91683006286621,14.0401639938354,-28.0736465454102,-5.1431827545166,16.3644695281982,-30.1255340576172,0,13.9951019287109,-29.4661273956299,-14.8766813278198,16.4356594085693,-27.2117023468018,-15.2515430450439,21.3954887390137,-28.4251365661621,-10.3238410949707,18.8659591674805,-29.8085231781006,-5.28185844421387,21.3548316955566,-31.5604248046875,-1.19209289550781e-07,18.8491687774658,-31.3552017211914,9.91683006286621,14.0401649475098,-28.0736465454102,14.8766822814941,16.4356594085693,-27.2117023468018,18.790153503418,14.1809282302856,-23.9515190124512,5.1431827545166,16.3644695281982,-30.1255340576172,5.28185844421387,21.3548316955566,-31.5604248046875,10.3238410949707,18.8659591674805,-29.8085231781006,15.2515439987183,21.3954906463623,-28.4251365661621,19.4896869659424,18.9667301177979,-25.3181533813477,25.6489028930664,14.3992652893066,-17.2659549713135,28.6266250610352,16.8288860321045,-13.553412437439,29.9566287994385,14.5237302780151,-8.73787212371826,22.9515857696533,16.6208782196045,-21.5212135314941,23.4391288757324,21.5445137023926,-22.4024639129639,26.4475803375244,19.1806297302246,-18.1718139648438,29.1339340209961,21.7213516235352,-14.0844249725342,30.7958240509033,19.3084888458252,-9.18609046936035,31.3059997558594,14.4122047424316,0.778440833091736,31.4226379394531,16.6480388641357,5.64783716201782,29.6297740936279,14.2519283294678,10.1831722259521, +31.5250034332275,16.8343620300293,-4.1698055267334,32.1026611328125,21.6971817016602,-4.40712594985962,32.2607917785645,19.1729946136475,0.71539831161499,32.135368347168,21.4727020263672,5.65699863433838,30.6890926361084,18.9562759399414,10.4956665039063,25.0051822662354,14.2444591522217,18.4031105041504,22.3030414581299,16.5308094024658,22.4082298278809,28.2481708526611,16.5166988372803,14.7974824905396,29.0454921722412,21.2781200408936,15.0991868972778,26.0460529327393,18.8636817932129,19.1460189819336,23.057502746582,21.2073974609375,23.0563812255859,22.9205379486084,30.8279838562012,22.3126544952393,25.7639255523682,33.7743988037109,18.1392097473145,22.1032905578613,36.7199554443359,21.3013210296631,18.804386138916,33.6226272583008,25.0089683532715,28.698543548584,30.9652080535889,14.2986755371094,30.1159687042236,33.9515686035156,9.49155521392822,27.7847690582275,36.8899040222168,13.6442441940308,28.9045333862305,40.0368881225586,8.97637271881104,24.6245574951172,39.8556976318359,17.1864471435547,17.8750095367432,39.6622200012207,23.6140842437744,31.5379467010498,31.1832942962646,4.92870855331421,31.3537731170654,34.2006568908691,-0.0917830467224121,30.5893478393555,37.1077270507813,4.60744619369507,31.2743072509766,31.4324760437012,-4.92178583145142,29.6219348907471,34.3864707946777,-9.68606948852539,30.3131008148193,37.3310089111328,-4.92007207870483,28.4429759979248,40.4081649780273,-9.38882160186768,30.1331596374512,40.2708168029785,-0.203040540218353,28.1602687835693,31.5444488525391,-14.3360214233398,25.1872520446777,34.3702163696289,-18.3695659637451,27.2084865570068,37.3887176513672,-13.9711122512817,22.4776821136475,31.4677410125732,-22.4203720092773,18.3984699249268,34.1732940673828,-25.3210163116455,21.6047420501709,37.2190208435059,-21.6975612640381,17.5369491577148,39.9581680297852,-24.2443313598633,24.108024597168,40.2944183349609,-17.6346817016602,14.5375957489014,31.2677326202393,-28.3043785095215,9.69716167449951,33.8711814880371,-29.7920684814453,13.9078893661499,36.8692817687988,-27.3704032897949, +5.02102947235107,31.0724220275879,-31.399600982666,5.96046447753906e-08,33.7036781311035,-31.3712482452393,4.79347038269043,36.5287971496582,-30.4159812927246,5.96046447753906e-08,39.2508316040039,-30.1520385742188,9.21973991394043,39.4981727600098,-28.5847015380859,-5.02102947235107,31.0724220275879,-31.3996028900146,-9.69716167449951,33.8711814880371,-29.7920665740967,-4.79347038269043,36.5287971496582,-30.4159812927246,-14.5375957489014,31.2677326202393,-28.3043785095215,-18.3984718322754,34.1732940673828,-25.3210182189941,-13.9078893661499,36.8692817687988,-27.3704032897949,-17.5369491577148,39.9581718444824,-24.2443313598633,-9.21973991394043,39.4981727600098,-28.5847034454346,-22.4776821136475,31.4677391052246,-22.4203720092773,-25.1872520446777,34.3702163696289,-18.3695659637451,-21.6047420501709,37.2190208435059,-21.6975631713867,-28.1602687835693,31.5444488525391,-14.3360214233398,-29.6219329833984,34.3864669799805,-9.68606948852539,-27.2084865570068,37.3887138366699,-13.9711132049561,15.5676174163818,59.8060455322266,-3.35564851760864,11.5056743621826,61.785774230957,-2.61322736740112,11.5807781219482,61.7205352783203,1.58047032356262,15.6078052520752,59.7241859436035,1.88127505779266,-11.5807781219482,61.7205352783203,1.58047032356262,-11.5056743621826,61.785774230957,-2.61322736740112,-15.5676164627075,59.8060455322266,-3.35564851760864,-15.6078052520752,59.7241859436035,1.88127493858337,10.5458984375,61.6611022949219,5.61003971099854,8.46857166290283,61.5876502990723,9.02624702453613,11.0945081710815,59.4277610778809,11.0485734939575,14.056191444397,59.5976867675781,6.85743570327759,-8.46857070922852,61.5876541137695,9.02624702453613,-10.5458984375,61.6611061096191,5.61003971099854,-14.056191444397,59.5976867675781,6.85743522644043,-11.0945081710815,59.4277572631836,11.0485725402832,5.49369335174561,61.4027137756348,11.3609657287598,1.89998960494995,61.1838989257813,12.4542264938354,2.43449354171753,58.882568359375,15.5551309585571,7.08788871765137,59.1543655395508,14.0300350189209,-1.89998960494995,61.1838989257813,12.4542274475098, +-5.49369335174561,61.4027137756348,11.3609657287598,-7.08788871765137,59.1543617248535,14.0300350189209,-2.43449354171753,58.882568359375,15.5551300048828,-10.3304176330566,61.7990417480469,-6.54071712493896,-8.16763877868652,61.708065032959,-9.80526065826416,-10.923376083374,59.6421813964844,-12.2314472198486,-13.9372940063477,59.7807998657227,-8.22946548461914,8.16763877868652,61.708065032959,-9.80526065826416,10.3304176330566,61.7990455627441,-6.54071712493896,13.937294960022,59.7807998657227,-8.22946548461914,10.923376083374,59.6421813964844,-12.2314472198486,-5.23276948928833,61.466064453125,-12.0437164306641,-1.79962110519409,61.1973609924316,-13.1187314987183,-2.37629699707031,59.2693023681641,-16.2892951965332,-6.93726921081543,59.4401016235352,-14.96799659729,1.79962110519409,61.1973609924316,-13.1187314987183,5.23276948928833,61.466064453125,-12.0437173843384,6.93726921081543,59.4401016235352,-14.96799659729,2.37629699707031,59.2692985534668,-16.2892951965332,3.49406099319458,53.5859031677246,21.564603805542,10.1710729598999,53.828727722168,19.4581260681152,8.68552207946777,56.6586952209473,16.8049983978271,2.97922563552856,56.3850402832031,18.6874351501465,-10.1710739135742,53.828727722168,19.4581260681152,-3.49406099319458,53.5858993530273,21.5646018981934,-2.97922563552856,56.3850402832031,18.6874351501465,-8.68552207946777,56.6586952209473,16.8049983978271,4.38860893249512,44.9721031188965,26.4004936218262,12.7718830108643,45.233081817627,24.0018882751465,11.5437259674072,50.0784149169922,21.8682518005371,3.96769046783447,49.8382110595703,24.1207866668701,-12.7718820571899,45.2330780029297,24.0018882751465,-4.38860893249512,44.9721031188965,26.4004917144775,-3.96769046783447,49.838207244873,24.1207866668701,-11.5437259674072,50.0784187316895,21.8682518005371,15.9147567749023,54.0054550170898,15.352855682373,20.1379241943359,54.0593452453613,9.61225414276123,17.3260116577148,57.077278137207,8.21607494354248,13.6353540420532,56.9208221435547,13.2074880599976,-20.1379241943359,54.0593414306641,9.61225509643555, +-15.914755821228,54.0054588317871,15.352855682373,-13.6353530883789,56.9208221435547,13.2074880599976,-17.3260116577148,57.077278137207,8.21607494354248,19.2056427001953,57.3459548950195,-3.92072629928589,19.2563934326172,57.2249755859375,2.30573797225952,22.2884311676025,54.1858062744141,2.85554480552673,22.1747550964355,54.3599281311035,-4.23303937911987,-19.2563934326172,57.224967956543,2.30573797225952,-19.2056427001953,57.3459548950195,-3.92072629928589,-22.1747550964355,54.3599281311035,-4.23303890228271,-22.2884292602539,54.1858100891113,2.85554504394531,19.9660148620605,54.3364562988281,-10.904260635376,15.8930644989014,54.0755157470703,-16.544605255127,13.5803804397583,57.1095504760742,-14.5482120513916,17.2331619262695,57.3074264526367,-9.73270606994629,-15.8930644989014,54.075511932373,-16.544605255127,-19.9660148620605,54.3364562988281,-10.904260635376,-17.2331619262695,57.3074264526367,-9.73270606994629,-13.5803804397583,57.1095504760742,-14.5482130050659,10.2484979629517,53.7426223754883,-20.6762886047363,3.53494262695313,53.4983596801758,-22.9012794494629,2.97734928131104,56.7375411987305,-19.6498622894287,8.67077445983887,56.8854446411133,-17.9338779449463,-3.53494262695313,53.4983596801758,-22.9012794494629,-10.2484979629517,53.7426223754883,-20.6762886047363,-8.67077541351318,56.8854446411133,-17.9338779449463,-2.97734928131104,56.7375411987305,-19.6498622894287,19.9733276367188,45.4588928222656,19.1678009033203,25.2460174560547,45.5815238952637,12.2576141357422,22.7918434143066,50.2770843505859,10.9932718276978,18.0417251586914,50.2405891418457,17.3706378936768,-25.2460174560547,45.5815277099609,12.2576141357422,-19.9733257293701,45.4588928222656,19.1678009033203,-18.0417251586914,50.2405853271484,17.3706378936768,-22.7918434143066,50.2770843505859,10.9932718276978,27.8840026855469,45.7611389160156,4.02698135375977,27.6611862182617,45.9584541320801,-4.67343330383301,24.995569229126,50.6104698181152,-4.45926952362061,25.1730728149414,50.4108734130859,3.45937299728394,-27.6611862182617,45.9584503173828,-4.67343330383301, +-27.8840045928955,45.7611389160156,4.02698183059692,-25.17307472229,50.4108734130859,3.45937275886536,-24.995569229126,50.6104698181152,-4.45926952362061,24.8313255310059,45.9347763061523,-12.8979558944702,19.7122020721436,45.6226806640625,-19.8979377746582,17.9438056945801,50.2812576293945,-18.3241176605225,22.5006313323975,50.5899314880371,-11.9422950744629,-19.7122020721436,45.6226806640625,-19.8979377746582,-24.8313274383545,45.9347724914551,-12.8979558944702,-22.5006313323975,50.5899276733398,-11.9422950744629,-17.9438076019287,50.2812576293945,-18.3241176605225,12.6856069564819,45.1260032653809,-25.1217575073242,4.37158346176147,44.6871604919434,-28.013635635376,4.00306177139282,49.4676551818848,-25.7375831604004,11.5948839187622,49.834400177002,-23.0939292907715,-4.37158346176147,44.6871566772461,-28.0136375427246,-12.6856060028076,45.1260070800781,-25.1217575073242,-11.5948839187622,49.834400177002,-23.0939292907715,-4.00306177139282,49.4676551818848,-25.7375831604004,4.11693477630615,7.50571537017822,24.8163681030273,12.0437793731689,7.43566513061523,22.8424301147461,13.0281524658203,10.5050230026245,25.1176643371582,4.46138334274292,10.6105270385742,27.4659881591797,-12.0437793731689,7.43566560745239,22.8424301147461,-4.11693477630615,7.50571537017822,24.8163681030273,-4.46138334274292,10.6105270385742,27.4659881591797,-13.0281524658203,10.5050230026245,25.1176624298096,19.0495452880859,7.30978012084961,18.7649421691895,24.4523525238037,7.18941879272461,12.7399883270264,26.2344570159912,10.2415218353271,13.6814680099487,20.5269298553467,10.354208946228,20.4344100952148,-24.4523544311523,7.18941879272461,12.7399892807007,-19.0495452880859,7.30978012084961,18.7649421691895,-20.526927947998,10.354208946228,20.4344100952148,-26.2344570159912,10.2415218353271,13.6814680099487,27.5024833679199,7.18308544158936,5.20935821533203,27.7945289611816,7.2879810333252,-3.05108165740967,29.6712417602539,10.4063310623169,-3.63880252838135,29.4162158966064,10.273642539978,5.37592029571533,-27.7945289611816,7.2879810333252,-3.05108189582825, +-27.5024833679199,7.18308544158936,5.20935821533203,-29.4162139892578,10.2736434936523,5.37591981887817,-29.6712417602539,10.4063310623169,-3.63880228996277,25.267391204834,7.39000225067139,-10.9313735961914,20.1554088592529,7.43656063079834,-17.5271453857422,21.4531230926514,10.3436851501465,-19.3365325927734,26.9321441650391,10.444429397583,-12.1929244995117,-20.1554088592529,7.43656063079834,-17.5271453857422,-25.267391204834,7.39000225067139,-10.9313735961914,-26.9321441650391,10.444429397583,-12.1929244995117,-21.4531230926514,10.3436851501465,-19.3365325927734,12.9883441925049,7.4365816116333,-22.1396026611328,4.47863101959229,7.41555881500244,-24.4325942993164,4.75967884063721,10.1216115951538,-26.8390522003174,13.8099822998047,10.210747718811,-24.3395709991455,-4.47863101959229,7.41555881500244,-24.4325942993164,-12.9883441925049,7.43658113479614,-22.1396045684814,-13.8099822998047,10.2107486724854,-24.3395729064941,-4.75967884063721,10.1216115951538,-26.839054107666,4.76727676391602,14.5263080596924,29.7560272216797,13.8886518478394,14.4157571792603,27.0711936950684,14.5732641220093,18.9140663146973,28.4304313659668,5.01254653930664,18.9824695587158,31.3729419708252,-13.8886518478394,14.4157562255859,27.0711936950684,-4.76727676391602,14.5263080596924,29.7560272216797,-5.01254653930664,18.9824714660645,31.3729419708252,-14.5732641220093,18.9140663146973,28.4304313659668,-27.6537647247314,14.2291660308838,14.4872159957886,-21.7704925537109,14.2875137329102,21.8557872772217,-22.7408542633057,18.8616561889648,22.8177757263184,-28.7228126525879,18.8930854797363,15.0103826522827,-31.0088539123535,14.4891929626465,-4.03706359863281,-30.8467464447021,14.3230285644531,5.56604957580566,-31.862865447998,19.059663772583,5.68667793273926,-31.8995590209961,19.2660236358643,-4.28618574142456,-22.5094051361084,14.2895183563232,-20.8898887634277,-28.1506443023682,14.4855422973633,-13.1813926696777,-28.9662609100342,19.2701377868652,-13.852331161499,-23.2764854431152,19.0696067810059,-22.0314521789551,-5.02363395690918,14.0061340332031,-29.1156997680664, +-14.5491485595703,14.0981197357178,-26.349178314209,-15.1238870620728,18.9016456604004,-27.9188251495361,-5.23429536819458,18.8512649536133,-30.9622955322266,14.5491485595703,14.0981197357178,-26.349178314209,5.02363395690918,14.0061340332031,-29.1156997680664,5.23429536819458,18.8512649536133,-30.9622936248779,15.1238880157471,18.9016456604004,-27.9188232421875,28.1506423950195,14.4855442047119,-13.1813926696777,22.5094051361084,14.2895183563232,-20.8898887634277,23.2764854431152,19.0696067810059,-22.0314521789551,28.9662628173828,19.2701377868652,-13.8523302078247,30.8467464447021,14.3230285644531,5.56604957580566,31.0088539123535,14.4891948699951,-4.03706359863281,31.8995571136475,19.2660217285156,-4.28618574142456,31.8628616333008,19.059663772583,5.68667793273926,21.7704925537109,14.2875137329102,21.8557872772217,27.6537647247314,14.2291669845581,14.4872169494629,28.7228126525879,18.8930854797363,15.0103826522827,22.7408561706543,18.8616561889648,22.817777633667,22.5716361999512,33.7001342773438,21.8481063842773,28.3043422698975,33.8550071716309,13.9858417510986,27.1170444488525,39.941535949707,13.2549571990967,21.5146751403809,39.7667961120605,20.6723289489746,31.121898651123,34.0736808776855,4.75990962982178,30.8432388305664,34.3118171691895,-4.94621276855469,29.6371936798096,40.3631286621094,-4.85688209533691,29.8994255065918,40.1543617248535,4.44920921325684,27.7215061187744,34.4039306640625,-14.1940422058105,22.0644760131836,34.2913360595703,-22.1120796203613,21.0750637054443,40.1504058837891,-21.1849479675293,26.5819625854492,40.3827934265137,-13.6753644943237,14.2345390319824,34.0221099853516,-27.8958206176758,4.91082191467285,33.75390625,-30.9653511047363,4.66627883911133,39.3244171142578,-29.7451400756836,13.5475692749023,39.7250900268555,-26.7310085296631,-4.91082191467285,33.75390625,-30.9653491973877,-14.2345390319824,34.0221138000488,-27.8958206176758,-13.5475702285767,39.7250900268555,-26.7310104370117,-4.66627883911133,39.3244171142578,-29.7451400756836,-22.0644760131836,34.291332244873,-22.1120796203613, +-27.7215042114258,34.4039306640625,-14.1940422058105,-26.5819606781006,40.3827934265137,-13.6753644943237,-21.0750637054443,40.1504058837891,-21.1849479675293,-30.8432369232178,34.3118171691895,-4.94621276855469,-31.121898651123,34.0736808776855,4.75991010665894,-29.8994255065918,40.1543617248535,4.44920921325684,-29.6371917724609,40.3631248474121,-4.85688209533691,-28.3043403625488,33.8550071716309,13.9858417510986,-22.5716361999512,33.7001342773438,21.8481063842773,-21.5146751403809,39.7667922973633,20.6723289489746,-27.1170444488525,39.941535949707,13.2549571990967,-14.539083480835,33.5322723388672,27.5182418823242,-5.01237773895264,33.3806838989258,30.4676628112793,-4.74511432647705,39.2948112487793,28.5585899353027,-13.7931632995605,39.5293846130371,25.9132061004639,5.01237773895264,33.3806838989258,30.4676628112793,14.5390815734863,33.5322723388672,27.5182418823242,13.7931632995605,39.5293846130371,25.9132061004639,4.74511432647705,39.294807434082,28.5585899353027,1.33697712421417,62.6450843811035,-10.4305229187012,1.04452121257782,63.6501922607422,-8.19536399841309,2.94113492965698,63.7450866699219,-7.72278213500977,3.85129880905151,62.9050407409668,-9.58986663818359,-1.04452121257782,63.6501922607422,-8.19536399841309,-1.33697712421417,62.6450843811035,-10.4305219650269,-3.85129880905151,62.9050445556641,-9.58986663818359,-2.94113492965698,63.7450866699219,-7.72278213500977,4.98669147491455,63.9024963378906,-4.29712915420532,7.28130722045898,63.1691207885742,-5.15698528289795,5.88672256469727,63.1176910400391,-7.79505157470703,4.2404317855835,63.8477401733398,-6.45443153381348,-7.28130674362183,63.169116973877,-5.15698528289795,-4.98669147491455,63.9024963378906,-4.29712915420532,-4.2404317855835,63.8477401733398,-6.45443105697632,-5.88672304153442,63.1176872253418,-7.79505109786987,0.98695832490921,64.2933654785156,-3.83908843994141,2.97125482559204,64.2151870727539,-3.90834379196167,2.7170090675354,64.1178894042969,-5.97907018661499,0.944909691810608,64.1647338867188,-6.0622992515564,-2.97125482559204,64.2151870727539,-3.90834379196167, +-0.98695832490921,64.2933654785156,-3.83908843994141,-0.944909691810608,64.1647338867188,-6.0622992515564,-2.7170090675354,64.1178894042969,-5.97907018661499,-5.47851276397705,63.8643264770508,1.11412155628204,-5.41068363189697,63.8851890563965,-1.67196273803711,-8.03042984008789,63.1387710571289,-2.01098990440369,-8.12069511413574,63.0923461914063,1.32863092422485,5.41068363189697,63.8851890563965,-1.6719628572464,5.47851276397705,63.8643264770508,1.11412155628204,8.12069511413574,63.0923461914063,1.32863092422485,8.03042984008789,63.1387710571289,-2.01098990440369,-4.1331615447998,62.9916801452637,9.1320915222168,-1.44465446472168,62.8528823852539,9.89194011688232,-1.12804973125458,63.7817497253418,7.8428840637207,-3.16074204444885,63.8086051940918,7.39389848709106,1.44465446472168,62.8528900146484,9.89194011688232,4.1331615447998,62.9916763305664,9.13209247589111,3.16074204444885,63.8086051940918,7.39389801025391,1.12804973125458,63.7817459106445,7.8428840637207,-5.17432594299316,63.8651695251465,3.82370805740356,-7.52992534637451,63.0818023681641,4.56859302520752,-6.21926212310791,63.0821876525879,7.32674932479858,-4.49631595611572,63.8420562744141,6.08844995498657,7.52992534637451,63.0818023681641,4.56859302520752,5.17432594299316,63.8651695251465,3.82370805740356,4.49631595611572,63.8420562744141,6.08844995498657,6.21926212310791,63.0821914672852,7.32674932479858,-2.8734335899353,64.1284637451172,5.64299726486206,-1.0003570318222,64.1910400390625,5.74906969070435,-1.02077686786652,64.2933654785156,3.40372252464294,-3.07641887664795,64.2077255249023,3.46190452575684,1.0003570318222,64.1910400390625,5.74906969070435,2.8734335899353,64.1284637451172,5.64299726486206,3.07641887664795,64.2077255249023,3.46190452575684,1.02077686786652,64.2933654785156,3.40372252464294,-1.04564225673676,64.2933654785156,-1.49220657348633,-3.17342090606689,64.2117309570313,-1.52467322349548,-3.21075963973999,64.2075576782227,0.988365769386292,-1.05752873420715,64.2933654785156,0.951281547546387,3.17342114448547,64.2117309570313,-1.52467334270477, +1.04564225673676,64.2933654785156,-1.49220657348633,1.05752873420715,64.2933654785156,0.951281547546387,3.21075987815857,64.2075576782227,0.988365769386292,-6.57106304168701,1.26715755462646,13.4370489120483,-2.27903413772583,1.46033191680908,14.4658660888672,-2.80296778678894,2.47119188308716,17.0606136322021,-8.11715507507324,2.30936574935913,15.9046878814697,2.27903413772583,1.46033191680908,14.4658660888672,6.57106351852417,1.26715755462646,13.4370489120483,8.11715507507324,2.30936574935913,15.9046878814697,2.80296778678894,2.47119188308716,17.0606117248535,-12.4564514160156,0.93823516368866,7.79614448547363,-10.0649766921997,1.06444346904755,11.1876754760742,-12.5560970306396,2.12562894821167,13.3025722503662,-15.7083921432495,1.9942479133606,9.30551147460938,10.0649766921997,1.06444346904755,11.1876754760742,12.4564523696899,0.93823516368866,7.79614400863647,15.7083921432495,1.99424779415131,9.30551147460938,12.5560970306396,2.12562894821167,13.3025722503662,-13.7238159179688,0.866012573242188,-0.985489130020142,-13.668924331665,0.876988410949707,3.61098480224609,-17.3347358703613,1.92384088039398,4.30625247955322,-17.4048347473145,1.91743147373199,-1.23284518718719,13.668924331665,0.876988410949707,3.61098480224609,13.7238149642944,0.866012573242188,-0.985489249229431,17.4048347473145,1.91743159294128,-1.23284518718719,17.3347358703613,1.92384076118469,4.30625200271606,-10.6409645080566,0.972873389720917,-9.65685272216797,-12.740535736084,0.887470781803131,-5.57718181610107,-16.0974235534668,1.97244930267334,-6.77981281280518,-13.3654651641846,2.09974551200867,-11.6791505813599,12.740535736084,0.887470722198486,-5.57718181610107,10.6409645080566,0.972873389720917,-9.65685272216797,13.3654651641846,2.09974575042725,-11.6791505813599,16.0974235534668,1.97244930267334,-6.77981281280518,-2.51063251495361,1.46834719181061,-14.1482563018799,-7.1494574546814,1.20307815074921,-12.6261129379272,-8.93615531921387,2.3235936164856,-15.1518287658691,-3.13153100013733,2.54582357406616,-16.8482513427734,7.1494574546814,1.20307815074921,-12.6261129379272, +2.51063251495361,1.46834719181061,-14.1482553482056,3.13153100013733,2.54582357406616,-16.8482513427734,8.93615436553955,2.32359337806702,-15.1518287658691,4.21949481964111,0.24549388885498,-8.12972545623779,1.51044225692749,0.345484912395477,-8.8607816696167,1.93627846240997,0.736106514930725,-11.4802894592285,5.49665069580078,0.517758190631866,-10.2385063171387,-1.51044225692749,0.345484912395477,-8.86078071594238,-4.21949529647827,0.24549388885498,-8.12972450256348,-5.49665069580078,0.517758190631866,-10.2385053634644,-1.93627846240997,0.736106514930725,-11.4802885055542,6.78032302856445,0.143227800726891,-3.80848169326782,5.9514799118042,0.164522141218185,-6.45761966705322,8.12047004699707,0.342103540897369,-7.84259176254272,9.6331672668457,0.296125888824463,-4.55593919754028,-5.9514799118042,0.164522141218185,-6.45761966705322,-6.78032302856445,0.143227800726891,-3.80848169326782,-9.63316631317139,0.296125888824463,-4.55593872070313,-8.12047004699707,0.342103540897369,-7.84259176254272,7.13190698623657,0.147115930914879,2.52719402313232,7.16675329208374,0.143892273306847,-0.684215128421783,10.3099699020386,0.292750298976898,-0.817680239677429,10.2606105804443,0.299950391054153,2.97311162948608,-7.16675281524658,0.143892273306847,-0.684215068817139,-7.13190746307373,0.147115930914879,2.5271942615509,-10.2606105804443,0.299950391054153,2.97311162948608,-10.3099708557129,0.292750298976898,-0.817680239677429,5.72447204589844,0.215398639440536,7.89461517333984,6.65125846862793,0.165047988295555,5.50363636016846,9.42931461334229,0.340748369693756,6.45742321014404,7.74766159057617,0.434313058853149,9.29989337921143,-6.65125894546509,0.165047988295555,5.50363636016846,-5.72447109222412,0.215398639440536,7.89461517333984,-7.74766159057617,0.434313058853149,9.29989337921143,-9.42931461334229,0.340748369693756,6.45742321014404,5.13457918167114,0.595960021018982,11.1888113021851,1.79252350330353,0.755065083503723,12.0507965087891,1.42690420150757,0.358843892812729,9.79583930969238,4.00316619873047,0.291121602058411,9.28136253356934, +-1.79252350330353,0.755065083503723,12.0507965087891,-5.1345796585083,0.595960021018982,11.1888113021851,-4.00316619873047,0.291121602058411,9.28136253356934,-1.42690420150757,0.358843892812729,9.79583930969238,4.04424810409546,0.139174088835716,-3.47739410400391,1.34409189224243,0.13815538585186,-3.47290897369385,1.32606935501099,0.179509460926056,-6.20739269256592,3.80465602874756,0.162560343742371,-6.00198173522949,-1.34409189224243,0.13815538585186,-3.47290921211243,-4.04424810409546,0.139174088835716,-3.47739410400391,-3.80465602874756,0.162560343742371,-6.00198173522949,-1.32606935501099,0.179509460926056,-6.20739269256592,1.32285356521606,0.138722658157349,4.93455839157104,3.97595882415771,0.143986389040947,5.02836227416992,3.67544531822205,0.179406344890594,7.36631727218628,1.28125023841858,0.182851999998093,7.46360540390015,-3.97595882415771,0.143986389040947,5.02836227416992,-1.32285356521606,0.138722658157349,4.93455791473389,-1.28125023841858,0.182851999998093,7.46360540390015,-3.67544507980347,0.179406344890594,7.36631679534912,4.20082855224609,0.140255019068718,2.28454065322876,1.38722360134125,0.138538599014282,2.2070095539093,1.39342784881592,0.138346180319786,-0.645241737365723,4.22020626068115,0.139456853270531,-0.632020592689514,-1.38722360134125,0.138538599014282,2.2070095539093,-4.20082855224609,0.140255019068718,2.28454065322876,-4.22020626068115,0.139456853270531,-0.632020533084869,-1.39342784881592,0.138346180319786,-0.645241737365723,14.9962406158447,3.44038987159729,15.2850112915039,18.9902572631836,3.31511735916138,10.6505279541016,22.024787902832,4.94970798492432,11.7426891326904,17.2056427001953,5.06905937194824,17.0455627441406,21.1318302154541,3.25349950790405,4.80109882354736,21.2721691131592,3.27453064918518,-1.69708228111267,24.9553928375244,4.97925662994385,-2.3606436252594,24.7114906311035,4.91293239593506,5.047926902771,19.5560741424561,3.37183308601379,-8.12161731719971,16.0174789428711,3.52761459350586,-13.6963272094727,18.3519821166992,5.24750328063965,-15.6281147003174,22.7846794128418,5.10501337051392,-9.53587818145752, +10.5794439315796,3.71266961097717,-17.591251373291,3.68797397613525,3.85879564285278,-19.46506690979,4.13198900222778,5.4301815032959,-21.9723472595215,11.9343738555908,5.36499500274658,-19.8851795196533,-3.68797397613525,3.85879564285278,-19.4650650024414,-10.5794439315796,3.71266937255859,-17.591251373291,-11.9343738555908,5.36499500274658,-19.8851795196533,-4.13198900222778,5.43018198013306,-21.9723472595215,-16.0174808502197,3.52761483192444,-13.6963272094727,-19.5560722351074,3.37183308601379,-8.12161636352539,-22.7846794128418,5.10501384735107,-9.53587818145752,-18.3519821166992,5.24750328063965,-15.6281147003174,-21.2721691131592,3.27453064918518,-1.69708228111267,-21.1318321228027,3.25349926948547,4.80109882354736,-24.7114906311035,4.91293239593506,5.04792737960815,-24.9553928375244,4.97925710678101,-2.36064386367798,-18.9902572631836,3.31511735916138,10.6505279541016,-14.9962406158447,3.44039011001587,15.2850112915039,-17.2056427001953,5.06905937194824,17.0455627441406,-22.0247898101807,4.94970798492432,11.7426891326904,-9.59217262268066,3.5849506855011,18.2945671081543,-3.29646229743958,3.69192314147949,19.6367740631104,-3.73090553283691,5.25192451477051,22.1713047027588,-10.9029388427734,5.1862678527832,20.5475330352783,3.29646229743958,3.69192314147949,19.6367740631104,9.59217262268066,3.58495044708252,18.2945671081543,10.9029388427734,5.1862678527832,20.5475330352783,3.73090553283691,5.25192451477051,22.1713027954102,-14.945369720459,23.4709396362305,28.9522247314453,-5.1500301361084,23.4778938293457,32.0537643432617,-5.15244197845459,28.0711879730225,31.7180023193359,-14.9350481033325,28.1349506378174,28.5948963165283,-29.1840133666992,23.5915946960449,15.0371742248535,-23.2265472412109,23.4953804016113,23.095983505249,-23.150821685791,28.2241535186768,22.694938659668,-28.9901466369629,28.3488807678223,14.6016731262207,-32.1044464111328,24.0408344268799,-4.55354833602905,-32.2080955505371,23.8019580841064,5.5332293510437,-31.8783493041992,28.567626953125,5.13595008850098,-31.6530246734619,28.8199138641357,-4.83327102661133, +-23.3945407867432,23.954402923584,-22.6161079406738,-29.0940246582031,24.094554901123,-14.2559776306152,-28.5640430450439,28.9262771606445,-14.3889102935791,-22.8677845001221,28.8486385345459,-22.6143074035645,-5.27075958251953,23.7634811401367,-31.854362487793,-15.2204275131226,23.8166007995605,-28.6852188110352,-14.8271389007568,28.6903038024902,-28.5932178497314,-5.12679100036621,28.5570240020752,-31.7250938415527,15.2204284667969,23.8166027069092,-28.6852207183838,5.27075958251953,23.7634811401367,-31.854362487793,5.12679100036621,28.5570220947266,-31.7250957489014,14.8271389007568,28.6903038024902,-28.5932178497314,29.0940227508545,24.094554901123,-14.2559776306152,23.3945388793945,23.954402923584,-22.6161079406738,22.8677825927734,28.8486404418945,-22.6143074035645,28.5640430450439,28.9262771606445,-14.3889102935791,32.2080917358398,23.8019580841064,5.53322839736938,32.1044387817383,24.0408325195313,-4.55354833602905,31.6530227661133,28.8199138641357,-4.83327102661133,31.8783473968506,28.567626953125,5.13595008850098,23.2265491485596,23.4953804016113,23.095983505249,29.1840133666992,23.5915946960449,15.0371742248535,28.9901466369629,28.3488807678223,14.6016731262207,23.150821685791,28.2241535186768,22.6949367523193,5.1500301361084,23.4778938293457,32.0537643432617,14.945369720459,23.4709377288818,28.9522247314453,14.9350471496582,28.1349506378174,28.5948963165283,5.15244197845459,28.0711879730225,31.7180023193359 + } + PolygonVertexIndex: *7808 { + a: 0,978,1466,-982,978,246,979,-1467,1466,979,368,-981,981,1466,980,-250,246,982,1467,-980,982,1,983,-1468,1467,983,247,-985,979,1467,984,-369,368,984,1468,-988,984,247,985,-1469,1468,985,2,-987,987,1468,986,-249,249,980,1469,-990,980,368,987,-1470,1469,987,248,-989,989,1469,988,-4,5,990,1470,-994,990,250,991,-1471,1470,991,369,-993,993,1470,992,-254,250,994,1471,-992,994,6,995,-1472,1471,995,251,-997,991,1471,996,-370,369,996,1472,-1000,996,251,997,-1473,1472,997,7,-999,999,1472,998,-253,253,992,1473,-1002,992,369,999,-1474,1473,999,252,-1001,1001,1473,1000,-5,2,1002,1474,-987,1002,254,1003,-1475,1474,1003,370,-1005,986,1474,1004,-249,254,1005,1475,-1004,1005,8,1006,-1476,1475,1006,255,-1008,1003,1475,1007,-371,370,1007,1476,-1011,1007,255,1008,-1477,1476,1008,9,-1010,1010,1476,1009,-257,248,1004,1477,-989,1004,370,1010,-1478,1477,1010,256,-1012,988,1477,1011,-4,11,1012,1478,-1016,1012,257,1013,-1479,1478,1013,371,-1015,1015,1478,1014,-260,257,1016,1479,-1014,1016,5,993,-1480,1479,993,253,-1018,1013,1479,1017,-372,371,1017,1480,-1020,1017,253,1001,-1481,1480,1001,4,-1019,1019,1480,1018,-259,259,1014,1481,-1022,1014,371,1019,-1482,1481,1019,258,-1021,1021,1481,1020,-11,8,1022,1482,-1007,1022,260,1023,-1483,1482,1023,372,-1025,1006,1482,1024,-256,260,1025,1483,-1024,1025,12,1026,-1484,1483,1026,261,-1028,1023,1483,1027,-373,372,1027,1484,-1031,1027,261,1028,-1485,1484,1028,13,-1030,1030,1484,1029,-263,255,1024,1485,-1009,1024,372,1030,-1486,1485,1030,262,-1032,1008,1485,1031,-10,12,1032,1486,-1027,1032,263,1033,-1487,1486,1033,373,-1035,1026,1486,1034,-262,263,1035,1487,-1034,1035,11,1015,-1488,1487,1015,259,-1037,1033,1487,1036,-374,373,1036,1488,-1039,1036,259,1021,-1489,1488,1021,10,-1038,1038,1488,1037,-265,261,1034,1489,-1029,1034,373,1038,-1490,1489,1038,264,-1040,1028,1489,1039,-14,6,1040,1490,-996,1040,265,1041,-1491,1490,1041,374,-1043,995,1490,1042,-252,265,1043,1491,-1042,1043,14,1044,-1492,1491,1044,266,-1046,1041,1491,1045,-375,374,1045,1492,-1049,1045,266,1046,-1493,1492,1046,15,-1048, +1048,1492,1047,-268,251,1042,1493,-998,1042,374,1048,-1494,1493,1048,267,-1050,997,1493,1049,-8,17,1050,1494,-1054,1050,268,1051,-1495,1494,1051,375,-1053,1053,1494,1052,-271,268,1054,1495,-1052,1054,1,982,-1496,1495,982,246,-1056,1051,1495,1055,-376,375,1055,1496,-1058,1055,246,978,-1497,1496,978,0,-1057,1057,1496,1056,-270,270,1052,1497,-1060,1052,375,1057,-1498,1497,1057,269,-1059,1059,1497,1058,-17,14,1060,1498,-1045,1060,271,1061,-1499,1498,1061,376,-1063,1044,1498,1062,-267,271,1063,1499,-1062,1063,19,1064,-1500,1499,1064,272,-1066,1061,1499,1065,-377,376,1065,1500,-1069,1065,272,1066,-1501,1500,1066,18,-1068,1068,1500,1067,-274,266,1062,1501,-1047,1062,376,1068,-1502,1501,1068,273,-1070,1046,1501,1069,-16,19,1070,1502,-1065,1070,274,1071,-1503,1502,1071,377,-1073,1064,1502,1072,-273,274,1073,1503,-1072,1073,17,1053,-1504,1503,1053,270,-1075,1071,1503,1074,-378,377,1074,1504,-1077,1074,270,1059,-1505,1504,1059,16,-1076,1076,1504,1075,-276,272,1072,1505,-1067,1072,377,1076,-1506,1505,1076,275,-1078,1066,1505,1077,-19,21,1078,1506,-1082,1078,276,1079,-1507,1506,1079,378,-1081,1081,1506,1080,-279,276,1082,1507,-1080,1082,20,1083,-1508,1507,1083,277,-1085,1079,1507,1084,-379,378,1084,1508,-1087,1084,277,1085,-1509,1508,1085,9,-1032,1086,1508,1031,-263,278,1080,1509,-1088,1080,378,1086,-1510,1509,1086,262,-1030,1087,1509,1029,-14,22,1088,1510,-1092,1088,279,1089,-1511,1510,1089,379,-1091,1091,1510,1090,-281,279,1092,1511,-1090,1092,21,1081,-1512,1511,1081,278,-1094,1089,1511,1093,-380,379,1093,1512,-1095,1093,278,1087,-1513,1512,1087,13,-1040,1094,1512,1039,-265,280,1090,1513,-1096,1090,379,1094,-1514,1513,1094,264,-1038,1095,1513,1037,-11,69,1096,1514,-1100,1096,281,1097,-1515,1514,1097,380,-1099,1099,1514,1098,-284,281,1100,1515,-1098,1100,60,1101,-1516,1515,1101,282,-1103,1097,1515,1102,-381,380,1102,1516,-1105,1102,282,1103,-1517,1516,1103,20,-1083,1104,1516,1082,-277,283,1098,1517,-1106,1098,380,1104,-1518,1517,1104,276,-1079,1105,1517,1078,-22,68,1106,1518,-1110,1106,284,1107,-1519,1518,1107,381,-1109,1109, +1518,1108,-286,284,1110,1519,-1108,1110,69,1099,-1520,1519,1099,283,-1112,1107,1519,1111,-382,381,1111,1520,-1113,1111,283,1105,-1521,1520,1105,21,-1093,1112,1520,1092,-280,285,1108,1521,-1114,1108,381,1112,-1522,1521,1112,279,-1089,1113,1521,1088,-23,20,1114,1522,-1084,1114,286,1115,-1523,1522,1115,382,-1117,1083,1522,1116,-278,286,1117,1523,-1116,1117,26,1118,-1524,1523,1118,287,-1120,1115,1523,1119,-383,382,1119,1524,-1122,1119,287,1120,-1525,1524,1120,3,-1012,1121,1524,1011,-257,277,1116,1525,-1086,1116,382,1121,-1526,1525,1121,256,-1010,1085,1525,1009,-10,27,1122,1526,-1126,1122,288,1123,-1527,1526,1123,383,-1125,1125,1526,1124,-290,288,1126,1527,-1124,1126,22,1091,-1528,1527,1091,280,-1128,1123,1527,1127,-384,383,1127,1528,-1129,1127,280,1095,-1529,1528,1095,10,-1021,1128,1528,1020,-259,289,1124,1529,-1130,1124,383,1128,-1530,1529,1128,258,-1019,1129,1529,1018,-5,0,981,1530,-1133,981,249,1130,-1531,1530,1130,384,-1132,1132,1530,1131,-292,249,989,1531,-1131,989,3,1120,-1532,1531,1120,287,-1134,1130,1531,1133,-385,384,1133,1532,-1136,1133,287,1118,-1533,1532,1118,26,-1135,1135,1532,1134,-291,291,1131,1533,-1138,1131,384,1135,-1534,1533,1135,290,-1137,1137,1533,1136,-29,4,1000,1534,-1130,1000,252,1138,-1535,1534,1138,385,-1140,1129,1534,1139,-290,252,998,1535,-1139,998,7,1140,-1536,1535,1140,292,-1142,1138,1535,1141,-386,385,1141,1536,-1145,1141,292,1142,-1537,1536,1142,29,-1144,1144,1536,1143,-294,289,1139,1537,-1126,1139,385,1144,-1538,1537,1144,293,-1146,1125,1537,1145,-28,28,1146,1538,-1138,1146,294,1147,-1539,1538,1147,386,-1149,1137,1538,1148,-292,294,1149,1539,-1148,1149,30,1150,-1540,1539,1150,295,-1152,1147,1539,1151,-387,386,1151,1540,-1154,1151,295,1152,-1541,1540,1152,16,-1059,1153,1540,1058,-270,291,1148,1541,-1133,1148,386,1153,-1542,1541,1153,269,-1057,1132,1541,1056,-1,31,1154,1542,-1158,1154,296,1155,-1543,1542,1155,387,-1157,1157,1542,1156,-298,296,1158,1543,-1156,1158,29,1142,-1544,1543,1142,292,-1160,1155,1543,1159,-388,387,1159,1544,-1161,1159,292,1140,-1545,1544,1140,7,-1050,1160,1544,1049, +-268,297,1156,1545,-1162,1156,387,1160,-1546,1545,1160,267,-1048,1161,1545,1047,-16,30,1162,1546,-1151,1162,298,1163,-1547,1546,1163,388,-1165,1150,1546,1164,-296,298,1165,1547,-1164,1165,32,1166,-1548,1547,1166,299,-1168,1163,1547,1167,-389,388,1167,1548,-1170,1167,299,1168,-1549,1548,1168,18,-1078,1169,1548,1077,-276,295,1164,1549,-1153,1164,388,1169,-1550,1549,1169,275,-1076,1152,1549,1075,-17,32,1170,1550,-1167,1170,300,1171,-1551,1550,1171,389,-1173,1166,1550,1172,-300,300,1173,1551,-1172,1173,31,1157,-1552,1551,1157,297,-1175,1171,1551,1174,-390,389,1174,1552,-1176,1174,297,1161,-1553,1552,1161,15,-1070,1175,1552,1069,-274,299,1172,1553,-1169,1172,389,1175,-1554,1553,1175,273,-1068,1168,1553,1067,-19,60,1176,1554,-1102,1176,301,1177,-1555,1554,1177,390,-1179,1101,1554,1178,-283,301,1179,1555,-1178,1179,61,1180,-1556,1555,1180,302,-1182,1177,1555,1181,-391,390,1181,1556,-1184,1181,302,1182,-1557,1556,1182,26,-1118,1183,1556,1117,-287,282,1178,1557,-1104,1178,390,1183,-1558,1557,1183,286,-1115,1103,1557,1114,-21,67,1184,1558,-1188,1184,303,1185,-1559,1558,1185,391,-1187,1187,1558,1186,-305,303,1188,1559,-1186,1188,68,1109,-1560,1559,1109,285,-1190,1185,1559,1189,-392,391,1189,1560,-1191,1189,285,1113,-1561,1560,1113,22,-1127,1190,1560,1126,-289,304,1186,1561,-1192,1186,391,1190,-1562,1561,1190,288,-1123,1191,1561,1122,-28,61,1192,1562,-1181,1192,305,1193,-1563,1562,1193,392,-1195,1180,1562,1194,-303,305,1195,1563,-1194,1195,62,1196,-1564,1563,1196,306,-1198,1193,1563,1197,-393,392,1197,1564,-1200,1197,306,1198,-1565,1564,1198,28,-1137,1199,1564,1136,-291,302,1194,1565,-1183,1194,392,1199,-1566,1565,1199,290,-1135,1182,1565,1134,-27,66,1200,1566,-1204,1200,307,1201,-1567,1566,1201,393,-1203,1203,1566,1202,-309,307,1204,1567,-1202,1204,67,1187,-1568,1567,1187,304,-1206,1201,1567,1205,-394,393,1205,1568,-1207,1205,304,1191,-1569,1568,1191,27,-1146,1206,1568,1145,-294,308,1202,1569,-1208,1202,393,1206,-1570,1569,1206,293,-1144,1207,1569,1143,-30,62,1208,1570,-1197,1208,309,1209,-1571,1570,1209,394,-1211,1196,1570, +1210,-307,309,1211,1571,-1210,1211,63,1212,-1572,1571,1212,310,-1214,1209,1571,1213,-395,394,1213,1572,-1216,1213,310,1214,-1573,1572,1214,30,-1150,1215,1572,1149,-295,306,1210,1573,-1199,1210,394,1215,-1574,1573,1215,294,-1147,1198,1573,1146,-29,65,1216,1574,-1220,1216,311,1217,-1575,1574,1217,395,-1219,1219,1574,1218,-313,311,1220,1575,-1218,1220,66,1203,-1576,1575,1203,308,-1222,1217,1575,1221,-396,395,1221,1576,-1223,1221,308,1207,-1577,1576,1207,29,-1159,1222,1576,1158,-297,312,1218,1577,-1224,1218,395,1222,-1578,1577,1222,296,-1155,1223,1577,1154,-32,63,1224,1578,-1213,1224,313,1225,-1579,1578,1225,396,-1227,1212,1578,1226,-311,313,1227,1579,-1226,1227,64,1228,-1580,1579,1228,314,-1230,1225,1579,1229,-397,396,1229,1580,-1232,1229,314,1230,-1581,1580,1230,32,-1166,1231,1580,1165,-299,310,1226,1581,-1215,1226,396,1231,-1582,1581,1231,298,-1163,1214,1581,1162,-31,64,1232,1582,-1229,1232,315,1233,-1583,1582,1233,397,-1235,1228,1582,1234,-315,315,1235,1583,-1234,1235,65,1219,-1584,1583,1219,312,-1237,1233,1583,1236,-398,397,1236,1584,-1238,1236,312,1223,-1585,1584,1223,31,-1174,1237,1584,1173,-301,314,1234,1585,-1231,1234,397,1237,-1586,1585,1237,300,-1171,1230,1585,1170,-33,113,1238,1586,-1242,1238,316,1239,-1587,1586,1239,398,-1241,1241,1586,1240,-320,316,1242,1587,-1240,1242,104,1243,-1588,1587,1243,317,-1245,1239,1587,1244,-399,398,1244,1588,-1248,1244,317,1245,-1589,1588,1245,50,-1247,1247,1588,1246,-319,319,1240,1589,-1250,1240,398,1247,-1590,1589,1247,318,-1249,1249,1589,1248,-52,112,1250,1590,-1254,1250,320,1251,-1591,1590,1251,399,-1253,1253,1590,1252,-323,320,1254,1591,-1252,1254,113,1241,-1592,1591,1241,319,-1256,1251,1591,1255,-400,399,1255,1592,-1258,1255,319,1249,-1593,1592,1249,51,-1257,1257,1592,1256,-322,322,1252,1593,-1260,1252,399,1257,-1594,1593,1257,321,-1259,1259,1593,1258,-53,104,1260,1594,-1244,1260,323,1261,-1595,1594,1261,400,-1263,1243,1594,1262,-318,323,1263,1595,-1262,1263,105,1264,-1596,1595,1264,324,-1266,1261,1595,1265,-401,400,1265,1596,-1269,1265,324,1266,-1597,1596,1266,59,-1268, +1268,1596,1267,-326,317,1262,1597,-1246,1262,400,1268,-1598,1597,1268,325,-1270,1245,1597,1269,-51,111,1270,1598,-1274,1270,326,1271,-1599,1598,1271,401,-1273,1273,1598,1272,-329,326,1274,1599,-1272,1274,112,1253,-1600,1599,1253,322,-1276,1271,1599,1275,-402,401,1275,1600,-1278,1275,322,1259,-1601,1600,1259,52,-1277,1277,1600,1276,-328,328,1272,1601,-1280,1272,401,1277,-1602,1601,1277,327,-1279,1279,1601,1278,-54,105,1280,1602,-1265,1280,329,1281,-1603,1602,1281,402,-1283,1264,1602,1282,-325,329,1283,1603,-1282,1283,106,1284,-1604,1603,1284,330,-1286,1281,1603,1285,-403,402,1285,1604,-1289,1285,330,1286,-1605,1604,1286,58,-1288,1288,1604,1287,-332,324,1282,1605,-1267,1282,402,1288,-1606,1605,1288,331,-1290,1266,1605,1289,-60,110,1290,1606,-1294,1290,332,1291,-1607,1606,1291,403,-1293,1293,1606,1292,-335,332,1294,1607,-1292,1294,111,1273,-1608,1607,1273,328,-1296,1291,1607,1295,-404,403,1295,1608,-1298,1295,328,1279,-1609,1608,1279,53,-1297,1297,1608,1296,-334,334,1292,1609,-1300,1292,403,1297,-1610,1609,1297,333,-1299,1299,1609,1298,-55,106,1300,1610,-1285,1300,335,1301,-1611,1610,1301,404,-1303,1284,1610,1302,-331,335,1303,1611,-1302,1303,107,1304,-1612,1611,1304,336,-1306,1301,1611,1305,-405,404,1305,1612,-1309,1305,336,1306,-1613,1612,1306,57,-1308,1308,1612,1307,-338,330,1302,1613,-1287,1302,404,1308,-1614,1613,1308,337,-1310,1286,1613,1309,-59,109,1310,1614,-1314,1310,338,1311,-1615,1614,1311,405,-1313,1313,1614,1312,-341,338,1314,1615,-1312,1314,110,1293,-1616,1615,1293,334,-1316,1311,1615,1315,-406,405,1315,1616,-1318,1315,334,1299,-1617,1616,1299,54,-1317,1317,1616,1316,-340,340,1312,1617,-1320,1312,405,1317,-1618,1617,1317,339,-1319,1319,1617,1318,-56,107,1320,1618,-1305,1320,341,1321,-1619,1618,1321,406,-1323,1304,1618,1322,-337,341,1323,1619,-1322,1323,108,1324,-1620,1619,1324,342,-1326,1321,1619,1325,-407,406,1325,1620,-1329,1325,342,1326,-1621,1620,1326,56,-1328,1328,1620,1327,-344,336,1322,1621,-1307,1322,406,1328,-1622,1621,1328,343,-1330,1306,1621,1329,-58,108,1330,1622,-1325,1330,344,1331,-1623,1622, +1331,407,-1333,1324,1622,1332,-343,344,1333,1623,-1332,1333,109,1313,-1624,1623,1313,340,-1335,1331,1623,1334,-408,407,1334,1624,-1337,1334,340,1319,-1625,1624,1319,55,-1336,1336,1624,1335,-346,342,1332,1625,-1327,1332,407,1336,-1626,1625,1336,345,-1338,1326,1625,1337,-57,51,1248,1626,-1341,1248,318,1338,-1627,1626,1338,408,-1340,1340,1626,1339,-349,318,1246,1627,-1339,1246,50,1341,-1628,1627,1341,346,-1343,1338,1627,1342,-409,408,1342,1628,-1346,1342,346,1343,-1629,1628,1343,123,-1345,1345,1628,1344,-348,348,1339,1629,-1348,1339,408,1345,-1630,1629,1345,347,-1347,1347,1629,1346,-115,52,1258,1630,-1351,1258,321,1348,-1631,1630,1348,409,-1350,1350,1630,1349,-351,321,1256,1631,-1349,1256,51,1340,-1632,1631,1340,348,-1352,1348,1631,1351,-410,409,1351,1632,-1354,1351,348,1347,-1633,1632,1347,114,-1353,1353,1632,1352,-350,350,1349,1633,-1356,1349,409,1353,-1634,1633,1353,349,-1355,1355,1633,1354,-116,53,1278,1634,-1359,1278,327,1356,-1635,1634,1356,410,-1358,1358,1634,1357,-353,327,1276,1635,-1357,1276,52,1350,-1636,1635,1350,350,-1360,1356,1635,1359,-411,410,1359,1636,-1362,1359,350,1355,-1637,1636,1355,115,-1361,1361,1636,1360,-352,352,1357,1637,-1364,1357,410,1361,-1638,1637,1361,351,-1363,1363,1637,1362,-117,54,1298,1638,-1367,1298,333,1364,-1639,1638,1364,411,-1366,1366,1638,1365,-355,333,1296,1639,-1365,1296,53,1358,-1640,1639,1358,352,-1368,1364,1639,1367,-412,411,1367,1640,-1370,1367,352,1363,-1641,1640,1363,116,-1369,1369,1640,1368,-354,354,1365,1641,-1372,1365,411,1369,-1642,1641,1369,353,-1371,1371,1641,1370,-118,55,1318,1642,-1375,1318,339,1372,-1643,1642,1372,412,-1374,1374,1642,1373,-357,339,1316,1643,-1373,1316,54,1366,-1644,1643,1366,354,-1376,1372,1643,1375,-413,412,1375,1644,-1378,1375,354,1371,-1645,1644,1371,117,-1377,1377,1644,1376,-356,356,1373,1645,-1380,1373,412,1377,-1646,1645,1377,355,-1379,1379,1645,1378,-119,56,1337,1646,-1383,1337,345,1380,-1647,1646,1380,413,-1382,1382,1646,1381,-359,345,1335,1647,-1381,1335,55,1374,-1648,1647,1374,356,-1384,1380,1647,1383,-414,413,1383,1648,-1386,1383,356, +1379,-1649,1648,1379,118,-1385,1385,1648,1384,-358,358,1381,1649,-1388,1381,413,1385,-1650,1649,1385,357,-1387,1387,1649,1386,-120,57,1329,1650,-1391,1329,343,1388,-1651,1650,1388,414,-1390,1390,1650,1389,-361,343,1327,1651,-1389,1327,56,1382,-1652,1651,1382,358,-1392,1388,1651,1391,-415,414,1391,1652,-1394,1391,358,1387,-1653,1652,1387,119,-1393,1393,1652,1392,-360,360,1389,1653,-1396,1389,414,1393,-1654,1653,1393,359,-1395,1395,1653,1394,-121,58,1309,1654,-1399,1309,337,1396,-1655,1654,1396,415,-1398,1398,1654,1397,-363,337,1307,1655,-1397,1307,57,1390,-1656,1655,1390,360,-1400,1396,1655,1399,-416,415,1399,1656,-1402,1399,360,1395,-1657,1656,1395,120,-1401,1401,1656,1400,-362,362,1397,1657,-1404,1397,415,1401,-1658,1657,1401,361,-1403,1403,1657,1402,-122,59,1289,1658,-1407,1289,331,1404,-1659,1658,1404,416,-1406,1406,1658,1405,-365,331,1287,1659,-1405,1287,58,1398,-1660,1659,1398,362,-1408,1404,1659,1407,-417,416,1407,1660,-1410,1407,362,1403,-1661,1660,1403,121,-1409,1409,1660,1408,-364,364,1405,1661,-1412,1405,416,1409,-1662,1661,1409,363,-1411,1411,1661,1410,-123,50,1269,1662,-1342,1269,325,1412,-1663,1662,1412,417,-1414,1341,1662,1413,-347,325,1267,1663,-1413,1267,59,1406,-1664,1663,1406,364,-1415,1412,1663,1414,-418,417,1414,1664,-1417,1414,364,1411,-1665,1664,1411,122,-1416,1416,1664,1415,-366,346,1413,1665,-1344,1413,417,1416,-1666,1665,1416,365,-1418,1343,1665,1417,-124,23,1418,1666,-1422,1418,366,1419,-1667,1666,1419,418,-1421,1421,1666,1420,-125,366,1422,1667,-1420,1422,33,1423,-1668,1667,1423,367,-1425,1419,1667,1424,-419,418,1424,1668,-1427,1424,367,1425,-1669,1668,1425,61,-1180,1426,1668,1179,-302,124,1420,1669,-1428,1420,418,1426,-1670,1669,1426,301,-1177,1427,1669,1176,-61,33,1428,1670,-1424,1428,125,1429,-1671,1670,1429,419,-1431,1423,1670,1430,-368,125,1431,1671,-1430,1431,35,1432,-1672,1671,1432,126,-1434,1429,1671,1433,-420,419,1433,1672,-1436,1433,126,1434,-1673,1672,1434,62,-1196,1435,1672,1195,-306,367,1430,1673,-1426,1430,419,1435,-1674,1673,1435,305,-1193,1425,1673,1192,-62,35,1436,1674,-1433, +1436,127,1437,-1675,1674,1437,420,-1439,1432,1674,1438,-127,127,1439,1675,-1438,1439,37,1440,-1676,1675,1440,128,-1442,1437,1675,1441,-421,420,1441,1676,-1444,1441,128,1442,-1677,1676,1442,63,-1212,1443,1676,1211,-310,126,1438,1677,-1435,1438,420,1443,-1678,1677,1443,309,-1209,1434,1677,1208,-63,37,1444,1678,-1441,1444,129,1445,-1679,1678,1445,421,-1447,1440,1678,1446,-129,129,1447,1679,-1446,1447,39,1448,-1680,1679,1448,130,-1450,1445,1679,1449,-422,421,1449,1680,-1452,1449,130,1450,-1681,1680,1450,64,-1228,1451,1680,1227,-314,128,1446,1681,-1443,1446,421,1451,-1682,1681,1451,313,-1225,1442,1681,1224,-64,39,1452,1682,-1449,1452,131,1453,-1683,1682,1453,422,-1455,1448,1682,1454,-131,131,1455,1683,-1454,1455,38,1456,-1684,1683,1456,132,-1458,1453,1683,1457,-423,422,1457,1684,-1460,1457,132,1458,-1685,1684,1458,65,-1236,1459,1684,1235,-316,130,1454,1685,-1451,1454,422,1459,-1686,1685,1459,315,-1233,1450,1685,1232,-65,38,1460,1686,-1457,1460,133,1461,-1687,1686,1461,423,-1463,1456,1686,1462,-133,133,1463,1687,-1462,1463,36,1464,-1688,1687,1464,134,-1466,1461,1687,1465,-424,423,1465,1688,-492,1465,134,490,-1689,1688,490,66,-1221,491,1688,1220,-312,132,1462,1689,-1459,1462,423,491,-1690,1689,491,311,-1217,1458,1689,1216,-66,36,492,1690,-1465,492,135,493,-1691,1690,493,424,-495,1464,1690,494,-135,135,495,1691,-494,495,34,496,-1692,1691,496,136,-498,493,1691,497,-425,424,497,1692,-500,497,136,498,-1693,1692,498,67,-1205,499,1692,1204,-308,134,494,1693,-491,494,424,499,-1694,1693,499,307,-1201,490,1693,1200,-67,34,500,1694,-497,500,137,501,-1695,1694,501,425,-503,496,1694,502,-137,137,503,1695,-502,503,25,504,-1696,1695,504,138,-506,501,1695,505,-426,425,505,1696,-508,505,138,506,-1697,1696,506,68,-1189,507,1696,1188,-304,136,502,1697,-499,502,425,507,-1698,1697,507,303,-1185,498,1697,1184,-68,25,508,1698,-505,508,139,509,-1699,1698,509,426,-511,504,1698,510,-139,139,511,1699,-510,511,24,512,-1700,1699,512,140,-514,509,1699,513,-427,426,513,1700,-516,513,140,514,-1701,1700,514,69,-1111,515,1700,1110,-285,138,510,1701,-507, +510,426,515,-1702,1701,515,284,-1107,506,1701,1106,-69,24,516,1702,-513,516,141,517,-1703,1702,517,427,-519,512,1702,518,-141,141,519,1703,-518,519,23,1421,-1704,1703,1421,124,-521,517,1703,520,-428,427,520,1704,-522,520,124,1427,-1705,1704,1427,60,-1101,521,1704,1100,-282,140,518,1705,-515,518,427,521,-1706,1705,521,281,-1097,514,1705,1096,-70,19,522,1706,-1071,522,142,523,-1707,1706,523,428,-525,1070,1706,524,-275,142,525,1707,-524,525,70,526,-1708,1707,526,143,-528,523,1707,527,-429,428,527,1708,-531,527,143,528,-1709,1708,528,71,-530,530,1708,529,-145,274,524,1709,-1074,524,428,530,-1710,1709,530,144,-532,1073,1709,531,-18,70,525,1710,-535,525,142,532,-1711,1710,532,429,-534,534,1710,533,-147,142,522,1711,-533,522,19,1063,-1712,1711,1063,271,-536,532,1711,535,-430,429,535,1712,-538,535,271,1060,-1713,1712,1060,14,-537,537,1712,536,-146,146,533,1713,-540,533,429,537,-1714,1713,537,145,-539,539,1713,538,-73,73,540,1714,-544,540,147,541,-1715,1714,541,430,-543,543,1714,542,-149,147,544,1715,-542,544,1,1054,-1716,1715,1054,268,-546,541,1715,545,-431,430,545,1716,-547,545,268,1050,-1717,1716,1050,17,-532,546,1716,531,-145,148,542,1717,-548,542,430,546,-1718,1717,546,144,-530,547,1717,529,-72,6,548,1718,-1041,548,149,549,-1719,1718,549,431,-551,1040,1718,550,-266,149,551,1719,-550,551,74,552,-1720,1719,552,150,-554,549,1719,553,-432,431,553,1720,-556,553,150,554,-1721,1720,554,72,-539,555,1720,538,-146,265,550,1721,-1044,550,431,555,-1722,1721,555,145,-537,1043,1721,536,-15,75,556,1722,-560,556,151,557,-1723,1722,557,432,-559,559,1722,558,-153,151,560,1723,-558,560,73,543,-1724,1723,543,148,-562,557,1723,561,-433,432,561,1724,-563,561,148,547,-1725,1724,547,71,-529,562,1724,528,-144,152,558,1725,-564,558,432,562,-1726,1725,562,143,-527,563,1725,526,-71,74,564,1726,-553,564,153,565,-1727,1726,565,433,-567,552,1726,566,-151,153,567,1727,-566,567,75,559,-1728,1727,559,152,-569,565,1727,568,-434,433,568,1728,-570,568,152,563,-1729,1728,563,70,-535,569,1728,534,-147,150,566,1729,-555,566,433,569,-1730,1729,569,146,-540,554, +1729,539,-73,76,570,1730,-574,570,154,571,-1731,1730,571,434,-573,573,1730,572,-156,154,574,1731,-572,574,74,551,-1732,1731,551,149,-576,571,1731,575,-435,434,575,1732,-577,575,149,548,-1733,1732,548,6,-995,576,1732,994,-251,155,572,1733,-578,572,434,576,-1734,1733,576,250,-991,577,1733,990,-6,73,578,1734,-541,578,156,579,-1735,1734,579,435,-581,540,1734,580,-148,156,581,1735,-580,581,77,582,-1736,1735,582,157,-584,579,1735,583,-436,435,583,1736,-586,583,157,584,-1737,1736,584,2,-986,585,1736,985,-248,147,580,1737,-545,580,435,585,-1738,1737,585,247,-984,544,1737,983,-2,11,1035,1738,-589,1035,263,586,-1739,1738,586,436,-588,588,1738,587,-161,263,1032,1739,-587,1032,12,589,-1740,1739,589,158,-591,586,1739,590,-437,436,590,1740,-594,590,158,591,-1741,1740,591,78,-593,593,1740,592,-160,160,587,1741,-596,587,436,593,-1742,1741,593,159,-595,595,1741,594,-80,12,1025,1742,-590,1025,260,596,-1743,1742,596,437,-598,589,1742,597,-159,260,1022,1743,-597,1022,8,598,-1744,1743,598,161,-600,596,1743,599,-438,437,599,1744,-603,599,161,600,-1745,1744,600,80,-602,602,1744,601,-163,158,597,1745,-592,597,437,602,-1746,1745,602,162,-604,591,1745,603,-79,76,573,1746,-607,573,155,604,-1747,1746,604,438,-606,606,1746,605,-164,155,577,1747,-605,577,5,1016,-1748,1747,1016,257,-608,604,1747,607,-439,438,607,1748,-609,607,257,1012,-1749,1748,1012,11,-589,608,1748,588,-161,163,605,1749,-610,605,438,608,-1750,1749,608,160,-596,609,1749,595,-80,2,584,1750,-1003,584,157,610,-1751,1750,610,439,-612,1002,1750,611,-255,157,582,1751,-611,582,77,612,-1752,1751,612,164,-614,610,1751,613,-440,439,613,1752,-616,613,164,614,-1753,1752,614,80,-601,615,1752,600,-162,254,611,1753,-1006,611,439,615,-1754,1753,615,161,-599,1005,1753,598,-9,79,594,1754,-610,594,159,616,-1755,1754,616,440,-618,609,1754,617,-164,159,592,1755,-617,592,78,618,-1756,1755,618,165,-620,616,1755,619,-441,440,619,1756,-623,619,165,620,-1757,1756,620,81,-622,622,1756,621,-167,163,617,1757,-607,617,440,622,-1758,1757,622,166,-624,606,1757,623,-77,78,603,1758,-619,603,162,624,-1759,1758, +624,441,-626,618,1758,625,-166,162,601,1759,-625,601,80,614,-1760,1759,614,164,-627,624,1759,626,-442,441,626,1760,-629,626,164,612,-1761,1760,612,77,-628,628,1760,627,-168,165,625,1761,-621,625,441,628,-1762,1761,628,167,-630,620,1761,629,-82,75,567,1762,-633,567,153,630,-1763,1762,630,442,-632,632,1762,631,-169,153,564,1763,-631,564,74,574,-1764,1763,574,154,-634,630,1763,633,-443,442,633,1764,-635,633,154,570,-1765,1764,570,76,-624,634,1764,623,-167,168,631,1765,-636,631,442,634,-1766,1765,634,166,-622,635,1765,621,-82,73,560,1766,-579,560,151,636,-1767,1766,636,443,-638,578,1766,637,-157,151,556,1767,-637,556,75,632,-1768,1767,632,168,-639,636,1767,638,-444,443,638,1768,-640,638,168,635,-1769,1768,635,81,-630,639,1768,629,-168,156,637,1769,-582,637,443,639,-1770,1769,639,167,-628,581,1769,627,-78,83,640,1770,-644,640,169,641,-1771,1770,641,444,-643,643,1770,642,-173,169,644,1771,-642,644,82,645,-1772,1771,645,170,-647,641,1771,646,-445,444,646,1772,-650,646,170,647,-1773,1772,647,41,-649,649,1772,648,-172,172,642,1773,-652,642,444,649,-1774,1773,649,171,-651,651,1773,650,-43,82,652,1774,-646,652,173,653,-1775,1774,653,445,-655,645,1774,654,-171,173,655,1775,-654,655,84,656,-1776,1775,656,174,-658,653,1775,657,-446,445,657,1776,-661,657,174,658,-1777,1776,658,40,-660,660,1776,659,-176,170,654,1777,-648,654,445,660,-1778,1777,660,175,-662,647,1777,661,-42,85,662,1778,-666,662,176,663,-1779,1778,663,446,-665,665,1778,664,-179,176,666,1779,-664,666,83,643,-1780,1779,643,172,-668,663,1779,667,-447,446,667,1780,-670,667,172,651,-1781,1780,651,42,-669,669,1780,668,-178,178,664,1781,-672,664,446,669,-1782,1781,669,177,-671,671,1781,670,-45,84,672,1782,-657,672,179,673,-1783,1782,673,447,-675,656,1782,674,-175,179,675,1783,-674,675,86,676,-1784,1783,676,180,-678,673,1783,677,-448,447,677,1784,-681,677,180,678,-1785,1784,678,43,-680,680,1784,679,-182,174,674,1785,-659,674,447,680,-1786,1785,680,181,-682,658,1785,681,-41,87,682,1786,-686,682,182,683,-1787,1786,683,448,-685,685,1786,684,-185,182,686,1787,-684,686,85,665,-1788, +1787,665,178,-688,683,1787,687,-449,448,687,1788,-690,687,178,671,-1789,1788,671,44,-689,689,1788,688,-184,184,684,1789,-692,684,448,689,-1790,1789,689,183,-691,691,1789,690,-47,86,692,1790,-677,692,185,693,-1791,1790,693,449,-695,676,1790,694,-181,185,695,1791,-694,695,88,696,-1792,1791,696,186,-698,693,1791,697,-450,449,697,1792,-701,697,186,698,-1793,1792,698,45,-700,700,1792,699,-188,180,694,1793,-679,694,449,700,-1794,1793,700,187,-702,678,1793,701,-44,89,702,1794,-706,702,188,703,-1795,1794,703,450,-705,705,1794,704,-191,188,706,1795,-704,706,87,685,-1796,1795,685,184,-708,703,1795,707,-451,450,707,1796,-710,707,184,691,-1797,1796,691,46,-709,709,1796,708,-190,190,704,1797,-712,704,450,709,-1798,1797,709,189,-711,711,1797,710,-49,88,712,1798,-697,712,191,713,-1799,1798,713,451,-715,696,1798,714,-187,191,715,1799,-714,715,90,716,-1800,1799,716,192,-718,713,1799,717,-452,451,717,1800,-721,717,192,718,-1801,1800,718,47,-720,720,1800,719,-194,186,714,1801,-699,714,451,720,-1802,1801,720,193,-722,698,1801,721,-46,91,722,1802,-726,722,194,723,-1803,1802,723,452,-725,725,1802,724,-197,194,726,1803,-724,726,89,705,-1804,1803,705,190,-728,723,1803,727,-453,452,727,1804,-730,727,190,711,-1805,1804,711,48,-729,729,1804,728,-196,196,724,1805,-732,724,452,729,-1806,1805,729,195,-731,731,1805,730,-50,90,732,1806,-717,732,197,733,-1807,1806,733,453,-735,716,1806,734,-193,197,735,1807,-734,735,91,725,-1808,1807,725,196,-737,733,1807,736,-454,453,736,1808,-739,736,196,731,-1809,1808,731,49,-738,738,1808,737,-199,192,734,1809,-719,734,453,738,-1810,1809,738,198,-740,718,1809,739,-48,93,740,1810,-744,740,199,741,-1811,1810,741,454,-743,743,1810,742,-202,199,744,1811,-742,744,92,745,-1812,1811,745,200,-747,741,1811,746,-455,454,746,1812,-749,746,200,747,-1813,1812,747,91,-736,748,1812,735,-198,201,742,1813,-750,742,454,748,-1814,1813,748,197,-733,749,1813,732,-91,92,750,1814,-746,750,202,751,-1815,1814,751,455,-753,745,1814,752,-201,202,753,1815,-752,753,94,754,-1816,1815,754,203,-756,751,1815,755,-456,455,755,1816,-758,755,203, +756,-1817,1816,756,89,-727,757,1816,726,-195,200,752,1817,-748,752,455,757,-1818,1817,757,194,-723,747,1817,722,-92,95,758,1818,-762,758,204,759,-1819,1818,759,456,-761,761,1818,760,-206,204,762,1819,-760,762,93,743,-1820,1819,743,201,-764,759,1819,763,-457,456,763,1820,-765,763,201,749,-1821,1820,749,90,-716,764,1820,715,-192,205,760,1821,-766,760,456,764,-1822,1821,764,191,-713,765,1821,712,-89,94,766,1822,-755,766,206,767,-1823,1822,767,457,-769,754,1822,768,-204,206,769,1823,-768,769,96,770,-1824,1823,770,207,-772,767,1823,771,-458,457,771,1824,-774,771,207,772,-1825,1824,772,87,-707,773,1824,706,-189,203,768,1825,-757,768,457,773,-1826,1825,773,188,-703,756,1825,702,-90,97,774,1826,-778,774,208,775,-1827,1826,775,458,-777,777,1826,776,-210,208,778,1827,-776,778,95,761,-1828,1827,761,205,-780,775,1827,779,-459,458,779,1828,-781,779,205,765,-1829,1828,765,88,-696,780,1828,695,-186,209,776,1829,-782,776,458,780,-1830,1829,780,185,-693,781,1829,692,-87,96,782,1830,-771,782,210,783,-1831,1830,783,459,-785,770,1830,784,-208,210,785,1831,-784,785,98,786,-1832,1831,786,211,-788,783,1831,787,-460,459,787,1832,-790,787,211,788,-1833,1832,788,85,-687,789,1832,686,-183,207,784,1833,-773,784,459,789,-1834,1833,789,182,-683,772,1833,682,-88,99,790,1834,-794,790,212,791,-1835,1834,791,460,-793,793,1834,792,-214,212,794,1835,-792,794,97,777,-1836,1835,777,209,-796,791,1835,795,-461,460,795,1836,-797,795,209,781,-1837,1836,781,86,-676,796,1836,675,-180,213,792,1837,-798,792,460,796,-1838,1837,796,179,-673,797,1837,672,-85,98,798,1838,-787,798,214,799,-1839,1838,799,461,-801,786,1838,800,-212,214,801,1839,-800,801,100,802,-1840,1839,802,215,-804,799,1839,803,-462,461,803,1840,-806,803,215,804,-1841,1840,804,83,-667,805,1840,666,-177,211,800,1841,-789,800,461,805,-1842,1841,805,176,-663,788,1841,662,-86,84,655,1842,-798,655,173,806,-1843,1842,806,462,-808,797,1842,807,-214,173,652,1843,-807,652,82,808,-1844,1843,808,216,-810,806,1843,809,-463,462,809,1844,-813,809,216,810,-1845,1844,810,101,-812,812,1844,811,-218,213,807,1845,-794, +807,462,812,-1846,1845,812,217,-814,793,1845,813,-100,82,644,1846,-809,644,169,814,-1847,1846,814,463,-816,808,1846,815,-217,169,640,1847,-815,640,83,804,-1848,1847,804,215,-817,814,1847,816,-464,463,816,1848,-819,816,215,802,-1849,1848,802,100,-818,818,1848,817,-219,216,815,1849,-811,815,463,818,-1850,1849,818,218,-820,810,1849,819,-102,95,820,1850,-759,820,219,821,-1851,1850,821,464,-823,758,1850,822,-205,219,823,1851,-822,823,102,824,-1852,1851,824,220,-826,821,1851,825,-465,464,825,1852,-828,825,220,826,-1853,1852,826,92,-745,827,1852,744,-200,204,822,1853,-763,822,464,827,-1854,1853,827,199,-741,762,1853,740,-94,102,828,1854,-825,828,221,829,-1855,1854,829,465,-831,824,1854,830,-221,221,831,1855,-830,831,96,769,-1856,1855,769,206,-833,829,1855,832,-466,465,832,1856,-834,832,206,766,-1857,1856,766,94,-754,833,1856,753,-203,220,830,1857,-827,830,465,833,-1858,1857,833,202,-751,826,1857,750,-93,103,834,1858,-838,834,222,835,-1859,1858,835,466,-837,837,1858,836,-224,222,838,1859,-836,838,97,794,-1860,1859,794,212,-840,835,1859,839,-467,466,839,1860,-841,839,212,790,-1861,1860,790,99,-814,840,1860,813,-218,223,836,1861,-842,836,466,840,-1862,1861,840,217,-812,841,1861,811,-102,98,842,1862,-799,842,224,843,-1863,1862,843,467,-845,798,1862,844,-215,224,845,1863,-844,845,103,837,-1864,1863,837,223,-847,843,1863,846,-468,467,846,1864,-848,846,223,841,-1865,1864,841,101,-820,847,1864,819,-219,214,844,1865,-802,844,467,847,-1866,1865,847,218,-818,801,1865,817,-101,97,838,1866,-775,838,222,848,-1867,1866,848,468,-850,774,1866,849,-209,222,834,1867,-849,834,103,850,-1868,1867,850,225,-852,848,1867,851,-469,468,851,1868,-854,851,225,852,-1869,1868,852,102,-824,853,1868,823,-220,208,849,1869,-779,849,468,853,-1870,1869,853,219,-821,778,1869,820,-96,103,845,1870,-851,845,224,854,-1871,1870,854,469,-856,850,1870,855,-226,224,842,1871,-855,842,98,785,-1872,1871,785,210,-857,854,1871,856,-470,469,856,1872,-858,856,210,782,-1873,1872,782,96,-832,857,1872,831,-222,225,855,1873,-853,855,469,857,-1874,1873,857,221,-829,852,1873,828, +-103,40,681,1874,-861,681,181,858,-1875,1874,858,470,-860,860,1874,859,-228,181,679,1875,-859,679,43,861,-1876,1875,861,226,-863,858,1875,862,-471,470,862,1876,-865,862,226,863,-1877,1876,863,105,-1264,864,1876,1263,-324,227,859,1877,-866,859,470,864,-1878,1877,864,323,-1261,865,1877,1260,-105,43,701,1878,-862,701,187,866,-1879,1878,866,471,-868,861,1878,867,-227,187,699,1879,-867,699,45,868,-1880,1879,868,228,-870,866,1879,869,-472,471,869,1880,-872,869,228,870,-1881,1880,870,106,-1284,871,1880,1283,-330,226,867,1881,-864,867,471,871,-1882,1881,871,329,-1281,863,1881,1280,-106,45,721,1882,-869,721,193,872,-1883,1882,872,472,-874,868,1882,873,-229,193,719,1883,-873,719,47,874,-1884,1883,874,229,-876,872,1883,875,-473,472,875,1884,-878,875,229,876,-1885,1884,876,107,-1304,877,1884,1303,-336,228,873,1885,-871,873,472,877,-1886,1885,877,335,-1301,870,1885,1300,-107,47,739,1886,-875,739,198,878,-1887,1886,878,473,-880,874,1886,879,-230,198,737,1887,-879,737,49,880,-1888,1887,880,230,-882,878,1887,881,-474,473,881,1888,-884,881,230,882,-1889,1888,882,108,-1324,883,1888,1323,-342,229,879,1889,-877,879,473,883,-1890,1889,883,341,-1321,876,1889,1320,-108,49,730,1890,-881,730,195,884,-1891,1890,884,474,-886,880,1890,885,-231,195,728,1891,-885,728,48,886,-1892,1891,886,231,-888,884,1891,887,-475,474,887,1892,-890,887,231,888,-1893,1892,888,109,-1334,889,1892,1333,-345,230,885,1893,-883,885,474,889,-1894,1893,889,344,-1331,882,1893,1330,-109,48,710,1894,-887,710,189,890,-1895,1894,890,475,-892,886,1894,891,-232,189,708,1895,-891,708,46,892,-1896,1895,892,232,-894,890,1895,893,-476,475,893,1896,-896,893,232,894,-1897,1896,894,110,-1315,895,1896,1314,-339,231,891,1897,-889,891,475,895,-1898,1897,895,338,-1311,888,1897,1310,-110,46,690,1898,-893,690,183,896,-1899,1898,896,476,-898,892,1898,897,-233,183,688,1899,-897,688,44,898,-1900,1899,898,233,-900,896,1899,899,-477,476,899,1900,-902,899,233,900,-1901,1900,900,111,-1295,901,1900,1294,-333,232,897,1901,-895,897,476,901,-1902,1901,901,332,-1291,894,1901,1290,-111,44,670,1902,-899, +670,177,902,-1903,1902,902,477,-904,898,1902,903,-234,177,668,1903,-903,668,42,904,-1904,1903,904,234,-906,902,1903,905,-478,477,905,1904,-908,905,234,906,-1905,1904,906,112,-1275,907,1904,1274,-327,233,903,1905,-901,903,477,907,-1906,1905,907,326,-1271,900,1905,1270,-112,42,650,1906,-905,650,171,908,-1907,1906,908,478,-910,904,1906,909,-235,171,648,1907,-909,648,41,910,-1908,1907,910,235,-912,908,1907,911,-479,478,911,1908,-914,911,235,912,-1909,1908,912,113,-1255,913,1908,1254,-321,234,909,1909,-907,909,478,913,-1910,1909,913,320,-1251,906,1909,1250,-113,41,661,1910,-911,661,175,914,-1911,1910,914,479,-916,910,1910,915,-236,175,659,1911,-915,659,40,860,-1912,1911,860,227,-917,914,1911,916,-480,479,916,1912,-918,916,227,865,-1913,1912,865,104,-1243,917,1912,1242,-317,235,915,1913,-913,915,479,917,-1914,1913,917,316,-1239,912,1913,1238,-114,115,1354,1914,-921,1354,349,918,-1915,1914,918,480,-920,920,1914,919,-238,349,1352,1915,-919,1352,114,921,-1916,1915,921,236,-923,918,1915,922,-481,480,922,1916,-925,922,236,923,-1917,1916,923,24,-512,924,1916,511,-140,237,919,1917,-926,919,480,924,-1918,1917,924,139,-509,925,1917,508,-26,116,1362,1918,-929,1362,351,926,-1919,1918,926,481,-928,928,1918,927,-239,351,1360,1919,-927,1360,115,920,-1920,1919,920,237,-930,926,1919,929,-482,481,929,1920,-931,929,237,925,-1921,1920,925,25,-504,930,1920,503,-138,238,927,1921,-932,927,481,930,-1922,1921,930,137,-501,931,1921,500,-35,117,1370,1922,-935,1370,353,932,-1923,1922,932,482,-934,934,1922,933,-240,353,1368,1923,-933,1368,116,928,-1924,1923,928,238,-936,932,1923,935,-483,482,935,1924,-937,935,238,931,-1925,1924,931,34,-496,936,1924,495,-136,239,933,1925,-938,933,482,936,-1926,1925,936,135,-493,937,1925,492,-37,118,1378,1926,-941,1378,355,938,-1927,1926,938,483,-940,940,1926,939,-241,355,1376,1927,-939,1376,117,934,-1928,1927,934,239,-942,938,1927,941,-484,483,941,1928,-943,941,239,937,-1929,1928,937,36,-1464,942,1928,1463,-134,240,939,1929,-944,939,483,942,-1930,1929,942,133,-1461,943,1929,1460,-39,119,1386,1930,-947,1386,357,944, +-1931,1930,944,484,-946,946,1930,945,-242,357,1384,1931,-945,1384,118,940,-1932,1931,940,240,-948,944,1931,947,-485,484,947,1932,-949,947,240,943,-1933,1932,943,38,-1456,948,1932,1455,-132,241,945,1933,-950,945,484,948,-1934,1933,948,131,-1453,949,1933,1452,-40,120,1394,1934,-953,1394,359,950,-1935,1934,950,485,-952,952,1934,951,-243,359,1392,1935,-951,1392,119,946,-1936,1935,946,241,-954,950,1935,953,-486,485,953,1936,-955,953,241,949,-1937,1936,949,39,-1448,954,1936,1447,-130,242,951,1937,-956,951,485,954,-1938,1937,954,129,-1445,955,1937,1444,-38,121,1402,1938,-959,1402,361,956,-1939,1938,956,486,-958,958,1938,957,-244,361,1400,1939,-957,1400,120,952,-1940,1939,952,242,-960,956,1939,959,-487,486,959,1940,-961,959,242,955,-1941,1940,955,37,-1440,960,1940,1439,-128,243,957,1941,-962,957,486,960,-1942,1941,960,127,-1437,961,1941,1436,-36,122,1410,1942,-965,1410,363,962,-1943,1942,962,487,-964,964,1942,963,-245,363,1408,1943,-963,1408,121,958,-1944,1943,958,243,-966,962,1943,965,-488,487,965,1944,-967,965,243,961,-1945,1944,961,35,-1432,966,1944,1431,-126,244,963,1945,-968,963,487,966,-1946,1945,966,125,-1429,967,1945,1428,-34,123,1417,1946,-971,1417,365,968,-1947,1946,968,488,-970,970,1946,969,-246,365,1415,1947,-969,1415,122,964,-1948,1947,964,244,-972,968,1947,971,-489,488,971,1948,-973,971,244,967,-1949,1948,967,33,-1423,972,1948,1422,-367,245,969,1949,-974,969,488,972,-1950,1949,972,366,-1419,973,1949,1418,-24,114,1346,1950,-922,1346,347,974,-1951,1950,974,489,-976,921,1950,975,-237,347,1344,1951,-975,1344,123,970,-1952,1951,970,245,-977,974,1951,976,-490,489,976,1952,-978,976,245,973,-1953,1952,973,23,-520,977,1952,519,-142,236,975,1953,-924,975,489,977,-1954,1953,977,141,-517,923,1953,516,-25 + } + Edges: *3904 { + a: 21,25,37,41,63,51,15,3,106,110,122,126,127,115,79,67,64,68,80,84,128,132,144,148,170,174,186,190,192,196,208,212,234,238,250,254,255,243,207,195,298,302,314,318,256,260,272,276,362,366,378,382,320,324,336,340,426,430,442,446,384,388,400,404,490,494,506,510,511,499,463,451,448,452,464,468,554,558,570,574,512,516,528,532,576,580,592,596,618,622,634,638,0,4,16,20,533,537,549,553,405,409,421,425,85,89,101,105,277,281,293,297,149,153,165,169,42,46,58,62,640,644,656,660,661,665,677,681,703,691,655,643,704,708,720,724,767,755,719,707,3776,3780,3792,3796,3203,3215,3251,3263,831,819,783,771,3712,3716,3728,3732,895,883,847,835,896,900,912,916,917,921,933,937,960,964,976,980,1023,1011,975,963,1066,1070,1082,1086,1087,1075,1039,1027,1109,1113,1125,1129,1130,1134,1146,1150,1152,1156,1168,1172,1173,1177,1189,1193,1216,1220,1232,1236,1279,1267,1231,1219,1280,1284,1296,1300,1301,1305,1317,1321,1344,1348,1360,1364,3200,3204,3216,3220,3221,3225,3237,3241,3648,3652,3664,3668,1535,1523,1487,1475,3264,3268,3280,3284,3285,3289,3301,3305,3584,3588,3600,3604,1663,1651,1615,1603,3328,3332,3344,3348,3349,3353,3365,3369,3520,3524,3536,3540,1791,1779,1743,1731,3392,3396,3408,3412,3413,3417,3429,3433,3456,3460,3472,3476,4990,4986,4974,4970,6531,6543,6579,6591,7209,7205,7193,7189,4926,4922,4910,4906,7231,7219,7183,7171,5118,5114,5102,5098,6549,6553,6565,6569,5054,5050,5038,5034,7295,7283,7247,7235,5246,5242,5230,5226,6613,6617,6629,6633,5182,5178,5166,5162,7359,7347,7311,7299,5374,5370,5358,5354,6677,6681,6693,6697,5310,5306,5294,5290,7423,7411,7375,7363,5502,5498,5486,5482,6741,6745,6757,6761,5438,5434,5422,5418,2581,2585,2597,2601,1983,1971,1935,1923,2047,2035,1999,1987,2175,2163,2127,2115,2303,2291,2255,2243,2431,2419,2383,2371,2883,2895,2931,2943,2947,2959,2995,3007,3011,3023,3059,3071,3075,3087,3123,3135,1962,1966,1978,1982,2026,2030,2042,2046,2154,2158,2170,2174,2282,2286,2298,2302,2410,2414,2426,2430,2538,2542,2554,2558,2474,2478,2490,2494,2346,2350,2362,2366,2218,2222,2234,2238,2090,2094,2106,2110,789,793,805,809,1429, +1433,1445,1449,1557,1561,1573,1577,1685,1689,1701,1705,1813,1817,1829,1833,3497,3493,3481,3477,3561,3557,3545,3541,3625,3621,3609,3605,3689,3685,3673,3669,3753,3749,3737,3733,1408,1412,1424,1428,1536,1540,1552,1556,1664,1668,1680,1684,1792,1796,1808,1812,1856,1860,1872,1876,1728,1732,1744,1748,1600,1604,1616,1620,1472,1476,1488,1492,832,836,848,852,768,772,784,788,3840,3844,3856,3860,3861,3865,3877,3881,3882,3886,3898,3902,3946,3950,3962,3966,3967,3955,3919,3907,3968,3972,3984,3988,4031,4019,3983,3971,4032,4036,4048,4052,4053,4057,4069,4073,4096,4100,4112,4116,4159,4147,4111,4099,4160,4164,4176,4180,4224,4228,4240,4244,4287,4275,4239,4227,4288,4292,4304,4308,4309,4313,4325,4329,4373,4377,4389,4393,4394,4398,4410,4414,4415,4403,4367,4355,4437,4441,4453,4457,4458,4462,4474,4478,4543,4531,4495,4483,4565,4569,4581,4585,4629,4633,4645,4649,4650,4654,4666,4670,4714,4718,4730,4734,4799,4787,4751,4739,4864,4868,4880,4884,4885,4889,4901,4905,4927,4915,4879,4867,4928,4932,4944,4948,4949,4953,4965,4969,4992,4996,5008,5012,5055,5043,5007,4995,5056,5060,5072,5076,5077,5081,5093,5097,5120,5124,5136,5140,5183,5171,5135,5123,5184,5188,5200,5204,5205,5209,5221,5225,5248,5252,5264,5268,5311,5299,5263,5251,5312,5316,5328,5332,5333,5337,5349,5353,5376,5380,5392,5396,5439,5427,5391,5379,5440,5444,5456,5460,5504,5508,5520,5524,5525,5529,5541,5545,5567,5555,5519,5507,5568,5572,5584,5588,5589,5593,5605,5609,5632,5636,5648,5652,5695,5683,5647,5635,5696,5700,5712,5716,5717,5721,5733,5737,5760,5764,5776,5780,5823,5811,5775,5763,5824,5828,5840,5844,5845,5849,5861,5865,5888,5892,5904,5908,5951,5939,5903,5891,5952,5956,5968,5972,5973,5977,5989,5993,6037,6041,6053,6057,6058,6062,6074,6078,6122,6126,6138,6142,6144,6148,6160,6164,6165,6169,6181,6185,6208,6212,6224,6228,6272,6276,6288,6292,6335,6323,6287,6275,6336,6340,6352,6356,6421,6425,6437,6441,1941,1945,1957,1961,2069,2073,2085,2089,2197,2201,2213,2217,2325,2329,2341,2345,2453,2457,2469,2473,6825,6821,6809,6805,6889,6885,6873,6869,6953,6949,6937,6933,7017,7013,7001,6997,7081,7077,7065,7061,2048, +2052,2064,2068,2176,2180,2192,2196,2304,2308,2320,2324,2432,2436,2448,2452,2496,2500,2512,2516,2368,2372,2384,2388,2240,2244,2256,2260,2112,2116,2128,2132,1984,1988,2000,2004,1920,1924,1936,1940,2623,2611,2575,2563,2687,2675,2639,2627,2751,2739,2703,2691,2815,2803,2767,2755,2879,2867,2831,2819,7427,7439,7475,7487,7491,7503,7539,7551,7555,7567,7603,7615,7619,7631,7667,7679,7683,7695,7731,7743,2666,2670,2682,2686,2730,2734,2746,2750,2794,2798,2810,2814,2858,2862,2874,2878,2922,2926,2938,2942,2986,2990,3002,3006,3050,3054,3066,3070,3114,3118,3130,3134,3178,3182,3194,3198,2602,2606,2618,2622,5,9,10,14,26,30,47,35,69,73,74,78,90,94,111,99,133,137,138,142,154,158,175,163,197,201,202,206,218,222,239,227,261,265,266,270,282,286,303,291,325,329,330,334,346,350,367,355,389,393,394,398,410,414,431,419,453,457,458,462,474,478,495,483,517,521,522,526,538,542,559,547,581,585,586,590,602,606,623,611,645,649,650,654,666,670,687,675,709,713,714,718,730,734,751,739,773,777,778,782,794,798,815,803,837,841,842,846,858,862,879,867,901,905,906,910,922,926,943,931,965,969,970,974,986,990,1007,995,1029,1033,1034,1038,1050,1054,1071,1059,1093,1097,1098,1102,1114,1118,1135,1123,1157,1161,1162,1166,1178,1182,1199,1187,1221,1225,1226,1230,1242,1246,1263,1251,1285,1289,1290,1294,1306,1310,1327,1315,1349,1353,1354,1358,1370,1374,1391,1379,1413,1417,1418,1422,1434,1438,1455,1443,1477,1481,1482,1486,1498,1502,1519,1507,1541,1545,1546,1550,1562,1566,1583,1571,1605,1609,1610,1614,1626,1630,1647,1635,1669,1673,1674,1678,1690,1694,1711,1699,1733,1737,1738,1742,1754,1758,1775,1763,1797,1801,1802,1806,1818,1822,1839,1827,1861,1865,1866,1870,1882,1886,1903,1891,1925,1929,1930,1934,1946,1950,1967,1955,1989,1993,1994,1998,2010,2014,2031,2019,2053,2057,2058,2062,2074,2078,2095,2083,2117,2121,2122,2126,2138,2142,2159,2147,2181,2185,2186,2190,2202,2206,2223,2211,2245,2249,2250,2254,2266,2270,2287,2275,2309,2313,2314,2318,2330,2334,2351,2339,2373,2377,2378,2382,2394,2398,2415,2403,2437,2441,2442,2446,2458,2462,2479,2467,2501,2505,2506,2510,2522,2526,2543,2531, +2565,2569,2570,2574,2586,2590,2607,2595,2629,2633,2634,2638,2650,2654,2671,2659,2693,2697,2698,2702,2714,2718,2735,2723,2757,2761,2762,2766,2778,2782,2799,2787,2821,2825,2826,2830,2842,2846,2863,2851,2885,2889,2890,2894,2906,2910,2927,2915,2949,2953,2954,2958,2970,2974,2991,2979,3013,3017,3018,3022,3034,3038,3055,3043,3077,3081,3082,3086,3098,3102,3119,3107,3141,3145,3146,3150,3162,3166,3183,3171,3205,3209,3210,3214,3226,3230,3247,3235,3269,3273,3274,3278,3290,3294,3311,3299,3333,3337,3338,3342,3354,3358,3375,3363,3397,3401,3402,3406,3418,3422,3439,3427,3461,3465,3466,3470,3482,3486,3503,3491,3525,3529,3530,3534,3546,3550,3567,3555,3589,3593,3594,3598,3610,3614,3631,3619,3653,3657,3658,3662,3674,3678,3695,3683,3717,3721,3722,3726,3738,3742,3759,3747,3781,3785,3786,3790,3802,3806,3823,3811,3845,3849,3850,3854,3866,3870,3887,3875,3909,3913,3914,3918,3930,3934,3951,3939,3973,3977,3978,3982,3994,3998,4015,4003,4037,4041,4042,4046,4058,4062,4079,4067,4101,4105,4106,4110,4122,4126,4143,4131,4165,4169,4170,4174,4186,4190,4207,4195,4229,4233,4234,4238,4250,4254,4271,4259,4293,4297,4298,4302,4314,4318,4335,4323,4357,4361,4362,4366,4378,4382,4399,4387,4421,4425,4426,4430,4442,4446,4463,4451,4485,4489,4490,4494,4506,4510,4527,4515,4549,4553,4554,4558,4570,4574,4591,4579,4613,4617,4618,4622,4634,4638,4655,4643,4677,4681,4682,4686,4698,4702,4719,4707,4741,4745,4746,4750,4762,4766,4783,4771,4805,4809,4810,4814,4826,4830,4847,4835,4869,4873,4874,4878,4890,4894,4911,4899,4933,4937,4938,4942,4954,4958,4975,4963,4997,5001,5002,5006,5018,5022,5039,5027,5061,5065,5066,5070,5082,5086,5103,5091,5125,5129,5130,5134,5146,5150,5167,5155,5189,5193,5194,5198,5210,5214,5231,5219,5253,5257,5258,5262,5274,5278,5295,5283,5317,5321,5322,5326,5338,5342,5359,5347,5381,5385,5386,5390,5402,5406,5423,5411,5445,5449,5450,5454,5466,5470,5487,5475,5509,5513,5514,5518,5530,5534,5551,5539,5573,5577,5578,5582,5594,5598,5615,5603,5637,5641,5642,5646,5658,5662,5679,5667,5701,5705,5706,5710,5722,5726,5743,5731,5765,5769,5770,5774,5786,5790,5807,5795,5829,5833, +5834,5838,5850,5854,5871,5859,5893,5897,5898,5902,5914,5918,5935,5923,5957,5961,5962,5966,5978,5982,5999,5987,6021,6025,6026,6030,6042,6046,6063,6051,6085,6089,6090,6094,6106,6110,6127,6115,6149,6153,6154,6158,6170,6174,6191,6179,6213,6217,6218,6222,6234,6238,6255,6243,6277,6281,6282,6286,6298,6302,6319,6307,6341,6345,6346,6350,6362,6366,6383,6371,6405,6409,6410,6414,6426,6430,6447,6435,6469,6473,6474,6478,6490,6494,6511,6499,6533,6537,6538,6542,6554,6558,6575,6563,6597,6601,6602,6606,6618,6622,6639,6627,6661,6665,6666,6670,6682,6686,6703,6691,6725,6729,6730,6734,6746,6750,6767,6755,6789,6793,6794,6798,6810,6814,6831,6819,6853,6857,6858,6862,6874,6878,6895,6883,6917,6921,6922,6926,6938,6942,6959,6947,6981,6985,6986,6990,7002,7006,7023,7011,7045,7049,7050,7054,7066,7070,7087,7075,7109,7113,7114,7118,7130,7134,7151,7139,7173,7177,7178,7182,7194,7198,7215,7203,7237,7241,7242,7246,7258,7262,7279,7267,7301,7305,7306,7310,7322,7326,7343,7331,7365,7369,7370,7374,7386,7390,7407,7395,7429,7433,7434,7438,7450,7454,7471,7459,7493,7497,7498,7502,7514,7518,7535,7523,7557,7561,7562,7566,7578,7582,7599,7587,7621,7625,7626,7630,7642,7646,7663,7651,7685,7689,7690,7694,7706,7710,7727,7715,7749,7753,7754,7758,7770,7774,7791,7779,1,2,6,11,17,18,22,27,33,34,38,43,49,50,54,59,65,66,70,75,81,82,86,91,97,98,102,107,113,114,118,123,129,130,134,139,145,146,150,155,161,162,166,171,177,178,182,187,193,194,198,203,209,210,214,219,225,226,230,235,241,242,246,251,257,258,262,267,273,274,278,283,289,290,294,299,305,306,310,315,321,322,326,331,337,338,342,347,353,354,358,363,369,370,374,379,385,386,390,395,401,402,406,411,417,418,422,427,433,434,438,443,449,450,454,459,465,466,470,475,481,482,486,491,497,498,502,507,513,514,518,523,529,530,534,539,545,546,550,555,561,562,566,571,577,578,582,587,593,594,598,603,609,610,614,619,625,626,630,635,641,642,646,651,657,658,662,667,673,674,678,683,689,690,694,699,705,706,710,715,721,722,726,731,737,738,742,747,753,754,758,763,769,770,774,779,785,786,790,795,801,802,806,811,817,818,822,827,833,834,838,843, +849,850,854,859,865,866,870,875,881,882,886,891,897,898,902,907,913,914,918,923,929,930,934,939,945,946,950,955,961,962,966,971,977,978,982,987,993,994,998,1003,1009,1010,1014,1019,1025,1026,1030,1035,1041,1042,1046,1051,1057,1058,1062,1067,1073,1074,1078,1083,1089,1090,1094,1099,1105,1106,1110,1115,1121,1122,1126,1131,1137,1138,1142,1147,1153,1154,1158,1163,1169,1170,1174,1179,1185,1186,1190,1195,1201,1202,1206,1211,1217,1218,1222,1227,1233,1234,1238,1243,1249,1250,1254,1259,1265,1266,1270,1275,1281,1282,1286,1291,1297,1298,1302,1307,1313,1314,1318,1323,1329,1330,1334,1339,1345,1346,1350,1355,1361,1362,1366,1371,1377,1378,1382,1387,1393,1394,1398,1403,1409,1410,1414,1419,1425,1426,1430,1435,1441,1442,1446,1451,1457,1458,1462,1467,1473,1474,1478,1483,1489,1490,1494,1499,1505,1506,1510,1515,1521,1522,1526,1531,1537,1538,1542,1547,1553,1554,1558,1563,1569,1570,1574,1579,1585,1586,1590,1595,1601,1602,1606,1611,1617,1618,1622,1627,1633,1634,1638,1643,1649,1650,1654,1659,1665,1666,1670,1675,1681,1682,1686,1691,1697,1698,1702,1707,1713,1714,1718,1723,1729,1730,1734,1739,1745,1746,1750,1755,1761,1762,1766,1771,1777,1778,1782,1787,1793,1794,1798,1803,1809,1810,1814,1819,1825,1826,1830,1835,1841,1842,1846,1851,1857,1858,1862,1867,1873,1874,1878,1883,1889,1890,1894,1899,1905,1906,1910,1915,1921,1922,1926,1931,1937,1938,1942,1947,1953,1954,1958,1963,1969,1970,1974,1979,1985,1986,1990,1995,2001,2002,2006,2011,2017,2018,2022,2027,2033,2034,2038,2043,2049,2050,2054,2059,2065,2066,2070,2075,2081,2082,2086,2091,2097,2098,2102,2107,2113,2114,2118,2123,2129,2130,2134,2139,2145,2146,2150,2155,2161,2162,2166,2171,2177,2178,2182,2187,2193,2194,2198,2203,2209,2210,2214,2219,2225,2226,2230,2235,2241,2242,2246,2251,2257,2258,2262,2267,2273,2274,2278,2283,2289,2290,2294,2299,2305,2306,2310,2315,2321,2322,2326,2331,2337,2338,2342,2347,2353,2354,2358,2363,2369,2370,2374,2379,2385,2386,2390,2395,2401,2402,2406,2411,2417,2418,2422,2427,2433,2434,2438,2443,2449,2450,2454,2459,2465,2466,2470,2475,2481,2482,2486,2491,2497,2498,2502,2507,2513,2514, +2518,2523,2529,2530,2534,2539,2545,2546,2550,2555,2561,2562,2566,2571,2577,2578,2582,2587,2593,2594,2598,2603,2609,2610,2614,2619,2625,2626,2630,2635,2641,2642,2646,2651,2657,2658,2662,2667,2673,2674,2678,2683,2689,2690,2694,2699,2705,2706,2710,2715,2721,2722,2726,2731,2737,2738,2742,2747,2753,2754,2758,2763,2769,2770,2774,2779,2785,2786,2790,2795,2801,2802,2806,2811,2817,2818,2822,2827,2833,2834,2838,2843,2849,2850,2854,2859,2865,2866,2870,2875,2881,2882,2886,2891,2897,2898,2902,2907,2913,2914,2918,2923,2929,2930,2934,2939,2945,2946,2950,2955,2961,2962,2966,2971,2977,2978,2982,2987,2993,2994,2998,3003,3009,3010,3014,3019,3025,3026,3030,3035,3041,3042,3046,3051,3057,3058,3062,3067,3073,3074,3078,3083,3089,3090,3094,3099,3105,3106,3110,3115,3121,3122,3126,3131,3137,3138,3142,3147,3153,3154,3158,3163,3169,3170,3174,3179,3185,3186,3190,3195,3201,3202,3206,3211,3217,3218,3222,3227,3233,3234,3238,3243,3249,3250,3254,3259,3265,3266,3270,3275,3281,3282,3286,3291,3297,3298,3302,3307,3313,3314,3318,3323,3329,3330,3334,3339,3345,3346,3350,3355,3361,3362,3366,3371,3377,3378,3382,3387,3393,3394,3398,3403,3409,3410,3414,3419,3425,3426,3430,3435,3441,3442,3446,3451,3457,3458,3462,3467,3473,3474,3478,3483,3489,3490,3494,3499,3505,3506,3510,3515,3521,3522,3526,3531,3537,3538,3542,3547,3553,3554,3558,3563,3569,3570,3574,3579,3585,3586,3590,3595,3601,3602,3606,3611,3617,3618,3622,3627,3633,3634,3638,3643,3649,3650,3654,3659,3665,3666,3670,3675,3681,3682,3686,3691,3697,3698,3702,3707,3713,3714,3718,3723,3729,3730,3734,3739,3745,3746,3750,3755,3761,3762,3766,3771,3777,3778,3782,3787,3793,3794,3798,3803,3809,3810,3814,3819,3825,3826,3830,3835,3841,3842,3846,3851,3857,3858,3862,3867,3873,3874,3878,3883,3889,3890,3894,3899,3905,3906,3910,3915,3921,3922,3926,3931,3937,3938,3942,3947,3953,3954,3958,3963,3969,3970,3974,3979,3985,3986,3990,3995,4001,4002,4006,4011,4017,4018,4022,4027,4033,4034,4038,4043,4049,4050,4054,4059,4065,4066,4070,4075,4081,4082,4086,4091,4097,4098,4102,4107,4113,4114,4118,4123,4129,4130,4134,4139,4145,4146,4150,4155, +4161,4162,4166,4171,4177,4178,4182,4187,4193,4194,4198,4203,4209,4210,4214,4219,4225,4226,4230,4235,4241,4242,4246,4251,4257,4258,4262,4267,4273,4274,4278,4283,4289,4290,4294,4299,4305,4306,4310,4315,4321,4322,4326,4331,4337,4338,4342,4347,4353,4354,4358,4363,4369,4370,4374,4379,4385,4386,4390,4395,4401,4402,4406,4411,4417,4418,4422,4427,4433,4434,4438,4443,4449,4450,4454,4459,4465,4466,4470,4475,4481,4482,4486,4491,4497,4498,4502,4507,4513,4514,4518,4523,4529,4530,4534,4539,4545,4546,4550,4555,4561,4562,4566,4571,4577,4578,4582,4587,4593,4594,4598,4603,4609,4610,4614,4619,4625,4626,4630,4635,4641,4642,4646,4651,4657,4658,4662,4667,4673,4674,4678,4683,4689,4690,4694,4699,4705,4706,4710,4715,4721,4722,4726,4731,4737,4738,4742,4747,4753,4754,4758,4763,4769,4770,4774,4779,4785,4786,4790,4795,4801,4802,4806,4811,4817,4818,4822,4827,4833,4834,4838,4843,4849,4850,4854,4859,4865,4866,4870,4875,4881,4882,4886,4891,4897,4898,4902,4907,4913,4914,4918,4923,4929,4930,4934,4939,4945,4946,4950,4955,4961,4962,4966,4971,4977,4978,4982,4987,4993,4994,4998,5003,5009,5010,5014,5019,5025,5026,5030,5035,5041,5042,5046,5051,5057,5058,5062,5067,5073,5074,5078,5083,5089,5090,5094,5099,5105,5106,5110,5115,5121,5122,5126,5131,5137,5138,5142,5147,5153,5154,5158,5163,5169,5170,5174,5179,5185,5186,5190,5195,5201,5202,5206,5211,5217,5218,5222,5227,5233,5234,5238,5243,5249,5250,5254,5259,5265,5266,5270,5275,5281,5282,5286,5291,5297,5298,5302,5307,5313,5314,5318,5323,5329,5330,5334,5339,5345,5346,5350,5355,5361,5362,5366,5371,5377,5378,5382,5387,5393,5394,5398,5403,5409,5410,5414,5419,5425,5426,5430,5435,5441,5442,5446,5451,5457,5458,5462,5467,5473,5474,5478,5483,5489,5490,5494,5499,5505,5506,5510,5515,5521,5522,5526,5531,5537,5538,5542,5547,5553,5554,5558,5563,5569,5570,5574,5579,5585,5586,5590,5595,5601,5602,5606,5611,5617,5618,5622,5627,5633,5634,5638,5643,5649,5650,5654,5659,5665,5666,5670,5675,5681,5682,5686,5691,5697,5698,5702,5707,5713,5714,5718,5723,5729,5730,5734,5739,5745,5746,5750,5755,5761,5762,5766,5771,5777,5778,5782,5787,5793,5794, +5798,5803,5809,5810,5814,5819,5825,5826,5830,5835,5841,5842,5846,5851,5857,5858,5862,5867,5873,5874,5878,5883,5889,5890,5894,5899,5905,5906,5910,5915,5921,5922,5926,5931,5937,5938,5942,5947,5953,5954,5958,5963,5969,5970,5974,5979,5985,5986,5990,5995,6001,6002,6006,6011,6017,6018,6022,6027,6033,6034,6038,6043,6049,6050,6054,6059,6065,6066,6070,6075,6081,6082,6086,6091,6097,6098,6102,6107,6113,6114,6118,6123,6129,6130,6134,6139,6145,6146,6150,6155,6161,6162,6166,6171,6177,6178,6182,6187,6193,6194,6198,6203,6209,6210,6214,6219,6225,6226,6230,6235,6241,6242,6246,6251,6257,6258,6262,6267,6273,6274,6278,6283,6289,6290,6294,6299,6305,6306,6310,6315,6321,6322,6326,6331,6337,6338,6342,6347,6353,6354,6358,6363,6369,6370,6374,6379,6385,6386,6390,6395,6401,6402,6406,6411,6417,6418,6422,6427,6433,6434,6438,6443,6449,6450,6454,6459,6465,6466,6470,6475,6481,6482,6486,6491,6497,6498,6502,6507,6513,6514,6518,6523,6529,6530,6534,6539,6545,6546,6550,6555,6561,6562,6566,6571,6577,6578,6582,6587,6593,6594,6598,6603,6609,6610,6614,6619,6625,6626,6630,6635,6641,6642,6646,6651,6657,6658,6662,6667,6673,6674,6678,6683,6689,6690,6694,6699,6705,6706,6710,6715,6721,6722,6726,6731,6737,6738,6742,6747,6753,6754,6758,6763,6769,6770,6774,6779,6785,6786,6790,6795,6801,6802,6806,6811,6817,6818,6822,6827,6833,6834,6838,6843,6849,6850,6854,6859,6865,6866,6870,6875,6881,6882,6886,6891,6897,6898,6902,6907,6913,6914,6918,6923,6929,6930,6934,6939,6945,6946,6950,6955,6961,6962,6966,6971,6977,6978,6982,6987,6993,6994,6998,7003,7009,7010,7014,7019,7025,7026,7030,7035,7041,7042,7046,7051,7057,7058,7062,7067,7073,7074,7078,7083,7089,7090,7094,7099,7105,7106,7110,7115,7121,7122,7126,7131,7137,7138,7142,7147,7153,7154,7158,7163,7169,7170,7174,7179,7185,7186,7190,7195,7201,7202,7206,7211,7217,7218,7222,7227,7233,7234,7238,7243,7249,7250,7254,7259,7265,7266,7270,7275,7281,7282,7286,7291,7297,7298,7302,7307,7313,7314,7318,7323,7329,7330,7334,7339,7345,7346,7350,7355,7361,7362,7366,7371,7377,7378,7382,7387,7393,7394,7398,7403,7409,7410,7414,7419,7425,7426,7430,7435, +7441,7442,7446,7451,7457,7458,7462,7467,7473,7474,7478,7483,7489,7490,7494,7499,7505,7506,7510,7515,7521,7522,7526,7531,7537,7538,7542,7547,7553,7554,7558,7563,7569,7570,7574,7579,7585,7586,7590,7595,7601,7602,7606,7611,7617,7618,7622,7627,7633,7634,7638,7643,7649,7650,7654,7659,7665,7666,7670,7675,7681,7682,7686,7691,7697,7698,7702,7707,7713,7714,7718,7723,7729,7730,7734,7739,7745,7746,7750,7755,7761,7762,7766,7771,7777,7778,7782,7787,7793,7794,7798,7803 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *5862 { + a: 0.530131578445435,0.827385187149048,-0.185457095503807,0.356267035007477,0.929931282997131,-0.0911129713058472,0.375782608985901,0.922017455101013,0.0931188985705376,0.540598154067993,0.818321764469147,0.195200338959694,-0.54059773683548,0.818322062492371,0.195199951529503,-0.375782877206802,0.922017514705658,0.0931185781955719,-0.356266885995865,0.929931223392487,-0.0911138504743576,-0.5301313996315,0.827385365962982,-0.185456559062004,0.287106037139893,0.865362107753754,0.410753697156906,0.330375999212265,0.790668725967407,0.515455722808838,-0.330375492572784,0.790668129920959,0.515456974506378,-0.287105917930603,0.86536306142807,0.410751909017563,-3.94015870597286e-07,0.838609099388123,0.544733762741089,-2.59369636879114e-09,0.785270094871521,0.619153380393982,-0.226000145077705,0.896263837814331,-0.381621450185776,-0.311542332172394,0.801741242408752,-0.510051369667053,0.311542570590973,0.801741242408752,-0.510051071643829,0.22599957883358,0.896263301372528,-0.381623387336731,1.70293475321159e-07,0.801352262496948,-0.598192691802979,-5.78993031297159e-09,0.881413817405701,-0.472344845533371,0.448430746793747,0.60299551486969,0.659777343273163,-4.43269783545475e-07,0.563669800758362,0.826000213623047,-0.448431134223938,0.602995812892914,0.659776926040649,0.568364441394806,0.193678125739098,0.799656629562378,-6.85245016285307e-09,0.23245532810688,0.972607016563416,-0.568364381790161,0.193678349256516,0.799656510353088,0.746793925762177,0.61756819486618,0.246796458959579,-0.746793925762177,0.617568075656891,0.246796235442162,0.763466358184814,0.593547761440277,-0.25459823012352,-0.763465881347656,0.593548059463501,-0.254598498344421,0.463901042938232,0.575986862182617,-0.673078596591949,-0.463900685310364,0.575987040996552,-0.673078835010529,8.08174505095849e-09,0.57838374376297,-0.815764725208282,0.944888055324554,0.15097850561142,0.290503233671188,-0.944887936115265,0.150979042053223,0.290503144264221,0.939757347106934,0.144864961504936,-0.30962935090065,-0.939757287502289,0.144864961504936,-0.30962935090065, +0.583945870399475,0.16785192489624,-0.794249892234802,-0.583945572376251,0.16785192489624,-0.794250071048737,-2.02200460819313e-08,0.146598353981972,-0.989196121692657,0.182139933109283,-0.909734606742859,0.373105973005295,2.70510669420077e-10,-0.905066668987274,0.425269722938538,-0.182139992713928,-0.909734606742859,0.373106002807617,0.316582500934601,-0.940715074539185,0.12178111821413,-0.316582411527634,-0.940715074539185,0.121781170368195,0.32660910487175,-0.940474331378937,-0.0939913615584373,-0.326609075069427,-0.940474390983582,-0.0939914211630821,0.226513579487801,-0.907971441745758,-0.352533012628555,-0.226513579487801,-0.907971382141113,-0.352532863616943,4.70181116263291e-10,-0.895696043968201,-0.444666862487793,0.476374059915543,-0.455699026584625,0.751935005187988,-1.82277716476165e-07,-0.508817613124847,0.86087429523468,-0.476374059915543,-0.45569908618927,0.751934945583344,-0.877960979938507,-0.354610532522202,0.321614563465118,-0.899062395095825,-0.332166999578476,-0.285222291946411,-0.502524375915527,-0.454565793275833,-0.735417783260345,8.40919724964806e-08,-0.508762776851654,-0.860906839370728,0.502524197101593,-0.454565942287445,-0.735417723655701,0.899062633514404,-0.332166373729706,-0.285222500562668,0.877960920333862,-0.354610323905945,0.321614682674408,0.51472932100296,0.353008717298508,0.781305730342865,0.891087532043457,0.347105503082275,0.292370915412903,0.892851948738098,0.327622473239899,-0.308996737003326,0.549778759479523,0.321640819311142,-0.770902454853058,1.45826675179705e-07,0.308943092823029,-0.951080501079559,-0.549778699874878,0.321641206741333,-0.770902395248413,-0.892852067947388,0.327622383832932,-0.308996438980103,-0.891087353229523,0.347105771303177,0.29237100481987,-0.514729619026184,0.353009104728699,0.781305253505707,1.33593360374107e-07,0.359358012676239,0.933199763298035,-1.12985860667436e-08,0.970664978027344,-0.240436166524887,0.116754949092865,0.975904285907745,-0.184333994984627,-0.11675289273262,0.975903987884521,-0.184337019920349,0.146822512149811,0.989051222801208,-0.0148547133430839, +-0.146822512149811,0.989051282405853,-0.0148547878488898,-4.83476485842876e-13,1,1.01118168061021e-07,-0.154860228300095,0.987847924232483,0.0132200419902802,0.154861122369766,0.987847864627838,0.013220177963376,4.60696952586659e-07,0.980569422245026,0.196172758936882,-0.131253823637962,0.979679763317108,0.151657462120056,0.131254985928535,0.979678630828857,0.15166363120079,-8.08547076785564e-20,1,-2.78947453580258e-07,-5.7149517757038e-11,-0.959185421466827,0.282777786254883,-0.0909443944692612,-0.970586359500885,0.222915530204773,0.0909444317221642,-0.970586359500885,0.222915530204773,-0.16294763982296,-0.984974980354309,0.0572051480412483,0.162947595119476,-0.984974920749664,0.0572051517665386,-0.170306727290154,-0.98468679189682,-0.0372490249574184,0.170306712388992,-0.98468679189682,-0.0372489914298058,-0.107404962182045,-0.974253177642822,-0.19822946190834,0.107404999434948,-0.974253177642822,-0.198229491710663,2.21625011675997e-08,-0.963393032550812,-0.268092930316925,-2.05203889436234e-08,-0.997804462909698,-0.0662280917167664,-0.00720738247036934,-0.999381184577942,-0.0344273708760738,0.00720736989751458,-0.999381244182587,-0.0344273634254932,0.00156738189980388,-0.99999874830246,-2.21297477764892e-06,-0.00156738224904984,-0.99999874830246,-2.21269624489651e-06,0.00397327868267894,-0.9999840259552,0.00403334759175777,-0.00397327728569508,-0.9999840259552,0.00403334712609649,0.00514068640768528,-0.998574793338776,0.0531232394278049,-0.00514069152995944,-0.998574733734131,0.0531232394278049,-1.88016047175665e-10,-0.99693375825882,0.0782499834895134,-1.86269858044874e-12,-1,6.74774928484112e-05,-1.17522883785748e-11,-1,6.74814582453109e-05,0.321352481842041,-0.74256432056427,0.587648510932922,0.600108563899994,-0.761393010616302,0.245255634188652,0.594047904014587,-0.779786884784698,-0.197583988308907,0.348017126321793,-0.76456755399704,-0.542513191699982,-2.76781864094744e-09,-0.781431257724762,-0.623991429805756,-0.348017126321793,-0.764567673206329,-0.542513072490692,-0.594047784805298,-0.779787003993988,-0.197583913803101, +-0.600108802318573,-0.761392951011658,0.245255514979362,-0.321352422237396,-0.742564380168915,0.587648451328278,6.67310260382692e-08,-0.764092266559601,0.645106971263885,-3.2913976610871e-07,-0.15282616019249,0.988253116607666,-0.567250669002533,-0.126004442572594,0.813848614692688,-0.94779509305954,-0.0776183903217316,0.309289455413818,-0.954537510871887,-0.0522136129438877,-0.293482273817062,-0.588835895061493,-0.123714029788971,-0.798728406429291,0,-0.180339932441711,-0.983604371547699,0.588836312294006,-0.123714037239552,-0.798728168010712,0.954537570476532,-0.0522133521735668,-0.293482333421707,0.947795152664185,-0.0776182189583778,0.309289067983627,0.567250430583954,-0.126004457473755,0.813848793506622,0.544248700141907,0.267148405313492,0.795251548290253,0.989745020866394,0.141011729836464,-0.0228112600743771,0.927730917930603,0.198027595877647,-0.316386282444,0.806297123432159,0.160183414816856,-0.569408774375916,0.57114976644516,0.229519322514534,-0.78810453414917,0.303064733743668,0.156019479036331,-0.940111577510834,-1.50358332007272e-07,0.215360581874847,-0.9765345454216,-0.30306476354599,0.156019672751427,-0.940111458301544,-0.571149706840515,0.22951927781105,-0.788104593753815,-0.806297242641449,0.160183921456337,-0.569408357143402,-0.927730798721313,0.198027715086937,-0.316386550664902,-0.989745020866394,0.141012221574783,-0.0228113438934088,-0.9321608543396,0.210984900593758,0.294213443994522,-0.797293066978455,0.170188844203949,0.579102218151093,-0.544248580932617,0.267148524522781,0.795251607894897,-0.291562348604202,0.219033002853394,0.931136906147003,-8.75021388679897e-09,0.31205826997757,0.950063049793243,0.291562438011169,0.219033122062683,0.931136906147003,-1.60920421876654e-07,0.909911572933197,-0.414802193641663,0.0267235841602087,0.97435450553894,-0.223426222801208,0.187656864523888,0.934804677963257,-0.301537722349167,-0.18765826523304,0.934805154800415,-0.301535665988922,-0.02672453597188,0.974354088306427,-0.223427772521973,0.275893598794937,0.959983229637146,-0.0481138229370117,0.145845115184784,0.986893117427826,-0.0690741613507271, +-0.27589350938797,0.959983289241791,-0.0481148101389408,-0.145845100283623,0.986893057823181,-0.0690752118825912,0.0387491621077061,0.999247252941132,-0.00181985809467733,-1.99657256416685e-06,0.998279929161072,-0.0586282834410667,-0.0387491658329964,0.999247252941132,-0.00181898742448539,-0.147758677601814,0.989022433757782,0.00137125584296882,-0.289132714271545,0.956229627132416,0.0450251288712025,0.147757768630981,0.989022552967072,0.00137134687975049,0.28913289308548,0.956229567527771,0.0450246632099152,-4.85019313600787e-07,0.908533573150635,0.417812079191208,-0.0388457328081131,0.982100486755371,0.184308990836143,-0.225339755415916,0.931422650814056,0.28578644990921,0.22533743083477,0.931423127651215,0.285786807537079,0.0388452671468258,0.982100069522858,0.184310525655746,-0.155918449163437,0.986289143562317,0.054066501557827,0.155919253826141,0.986289083957672,0.0540656708180904,1.95394763737033e-12,0.999028146266937,0.0440763309597969,-0.0408879779279232,0.999162495136261,0.00155382184311748,0.0408879891037941,0.999162614345551,0.00155404827091843,-8.83216094119295e-14,1,-1.00585118900653e-07,-0.0225801598280668,-0.961081087589264,0.275342106819153,-6.48030322736304e-08,-0.932043492794037,0.362346470355988,-0.0698878020048141,-0.903377175331116,0.423113793134689,-0.140649035573006,-0.941595673561096,0.305966377258301,0.0225801356136799,-0.961081087589264,0.275342166423798,0.140648916363716,-0.941595673561096,0.305966377258301,0.069887712597847,-0.90337723493576,0.42311355471611,-0.146376758813858,-0.980377793312073,0.132034957408905,-0.27509668469429,-0.926758408546448,0.255813449621201,-0.260043382644653,-0.960961520671844,0.0945010483264923,0.146376758813858,-0.980377793312073,0.132034957408905,0.260043412446976,-0.9609614610672,0.0945010706782341,0.275096625089645,-0.926758527755737,0.255813270807266,-0.166952654719353,-0.985956370830536,0.00411985861137509,-0.327657341957092,-0.944784224033356,0.00482662161812186,-0.275115221738815,-0.958906412124634,-0.0693545788526535,0.166952654719353,-0.985956370830536,0.00411986047402024, +0.275115102529526,-0.958906471729279,-0.0693545266985893,0.327657341957092,-0.944784283638,0.0048266313970089,-0.164414286613464,-0.981420814990997,-0.0988994687795639,-0.310238480567932,-0.927170276641846,-0.210017636418343,-0.17808686196804,-0.941746532917023,-0.285304456949234,0.164414301514626,-0.981420814990997,-0.0988995283842087,0.178086832165718,-0.941746473312378,-0.285304516553879,0.310238540172577,-0.927170276641846,-0.210017636418343,-0.0291267205029726,-0.96533739566803,-0.259374737739563,-0.0960463583469391,-0.896155834197998,-0.433220386505127,2.71385189876128e-08,-0.929214119911194,-0.369541823863983,0.029126800596714,-0.965337336063385,-0.25937494635582,0.0960463508963585,-0.896155774593353,-0.433220446109772,-0.0105216447263956,-0.998435735702515,-0.0549124665558338,4.18750651931532e-08,-0.988137602806091,-0.153570920228958,0.0308488253504038,-0.994764089584351,-0.0974299609661102,0.0105216735973954,-0.998435735702515,-0.0549124740064144,-0.0308488197624683,-0.994764089584351,-0.0974299982190132,-1.72702293639304e-05,-0.999971747398376,-0.00751050235703588,0.0502263978123665,-0.998702704906464,-0.00838004890829325,1.7268068404519e-05,-0.999971747398376,-0.00751050794497132,-0.0502263940870762,-0.998702645301819,-0.00838006660342216,0.00174731842707843,-0.999998271465302,0.000633085612207651,0.051245205104351,-0.998487830162048,0.0198965687304735,-0.00174731598235667,-0.999998331069946,0.000633084564469755,-0.0512452162802219,-0.998487830162048,0.0198965836316347,0.00781348068267107,-0.999791741371155,0.0188545733690262,0.0366846323013306,-0.991728544235229,0.122998654842377,-0.00781348347663879,-0.999791741371155,0.0188545770943165,-0.0366845950484276,-0.991728544235229,0.122998662292957,2.39384956302047e-10,-0.984041094779968,0.17794181406498,-0.00354878604412079,-0.997584521770477,0.0693725124001503,0.00354877766221762,-0.997584521770477,0.0693725049495697,0.000401616038288921,-0.99999988079071,6.18393169133924e-05,3.04383318550094e-09,-0.999873757362366,-0.0158896781504154,-0.00040161598008126,-0.999999940395355,6.18370322627015e-05, +0.00114637019578367,-0.999999105930328,0.000628625275567174,-2.8586810696396e-09,-0.999839425086975,0.0179176367819309,-0.00114637019578367,-0.999999165534973,0.000628626672551036,-3.43460069412993e-13,-0.999999940395355,6.74577022437006e-05,0.409732341766357,-0.89700835943222,0.165817379951477,0.241970747709274,-0.849172055721283,0.469421893358231,0.406632155179977,-0.904096245765686,-0.131378769874573,0.279326885938644,-0.854747712612152,-0.437473267316818,-8.11962552749179e-10,-0.850213706493378,-0.526437640190125,-0.279326915740967,-0.854747593402863,-0.43747341632843,-0.406631976366043,-0.904096305370331,-0.131378829479218,-0.409732341766357,-0.89700835943222,0.165817469358444,-0.241970881819725,-0.849172055721283,0.469421893358231,2.24364837819735e-09,-0.85382080078125,0.520567059516907,-1.76390511086311e-08,0.0725015550851822,0.997368335723877,-0.579297065734863,0.0700130015611649,0.812104165554047,-0.951366722583771,0.0789044126868248,0.297784477472305,-0.950054168701172,0.0852380022406578,-0.300219058990479,-0.594685912132263,0.0657321959733963,-0.801266491413116,-1.44977335025942e-07,0.0281555764377117,-0.999603569507599,0.594686090946198,0.0657324194908142,-0.801266312599182,0.950054228305817,0.08523790538311,-0.300218880176544,0.95136684179306,0.0789037868380547,0.297784149646759,0.579297006130219,0.0700131952762604,0.812104165554047,0.420068264007568,0.897214233875275,-0.13619564473629,0.363278985023499,0.931660413742065,0.00611066725105047,0.441944092512131,0.88494998216629,0.146795079112053,0.561370670795441,0.82750415802002,0.00999471172690392,-0.363278567790985,0.93166047334671,0.0061107543297112,-0.42006841301918,0.89721417427063,-0.136195555329323,-0.561370611190796,0.82750415802002,0.00999589450657368,-0.44194507598877,0.884949445724487,0.146795317530632,0.379960566759109,0.898576200008392,0.219524174928665,0.3120276927948,0.818576991558075,0.482255518436432,0.466319918632507,0.803790211677551,0.369414418935776,-0.379959911108017,0.898576676845551,0.219523325562477,-0.466319799423218,0.803790628910065,0.369413644075394, +-0.312027812004089,0.818577527999878,0.482254534959793,0.106605537235737,0.841739356517792,0.529254257678986,-1.13637170784386e-07,0.806031703948975,0.59187239408493,0.156577378511429,0.785072445869446,0.599286794662476,-0.106604903936386,0.841739296913147,0.529254615306854,-0.156577751040459,0.785073339939117,0.599285662174225,-0.332075357437134,0.916550934314728,-0.222845882177353,-0.259754776954651,0.860143482685089,-0.438953995704651,-0.444904834032059,0.815461039543152,-0.370247215032578,0.332075417041779,0.916550874710083,-0.222846060991287,0.444904774427414,0.815460979938507,-0.370247423648834,0.259754985570908,0.860143423080444,-0.438954025506973,-0.0699751824140549,0.881814897060394,-0.466375261545181,7.25591453587526e-09,0.856462240219116,-0.516209781169891,-0.148329585790634,0.79856276512146,-0.58334892988205,0.0699753984808922,0.881815135478973,-0.466374933719635,0.148329466581345,0.798563301563263,-0.583348095417023,0.221019759774208,0.577576041221619,0.78584748506546,0.379751265048981,0.730754792690277,0.567262232303619,-2.96764227414315e-07,0.717984676361084,0.696058869361877,-0.221019223332405,0.577576100826263,0.785847544670105,-0.379751056432724,0.730755209922791,0.567261815071106,0.249474391341209,0.355879932641983,0.90061753988266,0.488621085882187,0.465642392635345,0.737852692604065,1.26161916469414e-08,0.426152110099792,0.904651463031769,-0.249474540352821,0.355880081653595,0.90061742067337,-0.488621205091476,0.465641736984253,0.737853050231934,0.631536662578583,0.616606533527374,0.470061480998993,0.66154670715332,0.714349865913391,0.228167206048965,-0.631536841392517,0.616606473922729,0.470061242580414,-0.661546349525452,0.714349865913391,0.228168025612831,0.794300496578217,0.607524931430817,-0.000485794473206624,0.672179460525513,0.704137325286865,-0.22883477807045,-0.672179520130157,0.704137325286865,-0.228834271430969,-0.794300317764282,0.607525110244751,-0.000486236269352958,0.648038983345032,0.58239471912384,-0.490776717662811,0.386661738157272,0.704745531082153,-0.594833135604858,-0.6480393409729,0.582394301891327,-0.490776896476746, +-0.386662065982819,0.704744875431061,-0.594833552837372,0.24223518371582,0.575936853885651,-0.780780911445618,1.30118934293932e-07,0.711638987064362,-0.702545404434204,-0.242235392332077,0.575937688350677,-0.780780136585236,0.741089105606079,0.351924479007721,0.571783244609833,0.816966593265533,0.509389996528625,0.270346939563751,-0.741088926792145,0.351924687623978,0.571783363819122,-0.816966593265533,0.509390115737915,0.270347028970718,0.941268444061279,0.337192833423615,-0.0177398677915335,0.827955424785614,0.484657734632492,-0.282128900289536,-0.941268503665924,0.337192445993423,-0.0177402254194021,-0.827955424785614,0.484657496213913,-0.282129049301147,0.757216811180115,0.323034346103668,-0.567689657211304,0.516550481319427,0.443268060684204,-0.732590615749359,-0.757216989994049,0.323034077882767,-0.567689716815948,-0.516550362110138,0.443267703056335,-0.732590973377228,0.294735878705978,0.31454211473465,-0.902326881885529,-1.00402218095041e-07,0.432316541671753,-0.901721894741058,-0.294735908508301,0.314542353153229,-0.902326881885529,0.14599546790123,-0.755417227745056,0.638772308826447,0.402195811271667,-0.608226358890533,0.684323906898499,0.232770726084709,-0.49344003200531,0.838054180145264,-5.37355271390538e-09,-0.652575850486755,0.75772351026535,-0.145995706319809,-0.755417048931122,0.638772368431091,-0.232770726084709,-0.493440002202988,0.838054180145264,-0.402195930480957,-0.608226239681244,0.684324085712433,0.486971586942673,-0.744888305664063,0.456070214509964,0.787455976009369,-0.533437073230743,0.308800786733627,0.704943358898163,-0.404666244983673,0.582494735717773,-0.486971467733383,-0.744888365268707,0.456070333719254,-0.704943060874939,-0.404666423797607,0.582494914531708,-0.787456035614014,-0.533437073230743,0.308800607919693,0.631050229072571,-0.775619804859161,0.0137697737663984,0.800792813301086,-0.539087772369385,-0.260988742113113,0.946020066738129,-0.323731273412704,0.0156194837763906,-0.631050229072571,-0.775619745254517,0.0137697821483016,-0.94601982831955,-0.323732107877731,0.0156195377930999, +-0.800792813301086,-0.53908783197403,-0.260988771915436,0.502602100372314,-0.771140158176422,-0.390812039375305,0.429711222648621,-0.624675571918488,-0.652018904685974,0.741411328315735,-0.388141274452209,-0.547408103942871,-0.50260204076767,-0.771140217781067,-0.390812009572983,-0.74141126871109,-0.388141185045242,-0.547408223152161,-0.429711252450943,-0.624675452709198,-0.652018904685974,0.163144379854202,-0.773569941520691,-0.612350881099701,-1.65984516797835e-07,-0.667142748832703,-0.744929909706116,0.241296425461769,-0.495394080877304,-0.834482312202454,-0.163144335150719,-0.77357006072998,-0.612350523471832,-0.241296529769897,-0.495393872261047,-0.834482371807098,0.531005799770355,-0.302701681852341,0.791457235813141,0.294590443372726,-0.144435524940491,0.944645345211029,1.73361513589043e-07,-0.345305889844894,0.938490211963654,-0.294590324163437,-0.144435465335846,0.944645345211029,-0.53100597858429,-0.302701622247696,0.791457116603851,-0.795118451118469,-0.101630784571171,0.597877740859985,-0.920833885669708,-0.228134050965309,0.316259115934372,-0.998317122459412,-0.0578507669270039,-0.00402090651914477,-0.937208652496338,-0.194173783063889,-0.289717882871628,-0.822705745697021,-0.0779029875993729,-0.563104331493378,-0.553871273994446,-0.300747811794281,-0.776387453079224,-0.296285569667816,-0.163815841078758,-0.940945863723755,-5.69100899738828e-09,-0.359712302684784,-0.933063209056854,0.296285450458527,-0.163816452026367,-0.9409459233284,0.553871095180511,-0.300747454166412,-0.776387631893158,0.822705626487732,-0.0779023692011833,-0.563104450702667,0.937208592891693,-0.194174319505692,-0.289717763662338,0.998317122459412,-0.0578500851988792,-0.00402052886784077,0.920833826065063,-0.228134363889694,0.31625908613205,0.795118570327759,-0.101631067693233,0.597877442836761,0.79729288816452,0.170189291238785,0.579102516174316,0.932160794734955,0.210984885692596,0.294213503599167,0.438693970441818,0.898593902587891,0.0087583540007472,-0.438693821430206,0.898593902587891,0.00875805225223303,0.419018656015396,0.854311645030975,0.307530671358109, +-0.419019311666489,0.854311347007751,0.307530462741852,0.135830938816071,0.804416477680206,0.578328609466553,-0.135831475257874,0.804416120052338,0.578329086303711,-0.371514350175858,0.880551397800446,-0.294289231300354,0.371514320373535,0.880551278591156,-0.294289946556091,-0.106352366507053,0.853381991386414,-0.510321855545044,0.106352142989635,0.853381276130676,-0.510322988033295,0.184676319360733,0.723864853382111,0.664766430854797,-0.184675931930542,0.723864495754242,0.664766788482666,0.23831844329834,0.437578409910202,0.867023348808289,-0.238318428397179,0.437578052282333,0.867023587226868,0.548225879669189,0.724582016468048,0.417647212743759,-0.548225939273834,0.724582135677338,0.417646914720535,0.706815242767334,0.707365572452545,0.00679254531860352,-0.706815242767334,0.707365691661835,0.00679282704368234,0.555651068687439,0.704397141933441,-0.441674798727036,-0.555650770664215,0.704397201538086,-0.441675096750259,0.193908974528313,0.707741737365723,-0.679338574409485,-0.19390906393528,0.707741796970367,-0.67933851480484,0.690843999385834,0.494225800037384,0.527707576751709,-0.690843820571899,0.494226038455963,0.527707755565643,0.863982558250427,0.50344043970108,-0.00904805585741997,-0.863982677459717,0.503440082073212,-0.00904823280870914,0.708878040313721,0.461083501577377,-0.533754527568817,-0.7088782787323,0.461083650588989,-0.533753991127014,0.276689231395721,0.434594690799713,-0.857070982456207,-0.276689231395721,0.434594362974167,-0.857071042060852,0.188758760690689,-0.639824211597443,0.744979918003082,-0.188758745789528,-0.639824330806732,0.744979798793793,0.616365313529968,-0.567548513412476,0.545877754688263,-0.616365134716034,-0.56754857301712,0.545877933502197,0.852833330631256,-0.521802246570587,0.0199434608221054,-0.852833330631256,-0.521802306175232,0.0199436191469431,0.646816492080688,-0.579311192035675,-0.496011018753052,-0.646816492080688,-0.579311192035675,-0.496011197566986,0.202986523509026,-0.656160652637482,-0.726807832717896,-0.202986270189285,-0.656160593032837,-0.726807951927185,0.269400358200073,-0.332062065601349,0.903968095779419, +-0.269400358200073,-0.332062095403671,0.903968036174774,-0.759427666664124,-0.265793323516846,0.593821227550507,-0.980327367782593,-0.19727885723114,0.00627135997638106,-0.79374897480011,-0.238774329423904,-0.559418678283691,-0.27164089679718,-0.343733489513397,-0.898920774459839,0.271641194820404,-0.343733340501785,-0.898920714855194,0.793749213218689,-0.238774001598358,-0.559418559074402,0.980327427387238,-0.197278395295143,0.00627142516896129,0.7594273686409,-0.265793591737747,0.593821346759796,0.777991652488708,0.236789509654045,0.58194488286972,0.980117201805115,0.197012916207314,-0.0235831122845411,0.788802027702332,0.214628830552101,-0.575956225395203,0.30168691277504,0.223660573363304,-0.926801562309265,-0.30168679356575,0.223660051822662,-0.92680162191391,-0.788802146911621,0.214628651738167,-0.575956225395203,-0.980117201805115,0.197012796998024,-0.0235831867903471,-0.777991652488708,0.236789584159851,0.58194488286972,-0.26999506354332,0.296770513057709,0.915985822677612,0.269995123147964,0.296770483255386,0.915985763072968,0.044457022100687,0.915514469146729,-0.399820804595947,-0.044456485658884,0.915514528751373,-0.399821013212204,0.271722227334976,0.951851427555084,-0.141935914754868,-0.271722733974457,0.95185124874115,-0.1419368237257,0.0349603146314621,0.99791294336319,-0.0542918629944324,-0.0349582061171532,0.997913062572479,-0.0542910732328892,-0.276973992586136,0.96087121963501,0.00346697983331978,0.276973903179169,0.960871279239655,0.00346699426881969,-0.0701650902628899,0.91401082277298,0.399576157331467,0.070165753364563,0.91401082277298,0.399576127529144,-0.29822638630867,0.946676909923553,0.121917508542538,0.298227041959763,0.946676552295685,0.121918871998787,-0.0389592237770557,0.998365759849548,0.0418073013424873,0.0389574281871319,0.998365938663483,0.0418079309165478,-0.0392553806304932,0.999229192733765,0.000206365977646783,0.0392554253339767,0.999229192733765,0.000205750402528793,-0.0464128963649273,-0.932720601558685,0.357600778341293,0.0464129149913788,-0.932720422744751,0.357600927352905, +-0.222901910543442,-0.953839778900146,0.20125687122345,0.222901910543442,-0.953839778900146,0.201256841421127,-0.272903978824615,-0.962027907371521,0.00506829516962171,0.272903889417648,-0.962027907371521,0.00506829237565398,-0.25871941447258,-0.952316462993622,-0.161733821034431,0.258719384670258,-0.952316284179688,-0.161733821034431,-0.0668236613273621,-0.931099951267242,-0.358590990304947,0.0668235570192337,-0.931100070476532,-0.358590811491013,-0.00516187399625778,-0.989667952060699,-0.143285259604454,0.00516181206330657,-0.989667952060699,-0.143285274505615,0.0522454828023911,-0.998100697994232,-0.0326390936970711,-0.0522454939782619,-0.998100757598877,-0.0326391011476517,0.0486962050199509,-0.998811542987823,0.00206082314252853,-0.0486961975693703,-0.998811483383179,0.00206083199009299,0.054906602948904,-0.996916472911835,0.0560613349080086,-0.0549066290259361,-0.996916532516479,0.0560613572597504,0.00128274585586041,-0.98575359582901,0.168190911412239,-0.0012827473692596,-0.98575359582901,0.168190941214561,-0.00166751176584512,-0.999925673007965,-0.0120809841901064,0.00166751455981284,-0.999925673007965,-0.0120809879153967,0.00110611377749592,-0.999872803688049,0.0159114710986614,-0.00110611179843545,-0.999872803688049,0.0159114636480808,0.000460623414255679,-0.999999940395355,0.000149039493408054,-0.00046062347246334,-0.999999940395355,0.000149043262354098,0.355534374713898,-0.871380805969238,0.33806911110878,0.418588757514954,-0.908154129981995,0.00628614891320467,0.376701265573502,-0.88275933265686,-0.280770570039749,0.127623677253723,-0.846605718135834,-0.516692221164703,-0.127623751759529,-0.846605777740479,-0.516692161560059,-0.376701444387436,-0.882759213447571,-0.280770599842072,-0.41858896613121,-0.90815407037735,0.00628616753965616,-0.355534344911575,-0.871380865573883,0.338069021701813,-0.10366415977478,-0.848444938659668,0.519032537937164,0.103664264082909,-0.848444938659668,0.519032537937164,-0.302701979875565,0.0708800479769707,0.950445890426636,-0.805241942405701,0.0746862441301346,0.58822375535965, +-0.99658465385437,0.0812683999538422,-0.0146428104490042,-0.821004986763,0.0831120312213898,-0.564839065074921,-0.305098742246628,0.0401800014078617,-0.951472699642181,0.305098801851273,0.0401804149150848,-0.951472699642181,0.821005165576935,0.0831118524074554,-0.564838886260986,0.996584713459015,0.081267461180687,-0.0146429222077131,0.805242002010345,0.0746860206127167,0.588223934173584,0.302702069282532,0.0708800628781319,0.950445950031281,-0.915041387081146,0.251357674598694,-0.315465539693832,-0.775542080402374,0.260440081357956,-0.575069963932037,-0.975396752357483,0.1411003023386,-0.169386640191078,-0.98685759305954,0.159769743680954,-0.0241996962577105,-0.965351760387421,0.195449963212013,-0.172902688384056,-0.980836868286133,0.144363209605217,0.130836248397827,-0.940768003463745,0.172827914357185,0.291695117950439,-0.97034615278244,0.202205672860146,0.132443651556969,-0.917115867137909,0.26744157075882,0.295590162277222,-0.966840744018555,0.254485279321671,-0.0213608555495739,-0.881936192512512,0.15990437567234,0.443417489528656,-0.789775907993317,0.198988348245621,0.580222070217133,-0.865912199020386,0.222836747765541,0.447816759347916,-0.692726254463196,0.181430876255035,0.698006629943848,-0.557791233062744,0.230777934193611,0.79725182056427,-0.670721888542175,0.25176414847374,0.697672545909882,-0.52938312292099,0.306548178195953,0.791063666343689,-0.762093544006348,0.28625825047493,0.580749094486237,-0.431647747755051,0.206587851047516,0.878067076206207,-0.281548887491226,0.262491673231125,0.922945499420166,-0.406933635473251,0.282425582408905,0.868700623512268,-0.148168757557869,0.228675872087479,0.962160766124725,-1.66068048201851e-08,0.278763771057129,0.960359632968903,-0.134716346859932,0.307775348424911,0.941873610019684,1.21389064133837e-07,0.337842255830765,0.941202759742737,-0.258657038211823,0.326737910509109,0.909031808376312,0.148168757557869,0.228675872087479,0.962160766124725,0.281549036502838,0.262491792440414,0.922945439815521,0.134716272354126,0.307775437831879,0.941873550415039,0.431647628545761,0.206587895750999,0.878067016601563, +0.406933903694153,0.282425552606583,0.868700504302979,0.258656919002533,0.326737910509109,0.909031927585602,-1.02975704407982e-07,0.890143632888794,-0.455680042505264,0.00847539398819208,0.911191999912262,-0.411894857883453,0.0574204102158546,0.894107937812805,-0.444155275821686,-4.75102517327741e-08,0.939147055149078,-0.343515336513519,0.0031659307423979,0.971797108650208,-0.23579728603363,0.0322482958436012,0.944774210453033,-0.326131612062454,0.0665942206978798,0.97634893655777,-0.205689072608948,0.15453627705574,0.957430303096771,-0.243815258145332,0.107201278209686,0.923573017120361,-0.368131399154663,0.21073254942894,0.913433253765106,-0.348183274269104,-0.00847566779702902,0.911191880702972,-0.411894977092743,-0.0322486758232117,0.944774329662323,-0.326131016016006,-0.00316679407842457,0.971796751022339,-0.23579840362072,-0.0574191473424435,0.89410799741745,-0.444155186414719,-0.210733994841576,0.913433253765106,-0.348182022571564,-0.107200756669044,0.92357325553894,-0.36813086271286,-0.154536560177803,0.957430124282837,-0.243815585970879,-0.0665930435061455,0.976348519325256,-0.205691561102867,0.214692994952202,0.976245820522308,-0.0291749630123377,0.277103692293167,0.9569211602211,-0.0866917669773102,0.215011179447174,0.971474349498749,-0.100039072334766,0.148259595036507,0.98840743303299,-0.0327098816633224,0.32326951622963,0.943755447864532,-0.0694450363516808,0.309457838535309,0.932859420776367,-0.184415847063065,0.247674286365509,0.944539844989777,-0.215643167495728,0.135834142565727,0.983303010463715,-0.121095612645149,-0.323267996311188,0.943755865097046,-0.0694459453225136,-0.277104556560516,0.95692104101181,-0.0866904929280281,-0.309457212686539,0.932859778404236,-0.184414997696877,-0.214694917201996,0.976245284080505,-0.0291746612638235,-0.148259565234184,0.98840743303299,-0.0327097438275814,-0.215012013912201,0.971473872661591,-0.100041158497334,-0.135833695530891,0.98330283164978,-0.121097840368748,-0.24767504632473,0.944539904594421,-0.215641587972641,0.00977239292114973,0.99995219707489,-0.000287958682747558, +0.038130771368742,0.999163508415222,-0.0147777879610658,0.00767234712839127,0.99835067987442,-0.0568945109844208,-9.66963739301718e-07,0.999899685382843,-0.0141619043424726,0.0854973420500755,0.996319651603699,-0.00611746031790972,0.0821804031729698,0.995055913925171,-0.0557698011398315,0.0295795202255249,0.991872489452362,-0.123749762773514,-9.86523218671209e-07,0.990876019001007,-0.134776443243027,-0.0854973271489143,0.996319591999054,-0.006117794662714,-0.0381298586726189,0.999163568019867,-0.0147775765508413,-0.0821803882718086,0.995055913925171,-0.0557701252400875,-0.00977239105850458,0.99995219707489,-0.000286616268567741,-0.00767238531261683,0.998350739479065,-0.0568936318159103,-0.0295789614319801,0.991872310638428,-0.123751282691956,-0.15086156129837,0.988526344299316,0.00752116180956364,-0.215405717492104,0.976521730422974,0.00237184925936162,-0.281701683998108,0.959192454814911,0.0243698451668024,-0.225563764572144,0.973867952823639,0.0264982115477324,-0.14616422355175,0.989243388175964,-0.00580213312059641,-0.275089681148529,0.961213409900665,-0.0198619496077299,-0.32653483748436,0.945173621177673,0.00467695901170373,-0.339400291442871,0.938202440738678,0.0677033439278603,0.146163731813431,0.98924332857132,-0.00580242183059454,0.215405017137527,0.976521968841553,0.00237183808349073,0.275089949369431,0.961213350296021,-0.0198610872030258,0.150861501693726,0.988526225090027,0.00752296345308423,0.225563794374466,0.973867952823639,0.0264976155012846,0.281701654195786,0.959192395210266,0.0243716612458229,0.339400261640549,0.938202381134033,0.0677031800150871,0.326535850763321,0.945173263549805,0.00467695528641343,-0.0894802287220955,0.874128401279449,0.477381229400635,-0.141224205493927,0.921412289142609,0.362015336751938,-0.261756032705307,0.898185193538666,0.353195577859879,-1.12153429654427e-06,0.868123173713684,0.496348828077316,-0.0231722816824913,0.909847438335419,0.414295375347137,7.59117199322645e-07,0.950339078903198,0.311216324567795,-0.0105918375775218,0.981111884117126,0.19315068423748,-0.0506330095231533,0.953960597515106,0.295627415180206, +-0.080914206802845,0.98207688331604,0.170228764414787,-0.178457513451576,0.960283279418945,0.214497059583664,0.0894819721579552,0.874128043651581,0.477381527423859,0.023171940818429,0.909848570823669,0.414292871952057,0.261755675077438,0.898184239864349,0.353198140859604,0.141222849488258,0.921411693096161,0.362017542123795,0.178454518318176,0.960284471511841,0.214494109153748,0.080914743244648,0.982076346874237,0.170232132077217,0.0506320223212242,0.95396089553833,0.295626252889633,0.0105919539928436,0.981111705303192,0.193151921033859,-0.296820074319839,0.952066004276276,0.073945939540863,-0.2315304428339,0.969467997550964,0.080781377851963,-0.157669946551323,0.9871626496315,0.025497118011117,-0.34714213013649,0.922313988208771,0.169791549444199,-0.281370550394058,0.939888715744019,0.193493872880936,-0.14744234085083,0.984297454357147,0.0970538854598999,0.296820640563965,0.952065944671631,0.0739464536309242,0.347142934799194,0.922313690185547,0.169791996479034,0.157670795917511,0.987162530422211,0.0254951305687428,0.231528788805008,0.969468235969543,0.0807823687791824,0.147443220019341,0.984297156333923,0.0970553308725357,0.281370460987091,0.939888834953308,0.193493455648422,-0.0369300581514835,0.994537472724915,0.097629226744175,-0.0886916294693947,0.995112359523773,0.0434188991785049,-8.37141207049585e-12,0.994564414024353,0.104122906923294,-0.00953199341893196,0.999024271965027,0.0431232377886772,5.69391755966819e-13,0.999943614006042,0.0106183690950274,-0.0103162415325642,0.999946653842926,0.00024328134895768,-0.0407376512885094,0.999106168746948,0.0112794507294893,-0.0901813581585884,0.995911061763763,0.00532817048951983,0.036929227411747,0.994537353515625,0.0976298674941063,0.00953385233879089,0.999024212360382,0.0431246198713779,0.0886914730072021,0.995112419128418,0.043419249355793,0.0901839137077332,0.995910823345184,0.00532957492396235,0.0407366864383221,0.999106168746948,0.0112828314304352,0.0103134922683239,0.999946773052216,0.000240818480961025,-0.0387303940951824,0.999249517917633,-0.00068168097641319, +-0.0099408496171236,0.999950647354126,3.48648572980892e-05,-9.0545633328349e-14,1,-4.6285745725072e-07,-0.0862349271774292,0.996274590492249,0.000629327376373112,-0.0400528758764267,0.999197125434875,0.000936158176045865,0,1,-3.63002016001701e-07,0.0387303866446018,0.999249517917633,-0.000683524121996015,0.0862374380230904,0.996274471282959,0.000629203568678349,0.00993813574314117,0.999950647354126,3.47409841197077e-05,0.0400529615581036,0.999197125434875,0.000934750831220299,-0.0522846952080727,-0.964824020862579,0.257644563913345,-0.0347964875400066,-0.946669936180115,0.320320606231689,-0.0887260437011719,-0.935772597789764,0.341258406639099,-0.118014819920063,-0.955998361110687,0.268588155508041,-0.00480605661869049,-0.959494769573212,0.281685709953308,-8.00267443423763e-08,-0.945396065711975,0.325923681259155,-0.0167386345565319,-0.931983351707458,0.362114548683167,2.95621443990868e-10,-0.918767154216766,0.394799649715424,-0.0291880741715431,-0.904345810413361,0.425801306962967,-0.0578808076679707,-0.918578922748566,0.390976548194885,-0.122170500457287,-0.904573738574982,0.408436924219131,-0.161388218402863,-0.926593959331512,0.339672684669495,0.00480607990175486,-0.959494769573212,0.281685799360275,0.0347964279353619,-0.946669936180115,0.320320516824722,0.0167385432869196,-0.931983232498169,0.362114697694778,0.0522846579551697,-0.964824020862579,0.25764462351799,0.118014894425869,-0.955998361110687,0.268588215112686,0.0887260511517525,-0.935772597789764,0.341258436441422,0.161387950181961,-0.926594018936157,0.339672476053238,0.12217054516077,-0.904573798179626,0.408436805009842,0.0578807517886162,-0.918578863143921,0.390976577997208,0.0291879568248987,-0.90434592962265,0.425801217556,-0.157560467720032,-0.983236849308014,0.0917603746056557,-0.18971711397171,-0.967021107673645,0.169933944940567,-0.245602399110794,-0.958192646503448,0.146786421537399,-0.218502283096313,-0.972744643688202,0.0776188299059868,-0.125330001115799,-0.97619366645813,0.17702604830265,-0.188637912273407,-0.948149085044861,0.255790829658508, +-0.236156806349754,-0.917834758758545,0.319075495004654,-0.250403791666031,-0.940660655498505,0.229031637310982,-0.300784647464752,-0.934787631034851,0.188946217298508,-0.291826486587524,-0.950255870819092,0.108863055706024,0.12533001601696,-0.97619366645813,0.177026078104973,0.189717173576355,-0.967021107673645,0.169934019446373,0.188637867569923,-0.948149144649506,0.255790859460831,0.157560437917709,-0.983236908912659,0.0917603969573975,0.218502268195152,-0.972744584083557,0.0776188224554062,0.245602428913116,-0.958192646503448,0.146786406636238,0.291826575994492,-0.950255811214447,0.108863070607185,0.300784647464752,-0.934787631034851,0.188946202397346,0.250403821468353,-0.940660655498505,0.229031622409821,0.23615674674511,-0.917834937572479,0.319075345993042,-0.168424069881439,-0.985564589500427,-0.0171972848474979,-0.227879121899605,-0.973677396774292,0.00483804242685437,-0.274815201759338,-0.960930168628693,-0.0330119058489799,-0.230971813201904,-0.97143030166626,-0.0545462407171726,-0.165469065308571,-0.985808372497559,0.0283172968775034,-0.268526434898376,-0.96212911605835,0.0469148643314838,-0.324777156114578,-0.943916141986847,0.0595165342092514,-0.305385529994965,-0.952215731143951,0.00499881152063608,-0.327749401330948,-0.943680167198181,-0.0452556498348713,-0.306226909160614,-0.948398888111115,-0.0822471380233765,0.16546905040741,-0.985808372497559,0.0283172894269228,0.227879092097282,-0.973677456378937,0.00483805499970913,0.268526434898376,-0.96212911605835,0.0469148866832256,0.168424099683762,-0.985564589500427,-0.0171972662210464,0.230971738696098,-0.97143030166626,-0.0545462071895599,0.274815112352371,-0.960930168628693,-0.0330118536949158,0.306226789951324,-0.948398947715759,-0.0822470858693123,0.327749282121658,-0.943680226802826,-0.0452556349337101,0.305385291576385,-0.952215790748596,0.00499877659603953,0.324777185916901,-0.943916022777557,0.0595165900886059,-0.145101100206375,-0.978632032871246,-0.14568804204464,-0.218772426247597,-0.966608107089996,-0.133444756269455,-0.229248732328415,-0.947726726531982,-0.22194404900074, +-0.146875500679016,-0.957948267459869,-0.246500566601753,-0.170749589800835,-0.983331799507141,-0.0624745339155197,-0.271750211715698,-0.956016302108765,-0.110383659601212,-0.322781264781952,-0.934941828250885,-0.147295370697975,-0.28843104839325,-0.93916654586792,-0.186477661132813,-0.280633330345154,-0.917804777622223,-0.280854493379593,-0.203976482152939,-0.925370872020721,-0.319503486156464,0.170749604701996,-0.983331859111786,-0.0624745041131973,0.21877247095108,-0.966608047485352,-0.133444771170616,0.271750211715698,-0.956016361713409,-0.110383674502373,0.145101100206375,-0.978631973266602,-0.145688086748123,0.1468755453825,-0.957948327064514,-0.246500626206398,0.229248732328415,-0.947726726531982,-0.221944108605385,0.203976526856422,-0.925370752811432,-0.319503486156464,0.280633538961411,-0.917804718017578,-0.280854493379593,0.288431137800217,-0.939166367053986,-0.186477780342102,0.322781264781952,-0.934941828250885,-0.147295624017715,-0.00763287721201777,-0.963741421699524,-0.266728848218918,-0.0493716932833195,-0.948203980922699,-0.313802063465118,-0.0273217689245939,-0.929494917392731,-0.367821604013443,6.61410695101949e-08,-0.946370661258698,-0.323082983493805,-0.0633088871836662,-0.968968689441681,-0.238938614726067,-0.118096776306629,-0.935247778892517,-0.33371376991272,-0.158772081136703,-0.899943113327026,-0.406071156263351,-0.0820529907941818,-0.913912117481232,-0.397532552480698,-0.0430644527077675,-0.895508289337158,-0.442956238985062,1.02426866988026e-09,-0.91229110956192,-0.409542292356491,0.0633090287446976,-0.968968689441681,-0.238938733935356,0.0493716411292553,-0.948203861713409,-0.313802033662796,0.118096701800823,-0.935247719287872,-0.33371365070343,0.00763288326561451,-0.963741421699524,-0.266728937625885,0.027321757748723,-0.929494917392731,-0.367821425199509,0.0430644042789936,-0.895508468151093,-0.44295608997345,0.0820529088377953,-0.913911938667297,-0.39753258228302,0.158772125840187,-0.899943053722382,-0.406071275472641,-0.0108155878260732,-0.998924791812897,-0.0450818799436092,-0.0120267178863287,-0.995518207550049,-0.0938019379973412, +0.00819776020944118,-0.99175626039505,-0.127876311540604,0.00618441263213754,-0.998182654380798,-0.0599425993859768,-0.00685609923675656,-0.997993111610413,-0.062950924038887,-3.5728564995452e-08,-0.994424402713776,-0.105452671647072,-0.00784548744559288,-0.988508224487305,-0.150962889194489,1.82812094351448e-08,-0.978004992008209,-0.208581790328026,0.00918488018214703,-0.979952692985535,-0.199018776416779,0.0649195238947868,-0.987385153770447,-0.144415616989136,0.00685609690845013,-0.997993052005768,-0.0629509314894676,0.0120267327874899,-0.995518207550049,-0.0938019454479218,0.00784554518759251,-0.988508343696594,-0.150962918996811,0.0108155915513635,-0.998924791812897,-0.0450818911194801,-0.00618438655510545,-0.998182654380798,-0.0599425807595253,-0.00819783192127943,-0.991756319999695,-0.127876371145248,-0.064919501543045,-0.987385213375092,-0.144415691494942,-0.00918490532785654,-0.979952573776245,-0.199018761515617,0.00125321664381772,-0.999998033046722,-0.00159167079254985,0.0155415907502174,-0.999784111976624,-0.0137945814058185,0.0518661439418793,-0.998521566390991,-0.0162637475878,0.0148952919989824,-0.99988716840744,-0.00194099731743336,-0.00262758252210915,-0.999834716320038,-0.0179901961237192,0.0478185825049877,-0.997054040431976,-0.05997209623456,0.103174351155758,-0.992726743221283,-0.0620365738868713,0.103586174547672,-0.994413256645203,-0.0203039217740297,0.00262757833115757,-0.999834716320038,-0.0179902035742998,-0.015541598200798,-0.999784111976624,-0.0137945879250765,-0.047818586230278,-0.997054100036621,-0.0599720887839794,-0.00125321815721691,-0.999997973442078,-0.0015916678821668,-0.0148952854797244,-0.99988716840744,-0.00194100418593735,-0.051866140216589,-0.998521566390991,-0.0162637699395418,-0.103586211800575,-0.994413137435913,-0.0203039571642876,-0.103174418210983,-0.992726743221283,-0.0620365887880325,0.0024286606349051,-0.999995231628418,0.00187193241436034,0.014577878639102,-0.999893069267273,0.00119514402467757,0.0494577847421169,-0.998730361461639,0.00957064051181078,0.017398789525032,-0.999805450439453,0.0092900488525629, +0.00156723125837743,-0.99999874830246,3.9079153793864e-05,0.0489797294139862,-0.998792946338654,-0.00368838454596698,0.100841455161572,-0.994897603988647,0.00310369557701051,0.101320169866085,-0.994195580482483,0.0361853390932083,-0.00156723044347018,-0.99999874830246,3.90796194551513e-05,-0.0145778767764568,-0.999893009662628,0.00119514251127839,-0.0489797107875347,-0.998793005943298,-0.00368836615234613,-0.00242865923792124,-0.999995410442352,0.00187193334568292,-0.017398776486516,-0.999805510044098,0.00929005350917578,-0.049457810819149,-0.998730361461639,0.00957062747329473,-0.101320222020149,-0.994195580482483,0.036185335367918,-0.10084144026041,-0.994897663593292,0.0031037125736475,0.00766687048599124,-0.999407589435577,0.0335518531501293,0.022936848923564,-0.99925297498703,0.0311030559241772,0.0514078475534916,-0.994964718818665,0.0860371440649033,0.0168674439191818,-0.996455371379852,0.0824152454733849,0.00617039296776056,-0.999941647052765,0.00886561628431082,0.05362369120121,-0.997959077358246,0.0346730388700962,0.0971869453787804,-0.991109609603882,0.0908656194806099,0.0617301762104034,-0.983303785324097,0.171181529760361,-0.00617039343342185,-0.999941647052765,0.00886560697108507,-0.0229368656873703,-0.999253034591675,0.0311030689626932,-0.05362369120121,-0.997959017753601,0.034673061221838,-0.00766687002032995,-0.999407589435577,0.0335518531501293,-0.0168674737215042,-0.996455252170563,0.0824152529239655,-0.0514078326523304,-0.994964718818665,0.0860371440649033,-0.061730157583952,-0.983303725719452,0.171181440353394,-0.0971869602799416,-0.991109549999237,0.0908656567335129,0.0106698106974363,-0.974841833114624,0.222642242908478,0.0156978573650122,-0.98814857006073,0.152695924043655,6.84606399348198e-11,-0.972715973854065,0.231999412178993,-0.00400406774133444,-0.984450995922089,0.175613835453987,-8.9178935069878e-11,-0.99214506149292,0.125092431902885,-0.00366829498670995,-0.997122645378113,0.0757156386971474,-0.00389134767465293,-0.993361413478851,0.114968955516815,-0.000234940496739,-0.998105943202972,0.0615181475877762, +-0.0106697827577591,-0.974841833114624,0.222642183303833,0.00400408403947949,-0.984450995922089,0.175613850355148,-0.0156978536397219,-0.98814857006073,0.152695894241333,0.000234903214732185,-0.998105883598328,0.0615181364119053,0.00389134115539491,-0.993361413478851,0.114968992769718,0.00366830942220986,-0.997122704982758,0.0757156312465668,0.000895308563485742,-0.999999642372131,4.39140712842345e-05,5.96455538470764e-06,-0.999996066093445,-0.00278931576758623,-0.00134831666946411,-0.999957978725433,-0.00906770396977663,0.00010082663357025,-0.999999940395355,6.67511485517025e-05,9.91514204073951e-10,-0.999992668628693,-0.00383439427241683,-0.00114387483336031,-0.999890625476837,-0.0147445648908615,6.35714281216337e-09,-0.99933135509491,-0.0365631990134716,-0.00535142049193382,-0.999568104743958,-0.0288944039493799,-0.000100826619018335,-0.999999940395355,6.6749271354638e-05,-5.96371546635055e-06,-0.999996185302734,-0.00278931390494108,0.00114387553185225,-0.999890625476837,-0.0147445667535067,-0.000895308796316385,-0.999999642372131,4.39161012764089e-05,0.00134831934701651,-0.999957978725433,-0.0090677123516798,0.0053514214232564,-0.999568164348602,-0.0288944039493799,0.000293616612907499,-0.999999940395355,0.000160552153829485,0.00156872230581939,-0.999989151954651,0.00437326403334737,-0.000255975319305435,-0.999852299690247,0.0171851571649313,-5.35758382103069e-10,-0.999990701675415,0.00431897072121501,0.00244871177710593,-0.999995350837708,0.00183080486021936,0.00405054306611419,-0.999867618083954,0.0157546177506447,-0.000744854274671525,-0.999319732189178,0.0368707552552223,-2.3889772382546e-09,-0.999112904071808,0.0421109534800053,-0.00244871759787202,-0.999995350837708,0.00183080590795726,-0.00156872277148068,-0.999989211559296,0.00437327055260539,-0.00405054120346904,-0.999867618083954,0.0157546158879995,-0.000293613760732114,-0.99999988079071,0.000160552954184823,0.000255971943261102,-0.999852299690247,0.017185153439641,0.000744856661185622,-0.999319732189178,0.0368707329034805,0.000667248910758644,-0.999999701976776,0.000325425033224747, +0.001014260109514,-0.999999463558197,0.000321065250318497,-3.73499018171963e-12,-1,6.74635302857496e-05,0.000116545867058448,-1,8.11230856925249e-05,-2.17788092247984e-12,-1,6.74665934639052e-05,0.000407224462833256,-0.999999940395355,6.49861976853572e-05,-0.000667249085381627,-0.999999642372131,0.000325424916809425,-0.000116544499178417,-1,8.11226855148561e-05,-0.00101426127366722,-0.999999403953552,0.00032106862636283,-0.000407224259106442,-0.99999988079071,6.49814173812047e-05,0.307730317115784,-0.906101584434509,0.290313422679901,0.306587934494019,-0.85826700925827,0.411560148000717,0.208278626203537,-0.885518848896027,0.415302723646164,0.351232320070267,-0.925909340381622,0.139024317264557,0.389189094305038,-0.885260462760925,0.254648089408875,0.493252247571945,-0.846092820167542,0.202062293887138,0.416570425033569,-0.818544089794159,0.395543485879898,0.280629307031631,-0.800654709339142,0.529338419437408,0.359598994255066,-0.933093726634979,0.00496114697307348,0.418446898460388,-0.904605031013489,0.0811904668807983,0.354728668928146,-0.928575217723846,-0.109158709645271,0.413958698511124,-0.90811425447464,-0.0629829689860344,0.485451847314835,-0.859323680400848,-0.160932779312134,0.508249640464783,-0.861160397529602,0.0092298611998558,0.336368829011917,-0.910699486732483,-0.239755094051361,0.395937353372574,-0.895499587059021,-0.203258544206619,0.250641733407974,-0.885617911815643,-0.390972703695297,0.34038046002388,-0.86790806055069,-0.361769080162048,0.312028765678406,-0.814433395862579,-0.489220052957535,0.432060420513153,-0.838522672653198,-0.331968903541565,0.110914200544357,-0.874559998512268,-0.472062349319458,0.202505216002464,-0.847386538982391,-0.490844011306763,8.74050498644863e-10,-0.876026332378387,-0.48226323723793,0.060199361294508,-0.848861336708069,-0.525176525115967,-7.51586182179409e-10,-0.818411290645599,-0.574632942676544,0.145340442657471,-0.812576115131378,-0.564443230628967,-0.11091423779726,-0.874559998512268,-0.472062289714813,-0.0601993426680565,-0.848861455917358,-0.525176525115967, +-0.250641703605652,-0.885617911815643,-0.39097273349762,-0.202505186200142,-0.847386419773102,-0.490844130516052,-0.312028706073761,-0.814433455467224,-0.489219963550568,-0.145340412855148,-0.812576055526733,-0.564443409442902,-0.336368948221207,-0.910699486732483,-0.239755004644394,-0.340380609035492,-0.867907822132111,-0.361769199371338,-0.354728370904922,-0.928575456142426,-0.109158702194691,-0.395937263965607,-0.895499646663666,-0.203258529305458,-0.485451757907867,-0.859323740005493,-0.16093273460865,-0.432060450315475,-0.838522672653198,-0.331969082355499,-0.359598904848099,-0.933093845844269,0.00496116420254111,-0.413958668708801,-0.90811425447464,-0.0629829242825508,-0.351232349872589,-0.925909221172333,0.139024421572685,-0.418447136878967,-0.904604911804199,0.0811903923749924,-0.493252336978912,-0.846092760562897,0.202062323689461,-0.508249342441559,-0.861160516738892,0.00922986585646868,-0.307730346918106,-0.906101524829865,0.290313512086868,-0.389188975095749,-0.885260581970215,0.254648119211197,-0.208278506994247,-0.885518968105316,0.415302604436874,-0.306587874889374,-0.858266890048981,0.411560088396072,-0.280629456043243,-0.800654649734497,0.529338479042053,-0.416570276021957,-0.818544149398804,0.395543485879898,-0.0848779082298279,-0.881497859954834,0.464496791362762,-0.170074686408043,-0.846242904663086,0.504923343658447,0,-0.885079920291901,0.465439140796661,-0.0470892749726772,-0.852101504802704,0.521253883838654,8.17113132711711e-08,-0.812426686286926,0.583063304424286,-0.124596707522869,-0.805313110351563,0.579608917236328,0.0848780423402786,-0.88149756193161,0.464497327804565,0.0470895282924175,-0.852101504802704,0.521254062652588,0.170074462890625,-0.846242964267731,0.504923343658447,0.124596521258354,-0.805313289165497,0.579608559608459,-0.301428526639938,-0.0335431881248951,0.952898621559143,-0.443861156702042,0.0699212923645973,0.893363475799561,-0.577013492584229,-0.0230822898447514,0.816408455371857,-3.31592153735016e-09,-0.0377413742244244,0.999287605285645,-0.155216470360756,0.0720002502202988,0.985253155231476, +-8.99410768084863e-09,0.16454866528511,0.986368954181671,-0.298997730016708,0.156745746731758,0.941292285919189,-0.575727105140686,0.143374741077423,0.804973244667053,-0.803869187831879,-0.00657851016148925,0.594769716262817,-0.888994336128235,0.0774023905396461,0.451329082250595,-0.952644824981689,0.00863749068230391,0.303962647914886,-0.701896131038666,0.0717647597193718,0.708654820919037,-0.802174746990204,0.134144216775894,0.58182555437088,-0.947800755500793,0.126529633998871,0.292683929204941,-0.999766170978546,0.0194421447813511,-0.00946355331689119,-0.983520269393921,0.0833443701267242,-0.16044183075428,-0.954672694206238,0.0241906382143497,-0.296672970056534,-0.987172424793243,0.0797928795218468,0.138288661837578,-0.992358684539795,0.121877439320087,-0.0192373711615801,-0.944213807582855,0.125545054674149,-0.304464638233185,-0.825427949428558,0.0107805943116546,-0.564404606819153,-0.721292614936829,0.0766204074025154,-0.688379406929016,-0.595654249191284,-0.0211535878479481,-0.802962422370911,-0.896366596221924,0.0856081545352936,-0.434969067573547,-0.813561320304871,0.133119478821754,-0.566036403179169,-0.589621424674988,0.12933050096035,-0.797257959842682,-0.303191989660263,-0.0548390783369541,-0.951350271701813,-0.155079409480095,0.0313886739313602,-0.987403154373169,1.20734355846253e-08,-0.0693794414401054,-0.997590303421021,-0.451661556959152,0.0524763874709606,-0.890644729137421,-0.304174453020096,0.111567378044128,-0.946060597896576,-1.5610442005709e-07,0.101492278277874,-0.994836211204529,0.303191900253296,-0.0548391193151474,-0.951350331306458,0.451661646366119,0.052476741373539,-0.890644609928131,0.595654547214508,-0.0211535524576902,-0.802962124347687,0.155079200863838,0.0313887074589729,-0.987403273582458,0.304174542427063,0.111567668616772,-0.946060538291931,0.589621603488922,0.129330769181252,-0.797257721424103,0.825428009033203,0.0107809994369745,-0.564404487609863,0.896366596221924,0.0856078937649727,-0.434969067573547,0.954672694206238,0.0241914894431829,-0.296672821044922,0.721292853355408,0.0766206756234169,-0.688379168510437, +0.813561260700226,0.133119076490402,-0.566036641597748,0.944213926792145,0.12554444372654,-0.304464489221573,0.999766111373901,0.0194428842514753,-0.00946352444589138,0.987172484397888,0.0797918885946274,0.138288453221321,0.952644884586334,0.00863794889301062,0.303962349891663,0.983520269393921,0.0833438113331795,-0.160441741347313,0.992358803749084,0.121876753866673,-0.0192373730242252,0.947801113128662,0.126527830958366,0.292683750391006,0.803869247436523,-0.00657837418839335,0.594769597053528,0.701895833015442,0.0717650055885315,0.708654999732971,0.577013373374939,-0.0230818204581738,0.816408455371857,0.888994574546814,0.0774019360542297,0.451328724622726,0.802174925804138,0.134143620729446,0.581825494766235,0.575727105140686,0.143374398350716,0.804973304271698,0.301428645849228,-0.033542774617672,0.952898561954498,0.155216440558434,0.072000227868557,0.985253155231476,0.443861156702042,0.0699212402105331,0.89336359500885,0.298997759819031,0.156745567917824,0.941292285919189,0.46631520986557,0.870021879673004,-0.16003742814064,0.432017087936401,0.899819195270538,-0.0607178509235382,0.49148166179657,0.870833039283752,0.00977401994168758,0.552879512310028,0.828892052173615,-0.0852181017398834,0.385063469409943,0.915930390357971,-0.113126151263714,0.359778881072998,0.932209551334381,-0.0392999574542046,0.39731752872467,0.917650640010834,0.00748306605964899,0.368383377790451,0.928385972976685,0.0489199049770832,0.406910330057144,0.905573308467865,0.11983735114336,0.441935807466507,0.89378422498703,0.0764367282390594,0.48495477437973,0.857429921627045,0.172142133116722,0.557395458221436,0.823874056339264,0.102673523128033,-0.368383467197418,0.92838591337204,0.0489199310541153,-0.397317945957184,0.917650520801544,0.007482944522053,-0.441936165094376,0.893783926963806,0.0764370486140251,-0.406910389661789,0.90557324886322,0.119837276637554,-0.359778702259064,0.932209610939026,-0.0393009968101978,-0.38506343960762,0.915930449962616,-0.113126702606678,-0.432017058134079,0.899819076061249,-0.0607179291546345,-0.466315358877182,0.870021820068359,-0.160037145018578, +-0.552879095077515,0.828892350196838,-0.0852183103561401,-0.491482019424438,0.870832860469818,0.00977452471852303,-0.557395577430725,0.823873817920685,0.10267448425293,-0.484955161809921,0.857429504394531,0.172142565250397,0.382567375898361,0.912122249603271,0.147224962711334,0.40137979388237,0.87638932466507,0.266149878501892,0.436329215764999,0.871612310409546,0.223402738571167,0.353867292404175,0.882375657558441,0.310146927833557,0.302466511726379,0.8385289311409,0.453192293643951,0.380748450756073,0.835358500480652,0.396492958068848,0.32057511806488,0.803144931793213,0.502184927463531,0.407187253236771,0.796610534191132,0.446777552366257,0.439171880483627,0.830775380134583,0.34196537733078,0.510213136672974,0.811348974704742,0.28529891371727,-0.35386660695076,0.882376968860626,0.310144156217575,-0.401380479335785,0.876389265060425,0.266149491071701,-0.380749464035034,0.835358262062073,0.396492630243301,-0.302466601133347,0.838529527187347,0.453191131353378,-0.382567048072815,0.912122309207916,0.147225737571716,-0.436329960823059,0.871612131595612,0.223402351140976,-0.51021271944046,0.811349332332611,0.285298466682434,-0.439171731472015,0.830775678157806,0.341964781284332,-0.407186269760132,0.796610414981842,0.446778565645218,-0.320575475692749,0.803144514560699,0.502185523509979,0.192988365888596,0.850210547447205,0.489793330430984,0.121932864189148,0.819489121437073,0.559973239898682,0.222858041524887,0.807716488838196,0.54582816362381,0.041122168302536,0.838972091674805,0.542618572711945,2.75177880482147e-09,0.819631636142731,0.572890937328339,0.0605108588933945,0.805211365222931,0.589892387390137,-8.88405438104201e-08,0.795105695724487,0.606470823287964,0.0750983878970146,0.78509646654129,0.614803969860077,0.147579401731491,0.793474555015564,0.590439200401306,0.242915898561478,0.786581099033356,0.567698776721954,-0.0411218702793121,0.838972449302673,0.542618036270142,-0.121933415532112,0.819488942623138,0.559973418712616,-0.0605114437639713,0.805210888385773,0.589893162250519,-0.192988708615303,0.850210607051849,0.489793062210083, +-0.222857937216759,0.807716846466064,0.545827507972717,-0.242916256189346,0.78658127784729,0.567698419094086,-0.147579655051231,0.793475091457367,0.590438425540924,-0.0750987082719803,0.785097002983093,0.61480301618576,-0.349309802055359,0.924599826335907,-0.151979401707649,-0.349870979785919,0.900440812110901,-0.258450567722321,-0.400871157646179,0.890417516231537,-0.215543389320374,-0.294470757246017,0.906733512878418,-0.301862865686417,-0.241115346550941,0.879796266555786,-0.409660845994949,-0.326287180185318,0.869643092155457,-0.370482981204987,-0.282618582248688,0.835148930549622,-0.471861124038696,-0.384747445583344,0.807962238788605,-0.446280688047409,-0.401554614305496,0.853882551193237,-0.33111697435379,-0.493241786956787,0.822472155094147,-0.283288031816483,0.294471323490143,0.906733274459839,-0.301863312721252,0.349871039390564,0.900440514087677,-0.258451372385025,0.32628732919693,0.869642615318298,-0.370483964681625,0.24111533164978,0.879795789718628,-0.409661710262299,0.349309742450714,0.924599885940552,-0.151979833841324,0.400871187448502,0.890417575836182,-0.215543314814568,0.493241637945175,0.822471976280212,-0.283288657665253,0.401554584503174,0.853882372379303,-0.331117570400238,0.384747713804245,0.807962000370026,-0.446280896663666,0.282618492841721,0.835149109363556,-0.471861004829407,-0.141506463289261,0.88670814037323,-0.440141379833221,-0.0863057300448418,0.870336949825287,-0.48483482003212,-0.180486008524895,0.85429710149765,-0.487443566322327,-0.0216460730880499,0.88103973865509,-0.472546756267548,-1.59102270913536e-07,0.87262761592865,-0.488386243581772,-0.0453037954866886,0.855254173278809,-0.516224503517151,3.01082906162264e-07,0.832917392253876,-0.553397417068481,-0.0713264495134354,0.800348520278931,-0.59527724981308,-0.127204477787018,0.829952120780945,-0.543137729167938,-0.22977776825428,0.798461019992828,-0.556472897529602,0.0216471832245588,0.881039679050446,-0.472546845674515,0.0863054022192955,0.870337545871735,-0.484833955764771,0.0453033335506916,0.85525369644165,-0.516225457191467, +0.141504868865013,0.886707961559296,-0.440142333507538,0.180486366152763,0.85429710149765,-0.487443536520004,0.229778081178665,0.798461258411407,-0.556472539901733,0.127203896641731,0.829951584339142,-0.543138742446899,0.071326345205307,0.800349116325378,-0.595276236534119,0.109057433903217,0.567598938941956,0.816050291061401,0.203595161437988,0.659801840782166,0.72333288192749,0.0907638967037201,0.719762861728668,0.688261032104492,-6.38509902728401e-07,0.649733781814575,0.760161757469177,0.334723591804504,0.590528845787048,0.734326779842377,0.415117353200912,0.674207806587219,0.610836625099182,0.281178593635559,0.728316903114319,0.624894440174103,0.349253088235855,0.76969838142395,0.534403204917908,0.167962580919266,0.765716552734375,0.620859563350677,-7.97175880862255e-10,0.763325393199921,0.646014094352722,-0.334723442792892,0.590528964996338,0.734326720237732,-0.203594908118248,0.6598020195961,0.723332941532135,-0.281178325414658,0.728316783905029,0.624894678592682,-0.41511744260788,0.674207866191864,0.610836625099182,-0.109057493507862,0.567598879337311,0.816050231456757,-0.090764045715332,0.7197625041008,0.688261449337006,-0.167962595820427,0.765716731548309,0.620859324932098,-0.349252253770828,0.769698798656464,0.534402906894684,0.122549988329411,0.358269333839417,0.925540149211884,0.243119090795517,0.390770465135574,0.88780152797699,0.116958796977997,0.429170668125153,0.895618855953217,-1.50097112516789e-09,0.385571390390396,0.922678053379059,0.380983531475067,0.353839129209518,0.854195177555084,0.501343488693237,0.406849592924118,0.763628244400024,0.363165497779846,0.450279265642166,0.815695762634277,0.472717821598053,0.530648350715637,0.703526973724365,0.232307374477386,0.498948067426682,0.834915637969971,-9.11782152002161e-08,0.48431670665741,0.874892830848694,-0.380983859300613,0.353839516639709,0.854194939136505,-0.243119090795517,0.390770316123962,0.887801647186279,-0.363165616989136,0.450278252363205,0.815696179866791,-0.501343667507172,0.406849443912506,0.763628244400024,-0.122550092637539,0.358269780874252,0.925540030002594, +-0.11695858836174,0.429170429706573,0.895619034767151,-0.232307031750679,0.498948037624359,0.834915816783905,-0.472718089818954,0.530648648738861,0.703526496887207,0.549882709980011,0.611636877059937,0.568796336650848,0.592788875102997,0.672641634941101,0.442893385887146,0.471083492040634,0.729083120822906,0.496506065130234,0.696691334247589,0.618557989597321,0.363328188657761,0.710157632827759,0.662511587142944,0.238232314586639,0.612037181854248,0.71922767162323,0.328818947076797,0.603367209434509,0.768099129199982,0.214410454034805,0.503757059574127,0.768933713436127,0.393662065267563,-0.6966912150383,0.618558049201965,0.363327831029892,-0.592789053916931,0.67264187335968,0.442892700433731,-0.612037360668182,0.71922755241394,0.328819066286087,-0.71015739440918,0.662511706352234,0.238232597708702,-0.549883306026459,0.611637115478516,0.568795621395111,-0.471083223819733,0.729083299636841,0.496505916118622,-0.503757059574127,0.768933713436127,0.393661826848984,-0.60336697101593,0.768099248409271,0.214410468935966,0.63907915353775,0.76908677816391,0.00912954937666655,0.700574040412903,0.705176830291748,-0.109186671674252,0.604412078857422,0.768582344055176,-0.209683537483215,0.693573772907257,0.710448741912842,0.119239196181297,0.779821455478668,0.613631725311279,0.123832732439041,0.758918762207031,0.651176750659943,0.00333607266657054,0.78959059715271,0.60045850276947,-0.126476287841797,0.726079881191254,0.643149375915527,-0.243242397904396,-0.639078497886658,0.769087314605713,0.00913071073591709,-0.693573117256165,0.710449457168579,0.119239263236523,-0.604412138462067,0.768582403659821,-0.209683373570442,-0.700574219226837,0.705176651477814,-0.109186135232449,-0.726080060005188,0.643149018287659,-0.243242755532265,-0.789590239524841,0.600458800792694,-0.126477003097534,-0.758918821811676,0.651176691055298,0.00333581189624965,-0.779821515083313,0.613631784915924,0.123832635581493,0.715339660644531,0.587335348129272,-0.378584504127502,0.606918096542358,0.641994297504425,-0.468501448631287,0.62204498052597,0.703933298587799,-0.342837989330292, +0.563612401485443,0.578580737113953,-0.5895636677742,0.426936894655228,0.643275558948517,-0.635548233985901,0.476573884487152,0.704695641994476,-0.525624752044678,0.347077339887619,0.757977485656738,-0.552274763584137,0.499397963285446,0.763867497444153,-0.408788532018661,-0.563612103462219,0.578580796718597,-0.58956390619278,-0.606918454170227,0.641993880271912,-0.468501657247543,-0.476573914289474,0.704695165157318,-0.525625467300415,-0.42693692445755,0.643275141716003,-0.635548532009125,-0.7153400182724,0.587335050106049,-0.378584444522858,-0.622045159339905,0.703933596611023,-0.34283709526062,-0.499397695064545,0.763867795467377,-0.408788293600082,-0.347077041864395,0.757977664470673,-0.552274882793427,0.355164706707001,0.575041890144348,-0.737010776996613,0.218355864286423,0.647060990333557,-0.730501770973206,0.290702104568481,0.705519437789917,-0.646323919296265,0.124300889670849,0.577583253383636,-0.806812822818756,1.17255055442911e-07,0.651076912879944,-0.759011745452881,0.0971666723489761,0.710413217544556,-0.697044968605042,6.41856168215327e-09,0.761248528957367,-0.648460149765015,0.170410424470901,0.758027851581573,-0.629566669464111,-0.124300718307495,0.577583491802216,-0.806812584400177,-0.218355923891068,0.647060215473175,-0.730502367019653,-0.0971664935350418,0.710413217544556,-0.697045028209686,-0.355164855718613,0.575042307376862,-0.737010300159454,-0.290702342987061,0.705519139766693,-0.646324157714844,-0.170410230755806,0.758028626441956,-0.629565834999084,0.63762903213501,0.352602005004883,0.684909462928772,0.716221928596497,0.425684332847595,0.55300897359848,0.600624859333038,0.480810463428497,0.638804376125336,0.826079487800598,0.350263923406601,0.441483706235886,0.854788482189178,0.435043036937714,0.28297421336174,0.762484788894653,0.504319727420807,0.405312806367874,0.780264556407928,0.570066690444946,0.257315248250961,0.663363218307495,0.557712018489838,0.498905211687088,-0.826079308986664,0.350264310836792,0.44148376584053,-0.716221809387207,0.425684452056885,0.55300909280777,-0.762484431266785,0.504319787025452,0.405313193798065, +-0.854788362979889,0.435042887926102,0.282974481582642,-0.637629091739655,0.352602064609528,0.684909343719482,-0.600625097751617,0.480810433626175,0.638804197311401,-0.663363337516785,0.557711720466614,0.498905509710312,-0.780264616012573,0.570066750049591,0.257315009832382,0.929783225059509,0.342483639717102,0.134937345981598,0.903614163398743,0.428135901689529,-0.0134579269215465,0.851151406764984,0.508712291717529,0.129434302449226,0.928670763969421,0.332019090652466,-0.165329664945602,0.86135059595108,0.41222807765007,-0.296888768672943,0.856507062911987,0.495113343000412,-0.145802453160286,0.794763386249542,0.544958651065826,-0.267154276371002,0.826385498046875,0.563085734844208,-0.00462405569851398,-0.928670883178711,0.332018703222275,-0.165329709649086,-0.903614163398743,0.428135842084885,-0.013458389788866,-0.856507182121277,0.495113044977188,-0.14580249786377,-0.86135071516037,0.412227839231491,-0.296888768672943,-0.929783165454865,0.342483788728714,0.134937226772308,-0.851151525974274,0.508712112903595,0.129433885216713,-0.826385855674744,0.563085377216339,-0.00462440168485045,-0.794763088226318,0.54495906829834,-0.267153859138489,0.834726750850677,0.324479788541794,-0.444909125566483,0.734021484851837,0.394187957048416,-0.553017377853394,0.778101146221161,0.472745597362518,-0.413606256246567,0.661875069141388,0.322590589523315,-0.676651120185852,0.534589350223541,0.381121516227722,-0.754294812679291,0.621300101280212,0.450997471809387,-0.6407710313797,0.49372935295105,0.508247017860413,-0.705631971359253,0.680688500404358,0.523745656013489,-0.512204527854919,-0.661874949932098,0.322590857744217,-0.676651120185852,-0.734021842479706,0.394187271595001,-0.553017497062683,-0.621299982070923,0.450997054576874,-0.640771329402924,-0.534589231014252,0.381120771169662,-0.754295170307159,-0.834726870059967,0.324479520320892,-0.444908916950226,-0.77810150384903,0.472745776176453,-0.413605630397797,-0.680688440799713,0.523746311664581,-0.512204110622406,-0.493729025125504,0.508246958255768,-0.705632090568542,0.426183938980103,0.318768978118896,-0.846612989902496, +0.287251591682434,0.372000247240067,-0.882667660713196,0.400376856327057,0.437879413366318,-0.804959654808044,0.153176844120026,0.310604482889175,-0.938115954399109,3.1682341194994e-09,0.367898195981979,-0.929866075515747,0.143720746040344,0.432861328125,-0.889929950237274,9.68820330626841e-08,0.502541482448578,-0.864553034305573,0.262070298194885,0.502631068229675,-0.823821187019348,-0.15317676961422,0.310604274272919,-0.938116073608398,-0.287251740694046,0.372000128030777,-0.882667660713196,-0.143720746040344,0.432861089706421,-0.889930188655853,-0.426184087991714,0.318769365549088,-0.846612751483917,-0.400376826524734,0.437879145145416,-0.804959833621979,-0.26207035779953,0.502631545066833,-0.823820888996124,0.06943579018116,-0.76164436340332,0.644264400005341,0.167126685380936,-0.70086145401001,0.693442046642303,0.09188012778759,-0.64922046661377,0.755030393600464,-4.8066559621418e-09,-0.711378216743469,0.702809393405914,0.230730578303337,-0.748010337352753,0.62228924036026,0.361920475959778,-0.67816948890686,0.639609038829803,0.292339384555817,-0.625764310359955,0.723157346248627,0.440927803516388,-0.53361177444458,0.721693217754364,0.353205412626266,-0.476698577404022,0.804987192153931,0.210857883095741,-0.570985853672028,0.793419182300568,0.115517131984234,-0.50473827123642,0.855508625507355,-1.01759454196326e-07,-0.585649490356445,0.810564398765564,-0.230730727314949,-0.748010277748108,0.62228935956955,-0.167126819491386,-0.700861513614655,0.693441867828369,-0.292339444160461,-0.62576425075531,0.723157405853271,-0.361920416355133,-0.67816960811615,0.639608919620514,-0.0694359540939331,-0.761644303798676,0.644264400005341,-0.09188012778759,-0.649220645427704,0.75503021478653,-0.115517243742943,-0.50473827123642,0.855508625507355,-0.210857897996902,-0.570985674858093,0.793419301509857,-0.353205502033234,-0.476698756217957,0.804987132549286,-0.440927922725677,-0.533611536026001,0.721693396568298,0.409085154533386,-0.741369187831879,0.531997203826904,0.556100726127625,-0.657381176948547,0.508529365062714,0.512152433395386,-0.588290750980377,0.625790596008301, +0.55189973115921,-0.752205729484558,0.359990537166595,0.706081807613373,-0.648570775985718,0.284261077642441,0.7105752825737,-0.548374116420746,0.440872669219971,0.842954576015472,-0.432571172714233,0.31985878944397,0.800889790058136,-0.378296703100204,0.464184254407883,0.666069030761719,-0.481773018836975,0.569426774978638,0.595685482025146,-0.431207031011581,0.677657306194305,-0.551899909973145,-0.752205550670624,0.35999071598053,-0.55610054731369,-0.657381176948547,0.508529365062714,-0.71057540178299,-0.548373997211456,0.440872460603714,-0.706081807613373,-0.648570895195007,0.284260928630829,-0.409084916114807,-0.741369307041168,0.531997203826904,-0.512152254581451,-0.588290750980377,0.62579071521759,-0.595685124397278,-0.431206971406937,0.67765748500824,-0.66606879234314,-0.481773227453232,0.569426834583282,-0.800889849662781,-0.378296673297882,0.464184194803238,-0.842954754829407,-0.432571202516556,0.319858521223068,0.626050233840942,-0.769544661045074,0.125944778323174,0.757780253887177,-0.652258932590485,0.0180930756032467,0.835741639137268,-0.524161458015442,0.163678824901581,0.619685232639313,-0.779309570789337,-0.0930955857038498,0.709324061870575,-0.664896309375763,-0.234034761786461,0.841212689876556,-0.526800930500031,-0.121827341616154,0.862368881702423,-0.423583179712296,-0.277303487062454,0.937142550945282,-0.321612805128098,-0.135384738445282,0.912748754024506,-0.408081531524658,0.0189511887729168,0.926942944526672,-0.335592210292816,0.167793318629265,-0.619685471057892,-0.779309511184692,-0.0930955559015274,-0.757780373096466,-0.652258813381195,0.0180930998176336,-0.841212451457977,-0.526801347732544,-0.121827363967896,-0.709324181079865,-0.664896190166473,-0.234034866094589,-0.626050114631653,-0.769544839859009,0.125944718718529,-0.835741817951202,-0.524161159992218,0.163678914308548,-0.926942527294159,-0.335593581199646,0.167793303728104,-0.912748277187347,-0.408082574605942,0.0189513824880123,-0.937142550945282,-0.321612685918808,-0.135384812951088,-0.862368524074554,-0.423583984375,-0.277303278446198, +0.55496609210968,-0.776647329330444,-0.298046231269836,0.578612387180328,-0.680911719799042,-0.448961973190308,0.733705878257751,-0.55739164352417,-0.388574570417404,0.434194713830948,-0.766114711761475,-0.473859846591949,0.387861043214798,-0.701608657836914,-0.597753405570984,0.54447078704834,-0.602576017379761,-0.583483994007111,0.468810945749283,-0.539857447147369,-0.699120998382568,0.630652725696564,-0.422990739345551,-0.650658071041107,0.701300084590912,-0.478253602981567,-0.528632044792175,0.832128405570984,-0.355785101652145,-0.425416618585587,-0.434194654226303,-0.766114711761475,-0.473859876394272,-0.578612387180328,-0.680911839008331,-0.448961824178696,-0.54447078704834,-0.602576076984406,-0.583484172821045,-0.38786107301712,-0.701608836650848,-0.59775310754776,-0.55496609210968,-0.776647210121155,-0.298046231269836,-0.733705937862396,-0.557391762733459,-0.388574451208115,-0.832128286361694,-0.355785548686981,-0.42541640996933,-0.701299846172333,-0.478253602981567,-0.528632283210754,-0.630652725696564,-0.422990500926971,-0.650658249855042,-0.468811303377151,-0.539856910705566,-0.699121177196503,0.253396183252335,-0.767609238624573,-0.588698923587799,0.18230114877224,-0.72303432226181,-0.666323900222778,0.312611907720566,-0.642886817455292,-0.699264049530029,0.0793036296963692,-0.77914422750473,-0.621808111667633,-6.80870968494673e-08,-0.732583999633789,-0.680676639080048,0.099799245595932,-0.664341449737549,-0.740736484527588,7.94092791522871e-09,-0.590252220630646,-0.807218909263611,0.119276262819767,-0.505373954772949,-0.854617118835449,0.223039045929909,-0.578021168708801,-0.784949123859406,0.368819415569305,-0.478756099939346,-0.796721279621124,-0.0793036967515945,-0.779144287109375,-0.621807873249054,-0.182300984859467,-0.723034620285034,-0.666323721408844,-0.0997991412878036,-0.664341568946838,-0.740736484527588,-0.253395974636078,-0.767609477043152,-0.58869856595993,-0.312611997127533,-0.642886698246002,-0.699264228343964,-0.36881959438324,-0.478756040334702,-0.796721279621124,-0.223039016127586,-0.578020870685577,-0.784949362277985, +-0.119276262819767,-0.505373775959015,-0.854617118835449,0.252576529979706,-0.413102030754089,0.874958217144012,0.136050865054131,-0.341688275337219,0.929913580417633,-8.47709813456277e-08,-0.42781525850296,0.903866231441498,0.506382405757904,-0.379033535718918,0.774538815021515,0.401145279407501,-0.318607598543167,0.858819901943207,0.551313102245331,-0.220589980483055,0.804607927799225,0.433383285999298,-0.136039897799492,0.890882790088654,0.283493489027023,-0.244664579629898,0.92723822593689,0.150525629520416,-0.150512516498566,0.97708135843277,-1.68432606528768e-07,-0.255792617797852,0.966731607913971,-0.252576291561127,-0.413102209568024,0.874958097934723,-0.401145249605179,-0.318607687950134,0.858819842338562,-0.506382286548615,-0.379033535718918,0.774538934230804,-0.136050745844841,-0.341688245534897,0.929913699626923,-0.1505256742239,-0.150512561202049,0.977081298828125,-0.283493638038635,-0.244664296507835,0.92723822593689,-0.433383405208588,-0.136039718985558,0.890882670879364,-0.55131334066391,-0.220589712262154,0.804607748985291,-0.735037505626678,-0.335120588541031,0.589418292045593,-0.850125968456268,-0.24658390879631,0.465276479721069,-0.901776790618896,-0.291182726621628,0.319391936063766,-0.652420997619629,-0.284846723079681,0.702288568019867,-0.6898153424263,-0.114337436854839,0.714899778366089,-0.779523313045502,-0.190271526575089,0.596774816513062,-0.882014036178589,-0.0890788659453392,0.462726920843124,-0.936351954936981,-0.159197449684143,0.312891721725464,-0.965831696987152,-0.258925020694733,0.0112672680988908,-0.971270203590393,-0.190217316150665,-0.143008440732956,-0.921560168266296,-0.260171085596085,-0.288162678480148,-0.964442551136017,-0.211030304431915,0.159112647175789,-0.986496925354004,-0.0670789405703545,0.149413287639618,-0.991197526454926,-0.132387891411781,0.00105224153958261,-0.987142980098724,-0.0518803894519806,-0.151185795664787,-0.948168694972992,-0.127064883708954,-0.291257083415985,-0.770914137363434,-0.311021715402603,-0.555838763713837,-0.685714304447174,-0.270430445671082,-0.675768613815308, +-0.530408918857574,-0.376157104969025,-0.759718477725983,-0.877666711807251,-0.211403414607048,-0.430127620697021,-0.900208592414856,-0.061172716319561,-0.431140661239624,-0.811276495456696,-0.163577705621719,-0.561313331127167,-0.719566762447357,-0.0997717902064323,-0.687218487262726,-0.573741674423218,-0.219586417078972,-0.789051592350006,-0.257260084152222,-0.418135046958923,-0.871194779872894,-0.135421112179756,-0.355526715517044,-0.924803733825684,7.60234630803325e-09,-0.432804107666016,-0.901487946510315,-0.411131799221039,-0.325428396463394,-0.851508677005768,-0.442847937345505,-0.145865201950073,-0.884651958942413,-0.284912765026093,-0.262463063001633,-0.921920776367188,-0.149388268589973,-0.175954774022102,-0.972996950149536,-1.11980069661399e-08,-0.279319494962692,-0.960198163986206,0.257259964942932,-0.418134540319443,-0.871195018291473,0.411131709814072,-0.325428307056427,-0.851508796215057,0.530409157276154,-0.37615704536438,-0.759718418121338,0.135421395301819,-0.35552653670311,-0.924803733825684,0.1493881046772,-0.175955146551132,-0.972996890544891,0.284913122653961,-0.262463599443436,-0.921920478343964,0.442848056554794,-0.145865604281425,-0.884651780128479,0.573741436004639,-0.219586104154587,-0.78905177116394,0.770914077758789,-0.311022639274597,-0.555838406085968,0.877666711807251,-0.211403995752335,-0.430127531290054,0.921560108661652,-0.260171324014664,-0.288162738084793,0.685714483261108,-0.270429939031601,-0.675768673419952,0.719566941261292,-0.0997715070843697,-0.687218308448792,0.811276614665985,-0.16357658803463,-0.561313629150391,0.900208532810211,-0.0611722879111767,-0.431140959262848,0.948168694972992,-0.127065300941467,-0.291257083415985,0.965831696987152,-0.258925259113312,0.0112672932446003,0.964442431926727,-0.211030825972557,0.159112766385078,0.901776790618896,-0.291182607412338,0.319392055273056,0.971270442008972,-0.190216585993767,-0.143008500337601,0.987143039703369,-0.051879595965147,-0.151185721158981,0.991197466850281,-0.132387414574623,0.00105256668757647,0.986496865749359,-0.0670784413814545,0.149413242936134, +0.936351954936981,-0.159197732806206,0.312891453504562,0.735037684440613,-0.335120797157288,0.589418172836304,0.652420818805695,-0.284847140312195,0.702288568019867,0.850126028060913,-0.246583849191666,0.465276509523392,0.882014155387878,-0.0890791490674019,0.462726712226868,0.779523313045502,-0.190271407365799,0.596774816513062,0.68981546163559,-0.114337421953678,0.714899837970734,0.692726016044617,0.18143093585968,0.698006749153137,0.789775788784027,0.198988124728203,0.580222249031067,0.670721590518951,0.251763850450516,0.69767290353775,0.557791233062744,0.230778232216835,0.79725182056427,0.881936132907867,0.159904286265373,0.443417727947235,0.9407679438591,0.172827824950218,0.291695207357407,0.86591237783432,0.222836703062057,0.447816371917725,0.917115926742554,0.267441362142563,0.29559001326561,0.762093544006348,0.286258161067963,0.580749213695526,0.529383063316345,0.306547969579697,0.791063725948334,0.980836987495422,0.14436300098896,0.130836114287376,0.98685759305954,0.159769728779793,-0.0241996105760336,0.970346093177795,0.202205970883369,0.132443577051163,0.975396871566772,0.14109979569912,-0.169386297464371,0.935310542583466,0.163067534565926,-0.314011335372925,0.96535187959671,0.195449724793434,-0.172902584075928,0.915041506290436,0.251357555389404,-0.31546539068222,0.966840803623199,0.254484981298447,-0.0213607270270586,0.883429706096649,0.151906952261925,-0.443256348371506,0.798846304416656,0.181813016533852,-0.573400914669037,0.868277430534363,0.204900860786438,-0.451785385608673,0.706993162631989,0.16652250289917,-0.687336087226868,0.578382611274719,0.196126133203506,-0.791838467121124,0.689756512641907,0.224071308970451,-0.688496947288513,0.561882078647614,0.270301252603531,-0.781809329986572,0.775542020797729,0.260440200567245,-0.575070023536682,0.445920795202255,0.16341145336628,-0.880029141902924,0.302646368741989,0.188095241785049,-0.934358298778534,0.439661175012589,0.228774800896645,-0.868538975715637,0.154854610562325,0.149321153759956,-0.976587533950806,-1.49645941860399e-07,0.178911030292511,-0.983865261077881, +0.155590012669563,0.217902556061745,-0.963488578796387,4.26488133697944e-09,0.2579026222229,-0.966170907020569,0.299366772174835,0.26491117477417,-0.916625142097473,-0.154854446649551,0.149321287870407,-0.976587533950806,-0.302646368741989,0.188095480203629,-0.934358298778534,-0.155590415000916,0.21790224313736,-0.963488519191742,-0.445920675992966,0.163411393761635,-0.880029201507568,-0.578382551670074,0.196126267313957,-0.791838407516479,-0.439660876989365,0.228774577379227,-0.868539273738861,-0.56188178062439,0.270301699638367,-0.781809270381927,-0.299366503953934,0.264910846948624,-0.916625320911407,-0.706993162631989,0.166522860527039,-0.687336027622223,-0.798846304416656,0.181813225150108,-0.573400795459747,-0.689756155014038,0.224071219563484,-0.688497364521027,-0.883429765701294,0.151907280087471,-0.443255931138992,-0.935310661792755,0.163067281246185,-0.314011216163635,-0.868277430534363,0.204900845885277,-0.451785385608673,0.483480393886566,0.872361302375793,-0.0723349750041962,0.392306357622147,0.918493449687958,-0.0496555604040623,0.401975780725479,0.913516461849213,0.062474999576807,0.49205157160759,0.865901589393616,0.0899981111288071,-0.401976019144058,0.913516402244568,0.0624749734997749,-0.392306685447693,0.918493270874023,-0.0496558584272861,-0.483480393886566,0.872361302375793,-0.0723352581262589,-0.492052346467972,0.865901172161102,0.0899990350008011,0.409402042627335,0.893181383609772,0.186056360602379,0.37033686041832,0.857011616230011,0.358303844928741,0.391758471727371,0.815727055072784,0.425575643777847,0.468407362699509,0.845390617847443,0.256727755069733,-0.370337545871735,0.857012093067169,0.358302026987076,-0.409402191638947,0.893181204795837,0.186056807637215,-0.468407511711121,0.845390796661377,0.256726741790771,-0.391758441925049,0.815726637840271,0.425576508045197,0.209797710180283,0.824962198734283,0.52480685710907,0.0508594922721386,0.819132447242737,0.571345388889313,0.0688500925898552,0.794387102127075,0.60349702835083,0.233731508255005,0.795473694801331,0.559098482131958,-0.0508597418665886,0.819131970405579,0.571345865726471, +-0.209798112511635,0.824962615966797,0.524806082248688,-0.2337317019701,0.795473754405975,0.559098243713379,-0.0688503980636597,0.794387459754944,0.603496611118317,-0.372658491134644,0.909675538539886,-0.183346569538116,-0.308640897274017,0.88981020450592,-0.336122930049896,-0.350492060184479,0.843670904636383,-0.406662911176682,-0.439090311527252,0.863382279872894,-0.248537108302116,0.30864143371582,0.889809727668762,-0.336124002933502,0.372658461332321,0.909675538539886,-0.183346956968307,0.439090222120285,0.863382399082184,-0.248537138104439,0.350492030382156,0.84367036819458,-0.406663835048676,-0.159112200140953,0.872519373893738,-0.461945027112961,-0.0322091840207577,0.871561110019684,-0.489227712154388,-0.0585560128092766,0.831806600093842,-0.551968276500702,-0.203924059867859,0.830367207527161,-0.518560707569122,0.0322091206908226,0.871561348438263,-0.489227324724197,0.159111738204956,0.872519910335541,-0.461944222450256,0.203923970460892,0.830366849899292,-0.518561363220215,0.0585557967424393,0.831806302070618,-0.551968634128571,0.100424014031887,0.652691900730133,0.750938355922699,0.30873966217041,0.668089032173157,0.67700582742691,0.257575213909149,0.767895102500916,0.586508393287659,0.0818495377898216,0.764033257961273,0.639963924884796,-0.308739602565765,0.668088912963867,0.67700582742691,-0.100424386560917,0.652691841125488,0.750938415527344,-0.0818497687578201,0.764033377170563,0.639963746070862,-0.257574886083603,0.767895460128784,0.586508214473724,0.119180582463741,0.386849582195282,0.914408683776855,0.371418625116348,0.397568255662918,0.839039742946625,0.352631360292435,0.513976395130157,0.781971454620361,0.114351101219654,0.488302499055862,0.865149974822998,-0.371418833732605,0.397568047046661,0.839039742946625,-0.119180485606194,0.386849611997604,0.9144087433815,-0.114350907504559,0.488302439451218,0.865150034427643,-0.352631241083145,0.513976275920868,0.781971633434296,0.512214362621307,0.675345063209534,0.530608534812927,0.658781766891479,0.667971074581146,0.346151888370514,0.56056946516037,0.768185079097748,0.309279143810272, +0.433574855327606,0.769796431064606,0.468429505825043,-0.658781588077545,0.667971551418304,0.346151292324066,-0.512214541435242,0.675345301628113,0.530608177185059,-0.433574497699738,0.769797086715698,0.468429028987885,-0.560569405555725,0.768184959888458,0.309279501438141,0.631401538848877,0.769227266311646,-0.0980890393257141,0.629692912101746,0.768581569194794,0.113001279532909,0.744075238704681,0.656804382801056,0.122311346232891,0.753799557685852,0.646326959133148,-0.118523120880127,-0.629692316055298,0.768581867218018,0.113002113997936,-0.631401240825653,0.769227623939514,-0.0980890393257141,-0.753799617290497,0.646326720714569,-0.118523575365543,-0.744075238704681,0.656804323196411,0.122311420738697,0.67563533782959,0.641785502433777,-0.362806051969528,0.523262202739716,0.642634391784668,-0.559658765792847,0.428637117147446,0.760737299919128,-0.487389832735062,0.558749496936798,0.766601145267487,-0.316420257091522,-0.523262023925781,0.64263391494751,-0.559659123420715,-0.675635874271393,0.641785025596619,-0.36280569434166,-0.558749735355377,0.766601264476776,-0.316419631242752,-0.42863667011261,0.760737478733063,-0.487390071153641,0.323674023151398,0.644549489021301,-0.69266951084137,0.1108263656497,0.64983719587326,-0.751950144767761,0.0840036645531654,0.760176181793213,-0.644263625144958,0.258876025676727,0.756877779960632,-0.600099325180054,-0.110826276242733,0.649836480617523,-0.751950800418854,-0.32367417216301,0.644549012184143,-0.692669868469238,-0.25887593626976,0.75687837600708,-0.600098609924316,-0.0840034708380699,0.760176241397858,-0.644263446331024,0.619119048118591,0.416689276695251,0.665628612041473,0.794781744480133,0.432309985160828,0.425946027040482,0.729765653610229,0.566252708435059,0.383144617080688,0.57894492149353,0.545571982860565,0.605948865413666,-0.794781684875488,0.432309955358505,0.425946354866028,-0.61911940574646,0.416689366102219,0.665628492832184,-0.578945100307465,0.545572102069855,0.605948626995087,-0.729765713214874,0.566252470016479,0.383144944906235,0.89140385389328,0.433296769857407,0.132865071296692, +0.89356791973114,0.420852303504944,-0.156267940998077,0.820878148078918,0.554836690425873,-0.135333895683289,0.812862932682037,0.568662405014038,0.126003295183182,-0.893567979335785,0.420852065086365,-0.156268090009689,-0.891403794288635,0.433296859264374,0.132864743471146,-0.812863171100616,0.568662285804749,0.126002714037895,-0.820878386497498,0.554836452007294,-0.135333999991417,0.80733859539032,0.402873039245605,-0.431158423423767,0.642719328403473,0.386936157941818,-0.661205172538757,0.595680773258209,0.514857590198517,-0.616511106491089,0.747413992881775,0.534117758274078,-0.395082771778107,-0.642719507217407,0.386935651302338,-0.661205351352692,-0.807339072227478,0.40287247300148,-0.431158274412155,-0.74741393327713,0.534118711948395,-0.395081698894501,-0.595680415630341,0.514857709407806,-0.616511523723602,0.414937824010849,0.376142054796219,-0.828458666801453,0.149433702230453,0.369028002023697,-0.9173264503479,0.13554085791111,0.502441346645355,-0.853921234607697,0.381026953458786,0.504226803779602,-0.774966955184937,-0.149433940649033,0.369027704000473,-0.9173264503479,-0.414937853813171,0.376141875982285,-0.828458726406097,-0.381027013063431,0.504226744174957,-0.774966955184937,-0.13554048538208,0.502441883087158,-0.853920876979828,0.0805291458964348,-0.70855051279068,0.70104992389679,0.261270493268967,-0.690084636211395,0.674923062324524,0.323395818471909,-0.554605007171631,0.7666996717453,0.103620879352093,-0.581801295280457,0.806703090667725,-0.261270612478256,-0.690084755420685,0.674922823905945,-0.0805292651057243,-0.708550631999969,0.701049864292145,-0.103620909154415,-0.581801235675812,0.806703209877014,-0.323395967483521,-0.554604768753052,0.76669979095459,0.462213575839996,-0.666817784309387,0.584561944007874,0.639552414417267,-0.651062488555908,0.408766895532608,0.76359760761261,-0.455277472734451,0.457865834236145,0.557176351547241,-0.50878894329071,0.656268537044525,-0.639552593231201,-0.651062428951263,0.408766746520996,-0.462213397026062,-0.666817843914032,0.584562003612518,-0.557176232337952,-0.508788883686066,0.656268715858459, +-0.763597667217255,-0.455277502536774,0.457865715026855,0.7459357380867,-0.64905309677124,0.14936526119709,0.745169579982758,-0.657821476459503,-0.109513230621815,0.902716100215912,-0.410123556852341,-0.130008801817894,0.893490493297577,-0.416086256504059,0.168958261609077,-0.745169699192047,-0.657821416854858,-0.109513245522976,-0.745935499668121,-0.649053275585175,0.149365305900574,-0.893490195274353,-0.416086763143539,0.1689582914114,-0.902715623378754,-0.41012442111969,-0.13000875711441,0.652296125888824,-0.672631025314331,-0.349395543336868,0.489988088607788,-0.690499722957611,-0.532092034816742,0.592119514942169,-0.510543882846832,-0.623489677906036,0.792990982532501,-0.447636038064957,-0.413263946771622,-0.489987999200821,-0.69049996137619,-0.532091677188873,-0.652296364307404,-0.672630846500397,-0.349395602941513,-0.792990982532501,-0.447636336088181,-0.413263976573944,-0.59211939573288,-0.510543704032898,-0.623490035533905,0.281811773777008,-0.713009893894196,-0.642027139663696,0.0892687514424324,-0.730029761791229,-0.677560031414032,0.109942957758904,-0.587184488773346,-0.801951885223389,0.342291712760925,-0.562503635883331,-0.752612829208374,-0.089268684387207,-0.730029702186584,-0.677560031414032,-0.281811654567719,-0.713010191917419,-0.642026960849762,-0.34229189157486,-0.562503099441528,-0.752613186836243,-0.109943054616451,-0.587184429168701,-0.801951885223389,0.126524925231934,-0.423848509788513,0.896852135658264,0.379354208707809,-0.397693812847137,0.835422039031982,0.4192134141922,-0.23357555270195,0.877326965332031,0.144124537706375,-0.252725660800934,0.956743359565735,-0.379354149103165,-0.397693783044815,0.835422098636627,-0.126524895429611,-0.423848688602448,0.896852076053619,-0.144124567508698,-0.25272536277771,0.956743478775024,-0.419213801622391,-0.233575493097305,0.877326726913452,-0.828112423419952,-0.312415152788162,0.465431660413742,-0.626974701881409,-0.357819139957428,0.692003071308136,-0.673383712768555,-0.205965772271156,0.710022747516632,-0.868234097957611,-0.17443785071373,0.464479178190231, +-0.957276463508606,-0.253459274768829,-0.139213427901268,-0.948077023029327,-0.272573411464691,0.163870885968208,-0.977386772632599,-0.14471535384655,0.154183879494667,-0.981184601783752,-0.125162899494171,-0.147006988525391,-0.661059498786926,-0.34485724568367,-0.666388690471649,-0.858428299427032,-0.280647307634354,-0.429345816373825,-0.891688168048859,-0.140582397580147,-0.4302659034729,-0.705600917339325,-0.19146429002285,-0.682252824306488,-0.127637609839439,-0.429014891386032,-0.894234180450439,-0.391437858343124,-0.400674819946289,-0.828393638134003,-0.428606748580933,-0.243746653199196,-0.869990706443787,-0.142830535769463,-0.27486252784729,-0.950815439224243,0.391437768936157,-0.400674492120743,-0.828393876552582,0.127637699246407,-0.429014593362808,-0.894234359264374,0.142830803990364,-0.274862825870514,-0.950815320014954,0.428606688976288,-0.24374683201313,-0.869990766048431,0.858428180217743,-0.280648082494736,-0.429345786571503,0.661059617996216,-0.344857692718506,-0.666388213634491,0.70560085773468,-0.191463470458984,-0.682253062725067,0.891688227653503,-0.140582323074341,-0.43026602268219,0.948077023029327,-0.272573292255402,0.163870945572853,0.957276344299316,-0.253459364175797,-0.139213308691978,0.981184661388397,-0.12516276538372,-0.147007063031197,0.977386772632599,-0.144715309143066,0.154183909296989,0.626974940299988,-0.357819080352783,0.692002952098846,0.828112363815308,-0.31241512298584,0.465431720018387,0.868234097957611,-0.174437627196312,0.464479237794876,0.67338353395462,-0.20596632361412,0.710022866725922,0.683573007583618,0.214516192674637,0.697646498680115,0.876196205615997,0.184747263789177,0.445138871669769,0.850149214267731,0.276427954435349,0.448144882917404,0.655231535434723,0.296361714601517,0.694867849349976,0.977700412273407,0.164301976561546,0.130792990326881,0.972106099128723,0.159224197268486,-0.172212734818459,0.952652037143707,0.251431882381439,-0.170985653996468,0.956227838993073,0.259925276041031,0.134414479136467,0.877293169498444,0.171223506331444,-0.448373883962631,0.699476838111877,0.191374182701111,-0.688555121421814, +0.677562713623047,0.266664981842041,-0.685418486595154,0.855117619037628,0.254590332508087,-0.451616704463959,0.443318098783493,0.19425006210804,-0.875063478946686,0.155305832624435,0.181670144200325,-0.971018075942993,0.155102148652077,0.260049939155579,-0.953056812286377,0.434260457754135,0.269302874803543,-0.859589338302612,-0.155306130647659,0.181670442223549,-0.971017956733704,-0.443318068981171,0.194250226020813,-0.875063419342041,-0.434260368347168,0.269302994012833,-0.859589338302612,-0.155102223157883,0.260049641132355,-0.953056991100311,-0.699476599693298,0.191374331712723,-0.688555300235748,-0.877293348312378,0.171223476529121,-0.448373526334763,-0.855117619037628,0.25459024310112,-0.451616704463959,-0.677562475204468,0.26666522026062,-0.685418784618378,-0.972106158733368,0.159224182367325,-0.172212973237038,-0.977700412273407,0.164302095770836,0.130793169140816,-0.956227838993073,0.259925246238708,0.134414538741112,-0.952651917934418,0.251432299613953,-0.170985668897629,-0.876196265220642,0.184747293591499,0.445138841867447,-0.683573305606842,0.214516311883926,0.697646200656891,-0.655231654644012,0.296361774206161,0.694867670536041,-0.850149035453796,0.27642822265625,0.448145061731339,-0.420411080121994,0.247148111462593,0.873024880886078,-0.141860678792,0.274207979440689,0.951149582862854,-0.127862110733986,0.334694415330887,0.933611810207367,-0.393116861581802,0.316741138696671,0.863211572170258,0.141860678792,0.274207919836044,0.951149582862854,0.420411378145218,0.247148409485817,0.873024642467499,0.393116891384125,0.316740989685059,0.863211631774902,0.127861946821213,0.334694355726242,0.933611750602722,0.0143906185403466,0.890810310840607,-0.45414736866951,0.00436167232692242,0.940635800361633,-0.339389503002167,0.0833281204104424,0.949990451335907,-0.30095586180687,0.126199096441269,0.901840686798096,-0.413227796554565,-0.00436209235340357,0.940635502338409,-0.339390307664871,-0.0143898855894804,0.890810489654541,-0.454147219657898,-0.126199811697006,0.901841044425964,-0.413226842880249,-0.0833275988698006,0.94999098777771,-0.300954461097717, +0.217148900032043,0.97453236579895,-0.0559735894203186,0.320853918790817,0.939517915248871,-0.119828395545483,0.277348458766937,0.924086213111877,-0.262949585914612,0.200865387916565,0.965959072113037,-0.16302202641964,-0.320852965116501,0.93951827287674,-0.119828261435032,-0.217150911688805,0.974532067775726,-0.0559701770544052,-0.200866281986237,0.965958416461945,-0.163025394082069,-0.277348190546036,0.924086451530457,-0.262948900461197,0.0093640424311161,0.999859094619751,-0.0139371454715729,0.0855414941906929,0.996138215065002,-0.0197770148515701,0.0733232647180557,0.990624845027924,-0.115265309810638,0.00487877987325191,0.991330504417419,-0.131300538778305,-0.0855414941906929,0.996138215065002,-0.0197777505964041,-0.00936403032392263,0.999859035015106,-0.0139364684000611,-0.00487934099510312,0.991330683231354,-0.131299942731857,-0.0733229890465736,0.990624725818634,-0.115267314016819,-0.21956767141819,0.975486874580383,0.0146812070161104,-0.2136040776968,0.976850211620331,-0.0116982962936163,-0.324103027582169,0.9455646276474,-0.0294057428836823,-0.331528425216675,0.942757725715637,0.0360103398561478,0.213603064417839,0.976850509643555,-0.0116971880197525,0.219567224383354,0.975486934185028,0.0146834691986442,0.331528902053833,0.942757487297058,0.0360117405653,0.324104100465775,0.945564329624176,-0.0294057130813599,-0.170363277196884,0.884033560752869,0.435271084308624,-0.0318752340972424,0.869370400905609,0.493131965398788,-0.0154636260122061,0.95133638381958,0.307766228914261,-0.106167688965797,0.956522405147552,0.271649152040482,0.031875416636467,0.86937028169632,0.4931321144104,0.170362502336502,0.884033203125,0.435272067785263,0.106166698038578,0.956522643566132,0.27164888381958,0.0154636632651091,0.95133638381958,0.307766079902649,-0.231207996606827,0.971853196620941,0.0452124401926994,-0.347292542457581,0.931415975093842,0.108868040144444,-0.325106114149094,0.911175787448883,0.253109902143478,-0.220969274640083,0.965692460536957,0.136421099305153,0.347292691469193,0.931415855884552,0.10886737704277,0.231207445263863,0.971853494644165,0.0452111847698689, +0.220966786146164,0.965693175792694,0.136419743299484,0.325107723474503,0.911174893379211,0.253111183643341,-0.0826278924942017,0.992332279682159,0.0919198095798492,-0.00912420079112053,0.994729578495026,0.102126128971577,-0.0101666264235973,0.999892890453339,0.0105307977646589,-0.0909555703401566,0.995739281177521,0.0151763567700982,0.00912511814385653,0.994729518890381,0.102126933634281,0.082627534866333,0.992332100868225,0.0919219702482224,0.0909564644098282,0.995739161968231,0.0151782082393765,0.0101666077971458,0.999892830848694,0.0105321668088436,-0.00979545153677464,0.999952077865601,-0.000105876293673646,-0.0852069556713104,0.99636048078537,-0.00233697728253901,-0.0880399122834206,0.996112108230591,0.00311769708059728,-0.0101368138566613,0.999948680400848,0.000149753570440225,0.0852078124880791,0.99636036157608,-0.00233832281082869,0.00979453139007092,0.999952018260956,-0.000107289306470193,0.0101331984624267,0.999948680400848,0.00014794674643781,0.0880432948470116,0.996111750602722,0.00311838858760893,-0.0715311095118523,-0.950117170810699,0.30357950925827,-0.0107533512637019,-0.945509850978851,0.325415700674057,-0.0227908100932837,-0.918463945388794,0.394847571849823,-0.105189189314842,-0.920974135398865,0.375155836343765,0.0107532292604446,-0.945509910583496,0.325415700674057,0.0715311616659164,-0.950117230415344,0.303579479455948,0.10518904030323,-0.920974254608154,0.375155597925186,0.0227907542139292,-0.918463945388794,0.394847691059113,-0.207778647542,-0.970561742782593,0.121811062097549,-0.160677433013916,-0.962114453315735,0.220269232988358,-0.212959453463554,-0.933754086494446,0.287665665149689,-0.275630325078964,-0.946366965770721,0.168575018644333,0.160677447915077,-0.96211439371109,0.220269307494164,0.207778692245483,-0.970561683177948,0.121811076998711,0.275630414485931,-0.946366906166077,0.1685751080513,0.212959378957748,-0.933754086494446,0.287665486335754,-0.229809701442719,-0.972898423671722,-0.0256164073944092,-0.224561095237732,-0.973694205284119,0.0386246033012867,-0.301104158163071,-0.952078878879547,0.0536839738488197, +-0.306698948144913,-0.950987100601196,-0.0394863784313202,0.224561035633087,-0.973694264888763,0.0386245958507061,0.229809641838074,-0.972898364067078,-0.0256163626909256,0.306698828935623,-0.950987100601196,-0.0394863486289978,0.301104098558426,-0.952078938484192,0.0536840036511421,-0.193006962537766,-0.963041365146637,-0.187882006168365,-0.22925578057766,-0.969331622123718,-0.0885336622595787,-0.302147150039673,-0.944428324699402,-0.129468590021133,-0.257717192173004,-0.932804942131042,-0.251906037330627,0.229255765676498,-0.969331502914429,-0.0885336473584175,0.19300702214241,-0.963041365146637,-0.187882110476494,0.257717311382294,-0.932805001735687,-0.251906156539917,0.30214712023735,-0.944428384304047,-0.129468739032745,-0.018022583797574,-0.94665789604187,-0.321735829114914,-0.0932888686656952,-0.952067077159882,-0.291316866874695,-0.139408767223358,-0.918153405189514,-0.370890229940414,-0.0355173721909523,-0.912471115589142,-0.407596498727798,0.093288853764534,-0.952067017555237,-0.291316866874695,0.0180226135998964,-0.946657836437225,-0.321735739707947,0.0355173349380493,-0.912471115589142,-0.407596588134766,0.139408782124519,-0.918153405189514,-0.370890200138092,-0.00741912284865975,-0.996569216251373,-0.0824294984340668,-0.00925397127866745,-0.994728267192841,-0.102126777172089,-0.00193495850544423,-0.978412926197052,-0.206650704145432,0.032284427434206,-0.983044683933258,-0.180501848459244,0.00925396382808685,-0.994728267192841,-0.102126769721508,0.00741911679506302,-0.996569275856018,-0.0824294984340668,-0.0322844050824642,-0.983044564723969,-0.18050192296505,0.00193495384883136,-0.978412806987762,-0.206650674343109,0.0154084404930472,-0.99986869096756,-0.00500191375613213,0.0146951647475362,-0.999412715435028,-0.0309532564133406,0.0918418988585472,-0.990816056728363,-0.0992396175861359,0.105322740972042,-0.993788659572601,-0.0359341166913509,-0.0146951684728265,-0.999412715435028,-0.0309532471001148,-0.0154084367677569,-0.999868750572205,-0.00500192167237401,-0.105322755873203,-0.993788599967957,-0.0359341539442539, +-0.0918419063091278,-0.990816056728363,-0.0992396175861359,0.0154458396136761,-0.99987119436264,0.00436604861170053,0.0144895687699318,-0.999894678592682,-0.000811392324976623,0.101681135594845,-0.99477481842041,-0.00916516035795212,0.100893378257751,-0.994739532470703,0.0177131798118353,-0.0144895659759641,-0.999894738197327,-0.000811395235359669,-0.0154458340257406,-0.999871134757996,0.00436604674905539,-0.100893378257751,-0.994739532470703,0.0177131593227386,-0.101681165397167,-0.99477481842041,-0.00916515477001667,0.0236954502761364,-0.998355090618134,0.0522083565592766,0.0202939510345459,-0.999641478061676,0.0174641385674477,0.100935466587543,-0.993075430393219,0.0601092204451561,0.0857737809419632,-0.98794412612915,0.128877237439156,-0.0202939491719007,-0.999641418457031,0.0174641367048025,-0.023695470765233,-0.998355090618134,0.0522083714604378,-0.0857738107442856,-0.987944006919861,0.128877282142639,-0.100935533642769,-0.993075549602509,0.0601092875003815,0.032429676502943,-0.97828221321106,0.204724609851837,-0.000498871493618935,-0.973152697086334,0.230159789323807,-0.00500156963244081,-0.99247419834137,0.122351795434952,0.00350894313305616,-0.994538843631744,0.104307748377323,0.000498898443765938,-0.973152756690979,0.230159714818001,-0.0324296578764915,-0.97828221321106,0.204724565148354,-0.00350899528712034,-0.994538903236389,0.104307807981968,0.00500159710645676,-0.99247419834137,0.122351795434952,0.000455617351690307,-0.999997854232788,-0.00200521200895309,-0.000121503493573982,-0.999993801116943,-0.00351444119587541,-0.00345274363644421,-0.999405205249786,-0.034311655908823,-0.0051467539742589,-0.99974125623703,-0.0221562907099724,0.000121504031994846,-0.999993801116943,-0.00351443863473833,-0.000455617788247764,-0.999997854232788,-0.00200520781800151,0.00514675304293633,-0.99974125623703,-0.0221562907099724,0.0034527478273958,-0.999405205249786,-0.034311655908823,0.000301982770906761,-0.999991118907928,0.00421400088816881,0.00367894605733454,-0.999977231025696,0.00565343024209142,0.0026582267601043,-0.999452233314514,0.0329885073006153, +-0.00165602960623801,-0.99917870759964,0.0404869206249714,-0.00367894978262484,-0.999977290630341,0.00565342884510756,-0.000301982334349304,-0.999991118907928,0.00421399995684624,0.00165603135246783,-0.99917870759964,0.0404869131743908,-0.00265822652727365,-0.999452233314514,0.0329884886741638,0.00144740124233067,-0.999998569488525,0.000872724282089621,0.000170008497661911,-1,0.000110520828457084,0.000102659985714126,-1,6.71320594847202e-05,0.000902145402505994,-0.999999582767487,5.76227575947996e-05,-0.000170007231645286,-0.999999940395355,0.000110519125883002,-0.00144740403629839,-0.99999862909317,0.000872728473041207,-0.000902146683074534,-0.999999642372131,5.7622844906291e-05,-0.000102658639661968,-1,6.71269226586446e-05,0.265970259904861,-0.894655466079712,0.358958810567856,0.335054636001587,-0.917193412780762,0.215625941753387,0.462587118148804,-0.83268404006958,0.304385423660278,0.355459958314896,-0.806926131248474,0.471718430519104,0.358464628458023,-0.931093871593475,0.0675824880599976,0.357735931873322,-0.932342052459717,-0.0525668039917946,0.500168144702911,-0.862541556358337,-0.0765112340450287,0.507451117038727,-0.855753719806671,0.100890219211578,0.349557548761368,-0.921315371990204,-0.170256733894348,0.306186258792877,-0.897953033447266,-0.316117763519287,0.383210778236389,-0.824901700019836,-0.415555864572525,0.463911950588226,-0.850973784923553,-0.246230110526085,0.179304465651512,-0.877210676670074,-0.445366382598877,0.0511117652058601,-0.875263214111328,-0.480938673019409,0.0697968453168869,-0.816515326499939,-0.573089063167572,0.227516919374466,-0.810526072978973,-0.539706885814667,-0.0511117801070213,-0.875263094902039,-0.480938762426376,-0.179304450750351,-0.877210676670074,-0.445366412401199,-0.22751672565937,-0.810526072978973,-0.539706885814667,-0.0697968527674675,-0.816515326499939,-0.573089003562927,-0.306186228990555,-0.897952914237976,-0.316117763519287,-0.349557429552078,-0.921315491199493,-0.17025651037693,-0.463911771774292,-0.850973844528198,-0.246230006217957,-0.383210957050323,-0.824901461601257,-0.415556073188782, +-0.357735872268677,-0.932342112064362,-0.0525667481124401,-0.358464449644089,-0.93109393119812,0.0675824135541916,-0.507451176643372,-0.855753719806671,0.100890129804611,-0.500168025493622,-0.862541615962982,-0.0765112265944481,-0.335054904222488,-0.917193293571472,0.215626120567322,-0.265970230102539,-0.894655466079712,0.358958750963211,-0.35546001791954,-0.806926131248474,0.471718639135361,-0.462586939334869,-0.83268415927887,0.304385364055634,-0.143386885523796,-0.881106197834015,0.450657367706299,-0.0371487848460674,-0.883833289146423,0.466324597597122,-0.0581458956003189,-0.810292065143585,0.583134412765503,-0.199969798326492,-0.800798356533051,0.564565420150757,0.0371488928794861,-0.883833169937134,0.466324865818024,0.143386974930763,-0.881105959415436,0.450657725334167,0.199969500303268,-0.800798535346985,0.564565181732178,0.0581459812819958,-0.810292303562164,0.583134233951569,-0.442074120044708,-0.0290438458323479,0.896508276462555,-0.15450356900692,-0.0366070903837681,0.987313866615295,-0.152883365750313,0.162320196628571,0.974822461605072,-0.439815253019333,0.149864301085472,0.885496079921722,-0.888934910297394,0.00181911047548056,0.458029866218567,-0.699652016162872,-0.0153766628354788,0.71431839466095,-0.698804199695587,0.138179063796997,0.701839804649353,-0.885714173316956,0.130411610007286,0.445536941289902,-0.987502336502075,0.02333571203053,-0.155867367982864,-0.989492058753967,0.0142922149971128,0.143879279494286,-0.98333865404129,0.123263619840145,0.133608147501945,-0.978638887405396,0.122675448656082,-0.164974465966225,-0.724407553672791,-0.00339888106100261,-0.689363539218903,-0.901223540306091,0.0201520528644323,-0.432885646820068,-0.889479160308838,0.129645690321922,-0.43819934129715,-0.71434086561203,0.133623257279396,-0.686922073364258,-0.15361849963665,-0.0655103325843811,-0.985956251621246,-0.450601875782013,-0.0393393374979496,-0.891857862472534,-0.449016630649567,0.12092038244009,-0.885303616523743,-0.154965281486511,0.104276910424232,-0.982401192188263,0.450602114200592,-0.0393394269049168,-0.891857743263245, +0.15361824631691,-0.0655104368925095,-0.985956251621246,0.154965296387672,0.104277238249779,-0.982401132583618,0.449016898870468,0.120920658111572,-0.885303258895874,0.901223540306091,0.0201529636979103,-0.432885676622391,0.724407851696014,-0.00339867174625397,-0.689363121986389,0.714340806007385,0.133623227477074,-0.686922192573547,0.889479160308838,0.129644885659218,-0.438199639320374,0.989492058753967,0.014292879961431,0.14387920498848,0.987502336502075,0.0233364850282669,-0.155867338180542,0.97863906621933,0.122675016522408,-0.164974227547646,0.983338832855225,0.123262226581573,0.133607909083366,0.699651777744293,-0.0153758451342583,0.714318513870239,0.888935029506683,0.00181893934495747,0.458029597997665,0.885714471340179,0.130410328507423,0.44553679227829,0.698804318904877,0.138178661465645,0.701839864253998,0.154503509402275,-0.0366067551076412,0.987313747406006,0.442074209451675,-0.0290436670184135,0.896508097648621,0.439815044403076,0.149864047765732,0.885496139526367,0.152883365750313,0.162320107221603,0.974822461605072 + } + NormalsW: *1954 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *4116 { + a: 0.603662490844727,0.471746325492859,0.654721975326538,0.511134684085846,0.391800045967102,0.957126080989838,0.450475931167603,0.918727219104767,0.173079043626785,0.916262745857239,0.231097638607025,0.955714702606201,0.795285522937775,0.513762056827545,0.847781538963318,0.476309597492218,0.357383191585541,0.926090240478516,0.38471508026123,0.883724451065063,0.239438235759735,0.88244616985321,0.266037672758102,0.925289034843445,0.311783790588379,0.91729211807251,0.312187522649765,0.871135950088501,0.764581501483917,0.488048672676086,0.789884388446808,0.44894152879715,0.662541627883911,0.446561127901077,0.686365485191345,0.486586630344391,0.726346373558044,0.440620958805084,0.725628614425659,0.479021519422531,0.406301319599152,0.833469331264496,0.312624931335449,0.82233852148056,0.218744561076164,0.831800580024719,0.432889103889465,0.692490100860596,0.313853979110718,0.689167022705078,0.194770500063896,0.690321743488312,0.495575666427612,0.865970611572266,0.128905713558197,0.862671077251434,0.565028786659241,0.42521059513092,0.888127386569977,0.431250214576721,0.643526434898376,0.401124119758606,0.810584604740143,0.404246956110001,0.727227032184601,0.393512070178986,0.553135275840759,0.701359629631042,0.0743464082479477,0.696936130523682,0.520628094673157,0.279326498508453,0.937948942184448,0.287127673625946,0.626277267932892,0.2836894094944,0.832210540771484,0.287538945674896,0.729262471199036,0.284629046916962,0.395775407552719,0.4907066822052,0.315692603588104,0.494619905948639,0.235697358846664,0.489256918430328,0.464129716157913,0.462952315807343,0.167924165725708,0.460267841815948,0.602974116802216,0.0684621930122375,0.863541603088379,0.0733332633972168,0.658981621265411,0.105464681982994,0.806190073490143,0.108216486871243,0.732430577278137,0.115148730576038,0.422785609960556,0.575747013092041,0.314890950918198,0.579620122909546,0.207110539078712,0.573798477649689,0.0981536507606506,0.553807497024536,0.921071350574493,0.160643845796585,0.828154563903809,0.181883484125137,0.731134414672852, +0.184478253126144,0.634279072284698,0.17825922369957,0.542221069335938,0.153561741113663,0.532034397125244,0.557851791381836,0.424430042505264,0.76776522397995,0.533054172992706,0.791671514511108,0.5339635014534,0.359181493520737,0.631005346775055,0.345934212207794,0.72822117805481,0.340332627296448,0.8251593708992,0.349563539028168,0.921638488769531,0.366428315639496,0.0927639827132225,0.787654280662537,0.201825529336929,0.765737056732178,0.313188314437866,0.759793519973755,0.725118339061737,0.506319880485535,0.701672196388245,0.507237076759338,0.74851393699646,0.508112609386444,0.692680060863495,0.527552723884583,0.756740510463715,0.52875018119812,0.724651694297791,0.531288325786591,0.27459716796875,0.972735941410065,0.348025918006897,0.973377108573914,0.311533093452454,0.946645021438599,0.28399783372879,0.948069155216217,0.339039325714111,0.948550999164581,0.311282098293304,0.97666347026825,0.316006362438202,0.46092763543129,0.259369820356369,0.453101754188538,0.372782289981842,0.454122602939606,0.218931913375854,0.423202663660049,0.413771361112595,0.424954473972321,0.81890594959259,0.0439301431179047,0.648677349090576,0.0407479107379913,0.784236669540405,0.0748926401138306,0.682165265083313,0.0729845017194748,0.733006715774536,0.0843331664800644,0.733560681343079,0.0546968802809715,0.701627492904663,0.0517404228448868,0.765582144260406,0.0529359839856625,0.692061066627502,0.0265553668141365,0.776083290576935,0.0281260870397091,0.364621162414551,0.404286503791809,0.268421232700348,0.403425812721252,0.352427899837494,0.430535912513733,0.280147135257721,0.429887533187866,0.316273331642151,0.4316146671772,0.734139680862427,0.0237303655594587,0.316561818122864,0.398898899555206,0.412590771913528,0.528352022171021,0.506103992462158,0.506904184818268,0.565400362014771,0.108759090304375,0.64300274848938,0.138990372419357,0.731848359107971,0.146294608712196,0.820904672145844,0.142316073179245,0.899582743644714,0.115006268024445,0.125194013118744,0.503445386886597,0.218157947063446,0.52657687664032,0.315348982810974,0.531087517738342, +0.314369320869446,0.634716868400574,0.198431953787804,0.63128662109375,0.0796250775456429,0.623391389846802,0.937299907207489,0.221831887960434,0.833775758743286,0.234497547149658,0.730166912078857,0.23624324798584,0.626695513725281,0.230626508593559,0.523717045783997,0.214100450277328,0.549239754676819,0.627758800983429,0.430357158184052,0.633389830589294,0.430307149887085,0.729357838630676,0.616568624973297,0.709704875946045,0.464816510677338,0.273081123828888,0.524527549743652,0.319003105163574,0.57410991191864,0.282384991645813,0.627779841423035,0.314437389373779,0.677856802940369,0.284154683351517,0.728750944137573,0.311991810798645,0.780649662017822,0.286076128482819,0.829559862613678,0.318209290504456,0.88439017534256,0.288185149431229,0.932569265365601,0.326630771160126,0.993955135345459,0.282972574234009,0.0107575953006744,0.704063296318054,0.0802320241928101,0.742130637168884,0.135050177574158,0.69246768951416,0.196659713983536,0.727228343486786,0.254299879074097,0.689278364181519,0.31353023648262,0.723519504070282,0.373394995927811,0.690364181995392,0.725353240966797,0.493752241134644,0.711808502674103,0.506580591201782,0.695725798606873,0.499593138694763,0.754741787910461,0.500696301460266,0.738409161567688,0.507077813148499,0.675620913505554,0.521743535995483,0.697474122047424,0.515480995178223,0.774004757404327,0.523582577705383,0.752400875091553,0.516507625579834,0.708800137042999,0.530374526977539,0.72489070892334,0.518498837947845,0.74052631855011,0.530967593193054,0.271283835172653,0.989600241184235,0.759877145290375,0.543020308017731,0.254899203777313,0.966498136520386,0.689012289047241,0.541695773601532,0.351061165332794,0.990294635295868,0.367823421955109,0.967486381530762,0.311645984649658,0.933351039886475,0.295859813690186,0.947110414505005,0.276837050914764,0.939430832862854,0.346344947814941,0.940039753913879,0.327195703983307,0.947384476661682,0.279486238956451,0.958022356033325,0.343382656574249,0.958581209182739,0.311411917209625,0.961044907569885,0.293136298656464,0.975788474082947,0.329439461231232, +0.976105093955994,0.724391579627991,0.545210897922516,0.311147660017014,0.993043065071106,0.286431550979614,0.459040462970734,0.315854072570801,0.477358877658844,0.274623215198517,0.493517756462097,0.247098013758659,0.470509588718414,0.34561213850975,0.459572970867157,0.384729951620102,0.471751928329468,0.356775611639023,0.49425995349884,0.236785382032394,0.441177368164063,0.199954122304916,0.478667348623276,0.19311361014843,0.440019845962524,0.39558807015419,0.442606538534164,0.439297288656235,0.442241936922073,0.431721925735474,0.480769991874695,0.830801844596863,0.0224764347076416,0.206362098455429,0.399502456188202,0.140108585357666,0.432613551616669,0.88657557964325,0.0472622513771057,0.841367363929749,0.0567535161972046,0.42676055431366,0.401479601860046,0.637591779232025,0.0188645422458649,0.625752329826355,0.0527227856218815,0.580930650234222,0.041548490524292,0.492480397224426,0.435810953378677,0.803642690181732,0.0618433281779289,0.836779534816742,0.0944203361868858,0.795635223388672,0.090943306684494,0.663260579109192,0.0592190138995647,0.670174717903137,0.0885979682207108,0.628929376602173,0.0905348062515259,0.759920597076416,0.0821556746959686,0.770787596702576,0.114132292568684,0.732720375061035,0.0996469631791115,0.706192970275879,0.0811513364315033,0.694138407707214,0.112699449062347,0.71532678604126,0.0534629076719284,0.733283579349518,0.0695244371891022,0.693273186683655,0.0602657906711102,0.751828014850616,0.0541452616453171,0.773612022399902,0.0617676600813866,0.696974754333496,0.0413862392306328,0.670643270015717,0.0320991352200508,0.770618677139282,0.0427629388868809,0.797278761863708,0.0344664379954338,0.369080722332001,0.385252714157104,0.688343405723572,0.0094456672668457,0.388949394226074,0.412410914897919,0.780437767505646,0.0111673474311829,0.264288693666458,0.384318023920059,0.243961662054062,0.411111205816269,0.358354270458221,0.420048117637634,0.36127907037735,0.440004706382751,0.2744100689888,0.419295817613602,0.271127581596375,0.439194977283478,0.316142320632935,0.44609346985817,0.336903929710388, +0.431241154670715,0.295653939247131,0.430871218442917,0.713236093521118,0.0240533351898193,0.733844518661499,0.0395199730992317,0.755016565322876,0.0248344112187624,0.340484410524368,0.400121510028839,0.316412806510925,0.415963113307953,0.292622923851013,0.399693667888641,0.316721767187119,0.380154222249985,0.734453439712524,0.00694537162780762,0.487164914608002,0.484673202037811,0.405120611190796,0.509090065956116,0.582119822502136,0.0879266858100891,0.649840712547302,0.122098878026009,0.732143878936768,0.130483984947205,0.814702868461609,0.125180810689926,0.883653700351715,0.0935635566711426,0.144514203071594,0.481560111045837,0.226001262664795,0.507461845874786,0.315529137849808,0.511993706226349,0.314123779535294,0.660628974437714,0.195759356021881,0.659361362457275,0.0749984607100487,0.658411860466003,0.939387500286102,0.253111213445663,0.833743691444397,0.260329157114029,0.729718744754791,0.260217279195786,0.625762104988098,0.25644126534462,0.520461916923523,0.245279997587204,0.553205013275146,0.662846922874451,0.432489454746246,0.661513209342957,0.628713369369507,0.49365159869194,0.644688129425049,0.529908061027527,0.402059078216553,0.980084359645844,0.421386420726776,0.940498828887939,0.577673077583313,0.493696570396423,0.47737255692482,0.945664644241333,0.220454931259155,0.978495001792908,0.804610967636108,0.532897293567657,0.821929335594177,0.497263312339783,0.872932314872742,0.499215692281723,0.145724952220917,0.942725479602814,0.20179408788681,0.938559949398041,0.376323699951172,0.93888247013092,0.371112674474716,0.906665325164795,0.419286251068115,0.898330926895142,0.246880725026131,0.937744796276093,0.20461693406105,0.89642608165741,0.252642691135406,0.905624747276306,0.335553765296936,0.919381141662598,0.311972379684448,0.89556360244751,0.348790049552917,0.874581217765808,0.287980437278748,0.918965458869934,0.275521665811539,0.873951375484467,0.781304597854614,0.498814523220062,0.77713930606842,0.469945400953293,0.820046663284302,0.45990526676178,0.66925173997879,0.496719986200333,0.631990849971771, +0.456389993429184,0.674493074417114,0.468026667833328,0.74575811624527,0.481537580490112,0.72596275806427,0.461143374443054,0.758506298065186,0.442894130945206,0.705419063568115,0.480783551931381,0.694123983383179,0.441690593957901,0.359764516353607,0.825490057468414,0.39621040225029,0.859779357910156,0.312401115894318,0.847302317619324,0.265406787395477,0.824700355529785,0.228362441062927,0.858298778533936,0.369243174791336,0.762166738510132,0.41603884100914,0.802860379219055,0.312874555587769,0.793235421180725,0.257112264633179,0.761125087738037,0.209574103355408,0.800987541675568,0.452106386423111,0.846290647983551,0.474363625049591,0.894184231758118,0.17271962761879,0.843778967857361,0.149619534611702,0.891280889511108,0.534256815910339,0.895491898059845,0.52620255947113,0.444639980792999,0.583193898200989,0.449750989675522,0.869057714939117,0.455094575881958,0.926200270652771,0.452117204666138,0.0897088050842285,0.891500294208527,0.603913068771362,0.410927325487137,0.652292966842651,0.424446284770966,0.849803864955902,0.415523707866669,0.80095249414444,0.427225172519684,0.685000777244568,0.395198553800583,0.726769268512726,0.417997062206268,0.769360661506653,0.39677557349205,0.47907093167305,0.776920735836029,0.515493929386139,0.83166891336441,0.147015914320946,0.773898541927338,0.109601132571697,0.827991127967834,0.586699783802032,0.815163910388947,0.482556462287903,0.369478702545166,0.547961831092834,0.39497047662735,0.972624897956848,0.378639608621597,0.0386949181556702,0.810158312320709,0.906312346458435,0.40166911482811,0.582597732543945,0.351785391569138,0.636375665664673,0.374993681907654,0.873314380645752,0.357219815254211,0.81870698928833,0.3784019947052,0.679702162742615,0.341674208641052,0.727710843086243,0.36763197183609,0.776655972003937,0.343486607074738,0.364404559135437,0.53100711107254,0.418186783790588,0.550468504428864,0.368867099285126,0.579017281532288,0.315134882926941,0.553769469261169,0.266300916671753,0.530117392539978,0.260937601327896,0.57804012298584,0.212141424417496,0.548583269119263, +0.459906458854675,0.520873546600342,0.520267069339752,0.530286908149719,0.476944327354431,0.568968534469604,0.170973777770996,0.518218636512756,0.153137683868408,0.566048085689545,0.110601663589478,0.526563405990601,0.552257120609283,0.485010653734207,0.531231045722961,0.0811627358198166,0.553075432777405,0.129708677530289,0.497594982385635,0.128133684396744,0.589611411094666,0.540584146976471,0.934759736061096,0.0887062847614288,0.0795024633407593,0.480627149343491,0.0409873127937317,0.53537905216217,0.966616868972778,0.136901438236237,0.911116123199463,0.136401891708374,0.602513074874878,0.127557530999184,0.638323068618774,0.157169491052628,0.587725877761841,0.169313758611679,0.861793398857117,0.13240447640419,0.875009655952454,0.174684152007103,0.824901700019836,0.160657346248627,0.686503529548645,0.144429445266724,0.731522083282471,0.163749352097511,0.682165384292603,0.182665780186653,0.777231156826019,0.14612552523613,0.780137181282043,0.184497267007828,0.426998764276505,0.604211688041687,0.372235953807831,0.634590983390808,0.314628720283508,0.607337653636932,0.25651603937149,0.63354229927063,0.202354729175568,0.602180242538452,0.139770090579987,0.627851128578186,0.0873883590102196,0.587379276752472,0.0159390568733215,0.618618488311768,0.992287397384644,0.207648873329163,0.93066930770874,0.19000968337059,0.884955763816833,0.230327308177948,0.831595778465271,0.20747184753418,0.782264888286591,0.236256211996078,0.730659246444702,0.209906578063965,0.678104758262634,0.234309077262878,0.629883885383606,0.203701168298721,0.575707197189331,0.224546238780022,0.531532287597656,0.182548373937607,0.469298034906387,0.197872340679169,0.613003313541412,0.624255239963531,0.542153358459473,0.591620564460754,0.489068925380707,0.631043672561646,0.492545306682587,0.69574236869812,0.546414375305176,0.746413052082062,0.611330091953278,0.514661014080048,0.440124869346619,0.966146528720856,0.182623386383057,0.963879883289337,0.838515400886536,0.518907725811005,0.397971868515015,0.920743405818939,0.225543424487114,0.919221639633179, +0.342175543308258,0.898373961448669,0.281722009181976,0.89784824848175,0.80089670419693,0.481080770492554,0.650336146354675,0.478266417980194,0.752007961273193,0.463582336902618,0.699844658374786,0.462607264518738,0.354533106088638,0.850746273994446,0.27019402384758,0.850035905838013,0.364839315414429,0.795997321605682,0.260897934436798,0.795027494430542,0.436866998672485,0.873867034912109,0.187465637922287,0.871640622615814,0.550871253013611,0.470935314893723,0.507039606571198,0.923162043094635,0.116444259881973,0.91967898607254,0.900566101074219,0.477472096681595,0.61693286895752,0.434496462345123,0.835912108421326,0.438589811325073,0.689123034477234,0.419182777404785,0.764344811439514,0.420588940382004,0.46669739484787,0.814102351665497,0.158710792660713,0.811314702033997,0.561867833137512,0.859232723712921,0.502279937267303,0.410606443881989,0.951377868652344,0.419001400470734,0.0627380311489105,0.854713976383209,0.592068791389465,0.383428394794464,0.862667441368103,0.388486683368683,0.681889057159424,0.36939001083374,0.773434698581696,0.371101319789886,0.36687833070755,0.553504347801208,0.263403475284576,0.552565097808838,0.46919772028923,0.543186783790588,0.161232247948647,0.54034411907196,0.572464883327484,0.510118126869202,0.513905763626099,0.102571427822113,0.95127272605896,0.110747583210468,0.0588056445121765,0.505284488201141,0.594503045082092,0.147087693214417,0.869067907333374,0.152220353484154,0.684238314628601,0.161969751119614,0.778839230537415,0.163738220930099,0.370682835578918,0.606801152229309,0.258596926927567,0.605786561965942,0.145520776510239,0.596167266368866,0.981844186782837,0.170506834983826,0.0258677005767822,0.57513701915741,0.880942940711975,0.201593428850174,0.781534552574158,0.209825441241264,0.679822325706482,0.207924082875252,0.580791115760803,0.19598251581192,0.603922307491302,0.580621540546417,0.481122255325317,0.161146432161331,0.483957082033157,0.599239945411682,0.488259375095367,0.735818028450012,0.606246829032898,0.762923300266266,0.469705253839493,0.321251899003983,0.576858520507813, +0.316698729991913,0.678409337997437,0.312476456165314,0.779039025306702,0.314357578754425,0.880360960960388,0.322372198104858,0.987269401550293,0.330926775932312,0.0200965702533722,0.757516384124756,0.138585716485977,0.732622385025024,0.254875004291534,0.724279284477234,0.372162699699402,0.725355386734009,0.709696054458618,0.49499100446701,0.740953207015991,0.495575249195099,0.684568464756012,0.508742392063141,0.765549302101135,0.510256052017212,0.71091639995575,0.51796281337738,0.738875269889832,0.518485426902771,0.249060869216919,0.985568106174469,0.779486656188965,0.53977644443512,0.669537723064423,0.537721216678619,0.373344898223877,0.986652493476868,0.293063521385193,0.93450254201889,0.33020555973053,0.934827566146851,0.264376163482666,0.950491070747375,0.358616352081299,0.951316952705383,0.295180648565292,0.960652112960815,0.327647060155869,0.960935831069946,0.741834163665771,0.544789016246796,0.291615635156631,0.991895437240601,0.706976771354675,0.544137418270111,0.330695897340775,0.99223530292511,0.280288457870483,0.475787758827209,0.35144367814064,0.476429283618927,0.217873901128769,0.458925545215607,0.414173901081085,0.46069860458374,0.858674764633179,0.0324531197547913,0.17395406961441,0.413866102695465,0.458936750888824,0.416435837745667,0.609365403652191,0.0277925133705139,0.820604920387268,0.0767995864152908,0.645751237869263,0.0735308974981308,0.765609800815582,0.097906805574894,0.699918985366821,0.0966788157820702,0.711790263652802,0.0669434517621994,0.754858374595642,0.0677485242486,0.680114984512329,0.0483241677284241,0.787207365036011,0.0503261648118496,0.397031426429749,0.391549229621887,0.663749217987061,0.0130646228790283,0.804879426956177,0.0157029032707214,0.236243277788162,0.390111863613129,0.377154022455215,0.428891956806183,0.255459576845169,0.427799552679062,0.34019336104393,0.444910109043121,0.292117834091187,0.444478303194046,0.715074777603149,0.0393461063504219,0.752607583999634,0.0400477573275566,0.337856203317642,0.416610896587372,0.294962584972382,0.416226744651794,0.342550724744797, +0.381733357906342,0.711708128452301,0.00748854875564575,0.290869623422623,0.381272882223129,0.757162570953369,0.00833827257156372,0.447293162345886,0.500598132610321,0.525021970272064,0.459788769483566,0.553772807121277,0.0600323602557182,0.614084541797638,0.108746841549873,0.689700841903687,0.1283840239048,0.77463573217392,0.129971772432327,0.850933194160461,0.113174498081207,0.913023710250854,0.0667482241988182,0.107177138328552,0.455960690975189,0.184000939130783,0.498196363449097,0.269987881183624,0.511082589626312,0.361078560352325,0.51190721988678,0.255033195018768,0.660073816776276,0.136072099208832,0.658571898937225,0.995493769645691,0.243433237075806,0.0107059478759766,0.659443974494934,0.885842978954315,0.258256107568741,0.781835794448853,0.260787487030029,0.677616715431213,0.258839339017868,0.573776721954346,0.252422451972961,0.617457211017609,0.665136873722076,0.464756608009338,0.233512043952942,0.492168545722961,0.661834120750427,0.373214423656464,0.661147356033325,0.604829668998718,0.493125051259995,0.634712398052216,0.512433469295502,0.41398698091507,0.961030304431915,0.447951972484589,0.942585051059723,0.208846598863602,0.959226250648499,0.815232634544373,0.515807807445526,0.845816135406494,0.497629731893539,0.175195693969727,0.940171837806702,0.397084891796112,0.939355790615082,0.375834137201309,0.922982931137085,0.393815010786057,0.901974439620972,0.423252880573273,0.919236838817596,0.247641235589981,0.921855390071869,0.226113110780716,0.937849760055542,0.200290381908417,0.917261958122253,0.230022788047791,0.90052855014801,0.351691722869873,0.912510395050049,0.325440257787704,0.907654881477356,0.32888126373291,0.884305655956268,0.361977964639664,0.890323758125305,0.298295527696609,0.907418608665466,0.271961897611618,0.911812603473663,0.262059688568115,0.889451444149017,0.295261710882187,0.884016215801239,0.80003547668457,0.497868895530701,0.781019806861877,0.48449981212616,0.797419190406799,0.464516848325729,0.823490619659424,0.478112697601318,0.670071423053741,0.4824258685112,0.650569319725037,0.495075017213821, +0.627869009971619,0.474455982446671,0.654430210590363,0.461843997240067,0.759895920753479,0.475745230913162,0.737360000610352,0.471215695142746,0.740780353546143,0.451887011528015,0.769584596157074,0.456022918224335,0.714197158813477,0.470782727003098,0.691507577896118,0.47446683049202,0.682562828063965,0.454396188259125,0.711501479148865,0.451339691877365,0.334887087345123,0.836119830608368,0.379339128732681,0.842155575752258,0.371325373649597,0.866637051105499,0.332064241170883,0.860181510448456,0.245537459850311,0.841002702713013,0.290108114480972,0.835757434368134,0.292504280805588,0.859848201274872,0.253124237060547,0.865610480308533,0.34016939997673,0.777799248695374,0.393918722867966,0.782250165939331,0.386873573064804,0.814477682113647,0.337598979473114,0.809233009815216,0.232075244188309,0.780758261680603,0.285882264375687,0.777283728122711,0.287876605987549,0.808794260025024,0.238517254590988,0.813151717185974,0.423190146684647,0.853126049041748,0.465459287166595,0.869601488113403,0.446339279413223,0.89570426940918,0.409866988658905,0.878479421138763,0.158953756093979,0.866852343082428,0.20150762796402,0.851146459579468,0.214380115270615,0.876745820045471,0.177613019943237,0.893309473991394,0.578428268432617,0.471119701862335,0.477988481521606,0.920071423053741,0.503307580947876,0.894375026226044,0.556178331375122,0.447558999061584,0.145547121763229,0.91711151599884,0.873021423816681,0.476626455783844,0.896136403083801,0.453913807868958,0.12067598849535,0.890946388244629,0.591968715190887,0.42990118265152,0.628793239593506,0.417486131191254,0.640457689762115,0.439897447824478,0.608219683170319,0.452385574579239,0.824695825576782,0.421148121356964,0.86103081703186,0.434930711984634,0.843950867652893,0.456792056560516,0.812201976776123,0.443107843399048,0.66715669631958,0.409689545631409,0.706924617290497,0.406138479709625,0.708990514278412,0.429641425609589,0.674240350723267,0.432542711496353,0.747043311595917,0.406888455152512,0.786650657653809,0.411923259496689,0.778717875480652,0.434495687484741,0.744100451469421, +0.430297702550888,0.446953773498535,0.790387392044067,0.499167799949646,0.803249061107635,0.483072847127914,0.839112997055054,0.435552090406418,0.824102282524109,0.126438871026039,0.799862563610077,0.178886413574219,0.787954449653625,0.189672201871872,0.821886658668518,0.14188551902771,0.836032748222351,0.549617171287537,0.824143886566162,0.516584157943726,0.383686363697052,0.535292267799377,0.418959558010101,0.527201235294342,0.862783551216125,0.938089847564697,0.391565591096878,0.0756156072020531,0.819832921028137,0.0973404198884964,0.858904182910919,0.918076515197754,0.426114916801453,0.563822865486145,0.372585356235504,0.610109150409698,0.364205628633499,0.618617475032806,0.392626494169235,0.577046811580658,0.403755992650986,0.845358073711395,0.36860316991806,0.891298890113831,0.378706932067871,0.876919388771057,0.409361481666565,0.835793733596802,0.396686166524887,0.657008051872253,0.357959270477295,0.704334497451782,0.354405164718628,0.705374121665955,0.381035268306732,0.661376953125,0.385033398866653,0.751565098762512,0.355288088321686,0.798725485801697,0.360608398914337,0.793347835540771,0.387500405311584,0.749530911445618,0.381860733032227,0.340533882379532,0.542117774486542,0.390730798244476,0.540881276130676,0.394257605075836,0.564723193645477,0.341481924057007,0.56641286611557,0.239787966012955,0.539507269859314,0.289959728717804,0.541659533977509,0.288553863763809,0.565933525562286,0.235819816589355,0.563284814357758,0.440292179584503,0.536007583141327,0.489295482635498,0.525899231433868,0.499624907970428,0.550188779830933,0.446846485137939,0.559668183326721,0.141559094190598,0.522729158401489,0.190270870923996,0.533699333667755,0.183333694934845,0.557269096374512,0.130762949585915,0.546815574169159,0.538003444671631,0.50847190618515,0.540487110614777,0.106165483593941,0.526558041572571,0.128903165459633,0.553580284118652,0.534786939620972,0.924575626850128,0.113345623016357,0.0933162719011307,0.504390060901642,0.0771505534648895,0.530344128608704,0.937645196914673,0.136587977409363,0.578116059303284, +0.129233866930008,0.618988156318665,0.143277004361153,0.61348694562912,0.163205474615097,0.569121837615967,0.150509908795357,0.84474241733551,0.147497221827507,0.886110723018646,0.134991481900215,0.894303441047668,0.156588792800903,0.849494874477386,0.167617335915565,0.662619888782501,0.150933012366295,0.708388686180115,0.154109686613083,0.707196652889252,0.172933429479599,0.659577012062073,0.169982254505157,0.75499951839447,0.154981046915054,0.800854921340942,0.153517186641693,0.803183794021606,0.172666847705841,0.755487143993378,0.173836171627045,0.342271715402603,0.593351066112518,0.39734297990799,0.591568171977997,0.400103688240051,0.620063602924347,0.342986762523651,0.621224403381348,0.232235282659531,0.590074419975281,0.287255644798279,0.59285306930542,0.286012828350067,0.620708286762238,0.228932648897171,0.618514001369476,0.121088303625584,0.57586145401001,0.177024140954018,0.584621012210846,0.171432837843895,0.614657282829285,0.113054826855659,0.608960509300232,0.950123190879822,0.164869487285614,0.0631365478038788,0.562917411327362,0.0522410273551941,0.601263284683228,0.960675656795502,0.197976842522621,0.854068636894226,0.191619321703911,0.902050614356995,0.182249188423157,0.908731341362,0.211718544363976,0.858097195625305,0.218968644738197,0.755945563316345,0.197031170129776,0.805521488189697,0.195910304784775,0.807574152946472,0.222383931279182,0.756268203258514,0.223447397351265,0.656372129917145,0.193122178316116,0.70587170124054,0.196095079183578,0.70456200838089,0.222480818629265,0.653331458568573,0.219500601291656,0.560421109199524,0.175862893462181,0.608019292354584,0.187019765377045,0.602971494197845,0.214199423789978,0.552643716335297,0.205061927437782,0.566866278648376,0.567668914794922,0.513031661510468,0.156698644161224,0.501249253749847,0.18938846886158,0.577034413814545,0.606194078922272,0.452701151371002,0.587098777294159,0.508733689785004,0.57942259311676,0.516119599342346,0.612673223018646,0.457681059837341,0.617253065109253,0.461490988731384,0.7125244140625,0.520722210407257,0.718757510185242, +0.512325048446655,0.762199938297272,0.455991744995117,0.752180814743042,0.580942571163177,0.729480028152466,0.49473574757576,0.298019170761108,0.50249457359314,0.342294991016388,0.568463981151581,0.778719186782837,0.548780143260956,0.299069881439209,0.601131737232208,0.299030721187592,0.604255676269531,0.332285970449448,0.554124414920807,0.33678725361824,0.652510821819305,0.298373341560364,0.70356273651123,0.297841161489487,0.703745484352112,0.326259434223175,0.654058039188385,0.328544616699219,0.754450380802155,0.29879242181778,0.80544650554657,0.301232129335403,0.802772760391235,0.331324577331543,0.753205597400665,0.327184021472931,0.856765151023865,0.303809285163879,0.909078598022461,0.305805087089539,0.902328431606293,0.343296319246292,0.852400481700897,0.336924582719803,0.963124632835388,0.306774914264679,0.0460169687867165,0.724535346031189,0.0575914308428764,0.774034738540649,0.953716516494751,0.350729703903198,0.106438107788563,0.714953184127808,0.165790721774101,0.709825694561005,0.170551016926765,0.749580264091492,0.114031553268433,0.758560001850128,0.224835813045502,0.707034945487976,0.284029603004456,0.705780863761902,0.284519881010056,0.74189829826355,0.227252200245857,0.744373381137848,0.343360126018524,0.706324100494385,0.402517676353455,0.708655118942261,0.399405419826508,0.745949387550354,0.342192083597183,0.742432415485382,0.716544568538666,0.487059593200684,0.718023538589478,0.500324368476868,0.704754531383514,0.502070844173431,0.699355483055115,0.490546345710754,0.732432246208191,0.500593662261963,0.734405875205994,0.487393438816071,0.751452565193176,0.491520166397095,0.745626747608185,0.502834856510162,0.687602996826172,0.518537998199463,0.671226620674133,0.509897172451019,0.6840860247612,0.498108804225922,0.694855093955994,0.507831752300262,0.778838753700256,0.511908650398254,0.762150764465332,0.519931495189667,0.755303978919983,0.508961617946625,0.766428828239441,0.499648004770279,0.717337071895599,0.524562656879425,0.702453315258026,0.522947072982788,0.705485820770264,0.511854290962219,0.718225538730621, +0.51231837272644,0.747146129608154,0.523782432079315,0.732212543487549,0.524840772151947,0.731782197952271,0.512571811676025,0.744530379772186,0.512584090232849,0.262457817792892,0.978693544864655,0.76750123500824,0.533874750137329,0.788227736949921,0.527683138847351,0.238965168595314,0.971707224845886,0.681735336780548,0.532271564006805,0.360064506530762,0.979545474052429,0.383667260408401,0.972973942756653,0.661254644393921,0.52530974149704,0.280933231115341,0.929519355297089,0.301085650920868,0.926182627677917,0.303035050630569,0.940232813358307,0.287410408258438,0.942122101783752,0.322327196598053,0.926368236541748,0.342418491840363,0.9300577044487,0.335727959871292,0.942545056343079,0.320138335227966,0.940382421016693,0.268295764923096,0.962054491043091,0.249430179595947,0.952767670154572,0.263547956943512,0.938190460205078,0.276094883680344,0.948957085609436,0.373521000146866,0.95385617017746,0.354503631591797,0.962808728218079,0.34692570567131,0.949577271938324,0.359652429819107,0.939033508300781,0.288637399673462,0.95342218875885,0.303545266389847,0.953684449195862,0.302776157855988,0.968592166900635,0.285571157932281,0.966929972171783,0.319400787353516,0.953823029994965,0.334310352802277,0.95382171869278,0.337150156497955,0.967380523681641,0.319920390844345,0.968741834163666,0.732855916023254,0.538079082965851,0.749770045280457,0.536930024623871,0.282617717981339,0.982589542865753,0.301784127950668,0.984418332576752,0.699340045452118,0.535987436771393,0.716199636459351,0.537767767906189,0.320651143789291,0.984582662582397,0.33984449505806,0.983088195323944,0.267841368913651,0.464973449707031,0.299484074115753,0.468482971191406,0.296411067247391,0.485588371753693,0.258901685476303,0.482869416475296,0.332386404275894,0.468779236078262,0.364090979099274,0.465840637683868,0.372694969177246,0.48389732837677,0.335140228271484,0.485937714576721,0.215992569923401,0.441191285848618,0.239694207906723,0.456384718418121,0.224495023488998,0.475187003612518,0.193929851055145,0.460339933633804,0.392397910356522,0.457761347293854, +0.416386127471924,0.44299727678299,0.438101828098297,0.462549269199371,0.407244443893433,0.476840615272522,0.837643563747406,0.0389091148972511,0.197699055075645,0.419294595718384,0.168327122926712,0.437126576900482,0.862877249717712,0.0524576976895332,0.435081481933594,0.421431601047516,0.630140483379364,0.0350300446152687,0.604418158531189,0.0476260334253311,0.464152455329895,0.439802676439285,0.801633059978485,0.0765529945492744,0.821592330932617,0.0599730759859085,0.841233968734741,0.0756412595510483,0.815569460391998,0.0934036821126938,0.645393252372742,0.0566792190074921,0.664718985557556,0.073993518948555,0.650162518024445,0.0903116166591644,0.625179827213287,0.0716023370623589,0.747976124286652,0.0915587097406387,0.776865184307098,0.0870165973901749,0.785252630710602,0.103605069220066,0.750635623931885,0.107258953154087,0.689078450202942,0.0853755325078964,0.717777669429779,0.0909942090511322,0.714533150196075,0.106584072113037,0.680076837539673,0.101638972759247,0.705335676670074,0.0582905188202858,0.72346419095993,0.0615262910723686,0.720972418785095,0.0760052427649498,0.698011517524719,0.0706730112433434,0.743395030498505,0.0618988648056984,0.761631727218628,0.0593429058790207,0.768488049507141,0.0719904825091362,0.745343923568726,0.0764608085155487,0.684684157371521,0.0370233207941055,0.692688047885895,0.0504491478204727,0.679227232933044,0.0603836476802826,0.665306687355042,0.0451369360089302,0.774563610553741,0.05197973549366,0.783063769340515,0.0388624258339405,0.802124261856079,0.047694593667984,0.787643671035767,0.0624104142189026,0.380092442035675,0.39834389090538,0.678597629070282,0.0202470496296883,0.655020594596863,0.0261795148253441,0.406893044710159,0.407623708248138,0.789773046970367,0.0223253704607487,0.253058016300201,0.397207796573639,0.226110309362411,0.406002581119537,0.813111782073975,0.0291348546743393,0.362644731998444,0.429944276809692,0.372640371322632,0.416367411613464,0.394400835037231,0.42729714512825,0.377206861972809,0.441618889570236,0.260194182395935,0.415359675884247,0.269944429397583, +0.429112523794174,0.255176424980164,0.440521895885468,0.238249450922012,0.425894439220428,0.355294346809387,0.449937134981155,0.329579442739487,0.453117072582245,0.327397346496582,0.4387566447258,0.347863644361496,0.436887830495834,0.302579373121262,0.452874362468719,0.27692911028862,0.449232637882233,0.284595459699631,0.436319947242737,0.305022656917572,0.438555896282196,0.704293727874756,0.0326951667666435,0.724107563495636,0.0316047966480255,0.724494934082031,0.0468582361936569,0.707214832305908,0.0464427843689919,0.743870556354523,0.0319742634892464,0.763629734516144,0.0338044129312038,0.760196685791016,0.0474332273006439,0.74291330575943,0.0472025573253632,0.327812820672989,0.407850593328476,0.350429385900497,0.41013902425766,0.346441149711609,0.424601852893829,0.326821595430374,0.423988580703735,0.282506734132767,0.409531056880951,0.305157482624054,0.407647848129272,0.305863589048386,0.423800766468048,0.286238431930542,0.424062192440033,0.354262709617615,0.392781674861908,0.329097807407379,0.390182256698608,0.723378539085388,0.015511617064476,0.701296091079712,0.0168232098221779,0.304177105426788,0.389959841966629,0.27897372841835,0.392109423875809,0.767218351364136,0.0180555917322636,0.745200395584106,0.01591956615448,0.420579046010971,0.496179580688477,0.458350211381912,0.483362317085266,0.475867211818695,0.504201412200928,0.431743681430817,0.515286505222321,0.492641240358353,0.461442023515701,0.579441785812378,0.0646951571106911,0.557543635368347,0.0850332528352737,0.518070936203003,0.48469078540802,0.606130480766296,0.0895432904362679,0.637109041213989,0.107646889984608,0.626533389091492,0.12515252828598,0.589997708797455,0.109230011701584,0.672429442405701,0.117946907877922,0.711825668811798,0.122108213603497,0.709834158420563,0.137624561786652,0.666665375232697,0.134037762880325,0.752761006355286,0.122873447835445,0.792285144329071,0.120187431573868,0.797443747520447,0.136482551693916,0.754171133041382,0.138453394174576,0.82796585559845,0.111214742064476,0.859599530696869,0.0942816510796547,0.874985098838806, +0.114557527005672,0.837879836559296,0.129103437066078,0.887198269367218,0.0704483762383461,0.139479577541351,0.458229899406433,0.113658472895622,0.480993300676346,0.908320903778076,0.0915906727313995,0.173304051160812,0.480773448944092,0.210792571306229,0.494272589683533,0.199249893426895,0.513159930706024,0.155401065945625,0.501283347606659,0.251105397939682,0.500879645347595,0.293764293193817,0.502942800521851,0.291650742292404,0.520913779735565,0.244767129421234,0.519013345241547,0.33746063709259,0.503337621688843,0.38014954328537,0.502048373222351,0.386141538619995,0.520297050476074,0.339234858751297,0.521344423294067,0.226346582174301,0.646093726158142,0.284982979297638,0.647290706634521,0.284274578094482,0.674115359783173,0.224780380725861,0.674095988273621,0.1075733974576,0.64194643497467,0.167390912771225,0.644258499145508,0.165129423141479,0.674415111541748,0.104801431298256,0.67558491230011,0.966229975223541,0.231847852468491,0.0453302711248398,0.639877319335938,0.0425413995981216,0.679126024246216,0.966767728328705,0.266591191291809,0.859800577163696,0.246199429035187,0.912066102027893,0.241437539458275,0.912021994590759,0.271524429321289,0.859154641628265,0.273394703865051,0.756088852882385,0.24870677292347,0.808139979839325,0.248246729373932,0.807195782661438,0.273469835519791,0.75540566444397,0.272674024105072,0.651799559593201,0.245324194431305,0.703797221183777,0.247729256749153,0.70358419418335,0.271705329418182,0.651800334453583,0.270565032958984,0.54820054769516,0.234635502099991,0.60025155544281,0.241347506642342,0.599880576133728,0.268548011779785,0.547120094299316,0.264703154563904,0.583211719989777,0.644908547401428,0.494432896375656,0.223028287291527,0.492597043514252,0.257727295160294,0.585261344909668,0.684176445007324,0.46114045381546,0.646933913230896,0.5209641456604,0.64575731754303,0.523096203804016,0.679437339305878,0.462821573019028,0.677131593227386,0.343512296676636,0.64782178401947,0.402162253856659,0.647688150405884,0.40319499373436,0.675717949867249,0.343712508678436,0.674656391143799, +0.615753531455994,0.482930898666382,0.619677186012268,0.503442823886871,0.594501614570618,0.504178762435913,0.458748698234558,0.955905556678772,0.590852379798889,0.482133030891418,0.642028212547302,0.503168344497681,0.64891242980957,0.519816100597382,0.628009080886841,0.522284507751465,0.421091973781586,0.97311544418335,0.397816836833954,0.967885851860046,0.406208992004395,0.94956910610199,0.431068480014801,0.952549397945404,0.436378836631775,0.930087745189667,0.463853418827057,0.931603610515594,0.224901050329208,0.966369152069092,0.201539158821106,0.971187472343445,0.821563184261322,0.525902509689331,0.191909074783325,0.950440049171448,0.216816931962967,0.947901546955109,0.80076664686203,0.52265453338623,0.808268129825592,0.506275773048401,0.830593347549438,0.50738537311554,0.835280895233154,0.487034499645233,0.860194385051727,0.487167775630951,0.855723857879639,0.509061694145203,0.164174169301987,0.953302681446075,0.159482896327972,0.92890202999115,0.186980128288269,0.927878975868225,0.384572118520737,0.947401463985443,0.386873632669449,0.930467903614044,0.410248637199402,0.929905533790588,0.367245316505432,0.931739628314972,0.364071696996689,0.916972994804382,0.384872734546661,0.912986695766449,0.378087997436523,0.895444512367249,0.402275085449219,0.890340566635132,0.408942222595215,0.909907341003418,0.435486704111099,0.90771472454071,0.256079852581024,0.930763244628906,0.23647466301918,0.929143488407135,0.238774687051773,0.911699533462524,0.259505927562714,0.916055202484131,0.238488763570786,0.946117579936981,0.213111057877541,0.928164482116699,0.188256055116653,0.905518293380737,0.214760065078735,0.908189058303833,0.221764832735062,0.88874351978302,0.245861634612083,0.894282102584839,0.346783518791199,0.922051668167114,0.338784486055374,0.909451961517334,0.356853157281876,0.901809215545654,0.323801398277283,0.917835891246796,0.311872690916061,0.907012581825256,0.327161103487015,0.896314918994904,0.312078803777695,0.883432328701019,0.330536901950836,0.872102677822113,0.345553010702133,0.886611104011536,0.366868048906326, +0.878463208675385,0.299758315086365,0.917626142501831,0.284921139478683,0.908982157707214,0.296771824359894,0.896051526069641,0.276705712080002,0.921438097953796,0.266985386610031,0.901023507118225,0.257375657558441,0.877509474754333,0.278549015522003,0.886031329631805,0.293820708990097,0.871789515018463,0.788725972175598,0.505792558193207,0.790848255157471,0.490604490041733,0.811909556388855,0.488516092300415,0.773238301277161,0.492896556854248,0.77066433429718,0.479548722505569,0.78925347328186,0.474894344806671,0.783633828163147,0.459637999534607,0.805180788040161,0.453782826662064,0.810763835906982,0.470671206712723,0.834322929382324,0.467318177223206,0.677533686161041,0.491107583045959,0.660021662712097,0.488159000873566,0.662202477455139,0.472519397735596,0.680604636669159,0.477865248918533,0.66157478094101,0.503415822982788,0.639053106307983,0.485284954309464,0.6174476146698,0.463264137506485,0.640864968299866,0.467495322227478,0.647075057029724,0.450827389955521,0.668388307094574,0.45748370885849,0.755389332771301,0.484281063079834,0.748774528503418,0.47299799323082,0.764713883399963,0.466222524642944,0.73578417301178,0.479762196540833,0.725788712501526,0.470457553863525,0.739052355289459,0.461881458759308,0.726149082183838,0.451173812150955,0.742483377456665,0.441327422857285,0.755293011665344,0.453497350215912,0.774316430091858,0.445372074842453,0.715452432632446,0.479382157325745,0.702723860740662,0.472137153148651,0.712854743003845,0.461391746997833,0.69569194316864,0.483165144920349,0.687048971652985,0.46477073431015,0.678232252597809,0.443575948476791,0.696938872337341,0.452406525611877,0.71019434928894,0.440723836421967,0.336244881153107,0.823257327079773,0.357181370258331,0.838488340377808,0.333501547574997,0.848276019096375,0.312511056661606,0.835169672966003,0.383109152317047,0.828899919986725,0.401346623897552,0.84705650806427,0.375449270009995,0.854612112045288,0.390711188316345,0.87191903591156,0.351759701967239,0.862701773643494,0.312294125556946,0.85919189453125,0.242006599903107,0.827674865722656, +0.267757266759872,0.837747156620026,0.249209955334663,0.853519797325134,0.223452866077423,0.845482885837555,0.288979232311249,0.822870552539825,0.291278183460236,0.847926199436188,0.272759407758713,0.862028479576111,0.233648031949997,0.870535731315613,0.34128412604332,0.76054322719574,0.367179483175278,0.779579341411591,0.33891773223877,0.794071972370148,0.31302484869957,0.777002930641174,0.396932184696198,0.764564037322998,0.420479416847229,0.785842478275299,0.39051565527916,0.798918008804321,0.411255747079849,0.818736672401428,0.362342357635498,0.811313629150391,0.312743663787842,0.808353841304779,0.229382783174515,0.763025641441345,0.258859694004059,0.778561949729919,0.23517245054245,0.797492980957031,0.205445319414139,0.783884882926941,0.285089254379272,0.760017573833466,0.2868332862854,0.793581128120422,0.263100326061249,0.810433745384216,0.214062750339508,0.816964030265808,0.429363310337067,0.839180827140808,0.444638192653656,0.860571801662445,0.416776657104492,0.866153717041016,0.474341720342636,0.855055272579193,0.48517519235611,0.880705654621124,0.456200271844864,0.88305127620697,0.462967365980148,0.90680867433548,0.428505420684814,0.886385500431061,0.150330767035484,0.852139592170715,0.17993138730526,0.858200550079346,0.167974501848221,0.88047456741333,0.139045163989067,0.877601206302643,0.195586562156677,0.83708393573761,0.207687973976135,0.864293813705444,0.195606470108032,0.884312868118286,0.160794854164124,0.904115676879883,0.564272165298462,0.482315957546234,0.49220609664917,0.934413313865662,0.567041993141174,0.459717482328415,0.592954158782959,0.46083801984787,0.49094420671463,0.907743573188782,0.51531457901001,0.879532694816589,0.520648241043091,0.90932697057724,0.538536906242371,0.4577876329422,0.54565566778183,0.434140861034393,0.5739466547966,0.438030242919922,0.131084606051445,0.931202232837677,0.88674920797348,0.488343894481659,0.132805705070496,0.904544770717621,0.858889937400818,0.465809106826782,0.884825825691223,0.46565780043602,0.878736555576324,0.443727612495422,0.907153129577637,0.440898269414902, +0.913383185863495,0.464794635772705,0.103076532483101,0.905589640140533,0.108930170536041,0.875878691673279,0.584428429603577,0.417483657598495,0.610249280929565,0.423082828521729,0.599841296672821,0.441403478384018,0.623541355133057,0.405508875846863,0.647722005844116,0.413044095039368,0.634417295455933,0.428851306438446,0.657204747200012,0.435583621263504,0.624096751213074,0.445494592189789,0.830391764640808,0.40937551856041,0.84301769733429,0.42743393778801,0.818650960922241,0.432295173406601,0.805946469306946,0.41600176692009,0.869029998779297,0.422803670167923,0.852733731269836,0.446130752563477,0.828342258930206,0.449312508106232,0.795627951622009,0.438171178102493,0.664081215858459,0.397668808698654,0.686942577362061,0.407396376132965,0.670558154582977,0.421259522438049,0.706080079078674,0.393769085407257,0.726994395256042,0.405955851078033,0.707898020744324,0.418107807636261,0.726553201675415,0.429557114839554,0.69151782989502,0.430615097284317,0.748349547386169,0.394559264183044,0.766964375972748,0.408892273902893,0.745623230934143,0.418813019990921,0.790173292160034,0.400025904178619,0.782819151878357,0.423358023166656,0.761524558067322,0.431923776865005,0.451815843582153,0.771800816059113,0.473222881555557,0.79611337184906,0.441500812768936,0.807850956916809,0.506176829338074,0.783374845981598,0.52467155456543,0.812393009662628,0.491424351930618,0.821826934814453,0.505738615989685,0.849576592445374,0.459558993577957,0.830814480781555,0.119791902601719,0.779853761196136,0.152512818574905,0.793201923370361,0.133845672011375,0.818588256835938,0.100770987570286,0.808538675308228,0.174365177750587,0.769277215003967,0.18402025103569,0.805521249771118,0.165546238422394,0.82816207408905,0.119035199284554,0.846084773540497,0.559623658657074,0.802319228649139,0.574283838272095,0.837198317050934,0.492418199777603,0.390042573213577,0.538718461990356,0.844272375106812,0.508849561214447,0.363733351230621,0.54047679901123,0.377732992172241,0.525473356246948,0.402109861373901,0.556256473064423,0.410826832056046,0.514241218566895, +0.427623212337494,0.548062324523926,0.877362310886383,0.946564793586731,0.371915578842163,0.962001383304596,0.398820519447327,0.0507164746522903,0.832436144351959,0.928518235683441,0.409643948078156,0.914436340332031,0.384723454713821,0.0660030171275139,0.797811686992645,0.0861533582210541,0.840172350406647,0.0762234181165695,0.873107135295868,0.938789069652557,0.435559302568436,0.897431015968323,0.4172043800354,0.558437347412109,0.355241894721985,0.586930751800537,0.368118017911911,0.570089757442474,0.3887719810009,0.6067715883255,0.348682790994644,0.633440732955933,0.360826581716537,0.61411041021347,0.378853797912598,0.639740943908691,0.388433426618576,0.597791254520416,0.397703677415848,0.849273443222046,0.353215873241425,0.868373990058899,0.373379111289978,0.840812265872955,0.383091539144516,0.822169184684753,0.364354491233826,0.897328853607178,0.361576855182648,0.884431481361389,0.39464795589447,0.856415629386902,0.402538120746613,0.814841747283936,0.391706615686417,0.655345439910889,0.343539893627167,0.680682301521301,0.355765014886856,0.659025430679321,0.371793508529663,0.703985810279846,0.340511679649353,0.727962732315063,0.354154586791992,0.704795837402344,0.367919743061066,0.727465629577637,0.380744278430939,0.683322429656982,0.382532119750977,0.752432763576508,0.34141731262207,0.775149822235107,0.357530951499939,0.750598907470703,0.368775963783264,0.800925850868225,0.346261203289032,0.796192526817322,0.374357610940933,0.771511197090149,0.384180724620819,0.339940756559372,0.531239569187164,0.365727305412292,0.54183292388916,0.341039270162582,0.553876459598541,0.315246164798737,0.541978895664215,0.388611376285553,0.53014725446701,0.415575385093689,0.539020240306854,0.392584621906281,0.552429676055908,0.42055881023407,0.562688589096069,0.395820200443268,0.577767491340637,0.367909669876099,0.565916478633881,0.3418850004673,0.579610109329224,0.315016061067581,0.566367030143738,0.242110297083855,0.528815269470215,0.264773905277252,0.540916681289673,0.237718403339386,0.551020205020905,0.214965730905533,0.537184000015259, +0.290758103132248,0.530794143676758,0.289232641458511,0.553406953811646,0.287901997566223,0.57912141084671,0.262140184640884,0.564957678318024,0.234017133712769,0.576302409172058,0.209561437368393,0.560770213603973,0.43637228012085,0.525313317775726,0.464869439601898,0.531686246395111,0.443713545799255,0.547436714172363,0.483143985271454,0.514875113964081,0.513647675514221,0.518282532691956,0.494672238826752,0.537571251392365,0.526362538337708,0.543355286121368,0.5042724609375,0.564042329788208,0.473181545734406,0.555541634559631,0.449804484844208,0.572842121124268,0.147922471165657,0.511820375919342,0.16577735543251,0.528924107551575,0.135957181453705,0.534298062324524,0.117458090186119,0.514691948890686,0.194415688514709,0.523091018199921,0.1866365224123,0.545065224170685,0.180187776684761,0.570418477058411,0.157084792852402,0.552658557891846,0.125849097967148,0.560572981834412,0.104180693626404,0.539468169212341,0.52880585193634,0.49654683470726,0.562361001968384,0.497564375400543,0.52256840467453,0.0918670818209648,0.546112060546875,0.521030426025391,0.548376202583313,0.0956353545188904,0.55885374546051,0.119081772863865,0.533379912376404,0.117096960544586,0.547602772712708,0.141080155968666,0.519836783409119,0.141973808407784,0.505750358104706,0.115352563560009,0.581038117408752,0.525351166725159,0.560475826263428,0.550185203552246,0.917085647583008,0.102527990937233,0.943016231060028,0.0997269302606583,0.0691540539264679,0.492955803871155,0.931269288063049,0.124535113573074,0.905739068984985,0.125566422939301,0.102720580995083,0.492642641067505,0.0849560722708702,0.51677680015564,0.0698829591274261,0.545566201210022,0.0498964786529541,0.520331740379333,0.958944797515869,0.123824506998062,0.943873167037964,0.149900630116463,0.916159987449646,0.147969901561737,0.583486795425415,0.119254626333714,0.598189234733582,0.13712964951992,0.573467254638672,0.139531150460243,0.622356832027435,0.134103372693062,0.640476942062378,0.147827580571175,0.616130411624908,0.152901649475098,0.636313915252686,0.167219370603561,0.610851883888245, +0.174480751156807,0.591091215610504,0.157711878418922,0.564849853515625,0.162507906556129,0.841718912124634,0.138204112648964,0.865756511688232,0.142131507396698,0.84723836183548,0.157221913337708,0.823098480701447,0.15124149620533,0.88111674785614,0.124818481504917,0.890371441841125,0.145455315709114,0.898123979568481,0.168738037347794,0.872080206871033,0.16296461224556,0.851706743240356,0.178983226418495,0.826533854007721,0.170775309205055,0.664435803890228,0.14231675863266,0.685297131538391,0.152918606996536,0.661054611206055,0.160087764263153,0.709053516387939,0.145675301551819,0.731690764427185,0.154724434018135,0.707787275314331,0.163128733634949,0.731338560581207,0.173565998673439,0.706572890281677,0.183822602033615,0.683222532272339,0.171788737177849,0.658058881759644,0.180899441242218,0.754650354385376,0.146527692675591,0.778119385242462,0.15465384721756,0.75526350736618,0.164016261696815,0.799362301826477,0.144839093089104,0.802076935768127,0.162724018096924,0.804292798042297,0.183633118867874,0.779487311840057,0.173588335514069,0.755703449249268,0.184741050004959,0.369796395301819,0.592754364013672,0.342639744281769,0.607325851917267,0.314760863780975,0.593377590179443,0.42496132850647,0.589710414409637,0.398784607648849,0.605781495571136,0.428810626268387,0.618883848190308,0.401247203350067,0.634127974510193,0.371511816978455,0.620830953121185,0.343286395072937,0.634803950786591,0.314497411251068,0.62119859457016,0.259749382734299,0.591758370399475,0.23052391409874,0.604258954524994,0.204673498868942,0.587721765041351,0.286623150110245,0.606818616390228,0.285455763339996,0.634279727935791,0.257501661777496,0.619798421859741,0.227520525455475,0.632554054260254,0.200258731842041,0.616814017295837,0.149193614721298,0.580693662166595,0.116737797856331,0.592163324356079,0.0924790054559708,0.569983124732971,0.17404006421566,0.599494576454163,0.169212967157364,0.629711210727692,0.14238740503788,0.612040638923645,0.110009856522083,0.625729501247406,0.0831132978200912,0.605380296707153,0.974230527877808,0.153704136610031, +0.033427506685257,0.55525803565979,0.955891847610474,0.181044802069664,0.926051378250122,0.174797087907791,0.0571697577834129,0.581711769104004,0.0483084879815578,0.620881795883179,0.0209033787250519,0.596877753734589,0.98706579208374,0.189077854156494,0.964209914207458,0.215099781751633,0.934494495391846,0.205861762166023,0.878072381019592,0.187698885798454,0.856294274330139,0.205092236399651,0.829923570156097,0.194269955158234,0.905710577964783,0.196712583303452,0.910915613174438,0.226786941289902,0.883295655250549,0.215952426195145,0.859318792819977,0.232815399765968,0.832926392555237,0.221026137471199,0.780862212181091,0.19675812125206,0.756153643131256,0.21012656390667,0.730904340744019,0.196789979934692,0.806678891181946,0.208995044231415,0.808097779750824,0.235620111227036,0.78202623128891,0.22315376996994,0.756257295608521,0.236478999257088,0.730410099029541,0.22323352098465,0.68098258972168,0.194891005754471,0.654726445674896,0.20615454018116,0.632048368453979,0.190570965409279,0.705174267292023,0.209173589944839,0.704085946083069,0.23550371825695,0.67883288860321,0.221224710345268,0.652313709259033,0.232707962393761,0.628047704696655,0.217196255922318,0.584178864955902,0.182204946875572,0.556223213672638,0.190179392695427,0.536715567111969,0.167518988251686,0.605291724205017,0.200400114059448,0.601233243942261,0.227990821003914,0.577903389930725,0.210243493318558,0.549897789955139,0.220038086175919,0.527117431163788,0.198246359825134,0.596766829490662,0.560602843761444,0.489358603954315,0.144640058279037,0.572477281093597,0.586563467979431,0.537382781505585,0.57414036989212,0.506662547588348,0.172647044062614,0.497077465057373,0.206367373466492,0.475210130214691,0.17950938642025,0.608462810516357,0.602438390254974,0.580593824386597,0.625872015953064,0.546091556549072,0.609691679477692,0.480609595775604,0.583685398101807,0.455379098653793,0.602036356925964,0.51276421546936,0.595807015895844,0.518839657306671,0.629497766494751,0.486766785383224,0.61517995595932,0.459602892398834,0.632351398468018,0.462656795978546, +0.693916320800781,0.491036832332611,0.71525502204895,0.459282994270325,0.732198357582092,0.432009607553482,0.710384666919708,0.522655367851257,0.69811886548996,0.550654888153076,0.723382294178009,0.517283260822296,0.74042671918869,0.540424585342407,0.769427120685577,0.484176933765411,0.756597757339478,0.427743315696716,0.748710751533508,0.58413290977478,0.705778360366821,0.61140775680542,0.736314058303833,0.467260897159576,0.297166526317596,0.575712323188782,0.754165530204773,0.493154227733612,0.276898801326752,0.521984279155731,0.29870817065239,0.497722268104553,0.320135533809662,0.528583884239197,0.339382886886597,0.476130843162537,0.345365285873413,0.596473336219788,0.789043605327606,0.547581315040588,0.281124651432037,0.575152814388275,0.299159109592438,0.550900042057037,0.317852795124054,0.600309610366821,0.283199310302734,0.626867532730103,0.29874774813652,0.602422058582306,0.315555274486542,0.629138767719269,0.330318689346313,0.579290270805359,0.334443211555481,0.652109503746033,0.283977210521698,0.678072333335876,0.298030227422714,0.65312135219574,0.313360214233398,0.703569829463959,0.284313917160034,0.729012072086334,0.298022985458374,0.703606724739075,0.311939060688019,0.728485524654388,0.326186716556549,0.678948521614075,0.327134609222412,0.754948854446411,0.2852743268013,0.779915690422058,0.299933969974518,0.753879487514496,0.31287881731987,0.806385636329651,0.286861032247543,0.831057906150818,0.302564650774002,0.804276287555695,0.316185772418976,0.827608287334442,0.334028691053391,0.777952373027802,0.328985333442688,0.858178377151489,0.28801965713501,0.882721066474915,0.304908573627472,0.854858100414276,0.320274084806442,0.910947322845459,0.287917196750641,0.935869336128235,0.306445091962814,0.906258225440979,0.324495613574982,0.92775422334671,0.346844643354416,0.877267718315125,0.340013384819031,0.965494394302368,0.285728484392166,0.990612268447876,0.30694967508316,0.0154270827770233,0.730789840221405,0.959313631057739,0.328764140605927,0.0432663820683956,0.700760781764984,0.0764171928167343,0.719012558460236, +0.0507922768592834,0.74933248758316,0.0857993066310883,0.765264749526978,0.0293957442045212,0.78383731842041,0.979947149753571,0.354783177375793,0.10489072650671,0.694275856018066,0.136191889643669,0.712007522583008,0.109474666416645,0.736690163612366,0.164975568652153,0.691199064254761,0.195312678813934,0.70822811126709,0.16763062775135,0.729538321495056,0.198863834142685,0.746624708175659,0.142283633351326,0.753478944301605,0.224538579583168,0.689687132835388,0.254396110773087,0.706225991249084,0.225723281502724,0.725482702255249,0.284074485301971,0.689078748226166,0.313697278499603,0.705785036087036,0.284168541431427,0.723596036434174,0.313358694314957,0.741743981838226,0.255782216787338,0.742804944515228,0.343629956245422,0.689622163772583,0.372979730367661,0.707310080528259,0.342886358499527,0.724136173725128,0.403141617774963,0.691313147544861,0.4012850522995,0.727086305618286,0.370910733938217,0.743866503238678,0.725484371185303,0.486740589141846,0.717419624328613,0.49398398399353,0.707772850990295,0.488333731889725,0.725232839584351,0.500194072723389,0.718308210372925,0.506347060203552,0.711099207401276,0.500958621501923,0.70593535900116,0.506917595863342,0.699252367019653,0.504186689853668,0.702406764030457,0.496788769960403,0.691417992115021,0.493777871131897,0.733272671699524,0.494280278682709,0.73932808637619,0.501486301422119,0.731922686100006,0.506601572036743,0.743123769760132,0.488994538784027,0.759263873100281,0.495046108961105,0.74817019701004,0.497644245624542,0.751046180725098,0.50515478849411,0.744265675544739,0.507634043693542,0.68443238735199,0.525119721889496,0.679808139801025,0.514833152294159,0.691119790077209,0.512713193893433,0.695016324520111,0.521184921264648,0.665818512439728,0.517204165458679,0.677356541156769,0.50349622964859,0.689826965332031,0.503620088100433,0.699848651885986,0.510618329048157,0.78396999835968,0.519412636756897,0.770078659057617,0.516520500183105,0.772952318191528,0.505283117294312,0.765073299407959,0.526627123355865,0.754643797874451,0.522299528121948,0.758854269981384, +0.513979256153107,0.750209867954254,0.51155960559845,0.760486006736755,0.504940867424011,0.716741681098938,0.531013250350952,0.709898710250854,0.52401077747345,0.717870235443115,0.518352270126343,0.724773347377777,0.52478015422821,0.700791120529175,0.529262721538544,0.704095363616943,0.517118334770203,0.711650252342224,0.512200713157654,0.725005030632019,0.51238340139389,0.748571276664734,0.530155837535858,0.739666283130646,0.524567246437073,0.745723128318787,0.517896413803101,0.732566595077515,0.531309068202972,0.731911778450012,0.518614768981934,0.738357245922089,0.512699842453003,0.272709637880325,0.980942785739899,0.260172367095947,0.987584173679352,0.769681930541992,0.541398406028748,0.251372814178467,0.975671648979187,0.265060037374496,0.970088422298431,0.758492827415466,0.535674631595612,0.777258455753326,0.531290769577026,0.792048811912537,0.536336898803711,0.234757900238037,0.982031583786011,0.24368505179882,0.961810171604156,0.690670192241669,0.534406900405884,0.679275035858154,0.539708495140076,0.362203031778336,0.988473534584045,0.672081470489502,0.529324769973755,0.34977775812149,0.981614828109741,0.357605040073395,0.970897316932678,0.371196925640106,0.97671902179718,0.37911331653595,0.962997257709503,0.387701988220215,0.983368396759033,0.657112956047058,0.533814668655396,0.290733993053436,0.927330493927002,0.284537225961685,0.936324596405029,0.271824300289154,0.933041751384735,0.311709582805634,0.925915241241455,0.302202790975571,0.93356066942215,0.311588793992996,0.940068602561951,0.303507506847382,0.946755290031433,0.29485097527504,0.940906763076782,0.288971036672592,0.947593927383423,0.281047135591507,0.944573760032654,0.332657217979431,0.92769718170166,0.321084022521973,0.933725833892822,0.351465433835983,0.933739840984344,0.338699102401733,0.936798810958862,0.342048466205597,0.945107936859131,0.334074974060059,0.947988629341125,0.328309446573257,0.941199541091919,0.319555461406708,0.946895658969879,0.25925874710083,0.958009898662567,0.272021770477295,0.954905986785889,0.276935219764709,0.964996218681335, +0.256088495254517,0.944815695285797,0.270176112651825,0.944225549697876,0.282012581825256,0.952113270759583,0.363606482744217,0.958923935890198,0.366998076438904,0.94578891992569,0.345816731452942,0.965598285198212,0.350897997617722,0.955596446990967,0.340955972671509,0.952629029750824,0.352923274040222,0.944950699806213,0.295853555202484,0.953680396080017,0.287230432033539,0.959802389144897,0.311473906040192,0.953657507896423,0.303263187408447,0.960977554321289,0.311347663402557,0.968745827674866,0.302233397960663,0.976436376571655,0.294189453125,0.968060374259949,0.283940076828003,0.974595487117767,0.327091187238693,0.953953564167023,0.319560408592224,0.961120009422302,0.335610032081604,0.960225343704224,0.338653862476349,0.975072920322418,0.328514486551285,0.968360126018524,0.320333153009415,0.976594209671021,0.741251587867737,0.537708878517151,0.733112871646881,0.544999957084656,0.301381647586823,0.992469251155853,0.724524796009064,0.538084149360657,0.750855684280396,0.543904662132263,0.281449735164642,0.990747809410095,0.292277425527573,0.983719527721405,0.311216026544571,0.984701097011566,0.707823634147644,0.537084102630615,0.697994530200958,0.542916595935822,0.340878546237946,0.991264939308167,0.715684175491333,0.544674158096313,0.320921778678894,0.992639183998108,0.330167859792709,0.984049558639526,0.272442102432251,0.456707000732422,0.283351063728333,0.467191636562347,0.263277649879456,0.473778665065765,0.253205537796021,0.46148544549942,0.301057904958725,0.460413753986359,0.315931975841522,0.468970984220505,0.297915816307068,0.476926386356354,0.315773814916611,0.485954254865646,0.295012891292572,0.494312644004822,0.277353256940842,0.484630107879639,0.254811584949493,0.491988718509674,0.241225808858871,0.479867875576019,0.330962061882019,0.460682809352875,0.348541378974915,0.46777880191803,0.333797484636307,0.47724974155426,0.359643667936325,0.457491755485535,0.378791153430939,0.46261727809906,0.368490099906921,0.474727839231491,0.390425622463226,0.481216788291931,0.376612484455109,0.49309042096138,0.354212999343872, +0.485323786735535,0.33637461066246,0.49468606710434,0.227208644151688,0.432930171489716,0.227294266223907,0.449632823467255,0.204825028777122,0.450415343046188,0.206042915582657,0.431073933839798,0.247495010495186,0.447913229465485,0.23196417093277,0.465591073036194,0.217400074005127,0.484853774309158,0.20872463285923,0.468714982271194,0.183393895626068,0.470585733652115,0.180375695228577,0.449873268604279,0.384753406047821,0.449148714542389,0.404924988746643,0.45123416185379,0.399956315755844,0.467108219861984,0.405317366123199,0.434532523155212,0.426524043083191,0.433059990406036,0.427387535572052,0.452425003051758,0.45186173915863,0.452328950166702,0.448449313640594,0.472988814115524,0.423140227794647,0.470655769109726,0.414154589176178,0.486637949943542,0.82519406080246,0.0336140319705009,0.844738304615021,0.0274647772312164,0.19015808403492,0.406684279441833,0.850268602371216,0.0451477766036987,0.830083429813385,0.0498972721397877,0.212122291326523,0.41202574968338,0.183035641908646,0.4276984333992,0.153749704360962,0.447372525930405,0.157031327486038,0.423239827156067,0.872625172138214,0.0398576855659485,0.875257790088654,0.0608781352639198,0.852592468261719,0.0645535886287689,0.420780181884766,0.413900196552277,0.442848652601242,0.408957719802856,0.623478591442108,0.0233285278081894,0.449603408575058,0.430103808641434,0.642779231071472,0.0302039757370949,0.637284636497498,0.0462930947542191,0.617291212081909,0.0407924801111221,0.614243686199188,0.060097873210907,0.591731667518616,0.0555778741836548,0.595148026943207,0.034670501947403,0.475708574056625,0.426123380661011,0.478555947542191,0.450318574905396,0.794532179832458,0.0690554082393646,0.812124252319336,0.0689278692007065,0.808720648288727,0.0847276002168655,0.789939701557159,0.0826490372419357,0.811744749546051,0.0534040741622448,0.83148330450058,0.067389503121376,0.85066556930542,0.0846360698342323,0.828870177268982,0.0853736400604248,0.822033166885376,0.102319851517677,0.801105618476868,0.099543459713459,0.655479550361633,0.0504828616976738,0.654520153999329, +0.0659816265106201,0.635232031345367,0.0637207850813866,0.6720951795578,0.066766545176506,0.676176190376282,0.0805223435163498,0.657330751419067,0.0818975418806076,0.664386689662933,0.096987709403038,0.643370032310486,0.0989799797534943,0.637171268463135,0.0817900449037552,0.615418672561646,0.0802383497357368,0.746618032455444,0.0838937684893608,0.762760400772095,0.0899037718772888,0.749341011047363,0.0993742272257805,0.732864558696747,0.0919369831681252,0.772579908370972,0.0792073458433151,0.781153082847595,0.0952164307236671,0.78901344537735,0.111992172896862,0.768324553966522,0.10602979362011,0.751796722412109,0.115122236311436,0.732575297355652,0.107405923306942,0.693652629852295,0.0777318999171257,0.703065633773804,0.0887878909707069,0.684487044811249,0.093409389257431,0.71942138671875,0.0833853930234909,0.716121554374695,0.0987532511353493,0.71307897567749,0.114398457109928,0.696902513504028,0.104694671928883,0.676005125045776,0.109879672527313,0.707342028617859,0.0525205954909325,0.7139573097229,0.0601994171738625,0.70196807384491,0.0641941279172897,0.698084235191345,0.0552302189171314,0.72421532869339,0.0542527101933956,0.733421683311462,0.0621373653411865,0.722347736358643,0.0687526017427444,0.733145892620087,0.0768926814198494,0.70915162563324,0.0738986432552338,0.687915563583374,0.0662081018090248,0.742916226387024,0.0546023026108742,0.752944827079773,0.0609282292425632,0.744240641593933,0.0691618323326111,0.759842395782471,0.0535020343959332,0.76899242401123,0.0565557777881622,0.764776349067688,0.0653682500123978,0.778743803501129,0.067906066775322,0.757235109806061,0.0747974663972855,0.694426417350769,0.0343448296189308,0.68845272064209,0.0442719608545303,0.674999833106995,0.0406481772661209,0.681394875049591,0.0289370696991682,0.69954514503479,0.0474607422947884,0.686097383499146,0.0549195893108845,0.671754837036133,0.0533198565244675,0.659767150878906,0.0360263362526894,0.767822921276093,0.0487371198832989,0.779026865959167,0.0459651574492455,0.780982553958893,0.0566933937370777,0.773428380489349,0.0358216986060143, +0.78665292263031,0.0309047549962997,0.792605698108673,0.0428466908633709,0.808000445365906,0.0387973822653294,0.795374810695648,0.0556308254599571,0.367074757814407,0.395137965679169,0.383056074380875,0.388400971889496,0.676046311855316,0.011255145072937,0.393352866172791,0.402479231357574,0.376747608184814,0.407821238040924,0.690039455890656,0.0182366855442524,0.666936159133911,0.0228845700621605,0.650670528411865,0.0159645825624466,0.411895990371704,0.396514415740967,0.401268541812897,0.418096721172333,0.778414368629456,0.0198887940496206,0.792658567428589,0.0134351253509521,0.25026598572731,0.387214958667755,0.801327705383301,0.0253968723118305,0.266125619411469,0.394235968589783,0.256238043308258,0.406742215156555,0.239732414484024,0.401103675365448,0.231548875570297,0.416573226451874,0.221302688121796,0.394807159900665,0.81784063577652,0.0190896689891815,0.355061501264572,0.4262655377388,0.367897212505341,0.423801928758621,0.369817554950714,0.435206055641174,0.356195867061615,0.434428304433823,0.361627578735352,0.412655830383301,0.383540511131287,0.421254336833954,0.386357665061951,0.435159653425217,0.366876393556595,0.446577250957489,0.27126806974411,0.41184663772583,0.264803797006607,0.42287740111351,0.249212205410004,0.420049250125885,0.277591079473495,0.425570905208588,0.27631026506424,0.433711320161819,0.262679278850555,0.43424391746521,0.265412300825119,0.445665061473846,0.246146976947784,0.433899581432343,0.342761725187302,0.452012419700623,0.35128653049469,0.443096071481705,0.316075891256332,0.453366041183472,0.328353077173233,0.445876777172089,0.316207468509674,0.438917219638824,0.326843202114105,0.431534647941589,0.338110119104385,0.438078701496124,0.345942825078964,0.430870413780212,0.289420306682587,0.451532959938049,0.303937792778015,0.44565749168396,0.281060785055161,0.442465275526047,0.286624312400818,0.430338382720947,0.294324696063995,0.43768572807312,0.305706918239594,0.431345105171204,0.702680706977844,0.0249692499637604,0.714212000370026,0.0318549498915672,0.70588755607605,0.0398899987339973, +0.72370970249176,0.0236822403967381,0.73399031162262,0.0317196026444435,0.724419951438904,0.0393174178898335,0.733701527118683,0.0471684075891972,0.715572834014893,0.0465302839875221,0.744564116001129,0.0240721125155687,0.753749787807465,0.0325940921902657,0.743270099163055,0.0396698117256165,0.765530347824097,0.0261441878974438,0.761767983436584,0.0409346371889114,0.751841306686401,0.0472082942724228,0.328507363796234,0.399218559265137,0.33912980556488,0.408607184886932,0.327191740274429,0.416100025177002,0.316486179828644,0.407615393400192,0.352527886629105,0.4017653465271,0.348292142152786,0.417789041996002,0.336966753005981,0.424120426177979,0.316341817378998,0.423963069915771,0.280554264783859,0.40112179517746,0.29382997751236,0.408201813697815,0.284508883953094,0.417217671871185,0.304612874984741,0.399004995822906,0.305633515119553,0.415906965732574,0.29571858048439,0.423750758171082,0.341616868972778,0.391166090965271,0.355815708637238,0.383493036031723,0.700025796890259,0.00846710801124573,0.31663978099823,0.389792621135712,0.329636245965958,0.380943775177002,0.72308075428009,0.00721696019172668,0.734293162822723,0.015515323728323,0.712398767471313,0.0159377958625555,0.291643768548965,0.390720039606094,0.303795695304871,0.380713552236557,0.745808005332947,0.00764182209968567,0.27757915854454,0.382795453071594,0.768800139427185,0.00975281000137329,0.756156623363495,0.0167558267712593,0.439816892147064,0.490705698728561,0.426461040973663,0.505663216114044,0.400676608085632,0.499916344881058,0.476013481616974,0.473743170499802,0.467568278312683,0.493742376565933,0.497235745191574,0.495713979005814,0.454018712043762,0.510582447052002,0.409098953008652,0.518471896648407,0.508751153945923,0.447799861431122,0.567351698875427,0.0507904253900051,0.505961716175079,0.472967803478241,0.592159032821655,0.0778595507144928,0.56792151927948,0.0746296793222427,0.573177993297577,0.0983003005385399,0.542501926422119,0.0705975443124771,0.538639545440674,0.472399711608887,0.621174454689026,0.0995408892631531,0.597571432590485, +0.0992846712470055,0.654129147529602,0.113802000880241,0.631467461585999,0.116356402635574,0.646127998828888,0.130454570055008,0.607837796211243,0.118091158568859,0.691748678684235,0.120557136833668,0.669324576854706,0.125959873199463,0.732287406921387,0.122810266911983,0.710751295089722,0.129816025495529,0.731998443603516,0.138263285160065,0.687961876392365,0.136296361684799,0.772881805896759,0.1220738068223,0.753546476364136,0.130616024136543,0.810727596282959,0.116729393601418,0.795088291168213,0.128310889005661,0.818100690841675,0.133669435977936,0.776077687740326,0.137943595647812,0.844192385673523,0.103709988296032,0.833277940750122,0.120129026472569,0.873997867107391,0.0831282585859299,0.867788434028625,0.104336112737656,0.892201542854309,0.104264102876186,0.856826305389404,0.122745737433434,0.899799644947052,0.057005237787962,0.123642861843109,0.444287121295929,0.898339152336121,0.0808065161108971,0.155854061245918,0.4708371758461,0.12596607208252,0.46950227022171,0.134253442287445,0.492415487766266,0.0933398008346558,0.468293905258179,0.923891723155975,0.0777272582054138,0.191670060157776,0.488448649644852,0.163894906640053,0.490980267524719,0.230621159076691,0.498373508453369,0.204725027084351,0.503641843795776,0.221841648221016,0.516766250133514,0.177075237035751,0.508047878742218,0.272176146507263,0.502249836921692,0.247763738036156,0.50980144739151,0.315611779689789,0.503218710422516,0.292649030685425,0.511727154254913,0.31544241309166,0.521187901496887,0.268034219741821,0.520272254943848,0.359057664871216,0.503035545349121,0.338410139083862,0.512140929698944,0.383320987224579,0.511030793190002,0.362857937812805,0.52113139629364,0.255692422389984,0.646766066551208,0.225427597761154,0.659739017486572,0.196920931339264,0.645261764526367,0.314246743917465,0.647648811340332,0.284590542316437,0.660362243652344,0.313994497060776,0.674291670322418,0.254540622234344,0.674069404602051,0.194980964064598,0.674207091331482,0.137645453214645,0.643135905265808,0.105814293026924,0.658326506614685,0.0768949389457703, +0.640817642211914,0.166013985872269,0.658944606781006,0.135108634829521,0.674835801124573,0.0740112215280533,0.676926910877228,0.993890583515167,0.225541055202484,0.013322502374649,0.639031231403351,0.966995894908905,0.248813986778259,0.93885862827301,0.237398684024811,0.0433825254440308,0.659031450748444,0.0107317715883255,0.681753635406494,0.994724452495575,0.263202905654907,0.939103007316589,0.26951864361763,0.885748028755188,0.244269460439682,0.859695076942444,0.259574592113495,0.834004282951355,0.24745075404644,0.912371873855591,0.256180107593536,0.885410606861115,0.272764503955841,0.833125829696655,0.273576140403748,0.782178103923798,0.248645886778831,0.75579446554184,0.26061150431633,0.729939460754395,0.248408257961273,0.807804703712463,0.260713428258896,0.781307995319366,0.273145794868469,0.729495525360107,0.272159039974213,0.677728533744812,0.246693357825279,0.651668608188629,0.257794737815857,0.625982999801636,0.243562117218971,0.703646421432495,0.259636700153351,0.677682220935822,0.271208763122559,0.625884413719177,0.269702136516571,0.574394345283508,0.238449051976204,0.547344028949738,0.249356418848038,0.521577596664429,0.229598134756088,0.599857091903687,0.254717290401459,0.573666512966156,0.266936928033829,0.520133018493652,0.261686623096466,0.61523026227951,0.644696056842804,0.467027306556702,0.215692192316055,0.58479768037796,0.664083480834961,0.551640570163727,0.645226955413818,0.493033468723297,0.239953994750977,0.464786559343338,0.253296583890915,0.617012917995453,0.687420845031738,0.553844213485718,0.681369483470917,0.490893721580505,0.646369576454163,0.462233453989029,0.661645650863647,0.431598603725433,0.647392630577087,0.52241051197052,0.662165880203247,0.492820829153061,0.678113579750061,0.432984352111816,0.676372647285461,0.372808039188385,0.64782851934433,0.343656897544861,0.660898923873901,0.402820855379105,0.661349654197693,0.373441636562347,0.675151228904724 + } + UVIndex: *7808 { + a: 0,1030,542,1034,1030,258,1031,542,542,1031,394,1032,1034,542,1032,262,258,1035,543,1031,1035,1,1036,543,543,1036,259,1037,1031,543,1037,394,395,1038,544,1041,1038,260,1039,544,544,1039,2,1040,1041,544,1040,261,263,1033,545,1043,1033,395,1041,545,545,1041,261,1042,1043,545,1042,3,5,1044,546,1048,1044,264,1045,546,546,1045,396,1047,1048,546,1047,269,265,1049,547,1046,1049,6,1050,547,547,1050,266,1051,1046,547,1051,397,397,1051,548,1054,1051,266,1052,548,548,1052,7,1053,1054,548,1053,267,269,1047,549,1057,1047,396,1055,549,549,1055,268,1056,1057,549,1056,4,2,1058,550,1040,1058,270,1059,550,550,1059,398,1060,1040,550,1060,261,270,1061,551,1059,1061,8,1062,551,551,1062,271,1063,1059,551,1063,398,398,1063,552,1066,1063,271,1064,552,552,1064,9,1065,1066,552,1065,272,261,1060,553,1042,1060,398,1066,553,553,1066,272,1067,1042,553,1067,3,11,1068,554,1071,1068,273,1069,554,554,1069,399,1070,1071,554,1070,275,273,1072,555,1069,1072,5,1048,555,555,1048,269,1073,1069,555,1073,399,399,1073,556,1075,1073,269,1057,556,556,1057,4,1074,1075,556,1074,274,275,1070,557,1077,1070,399,1075,557,557,1075,274,1076,1077,557,1076,10,8,1078,558,1062,1078,276,1079,558,558,1079,400,1080,1062,558,1080,271,276,1081,559,1079,1081,12,1082,559,559,1082,277,1083,1079,559,1083,400,400,1083,560,1086,1083,277,1084,560,560,1084,13,1085,1086,560,1085,278,271,1080,561,1064,1080,400,1086,561,561,1086,278,1087,1064,561,1087,9,12,1088,562,1082,1088,279,1089,562,562,1089,401,1090,1082,562,1090,277,279,1091,563,1089,1091,11,1071,563,563,1071,275,1092,1089,563,1092,401,401,1092,564,1094,1092,275,1077,564,564,1077,10,1093,1094,564,1093,280,277,1090,565,1084,1090,401,1094,565,565,1094,280,1095,1084,565,1095,13,6,1096,566,1050,1096,281,1097,566,566,1097,402,1098,1050,566,1098,266,281,1099,567,1097,1099,14,1100,567,567,1100,282,1101,1097,567,1101,402,402,1101,568,1104,1101,282,1102,568,568,1102,15,1103,1104,568,1103,283,266,1098,569,1052,1098,402,1104,569,569,1104,283,1105,1052,569,1105,7,17,1106,570,1109,1106,284,1107,570,570,1107,403,1108,1109, +570,1108,286,284,1110,571,1107,1110,1,1035,571,571,1035,258,1111,1107,571,1111,403,403,1111,572,1113,1111,258,1030,572,572,1030,0,1112,1113,572,1112,285,286,1108,573,1115,1108,403,1113,573,573,1113,285,1114,1115,573,1114,16,14,1116,574,1100,1116,287,1117,574,574,1117,404,1118,1100,574,1118,282,287,1119,575,1117,1119,19,1120,575,575,1120,288,1121,1117,575,1121,404,404,1121,576,1124,1121,288,1122,576,576,1122,18,1123,1124,576,1123,289,282,1118,577,1102,1118,404,1124,577,577,1124,289,1125,1102,577,1125,15,19,1126,578,1120,1126,290,1127,578,578,1127,405,1128,1120,578,1128,288,290,1129,579,1127,1129,17,1109,579,579,1109,286,1130,1127,579,1130,405,405,1130,580,1132,1130,286,1115,580,580,1115,16,1131,1132,580,1131,291,288,1128,581,1122,1128,405,1132,581,581,1132,291,1133,1122,581,1133,18,21,1134,582,1137,1134,292,1135,582,582,1135,406,1136,1137,582,1136,294,292,1138,583,1135,1138,20,1139,583,583,1139,293,1140,1135,583,1140,406,406,1140,584,1142,1140,293,1141,584,584,1141,9,1087,1142,584,1087,278,294,1136,585,1143,1136,406,1142,585,585,1142,278,1085,1143,585,1085,13,22,1144,586,1147,1144,295,1145,586,586,1145,407,1146,1147,586,1146,296,295,1148,587,1145,1148,21,1137,587,587,1137,294,1149,1145,587,1149,407,407,1149,588,1150,1149,294,1143,588,588,1143,13,1095,1150,588,1095,280,296,1146,589,1151,1146,407,1150,589,589,1150,280,1093,1151,589,1093,10,69,1152,590,1155,1152,297,1153,590,590,1153,408,1154,1155,590,1154,299,297,1156,591,1153,1156,60,1157,591,591,1157,298,1158,1153,591,1158,408,408,1158,592,1160,1158,298,1159,592,592,1159,20,1138,1160,592,1138,292,299,1154,593,1161,1154,408,1160,593,593,1160,292,1134,1161,593,1134,21,68,1162,594,1165,1162,300,1163,594,594,1163,409,1164,1165,594,1164,301,300,1166,595,1163,1166,69,1155,595,595,1155,299,1167,1163,595,1167,409,409,1167,596,1168,1167,299,1161,596,596,1161,21,1148,1168,596,1148,295,301,1164,597,1169,1164,409,1168,597,597,1168,295,1144,1169,597,1144,22,20,1170,598,1139,1170,302,1171,598,598,1171,410,1172,1139,598,1172,293,302,1173,599,1171,1173,26,1174,599,599,1174,303,1175, +1171,599,1175,410,410,1175,600,1177,1175,303,1176,600,600,1176,3,1067,1177,600,1067,272,293,1172,601,1141,1172,410,1177,601,601,1177,272,1065,1141,601,1065,9,27,1178,602,1181,1178,304,1179,602,602,1179,411,1180,1181,602,1180,305,304,1182,603,1179,1182,22,1147,603,603,1147,296,1183,1179,603,1183,411,411,1183,604,1184,1183,296,1151,604,604,1151,10,1076,1184,604,1076,274,305,1180,605,1185,1180,411,1184,605,605,1184,274,1074,1185,605,1074,4,0,1034,606,1189,1034,262,1186,606,606,1186,412,1188,1189,606,1188,308,263,1043,607,1187,1043,3,1176,607,607,1176,303,1190,1187,607,1190,413,413,1190,608,1192,1190,303,1174,608,608,1174,26,1191,1192,608,1191,306,308,1188,609,1195,1188,412,1193,609,609,1193,307,1194,1195,609,1194,28,4,1056,610,1185,1056,268,1196,610,610,1196,414,1198,1185,610,1198,305,267,1053,611,1197,1053,7,1199,611,611,1199,309,1200,1197,611,1200,415,415,1200,612,1203,1200,309,1201,612,612,1201,29,1202,1203,612,1202,310,305,1198,613,1181,1198,414,1204,613,613,1204,311,1205,1181,613,1205,27,28,1206,614,1195,1206,312,1207,614,614,1207,416,1208,1195,614,1208,308,312,1209,615,1207,1209,30,1210,615,615,1210,313,1211,1207,615,1211,416,416,1211,616,1213,1211,313,1212,616,616,1212,16,1114,1213,616,1114,285,308,1208,617,1189,1208,416,1213,617,617,1213,285,1112,1189,617,1112,0,31,1214,618,1217,1214,314,1215,618,618,1215,417,1216,1217,618,1216,315,314,1218,619,1215,1218,29,1201,619,619,1201,309,1219,1215,619,1219,417,417,1219,620,1220,1219,309,1199,620,620,1199,7,1105,1220,620,1105,283,315,1216,621,1221,1216,417,1220,621,621,1220,283,1103,1221,621,1103,15,30,1222,622,1210,1222,316,1223,622,622,1223,418,1224,1210,622,1224,313,316,1225,623,1223,1225,32,1226,623,623,1226,317,1227,1223,623,1227,418,418,1227,624,1229,1227,317,1228,624,624,1228,18,1133,1229,624,1133,291,313,1224,625,1212,1224,418,1229,625,625,1229,291,1131,1212,625,1131,16,32,1230,626,1226,1230,318,1231,626,626,1231,419,1232,1226,626,1232,317,318,1233,627,1231,1233,31,1217,627,627,1217,315,1234,1231,627,1234,419,419,1234,628,1235,1234,315,1221,628,628,1221,15,1125, +1235,628,1125,289,317,1232,629,1228,1232,419,1235,629,629,1235,289,1123,1228,629,1123,18,60,1236,630,1157,1236,319,1237,630,630,1237,420,1238,1157,630,1238,298,319,1239,631,1237,1239,61,1240,631,631,1240,320,1241,1237,631,1241,420,420,1241,632,1243,1241,320,1242,632,632,1242,26,1173,1243,632,1173,302,298,1238,633,1159,1238,420,1243,633,633,1243,302,1170,1159,633,1170,20,67,1244,634,1247,1244,321,1245,634,634,1245,421,1246,1247,634,1246,322,321,1248,635,1245,1248,68,1165,635,635,1165,301,1249,1245,635,1249,421,421,1249,636,1250,1249,301,1169,636,636,1169,22,1182,1250,636,1182,304,322,1246,637,1251,1246,421,1250,637,637,1250,304,1178,1251,637,1178,27,61,1252,638,1240,1252,323,1253,638,638,1253,422,1255,1240,638,1255,320,324,1256,639,1254,1256,62,1257,639,639,1257,325,1258,1254,639,1258,423,423,1258,640,1260,1258,325,1259,640,640,1259,28,1194,1260,640,1194,307,320,1255,641,1242,1255,422,1261,641,641,1261,306,1191,1242,641,1191,26,66,1262,642,1266,1262,326,1263,642,642,1263,424,1265,1266,642,1265,328,327,1267,643,1264,1267,67,1247,643,643,1247,322,1268,1264,643,1268,425,425,1268,644,1269,1268,322,1251,644,644,1251,27,1205,1269,644,1205,311,328,1265,645,1271,1265,424,1270,645,645,1270,310,1202,1271,645,1202,29,62,1272,646,1257,1272,329,1273,646,646,1273,426,1274,1257,646,1274,325,329,1275,647,1273,1275,63,1276,647,647,1276,330,1277,1273,647,1277,426,426,1277,648,1279,1277,330,1278,648,648,1278,30,1209,1279,648,1209,312,325,1274,649,1259,1274,426,1279,649,649,1279,312,1206,1259,649,1206,28,65,1280,650,1283,1280,331,1281,650,650,1281,427,1282,1283,650,1282,332,331,1284,651,1281,1284,66,1266,651,651,1266,328,1285,1281,651,1285,427,427,1285,652,1286,1285,328,1271,652,652,1271,29,1218,1286,652,1218,314,332,1282,653,1287,1282,427,1286,653,653,1286,314,1214,1287,653,1214,31,63,1288,654,1276,1288,333,1289,654,654,1289,428,1290,1276,654,1290,330,333,1291,655,1289,1291,64,1292,655,655,1292,334,1293,1289,655,1293,428,428,1293,656,1295,1293,334,1294,656,656,1294,32,1225,1295,656,1225,316,330,1290,657,1278,1290,428,1295,657,657,1295, +316,1222,1278,657,1222,30,64,1296,658,1292,1296,335,1297,658,658,1297,429,1298,1292,658,1298,334,335,1299,659,1297,1299,65,1283,659,659,1283,332,1300,1297,659,1300,429,429,1300,660,1301,1300,332,1287,660,660,1287,31,1233,1301,660,1233,318,334,1298,661,1294,1298,429,1301,661,661,1301,318,1230,1294,661,1230,32,113,1302,662,1305,1302,336,1303,662,662,1303,430,1304,1305,662,1304,339,336,1306,663,1303,1306,104,1307,663,663,1307,337,1308,1303,663,1308,430,430,1308,664,1311,1308,337,1309,664,664,1309,50,1310,1311,664,1310,338,339,1304,665,1313,1304,430,1311,665,665,1311,338,1312,1313,665,1312,51,112,1314,666,1317,1314,340,1315,666,666,1315,431,1316,1317,666,1316,342,340,1318,667,1315,1318,113,1305,667,667,1305,339,1319,1315,667,1319,431,431,1319,668,1321,1319,339,1313,668,668,1313,51,1320,1321,668,1320,341,342,1316,669,1323,1316,431,1321,669,669,1321,341,1322,1323,669,1322,52,104,1324,670,1307,1324,343,1325,670,670,1325,432,1326,1307,670,1326,337,343,1327,671,1325,1327,105,1328,671,671,1328,344,1329,1325,671,1329,432,432,1329,672,1332,1329,344,1330,672,672,1330,59,1331,1332,672,1331,345,337,1326,673,1309,1326,432,1332,673,673,1332,345,1333,1309,673,1333,50,111,1334,674,1337,1334,346,1335,674,674,1335,433,1336,1337,674,1336,348,346,1338,675,1335,1338,112,1317,675,675,1317,342,1339,1335,675,1339,433,433,1339,676,1341,1339,342,1323,676,676,1323,52,1340,1341,676,1340,347,348,1336,677,1343,1336,433,1341,677,677,1341,347,1342,1343,677,1342,53,105,1344,678,1328,1344,349,1345,678,678,1345,434,1347,1328,678,1347,344,350,1348,679,1346,1348,106,1349,679,679,1349,351,1350,1346,679,1350,435,435,1350,680,1353,1350,351,1351,680,680,1351,58,1352,1353,680,1352,352,344,1347,681,1330,1347,434,1354,681,681,1354,353,1355,1330,681,1355,59,110,1356,682,1360,1356,354,1357,682,682,1357,436,1359,1360,682,1359,358,355,1361,683,1358,1361,111,1337,683,683,1337,348,1362,1358,683,1362,437,437,1362,684,1364,1362,348,1343,684,684,1343,53,1363,1364,684,1363,356,358,1359,685,1367,1359,436,1365,685,685,1365,357,1366,1367,685,1366,54,106,1368,686,1349,1368, +359,1369,686,686,1369,438,1370,1349,686,1370,351,359,1371,687,1369,1371,107,1372,687,687,1372,360,1373,1369,687,1373,438,438,1373,688,1376,1373,360,1374,688,688,1374,57,1375,1376,688,1375,361,351,1370,689,1351,1370,438,1376,689,689,1376,361,1377,1351,689,1377,58,109,1378,690,1381,1378,362,1379,690,690,1379,439,1380,1381,690,1380,364,362,1382,691,1379,1382,110,1360,691,691,1360,358,1383,1379,691,1383,439,439,1383,692,1385,1383,358,1367,692,692,1367,54,1384,1385,692,1384,363,364,1380,693,1387,1380,439,1385,693,693,1385,363,1386,1387,693,1386,55,107,1388,694,1372,1388,365,1389,694,694,1389,440,1390,1372,694,1390,360,365,1391,695,1389,1391,108,1392,695,695,1392,366,1393,1389,695,1393,440,440,1393,696,1396,1393,366,1394,696,696,1394,56,1395,1396,696,1395,367,360,1390,697,1374,1390,440,1396,697,697,1396,367,1397,1374,697,1397,57,108,1398,698,1392,1398,368,1399,698,698,1399,441,1400,1392,698,1400,366,368,1401,699,1399,1401,109,1381,699,699,1381,364,1402,1399,699,1402,441,441,1402,700,1404,1402,364,1387,700,700,1387,55,1403,1404,700,1403,369,366,1400,701,1394,1400,441,1404,701,701,1404,369,1405,1394,701,1405,56,51,1312,702,1408,1312,338,1406,702,702,1406,442,1407,1408,702,1407,372,338,1310,703,1406,1310,50,1409,703,703,1409,370,1410,1406,703,1410,442,442,1410,704,1413,1410,370,1411,704,704,1411,123,1412,1413,704,1412,371,372,1407,705,1415,1407,442,1413,705,705,1413,371,1414,1415,705,1414,114,52,1322,706,1418,1322,341,1416,706,706,1416,443,1417,1418,706,1417,374,341,1320,707,1416,1320,51,1408,707,707,1408,372,1419,1416,707,1419,443,443,1419,708,1421,1419,372,1415,708,708,1415,114,1420,1421,708,1420,373,374,1417,709,1423,1417,443,1421,709,709,1421,373,1422,1423,709,1422,115,53,1342,710,1426,1342,347,1424,710,710,1424,444,1425,1426,710,1425,376,347,1340,711,1424,1340,52,1418,711,711,1418,374,1427,1424,711,1427,444,444,1427,712,1429,1427,374,1423,712,712,1423,115,1428,1429,712,1428,375,376,1425,713,1431,1425,444,1429,713,713,1429,375,1430,1431,713,1430,116,54,1366,714,1435,1366,357,1432,714,714,1432,445,1434,1435,714,1434,379, +356,1363,715,1433,1363,53,1426,715,715,1426,376,1436,1433,715,1436,446,446,1436,716,1438,1436,376,1431,716,716,1431,116,1437,1438,716,1437,377,379,1434,717,1441,1434,445,1439,717,717,1439,378,1440,1441,717,1440,117,55,1386,718,1444,1386,363,1442,718,718,1442,447,1443,1444,718,1443,381,363,1384,719,1442,1384,54,1435,719,719,1435,379,1445,1442,719,1445,447,447,1445,720,1447,1445,379,1441,720,720,1441,117,1446,1447,720,1446,380,381,1443,721,1449,1443,447,1447,721,721,1447,380,1448,1449,721,1448,118,56,1405,722,1452,1405,369,1450,722,722,1450,448,1451,1452,722,1451,383,369,1403,723,1450,1403,55,1444,723,723,1444,381,1453,1450,723,1453,448,448,1453,724,1455,1453,381,1449,724,724,1449,118,1454,1455,724,1454,382,383,1451,725,1457,1451,448,1455,725,725,1455,382,1456,1457,725,1456,119,57,1397,726,1460,1397,367,1458,726,726,1458,449,1459,1460,726,1459,385,367,1395,727,1458,1395,56,1452,727,727,1452,383,1461,1458,727,1461,449,449,1461,728,1463,1461,383,1457,728,728,1457,119,1462,1463,728,1462,384,385,1459,729,1465,1459,449,1463,729,729,1463,384,1464,1465,729,1464,120,58,1377,730,1468,1377,361,1466,730,730,1466,450,1467,1468,730,1467,387,361,1375,731,1466,1375,57,1460,731,731,1460,385,1469,1466,731,1469,450,450,1469,732,1471,1469,385,1465,732,732,1465,120,1470,1471,732,1470,386,387,1467,733,1473,1467,450,1471,733,733,1471,386,1472,1473,733,1472,121,59,1355,734,1477,1355,353,1474,734,734,1474,451,1476,1477,734,1476,390,352,1352,735,1475,1352,58,1468,735,735,1468,387,1478,1475,735,1478,452,452,1478,736,1480,1478,387,1473,736,736,1473,121,1479,1480,736,1479,388,390,1476,737,1483,1476,451,1481,737,737,1481,389,1482,1483,737,1482,122,50,1333,738,1409,1333,345,1484,738,738,1484,453,1485,1409,738,1485,370,345,1331,739,1484,1331,59,1477,739,739,1477,390,1486,1484,739,1486,453,453,1486,740,1488,1486,390,1483,740,740,1483,122,1487,1488,740,1487,391,370,1485,741,1411,1485,453,1488,741,741,1488,391,1489,1411,741,1489,123,23,1490,742,1493,1490,392,1491,742,742,1491,454,1492,1493,742,1492,124,392,1494,743,1491,1494,33,1495,743,743,1495,393, +1496,1491,743,1496,454,454,1496,744,1498,1496,393,1497,744,744,1497,61,1239,1498,744,1239,319,124,1492,745,1499,1492,454,1498,745,745,1498,319,1236,1499,745,1236,60,33,1500,746,1495,1500,125,1501,746,746,1501,455,1503,1495,746,1503,393,126,1504,747,1502,1504,35,1505,747,747,1505,127,1506,1502,747,1506,456,456,1506,748,1508,1506,127,1507,748,748,1507,62,1256,1508,748,1256,324,393,1503,749,1497,1503,455,1509,749,749,1509,323,1252,1497,749,1252,61,35,1510,750,1505,1510,128,1511,750,750,1511,457,1512,1505,750,1512,127,128,1513,751,1511,1513,37,1514,751,751,1514,129,1515,1511,751,1515,457,457,1515,752,1517,1515,129,1516,752,752,1516,63,1275,1517,752,1275,329,127,1512,753,1507,1512,457,1517,753,753,1517,329,1272,1507,753,1272,62,37,1518,754,1514,1518,130,1519,754,754,1519,458,1520,1514,754,1520,129,130,1521,755,1519,1521,39,1522,755,755,1522,131,1523,1519,755,1523,458,458,1523,756,1525,1523,131,1524,756,756,1524,64,1291,1525,756,1291,333,129,1520,757,1516,1520,458,1525,757,757,1525,333,1288,1516,757,1288,63,39,1526,758,1522,1526,132,1527,758,758,1527,459,1528,1522,758,1528,131,132,1529,759,1527,1529,38,1530,759,759,1530,133,1531,1527,759,1531,459,459,1531,760,1533,1531,133,1532,760,760,1532,65,1299,1533,760,1299,335,131,1528,761,1524,1528,459,1533,761,761,1533,335,1296,1524,761,1296,64,38,1534,762,1530,1534,134,1535,762,762,1535,460,1536,1530,762,1536,133,134,1537,763,1535,1537,36,1538,763,763,1538,135,1539,1535,763,1539,460,460,1539,764,1541,1539,135,1540,764,764,1540,66,1284,1541,764,1284,331,133,1536,765,1532,1536,460,1541,765,765,1541,331,1280,1532,765,1280,65,36,1542,766,1538,1542,136,1543,766,766,1543,461,1545,1538,766,1545,135,137,1546,767,1544,1546,34,1547,767,767,1547,138,1548,1544,767,1548,462,462,1548,768,1550,1548,138,1549,768,768,1549,67,1267,1550,768,1267,327,135,1545,769,1540,1545,461,1551,769,769,1551,326,1262,1540,769,1262,66,34,1552,770,1547,1552,139,1553,770,770,1553,463,1554,1547,770,1554,138,139,1555,771,1553,1555,25,1556,771,771,1556,140,1557,1553,771,1557,463,463,1557,772,1559,1557,140,1558,772,772, +1558,68,1248,1559,772,1248,321,138,1554,773,1549,1554,463,1559,773,773,1559,321,1244,1549,773,1244,67,25,1560,774,1556,1560,141,1561,774,774,1561,464,1562,1556,774,1562,140,141,1563,775,1561,1563,24,1564,775,775,1564,142,1565,1561,775,1565,464,464,1565,776,1567,1565,142,1566,776,776,1566,69,1166,1567,776,1166,300,140,1562,777,1558,1562,464,1567,777,777,1567,300,1162,1558,777,1162,68,24,1568,778,1564,1568,143,1569,778,778,1569,465,1570,1564,778,1570,142,143,1571,779,1569,1571,23,1493,779,779,1493,124,1572,1569,779,1572,465,465,1572,780,1573,1572,124,1499,780,780,1499,60,1156,1573,780,1156,297,142,1570,781,1566,1570,465,1573,781,781,1573,297,1152,1566,781,1152,69,19,1574,782,1126,1574,144,1575,782,782,1575,466,1576,1126,782,1576,290,144,1577,783,1575,1577,70,1578,783,783,1578,145,1579,1575,783,1579,466,466,1579,784,1582,1579,145,1580,784,784,1580,71,1581,1582,784,1581,146,290,1576,785,1129,1576,466,1582,785,785,1582,146,1583,1129,785,1583,17,70,1577,786,1586,1577,144,1584,786,786,1584,467,1585,1586,786,1585,148,144,1574,787,1584,1574,19,1119,787,787,1119,287,1587,1584,787,1587,467,467,1587,788,1589,1587,287,1116,788,788,1116,14,1588,1589,788,1588,147,148,1585,789,1591,1585,467,1589,789,789,1589,147,1590,1591,789,1590,72,73,1592,790,1595,1592,149,1593,790,790,1593,468,1594,1595,790,1594,150,149,1596,791,1593,1596,1,1110,791,791,1110,284,1597,1593,791,1597,468,468,1597,792,1598,1597,284,1106,792,792,1106,17,1583,1598,792,1583,146,150,1594,793,1599,1594,468,1598,793,793,1598,146,1581,1599,793,1581,71,6,1600,794,1096,1600,151,1601,794,794,1601,469,1602,1096,794,1602,281,151,1603,795,1601,1603,74,1604,795,795,1604,152,1605,1601,795,1605,469,469,1605,796,1607,1605,152,1606,796,796,1606,72,1590,1607,796,1590,147,281,1602,797,1099,1602,469,1607,797,797,1607,147,1588,1099,797,1588,14,75,1608,798,1611,1608,153,1609,798,798,1609,470,1610,1611,798,1610,154,153,1612,799,1609,1612,73,1595,799,799,1595,150,1613,1609,799,1613,470,470,1613,800,1614,1613,150,1599,800,800,1599,71,1580,1614,800,1580,145,154,1610,801,1615,1610,470,1614, +801,801,1614,145,1578,1615,801,1578,70,74,1616,802,1604,1616,155,1617,802,802,1617,471,1618,1604,802,1618,152,155,1619,803,1617,1619,75,1611,803,803,1611,154,1620,1617,803,1620,471,471,1620,804,1621,1620,154,1615,804,804,1615,70,1586,1621,804,1586,148,152,1618,805,1606,1618,471,1621,805,805,1621,148,1591,1606,805,1591,72,76,1622,806,1626,1622,156,1623,806,806,1623,472,1625,1626,806,1625,158,157,1627,807,1624,1627,74,1603,807,807,1603,151,1628,1624,807,1628,473,473,1628,808,1629,1628,151,1600,808,808,1600,6,1049,1629,808,1049,265,158,1625,809,1631,1625,472,1630,809,809,1630,264,1044,1631,809,1044,5,73,1632,810,1592,1632,159,1633,810,810,1633,474,1635,1592,810,1635,149,160,1636,811,1634,1636,77,1637,811,811,1637,161,1638,1634,811,1638,475,475,1638,812,1640,1638,161,1639,812,812,1639,2,1039,1640,812,1039,260,149,1635,813,1596,1635,474,1641,813,813,1641,259,1036,1596,813,1036,1,11,1091,814,1644,1091,279,1642,814,814,1642,476,1643,1644,814,1643,164,279,1088,815,1642,1088,12,1645,815,815,1645,162,1646,1642,815,1646,476,476,1646,816,1649,1646,162,1647,816,816,1647,78,1648,1649,816,1648,163,164,1643,817,1651,1643,476,1649,817,817,1649,163,1650,1651,817,1650,79,12,1081,818,1645,1081,276,1652,818,818,1652,477,1653,1645,818,1653,162,276,1078,819,1652,1078,8,1654,819,819,1654,165,1655,1652,819,1655,477,477,1655,820,1658,1655,165,1656,820,820,1656,80,1657,1658,820,1657,166,162,1653,821,1647,1653,477,1658,821,821,1658,166,1659,1647,821,1659,78,76,1626,822,1662,1626,158,1660,822,822,1660,478,1661,1662,822,1661,167,158,1631,823,1660,1631,5,1072,823,823,1072,273,1663,1660,823,1663,478,478,1663,824,1664,1663,273,1068,824,824,1068,11,1644,1664,824,1644,164,167,1661,825,1665,1661,478,1664,825,825,1664,164,1651,1665,825,1651,79,2,1639,826,1058,1639,161,1666,826,826,1666,479,1667,1058,826,1667,270,161,1637,827,1666,1637,77,1668,827,827,1668,168,1669,1666,827,1669,479,479,1669,828,1671,1669,168,1670,828,828,1670,80,1656,1671,828,1656,165,270,1667,829,1061,1667,479,1671,829,829,1671,165,1654,1061,829,1654,8,79,1650,830,1665,1650,163,1672, +830,830,1672,480,1673,1665,830,1673,167,163,1648,831,1672,1648,78,1674,831,831,1674,169,1675,1672,831,1675,480,480,1675,832,1678,1675,169,1676,832,832,1676,81,1677,1678,832,1677,170,167,1673,833,1662,1673,480,1678,833,833,1678,170,1679,1662,833,1679,76,78,1659,834,1674,1659,166,1680,834,834,1680,481,1681,1674,834,1681,169,166,1657,835,1680,1657,80,1670,835,835,1670,168,1682,1680,835,1682,481,481,1682,836,1684,1682,168,1668,836,836,1668,77,1683,1684,836,1683,171,169,1681,837,1676,1681,481,1684,837,837,1684,171,1685,1676,837,1685,81,75,1619,838,1689,1619,155,1686,838,838,1686,482,1687,1689,838,1687,172,155,1616,839,1686,1616,74,1627,839,839,1627,157,1690,1686,839,1690,482,483,1691,840,1692,1691,156,1622,840,840,1622,76,1679,1692,840,1679,170,173,1688,841,1693,1688,483,1692,841,841,1692,170,1677,1693,841,1677,81,73,1612,842,1632,1612,153,1694,842,842,1694,484,1695,1632,842,1695,159,153,1608,843,1694,1608,75,1689,843,843,1689,172,1697,1694,843,1697,484,485,1698,844,1699,1698,173,1693,844,844,1693,81,1685,1699,844,1685,171,160,1696,845,1636,1696,485,1699,845,845,1699,171,1683,1636,845,1683,77,83,1700,846,1703,1700,174,1701,846,846,1701,486,1702,1703,846,1702,177,174,1704,847,1701,1704,82,1705,847,847,1705,175,1706,1701,847,1706,486,486,1706,848,1709,1706,175,1707,848,848,1707,41,1708,1709,848,1708,176,177,1702,849,1711,1702,486,1709,849,849,1709,176,1710,1711,849,1710,42,82,1712,850,1705,1712,178,1713,850,850,1713,487,1714,1705,850,1714,175,178,1715,851,1713,1715,84,1716,851,851,1716,179,1717,1713,851,1717,487,487,1717,852,1720,1717,179,1718,852,852,1718,40,1719,1720,852,1719,180,175,1714,853,1707,1714,487,1720,853,853,1720,180,1721,1707,853,1721,41,85,1722,854,1725,1722,181,1723,854,854,1723,488,1724,1725,854,1724,183,181,1726,855,1723,1726,83,1703,855,855,1703,177,1727,1723,855,1727,488,488,1727,856,1729,1727,177,1711,856,856,1711,42,1728,1729,856,1728,182,183,1724,857,1731,1724,488,1729,857,857,1729,182,1730,1731,857,1730,44,84,1732,858,1716,1732,184,1733,858,858,1733,489,1734,1716,858,1734,179,184,1735,859,1733,1735, +86,1736,859,859,1736,185,1737,1733,859,1737,489,489,1737,860,1740,1737,185,1738,860,860,1738,43,1739,1740,860,1739,186,179,1734,861,1718,1734,489,1740,861,861,1740,186,1741,1718,861,1741,40,87,1742,862,1746,1742,187,1743,862,862,1743,490,1745,1746,862,1745,191,188,1747,863,1744,1747,85,1725,863,863,1725,183,1748,1744,863,1748,491,491,1748,864,1750,1748,183,1731,864,864,1731,44,1749,1750,864,1749,189,191,1745,865,1753,1745,490,1751,865,865,1751,190,1752,1753,865,1752,46,86,1754,866,1736,1754,192,1755,866,866,1755,492,1757,1736,866,1757,185,193,1758,867,1756,1758,88,1759,867,867,1759,194,1760,1756,867,1760,493,493,1760,868,1763,1760,194,1761,868,868,1761,45,1762,1763,868,1762,195,185,1757,869,1738,1757,492,1764,869,869,1764,196,1765,1738,869,1765,43,89,1766,870,1769,1766,197,1767,870,870,1767,494,1768,1769,870,1768,199,197,1770,871,1767,1770,87,1746,871,871,1746,191,1771,1767,871,1771,494,494,1771,872,1773,1771,191,1753,872,872,1753,46,1772,1773,872,1772,198,199,1768,873,1775,1768,494,1773,873,873,1773,198,1774,1775,873,1774,48,88,1776,874,1759,1776,200,1777,874,874,1777,495,1778,1759,874,1778,194,200,1779,875,1777,1779,90,1780,875,875,1780,201,1781,1777,875,1781,495,495,1781,876,1784,1781,201,1782,876,876,1782,47,1783,1784,876,1783,202,194,1778,877,1761,1778,495,1784,877,877,1784,202,1785,1761,877,1785,45,91,1786,878,1789,1786,203,1787,878,878,1787,496,1788,1789,878,1788,205,203,1790,879,1787,1790,89,1769,879,879,1769,199,1791,1787,879,1791,496,496,1791,880,1793,1791,199,1775,880,880,1775,48,1792,1793,880,1792,204,205,1788,881,1795,1788,496,1793,881,881,1793,204,1794,1795,881,1794,49,90,1796,882,1780,1796,206,1797,882,882,1797,497,1798,1780,882,1798,201,206,1799,883,1797,1799,91,1789,883,883,1789,205,1800,1797,883,1800,497,497,1800,884,1802,1800,205,1795,884,884,1795,49,1801,1802,884,1801,207,201,1798,885,1782,1798,497,1802,885,885,1802,207,1803,1782,885,1803,47,93,1804,886,1807,1804,208,1805,886,886,1805,498,1806,1807,886,1806,210,208,1808,887,1805,1808,92,1809,887,887,1809,209,1810,1805,887,1810,498,498,1810,888, +1812,1810,209,1811,888,888,1811,91,1799,1812,888,1799,206,210,1806,889,1813,1806,498,1812,889,889,1812,206,1796,1813,889,1796,90,92,1814,890,1809,1814,211,1815,890,890,1815,499,1816,1809,890,1816,209,211,1817,891,1815,1817,94,1818,891,891,1818,212,1819,1815,891,1819,499,499,1819,892,1821,1819,212,1820,892,892,1820,89,1790,1821,892,1790,203,209,1816,893,1811,1816,499,1821,893,893,1821,203,1786,1811,893,1786,91,95,1822,894,1825,1822,213,1823,894,894,1823,500,1824,1825,894,1824,214,213,1826,895,1823,1826,93,1807,895,895,1807,210,1827,1823,895,1827,500,500,1827,896,1828,1827,210,1813,896,896,1813,90,1779,1828,896,1779,200,214,1824,897,1829,1824,500,1828,897,897,1828,200,1776,1829,897,1776,88,94,1830,898,1818,1830,215,1831,898,898,1831,501,1832,1818,898,1832,212,215,1833,899,1831,1833,96,1834,899,899,1834,216,1835,1831,899,1835,501,501,1835,900,1837,1835,216,1836,900,900,1836,87,1770,1837,900,1770,197,212,1832,901,1820,1832,501,1837,901,901,1837,197,1766,1820,901,1766,89,97,1838,902,1842,1838,217,1839,902,902,1839,502,1841,1842,902,1841,219,218,1843,903,1840,1843,95,1825,903,903,1825,214,1844,1840,903,1844,503,503,1844,904,1845,1844,214,1829,904,904,1829,88,1758,1845,904,1758,193,219,1841,905,1847,1841,502,1846,905,905,1846,192,1754,1847,905,1754,86,96,1848,906,1834,1848,220,1849,906,906,1849,504,1851,1834,906,1851,216,221,1852,907,1850,1852,98,1853,907,907,1853,222,1854,1850,907,1854,505,505,1854,908,1856,1854,222,1855,908,908,1855,85,1747,1856,908,1747,188,216,1851,909,1836,1851,504,1857,909,909,1857,187,1742,1836,909,1742,87,99,1858,910,1861,1858,223,1859,910,910,1859,506,1860,1861,910,1860,224,223,1862,911,1859,1862,97,1842,911,911,1842,219,1863,1859,911,1863,506,506,1863,912,1864,1863,219,1847,912,912,1847,86,1735,1864,912,1735,184,224,1860,913,1865,1860,506,1864,913,913,1864,184,1732,1865,913,1732,84,98,1866,914,1853,1866,225,1867,914,914,1867,507,1868,1853,914,1868,222,225,1869,915,1867,1869,100,1870,915,915,1870,226,1871,1867,915,1871,507,507,1871,916,1873,1871,226,1872,916,916,1872,83,1726,1873,916,1726,181,222, +1868,917,1855,1868,507,1873,917,917,1873,181,1722,1855,917,1722,85,84,1715,918,1865,1715,178,1874,918,918,1874,508,1875,1865,918,1875,224,178,1712,919,1874,1712,82,1876,919,919,1876,227,1877,1874,919,1877,508,508,1877,920,1880,1877,227,1878,920,920,1878,101,1879,1880,920,1879,228,224,1875,921,1861,1875,508,1880,921,921,1880,228,1881,1861,921,1881,99,82,1704,922,1876,1704,174,1882,922,922,1882,509,1883,1876,922,1883,227,174,1700,923,1882,1700,83,1872,923,923,1872,226,1884,1882,923,1884,509,509,1884,924,1886,1884,226,1870,924,924,1870,100,1885,1886,924,1885,229,227,1883,925,1878,1883,509,1886,925,925,1886,229,1887,1878,925,1887,101,95,1888,926,1822,1888,230,1889,926,926,1889,510,1890,1822,926,1890,213,230,1891,927,1889,1891,102,1892,927,927,1892,231,1893,1889,927,1893,510,510,1893,928,1895,1893,231,1894,928,928,1894,92,1808,1895,928,1808,208,213,1890,929,1826,1890,510,1895,929,929,1895,208,1804,1826,929,1804,93,102,1896,930,1892,1896,232,1897,930,930,1897,511,1898,1892,930,1898,231,232,1899,931,1897,1899,96,1833,931,931,1833,215,1900,1897,931,1900,511,511,1900,932,1901,1900,215,1830,932,932,1830,94,1817,1901,932,1817,211,231,1898,933,1894,1898,511,1901,933,933,1901,211,1814,1894,933,1814,92,103,1902,934,1905,1902,233,1903,934,934,1903,512,1904,1905,934,1904,234,233,1906,935,1903,1906,97,1862,935,935,1862,223,1907,1903,935,1907,512,512,1907,936,1908,1907,223,1858,936,936,1858,99,1881,1908,936,1881,228,234,1904,937,1909,1904,512,1908,937,937,1908,228,1879,1909,937,1879,101,98,1910,938,1866,1910,235,1911,938,938,1911,513,1912,1866,938,1912,225,235,1913,939,1911,1913,103,1905,939,939,1905,234,1914,1911,939,1914,513,513,1914,940,1915,1914,234,1909,940,940,1909,101,1887,1915,940,1887,229,225,1912,941,1869,1912,513,1915,941,941,1915,229,1885,1869,941,1885,100,97,1906,942,1838,1906,233,1916,942,942,1916,514,1917,1838,942,1917,217,233,1902,943,1916,1902,103,1919,943,943,1919,236,1920,1916,943,1920,514,515,1921,944,1923,1921,237,1922,944,944,1922,102,1891,1923,944,1891,230,218,1918,945,1843,1918,515,1923,945,945,1923,230,1888, +1843,945,1888,95,103,1913,946,1919,1913,235,1924,946,946,1924,516,1925,1919,946,1925,236,235,1910,947,1924,1910,98,1852,947,947,1852,221,1927,1924,947,1927,516,517,1928,948,1929,1928,220,1848,948,948,1848,96,1899,1929,948,1899,232,237,1926,949,1922,1926,517,1929,949,949,1929,232,1896,1922,949,1896,102,40,1741,950,1932,1741,186,1930,950,950,1930,518,1931,1932,950,1931,239,186,1739,951,1930,1739,43,1933,951,951,1933,238,1934,1930,951,1934,518,518,1934,952,1936,1934,238,1935,952,952,1935,105,1327,1936,952,1327,343,239,1931,953,1937,1931,518,1936,953,953,1936,343,1324,1937,953,1324,104,43,1765,954,1933,1765,196,1938,954,954,1938,519,1940,1933,954,1940,238,195,1762,955,1939,1762,45,1941,955,955,1941,240,1942,1939,955,1942,520,520,1942,956,1944,1942,240,1943,956,956,1943,106,1348,1944,956,1348,350,238,1940,957,1935,1940,519,1945,957,957,1945,349,1344,1935,957,1344,105,45,1785,958,1941,1785,202,1946,958,958,1946,521,1947,1941,958,1947,240,202,1783,959,1946,1783,47,1948,959,959,1948,241,1949,1946,959,1949,521,521,1949,960,1951,1949,241,1950,960,960,1950,107,1371,1951,960,1371,359,240,1947,961,1943,1947,521,1951,961,961,1951,359,1368,1943,961,1368,106,47,1803,962,1948,1803,207,1952,962,962,1952,522,1953,1948,962,1953,241,207,1801,963,1952,1801,49,1954,963,963,1954,242,1955,1952,963,1955,522,522,1955,964,1957,1955,242,1956,964,964,1956,108,1391,1957,964,1391,365,241,1953,965,1950,1953,522,1957,965,965,1957,365,1388,1950,965,1388,107,49,1794,966,1954,1794,204,1958,966,966,1958,523,1959,1954,966,1959,242,204,1792,967,1958,1792,48,1960,967,967,1960,243,1961,1958,967,1961,523,523,1961,968,1963,1961,243,1962,968,968,1962,109,1401,1963,968,1401,368,242,1959,969,1956,1959,523,1963,969,969,1963,368,1398,1956,969,1398,108,48,1774,970,1960,1774,198,1964,970,970,1964,524,1965,1960,970,1965,243,198,1772,971,1964,1772,46,1966,971,971,1966,244,1967,1964,971,1967,524,524,1967,972,1969,1967,244,1968,972,972,1968,110,1382,1969,972,1382,362,243,1965,973,1962,1965,524,1969,973,973,1969,362,1378,1962,973,1378,109,46,1752,974,1966,1752,190,1970, +974,974,1970,525,1972,1966,974,1972,244,189,1749,975,1971,1749,44,1973,975,975,1973,245,1974,1971,975,1974,526,526,1974,976,1976,1974,245,1975,976,976,1975,111,1361,1976,976,1361,355,244,1972,977,1968,1972,525,1977,977,977,1977,354,1356,1968,977,1356,110,44,1730,978,1973,1730,182,1978,978,978,1978,527,1979,1973,978,1979,245,182,1728,979,1978,1728,42,1980,979,979,1980,246,1981,1978,979,1981,527,527,1981,980,1983,1981,246,1982,980,980,1982,112,1338,1983,980,1338,346,245,1979,981,1975,1979,527,1983,981,981,1983,346,1334,1975,981,1334,111,42,1710,982,1980,1710,176,1984,982,982,1984,528,1985,1980,982,1985,246,176,1708,983,1984,1708,41,1986,983,983,1986,247,1987,1984,983,1987,528,528,1987,984,1989,1987,247,1988,984,984,1988,113,1318,1989,984,1318,340,246,1985,985,1982,1985,528,1989,985,985,1989,340,1314,1982,985,1314,112,41,1721,986,1986,1721,180,1990,986,986,1990,529,1991,1986,986,1991,247,180,1719,987,1990,1719,40,1932,987,987,1932,239,1992,1990,987,1992,529,529,1992,988,1993,1992,239,1937,988,988,1937,104,1306,1993,988,1306,336,247,1991,989,1988,1991,529,1993,989,989,1993,336,1302,1988,989,1302,113,115,1422,990,1996,1422,373,1994,990,990,1994,530,1995,1996,990,1995,249,373,1420,991,1994,1420,114,1997,991,991,1997,248,1998,1994,991,1998,530,530,1998,992,2000,1998,248,1999,992,992,1999,24,1563,2000,992,1563,141,249,1995,993,2001,1995,530,2000,993,993,2000,141,1560,2001,993,1560,25,116,1430,994,2004,1430,375,2002,994,994,2002,531,2003,2004,994,2003,250,375,1428,995,2002,1428,115,1996,995,995,1996,249,2005,2002,995,2005,531,531,2005,996,2006,2005,249,2001,996,996,2001,25,1555,2006,996,1555,139,250,2003,997,2007,2003,531,2006,997,997,2006,139,1552,2007,997,1552,34,117,1440,998,2011,1440,378,2008,998,998,2008,532,2010,2011,998,2010,251,377,1437,999,2009,1437,116,2004,999,999,2004,250,2012,2009,999,2012,533,533,2012,1000,2013,2012,250,2007,1000,1000,2007,34,1546,2013,1000,1546,137,251,2010,1001,2015,2010,532,2014,1001,1001,2014,136,1542,2015,1001,1542,36,118,1448,1002,2018,1448,380,2016,1002,1002,2016,534,2017,2018,1002,2017, +252,380,1446,1003,2016,1446,117,2011,1003,1003,2011,251,2019,2016,1003,2019,534,534,2019,1004,2020,2019,251,2015,1004,1004,2015,36,1537,2020,1004,1537,134,252,2017,1005,2021,2017,534,2020,1005,1005,2020,134,1534,2021,1005,1534,38,119,1456,1006,2024,1456,382,2022,1006,1006,2022,535,2023,2024,1006,2023,253,382,1454,1007,2022,1454,118,2018,1007,1007,2018,252,2025,2022,1007,2025,535,535,2025,1008,2026,2025,252,2021,1008,1008,2021,38,1529,2026,1008,1529,132,253,2023,1009,2027,2023,535,2026,1009,1009,2026,132,1526,2027,1009,1526,39,120,1464,1010,2030,1464,384,2028,1010,1010,2028,536,2029,2030,1010,2029,254,384,1462,1011,2028,1462,119,2024,1011,1011,2024,253,2031,2028,1011,2031,536,536,2031,1012,2032,2031,253,2027,1012,1012,2027,39,1521,2032,1012,1521,130,254,2029,1013,2033,2029,536,2032,1013,1013,2032,130,1518,2033,1013,1518,37,121,1472,1014,2036,1472,386,2034,1014,1014,2034,537,2035,2036,1014,2035,255,386,1470,1015,2034,1470,120,2030,1015,1015,2030,254,2037,2034,1015,2037,537,537,2037,1016,2038,2037,254,2033,1016,1016,2033,37,1513,2038,1016,1513,128,255,2035,1017,2039,2035,537,2038,1017,1017,2038,128,1510,2039,1017,1510,35,122,1482,1018,2043,1482,389,2040,1018,1018,2040,538,2042,2043,1018,2042,256,388,1479,1019,2041,1479,121,2036,1019,1019,2036,255,2044,2041,1019,2044,539,539,2044,1020,2045,2044,255,2039,1020,1020,2039,35,1504,2045,1020,1504,126,256,2042,1021,2047,2042,538,2046,1021,1021,2046,125,1500,2047,1021,1500,33,123,1489,1022,2050,1489,391,2048,1022,1022,2048,540,2049,2050,1022,2049,257,391,1487,1023,2048,1487,122,2043,1023,1023,2043,256,2051,2048,1023,2051,540,540,2051,1024,2052,2051,256,2047,1024,1024,2047,33,1494,2052,1024,1494,392,257,2049,1025,2053,2049,540,2052,1025,1025,2052,392,1490,2053,1025,1490,23,114,1414,1026,1997,1414,371,2054,1026,1026,2054,541,2055,1997,1026,2055,248,371,1412,1027,2054,1412,123,2050,1027,1027,2050,257,2056,2054,1027,2056,541,541,2056,1028,2057,2056,257,2053,1028,1028,2053,23,1571,2057,1028,1571,143,248,2055,1029,1999,2055,541,2057,1029,1029,2057,143,1568,1999,1029,1568,24 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *3904 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 1576471717968, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + NodeAttribute: 1576471716384, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 1579360694320, "Geometry::", "Mesh" { + Vertices: *1470 { + a: 17.1498184204102,58.6990737915039,-6.59732818603516,9.23396587371826,62.6683120727539,-4.06932687759399,9.42551898956299,62.5493698120117,3.30870938301086,17.2017097473145,58.5136604309082,4.95361089706421,-17.2017078399658,58.5136566162109,4.95361042022705,-9.42551898956299,62.5493698120117,3.30870938301086,-9.23396682739258,62.6683120727539,-4.06932640075684,-17.1498165130615,58.6990737915039,-6.59732818603516,6.16464233398438,62.5207672119141,9.40175247192383,10.4034080505371,58.0991592407227,14.1463708877563,-10.4034080505371,58.0991516113281,14.1463708877563,-6.16464185714722,62.5207672119141,9.40175151824951,0,62.1556549072266,11.1624231338501,0,57.5221328735352,17.6343784332275,-5.79188013076782,62.5290679931641,-9.90773773193359,-10.3031740188599,58.3692588806152,-15.3854894638062,10.3031740188599,58.3692588806152,-15.3854885101318,5.79188013076782,62.5290679931641,-9.90773868560791,0,58.1334686279297,-18.3144512176514,0,61.9016723632813,-11.8515644073486,14.2862720489502,52.387035369873,19.1016407012939,-2.98023223876953e-08,51.9333419799805,23.485818862915,-14.2862720489502,52.387035369873,19.1016407012939,19.4298458099365,30.6384506225586,25.9374446868896,-8.94069671630859e-08,30.4336109161377,32.1220512390137,-19.4298477172852,30.63844871521,25.9374446868896,23.2146110534668,52.3912620544434,6.91212701797485,-23.2146110534668,52.3912620544434,6.91212701797485,22.9110202789307,52.789234161377,-8.08729076385498,-22.911018371582,52.7892303466797,-8.08729076385498,14.3836946487427,52.2071685791016,-20.1748085021973,-14.3836946487427,52.2071647644043,-20.1748085021973,0,51.5859375,-25.1397857666016,30.9698276519775,30.9077606201172,9.83706665039063,-30.9698257446289,30.9077606201172,9.83706665039063,30.4192600250244,31.4140739440918,-9.88956546783447,-30.4192581176758,31.4140758514404,-9.88956546783447,19.042200088501,31.2974834442139,-26.0835342407227,-19.042200088501,31.2974796295166,-26.0835380554199,-2.98023223876953e-08,30.9177188873291,-32.2630195617676,11.6584186553955,2.81797289848328,16.1972103118896, +0,3.08804631233215,18.6410331726074,-11.6584196090698,2.8179726600647,16.1972103118896,18.7568054199219,2.55972599983215,7.57546806335449,-18.7568054199219,2.55972623825073,7.57546854019165,18.9283924102783,2.55927801132202,-4.48369979858398,-18.9283924102783,2.55927801132202,-4.48369979858398,12.7771444320679,2.85302925109863,-15.0726308822632,-12.7771453857422,2.85302925109863,-15.0726318359375,4.4703483581543e-08,3.22369432449341,-18.6140117645264,17.7234134674072,12.1657905578613,24.3231143951416,1.34110450744629e-07,12.4124174118042,29.3907356262207,-17.72340965271,12.1657905578613,24.3231143951416,-29.3412113189697,11.9619293212891,10.1158514022827,-29.778980255127,12.2538251876831,-8.60200595855713,-18.5831680297852,11.9051971435547,-23.4523983001709,1.19209289550781e-07,11.6796493530273,-28.673152923584,18.5831680297852,11.9051952362061,-23.4523983001709,29.778980255127,12.2538261413574,-8.60200595855713,29.3412113189697,11.9619293212891,10.1158514022827,17.5152244567871,42.7330513000488,23.1387252807617,28.5338649749756,43.0818328857422,8.81792545318604,28.0490226745605,43.4706726074219,-9.3085823059082,17.272497177124,42.8749237060547,-23.8687343597412,5.96046447753906e-08,41.9653053283691,-29.8266162872314,-17.272497177124,42.8749237060547,-23.8687343597412,-28.0490226745605,43.4706687927246,-9.3085823059082,-28.5338668823242,43.0818328857422,8.81792545318604,-17.5152244567871,42.7330474853516,23.1387252807617,0,42.1962661743164,28.1071834564209,0,64.0154571533203,-7.22700929641724,3.32104897499084,63.9826049804688,-6.75547742843628,-3.32104897499084,63.9826011657715,-6.75547742843628,4.169837474823,64.1351776123047,-2.84012269973755,-4.169837474823,64.1351776123047,-2.84012246131897,7.45058059692383e-09,64.2933731079102,-2.70171570777893,-4.27164649963379,64.1184921264648,2.32376766204834,4.27164649963379,64.1184921264648,2.32376766204834,0,64.0785140991211,6.96037244796753,-3.54138445854187,63.9958763122559,6.44315099716187,3.54138445854187,63.9958801269531,6.44315099716187,0,64.2933654785156,2.18397116661072, +1.49011611938477e-08,1.09293019771576,13.4126176834106,-7.56978893280029,0.697463691234589,11.4772262573242,7.56978893280029,0.697463691234589,11.4772272109985,-11.6248922348022,0.459907740354538,5.27760410308838,11.6248922348022,0.459907740354538,5.27760410308838,-11.7356433868408,0.441193580627441,-3.01107025146484,11.7356433868408,0.441193580627441,-3.01107048988342,-8.1139497756958,0.567370355129242,-10.3213329315186,8.1139497756958,0.567370355129242,-10.3213329315186,-1.49011611938477e-08,1.11019134521484,-13.1655988693237,-1.49011611938477e-08,0.237562894821167,-7.69978952407837,4.70867204666138,0.168171033263206,-6.89842987060547,-4.70867204666138,0.168171033263206,-6.89842987060547,5.5949501991272,0.140727460384369,-2.1382269859314,-5.59494972229004,0.140727460384369,-2.13822674751282,5.54225587844849,0.143535912036896,3.83291745185852,-5.5422568321228,0.143535912036896,3.83291745185852,4.50661468505859,0.208235591650009,8.22657680511475,-4.50661420822144,0.208235591650009,8.22657680511475,2.98023223876953e-08,0.238170742988586,8.77193260192871,1.49011611938477e-08,0.138248026371002,-2.10000085830688,-2.23517417907715e-08,0.138633489608765,3.61390352249146,15.1637115478516,6.06876182556152,20.2984771728516,25.5626239776611,5.83420181274414,9.003173828125,26.1484699249268,6.01492643356323,-6.69755363464355,16.4208068847656,6.25550985336304,-19.356595993042,-1.19209289550781e-07,6.30241823196411,-23.7513961791992,-16.4208068847656,6.25550985336304,-19.356595993042,-26.1484699249268,6.01492643356323,-6.69755411148071,-25.5626239776611,5.83420181274414,9.00317478179932,-15.1637115478516,6.06876182556152,20.2984771728516,0,6.17357063293457,23.8685550689697,-1.19209289550781e-07,21.301549911499,32.7829284667969,-19.4807815551758,21.223518371582,26.6846008300781,-31.4933204650879,21.3787670135498,10.722038269043,-31.4294395446777,21.8314418792725,-9.47481822967529,-20.039478302002,21.4647827148438,-26.2077217102051,-8.94069671630859e-08,21.4056568145752,-32.5362663269043,20.0394802093506,21.4647846221924,-26.2077217102051, +31.4294395446777,21.8314399719238,-9.47481918334961,31.4933185577393,21.3787670135498,10.7220373153687,19.4807815551758,21.223518371582,26.6846008300781,18.6769733428955,36.6196517944336,24.732084274292,32.1817054748535,31.1841049194336,-0.018093466758728,29.5037307739258,37.4160537719727,-9.71445751190186,25.9362716674805,31.4335098266602,-18.871561050415,18.2526683807373,37.0822563171387,-25.1926383972168,10.0465049743652,31.0610389709473,-30.6449508666992,0,36.3891868591309,-31.2912750244141,-10.0465049743652,31.0610389709473,-30.6449508666992,-18.2526683807373,37.0822563171387,-25.1926383972168,-25.9362716674805,31.4335098266602,-18.871561050415,-29.5037307739258,37.4160537719727,-9.71445751190186,-32.1817054748535,31.1841068267822,-0.018093466758728,-30.0678119659424,36.9698295593262,9.38340187072754,-26.5298480987549,30.7491912841797,18.7701225280762,-18.6769733428955,36.6196517944336,24.732084274292,-10.2379093170166,30.505578994751,30.4954090118408,1.19209289550781e-07,36.218132019043,30.3451614379883,10.2379093170166,30.505578994751,30.4954090118408,0,63.1817016601563,-9.40143203735352,1.88734459877014,64.0567398071289,-7.06734657287598,4.26540613174438,63.5941390991211,-7.98263549804688,-4.26540660858154,63.5941390991211,-7.98263549804688,-1.88734459877014,64.0567398071289,-7.06734657287598,6.40165567398071,63.6606025695801,-3.26878261566162,3.76734852790833,64.1388626098633,-5.14301633834839,-6.40165567398071,63.6606025695801,-3.26878261566162,-3.76734852790833,64.1388626098633,-5.14301633834839,2.05553913116455,64.2933578491211,-2.69979596138,0,64.2933578491211,-5.00440216064453,-2.05553913116455,64.2933578491211,-2.69979596138,-4.34127807617188,64.1250152587891,-0.278512895107269,-6.57116317749023,63.5938491821289,2.71166467666626,4.34127807617188,64.1250152587891,-0.278512895107269,6.57116317749023,63.5938491821289,2.71166467666626,-2.98023223876953e-08,63.433952331543,8.92996978759766,-2.02140522003174,64.0989227294922,6.79345798492432,-4.58938503265381,63.6240119934082,7.65124893188477,4.58938503265381,63.6240158081055,7.65124845504761, +2.02140522003174,64.0989227294922,6.79345798492432,-3.95092153549194,64.1256866455078,4.74867486953735,3.95092153549194,64.1256866455078,4.74867486953735,0,64.2933578491211,4.65574312210083,-2.10308480262756,64.2933578491211,2.18846988677979,2.10308480262756,64.2933578491211,2.18846988677979,0,64.2933578491211,-0.287053227424622,-4.03588056564331,0.945739984512329,12.9646415710449,-5.96046447753906e-08,1.9702296257019,15.9855899810791,-6.13161516189575,2.99406361579895,18.1152114868164,-9.59832859039307,1.59299838542938,13.8057088851929,4.03588056564331,0.945739984512329,12.9646415710449,9.59832859039307,1.59299838542938,13.8057088851929,6.13161516189575,2.99406361579895,18.1152114868164,-10.0997514724731,0.541395664215088,8.80689144134521,-15.9756021499634,2.66562795639038,12.5464944839478,-15.1091251373291,1.32572114467621,6.43920612335205,10.0997514724731,0.541395664215088,8.80689144134521,15.1091251373291,1.32572114467621,6.43920612335205,15.9756021499634,2.66562795639038,12.5464944839478,-12.1443395614624,0.43537175655365,1.2133412361145,-19.6756706237793,2.52296304702759,1.69654655456543,-15.2179403305054,1.30053198337555,-3.65801525115967,12.1443395614624,0.43537175655365,1.2133412361145,15.2179403305054,1.30053198337555,-3.65801525115967,19.6756706237793,2.52296328544617,1.69654655456543,-10.476357460022,0.45077908039093,-7.02080345153809,-16.7111663818359,2.67260885238647,-10.3586959838867,-10.4413509368896,1.51596570014954,-12.6664352416992,10.476357460022,0.45077908039093,-7.02080345153809,10.4413509368896,1.51596570014954,-12.6664352416992,16.7111663818359,2.67260885238647,-10.3586959838867,-4.39588832855225,0.894209623336792,-12.4181308746338,-6.87948274612427,3.09061193466187,-17.7696952819824,0,2.03422093391418,-15.9107418060303,4.39588832855225,0.894209623336792,-12.4181308746338,6.87948274612427,3.09061193466187,-17.7696971893311,2.69254350662231,0.204351663589478,-7.40591096878052,0,0.536456346511841,-10.4377841949463,6.12753963470459,0.205884099006653,-8.31491756439209,-2.69254350662231,0.204351663589478,-7.40591096878052, +-6.12753963470459,0.205884099006653,-8.31491756439209,5.20567560195923,0.139652848243713,-4.90381813049316,8.55663204193115,0.148150324821472,-2.47856879234314,-5.20567560195923,0.139652848243713,-4.90381765365601,-8.55663204193115,0.148150324821472,-2.47856879234314,5.7121639251709,0.140405774116516,0.874358415603638,8.46994209289551,0.158236503601074,4.39592409133911,-5.7121639251709,0.140405774116516,0.874358415603638,-8.46994209289551,0.158236503601074,4.39592409133911,5.07016515731812,0.154965996742249,6.43643045425415,5.79843473434448,0.294939398765564,9.56618022918701,-5.07016515731812,0.154965996742249,6.43643045425415,-5.79843473434448,0.294939398765564,9.56618022918701,0,0.535893440246582,11.0787315368652,2.57340312004089,0.215614557266235,8.58549690246582,-2.57340312004089,0.215614557266235,8.58549690246582,2.76463341712952,0.138250231742859,-2.06776356697083,-2.98023223876953e-08,0.138057470321655,-4.92410373687744,-2.76463341712952,0.138250231742859,-2.06776356697083,2.73981642723083,0.138634443283081,3.62733697891235,0,0.138813495635986,6.28022766113281,-2.73981642723083,0.138634443283081,3.62733697891235,0,0.138442516326904,0.783247828483582,22.4021015167236,3.96597146987915,8.38113307952881,13.5244216918945,4.208815574646,18.297327041626,22.7918643951416,4.05054473876953,-5.55242252349854,14.7887353897095,4.37992000579834,-17.2623291015625,0,4.59376001358032,-21.2162036895752,-14.7887353897095,4.37992000579834,-17.2623291015625,-22.7918643951416,4.05054473876953,-5.55242252349854,-22.4021015167236,3.96597146987915,8.38113307952881,-13.5244216918945,4.208815574646,18.297327041626,0,4.36663293838501,21.2223320007324,0,25.6673049926758,32.9620742797852,-19.7005767822266,25.7175159454346,26.6542510986328,-31.5178985595703,25.9471130371094,10.3815755844116,-31.1671714782715,26.4499416351318,-9.76867580413818,-19.7591915130615,26.255989074707,-26.47629737854,0,26.1026344299316,-32.8243217468262,19.7591915130615,26.255989074707,-26.47629737854,31.1671695709229,26.4499416351318,-9.76867580413818,31.5178985595703,25.9471130371094,10.3815746307373, +19.7005767822266,25.7175140380859,26.6542510986328,13.1497449874878,60.9569435119629,-5.3253059387207,9.75613594055176,62.6061935424805,-0.405417263507843,13.2586069107056,60.8149185180664,4.071448802948,18.0880546569824,58.6565170288086,-0.847099900245667,-9.75613594055176,62.6061935424805,-0.405417233705521,-13.1497449874878,60.9569435119629,-5.3253059387207,-18.0880546569824,58.6565170288086,-0.847099900245667,-13.2586069107056,60.8149185180664,4.071448802948,8.21944808959961,62.5613327026367,6.74327182769775,8.21017265319824,60.5497093200684,11.643238067627,14.4844284057617,58.3433685302734,10.0879545211792,-8.21944808959961,62.5613327026367,6.74327182769775,-14.4844284057617,58.3433685302734,10.0879554748535,-8.21017265319824,60.5497093200684,11.643238067627,3.28782439231873,62.3063354492188,10.7876310348511,5.96046447753906e-08,60.0395622253418,14.2556133270264,5.42584037780762,57.734546661377,16.7192916870117,-3.28782439231873,62.3063354492188,10.7876310348511,-5.42584037780762,57.734546661377,16.7192916870117,-7.88168096542358,62.6721954345703,-7.35323619842529,-7.94071435928345,60.7322654724121,-12.5450668334961,-14.3933382034302,58.5684585571289,-11.5802297592163,7.88168096542358,62.6721954345703,-7.35323667526245,14.3933382034302,58.5684585571289,-11.580228805542,7.94071435928345,60.7322654724121,-12.5450668334961,-3.05716824531555,62.1501007080078,-11.3834247589111,0,60.2848510742188,-14.9012985229492,-5.36387157440186,58.2060623168945,-17.6027889251709,3.05716824531555,62.1501007080078,-11.3834247589111,5.36387157440186,58.2060623168945,-17.6027908325195,7.48518180847168,52.1267852783203,22.3765277862549,12.4217777252197,55.5574264526367,16.681812286377,0,55.0398254394531,20.7235488891602,-7.48518180847168,52.1267852783203,22.3765277862549,-12.4217777252197,55.5574264526367,16.681812286377,9.16885471343994,42.3994331359863,26.8739852905273,16.0178718566895,48.0505447387695,21.2579288482666,-5.96046447753906e-08,47.5434112548828,25.8838844299316,-9.16885471343994,42.3994331359863,26.8739852905273,-16.0178718566895,48.0505447387695,21.2579288482666, +19.7191753387451,52.3940277099609,13.7141561508179,20.3861122131348,55.7687454223633,5.90891933441162,-19.7191753387451,52.3940277099609,13.7141561508179,-20.3861122131348,55.7687454223633,5.90891933441162,24.2032985687256,52.622257232666,-0.606388628482819,20.2350025177002,56.0672645568848,-7.44599914550781,-20.2350025177002,56.0672645568848,-7.44599914550781,-24.2032985687256,52.622257232666,-0.606388688087463,19.5635509490967,52.5944175720215,-14.776481628418,12.4705286026001,55.6055641174316,-17.9198627471924,-19.5635528564453,52.5944175720215,-14.776481628418,-12.4705286026001,55.6055641174316,-17.9198627471924,7.59424543380737,51.7968559265137,-23.7831249237061,0,55.2497367858887,-21.8548393249512,-7.59424543380737,51.7968559265137,-23.7831249237061,24.2166233062744,42.9212265014648,16.8657264709473,26.0899963378906,48.1923027038574,7.93797969818115,-24.2166213989258,42.9212303161621,16.8657264709473,-26.0899963378906,48.1923027038574,7.93797969818115,29.7277660369873,43.3327484130859,-0.241753578186035,25.683572769165,48.5927200317383,-8.73717212677002,-29.7277660369873,43.3327484130859,-0.241753578186035,-25.683572769165,48.5927200317383,-8.73717212677002,23.7483291625977,43.2923583984375,-17.3778343200684,15.9835958480835,47.9400939941406,-22.176944732666,-23.7483291625977,43.2923583984375,-17.3778343200684,-15.9835958480835,47.9400939941406,-22.176944732666,9.06833267211914,42.2955131530762,-28.200511932373,1.19209289550781e-07,47.0943374633789,-27.7865791320801,-9.06833267211914,42.2955131530762,-28.200511932373,7.86938762664795,6.14854526519775,23.0258083343506,16.5436630249023,8.70104789733887,22.3930740356445,9.2471809387207,12.3289470672607,28.1021022796631,0,8.87643814086914,26.7187519073486,-7.86938762664795,6.14854526519775,23.0258083343506,-9.2471809387207,12.3289470672607,28.1021022796631,-16.5436630249023,8.70104789733887,22.3930740356445,21.3079109191895,5.92951536178589,15.4874382019043,27.7559776306152,8.45416259765625,9.58856678009033,24.6577434539795,12.0102024078369,18.1406745910645,-21.3079109191895,5.92951536178589,15.4874382019043, +-24.6577453613281,12.0102014541626,18.1406745910645,-27.7559776306152,8.45416259765625,9.58856678009033,27.1884899139404,5.88621950149536,1.2561548948288,28.3383178710938,8.69301891326904,-7.75246524810791,31.0648384094238,12.1207208633423,0.809725165367126,-27.1884899139404,5.88621950149536,1.2561548948288,-31.0648384094238,12.1207218170166,0.809725105762482,-28.3383178710938,8.69301891326904,-7.75246524810791,22.4055099487305,6.14968204498291,-13.8018856048584,17.6180458068848,8.63867092132568,-21.476505279541,25.4340057373047,12.1284923553467,-16.9436378479004,-22.4055099487305,6.14968204498291,-13.8018856048584,-25.4340057373047,12.1284914016724,-16.9436378479004,-17.6180458068848,8.63867092132568,-21.476505279541,8.65554237365723,6.2974328994751,-22.6614398956299,0,8.50767135620117,-26.2536735534668,9.77973365783691,11.7444133758545,-27.3655071258545,-8.65554237365723,6.2974328994751,-22.6614398956299,-9.77973365783691,11.7444133758545,-27.3655071258545,18.7620887756348,16.5231113433838,25.830587387085,10.2282609939575,21.264461517334,31.1775646209717,0,16.7186889648438,31.5023040771484,-10.2282609939575,21.264461517334,31.1775646209717,-18.7620887756348,16.5231113433838,25.830587387085,-26.7818241119385,21.2490406036377,19.6271553039551,-30.677375793457,16.4935836791992,10.5635709762573,-32.9771995544434,21.6504192352295,0.686049938201904,-30.8880348205566,16.8663501739502,-9.13102626800537,-27.0460147857666,21.6892585754395,-18.7545757293701,-19.5188903808594,16.4308776855469,-25.1146125793457,-10.6223793029785,21.3989295959473,-30.8887710571289,-1.19209289550781e-07,16.2884845733643,-30.9599494934082,10.6223793029785,21.3989295959473,-30.8887710571289,19.5188903808594,16.4308776855469,-25.1146125793457,27.0460147857666,21.6892585754395,-18.7545738220215,30.8880348205566,16.8663501739502,-9.13102531433105,32.9771957397461,21.6504192352295,0.686049997806549,30.677375793457,16.4935836791992,10.5635709762573,26.7818260192871,21.2490386962891,19.6271553039551,26.5298500061035,30.7491912841797,18.7701225280762,30.0678119659424,36.9698295593262,9.38340187072754, +13.882851600647,60.9116516113281,-0.652859568595886,-13.8828506469727,60.9116516113281,-0.652859568595886,11.2800226211548,60.7187995910645,8.31672859191895,-11.2800226211548,60.7187995910645,8.31672763824463,4.3121337890625,60.2340354919434,13.6112403869629,-4.3121337890625,60.2340354919434,13.6112403869629,-11.0562782287598,60.8987274169922,-9.41499996185303,11.0562782287598,60.8987274169922,-9.41499996185303,-4.14131593704224,60.4528198242188,-14.3386373519897,4.14131593704224,60.4528198242188,-14.3386383056641,6.4910626411438,55.2436599731445,19.6725196838379,-6.4910626411438,55.2436599731445,19.6725196838379,8.38558006286621,47.7492980957031,24.7369155883789,-8.38558006286621,47.7492980957031,24.7369155883789,17.2318000793457,55.6833381652832,11.9138154983521,-17.2318000793457,55.6833381652832,11.9138154983521,21.3496971130371,55.9609642028809,-0.792478084564209,-21.3496971130371,55.9609680175781,-0.792478084564209,17.154483795166,55.894905090332,-13.3072681427002,-17.154483795166,55.894905090332,-13.3072681427002,6.54552555084229,55.360897064209,-20.8273658752441,-6.54552555084229,55.360897064209,-20.8273658752441,22.1435832977295,48.1307373046875,15.40882396698,-22.1435832977295,48.1307373046875,15.4088230133057,27.184383392334,48.4376678466797,-0.406225919723511,-27.1843852996826,48.4376678466797,-0.406225919723511,21.8443813323975,48.3833503723145,-16.1682357788086,-21.8443832397461,48.3833465576172,-16.1682357788086,8.41800117492676,47.3934783935547,-26.2408390045166,-8.41800117492676,47.3934860229492,-26.2408409118652,8.59835243225098,8.82430648803711,25.6523628234863,-8.59835243225098,8.82430648803711,25.6523609161377,23.182897567749,8.539794921875,16.8807773590088,-23.1828956604004,8.539794921875,16.8807773590088,29.5028343200684,8.55775833129883,0.989536762237549,-29.5028343200684,8.55775833129883,0.989536762237549,24.1772727966309,8.7023811340332,-15.4735908508301,-24.1772727966309,8.7023811340332,-15.4735908508301,9.25898170471191,8.55471229553223,-25.0638732910156,-9.25898170471191,8.55471229553223,-25.0638751983643, +9.82192611694336,16.6451797485352,30.0289726257324,-9.82192611694336,16.6451778411865,30.0289707183838,-25.9387283325195,16.4509525299072,19.1287670135498,-32.3035583496094,16.7158794403076,0.775051593780518,-26.5015563964844,16.6935062408447,-18.0489025115967,-10.3148021697998,16.311990737915,-29.4641914367676,10.3148021697998,16.311990737915,-29.4641914367676,26.5015563964844,16.6935062408447,-18.0489025115967,32.3035583496094,16.7158794403076,0.775051593780518,25.9387283325195,16.4509544372559,19.1287670135498,25.6498794555664,36.7932472229004,17.9527740478516,31.268253326416,37.2330322265625,-0.1627357006073,25.0267601013184,37.3520889282227,-18.3005828857422,9.59678173065186,36.6476669311523,-29.6621532440186,-9.59678173065186,36.6476707458496,-29.6621532440186,-25.0267601013184,37.3520889282227,-18.3005847930908,-31.268253326416,37.2330322265625,-0.1627357006073,-25.6498794555664,36.7932434082031,17.9527740478516,-9.81160163879395,36.3654136657715,28.908031463623,9.81160163879395,36.3654136657715,28.9080295562744,2.29074025154114,63.346866607666,-9.08566761016846,-2.29074025154114,63.346866607666,-9.08566761016846,5.60792446136475,63.6753616333008,-5.93659543991089,-5.60792446136475,63.6753578186035,-5.93659543991089,1.89229416847229,64.2933654785156,-4.95043992996216,-1.89229416847229,64.2933654785156,-4.95043992996216,-6.7299633026123,63.6199684143066,-0.300433278083801,6.72996234893799,63.6199722290039,-0.300433278083801,-2.49079370498657,63.5156021118164,8.68773555755615,2.49079370498657,63.5156021118164,8.68773555755615,-5.90357208251953,63.6226501464844,5.5107250213623,5.90357208251953,63.6226501464844,5.5107250213623,-1.98002278804779,64.2933654785156,4.58670616149902,1.98002278804779,64.2933654785156,4.58670616149902,-2.12702989578247,64.2933654785156,-0.280261516571045,2.12702989578247,64.2933654785156,-0.280261516571045,-5.08025598526001,1.83242797851563,15.500617980957,5.08025598526001,1.83242797851563,15.500617980957,-12.9920377731323,1.42591619491577,10.6608753204346,12.9920377731323,1.42591619491577,10.6608753204346, +-15.7973384857178,1.28695297241211,1.51378774642944,15.7973375320435,1.28695297241211,1.51378786563873,-13.5321979522705,1.3573784828186,-8.61883926391602,13.5321979522705,1.3573784828186,-8.61883926391602,-5.64664125442505,1.83476686477661,-15.0985527038574,5.64664125442505,1.83476686477661,-15.0985527038574,3.34922552108765,0.403568744659424,-9.89964199066162,-3.34922552108765,0.403568744659424,-9.8996410369873,7.76403331756592,0.144380569458008,-5.71331310272217,-7.76403331756592,0.144380569458008,-5.71331310272217,8.80326652526855,0.146285533905029,1.00557684898376,-8.80326652526855,0.146285533905029,1.00557672977448,7.52267169952393,0.203453540802002,7.34927415847778,-7.52267169952393,0.203453540802002,7.34927368164063,3.1342134475708,0.445696830749512,10.7471952438354,-3.1342134475708,0.445696830749512,10.7471952438354,2.61173391342163,0.138065814971924,-4.79976797103882,-2.61173391342163,0.138065814971924,-4.79976797103882,2.55159783363342,0.138809204101563,6.2167649269104,-2.55159783363342,0.138809204101563,6.21676445007324,2.80907797813416,0.138443946838379,0.803549766540527,-2.80907797813416,0.138443946838379,0.803549766540527,18.8265209197998,4.06914377212524,14.0990123748779,23.6927471160889,3.96533679962158,1.55124688148499,19.7928733825684,4.20490074157715,-12.0916500091553,7.87241363525391,4.5271167755127,-20.2603530883789,-7.87241363525391,4.5271167755127,-20.2603530883789,-19.7928733825684,4.20490074157715,-12.0916500091553,-23.6927471160889,3.96533679962158,1.55124688148499,-18.8265209197998,4.06914377212524,14.0990123748779,-7.05423402786255,4.31895017623901,20.5685195922852,7.05423402786255,4.31895017623901,20.5685195922852,-10.3718585968018,25.6782608032227,31.29248046875,-26.9430122375488,25.7914543151855,19.4179286956787,-32.8439674377441,26.2315311431885,0.343251466751099,-26.7334728240967,26.4075794219971,-19.0258407592773,-10.4606590270996,26.1467018127441,-31.1680870056152,10.4606590270996,26.1467018127441,-31.1680908203125,26.733470916748,26.4075794219971,-19.0258407592773,32.8439636230469,26.2315311431885,0.343251466751099, +26.9430122375488,25.7914543151855,19.4179286956787,10.3718585968018,25.6782608032227,31.29248046875 + } + PolygonVertexIndex: *1952 { + a: 0,246,368,-250,246,1,247,-369,368,247,2,-249,249,368,248,-4,5,250,369,-254,250,6,251,-370,369,251,7,-253,253,369,252,-5,2,254,370,-249,254,8,255,-371,370,255,9,-257,248,370,256,-4,11,257,371,-260,257,5,253,-372,371,253,4,-259,259,371,258,-11,8,260,372,-256,260,12,261,-373,372,261,13,-263,255,372,262,-10,12,263,373,-262,263,11,259,-374,373,259,10,-265,261,373,264,-14,6,265,374,-252,265,14,266,-375,374,266,15,-268,251,374,267,-8,17,268,375,-271,268,1,246,-376,375,246,0,-270,270,375,269,-17,14,271,376,-267,271,19,272,-377,376,272,18,-274,266,376,273,-16,19,274,377,-273,274,17,270,-378,377,270,16,-276,272,377,275,-19,21,276,378,-279,276,20,277,-379,378,277,9,-263,278,378,262,-14,22,279,379,-281,279,21,278,-380,379,278,13,-265,280,379,264,-11,69,281,380,-284,281,60,282,-381,380,282,20,-277,283,380,276,-22,68,284,381,-286,284,69,283,-382,381,283,21,-280,285,381,279,-23,20,286,382,-278,286,26,287,-383,382,287,3,-257,277,382,256,-10,27,288,383,-290,288,22,280,-384,383,280,10,-259,289,383,258,-5,0,249,384,-292,249,3,287,-385,384,287,26,-291,291,384,290,-29,4,252,385,-290,252,7,292,-386,385,292,29,-294,289,385,293,-28,28,294,386,-292,294,30,295,-387,386,295,16,-270,291,386,269,-1,31,296,387,-298,296,29,292,-388,387,292,7,-268,297,387,267,-16,30,298,388,-296,298,32,299,-389,388,299,18,-276,295,388,275,-17,32,300,389,-300,300,31,297,-390,389,297,15,-274,299,389,273,-19,60,301,390,-283,301,61,302,-391,390,302,26,-287,282,390,286,-21,67,303,391,-305,303,68,285,-392,391,285,22,-289,304,391,288,-28,61,305,392,-303,305,62,306,-393,392,306,28,-291,302,392,290,-27,66,307,393,-309,307,67,304,-394,393,304,27,-294,308,393,293,-30,62,309,394,-307,309,63,310,-395,394,310,30,-295,306,394,294,-29,65,311,395,-313,311,66,308,-396,395,308,29,-297,312,395,296,-32,63,313,396,-311,313,64,314,-397,396,314,32,-299,310,396,298,-31,64,315,397,-315,315,65,312,-398,397,312,31,-301,314,397,300,-33,113,316,398,-320,316,104,317,-399,398,317,50,-319,319,398,318,-52,112,320,399,-323,320,113,319,-400,399,319,51,-322,322,399,321,-53,104,323, +400,-318,323,105,324,-401,400,324,59,-326,317,400,325,-51,111,326,401,-329,326,112,322,-402,401,322,52,-328,328,401,327,-54,105,329,402,-325,329,106,330,-403,402,330,58,-332,324,402,331,-60,110,332,403,-335,332,111,328,-404,403,328,53,-334,334,403,333,-55,106,335,404,-331,335,107,336,-405,404,336,57,-338,330,404,337,-59,109,338,405,-341,338,110,334,-406,405,334,54,-340,340,405,339,-56,107,341,406,-337,341,108,342,-407,406,342,56,-344,336,406,343,-58,108,344,407,-343,344,109,340,-408,407,340,55,-346,342,407,345,-57,51,318,408,-349,318,50,346,-409,408,346,123,-348,348,408,347,-115,52,321,409,-351,321,51,348,-410,409,348,114,-350,350,409,349,-116,53,327,410,-353,327,52,350,-411,410,350,115,-352,352,410,351,-117,54,333,411,-355,333,53,352,-412,411,352,116,-354,354,411,353,-118,55,339,412,-357,339,54,354,-413,412,354,117,-356,356,412,355,-119,56,345,413,-359,345,55,356,-414,413,356,118,-358,358,413,357,-120,57,343,414,-361,343,56,358,-415,414,358,119,-360,360,414,359,-121,58,337,415,-363,337,57,360,-416,415,360,120,-362,362,415,361,-122,59,331,416,-365,331,58,362,-417,416,362,121,-364,364,416,363,-123,50,325,417,-347,325,59,364,-418,417,364,122,-366,346,417,365,-124,23,366,418,-125,366,33,367,-419,418,367,61,-302,124,418,301,-61,33,125,419,-368,125,35,126,-420,419,126,62,-306,367,419,305,-62,35,127,420,-127,127,37,128,-421,420,128,63,-310,126,420,309,-63,37,129,421,-129,129,39,130,-422,421,130,64,-314,128,421,313,-64,39,131,422,-131,131,38,132,-423,422,132,65,-316,130,422,315,-65,38,133,423,-133,133,36,134,-424,423,134,66,-312,132,423,311,-66,36,135,424,-135,135,34,136,-425,424,136,67,-308,134,424,307,-67,34,137,425,-137,137,25,138,-426,425,138,68,-304,136,425,303,-68,25,139,426,-139,139,24,140,-427,426,140,69,-285,138,426,284,-69,24,141,427,-141,141,23,124,-428,427,124,60,-282,140,427,281,-70,19,142,428,-275,142,70,143,-429,428,143,71,-145,274,428,144,-18,70,142,429,-147,142,19,271,-430,429,271,14,-146,146,429,145,-73,73,147,430,-149,147,1,268,-431,430,268,17,-145,148,430,144,-72,6,149,431,-266,149,74,150,-432,431,150, +72,-146,265,431,145,-15,75,151,432,-153,151,73,148,-433,432,148,71,-144,152,432,143,-71,74,153,433,-151,153,75,152,-434,433,152,70,-147,150,433,146,-73,76,154,434,-156,154,74,149,-435,434,149,6,-251,155,434,250,-6,73,156,435,-148,156,77,157,-436,435,157,2,-248,147,435,247,-2,11,263,436,-161,263,12,158,-437,436,158,78,-160,160,436,159,-80,12,260,437,-159,260,8,161,-438,437,161,80,-163,158,437,162,-79,76,155,438,-164,155,5,257,-439,438,257,11,-161,163,438,160,-80,2,157,439,-255,157,77,164,-440,439,164,80,-162,254,439,161,-9,79,159,440,-164,159,78,165,-441,440,165,81,-167,163,440,166,-77,78,162,441,-166,162,80,164,-442,441,164,77,-168,165,441,167,-82,75,153,442,-169,153,74,154,-443,442,154,76,-167,168,442,166,-82,73,151,443,-157,151,75,168,-444,443,168,81,-168,156,443,167,-78,83,169,444,-173,169,82,170,-445,444,170,41,-172,172,444,171,-43,82,173,445,-171,173,84,174,-446,445,174,40,-176,170,445,175,-42,85,176,446,-179,176,83,172,-447,446,172,42,-178,178,446,177,-45,84,179,447,-175,179,86,180,-448,447,180,43,-182,174,447,181,-41,87,182,448,-185,182,85,178,-449,448,178,44,-184,184,448,183,-47,86,185,449,-181,185,88,186,-450,449,186,45,-188,180,449,187,-44,89,188,450,-191,188,87,184,-451,450,184,46,-190,190,450,189,-49,88,191,451,-187,191,90,192,-452,451,192,47,-194,186,451,193,-46,91,194,452,-197,194,89,190,-453,452,190,48,-196,196,452,195,-50,90,197,453,-193,197,91,196,-454,453,196,49,-199,192,453,198,-48,93,199,454,-202,199,92,200,-455,454,200,91,-198,201,454,197,-91,92,202,455,-201,202,94,203,-456,455,203,89,-195,200,455,194,-92,95,204,456,-206,204,93,201,-457,456,201,90,-192,205,456,191,-89,94,206,457,-204,206,96,207,-458,457,207,87,-189,203,457,188,-90,97,208,458,-210,208,95,205,-459,458,205,88,-186,209,458,185,-87,96,210,459,-208,210,98,211,-460,459,211,85,-183,207,459,182,-88,99,212,460,-214,212,97,209,-461,460,209,86,-180,213,460,179,-85,98,214,461,-212,214,100,215,-462,461,215,83,-177,211,461,176,-86,84,173,462,-214,173,82,216,-463,462,216,101,-218,213,462,217,-100,82,169,463,-217,169,83,215,-464,463,215,100,-219, +216,463,218,-102,95,219,464,-205,219,102,220,-465,464,220,92,-200,204,464,199,-94,102,221,465,-221,221,96,206,-466,465,206,94,-203,220,465,202,-93,103,222,466,-224,222,97,212,-467,466,212,99,-218,223,466,217,-102,98,224,467,-215,224,103,223,-468,467,223,101,-219,214,467,218,-101,97,222,468,-209,222,103,225,-469,468,225,102,-220,208,468,219,-96,103,224,469,-226,224,98,210,-470,469,210,96,-222,225,469,221,-103,40,181,470,-228,181,43,226,-471,470,226,105,-324,227,470,323,-105,43,187,471,-227,187,45,228,-472,471,228,106,-330,226,471,329,-106,45,193,472,-229,193,47,229,-473,472,229,107,-336,228,472,335,-107,47,198,473,-230,198,49,230,-474,473,230,108,-342,229,473,341,-108,49,195,474,-231,195,48,231,-475,474,231,109,-345,230,474,344,-109,48,189,475,-232,189,46,232,-476,475,232,110,-339,231,475,338,-110,46,183,476,-233,183,44,233,-477,476,233,111,-333,232,476,332,-111,44,177,477,-234,177,42,234,-478,477,234,112,-327,233,477,326,-112,42,171,478,-235,171,41,235,-479,478,235,113,-321,234,478,320,-113,41,175,479,-236,175,40,227,-480,479,227,104,-317,235,479,316,-114,115,349,480,-238,349,114,236,-481,480,236,24,-140,237,480,139,-26,116,351,481,-239,351,115,237,-482,481,237,25,-138,238,481,137,-35,117,353,482,-240,353,116,238,-483,482,238,34,-136,239,482,135,-37,118,355,483,-241,355,117,239,-484,483,239,36,-134,240,483,133,-39,119,357,484,-242,357,118,240,-485,484,240,38,-132,241,484,131,-40,120,359,485,-243,359,119,241,-486,485,241,39,-130,242,485,129,-38,121,361,486,-244,361,120,242,-487,486,242,37,-128,243,486,127,-36,122,363,487,-245,363,121,243,-488,487,243,35,-126,244,487,125,-34,123,365,488,-246,365,122,244,-489,488,244,33,-367,245,488,366,-24,114,347,489,-237,347,123,245,-490,489,245,23,-142,236,489,141,-25 + } + Edges: *976 { + a: 5,9,15,3,26,30,31,19,16,20,32,36,42,46,48,52,58,62,63,51,74,78,64,68,90,94,80,84,106,110,96,100,122,126,127,115,112,116,138,142,128,132,144,148,154,158,0,4,133,137,101,105,21,25,69,73,37,41,10,14,160,164,165,169,175,163,176,180,191,179,944,948,803,815,207,195,928,932,223,211,224,228,229,233,240,244,255,243,266,270,271,259,277,281,282,286,288,292,293,297,304,308,319,307,320,324,325,329,336,340,800,804,805,809,912,916,383,371,816,820,821,825,896,900,415,403,832,836,837,841,880,884,447,435,848,852,853,857,864,868,1246,1242,1635,1647,1801,1797,1230,1226,1807,1795,1278,1274,1637,1641,1262,1258,1823,1811,1310,1306,1653,1657,1294,1290,1839,1827,1342,1338,1669,1673,1326,1322,1855,1843,1374,1370,1685,1689,1358,1354,645,649,495,483,511,499,543,531,575,563,607,595,723,735,739,751,755,767,771,783,490,494,506,510,538,542,570,574,602,606,634,638,618,622,586,590,554,558,522,526,197,201,357,361,389,393,421,425,453,457,873,869,889,885,905,901,921,917,937,933,352,356,384,388,416,420,448,452,464,468,432,436,400,404,368,372,208,212,192,196,960,964,965,969,970,974,986,990,991,979,992,996,1007,995,1008,1012,1013,1017,1024,1028,1039,1027,1040,1044,1056,1060,1071,1059,1072,1076,1077,1081,1093,1097,1098,1102,1103,1091,1109,1113,1114,1118,1135,1123,1141,1145,1157,1161,1162,1166,1178,1182,1199,1187,1216,1220,1221,1225,1231,1219,1232,1236,1237,1241,1248,1252,1263,1251,1264,1268,1269,1273,1280,1284,1295,1283,1296,1300,1301,1305,1312,1316,1327,1315,1328,1332,1333,1337,1344,1348,1359,1347,1360,1364,1376,1380,1381,1385,1391,1379,1392,1396,1397,1401,1408,1412,1423,1411,1424,1428,1429,1433,1440,1444,1455,1443,1456,1460,1461,1465,1472,1476,1487,1475,1488,1492,1493,1497,1509,1513,1514,1518,1530,1534,1536,1540,1541,1545,1552,1556,1568,1572,1583,1571,1584,1588,1605,1609,485,489,517,521,549,553,581,585,613,617,1705,1701,1721,1717,1737,1733,1753,1749,1769,1765,512,516,544,548,576,580,608,612,624,628,592,596,560,564,528,532,496,500,480,484,655,643,671,659,687,675,703,691,719,707,1859,1871,1875,1887,1891,1903,1907,1919,1923,1935,666,670, +682,686,698,702,714,718,730,734,746,750,762,766,778,782,794,798,650,654,1,2,6,11,17,18,22,27,33,34,38,43,49,50,54,59,65,66,70,75,81,82,86,91,97,98,102,107,113,114,118,123,129,130,134,139,145,146,150,155,161,162,166,171,177,178,182,187,193,194,198,203,209,210,214,219,225,226,230,235,241,242,246,251,257,258,262,267,273,274,278,283,289,290,294,299,305,306,310,315,321,322,326,331,337,338,342,347,353,354,358,363,369,370,374,379,385,386,390,395,401,402,406,411,417,418,422,427,433,434,438,443,449,450,454,459,465,466,470,475,481,482,486,491,497,498,502,507,513,514,518,523,529,530,534,539,545,546,550,555,561,562,566,571,577,578,582,587,593,594,598,603,609,610,614,619,625,626,630,635,641,642,646,651,657,658,662,667,673,674,678,683,689,690,694,699,705,706,710,715,721,722,726,731,737,738,742,747,753,754,758,763,769,770,774,779,785,786,790,795,801,802,806,811,817,818,822,827,833,834,838,843,849,850,854,859,865,866,870,875,881,882,886,891,897,898,902,907,913,914,918,923,929,930,934,939,945,946,950,955,961,962,966,971,977,978,982,987,993,994,998,1003,1009,1010,1014,1019,1025,1026,1030,1035,1041,1042,1046,1051,1057,1058,1062,1067,1073,1074,1078,1083,1089,1090,1094,1099,1105,1106,1110,1115,1121,1122,1126,1131,1137,1138,1142,1147,1153,1154,1158,1163,1169,1170,1174,1179,1185,1186,1190,1195,1201,1202,1206,1211,1217,1218,1222,1227,1233,1234,1238,1243,1249,1250,1254,1259,1265,1266,1270,1275,1281,1282,1286,1291,1297,1298,1302,1307,1313,1314,1318,1323,1329,1330,1334,1339,1345,1346,1350,1355,1361,1362,1366,1371,1377,1378,1382,1387,1393,1394,1398,1403,1409,1410,1414,1419,1425,1426,1430,1435,1441,1442,1446,1451,1457,1458,1462,1467,1473,1474,1478,1483,1489,1490,1494,1499,1505,1506,1510,1515,1521,1522,1526,1531,1537,1538,1542,1547,1553,1554,1558,1563,1569,1570,1574,1579,1585,1586,1590,1595,1601,1602,1606,1611,1617,1618,1622,1627,1633,1634,1638,1643,1649,1650,1654,1659,1665,1666,1670,1675,1681,1682,1686,1691,1697,1698,1702,1707,1713,1714,1718,1723,1729,1730,1734,1739,1745,1746,1750,1755,1761,1762,1766,1771,1777,1778,1782,1787,1793,1794,1798,1803, +1809,1810,1814,1819,1825,1826,1830,1835,1841,1842,1846,1851,1857,1858,1862,1867,1873,1874,1878,1883,1889,1890,1894,1899,1905,1906,1910,1915,1921,1922,1926,1931,1937,1938,1942,1947 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *1470 { + a: 0.810477495193481,0.509635031223297,-0.288787424564362,0.57287186384201,0.805215239524841,-0.153121471405029,0.522134482860565,0.838730275630951,0.154619291424751,0.722371697425842,0.641999542713165,0.256935179233551,-0.680682361125946,0.687788188457489,0.252228081226349,-0.474614799022675,0.872451186180115,0.116488724946976,-0.531687080860138,0.830586135387421,-0.16563618183136,-0.764511346817017,0.573431193828583,-0.294447243213654,0.329684525728226,0.811382412910461,0.482666343450546,0.38841050863266,0.702063322067261,0.596862077713013,-0.364745855331421,0.721000373363495,0.589167952537537,-0.297198057174683,0.833736956119537,0.465355664491653,0.0117487488314509,0.805788636207581,0.592086672782898,0.0100350994616747,0.723111033439636,0.690658807754517,-0.425637155771255,0.653642475605011,-0.625767111778259,-0.500769436359406,0.37771412730217,-0.778820812702179,0.512298882007599,0.332385689020157,-0.791877329349518,0.466435700654984,0.607312738895416,-0.643124282360077,-0.0067813815549016,0.28278923034668,-0.95915812253952,0.00244890432804823,0.490092158317566,-0.871667087078094,0.458665907382965,0.570347428321838,0.681417226791382,0.00620304839685559,0.582606494426727,0.812730729579926,-0.434734910726547,0.589272081851959,0.681002080440521,0.563757598400116,0.154622346162796,0.811338007450104,0.000693110749125481,0.198430612683296,0.980114758014679,-0.561383426189423,0.141007229685783,0.815454304218292,0.835045218467712,0.476938933134079,0.274278730154037,-0.80275171995163,0.524359226226807,0.283966809511185,0.900501668453217,0.308096557855606,-0.306876689195633,-0.879636287689209,0.359336912631989,-0.311635971069336,0.571112036705017,0.182332366704941,-0.800366103649139,-0.562881886959076,0.218098312616348,-0.797243416309357,-0.0027610189281404,0.166479200124741,-0.986041069030762,0.948362588882446,0.0939626917243004,0.302951246500015,-0.953120708465576,0.0535890497267246,0.29780712723732,0.947357296943665,0.0373123288154602,-0.317996770143509,-0.948816299438477,0.00533659290522337,-0.315783649682999, +0.591353952884674,0.0029850541613996,-0.806406676769257,-0.589811444282532,-0.00454022362828255,-0.80752831697464,0.000893016520421952,-0.0314277075231075,-0.999505639076233,0.132101118564606,-0.951781809329987,0.276876986026764,-0.000658060249406844,-0.954445540904999,0.298384100198746,-0.120046220719814,-0.959071636199951,0.256457269191742,0.254369258880615,-0.962231934070587,0.0969847068190575,-0.214452087879181,-0.97320145368576,0.0830022767186165,0.264499008655548,-0.961003363132477,-0.0807020515203476,-0.221530988812447,-0.97268146276474,-0.0693890526890755,0.17226080596447,-0.945276737213135,-0.277088314294815,-0.152281373739243,-0.9546879529953,-0.255697637796402,0.000299213512334973,-0.944443702697754,-0.328673005104065,0.396477252244949,-0.665635049343109,0.632246673107147,0.00314747681841254,-0.704747915267944,0.709450781345367,-0.386210948228836,-0.70695573091507,0.59249871969223,-0.693247556686401,-0.676959455013275,0.247252687811852,-0.715041697025299,-0.654456734657288,-0.245767697691917,-0.411988347768784,-0.673825144767761,-0.613372087478638,-0.000255698018008843,-0.667241454124451,-0.744841456413269,0.438468366861343,-0.619884848594666,-0.650759756565094,0.787714064121246,-0.556759834289551,-0.2636758685112,0.756549179553986,-0.59600442647934,0.269094854593277,0.507473289966583,0.386980146169662,0.769881308078766,0.905982673168182,0.302495360374451,0.296128123998642,0.928078711032867,0.188001826405525,-0.321442574262619,0.584093153476715,0.0947349369525909,-0.806139171123505,0.000202314608031884,0.0563880689442158,-0.998408913612366,-0.58018547296524,0.107185401022434,-0.807400822639465,-0.924104630947113,0.198368653655052,-0.326619923114777,-0.899691045284271,0.308403551578522,0.308939009904861,-0.494623810052872,0.39108207821846,0.77614563703537,0.00295385508798063,0.414965271949768,0.90983247756958,-0.00300283147953451,0.944419205188751,-0.328729778528214,0.24572765827179,0.936691641807556,-0.249453037977219,-0.221597909927368,0.942916095256805,-0.248603582382202,0.246251359581947,0.969194352626801,-0.00474579352885485, +-0.21823063492775,0.97582995891571,-0.011458788998425,-0.00650069676339626,0.99967086315155,0.0248206555843353,-0.201791450381279,0.978486359119415,0.0429506413638592,0.221879437565804,0.973533809185028,0.0547864772379398,0.0014954146463424,0.967237532138824,0.253868609666824,-0.151680380105972,0.968728959560394,0.196360319852829,0.171516790986061,0.962335169315338,0.2109335064888,-0.00238803238607943,0.999261200428009,0.0383571162819862,-0.00113281910307705,-0.980650663375854,0.195762306451797,-0.0510626882314682,-0.986948609352112,0.15272518992424,0.0541851930320263,-0.985917091369629,0.158213764429092,-0.110835142433643,-0.993394434452057,0.029715770855546,0.120662607252598,-0.992061376571655,0.0354237928986549,-0.12143012881279,-0.992274940013885,-0.0253974720835686,0.13249135017395,-0.990690290927887,-0.0312847904860973,-0.0692549124360085,-0.98580276966095,-0.152959674596786,0.0788690969347954,-0.98432320356369,-0.157757148146629,-0.00106537633109838,-0.976369321346283,-0.216106072068214,-0.000155926900333725,-0.998673021793365,-0.0514992326498032,-0.0181788839399815,-0.999596357345581,-0.0218342076987028,0.0178190656006336,-0.999579012393951,-0.0228967592120171,-0.00740581983700395,-0.999968230724335,0.00296826218254864,0.00722902547568083,-0.999969661235809,0.00291133555583656,-0.00595939066261053,-0.999980747699738,-0.00171735801268369,0.00580235570669174,-0.999981939792633,-0.00161965982988477,-0.00744489673525095,-0.999457240104675,0.0320885367691517,0.00739119527861476,-0.999426007270813,0.0330599918961525,-0.000276011327514425,-0.998600959777832,0.0528763420879841,-2.64553563056324e-07,-0.999999284744263,0.00122759526129812,-1.78014818175143e-06,-0.999996185302734,-0.00276750582270324,0.262909322977066,-0.844785511493683,0.466064512729645,0.506195664405823,-0.838679015636444,0.200956702232361,0.513968825340271,-0.840498924255371,-0.171457514166832,0.291369527578354,-0.84644079208374,-0.445692658424377,0.000342562270816416,-0.868197083473206,-0.496219396591187,-0.26482167840004,-0.873082637786865,-0.409385055303574, +-0.444278031587601,-0.882402420043945,-0.154864370822906,-0.433658599853516,-0.884353876113892,0.172795817255974,-0.23822121322155,-0.8697150349617,0.432257354259491,-0.0018744629342109,-0.864702641963959,0.502280712127686,0.0102547910064459,-0.349555879831314,0.936859369277954,-0.538700461387634,-0.363786160945892,0.759908854961395,-0.890015661716461,-0.350777834653854,0.291250735521317,-0.897652745246887,-0.334772169589996,-0.28661322593689,-0.543236434459686,-0.378701537847519,-0.74931925535202,0.00154503656085581,-0.390954107046127,-0.920408844947815,0.558258771896362,-0.316184788942337,-0.767055511474609,0.924171149730682,-0.239264532923698,-0.297758460044861,0.91847562789917,-0.248848915100098,0.307370454072952,0.537160038948059,-0.301925778388977,0.787591159343719,0.537187099456787,0.288230121135712,0.792687594890594,0.997779130935669,0.0633694678544998,-0.0205227732658386,0.941441833972931,0.0999578982591629,-0.322018325328827,0.812963664531708,0.0199767760932446,-0.581971645355225,0.587512910366058,0.0535401701927185,-0.807441711425781,0.311517357826233,-0.0192041713744402,-0.950046300888062,0.000980032724328339,0.02150315977633,-0.999768316745758,-0.309838443994522,-0.0225936248898506,-0.950520694255829,-0.584873616695404,0.0599930621683598,-0.80890280008316,-0.813046514987946,0.00255363225005567,-0.582193195819855,-0.940519690513611,0.0952180325984955,-0.326123118400574,-0.999518632888794,0.0199140999466181,-0.0237922985106707,-0.935638546943665,0.176372721791267,0.305733650922775,-0.797609627246857,0.0971990898251534,0.595290839672089,-0.529504537582397,0.284552872180939,0.799158811569214,-0.286329090595245,0.180237293243408,0.941026151180267,0.00123470276594162,0.335900813341141,0.941896557807922,0.286246031522751,0.183823123574257,0.940357506275177,0.00496677774935961,0.693998992443085,-0.719958901405334,0.0845452174544334,0.947677671909332,-0.307829767465591,0.415623605251312,0.762714505195618,-0.495503485202789,-0.365888744592667,0.796044647693634,-0.482118725776672,-0.082483246922493,0.948505818843842,-0.305832296609879, +0.445473253726959,0.892531454563141,-0.0702934786677361,0.260576099157333,0.962235033512115,-0.0787634700536728,-0.403646290302277,0.911369144916534,-0.0804736837744713,-0.232210233807564,0.969286561012268,-0.0810055658221245,0.0735686793923378,0.997070550918579,0.0209254510700703,-0.00507677905261517,0.9980588555336,-0.0620716400444508,-0.0729821920394897,0.997166991233826,0.0182088389992714,-0.204627901315689,0.978637099266052,0.0199180673807859,-0.355683386325836,0.932315468788147,0.0654004067182541,0.228092849254608,0.973271787166595,0.026751259341836,0.402616083621979,0.910531401634216,0.0939831137657166,0.00811247900128365,0.883378624916077,0.468589961528778,-0.0408771373331547,0.970182955265045,0.238902017474174,-0.23840419948101,0.910643994808197,0.33747735619545,0.277562499046326,0.888709187507629,0.364904135465622,0.0466647706925869,0.968390941619873,0.245033666491508,-0.195066124200821,0.976957678794861,0.0866182893514633,0.215148121118546,0.97113162279129,0.103027485311031,-0.00122905732132494,0.996150255203247,0.0876526236534119,-0.0681399926543236,0.996994078159332,0.0368760377168655,0.0665016621351242,0.996909618377686,0.041816595941782,-0.00453400518745184,0.999430775642395,0.0334316939115524,-0.00688648363575339,-0.981748163700104,0.190060719847679,-0.000979870557785034,-0.966965556144714,0.254905045032501,-0.0462133772671223,-0.955120623111725,0.292589783668518,-0.0882247015833855,-0.973432123661041,0.211296513676643,0.00365206529386342,-0.98154878616333,0.19117671251297,0.0963045209646225,-0.969444334506989,0.225617274641991,0.0470876581966877,-0.952170729637146,0.301916718482971,-0.0942450612783432,-0.991831362247467,0.085955448448658,-0.184135526418686,-0.966727435588837,0.177573025226593,-0.17197859287262,-0.983514368534088,0.0558807142078876,0.103844724595547,-0.990403413772583,0.0911993607878685,0.200914934277534,-0.977250218391418,0.0679353624582291,0.212414935231209,-0.956362009048462,0.200627833604813,-0.117001548409462,-0.993127107620239,-0.00302287144586444,-0.221618950366974,-0.975133419036865,2.53381895163329e-05, +-0.179250732064247,-0.982703685760498,-0.0465038120746613,0.126136004924774,-0.99201226234436,-0.00120296631939709,0.212866768240929,-0.97534716129303,-0.0581873022019863,0.266581773757935,-0.963811099529266,0.00155861652456224,-0.115882568061352,-0.990853846073151,-0.0691370815038681,-0.210287436842918,-0.965455234050751,-0.153867959976196,-0.115190036594868,-0.971085488796234,-0.20910356938839,0.130248472094536,-0.988313317298889,-0.0791971012949944,0.132517948746681,-0.965866684913635,-0.222576975822449,0.244895353913307,-0.953771770000458,-0.174199908971786,-0.0115056950598955,-0.978031158447266,-0.208140552043915,-0.0635675638914108,-0.946838736534119,-0.315365940332413,-0.000869224953930825,-0.960844337940216,-0.277087420225143,0.0123934913426638,-0.978354513645172,-0.20656418800354,0.0692508891224861,-0.941837131977081,-0.328857004642487,-0.0155227826908231,-0.998961210250854,-0.0428431183099747,-0.000211643040529452,-0.991991639137268,-0.126303061842918,0.0136824380606413,-0.996872961521149,-0.0778275057673454,0.0152879608795047,-0.998919248580933,-0.0438936278223991,-0.0124539732933044,-0.99688982963562,-0.0778176710009575,-0.00966424588114023,-0.999952971935272,0.000902117404621094,0.0329401083290577,-0.999446630477905,-0.00463643483817577,0.0094340005889535,-0.999955236911774,0.000655281881336123,-0.0308591797947884,-0.999515473842621,-0.00405598524957895,-0.00707889348268509,-0.999974727630615,-0.000596932950429618,0.0314793661236763,-0.999465882778168,0.0087767792865634,0.00690973270684481,-0.999975919723511,-0.000571746844798326,-0.0296262353658676,-0.999527156352997,0.00822630897164345,-0.00451763579621911,-0.999972641468048,0.00586157059296966,0.00887610483914614,-0.99683541059494,0.0789958760142326,0.00439947145059705,-0.999971807003021,0.00609292602166533,-0.0116611616685987,-0.996397614479065,0.0839992389082909,-0.00100818823557347,-0.992863774299622,0.119250506162643,-0.00925085134804249,-0.998875141143799,0.0465049706399441,0.00907792523503304,-0.998814702033997,0.0478217042982578,-0.00190176058094949,-0.999996840953827,0.00163126131519675, +-1.88500016520265e-05,-0.999951362609863,-0.00987247470766306,0.00188884267117828,-0.999996840953827,0.00162363203708082,-0.00169652898330241,-0.999994695186615,-0.00275809271261096,-2.34826056839665e-05,-0.999967455863953,0.00806142762303352,0.00168468663468957,-0.99999475479126,-0.00274712056852877,1.65689158393434e-07,-1,-0.000295499077765271,0.345489531755447,-0.92805677652359,0.139096096158028,0.186160996556282,-0.916097044944763,0.355119943618774,0.352324932813644,-0.928588271141052,-0.116580076515675,0.223152488470078,-0.909201443195343,-0.351504892110825,0.000781664857640862,-0.915001928806305,-0.403448492288589,-0.2004404515028,-0.92508453130722,-0.322555720806122,-0.301196068525314,-0.947838723659515,-0.104320198297501,-0.293555408716202,-0.948383927345276,0.119971975684166,-0.167268753051758,-0.929989337921143,0.327323853969574,-0.000788152450695634,-0.925914227962494,0.377732813358307,0.00463876081630588,-0.0647102668881416,0.997893273830414,-0.575333058834076,-0.101541459560394,0.811591744422913,-0.945983290672302,-0.132879674434662,0.295734018087387,-0.942035615444183,-0.142118290066719,-0.303926229476929,-0.58367508649826,-0.16264496743679,-0.795531213283539,0.00136818899773061,-0.183226093649864,-0.983069837093353,0.588582992553711,-0.12234465777874,-0.799125611782074,0.947676956653595,-0.0682381466031075,-0.311852425336838,0.950613796710968,-0.0494731217622757,0.306408017873764,0.57306319475174,-0.0677056014537811,0.816709578037262,0.692119359970093,0.682049512863159,-0.236176490783691,0.549509167671204,0.835443317890167,0.0085983332246542,0.620851576328278,0.754053592681885,0.214351207017899,0.809991478919983,0.586440861225128,0.000956456060521305,-0.505652248859406,0.862254917621613,-0.0288492385298014,-0.642285048961639,0.726344227790833,-0.244732663035393,-0.761503219604492,0.648112058639526,-0.00798810832202435,-0.584980845451355,0.788490056991577,0.189949944615364,0.471217691898346,0.82327401638031,0.316502392292023,0.360712230205536,0.748460412025452,0.556501448154449,0.575985908508301,0.676345646381378,0.459126055240631, +-0.427828818559647,0.855683386325836,0.291150093078613,-0.547412693500519,0.707365989685059,0.447183221578598,-0.334395468235016,0.768027067184448,0.546181440353394,0.127683192491531,0.804792284965515,0.579660594463348,0.0113271772861481,0.757193624973297,0.653092265129089,0.185042589902878,0.716763198375702,0.672316610813141,-0.101769469678402,0.813530921936035,0.572547376155853,-0.163879096508026,0.724943459033966,0.669029533863068,-0.532715618610382,0.764377355575562,-0.363237351179123,-0.46232733130455,0.513668537139893,-0.722771108150482,-0.677934765815735,0.473146677017212,-0.562615811824799,0.574518382549286,0.726662695407867,-0.376682877540588,0.706125020980835,0.412815004587173,-0.575301051139832,0.484028279781342,0.4724280834198,-0.736565232276917,-0.218544363975525,0.536363840103149,-0.815200746059418,-0.00475216377526522,0.377626240253448,-0.925945997238159,-0.2606041431427,0.310393452644348,-0.914188981056213,0.239625871181488,0.510376572608948,-0.825890481472015,0.258577227592468,0.286465138196945,-0.922537565231323,0.21946294605732,0.581197559833527,0.783610463142395,0.424354881048203,0.647524356842041,0.632957518100739,0.00787610653787851,0.669427335262299,0.742835760116577,-0.202771082520485,0.588323533535004,0.782789349555969,-0.400403678417206,0.667214274406433,0.628093957901001,0.242051273584366,0.408170014619827,0.880232036113739,0.48250025510788,0.483301252126694,0.730488359928131,0.00477551808580756,0.493439584970474,0.8697669506073,-0.234254419803619,0.409785479307175,0.881589889526367,-0.462421000003815,0.49558237195015,0.735231280326843,0.673673987388611,0.535746097564697,0.509057462215424,0.795209288597107,0.541094899177551,0.273603022098541,-0.643580913543701,0.569241404533386,0.511632561683655,-0.756154417991638,0.590798616409302,0.281402468681335,0.918743014335632,0.394713789224625,-0.0105939283967018,0.878208816051483,0.369680881500244,-0.303455770015717,-0.848680257797241,0.431326627731323,-0.306103229522705,-0.893901407718658,0.44822883605957,-0.00558898318558931,0.77900630235672,0.232404798269272,-0.582354784011841, +0.545654594898224,0.240922033786774,-0.802631735801697,-0.762998819351196,0.27914360165596,-0.583019435405731,-0.538540661334991,0.284673035144806,-0.793054401874542,0.305900812149048,0.162780836224556,-0.938044309616089,-0.00632681837305427,0.227030649781227,-0.973867058753967,-0.305782824754715,0.181982263922691,-0.934547603130341,0.742179811000824,0.351300209760666,0.57075160741806,0.866653800010681,0.410646706819534,0.283338218927383,-0.727041900157928,0.356823474168777,0.586589336395264,-0.845906913280487,0.444282829761505,0.295049399137497,0.969437062740326,0.244625821709633,-0.018712118268013,0.910388827323914,0.267616450786591,-0.315553039312363,-0.96754515171051,0.251985877752304,-0.01895965449512,-0.897927403450012,0.303211212158203,-0.319044321775436,0.794253349304199,0.135614484548569,-0.59225857257843,0.581041872501373,0.135542660951614,-0.80250757932663,-0.787771582603455,0.148614957928658,-0.59777045249939,-0.574927628040314,0.158976927399635,-0.802611112594604,0.318450301885605,0.0651547312736511,-0.945697784423828,-0.000677949225064367,0.100795917212963,-0.994906961917877,-0.317516207695007,0.0731979236006737,-0.945423483848572,0.119540579617023,-0.856186509132385,0.502647757530212,0.325752556324005,-0.773179590702057,0.544130921363831,0.191871121525764,-0.686456143856049,0.701401114463806,-0.00208142888732255,-0.80208432674408,0.597207129001617,-0.115334697067738,-0.867350161075592,0.484150379896164,-0.191182464361191,-0.715826392173767,0.671596348285675,-0.308130741119385,-0.800109088420868,0.514665961265564,0.402105957269669,-0.838578701019287,0.367554694414139,0.644293785095215,-0.725398182868958,0.242245629429817,0.596921443939209,-0.634888172149658,0.49051171541214,-0.351516246795654,-0.87636011838913,0.329286068677902,-0.557997643947601,-0.691437900066376,0.45885968208313,-0.578329741954803,-0.785949051380157,0.218674883246422,0.542829692363739,-0.839800775051117,0.00838758051395416,0.67037707567215,-0.706513047218323,-0.22679029405117,0.826323091983795,-0.563193798065186,0.00166217202786356, +-0.464891672134399,-0.885365724563599,0.00181232544127852,-0.749798476696014,-0.661662936210632,-0.00212010112591088,-0.593885004520416,-0.777547180652618,-0.206690594553947,0.428400486707687,-0.84112012386322,-0.330136269330978,0.368215948343277,-0.747216761112213,-0.553248703479767,0.649267077445984,-0.581359148025513,-0.490381330251694,-0.375786930322647,-0.877881586551666,-0.296830058097839,-0.595616042613983,-0.662155330181122,-0.4547438621521,-0.34072208404541,-0.786708176136017,-0.514780223369598,0.135507151484489,-0.858297049999237,-0.494938284158707,-0.000457285699667409,-0.78477019071579,-0.61978667974472,0.209791094064713,-0.649725019931793,-0.730647027492523,-0.12984111905098,-0.870879650115967,-0.474035739898682,-0.203966587781906,-0.675656259059906,-0.708439290523529,0.473686009645462,-0.499578028917313,0.725288450717926,0.27771058678627,-0.333453893661499,0.90093582868576,0.00967407319694757,-0.552602410316467,0.833388864994049,-0.277424991130829,-0.357556939125061,0.891733407974243,-0.469981610774994,-0.562588095664978,0.680155754089355,-0.744524002075195,-0.361607611179352,0.561180770397186,-0.799300253391266,-0.534882187843323,0.273898273706436,-0.941340923309326,-0.337313503026962,-0.00984239485114813,-0.817611277103424,-0.509225964546204,-0.268701672554016,-0.767218708992004,-0.352956801652908,-0.535534262657166,-0.47914057970047,-0.547205865383148,-0.686287224292755,-0.27199375629425,-0.393938452005386,-0.877970278263092,0.000216384200030006,-0.544836699962616,-0.838542103767395,0.278353542089462,-0.362538009881973,-0.889429807662964,0.502549529075623,-0.482649892568588,-0.717281758785248,0.78864711523056,-0.267168343067169,-0.553766131401062,0.869860470294952,-0.404232084751129,-0.282734841108322,0.971387922763824,-0.237351968884468,-0.00833575520664454,0.85005646944046,-0.43919312953949,0.290711879730225,0.763085961341858,-0.269515484571457,0.587419152259827,0.796787142753601,0.124190419912338,0.591360330581665,0.934524357318878,0.191614896059036,0.299913078546524,0.679994404315948,0.733200967311859,0.00489988550543785, +-0.632666707038879,0.773988425731659,-0.0259775444865227,0.521578967571259,0.750387609004974,0.406046599149704,-0.49347797036171,0.778261244297028,0.388315588235855,0.161407858133316,0.752406895160675,0.638616740703583,-0.137188374996185,0.760421872138977,0.634773969650269,-0.60408627986908,0.631584048271179,-0.485984891653061,0.637503743171692,0.583405256271362,-0.503216862678528,-0.23903863132,0.413357526063919,-0.87863302230835,0.245322525501251,0.394596308469772,-0.885500133037567,0.203898400068283,0.665204465389252,0.71828156709671,-0.18516793847084,0.673298478126526,0.715808749198914,0.229316130280495,0.491915673017502,0.83990067243576,-0.216654554009438,0.496611326932907,0.840498685836792,0.630804657936096,0.604943990707397,0.485930174589157,-0.600270986557007,0.638450682163239,0.481721252202988,0.888696670532227,0.458492815494537,-0.00159735232591629,-0.854380667209625,0.519617259502411,0.00562424585223198,0.755459785461426,0.290860950946808,-0.587094902992249,-0.736121416091919,0.347890496253967,-0.58060097694397,0.281228601932526,0.22207048535347,-0.933592677116394,-0.28563317656517,0.244793742895126,-0.926547229290009,0.706558883190155,0.456683188676834,0.540569186210632,-0.681213617324829,0.481504052877426,0.551454246044159,0.938905656337738,0.343741327524185,-0.0172626096755266,-0.924698889255524,0.3805091381073,-0.0120331905782223,0.786310791969299,0.192703425884247,-0.587009906768799,-0.775305151939392,0.223732367157936,-0.590631723403931,0.318093299865723,0.105076864361763,-0.942218363285065,-0.316302686929703,0.118285581469536,-0.94125509262085,0.152506798505783,-0.790891408920288,0.592648684978485,-0.150992780923843,-0.805350244045258,0.573247075080872,0.500174999237061,-0.749750375747681,0.433243066072464,-0.458484381437302,-0.792156100273132,0.402840852737427,0.706368982791901,-0.707817792892456,0.00605243956670165,-0.626070380210876,-0.779766440391541,0.00046543127973564,0.548200905323029,-0.721677780151367,-0.422678351402283,-0.492641597986221,-0.780597329139709,-0.384671479463577,0.174437373876572,-0.770583391189575,-0.613003134727478, +-0.168568029999733,-0.789239227771759,-0.59049654006958,0.237746581435204,-0.528667449951172,0.814854204654694,-0.236244663596153,-0.567449510097504,0.788789927959442,-0.658104777336121,-0.550149857997894,0.514036178588867,-0.856267154216766,-0.516512989997864,-0.00455361977219582,-0.688415169715881,-0.52560693025589,-0.499821990728378,-0.237360134720802,-0.552809953689575,-0.798787415027618,0.243305921554565,-0.521759808063507,-0.817660689353943,0.730350375175476,-0.433825135231018,-0.527621328830719,0.911739468574524,-0.410755068063736,-0.0033799922093749,0.691944181919098,-0.468273937702179,0.549484074115753,0.774608373641968,0.242380812764168,0.584151864051819,0.989863574504852,0.140409797430038,-0.0213352963328362,0.804379880428314,0.0737025514245033,-0.589525818824768,0.314716130495071,0.0310250874608755,-0.948678612709045,-0.313666999340057,0.0362151674926281,-0.948842108249664,-0.80082243680954,0.0766521021723747,-0.593976378440857,-0.991654992103577,0.126536756753922,-0.0246729962527752,-0.768112361431122,0.233975827693939,0.596035838127136,-0.259528934955597,0.320579528808594,0.910973966121674,0.263192266225815,0.322610139846802,0.909204363822937,0.195736393332481,0.699835360050201,-0.686962783336639,-0.170355454087257,0.717495620250702,-0.675410389900208,0.477995604276657,0.850862979888916,-0.218065083026886,-0.428644895553589,0.876369655132294,-0.219635486602783,0.0714334547519684,0.996007323265076,-0.0535424388945103,-0.0716112405061722,0.99622917175293,-0.0489821694791317,-0.374922752380371,0.927042245864868,-0.00506721390411258,0.415985852479935,0.909274399280548,0.0132603198289871,-0.0641357228159904,0.891062200069427,0.449326902627945,0.0862409770488739,0.882498025894165,0.462341487407684,-0.339568704366684,0.925040900707245,0.170271500945091,0.390657365322113,0.898258626461029,0.201291710138321,-0.0569503754377365,0.995180308818817,0.0798297673463821,0.0567497536540031,0.994839191436768,0.0841094851493835,-0.0701099261641502,0.997099161148071,0.029627401381731,0.0693256258964539,0.997021675109863,0.0337902829051018, +-0.0260852538049221,-0.968207478523254,0.248784855008125,0.0251157637685537,-0.966607511043549,0.255027651786804,-0.146746069192886,-0.979833602905273,0.135615885257721,0.166792407631874,-0.974276185035706,0.15154592692852,-0.176382571458817,-0.984316647052765,-0.0031696381047368,0.211384326219559,-0.977402865886688,-0.000570365693420172,-0.17161837220192,-0.97879421710968,-0.111843466758728,0.199337288737297,-0.971320390701294,-0.129619762301445,-0.037770040333271,-0.962945997714996,-0.267036229372025,0.0418281741440296,-0.960833728313446,-0.273950904607773,-0.0135796070098877,-0.992890596389771,-0.11825305223465,0.0135844498872757,-0.992695689201355,-0.119878239929676,0.0355628617107868,-0.999117851257324,-0.0223348066210747,-0.0333858355879784,-0.999221086502075,-0.0210399478673935,0.0308546014130116,-0.999523758888245,-0.000390584813430905,-0.0288677457720041,-0.999583065509796,-0.00062242429703474,0.029155507683754,-0.999057292938232,0.0321626700460911,-0.0284003578126431,-0.999023258686066,0.0338497050106525,-0.0120980534702539,-0.993707835674286,0.111347578465939,0.00910376943647861,-0.99325966835022,0.115551710128784,-0.00476514408364892,-0.999971807003021,-0.0057949535548687,0.00471838423982263,-0.999971210956573,-0.00593832461163402,-0.00285345106385648,-0.999979972839355,0.0056630983017385,0.00283746444620192,-0.999979138374329,0.00580718135461211,-0.00166430289391428,-0.999998569488525,-0.000415657821577042,0.00165457336697727,-0.999998569488525,-0.000413601024774835,0.284946709871292,-0.919874012470245,0.269512891769409,0.363277047872543,-0.931672275066376,0.00405076565220952,0.314426571130753,-0.918664693832397,-0.239146828651428,0.100402094423771,-0.909630596637726,-0.403102338314056,-0.0946935415267944,-0.917745590209961,-0.385715007781982,-0.272689670324326,-0.937879860401154,-0.214527055621147,-0.308305591344833,-0.951286017894745,0.00161590834613889,-0.246110707521439,-0.939373433589935,0.238761231303215,-0.0758635476231575,-0.926537990570068,0.368472456932068,0.0785287395119667,-0.920829653739929,0.381976246833801, +-0.298891723155975,-0.0761454105377197,0.951244175434113,-0.798719525337219,-0.123058512806892,0.588985323905945,-0.990210890769958,-0.138095885515213,-0.020297696813941,-0.811028718948364,-0.147678956389427,-0.566059529781342,-0.299995094537735,-0.181135579943657,-0.936585783958435,0.303662091493607,-0.159973546862602,-0.939253866672516,0.814442694187164,-0.0887727737426758,-0.573412954807281,0.998317420482635,-0.0554376430809498,-0.0169961545616388,0.800640821456909,-0.0562014020979404,0.596502900123596,0.298394441604614,-0.0697403624653816,0.951891303062439 + } + NormalsW: *490 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *1084 { + a: 0.602478682994843,0.470590829849243,0.654994606971741,0.511613130569458,0.391553997993469,0.957454681396484,0.452100574970245,0.918093383312225,0.171463847160339,0.915599524974823,0.231337487697601,0.95604795217514,0.794995188713074,0.514229953289032,0.849007725715637,0.475199222564697,0.35736608505249,0.92600291967392,0.385164260864258,0.883084058761597,0.238999456167221,0.881797790527344,0.266055971384048,0.925202190876007,0.31178030371666,0.917684853076935,0.312197476625443,0.870115339756012,0.764469742774963,0.488275647163391,0.790259599685669,0.448337972164154,0.662189185619354,0.445943921804428,0.686468541622162,0.486817598342896,0.726348757743835,0.440493226051331,0.725631773471832,0.47885650396347,0.406369090080261,0.833468854427338,0.31263855099678,0.822178900241852,0.218678086996078,0.831793248653412,0.433270454406738,0.691480875015259,0.313863903284073,0.688109636306763,0.194408297538757,0.689308524131775,0.496492743492126,0.865480482578278,0.12799546122551,0.862163901329041,0.564949512481689,0.425404787063599,0.88819944858551,0.431447207927704,0.643006265163422,0.401050239801407,0.811107158660889,0.404192537069321,0.72723662853241,0.393000483512878,0.553759098052979,0.69975221157074,0.0737495720386505,0.695318341255188,0.520467638969421,0.278767645359039,0.938130140304565,0.286575257778168,0.626268804073334,0.283260583877563,0.832235097885132,0.287110686302185,0.729274332523346,0.283999264240265,0.396399319171906,0.491706699132919,0.315691441297531,0.49475958943367,0.235054492950439,0.490246027708054,0.464949727058411,0.464218735694885,0.167083501815796,0.461520075798035,0.602135956287384,0.0684418082237244,0.86438000202179,0.0733442306518555,0.657980024814606,0.106595456600189,0.807148694992065,0.109383851289749,0.732422888278961,0.115564197301865,0.422784566879272,0.575744152069092,0.314890652894974,0.579642117023468,0.207105576992035,0.573793411254883,0.0982574224472046,0.553624331951141,0.921107530593872,0.161243617534637,0.828228712081909,0.18182572722435,0.731143951416016, +0.18396732211113,0.634207189083099,0.178198724985123,0.542162537574768,0.154159754514694,0.531845211982727,0.55770069360733,0.424816906452179,0.767834663391113,0.533713638782501,0.791249871253967,0.53376305103302,0.359473317861557,0.630682647228241,0.346117854118347,0.72823029756546,0.339844346046448,0.825474977493286,0.349759072065353,0.921827912330627,0.366727411746979,0.0921100974082947,0.787220895290375,0.201436221599579,0.765802323818207,0.313187330961227,0.759719550609589,0.725120544433594,0.506205320358276,0.70163768529892,0.507205247879028,0.748549699783325,0.508082091808319,0.692593097686768,0.52767276763916,0.756822884082794,0.528873324394226,0.72465193271637,0.53127908706665,0.274479240179062,0.972887814044952,0.348140925168991,0.973530948162079,0.311536520719528,0.946233689785004,0.283923178911209,0.947961151599884,0.339115560054779,0.948444306850433,0.311281114816666,0.97676020860672,0.316004902124405,0.461090415716171,0.258834600448608,0.453414589166641,0.373311996459961,0.454444766044617,0.218317747116089,0.423303306102753,0.414385676383972,0.425065904855728,0.81921911239624,0.0439357161521912,0.648364126682281,0.0407418012619019,0.784808754920959,0.0752453207969666,0.681580305099487,0.0733155310153961,0.732994675636292,0.0849785804748535,0.733555018901825,0.0549982190132141,0.701470375061035,0.0517210066318512,0.765739679336548,0.0529224276542664,0.691920638084412,0.0264308154582977,0.776228308677673,0.0280068665742874,0.364863097667694,0.40417355298996,0.268182009458542,0.403308689594269,0.352582693099976,0.430572837591171,0.27999210357666,0.429921686649323,0.316270142793655,0.431974112987518,0.734140455722809,0.0236847400665283,0.316562384366989,0.398874163627625,0.412932097911835,0.528573334217072,0.506892025470734,0.50801408290863,0.564242839813232,0.110179953277111,0.642315328121185,0.139609262347221,0.73184859752655,0.146279916167259,0.821568489074707,0.142960250377655,0.900686264038086,0.116469383239746,0.124405153095722,0.504560053348541,0.217817395925522,0.52679580450058,0.315353244543076, +0.530658602714539,0.314364701509476,0.635197579860687,0.19834041595459,0.631686270236969,0.079723596572876,0.623768210411072,0.937646627426147,0.22292560338974,0.834158778190613,0.235027492046356,0.730153858661652,0.236939549446106,0.626292884349823,0.231141805648804,0.523329675197601,0.215180397033691,0.549125969409943,0.62813013792038,0.430441200733185,0.633788228034973,0.440124869346619,0.966146528720856,0.838515400886536,0.518907725811005,0.398446917533875,0.920593678951263,0.225070118904114,0.919063746929169,0.34234818816185,0.898007094860077,0.281555324792862,0.897479236125946,0.801303029060364,0.480886548757553,0.649937391281128,0.478057116270065,0.752103209495544,0.46344780921936,0.699754476547241,0.462469220161438,0.354644447565079,0.850180327892303,0.270089834928513,0.849476754665375,0.365042090415955,0.796046316623688,0.260713845491409,0.79503720998764,0.437561422586441,0.87353378534317,0.186775833368301,0.87129408121109,0.507039606571198,0.923162043094635,0.900566101074219,0.477472096681595,0.616486668586731,0.434071213006973,0.836373805999756,0.438181549310684,0.688903868198395,0.418855398893356,0.764576077461243,0.420269936323166,0.467269122600555,0.81401652097702,0.158138930797577,0.811219215393066,0.502279937267303,0.410606443881989,0.0627380311489105,0.854713976383209,0.591752052307129,0.383559465408325,0.862979054450989,0.388629496097565,0.681753635406494,0.36915785074234,0.773578643798828,0.370874404907227,0.367003500461578,0.553495466709137,0.263279169797897,0.55255526304245,0.469368875026703,0.543452262878418,0.160954833030701,0.540558993816376,0.513905763626099,0.102571427822113,0.0588056445121765,0.505284488201141,0.594062209129333,0.147633031010628,0.869488000869751,0.152781784534454,0.684037208557129,0.161944717168808,0.779040932655334,0.16372075676918,0.370675146579742,0.607063710689545,0.25859871506691,0.606049060821533,0.145374298095703,0.596301853656769,0.0258677005767822,0.57513701915741,0.881135821342468,0.202056497335434,0.781744599342346,0.209961444139481,0.679607272148132,0.208052158355713, +0.58058112859726,0.196438074111938,0.481122255325317,0.161146432161331,0.484117537736893,0.599363088607788,0.488890022039413,0.735209882259369,0.469705253839493,0.321251899003983,0.576742053031921,0.316578030586243,0.678357720375061,0.312196522951126,0.779101014137268,0.314079791307449,0.880481839179993,0.322255939245224,0.0200965702533722,0.757516384124756,0.137964904308319,0.732004106044769,0.254589229822159,0.723779320716858,0.372457802295685,0.724862575531006,0.70975524187088,0.494899183511734,0.740897476673126,0.49548128247261,0.684605002403259,0.508900940418243,0.765506863594055,0.510413110256195,0.711026430130005,0.518089830875397,0.738760530948639,0.518608272075653,0.779486656188965,0.53977644443512,0.373344898223877,0.986652493476868,0.293045252561569,0.93440192937851,0.330225378274918,0.934727132320404,0.264301627874374,0.950499713420868,0.358690291643143,0.951326787471771,0.295318394899368,0.960744798183441,0.327507466077805,0.961026132106781,0.291615635156631,0.991895437240601,0.330695897340775,0.99223530292511,0.279915541410446,0.476102858781815,0.351810783147812,0.476750791072845,0.217215418815613,0.459623634815216,0.414819180965424,0.461408376693726,0.17395406961441,0.413866102695465,0.609365403652191,0.0277925133705139,0.821228384971619,0.0771724879741669,0.645114243030548,0.0738802552223206,0.766042709350586,0.0984628200531006,0.699465751647949,0.0972182750701904,0.711682140827179,0.0673527717590332,0.754951119422913,0.0681615769863129,0.679631471633911,0.048385351896286,0.787688136100769,0.0504053831100464,0.663749217987061,0.0130646228790283,0.236243277788162,0.390111863613129,0.377726316452026,0.428952753543854,0.254887193441391,0.427850246429443,0.340295702219009,0.445251107215881,0.292009443044662,0.44481748342514,0.715234458446503,0.0391920208930969,0.752453804016113,0.0398878157138824,0.337720602750778,0.416472017765045,0.295101016759872,0.416090309619904,0.711708128452301,0.00748854875564575,0.757162570953369,0.00833827257156372,0.447942823171616,0.501456081867218,0.553772807121277,0.0600323602557182, +0.613229632377625,0.109607428312302,0.689205467700958,0.128836065530777,0.775113821029663,0.130442023277283,0.851755380630493,0.114066451787949,0.107177138328552,0.455960690975189,0.183325409889221,0.499039113521576,0.269650250673294,0.51121711730957,0.361414283514023,0.512046873569489,0.25497767329216,0.659757494926453,0.135929852724075,0.658096075057983,0.0107059478759766,0.659443974494934,0.885907173156738,0.258374810218811,0.781965494155884,0.260807752609253,0.677486419677734,0.258854746818542,0.573708057403564,0.252538681030273,0.464756608009338,0.233512043952942,0.492321312427521,0.661356866359711,0.373275816440582,0.660832107067108,0.62783670425415,0.493551731109619,0.644688129425049,0.529908061027527,0.422209978103638,0.940435707569122,0.47737255692482,0.945664644241333,0.220454931259155,0.978495001792908,0.822809219360352,0.497196286916733,0.872932314872742,0.499215692281723,0.200970590114594,0.938482344150543,0.376128643751144,0.938939094543457,0.37139481306076,0.906395852565765,0.420254111289978,0.89782440662384,0.247074246406555,0.937804996967316,0.203656941652298,0.895902097225189,0.252364605665207,0.905350625514984,0.335657805204391,0.919635593891144,0.311974734067917,0.895291984081268,0.349004656076431,0.873808085918427,0.287871748209,0.919218242168427,0.275319308042526,0.87317830324173,0.781034588813782,0.499162763357162,0.777271747589111,0.469674199819565,0.820842385292053,0.459168672561646,0.669508635997772,0.497078031301498,0.631223142147064,0.455624222755432,0.674371063709259,0.467750728130341,0.745739161968231,0.481583178043365,0.725965917110443,0.460975289344788,0.758703768253326,0.442631721496582,0.705436289310455,0.480829834938049,0.693936586380005,0.44142097234726,0.359854847192764,0.825497567653656,0.396488189697266,0.859475553035736,0.312410444021225,0.846622407436371,0.265293627977371,0.824751675128937,0.228088289499283,0.857989132404327,0.369587659835815,0.76222175359726,0.416228234767914,0.802897810935974,0.312860459089279,0.793209254741669,0.256767481565475,0.761168777942657,0.209383428096771, +0.801024675369263,0.452341914176941,0.846026003360748,0.475441098213196,0.893365681171417,0.172488331794739,0.843509376049042,0.148555412888527,0.890442192554474,0.534256815910339,0.895491898059845,0.582690119743347,0.449256002902985,0.869579613208771,0.454618752002716,0.926200270652771,0.452117204666138,0.603748500347137,0.4108726978302,0.651931703090668,0.423950463533401,0.84997034072876,0.415475308895111,0.801332116127014,0.426743179559708,0.684785008430481,0.394902050495148,0.726773023605347,0.417795985937119,0.769587397575378,0.396487355232239,0.479500889778137,0.776800453662872,0.51618754863739,0.830929160118103,0.146587073802948,0.773771584033966,0.108919382095337,0.827238500118256,0.586699783802032,0.815163910388947,0.547737240791321,0.395187050104141,0.972624897956848,0.378639608621597,0.90652871131897,0.401893943548203,0.582038998603821,0.352121651172638,0.635962963104248,0.375023543834686,0.873860120773315,0.357576757669449,0.81911826133728,0.378447294235229,0.679633021354675,0.341537773609161,0.727721095085144,0.36708065867424,0.776730179786682,0.343352854251862,0.364641129970551,0.53083735704422,0.418346583843231,0.550618886947632,0.368895709514618,0.579034388065338,0.315137773752213,0.553479611873627,0.266068667173386,0.529944598674774,0.260907858610153,0.578056991100311,0.211986660957336,0.548733592033386,0.460521161556244,0.521385848522186,0.520399749279022,0.530744791030884,0.476885855197906,0.568857312202454,0.170324593782425,0.518709003925323,0.153287708759308,0.565990447998047,0.110551826655865,0.527088522911072,0.552257120609283,0.485010653734207,0.552568793296814,0.13074779510498,0.497594982385635,0.128133684396744,0.934759736061096,0.0887062847614288,0.0409873127937317,0.53537905216217,0.911583662033081,0.137459233403206,0.601590514183044,0.128374680876732,0.637984454631805,0.157491058111191,0.587693929672241,0.169499069452286,0.862684845924377,0.133255526423454,0.87503457069397,0.174870520830154,0.825228095054626,0.160991311073303,0.68614262342453,0.14468702673912,0.731526374816895,0.163527071475983, +0.682079076766968,0.182294577360153,0.777582168579102,0.146396398544312,0.780237317085266,0.184129565954208,0.427016615867615,0.604430556297302,0.372281730175018,0.634972035884857,0.314625412225723,0.607664167881012,0.25646248459816,0.633922398090363,0.202328979969025,0.602398276329041,0.139687657356262,0.628242790699005,0.0874337553977966,0.587529301643372,0.0159390568733215,0.618618488311768,0.930924296379089,0.190826058387756,0.885218501091003,0.231066048145294,0.831875443458557,0.207724511623383,0.782518029212952,0.236822307109833,0.730656266212463,0.210066288709641,0.677830696105957,0.234865248203278,0.629594922065735,0.203943222761154,0.575417041778564,0.225274562835693,0.531246960163116,0.183354675769806,0.469298034906387,0.197872340679169,0.542086064815521,0.591769278049469,0.489148914813995,0.631430327892303,0.493044137954712,0.694528341293335,0.547195732593536,0.745539605617523,0.430759251117706,0.728878378868103,0.616568624973297,0.709704875946045,0.523953557014465,0.318976014852524,0.573957324028015,0.281957864761353,0.627558827400208,0.314326345920563,0.677857995033264,0.28370988368988,0.728760957717896,0.311459004878998,0.780665040016174,0.285631537437439,0.829784989356995,0.318106561899185,0.88455855846405,0.287764012813568,0.933143973350525,0.326625108718872,0.993955135345459,0.282972574234009,0.0794641375541687,0.741243422031403,0.134573817253113,0.69124698638916,0.196215897798538,0.726743102073669,0.25412979722023,0.688308954238892,0.31353548169136,0.722925662994385,0.373583316802979,0.689398527145386,0.72535502910614,0.493652820587158,0.711863338947296,0.506540179252625,0.695761919021606,0.499638736248016,0.754704117774963,0.500740587711334,0.738355755805969,0.507035374641418,0.675798177719116,0.521996557712555,0.697415828704834,0.515581965446472,0.773818254470825,0.52382880449295,0.752455353736877,0.516610682010651,0.708777964115143,0.530443608760834,0.724891901016235,0.518438160419464,0.740545928478241,0.531037449836731,0.271283835172653,0.989600241184235,0.255007356405258,0.966717898845673,0.689012289047241, +0.541695773601532,0.367711067199707,0.967704057693481,0.311645239591599,0.93342536687851,0.295913189649582,0.946870386600494,0.276760011911392,0.939254939556122,0.346424669027328,0.939865171909332,0.327146142721176,0.947143495082855,0.279394805431366,0.95811253786087,0.343472301959991,0.958672940731049,0.311413019895554,0.960888922214508,0.293092161417007,0.97597473859787,0.329479962587357,0.976292014122009,0.311147660017014,0.993043065071106,0.286163300275803,0.459207326173782,0.315852552652359,0.477531284093857,0.274184674024582,0.493959754705429,0.2464519739151,0.471168965101242,0.345877438783646,0.459744483232498,0.385363698005676,0.472422510385513,0.357206076383591,0.49470928311348,0.236274808645248,0.441331714391708,0.199258208274841,0.479709446430206,0.192162305116653,0.440506547689438,0.396096765995026,0.442769765853882,0.440242946147919,0.44274514913559,0.43239551782608,0.481824845075607,0.830801844596863,0.0224764347076416,0.140108585357666,0.432613551616669,0.841878652572632,0.0567711889743805,0.42676055431366,0.401479601860046,0.625240683555603,0.0527213215827942,0.580930650234222,0.041548490524292,0.804043173789978,0.0620129108428955,0.837448835372925,0.0952771306037903,0.796451807022095,0.0917812585830688,0.662854075431824,0.0593734979629517,0.669327318668365,0.0894047915935516,0.628228485584259,0.0913659632205963,0.760157465934753,0.0825769901275635,0.771367311477661,0.114792346954346,0.732709646224976,0.100216448307037,0.705940544605255,0.0815635323524475,0.693534314632416,0.113337367773056,0.715347230434418,0.0536280870437622,0.7332723736763,0.070126086473465,0.692843019962311,0.0604602098464966,0.751801490783691,0.0543095767498016,0.774034738540649,0.0619780421257019,0.696807265281677,0.0412300229072571,0.670377194881439,0.0320470929145813,0.770791828632355,0.0426130890846252,0.797546625137329,0.034424364566803,0.369080722332001,0.385252714157104,0.389394581317902,0.412400126457214,0.780437767505646,0.0111673474311829,0.243518054485321,0.411092579364777,0.358577460050583,0.419943302869797,0.361692368984222, +0.44030824303627,0.274189352989197,0.419187128543854,0.270709037780762,0.4394910633564,0.316139787435532,0.446382284164429,0.336883753538132,0.431419193744659,0.295671254396439,0.431049644947052,0.713212311267853,0.0239278078079224,0.733842849731445,0.0396146178245544,0.755045056343079,0.0247098803520203,0.340556353330612,0.399967163801193,0.316411942243576,0.416088938713074,0.292554587125778,0.399538099765778,0.316721767187119,0.380154222249985,0.488112807273865,0.485949665307999,0.40557849407196,0.509730756282806,0.580927848815918,0.0887579619884491,0.648997962474823,0.123018726706505,0.732139945030212,0.130695223808289,0.815510630607605,0.126131519675255,0.884813785552979,0.0944387912750244,0.143549114465714,0.482825219631195,0.225532203912735,0.508095741271973,0.315530806779861,0.511834800243378,0.314126998186111,0.660285353660583,0.195605754852295,0.659008741378784,0.0749524831771851,0.657678484916687,0.939491987228394,0.253383696079254,0.833917737007141,0.260329365730286,0.729717969894409,0.260257482528687,0.625588119029999,0.256434977054596,0.52034729719162,0.245548367500305,0.553260385990143,0.662111937999725,0.43265038728714,0.661160290241241,0.464816510677338,0.273081123828888,0.617457211017609,0.665136873722076,0.613003313541412,0.624255239963531,0.0107575953006744,0.704063296318054,0.995493769645691,0.243433237075806,0.992287397384644,0.207648873329163,0.0795024633407593,0.480627149343491,0.913023710250854,0.0667482241988182,0.88657557964325,0.0472622513771057,0.531231045722961,0.0811627358198166,0.525021970272064,0.459788769483566,0.492480397224426,0.435810953378677,0.264288693666458,0.384318023920059,0.290869623422623,0.381272882223129,0.734453439712524,0.00694537162780762,0.342550724744797,0.381733357906342,0.688343405723572,0.0094456672668457,0.206362098455429,0.399502456188202,0.804879426956177,0.0157029032707214,0.637591779232025,0.0188645422458649,0.397031426429749,0.391549229621887,0.458936750888824,0.416435837745667,0.858674764633179,0.0324531197547913,0.724391579627991,0.545210897922516,0.706976771354675, +0.544137418270111,0.351061165332794,0.990294635295868,0.759877145290375,0.543020308017731,0.741834163665771,0.544789016246796,0.402059078216553,0.980084359645844,0.669537723064423,0.537721216678619,0.804610967636108,0.532897293567657,0.249060869216919,0.985568106174469,0.0386949181556702,0.810158312320709,0.987269401550293,0.330926775932312,0.482556462287903,0.369478702545166,0.606246829032898,0.762923300266266,0.603922307491302,0.580621540546417,0.589611411094666,0.540584146976471,0.981844186782837,0.170506834983826,0.966616868972778,0.136901438236237,0.95127272605896,0.110747583210468,0.572464883327484,0.510118126869202,0.0897088050842285,0.891500294208527,0.951377868652344,0.419001400470734,0.52620255947113,0.444639980792999,0.561867833137512,0.859232723712921,0.116444259881973,0.91967898607254,0.145724952220917,0.942725479602814,0.550871253013611,0.470935314893723,0.577673077583313,0.493696570396423,0.182623386383057,0.963879883289337,0.611330091953278,0.514661014080048 + } + UVIndex: *1952 { + a: 0,246,541,539,246,1,247,541,124,518,2,248,249,124,248,3,5,250,540,253,520,6,251,125,125,251,7,252,253,540,537,4,2,254,126,248,254,8,255,126,126,255,9,256,248,126,256,3,11,257,127,259,257,5,253,127,127,253,4,258,259,127,258,10,8,260,128,255,260,12,261,128,128,261,13,262,255,128,262,9,12,263,129,261,263,11,259,129,129,259,10,264,261,129,264,13,6,265,130,251,265,14,266,130,130,266,15,267,251,130,267,7,17,268,131,270,268,1,246,131,131,246,0,269,270,131,269,16,14,271,132,266,271,19,272,132,132,272,18,273,266,132,273,15,19,274,133,272,274,17,270,133,133,270,16,275,272,133,275,18,21,276,134,278,276,20,277,134,134,277,9,262,278,134,262,13,22,279,135,280,279,21,278,135,135,278,13,264,280,135,264,10,69,281,136,283,281,60,282,136,136,282,20,276,283,136,276,21,68,284,137,285,284,69,283,137,137,283,21,279,285,137,279,22,20,286,138,277,286,26,287,138,138,287,3,256,277,138,256,9,27,288,139,289,288,22,280,139,139,280,10,258,289,139,258,4,0,539,538,291,249,3,287,140,140,287,26,290,291,538,534,28,4,537,536,289,252,7,292,141,141,292,29,293,289,536,532,27,28,294,142,291,294,30,295,142,142,295,16,269,291,142,269,0,31,296,143,297,296,29,292,143,143,292,7,267,297,143,267,15,30,298,144,295,298,32,299,144,144,299,18,275,295,144,275,16,32,300,145,299,300,31,297,145,145,297,15,273,299,145,273,18,60,301,146,282,301,61,302,146,146,302,26,286,282,146,286,20,67,303,147,304,303,68,285,147,147,285,22,288,304,147,288,27,61,305,535,302,524,62,306,148,148,306,28,534,302,535,290,26,66,307,533,308,522,67,304,149,149,304,27,532,308,533,293,29,62,309,150,306,309,63,310,150,150,310,30,294,306,150,294,28,65,311,151,312,311,66,308,151,151,308,29,296,312,151,296,31,63,313,152,310,313,64,314,152,152,314,32,298,310,152,298,30,64,315,153,314,315,65,312,153,153,312,31,300,314,153,300,32,113,316,154,319,316,104,317,154,154,317,50,318,319,154,318,51,112,320,155,322,320,113,319,155,155,319,51,321,322,155,321,52,104,323,156,317,323,105,324,156,156,324,59,325,317,156,325,50,111,326,157,328,326,112,322,157,157,322,52,327,328,157,327,53,105,329, +531,324,499,106,330,158,158,330,58,331,324,531,527,59,110,332,530,334,496,111,328,159,159,328,53,333,334,530,529,54,106,335,160,330,335,107,336,160,160,336,57,337,330,160,337,58,109,338,161,340,338,110,334,161,161,334,54,339,340,161,339,55,107,341,162,336,341,108,342,162,162,342,56,343,336,162,343,57,108,344,163,342,344,109,340,163,163,340,55,345,342,163,345,56,51,318,164,348,318,50,346,164,164,346,123,347,348,164,347,114,52,321,165,350,321,51,348,165,165,348,114,349,350,165,349,115,53,327,166,352,327,52,350,166,166,350,115,351,352,166,351,116,54,529,528,354,333,53,352,167,167,352,116,353,354,528,495,117,55,339,168,356,339,54,354,168,168,354,117,355,356,168,355,118,56,345,169,358,345,55,356,169,169,356,118,357,358,169,357,119,57,343,170,360,343,56,358,170,170,358,119,359,360,170,359,120,58,337,171,362,337,57,360,171,171,360,120,361,362,171,361,121,59,527,526,364,331,58,362,172,172,362,121,363,364,526,492,122,50,325,173,346,325,59,364,173,173,364,122,365,346,173,365,123,23,366,174,368,366,33,367,174,174,367,61,301,368,174,301,60,33,369,525,367,490,35,370,175,175,370,62,524,367,525,305,61,35,371,176,370,371,37,372,176,176,372,63,309,370,176,309,62,37,373,177,372,373,39,374,177,177,374,64,313,372,177,313,63,39,375,178,374,375,38,376,178,178,376,65,315,374,178,315,64,38,377,179,376,377,36,378,179,179,378,66,311,376,179,311,65,36,379,523,378,493,34,380,180,180,380,67,522,378,523,307,66,34,381,181,380,381,25,382,181,181,382,68,303,380,181,303,67,25,383,182,382,383,24,384,182,182,384,69,284,382,182,284,68,24,385,183,384,385,23,368,183,183,368,60,281,384,183,281,69,19,386,184,274,386,70,387,184,184,387,71,388,274,184,388,17,70,386,185,390,386,19,271,185,185,271,14,389,390,185,389,72,73,391,186,392,391,1,268,186,186,268,17,388,392,186,388,71,6,393,187,265,393,74,394,187,187,394,72,389,265,187,389,14,75,395,188,396,395,73,392,188,188,392,71,387,396,188,387,70,74,397,189,394,397,75,396,189,189,396,70,390,394,189,390,72,76,398,521,399,516,74,393,190,190,393,6,520,399,521,250,5,73,400,519,391,515,77,401,191,191,401,2,518,391,519, +247,1,11,263,192,404,263,12,402,192,192,402,78,403,404,192,403,79,12,260,193,402,260,8,405,193,193,405,80,406,402,193,406,78,76,399,194,407,399,5,257,194,194,257,11,404,407,194,404,79,2,401,195,254,401,77,408,195,195,408,80,405,254,195,405,8,79,403,196,407,403,78,409,196,196,409,81,410,407,196,410,76,78,406,197,409,406,80,408,197,197,408,77,411,409,197,411,81,75,397,517,513,397,74,516,517,198,398,76,410,412,198,410,81,73,395,514,400,395,75,513,514,199,412,81,411,515,199,411,77,83,413,200,416,413,82,414,200,200,414,41,415,416,200,415,42,82,417,201,414,417,84,418,201,201,418,40,419,414,201,419,41,85,420,202,422,420,83,416,202,202,416,42,421,422,202,421,44,84,423,203,418,423,86,424,203,203,424,43,425,418,203,425,40,87,426,512,428,507,85,422,204,204,422,44,427,428,512,498,46,86,429,511,424,509,88,430,205,205,430,45,431,424,511,501,43,89,432,206,434,432,87,428,206,206,428,46,433,434,206,433,48,88,435,207,430,435,90,436,207,207,436,47,437,430,207,437,45,91,438,208,440,438,89,434,208,208,434,48,439,440,208,439,49,90,441,209,436,441,91,440,209,209,440,49,442,436,209,442,47,93,443,210,445,443,92,444,210,210,444,91,441,445,210,441,90,92,446,211,444,446,94,447,211,211,447,89,438,444,211,438,91,95,448,212,449,448,93,445,212,212,445,90,435,449,212,435,88,94,450,213,447,450,96,451,213,213,451,87,432,447,213,432,89,97,452,510,453,506,95,449,214,214,449,88,509,453,510,429,86,96,454,508,451,502,98,455,215,215,455,85,507,451,508,426,87,99,456,216,457,456,97,453,216,216,453,86,423,457,216,423,84,98,458,217,455,458,100,459,217,217,459,83,420,455,217,420,85,84,417,218,457,417,82,460,218,218,460,101,461,457,218,461,99,82,413,219,460,413,83,459,219,219,459,100,462,460,219,462,101,95,463,220,448,463,102,464,220,220,464,92,443,448,220,443,93,102,465,221,464,465,96,450,221,221,450,94,446,464,221,446,92,103,466,222,467,466,97,456,222,222,456,99,461,467,222,461,101,98,468,223,458,468,103,467,223,223,467,101,462,458,223,462,100,97,466,505,452,466,103,469,505,224,504,102,463,506,224,463,95,103,468,503,469,468,98,502,503,225,454,96,465,504,225, +465,102,40,425,226,471,425,43,470,226,226,470,105,323,471,226,323,104,43,501,500,470,431,45,472,227,227,472,106,499,470,500,329,105,45,437,228,472,437,47,473,228,228,473,107,335,472,228,335,106,47,442,229,473,442,49,474,229,229,474,108,341,473,229,341,107,49,439,230,474,439,48,475,230,230,475,109,344,474,230,344,108,48,433,231,475,433,46,476,231,231,476,110,338,475,231,338,109,46,498,497,476,427,44,477,232,232,477,111,496,476,497,332,110,44,421,233,477,421,42,478,233,233,478,112,326,477,233,326,111,42,415,234,478,415,41,479,234,234,479,113,320,478,234,320,112,41,419,235,479,419,40,471,235,235,471,104,316,479,235,316,113,115,349,236,481,349,114,480,236,236,480,24,383,481,236,383,25,116,351,237,482,351,115,481,237,237,481,25,381,482,237,381,34,117,495,494,483,353,116,482,238,238,482,34,493,483,494,379,36,118,355,239,484,355,117,483,239,239,483,36,377,484,239,377,38,119,357,240,485,357,118,484,240,240,484,38,375,485,240,375,39,120,359,241,486,359,119,485,241,241,485,39,373,486,241,373,37,121,361,242,487,361,120,486,242,242,486,37,371,487,242,371,35,122,492,491,488,363,121,487,243,243,487,35,490,488,491,369,33,123,365,244,489,365,122,488,244,244,488,33,366,489,244,366,23,114,347,245,480,347,123,489,245,245,489,23,385,480,245,385,24 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *976 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 1576471718144, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 1576448317568, "Geometry::", "Line" { + GeometryVersion: 124 + Type: "Line" + LineVersion: 100 + Points: *15 { + a: 3.06161699786838e-15,3.06161699786838e-15,-50,-50,3.74939945665464e-31,-6.12323399573677e-15,-9.18485099360515e-15,-3.06161699786838e-15,50,50,-7.49879891330929e-31,1.22464679914735e-14,1.53080849893419e-14,3.06161699786838e-15,-50 + } + PointsIndex: *5 { + a: 0,1,2,3,-5 + } + } + NodeAttribute: 1576471715328, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 1576448321728, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Periodic" + Rational: 0 + Points: *32 { + a: 1.43947120229654e-15,23.5083487467367,-23.5083487467367,1,1.24651880540528e-31,33.2458256266316,-2.03571969693327e-15,1,-1.43947120229654e-15,23.5083487467367,23.5083487467367,1,-2.03571969693327e-15,1.72346947125745e-15,33.2458256266316,1,-1.43947120229654e-15,-23.5083487467367,23.5083487467367,1,-2.03919434334258e-31,-33.2458256266316,3.33025709088097e-15,1,1.43947120229654e-15,-23.5083487467367,-23.5083487467367,1,2.03571969693327e-15,-4.53372150233988e-15,-33.2458256266316,1 + } + KnotVector: *15 { + a: -3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11 + } + } + NodeAttribute: 1576478758688, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 1576448322048, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Periodic" + Rational: 0 + Points: *32 { + a: 1.91929493639539e-15,31.344464995649,-31.344464995649,1,1.6620250738737e-31,44.3277675021755,-2.71429292924436e-15,1,-1.91929493639539e-15,31.344464995649,31.344464995649,1,-2.71429292924437e-15,2.29795929500993e-15,44.3277675021755,1,-1.91929493639539e-15,-31.344464995649,31.344464995649,1,-2.71892579112344e-31,-44.3277675021755,4.44034278784129e-15,1,1.91929493639539e-15,-31.344464995649,-31.344464995649,1,2.71429292924437e-15,-6.04496200311983e-15,-44.3277675021755,1 + } + KnotVector: *15 { + a: -3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11 + } + } + NodeAttribute: 1576478760800, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + Geometry: 1576448327488, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Periodic" + Rational: 0 + Points: *32 { + a: 1.43947120229654e-15,23.5083487467367,-23.5083487467367,1,1.24651880540528e-31,33.2458256266316,-2.03571969693327e-15,1,-1.43947120229654e-15,23.5083487467367,23.5083487467367,1,-2.03571969693327e-15,1.72346947125745e-15,33.2458256266316,1,-1.43947120229654e-15,-23.5083487467367,23.5083487467367,1,-2.03919434334258e-31,-33.2458256266316,3.33025709088097e-15,1,1.43947120229654e-15,-23.5083487467367,-23.5083487467367,1,2.03571969693327e-15,-4.53372150233988e-15,-33.2458256266316,1 + } + KnotVector: *15 { + a: -3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11 + } + } + NodeAttribute: 1576632422624, "NodeAttribute::", "Null" { + Properties70: { + P: "Look", "enum", "", "",0 + } + TypeFlags: "Null" + } + NodeAttribute: 1578506422896, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",66.6666666666667 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1578506416752, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",66.6666666666667 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1578506423664, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",66.6666666666667 + } + TypeFlags: "Skeleton" + } + Model: 1579366806720, "Model::Slime_002:Slime_Body_high", "Mesh" { + Version: 232 + Properties70: { + P: "RotationPivot", "Vector3D", "Vector", "",0,25,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,25,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + P: "Visibility", "Visibility", "", "A",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1579366781200, "Model::Slime_002:grp_Slime", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366788160, "Model::Slime_002:grp_geo", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366813680, "Model::Slime_002:Slime_Body_low", "Mesh" { + Version: 232 + Properties70: { + P: "RotationPivot", "Vector3D", "Vector", "",0,25,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,25,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1579366785840, "Model::Slime_002:grp_Ctrl", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366795120, "Model::Slime_002:Ctrl_master", "Line" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0,49.9673621551325,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366816000, "Model::Slime_002:grpCtrl_bottom", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",540,0,90 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366797440, "Model::Slime_002:Ctrl_bottom", "NurbsCurve" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-25.914660853514,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.562692191212264,0.562692191212264,0.562692191212264 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366802080, "Model::Slime_002:grpCtrl_middle", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,30,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",180,0,90 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1.0000000000017,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366818320, "Model::Slime_002:Ctrl_middle", "NurbsCurve" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-21.6677753434909,-5.65196117631541,-3.59216243760798 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",1.35816151064064,1.35816151064064,1.35816151064064 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366790480, "Model::Slime_002:grpCtrl_top", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,64.8498333583073,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",180,0,90 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1.00000000000339,1 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366820640, "Model::Slime_002:Ctrl_top", "NurbsCurve" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",-1.11734268313033,-1.25043787930813e-14,22.0709433277651 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,0,-0.196827852998066 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.755762993499157,0.755762993499157,0.755762993499157 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366822960, "Model::Slime_002:grp_joint", "Null" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0,49.9673621551325,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366825280, "Model::Slime_002:bnd_bottom", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",180,0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0,-25.914660853514,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-2.54444374517081e-14,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.562692191212264,0.562692191212264,0.562692191212264 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366829920, "Model::Slime_002:bnd_middle", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",60.8625569092076,-10.0444990433374,-6.38388535278768 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",1.35816151064064,1.35816151064064,1.35816151064064 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1579366827600, "Model::Slime_002:bnd_top", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",40.7906317360855,4.16147942055801,18.8954741864743 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,0,-0.196827852998066 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",0.755762993499157,0.755762993499157,0.755762993499157 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 1578048099856, "Pose::Slime_002:skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 6 + PoseNode: { + Node: 1579366813680 + Matrix: *16 { + a: 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 1579366825280 + Matrix: *16 { + a: 0,1,0,0,1,0,1.22464679914735e-16,0,1.22464679914735e-16,0,-1,0,0,0,0,1 + } + } + PoseNode: { + Node: 1579366822960 + Matrix: *16 { + a: 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 1579366781200 + Matrix: *16 { + a: 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 1579366829920 + Matrix: *16 { + a: 0,1,0,0,1,0,1.22464679914735e-16,0,1.22464679914735e-16,0,-1,0,0,30,0,1 + } + } + PoseNode: { + Node: 1579366827600 + Matrix: *16 { + a: 0,1,0,0,1,0,1.22464679914735e-16,0,1.22464679914735e-16,0,-1,0,0,64.8498333583073,0,1 + } + } + } + Material: 1576774370288, "Material::Slime_002:Skin", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 1578048109360, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "Linear" + } + Deformer: 1576631375872, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *453 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,72,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,144,145,147,149,157,158,160,161,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,435,436,437,439,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489 + } + Weights: *453 { + a: 0.0552316139570903,0.00715077511267236,0.00645501662605084,0.0568567193741985,0.0513374069757983,0.00225094905603475,0.00770592407656105,0.0522292083997345,0.0127563557513857,0.0664578746682231,0.0595730116674803,0.00833308212880514,0.0131756613843802,0.0675840064103436,0.00968932808380606,0.0594267168024056,0.0598453431106708,0.00983066106459434,0.0601763526323108,0.0107560120918005,0.159173397833753,0.160560928953922,0.155703184637475,0.336571425199509,0.332714345524915,0.336394114766605,0.154291841390941,0.147290984280305,0.154228706554697,0.147797962226926,0.158673289675156,0.156154631974844,0.159392094538961,0.330033123493195,0.329485207796097,0.33000174164772,0.328851103782654,0.339023590087891,0.335689812898636,0.338186860084534,0.872836470603943,0.877072334289551,0.876341581344604,0.876467704772949,0.87954980134964,0.883841276168823,0.884045302867889,0.88453209400177,0.884782373905182,0.887100577354431,0.581129133701324,0.586578011512756,0.583812355995178,0.579659104347229,0.586049377918243,0.607922196388245,0.617785155773163,0.599931836128235,0.580306112766266,0.573127508163452,0.252186312558154,0.253811403725282,0.252137850892575,0.257425163784052,0.260415199935423,0.255751330582823,0.24483570393563,0.246932005300189,0.251488232904929,0.249581172199623,0.00103078201608602,0.955951511859894,0.96257621049881,0.95705258846283,0.974467581323862,0.974467581323862,0.978609381224161,0.978609380871166,0.971681611406248,0.971681611406248,0.969700421396087,0.995885703810671,0.994477922471301,0.994477922471301,0.998434011363394,0.998434011896696,0.997541571304561,0.997541570216056,0.991512648182101,0.991512648932916,0.993328926996947,0.999974676290856,0.999782009370024,0.741269648075104,0.738089501857758,0.742194473743439,0.752811431884766,0.761112451553345,0.757748067378998,0.745041012763977,0.740098536014557,0.745348572731018,0.746645450592041,0.43445885181427,0.433489154170265,0.428353399038315,0.430923759937286,0.439686834812164,0.449587672948837,0.44439360499382,0.425220340490341,0.420426964759827, +0.435477197170258,0.294339319141015,0.327331930398941,0.291706950797213,0.334682017564774,0.298912274930483,0.34089270234108,0.302456324170796,0.339083254337311,0.298871981209749,0.331495374441147,0.288438042140967,0.328991442918777,0.289573043557837,0.330160319805145,0.29320717852983,0.3354727031436,0.292106931284592,0.336090042370314,0.00341664009716632,0.00300696960903437,0.00312863883124869,0.00152363637596331,0.00147566089757865,0.00131450834818197,0.00406459442876718,0.00218066838466782,0.00342934314057962,0.957059919834137,0.92224109172821,0.876904428005219,0.924168586730957,0.955824971199036,0.920585691928864,0.875113189220428,0.964899659156799,0.876660346984863,0.93400251865387,0.96292519569397,0.929393589496613,0.872399747371674,0.978089080475735,0.882409930229187,0.946980535984039,0.978089080475735,0.941325724124908,0.8840172290802,0.975508944029085,0.883516728878021,0.935588181018829,0.975508944029085,0.935552775859833,0.884528160095215,0.970343949904398,0.887249171733856,0.940351414094948,0.970343949904398,0.886302351951599,0.995531916979018,0.987076821771716,0.988014905896189,0.995531916979018,0.988014905896189,0.996920801387316,0.993016310907983,0.996920801919345,0.993016310907983,0.998635960885372,0.991021261268002,0.998635960885372,0.991021261268002,0.994864998019602,0.983985381466225,0.994864998019602,0.983985381466225,0.981171190738678,0.992801166276743,0.992801166276743,0.999818007940038,0.999266693645375,0.999818007940038,0.99946319833058,0.998122232270794,0.99946319833058,0.99999950588352,0.811262249946594,0.813174784183502,0.817431390285492,0.822291374206543,0.82740980386734,0.824829339981079,0.818085312843323,0.813995540142059,0.817391395568848,0.818838477134705,0.377506527162346,0.376283235615848,0.372324347496033,0.373697340488434,0.377831131219864,0.381077587604523,0.384554535150528,0.370467752218246,0.370378881692886,0.379739046096802,0.0215293316712755,0.0064118364238915,0.0230391648540648,0.0560550605419632,0.00559886514965063,0.0228998911360912,0.0491628645159018,0.0152272502349806,0.0105359464439528, +0.0322906728708944,0.0629838709057164,0.00562962694975126,0.0553284086036457,0.0263956784727544,0.0139304815761016,0.0339715059485252,0.0680927775803359,0.0114291471656992,0.0646444765579873,0.00831462838064977,0.025623837079919,0.0561482072263553,0.0073804444705124,0.0576022495478113,0.027848395642979,0.0113846158697208,0.0277608359166863,0.0611902740805435,0.0110227303523314,0.0605219598632069,0.160076133385453,0.110581492218405,0.111397026450503,0.159252255711634,0.105701324289422,0.249503887912661,0.206519874137358,0.205976147243408,0.249517906122639,0.204929917687985,0.156986436041313,0.104547332585848,0.15283878916219,0.097945861450243,0.153777308280928,0.102416140765852,0.0959352366010613,0.144298449158669,0.157072035747105,0.105360276768851,0.152052544077834,0.104299176845512,0.159324619289436,0.106733230842882,0.159366292465781,0.25353778728814,0.205853313207626,0.249337183122828,0.198327215924909,0.252872489206844,0.209465698221262,0.244616660387402,0.197058066083257,0.256052674848648,0.213492214899952,0.250894135592658,0.207845873440481,0.259640808260327,0.211658575543467,0.260209786904356,0.744275510311127,0.662022888660431,0.584921061992645,0.668636381626129,0.749433100223541,0.586173295974731,0.666178345680237,0.739252865314484,0.656855165958405,0.575374007225037,0.741534531116486,0.581078052520752,0.661686360836029,0.739277839660645,0.662778615951538,0.574499011039734,0.741342306137085,0.581140279769897,0.667845129966736,0.747171521186829,0.679143488407135,0.588814675807953,0.751383900642395,0.596814453601837,0.684705376625061,0.758330881595612,0.690303921699524,0.613938271999359,0.760018944740295,0.617851495742798,0.503061234951019,0.437875211238861,0.506943047046661,0.429849207401276,0.502560198307037,0.428388655185699,0.49916872382164,0.428514063358307,0.503413319587708,0.432481944561005,0.518958032131195,0.445678055286407,0.529333353042603,0.448258906602859,0.518357515335083,0.435128957033157,0.497922420501709,0.419454485177994,0.491653978824615,0.42851996421814,0.33383896946907,0.292777261513153, +0.0228693496994707,0.0192751744821924,0.0289493261747744,0.0213291754541574,0.0341352274421968,0.0306711415297457,0.025152203516431,0.0248793648423823,0.0284773414861384,0.0284672784161307,0.112104933201289,0.108918347544692,0.206469915288989,0.206333507940377,0.107478507181604,0.101893135225768,0.10213792621404,0.0933329835534096,0.104241638128836,0.101982633196264,0.106226285729615,0.105891220127462,0.206568103933756,0.201346961704208,0.207525884820005,0.195550020857521,0.211231871442147,0.202859633661121,0.211731155604319,0.210599580361292,0.665387630462646,0.670393228530884,0.659370899200439,0.663205802440643,0.658370137214661,0.66298246383667,0.670408606529236,0.676137328147888,0.687387764453888,0.69134521484375,0.507282674312592,0.503779590129852,0.500217139720917,0.499912977218628,0.508910119533539,0.526462137699127,0.526792585849762,0.5077885389328,0.491597056388855,0.492862075567245,0.294440621943541,0.292514856273602,0.294847630835208,0.30131967509096,0.300824800399083,0.29282430306478,0.28797732087134,0.295831412846548,0.29282372465071,0.292761986295061,0.00306135750664052,0.00379995471457978,0.00198026800249803,0.00228523509474259,0.00107112522174738,0.00330375369530101,0.00404921041753083,0.00241136500666679,0.92281848192215,0.921257257461548,0.92637038230896,0.922408223152161,0.945003224931621,0.938012897968292,0.938530743122101,0.942827984116832,0.93927265887787,0.935322046279907,0.987218014822316,0.987218018720497,0.990703287188538,0.990703287188538,0.993154252346593,0.993154252384883,0.987229209328467,0.987229210756325,0.981144189834595,0.98138964176178,0.998901375145971,0.998901375145971,0.997568581848575,0.997568582455867,0.999905952218354,0.999905952218354,0.813259482383728,0.813879072666168,0.819585502147675,0.825871467590332,0.826040208339691,0.820582926273346,0.815372347831726,0.815338313579559,0.819176018238068,0.816786170005798,0.378869077716766,0.372750759124756,0.373061150312424,0.372818410396576,0.381065368652344,0.384586691856384,0.378315031528473,0.365320026874542,0.376402407884598,0.381474196910858 + } + Transform: *16 { + a: 6.12323399573677e-17,1,1.22464679914735e-16,0,1,-6.12323399573677e-17,-7.49879891330929e-33,0,0,1.22464679914735e-16,-1,0,0,0,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,-0,0,1,-6.12323399573677e-17,1.22464679914735e-16,0,1.22464679914735e-16,-7.49879891330929e-33,-1,0,0,0,-0,1 + } + } + Deformer: 1577962052096, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *480 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,223,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489 + } + Weights: *480 { + a: 0.42865401506424,0.341106742620468,0.35315865278244,0.42943349480629,0.438021063804626,0.353336691856384,0.333613395690918,0.440465480089188,0.361633867025375,0.430168569087982,0.43443900346756,0.364123374223709,0.365104407072067,0.431629002094269,0.320032000541687,0.434685975313187,0.428489476442337,0.322982013225555,0.430521875619888,0.315255463123322,0.507102429866791,0.507603764533997,0.516637742519379,0.590263177867259,0.586546052028529,0.589267015457153,0.50956779718399,0.528551042079926,0.512305855751038,0.531568000516833,0.515933331590255,0.524697542784067,0.523168498350825,0.594760356823573,0.595944576772147,0.595453194410182,0.596311757789143,0.58554932172663,0.587516601212542,0.587398533167528,0.118654131604406,0.115283309340484,0.115383571956478,0.115083584738626,0.112212281147285,0.108500371055531,0.108309795850985,0.107823280954397,0.107589570496262,0.105924525701026,0.385307977316819,0.381270407655598,0.380186278095757,0.381231001206707,0.375736607400958,0.355122664588756,0.349491045386912,0.361493472340417,0.382981964698845,0.390256635309421,0.57410205972006,0.572145417716368,0.573868814933269,0.574498708448385,0.573761981189265,0.578968372018609,0.590362817678444,0.593813950405453,0.578697264194489,0.572750315932853,0.269367188215256,0.278509914875031,0.275855898857117,0.288866251707077,0.287714928388596,0.272978931665421,0.307205647230148,0.305293291807175,0.319513320922852,0.323453962802887,0.322722762823105,0.292504101991653,0.0416639099875278,0.0353309069779352,0.0405456267124287,0.0241381963954367,0.0241381963954367,0.0202476522691407,0.020247652600953,0.0267604087562097,0.0267604087562097,0.0286760019905444,0.00391903470375975,0.00525458051998458,0.00525458051998458,0.00149393712246159,0.00149393661443166,0.00234360342112367,0.00234360445686469,0.00806567593096856,0.00806567522017982,0.00634571115798158,0.237827356291544,0.238590521993516,0.235045575160679,0.22724077019948,0.221290275664909,0.222702514808234,0.232450338174418,0.2367603677598,0.234077970646561,0.234511893045978, +0.517978501213411,0.518447816371918,0.521512114802697,0.520105721881413,0.506933848350677,0.497565455722983,0.503113909310022,0.527557326845477,0.532822771174908,0.517532093213561,0.589498254089252,0.598239428626353,0.594119085536825,0.590139865833351,0.590145666804308,0.58483594095005,0.586433368552955,0.585760039952529,0.590468076759344,0.592812035193436,0.598925071321958,0.596826904291169,0.601522572365567,0.595758740654605,0.592920422554016,0.587561368942261,0.586235317214801,0.587103688043599,0.276052296161652,0.272076487541199,0.288983404636383,0.287527590990067,0.27146914601326,0.309907734394073,0.281037628650665,0.305176615715027,0.280896991491318,0.274090170860291,0.266660809516907,0.276724696159363,0.297280967235565,0.326212555170059,0.296490281820297,0.325046330690384,0.339279413223267,0.32075309753418,0.338842153549194,0.337788313627243,0.320342749357224,0.316233545541763,0.315616458654404,0.304676741361618,0.29614719748497,0.295995682477951,0.281865209341049,0.0405833813297211,0.0732756193120607,0.115231611143156,0.0712236027808446,0.04175055174923,0.0745887870124042,0.116908416634764,0.0331475049789509,0.114900447007789,0.062008098565155,0.035012117569389,0.0663384294752719,0.118869525792344,0.0207362056742349,0.109718044702853,0.049912963402274,0.0207362056742349,0.0552364502124496,0.108218345962309,0.0231603869366557,0.108758439210258,0.0605517036822212,0.0231603869366557,0.0605849870567679,0.107814083171052,0.0280487797968086,0.105597830675306,0.0562306029317188,0.0280487797968086,0.106484582873264,0.0042546623831405,0.0122730537314639,0.0113728016435801,0.0042546623831405,0.0113728016435801,0.00293403528709283,0.00663999058853797,0.00293403478121234,0.00663999058853797,0.00130152807426823,0.0085292817753629,0.00130152807426823,0.0085292817753629,0.00488705945280246,0.0151783943190929,0.00488705945280246,0.0151783943190929,0.0178619901075474,0.00684544073285012,0.00684544073285012,0.00179086577416402,0.173900405398243,0.173065012904009,0.168573223403339,0.164695570578957,0.160986896957479,0.162343452219588, +0.167969429390764,0.171381988849737,0.169158966813675,0.168890780591831,0.563294635110346,0.564935266971588,0.56818197935386,0.566486195587588,0.558634505047535,0.557235260181723,0.553358844250559,0.571409294504448,0.570434194456048,0.562344656777563,0.38033664226532,0.34730452299118,0.388845980167389,0.428856402635574,0.344032019376755,0.377553433179855,0.440194934606552,0.390864342451096,0.358176559209824,0.393646836280823,0.429987549781799,0.360448658466339,0.436453819274902,0.396597117185593,0.364328742027283,0.396265774965286,0.430469006299973,0.365222811698914,0.432814180850983,0.326412796974182,0.374713957309723,0.437014520168304,0.332421272993088,0.428590834140778,0.372717946767807,0.31687805056572,0.370854169130325,0.432419270277023,0.319675594568253,0.428712040185928,0.50664758682251,0.468821674585342,0.469467729330063,0.510857999324799,0.475942134857178,0.573479406812757,0.544283343154474,0.54442099850473,0.575910117811726,0.552871584892273,0.508470177650452,0.471489995718002,0.522961020469666,0.487179160118103,0.510790824890137,0.475705713033676,0.497224170776182,0.531689045353459,0.513277800602382,0.483432822157693,0.526902951279679,0.493208717193642,0.519819584373437,0.488439293609328,0.524451720010186,0.573136703878928,0.544534702539809,0.585512578487396,0.569104251846621,0.571436949260181,0.539056345006887,0.592914652912731,0.566547334836657,0.571761501830009,0.542392715591496,0.585346915962021,0.554634474908137,0.576693375551814,0.551479808083471,0.575675588833788,0.236198063026906,0.307862549477512,0.382712966105398,0.303894600150869,0.231434292655592,0.381242713567379,0.304063057498807,0.238465281683021,0.309787588403229,0.389434233708626,0.236379223531337,0.381396695200023,0.306486597309876,0.237388276847426,0.304481237125705,0.388977388839069,0.235508574183051,0.380707519216797,0.299660168300436,0.231336256003771,0.292328919698203,0.372356777032702,0.227481958826917,0.364994135034329,0.287385854422131,0.223353429876248,0.284993925407111,0.351952955780836,0.221793302145811,0.348738175014992,0.459454715746961, +0.515060713274421,0.454709976266377,0.524678315168253,0.45646182518246,0.521323090512851,0.458980187154313,0.524314038453453,0.455354661240213,0.515583852757831,0.435633316851537,0.500696958877055,0.427663884515084,0.498723875905074,0.436704969992345,0.514826470029107,0.46243001197184,0.534257375179045,0.468682723404134,0.523999781232312,0.591867828033348,0.591192976755223,0.385244369506836,0.385939568281174,0.391603350639343,0.39437660574913,0.395575225353241,0.396771967411041,0.375594705343246,0.376160681247711,0.372503787279129,0.370269358158112,0.468423783779144,0.471748471260071,0.543610968213971,0.547125304892455,0.469678193330765,0.481395155191422,0.472837626934052,0.499998597810584,0.47669905424118,0.493272622502893,0.483885416950973,0.489971496308924,0.544741723036345,0.559827029705048,0.540748173283557,0.570146758035949,0.540186838312797,0.560091412567288,0.550232658892675,0.552680230186537,0.306252636443746,0.301671288131313,0.308757552110216,0.305281531646306,0.308175124204215,0.303908147105797,0.298615327586808,0.293355144599593,0.286822395690706,0.283330913842134,0.454175843076562,0.460483305863854,0.45762251718335,0.4594244097552,0.446261281142619,0.429581727142165,0.429315048130722,0.449442312404271,0.46896541964583,0.468392448816543,0.590210979371004,0.592077103143264,0.592793054007855,0.590191243645498,0.588096043202143,0.596485274579091,0.601290399410737,0.595763444900513,0.587835788726807,0.587310376425906,0.279094666242599,0.277791500091553,0.300035893917084,0.296200573444366,0.270288228988647,0.2722427546978,0.316276758909225,0.317517995834351,0.339557558298111,0.338923305273056,0.333957433700562,0.333068698644638,0.307490140199661,0.307185500860214,0.285761415958405,0.284213691949844,0.0726400379568335,0.074109397550964,0.0691253966193313,0.072845174499096,0.0517431211853428,0.0583198948707788,0.0578176042149387,0.0537756458170501,0.0571840620944116,0.0609041669423831,0.0121338255118958,0.0121338218295216,0.00882967511608061,0.00882967511608061,0.00650923431151819,0.00650923427523212,0.0121145216487886, +0.012114520301012,0.0178790754941087,0.0176463380249775,0.00104855611867995,0.00104855611867995,0.0023178653254854,0.0023178647476218,0.172387146975164,0.17161655081812,0.166822418180797,0.162072189052757,0.161915131606441,0.165900138061532,0.170239646366769,0.170468100249436,0.168220175230703,0.170443446084988,0.563870370388031,0.567198547455359,0.567957633431056,0.565228671415926,0.556611966149557,0.553991304870011,0.560749161344875,0.576537363944647,0.565141257379582,0.560739772534667 + } + Transform: *16 { + a: 6.12323399573677e-17,1,1.22464679914735e-16,0,1,-6.12323399573677e-17,-7.49879891330929e-33,0,0,1.22464679914735e-16,-1,0,-30,1.83697019872103e-15,2.24963967399279e-31,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,-0,0,1,-6.12323399573677e-17,1.22464679914735e-16,0,1.22464679914735e-16,-7.49879891330929e-33,-1,0,0,30,-0,1 + } + } + Deformer: 1576884383712, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *435 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489 + } + Weights: *435 { + a: 0.51611437097867,0.651742482266859,0.640386330591509,0.513709785819512,0.510641529219575,0.644412359087581,0.658680680232521,0.507305311511078,0.625609777223239,0.503373556243795,0.50598798486496,0.627543543647486,0.621719931543553,0.500786991495388,0.670278671374507,0.505887307884408,0.511665180446992,0.66718732570985,0.509301771747801,0.673988524784878,0.333724172299457,0.331835306512081,0.327659072843146,0.0731653969332327,0.0807396024465561,0.0743388697762418,0.336140361425069,0.324157973639769,0.333465437694266,0.320634037256241,0.325393378734589,0.319147825241089,0.317439407110214,0.0752065196832325,0.0745702154317563,0.0745450639420975,0.0748371384282032,0.0754270881854796,0.0767935858888219,0.0744146067479386,0.00850939779165091,0.00764435636996485,0.00827484669891723,0.00844871048842483,0.00823791750307468,0.00765835277564596,0.00764490128112566,0.00764462504383272,0.007628055598556,0.00697489694454324,0.0335628889818563,0.0321515808316456,0.0360013659090646,0.0391098944460635,0.0382140146807986,0.0369551390229998,0.0327237988399248,0.0385746915313483,0.0367119225348891,0.0366158565271273,0.173711627721786,0.17404317855835,0.173993334174156,0.168076127767563,0.165822818875313,0.165280297398567,0.164801478385925,0.159254044294357,0.169814502900582,0.177668511867523,0.72979847399936,0.720745924242283,0.723113319126797,0.710978311423918,0.712144116849524,0.727015689524503,0.692725515350306,0.694464817299219,0.679547524916613,0.67600676584179,0.676355994384493,0.707473985911695,0.00238457815257836,0.00209288252325502,0.00240178482474171,0.00139422228070151,0.00139422228070151,0.00114296650669824,0.00114296652788084,0.00155797983754255,0.00155797983754255,0.00162357661336859,0.0209029956333523,0.0233199761487264,0.022759951095882,0.0199477979157541,0.0175972727817458,0.0195494178127682,0.0225086490616052,0.0231410962256428,0.0205734566224205,0.0188426563619814,0.0475626469723194,0.0480630294578168,0.0501344861589885,0.0489705181813008,0.0533793168371587,0.0528468713281794,0.0524924856961579,0.0472223326641815, +0.0467502640652657,0.0469907096161812,0.116162426769733,0.0744286409747062,0.114173963665962,0.0751781166018751,0.110942058265209,0.0742713567088699,0.111110307276249,0.0751567057101601,0.110659942030907,0.0756925903654169,0.112636886537075,0.0741816527900532,0.108904384076595,0.0740809395402495,0.113872398916154,0.0769659279141397,0.121657751500607,0.0768062695860863,0.720531063741182,0.727180588078363,0.708009625754583,0.709343770178685,0.727882251999968,0.688568629229963,0.718704245737389,0.693347723387394,0.718675539718988,0.725895889730786,0.733271502637665,0.723261155521187,0.702674286386519,0.673367647226019,0.703351252161497,0.673639160961434,0.656655992347966,0.678470944967188,0.658977178066138,0.658782343232177,0.678722368275194,0.683524841596637,0.683817151652465,0.695145830311003,0.703843940962714,0.703949041400669,0.718134789983403,0.00235669883614191,0.00448328895972882,0.00786396085162573,0.00460781048819835,0.00242447705173435,0.00482552105873229,0.00797839414480788,0.00195283586424981,0.00843920600734766,0.00398938278097538,0.00206268673664131,0.00426798102811553,0.00873072683598271,0.00117471385002971,0.00787202506796043,0.00310650061368665,0.00117471385002971,0.00343782566264196,0.0077644249574909,0.00133066903425977,0.00772483191172069,0.00386011529894941,0.00133066903425977,0.00386223708339931,0.00765775673373307,0.00160727029879366,0.00715299759083782,0.00341798297333354,0.00160727029879366,0.00721306517513691,0.0148373446551625,0.0137602029124884,0.0139953863111689,0.0130130552144998,0.0116032991751805,0.012827207799333,0.0139452577659128,0.0146224710082041,0.0134496376174778,0.0122707422734645,0.0591988377273083,0.0587814974125634,0.0594936731501073,0.0598164639239786,0.0635343637326006,0.0616871522137542,0.0620866205989125,0.0581229532773058,0.0591869238510659,0.0579162971256356,0.598134026063405,0.646283640584928,0.588114854978546,0.515088536822462,0.650369115473595,0.599546675684054,0.510642200877546,0.593908407313924,0.631287494346224,0.574062490848283,0.507028579312484,0.63392171458391, +0.508217772121452,0.577007204341653,0.621740776396616,0.569762719086189,0.501438216119692,0.623348041135387,0.50254134259103,0.665272574645168,0.599662205610358,0.50683727260534,0.6601982825364,0.513806916311411,0.599433657589214,0.67173733356456,0.601384994952988,0.506390455642433,0.669301675079416,0.510765999950865,0.333276279792037,0.420596833196252,0.419135244219434,0.329889744963567,0.418356540853401,0.177016705274582,0.249196782708168,0.249602854251862,0.174571976065636,0.242198497419742,0.334543386308236,0.42396267169615,0.324200190368144,0.414874978431654,0.335431866828935,0.421878146200471,0.406840592622757,0.324012505487872,0.329650163650513,0.411206901073456,0.321044504642487,0.402492105960846,0.320855796337128,0.404827475547791,0.316181987524033,0.173325508832932,0.249611984252565,0.165150238389775,0.23256853222847,0.175690561532974,0.251477956771851,0.162468686699867,0.236394599080086,0.172185823321342,0.244115069508553,0.16375894844532,0.237519651651382,0.163665816187859,0.236861616373062,0.164114624261856,0.0195264266619669,0.0301145618620571,0.0323659719019563,0.0274690182230019,0.0191326071208671,0.0325839904578891,0.0297585968209559,0.0222818530024952,0.0333572456383669,0.0351917590663372,0.0220862453521771,0.0375252522792253,0.0318270418540948,0.0233338834919298,0.0327401469227566,0.0365236001211974,0.0231491196798643,0.0381522010133054,0.0324947017328279,0.0214922228094002,0.0285275918946624,0.0388285471593454,0.021134140530688,0.0381914113638339,0.0279087689528082,0.0183156885281409,0.0247021528933651,0.0341087722198051,0.0181877531138935,0.0334103292422103,0.0374840493020198,0.0470640754867181,0.0383469766869616,0.0454724774304714,0.0409779765105028,0.0502882543014498,0.0418510890240467,0.0471718981882396,0.0412320191720798,0.0519342026811647,0.0454086510172683,0.0536249858365375,0.0430027624423136,0.0530172174920666,0.0449375146725724,0.0500445729377356,0.0396475675264506,0.0462881396429608,0.0396632977712506,0.047480254549548,0.0742932024975814,0.116029761731625,0.591886280793693,0.594785257236634, +0.579447323185882,0.584294218796712,0.570289547204562,0.572556891059213,0.599253091140323,0.598959953909907,0.599018871234733,0.601263363425758,0.419471283019567,0.419333181195237,0.24991911649704,0.246541187167168,0.422843299487631,0.416711709582811,0.425024446851908,0.406668418636006,0.419059307629984,0.404744744300842,0.409888297319412,0.404137283563614,0.2486901730299,0.238826008590745,0.251725941896439,0.234303221106529,0.248581290245056,0.237048953771591,0.238036185503006,0.236720189452171,0.028359733093608,0.0279354833378029,0.0318715486893445,0.0315126659130507,0.0334547385811239,0.0331093890575331,0.0309760658839562,0.0305075272525188,0.0257898398554059,0.0253238713141155,0.0385414826108466,0.0357371040062933,0.0421603430957337,0.0406626130261719,0.0448285993238422,0.0439561351587082,0.0438923660195156,0.0427691486629288,0.0394375239653145,0.0387454756162116,0.115348398685455,0.115408040583134,0.112359315156937,0.108489081263542,0.111079156398773,0.110690422356129,0.110732279717922,0.10840514225294,0.119340486622483,0.119927637279034,0.71784397625076,0.718408545193868,0.697983838080418,0.701514191460891,0.729624745676856,0.72767155515485,0.683385734216067,0.681410878943902,0.657138688006588,0.657027484309413,0.665110170157894,0.664519936348695,0.692340014077015,0.692574609692497,0.71423634095504,0.715763239888334,0.00454148012101687,0.0046333449874881,0.00450422107170878,0.00474660234874332,0.00325365388303612,0.00366720716092893,0.00365165266296047,0.00339637006611756,0.0035432790277186,0.00377378677770966,0.014353370641108,0.014504376515712,0.0135920796715282,0.012056343356911,0.012044660053868,0.0135169356651217,0.0143880058015045,0.014193586171005,0.0126038065312295,0.0127703839092134,0.0572605518952032,0.0600506934198849,0.05898121625652,0.0619529181874979,0.0623226651980995,0.061422003273605,0.0609358071266526,0.0581426091808103,0.0584563347358204,0.0577860305544748 + } + Transform: *16 { + a: 6.12323399573677e-17,1,1.22464679914735e-16,0,1,-6.12323399573677e-17,-7.49879891330929e-33,0,0,1.22464679914735e-16,-1,0,-64.8498333583073,3.97090704237451e-15,4.86295859915563e-31,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,-0,0,1,-6.12323399573677e-17,1.22464679914735e-16,0,1.22464679914735e-16,-7.49879891330929e-33,-1,0,0,64.8498333583073,-0,1 + } + } + Video: 1577064527936, "Video::Slime_002:file1", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/dealers-dungeon/Assets/Temp/Slime/Skin_Base_Color.png" + P: "RelPath", "KString", "XRefUrl", "", "Skin_Base_Color.png" + } + UseMipMap: 0 + Filename: "D:/dealers-dungeon/Assets/Temp/Slime/Skin_Base_Color.png" + RelativeFilename: "Skin_Base_Color.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAACAAAAAgACAIAAAA9xURnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgAElEQVR4nOyda2IrvW5loRMPIePtIXVPJrPIGBL1j7LkevAFEmSBrLV+3PsdiwSokixLG8DW6//8v/8rf7z3//W/u38a8wqlBAAAAAAAgGl5XX90+Lz3CiwoCVK6+LVP15Ar/OPXgz+7qh4UEXl9dvx7a7eqiSaIP16vsqei4gzRXJHnksjL+sp0v9DggP0v1JhH/PtEHfYE2zKqX3P6v9T85RqbToa8kMLy/Bz/+dr/kfwnL+laBrimBAAAAAAAgAU4f8wr0i/KRY7Lylfy1nJQ/w9UXEnP6v92NtR/mA6k//SuMSD9w7z8/P5dPLySvL8/6PUm55iUGgAAAAAAAMC62Pf+n7fS+9+BavX/Tulfxqn/ySfGIPUfdfAJ/Burxc8i/ctAOf41Np2I/BMR1H+w4yf0QwR5AAAAAAAAUPAnVNza+19LNAjqf/F6v43/4sD2RzpcGdTB5Rnc+P+aZ86Axn8AFZ8CQHwO4D/k9T+d6gG7pH0HDgAAAAAAAKAPSaFilt7/yOJHfkbF9id/Bmx/oDN4/qR3jQHpH5YhOAGw8TcH8E9evb8JAAAAAAAAAKbjoFXQ+z8/ntV/bH9SaWAVkP7Tu8aA9A+LcSwAMAcAAAAAAAAAZdD7vxjr2f6kNlacAdsf6AnSf3bjALD7hyVJTACcYQ4AAAAAAAAANtp7/ytzmcWn9/8Pz43/gu1POhPMz+mXCLv/4MYBDG78R/qHYYQKAIc5gL+mfOYAAAAAAAAAQOj9XwvP6j+2P6k0sATLN/4j/V9B+ofBKCYANpgDAAAAAAAAeDL0/q9Ete2P3Kj++7b9Qf2HQpD+sxsHgN0/PIF4AYA5AAAAAAAAADhC7/8yeG78F2x/0plgcpaX/r8ZsfvfQ+M/3IV6AmCDOQAAAAAAAICnQe//MnhW/7H9SaWBycHuv2Rjb5D+4WnkCgDMAQAAAAAAAAC9/wuB7U/mDNj+QB8GN/4j/QcSjU0nSP/gg8oJgA3mAAAAAAAAAJ4Avf9r4LnxX6a1/RHUf8iB9J/dOADs/uGxlBUAmAMAAAAAAAB4KvT+r4Fn9R/bn1QamBns/rMbB0DjPzycpgmAjX/yEhFGAQAAAAAAANYj3vtvL22M7P1/lPQv2P5kz4DtD1iD3X/Jxt4g/QOIrgAQnwOQfnZAzAEAAAAAAADcQVbAmLr3/zl4bvyXWtuf1MaKM2D7A6Yg/Zds7A3SP8AXgwmAL3wlAAAAAAAAwBqcNQx6/+fEs/qP7U8qDcwJ0n/JxgEMtvtH+gfn6AsAzAEAAAAAAAAsDb3/a4DtT+YM2P6AKcvb/bekW7Xx/9/2f6j/4BvLCYAN5gAAAAAAAADmhd7/BWhp/Bd/6j+2P+Cc5Rv/W9KtKv0Ljf8wD7UFAOYAAAAAAAAAloPe/wVY0vYns1d1Bmx/wI7lpf99RqT/L0j/MBf2EwAbzAEAAAAAAADMBb3/C4DtT+YM2P6AEUj/JRt7g/QPUEJbAYA5AAAAAAAAgCWg9392sP3JnwHbHzBisN3/RNK/jJLjvzmw+wfI0msCYIM5AAAAAAAAAP/Q+z87ntX/eW1/xFRbRDVcg8GN/6+p5gxo/AfwiUUBgDkAAAAAAACAaaH3f3aw/cmcAdsfsADPn5KNvUH6B6ig7wTABnMAAAAAAAAAPqH3f2o8N/4Ltj/pTDAPSP8lG3uD9A9QjV0BgDkAAAAAAACAqaD3f2o8q//Y/qTSwDwg/Rfu7Qp2/wCNjJgA2GAOAAAAAAAAwA/0/k8Ntj+ZM1TZ/gjqP3y4/ppg9x/b25XBjf9I/7Ak1gWA3ByAiNiXAZgDAAAAAAAAKMaq157e/1vw3Pgv2P6kM8EkLN/4j/R/BekfFmbcBMAXRgEAAAAAAAAcQe//PHhW/7H9SaWBSUD6L9zbFez+AWz5+Y/363/M3yIl5wDenWoAzAEAAAAAAAAkofd/apa0/Unt1Z4B2x9oYHnpf58Ru/8vNP7DE/gRkS41gBzMAQAAAAAAANwMvf+T4LnxX7D9SWcC92D3X763H0j/AP34tQDq3ZLPHAAAAAAAAMCN0Ps/L57Vf2x/UmlgBgY3/iP9B7KMTSdI//A8fgsAr7f8hzAHAAAAAAAA8Azo/Z+EFtsfuUv9x/YHZgDpv3BvV7D7BxjA4UuA/8lLRIwVeeYAAAAAAAAA7oPe/0nx3PgvDbY/qb3aM2D7A1Vg91+4tys0/gMM41AA2P52/nuN7spnDgAAAAAAAGAQ9P7PgGf1H9ufVBrwDXb/5Xv7gfQPMJif4E/tFXnmAAAAAAAAAMZC7/+kYPuTOQO2P6AH6b98bz+Q/gFuIVAAYA4AAAAAAABgQej9d09j4784U//92P4I6v+DQfov39uVwXb/SP8AX8ITABvMAQAAAAAAAMwIvf8zgu1P5gzY/oCe5e3+G9Mt2fj/7/tfqP8AIpIoADAHAAAAAAAAsAj0/rsH25/MGbD9ASXLN/43pltS+hca/wFCpCYANm6ZAxCRfkmZAwAAAAAAgFWh9386sP3JnwHbH9CwvPR/yoj0v4H0DxAjUwC4aw5AGAUAAAAAAABoh95/32D7kzlDre2P2MmOqIkTgfRfvrcfSP8A3shPAGyMnwPonZQ5AAAAAAAAWAl6/6cD25/MGbD9AQ2D7f7nkv5liBy/T4DdP4AfigoAzAEAAAAAAABMBr3/jsH2J38GbH+gmMGN/9fnmPNiA43/AA+ndAJggzkAAAAAAAAAb9D7Pxer2v5ktpefAdsfKAbPn/K9/UD6B3COogDAHAAAAAAAAMAE0PvvGGx/MmfA9gfKQPov39sPpH+AKdBNAGwwBwAAAAAAAOABev8nAtuf/Bmw/YECkP5V2zuB3T/ARKgLAN85ABEZ3JXPHAAAAAAAAEAKev+94ln9x/YnlQY8EfwtwO4/sb0Tgxv/kf4BGqmZAPhirMgzBwAAAAAAAFAGvf8TsartT2q76gzY/kAByzf+I/1fQfoHMKGyALD9eX6/bujKZw4AAAAAAADgDL3/LvHc+C/Y/qQzgRuQ/lXbO4HdP8C8NE0AbDAHAAAAAAAAMAx6/2fBs/qP7U8qDbhheen/lBG7/w0a/wFsaSoAMAcAAAAAAABwM/T+u6TR9kduUf9nsP0R1P9ngN2/dnsPkP4B1sBgAmDjljkAsf0iYuYAAAAAAADAMfT+T4Hnxn/B9iedCXwwuPEf6T+QYmw6QfoH6IlBAeDGOQBhFAAAAAAAAB4Lvf/+8Kz+Y/uTSgM+QPpXbe8Edv8Ai2E2AbAxfg6ga1LmAAAAAAAAwAP0/k8Btj+ZM2D7A3Gw+1dt7wSN/wBLYlYAYA4AAAAAAABgEPT+O8Nz479MbvsjqP+rg92/dnsPkP4BFsZ4AmCDOQAAAAAAAAAT6P33j2f1H9ufVBq4G6R/7fYeIP0DLI9xAYA5AAAAAAAAgI7Q++8MbH8yZ8D2B0Ig/Wu3d2Kw3T/SP8AtdJkA2GAOAAAAAAAAoBp6/53jufFf2mx/UttVZ8D2B0Isb/ffnm69xv9/+3+g/gOMpUsBYD8HICKDu/KZAwAAAAAAgAWh998TntV/bH9SaeBWlm/8b0+3nvQvNP4D3E3HCYAvloo8cwAAAAAAALA69P47B9ufzBmw/YELy0v/14xI/4L0D+CDjgWA7xyA3NGVzxwAAAAAAAAsAr3/bmhv/BdP6j+2PzAApH/t9h4g/QM8mRETABvMAQAAAAAAAKSh998zC9v+ZCIUngHbH7gw2O5/Oun/GsGcU3Ts/gEeSPcCwO1zADL8SwgAAAAAAABsGNr7bxWf3v9tvd/Gf8H2B/ozuPE/+CxyXmyg8R8AxjBuAmBj/BxAv6TMAQAAAAAAgBUOev+F3v8g2P7kz4DtD+zA80e7vQdI/wDwZVAB4N45gLuSAgAAAAAAVELvvw88q/+z2/6IkS6J1ugHpH/t9h4g/QPAntf4CYAN5gAAAAAAAAA26P13C7Y/mTNg+wMfkP4rIpiD3T8AfNn/Qg4tADAHAAAAAAAAkIHefwd4bvwXbH/SmWAssec5dv/pCOYMbvxH+gfwSfC38Z4JgA3mAAAAAAAA4MnQ++8Tz+o/tj+pNDCc5Rv/kf6vIP0D+CTx23hDAYA5AAAAAAAAgAD0/jsA25/MGRpsfwT1fyGQ/isimIPdPwCU/CreOQGwwRwAAAAAAAA8DXr/HeK58V+w/UlngoEsL/1fM2L3LzT+AzhD9Ut4WwHgNAcgIoO78pkDAAAAAAAAL9D7fzee1X9sf1JpYCDY/ddFsAXpH+DhVPwS3j8B8MVMkWcOAAAAAAAAvELvv0MWtv1JRSg/A7Y/MLzxH+k/EH9sOkH6B/BEy2/gzQWA/RyA3NGVzxwAAAAAAADcCb3/t+K58V+w/UlnglEg/VdEMAe7f4BnYvLr52gCYOOWOQCxMiBiDgAAAAAAACLQ++8Nz+o/tj+pNDAK7P4rIphD4z/AM7H63fv3frkoANw+B3BXUgAAAAAAeC70/t9Ku+2PjFf/sf2BUWD3XxfBFqR/gAdiqPt//9tFAeDK+DmATkmZAwAAAAAAAHr/XeG58V+abX9SEcrPgO3Pg0H6r4tgC9I/wNMw/K27vow7KgAwBwAAAAAAAI+A3v/78Kz+Y/uTSgP9Qfqvi2DOYLt/pH+Ae+nR8n/CUQHgCnMAAAAAAAAwNfT+uwLbn8wZsP15MMvb/ZukW6zx/9/p36j/AAMZoPt/cVcAYA4AAAAAAACWhd7/mzBp/Bc36r832x9B/Z+Z5Rv/TdItJv0Ljf8AN9HV6ieGuwLAFeYAAAAAAABgOuj99wO2P5kzYPvzVJaX/oMZkf6R/gFuYWTL/wmnBQDmAAAAAAAAYCno/b8JbH8yZ8D255Eg/ddFsAXpH+AJ3Kj7f3FaALjyT14iYqDIMwcAAAAAAAA9offfCdj+5M+A7c8jGWz3P6P0HwxiyDU0dv8Ai3GL1U8M1wWA0xyA3NGVzxwAAAAAAAA0Qe//HWD7kzlDm+2PWOiVCJDjGdz4H3uSOC820PgPAC14aPnf83JeAAhio8gr5wDEeviAOQAAAAAAgPWg998J2P5kzoDtz/PA86cugi1I/wAL4033l92RJigAeJgDuCspAAAAAABMDL3/w8H2J38GbH8eBtJ/XQRbkP4BVsWV1c/GNcrPa84+9PFzAD2SMgcAAAAAALAG9P57YG3bn0yQkjNg+/MwkP6rgxiC3T/Aqnhr+U9E+dlu9q9BMwcAAAAAAADTQO//cLD9yZwB258nkXgmY/efDWLI4MZ/pH+AAXjT/aXgSD/fdZO8qTvAHAAAAAAAANwLvf+3g+1P/gzY/jyJ5Rv/kf6vIP0D9GYKq58Yf98BMIUMzRwAAAAAAAC4ht7/sXhW/7H9SaWBDiD9VwcxBLt/gMXw1vJfEeX8JcAzjgIwBwAAAAAAAOOh9/921rb9SQUpPAO2P49heek/mBG7fxr/AfrhTfeXhiOdCwAyQw2AOQAAAAAAAHAHvf8D8dz4L9j+pDOBKdj9twSxAukfYBmmtvqJESgAfOO6f8t3gDkAAAAAAAAYA73/9+JZ/cf2J5UGrBnc+I/0Hwg+Np0g/QN0w1vLv+HvdrgA8E3jWYkOzgGIyOCufOYAAAAAAACeDr3/AzGx/ZHB6v88tj+C+j8JSP/VQQzB7h9gAbzp/mL4Vu9zpFQBQNzXAIIYKPL6OQBpLzwwBwAAAAAA4B56/2/Ec+O/YPuTzgR2YPdfHcQQGv8BZmdJq5/fOJfzZAoA4l6Mvs4BCF8JAAAAAAAAY6D3fxSe1X9sf1JpwA7s/luCWIH0DzA73lr+DX+lYy9H+QLA9yi+3w2eGT8HYJ7UeekFAAAAAOBR0Pt/I9j+ZM6A7c/qIP23BLEC6R9garzp/tKz5f9EaQFAfNcAmAMAAAAAAICh0Ps/BM+N/7KE7Y+g/vsG6b8liCE9/LISIP0DWPEoq58YigKATNiTzhwAAAAAAAA0Qu//XXhW/7H9SaUBI5a3+7dKt1Lj/1n6F9R/gEq8tfwPsPqJ8fOS11spL7sdBWAOAAAAAAAAukPv/xCw/cmcAdufpVm+8d8q3UrSv9D4D2CBN91f7mj5P/EjnzciqjKA2xpAEOYAAAAAAACgAnr/b8Fz479Y2P6kghSeAdufdVle+o9lRPo/gPQPoASrnwR/FkDaUQC3kjRzAAAAAAAA0AV6//vjWf3H9ieVBppB+m8JYgXSP8B0eGv5v9HqJ8bhOwBWsgO6whwAAAAAAAAUQu//LWD7kzkDtj/rMtjuf1LpPxbHhGBc7P4B3OJN9xdPLf+/cT4nOn8J8DJ2QLE5ABEZ3JV/S1IAAAAAALCE3v/OWDX+iw/1H9sfKGdw43/iaeC82EDjPwAIVj+FoY6HOhcAvovWsAMK0tqVr58DsE0619UGAAAAAJgLev/Hs7ztTyZO9gzY/iwKnj8tQaxA+geYBW8t/w6tfmK9EeECgKxiBxScAxC+EgAAAAAAAAqh978z2P5kzoDtz4og/bcEsQLpH2AKvOn+4q/lP/bW6Eu0APDdvIAdUBDmAAAAAAAAYA+9/4PB9id/Bmx/lgPpvzGOCcG42P0DuAKrn6JQZYdKFQC+gWa3A2IOAAAAAAAA1ND73xPP6v8atj/SLDEgT9qSfqL2uNrY/YeDj02H9A+gxVvL/0RWPzHyBQBZxQ4oCHMAAAAAAABA7/9gsP3JnAHbn+VYvvEf6f8K0j+ACm+6v/hr+dfq/l+KCgDfBFPbATEHAAAAAAAARdD73w3Pjf+C7U86E1SB9N8Yx4TB0r9g9w9QDFY/RaHaDlVaAPgmm90OKAhzAAAAAAAAz4Te/5F4Vv+x/UmlgSqWl/5jGWt+07H7B3ge3lr+F7D6iaErAMj8dkDMAQAAAAAAQBR6/7uB7U/mDM22P4L67wbs/tvjtIP0D+ATb7q/+Gv5t9L95fPuQl0A+B5iajugIHfNAYhIfV7mAAAAAAAAqqD3fxieG/8F2590JtAzuPEf6T8QeWw6QfoHKACrn6JQRoc6va/4eb0rX5SmtgNKzAFIixxfC6MAAAAAAAA3Q+9/Hzyr/9j+pNKAHqT/xjgm9CiPpcHuHyCNt5b/ha1+Ym8qfrbbxtQAZJpRAPnf6s1VcwDSWANgDgAAAAAAoBh6/4exvO1PKk7JGbD9WQXs/hvjmEDjP4ArvOn+4q/l39zqJ8bPd1F1DUCmtQOKzQGIvP4xBwAAAAAA8BDo/e+A58Z/wfYnnQk0YPffHqcdpH8AP2D1UxSqc8v/iZ9vF39cDS9INrMdUAzmAAAAAAAAFoPe/zF4Vv+x/UmlAQ1I/+1x2kH6B/CDt5b/B1r9xPj55v6WAZ5mB8QcAAAAAADAQ6H3vwNWtj8yUv3H9gc0IP23xzGhx1hMAqR/gCDedH/x1/I/zOonxs/+KO01AJnWDigGcwAAAAAAAAtA7/8APDf+i5HtTypOyRmw/Zmf5e3+DdMt0/gfkP4F9R+eDlY/RaFuavk/8bP/x5PtgJgDAAAAAAB4EPT+W+NZ/cf2J5UGilm+8d8w3TLSv9D4D3DBW8s/Vj9Zfk7/frgdUIy75gCkuvbAHAAAAAAAgIjQ+z8EbH8yZ8D2Z3KWl/4TGZH+DyD9w4PxpvuLv5b/261+YpwLAL85mkcBJrUD8jYHIIwCAAAAAADYQu+/KYaN/6+35SfnT64IU9n+COr/fSD9t8dpB+kf4Eaw+ikK5azl/0S4ACDHLv5howDOe9W3PwCVowC1cwDSUgNgDgAAAAAAHgy9/73B9idzBmx/Jmew3f+80n8iVCOxoNj9AwzAW8s/Vj/VRAsAcrEDktpRgOnsgBJzACLyT971dkC1MAcAAAAAANAKvf+mYPuTOQO2PzMzuPE//UA7LzbQ+A+wGN50f/HX8u/W6idGqgCw0T4KMKkdUIL6rwRgDgAAAAAAoD/0/ncF25/8GbD9mRY8f9rjtIP0DzAerH6KQk3S8n8iXwCQp9oBMQcAAAAAALAI9P7b4Vn9X8b2R9rUCmTLOpD+2+O0g/QPMB5vLf9Y/ZhTVACQB9sBJWAOAAAAAADAG/T+dwXbn8wZsP2ZE6R/k1CNxIJi9w/QCW+6v/hr+Z/O6idGaQFg44F2QMwBAAAAAABMDL3/Rnhu/Bdsf9KZIE5WtzK/pNj9hyOPTYf0D08Gq5+iUJO3/J/QFQDkqXZACe6aAxCRmjIAcwAAAAAAsCj0/vfDs/pvZfuTCZU+A7Y/c7J84z/S/xWkf3gy3lr+sfoZhroAII+0A3I4ByBV1xAAAAAA4CnQ+2+Eoe3POPUf2x9IgvRvEqqRwdK/YPcPT8Wb7i/+Wv6XsfqJUVMA2HigHVCCW+YAXiKvOjsg5gAAAAAAYCHo/e+E58Z/wfYnnQkiLC/9JzLW/EZj9w8wLVj9FIVatOX/RH0BQC41ABkyCnCjYJ2dA5DqMkADzAEAAAAAAByg998Cz+o/tj+pNBABu3+rUC0g/QMMwFvLP1Y/N7JdsaYCgFy6+KtHASayA0pTOQrAHAAAAAAAgB56/zvxBNufVKjsGbD9mY3Bjf9I/+XHQPoHsMKb7i/+Wv6Xt/r5sr9ir/YCwCdQ6yjARHZA6TkAkXe9HVADzAEAAAAAAND7345t43/i1jqw/UllghBI/yahGunxW5AGu394Dlj9FIV6WMv/739//sOmACAXAXrMKIDbvnXmAAAAAAAAukLvfw+w/cmcAdufqcDu3yRUIzT+A/TDW8s/Vj83EtT9v5gVAORhdkBu5wBEOUgBAAAAALAC9P43g+1P5gwWtj+C+j8E7P6tQrWA9A/QCW+6v/hr+X+s1U+MnzqZPpX4SXZAaW6ZA9j+X10DYA4AAAAAACaB3n9zsP3JnwHbn0lA+rcK1QLSP0APsPopCvWMlv/TFcve5x+pbdVPHeIxdkA+5wCkapACAAAAAGBK6P1vw7P6j+1PKg0cQfq3CtVIj+pXAqR/eALeWv6x+rmRwpb/Ez+fzSKmr5CPsgNKwxwAAAAAAIAJ9P6bg+1P5gzY/kzC8nb/tunWaPwPS/+C+g/r4E33F38t/1j9FPKzV8yxA6qjZA5AbvpKAOYAAAAAAGBZ6P1vwHPjvyxk+yOo/51ZvvHfNt0a0r/Q+A9Lg9VPUahntPxrrX5i/MhRMccOqB81owDMAQAAAAAA0PtvjWf1H9ufVBrYsbz0n86I9H8A6R+WwFvLP1Y/d2Gl+3/5WACJyFf47W8HVBHfvx1Qdg5Aqu2A2mAOAAAAAABWg97/Bmxtf9ILtGD7k8kEIoL0bxeqBaR/ACu86f7ir+Ufq59Gfg45fI8CTGEHlOWuOQBRXjrmAAAAAADAA/T+G+K58V/06n+qMlF9Bmx/3DPY7n9q6T8drZpEROz+AcrB6qcoFC3/FmF/zjeMrQFI/1GAweK12zkAYRQAAAAAABaA3n/bQ2S2YPuTikrj/2AGN/5nH0rnxQYa/wHc4q3lH6ufu+it+385FwC+ycbYAUntKIBzO6Ast8wBvCsuHXMAAAAAAHAT9P4bgu1P5gzY/vgGzx+rUC0g/QM04k33F38t/w+x+umk+18jf/mJaePYAbXAHAAAAAAAgDH0/hueILMlc+wb1X9sf54G0r9VqBaQ/gFawOqnKBQt/3Zhr/x80uVrAGI9CrC8HVAW5gAAAAAAAK7Q+2/FQ2x/MtESZ8D2xzFI/4bRqklExO4fIIu3ln+sfu7iLt3/y9cCKFoDkG6jAMvbARXOAcgdowDMAQAAAADANND7b3iC1HpsfzIhUf/HUCJ12V467P5Vx0D6B0jjTfcXfy3/WP3YRs6y/w6AaG/34FGAxeyASlCfx2gOQFTXjTkAAAAAAOgMvf8mmDf+JxZUoFX/sf15FMs3/iP9X0H6hzUwfL56a/nH6kfF9XLd/kBcvwQ4Ogqw/6n5KMDCdkAlcwAvkRdfCQAAAAAAcILef6v0mS2D1P+VbH+k4XM4omYQpH/DaNUMlv4Fu39YAm8t/1j93MXtVj8xrgUASdQABDugntwyByDa68YcAAAAAAB0gN5/E9Qa4py2P6lo6TNg++OS5aX/dMaaoh12/wAO8Kb7iyfF+TcOVj+mkasJFgAkIe2+jjUAcfbNwG7tgJgDAAAAAABQQO+/Se7MlkGN/6JX/7H9eQjY/Xto/Ef6B1Bh+DT11vKP1Y8Kh1Y/5zif/4gVAL7LbrYDqovv1g6oBOYAAAAAAOBR0Pvfjmf1PxUF259nM7jxH+lfdQakf4Ar3lr+HXaao/vbRq4PdfxnugAgiRqAjLUDEv0ogEM7IOYAAAAAAAAy0Ptvkju1Pi6vD1P/J7T9EdR/O5D+DaNV02PGJQ12/zAp3nR/8ac4Y/VjG7k+TuTn2QLAd+/NdkCiLzO4tQMqQd1WbzcHIOUXjTkAAAAAAGiA3v9GPDf+i179T6ceo/73kERdPWduB7t/w2jV0PgPUILhs9Nbyz9WPyr8t/xno5QUAL6hsAOyoXAOQPqfJAajAAAAAABwA/T+tyfObBmk/qeiYPvzVLD799D4j/QPUIK3ln+Xnebo/paR60OVLSsvAEiiBiDdRgEWtgMqRHcSozkAUV005gAAAAAAQAm9/42olURsf3LxUP/7gfSP9H8A6R+84k33F3+K8xOsfvrp/sHglXGU61UFgG/8+UYBHNoBMQcAAAAAAPALvf+NWTNb8ke9S/3H9mdtkP49SP+JYyD9A4jpy4K3ln+sflT4b/mvjqItAHzTFdUAxHQUYEk7oEKYAwAAAACANaD3v4Ue6r9P259MwNgWbH88sbzdv3m6BRr/o9K/oP6DR7y1/LvsNEf3t4xcH6pt+09tn3u0BiDdRgGWtAOaYg5AlMMTAAAAAACl0PvfmDW1Pm53g+1P8gbU/0aWb/w3T7eA9C80/sM8eNP9xZ/ijNWPefDKOCZRtgmAhhqAYAc0krvmAKS8cMIcAAAAALQFZ+cAACAASURBVABEoPe/mh6N/4k1+lwRsP15HstL/9mMSP8HkP7BE4ZPR28t/1j9lBO8Vt4eCPNSxM8+ru0owGA7IG18V3ZAqjmAfsdIw1cCAAAAAIAl9P63pMxsGaT+p0Jg+/MwkP6R/g8g/YMnvLX8u+w0X1z3l54t/36sfv7iHI/0s2+fbxgFuN8OqCK+NzugchTHYA4AAAAAAO6G3v9q1JLitLY/qYCJLdj++GCw3f/s0n82YAXpcNj9wzPxpvuLP8UZqx/z4JVxTKLEz/MjR928Vq6N7ruOAvS2AxLN3xpXdkDlcwDv+0oRzAEAAAAAQCv0/lfny2wZ1PgvevXfs+2PoP43MLjxv+SRcl5soPEfoDeGz0JvLf9Y/ZTzTKufGB8LoKMubz4KMNIOSPqPAjjpar9xDkBKqibMAQAAAAA8Hnr/6/Cs/qdCYPvzJPD8Qfo/gPQPDvDW8u+y0xzd3zh4ZSirOGVH+tltEBHsgFRbuijaU8wBCKMAAAAAAFABvf/V+VLrozvGqf/Y/jwJpH+k/wNI/3A33nR/8ac4Y/VjHrwyjkkU/Xl+Tv8ebAcknr4Z2JUdUJczmM4BSGENgDkAAAAAgEdC738Fnhv/Ra/+Z/MOUP97iKS3P09uBOm/6klrfMZ0OOz+4TkYPvm8tfxj9VPOFC3/t5cizgUAufTOm48CnEVk01GAZeyAtHMAPc5QAnMAAAAAAFAEvf91yTJbBqn/qRAT2v5I7efnJyudherYYI3DebFhgcZ/pH/wibeW/9vl3UAcdH/r4JWhrOK0HSlQAJCL+mxeA5BuowCL2QF1OUOHOQDJTk4wBwAAAADwGOj9r0AtLGL7kwsWu4HG/wqWb/xH+r+C9A8O8ab7ixt59y/O6lY/XXX/WPyaOCZR7M7zk9BjR9oBndI1sowdkGoOoNMZCmEUAAAAAADC0PtfkSmzpeh4t6j/2P4sBtL/A6V/we4fnGH4tPPW8o/VTzlTtPx7LEW8X7KbAIh062MH5MAOSMVdcwBScrmYAwAAAABYGnr/tXRS/33a/mRiBtdj+3Mfy0v/2YxVxSrjM6bD0fgPy+Ot5d+jvIvubx28MpRVHFPd/8veAihaAxAxGQXwYgekiu/BDog5AAAAAACYEnr/KzKl1kd3YPuTzYL6Xw52/xXpkP4BDPGm+4tDeRernw7xa+KYRLEtRYRCnb4DICrvW4wCxIP7HgVwYgek4t45AElfLuYAAAAAAFYk+/6a3v+W1Nj+pIOZS//pmAszuPEf6V97AKR/WBjDZ5u3ln+sfgqJXShvD4THUkQyTvBLgKOjAKcagJiOAoyvAUjPUQBzabtiDsD2ACoYBQAAAAB4FOd3qfT+a9NktgxS/1P7sf1ZHaT/26X/9Bmw+4eF8dby71HeXVr3l84t/8+x+okRLABIogYgYjIK4MIOSPSjALfbAWkpOkCHOQDJXi7mAAAAAABWgd7/ctQK48y2P6mYsfXY/twBdv9VQyo0/gO04k33F4fyLlY/HeLXxDGJYluK0ISKFQAkocpiB3SjHZB2DsD8ACoqLhcAAAAAzAW9/005MlsGNf6LXv13bvsjqP9lYPdfkQ7pH6ARwyeZt5Z/rH4KwepncJxEAeA3rBM7ILEbBVjADkjLjXMAkr5czAEAAAAAzAy9/4V4Vv9T+7H9WRek/4p0SP8AjXhr+fco76L7d4hfE8oqzq26/5dsAUASNQAZaAckdqMAC9gBzTUHIFWXCwAAAACcE3g3+k7daJpu5d7/Qtuf9MriXBGw/VkXpP+KdAvY/SP9w4140/3FobyL1U+H+DVxTKLYliIsQpUUACTRnD3eDkg6jwJMZAekpajFvuccgMQuF3MAAAAAALNRov6bzAdEmaH333Pjv+jV/5KkvdX/Hh3Tj9I+l7f775Fu9sb/lPQvqP/QEcPnlreWf6x+Cpml5d9jKcL0rhUWAL5b7rcDumasZnY7oIo5ALm/CMEoAAAAAMDchN8p69X/2ozT9P57Vv9T++e0/ZGqj8qPEj6Xb/zvkW526V9o/Ieb8Nby71HeRffvEL8mlFUcZ7q/HO+aqgAgiRqAYAeky+v7KwG6zQFIYhSAOQAAAAAA9yQb/+X0DlIXp5wVe/+x/clGSqSg8T/N8tJ/SUak/wNI/9AHb7q/OJR37V78HEr/vXX/RAp1HJMotnp9z7umLQB843QaBYgH9/3NwDfaAc04ByBlVZPbDwkAAAAAe6zU/9qMc/T+92v8T6zU5IqA7c+KIP1XpEP6B9Bi+Kzy1vKP1U8hs7T8eyxFDLlrP7Uaa3QU4HRs21GAwXZA2vg32gFVcO8cgMSqJu/Dc5ZRAAAAAAAn0PtfQj/136ftTybsdTG2PwMZbPe/gPRfElMXbWw6we4fhuOt5d+jvIvu3yF+TSirOM50fym7az9S32cdrQHIxQ5IakYBHNkBiWYU4BY7oOo5ALlfXs+fglEAAAAAgHtJqv/2jf+XaGv2/mP7k42E+l/H4Mb/wgfCebGBxn+Acrzp/uJQ3rV7zXMo/WP14yGUKsrPfk9Vq354n8UoQDz4cDsg0ZQZbrQDqiOTvfscwLbme3Hfx4xlhwQAAACAPoTfAteq//Vv2H33/vdr/E+s1OSKgO3PcuD5U5EO6R+gEMMnk7eWf6x+SkhcJW8PhMdSxK137fAdAOajANgBaZKKNGvcdXMA4lNef5+f1B4PCQAAALA0t6j/0/X+e1b/U5ux/VkLpP+KdEj/AIV4a/n3KO+uq/tL/5Z/rH6KQjXs/TlJxg2jAF7sgMTiz9zUdkB1+JgDOP5nqAaQDQUAAAAAJgTe8zZ85S+9/5/18e65GWx/UmGDi7H96Q/Sf1067P4BsnjT/cWhvGv3audQ+sfqx0MokygfC6D3Waaf1w4omLGOSe2AWuYArj8cye6+v2I1ALG4RAAAAACQxlD9L39jPlfvv+fGf9Gr//5tfwT1/0K5pjZYGXFebJi98R/pH3pj+Bzy1vKP1U8JWP24iGMS5cOfBdC1BiCmowDj7YDEaBRgUjugalIPTec5gGP2XQ1Azk98agAAAAAA/Uiq/6/UspJQ5Tju/fes/qc2Y/uzEMs3/iP9X0H6h954a/n3KO+i+/dJoQ5lFceZ7i993sAcvwMg5Ngzrx2QGI0CTGoHVD0H0J66kUANQPhKAAAAAIBBlKj/hW+x6f3/rI9/oh6m/mP7sxBI/xXpZpf+Bbt/6Ik33V8cyrt2L3ITSf8uCzA2rGr1E+Pn+iPsgCJZp7QDqsbTHMBnBzUAAAAAgJ6E39X2V/+TSX31/ntu/Be9+l+Ysav6nw2O+r9neem/JGPNryF2/wAhDJ863lr+sfopYaKWf4+lCH93LUGgACChGoB0tgPSx4+OAtxiB1Qef7AdUOMcQEvqRo7ZX4kagFAGAAAAAGjmLvV/ot5/z+p/avO0tj+i/3S9sA6K3X9dOqR/gCDeWv49yrvo/n1SqENZxXGm+8vYNy0/CZleBtoBVcWP1gBkuB2QKv54O6AWoqnb5gAK786roAagCggAAAAAVwJvY/t/5W8279S9/9j+ZMOk49P4v2dw4z/Sf0V2pH+YAm+6vziUd+1e27xJ/wN0/3QWXRyTKLZ6vbO7puJnlzovatfWAIqCp5ZWBMcOaL+3YQ6gMXX0SPF08ey7GoCcf2OoAQAAAADU4UD9t/zgGf5pwzvFro3/icXFuSJg+7MESP8V6bD7Bzhh+KTx1vKP1U8JE7X8eyxF+LtrFewtgKLd+iPtgKJLK4JjB2RHNHXDHIAUP9aBGoDwlQAAAAAABiTVf4X0X77ssvjzny57/7uq/z5tfzKRTyux/ekGdv916Wj8B9jjreXfo7yL7t8nhTqUVRxnur/4eKNy+g6AqEwv2AEFgke7+H3aATXOAbSkTp0qmTG0bPeffCUAAAAAQAM+1f9a7u/9x/YnGwb1vwTs/uvSIf0DfPGm+4tDedfuJc2b9I/Vj5NQrl61r18CHFVQLUYBSoNXxY8Hv2kUwKcdUCPh1G1zANGwqWWvWA2gPBoAAADAYwm/Ub3rK3/fiTVN6arp2vifWFycKwK2P5OD9F+XDukfYMPwueKt5R+rnyzpS+TtgfBYivB31wy5FgA2ot36za36iuBV8aOjAGF3e6NRgInsgEzmAOpSZw7GVwIAAAAADCHZ+P93+y3qfxXGvf+e1f/UTmx/Zgbpvy7d7Hb/SP9ghbeWf4/y7qK6vwxp+Xfoh+NN9xffb05iBQBJyPRysQMSK5n+Jjuga1It09kBtRNIHZ8DKDxkfQ1A+EoAAAAAgCIM1X9dw3jwXwFjHLOMdaj1x/iOWWx/UpGvK7H96cDydv+d0k3d+J+R/gX1H4rwpvuLQ3nX7sXMm/SP1Y+TUFO8WCcKAJLQ9i1GAXTBw0srgt80CuDNDqh9DqBkwX5lzxrA5xTUAAAAAACSOFD/d/+pdP4pP0XdR3TPjf+iV/+nsP2Rx6v/yzf+d0o3tfQvNP5DM4ZPEW8t/1j9ZMHqx0sckyijSBcANqLd+tgBhYLPZAdkwvl6WswBSMHi47JXogZQEg0AAABgeZLqv0L6L192WVzZ+K/NWIFn9T+1E9ufaVle+i/MiPR/AOkfcnhr+fco76L7d8uiC2UVx5nuL3O+ISkpAEhCppfhdkDK+NEaQDDO0+yATOYACteI8oRVowDhGoA2NQAAAMBihN+B9lf/Q+/la9T/8lOM6f1X2f6k1xfkioDtz7Qg/delQ/qHJ+NN9xeH8q7da9hE0r/LAowNWP3YUlgAkITGO9gOSB8/Hhw7oH40zwGULw7XAOT8q+no4gAAAAAMZHb1v+vHLc+N/6JX/8vT9VP/SyKj/mdB+q8IWxpqbDrB7h8aMHxmeGv5x+ony1wt/x5LEf7u2o2UFwA2ot364+2AxGgUADugjnMA5zLAwBqA8JUAAAAAAKEPLbWm/+XLLiud9v57Vv9TO2e2/RHlB/I1PnVvDG78L7/OzosNNP7DM/HW8u9R3kX375ZFF8oqjjPdX9Z6E6ItAEhCppexdkDR1drgIoIdUFf+hPhXeTnhS+HiYw3gs4MaAAAAADwYQ/Vf9abYUP3v99FLrULGd2D7Uxj8sY3/eP7UpUP6hwfiTfcXh/Ku3UuXK+l/jO6fTaSIYxLFVq93dtdcUVEAkIQkix1QJOsEdkB9vw/gUgPQnrBk8TH1K1EDCJwQAAAAYC2S6v8rtawkVNHi1sb/0LLQu9WqzxvKLbqxg5HqP7Y/nkH6r0uH9A9Pw/A54a3lH6ufLHO1/HssRfi7aw6pKwBsRLv1m7+5VxG8Kn50FCBWAxCLUYAp7ICsCFzMITWA47JdDUACZQBnr/kAAAAAZpSo/w0qfMniQeq/lt7qv0/bn0zw/TJsf4xA+q9Oh90/PApvLf8e5V10/25ZdKGs4jjT/WWVNx4J/us//7ulACAJmV4uf9eqRgG82AGJpls/njLaxe/HDshqDiCc91AD+IvGVwIAAAAAWBF+U9lf/Q+1AE3f+4/tTzYG6v8VlQxncn+x+6/LjvQPN+JN9xeH8q7dHwRX0j9WP35CPeRF+b/+879F5KdZA42qwRajAIrgUlMDiARPjAK8WiXjKeyArAhc4kMz/qvuKwGoAQAAAAAEWUD9j6xp/YzWu/E/sb4sVwRsf2Zj+cZ/pP8rSP9QjuFTwVvLP1Y/abLXx9sD4bEU4e+u+WdT/2WzANLr8lei3frNMr06uPS0A5K3vB5gB2Q4ByDBi9lmB1SYerds9598JQAAAAAsSuC92ztw+zLqf/kHe8/qf2obtj9TgfRfl25q6V+w+4divLX8e5R3V9T9JXd9vOn+4u9IDu/aLHzVf9l/B4DFKMCD7IAaRwGmsAMyxLwGUL44MApwqQFoUwMAAAB4w1D9V306egX/0436byj9x5L6tP1JBT8tw/anmeWl/8KMNb9u2P3D6njT/cWhvGv3WuVK+sfqx0+oZ74W79V/OX0JcHMrdDTALXZAmvjx4IlRgNXtgArnAOqte+6tAUigXc3THwsAAACAUpLqf6/G/+Pipsb/yLJ47/lw9R/bH1Xk56j/2P1Xp0P6h7UxfAZ4a/nH6icNVj+O4phEmZOT+i+nAsBGv1GAwXZA+vjRUYCEHVD7KIBzO6DCaCUBwzWA3xA1RYXyxYEagPCVAAAAALACqP+lm/O7Bqn/qW3Y/szD4MZ/pP+61Ej/MBirZ4A33V8sZVl0/46JFKGs4jjT/WX+NxiNXNV/CRYAxEAgjsr0cocdkOhGAXR2QO2jAM7tgJJzAOfBco0v/47LKIDqUauqAXzCUwMAAACAaQm/T+yv/l/ePZ3y6gKaq/8VaG1/0ltyuSJg+zMPSP916bD7h4XxpvuLQ3nX7oV/IunfZQHGBqx+fBJU/yVWANhoU0KjEu54OyDR3Zd48GQNILynGOd2QLYBA8va7IAKn0LHZa9EDaAkGgAAAMCNBN4h1pr+ly+7rGxS/yNrdG34FXkvW3QZfdr+pIKflmH70wB2/9XpaPyHJTF84L21/GP1k2a6ln+PpQh/d212Yuq/pAsAYqCERrv117MDEjEYBbjFDqhhDiDwBLmrBlCVOloD0KYGAAAAGImh+q/61HSL+t+v8V8Gqv+pbZPb/ojmM/y8n9Kx+69Oh/QPS+Kt5d+jvIvu3zORIpRVHGe6v8z8pqIHCfVfsgWAjeZRAIUdkJjI9LfaAWlSXINHu/j72QGZl3mMagAy9CsB3ru0ymgAAAAAI3Gg/jdJ/5FlcQG6T+8/tj/ZAOZi66Qf1JH+q9Mh/cN6eNP9xaG8a/di70f6H6b7l+QqjWMSxfaV3NldW4m0+i+FBQBp1Yijuy1GAXTBlfHjwROjAK9W4fgWO6CisNEDBGoAUveVAAch/jW0BiB8JQAAAAB4J6n+K6T/8mWXlU3qf2RN5C2m8l17OdrG/8SWglwRsP1xD9J/dbqp7f6R/uGK4UPureUfq58007X8eyxF+Ltri5FV/6W8ALDRJoZGu/WbW/V1waOrtcFzdkDScLnG2wGVSvbFNYDwjwp3XuyAVE8Jfflh9598JQAAAAC4JCn9y/7NU02oosW7/3zH1mjzxgXoPuq/i8Z/Gaf+Y/tTzfJ2//3Szdv4n5f+BfX/cVg93t50f7GUZdH9OyZShLKK40z3l2nfSIyhRP0XbQFAWsXQqEwvEceeqe2AGkcBbrEDKoqZqgEIXwkAAAAAYE5S/VdI/+XLLis//xpg+zO88V+VtDhXhPltf2R19X/5xv9+6eaV/oXGfzjiTfcXh/Ku3Qu8H+kfqx9XoXjNzVKo/ktFAWCjQQyNauYL2wGFt5VmHWoHVNo7/xaJfuPx+XrMWgOQwKdeN3+VAAAA4CmE3/FNpf5H1gR+/AqlUIaNLa6R/rH9CYUdLY6PZHnpvzwj0v8BpP/HYPhIe2v5x+onQcnF8fZAeCxF+Ltra1Ou/kt1AUCKleL4bkd2QJr4keBJO6D2UYDBdkBFvOWlqQFImSdPsgYgfCUAAAAAPIpk47+c3iepQxUtHtj4H8qiCRtbmVo7rvFfsP1xDdJ/dTqkf1gDq0fam+4vlrLsarq/FFwcb7q/+DuSw7v2BFTqv7QUADYa9NCoTC/D7YCU8aM1AOk2CjDYDqj0qG95Rd8RBa5SyUUOpD4047/qvhJAXwP4hKcGAAAAADeRVP8V0n/5ssvKJvU/siby3tFY+n9ll6Uz1skc0T1GQwZt6n90N+r/YLv/ZaT/8shWqbH7B3O86f7iUN61e1H3I/1j9eMqFC+1WrTqv7QXAETdQV+09S47oPAGVfBkDSC1oCjrUDug0lNF7YACV0mvxX9oswMqfHCPy16JGkBJNAAAAIA6wu/sqtR/1WeqV/A/37E12rzx3nNL9f9VsqyHBqFV/yey/ZF11f/Bjf/jDZSw+w9C4z8YPsDeWv6x+kmA1Y+vOCZRnkeF+i8mBYCNBl070lB/hx1QdIMqeIEdkNRerpF2QIpLsbwdEF8JAAAAAKMIvKG7SP/hZSWhihZ//nOA7Y+zxn+p0jtSG7D98QqeP9XpkP5haqweYG+6v1jKsuj+fXOVhrKK40z3l9neMLiiTv0XwwKANLVFR2V6uckOSBSjADV2QNGdRSm3NqkRowCKS5GxAzqHKbn7gW0WdkAli3fLdv+JHRAAAAD0JPxOalHbn1cohTLsedUtnyejSbH98QrSf3U6pH+YF2+6vziUd+1eyCeS/l0WYGzA6mc9qtV/sS0AbNRKolFh1mIUQBf8u2eAHVB4Z1HWVjugRJDLsmJ5PWoHFAhTrsV7HgVoeRABAAAAvgTewQXeOq3S+B/KUhwzvCq7cmjvv0Xjfyr+fg22P8Ug/bekw+4fZsTwcfXW8o/VT4IZW/49liL83bUn06L+S48CgDRJomFhNuHa39sOSJpHAdJ2QKk1+ZQ2dkBSNgqgsANKjQKcw5REDjwQFqMA+hqA/JUBXrFlAAAAAGqS6r9C+i9fdlnZpP4n301ffrp247+sYPsjPXXkW9Aqd+33C7v/6tRI/2CC1ePqTfcXS1kW3b9vrtJQVnGc6f4yz5sE/zSq/9KpALBRK4lGZXqJ2AFJu2t/UjEvviPRGoB0GwUwsQNKx9mtETEYBQiE0WvxHw6jAG9VtPBR8steiRpASTQAAACAPeH3az7U/4akcfXZUv1/lS0TyckTZo352P64ZPnGf6T/K0j/j8Wb7i8O5V27F28n0v9I3b8wXVEckyi2L9TO7hpstKv/0rUAIPWSaHSfxSiAOnhqT3nwXA0gtSaf1cAOKBHnuKbLKECVFr/7x+two65WYWcHVB4NAAAAQIIfkBa2/bmp8d/8U6hW/cf250aQ/qvTzSv9C3b/j8TwEfXW8o/VT4IZW/49liL83TX4YqL+S+8CwEatJBred5cdkCZFJHiZHZBUXS4TO6BPnMwRdPL6mqMAu/9kFAAAAACqSKr/Cum/fNllZZP6n+ycufzoRvXfrvc/tXSU+o/tTyHLS//lGSvSYfcPE2H1cHrT/cXyNxHdv2+u0lBWcZzp/jLJG4MZsVL/ZUwBQOol0ahML/fZAZWliNYAotubRwHs7IB+e/cLlpVx6yhA+ZXUlx8+/8koAAAAAGhISv9/tzeo8NnFTdJ/ZFlcfS5uoilcZaX+q4gmXcL2RxZS/7H7b0mH9A+z4E33F4fyrt0LthPpH6sfo0ju7hoEMVT/ZVgBYKNKEo0KwnfZARWniAcvqwGEN+ezmnwz8CbaZ46gOuRdowC6Q5Yt3i3b/SejAAAAAJAj/F5s0cZ/0UgGhe9SDaV/G3Ue2x9nDG78R/qvzov0D3UYPpDeWv6x+okxuD7tUBz31vLP6+kAbNV/GVwAkHpJNCwI32sHJG2jAFk7oNSyTMqolX/5KMDnDuaPoDjkW17hGkAgjF6L/8vyueHvRtWV1JcfXn81ADm/FtY9iAAAALAYBQrypOp/XH22VP//3tsVLTV9+3W7+o/tTwlI/9XpsPuHKbB6IL3p/mIpyy6l+0vZlfGm+4u/Izm8a5DGXP2X8QWAjSpJNCrTy012QNFthcFFpNsoQLoGIDeOAmTsgM5h9Fr8XyJXowBu/oACAADAaMrkY4X6r/r09br+5wDbnxsb/6XwDXqb6m1k+5NK8V2A7U8O7P5b0tH4D87xpvuLQ3nX7kXaifSP1Y9RJHd3DUroof7LXQUAqdS1o5vutQMKbysMXlADSC1Lpdyan1rLAJ+j549Qfsi4HVAgTLkWn6wByL2jAHWFHAAAAJgac+m/fNllZZP6H1kT+PErlEIZ9rxKcWXGvNlawvZHllD/sftvSYf0D54xfPy8tfxj9RMDqx9vLf+8jI6nk/ovNxYANqo6o8ObEjUAsRgFSP/6lN2RSPBiOyCx/lCjcgQqrAGIzSjAOUbJFQ5kP1zDV9dRgF0NQP7KAJdP3j7+sAIAAEBfVNJ/an1JzMziJuk/siyuPpe91yl+B6o5ZOnbrKKKQtkjuF9vrERj+5MG6b8lHdI/eMbq8fOm+4vlrx66f/d0RaGs4jjT/cX3G4CF6af+i8jP9pr4v/f93lfp2lGZXiJ/7jXCqzr4d5sUjQLU2wFF96fybZ+G4r1DulGA166/PbWyeRQgcEkKwwaWXeyAVIcsXHw88StRAxDKAAAAAOvSQ/ovX3ZZ2aT+R9ZE1OcZGv+bRBNsf3yA9N+Sbl67f6T/5fGm+4tDedfuhXki6d9lAcYGrH5gT1f1X74TAP/er/frfeMrgL4zOqqjWowCqIPvdw6wAwrvb6A85svaDkg1ClB4zsCyv1GAvxtVV1JfftjVAOT8OkoZAAAAYD06Sf8NK83V/+g7NlPbn793bEVLTRv/o6mNGv+j8fcLsP2Js7zdf9d0kzb+F0n/gvo/K4YPm7eWf6x+Ykza8u+xFOHvrkEdvdV/2VsAvd6vl8iNZYAqSTSsyiZkek2lQR38u00aRgFK7IBSK8PJtg9H8R1vEZFX1Jf/esj8vdTJ6zOMAujLD7v/vIwClAcEAAAA53iQ/uX8VvF6AEVAhfp/Y+O/lHf3NHy2ddH4H91trv67VQGWb/zvmm5S6V9o/F8aq4fNm+4vlr9x6P7d0xWFsorjTPcXx3/0H8UA9V+u3wHgoQwwwA5IFKMANXZA0Z0lwRPH6z0K8FbUAIRRgNJln/8MjQJoswMAAIAr+kn/qsWv4L+w/fld3NBS7UL9j25VPENmbvxfXvpXZUT6P4D0PyHedH9xKO/avRh7kP7H/wHy1heP1Q8kGKP+S+xLgO8tA+j10OgOi1GAmuCZnSXBy2oAqZWBmNtnpeTy9682zihAOuD5KJllu/9MlgFKwgIAAIAHnEj/x8VN0n9kWbQ7Q/VmumRVB/W/tKIQICX9i/Ihslf/dc+QadV/pP+WdEj/4ArDB8xbyz9WPzEmbfn3WIrwd9fAhGHqv8QKABuv92t7KSLTawAAIABJREFU2birDDDADkiaRwGyv4YFdyQSXGMHJLYP04NHATTGShWjAJ/EkTJA+KgAAADgia7Sv2r9pS3keozSgMn3y5efrtX4/xe8Q9hsZGx/Ygy2+19J+lcFN8mL3T8ksHq0vOn+YinLovt3T1cUyiqOM91fvP6hfzgj1X9JFwDk+2y7qQygV0KjMr3E3yQUa741wb87JT8K0GQHFA0RiPnKDAF84m/a+NNGAXSHLFt8XEYZAAAAYFb8SP+Xxebqf1x6tlT//3oxipb2afw/L45kqRFhswt62v7ItOr/4MZ/rcLivNhA4z84wZvuLw7lXbsXYA/SP1Y/WP1AOYPVf8kWADZuLwMMsAMK77EIvt88wA4oHOIcsKwGIA5GAaLZz2HKtfhkDUC6jgJIogwggddmygAAAABOcCX9H9c3Sf+RZRH1/8bGfynv2ekirb50y4tWY/tzBc+flnRI/+ABw8fJW8s/Vj+RM/R6TWvPmIljEmUL5azln5dL54xX/6WwALBxYxlAL4OGJdm0TF+s+dYE/+6U2lGAQjug1OLDmtdRe45z7yiAxg4o/KOS7IfL+Oo3CnBZefxXZCCAMgAAAMCNOJb+d//C9ud3cZuYGx8+1ZLehe3PFaT/lnRI/+ABq8fJm+4vlr9i6+j+MrzS7NAPx5vuL/7+uMOVW9R/URUANu4tAwywA5LSUYBKO6Do5mzwxNmqRgE+D+QEowB32AFJv1EAOZ+bMgAAAIBHvEn/xy27/3zH1mizx6Xn4jaZwlUd1H+F7U+h9J/eUb0U258TSP+N6bD7h3vxpvuLQ3nX7kXXg/SP1Q9WP1DNXeq/VBQANu4qAyg10Ohyi1GAyuCZzdngmlGAEpYcBSgMG1hmMQqgKhjsIlMGAAAA8IJv6X/3Lxr/fxe36blxx0kt5uq/+qk1lfpfofc1Hh67/5a8SP+wx/Dh8dbyj9VP5AwdC5mNGTNxTKJsoZy1/PMqORc3qv9SXQDYeL1f78/TdnAZYIAdkLSNApT8OufuSCR4YtdxFECjgzMKsOMwCvBWH/J6FMX67+O3q8tQBgAAABiFQ+n/sstc/Y9Lz5bq/6tsmTZ12/f95hOZqbfY/pxYvvEf6f8K0v8aWD083nR/sfzNQvcfkTEfyiqOM91fnP1BhxLuVf+lsQAgn6fv+DKAMl1Uppfku4syzbcy+HezZEYB9HZAUvNioBsFeBUu/Y4CmNUAho8C/N2oetbVlQF2W3YBKAMAAAD0Z3npP7Is8qbqxsZ/KXccahNYc504TcFPC7D92YH035JuUulfsPufH2+6vziUd+1eaCeS/l0WYGzA6gesuF39l/YCwMaNZYABdkDhbRbB9/st7YAK94dXlo0CvEVENQqQry7o5PUZRgHCp9FtKS0DaLMAAADAlxmk/90PsP35XdxL/X8F/1MV/LQA258Py0v/qowV6bD7h/EYPireWv6x+omcoeOLWGPGTByTKFsoZy3/vDhOjQf1X6wKABu3lAGUucLibVamL9N8K4N/N4vhKEDtHIAIowBFowANmn7FlnwZoC4LAADAw5lM+pfzX3qFsF7yM40EXyj9F69Uqf+9vu/X/PHtbfsjBeKCE9UAu//GdEj/MB6rR8Wb7i+Wsiy6/4iM+VBWcZzp/uLmjzhU40T9F9sCwMb2xQAyVo7UCLJRmV5ydkBSNApQbwcU3Z+7seTuqzTrl4j0GQUw/mZguW0UoFnTr9hCGQAAAMCM2aX/8hQK9Z/G/+TWfPDTAmx/RETkNVyLR/pvSYr0D950f3Eo79q9uN4u/Y/X/VVJM3FMotjq9c7uGtyLH/VfehQA5POMH1wG0CSKrrUYBagPntmfDh6bA3gd1sQjB5PpRgE0fkT5C6moWKSyn8MUXoRcDUDqRgHKDxDfcikDSOCPA2UAAACAGAtI/4VZImsCP1ZK8EVLOqj/vb7vN3XxCyNf12D7g/TfnA67fxiJ4ePhreUfq5/IGUZL/w7FcW8t/7wsroQr9V9Efv7JS0T+t4NUeFcZYIAdkDSMAhS+LCTvSCR4QQ0gFzkQU4pHAbaPeveMAmTsgM5hSi5CYNuh7/5VPQpQtytaBjgfrCkLAADAwjxH+o8si79VMrX90Z2wNHWbzKqw/UklKq273K3+364gjJf+pbMW35ixIh2N/zAMqwfDm+4vlrIsuv+IjPlQVnGc6f7i4A832OJN/ZfvBMA/efWoAcgdZQBNlqhML7n3JAUKcn3w735RjgKEf3pRh7UPxKuwBiA3jwLE7YACYQovQiC70ShA+RniWygDAAAAFLGG9F+YKLImIj1j+5Pcqrh5W9PZ9kfcq/8V0r80n3mxYgPSP4zBm+4vDuVduxfU26V/rH7EVq93dtfAFQ7Vf9lbAPUbBZCbygAD7IDCOy2C70NoRwHCtI4CbB/TZh8FCJRM7h0FqNtIGQAAAKCQ8JuCcBNFfL02vnqXjfQfWRZ9Y2Tb+F+8UqX+D/u+31SehrpL6sYeuvCNUsKWGs+flnRI/zAAw4fBW8s/Vj+hA3R8yTJJmopjEmUL5azln1fDhfGp/sv1OwBWKgNoUoR14BKZvkBBrg/+3S+aUYDokRgFUF2ubPbIKMA5QRnfh0Vp0EQZAAAAIED0Tda60n9kZUR6pvE/uVVx83fNg21/kP7b001q94/0PxdWD4M33V8sf4MW0f1Fc0286f7i70gO7xr4xK36L7EvAe5dBnh/Xg7HlAEG2AFJfhSgyQ4oGiJyhNTi5lGA9zFXlHlGAQrDBpadRwGksQxQsTdUBvj8gDIAAAA8D6T/9I+VEnzRkg7qf9v3/Xpp/I/evoz6f4v0r83oP92Mjf+l0r+g/t+PN91fHMq7di+it0v/WP2IrV7v7K6BZzyr/xIrAGyM+X5g6S9HFsePLrQYBWgKngkROkKmBiCHVyDVQ/ASEUYB9iTLAOc0ZdSVAeRcCaAMAAAAD+KZ0n9kcVx3NrX9UUj/itRtYutA9T+Z0Ub6F6/qf530L82nXWzOYEbpX2j8nwTDq++t5R+rn9ABhpZFK5Km4phE2UI5a/nnRfA5OFf/JV0A2FipDDDADkhqRwHKX16Sd+RcA0idZ+QowKtw6XcUIF8DKAw4aBRATjr7YUn1c7ti43FLaRlAmwUAAMAVSP8lP8b2J7216Db9spYtnqV/WU6Lb8yI9H8A6f9WrK6+N91fLGVZdP9BSTOhrOI40/0F6f9h+Ff/paQAsPFPXgO+GEA6lwGKg0dleil4M5NTr5uCf0NI/mPj3yVV1QDikYOZykYB3iKiGgUoqi6UVywGjQLIrGWAuiwAAAC381jpP7I+2vJg2/hfvFKVeoz0H95ddFtp0vijoMGh+o/0b5IO6R864U33F4fyrt0L50TSv8sCjA1Y/YAHplD/pbwAIAO/GED6lwEG2AGFN1sE12QpkJ5DinC5sC5y/yhA6VGHjQLI6apSBgAAALAH6b/wxzT+p7cqblYuq14v/tR/pH+rdO0ak2o/dv9PwPCie2v5x+ondIC+r1HtSVNxTKJsoZy1/PPa91hmUf9FVQDYGOYIJD21yOLIYXm5UKbPadNNwcuyHG5MrWy1AxLpMwpg/M3AqcsbCFN4EeYuA0jgjxVlAAAA8Mwy0n+Neqi5RSnBFy3poP5P832/Z0Jv5E0ip/WIWaR/aTvqet8uQOM/mGN10b3p/mIpy6L7D0qaCWUVx5nuL0j/z2Yi9V8qCgAby5QBBtgBSbFArw2eiRI6Quo8l65w7ZXXjgJotPX8Y1VesYjbAQXClF+EWcsA5xM2ZQEAAOgK0n/5LeUSfNlh+L7f48rigWIVrhr/97lo/G9Jh/QPtnjT/cWhvGv3Ynmv9H+L7q/Nm4pjEsVWr3d212Be5lL/pboAsDHsiwGkmxZZFja6ymIUoDV4QYrz7anFA0cBti6ye0YBNHZA4R9pz0AZAAAAoIEy6b9e96/bEtp1v/QvGsHCXv2fyvZH9XAk1f9zpKnVf6R/q3RI/2CI4eX21vKP1U/oADdI/w7FcW8t/7zqwcZ06r80FgBk7BcDSM8ywAA7IOk8ClBQA5Ai0dlmFKBsudNRgMA91hdCLiGEMgAAAICO1JsgpP/YDXc0/itTj5H+w7uLbost7tP4LzltAunfPJ02Y4+Kjm1S7P4Xxupae9P9xVKWRfcflDQTyiqOM91fkP5hx4zqv4j8XDu+KxjpCCR9tMiymK0yfVJEjt5YPgpQcC8OWVLnaR0F2D4DLjUK0Cy1/yX9u+1YLGgsA6j2UgYAAADPRN/73O32E9roQvoXjXJhq/6XS/8yTv3PZNEVNlKpm4pPUiBPjBEdWqR/aTskdv+NSZH+V8Wb7i8O5V27F0isfprimESx1eud3TVYg0ml/40fkajYp2WNMsAAO6Dw/lxwYRTgcIb8Y1VesdCOApx/lI0f3PI+3rxb1fLc1j9G+/XHOkKyDKDKAgAAUE6Z9N+kui4o/UcOoA60W9JB/Z/v+36T6v8r+o/y+A7U/1OKtRv/kf6vIP17w/Aqe2v5x+rnkn3oC2B13mgckyhbKGct/7zYwZWp1X85WABRBlAEDGvLqlb9mlGAorMVrjxkSZ2neRRgpyUnmWcUQBc5uyXiC9Sis9eVAXZbdgHirww9inAAAPBkkP7Vt9hL/1Iu0/8uW9T2Jyn9nyP1UP+R/udKN6P0L9j9O8PqKnvT/cVSll1B9xflBfGm+4u/Izm8a7AYs6v/EvgOgBnKAO/Lq3WPMsAAOyDRjgK8RaS0Uz56xEiWTA1ADs8K1QV/iciKowDRn+YOE94SKQPUZaneeNxyKQNI4MWBMgAAADRSpvsfFt4n/Wd0/7pEA6T/TKzdKoX6P5Xtj+px6a3+b21NRQfow6Okf23GmgcUu39owJvuLw7lXbsXxYla/l0WYGzA6gfmYgH1X0R+wuKdXRlg2CiAWAuRBdGiSwaMAmjE99JRgMzikaMAr8Kl31EAsxpAbhQgcK5nlAE+P8AXCAAALMi8UbKT/o10/+MPjKT/5HpL6T+X63dJ+fnLDzBd4//f4psa/6vDlmY//RO7/7Z0SP9QjeHF9dbyj9XPJfvoqmdd3mgckyhbKGct/7zGQZY11H/5TgD0KwMMdgSSDmWAAXZAohoFeP/+GVQZvJiNAoT6rOxHATSzDp+wmYPojhodBYhGWrUMsNu1i8FAAAAA6Cl6ZzSh209FrnrpX/8ntvANaeFdUNUePDT+528OruzX+N+2oIVz8LdaWXOuxQ9Oh/QP1VhdXG+6v1jKsuj+4/KmQlnFcab7C9I/lLGM+i8nCyDKAOEU+VDRGoAUv3dSCfrfGkDuYIf4ucWvIpU59HxQViPmGQVIVSBSZYDADckjhdd3KwNo9x7THf/FQAAAAOTQ6/6HTZ6lf9Oz5VTsqr+pBSd8lS37LC09xsrf96uN/LflJtsfpH/bdNj9Qx3edH9xKO/avRBOJP27LMDYgNUPTM1K6r8EvgMgppC6LwNcawBiXQYYYAcUDhG85dOMrxTfO44CKCXvLqMAPb4ZWPRlAF2W9PoOZYC6vUdN//iv+OuD4e8gAABMRJXof96qVuWU6+N7M7p/Xa466V+juRcH3a3qIP3rFJzA0uHqf1L6P0fqVJHqJEkEKyutD5DqANj9tyWl8X8BDK+pt5Z/rH4u2Ue/4tXljcYxibKFctbyz0sbaFlM/ZdgAUBKtchK/snrLW/zl+XYKIDYSZAFccIyeHkNIBoiyOfh0IvvXUYB9JK3bhSg2A6owyiA+CgD/K44iO+vy5Jy6vYeD7n7V84XSJsIAADmovTNTof26uo3pylB+Xa3n/gZGjIeFk6k/neS/g+LO6j/u+DRrW6l/0AQ1V7s/tsyIv0vgNU19ab7i6Usi+4/Lm8qlFUcZ7q/IP1DFeup/xIrAGz0KwO85PUSmbcMMMAOSAJRIj/W2wGJ8l6kFg8cBcip8Kcz5C+J7qINLwOEtzgbCDiWAT4/yA0E7JYCAMD0FL27KZBWS0M1b4lsRPpvPcx0jf9/i62lf93lteZ26V+Gy2FI/1eQ/m/Em+4vDuVduxe/G6X/u3T/itTROCZRbPV6Z3cNHsiS6r+kCwAblAH0QeJCsHIUIBQl9OPaUQCVHVDoMIfsySOmM5XVAOTuUYBPxDFlgNSWQBlArAYCGnyBjjHiAwHXH1MMAACYjvw7mm6iv+nG479CZzYtS2SCdTP6P6wtXK+qQ/B9v9HFkXf/SP9TpJvR7h/p/y4Mr6a3ln+sfi7Z75H+HYrj3lr+eVGDRlZV/6WkALARFUl9lwGCNQCxKwP0tgOSqJ4bCq4fBShYfEiUusutowDbZ8wZRgGKzhDV4S1E9su/D5WA1oGAuhLCMd3xX7lKwOkWigEAAJ6p0v3NRP+WvZeNux8Ytfwnt6SCqaT20qChtQrpX8qPpJwnOHFj4384e/3TtcfKyoB/78naCjOqM6wl/VekaEzank4h/QvqvyVWl9Kb7i+Wsiy6/7i8qVBWcZzp/oL0DxYsrP5LeQFA0nqiRRlgi2L7ep4YBRCLMkAuQrQGUKhfJ2NFawDRxKpTHm4XRgHCZ5DsQxm+BhYi++Eku6A2ZYC6vaEywO4H78vSeJDrDgAAuJHMu7zOzf6N2wdI/8n1t0v/otbo3TX+h3cX3RZbOcb25yJt+JT+A3FUe8fa/Q9IN530LzT+34E33V8cyrt2r3lY/TTFMYliq9c7u2sAa6v/oioAbPQrA+yb16crA6gNYTZBWvvR7RwrFHxnBxRKrDrlacmgUYCjfUycPqMA6mfCN27+Y+nEvkCqvZctIUmfYgAAwAzodf8ucuec0n8m0hDp/6VaP1T6j+fqJP0fFpuq/9GVnd+7xKR/MXl0yrev1fiP9A9ZDC+it5Z/rH6OqYeWNhtTh+OYRNlCOWv557UMbFle/ZeKAsAGZQDl9rCwXJf0EisUfMgoQKoGIIfngL4acdsoQPUz4fW510v6AtXtDR3SoBhAJQAAoCv5N3HRwbbiCMUYSf/Hf4X+kFQkqpf+h7T8q7b0k/7Dx7jR9mdQ439rWF3SWuk/EEq1F+m/ISPS/4xYXURvur9YyrLT6/4y/MWtOm8qlFUcZ7q/IP1DB56g/kt1AWBj0jLA+9uzHcj7yVoXXFsDeItIqX59iiUBUXX0KEBm8eSjAJJdlDhM1UBAXdLonXHjCyTHJ0J7MYBKAABADzLv2kY1+zeGSsnHuP3EgitOpQ9+wkj6z98cXDlO/e8lUCD9d0rXKE6NLzZg9z8Sb7q/OJR37V70Jmr5d1mAsQGrH3gOD1H/pbEAsNG1DPD9xlzDvwIveclbOpUBknujN1aLqhOMAlxqAFJ8ku3gN34rgDQ8GYoHAmyeD1FN/DAQcFjVIqOb7JXTh9brj3PFgEgoAABQ0Kj7exD9I9uR/suClx5sSun/sNj0yRxdHFH/239TJpX+/aej8R9iGF47by3/WP0cUw99WWtMHY5jEmUL5azln5cw6Mpz1H8R+Xn9fiRpfbnNqMBS+Yv7PV6PMsD7/U4crLEMoBgFqGrVj8QKxbh3FCD06CurEZpRgFfh0m91oWh5/ZMhP50Q1dLrRPboUT0NBJy2yzlIshiQ/IVtOQwAwKNwovubxNFK/xVJ41tyUnXtnyXNIQ9FfsWe4rP1+6bfy/ph0v85mIH6H2/8Ny5und/9tz06qpOs1fiP9A8xrK6dN91fLGVZdP+hqaOhrOI40/0F6R/68yj1X74TACZlgIwU6K8M8Bu2TxkguTF1o1bHDMUKCewPGQXYHsxiV6XXzrOn7BhlSy+n+s2Rev5Hj1FXGQpvCZQBxGogoPEXs7QYwFgAAEADSt2/i+hvGCqqHRu1/Ce3dJH+lSf0Jf2HD2PU+O9a+pde6r+h9N96EqT/hoxI/7PgTfcXh/Ku3XuBiaR/lwUYG7D6gcfyNPVfRH72yixlgB5lgNJRgMuVaVPqQ0fejQKoIl8CRZOnFg8eBRARtSNQWfCW58PnIlQPBFSUAQK7zt3050KONlEmXUOoY7RLBsYCAAAKyL/tGqL796wf2Ev/yfU5nXqI9F9ZzFhd+v9bXyD9a4OHF7+jN/aT/rVPAKT/lhSNGbH794/hJfPW8o/VzzG1+i54eyA8liL83TWALA9U/+V3AuCozPovA7x3PTb+ywDJXZmQqoyhxSGB/f3319t0FOAd/kcouybyebE4KwOUrlYfLHySuqTRexUYCGgtA0jLlUlG2wW8/Kx4LIBKAAA8Bw+6v/nHucdL/y/l+l18xdmWtPs/B7MR0Ds0/ttK/00nwe6/LSPSv3+sLpk33V8sZVl0/6Gpo6Gs4jjT/QXpH4bzTPVfRH7+ZL4+ZYDU/toywP5s5mWA9/dOW5cBch+Fdjpmm0TebxSgXLBOXaXQrEN0cTST5suBRVcG2L0/6TkQ8P0W6rFfFFxWBpDTJ9rGSkB1hIKAlzMmxwLMjwQA4I3MG6von5Sy7SZnsImZkf4rzhDfkhOpa/+i+JP+dVoP0r9uizZXqERnc/iSjWs1/iP9wx5vur84lHft/pLfJf3fqPvXZQ/HMYliq9c7u2sAKh6r/svuOwBE+pQB8jKlszLAX1jrMkBuS0prVaULLQ6p9/pRgILFh0SpmoFBGUDz5NSUAXaHURyq/kk49ouCo1vOunlxRUeZtzHONWB+LCD5W2x1HgCAe7ld9+/0QU6r+9edpE76f8XPUJsuurxG+leezeC7ZI3UfyfSf3Q90r9Rrt/tSP8XsPvvhOHF8tbyj9XPMfVt0r9Dcdxbyz+vWXAjT1b/5VsA2KAMsA/7jrfk75apM6Y08e+SiBNRwd7E4mgNoDny9XYpFY7HlwFeivjf34CjnFyypX4gwP8XBbf/itkWA0LRjo/DO7K6z3kAAEZyr+4/SvS//NhI+k+udyH9VxYzekr/ErwX7qX/+uB73qkb634dSqR/VfDWIoRG4nEu/VekaMxI479brK6UN91fLGVZdP+hqaOhrOI40/0F6R/u5uHqv5wKABt/8u5UZYD38S25haq4u7+mZYCC9ZtK/b5mVOW6LA7t/ty1tsiZJfkywPGediwDbLUVTRngc54hvkDfNGN9gQK74gMB9UWO5AFMAl7OdvkBYwEAsARK3d9S9DeJUBzz8uNHSP8v5fpdfPXZvNj9m97fDtK/9G/8b5b+q09SIf1X5/rd697uH+l/Dbzp/uJQ3rX7k47VT1Mckyi2er2zuwbQAuq/BAsAcpIRO5QBMpurygCngy1SBgjVAKTkGqYWh3bXjgKIVRkgdG0HlAGqWuYV56p/Ho71BZLEUQMDAca/Zacz7NO2h7pUAj4/Kx4LoBIAAE7IvzPqqfsPFP1Dtxjp/rqkp5uHtPzrt0wv/edvji0uUP8dSv8FV/IV+K+KsOW78Py5L50g/XfA8Bp5a/nH6meXt+b83h4Ij6UIf3cNoBHU/41wAWCjXxmgSDd8UhlAors2AdjvKEDZSUaXAS76boSPyK6M//v/5QMB9VLyPL5A2kSFJ2mPHIpzOXJyLMCwLAEAUEHmrVD05b9se2N2y5ilon8ySN2W3F9Zz9K//mxdDX8u65H+c7ve4dttzp/dgvTfkBG7f4dYXSNvur9YyrJz6/5SdSm86f7i70gO7xqACaj/X1IFgA3KAPuw75NiaFQG+O6K9rf1GgWQicoAysMoygDy+djtdiCg2BcoEL66DBDYdRbKA4+pNpfqPI3BLyfUVQJCGwAAerGY7m8i+idD1a13If1Xqrf9pX9Rqv+RfpXiyCWLraX/6Przu5uCLfVZzreXx286CXb/DRlp/HeFN91fHMq7dn/YJ2r5d1mAsQGrH4ASUP/35AsAG5OWAd6Xt9XNviLHO2tdBohvSX0zcHmW0OLxZYB3+B8nLte26jAvxTPTYCBAUQZQZfluKChUhK9TXdLoNY8PBMjxSeqzGHAJcvnBO7La9BgAAFdu1P1Hif6hW3KvpHVnUxzgenN36f/7pkMfX3222hrDCffSf33wPWOk/8gSg/OXrMfu/750gvRvh+Gl8dbyj9XPLm/N+b09EB5LEf7uGoAtqP8nSgsAG13LAPmd+jLA9VRWZYCDRtihDBCuAYgkygBtMr1xGcBmFEAC11Z/GOUzc7vAyjLA52BDvij4Ow0y9ouCo2WA74qQKj5RMYCxAAC4EaXubyb6t28vDqgW/eOhWjbmpP8hLf/6LdU1CV/Sf/7m2GLrxv/o4nf0RmPp//JGaZD0L0s1/iP9PxarS+NN9xdLWRbdf3T2cCirOM50f0H6B9+g/l/RFQA2DvKuXRmgVJesKgOcjtReBtipvV3KAPH1nzJA5PNWcxngEqCqDFCweIYygKRF9mCibbfigPXPxrFfFJzaEpDIbysGdKgEfH5WPBZAJQAAYug+LM2j+3sQ/XPbU4Fr5XW19F8pIuvPVif9IP3rtlRkieTqp/5XS//aROe9vqV/bUakfyd40/3Fobxr9+d9IunfZQHGBqx+ACpA/Q9SUwCQq2TpvgwQPJJJGeAs9Q4rA7xl1wpumCISwEkZ4Hh/u5cB5E9kVyb6/f+LbJzdUj8QcP8XBZ9+elMxoD1yKMLl8UmOBXQtdQDAFDR9OppE91dI7bmXwvZTJSMg/ZflumKk/j9K+s/sCuUqz4L0X5eiMWNjOp30L6j/AQyviLeWf6x+dnnt/niNyh6IYxJlC+Ws5Z8XJpgF1P8YlQWADcoAu+26MoCR3npHGeD1e7NFGSO8JK8v31EG+E1UMxAwxBfom+b2LwqW0A2BYsA7cGO3YkCHsYCiSoDJGQDAPwYfiqIlWpsU/XV/tegfD6VDUYc43Vz7uqw59reLQB9ffbyaGoPEjude+q8PvifQllAZP78llMumgJFe6Vj6r0g3l/QvNP43Y3VFvOn+YinLovuPzh4OZRXHme4vSP8wFaj/CX60YvSVrmWAom0+ygBfibikDFBx2eNbxpajJybdAAAgAElEQVQBqkYByg5zSxlAtelvIKCqhKM4Y/0T8qYvCs7sChQDwrJ/p2JAe9hLhMsPwgWP9M+ajgQAd9H0QSj/C2+m+y8s+udCdZH+lSevlf5HtfyLJ+n/b/0w6V+MG/89Sv+iE5Rbq4y+PX+Q/ufCm+4vDuVduz+nt0j/9+r+1QcIxDGJYqvXO7trAMNA/U/zI83a98ZZnjYqAyjOpi8DXM/Tcil2e4vKAHU1AInueiW+Hzi+K5zlff7BJYDjMkBth35NGUC17fvbUD4QUKfIbxt+L13+s3m06bTu+fnJH8dNMeDGsYBYwCvUBgDupf7DT+lvr5n+aLK3IE7ox7k7O0T0z99eJ68XJD0vr5SPV5H+8zfHFheo/0+T/svXt0j/5VnCe5H+jyD9V2N4Lby1/GP1s8t7p/TvUBz31vLPSxJMCup/lj8LoPYyQCCC7zJA7DyNZYCjJpgqA7TIrKFdmyBtUAYILR5fBniH/3HicmErrurr8z8DfYEGDQS0+wJV5t39t9tiQM9KwOdnubGA8hR7qAoAdKLyM4/ihbxDdqPtuTiXHw9s9m+upY6R/r+9Afr4o6T/pCBeuAvpv3jLJdcg6V/5xtSz9F+R4sZ0gt1/A1YXwpvuL5ayLLr/6OzhUFZxnOn+gvQPM4P6X8LPSVp8ZhkgeJh6yfWw8VIGaJPmC3ZlygBtMv3IMoDmmWlRBpC/J6dyK18UnMR/MaA9YCjC5eFKhFa+26IqAGBCH7m/u9DfKVoozp2if3GonB5d++LoVfo3NfrPHSDyplWZIr3YWvqPrg8149fFz++aRPovTxTYiN3/BRr/K/Cm+4tDedfu7ypWP01xTKLY6vXO7hrAXaD+F/KdAJipDFC6p7gMkDhMSxngffjXJ0yoBlCdKF8GaK43DCgDFHz2HFwG+P2fmoEAZRngm65AJD5t6ToQYF8G2AeRbCgHxYA+YwGR2Ba1AaoCAGk6yP056bkuYxkmwYtEf8m/lAwX/fMLv/X8bgf4W16j7Y5q+ZeMGl6+6x7pvz74nrj0r42f3xLK1UP9Dz9AQxr/X6IWr5H+DyD9m/7V8Nbyj9XPJ6np36yBBzjHMYmyhXLW8s8rEawB6n85P7/txweJzbIMcN5uUQbQHey+MsBl1+cQIV3eNNHulrf8tX83JIqUASI6prIMULD4hjKA1D0/v6MXjn2BJP9FwVEZvF0fv4bKRLupGNAeLR4h8XpUXBsoe8tGVQCeSQetPxV12Ccos0/FJT8b2OxvJfr/LRoi/VcKx2tJ//mbY4utG/+jiy/N+HXx81uapf/CxUj/ftIJ0r8eq0vgTfcXS1l2Yt1faq+DN91f/B3J4V0DuB3UfxW/EwD9ygDh7Y8uA0hCl7dOlEnXXAaIBPhMOYRKBOXBM0vyZYDj/W0uAyh3P8MXqCZvPE0+4N3FgPaxgCvFtYHj2uBRqArAIxkp99/ykWmc7j9Q9C8OpUg4RPr//m3Xx1efbajbT2gj0n/Zlnu7/kXx1GqS/kWnX9dcZOz+18Wb7i8O5V27P7ATtfy7LMDYgNUPQG9Q/7X87P9BGWAXNvzFAOqMu12XLb3KAJEtY8sAVaMAZYcpfmaGHu6GMoBIxVO0aSDAmy9QOLyt1K4IqC8GeKgEJGJeCbxopFdRFYAHsLzcb569XfcfLvrrcg7R/QXpX3FzbPF60n8ol0/pvzBRdBeN/zuQ/ssxvOfeWv6x+vkkrTy8twfCYynC310D8APqfwU/1x9RBig5ScWliEiHr9gX9jYmGlAGCHUuz1QGUB1pt/crNdQMBFQ9lIrrV3/Xik6YOYnzYoDh8czvaTbLiUsFLn47VQGYmQ5yfzSkhw9InaX2e3T/HqK/NOj+6kzV0r/+eHe7/UQjld4cW2wt/UfXh5rxq1Nkttwr/Uv3xn+k/ytI/+VY3XNvur9YyrLo/jccIBDKKo4z3V98vLMF6AHqfx2BAsBG1zJAYK/jMkDiGHWX4rLrJSLZMkBzluONkXSqexRa7LsMIOe7XP1kfn3+RzsQ8FURtNdBxgwEfGtDRQMBqQz3FwP+NqSKAT7HAsqT7qEqALNT80GlqrW/MpcdnbIX6bkFf1ZNaHhFSa5ue7nRSv+VkvHjpf+/9QXSvzZ4dPGwxv9QmcHmLqSWIf3fmU6w+y/Dm+4vDuVdu7+0E0n/LgswNmD1AzAY1P9qogWAjdd7/+7FrAwQ3euyDJA9xpgygFGWonQTlgHe4X9c6TUQoCsD/Cad+4uC9xk+e1oWaSgKGBgLkOuj3aMSYBKt8QBfqAqAE2w+jUwl9w9LmhdzfYn+upztor865V+xXh9ffdTb3X5SwRQrgoutG/+fI/0fVyp+nSsShXdh97+Dxv8shnfYW8s/Vj+fpKZV6oEHOMcxibKFctby/7jXHXgkqP8tZAoAIqdRAHlyGSB9hrnLAJFcbTK9cRnAZhTgeIxUFA3P/qLga55UKjfFgGglIBVHf6rbRXCqAmDFDZ8rquT+8ee86xOXE92/h+gv9+j+Ui/91xzVVPrvo/uXLrouRvrXxi9Z/njpvyIj0n9vrO6wN91fLGVZdP8bDhAIZRXHme4vSP/wGFD/G8kXADYoAxSeYdYywFv+tN6GRJEywCVAVRmgYHFVGUDOF7mhDCBS8URtGgjw80XBwVSSTnhzMeBcCZDTk8fkVOk3ZHep4d6qAlZQXUgwwWeD/F9XzQ0dcHINp9L97xH9a3Lj9lO36LrYWvqPrjeV/jO7Lrk6S/+XJ8kY6V8U+jXS/5mHSf/edH9xKO/avWsYL/3frvu3nOEcxySKrV7v7K4BTAHqfzulBYCNrmWA8EaXZYDsAYzLAJHDzFMGiATYlQHaagypJUVKbuhBb5GAp/ii4Jpf1f2zY4FiwPCxgCuuygM3VgWsGJPtljLDlG/x668Ucn+AFt1/rOivS2gr+qvTiyD9q1fE1hdI/9r4yTtupv6rpH9tilbpX4qeaUj/hukEu/84hnfVW8s/Vj+fpDdL/w7FcW8t/w96xQH4gPpvgq4AsPGrf1uXAVIbnZUBCg9QpyBf1PCoLr/PUlEGiGy5owzQ//uBi7ZEHvS2p7TCqOd7jNdns/aCiGYgoKXCsW1bsxhwrgT83dZ6xfQk3t7de4bWqkBi6wxMe3Al4z52IveniPxR2tFZ9+8h+osP3V+/5bNeffLbjf6L8tdL58OkfzFu/M9J/+clSP81ubD7XwKr++lN9xdLWRbd/4YDBEJZxXGm+4vjN6sAXUH9t6KmACCfj22UAQqzW6jb9mWA5BbLMsD5jlwD7EYBtMFz62vLAHJ+3KvF39fnfxb8ouAvrcWA1I5+xYD2sYBbOsFPZ7gy4FSx7O/U7ZEZoDE88/1y9ytseVkHP0Q+nxHJUx1vLPjL10hZkOlE/79NNdJ/zeEXNPo/bylQ/58m/WvXI/2bJEX674E33V8cyrt27ymw+mmKYxLFVq93dtcAZgT135DKAsAGZQBVdqMywPvvttCWKnk6UQYIp1Pdl/Aduf6sexlArh/pxg4EfNWDwQMBiuenKkuYmmJAqchvWwzIR4uOBQS0gRuLASfK1PfxqQ3fu+rvzY33v5qp5Pu+QduY/EhDdf/iCIpUPUR/3QmO+yqVYv1dmMLtp3RRbMt60n8oV2fp/7JjjPQvpfo10n+AB0j/hvfQW8s/Vj/SdhG8PRAeSxH+7hrApKD+29JUANjoWgaI7nJWBihP3axub0pwtAxQd7Xju1LpZisDBFbldyUHAmqLW/qn6/YIKMsA33SfLaMGAr5MWAxQVgL+bjOroPTBW1UgiH52pCteywx/PEXBV+Hq/PVC/4meun8P0V/66P4N9/RbSdenGyX9J7Vv7cb8AVoVZGvpP7o+1IxfnSKzZaz0L9enCtI/0r8DrO6hN91fLGXZWXV/abgI3nR/8Xckh3cNYGpQ/80xKABsvD4qsW0ZILPLTRlAm3rWMkAkV+tYw/VnDWWA4k9PmjKAhB/6Fs235un6fcCn8AU6MUkxIBNq/6NzMSCqUvgsCcitVYEgI9/sdpNZbmbKQzfg5P6aCf0b+tfHCsq2Ty36S53u/7dFfV+WNfo/7CqQ/rVZfEj/5yUGdyG1/rKjz5+lwJOk59+/iez+1dK/LK7+e9P9xaG8a/emY6KWf5cFGBuw+gHwDOp/D35U6m2aX8WQMsDCZYC3HHXcykSRMsAlQFUZoFiUj+q2+YGA5iuw2/gVTHSVgK+qob3scosv0Invk0hxF+4sBlSPBVxviMXwg7eqQCcGvMOuu2i89U9w+8W5ReivPUDLdkWeHqK/7gSRrfUy96iWf8kI36pdQ6R/sW/8TxY/kP7rs4S2+JX+K/LS+G+F4R3z1vKP1Y8Mr8mZn+EQxyTKFspZy/+yry8AtaD+d+JHGrTLIJQBXh8tu1ywrurmPv4g0p4fWl+XZXdLrzJAJMCuDNB2oUoX5jeelV9txuAJ9M/YpoGAGl8gxYZC9tUrx8WA0kqAHO9Mat05cjbwvTykKmAL7+YbufEC3i7063O0b9cl6aH7N4r+LVfpdy/Sf2xX9GCPlv616+uk/wrC79Brnl3FGQeKjEj/VljdMW+6v1jKsuj+95zhHMoqjjPdX/iwABAC9b8fP6/36/36e69NGUB9sHAZQBej4lJc1PCoLl+dIpQln65jGUDvCKQ5z1njzWi++9tCZYCypNdDfEWVmoGAqiujvqhPLgbkg5x+qhAW5isPUBUAK+79/GOmj1s8+y0VEOtsi4n+f9tr7tTtbj+pYIoV2Y1LSv+hXJ2l/8uO4mdd27VF+v8D6X/Dm+4vDuVduz/FE0n/LgswNmD1AzARqP9d+ZHPC1mnMsBfJ/zzygDDHYGkRxkgucWyDHC+I9cAu1EAVXDZPTIdBwKaL8Jxo8Ko53uMrxyifRaJciDgsl2/M82xGFD1MXlcMaBoWCR9iNC/s4F8lgeoCjyBeT+32GjizoR+fVhF8h6iv+4El33tl65B9xcH0n9RfoNDlkn/2lzhxaFm/Lr4+S1jpX+5iokjpf9culmk/8Z02P2L6R8dby3/WP3I8N9H8zMc4phE2UI5a/lf7WUFwBrU/978fQnwdxRATMsAf6GeUwaQw6v7TWWAvYDamiK3JZpOlSh8R64/aygDaI5UWwaQ83XQ1B6uG/VP2u9DUTUQUF0JkOP9ti0G7F82HBYDKiOklyoElnCg2IZbtPhO73epK1TzkE8gubuZu92x0K/PojtID92/4VJMrPtL7OR9Wv5LFyV2lf7BVOdKlkCGSf/nJTZ3Ibr+skM/26hf7Fr6r0jdqGyqNyP9R/Cm+4ulLIvuf88ZzqGs4jjT/eUxb7wBWkD9H8DP/h/7UQChDFCeIpe0Im9zGeAlItkygN2lTqWbvwwg10+NYwcCvlJM94EA2f2u7HY9rhjQPhZQlC+BojyQfkt5DhRcPamSPubNtMOLw6eIIPVy/zxCvz6p4lxLiv5/QYbr/hI7fx/p36A+gfRfFzy8vlL6V+WKSv/JdI2/VrN4/iD9e9P9xaG8a/ene7D070H3bzzGIY5JFFu93tldA1ge1P8x/Fx/RBmgMkUu6Sfvu627X7U+UwawvtSfdJFcrWMN159ZlAHKNp4z5DMmBwKqygAiFc/b2oEAOT1zD2eu+cWp2ZmmZzGgvRIQzHfFvjxQqtK8s4scCt+3wHt3n9wl93t4PtTf9+BSRP9QAHvdX3xJ/4dd+T+GlekWkP6168dI/5fFSP+HXE+W/g3vibeWf6x+xIf071Ac99byv84LCsAQUP+HESgAbHQtA/zGeWgZ4PVSJp2vDLAVeS65mu+IhOsIbWUAzcHCZYDM3tBAQIu+XPe8/XtA9JWAz77Df36CLF4M6HXgUPwrNRlLRwfymj9VAfDDYLnf5yc3dP989tY7NZPuX7oovaub9B9dH1Lk6+Lnt1zKDJ2l/8uOwdJ/PGP7a9rIbxZtyVWzcxX13+pueNP9xVKWRfe/5wznUFZxnOn+4vUNJIBnUP9HEi0AbLzev4WA33+KiMVnxkOc55QBDgKqOillgEyAYxlAlWIft2BjYGH+ToXKAEUbo4f4/maOrgR8dv/9/9OKAcPe9ifeRFqODlAVAE8UfHYyk/sdfk7TH6l0x2Kiv5Hi/xusi+4vjqX/1MHOsc10+bj0b5nlL9c46V+uwmIf6f+zPrTp8dJ/TcYlpH9vur84lHft/tpj9dMUxySKrV7v7K4BPA3U/8FkCgDy+3eOMkBVimTGuqQv5XWIlgEif6aqL3X0c8dNZYCKFPqznReWlgHk/DahrWhR89Tdkn0rARWpL8f4nuQTvSZC60nOtBYD7hkLKCH9RlN3KqoC0AeLj0NmWn8y1g00H6ZYJkb0j8e7S/ePbM8fp/rAN0v/ElDku2SRcJlBlaJV+pfSpyjSv2GuB0r/hnfAW8s/Vj+Dv2e70zH+4phE2UI5a/mf/nUE4FZQ/8eTLwBsUAbIpig9W3MZoOI6XAT6qC7fkiK+5aYygPy97+tfBpDrh87xAwGfveqZANkJM42/1GsVA/JnqS7edMWgPNCnKqA+Bozl7k8yC8r9pscoDdZDqrhL97cW/WVG3b90UXpX9HiB2Ej/ZesrpX9trtfp/3MZkf5TIP1/8Kb7i6UsO6XuL21XwJvuL/6O5PCuATwW1P9bKC0AbHQtA/wFmbMMoDvb8DJAaP34MsD7b1FDokA9Ixbgc52rVVrNxvMx8vcrORBQ92v1+vxPUyXg839WxYBdnAWKAfmxgGMqd+TF+xjNVYHsMUbi8KFpZ/hV7ZNwQrn/FqH/vGexZn/juzOl7q9Yl9hV/DJskOucdw7pX7v++17rcoYeiRS5TF6I6jSyyidPQ66anTOr/950f3Eo79r9KZ6o5d9lAcYGrH4AVgX1/y50BYCN11veLwNR/hz2FIQygG2u6PqoLv/dYnedN1HZoAwQviO/eBgI0JQBJPBMkNT9KaKpEvDZcZV2Gw7z+5/zFwN0B0m/U/SjQY+tCrRgds3GvImvqKH2Z1SePs/vez993S70B0KYXuebRX+x/BVvv77T6f6HjakTDpD+o7d3UP/HSf9yFRn7SP+f9Uj/4VzqzdNK/4bn9tbyj9UPVj/RUM5a/md9+QBwCer/jdQUAOTz15EyQH2WeMZP0nebrK9an9LlK+LndmXKAM13PJ75OBBQXQYo2HteWLQxVAbQJE0c5aur1P6Cfva9jmdquYZrFQMqT5F4Q+mhNmBcFSiJ3m1bG/WPRp/jdrsIHp52R/4/e++5JDmSrO0FZIqS3T2z4uy5/2uh8aORNPIKeKantK7UUPyByiyoAEJ4BByAP2u205WJcA/IBN43PNDXQxc2ob8h4ih0f1jRH0wDavkOq+5fatuj9M8sD/zXWp0hSf+t6SC8LokXJWnmJelfEKh+Y9P9GaQsS7p/b90ohYKKg0z3ZyT9EwQ0pP73i6IBkEM2gEgW0Ta1dSzI5KK5mMx2wGIDcPRu2RWpNRG1AaRyCUTvWLC7YaFeoTGWWF5eb7SdgHIPin7AtM0A3v2hKeG4R51W3RUAaAONDVHOIhg2qR72NzRyob8aehSiP4MzMAAnfGAj0P1ZSz8bMgxc+q8uYlX6Z6IHsGnpXyFFrTlJ/7jApvszhPIu3JV/QNI/SgMGBprqhyAmAqn/vaNlAOQYtQFKEYZpA8h1rMkGkMo4PBsgY2WpVT1RUxO+Zl7Q2ZUPV0kbgNWfWYWcAFbdF4icgEI/JmEGSD8mm5LxsdkDYK6AZex0UfAxYgDbq4GhPCNNWehviK/aFECn1l01gIl9qhFbvkOs+1ebC0v/yknHIf3LLt/zm35VRx+IZVS5Y1P3jeSFOXXpXyldvwB2F9uQf5rqZ2RD/jFaEfhWjSCICqT+YwDAAMhxsvxGC9gGaIgwERugqIbKZwSzATg/g/htgForfiTtggCZhtVuiLbllAWAOgE6YQqYMgNU6m/KnYJA5e3BLbTcZ2rFNhVXEvDb6GEq5Oj6PfrHG7gVHLDQ35xOtamuZKx3PTO0G8au+zfkUZduW7Am/TflMiz911qQ9K+SS0v6V8k7Vekfm+7PIGVZ0v1760YpFFQcZLo/m8C9MUH0C6n/SPDz62YG8Xt4LAVgJmyAanMUNkBW/AYgBT/dMaO0DaA3gp6ry3OW1+wVpA3AacUXzAsbXPmIFW7Y0A0oJ0CsA7w+fYfBVxngFJojMwMAnIA67Tei4ykdkKLHu3M8W4YeUSpAbBBTG9Wyyt+cXbWpnryIVPRnk9T9lVMLbCvuIsDqv13pn9UFRzPS/3F569K/QBb9jMcLoFzr6Uj/2HR/hlDehft1tin9I9H9GeSOgIGm+iGIaULqPx6+KgDw2wDNzXu2AUrqH04bQGEj1AR6eBugtYnT8n5g2UT8VpyPC/K6eRuAFVYSzAmQiNBK5Z4boD5gxGYA9+RQX9MurNoDeLTvHqEnBCRoitqG6FfoL9Kz6M+0NgLshP7lyK2Q7i/VsG/pXzaFrvTPpG/phBM1NWrNRdI/l+FI/4AdxTbkn6b6QSL9IxTHsQ35H8z1giCGD6n/qChNAeRkDogHwKZgA9TGIY3JBmhanqvLq6VobZKLpvA2QK0hP9hxmyuL6ZIqM14noBDqO4GuHzBiM6BCy0mj8iQuSMttrUo2cgWIvlB9QjOsI+M7+jU3lK5MjG+wv1BM0v0Fw5W60fa9Aem/usiIpP9aOwvSf1cW/Yw9SP/y6foCqpfYdH8GKcuS7t9bN0qhoOIg0/0ZSf8EYRdS/7FRfQcAYCkAY6cXA7AR2gANquvobYA2Xf60BNxGhrcBOA35OjlEQUBrgpZlWf3ZF4MTUAhYVyeUwk/HDKhwzNFiD2AuHSBXgFDDwKMXfEi0Qn8RjdV29JqXLrVqAcD3mWhAdT13wro/G570L7v8WN/0OyzpXyX1EKR/bLo/Qyjvwv2O01Q/WnFAosDq9chWjSAIcUj9R0jzS4DNzAjEwG2AhrZoqgGAxsI3pWOljPnbCIxYDs3Ld9gA0Bv5mA4uF78hP552QUAxgXDz6uKiCnXxu/J2A3cCypG/kyn6AZM1A+q0GW292ANC2cgVGCXInpoguzMIoZ/BrDOE6M+0thXsDD+wij8/Jun+bUtpKcVtSW1K/7UW45P+BRLppCvc/EkEGL30D9g/bEP+Jz7Vj/7qY9sRGK0IfKtGEIQUpP7jpNkAyMFvA3Db9lINUH5aKcjkEilEl6+toGy64dkAeWVF69O5WrpaQ368WkGAQtKuHKKLi0bglAWYcwIK8U960UgqAxCJhC32gFNcBBB1bb/3m29EO84WvW9zOECfANEfCtA7rn/Rn8EN9jeh+PMjq+uY6qnx6P7MyJD/7oZ2pX+mqpIrJao1MiD9O43/JOnfOlD9w6b7M0hZdni6P9NefWy6P8PXJYSrRhCELCT9Y6bNAMgx82IABmsDiOnyMDZAWykAq/zaGNbla8UHjqTYOlQbADQdvyE/3hidAJluyFG8yx+0GVDcVniFxGPPWuwBuM6ruwI2sf8MoLkJRvrQYmO1pir0N4TXVYcRiP7mFH9+fNL9u5cyJv1XF5FKpCv9M+n7MOFETY1ac+lq8ZIDAbTTSSjyutK/TC77YNP9GUJ5F+7Xb0BD/lEaMDDQVD8EQVQg9R853QYAY+ZeDMCgbIC2htA2QJsH0JCOMeZgfjEA61yjpuVZqcnRBuD85EJ7LUKug1rGpoat8UbkBDR+Bn53PUozQKV9X7SUDjD17dkQpSX9BBjF48cAVkJbpzaOxY0IIfozre0JouwIhYBU/CXSSi/a3nYyun9H2+FI/7K5nMp/BXKBSf9diYDSqUv/KtmxSv+A3cI25J+m+tGNANIPlOI4tiH/SK8OBDExSP3Hj5ABkGNsRiA2OBuge/mmdJhtAAgjpG2WHuUU/CYnqRLYeGCFDdmvEyAWoWFxaSeAce+bjMrcozEDynGawa1SHmmxB4x7A5YZxg6RB88WBkZfnjZHTxvdKf1HJ0Tfg/3F5GkTkUn3715Kc/8alf5ll8cs/cumqDUh6b8HoLqFTfdnkLIs6f4acUZcC4Jv1QiC0ITU/0EgYQDkkA0glIifbkw2QNPylm0AVtqiTUmVD6RivF6cgK5M3YtLeAmVr/k3U5VvoG7IR2YG8CM3g1LVLMM7w5whdL4B+88LItuJnmIYY6VrASr62D3V+xWwiMhFfwSKv2IDXlt0un/HgiDHW5f6b1P6r7UYpfRvJle1lYb0L90BlNI/Nt2fIZR34X4wByT9ozRgYKCpfgiCaIfU/6EgbQDkGHsxAAO0AbityAaAysVd3mmZooe17x3FXuWKb4cN0BqhO3uteavAXvigKJaAdkBicbkI9YVaHZ2WdgqM3gzg52oGmQpaptHsG6orYJQxP6o0rNuQj4CedhW81l+NrrdT9AWdLjkYOqbI97DN6m1J92/uhj3pn9UPXTPS/3H5WqPWdAOT/pmoIg8g/QvnsgZgb7AN+aepfnQjgPQDpTiObcg/rosCQRCMMVL/B4WiAcCYgRcDMDBRXqiVfRug9rwzahtASJFX26f8hiett6MEQSF1V/PWwHBlAbadgBNiJQL1jzUvEBM0A/jZG0CqsnLPvy5amyFd2QEyMr1emVEK/Q2ZNHau8Wn9lfpmSPTXatmf7t/dHInuz+mJVGpd6Z9J3zwJJ2pqBC39s/LdiGAi7VynLCT964JN92eQsizp/hpxRlwLgm/VCIKAhdT/YaFuAORAzgjEjgrfkG0AmVIAdrIBpFaqI0trRoc5TCYdThtAoGHHvEDFj8kJUOmDmB9Q/0bnSoHQDChEbcpknva74eGJugbkEkVQWhHCCiNRor+HRntafzWR1uFheIYf+b6ZU/x1G5PuLxikNupfNrs16V82l4Iiry3Hi+ZS3r+1hkJlfeOT/rHp/gyhvAv342ZN+sej+zPIHQEDTfVDEHfTLswAACAASURBVIQUpP4PDl0DIAfWBshARXmhVl0ZgUsBWOXXzCnI5EBZ2jI6jqR+itwG4Lc9Sbw2nIBaBNtOgFiE5mz1baNVH9AYsfbxCMyAQmvuZ+WwVlXbsdkDNsFjRRDCTErob+iB3imNaoYfo4o/QHvS/SV0/+qyCtnlFXkJOV4vkXQuvdUfkvQv3Q000j9gP7AN+aepfnQjgPQDpTiObcg/lssBQRB8SP0fIjAGQA7UiwG+5GBMNoCUB9CdqCEXs2EDlJ4hcrlgDDaAQNuivmtqdiB+BEtOQFcm3rLNLTq+7kSgRGCUZkAdh/9Xj94Aa723Jm+AwEyvj4W9af3VdBBnKZ4ZfvAr/g1xSPfnwemMaemf1Q/p6Un/aomaWgndDMFI/2I2gwWgLhTYdH8GKcuS7q8RZ8S1IPhWjSAIo5D6P1AgDQDGoGcEwmIDqHgA3YkacjHGHMwvBmAAXsjRBmhV4TXHwnc8GWWFpVqF6Wk4AZUW9Q4JfN1Jlx8wETOgwhC9AUb2AGGXnh4F+xH6i9cvc0n010hf9B+K4t8QjXR/HnC6v0IretOvWqKmVlrSv2Q3UEj/2HR/hlDehbum0lQ/WnFAosDq9chWjSAIC5D6P1yADYCc0dkA3x4AfKJqrq9/YbYBFLZDzTY4rp8BG4CV7yEEygK6nQDlznQ5AU2Bi26J07KcTgekmjYH6Pi6neLS5s2ATDlS2Qyw+ZSK1htgrffoCB7kCXSgf6hzSv+xnJVZOm2QzPDDD4JIqWmOSbo/D35n9IRv8SZycrxyLjvSf6GVRC5I6b81UXsuOem/K5FpAC8a2Ib8T3mqH5B1x7YjMFoR+FaNIAg7kPo/aIwYADnALwZgzUK5cRugqgxkZANI5+Iub9YGKAZpjdPtBIjFUetGa2C4sgDN5gb9APNmQPGhXccMqF579HqlzEC9gSLkEyBnpM9jjWewxazWj3skM/x0/agqYm4nku5vX/dXa4X5Tb+yKWpNRHOR9K8A1NUDm+7PIGXZgen+DGLdsen+DF+XEK4aQRA2IfV/6Bg0AHKAXwzArNsAWeUH6mtZsgGkc3GXd1peDFD8mJyAfCmoDugEado6mcTXPMTMAL2ygO9ImpUBhYDcTE0tDMLzBtrKTPoAz03/OKwIPNsTDVXr3mpW1u+BhXmGH62umd6bpPsPRfdnJP2rZmlqJTSiYRzSPzbdnyGUd+EutAMa8o/SgIGBpvohCAIQUv9HgHEDgDEDpQDMrg1QU8n1bYCOJk2ug3UbwNjriBuWzx8J2mT34jcjcwJqESw5AfVu6IXqiCSdiG8G8DedHDBmAA/OTq383YcxUPoAmzdgmX6fQ6pXekKa6k2A7az9ny4OsyD+6kqrih20qvjnkO7PA1r3V2vYrE6akf5Z+SZBMJcd6V8tUa2VrvQv040+pX/AKwm2If801Y9uEP0QeRxkBwYD7BK+VSMIohdI/R8HNgyAHCgboKQdo7EBzJcCsJMNIJVLom+1jVlQ5UVzMZlNwbEBjp/hcgIYYx1TFen0hxPBqhNQSVnPoxdJzw8YuhlQ5xi+RU0hb2D00OOQMP0I/az1fLCW3+gq6+v+gKI/MsWf24h0f50+qCrXtXYypySA9N+VEbP03/JD35IOUvrnZzHHiHV/BinLku6vEWfEtSD4Vo0giB4h9X802DMAcgZkAzQ3adblrc0IxIzr8rXiA4cx8RmBpNM1i9zSToBURtU4TumAa+qVeSegKbYZJ6Axt0bkDmdBoufjMwMqkDdAjA25p79enhX7E/oBZuyRTtny3bhEfyXFn9uUdH/NPqgq1/al/1o7g4PxJdZOW/oXzdWZSKwng5f+aaofoVDDkf5RGjAw0FQ/BEHAUjyF/19S/0eEbQMgx8kc5siNZG+OwxgzZgO0NeHkGokNUEsn+2IA1uKgtDZh1VaiTkDxS4tlAd1OgHJ/+N3gf1O0UJzGjwEA8gO4keQ23ejNgAo8b8DY7uYh4w3wIM8AMxIPboN7xpuU1v+du+U74e0AovtjVfy5AUj31+yDqj5uVfcvNJGQ/vUSSeQaqvTPTwQO7IUF25B/mupHN4h+iDwOsgODAXYJ36oRBGGZxvOX1P+R0Y8BwBhjmeMwBmUDfAcxYANwl0dhA5x0aKAs/HRq7wcWTdfRaqhOgH5/VJyA4mdmygLqnahn1og0ADOgtQvWpe1q+Qxr/Lsnb0B7wTIG1mIEVsSY9Xplpin0V9DX/fVF/8Ep/h1faMbNId2/rRVJ/1pZaq2E7gNEEgksM2zpH5vuzyBlWdL9NeKMuBYE36oRBGEHkXOW1P/x0Z8BkJM5jiMnYTdS1bVBbYCO5Xu2ARzGGGYbQC5drVWtITkB9QjSToBONzqByDIAM6CRZhGhhtVKAkzeAAgGHjDwWBHN0DNVO6XtM2Gt/wQG0V96aZ2wQIq/0Nea0Un3b2toW/c/tpLOa0f6104kmmuI0j/s5YWm+hEKZeXnFZXuzyB3BAw01Q9BEDpInbCk/o+Svg0A9iWVQ9kApQhkA2hm4aZTtwFEM3Y3LGvurO16NjIngB9BzAk4LjgQP2CoZkALzYrDdzfIGxgG9Mxjn+9tTkK/+BEovK30dX8TWwm54i8UhHT/jra2pX+uW29A+uemG4j0L7AYSf8o5V2gTtGQf604IFHyUMiG/CO8KSIIooLOeUrq/1hBYADkANkADaL2uG2A0mk9ABugGEDZCWCN0qVAWUAfTkBbr/pxAho/7qk+QDLRCM2ACuQNENOh+660nyMMi9av2w1bg/1tiP74FH+hUKT7d7TV0v3Vsjf/yArk1ZP+awE6bh+VswAnkpD+W3NpAn6Rwab7M0hZlnR/jTgjrgXBt2oEQZgA5Awl9X/E+A4qEQfOBqg2t2wD1HR5HRtAphSAnWwAqUQShwHHBmCqToDajm4TvmWcAOUOyMTp7pV+f7qcgK7AlS+bHiCQlQiM3wyoQN4AgYS2O8sh7fiehX7I7DCyqVyPYLdeQzSVCkOlr+Uh3V+z/wMa8q+WrtzKmvTPxH+GtdX/QUr/NNWPUCgrv+OodH8GuSNgoKl+CIIQAf4WN3P+nz8foKMSiPAZQrUrc04/Vpojo2VtAFnRvCFFc6LvxRUcl+5N0ZQuV52NlAIUl2twAqS9h0pIKTSdAP0OyMQR6pWZDVLPJ+MHsIZnCwt+QA9mQNvDtFSXrDIAb0AZ4UA4dw02xqLdywGojMinhgBo1+jr/pBqS/0jxIq/UFjS/buba+n+ah1olv6N6f7lhgal/1oriRXsTNev9G/AsXOgRG2M8i5Qpwak+zN8OwKjFYFv1QiCAMHoBYfU/9FTnQJIU3YHIz8WIWyAhrZ8G0BNnW8rBWCVc9TRKQXoaAVnA3Qkqict5XWOXVUs2icnAKQ/Xc0lle2uEgETF40ezAB+WQD/s44w/YLFG1BGacerg9hvmKZ2L0mfg/rVU5vcfXhE/yEq/kLBSffvbt4UYHRD/ssNIeX4ribAufjLDE/6p6l+uuPYun9ANeQf4Xw42HR/RtI/QeAA3hTnXyVI/Z8CvsOculCrpLsZIHPyGxMdG4DbtsEGUPcAmlNwEzHrNsBJbIZL1JVXc2oguezdzcuaO2u7mo7VCWgNAuwHCISQA6EZIJhYPIllBu8NmMCm34DFbx8iQxP67e5lfdFfemnBCANR/IXik+7f3VxX91frg7L0D6/7dyUl6b81qXJAh8Hp2ujkXbgNNqAh/ygNGBhoqh+CIOr0ctEj9X8i5FMAtQm1PWsUx1IAzZ5wZf2SbP3tASgkwm0DOIwxZRtAolVDQQBTe1ewSnZO83IEp/BRR1lAH04AYywz5ARUgpxoiiap59e/NFki0LMZIJJBmPZGfV14ed5AVvkvoQNtxSoO94+ekO6DHT3F2OLwor+i+6/0tR6iwUn3724+MN1fLV2t4bClf9HW6KX/ser+DE76H5Duz/DtCIxWBL5VIwhCCvhfQ/nLAqn/06E0BVCLE6CkuMEBYQO0NcyKHgAbuw3AmOQ0/UK5OlJ3+Ewi2eU6IBThJLvjcQLY0alp6xVUfyrRWmNK6vm2SgR6MAN4iDcT/lFuWbAX9ZirsEy5aGDSlH44h4tK/40d7JBqnfF0tQjjU/xzSPfvbg6g+6t1Q1n6t6/7qyWtNSl8AJSu9U5TKJEgJkT/r39A9BCjvEu6v04cfPPhYNP92fBv4QhiiKD6uSH1f1JU3wGQ0z5kW1mC1wXIBujyAErhx2gDMHZ8N4BsOmndmV8QoGBCqHRANIK0E6DTB+E43b0y4czZ8QPkQ3SjZwZk9Y9k4sgAUU+A0huw8RCRtfxFSDAS7V4W6fWFPsQs6/vmoijp/sNR/BnvN0E7rHIQ0v2bW0lL8Mrpyg3l8kJkrP1lauD/kKT/sQ75p6l+dEON2IpAtmoEQXQC/wsId0kh9X9qNBsAOSJTAx0XsMjxxQCnPoAp5hxdHj7RKV1ZlM8/NWsDsOoKWnUCGkwIlYIAlQ6IRhB1AkD6IBxHqFdQ/eGFPdEUX2ypli+hpwySv0A1t+AdAsYvei0JVL2BcYjlbWoINLUthmQTTlS7l0Jl4/QvJJndpfrR5UX/ESr+isGVg4xa91friVP5r3AH7KvwvSSVyqizapLBASgeeKiG/NNUP7pxQKLg6w8D7BK+VSMIogWEl5E6pP5PkDYD4ETnHO5qmrU6hVIA+Ow2bYAmWTz/wlGtb+Dm6kqq8IYA0YyV1OXsOlMDlSMpHgPkBMgiptRL6vm1EgFAPwDKDOAt0Q78XlD1Blq+RCJsY6O2xei5CSMaOq/l1D0cP9ZF/z4Vf+n4Moq/SnydIKT7c1tJ6/7K6coN5fIC6f61D0xJ/+UPEEv/qHR/BinLku6vEQfffDjYdH9Gt7AEYRL4Xz1jov8JUv+niZABkNMp1OpLsXIUSgFO2cXzdizfMDxft+ygLRdrSKdsbAjpvxgKAkrZdZ0AlW4INa9tEv7VGK0TANKr1q50JhJbiv+lA/RkqmcGNNIRRvDXG2bvkDdAjBeVG2Hbg/r7fL6GzS2j+7dlxqX4szZhHTKLchDS/dtaSUv/QBtNQoLXSeq0/NWVVzYpV/3XuGaaE/2//sQk/WPT/ZkV6R+b7s/wdYmm+iGI6YDwUiYOqf+TRcIAONFZEMBUVXJpyqUAwHn5pQBqiboth6Z0Omsk1JZbEMBYH+8KZpicgHKE4tNRR1lAH04AYyyTEnnNnZ5iiSS7U9wTvZkBnWFaAPAJtHYZeQOELXp42uxhUL/ttbSQD0T0H4fir9JAJw7p/m0NpXV/7YycGPiG/CvkbUuneiE1Kv2PUvdncNI/DfnXigMSJQ+FbMg/6f4EAQv8L5110f8Eqf9TRsUAyBFRaYH0tS7KpQCnvCIZneNYf1ldvthcCh0boK1hV8aOtk1D8lmv7wpmCJwAfoTyhhFwAnT6IBzH+XYCWntVj9kVWQt4PwCvGSCYoR2hK6poG62E6t4ASHLCPgN4YhzpoP6+tryM6F9dnPsRKKqKv3RT2BUh3V+nJ07lvzLdgJf+UQ75V8ir6TRoZhcIWA05SumfdH+tOPjmw8Gm+7NB3MgRxEBA6BHqQ+r/xFE3AE6IFAQwGVFehVopgHhGR2Rhvg2gtl5K6Zi9goBadh0nQLogoNqB4u2ydFFCJVhfTgBIH4TjOIWvs+JngpG74mshZjwI2xODNAPE8zfS0CleG93+89rD3cNguBsahwmBYUs2gGDjYtD6se0dGd2/ue/m1migir9ETNL9u9tKa9Pwun9XXiDdv/aBAb+hqYn6DZNp6Z90/45Q5n9Vsen+DF+XaKofghgf8L9uaET/E6T+EwAGQI7gYG2zylqtFOCUUTCXIzJM3rIN0JCROVVxVzppd9vqyrKjE2C+IKCydLkPhWgqR5D+ETgoJ6CwFFY/QDiRwFKGzQAe1hXOlk41XwCFFpVCtWgAJ5a7XN946LYZAtVegR6FfnR7sAm0ov+gFX+JyKT7d7eVk+A183Kl/7EM+ec0Ubk9Mi36f32IRvqf5lQ/CAehIxTHsQ35H8TtB0GgBeHFwRyk/hMM0AA4IVgQwFRF8w6aSgGkcnUvadkGaMj43UhnGwrJxwYKAmRbcZwAUc8Jvj8dzWvbhv9bYNcJKC+r7QeIpVNB3g+wZAbwEPy1t1OuLZ6/B28AGz3dp5lNO6Dtr4HYNjSypbHf3ZeREf2ri3M/0mYEir9EfNL9hZrbUMNrDeWSAun+tQ8MmBwdur9YUrXUAgGrIfHo/gxSlh2M7s/widFjtiLwrRpBTAf4XzT0ov8JUv+JHHgDIEdcnO2S8ZRoKgU45cJsA7Q1NFMQwAQ7DFcQIJqR14dqNxA5AeUIRam9oywA3AkQDlXxAwr/krcE7PgBTYkQmQEtiN8gmOkYAm8AGzZXRmT3j2rjtmHgZhk+5CDu6GUEaLkYsKs/GsVfIgvp/kLNpXV/ndSDk/4V8mpK/4bOIJ4ajkf6x6b7MyvSPzbdn+HrEk31QxBDB+EFyj6k/hMn/Pz2wtzBLF4QwJR14UY4pQB5FsEU9m2AYjB5J6CXdwU7x79sFQQ0dyP/q2cngB+hvIXMOwH1JNKDvQZSIjBQM6Ad61oxeQPmGebWwXefa6RH+Fbzm+6+qRxaxkV/a4q/SgNVSPeH6Ak/jI0h/7W/UCZVyItT92ecY298uj+Dk/4HpPszfDo7QqUP4aoRxIgBP1OGK/qfIPWfKPJVAVC82zBxkEsps/KjmPlolwIILZxVLjYANoBoXlZM/a0em83bkJoVnQDl6ofuvI3dqEUZwUuDIc+CWkCZmBU/oPAveUvAxEPN6M0AHraEeBhvAA+D2Lkg9Lo7kB4LCLtlRt+XSNWb6D8axT+HdH+h5or9gVDhazFoyL9qxk5apHA00r8DpbMPSPdn+MToMVsR+FaNIMYKQucPD6T+ExUapgAyWhMgVRDA9AT0LyBKAbp7whHEizZAW/OuvN2pS9md438qo7hB8zanZkcpVbogQCKvdGfYcJ0AkD60xDxhv0QA/GEHxgzgPMwNSDhG4A1Yya+Ezds6/YuGRUZ1v4tnZSzq+3KZYQbPyjbgq+TAiVQBXCPS/QvNbev+5bbGJfimhnJ+g1reDrOhNamhc4qm+lEJNZwh/whVNmy6P2AoPHcyBIEK8FNjfKL/CVL/iTrcdwAYrQmQnaoFYDS09suBhZbna/F9FAR8NzKbl3FXHKUToDhBkP5BiNMJqAeXTAHmB8gklQvONwM6ygKKLQSvgv0r3K3Y8gYU8mMDYHtYWdsBbVIj9Lv+aPV9sDaaEcan+LOO2gXS/QvN1fsDocLLSfBAun/tgwkM+W+/P8Ih/TtQPWFw0v+AdH+GT2fHaEXgWzWCGA0IT3n8kPpPNCL0EmBzNQGyBQFMT0NnWfG2rfoMB2YDsEYN+ruRjozb3bbHgoDT1zUTQu1dwXKpeZ2p9kfaf4LsUlvzml3CP+OMOgG85HKP7d9L918iwDcDhG0dwa7IPBdiswr69gawMZW7Q8wg2Qdt3cCk70O2Vw7VKo6DZdFAQ/FvVTlV+gLQlpHu39DWuATf1FDOb1DLOyDpH4fuzxhN9aMZByTKuK0IfKtGEEMH/tdqMqL/CVL/CR5CBkCOuZoABUFWfTh2VtDDy63VbICOJlVBvNTIhhNQ0+LZ0N4VLJdatD/5X1icgHKEoobeURZgwQmo55LMWLEEevYDAMyAFmQuH4IXUQziO3kDxIkR30FzVw3+KEek7+umGLPi39EaSC5Xbk66f6WtnAQPpPvXPhi77t9584JA+j8+5sH0BE7eHc6Qf0gLGVmXaKofgsAJwsvOcCH1n2jBd5ijoH4aqglQKAhg8sJ9wQNoaO3IP0B1d6C1IEAognJ2fkGAvamBaiYEOQHCEcqbSsAJ0OyGOL37ATJJuwPyzYBGtDfwWEoKcN5hkS1RB+ee6gvDWv8A9H31vJNU/CGfS3Wbj0f31+wDV/qnIf8aGVujGZf+tTvsgHTjGAtI3h2O7s/w6ewINUGEq0YQgwP8+CfR/wSp/0Q7PlOV3RkzVROgpsbKDd9tHphfLfOW2iJCrXovCGjI3ktBAIN1AqQjFJcuPUR+r5Btc6IjgqgTUAmi2RlxVNX5ih9Q+Je8JaCzmpLHkuD1zpZPwDoeVacmiFu+BzS9eemWVhkzQv9Q9f1GujtDij8EpPtD9YGr+3d1AEj3r30wed2f9Sz9F55qMA35p6l+dENBxUGm+zNk9wAEYQ2Eft74IPWf6OR7CiDNQdAmagLUnQnGmLYNUPxGwQlQKghgRSfA1MB8vglhNi9rXHEG4gQw1Z3V0quTMm3bnKhF0HEC6p3R6ZIUqup8xRJQ9AOgzIBGDKgcJq0C/uPs1IwBQ9BNKAaa94L6Ia6+VwdxPAjr/uMT/S0p/iBhSffnNO9F+pdLqpa3d+m/w+2oL693G6HXYQekD8dYcPLucIb8I9TjsOn+gKEGcW9AEFDAD6Qg0b+GW94m//c/7vvqCTEgGt4BoCy7M2akJkDZmRBVhKv6b0M7BWVcKDt/VL5oBOXsfBPC3ruCWeXHAbkToHhSaHWprblT+ChrWFosZlNkIwD5AYV/ta4plBnQGbwFmbwGQgo0cvhpyRsgcMI9Zm1p/cN9/jAh+g9X8VeM2QVITNL9Oc0t6f61thISvFrq3nV/1r6dG5fvR/ov36Bjkv4HpPszfDo7RisC36oRBHIQnsgjw+VvFlL/CUG4LwEGmBUduiZAsyDgRIcmXhPE6w+RwAUBXan1nQCZgoDvRmYdiMrXfCdArQMSfRDtFcRJodylWncazIDSFxID5+tL2fcDZJJWLIHuNTVqBrQgfvHrraSAvAECGuM37OaF/uE+c5hQyQFSKDEUxR8wLOn+/AiWpP9aQznpXyFv79J/m9XBa6JxE6DR4cIz0sR0f4ZPjB6zFYFv1QgCJ+BHOIn+dVoU/yKk/hPicA2AEzoFAYzB1wRo9od1irCto/Kb/9ZPKpZaIa9odn5BgI2pgZo78P3HyQwgJ6AegRNEWiXnBeenAEbVhJBb077MgHYEL41AJQUGvQGleIRtDN5fY9nN6ORsECB7K6z7D0Hx57Y213nIYW6k+7dFMC7B6ydVy6tjNoAcfm3+Cq+Jbem/2mhq0j823Z/h6xJN9UMQNkF4MRkTgnJ/BVL/CSm6DYAcfcWTMciaAH0bgHVq0yYLAjpaGS4IaGvLNyHM5m3rwPff/TsBjJWfmb5D2u5Sc49KZPVFstqXSpYA4hKBJj9gUGZAC+LXTlXpQNcbaMs6ltu8fg8VgK04iGNdlFEJ/WY72aWVW+qGZiLrir+hrcGVIEn358WjIf+qGVsjGJf+VTtcHg1Eur9yKKg4+MRxbEP+B3GbQRBSwN9TkehfRkXxL/8G/d//JPWfkEPUADgBMAAfriYA0AZg2gUB3AiteZUKAljRCTA1MJ9vQujnFWrO0dxhnQCVCJxihZPw3KMTwIvZFLlJKK+3UYlsCqWkpyPl+B8BM0AmPlLad2PL4H6VRoIMeoMWOF2AemAs27AM8NZE+2xhS99XTGhhu+FX/M1tBKclvG1ptdJ8wLq/Tgfs5+0wG1qTghyZTuM/22m7bxJPp94Cj/RPU/3ohoKKg0z3Z4jvOghCAYQu3ZhQG+PPuz0g9Z9QQNoAyAEpCGAMpiYAxAZgnZp4VfZtEGwVlHEh2bfVhNARjrvb8k0InXcFC6Xu6AYDcQKkeyLQq0JAlU5pmRPCkWvBIf2AWnAjyPsBomZAY3weQ5RklWR+k97A4Bj5Gg/jfh1bL5Hr+42Y3oaK8atllhAxORjdAiZEf35E2ea4dX9GQ/7VM7ZGEIuXaeXVl/7x6P7MivSPTfdn+LpEU/0QhAnAD2MS/YvAyv0EAYLvZFr6O8wYfIiaAFgbgHVq4jVBvP7MClwQ0JVawX6QyF5N/d1IJy+T3VwCToByZ6CdAACfTF7jVg9eju/UPpIbBma05yIZu5LKmQFSeXkM4tcc2hsYFoPYRTyGsReG0csmhqjvN2Je8panVfFXD2s4FD8+vOjPDyrbfNi6v04fOlKPXPoXDmZP+uc4fGik/wHp/gyfzo7RisC3agTRCwhPz9GgqPgzlVtEGv5PqOEzBjAMH6ogQL8zUDYA69TEW0flC0XgJ+1oNcaCAFb+NeoOwncCjv9RLwtA6ATUo5p4MGlV7Z3yR2MqEWg1j+BubAQjoRWhlbyBYWHzLra4zXq+e6abdzYifd9GdP1cI1L8Wbva2KvoX4hAuj/ng5Hr/hLxNPVuTel/Uro/wydGj9mKwLdqBGET8OOWRP8ifY3xJ/WfUOZ7CiBcw/D1OgNuA7CeCgI6WgkUBMjmFc3eVRCglleiA6y2RPU4cY6fjdAJqAUu5YSi2w/4/lTOD+gKbgQx+0RkVGBTa+s+Aacf/TDiO0FjGxlCp9APMT2MbLRR6/sw2atDIyBi8jG6fbpFxr5F/0KQwev+Ot3oyD5y6V84mN6Qf+FMfLdvStI/Nt2f4esSTfVDEPogvESMA/UB/gzykZLUf0KH5ncAgAzDZ1ASvGpnHOY0jVhW7UZ7HDMFAUKt+KPyjU8N1JpaJ29DuM5FuQNqIZ0A6QicXpWfVRTfG1yh5RQxEb/VDzj+C6sfoGdTiasYKKwCPD7BEKHb3uECtu8mpu/XmaziL6EqIhD9C3FI9+d/YCA1Jt1fIp6+3q0j/ZPurxgKKg4+cRzbkH9sP8QEwQP8WCXR/4TNKX3aOf3e/V//vAMOTUyMtpcA69cEQI7EV+xMVY9mQJK0sCZeTavWDaFW/FH5ynlFs/OdAP2pgUT70NEfBuIESPeksVes2rGywQD/LFI/Y/RzdMV0yh/JlQiY6HBnIgMpBIWPnn0CcgiIQaN7rkxe368zNcXfkQ0Jo13C0DHoezK6f3cHaMh/jvaQf4Fkbd+T9K8SByTKuK0IfKtGIvug8QAAIABJREFUEOZA6L2NAyRj/Hm/caT+E/q0GQBFdGoCYAsCVDtTdQKM69EmpwZCWhDA6mv93QjWgBGNg9MJqLSpPrOWRGkLwjcD+sFqjemUP8U4ZZD4FQXe1BfNYcQqaAlA3gBhGYNPIaWj2WCeIT5IKfa5ejsDEZMDdDSxeDau9ZpxOCGnpPt39GGMQ/6ZyDFQp1fpn3R/lTggUfJQyLpEU/0QhDjgByeJ/jlI5P6czh84Uv8JEEQNgBw8U/NrdMaIHi0/NF5raiChzrem1ll9UfOjIXX+L6Q1Acpd0j2WKs3KPSy5Acb02L79gOO/MPkB4tl5jKCkgLwBgg3xqbhrNLoOw9saHFRWpFXxV4xpPhQT0Q2NXdEQiv78EMoRMOj+tQ9oyH8OhO7fmrIj/HSkf4SD0BGK49iG/I/mN50YGQhPuhGgpfgzG2P8eZD6T0AhZwAU0ZuanzFQNVO+M9+arYL+3haOt0RfBQFdqfWdAEkT4vsPp6r+KlKWyLvo6BLTKQuQ6wmPvosDamkZoymDlBC/IKEoKZC8mA/uXhLDIWGOwe0OGAwM6h/fltRaowEr/q0hTeuAwHHAVmQcun93N2xI/xJJQY6HvqT/wkFYX8OOIxMi+wB0f4ZPjB6zFYFv1QhCH/CjkUT/nGGN8edB6j8BiLoBkKNTEwBbEFDsjIITYGlYOtaCALW8etlLTXV8COnOtHXp629NJ6AS1YQZwMrFAcU2FqbHoSmDYBFcLbMlBdXo6t4ATrCtRNWZnQIqRzDwFhrfBgdeo67iCQMyPWCo3hT/1txqcRCJ/rUgSHT/2gc05D8HaMh/t+fByS68aHv2AUj/2HR/hq9LNNUPQfBAeOIPHd0B/qzPMf48SP0nYNE1AIqo1QSYKwg4hhW8vn4J4LBKdC8FAR2tDBcECGVnlZ2Cwwlo6pW+E1CNamSmoNIXFoyBvv0AJvuIWV8QuSXQiPjFFabgnhtubN5AL2DZcghEeUMMo5ddGF+LwSr+rP3hyuQlHn6kXmfgPkT/WpzedP/untCQ/xwjs/wLhIS7KZiU7s/w6ewIFUmEq0YQCsDfOZDoj2lKnxwo0f8Eqf8EOJAGQI5yTQB4QcAx7DGohA3ALE0NJFwQINuT7s5zU7OiE6AzE05HW4ROQGuvQJyAemyY4gBe9PIXjd+AnHEm5PWumE75I60SgSGaAe0IbgbVFW/xBiyAY3f1ctfdseoTfRIY9Gpb7Xz1+CHFXySjKTpEf/nVgVTuOgP3o/vXPhj5kH/heEaG/IumlmzQkn1C0j823Z/h6xLCVSMIWRA6akNnlGP8eZD6T5jA/7qafIlp0OK7fE2AiYIAdrQBGPKCgNNyTaq1giIv1PlWE0Jn9UXbDtIJ+F4Cqlcg0dpCcA772k8XTKEA/Hp1xOTsFrGLT+dSOCRneIa54jjugLU2Tb0xjpXqj7GuP0J9vw4p/sdcxsEs+teiIdb9BXoycOlfOBiCIf9iDVqyk+6vFApZl2iqH4IAP+RI9Ecl9+eYFv1PkPpPGOJYAfA1nYbDHFM2wFceifG5uWhvpCCAiToBwDJ0dxCTUwMJCfGc1Ar2Qz1QR4TmqXiK/6qP9zbZn8oS1aOl6NXAmAFMtm9SiBoD1UIBEyUCyP2AzlwtoFTM1WlZ8ZGtqV0GcEM/gC4ioFd9XyW/iQ7bU/wZzHXH5l7rlnT7Fv1rAUn3r302lSH/EtklG/CyY5f+EQ5CRyiOYxvyT3cvhE0QnkqDBkDxZ0Ma48+D1H/CHLUpgLIvG+D4V881AcWzzkRNwNCnBhpQQYBEH5q7wep7Qacncv2pL9HUsaLqDD4HjqlnnK6xyJVfvmFOGeTUPtK1BMS70cgI1PNx3KUOdEeMY+Pjh/R9C1mc9pDap6j9kwW/6C8q+w5H91frCSbpXzhYX0P+Gdio/wHo/qURR5qhgOKM2IrAt2oEwQPegJ+86D/lMf48SP0njMJ5B8BJHHO+dXJA8NQE5BEZ8qmBqlr8dwu1bkg4AZzUk3YC6stVjxyn8NkQigMqtFkd9R/FcUwZxMlp7AZAPPBAFeqhMPX77mkzOH1fsQ0EkGPc2uMNbYx/LR2M6A+vMghmEOsnHt2/qZnC8n3p/sLxaMj/KcgQhvxDXjCRdYmm+iGmBsLTebjADPBnYxjjz4PUf8I0XS8BzqcGKkwKMtaagG8nQMIG+F4cSUGAbE+6O89NzfSnBmoIJ9cTVt8Rmp2phFcxA1hzD4t6s4nR7o0dgaHVD2DVKYMG6gfUv+cltuoTiMcmn4AgKpC+rwNsT0xP5W9tu8lJt+MS/fnt5ehL9+c06Uv6Fw42/CH/DEJhMaf7f/VtpEP+EWqXCFeNIE7A/xBPW/THNqVPDjbR/wSp/4QFugyAnIL2ampqfjw1AfgLAk7LNYnnCoq8UOerBQGlVCCrj80JqGSQiGa9OICbjdMpLTqmDBrqKwTqcLIM2ydgZBUQY8T4jTyQvq/ezDyk+LemkJBrNbIAICT1ynQSTNDs/MCYD4FJ9xeON4oh/wy/9D9S3Z/h6xLCVSOIHIQ+2XChMf5SFH/g/s9/kfpP2EDMADhxVIHNTc3PtGoC2qfzkOnDMYSYEwCsPncHMTk1kH5BgGzexm50B+lwAr7v6/sck269OIAH7ygGyCgzZRDaVwiIZKnDz6vhEwjmVkUwNvkEhGkQ3Y/D6ftaLa1gqHvDVfwVhX6mvl6GRX9O+D5E/6ZQ9nR/TpO+pH8JDwnacpDLLt+G1wetAIZ0/+Jr7iCigYFtXDxN9UOMFfif4AmL/gjl/pyhiP4nSP0nrCFpAOSUhVdMNQHww8C/102oD9UO2C0IaGih0A2hTdeVGtYJEO1Mpc23wg7mDDXmGURxAA94Y0DGD8A8ZZBCXh5yPkFzA1wlBWQPjBW898s6TEPft9yxjocr7WuEidVR1PqRCYVNAXGJ/k3RrOr+mh2A1t/F4o1lyD9DLv2PdMg/RisC36oRkwXhCTJQwBR/NsUx/jxI/Sds4jv6Sl/BBjh+3HNNAGNORYm2WxDwnRZWB++lIKCjlZnUip0pft3kBFQOIhNmgERYNMUBjYBJ6mOZMkgHkWtGVyebYvRXUoD3PguI3o+ZCqPf4LpUd9gI9X3Wd9+c9i4gU/x71Prls6oFRCf6NwXsXfevfUZD/mvZ5du0dEPj2mvgd7fUH0xOHsL5cLDp/qzvnzxiuMD/tE1Y9Kcx/gpI/ZyR+k9Yxmf6EnlNcsVRE1BSjCFlaAk3oqo7mxXBzRQECLXqmhqo4W9VgJwAZsgMqOYQbyZZHCAdXw9ISX2kUwZpIngXo+ITNDezXVIwLGhL2EP9bFTZS5j3LLa+mVb8W6PrhJIe8mygD4ZiDkL0b/rMsO4v1A2T0r+a4QQieStK/6C6P8Ms/WO7UiEbF09T/RDjAOFJOkQgB/gzGuNPEBj5ngIIQAwtDwZHUxNQkq/BZOj+CgJYZZXqVLVvGC1eqFWbE8DgzRiROFxhvfKHEWFdUTcXKA6o/WHVGICU1GX8AENTBjWC89ccyCfgRCKfgMixK8oDgvzYRN491v6IhU1HE486EK2fExyd6M+JJvibIhVTraE93Z9JHYcnRjTkn2noMuCiSbUnmMqSEIrj2Ib84/99JPAA72RPVfTHOaVPzhREfxr+T9in+R0AWsPVm0Zem64JkC0IYJrrWAwq4QR89wFEBO8O0jw/T7UgQLYbQpuuayoe5ey8/gjFERXWB1Qc0PwF7xnInKitaHXU6WPKoEbgpPYeEL9j0p56COcGEAPvjWUTilt6WCv5xSA7zRgbVM+d0//xGKLiD//8aYkJiv78sMptSfpvSy3ZoLMb6mHMSv+YLlwI58PBpvuzQf1uEj2C0P0aIjTGXwFDY/xJ/Sd6oe0lwLoaaFV9ZuZqApxM5UXB1T90OsCOqyTUjaoT0G9BQHcEftLuVjJOgGwfeF0SjSNfHGDIDJCI3LKcgDfQ8nAM+9MG5gfUG1dlktLf5vwAHoP2CRhA//HernXT815pvjiiZRi9NAzmjdAt6HeCSTgrR7Oh+FveuaIyrvlB9JIBdUV/fmTltqT7d2SXb9PSDdUYGUwH2nqidzUAvnYhGxdPU/0QwwL+F22Sor+TgQrrNMYfDlL/ib5oMwCKqOvUHIkDvCbAKcaSUOF7LAj4TgviQ3QHaS4IYJWNINsN0U0n4AQo94HXq3pyLmLFAYZmCqok1C2+aQnN/4I3esrQlDvDmjJIn4n4BKZBu32UANioSPbLmEC7SQH0/ROgJ9IQFf++9vIwRX/dTrZG0WxO0n9baskGnd3AKv3TVD/toZAN+Uf7I0v0DsLDfnAAD/BnNMbfCKT+Ez0iagDkaGmUtYIAVr4Q6JsB30q0xMDK5qHo/U4NZHZKnIaNU02r0A2JY6N53L0pJ6CaZ8TFATygjQETlsAIpgwCQeTOCPUKGAbvnSMxHNAeReoSv92LwrAU/953N4n+OkxZ96/lk8gu36alD7oXJYP2g8bFAfg6hm8+HGy6P0NwNSZQAf9bNj3R3/myV+FWnMb4m4fUf6JffKc8dF4cRamaL81D1QSUOobDCZCdGsgBUlo79pGZggC5hlw34vtrWCeA1XbFsIoDICNLzybklL9E6QfUG/NNx3qzQWjrgndSg1gXggAH7aPGUPT9RkBH73ZFVV1fPLteSPSXWc1Jif78ILWPRyr9i5pGtdSSDTq7gVX6x2QKYhsXT1P9EJiBvJeYntzPGPSUPjk0xt8ipP4TveOz8rkqq79LD6yuLM2xAdQ6U45T7hUnHb/pZKYGEi4IUOiGnhNQDaB+sLUiHbbX4oBqmjLGvYGm9S18BqahW/MDKl+o3bbgrCogn4AYIngfHQQYtMRfwariz1S2AIZDhd8HADGdRH/uN/Z0f+F4kx3yz9kXmt3g9gGNO4hQHMc25B/DJZroF7Tn3VA4adY0xl8NJKL/CVL/CQxUpwDSGYavopW3jtAHqQko9WqYBQGwUwN1FAR8p21YaeVuwDkBrNFGQVEcUN2nRUfFVHEAN2UZU8ZA0ypX/ACQ7PX1gpwySCRfx+IiDbC8jaCCUNeN94IYBnjv8W2hPyQWLaT4q2bv6tcYRX+w0cpS33T1EFT6lxDfoS0H4ez9Dvm3Kf3TVD8tcZDp/qzvazXRLwg9rQEBP6VPDo3x7wOS+wmcNL8DoIeaAP4IfZCagKoATQUBfUwNJNdWaKB9tUtqveIhF1ZspqDifhQKC4EpY6Devmmtj59hnTKojnK4ttO5+jYCXm5kdy+MYXqWQ7hxkIBnHw0a5/R/sqA8NG0eFU7lv3WGo/hz8qoMx9ZIp86oRH9mWfcXjmdkyL9EdskG7X0A0P11etLWAaVLq4Fxx2BRsen+gKHoPmSCGDjXJnQcOaUrOdyK0xh/i5DKTwwO38lY+5XWak1Aly6vXxNQEqBxFARUgwr0AcyHkCgIaGih0w25bSg2687QZwoSjQxHy0Gn2BMBF6TwGcopg3QQTKzrE2A0CeyA9w6UGAhDl/jxnALjUPwta/3yCXQCAoyk7kf0F+4kqPQvsdOhLQfh7PiG/Gt2g6b6UQmFbMg/nl8lwg4ID+ahYGRKnxwa428e0vqJceCzwrnUchG2WhMgZgMo9KTeq0FPDQTyruDuVTBZEMCUD4/G9rVghnRh6bCIiwN48I5EuV6NYMogE+hOQzTgYgKCMArp++Ywofi3hoNEetR5BYjDA3ZNJawLEv07gogeAwZSS2SXbNDehz51/47sCIxDp/p8oxcNJAo+3Z/h/sEioEBrquGnolbTGH81SPQnCFhKUwDlJ1jnZdlSTYDALD36TkBVvKapgXhBhAsCdHqiEoGKA+zSeGCq7KyGcE75s+FMGWQCS8UEjHwCol+6ZWUocBzoeJ+xanQPjkap+GPQ+mXy6Qck0V+C7qO6Do4h/8Jt2ruBVfrHcTGhqX6E4oBEIRADecmdjNzPmLEpfXJojL8tSPQnxk3DOwBECgJY+dphsCZATJF3mAPyrmCGaWog2YKAnqYGat6Z+ptCRbEdc3FA1Q+Qy2IY9Y2JY8ogBXrf5l/oFhMwMZ+ATIIpYk+aBwHHMTqQjdWMkDaKYHxuV2QJYRcKFOtIor9oNFHxHaQP+tI/kP2ge16odaNbaerpuP0O2DyQSTWafohTKGRD/gf960a0YOCcmsTBUpeqaYy/GiT6E4RNml8CnCNYEMCO1xSDNQFWqgEa+qNXEMD0rt7OsT3GggDWuHEaGkGaIrKhhAbaNxT6oiwOaPi78EVH2YZlzPgBX39X/AC5+HDI3kb1eW9jr5igdxpWFcFdJTwDk+ZzxrInBrXRGeu8deoEjeLfFHZUWn9rCk5aEv0lYkocLUCae+sHnNTybdq7IRMDdMj/cKR/XPo4Nt2fDfBXj+gEoVOFH4NT+uTQGH+7kOhPTJM2AyBHsCCAla81RmoChKsBFDrA649OQcDpb5CCACbqBHz3AdAJEC4IqPah/pFmf6qpdIsDGoKp69etSIftmDCn+wskxkC9cyoWTkMsp/xZn35AJyI3Yj33HMAn6J2GzqHuLxJwnjP9gfyYkdNeFUCq+Kvop3DZjYNc9Je2kXoV/WthRQ8eM9tK+tAFsh907TGpbsgZLf0dHmXtCSA8Nt0fMBTyn0JCHAPn0fiPjkadmsb4q4FH9Gek+xOTp9sAOCFeEMD0VHghxVnYjYAvCBDIXlHAIUfB9zQ1UPcqNA9db24HO9xeJdoQiwPal+NZAM2f9jybkLrF0tOUQXYQvHEbhk8wJnq8o57g1jYP2ickRd1QCqAjytYY/9Y8g9X6W/OS6K+Fiu7Peh3yz8Cl/96G/Au1RiH9I9L9GaBeT7o/UQDhIYocs1P65NAY//4g3Z8gciQMgBzxggBWvjYB1wRkor9sxz5ozWFdlbH1pgayWxDwnRawIKAjSINTwpV8YYfbT6U4oA6vjYwxwPjegNGfcjN+wNffFT9ALj5KBlBMMDJoaw4NtE9F8BK/xYPTxFYV3SDD1/pbOwCw1mDDkGW/Ga7ony8NcWhhGPLPpPQgiCH/5SYwo/4Nj/cHyIBQVKWpfghm5NwZ+eHAu/jTGH81cIr+OST9E0QRaQPghFRBADtesyBrAiTG4zN2nMMaw9RAIygIYIJrIaStU3FAFUibQc4Y4H5hs2gAzA+oxqqXCHS2l18CB8MoJiCIcSkOMPo+mtNy6Io/kkOL043xi/62FH+lVDTkvxRBLa9w6/6lf0RD/mmqHwIKhHYUZoxP6ZNDY/wxQdI/QdRRNwBypAoCWPlaplwT0OwESHaA3hUM6UMIxumYJqi6kLniAMUpd/ooDqhHhkkBNJsQ79Q3uvpwJQKdqeSX6Ht6JSnIJyBawPvk0R8gyiNC+tdqNTYLngO1qydN3/cxt09rHK1O9n8gtTOiWf4Z/iH//LzK2dtp0qS0ksD2ENuQfzxXTkIEGuMvRYtCTWP81RiK6H+C1H+CaETXADghWxDANGoCmhVnuYIArYqE5p6oFgSc/rY7NVC1IACmA+KhZAbaq8RvRVGsR1AcwMtaRDcdxGxCDufsBAGyREAqk14bQd0L4f0V3rvRLhBuTBCGu0eQ07RhBynx93uEOC1/FZHfUHiOfIGegK04if5aqYBE/6b0NORfLq9mB9oC0lQ/UqGgAhGGQXgcosXGlD45NMYfPST9E0QLYAZAjmxBAIOoCUBaECDUh5L2DinE9zc1UCUoE4kpM9BeJX4XusUBXDOAmS4OaKRlt1ucTaiyUVD6AZ2YOBm6vhZRYoZ8V2YVvHfWRE9ASYqWQX4km1D88ayyltZ/gkR/xcg9i/6cTqAf8s+a96bxIf+gqdvh6FPqeXCO9wcMheeiSjRCY/zFaZenaYy/GoMW/U+Q+k8Q7QAbACcUCgKY6qj8NhuAif6c0ruCT2mhfIh6aNGwgysOaJtnpp/iAB5GigaEjIHe/ADw+NKIpxcuHhhuMQFBmAZAQLR15uB9CuxCdCMPTfHv6gPA2Gft6DpxBiH6q+aBFv1zFPs2wSH/eWqnoQNWpH+tJDilf9L9pwCN8RfE0pQ+OTTGf7CQ+k8QnZgyAHIUCgKYak0AV7aWcwJG+65gJroXjBQENCZgIvGnVBzQ4w+xJWOAs/uc2tKmLQETWQAQ6VDbWaxSTCCYliA0AXoGAgpj5aDH+9gnjwnFnx/FODCD+hnAgUSiv1YeM6I/oyH/sk2z2j/gVXXuN4oBVXvCDYhM92fj+g0aB2iPOmx0atM0xl+NUYr+OST9E4QgZg2AE2oFAUypJqDDCZArCOh3aqDqgHFdLVuvIEC/Ay1pROOPujgA1roAoeVIUeme6NYwWyLQnFIV27tJMJ9wMQFnWSommBYqP86YoSH82oxG8cej9Uvm0wlCor8KTWFpyL9cahO7hqb6kY4DEoUAgsb4i2BvSp8cGuM/Lkj9JwhxfCdzMluXB7WCAKYqxzcPYFeaGgiyIOD0H8mCAMZbI4XOSDgBJZHaphnQnWJKxQG8GD0C0D1kfoAamvd9ptYF2iewe3uLaA/33pWxSfMVet++XQxqa0qgLosjVvwRav0yWTXjkOivAidsP7o/61n610pta7y/YirMI69J9x8TmI80PIgoTzTGX43piP4nSP0nCCl8h5V0XTtmgF5BQGlaHYEmXwy/IICZmBpIuCCgupwFTZaKAxqXBh6VD426MYBmyiCbiJx8BtdOd9IhQyC6sUbUFWsM93SSZzT7V3pYhRQyh4SdTdqVZdhCv3BMjKJ/LSw60Z9pDvbPoSH/GnlboKl+VEJBBSKUoDH+nVid0ieHxvhPA1L/CUIWn5UF5fyHx6oN8PWHRLvcO5DtImBBAJv0u4IrnckZVXGAfv9BiwO4H9VbYi4aMOqRYC4R0EfwvOy5mGCg4L2rb2Lc+8IMw9rDJ8wK+p2gUfxHP6hfMrhuWQZq0T9TbikEgOjPaMi/bt5Guh46pVOhFf1how30123oID+6MCAoI9EYfzVI9HePp8z/8e/bfntCEEOk9A6Ak6DsWKwJKAnqMkPRT6OApfrXURAg2ocxvyu4Gle4deGPYRcHqEjVfACEb16s1k+RGwPkB4DTs08wUGhzDAS8j2LCCK+CgXUFPc5ticiqmQel9Qtk0RL9LerpkxD9ldo3doKG/DPWoWSppMIszpLuP1xojH87tqf0yaEx/pPBbTprSP0nCDUaXgJcEZTt1AQ0jKsXHhHvyNsArLaa30x+aiCmawZUGgyxOMDUTEG60WwZAy2pDGHYDxANKbHcYBE5m0e/EQgF8D4eoaF1E+Ed6SaCib0PsLmGqfULpGv6pu9h/k2RFUV/6/UTKET/Y6ipD/kXeKDUGIIEAc7x/ox+hW2B/IjqHXFNiMb4q0Gif6Pif4Kkf4LQocEAOFFUpe3UBDTo4BI2AFMoCKgmPaE0NVBP7wpmlZVoXiOdXhXNANEulQIU/hhEcQBXju6/OKCRlpYNO0tI9u+3aKCeXW5XNkQRPWqPy2mt6NDv3PDeFDPGhr95wUG+v0aDKX0f5QFtUfEXSDVwoV8sNYn+6pgQ/ZVCcJHT3zn7XaE/qIb8T2q8P2A0+om3AI3xb6GHKX1yaIz/NGiX+yuQ+k8QmrQZADn1ceWmawJUh8OzohNABQGABQHVBMMsDpBWkHstDgAJ2BYFumjA9N0LdImAbEI5NF2Eyd8KdoD3Lp4YOMASP6YzuZezRkXxn4TW37oIOtFfNc/kRf9jQBry3/G9XDSNnjQHhJZrSffHD/6jqEekBB4a46/GxEV/KcW/CKn/BKFPtwFwojKu3HRNQHUYeyb1c+1gKAhgek4AbEEAM6BFDKs4QFpB7rU4oB4QMHJbFGhjoCWVDgB+AEhi0KXLzeTmsiIIopOuE1LyhO31JAR/rk3TNEvTjLEsS/NPsizLb72+n6Id5rqu47iO4ziO+K8Fp7Nj0fpl8upuChL9hT7rxNgMP+WYEx3yX4rQvGo03r81FFQgogCN8efRz5Q+OTTGfxooK/5FSP0nCBAkDICcRjXZXE1A81h4Jvgz/l0QwCR/YjoKAkQ7wOCnBlItCKi0MCWvT6E4oGJbcMKY679ZqX2YswnVU5i617LnInQsJFhkMPl7TmJaDHcIfy9PrmmapGmWZWmapGmaMpYlScIYS5LYYU7GWJomLMuY4zjMcV3X8/0v9d91PM9zmON6nttgBhhX/Aes9Z8g0V8ATmSkoj9TEKHGNeQfXPpHLvqzr7FQNOQfHfiPnL6QVWtojL8aUxb9QeR+Vt6//+vfNyAxCYKQNgBO1EfKm6sJaJDjZWbmOToB6gUBDQ0HOTXQdzMb8vpYiwOEZgoqLQdeHMBj0EUDRm0SXLdhCr3hnj7kExDo6O+BDNEQfrxPpYylOUmSJHGSJEkcx3Gc/ztN4jiK0yxljGVpmmWZ47iMMdd1HddxHdcPAs91/SDw/MD3fdfzPM9z3a//b0imt5F73IyQWj+T3g4k+ot+3A5O0Z+Nesg/UxwE1BFTG5rqZ/TQGP9GepvSJ4fG+E8AKMWfcfYyqf8EAYi6AZDD08cN1QRUXQe58fjqBQENqVU6YKAg4PQfGS+kQPUm3eBYeyoOUIsPAXpjoOGgsFY2IUL/93WCPdDyCcgkGDMmH5vwPpJNVuLnkSRxmqRfkn8U7fe76LA/HA7R4RAd9lEUxVEUx3GaJrn6n2UsyzLXddxc4/d8zw/CMAjCWRjOwtksCGdBGAZ+4AW+7wWe77mOx5sdqJ3Jav1K3dAJS6I/AOpSFPCQf5nWNqR/rZADEP3z/5D0jwD8R0svKEgvNMZfjSmL/ibG+PMg9Z8gYNE1AE406uOGagIacqkUBDA2incFM+mpgRpjMDtmAKsXB2iZAVQcoEXLtrc7m1CHL9UZLycf1cpYluVndvZ1ip3UqONQViefxaIrHr+/StjYuVo+AUwxASEC1zeEBO9TUwdoDrH7ZLoFAAAgAElEQVTBbsEGkuRL+I8O+/1+d9jvdtvtdrPZ7ba77Wa/3R0Ou+hwiA6HOI7TJMmy0xWVOY7jeZ7reb7vB0EQhGE4m83ni9liMZvPF/Oz+WIxm89ns0U4mx3LAvyWa2xfG1Yyr0GtXyYHSFh1JZ1E/0JYSNH/GFOhG5JNhzDkH7+Ym49rAwtFKEFj/Ov0OaVPDo3xHzuAA/yZ5F4m9Z8gwAEzAHK4+riBmoCGXNIi+BjeFcwqm4KrQYuHYRZGZH+nLMSl4gDu8Hjr9FA0wPVLWMsBmSRJlmVpkuRjVdMkTdPk688sYw5zXZcxlmXMc13GmOt5juN8vcfSdVzHzT8BWa12EFUhiMRCp92NCtQbcTIPOaj3gjantUvTNInjKIqi6LDbbnabzWa9Wq9X68/P1epzu1nvt7v9bnfY76MoSuI4SdI0TbO0/Nv0VQTgup6XewCz+XyxWM6Xi+XZ+dn5xfLs/OzsfHF2NpsvZrO57wd+4Lvu19XV/qYGHtTPYM4Lo9uBRH8TIBH9yw1RSf/qIYch+udARB73L44J8B8h9lHTUWiMvxqTFf1NT+kjCKn/BGECYAPgRLM+bqYmgFsQwATvHb4LAqpxxFI3tOpjaqBKttIEQTKd4UWi4oC2ZAaKA3hLSCQ1gEFjoM27qm6lfP7q/M2VcRSlaRpFh3wy6yRJsixNv+avyLIscx03Y5nruJ7v5UNTj3NZeJ7n5+NVXdc9aVU4EewZ2CExhbtevHubwxR2CiiD28MtKKxLxlgSR3EUHQ777Xqz2azXq8/P97fV58fn+/vq83OzWu13+8PhEB+iNM3y8f45aZJWorme+/UP13Vdx/P9cBbM5vPFcrk4O7u4vLq4vLy4uj47vzg7O18sz2bzReAHfhDkLqw5gLV+oLPMzrEHJfrbdSY4n3ViQM5uBJXoX2grEwPaHYEd8o9f2D2Oz6Ih/7ahMf4Vep7SJ4fG+I+dHsf48yD1nyAMYcoAyGkpCGDQNQHNuVSmBlIvCGho2MfUQJUuffcKwAxgVBwglKxzaaHiAF4D1aVNAu9SNPkBGcuS+DSHdT6k9ZDPaBFFh+hwSOIkdwLSJE7T7GsKIJZP+eN4nu8Hged5YT5vdRCGs1k4m/lBGARBbgzkZoBalzEgcpZM+Ba3DG0ITOB9KDQAxMp2xEiSOInjw2G/227Xq8/Vx/v72+vH+9v768vn+8f6c7Xf7aNDlIv+dbm/zmmZr3/so/1uv/7ceP57OAuXZ8vzy8vLq+urHz8ur64vr67PLy4Xy7MwnedXVxB7dcpaPyedulRNon85LLzoz7R7O44h/6Z2mbnx/oyG/FsCvxVkGWVRhMb4qzFN0d9hDuCKmzCc/td/kfpPEKYwawCc4BUEMAM1AQ1avK2CAMZb054KAiq9KnVHfQrqsRUHmDYDulM0VMp0huyIjccYYECdydIsTZM4juPD4XDYHw6H/X672233u+12s9lvt/v97utVltEhieMkjvPXVzqO4ziMOV8vsfSDIAiCIJyFs9l8sZzN54vl2ddk1rN5OJvlDoHvB5irATSxXUxADIHRHu5WsCDoS5FEcRRHh91utfr4/Hh/fX56e31+e37+eHtffX7ut7s4TkRE/3bSJE2TNI7i6BBt19vPj8+Pt7f315fL6x8/fv66+vHz+sfPs4vLeT4pUBi4joS3Slo/Py+J/jA4yrFNiv6FCOpD/vW7oT/k39zBRlP9DBoa41+k/yl9cjDLwXBMU+5n0AP8mWHDidR/gjCKLzlGXosWG+BrAQM1AdoFAYyBvytYrA+wBQHlyOUeGTMDmDl5Ha44wPRMQaxxM7XDW0jCGGiOAj9OXwNBYyCf4j9JkuiwPxz22+1ms17ttpv1arVefW7X6/w9lvvdLjocoihO4ihNsyRJKmFd13Ucxw983/eDMAzCcL6YzxfLs/OvCayX5+fL5XK+PJuFszSc+UHg+X77kTXuO0m8t/DmQbVnp7wj8CC5F3p7OM+yLI6j6HDYbtafH+9vL88vz48vj4+vL8+f7x9Q0n+F9Gs+tvSwO6w+Vh9v7x/vbz8/3jbrzx+//ry8uj47v1xkyyAMXNertAUW+hnM2YvhpMMv+nMioxb9mZnB/qAD7fvU/Rsi4JD+zY73ZwDSP4aLBkJojH8RHYWDxvirMUHRP98dyMf48yD1nyBMc6wAUJeApRG0AfJ/sa6FBdOVgkiOx2fa7wpuaKg0NRCzbAYwqYOhWfkfWnGA1ZmCpFO0nTZCH7VEwVM0UOxJPql/dDjsd9vddrNZrz8/3lafnx/vb5v1ar1abdfr/W532EdJHFfmsGaFOStOs1ez4wTWjusGYRDOZsuz5fL8/Oz8/Pzy8uLy6uLyKvcDZvN5GM4833c9j7dxQC6W07s1HQB4H2UIYwjvdO2jw9g5n2VpdDjs97v1avX5/vr89Pj8cP/0+PD2/LJZrU1I/0WKBQGbzWb18bH6/Nys14d//it/NcsyWwZh6HkitafjH9TfCIn+hsAp+heCyAebzJB/mupncNAY/xMopvTJwSwHwzFBuZ8xBjulzykmWCyxvpH0TxB2aHoMs1IT0GkDMMZY5uQXcq6MrplxaFMDMctmACv3eBLFAU75D6vFAVopAIoG5IyBlpwgZIzFURTHUS79f358fH68vb++vr29fL6/rz8/d9vtbrtP4iRN005Vq7jA6d/RIdqsNqv3j3A+WywXy/Pzy6ury+vr6x+/Lq6uzy8v89mBgjAEmhFIegsrRiQIogb8SPMTOM7DNE2jw2G32+QD/58fHx7vb58fHt9f3/a7vVHpv0IcxXk1wG6z3e92cRQlcczS1GX5lGyO6xXrACaq9efUujQt0d/oHhmh6M+mMuTf+Hh/piv9I7yY9AX+vW8NTRGWxvirMTXR/7QvBjrGvxFS/wnCGr7DnGYd2UpNQLcNkDnFxxoh20AgYzWIytRAvRUEFKIN0Qz4DkTFAe35ivRqDHCjmCsaSNM0jqL9frfdblaf7/m80m+vL28vz5/vH5vN5rA7iOj+HVmSlDF2SNI4Tnab3epj9fH6dn758vHz7frnr5+//ri4+nFxebVYLsNw7gc+d+CqzKVDm9LWFYw4sXtjYiqonlGD1PeL1FcgSZI4inbb9cf72/Pj/ePd7cP93fPD4/pzZXrgfyN5NcDqc513LI6iJEmSJL1Ofy7PL0LH5b5rfUJaf+vHnWQ6jbsh0b8QEwBY0V8jFj8CAt2fWZD+aaofCGiMfw6WKX1yMMvBcExN7mfH3TGCMf48SP0nCJv4TERHNlwT0CXrO98KtFPqSK9TA5ksCBDtQ3Hxym085K9Eg36vPlNQZel+igOaswoEKPxhvDiAm7uMYmrEswklSRJFh912s/r8+Hh7fX15fn1+fHl+/nh9W6/W0SGKo1gskiinmSv2u/1mvVl9fH68v68+P37++mP368+r65/nF5fzxYIFzPP5VVOawLsI390in4AABO9z4TcDk/g1N2mapnEcbTar99eXp4e7u5u/H+5uXx6fN+uNfem/1LEk3W52j3cPURTHSZKmKXOY47oOY+FsDvLwifNoBNb6T5DoX6P8WCAJZtGfNXcPtGPFRH1K/zbG+zMt6R/ndcYaNMY/R1+BxSO51iHRHwnFHTGmMf48SP0nCMtUxSznSybtoSZAYHT/cdg9XEFAcxBVJwCsIIDpbm0qDhDKOqjiAJF+FBnobEJJEkeHw2az/nh7fXl+fHq4f358eHt5+fz4POwO4NJ/hTRJ99t9dIh2291mtVp/rjbr9W63Pex3F1fXy7OzcLbwfR9iOqAaIBeyro/aE5NPMFBQPrRh6pTdQ9bymqdZejjsN6vPj/e3+9u/b//+fX9z8/byannaH273kvRwiF4en9I0zdKUZczJHJYxhzl+GLoOpw6gCUyH1DemtP4TJuf2Yc0dhRmlblL014jd8ZihC1rRvyFU37o/syP901Q/StAYf6Ytv6KVXBnJ/ZgwMaVPJTIA8H1jjLH/ndR/grBO84wWPdYECNsAzHhBAJNdTYB3BTf0of63RnGAUTOAmS8OsDRTENN6JrJcHMDDnjHQkEy6YiFvEMdRdDis16uPt9fHh7uH25v7u9u3l9fteqs/4Y84aZLud0cbYL3abja7zSY67NP0z7OMsdncD0BeCQCKyH5t7rIpn4BAwPD3FZrnQJybMk3Tw2G/3azf317v725u/vqfu79/vz2/9jLtD480SQ9J+vb8kqVplmWO4ziu4zjO0nEDzrUU59Y2rvWfING/Bon+OmAZ8n9cU1jxkRtLVXfGef0xCn5rxwIg8ituyRXvTpmO6F/ZC1MY4884VxhS/wmiFzhTWhfopSbAEbrmjHBqoHoe2OIAo2YAM18c0OGUQDCm4oBGpLV5ESCKBvKporfbzfvr89PD/c3v/3m4vXt5ej4cor4msF5/rg/7w3632++20WGfpGmaxNnF1Txb+GEgNXb1RJ/HgGBuLZ+AGAUYLlXWGdwhnmVZHEW77eb99eXh/vbmr/+5/f3X+8vbYR/13bUGDvvo/fWNMea6nud5nue7ruuwszAM++5aAza1fjNxq5DoX46siwnRXyMcFyxD/jN2HCYFSXNAmupHDBrjj2tKnxzMcjAc05H7WXlHTHCMPw9S/wmiL7oNgBz7NQFiHsBxWZtTAwkXBByXlZ4aqN6NYv4SAzEDGBUHfP2BojiAh72igVqmJE6i6LBerV5fnh7ubm///uvu5ubt+aXfcaz5jECv8ethv9/v93EcJ3GUpmmWZQtn6fsB9z2WfECukWaPHGzHpR3wPigdmeZ+gQP/HhYnX5coOux324/Xl8f729u//r/b33+9Pr2anidNh9wD8DzPc938+ul5nuOwIOjTAwBTxnnYkvjrkOhfjqyL0/hPcWyJ/g0x+xzyf3oagqEtlJIMPaafhhZojD+U9opbcsW7UyYi+td3wZTH+PMg9Z8gekTUAChirSZAxgNgWAsCGCtMDQTVmeY4QGaApmPBT1FIUPpP7Wu5YGwcxQHfn8qGNI9pYyAfx7pZr95eXu7vbm5//3V38zeecaxxFH++r5I4TeI4SeIkSdI0zbJ0uTwPwrCXuYBkUyI8qNBB22hQ4H3GVUJhdeIo2u+2728vjw93t7//uvn9G7n6n3PYRy9Pz67rBmHoeZ7v+e6157qu56ncjsoyYq0/B7JwgUT/apChif4M4D5VHZvSP031w2HiY/zRTemTg1kOhmMicj+r7QUa498Jqf8E0S/qT1x2agKURPyjE3C8BpstCGCC6+iUl1WfIKieE9YMYOUqXSoOaMsKVxxQ/rRjlyKhZXXFe5tl2WG/W69Xry/PD/c3d79/3/7+/fbyhkrJSpN0s94kt/dJksRRnKYpY8xxXOawIOjHA5BCsH8IjzECD9iPckyY2VbfUZMkORwOnx8fz48Pt3///vuvv96eAdR/x3GyLHNdL8uyLMsMXRJyD8APfN/3fT/wPM91rx3HVSio4gGpg/PoW+s/YU70N7p2JPqDACX6K7bhZ4da2Y448qo0hnPWEBMf4490nDVmORiaKYj+jdsf6bGX09MYfx6k/hNE78AMubJQE6Ai4mfHRkYLAk5/yIu/JsyAhlB6u8D0TEGMigP48WofDcMYYDJFA3EU7Xbb99eXh7ubm9//c/P7L2zqf07+ZuDHu4d8CqD8VZaMMefM9YMA7/24DHbWAucROyzGcbwNBWNbWzFwlmXRYb/6/Hx5frq7+X339+/Xp2e1einX9Twv8LzQcVzXcV3Pz7LUdT2HOWmWZmmaZWmaJlG8y7I0ScBKsg6H6PH+0Q+CIAj9IPB833XdMJwphJqU1n+CRP9aZAAmKPpzAypgU/qnqX6OTHmMP8YpfXIwy8FwTEHuZ027gMb4K0PqP0FgwAcZHZ9joSZAqyAA3dRApWBQZkAlf5sZwKS7WvmJouKAtqxaxQFtgZs+GqoxEEXRfrf9/Hh/ery/u/kb4dj/ImmSRofo5eGJpRljmes4nuP6nuc5jusLmak4d4pl8D7NEFMF6Ji09AgXHaLNevX68nR/8/vm919P94+y6r/r+kEwD/y574e+P/O8wPMC1/U8z3eYwxyXZVma5ep/HEX7NI3j5JDEhzg+JGkcx7s0TXTWL/dTn+4fwnAWzudhGPp+4DquHwQtrUjrl/uyheGL/tAqM8yW1IvVBrjor9u41g1QD6YlndaYoKEz5TH+sKorbskV704ZvejP2/g0xl8fUv8JAglfohWgDXAMaLYmQKnDdt8VXPxaMl7RDKgGVwh3BHqmICoOkMlaDg3qCjQH4hkD3E+tE8fx4bD7/Hh7fri7/fuvu79/v7/iVf9z0iQ9HKKnh0fGmOM4vu+7nuc4znyx9DyvsznIDkey+whiKOjdaGgDesYmSbLfbT/f3x/vbm5///V0/3A4iKr/juME/iIIF4E/C8PlLDwLwtwGmHl+4Lm+63qOk8/Dk2VZlqZJmiZxvE+SOIp3UbSLot0h2sbR/vSn8uqlSbr6XD/c3s1ms9lsFoYzPwhc33Mdl01V62eG5P4cW6J/eaSNPCT6t8REIvrnkPRvhcmO8Z+M5Ip3p4xe7mec7U9j/MEh9Z8g8FAatQo+Mtp0TQDCgoBqHG0z4PifIZkBjIoDBHPzcwA5BJyBDAiMgTRN4zhar1Yvz0+3N7/v/v79ojqLhRhOTpqmjuNkWaocKE3SQ5I+PTw6ruP7geeHnue7nh+GMxEPoIb0Vtc5KCZwM0+MASsPJJDynx3SNNnvtuvV5+Pj3e3N74e7++1mlyZCV7MgWMzC5Wx2Pp9fzGfns9lZGJ4FwTwIZr4Xup7vup7ruMxxTgM4sjRN0yRJ4ySJ4ngfx4dDtI0O2/1hs9+vd/vVfr86HNZRtFNcnST9eP+4v72dLxbLxVkYzgLfd8OZroJcB5nWL9ATiM7WDlSTor8RxZ+R6M8AbgeB+3nsjyXdn0lI/3jOcWUmO8Z/YpIr3p0ybtG/ZctPxnCyDUn/BIENnzGn8brST01AL04A6LuCWW0lGuYIalxOLGqxOACtGcCoOEAbnkPQizHQ1BEtMsbiKNpu1u9vLw93N3c3f788v8Sx1pwSFVzX87zQ9/O5rT3X9ZjjpEnsuC5jLE2TNI2zNI2TfZokaZbKrmIcJ88PT77vB0EY5O+xPHfc2bz0QmCh3WS1KkAk2ahv/gkueJ9H1ZFZJzTHPa/Tp8vm68vTw+3f9zc369VaRP33vGA+u1gsrubzi+XiarG4nM3OZ7OzwJ95fuh5get4rut+jf0/XsKy/H9ZmpcCfNsA0X5/2O4Pq93uc7N522ze9vvVbv+pNilQHMVvL6/zxe1yeT5fLMPZ3PV839N4PRUCrV8yO7zVYSx6JfIURX+NcG2AD/Y3st+BhvxLNJ+G9E9j/AFCoZZc8e6Uccv9jL/xJ2Y49Qap/wSBkPwpiyt9264JyHSvUioivoF3Bde71BATdKYgS2YAU9lBVBwASC/GAIMuGkiiaL/ffby/3t/d3P791+P9w363FxzH2oLjuL4f+v7cc30/mHmu7/sz3w9d13MdL5f+GWNZmqZZkiRRkkRxfIjjQ5wcomibfyKY6zQXUBCGs/nCDwLfD1zPC4LweyGgiybUQjWa+4f3SQUZNoqERgKOtenjwg245kkU7Xfbj/e33DQVmTDNcdz57Hw2vzhb/jxbXi+X17n6HwYL3w9cN/jW/Ws9Let8+YvPvwoClvHhEO12u8/57GI2O1+vX1zP3+9WUaxSCnA4RI/39/PF4vzicrFYBn7gLpbu8XLdxjC0fmMdtChPF4KT6A8GuOiv27iFjIEM+YeV/nH8rkhDY/zBAqKWXPHulBGL/u2bfTKGExZI/ScInBSHWXUonJZqArQ9AKZZEGDMCWAtmxilGdAciooD+i4OaMSwMcANoWAMJElyiA6r1cfz08P9ze/7u7vNeqOp/vteGISLIFiEwTwMl54XhuHC92eBP3M93yvpXOwkYyVxFMf7KN4fDpvDYXs4rA/RVnxi6zRJt5vdw+1dGM7CMJzN5p7nO47ri70QWBSDLoLgYYHhAMcInptsDug7KAimA7CvbZpm6SE6rD4/np/u725+Pz8+d5ZMua6/mF8ul9cX53+en/9aLq8X88swXPp+mF+pZNYmn0HNdV3fZ2EazINwEYb5nEJn+cV27b1stm+Hw1p61ZJ0u9k93t+fn18sl2fhfO4HQRCGpQfsrP+jubUD5ntnawqapiwk+oMxNNGf2R7yz8Yp/dMYf4BQqCVXvDtlxHI/a93yEzOc0EHqP0GghSdU9VMT8BW2LMTrBc8DSTbKStlNOAGsZUuCmgHV4ArhjoygOKB5i4AWBzRm6BGExkAcR5v16uX58e7m7/vb29XHSkf99/3ZfHYezs5m4dlsdhaGyzBchsEiCGa+P/O8wpstHcf5ssiyNEvSNEmTOE4OUbSPou3hsN3tV7vd5273eTisd/tVHO87s+fvsby/vZ3N57PZPAxD3/M81y0OX0VxMIh3omF/IryxJMyD4sC1wSCO7ySOd9v129vL4/3dg4Bp6vuz5fLHxdmvi8t/nJ/9Oltez+YXQTD3XP9khariuI7n+q7n+r4fBuE8DBZBMA+Due+Hq/Xzfv+ZZXJHT5qk76/v97c3F5dXy+X5PJj7rufqTASkB0Kt30riYi4S/cEYkujPwOb5yQGU/gdxoc6hMf5gAVFLrnh3ylhF/85tPhnDCTuk/hMEZvz8Wsm5tbBdE1DO6mSn4ex6lzrdgoBjCHDzo5CME1nbDDj+B9gMaA6FvjigeRXAigNYu66O6n6sL2Mgjg6H/f7j7eXp4e7+9ubt5bVzFgtuAsedzy/zWa2Xi+vZ/Hw+OwvDZRDMfS/0/NBzvVz6L85tnRsA7KsO4DgXUHw4RLvDYbPbfW63H9vdx3b7sdt97PafnZMCfUlXs5vFYjmfLzzP9zw/nM06NoQk9g4eVIdpX+C5uabdAQGe/alGkiSHw371+fH8+HB/d/Px9t6u/s9m52fLnxcXf15e/Hlx8edycRWGZ74fOI7CW8p5OK7rh67nuYHvhX4wC4N57rmuVv5m+yb7ovU0SV+enu/Of19dXi+XZ2EYuq7nwLxntI0+tX4rQrk4yEV/p/GfUpDozwNU9FeJM3zpn8b4A4RCLbni3SljlftZ12afmOE0GEj9JwjkfA2wKl5DW80AGzUB5cjO0QUAKwhgsk5AqUF1giDJaIL5miJDjFsvFgdodnv8xQEqx1ub8t8SD8/Nm1FjIM3SKDqsPt6fnx7vb24e7x8OB9E59ysEwWIWnp2d/zpb/jhb/jhbXs9mZ0Gw8PN3Wn7p/k69x8VnXM/7dgJmaRTHh+Xiardcbbcfm+3bev0a7pa73edu99E+oDWO4pen59liPl8sZ/NFOJu5rusHgdqqNTIwF2Ho0Jayy4AebHohjqPNev3y/PRwd/P88Ng++c98fnl+9vPy4p9XV/+6OP9jsbgKw4XreoZ0zvx663mB74e+P/P8wPN81/U2m9cklTB30zTdbnZPjw9XP/6+uLxanp37fuCBTqdmW+sXu4z0e/AbEv0N6Mgk+kMDLfrnSA755zZC/qNAY/zBAqKWXPHulFGK/iIbfDKG01Ah9Z8g8NPwcIWtJqBcEMD6mxro2LTVDFANy0vGjww6UxCgGdAcbYjFAdoeRlfLrHOJtjZ24RkDTMYbiA6H7Wb9+vr8cH97d3ujPPX/bHa+mF+en/06v/jj/OzX8kv9n+ez/chsTocx5jie53me5wf+LAwWs9nZfH6xWFzOZxfrzctq9ey6/r5rRqDDIXp+eFwuz87OzxeLRRCEXhBgu4HDf5gRNsF2fBIV8h2UJMl+t/38eHt6yCf/2bZcNhfzq/PzP66v/n15+c/Liz8Xiwvfn2vP+dPVT8cNgrnrep7ru67ve3mpgbPZvMh6AO9v7/e3t9fXPy8urgI/mLtibwOud0n5Sym6LpTYTjEAvYNE/86Y0xP9c0Yv/dMYf4BQqCVXvDtllHI/E9jmEzOcBg+p/wQxCLijqxDWBJSdgL4KAsoBamYAM7b6bZExmQGscwsAFwdITjYsmqKQoPQfzkK6SVooJe42E6wjWDQQJ/F+v/v8eH98uLu/7Z7FgpdtsbhcLn9cnP9xcfHnxdkfi8VlOFv6Xqg9xNVxHM/3Pc8L/GBeeL/lMgjmq9XTdvdxOGx4jfOXATzc3Z1fXJxfXM6XZ74fBKBFADYZwW0oZuCvJcQQkNzLDmMsYyyKos16/fz48HB/9/b61jJn2nx+eXHxj6urf/64/q+L8z/n8wvfD20dXI7nhfO567pe/obhfPKe9eY5TTteVlwkjpLnp6eH+9sfP/+YLxZBELjhrL1Jv1o/5jMXRumwMk9R0+2zJP2K/kxX97cg+pvIohKwvKHQnkE0xh8sIGrJFe9OGZ/oL7i1J2M4jQ1S/wliKAiVV6OsCYAvCDiGU40xRjOgGlwe88UBTnlTGC8OOCbibBr4n/TOiG3PnWiMgSzZH3ar9cvT48PtzdPD42EvPfmP47jLxfXZ2a/Ly39cXvzj/OznfHEZBgvP8wG3u+O4vhd6rud7syCYh+EiDOZBMPc+HjbO627/yWuYJun769v97c3l1Y/z88vZbOZ6rucCTrpNjITx3fdPEBXnWp4kifPh/8+P908PD/sdtw5pPru4OP/z+vrfR/X/3PMCy8ea6/qz2dnXa1ccx3Fc5rD16jnNRD2ANE03683D/d2vP/68uLiazRaeH+RFAF1rMnGtn1nYAoVcAAxL9G8Oi1r0Z4YG+ysGrA35R3hC0Rh/gFCoJVe8O2V8cj8T2+ATM5xGC6n/BDEgJOZXxVYTUC0IYDBXVngzgDU8nA3FDCi0o+KASqIG2raRwZ/9NvEfiTGQxMl+v3t/f316vH98uN+suEPpeXiuv1z+OD//42lrTbwAACAASURBVOryX5eX/zg/+5mPbwV9reU3juMFget5vueHvj/z/Znn+q7rOq67237wfKY4Tl6enh/ubi6vrhfLM8/zvRkZAAQxABSG55smY1kcRev15/PT48PD/erjk1c1FYZnFxd//vjxn58//vvi/I/5/MJ1IWfPF8dxvDBcfr28N2NpEqdpstm8tL9GpUgcxa/PLw93tz9+/Do/Pw/D0KsWAZh9vMf/iG5fYiPRv9wBrWymDjCTor9WzNoWQ3KK0Rh/sICoJVe8O2Vkor/4pp6M4TQVSP0niGGh+IhooibAUb3qOqceAU0NVI78hboZUGo80HcIMyoOEMrX9GHHxpqGMXCI9uv16uX54f7277eX1zSVm/zHcdzF4ur8/I8f1/+5uvrX2dmP+czC+FbHdf1ZeOa5vu8Fnhe4XuC6PsvYbt/8WuDTREDXP35dXF7NZ3Pf931P5TI7rucCgugNsWsExie19Gv2//enh7vnB+4r0wN/fnH+x/X1f/388Z/Li3/MZmd9qf85juMGweL87CfLsjRLkjTJ0mSzfRe/qm03u8eH+z/+/Mf19R/z+VkQzBxHewcNVetn8N0U2w8k+pc7gFL0Z5im9a+AUvenMf4AoVBLrnh3ysjkfia8tSdmOE0Lkv4JYohoPSVC1QSAUC4IYLBOACt3WOP3ouMdwubMgGpwKg6QDqBIh9Qu3g+w41nFGGAauziKDvvd7u315eHh7unxSXbyH8dxz85+XV784+eP/87V/1loT+HK32/puJ7jeq7rua7ruh77YNvtR+MmSZP07fXt4f72+uev8/PLIJx5nsrbgCvOoRqje9wgRoLFZ6ThPI4VTte800kUb9fr54f7+9vbz49V4/B/zwvOz3/9uP7Pzx//fXnxz9n83DVTFCVF7gGcnf1MszRN4jSN4uTQ8g6VCmmavr6+PTzc//Hnvy4ur2bzue/LvE9lmFo/M6Re2ZX7y9FI9DfDcER/3YB60Bh/sICoJVe8O2VMor/Udp6M4TRd3Mz53/7zd9+9IAhCBTARTacmoL6czsW57AQA2wDlFF/AzBTUNNBrCDMFMSoOUEO816LbVPdQ77Aq1IoG0jSNDofPz/fXl8fH+/vV56fU8H/HcZeLH5cX//jx4z/XV/8+O/sZzpbWFS7H98Ll4sp1PcfxHOakaZKlKe99APvd/vH+/sfPXxcXV7P53A8CtSIAuD2qcniP6LGF+KK/Z5WpPiUdzyKF9U+SZL/fvb0+P9zdvjw9Nb7713Hc87Nf19f/+fHjv7/G/iNQ/3Mcxw3D5fnZzySJ4/gQx4f3JEoSUfd3v90/Pz48Pz38/PVnPp1acxHAcLR+I2P5KwhftU0Kx6qx7Sr+zZFJ9Feg6Q5xHKL/UOT+nMlIrnh3ypjkfiazqSdmOE0Ut3w9JPWfIIYL8ChanZoA6YU6O5P/37e4+z0dPywQQ/jH8Q7h7zZDLg7IQyK6jxNcIW5RQ6/GQJLE293m4/3t8eHu9fk5jkTfBpmzmF9dXubq/3+dn/8Kw4WhSf87cV1/Pr9wHNd1XeY4+RRAjR5AmqQfb+8Pd7fHiYAW3sLv9ZZR40zGdCIQkkz2OcUMtRH6RpPF0WG9+nh5fnx4uFtzXpqyWFxfXv7rx/V/Li//0eO8/zwcxw1nZxfnv+J4f4i2UbRbrZ+zTMgAzosAHh/v//zHv8/OLwM/aCwCwHOI9yBL9TG0nxOZRH8zkOjfBY3xBwuIWnLFu1NGI/rLbuTJGE7TxeVfDEn9J4hBY/BxUawmwHhBQCGOw75FUjIDivk4kbWF9WEWB+TtGp8TUd/ocYX4ll4beez9fjTMsjQ+HLbr1cvTw9PDw2q1lhr+P59fnp//cX317+urf5+f/+xR/c9xHW8+O/s6NrLMcZzsPd0f1vUl4yh5un+4uv776urHcnHmeUEQBMO8kRxkpwmiG6uCvhxJnOx22/e314f7W95LUxbzy8uLP39c/+fq6p+L+SU29T/HdbzZ7Pzy4s8o2sXxPor3u92HYNv9dv/8+Pjy/Pjjxx/z2SLw+ryE2hi/30KvQ/s58Un0N0Ohb/Dqtk5jzpAP+2cFjfEHCIVacsW7U0Yj9zPJ7Twxw2mKOJnoq5ZI/SeIoWP8ibGrJsARuXJDOQGFUEUzgFmYKQjCDGBDfm0Aqz3SDKM4oNy6uf1QjQHG3wFAj8ZJku12u/f39+enx5eXl8ZZLHiE4fLs7Of19b+vr//r/OznLFz2q/7nOI43m519mRtZmiRxtsrqc1unabpare9vb37+/HV5eTWfL8LA59mhLVT3zzRvSwmiQtcVd+gnShxH6/Xq+enx8eGhcfh/4M/zl6JfX/1rsbjyPJkp8u3ief58cXl5+c8o2u336yjaJclBpGGapu9vb89PD//8539dXl4lQej5NkyO/uWnvof2N6XQy0aifzsFbX2aor/NU24oov/EJFe8O2Ucor/CFp6M4TRRWgb4t0DqP0GMAKtDxjg1AUIewGlRBnfZLz7bDMEMYI3FAebMgLbg6IsDmkOB+gGFMMMrF2BWjIE4irbbzdvL09Pjw2Yt+gZIxpjr+svF9dXlv66v/n1+/iucnWFQ/3Mcx52FZ+zizzRL0zRJ0ziJD0la9TbiKH59frm/vfn568/zfAqLQFqkq25v+WOqocVk73YJHcauueMhTZP/n70z3XJUR9e0JmZjO8bMXVXn/u+kuy+je51TtffOjMETM5L6hyMcDhtjDAIEfM+qVTvDBkkIIeT3GxTH0Xaz+v37r/fX13P3f4yJ6y7n8x/L5T9c785gVi/trAw2mOW5yyyLkmSXZdF683fFuSyK4pffv97fXu7uHmzLUW4A6Ed1qrU06NC1X1FtoxD9FZx/CW1Ff1Tcb9o1smItA5H790xGctX3poxD7ke3d/LEDE6TYz8TNrxwUP8BYBz0EDN+eMd8j7+/QXZXGBBwXuZeZP9qY8vGAKQ0U5Ciki/Vd7lw/YIDKnVF4afTtgogdYYBznmaJdvt+vX19+r9/Sb3f9dd+v7zcvHTnz3a1kyfnS33YEwsy/P9J87zPE/yPCnMbR2F8a9ffz/9/rW8e3Acl7IL+1i22tTzj5RYEbpnggt2BLL7hDjcyjzLkjh6e/398vffURSfH2mZ3nz+48M4ajhDGAXYNJ3Z7CFJwjjZpWkUxesqp+VZvnp/f339/fzjD282NwwDE1KzBZ31UuPpckiu/Sd0K/pfCsmcpujftEwQ/TtnYpKrvjdlBKJ/ve6djMFpilRP6VMRUP8BYDR825qy4zfgdx3/IGfXsQSgtsRu2EO4pMoLhWsfHHClwM6tAkVN0HE1eqthIM+yKAze315eX37vdgWJ8i9hmt7Me1gufvr+s+1omtsaY2pbs/n8mfM0yxIheBC+n3SEEGL19v73X/95fPoxm82ZUbyPpf5osXrW8ZkAgIvUe2qklGmabDbrl9+/CtOmMWp63sPc/zH3n21rhnFNQbxjPiZM/zFOtnG8TdJAnEVNFRKG0evL7/Xqfbl8sG2bVTAAtKg0KZqFOp5R25L7UVmHgOj/xWfzQPRvg6HI/XsmI7nqe1NGIPejWj08MYPTtDhMgyov/Ghq/T//+h+FBQMA0C/flLW+jAHfE/vgL0HxlmmsC2MAgj2EL1X5Dc2DA8rbckOsQEkpzai+qNLBVFDYVilEmia7zeb99fX97U3wqnv/EkJdZzGf/5j7z66zYBrntiaEOfZczH9mWcJ5lvM0SXYnx6RJ9vvvv19+/n13/2DbDqU9BAEAAKCEBo9u1VN5nqdJurebFqVNw467XCx+LhY/HF2No5eg1HCcxdx/CsP3KFqH0arKWXmWv7+/vb+//vj5Ty/zT6bQVmSmZi/Vfuf3XrT+duq7VjKI/vUoSuuvXSOvFj4Q0X9ikqu+N2Xoon/tvp2MwWlyKEnpU0DR1ArqPwCMjIu/Hrs3BpyaAdCn2Hv79NatMQBpvG3Ad2PAZ6Ft39xhBQcUVHBGL+ECVaiyIOvFSJDzPEuS9fr97fX3brs7T2N9CcdZ7tV/z7s3DFvzdR2lzHEXS/5HlsVpFmZZfOLWut/H8uXXX8/PP2eeb5jmQIMAAGB8dCDo34REKM3S3Xbz9vry9vp6bjc1TcefPS0XPz3vXvvU/+dgw3Q8737u/wjDdZbHWVaQ4OgEIcRus317e9luVvP50jQtQtUFPdz+btTqhTRKub+sfBD966G56F/hMdRZXD5hMpKrvndk6HI/qtu9EzM4TYhjk2dLPv6XAPUfAMZHJfexLo0Bh7q+BwSgY/26XoHfi1XA8U+vYRgDvp3cxbYBV8rXNTjgYk3f0dYqcFbzpZ/SLT7NeZYFwXb1/vr+9lo9+7/B7Jl3v5j/9P1Hy3KHkN1iv7/lXbaIkmSXJEEQvJ2MgDTJfv/6+/fvv/Y7ARjNDADD/10DAPVpcx7t/+ek4DxNkvX67eX3r3O7KcbYde/m/pPvP1mWhwYwPZ5CMLWtme8/huF7nGyrGAAQQnGcvL+9rterx8fYcTxKa20JU3nq7H8cFIFL/mpI31p/WUVFyrWaklUBon+906o9jzqrzHsmJrnqezsGLfo36djJGJymRSspffbcEj4F6j8AjJKb48c7MwYUWAK+/qifgael9n/zw+pwD+EGl9BDpqCy8hUHB6DvY6UVLrXxtiRCVUpsh/YMA5zzNE22283b28tmvanu/u96d77/PPefHHtA2S32+1s+xkkQxZs8T04SAQkh3t9XL79/Pf/4pz9fGoZFWfVLO70XDcfIkH8iAX0ynF9fA2lp0aPI8zwKg/e3YrupZfnz2dN8/sN1FnQw0+MpjFmuu5zNHnfBWxxtsrxSEMB6tV6tXqMomPlzdnU39YFr/WjUrv3Xq1Mh+rd7FUeBCMorUi76Ny2ziFZFf6S30IwmJLnqexcGLfejBn07MYPTVDjJadaxj/8lQP0HgLHS6DdkN8aAolqKndlVlKyGLzm95T2EFfnv928MOK2iaXAAuvDzTBb8SzW3hQvcfNDlOhTR3DDAeR7H0Xr19v72GsdJxbMsczbzHub+s+vdMWYNaO2HMbVtfzF/juNtmkZZFgnBjw9IouTl16/Xl1/394+27dxiAGjeCd/u2mD6tBoD/w1YiYHcsoE0s1VuHI6nb0ApeZYFu83768tmtT6xmxLCXGfh+8+z2YP+udFKwJhYpjebPfjBYxi+Z7tKQQBBELy9vmy36+Xdg2malH5OoVX9iPXirD3tNFAzrb+sXs1z+6Bv2rouevqeMYj+Wu+MNDHJVd9bMVzRv2GvTsbgNCHaSumzR8UWKaD+A8CIUeZE1r0xAB3bAwZhDECD20MYdZYpCJU0XkFwQMHJ57EC51Up5Gqrb6v6pqMVjbTLC0d53BwpRJ7nYRisVm/r1aqi+z/G2HEXs9mjP3uwTG8IyX++QSlz3eVi8TOK1nG8DaP342+FEO9v76+///7x4x++vzAMk5DOLlCxCUErJvWD4QLQB63RbYJ4IUSSxpv16u3t5dxuapmu7z/N/Sfb8jGulQNHGyg1XGcxmz1str/CaMV5dvWUPMtXq/f1evUUhbbllARA9P48FDWgk0YNSO7fA6J/E4p6T5dGguh/XJTWkqu+N2G4cj9q1rETMzhNgvNNyzXx8S8EI/S/Qf0HgFHTShR5N8aACxUVb3vbuFg1DM0YgEYaHHCxtsJwgW5WoTddihprgbJR9+2HnBAyS5LtZv3+9hoEYcUibHs+8x7m/pPtzL+8O4cENgxnNntYLv+I4m2ahXn+TcJLkuTl96/3t5f7+yfLtIlpfj+707beiNaNA4CqdCvo30qWpWEQrFZvq/f3c/d/x1n6H9FR5qUShgLGxLQ8z7ufeQ9B8BaEb1dPEUJsN5vV+2sUhr6/kMjEPQmIHTnvX2Vwcj9So/irKaKENkX/pmWC6N8OE5Nc9bwJCA1W9G/epZMxOE2FFlP67FEn+p8XBOo/AIwedpikZDsv3pIpqh1t/bhkfPSHAmMAUtrmImMAGs62AUjH4IDCExpXW2gVKKm8A6pfX1kjS75r0IFc8CgON5vVavVecftfQqjjLOb+k+fdm4Yz0FUixsS2fd9/DoL3MFrtdi/HXZxn+er9/f31Jfxj6/tzU5qHq5So8WAaZIcB06aPCVTbB0VKmWfZbrdZvb8GQXDyrWV6vv/ozx5taza46KhCGGWus5j5j9vdSxRvhLj+pgjDaL16C4INz58QF7jeVsDX0EXfP0ZXrb+sahV5/CtVpIpPbX2aon/NMkH03xelteSqZ/cjNFi5HzXu1YkZnMbPuYM/0t7H/xKg/gPAFPjytD2fv1oyCXzVeFJdOyUrNAZcKFkB+Pifw9hDGGkSHFBcUWHFLYYLaGEVKKT8oi+2tq5lRUqZ53kchevV+26zrZj/x7JmM/d+Nnu0bZ+QAWe3YNRw3eV8/mMXvCXx9mR/y90ueH39vVmv7u4eLcsmn0Jew4GpwH7QvBHAgNBmkoJBdyDP8ySJN+vV+/tbmnxLiYMxdpyFP3ty3SWjRl8tVA0xTXfm3Xve3W73EsXrqyfkWb5er7abdRJHjuMSVP9NgUv+6ovKT6Wurv1XDlFcY3N09/Q/LUOXRg5T9J+Y5Kpb938xRNFfSX9OxuA0CdpN6bOnTR//QkD6B4DpUJZqo2OTQPva+jCMAUcld2oMQMMMDvisvoC+rQLo+yDTkUtXX9swwDnP0mS73by/v0Zxpd0dEcK2NfO8e9ddGoPa+7cIbJmu7z/Og+cwfM93iTyK7hFcvL+9vq9en6M/bMexLFtNlY1LUGNCAIbDoJ+xUSKliKLifVMMw/W8u9nswbY8NAr3/z2UGo49n3n3G2cRJxspr89B2812s1nHScQ5Z4xVGci6aP21JlgdXfuRskw+N9fbHBD9a5dZYQDrpjtPRnLVq9uPGaLcj1R06cQMTiOn0MEfDdbHvxBQ/wFgUtyWa7szk0AHxgB0rP03zsDTtTEAtfLKHXpwwFkjCqhkFbh0ct0mnBVWUKtW6+TahgHBeRxFm/Vq9f5WMf+PabqOs5zNHmxrNmj3/z2EUMeez/3n3e4lijdZFh2+EkJst7v3t5fdbuvPl6YpsR5+clo0AgAmQOHPeCllliRhEKxXb+f5fxx7Pps9uu6S0sFn/z8GY2JZnuveO84iCF6T9PTCTxBChFG4Xr+HQcDvc4Ss0wJL/mqbuu9vHebe7l37K1WtiqGJ/k3LLGIKov/EJFdduv2cwYn+qjpzMgan8dN6Sp89nfv4XwLUfwCYGk032zyZJduwB7SvrR+XDHsIn9SFjqqpW1KvwQFnrSmgqh7f5sv6ctkaWQvKDQMSyTzPozhcr9+CXVAx/49t+/7s0XWXhmGPYm2JDdOZzR58/ykI3tZHBgCEUJIkb68v69Xb/f2jZdmMDXG7YwAAPlDyQ11wniTJdrNerd5P8v8wZjnOYubdW5Y3juz/x1Bmus7cc5dr00nS8OqbLU2yzXoVBNs0SRzbIYR28coYsrh/zjhd+08A0b9N0R9pk+FnMpKrJv1dwODkfqSoPydmcBozlxz80bh8/C8B6j8ATBDF8tOpPaCaA8kN5X8rXCUtZQrq1hiAWsoUhFReiBbBASdUdXhv1ypwierWgt5MBfv2SCEEz4Lddr1aVcz/w5jluXfe7H7o2f+PIZg6tj/3n7fblzBaZdlXV+zTWK9Wb2G4m83mCAwAAKATRebp1hFCxEm0Xr9t1qep8G3Ln80eXPfOYKcO7yOA7IMAvDvbnofhuxD86imb7Wa73aRpmufCNFXMn+PS90+42MgRuPafcGS9ANH/NoYj+qtVXfWWXHXo72KGJfor7MnJGJxGThcpffZo4+NfUKBECKH/9V+g/gPAFGlXfjq84cosAcff1DUGIKWrrw6MAaitBre+bQBSeSGVggMa11IfDZII3UR9U4GS7hVCJEmy2643m1XF/D+W6bnOwnPvxuL+/wEzbM+9m80etrvfxwYAhNB2s31/ew12u2yZmKZVmAWokukUAIAK6Kyk7MnyNNht1+tVGITHgVOEMNv2Z7MH255hPBL76HewYdius3CdxYZZaRqWHy2ECMNwu91EUbhcVoow++LGOVX3QXPGyDP5FNKy6N+02KKIChD9r1RZ+KmKBZHekqu+882w5H6kZUqfjwK1NjiNlhIHfzQNH390YTCD+g8Ak6Uj/9NKlgBU3xhwcrj+xoALJavhy6u+fWMAUnkhuECXLgoRUFRdTRolEbp0fteU/yiVBf+qAOc8SeLtdrPdbCs1AhPHWXizB9uaUTIqX3iC6T610dpdRtE6z5PDV2mSvb+/bjarOPlhO15hFqDGvxMq7KcJAC3Qiwe97pQ+jUKIPM2CYLdevafZSf4f03WXrrM0mJoNwzWEEGZbvuPMLdO7agBACCVJut2soyjI8+ySAfXqe2sEA3QSmXwK+by69loCon/HXItTaVKyzpJr/w/TJQYk+qvtRvDxHwEdpfTZo72P/yVA/QeAKdO16Hb8RpSH/ytkeMYANPE9hM9LVbB6v6Ssl+pM+iYRKv7oxkJbBxf8C6GrhgHOeRQG680qjuMqGwCYpuvYc9dZGKYzvhWpYdiedzdz73e712MDAEJos16vV29xHMlq2yTcTvPf8GBCGBKldlKgBdQ9HpznSZrsdpvNZi34twnBsmaee+c4c0pHZR89BmNimo7r3DnOIgjfrmYByrN8u9uEYZDtjSWg9V87pK2qu+H7BU5Z9K9Z5pREf70l1/4fpksMSO5HSnsSfPxHQLmDP5q2j/8lQP0HgInT56/KEwm3zB5w8nHdTEEtGQPQsT3gRCNtlimo/W0DWjQGoLau5cToclT8QMIFDlxpknamgjLDgBAiz5Ig3G036xM/1kulmabrugvb9hk11DZUBwihtj2fzR7tzV9RtDoIW0KIIAhWq7fddnO3fGCGUezE2jM6tgkA2qKd10Olh0jKJI62m3UQfNs4nVHTcRaed2eO0T56DGOW6y4cZ24abpxcjx7bbbe73SZN4jzLDePr3THcPqra8vG79qMOtP4DjUX/0zJA9L9S5aUvNBH9dZaDVTMU0V95H4KP/9DpLqXPnsH6+F8C1H8AADRyKzu2B7QUHNC+tn5csoJMQd0aA1BnmYJQS84Nhf72+lkFDtzU2WVNveky1N9ijBDiXKRpvttud9vtiR9rIYQQy/Rc986yPIyJ8jZpADYN2/PuPfdut/2dpMHhizTJVqv3YLfN0lTYgtJr2b1HvJYHgIZ0OIm38CBKnudRFGw36yRJj7+g1HCdpWPPGTXVV6sTlFDLmjnOwjDsqwYAIUQYhWGwS5JYCo7RAIzHtw2br/Hc4rzf/yulc7lfQS0g+t+OctFfseqqsxysjuHI/d//27xAnY064ONfgasO/gh8/G8B1H8AAJBWBoBjwBhQXixS2mZ8/M9OMgVdKriFNepgkghdpfqtUBBYcPt9l1IkSRTsNkEYVMn/YzDHcRaO7RvMGunCFVFqOM585j2sbP/YAIAQ2qzXm80qTmJP8OsGgIbDcZy9C/SBhjNjM/p9OISQaZaGQbDbbU42TresmecuLXtGyCi3/z0CE9OwHXth234QvAl5JQtQlmW73TaKQs6vHNkBN4+fTvT9Y7SY/vuQ+9XUdSHJknpfzhrnjFP0Lz5bzVXoLAerRn/RX7nc/1GczkYd8PG/RqcpffaMzsf/EqD+AwCwh2Gp3N6pmA4yBXWiras0BlwoWQ3dBwecVf2NVqwCBeVqmkSoBgpMBZe+uFw05zyKwu1um373Y72EYTquu7Bsn4xr+9/vYMt0Pe/OceZB8Mb5R88IIcIg3GxWSRRIca/MtKP4NG3Q+w3VBUO/g40Z7xCQWZbudpvdbnf8KcbEtn3HmZvGyPP/7GHMcmzfsjzKTJFF5QfznO8NAHmeSSlbTaGmofN+Of2Plf60/gMg+o9D9C/7ojo6y8HqGI7cX/RXk2J1NuqAj/81qjj4I/DxVwGo/wAAHGCoaMbR2SQw3OCAa8YAVFtk7ySaobvggMtt+KIrqwDSPIlQQ6rcQ3nxj+OPZZ7ncRwGwTarsAEAxsSx566ztEx3pPl/PqDMdOy5595vjL8j/mUaSbNsu1kHYZClqWlaFTuh+TM3yOE6yEYPG42XAGPg0L15lqVJHIa7KIyOA6cMw3acuW37dIz7o5xDCLUsz7bnpuFkVw0AXIRhEMdRnmdCVEihdpnB6fsn9N8ODeR+NfWC6H87LYn+NxxRs+obANG/Hi3J/R/F6WzUAR//UrpO6bNnMj7+lwD1HwCAY4p9b4diEhiHMQAd2wPk98+aZQpS/lrpMTjgQktOgSRCyqlygYLzLE3CIAh2O15hAwDDsG3bd+w5YyNPb00wsW3fc+9sx4/i9eFzwcV2uwl2mzRNHS4o68gKouVEPjzae7rhBg2RC3ft+s0UQiZJGgRBkibHnxvMduyFZXrjz/+DEEIIY2yYtmPPDdNBIb76hEVRFIVBlqXlBoCh6/vH9N+m0Wj9B0D0v51mon9ZAZW+blT1dUDur0dRr4GPfx30HX+1qOjgj8DHv01A/QcA4ISqyTf0NwkM1xhwoWQFmYI6MQagHoMDztE8iVBr7emBb6NLyDRNojCIoivOm3sMw7Ft37K8Uef/2YMNw3bdhW35hFAhPpJWCyF22912u0mSWEgxCZFvRGj29gPU06qisUdKyXkex+Fut+H5t3T2luXZ9swwJ5H/ByGEEGbUsizPNBxCqBB5yaFCiCSJg3CXZqmUH/bmK92kt7i/R6+WjU/u39OV6F+nTBD9K6J0DQ2i/6108HIEH/+B0kNKnz2T9/G/BKj/AACcU199O5nRtLIHnHhmt71twOCMAahFe8BHU4/K79kkcKnyXqwCJe25hJbr/1OE4GmShFGQJEmFHYCxZbqO7Rum02r6Zk2glNm27zpLy5pFv2ZqogAAIABJREFU0VcQQBzH2+06igKeZ6ZhooHcawAYIrWd9Fsly7Iw3IVheBw4RalpW75tzxkdeYDUMZQyy/Isa8aYmaZlBgCEUJZlcRQmcSQEP1nq9X5PL6Fps5AuWn+LVYPofzvaif43VF1er74P4nDk/mvf3FoF+PgPk+oO/gh8/PsA1H8AAAphh9ekbPaWO53ySmfTjqfHtoMD2tPWWzIGXChZJfjkn6f9Ls+P65iuUvcUWgVKq61rLehx1cF5niRREOxOElkUQghhhm3bM8bMcS2Gi8GYWKa3388zijaHG5Vl2Xa7iaIoz7mUCN9gDLl4q3VaeQITRdEjPf6ZIc+yPEvDIAiD4Nhuyphp2TPLcieS/2cPxsQ0HdvyGDVTFJYfnGc8iqI0SXkukEQ6jJb+W1ARPeT+lrX+izWA6F9W5aUvehT9b6i9pF59n06t5ELUidz/URz4+A+QflL67AEf/xsB9R8AgEt8RQCcv0EbmQQOp16LFRyZMQC1dnXXjAFIyR7CqM07cmoVQOeDbDrhAperrW4t0COwQErJOU/SJI6jk0QWhTBmO/bcND06/vw/ezAzLMeZ2/Z8s/0lP3fP4PttAIJtmiY3bmV58VZXGwNlN1/LdSxQiWYT58h+qPbBjQ+PlDJN0yDcxXF8/LnBbNv2TWMSAVIHMMYGs03LY8y6ejAXIorCOI54nksp2+6oAd+GScj93Wn99QvXVfRHl66lX9H/5mYc16jv86qbUHitp8DHvw76jr8bucnBH4GPv06A+g8AQAllAtzx+7W+MaDwvAIl+OKx7XFsDEDl9gDNMgVdkOxxc2MA6vyOFIjYheECU7QKXOLLfHKNi5EWCgMLhBA5z5MkjqKoyg7ApuHY1sw0nen4tzJq2LZv275pukmy238ohAiCYLfbpuk+k3VnvVF280fz0wUAFKAm6cSFsoVIkzgKwyzLjj83Tde2ZoxZE3scMWWGZbqG4WCMD4bSS8RJnKYx5znnnDXbRH0kvTwJrf9iDR1cL4j+5WdX/boit8y9IPpXoTO5/6M48PEfGr2l9NkDPv6KAPUfAIByKm8C3FJ8ANLFGPBZe0eZgrrYNkB+/0zLTEHVqp54EqEm3G4qQKcXVtLBh3PyPE+SOI4r7QBMmWlZnlHBzXM0YEwsy3PsucGsgwEAIZTEyW67TpI4z3PGjB5bCACTQNHsrOS1wwVP0iSKgmMDAMbEslzL8iid3IRACTNNx7JcjKmUV7YBSNM0juMsz8oPQ+MSaL6YhNzfMNZNASD6l59d9euKVJ6ftVX89REKq3UQ+PjXQdPBdyO3Ovgj8PEfAqD+AwBwlQabACuJD0CVjAGoH/V5RMaArz/UGAO+l98dw00itEfjRUX1HERfPbw/RwrO8yyJ4zRNr+4AjDExDcc0HUonsQHAJ9hgtuPMTdPD4buUH72UZtku2MVRyDlvNDim05HA4NB41jvQ/QMkpcyyNImjk8Apg1mm6ZrGhAKkDhBCDcMxDOfqPsBCiCzL0izN8wxJ1UKCVpx5vo9N60d9ZvJRVmOFWa4XzXrQon9R+To+6zrIhR3L/R/FgY//oOgzpc8e8PFvE5D+AQCoiJoc3Cdv7muzaDUxHekSHNClMaC09Ju5ZgxATTIFoQuX2KtVAB0uUDerwB6FiXf642QIISlknmZJHCXfM1kXwphlWZ5pepROZAOADxjbZwGaEUz4pwEgz/IwCOI4EnmOmsSUNB8uGjwdgEo0nkGUMPQBywWXQkRxdBI4RZlpmTPDsCe1AcAejIlh2KbpUmqia/sAZ1mWxBHPMs5zwzC7aaF6vj2n+OIfnTN6134FlQ5L9EdVoxMafV2R20R/ZdUqQQeh8JbuAB//Omg04OpSw8EfgY//YAH1HwCA6rSiwR3m6AsTbGUxX79MQcfGAFRuD9B424Bv2V5UZAq6VFFRjR1RaBX43pL+kwiVMBxTgeRcZFkWxVGWXUnagBCi1LAszzRsjBtlbR4cGFPL8mzLJ9Tg4qujwjCIoiDPMykEJsV90nyEdmFCAMaFlvPiiJAyy7MkiZIkOf6YMcu0XGZMbQOAPZhR0zIdRq8L+jznSRpneXZts4BeuZy5Xqu724vcP8hQBl0z/AxA9EeVfhO2Wn9t+pULe5H7P4oDH//h0HNKnz3g498HoP4DAHAT7GRCVGuvvWYJQGcz/M3O9ZApqAYXOk1lcEB5jWdVd8cgkgjdxE0tVd7hUiIpRZanaZrk+XUDgGHYlumx6fm3YowNw7bsmWV5Wfbh8yuEiOM4isI0S7ng5IIBQEHtLZU7Xnr8pQA3awpIhPIsS+IoSZJD5jSMsWXOLNOtooCPEkoNxmxmXN8hRgiRpmmeZ1IKhGQPz42uzvvltKz1X6xhkHL/HhD9m1BT9FfcipsYjtxf94xLBYGP/3Co5+CPwMd/dID6DwDArZxGAJzPmEqm98oyfTXF+7KYrklwwICMAZdLxt+racVfXudwgUFbBS7RRmDBXoiJoohf2wAAIcSoaRg2o8YYevM2sMEsx/ZNw8UIH8ZXmqZRFOZZJiv0HtAZUxudgCoqjhwpRJ5lcRIf7wCMEDYMyzTdCW4AsIdQZpq2wWyMyWGvlEL22wDkecY5l7IF/XWY+v4J4Np/MzcsQEH0v0Aj0b8f+pILe5T7P4oDH/+B0H9Knz3g468ToP4DAFCD6ymA2jAJVNOybzcGfD9JE2MAKrcH1MoU1I0x4Hv5+OTvb99PxirwvSUjsQoUUvmyJOc8z7M0Ta4eijFhzDIMm1KjUeOGyT79kWV5CGP0mbcizbIwDJI0EVL04cUKAEAZ9R/Jcp9oIfM8T+KE5/zwGSHUMOwJZkg7QDBhzGLMJIRxnpYcyYXIsjTLMiG4FALTG00mA0nOUx1w7a/DzStLEP0voEz076KDhyP3NzvvvCDw8R8ItR38Efj4TwZQ/wEAqEedPQDUZg263RhQeqB+2wZ81t5WcEDbSZCuyfEniYOOvm/fKlBQc/ucDquCOzpmw8AJQggpeJrEcXJ9B2CMMWOmYdjT9G/FmJima1meabpJstt/KIWI4yhNE8EhAgAAWkeFoN+omI/CpMyzLElicRT6YxiOaTqMWVPLkHYAY8KoaVTrgX0EgDz3/x+F8345vbj2t1hvKW2L1CU1a2feANG/Lt3Lhb3L/R/FgY//ENAipc8e8PEfAqD+AwBQGwWbACu0B3STKahtxbyc4WYKulTLMRe2Eyj4stWWaBIucD3oY+grVoQwxlzwJE2+J7IohjHLNF3GzGnKWxhjw3As0zu2f3AukjjO0oTnGZayRs/AehgYBDo+89e8m9uqVso8z9MsTdLkOHMao4ZpuJSZevZWB2CMKTMYMxmz8rwsqkwIkSRJluU8Fxjh/dJzfL3W7hVBJp+jansfPCD6K2Q4cr+Ks48LAh//IdDEwR+Bj//kAfUfAIAmKDAAnHCYryFT0FXGYQy4VONZ1YVJhKZjFSj6WJ7894TvH2u51JVS8jzP8yzPc3E9iz1mzGR0ogaA/eVblsfoty0u4yRO4jjPOZK40uAtMDfVBxbYY2Woz5gKtUt/uOBZnmbptyw3lJqm6VCqfmE2ICgxGLu+CTBCiPM8zzIheJ7npjG8bZO7NTpdqRZc+3uhVdG/0hFVANH/vK4ezz4vDnz8tUeXlD57wMd/yID6DwBAQ1h7KjE+FzcVBQc0NQagi3q6JsYAVG4P0GzbgJuqPmtDoVXg8+8xWgUKuW4qQLdYCzpcJgvBueBZluZZfvVgg1mMmnSKOwB/QAkzTde2/e3u9/6WCSGyNI2TWHAuL0YAlCS4qMhFE8JE78TEuTKEYFC0wtELXiIh8jRNs2MDAN57vhMyZQMAJoRSahjMjtGm/NA8z3OeCSH0HK99tgpc+4+q1W14gOiv7PyuVvAquhR8/Oug28NbkYYO/gh8/IELgPoPAEBzTn5nns/qCuZmfChFHn3UrMBjqi1TIVPQlaN0sAqgzpMIXWuGjqgMLGjckx+5LNI059cNAJgQxixC2WBX9U0hhJqmw5jJmJHnH9pfkqZxHGV5muWpZdrt1NzchABcpXm3TvS5GCi175ZEUkqZpvs9bD8CpzBGhuEYhkWmugPwHkIoZQYm1zuB7xG8F41Xl2dVS9d+ZfUOX+7fA6K/yvNbXsBoJfd/FAc+/nqjUUqfPeDjP0ZA/QcAQAlXHc3UmATwyZm1fNjLCy8s+OajLovpfXvQt2UMKD9ck7Q5k00i1JDqpgJUfHXXcxDJvQ97lkpxtXswpSZjxjR3AN6DMTGYbRoOwQyhTwNAksRxlGcZkoMbYsAxw/31CiDU4f2TUgrBOc/z/MtuijGllFFq4mkbADAhlDBa4TWRc55lKZKq/Rt1fpJLXfvLvmiTnjL5aKr1HwDRX/H57ayP2ncour0g8PHXm+YO/gh8/IEbAfUfAABV1Ig0r+8ZfzjzkmN3QfE30pYx4PtJmhgDULk9QEWvaqKDQxKhDii6uus5iCRHPM+zrMoGAIjRfYKLKRsAMGOmYTrH/q0853EcpWlyomSNZmgBQAcMS0dI0jT9njnNMGzDsCe7R/oBggmlBiYMYyJl2WtFCpHnOec85zljRvUq9O3fb5P+lWaCa7+GgOjf1vmK1kMayv0fxYGPv8boldJnD/j4TwlQ/wEAUEjzVLN17AFlIlefxoDSA/XbNuCz9grBAYUfK7UKXK67LSCJUF8cWfI+HFl5fj3/D0KSUkapMe0EF5gywzQcRs3k8yMhRBJHWZYKeYv8U4ERD0KgGwb6c11zhBCC51mWiSOBG2PCmDXxHYARQggTShmj1wV9IWTO83MjgaaDtu7s3uPlgGt/Ceo81jux9AxL9NdO7ldcHvj464wSB38EPv6AIkD9BwBALUxNip8vLnr5Xz2h4DR1mYIqy/yNMgXVD45QwQ2Zgo4OKiylQQMqVdIqOicROmfQCyeMsJSC8zzn1yMAKGGUGpSyiSe4oIQx41sYBBciSZM8z6UQCEmVPzIbl9DX+OzgF6Pmj97gfjMD1ZFSciGyPD2eNgkmjJqETHeLlD0EY0IYIUxeS4kmhBCc7zcBxkpnzjrU0ve1utPg2l9I1ebdaORQU2k50xP9+1jFVy4OfPx1RbuUPnvAxx8A9R8AgBYo8DVT5NJe07Kga3DAsDMFHbWhllWgoLCbWlK1kvbQJInQOTcVr+eKS3AhBL96GCaUUoMSY+oJLggzmGWaLsb4oHAlSZIksRC8dxXrBJ3aopgRXxqgL/vXsJCC8zzLeP41c2JMKGVTzpD2CSaEYowJIeVvFiFEnucf02bbDF/fP6EPuV/3d3/LOjWI/mc0fnLBx78O0/bxV+Xgj8DHH2gZUP8BAGiDK8HmSuMDbtbDh2cMQBcb1m+moKM2FFoFUE3DwBitAqjzJELVqV5nZ50ppBRSCCH4tQgAKQUhlBA6tB8LiiGEMGYxZmFEJPqQt9I0zfMsz3PN9H8AAC5wTREueZCllELILMuOPySEMWYRPHUDAMaYYFoxEkJKIYREGDWaOAeYnOcmwLW/kCvNa7qKqnT1IPq3WFFnxRyKAx9/LdExpc8ePU0R+wJB9O8bUP8BAGiJm7PNthAfUGdvrIuZgtQZA05rufUoVMkYUHp+F+CT/37SfRKha3J8d2iSRKgJ3ZgKpJRCcCF4pR2AmU0wwZP3b8WYMGZSyhDGh97PeZ7znFcIpAAAoC1KhWCFs7v8SJ32LXMaYyYh9Hh78KmCMSGEEMbMNL2yuwzfW5956QtodM775YBr/zkVTEktlt30hEKmIfq3MK7Ax78Omj/gxyh08Efg4w/0BKj/AAC0R6Pt5hQJ2XWKuWhAULdtQFktNY66bKXQITjgnPrhApBEqPCQklJ6pXkOIimlONuGsegwQQgjmOguFbQOZsyk1DykQtonssjSVHKBpLzw8AEAcMYNb4LbnPRbRUp5vm/KPkBKvePnAMGYVNkDACEkhUBCInkYCePX949RdhWTkvtrLh9rXrRSAVFhLY3aNRzRH3z866D5A36Cpil99mjcNhD9tQXUfwAAWqWRAeCEw8up2TtlApmCtNw2oAqahwtoZhUoOqSsibqbCtC5sU4KjDCSElVRaqTAhGBCNL22rsAYU2KYhk0w5egjB8iHO7CUUiBCC3NPfXGb/W3SnQ3U4kY1UFW10xmq+6xpnOfHmdM+DADT3iMdIYQx+jSOXh+IYp8BCJ++VkY2lroRkQtr1rwn23Htr3PRbXUUiP79FQY+/hqi1sEfgY8/oBmg/gMA0DZs/0pQ+85SZAlA6HY9XFdjQOmBGm8bUJHL4QL9WwUqNEIxddPv1DUV3FSlaqQUQsoqKYAoNQgG/1aEECKUUmYSaqA83n+Sc855LriQUiB0JUtSaQ+efVk0kGqF8AA3cutIr5MMryrw1GkFJoRzzvm3lF8Y7w0AfTVKH/YbANNKEQASSSmkFEjKgW4v326jJyX3d6L1d9FFIPo3P7wu4OOvFR99qPOFg48/oA5Q/wEA6ICPCIDzl4SSN9p5GTpuG3B+6C1UlvkbZQqqkyapbxQnEVJ3jyq0oCPqpt+pJPIWf6faPQVjXFF5wfuVvO4KQwdgQigljB5thyCFyPOc87yK5qWgBbW/BKqjwxQD6Mtp5jRCyLkn+4Sp9vxIiRGqYoHui+5u56S0ftS63N9D/+iR1n9Soj/4+GuFcrn/s1h1gI8/0A4g/QMA0BkXUwB1YBJQZAyoWpKuwQFNMwWVnKEh9ZMIjXRrgep0HVhQoT6MkZRSVosAwIRgTPT/BdIBBFNKDUK+pl8hZM5zzrnoxAAAAIBCbp7WpEQSyaNpE2OMMRmoD7tyMMIYEcOw8zy5digWUu5ty5007az+XmpFE5P723ft77p/rl2RjqI/qrlEHrHoDz7+TfjWezpfOPj4Ay0D6j8AAF1ywx4AJ6+Z5i9EdV7to8kUdKMCfta8kvZqvkjQJFxguJaVY7ozFUiMhMQIV/RbJ5hoL0R0ASaEUEbosQFAZFnGed5jqwAA2NPyJLW3mYrv0yaWUmKYIRE6vF+qh0Nh3Eq39Xkn6q85MNJb+5uWa3/la6nVqtGI/rXOqFgu+PjrQUty/2fh6gAff6BbQP0HAKBj6m8CfGoPqHpapW90zBSkzhhwWsutR1X8Hpf8Vb2OPlEcLjDGJEINaZ6DCBOKEBaiWmdg3KOrpj5gRChhlHybfnmei30yawAA1KHbdCPlJWlbYggBOIBxlcmQEEzqyv/D1PdP0H3ATMW1v12hX1kBIPrfXBT4+NeioN90vnDw8Qd6AtR/AAC6p74B4ITDO+/Kq6qapK5jpiB12waU1VJWx409US1nzhCl7ZrhApNPItSQ8+sVQuALXxUg5Udqh8mDMSaEkqM9AIQQQnAkEZYKfoiMeBACOgDPcHMw/hY4tZ8TMCI9NkkfJJKymjW0JHXSQJLzXEV3j/4Dk3Dt707oV1ZYq6L/DeXXO7xioUofOvDxv5VW5f7PKtQBPv6AHoD6DwBALzCEsNoXdVVLAOrYGFCnJJ0yBV2tpnLfVPCOh3AB5UmEKlY7OKpnabh+IybDXuw76TrOOee5kj0AGv4agZukD3r+2gcucvHh+Zb9gCCGJP4u92PI/7NnPwVWNAAQTPZyTncdN1V9/4Txu/ZXDGtUX7GaIqu5ZbRZeO3DC89vbV0CPv63crHHdL5w8PEHNAPUfwAA+mIfAXD+OlMjQt1QSjX/+mYu8ZdK0tQYUFzXDafeUsYUwwU6TSLUpDBte3jvdymRrJK4glFD/Q+toYL3rqvHHwkh5Gla8H6AmwRMndOnUOUzsd8MnZBvMwDB4Pv/hZQCoespgMgeTGSFXegr162spOGK+yeAa387bVBfJIj+lQsHH/+qdCD3f1akDvDxB/QG1H8AAHrkUgogNSYBXPvM3jIFKd024PzQ22mm65eXUdcwMGarACpru+okQhW5qfguex7vOdOyC5FISiTRx/90+43TLXgvXbFDGhAuBBcc4X1ExeT7BwAUUjwn1nnEVD2WQsqTxDVc5FKKjzxpk2fv/l/FGkoIoZRWjZwA5/0KgGu/6ga0e0FjE/1RG8oy+PhX5Upf6Xzh4OMPDARQ/wEA6JfqewDUd75v6rY/3G0DUNXG16NxSqC60n0FHRySCJ2X2w0dBxbsZSxcwX1VCIGkDg7u/bPfCZkQ8j1QCkuBCKJIkKK72E/uYQAooP5TrNfo7KU1Un6YTgn5Nm1iRD5NpBNHSiml4FffFoSQ/WYqH/EToO/fCLj2K21Dd4MFRP8KxYKP/3U6k/s/q1MH+PgDwwTUfwAAeqf2JsBq7AEdGAPq1FJcktbGgPKWXGqFyvMuHTLmcIFqDa9+ecMzFWCMMaX0RMkqLkRyITgCCwBCCH1sAYox/uoPKffbWV64MZVv120dXHS0Pj9PJ059O/uQGHDT64I/Z86vTzDmIu+xSVohpRBSVHkAKKFkH0tx27w3fnH/HHDtV9QAzYT+YyYs+it289fZ1b0ulbpI5wsHH39g4ID6DwCADtQ2AJxweJne/iOs3pnnJ0w7U1B16krwSsMFKlgFqpXeG6VJhFDNtg/NVIAxIhgjiSilV1u0T3BfZV/HKbDP/iGOUld/fCJFB/f2aKAV1abzgwdUQx/RAThDIowIxoTQow8x+sh9P3WklEJUSgFECGGMEULOQtCmqO8faM09fIKu/R0NokbVTFj0R6p0f51d3evSsdz/Wak6wMcfGBeg/gMAoAmqDAAH6mu5kCmoam0toDRcQE0SoQal90aFHEhfXN9yoMLJlWhz/AghGKX7IABeuhOjlOJzGwAAIYQJoRh/j4iQlbZTVlB3B3UAAFAMxghjQhillJC9FRAjJCXfq96dzAFas++Kq4cRjA1mEEIJvhg5NVyUXQ+49ldiCG/exquncYj+SInur7Or++3c0CE6Xzj4+AMjBdR/AAD0gZ2/0lQb3ffcrJh3nCmo2Zu9aXDAlZNLimx54VlLgu8hiVC10vUCn/z3Mo1MBTedd/twIhhTShm7bkoUUgjBpdgndtDhF1PPyI8NPz9uD8YffqxSVt3SEgAAPSl5gjFGCElKvmVOE5IjhIWolPdm3EgpheCVIwAMgskQ1f/eteAjwLVfMTrd3PGI/kdV3N5InV3d69Teg9z/WbU6wMcfmAag/gMAoBUFsl0nJoHbFPMOMgU1jT8oLunmYkp6+mbbQHlxDYBwgY653VSAal767aYCjAllBqPs6jYAQnAhciE5CNwIoX1fH+8BQMhhU1AwkABAb3Tw7O0nzOM5U0qZ81QIDpukSCmE4GkWX30hUUopZZTSbgKnbuK2BnV308G1XyVaCf3HjEn0r+YCVITOru631X5j/TpfOPj4AxMD1H8AAHSjUgqgk5dimzb7lo0BJ+d0mimo6cqivNdvMA+0tpIdSrjAiNd43ecgwhhTQhm9PpNIKQTPheCjvgNV+dwO4eM2UULoV0Jw7cQsABgQ+j8/EiFKKP1uN5WCC5HDNgBSSv7xpiiDEmIapm3ZlmV/302hC/TT9xVpuO1Rd6epG2nrOhqV2/IAqNW2AYn+RR8U0mfkhMJ6e5P7PxugDvDxB6YNqP8AAGhInT0A2rQH1DcGVDrhhD63DbjUjvZLr+ZQr4q6EnyL4QKjSSLUECU5iAghlFLGjKsRAEhKIbkQXLaUZmxQSCkRxvJI5MIYE4yRlKQfFzcAuAg8sMqQCCGEJSKEGt+nTYkQGAAQQkLkeZ4Inl890rZt23YYZcojAPrQ9zt9yHqX+8ep9eso9KssQEfRH6lpz2Dk/j3g41+vQFgxAx0C6j8AAHrC9ouPJjtzlr1Qcacb7SrLFFTNGFCnlkqlntBK6EBBoR2GCyhNIlThvEuHTDtcoDolpgKCKSXUNExGr/hgSiSFEJznkOFm7/4veH48uggmCGN6oytrex05ppHf+3Cr0pm9NxIoQ/XzQAlhlB1Pm3kW5zwTUzcASM6zNIs5z8qPI4S4jmeZFqW03YwnA9H3e5tAJujar7vQr7Iw7UR/nbXv6zX2LPd/NkMd4OMPAEWA+g8AgLZ8RAAcL0qaGANOkZ/l4v1fTegwU1C1bQOa1lKVVkIHqkrpEwwXqJVwdLLrTIIxJdQ0resRAGi/tSMHF9fPrvja8JMQggkm+Gofdgfo0QqBztQFPWZqyhil7CRwSgjO81ReS30zevI8TdOAi+sGAM+d2ZaDyekmwDc8bsrGg/YZeFQxNdf+djez1bSwUYr+g5H79+hs5wAffwAoBdR/AAB0pmgT4LM3sgKTwD7s/aiOvowBlU44oc/ggHLUhw6MPVygQRKhkqaouPSBrloxxpSy/U6M5UdKKdMs4jyXk9/mUkohJT/pBULohxq4/2IwghAAIIQGO4XdDP72n3pFSMQoMw3zeNoUkuc8+9wlZaLPv5AizaIkCfIsKT/SNIyZN3Ntl+HLWdNA32/C1Fz7ddmSt8PCzssF0b9+XVrI/XvAxx8AegGkfwAA9KfaJsDK4wPkUYlNgwN0zBRU/mVXK5YGCXPqFTSAcIFmfaL2ztUKNVDeioYQQm3LcSzHMi1KCBdl3v1C5JxnQk7dxXW/yyXP08MnhBBGGcHk6+52f5sHqVFNAK0e+DGAkQaDnRBiGCZj7DBtCsE5z7i4nvt+xAjB0zTMsjjL4/IjHceZub5p2hjTdhIldnh+70xN60etzKuDEPoLqhmR6N/Zk9hI7t8DPv71CoQVEaAroP4DADAIbt4E+GTRozg4YKSZgkoqvVpqC9R1ja9d0IjDBZpQvXiNsxJhjBljruu5jnv1YM6zNI04z5HRQdP0RUpxYgjZ76VMKaW0zsbsiprVW83AuCieogYvkqqDUEops0zLNMzDh3me5HkqeI6kRKp3tR0KPE+TJIiTbflhlBDHdnzPt0376vYzDYfeUO+EupV0n2UoKVRn9+rOxxd4+tf/fTi+AAAgAElEQVQqXyO5fw/4+AOAVoD6DwDAUGgqNuGvxaSayAA0UGNA+Tm3rIZ6Ch1o1ypQUFaHVoFLBXeRzLZiVarOxoX/VFZ8QYUYU0ot0/a8GbkWAcDzNEmDPE+mnOMCISSkEELIo74iGBvMpIRhJT81r1F0x+Fnls5cHBLTfYqGDEaYEmoYpmF82UIxJnme5jyTyvWYwSDzPEnSgOdXNgBACHmOZ9suY4ySRvbkAXS10rm5W9eLPsrVtLtGJfQXVFTywTnNgr7l0b/bQNkaDHz86xUIq1FgaID6DwDAgFDmbarYEoAKtg1ATReN34uufHSzeq+dr8g2UF5JXZQlEbpUloZJhEpa0UJVV7mxLX2YCgihju34szljLMvL8lfkPEuTIEsjKQXGV902R4sUgovseDNkSqnBWIWNlNVQdMcHoIMBwDjAGFPGDMOwTOvwIecZ5xnnqZRymgEAUsosi+N4x/kVAwBjzHNntu1SatROxtgpg9lLtrcKx6L1j1boL6638K9C1GV6VdvFGsr9e8DHHwAGAaj/AAAMC1Y9qX1FMMLKbADHqAwOuFnebxocUEJ5cSrMA13J2SNJIqSk4D78fnozFVBCXMfzPd+x7SguS9yc50mc7JI0FIJf3TR4vEghcsHzPP/a5ZJSZpgW69AGAABAX0gkCcamaZmmdQicwhjneZzn6bFpcFIIwZM0TNMozcLyI03DmHlzx3IMamgh8dd65WvR8jJabODw5f5O795XZb2qpT2K/qpQHGEJPv71CgTRHxgLoP4DADA4vkcAnL+Sa7328bcYzRbWq9pkCrrhtHqoCB3oyjCgrJ5GSYRKzu+QPpIH9WYqIIiYhuV7c8eyy48UIs+yKEkCzjNKzfKDRwwXPM9TjL+0foMxgxmE0OMPAQAYDfjbvzEl1DJMy7QONj8heM6zPE+F4NM0j3KeJUkQxxtRmkqOEuK53nw2ty0bdxMrccs7U4MFSDk9uajfxFS1fk2E/mOGLvqrVPzBx79eUdoMZgBQC6j/AAAMkWspgOruc3t0qLxNX7+Vs0xBXRoDCk87p5XFT+PQga4sGSMPF2ibFnR9xUUSQm3Ldt2Z587otW0AkjRMkiDLE9N0B3xXGiClFDzjIsvyj2gJSohhGAYzKKUd6VkAAFSjpQeSEGoYpm3Zx0E/nGdZFnOeGYbTTrU6I7M8ieJtmoZXXz2+58/9hW05RMmEOXh9X6NGgdx/Wx1aaqODFv3Bx78G4OMPALcC6j8AAAPlxj0A6tgDvknq7RoDEEKypW0DGpVU0k9dhw5cu2UQLjBc+jIVUMoooa7tzqrsA8yzJNllWSylnKrYLXOe59m3CADTME3TIoROuFsAoA79PC2N34gYYYOajuWahnHInJZncZpFOc8muE26lCJNwzjeVNkAYDlfzjyfUkZphUWspvr+4O8vaP03VKClHnr5+gcm+iNVuj/4+NcrSsvhDQDtAeo/AADDpdkmwDcnqMHf//h2/qAyBRXVpLrQRuXeVCKEC9RjsL/flZsKKDVs2/VnC9uyyvcB5jyL4m2S7LcBmGK6GykF52nOU86/OsoyLdMwKSG0aA8A+G0FdMxg57YK6PE4UUINZji2YxpfydC44Fka5XkyQUMgFzyOt1G0qbIBwNxfes7so+s00vdHdcsUXMxk5P4xC/3HtPYjqkGZjUsFH/96BWo51AGgA0D9BwBg0DQzAJRwWBmULTo6DA5QbAw4oS0X/47MA0qtApfKa0C7VoESrtTRwfK3bz2hYv2UUtty5v7CcdwwikqCAPI8ybIojrecp5Qaqto5IIQQWZZwnkrJ958QQswPA0BxBEDfowAAKjBFOaDJo4kpMxzbcxznkDktz+M0DbMsllJMbDsQmWdxFK2jeCMELznucwOAhW057OwNAvr+Vdq6hqlp/VpOd8qE/gMKQp1aAZ/8tzrg41+vKC0HPAB0D6j/AAAMHfaVqr+lGo7L1dAYgNqwBxzToobfbmahBjlzOgkX6ML60MZPl9vaV/3oXqUJgolt2Qt/uZjNX99eyw8Oo1UUr7MsnuY2AELkeR5nWXL4hBDi2A6jBpIIq/4FWMbk+n6YwA9v9fQ/9CkhBmWO4zrWUbp/idIsyrJYCE5Ia/4Z+iGlTNIwjNZ5Fl89eO75/mxuWzYlROmN7H9U1KOLdrc5C2kr92ur9V+44Ab9oJf9pkrJt1QCPv71CtRv5ANAj4D0DwDAOPj6hXm+dGg9/8zF1UrX2wZ8VdmuMeCcrkMH2jIM6GIV6LCeuqhao1fd5KC9FhwXibFl2v5svpwvGWM8TUsOzrI4ijZJGjrukmCqvjV6w0We5QkXX3muGWOmYbJ9PusuNSiNHgtgNAxVRa2OkiuUCFHKLNPy3K+tU4TkWRanacR5zpilop5hIARPkiCOtkkalB/JGJv7S9/zz93/S9FuWGrRoM5fAdpq/UhLuV9zof+YTkR/1P2PtLMGNAN8/AFgmID6DwDAaChzMTtZWLRrD6hkDOh224ALrehqjdRK6EBb6vhQ9xy+ir4r4vp5/FswFRBCKKEz15/7C9MwklIDgBB5FG2iaOP7T4RNzQAgeZ7lWZIdOboazLAshzETI9yVLqTvwAYuoIVgOFA07DuMMSXUMm3X8Rhjh61T8jxJ0iDniYUmFCCV50kUrcN4fXUHYNd27pf3rjMzTesoW1qfHaXXTdJpatdW7tdN6x+Q0H/MKEV/8PEHAOAEUP8BABgTN8SYt2sP0DBT0DFHpZeYBwYaOjDhcIGrtPQDp9NL6cZUwBizLcefLTzXK98GQAieJLswWmdZbDBLN/2kVaSUOU+zPJbyq3Mt07RN2zAMQjozh0yoz4GWgDHUEMqYaVqu49mmFcUfFsE8T5Nkl2XxlPYBFmkaBuEqSXblx1FCFv7ifvnoOh4ltJsx2Ok9GJoep65zJuHaP1ChH3XyFIxE9AcffwAYF6D+AwAwMuonma24KKmz3tDcGHDOZ316hw6oMQxMIFygA9T+QlDWAU1MBZQYhmEt/OXCX/x+fSk/Pc2iON6kSejYPp5SFiApxUeKj/xjDwBKiGmYtu0wykhPouoAn6AxMxHRd6J8cybAlmF5jufY9vtmvf8wzaIkCdI0kpJPZB9gznkUb8PwPU3D8iMJIffL+/lsYVmOEuuIsmdtRHNoJ/PPyF37QeivVV1Hoj/4+AMAUBFQ/wEAGB8Mfy2YW1kmNNXl62wb0H6moOpoFDqgRj9v0TdfabhAeanjor5ur7BKjJFtWr43v1vcm+Z/HxxaC8mzOAzXUbyZzR7YlLIACcGzLM6ySMivCAnbsi3TYswgtJ+uAMUZAK6j+l1CMDEM03U81/Ho5zYAUookDZMkyHlmkpvS3A8UmeVxGK6iaHM9/4/j3C0e/NnCoKxKvBTo+wf6m+RH69p/+cJA6L+pajww0R98/AFgGoD6DwDAKDneBPh0EaLcJKDASX9wwQHlaBE6oEDS1zCJUK1jK1U+ZNo1FRBCZq5/v3zwHPeKAYCnUbSKonWWx4yZ05GgOc+SJEjSUH4aAAghju3YlmMwYzIZPwCgBbTTAa9ACTao4Tqe53rkyACQpVEUb7IsMQ1n9HOjlDKJd0HwFkUrKS8mjkMIUUJm7mzhL1zHM00LTVjf12BMdN2E3l37iy4YhP6qdC/6K75w8PEHgIkB6j8AAGOlfBPgr4XKKI0BTRvQKj2HDugdLlBShNLFdXu/nXQcct+oYyowDcux3fvFw918+b5elWwDgBBK0nAXvCXxzrZmk8kCJLM8SdLweAdgQojreKZhEUwqz2kA0BXaT1VN6Pchw5gYhuE67ny2sEzzsA9wmoZxvEnT0HXmo58bOU/DaL0L3o5nxUIIIXeLu7vFvWM5lJAb7p0GY3gI07kubTz+4dFzA8o/q8LEhP5jBuzpDz7+ADBtQP0HAGDEVN0D4CQ+QK094GRt1FmmoKNPy+rUcblVIXSgnWbrHS7QvJSufkW1VE+/+yQTTGzbWczvFvM7xv6Hp2nJaWkaRtE6jDbe7MGYRhagvW9vkuyOM12YhuG5M8d2KP0+G/c47/SQUwoYIRpqUnrw1TGUMMt0PHdmW/Yu/MiAn2ZhHO+SeMdn+dgzpMkkDYPgLQzfc172vkAI2Zb9cPc4ny1N8/vW8R3OQgMc0ro3eSSu/RMW+veUbXvQuadSHcDHHwAAhBCo/wAAjJ2amwC3unNAh8EBlQ4qMQ/ouCq7ZBto0TCgxtFfi+CMgdgPmtffzo4fmDHDc2f3ywfXdpJSA4AQeRC+B8HbYvHDYFb/fdc+Qoj9Dp/Hvq6OZXuOZ5k2bTkB0A13XMd5Dfhi/I+KpqjveEKIbdm+N/cc7xA1JaWI420Ub/I8GXeGNC7yKNrsgtckDcqPpIQs/fnD8tFzZ4wauB1vYo07WuOmVeA8wWgvDEjr1/Z+lwn9aDhb+IKPPwAAZ4D0DwDAFKhpADig+x7CJafdsF4rCSgYTuhAqWGgw5/SeiQRaolBeG3fePhN18Qoc2z3fvmw8Beb3bY8C1CahrvgNYo2jj0npOlcpD+cp0kSJMlOCL7/hBLiubOZ51umdRoBoBptBQUAUMfAhjkhxDQtz/P9mX+0DYBMsyiKNmkaWdZsxFuDZFkchqswXKXXDACMscf7p4flk+vMSK0O6bwTR3vXDpzEBeuGArl/KHJ2C/Qu9BfV2gzw8QcA4DKg/gMAMBEYkmrWMhjh4yVhG4sZBZmCKp6vwjaAhhI6IBEaWrhA7QGrUbcrp/q1tWkqoITalrPwl4/3j3/+/utaFqBgr/74s0fLmt3WrOEhsyyJ422Wxcd3y/d8z5kZH36+CiyeAKAUbRWqMUAINZjhu74/mzPGjrcBCKNVnOw8745Ss99GtoSUPI63u91rEK6kvDLdubbzeP8895cGMwptpa0N02mNf801/Uvo79qv7TDSSugvakEDlLr5g48/AIwYUP8BAJgODKGiFV7Nlc7hNNmBjtViFeXFqQkdKKum/8VhYbhA11YB9VU1XMH3f1+U0KqpAGPTMBf+3ePdk+/NkvStrCFShtEqCN6SJDBNF2NyW32DQkqRZmH0YQD4wDTNmec7jseYcebW2qNiUG+kaytxAECn3PQkmIbpubPFbOE5bhR/TA6cp1G8CcPVfP48VgNAlidhuNruXrIsKj+SEnI3Xz4uH+ezuWVaSiea8c9amqTfUYi2rv06DyZthf5j9PH0Bx9/AJgOoP4DADApLiSdaLpSwcf/PXaE78AY0F4t10u/bc1YJ7NQn2vIrpMIFVR1Rqf90eWvOy1+LNQyFVBKPXf2eP98v7g7ZLW+RJZGu+AtjFauu2TMqt9U7eE8j+NdkuyyPDl86Nj2fDZ3bAdjjDRK9KFPSwCgO3oZ9wQT27KX8zvf8w8TphA8SYIoWqdJaJne+IyjUook3m23L0H4dtUAYDD2cPe4nN/Zpk3ITV0xqqns4sVosVxoBW1d+7UdWIMQ+o9p1JPHIeyNdX/w8QeACQLqPwAAU6PlvNsfayB89H+tGwNQ6TKuN9sAGm/oQNdJhIqqqYPWK3TlPy87G/mMGo7lLOf398uH//7r3wef1kKyPA7Ct93u1Z89jXq7S5llcRRt4njL+UdaJErIzPHm/tI0LNbyBgAAoCFjfdoRumHCpZSZhu3PFgt/Qci/DxbTNA13wVsUrUdpHM3zJAjft7vfcbwtP5ISsvAXTw/Pc39pmhb5ZgvRfQRNULKvx+Ub2b9rv56DbHBC/4Gm/fnt0upvBg4+/gAAgPoPAMAE6VB1KjUGoK7Wq+VrvrGGDvSwLu0hXOBWppUQqKVdf4sqwoyZvjd/vHuae36apuVBAHG83e5eFuG7bc/GmuxCSpGkQRStk2R3+JAQMvcXnjuzLZtS2vzn6MBGJNAaeipWw6DzpwgjbBrmfLa4X9y7jrPefgjiWRbH8TYIV74/NuOolCJOdtvtSxC850cRUYUQQh7vHp/ufszcOSWss34YX+acjql8nxrc0AnI/dMV+k840f1rAT7+AAAcAPUfAIBp0pPb6ZkxAHUVHFDOWEMHCg0D0wsXUEvvvxPb6q3mpgJGqevO7pePD3cPb+v3cgNAmga73es2ePVmD65jaNCx6tnn/wnDVZIGhw8ZY/PZ3HNmjDIl1zzCjgNGz6Am/ZaglDq2d7d4mHv+Lgg+J0wZxZsgfIvirW3PCDF6bqU68jwJgrfN9lcYvUtZ9nZACM1c78fjz/vlo205lClbsn7NljACb6HaW6aFd9HYtX4Q+gtoLPqrbRuI/gAwDkD6BwBgymiQd+JrRdV1pqCbGHjoQMFxAwgXOHD2hSajolf6dxm/1AJGmWNa98uHn48///z15/tmXdYIKaN4s93+nvvPlulROh6d6xOZ5UkUb6J4I0R++NRzXN+bu7bLqIERaXQ3tFIyAB2AKVIPqjyaBjVc27lb3N8t7v96+XWwmCbJdrt9CRfvM+/esrpzfm8VKXkUbzebX5vtrzQNyw+mhDwsH348/vRnc8MwcI0VDzwI1+jCVb8KGueLVAgI/Ve4UfRvr1Ug9wPAKAH1HwCAiVPgedrzmkePTEG3omPoQN2Vs0bhAperbxIUoecQ6oMW0wIxZiz85dPDj/vF3Wa3vZYFaLPdvmx3L667dJ2FNj/V1SClSJJdGLwnaSDlR09SQmbubOEvbdulzTcAgDENAErpcg7CBFum7Xvzh7tHz3FWn1mAhOBxsg2Ct3j+bJgOwbTDRrWEzLJ4t3vdbH8d50O7hGPZPx5/3C8fXWdmsK8EcaDvX6U3V/1jero7OiwgQOi/QnEPVKocRH8AAOoB6j8AAECB8HSytOpzOVSQKUheWvlpu2zrLXTgUtG1DAMahQvcilLjQVF5U6Bin331jcFM1/Ye756fH57//P1XWLoVsJQijFa77cvcfxpfEECep1G0CaP1sbsrY2w5X/qzhWmYlJCS0wFgmuig4nUDRoRSNvPmD8vH+Wy+/coChJJkt929LsKVYy9M0+23nc0RgofRZrP5e7d7TY/yoRVCCVnOF0/3P5azO9uwyMXV3whpdqnjlPUv0e+wGKjQ312nNRD6G51QpUxd7w4AAG0A6j8AAACqkgKoxqqrlTXVsTHgGHz83+GJ1D2EDhSWO6ZwAYUUXYnK3yG3lDWEXsXH/zRNe+HfPT38XMz+b3JtK+A0Dba739vtk+ssnFEFAcg0jYLwPQxXx9tdOpa19Je+51uGRcnNjr1DGAyAdozmodIGZT1KKXMdbzm/f1g+/nr9zdN0/3mWRUHwtt29zrwHw7DwsIMAZJqGu93LZvsriteHcKhLWKb58/GP5/sfM2/OqKH58FXUup4ucghvlN7vf1EDQOj/RJHQr+DM8mJ1vVMAALQKqP8AAAB7WtkD4Hjd1vpaqzxf5LdthgdmHug0dKD9cAFt+7lPbumUlgwPLd0XjDCjzHW8h7unp4fn983qIGkVwnkWhqvN5u/Z7MEwXUbNkoMHBOdZFG/C8D2ON4cP9/l/lvM7z5kZRp1wh96lEAAYOHo9Q4QQwzCX8/vH+2fvP/8v/pwtpZRRvA6CtyBcWfbMNAYcBLCf5Nebv3fBa5Xs/3f+8ufTP5bze9MwKW3R8qG1u31tBrLk0rX7LnsbadmxIPRfLF/L+wUAQJeA+g8AAHCg9U2AOzUGnFNiHoDQgSqoCxe4lESovCqgFY76+srNbGAqoJRZpn23uP/j+Z9//f4zW72XBwFE8Wa7+73Z/nKcOXOWCI8gMY5MsygI3na71zSLDp8SQpbzu+Xi3rFdAvl/gAGjrXw3MDDCBjNcx3u8e7xfPqy2m8NsmefJbvey27247pIxa6A7AUgp4mS32f7abP6Oo83V4y3T/Pn0x4/Hn/PZwjStJlWXjlGNB/Bgl0Qa92kxF1379bsFvQr9jSrveFSA7g8AwB5Q/wEAAI5p3QBwjEa7C5xWP4nQAWUNVppEqOjrm1uq7b0YPM1MBZZlL/y7H49//Hj8+b5ZlxsAhMiD4G29/stz703DMQynZpu1QQgex9vt7iWM1kLkh88dy75b3M+9hWU6lBqd/zSGx0V/BqehAdcpvqmfjyNF1LPcu/nD0/3zn7/+3EUfPvJC8Chab7e/XffOMl3L8gY4PD72/l2v/9oFr1letiUM+nT//+ePfz0sn2zLKU+SdrkvOu+l8c6sgxtwJQzCtR+E/pq163QTAQDoF5D+AQAAzmH4+75qssPVU8/BAeWMMXSgcF3erlXgUq1XaLI/WJ0L0vN+DYwiUwFFxLO8x+XTz8c//vP3v1/Xq/Iy4mS3271sNn87jk+ZOVBf109klsVhuArD1Un+n/nMf1g++rOFwQzcw+/lMYk5ANAFBc+M6tcGJdQwzPls8Xz/fLdYRkl8sJjGyW67++26S9ddGIZNSKeuG83hPA+j1Wr953rz9/FkeAmDsefHH88PP+ezhW3aBBdOWSrmsWm/+0f/JtDftR+EfiV8NEab2woAQO+A+g8AAFDI6c/IU3tAjfVUrVXh+Un6LuTGFTrQrlWgelnKfkw0MTiA8UAxhBDTtJbzu5+PfzzfP2+CXZbnJcdLKYLwfbX+03UXpuna1kyzn5k3IASP4u129xp9d/8nhNwvH+6WD7btUDowIQ8AtKLm7KDnrI2RwQzfmz8sn57unn+/vfCvnQDEbvfq2AvPu7esmWP7A5oYpRRxst1sfq3XfwXhuxC8/HhKyMPi/o+nf9wvH11nRmmdXVI+665/6kAZzLBQjeY79ILQr5YOLLIAAAwXUP8BAAAucUV+OvFOrbS+kt+Pqrt47HQLXIWMInSg9SRCaovWwnhwoP972H8LjmCUOZZ7v3z8+fTHX69/b3bb8kRAaRput79WzsK2fUYtxga6G7DMsnif/T+K1vJoVpy53uPycektHcOhhFwdc1rdTWCU3DbxwYhsDUqZaVjL+d3zw4///Pr37/fXr50AeLIL37bb3667NA2bDmabdJmm4Xb78r7693b3++revwghx7L/ePrj59M/597CoEax9/9H2Qrb2TN6yqz9Uq1Pvh/V95AAoV8tF1vV940GAEBbQP0HAAAo4Tb/08NSrHTpdbIcr55EvE5LztF3WTj80IHWwwXq0bAFin/39P8z6kIL+olvwBibprX07/ZbAe/CoNwAIKWI4s1m+8t1l5Y18+gSDzAREBd5FG22219B8JpmX5oXJeRuvny8e/I8/yP/z7Uubms89T9Oge/0P5MCPYMxNg3Tny2e7p+fH55X2/VREICM4+1m+9vz7m3bd2yGh7BNep6nQfi+Xv+5Wv8Zhu9XRzkl5PHu4R8//vV0/8OxXUYNbZ8LmEHrUaHf9NL0L9HRAAChHwAAoDKg/gMAAJRTMwFFNUvAybFtGQMu11eAvovJwYYO9BAuoBYtgg86oGF8w5VuKvmaUea5s8e753/+/K+X1cvv97fyovI82e5+27Zv277BrAFueinTJNzuXjbb30H4duz+71j20/3z/fJp5vqMNUht0ZzBPJ8AMDZKpjODGTPHe7h7en74+dfLX9nq/WAxTdMgDN+329+uszCYbRh2N62tjRBZGK5Wqz/fVv/e7V6uJv9BCPnu7J/P//rj6V9zb2EZVpn7/+0M6y0yIEaj6V+ii5EDQj8AAEAzQP0HAAC4StMM1Dfm7r9gDCgvUSlTCx3Q0DBQBX3vxQlaNbTdZ+dK6SXBK5QQ27TvFw//eP7Xr9e/tsEu/nRrvUSS7DbbX449tyyPUoMxq1ab+4HzLIrWm+2v3e41y+LD55SQxWz+dP9jPluYhkmG4MALAMAx7SQ1/IIQahjW3Fs+3/94unve7Lb8aLYMw/eP6Ch7RinTeTdgKXkUb9ebv99X/7Pb/s7z5OopBmPP90///PFfe/f/W7dI0VPxHC6jl/Uv0e5AAqEfAABANSD9AwAAVET9r8fjZd8NmYJOz+nBPDC20IEvw0BB2/W9HITQRIwHymnvym+4H8WHGoY18xZP989/PP3zr5e/s9VbeSIgIXgQvK6tmWV5hmF77p3OUtd3ZJqGu+B9t3uN483xFwZjT/dPT3dP/mzOKNP0hzsAjIJOMg62AqOG47gPy6cfDz/+evnr2Fya83QXvG22v2x7bhi2xtukiyQJttvf6/Wfm82vMFpfPYESMvf8f/z414/HP3xvbhkW/u7/r+d1DovJavqXaHFQTVno73TY6NkxAAB0x//6r//uuwkAAACDoV1N7WRddsuasMQ8AKED1fhqVkFCoULDgKYXciNgPFBP9X650PsYYdMwF/7dz6d//PH7P7twF8Zx8aGfZFm83vzNmGWaDqOGbc+HkvM6jDa73e8gfMvyb+7/85n//PjzfvnoWq7BDE131AAmj66Ciq7tusqNTzXB1Dad+WzxePf8sLjfBNsszw/fJsl2s/ll275luYyaWkZHyTSNt7vX99V//j9799kdN7ItaBo2LT0pkTKlOnV6eryf+dc902N7bK/V3bNW/4Pxpt2951SpSoYmyfSJ+ZASlcyERwRiR+B91r2nJIoJBCICyMDeiMDXu78+Pn0pUwX9uPf21Zv31z9dnl4N+8MotO/VLy0rfT4c/GInv2Z0XT4I9JvbPwAQ/QeASlp9qFZRDJ2pA82kJgZsni6gkMJu0p1KeyH7sOMwHg2OXl/c/HTz85e7r/PFr/mTADzPm83uHx5+7/VGcTwIgkj+ywCSZD2fP04mnx4mn2azh91/iqPo1fnr68s3x+PTOO5nJTOKDk9jt2qnx4puP/dR/RWZuI77vhdH8Wh4dHl29fry+vcvf9xOfswlWq+XT09f7+9/H/SP4ng4HoXCZkcl2xf/3t7+9fb218fJ5/V6WfiZMAiuzi5/evPz68sb8+9H0abZ6Zf96Y6ONjyv5Sua0li/zGsxgX4AFiH6DwBVSblvVPd8ffX0AFMHvMLpAp3OCtQj9j7GVMP5vuomhVwAACAASURBVN/v9U+Ozt5ev/989+nh8WE3qpUqSTaTx89hGMfxIAx7QRDG8UBy1S6X88fHL/cPvz8+flkup7v/Nh6Ob67enJ1cDPrDKKwd3tJ47GKrFZ3WyW+aMAgH/eHZycXry+urP359nD29mASweHyY/NHrDXu9URTGg8GR70t5Xn693r74969fvv7tw+T3+eKxzKdOj45/evPh/fWH85OLfn8QBlImexGyb5+Ub6L9NqpZLimH85LRQL/iKpFZwwB0+6dE/wGgOikJgBxKn69P2xhTB3J8K0TWIkJepWKKOKLOU9Wja7RmFEaj4fjVxfVPNz9/uf28F9VKtV4vHyaf4ngQx4MwjI6PrsKwV6/Auq03q+ns/mHy6eHhj6fp7e4/xVF0eXpxeXZ1Oj7txwM/PadWDje7qIorr1RZZ7Pv+/24dzw+uTp7/eri1afbz7vp0iTZTKd3Dw9/9HujKOoFQdTvDz3PfNB8vV4+Te9u7/765evf3t//NpsWpHi3Br3e21dvf7r58PryWsnj/w2ukYTstZD+raXi0X6Zx+hMoF9m9QIwheg/ANRjQQIgH1MHDMh67XCOFzmD9A1V2CcEKN/9n9vueRLA9dXbd9d/fH24/Vz0NmDP85bL6f3DH3E8iMI4DGOZLwROks18/jiZfL6///j0dLu36sV4MHp18fri7Go4HMdx7De5dHAmAKa1EI2Ko3jQH1ycXV5fvvn9y+976dLVaj55/BxF/Sjqh2EvCALjs6PW6+V0end39+vnL39zd//bdHaXlLhabRf/eX/z4ebV25Ojs35vEBRdH7P/uVsvsDXOjphscTdwIdZPoB9AdxD9B4DaIocXPe/m1AFprfBNerFaSh5U/m0otdt2cRgN+8Ors6v3Nz99ufv0NH2aTJ8KtzCb3d3dxWEYh2EUBOFweBqIWfLC8zzPS5bL2dPj1/v7jw+TT9PZi+dewyA4Oz59dfH69Phs0BuEgaiSAx1iV3SpF/ePRsevr26uv/z29f7r3eRhN106nz9uZ0dFUT8MwtH4PI76hg4xWa9X0+nd7d2vn7/8ze3dr5PJpyQpFf0/Oz798ObDu9fvz08uB/1hGIal4vt8o+thxwmiIaavfUOKmAv0E+UHIALRfwBoIlI2cPQzh3Qy79RMTh3I330zdrVCKY2TBwe/TfLApDiKx6Pj68s3H958fXh8mP/2t4ULASVJ8vj0NQiiwA/DsBf4oahlr1erxdP09u7h97v7j0/T283mxeEM+4PXF68vz16djE96ce/w+VY6GMQiUmNQFEbDwfji9OrNq3efvn56eHp8OV8qmc3u7u7CIAiDIPT9wB+dRgZyAMnq27P/Hz9/+ZuvX/8ymXxKkoJ5XVvD/uCn63cf3vzp5tWbk6PTftxvtDwa0lhzChe0u/bjEFVRBPoBYA+hfwBoTt1KGtkDU98rCpILo33qwLettJobSN2qzPpXqUny4PsvNpx8UIn7LeJ5QRAM+oPzk4v3Nx8eHu8fp49/fP1cuBDQZrN6fPriB0EYxUEQ+r7f7x/5vvllrzeb1Wz2cH//+93dr5PHz/P5i5dehkFwcXL++vL64vRy0B/GUcoLDAzeJFvd3wguwG3f1kwbn7y+vHnz6vev91+/3N/uXio3m/V0dh/efwyCyPd9z/OGw9M4bjMHkCyX8+n07u7+45evf3t7+5fJ46e9DGiWQa/35urm57e/vL/+cDI+a/pyFKfZeq1r8VF9A1tXgUB/HVwlgO75px+I/gOAAm0tpZ0T67btpWsuTR3oaFagvIb5g0IHWyq36babSPn+wjAajY6uzl9/ePOn+8nd5OmxzEJAq9V8MvkUhnEQRL4fnHh+vz8yOw9gk6xn88nD5NP9/cf7+4/T6d1ebQ37g9eXr19d3ByPT3pxv9Hq/xoIKw6AgzXTBqPLs6t3r3/6fPv5cfr0NJ/t/vJqNX98/OJ52/i/lySb0egsivotJEeTZL1Yzp6ebu/vP369/cvd3W+Tyae9159kCYPg8vTiT29/eX/z88Xp1Xh4FIXi3uzShLOXVtMx/TZ2oIEDgX4D1c7dCADP84j+A4A6Au64mDpQaWP6pw5U2ozMhrBGzepr+/XT9ZJ0Of8W+H4v7p0cnb26vP7p4ef7yf3ffPzb2WJRWLTVav7w8Lvv+dvw1on3qt8fm8oBJMl6Pn+cTD7d3v16d/9xOrvfe/R1+/j/9eXNxenlaDB2LMIFdFz1C3HpT3y/evqe348Hx6OTV+fX769/unu4nX/6uDdfarmaPT59CYLQS7xNstkkm9HwNO4NAl/fBSdZr1eLxdPj09f7+49fb/96f//x8elL+ej/+fHph5sPP735+fXFzdHoOHVqVMtsDCsrYzqs70zlE+ivgxsJoEvCTbUHFP6XP/1LTSUBgA4SH5DqxtQBr1qZq+QG2o4VVyCzmVClYfLe15j/3oUoCIe9wcXJ5bubnybTh+l8+vHLH4UvA/A8b7F4enj4w/cDL0m8JDk+ftXvj4Og7UtZkqzn86fJ5PPt7a+3t399fPyyWOxPYhgPRzdXN9dXb0+Pz/r9fhCYX7AIQK2vrbQPtfIdFgbhcDA+O7l48+rd1/svD0+PD0+T/RzAcvow+X2TrDfJZrNerdfL0eis3xuFYax8EJAk69VqMZtNHp++3N19vLv/7WHy6enpa8mVf8IgOB4dfbj58PPbX15f3ByNj3u9vl9rbpQzUWMtTMf029iBUSlHZ0+g370ov9udDTAuqBi1V4XoPwCoFekcNWke7jk0dcBTtrJQ1nr1bScGyiB54LL9Fkpp7TjqjYfHr86vp7PpdPo0X8z3VrjOMl9M7h88z0uSZLNJNsfHV4P+cRhqvZq9sEnWi/njZPL57u7Xr7d/nUw+TWd3e78TR9Hl2cWb1+8uz65Gw3Ek4BFXoAkBXxp76pbIqu8P3/fjKD4+Onl1cf1+cvfw+PAv/vov9xYC8jxvuZxNJp+8JFmt5qvVYrVajEdn/f5RFPWCIFTSekmyWW9Wi8XTbHo/efzy8PDH3f1vj09fp9PbJClVp2EQjAejDzc//en9n99e/3R2cjHoDYOM1Yrk9be21O+fxPTVM/FQP4/zl9LB3gjUYCp23xzRfwBQTutjs0pXxKmKqQP528haSsiSAXXDYsps6A7qx73j0cmbq7ez2dNsPpsvFvdPkzIfnM8n99/Xu9hsVpuj1WB4Eoc9T//K15vNaj5/nDx+ubv/7fbu18nk03R2v/c7YRCcjo/fvXp3fXlzenQ26A3C+gVT31u72f8tubbp1qAautlvBAiDsB/3z47Pb67e3j/eTZ4mv37+eDhfarWaP0z+WK0X6/VyuZotl9Px6HwwOI7jQRj1Aj+o2/pJkiTrzWq1nM3mj9Pp3WTy+WHyx8Pk02x6P5s/lN9QP+69e/3ml/d/56ebn6/OXo2H414U1yqSMIJD9haUwITio+Zx/hxE+YFW2Bu7b47oPwDoEDUfWtUdB5pLD3Rj6kCJApdc00DB6kTSMPlAiCAIh4PheXKxuP5pNp8+zR5Xv/7N4cOtqeaLyeZ+nWw269VitVocr5ej4WkcD1Q97pomWa2X8/nj4+OXu7vfbu9+vb//+PT0NUn2Zy3EUXR9ef329fvL01dHw+MoiEVFiKS9i7glnLqwVi/uDweji7PL97MPj0+T6XyaOl9qvV4+Pn5Zr1fL5WyxeJrNJ+PR+XB40u+No7gfhbHvh77vl7uqJF6SbJLNerNaLeeLxdN09vD0dPv49GUy+fw0vZ3NHlareflDGPR6b65ufnn35w9vfn51/vpoeNSP+1XqQClJF2Qd7CilUqUO2cy3AIH+Yh3sseiCLkfwmyD6DwCaKJgBkDpoazxoFJcesG7qgLp2qTIs398ByQMtBPa32qIwHvSHF6dXs+vZ0+xpvlj89dOvZV4I7H1f+Xq1XqzWy+VytjqZj4Zn/f44DGNf9VSAJFkvV/P5bDJ5/HJ///Hu/uPDwx+PT18Oo/9hELw6u3z7+t315Zvjo9M4jsWt/u9SBwI6wPf9fq9/Mj59fXH9NJ1sL5WPs6fDHECSbKbTu/V6uVhO5/PH2WwyGp4Oh6eD/jjuDeOoH4ZxEIS+H/h+4Ht7+cAk2Yb9k2SzWa/Xy9V6sVg8zeeP0+n9dHr3+PR1OrufzR7ms4ekynVk0Ou9vXrz5/d/3i79fzw66ddY+r/mhUvCl3ZZNpVVP8Ex/VR2BvrbrUB6OOxCBL99RP8BQB9dSwBpjt8bSg/YP3Wg3FN/Le8wa8cOJg9UkXm4tXtOHPfGw6PLs1fzxXy5Wq43679++q3MC4E9z1suZ5vN5816tVxOl8vZ4ni76sVRHA/DMPQ8BQP3JNlsNqvFcjqdPjw+fr6///3u/renp9un6dfDla+3i/+8ff3u7ev356eXo8EoDMW/ax1ALW1eiqMwGvaH24WAZvPZbD79V7/9bcZ8qWSxeNy+DGA+n0ynd8PhyaB/PBgc9XqjOB5EYS8MoyCIfD/wfd/zfX+70M/2avc99L9czubzp/l8sg36z2YPs/nDfP5Y8n2/z0b9wZurmz+//zu/vPvz68s3x+OTfn87VWuv1Kmflvl194P08skjY/md2uyM8nuuPs7P+YdSgg1dxQ5E/wFAKzORqU6lB9yYOlASyYMuq1SRuy3ke36v1z85Ot1s1uvNar1Zr9ar379+KpkDWK+Xj09f1pvVcjmfzyez48nR+GI4OOn1R3HU3wa5Kh3Ij0Imm81mvVrN54un6fRu8vhl8vDpYfLH0/R2Or1P7Wb9uHdzdfPu9ftX59dHo6Ne3Mt6xSUAg6y78PueH0e98ej48uzVYrmYzaeL5TJnvtRms5pObxeLx+3C/f3+Ua83GvSPorjfi4dhFEdh73kqgOdtH/zfbDar1Wq5Wi+Wi+liOd2uIzSfTZar+Xz+sNmsqxb7R/T/7Z9vrt6djs/68SD0w++XTwPtYF3Ty2fbo/qHdHUKAv027QfiEcd3G9F/ANBN4qOpDqYH7J86UJITyYP0H6naG7b26iz0g2F/4B2fbzbrzXq9XCw2m/XvXz8fLnCRKkk20+nterVYLqez+eNs9jAanY1HZ9uYVxT1wiAK/MArtfh14nneJtls1qttFGw2nzxN7x4fvz4+fp48fp7NHhaLp9RPxlH06vzq/fVPN6/enR6fDfs8/g8HccEzJQiCOIqPxyeL5Xy+mC1Wi9V69fvXP3LWTFuvl9Pp7Xw+6c0ncTyIon4Uxr3eOAyjMIzCIPaDIPDDxEu2+c7NZr1eLVbrxWIxW61my+VsuZqvVrMaof8wCIb9wZvL61/e/Z0/vfvzm6t3pyfng94wCiu/+JcuZwSP6gvazR4Ho/zt7goCEM3HLqL/ANCCSNkgUsZzIC6lB6ybOtBQwx5kLH9QYd+stJonCuNB3zs7uUiSZLFarDdrz/M+331dlJsH4HneYvm0XM2Wy9l21Yvp091weLJ9AWbcG35f9SL8turFdtkLz/e2615/e+XlZpOsN+vVar1cLWfzxdN8Pnl6unua3j493U6nd7P5w3q9TN17GAQXx2c/Xb9/+/rd1dnVyeg4juJAXjO4d+lQQlw7wT0qzr0oiHpR7/TobL1ar9fr1WqVJJuPX/7Iv05uNqvZ7H4+f/D9sN8bBcFtEEZhEAVBtEnWQfDtefz1ZplsNuvNarNZrder1WpedbWfZ2EQjAejt6/e/Pzml5/f/unN1bvT4/NhfxQd5EQ59dpk+aP6Tsf0UxHohyWI5qMJov8A0A51T6fmD1LdTw9ImTog98ZNMzGTD3K0OziWk5YofdxxFA/7w+Tk4qf12kuSIAg8759VygEkyWY6u1ssn+bzydP0djg4HQyOBoPjQf8ojoe9eBBGvTCMAz/wg9D3fd/zEy/xkiRJkh+h/9V8sZwt5o+z2cNsPplO72ez+/l8slhOs/a7Xfr/3et3729+vr64ORmfxXEvPFzkWgBu0YA8la+IbZ9ScdwfeX5y6m2SZLlabTabJEl+//qp8DqZJEmSrKaz++1fAz/0gyAIws1mHQTRZrPargJ0+GqTqsIgOB4dvX/97k9vf3l//eHm6u3p0dlwkBL9R23Vup3ooWEbZ5DoLz43Hw7RvJ+XlSa6fa3lJ9Qr2kD0HwBa09bNmA3pAa/RIFzK1IH8eQPaimK35h3Q5lrVf/olmX/Z53u9uO95vneWJF7i+4Hv+b7/zz/dfi6fA/A8b71ePk1v54vH2WzSiwf9/lG/P+7Fwzgexr3tCzDjMPz2Asztiy+TZL1er9bfo//L5XQ+f1wsptPZ/XI5Wy6fcoJi22dd37x689ObD9eXb85OLvr9QRz1yhcY6C5jV09bQxu+50dRPOyPzk4u1uvVNrDv+8Eft59y1gI6tEnW3nq9ndKUNbGphl4UnR2dvn/97ue3v7y//vDq4vpkfDroDYj+N+1wNo0zOh/TT8Xj/DVk3emgFmL6kIboPwC0Scb9mIz0QOGu9KQHNNwQFIRYs/7ScMOdJnZALa/JitNTcdQbDY6uTr3AC3zPS5Ik8P1Pd18qxba8H4tfR7PZQxQPoqgXhf3edi2gKN6uBRT4gef5m2SdbDbr9XK9Wa3Xy/l8slot1uvlYvG0Ws/zn4cNg6Af924uX3+4+fD26v3l6eVoMO5HvVarXmz/gz7mz2263Q8t10XoB/1e3/e8wPO2M5nCIAyD4Pevn+bLRclXp6gvVRDEUXRxcv7+9fuf3/zp/fWHq/PXR6PjftyPosrr/kvQpZB9GYT1d8hoXDEPUDVGoL8ZIvuwDqF/AGhfZMGzz46nB0xMHai7eZIH1hF1Q1CyD/ieH0e90fAo8bxNkvh+GEdxHP2rj19+rxHb2mxW88VqvngMgiiK+mEQBUEYhFHgh0EQJInn+/56swr8YL1Zb9bLTbJer1fL5TRJine0jf6/ubr5+c0v769/fnVxfTw+68cD32938R85yz25RtQJBJVsb9rAD+IoHg5GZ8cXSZL4vh9FURRGf3z9NJk9tZ8DCINg1B9cnV39dP3T++sPb1+/vzi9PBqd9Hv9NhdDI2RfETH9HVJbX8yNTmNE+asjsg8nEf0HACMUzABofV38KvsQM2rWkB4wfadC8gAVVWh234/j3sg78jw/CIIwDHu9fhxFf/3023Q+qxfb2mxWi8WPdYR8P9j+X5JsfN9Pks1ms6nU174/+3/94ebn9zcfXl++OT0+7/X6odyVLriNhDJ0JuPCMOr7vu/5QeCHQRiFURzFvbj/+9ff7x8fKi2b1qgYQRAGwdnR6fXF67ev37999f768ub85GI8POr1+oEflNlI/e7E+GAfMf0dVnUPHufvIOL76CCi/wBgit5AldGH28vtQ8Zwu1ZVlCm61FufJsmDlL+r3RvM8z3P9/xB3A88LwrDKAj7cT8O4yiM//rp14enSfPnW7evu6z98W30/+3VzYebnz+8/dPN5Zvzo7Nhb9CTvfQ/50J53JRDvjAI+72B53uBH4Rh2It7/bg/HAw/fv7ty/1tC8sBhUFwNBhdnF7cXF6/uXp3c/X26vzVydHZoDfo9/r+9+h/5tnEJekbEdcbEYXIZ3+HEfNgUmNE+Usgvg/sIfoPAAaZfFLVfHqgcDcWpwfKbDif4NssJh90Ri/u+37gn/lRFIdhGIVRP+795Y+/3k7uWnu+9dA25vX64tX22f83V+8uTi+Hg5H8F/9yJwo4JgiCQW/ge/7zDIDhYHQ0PBp//u3z3efJ9HG5WulIA2yToKfjk9cXr64vb95evbs4uzo/Pj8enfbifi/u+Z7v9DeoHVdTC0ppQyeRXY0E+g0jyg+URPQfAMwSu1QF6YGy+9FWFSQPPK9Z8qAGwRVnTBzFnucFx77v+1EY9XuD4WD4l9//8sftZyOvu+xF0dFwfH15vV3q+vry7fnJxbA/6sV93+cmEIDntRkgSzzfCwbxIPSDwA/iIB7Eg3F/fDQ4Oh2f/HH76fbhdrqYqUoDhEHgeV4/7p2Mji5OLq7OXl1fXr86f31xcnVydDYcDOOoFwt95a+V12crC23DUMa2iiXKbxhRfqAhov8AYFykc4Cn8Q6gsNDm1xeSkR4oQ0NdNSyU1HtH/eUqqDhDdx/G2yOOYt/3z46DKIziqDfsD0eD8Wj4l4+fP06mj20udR1H0en45M3VzbvX79+8ev/64vr85GI0GBP9B+zS6HQ1fk084Pt+L+r5fhAGYRzFg95gPDo+OTo9Ozr/dPfH14fbu8ndbDGfLxee59XLBGwvgP2odzQcnx2fXZxeXp5eXp29Ojs+Pz06Pxod9eJBr9crueh/ycNSt6n2WFnoQvL6/CEnap5Av3nE+gHliP4DgARaZwCYfIjf/AQCGemBMuRF6x2dfNCcoYNrMy2RdYhRGPm+H/hBFEb9uD8ajsfDo6Ph0W+ff7t9uH2q+2bg8rbL/pyfnN1cvnnz6u2bq3fbpa6H/VGv1/NFndKANkI7utMX/rJ8f5srDYMoiuJ+fzAajE6Pzs5Pzr/cf7mb3N4+3D48TWaL2XQx22w222tmzpVz+7B/GARBEPSjXr/XPx4dnYxPzo7Pz08uzo/PT45OT8anx6OTfn8YR3EcRl5mHlRox9kSXTh9bDhrZDeN4NJ1LtBf8+B8G84CwHZE/wFACINLAJEeyGbVIF1YtF5YcbpAabXlrLkUBWHQ64dBEIVRv9fvx73xcHwyPv74+eOn20/3TxNNKwJtl7o+GR1dnl7eXN3cXL19fXF9fnJ5Mj7t9fr9uK98j1rRy/dYdblVhE7griiMgiAIgiCOeoPeYDw8Oh6fnJ1c3E/uHp4e7ia3k6fJ4/RxNp/OlvPlarlar9abZPPyjeiBH4TB95cKRL1Bvz8eHB2Njk7GpydHp6dHZyfjk/HwaDgYD3qDXtyLwjgMwzYPs4un7SELT2TxDSe+gLs6FuX39/5bj4VnDWA1ov8AIEekYCSkZbBJeqABe4b/wqL1yiuO+4xmDuov8IJe1Pe9IPTDOIhH/fHJ6OR0fHZ+fP7p9tPXh69q0wDbJS+OBuPzk7PL06vri+vXF9cXp69Oj07Hw6Ne3O9FPesauVQvP/wl2w4TEMDMl3Hgh704DIMoCuN+bzjsj49GJxcnV5Onh8fp5HH2+DSdPM2epvPpbDFbrhar1Wq92WySdZIknucFQRiHURTGcRT34t5wMBz2R+Ph+Gh4PB4ebWdfDXqDXtzvxf0ojMqH/u0Zm2jj4oVUdrPKLl1JBPr3uHgeAU4i+g8AokQKRpDJ8/+kMZAe8Ay+fkDEoLQb+QNhyYNUMqtSRCdtIo7iwA+i8NsaF+Ph8dnxxeXZ58+3f3y++3w3uZtMH6eL2fr7GhdVhUGwnWdwNByfHp2cH59fnl5dnb++PL08PTo7Gh0P+sNe1IuEvuhSBev7CHBI5gVZlzAMwyCMwigK40F/sFgujsens/l0On9arhbT2dNiuZgv54vlfL1er9bLzWaTeJ7veUHw7UUCvbjf7/V7cX/YH/biwbA/6PcGvbjfj/thGFUK/VuskxdD2aeKvNJp6yTyDlUl//l/UnXy1ANcQvQfAKRRtgRQ5gjOQHqgcLvdTg8U6kD+QN5rD9oktoUq1GsYhr7vh2EYR/GwPzoaH58dn52fnF893H69//z1/uv908N09jSdz+arReFq19ulrrd/iMJo0OuP+sOT8cnJ0en58fn5ycXZ8fnJ0enx6GT74H8cxUGg8EWXgEBiLxR2a7VafS8KwygIN1Hci+JNf7QYDNfr0+VqsVgu1uv1cr1cr5er1WqdbJLvl0c/CKIgDIIwCqM47sVh3It7YRj14l4QhOH2/ySH/i3/hq7H8tNVXvFze5G84srF4/xANxH9BwCBWnoHAOkBwztuE/mDdjnSbTyvar0GQRgEYeCHYRBFUW/UHx+NTy9OHu7PXt0/3t9P7h4e7yfTyePscT6fZa12vV3qOvCDMIz6ca/f64/6w+1iFydHJ8fj05Px6fH4ZDw8Gg3G/bgfRfH2NZuqj90gW3qQS3UOw7rVmXwv8INe0N9sNlEYJkmy3mxW6+V6s95stunRje/7SZJskk0QhF6SBEEYBEHg+9vLbBiE22kBQRBoufrZchFSzel+KO/giOnrVBDo7+o5DnQT0X8AkMngS4B/ID1QZsfN2TH87kD+QC2ZR9xaZwvDMAzDKIx7cW/QH44H45Ojs+ns6XE2eXyaPM0eH7+vdj1fzFfr1Wq9XK/X62TjeZ7v+cG3aQS9OIoGvcGwPxoORqPB+Gh0PBqMtnH/QX/Yi3txFEehkw/+y+xBEIeOYrvty4E9z4uSJN7ESbJJkiTxks0m8X3P8/xNsgl830s83w88L/H9IPAD3/cDP/jR/HaMJHTp9lkg7+iJ6beLx/kB5CP0DwCSiUgA5CM9oEon1r0hfyBDyxUZhWEUhnEY96LeaDBajU7my9lsMZvPZ/PlbDqfLhbz+XK+XC2Wq+V6s042ySbZ+L4fBmEYRlEYbl9o2e/1+/Fg0B/2e/1hbxhF8aA32C6F0fKSF3acbvbgzIZcrZ/tvueHQeh5P65pSZL4vv+tJG6dLW4dTaGsw83qZPKqh5i+ADzOD6AGov8AIJwFCYB8pAdaQ/5AO25tm9nOBog38Tpa9XuD0WC5Wq9Wq+VitVgul6v1crVebZe8WCebJEk8z4vCyPe8KIqjMI6iKAqi7cP+wbeXZ0ZhGBl56p++AOhlx3dSS74t7CPjuiOjFK1p53DNVWrRidax5paF1/ACUIXoPwDIZ30CIJ9V6QEl5I7WO5E/aEjmQdp2dx4EQRD0tmtcbDbrTZKsN6vNJtls1uvNervqxSZJvCTxPM/fLmmdeEEQhOF2qetvb7nUtdo1YC+Z1yjUwtWtrs7XHDF9qzi8bg89DRDinxD9BwAbOJ4AyCcsPaCEs2H25rUu99iEs7PitmtchEHo6RvX4AAAIABJREFUJV7i9bbvt9xsNkmS+L6XJF6SbHzf37760vd9//tS19sfyj7N0YydXRpu4NJigru13tbVzN0adIerj/PT9wDhiP4DgC06nQDIVzM9kPdJ+VwOswtpFrkV5Crf8z3f9/3AC3aWvP6+5nUW2gmwn5DLPqpzuukqfr84XRfuKN1MmtvT2tEL/RywEdF/ALBIpPRJ18SzeORZTV6tJa6mB8pwdgqCKjLb3/16P8DyPsAhzgr70YYaELLvGD/1jyV1cERVGqcG4BKi/wBgl0jZONXf+f90pAc8z2ujCqrtQdZgnPyBGbJ6Ab5zvkPT8eAK+rIwhOzxUuWYvvNfwDpxQgHOI/oPANZRtwRQ/kCZ9ECLqg27Dyqd/IG2o6KDoxpZpxfQKrq/UeK/r+gfIKZvHKch0E1E/wHARm29A4D0gD3IH1i7/Xo4sQA3yLzCoAp112N6A2zk7/23EEMY/eReTGh9oHX/5BdC/wBgKxkvASY94JCG+YOMnynZGVJRiQC6jbA7oA0xfVsIvXwV9wehBQfc809++RemiwAAqE9GAiBf4cjPJz3glAoD+Yb5AyG4cwFghXYvr1wagTLaX7WwWkzfvmGZy+ReVwv6SUHB5R4X4Ip/TPQfACxnQwKgUMEEAtID3WLfPUDd/qe339pXjzuKJxWhk1y/1tO1ASv4OX+rROc1jetJO7pVzyoe5+9WjQEyEP0HAAc4kQDIR3oAjtJ7C2QuLaH91o5TGgBQhRUhe+hAuLmOZo/zl/oNAG0h+g8AboiaD7DsvpchPQAoxT0bAEACP/WPVTHOcw4DFWUI9AOuI/oPAM5QMAMgZ+hm/U1To/SAZEnKnwAAgGAZQw47RyJaMbjpGM4BjRqv20PrAJYi+g8ALtG7BFD+gM/6uzOLD+DH+9tqDcrJHwAAusJA2J0vV3QeUeO28Tg/gB1E/wHAMSbfAeB4esAKNWuZ/AEAIEXul4L46BDfSYBO4i8B5gi6+BDoB0D0HwAcJPclwKQHLGAmf/Bjxwq7gc4HPNOLSR8GuqzcxUVMmIULFtAiMWc+jFz9RLS/iEIAMIHoPwA4SW4CIB/pARfUbyd/+z8Kbk7a6CvpxfSLf0UrcWmJtDrg9hMN8E0AoC18Xdmk8reDxOaVWCaD+MYHVPjHf/4XposAANDF1gRAPtIDneBSQ4p5vqy9tIRLzQcAsA3xU6e0EtOnz5j3sqFpEUChf0T0HwCcFukNw4kcl5EeAErhZAAAzUQOlAABiOl3GYF+oF1E/wHAeZGeMVWy9990IkdzIgulDBFdAADc/q6H+7oynqt8pnJq24QoPyAD0X8A6IJI1WCryhDO4vSA7ZpXalduOQHAaXzHAq1SNn7q3LnbuQN2D4F+QDCi/wDQEcreAVBlXR3SAxZrWPEu5Q98tw4HqVgxTAku2ADsIzVkzxUVQu2cMvRSwApE/wGgO1p6CTDpAWypzR8Yb2fjBUhlS1RaZu1V4sAhADDAlst0dxGyBzLwOD/gCqL/ANApLSUA8hWOHas8UJLsfaDO/iAVTVcGtQQALxgLuHM9thUtB41avCI52pMdPSygRf/oz//cdBEAAK0SkQAopHgCQZefvGPADADd4cL3nWXfW5YVF0COtEso53hbqGlAgXCTcir9w3/tn7VfEgCAWXYkAPKpSw84L2kaDOp4/QFqw6lOnlAuRJyt4E7vcedIAMhHTF8cBdVPC8JJQVrsvjmi/wDQTS4kAPJVeoene8NHpfkPh/IHwmOUciqqNbJapK0GkHXUEKqD1wMAqICYvgWUNQgtC4toiuA3QfQfADrL/QRAPnHfyaopfemu6fxBU/a0dpL5F1dIbAuJZQIAYMvJ4UAVfE3boN1Af+dPCugWJE5deIj+A0CXRSpHTk59P8LzVDRplRc4t0FEIcr5XnUWFbmYUwcDAECOojE234ko4ngfIcqPdjgWx6+H6D8AdFyk8sswSf3jd3ztdhLNXhtVBwCu0R/J+vHdkRz+SDQronyW1CWUo+UbIdAPJYjj10b0HwCgawmglC9n0gMAAEA3FVEkRiXto87RLnrcN61WBFF+fEc0vzVE/wEAnql3AJAeAABADXXxFL5sAdis1WtYFy+YhO+RgWi+WET/AQBbEl8CTHoAgPWU3ySLvdC1Gw4QWw0A0AyXN/MUtAEhcriCmL4DiP4DAJ5JTADkq5wekKHlAVRBPTCcg3UqndvbXz7o53Z3fLFXNwCVtXM1su0lACbVu8JSsdLVbCG+cG3DqViST0y/S4j+AwB2KUkA+HJGygxqtgrqoai5XMsf1Oqeyo+y6UlisNqrF914H0kElAGAGFwPkE9WD5FVGjdIuVOBApwgh4jsYw/RfwDAnkjRICp/Iwy6LaM3f6CqGLZpejicRlWRBEAn0Mvt0HY7JXxnVNOwvrS0L22IDuO7bYvIPmog+g8AONTOEkCkB7qFgSpQmqAZVIpwAUDbRPc5U+e3Y9cV/TJ7UaXuRbUDFYm+gOtHfB/KEf0HAKSKVA06GtzykB4AoMTzxcSula+tKCTM63pHYTgAI+h4sFDnvi+knqd+95oCZhH9BwBkiRQMmPzn/8lkIj3AeGuP1KGxTcp3qk7VtrxzzfdtWf5CYd21ecDymtxFdnRhAOgWvgFNevHNKKUppJQDnUf0HwCQQ8USQFlBCj/1jxU2UAIjrvIa1pWQWJQtLW5LOZ3iZ/xZKNWnVKNDzvmwkFMfAAANLBgwdJC8QL+IQgDZiP4DAPLpfAdAftiojfSAs1JrTHNFMe5FOhE947D3b3+SJJ4vooDScZ0FADH43kJ72hgAWNajLSsuQPQfAFBCOy8BTqMoPYBnzSvK0hggPcQYS3sMABxw9quEJCigg+IhEOepGdQ7HED0HwBQhrkEQD4Ci61xJtdCn8Eue14DAGhi9yUdAFqWPmrgUioXbQMQ/QcAlCQ1AYDWNIyR7g29ibgCaICbedhN4JegwCKp4tL1oqCZXDpUoBp6P5CF6D8AoDwSAGjG4cgCsIP7T0AxY18fHTmbO3CYjECAIh24EAAdRfQfAFBJpGRcyC0YgNp03Z2yChCUENeJiOcAgDFcggEYR/QfAFCVmhkA+UNhccETADscv5VNEvvegenORdO2mgdQXeF57s4lzRCupMrt9UlqGIBFiP4DAGpoYwmgDqYHJNxIOFmxqSTUNkRrdDLQvwAtOLW6g7aGNPRJAAAAdIr5dwAwBNekYcVWDZnSjvimWtfR3XHomGiKPgQAAAAJePwfAFBPpPJBccIkDqEx99U4U9qvRFnBd6hEawEAgK7rzhxn4MA//LtE/wEANUUqw0r7A7KXfyd8pVDW2Nf5Sq486DdaI9yiSOX8iQIAALqIwSfgKKL/AIAmtC4B9DLIlp8eKL8d5ChVqdm/VKam7QrBwzSaH4CtiKPZzuFvIFs6p3tNYEvNd497fQ3Y9T8T/QcANGPwHQCM00zJrnnuatzCOQYgBZd6dARd3TiawCqMGwGBCP0DAJQw/xJgQB/uZAAHEVGCCnxBQKGWL0u29F63r9a2tIJqwo/b7U6HziH6DwBQJdI3iGP8tafN8bKcyhd+lwAIIue8hTBcSOui5tASRV3NteUx8xcDdYsdLdIBzw3hdn9DJxD9BwAopHEGAANhg6h8dB33fSJxacpAxQDwXL8UuH10kIZMAOxG9B8AoBZLAAFQhDusIk4HP5w+OAAAYKW98QmjVViA6D8AQDkSAIATunc7UzXenHielySe77cYqCYmDgAAIAf5AEhH9B8AoAMJAHQYY/66DAW2Vew28ZJWcwAAAACQKXVIyB0CjCH6DwDQhAQAjGKAXZ3FwXejfLoboIK4awEnNtQS18Ur45wAmiErADOI/gMA9CEBoJqowWHJm1hRZW6RVff4VhVWLN/3ksRLEiYBdI2Z5u7qpRWwm/1nble+4MQcp0VdRkydqZS0dFyZO0ls6gKQi+g/AECriBGLy8Q3rtH7ECdvgpCng5MAtPTyrlUiAEAgMV9GDCjN8l/8x0gB0vdNYgDlEf0HAOjGDAAYHTADLdtOAqj3UVVl4H4QAABAobYmApSXlRjYIj2AZ0T/AQAtiISNlNA+ugDMq98LK949+dv/4Z4L+IavAJm2Fylaxzp8uwDmPJ9/Nlw7mTcAj9A/AKBFkYohkpJhig0jNcBRrcXfAaX44ugoTQ2fdT2jnzXUpS8KSztLl5oIXWBVJmAP8wa6g+g/AKBNSpYAsnBsBUhC/B3acH1uGzVuL3ltJ29Ji1pcOAYbNBgR0EQNMRqTaq9l7O/pzBtwBtF/AEDLeAcAkK7sPQLj7Q6x/8axru4eOQ5x0YMSXFZUa6dGuQCkKax7HdXGKVTdfj7Ane7MvAG7EP0HALSPBAAswAPy3datW9xuHW1ruBTAMr77vdb14zNG87cIX1Kpiroz1SZSktYuDmUFnjFvQBSi/wAAI0gAoLKaNzGMMB1h002sTWU1hRMTEKoDOQDoULvX8JXZgJEpAG3qUO9IywokLmYFPOYNmED0HwBgCgkAd1QbmjOis5ibd2EOHhVnGYBGHLwuQi6+s2orcaZyMlvNT50r4Hmeu7kBj3kDGhD9BwAYRAJAlzYG+oy+zHPnhs6OI6HPAwAAUQoHJ3aMsVBHB3MDzBuoh+g/AMCsCgmAnK/6nO95iSNehiXIZKzDSjxT9OEcRMd06wQHauGbAc6ic+sm8ls2JzfgdS890PHEANF/AIBxeQmA8sMSkYMu2E5ut5JbspI6PQJHe6w/UwC0iCtGQ3y3o7sS+64gXUsPdHneANF/AIAELxIAzo00oJBtw+rSzBwY5xo0c/aMtQ4nO1CIC5YKlWqRKxNc89ynnbiekB7Ysj0xQOgfACBH5Nz4obOcGO1acRicMp1kQc8UiJNFKLozTMm4KHCteNbW2WnwKkBrQy+3MgGpupMesHreANF/AIAovATYOu0NZt0dNmcTPYzsqC72QyVc7sx0CsBSSk5el69ueg9OxrVTRinUc7pf2mmvSVzteQdID0hIDBD9BwBIQwKgNlmjSFmlUcL8yA1aONJX7e6fjjSC7WgGdIq6qyanThlp9V2+Dajj6grrzO6BgwO6mg/Y04X0gPF5A0T/AQACNU8AdHX0ZIKxunZhKIhMdpzDrnVCO2pdCCoLcICqE9m1bwNdytd3s1RBZ1Xv0GQIZEmt7s4POLqcHlCVGCD6DwCQqXYCoPPjIxUUV6ILQ7Iu6uK5pLivdrEK66GmANiO61iOWt+uvDy4lsKa0JAhgHap6TAa5ju30wNK5g0Q/QcAiFUtAZDzvdjkC59hVQV2j6wc0bke20av61yldu6A4SS+krY4nyGD/lg+ff1QrVdbU5H2yAlrkxvY1c30wG5igOg/AECyggRAfib85W9CHbsHSNYT15mt7A+t1qK4JoNkVp5QkI1OpRbX9FY0WyQIz2ot7aNhAgHalxXTJjFwyNX0wHO05H/6u/+f2ZIAAJBvPwFQPuLvDlvHG6hJZRe3oPNYc0ZbU1AnWdCTIQsn7B7OIZVU1SbdVJGOVKS2s1hPhgC7hPXR/Gg26YFDtqcHiP4DAOSL8r9uAa2kdz4Fo03ph6hJRw+7BdLvgESjWzZGFWb6XjWcok2prEFag1O2CnPvqeb1wLUdXHrFR4o95g1UJzk9QOgfAGCL2i8BhoM6N+ysPFx0p4bcORKFLLhn1ML1zuD68UEW+ltDaiJgXb2cHyhfEfRcdTSE82me0p4vITZkAvYwb6Aeg+kBov8AAIuQAHBBdweEikd07VVkd5usEvvu3fTS023ojADkUHNF8jv8/VHzyEkVtCi/Crvbd9XaCwpbmA/Yw7yBevSlB4j+AwDsQgLAJtIHeNKH1srqT3pDiCW9h/wgsolFFgqQb+/Kw5nUCZ1t5grBQO2pgvY50eysB6SFc/mAZ8wbaKJ2eoDoPwDAOiQAxFEzTrN+WGtsuMo4uQL93cxcc9ARkMb6SytoxNZxNW1Vhfh/pZax47wxXspWejunlAJp3V/+m2ZrYN5AE1npgf/xX/9/Wy4JAADNkQAww6oov1MjRKcOZo8Nty3V69/lFnONDT0Q+nTzXKXXF1NVR93sYRpVi/9rn1jghsKDpxsLlhrtdTIr4DFvoAGi/wAAS3UrAWDlYKbasNPKQ1TF/MG7eY+Qh4C+UN3rivnodtCErlVb5auUkssaDVaTrokFVqvTJfM/0526s0fOEjGu5gY85g1kI/oPALBXSgKg89/sJjgX5begiFVZPsjX1iIONnWrxPQrGhJAm1Rdc6pdRMVccnUxfyk3XwL9vnUj9Yv1M4HAKlm5gQ4mBracTw8Q/QcAWC1y/ZtaEnNRflq5mMvL2R+SVBYdnL3z8jz3Gw8AKlBySXTnS6PSkfB1UlPZyD8ZAvVSa0DYUdd+r6zt3J43QPQfAGC7bi0B9IKI0VfTAZETA6pWqGtuFXVOu2UTcWLWQaMCgKXcu4CX+i4t/4XrXgXppSZDoH6JIVc9H7UNHZV5A3usSA8Q/QcAOEBRAsDZEYsSRPn1azu+T5uUpvTiQL3DJnwzliP8vFbQjMKPEC6q9oZfBb9Ra8fdVSpDoH4CgfOsygTsYd7AHjmJAaL/AAA3NEsA2DoUETOg2CGxTGrJ6C3E9xtR3YhUNGqq2xWVdjn6bycoaGaV4VX7ZB4bJ5AYFd7wq+A3au24c8gQ5CnuOC+PXE4ouTbmDexprU2J/gMAnFErAeDAMMocEXXn6FixdN2KaAQDuvWeA+Qq6gwmmpLug85yufNnHluS8qfi3y27dWihMlVQ9pdsYKAfllo9iPNjy3cuH/CMeQN71DYu0X8AgEvKJQBcGii1ou36cnZ0902V+pTdV21rKdm12Q25fcadUwNAdxVfnUpkEfb/UvC7lYuAahSvQSScuHfz0qHzpMaOnYyVM29gT6WQBtF/AIBjMhIALkb8rT8kGUM109Voev9bMtoilYwK6iQi9QBgUsHFM/dB2ZQ/lfp1ISz/3rC8+I1XRrL9+J2QGit3NVDOvIE9h/VB9B8A4J4ofwSAtqkYcZlrUVf6UoNWcKUKBCvXOtoaghYGAIeVusiL+yZIvNRvx5QfiSu6C0otx9PkN2g1Q3Juk52Oknd93sD/8G8Q/QcAOKjZS4BRT0tRfm4X0hDcF+WgObIrmeqHU3xP4FPEyOB7Hs0F6VK+JdMeafay+jLZAk0UvKqXDIE8nYySd2LeANF/AICrSABoQ5TfCOL7ZhHQhwDf+pYjt6IQIPE8S69ZPucBDqX35fLZAlIFapEhcElHouSH3MiIEP0HADiMBEBjjUc1RPkrIL7fMgL63cOT6YA7EjsvzeQtBFE9scDKHmmYCxmCFk5pG7qWG1HySizKiBD9BwC4rQMJABnjCqL8mRQ1UFerryIC+g4hUg/ATYryFrzlql3lJhawBpEGbWQI5Hs+BAu7jUVRcrWEZEQI/QMAuqBuAsDZcUgj1kf5BTer7IprrHrNV6wQx+tPOCL13cBZhi3OdinURJCYjqBe0zWIDLJ0QkPT1xTbZe94LGmjHEKi5G1qMyNC9B8A0BGlEwDODjDqkBvot7CZ7B6W71R49QOx+9BtR1DeNk6dL04djLvqXiFoXs+py6vkZZQ6kZyQVf0vS5McNsCLH8gqeyZLilnXyzZyaWIQ8wb21Dhkov8AgO7ITgA4NGbQNtJzLcrv0JBYhZf1nFY5VJhe7t65iOJaN3bteFBb1gWkdBexty8JuHaqWcJHxUacViU54VLcU4yiFyQk+33Y0gkELkkdWzp5djBvYM/hgRP9BwB0SuQRZStgU5TfxeGrNsT3W8elppm2O6SzJwD9sOPs7QCOpi6yG0TVcdjb5CpV+AruxMSCduz34YM3IpAhEKE7WQGPeQPf/ff/5v9jqiQAABgR6f+Wd3T0pARRfn0KFuehFptiCZ1srfYuEV2ZngC0wI0T7eCapT/Mz3SEiphY0J78DEHREkMpG4AyOffIDnf7jswbIPoPAOigui8BzuTugKg2ovw6EN9Xza2BfRaTHaPVfXeiNQFYSNGLecv9rDKyCFWVHzw4HDPVpmiJITIEhmR1e4c7uUvzBoj+AwC6SW0CwN1RTyGi/AqxOI8KVg3FUxlrZSL1ACCaqiunnukI+hc1Kk/QdwxrEGnQOEPAgFqp/E7ewfSAwMQA0X8AQGcpSQC4O5zZQ5RfCeL7udxdWqdpsxruFm42ChTr9MWrM7gYuEPPdAQj14GMQ6lUFjFdmzWIlOE1xYIwb2BP++kBov8AgC5rkgBwd7RCoH+rej2UqATX6sndeH0+09H8LtZ515EBghBlu6K8rzt6sRamqtXP+VuBxtkCQV3J2BPGjkxTaPyaYmnkXXgLMW9gj6bEANF/AEDHVUoAiBmAmBt7iqmCXAXr41dixxHrI2/qqiYE9OF5pk54u1u/6xfJbssP27RVitJEpS7kVY9tqqyoU/SDqjuxMlWgWNE0BVfitkWvKa7y2Ta8LJHAJWiqYt7AnnptSvQfAIDcBIDDI4tcdhx2XpTfjiOQwP77giwE9B2n5iS3oJm4mkEyS/tn0ZnfypWh6MHjsiy4jBlXqY4UTyywcw0iFQpHmE7cZkk/hr1QsgP5gGfMG9iT07hE/wEA8H4kABweJmSw44CJ8jfj0jjf5OfdqUYDrIrUc1UBukDCmZ7/ZtIK/My/VMC33A9MLGhLNzIEsqTGjl3KCjxj3sCz/+7f+r9bLgkAADJFmgYC7o4uNCDKX4u8xffbaywez9dBQfu1V7FcGQBYTdVFLMn5W3lkEepoZWKBUy83rogMQTu6kxXwujdvgOg/AADPmrwEOJ1zIwdFiPJXJG/gbXpRnRzi6kojHqiHWVYlipBBxalJM8qg5DKrIYuQ8vey3OxadScWtPty4xpMNlfBUNmR1xSbkbMMvau5Ac+5eQNE/wEA2KU4AWDn8ECdgrfvdr16dskbPFdrHaL5SlSoRr3VwrkpArF1tERFP2n7qqF0f5woL2nIIqT9oKSuT0doZQ2iGupmF8w1RVdeU9y2DuYGbJw3QPQfAIA9ahIAIr/3tSHKX4K8AbDm+L644zWjlYA+p5guBTVLJwcMUnoC6r2Mpm29A9cPkYsalSuUra3TYA2iGupG+uVmCFhiSLmc3IDXvfSAwf5D9B8AgEONEgAuDwuJ8ktcZD9L5eYgvl9S2YpqVD+dOJvUKlVlXe20AAxLu/iUvdAX/V4HLmwNvxPr5A/80ru1uP6VF736/AMyBB3XtfSAqXkDRP8BAEhVLQHg4DDP0aX53RpDao7vO1VXBQjot4kwPQBUU3RJVJJIcPq6W3fN/PKpgtI7cbqeSxxeSxkCwS8hIENQBemBrYZ9hug/AABZChIAjgzbiPKLxuI8NbW1gL7F50hJROrRUIku5P55ZJuUU5qz3B25bUkW4bvy1yUmFlRX9Ibecj8r3J7cCQRe67cqDucbupMeqD1vgNA/AAD5fiQA2hsy6R+iEOWXhPh+WTyeX0n2K9jaLAW0I7YOPVK6jZieVPYqxtVOL7IIPzCxQDUpEwjKFMUaezdNDucD9pAe+Af/NtF/AAAKRIF9QwIHR3M2D8yI779Qp3cS0P8u/WBs6wNu8HP+5h76GJpQf36oWjC/fcmL/8DTm0WQWs9MLFCBDEFjnc0H7HE+PUD0HwCAMhq9BDhbV0dYuWSPr9Q0mfOL7xccoIIjcurcIaDfPlkvLaet0QVW93PFl4cyT3InKX9CvqqB27R/EFnb+lMF5XYisnKKkCGoKPVGrLNZgWe2pweI/gMAUJKOBECnR1IChkka69/t+L7S4L6DZwHRfIUy+oeJbkMLAl3WwhVg/8LmZ/5LWfuF5jK2L61GymcLRNZn3TWIDv6Wt/UqOxFZSy9JyRCIriqyAvmEpweI/gMAUJ7CBECHxkq+Z3w0W6G2dTWM6PF8CuL7ewjolyHrgXqPBgJgm0pXrVLX1+yUQgVkEb47OHImFpTaR9FORNbMS1JeUyxOTljbeMhbFLPpAaL/AABU0jwBYN+oriQBUX7P5ELA5o+9GuL7XQ7oC3qg/lk3ar6zrLxGoBzOXZOU1D5ZBE2YWJD9t5RN254haG8CgU2yQt4kBg5pTQ8Q/QcAoKoaCQDX4h4CBmwaovzmD0qxDsb3uxzQP+Tv/VehrlapTHacnHCazE7IhaoCy7II3l6JHWnrBhMLpNZAxcffyRBUzxAo3HnLhC+VI1CTGiP6DwBADWUSADLvhasRMO7Ss2iP+eNSoAvB/cxiOdGCtfk5fyvU7arTR+gpJAS9rjuEnQnCipPJnVOkvSzC/u/V+y60uOYdWYOo+uo4RSvwWLyy/lb1DEF5zx+1oB6YN1BdTnrgv/13/q82SwIAgDP2EgC23GCmEzCIIsqfwvn4/n6ZLG+vJvzUP9bW4ZpsTuKpkq9bzW1f+9ivYg8T1SHt6S9lSiqqavVqI4tQ/v21Scqf7GLxGkSq0wMOTCDw1BTxRybAnuvkM+YNVEX0HwCA2iJNt5XbjeoYtggYCxHlf8Ht+H6Xg/uNHs/P0aU6LENcp3eqgcTVLszR1xn0nzO2nJXl6rhkS9hy0NrVqIj0KvYL/j1trxa3Qt2JBSYOudaz/l3IEFSxd4doYz5gD/MG9hD9BwCgieYvAU7xPCyxeehFlP8b4vvOIKDfhLi+m6+NRrGsSgBtbDwX9FwjSm5VaZ4gXze+oA6UP+yioHgHJxak5kksmz1Q9C/brbr9zl738gHPujlvgOg/AAANqUwAWDje6HqU3+3gvud6fJ+AfiqJHTGfgQq3r5LaRx1hy/IrYpbWOnidtU08T1kBVR2no91AZaog71cO9mdHfe6UcjcfIqzwdcP4RemBwk0Lq4cCqXepLmUFnjFvAAAApFKQALBhOFHrLWz5ZB91qQMhvi8MAf185rugoJo0XxkNWX8AlQjqOajbJC6mAAAgAElEQVTc+cz2Vfv7Tt2XAjQ5cg1txnSEaqVXN7FAVqUlnped8ZBV1B80rC/kSnqgO1kBz/J5Azz+DwBAc3USAFJHCET5d1QuucTRru3xfcVvxN2yrRIqUVZNgmpJ4pmVypqC5hPU9JBKXyeRGnduTd2qVf3mYFVNrLr2O5RF6MgaRFlrB+3/5fB35SA9sC/nPtfV3IAneN4AoX8AAFQplQAw/dW/S8OiPYKOLl3mgVQoubgRq+3Bfe/HITSrWwsPvB41XVBXdYk7QWrTeCSd6atATfLPEc2XOtWB/KrbVr1zJQ1qLosgvz96XstrECWVdthI/iuISQ/U2a55WXfEHUwMbOlODxD9BwBAof0EgIxYfxeX5lfxOL+g4aft8f1GD+/bdrD16Opt9q9MVUOrh9GN/gkgRcunf9qlTWeSoFC3sgiVPmTBN4OCNYj8tH9pMSvwYp8vkB7Y3aR1byfOv33uYHrA+LwBAABwKMpP7AtBlL/8ZtpBfN89LfUqyxenklIaRzshAKfUfdmv7IfcbcgiVC+j7DqvLqeU+4eamhXwzCQGfuz5BdIDWZu24S6WeQP7SqYHePwfAAC1FLwEOMv2m1/B1N5DUoe6Ww5E+Ynv286qJ8rVF1bWLZUTPcpJsvoJLMEJrVjdJEHRvygugmrNC57/yLHGglifKkgtVspR7SUGzOUD9nQ5PXC4le+/aGMwnXkDe54TA4T+AQDQQVcCwD/4Q2VSR6xb6l7Aa2x892PHsqv6UKPF92072K32eomW+lFWfL31YGffEMuyW1daH/nUvPWlGnrlN5qff7czi6AoDi8jVVCpIFpk7f7l+wUk5gP2uJweSPJeBPHySBxYgoZ5AwAAQC3FCYDK39uyh2cFh2NJoH9/97Lr3OtGfN/mgL7esjt2DZHP5q6oAzefSJVo7MCaH29vjaBT3MSy+4KzCK2nCirts/onWu1pezvLzgcI6v857E4PVHlF3E4o2YFkwC7n5w38N//u/2m6CAAAuElNAsDqkZVLUf4930ojqXXcXpynjea3LaCvYH/i212Cpq3YXiXLukgC5ejrtzpTCy2o+KVu07FalUVQVLHqHtk3N7FAbx/b3frL2PnLUlmSD9iTnx5I+bsdZ/Thc+WOpQR22T5vgOg/AAD61EwA2DhwcjjQv/WiTIYaiPh+ZfYH9BXsXnzTt0BNszWqSYmXNcB11p13Sc7f8vjP/1NpB5ZrK4tg4vF5oWsQZf2W+n6VOTnAO8gHvPiAxT3c7gkEPzg8PyCLFfMGiP4DAKBV2QSALaMjpVH+4u21z+zreYnvl6XyYC0M6B8S3/rlaW8PeS9VRhO0hygOXYpMqdejS0908MvuoENNqfQVCM6mCop2krWovDJ5+YAXP8ooaZLyJ7vYmR7o1PyALBLmDRD9BwBAt5QEgBXDnm49zu+ZCvRXqRnx3UZZM1sen1W/e5FN31It6zp2iRclW1B3yKGpe4i8CopSOqpfpipLTyb4vtGOUfRMvYlX+DbI/qSWwGBW4HArBYXxU/6Utjlb+7M96YEOzg/I0tq8AaL/AAC0IJI8sCkeVxDoV1mGovoR3FU8EfF9Ax3MklWJVBK5xJDEa4sOnThO2f0fbWu26ogqnemV5ZYIKp0kKL/REnt1kbrld9rNx5Re5idrZxUzH7pSAvl7zfjn/AkEtnbUcumB9o+O+QE5VM0bIPoPAEA71LwEuCEe529TqSfnhA1uZSzO00bX6mBA/1CpSqhzUBIvDkaYrwjb+iS6S19frXIemj9nS2jrtFaXJKiyn65nESoV3dgaRKUf6K84XWDvX7S0Y7MFjkquL2RrD/xebl/AavXMDyhUad4A0X8AAFrTagKAQL8RxRF/0+V0OL5PQD+Visk9Eq8AbaJrAXYTdbqpuKCUC8y3o8nxJHv/VViQ5tUsqtdk0rwGUcVKUJ8VaCMfsIf0wHfPwWXjmQCP+QG17NbQf/3vEf0HAKA96hMASqP8xdtrX0qB5A328oL+rZdWQHxfVy9SsF15nUcJQvwlEcd3SYPWzP8oLaoedfqCpuo46NcNlnhvjdJn/VVnEUysy69TYRFLxN/Lb6zONnZ/kPGh3R+bqfNOpgdEZQKeMT+gPKL/AAC0TFkCoNkgR9LY7TuZj/PnyAz66y+5mvYT9vB+o+2K7y3NdTDE32pxO9CFmtMWcJfGrtLaoW6dFp+ZnLs/VFysP/dndbZtjrksQq1sgdzKrLKIf+lH/XPkrv+/ty0hkwMKuZ4e2LsDlZMPYH5ADqL/AAC0r34CoNYYRsygbId1gf5nph7zr9mKxPcF09amZk558xcaekjDzwnnXPuidFctHS2rpsN5hZIHVmsygeWVVrUrJc//U3UP9qUK6i7Xk/PpDNkhfUvzAXucSw/s3p/KSQZsMT9gi+g/AABGVEsA2Bv0tzfK/6z4Nk3DQVVuPEk9pMvx/UZ1KvttHIr3Z39bl5dddSKu0nm61Ewwo601cGr/nv6ztFEVaD9Ha00mqBVBt1f19YGqL9Yveg2iZlmBrA3kftS5fMAey9MDh/etclICnZ0fQPQfAABT8hIAKsYhpoODtg2lqk3dVn10esL9WvpAiwFuEUwcr7GbpGo7trA1G2o1jt+96gVU0hjZkrXFMrMRRSQJPO3XUEuumhUf+tc2scBYryiXGCgqXvb6/9XzAVX2K4OF6QHmB5hF9B8AAIP2EwCKxhvah1TdCvTvUnekksP9zj+8b+IABd3oEOL32ozjO1qBQKcJPK9TLl1+wb97XttJgtr7KH1hdi6LUH19oCrTNVQs3F9LuekCVZ7Zz/3dEi8Tzi1I+WKIoTI9kLmtJlXB/ICWEf0HAMCsSOlwQvG4qbtRfs/0ej6aY/0Ox/dbWTSp5q7a5HCIv9yh8TA+qnnuMbQzbFXzlb9lkgT7WzdwmqjapbavEAGXjpKlzp5SUDR1wMB0AT/zb1UmB7z89RKTAypt+pCAzlCksIj7F4b0D1RpkWLMD9CH6D8AAMbVfwnwdwrGRwT69SlVIJ3hfscCwaqTKDW3LYHwljUWpi8kvpN3hMa2b9bEll0IrFO3fjlx1ai/So/IyQQ1NCyWirljpmsm+6H/ouV6DEwXyA7WV1zQv3Q+IOsTVbg4gcAvnKWuLxnwbZtivp6tmx9A9B8AAAnqJQDqjIBsj/J71RY1PdDW8RYXzni4X3DTlz3ssocg5l6hFrEh/uwH8nQS3G/l09tINA3Kq9tbSq9XURn9N4XGyQT7m7as/ssX17JUQe5D/9WnC+gqeQv5gJKb6GB64DnqXSLYrTYZcLhbOcmALcnzA4j+AwAgRPkEQLWRjrCxRwWSH+fP0izor/nRfjE9QcPD+8KG/7kUlNWKEL+Y/mYd27N3Utl0lXCa/r4rLLXg/smqIkmQ/itFW7ejbiuVMqMWKnU9PdVScbpAy4sIZa/srz4fkLPrwu1VYUF6oEomwNOfDPi2ZTHf9qLmBxD9BwBAjvwEQOWxjEVxfxsD/c/aj/jLDw52Lb6vuHCGl+ghxK+G/PNUP9GnLczR1zGEphY0rM9YiqwLjKIVhyr8W+ndW1lRXs2JBaoPVuQiQrkr+zfLB+TvqfqvOJMe2It0G5oZcLhzOcmALVPzA4j+AwAgymECwLUn/a1Yt6eMNoP+AsOIzsf3bQ/oHyLEX5vAE/CArNNHPuorn80nvc2pBQ37r7MKj3EqHpav+qtNsggmK7DWxItWVukRtohQ6XxA9R1pTg8U7qHu57T32924u5hkwLftixkEtDY/gOg/AADSbBMA1gf9rX6cP0eDoH/ZehC1ko+6uKeUgbaycojspYT488mO40s5RzQRd3jd6PM1+fLaqwT9Taq7VozNXVCwCo9BSorVLIuQ/WkZbzjIjbZn/yDzo80oWERIQamUvTygkIogvJ4JBK2mBw4j7rm3r/qSAYc7l5MM2NIxP4DoPwAAAkWF4zhR4X5nHudP1ThcWGoDzWYSqJRXkoIySBk71yyH+K74rJsh/srNavJgzZ8L5kuQyuYe2Dk2Npa2pIWxl60oVuU4yuQJ7EoSFGpS7irzCsqnCtJ/pFCDrEDWpxsonRXwU37bqnzAHlvTAyV3nvvJsvMD2kwGfNuLmIGUkvkBRP8BAJAp/R0AZoP+rj7O/0xdeFHFY/7Gw/2qX1egivPB/S2XQvwa1olqjZmu7vYMFUAjbX3e13YxkLduX0tJgop7Ek/NgkUyJhYULdmf/QOlxcjcSWIgH1BlWNad9MDhBhode+n5AbqTAYc7l5MM2Ko6P4DoPwAAYkWeuXC/24H+puO3ZkF/sxH/Wntve8DrZHw/+6AcmTSTchiCCmlhEF9Q7QHwPM/K1MKuKsVX/chv9i+6PJkgX/mjqj+xIKm6q2JSFhE6CPW3kA/IfXmAV+EfHU8PqK724vkB7ScDvu1LTEqgcH4A0X8AACSLWov+15wuL/6GrJVHaEUH/WWG+92I72cchbras+J42yik+bsr4vgA9GrhQlFuqFexIIImE7h8rS15bNkzB1KzAuU3XMz8IkIHEeD28wGHBcnmSHqg+sGqTAZ82/r+JttJBhzuXE4yYGs3JfBf/fv/h8GSAACAQulLAClXcEso/o5K5XCr1ME2XttHT5XWzTFoGa7W2ajpnqY9oO+ZP8Z82kL8Um6J6pdDdsNBPQktLuW8gSvK9eqScxEETibIfxJe3e4FKxui9dP+sa2sgJdSJNXTBdLi/EX5AO1HvbPfQoW/pXMuRZVdJZVPtLS1nJrJnR9gKhnwbY8CvscJ/QMAYAW9CYCUuL/su5/WA/2Vd97mY/5yHu0vtVEBXav0g2hVCDiuSmwP8WtbvAumlVwepFPortnyYjxoqEzHs3kyQbXdl+5acs9XaVmBrG1pzAoU5QN0TA7IUrhdcRMIigr0vLO689Zbmx/QZjLgYOdmkgFE/wEAsIWWBMDhEoHStLJuj7IitBP0J9xfSE18X+4dfFliQ/xGE3hIU/IpWru5dTSdUGsinrprAqmFUpxJEqjbWJlFiipuUqeyz+anZgV+fN54VkBNPqCFxYLK0z+BQFtu4/tuG6xg29r8ALPJgG/71fz9QvQfAACLKEsACAz6y4gG1iyF7rV9am3fULi/lVEzwf1dtob4Xal/A3aqTtylPIUNZYRc+voPqYV2SV9xqMEemm2s0lJFbX9zVpwukJoVyNqMjvKoCOPKzgfssSI9sHfX2eyNdi3MD2g/GbCz8+/7Vf2NQPQfAAC7NEoACAn62/U4f51N6Av6d+bRfuL7ewjxu+l7/ei5NIu44AOCaTpHyl749KUW8jYp/8JgbDLBwT6aqrv/ktmCrFh7C6QtInSwek9qiTqRD9gjMz2Qu0Z/JS3MD5CQDPi29wbXJKL/AABYp3ICwFTQ3+rH+etsrtWgvzvhfj/nb4Wk3F0poC2+n7ltZR92qBXqI44P4AfDUxZ2VXmSYOcf5V91jE0mqKR8PdYqwssPpT6BX3fTtTTKCvz4fOMAbmYBNOQDDl4e8P3fTUWNq9GQHqh8sLlr9NegdX6Av1O29pu19vwAov8AANioVAKgzaC/k4H+Uhu1POJvJLCbfRfWUgFa02L1an6E37O7ISrQvqiO/IiaVVqaewQDarZtJxpP7UFmjzbcSBJ4KicTKNlVXiFU7eTgV/y0zZtfv761RYT05gPStnEwHUH9U+rtqJUeeP5x/WO0ZH6AnGTAtzJktAjRfwAALJWZAKga9K/024kr6/Y03a6dQX9TK/m4FO43GiUnxF8FD+MrJ+DhWHRKzY5RJzRampudtWbQuUKSoPxODGp4ifP3/qt1n6k7qZsVONheJxYRajkfkLG7wt5iwbisqIg/MgFNLgKWzA/4fkIlCjZbV+r8AKL/AADY60UCQGvQv+kH5d1nt3sUJXadcU+tZV95+1W+06IiCLutySxue+UkxO95XnaEQj35EakqSi6FobkUgHz1z4JOZxfKlC97QOPMZIIsVRs+45HwBtvO2ljlXmvzIkJ1A6/l8gGKEjYH+YDU38r8WfPymLEXsW86TV38/AA5yYD/8j8g+g8AgMWi8kH/lu6nhM3Vb7RdpcO0dh7zNx3ut+DRfnPxfZWd3IUQf+J5is98q4NGL5VoPoeOFnCQxOxCe1cNJhOUVrItc/MEDRIDri4itFdGFfkAxZMDsjdTfaUdq9MDtReyTyF+fsCLDTYrW1VE/wEAsF3BOwB03RzJe7BN6512bbqD/tLD/SbuOdqK72sPPHQ1xO9GRMfzPJ7EB6CL2mWR0n/cxrWJyQSl5Ua964b2G3xU/iJCyvMBehcLOtxMxvacTg+UX8i+LMHzA3af4dOdDCD6DwCAA14uAaR224qHSWrIDPQ/a2FtnzYfYJf8aP9+gdyL73vCbstSdSHEz8P4zpN/ouEZJ5sGZYYudiUJfnzM+SRB9hoyqrMC5T4tZxGhsvmAJPXXm2xfUT4ga3u55XAuPdCR+QF7E/rV5gOI/gMA4IbIaNC/o1H+PcYe81d9sJ0J96vvt2ofxpTFjRA/QXw5RHb70q1PN6lHTatrXEGZhi1S7vkGU3kCVhx6qWJWIOsT6Zuo8VEJiwhlLOZzkKSQnw/Y06H0QHfmByicHED0HwAAZxQsAVSKuaC/XYH+XQ4E/SWv5KMi3K+mo1bbiuluWZNFIf6iGrYoPmOGjC5arploTJeYuCCnSD8BNOYVtrrUl92bTFByxaHMrchpfRYRytpoUT6gThmM5QP2qEsPpG0sZ+vtDDe6MD+gyeQAov8AALikbgKg8khEQyy7DBnhKk9/xD/vwyonDzv5aL/+zimmH9aU1KijFoMWWVEA5KjVJ7MrlipHF6T3c0W9n+xCWfWTBJkfVqjmikOZWykZCTfYju0tIlTuo+0vIlR2sSBPTT7g5bEoXEamuorP91eZQOAzP2CHwvkB5ScHEP0HAMAxVRIAmkOr9j7On8XSx/wJ91f+gNQeWAEhfhs16HhVnsMD0AJrswsiLx4lB0iyVxzak5vUSI212pMVyPpEyufrfbTEIkLKhnK68wFSJgcUapoeeP5800B8Xc7PD8iZHED0HwAA9xQlAPQEWGsOokyPZAuVeSot5xfr7yJ9L1U36N5KPupi/eL7XoE6q/TU+kRtnQ3xK0vXHfwNVdl+mqMhl08gTdmFxPO8pPq6H3LIXnGo0i7Tlh7KCrGaahHZiwilxOaVKJsPSGrut3Q+IOsThlR5ROx7idW+27aSLswPeM4H/Bf/4f/epDwAAECmtASA2Sf9ZQxLc9R6HlzPIjNNg/65peryo/3iO2GKOiH+dmMADof4VQbx037gJBvPMrhNU590+YQ+fIr62U40s0zFCq6lks92mM4TlAqC++k/tmy6gMaswM6/t5EPOEgG7PxMfT4g92eZGxClyXL2yrk6P4DoPwAArvqeANAfbzU6SKujwuGpvu3TEZguCPoT7pePEL9WBPH32HJetML+5kS6Nrq51n3I7Zp70cxUFZMERZszS+RkgrJBcBYRKvyxlnxA0eSAnZ/VXa+rRD7Aq/IrooYG5Zez11+S/Z9YOj+A6D8AAA6LKg7lqkddRQ0V05Q9pOIDaTTW07a2j+GIP7H+At+LVLf3EOJPU6uhHQziPxPY87M5VO+QTnlna/tUszu7UCFJ4HVmMkHmISo7rrJBcGsWEcod79aaLiA0H7C3QwX5gD02pwf8g4i7nJSALfMDiP4DAOC2Mi8BduFJ/8aP8zfaZLXP2/yYP+H+wwI0vk0mxJ8tu4lLrXNlF3P92aFKBPTSd7IYuABU3aWWg/dT/pTCnckE+UOajDV99O251CJCErMCXpNFhBrlA7QsFrRfKEX5gPw9HipqYlHpAeYHlPG8ob9P9B8AANdlJQBsDfqrDvQrvpvR9ph/9rZ1Nk374f683zbYCeUvzrPLlRD/lmWBfgGXSktqyhIVGpSKNyKthexsCq2l1vL88i4mEyiSOu6SmRXwbFtEqPiJgvzf2p3QqXxywOGGMvMBSeqvaynDHsHpAeYH5CP6DwBAF+wmAMoOQIyH+wU+zl9n01at7cOj/bt7L3ckhPjLqfAknozjMH0B9KRURLsItaOOtM6gauEMhzpak0MpVZ0iou3OTiYolRVI+T1lO3yx473fs2cRoXJhfhmLBe1t6CAZsPMznfmAPY3TA0mVftHwiJgf8IzoPwAAHRGVHGsZGRrZFegv3oc9a/sQ7t/du8Rw/8s6MR18KCLwKX6C+DWkV5p9xwFUpyqRUHoT9pxYyp7qFZEk8A7ip6ksmEyQskPB0wVkZQX8kmF+T0o+oGhywM7PWswH7CmRHvh2s1l92K0wGfBtg2JSArrnBxD9BwCgO9KXAGp52FN2bCMpyl92l5as7fNiHwZX8jEd6/dKHYn+DubWI/xemyH+1ruQ6KbJoTMIZIsuHjOKSBn+uJJdyNmVqpkY1faqhsWTCVhEqFj38gHKdl1b8vLPFRv98NeZH5Bp5/N//z/635ptCwAA2ORHAqD94U3jKLDh6I3Va/s0iPjzaL+CXbeyG3UErtKj73Swjs6FHhSSWCbggNqOavRbTn92oVlllfy0rjyBXZMJNJeWRYTyGMoHaFksaL9QWams/Z23fSl73l/dVmZ+QCGi/wAAdE1kagxTZb8iAkd5hbBkbZ+dp1nqfKjpBwyOls0+2r93ayeTwBD/Vq1uI7eec0h6JN/KCpRPwMJTHSKjE2sthfnsQnoJFOQGDvZUwOnJBInneYmJxACLCKXb3a+fss9y+YDs3/r+L1omBxxuKL3G9n9qLD3QOBOQ+lHmBxD9BwCgg9KXANLn8DGK78MwGTfr6tcjytm+9qB/9cf8HVnJR8ij/VL69JbMEH+zriKrhj1ZQfxnIgrRJuLs8FR3A5FnkdTsQlFuwFNfdKcnE+zFgbeSnf9vuTwsIpRdioN8gPTFglI3VFxdJtIDpfIWZXV8fgDRfwAAuqmlBEBa3P/HP7ZTBgW7dHBtnwo1Qbj/cNc6t16diyH+rVarV/CKOlLKsYtoO7qgA+mEPZXKWLp6chY3aeML1aHJBHZmBVQWQ+QiQoYWC8rdcnX529KWHvBL7Dx9M+qSAYfbrrNB2fMDiP4DANBZuhIAuRH/9rQc6E/btcC1faoP3nd1cyUfIY/2lw3xW7BKzyH1hX5RMBFXJE9OOfYQxwdao/V0M3GJyd9nucMtGcvUnieweTJBalbAYxGhMtMFtEwUcCMfkL3TFE3TA57veUnV4teZxJDH4fkBRP8BAOgylQkAU0F/g1H+XYIf89//RNl/5tF+XTsotd9UhPhT/CheS9UiNIi/i4B+i/ycv0GQzGejnSIvu5DzoeqFLRPjlDKZwKtxgFrC9HZOF2g3K7A3UcClfECrF72m6YHtbz0naOqWnfkBaf7z/5joPwAAnVY/AdB+uF9IoH+X4KB/rcf8jT7dLyHc31KfLnWTR4j/gNJAvx1hWvejlRWYibPTBO7IeD66clfqRiIhlYroXvlPNF12sWATUvIEpQ5TfZierEBeaLftfICfUiBV+YD2JgcUqngBUZAJSN1pJ+cHEP0HAADVEgDtBP0FBvqfFcdn7Vrbx8h9QNdW8kmrZAMP8qtc2EqzxoF+WcF9hyKFaTEKdRyqKNikcsdTlUj4sXtH+n676YEy+yy7eamTCQqOTv10gYy+LWcRoWTvv2rLkBlY380HJCr3eLirHxuvlQ+QtFhQVXlH+PIhqIZR8u7NDyD6DwAAvPwEgNpwv5ptmRioCn7Mf/8Tpf655TqU8Wi/nh0U7PHlrjXv34pH+HepeJy/1UC/oLtkNcpmoZw7cECLmmdKVshVyQVOUnYhpxwNjlTXUjyHmzcxmSBrY3USA0wXaLSTgyHLbj5A6+QAL2UQqWmxoNwtC6IySt6B+QFE/wEAwNZ+AkBK0N/0CNRM0F/TY/5lt9xY2Uf7S/9W9b1r23rBHg92rT2fUZtdIX41n39m+sKiD9F8wDUKzlYt2YVGy3FkbDGToqu/Y5MJUjcgY7qAq1mBUpMDvLbyAbUmB2T/os35APWr6Lg1P4DoPwAAeBYpX9Wn2uZMDy0PSptdfLuC/i1UbKce7T/Y6ctdKyqCXSH+F6XVMv2+DtOXlOYqdCr7D7YraCmDWp0oZI9G0e6cWW2Z68TUVGZzLSYJvHYmE9Q6ojpZgazf6NoiQpUL0NF8QNH2Rejm/IDUIyX6DwAAdtV/CfCuysOhdgePFaL8u0yu7SPvMX8Z4X5i/UoLUUTdI/y71GxL+A1o1XWfxB+OHRRE5uCcKr0i73fpJXvSK8v/Vk9pYxRd17mS27VoMsH+5xVnBVL2UOafHV5EKGk43ulKPuDbx3IPQdRwpjvzAw7THkT/AQDAnvoJgDrDHs2jwpqB/l085u+Vv9Pk0f762y9kb4hfccmN3koSxM8juWMDteT1TxIJlaRUgYncwIudlPgdoZMJUrMCXvnhWsYWK5bH6UWE9kbsLeQDkvrbz3UQoa6VD8jtC7n/mDUHpMRH29CF+QF+4v9n/8n/2qgoAADARdUSAEKC/goC/Z6uQajaoH97j/kXP+DvfLjfwKP9bRyy/BD/ls6bwgrta/ze1JTDR/xMlAJwg6pEQoVPWHTGVssNeOpfOZBD0mSCEmVpY7pANxcR0pYPONjSbj5A/+SAzNLsK501KLPfve2KSQ+4Oj+A6D8AAEhVnAAwFfSXHOXfZfHaPnlBf1byqbn9HLqO2pYQ/1bLgf5uBvTzej4Ay5Q6eete62RlF9KvXfk53FZmD+zvs8TvNK60muH4nKxA1karF6O4JG4tIrSbD0jS/6Hylr5tbvcfbF8sqF4x0naj+v10ZTkwP4DoPwAAyJKeAGgh6K849Nzu/Z+9a/u0FPGX9Wi/oiIYfLSfEP9L3Qr0E823QN0GcbjfHpLSaztV6cWaZBc0fDVVLkP+7IHdD7fd8HomE8U98ZAAACAASURBVDTKCqT8ascWEVLRUfee+yEfUPZDVTzH3k1lAjw75wcQ/QcAADl+JADaedL/YHipd3eqVHzMf/8Tpf7Z3qB/++H+jLqyeCUfDWvB6p9woJ1rgX5C+Y1YFmSnZfeZO3nrf0cVxZQ7LudhiGZR0VryGmQnTJzbprImE5Sut5oP6T9/1P1FhL63bNqSOA1l5gPqbNzSfMDLj1XYR4nNvfyEwXyAJ35+wN8j+g8AAHJFlccblZ/0rz6ikXFbXTHoX/0x/1KbrUVr0L/bK/nIifVb/Qj/HpsC/V0P4uceq4lW61Llo6b6nSTJ+RuJhDw5IygDuYHM3e8RNpmgcVi80XQBpxYR8vdGGCn5AEVdcS8r5kg+IO35mlpnQdOpA7tRdznJgC2z8wOI/gMAgELlXgLcwaA/a/t40lby6dyj/S6F+LekBPrzZpB0StoRq3jGD3CSqkTCyx+oi6fm7E+S/KcrWl1WKIvkyQRmswIpvypgEaHKe0/LB2iYHOC9vK1onPra/czBxpKdf9A/OSB1J836vF91A4fxdjkpgZbnBxD9BwAAZWQnAEoPXRqt6lNxX8pVfMx//xOl/tmioH/LT/dLerRfzS5rhfu1VLXhc+rgmFouT/1HFa1Ws9o7VkuAeY1Ouvz1dppsXkBqIec5DBG5gV1NJxN4yvIEWVspXVE1H9J//qiorECjfECy8/9Ntpm2m92/uPXygNQy5X8ozfMGap4W3ZwfQPQfAACU9DIB0GbQv8ru1KoY9K/+mH+pzdaiM+ivfagsKdzvQqxfWojfM1EklwP9RPNNE/0UNdSx/5xRdgRpfb5gKmDFiZNNlMoNeMIatKBWMvMEiZL6dHoRocxiNIrd78zw+L4t8gEFyuWfavS7JmdBR+YH/L3/lOg/AAAoKyo3kFc6aGoxqlI3NF896G9RxN/THzbNW2JF0T6dD/cLjO975kpld6C/frLEzuOtiDg7zFLVAx09XYseYX/+Hxm5gYy97f9MWmOlTOJIHXqrmDGgZ7pA+4sIZca80zaf+bESO9nNBySH21TUlzLzAXW2bzQfkLLbNCX262fXSg3uzQ8g+g8AACrJXALIoqB/ZkErLiZZ+Z8tCvprXdtH0qP9CnbZcqzfRPRTYoj/5d6lBWeUVJe8gyqHAL1OdvUK+kKeDicS0otcKjfgtdOtSj60IStPkFJIfy8gvf09jesINcsKZG015aONswLt5ANe/npLLw94sZP/n733XJqd16H0oKp9S87Z5VQu55ztGxqPxzmVcxj7Lpxzvp+Rf3QQA0ACJEiR6vVUnfO9u5sEIErdLa1FSvv6AQl2E+WIRsXNDHgHXMYSUJoBUP8BAAAAYOVtADjL/S+8r+mchP56vFKLEReqJcWfr0IZtq9/JWzIXXL/flP7Z+lnosS/iIB3j9Dv43lsqM4FLHIATGfvvbYMPzWMt31WRiS+b8/VvIGsyXRvQEwu5L/fJMgq4FyBh91ECH7AN0n/Da/CPlmwM3hjphlgzJVft/7U+gCo/wAAAABo4M9qM/29VX5tePHtjab50zzRvzSFvC9yAcj9IatL/C/uFfrloXiIjrnUviaixwwsAH4H8xIfU8ci/D7kZm+AYh30JhZdTPDwmwjlqwQqc2fKGcf7AWfwv+aAQprwH1s/PIDN3Jrld9YHQP0HAAAAQBviLYAM2M+ySudRztd0y0zzp63u7TNC8YfWb2QPif/FekL/lkr0Ant2y3EbQqLkgIeSqFyDMjixxJFYKGK0N/DJvshthcqYFxOM+PLd+SZCtZKO2X6A/XQSfkAL3U4APXp9ANR/AAAAADTTagBYb5ox/FqsT+fdSPGnTab5Q+5Xw4zz/dpFxiCrScWeQv8aO3Hd8XkDnR3cipeOdVzhxjFJIh4U68alA5PO+cwUPIuTb+TEDjcR6vUDdFnyXIMWB8Q98DBhBa5myYPXBwAAAAAAKLEYAPeL/u1nWHtP86dJov8cxX8zud/7OEnnJa0iRNwr8cdp1xH619k7RHTjfllsHABYjqZfJYYpRgKT0I65xBuXDkTegNBqMZMgVCuZP6d4QQd/VjjmJkK1Lcrft9wyyOAHtCwOUAf/tk5OBActDqDsQHqIH+BnBnxi77E+4L/+q/6/gdEBAAAA8HRqBoBe1XW4IHA+adpb9H/KNP/e+jG134v79f0s/0yhfz0JG2o+ACDF2Uigcd99hRJ38gbiGuq/k7f6BDe4ApRv4pibCNnlb8sSgcwPaFocUMqyoR/QfQcqceFE6AfMWBzQnWKL9QFQ/wEAAADQCWcATBX9yevEsDDty5/tp/m3Jhmt+O8t99+t9S8k8b/4IaH/zjUTEPT7GG2yglVQ7Onn7L0RqnAyy7fcUGBNb8AQcr3FBJLXs/dNhEb7Acn9gtb1A87gf80BhTThP2Y9PKBMu1b+9PUBUP8BAAAA0M/HANAIu86XMA6rT3kg+lM6CO3T/HWD2XF3nU21fkprmaMbLSfxv0iuVaX3XBkw4HcP6ZPVfIjs4H68DOyfMhJCyj/ZunPESd5AOVM3AxYT+B8yNywXYG8iFJ0grO8HGG4WZMjSLk8nxsodfoDD5Zp2v3+/RbpmzT9ufQDUfwAAAAC48KdyUjxd9LedpI2+yP7Ne/uMm+ZvnOC/qNw/9KhbVOJ/saXQf98w7n2zndK47bxdAPQCI4GloGPp5gCXx2PxpQMtSSKfIGguTen34F5XIPED2m8cNNAPSJz4dj9g0OKAuMeUhwknhpbP9K3Knk8uP3vvorPz+gCo/wAAAADwIroF0IDH9pLpVItvOvMKePtp/q1JBon+FsV/Gbl/4tT+QQdGO3Wf4/eE/odMzBfHZ/9NA2BLJhoJumzDKCwdUN8fZN7SgXIyb5hUJ3dqMN0VoF7NVyC+0Ux88/tH+QEtiwPUwb+tkxPWQYsDKD5I+m4WlHTTffw97qIjJlx4fcB/9VdD/QcAAACAG39uF/1plPGgZnvRfyXFnww39ulwFHxgRm+83H+31n+fxF9MqqejvL2n5IdAzd8e7KlB3P0NewO6Y6l7LoY+lYXVvAF9t5FHmtYViP6153KB9fyAys2CohZ4eEC/H3BYD13/p+yuuj4A6j8AAAAAfOEeAtyI/aTvPgWkmLr17O9n7+0zbpo/pva3cLfEX8uu5HeEfqj5oxg2gK0H5w+K09M5xX+o3sj5wZ1WmQ4t/tv5A1eeTDD/kQNt/f2OH2mN7O3LBSzngDUW8APUiwMoO9lYyg84KDsdXNUPsK0GYPo/cX0A1H8AAAAAuNNpAOwj+m8/zb81SW3A15rm73d4zJf7Z8lEdX2f5hVDRBD6I0qbs161PozZLojsoBvxYDAcJWf0H/7Nrlp2hj9Xyf8xYulA+ZyunrC6Q3xqHn+7Ie1ygWGuwBFHneUHtM6tnuQH2M4LtUsQ2ueqp34A88Xm9B0l+gH1+L1OAD1lfQDUfwAAAACMoMEAgOjfH6IUNgi+5TR/c3Cfe8KoZHEHJk3t/4RfROJ/8WNCf6XgR6r59XsfKF4D4IHwhzqMBJE7vYEsR5Ram1Az0g7FSyF6pUY+ESNLexsDvB/A12QkOaiSBQJr+QFH/LbBDxi/OIDo3ocH2K4keg/L7dYHQP0HAAAAwCCUBsAmon9l9W3radpP39tnuWn+j5P7Ra3/Hp3Hx49p7Tpyb0r3T3gyNgNpF2URgH2BkVD0Bmjwz7uTNxB1Uqa1wvbZcLlAEmknP0BRoVqohh8QxGhcFpDXZC9g+fUBf/mv/n+7ogAAAAAAyBQMgAeI/ltM829NMuLePqtO84+WzY47zGbcyYeX+6dKMU4DuIfQ/yR93zY9H2p+H086coCebT43Y42E0nujhyjIWvAGyP0zWp3x0OQQXF3LmZXc6AokE/v7c432A9IzR3vlQ28WFLVY6uEBROMfJpwbTDoh3tMMeEdceH0AAAAAAIAviQEA0b8zRClsEBzT/DW5Ror+M+/kM39qv+twdVXbezlVYm+h/5dvtrPdzgK/g9fBuc3ntVSovGpKdg+GbviNtxUi3cmS6zICbaApNxH63DN+rB9w/dflQIrMpLX9gKbFAYYs7RPVD8pOx1M/wGVxwMsQMoQaawa8485dH4Dp/wAAAAAYyp+lRX/VafDqiv8n/n6i/3Om+d93J58hGYd9ANur/XGh/6lq/pqj7cQm+wDcRtfh7/jZWfFIPaL/hHDPFo07jeFebyCKrthOnU/ABrprucAcPyCPNMoPiO55c7bUPcoPyBYHKIKzWQYtDoh7ZDcL6rSdGufj+5sB77gT1wdA/QcAAADAaLQPAZ4501+Ra3XRP7kk6gmV06r4q7reNs1/gOI/XO4fOrV/wCfOobxfEPqh5nezyYgAUML3MG7//G22KKHuDVC+TXd5A/G/531HSj6BwhhYxBXY3g+ISksfH/AMP6BlcYA6+Lf19yQ+tf6695F9TUCeeJQZ8I7uZwn85b8G6j8AAAAAhlMyACbf3qeWrvU8K1oC7MoP3ttn2Rv7DFT8RYtiQbnfraTnCf3a3beJdj1y3DYZgh/j0asxhrDYcXy/ndB5CDlswMH89SKYRTzVG6DiKeLMpQNXjmyDW12BejepHfyA6ES1qWzjpHi1aJ35AU2LA0pZGg+GUU5A3xz8UWbAO7rT+gCo/wAAAACYQ2oAzL+n/xDdH/f2cYy85o19Rin+vNy/jtbvuslPfBivuOMWkwNDhg3Owts8kSWkc+yK6TD7veNQWGwHOpbTqBEn+NkDBm/AJ6+MeumA0MOxDHa5QMtqWVWF8AMiW2iXhwfQcD9AN6dovTUBefqxZsA7h65OqP8AAAAAmMYfWlH0f7eyBZ0i+ieXLz2hcloVf1XXaaL/VtP8k7lU4atONG2+XwFjJf5PjgAI/b+m5t8sry86KmBJOo6W9DhfyMjtxFoLv+WF8RjnDRCjMbrmLcJt8lSTgNUXa8sFLOKy0GiUH6Atp55oqB+w7sMDKD7ls50xq7LYpPw11wTkFYw6idHUCfUfAAAAADP5M039NyZSnNMVFm53wmiL+03ztwX/lWn+jOLvFr91wzsvhaYpsL8o9I/ZzJXUvxjt9q67BQBMoe8j4GgnTP8slhPa1l1M8QaYEqYNWtUkcD91ys8Pi5bASn4AZafbS/oBUVHPfHhA2NDXCfj+1+s2k31rAt4xgr9nmAHvTAfUfwAAAADMRvsQ4Dbs7kLtJG7KNH/KrkJ6QuWME/3vmebve8I8XvT3CT5P7p8n8X/yxczJPk3o996cRbVww2YuugU/AkZ/AjcvU6njuDSBf2lCIdUAd3kDTLDzyn2bN5Cll8rtPXoZS0DrB6iye/sBwU12ft4PUNSmVq8b/QBfJ+D667sXPKahed2Lf44Z8M60/M8SAAAAAJ6HvwHQek5TPGUbofvzguMQ0b9V8Vd1nSj67zrN3yF40/YurvVD6E9YV4rFxPwaS2w5rudXJT08fKfvL4ejnSBsa1MGN2+gtQA2hMEb8MmrQPqV9DoFSyTS4lm7eYlAtx+QdjqzK4BEyG8lDHOmr7Yi+wHLPTyAgiN9thMQhD0PcrIBPgGJem2Ad6Tgb/9v/f/yr8X0fwAAAADMxscAGCr619pZYC6r9pvmbwu+4DT/8Yp/b/xnyf0Q+gdkbeUpE/OnFre84Ao2o++I+iU7Qdg2WSGf4Q2Ir7YXwIZgIt34yAESzor7z9H28gNoyCOFk2UGPosDKNllyz5M+Lg+0Tc5AUdwEC62JuAdL/jboTyo/wAAAAC4hXYDoO8MTTwdc14UmUXbVPTHNP8M72n+lo1t2tED5YF7JH4u3Q8J/U+R8mmWoQjAM1nGTpj+6eRqLXgDQg97jixb5aX27FKIgjdQqcL91yCZHg8/wNEP+N6mhk3cQHiydOvDhMXP591OAC29JuAdL/i7pUio/wAAAAC4C5sBMEj09wgegHv7GBki+j9rmr/1+sVXieG0Bs/4WlYS+p0TP0XNh5QPwN70LtqrvjShEDnxvUsHpngDlXjSGgKvH5at/YA8hIJd/QD5ZkET/ICKdh86AbVQ9Wjhq+pBW35NwDtq8LeqSKj/AAAAALiRugHgct41MvgHRhq2n+LdOs3fFrxXJui/LsxYfJr/IMXfe2p/shT9Bh4p9N9zy4YuoOYDALpwsRMKE/27Y2cRZywdsHkDTdmrsbJ1e9z2+005z7M27sHUDyhFMvsBeSP4AW03CwoDdjoB7/c8nIDXGw37dPU1Ae+owd98qVD/AQAAAHAvvAEwVPT3S0FEHrr/raI/pvnHuCr+ZNtSba4xc4du0HB/Reh3i90MpPylwZiDhNXNwblI8/XLs/wbmbF0wOYNiK82Zi8HyieCe1oCyY++gx9A2enDPn6A02yL0A8401dbifZU38MDVnMCdPUwMfdYE/COHfz9TgP1HwAAAAC3cxkAjlMrxDfWme9fq6RV8Vd1hegfkCr+vcGHTPP3uaXPbVP7IfS7AjXfwCNGAGrw40mPU9/j9qkHUEEpHOINCHFdlw6Um9uWDjjs90ylT9RfXz8gCPgTfsA1mOE1hIcZ8AnjsziAkj3V6gc4OwFEVH9UwFEIddaLEcPusSbgHZuI/su/9v8ZERoAAAAAwMQfp9OnWfP9Kb9icdP9x03ztwXvXbPfeQGXgWn+dm6Y2i+aKM8T+seswDCX8XTGb/J0XfSpQizopXhkmD8JA+2EXQ7hsho/e+mAjzdQ7mHzBpqys35AlMdPaP5BP2CbmwVRfP58fJNMdgIomBxTcQJUCwJq9TBhN1kTAPUfAAAAAItgewgwx97z/c0neJjm38JPTPMfPsE/C3sU/jUgncSWQv9PCfpDdLWmVmAFfuHg9zwezbEG2gnPWJowe+lAOejwpQOl6c9dSTOVHn5AIUSNNOMufsB3H/U4AcUy3J0AMc4T1wRA/QcAAADAOrQZABPn+1NyBXKH7g/RvwXXaf5DFH+/af7ugho/bmPUmgcJ/Xysh8mdw9X8x0n5DzsAgIZ1hXJHO2H60oQJ3w32pQPdu3r40gGDN9AlYWeDlDxCYHE/gEoXD3nt9aTj/ACnk7/QD3DYTT1OQFjBeCdAZQPUiuEjL7YmAOo/AAAAAJbCagBMme//Dth6Fuyi++dXJj4xG4muOTZR/HuDjxD9uyfzDBH9Gbl/gNAyU+jnc41X0faSeh8zMX+vYQfAyqJ2wrylCeW58vNMQ66Agjcg9NAzfOlAZZ57n4SdrqlY3A+g7AyteF1hXiLg6Acs/vCATZyAig0QJthzTQDUfwAAAACshsYAmDvfv1n6L5ahFojrbTHN/wNztbec4k/r3dgnuWZO/nRNUWZXoX9NufkZE/PXHFsAnsSGdkLhXKQwUb4W1ZVHLB240w9oCRizrx9g3/Cwx+ibBannI2VkTsBVrKW7gxNQW9uhsgFqxfDxb1oTAPUfAAAAAAtSNgD2nu9PNt2/0nzWTP8dRH8vxZ9s2zhnmv84xZ+yC0SvsGUg9NvAxHzwFKapr8vy/A+B4xY2LXqUZN7KogFtOicWWjpgOH+a6gfQmU4U/x0/wHFxwAA/4Pj07ncCAitgrhNwHpr9pSpphzUBUP8BAAAAsCa5AfBr8/0rzVWhuhR/8rgwivFU/D+RMM3fRDrNv2PMHiT084EmS3TORyCk/LVYSPLGXlsA1wV9T9+lms2Tp4XI/7Z7A6VE3sxeOpAMDPyA5oCNfoBtcQCZN3ycHxA5AfbCorTjnQBKNvK7vzpXA+ShF1sTAPUfAAAAAMsSGgDLz/evlWGcpH+b7r/dNP+uyEMU/3Wn+fcq/op6IPRrKSs7pncceZCI6D9eDxocsAHG4w12QtOMfrs30JhoAMOXDsh+gJyCffMZfgA1fy7UfoBtcUDewtEPaDUDvv1WdgK+b2ZH5mvbPWyAsJg11gRA/QcAAADAyvyp6OCLSP9UOhncQvf3F/1TxbmT5af5L/j8XhfR32UtiyG4p3ayuNBPTIWu0tGWAp5IZWietbG/xEKLIm5i1rF7n52wxKdTKsJyzlU+T9pm6UC7NxD3TCRZRz+gFo1tPcEP4DK1BZziB9i3+tsjsHu+1weLOAHpvtV1F5sc/Ic56MDtnUYboFYMi9eagP/ir4P6DwAAAIClYZ4B4C76U4/uTw3TeNkIs3X/cHrPktP8P5FcRP8h0/yfe2MfFzerEvCJQn8xaa/Wv4SE5kN9yx+0sR8gcwMJ32NjRTuhvoU32gmNc/mZ97ZZOqDzBmb6AUy6rontc/2AIOBafkDHGC7sBIR1+DgBR9Yq7iuuCah0LBczd00A1H8AAAAArE9kACwu/ZsDPUP39xT9U8W/K/LK0/y9Ff8rsvc0f1s4CP1ElNa53URZG2tPzIfs/kQ2/JgwjDo2f8xOSCRoj1pU4YzrI3qXDtzhDXT7AXk4fefhfkAUsn94k+kXjn7AUQoTFm5bHEDarY5SLOUEBKsCfJ2Akg3wbpc2MS8ISFoPXhMA9R8AAAAAW/BnhOhPnbo/9U1L3133X3aaPxk2DdP8fUR/zzl1tUDzVT+Dyi+/1hT8FtaemP84KX/HAwA4ojgADMfIBnbCmCO+MGPgLm8gS119r750oD1dH11+QN5hIT+AwnPilf2A5JJB9gNsiwPCFoYT4k/XFZyAIK2vE1C3VYQ1AY0LAr4dxqwJgPoPAAAAgF1gbgHUyW3S/9a6/7Kiv7/i3zvN/+GKP3leJTP9V5/OL7/WFHwQa0v5NFtqdtpY6ONgMq1ebHOThsR3BTVv8MH8pY9l5KlLB37CD3jL25v4AarFAZVccALk1G1rAloWBCQdnNYEQP0HAAAAwEa4GQC9uj+1iuB36P4UnIy3X9p6iv6p4t8V2V30x/N7DXFaKvkJob8Wv5m11fxVpHyo8wCU+Q07oaV0yRsY8s36pKUDz/QDKN2apf2AuBqFH7C+E0D1KyeZfiegdi6oXxPQviCgWEyV75oAqP8AAAAA2AsHA+Ae6V8xlWWErreS7n/DNH91FtzYRx/E0A9CfydRHbOHbhUpn6Dm78vNK0sewSZH/z12Qj1rocXaiwaqcecsHeg5/H7TD2gJGBOe/nWewhfvU39lqaZwcQLe/9eyKd9+NzgBtWn4DWsCGhcEKIopAPUfAAAAANvRbgA46P6lyTRFiqkfrfvfIPrPnubvrfhfkb2n+TdZVuaud2rWzxD6hyRaRc3fRMzsA6o3cMT3cNrkE6j+HS++YJTIS3Fr7x/iPzThmhi/dCATtkf5AXkejk38ADpTadlj0DwXB9zlBFCg36/kBHxeVjuCTmsCuhYEFIvJ+c//+v+7LQkAAAAAwI20GAB3Sv8kCs2qmoxJHXR/Ijp7rlZSxZ96rn2cRX9M89cHWVvxtwn99lEduRUewzVRw3vAxHzI8QB8ebqdIH3Bptvd6A3Ypwwn4bZaOpCcUDJ+QD2aTHKiCD9Ag4sf4OsEkHaLBjoB6hoi0kuVo/DgXLGjx5qA9gUBimII6j8AAAAAtsVgANys+xMv/f+C7j9B8Vdn6RL9xyn+FFz6dMZJaJ3mv6Tiv7PQTwtq/Q+YmA81/4fZ5ijtZpvDfB87obDKatKiAaFVYenADd5AVkP4EuMH5NHgB3DhZ/gBDdcBlxPA99NOUTcuC5CdgHoqMVrnQ4NfXT8DonUCyHNNQO+CAKEYqP8AAAAA2BeVAbCa9K+tZj/dnxKFvSWU8zR/ccmFOQum+UtN3WWJJwn9jemMG4WJ+duyx965h1vH5sYDUvyO86lpm49aZ6Gth8/gRQNMJGXD8nnkJHtgET8gDtXlB9SqsvkBtWhsa9EPcDUDLE7Ap8/NTgAFVzb3OwFmG0DOa1oT0LUgIO75n/8NUP8BAAAAsCtH2QC4X/en6ExumO5P2ZWXnTOM0kCf7u8s+i86zR+Kv1xJMV3htdb4LjAFzdX619WOd5AY7xi9MTl3GG1gQNyhTcfPz9oJhcpcBrJx0UC5RaM3kAYdt3RgET+Asp/CZj+A6PtcWk1V+ZuuSwTiTUmeJ9xnnwx1AiphH+EEhBeV89cE9C8IgPoPAAAAgE35ngjxBsCW0v+v6f4Liv7eiv8VuW2MXRT/NM59oj8XYUuhvz2jZdMWEfrXlfcijEM0bfYsAHezj50w71MoZbp50UC1xXpLB57pB+Th9J3X9gP6nQASr45UCnWrE0CXTXO/E0C3rgloWxAA9R8AAAAADyAyAJbQ/el9rtY6KbvCKrp/kN19vr96qUT7FmCafz3FgGn+R+FfxlAjuEfojxMN1Po30bjtIzBusisAIGaknWDTbGVc7pWR4r1ogMl2+9KBfm+g1Q+gTHUXurdUYvcD8g4L+gHntW5hphNA5PzQYHXxV9hlnIAb1wSYFgRA/QcAAADApiRnTG8D4Dekf+j+K93b53nT/Aco/nEpuqp2EvqZYBXctf6F9e5eKZ+W3jowHOx9ljsXBHnjaCekvzSCemaOW+vZe0bFp7hn6YD0893szOSt0zIT9wF+gKqaV9PrkqBHyIYTQHuvCTgO5rMSAvUfAAAAAA/hpD/90r+D7t/mQGgvO35c91/x3j6Y5l+IoFX8ny30U8dHphbwFjAxv4sNN/9JOvOjKB5LrQLY/lQl89fE2WnGAFeCHoM3oErUt3SgVz2Xs8EPkAvTRPs2eg8XnIBuJyAtyjiS34tBgxPwzduxJuD4pEvaQP0HAAAAwKawumXpIcD1iLdI/9D9lQGbrJ1B89mh+MuVJCnkwoZpoIsI/U2d6zHdwcR8a/2P0UjB43H8pW75lK/8UZGU0eP7fxssGuB7T146AD8gZbwfACegiKMTkEY+iZouR8wLAshnTcBBRMd7GKD+AwAAAOBhtBgAK0/5d9D9iehcV/evx7QP7Iqif7GS/UT/Nab53yz0k+m63hywB0sxz5qY3280AgA4Wj47jnbCtI/uVZnNG1ht0QAfwHnpgMIPCDo9zw/I83D448rBjwAAIABJREFU+AFRon4nQNs3TRqOgGGHruMEvP+v73wx/ByZzrfaFgRQ75qAg+g/+xv/L1tGAAAAAIA1KIiZNgPgBum/IgS7Tq39Jd3fU/THNP96JUkpY6f5rzOjv6m/KmwzpevBrdV8SPmrsfXh9LOs+jnxPamoH5su4yBJp/MXDXBVWPFYOqDwAyg7p3qQH0B03Xqfe5Ol0Q/gJfJmJ+DSxBudAKLwsQP6vnc7Ae//+TgB1LomoGVBALWvCYD6DwAAAIAncqgMgNVu9bOS7k9Eh/p6hEmtiF6O0Drfv3OfDp7m3zGMTaL/AMU/LmXINP9nCv1Z5DaEegqi00o8Q81ff5wBSPA9aFf9oNbrOpP/mjprg89bNFDtP2zpQHH++Mp+wNWB8QOY7o1luPkBcj2PcwL4fjYngLTFy05AJVUlbNOagPYFAWRYEwD1HwAAAACbIk9rfr9TMQBmS/912YsL1Vbkd3FuI7+n+0fXWZjmX1b8s395pO52LBx8mtWEflpc699ayr999H6CpQ+BX2LA4b6/nVCY9q6b825k/qIBTf+uM8UoxT5+gJgh/k+he0sZ7X7AmYxLoamLE0BE501OAAWfh1YngKwbnjsBFFyT9U0/sa8JaFwQQHULBOo/AAAAAB7J68SHNwCWutUPL/orOhbaQ/fXEg3XItP871P8uSCqaf4dqZtE/8WE/ix4M6XJWxPUaqj5vSw9QguC8ZpAXTjsibpsyAlz3v1yNS8aEF9tzJ5h3DT4AaYyQj9A+/M7yQmgUL13cAKoeBCLfZdwAl6XaS1yfBjWviaga0EAMWsC/lOo/wAAAADYk+rc/xepAbDUlH9P6f9G3Z/0Fy6q7Bru1P0r+7QtzprT/F2tqTyoKoL9oO45ki3Be5g6qZ8LuLTwOlvKHzIYS4/wRizh62zLpR278TQ7wb4dqywaoHD/ils7cOmAYuvgB+jLCOfe5xmYZHs5AZ+8Q52ASthWJ+D9z/Po9ACCUESWKU/tCwIIv6EAAAAAeDjhKdXbAFhnyn9F9C/2lVp26f6UXVDp+R3d32Wa/yKKfxbkKPzLI/UoxX8HoZ9u1fqX0KA3UfPnjRWuxsE0BsypX95OMG6z3+R3psfQRQNRXN4boOIvjbM38JN+AAXzxIvdzWUobp7j5wQU+4aNVnECSLyuUy0LaC2+d0p+Gi2oSPPx6cv+n/5NmP4PAAAAgP1Qzv1/8WedKf+e0j90fxNtur9o4ZhTN3T9pWn+tWHZROgnvrxmQaLG0GGpZZzCdCkf0jwABfawE0whi5skvbn+ooE07pSlAw/2A5iSjvivAX7Ad1sMTgBVPwSiPm7TxIOizk/XmU4ABZL5fU6A14IAMq4JaMgO9R8AAAAAzyM/dao8BLgSrnvKv0r0l7uzDaD7a/HT/feb5l9S/LN/eaT2nOY/YFLoeKGfmi5hFQya1L+Dmg8pHzyT/uNzidU9fdxtJ9TcArm+rRcNpNELSwf6vIGpfoBQlOAHCK2LVDaH9wPi/7AdDal1D9T95q+cSHk5AVfK33MCwovE+WsC9AsCoP4DAAAAYEdMc/9fNBoA/VP+PaV/8bRWyVjdvx7T+Ghfo5ScpwvjTJnvX7xOlXBW/Lkg203zd9A3Zgj91HSRqsBd6x+ig2Ni/qPBaG/BAPV8b+wDcshbXfw5eu6igTS6uKQt8QYW8APyV0t+AAVas9y6SEXTDx0HPzOgwQkgqt4gCE5AXkDUWseNawLKqaH+AwAAAOB5SKdINgOgc8q/QfQXImT12OIlvcMU0P2rHfli6r3WnOZ/u+KvraFFu/DWKCtC/4CMqRLhF80IJubr2LfyB/EAmXo+LeJsJ7vsJ1msL2r/6y4a4PMMsQeic41b/AC2Fjmiwg+g1h983eKARNA+Ke5o2k3h6VO95gWcAG3fNKluA/O+rk4AGYq/cU0AuyAA6j8AAAAAdqRh7v8LrQHQOeV/Oem/WV6crvtfAZ+o+68yzX9fxX/rGf1ZzDu0/krOn1Pzlyl7F5kUbM2o2eG9jdTM/5wUlNS1Fw3wnaR1A60puPiJHxBlazxm9JaAlx9A2VlKvx8gmAEUn3OkZgDTsZ7O8aHB4cu8t2N1AoKcg9c9JH09nIDX2w1G3U1rAr55of4DAAAA4HmUT4UqBkDPlH+z6M8FiYtpiRcGgO6v78hUoupVb/tL0/xro1GbMFno1cMNQn8WdrrWr5I9PBKthF/lkONBiRmfEbvm1xOjib3thP7qt100wHcasXQgkeEzP4DPJcYxFMP7AXxfux/gbwZcL6VmQNjxVicgfOcpTgDfr+4EtJatv1O/OuD1d+HCC+o/AAAAAHakee7/C9EA6Jny3yL9F0/8MN9fS3q10rluQ9/LMo3aW/Q/Cv/yyLvvNP/K9LVxml3zJ64WTYdR699C35+01OOXGL7fMcx34f8rcIupMNtOcJ1rr8y9/qIBsau0dMCUJfMDKDlnHe0HfPr2+gG+ZgBTRmoGPNoJIKLzJieAvkdhlxOwwIIAktcE/Cd/8//pmAUAAAAAYAWq519HbgA0T/lvnO9P4lkk5vvbiK6V19P9O/cmpvm3VDBV6JfLaA+oYE+tf/eJ+W6zYQHYhe1NhRZdmvlHR9B6pihycV2A96IBat+WtF+ip5si7+cH1MwAaj0TKS0OiKfMJ+2f4ARERTk4ARSMl6Gvygng3y7tvhLuCwIoWxMA9R8AAAAAO9Iz9//b4jIAmqf833+rH7lyd9W1FvAwXuI8Wvd3Ff1XUvy1NQyd5s+sexiqbt+s9a8q9O8+MR9SPgC3MdFUMH6stfr6HYsGCied7YsGahmtJCfoW/sBXWYAxWdEzmZAqmyfYeOxTgBVDrelnAAKivV2Akja0ji1+StowIIAwtx/AAAAADwR/XnWn7Yp/+3z/Yk/Q2w8x/OS/qH7q3qN1/0bRP+OdJaCByj+2tRs8DGKf2mlhWfYIrdq/U7RFpDyoeODWSyysEbD8z8WwhYaBT+NrFnK8JhFA5r3TXo67ecHLGoGZE4ABaMx3gmg4DSscgpYcQK0FS7jBJB4zXZcGfi8UTsFvgsC/uO/Beo/AAAAAPbDZe7/i8pDgPMc99/qp+hYQPeXevGVqHrpdH8hUZ2Jor+l1NoIVUSSUi8lWXDz8aYv4w6hX0y7mtY/VTPElPw5bKRZ4whwRLffPSzLfZF0wUZjIA02zhvwXzRQDio30UvqtJgfYDED8hLkQFwhnWbAak4AUfUGQeJMeVuFQVFnYRfUaHYCiOg80kMhrC9Nwqc21TxoQQAAAAAAwNZYzwFrBsD7BLHvsixXG73n+5Npy3t1/0olpYB9EvkRB1P24iup9xqp+88S/Y1FDpjm32YRhf8asqKiGw+tf5LQXws4Sr578JT8rqMagNUZ8SW/v6lQ+D3yWDQgBr9x0UA1d2Wee5ioQD6pR30ilieNzqfMfoBxmnY4qaVrcUByfmXyA+Y4AaqqZjsB9P1YzncCzmRvzVgT0LMgANP/AQAAALAdjnP/XwgGwHXu2nHhxQrQrvP93zG1oepNKqG20P2FdGrpf5juv6Lo/6Bp/kGv1YR+8dWW+EX6vT1V2BXFuUZusUYA+D0ebSr81qKBoCvbpCRwf4OX4SfaKzpmScX1ATYzQJE6rLnLDKD47FdvBlScALpcALv0HFUFJ+Db/spStwGo0MK4JsC6IADqPwAAAAAeRttlUGYAnN3z/SmTegfM939HthfTEseo+18BofvH7TcQ/Tea5t9Wai2ahQdp/e1XzGsAHR/MwX11znwe9Hlw/J0yTihR4r9oII03f9HAJ76UIXvYwBp+QPgb12AGJI3aCnYyA1qdgDTGWWlcjw8nICuvZAPUWxiNGeWCAKj/AAAAANgO97n/Lz4GwPtsr++aKTsBa5H+dWq7WtfuCALd31n3X1L0b5bRb53m3/5BbdTv1tX6m3bcwhIgpPwRPEC2Bl4MOhg2/3BKp5jDlj9JymLFGCi8OWnRQDl+dhq9oh+QnP7dcqegihkgVNEwRZ0Pv4ETkEbrdwK0fdOk31hpSXl5RhugFNOyJqCwIADqPwAAAAAeRs/VzJ/DLnMzhGpv89W1l/RPfSLaT+j+lbYz5vtvJ/rvpfg/TugvlVGKdp8sV1cCtgV6OgAJIz4UC3xTpCUM9wZ2XjSQB6/7AVxBHX5A6+KAcJ5GdBI8wwzgOxarsDoBYaNNnIDwHR8nIMjZ5gQQ0VE+mY0OhroNENbSvyYgXxAA9R8AAAAA2zFo7v+L2kOAy8Tna+Nu9fOOXw/V0X2y7k/BBUz4X10vvhJVr1t1/71Ef2O1R/6vaaK/OZEYG1q/EJxnAYGuA+j4QMVah7lW5y2xyaG/tqmwjDdgEFKFnvk/dP2r1P2APHqXH+BtBtBijw2Y5ARQZAiMdgKIPxCYpgs4AVyP4hR+mw2gCFiN9HYC/qO/9f+oNwUAAAAA2If+i6pWA+B7jttzgTpF+q9fgLTpvND94/a+8/19RH+qXlXx7ZXcPM1flcsu9Gsjq9lC6+eP5E3YRMyczv178v4K2tj2iFIPuPl+h7oh2WHgNDV2H7hzvYGC1Dp40UA5RCWoxg/gEqvnRPPyeq1XlugI/s9iBpChVMrO+oSf+klOAAUbO94JoKDoyumgqxNARKfZCeBUeMUU/tcBpP2G7F8TAPUfAAAAANsxdO7/C6MBEMpk7Qq44YKpWaaE7l9tu5ruv6Hov9Q0/9KsuaaARrYQ+kk6etdgB/1QGrYlBnOPAQQL0OxJl1tZPgbrmgpSTo8P+Q3egOuigTReHtyuEX87Ztq/ZXGA0gygpsUByS/y/Y8N0DoBttoWcQKIGh8abC7vKsrmBJzsFBimkLhXiw1QDJi1IyKo/wAAAAB4HC5iy2EwAF6n1J2Xol5T/tulf+j+wdsduj+VN0od+YdEf3/FPw3GRx4hH22h9fOH6xT2kKFbdfw9tg6AO2j/ZZFbrWMqeE2EV8Y4k/865mpfNFB484z+U2st9n/3Mi8OaJ1ubzYD3rnCc8BJjw0oOgFZZpvyHrcY6gR8es1wArQV2p2AYrPiFP7vkWP4ItKvCYD6DwAAAIDtGD33/9umZgB8zzx7RB+XKf+KAorLBWyXjO2z4+NeRxxM2YuvpN5rD93/NtFflZFN3CT6Nyj+9Sw1xd9dnN1N63cOvYfYzWx0j4cKAFiIWaZCYS5+nZHewBqLBqh6zsFP12/zA2yLA4pmQC2ptxlA4x4bUHQCwn8LTgCpz+YqTgBdLkCDE0DBLqybE31OgLnCVidAtgH4qsi8IKAeEHP/AQAAAPA4fAUu2QA4u+f7k9OUf6v0b3+cLxPnbt2/3n+07h93maj7/5jo3znN30vJ/XGhn/xGsh1+myDlAwdwnBTw/zZZnvJsgyM+pSp3a8qVpWxkDW+APy/hxcp+P2DOnYLWfmxAoxNAwXh1OQFpjMgJYBrX41seGjzbCZDHmQsuNDvYkqhxQQAb8D/626D+AwAAAGAzpOsuzRmb5pwuaZMZAK+T406xoH/Kf5to2y/9z9T9hXTOur+QRZfCQfcn1dhC9M/KYP+h6t6ZHVp/P0zJ0PHbweCAoQw6wPb1FeIBYY0Bfop1XyIhayMTvYHkzIE5ZREV+gbVuGIGJIE8zABqWhyQnBv0PDZgKScgzZI5AaSqXIq/oBPwbRgsCihGaFsTYF8QEAb8D6H+AwAAAOBZDLiaPC4D4PgrHgH7p/ybZeWuYYHuz6WYo/tD9BcqKioXBhS97tf6Vxf6IeV/eOp2gQ72krhnH8Ij8t074tLXtbhiIPtXU64IjxEY7A1kfkAWhJdBXc0AYk6j2s0Ais8tzWbAO1d4aml5bMBSToBYz+OdADroONnPd8EGkOMffEnfgwTnHAAAAAB4MvIVVP3MTHPuxs5H+kNzb/WT1fHqbsvWL/1vo/tfvX5A9/9h0X+04r+U0O8dmonfxBH9xy3sYjxvi4zspVkDR8bt+nmfKvdMLoNS+Hp39wZGLhpgYjh4A/FdcOaYAZT6ATYzoJbU2wwg7Z2CFMOymhNAkSGwvRPAeACk2C8NawIsCwIw/R8AAAAAT2LIdetJRPRn2t1++HZW6f/G+f6UXEKpK4HuLwWnZEh1QPQvdllK619S6KcnaP0LVAslfTYL7PTn03RYj/gsTNrbIyfa5/Ef6Q1YfkUzoZudmZNksEjzeXmvLkUzIM9hcCCSs1CzHxAOX5sZsLYTQMEWTXQCwm6Fdlk0RXmvo4mxAcIIBRugVhVjA1DJCYD6DwAAAIC9kK+C6ieImlPIwhWG/BDgMj1T/puu7Dqlf9LOI+GA7l+tZLTuD9G/2F5VqrvWv8GkftpA67+1mHtE/KXGHyxH/1HZcYQNOjjt23SzqcA29a3pKd5AeBZkMwMoLAx3CiqZAS5OAPE7SOsEVMooFTPfCQjiti0LqI+qwgYoRJB9AuGwfx0QaTqo/wAAAAB4EkP0meAEym4A9Ez5t1+49ev+nzj2Pjfo/pW2rro/l2sp3X+m6E/G2uopDuYvVUdVokqdZ71Jcw2LC/2UVDhNa36wjg+9nuce9wQoGLdrWj8MIz5EA0yFSpnS2+7j3eINDNg1zSPcMhd+wzsFTTQDXJwACnZQ0QnI8tiU90Ix2zoBbTZANYJ1TUC8IADqPwAAAAD2Qpaq6ieCmlNFRhqNURsAzVP+Wy/KvKR/sqr/0P2rlYzT/RtFf4ovntU8RvT3mt2/gdBPwSX0iOCDYxYZqCjP2BYI4uAOzpmH3qBM3rPa9VRPEjWpRs6vL+cKfnQLPwj3eAMd8vcsMyDr1W4G1JJ2mwEznYDw34IT8GnS7QTQ5QL0OAFBL7mkDieg+DVrsAEKeU1rAs7jP/zb//dSOgAAAACArRhynZmdnSkMgOYp/03XXND9mfcG6f7qyDXdvxTcMhq6MsIXVhL9038sLvpvoPULhsoOWv+2Uj5E/AFgCcVoho7wjM/EiBy6QdFN6m80BtTxHWhZNJD9qy2d0Qwg2683HhuQpFjDCaBgULqcgDRG5AQwjevx3R8afA10ZbcqbICwsoINIFf1eu0/gPoPAAAAgK2QL0jqZ3ua80Hd1VvBAGib8t9xHX6P9B+d/Xbp/vX+0P2bawhfeJLoz3VxFv03EPopng3nHjzGGHaU+vdgHR96dwdwYG4nPX4HHc/D97Q1gU4YH20MFII2M9obsMu14cmVZTp8ojQ/97EBTU4AV0f2xlJOQJolcwJIVbkU38sJyK9KCpdrZhtAziv5BFD/AQAAAPAkhlwXCtOLOQOgbcp/60XyPXf5b9P9SRxHXZdKQ4XgXo4f5niS7t8u+meh6u0FZNG/3reeS3EImY9S5+8R10n9vQOoxxK5ccQG6t33qcFOGwU5G2zHuIP2FP/hRFfpOjF/tDFQbrS+N9BsBlAsmqr6PvexAfqhCJyA8OplDydArGdRJ+Bq/fKuXGyAsLKCDfCJC/UfAAAAAHshX1Qop/+Y2vA9vq8GBkDDlP++K9gbpH/o/tUySu3H6v4Q/bP2d4j+O07qbwruZVa5pBpF9yZAwX8UWJwRMv3gHpHQwVTQnaGUM3caA4UA2kZ3eANn3k6KsL4ZoE1UWhxgMwOKGS+VXSl8NzsBcuTVnACKDIGhTsBnmxU2wDsg17LRBggLiYH6DwAAAIAnMeR6tHjm9Yeoacp/h47govvb5vu/+OQ1pF9Q94+79Ov+ikoG6v4Q/bP2E0X/H5jU/8JP679JD4eO/wUSNvBi6LE06yPXmSfSE22hPY2BcrZlvYGD3pLqmbwhd9GXlJxvCxq00DXR+Is2jNvigDGPDehzAsjlUQGLOAGUbE6zE/DZU9oFAZrDVV4TcGTjp0LhQAAAAAAArIw8F7Z+iqM5CdJMtUpe/aNU/8NLnGZukf5bkk7Q/YUsuhRP0v31V0VMfIj++i7dHMxfbsEFbtP6x1x09o3VEhfC0N8B0DDikzLgK6Ck4t9iDHABlvYGwl9kpRmQvKmrITxhsywOSE6xNn5sQHjyrLJDvo0GOAFheK7GtZ0A24IAw3dZeU2AeUFAUNl/8Hdg7j8AAAAAnsMQbUdxkiU/BJiIemaph0FumvJvzgvdvxj85vn+EP0tFfV9ZrlJ/YsJ/XSv1r+7lA8dH8zkruPt/k+aK47DWBuZ24yBQnwuxlrewGQzgGIxtWFxwBwzgFI/wGAGNE7JZ6Mdn0ocnIBaDfLWxU5ApYxSMZETEG2S84KAQ78OIOomrAloXBAAAAAAALAPC879fyEaAC332GGCzJb+J833J9Jddmyu+xN7hWiuoV33h+hvqejbS81TJvVrw5rH3y/cAHDtPAgM7FpY1azSC27sbi00ivgzjQEu4gregEUBP4L/mc0AXa7kJFN3Zvpp1GkGaBOVFgdUzABfJ4CCM7FJTkD4b37TFNPwy8W8jjC3BQHyJVHL92lhTYB+QQCm/wMAAADgMdw19/9FagCElynN7HGrH+j+UnDS6f6KMo7wT2XNW4n+TMy0/SKi/1Mm9WsjO2j9kyS+B8jND9iELtYVg9etbAi2zTUetoIu6c69+2whY6Dc4j5vwDodPjylMZkBDbniU74zfbXYL9H4i9OKeD/A2Qz4USfA4E6NWRAglvG6yOqYHcauCaguCID6DwAAAICNWHbu/4vLANhxyn9jOuvc7avL83V/+T1DGc26P0R/U68aH7FB276JcUK/NvgyWv/uOrhD/UPEyx9TscEkjMfVOHdhvLXQ/xGaaQwowpYDa16Twti8gS3MAIq1VeXYhhp/cZRGmAG/7AR8z9u0XhQXvNcGOOiQCjiPzstFaU0AuyAA6j8AAAAAHsMQWcN4XvZnR92/KyMjtWsal9q66v5cLuj+9ewQ/b8M0/3Haf2WTdPipfXvJev7VCsOErT4J7DXIT2C8cexJYOhbaOvUO3WPCAjjIGOsFYBv9kbcDYDiOJnBpQr6zUDrgCqvtMfGzDICahWwjkBWVZDAUwNvBOQZSjPxFeVcdkAlPht6oPzyGbrf959jZLHlIHzivd+JRgzqP8AAAAA2IjovOkU36n3VbXhe1TjVB4CXC9iiyn/L/TSP3R/Sxn36f4Q/b+4iv7jhH5D8N/W+j2urBvf24J19hTYkaHHz8hPl5evkCqp7YK7KoE+YEW/t+j11tia174xtGaAadr1ZQa8/3eG7xU75hWWCc8WppoBmkSDnAB6P8u2XkPgBITqdL8TcMpz9kUb4PO+1gngzoubFwRID/J9v+oyg4z4NQFQ/wEAAADwGIZcIBpPxF41NBoAO035p3RoxECL6P7qyArBVwy+tO4P0V9Lt+5v73Wn0F8Maws0R0EeqePfJuJDfAegwLgPiN9nXpo/sqwxUGhSWTSgCq72BriJ7SUzoGEifNDrCP6nMgOaMjJmgKrv+McGhOfMR/iyMOTLOwHX5HamjRz+7gUBog3gtxQgyfXv/53/m2NMAAAAAIChRGdJq879f2E2AHaa8k9W6b+Sq1Fphe7fmxqif0ir6L+d1i9HHjm8g4JAxwdTwG41cdvHrwmvnVubp5z/6zZjQBGzLt47ewOcFJ+ZAaVlAaq8aa/PXO7QDODz9GQMd7nNDIjSDbhTkGlZQC0ss5l2J6A09LVZ9kcptRDeZAPwNXwOoqYFASUbwNUDgPoPAAAAgMcw5HKzae7/C60BsNmUf1JL/1RXeKWL4KYCoPsrU0P0DwlEf1tHVeNlhf6WWMO1/i7H1Zlnq73P3rqHspSibpgt685SA5Fgl+9vMwayHKaYY7wBTsrOFGdhjjr3kmlwwpONz3mBanFA8qZp9MLFAapq++4U5OgEKMJGs/JV2Y/QBsjyZalrH6vifYGy8N9NVToBcnBPG8BvKQDUfwAAAABsRHROtPbc/xd1A2CzKf9kkv4rufolVzfdv9T+mbo/RH/yOAKZoB3dG4LpIy+m9cuHojsbKd0blapgZZEW9DNu/z7TWniGMaAL2+gNiCpt0CFTnIeaAXSdK6jNgKak4RyUEWbAIk6AIMfnqb8+T21BQK8DIYR/barJBkiDXzbAu4ly5As2QJ8HAPUfAAAAAI9hyEWb8VQrr0E0APab8k8W6Z8q6n94qdNQQKSbC22q1GqYpfsr2nenFsRWiP4eiWojoMFT62/5nM+a19/1HbSROO5aKmR0MA+VLDucoQkrn87+D6+1+iHGwJn8WxlZxRhvoKaQZrozJ7LPMAOI4jsFTTEDVH1Ljw1gRmaoE6CxAVSpowUBpbGuWQtFB6JoA3ze1zoBmQ0QJDiFZlzBuQ3QsRQA6j8AAAAANkLWLTXnxMb4Qo+GaybGANhvyj+5Sf/9E665qzxbTOj+/bPdIfoTW3M9+N1CfzGgU5AmrX9BcR8i/moseJD8CONG/o4PxqCczAzrzsRdxoD0mz/SGChEVgSP5OSSaM6J/EUzgC+q2Qyg+Lzl8/xclR+QvGnyS8Jdp7zw+Sr9wiVOpxMQ2yJmG4BEOT7P+055ZCUXiiylvuFBwa8XjjM5UtpsAKMHAPUfAAAAAI9hyNWc8YJXOtO8DIAtp/zTDtL/Tro/xVO06jFrA15J2Kj7/7joL3fha67thc6kTbEqAZ3iLK/1e+daQseHDg66aD6KBxx5D7IWpIRPMAaKwbWog6cCf7MZwJ011s0AJkuR8Gzt8z+VGUDlTeMJT2UNZsAIJ8D0uOCiHK+2Ab5Z931Q8GcDwmNE4wMlNoBlKQDUfwAAAABshKxhKqfAmNrwPeyXPu8ef3xUeIv075XRWfrvmHm9qPT/MN0for9Jf2caqzduWaG/FOpurd8v1BIiPkHHL7DKLtob/wPsGLZnnmwtbG4MfP41zRtwMAM4+V04j6z7AY8yAypOQHpMqhT564shPoFlDqKyDSDL8XnemfcFyjJ8z2aVTgAn8Uc2gGa0X01yG6B2cQj1HwAAAACPYcjFqPGysVxD/SHAleiWalaT/qWAypbSpakV60OwAAAgAElEQVQ+YJv0X98eg/Tv+mhfd92/RfSvNMnbLy36F3s56P6+Wr+vpLWO1t/UdwmR+AYRf4nt9gRGyEaM2lnH9/8G4F20Pl5xizYxBtJ/DfcG5Dnjohkg6rZBI0Fe55oK9XAllUjmczTfKajZDCj15Z2AVPCW90XER7+Ou8s2gBywKMfnSY9P3rRevsJaXtmBEIyG13ZqbADOA6DcBlDu69AGKC4FgPoPAAAAgI2QrzrqJ0ma06jCNY4pTqFHuwFww5R/cpb+a/q7mFqYqmWIVkwthm3S39m4E3T/q1+/7g/RP4quaixsomlsC/yk1n+btj1bg27dUGjlP89q/o/nITnOXbjLWmhS8Fc2BrI3Cz/F3d5AUQSPtOZSy2FmAFdVidAP+PzPbAbokoZ75aRyl+M9gtx+TQ85nQ0Qd089BU1Agw1AHyfgINrlQcFM0o8NoNzkV6uaDQD1HwAAAACPYcj1nPG8TVOD2QC4Z8o/OUv/bExNM1H6d9D9ubCUXqPwuEv/i+v+Pyb6E1s8014l+s8T020BD+av9mi93f2/wW8Qx5s24vdE/NU0a1DBIjgO3blun5Vx1gKVh0BI/HxjgIq/2Jw3oBGXuZapat9jBgRNkq51P2COGWBPGswwL7T3WxAQtIn1ck49V9gAiuK/odZ+UHDdewhsAPXhJNkAUP8BAAAAsBGytlk/K9KcN8kXELY41R4GA+CeKf80RPrXbsvm0v8TdX+I/qqGSWPVOPiKUKVom2v9UyXy1u/SiUVCQC/xe4bKbCaMcFmGG4DnNpW/ivlteJYxUAul8AbOKLjSDCjETcwAJiBnBsR/slI4ScPgYgbQWz8WCmpP+taH6xPM/RcExHo5p57r5PgdHxRMfIsS79JP2xl2YgP8+3/X/2rJCQAAAACwLkMuCY1Xg/oa6gbAbVP+aYj0T5ot4pXTqdJ/fWNWkf45Mdfur4jZIfrzXeqiv9yoXoYNaP11mr4Y9xXxoXqDJzHneC6dbThQ14Wv9HXRXvPyKsZAIVQtWjjzgzEDlE4A1zJSmitC+UgzgM8oE55lfU6IzvC9Ysdyxu/Zcu28z9sGoMsJiP2Ok2msKV6V9+4HBQcHt23QQhvAcvC8Lr7+vb8b6j8AAAAAtkGe31w/DdKcKHHnsy1xlD1KBsBtU/5pKemfF+hV6UqNxbBNKjwbd5L0L38kVNF6df9kepqSLUV/sa1gWdnKqOMu9FdidnUf7QONidyF57cwFHwAJjP0Qyc/aIBJKyrvjzMGCtGygN9zQsYJqGaXW6Z6fb8ZELRKAtT9ALsZQNdJkt0MKIjpM+8L9G32Uw8KDipkvBPFkfCq+sycmAJQ/wEAAADwGEbM2bJeEppqOE7OALhzyj+Nkv7Jov6L0r+D7s+FpehSQ2S+9F/ToG2yuKPu/1TRn+9VF/1LAWuV2Ntzxo9D2Pbus7X+kTqd2/cpFHwAwBdZNH++MVCLLFKZYh/r3TebAXHrSuVpE01tFZKzsiMenHIvjaJdKgYPCtan5myAg3tPWfnXBlBcOkL9BwAAAMBGyBOd62dImvNo+TrAFkfT43um9od9tR7VXfenJaR/ki6HR0r/9S3RSsmr3u2nOj9do/v/lugvN68OpqISXTNudysZpvXTwGI8tX6H70co+KAADo8RDJnFsTa/YAwUIteCMxH4U/VuMyBrZjQDmB75n5PMgE/f0Az4vMal0sxt1y8IiM/4U/G+litpE+vlnDiv9zDKSSm0AWjqg4LjTUhtAN2uf10VFmwAqP8AAAAAeAxDrhqNF/htNfwhi+5Pu0n/VN26NHUWfJD0r1Hha9nnS/+yCVYP1Sj9KwdKzltkE9E/bt+r+zNtuP2r5Me0/mGH4m+AAQFOHCOOpjnH5xY2w/rGQG0YNQJvIadqO01mgNIJ4FquZQaISQVC+fxaGSA7AZ1z6r9z6Lm9c2XVzHD/tIn18tRTiP7sLP4KNe1BwdehGja48mpq/oY7D9YDgPoPAAAAgI2QZc/6KZHmpIm/hrDH0fRITs3+KNX/Ibo/3Sr9x9mbJ/6Hl3rsm2zMJhWejQvpX1dSXM5Kor/cQ/npUG5C2kzUYLqytEbYRuv/TQn7N7f6DrYQh/tw20SVX+rB2uE4xh1G6xgDVuFe1yQViMsdFGYA4wSUK6ilLpkBfGSFGRC0SgLU/QC7GXAc9BmZRhtAmNgeN3yNjpcNQNdBHjoa6Sboi1flnXBfoDh2wQZQewBE0VIAqP8AAAAAeAxDLrOMl4c9NZQeAvyOvqH0T1X1v1v6/57Hl9/PYy4n/Rd1/+gvdTqmb9SgtjeVTxR7pOhPycHZWI/QLB6HnrAdQaD138D0bXmQkP2gTelkm08Et8s6dqPKoe1jqscw4ohe3xigFm/gzGMazYBQSu0yA2oHta5UWd6v1J82qXYs8T0vPQKDRApbENPxoGC2wlpeOvOLKoUNoKn2G+5jA0D9BwAAAMBGyPOe6+dAmrMkfsqQPY6mByuJiwbAKN2f7pb+gwLEK1ONfGmU/uubodVMH36jfz95elfRvylyuZk82b9fdrpH6+diP17rn1hk07f/qkL5FjsXjMb/MPC0GcZ5DFqdfdDHdx1joBCHaoJp2FsjFgttKmaA0gkQWjLSfl2aF+R9FzNATBq1/5yodS0IUGjTeFBwnJrxACgdD8kGUH9XQP0HAAAAwGMYcrVkvNrrryE1AAbq/jRc+qeq+j9Z+teo8Mqkrz+nSP+y61UP1Sj9t9ecsJXoH/cqtWvR/eOhaAto6QKtv87c1F7WcQlo6wCEOH8iHDyGgygpSyXdtqbTYjQGjDUbjQH2nSyGOG2ca8yEFcwAxgkoBMzDCo1Tsb7eRWEGBK0YvyFHuUWvM8BuG4DwoGC5SCbva6wbbID6/ZeIiP7dv+d/qbQAAAAAAFgGWQWtXw5pLpj4SwF7HE2Pgir+J2j0aOn/U0OD9G/W/a9c9XoKPEL6r+3Kas31Dd9Y9G8KXm7mMdm/bTRaA1bC92j9ttRGxmvfUPABqByiI09bFqXlM3vE5xNMoLqGyEX1R0gn/bA5GQNcn7p2H7TqMANiZfXTVG8GKLLbC5bl/cpWpE3SV6s2AFHvfYE0c+rxoOBv0h4bQC4S6j8AAAAAHsOQK07jNZ1XDX/G6v40Q/qnqvpflv5JHP27pf986l4pml1GP5i/1E4D0zdqUJf+O0bpoaJ/KX6hWTwa1oBV68vEI7X+1vhQ8EEL2Kd6Zo7V1mYDM1C5K8A0qquKXGB/hhoDfKC66p38q23+OBdtKTOA71ToWDIDdOr255wGDwrW5PWxAYTLr6INIJgHUP8BAAAAsBHyNOj6VY3muke+erDF0fSoTouvPwS4nRWkf3qd25ul/1oDXvqvb4NWdH7ujf57DZLjqLdpi0xU2ihDc7aXt+hPJd3fxcUx11NAtMrs3aypm+ipzTqWj1R7H7lR4MeZc1TPtBny35Qs+yE05V+qvDFg61yMAfaNKwSn3hKzLanwrRHu69aCYAZoRtJiBlBeM99LYQZQXH3+vtojOYjwoGBd0uOTl7F10saCB0DipVjFBgh7Qf0HAAAAwGMYcmVmvKj0quEVZ4wBsIX0T4q5z5zkygbZTvqXba56qDuk/4/Y3SDBrCn6l1IUmsmivyZgs+j/21o/VaSex+ndD9uc32Cmbvxsbj78fdNbDwspOyeoH3IHszdwtzHA9Lj0Wdv89+QFRo7tMAMYJ6AQUAoudGG2s5KFcRDSP2MngB/kmrr9Oe/Bg4KLSelzHn4QlRcEyNHkpQCUjkS4jR/zAOo/AAAAADZCFkXrp9eaE3D+jN4eR9OjLo8Tkb8BsIj0T7VHGtik0tJcsk6Rd5b0fzB/8S1LoQStvLYfqzWXymia8v8o0Z/m6f427Wkrrd8SfHu5f70KIU9PZb0DYA8CwW40k3ZRnqZt8wo/jqKUzPQxGwPkvT9kB0IUsyMR3GwG2FX1UptQTm83AxQ1NJXNDU7sBPASeOYWMLxOI7ttAPrVBwVn+cSMxaUAlBYfBIH6DwAAAIDHMOSS0HgF6FVDGMfPAJgi/ZNC/a8/1aAYIYsvqpw9Uu8s3T/qdP2lzsj0jRrUh7pjlIzS/7KifylLodlSon+j1i+mXlfrz167RUtdScD1/PFbabsASJlzfE6xGWxSe081oqQuzRgvTUq2vOE6iEmW9BYu3D+qZkDRSW7TkbloshlQDpvHF9oz1ojBDGCU4u9/lZJ00uAgwoOCtUnfXzfv83XRlONsgOK1VGoD/Dt/L9R/AAAAAGyDPCu6fvasOb+WZwTZ4mh6KOf+v/AwAJaR/qmq/tfNg+hfbIROtXe+9C8f3PVosnpbH+de6d/uUjCBbL1uF/3pbt1f6LG/1l+eV9cQsM4yYrePSrbM5gCwNxM+Sty8/FLa/L3+b43C76yoMov6pC2Fa/Ghzs+bAdGPNifmciWlZkBdUi+14c0AZVgphdClVDnTJR6ZWOButAHocyp+EP3wg4JPjXv0jnZ8PYAsk5iuthSgFA8AAAAAYFOGzNMyni551ZDH6TMAZkn/pFD/XSf+81OAHy79a/bmWOn/c0FnLJWJYkyqTOQm+qctPUX/plBHrYEuxbjLQEtkxRRGc0yeWZe9Dj8AuEIHSh58qAw5m1sSTtDvtQQ+cRwQgzPRJWOgEKa0YQ31Z7ptmiQS2fkmSjPgVDSuBnQzAxRdmK0VVel0zvj3Nc48KcRJ2xxEv/mg4Ku7yn44vtc5VhugdnV1/Dt/7/9cbgEAAAAAsAiyRlo/P9acQfMn5vY4mh6muf8vWg2AB0n/cQpe+s/eMMYP/3SR/ou6f/SXOh3TN2qjGuTWUVLf7UdosKHoT766f8/R4mqodLOm1t8dBCL+EDAmQM/Mo2U1s4HbdvaJuJVBusUYYO0L2RsYZWzEanhFtqYWM8Cip3OxRWshmVkx/E5Bp1iVaANk7xHbRqrtczqFBwUXMr6SXTZAyVgLr1vOq3cO1H8AAAAAPIMhF3DGK1CvGqQ4dgNgL+mfauKmQvpvDx7+6aL7ixmHSf9nvaLsUqiSJaZd+t9D9E8be4r+TaGOQoNltf7iZW9LwDq9tXXF3IOHbc6TWU2NXhPXA3rOp6Nzx+ZFWhcKaBoN9QbcFw3Yp8bX7xEUNdJO8Rb19EKRxTbJzPVIg9cElxIVc12VMzZAlv3I38v+UTNC3B4UXLcB0qsU3gZQ1PxqE3fn3BB98YWkgQ3AOy5CLnYpANR/AAAAAOxCdCLDnMSp+6ra8D3sF0ZCnNaLTYsBsJL0Txr1v+4fvP9b7tWgis6X/uWjuR5N3sC6aN4r/dtdCibp6qI/+er+pVJr/lBd9x+hW1li1mYWtsRUoQsomGQbck/ZUKJv4J5Bv+tz0bq1muf7OOE3NJpIps3SWQL65KV2Q40BoW7WG5BVe3MNigcGpMK+Jm+qiVvNgFLMbjOg2OWSmHk1PJagY9GZl6eLIvi3wUE0/r5AxD4omDEwqjUHbeLunBuiKZ5qTwiIbYCKMfbdI+fVlaD+AwAAAOApDLkONF7zedVQjqMzACZK/6RQ//0m/lekf2vYOOKS0r9mV46V/j9SuLHUq3OlzTqiPxF/iwV1ZGW1Vf9jpuj/IK2fmsy/ecwuw+En6bfk/0WOk1+jddgbD86Wbs0zNpRws4aj/O3BwgijjIFCaBNqbyC4v7scwSqFj3lgANNBWaTKYEhOzc72EZBsAL4BZwNQdJiZbQD6yPIH0XYPCmY2nBsGTfFEVLiJ/8cG4AdZSPRaCgD1HwAAAAC7IGtf9RNczSmwfMJui6Pp0XklWTMAFpP+SaP+1/0DUkr/CrmZbfzkG/236v5EfTf6LwrWa4n+pSwuDk0plDT/kAvYqUJ1yuj5yyNUsX7fdZxWN1Ug7v5y1jSC5A1+jaZj3vxpVHcQTitcLQE2QhBKqUK3xPeyEJP4n3MT0QlIXtKUEbfnJnIbzQBRtQ9a1eaGs7XJYUM/wPjYAK6SaBBEGyDK+X25MoC1Y+4g2ulBwZyNFHy0hY+zHLB8E//QBih9QoPdAfUfAAAAAM9gyAzFfg2qCU0c2QCYK/2TQv2fKf2n7VTNcKN/Cb8b/Sul/71E/6yNPVRJ9zf5WJak5TqKr7krxV4yXE9hY+Xvru9YyPdgV9jDcsiZ2sI0uK3Rb4LdEqDWQS5q96IC2Rm8ENoUNnMC+JwdZoDiHkFhUM4J4JKmZoC+wpqsfwT/jQR0ZQpG6A9kbF68jmXuOAI/V53LklfyGdpffFAw6WyAl0tStgH+7b8P6j8AAAAA9kAWdesn8ZrTfO50ryWOpofLKnLOAHii9M8E6ZD+mUukKdK/0pNg2/B5q9J/e83vtEelgRjELP0vJfpr4usLrhlC9aO0d2Nr8QuvraH1U+kjMK2M9m9L5+MZPIBf3uPzt307y4H99T++b7LbU3MFXET2nHUWDWROAOnNAGUibnJ3FDkS1vkmSjPgVDQWyytFTk7rzvogcA2iOhnxOt6OOAIvgasl9Z99UPC3nKoNIH2eoP4DAAAA4BkMubwzXqV61aCPExsAO0r/VB9lvfRP4VYLzVKTZ0HpX7Mfx0r/H3HcWOrVWWxTkpg3EP2zNr66f801KaI64OWXR0hyTTF7d1Bjx8rR94sK/vO2CPws0w7moU5D/lt5hO/kuUdaAoWwQfCqpNwYvBA67BX95kenkmlgk86etS8p2u82ZjOA6eBvBlBwIq92AqSp8bx4HcvccRtGAldL6teM9yyGJs7rFPes5/rUKJkf4V8K9yI7WgQboBiqagO8LJJkUKD+AwAAAGAXZAW1fqauOZeXz7ttcTQ9HJ8g9zEA1pP+SaP+W4M4Sv/KQajK6DWRt1pVIZog/ddHtVX3J5p5o/+z8F4lkaVxTfTXpBgp+qcBrd8OlYAlx8WN1oBDtH5Vd16icMi7Do/ZEAA2ov9zZzpBky0B4s8FapZAWxksxeAa9V4bXxkrluAHmQH1ewRFjYTdUdLrOTOA6yJVWFgZkDoBPTZA2sBoAwhZ8ko+Z3i7Pyg428M1D4B0NsD52atQ/wEAAADwDIZMuDJexHnVYI3zZ770Twr133/if7VxsVk2sVrlTDSpxsOk/9rVyavNLdJ/NryV9+vS/wqif9ZmId2/fpx//lxf63ep8GFy/5pVgelov5NBiG5d37rk1TdZAlc/kyVQe3nFRQMa1TXpL5gBTIqhZkDfPYKihvo6ZecgdgJqCwK4d6ORZPZLPNJxBH4vqG2eg+izIEC2AeQ4BwVbLOaa8KDgV7dgO/psgNeV1L/19/9PlSgAAAAAAGsgq2T1c3HN2To3naMljqaH49z/F9ctgBaR/kmj/k+U/ik9gIZL/zZVVyMxV6X/9prfaY9KAzFIs/Tfq/uvK/oHnaaI/nFMV92/KUjTiNlZXPHfW4BM0X4/ALACVSPckeOVcDBsAv1Gso779Vth1NsLW9s/7sXgSXh+wriyDMEMGPX04PEPDIjamuoUdfxATC8r0dy7x/cdfr9c7+cR4vdKWfJKXjZAXLchzjt1PdfABQGvf5/C4IgFyTYA1H8AAAAAPIMhV3nGazmvGtri/Kn3dJL+SaH+T5b+qaZMQfovVuJ3t5+0DVdRv/Q/TvTPmtlV7MpxO1j3D/7VoEW1yleTtP56tDFy/1Mkb8j3YCzX0WU62Zip0w9D8xOsD2Ycv5Sm7rklQPXNMnoDLgOUBJduux/+W5l3ghkQN+Yr7zYDktcYM0DoFXXgbQAi0t0XiInweZPpHo9EHKE0SgpJfb8HBaendAddg95uA0D9BwAAAMAuyKJZ/bRec+LPC2j2OJoe7nP/X/wpanA7Sf9RkG7pnyIRUDEOZS2ipvnaBMeq1lzV/UkhnpQqWeZG/y0FrCP6B53uFf318d21fvfvNVVAb8V/YX0c8v2T0XzVP5bpd+oZdBbmB1OgaZCcLIG035G3qmrAqpdLkaoEoqqbE5B2GW4GKO4RFEaMMzeYAYpe+aB9//sW06ujyknVlybOC9mxZh63SfV0rkipjINomwcF8+PWZQNA/QcAAADAMxhyzWy8OvSqoSfOH/7lpaR/qo+sSfqnWlUm6b+ygZD+vz0rDUTpn6/WNuyjRP9K2Nre30P3t9TQ5IK0og3oLff3dDSysXzv9yMCwBJMPaSd1jew9+xvkLO/NFQlnbcYjAG2lNLLbZL9ECeAppgBPfcIUiRNXjuz7GJtqaKNBwUXMnncF+hk3mqzAaD+AwAAAGAXZA1Noeha4ws97NdJQpyR+k9mAEyU/kmj/uuDeEj/dJ2pq8ahFK0o/tpE3qruTwrpv3Z5Xazkc/nTpBffJP0PFP1LkYtjqIq2guivaDZP67dFW0vu31XBh3wPmlnkgN/7EG5d36A48cqbdFkC1DrUhRMbgzfgZwyYnIByqEqvK7wsyaclmVLw9TuZAeHLkRNgsAGIlAsCuHej7EzquLo4QmVkaofHQbTBg4KF3WGyAf7NfwDqPwAAAACewJCLQuOVmlcN/XECA8BV8Zk68V89+qqJ/5D+45xHpUEpQlH65ypqlv7jyA7atEn0F8NWZPdG3X+c6C+3bDFjGjAELFw9N0RrLiPIu4juSZDvt2WdQ+gBTB7MRT5z+Wd/tCVA3FB3joZ05mMwBrIoyWsWJ4AfQQczIFLhS2aAKVfQuH6PoKwMMS+XmtHi2QpFHR8PCi5kUi8I0Fkvn+51GwDqPwAAAAB2QZbU6ifomlN4UWEzxtH0mCAo/SGaLf2TRv2fK/3Te2JOh/QvC+jMX5qyq9J/Vfen/MKhkiVmkxv9X+9GM+sMEYrNmryEo9CgUfQvNnbQ/YXG7dU2pRNQfM/21NYm93cmLbCjfA/lGvw4Mz8CNnXexxKwrUlgm/Z/sRXOi1TewMn8WXUCCgsC2MJczQAm411mQDF1pEoXpO3srcAGoEuXLtsATITPm0z3eCzjCPw462wAomUeFFwecO71gg0A9R8AAAAAz2CIqmK86POqwSvOn+Um/m8n/YvFOEj/spy9qPSfJlVL/y3CfVX6txstpWIqYSuye6NaPVr0l9vbDtqmFOW04qud9bR2N/uxG+n4kO9BE4ZDfM4xJhT0tAO8vD11UZhTxhVSMtPNZkXIb43zBqLfRk7vraq9gWRcdwKS97rNgKkPDJDLYPJz48ao0mxhvA1ApLwvUDU7v0+j6pI28XvxP2rHxkF0+4OCX+/wn0f5CM9tgH/zH4T6DwAAAIA9kDWi+im45iRdFNyMcTQ9pt1MQngIsJ0J0v87iJ/0T5qqyqGKWrBNtSxMbYvaFAsWpr0VEiU5tfOab5T+4892i+7vJvoH/RxF/2Ljebq/X8xqHrcCWJqCaD8IUaKbFP+nqZursJCBg12sRPO15suClkOeW3MOzPSqb0TvvYOublKCpmhC5NcpTnyWlMm2RieAyvtaE7bQi8aYAXFL0dVIA3IbzW1gGlASoMW+eFBwIRN/X6D3e6/ckg0gpn7bAFD/AQAAAPAMhlz9GS/wvGrw3RYHA2De7f4tI+5TlUH6Z64whJaVUIIgrrJPmlXso9KgFKEo/XMV3SL9jxD9NWH1B+0E0V/uYq65W+v3F/r7Qt02wX9zbXfUfgRgCyZbDnFc7QeuxRLgvuJmWgLvzoVMjQG/UraLE5A0FOvVq/OlXHYzoJorNEgKR1eS48ik8rIWLzSQ+n4F+beYXt6cqgnBpI73u7BD+RGoHRiq+wLJcaI5+YWZElec7GpEsgEqDsRCljcAAAAAQAFZgtDMezLGf8rc/xddBsCc2/0T0fFXDMPrNfFf/Zjfg/krbaOJwx0RtblArzatQjZ5Sv9FRyRpYNPuo3fTeWiV7tnrPWNlCKv8GN8q+qehm44BKZj4qvsXXFPAlu9Zq461vBreeNCCH+dHjpM11bDyOcORN1HF4WKxvXwsATaSGSmzakM+Db2cgE+zgWZA2ktnBphyxY1L2/KWklWDxmjxbDFi390eFHwdXUdctyHOO3U1FxGdB/sZK9kAXMB/4x/8H4tpAAAAAAA2YMg1nPH616uGEdvSbgBMmvhvkf7JqaoG6V9ooIojT4QfL/3bXQqq64ai9C9vqSY7N+W/0L06wqoCKsp7o7S9lO6vCc5dXTqENdEXbfgE/+mq6N7y/V7VjqaghYG7uGUXdJ7lxUr2N2ajJaCpp+1xAoUvZNtSTw6Tt+HlBCR5f8QMuOTpTCova/FCA6lvYAMQUfuDguXU8U6PI2QHhBSEr2TKg4JFeBsgSwr1HwAAAABbIMtNCpnXGv9Zc/9ftBgAcyb+Lyf9UyRGpx3TBtUIXJSrTbFU9iK/mCjJuYH0H3+Yme66vuIoKUV/oWWLzL2A6J/m6tD9x6rP3dHWl/s3k+8XL293MLzgRfORUNS4Gy0Bth7NqTXTS71hsn3QvmhAo+CLTkAmapfjJC0/je8wA85SUv22ZCnScblCCd5J1QZgy+BtALrE9OomiBHoFGpLd3rcJjsgrIfWsAcFn7FFkneXbIAD0j8AAAAAHkLnTCoe49WZVw1DtoWIGgyACQ/73Uv6zxpUI8hRfuRG/9qhJpv0X9X954v+xZY76v7XX16SpUccraEV5R2u+LdU5QtkZdDOuLOOrVn1Q2VS6mdbAtz3rX3Gi8OigRYngJv/rZn9nSf9dJllBkR5xKTWRJ9tZ8blGhZORo/jp92lIRX7bvyg4FOIUY3z7nY2fj0zNsCq32cAAAAAAAmyoqWZoGSM/8S5/y8MBsAE6Z+M6r/LWoR6EHHWjan7pz3foD50rbo/eUr/aYOsqLIKb3FZxkv/ddE/baT8oC4o+iuzyNJ/r+7v+h234AR/f7n/gVfm0JT34YGHnwfCjejuoLaHui0BRQ57oqsX20h1+yBtp4IxYHQC4qkXJV27gmwGlIZ6mBnAq9iaRMG2p2K2ZANEb6V5KjYA99ZXkH/J2pXdUTUhmNQL2wC5lP/9d0nQ/VkAACAASURBVO30KLQB/o1/CNP/AQAAALA9Q67QjJfDXjWMvtpUGQA/ert/qkj/6u5yiDnSv+bYzdqkSdXSv0WCz9/1vttPuWxH0V8ZbbDon6Vr3Ptduv+9Wv+7hrGKv21YNtZSXX+ANh4HILKOIt6M4cBc5xhmfirtlgBV5k3nrkCjJVBIpEzQ8EvwVVhrKv8rcyXO5YjITkA5jpSaLhk9f6fcqynX1c3hgQEfqZq3AaJ0JeOE0eLZvKKF0PugYNmBWNQGIKLjZJ/BwT8TOO/7r//DUP8BAAAAsAGyOqfQe63xnzv3/0XFANj0dv+kqEo3c79J+g+k8LNZ+mcvv4VEeXWkn5J8o/Qff3o9pX9Z0dbJ9A7a7kzd3zZ0pTZH+pfqY+KA9nDlaxgr95O1vNu+1r3F2Lt/n0DCA9T2FsTfUR+WHVWtEEzhhGtDDP79qhQeN9Z+SZgSMd2LOmiR62YxPU7A95Ss4ATEf7YI9EfaT3UM2EYy+NtqBtRUdWZELhU7U7rLWrzQoNCxxwaIirvHBhB2dfHbT7i5fzAYAlD/AQAAAPAAhlzHtc0N7WbONWnJAJgw8d8q/ZNHVZ3SfylCpkpzyqzKL2mW/nt0W9lbEyoqSP/lApql/7Luz3c8hNdbRX+55UzRP0vXWf8R/Wek7t9re1bNM6a9jYlyv+v3/BS9flm1FLSwi8ezcp3DPhKawJFkyfS3uwK7WAJXHK4b9zNjcAJqDepOQPIv5aZlXVRmQJvrEHaMDxXRDFCr6qmebbEB0haSAi76B0GAsneYvXurDRC4F8Ygog0gnGxB/QcAAADAFsj6ZP2UV3NSLMp3xjiaHrfP/X/BGwCbTvx3kP6pItBrpH+5QX3EWnV/mir9l1V4rfQviBNu0v/Bvu4u+mcxx+r+7fXzjcfq/j5fc0tN8DcHLxY//mfgfr1+jZ86AEYx/wjP1NIvjOrK9DW6At2WQDG6qgTzF9n3V6PNCYiU8VIblROQvLCgGZD2Ss2ABhuAEcTLNoBNixeL+XT8/FdtWqhTD7MBDiKq2QByHOaOQNxSAKj/AAAAAHgAQ1QOq9jllHamYsMYABMe9rvi7f6prjPyEbIXOS21LgL2Sv8qbyPrWWkgSv86CV569567/Vx9e0XzvJK5or81S2GI9Np3sY1BQK+ksH/7DZX7zfG5+m/6IWkEej0Ai5N8SGU/gGnu4gqIQcTGuStg+6aRWle/Lm92AogpXRNT6vLpNdcMOItqvhzEZAO0aPFiMVvaAK9Dp2wDFKkuBYD6DwAAAIAtkCcoK4Rfa/zfmPv/IjIAdpT+SVHVqIn/UthJ0v/n+qlubAidS238pP94NPaQ/hcQ/bN0XlmO6D9NB08Uru3rzDqpP+pra67d0pbgBrl/oKy/0i8KAFrcj9ubrbP7kP0A4YWsk8EVkHdb/k5R6+y1BArl8Bsca8JJj484WxfTbU5A0uHM29fDSpV8eg03A94nboINUBuQR9kA+VErFz/KBqhFkJYC/Ov/yP8gZwUAAAAA2IMh13w3Tdmcf/36NgCeert/TZCWif+SxleV0eMIpcSlsnGj//ylg33dJv0voPubB1nb/j7dv0frV1SSo3LFWuIb5H6htTUjAH381MG27MZOPrPTaeKtrsBUS6AYvRRKzvXR+NnfsK9UXBW1xfhXm/BHd28z4Pwq9ef1nySagw1wcq+nld5sA/B9m2yA8sgHNkBQtJZ8KQDUfwAAAABsgSxXKrRfa/xfmvv/4s+mt/snRVUzpf+scUn6r2RdRPovq/Ba6Z+fQ+gn/R/s6wbdfwHRP0vnmOWI/upwQd5BKvu9W+hqk/v1HbXxhQ1pkPsNSR/BT20sABrcPxQNX7QDXYHD8BtvtAT495XGQFmp77w1UDV+3Cw8E5pvBpTGSpnrLWpH/oinDXAN0AQb4KwXPMEGqI4YhYN2pB6Aovt3KQDUfwAAAAA8gCGzqoxXal41TJ4h9oV/CPCXTSf+90v/TJBu6f91/t4qFEL6T/7dJ/0voPsPE/2j8D2HTRSu0KBN928VxbROhi0Ftwltcr859a3sUifYBIP5Ohn+F2NP2gTichw5oJMroLYEpJRxF9YY4HOs5ARQxQzIavAwA2SrQehVkMUDpd7TBrg6TrABglvr7GIDVPaIyHHSv/aPQv0HAAAAwAbIoqVCvLXG/725/y9KBkDnxP9FpX+q65V66T9uXAp7SJes9SyQ/pN/O0v/d4r+DVkUov/111Ddn3TSf993n0HuN7TcWe5f9bcE3I7tw/JrZFLrKnQ6E0m3/s0b5QqoLQH2Hc12fZdX3usE6Eq9CokOgKJW32kGHNUE8RsVSR02QLsNkI684sg53l/wwlEh9IX6DwAAAIAHMOQKznj15VXDvVejvAGwo/SvCWKe+O8h/acxmarEfqTUdKrSf9qmJIDqVHgx8rrSv9jxKLSpo2iv1z2ashzpP27U/fvlfn2QZrm//Ll2yzum+zLYdhYAEe5nPtseiEZnonIW4+4HsGGF4BVXwNcSKKa80wkoB5fbDzcDsi4VM+DUaOKwASw2wMG+UUpRfysL/gXqPwAAAAC2QJ61rNBvrfGlOfuKOJoey879f5EaAI+93T/V1X+99B80HiT901tJV21X1rPSQNRD50n/LUkP9nWt+i95BkLYOtUjxN7F0j4T/ZUpeqT/8ifIPoZmBblN8b9X7ncM0o32KwU8kHunGgj0H40H89eSuH3wkq9omx/wDuFUSr8rwJ6cmAzzsg5efaivygngH9zk7wQEXRrNAHuib6+De0etiW9lAzAdR9sAgQcQNDDbAJ9x4p8JHHeE+g8AAACABzDkGs94ZeZVwwrXq5cBsOnt/jVBtpT+FZXcKf1H7zZK/3xeSfrP3mqT/im5+DJ9+DVmlb2LOkur6K9oU9T909SmyO/46pbWyHq5X/X15KiPd4cyGyRLsMLvGpDZ7HCqsfjmOPsT3K+jyQ8Qw6ztCih/VmUd/Phoo+LxUtLQP92En0lDcD5+pddXA+fO15Ld35Xo6wQwkrRCwe+1AQIfYqwNIHbstQHkvHHxzTZAdRiJ6KR/7R+D9A8AAACAPYjOa07xnXpfVRu+h/0ySIiz+JUpEX0NgAXv+UOKqiZL/5/2fZ7EGOmfSh+e9M2kgU2+j97dVPr//Kn8iFbVc2N7YwpO9/eqvDKAjbr/SLmfogFZR+63BFzpt2GMXr/QBgJwH74fhPT3tuYHFCTpnLyp43dDpytgtQQkNb96a6BvX76Ur2TL9a6uNsgrNWr03+KDMK5mwGfbeQVfs109NkDwbr8NwPUV04UdUxtA5XyE3V1tACHv8V4hzDSH+g8AAACAZzBEpzBenXnVsM4cyT+dE/8bpH9S6F8TpP8oyBzpv9hvO+nf1r2clOk4WPq3R5ADartY2nOivylFj/Tfeqsfm+6vbRkXI/RaWe6nNkekGMwTiPXAi8WPpXXOvNpIJd2aH3CmPyS2/aNT7dvpcQWSvpc14uQESB3f75acANXjgpMsUiK5V7j/nc2Aj+p9JFHK8n3cN7QB0jGy2ABCAXUbgLEQRH+J9Q8+AapbnUXutwGK3UuvQ/0HAAAAwC7IGqZCdLXGx9z/D/xDgC/K83zvuOeP8+3+tTN2VVvadNufz9VMv/SftuFq5q4UC/G5d9eW/gsdNdK/Vfdv+KhbdX9Tii7dPy1AH7l1yQsTSdN3cbn/heKbqlVL2+cHBtwGDpKclcfE+mWQKuBJCG5T2VvZ7+8KnGGvTZ0AiutVjmd4OieaAYwtVE/00Zd5+b7qAVyRD2KXAqTNSgWkfcs2gE2LF4v5dNTZAIKLUExdsgEoNz84jvOg41sc1H8AAAAAPIQhs7asYo5T2tVmoMkGwHrSvyaIYeL/TOk/ax79R2VpCCH4Bkbpv1xDHHmk9P9pKCr4epci6dsl/ZvNElt7TvS3pujR/an4qSl/DxQaaOsPUu8s97+ofQ+o7I2deMAmALACmo9SeRpy1DLTueWOu7sCkdSdOgGC/M1NqV7FCaC46l4zoGgLVTaqKsHX6glketEGqB7VJhugRYvPYyYdJ9oATPZKzQcd53FC/QcAAADALsj6nkLLtcbH3P8YzgCYLv2TQmf3nPiv3klu6v/V4GD+0vYVOqYNssDzpf/4LV1HRvqP+jZK/8GfRvW/Ns4KxC4eor+ufeOtfkbp/nUFvP65GPEl2xqzNBRBk/5EPuz2+wSWpUXdHX34NSnOO30m9Lpw2lLtB3ze38YVYH7pQ830iFtn/5KdAPHn0cMJMAzmHDNAEuI/rzMT0svafZikbANU7QStDXByr18sZAOkfYP3s3cFIysC6j8AAAAAnoHjtcKF8XrPq4Yh29JNZgDIo3PX7f41Qe6S/klT26ch81q7qM028JP+o3c3f9KvMYJsSOoodeF0f+cUn+CVHdQq/Zt1/6PcZi+5n7Sfdz/Rfyd5sovRP5A/M5A3faZWoGm7pp6ZWZJVtiZ5u6qfRi0LwmcpDqOWW4fP3RXg5PhL9b/eNTsBx0fJFcdF4wRIPxjBYBrGsJyx2EU2A87rv0VBvEW7T5sNtQGyd5a1Afi+Jan/+B7MWcZ/9R//74UiAAAAAADWQpbaFJqwNT7m/se8zqMDA6As/C078X9x6f/dhlN+673idKUGovTPp1NL/7bum0v/htS1OHxRzfHV7Ze51Q8z/qrP1ZZyPzUq/rv9Znwp7cpVN2pNBx78FpZPxxH/NcoPuBq3uALsN+Q9roDsBJzRu0YnoHproG/fgg1Apd+S8J2B9wgKen1P7D5OwBk1kA6EI2kdh13BBgiCl2N62ABnveAWG0B8nfUHoP4DAAAA4BkMuVo3ShNeNSyoPHxOn78GgDw0d038d7vd/wDpn5qVwS8WOXV76Z/peLf0Xwii/5qw6v4N2qhS9y+3nHqrn1Ssmi0Wz5D7381b8k7Xx3cU68FO7HsULXhqxvKRad9Y/QClMpuwryuQSfmR5D/OCZA6vt+tOwHJmxPMgOMID67ABiiq4YwHELyryTvKBsiCl2P22QDH5QB02gDM2WLJLjqJ6ID0DwAAAICdkCVNhahrjS/0sF/8CXF2u/49gg35s6X0T/VrI5P0TyPU/9dJetKx1JhLVGrGBTvl9wyS+tAn/fZJ/1yD9DJfu3d8srNhbDENKbKUbbp/LUv7rX6aj8AG+gLav7hLZlsJR+d5tx8bG15bt4uwO5RnHyourDxENfUz9AMMZkA5cqFX1HcBV+DpTkDy/igz4Px6AK8OgQcgRTg55T0pADaAovuVmu0oR6tM+AAAAAAA2Ioh1+6OCswdcbw4soq4hwDfJ/1rgqgm/v+VapMwo7f0T3yR4jRwLmZR+mfeLwmvQgrurcbb/auT8nMXtVp5oWP/xP9y36rwrQ9liy9krQyUfEiXdf9CA/51he5fS6rldrlfX4Y618ZX8iuXvXJtIMV0svEzu1av2oe35ud/YFsjV/tGEea6AkqhOalC5QRkNY12AuhWM+B8S+UfXymWy2UPIGudpYYNoOhO/DCKDsuLv/RPYPo/AAAAAPYgOvE5xXfqfVVt+B52dVuIs9XFaK7+E2sArHu7f6pf+pikf5qv/qctFc3GSf/Ru1Oe9Huv9J+1qWc36f4NXwe76v6U71Db8VOlo2+Tqs4NnSnIyqL/Vj9U4Fa6PwhjWWBShaoE7yFTi7nR+w1+QDm+MsIVZLArYLIBwswFJ0BaEFBI930ybFn2LZR6uxlwtt8OiKQ9qrcBrqPlvP5jChV4ElE942wApmOXDcC9eLxXB8Qtof4DAAAA4BkMubSzKmxOaRe4TI1g1X9KDICtJ/4Plf7JS/0/sz/YZnybnaX/7K17pX9VAcXx19avqKRM70ejLP03Ox+FY2+8ERJyj9xv6dLiDy0kuXYifmvtQdcvueOmCnXsNZjPQDXm3WeAhe+15GWLH6CqvSToqxnkCrCbYLUBwmy5E3C9JTgBsppfKrLWN2gT5K1t1BEE1H4ZyJr+cTlGgQiv0MF7bYBMpucDqlX1GTaA2LHFBpAHMH0H6j8AAAAAdiE6CTrFd+p9VW34HvarMiHOPtfdkvRPRMf5MQAGSf+k0NmfLf2TWv2PQ4kx8gZmBTaQ/m3dy0mZjotK/1d/nc8RSyjqvIoyJLSitvuU/zm6f4/c76L199TgLvov9FuyuVg/gq4RWG0ewAKMOKIeOcwnZb94Dn5A8ktm2BuLuAKFufYabb2QIXYCzugtoxNQvTXQt2/t3DZIUdtX8c6ttJY9AKLGpQBZB7FZqSpaywaI+tY2P+4YpJD61uoPXnyHhPoPAAAAgGcw5ALOeKXpVcNSF6OS+v+9mPjTJv2T4npkgvRPRvXfKv2Tl/pfk/4N5tgvSP9cg3Sinna/SHFUG/vt0aj7W7+D+g62asaSr1CW/nuOuraWr1y3y/2WvlrbxhKzmtA7JvhJqt8bK3PTke/15aROZvcDimZA9L7VD8hzaZKagxxSu/cs67Jr0OEERJL/OCdAX6rlHkGhGVC5K5EwgC1LASgaOnF761v6DeVmA5z8W5wNkEn5Vwvd5scdP//tHzo6/tI/8d/x7wAAAAAALIZB3iz3VbUpKrEGKtL5+lTVf5IeAlyJO0H6p7r6P3riP3mp/1czc/4skfRGLX78qbtT+i/kEt7Nrqp0I8m1Mar/gQixgsa99a1+FI33kvuv9G6iv/4mDmsjb8XqUnLGkB3Spkt2RwK+mAdffTCd1QShH6A0A+oB4/eNVruYtJpaE4SVa8s2QNh2Iycg78s0NpgB3/dFs0RWpW1LAb5Nylp2WbhnmjnYAExfyQbgAjrbAIWC5VB/6Z+E+g8AAACAJzDkAtYqwTmlXedivHzbnxCbAfAjt/unbumfEq1ZqYgVrvvnS/8tSflphHXZXXjXUfq/QqjH6vpPR1KJSbq/1GCa7i+3307uj4p4jOj/ILF+BCucoGzDptu13oGefMmEaj9D8raLH0DCT8BdroAk175eLtsAYfNRTkC2ec1OQBLMzww4TiFpUdE+jvBAUHgAccB5NoCinjVsAHo7AdmB8W2a1wn1HwAAAAC7IE/8VQjF1vjShHdFHE2PXeb+ayb+f9EaAJNu908VudMq/dPa6n+hX5Cl8J5eUv/RJ/1qy0hf/1wRGssu4yb611KXKudfZwY5raDh669L+l9C7n+hNYG0zTpE/+oRvi8NY/KEzZ7LJicxU1lqTLhDOvz+KUwSCFrY/QDlR0l2BVpG0eoKdNoAYQ9fJ0BaEEBhzenrkaRdTc0GSRvXzICTDimjpKE33A4oazDDBlDXU7MBTu71i04b4PXnKX1ckr1wEhH9pX8K6j8AAAAAnsAKU+u8alhHhzCp/6Q0AH5n4j9NVP9jc6wk/aeNs3eLfa/LJlXfZ0n/qko4Z9KuocvZHXX/WrTGW/346v5yL/nDVTn+vQpQcpiCOIr+50K/JSUW0UwXKcMRUSoDv0FN8E2+mmx+gNIMKAcU+qY9vFwBTjr/vC7aAPWvW18n4HpdcALkdJVb9LBBuDhZ4+9Oz2Y3nMVnJwgDbr4dUNbgkI6HtWyA7B1XG6D+VlzhvwL1HwAAAACbEMub4jv1vqo2guqtiKPpscXcf/1tf0IqBsCkif97Sf+kU//1NWuiRe3L0aLeBuegLP0zHZ2l/6CvRfqXm6kqGaP+e072V+QVC64K7mfyb1U6kYINw78VpL1d7jfFqbdUT/MfLfrv8OsF3my9s7YuvpMRn2GFKM/4AUozgCx+QDmsHMHBFajppLxpprnTThiHTaHu5ekEKH839GbAeeS/MZVHKAuvD1wKoImTNhtmA7AHlasNcLw/e/KuPokOqP8AAAAAeAhD5A7jtadXDYvM17RO/P9SMgBmPOx3Demf9Ipt+Q5F37+KZQeCoxCtTX3eRfrnGhz5n5o9UpX+C3G4jSpJ/7WSLKI/ab862nR/8XVmbB2k/5ZhMXo86nRVWuR+bWPtNH/S7P7Hy6m+G7jIT/H6PP64ugWvUa2qlsWW4S/CqQqo8wOkd6a5Am02AN3jBJzR60YnINTq3cyAg07ml7i0FEAWstuXAlA2SsVmlWjXbI3z+o8plGQDFA4qVxug3B7qPwAAAAB2QRbf6ifWmlNv7uSrJY6mx9Zz/zXF8wbADOmfamL6lNv9fzrq2nmo/+ZoV/tCqKjrSOn/01CS/gu5hHdvkP7Tt65LyQbrxX+yfzEdNdaZ7rXRuj95Sf8ucn9bkJ8V/Rcpw8SONYdI4uYjuWXTtrCIFCo/01IyA4JmNj+g4oRzNRSLqQaJOknfqVobgKtsohMQFdHsBFCfGcBEO1gPgI9cFLLFJwNLXbiwvTZAJtPzAVezAaIur48ZMwb/yj8N9R8AAAAAT2DIFZjxWtKrhhWuJttu+xOSGgA/dbt/8lNv3+/Vyv5ck8uhrMJus/Qfv6XryE/V006pXkT6T98NZAPj4Pe7XJosUUapWVn3DxpM0P2pR/q/Ue7X9nW9t0+/EvpgmfinWHA/qkta4WSozoIj/EFU55V+gKIZ4wcozYC8c5l+V+B8/yq32gDf/3ABVnECGIuilM5qBrCj9DobSX6e254MfJVxRNviawNUR347GyB78aDjPCMTDOo/AAAAAHZBluAUorE1vtDDfikqxFn4avFFz8T/L5cBMOl2/1RT0hec+E8+6r8mFLHHY12YniL9Z28tIv13VPK5sDNK0vX5kR539lelU0vtBoPEkChL3Cb9N33bTpH7P6kmi/7L//xEtFY7SDgeNXjL6tz6rxGwJOFXmWgGULyjq2pmsWXym6LwA7IWo10BNxtASD/HCQhkbgqdAGlBAMmbFjTQmgGshi4sBbA9GfhVBns7oHIvro1oA2jiRM26bQC2HncbICZcCgD1HwAAAADPYMi1p/E636uGFa6jXdR/+hoAK0z8nyn9k36klHr9oLn/Cumf2CNSobTeIv0HfS3Sv9zMoGtznqRdW5ePHNfJ/tRU23u7HHV/XS/50+Qm/U+U+z8J1Ur9KqK/PcIKP2bujNqo8a6MUu/am0HD+JRRS77oRD9AofIzLYVm4W9NyYFgwrq6AtxmttsAFP3Oi4UNdQLiLlcd1+tCbWqzJ9xEXkNnPQBKf7Y9nwxc7pW0oZVsgEI9dhsg6hu+y7Y/j7/4z/y3QlkAAAAAAGshq0wK3dgaX9K+FXE0PRaf+99/258w1J9JE/93lP7JTf3XhKLSp4h90VX6ZzqOk/7F4PpQpBku8d1g6FzUf83RaPlwyh6D2CNpcLfuz5Skj689xsqY+0oKChPZR/GvNlO6C+ApLLSv1z4NYtiu4BB5xzv7AYpmTEaz3t3qCsiCfosNEObc1wlIXiju2YM9GRFH1bgUQB7hrqUAcbMFbYCTf6u+sVGLWv1Q/wEAAADwDIZc0pqVbh9uvzz3mvj/DcU/BDiIO1b6J7v63yP9k7v6ryj+qIbKS6rpqjoFn3l9hvTPNbhN+mcafAbQR/pPy1FGY+KXG/NvFXV/S3ZTl0qpPdL/MK+CzWboO+fePrsr/luLsEpW2z37jXn/CO63zRWU8n2spYtmQBKwMN5KPyATOW370OoKlG0AEgR6jaR7NVjLCTij1yu1XbD765THR+0BkMlIIKL0ycDEHDRr2gDVT0f+YAAuvjVm8jfUfwAAAADsgqzF1U+INafM7DVDQxxNj03n/jer/1QwAB52u/9Pd3VTJ/VfE4o02npZxFcIx2rPgFdFter/UtJ/2ia49PdR/4U9a/lANun+lO8m88hoE8VZK82mSP8T5P5Py/1E/7V/w57Ar4yw5ZCcPSarmTCtSCK4zg9IeovSvNpd0NgGbMkOrkD+Q1iWm6nJBgiTrOQEREUonQCS95f0XF92cNgnA1PLUoB4pxyGHSrEz0LYQ1HNBlAeMCYbQPJ4wo5BRqj/AAAAAHgGQy7SjFeaXjXce8Hpe9uf8J+MAfC82/2TdZi85v5Xaz6L/+TSViIIb+k8g6Wlf0MlfJvrKm2g+q+U0asty7p/0GAt3b8QsLxbWyyQMka5P8i1lui/pdxs/6523MwZv9VL7RX1Bi9VNaBABC//tuWvcfvc2Q/Q2wbcD+uZvlfjpM84+NkA5exPcgKI0eVdlgK0PRmYop84uw0QtOFCWEJRuL2XDZAGHGEDVKsiogPqPwAAAAC2QZaeFAKyNb7Qw36tL8RZ+NJ4xMT/L6kBMHrif4P0TzPVf+VsfRf1/xuNOnT8hi6S9J+91Sz9B30t0r/czCxzc99HJaF5vPRfF/1LcYq6vzKyvb1B9y/EbJP+bVvUJPd/Es1Q/JWJlLnqdKvgC/8iVphRubfJUFDZwC+Q6OXVn16FOh+eWohmQBJKI5dXWybvm1wBXxug3DEvaxEnID4EBCeAKy/f2O6lAG1PBn5VGp+t3GoDRG2uIRlpA7xevHwQNuNf/Geh/gMAAADgCQyZg2e8HPaqYcZ8wlL2geo/hQbAIyf+k7v6r9sE29z/eoVqxbnqFmRzvNjXPaR/Mbg+FCVb0RLnZvVfpfuXGqTStnlADLk+KVx0/+JbfdJ/VXopEkxNrDbraqNMVM/VYW+ALdh0525a9gooJWknPyCZZyD6AXqVPy9E8U2Xb8cpliHbAEKXug1QLXIRJyBuzzsBROKygEyXt93Mx+XJwEQULQWgxWyAdyR/GyCl1OQv/nNQ/wEAAACwB7IGpVBQrfElBVwRR9Nj2bn/4277E/LnE7Eyng+X/mmu+v9q9s5bKClrXGCy9M81WEz6p2g61lz1X7dQpvBeOoA76f7Fd+3S/xS5v1SApY2ju/A7uv+EbbzXx7+dZY6izv2wzHZ0Eym5+sar+gFSLbVNe/0c2GyA7wtWGyCMtLsTEL2bqcycB8CXZ/EAiD0DKsjl51XdPBtA+WkaZAOwvYKlFd/GUP8BAAAA8AyGXGeb9W4fbtQMRk/8J6KD6DjpzyOlf7pJ/VdVcwdMsAAAIABJREFUfmZ/FENSfiCW1dVCxqSVJP0XU7Dvrin9U4vc3C39FzKW3/r0Dpvpd31Tuk8KvfRvt4VUifRjrshu6KYcz9rHwVPx1zYeye0FuLPRFh33V+t56uO6LfKkCM8sczjzv6y6cIMfwKVg/ABZzy3EqXSR+9ZtAOJ+mJttAFKP+S5OwPs88Uy7hPFveTLwJ77KBjBo97INoLETomZuNkBtp1+2CtR/AAAAAOyCLM0pFFRrfFm5NuImps9hmvpP7EOAbfkWu93/J4il9Uz1/9WStAq7KmJB9JSU8YKCf6v0b6ik1GY99b++Lel+Mbsg9vaeU/6LDYZI/6bPSDWjqY3SZlDudFVLfcy12FCYNTBkb9wy32G34yplw/qP/NPfoLBHvRI/gJhxSV6Q/IDQDGCb5QPeUHB+vn8SSV//giTdZQPIxdSaLeQEnCR4ANfrFz5LAQoPXu6xAcza/Uo2QOgBiMfkQUT/8j//39TKAgAAAADYgCFX+rdcC9+nWsy57c8RRBMNAEz8v2LeNPefiSjJ1qqWvNrYLP3HeXlfQR+Kkq1oVGkV0n+hgE71P39Rr7CzcvYWun+xjZv0r9TclVkaWmoK0H2uLY1Nkcv5ZrGhFNuM1xQFM780yI/l+53P/A50KOz5xJzCb3zNDzjiZqIfwMUWWyZd8qTn501BQvW3ASiofyMn4LN7z+sVharevxRAikCCkRCneKYN8DlDKF8KQP0HAAAAwC7IwlT9hFVzSpvPBWqLo+mx5tz/ORP/k4CMAYCJ/1dA15v+k8pWISq6N1xj5sUkLfuWp/RfDVJs4yj9U4Po3C/9s6+LG1LT/Ut9OdbT/clV+jd8NfhaJj6if5PiL7RXDcWSP28/xFPH/6nbNZOadM6bAey/9V+LV0eLH8DFZ/wApVzORMna5BcB4n2BGm0AqSJNPbVmdzgBZ7RLz+uVIy0j0+VdlgKIHkC5fl8b4NMm22Z7KNLZAMVQ18MSsrxQ/wEAAADwDIZMeDNebHrVMHu65JV3hvqfR0sNgJ6J/zdK/3ST+q8t/nXBoxRq2f2nVAOzazT2da30zzVYXfovxJmm/heLFPeFEL+Eov1k3Z9mSv8NiqTigK9/pJVD2iaYlj5xDxJh19yQu37/3VlzeEFNYZfMAMp36Wg/QBE//Ko/iy2ZyJxMn7+usAGyWovxn+YEBBt7fD0AIs2TgemkY9CTgaUgWeWZDaDblUIbXrLXh4qayTaAIlQ+MlD/AQAAALALsv6gEFGt8YtT1y246emjmX/bn5DLAPgV6Z+mq//vxrUW76tTVUxBs46acC8+TPq/wlSkf+EtUarO96zePJDU/911f0Wz4dK/k6Sev9vtNHSI/tUPyMwfrfV+IKfy45vfyZqjt6ypYzEDaHk/gO1XcgXcbAD6nDeptePnOQHntffO6JWD2R9H1PFgf4fZ0XN8MnCcKLABOA3/Fhvg2oknpeOYtBE5znevf/lfgPoPAAAAgCcw5NLKrHr7cMtl4i23/Qn5o0q25O3+P6GMHVad+y9K/7kQX4oWBGlWnAdL/7ZixAZd0j+JJgq3F/TmQXZpHL7IhDYdvaqjqNpMPEJG5Z0s/auPzD7R31/xp74P6dOwbuCyOu+CPP7gCVltY6tav3Qkb+UHpC+fn/9LNWWh+wQbgIIfgl2cgLIHQNd55Hm1z7TrLM5tTwaOEwWFLmADXG3ekZiAijjHSX/hX4T6DwAAAIA9kOUIhYhqjV/Ury24SeqjuV39J6I/+078J+tITX7k77ulotEpq//KaDUlWrqKr8fJ1f8+1dgm/fNtjuivJp103m1/WPXfW/en+pFWlos68hZaTpD+LcZA/TOmsdZcFX8yHRjr/YZd3F7b7QXoafgB3GjrUjo+OHGAgI2Ho671W1XmV9usMaNURh2KwZmOaj9Ajiwq+PfaAJ8GGzgBZQ8gaHB8PQCiJZ4MnAfh2lQeDGAJNc8GKAL1HwAAAADPYMh0O+NVnVcN86cO3nvbnxDmIcAXj5H+SaX+Oz/y9+y76T9lV/h6hffkXu2X/qtBim38pf9ynEIZSmFabx4U1X/tLtBlrxeTl2GKqdf9C42HSv8WC6ryWR2k+Bd7pSXVLdjejGAtFt1T3Uq9PZ8qVfGHYBvYH56ybp40t/gB+VlFmtsUnOl1xP/NxOWE5GRiTRuAgl+NZZ0AiwdAXxvgvUnZgCSjelqSmp4MTAvbANWDv2wDyMVA/QcAAADALshinUJHtcYXetiv8YQ4i11urzDx/4tsAAhn8W3SPz1C/Xe+6b86YClUUYyuq+RCg72l/0IlemFackTq6j9z8VooSZOXqWRN3V96a4L0nw94rSVHhwbqqPhX2yz2kyYzW1OeSst+HZB+cNqhWvuGQn4LbxH2Es152ffzbiFKwAp+wNVR9gPCF1gbIEk3xwZgu2TNlnACckVe4wF8Yh/X4UfapQAmDyD7FS89GZjNKLRR2QAG7V62ATQlhT3zYeSA+g8AAACAZzDkks14DetVw/zLz6XUf+INgIUn/tMW6r9u7n8pYCji10MxSpBWd95A+r/CNPsZ7+6d6n9d+qdQLXDa9loNeXbvpFfoBlV6nPSfD3IBsfJlFH9NSx+pN6juPl1+C+W3Mjys83c3A4t4pIszgmwfpCpv+K2Yf6eHLxR25/p+QH4WwtoAxIn4o22A8IXFnQD21jpKGT30AK5XjjTLmQ4+k1FMetDJHMalpQD6+qs2gEm7d7EBKBpYCsc26A71HwAAAAC7IMtWCh3VGr8oYVtwU9XHMe22P6aAsQHwMOmfblD/fe8jpJ37z2uvxdCsxp38VzngLur/wtI/H0Gp/rfWXMme57UE1Der6/5iA+FOxh7Sf/3DU6pZKeTYwt4h+lefGtnFJD17nR9pWbfdknUGlkUvt22HNPLxiVtqBpRFajJL/IbGNOaRwpfGHYuuehHf1wYg4ad0ByeA19NPXfAbnwxcPgff2gaQY0D9BwAAAMAzGHKtZta+fZh83bnaxP8vHwNgbemfGkbqlkf+9qv/30sc1fYyV6Jt2mg+J0/1yXSR/vk2R/RXTzF96j+fPbvUDV/Uqv+1jVJseLAV83V/sc0d0n9V8a+0MYcdpfhX28SH7tRfssU15U6evXXNDB2Wx485I/m/X0/fCaXrsk6dR+5snLV39gPOMOgMG4CkE0D26bVJwCuQwDwnQOcBaCJ/VO/PkZbtDjZU/5OBpbKr0bg2mQ2QeRjVOBQZGFkIdSjJSzjpL/xLUP8BAAAAsAeyalfXGDQqRH6e3hZH02OLuf+3q//0NgAWvt3/J6Cxw/xH/rp6CZXtPbM/pAaK11eX/jVxCiptp/pfl/4plAEMm198d91b/FcCTpf+xVKV2ow+YIfir2xc9jAKPt9Kv3Zatqh58jwBF7YY2N9BEn8FM+AjI4Y/ywq1Oo/f0zhrf/z/7L3Z2vw4kt4XbP8v1Jbl0Taj1SM/HumxfdzVMz2tael2qqrvS0UfcAMQOxYSzIz34PuYQCAAMplM5u8lQRS/si/4/OtRl9rLXhsAJ2fK98vPycGsJ7jlPy0Wap9+6Vtux3I5AbvDYPAAIIPabM6CVq90FzhVn1sB1O2jrgJgGwB5GEDvUWQe5VYAY6o8QdD/UCgUCoVCn6Ehv4OdP1R7jeHO3/RzTvuTNv3Rl/4/j/6hG/33PfK3PeF5XZNplYmfU8pwpfjXon9hPG3on85gpP+1jsVruT9MgP49+7BlJFlSU3D/SPli/3tQ7zcD5W9ed1lv3zL3Wzs58aerKuYIIvPjLuRgb7zxEQJczvVM4bcBhOSuJOcwwLxhtU3U2QlgAH2TBwDXGq9XCWLgeEu23wrAPdBYzcaEJU8qHm8DSHvyleEPQf9DoVAoFAq9RDy7M6BUb37xGnaPmDzT/DK97cL/qpx7U+IhwC++8B9eS//3GC1iC7A9PVgo74v+s4T1eZbsX+N42ug/AQRE9A+uLUA6MVKrmbk/TIH++0H/h4n/HsBzf/vWe6nuWZH7+e+z+pjdo5fu3CAcNsW1eXlZU2Dsjn6AN97oB7zCBoBkw87mBFR4AIbhlcib6QWDb5/3QN0KwBoJRTYw7bHKgwGMqYw2gKLlD//rLzXtQqFQKBQKhSbTkB/KzhOsXmO480f/zNP+pFsiMwDmQf/wEvrfZx6h7YIm4/pSqexbvxL982EmOqkE9ET/0E7/KRKNo87yRvODZw6juL/YqSvhe9D/5MQfROgvZHgW7L4XK888cgTiplCnIQnccmq1nOBwuF+ulc0AaPMDyJEI8X4/YC1q57cBINmkTzkB5Iq4PICriamv5fKWgL4VAHkA9OrYPYDjFGvYgwGgfO9G2wAr/OF/+8UeHgqFQqFQKPSgeHxnQKne/CLI9qgbWx+h+af9SV/sBsA3oH94gv73mfQfjg9n27X/S/FfaGXI7EP/dMySLT2O/slyDJ2h/LmpDszTo5/7m8M6cX94Afq3E38xeHhk34v95/gK9GnCMd95qQBWlw3SI8ltm+HZ7W2Sc3uy59IyO+Zq83K6EoNt+ayiDfGrwTmWrbUB8iY32QCQbMybnQAao1d5AIZRZR4A1xFO1ePJwGfZrTaAeqDhbACxbdD/UCgUCoVCn6EhP8rcBLyPbvwl282cGDftT6ofUEv/R6B/GEb/J33k7/bTxcRke7tnU6F/Sx4t4F3T/tA9ut4dc5iV+5vC5kb/lj1WGJU5YUOk9vSOybl/p76mZr7UOk7oUxR6YJPGRtG6XYHBxCsVrdZSIJ4zC8rvvpv9gPU6h623Aagm99kA55BA+xLt6AT08gC4VEUA5G8T0xFO1eVWALjZBrDkAZtVcCjofygUCoVCobeIZw4GmurNr7Fss7rh9RF6Hf0HgB9B/4+uHWt036T/ALBq62gghj2Qfa88fvRviJl32h8Ht12oQmfOMl2vhDyxmBL9z0T86f3QNMIK6D/gu/AxWN9xXZrXYWrHwq7nT5Woi3PH6cH1RXR+tWB9uxkAaO18fgBur2Q2BeP14mwALq3XBmA6pQfJbIO5nACnBwDCGaIRnR9rdvlV9zwZ+NB0NkCyTSCzRi4F+g+FQqFQKPQxGvJT1/lDrNcY7vnZ/q5pf9JS4iHASqZ50D+8mf6vTZP+Qz/3DHVnaF/PlJfs3wzonywX0XwX+o+GbaD/U3F/mAb95/GO1RcG1hhp/MxWQHzNJ/gEWD9Ccw7P+G49Ofh8iN1GMpOfoo+larURFveZASwcN9QynWYhBfPu5QdgeM3ZAEkV0+NSHs1JG+DcmLU2ADzrBDR7AAA9bgWgeTfqC6XqdSsATGgD8Ar6HwqFQqFQ6EXKTnlWtkZva4oZSy9nuPb/jRf+nxU+A+DL6X/HeYRMq/yb7iKo5fyn3ZGwR5IB6J+LmXjanz2Ji/7Pxv1hGvSfV3XdAt5IepzEOta9yyL3HwQwb1Ey9scHyW7HYSMbvsozbV5yADMYAZbjYYXSozzCwbQZQDoBZP8WIm/wA66ojn4AiVbrbQAor0ZnbADAU/o4bQB4xAno5wGAcFJs8QDgWqEVmI1PpvKtwnINl9JgGwD5GVyefIPA9jldAIL+h0KhUCgU+iAN+TXm/OHZawz3/LJ8I/1PS60GwCD0D3X0/9WP/DVe+8/T/17uWaYu6J+OWcqlBnR+pWJBKlpZbtUoKo2jzvIu6J/ql3937Oj/Hu4Pk6J/UHet/sSfPgr5Nk5dlcD9x0LemWjyCPFIqlsXNe/ZTJu9+wAeXyOXXDvCeXxID9AU1j+zVs4RBGgzWmKOMBLUE/xbOGvhiD9P3kfYAHBs6XYbAJI37Q4noJMHAPCSJwODzQaoe2YyNYDEBiB2PVOeI/IP/+wXW2goFAqFQqHQ8+Jpnn72Yzk/wifjdXksLR6/9v/OaX8qchq3v24AzIX+wUT/J33kr3lgt177/8Hon0lI/04nuTyGrQ2rQPV7JDa5EWo233iyZJ+H/rtD/y7Ev66W+1yz2Qxv6LOaZ3j3XCqwSTxIPjeGacSN7faNRMu+6UoAbTIDskbVZgA5TrNtQPsBgI5++GuYgsJ01++xASB5xzo7AWhDV3kAREcKOldhN353OMsBpfJNBwSaDcCZCtRoFR02QH5CJ1oaqHwB+CnofygUCoVCoU/RkB9Ybg7eRzf8WHzjhf9khWQAjEP/8DT9f+aRv830v5d75mhzG/o3xEj7zLBpf3xbQ6D/wlbywGsr9zeF2TDx5Oif6VGS9eDTPLFP43iw/yQ3GXfEnpkaN2roqo37Cn32Hbm591fsfhZMn5kBiD+mlWkjVKv0gkWxfkuM7gcUX2wY9dpsgDw5P871qMBWit0GwJmFHvOE0MsJoDaU3wMAgsuDhs4t0Hy91mC9mhi4ufdWAFBsgG4zAsG+heFaAdpB4RT0PxQKhUKh0IvEUywDt/Tm14i2Wd0ge1+9kf5zG581AIL+901oov/qhf9goq5WZi0QVbmhErNk/4ajfyB2byZ+mml/ktw2eN1xY7Zyf6GLadF/d+JvyVkXwH2Q2SbMpnv6azLTVIOBWy4S2DTbiqeaeWxeGQngDWPYZDIDUti/CsEXIheIvwXxu4KNfgCmt+R7QVLstJf6pwT7bQAh851OwFAPAN7zZOC96hYbYDuv42wAJkOg/1AoFAqFQp+kIb+ZnD8te41h9O+/z5j2JxVhAMyI/uHb6X8v98zaoBI0D0D/cswrp/1JctvpfztuNnN/EPaemdE/MwxFvSb2sQQIMXivk5twh512qvtJXJjTuHW8mUE//mY9PoBUzw7GBP25QpMZkDUSzACgNoXMgtVIxg/Yi9el/JbCLFVm60f8FDaAOtokLQCVWR3nWd7NA0DJVW5u8QAgf6/3EtQd9XY7VuSqXfhTh642AHnrCaWf/vdfxPpQKBQKhUKhucRjPQO39Ob3A2hXz89e+3/nhf/+tLqdQKo0AGak/69+5G8P+r/LwF4dEN/IT61tl3KpBy1Vdhg7/Tdx4Yv++7wQgf4zV7OxDSvo/z3cX+jofej/rol91Ejuk8s28Vzs/9SX5VREONU9aH7a1RfUacw3ex9T6WKjm0zQnys/zQAEWNPKtFEtwadlz1bMFA+LPiNQ0taU1tpqjA0AzNuXy+oErBs67+0BXJ2i5FvpPU8GxiOsmA5oq1ilk78+NkAZkOxxSVXQ/1AoFAqFQp+kIb/XnL8le41h9G/PT5r2J9VlAAxF/zCS/n/2I397uWeZ8vfC0cXb0D+dykj/21ZkLP3vxf1BuN5O6+sW9G8yYywbE+0zNcTfGCOHHVXWAbgu9vceZt8DrI2HKXaFxq3pDOS739rVrM179qJB2nEoABRmgBX6k+Up7F+F4BIgD/UD0mACDW+vkXXxoA2Qx1faAEy2QroTMMIDyMqJbQYw65OBge9Xfj5wLxsgqS97WuGnf/6L0jIUCoVCoVBoJvHkxIAuvfkbGLSlxYPX/n/etD+pfsC06B+60f+XTvtzycA9TZxUqK2B3X70b4ipQf9MWpqeYxidFHah/yy170L/e6F/lfsLfb0T/dtG6A+whHEfVbZtj4v9LU6bHnKLxvHrrmtID3M+/B0Q/wGlXyLnkd4N/blCqxkA6N3v7AdADnlJWL/abgVImgtVRVfZEu0r6PMRKTYAN6RyHGyY5AQM9wCA4PKwf0fP9WRgtd/RNkC5Ma91CfofCoVCoVDokzTkV7+bhvfRUILxkdP+pPoR9H9Ewi70v5d71tpAZNk3on9gx0vScxM6v+i/w0ERA4TfqmzbPvR/PPdnhjQQ/btGQhZi+n8P8c8DbNAfOnB/stNvZrtd152ARV1lwY+m9vfrm/exTRTHX9Kjvhv6c+WaGZA3UfwAHCFmywIEG8B+K4ClqkiuNvTaADiJ8aOohS3bBr/NA7hGQmwtgCmfDFyOHNcabAD19EdzOJLttfz0z3+Wk4VCoVAoFApNJZ5lGdClN7+Ba9vUDbX30hvpv3ezEw8B7qig/6weufafDPAy1gHoH3T670H/ZDlJ/09MIyZUe7wyiluMbt5K/2/h/sx4PgT92w9Tnk1k2zhbIRXrGu2XcH/7Go31tQFgyOa9YdSKPm+fqZZlU6jIPv2KUc0A1SEgyk8zAOFXZpwE6DbifrLxQry8YDD3cGBXL2ltpQ2QtCBtgNMX8Y7KEHarB1BWoS5Au2re4gFA/kbvJeidwZu05S4E2QZY94+YbgPI+3AoFAqFQqHQZ2nImY7zN2OvMYw7a/vsaX9SjTIAhqJ/eIL+3/nI317uWSnONvD3YqX/49A/k5xA5yT6T8q70H/9wn+yeScDg9VajICN8QW0o39UXo/+yXKV/hsPUM6N44D+3MapKlS23hdS3XGrPD8tuvPt/sJdK5WK7KlC1gywQn9UCPkXJf4K6eUHUEg3K8GYfqfwaEcRaK+hymkDIDzN2ABAzguUNuFqxWE84AFcYyA8AICeTwaG841eqO7QOJvuQjDYAC13NS8Av4/L/0OhUCgUCr1H2YnPytbobU0xvTA0k+ehn5ZvvPBfquDiV4BBBsDjF/6Dh/5P9cjfSwbWyX/abfKR1pyoPov+mfwDn/crxtRM+8MU0vSfDNTevlbuT8Z8PPrvQvyFPO1P9P027t9lLTpS+8/Yqqk+b43sall3gp2jKo3j++YIsmSGg7lntZV+AEAyZRCi/FlC6uUFg/GtAFwqT1V3GwCOrbUCUZW14mrPmGc9gKyW2E4A3Z4MDOcbTW5kKpXeNcirJtkA+i0OQO+uEPQ/FAqFQqHQB2nIdWvOX0+9xjDuGrw30v+KrXH2298AeJz+v3ran17uGaGTOLi7gPPKrjSPpS82XXf0T5ZjKg3UdmgzM2qm/WEKWfrvwetDuL+QeR70Dxr9d6ViaqXNK/hAVXxfGUNjzq/S0C0w7nzErjvf4tidNgkg2I7s0+8jlxmgOgRZrccPwOHnkGToD2i9iFsBqP562ABZXu6tcdkA0OYE3OYBcAMo86BeYP9a7/lk4Ksk747C7lLXlt5bbADc1xL0PxQKhUKh0JuUneasbI3e1hTTi0R3o+3tunnaH3/a/vQf+hoATW9b0P9TBkzJf9ptOT3Ek+jR2TbLo9N2viumLYEUiMj+9L/ywn+mvIn+t0/xLwR8APonW5m7ZrdtnY9VBe6VLeZau/l1z+B7gfs3buohY6Y2KEaZj6j7+qbH6xVXMV1jVk1xfNYMsEB/eTBg8AOo5DsyZyh/2ZCyAS46DAy3bbEBjl6KsdMN17SBZANcBXVOwD0eABlcjC37ekTf3M8+GbjdBqj47ZGn/f3/Eeg/FAqFQqHQmySfnQ35+eVm4n006KfkGy/8lyq4eNRvNwMg6L+kF137j6kuWyU3JNT9wn86p0j/u6B/ut+0L6H5zfS/wh9SM0+F/kGj/5Y9pAvx92wHY+FCFbpzqlVvlUzjNA3dIKOp98DBMxzf18Da9q1aj6MjPnZzaJ6s0jh+ZgZYoL/QI64Fgx+QoNIlNSRSyi+D75Wi89zl2xxMl6uSUVltADjW3WADQHIoVpyABz0AblRlKtSRCuJ1Cn8F5DsJejeoVMqMQOoA+FsBFG8DAIL+h0KhUCgUepWIU5tVqtSbKzE63bapG3Bv1xvpfwVdIPvtYwDEI38lPXvtv7ELvlYf/VPon6wiDQxsgTTQfxbWW8ySJvpPl9gYvTPmM9A/2ZDyBmodFO05zFXgXtlQlr1CqhpNpocDX20FHJ9yb+pZ3AVFzGpoQ+q2Z7jWveP+eNs2T653vpyAtIgcEofmF1RSBJ+HqdRcrjADAG0i3Q9IyHiy1mtScqXFw0ABVhuAzOmp6mADMF0oTsCDHgAZn1ZdoyU8AFBxuZA8D0A7iW29YJQNICT8/V8F/Q+FQqFQKPQaifSfCWiX80dWrzGMWJfvnPYnVasBMMOF//AE/e/4yN9e7hmtta6LvFEFsT2zDED/QEJzjnX2pf9sVcpmHGk99B9tKxLTN6wdm5No1RX91+xgi/LOqqCc+2i0EH+uuWHFu3F/wZ2qPxq8Uu411b/OMOJ1qmXr30bwDX29r6OOygFx+sldy1LGDEibkcieZNDpEY80AziPgaw1BSRkPMGvO+FlKH+Wn3pZruV6lqK94UEbAPgNm5atpWnyvAfADDjPRmwbAMOtAKoHANe7fO2chicDb4XdbQBhjYL+h0KhUCgUepFEcNGHOqIz1so8lhb3X/t/84X/zswmO8GUSIKoS5MBMAP9f/W0P5dcfFCIF9L6waW0AoYBDEL/dGaR/ndB/3S/efqp6b/G/YF7x2vRv2mPHYH+ybbos2D+QFVd5i9U3Qf9gf4UyHojkB0qgf1V6M7NO7Svb95PeEwvmgGQbTWZ+5+FZFhSnpkBXDBOrgZkQ1rwrQCQEl4Z+pfZrpJsFUkETyZxVhFb12UDoGEXImj+sx4A2SStgtQGoE6ehFsBZP6e976kb+6CuuPfhQ42gPb7JOh/KBQKhUKhF0ml//W/TwU5f/H1GsOIdfnmaX8gGXO9ARD0X5KN/vdyz2jVUz8b0ebFcu0rbSX9pzNjQp0UdqH//BpNT/+ruT/R1o/+6wwJtpdspHQv6u6he0INxF8I6M79DdAf8Jv7Um7bcdjew+4NW0xmbeM0Lj+XeciZaZUq1p3n/iQ6Lz7myA8wmwFiL2k5O0cQUFteDijBffOtAHwJYQMAdYrZYgPAddrrsQGg3EyME/AyDyCrxUYTAGjz8svJ4dq2V3bSAxBStdsAiYr7AIL+h0KhUCgUeos07GMAmO5eevHobsy9RTHtz5JYRDUGQOsbFvQ/lYGoLkx5axe8pBXQss144b+WWQ5omvaHqW2i//rXgDYq1Rx6I/q3vWT3ioY90/cpvh/644YvtQG6aPS6V3xXVw9p6LqMSP7qHU8g8hSOL8rTI4DPDJDtAapwgaxrtx+QJsyS57cCJCux5iVlW6EEsi2R0HnRBpDFiY69AAAgAElEQVRXQTQJPDZAYqqQTkD+/j7gAYCG6YHZGmVC1N2Rv+etANkmRft8XxuAfyTAT3/1M216hEKhUCgUCk0m8Xf9wsa0y03G+6j7usS0Pyn9hwoDYPSF//AE/b//kb+93DNW3EzuTDDRS8VHYhz6JwOM9L8B/QO7UrYNxVpwbfTfsin4/MqO8Rb0XzRRt4C0V1DrWEf8UW0H7l8N/X3ZHtJs4yl0J83vrttGMqKjCbe8wP0Z6M9hd9oMuP7nkF3tSPMhlnxj6n5Ayf3TlzlXTQjvlZlrS5bkhVYbgEtlrqJtAG5swDgBOZR/wAMAgAenA5KT5wFoD6HWDth3TbIijCMBWFb4/b/4WQkKhUKhUCgUmkPt9N/yiwqdmVbmsbSY5Nr/mel/xY9gddqfNKfPAJhh2h94gv53fOTvJQNXZXGnMbOlCYdxDcFZQ4nt1qN/NjPm1ElhF/rPYvo2+s9WjaP/NdwfWPSPCh9G/7aXvHOA2Rg3Hr4K1S5UIZtnNPTHhfNA6kbJK9J+CcE9G0rGc/dotl1itvEAj7O5QkDvLFVVHJquw1V6EDFyf5sPsQD6EuNSpS+zhM23AoBUWK7QLE8J3qpycj2NB1CuCB68cJzJfh2gs6ttH9Sb673newjVHT9UZRh015mBVNB/em1DoVAoFAqFJlA7/a+U89yo1xj6rktM+0PSf7AbAG+c9seS8/5pf3q5Z6zGXftfQf8b0T8ZQ6Lqo9xnmdT4GUcPHhysZx5J/6X3gHM4pkH/yhvqNT+y2nw1HRSerlW2Rj33r4X+ji48AS/S6HXpdZ7SZZxDV/aT9opqFbxQdQIg325CVVKbHkaQGXCV0kNKI4Wu89rTD1DYfVmVodUz8hqR0FYtBJRt//f0U4KB4vJzeAAAH/FkYC2h9HACcRi//6ufTeMMhUKhUCgUelQi+of0jM2dRwrohaSZPDf+nHzjhf9SBRcvIMfrF14pkwHwRvo/76T/YKJ1PpCNI2t2bltmu7rP+UMXUvS/jXKOmPZHynw//RfsjRvQv9TEjP5xoYz+iwDhwn/zsN0j5ArFvbrsSE7e1OlMemp4vstLR42ivzoO9UVr3Usk+pedAFdVUUuZAZAe0pasKAtVzQDc9Zk6tQFY7l+8bHs4MLkKKJiwAYD6RmyxAeA6wddtgDk9AAD4mCcD5/G4fGtkPRSty+//xc/sSpGloVAoFAqFQk9IpP9W9F8p5/lQr2H0XZ030v+KLeC98P+UbgAE/Vc0z7X/3gYralTxqaBp4wD0T5QzkLSB/usX/sv556f/grfxXvSPSyRDSLzwX35pdOYq3qwzd0foXz+SWdVxqNwh6oatUXeO03dgg1ZTTfvSa29l9M8hbMg3iIH4y1XpAe06ui/7ayJOZutM/E6QFe5fVC34VgA4sa6KwskuUCGi86INgFPJVUlfJhtgZg8ANEyPV4dOS3H5254MbMhJ+wYovpz33zLIUCgUCoVCodvVi/6rMegMtCaJscVt1/7fP+2PM/Pz9B9kA+AG9A9P0P/7H/l7ycDpTIRRSGJswvWoBRsy8/m6oX9IaakD/YsxA6f94WrvpP8acVaHNwb9L76d34v+iwD7hf8kiPfuAHrJAOjPVQnexos8gF56EPR36Xrc+NWj9LDkE2ofL4fUuZdAbSkOu1dVEWbAcr0u4/Fmx10k65jdCpBX8ZaA/1YA4LdSuw3ApTJXETbAWzwA2N9E6dMmtt3Hcf1D31sDnwxMdEfnVHuhxazR+w5OoVAoFAqFPkcaB+hJ/8WOTOp1HUXH6zHeeOG/VMHFS8jRtJOwBsAkF/7DE/S/+yN/e7lnUoMKqyDtxY90q3pkJT5DuIxNCx30XwZbdG3TJrpSTEf/e6P/mo3TjP6LQmWXMF/4n+ap2Kmmgv64XH75iMxj6H7JZs3a2wfx1LYdR/Bn2Fvu1XldsskJMDJ9HEDybnPVklQlZsDKxWflPNy3zgiUVXkeDkyWCOXIBrjW456nBL/QAwBiiyRtQbQBrioCj+tPBhaSg7x7MDYA3mkFx2AFAPj9v/zZMoBQKBQKhUKhB0Wcj6xEfRf6j846a5IYWzx+7f/M9L/iJLTlwv9TtAEwCf3/gEf+XjLgOZ2Byslr9u+uIjeviv6FGKK8P/0fd+E/TEv/bRzZtEPOgP6Pl2wq54X/C1klFJLl/GbvA/1du6Xh5ewkZMAJhOOrsmEYfQc+C8G/53xu0E5pGXxOFk1OQB3Tl2uNVUdtcuxakqEiMwDyFSRtjHU/nSTYvWQJbONYi8irBxJt47XjynMKXAJ6GPWU4Jd6AADPPRlYTp4HZLsHiDZAmlaE+D/9y5/5FEQNHxwKhUKhUCg0SiL99/1arfnl5Dz16fXjrF8eNlNM+0OqNAA6uDRB/9OE9tDaFu63bM178dNta4+d0T+k9L8L+odG+l+H/snyGej/Deg/X81K9F+UY6pe/KjXcD+RR8blQrkL+tdsQL4JV6utfr3v+LjqRivj1wGqsRk4zUjw7c/izBqZBvHgDpmDZp8TAPnIq82AIkCootJKZsD5n7QB8pVy3woAIMwIRNgJZEK8Xnw8YQMA9Q1abQPM7wFwgweAlzwZGCDfyKDZAOkYUNBPybX/tHeBeteDQ6FQKBQKhbqqF/33OwS9wDST55bTqfsv/Pckt9oJeiK+Ry/9h8IAeCn9n/ORv5d68daKLvhI02q4RuJ6y4TkGvqHdPBD6L/NHXkF/cfj0pKYtu0k6P94yWZrv/C/0glYiIHJGRzJ/a2oN/0B7j+8F2r3xh/FG1ZWIIwd9SzBJyWjbSKy18UfY7Qk/BpKVn4eLhQnANA7ZWf6IG5STxVlBhxrhyE+Bfdpds+5CEdfyq0AePBeRs/ZAAA9nxJs9QCSFDd7AGTCpGpj6XYOzmemu16Ec0A5ed4F8nIMOwMK+wnN/MPYCDTtDw8gFAqFQqHQaGmgoD/9F7sb1svAPHfT/zkv/PemvQyAeOSvrsmu/Qfvu7bmvfjBItudQFqLDEIt26o//X9m2h+y3DhvUh39L75FxCRvRP/ADrv3hf/6OzIZ9CdLihHKKzhc/bizoOKgN0KPeAzFCDr2OMIMeKNSoomdgGRZdwKEcjvTFxI6q3YYel6kz7FUtNz/4cBkE8g3daFeNgCX6qyq8QAg2zke8QC4NQKAlzwZuOxgReYKoy0I0/8igMhCbXa9v1AoFAqFQqEqicTAgf7tYVCeltbnkVvccO1/TPtTceH/rnX5IeR1JVJDvueRv5cMnE7nobyW1dMEA9NeMr9ljfS/C/oHdoe3WSPV6J+sYuh/WTqY/k+B/n3bTUzY98J/hZIz3P9B6I8L5Y+PsOlu1itwC00kH91uhTp8oXcYxbuVI/5WJ+Aoz/LjwqKJUCUkNFZd8H+RbgXAy5BAZIn7F1XErQBFuEr29XJkA5xlNU8JfqkHQOZMqrYBsh9xzUJIqojeOz4ZOOuAW6M0fgUA+Olf/ZwXECp25/0/NTZm+4ZCoVAoFArVqxf9d/3+LOm/5xSn1w/dLnli2p8W+g8AP+ah/58x6T/0c8+UNu43zga4mYD2ef/5uwfYFmltF/rPA/o303/lWwRM9H8Y+q9YHUswsz8Mu/Cf6mVq6H+U8DZJusxbJvdrZuIyDgjJyMylMAAaVdL/dNnnBKQhJrhfx/QrGh5EdQHnrQAAsPa8FSAdV08bAK4VvMp2KwLQG8Cn+jwPAPZ3UPqUixbCPqBjXDikw60AQMYox9+N/vuV7CPklq9KGgqFQqFQKIR1P/1Hpzb1qeQWD177PzP9r0C93af9SU/Ny4cAuxX0n5SB3LFgziDftf9Hfuua+DI3OHky+gdq2C3039ZdTWa1OfUbmQyrof9KTAP9r8DWHPo3MmtDME+0eYpNIX5i3dXldZEGUOgR6H+Um7i/4Jc8zjweH0ChjCM258GyZ77HEtCaNBz3vV3dKJl9Z8sGJwDy07Q1qTEyelc8WVsEUKtzwH/GBuDhvvvhwDt/X7PIJLjJBhDjCRsAqO9OA4u/zwMArRVoHgBQm+uo1T0AsXn+E7XMpN8KoB5Bjq/pFX/6qMif/nVJ/9Vjdh5wbEbKA5DzhEKhUCgUCqkS0T8Up1buVHpksmg+ren1i689T0z704X+Q6sBEPS/yOmKrmtRYXCtnk+7hS/7M5dJpOAlDUjpiSLXAFD6GpJ7pnC3paH8RPT/XehfANnFyzQVF0anWrI3yLt9boH+m+hBlivL7PlTeQDgG4PxYFr5PV6xNXhW1Vn9+D67DUfuDB29hCxd1ZjXMwnJ9ItlYJwABuIXn03aD1DNACEeqK2J+ThjA6wpTV7LgHL5iFlIZF9y//Qlgu95QGkDALW+wofLaAOQIylGLpYM9wAsrfb1YW5r4NIeVdsYFRtAgPiQ/lYl0ki3AgjvoyS6I0z/qzImOz8aG2OzhEKhUCgUCukS6b8D/dvDoDyLLDp1ZxPCR1/7/8YL/6UKLp7vsXHan1S1BkA88peTgeXpeLSuCz64M2FpFDv+8sDUhf7zgD7ov6kXpTzv5Q70XwQbL/wXVlxdXhdpV5wK+uNgblu5tkBvOY5IvcfgcOfX4r8ro3nk8raoW/2hfH9yDFY9vOVCopDO41/hBKgQf8lqgLs5gIP7ZH5jFcfo1VsB0uV8JNZbAbKXiFlzNgBuC2jjC6uJCgkbAI+kiwcAkF2eP84D2MMYRi2j9pbpgLLacrvupavoMcjJzwyQ3AeA4mX6Tw+LjUkWUV+WVKFQKBQKhUKFetH/KvSfvPLQ/178sD3PG+l/xVqPvvD/VJUBEI/8xWld0XUttmY+UmNj3EyM0tfKHkoKGcbMo39Dfon+m80Gd2a1+WD6r5X0o//Ton949MJ/37YSa9uhP47nuD+oq5yBEFb3UJBxvQjYVI7lgKOeRrEZHJqB73uHLRDbKdXHCQAG4qNC3QwoWpFmQNGE3OYcoz+Wd8QM4sOBKbi/c2SqinUddiSPPkK5DQBAZSbzy+VJYWkwFPScBPpeDwBnzmP6ewCwsCc9Amof/GTgLX+3WwHWbB3/0HDtf6Fk6MciNTbGZgmFQqFQKBQqJaL/q/5++t+LXg699v+RaX88yd9H/5caAyCm/eFkoHs+ro1kdS/SJvZQHySq2kpEF8Qhieat1oRJHg7BW5qrQLCmbS39p7pwkPE8wEH/50X/PNRmlom1Vpe5C/8F1A5tVY3QvywxTPHPcX/XW9ZXQ7vgsKmliaGh8hW9Fv99mpHvV6xJse9N7wd0cAIg+TZSIX7FTEF8qqzQ8nK9BnDTw4EB1EmBsg572QCQrCl8igcAQNzQkCYB0QaY+MnA+X0Auwfwh3/9C+Q7I9vcEAOkB0CNLTyAUCgUCoVCqiz03/hLqIr+0+hfzdbrx1ljnjde+C9VcPF8jyPoP7gNgKD/OK23Qe1noX7qfxtQdvTlySymKvP4DBLp08LVvpP+I+L8HP2fAP0LXLt4mSbkwuhUzIX/FvTfFfpr5w1cCbOf8x4Aa5CM5hy3cRQjASri7U3qfILaDJI6svvGd8fS3OVqj3MLMNJDJfVOANSaAVD6AbQZIKeyv8yx/gH/l+xWhiUPxsvgfzjwXrIcAWj7LNn/FWcjuyjKyfijz2O0n+EBAEDtrQDne8e1BdEGuDwAIo3+ZGAhOdJG/11Hdgu4T9Ili2ijeb9PQqFQKBQKfZXEX/ELG2NMpUdW0n97/49c+z8z/a/4nXrbhf9pHo8BEPSfk4Fy+tA2kvva//TiZT3Ymdysa5/WNpGJg9sCxk77U9n2/fQ//5T1RP/cx8QwDJVus1xbWLZc+I/eFFa3QX8AH/dPu6O3g9hXuzqmtRzs7N250E6jT5Cq4aBXGdw9YUvDLgNudwgGOQHp2DIzAC7CWPYBZbn35oAc6F+1HGte81YnHE8vKl+ptFQXF1XneieB73quZw7ik8hKG4CsSldzf/kRHgCAciuASOGfvBVA1Gkh/OFf/VJWJf1LGWxHmiTsWKT2K2O2UCgUCoVCX6Ve9L8K/Sev0GmKmrD9t1Rjkpj2Z9CF/6dsBsBDj/xVcz77yN9e7pnezPsLw3Xtv7evLXnrjx5+U7RRsPmm/WE+Pi+i/+PRvw1529D/8ZJeXxJqp9/HK9VQxv0VmxRV9YH+RZjK/clgYaFOQwGJC9bLSU65UL696y5DBWeSjpHtI5+hCyzXmfWaLTicADy2qzBlugkgxiNEhakfgH5W8IweQ3ny5bGw7PmZGYF4uO94ODDkb0SFDUBkQIV4nMnLxLHIL59/sQeA/Iy0CqSGjz0ZWB4YAJzz/meRjsOr3So4wpJFtOLhAYRCoVAoFDql/ah/jP5XgUgGKA879Xnkwn9zfoedoCTiuxtN/8FkAMQjfwUZWKcOTKt7oYM91/77k9tj9z3bjoMtgxE+LWzVg/Sf+Y37IvrPHYP8jFsamDwAuS9qWYH45HLjhf/2DeJYd27HoC0lYhkV1nB/3yHCE1wnEvPdo7quO6L/VH3fF2O2xrWwNNePJOTXENXM/n0lA01OXicgHdWKSgD0mYLI5pCfLa47xM6ak7yeC0sjj/KDNR/rgwK4JAlYZ9wCcgAA12p0f0owg9oTgv9BHgC2UuT8R9W2V7MfR3LD0pkpSC4/GZjXT//mZ6HWfqw1gvskDO35/k5DoVAoFAp9sMRf9w70bw+D8qyw6NSRrZaHdksS0/5UZjZM+5NKMwBi2h8y8w0tzpauyX+81/4nYX2v/TfheH4w3oCmaX/EfhX0L9V+BP1PqbE9jyHYsBE86P94Sa8sD8TPjhyegTE/FVDz1u+F6INj3DjcZlmJMKmqC94gk3hPcDqCFldCIzECtEY3kKGGg6cjrNeK6EeMiq8JzRXjWqyILw9yAoDa3xiaD4A+8s7HCK8ccJdB/IpyJs7B9m3I3grAL5tuBZAKFRsg682Yllnxzh4AOZIBHgAUrg8Rzxy/yEEmtf2mAwI8AHY6ICYtQf8NvXBq8gCgHKH9+yEUCoVCodDnqRf9d/0QGUn/ibJB1/7HtD83XPh/SjQAgv4L0kgfqNjUIO/U/87dxZfcLcMm2qQPWxzqa6b9AYBX039LEqHcAcE19F+8FFZWXSYv/Bf6MubHo+LCpEIn9KfGU+7DeB2LBbWcEzrFsWm1ItcH+Up346G7jGNzvIkNvZi6qHWCaw/mpZYUMm58Oj/OGndLMi3pBBQjlNA/KgHQbw7Imf6eSeTyrCVAvjwWDncheTgwaSesZZIdJZP5AcqND2j7d3lK8M0eABvT2QOgGxbxsLA/O8SGnZ4MDL6DOBrSH8Rr/1PZuzEe2pOwZJF6CyzZQqFQKBQKfZLokyD007gv/afOQao4m5n++5MYGzII239GFdP+WJLwBkDQfzLzDS3Olv4H/wLUkCDT3r/Kl4Fl0ok8PxhX7bjn/UI9/ec31CfRf34dhcL+6P94Sa8pZtnZctuF/+LyrdBfGADeAuoC+XI9Urq+iU0ItaBlXKJaIKsmtuS0d/0sAVL7rT4e7lWd3oDWYdCSvsgwo9wuPV5TJ+D81sDHXL84JwCYncTiENBmAFwfkKJVagOQfJ8rJ18mTY60nlsBIEfJ1Duil8AJsiHbNHmkZAPIbP14+V4PAJRbAR5/MnCp87m+cs6N/rPH16yLBY4Pt1HG4CTsWKRWzdV1KBQKhUKhV4s4hVmJ+mH0P1lcuRhvj0Txzdf+z0z/K34mPj7tTyrKAIhH/soyoM+FKbfLfe1/xVyqdnmn/vfQYSU1v/XeNO0PAHw8/RcL+6D/okRYU2V5yTYsRuHqS74Ju9Gkwmbof7ys5/7nQvl3oauMEqiQI+Ykjp6ujVqLff2dMm4Z5cjMb4W+W77uyCxjeUvONGbZn0QKqhNg2YcFpU5A8nJNA9DY9JKs8IDWQLP4BbrOCJSkhY4PBy56KUqIQo8N8DUeAN1W6LeoAqlhjycD1+Dx4tp/O68Hc2dVHsCRHq14eAChUCgUCn2DRPrvQP/2MChPGItOHdmomJrfPHW/k2Lan+7035gBGQAPPfJXTfv4I3/9beqZwdhr/5PI56/9h5rfSTygTzqqY0wq/ZeqJHxm2hsEmkwEjKX/wqj0nHgkUrAf/R8v6dUkeV/6ZTzmwn+PX1K1ynwJuzrCpljllzT3r3DjJRTlyDKO0dvyrtwOPYFMh3Go5PtcFVlu2ThiX62Iv6JhRydAxn45j1ySkvKXQpEEpyUdgp2Jr1dVwuKXYz3K5vIy+ZJ0FxofDgz5tiVJNC4892rxKcEroPfO9vL1HgAwe+y+qwC9vwr7ec8nA+cD3vYdau3+/q9/JuKT3qjer61qZ/FGwwB9jvPd3pktFAqFQqHQS9WL/leh/+QVOtvoS/9HXPv/xgv/pQounu/u5ml/UuUGQEz7I8uAQham3K7h1/67RtUrOVNe8yFnm7AHQctIrvY1mEn0SEiqpbLdp+m/wta5hHgYUu/U3mXYMuwIyeX0m1i98N+4vqiJkvbovVRbibQFuAW5XOb+RYZT4kFip0yyCagFgCGJ1DAbjRjT+I2fEU1HO5+KQ4EvvrlKwPRr8Z8gnv0Rv/eAX5C59SL+rU7AWW6BjklMagYA3np4ByZL9oUEiK95fK8ZgVCT7TNuejhwnjCbXL7okSxhCyUb4Gs9AJAPrUXXRRVIDZtuBXAweZr+p4kA58o+s6uvP3Nw/vFNPrfop7m961AoFAqFQq+QBf3TYZZUpkgafBmz9aL/dT9z30j/K9Z0qml/UiUGQNB/LvkNLao19Np/V2Y6p/grsOJDTjdJeqnlREt926D/zBikyCr0f5RY0X+2fOOF/1kAWtOat0Z7f3HX3AL5cj0Sny+PhYVrWPTehu8tJgHIMIvqkfvonatLtkrGxAcoeMuT0CvXYbPqmMYemc1dEx8KVbWH7vqGm5ZkD7c7AeeeVOcEFOX5y5Relr8milaQ7JDpninOzr9j5WJtMK/HK7hKTQ5avRAbR8yfrRn+fJGfIPJjSD4l+Is9ALp50QpqnwwM4rkPd5wUj5/FfQAn/adB/9kKV10jX9LjvfFoZAxOwpJFtNFcXYdCoVAoFJpZGthZ2DBLKlMwjf7bOiWKFThWpaem/THnfx/9rxjbYQAE/ZdlACILU+6S+/J/V7R3VK6p/7mRtxw4vB/UWhJUT/8rpv1Rae/r6D/3KaD7bUL/9PDI5ZSctVz4Ly5Lg1nFPdNcIrFUvC7qQvl3IauIS/7V/aHNA7AE6D6B7Whzfd7FVKsQQEJJWeTYLM1dh1BDsP6w3MYxVEjOX3lwpgoX9N4Jqyw4AevCH221fj3BuhlwLhN+wOAZgci0xlsBoNz+yt0AZCEXRvH0r/AAgCi/3gr2aFY1HRAAqLcCsNI/D3//1780pbtGflXWfgqNYccitdFcXYdCoVAoFJpQIv13oH97GIqk6X9DpzxWFk9capg415f/DOkDpv3xZe5H/wHgRzzyV0p+Q4u0ccXkP/YPzPkbxdjEs9G81/47hmHspZYf6QyHrfJf+E9mQyC1lf5XdNpC/68Uaqd3oX/Iv4zxhf/2teObaI4CtWeaV5aF/txL3Msqv/Rzf3UfkFGRUXVJqsnK2ZA7IRID0gyrHKYOoOjYtUbGR4xw3QnlclUv1R693VXnhjWgf9wUTg6b/T3grv0rrXh/zS9TnlkSTbxq+8IGsHMueURmKwVZVRZflOOwfAA7sE7th7QhuXzkWdIDZ9EpORJINlc2vITUHx19vgfAlxMZhN6LKpAaSh6Ac5CbOPQvf2qJ2mvkV6WcBOe0RNIeAJTrGB5AKBQKhUIv1bTo35iQiSGKVfRfpzfS/xqTg+nu8Wl/UqGHAOPUX/nI30sGYrIw5S4Nn/rfpS5T//ObwvbwYTXCQP/FJMoBTmo7Mf23gNpMbfR/zXune2xF//TYyOX0y3jMhf/0pr7ya+ifWU039CeX8Wqm5V7uL3+uufdLOHiI3Mcasw5AKZghkgH8wOjPjpxTHUx1gD247gBYVDV+F3UZg70jcucpuOC5j+V/CwCeB1BOgLozu/bkZJAb1VyLNWL9gHtnBLqsBc+tAJCVXPXkZ5P8PJbDCw8g0/VWcK1gzJOB6Vb01EN/+JtfklcuXL83KKOvkV+V9o+dcQTFR3NfRBvNvT6hUCgUCoUelYj+IT3JqEllCm5C/0xYE453rgiPsJ2nRDHtjzsDJcUAGHHhv5p2hml//C2b3oix1/5DjvlUObcbGvwQZ2KhDrUA9YSolv5XoX8yIQK7r6f/fHJpSNo4reg/W9Yu/DeuJmoiOgoLUSj23gr9cX7y5Yl8zpfHwkJEit2RnbpEkjscowbU9Qta7/LwSBbp6toyBmOGxuCKo5+3HNrex0GcjNwTir6W5LNAOgFr9pG6knidgKJ8QcMTdp71mDZnvUqIhSvPXTMCHQsHcWZsADJJXpIBUz4sK7F7AMWKfJgHAHQVkUQYgC3nVkvfCiC0Qh5ATv9pqQxd8wDg/Ea0H2CMwUnYsUitvqvrUCgUCoVCj4g+5VnL+gYKr0ayyKs/+kdddNFTF/7buvDZCVIivq/Z6D/IBsBXT/oPJtixMOUuDb/2f+RPDXrwYo+dLv+vz6Af4NjaGem/kNPepDf9H4b+i5crLrzxwv8sYGFr84We0B/3Uv5dyCrlkv+Knc1YlcY0egCWLixVAj7jarnkfV0B+zHQdbSse+OqD8i4Yd06DhI3vOIjRnkAO889lomvZcvsQAILVDHhEbDItwJA8mmqmBGIWwbmJZWWfjiwkATKDOcrIYwY57bKnAcgrCD/8jUeAF+lewBQ+WTgloP23//1Lwv5OdKZv6FBtpMsybejNW+VB3CkR1smPIBQKBQKhWYWcT6ylpUj0X/yCp0xWBIyMcxplvmkxLMuPF73nwN9wLQ/juQDpv1JxRoAX0v//S2b3oi5rv0H59T//mv/6+g/ffk/l0rsQjnGSVXi2tmn/YSYA0wAACAASURBVMGFbfTfxO7pkvzbS85AvaRZNt5Qlo0AzpWilxsu/BeXifFc+ReqkFiQkjQOteiubqofoXe1vEJqqgqcVDE8zBPJhJaRkL23uwI3RN7JoibnXnh4S/IBMToB5a57fB7lOfFlFXA/f7kAwKAZgbhlPPiVaWJ/ODB+eZaA9pRgYave6QEIo0pK+nsAgJKIVdf7wB76xOmAhIZ0NqbJsQFdj/wFG0AnYq7tdlXaWbzRMMjDjvToXXbbGqFQKBQKhcZLRP+QnknUpDIF34T+wQMJnevSjf7HtD/uDJpoA+A7H/l7yQC/FqZ8qIZf+99E//UeK+w+t+QByAFsVb8L/3HhZ9N/yxYAwxqVveDCThf+C+8OnRN9QzMLC1lVMUJyeU0Gs5blJu5vfKdu1m0DUDsqAuxHSi7zIGPAGxxSVXzceA9gZ7vH8lrUAiQn9PYHN+cqaGWa/A0zAkkPB+byQFYoPSV4ZZYBmjwAqgvWAyAz3OABkEm0KjpP2gqqbgXwqED/+65BZC6BudEDgCLsekOvSrsHYA9OwhIPAMqN5uo6FAqFQqHQONHnNWtZPy36Z8Ja0b+9d+iK/oVsXB8x7Y9FpQHwzY/89bdsfS+8l/9XYKBB1/4j9dst8fEuK1nIGK5t1kzeFGxt0H/iZQ39FzcInZDoglwecuE/s47nwkIVEgvZwIRIz9iyhZ1gJC+PhQXyfrm/ZC8hQe0bisuwaAGhZ3V+cLo4AXsqivOmyxz3x4Uw8YxA8sOBuTyQba10eKs6qi4eAFP7MR4AtNwKUOBseg6fJF7oyC8/i09GsmSVhFUgJrQEJ2HJIt5onq5DoVAoFAqNEHF6spaVDRTeEtlE/x3on+rCk5aLlGJnpv8VZ6avm/YnVWYAfO0jfy9x+01SvjDlXg2f+t+l1gf/6puix+Q/vrZXErFWrOI3ixf94/Lvof/kBjkKreg/fZl+H8sX6RvXDo1Wygm2h/1ynsSaF1Yvn9QCpdUv+ee2T+hxxTvyFp2fpgonAJIFOBnrtsx/teDkQL9cAGDCGYGSnLDPCLTSeQClokqup86uzDDKIX2HBwDMbwW+ik7FDQOtRbX+/m9+Jsv73gdAh10jv3Ias9V2fSxSb4Sr61AoFAqFQr0kon8oThfcqUyR3dE/W9x7zp9FDeuI/oEZ1ZzT/jiS33Lh/6nLAPhm+u9v3Pp2uOm/dwXXgdf+54M3te00+Y/z+Qd7G/F3FVvV9cJ/XP7N9D/5NazGiAnvuvCfXFNcmy8suEp+aVwuBpD8dUz1E6QhFOql4nNaYOLkb/nEYJo4J8dSdaagghrmBsN0MwLlCwsktwLIbfmSXh7Anl5oyNTO6AGQebQq3QMA/laANI98EwBc7yNH/70qPQF7WLZHnR8DU7asjSOMfSvt2UKhUCgUCnXRI+gfylM53K8jIXNOR5V6TjImpP9cXzHtj1e7AfC1j/y9ZOC2C1Pu1fBr/0f+hhh17T+Vh372r60tqOhfqg36T79sov/kR0kdNp2h4cJ/cZnYMpi8yz3Kc/6QL9Xhca7DNmacSv4bCoW6q/jkckx2TZwAAEhnX0GIPKORuZeQdScUwkwzAqGFZd8Cmg0ATEcA0MkDuMYlNGRq5/UAgDlvYqqOt0M2DxCmJnvX9A9/87OK2u33AUANiz+UfdxWVzZ6KEpYsog2nct+CIVCoVAoVC2R/jvQvz0MRTbRfwf6p7rwpCWiRqB/uJH+V+DjV0/7k+oHPEH/53nkr79x69sx17X/0PLg3657Jj7wyTxalD4yIVvfaX9w1Qj6bxnPHPS/Ev2nL9cF8Fpw/XJVwptC52QQPFpYcNVKxQtVxh7tU/wHTgiFbtP5oSuQPQ478HFK24mbA3bCTf04KHoB+uV2xPTMCIRYfILsO8wIROfkbQDcUXgAFg+ATKVVSdm2VsA/GXjLoN0E8A//9mep2qqS0ttZfBlzre+Vw+4B2IOTsPMDn7yCoi4UCoVCoVB/fSL6p4tHoH9zpE/eaX/gQ+n/UPS/6cec9P+GR/5e4nYdTF3leIOmu/a/cQMauqub+h+ncTcXcrJVvS/8x1Uq/RczsPRfRucAc9F/7/jTr+QBF/4zq3YuLFQhsZCtHYL1etXOHJSOFjXzijoKhUL36/wYYlJP0vMNJR8LzC8C8VNdYMi8L8+MQOdQiEHui0W5upzlF3JqNkB4AFTAts3S7xCpu7SKaiJl4/IUv2t5D6Cg/+puzd8HACR4t7B4otNsUyzp97Hxi9RuPyRhYQOEQqFQKHST6FMJCsU0UHg1uAn9M2HMSZLnHMJI/01bxn/u8hnT/jiSP0f/oXgIMDGID530H2q2b3OPb772H7LxWxtWT/2fNfTshHooO6TB0/6QSfBXDo+wp6P/xdpotH0B/+DRblCuAl6QX6KBSXYCWB/2C8XaYShPFmZ/pb5K6K9ng1AoNIvOTyX2ACBZzhcY/LdcR5wiYRFCFsIcMwKVfgPKKdgAeHMd5V/uAewDwK0AbUNcy/ya5G8sSPYNj6qv/d+MMao/4oNi8QDosGt9r7TGbOxo9LCjB+ptChsgFAqFQqFGGTCOA/3bw1AkTf/7o3/UhTMtETWOTce0P74MzZIMgA+m/7u4vScpX5jy6eQdW9ODf03ddZr6391cGhv7jvNbo8uF/2Qez8i70X9Xcw6Rb8VrGSksE99Djpd3XfifBaBvaGaBRf/Fy7QwK1+IQgH6k2mLLkKh0IQ6P6csc6eQbpGkfUag7ZCD+DuxADBkRiBu3Y+c28vy2QCf5wEAKunlAQBqSGbTqrbNb/opgEeCGgr034S5V1jYk7Xyg1IF4pMX13nTas/W0HuySL19LhMiFAqFQqHQJgMAeRL9GxMyMUTxCPRvjgRwcryY9sfXvJNYA+CD6b+/fYc3ZfTl/2+99l8Nk3ebvLkUynY0ftofMg+COgLc70n/OSDOvBxC/w39Fh2VWwAv2EZyLhOb9Mq5UIXEQpaEpPPFy+LvBhayl/kTfYUF/DcUCr1F6ceZQf+nmGufDYyxoIa5GTDFjEBizE6fYSnvQiBHe5S/yQOgxt/FAwDo9mRgoFD+0SRfQTySpGGnef+FyYWIT4SRm4s2wFVZYQM4e5dsAG/voVAoFAp9s+zonw22JNSDm9A/E8acCXnOEoz032d4+AbgpuHaCrrthIqO3k7/gTMAPvWRv5e4NzUpX5jyCt0w+c84VVz7bxWVqmnyH/fYxk/7Q+Ypw76V/ktjWNgx4AUhM4qREgJ0uPBfJfVr0tF6FS5cpNpRKBR6r9JPN/+Nx+C/5ToerSXiz0LIQnh6RiCyo7x8AVjXb/QAAKi1uEokD2AfA4LIQrxeRccrDwTe9Md/+8txN4cUbGTc2lMBshx2bj7CBqjqPWyAUCgUCoUqZaM3PvRvDwPiSxv3PgD9oy6caYmo+9E/8GOb88J/a/4Jpv1JRRgAH/zIX3/7Dm/K8Gv/nfldm7Hi2n9w2o9sQ3XPSYKVUB6Oc/Fu9M9VCal2fRP95zodgf6pZWJ7XjmpL2lqIUui4n5ceKL//SXAtueXYYbBhEKhT5L20V5wSMcZgQoojxcgAb4Uxy+hM7cMDO4/VyIn+9/pAeRJKj0AAP5WAMEDgLJWYu7Mpjsb/sO/+yUZ0iJ7AHbxTwUA/EFxgfgy7Nogz9kACxcWCoVCoVAIwIn+q4C+K/J4RZ2hV3V6H/o3R7rRP1TRf0MXD9B/a/JpLvw/lRkAHzztzyUDjlyY8gpNd+1/y5a09dVt8h9Xc1e2Z+m/wNPzgJvoP5V8FP0nEfa1jNA/2URYFz5GshPgiYf9Hn+vC//xArdGoVDoU5V+5MnTf5p7GpBggTZzM2CDyRnaxAt7q+UYB0L8lhmBMPfH64t6N3kAebbwAK7xk1XFFsO1dWeLecOU/h/j2b5F2X3VQbfX/UcqFUykMWamw67NdYcNkJ8GruSbFTZAKBQKhULAnbAQpwB8sD2tHtkd/bPFnzHnD4hji2l/uusyAD6b/vtT9Oj0zdf+J/kdrVrof9PkP86+hGDDV4it6i3038LKt2KN+KfLTvrPX/XPNTSMYVsW0T90mPOneJkWFugfFWYX/nMLoVDo26R99hn2t1xHqzX/W4SQhXDLjECY+wNVtZYLugeAll/vAcC+MYm1uEpyDwCIU6LdA6CqXKCfvQ+AmQgI0/9kSMqtAMUeKulmG2Ap60fYAHnYsTGoNzFsgFAoFAp9rR5H/3lwE/pnwj4c/YMwPL2Lbnj946f9SbUbAJ9N/3fxoPbUwpRX6O3X/mfjt/V1H/1P3zLvduCSd73wH8jPtsDT84AvpP9Mv3JDfZnYklfChSokFrIkRQD5svi7IYLspXjhf5E5FAp9p7SDAAFJJ5kR6EL2eTm5nDTJltHC13kAR4nDAyBjzg1JVZFYWSonhbabQP+PIW1nCuxe7kPbt9kA2WbJbAD7l7a/92SRel/CBgiFQqHQ98gGbWrQvyuY+iqmz8GrOuXptvn73oj+zZHe3pWsUrVlGm1vTi4Rs0bd6f/j6H/Tjwr0DyLdnu2Rv/4UPTr9vmv/u8lD/w3ZTFGSi+CtMt1DEPT/XObpP9nKHEPkzBqiL2lmYcFVFuh//V325YTvL5C9pBdCoVAoBfSbCl5/ROVhy3X8Wpm/wL+E/FYAQDHZwsa517IWrhNn68OBH/QAIH35ER4AoLB969FVdonP4N2l0n9HdwBg/1ZcYVF+dg2yAVb3UMfYAHH6EAqFQqEPlgv9e092pkH/bLH9ylfzulgv/GcJVW1amf7XNXW/43xHHzbtTyriIcCyXvTI30vcW5uUL0z5J2j8tf9gPx5RYX0eGmzpi9o/2SRCcr5J0H8P/c+3mBzpWSY245V8oQr5ga1UgFq4HkAge8k/7HdFOUOhUAiSY0KO/i8V06ksBxFe1+RlxvfzyDztwRivewlUDwAARCi/c2cSuAtQ/k4PgFudvPxNHgAZdm5LqooWBZqZyH3V/vjvfllW6zyO6n0AR5gHrK/7cJhMgDmBJbloA1yVFTaAs3fJBvD2HgqFQqHQK2RgLFeUC341+ARN6J8Ja0X/5t5HzfnTeOG/EsBtH7lLsgmzRh857U8qnwHwrml//Fk69Tvb5f81yZ1DMh4RqLD7Jv9xSUhOVglHK4Gn5wHfR/8Xol+5iRYj2gmTPey3eBk/2UOhECfy+JCww2X7HshQfu10QIkHAJBPB5TyxbQtgG86oCKbwNO5yLN7rnm+vK+L3F1W9VIPALJ3HAHiay3ITW0WDdnX5Y///mcpoEFusC4NoKTu9uQjbICq3nMbYCHC7AMIhUKhUGhamQCLHOzKbI2n6X9/9I+6cKaloxzjdPTedtqnd/Q++j8V+v/duoDLAHgX/d/F7UZJ+cKU12k6+l+9Pe0fdWOkGtaX/vOUXE8iJCerrM8P+HT6z3VEtq2j//yysvrCnD95YfZGFMHkSwLox4z/oVCotzCvP7Xsx67yQLIcuPlsS/4FVJh0QT8ZGFBb2PqCEkoeTSR0TsJonlAf/FrzAFA2Hd9nVW/0ALJ+2FTHL7pV3W5nLeg/Yk76f/ViuxUg32/kSENQPgDyzIvM5ALxZdi1iZ6wAZg3yLu5QqFQKBSaRFa6osa7kpviafRvTMuf21JF5q9w8xo9NucPGN5TPglb434r+TX6YPr/u2SEVgPgXfTfn6VTvy+n/8tv4N0UjZfhX807XicGEiWvaauV06kxieFZvJX+E73MRP8ZpE4V2uh/MX6+XMoGINH/fGHBVeRLXLgmHeWF2bQ/K9kKQqFQSBc+VuQkckPia1m+XAc4DPrTkIL+H/jQMR3Q1jczP88eQqJzvCDWSh4AoOb4pYDvs6oXegAAxumA2pXyfUz/zxiwnYItSbgh0vzNedvzgc/Xd9kA+SlYMpESDSriXCMUCoVCL5AL/behfG+TJvTPhDHs2POdbev9sTl/FOkddcPrXzjtz+/QCE0GwIse+XvJgHEXprxOH0H/AWDMTwTyh5ero/SNa3+zvBnIeOuF/9CN/pfgux/9zzQH/S/E5xTp/73T/kCO9eN5v6FQqLtSRn8qYffMIwGAOOKQlkBRCLsHAMBMB5Qyy33ZMB2QcIZCgnW0wOYRuTxNz4uwrOptHgAc7/i+xKfKCb5uEqTvZp6Bo/90R3LkdW6lfEFObQMsZT3yZPxplbDkFfVO2dOGQqFQKPSI6DMFzFWEYFdmR6tkceVivAPgubb5q9p8buUZp6N3x3YlQjkwq7UT4/lEzHp96oX/GP1v0g2ARvp/8yN//Vk69fsJ9N+9Kd47+Y+jLV9o+4qCd9B/kpgLOYXx86QeIH8vBCJvzikOwNbXipLU0f+8MCb9D4VCo0Si/6KMcAjapgNacuaeVgHG9BQ3t5H9chn4JmlHXHO0TKNYAX+/1AMAKG8FYLhwo/7x3/9SuE6knLcCvNwGyDb1+ZHwDLWXDQDlO57uj6FQKBQKzSADV1mIperMvlbHK+p8u3YADHTujP4BHp3zp0x+ytQL24P3Pf22aX849L9JMgDeNe3PJe4NTiGyJd6sj6D/AODbFI30v27yn3b6X33bQVEY9B/I8SsoP/GfyUi567xQWXc87Q+ZKib9D4VCb1QK6DflvP4CgVnY8YLzAHBV3lf2SABAMdnCRrtXXFsieNyWK8yb5CujsXjcsIgRmr/RA9jLFYzsuwkAxfzxP/yy5zF4ADDSBnB8qW4PzJB+uBHIQc1vsAFWe7a63o/I/NWaRzgzh0KhUCg0SOzpAPE9LMa7kjta3YT+wQmpbKs2xZw/ROiqBfDFFe+p68J/UxdzT/sj038QDIDX0X9/oj5dfwT9d2+KW6f+t/fV+DvG0twx7Q98L/3n80vvNwP6yUJi3bMA9G3NLCy4SoD+6cs16QjTfxL3B/0PhUIddR5JOPzJTgfEeABqIQAYpwO6CCS6Qv+E107cT9YeeSgPADfHLwXkXVYlW7nRA4AC34/2ALQSe20ec9L/TcezfG02QPLlKUXuHeqE3w3WJSuCtgEsyUUb4KqssAGMwXnm5NWaR6BXcWISCoVCodvkQv9eVlWDibmCKvTPhN2H/s2RA9E/MQZTRz3x+ldN+6Oi/020AfA6+r+L26WScgZ9VspN5yfT2Gv/nWnVDDWuQ7Kvts/7z2YgypmftgI9N5Y8S/+vaDGM3FAytWeakMlF+h+T/odCoW9SelQpkP25WODD6kcCJC8zgp8uFMMAqPcAbLWsByBCeRqdF2FlFe0BEFKx+7kF9pf3egC57BP0pzn/+B9/obPZbgUwOQ1XToBrH1IjO9oABIewJB9hA1QEH/H5qzWPqMofCoVCoVCd6K/c8uvnKfSfvBIYiHsMPDU2f+8OQf+OAbTN+UN1ZN9QUgUXz6/X59F/I/rfRBgAr3vkrz/RY+/RbJf/j90UzKfuqcl/3M2NAyDpv4izX0z/0ySWJuR7LdN/+Y3A8/VX9BKT/odCoU8SBvSnlv2It0JeuxzQuSD+xV/gX0I+HVBG/DGCL1nqVWon6UaHQG1+LJs8AC5bsRa41kLwMx+ikwcAhjM7lMc7ERBH//ds+09a7TtPmpGfTAsDbYDeDwYAcqe/1wZA8cmrNY9Ar+KEJRQKhUJ9ZUD/C7FUndnXahD6Z4u/ds4fezulQsjFcUjBiZE167Q/LvS/qTQA3vXI30sGOMugz3p9xOQ/7k1x69T/50+WCvrP9WtsXr+ar6P/Zv5uCaNjEi/a/kYI4J5sEpP+h0KhrxU+wuT0cbt4fS3LT5aP6H8RUhgMB0i87iUQ0LwaUEH288z5aijcn2pI5KR7tz8MwDZySLd3Fw+A7gtlliWOXKb/p+y3AnhtgHc/HxjSzXurDXA0yV+teURtF6FQKBQKkWJPKD4I/TNh34X+wUP/G7aq1uQu+v8s+l9sfB4rMwDuoP9d0b8/V7fe30//azZF49T/l26Y+r9l8p9cdHMS/bODSSNmo//8e0F1YT2sp4BJAfdSd+ZaRP+ZhQVXCdA/fbkmHWH6T+L+oP+hUOhOkYeahA0T8L96OqDEAwDgHwlwveQnAipWgbQQtNoF+IcBcDhbAv1C82TIqgcg9Ji87OwBMEhXTmKcCOgf/8Mv9imD7E8FcNkA5663/zcF23SbDZC9R5kN4MX6rvOLvEnyas0j0Ks4iwmFQqGQVy7074VTNWiYK+gPqXlk7IDv1ijHOB1f5/3n/GGCu+H1L5n2pxr9b9oNgLdO+g/8jpWUs+izVu+n/wDg3hTtU//XgfjhU/9bcLwewP9sfRH9l9OSq6A1gV5T/+PeO9J/oTD7e9D/hO8vkL2kF0KhUOgeYV5/atkPWeiRAFAzHVBuCRz8PQkrhgQgeQAkcCcT8rWSB4AHk20VuopulXZBtiJHyw2ACBhzH4AhrToR0D8eT/11PTbAZwMcX7OGtHsLMLSosAFczwe2JDfYAKt7qFWMPm+Sv1rziLxJnNGEQqFQSJWN+0P6/dcnv7VJ8kogHvUjYViz50vUSP99Q3V4D45t7EL/dHxVTNmEI5DVBsN80/40ov9NP+Cd9N+fq1vv76f/NZuiJ/2/d/Ifd/MCOpvyT03/+eRm+p/+RrTQ/2uZ+n4l+b68nblZ+wGM9J9u7qX/eWFM+h8KhWYUPvLkYPhieVn58YLzAEB5uT8SAFsFkC4gD+DMJPD3Il73AGzNj2XaAzD6AUXvajCTGb1Fld8fJj/DqDzDSf/3jpyPDnY8HBiO+1JMabdGpi3m2qza84EBn1F5fItEF3PPPpplWEVmX5PklWgDeHsJhUKh0JfIhv4XYqkluaNVN/TPBDMnDR+K/sFJ//nTCrHIMoy76P+r0f+mH6975O8lDblC8Q71OF19P/0HgJFn7jqvH0//h07+Q/fItB9N/20jYdsa+bsljKP/5DN7jc0xvica+uk/ifuLlwTQj0n/Q6HQq5Qy+lMJu89w7A7r8+mA7PR/SVowcJzl0Tayz2ag8x+jFLl/uqyz+3K96Fn19zzcRiCF/QOLZ2DzFfIA500AiQr6fwaDmdSD3QOA44t7kucDm20Ae/LRNoCrFWUDAEDyXjE/2eM0JxQKhUIwmPtXxFOtHkL/THfmtHSUcbSu3l2mAj2GNvRfJ++0P6a+Z6L/W6e96D/ghwBfPc36yF9/rn671+vpf+WmaJ/6/6ClXT817fRf5O+ta30D/Te81NE5UUUsWw/xJP0nA+TmZBjXVmT6ixbAFqY7Lab/hEkQ9D8UCs0kBv1nhJ9wCChOi3H/igrJKkgW9lE1PAxAtRMuE0LzAFBfOrsXPICkis5D9YhfJh6AYSIgRhecJUyCmomASPp/BiyekzvHdEBH8llsAHYY5Z7rsgHKsE42QEUr5BwkCdY8gm0SCoVCoS+SjftfgU9w/6SA/xZvSM4WO+G79RTPPlqn9+DYDIPQf8Xb/dnT/nRH/5toA2DOaX8ucXtYSm8t8R6Npv83yb8p7p76//zl0fau9Z/6v2o71NN/fJCRcT8VzH4Kppr6X67FvV8L/FpAsgWMuJ/+e9D/pJB+5G+xEAqFQjPoZPFYy3WgXiEJSz0AEvGLHkA2eQtrCdQ+DACvGrUgeQC4OX4poPayKtm4BG0Xc7Z7ABjLmk0CWakHINH/Mz4Zjin/YBvg3c8HhvSd7WMDuBrmHSUJVijL6CahUCgU+nDZ0P9CLDXmd7RKXgl8oyazXhNz/jDBPQHpB0/7Mwj9byIMgGnpvz9dtwG4r82/oYuXTP2fBBgGYKf/NHQ2r6OW37Pimk9YQ/+J317uDGytyM1RFbsWuPxapr5xZfrPJNfpPw/0u9P/mPQ/FAq9Tym2W/OFo5yamWW5jqQF6D/rgfcAOHbf7gHYass8eAB4bBl858MMVcUG5rqTMqMRebVvD6JTx70Ff/qPv5o62/YUz3RAsO93YF1Bjw1w7AvvtwGWsr4atftNmmsUZYI1j2CbhEKhUOij9Abunxfcj/6ZTp3JyyjjmF29u0wFegyd0L97P5H6fTf9H4r+N5UGwLT0f5eBQi5M+Z2acfIf/6boQv8rJv95Zur/dBda2Sp7njb6n/3m08dADdj0DS2sqTGMKHxi6n/08vr+I3F/8ZIA+jHpfygU+iCRB6gELy+QTAe00/z8kQC4FXeMJj0AguDTdJtl9+m6CGQ/qz264Kg9Wray+6uq7WEAVGbah+BU0YVtIqB//E+/AjD2EKMqyuy0ARZr9CfYANkHrbQBLDnJLlwN81EhGwDoHbhibKFQKBSaUzbuD8XXVYf8voYK9/d2NBT9mwczxYX/49C/Xo3j2TeXzaR0Mce0P2df4+j/lvcyAGZ+5K8/Xc8BfO3U/+3y0X/jAUsL6z/5j5SqedtW0H8DVWdtsL5T/2NqD1NM/U98/3G4HxfGpP+hUOgjdYJ4QOx92Y+c0iMBUohfJCz+nk1lNo2RPYnmjbVoTY8BaB4A2VAYLVHleRiAzdtIPIAc1lssgUQOFJtn3uj/kWT7UtXSHLvWWBtg+1KusQH0cFNQMpKFPau6wwaw5zT1Yog/muSv1jyCbhIKhUKh98mG/hdiqTG/o1Vn7i/G86T4e9C/2JeL/vdC/8CvlN7FBBf+34b+N/2wd/bII38vce93Us5CzwZ9Av2v2hQ9J//xJKmc+v+E5hX0P1eWwTuY5t6Jo41K/9GArfRfW9NFDmNQPuFbGLF+nrDs/Vrg16IYwFnr+HtAhaRQmfQfjyEUCoXmFD5Y5cjzwoJZ+fGi8A/Uv6C+bHggsKFW8gBwc/xSoO1lVTJk1QOwDSDJqHFp1WMgSugbFzb96T/9irt03QoAXph+2QC2RocNYOzC7jG4yfiW1GMDeHyLRGtal9H1atRe0TAfWPJqzSPYJqFQKBSaWhJsmoj75wUCyqjPb8o0Av2bI33o32Uq0GN4CP1DFf3X9TT9vxn9b/ph7O+paX/8GXuO4RPof5XeO/lPVXPPTNMBcQAAIABJREFUAOr65XrnS6x2qzxg5ktaaWixQOgY6mtYpv9Mcp3+r1QA+bKB/sek/6FQ6AOVQvxTCdzPKOzO6xeA4z4AsNF/7oHAxcubHgaAPAAR9F/bRggrq2gPgJAK6Inm5uSUtt+H5TkLMxHQn45r/zG3Nd0KcO5dVeR39POBH7IBiLOxShsAsi1chFSjdvf6ZmPJX615BN0kFAqFQrNIP6coD9zZN1DPjkwN5+D+TO81ufJAB/p3jGEW9K9X4/gq9K/08vS0P4+g/00/Zqb/uwwIcmHKW/QJ9L9qUzxA/1dbv1pA49T/vu7wqnE7pD3/TFP/W4/7KSUSZu1XR5Is8KuQ038q4fVl7Pq7woUQDqwfk/6HQqGPFYn+i7LEEtgPkqczULD+Myfi2qaHAWAP4OzETtKNDoHa/Fg2eQBctkR7HhXxU80dWFa3EMhWpQfwp2Tmn3MMa1nivhUAJrMBhjwYYDtt6P1gADZyTaszul6N2isa5mNLXq15RFsvoVAoFOooK1RiuL8jQ2081Urh/hW9VKJ//7eXbWAx5w+KF9fxpRf+p70Mov9y0vIhwET7uPbfFD8f/a9S5Qw8pO6Z+n+SyX/UHvXhafTfYAawTljd1P/c+DG1L+g/hfWlrskwrm1RXjgHhK2Clkv6v+QvASAm/Q+FQp+uE8efyol/6QEAIvUCak9KCI5PNsRj44KNRP6oPVbi+C9yf6qhYWz7y34PAyCU01XZzyDb45sAcv3p/yzp/9kx9gBABvTpbpMsem2AnCWL8tgAx2AG2ABjng8sRWabOouq2OZ1DXOmn78KJyAUCoWeVi3xL1s/wf3zAv7LtSG/KZOLuZsy5lHGtRiH/ukxPIH+CRJVBjT09Rz9fxz9b9tNMQDi2n9b/GD6X6EbzqaFz2TFwbFuwI30P92RqmA9nUprTXUhJaSHhAbMfxby5NqaWum/mtOI9fOEZe/XAr8WcP2Oz2qLfmX6n5THpP+hUOgrlLK5NV84Xy1F2GkO5Dhe/gvMy2skDQ8DkB2Cc+ArVDwQWIkhqpIhqx6Akupoq4F7ezYi1bHlOfq/N6S+9/RbAag3Atxk2WkDHN/qtuSvtAGI4IyzZ1HVnL2iYTgBoVAoNIkaoH/Z9B7ujxq+mPsrSfNAB/p3DOatc/400n9Jz037Mwn638QaAA8+8tefsecYRtP/Gk14+b9K/++d/KemeXVOkf7ThWaaT281mf4r8Ys0Eq4VF0bHJD83Gayv9w4JxBfo/0oFkC8FXs/T/5j0PxQKfZ3Iw1oCR9cUT2KrQKX/3MMASkug9mEAxbowZoDkAeDmyWZYcVXpXhRVtAfABKMxKPKNn2hveRgA0zGgnaXiVgAulda12QbYTixrbADTRnCcBQyzAaTgbINnUd7NXvTlass4AZDtLOEEhEKhUG/ppxX0EbYV+vdrpXD/il4q0f9Y7g8uRu/yIW6c82cA+ud7V9dLqn7owv+p0D8ALCtjADx84T+Y+OPClLfohmvzh0/+8z+fpP9HwC303375v6aOk//UbP3bpv4XqgQHQkH52tT/pCVAIH5hFXL6Tw3s+lJU/5IL6a7IxeABhEKh0GfoZPGQM86DvK7H8gW4OY5flKQeAMfu2z0AW22ZBw+AWjZ5AFy2onc1mCnPqb1IoasMBvnyf1U6We5pA9haHDaAh6cPeT4wpC6aIVmFDUDEZx/hLKoFsjc7AXlBOAGhUCjUQ8pX/Uji39KWP/bTY76J+zO9N3RHBM6A/ulhWNE/3dpUJwSzvbeR5yfof5F8BP33ov9NhAHwIP33Jx3t2Wjdx9T/OE/fnbud/iv8uufkP3Qhj62TooU98BnMANYME6bNEb5WuTCiyQun/r8WlovsQ0z6HwqFvluFBwAZQ7yw63JQRPwwAArypvlNDwRm6DbL7ovxc4VZ7dGFyP3TZZ3dl9CfvqZ+z2Pm8rxyD8bbOL8J4E9/+4urYyC2xvZr9jJKaDE2gOvbdfTzgQfZAHvSMTaAFJ9t8yzK7WSg7lzNwwkIhUKhjvJDf6JF48lIdXPqegAA+GzuD1AxLY9jSC+f80cagL5qbMAT0/5Mi/43lQbA1177D346Px39v+HafxAPDf48jcZDO/03lV8BCv0nALpJ/Btn4dpsvJn+py6Chf4bwb29Fvd+LfBrAcdv+6K26HelqtYl7WtZ+fig/6FQ6EuUcnzIASGxvOyH4JJ955ZAHkBwfO4lye69tUjHADQPAG0Wmt0bPYBiCwgN+YSOJwEYVurM5qL/RilkGdkAFSR6tA0w5MEAug1QZqqzAYgm2Yc6i2ok7OEEhEKh0G1qh/69KF5dHhf3r+ilEv2P5/7OeLcb0Trnj9gX+64Zk1uC6QE07623X/g/OfrflBkA33zt/+vp/w2PIoAqRM7naZ/8p7J5Is/ER1VbmELt1niF7+9iDp0x9T+z8dc8bYH+MfeP35qhUOh7lDL0TQeWXM5j55qVlwvqX1BfNjwQWKg9FiQPADfHL3l3AVUlQxZaVWrZgSlvWijtV/jT3/66rMvq/+3LgOnsLbrHBjjeQoM8NsAxmGE2gPnBAJDvetYuuCYf5AScitO0UCj02ZK+zzXo3/fUowf3zwtkuFGZ35TJC9n1jFR4DRAfhv6BHD/fneEb2FYnBBvQv4a8Gd1L/2dD/8Bzzt0AePCRv5cM8HFhyhv1evpfe+0/+Ai4lsezoz829X+6OxkRuSEVVB2yATwbjcLZ/CHPlgf96lIypD/tP2nqf+wEQF4YCoVCX6KUzObLy0kK9/KcQVvoP/dA4OLlbA8DODbDqoYZq3C/IK7CVl/eBFB6Imxyqt8//e2vR9oaD4BRCXV1GwBtZCme7s9pAyzW6IE2gP58YCJZlUfC5Hq/E4Cbn4pzt1Ao9HYpgIB1ig1tOw7D1/zF3F9JSsW6gbhzVPOgf72aC26m/6xupP84Z3f63wv9b/oBRjw9DP378/beoG+n/w1vzTNT/1s61WJmm/yHLpRfJiqz29aO9cNi6n+mCQDsP7jPX5kk+i+WQ6FQ6KtUQLcET5cPBIbk+QAF6z9TFd9wxocBYA/g7EQg6WSPQOW/RswPGC3TxF0i+/TDABySV1YIEBue9H/T9lvFawOIPDrbVFJkan6YMnMjMdsA2xlUjQ2gh9s8mWskvA0A3GaoA/Sf4wQUNWIe7wBCoVDoQX0G9EcZFO5f0WMl+h/O/QGcl/xDDfqv6qKQ2CP79hmTW4J7oH86INC/ph/PT/oPJizLss42vZ3+A9RvjV5T//u0+rvOmi+m5ob82bTvhk6VbHqHhszCSGQin5WY6X/qIljovxHc22tx79eCuGXGTf1/LsfvxVAo9OVKySBvCZSknkTtyBggOD7N6KkAMliuRXmOAWgeANkQxwjNmYcBkNaIsgXAeRMAk7Cg/0nyjrcCAObX0lh72gC2FocNYMxv9xi8w969BfY8kgXpX+oEcLnMQCjO70Kh0DyaAfoPy6Og/5u4P9N7bV9suBuFO0flveQfWERuj9c2bMVIeqB/r+5J2Jf+j0D/m8qHABOKa/+v+MH036/HH/y7p7p38p/a5p4xyJ2SzSm8ro8K79YK30etCvovWwVklWGL5T/heXDPNadqdfpf4nv+JYn7izDj1P/x0zAUCoVSdgzZ8g4rM3tgOShmTpzlv8C8vMYw5mEA6cA5DwA3xy95TC9VqRxcHQPOt8pT8mX6b3/7qzCACg9AtCCg4OEKHGdsACfg3n5WW22A7ZzmcRtgOdbdcLYYTkAqxhIIPyAUCs0qJ/TPWnTBYYN56Iu5v5KUiq1ZHed5VsX7RTQxnKvJCUx1QrwB/RuTM8YGXdx3b58Q/YMT7WoGQFz7f8UP3hRw69T/DnWk/2uHi/fbp/53dWdpUvkFY7/8H8WwW9xJ/K3fDSn9//ip/3HXoVAo9IVC6P9cXs5D9VlOLoh/6YcBlJbAPQ8DQJBZBP1XtBDGUftiq3K4n8+GbgIQla/yfzvn/U/GUmhZF4DV9VvGALubbAAvTIfxNsCg5wNfZ0fhBDBNTimWAE7N7NLF5ywUCoUGyfQLmglvhz4jsJGL+1eMoRL9D+f+UAHlRQjONXG/aQwZdzVROnWN6Qo20P/BvtSQbO9C/5tEAyCu/b+zizkf/Kvqtqn/Z538xzQMw884NVJD86KjQLUlvoe0JhBT/4dCodD3KCWAGQ1EDwMQHggMqCT1AEhkn74c7AHohdQycgzEVUCim9dLvAlgQ///+VfPMJZl7ftIACLkHhuAgcF0j3Yb4BjMGBsgSR1OgNr2lM8SoD4vRVmcD4ZCoUYpKIE9eBvaNnbdM62C/m/i/kzvtX2x4TWr4zyfqnjvvgf9E8EUsuu4/38M+t/EGAA3XO3OjTgpX5jy+zXb1P/30X/5qOF8Ux6b+j/dqRrpP2pV92VTOfu/9KEw0/81ibbQ/2uZ+nY3Yn1yLYgwcbPE1P+hUCh0v1IUm6DAa7b15YCB+GEACOMWmU0PBGZIdekBkCPXao/Ux3+vByB3scejRwFztkday9sJ1E0AkqdA0v+zGTAt9zfT/+NY+yJ12gD5ALwwfQEArw2wWKOH2wBJ9nAC7ElOMZZAjR8Qp4ehUMiop6D/OH7HX8xw6G3cX0lKxVaujmdsD13yz6axVnPxBvTvTW4JHo3+oSv9vxP9b6IMgJH035+6/2Cmm/r/vfT/3sl/KpvXpa2e+h+XGH6xqZF6ToH4e8M4+o9n7VebU7U6/S/xPf+SxP1FWEz9HwqFQtVKOT7kFJNYXvajPAmv8d+jKftA4OIlyc1barMBaB4A3ixyjFilzOQjGAOuJgD/9H+x9P8aDP/jfVl90wGBlXRnfUpN0h3M10URb7YBNkeoxgbQw+tJdzgBDdnynJofEGZAKBRy6sOgv078NzFHw5vQ/3DuD1B9Mb5zbHPO9mOK4OIN9L8D+qcuh+miOdE/NNN/IAyAT7/2P+i/VTqvv4v+Gy//N8hx+b8xYV0z8jp3g7tgPPCxGZifPobeman/CYiv1LJjvWHq/y1JgftXZvChUCgU2pSi800H6lygw8MAMi7PvhzzQOBjQfIAcPNyMxiEbwI4PYBu/gExnI3+W3C5EFN9K4DWaRkibc+eNoCtxWEDGPMnHoNpUN7BpwMLJ6BO5GeaYPseMwC6jjAUCr1L0hcjcWhYiKW+nfbPaYX+YpLmTos6/2G34hSmZnXcA3vkAb9Mmb1abtIb/RvjR6N/6Ef/n0L/m3IDIK79L+M/h/73VedHIrfTf4urZOe8j1z+L41HfFlgABLB4365MGY1iWO6vD293gBZXjgH8tZGTQBg/318VMXU/6FQKFSjFL/my8tJ+/byBYB5GAD/l34gcPHyzocBFOtOBhTLwHyvC3xfls2EyGszm6G49t9iV1Axx9a/xQZQ4hkbwMmytxMKqw2wYQCPDQBgvtugCXN/mROAu2oXYv+I7Zen3JYkoVDoA2X99mOPtZ4k1b13yOkg/mKeivj+3F9JSsVWro5zbB9zyX/WxID+vV3waz2AFQtVH4H+NyUGQFz7X8Z/FP1/bOp/y+X/orrQfz34CrDS/8r16nv5v9gEVzno/7VMuQtGrE+uAhFGbZPkJXFYEPpN06YWgoD+4xdbKBQKWZRyc9iXywcCQ/J8gIL1F0mStKaHAWAP4OxEIeMiTD+NhGvEZu6PVoQdRsVNAKSvsCabnV9lcuYfowcAfNiSDNX+zTnaBjDkx/0NtAHgeouO9qZ4WyjWdzgBuOsu2cS0iO2nnWlmAPQbWygUukeVtGUM9G9sa85mRR+2bHVNRPQ/nPsD+K/Er+P+FR0BuS5uV6Y/+jdg2wHoHwj63/4x+RL0v+kHwHD0788+wM95Of1v1Ksn/6lvnsi6BRo/4Yhcc3IYXeacUiS3rMe/ZOp/HBZT/4dCoVBHpdSVhOBZAPVAYLJhUkJwfLIhUAFksFyLdAzA4wEUgwGqSjQnlIcBeLUusKz/9J//wnZ3jEgWsgqSdsdqWuwEZ9fvsAHsvZy7djgBaWkvJ6AYAO65V1pkBgCx12h+QJxvhkLzqOlb18A6J4H+DuA+hvi7h1HU+Y+bXu7vb1I9MPf2oxsYzqIsaazVchN2MDeh/3ZNi/5hDP0HgB83kWgDc3QgUaemo/9+zTP1v2vjPDn1f7prYehcm4rI6UuVbz0zzZc2unrLwrFsdY9J+k8GkBuWquWP4zn9pwZ2fcuqf7kFiKn/Q6FQqIcKG+BYvij2WZgupORd/gvMy2sAEzwMQCiXe6RuAlASkqbCijZ7op3+r0cEJQu71/n7osVUdu20AfItUGcDJM6GphMGu28IAPB0FE5AtbpbAhTHR2VpHwYGE+eeodA9qmcoDse2raM7oP+txF9r3p/7K0mp2BruDxVj63TJv9Y1aqJ3OwD9N3F/qcnKVg7wpQA60f/Z0P/WI3oIcOc+xrdQMw6m/zWa9sG/ajbXyFvo/9ZddQaFa3OtNJLuGozhJ5ee35yTRvC4Uy6M2WLEUV7m5l5vgCwvnAPcEc5ZZo6p/0OhUKi3UtiaonMgefoC0OlhAKUlMPZhAGUeUQSCN7eVkqgJmV7+XMz8w1sOFg9AaXS89V7mbovP+pKaUB5J1ZA8NgAYIbvQkbUvij6b9d1OAB4SHktjqrUso3YizQ+IU9FQqF3DQL+SeBB/bM5TiTW6jKoS/Q/n/lCB49/G/dk01mq5CTuYYegfitOE1l7UVh+M/jeNNQAATIjWwUOduuPa/Lmn/vep48ZvnPp/XZruHki0FICY79GULs3pFb7832ZgSF886rDTnyaW7sqf23mhEevL478W0AbJXxJHBqHfNG1qIQT6D4VCoY5iiP8CyU0A5AJm1pwHQCL7LGEPD4BIm9YeAJq0OrhUm34D+B3TC0Pks+coYPF9nebBif5Lss/fCmDxAHSSPtAGKEOkAfezAQDAOinQ0fUJtI3NjmH6nADI9z6f3uYEePvyiuL4rXmQGQDXMYTrmE4SCoVYPQL6O+KY9lQOvH4X8ddSadvWf+Dzcn9/k+qB1WzRHuhf73dO9C/F34v+Ya2xbVxdPIv+AQDWYQaAf9vdiLl5zTb1/zwP/gXnxnly6v/UWzJuAa5HqjmdE8FrTo6NaH/7GPKe1pf9KmvBTP4jNaFrdfpf4nv+Jfc3fclN/U8OOH5mhUKhkEskDWcLlx2lYogv0HPjA4EZGlx6APIqMGbAkcRCyJnr9wUPoEKyb4Eu/CfAN2c84EhFTIu7bAAlvocNAMnvJYcTcNLfqqmBjgThBEDxXpPh3dXFD6CSILZfpK5AOHH2GvoaVXKQOUB/37RMhoeJv5atP/fXeiRi7+H+UHXJP5DD83F/psxeLTcZxv2lJuxZwIC+9h6fRP8whv5j9L9p5B0A3GqkfNYSX6vppv6fmf6r2Vz0X90yqtlQPXgLnW9JVa1HLv8/kwj+BEHJc/pPsHtbnkmm/oeyUNr4oVAoFJJVUP5k+ZrA54Ls1NOAU5zNlYP5JQn05VohyaHEA4DsO4PsxaW6mwBIRwEA8LQ/Z0LsAUDlCRbaCl9hA8CxKi40byPsZF8QTgCDa+62BBC275KEMgjS7OaDiRoYJ7mhd6keeUj7ek96WKEuvZgswnuhvy1Vf9bpXIWpp/oBbnV86F/veU70L8VL58GVu7GK/qszG7uYB/1v6m8A+DffkINw0H+f5MPNnVP/v3HyHwGvF80NMUSAssX4MHW0TICJ/stjUDwGqrxwDuTVod/cpQwAhP7JbKFQKBTyKqXncPDLlGKfWB8MfD/P3PowAG6cRqsAqEhevW4CUB4GgLXCP/3fNP3fExKklbAfjHAcZeNtgIWM1/Nrw3jKBoAKNA/+qYFauvs0JyCLe9ISoLB9lyTIIOBSD/hpHafAoUc0BvRLie9h/X27o5JIOG/cSPzZRNAJNYceL/f3N6keWOU2Jpppvd+A/rN4ejyt3F9pEui/h2T0v2nMHQDcyiTlhp2sXkH/feq6/Z+c+j/dwRrpP9Ww4b4E89c29du6MWc2bH2ZYejEAJSw0ki/FsSR26f+LwKKBUDP/oUyIBQKhUI14hA5ydALDpxCfO7v2YzD5RYPQKX8wrBLXJdDc7ItKc4DAPbZvFJClE2m/5sI5N3zVgCm7NiSFcDdYBv4bQDItmo1K0/QvMMGgIRJhBPga4VLaUuAPIt1D8YihO27JBGNDGM3nt+O4RCERquSZbwE9Hfvtx36T0j8r4iqA4r3kHYP94cnL/ln01ir5SbsYEaif9bNr+zI1PCAUS2fmjei/009DQD/FhxyrP5y+t9dN0/+U9+8IrOH/lv7NfxmMtgS5sEIPod9LdLfTfLU/7IlkITp9H+lAsiX8t9rYaGHR6L/+GUTCoVCjSpsgGP5uoz9LEwXjOcURSQJ7kVJ/gHZxdkMh5HleR73xfuM7Hks9P9Ki7/30K0Adlg/2gawxWfrpDeh3scGJ8DN5cMJkGUF60Ud+yuehQodTwC7mwFJHvuB0jyCfg5BnER/lUaBCWk3+ljQr+V0QP9pif8VOpz7QwWOLxnFsI6y7rB8b67NaHFKY1MjuT8cV8NUNGzq9GH0r6C2KtnRPwAs/e8A4PpLyhemvIveTv/b9eDkP63033L5v3EkAhZvzCmLBvH5NhS2Ev4xzX6grO9LNgm+FgudJv/hv+py+o+TeN14fpDl5f/kcigUCoXqlNLzlM4DIvUrlE8DXhMzgPt7ZCqfBowHwNwEQIzNUpsoA8zCTQCy/DcBLL/Bykz3f2Zz0f89LekBQO1vdNYGQNkG2gAlatbR81nRwwmo4/LhBKhyUHtc8ZAlwHD81jyczD6B2SHoZw+oXYXu1FPE/JKyN0zE+u/pUWG7d0H/rp94FO0/BHi5v79J9cAqtzrdzP3+Kr0P4P5E1p7on/0qru/L1DChZ4O6mB/9b9F9DAD/ygw5wE5H//169eQ/TX3NPflPzZByOd5XL/6Wuby1O+bwQdJ/oVYO08oJd1D+C8n4OdyP+w2FQqFQFzHEf4HkJgAS0yPWLzkBLPpPYR/hAZQ02u4BYL4vE/915/n0mYX/YQCSfoN/+i9u+r+JwvOlt9GM6ZkEA20AyN856jWW6ARUAeuNLXiahhNglgOvz2EJFEes7rIcPM79S48CwyjDIXhCz+N7Qb538etAv9ZjUjYd9L+D+Fd19pncn2ql9z4n+pfiV6m+ZT+fH/23dG3q0Yb+N/W7A4DrFf0mUOJrNZr+1+jlU/93vvxfbt6J/uvBe4CP/s97+b/8aedQu9xQaEXW4pHTYZrHoA6siMGZj5Js663McigUCoValKJzIGwAupCEbdzpBvc0YHOGBZiJgM5CEfRnxPy3BX63cpE1QJ96Hu/eL38TQDX93zNvPeORQMV5ZJaWOhfobAMYmpSJ9Y7SHdXdHe7+PAkKJ4BI3+4EFHmScfGyWgLlbqNntsnhXnSVfEBaTVFJ4L0OQWi4huyI0hs7B3Z/tncrs+s18jmJv7/LWu4PFeN8dqofKZOpWm4yjPtLTVirvb4va8OcPnV+Z/fa2dE/HkCrAeBfnyGH4juuzZ976v/uj5K4efKfpubpSEz4uNNOuDLLSI7+ZPjO9S5X2SKlTWcclX3qfyozYRByf4WBrbntEeg/FAqFxqmg/MnyDu6zQv9NAJBX4Zcrkxw3IfPIq4MjCw8A6aabAMarAtRSqJ23AQ5u7SfsllGVw9dX56zo6gS4oPwZG05AhZosAdoP2OO64/u+7kK1zOD/GYcgpGjUrtPnTbr5rZ5nz3oc+g8i/tAJ+vs7rsHxdUOtu+S/jvtTDfXe50T/UjzxFVrfkaMtshwC/afqcQcA13fKFi3xN2q2qf8fePBvv3fh4an/McKuzsY0rB9ey+X/lpzyx17YGuwPMSpezsARfFnyQYMj/mR5ai2QRoXZpwmFQqFQjRgbIKPhJ9YHA9/Pk9M3AZjp+QLa04BRj2mwBKntawGMB8A7CuRNAI2X/1/JAQCvF3UfgA24y/FU2bEn1IFgc6vOTkCVXfGsE2Bt/bgTUNO1KIclgCtoS6CEGX3NgI5pu+gBh2AqDf1pPje+75moq+YZlTaST4D+vYh/Vffnt5+zzV3cH7jhubk/m8kXIcQz55iNXShNxqB/vWGgfxH9b6o3APxrNeqgPd3U/7fT/2cn/2ntSx28EGCk1VkAs2pe+m/Gynt/lr2I5NdcpGVgtu6IdTRDfyKeqF2IsDzSZuTmL6ne4/L/UCgUulUp9U7pPFDLBU4/XQHh79mMw+tXp1U3AeAYubl8E0D6/INmFR7An//Lr5IbMVJjbQC4ftxUEXZLQ9oJkFpRTkA1JX/OCYDkzGhqJwCYD2tHETifU1FH+AEE3ug1WuPx4/ET234OgUt3rfcD2/fD8b1Lk6yCbRhUlAUO1OotxN89gmruDxUjn32qH1OE0IQdz0j0j/h7Y0fWtky/nV0NG/qv69faYxv639R2B4ABQRoMqCYF/X/31P9qX+a1WyyQt9ePcovsfRU/kSXDw5qzz+X/CtbnsmjibQD6L669ChNrgUP/XL+hUCgU6qWC+Cfo8XoaMCT8P+f7enIS2Zsz0NxcaJ5frV82Tz0A+1qgtEQ2Xn/+u1+3vur5LBINwfnnAYyyAeDaK9oIu6VVFmjqLnOwsiy2HnHDcAKs6YdaAo7khB9AwP/SHxgsy4Hn2TPfMU7GJGR4oD5/DRPNsLL1lD+V2YWu0CDiDwOgf+1qfs9UP1IyR4TQxIb+O8NxwhNv6svalrccKp0ktvYF6N84gBoDwL9io47tQf+/eur/1GeybAehO6b5M5f/WyKbB3Ydp3BYi6VE+AQLEZa/VL6/yYYrWijWhfQDQqFQKNRdKZEHZvlaWADWEuLLf49M64oSlgNANwHIAyZfbtpgvYvvH9kW4YyD9AB4bTcB/Pnvfr2GCglFHvf9ti4Jx82HVEWfmWsG8uKuY8bzAAAgAElEQVT1qq+jz+ZWZaDeMBkbTlTxLoQTgNInzQyDMUU7ZU2eli7Zv7Oa8AeekHr0muEEeQYEHBqtGd7lDqD/RrdqEPTvTvzdI0BNa0DtXdwfuOG9lvu39lKI5+/VfVkbUpZDXXdd0H9173qP/dD/pto7AAz8cWHKeynofw39v/NETz0ytgymHVtrDduGl7y58o5U/CaWODhD0pFMj/PdIxeuSvESyJ/ymP4DGrPQy/lS/gvUlw2J+1e+31AoFAr1VcrKE1J/0XAO0yPWLzkBLPpHyb1jFlVSb/kmAK9tIN4E8Oe/+0vJmZENAA3fcjzCPp7jjNalgnoz42QyISfAu3Y3OwEt70I4AXw/pt6GonY9eVFU4iyCjkx1QvoKhyA0v2bg+5s6UH6o3+8bt0OfwePoESCurWk9g3avS9epfsZwf2sQ12QY+pfiKf5e3ZGjLWM5BPq3y2cA+Ndt1NdB0P8aqcesjpf/t/dlPr7fPfmPTMYTObq0f5kZ4b6ccPvRSG4TQ8OmeFTuOy8pgH7y1me7gX1ThEKhUKhdKYgHDOWZQvwtJKBz7mnAhZjm2ROJcXMym3wTgEjty+5wWlu2P//Xv6RZj7Em/xeyrqMWWE/SXFTU9EhBZB4sn1/x1ksgLN0JgeX1C1KrfPs7u+NGEE6A0FuSpVe0UzrHT0sJzFUik/lPUcMh+B7NA/GNMgzYyu8GdN0xlZ/4Q/9PZtsqV0L/q7F/dWKqnz69FGL4e0tf1oZU14O6+1T0v8l/B4CR6KnxDZqO/j+h2Sf/aezLjJVb6T/T1jankKG7Ry7/N3xIlSqSpDO15XnGtYDGzPWSvpT/XgsLnTYtlNciFAqFQh1VUP5keTkuJU8K/TcBQF5V95IcthCQwPpF+DLBSdR+DdroPyLRQ2wAEeluXFmyASo6pYaqOQHDHxJQpte7OyvCCXCpuLHE4QcA9dF6wBIg0L7cTUnASjOA0+TnsOEQTKLX4Xu7mhD5HJTfn9kP/Yf4/61NW/nsXdwfuKFOw/2zVsPQvxQvfmW1fFiUtozl8OXov2UAVgPA38GoY+Zo+l+j90/+03krNX4Dmem/LVvXc4KGC5bknKb3VNj57euyd0cN0LvlPRMtkDjed77CWwvl5f/kcigUCoVGi7EBsiviT6wPBr6fJ5duAtDy1NwEIFfJNwH8Bis33b/hJoD82v+bbACx7QmV2WcDVHTKEGQmWULbu3anB4YTYGtVe86F96m3WQIl2sdKS0szQBrL202Cob/DZ15xlz4Y39v1eaDf2ZFjIJMR/1bcnzWvXK8vmOoHuIF1gOOB/u3ov2UMUo/j0f/W1HMHADcmzgkZcVQaf23+/JP/PD71//DJf+wjGYN3H7n8X4y0bjHj5f8l/V+ZSDIVLlypZfXZvyt1uJD/cgvkgD/mN0EoFAq9RSkoP5cZSyAxAZJ4+e/ZLE1OWAi5Oy2QfUuAfBPASe3VXvi0OFtB/09NYAPAgWbXKw41rOiXasgnO+1/5lyjqjshcGVfY4UTYI8W1NkSUJr6otv7JjvwMbQsRU2bj1Bw85eqCYVX7cdP7Sq9oP8g4u8YAdWuEwZtWbWu3N8wkjr03zpIdlQj0T/D36s7crSlLIfOb3QW8y3of5NuAPi7mei7+POm/u8+8w84t9LHT/5j6r3mu0HK2e3yf32DmKvkl17JtgQH7mkPIPm5f/6y5fyAz/utEwqFQpOrIP4JR7yeBgwJTccEX06+UCA+qWVfQu1NABusrzghFm4C4MXR/ystAMxgA+x1Q5wA5gcX4wRMODVQWhdOQBehWYM8yfGnV2rqi/b0bdphTLmG+ARx1hzqK8Nu2vOn+uMQyjaAh6H/48T/ylO7dtXz/AC3CjNx/6yhDf335P5A8/eWvqxtGcthEvRfPRKpx3vR/9aj7Q4AGd7hxIP8ydmm/n/Fg39B27H60v/Gvsz0Xw+GSvrfZLFUXf6v9Oi6/N/UnXjcwUReCBYiheRAXdhVBJNpKZ9jSQsD/YdCodCzOhl6YQOky9fCArDmJeJf4E+BS5TvmqLO4UAQ3kPXmwD+u0b/05HAjTYA3zxxAsSfyFXQ2eYEJKi9a3d6YDgB5la9z8uw8fSGWYOKPO4kxgY+n+BKGg5BiFMzxegJ+sV0w1XVtanRZMQfpoL+UHuxf9Z7oTHc3xoktLJx/7qO2CYMf2/py9qQ6noc94dXof+G3ukeJQPA39PAQ3HQf6hj03eeqTX25Tptb6H/dWkp+kwnAY3+45yqOl3+T0/97xqJRa4phvBfrjbNzOF+1UUIhUKh0GilKDzh+wskNwHsC7anAW8iv8FK9C++hDE3AfAPA1BuAsg9gP/+//wKTlh/mw0A+XtC169HJf+j2du76ASgZMgJ6NSdHhhOgLmVp41Lzz1IoP0zJWuwT+DA/uEQvFdjMI0zq3//eAr09+j3MejfSPzbMqBcTWvXBP1BWBE3+r+F+8NA9C/Fr1J9f98l65eImgr92zNbe3wO/W/S7gDgxod+aijxbQr6D2Po/1yT/8hKd7m1bU8bdHJqtxyKdVFzGra89O5YXI30peFTT3eqrEvSsG5UxUKx9Ug/IBQKhUI3KyH+AMmyXEjCt4KMJjElx8dJ0psAOKwvNMf6DeB/2UfBfslQSYwTAW30/2p15LPoThtAy3DiZNoJqIbdVEM+2XmesHARFd0JgSUhVVp9txOQty0G0lVNswYBGqMVzHRfEcsPjJpO1Ta9HYI4Pa/WMA7eL3Hbu/ta0F+TYELo342z91ivlhl+QCfd3rb6YKqHa9huHeC45oL0R/96w37o39VE2rW+AP1vdbQB4O9v4EE76D/U0X81Z0z+k2vey/+7JDFe/k8mdA3VtfFX9BeXX1rKAMhx/+p4p0KhUCg0SgXlT5aX5DLxo9BzEwB+qQag+MqbAOQq/iYARb8B/K6k/6dG2wCQRfik0erECRB/UteheepHDZXsWOuu3XFRV6B184YTQCRpSCELe1JjbhFo/3BVyPijzjceOXohluQsT0Hej9YsBN+u+3eDHj225ugO/dsG1Ar997b91qgR+oOOub1tTeOpG7TNL2mF45oR0p/7m9pSXbduRmu8AYU15Jf6mgP9b+LvAOBGSV14I8W3Keg/VNP/jkfkNvqvy3X2rQ+myopvXYWjU8+2uvPyf4L+u2wV3XQxlJyXY1q8lvTlihYgvxFE9TBCoVAodLMYG8DxNODiZT5hzufdBMBpnA1QkZ/rkc9wQlbJCajj8qghkyzh7F27MwWa2n6cE5Bk8uYoUjWkUNV51iCi6SNmgCDLbyTrONW4xd7nnZrhfTjVdeNMs2ZPveXN/XYeeF/o/2HEf8vauMVboD/T/BbuD8IIO8DxGdE/cXVEZY893YLJ0H9t11b0v6k0APxdDjzCT0f/nXrsqb9g+IHSOCFPx748ZLl16v9GK8X8s8+RU5b5ScL13ano3LXRVJth04K2KvcXki8MGfdzfkAoFAqF7lfKwc/lwhLILiBd8xI+G36pBqD4+psA/ufuARASbwIQPADu8v8ywzG0qmBkA2CXAq7KOtmcgDULbe6dasgnO68hWLiIiu6sgV/lBCRdp70neStTtWVR1WQJKLSfPKhMeMZqsUpNGr1ulb9lZzMkDk22K8y6mboMrOfKjSHjefKG1vNBf0RI3c15GYbKNB/I/bOGZu5f153miND1A7k/0JZDT4ivt6La8btKw7s8O/rfRN0BwI2VOrOW4ts0mv7X6IYukGLqf+llS6pEpo0sMfRjHbtf/m9Qt8v/jSYB2S8OUN841zZHC+Xl/+RyKBQKhZ4VSfyLpwFDflops/j8JgC6x6z54juREtB/roX8ttk8AHMSAPgf/99flh2PmsbZzQbgB9nLCWBtgL1uiBPA/PxhnIDhUwPRY3ixEwDJG1jTe7mY5/FlxSbgEFU+SMA6OuOhYqpz224OQaOm2ijzaVqCb1c7/u6owsYcpM8j/u1z+0Az9GcyeICYPZRsJQ2yAxzXtg9bPxD9M5bDw+jfCeUrO/L34u+6Bv1vugyA1l67avS1+TVdvGjyHznnjVP/6/I0HzT5j5bTGujoe7W9s4bL/y27sfSO993BNJuBWOsVLa95+fnlweF+pq9QKBQKPayE+AMgG6BcRqRedgIwv3bGD7kJQBS+CeB//L9/uWrvtgEAVhrB1/XCNeczJE6A+NPcNQCmFVOcQPau3Vlj3+cEHOGNZkA+kuxVkq3JD3C3Nwp/aEy3CBQHF7fe5RO4fo9NMubZ9AH43q55QP8IAm7qsS3BNNC/dUqfMh1XMTH0Lxuazd/OZJzh743dmRpSXT/M/UHfZ/r0NTf635TfAcCNmPjRIMbfrpj6/9Kdb4r6Qeo4+U8j/ef7euTyfy2yx7enNGb00h4MAKBd/q9m+I0JoD2ApQhbiibkcigUCoVmEGMDLJDcBFB86RWX+RcBSS3xGAAcXzxk2D5gTQv5nWO+CWCn/+lmudUGOMrWo5gZcAtotmWQpgYC52pqnTLJkBPQqTtr7CudAMjftGYzIEmTLf7/7L1przQ9cp7Jaj2Y/23LmJEwAwODlnuXulvyCtuwjbH8A1ptbR5Zlv7MQOrlzIc6VScXkhFBRpAR5H19eN/nVGUGmSQzK/OOJV82xbaHuQSE/gDmZagFQ9NmbKV0b07HXMdW+fMd6DPQK/orHL6y3P9ptPRFu+hfs9q4Hbk7W/dva7S2y0ftewVfUa3dzFaTpX+hf769rQjS/5NvCm1r4670/0Lqv2b4v2pbDfbPG/d5Grp3FByqw/B/ofpf2JK44BLh/9m27j08jh6kfwAAcM5R/b/9Stxi8FdJAii/DOCdBHCM/f9sKw1yA2Td+iklZkIAv62ShaIbINW8Ec2t53YsG3uHGlxjD3qaE2w73RPw2r3PGZAO89nN4/z/g81el8AAf0BrSM9kJ0G7dbAlqtqQmrHpQv+RvqPSUPxT51CYyP2fpivftQu4EtWLv2l931pvjZXxgv7e2RxrXz3pv2NMIP1z+UZcDnI3y7Xtu4H6b4ev0v+SJWRXEmp8+H/ve4xftLtnSNmd/21pg4/qBqXw/4ydx2mzrMei3hYAAIC5nKXt/Cf3yv7+kwB+k9LvlPR0wshV/T/ukszdAGUNlJDgG9qqd4D2BOT60OkJKDw3FTwB3S8J4O3oyBPw2r3PGZDOi6jVm5Llcf6noj+gxQTZxNGi4H3CLNu8zaz8BLjpXozhEoZOg65U/qQ5jBqif9+wqJTvr9ovwOt29Qaho/WG3e11/9qOH7UvDXX/QtPKjg1irxbdv7nFfulf3q6m9J9Senw8ci8B5vdAG6j/n3baLtb1Jaj7BuPOX1mJrDyt+M8HsfuXHf66Yo5bX+7Fm0jh//dD/m26yycI/wcAgNicr+vXsvj32PmrlF/9U759exJAnXISQFH9PzaazN0A1V1YnoBOlZlhYYXSQOUWudtO9AS8LHwZZa7DK+8gmJz11HcT97j982WtxaqtSyDv0rq2rX1La+UngIfAG16DEPWEfk9LymC0NRT/1DlKk8L8U4/oT9sWb8fZnehwpil9ZXyW9P+R3yqK9N/Q6ALSf0rp8fFIKX0r9v4aEZRvWxGo/592DNR/cR/cFP+xU/8V4Kf1vp98aM/Hg04m4E1QfhZI2b2y8b317AYfhX8zm/jI/VmS+0VtAQAAGM9Rgzz+Ll1i/DuSAPJcpfxbfaE6HOlfngTwL/4Jpf4f902j3QC3vZ6egJoboLyvuPWiGyDVvBHNred2LBt738h1qLShPQEvO0dnQLe9qmOg27F0V8P8uQRydokLT9/gEHYJZM0O06PXeALwKt8/Gdc7V0K//WEvK/pzbUp+DttaiCj6EzsW9PfOFln75pqerPunANK/sF0r6f8JPwPA9gII9f/Tjs0PXtziP5Sp9mH3G/4fxciXNcIB2xL+/5vbJxeJJesPAAAA4I27kn7+5JoEQFqo/0lucPMcdCUBVF4GcEsC+N4/+YVYhx3rBjg0dZPFyxJ8dd/Opm/fm3kCCk9YBU9AR2mgqnXWtiqeAHYHijwO9hScAUfuM9yhej9u/3zZaeyw4hi2QJyF6fi1dt/Ix645d+S+pXMnuBskDeVah7FD40HxL6ioXQZ59Aq1EkVL0BS1e63bY1X4j9r3htJ/weUwWfoXngWQ/p/kHAC5SJh7DxRxp/4Lma/+15ejrvrf2ZYkJLx34sptKThalg//L3xLhP9XmrubJR0DddfCUfp3cPsIAACAoB7135oEkH8NwH17iySAlNLNQ5018r1z7L9MnR/uBijsKPMEdEdwMzwBVYVA1IHCXoWPD/J6GE9AykzZo7ChlKMzILEXp4DLiuvwB6TjmfRlu93efQ3Ovyd9P3rUN9P3E9QbnD8wkXGn4DPZVej/arC/XY0x1Azzt5D7q5a5DY4S/fNNabZ+oaC/qzQ9TPrv8BZA+m/hLv0/4WQA2F4trdX/FkSK+fS3/o78Qe1sS1f9tyv+88G1oBz+3+d9eUOcI7oLZkD4f92CgxtKAAAANagg/VMSQLZ6fj0qn7JPSvnDkgCu7R5aoOl2A3Abond86q8sN0BDo2wLHl8S0NBiuVHuttzdL18/in913lspVwq6M8If0G7yfjVyisRPoHEUsx+ZQRNj4kG1mLHIHpl/qRjtG22VMH+BidbeQvQvMlH3/2xdQffv2Gu07p9pNKb0n8rqf7o6AI7ya7kfiljH5rc0McDBkMOo9L+v4j+K2BX/YbfOGi5R+D+D9tcziML/SUoN1UPy6+H/V1O3n5xLn99SiPubUQAAAJ94SAIg3x9Q2r1M8bfot4/0nY/v/VOi9L9Aqu5wA8gayu2Y7s8K7ISAtnaPFuiEgFw3Op0frISA4wcTPAFfm8tE/HJygKKEnQ/f03UM3Ge+Q7N+3P6pniLQZW48xPmt6CEAVsQS8TkM12vuFxibBmaH+XMtdPSTcbPQY0S4uzfRP9G6f2cf2rwOw6T//D1DHOlf0vpo6f9JPQPAnaMepf9lZlct/kNq5UPC//mw1iFj/Dl2WOH/pB2y/s+nNeLqbBL+/9vqnwAAABxy19w3SQJI6fv/9BdM2V0g/mq4AVgNFfbNJQS8PqYe7g0TAt7dyPWh7agLe7nyBKTbYr1+RNspOwPy1ruxdQyMSBHo7STzIS2AWgsPgT3rKfgcZkhRj8y/TBsLEeZvIvdzG2/ZlNy9dkT5dmx1f4bo39mHNsfDMN0/lRazZO21i+bHXdeV/p+8HADDY/+TXJ2H+n9Fb3Y61X8aRfW/ry3WaNe3kYf/M7bUWEv88H+jhurh/6SF44f38P+LYwC6PwAABMUmCaDI1CSA7/+zXxw3SLwfZO6WfW6Aw66N0fG3HQkJvrNRtoXxpYFy9uZ4AtJluROfZrl8/Sj+ZfGYaOIYGOEP6DHJaY7AtSZMeghi0XkkrqdqDsPXxlCVP9Pw7DD/VD/w1u4xOibu+yjRP9+Ureifnl0yFP1ZFmaH/Kes9G8f8p/u9xsd0j+7DzOl/yelDADziyHU/087Zuq/ZkGezraU1WfLxWlwT7ZM+P/NGnGlRvg/AACAGpUkAMb29O6zkwBe6v9JcJa6AeiNu90Aol5ld7ztS0jw1X3FrdMJAblumDg/sva0PQESC/mdZCJ+OTmgqUuNXB7UNf0B6bBY5Dxu/9RKEWjtRhEozzpgHFsZq7YrBDJ3taq5Toxr+zR11ULu79otu7tT0Z/e0Fz3L/ekoWk13T+NCPm/ePHJdj1L/0mo/qeUviH2P6Vp6n87qur//NL//PD/vuI/ccP/u1I0jl91zPVnH9qi+49Ny8P/i6YAAABExEMSAB9mEsBv0uN3vn7Nvv+7vzjv2OgG4G6s5wbgd4zal5DgL/saJgS8u5HrQzhPwKUZiZHMTjIRv+wMaO1SI9fAPflqPzEoRaDwwSiYD2zQtwGT2YLIk+uv7OhWbU4Y89o++hHWvR0epfvn27HV/UeJ/lw7ucyDPjFduhcRSGrWbm7vDumft40X6f/JPQPA/MoJ9f/LlNEPxsDS/zQSvXhy8R/H4f+8tqrzbp2HcT4KhP8DAAA4kZXpS1H82dcA3LanpfnK9rn+dCUBHPj+774q/5x1+SlugDTDE5B5wKE8AYqaeNET8PH6fiFPQLot0p6dBKYuXz8qf7FtdnARFDRTBHT8AcUPCle6acBPsA8+FHwOj+Ifwxo2X/GOwvypnhg7J9qMeAv2Hyv6s0zND/nP7Wov/ed1/2rTS0r/z32+ZZpH7H/Fvgf1f+QNV2eqgeiXhtbB7X/uVcP/WVsyVhTHSVOcCGn4f/31v0bh/ycLuZ/no28Auj8AACyAQRJArYjQwCSA7/3uL66fT3UDpE9t9ENJzRfseNv3qaSyEgLa2uVZMHlJQLldhifgpv1oyc3MGJLsTjK/QjU5gPxG/eHmLjS0pwjcV0qfS+BC1Rt17ALjs4GQV0R4CMYQR8TncP2ZnNDwwIXrJMw/ityfMeVN9E8s3X+o6P/EYch/0nVK1fdSlv4Zm3mU/p98K3xugjv1X0gI9V8z/F+1rbYmDltSbQ0J/7deYxlU7kKsw//PIPwfAABAhg2SAL5/V/+P+6axboCzZvnaS3xP0KPI5/Z9q6csT0B/aHzRDVDthvZRUybPArpMfGf0RGIns5PMr1D6eqpjwG2KAAeOk6DQh2k6vGdh2o9zwvMoWbKX0P9sWetICTu9or8vuT9jUy76Fz+VNl1ibLC/wI5eyH/HXgLxXbXd3K6kvMm1zP5eUfpPLfHQ9x2+SXxoXVir/y2ItHIP6j9p2VXpf4nmPrn4D8OI4HxbLvw/Yy27Y7OX5f05wv8BAGAflksC+P7//otEytYj3QDv744ultcfUzwBuYSA18eF4e1plGfh0I2qzmrgCShYvWz9KH3T2BmJnfxOjf4JT46BizoQyx9QguMnKHTMjyQ+gl1ld1Nqgzp+wIcL/Wr6ft565bumqznTdodZBdhCpb7oT+8+VvQXmCp3bLLun5yG/Iuaq27mXfp/8q27P7zm7WU70+I/89/6+6Quc+u6TDp/LEWn9/TiPx+sDvsM/1fwxNBNHK1Rv3P35i7R/Qj/BwAAcKSUBMDbvisJIEdbEsBT/f8y8tq22KV0tGPpBsg09/zrc1clNV+w423fx1dHGFqwoSeg6o1Q8QTcdr+0RPgDwlcKytLtGFD3B6QmD9mxN0xFarzuzhQBXSUTgFH4EvE5LCb0n1qqfNcV5t91BNaHL4lOVtO4Bbt/0Fu5Ev0FRpR29PWCX17rnBanSf9JrIXWt/42M0qhjLfS/4o4Kf3vp/iPgvqvEv7f2YevLVNiLkil8H/WV/2K+aTw/0xDAAAAlqEe9f/rR/r2Uds+lwRQ454E8NsPYpfK7gcu6v8bj26AdDmKqKWB2to9WqATAgrd6OxAVbym5PTjZ+4rBclt8na7NXNvV8MlcFeiuq3eDJCCzaxn9OrC/wJ+AmfEU/D5vLSwQa2NH65+xb9spPFoBgwCx/dY2Tz/UU8H7owN9p8r+jfve3eipzRC+rfW/aktI0n/T77Rm3TjrvR/xBf/kpbDFv+htuxui25iRvg/R/3/DbkJby6YPa+//vfTGvXLR44kwv8BAGBnShq9XhJAfl/LJICS+v9l7bVTnsFugOMWxzH/UlcmeAJyCQGvj6kHL8OEAKob/a6IdFtZrG+yWyupxlX/RONO5o4ByiWgniKg4w8ocXWL5Xtz23YCpJ/AsnurehpWFvE5LC/0n5qvfDc8zH+C3J84h6mvcdO7byb691hYNeSf2jKe9P/km/W1Fer/l6meoa4Hueuq/51tSQ7T/L3NbsP/VWCG/5s2RG7wG6aFwi/Z2z0A3R8AAJaELP1f3352EsAPKPX/zUg3APcuwMYToJQQ8PrYQ2mgxPUE9HSjaochaB9V49qTqVaXmDvVOqLmGKBcAtb+gNR0vrQT20MQwbYE0Qh76bQDLv4069b8Cv1vBob5z9H6k2iuMwZWEv0FpsodU+lMs5Ep0v8Y3V9gJo70/9zYNgMA6v+XKTP1X5nOtji7v7axLv7DQjv8X634j4/w/7O1XHOHHVvC/399aYLaBW4AAACIjigJ4F4FqLD9lCSAH3De+nsxW99YyQ0gFuKv7T7/eqRJCQHnfWn9vb9dngVWTyycATdTVCPHzyZXCioZOGLgGLhsWvUHyCwXMCkZ1AzpITh/sWos/Rig6V/oVn67Gp8yHe2NdoX5y1o2HRmNSSe9mS3Qu0cL9p8r+qes7p+EQcCN7Rb2tpH+qWAPA+k/ydR/qfT/xNABAPVfB2pB+yr+Q8K/NHSr/1rh/9xBG3zvzAn/75bLH79F+D8AAABjpicBiH7CX7v/QPTW3zOu3QCnphUSAmR9OO+bSwh4fUwpIv1Kd9nC4/A11xmg0qWcHYkzIM2tFMQ0VrTa7hio+gPuH1ikCFT4uPx/DHHSCMB4imvXy1IYLfR3NafpLzWMDu4y236D0PR1574Q/RsttIjv/X0o/p4uE/WfRkj/T6wcAFD/T9bMfimXLf4jzHzJ2GfmIqhOjbvwf0Uswv+vTVC7wA0AAABro5cEINu+4DOoJAH84P9oeuuvaONZboDj1rM9AYUdn/r7uISAqpHH+evRyQHV51DCH2BUKUjFYNlqxrBYvr9v8aj8xbPZQTGwMdOBgforPASRca/gMwki9CuNar/obzFczuV+rhHXon9+Dw3JXoH+kP+2nhR/GY11/9rtgIX0nwTiZ4/0//zAxAHgTv0X4kj91/uF7lT/aZiCO7MzKs31G5kR/s9S/ytLtCH8v/L6357wf3KDZ/0f8noH3R8AABbjLrhrJwE8UvU1wn1JACX1/41bNwC/V4XWn399NqsU1y/Y8bzvW3k39wRczNcDZg5bjHYG3ExRjRw/06sUlG2+1KyF4Rb5fniKgBS2k8Cph0BiDFFNkD0AACAASURBVHyyiojPIi8yGjYnwS6aU/SxzEgj3XI/I9hRZK/T1Ae91dD+PLEM9jcU/dPIkP/c3uOkf6LpiNL/E30HgLX634IoTD6O+q85dJ1tSdR/xpbUcZG91e0PD63wfx0GhP8fyA/40ZMh9z89fnX+G24AAADYgWwSAHv7AUkAP/h9pbf+ijZWcgMcbQjuFHIJAe/AzHAvCei/RWJrwS3OgKpBmrKIL3EGJLVKQVkGOgbyKssC/oAsj/d/Ckz0EJAMVX+lqHfOyYqZg+Ogfpt54XVAIlg1doRnyrHczzXoOtjfs+hftiQ/NRq65FH3v7UeV/pPKaUPbQeAdWx+SxNQ/7vnRddJ46L4T5oR/q9V/GdI+P/JWmlHhP8DAADQopIEkK0CNCMJ4Ie/92ePj8eH5A5vpBtAdOPZoobnPAHhXhLQ02jdYNXm4/z16OSA6gMs4Q9QrBRUx8AxkD/SoqOgxP3rR+UvhsFJuPMQRAFDkuGRnLltZgn9TYMg3klP4T3jXu7nWobo325ETfQv22Lu5Un6v8en6jQ0Tfp/YvgSYA6uSv97eesvg5Gl/2kk4fZhiv8IGeD6EqBxdF9HNCP8/4qr4QUAANBPpcjPrCSAAtckgJQeH4+UkkM3gNQHcDTT4gm4aqCfPVFS8wU73vZ9fHWkPLnqnoB0W1nEhsLkAC1nwM0U1cjxM4NKQSR6joHiMDBcItUtiCdvFh5EZngI9sOdjk8i661BYpHVTgZWrhbiyP1c+x/0VpNE//weHnR/ddH/YLZtrxbdv7nF2450jIOa9J+46r+F9P9E0wHgrvT/gOJCZZyU/u9vS7H4D8MVQU0Z2dsZ4f9D3/2rG/5fwTT8/3OD4rF81v+B7g8AAFuhnQRAvEjgsv1vHul3aj9dP/y9Pzv++ekGSIJ7Pns3QHp8BcDLaFHDcwkBKWxpoDcWmQFVsy3OgKpBmrKITzVy2TrX1WHPMd2OgbuBfLim2B+QtS3vDb+1YfA8BGlqH/ckno5P4ljotxrpqYr/IBldoRUE+zda8CL6H3Zskf6V5Hhu00puhvnS/xM1B0B09X/T4j+qbfXSXfyH3RC9ia+I/hesVcrwInxRef3vk7bwf7KJXx/+jfB/AADYE/skgOKO8iSAH/z+n+W/Sq9cABdugHSQgSZ7AsKVBrq33taBPrOP89ejkwNudqhGsrFy+iKDjA5PSX7XoqOgQtvR8h6GyK1mewgS90i0KRx4LG/EglJ+HZdC/7gZUFaHZXcirV9r0DTvEP2lRhyJ/ufdh0r/j8pfdLZmZ3PpFZwj3UvYxJFyczoOAKj/J2uW9xi+Sv/rhv+zTZVQDP/nGRod/l/viSad0f2/Qfg/AACAJipJAJztDZIAStL/kS83QOLejui7AdLl/l/HEyDbMeOQSP5KAx2+kTgD2npCmqWfPYXJAVrOgJspdiOlMLpJjoEW+T6/6wf9RSd8Q3WfpV47sWCcH2A0jaO/itBv1IBQ9I8m9z+JJvoLjHT2gTDiTvQ/WBiq+5/3FTfd0K5n6f+5qYIDAOr/yVrnb1V9wnTj8S27etlmQPEfLozlND78v7f4zxuN8P8vSpPy2hHh/wAAAKy4JwFkqwAVttdKAuCo/1+dfFp6/nqOdwMcv8t4AiYnBKTZpYFuu9+09ZRfAzxr7bCl5BZnQNUgDTF60nbcOAZah6h41NkjsBXZOdbL65nzSLmqkwA0YCgQBxf6hzmXFBV/33I/a2/FQ2CZqvZNTxzvseBR9D8YyRnzKv23NZrX5VV9DJ3S/5NeBwDUf01U77P8FP9RUP85rWiN3ozw/150Vw7pRbAM//8Euj8AAOxANkLfTRKASP1/c3IDJNYNirIb4P11xg2QOhMCZPvmPAGzSgOde1GQsyX+AKMYcJ6P4fJgOTo5IGenNFgBHAMdU1nbte0BQPPoSFuSFd5gHnhjqPChvT6mCP1zpSKJ6F/s6QJyf1dDPXbKHl6I/gwj7d2bovs3txtF+n/S5QBwp/4LUVf/UfxHvE3iCe7k+cNsa3z4/4B3/361xejPm1nh/6cmMp991v9hWgAAALAwSkkAbdv/8Pd/+Xy4atCp01GmZycEWLkB0mUcdDwBsh1rnoChpYEuFt6U/QFekgPo5zthcoDi6FUNxnMM3M13pAhkqdmTPp12HTU8BDEZp0rPmMLBQr+naNBbZ5pEf+sj6pD7W3aF6H+zkDPTd6qqHlpX91aQ/qnmZkn/T9odANbqfwsiidyb+l+fPF31v7Mtifo/oPS/Jurh/wN4jk/nKwRe9Ib/kxv8GuH/AAAADtgnATx+nT7qN7w3V8EPf++XX7srugESfb8odQOwtqQ8AYMSAt5bn7vxOuTRCQFZUzdrl8e5mrzOsNYOO0r95gy47ywzyEWo9EdyDGiPVfNDaKZlWxXe2EPgH+vH0EFD5NIVs7PQ/yTTJX+Kv9h4U2h/1z791qr+CR+6v/7Pmx/Rv2yiYUeBPq7X6OEDx9L/k0YHwADp07T4Tyz1X5mBXfVV/Ec1/H/ku38nFKqi5qU45u/DQfg/AACAfu5JAJLt25IAPtX/s1St4wZI3IQAvhtApjUXPAFvzXiQJ6CWENDlCZB1g2HtZpArr/OstcM7ZIH3wsJpcbd8ZKJjoPMA710c9STHfCI4dWeyh+CCQxW2iq/+utTx3/SNleZIO5k1ohvc2Rwq+o+U++2mqV/3h+jPsKDQvc7+1DozXvqvNupB+n+i8BJgDq5K/4dT/30V/+HAHJCRxX8YCBbGwNsvoldt4f+FRUJ7IzrzAxD+DwAAgEkpCaBUBUgpCeCH/+efXT9PZm6ARNzH8N0Ax+1Zu+Qi8V8fdHkCWhICzj3p8QSk28PPbskB9IPhVGdAqZUjAxwDF5eAXfaDinE5Ms3f1kNgaMsHbY/OXsfBUjrXtz1X6FfS97m21Q+2xaBLuV9mH6J/l5H5ov/NiEz613M5nP+KIP0/aXEAuCv9P1X9t2bZ4j8a6r8AVVl5ZPj/BCaF/5+AGwAAAPahXuFnYBLAD/+vwlt/jdwAiZUQ0CCscz0BhYSA1wctngCBE+Lek+uj1eeh99wP6voDqta48jrPWiNsm7fe3neWGVRjhGPgMnPa/oCT8aa9jMdZ2UNw3WErXB65gd4xU0KZ0ralvs9tSvHAF5P7Za14F/3LZlqX2ZKi/9mOTPfv7EObLu9N+n8idgCEVv8t8FP8p1P9pxGd5EME3NDh/wrFf1TD/2kUXg9QO5zHr6D7AwAAODA2CaCo/h8NJks3wOd3eYMt8fX8vWqegK6EANm+hW68jkLhDkw3tp1IDmDI6zxr7fBsPs5bcJMDKLPKGDoG7pNn6RLg0PB8q9pJcVbA+Adyl8K7Movp+CSDO1drboi+r7C1ohH3cr+srerh+ND9Ifq3WRsn/ROifLlpn9L/E5kDILr6v3bxH9u2mEfK3Qzh/+74dEg0h/+/KY3Pr1//QPg/AACAC7OTAH70zyn1/2gt2bgBPu3XcgJ63ACsHTOR+F0JAamtzzlPwOVpud8fYJcckHEGfH0qTg4Y6wxIh9lOnN42ReBr0u0YYLgEZvsDOIyN05+fFRDvWUuT2EfvQuhXW56NR2Mmj/KIIPd3uDEg+jcY8Sz652yPC/nPWQoo/T8ROACg/l8NelL/XZX+H1P8R/Pdv7rh/2Pe/dsW/t8M2dCvqQ0Q/g8AAEBKKQmAuT0p/aeU0qf6L9Opx7gBPrfIBNu23YRyPQG1hIDU5gkQOCGyPbl25vIg3VUm6G5e0Rlws3aT1+87CKw1wrYp7m2pCUZbyrA7wBiMgP6ALOTUjU0jiILpDMcbJbc9thH6Xej7XfY7tP7GfZpob8i76F8w07Ey9Y4rmuj/xF/Iv7TRKdL/E64DAOr/1aDxvd7I0v80okvA0jKur6NrUP/rr/9F+D8AAACfXJIA/vHx8b9Vf1FySQDZKkCX2H9fboDPVjI5AW2pAOLda56AroSAln3LzoCLJBszOYArr89LDnjktpB5BSobTnQM5Ccl+2VpB53opvmM9RBEwa3i3U7oQ1IV+p3q++2NBpH729uiDtC16J9mBvsriv5lKy2oiP7lPRv6cPtAT5GfKP0/YTkA3Kn/Qjy++Hfk3VNnqgGzq88UYdoVETj8n/XO3pHh/37oC/9PCbo/AABsTym63zIJoFT5x68bIB0P50PFDcCycD7G9x/NCQFJOsjZ/lxsff0VMTngIq/TtXeSasdabWa9Aoe/IzgGqpI/5S8of5ZpRf5I6u2WHx4CV/jTODTRE/rF4+RkYCWKv/djlDWXCXhQsmxpx2GFn+VF/+r+Gj1ZSPp/QjsArNX/FkTR8Qbqf6TiP6ptNbfy2mys+h8W1qLVC///pDI7v0mJM+ytmSiPX7EtAAAA2BbtJACy7r9HN0A6Htf7f5cSLY0t0hZqCQGpzROgI2HX/AGGyQGWroXH4SOWmM4IXBfTYTOwY0AhRaCEvNPnc920KR2cKKcNTHy+jDtoKowX+j0PON23JsU/iNzPiKQU98XWGkT/VlMzRf/c7gI5XtoBJ9L/E8IBMKDgiWnxH4/qP2nfVel/0Z2+N/U2bPg/gfYK7O0SGf7/K4T/AwAAYDAwCYD/1l+PboBrPP7ntoKI/oZG7x1Il4F9egIaEwIuxrpudo4715IDev0Bupo74Qz4+tRFckCr8ZCOAWGKwAWNHrV5DqpdWz2eSoxnUTgi3PE0E/rdTmhLx4Siv2u5P9GHY9p/JYU9Z6bjqmqr+0P0LxqRhfxLu+FK+n8ieAkwB1el/52q//Vp1s2fMM5UOG7mrvgPg/G1oRSK/zxB+D8AAIAN0UgCSCn9+J//UtpyHDdASsFLA136wO1JiVpyQNItFqSoudOK8+zkgJLx1lYiOQaE49n2uGHuNoCHAFRof0jWXDchhX6d/kgU/yByf3HXAf1XEo5DBftD9CfsiKV/UU8cSv9Pag4Ad6X/V1f/pfgp/uNR/VdVk7XC/xXwFv5PgvB/AAAA/eglATzV/zZRPoIb4OuP0KWBSj1h9adCOTkgqRYLmpEcwNXKLZID6q0cWc8xIH0A4LXY/FghOSCOBlHuCDwEzukQagfjUeYuod+N67DTLYwcim3l/pepUKJ/Ehbw6O1LxVSXT8KyY7fPVEP+cxt7kf6fFB0AUP/HE7f4D2Vq+HSoFv9hMebdv59tMfpzoTn8P6VU97v8mmE/MZYT3AAAAAASQ9n/EN4gn7f/0f/9y6NiHs4NUNytLMEnvdJAtAWGJ6CnG/f+dFljJwe4enMAzxnw+p8PZ0CpxSN+HAPW42CcEcA3zzNZ3or0EHS3DVKKpONfaHzWnqvjeND37wwbk83l/pdBZdE/dXfykf3nm0mi/81aHNH/iXb6nmfp/20/7wAIrf4b4ar4DyPivq8t5sEyw//ZpurMeveveYw8n48m9b8MfWidzVHh/49/6LMPAABgH3JJALUqQLckgB9995fHP1OK5wagG81I8F/qvZYngN695pDIRq23MyA5AJWCBjDIMVBpqfy9B0HVwG1Amuz1EPS0bbbzBDJpWvzd5jBiiKdMo099P8swQVDGB7G3abftjD9K5ueJ/gcLEP3bTLX3bRnp/2484wCIrv7vUPzHti1d9V+p+I+AtcP/1UH4PwAAAFfYJAGc1P/jV+nkBkhCXd6pG+DW1vmP4S8JuOx2+DsXtd6FjopdSw6IXino9T+5Dn4zOwJlx8B1T5ZjYK5rpAfmlbJwREoeAnUCTUBKaZrDYlkRv45yl8z0fUOLiq3MkPtHDUi1ndaLjK3on+Zo6zdr0UT/ZKX75/aaL/3XzV4dAFD/Mzbt1X9fxX8U0Sv+s3z4P710m8P/CwvGPPyfAuH/AAAAZLQmAeTV/zfduvxENwDRbi0Sf2BpoOxGVHIA12wVnXB7XnKA20pBN2u35AD2DbuSHK+ApWOASJiI6w8o0ar0qzzoLTB+plg9uTvU7kXo9H8VfV+n0bH1fEaODCH3J8eR/mlasL9P0T9nbc64OYz6r5r9/PLkAHCn/gtxqv6TTaxa/Iep/jsO/9d696+jIkIXesL/n1QG/FfHx8smCwAAAPZENQngR39QVf+PNtNVlxfVe5niBjjYmF8aSGaBSg44fOypWNCMSkGp+/CJ5IC7w0X4UOUkXSDpOAYufqjXv3j+ACaxZG/LXIDoQvRklh++3gM8Lc1F9P0LkPtvbRnK/YdWtHbv0tb7e1I25Vn0L3w2ZNyIzoyV/hkGT5t8OQCs1f8W1njxr979Xaf6T6Nb/EevRUU3zPh1olP8Rzv8n4Zs7tetllNKCP8HAADQRi4JoAJX/X9zrZzzrPcSwA1wMMPwBOSi7/tLA10NS8ehZCU9Dp95Sg4YVSkoqfSWNlV6gs01KH3oJMyZ09eZS1CLLG1C1B8Sn54Dr8/hNE7GM+4AatE+ApSQ3YPDeQkh91sYLDc0Qu5/taVlAaJ/m7XJ4xZH+i9++ekAsI7Nb2nCgfrvrfiPbVu6tz9Tiv+oLmOt8H+fPH6D8H8AAACROSQBlKoA/eh7QvX/aDxl3ACJfbs00Q3Aat24NNDFotiasFjQzskBunkGBbPkI7csdcBPukBqdAxk73Ity+R023Miczsk6rNcKHQG2UDoDzH7fYp/ce9wAf4PZjuqFzuV46qJ/mmOvE6L/knkHlfDoehfsHD7rNwls4mTbfIU9zIvAWY17Kn0/ybqv5fS/26L/zDYLvy/GePwfwAAAICgEtrPSwJoV//f3NwAKaVHNDcA0QHj0kDZ/ohtUsWCdk4O0HFdUGYv3FqhUgeipQukXH/IB7v8x/QBNCZYiODbg6sAHJkgkesJ/SH0/SPdaRDh5X46nP+CP7n/bKpX9C+bEKMo+pf3byGO6J/7ZlTUf1u8/+fXh05+S3JlGeq/ThMDS//TLFD8Z+Hw/2b1v/L6X9Pw/ycVL+g/8CwAAAAAFRhJADqtpLwbIPFuZ7rdAL26tsATkIu1V/cEXKzLLAuTAwSWC+iE2/OSA1xVCmK2ciGfOtDqFahsNV6nNvK1tCodVgkHpAF4CALhWgE/raTGnro+wBtqvR1bz8fA2kyV/4364nlk//kGoj9hav6gcUX/J/bSf3+8/51vUP8zZlUuMSNvjgYW/2G4ItQmRdcNo7xalN79ywr/9wYZ/v+rWDdjAAAAXNKRBKAQ/n8h5wZIkqL5HW6ATx9AvwpP96FWGuj5r4/7tio0KtdjiwXpSMAzKgWlUXeUDL0+6xU4/B3EMTA7pn5awgFnW4ePL6Hx+GRVm2P9/nocgRz6/WS4STzL/Ykf1G981TBaQg5F/5upro5B9D/B6Ju99N8VyCsrAbSD+q/DyOI/qm31NJTSvOI/48P/dRpiDJd2+H9K1DT9BuH/AAAAgpBLAvixuvp/bC4V3QCJcYMjdgOcROyPzB9yBAkBlx3OfzzOBuYnB6RKtz//dpccMKpS0NV2oX07GK0rpAvUN/RTTYiDWW/5okZ+flrb2I77oHoZlrHavQgvQ1TAsHvXSak15Vnxr8n9Ay/Bc+T+Nz6D/SH600ba+2bpiqA34UdOCxwArtR/O+IV/+lsa4/iP3x3kVbxHx0vgsFq7O0Ywv8BAAB4oJAE8FT/FZTZCgU3wOlfVQQK/se9oVNbXDvlbtAWGM6A5NAfgOQABnPj6FvTBTLfKzXniOb7aavaRBm77R6CHRgoFo9oUwXn/XOi77dvOsGamg7e1w1rs0qSGtdcmx2I/m1GZor+DDtd8f53uA4Ab+p/3OI/avH4jLZ0dx9Z/GcH9gz/51oAAAAAUrUK0JuDRJ6N/e+Ml6+1m4535lc3ANkot2OZsjyTPAH3LXj+AHfFgpAcQMG8pzeSd6h0gUf204Z0gfrmPh0DJAMTDkgPgS5TJ8ToMTd/TB6fqT32SYhPfb9xhxlmH3WTA+JoBxlXlvt5RtvsFKyO1a8LptYU/cs2ZYyJ97/DcgCYq/9C4qr/UvwU/1FT/xH+z8dh+D8JFf7/Wf8HAAAA6OfsHvjRT/6ssq1VTkDZDXD9o4AsGyBdngjEzdURjxKlqr/+FTQ5wI0zINWG+hKDaeEPKFG/7bNz/BSa0EwX4LW4DnNdPjymStDBJ34B+Z5kbMqFUB9T6sjgVsbX8xm2UK3lfp7pZlPzg9YLpjyL/rlvvGRIcNvpl6xpB4ByxHoWB6X/B1T+ScLBdFX8h9pGU/2Pjs67f9OM8H/yRPg1wv8BAACMhZcE8KOf1tT/C/o5AePdAJnmklZCwNU801pTcgDLMhvt5IDH+bMAlYJSUbJRqxrEZ0BkPaOJQekCV/OLQo7WDoMwhR0U/Dq2I+A1hH9ki8Pk/qljFUPuzxkMJfonPwH1/kV/YhMtpfrZgOwlwCy72774N2kW/2FE3Pe1pVv8R5Xo4f86kKX25dAH2JkfgPB/AAAAg/ltSt+Rqf9v9HMCRroBjtsZewKujTQkB1z2PxszSs5QSA7I5TRcgsznJweUdrt1vvSM7sQxED1doGmPXBeC4/tZfRCVCcX4kJgMUUB9/45uHwaU7581aEHl/pzZroB6rR5aiP5lEyoWXDhLGAbN4/3vDRAOAFel/+3Uf4fFf2zb4u/uufgPx5rumlEq/jPNj4XwfwAAABHhJAH0oZkToOQGuJtkt9jSqIgWbZ2Ksn/94alYELdSUHKUHFDfP3Mn6MUxMMsrcG6FSheoWOmgzeRKboPF8CAWe0Z/fJbQ959Yysq2Af6Q+5WMd2nrE4L9Ifq32BwU73+n5gCA+i+AMuKr+A8T58V/VKVk8+L4InrC/wvDYh7+T4HwfwAAABa0hf9n0QxF73YDHGFtz04IuGzej9hy0GJB4ZID7nDTBVLZMZAxaqdEMyR7q1by6QLXL8odsRfDkHAApjBB54W+39LKUnL/rTlG+17l/kITLvRriP4qFIxPiPe/b1J0AED912xl1eI/TPWf39yk4j8sNg//T9SY/+pBLy2E/wMAAGijkATwo5+rqf8XdKLmDdwA9C41T8DXFmP8AeGKBbU4A1K+z4/DdrrJAf0GBeYY978cJWa4ZG/SxK2VZoktnucAboMF8KOD5/laZEIlSrsjPUzpjHX5/oF+i9Y2F5D7n0D0JyzEEv2JL63j/e9f5h0AUP9l6N0Qdar/NLrFf1QbHeOMyTc9KvyftZgNwv9pyBHoeycBwv8BAACoY6f+v9FRnFXdAEdLAo2xrKoXP9Kgxc0wtVhQo1+E6vMxOUClq2NC48UWyw+5Bcles78T0wXkjbapP67dBvAQWONK5mZBrAnuAXk78On9iSv3twTyvxkhlRo1UW1zrLBetgPRX0yPy2pMvP/9o4wDYBP1Xw3V4j+2bUnUf8Y2vOOaVPzHZ/j/LB6/Rvg/AACApfjJz375nY/HbweGD/TmBGi7AWR7FSPWpyUHsCw3FQtylBxwvf96HD7TSQ7INEB1yhCymevjct4vEC5dgNkoiY3boPy16tOS+4d2c5iLKsxAKcn3TFwNi7POqMnH5SY0mRXInyW03M8w12kHor+YuaI/o1WiS1cHgCv13xSU/qesVb+eWPxHGxXhXq34T1+gfSPG4f8AAACAAocqQD/52S+f//jO64ZkmCegN1KecgM02FQVqaf5AxSLBTlKDuBWCkqKyQFZJjsGyPbOI7NMuoCU5uerRs+BA7fBSjgamLHa/YQGupnbw0dzF/zK/RNi+e8sIPdTFvtNrSn6V8320pW58txhUrz/vfWTA8Bc/RcSoPhPvZWBpf9pHBf/kaEa/s9S//2noTwpvf7XOvw/ERP9+AeE/wMAAFDjrf4f+c4hNGGwM0DXDdDpYOh1BlxM5Oz1ukAK9MrrvOQArmUGlskBp01NV/OU6Hhuk4x0AV2vwK3NdyveGZpwkN+tPXsBXIF8r8Fsib+jfdUrjll0v3leAqMP5sSS+8s254v+ZSPLiv5JSXbuife/d+DLAaAbP57HR/Efh6X/+9tSLP7DcEXwpoZ/3ur+yA3X62OH/5OQvfrVGneJAAAA3FN4FfCFwWkB7YJ4xg1wMtDuYLgYFtnxlxzAssx2Y1g4MLT9LumyLLK7jU8XyGJ4jjHSBSYWEcri31VwRDXhgDIWa2hkdPpqNdnqqSySxD9q/U+Q+20ObcrkBpX7y5bna+sbiv7pwzRJgt6k/uiTfwkwh6Cl/4ep/5rh/6pt9aJd/EeGaiC5r/D/TvW/OfyfbBfh/wAAANyQDf8vMT4toEWyP7kBHudPCx810RtifzUxLjmgxbI8OWBmpaDKdp4cA1kmiON0usCIIkJZpI8NQVVx06ejgGOiNh5byfck00fjIerFjIUbWu73Mb/VD444k/vL9udr63uK/q17ipoXx/vf+XQAuCr9H+DFvxS+Sv/7Lv6D8H/XIPwfAACAG37yxwL1/8LItICueHCGJ0Bgtoxq0PoKyQGOKgVx+uHeMXCncsuo0Dc36QIiNnEYiMCjxQ44mWX/Ev8FG8XfUO53MtFpWbm//I0L0T/3DUT/G3bx/ne+pZ3U/zHh/8rx+J19Xqn4T8zw/xHFf1pHxjr8n2UBAAAAYNCj/h8ZnBYgzgnI1AU6fnH9NPOdHIWg9XKU/Uh/gF5ygHmloF7jdBT89aOsY8CBopVS+dHWyjHgI12gATgMgAf8qLoksSR+04G1k/sdroft5P4nkgPp738s0f9mvLUpjQo/vE4oxPvf+Qb1X4xuxLqb4j9q6v88lNcPwxrLizAPsv5PL1T4/+MfbNsHAACwCVrq/4WnM+B5g2Oq97WL1NUo+3b7VVrEeh/FgvSSAy4HYBhHb+4VyLdxzTTJ7j9bDVMdHNLEVRtwly7QABwG4IL353k5niX+iaP9yP7zgnw0vK2fQn8g90tt9Vtoz0KA6M/fpF/Tlr0DAOo/3VDY4j/UBvo/q97D/3Uaihz+/4/UBgj/BwAAYI+R+v/m8ZnGO9QZYFF1h/iilRax0vO0dAAAIABJREFUfoFiQQUfhlGloAvKEfHyOkL1bmQtDhPWhnoFru3l0wWkLbnV2RuOzu2xLIk3+XUMMok/DV2UTmZkYbm/RRk/srHcT1nstwDRX8b4eP87AgcA1P+UNIv/MCLu+9rSLf7DNsVEXf3nLyGt4j8I/yc6gPB/AAAA0fi8PzmofEbOgEYRk1e+ptIQigVxzfL6bJoccGeQY6DSUvnrwh6DXAXKI9NsgnX3LfUi+HUYJB8SoVvuE4fhygKJX4SR3F81Z0uvyv/EawmjkXJ/1aiKEYj+YiibhvH+d7gOgLjqvyYjb7462xLV/4pf/McnI8L/7UD4PwAAAAdYh/9nOd1z2zsDvpo6/0k0Jk8OuHznLDkgb0+3w7WWKvD6/LhZmhsU39UBNdVb7CrQHTSrdIESuh6216crOQy2Yp9HaLGCT7K3xP+GK2tGkPvnqvxNjena9yv3U6baRf+q2V5ulpuashH9k494/zssB4BaePgMhpX+91X8h88SxX+ihv/3q/+FwSHD/+n6P30g/B8AAEA/f/jHvzTSf/k8b1o+PuWNcc6ApCZSF/0B7pIDEtFto+QAsVluQsPz7xWr5TRbZLgKzpuYJFgYpgt0ouN3gcMAiNFX8I/MXmF+JP5CT6SnrGLTmjiR+Fsb1rXvXe6nDEL0b6dN+h9Qtf6RHrJ3AHBxE/4ftfS/n+I/Bur/AnDU/zB5LVnI8P9/pI4ustcQAACAB/7wFvs/0RlwvKWc7gxI9sWCdJMDBAYdFAvq8ruk+8NdKQR+mmNgpvzNaaOYYJExFDtdoBNpz+AwWJq1FXySuQ/eOqLkHU9KMcPyNJVf2LZFKzHkfsosRP92csbZMcpDpP/nP2gHQNziP8NK/yvjqviPAQuE/+uA8H8AAACgwB/9/L8/Ph4f5ZuG6c6AY4zEYGdAipYckNrmy0GxIIVuZ23l/n595K6OUJYJVXRyC2CWV4CJL9V0msNgAB/FP+LwuPxfnaDjcmDiwntU/uJjOQUWg9OjaVoc7OAFsLrcX/5+IdG/dU8WUUT/I4QDAOp/SmOL/3S2JTrqGcV/1FFeRUrFf2KH/5Mg/B8AAIAlf/Tz//78x+N1K1LxBKRJzoB7TsCrMzOdASmCPyBocsD97kdmttUxMDddoAT/Tletn1lDtFfga8/xI9b5PDBZsFVzGAygdkVYh/gKPkk8iX/SpAwRixmNxFf5Ge2uLvc/cSD634yvJvp/bj1J+n9ScwDEVf81Gan+07vrDdqk4j/q4f+CplWq9msx792/dPg/Wf8HAAAAGMvjcFvi1hlwv3Ua7wxInf4AKsqe+KKJFrHeQXLAtdnmJiQB77eP3DkG7tgmFjhLF9DFS05GmB64ZGK22nCc6zuQ+KkmCm3GLNdTB3K/akNdaKXXjBX9yx+XjBhfSSqi/ycfKVUcAKHVf5+l/2lQ/OeIavEfFrHC/1vr//RChf8//j/b9gEAAKzNO/y/BDMtIA0XXko5Aa/OvLo9Vk6QDcLs5IDUNmuSbg9YFdlbJR1pm0oXeH0UwDGQRcenUtqB7RVoaXE20geAcAcYlVAD7UGZ7cG5xD93eAfL/a7WEuR+g+a62ET0/9rNtvyXYOrzDgCo/5+ozpOf4j+0ih2h+I+IYeH/rOWN8H8AAAAgB6n+H+GnBaRJzoDs/dThTn20Sjs4OYDVRJVGa+xuq3svKgxMF8i3BscA3ytwazGwY6AEHAZL4kp1taBdN1yoWA0HrtyfPCrdnUDu125Lh71E/9csmC0PVrz/nYwDAOr/JyOL/6i2RUAOUZDiPz7D/wcxK/yfAuH/AAAAmhGp/xf4aQFpoDOgnhOQey64bjVMkrZIDhA3QdEyOKxuZyoFce1348AxIJ58PygkWwhLMGncahMd9DnaDpU+nwPVicNxHgwk/ja44+ap9kszvF5B7m9rSxOBI6pCNNG/wwSNKN7/ztUBAPWf25ar0v+LFf9Rb11DuFcr/jMv/J+GDP8nX/8LAAAANNGj/h8RpQWk4c4AKsriKkGP696lYXKHBYoFUX1WEJc7GOgYYATBSBqfLsvaDh3ZDI3sKnAmag6HBXgs8QljXtqDf9UJuop2kPt7Vf43kPvHsrPo32qFoDne/87JAWAqDYd56++T6ggGLv0foviPavg/S/2PtThbw//p+j99IPwfAABAG1rq/wVRWkAa4gx4d4R3w3Xqkd/kgFQS1muWfCUHsATxTNUgWYsa6Lgl6jsUF6do1bpLLFD26IwoJdb60RdwGAAZ1eVk/8gMiT+l1CwQB5T7ld1FfesHcn8z/kX/lO+TX9H/ZVk5kaX4EmAWujp4H5uW/hf1ZJL6rx7+P96ZhPD/lBD+DwAAwAQj9f+INC0g2TsDHh+C267nHuc/kRxQo8uBUTLk2DGg3Dp/t9oajpFYMN2jU0PaCTgMwBQFf/YS8f+MqhbMfiSI3K987HqLDXJ/J1qif+ueLFYT/Z90nAVfDgAU/+G2Fbb4D2XKx0+nahqKr/B/FfXfa/g/AAAA0MAA9f/C0xnwzg1g7XL4t+Kd1+MjpUf6+Gh7jLgo06d+wR+Qb1AxUn5Px0CnIYXEgmt7dsPI6dNs2fOGwnQoOAzscDfgZpTHfE0Fn8SHTvEFuz/dHW+dmsEj5lbll7eta3YRuV/5igTRv4B6vP/ZeEpvBwDU/y/cFP9RLv2v+AJbhP9ntvF2W6INFf6P+j8AAACkjFf/37zuT2Y7A575zu+6QPc2uJz6pR5Qz22Ys8PUYkHZoW2x2e4YcP2CgTcmPVFILLh+UcohmOtf0cXqWBTSC4qfGhHncasyuJsq+CR+Jtc2hcJspgYMIKOJmRK/sAcWxsPL/YVGlfoSoqy/K9H/SfdLLI4NfEtQ/494Kv5DsF7p/xQ1/N9/8R86/J+s/wMAAACo8tOf//nxrvdjnoDxej2vWGdWzwy4eCJqAeQMMy9QLIhAU4vP7hYkXeCIaN3pd49jsTqqg9MFTJFeA7w4DLzh3FURanj9iPVtWIQzD2ZSPLuw8ZgqP7uVJeV+7Y6EEP3TdcpGLTCTeP9H4d9PvoVW/5VRLcdvXvxHEbPiP97D/xnWNDMn+mmt/9MLwv8BAACo8tOf//nlk+nOgONNiwdnwKfNbZMDTvsP9QdkLXc1EbyOEAl/VWp2mB7Vlb0CFbw4DLyxy3GyCKXRtNAr8c9bLSOnRifXwWasxi9RyP1qQPQ/Q8f4H2k6oeqi/xHhS4Cdqf9uS//T+Cn+I1L/TYv/jA//12kI4f8AAACAJk6cAa9bJDfOgHT2B6ydHHDZqKiVWxULKgHHQA8jXAVEEkbWK5DZze0YqgOHQUSWV/BJokj8fmaqXTkNHsjf1DTkfh7G1fyfxBT9Jea7Rf/SJ/cvJQ6AtdX/bYv/2LQrhqH+I/w/i3n4PwXC/wEAAIj46c/+PH3wU82nOQPOOQGv7hw+YxkRbc3mmByQlPwBa79JmNtQK3AM6MJcztwjkpdmyqYLKPQkPn4EzcHoX8MBRa/wZ3BaRpk48dCtqPK/gdzfzhCJ/876ov8T4QITiv6ZTdgOgL3Vf83iP51tKR+41UyNTM7ItI7wfz5k+D9V/wcAAADg89OfvYr/FOO7i0x3Bpzvm2TOACNPwJdxy2JB1mMtbouVHJCxN14Z1/RD0Co20WBlUQTVr7smVF5EqKEns16RANTBE1EPwtGbIPGHnl+ZWqpepVnZXiPsbkDuLzBJ6z+idmi3qbTU/eW2RSHdws/rXwpLADGA+t+DbqGhlYr/8NeV1rt/dbwIxuo/Gf5P1//p7ADC/wEAALD5Uv8vBHEG5HICXt05fEMYGRNcr1osKFJywNUESyIe7BhwlS5Q30LUph+6/C717cRnk/6j8dliyykCQJ2+Vau65iHx55DppBpj6GH05H1QjqyF3G/BLqJ/Eiy5JtGftQnPAcBWpYO99ZfByNL/uruHKf7jEs7oDV3tqi9I+ALh/wAAAEbxs5/9OUsmD+UMyEVT0Ecp1rg7sE4OSAP9Ab0CLhwD1zYaZX/+bq6eIXSGd8oh1UacEdV0+gsOgy2wirjvx3J5hX5wVVO3O0bYwwD6SRaB3G/HRqL/E8byq1tvi/e/w3AA6Crg3Sxc+l+x+A+tX/sp/uMy/F+H1cP/AQAAACY/u8X+v3/DajcO7p0B5ZyAV3dq5AV583I0qskBI4sF9Q5UuyZ+3bMrwFzOCMcA2ViT7B/CVTB4Nlto7o34onTfAg6DObhQ8P1NrS9lqkprV4X7BdG1L5gs777l6kPuV+qFM7n/CUT/QhMtXwk2OUM5AFD6n42t+q+LWfEfC3y++3eF8H8SKvwf9X8AAABwuKv/R7jycRBngOQmK3/oQ/X0owMjtT1FXeTzacWC2tttrwXv8QUDvS2Kds73oCWxoDEZwYzOG/3Zz08vpP1QcBj4xMuEVNEeyBAHfcPtchok6N8JqGs3tTtC5Rc2pszycj+7D/LOLiH68+1qxfvfqToA1lb/yeYGKvJ0W0GK/1iE/wtaH/XuXxazo+/p8H+y/g8AAADQTV39v8BKC0iunQFUTkBxv/Ofo5MD0tkfYFEsaOSNvI4yvpZjwKQ5vtGxiQXTlc/BWoza8So4DHwSpqMnpq9jNjHHt63bkwX9OoMnwipPRbdKh6axnnZXkPsNJf4s55WwsegvNXbb89XJsgNgefW/Pk9C9b8z/J8gSPEfMarFf1gsFP5P1v/pBeH/AAAAuhGp/0cEwrF7Z0DTnRftDxgRXK9aLGhkckAJQ8fAo/hHac/BjoHJovnQxIL8ORdHTRUjPTunOQyAG9woArZwbwp6mHoWDJhHE5V/CYm/2gE1BdxHskLHVlJ2Ev0Z2yuI/kcKDgBn6r8+gUr/62JZ/Gdwisa19VHh/6wFj/B/AAAA29Os/l/gpgUkp86Ax1FGf7UqtXH494LJAWm2kKigF4d9wUC93RJevAUCV0HxKWhDEXuawwDoEVCCMcEkbNbHih82xc7L9UiaHMFmcv+QHo0T/TvMq4r+jF2a7rOpky7nAPCn/qP4D9daXQR3pf6HDf8fyqzwfwqE/wMAAKijpf4fkcW/+3MGPN6dkvetvMMKyQETiwVVMEwXOFn3mC5AIojGN+wFwzpjnHdLF2jAj/Q2nvHv8AAX1CT+2Wf13Bk3CeRPy6r8b3aS+427oy2g8zEK9u/pc2FfE9H/yM0BsIP676b4j9/S/9FQOXa14j+zw/9pyPB/qv4PAAAAUOHnP/uLAWL6yzgDN86AjMzd5QzIm1wsOeBk3AFwDIiYnFjQOM76JVP9zAgQgYciI/wXliHxvDY0S7isLvEfgdzfC1n+xKTVbEPuRP+qBaEK3XpWVl8CXG9yRfVfip/S/wxrCP9fBDL8n67/09kBhP8DAAAo8/Of/cXlE1NngDhy3KUzID379VHdoslk8VMDbJIDjp8K3gcxHkPHwKP4R2lP/46BLOMSC4hx7n9wYFV2ssP5RINYWK5eoW3LlR1XL1Ao4bKTyp8GyOILy/1uJP5c005F/5sd80j/EmcHADv4fVX1XxT+T6j/9O6aYxip+A/HpmSBLRv+37fAiiD8HwAAgBl39f/CGGcA164bZ8Cl/UxyQGp4XqD9AcOSA1K7P+Bqsvp1/oDCOwbaXzBw3Zk5A/7lYxNXQX1TYXyeaGsl2t8z4n/GgRSDJThkVWuvxWWebBWC+ldX+TXzHkQsKffbC+Iq+HmXL2Vkmuh/5OAAcKb+j0e59L+f4j/6Oax9qOraLPV/2Iq1L/4zPfwfAAAAKPHHP/2L560q89ZjqJhO4tUZkFAsSNhI7tPMkU1XPGc7BmpNTa7bo0q+xE+DoSnHOcjrIH5cdD7pa6BxgQwp2UtxJnZwMZxfpRnxObAqFVS62Ebu97kAEkT/Vh4fbwfAwNfeMkHxH25PdEv/Rwv/V2qRs83YXhmF/5NQ4f+o/wMAACDLH//0K/b/eHsAZ0A/ayYHpLM/wPY+K2O9VFNotpY1zDFQaUrW+Li6PXqEKZFk1KH2lZBGnK/gC+2RdrfEWYRYb3qdFFrqm1OfYztf5X8Dud8HzkX/g51Ge0a6/8Xst5Tw4t+UhOH/neo/0Vac0v8txAz/j/LuXzr8n6z/AwAAADTxKFXV3tgZYPr241cTx//lthBbnZwcUKKlkA2v5dxHmzkG6JZ0UgL8Jxb476EO0q5zc0qAPYGXXQbPi2maoH9BY8bdjnOuY2M7+xreuUMEuf9Il9b/JoLon4zj/e98g/qfhOp/J35L/ze07j/8n2FNOYXCErL+Ty8I/wcAANDEn/z0LxJDXt/NGWDqCbj3YlhywL2RAZw6kGtetaxQeMdAV69EO3d5C2InFkwRUOYc7PRVHghyWYQdTM+KIYeVBP0SPudoXDj/YWx9DsUTyP2P9390CSL627mdSIX2G/H90VZQ9Z9sUajIo/hPO+PD/3UaGh7+3zRQCP8HAAAwhT/5aebFv+/fzmIxkp2cAY/X4T5GOQPSKsWC+FzKCr2xdwzkB2DusFQOV7ljfHMOEgucrNUe1B/IFxgTX/gYUG96nzV9x+tX0K/gbYoHqfwfFkZt2Vbu1wnkJ4km+t9s6sAU0rkOgMAv/vVU+n+l4j9iVw1D1Eb4fwXz8H+yAwj/BwAAcCOr/h/hKMU7OAMeX/+w6nmpxVdbx//lthBb9ZIcUMfeMZA34dMxkCbK5V2uguKnopYUyigth/QM2HmsRhJWfLFCOCCaOt0YQsz4yFj+EANyZyu5f5DEfyes6N9t8WxHfrFiOQCGqf+xi/+MLTS0XvEfWQcQ/i+FDP+n6v8AAAAAF0j1/wKZFpBWcgZIagS9dh3kD9gtOSALHAMkOvH5DQyqQfTVjH4ZpXXBAwNQp2lRsXeCoC8n13mrgi1xB6ra83XkfqtyPSSi4ihKbfoX/T+ttV7WaAdAYPWfbFG3+E9nW9sX/4ka/j/k3b9k+D9d/6ezAwj/BwAAcEaq/h9hasSxnQEST8Brw1Mjdjdos5IDUgRRNesYsK4jlEI5BrIETCwgZP/xgkeUuQY7M/C8YDQ18JyJq1OXgMpPIrh962dDub/j/FXs4iP7TxG+Rf/n3s//EQ6A2Op/PTEkbOl/hjVnxX+0URHuOUYmVL5C+D8AAIAI9Kj/FzhpASm0M+CjUU8/t7JCcoDU0uxbzi/s0wWKVrKOAT8j04DTxILH6X+WLVFdGEjohQRIJj3gqTZruUZ3eAAeVLQnmsov76rJiBm3QWNew8eHxF817lr0/7TZfU/x/lfNAbCw+i/FtvS/kHjFf1yG/+uwR/g/AAAAcERR/T/CV9XjOQPk2QC3VgYVC6KTA+4bia1WOLXE2W2ugjnLMfDItjp7NCwYl1jA3J/VoSk6WMsASDu63gJzy6g1FCDUl08gAVqXbVV+jc4MOaCF5X6vEn+1uS1E/+zfRQdA4Lf+MtBV5HvbUiz+I1X/fdzEiRYbHbmvVPxnnfB/Eir8H/V/AAAAvPmTP/rL0/2GTWIgMy3g0r4fZwDtCbjsIG7I6hBuDZ1QKhbEb7ACobFv7BjINczGx8NBC4MSC6YM0ByvQ+ZQVxYIwmA/CV6vArstP8bx2gyJmxfwCrvhpNeLyv1NlwUPU/K4/F/KQNH/07J4qAnR/wjrJcCmrF38Z7HS/0bh/4IOjHr3Lwsfcfd0+D9Z/wcAAADg8Sd/9JfXj4ydAaJiO36cAffGWfXdm54ngr9JWKUvR+AY6DJ02LM2VF4VQi6VAfJ4aMP69Cj+AXhwpmq+KueQHVYb965kDJ7C+avdcNLHA4yTbiu539sMxYr0/zIuu5jn+0L2MO8AQPGfN8uW/h+Dy+I/TsP/C5D1f3pB+D8AAAAeGfX/wihnAEticeMMeBk/QfsDdIoFTX2TMLmPCXAMaFFr9fzdUq4Co8GOMQ7SXnp5YPKDfERirIwTmPYnvgT9LFD5RfBORg99HS/3ezjqN7fOKPVurO5/Cd6R7kF8WiDjAFhb/fdV/EdkbXbxnzXe/ctriDGY6uH/TakSCP8HAAAwhn/5R3/5/HXk3g5YOgNEaQGX9j04AxLnEHQi6+e8SfjCR+ZffRZbgGPADqarYCk/gZQpc2U+qstPW3C8XCGCwB4uZ+MaRuVnfK9Ig95l0AsVNpT7rST+OxNFf6oPZEcaOnl1AMRW/8lGVy3+47P0f9jwfz+Yh/+THUD4PwAAgJT+5SH2Xyq+pzTIGcB9hadvZ0Aalxxg6w84tyuDlUzQZlpgIqRjoJmrJZM7UPgJRqM7jRj8YUxX39YgpKD/Os089enKaJW/9dLjeQwrbCL3j5P473gR/Vsa7Orkx+PkAPBT9qSRbYv/2LNG+L9a8R8f4f80ZPg/Vf8HAAAA+Fd/+FePj0dK6eN2N+DKGdDQGYfOgMTxByiV3R/2JmEpzAP6SOWZnuQYcDSIQq6HUz2Sry/hJ9gJPDaA6QSounMngqZ/x4nKH2vQGlhb7n9U/hpGPW7bpk1d0b9mk8nrIefLATBS/Q9f/KezLeHhTw//N3r37/jw/1iQ4f90/Z/ODiD8HwAAtudf/eFfvf/9ONxyhHAGyOrNuHQGpFHFgmYlB/RQU+hHOwZcpwuoc1z3dSxLFcFPAMBSVK8T/p70Y8r6d4YO+64q/xtNud/HGwtmBvK/keqrNr1wK/of+XQAQP2/bd/el8VK/xshWnKLh/8bgfB/AAAAfRzV/wtvZ8DdE5DcOANaunFrv8EZcKOmSIuYVCzI8E3CFtQUeivHQMg6QgNglipy7ieos/wkAnCn+2R1+Ry6iqZ/Byq/NcqB/Hdmy/2P7D+H4UPi57bVJ/oXzfIpP7p8Swuo/2SjA0v/00S7STQK/1dm2Bq2UP9zwzU9/B8AAMDmVNT/I/W0gOTMGdBgq8EZkG38taugvj3L7gu75IA08E3CdhASPBwDU5H5CZLFw71FgJ7hNO62QkAzGudKZOV2XU3/ztCiPeVr0GJDba7sZ9lT7nes8tNNa4j+XSZ4jyjfVlD/PZX+R/Efltm44f/LQIX/o/4PAADsDFP9v1BPC0gOnAHNOQH39nucAa//WTkDijb1kwMqxMgbaHEMGD7itYfChxjtTpilh4xfUcDHsPnxXocdFpgTOtbNBg+zqwv67lIr1g3nn6PsZ9lH7o8j8d/xGOn/2Q2BjW/0Js4JVPpfyHT1v5GY4f/Tiv80DRcd/k/W/wEAAAAKtKn/R8i0gOTGGdBsRdsZkOz8AZbJAbUuiEx6SyyoKfSjXzBQ4tSPYc/JvuYpRzQ/gS5WB3O2638VBGKp9SfgtohWHQjhcTmKN/c/I45E/ApN18uocn9kif/OGqL/kXEOgBWK/3S2JRkBlbD3TmKE/zOseRhMEWT9n14Q/g8AAGAUZFpAmuoM6MwJuLTfekN+6svRHxArOaAH/mP8XFfBJMfAULtVuGvcv0LM9BMwIcqfrcbKxwYybCPW8wkg61/wrfLHkPIvaPx2WB+2idwvEjbVWh1EQfTPf9Nlto2mJ433PoMcAFOK/6xc+n+P8P9hwj3C/wEAAIAn/eH/JThpAcmBM6DnpunLE3Ax2tod6+SAvM37R54e4EoyARwDQ+Dq//yD8+8q4FCWDBTYzLsA+jgvF6wUPvE0/TtQ+VWIoOxTjQ6V+4PM6xesDjsJ9k+9ov+REQ6AEKX/O9tar/iP0bt/levsI/zfogMI/wcAgF2xU/8vcNIC0iRngE5OQEmz1ysWpHUjzDpeaWOecgjiOQaYJlwjyBNYJqXADlPvAtdwyHUYgcOIY4wtCCPrhxWdLzze//GD7ktDNY11MV7u93PsHPiJpaLN1drlINR+ya3NHQBTKv+khYv/9OWWBwLh/42Q4f9U/R8AAAB7Mkz9P8JMC0hTnQFtN7P5ffX8AQOSA96IjYt2ML4xieUYuDPuZcoT7hDhJ3BHcZwxssATK8n6QR/OR4fz21+CnE8E5P47syT+O8qmJaqvqOmwLwF2U/xHV/3XB+H//Vio/wXI8H+6/k9nBxD+DwAAWzJF/b/ATAtIw50BPTkBRL0dhcr7meSATEN9iLoWxVtQEC/G6e1MxjyBayaVJPVOw08AwJp0XCpca/opgnjKwVDlt7wKxx38XM+3lvv9SPx3rBpjqP/NTds6AHYo/qO7e9TiP9qoCPccI8o+iekg/B8AAICcf/2Hf9UT6q4OPy0gTXIG9JQG+urF5Tv3xYJkPWAj6152a9VKnAVj7hwDumgHr/GmdY6fIA1LqV57zYANMThx3Dyc7iTrX/Cp8i821LbKfpYgcr9Q4hfsYYFt29V7k+amjzsaOgBmqf++iv+IrMUt/uMy/F8Ho4j73IhND/8HAACwIf/6EPvfE+puBD8tIA10BqgMlH1yQLIrFqSIQLWVfmHvGJhbR8gzrLGf4ycwsXhD4+2BZAMAUKws2ZNsrOnf8aDyLznUt4OadJSO5X5B6zMC+bOM68HhkNUbvRu0cgAsUvrfT/GfBvXfU/i/SP2nI/eViv+sFv5PQoX/o/4PAADsxr/5yV+XFHZvzgBRWkAa7gzoH6KaP2CV5IBOSsc90THg8wUDgfDtJ+jBuje2oWFYvlOwmVNfJ4YCkPXLPN7/UUf0VkuTHozGi7J/hwyJHtKLxkY3lPizvIIEBoj+R0wcAIbqv+77uzvUfxrd4j/GrX/2oe2QjV5m64GB4f8kdPg/Wf8HAAAAOPBvfvLXxz8rCrtbZwDHE5CGOAPeW2uNz5hiQaVyN6yP3BDIMfDugefxdMi6foJmbPX/RQYpKksPP2rC3DBU7aUsrfKXO+zpUOQnyODe0825kfiTk068MRP9n9TMvn7VQ70EWLv4j2Fbc0v/j0S7+M+24f9k/Z9eEP4PAADgwEX9v1BR2F05A6RpAcneGfAwGJYhxYIqDdYN5w93+tpILh0Db4u6JpFw8ETTT6CLr8cOkmDdBYZonC1brSfDSjuKhC3aU+2Pt86eaT2VnFbgRahFAAAgAElEQVTvcaPyz+9BnYmi/2cHTpvoOwBQ+l9sTV3991T8xycs9d9TwX2E/wMAAFCkrv4fqSvsDp0BTDfA5y6Hfys6A7SKApWwTw4QkW9D5DBw8ppiB46BRpxJTt7zGyYM1kf2n3q4mn8wEej1BjiK0BfhVeUPLOJniansZ/Ep9zscKILDO4DsOs+J97+j7ADYofQ/zdx73pGthw3/n0nT63+tQfg/AADsA1/9v1AvvOPEGdCQE/C54+HfYmcANSACm0KGJwf0055eYL2u1nMMTIKb37Bn4oLJ6vi4/F+V3dezMZDsJ+HMb1ol2iJ5ZP8ZjoWU/Sx+5P4oI1bkPGJzRP/PnhCbaDoAopT+72xryeI/HsL/VYR7teI/nsL/acjwf6r+DwAAgE1oVv+PkCK7K2eAyA3wuePh36yd8zdsH0dbY8ak5g9gturrluFR/ONwPFMcA7VGOzvkawoMYQpwe/oJ2jD1LqSp1/OV2OYUn4AXWX/eqTLs+OOp/N2TEuQ480yX+0OP3mHxVO5LDWmL97+j5gCYqP5rhv+PfM2Am+I/jWiH/9M4q9rfQlP4P13/pw+E/wMAwCaoqP8XyPfxTncGNOcEfO5++Lc0zOO8z0fWGSA3K+3BFaI5aW+m3Z09Mv9KaZhjoHLcve3q9jv+7TP8BH6Iv5pAPBxV4DG4xvg4sCKPyl9TsLnMOzgwZabI/bGHcbbE39KiXDEO9RLgHL5K/8cs/mPkvFEu/qNkBOH/AAAA9sRC/T/C0dmdOAMa3ACfux/+LTfxuErTY5MDDv2QoekwGHFLMtkxcGu3F1/uhE4sFwD8BABMxJFML2XvwPA0XuWHiN+HRCAW76HfB1fkVH4Px2Iq+h/t6zgAZoX/68bjDy79H7v4T4cfpZFh4f926r/L8H8AAAA7YK3+XyDTAtJUZ0BnTsCnkbeF5r2nJgfwEd2BOU4vmO8YaGPKo6nVUDioQ+WlQsgZuCXAeHyeCzpsr+lnMS/ag2HvQ3b4hYh1CyLNi1eJ/464V0KJOLu1ggMgUOl/FP8ZRuDw/8Wgwv9R/wcAAJZnsPp/hCm1T3cGNLsBUq8n4GXjUq1/UnJAP+PSC9Tu6aI6BkwZc8csfrvyhYXu602lWHgX1iBwiL0W0JcZeFD5dxhnPnKdt33XfgLMnZtaPQ20dFIiDpOb9joAJr48dtniPwPV/63C/ycX/2kaNDr8n6z/AwAAYG8mqv8XOGkBaZLk7SAn4GwpVyzIYXJAP8w7vMzBlo4fjoE4tM8+8UVTM+tiHOj9gSEGV8ZeHEOvP0bnZxwfVH4GsZT9LF76cSGyxH9EocMMcVjUSpcDwFb9Vy3+Q6j/nW3pFv8Zhd30KYf/M6w5GVIpZP2fXhD+DwAAwB98tX2iM0AlJyBpBSwGKRZkR+mGhusYGFFKqI5ybaStGOQn4LfUwL0P4ZSMIuscyb44uwBFWVK3fkbp+AGyDMaQXnijVdl3PVruOpcbNHedpLDM3avZbm7X60uAR/4IRS/9P/gHe3z4vwYR3/2L8H8AAACd+An/L8FMC0jDnQEqOQFJX6ZnvUm4gjOdpxeuY8A8XYCEismQWYM7IYPCKRDoCbROOBEFiJh0hu+wrFbQ9O/sHc7ffmj+Avaz+O1cnHL8FYZ2mPIk9Xem3QEwsfS/r+I/Imtu1H+74j8I/8/Q9PpfaxD+DwAAa+Nf/T8iEtynOAN63ABfpg7/1k4OOPJx2arwF0FcHTmOY6ANXXeCLoJVM2WBeZ/bGy2j5NC7EPdqEplwq92IbWX9C3EPW6fn1xHzPh7e+/fkplnH6PaZmX0uiP5GXWp0AKxT+n9s8Z+qqYhnSgwihv/TkOH/VP0fAAAACxNL/b/ATwtIA50BWjkBXwbPf6p2/mCbZfe1UYe3gNvUVHodAxxbuyOJBCp+81H8Yz+s6/cP2QewwEWFT26sXI7f8PPF5SiktKuInyVkp5+c1epABzK/q4yEkgGdbHEATCz976ut6aX/Ef6vNaqm6n9T+D9d/6cPhP8DAMDChFb/j0g198HOABU3wJfN859z3qEo8haka6fjphcI3jHA+k6vB5vCLAoMP0EvWHdgCuyF52OF2r060crwCDRK63SZcchSB5OCyf3zuyesGTWlw2IHwFz1XzP8v7Ot3Ur/a6Mi3HOMiHwSYUD4PwAAgALLqP8XRGkBaYgzQNolmfHDv53d9I1OL5h4+Cq3U1KvigK73AbCTwCAPtXrxyoXl+ZIStVe+Ic43ggvv+1n8cN7417un98loe9qfocPPDvj6SXA65b+Jxhb/MdJ+D/NMOF+ePGf6eH/AAAAVmVV9f9IQykeazH98fGw8AF82S98HkTK7E0vCH74yk+AE9wJYzC88W/xE6i3KwTveQZcqHXmSoMypunE2GmA8myo8i91MHXKmrXPQZjcq8gS/5FSx2QOgECl/wlQ/Ecbn8V/5of/d3ih2qHC/1H/BwAAlmQH9f9CQykeI2fAywPwcW3DkvVq9FPpBafhje4YaGP2rW2NrpFn7jzKTzAb6ma+yzg91mufRNPZIsReEcj6StTGJKDKH6mvFkRT9t/M756kVs/83rLhdFXgAIhV+h/FfzSZomKPwV+sPR3+T9b/AQAAsB8bqv9vml/Pq+sMeLz+8/Fl68PVo0PcGv0vHinBMeAXo8XeUsHH03nnj6UkDzCHGddTLEsOsVR+R13xQ1mejjJc8/sZoRx/Pw3d5joAUPrfhC2L/2we/k/W/+kF4f8AALAfO6v/F5pfz6voDHgc//nxtjY0OaCfUN6CdsfA7J4DGuZShJ8AgAxQ6v1hPj4fIxp5g+nmEl/ZvzOt56vU6sli11uWA2Bi5Z/krfQ/iv8EgaX+I/wfAABAfKD+32nOCfjc/fBvpcyA5Dw5oBOvxYhox4DKJGx2l+0UQz/BMix0zVkZ+2WJhcDHdqwyc+1rcnz1xidhS/E0MPSIlpb406QOO3gJcPUXbuXS/6sU//EZ/j+fKeH/FAj/BwCAxYD6T9KcE/C5++Hfes6AFDo5oJ8WrVa9fYH126aPyl+97CZKD2b586y2frC2YrL8oh2PYEjda/T9rHY8Wuyk7KdZB7VoOf4nDjtMOwBQ+r+xJ+rqfwcrhf+rFf/xF/5PQ4b/U/V/AAAArMS//fFfv3/ix95ZxKMzJ+DTyNtCd3/OBi/JAblGtpxfN9X8bx3p7UFtcq2neqHHApDB7frZ8hoGxiFbYP6q4Vuz0aFmuV658uOx5ChNPqily/HH6m0iHQAo/vOF4lC0PaMj/D8QTeH/dP2fPhD+DwAAK/Fvf3yK/S/ds8ExcKczJyAZeAJS5ini/MHH5f8X9vIWuHEMNJOf3FZksx9udcSZ1i0It35AaJpC9TddpOsfNk/Er32xEO6Oke1Uc9fzKoN6O+pGp+YAMFf/3RT/Wbj0f7Kcx/Fv2UX4f3WDWNdSAAAA7VzU/wr32wC4BJ5o5QQMVicLs1cUlGmHwULrIb5joA1dd8IUyp1+TC8YBQBIKUKFEP+scAydQMSncH3gvLr8rg/hxrjeTkhfvR5c0QEwV/1voKf4D8H00v9T6EinyOIo/H+G+j89/B8AAAB4glyBOz05AbovCVCHdhiIvAVli57p7LLDaV2O8hTRo//5Cg34CQBI1lfo/PkT8FehzFIHYwRE/Cb8jgZ7Qhu3c8BigfwlyFuhSS8B1i7Hb1v8R5HhxX+chP+rpESohf9bo+07YUGF/6P+DwAALAM//F8EcgX6cwIuAzb7QUAM0guy4B2/vmG+0lnmJ1gYrEBvKK/JVi1vbTAKLG5VXDBuHPyOEi9g/47fIyoTR+J/TBzevAMgVul/Aj/FfwKp/+MlbA3hPm7xHzr8n6z/AwAAYA+M1P8sO+cK9L8nILlPDugH6QUNqB/ikkvLAKafYDFuBwwXiENaRbrNwUg1ApWfjd+R2UnZfxNI4k9ehzrjAEDxn+bd9Uv/e2X8u3/DjG3T6397Qfg/AADswUj1v8I+uQIq7wn4NFX4fB9BUpRekHEcLLrG+lljYPY5EcZyWx3KA/02t8YyBOPAirEFKv+ZMIe/pbL/Jk45fr8Sf52rA2C6+q9Z/KezLd2hQPi/MQj/BwAAsDZO1P8sO+QKqOQEZMwKt99EJ33c//lxOXY4BpZCZRo3OTs8gdNvBTCL82l9ucJWcxf7YJuU/diHXCBQIP96439yACyl/tP7Ks/mPsV/EP4vwjz8n+wAwv8BACA+ntX/CuvlCrxzAq5y9KjjErWzmB76yP51nYnXp9WdwZLgPcBgeXAlmwY0eg1WG429A/ZLQOJ3y6SXAOcYWfpffffQCvUCeAn/t0ieIMP/qfo/AAAAohNU/c+yTK7A43IoH+d/+TicTdILcocpqHzCOOrcJj6mGDSAqasQ5SKASQQyvlZ2Zu1gOYnYYrig7N+YcGhLl+Mfw+Wx61vpC308lf7XLf5DqP8I/68wLPx/UvEfMvyfrv/T2QGE/wMAQHBWUv8rRMwVKLzj9/Ku0Ugvud0zvYBx1LlNWC81Zm/ie2GAfcBKBGEoa/pYxnzWH6vMT27LQS88UDMPDRK/NnU1+BtnIwUClf7XZbj6vxgc9V/kkzAE4f8AAAC0+Xc//h+Pw21tvtjJosTKFbh06uoPyH2RI1Lhmj29BSQu3Am8fgAAwBxql7b8xQuXtB7Cj56SiK+5v3scHeCub9wdg0jM/ybdwYKRijzdVvDiP4uF/+uwa/g/AACAxXhUb4A3cQ+EyBVoFccFhWsyX/sbhzfwFrTR6E5I+oM4ZFKaGnG87AEIQPG02/o9pZ6JOuAQ8ZXwddRqNwcLluO3PaKmkf82Qv2vNtGg/veE/xMEL/5jinKgvVLxn5XD/0mo8H/U/wEAgND8ux//D9H2JffA8o6BWLkCdzrE8TXTC7L9WnwRu2fIYlF4dLr7B3tsA+ACiXKKle6BZWcBIr4ljobC5JZrb4n/MqTNY9E3NfYvAQ5U+l+XGeq/afi/CEeJEV6j7Onwf7L+DwAAgHWRqv8Vts0bCJErIEXNW3D7Wrr3YDrbX3aVgzO3dfL6gOknYFpdh2hvpGg/k/0eld+eLc3Ww349jyDiG+JrcAxvhtYs1NMu8SturIe9A6DKssV/ZjxfLlb8J3r4P1n/pxeE/wMAwLooqv8kW+UNZG+WFvAKlJAemVp6gb8h1e3RgufGZhT9BNsheCNFZatthw94AMsvT/klyVkwjFJ8jZjVfcmasv4RK4nfJcYOADfFf2KU/o+/nkbCUv8R/g8AACAaI9X/CvvkDVy8Agv7A0hGFSMi9vYP3AkARDtrgXe2XlHytyLz2Xpg2TgdJQTsayA7TIUx95Wzenygs3QAeCr+Q6Db1eWK//gM//eMefg/2QGE/wMAQEycqP8kC+cNXO+plnqjkybG6QW1VyMvhtHx7bAIAQAWrH7RbaX7hckNYC74RBorKPvajA3kNx1gQ5+fmQNAuxx/Tf2n91WennWK/7hErfjPmPB/i9f/kuH/VP0fAAAAEYmi/ldYMG/g3WXJb29HKP2yMMck887WxgEq7LbNPdQ2B/rJJucR2JndTupG8tcC28HD1GgReyQh61syvFZP+3hn97RbHfyOznkHgLIi76f4T7P6P+uO1WX4f3TI8H+6/k9nBxD+DwAAAVlA/SeJnTfQ5Ang0BdKvxp6idMFS3AnLMpu55HW0os+DnVwgq7DaaW2TCwWwzCiDvWcqyGU/S+iS/xWjelh4wBYt/iPw9L/puH/49+yi/B/hP8DAMCG7KD+VwiWN/Ax+S4e6QUVzKrzD3EnlNsB6mCkn2AcQBfENVB/fWHFjiHqOHu56Xmc/gdeBCrHv+TcGTgARhb/6WzLQ+n/iWiL147C/+e9+3d6+D8AAICIfOd1F/Hbxer6aeAxb6C55eF3i/AW9KA+XZkCR4UtGg2LiPbsAgCoMVyL99UeyBFyFibci9T0+nt3Qo7qKAJJ/L07B0TbAaCt/vcQo/Q/wv9PLXK22e0kPUOF/6P+DwAAhOPf/+j/ff/7O9U7CrgHjlTyBtwlDbwR9cu3tyDBYSBndIICe3/HaPRy76cH4I6xReqx/GOxyHwtVE5nkRnpo30QIPF7Yug7ABoUeRT/sSJm+L+j4j+pZQzp8H+y/g8AAIC1OKr/JHAPMMn6BrRH5/ROgGrUWGvLvr0F0jaxOtVZ6bHWtihSbfHpLsyV5uSN6bm75IjJwBCEY6MpcxaMD9SZquwfCVurhzMOs1fz4/X8qOoA8FT6f4fiP5HC/xnWTFwsYyHr//SC8H8AAFgLkfpPAvdAnfHv7n1c/l/lI/tPPtKd3KcXHNl97W7ArKfjD+2WZz/mW/BIqufgikME3IFl9gVE/C1xo+y/CSvxp9HR5/2UkqT1HAAji/8MLzS0WvGf8eH/Oq0g/B8AAMA66Kr/JHAPOOeR/WeBXm+BdL/Zz15mtfjB7sxe2mHAQIHx7LLqnP4gQcT3SNd0GK40jWof/SZ6kAyOSle10w9ZnRpUAki5+E9nWyj+QyEK/1cp/oPwf4UOIPwfAADiMFj9J4F7IBYib0EaXIwoTX+Mo4FHAQAA+Li/qBvj9xL/yPwLBMRfwP4TzWW1m8Q/pAmZGSUHQHUoQ5f+p6wtWPzHJ9HD/2nI8H+q/g8AAIAoeFP/SeAeiM7QYkTS/Za4wYFHAQAwgCWulzYEuGhCrN8Rl8q+/gJ0saSdSfyWNHZfwwEQqPS/nA2L/0QN/x+m/ucgw//p+j+dHUD4PwAABCGc+k8C98BieE8vqBP8ke5NrOPASQ7iEutcWwfXV41H8Q8QB6cTFydg38piDy4k/rrhAZe29iMzLwGkrsh3taVY/GeS+r8eHPVf+Y3EnSD8HwAAQCvrqf8kcA8sz+j0AnYDOuAWjAEGCYCoBP4RRkD9FqhNbuClntZX9o+wZ2qSxG+3rzndDgA3xX9ilP7vZr3wfx32Dv8HAAAAggL3wG5I0wvufFT+sgAeBQDAGNb5xbte5nDZ2xzNBbDOaZL2kvWPBAjkX43n0fY5ADwV/yFwUvrf99VKOdBeqfiPr/D/KVDh/6j/AwAAIfgPP/ybR/UW4gN695mKe8C5b0B67+L6YJzxqPzVRHiPwly2v08Ho1nsDDIH1WyADvFF/NjLP1LvpbHXNr2INWbqZA++wwEwvBz/yLZ8Fv+xDv8X4ShDYmR8vXwY6fB/sv4PAACA+PyHH/4NuQ3cA3zm+gbU73FFBrEOdAnvUZjL6scHgAGP0/8AOBBmVUy7+IcZIQ7BDqZ10iHxD4AzFlbvAFi2+E+z+j8X7eI/NNuE/5P1f3pB+D8AAMSHo/6TwD3AJOsbMB8fO/O3o0F6gXN0PQr36Zt4c8xYS1huoAT1UDOmFwDoYbtoV76aDowVHtZSaDoWm/EIT5hAuyYtzmlRb1sdANsW/2lmbvi/NmPC/1nqP8L/AQAA+EZF/SeBe6BOdnw+vNwmVhH1MbcKkF4QGlfiBaMzrvoLAACfQKzXBiK+e/zK+lNbm9Wkg5Xc5AAYWfynsy35it+z+I/P8H//mIf/kx1A+D8AAPhmjPpPAvdAlsf5VtzSHzBKhB/rLZA2CAAAAJQY9Gjt8XdrujBozvpHOJIwyv7MZtVLOurZnYbcAWCg/tfC/7XbIgyuV/zHgH7tXq34z8jwfwvI8H+q/g8AAADPOFH/SeAeeHLzB1T4+NzDqCMyWidIuh/SCwAAYBsmP4j6/cHY9wl98SPXuCka2oEz+yj7mm03jLnppcl4OJXfATCy9D+Nk9+MtcL/ae3efdX+Rm4jSYb/0/V/+kD4PwAAeCaK+k+yrXvgfdi5I1S428maaBrNZdMLOrsAAADLMPMZO/CVd740Mb8HuzFsuQ5paN76cbFydToR6Apm2dWH2AHgqfQ/iv+oMP4tuwj//wTh/wAAAOKzg3ug6gnIb9nfFod1vAVPhheYX2F1AgB4LPJktcJly+9U+O3Zbqiuc0zrGXfjMSeQfwPuAytxAAQq/S9nzeI/rbWVSjgK/x+s/vsL/wcAAOCZZcL/O1nMPeDtjtC+VNDYNwKoLweq+87S92VYrMZgJ6Q93k55oAxWfEpxl3nUfu8DRPyhuB6hKBJ/pZ8hfi7IcVYrAeSr9L9wcqxeSIvw/0yLnG1cX7wGQYX/o/4PAAC45T/+4G+yv+BxIwqMWMw94J910gumtDA8QUHA5Uhb+4FLFAGuScCcYGdhsO76YcuLiePVoti14bEMU9Hs3GyJ32hHJj1Hz+8b2wFQ7c7Kpf/nFf/pJWb4v8fiP/KRpMP/yfo/AAAAYvIff1CM/a8L2nAPXKi4B+AbGIC/9ALVxj00UhqA/oZ2OD/I5bPDIOwIfilrYHRMsA7KtDW/D04G0kk3ejE5jFG/yxHnYEyfeQ6AkfdPKP7zIlj4P8OaVabFcMj6P70g/B8AAGJSUf9J4B7gs4hvoK2nXlfC1OD/mLV8NBu5j0CcE6GNEcfn9WQDzsBCcQTE+vBgjA2xHdyB9x0GB8J/4VdgFEoALVv8p+dRe/qaGR/+r9MKwv8BAABEpUf9J4F7gEnWNzDUK2DdlMi+14Wh1S+zwZ7oUdBq2uvcq3Ef0uUP2TUYfXBiuh6CNTkTjP1oDEd80rlsKfEPb/mLyVdGhgPATfEfdfXfCo1udD2oMjRrhP83Yx7+T3YA4f8AAOAPU/WfBO6BOnmvwKQbx6Hvbl3CW1AhTuS//uC6d6JYo1F6tN8EACFwcJ4vfbotfXBLgBnKMPuyYDMpzqd6cvcoB4Cn4j/qu29b/EfKvuH/FpDh/1T9HwAAAN6Yq/6TwD2Q5XG+C+/0B8wdRZ16/dIBWHHl6B7T+LD/BlacRgB8M/thf++zfu+jjwxmjsXsy8uRLSV+11QdAAbl+A2L/0gNblz8J2r4/3j1/zaYZPg/Xf+nD4T/AwCAN5yr/yRwDzx5XJ8opt/SGaJTr3/19IJ+tjxoAKqsfGVtBBeKMxiPlZkzu7jsaGM8j7gIqHF5ymt/B8CyxX9mq//rhf9zLCj7JNyC8H8AAFiL6Oo/ycbugcFvA+sfSqt+TvAWdHYCAF2cPZ2tDc71qWD4W8CojQDXYXsGruQ5J81Xqx+lL/IEWn31B7eyA0D7EJvVfxrd4j9T6VX/tcP/6YEaJtwj/B8AAABwxh7ugR5PwMgh0BHqR3Yi8fuh3t+Ii9PhA6jPYbQfKJ/HDZYDC00fjOlkHP6QbcDwZT+1oPr7X/zFRha/aewLa2eVc4KpJBccAAbFf4p0tuWn9H+Ea5nP4j+7hP+TUOH/qP8DAACu+E/f/5/fOdw5/NZbEt9slnMPxOtxGSuhXsqsmvvzPQoqecOtO6odfYRr3krnLSiDeV4Hv3MZ4YoHsvhdVGyyq28rZf9Ni8Q/EVPvgpCcAwCl/xvwUPyndZBLOMqTiBBZT4f/k/V/AAAAxOE/ff9/Xj75TvVGAu6BC8u5B9bGRXoBifqqGeZRGLzecXrZgzEGwVhtyeKeazlWW6JCLA/f3dAGk/jjIH4HwMjS/zRYDW/CvvvXafi/vP5PLwj/BwCAONzVfxK4B0RUxmND3wDniD0tIC/pBf3st9Z2AzMMnLLU0vR7jffLUgvANSNHevyZ4HcdQeKfws0BMHL0UfzngLcH/zHh/yz1H+H/AAAAPNGg/pPAPcBnDd+Aek9jhOjnmVYHKA5xVvYndrMQbiiAIVgNXJa8LhqAFRWTKPMWpZ8KnA4V1x83nB0AI4v/jHzNwNOgY/W/l7Dh/04ZH/5PgfB/AABwgoX6TwL3AJPsSIz0CkR5tlsnRD/DzDpAPKIskx52OEYBGA5wItQl1S04rZYDUxoAKPvheBwmTVACyFfp/7WWmrcn937tXq34T4Twfxoy/J+q/wMAAMADU9R/ErgH6uQHwPkPr8WkdRxy5PSCfpyvFaAGZnoOy10yVmWzE2SzwwXbE13ZL5+xD+vj8TZaj/JgHBwA1V4rx+MPL/3vOfx/wLt/x4f/B0Ye/k/X/+kD4f8AAOABn+o/CdwDeS7HPeDWZvpISzvQOiZLpxf4AkPt9JlkvYEG/nC6+OeAwQA1MuvD51Wat5BFfY8u6x+pDk997EwvEbaZxvxJq+j+b14OAIOlgOI/TpCq/wj/Vwbh/wAAEJ+g6j8J3AOfNPsDFh6h9kdMGf5L9gxgzL0g7jhPRFwowBKcIBIwWmA01zW33jWcd0QLn3sdEv9EbDv2KC6LlnZZJYCWLf7j4FVxA8L/lRkW/j9F/fcX/g8AAGA6q6r/JPu6B0Id2X2SJnR/VHrBFNueDu5A8zTPfwDqINS5uRuhV1ZkMPCG5AcXFyIAWqnW6ulA5az0eDXV7NO3lPSL/9TU/862dIv/9OCh+A+nibjh/5tAhf+j/g8AAMzlP3/vbx8fj5TSx8J6dxP7ugeG0HOrFKBkv1arQ+4oRzQychpwauqBR5oNwCSHIUylFwBWhHGt7L6cWp/RpvYd/Jh8i3S7uVbpfwW0w/9p7V5DuF+p+A8d/k/W/wEAAOCY//y9v33/+1G9c4B74ALcA1kc3PxfiV1HXr03/TPka4DAJw5PvQ3AqO+CYKZxhQRxOC7snVfuCGX/zcID7eDQiBJAvor/SA0aqf9KOAz/J2BYs8q3GIO8/k8vCP8HAADHHNV/ErgHRKzkHph/T3ni0h39kQyQXtBDnB43LLw4B/eJs5OLT9iOg5hU7z+G9QIAp0iuyMVt2UaGnnKdjQ1V9t/gojSc9yzWHADRi/+UTTmoLdXP+PB/nVYQ/g8AACAAIvWfBO4BERX3wK5j1XzvOjm+v7nfu00zXgI8A4wHkNG1Yna7qAENcJFqZeLIDW26wy1h088ZFzrmkWx1DS6NCeslwAq4Kv7Tg9KqGfDuX4T/yxgf/k+B8H8AAJiFrvpPAvcAn8pYBRwoh4/2XuL7p7/ItweH87oKGNrA0JMX7hIO4tB67cA1Z+IMJbAAACAASURBVBvsrj8uFpH74vtVVIbQdB6c/HyRx1h0AGiG/1ODQbTlp/T/uiD8Xx8y/J+q/wMAAAAkuAfYZAdq+Phs9ePuxVvAIebExOw1yFF2XY7sBQCO0L7A4YIJXF5RHXYpvU4XT30LfQLP9S7wW887AEKX/q/ho/gPwv+LuFH/yfB/uv5PZwcQ/g8AAJMYHP7fCdwDdbS9AqEfT+aCt+ti8QQAMj1YD/tLT/CLG85usCGOa/WAC4rjlnEAKCvyKP5zxuGTeP+IcSwo+yR00X6hAsL/AQAgKLHUfxK4B7JchmWB7NCcl0O2W4Sl4KcsUPwVsxCNix+ASehdPra8EOHsBqPgnGBYj0+2vBiFROcdACj+Mw6X4f86IPwfAADAVBZT/0ngHnhyOVA/N4zXjqhPyMEgI9nTti8zcDPTcnq6Pn3uINkDDpPOz8CXhS5wDoIVsT6ffV4vtM5mn0cHerg6AByV/tdljeI/nCaEej0RvK9U/Gev8H8SKvwf9X8AAGA8u6n/JNu6B95HZuQJMJf1jTj3k7qVqewKrpwTUsY2Bxyz0EwtdCjW4HJpD5YjWBuscHDn+Vh3cgD4Kv2P4j93xkvVw4gTU0+H/5P1fwAAADjjv3zvb+v3JXgkv7CDe4DvCYiq6dsh8hZQ2wUaTqyEDemTWiDUKIFzbSFwVgAAUvFS8P5Y/7q/0i9J9kntywGwcul/P7ncPRgU/0H4/31Uyfo/vSD8HwAAnPFfGLH/cA+IWMw9EK2/YSmMc/udWZ9HAWr+YnTc4jt+ljmCJQrKBFnEAICNKF+XXt/Uftdar2p0q0TDbYz5ia4/gnW9A8BP8R9D9d9P+L82VgkT11YY44/wfwAAAJPgqP8kcA+IWMw9APyi7lEAY9F/uJ8FrmrgjL81CgD4pPP0xPX+TXUkORK/DawWTb0L3E4I4Onenw6A6MV/yqZcqP8KuHz37xgXgiHjw/8pEP4PAAAjUVH/SeAeEFFxD8A30EbDzQ0G2jNad6sWsxxbsse6d4+PhQJAHqzPgNwmrfuH4FEwXMX850e3AVlpzK1+W7kH23S1KO3EHuFvaWzxn0il//Vw+LjaP2hqxX/ihP/TkOH/VP0fAAAAwxij/pPAPcAHvoEjwlsKYZXIz/+zRnW7oVeFPTH695AdFj+8KF3bLz4f0wDAaOQrP7fH9hcQYIhsdZlfyzXcEhvL+k7oHvPGEkDNxX8IXJX+97OgXYb/rwcZ/k/X/+nsAML/AQBgFE7UfxK4B5hkfQMRvQKSO7ABd2usJqRZ3PFmhcdEKX84fb6D/VhgysFWDFmxkka2vG4AoI8ztwQYzDdfxX8UcaP+D3j2VH73r5IF7+H/rcu4CML/AQAgCP/Pv/hfs7ugA9wDdZx4BUxD9XvJDkZjF7i7aZV9NZ1IR2o+zuRR4E4dTEdjEbJt4NoCAADb8Oh8CfAVP8V/OtV/PRSeMdV1apJh4f+eiv9MD/8HAAAwhqf6/53qrcJvA0aO34F7IMvFK9DsD3AWqn+gf2qlFowdBrz9+w8bUn4wvDzvAX+MXRutreGCAAAAN/iXVFxE69xHUuwAiFH8p5NQ6yhw+P9ExrtVqPB/1P8BAIABMGP/S+6BNRwDT+AeeHLNEhBMcTRZ3w5R36yGbfidp+cZcYzvJwQgxmxCeYZxGgIAlBjz84SL1hOV0TadsrgzVRkWmQOgWf0nwv91h3al4j8xw/+9F/+RQ4f/k/V/AAAAzKa/8s8OeQNP9nUPvKcYD4JGKB6y1hzFmYUpqxKS/Ug6Rruwa5zlDYAUXJ1AOHwuWoe3ZtMJ513gdFjgAHBV+n+L4j+cVnTD/xnWDBMv5kHW/+kF4f8AADCbAXX/d8gbeLKFe+B9GNJ7hMjHfz9W10fjunMEXp5YcnjumxMg04OtwDUBgLXBOT6YWQOu8Q4AFP8xYnz4vwYBwv+FA4vwfwAAiM7ct/7ukzfwZDX3QLweX+l5zBDtG3+oGsGTs2eaZgcyPZgDLiYAeKHhgo8TuJPjmGMwDeA6APwU/6mp/5sV/0H4vwrm4f9kBxD+DwAAlsxV/0n2yRt4spp7YB4On4wauuRwxh0O7G7IpyC3h8O1BWaAM3o1bE9trBfQQePiNP65crWoi8d66+VH8Q8FXI3JQFgOACv1Xxc3xX98Mka7Xy/8n4YM/6fq/wAAALDDufpfYbe8gSeVY17zgM9seMegfsiIHpsCJHuQcMZFx/wExAIBIIvxqeHCLdF5jNpDtKt3QaMEUAFa/V+0+I/P8H+CYeH/zt79S4b/0/V/OjuA8H8AADAjrvpPslveQIrsG3D8ILAgq462g+OCZO8CBysBaKB27mBFYAjAOnj6Ud3nxFrZu/A4PzDSDoDm8H+CRYv/+KRfu+dYUPZJWIDwfwAA2IaF1f8KyBt4Y3qo+HUHzfAWz3mrNU/clcElYgImpwlm8gpGBAA7fJ5fihdXuwP0eqNk6l3I/P1qNd8u4QBA8R8pq4b/64DwfwAAAEPYU/0n2SpvwNHd4RK8x3PBtdIBY5lByvcLrhInJi9OzEZKGAUAgD9CXJesO+n19u1R/COHSQmgocV/+tV/V8V/OK24fPfvjuH/JFT4P+r/AACABf/1D/7ukvD4saLArcieeQMgCZ6XHpl/Me6hAy0dBOaHwP3zhjGNS273YXuDgQAAANCA6c+Hyu0kp4c1B0Bb+P+2pf91GC9SDyNaND0d/k/W/wEAADCc//oHf3f/8FEVuOEeqLNV3sAatGjZqeGuuNrO476FuIHmFSYOzO9pDFTZUXKFTL/YwQBgDM6XZvDTDRZg2BWg6ADwU/q/as3RpdJn8R+E/5cg6//0gvB/AAAYTlb9J4F7oA3kDYykIVT/k1nzkGlXfBDs184iMF+ZeHf2bbQsFddj47pzYA/MFyGu8ODAhIveyGLn45oCW5B3ABTVfwqL0v8o/uMclvo/PfxfuKQR/g8AAOFoU/9J4B5oA3kDHOLJ+mOoHd1GCudGh8pHtvKdDqHTbgHHDFoza/+yAKDCwNOEEa47oBcZcKkIivAdAH6K/3hS/3UIG/4fEfPwf7IDCP8HAABVjNR/ErgHpCyfNwBNH2TZV/MNK9k76gqwB3HrAIB4TLqwDPZM4PKpRcYB4Kf4TxT1Of6zah614j/Rwv9pyPB/qv4PAAAARWap/yRwD0jxmTcg+VGHrL8+69/kxZTsvfQDUBjOFK638cCJC2KBqwwP1XG6XiaULhubzOXxEerqAGhW/4nwf2+l/71Ntcvw/1Uhw//p+j+dHUD4PwAA6OFW/SeBe4BPJW9gxDBdGsfMLESYG2LlVefiuF10Yj/ahx2XvjDg3FqNthnFKWuAysmFmelDafwemX+pMX2Os8+RwhJAJdO7lv5Po8L/ldV/JQsxwv/VQfg/AAC4Ia76TwL3AJPsMCmPzvaDHeV5N8wdGD0WTg/FabdWBDK9Y3Ae5MG4eAMzoo668uyMXX8/DI77cfqfMvf+PirfHTg5AFD8Zw7qBWpIhoX/e1D/z8M7PfwfAACAFgur/yRwD9QZ4RUIzvinT7fPu724V/OXHXkHQKa3BCv3C4wFAB4gz8Tgl/bpV5rg43fH5oCK3gWquS8HAIr/NIDwf3CFCv9H/R8AAADWwD2QZYdCPrg568KHlI9JtKBxVJe8TLDYbhlud8Cx2PdMtASL3gBvgxrt1FEfv2gDIEJ+cFQJoE71v4m9iv/EDP8PU/xHOLx0+D9Z/wcAAMAQdg7/7wTugSeB/AHenidj4EDNx8T10DJ6nk9jfeKtr3g9XpK9ThNQBiuhjVAXMp+dHbj04FE48ekAKIb/V6HVfxT/6Wb8u38XngKy/k8vCP8HAIAhQP23Y1v3wPuwxxyhz0cyLipjxB8CVnNQ810A1f6M91XjvX8RWXk9A336z0GsuNGQI44LK0VkVT5y358OAD+l/6vWEP7vBYT/AwAAmAjU/4ns4B7o8QTEfugbrLPnm/tAmZ3xbK/au14Orjs3i6WWXySwGh1iMSk4w7qwGz6cgQUiq/Iqfef295tV6f8mUPzn2hDC//UwD/8nO4DwfwAA6Abqv2cWcw88XvePsR+4fITPsxH3xE/XB7O9al9h9KLYaxHusoqGstcSAu7BguQw4Vro8/K74nKJ5lHg9pd6B0DJ/MjiP/3qP9Bj1fB/GjL8n6r/AwAAoBOo/6GJ6B5w+tPOHaqh3W9o7H4cTgd8FNzD93iu9APVXok1l4cCy864RzDYUcD1op36Kt9oZIcdauTrim7fm4e84ACo2otX+h/h/2lg+L8H9f8GGf5P1//p7ADC/wEAoA+o/2tTcQ/49A3o4zJU37S9yI9yNHuo+R7n0GOfLsSedBYBZiEqGFqgSM9y2uBC1kHzyGJYi6gPTdiraXPHcw4AlP7fEo76L/VJrAPC/wEAYCpQ/3cmtm/An6yPWxYpghFzvx5TSj6XgMc+pSgT2oLTAXcBxsaAdU+lC3arR2cINfuHM+WN5vr2OaxrnsH7eRTEJYCClf7XZuHwfx2chP+fR3h6+D8AAIAeoP6DElnfgLlXYJUKPHuySmC+iwl30Qkp3mf2i5DDy2XpgxuJ3nrGlDhHZ4KqC6b2JdZHjfWrAU2Z/3gD596jcHMA+Cn+o6L+x1syKXkt/rNv+D8JFf6P+j8AANAM1H8gJe8VaLd33HWpCjzRWS4w/47J/K+8qMZO9MojufbBidBYVBhNEILqm5pqO0b9jW1GKNfxNttuFEmivYnXgFKPW4fm7ABwVfynH+3+DAv/j4qTOHrhCNPh/2T9HwAAADZA/QdaXG6VJfd0yg8gUIKyrBKYXwGVFwo4mNOA4xmwyxWU1sBagwJAGLY79T4qf6WU2kbE7Sg6+JFWYh2PQmvDBwcAZYII/2/qAYr/ZBpC+L8qZP2fXhD+DwAANkD9B3Z0+ANYBkHijEnUh8pxs+13XQWZu6kD6Hf2ZEz0lwIAgHvqaadK7oGJzOpugPuMcB4F7jsA4pX+D7BawsBS/52E/wtB+D8AAAAAgj2LTWU5WX/O5M9pNdjU0BgPY5wLAzR6ADToOzs6z63rabzcBXtTyKqU9ERvetUOp64rUDpmra6/HAAo/lNl8/D/SAhf/2sNwv8BAKANhP8DMJIlZP1pd32jGw4wFzV2jMqHQA/mkVtRU1dZ8CuYGddJ4U5S12R+nP4HZmB3A2Y7rfF+qwJ7FLJdb2j+G2c/FP9ZFbXiPzHD/2nI8H+q/g8AAIAGoP4DoALrNsXpje5OgfkV3MyOu5HJY9bN8kQEGRlgxVB53c0FATiia1U8Tv+7fky3iiXpGdufp465b9nV42+tYp8GDcm3XvW/iR2L/7gM/18NYfg/Xf+nD4T/AwBAA1D/AagT8325E+5LI90K20xWpBGoYXAcuQFfZbgWZJzI7uuyCcAk2FVpWtMW/FMcAlwk+mlZJtVxj+9RuPfGZKER7wCg1X95r2xrzvgs/sNpaLhej/B/AoT/AwDAcKD+gz0R3FL4evQcdC8U7JbLbI5CjYOjGiOhxi0ej8pffHxd2QAATaxzIhcvZQXXx5OPdQYgFCt6FLSq/pzgvgQ4j+7q9lf8Rw1G+L8UL+H/ftR/Z+H/AAAApED9B4sRM1T/ieGdZLA7/kmzM2mUgkwO9H0hj+w/RXi8TIEdWft8x3kWhvxUPeAeWINBHgVxM71egZoDAMV/EP5v35GwUOH/qP8DAAAioP6DKEDWH21aC48zkpLO0AUY/gy8GYl5bDIUgui9Lm+gzg5nxLZMmVxcPPRpcg8U9wPxKc/5bdJ1vAJ5ig6AocV/XKr/asQM/w9W/Ec4yHT4P1n/BwAAgB5/+gd/hwdaEAOnN5z7KftOJ+KK3uh5mgcI9zcel/+XCLJuN2erpQtA24LHxaydcjR42UMA98CyXGdbxytw3vtlLu8AsFD/w+E2/L9f/bd9DYMDyPo/vSD8HwAA9PjT7/7dDvcVADRhdUvjSOEKcvoPHLGZbzd1tDDmwVLzg6zbiGARAuCf5vMU106azBjV3QODOlH8FGij4hW4a9pN7wBomvNY4f9q6r9B+P8AgoX/C0H4PwAAAACmskHAvu9nRB+jpFbpxcfhuIbQ9H0vV29gvUViu7XtdnkOnAm3Y5BS8t47GXNOr0Gt5ifqQW+iwkfmX9tz9wpkB6cyLRkHAEr/q8FQ/xH+r4Dw9b/WIPwfAAD4/Ol3UfofrMTqyr6/u24Xw1Kjo4OH0XZ/mJOp6fv+Fq01WC3jGL26Qs5tyE7rUxwG/UVEW2S3icmrUh+e9X98DI/wcf1X71Jc06MgHZWrA2Bo8R8V9d+AYcV/fLJ2+D8NGf5P1f8BAADABOo/iMPqpXh83P16GY0iZh2E1l+lqO/7WLc9YLpbGKI6jQTLYGdmzP5nm3JPATwHAsgxiP8LNpDewYJHISVxCSDd4j8qRC7+EzX835X6Lwz/p+v/9IHwfwAAYPKn3/17PB+AhfGyuKc+l3gZhDwzegehP8ca+j4m9AudiVMeUUwQABfkJ4Wx52Czs3T3BIK5jPAouHt188kBQIT/b1D6f2046r/UJ7EaCP8HAIAh/Ol3/352FwBoxMWtwOx7YBeD8IWz7jzZQ+t/VP4imb2MKyw8ZZ/oaR/9rD/aAKyFleegOeFgLjaXMLgHgpF9dfMjE9owce6+HADxSv8bsHb4vw6uwv/PTA//BwAAwOG/fffvnd4HAHDmeWM4dLkiYN9JL45Qk+KvxwSrqvZ1wk2TH40+3tABAFwivJgoXHtG/GR9VJua4R6oE/ZnPCA5r8AjlyswZlLYJYAcrhGHXWKjHGivVPwnXvg/w9GiCRX+j/o/AABA8t8Q+///s/emW7DzzlmvmvW/c4YDBALkYgjkhDAdFsNHCAnjraTPh55sa6hBVVJJfn5rve/eu22VZFndtp+nJIN1MLsxmn3XOvUOL9jt5RZq/uP7PyazR+AAQp84bv8rDyL0sQNXtF9tjJkgaE4gTp6Egb1VSSeeYQ+0iTaCbnCHcmaeK/A2ALD4Txqb/i/F9z0KfFbOoKfT/8n1fwAAAPQB9R9syE1z9gM8P24h5bcpCP23e1B+E+hsWqv5gQ4N5Ai/cTibQIRmwNhdBcqRMIi1NHtuGXtgPOZHueSNUt7ooinQ5wr8IWHxH1scFv8hQPp/Somx/k8vSP8HAIA+oP6DTfB/sLhjwv4N1Pw2N9f6p51fVicLWrf9QJ3M7X8oADCk/H1h/CoWVzsHbeztASrobdnEUSjW2ucK/IFW/wPeekZO/3dgQPo/S/1H+j8AAAAtUP/BqpjeIt5L2b91QluLG2r9c056tVdZzcFA1QCB/kbgZDbY/De9tFoJqyCcgxoaeyBhAsEgGh05+qsucAUKUO8AwOI/IkK++zfK8kG2DE7/p0D6PwAANPjnf/Jfd38UAuDN8DuSKLJ+wpNmxh5Cf9zTKtf34x7LSJqDEF1kB/ryzgQ8+yEuP3AOdFDHqp1AYMudzsiX4kGHcAVKsF8CzOa+i/+ExGzxn5XT/2nI9H9q/R8AAAAA3BDP+4Moyj7ugThE0/p3OGvQ949kvbHzwZqxcyftfGx3YuCFonPITPYP1M6BH6f6Z38hlRMIbHlW/2HJ7K7mkLdx9mh90zQADNtopf4j/f/Icqv2WyFM/6fX/+kD6f8AANDgn/8JFv8B+9B97xVF1k9rPEMF4nH58wiy6xTcWd8/H/s+xyUm9KHPbFwQrQj4M/f3TjLQ1A3adjSfeqR0lHEcgpGVf47arU7zaQ1DeifERIGWAWC7+I8JkdV/Tl3D9Xqk/7NA+j8AALjxp3/yX/EbCu6K89hHwr6WR/GvDYY/ou1wEm+i72+emB/3aIxbtq1ECZZlyJh8FP7Gwt852OE72XYI4tgDtgw4lKdtPRxHweeoxrsCFQMg4NL/wWGk/0uJkv4fW/2fnv4PAACgxp8i9x/cC98Jrze4n9bQSswvEkxViHtalR21sr6/tpofq7EQ6AFYCeFXzN852H/CwT3tARPM+4N2FJ6lcbWgK2D2DgB39R/p/+IaOfss+Fvi4LW0oNL/sf4PAAAUgfoPdkd7E7W2yOhI/MT8Tkac6K4+6Wpg6GHsviSBOSNaalnHal9GEI04302MZRn7OAedGA8c2AMjaXRh/fbhWT7nsV2BkgFwj6X/LVkz/f8Oi//Q6f/k+j8AAADkQP0HO6K6+zrcxN7wGU2Qnh/8bl+C14mWL6rDZPmRGVrf92qULO5G36+FCDkgAUHAs7bn1zecc9AJ2SzLhghePxBwQC9FXXmvbJnqCpCDLDMAAi7978PC6f+MaCueERbC1//2gvR/AACQ86d/8t9wvwnuyw0Uf66sv6docWKU1l+oZ9fRVSCQvh9Azb/B18qPAEMI+MD8Xqw5Aoa1eo1fF7Vz0LsTTccq8m4TCGK/nXhRDFyBgRMFjpwNgJhL/wf/HRqf/m9TBdL/kf4PAAD2/Omf/LfZTQBgIHvJ/SxlP/iduRsu57fQmffT+qfp+y4VIjFfzU3GOY/NO2Ma475x/m/JdWD/dfdrGB3AI7U6MaI9wIhtUHeYEe5KPR+/dPwDXypwxOwdAFdiq/9m6f8M9R/p/064p/+TDUD6PwAAnIH6D/ZnQcWfu7b+8k/wXbifTYbWv8qIkrGyvg81/8hu47N1vnY7VjAcyRAa9NNRqcZisN/XOcipH9Iq9oCobhbaBtLlYv9UNxfun+MKHAwALP4TA6T/V7GdbEGm/1Pr/wAAADgC9R/sSWDFHwn7NWaeqbsl9a+m77OKbfStWXWkEadg1cOKAPqOz0a/BKl65rkHme0H50DBBHuAKh0YengIjyzCqxGEroDxSwU+BgAW/1HgkP7f/+5fG/8goPp/hkz/p9f/6WwA0v8BAODAv/hn/y24vw7AWjy+/6txj29caK1qS63fMUlUhIO+v/5XJtBYuqtAv+2BgRIBT/e8n7GsM3TOgVGf6sJEvwho7YFmUapk+F4xpPhqhNiugPGrhh2WAIqt/u8tT3DUf+MliYaB9H8AAIjKv/hnyP0HoIuC3L/jLevCd1fBF/BpqwYR0bSLKLPaV2bCqeFZVkuz2/EAcGbACLf+KVXf29g7B069N3cNpxcP2ANaclcgyEuSbVyBM3/4xhC35uaL/4RM/7cB6f8AAADYQP0HQMFmiv8+olvYpP5pK+0o8FmcJ/AXZM5JuXbIAkNjgSYCcHvCLMuju0dyWaqoTYgleEiN32t9IXPmX+yLL0kO6wqIbg//gMV/nIj57l+k/7Og0v+x/g8AALyA+g8AkxUV/zXvGuuoXic3S+sP3Pmb6/s3V/MDDzygIsw3KzQY9xbEWJbHaKkieT3qfadPIOiwBzww/DZatj2sKyCqVrME0KLq/+D0fylRZlSsnztPp/+T6/8AAABgAPUfgBrB5f4dtA5xf1LpHdqG6Ama1L+nvj+ukyMtsxNsaC3O7DEMHAl4cm/z7Q064UBZvea6vrQ94Fx5J/V0eY8Kclcg3rfY7h0AVup/fBwW/yFA+v8Bcv2fXpD+DwAADKD+A3AkguK/5n2evZRvVsYQd63f/fhuqu+HScyfXPcSzB6EOTc+ZdMPfehocKls/HieftKEhHEOjnwadRt7oJfC3XMXVEvr6+rbkb9UIIVxBcQGgHuievz0fwcGpP+z1H+k/wMAAGAA9R/cnLly/xoP6dwOWVDNb+Ao9PsedCt6gMcos4OPMF0/8gB2JcBAumB0Im56PmMz9KSwK4ttS6hbt9o3wKS9upXUm4Wf+Y7siFXi/e6eMWxfxUtg1HAjV0BmACy6+I8ly6b/74F7+j/ZAKT/AwAAAPdjouIf68naQdaPdYB8Ymj9BrUHeP5aWt9fdQCT7DMwtj1FYDXi2BKCrze9622cgyMOyvshZKGwxh4g9w3wM29H8WAeanV/jivgfRdjsQRQ+MV/9k7/N1v8J2b6v+3rFsj0f2r9HwAAAP/yn/1l5W4KgK3ZW/FnHR23abv9QHi9lbevP2M/4BxZSN/fbeh+cRgtdn21ba8DEBW1zRzAOVjkB8NaeW/bA0mXlbC/PbCaK0C8VKDWBDYCA6AsNBuq//EX/wmZ/n8fyPR/ev2fzgYg/R8AcHv+5T/9yy3uBwGIgu+tnnXC/uY3pgGS+lfU+uPr+1uN25lS/lYdeXNCn8uKZmceEsgJ4BxsMeHAQXnf9PUDHuRNr7+KQOUKxH3VMNcAWHTp/8Eo1H+k/7dA+j8AAETiX/7Tv5zdBACWZ9TbSgVV3fEGyEvr31Doh77vCNT81aB7LeS3eAf6OjbsimC3GS/uzsFOSxVtYA+ImP8tqJuOKlcgwEsFKvQtAXSrxX9sxeiUEinfD0v/j6n+n5me/g8AADcH6j8AOlzu53hyf/Q79TFgAZ8m0PfNsD6nkPIVQKAHM+la2MWaSujVvgHqS+1Y52Dgz/A0e4CsW4si6ohhvLQrUIFlAGDxH1Z1w5frMUv/B4lO/8f6PwCAOwP1HwAmExP8b3HPV7m9dz72Dq1/uNYyZATeQN+Hmu8DcXiraZNAS/84x1ih6LxcqgX1KLgcaHVbu3fC2AMpzNuJOxmhpheRuAIRXipwgTYAsPhPSqum/y+8+E+S9Tmd/k+u/wMAAKAC1H8AGiDBX0/pKWDqQYVO6h/4uohN9X2jE3RDKT+Cs7UC+5zxFYjZ2xt9MbJDgXNw2CY0AsLYA2RtDm8nlteg7ZBoroDdSwV45RgQBkBVpL7V4j+c6oa/+9fdmIkEuf5PL0j/BwCAClD/ATgydwX/6PffL87HErXNN9P6oe9XuJuaf28pf85J3GTo3BjJVyTC2Z79ldY5B6WdZh9Jg+oxPVIytgdatdnjsL6QqIZGNcp3N8EVOKJ6B0D4xX+MGZ/+b1MF0v8/IP0fAABUQP0HAEv6vFEnA84n7gI+yj68tmr8ItIzMF5cO9CRqdlLzZ92RnYYb15DGAAAIABJREFUChcWHgY+9J3jgCOkeYY72ztp9KhnBEZ0DkztgdaGdm32+NsDjMp/1ehXH1It12NBXo3+pQLFcs92X7QMgHUX/xn87l+k/7vinv5PNgDp/wCAW/Jn//QvAz7zALAkkRP8F1b2L+yY1P/sKk0S6FzfW99fUMof18NRzmX0MwLqxDx3HSPb6kthug7f8s7BqANo2wPVhqxuD7ww7eTi6kObTBRIyiYRh101ANZd/Cc+SP8nsJ1yQab/U+v/AADADfkz5P4D0EPYBP/nvKrFWLwQq/ip5yOdvtEOWn+gE30nfX81Nd+sMyefldCdDEDGgBFLfSdNxf7lnYN2XsbAVpZ7coPXD0gr7FrY71R4Z1dA1B7hEkArLP6D9H8WYdX/M2T6P73+T2cDkP4PALgfUP8BkBE2wV/5yOOBbxMWTOrXBwhwNjP21fevTYmuMvd2nW/XR+89APai8xtX/zm4i3PQXmMmkj3w2bC2PcCpH67AicpLBWqUDYCyxHw39d+HTvmeU9zYkxgM0v8BAGAqUP8BoImt+I+t1702VgWhtX59F0W5T91O319B1nebAaMgYv9syPwvxg3AWBag6yyHX/9KQ2Y7Bze3B1q1OWK3fP++rkCdggFwq/XlW4RM/7cB6f8AAABKQP0HoEzMJX18E/xdonZnzfty06T+vfX9EIJfpMT8EB2yAPPHMXAg7Gnd53upPpJBEw7IeLe1B9Kirx8wFd99XYHpX3P2EkBI/8+rk+v1LXPFaPGftdP/B0Ol/2P9HwDArfizf/KX829MAAhKoAR/h6oHqpNhfmTuovV3zZaXbBnIVH0/UmJ+CvSFGk+IsUhy4xO0PCtPplty3E1yDjjvAqjuqyaiPZBqx25vD/h/uZxdgdUmCny4GgBY/OeN7UI0KaU4UysiZ81Lup1O/yfX/wEAAPDhz/7Jf1/laRqAKcz5engt6cMNuaKyn7PzAj7Q932qdSxTI/A3qJ8QAytnaJ8H7QPwIRsN07+SHUOmc7RNP3QZouZmXSOZDjBk6kCi7IFESfJeKNtS2FB/ya0reKnAyQBwV/9XIeTiP3dL/yfX/+kF6f8AAPDhz/7Jf5/dBAAiMitZO5biv44SsHlSP/tEQN8nqzXeO2edbw3JzEETdXiAHQkyBp7Fv/ZioUhyWOCXT7hqjWQ6ANlt9g5BW5I3rZJE8PoB7lSCIV/KW7kCPwNgRH76Kun/DgzoXpb6j/R/AAAAGUEeegC4HTET/MPfV6e9k/oT6xSUWhLitzy+vt9tFC1M2FkpFCHGdo3QjQNu+PwkGI4mIy9B0qLlnQPJqjVyvT/GBIIA9sCDOStg0kSBYiUxXypwDUxBvQNghcV/jFk2/X8n3NP/yQYg/R8AcBv+X6T/AzCGmAn+KfRdur6v+rT+OEJ/Cqb1B9f3Nf0SePw3cBwBZh0SRRiP0g6wF2PGVcfXsaeB3ebBfnMO5C+8Fer9t7IHijVfK9x0osAhmJsrUONtACy9+M/26f9mi/9ETv+3hUz/p9b/AQCAmwD1HwBHZr+zN6Dcb38HttcCPtO1fuj7Uwip5k94XMITmi8rfBfE7D5ofGYE+FX7vPwpxlr9HDTqyWqEEwhuaQ9cK1xxokDyeNVwrSY5f0iLL/5jTMj0/1tw6Hky/Z9e/6cPpP8DAG4C1H8AjLnrkj5jNfTYC/johf76x3bM0PedF+eJ95jpdRa7jtSrUbd7lI033u5OzDMS8osxJMt+hnPQrHOUcE5h9+6BUrBRPgjDHjDtUtOJAuV49ti/VCCVXAHVsdSXAFpk8Z/B6f8K9R/p/6NB+j8AADCA+g9ALzGX9HG+Nx6roSOpX8m7ghEPSjfS9y1PW7zE/E0ekCINmCKb9POCDB0a5pVNHTeBnYMnXY3WHgg0YIT2QCneEB8kT4KxtwSuNdQqCbV8UK0el1cNN4P+AYv//JC8hNaGYen/wdX/SOn/AABwB6D+A6Dhlgn+NsdbaKRNYGj9zlr/XfR9t3E+otoRQZ0IMwBeTPx5B940z0SUdWIcSp4ZOx79nQOGgK+1B6JMHSArk995jLMHLrfNRe3ahvWWD6rVY+cKFHaiXgLcT7CLeg8Lp/+DL1T6P9b/AQBsD9R/ALjcT/HXH2z3+jwksRfwGbh6j+UAuIW+b3BuZAdiORgiPunNPq2mfRKxg8FwBg0DqxXUJxgJIZ0DSu1kFIU9QMer7S4/ynzi7EBLIPUsHzRw/OdVdXbOMWDJALjn4j9rpv/vsPiPpOfp9H9y/R8AALg3f/7H/33w6nkA3J64cn+1UpLuVXoaIKl/itZ/U31/rLIfTmweeAa7jz1c5wHQQdd4nmAkhHQOOlT4bntAu7IQGdgYsibJ+kLnYBZKdXEtTUwUYNQjP7EpFQyAey7+w6nRNv2fEW3Ey5mDQa7/0wvS/wEA9+bP/xi5/wAMYGPF3+xWbegjB6NLK+1ZdAGfVrMFh3Qjfd8iMas/RCdu50t7aPO7ZDIxvkGAYO1xamIkyEaq594HnD3DXntAp78KKhiFZAIBJfkbJa+vO1GgHM+FtitQa8XZALBV/xe64Dmk/w+Q75H+fwXp/wAAUAfqPwBudCj+oeV+fYA5igqS+kWbX8x+ZIuv70cezFKEx7K2Mkoze/AX2b3THVGez2HDIO6plbVMPf/Acu/g9gAVYmF7IIglcPjHkIkChXqWWD7ogts7APZa/Md4nX2k/5dwT/8nG4D0fwDAvkD9B8COjRP89QFG38ZB6xdtfjFD7oys70949jA9BZL2x5UeBYxfA2B0haCL6eeLGKFrvsi3ia9z0Nppnj1ANX13eyCIJZAiuAILLB904WAALLL4zxIg/X8CZPo/tf4PAADsCtR/APqIq/jrb276lvQZd1OlF/rrH9sxfgEfenNaZ2H3nfT97j7fU80fNRTX6RGwM1bj8AZGAqvuosD6ZZY9QJaOPHuAjK1BaAlku9tZAqnkCmD5oAMfA2CdxX+Q/s8lvvp/6Hwy/Z9e/6cPpP8DAHblz//4r/BoDIAHSPA3Bkn9os0vYo63F3vo+xY9zGhqyMt0TPMSgN2JbiSM+/a2amrYA/oDtzi0yYsLUWE6JjewuQSipghkJRi7yBsTfaJA7VPTr9sfUlpJ/V+CTvmeU9zYk9gApP8DAECJP//jv5rdBAD2YUHFX3//43vnBK1ftPlFtJG2gb4/Im0/zDOI0fgJczw35iZ6C4ZaN51dqNXX6xif02q4R0rK5juvLETG6LAHEtchqIehUvW1MJbFZ8wCuOVEgdoG7VB0eweAD3dI/7cB6f8AAHB7oP4D0EnhBiWaCPsifoK/+KF2UaE/kS1fTOunW7LkkOMQV9yHlD+YPk1OsBc44qg+dhe+x/lUH2WXc2DWtw17IOLKQpwYjq8f4N2H+X4p7z5RoFCPuSvwh4XS/43Vf06Ncr2+lb9vtPgP0v/FUOn/WP8HALAf/+of/9X46yYAu/GIJMUe2U3x923ObZP6k5nWL38mkhaQ0tF1Wyr7eD78UelGqovQhbvSdWbZM/9Uq85sOuj4hyXrSH9vIDmtLETUycXBHqi7AoMtAV4bVBMFiqF5zHcFJF8RRoNMZwCsJTQw0v9XZa98eTr9n1z/BwAAbsa/+sfI/QfAAuubW/0DYN+SPtNXUxmm+L/j3i+pPw3X+iMsElUkos6rOpxNtcESkOzB8qguE4KFwJvblv0qyBRtf4W9Hai9slDHtna1XFT2QF1Rb67jzyhvgc1EgeJe91g+KGOZJYCWWPwH6f9cJOv/9IL0fwDAzYD6D0Actk3wT5MV/zsv4JM20Pp30vfvKe4rJXveLgDcmnZ+egkTIyHeV3MteyD1LC5EbnawB2SWAG+KQP6x/Q2RaqJAVm7niQKNGu0MgL0W/4kJS/1H+j8AANwYqP8AzKVP8dc/4U1fccVP8ccCPlziaP176Pv3UfYZusiiRwbAjREaCTxBPY5z0KhWvETTLe2BMZaA7xSBRkSb5YOWnCjQGGlGBsBaAv2y6f+bMDL9nwLp/wCAnYD6D8BgbpvgX2pDWMUfWr9FjTWEPRNF35ef0DX0b95yyKsczSo80mp6CDjS1mXvS/lXgnIO6jbCwF8d8WI4I148QMRysQeEjddaAr0vEqhX1IHN8kGLThSonvgFlgBaIv2/U743W/xnr/R/GjL9n1r/BwAAtgHqPwAD2DbBP8VY0qfrtn8NoT+ZLeAjiDRY669XN+TO/Abivvf3cW+g14MTT6PvD4yElEqLk3x4nv5Il29hWHtg0NQBItaj2RTBhj5LoPdFAvUGjJgoUAxqM1GgGJpH3RXw6AELA2Ct3zmf9P8We6zab4Uk/Z9e/6cPpP8DALYB6j8AHujv4foU/0H3jmsr/sLFDXJWSuoXBAug9TuPX+M5BwGAsk8ByR4sAIwEFvmCKCml1xe8MpVg7K9gyJWFiHDFIcNdwknSyN5VgyQNWGqiQHGv3uWDPCyBbgPA+cdpfPq/8eI/RsWR/l8A6f8AAJBSSukv/vFf4fcOgJlgSR8GTor/dlr/QkK/WStO7KTvt5T9ymcbscQ8fk82P79LsdRYtDISUnouNgaLK6MUpg6kSfYAWZVs9gAnIpeC+sxL3s82DFo1KCksAUl1fagmCmTl7CcKPA6BdYEWWALIEkb6vzHD0v+XUP8jpf8DAMAe/AVy/wEYz/pL+pTasIbi39qABXwaxNH6Jacprn51g7T9myn4Xmdtk9GwDqVha3gSVvpWdH2Fw01E4NoDs1YWImsbO4EgX4uJZ09YrxpUrUhkCdSbEWeiQOkDn4kCHWZAnwGA9P846f/gApX+j/V/AAAbAPUfgBEskeCfYizpQzWDH4b+1KC6FuOT+sWV1lhH64/4kLOpsr+jmu9yOlyCbtj5IXl8/2cJI6u3O2pAJBMRAkw1aKwslMr2wPA2W9oDmsZHsQTqh9UU8280UUDSWKEZ0GEALKf+r5n+f8/Ff+j0f3L9HwAA2J2/+Ed/HeGOGwCQA8VfEYb+1KA6SSM0DRib1J+g9Qspvm2v8dkKPNICWuKHRST7ZfoTnDE/caaOwsZGQku7CzGToGQPhFlZiFMhIdXbZKcUnirHvEigWlF59+0nCjyqWxi1t0/FzZYAamKc/s+I1jl7YDEk6//0gvR/AMDu/MU/+uvZTQAAvIkg96cFlvQ5hWF9alMjuyJZvdD6pQ3wp6rvLyvuB1DOPlj2ISR7sAZW4yq6keD5/WnOJAiQyLTAykLFCivGRb2AqpIxlkC5bsG+aXVXoC75a82ACloDAOn/Q0D6fxmk/wMA7g3UfwDmAsVfEUawwaBSRhXc6uIu4FOvcVOtfyN9P4Cyb6MPdTG/EwAYQnQjQRTS8nvb/iUMZQ+0VxY6/WNIs4NYAtUT2D1HoXuiQGq5AqGWDxpoBqgMgB3Vf6T/+zIy/Z8C6f8AgKWB+g/AeEbcuwSR+xkt4UfibjColFEFXVHcpP56pUZtYbRk5Leg/jgcnRgL8niO5PlHtxgrDd9lucuonGck8NwC4/Ow0MpCqXATNdoeIKR5H0tg2IsEGoWWXz5ooBmAJYDics/0fxoy/Z9a/wcAANblX/+jv8ZvHACbEETxnyL3G9TbWVFcrf8uSf0FrT/69W2ttH271a5uh3IgohvnIV9arsxdzqHoOBluQevtKspaKaKvLJSm2wN0JruLJdCxapCyAZ7LB42fKGBgBrQ6UW4AIP3/XaS+bVj6/4LqP5n+T6//09kApP8DAJblXyP3H4ClgeJvhDbNv1Vuw6T+BK2fC5T9DQgwmyHWqL49T8X5hZFQoH0wlD3AXmjoVisLpbo9cPYHTJsqtgR8Vg0q1NvYcOeJAr1mQAGhAbDVL5meTvmeU1zhScTF8AUMSP8HANwVqP8ALIZGe4Xir6qoWheVd6JpC1mpqC5o/SOYre87TDfZ4qkckj3wxOrkwkho0lylJ1EHHW5lofn2wOP0xzNdpwyMtARGvUigWFVrQ7SJArUS6pV66pXndYmqiLUE0Crp/y2GCfdI/wcAgNsA9R+ABQiS4M9oCT8Sd4NBpeyKWtW5Kf5xFvBJ0PqvzNP375i2D9Ue3IwdjIQ05Xelb+pAKl5kxNWIaVxQJnkDMy2BMS8SqHWttyvQPVEgVV0BKsfH1QxoBJcYALHvRXTEXPwH6f9KqPR/rP8DAFgRqP8ARIRxY4wlfWzaQdTosLAP79Cg9Q9moNAPZf+M24/M3bhhR8Qe9SOZaSQUqq80Z9z52m5loTTuvcQXSyB7q4DdD4141SBl7WVtXZKzH2T5oJIfMNwMeNRjsg0A/7E8Jf1/VXbMlKfT/8n1fwAAYDug/gMQBSj+N1b8qce3bjSjy4dnXtdo0fKRXJ8977ggj4W4f0Pt+s2wmU9bMnPc1Ote+byZ9GjVRThLy3mxUYxYWahdjZxp7yXOTtryLxKoliyaLJGWDyoJ+zPMgG/My8CLsgTQKov/IP1fxuEskOv/9IL0fwDAdvzrP/rrpZ9RANgbd1EYij+vnMeaJI5eTpCk/hRD67e/xrEOYRtxH8p+EUj2ICXxWh6KvZcdTZQsLrcHQngDydAecF9ZaJwlsMOLBFq1yXL2HSYKRDQDvgG/NT9S4hoAy/6wLQdL/Uf6PwAA3IB//UfI/QcgFoMS/NMOi/jT1bUqdVD8q3XVYnaf3DhJ/el2Wj/r2GI/4Rp9VZcR9yHZg7jczkjQ2AOPwt+OZUaxzosHrtdE3xWEYlsCXQ3oXj6ouz3eZoChE8AwADZd/Cdm+v9WjEz/p0D6PwBgLaD+AxCBQYr/fRL8W5W2Snso/qWw2vMbWuufcBMeResPJqp92SZtf8XOB2AamxgJ97UHfFcWylYQcn7n8MUScHyRQB6MtY7PmhMFPMwAw2kB85cAGvg2p5mYLf6zY/o/DZn+T63/AwAAC/Fv/uiv8aMGQBgsv45Q/PmlQy/sY6XjdAKt/0WYx8ltlP10aUeYHg7L3Ok1IKV0zWjeGJML0GfXsfcFy9oDXSsLKY9g5qpBydcSYGnxkScKLGsGUAbAij+fIdP/7wyZ/k+v/9PZAKT/AwDW4d/80f/AoyMA2wDFn18aij9ZO7T+WQ+nOy3Ic23Eis/7FnhP8Ppx1x4ewaPwD9WJfBb+tjftlW4C2gOVooPOl2rqQL2Pt7AErKtWugLGEwWuSzGVT9WyZkDTAFhx8R9OpcP1+jum/zNsGC5I/wcA3IZ/80f/Y3YTAAB6Do9JNmG4GwwqVdXYqpcuqryBky3lr6+H84hmT4DF+tPNtH6k7S/EuK/Gjr23IbrTVBT9GhsF7GIkhLMHlnov8ePyZ77XFpbAM7m+SKAW0nmiwKXwqTsJM4Bdaa8Z0HGnO38JIGMMdecDIdL/F1L/D0xP/wcAgFWA+g/Ailjk+EdR/F0T/LnxBTXWwq6g+MdI6k/2Wn/rKCZq/R1p7yHE/XWV/XGJ9mmxngHTsBontzUSGvbAI9/LhI6pA5XSjh1byVJvatlelsCUFwmksZZAcnQFJGaAfFrAtQJiF9a0gDZ1AwDp/78inTVy9glxZ2mGjw1Thkr/x/o/AIAlgPoPwFo8Us/dMhR/XY21sMaKf0fEVkX30fotcur1sLX+EM9fHc7EaCpZrX0EPl4ACGAktCqEPdAMJ7YEVpoi8Pub87uFG1EJgb5WjFvJFDOgOS2AV1HFAFj0SjxSd35hIdzvtviPBDr9n1z/BwAAAABgCB3J/rdQ/Ltui2UL+6yl+E8QmqH1t3ccw1pp+7LhGv5wZhHCVrolCw/JEEbCYT0XP9a3B8waJrYEvKYIpJGrBqWZlkDKu0yfSn/Kyo9lBjSrmLYE0A7p/4xonbMHVodc/6cXpP8DALYA6f8AREar+7cfb0s43B53KP5uCf6tShvBjUX/PXL8+2aiVEPKNti3gVH7VK1/obT9pBuWsY/IHKj2G6A4ibsNc93xHBTaeh8GsgfG5kVc7YFMz3azBCqW7IBVg9IkSyCNdQWMzIBryNlmQErPltpeMgAWXfxnfPq/BRum/7NPBNL/AQAgQf0HIBLd96hC0X+pBH9ufFmljeBQ/E+EeDFv2lzrX0vZT+pZJuGPi8N81X6LbtwWxviwGkJrD4RG689p8EHsgXIzxtkDz0s1edfYtMFg1SB9W673Gw/X81uabuH/OoFNzYDXhu+twXWXzABY9NeLIToj/X8w7un/ZAOQ/g8ACA/UfwAiMFT3Hziznapxc8W/I2KrIqXkKgFaP7mjQaWxH3uV3tIyBzUP9y4KcZT3I89hlsfQnrptjYR2g25qD5RE9nyWwGaWwDObiOCf83D922EcmU8UYJkBsrpimAGZEzBhCaApi//E5M7p/zRk+j+1/g8AAAQH6j8AszC6HWXr/nZ3v66Kf9etlUbx76hzQpq/153nHdbrL1StXXhKU2mkx0/9rJEYRzHhAWzQgePRcml0p+/Z+JeeqUbCuN8JA3tgiDdwqKN906ZtydKWwBKrBv2qPf2RXCYKVFV15bSAQsjH8R853WZAKeZ7+9kA2Hfxn1XT/9dS/w+Q6f/0+j+dDUD6PwAgNlD/ARiJ3S3o6GT/DsXfM8G/Wmk7fkeFGy3s4zoaiQ1puNY/Mqm/Vd0IlF5RDGX/hdlZGXFQcSX7uC3bkY6x1nmiKjVPNRIUhVy+rCx7INDUgWtLuiYNLGQJGE0RmG0J/P72PAyb8GYAI4VfXVGZgwEQ6c5jdTjqv8KTiA7S/wEAgAfUfwD88JlsOi7Zn77FWWZJn64KRy7s4634p95h2WqVq//U5j5av3KExHu+dv0F8G7CANwbN35IhO5vG+ZJ3ladO9lIaGz3GrDx7YGiQP44bhEhtgTMDu0SqGJT268alN/2+L5I4FDN90Q9X398P+6O+2FdM2DoEkD3Sf+3Aen/AACwI1D/AbDiMSS/6FRjbUPfXS41dVdZjrWHuNJ28DUU/1R9CjbDXPGfmNRfqH2k1j9oysLCafsvvCf0mNTjwYgGxTvdXNZtuSF2k9F8ujOGkSC/ot/OHrjOEXS0BB7ZXmFWDdK2JXuRQPKdJXDsQpgBbz4GwL4XBuNEe6PFf5D+3wWV/o/1fwAAYYH6D4CC8UL/tQG1DX66v2pVH28F0Fjxr1fqqfjbh38H7X2e4on+0Pq7qmC0Od5zsUFHB9P3B/2gxzuVYA66kWB/wfsRxkh4Fv/KjL2mPWDqDVzuLh7Hj6WUkvIvMvwj36MbA0tA35BRCwfdxgyg+IO0gJpZ6f8KbJbv72TfHHk6/Z9c/wcAANYE6j8AbaYL/UecRP9W5HLw1u7DFX8Xub87brkid8U/dQ6G+Yr/TbX+SLrwWHHfpk7fn+lIZwfcmv6hWP+qhDES2Br+BvZAyxswcgXyhYPcpgikQJaA0RSBV6xSUdOHg63NAIqhSwAZE3Lxn5um/x8g1//pBen/AIA1gfoPwJdQQv+FCcn+5eDVEsq+i5TgbxG6XNcnptcAG7Swj7U0wvYVHB6yq3UZ1hJR65+h7NtUKw4Byb5C3OvcLkQfelbt8zESlDcFxQC07K4ObUcxaNMVsLIETpE3sAQqd1r2qwZ9wx3HGsyAlNRmwB8WTv9fE5b6v1z6P3sqBtL/AQD3BOo/uCeRhf4LTjerVsn+mn4MpvjbDwUo/pwqRyb1t6qzqmW+1m/TcZPEfXGgWz7FTzJvgJiiakuy3snxMRK6JXheAPnUAXZoC5quQKkZ3a7ABpaAwapB+obADMhDfv9B9umIGQD3efdviLWDpuKe/k82AOn/AIB4QP0H27OQ0P/FLz1lWrL/vRR/lxqSwcDgif5Gw48n9y+m9dOmzqwvL4epyr443HpSaBWzTnT4BQCOPE9/cCjKuqxKVoc8DN71ldcbc+wB1zVwXn/L5fSlLYFJqwZRG3ksbQZcj9bCDHjk5/vMyksABcNs8Z990/9pyPR/av0fAACIBtR/sBMrCv1fvCekWiX7E9tYwRuhvOT+7tDVGr0V/7Ramv8puHBoaSpyT+pPrTY71K7sIG22oq6YWbjAyqVl1xgc5sJXNyA7fQrPQFhDtc7g8OR4i/R8noYvtweKcf1y3osZ9mstHPTI9ophCXSYAQ/br5uXGdA6Wr0ZkB6/e7dCN7gbAPdJ/wdk+j+9/k9nA5D+DwAIBtR/sChLC/3JX+s/1dXYNinZXzLL37AiI7CwTzv4NaZNF43S+kcn9XN7Z620/SOTZMVJUyVy1r5UgakIB4/cNjhVZjFUJ7sIg+wBdoBaLF7ig0nafqma/FQ7WAKP48dSLg08Stqfzfk0h34YloCNGfA8ddRtzYCiE+BrAMxa+n/8W3bvm/5vCNL/AQB7AfUfxGd1oT9Nutskem2G7m+W6T9ySZ9Djd5p/gsv7GOd47+l1m8q9N9a2X9Bt9naQtuPWxzkbAJe/6tYLBXTPxHBoBGKuOwLfJ890FxWaIArMNIS+JS/WAJjVg3SVlSo59IKVzPA+omnYgZ012JuBjwOuy64BJDhgjMHQqT/r6j+f07H9PR/AAAIBdR/EAoI/TZtaGzzE/3LwYuhVGd5V8U/2WuUKyr+3nL/slq/6cwJEQF+ypLGxRSUXhrHY4tx6k8sfiYVzQ/urNF0GwntuQgu/cNeyafPHmhK+lNcgeGWwCnsWpaAvxng9sKAdDIDPmcyphngaAAg/f+8z+JX1+lQ6f9Y/wcAEAeo/2AWEPptUaXBuif7Z6HkJ70SfGnFP/UOHp7in0Iv7OMq999K618xbf/IDfX9ewn3Vmx8aEe6Lz/B+qlvsDcthBXtAeFShdQiQgxXAJaAryWwlxlgskZQah8t++hXmwGwZvr/tov/sE8Hnf5Prv8DAACLAPUfDABCvyty7axVwkr352WqiSO7jKTTY6fjWIXi76H40ycuqNYv60NDQ24KHRJ/oMuHb1PinTUwB8VI6J5eF3v0tX/eV7AHmsaA0BI4l6hq9OpPUH1yAAAgAElEQVQam1xK/kJfOttiDanBlsDjuE3Lt2Tp1mQJM+BznzbKDGjiZQBskv7PiMZJ/98ecv2fXpD+DwBYBKj/wBYI/SMx1P2DJ/sbj6pRCf7JYDjxRP/AC/uYK/5B8/pNU9T70uFHM75/FCDdXkHAy/m+nd2NrmscLoQzztEK9kAzeZ/S+OsliyVGWgL1KQJZLQ7vFv78w8ISOPkBBmZAacUbmAHSAEvNABif/m8TH+n/1B5I/wcAbAHUf6AGQv8UtG121/2jJ/sPVPzTUmn+Hor/r5hZCyvNgNbvj0WHcMN0Iqhjdq960+yKta/da7e+TGE4jhuhnTWVzkc8I6FhDzRnHg0wmt1dAb0lsMaqQSm7wXscPxZxVuFhBpxjJx8zgMTFAHB5AmTIzYr0/87Ff5D+nwak/5MNQPo/ACAAUP8BBwj9c+lovJHon/i6f6Rkfyj+nPrWUvxdVg2isNP6own9Rso+N1I/d9D35wj3y3bXwuQJzI3tZa6nbc5ptKpVZSSYm+BZBZqpA1aKdlbl5U9mpXpLwGyKQKsurxcJpGP7NVMEYAa0YqeBZoC9AbD0Y6E5SP+nIdP/qfV/AABgOlD/wQUI/dPxPgX7J/ufRP/Iin/iKj4jFvbZX/G/m9ZvdLyyYCaYtnwoEO6BDMW5u44j6t+8WqMMIlE7eJd5X3ugtrLQQ5G2z6Op10vE+ptaAh1+AMyAVuzkbAYssgTQxun/K6r/B8j0f3r9n84GIP0fADAbqP93BkJ/BIadBbdkf3nsQcn+Xh27keJfrpkbM7zib5HYHlrrpxsXT9mXVTnkF36OZP9i/UsYmIBu2DhMNehpjg3tuufaA0Wx2skVEE4UgCVwrOgTu1xzHZgBrdjJwQwwNgA2eIZkwlH/jd9IvCVI/wcALA7U/5sAoT8Cs86CVbJ/Fkp+OJ66fzP7rZdBin9y0CHiLexTVvzHyP2tWmTdEkXrt3MvzAki8ff+auWsfzECN8VhqkHrU3k77L9bk+2BLlfAdaKAiyXAyA0xswQOOfyPbL8ezd3PDLA59nubAZYGgNeDZcj0fxsWTf//nJHp6f8AADAXqP/7AaE/AqHOQr8G55HsL49SjeyU7L+W4n8Kvoribxa5TjX+Tlp/4OT9FwH1/fWvMn5Y2jaBroRxiT4YO9sn9AukX2CXrPkvjNsLVQO4rkDx1QL2h2xoCVBTBIS1NKlPEchqUU0RsDEDTt1ybBnMgJQOZgC7ikWWAGpinGhvtPgP0v8NoNL/sf4PAAAAHaEkZh0Q+l2x1v33T/Z/pP4Ha57oP2Jhnz0V/44Ef26HBNb6R/zaaOrw/yXXfN/Xv75ICTLfYlpdy6LTwpfpWquGPsr/aF9mHO2BpjewmCvgYglwVw2ql5TDWjVosBmQSfAwA86xk/D228wAmJj+r8Bm+f5OFs2OZ58ROv2fXP8HAAACg/T/JYgsMTOB0D8SVkOR7H+gb3wOTfNvKv7VmlkxzZqXtcFV8e+T+1s77ZjULw466qf75in8EYX7KstcCoP0VxfNI1DYBmv3CNn6kingaA8UC2t08zaTXAEDS6C+I2UJ2PVeUR+HGVD/mIGnGcAi9gwAn8V/WiD9nw25/k8vSP8HAAQG6n80FpKYa0Don4JJt3vo/lbJ/qn14KlH22/LK/7JZq7Dt/otFH/r367xWr8syvDf6v1S+AUdHuJA1ru0dbPTIUvGkGTRFmqDtO6p8BbzYdoDZovSpNqVsqOWokJeUtW9lPRzK5axBFYxAx6XDSo0ZoC4tilmgI0BsNYjq3f6P0v9XzT9nw3S/wEAGwP1fyIrSswX1rprKrL0WTDsf03i7ZERi/xEFP39FP9TcFvFvxxQEcc2z9BR8R+T4D9Y66dDzPh9XjGFXzvwBjP5UrXwlTI8kiGmOw/sGu4w1UBoD9Suc7268zm6nSugnygwwBKQeFJKS0B8FJHNgKM2728GmEwLSAPNgMAzAJZN/98Z9ut/vUH6PwBgFlD/x7C0xPwCQv90PE6BR7K/PEo18kq6v7niX4h5M8U/doJ/LK1/yO+z/udi9uWj0NChTZr9pNlZfvbpuwMNpbmG8LQoRoHzVAPBHu0arGnUdPYGivp5l/qcVTTUFXCdJSCeItDctxI8/xfMALJhx6qoaQGa2lzNAAMDYK3n2x4F32zxn93T/2nI9H9q/R8AAJgC1H9zVpeY02o3QkU2OAvJ+USskOxvFvIdSNOfjGR/G1W9EU3TCasq/tXI8xV/9ql31vrdfhY8fhNGYv3dDHERgXB/OxQTAWxc+1YNQuTDjleCP/nAceA3xfqSK6BdRGiKK5CL24aWgMGqQfV9635AcDNA+32EGfCm1wCY+O5fRfp/S8G/war9vbDT/+n1f/pA+j8AYApQ/3vYQGKG0B+E8Sei9EDHAMn+R6wUcNuFfcyUbmNBRa5od+SMDpL7bQbqAK3faZbPYEy/g+4XDgj3YBy6iQCxphpoq6oUelT/4fPdaon1xf4O6wrkl37aEjCbIpBax8KzBErzA2KbAUfzCGaAgsBLADUZ/5ZdpP+bgfR/AMCCQP1nsoHEDKE/FBNPh6Hub5Xsn4hHVyWqTh4l+tsq/uWAijhQ/MmwvUPUW+sXf5WCXRqu7Z6Rvw/hHtyFWFMNrlXJqdd2XeSmVaHlN7iubs91BcwtgUgvEtjCDHhIm0SbAV0De7AZIGxzlwEwMf1fQYj0/3XV/zDp/wAAMB6o/zkbSMwQ+kMR53QE1P3DiP6FNhjq/nXRP6Ti3xd5nOI/SO6v1q+M36pIHbxeT5jfny9BUvgHTLm4KdLe2+dqfxv8pxpoqyKrkdsDJmnUnFYMdwXWtgRKt4+7mQHH5BgjM+Bx2BLdDDi0mfNQqDcAZiZkrZv+D0io9H+s/wMAGMzN1f8NJOY4yrKaDc7ChVAnRan4Jyzyc8Al2V984Ksq/tXI1F2xIJQM1wR/v6kJa2n90VP4w3RULI4K0Yx6QZt3P61709QzEUBy1M165PZAUcuM5ArocsyLFa1kCZQUfJgBFb41P48lFzIDvnf4jafGeEsArZn+v/niP+yTQqf/k+v/AABAJO6j/m8gMYfSlHVscBYuxDwpesX/xYhkf7OQKXiy/zWISvQ3k7wN0/CK4cjIYRR/uwR/J7k/uNZvfaYc9P10M025oq9Ys9tFfAVKlxDJ2P7tu/rZk4qdyt/OYrHoroDXRIExloDJu4VXMQMOJ+4rvKv9G5UZkB3HamZAwwlQGgD7pP8zonHS/28Cuf5PL0j/BwBEYkv1fwOJOaamLGKDs1Ak4Knx7mok+ytDd6ST+6b5L6H4V6NxmZDgbzBsmk0a+OPjY8Mghb8ChHtAoDt3JdlfYRssPXDqx9uwByRTH8O6AtWJAuIGXPauX666LAHzdwtHNgPMpwV8YhqbAVaD1tMMuDwIPB/RZgCMT/+3ib91+j8bpP8DAHZidfV/A4k5oJosZYOzUCTmqRnW21bJ/qn1qKhnnTf6yo66X/evJOoZHRo3LCP3SBCNi5/ib2tRzNX6/SZY3DGFH8I9CI1i5NxsqkFNAxZcRdkyeP5zUdTm+1G5AoLaK1MEsrC+UwRgBpAxDcyA46A1NwOIE6GfGaAxACa++xfp/xNgv/7XG6T/AwCGsZD6v4HEHFNNFrHBWWgQ7QTN6m0r3T+M6F9og6Hub5Ls/967qw3TFX+iUHWzbSML0VZQ/Mdo/ZOS9+nCwX5709PwZ2vTiybjlA0+8miDyJihvYmpBimlcuPZa9ZrJgr8inlMFCjGOs9N8LAETKcInMRomAHSmBHNAMGJkP00BJsB4ADS/6NApv9T6/8AAMAYYqr/G0jM0XRkBRuchQbRTlCo3u5qSuxk/8JH9sn+5XqJIHpBmStFCBpTQ5XmP0Px1w8829a2vggOP0HdQn/vF3alFP7TLxVJoN9nA+IJ91Ys2mwu9RPXOqXRbYPeqQbXEgOON2te30SByr5F1dPDFaAmCgSzBNYxAx7kruq2GZsBkghxzAAasQGA9H8xS6v/7PR/ev2fPpD+DwAYw3T1P5ToqSOajqxgg7NAEuc0Re7tTt2/kvPURcBk/1O0knAhCGKY7D80zV+l+FejsaBsm9sl+Gu1frf8fVkzhiBL4Y/7y/xjX+EedKKbW6Odx2VLr2dwjdL8mjx1FZLwJgpUdkwLuALDZwnwAsY2AyrTAnjR+G0zMAOOp3chM4BEZgDEeVZk0qPgc8oaexIbg/R/AMAKjFT/I4ueTJa7K8jZ4CyQxDlNC/W2vqGxkv0LbUCyf6sZRVSKf3WPVRR/jwT/jrCVWqQx5SOzTZhf1zcLpfBDuAchUTigMaYa6D2DovV+2GbKTq5ARbX//i2vTWkJ6JO+YQYkSzPgIW0PbQZ0jcPKvIo2MZYA8kn/byn4w4T7pdP/P0xP/wcAgHVZSPSsEUdBVrPBWWAS4WSt2Nu9LfbR/bUZ8VOS/cv1tIJMTfZXJYeq0vyDKf6LJvgzU1mLJTQ7BfghLRMqhV8i0YEfY0YXTsMolp1qUKvpMCXgWdtgyjauQNUSOP9x2JVVI8wAs7b1mQHHW30jM+DoFNlMC6AQGAATHyljLv6zf/o/w5ixgUr/x/o/AIABdKb/ryh6XoigHXeywVlgEuFkLd3bBk1fLtk/eej+sgNX6/5Wyf5CwXe24n+NdhfFX5jg36H1B/ghPREqhf/cOQv/3FvRN1qyDiR7tK8+o7Ed7SvCJfx4DTzVII9FzRWY5wrU+6R6FI2Pqzq9GqElQFe3sxnwLOy3uRlwMj9szAAKrgHg+JzpozJ7v/uXxT3y4un0f3L9HwAAmA1f/V9a9HwRQTvuZIOzIGLuKVu9t41bH0v3XyTZX9sM32T/QqjRin8hZneav20jW0N9ToI/I5Er/yjOVS9wCv/aP/RtRmv3JoQ4ISEaIeOtqYnPefhDNZtqYHNVCeEKHDXT+l6/femI58/yiQKulsCxkvuZAaXtrmbA4ex+e15zfvVmQHYQ/mbA7CWAln33733S/8n1f3pB+j8AYDZF9X910TPNVo1N2OAsiIDQ38nfWu0Qlkr2L9fTChIw2V+ohdimz5djRlL8xyT4p9YYa+3L2jz3wocUfluWFO7BXPLcapJtPYPUvD3om2AW2BUQGNZiV8DXEoAZ0NjOMAMmTwtI53uAkGYAywBYTkHwTv9nqf9I/3+B9H8AQGz+7T/8n6vrnstdpnNWPwU6Zp24DXp7OaH/Qug3+l7j3C7Z3zzNH4q/RO5PZIfMVPxD6fspsMQP4b6N36DdrquGoPcMkvRkRjpBxev+Dq5AUVHucgUYlsAj3yIHZgDZknocRihRw0KaAd3DbOoMgGXT//dnWPo/BdL/AQCu/Nt/+D9nN0EAhP5FgdCvZnWh/4g2I36RZH9tMxx1//5kf23HUqGmKf47JPizYmqRrc+T7pjC3+x8CPfzid9CbwYNujwRnGQNz4BwBTSNkbkChw2mdLkCDEvg8IGNJQAzgGxJPQ4jlKhhYcyA4zATfkdeRWkDYDm5oUfBN1v85x7p/zRk+j+1/g8AAPgRVv1f7sqbs4H0rGb86dugt3cS+i8stciP7CxoLY3Yyf5Wor9Hmn9Uxb8oGDF3pzd7/KKyhP4hP0rRJH6Wvj+/mWJi3FYt0XExuqoDxQHAM+DHO7TDyRUophS4TBTIannBe9Ww3BJ41PZjYG4GfAovYQYwJmosbAZIIpy75Hn+jFd43gyAkOn/ICVB+j+9/k8fSP8HAPgRQf2H0L80EPoVbCz0X8AbfStlh+n+7sn+IxT/QlhmEG5aow7DBP/CHuY/rYTc7/mjFE3fT63ujajvx7hNitQj7uxxsHqNj8nSnoFR4/MLQd9Ut2KZ6kSBNNAVsLEEnof9ppsBpThhzQBGqKYZ8CB3VTbMxAw4fsmF0wI+33PJt4AwACZqEzr1H+n/gUD6PwAgKoPVfwj9GzDyJG7Q2/cR+o8slexfrocIotT9WY/OdO05w5P9m6nuUPzrLWlsHp3gb/rTlOtEltFVBEnhD3PbM/+MgBlIz7t4wC7sGTwLOqW5JZCsXIHqRIE00hUwsARgBoii9TQs26UyLYAXjdswSzPgwWzP4Tyzn0BaBoDjsy4j/d+YYen/u6j/09P/AQDACT/1H0L/BkDoF3FPof9CwDf6nqJ1PHwXn67ZtQ9L9m/t66z7y/szJ57iL5H7Ky1pbB6q+Hf/QC2Zwp8cWzrqEhmiqzuR/FKFJOpNrUMvKkKO8AySx8EWtOuyWglXoEHTEoAZcCphbgaUboO2MgOen0j8OQHfxzHqmWTqS4DrLJz+vzrDvBkq/R/r/wAAPDBR/yH0b8OYU7lBb0Pov4Bk/3rZLt0/qOh/jSDvT5vGsHIOFTgm+LNiCjFP8D+0cP4v3fQUfivrcV2WF+6tiHrUIhXT7SB0gUNONSi/CnemK6DSAksfVl2BwwYjjtcRmAFZ9e8SJmZAScSXmAElGyqmGfD8nTYrJ6BqACyX/t9S8C2Eeyz+c4RO/yfX/wEAgOFI1X8I/dsAoZ/JBkJ/yK/tIrq/tg33WOSH25nx0/zrx0jvTm9eIsHfXRtk1Z4zIoW/2YA20S8P4YX7WK1hEPFyykWkno6b6TN/qgH7Ula8rg9yBWwmCtTKHOYD5PK7ybHADCjDMgO6BXeyYaXtrmbAL8R3OEicgMOEAEEbjg90h0ejsgEw99lp/Lt/e6YObAX79b+9IP0fABCJkIqhjA2kZ0O8T+gGvQ2h3x9f0f8UsOMRWa379yf7Z+UbcSSiv7wlJsn+ned3kOJ/zwT/NFzxpyX+iPr+iximSKwrVKzWDGTdA++6CLAFtloAW4w9g3yb5CrHdQXMLYHk6gpUJwqkflcAZkCZihlg+sIARsOUZoDVtICnKNLBCRA24HcYw5cAGp/+bxMf6f8/kP4PAFiRf/sP/2d4xZBmA+nZEAj9JBD6h7NIsr+2Gf26/+bJ/uxmrKr4D03wL9TPDNhRWBC/SHCJ36VZ3YKcE4GaAsYiOvUGU2LW8QwKLe2S7yuuQFHXjOsKFAuUXYGu22qYAWWOfXH6joQ1A3ob9mvS2wiQBqnacRQFA2Du4j9I/5+Oe/o/2QCk/wMArPl3/2Ax9X8D6dkcvzO4QW9D6J9KofNtZVMz3d9K9JeHYuv+rSPq1/3nJvtXpeGbKf71L3uYBH+k8F84SGEDWOl6tvCVayP6Roxxij2zqkmeQTX7vf2RrOqyOLn4q4Y/P4IwAyRxYAYQTTpPCJA5Ac/rIH0w2hD0JcAikP5vg9XkDDL9n1r/BwAAbPl3/8Dgxb9ObCA9mwOhvwGE/kiMSva/xlkm2T8r34gTPdm/sKss2d9Y9Gcr/kK5nw4oZ4kE/4LIFlTid2yWhcq/zCVqnysREJ5NHxmdJKxnoLQEeMGPe5d2H+0KdFgCBZkXZgArDldzzxltBlRCNc2AkgQvaFXFCeAuDZR5AInq56sBgPR/DRuo/x/I9H96/Z/OBiD9HwBgShD1fwPp2QmPG48NehtC/yQ03R402V/bErzR16QZZRF5hOg/P8G/rviHSfBPpwMvOzR28aV4/fr/mqSvYf6VackrC4iEdAh5iNE8fDyDliWblW+2xMUVeKZiFnSsiQIwA36b6bCaBPycEWYAI1S2S9MJkKXzp2P/vAMIurc06vJmLD8DoEfB55Q19iTCgvR/AMCOjFf/N5CenYDQXwRC/1wKYrcaF21Xnp+GZP9q8fWS/fvT/JdM8E8Oiv/5qA1y/APq+yl2Cv/KVwoRBqML0AiXzO6qSl4ktGdweX/ok1NTcbuPK3DUlw9BZ71UgJFRnBeGGSAJ0mMGPC8BZ5gBrTkBVhMCOp2A4wcnA+Bu6f82IP0fAABC4qr+byA9u2J7R7FBb0Pon46l1n/ERAecluyf1XVj3d842Z9dvBxNq/hftw1N8L9Wzg/YUZiIeYgsDB9Q4rdI4e8t/GXxK0KOWLjfrgeWIsscb523gW7Bu0J5kSGeQVU4vlgCvMbke1WPuzejv+wKjFg+6JjkDTOgGNXHDBBPC/AwA1ityjZ6OgGspYFKHfvlZwDMfa7Tqf/VFH6jxX+Q/m8Mlf6P9X8AAFZYqf8bSM+uQOi/AKE/AsEHUgDdv1eqrjZUckTXbZaiP1G1STPKmnKP6N8q7tuTbVZ8Z6+34u8s8feG9+vYgEC4Bym1T2tst+BdrbyI/HvOk+wf2ad6S6BSRf9EgVQ4rSk5uQIwA5iNMTQD5PK9gxlg4gQ8CjuJ2/BrwOXOl4qUdeyQJYCG6cvjuVNGPJ3+T67/AwAAQ1Co/8EVwyBYScMb9DaE/gisNZAqIq88Cw7J/tXi+yX7l4/IV/FfNcFfXkO9326Rwv9i3oUAwj2YhplbkLj6pgeiWitHobcE6jE5NQ90BZ6p6Opof0ZhBjAbE98McHYCXCcEfP/1HY/cmQFvA2DFxX+Q/m/D5wSR6//0gvR/AMAQ2ur/WorhLCD0f4HQH4F1B1KAZP+sLq9k/9a+/bp/U/Iek+yfBRib7F+3PbpZ7Z29qTiw5UGygBbcT+KnV1db/xrkgrpbVr0eLgtxpo765vEzIujor8WlPrbNW2nno7QtpitQOkHJ5qUCMAOYjYlpBlBd1GzP+b5QMCHg3CJbJ4BjA/whrflk2PPuX158xjcP6f9HkP4PAAjAV/1fVzEcT/9twAa9DaE/AhsMpBdmur/2nN5gkR+t6C9pRlllnpjsb/IdX/Cdval2LuRxsphy2DKPfdU13CX+ZPVF2IGWIDqzAfek4xrrCX2OpPMMkrFnwM6Izz8mjNTTZoElIKurN6O/7Apcu1gSE2YAszHhzIBzKJkQn6WHCJyAq4Ivqf21azY8jjf/NTPAeQmgkO/+9TYPVsQ9/Z9sANL/AQDd/Pu//7+2ERA9gNCfIPTHYIOBVKSi+8ufSicl+2flG3GqB9UjuJcjjNX9s6c5QdlqG+Ym+6+6pE9X24pwI0aT+If85ve7htGZLtwDB0Q2c1C34MV0z6DDEiiW/u27xkSBlPXw2Q+AGWBuBvyqOoVkxTQzA56X9siE+MqEgEqEc+z+CQGV2QCfz17PE9dIf1jxMbJHwTdb/GeP9H+r1zOQ6f/U+j8AANDJv//7/2t2E2LRc33fQJ+F0B+BDQYSSV3kFRw7Iz28XbZLra42dKLuj2T/nq8/lvQ5heWHknt1VgyS+JPVIB8KhHtgxD5uwQu+Z3DSfNnfeUk6fL5RMlHg8+9YrsBJKocZUAzSZQaUu/Tc7ao4EjPgILkf9HSZEH/c7+wECCYEpFO7rZyAfE6A5wyAkOn/IIdM/6fX/+lsANL/AQB93Fn9h9A/uwm9QOifi0HTtfn+j2tZScFuIY+t+zuK/tcgyyb7/6LMS/Yv/ZKEUfwLcr8q/EDFfzl9P0WT+CHcg5XpcgsK5ady1Hyz3wmuJcCeItDYuKwrENgMELbhxMZmAC3EX8icgMflUx6HslTxihPwKOwk9iGyOOnz3XdeAqiJ8bt/jcoi/V8M0v8BAGAUOrF4aX32BYT+CGwwkJwETbFaPSnZPyvfiOOo+zeFFa3uPzHZv1XcWfcvJ/sLh/myCf7ioE2lpOvwx0n8pWaOv7h4jJklqXTA+pf76KgvAD7oLoszJxm0LAH2wkFCS6C2XewKsDsq37Fal2C6QzAz4PfXm5gBT1bMsxMg0fE/knspQueEgEqEc+z+CQH5rodQbgaAlbjMZ1j6/x7q/4fp6f8AANDJlun/EPrXBUJ/HLwOQy5Y9+n+vWp1tYkTdX8k+3fQm+y/rOIvjmiY5j/kh93Qneplc4nfRrjftHNW4Ko6Nk9FMLfgi6Jdjp7BL/TjqN4m/hSBVDkEc1dgwEQBrqwPM2C8GXCNR8QUpOQfOex4UOTFQrxgRkIWu+kE5DWwmjFxBsDC6f9ABJX+j/V/AAA97KH+SyXjDfRZCP0R2GAgHXE/GFV3HZ/HZKW2SPa/BkGyv5qeZH9zMbcg96vCx1T8PX/bA0n8yWFguAPhHhQgTugWbsELaevYanKt5Kv09XdLYAmkSiPlroB4ogCjFlZdMAO+1cQ1A6hpKwIh/oKpE8DyISpOQOUMSlviYwCsmf5/o8V/Evcc0en/5Po/AADgxnLqP4T+FYHQH5OhhyTvQCpJvFFqB93fXvRnt6EqRvfo/kLR/7qh4zdEn+wvUD+40c4tsJf7NUGDKf6x9P10ll1mAuEeROE+bkEqXcJ8LAH2qkGlaMe4DYobnVyBqpINM+BbTQQz4FfJb4EgkRMgUc8PlsGhdraRUKidasA5dmlCQL53PdqbOTMAjNP/GdF6pg5sDLn+Ty9I/wcAuBFf/ecLxxvosxD6I7DBQKox4cC0nXl80BIU6dP9q229xpFIpUj2XzbZv/f7kjXeSfFXyf10OTpsjyVTrCGAxJ9G/04S8k9l101Z//5hVZzHlqVbUI44euj4WALXVYM0lkCqdMYAV4BdRSwzgI6wnhkgGzYFTfzxDePjBBx27J8QcIhXNxKy2E/6rDXMAAcDYHz6vwVI/89B+j8AICyh1H8I/WsBoT8+kw9vqPTvoPuPTfa/Bhmo+2cZVLLi5Wjzkv1LKsQo0d8kwT+Lk6NS/GUZj81QXPo9OUtmZvFX8zM3uQitfz9wd0RncK5b8CKeZ3C59plMEShZAkm2cFA57Cs2UULsClx0/Xr8WGZAOvfpYmZAtvF7J1O97DAa8Pj98XIC6CDnyQR1If6CqROQ3c4SPsqvRrqey4m3NgAYyjLS/4Pgnv5PNgDp/wAAFXPVf458vIE+C6E/AhsMJA4hDlK9vv8vgrSgUl6sNnSs7m8v+rPbUNb9kewvrDerTx7JI+97kuKfjk/ug68d01L4z3VSeZuxWOT6HrcDV0Z/8iO5BYJKej0DWYflXriRJZDydwkknSsgnyhQ3F6p+OgHtK6yMAPKcM2AepL61/N+FAsyav/F3rqtCeUAACAASURBVHJpoGPBV2Xceh4TXwIswlvBR/q/BjL9n1r/BwAAFAxT/yH0rwKE/rUId6g9+f7vCNJSRH4UXeORa4Tm4yZRVtiGgcn+Ke86YfFCG1plx+v+zqJ/TMWfJyxxw4ZV/CdL/IdqpyfyL3K9DnedAgf4Z6druMVzCwRVndL5L5qiuFcsLYGs/pIrEGf5oKMCPcwMOLsB9zIDCk7AI53Pg6jeqxPwpOMonYDDjv0TAtL1W8uyAd4FiH1NDQC39P8qw9L/t1H/P5Dp//T6P50NQPo/AECOn/rfvlxuoM9C6I/ABgNJStAD7jgR6nGoXu2nU/cvbOhJ9r8WZ/Wkug1ZLpSgbLUNs5L9y4PHU/e/aghBFH/G45ssoAAv0f+bsWgaVULruBxbFem6HPJyo0hhvTEibdsqniJuf+FRgzW/fp3cZyNLoMsPKDThoxXPdgXqZkBqzMToNgPOt4tHN2APM6AlizedAMXV+6qn/9wEOsh5MgFLiD8WMHECyjfBzVDUnIAFZgD0KPicssaeRHCQ/g8AWBYT9R9Cf3wg9K/LAoc9XPovCK890v8s3d8k2Z/dhrJajWR/do2HaiQBJiX4CyJr5qxYKP7zU/jPNY9M5B9yRY537YBwPwNWh7MHy1G5tIybZHGtyht9STwsgbyQgSVwbUXBFfB+qUDdDEgpnVcK6jED6g14bTtI+U/VvVgwM0DgBBRsgJRuuTRQKvR2qzH1OQF2BkDI9H8bkP4PAACz0an/NcFuA30WQn8ENhhIPSxz8DPy/dMlhyvJHlbU0v/1U41gWiuu1f2HJ/v/oiDZn12qiKoZdnJ/Ug/gPvVWbb300pL4k2uTui/HYS4HEO7BB5FCGdktUEfhtfJy4Tv9/qn8gGI5G0sgXS52xRQLeU8x5HhHM+Dyb6YZoH1tQCAzIHMCZBMCkvz3/johIKVVlgZ67apxqq5zAsbNAIj57t97pf8Pg0r/x/o/AAARpPoPoT8yEPr3YMkumLPUT7r2Vk/Kf6G4vfTfLMvqQ4Zj0S5ooPsfH2vJXaqfGif7Vyu9FGTv2igoqKjGiop/Oj5Nd4j+Q37iWu30bUB0if92wr15f96p8xwI4xb8mtMPO9W9uovRFIFiObb6THFui8FLBShhHWbAr9j3o68ZoB7u6qWBkvwCcnUCTjFYTsD55pU9ISB1OQF1DyCv5hrzc2KMDACrhWUCslMuPO800en/5Po/AABgR67+58LcBvoshP4IbDCQrFi4Iybl+6dchA2f8l8Xvrl9qK69LFj36P5I9mfsf0FbtUAe4AUUY6L4J/sfOuLr7/67OlPlf/TXvgREF83rhIWv2jpKBzyo+z3dgl8hIVwBUV6NryVwLuoxUSD1vFTglmZA0lztPyXUTgBLFq/o7a8LusJHPqv5RyfAZ0JAOh3CoXaukVCYxEDUdClnYQC4Lf6D9H8PyPV/ekH6PwDAjv/v//lfR21lA30WQn8ENhhItmzSHdPy/bO/xk75n6X7Py5/SspWG7Bcsv+nXrXuzxL9U/noVJUyHrtkATWcjloXxEbxb7VhxA/p3ET+ZS+ddLvXv7G5HaLv4EpuQdI1rVFHNZxqisB1L6NVgxqlR7kCbM230phtzIB0PhFCM+DkBIiG/zlAwwmofGw2ISCl+EsDXa0Lbn0LvATYCZb6j/T/HKT/AwBG8R/+3v9eV6iF0B+BdcePK1t1SpD1/b/0SP+8RHJeQUalz/LHrLKSesuC9cBk/9OGWyb7CwX6IIq/xlHLa+/4uSuktC8h8aeudsZK5IdwD2xYyS2otKDBI7UbmIeztQTyWwuTKQKNAML7lyaHWF/tGGZAoSVcM+AkYn/Hpt4JONz91K/JTk7AKQZrSJyNMPaEgKR0AuTntNsAWDb9/564p/+TDUD6PwCAx3/4e/97dhNYQOiPAIT+Btt2TSjpXxKQoaSXD+36qa5SYcq/ulIr3Z+h3TO6C8n+rYLcvD5dSzicjrTvZCX9j95JKnD85Zws8Q9K5CfqWP/GA2xLn1swYWiT2mp206O3BHg/HoMsgXMMG1fgc1mEGdBqyZNz+3DSwH9OgM4GSG1ZvKK3v24JpDbAd+9fU39OgM+EgHQ6hLPzwW05b07AhjMAzBb/2Sn93woy/Z9a/wcAABYFQn8EIPSTbN5BoUT/L4JEeLKssfRfEcG9dP/H5U9J2XKonmR/bdXfslkdnqJ/+rWWpfvrkv03S/BPHb39LWeu+Ntdajua5JvI32NG7oMkt5P18SDWPlvl1k/sUdE8oVluweXe6avFXj47lqiGyj5RWQKnX26Gzy+rIncFdCMEZkAjxKdGqoevGjiWBmpy2PF7c1LvqEI06mz2GQAh0/9Bgb9JKdHp//T6P30g/R8AwGRi+j+E/ghA6Gdyo24KKP3rVPhyWWPd/1TWP+W/LFgP1P09Rf9qpXlZ9q7XUqnWh/X9j9DFqEftlRT/1BBGeA15Hv+hbIAVXb/hzhdKs69VNFYV7q1Y+ygoK/1Z/pgOMYQ+t6ASQ9eMiyVgN0WgWLi9yy/p+VHaw8IVKAjCwpEAM6BW/lOdyAn4mlB6J+Bw21T/Yjk5AacYrGFwdrskV6FnerKuSVUz4FzWdwaAsfpvVBbp/0qQ/g8AGMIY9R9CfwQg9Iu4XWcFFP1Tn+5fKG4s/Vc0O1ZPSvU+K92f8Zg/Xvf3FP3Tr7Us3d862X+I3H+op/9SNSvNv7vl3T/aAxP5499R3F24Bxwe1X98WdYteMH3DCT6Zn4NtLMERDryOUjFFej9tcrDyGTo/c2A50nYlpzBZ0l0Lu74+8frXOtsgHS6a5c5AVIb4Lv3r6k/J8BnQsA3PP1gUx0A57PfYQDwXiprybD0/83U/xjp/wAAwMFc/YfQHwEI/Qpu3WXRpH9hzLWkf0WNBdlarfsHEv2rleZl2bteS32qYZS2TvZnNThCgn/S9vCPn1zSc5p4NXXi/tLd+So/hPsX69/L0Sx2xjZyC16cm/XI/qa3BL4ybTF+O7hqikB5x7crkLetVT+3ok8AmAEHJyA90+nltCTfsyGaEJCS69JA36BOEwJScl8a6PCVZDznNMwAxxkAC6f/AwVU+j/W/wEAkPSo/xD6IwChXw06bmnRv9V0Z93/VPZZ/pguyKu0X/evNLXVqMKnSPYvlFKJ/iZfHJMrl53iL47DGvY97Cvx19TGzS5o69+bjSNIX7kMwJXdgtwQlf5+51eZ4asGVffNXQHGrQYR38wMOMrnjSLfikuNKe373mhlBtSP8SiqPxn7X+vF0kCM1qZqg4sFX0fIbeZlAGgNgDXT/++4+A/vTNHp/+T6PwAA0AdT/YfQHwEI/Z2g+07Ekf5tk3+R8p/XqNb9+342S+PEU/ePnOyv6snTAAii+B9aMlXxd9f3U59B2MXSEv+QXlqhIzancJ5Fp/6ebkHFEnCdItCKf9kgP978juh6kVHdT1zNAH7bfj18tMujmgEsZf+wQJDcCcDSQK2Cn73rDc4LHse2wAzwmgEw/t2/PVMHtodc/6cXpP8DAPrI1X8I/RGA0G8COrHAsqL/J06d3VL+z+V0HolE0qgYG3KQ7E/V1SDYkj4vHBf2obp9xK+42ciXUlb55124INwDCaJTeQu3oBWozuVXWmr4FqYIFEpfGiWYIpAXpije8FRcAdZRHvcdagaUKjI0A8Y4Ad/eE00ISOnWSwOxv32vMqzdVQbA+PR/C5D+XwPp/wCAufzHv/t/lpb7IfSDI+hKggjSv7noX45pLP3X9UGh9O+f8p8OD3tkcwof9ZxoJPs366oHkeo9TawU//RrjyxaSMW/x/brYmQiv/NBLXCFFaYX20a8EaqhcAu34MUznbKPteKpqSXQMUWgtq3bFfhdrMKaAZdGKc0ArRNQqvG7odcJaNoMx6Z87SS9E9AS1isGgZkTcIrBcgKoRJLSr9Px2l6tRG4AMDRlpP+Hwj39n2wA0v8BAHX+49/9P7ObwAVCP8hBh7JYVvT/xKkjkZutpX+h7s+rsVP6n6P7q9/oe9dkf+ME/9TRkyccFX8qoM1KPtMk/nNdASX+6NdK2UENPpronTeH6ymrn0Jt/23gFvyiPg//6WqsWAISVfTiBxRKyyyB2mbJoR276HQdKzWvFSGYGWDmBBz/TTgBz98IY/TAq4MZPXYS7X9OgHYAp76lgUqlqErP35lfX5EFU7Vnmq5Pa06A40uAQ3HH9H8ryPR/av0fAACoEVP9h9APaqBbxcyV/p1E/xc6jbtakGpGT8o/o9JO3f9XWNEt2tOEZP92XaUIvd+LY3VGv4fz3t8r/3Waqe9n1Tmq/DpvcgqhhXswkvrJFWnzO7sFX/HxW6OBJXDxAxL/UApTBAqlxZZAcQ/eoV0yEn5KeXwzoO4EpPzS8TxsaWZPCJ2AWywNlJL8JQGF3pAsDcTsw3NVKZXnBAgNgI3T//dT//8mpUSn/9Pr//SB9H8AQI3p6j+EftAGnatkWdH/E6cOEfxaVC0XXp5Ca/HoFuyX8r9lsn+qfmvMRH/2/o26LH4Sr1/SyIp/c2y7ESyR3+s6uKlw32MrdkS5HY7X+WBuQblu5vHzbhkuloD5FIHEP18FS4Dr83tMFDj2THQzoCm4t2Tu5rSAurLcqu7rBDy/rWYc+MkJaO1/Oprv2TBxAmQTAj7bO5yAU4xqHLabklqn7HUP+1x+BgBH/dd5EiAlpP8DALwYqf5D6Acc0MUGzJL+u78gDH1WVlotc58fxVtVEI3gSqWHcrFT/hmrB5cwSPZnBNgv2X8RxZ8KKF7YZ4Tov18if7WiZa6rNsK9FevftXrzqP7jikVfznQL1JJmoS2sWLFXDUrVm0UDV4C4lvxKzTYDmqvHHLflnVfa672l6QRUyxLGw1tX508ISJ9OZfTSSbT/OQGKL9rHpWj1T3HL605JkWVRdwLok8s+wIIZ8HxIDICQ6f82IP0fAAAG4qT+Q+gHfNDRZiwr+r/jNLbRzTOT/uulhNK/f8r/r/AY6f/6NMo479GT/ct7EQVFZ1baz2Zyf6EB5tIq1VGyCl0U/2ESf1ZXDYOKdQ6cMz1fc7AJzRN6HSFbuwW1cs/TH6JaHul6BTewBC5+QLFp9QhFVdvCFWhK5+Wwc8yAx0FxVk4L8HICKikN3/ZiaaBypYevxCUG8bMhNwMsZwDEXPwH6f+OUOn/WP8HAJDTr/5D6AdS0N0uzJD+Tb47PIlWU1qhdFfke6Huz6uxU/rX6/7Cit7FpYIjkv35BEnwPzSGqqNRfIbiH0/iN6i7UJHjxdPcGQKAhu8WuFsFzTpM3YLL9pa4qLIEzKcIFJvWDKJ3Bco7BTcDforzVSdv7+/hBPAnBCQsDcSo8Rz/WFMpnnBOQBIYAIz0/1W5axY8nf5Prv8DAABCROo/hH6gA53uyLKi/ztUY5sq3/+9QXVoFbfAXvp/XP5kFClHmJPyX67iuD+1R7XUp6BG9GdVGi3Zv/ogz2eE4k+FHbuwz3WA+VxhFk/k7x/SAMQillXQrKbhFpQK5Z9VLQHWz0OwVYN+cfJbCcLkjGUGiJyAXyZArxOQrs3lvieA7wRgaSCyxpzfClB5PMmcAJ4BEHLxH6T/V+Gt/9ML0v8BAEJq6j+EftADun4Qw6X/EYv8vNDm+yfVoZ0iIuX/XOQc1Fr3v2eyf+rU/R9Zv6lYKM1fZA7Jw5L0VumTyF8Osf79m547H3sopt8F8q2Cwr/5kURcpEfiR7xqCRhNEUiym51CU/KMaE1fUW8UiGUGSBPY3x3V6wQcP6s4AamdqVFwAir3RN+TiaWBCgUr7XxcBpekbLJdAigaLPUf6f81kP4PADDlP/7d/wOhH/SDEzCUZUX/d7TGtuH5/teIntL/4/Inr1QhwpiU/0KXmkr/Uj3XVPendG26Ob9mj0j2v1ak/EL25vini/EgiKZyng5B+n6CxiTy+0j81Sjr37ydGJGS3bfvbjgOoLO0TBHhJMyZWHCIdZH2qyJjpTojS8B8ikCxaYxoh+pDmgH9TkBivjRY4ASkzwW6NSeAPyEgYWmgWnX0fVLFDKgPToYBsGz6/00Zk/5PgfR/AMCR//R3FlP/IfQHAadhGmOl/0GL/LwYm+9/DVp9wJSWbeyv1/3T4ZmKbM71I4OU/3IVzf2J+J+gVLn7JvuPU/zp4MPT/MtWGVWKyUoq/yp3aEbthHA/Fsc+LIWuq7V3sgq4eQKdUwTymlhd57xqUMqOjxVnqBnw/N4/KJwAqpZzq35vCmA5AaXgFWG7tTpQuQgrtx1LA2WlWf3QNAM+G5ecAWC2+M9d0/9pyPR/av0fAAD48p/+Tu9bf/2A0B8KnIzJLCv6vwM2tg3P929KbELdP7EeYTulf73uL6zoXTxIyv9Nk/1/Vei/hGsq/okzKkqlWu1Rc59E/glJ9/NuKFZxU9aFcurZn1ZPVVMolbbHn9qF7NHe5br7eVetJWA0RSDJbppqrdG6AjwzoByKZwZ0OQGfHblp7FcnIFm/NPjjBDTfslAwjSpf1m8zsTRQXheHghnwiUAZACHT/0EVXvo/vf5PH0j/BwB8CaL+Q+gPCE5JIAZK/+MW+XkxPN//Grcn5f9avLG/4EG/HGGDlH9X3X+PZP+iJsKri10Htw2yaL1p/l2Kf9dv1t4qv9nA0O5rCIT7VTBL5Kc1QrLWZ3WLoj3W5Bq+3hIg/ID844LaS0W47HGxBLr8gHNLjr3RYwZc2tIyAxhOQPouEMT2ur+WgdAJOEwKsHUCnh+9u24aFSYElOK/m/ltZHPqQKEWev/TEYh78kjmBMgmBCT2ULzspDIDemcAjH/LLtL/3UH6PwDAiPHqP4T+sODEhGNZ0f8ds7FteL5/NSiViVQtu13Kf/Y8SPUJX92eofszShH8Whsz2d8kwf8dSlYzW/oo1nWIMEz0d5P4y4HG69SyaRDDr/YQ7kENS2mebwAHtgouMr7eD8hjNQpkVVwqYx2s6apBh2b8inLs6ZMZkC5HUlF5zx81m3pW5R/8y6HeCUi9Lw0uSd7zlwa6+hu0E3DY8dWTikH1OYr6SGg6AdI7epUZ0DQAGOn/Ouan/2+p/sdI/wcAgBeu6j+E/uDg9IRmlPQ/dJGfFzPy/auheYcvlf7L4uYY6V/VRY6r/fDzu+sPYfX9hbq/KNmfvf93Z7HuL032X1nxT8xhkJUqNENQyub3rfLrYRJbwhSV/5ba/UI3SDc6P6JDpe4m2J9Wax20BtHUKQK/MkZTBE6RVOrt0Qwotuuy/+GOzNkJSAW/oVpQmsn+dRs6nIDKIWNpoOtn5+oKNkChQRJH51SyRNcMgIXT/4EaKv0f6/8AAJKd+g+hfwlwkhZgWdH/HbaxLU6+/xFGP5z28E/5T4cHIbI5148MUv7LVTT3r+55CEfbCYJG+Oj+v3aGSvafp/gnYiiS1R0iMDupV/Hv/VmLr/KXWig86q3VYlsjbRWC3t1VmjWu780S+Wkxkqy1NbFAncL8La33A/JY7TLnAtMtgeNVhmUGdDgBzbb9InzvTxROQLOKS5O+TgDhQ1Vy9kvCdsLSQOVuaQ6Q306vBvBrbw6tugGwZvo/Fv9pQ6f/k+v/AAAAhUL9h9C/EDhVizFE+h+9yM+LUPn+L6S6fxoh/et1f2FF7+LOKf/plFbV2o3bCC/d/5usRu98jCzW/UXJ/rJEb6JGPqMV/0pdlG/H3bFIoUwkiT9VtRqb4DG5p3C/OZWTVZEK+QEcMLMKqntknx7U9yexK02QKQJ5ZaxjMbIEzmYA2wmoVqWbFtDlBCROCnzent+bAqrV6CYENDNECk5AdcB8VH37CQHfbYcdpUL8l89R1PX+1th/73H4oMcM0M8AGP/uX076/33hrf/TC9L/AQAUbfUfQv9y4IQtybKi/ztyY1vMfP/kIv0XFM+9Uv6pPYo710soBV+J9M/X/UMl+zfbYzK2q2E7FP9EnvFKqUIzWKW0ChxUfh/6Da154NbJD+Ep5/8srGIVJI5qWfCfryKubpBOnSJQLNqOkO90uM85+AFsM4DtBByCmi4Q1O8EXFrX4uoEpOoCQTonAEsDUQ0s7iKeE3CIVDEA3NL/XUH6fxuk/wMAvPmq/xD6FwWnbXn8pf8Ji/y8WDPfvxBkWMp/tdS12dLmXZm72s+tdH+jZH+qf5Tf8X7Rv2B6MUoV2sAqwlaMKnX5Ijt9sVT+NbV73AEtgS73Vbk73yqQ19cBWdOj8bePhO7hB5zjDLAEqlME6hEuexwuW58u4Snjx+NlTwtwcQLS89Mc9jX4axkInYC3FdB6T0AlZ/9RbBmWBjp/QNZ72qCaE1AyABjqP9L/YzEm/Z8C6f8A3Jz//Lf/L3T/tcDZ2oRlRf938Ma2BfP9ew6nrH4qpP8xKf+FTiZ0f2qP687plClV3YdXfQzdX9QJ3319k/01S/qcAk5V/OnCZcmlxSDRX5bIX/lMG7+fXuPQkhi3MwK9c2dGjAXh95iBpNWVfflXF/cuaon7F6G+4gdcS2mqPujrhUaVuOzdMUUgr4+hOH6uaDInIB2OdIoTkA7X4ndznJ0A+o3BugkBzXSSghNQHRUfVd9+QsB322FHXT5++h3FI/us0cbiXvw5AV0vAQ4F0v97IdP/qfV/AAB35j//7f87uwmAAD/iG+Is/c9Z5OfFgvn+3dK/XvdPqf24Zy39T3/Br0j6l+r+pfhZ2Yt4QhEw2V/95t5mdS2YJ7dSqtwSutRsxV+m8geW+F2qC3BjAtXemhE9RqmOJ4zdAh+roPKpzXdO4QcQpTRVX2rKa8jId+2wBAQOx2npe64ZENMJSAeJuonSCfjk3Fcr0DgBrQkBpyJEn3QvDUTbAL9GmCwN9PqfzCo73u4cStZu8TIDYOP0/63VfzL9n17/p7MBSP8H4MZA/Q8IHlm3ZVnR/x2/sY33hFLe4CT6v9Dl+yf+Xbxe+tfr/sKK3sWzrCOigEb6j6z7f/7H7zqB9P+LLO20SqzSx4rR1ayIwCjNX2gZDhf9ZSdiV5V/7H0HhHuQUT7ppaESziqo7M63CgT1CfyA394DpgjkTWtVefEo6o25bGHLx+cG8qcFDHMCmo35RfjeCymcgGYVx50e74Otx6/k7D+OYb6ffU2b+hX0VITlBBz8HMbQffUDoxNO50rsoxzJ0j54D2QtMyCPsMAMAI76r/MkNsHkhQ1I/wcAaIH6HwH8Rt8CT+l/2iI/L1rNo1IcnKR/z3z/Q3FBLlw5gkL6V/WY92o/BSMk24dbvVT6Z52vMLq/WPQX/HQ0BxWP0xOsXvFnFT486nIqsfIzWpHbn8kjWxFL5b+Pdu98Wm+H3cgIZhVU6xHtexHvLfyAatSL/F4pK679YgkI/YBziaoNXi/U1Hn1TkBimO8/JyDVrm0tM8DJCUhMEfx7sJGXBnJ9V/B322HHigTPR/6y3+t4yecEnA2AkOn/NiD9HwAAHID6P4V9no0BybKi/7uKxjb200dhg5Po/8Iz3z8dHr+kBa9t4MkSp38r+i3Yaj8b6f7p+3A7V/fnSQF1llD8KzWyqApKu0r8hWA0rEzcRYBqHxb+qZlhFZQ/FtqvDKheyPKIZdcxQtZ/ZJ/VLQHdWbj8mMhuly7tIn6YriKykxOQDvcG5Lk43sn4vDS4ywlg2h7DlwYq2ADV1urfFczohOsR6JcG+kbMRHxmucPff2aAbAaAcaK90eI/SP93h0r/x/o/ANwTqP9juPFF7t64Sf8zF/l5sVO+P7s9j8ufwuLp8PjRCl/8KGTKf/rK6819WNWXTt/eur+B6F8PTnNqv170F/aAUPQ3SvOXHSZU/olAuAdfZlgF5WB8q6BcXrFTFvtyxRFe33RTBFJR/VX0tscUgXpew9UJKO383aBzAtLhKNjTAlycgPT83Lzw7gm+fgEtZ396ZNjSQOU+afaG4l3B6dMJ7AkB6ddb3U5ASoo5AZfGHA0ANynZZgX/Hu6d/06n/5Pr/wAAQAbUfyciPlSDYSwr+r9raWzbKd9fptqXwgiPaKj0L0/5p/Yo7mwh/ZcepHoGofOrfSXv9fXT/XXfpjul+R9iVhqwjMrfJfGryqvYSLjHLdwYLIdMHKsglRsjtwou21h+QLUiToMe5X9cAntNETjHYVkCx6Y88s3nOLQ6vKoT8Nv4fWmwjxOApYHScUeliH+IqJwTkNLPAHBb/KcK0v/7+ZuUEr3+Ty9I/wcAZED9t+LG1zBwxkf6n7zIz4s98v3Fkr2BdKjX/YUVfYtUnryY+7f2PETk9gwl5bOlf5YewHkEP8Vkf7X8dH/WG315j/PllhA6eKVUuQHcUkLRv0cILOezGzh2JHYSfyEYjZ/Kv6aU39cDIwYMOHG6vlLCqWG9olh23yuxVUBcG8t+wG8/qR+Q71ppQB54wIuFGzfI10aYOgGpejoyhjkBzcZcnYDEShl4fIswDxNLA33HBdNBIRsgtBPcXwLsmv7PUv+R/t8G6f8AACFQ/9VA7gcnkO9f3OAk+r8Q5furWrJeyn+hz5sd+ST3uO6cGo5IKrS5KeWb6f6/Vjnp/ondVzLdn/XTwXhyL7RBrPhXapEcslDxr9TIoip8u2i4cVR+4+tBDHW7J3uy/HGM4wI0fMtwllUgCmduFXyqjuIHXOt8ZH97/v4gvARxAxhHcdxWuGYf//U8/dG6k/1tVLw0WOYEpNoFtWUGkE5AErwq4LudlrM/fRFiaaBKU8cvDSS8ISoFPRxe+w7xDykFfffv/IWDgjMm/Z8C6f8AAFADcj+o4iD9zxf9X1DPCK3NTtK/KN/fUPSXx6R0fGvpP9gLflu78qX/ybp/+j6L9nxZKodmrfvrRP9exZ9bV6etlRckFH9VRXYqv+oHfE2V31K7h2oPGtzbKij7Adc4/n5AvnflYp7HNp8iQMnr323lq/hVTWYJxPIFgo6VkzP96jJ9Wfu+fMR3Ai7jqVaEJYJ/j9FnaaDSMvpQ5wAAIABJREFU40ShCNEJ45YGyu92+hcIqkVwnwGgw2zxn3un/9OQ6f/U+j8AgLuB9P8a+LkEBMsu8vOuqLGNfhCsZ0k5if4vmPn+XW0QqNvNOI0iTd1fWNG7+LUI1Zca6d9C90/lk6iT/qPo/vU2DNf9ecenU/xPBUcp/llZW9GfIYCwAgioHo4FdkImUxVxqj069zlSV1xvdnysAtYefDixGHruL1m7UEToBxz+JjhSQtavxn6mrKxiVJwT7YvN0TsBrSYpXxVwtEdanXxUkj1eGnx6TwAj2Wfi0kDPj7Zeqv2nu1PBv59+ijgtDVSyK5oiPofanIA/xEz/BxzI9H96/Z/OBiD9H4CbAfX/C65kQADy/YubnaR/Zr6/k+gvD66X/hWHsOULfpm6P2PP724K3T91fF+6dP962GLtXN1fJ/rzRbR8J/VXcoDiLyvVpfKHlfhTtW0K/W8FeIeDu8FxlM4I+8rp1Aza+eK7BTZfILY+rvID8goyS0Bkj9R2rVz889+arikC35YbOgHHv1k7AengW1CDydEJwNJA1ksDVU9Lz8t+8zivCPQMgPFv2UX6Pw3DtqFB+j8AQMKd1X/8GgIxy4r+77oa2+hHuvpDj5Po/4LM9+9+vLbK9089ur+8rleRStYUc//WnoeI3P6hBpiB9P9rj1gf5zDz1b4uur9O8T8VHKX4Z2VdRH+iCFT+eLDbhpu6beBfGqqjI4hb4GQVaP2A35/E1bjqB/x2Vfx4ELL+I/vb8/cH+5Dz6pry+tkJyCLfxwn4lX3drTEumQwR/FT7XZcGap0WqzkBXksAzU//31j9Tyml+en/AIBbcSv1H0+GoAtr6T/EIj8vqNv71mYn6Z/M93cV/d9tkAZslGpK/6pjWeYFv6lwNqs7E9K/RPdPErfjENla92cM5mbYYu1S3d9X8c+qE+Cp+CdW3zIOVtGZfPZW+Xk17nB7FtlBGc/AM8q/mqxuFbSGmEQcv/wqKv2AdLxVuBayczKqXsN1igB5Eml5/Sf/FmN2OgGp2tWKph53dnMCIiwNlEV7HDYedv58XKq9UITnBCiWBnoS+5ebn5LBnADCAFg4/X9jTNL/Saj0f6z/A8B92Fv9v/cVBRiBfP/iBifR/0Uj399IYTHM9/8EbJS1lv7vt9rPuz0uuv8vco9PVjkoOiT1WH2t3V73V4v+PV/GsKJ/WfbpZoTE/9niJ0O3BLNlgWrvhHnHWgy1ta2CzACf6gdU6r/8hPb7Adeay17DQVy3dQKOe5db9Dz9QSi/XzNA7AQkxk3Qzwk4NqjU2vzfTSdg5tJAlRZW7I35SwP9eqy1Z+ucpKScE+AyA8A1/f/ui//woNP/yfV/AAAgpbSd+r/8UyiIhqn0H0X0f9GRDDsl399E9zfP9/9FVuj+quqGvOC3Hpav+ydD6V+iae77al9a988CMqQuoeKfVSFgjOJPFGzVZfADvaPKH/TOKpBqH7SHVoNxRvknfVer4KIZD/YDCqUYlkBuqfpYAifBXusEVFr17ebypeIqK7Nq731pMOUEfCJmtxoV3Zxo9q/UKzLjDua1C20DpG+/xl8a6DCJg2MD5N+GSvBLW34bDp9xHiJbBoBxoj0jGif9H6REr//TC9L/AQAppfXVfzxyAReWXeTnXV1jG/2wVU9bchL9X9TuiO0kHvN8/3dYyXM/T6Cs4J/yn4S91BRHeLp/Key5FFvo3PfVvj+lp7lboYrqbkLRv+drWG6Y2ZeR15nWov8IlV+hkEmYJfFvp9rjRtQO/gXf1CpIBmdRdIFjZwswMPQDmm3ILwf1i8nlo1YXPE5/CH8eqn7GV8zXOAEpmb40+FnalhXqdAIqTT025TtCCk5AoWxT4P5edg9pCZTr/rw2pNna94wAo3cFJ+XSQEY2wLX889CicluOjeCXfWM/A8BVxEf6P2f9H6T/AwBMWE79x1MWcAf5/sXNTtL/3EV+3m3oCM5+iD99ZCD90wcl1/2bYT2kfzvdv9WePLCT7k8n44l1/0Selyxap+7fO1BLBR/Fv/ZVxOhJC8UfKj8v7FiCqfaB/Iwd+Aq35I6WVgF7r5Rshg7/mnj9jCthH7TwszjLyBnnVnf5HX5eNzSi5EnR2a6Kn8aC0F9xAoqNKrbH0Akot/BaSOcEpMuhtnYuOAGFpl7+3byA+S0N5DUhoJ5QM9gGeNfTMgOqNkCtbNUAQPp/WNzT/8kGIP0fgBsQX/2H3A8Gsazo/66xsY1+cnKR4BnSakklN5bbBHK2ICxRtv7gq6p0yGo/Frp/qpxTXthzEYH0L9D9U6o8pBfC1kOUPl5c9+8cosWCj8ufjCJteI3sFv37foLqVbCHtI41VH6DdtkcGiT74PBOkINVwKt7rlXwFU/5VZylVnc/4FCqfv25fNSyPh7nEqzuJ52A8j6tUE15/ewEZDE7nYDU6slCax2dAMLH9lwa6Nsflk7AfBvgHeX1vW7ZAMemEGWNZwAg/d8Xk9f/kun/1Po/AIDtCaj+44cJTMBO+g+0yM8LhUz23ewk/c9d5Ofdho7gki49/VtRKV7w2wCv9m037LdbXVooRZNRbUlLhefDtiVGi/6EAHILlV9WOVR74IWxVSC6tsy0Ci4/jzH9gJRdaOrtzANlDcmldc6PrqETkA6XlbYTkNJvrkFFjP4VZzgBvwq/4reHE8BZGohq7UGk/97OULfO3zHMdGI6lgYq3Ng+yzf3E22Ad20tM6BqA7woGwC69P+ed//aOAd7q/8ppUSn/9Pr/3Q2AOn/AOxOBPUfcj+YBvL9ixucRP8XWS/ZJvuntvTvJfp/am58JK968gt+07XN1Hgzkf45T6jvOOzv2166fxaw2c8+ur+z4p+4zSOGrpXoX4oDlb+5wazqBbnJYQ7A6ZbK2iqQ3MXYWQWE/WjvBxBNy7c1a8xvjeqXrMtHpVZcNPb2fcRxw6GAvxOQalem7wdyJyAJFgg6Vt5OsdhyaaCSAZMdS8H/qO7PtwH6fsp65gTYvwNAAUf9N16SaEWQ/g8A8GeK+o/fHRACI+k/luj/grqvbm12kv7nLvLzbkNHcG2XKo9xoRf8ppKjww57LmUu/ePVvt0NY9VuI/qzrbJWddJvAa8a3mQUBU4SfxaZB60uWNQSFedjiXnrG/0E8ts31SpI6bc6PLmjmVVw2e7vB6TH9aeQaCKvhdftFz+gUDAPlDWEFuWzolcn4L1N+tLga/krJ5fBwglIqfulwcZOADUUvZcGimgD8EdRHd2cgIIBMD793wak/yf39H8AwN6MUf9jPvOAm7LsIj/vShvb6GfKeh6Rk+j/4txR5sn+SShkC8JO6VL5C34ZO+U7W0j/pWeyilzeatS7PUvo/ox2SnX/RJ6RLNo43d9Z8U/cVhHDlTUqeG1zEf2dVH47ib+1QVnRKG6p2huy9AFKpOgD060CbhvI+4hn419MPyAR1428wosfcKpY5gdQlUqaevnoefmrygm4lpM6ASmZvjT4WdqWFXJ3AlZYGiimDfA8WnDdv0L8OQFXAyDmu3+R/m+T/k9Cpf9j/R8ANsZJ/b/9zzeICvL9i5udpP+5i/y829ARfEaXTl7th6/7J0Ppn3wi/8URSf/Q/ZUNa1VqI/rnmg65Y7FGK9H/KgJ0WHf1sB1sqfLfRLWvqkZTiGzjVKB6i9+bsawCdhvaVkF2VdT4ASm7RjyvG+pcLj1SPyDfg3nG6aZexfPvX3lKdx624gQUqi6HajoQZycgi1k4GNqK6HAC2vdlAZYGWtQGeKTH8zJ2jWyAd8jKPaDNEkCu7/5lgcz3xEj/J9f/AQDcFSv1P8pTFgBFlhX93/U2ttHPVfXHAifR/8WhrzyS/VNb+vcS/T8168vWWWi1H77uXwp7LmUr/Tvp/qzfEOqJ9Vr7UN0/i0bWaK74/wINUPzpWi6h2OMwC255VRij8jspwEZho9xPxlLtDVnwKPj68S2tgsweyO9ErvL3uXA97KGIoR+Qt6ISodiaAvllLrsqHsufeuNx2F4Xu/MwZyegvE8rGu0EpES+NFjnBKRC/xDtbNokBcmecALaNkD63GTuawN8b8VtZwO8gz9/zTxyMgCQ/h8Zcv2fXpD+D8BdUav/+HUGy2Ah/Ydb5OcFdVfc2uwk/c9d5Ofdho7gs7r0WpY+Rrnu3wzrIf0P1f0TV/pvayiF/Wfo/lnAZg9T+q9E939c/qQaRsK2HyxEf17bTqK/XPE3uBjYqfx93rAKma0yHOlvKdiEr2BK7rmpVXC5ZDwuGy+VTfUD0usOQNht7Haetn+b+ihszPuhKcpnzThYB/5OQCpeCwu2BsMJ+G1kTgvgLA307eXupYEUNsCTI6D/bIAncX5H2QDpd3heNsC7/kdKJi8Bdk3/Z6n/26f/M9b/Qfo/AEAHX/3H8xNYDOT7Fzc4if4vPn3llOyf2tK/l+j/qVlftok05b9cpLrnJ6KF7p/KX6sNpP8u3b8eNq+d1tazaFT3NkVhie7/KVUKKB/kvAZYKP50LXmoIaK/8pchhso/XuK/iWrvdnEMwTInbUGrQFRHKXgsPyBlkrzzFIGvgJyJ3R1OwHHb1Ql4b1O/NLh1t1JxAlJ+MKzahQsE9S0NVCjSUsY/25/pvXJ+nffOT2ZXvycDGNkA5VvVqg2QRU7nG/X3qTD9RX2dip8BEDP9H7xwT/8nG4D0fwB2pKH+L3MPD0BOt/QfUfR/Qd/61jc7Sf9zF/l5t6Ej+IwurRRkHaZIEq3quYd9WC3IcueqOxO6f+Jqr3vp/ok8F1m05rmoblc07BDrqg+JuChBnB2L7Ykj+rNaovkRqLuJxhVROKn8LA1pNcY7Iisyyt7QXUJVhLEKyDbw9OXf7mo/oF5Xtx9w3tXnLQLfq6SzE3Atp3YCKvX6OwGUDfBtZLNbXvc+FjbAq01fJ6fCazvd/mRrAzze54JpA1QiH4q8mmVvA/TOAFCL+GaL/yD9nwOZ/k+t/wMA2I+j+o+fALA8yy7y8666sY1+4qnLSU6i/4vno7MKRhsE4rUg7KwurZalpX+pKiqS/qnhZyL9k0/Pvzhm0r9I92cIxND9VfUaKf50RZdo7CEnagw34NYqv0zYmwevP2MfAyjAvwYVPvM639OsgqvCyyys9gPYdXX5ASm76nVOEahJ5BOdgFKriqEercGldQJatT8O8jPdSLpbYAOk9BAebzoP+afR49bbABif/g/4kOn/9Po/nQ1A+j8A2/Ff/vb/xS812ATk+xc3O0n/cxf5ebehI/isLtXVK5JHf5KCwDXhnGt656HSvz7lv95+ulrqYfNa9VDdP4vWrrFH92fXWDkgrvDFrCWP5rO2j9C6Gy3x88JqVf4Z10ePwwG3pDBOmD5BubAJxlZBWaoP7wck6W9MvrdoikBBlz9/IHUCEnXBIZ2AZquKoZpS+9kJyGIWDoaoXbI00PNdoNkhEhugOYpcbICXC+BpA5Q9gErka9nnI1nYAH9IHeo/0v/XAOn/AIAz/0X71l8AorCs6P9uQ2MbfWtXz9hxEv1fPB+uyf5JqFwLws7qUp1C+kIu/ROKM1/6Lz0qlXcmdP/EVWP9V/uptH+G7p8FbPZtfWSWQrWrK+v+VJBexT9pBjPJ9QFcKPqzGsMQ/XWWmJ61VP5Ka+/y2Ol8ubw1DmOIf40LaRWcLqJ5W05Cc22nQpnD7g5+QMouZFdhmCQX7LNrdjXnulTLsT3nW6Hjricz4HHYTgjHWUCNE5AOV7G2E5AOUraNE/Ck37L7mQ1gYAM063KxAd41+toAVQ+gEvnC9+lV7QTolwCqivjD0v/voP7/zfz0fwDAZkD9B2vTJ/0HXeTnBXX72trsJP3PXeTn3YaO4LO6tKNethp+EXYrhfi6fzKU/tuPwqc4ZtK/ue5fiVmsuqqtn3crVFHdp/IUzm/YYZ/yCOHo/rqRXNYc6qwr+pv/NnpI/L+wvir/Dso+VPslYJ4mnxEZ0iq4/B4WNMfz5m4/4FzE2A/4FHmWtzW53MY8fl0jcgLSwf7P7owK+jlDlM8acbAO/J2A49755kPxlgZ9sAEoJX0PG+DZCNhhA5SPtBk5Rz0h4A/Gi/8wMEv/ByZQ6f9Y/weAnYD6D5YE+f7FDU6i/2uHv3HvsZvl+7fqfaOR/gV9WN2Vr/uXwp5L2Ur/pin/eLUvIwhVETHebBX/c0CJ4s9vD8/hMBb911L5mQN4LhDuQQ5/VEy1Chx8gm4/gNOAi/l3lshbR6nwAz6lKIs843t7Y+UEpOKVQe4EFCo99uIzpTkvDebaALy3BK9uA7zfDGBmA7z++qzvRkTOUUwIUM4AcE3/x+I/bxiv/6XT/8n1fwAAtwHqP1iPDuH+b/lL2A2shKfyZifpf+4iP+82dASf1aUd9f5gqv8c0dlD+h+q+6fB0j90/3TQOGqtKFYn+JHlHcX1OZr/xbwevqIlFcW/VURRS6k+WUyHS9sUlX8f1b7VYUEtkzUpDRmLYTTVKuBfc7VWQeYHnEsV/IC8MokfkJJkySBJRb+NFz+AKih2AkoBv1dkZyfgWk7qBKSkf2kwbIC8Rjsb4PXR6WBNbICUBBMC9EsAFWAI9+rXBtwTcv2fXpD+D8BtgPoPlmHZRX7ebWhso2/MqqX98v0HJPuntvTvJb5/ataXdalX2YyfvsntybbZU2gJI2ZWZIb0z9T9E0/6D6v7Z9HaNY7Q/UWiP/v7dVWihKI/3zlrV36KIzce6ApkAddU+RfT9OtXB2aAxY53eUrnpXxJzM6M0alihvG5q2pco6/SKRnmYgmE9QOadeU/2nQ/HETfb85L+azWZff5TkCpVcVQj1alr20F8xw2QF7jQjZAajoBGgPAVcRH+v8bpP8DAAC4G8j3L272kf4nL/LzwkuC9+zSjnqVLTGU/ksPOirdP1FPcr84Zrp/pVWFImvq/r8NY3T/8m5Z2/grUzHqLdXhs7ZPqzHGor/mlxQqfxd9wv389gNTWNeF6q+4i1XAj2H0Fb3YxhI/IGU/wpH8AGFd5X6omgFfJ+C9r9oJSNfbq+Ouz+Ofnyr7nIBmq/JQTfvhU/55vbjCBshr7LEB8r2cbICUWhMC7GYAIP3fGvf0f7IBSP8HYBeQ/g/isqzo/6LVAvoJsK5i+Ij+aYjunyRStSzsrC7tqLcj5kXkrVSRxamrzybSfyud7BLHTPpvZa9d9myFEej+6dt+mYlFdWnl6bkUiqyu3DzauTHV/dn9eVUV5Gp7h8/6qP5D4gNVgxClbq7yM9w4JhDuQScdVkGpaFyr4EZ+QLO67yWPcgLe275OQLGetub+LZpJyd9/HEJ+D7J9PeQ7Abw+p50A2ABuNkChbe+dfW2AdHYCxAYA0v9HwEj/pyHT/6n1fwAAewD1HwRFK/1P1/07dCi6tIf0P1/0f+ElwXt2aUe9qpgHfk9h/dL/dWMA6d805Z94lJRI/2S3lxrW7PnqdoHuf9jtcfmTEUSk+5c+LbekzTUBTvQ1NBX9NYp/ac/mtwYqf/Y3y/jrg64wYdjdH+vrH2b1IapbLn5Akv1uRfMDsgKM6qROQLJ6aTDDCUiELl+r8ewENJuUh6q/JCCYDXC+e1vPBmjGOW58utkAKZ0mBBjNABiW/n8H9T+llOj0f3r9n84GIP0fgC2A+g9igXz/4gYH0T+N0v1TW/r3Et8/NevLutTbHTmlxNOgBQL0dWNhZxPpP95qPwKFfUfdP7Wcj0Ic6nAYdV3+JRf9WUNolOgv+lopgcofmY0PbVH4Z2TM7Q/rOlW9sJhZBXk5piXg7Ae8I5v6Adcq8wLHf5VPxgwnIBV/QY2dgGd5h1acyksCPvEK1/WxNkBJuF/JBmAr9Z8WutsAMgNALeJzCrLS/wETpP8DAKD+g1Ag37+42UH6R77/lHo7Ip95PwSOkv6zgOf9h0v/TN0/MaT/mLq/pGGHUj66f6LOHaei47/kin+pTaJm9KnSZdmjtqf2RwAq/2CithaP3z3Izipz72GnZLBVINTcnfyAPEa/H5AyS6A1RaBuBhwPufXrLnUCSqHqrgPhBLROc8kJ+N6xSZ2Aqg3wCgQboAHTBuDeJb/2f6T0W7fH1gawmAEwTLi/Sfr/38xP/wcAbADUfzCfZUX/Fz26WKP0uqL/pw1cbVoWdlaXdtRrFP9DLOk/cfVcqwV/mNK/yQt+B+r+vw1jdP/ybma6f0EHkIv+rG9UNWxFoea3xEn0h8qvI6pY/yXE7QiQnAjBmOLvGtgqKKndzZgj/YBzQdoP4FR0+bFtXd+uwnox/ve2oXWkh8tB/0uDmU7AIzEus1f991ToWdihGgQ2QHlnExtAKNOndH2Rr5UNIDAAyln8Rov/IP1/KFT6P9b/AWB1oP6Dyaik/wi6P90C6kaxtdla+g+xyM8LLwnes0s76u2On+8sUKJTS7Lslf7T93QzZPQ40j9XZLd/ta+l7v8pVdAzGnjr/tenfrniX2qKoAEGgjXzG6RS/I1/hVdX+cMI+kPvJ8Ic9R2pyawM9rAKjrL04eMYfsCpOoYfIG9e4ef9Z408CvtpBPq8xsenom4n4JFvufoWtBNQqOvsBNQbc61LaANcTi9sgMfjOo6YTSpXfX6Rb78NwDUAXN/9y+ImOe+M1//S6f/k+j8AgK2B+g/mgHz/4gZr0T8N1P1TW/r3Et8/NevLutRrWstxZyvp/7rxRtI/T2SnpX+O7v/brfKYWwpF1vi4/MkIItL9S5/StfxaJRf9uV+kUaI//4tDxjT4jYDKf2DmHcBo4T7E3c7K1FNrSUp9zzwfsmEyyyqY6wcwCpY0bIdXCh+KHCcHFKYFDHYCaiPweYx0qW+GEyC0Aa6SNGyAT42P9LCaDZDSaUJAjw3QtwQQ0v8dINf/6QXp/wBsDdR/MAHk+xc3m0r/UUT/F14SvGeXdtRrVEu+s6yfRQqmVP3fVvr/tYRrZQXX/VPrwAtxRuj+18Nh7dyqWSdnd7hlZFjNb8RdVX7Ha9Vovf7F/HsV8IF/Liq5t6pKOmo12lsxBgf7AZ+CEj8gZVcZaz/gIHYfNHU3J6D7jcFZLYQT0BpBVSfgY1S0ZeiVbIDT9lA2wCM9nrUHgw4bIKX0/PxNagOwDADX9H+W+n+T9H8GSP8HADSA+g/Gsazo/0IqTTJLr7vIz6cNXJFUFnZWl3bU61DXceddpf/3LwOxJ0eotZD+x+n+nPYc9tlB9xfJ4tWAFWm7VYTYbYLob6NKb6ryz5HsU0TVflpXbITgrDJ3refnqiqZYBUID/T3O3+68u/iB9QqOuxWWiDIyAn4XmW0TkC9lrIT8L3fop2Aqw3w3vCcagO8XIBuG+DV5yFtgHRdyv+KygY4hpXaAB0zAIzS/8EPxut/vUH6PwDrAvUfDEIu/QfR/elGUDd7rc2m0j/y/amyjvWa1pXv3Ky9T82US/+Jr/Yyek2T+F/audUkpvSfvkdHNUOn+/82jNH9y7tlbetd4r85GK5H0YT3BVQq3R32GBnTWdeGyq+vZBqmZyf80YbmyT8X3I7uU+wjWAVCgf5ScBs/4Be8Lq+f91vHCXjkW042QLqI+kUKdf109T4b4Hrnx7cBHunnAsAGUNsAr78l8uw/UuIYAGoR32zxH6T/8yHT/6n1fwAAiwL1H/iCfP/ihmVF/08b6jV6ie+fmvVlXep1q/G4s0z6Ty1ls1f6T9njfpUwa/6wBPd+6d9B9682iThBtX3G6v5kfKqiS23RRH/BjwK3tY/TH+LiWgKp/FMv/Q79HOVW5vYwT0RTCdMGjWoVlMVNZuGs4Lp+wCXGaQx4OgEM6fzkBJS7siWRH/qqcCHtdwL6bYDXRwwboBz5HRI2gNoG+Ebm2ADaGQBYtd8cRvo/vf5PH0j/B2BRoP4DR5DvX9xsJ/0HWuTnhZcE79mlHfU61JjvLJb+U0ueLiSDMWN+iiwm/adEPn+9K/KT/gW6/2G3x+VPRhBv3f/Uqk7dn/2904j+hTzDxp4TRf+v3sLcv4+dVH7PvgpxF9LAe5xsCfukykTvRa2C8tUFfsA1gMAJ+Nwfn68ShBPwvWQTyQOf69Tjc/tY6MRmO38q82mHbidgpA3Qiiy0AYhDu7UN8Ejp+ahOlyIMAKT/rwTS/wG4JVD/gT3Liv4vdKIYWRr5/uWws7q0o94eBkj/qayPFz6Wqv83lf4PESodW934+5Rz3jt0/9Q60kKcphpej//6k9L9dfGLmgRVhAjOtME4YU0V8IPo76HkLq3yi34hxdGnAtV+LvZK/cpWQUVql/kB/CYs5gc88w6hnYDvFfxx/CDTjSv6LNsJeN+tjHlJQDpK++X2HEuvYwNUG3DcZ5oNcKy/uqebDfAKXrMBVDMAhqX/30f9D5D+DwAAAEil/zi6P90Onm5V3mwk/ccS/V94SfCeXdpRbw9jpP+UH0M46T8t+qbfUsdWy0L3Z8SvKP7N9rQjNxvA/nY3/B5GGypYi/5RVH7Vb6boF2wW0OtvC/PUS0ZqYKvgIpafdif8gHpBghl+QCIu2ueiX7HZxgnI5HWNRn+pws4JeORbzsHI1wXDBiCaJLMB3kWev/rr+7jbACmlvznEbxkA89P/gSFU+j/W/wFgRZD+DwxAvn9xg5Hon2bo/qkt/XuJ75+a9WVd6u1nmvSfCl9PufSfaPH3E4TRiVaJ/1Pf9BtA+q/XkrWqc4l/xoCU6P4V0V+r+FO1y0R/wa8AT/TvVfxVBa2PQhaSGdzyB/e2Sv1tD1yH+UXeXqaX7WtkFZRE/gB+wCFYU9yUVHf8QX5eP62UeEuo192voru3E9DS0E9OAEOgz2r5dkjh+nyI9z1Ntfuvkg3wvH5eLgUboMZ0GyCl9Leej/SxAeQzACyEeyz+c+Jv6F3o9H9y/R8AwHZA/Qe9IN+/uNlI+ke+P6+sY739zMv6L4SSSv/pOyQYYvpA6b/1y8PSW3uk/1SVlXfT/UnXpxG/3rzdRf9plFe8AAAgAElEQVRHEo0EWfCsJuPIYVT+vXVt+6Nrd/PI3oxyj1fiye0Jj4OIbBUQSQIlPyCVr6C2fsBv9/+fvXNLmlVn0nPq95qHLxzRo3REe4DuCM+g7Tl0X3X3whdVgJTKow4gqHxj7/VVQSolBMXheQVgI5XvTU91mcmdFWUh9Q57q8O2gUSfc7NSTidgsZcE2G2Ak+KHDYCKPNMGYA0AehS/Adw33zfwy1Kf/9OrGP4fCr1OQf9DjXos9P+ogYhZSj8X+u9t4OudBd/3mtvLTql3lAL9F8nmo38A22VUz5t+H4H+5a7mqzibNJX7D4f+LuIPWv9obaDUCv0NwUPb6Utpz/9myj+xkdrF9VUV/YyYPXo9bQ6st8q1yZkbIEFXBZozkJ8qtbQfoNV1JBU5+5hHAwHxuuANh5E2gN5CuO4lAWEDlO1j+5m3AfYOGW8DAOcEdNsAtAEwFeLH8H+vYvh/KBRCCvofapEH/S/F/fWmSCdd2lX6CPS/3EN+PpqF4Gd2aUe9o7QI+leWVgLBP4n+sww8KKLQyCLcH7xovmqSxv2pKrn8rdyfuOLnwt4G/fuOU+5k3vxLU/65tZgWfaEznpBZ1Fqz2+V3WwXg2fJ5BInzvdUPMNd1pRPwhpcEhA1ANqPKJuxuvh2S2AS4lMEGABBvCOiwATyPAIrh/zNkeP3vbMXw/1DoWQr6H3IoxvuTM0ZAf7iJ+4OM/mfB973m9rJT6h2rQP84nxpZ1XUv+ieCBPRvq7osPwH9+9B8lWLkI/793N+yAZyR5h+yi/hTzaCUHMtlS85bTab2eBqh52/fS87g7y05DaihIev1usY1CR0yWdnWYg+zCpLw7cF+gGIG2OriCXgZ9WWpDAi+zAmQYHrhBBhIfVXLVmTKQq+wAejThPfZAMfZpu1awmUDAOkENNkAhAEQw/8fJnX4v/b8n1Ao9CAF/Q9ZFeP9ydnd6H9F6P/RLAQ/s0s76h2r56N/4C/dcBITLVEJLFUXcXkrt9nGlyX6L6B/oKGzCf13cH9gF61qYNdT/mc+6sfWOVWTyMgboX8C4xJ5kjuh/89SfsyZVlSQ+ndoKJ1/mFUgcvC6hk2MX8cPOA9zBb01+AEOAo4yHHXiUQMGJH3OzUo5nQDHSwKANHfkKoparrUBmJwvtAH2ZuNsgow2AAB/Q4DTBjDfAXDZ8P+fov+G4f/683/6FMP/Q6EHKeh/SNFjof9HDSzMUvq5D/nZ28BXPQu+7zW3l51S7ww9AP3ruFm+sjnzXIj+pd2RnTI/C/3z+YkkHjqP4kX0LyRXuT9fO5o1hviD1hV8A3i1Qn8vc7cYPE3VORM50k7IeRXlfz2pbxrIKaV6ny7unIdaBRpzx9R+mh9QRw3wAywPCzIScKEB8uuCxfz53IwgVzCZSXIsnskJ6Hk0UNgAdEyvDZDy4Jk2ANROgPkggg2AZohvKWga/h9yKYb/h0I/o6D/IUlm9L8a99dbY6MP9Oxu9B/j/T1lJ9Y7Qw9A/3rmh6F/2C8+FfW+6ZeYo9dboH8H9+eTV61bZcj/UO4f0N+fXysp6lmU/5U8etJCvbKv/Mo3s4345CnfrJusArpmzOnNVd/nBwC3HslJHjPgDJcfFiQTcFA5+/yXBBwf21p4HHmbnICwASbZAHg1z7EBAJgbAgw2gO0OgMvA/U8N/4f7h/+HQqGnKOh/iFCM9ydnPBb6723ga58F3/ea28tOqXeeAv3jZE9B/1kGH/qXqy4W34H++cxEEg/vQfGtQ/6J5IPQvwv6u4i/3KSsRaZF8CTntyg9kAtu3LtdjfjhnZT/wlYtd4L1Ftk79h1WARNF7YChAvYL+wFMqLVhtPIjy2kGME6A0K3GlwRUTgCG7s1OgNGr4Kk6cgIMyD7LHzYAHeOxAfit6xobAJATIPZAYQDQo/gHPfwnhv9j/Z1fhTb8P57/Ewo9QkH/Q1gx3p+c3Yf+F33Iz0ezEPzMLu2od54C/RP5lnnTL5gNMAaHjEP/WmuZJaoav8qQ/2/WXu4P5qPPVOjv3S9dBf19+7Wg/BdkrrTWKVFonH7KKkDHLNoPUPNc7wdQNjtNVMWGETqOOJwTIGL6oozqBPS8JKDHCRj4koDhNkBW8HE2gPS7NNoAqoXziZpmAwBQNwQwPWB+B8AFitHupfTh/+rzf0Kh0PMV9D/01WOh/0cNFMxSOsb702nv6tKOemfr6ej/3FQsCxJv+q0KcjlxvZaV24n+Fe4PCvqX1xoumHDyNvQvchFTw8TqGGWmxSDoTzfPskKpYH1hf5by9+VZ8STGogudjFAhzxbzBqugBrjZ35Paukj6RD+AMgOgPvoSIXiS2r2ZE0DXanACNM6+Q+DKzyigu+wE3PuSgOE2AE7osQES1cLDBqB6wGcDaJu95G18Y2w2gNKkvdR8GwByJ6Bq0mkAxPD/S2V4/W+vYvh/KPR8Bf0PAViP/Aty/z44oh3FOq607+2rGO9/sZ6O/sFF/5d55o+J205A/6C6Ds3onw4oG/BrQ/5d0N92wQvGjcec/DroP5D/2vaojfvWqyj/ciclh36d1K+7ZhhpK2wOoF/XKhDh+/V+QAG+iWAG8jf4AfZFOA6XXyegWjE8qbdx9ue9JGBRG2DLQvG8veE9NsDnZoDFbAAgn+DPyGsDAFQ3BGRNuuIOABP9j+H/pWL4fygUCv20Yrw/OaOHUMPNg/1BRv+z4Ptec3vZKfVeo1ehfy1yHfQPKoLfK+pD/8QcvV7SclDZsQUW+4f8Z1meNuTfzv1tl7em1nqS89uMHlgHT4H+SsE+yn+RFQEwdS+/NKZf8dTLoaX7tlJy9ba4bK+0Cu72AzC1VzIb/IAKqddN4IrUMQlgwEsC2Coe85KAjxUSNgCrVhuAjhdtgG/ZS2yAs4oN4DAApg7/D2FdMPxfUwz/D4XWVwz//1HFeH9ydsfFaoz395edWO81ehv6l4Nfhv7LDBSYJibzpL4oiKmCTJAtyPj3hvz37erPmn8C+gflvx80zzkk3b9cvyQfK2+h8d2Vjo/VrQIJ+LJhJj/AZTlwVPqIdfgBlBmwhzC+Qfld7BPJCRAxvYmzw/ovCRhiA2x5KY8NsNe7aavpaTYA6wEoTdpbRr7Ilw0+67crdxr+QAfEH/bwnxj+75U6/F97/k8oFFpcQf9/S4+F/h/1gRL+VPqx0P+jGO9/iwL90yn99H8S+gfzT2Mu+meK8NmqNseQf6lVpDI4NwL60+2xrDsqeBrxX4PyG/LcSvmnHT5eROqXOMTeJOtqdK1ux40Fa1kFBe5UCzT4AYjZa8BUDsaAXzIPGMhPFaF8A4XjHwEnCMfZDU7A4R6InD0/RShAvq2FQLwkAIgOIdem8migThugQO6fjzYb4IxS3tDbZAPgbeBaG6DqFJyNb1LWOPMNAT02AP8IoHhq/yQZhv/rz//pUwz/D4UWV9D/H5Lh6L0Cy66lt0k6gdGOg61X7Lf3VYz3v1G/hf7BSP/jTb9UvQJQVvGxj86jFOOH/IOlHwB1BZql/Bb6Ld43Q3/Kj3HvFt9J+T1VPQfTL3TMm61FVop02CDkaLUD3F9uFYC0zDQmH+0HnLDZmNmRf49VMlMLShUh8KuBs+9HUPdLAiDH4mwVw18SAMSCMmRZdwK28y3B77ABcIOutAHKez6G2ABgcALabIA/Mfz/eYrh/6HQqxX0//2K8f7kjI5LzRX6Ksb736jfQv8q0D9SjkH/0i7Ljp7Hon9QXYcB6L+qNIb8W2rcyy0E/TdLkNQALcwG/a+i/Ksg/lvx8UXHp0UQ+bvlwPTHP4MTe0L1cSDWpMJ8marXxYUm8QgeUWvaD1AXVgxOKNDhB2zob97xLU7Aq18SQKP2zznAcBuARvavtgGqJwJRrbU0qWyf7YYArw3A3AFw2fD/36P/tw//D4VCKyvo/8sV4/3J2a2X0Lf3VYz3v12/hf6ty/ucx/3r6J+Yo9dLWg7N6L8JhWd0Xt/qvIDb7rvQyacM+f856D8gZ0eG11D+Kw4qgel/RNOsAlduc2iHVSCCcgLzKmCdyUynLY+Z4x4WpDRbNQMyrio5ATJoBt4JEDF94QSwnXDbSwIutQEkZD/JBsAnUu+zAUBzAuw2AP8IILkdo4b//5r+zq9CG/4fz/8JhZZV0P936rHQ/6M+xsGfBT8W+n8U4/1vV6B/OuVT0H+ZoepkerLOl4vFT/nEWlQ2vEa83L+o3dpONXnJ/cXatV5VVod/eZO+UszZLoL+9qZW28aAnJ5SS1D+1iNLS+OD1IeukWtLc7oFV1kFG/mxjmz3A/gw9PFEv3anQWsGbrYUnHHwkoATToDI8Y+AjxNQYXU9Q+EesFXscBifrJRrR14v/pcEvNcGSOeCXWIDSCfIc2wAANMNARYbgDIARoD7ePhPm/Th/+rzf0Kh0DMV9P+F0tD/Iiy7lt4s8fRDSd50hb9CX8V4/0UU6J/N6qf/k9A/mE0yBmsMQv98kWpBetF/Ruf1Tc5Luk2QvQP9+43enYY3wvQqlx58CfSnrJeunIaY51L+vlOFUKnoK1V3nZLYV43TKnDkruOKe5AYM4BqDVFM9A/ozDSsR0eqSx4WRJyXHQD+nNbmBOwH4Fe9JOC0Aeq0YQOAyQbQOftkGwBEJ0BuXmUAGMB982sDfl2G1//2Kob/h0LPVND/9yjG+5MzWq9sF+mrGO+/iAL9s1n96J+K/9k3/RalzHQeFf6lIf+NPD3LYgp+IPQ3/dDMatnPB+WfoF9YxvXlBPE3yN9Ce0tpGvvNkth5oh9AFNP8A0/a8lgx52FBZ9ZUz2edgCK90QlQXxJAZThOYK51Aiq/g7QBuAcWhQ0AVhtAueifZgMA6DcEcDZA4yOAlNbE8P8mxfD/UOg3FfT/JYrx/uTspsvmFfoqxvsvpUD/OFmZpxv9S3swHcEXzWhG/8QchTXfiv6LS8s29M8j79nov8nrtaH/e6G/2AA+ZjD09+1M3bv0wYhfzNiV9mot1s6lj6mE1myvtFIVlGbR+lYB4CMci1DPeJsfwNHqPLbbD6iY817AmNmc3+UE0J1pIc5gcAKoDIUTIJxtfTNs2aSspkYn4DoboKT277cBTE/en28DAO8E1C0sDYAY/j9T04f/qw2I4f+h0HoK+v9sPRb6f9THUPgT2MdC/49ivP9SCvSPk5V5pqJ/UBH8XtHV6B/yxb8L/YvcX0jLN2Y29xdnc5UanvI/CfqDtvEYGsDHjIT++j70bso/oYUdWobUdx/8Bh09l+mQ9USzZGpCkx2wvlUA1d5GXWzJD2DMAFC6FwNoKp7OXDHi/C/tB6hdTXHwk6sanQDOVpEh+x4gOQFihqIMW8W+NKi/0IqQ/ZjzJQHX2QDfmgw2AP3LCxtAbxLXhgQ2G2D8HQAx/J9W/+t/1eH/2vN/QqHQagr6/2CJx/l1WHatPgqglG7g1Iv0VYz3X1CB/nEye/Ai6L/MQNFqYrIRN1fXxeJSb8S0o5QNUpfXj9bmqWkvQv9N9Nww5N+6pZmi6uBe6I/DroL+1n3Xeyn/0IruxPSB5teR/RBJQ2dToiYbQWrLeJV8OTEzmUnorMTqBxC1aP6BJ215qLE/LKhC7QUoJyhqxl2ZbmxzAggbQMtwYne2ihGPBlrVBjjpPt/y40/6JLvVBtiqDDhoGRsAGCfgMy0zAC4b/v+D9B/04f/68386GxDD/0OhUKhTMd6fnNF0ebxOX8V4/wUV6B8ncwQTdU1C/2D++TBEuBH975EK+gd6QYpSTvQ/cMg/YBg9g/vLTWIrbRnyH9Bf8FEaq/al603bInNdtqNO37EpSH3oUKtVUE1osgr0BrD1+USx9cTPJ6Y+7mFBatoalBOUvKT9lBNQNNPgBHyLJpRRz3AcbWc5ASvYALjnW2yAk+LfZAN8unA7tiemAQ4bYI8ebgMASDcEOO4AsNB/0/D/H1QM/w+FQpVi+P+TFOP9ydn+6+1F+irG+y+rQP84mSNYhtfZBD6PTn73uRVqoJthRP+gug4ro395WBjTjLno/8Ih/0mc+5PQX98+ZfUduEerl/JXk4PUI0WH2DX8XGaYVaDkUuieKsuCV2ydp/tcEcY+0OA+UcxC7cUwBLr3tNphg8HQRVGDE1DOYJPXtSeAFV8ScKUNUK9HnOrZNsCWr9seG+CIuNYG2A2Ay8B9DP+nA65pSCgUWkVB/x+gx0L/j/p4Cn/u+Vjo/1GM919Wgf5xMkewEf1Lu7Wr0D8xxwidJ6J/KtveIcqW5qHMJZVu4/49TWIrNQz5r+Y2cv/XQv+skK3xC1F+177XOPkdUPsdS/EmDcTl46u2uwV+q4ADu8ZE1GFb8wMWf1jQJvUJNesErEYnINUz2OR17ZITIGYoyrBVlCS/bifJi1UbQGf3eSrGBqCqfqoNIHsAWgN8NgCc1zZTbYA/AMMe/hPD/2n1D/9XpQ3/j+f/hEJLKej/6uKP1Uux7Fp9QEE7lDivhNfpqxjvv7gC/eNk9mABguNIafl0BA/HxeJo9C9XfSP6Z69E81ZZEqbiD1UjWbbaXKU6nU06KzG6L0UZdm5AfyHClXaCXkz5F2lGqx52wL5V1lVt3yQm9b79KG+2CjY8odUMgPqYSoRUdfHhYpPyCcQiUEXoBuE+a3QCClBO4NQMwJZlO52AEhibMpzQnK3C9mgguw1gZfd5qsfYAPS5jGwDMJmPc/6RdwMcQTNtAJjxEmBJMc6dkj78X33+TygUeo6C/i+qGO9PzvBfVy/VVzHef3EF+sfJ7MHroP8yA4Wticke9F8Wp4pQ2fB64W2JuoyE/j24ucTTbdwftAvHJYb8S2h4ZejflEqH/jjtZYS6l/JT04Y3/jm8fvoB9TldsYgwhWbk6NdHWAXnPyVmVQG0sVKLH4CLEGCfy8x8c1oaVBjtBJBJBCeA6MaS9lNOAAG7uaohO0z7Xxdckma3ExA2gJaz3QaAvf+m2AD7xjLWBgCAPzH8f67+6s//6VUM/w+FnqOg/ysqxvuTs53Xpev0VYz3f4QC/eNk9mB+rrywRLCNlv7Sm36ZK058bShnS8Ufprp6FuWdKD3fAK/19S4jcsFlAbTuvG0TwgL6t6TlQERnWpOuQtuzjn+B5teUbb2I+4uGfN7Q0dvlSYePJSvhuZGhq/mzDB4/4L6HBZVOwN4b4nGowqZtTkA5g01e154ArnxJQJIpdmYDZOcUvTYAvbW8wwagkuc/gK1KUkTabYA9brgNMOYOABP9j+H/lGL4fyj0Owr6v5BivD8547HQ/6MY7/8IBfrHyezBdvTPXjNlwYa6KA5ANMaI/kF1He5E//xxwfzsIIz+bWuTaqSy2fsPAZOH/KvcvwX6AwjjfdeE/lqwVTMo/wyi3ZRz2HErGH1I0I1WgSva9Xs406bsMFnyQSNDN9VyZkj8fDzpyocFlfTz+Ks7ARTMdTsBqZ7BJq9rl5wAMUNRhq0iHecKmGIzvZE9K/90DTh2v3HceQOARDPrSTZAVnCqDQB5H/LJv/cEDLcBACBVzsoZIzUJSTcALMP/Q5ymD/9XGxDD/0OhNRT0fxUxx9vVWHYtvX3S9YZS2sVkl+qrGO//IAX6x8nswR3LS0Qa4Gkf+ifmKOh/nzsR/VPZBqH/kvtTFZFlKXbMb57S5aREsY09X5Rh57JY2ei1GGrvgP5VzNLQv5fyU9PWp/xB7aMH+jX2PGi0VWBOaQsVITIAsLcF1F/a+q2i8DzgJ+MZ70CE+3QVHBavppdOwLTXBZdzO52AkribMpz0nA5IsEF+KwDkC0V2hfB+YKC6iLQTAGBjngjE1E45CgltLdS7fMmE6ayXa56SM327tSqb6pUr2gBfn4Y5v/fZAACwpSE2gGIADHv4z28O/+9//a86/F97/k8oFFpBQf9v1mMf8vOR1ET9IoNHgc6r0NX6Ksb7P0iB/nEye7BjebnLo2z2OPRPBAnoX666QNsKgVXRP9ECKttZHVmR9e6BEv3bViWVWdnm/UeB7iH/eC69/Tdy/1ugP5tNN5yItK69vSGYxQhN2dwKyg+PbXavFj+1oNaKfU3dYRWAtEfzp1QJ/pbNPo/fmhnAZfO3x+MH2B4WRIHXItDnBBxnDa0vCTjmEmeUW122ZOd08rr23cYRXxIgWMHsk3lSfg6R8i2Ds0PIJwJRRU4Hgk6VPif0NLWnLJ/SUSBMCOpdvkXLjz9pwvuBqzaZmPvnomawDcAnVJt07UuAf0zq8H/9+T+dDYjh/6HQAgr6f6divD8523OVu1RfxXj/xynQP05mD+5YXiK4E/2XGRjsOwj9M0WobHjVXIX+S+5P1UKWpSCy0uF+xnrTkH/DBlbXSS/dO6A/FW+l/MsgfliN8i/K6Jc7Ui/XoHYZTyJEFqZXYmyMWXarQKydheki0AQ4LYhUTB3tB1AZHH5A380BDU7Azr65w1hWNpt11khUVzQnr7ecwSavq04ADe8KBgnH99wKALlrQBZJGNznqdy3AlSLkNC2wd4KsLf8KDjiVgC6qmYbABhw77YBNF9BaJJkAMTw/y7F8P9QKBT0/xbFeH9yxmOh/0cx3v9xCvSPk9mDL0f/YP6JjUX/e6ROY6kFKUpZ0P9ZHYP+gV1AXKm+gICWEc1SNvg2oj0R/UvLYq9OhF1OC2FR6F8VoThSa2Zn1XZdRPmvxvcTD6O+1Iv6Fs8QfxKGv7RbBfYVNGObEnZH3E6rwOhqzvPwvpYfwDQSz2MWlnACSJadTT/+6k4AhdoxOi/mUk5AKkuJyVHtHxugTFdlYGwAGsfffCsAEC8HZmqvFqGqHWbdCgB1X3/O1khqXzTLZAOACO6bbQAuIdmk+XcA/Cb9h/uH/4dCodDPKcb7k7PNFzardVSM93+oAv3jZPbgsehfS5hd2DGpdPRPzFFIzAXon8p2XCRxrbKg/0TPYktRNFkxWvwodr0h/0K/2ZNQAetC/6oUJk4DEXBTKn/Xtaol28hjX6D5X5G8W2OnXnJLAdsap/KjCbcvUWkyKpO5Cvf6AeyCfALJo5Sby9OlSifA95IAzXjIsHBlAwDZyTKVBvDeEMDjeP+tADDu5cApDb4VYF8gQqV/YL8VIPM8rOqxAYAC9w02wJHQYgOwBsCw4f+hSdKG/8fzf0Kh2xXD/6/QY6H/R33X5GzpGO9Pp72qSwfW+ywF+sfJ7MHj0D+oCH6v8Wr0v8+9B/1zV4proP+mY8FM9M9xf6HGc/rPQP+q4Bju39qYJSm/jcoOqCh0q8auqYHnREafAM8wHUXpCsTJhqqVetpvCyDKID+AMQOIUnx+a70spSe+n41knQCCy0PVTrpU9gJegd5Ws0TjobIBjsrKhpCtqqv+2ABVRrZtcOB4gsWn/Jzj5N0Suz+aXTa/yv+dTdcLn0SsDVAVqRah6rztqlsB+PsA6JbZbADgwf08G6D9DoB4+I8k7fk/+vB/9fk/oVBobQX9ny7qqLggy66lN1G6bNDAn/mSY7W+ivH+j1agf5zMHjwO/Z8VyR2xzpt+mSJUNrx2LGB6CPpn2kMX8XJ/afYt3D+b24b+ja6MHDAD+jsWR5Wwpdkz/xrl/ymU/1MLO0P2DnySVcAHcuUFEv2Zz+1yjCcDuKTtYUHoe9sqqDJIfsC5OIwTUHF5yNE8DaPrHXd5Q4Dc+YLxgIH1PiObWy0G0Sqy6o8TwNoANY4XbgUozwVPG4DvrnS2gu1/OMA9uSxfG4B6OTCTqloEbEKkY4Fqlf7BZ6tutwE0ddoAULH7GTYAbQBYhv+HBKnP/+lVDP8PhdZW0P9ZivH+5IzHQv+PYrz/oxXoHyezB89A/3Lm5d/0CzRNKUoZSe53SRvR/zfBPPTfdDhYbMh/MatC/2+H/lBv1R2/dyptVxKrfo3yr9/CkEvGFTr2tKvRKgDPGVPJeEVSCdB9WwBdeL2XB3BOANVRJ43lupGm+V3vCmbgckaGy0oxMqaL46o/NkCV0Yvje14OjCk8KvKdTdoJAA0vB64WIaEFZ3l9VdD6RKC6Gu0+gKNI0RKzDQAMu++xAepsjXcAxPB/STH8PxT6bQX9n6IY70/Otl1JLNhRMd7/BQr0j5PZg+ehf7HGX3rTL9NvhRvB5dHQfwf3F2ezpNve1XTDBO4PaDVZ2iNyf6FUNeuJ0D+roov7B+WnFYD+Kj3AueFG9TbInmgNqyA73GHGK/Hoz/xRZgAuf78fQEFVG4lm5pKljr/frhcALm0hAGT2Qcmss2JZ2nIGnZms+uMEEDZABdCBw/GTXw7cciuAdRGIVT/yiUBbsXYKG8A81KvHBoCS3bfZAEe2IxVhAMTw/05NH/6vNiCG/4dC9yno/0jFeH9yhvkyZs2OivH+L1Cgf5zMHnwb+ifS103i4SlF/w1LOhH9U9kk9M/luQr9Nx0RXjHk//nQnwIRfetFLd6glSn/mnx5hPRfaKhZ8m4z1/VWwfAzu3o/+aXsCQfZ0PAngCDL5PcGP+DilwmToPxcUsoGyAoUBbkOpEs94YaA9NlOSg+gKvXZWVGnKj23AkDuGrD9QNoJAA23AlSLgBdcenRP6R94bwU409puBcClwLA2UfHqhoBOGwDa7gCI4f+StOH/utTh/9rzf0Kh0F0K+j9M1ZFtTZZdS2+ldLaglI7x/nTy+V06vN7nKtA/TmYPfhP6B3FxbkT/HAca8qZf7vJf284bkLexk4sy7Nyq/gb0L3B/rpS8dak1apz9EdAf1I3Kq6D8ZgWa/yGZrYIGcMbV6FBbpeeRtDYDSnbMVZHvhOWjcQOmx0VyIsuYAW0VoYIkKN9QGzQezcwlSx1/v50uMFymOoDJNwTsDwXCmwXD0G+5FYDxHuA71XwrALUIVe0w6FYAZfsx3QpQta/RBoDMCWi2AaA2AMYM//9Z+g/68H/9+T+dDYjh/6HQTQr636vHPuTnoybAoZd+LvT/KMb7v0aB/nEye/D16H/Pw+Yq81RtoHExizMAACAASURBVCd70H9ZXACjAqq+6E2/UNB/O/qnr2XFetkGnC3RqWUz+m/g/sUs95B/4+aX6YHQX03lbaEv/sGU/0cBvbzfCFnUcRpnLTrwlgLwbOfcpnEcW7ETsM+TAXEZUBXmg+WcbJGZLxMWQPm5jAQRzgsUBbmuo0uVNgDZbGrW2SAC/matlX0Ouvg5a7cBNjTdjOP9twJAPuI+4T4nvQc61YRbAfYFIlT6B8WtAGcFrLKeyTYKTZ02AAC+IaDNBigMAAv9Nw3//1nF8P9Q6FcV9L9LMd6fnG04nVizo2K8/8sU6B8nswffgv49a4Ehqo3of49U0D/Q7K8oZUS93+p4aq/lWQT9G4b8V3NFyNuN/gXuz5WSuf/LoL+arWPPIGRlpwbl71eg+afISrzsjxBqLzrsloK93lMM5D3nYDOgJMhihiOAg97S1El+gKsWGZR/0So2CGrkWhQUMTeyAeDobpHIk9UBtNwQQPcV1do071YApkZw3QrA1gufRKwNUBWpFqHqqs1/K0BdHbPghQ1gPkcfZQPA7gR4bYDGlwBLiuH/UsA1DQmFQpcq6H+LYrw/OcN2/rBsR8V4/5cp0D9OZg9+C/oHFeHdif75rut/3D+gRTsmsjXiSLbqohk6Ia3m8uS3qt/kgnCzRgz5ZwwPOeEw6G/K74H+TFg39+cPYabiTXoQ5R8MWUOM1rRq2le+eRj/BbcUNGzFTjOg67aAPcztB5i9GLIakx9gcQLK848CWAPQNwSQXJ6aK5a67oaAys3Yv5AeAID15cDCrQD7NoVtEmYZB90KAADME4GYVNUi4NWdjgWqVfoHe0nswVSRZQMANs+tAFUTW2wAgOKGALsNcBoAMfz/AdKG/8fzf0Kh6xX0360Y70/ONpwzrNlRMd7/lQr0j5PZg5+K/ok5RjY9Ef1T2U50QFZ0/TN/rkL/Igumt3YHSRe4P1dK2KiI+CdDfyaylfvze7nhBHY1yv9ulL8mQH+67L3avHHZN8vZVoE8WhkklJ+yAPdtAaiWPVL3A6oiJrn8AAsbLfuHoatMnwhcvq63mn5UWDgBvGFjro41Lazs2PNyYAbH97wcuGo/dQwe+HLgahHwgrMvB5Y3sHwuH3naAJ5dxC02wOg7AH55hLv2/B99+L/6/J9QKBR6qB4L/T+S2qof6NnSz4X+H8V4/1cq0D9OZg9eE/2DBQdT6B/EJSqot4HtasDayH+/1788xdbyZOifqYKh/zT69x8dxj7tp6qfW9faqizappZyGAzStrE69GeCO7n/GJIuVdSuV1H+wPG/pnWsguaT0ZzcCxD5WwsbcOxrWm4LIOsCfGqlGBXGKupS1cuEHTZAGVby/nzBWbYO5UcFdhOlWm4IEKujTAvOBiA9AADrrQAcju99OTDbzyB5D594x8uBqUUgVrT0RKBzGT9HQsY44UyL7wE0I/E2XWwDfA2AGP7fL/X5P72K4f+h0HqK4f+6yuPPyjgbSW+odHDX9tjaicGyHRXj/V+sQP84mT14TfQvQORz7iD0zxdR6P+TB/6zvd+M/tmlrufegf6ziVo8S9sfCv2LzLdw//dR/gD0S6prvQ5Zp02/Wp+MqWf7BADCgeQ8Gbj3toC6uk8Jy9lWgx9QmQH4yeyWPGXPMICV6Y3KCdiYuWSpzAaAkyELXo5QHXFqLNoAPEm33woAo14OLNwKANRSc1R9xsuBU94g3GxJR43idvgl8c7r0oE2QF5/vSuy3gFgov8x/J9XDP8Phd6noP+sYrw/OcNwJrByR8V4/xcr0D9OZg9eHv3zeJ2Yo5PBk/7b0D+ei1eTEQcf1zRcq7Q8GfpnqmDovwf9s10380H/HPcXasy4P1HQ3jl0PHFt/VzoD+pmw871c/+hvDMo/y3qO4EMAYC4t6mlH4gGtMTVDKcouo/OBq68LUBIIlQ6yQ/YST3mvyqorWs8eTRKfrRDIdSgIu9s+vH327mqDUCU1V4UXNoACjgWbgWoghOH43tvBYCik63ew36+ar4VgFoEYhXTtwJs+Yo4G0Uumrwd5kPy7RpiA+S11zbAHwDT8P+QrOnD/9UGxPD/UOhaBf2nFeP9ydna0X/Zjorx/q9XoH+czB68PPonmnEG4DkUrKczO+g/g0Q/pYwM/bwWY8C0IU+GuV10207/H4j+TdzfV4uG/mdB/1YEaPwJT+L+I2hlUH5ZgePfr2w96tvxPLfAmM6KrUuAnCfIoLAC2bm65NsCqo9SKrJeIC4edD9AqGKD41aAs5C6mGRd9at0zzyUDQDEkWZj5pKlPudLe13C0ZQ1HhjXYYfh5XIpHslpA2xouhnH+28FAP/Lgen+uepWgDJbgqq78jAogmsl/60AANTaFGsRas9TfL79Gfbwn18e/t8vdfi/9vyfUCh0pYL+F4rx/uSMx0L/j2K8/+sV6B8nswc/FP0DkNdzYIaVxSUtX4RB7Rr9p7LtqZgFtw3855tUTKxQdZXbN/D/Oe/4XRD93wH9rd1Cz5rI/XuOfVm9K1J+q8sSQvrB7hpyjuZyC0A91nU1QKgui8/3eRjaJiqKrosPOPZcxG0B9lRC1WDzA+QqvgC0sgHOWYZW5cXYGwIqO0Tg8kLtGCJ//36ZvdBmpjqA+oaArCE7NE+WntkgzbsVgKkRRt4KwNsAVZFqEaragb8VAI5ePRtFh5GtPeY03QpQtbXdBjja8Ekx+iXAP6mkPp1/sjsSw/9DoSsV9P9Udsq5OM5G0tsqHaa1fb54iF+5o2K8/48o0D9OZg9+LvoHGmpLZLyclY5/xCIUANXQP5XtvLTkqb2F/rvRPzArzmpavPpB/1zzhCL27Xxx6E/PHcb930/5H82sH934d8i1Ckad3AkmKF9p+8aiQPASI+exGYWka1cxJXtbQNWyCu7rEv0Amb1S03kbwNierArM+888BCnO8xcFudrpUoYbAqiEZ4NIol0uUdEzpAcAYH05sHArwL6lYFOEWSL3rQBEvZ/8aXchiFoMi5DQUifu4FnaALQH8An7LPUTbADdAIjh/9MVw/9Doeco6P9zH/LzkdRc/aDMlo7x/nTamV06qd53K9A/TmYPfjT6Z5pkpJbVBe9Q+k+l2okhs0AXv+/Xalpcgf6NHVjOyrpCLuXg+Br6N27k60N/IiAVf1r3G+3HuPUo/w2IP4j8XK1wjtSxjr1Fhyxuk1sAXGMFon3hbQFV1ipLtx/AvjygwQYAsd+EljzthoAKju9Ee4fvydaT9pcDM0/mGfpy4Brcc/V+TtWcTwSSbgWQdZorp5tAh20A/5AyrWADjLgD4Lfp/+3D/0Oh0GX6dfof4/3J2eJBfOWOivH+P6VA/ziZPfjp6J9MTiUh86fjH7GIgv7BS/9nDvwHtHTHRKoXbc1OXIOlItxcejt3oP9zejXknyvlqCXVE33ofxL09/1OGxJeyP1JI8qroYh8MOJ/P75f73zjeX2ODz6MRiyYK8dQtwDlI45CMrKffFtAMf8CP0B6VS9VKrMBcOUuQnoS3rJRZxdVtHpvcPlXw99QH+pKG0AoWFZXVbS3sFyWoidJDwCg71YA6H458IZmoXqlWwHA8XJgahGyT9sG8il8ZgOwHgAA/AUA3QZo8ABgkA2gGACm4f+hqVINhnj+Tyh0iX6U/sd4f3LGY6H/RzHe/6cU6B8nswe/A/1X2Yz0v7qwbaX/U9/3S9UrLSCN/vEEV43U4gvxN6F/lxdCFxmP/peD/kSYmfu37Zc6h/MH5dc18wRglWV06xFnRSfilGT0Cc6UvZrpFijUXmLE+d60LNp/W0AZlu8Ti5OFOp3XDxDgNVk8swGOhSNsAEvVZTDTAGwQMEy/3HS57inOsY7zCOsNAUVFBdHeYT4Ko1p7pLXfCsDYAENvBQCqS0k7AaDh5cCMo0BsPlR1AAApnT1B6++sWwGg2waQDIB4+I+uv8p8ffi/+vyfUCi0gH6R/sd4f3I2X3bxXorx/j+oQP84mT34Hei/zk/lIWvBTKUN/YORoWc18pxay5Ohf6YKhv43o39QBv47WLkN/ZvqugL9+7g/W3YZ6E9ErsT9x1HmwYh/TKpxB+tbcXyccwB0r4KaNhrrtNbrcgscebsSMKhXovYysp96W0AZWZBnwg/AVkTWFCVzqw0At90QQB3bFAhOlLLdEJCZB1UVe9tKt2Cjiuc5EwB9K0DVhsTh+N5bAaDoUqv3AN+prlsBmEWwcvndBrjrVgDosAHSf/zTv7HzwgDQNOD5P7IBEMP/Q6EF9EP0/7HQ/yOpxfrhlS0d4/3ptNO6dF69v6NA/ziZPfhN6H/zLDgUF2ED6P/PDvxnF7CeW9VzAfrnOD4Rn+rpbvQP9UIRaY0ZSI2D/meyq7n/yxE/sDutCcj+YWcAt5oWT1XHOm7pb/MRtyG3ryL5UXNycf4MQLcjvR3O7uP55nNVYPfZ0KRzFu8NuZaIW5yyIiG5fNgXS3HnBHjiRoQRR25jSwiuTZ8rcQ0jzBe5xizM0JlSHt9KZ4/J9jN4sruQRBvAVx1ZHH0XN2/2DoCg/7pi+H8oFHqN9gPg+jgbSW9u+8lyjPdnks/p0qn1/o4C/eNk9uA3oX8oWmh+7PgxVoyuHTdDuJS87n2/GfpnqmDofzP6Bzv9t6J/4RqfRclFqino37osvHCNHMtRytYaCv3PfI/g/srW3qBhDNq9mLcduQO7P1r21VdtYa5NbvNVh4+fltz0NC7J7NsCuH0VKqEuIzqinfQ50XHHR2ahUn3o4OKLWZ//qdUoFOcSZh57kfE8ApcEO0t+rjWharqU+KLgDfvq5cNtslZt5+a55cWZlqQrbwXYp+9hVWdWlYJyKwCwTwQy//4dj+jZIIE2kF+7G6DniUCAu0zZvEe8BPhXlf7zZtwQw/9DoQv05uH/Md6fnCGWXb+jYrz/zyrQP05mDw70f1Zho//CcKOpA/9xnox929E/9ND/tdC/tZSjFhH9N3H2AlCM/CW2NIZMuSD315vk1X2Uny9jLR56lch1PelUzrVd9bkFkONdY2XcvlVG+Z/JmVtA1Cl4CcLbArIJ+ttQxeaR8aIfkAFnlw3AmyV7rUe1lROgOi5kTvRsoqqiYlnK5GdBrupqOrYByHiE2ouwvU6y8Tj4nJgA+l4OvEP4bEtX/Y9sFWdWheA9cKlS2l0IopZijXyWkP2VWR/RYyL4M18MAGYbgDYAYvj/FVKH/2vP/wmFQrP1Wvof4/3J2UzZ9Xspxvv/uAL942T24JehfzgbaW3PfqVVVCWgf2KuRv+pbHsqFiZqeQzolqTe1HWq2bQw0f970L9WZF30fxP0B3nj0WaxWwK0cP++u//1/E41+hamPVWAfpd+p7uMSzr17M/b232GQUmBMbujW0VWcNdtAXV+roVMkRLMZz3gsgG4YCLgWwXR12qSOlhqSVlDDZ3z2eLCEjbAthHxG4qs4Xg6+zbl35U22F8OzLykF78cWF9q4eXAtffA1fs50/O8HJiTC8rrhsHkFwOAwQag3wGgGwA/T/+nP/0fFAMghv+HQrP1Nvof4/3JGXzZR/RSjPf/cQX6x8nswYH+9+rS8Q/VhqIxXvRPZTuvUnmSbqH/bvQPzHocN/CfweWE38A0j8qPZw1H/4Trw3sYooitl0f/Mlsf0QAypQ79xbkDub+UitNsxK9VYd0jPRFbP7HNIU4LnipafnMux1VeRvltAXLxnrcF2GupIivGzGcgjlrm6qpOJpbWtZhKY9hzINwOoWp8gsYf3clTOfKITjabW/BU1ssHb2ySzdA2nLy0UNgiGzN9j6c8AKqIcnruOdfXg7W3AnhrpDOg7wmAvAPANPw/1KkY/h8Kra1X0f8twUNwNpLeYunIqNm0TNn1OyrG+4cg0H+dzB78PvQP33Y620PVNpD+U6n2K2IWlVpYfJaHTlK1j7kqnTTwX7i0vQD9C+SEW4Od6N/r8UhFnFWzkdRuSs0pcH9pBQ3l/ncjfrGkL0+XAsd3yLrBP0Fu4vwtZo687ASTa1J2JrQdMehhMmrCeink2wLy4kTZYxdeHTPKSvVuRhFCb3+fOZOPAciYc8LBn4lZXPlJrGgP+JbGSYx5jI2pV2W1REVBcXmPf75ds6mR8IXfhQm+dywK42oHAM+tACA8ESi7FeBsG1MjCLcCANWBdW984623AqRN2uF4bwVQguffCgBAb5NN7wCI4f/9w/9DodDCegP9f+xDfj6SGq0fCtnSMd6fTjunS6fW+8sK9I+T2YMD/QtNakP/4KX/Mwf+Z9NLkE11qq3ZSWxw0bJiIr2FGzuqTuVC/0YThd3wOuB7yv/a+6273jqZg4E+mPv72qAVc+dp15PZdMsvJdQq46Gt0ScA/0ocflrKEdtvdakK5ZMA3Tzr2wLq4uLbAvAxdIgfgG0AlvnmE1mCr9oAANIbAix5qoT0i4LPGRvg6egv2gDoxuw2gOnlwBVn31tSJtyo4nnOBEC/FaBqQOJwvOvlwNn6zc4Qsw60eg/wnZqotwKUiyC/EgCcUL7fBuh8K8A3CQDk2xR6BFA8/d+i6c//UfPH839CoWl6PP2P8f7kbKbs+h0V4/1DhwL942T24FeifwDY0gD0X7XkDCZmZcWnvu+XqleiujT6xxNcNbLQNptI0cBUR7ahf2upR6N/Y6Vjob8Ydh33V+fORvyGVO2aycf1jv0hPfOsSWTWfHSfLJB6oBrWDHH0ILMZlkM++5DbJsy1nXM4LBku8lxZ5BGXTmI4UMgZKBvAlUduD3fkqzKTJxT1lBPHk22rNyduKyIbLK0a9iQAV0A3jPBZ2Bpx2wxdJ24nROPrutSL77FPBAL9oUD9TwQCgK3lDoCfp/+qBjz9PxQK3aSn0v8Y70/OeCz0/yjG+4cOBfrHyezBgf6PWgaifzAy9KOY9DQYLU+G/pkqGPrfjP6BHfhfBkv0fyz614rchf4T+mjotLOUWulw6C9GrsH9Bf7HxWmaijz7ko95+/F0LXNy8ozucsq0UPpgGFMuzrRm6uztb7k82ZTtnJXKaUU2y50BRXxVeWbAEOWFsvJtAcwc/TXCdcB5N0A64/jgz/REdgdXioj5Bi1yQ8BGVoo3kuaXA5cduyfc8uJ1TgDYID33VgDTZnD5rQAA8Fd/IpCeRG0JlHcAxPB/i2L4fyj0Vj2S/sd4f3I2VfYRvRTj/UNIgf5xMnvwW9E/QPLvzWLgv71Glt4a0f8+0QrxyySmUmRL6CLYkAC68ZrYlbt/HIX+r4X+IPy6ua2IT6hwf8uhsG3/MJsL30/5LzxVeCVk/x0N8Qma6m1MKje4miscmcn5rhrbbwv4VG3+mbIV8dMrUi4FV6G2WuiYE8K35JGbxB2MubNmVCM+6SDPPMhIfsshm6qsF/24xR5OXbcC7NOJjYEqwizpkUT7sXzC1Ovyp90KcN4BEPR/iGL4fyj0UD2J/j8W+n8ktVs/orGlY7w/nXZCl86uN/RRoH+czB4c6D8v4kX/eC5eiQaGnqdiEaqFXCuo2k7/rc2eQ/+vQf8cWpiF/jXK4kL/1LpwFDclLLOzLXEfizu4PyCewda9NuIHtRP4QqwCxA/Ro7ux4TBpWl7j/QSOjB76Xe5jjvRk+WouLpq3rjhm8s3GRbJvWXVEeb4gUUYe+/PBxnWSjUm+fQ+Q3rsBgOwIriAd8/l/yyc78pTFfDcElCv9u7rrjSed/2wATbcCfD5teWTKF1ZcL8aXA7tvBWBqBNetAGS9xhWX18EHP+5WgKaXAP+w1OH/0xsQw/9DoQl6DP3f0lNwNpLeaPFEUUlOlX1ER8V4/xCpQP84mT34vegfRtF/frkohFdwbbp6ARAzCNuQJyMZdvQPzDq9ceC/zrsf86D/VH90oX8unnebhkN/aOD+vt+LqzE8+p8EbUek9Z8euDv2SXrHUiwrY/fO8gn27KPdAhp/y1CSgu+iGUCaDKa0n+mnk2BzJqoAzlvA06w2wOfwer4feJ9kswGg7gV1EYqYtMdWToAlD9OqirCXja1sgK2a+A0rYhIA9XJgPdveKKGRpAcAQL8cuMbx9JN50rcpp5OR9TKzZndD6FyUehnPJaXyWDH6UYfoAZhS2eO1lwOD03jI9TUAYvj/RVKH/99tMIRCoeUU4/3JGUzZp3RUjPcPkQr0j5PZgwP9oyLmgf/CRU1e0Mipd2jLUj8tT3El6kDh1GWludkX0n8B/Ws8vQv9d2B0jP49v0TLeswDZ0B/uIz7uw6F9Wrtp8n3IH64mvIHdr9W7SdwljVF/CYm1AIdizHYLfimO35ojhsC6vZUZkDFp/1mAIfuW24LOMJYP8BrA6SzJWYbACicLVfExnzTENksecpW0TcEZLV8/ynX8lZORFV//vmWrME3jqyzJVQvJvLkMnpuBZBsgH3DKNrG1Jit03JtcN4DtWqsGH2DtAGktWyAtlsBvu8ACAPAoulP/wfFAIjh/6HQDK07/D/G+5Ozq7JP6aUY7x8SFOgfJ7MHB/qvS9kG/vO0WkP/VMLzEpWnvRb6ryBgMs8jBv5fi/5bsLKwTi2pOtC/j/ubl+gZ3N+UwR8pt6YxD/1D69Jv03zf/v2X+8q2Expb1+TkJT3mKjU2xvjT9O53uD2lpVVqTLWDptPyPVPBZq1ei9vkWzTCcHHkKSOpszB6ucgzESobfw6hZ8NluZNElLaol4+nPIB9jnFJs+kZ+2crVc7ZzRcAm/aMflc2a/C4FwOk//infwv6b1SvAdA9/D8MgFBouJaj/zHen5xBlX1QL8V4/5CgQP84mT040H9dyjbwXwTQGv0XvIT2gf+gg2CWnBJXljbT4ir670X/MsogV9aC6J8rVXWjiUfblkVJ1cD9pWym5tSRVgTXRzpbj/JTTlfuJdeOPekvE/Z36EqfoKyxtWAfBJcyl2mVGK3DTBS+oThRutUGsHkAVcAIJ4C3AYx5gNl00UZCnmvrcJ8cN0FG8scntw2gewAg2ACulwPjtjXaAD5qP/pVvXr8IOPB9g6AoP/99D8UCq2npej/P/7LsF9fUvqJjXQw0natVdmncP8Y7x9SFegfJ7MHvxr9w0D6L8B6IgCvTQ/9v2LgP07VPvAfktjgomXAXH2Si8bS/yXf8StdoScyQM5gRv9wrvRuAq77B5dyfxYsDef+HUfzFSl/i3EVEvSCbmw4DNKklM08oJPsKVCbPgXRY9+P3zU6QB1fLH2Sl8Re7j4fx+D5lpyf6ecCCG1ji39OH8pjw0Zl27ulzvxpvun9wFS2rJitRiLmMLMpJ8CSJyuTPd0+z08sV8pXZb0Cz6Vrfjlw2aV7wi0vTi7aBol8K0AVnMD/cmCquk/QHlauUrIIJdcTddJfxQNoeCKQ/nJgGPBigPSf/+Pf9eYE2h5iAMh3AMTw/1DoWi1B/x/7kJ+PpKbrxzu2dIz3p9OO7tIL6g1xCvSPk9mDA/2TpRoG/hOLf0IRuhFsQs/7fimQLdF/Gv3jCd8YA9OHqwf++9C/scd85F3P2Yv+wbYSj0DLKhCkQ38Yyv1dx0F5b+BB/6bFVNtjb4BRQ0D/C/D0CxbhHZp3Euo4zWlPW07ElUinHt4Ft5wmWI1KsQ2W2wLqgnfdDQDC/ttQKR2DTRZfHqiOw/XmQbYZJccxlAfAZeMOXaR5pqwR/RSZOafDWwW7pOV0dTMY9TgggOfdCmAwAIL+A4BmAMx++j+EARAKDdXt9D/G+9Ozq7JP4f4x3j9kVKB/nMwe/Hb0DwPpP7WAIiMurpkMDPoI4y/0be/7Vcg1Tf/py0dLs9mB/8BcKtaXm6whQWZLShiXkI7n0b99kxZcHGMqF/oHog/b6L+Vht/C/dX9gHPn1mW9D+GUq1H+oO1daj+XuEGTPKILzlstHJkKpibOdAKoIsKQAG6+tQ2CH3CZDSDEUwEDbQA6mzlPddLEQ20us9EG0LOJHgCZExgPgApmPQBg3grA11hGMq6JeuH+cBuAyxAGgEkx/D8UepNuo/8x3p+c8Vjo/1GM9w8ZFegfJ7MHB/rnSnkH/rOg8wyxYfT9L4NxjSxb4jwsZ2+m/7cO/B+N/vV1quVM9cdm9M+VJf0eD/q3/mClx/qyc1q5P0uJ+rk/1Sq3n2FVd4aWjXBCMxbQo/D6a/Q0n8D3ml/m16W/fdfbftNJxCAzgHMCDDZAQ+812gAg7OOb82xsKjkP7QGU08jWorSkB0DWrmcTbQBl1evrwm0DiBuG6j0MvBUAHmIDaAZA0H8A0AyAGP4fCj1It9D/GO9Pzy7LPoj7x3j/kEuB/nEye3Cgf6Gga+C/Af0X8XpClktqGDRD/1zD7PTf+qKCleg/feVOJiSusN3UVbr4remCKUORZwL6N/1am3aVXgcCFSWD3dyfCqAaZls7zooaNAC0DoO00+yQkEW2frYf0kzosFOTfIIiua+IAwTzu3vdCeByOuO7zABmobScx8ReGyArLx0IWanmuN8GoLO5bADRAzhn6HC/PqfhIhUPACy/ZfOtACDYAN4nAp3bDFvvxbcCuBNagj02QBgAuqYP/wfFAAj6HwqN0pX0/7nQ/yNpr+S6TkYzqrIP4v4go/9Z8H2vub3slHpDFgX6x8nswYH+hYKugf/C4pPbCR+fjr8MQuWGbaEcFnBsWsUrDvwvfzJSGNuYcz63vfWif5VqSBUZzZsjlu1/aroW3Oi+D+f+LdCfCWOH/LcmbNN9lH+Ez/FTMvTVy07d3ukTDHIC4EYzQDuMScEPtAGo8m15GCdASFLvJtFRjTtVr7q9jOHOSJilFm0A0+903hOB5JN37krAZgO84FaAI4loAAT9B4B+AyCG/4dCa+ga+v9o7q+fvUhHH21XVpZ9EPeP8f6hBgX6x8nswT+A/mEs/ecorRn975nFevmCnzZoSDSVeegkRcw5kVhkG4FdceB/O/q3b8/s5joT/QPRgS7yTmyBHdDfWzsqR0YO5P7gQv8jsKTbQOLU6PrFqgAAIABJREFUDPpXoPzdbYgzpGV1oU+Aa3OWLSb6mLJ2MFjDDJB3ylmc4nZkCeuzAGvZ7/SyTV1OwEQbwO0BlNOMZJy0AbT+3KopZNX64nwXxLQK2FMA/60AoNkAi98KYIo3GA9/2JlB/wGgn/73NyDofyj0BD2a+4N8uHSNj0MzqrIP4v4go/9Z8H2vub3slHpDdgX6x8nswYH+5YL2gf9KP+M8JvTPgQruyrG6ClTABZln/YH/58REZeNTEWHd6F+6oCaSWzLgPDr6h3N1d6H/vn3jItyfiaTRf0ubq8ytBTvrLepvrprHUKHxWsGPMcq2TRgRtJEVDiiMdt8bmv6deJiluMkbVc93Yiq/Z3VmtfAuQd1IUVR8QvOLGDyz+JYflj74mV7GfFKCDe83zWW/04+zkGw3s+UBR1Ws9uRs79uTwNlLKe8/rv3w7bqi3dtxsN2gmALF1I3aioqw9AXyVL+hNb4VLcyas0emvFv4bTildHoPfHD61Eg0bG+4urB5ti3RDD3fJhqKk8F/ATQbwJUQ9qsAqchfxQNIW+LvAAgDAAD6DYAY/h8KraFJw/8fzf31Uz7pkKTtu7Ky74H+H81C8I4uvbLekF2B/nEye/BvoH8YS/+NILUoQtQ+eeA/6PR/y+KKicQi0+24i/7X6L8OY5euqlRpmygW/RPJjRlAXXxi+kz0ry3CWO7fBf2Z4CFD/och/vYMAyg/DNqjPlIPIu+P07itqssnqEUeaOvMjTcEfCTtNfSNrmExLWcl3LG/Lqsv4GcKUYn3boCqQXrz5Py+tUbEYA9FKojaX/cweSJPbWxlDL9r1hMStZsWJ8GsWwGESmWGngbfCgCaDdCSsONWAMYACPq/K17/Gwq9QMPp/6O5P8hnIx1niM99yM9HMd4/1KxA/ziZPTjQv1rQOPBfJ7w4j1okCaSv5uNEwzT0D8wlZ/vAf0gc6uhB/1RFBP1nYl6L/oHowPH0fzb3V3/s9h2LgBT60D+7jH2t0tT30B5uF+HMEFpXo1bQ9WejQ2u0cltgfskMvKZ7V4TaXKOKGU60bZJ8kiIc1W60AfZZWSKbScMHtNsA+3lSoweQZVAaZrQBtJ5kTAV8Pscd99DEwn7gg1kPoDo7tHSjwtDfawOEASBp+ut/g/6HQvM1kP4/mvvr53LSQUTbWWVln8X9Y7x/qFOB/nEye3Cgf0vZmwb+01VnbTBwUo3+0+gfT2Cro2q0sGA3/beg/zqMXbpsMrexWbZn6WKZt23EDL5mkE7Phei/ifuzqGYS9wcO/dtabuX+XRzWtrWIVbfv4ALx9+sH+/CyM9nuilhkabwhQDj30egwagWpC8yAFhvAbn4MsQGIGm0mDR/T4gRkZ0smG2ARDwBHEqc+xsUhbADOWNJsAKL/m2yA4c/xX+HFAJQBEPR/Vwz/D4Wern76/2jo/5G0o9EPMWzpGO9Ppx3XpZfVG2pToH+czB4c6N9S9saB/1pHabQ0Q/94Fp5YXjnSi2yBs5aB/0yr8CXjKPrPB+ALd8kmqTUH/StLzc69FP03QX/gUEQX9NeCqV8Zs3a41WGLtGkA5Ye2veKz8PSzWruaGnrvOSi/MzlNLcnfOQNerUxcChBZ53AzoKaxcmPG2QAtrgmQu0m/EzDABjB7AFC1WfQAzhlGD0CLZBIStbd7AEw8bwN8ilR9KKTSzonHj9wfnVAvktUYBgCrGP4fCj1dPfT/6dxfP0MzDpEjZ2dln8X9Y7x/aIgC/eNk9uCfQf8wnP6PQP9qqW70DwX9d6B/PMFVo4ULS+h/nzgK/YupEtGqXvQvDHtTMoC61OxcEf1T0xmo3bGpG3dN6g/cvjPRzTNrM7hsrei/D/FntdxP+YPCN8vZdcueIxrJ3SwNOwnAE1hqeYETgGOuMgNm2AB0zwyyAaDem/ptgDLGt8r204JGDyDLQJZlVgSecrJ4dostE1Zn8CiSOlWk0/a+FeAI4E4d/DbAm24FqAyAoP+7Yvh/KPRotdH/p3N/kA+FxgtIcsZjof9HMd4/NESB/nEye3Cgf2NZw8B/Uw84B/4rHcUVJ4kwMQtP1Om/beD/gvSfuwpGl+k96D/VHzvRv694Ov/oW8Vepg39k9mMtvdV3J93QXgob+wiIrLvufzAbKXmgmP0OMQ/ocFxljZQ7Uy8R/b8DiegzwYQikgBfLIhbw8mD1PPswGqb5YkwCy+nCE7PzDZAKoHUJad5QHgSOKEz7g4Z9ViPOM9lDFmG+BHbgUIA4DW9OH/oBgAQf9DoR556f/Tub9++tFxnngcRx7H/WO8f2igAv3jZPbgX0L/MJz+11dAOqslGiCUUtE/W5yj/3b0D8waX3Hgf/kLYsL4VE0D/6XrXx4uixlwHneGfUVfj/793L8L+mvB/G+K5z2cDWOK9KB/7ufmKdulES4FxGnNxbrdmLlwfVuBcrM0ZvptBhs2wgngSkkBbL6u2wJMCFhZZPPD/YkTiHYbAOqDbZcNQJSX2mb2AKBqp+gBnDOMHoAWySQkah/rAYBgpx0B0hmwJ/gT8HAboDQAgv7v6jUAYvh/KHSf7PT/6dwf5ONdx5iNGO9Ppx3UpVfWG+pXoH+czB4c6N9e9o6B/xb0TyehLuDc9J+8aHvswH8+VSJi2tE/D5e1DKAurDL3IvRPFHSi9i7ur0Xq3J9M0oP+xZ1D405nEKAflSROYk7dTuEHq163g5bw8o2mxTMw2gBspLof3zO0tUSJaTUDvDZAMUvZm1ttAPv7gbkMVECZtN0J8HgAANc/DgiHiceberVyGxJ3/iKZW9ZOVn8CdhvAAtyfawOEAUAohv+HQs+Vhf4/nfvrZxfGUXLk7L3s47h/jPcPDVegf5zMHhzo31X88oH/7egfiItLBWrTfJxmmgZ0exX6PycmKpsxlZ/+s1vpIPTfUjzzeCbTfwP6ZxnSPO7PLrjYHmFi+9N+yN8Ipx7QujLifxsin62mvr+4k83oeWgtU0QzUKMTwIbZMKjxNiG3GSBlNQ/MJ6Y/zwbYY7K8VpOmnmvk4EesyQZQPQBgjlpE76Gw+nTHnrDJAwCHDWA5q1UYutMGeOiLAf6cH4P+j1L38P9QKDRcT4f+H0n7Dv1wwJaO8f502kFdemW9oVEK9I+T2YMD/buKXz7w347+qVpwMpChNo3+8YTPRLpZd9H/Gv3XYezSZZXWrdJsEhx/fGzi/kD3hjFDKj7NRv/1RI7+X8b9m6E/M53uRnIx7ej/Xso/FvE/nuyPPj17fIeYZcWB3BxbT3n7s2l9Hrv64li3odnZxHxff8BOHJbO2WLCzK3lFzefwS1jEVM3GrcZ0G6+WjRyekIZz7nlHK6jUP660q3qN65snoFseRnzaWN5NlGtHblvEyTUm5vQY+nT5E0OPpqXbwDb0aVbXfbs6DphGbZ9/uEaqSTca8+WHWyLk9JeNVPjtwJhtZ4xCQSGjjbOLcm0Pf0F0Ki9mmRqQqAWeb8DIOh/pnj9byj0UNXD/1/A/fWTT/HYpCTfAN4H/T+aheBNXXp9vaFRCvSPk9mDfwz9wwz6PwL9cwW96J8Z+19CYdABaMnHacPDwnATSUXLSDf6pyoi6D8Tw6fC9MVF/xP624T+FYdDmZuKP5PRP1FQQ//zoD/RGNQGNUkP+jf+nF1nGp0QeSziB297zHX+DitfWZa1cPH5LFvdnC2GPsRV08lWkTvLOpLcmwi9anOQlSR0DJEV78O0hrG5uANwlZ9eNKLfiE7Tu0XtE9y96vFYKKsHQ+/jgNgdOnnShL5ueSC9ZVYJufMk7gSH+WkUVfPBxvNcnaHnS335rQCWnM1PBAoDAGv683+C/odCc5TT/xdwf5BPOTpOWJ77kJ+PYrx/aJIC/eNk9uBA/97i2sB/az/YBv43jPpngGzJhYFZ9TT6xxM+E+mWVVeEND8tJ7rpvwX982FG+q+gfyAXYRD6byluQP/UdAZw6/Tf8cwfdruySd1NdXJ/Zu7Ip/04XQeTbub7Vc3B8fv1jj688eTXdljyZuBpvjKFLgh+JwBsyNuShwg4ExNnHLfYAHSnGUwLY6oqpkxtWzVODn7EmmwA2gMAbr/PegBEGHkaZEzY5AEAYwOQv7UlbYAWZC/mbEgIXwMg6H+mGP4fCj1RH/r/Au6vH7CkXb22e9kAnsn9Y7x/aKoC/eNk9uDfQ/8wg/6jBlu6wjZSeAD6r6prov80DiGmEpfM+sB/plVOcGyh/3qqRvpfoP8m7g/qqlEyZOjfCZqnPfOHX4OjuL/xQNzA/cnpZLe3of+mHrgP8VeVPxRSP7TZlGadaMpdxNfa3rW3nzIbIXUeVPFrMS1f8BvptAH2mNFmQKsHQM1lAPetNgCXrQpgnQA7qVeCfR5AEXytB3DmFD0AMC8O9gC4X9koD6Cs4nobYHjCMAAKxfD/UOiJ+t//61/vbsIASXsHfcfOlo7x/nTaEV16cb2hGQr0j5PZgwP9NxR/3MD/qi6JwLJwvJn+3/q+3zpyLP0nFsHAYzjWLAaIGVLxZxX0f7aohf5rAb0P+RHnWtF/89N+xClvQ/wvAu65pp/qPb3fppz7m/KPyGzC8fSx0egEsGHqEYJR/9uDqUOI43FATAAFhbXu7bMBwMKOzVZBVoG2m3Z7AADNjwMSPYBzhtED0CKZhETtdktjM5ptE2wAS/DKNkD6z//+7666360Y/h8KPU6Ppv/6UUnamWv7kw3gmdw/xvuHLlCgf5zMHhzovy3Dawb+Qx/9tw38v47+ZwWb7I2s3rphA+l/J/rniciV6J8oaED/QK/ougH8LLJqKn0z92fz2zqq2nMaUnFP0LKoH/EPRMwO9rKGno7XZ4vrn/EHZlPUgNXlbbmHxRPHSaMNwEbK/qSmHjOgOpy4bwWgAhpsAN4jqXLzoFnvB9uy7HlMHgDUy6Z1tYeb0xnqguQpVT3ltAG0DmdMBVy7fdk3tT8/CQd6AFlFz30xQBgAp6YP/wfFAAj6Hwp59Vz6L+0LOk43ngv9P4rx/qELFOgfJ7MHB/pvy3DhwP8G9E83gEP/37nEZ9MGcOPAfzLnfklqMQn4bPjC2kn/6+tysTF5FUJBKcCM/pm5jQP/O9E/05iOHeAg7k8GkEtHhZm3Ur4IqaUQvy0hvVxB29v00H6bfV5syN/SczYaLrdhsBPAHkeVZqAA96VMvdT1ns/mQyDpNkBdxGgDiMeJATcEnD1gYNZkt0vB4zwAYI4AYz0AHEmcROqLkwDfBMBFfhJOsAFuuRVAzakmDAPgVK8BEMP/Q6Fr9Tj6rx96jJep5Oztqdw/xvuHLlOgf5zMHvyT6B8m0f8R6L8uOwz9Z9UZYD113UfSiHsH/pM5m+l/fW2KLmCF1YovdXnEMh79l6ZOi3Nw3eP+QepzceKnLDvLA7gbuD85cdTTfqw/Ill3Iv6qBb6Ca+mJbb5GZM+MPUJfdirtNQy6nQCe5itT6IJg2913mgGqB0DuBVezAWCmE1B0oGYDuD0AgF97HNAZZr0SGOwB7HU97laAMABO3fv8n6D/oZBLz6L/0o/fPbIim7EBxHj/Om13l15fb2i2Av3jZPbgQP/NGcSB/47euGPgP5tuIz6X13H0UhuQnwn9F9UZ6b+U8+6H/ivNq4uIVbBzy9Xa9JOf9swfDf1zTTL6E3XKjj0eyDDN1kUNS8cuF7+upeTN8oGRrgxdRULw2H6bdKY89QS83pFLrJbccxHTCKBvA9msEyA0QK6iilF3PNmUM9YB4rWY59oALg8A+AMmNXHD8aJnIPUhdxgRN8jTBtC6mjEVcO36spP3AXANMHsAcIcNcNmtAGEAfBXD/0OhB+kR9F8/xEj7eW2PEeP9yeR9XXpLvaHZCvSPk9mDfxX9wyT6n1/uGTvkjoH/DnKHUCZJHbjHlTTRfwr9l5U+i/570b+62VyG/sFE/2eh/2r6ctyfXLkDn/ZT9+Qo2nsL4u8seIue1drpMvzQVPTcVNtEeWux2wDgcAJomm+YItkAchuEWsq5ug1AHXjutAG4PSULyic4AfE4ICmh5gGg+DNMOHPC+nEbIAyAr+L1v6HQU7Q+/Zd+7fpenS0d4/3ptN1den29oWsU6B8nswcH+u/J8NiB/46DF76+Y1k2kZO4TOPxpUL/iatJhf6fYSKxstD/um3WpSCv6YkMHeg/FZ9anIO9OLO1yMWJSjX6b0X/1az68taUxBCguyaWzqH7UJsyD/3fiPibywZtN8mz5V/RiFPW5gw0CXDaaaKQt8cGwOFcKQLo20i67gSA4dSEyaA/2Ic6jLFnLjfaANJq6rAB+HVktQHcHgDA6x4HRDWyyEnfB0AGf7J59gkuG2D9FwOEAQCg0X/oNwCC/odCg7Qs/dePI9KeXCn93/7rqSg5xvuHblGgf5zMHhzovzPJMwf+e33rIo/9mT9ENn7gPzCXgTz91wnyfq1pMQn4bPhy3Ej/U/7XTv/dP9jkKC4GrPW4f646knN07OXAAiGZ31EdZjHATOifXNGGH46sKYi/OcOKlF9yc1fWDSejarcY2nSzT1Dk7yvigrbA76/JDVBl7sxEmxNANUPObHnHb7WA0inMmjYAdDgBzApyeQBg3KKyZTfZALRlpXkAdUIc1uMBZPWQHgBT+6THAYGXyBtsgBtfDPDHlfQ3NWD4fygUeq+83MRY+rkP+fkoxvuHblGgf5zMHhzovzPJVQP/29A/3QYZ/YPKW9lSvfSfW++30P/6ohNdmToMjHH0vxP9e3cs9z7un5pFD/z39VhVvqXTLn7aD1Mj0zxzTqd6MrR4A2udYq3VmlwrmxOGtmkHpD2NiWR/MprrxnXYk2dFUvE1oX3SVpXCNSbc4KNwVuqz6yv6gAqrq8t3cWwX5jO4feKGK0pon1Qv6bdIOhf1sxRCb8hruFrklE/+ZkhF+6t19GkR0XKu9k9zuUery0tUTz/7LRUrhor8RCWoWssGp09bNjl4n15FZt1Z9lvKO5nf3tKxndb1kgnxSk9n7XXV5FKAtIC1pPVFBCewE/kN0pa2f0jB6S+AhuzTllwegJrzkzDuAIjh/6HQY7TO8H/9YCHu8+WiMd6fTt7RpTHe/xcU6B8nswd3LC8OnrYW5v3YZg/870H/qPhI9N/0K6jwLu15EFMpiDmL/ks5l3zoPx1syowK6QhbC1jxcf/UXGLgv6O7qja07SGnPu2HW8viT0bfeOzqzNBSXHqc0Z3nW/2d+SxdsLydq9NWvHE5TLvRugj/FZjfrrwUXDPInbHaAL66TZwrtaduCbPg1JSSYwu1GzcV7vSZ28WjeK4WZR3xONq+CoptQzhA1sFi5Dnd9jig+hBddx0+82IS4rD6LI0uS22KLbWv8jigT7xoA4DmAbRVKqcNAyCe/h8KPUOL0H/p96zvnNnSMd6fTtvXpbfUG7pegf5xMntwoP/+JPzAf99e6MKB/3oqFe9+w5Q2c9mM9J+hmU76n10p9tL/um1WoK+jW2/aPNxEsbWAdvRfTyTb2Yz+qwCd/msJdcSnzCW6xQTxm9G/tklYtwGlokuK8/sfdsavIfiPfnOpc13iE+RydDlxZNVqJ2xQJhLP1Z0AwgYwTlGTyI2pllpfOmZvdbUNYDEwjA2gDp8+U+HRjwMyegBapJSQOlgKmytLzEd4AFJ+Lr7bBmjwALi0v24ATB/+D4oBEPQ/FLLoXvqvHxSkfbJSOsb708k7ujTG+/+OAv3jZPbg30b/MI/+H5c59m553MB/0NssJFz2lb88lWb49ZX0vwf9qzS8Ff0TZSej/6pGH/3v4/7mN10P5P5Ckyzo/y7EDyCZFmNBf1DyIbq+G0cd4MeeKNiyZQcHvw2QTXQ4Adzv3EJFXSRayHMW9JN0ukm0scFujK+xATo9AGAODlJwpwfAtoo8QWPCyDMtY0LaQuANA7cHAC+1AeqcYQD0GQAx/D8Umq8b6b/0A9b3wGzp50L/j2K8f+h2BfrHyezBgf5j4D/bGD0JALtVGB5+8vZX/hKLMJz+D0P/0oY64Zk/o9E/0H3L8bHh3N+0wXegf2ntHEF0FQ71OgTiAaK/0l+D+89dXrnlzYfc4acCo12HjD+KJzFDMG4xV3ECaHzfirYZU0FZZH25HmoDyG2oDgzxOKAszOQBQPHLKifTrJ9KKONytghbgpMLyqseAMy3AcIAEE9cYvh/KHS3rqf/+p5fvlDk9WjuH+P9Q4so0D9OZg8O9D/oSWuPG/jfgP7JPB3oHyT6z20DRvov5Xz+Q/+rTpBMFDnVkagT/dcTSajA4QvLb0Sh/zb039VL0rozQXwV/ZPcX25VA/rvYsqiD5G3hNQ80P9cUD5Vc7pl4EF51kn3vPMGGwUeYgNUhZucAHL/bWyGFkCN63d6AFJj1rMB1P0fu0KJoyadikHhLg8AjFtOtsh2G8DoAUDxK2Abs2WBhsg6jC1LO16fWZMfByRVwcXf+mKAnzYAYvh/KLS4Lqb/fZcxbOlHc3+Q0f8s+L7X3F52Sr2hexXoHyezBwf6n4f+YUfSrv2SOPC/Gf3XzTClMpJT4cndugHgfOg/MNd/j6H/PMklN3s9MoEF/au4di76h3rB+9E/jKX/bdB/L6tDfJX7020wDfnfQw3o37o76kP8joqazhhvB/23N6DUWqen9s5xtnuWT9BfnMxTQ1jtCTkTnAByZ12oxQmoYqgkmgNhWfyVbQC5AUIz+m4FsHoA+3TrNrNvLS0eAFQ9pnQsXcVpA2gdwmB9+j4A4M9SL3gckFQLF3/TiwHCAODnxut/Q6FbdQ3913fvreehj+b+Md4/tJQC/eNk9uCfR/8wlf6PQP95hoHo35RNh62fMKcd20n/uYtIC/3PyvbS/7ptK9N/9Zfeh/6hXtcu9C83QKgUT9fpP72wY7m/pYqhQ/5B2FrU9XIZ4p8d78z8oyd2i5kWDnlW2HVn9EK2ThtASD7NCWCIqiUzn6GutwowLcjiNoAKhQnq3eUBZG3SbAC3BwDgeRyQ5AFAtXlwCf0eAJ+NLfugxwF9i4g2wIxbAX7XAJj++t+g/6FQhy6g/9JPVN+RsqUfzf1BRv+z4Ptec3vZKfWGVlCgf5zMHhzofyr6B4DNv3d6/cD/MnOS+aad/uu8Pp9y4UP/ibZdTv+bdynshbKW5BL0X9XLdKxK/wVo1MD9DW2won+zndOI/rP1OxjxTy3C+UAX6DJ0LizPDfieg80X1Omv0rkpmCrwbl4E/saffTaAYbrDCbDhbNYJ4KajM1kVdqsegF7R9TaAYp+0tCEeB8Tk37JAvV56KeiOFM5/L3gckFQLF3/trQBhADBzY/h/KHSf5tF/fTcu7T+l0o/m/jHeP7SgAv3jZPbgQP+fKmLgP9sYU54e9A+j6b9OVCfQfyP6zxJe+9D/C9B/PbGmCxPQP1jov2pUkPm13RQ7exT3p6cTRaTtxID+lc1MVvPZl72gDbU1Jv8hEUbpDRKqbj64NZsEHZU6TsR6bIC6uG26wwYApgONoJabjjY33Ama6yAmZKZfaANwm5yLDttQ9e8+DogII0/LsphjFhGz6OOApIq4+KtsgD/GBr1M6vD/XgX9D4UWk/Sb1PeWdOlHQ/+PYrx/aEEF+sfJ7MGB/j9VxMB/qTFKkj2say8ttYTbHoz0X0LhS77yl1xePXJnuE70zxb5FhyK/oHpVbkNWkC1gTXRf4qJC43xnSW2oX8b9wfHRsIups5OO2GxsTjN7voz6881Cjk0tTONyevNQoHTqGBZjX2JkvCtatGWBeWf0ddjr3jsuj4/zHwnhYrbph9HuK34w7T76MC8i8r89ZwiVd2YrSy7lXvWLRVHjqp42qrf7iY2/rQy8fr9zCHWM9eBYti3ju/EqkYm52d94mMLGbwl7Glv1EGJ7I3t2JCyhgnbSYIE5k5O347cTMFl5u1YQfSmtRVhWSkclgA2tl6un48EG31WSvcwQNoSDcr5LYdLJetzGmy3AT5XLoINkP4CiDaAscYfvQMghv+HQstq4PB/fV8t7SHZ0k/n/jHeP7SsAv3jZPbgjuXFwdPWwoPQP5CL9rkCd+2prhr434b+6zwArejfuFAEN6cofDb9CfSfItRUhqn0v2XIP5PN9cwfN/rnY8ireCK+7lUbFq+bwfaLYdXTGcS+khMyvwi26vIrj/4bTq68Rar4vjPwLE3HmeEP6a5eaqi35xDdXFY3xBy1E6A80ZH517Nuck/NLZo2ndzfsKr3leyu0bGAEx8HhGfRXdd7CUietgvbDLG8tiWKxwEx+TMDQVpl3y2NXgq6I29/HJBUkVBk5osBwgCg5k42AIL+h0KcRtF/6Reo74Tp0k/n/iCj/1nwfa+5veyUekOrKdA/TmYPDvT/qWIq+geAoQP/e9A/lGvKmqq+8KQhY+vuevM9eoi6oid+QQr9z8pKiMBC/+u2aQg45X9vpf8j0X89nbdJQF1BtkrBjv6rKXqDVWRvaJ6f+1NV8/HmbYNsTBP6H+QK9Bw0zxz2xoQfMFYr92cv7u+vWtriu20AJb93epcTQJ/yiEtXTsHBhiocz8DBsxa1AawPOHrt44A0D6BOyIY14W++1O2PA5Lq4uKnPRHoFw2A3tf/xvD/UGiOOum/vkNuOjV4OveP8f6hxRXoHyezBwf6P2qZPPC/H/3D3skD0b81mxEZN28hxuWy03+d1+dTLnzlL7EIY+l/RnJtLPhC9A+0TSLmtARwl6hEEXXxxQbzdXlA+Y1D/onGmNF/jzdjKDoY9K9MpVfTXX3VVu/wE4KehN6yifjp9toAwO+VLnACyMNSfT5rXjp8zKkPKlWAsPuntbYNYEX5fR5A1hTNBnB7AAD544C0YCqSbhLrAXBhoAF9tmF0KbcHAGwVT78VIAyAam4M/w+F7lAP/Zd+cvqeli79dO4PMvqfBd/3mtvLTqk3tKYC/eNk9uBA/0ctkwf+f5656dNPDfw3rgIn/deUXjw9AAAgAElEQVTh8gT6LzF6IBfB89B/LnPZGDv6B/+qFPYbc5/5IwAuYhbDsepeldu84Z0z0S927k9m0PwGIdjoM7ET29B/D+Lni+NkYyl/mAEzNKhXLVvOyBXYfPzsPE0oCHiTDcDMnecEOGwAUEi9zwMgApo8gDqSnuWjvUpaKqY6T6lPqvBX4bCWTSHyOOyQFR4HVGdu8wA4A+A7l7cBnLcCrPA4IKkuoUifDYBq/DkDIIb/h0ILqoH+6zvepjEAT+f+Md4/9AgF+sfJ7MGB/vOKYuC/1Bg9D0DfRmJ57A8wF4NG+i/B0J9+6L9vVS6G/ol68/Ss35PF9dB/F/enuxo3x5jT7AYJE1PxM/Gg/74zZ7oZugL0z9CI7mo5JvXX23fQ1usfyPqFWUNtAMB7FHI3ZGgVNb3dCUA7UZH7S4YBVLtsqluebQPU54/yqj8n4pY//nFAogcA5M+kmlK1c5gHAPxWceXjgKTqhCKDbIAwAMq58frfUOhyeem/9BtrOjF8OvT/KMb7hx6hQP84mT040H9eUQz8VxojJcnC2reTEQP/i8nr0/+U/30K/RcQfD2XYc1wGfonC/rov/bYHw9515Z65pB/vjr6pyR+1kAZKc3YyDWV8oc3wMh9XHlfT7p3e0pBPbjBBvB8vd8J4GE9JvviQo15MzAXTM9aywaIxwFJGxKZkNtWv3OZ9SuA74UfB6TXSMaPeDHAbxkAvcP/QTMAgv6HQk4Z6b++d/WfNbyA+8d4/9CDFOgfJ7MHB/rPKxqH/oFcxlUH/jejfyDXe992oq+F2oHAs4jLQYX+n2EmXizR//qyVCOzi9B/66r07p1IKlBbMlpmOUZ63D9ZSl18/BXvoi0uEVmpuNQaGSehh8d4oCbu20kd047+PW/fFdo2OwwA5EOMJc8Lzh/vwvdj671lRbj3kVTB2TZAXfyceLkTkFfa7AEQAdqJ4wAbAMjuGm8DGDwAenEMHgDbD8zKcnkA4NgGvrG6DVBntngArkaCdG760McBSdUJRfpuBQgDIJsbw/9DoWtlof99Z/xE6Rdwf5DR/yz4vtfcXnZKvaH1FegfJ7MHB/rPK5qN/mHkwP9O9A/ZKnOksvBiuJr+Uxfm+EJQp8x7QYtJwGfD6NZN/0VqXAaraX3oH4z0n199dF08+gd63Ykahf6riUTjx9J/8iUBOPLiIf9njTr6z79KRdzWXW+k6yjWU1GI0zUd+Knl3rP1ztq5vanJBgByv6lkoCplDe6prwumm0EeCYY+DoipenEboDyMK4sTjwPiCso2ALsNeG8FWP5xQFKNQpFWG+CHDIAY/h8KLSWB/uu7UP95wQu4f4z3Dz1Ogf5xMntwoP9Ss+n/EPQPAMn4WHxRdw38p4vkc/0D/4G4JL+Q/tfXrAhoWIE+ecVMZDBj30vpv60iHv3zmfWqG9B/NX0i/Tdy/zoJE2y2f9SJZyZiozIuEYf+XadtHaCf3V8MRNLz6PYKJ6FXmh+3Gy2XnlI4wq6wAbQp85wACeyiPa9A9kVLwP04oH3iijaAxQOo8sTjgFgzyZXqnOX0AIQiXg8A2AZf7wGAaANwvfGnoZpXasDw/1Ao1C1pz6nvFYnSL+D+IKP/WfB9r7m97JR6Q09RoH+czB4c6L9UDPw3NIZNUoZ1bS1dj/2h5mq8Hk2MV/6iMNMOylzL+Mf9D0H/oNN/50P/Nz7SkFzIbF778nRqRTSg/3yWiv7tRwojeHwE31+56gZd09qGWuyHxCu9HLWudIZ9jj1f/JlNZz6n7z4rm/6dyZVCTUrElGLa8YtGu7A6p2F6yo9vW92kdO6Cs7npszh5s+plyZqJOe+WisZvdPM+R0oG3DILhWfl3X22B7gTIiFt2dRUdFpVS7lEaaMWpF5q1C1CwbqR+9rcT6y2czq56lPVNcJ2ks7cmyE4obQpaxLaNtDvQl3M7yzcUd9sfwE48M0V2egt4XMGTkN5skv5VEZJNQql/ibOA+B6I+4A2OdOfv5PDP8PhXLlw//1XaW0J6RLv4D7x3j/0EMV6B8nswd3LC8OnrYWLv6hxsB/rTFKnj2sd8eurAgLFsQAgOeVxMSr6H++CqiyXLA9rZf+Nw/8Z9cpnn4u4DD0T8/S0D81a9ZD/8e94JfG9C0Tz0wN6J8uxaH/piPRSMrfU3ZUht/U+H5rgOsjKpmqVH2A8lBQTWc+EwcnJQPZDGoKgbTV4sL0fIdH10seaB2PA2KCbaeYq90NUB/NyDOAanmFA2M5sWL+zFojJ2bsX4zcp5MnBUxw5gG4Mmv9I68Idu2/8XFAUqVCEfMTgX7FAOh9/k88/T8UGqeD/ks/G32/h0u/APp/FOP9Qw9VoH+czB4c6L/SiugfiM5/+sB/ttQxd8xjf/BkBexmUyyv/OXRJL66ddN/A0Y3I+Ad/ZORzV5OvRlY849H/0BvTuIaZKYTSzGJ/iOYYfYnzJaPPJ2596IT/ecLwqUyMkP7MWUg+G1IxRV5zTnmFM+D6h3XCQkvOg1d/lY/xwLKS0ug0QbIZhEZuJaIEysU2+EE0MQ2D6CB8gb84ldfGx8HtM9ayAZgTZ0lPICsHZoN4PYAAOY8DgjEFcHOeuPjgPR6uSIGGyAMAACV/kMM/w+Fhulf1Bf/Oo/t7+D+Md4/9GgF+sfJ7MGB/iuNRf8wiv7PH/jfg/6B3ABmD/xnWgLE5TZtnLBJ9utp5bJ9Iv0nr4mJ4mYKvNN/My9upP82a+HgEG70z8eMeuYP+Om//bE/PP1fb8i//LUb/WtMjFIPpx3CeG8FxevJje+ZMn4JtXRX4F7JPSd/ak6e7DtsAKDpOW0DkFO0sPJoYzkwU1N0DyCbb/cA5GCUlsuQzbraBniiB1BUZPIAoO4UKXjD8UZ3oV4LqkWkzhLG9TtvBRBrN/+stFR2zXgxwE8YADH8PxRaRCz913du+Ff2Du4PMvqfBd/3mtvLTqk39EQF+sfJ7MGB/istiv6B6P8h6B/2dedLZWG+MJ/+W9E/nqag/6yUm/7XV5mIVBgY9GPov6WUQOTbEPB89E9nQ52J1oIZmrPbHjvwr6yIzC9MpKcbhvzLXy3oP5/OlbUZHopGEflm6PtLlsDIA+Q6/XbheYZpoclx7qoNIMbIyTXgbpjY6QTIhFqG9XYbQOa85AFyHRvAkLDXAyBrMXoAXAvXfBwQiqS2Un4wPlMFkwf8HoBYu88DEFK5NPZWgDAApg//hzAAQiEA4Oi/8+j9Du4f4/1DL1Cgf5zMHhzon9Ki9J/qtH+MaOqNA//pUiigif4DvrgmkgwY+6/z0xb6n/K/99F/IrLtsT8ket6nV/sZqm2GgLHon0god8WAx/4wJIakJXb0T088M0k5r0T/HYcqk9ozcEQzTihnsvvZrsANJxbuEhnGrY40M22AsupSduZrdwI0DwCAWahzCnEk9nkARAB5lkNMO2ZdZwM83gMom8T7HB4PAMD8OCAlzL6YUg84PQChiNcDAHbZV7sV4P0GQO/wf9AMgKD/oZBBBf3X92D4Z/UO7g8y+p8F3/ea28tOqTf0XAX6x8nswYH+KS2K/oFYBTHwn2zJtyCOIXpPSpLBhl76X1/kWiHv+If+A0f/m+0clf4/FP3Xc6+n/40ejzy9acg/EOuU3vDIN/260L/3PHAI1mfyWPeJs1H1EzWpT3rSzjufmJSZILk32QBALeNwJ0CzARo8AKiPWvxXygMAdpszwmVjKTzLAKDHegDc+doCHgDU3SEFbzje6C4Y7B/3rQDvfRyQVK9cqrQBft0AiOH/odAFOum/8/j8Du4f4/1Dr1Ggf5zMHhzon9Fs+j8K/UMM/GdacpbVWmIwAG586D+wFKERCicQUMZA+q9w5KJPlO7V6jqTcB6DkNaF/vGU9sf+NNB/s8GjTjwzSTnHov/8M4n+qwC2GVaNw/panvawn9Wz+ufGCwgG0++E+hIboK66juemaBOzbD4PQGoJ2ncLZF+shUHt99sAK3sA7PJe7AHAubJ0D+CTlvwRnQWtbsdvPg5IqloutdsAYQBo5WP4fyjUp3/553/VQorf0Tug/0cx3j/0GgX6x8nswYH+GcXAf1tj6CRV2J30v7x8JpIYnvu/43IhzEP/7Qw3VWW5yDPtg+j/UPRP1JjnFtL6vIQO+i9Ecui8nMuuYoex0TrkH4hl6UH/UPdwjf7ZtcZUQUfY1HwKepcZcO9Z7WXs/kqTYBHEb4mhcXZ1HOItgY2ZTn2WzskGOAGyDdDjAUC5l2n2ANTMxCx6uuf8nZyueQCGJBd5AK7mFetxhgcAYHwc0CdUsAHicUAGNb8Y4OUGQAz/D4XuFU//8W/nNdw/xvuHXqZA/ziZPTjQP6Ph6B+qpV5z4H8n+gdySxiB/qGD/kNx4UwnORvAUtR46D+KUfZaTKkypLZMJqF/oWAX+q+2qEkP/edwOVmLNPGsU7KgbFMuRP+MY2FUJz72Fr+SVq+vSb0xMO3wo/2ksxYDps+o7iQbAHDXj3UCMJ4WTwerrxLbZTwAqE8K+K+0BwBUt3DZsul9NsA4DwCY9su9xFVxpQeA403Bn3CfDWAm+PE4IGvVov4Mqz9UKeh/KESp2O29hvuDjP5nwfe95vayU+oNvUOB/nEye3Cgf0YXoH8YR/+HoH+AphsI6qtFDTgKtSsBrQ/9h0HoX6luIP0nLnjH0v90/jHSf4uj46b/50INof9XPO6fLHLhQ//p9WtF/4OG/NftyQNU9A/ZSneif+LX24OAr7QEwg9AGtghnamSP4nlODl8jeft5D7DeUK5bfuXbSOKVGU/5vYm5z8/p/3rhmqHrHuKbFDlQROrur7N3FKxs9iqhOXXlB8tieBUtPk4xG4l2edr+bSFOJU4Orxe9+RSw34IEGwAvuC35BkEaaNSbVTxbHoq+irhxpfFE7fgeIWm+nhsLQvnBrlvuMyqL5PgpisLnj7HKuPP9Lt5ANlavLD0kvLTv1PJwQt/GQ+A6uEjB1N7okE801FCKq8+VxZeG+DNdwD0vv43hv+HQn3Khv/jH8truH+M9w+9UoH+cTJ7cMfy4uBpa+Gun3EM/Lc1hs1ThplyTn3oP5zYlE3ybYCQ5xj7L+JRif5v+Rc9VZbN89B/Pe2ODazUePpD/5WWa80j6sqrENLy1bH9g6e3P/Sfj/TQf2LVVFOgWF9Sb5un0Nv5Nei/dSOxqqe4pWxn896nGR0i52w+Zl5zUiLXkgyfy687165+uokILrxmY11A7YLJnQFRUJySN6auhV/kqiBZC3HY3kBdUj6Yy89nQNM95/hoSom+Lf1cTq/6Sulqij3XU4go720KGfvXg6HudGXBN5C3k0r2J/PE44B8tVf6XQNg9vN/gv6Hflw7/S9+Jq/h/iCj/1nwfa+5veyUekNvUqB/nMweHOif17roH4h18SMD/6GP/mcXyHQSC/ovIpkGVL+dsgmN9J+8oiWKG3M+mP4vh/7BR//Lz6xRJD/03+wu1C3krSnbxqDkybriAvTvPY0chZjteWa7FGPVdiSZtwius5TZ1c4+HbHn96N/1gbIZzXbAPVXGOcEsI0xewCoID2X3K+NeBxQXQUxi54ubf4zPQDAa3yEBwDEJrGgBwDqqswUjwPqlNEGeK0BEMP/Q6Eb9S///H/zr6/h/jHeP/RiBfrHyezBgf5FrUv/Z6J/UFcQbgybpwwz5ZxN/+F7Aa5tzMoPJ0nt9NB/CdPXYY+g/5ZSnfRfuFAVCMRc9E/0g5Wwz3jsj9g8qZPNU6Qt3I7+8+lSKXHUf7MNQKonSccBVwp77imtZW88J/NIGSHg0GyOPA02AJT7xeE2AF2ddG5HQ3mjBwDlMabHA+BTYRysOR/SWcZYG0Ci560eAJRbCJPwwR4A27CzRdJGQqn/VgBxm2GYvtMDEGt3bpOX2wA/agDE639DoXn60P/XQP+PYrx/6MUK9I+T2YMD/YtaF/3DXPp/48B/tmwe0PHQfzgvYLXDk4SeE8jtrNloBdxN9J+4qr2Z/rcN/CcKTqL/DehfyCaUsmzhS9H/44YVY5O0GGnzVrm8jP6JiUnqTDv6n4f1G4KXOdLdoIHg/gIPoGHdjF6d9FIaMD39daoNoH4Fat9KngVbXA1MqBU2jb7WR2a6kXYPgJpypw0QHkA53dowKFYNXumi4nFA/RLa8E4DoHf4P2gGQND/UIjR//mf/+/uJgxTjPcPvV6B/nEye3Cgf1Ez0D+Mov9ro38wMmKmAXpM38B/+F7TiZu0tl4sDsQs+m/g0QpA34pAO/qHtem/hP6FbKPQf7Vqbn7ofzGrQv/EerROqY4O+Zf70D+XTZX3jLQjXtprXECxF9SYpVYfkd6Z3pn9ghMXGsj6bQAmUrcBqokmG4Cdwp75sQvItCeL53941NdNmkunUmwAajOQIPJAG2BlD4Buns0D4FpYVKTtcFMdpwfD2PsAwGoD/PLjgIQG/KIBEMP/Q6FJeg39j/H+odcr0D9OZg8O9C9qafQPE+l/S55qA5g68B+66f9+0SoeqpSfj/jYn70NEv2vr09N9D9ZIu05n0r/reg/S+ZE/3xCoZRI/yU0z20qFDvJcZzZXfjerWKJ1GL4rbraEuzonwxuRv9c1ap6CLLx4KVW8YsewDh2P6n3vEfFnqudhmYc+04ezdMZjEzcbgNAuTJbnAD6h0RYC+LnrA38L9PlAQDTD00eAFGKq4iYRWVTyDWaEh6A0wOAYqVI645SPA6oX3UbwgCgFMP/QyG/nk7/Y7x/6EcU6B8nswcH+td0Af1fEP3fPvCfLlvH9I/919ojrx3L5kF1wndO9vn4HvS/i/4zi9CB/t2liEH6Iii3RA5+7I9eSpxSHRryL2xTi893of/m809yS24taJ07kIY/SP2LPLXT7AfG4ecO0s6orLHZBpDn5vvRtOGYBhvAOoUAuFbUjiG1gqfrr6KHQXgAUB8JL7cBBnsASsOyFBYPwNE84gBv9Q9w8FAPIDs1kbZtRvZbAeJxQJxQG15oAMTw/1Doej2a/sd4/9CPKNA/TmYPDvSv6VkD/0eh/8ZU9WUazZFNmQegf6pJOIPWnv7H/jCdcNavYNxqYsr/Bv03bXW3on+4nP5L3Vu+L1coxecRl0XcACoEj7tXgPVbakf/x2f7tk0FGsu2RHacmSwnte/Uxelc3mu662IPwJiEIfImG8D1tdUGAAGmq1Mo2r6hMK3NWe08Dm72AMq5ij9BTiELCtXJ2YzP3A8PoJpo8gCgWB3SWqMUjwMaoqMNf8bn/m0F/Q+FHqEY7x/6KQX6x8nswYH+DYqB/+bG0HmqMGvaawb+A9xE//eZAB3030ClFXr+E/T/bvSvLu/GRFLUvp5LNFJyF9JZKp+lrJFqdXhaSDVjz9aA/rW0toTiwaXhfNVURBvIL8xd2QCou9LVWkvwIJfFeqpGxXWtge2qs5m0/8bT9m1x2n9uCWDLAGU5F+rpoH3dPyfYCVxVKZHzaMznY93n3JSzePruKPdeTUcqbhHKz2fUls59rmHB0/ELJuamc4+W1ZgAtqoBhVCqfOnz9YWLZNWhWVX+VO94yGbspwAnw9+onRa3MdOrIxWNrMqmjToFI5qX8HF0Ozd2vXlbtsnlTWKCiwUxKes3ZoXSxf4CAI/jj98yfP+Sp6vcdFQc1UtXWvfzXgWQvQ2QtkR7AMx2IqRq1ueCZUvb2+4A6H39bwz/D4X8etbw/xjvH/opBfrHyezBHcuLg6ethdt/3jHw39MYPKFn4D9bHMXc/crfdvR/Tj+vrT30P1kilZx4+qvpv5+r+tE/sy094rE/hgziUmjrvUq4BPpXdxHuM1jDg3qaD80dp9ODNfXYbFlM9VTB1VdCsGVJ7VbBkH5Tk6QyDA3M36djrGz5bIvc6krRZ5Sz3kNTAUweXNFGxEgNzuLxUVb+uklzyZ2m9jggYWK9vrgahTy++wBwTscrAdC6sLWw/T4Ae1lA645f49V0afsspm9nvPP3Ho8DGqLfMgBmP/8n6H/oB/UI+h/j/UM/qED/OJk9ONC/QZPQP5T9sODA/yHoH4xomJFxu1r/of/a22KLK9Gg/3lLLqL/s9E/PJD+k6Sey8+3Tfg6AP3bK92IzImcJWjEvVCmueZZk45PbP3e+izxftBPJO6xW1wXKa1OgCXGd7Uk14Lp//Fhq6djVi58dn09kh8/dYsNgFplqGL/rHkA2uesRv5n1uwBlHMl34WrOpPPBggPgG+e1QNwGwDfcHbbEKV4AGCyAX78cUCvMgBi+H8odLHWp/8x3j/0gwr0j5PZgwP9G7Q6+ge8amLgP1WdpSJxC+977I+G/j8fsu0BzaLiU/436D813UH/G9A/O4sZ9F0/YWY2/ZfyJ1MpEpTTybXVzaH/qhb6A2Rv+rUuIzMr+0A3wLh3sh/1RhgAVtJtb5Vr7+7i1EMOQeqZwHxbxSELhe8J8Bcv0DBpA9Q4PoebHG2fbQPUSfKyQjDpAQC/UNoC7raBuCE22wCCB1B/1aazNsBAD+Cc2OoBANc/Sg/bLIobPABATZfW2nbGN5xWd98KIB3TvLcCCLYBW7vPAxBSNeiHDIB4/W8oNFbL0v8Y7x/6WQX6x8nswYH+bVqd/q+N/sHIhXld9tD/Hvrf98R/gI3oE5o7E5elw+l/xoV/hP7za0ei/y70Dz76zz70n+9Voqka/Se6VCTmzCpwDvlH2STifxK469A/7J1s2W8MMQCEo54X8Q9H//ZdtcAlnXKDfjmgra8m2QDGmIFmQLLYABWSxgScTU5/NkSabAD+K24Y6wfgRZMKcu38fuWh8AgPAFwk3WUDLOkBAF4XIzwAII76UzyAFgPgG85uGJrstwLE44Bw+jAATskGQND/UCjTmvQ/xvuHflaB/nEye3Cgf5tWR/8wi/435tHx6yfMmvyyx/7AjfT/M4vbqwiAOP8b9J+a3kn/70L/ODhfNUwpeuVKNDyj/6zTgD9T8dpaNjaYrNeO/o0LTpoZG5qV6khJTQaAsjHI0+0TBQ2B1MYYYxHjIjSAfjV5j5uy9dH84TYMKpJh7o2aWH4dYQPYv8o2gFwFZLtDFv0fnzUPQPtMewByg/MW1rNQKkST+22AgR6A1J5f8gDI+BYbYGf0QhiveBxQm95jAMTw/1DoMi1F/2O8f+jHFegfJ7MHB/o3a3X6HwP/P2Fr0399KajiKnwP+q/m76H/c9F/nWQ4/Zc6NvE039AkBMpNNYqtvRj9AxA5vx5ASaSQMcCp3vBsYe7pPZD6I/vedyD6bzsuNfsuw0G/0QNAaib+A3s10f+22ADZZ4Jakszd/rW2AZiqyVlWlN/zOKC8kaidcilUkJ5LLDKLhj02AGMk6Dss8zP3z3qksu/2AFoMgG+4ZA5p6r8V4NceBxQGwK4Y/h8K2bQO/Y/x/qEfV6B/nMweHOjfrNXRP8yi/4sM/GczoJhHP/QfADaiT1jSTQCHoP/s9Gb670f/wjWujQX303+5J4v82SrOZ3FFuP7PF9lWO70R1g24Bf0f3btRc1EncJUKMv+aBvgBgtQd8HD63KmOU5oBjoulFntYmyXQ1o0M+j/+3eow4qtmAzCzpM/CXNUGUAtWE6nPOLN3QbJdMn/y2uwBlHP7bYBVPACybDm91wOgm2fzALjmLfw+ABjhAUizXvc4oJcYADH8PxS6RrfT/xjvHwpBoP86mT040L9Z89A/ZB2yIPpvTNVMhHm9Y+A/qAvCFFfh+0n/bcQq6P8A+j8J/ZdTrA/9NyJ1YlaiS1noP9keIYm9nRej/2M6MjMo6E+3hJtiDOhE/G0n3kOQvX0vPvAoOryfuVmdvc1hvI3rDd5WGrIiUpMNUAN08jE1DfRc/irbAGLw8VlqDOkB5NUZW44XXOHU6KuEhvm3C3TaAM0eAH2KsYgH4LAoRnkAwG6Q5VezAfANZ50hg3QPAHQb4EceBxQGAAD0GgBB/0M/onvpf4z3D4Ug0H+dzB4c6N+sa9A/jKP/N6N/sIDXT9jP0f/2x/58xPPNoP9q/sH0n12VzCpoQv+4VL5emL5ycPzvVwP9l4k5ak/9QW0hV13G4m9A/2h61qpETVTkPSJbfm6uE+/EFJF3wxc7BA3yAn3vdHrVeBbJZSG4KKTgFnAZDAbA599iKVkbAM4loUA50VUkfJe/kpydcwKoDwRLZfPjxcE2gNbOrC4TF6YK1nOpTj6aZ6fq93gAgNaUqWw5/RoPgD2B4hNuqD1a1WYbYKfzQpimeByQRX/cJdaTTP91dQ//D4VCkxTj/UOhQ4H+cTJ7cKB/j3524P8o9A9GHCzql+n/V6bGW4sH/Z9D/1n3hTHAtImz6T/32B/uM9f55GN/qAy3of8qhlqKb3XlVzS3Qv8orJZ3lmVjI5dR5fhqUxvEmQpk1TOkZnbBdyPrdy2O57ef3DyX2Y+RBbd9T7SZzrHOdYvW4PE1b27azolwBnx+LwW93cok9XTIvhLV5WnTXmQ7F4r6cPbTRlW3lUtb9lISCkLZmdu3bSdVPXb95NKxBcsVtH1W9EYUzJYer9Mqss6cALZ6Y8ibTbYHvl2KtzsqLDuJOLsi1ScF3DZJr4Vyi6zKpo06x7QtKdE2rnnF0gG3glo1IGf6q3kA2/fHS/fYscOgV03Ve3Kle11kLUztifYA+A7hUgl6wx0AMfw/FLpAFw//j/H+odChQP84mT24Y3lx8LS1sM6PPwb++xuDJ6wy8B+sx0phW5370H/hsT8f8ZSzuJw3wKag/3k2paAtjO152JExNV2ZeMlD/1kOzkyn4hMXjEsZ25ZlVponLR07kWgMWhZUdv83oYlbFcM1DLS56pQa76EA3xkJRQq5DHJmdV9+wRG94bSH7nDDnqrh2se4n1STUz1pOpam7MNnH5H2ifmH+t+s4Iby1F+/n6kj0/5hI+KZz8LXqsjeto0OK+OlNmgLgrcRocH5jsT5OCDINwRi7v1BaaUAACAASURBVEbPIlvIRdb7EjpGOzvvuQ+A3Hq1vVC5+pTmtd8H4CibN4w+LSMnbsz0Kn4741v3pfE4IFmPNwDU4f+KARBP/w+FDLqG/sd4/1AIKdA/TmYPDvTvVAz8dzaGmBYD/7Pk4my+uAW+p+MfMjjo/1z6PwH9ozZX1L6epRN2PCvRpcTPVTz12J/881HK2LAsc0KZ5S1kFPpH1WWpUj2rjjRvk0wLxdMDdT8m7ISOWUISaR/GbcpqwfnHdbVbBrL+psufxrt/6ilGIskEbBj67zYAD/1r0L9BNbEM2D8wJJQj6WQS9WtZZMvrJZpUBXOVFp9xQsk/oD5nuzSeDlNfTR5APfdopMrWLbi83ndTMfd4AGTzquJXeACAOsG0os0GwDec3R7MstsAv/Y4oJcbAPH631CoXxfQ/xjvHwohBfrHyezBgf6degD6h2JNvXLgP5ukDlub/jc/9ocl3fTVZYz9p6fPpf/9b/qtp09/6H/SabjQpJqYFxNxhsTNZaur3vRrNA/UZnBle575s1Uf6lYVNWq/CH7pEvmUjyKCn2VXS/5Nmjv16K6f/Bh2QTbQ33gd1EP/uYm55O5FgDtVNkDazs9QzgL236JfhQ9AAPT8s2QDCJ/JWUXDyg2SofwSyicXIa/F2DzErEe9GdjC5dXupUrN9QDOiU/2AMRsW9k6ORiAX8V4+nbGd+xR+z0AaZbXAxCKcCdWwl6YLcLXfhQNA0Ccq3Rh0P/Q6zWP/sd4/1CIVKB/nMweHOjfqanoH2AQ/V8b/YMRBIuyb2/Ppv9yWdCRUDr+qYO5i2IdM6XzT9B/IYzcbHrQf13cSP/lPiyYcrZy81kiSSd6vuGxP7oNcDf6R/Wq6B8qAwDhGcvPp6L8SnGBy4hzfRLyaGyO0tCjPsFf9TrZifpOw1BKaMtwA6CeYlkjaf8P4LQBDnRe2wAZVSf/xStBoe0UEsVwnG+5sFD5hyPh8bulG3N+2KiJTP4NTWR7gMmTxfOAmPpKNJJMVQdYPIBqykgPQKqu1QMArlvEFlotCuL47fInslpMa9lsAHzD2Y3BLJMHANB4K8AzHwf0bAMghv+HQlM1if7HeP9QiFSgf5zMHhzo36lnoH+YQv/b81jQCcyi/2996D+QvLX6mvKPBnJEXiNTkRkgDvovhFELSK/R5gZz9B+RKAclT3QpC/0v4hOOJEvxc6tKK/TPRvItLz8TG4y8CBv+mtDErfp6TNz2nBvfpF3KNm/Za2lobJTEBz6MaEBDa9X+EQKGsH5LG2QNtwQ45Ww6J/v7V8IGQKwffaX+LRCzQOcBaBsg+yzRanV6+WHLq7MEc3UVnzUPQPuc7dEVWs0XrCPJA9ipFg/AUhH143U+N7/XAwC8CoZ4AMR+AbdN2/ttqDFat5htgO2M79vVx+OAikJhAPBzlQ0t6H/o3RpL/2O8fygkKNA/TmYPDvTv1zPo/w8M/KeTkGEjBv6DuN3e9dB/4AA01FeUFIelytKkmJiYzj9B/4UwI/03txYXJ1F1OYtYpwpZTnoplaED9dD/KgPuw4qto2y4Vbeg/6ydCco2czbA+SHlE/HbC5CMBoC8gzGgMV2oao1qEaWdRaxCxXug/x5QnfwYkgxH/660Q+o6lLL/sq8bMWsrYsD0L94YBOYOBEnPPyvAWshcfrB6AJDt1eSK8oRCg7XG73WZPQBUkJ4rZRvjAQB1sK+PhBrsLqc8xAOwF8TBvA2QyCDLTnXAfQBg9AAAIG2vfxzQgw2AGP4fCs3TQPof4/1DIUGB/nEye3Cgf7+egf5hCv1/6MB/UNea0UJY76H/UFzilTPoq0jP2P86J56Szj+T6T9RxY/Qf2ZiomMGPfSfe+wP95nr9p6H/uMPCWRSvzj6P75u32Up0P/GL4i8aEgG+NUyt63S1sZIPkGPxNcS7xWbZ91I/0dltgiz/u9/W/kVANw2AFAYXcHu1FGNprqWbMSsYR4ALoVzsgvO5Mn28SZATBUErHr/jnbYcv5qyioeAFm2nH6FB1C3zdQqfv1WE802wHbG9+1a43FA39gwAPgAMX/Q/9B71U//Y7x/KKQq0D9OZg8O9N+ka+j/gui/PVUzAtb0K/RfvW8AdEKUjn/qYHIFGXIeCW3Be5nX03/bAlb72KoUm00oO/Kh/0Q3ckXa6H9eykD/iTHyE9G/eNdCxvRT+ZUm/sWHE/3DZ8PL/yMXh5wiSNhhNMyyV62xLd+sgUXURfCeLLVNadZlrJ8TYv3Z18oG2HCM+u/+Yaum4M/nB4aQ5oe4erqQnG7JRpcqi1s9gLzZNIM2fd6LKMAafZU8AKgOD+iiREXY9UUMEaN7AFbOTh7gncPti/L4IESVdbyuoAj0mhNZYXaNNBkA33BlSzCr/1aApz8O6KkGgEz/ATQDIIb/h0KMOul/jPcPhVQF+sfJ7MGB/pv0uIH/96N/sJDWT5g7fzz0H5gLYfQ15R8NmF6i50H/3Q3roP8W9F+EXfjQ/+pzFU8B9PwzoufU3NxIwPnnoX+DaXEmQaw//5f4UD3zB4VtgBe8TfI+z47j25phz28p0lx1J/QXAvSfvJb5oSrRP7YBilkbjs+/QjU9m0ize/IDEEg9/0w4CgzE55vh8QDk/EyDFQ+AmpUVMTFiXLCeq2VjV4ox/hsz2QMgTyS1fY7DA7DT/B+4DwBGeAAgnPsv/zigP3xDHix9+H9n/qD/oVCmGO8fChkV6B8nswcH+m/SbPQPexctOPB/IPoHI//VdPHAfxA34Bsf+v+VaSm4q5nmnAwjFjME/f/EVHtavS4f+s9mKRwff2Uery9+pmC6yNAhW1kiYT+aVLTHhf7JStkaxWY3oP/j65ayzzv6z6YMQ/+oqdxcbr/irZ1MdSThZglFkLwHh3nQn5v7VtZPasvW+FYA/bQBHHcDbAApfX8kaAs5Smnk7cSy/7+9d0uWHeexNKGI33rMWdk1yK6snEBV9ijaKo76wV1yEgRA8CaR0loWdkIXEKTkcu29P4Dgrm/Q8c3a9uipOww2op0NWHaSnPq13aKrSDeIaKft/KGhGATb2/dHznFwYw3ZtnTq14S23w8w9uWSnPxufPrNPS9WMojupNpct/9dO/26UPxsaQzA6i56mLY9+ZGrve7k+7/ZwxP8G10Yst+Ev0s7Dmn2xerpc/vjiwHs27arYQD5llLwTUk6JVL61ZooXXx+sZfDAMpnGrp65gwApP9DUJ1K0/+R7w9BTgH9c2d+44br5cbDPoUJXw2XoX/KoeS8kPjPLOem/y1F/8kg3btkkwJiqa1Fz3duKDBio7l4vaD/LifnsDTLnmV/KP1ktSbaPe9a9oc89F/cTg4KT6wxZmPk4ZE9abKnG7maP+H286S9xlp+TBW1zd7YdoMXajv+S7Z3fipYGIDiUyRtxLu7YckPSj/8tpwHcxhH2122FEebtVSGuhv20qkIe2uWyu5unZV/hxBGmN0Vf8VLfyxJNhLHNY5E5lPMA5B+w3vkPADScLzQ9aPKAS0ZAMDyvxA0Qk76j3x/CCoS0D935jcG+q8VEv+rBiMc65L4L/vRLB9d9J9EtvsR/2txS48Lu7bP6Pj2cwr6b3SaXCDvztGREDDgZlOV/QmuWofy/O7p9J8X/TcCBuZB67qya/yKw05Zv3jwRP9EtMfon4Jt8OWPev283cD0r9IW/EfR9s5PJesDU4Ta+W4K1nXsTvws5/X9YwB6Kx4DsAcZH7fiB5JPxACCg5PFAPzlaPSBBS70MEBNAOBrrj4D5fLGAIj2v4oB/ZzlgBAASM+C/kNvlIf+I98fgooE9M+d+Y2B/mu1DPqn3weHxP+v5aOL/pNBuuW/EFH3X/E/Of3Po3/iH65B/63eO5X9Ianov8jiu9P/W9B/+K+I/s8jF9T8gaAbpYQBkvWBSZgNwP7Vdil4wbgIPo8BUAivC2MA9P1C785WS8QALFjcGANIm3SMAVjddYoBiMNLmrv8ezC0a1R6ACA56A4D7D/7Hn89+GMANVMBjLz+wqkA5oIESi9Sk/UCAEj/h6DuMug/8v0hqEJA/9yZ3xjov0HL0P+50T85ya9Djyn7Q9lrmTr3n4iStViznheg/8qNyjfUWrXSf0cvnYr+a2V/tG3thlcU/RctGf3XYgC5U/IjMQL9UxIA+NCUgPJv4ak9aQVBDxBj/cFuEgbYIwPx33SjIgxgxwCyPcpt74gBOLaPJrUxgCygb48ByE3yfxW419399WO1vTgG4C9How8scKGHAWoCAF9z6zEoV/tUgFXKASEAwM6C/kOvk0b/ke8PQRUC+ufO/MZA/w1aBv1Tf/rf5MfDSent9L+x6D8ZpFv+qxC5/4r/Z9N/u7uE/ks0X2kyP/2XVyQOG7rQf4SSygIAqPkDvVh2GCA8q4UB7F2D5ouWjNdfFgOg4CWd5fjhm/HKGMDvp6hkyQaWGPSJAZD0Ay/9HeGaGABp9yRzS/PA3YOhXZEJPQCQHHSHAfaffac/gF5SDmixAADS/yGorxj9R74/BFUL6J878xsD/TfoAvRP1In+I/FfNF6a/vvuvwe+b+c/qbH4YWk++fFtk4/rnkH/01al9L8I/af2IjT/7gb0XzMTIT4/3pX+78kUE43+Z8G9Ns5x6P88YtT8AfqHHi/G+oNdOQxAIrsP/tV2KeHsHWMAyinEAE4tHAMQ28bH4/uv31LPWgXm73/OckCBCz0MUBMA+Jpbj0G5CsoB6WGAycsBIQDADEz/oP/QsxTSf+T7Q1C1gP65M78x0H+DVkL/1J/+Pz/xn7w/f6ct+k8G6Zb/EkTuv+J/YfovfaYG/Xe4KqL/8t2ejf5fif4pZPqo+QNBsWL0L4QBUkzvDANIx3ej4ZAYAPGfQ9fHAKRTQRMFE0selogBuFD77wj/dcfVNj7ujQGkP/zlkIOOrcWHRx2SHgBIDrrDAPvPvt+fRM8uB7RSAMCm/0S5AADS/yEo0P/z3/8X8v0hqFFA/9yZ3xjov02X0f8J0X+Tq2rm69Njyv5Q9lqWzv3X/jh6Hf0X6EIZ/U+X/C2i/3ZfEg2fhf7/drvTf3NRYhv9ewIA3w3U/IEgXWIY4PMiZ8eJ1DCA76AVA5CcCzGAtJXS6ZAYwDnI4CBiAOxISQyA2LDHxQBckwxyv9d6wgCBCz0MUBMA+Jpbj0GVbpkKcE05oOcEAJD+D0F+/Y///r/Vc6Pg+9ekoe2QfiGoTkD/3JnfGOi/TSsm/k+B/slHSKmS/r+o7A8h9z/uaRj9T5yXhEkmpv8ilFA5PlFx0X82tkb6b6H83vTfn/Wv9Wig/8+/+xZsB+j/OAL0D0FfxehfDQPQ8crYgveUxfQDb3S8KXvFAMSOgt2aGIBuEGwjBpDxUx8DEH8tbYkBxM0b5wH8PLiGpAcA0oFlR0XRRyx/OrV6ajmgf6nmD1Nz+j8EPV+jEHzmy4V8f2gtAf1zZ35joP9mvTnxvy/6Jyfw9elF9L/oU3Bdi+LQh8gLnarNQf+FVn3pP6NDFu5nuwPov9a7Qf+FjVr6rxX93zfhYOxERf+eAMCHjhx8fwuPM+4P+g9BdHwjwhjAsfv5Ju7bcYTo97a3f4ieTfbf7rbRvsenQs/7RtsetvrZU2imbOxRvxt92m5Eu9WWvgP7HNMMgu3te+FHd19zzV5ytbG+UkkezksUGp5XKhkEJ7ySm5zXro2Tjk+ZNxQHLHS17cmvJNpdOo7HN7PkWs8Hxq3t/C6IDaPj2+9QeUda/wN8fn+RdoYBtj+bGAMQPriPPkeld8X2R+k0fcyOLk5/yaktjQEsMwMAy/9CUC9F6f8Nv+Ij3x96m4D+uTO/ccP1cuNhn8LkLw4k/jcMhh/omPivehMtOxX9J/3Zvr3oPxmke5ds5Lw4/euZMQ7+xHS4/RqnB0H/bSc2/dfv3ovov7bhof+Sq47onyiu+ROaNfx+DkGP1Xb8GwYDjn/3LbGh45XKTpHQ/OdHtCfJ4bHBm3g2ooaCT7HVrvnk28KP+d2wl04dfcm/MWi7yW8BbHcXz/KxpbvSEaVyjvhbAj8iEVzR22+AVr/aL2Xsx532K1HQvH0ewNeJa0j6h5sOLDsqii5Q+Ezb9LByQAgAfM6C/kNv0Y/+j0LwuW/TTf1CUIuA/rkzvzHQf7OuQf9ESPwv1pMS/yl7Oe4PwgPft/Of1Fj7K9WFzhes+593Dvofn+1O/8MRXkn/A4f8YPBvH/R/7KLmDwRVKmT3Es3P1AUy2moxALZrxwC0toqBHAPQW/EYgGh5DjI+bsUPtI4UV0JzSn6sCf5V4twtBiD+mjJXDCAZoREAEJ07fuvNlgMKXOhhgJoAwNd8Fw626knlgNYIACD9H4K66H/833rp/5yQ7w+9U0D/3JnfGOi/WYuhfyIk/qvGc9P/LkX/ySDd8l959+f+k8C+76b/uiu7odT2YvqfW/I3cWX1C/pv1Pp3of/Y7Yn+j92I+4P+Q5BTCv0/d3f57C43TDyoQD+MAcQHq2MAR9s9Yxx2FB4ULUOHrCPNXu3IBYjPI1fGAIQmaS/OoWpmv4NNMYD4tyTxVwfduTyqzA+MR84DoJIwQHEMgHSmXxgDMHr5xAAQAAD9h96iavqPfH/onQL65878xkD/PbQY/Z8b/ZPMRuu7eBH9L/kgPPB9O/9JjbW/TI0RBn/aesIPkecs+pfaPor+Z+r4J0fWq/u/yW3Xov9+9L/HPkP6fx5JwwAQBJUqh/KFukBaDEBsTonB799OMYCorSMGcA4sOShaJj8AzLbiqMKBMWNld9fOsiElBgNjAOJvFjnenRxpigEQH606QswDsPWAckALBACQ/g9B7Sql/8j3h94soH/uzG8M9N9Di6F/6kz/W/3koerHrLKXnuifOtD/GYr+k0G65b/seuT+/45vv//5OPvXPhsAWIT+yxc+M/1PPMenLqX/MtCXN26i/54wgIL++Uq/4TbQPwQ1ykHzv9nQYQyAgiO6kyVjALxVLgZgOkEMID5SGwOg+Oez9quSEQaQh+oIA6jZ64fB+Y/VUeAwOyqKLlD+gNq0ejmgf2kdQB+B/kMPUBH9R74/9GYB/XNnfmOg/05ajP4j8d8w7pT4T7X0/7Ki/1+5rkjxmUH8mVPqQJ3on0D/e9N/2znoP5XT/7S7qJWJ/s+N1A8EQdUKv4/b8W+8u/EfVjs7dB7+bXysNtr36Ejw7/Z9TbCOpAH8dinphcK22/etIbY6X7KfgSUHhe2daDsu7Dj43Vc8Kz/Lg/vFbKTdn3XqMBxSYhDdQMuD2cTRKrkqZ9uoxbYnv7aoN/DbmH7t472szsemUNsfpRxQ5DAYTG1Hac8DfB6u/xCRNwzw+T08DQMIH99Hn6PSb+fbH6XT85ubdHH6i44/fAYA0v+h18tD/5HvD0FA/9yZ37jhernxsE9hiVfJYuif6FWJ/6pDzXjpsj/0stx/ih8MqdWr6X86wmi3ofQ/d/sU+h/sdqb/QhMf+j83Gn5vhyDI0sk6t2B3I9qSeQDhWVI26HiTMZ8UvCXDZYHPl8rvbG4j3j3a7laTY3uXDgrb4U+p4yBvqzY8Lc3f6aXdXTvLhpQY7MkRxYPZhKTfMyQ/8vvY6jFqgXkA6vUGFyh/QM1atBzQ7DMAWuv/NPYO+g8triz9R74/BAH9c2d+Y6D/TroM/RPRX//06AuJ/7b90vS/4rNwXZHiNoP465yWoH/KPxsvp//mZ1FI/w2F9N8KEkQbr6P/DP2z5kD/EHSjPt+y7fg30MYBp7QXH/7sWvMAiL7Jv8HBjZJ5AMZGvHu03Yh2qy0dA6Ng5InB7yDxuQWb5210Dum8zPiUvfvrIvks6LxGySC6gZYHs0k6ZsXPJsYAcj1GXQuHVf0+k3Qvq/CzLur0ifMAiPSUfNl4IyqcCqDMAyAqngoQdjF7AKBJzen/ELS0NPqPfH8I+gjonzvzGzdcLzce9iks8UK5Ev13TPyfBf2TREXFJ2qSxH8q+FNr8qL/5IPvm3K82Cf3s8W7nSS5Av23mujNZfqvtX0L/efIPvy3gP6H6P9zRXviM20IQdAFUr5uEav9cv3kXIj4j92yGAAF9hSaDYsB6AbBdlJfyNMquqvXxgCkIRi6MAYQjy5tfj45ok8K7rloFhzXasjE9oGprs9PKA2XuwIR4cBCe8+FePxXqagcEBFtf7bbywFNHQC4N/0fgpaWSP+R7w9BHwH9c2d+44br5cbDPoVVXisvT/zvjv5JfKga0L/s0DB+W9F/cl6U4lZr63sFecIP0SDU7gpjNsnfbhnkrQ/savrveTcmF2sGDBJ/9q3YtW3Q/3L6fxzZRPt0F4KgKyX+ihK9rsIU+sTIGQP4GgQxAPrafwB+iviFjT3qNx8DoLgjOq4jQ/OPns5esq1Cy+T+cUV9JW3Z2e8R1SFnsnLzuInoqyUGIHiTYwClf/bEQLwQj4cPQKFkbB05DAbT0BHrdoDPuIPCqQBiDIC030b1qQBqDOD0mPSyb3MHAMYK1f+hdwj5/hAUCuifO/MbN1wvNx72KazyWkHi/8MS/2l6+t+x6D/54PumHC/2yf1s8W6bzlutuDJr39Ni9N/hnJ3N0H/l5uTpv0da8z3oIjKbm/6zJy3+9/uZslPhxm/7R/9l9M82IAi6S9J3MEHSx4GUH8dHohgAs5FiABSWA9pjY9I3ooZKDCBp5af5+vWV+E/tRYVts/bp2Wx36RXJqdzJRyu5EmIA4oDZY6P1e37iqcJTmllwvOM8ADJZuSsQEQ4stPdciMd/rRYqBzRvAKA1/T9b/weCnqtP+j/y/SEoFNA/d+Y3brhebjzsU1jo5YLE/7bBCMfuTfynfvR/maL/5LwoxbPW1vci8oQfokH0+oMv+WMtg7zVhqPpf58jZfTfdm7siun/mv0ByhKzB9F/ZhOdSui/2HAQ4YAgqFTibyzCu3aPTqTIPniD7ex4GgMIDH4xAIqNSd84GtL+eRHuwqiSVkIMQLCUFgPYw3e6cg/rFgPIGuzUdzEA0lh8OtVActUSA6hQDMQL8Xj4+Zb2+9x5AEQLlAOaNwAwVkj/h56r//j3/12H4JHvDz1VQP/cmd+44Xq58bBPYaGXy3ron+htif+qT834TUX/yQffN+V4sU/DsAviDNdiTTsTOXI4mPjvZnVI+Ye2O/1P7mj7wr/RrmPhX0PRjXV8pjFqB/3n9D9tDkHQPJK+lWoMQDsQsH5rSQBG2E90/kPwBTEA+uBISsr3Kxs8BiDfjWsXA5DuZeytfwxAOeLg9eIlW/cz53M/rOxTmllwHPMAnJq/HNCkAQCk/0NQnf7j38WFf3MRr4a3IPL9oZkF9M+d+Y0brpcbD/sUFnrFXIn+qV/i/8zon8RHa83Ef6ql/zcU/SfndSmes5DX7NQTfogGYbhtelRuoP9es070X787DvqfeLNlDS9G7ePp/8Yh/rmhNQl2u9H/cOP0c+wK9H8PhgFB0GyS3pkbf/dv35cCMz6PXB8DoLOtLwZAwboGmll0SckOs4yb/ywvXhDY9u9pkvYi+iElAdzq8etTzRzPKQbihXj8fDIr+hXz5SOHwWAaOmLdDvCZ9DF3OaBJAwD3Cun/0KKS6L8eMm74UwH5/tD8AvrnzvzGDdfLjYd9Cgu9YpZE/0Qd6X8HP8mDdHviP01P//sW/ScffN+U48U+eReBYUfQqbiaMPdfaitKuKMd6L/vR4aL/kf3dhNaiTd/D/xHNi+g//txmTsR6D8ELSrtxw3/ERrEALQNTwyA6LckwEnAY57OfZK64Y0B0DEw2yzZkIl5egMRA7CPaDo/aPuUZhYc7zsPgHRW7gpEhAML7T0X4vHfoJnLAT0xAJBN/8/V/4GgFRXQ/8wTjnx/6NkC+ufO/MYN18uNh30Ka71olqT/70v8l33a9kvT/+oPxfcHXVnbrE8Gf33Nc+863x2Q/rziW+7r8tJ/SfJwU4f5TnNOhi78G+4WBnVuoP/ZJsFuMf1nB8WN7y7oPwQ9QtpPq+iMshcfzscA6EB+wUEhBkBBq7S7uhhAMljJvqoQ0DkSip2klsruHDGA3JH0BuqWoXn1JADiQLwQj5/PTF3XKbOOHAaDaeso7HOAT6mb5qkAI8oBzRgAaK3/09g70v+hBXXQf/W7g3x/6A0C+ufO/MYN18uNh30Ka71olkT/REj8z9u/rOg/+eD7phwv9sm7KMPEXp8aiBE5Mm9eaJN6JrJuQNpW7Ch1mLfJ3cPL6P/Po26T4vXIYAX6LzXZdmapbHx3Qf8h6EE6v+Pxu68gBhDvlsUAKLAPh6FtxLtHDICI9nxb6TJjHWM6nWttk+3FYwAJt5X8CAsCp/o1lEMG3JiUTyQ8pZkFxzEPwK+iGABR+VSA8nJAMwYAmoT0f+h9+o9//6870D++StBEAvrnzvzGDdfLjYd9Csu9bpak/0j899jPnfhPA+j/V74/4sra+m6XJ/wQ2WfeeL47IP1Jxbfc16XSf+GRlnp1mIlHTJovHCmj/7bzzO5G6W3cJXv5oBIWiltNQf/jf7f0uLjx3QX9h6DHKWTcgSKC++X0ybmiGMDXIIgB0Nf+A/BTxC9sxLsH0T5c6G0LCgGJdyB3A2eJAeTUOQZg9b4R7S2TAIg/mIV4/Hzk6rp+9DwAog5TAXqVA5ouAHBv+j8ELaf/+Pf/Sg8i3x96j4D+uTO/ccP1cuNhn8Jyr5sl0T/RX/+UJKjYrhZJ/FfdGvZz0//uRf/JB9835XixT6EXHZRXS3FVnPvv9l8QwBDbOsx6Lfyr7zoW/i1QWYvEGvQf9B+CVhajjcG7NI4BkPo9z8YAKNzlMQAKywExY0o2imIAwTU6YgBVhYCSe8BjBxL0Z7tNMQBunDbXxhmadZoHELVyxACkO/k7RTH2Ty2D4yPmAZAEyl2BiHBgob3nQjz+m9U+FaBXOaDpAgBjlUv/R/0faC2l9B/5/tB7BPTPnfmNG66X8l8WsgAAIABJREFUGw/7FJZ76SyK/iev+UPiM3Y5+qfV6X/LR+P7w62srcfnvhWg888gsm49T470N5Sw5W2bHtykg8624pE+9F+/NAf9T7xld1VA7z+onwX9hyBoaoVf4QBAxjGAYIeRem4axwDOs84YAMXGlGzEPq0YgMGX5fsQxQC+XaXDULYDexmzC21ZX+nZ/JjNAIN0RIHyyZglVzwGkBmteR9cHhgQL8Tj56NSK86sI4fBYJo7Ojsc4FPpaY5yQHMFAFrT/7P1fyDoQTrpP/L9obcJ6J878xs3XC83HvYpLPfSuRj9ExL/23Rj0X9SvguzFf0n42u4KzaOm1AwjhG5/8p9qMz99w3Mu/Cv5M13u2SokHG+8918E+lsFf3fhIbiR3DgsPig9GBkmmgbzfSfnwX9hyDILfZFPjhkHAMIagFpaP5o8AOZnP7HMYDAoCAGEBvIMQDi9vlJAL/RSDvMUtrmMYPUUtR5FaL9eWnS2eimad0lRwRuy3pxuxKvJexq2/dcYr7u83xC2LZi030eACmg3BWICAcW2nsuxOO/WTOUA5orADBWSP+HHqQP/Ue+P/Q2Af1zZ37jhuvlxsM+hRVfPUj8XyjxX3Zr28+d+E9j6P9XrqtT/GttPT6fkvvvpf+SIr6s9iLk5jtuBd816X/XhX8Lv8KJtdQ8pvCL0/8t3AX9h6CHK/06HwQvIOIHZD8NYoivImPh37jkToTyk4akb6QNSbUvWAzg2BA8p10weyKeAV3O6JOznWMAypEkBpBV3rMjBpBTDMQL8bgG3P29P3ceACkRDtO+ZzmgZQIASP+HoFB16B/5/tC6AvrnzvzGDdfLjYd9Ciu+epD4T49O/Kfp6f+Iov9kfBl3xcZxHwrGMSL3X/FWX/ffc8ncRr8H6VdA7CJ1mLfJDfUO+q8yev9BZYPfN9V+VvofHAH9h6BXSPxSc9wagHtSYgDHblQxZo9thsQAhOJC6dXIr65fK/diAJoNxX7ks+bYZKreMwYgBzZYL5KfqqV9c3EF6W5EZyl+DlPj4DjmAZTqxnJAEwUA7Po/w3tH+j+0jv7nfxMW/rWFfH9oXQH9c2d+44br5cbDPoVFX0CLJv5Pjv5JfNLuSPyn1el/46fjujqlC62t7455wg+RvcdtTRGnTdhyN5cgg9KR2NZhJh4xab5wpIz+Z50bZ8vpf2KZ+Rz603/p+Fj6fzbcw1PBfxAEPVLSD4I9gpHb952y//Z+G2kMQGTTe2EMIPRPwQax3Y3IKgSkbiRXfJ797uS7ju0pQZ82o+dt540BcOU6IqJt33b7N6RsLxyIF+Lx8xGq1ePnARDdUA5oogBAk7Lp/7dGFyCoo/z0H/n+0OoC+ufO/MYN18uNh30Ki76AFkX/1I/+96kdlP65Kz5pE5b9oTISt0rRf/LB9005XuxT7ihgqb0k3Y363H/j+OlcO5HD8VRA/5NOqhb+1XcdC/9muwu9hf9rfGxUsu+xAf2HIGgyhZg70BcJ/04dMQDWJGX0e7wmsBAJ8MUAQgMKvAU+5chB4qSgEBC7/PQupbvn+L+7a8YASM7a/raSlxDIHGmNAYQQXAPiwfFB8wCIOCV3BSLCgYX2ngvx+O+k68sBzRIAaF3+t7F3pP9Di8hJ/5HvD60uoH/uzG/ccL3ceNinsOhrCDV/CIn/hQ4r6P+dRf/JeYFKF1pb301T3yFK83ty/w3WrEqJaogNPWad6L9+axz0P/GW3c3czN0+uKlmp3PlVLBxE/1nBuHGHn+aoP8Q9E6lpPU4cL69iD6viz06EUL5eJfHABhqlyi5FQOILcN/NzoKATGbWCrQ34OrMwoBaSNh46fYVbah0PamGMBG0U2S7mGF8jEAjxMi4r8FuH2Gz3b1AEJKHjkMBtOjo2E+zf7KYwBEJVMB4gdglgBAk5D+D71DNv1Hvj/0DAH9c2d+44br5cbDPoVFX0Pron9C4n9Rk6XL/hBy/2N1z/3PSSIeikOpC98dky4q6zxL/30/XKro/xaNUP6+R3u8F0/xn9RVP/q/icf70P9ol9N/CILeo/Mrn9DW38tgi80Y9CdO59UYwLdHoXy/HAMgffdHzzeiZDEAgfLbP+qOqwqh/EtiADniXzcJIK9skxCCa0A8OD5iHgBJlNwViAgHFtp7LsTjv5NKywERyVMBPOWApggA3Jv+D0FLyKD/yPeHniGgf+7Mbwz0P1Lr0v/XJv7LnrNNlqb/Yz6gdBRlbX03bUjuf1aCk03Yspt4Ltx5E1z+hdz8/N1IAL1J/4cs/CucFYdtzUsw4L4+jO9GLf3fk6v+HvfRf+aZbRwD4/Q/vIo9uTQIgp6q8Mse0Mc4BvCB+rGNRP+tGMCvSS4GQHoX6eC3OAaQtK0vBBQez4Lyu2IA1qCUcQrXonZBtTGALosBEAfihXhcA+4levY8AJKCHDn7jSiaCuApBzRFAGCscun/qP8Dza+U/iPfH3qSgP65M78x0P9IrYv+CYn/RU3eWvSfjK/nrtg4bkXZaEbk/pNwT1pz/3N0PqEWBa6q6X9BTOI4W0b/fyck5z76L7QVt+WDm2p2oLFcGOA++r9Lnn+nfvRf5v57ckUQBD1b7Ct/vP8+lP7YOTj7abMHGwnl/4Fm6awYA4jGI8NE7iofNiBnDIAXAhJiAOlI4u0AoptkXhpwQQzA4c0yEMdPPf5qSjrqEAMIx6aNMziOeQB1Ko0BEBVOBdj2+wMAren/2fo/ELS4GP1Hvj/0JAH9c2d+44br5cbDPoWlX0nr0v/J0T+Jj9wjEv+piv7fXPSfnNeo9FJB0j1+NQztdFv8mW7CVonUGIkD0Pvov3zEpPnCkWL6b1+L0XUp/ZeNc18N10hM+q8HA5RWJfSfeYjCAFt4ZDsNQP8h6OUSv/gcQwaUnPQYAClUmtkQt3TSfCEGQEdwQuw9Hqx+B5QYgDRUviuEDYLWWSifjQHoba2bZjQR/FoDdk0CkNRlMQDiT2IhHu8R4XjDPACigeWA7g8AjBXS/6HF9aH/yPeHniegf+7Mbwz0P1hA/7Rg4r/q3G4yN/0fV/SfjC/prtg47kbpaLZdTTmvV/fcf/GsdpfEA3YvLtaf+Kxa+FffdSz8m+0u9Bb+z3f/hV40Om9s8N3tCvqvjVz0v/MbgoV/IQiKpFHhCLf+ePu599uId3+FgMIufpYxcHei/3TMWwDc/U5ktxIbl0C/cSqIASiWomx7M6JQEQPw9RiZ37YYAMUQXAPiwfFx8wAoRuSuQEQ4sNDecyEe/101rhzQ1AEApP9DL9f//G//hXx/6HkC+ufO/MZA/4N1Pfqn+ej/SxL/qSv9X7LoPzmvUemojqSHfsWbpjS/M/ffA+h/pzaX2dnphfRfvzUO+m8FD+Td/AOa8vHo4Kaanf5FD7/d2EMd/f/53ISDh+VvMHvsf483vrtS6X9AfwiCmJJfsD/vj+PU9nthMYye7PLFAJglK5fPWLaG/plDm4AHGwWLARg03wDl/FTJYgDhCEV1jQHIZDn5OPJyxAB6LQZAfNiFeFwD7oX6IfLIYTCYTh2N8enodUw5oJsDAHb9n+G9I/0fmlj/+W8G/V+asEHvFdA/d+Y3BvofLKD/rysk/n/U/DWZtug/+Uj3phwv9qnZj8j9F3oJduoiFrlBxjeq7MdWyR/a5qEK+u+76ir6v0Uj1D6CzI+PzL2RT2ev+rTR6H/q6msv/egPAwZajIFtfMae0v/QMyIBEASFnDH+0bxTeOo4sAVNdnlXiAFE2oh2Cgy2sGcb67NW9roC7EJEh0R8XkJVDODXS2kMIByhzNbbYgBMQhfBgAWU7/sNelAMIH040ybB8UHzAChB5K5ARDiw0N5zIR7/XTWiHNDUMwAyyqb/3xpdgKAW/ee/8VV/F2dr0NsF9M+d+Y2B/sdr3Zo/9O7Ef9l5tsncZX9oMP3/ynWZSkd1JD30OyL3n8w7IzjZhC2PtDBJvse4ezkqxq284TTDSenCv830Xz6rPzZCtKBiI0H2W3rWpvyU3KuItEmuWhb+ZR2F/0EQBJ2vgpg7Ruh8i81KYwDpv+kYBPYtnWIxgDCcYLTN4ObjGq6PAfC2zTEAptRetxUHcPtiACQ8mJS9jp804F46hqfPA6AkzuGw34jUckB3BgBal/9t7B3p/9CsSuj/6mwNerWA/rkzvzHQ/3gh8Z96oX8SntjZEv9pevo/tOg/GV9YDWo7bkjpgEbl/v/R367VEYvUwGhiF//xXLKnVannUvpvO/fRfyFykCXv0cFNNdsP/6KH366E7B2DEWIGbDdL/1mTKAwQ3W2U/ocgKKPwhRDgxzgG8IH6sU0I9GPKb80DCDP3TwJuUHvNDwV8XBwMHSMx3FLsefUYQI7OS0A/UwjozsUAKIbgGhAPjmMeQIs6lgNadgYA0v+hh+qg/3iAoeUF9M+d+Y0brpcbD/sUHvCSWjfxf/6aPyQ+e7cm/tPq9H9YnEaS0lc1ST/9LpT7n+s9jpQUfDre6+pR+r+Y/occqegbUUH/xRHmfrbIp5MuBDMD64dN+PGNH7S/Bcw/JWR/J9IW/oUgCGJib4aTnrMYwAe1nzYK/VdIvXVKjgEYTtJWpLR1xQCESjgrxQBIV+ItEwPwc/lcDKDjYgDEgXghHteAe6FeMg+AqMNUgNsCAPem/0PQxHoAVYPeLqB/7sxvDPR/iZD4T8sm/qv+7SbvLvpPxtd2V2wcN6RmTCMo5zW5/6Tfq2xbz1VzhN2B/pv9Ohb+LXBeRf97Ff/hThzFfxIJI6eY/jP1WvhXGD8EQVCg9M0gUNagYj4F7Dml/1ohoG9fcfl+Y0hiSIDFAOiITKTRCL9WjgFEjLj0wlN5Ygbehp1iAOwCSWoVHMc8gEa1TwVYdgaArVz6P+r/QHPqP//t/717CBDUJKB/7sxvDPR/iYD+v66Q+H+q0OeqRf/JeaVKX9UkPXQtQW3F0u30mrr/srfz1GaZsbeoKxjQh/7rTRz032bT0m7+lmqBgR/Q35IjSRdaGOCg/xbxl5soVzd04d/QrRgMgCAIOiX+unW+yM+3HwVTA9IYAJlUVzx14u/Ug431fwfjGADxtvlJAFQbA0gUcPotuqdDYwCGPEC/SyEguWG3xQCIA/FCPK4B99IxnDnykcNgMJ06GuPT3XdVDIDoOxVgxgBAPv0/W/8HghYU6D+0tID+uTO/MdD/JVoa/RMS/x9K/0cX/Sfjy7srNo57UjGmC76AfXL/HTbx7Sq4LvXjjkYuPWNZ1wX032peRf83CkeYpfzHdnJRuTiZeNS+8D35N23CrnqPjgkeuiz8uyf/QRAE2ZLeXTuFNDKJAZDM1s3VgONJAJ4YAAW7wcGoFSlt+8YA2O1KYgNBkzgGYLQNb4J4Nqvz45CDB9GBikJANy8GQMnzRlLD4Pi4eQAU83FXICIcWGjvuRCP/wGqKAdE9J0KcE8AwK7/0yqk/0MLCvQfWldA/9yZ3xjo/yotTf+R+C/797Ramv53fGhdV6p010LST9cjcv9Jv0WCk03Y8rbVgyXZtmHD2r8RpS+X2aB04d9m+i+fNZ8cIWBQtxHtlhT/0eMBsgeD/rMmURgAC/9CENRDDGcf+lHpL4w8YgCnmUjVPWzXsLGxfvDvRrRLEQUmFcZrMQCtoTawYFsOG2SJuR0DUCIKZpChRCssBkAciBficQ24l+sbA4gcBoPp1tEInyXdV00FmG4GANL/oRcK9B9aVED/3JnfGOj/Ki2N/gmJ/4PQP3Wg/5MX/SfjK6zhbMc9qRjWqO9g4HZs7r/RsKT4j6tTT6TEPlJK/23nPvovRA7MhhL935Ij0camn/rRL4P467hfihmYH2vqVhwYjwRg4V8Igtp0vjESzvp7l2yKWQLfN8pNAgj7Fdf1DR2KpPh3cCOyCgGZuf9SDMAB+o1TRwzAXAwglW3gaf5RnssX/xJ9/2IAlDxppDwSx3HMA2hXRQzghgDA2PT/bO9I/4cmE+g/tKKA/rkzvzHQ/4Vamv7Pj/5JfAiR+O948JD7L1kWuB2S++9QHC9xY+LqJ7mU/qfK0v8AIZV9Nerov9xF1SeT9CJEswxAb40nOXX42YJt3kW4EcYkUvpvXAUEQZCh8I0RcMc4BhDsiWT8YP2bFRGOkX0aA9A2wn9PR6JN3FYtBMS2z2vlNL8sBnDsliwITPFNE84K8Ynoo9Hd5mMAXQoBSeq7GABxIF6IxzXgXjGM18wDICoIA0w3AyCjbPr/rdEFCCoV6D+0nID+uTO/MdD/hVoa/dMK9H904r/aRbbV3PT/gqL/ZHyRd8XGcVsqhrVS7r9mpt2xEm/Whx6NP9dDlv6n6f/BKDL0P9sdiyWE/yuh/1t6Krexiaei3criP1KrJK4j0n9mwDY+fhj9D92KwQAIgqCs2HtD5qtb8PYMuGQKKFNqrzF61kQ8pfjc6CgElDoRBm3Z0B5EOBpiAL++SmMA4Th9hJ2Pn5xcfsHFACi+QO1ig+OYB9BF/qkAVwcA7PT/fP2fxt6R/g/NJNB/aC0B/XNnfmOg/wt1C/onJP5PgP5pdfrf99F1XazSYyNJ16Q0nyL3P0f/k1MJJnY29Jm57kmW/vt+MAkQ37dbdldV+r8lR5ImWoTgoP8W8dciB7asj/74Nw0G/E5h4V8IgoYpfXuERDu1TBEw0W8SgMrx43z23exFDAnwhhtRshhA2lbk+PzgfTEA4z5QgKqDVoJxNZeXFkLINcn31X0xAOJAvBCPu8Mk+WG8Yx4AuWMAS80AQPo/9CCB/kMLCeifO/MbA/1fKKD/nysk/qdqpv/zF/0n4+u8KzaO21I3stHfx+G5/6y7yN6k/6yhdwyFt6uM/vdf+FdA+bltqUnVQ2Jf+578q2xsgn3yye6BsRGHiMIAWPgXgqDBkt4hMWjeopdjAP2zsD6wyS0GoG2IvPgE9xphTwsB8ebW9j0xAB8Z5zGAz08B9lu/wOXNXw2krqdYDIBiCK4B8eD46HkARF847gpEhAML7T0X4vE/TJ5yQJcGAO5N/4egeQT6D60ioH/uzG8M9H+tQP+/flZO/Je78LTqmvhP5fR/oqL/5LxepcdGkn56/+N68RZ/3OKNEpxswlaptJBJpuu4oXGBER8v+eEiubqY/stnzYcnEzBQNmTsHu32KP6jmZkehA0eCcDCvxAE3S2GYpON3yQAMQZAQsNMDCBsEvwbtZLc/sajuY22hXo4l8YASP/lYD8vRjHQ5IkBrLMYAHEgXojH7ZtcOpIzQX5LBtOtoxE+ywdhTgVYagaArVz6P+r/QJMI9B9aQkD/3JnfGOj/WgH9f/2MXDl22sR/6k3/Fy36Tz5IvSnHi33arQaX/u+Z+69ZWgi4x/Omm6kPjNHEsrQWeRTc+ui/QM/Nhgr9z/3tFtpnwgCStCaaZUX6/x5sHAGJcxcL/0IQNFDSm2SLDm8Rg84i+9T/FuBmw9jG+iwG8PnHHMPGLq5vDCDx7I0BaDJQb+CBXxQR/UkmAUjKxAC8TZIROq+upUl4Z7S7FBwfOg+AAjLuCkSEAwvtPRfi8T9SRgxglgBAPv0/W/8HglYQ6D80v4D+uTO/MdD/5cJiv18/r0z8p9Xpf/en13W9SqftJP3jfa3c/9IoyODiPzVfBAsu5xb+Lequjv6rz5V0J7PInhnsjvR/yblwCdkBa8NjIQ1G/0MzMRgAQRA0TuELR6P/2iSAn5NcIaD4VLSRnt0pWwgol/vfFgPIhBxiUM8aUtQ2V6KHo2pXDMAbdXAEZniTfAxgxGIAxIF4IR434ivletU8ACIhDHBdAMCu/9MqpP9DKwj0H5pcQP/cmd8Y6P9yIfH/62fxxH+1l2wrFP0/O9JO7IpNKfX2j+QBuf+k37ds27ChhyOT+9uke9Pb5+h/thcWSwj/V0L/t/SUg/5v4qlo16T/ehiAX8IRS+DGe2AvDpJtY+FfCIIulvRKiSjzFu1lIDvzHEUCYmSfxgA0h0lEQYgcaDEJ5q0iBqBJchWEDTKtVZ+khz0MOWIACy8GQPGdMe7ScRzzADoqnQowxQwApP9DbxDoPzSzgP65M78x0P/lAvr/uULiv6hyt2sX/SfnJSudtpP0j/e1cv81WeB+s2yc12Wg/K6hC+OsAPF9u/kb66H/oRvtIRF92iP0NDEs63waD7n4HwRB0MUK3zwarE8nAYTNN6kJM0hPsePBvxvR/qH2ZhwiIPKJT74tlMThkQZteMG20GOq+Gyes39iw3/t0UVl5YkBdCkEJDfsvxgAcSBeiMc14F43ktfMA6AkBnBRAGBs+n+2d6T/QxAEKQL65878xkD/l+su9E/z0f/XJv7T9PT/sqL/ZHzBd8XGcXPqBrdY7r/POL51BRfYufhPVYqbhrar6P9G4d3QPgsn/bdJehb3798hRReyO5oQkVb8p2v6Pxb+hSDoOkmvl4gyh/nsIYjUAT2H/t+2cc2ZE+WLQzJCAr+GG1GmEFBBDOAciwP0G6eOHjNsXZUD9Qo3rX0xAIXsz7IYACXPHkkeguOYB9BRYTmgKWYAZJRN/781ugBBHiH9H5pQQP/cmd8Y6P8OIfH/52rxxH+5F2dDFP1ncl2y0m8Xku5u3iefTHCyCVvFTvhxT3BFbuhE+dXFf7S+RMgen6qm//JZ8zbmAwbpwbNhJgywRbvOy9GK/zBvosTxFD3PiAFAEDRI/tdLil8DkhuBaTESkF0MQNsQefFO0WIASltvDOD0FhzMtM2c0mMAsaWr2M6f7ZwEoBi8YjEA4kC8EI874isFI3nTPAA6rveKAICd/p+v/9PYO9L/obsF+g/NJqB/7sxvDPR/h1ZH/4TE/2wvnoYo+h/2pZ3QELbj5lSPb2j6/3W5/xb/NRmxs3fdbMBUe/cwfPRfiByYDRX6HzwnCuKXn6SkL8GMBQOyt5RZSv/KoYg92c6m/4P+QxB0reI082BPpedEYSEgim00bu6JAaR+0lbp2IIjeY7/O9gWA+A3S+/Lloh6gxgA7+Jr0LwYgKSJFgOg+M5oQDw4fsE8ACLa/37FPAAi2v7MPwMA6f/Q4gL9h6YS0D935jcG+r9Jq9N/JP5nenE2nLvsD11L/79yXbXSbxeS/ukgvDSlec3nnt4xwckmbPVQHDsx6T9r6A0GBCO3Ag/WETU0oqD5LT1lq47+q49W7jkRUbuwO6z4jyYxqHD73/EQBEGnxN/rxBgAY68Ju/xxeZngO/LNbcLOYgCff5JQBOP1FsfnBxtiAPx410kA5IgB5DqS++pSCEjSoMUAiAPxQjyuAffqwfxD+1+nw2Aw3Toa4bNSNwcARqf/Q9C9Av2H5hHQP3fmNwb6v0mro39C4r+nI0/Duen/lUX/yfiy74qNB1tXD2at3H+fn7JL0oi80W+P4j+lkrs0OH78p3AR/d/SUxr9j9n6lhxJLONgjDV+k/4b3vagiRiTYNtI/4cgaCGJ/DGMByiwPjiYKwTEmqt+zoNxDIC1NbbdxgUxgOBOaGetg0UGqd6wGADFD6EGxIPjo+cBENH25y3zAIYHAMYu/5tzjvo/0I0C/YcmEdA/d+Y3Bvq/SVjs9+dnJPon8cmcCf3T6vR/0JPsumql614knRbM/a+49lmL/+jp/8KHIkB8327+3nroPynPiednWTIqwYwFA7K3lFk6fw0wQiAQBEG3S/wdLzq8Re/QFPofRN5RCChG9mkMIN2Q/UiRA7HtZ1SmQbAdhCiMGIAoO9qhS54EkHbXoxCQrIqFix0xgHGLARAH4oV4XAPutXrJPIA7ZwDk0/+z9X8gaFaB/kMzCOifO/MbA/3fpAegf1qE/i+f+E/FGG7pov9kfOV3xcZxf6qH+Jzc/1jxDTTpP2voDQYEoQsr8GAdqflOldH/jWSUn9mW6X+WoacGMtMfWfwn9rlpo2LbSP+HIGg5hfAxof88BmATfIMg21g/+Hcj2j/w2o4fhDGA1C3fdsQAtBFSYKyctQ5mbUYvBqCMaq7FACh5Dkm5w8dxzAPoorEBAKT/Q+8U6D90u4D+uTO/MdD/fXoA/V8C/ZP4cA5A/3JHzoZzJ/7T5fT/K9eFK133Ium0YO6/IS18Yo0haehE+SOK/2j+jSCKg/67/MTH8wED3UAG7tHuAX5s7s921eI/8W72I/bcBAiCoHsl/r7Hf8rFkwBSKM8cbspZVnPmRPniqLRoQXRwI3LHAFTun4kBuKRdac64YIXeIAZQOSqxuwUXAyAOxAvxuAbcqwfz9HkAt80AQPo/9FSB/kP3CuifO/MbA/3fJ6D/yNW7E/9pevp/cdF/Mr74Grx23KLqIQ79tg7J/a9z1fDz0WOmPkU5z65b5JdC/zk3FyzjUYnHxYCESP/zA5PMGL7P3o2f5SZ28eso9bkn20j/hyBoOYXvJZH+H7tRur0YCcguBqBtJBEFV6ujl54xAM76o10ezyiKIrgbylGT9sUACpoogZ8itdwcirG/+DEdxzEPoFEDAwBj0/+zvSP9H7pDoP/QjQL65878xkD/twr0/+fn9Yn/tDr9H/cwuy5c6b0jSXc0r/z0/2Tf/5uw5ZFvPHEE5djzhFK8wYBg/EW3KAzzOCMWRhOHhzL6rz5d8njYQd6X3NF1xX8sh6krCIKgqST+7hce3oK9FFPGgN6xGEBw8NjI0HypIwoLAZHqmV9RlxiAKD7a5kkAadejFwMoIvKOGMDQxQCIA/FCPK4B9+rBPHcewJ1rAFjKpv/fGl2AIFGg/9BdAvrnzvzGQP+3Cuj/56fvrUiexssS/9W+PA17F/2n5Lu2VtF/Mr7+u2LjAdb1wxlY+v/q3H/S72HJMGYs/uNX5Lye/m/pqWwxIvtghOPj4j9MjjCAZZm+KrW2bBvp/xAEzaksTzzfToyYS3D/R/Nlgp+pOSOc0iMB2zduq8DrNMzAvGnb9pDM4XE0r7n1sG8zBiDrJYsBUPzQag9wcPyaeQBERH//etY7CgYMcdLwAAAgAElEQVQWHHBdSGh/iUYFAOz0/3z9n8bekf4PXS7Qf+gWAf1zZ35joP9b9QD0T3PSf+lpROL/0UXDAO6g/1+5rl3pvSNJD2+R0ny63H9DFljfLAPnNepmw4v/GPGJXKv87fXQ/9CNOeZNOpiSeiHExfC9+N4TfTqL/9iBCgiCoMmV/EERvKGDvT04HVJ+C/qzg7lCQKy55udnE8cARFjviQFIKijTb19mly7oFwPgkQb/wMQeuxQCkhsOXAyAOBAvxOMacG8Zzz+0/50MpltHI3xmNOUMAKT/Q6sJ9B+6XkD/3JnfGOj/Vt2I/gmJ/18z0P+yAVxf9J+Ml8Cu2DjuUsso18v9d7eKb2PBZfYs/iN/VX19ZYvtlEr7RJz0P0vPz7bGR//dvaP4T+qWbSP9H4KgmZV/BW3Bi9gE/a5CQAKyj2IAIs1POgpa6TGAuK0VA7CJthE2iHc5mtfcegC6aSPHABoXA9B7nG4xAIohuAbEg+MXzAMgou2fR80DuCEAMDr9H4IuFug/dLGA/rkzvzHQ/916QOL/Kov9kviUjkH/cl/+tkvT/6GPtOvalQF0JelL5v5bxFzqwNPWS+TD7donpNl/Jv1f+9HjjscUNDEiB8wgwvFtxX9sy8RsS0+xYQPrQxC0rGS+vMfnYhwvxADsSIBBkDXIrsYAlOYJuLdiAN/dKB1eztDXYwyaH0GHfVlZnh6FgJS+llwMgDgQL8TjGnBvGc+D5gEMCQCMXf435xz1f6ArBfoPXSmgf+7Mbwz0f7eQ+B/5QeL/py2K/oudaic0bO24Sy0DfVruv3Vq6zAS3ezK4j+VMjpyBQyCR0XD6Gfb1CDpUXjODUbPxsYtpQ/3sOH0P/TPwwBI/4cgaHop78ad7Yl4XQO4aWzgdypeDCBE86ITUnr5xQCS1QX0GICq6rPxKX4hjYBbjwHId4yaFwNQNONiABRDcA2IB8cxD6BIV88AyKf/Z+v/QBAEvU9A/9yZ3xjofwIh8T9yhcT/T9veif9USP/nLfpPzstXBtCVpC+Z++9WzJdN+s8aeoMBwVUUfS4hpMlGLCQ/Zen/6SvCsFcvRB1MeFCl/7zt3cV/OPdPzCAIgh4gkf6fXPLY3YLqbnIkILsYgIb+pYhCawxAi098nN87CUDU0MUAdBw/7WIAxIF4IR7XgHvLeB4xD6B/AADp/9B7hPR/6AIB/XNnfmOg/wn0APRPSPxXNBX9f0DRfzJeCLti47hRLQMd9/0dmPtvN9TuZInPnsV/cvS/1X+RPB9ECPHDUxr9F0G/cdVGYEBrno8lKF0c2rTe92TYSP+HIGgVSa+jmC9v36gpw/2hBxYDcLB7humtGIAWezgSon+DM2MAZSV3jLN6XIFzecOtB6D7IHukVy0GQDEE14B4cBzzAJy6dAYA0v+hJwn0HxotoH/uzG8M9D+BUPOHu0Li/9l8afo/+sF2Xb4yhq4kfVTuP8X3UHCyCVt++cFxdGqzDJxXqptV36u64j+d0//j4wL9J+UDNVA7M+AjLEn/Z/5T+7riP6ElsD4EQY8Uw6w6jqfD0FwMIMnZF3vUmDslne70XRA4HV6xZ8ckANeAc5MAnF2kV9GjEJDSl3fMlufkyAWLARAH4oV4XAPuLeNZfB5A5wDA2PT/bO9I/4euEug/NFRA/9yZ3xjofwI9A/0TEv8Voej/CKl+d8XGcaPmfNVs4Te0a8SiqGF8M036zxp6gwFBGKPoMsNPPBuxMPyUKuvEoP8ix0+28/T/u2HSf3GXDpRPyYUYxX9SsR7ZaJH+D0HQWlICpcH7eyPahTCAAOJzsP57MFcIiDU3nR8NVST+u47927kgG0MbYYM0+OF06+XyQ2IAauBBH9WkiwFQEqAiyVtwHPMAsrp6DQBL2fT/W6MLEHQK9B8aJ6B/7sxvDPQ/h55B/1dB/yQ+rsPQv9ydvy2K/tty3QFlDL1J+vdeKc0nzf23pYVS1MFIDX1m9xb/GVj9Xx6MyyD5KezYsN1WWCYHt/RUugusD0HQI3XEXH9p+5QD/a5CQEdQIeD7UQwg3RD9pDGALE02aD7x4EQBKLeDHLoqFuY9YwAF8sQAVl4MgDgQL8TjGnBvGc8/RPSZChAMpltHI3x+dV0AIF//p9E/0v+hSwT6Dw0S0D935jcG+p9Dz0D/tA79Xyjxn6an/3cV/Sfj5aABa8e9ahzroO/y2Nx/u611qseTqZsp39O8y7riP5XKOlE/L+kz1ei/h/XXFf9h6f8//9KHe9hw+m/0shPS/yEIWlLSq+mbYP5Ldd9+r9GTwp92yb+/GICD4PPBGOhf8bBp71cP+FYsvWfjU3wk7oYVXatX3bgYQFmTXCzEo4omqQeKsX/qMDh+zTwAIvrrH9r/zv3wDwcWHHBdSGjfST0DAE31f5D+D60g0H9ohID+uTO/MdD/NHoG/V8F/ZP4xM6a+E8D6P+jiv6T8w4ow+hN0lfN/XcPLI6mWBfLG3qDAcG1FN2uMOTjjFhk44LmbuZnWWpfMpLzoEr/hY62aFccvBRF4F2w4RmUX3S+JxsQBEHr6nyPbdJBimFzSvA1gJvGBn6n4sUADI7vCwlwNm1w8z+0/6VbXjkJQBy5p6+hiwH8fmT65IgBXLMYAHEgXojHNeDepmNJgGAw3Toa4fOqGQCj0/8h6AKB/kPdBfTPnfmNgf6nEdA/d/WsxH+1R2dbFP03utZO7IqN4141DveBuf+k389sWy+RD7cdN9Ai4D38lyp75+2ggma8Swcty03mEkYwwB6A2XxLT+kBBqT/QxD0BIU/1M7VW/Zj/0SNKf0/+eOxuwWLv8iRgOxiAFn0r11CzpjHACrc6sPjUL4L2tZjAKrethgAxRBcA+LBccwDENUtADB2+d+cc9T/gUYL9B/qK6B/7sxvDPQ/je5F/zQf/UfiP28+d9kfupX+f+W6CcowepP0VXP/bVmkeDPPtvq/vvhPh/R/vWvXj9d0SJpPg/7vyb+6f7mVPTx/8R9gfQiCniHxV8rP4R9fPNLDGe4PnbAYgGHADh4bVgxA2/0MhyFmP1Dm4/FNAij0YzSpWQmAvjEAHm8oGqF4dV0KAckNr1gMgDgQL8TjGnBv00LzAK6YAZBP/8/W/4GgWwX6D3UU0D935jcG+p9GQP/cT/cbkkV7XzPQ/8oB3Fj0n4wXxa7YeKhx/XCIRn6pf7e6d8SitHl8Swuut1vxH8cdqC7+U6msnyyC11u56b/O8e0xDC3+c55F+j8EQY9UQPuFxGoRxzMoT/ZiAHEhIGUMRrQgYyPufgY2zyQAZ6BCN1NjAC2LAZBVCGjexQAoeURJ8hkcxzwApj4BAKT/Qw8W6D/US0D/3JnfGOh/Jj2j5g9NS/+lR/TixH+5x6LmS9P/a55w101QRtKbpI/K/aeg+I/gZBO2SuX+2SF0YaH2oKHPrP4r2cn/nen/niCBRf/jhX9Zk2wAyR5GcnBLT2m7gPsQBD1G6dtsS059CgGlYQBG+S3ozw7mCgGJ41TQf9EkgCgGYI7KytDPxB4ckwCyXWjOqU8hIKWvTAzANbzkyGWLARAH4oV4XAPubVpiHsDwGQBI/4eWFug/1EVA/9yZ3xjofyYh8Z/7QeJ/2hxF/02p3jVU7bhdjSMemPtv0X/zuFPVPz4eV/ynUnVI3WcsP8ZmHCiy0boONpSwgR7bqCn+g/R/CIKeqACd7hE+DdL2KQf6XYWAjqBCEDyIYgBi5CAcAClj0HbtqzYsnWGJY7wd3GYts4WAWhYD0DX1YgCUPBsk+QyOYx7AqQ4BgLHp/9nekf4PDRPoP9QuoH/uzG8M9D+ZnpH4v9BivyQ+ukj8X73oPznvgzKSa0n61Ln/RYMJd2z6zxp6gwHBFRXR/zDwY0csTFcd0v8Ne2Mwub5yXSil/7POU/q/x2MzKD/zdv7LjPeyRwWCIGh2hS+0IMv+y5d/R4L08JPOU8T95RiAHQmwGTob5yZtp3zZpMnrTQIQNW4xAGouBCQ3vGgxAOJAvBCPa8C9TZPPA7hiDQBL2fT/W6ML0JsF+g81CuifO/MbA/1PJiT+cz9PTPxXO/U3n5v+31v0n4yXxq7YOO5Y+4gHfbuH5/5nPWh3tcRtt+I/FTehyH+dsh9BEdn3/IhksD6l/8yS23t712IJm+Y53d3jg0j/hyDoMWIvrpSahrA5JfgaBU5jA79T8WIAGrsUPSvxg8zuOfx0MQCbYhtn7QBGtdtqy1PvXAyA4gfJeKiO41fOAyCiP3/bHQUDCw64LiS0L9TYAEC+/k+jf6T/Q2ME+g+1COifO/MbA/1PJqB/wRUS/0UPS9P/y55zX5ZYWduGz277oyY4z577X/2j5JbiPw61FP/pk/6v0PbMT96SrmNJ9F8B9+mGEjaQLu3wyel/thf6Ff+BIAh6iEL2Gga8z5+N+7FPe2TP+D5Fu1v4o9WIBNSNMwbcRZMAVJ9E804CSK+oRyEgpS/v4C3PyZErFwMgDsQL8bgG3Jv11z/05+8OOfuJmny2BgCa6v8g/R+CoGcJ6J878xsD/U+mx6B/QuJ/ThMW/af4u7l00X8yXh27YuO4Y+2Dfmzuf6z4xj6w+E+lsq4KUH42ZpA22H5mGv3XAb3SMH7wRMrPvJ3/pl3vyS8w4n8QBEHL6Xx3xZGAL1/+0cUjPZzh/tAPiwEYoDwFzSIC1rjwB3BnQLzcts8kACmewYl8hVu/8bjFAMyBzb4YAMUQXAPiwfHL5gHQNwZgdxQMLDjgupDQ3q2BMwBGp/9D0CAh/R+qENA/d+Y3BvqfT4+h/0j8z+rZZX9oAvr/lS85rKxtw2e3cO5/VlpYhXJ3zEvkw+3a6Fcv/+lQzd070/+dl2yOJ99W5P51xX+O7Q2sH4Kg5yl8rR0o8ceXU5y6xxsaEGfHU8jrx766ZekkgF8MgMcM3JMA7LE58+g/d7j6d6A/G/1V+NPIEwMYthjAxYqBeCEe14B7s2abB9AUABi7/G/OOer/QCME+g+VCuifO/MbA/3Pp8egf0Lif05vL/tDyP3vrCty/7NOLMrc43HVzaQAnstlS/GfStVRdZ9xPuiSfhAnc9L6DTY2eYTSh3v45PQ/2wsdxX+YGfsPgiBoUYUA93ybCUc2ol0IA4iUPwuFE0qucnlRDZMApMGUZ+trMQ+/2yIprniPoVoWAzB/aa5bDODSQkDsKSXlEzyOv3YewKgZAPn0/2z9Hwi6XKD/UJGA/rkzvzHQ/5R6DP1fCP2TzA3Hg+mX0/8rH3XXrcjlZdf4VHoak/v/k+BkE7a6OVcVR1buKP6jNvT15Sj+0yf9X7M3xpPrKxtCsEauA3pO//d4YAblZ96YTbgR3/ao+A8EQdBjxLj//tvboyPB+r0kgX4WS0h/zpSWpzccBq7umQRgjG3EJID0osYtBtBjesHNMYBPj4dXYS8rDbg3a555APUBAKT/Qw8T6D/kF9A/d+Y3BvqfUo9B/7QU/b8l8V/t198cRf8delXuP9GR/j8gYlHgRLu32bZeIh9u134LevmvlhBxLNk12+ZvuzOK4HlgPOPMFv+J0H9wcD/oP+sCwQAIgh6j8FUWcO0vX/4d2X4B2D1IQU8nATDnQuZy+ZKz4rCrJgHwxQD8cQjzVPEkgCLkrcQArCaTLQYwpInhijAPwNKQGQBI/4eWE+g/5BTQP3fmNwb6n1K3o39C4v/PbHb0T2MS/6mE/i9T9J+cd+MJuf86/e+X+5+VcQldHlrd7K7iP89J/0+/8idQCQA9T/83Bnb8y+m/OLAI6CfFf/b4PwiCoIeJvdlSlBgS7nQGAGstYmJPaRrNLTveMAlAtbx4EoAfpmv6s21/7WU/kTwxgC6FgIRWuUkAA4R5AJoGLgI8Tkj/h/oK9B/yCOifO/MbA/1PKaB/2RUS/w0PS5f9IeT+D9EVuf+FfuLbW3DhfYr/+FB+Y/GfSmW95di9cbZs1oWnr/Qrs8enior/pJZsw1P8B2EACIKeJIazD21nwsAe7G/7117EvulB2Sym7Swr32h46hMDePMkALHTUNWLAeSmFyywGADFEFwD4sHxV80DqAwANNX/yab/Dy0uBEGxQP+hrID+uTO/MdD/rAL9F/w8N/Ff7rfUw9L0/+IH3pcBVta28RNUmq+R+1+CksswtJfIh9u1F9TVf7f0fwma35z+n5UnSmGk/6e7bBvFfyAIeo/O11ocCfjy5fPgSf/T5oz2ikw/16rO+C2TANLr6lEISGn4kMUAiANxzAMgGjEDIF//p9E/0v+hfgL9h2wB/XNnfmOg/1kF9C/4GXFPstjra7Z+4j91oP8PKPpPxitFw9OO+9Zl6IO+9bPk/hsGDy3+U6nSO1nyU94VdzFmNvjv5A/WS7/eHP/K9D+NAYTeGN/f4/8gCIIerPAt50nk/0OUJjI7Ga42CcCPgN82CUC0zxYCql4MwNQaiwFQDME1IB4cv3geAJE5FSAcWHDAdSGhfaKaAADS/6FnCPQfMgT0z535jYH+J9bt9P+di/0SEv9Tt48s+k/OG3Jp7v+mfOnWyP0vVNRjyUe/VvGft6X/5ydnSBdiWbINrfgPa44wAARBj1QIXuOfVvvfuuUpT8GZ0oT0LNA/IhAVkwC+MQDexdyTAEQNWgygSyEgodUNiwHQrPMAiOivf7Y/fx99dOsoMw+g8wyA0en/ENRLoP+QJqB/7sxvDPQ/sW5H/4TE/8gM9P/son4AkxT9J+T+M3X8+y7rSrvDJZ77FP9xOqn236iSO5m3z8QMxCYl6f/aa0H2zHfl9H9xl22z4j97/B8EQdCDdeJCnbZH+scxCUDjwm5Kbsnuy4GkXZbqJRDR3ZMAsnr5YgAUf0waZA+OXzkPgLJLAoQDCw60zAMoDgA0pf9nlXOO+j9QF4H+Q6KA/rkzvzHQ/8QC+pddIfE/6wRF/4vky/cqa9v2OS6f+1/KrENdX/zHp/biP93S/0V7fnbW9H/9un4n7BjA74hZ/AeCIOgNUpDi9k8yCcDBlOVlADww2uC/eljinkkAxtj8kwA86yUYHVGfQkBKw+csBkCYB3D47DkDIJ/+n63/A0HjBfoPpQL65878xkD/E2sG9E/z0X8k/uc9oOi/W2/L/f9qTMSixVV0tc8t/lMp+XWkG5T83Hel/xsG/osVXxrGpZ3ZmGIM4LORLf6DSAAEQS9UmvL/z0Z/+16FnIbnJwHIHNwDgtksBGfXaad2X+olfBwFPtmPixEse0wM4MmLARDmAfxUFgBA+j+0ukD/ISagf+7Mbwz0P7dmoP+zoX96euK/3HWph7nL/tBM9P8rX5pXWdu2z3FQ7v/Xs+Ckd+6/R1qIpSR8tVzxn7el/8sSr8vzVYrQf7ytcX/QfwiC3iOp1I8wCUBsGP+q7sptL+W8un3FJADZsnQSwNnc9GOoeBKAqB7Z+o9fDIAwD2DrNwMA6f/Q/AL9h0IB/XNnfmOg/7n1JPRPSPx3a9qyP9SP/s9T9J9emfuv0H8i6g1Js96qu3M21M0yCF5Xe/GfSskvJd2g5BcAb/r/+Qbw9OWPDfjnBJzHQ6YfF//ZwrOA/hAEvVxiiX+njZO/i5MASqMC904CSE7dMwkg7ZcJiwEQ5gEQ7b0XAR4npP9DENRLQP/cmd8Y6H96PYn+I/HfL9D/GxL/Cbn/NCT3v3CoZen/YUNvMCC4xqKxhaEgi/gHYy76aW7uPiP93/0ZKce1jrb4FIr/QBAEfSQxfT4JQKTJHsRcWo/egZJ/g3zVJID06sYtBlChkg+uwEknvXceQFEJoKb6P9n0/6HFhSAI6f8QEQH9p878xkD/0+tJ6J+Q+F8iFP2/mP4j9z9SX0Lq8abd50cX/6lU9n7m2L1x9tL0f+eKwUXNtQkE4X8QBEHQR+IyAMYkgHBbTZ/3UnJzYMtPAugVA8gUAqpbDKBiEoAodpc8hYBGxABCsO5Jn//Q+KfMA+gzAyBf/6fRP9L/oTaB/kNA/9yZ3xjof3rNgP5pvsT/a9A/IfFfc/vgov80Y+6/5mGl3H+Pqi+nMZc8m4Cvq0vxn57p/wnanjP9X5b/7fqP2Fw4dlMtYgiCoGXkmgTAmohQ2zNRoALE/0P098KTAHpp+7PtWAzAp3fOA/AGAJD+D60r0P+XC+ifO/MbA/1Pr4ehf1qN/q+e+E/T0/+piv7TxLn/RGrxnw5ur8n9L3dYlv4fNvQGA4LHuDZTvkvxn0rNkP5f1xeTP3+/oLn0wHwskfsPQRBEUna/OAlAk3MSwAGX5YBBXQ74aycBpF0zVS8GUNEkHV7FpzliEgAtMA+AaPujfdfq5wFsHWYAjE7/h6AWgf6/WUD/3JnfGOh/BT2M/q+F/unWxH+59wonS9P/u57/KXP/Rfq/WO6/Z7RaoOX64j++vnr5Xzj9n300Jen/3nes/zmXelffUYgBQBD0TilVffgkgFQJXK6B2h71ngTwHeeKkwDSC+xRCEhqlXPrHB6LlNxVCOgcwNGDsJfVyHkA9J0K0HcegK8EUFP6f1Y556j/A1UL9P+1AvrnzvzGQP8rCOhfdYXEf6eTMUX/KfguP6noPyH3n+mW3P/qTr35/uqZe4v/VGrF9P+2pP7sO+en/yN9ZcSSQRAEQW+WVuLfaVP40+0XMKhjvuFISiYBRKqeBBCD9YsmAUie84WAsBjA6ZbmnQdAYQxA6CgYWHDAvpDWGQD59P9s/R8IGiPQ/3cK6J878xsD/S8i0H/ZDxL//U7mTvyn+ej/V8j9v6vuf6Ky9P+woTcYEFxpLSjvVfynZ/p/am8MLNdXWQiBmqv/i9I69dF8pP9DEAQJ8kwCEIvJeCrMpDY2WRbhr06Eb5sEoPV4+UoA5IkBpBoUA/BEPm5dDIDeNA+gzyLA9UL6PzRGoP8vFNA/d+Y3BvpfRED/sp9Bt2WyxH91AKVO5qb/sxX9p1fm/hMNjFhU+tTu9sXFf6p/mDr991L247sk/f/7ZW9M//eFDdTXjjPqgJK2EARBHonLAOiTAH4xg0FJ3MZICicBbH98Q11hEkBeWAwg9ExvmQeQDwAY9X+Q/g/NKdD/twnonzvzGwP9L6KHoX+anP4/NPGfVqf/N34L3pT7T0SbUCBlWO5/If2P1KuSlYGw678UvmEg/V9R/1du46LBEARBkGcSgEeeSQBZ4Nt7EoBgecckgKkKAUmtnrkYAL1jHsDdMwBMIf0fqhDo/6sE9M+d+Y2B/hfRJOifkPjPzRaj/yj6X6F35v5L9J+I7sv9j1V92SsW/6nUiun/msS3SiPK155wCIIgKFWa3S9OAvCoOgW+iPwuPgmgXmNiAK9YDIDeMg8gEwBoWv43m/4/dG1h6JUC/X+PgP65M78x0P86moT+z4b+6TWJ//IAKpyMSfwnN/1fteg/IfefBub+O6WFW15Q/Oe16f+CxKvT+k0XAGhcNBiCIOht8lT1EZUw5Yx9i+acBPC5A9dPApBdYTGAMj17HkD9DIB8/Z82If0fKhXo/0sE9M+d+Y2B/tfRJOif5qP/SPwv9rN02R9C7n/i5xm5/063ms3FxX/KfuT5Gt51Vy9J/y/uqy2pvwDliw85FgCAIAgypAcDymxsHUz5h7+r073vnQTAHN46CSAvLAbAnNOT5wFYAQCk/0MLCfT/DQL65878xkD/S2kS+j8b+ick/lf4WZr+3/tFQO7/0Nz/8jH/xlD4YHQo/pNp6OursPhP5/T/+Hs6Ov0/+uKXJ9q77n/bY6++uNLZAxAEQe+UMQng/9v2/2snUvCxZxJA6foBGvbVjv9D29+vnASQ5u9jMYByPXUeQOUMgNHp/xBUJND/xwvonzvzGwP9L6VJ0D/NR//fk/ivjqHUCYr+V2nm3P9xmjH3n/R7XtTQmYM/WfGfSj0s/d8XOVBfRM7AA/6qhSAI6iLPJAAb3dYx5axeNQlA8o/FAMr03HkAagCgKf0/q5xz1P+BIOgjoH/uzG8M9L+UgP4tV0j8L/WDov8tmjL3n6T0/yVz/53SLu0dxX/enP4vqOg97FsAAIIgCOqj0lz+ooYezjtgEgCfsrDWJIBe8sQAcqpbDGASTT4PgIj+/L0XdVQzAyCf/p+t/wNB/YT0/6cK6J878xsD/S+l56F/QuJ/lV5C/+cs+k/T5/4PKv1/de5/leffEC8u/lOS5N6x+E+lFk3/1yS+ZNqWCpAXAIAgCIKySrL7f1WAfPohdQf/ldl3BTj+50CehZMAvJaDJwHcXAhIHBID+o5JGxWLAdw/CYAWmAdAxlQAZR5A/SLA9UL6P9RPoP+PFNA/d+Y3BvpfTc+j/8uhf5og8V8eQ50fFP1vkT/3X3hmWnzmunxM7n95en7ZMLxEPtyuvdBh/pdO/ze6diq5fOkC/c9/0aLBWAAAgiAoVPXSvvXTAjpVlj/EUfJSkwCa1CUG4Lldj14MgOaeB0BnDMDXkRwAMOr/IP0fmkeg/88T0D935jcG+l9Nz0P/tCD9f1HiP3Wg/48s+k9vzf1XdXvuv2b2juI/lZom/X/7s5X11ZbUn30p/SSm/2MBAAiCIKc8kwDMgIGwFLCuX/J7I+S9dxJAgNSvngTg7iJS3WIAOdUtBuAS5gGUzAO4YwaAKaT/Q06B/j9MQP/cmd8Y6H9BPY/+L4f+CYn/Ts9vKPpPr8v9JyH9f3Duf5V+I3lN8Z/O6f/MOdufL/3fJaNrRwp/QcwAgiAI8kwCEPP9PZMA5IZ6RrlBe+ecBCD2eNkkgET5SQCisjGAXoWAeBPHJICr9Ix5AEIAoGn532z6/9C1haHXCPT/SQL65878xkD/Cwro33L1psR/dRgVfuam/9MW/acX5/7Lpf+H/pFVnp5fdvFeIh9u197e0f5LZYznj2Qwf/q/j9Gr7yUn4kf6PwRBUHd5Agajs7aZGiYBfGMAD5oEgMUAavSUeQBlMwDy9X/ahPR/yCPQ/8cI6J878xsD/S+oedA/zUf/kYUzeYIAAAuHSURBVPhf72pp+j/DlwK5/xfk/pfT/0ivKf6D9H/XAgB+FQ0DCwBAEAQV6lcFyEmN0ypAnoZOwjtgEkDSxYKTALrEADx37OmLAdD68wB4AADp/9DkAv1/hoD+uTO/MdD/ggL6t/yMuzkvT/ynegz9+KL/hNx/phly/2P9Rvma4j+Vmib9v7gvTeJrp22pAHkBAAiCIKhI1WsCp8pkzW/01y5nvteh3jdPAnD3EgmLAYhd0NrzAApmAIxO/4egrED/HyCgf+7Mbwz0v6ZA/y0/L0v8l4dR52fuxH+am/5/hdz/qer+i6EXz3PiJfLhdu3ljvS/evr/753Qq8i+eI3GR8BS+BsXDYYgCII+spf2TZcCPiVl9xctBVwsYxLA/9n2fy08CaA1BsC9YTGAeq07D+DCRYBz6f+o/wPZAv1fXUD/3JnfGOh/TQH9W36Q+N/iam76P3PRf0LuP9Pov6e8+fi3+Z+k+E+l+qbkX5z+35bUX4DyxScfmW0QBEEV8kwC6DJRgE0C6JjfveYkgFal7B6LAdRp5XkAUQDAqP+TT//P1v+BoAaB/i8toH/uzG8M9L+s5qH/s6F/QuJ/o6ul6f8k34tZc/+FQSyd+181+LL0/7ChNxgQXHsR/fdONQiG7b4D/dP/g2/xKun/+U+w7etgvdmwAAAEQZAhD9MXebEHIvtA80+1IP7mSQCfy7xxEkCXGIDnpr1gMQBacx7AVTMAkP4PNQj0f10B/XNnfmOg/2U1D/qn+ej/CxP/qSPDHVb0n47v/oOL/tP0uf80LP1/6tx/Uu7/xcV/WtCzx/8IPTL93xc/UN9UzvAD0v8hCIL6SagCZFcN8iTUD9UtkwBCb7dMAqjrCIsBaL3QAvMAiCicCvALACD9H4KgjgL65878xkD/ywroP+MKif8truZO/Kfp6f9XE+f+M/q/du6/X+JlFtL/OrPqO9y9+M/q6f9iv60qfWM7FgCAIAiCxqo0l99uyBLJ/WB3zCSAaPWCRScBCA6xGECTJp8HQGE5oO3KNQB0If0fMoT0/+UE9M+d+Y2B/pfVVOif5qP/SPxvdTU3/Z+86D8h95/pgj+dqrqovgVLF/+p1Ezp//zprb528S3UtlSAvAAABEEQVC0pu99aCliSfxKAjLwbsry/MYDySQAuywUnAWAxgHqtMA+AgnJA3wCAkf6fVzb9v8U59G6B/q8loH/uzG8M9L+ypqL/s6F/emXiP4H+n5rn2/G+3P+0H2FrhPzjFwMwLyv+g/T/j7bszfQ/V6WLBmMBAAiCoKyql/atnhZAtdXkqR/Qj/WQSQAVfLxuMYA65WIAlU5GapV5APkZAPn6P21C+j+kCfR/IQH9c2d+Y6D/lTUV+qf56D8S/1tdoeh/s16b+09i+v9Uuf+i5cXFfwpvSPfiP5VaPf2/Lak/+9b6SUz/xwIAEARBjfIEA6oDBol+yLsT1V19EkD3GICrEFDFYgB1kwBEBX15CwFhHkCsv/7Z/kVI/4emFOj/KgL65878xkD/i2sq+v9m9E9I/K9w7qD/Dyn6Ty/N/Y/p/1W5/7WqHlVr8Z98Q19ftcV/kP7vlT2AXAp/QcwAgiAI0mQv7fupAiRX8xcORtn0io2lLN597iSAEcJiAO2afx5AZgbA6PR/CBIF+r+EgP65M78x0P/imgr907vp/zyJ/7QI/X9J0X9C7j/TNX8lVaX//8b6suI/lXpq+r+P0asvLifix9+2EARBl8kzCSAL36urAJm6eRLAn++dmWcSgEt1iwE4VLEYgEuXTQKgNeYBDF4EOJf+j/o/UCrQ//kF9M+d+Y2B/hcX0H/GDxL/u3hbmv5P9R1B7v+Vuf9V9P+n9xX/6Z/+H9qz/bnT//MLAPhVOhgsAABBENRJ1iQA0b5iEkAR0p12EkDa4y2TAOIx9CoElDTpt5BDcGS6QkCHiuYB8Adm8DyAfxn1f/Lp/9n6PxBUKND/yQX0z535jYH+FxfQf94VEv/bXaHofw8h9z/SbLn/sapvxOrFfyqV+QJemv5veyuT+F5qWypAXgAAgiAI6qJ+Jf49BHmjXUh4b2O7LZMAvjGA1ScBJN1hMYBWFc4DIM+F95sHMHIGANL/oUKB/s8soH/uzG8M9L++QP8zft6a+E9X0v+2jt5V9J+Q+0+X5v4XSQzDvK/4zwPS/79Pct/y+uKVnnl0Yl9hCn/josEQBEGQrWruX1riv5dM+PuNATgszS5WngSQCIsBdNGc8wDUAADS/6GLBfo/rYD+uTO/MdD/+gL6z/gZen9ek/hP09P/JYr+E3L/mS77g8jfkWj5vuI/lXpA+n9jUr9fYvo/FgCAIAjqKCkY8K0CZNpE9qwKkGF5Jrx3T+jGJIDS+4nFALLd0YzzAAavAaAL6f9QKND/OQX0z535jYH+HyHQ/4wfJP738oai/x01ce4/H8Qzcv9rr+I7tvLn5wHFf5D+H7lq+IUq79weIRYAgCAIKpVnEoAIiD3UWLPR8sc9YPfRkwBmLgSUNHnXYgA03zyA2gBANv0/V/8Hgk6B/k8ooH/uzG8M9P8IAf1n/Lw48Z/6clsU/e+k+XP/aVj6/xq5/6R/FkUNnTn4Exf/qVTpyBdK//dFEdRXmTMIgfR/CIKgS1Q5CeDe3yiXnQTQTWNiAO9dDIBmnAcgBwDy9X/ahPR/CJpWQP/cmd8Y6P8Rmg3906voPxL/QzXmvb6t6D/Nnvsf0v+H5P4XSbzkVxb/GZL+f3zTr0n/Z512U8W7PbcAAARBEHSPqov+eyYBlJLcmScBsADJXZMABLdYDKCP5pkHUDUDAOn/UD8h/X8eAf1zZ35joP9HCOg/7weJ/x29zU3/Vyn6T+/O/Rd05d8+tX1978XFxX88bb1TDYKRX3PDJ0v/j57nEXegcakAcQEACIIgqLuq1wRO5SDvMunuldZ91ySA09VkkwBcwmIAnh5plnkAQgBgdPo/BJ0C/Z9EQP/cmd8Y6P8peir974X+6d2J/wT6H2qmL8tvKPmb9rTcf4rS/y/P/S+6kDQY43yKvEQ+3K69AaP9ExHS/xNtZwq/eLFnvly2O8kACwBAEAQNUbaqD6sCdErhxf6lgOs1bBLA9g/tH7D6gEkA8bVjMYBu2mmL/hC5Zx7AgEWAc+n/qP8DfQT6P4OA/rkzvzHQ/1P0VPRPSPzvpEvRPzVx51cV/SeD/r8j95+X/p829796YN58f/XMbMV/KvWM9P/GpH6/xPR/5LdBEAQNkmcSQK+JAn+2jfYv6e6Ncb8xgPJJAHnLhSYBJJ1iMYBuOju9bx4ADwDk0/+z9X8gyCHQ/9sF9M+d+Y2B/h+kp9J/JP730qsS/+kZ9F+zRe7/BCpL/w8beoMB0g33tPVONahi35rn16f/Z5QdhpnCn580AEEQBFXLOQnA/RfJL4+eytcPcPLcXkA/0aMmAfRSNgbgUMViAFPr7nkAvWcAIP0fcgj0/14B/XNnfmOg/wdpQvTfS0j876VX0f+Fiv4Tcv9vzP0v7S79RC4u/lNI/4v9j9aj0/83XxEe9c3mRPxI/4cgCLpdJ+A24L6H7VZXj3Fo9UkAcxUCkhQRbd9HWboYwNSTAMJ+75gHEAUAkP4PXSDQ/xsF9M+d+Y2B/h8koP+8n2vRPz098Z9Wp/+TfWU89D+yvTv3n7o+UTz3P04iGq5a+j+kF92s+oaPK/4zJP3/tGf7y6X/N77wzyH5l//FAgAQBEEXqDSXv0gVDPfRkwB6qksMIHsPX7gYAInzAKzRCvMAaoc9YA0AXUj/h6C7BPTPnfmNgf4fpAejf1qW/t/4m62mq4v+N/rft8ZKF8+j/7Pl/o+h/0Q0N/2P9fLiP5XKdsQo9pzp/0VC3R4IgqDlpJQDUpcCVvRdCvjzo0aPHMh57p1gLiYB1PX7VcViAA5VLAbg1SzzAJIYgD0PQIh/uOYB/P+14N2fDaqH4gAAAABJRU5ErkJggg==" + } + Texture: 1577064528896, "Texture::Slime_002:file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Slime_002:file1" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::Slime_002:file1" + FileName: "D:/dealers-dungeon/Assets/Temp/Slime/Skin_Base_Color.png" + RelativeFilename: "Skin_Base_Color.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + AnimationStack: 1576509862752, "AnimStack::Idle", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1539538600 + P: "LocalStop", "KTime", "Time", "",93911854600 + P: "ReferenceStart", "KTime", "Time", "",1539538600 + P: "ReferenceStop", "KTime", "Time", "",93911854600 + } + } + AnimationCurve: 1576650459696, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650461776, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650462256, "AnimCurve::", "" { + Default: 49.9673614501953 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0.2306684,0.9009622,1.978319,3.430172,5.223958,7.327106,9.707061,12.33125,15.16711,18.18208,21.34359,24.61908,27.97598,31.38173,34.80376,38.20951,41.56641,44.84189,48.0034,51.01838,53.85423,56.47843,58.85838,60.96154,62.75531,64.20717,65.28452,65.95482,66.18549,65.98331,65.39458,64.44593,63.16403,61.57554,59.70712,57.58544,55.23714,52.6889,49.96737,47.0992,44.11107,41.02963,37.88153,34.69345,31.49203,28.30395,25.15586,22.07442,19.08629,16.21812,13.49658,10.94834,8.600049,6.478362,4.609947,3.021455,1.739559,0.7909125,0.2021722,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650548656, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650550256, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650550416, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650551536, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650555376, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650545936, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650547856, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650551856, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650457616, "AnimCurve::", "" { + Default: -25.9146614074707 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,-0.119632,-0.4672676,-1.026019,-1.778996,-2.70931,-3.80007,-5.034389,-6.395379,-7.866145,-9.429804,-11.06946,-12.76824,-14.50923,-16.27556,-18.05033,-19.81666,-21.55766,-23.25643,-24.89609,-26.45975,-27.93052,-29.2915,-30.52582,-31.61658,-32.5469,-33.29987,-33.85863,-34.20626,-34.32589,-34.22104,-33.9157,-33.4237,-32.75887,-31.93503,-30.96601,-29.86563,-28.64774,-27.32614,-25.91466,-24.42714,-22.8774,-21.27927,-19.64656,-17.99312,-16.33277,-14.67933,-13.04663,-11.44849,-9.898754,-8.411231,-6.999757,-5.678157,-4.460258,-3.359884,-2.390865,-1.567023,-0.9021905,-0.4101923,-0.1048529,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650461616, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650545776, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650552496, "AnimCurve::", "" { + Default: 0.562692165374756 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,0.9979812,0.9921149,0.982686,0.9699796,0.9542806,0.9358741,0.915045,0.8920785,0.8672595,0.8408728,0.8132036,0.784537,0.7551579,0.7253512,0.6954021,0.6655954,0.6362162,0.6075497,0.5798805,0.5534939,0.5286748,0.5057083,0.4848792,0.4664727,0.4507737,0.4380673,0.4286384,0.4227721,0.4207533,0.4225227,0.4276753,0.4359778,0.4471968,0.4610989,0.4774511,0.4960198,0.5165718,0.5388737,0.5626922,0.587794,0.6139457,0.6409141,0.6684659,0.6963675,0.7243859,0.7522876,0.7798392,0.8068076,0.8329593,0.8580611,0.8818797,0.9041815,0.9247335,0.9433022,0.9596543,0.9735566,0.9847756,0.9930781,0.9982306,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650547216, "AnimCurve::", "" { + Default: 0.562692165374756 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,0.9979812,0.9921149,0.982686,0.9699796,0.9542806,0.9358741,0.915045,0.8920785,0.8672595,0.8408728,0.8132036,0.784537,0.7551579,0.7253512,0.6954021,0.6655954,0.6362162,0.6075497,0.5798805,0.5534939,0.5286748,0.5057083,0.4848792,0.4664727,0.4507737,0.4380673,0.4286384,0.4227721,0.4207533,0.4225227,0.4276753,0.4359778,0.4471968,0.4610989,0.4774511,0.4960198,0.5165718,0.5388737,0.5626922,0.587794,0.6139457,0.6409141,0.6684659,0.6963675,0.7243859,0.7522876,0.7798392,0.8068076,0.8329593,0.8580611,0.8818797,0.9041815,0.9247335,0.9433022,0.9596543,0.9735566,0.9847756,0.9930781,0.9982306,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650554256, "AnimCurve::", "" { + Default: 0.562692165374756 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,0.9979812,0.9921149,0.982686,0.9699796,0.9542806,0.9358741,0.915045,0.8920785,0.8672595,0.8408728,0.8132036,0.784537,0.7551579,0.7253512,0.6954021,0.6655954,0.6362162,0.6075497,0.5798805,0.5534939,0.5286748,0.5057083,0.4848792,0.4664727,0.4507737,0.4380673,0.4286384,0.4227721,0.4207533,0.4225227,0.4276753,0.4359778,0.4471968,0.4610989,0.4774511,0.4960198,0.5165718,0.5388737,0.5626922,0.587794,0.6139457,0.6409141,0.6684659,0.6963675,0.7243859,0.7522876,0.7798392,0.8068076,0.8329593,0.8580611,0.8818797,0.9041815,0.9247335,0.9433022,0.9596543,0.9735566,0.9847756,0.9930781,0.9982306,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650552016, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650552176, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650555536, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650552656, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 2,8456 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650548336, "AnimCurve::", "" { + Default: -21.6677761077881 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: -21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778,-21.66778 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650548816, "AnimCurve::", "" { + Default: -5.65196132659912 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: -5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961,-5.651961 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650552336, "AnimCurve::", "" { + Default: -3.59216237068176 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: -3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162,-3.592162 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650553136, "AnimCurve::", "" { + Default: 1.35816156864166 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650553616, "AnimCurve::", "" { + Default: 1.35816156864166 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650555216, "AnimCurve::", "" { + Default: 1.35816156864166 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650548976, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650546416, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650549136, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650547376, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 2,8456 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650549936, "AnimCurve::", "" { + Default: -1.117342710495 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: -1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343,-1.117343 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650553776, "AnimCurve::", "" { + Default: -1.25043789409832e-14 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: -1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14,-1.250438e-14 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650555056, "AnimCurve::", "" { + Default: 22.0709438323975 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094,22.07094 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650553936, "AnimCurve::", "" { + Default: 0.755762994289398 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650546096, "AnimCurve::", "" { + Default: 0.755762994289398 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650549296, "AnimCurve::", "" { + Default: 0.755762994289398 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650554096, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650554416, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650554576, "AnimCurve::", "" { + Default: -0.196827858686447 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: -0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *2 { + a: 24840,8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,60 + } + } + AnimationCurve: 1576650549456, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650554736, "AnimCurve::", "" { + Default: 49.9673614501953 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0.2306682,0.9009627,1.978319,3.430171,5.223956,7.327106,9.707059,12.33125,15.16711,18.18208,21.34359,24.61908,27.97598,31.38173,34.80376,38.2095,41.5664,44.84189,48.0034,51.01837,53.85423,56.47842,58.85838,60.96152,62.75531,64.20716,65.28452,65.95481,66.18549,65.98331,65.39457,64.44592,63.16402,61.57554,59.70712,57.58543,55.23714,52.6889,49.96736,47.0992,44.11106,41.02962,37.88153,34.69345,31.49203,28.30395,25.15586,22.07442,19.08628,16.21812,13.49659,10.94834,8.600047,6.478362,4.609945,3.021458,1.73956,0.7909111,0.2021711,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650545456, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650549616, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650545616, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650546256, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650547536, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650546736, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650546896, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650547696, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650560656, "AnimCurve::", "" { + Default: -25.9146614074707 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,-0.1196318,-0.4672679,-1.026019,-1.778996,-2.709309,-3.80007,-5.034389,-6.395377,-7.866145,-9.429804,-11.06946,-12.76824,-14.50923,-16.27556,-18.05033,-19.81666,-21.55766,-23.25643,-24.89609,-26.45975,-27.93052,-29.2915,-30.52582,-31.61658,-32.5469,-33.29987,-33.85862,-34.20626,-34.32589,-34.22104,-33.9157,-33.4237,-32.75887,-31.93503,-30.96601,-29.86563,-28.64774,-27.32614,-25.91466,-24.42714,-22.8774,-21.27926,-19.64656,-17.99312,-16.33277,-14.67933,-13.04663,-11.44849,-9.898753,-8.411232,-6.999758,-5.678158,-4.460258,-3.359884,-2.390864,-1.567024,-0.9021911,-0.4101916,-0.1048523,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650564656, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650558416, "AnimCurve::", "" { + Default: 0.562692165374756 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,0.9979813,0.9921149,0.982686,0.9699796,0.9542806,0.9358741,0.9150451,0.8920785,0.8672594,0.8408728,0.8132037,0.7845371,0.7551579,0.7253512,0.6954021,0.6655954,0.6362163,0.6075496,0.5798805,0.5534939,0.5286748,0.5057082,0.4848792,0.4664727,0.4507737,0.4380673,0.4286384,0.4227721,0.4207533,0.4225227,0.4276753,0.4359777,0.4471967,0.461099,0.4774511,0.4960198,0.5165718,0.5388737,0.5626922,0.587794,0.6139457,0.6409141,0.6684658,0.6963675,0.7243859,0.7522875,0.7798392,0.8068076,0.8329594,0.8580611,0.8818796,0.9041815,0.9247335,0.9433022,0.9596544,0.9735566,0.9847756,0.9930781,0.9982306,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650559536, "AnimCurve::", "" { + Default: 0.562692165374756 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,0.9979813,0.9921149,0.982686,0.9699796,0.9542806,0.9358741,0.9150451,0.8920785,0.8672594,0.8408728,0.8132037,0.7845371,0.7551579,0.7253512,0.6954021,0.6655954,0.6362163,0.6075496,0.5798805,0.5534939,0.5286748,0.5057082,0.4848792,0.4664727,0.4507737,0.4380673,0.4286384,0.4227721,0.4207533,0.4225227,0.4276753,0.4359777,0.4471967,0.461099,0.4774511,0.4960198,0.5165718,0.5388737,0.5626922,0.587794,0.6139457,0.6409141,0.6684658,0.6963675,0.7243859,0.7522875,0.7798392,0.8068076,0.8329594,0.8580611,0.8818796,0.9041815,0.9247335,0.9433022,0.9596544,0.9735566,0.9847756,0.9930781,0.9982306,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650560496, "AnimCurve::", "" { + Default: 0.562692165374756 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1,0.9979813,0.9921149,0.982686,0.9699796,0.9542806,0.9358741,0.9150451,0.8920785,0.8672594,0.8408728,0.8132037,0.7845371,0.7551579,0.7253512,0.6954021,0.6655954,0.6362163,0.6075496,0.5798805,0.5534939,0.5286748,0.5057082,0.4848792,0.4664727,0.4507737,0.4380673,0.4286384,0.4227721,0.4207533,0.4225227,0.4276753,0.4359777,0.4471967,0.461099,0.4774511,0.4960198,0.5165718,0.5388737,0.5626922,0.587794,0.6139457,0.6409141,0.6684658,0.6963675,0.7243859,0.7522875,0.7798392,0.8068076,0.8329594,0.8580611,0.8818796,0.9041815,0.9247335,0.9433022,0.9596544,0.9735566,0.9847756,0.9930781,0.9982306,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650562896, "AnimCurve::", "" { + Default: -2.54444377487161e-14 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: -2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14,-2.544444e-14 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650562096, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650558896, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650556016, "AnimCurve::", "" { + Default: 60.8625564575195 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 8.332225,8.468953,8.869429,9.523127,10.42416,11.57053,12.9636,14.6076,16.50931,18.67765,21.12332,23.85834,26.89543,30.24726,33.92533,37.93856,42.29129,46.98069,51.99354,57.302,62.85882,68.59177,74.39809,80.13965,85.64018,90.68656,95.03585,98.42992,100.618,101.3851,100.7124,98.78506,95.77537,91.88594,87.32887,82.3084,77.00874,71.58727,66.17202,60.86256,55.73273,50.8345,46.20196,41.85523,37.80381,34.04953,30.58877,27.41444,24.51727,21.887,19.51313,17.38557,15.4951,13.8337,12.39487,11.17391,10.16813,9.377177,8.803352,8.452032,8.332225 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650556816, "AnimCurve::", "" { + Default: -10.0444993972778 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: -5.651961,-5.663394,-5.696882,-5.751544,-5.826887,-5.922745,-6.039232,-6.176702,-6.335721,-6.517036,-6.721541,-6.950241,-7.204199,-7.484476,-7.792034,-8.127616,-8.491587,-8.883711,-9.302879,-9.746769,-10.21142,-10.69081,-11.17633,-11.65643,-12.11638,-12.53835,-12.90204,-13.18585,-13.36881,-13.43296,-13.3767,-13.21554,-12.96388,-12.63865,-12.25759,-11.83778,-11.39463,-10.94129,-10.48847,-10.0445,-9.615548,-9.205962,-8.818594,-8.455124,-8.116348,-7.802418,-7.513033,-7.247598,-7.00534,-6.785398,-6.586898,-6.408994,-6.250914,-6.111989,-5.991676,-5.88958,-5.805478,-5.739339,-5.691357,-5.661979,-5.651961 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650563856, "AnimCurve::", "" { + Default: -6.38388538360596 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: -3.592162,-3.599429,-3.620712,-3.655453,-3.703338,-3.764262,-3.838297,-3.925667,-4.026733,-4.14197,-4.271945,-4.417297,-4.578703,-4.756836,-4.952308,-5.165591,-5.396916,-5.646134,-5.912541,-6.19466,-6.489977,-6.794654,-7.103231,-7.408366,-7.700692,-7.968882,-8.200024,-8.380403,-8.496688,-8.537455,-8.501703,-8.399276,-8.239326,-8.032622,-7.790437,-7.523624,-7.241974,-6.953849,-6.666057,-6.383885,-6.111261,-5.850945,-5.604749,-5.373742,-5.158429,-4.958908,-4.774986,-4.606286,-4.452316,-4.312531,-4.186371,-4.073302,-3.972833,-3.884538,-3.808072,-3.743184,-3.689732,-3.647696,-3.617201,-3.59853,-3.592162 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650558256, "AnimCurve::", "" { + Default: 1.35816156864166 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650562256, "AnimCurve::", "" { + Default: 1.35816156864166 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650563376, "AnimCurve::", "" { + Default: 1.35816156864166 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162,1.358162 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650564496, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650564816, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650565456, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650564976, "AnimCurve::", "" { + Default: 40.7906303405762 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063,40.79063 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650558096, "AnimCurve::", "" { + Default: 4.16147947311401 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479,4.161479 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650555856, "AnimCurve::", "" { + Default: 18.8954734802246 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547,18.89547 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650557776, "AnimCurve::", "" { + Default: 0.755762994289398 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650555696, "AnimCurve::", "" { + Default: 0.755762994289398 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650556336, "AnimCurve::", "" { + Default: 0.755762994289398 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763,0.755763 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650556176, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650556496, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurve: 1576650557456, "AnimCurve::", "" { + Default: -0.196827858686447 + KeyVer: 4009 + KeyTime: *61 { + a: 1539538600,3079077200,4618615800,6158154400,7697693000,9237231600,10776770200,12316308800,13855847400,15395386000,16934924600,18474463200,20014001800,21553540400,23093079000,24632617600,26172156200,27711694800,29251233400,30790772000,32330310600,33869849200,35409387800,36948926400,38488465000,40028003600,41567542200,43107080800,44646619400,46186158000,47725696600,49265235200,50804773800,52344312400,53883851000,55423389600,56962928200,58502466800,60042005400,61581544000,63121082600,64660621200,66200159800,67739698400,69279237000,70818775600,72358314200,73897852800,75437391400,76976930000,78516468600,80056007200,81595545800,83135084400,84674623000,86214161600,87753700200,89293238800,90832777400,92372316000,93911854600 + } + KeyValueFloat: *61 { + a: -0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279,-0.1968279 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent + KeyAttrFlags: *1 { + a: 8456 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 61 + } + } + AnimationCurveNode: 1576509853808, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 1576509849856, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 1576509859424, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 1576509859840, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 1576509855264, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",49.9673621551325 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1576509850064, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 1576509860048, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1576509860256, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 1576509851936, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-25.914660853514 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1576509850272, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.562692191212264 + P: "d|Y", "Number", "", "A",0.562692191212264 + P: "d|Z", "Number", "", "A",0.562692191212264 + } + } + AnimationCurveNode: 1576509850688, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1576509851104, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 1576509851312, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-21.6677753434909 + P: "d|Y", "Number", "", "A",-5.65196117631541 + P: "d|Z", "Number", "", "A",-3.59216243760798 + } + } + AnimationCurveNode: 1576509852144, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.35816151064064 + P: "d|Y", "Number", "", "A",1.35816151064064 + P: "d|Z", "Number", "", "A",1.35816151064064 + } + } + AnimationCurveNode: 1576509852352, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1576509852560, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 1576509852768, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",-1.11734268313033 + P: "d|Y", "Number", "", "A",-1.25043787930813e-14 + P: "d|Z", "Number", "", "A",22.0709433277651 + } + } + AnimationCurveNode: 1576509852976, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.755762993499157 + P: "d|Y", "Number", "", "A",0.755762993499157 + P: "d|Z", "Number", "", "A",0.755762993499157 + } + } + AnimationCurveNode: 1576509854016, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",-0.196827852998066 + } + } + AnimationCurveNode: 1576509853184, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",49.9673621551325 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1576509853600, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 1576509865664, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1576509873776, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",-25.914660853514 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1576509871280, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.562692191212264 + P: "d|Y", "Number", "", "A",0.562692191212264 + P: "d|Z", "Number", "", "A",0.562692191212264 + } + } + AnimationCurveNode: 1576509872112, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-2.54444374517081e-14 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1576509875856, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",60.8625569092076 + P: "d|Y", "Number", "", "A",-10.0444990433374 + P: "d|Z", "Number", "", "A",-6.38388535278768 + } + } + AnimationCurveNode: 1576509864208, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.35816151064064 + P: "d|Y", "Number", "", "A",1.35816151064064 + P: "d|Z", "Number", "", "A",1.35816151064064 + } + } + AnimationCurveNode: 1576509874400, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1576509870032, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",40.7906317360855 + P: "d|Y", "Number", "", "A",4.16147942055801 + P: "d|Z", "Number", "", "A",18.8954741864743 + } + } + AnimationCurveNode: 1576509874816, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.755762993499157 + P: "d|Y", "Number", "", "A",0.755762993499157 + P: "d|Z", "Number", "", "A",0.755762993499157 + } + } + AnimationCurveNode: 1576509875024, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",-0.196827852998066 + } + } + AnimationLayer: 1578216879328, "AnimLayer::BaseLayer", "" { + } + CollectionExclusive: 1578506425392, "DisplayLayer::Slime_002:defaultLayer", "DisplayLayer" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Slime_002:Slime_Body_high, Model::RootNode + C: "OO",1579366806720,0 + + ;Model::Slime_002:grp_Slime, Model::RootNode + C: "OO",1579366781200,0 + + ;Texture::Slime_002:file1, Material::Slime_002:Skin + C: "OP",1577064528896,1576774370288, "DiffuseColor" + + ;Video::Slime_002:file1, Texture::Slime_002:file1 + C: "OO",1577064527936,1577064528896 + + ;Geometry::, Model::Slime_002:Slime_Body_high + C: "OO",1579360673936,1579366806720 + + ;Material::Slime_002:Skin, Model::Slime_002:Slime_Body_high + C: "OO",1576774370288,1579366806720 + + ;NodeAttribute::, Model::Slime_002:grp_Slime + C: "OO",1576471717968,1579366781200 + + ;Model::Slime_002:grp_geo, Model::Slime_002:grp_Slime + C: "OO",1579366788160,1579366781200 + + ;Model::Slime_002:grp_Ctrl, Model::Slime_002:grp_Slime + C: "OO",1579366785840,1579366781200 + + ;Model::Slime_002:grp_joint, Model::Slime_002:grp_Slime + C: "OO",1579366822960,1579366781200 + + ;NodeAttribute::, Model::Slime_002:grp_geo + C: "OO",1576471716384,1579366788160 + + ;Model::Slime_002:Slime_Body_low, Model::Slime_002:grp_geo + C: "OO",1579366813680,1579366788160 + + ;Deformer::, Geometry:: + C: "OO",1578048109360,1579360694320 + + ;Geometry::, Model::Slime_002:Slime_Body_low + C: "OO",1579360694320,1579366813680 + + ;Material::Slime_002:Skin, Model::Slime_002:Slime_Body_low + C: "OO",1576774370288,1579366813680 + + ;NodeAttribute::, Model::Slime_002:grp_Ctrl + C: "OO",1576471718144,1579366785840 + + ;Model::Slime_002:Ctrl_master, Model::Slime_002:grp_Ctrl + C: "OO",1579366795120,1579366785840 + + ;Geometry::, Model::Slime_002:Ctrl_master + C: "OO",1576448317568,1579366795120 + + ;Model::Slime_002:grpCtrl_bottom, Model::Slime_002:Ctrl_master + C: "OO",1579366816000,1579366795120 + + ;Model::Slime_002:grpCtrl_middle, Model::Slime_002:Ctrl_master + C: "OO",1579366802080,1579366795120 + + ;Model::Slime_002:grpCtrl_top, Model::Slime_002:Ctrl_master + C: "OO",1579366790480,1579366795120 + + ;AnimCurveNode::T, Model::Slime_002:Ctrl_master + C: "OP",1576509855264,1579366795120, "Lcl Translation" + + ;AnimCurveNode::R, Model::Slime_002:Ctrl_master + C: "OP",1576509860048,1579366795120, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Slime_002:Ctrl_master + C: "OP",1576509850064,1579366795120, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::Slime_002:Ctrl_master + C: "OP",1576509859840,1579366795120, "Visibility" + + ;NodeAttribute::, Model::Slime_002:grpCtrl_bottom + C: "OO",1576471715328,1579366816000 + + ;Model::Slime_002:Ctrl_bottom, Model::Slime_002:grpCtrl_bottom + C: "OO",1579366797440,1579366816000 + + ;Geometry::, Model::Slime_002:Ctrl_bottom + C: "OO",1576448321728,1579366797440 + + ;AnimCurveNode::T, Model::Slime_002:Ctrl_bottom + C: "OP",1576509851936,1579366797440, "Lcl Translation" + + ;AnimCurveNode::R, Model::Slime_002:Ctrl_bottom + C: "OP",1576509850688,1579366797440, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Slime_002:Ctrl_bottom + C: "OP",1576509850272,1579366797440, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::Slime_002:Ctrl_bottom + C: "OP",1576509860256,1579366797440, "Visibility" + + ;NodeAttribute::, Model::Slime_002:grpCtrl_middle + C: "OO",1576478758688,1579366802080 + + ;Model::Slime_002:Ctrl_middle, Model::Slime_002:grpCtrl_middle + C: "OO",1579366818320,1579366802080 + + ;Geometry::, Model::Slime_002:Ctrl_middle + C: "OO",1576448322048,1579366818320 + + ;AnimCurveNode::T, Model::Slime_002:Ctrl_middle + C: "OP",1576509851312,1579366818320, "Lcl Translation" + + ;AnimCurveNode::R, Model::Slime_002:Ctrl_middle + C: "OP",1576509852352,1579366818320, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Slime_002:Ctrl_middle + C: "OP",1576509852144,1579366818320, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::Slime_002:Ctrl_middle + C: "OP",1576509851104,1579366818320, "Visibility" + + ;NodeAttribute::, Model::Slime_002:grpCtrl_top + C: "OO",1576478760800,1579366790480 + + ;Model::Slime_002:Ctrl_top, Model::Slime_002:grpCtrl_top + C: "OO",1579366820640,1579366790480 + + ;Geometry::, Model::Slime_002:Ctrl_top + C: "OO",1576448327488,1579366820640 + + ;AnimCurveNode::T, Model::Slime_002:Ctrl_top + C: "OP",1576509852768,1579366820640, "Lcl Translation" + + ;AnimCurveNode::R, Model::Slime_002:Ctrl_top + C: "OP",1576509854016,1579366820640, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Slime_002:Ctrl_top + C: "OP",1576509852976,1579366820640, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::Slime_002:Ctrl_top + C: "OP",1576509852560,1579366820640, "Visibility" + + ;NodeAttribute::, Model::Slime_002:grp_joint + C: "OO",1576632422624,1579366822960 + + ;Model::Slime_002:bnd_bottom, Model::Slime_002:grp_joint + C: "OO",1579366825280,1579366822960 + + ;AnimCurveNode::T, Model::Slime_002:grp_joint + C: "OP",1576509853184,1579366822960, "Lcl Translation" + + ;AnimCurveNode::R, Model::Slime_002:grp_joint + C: "OP",1576509865664,1579366822960, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Slime_002:grp_joint + C: "OP",1576509853600,1579366822960, "Lcl Scaling" + + ;NodeAttribute::, Model::Slime_002:bnd_bottom + C: "OO",1578506422896,1579366825280 + + ;Model::Slime_002:bnd_middle, Model::Slime_002:bnd_bottom + C: "OO",1579366829920,1579366825280 + + ;AnimCurveNode::T, Model::Slime_002:bnd_bottom + C: "OP",1576509873776,1579366825280, "Lcl Translation" + + ;AnimCurveNode::R, Model::Slime_002:bnd_bottom + C: "OP",1576509872112,1579366825280, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Slime_002:bnd_bottom + C: "OP",1576509871280,1579366825280, "Lcl Scaling" + + ;AnimCurveNode::lockInfluenceWeights, Model::Slime_002:bnd_bottom + C: "OP",1576509853808,1579366825280, "lockInfluenceWeights" + + ;NodeAttribute::, Model::Slime_002:bnd_middle + C: "OO",1578506416752,1579366829920 + + ;Model::Slime_002:bnd_top, Model::Slime_002:bnd_middle + C: "OO",1579366827600,1579366829920 + + ;AnimCurveNode::T, Model::Slime_002:bnd_middle + C: "OP",1576509875856,1579366829920, "Lcl Translation" + + ;AnimCurveNode::R, Model::Slime_002:bnd_middle + C: "OP",1576509874400,1579366829920, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Slime_002:bnd_middle + C: "OP",1576509864208,1579366829920, "Lcl Scaling" + + ;AnimCurveNode::lockInfluenceWeights, Model::Slime_002:bnd_middle + C: "OP",1576509849856,1579366829920, "lockInfluenceWeights" + + ;NodeAttribute::, Model::Slime_002:bnd_top + C: "OO",1578506423664,1579366827600 + + ;AnimCurveNode::T, Model::Slime_002:bnd_top + C: "OP",1576509870032,1579366827600, "Lcl Translation" + + ;AnimCurveNode::R, Model::Slime_002:bnd_top + C: "OP",1576509875024,1579366827600, "Lcl Rotation" + + ;AnimCurveNode::S, Model::Slime_002:bnd_top + C: "OP",1576509874816,1579366827600, "Lcl Scaling" + + ;AnimCurveNode::lockInfluenceWeights, Model::Slime_002:bnd_top + C: "OP",1576509859424,1579366827600, "lockInfluenceWeights" + + ;SubDeformer::, Deformer:: + C: "OO",1576631375872,1578048109360 + + ;SubDeformer::, Deformer:: + C: "OO",1577962052096,1578048109360 + + ;SubDeformer::, Deformer:: + C: "OO",1576884383712,1578048109360 + + ;Model::Slime_002:bnd_bottom, SubDeformer:: + C: "OO",1579366825280,1576631375872 + + ;Model::Slime_002:bnd_middle, SubDeformer:: + C: "OO",1579366829920,1577962052096 + + ;Model::Slime_002:bnd_top, SubDeformer:: + C: "OO",1579366827600,1576884383712 + + ;AnimLayer::BaseLayer, AnimStack::Idle + C: "OO",1578216879328,1576509862752 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",1576509853808,1578216879328 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",1576509849856,1578216879328 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",1576509859424,1578216879328 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",1576509859840,1578216879328 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1576509855264,1578216879328 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1576509850064,1578216879328 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1576509860048,1578216879328 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",1576509860256,1578216879328 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1576509851936,1578216879328 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1576509850272,1578216879328 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1576509850688,1578216879328 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",1576509851104,1578216879328 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1576509851312,1578216879328 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1576509852144,1578216879328 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1576509852352,1578216879328 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",1576509852560,1578216879328 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1576509852768,1578216879328 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1576509852976,1578216879328 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1576509854016,1578216879328 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1576509853184,1578216879328 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1576509853600,1578216879328 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1576509865664,1578216879328 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1576509873776,1578216879328 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1576509871280,1578216879328 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1576509872112,1578216879328 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1576509875856,1578216879328 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1576509864208,1578216879328 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1576509874400,1578216879328 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1576509870032,1578216879328 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1576509874816,1578216879328 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1576509875024,1578216879328 + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",1576650459696,1576509859840, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650461776,1576509855264, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650462256,1576509855264, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650548656,1576509855264, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650550256,1576509850064, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650550416,1576509850064, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650551536,1576509850064, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650555376,1576509860048, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650545936,1576509860048, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650547856,1576509860048, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",1576650551856,1576509860256, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650457616,1576509851936, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650461616,1576509851936, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650545776,1576509851936, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650552496,1576509850272, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650547216,1576509850272, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650554256,1576509850272, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650552016,1576509850688, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650552176,1576509850688, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650555536,1576509850688, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",1576650552656,1576509851104, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650548336,1576509851312, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650548816,1576509851312, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650552336,1576509851312, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650553136,1576509852144, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650553616,1576509852144, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650555216,1576509852144, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650548976,1576509852352, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650546416,1576509852352, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650549136,1576509852352, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",1576650547376,1576509852560, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650549936,1576509852768, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650553776,1576509852768, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650555056,1576509852768, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650553936,1576509852976, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650546096,1576509852976, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650549296,1576509852976, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650554096,1576509854016, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650554416,1576509854016, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650554576,1576509854016, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650549456,1576509853184, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650554736,1576509853184, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650545456,1576509853184, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650549616,1576509853600, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650545616,1576509853600, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650546256,1576509853600, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650547536,1576509865664, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650546736,1576509865664, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650546896,1576509865664, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650547696,1576509873776, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650560656,1576509873776, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650564656,1576509873776, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650558416,1576509871280, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650559536,1576509871280, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650560496,1576509871280, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650562896,1576509872112, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650562096,1576509872112, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650558896,1576509872112, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650556016,1576509875856, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650556816,1576509875856, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650563856,1576509875856, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650558256,1576509864208, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650562256,1576509864208, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650563376,1576509864208, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650564496,1576509874400, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650564816,1576509874400, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650565456,1576509874400, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650564976,1576509870032, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650558096,1576509870032, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1576650555856,1576509870032, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650557776,1576509874816, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650555696,1576509874816, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1576650556336,1576509874816, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650556176,1576509875024, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650556496,1576509875024, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1576650557456,1576509875024, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Idle" { + FileName: "Idle.tak" + LocalTime: 1539538600,93911854600 + ReferenceTime: 1539538600,93911854600 + } +} diff --git a/modules/ufbx/data/maya_slime_7500_binary.fbx b/modules/ufbx/data/maya_slime_7500_binary.fbx new file mode 100644 index 0000000..6ea10f7 Binary files /dev/null and b/modules/ufbx/data/maya_slime_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_subsurf_3x_cube.obj b/modules/ufbx/data/maya_subsurf_3x_cube.obj new file mode 100644 index 0000000..877da70 --- /dev/null +++ b/modules/ufbx/data/maya_subsurf_3x_cube.obj @@ -0,0 +1,1603 @@ +# ufbx:bad_normals +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -0.250772 -0.250772 0.250772 +v 0.250772 -0.250772 0.250772 +v -0.250772 0.250772 0.250772 +v 0.250772 0.250772 0.250772 +v -0.250772 0.250772 -0.250772 +v 0.250772 0.250772 -0.250772 +v -0.250772 -0.250772 -0.250772 +v 0.250772 -0.250772 -0.250772 +v 0.000000 -0.308946 0.308946 +v 0.000000 0.308946 0.308946 +v 0.000000 0.308946 -0.308946 +v 0.000000 -0.308946 -0.308946 +v -0.308946 0.000000 0.308946 +v 0.308946 0.000000 0.308946 +v -0.308946 0.308946 0.000000 +v 0.308946 0.308946 0.000000 +v -0.308946 0.000000 -0.308946 +v 0.308946 0.000000 -0.308946 +v -0.308946 -0.308946 0.000000 +v 0.308946 -0.308946 0.000000 +v 0.000000 0.000000 0.424588 +v 0.000000 0.424588 0.000000 +v 0.000000 0.000000 -0.424588 +v 0.000000 -0.424588 0.000000 +v 0.424588 0.000000 0.000000 +v -0.424588 0.000000 0.000000 +v -0.148790 -0.289768 0.289768 +v 0.148790 -0.289768 0.289768 +v -0.148790 0.289768 0.289768 +v 0.148790 0.289768 0.289768 +v -0.148790 0.289768 -0.289768 +v 0.148790 0.289768 -0.289768 +v -0.148790 -0.289768 -0.289768 +v 0.148790 -0.289768 -0.289768 +v -0.289768 -0.148790 0.289768 +v -0.289768 0.148790 0.289768 +v 0.289768 -0.148790 0.289768 +v 0.289768 0.148790 0.289768 +v -0.289768 0.289768 0.148790 +v -0.289768 0.289768 -0.148790 +v 0.289768 0.289768 0.148790 +v 0.289768 0.289768 -0.148790 +v -0.289768 0.148790 -0.289768 +v -0.289768 -0.148790 -0.289768 +v 0.289768 0.148790 -0.289768 +v 0.289768 -0.148790 -0.289768 +v -0.289768 -0.289768 -0.148790 +v -0.289768 -0.289768 0.148790 +v 0.289768 -0.289768 -0.148790 +v 0.289768 -0.289768 0.148790 +v 0.000000 -0.168742 0.395576 +v 0.168742 0.000000 0.395576 +v 0.000000 0.168742 0.395576 +v -0.168742 0.000000 0.395576 +v 0.000000 0.395576 0.168742 +v 0.168742 0.395576 0.000000 +v 0.000000 0.395576 -0.168742 +v -0.168742 0.395576 0.000000 +v 0.000000 0.168742 -0.395576 +v 0.168742 0.000000 -0.395576 +v 0.000000 -0.168742 -0.395576 +v -0.168742 0.000000 -0.395576 +v 0.000000 -0.395576 -0.168742 +v 0.168742 -0.395576 0.000000 +v 0.000000 -0.395576 0.168742 +v -0.168742 -0.395576 0.000000 +v 0.395576 -0.168742 0.000000 +v 0.395576 0.000000 -0.168742 +v 0.395576 0.168742 0.000000 +v 0.395576 0.000000 0.168742 +v -0.395576 -0.168742 0.000000 +v -0.395576 0.000000 0.168742 +v -0.395576 0.168742 0.000000 +v -0.395576 0.000000 -0.168742 +v 0.159476 -0.159476 0.368711 +v 0.159476 0.159476 0.368711 +v -0.159476 0.159476 0.368711 +v -0.159476 -0.159476 0.368711 +v 0.159476 0.368711 0.159476 +v 0.159476 0.368711 -0.159476 +v -0.159476 0.368711 -0.159476 +v -0.159476 0.368711 0.159476 +v 0.159476 0.159476 -0.368711 +v 0.159476 -0.159476 -0.368711 +v -0.159476 -0.159476 -0.368711 +v -0.159476 0.159476 -0.368711 +v 0.159476 -0.368711 -0.159476 +v 0.159476 -0.368711 0.159476 +v -0.159476 -0.368711 0.159476 +v -0.159476 -0.368711 -0.159476 +v 0.368711 -0.159476 -0.159476 +v 0.368711 0.159476 -0.159476 +v 0.368711 0.159476 0.159476 +v 0.368711 -0.159476 0.159476 +v -0.368711 -0.159476 0.159476 +v -0.368711 0.159476 0.159476 +v -0.368711 0.159476 -0.159476 +v -0.368711 -0.159476 -0.159476 +v -0.209961 -0.270020 0.270020 +v -0.077040 -0.303548 0.303548 +v 0.077040 -0.303548 0.303548 +v 0.209961 -0.270020 0.270020 +v -0.209961 0.270020 0.270020 +v -0.077040 0.303548 0.303548 +v 0.077040 0.303548 0.303548 +v 0.209961 0.270020 0.270020 +v -0.209961 0.270020 -0.270020 +v -0.077040 0.303548 -0.303548 +v 0.077040 0.303548 -0.303548 +v 0.209961 0.270020 -0.270020 +v -0.209961 -0.270020 -0.270020 +v -0.077040 -0.303548 -0.303548 +v 0.077040 -0.303548 -0.303548 +v 0.209961 -0.270020 -0.270020 +v -0.270020 -0.209961 0.270020 +v -0.303548 -0.077040 0.303548 +v -0.303548 0.077040 0.303548 +v -0.270020 0.209961 0.270020 +v 0.270020 -0.209961 0.270020 +v 0.303548 -0.077040 0.303548 +v 0.303548 0.077040 0.303548 +v 0.270020 0.209961 0.270020 +v -0.270020 0.270020 0.209961 +v -0.303548 0.303548 0.077040 +v -0.303548 0.303548 -0.077040 +v -0.270020 0.270020 -0.209961 +v 0.270020 0.270020 0.209961 +v 0.303548 0.303548 0.077040 +v 0.303548 0.303548 -0.077040 +v 0.270020 0.270020 -0.209961 +v -0.270020 0.209961 -0.270020 +v -0.303548 0.077040 -0.303548 +v -0.303548 -0.077040 -0.303548 +v -0.270020 -0.209961 -0.270020 +v 0.270020 0.209961 -0.270020 +v 0.303548 0.077040 -0.303548 +v 0.303548 -0.077040 -0.303548 +v 0.270020 -0.209961 -0.270020 +v -0.270020 -0.270020 -0.209961 +v -0.303548 -0.303548 -0.077040 +v -0.303548 -0.303548 0.077040 +v -0.270020 -0.270020 0.209961 +v 0.270020 -0.270020 -0.209961 +v 0.303548 -0.303548 -0.077040 +v 0.303548 -0.303548 0.077040 +v 0.270020 -0.270020 0.209961 +v 0.000000 -0.086155 0.417318 +v 0.000000 -0.244195 0.359429 +v 0.086155 0.000000 0.417318 +v 0.244195 0.000000 0.359429 +v 0.000000 0.086155 0.417318 +v 0.000000 0.244195 0.359429 +v -0.086155 0.000000 0.417318 +v -0.244195 0.000000 0.359429 +v 0.000000 0.417318 0.086155 +v 0.000000 0.359429 0.244195 +v 0.086155 0.417318 0.000000 +v 0.244195 0.359429 0.000000 +v 0.000000 0.417318 -0.086155 +v 0.000000 0.359429 -0.244195 +v -0.086155 0.417318 0.000000 +v -0.244195 0.359429 0.000000 +v 0.000000 0.086155 -0.417318 +v 0.000000 0.244195 -0.359429 +v 0.086155 0.000000 -0.417318 +v 0.244195 0.000000 -0.359429 +v 0.000000 -0.086155 -0.417318 +v 0.000000 -0.244195 -0.359429 +v -0.086155 0.000000 -0.417318 +v -0.244195 0.000000 -0.359429 +v 0.000000 -0.417318 -0.086155 +v 0.000000 -0.359429 -0.244195 +v 0.086155 -0.417318 0.000000 +v 0.244195 -0.359429 0.000000 +v 0.000000 -0.417318 0.086155 +v 0.000000 -0.359429 0.244195 +v -0.086155 -0.417318 0.000000 +v -0.244195 -0.359429 0.000000 +v 0.417318 -0.086155 0.000000 +v 0.359429 -0.244195 0.000000 +v 0.417318 0.000000 -0.086155 +v 0.359429 0.000000 -0.244195 +v 0.417318 0.086155 0.000000 +v 0.359429 0.244195 0.000000 +v 0.417318 0.000000 0.086155 +v 0.359429 0.000000 0.244195 +v -0.417318 -0.086155 0.000000 +v -0.359429 -0.244195 0.000000 +v -0.417318 0.000000 0.086155 +v -0.359429 0.000000 0.244195 +v -0.417318 0.086155 0.000000 +v -0.359429 0.244195 0.000000 +v -0.417318 0.000000 -0.086155 +v -0.359429 0.000000 -0.244195 +v 0.152470 -0.229917 0.335874 +v 0.229917 -0.152470 0.335874 +v 0.165771 -0.081597 0.388753 +v 0.081597 -0.165771 0.388753 +v 0.229917 0.152470 0.335874 +v 0.152470 0.229917 0.335874 +v 0.081597 0.165771 0.388753 +v 0.165771 0.081597 0.388753 +v -0.152470 0.229917 0.335874 +v -0.229917 0.152470 0.335874 +v -0.165771 0.081597 0.388753 +v -0.081597 0.165771 0.388753 +v -0.229917 -0.152470 0.335874 +v -0.152470 -0.229917 0.335874 +v -0.081597 -0.165771 0.388753 +v -0.165771 -0.081597 0.388753 +v 0.152470 0.335874 0.229917 +v 0.229917 0.335874 0.152470 +v 0.165771 0.388753 0.081597 +v 0.081597 0.388753 0.165771 +v 0.229917 0.335874 -0.152470 +v 0.152470 0.335874 -0.229917 +v 0.081597 0.388753 -0.165771 +v 0.165771 0.388753 -0.081597 +v -0.152470 0.335874 -0.229917 +v -0.229917 0.335874 -0.152470 +v -0.165771 0.388753 -0.081597 +v -0.081597 0.388753 -0.165771 +v -0.229917 0.335874 0.152470 +v -0.152470 0.335874 0.229917 +v -0.081597 0.388753 0.165771 +v -0.165771 0.388753 0.081597 +v 0.152470 0.229917 -0.335874 +v 0.229917 0.152470 -0.335874 +v 0.165771 0.081597 -0.388753 +v 0.081597 0.165771 -0.388753 +v 0.229917 -0.152470 -0.335874 +v 0.152470 -0.229917 -0.335874 +v 0.081597 -0.165771 -0.388753 +v 0.165771 -0.081597 -0.388753 +v -0.152470 -0.229917 -0.335874 +v -0.229917 -0.152470 -0.335874 +v -0.165771 -0.081597 -0.388753 +v -0.081597 -0.165771 -0.388753 +v -0.229917 0.152470 -0.335874 +v -0.152470 0.229917 -0.335874 +v -0.081597 0.165771 -0.388753 +v -0.165771 0.081597 -0.388753 +v 0.152470 -0.335874 -0.229917 +v 0.229917 -0.335874 -0.152470 +v 0.165771 -0.388753 -0.081597 +v 0.081597 -0.388753 -0.165771 +v 0.229917 -0.335874 0.152470 +v 0.152470 -0.335874 0.229917 +v 0.081597 -0.388753 0.165771 +v 0.165771 -0.388753 0.081597 +v -0.152470 -0.335874 0.229917 +v -0.229917 -0.335874 0.152470 +v -0.165771 -0.388753 0.081597 +v -0.081597 -0.388753 0.165771 +v -0.229917 -0.335874 -0.152470 +v -0.152470 -0.335874 -0.229917 +v -0.081597 -0.388753 -0.165771 +v -0.165771 -0.388753 -0.081597 +v 0.335874 -0.229917 -0.152470 +v 0.335874 -0.152470 -0.229917 +v 0.388753 -0.081597 -0.165771 +v 0.388753 -0.165771 -0.081597 +v 0.335874 0.152470 -0.229917 +v 0.335874 0.229917 -0.152470 +v 0.388753 0.165771 -0.081597 +v 0.388753 0.081597 -0.165771 +v 0.335874 0.229917 0.152470 +v 0.335874 0.152470 0.229917 +v 0.388753 0.081597 0.165771 +v 0.388753 0.165771 0.081597 +v 0.335874 -0.152470 0.229917 +v 0.335874 -0.229917 0.152470 +v 0.388753 -0.165771 0.081597 +v 0.388753 -0.081597 0.165771 +v -0.335874 -0.229917 0.152470 +v -0.335874 -0.152470 0.229917 +v -0.388753 -0.081597 0.165771 +v -0.388753 -0.165771 0.081597 +v -0.335874 0.152470 0.229917 +v -0.335874 0.229917 0.152470 +v -0.388753 0.165771 0.081597 +v -0.388753 0.081597 0.165771 +v -0.335874 0.229917 -0.152470 +v -0.335874 0.152470 -0.229917 +v -0.388753 0.081597 -0.165771 +v -0.388753 0.165771 -0.081597 +v -0.335874 -0.152470 -0.229917 +v -0.335874 -0.229917 -0.152470 +v -0.388753 -0.165771 -0.081597 +v -0.388753 -0.081597 -0.165771 +v 0.217086 -0.217086 0.308883 +v 0.239909 -0.078559 0.353190 +v 0.084635 -0.084635 0.410156 +v 0.078559 -0.239909 0.353190 +v 0.217086 0.217086 0.308883 +v 0.078559 0.239909 0.353190 +v 0.084635 0.084635 0.410156 +v 0.239909 0.078559 0.353190 +v -0.217086 0.217086 0.308883 +v -0.239909 0.078559 0.353190 +v -0.084635 0.084635 0.410156 +v -0.078559 0.239909 0.353190 +v -0.217086 -0.217086 0.308883 +v -0.078559 -0.239909 0.353190 +v -0.084635 -0.084635 0.410156 +v -0.239909 -0.078559 0.353190 +v 0.217086 0.308883 0.217086 +v 0.239909 0.353190 0.078559 +v 0.084635 0.410156 0.084635 +v 0.078559 0.353190 0.239909 +v 0.217086 0.308883 -0.217086 +v 0.078559 0.353190 -0.239909 +v 0.084635 0.410156 -0.084635 +v 0.239909 0.353190 -0.078559 +v -0.217086 0.308883 -0.217086 +v -0.239909 0.353190 -0.078559 +v -0.084635 0.410156 -0.084635 +v -0.078559 0.353190 -0.239909 +v -0.217086 0.308883 0.217086 +v -0.078559 0.353190 0.239909 +v -0.084635 0.410156 0.084635 +v -0.239909 0.353190 0.078559 +v 0.217086 0.217086 -0.308883 +v 0.239909 0.078559 -0.353190 +v 0.084635 0.084635 -0.410156 +v 0.078559 0.239909 -0.353190 +v 0.217086 -0.217086 -0.308883 +v 0.078559 -0.239909 -0.353190 +v 0.084635 -0.084635 -0.410156 +v 0.239909 -0.078559 -0.353190 +v -0.217086 -0.217086 -0.308883 +v -0.239909 -0.078559 -0.353190 +v -0.084635 -0.084635 -0.410156 +v -0.078559 -0.239909 -0.353190 +v -0.217086 0.217086 -0.308883 +v -0.078559 0.239909 -0.353190 +v -0.084635 0.084635 -0.410156 +v -0.239909 0.078559 -0.353190 +v 0.217086 -0.308883 -0.217086 +v 0.239909 -0.353190 -0.078559 +v 0.084635 -0.410156 -0.084635 +v 0.078559 -0.353190 -0.239909 +v 0.217086 -0.308883 0.217086 +v 0.078559 -0.353190 0.239909 +v 0.084635 -0.410156 0.084635 +v 0.239909 -0.353190 0.078559 +v -0.217086 -0.308883 0.217086 +v -0.239909 -0.353190 0.078559 +v -0.084635 -0.410156 0.084635 +v -0.078559 -0.353190 0.239909 +v -0.217086 -0.308883 -0.217086 +v -0.078559 -0.353190 -0.239909 +v -0.084635 -0.410156 -0.084635 +v -0.239909 -0.353190 -0.078559 +v 0.308883 -0.217086 -0.217086 +v 0.353190 -0.078559 -0.239909 +v 0.410156 -0.084635 -0.084635 +v 0.353190 -0.239909 -0.078559 +v 0.308883 0.217086 -0.217086 +v 0.353190 0.239909 -0.078559 +v 0.410156 0.084635 -0.084635 +v 0.353190 0.078559 -0.239909 +v 0.308883 0.217086 0.217086 +v 0.353190 0.078559 0.239909 +v 0.410156 0.084635 0.084635 +v 0.353190 0.239909 0.078559 +v 0.308883 -0.217086 0.217086 +v 0.353190 -0.239909 0.078559 +v 0.410156 -0.084635 0.084635 +v 0.353190 -0.078559 0.239909 +v -0.308883 -0.217086 0.217086 +v -0.353190 -0.078559 0.239909 +v -0.410156 -0.084635 0.084635 +v -0.353190 -0.239909 0.078559 +v -0.308883 0.217086 0.217086 +v -0.353190 0.239909 0.078559 +v -0.410156 0.084635 0.084635 +v -0.353190 0.078559 0.239909 +v -0.308883 0.217086 -0.217086 +v -0.353190 0.078559 -0.239909 +v -0.410156 0.084635 -0.084635 +v -0.353190 0.239909 -0.078559 +v -0.308883 -0.217086 -0.217086 +v -0.353190 -0.239909 -0.078559 +v -0.410156 -0.084635 -0.084635 +v -0.353190 -0.078559 -0.239909 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.500000 0.125000 +vt 0.500000 0.375000 +vt 0.500000 0.625000 +vt 0.500000 0.875000 +vt 0.750000 0.125000 +vt 0.250000 0.125000 +vt 0.500000 0.000000 +vt 0.625000 0.125000 +vt 0.500000 0.250000 +vt 0.375000 0.125000 +vt 0.625000 0.375000 +vt 0.500000 0.500000 +vt 0.375000 0.375000 +vt 0.625000 0.625000 +vt 0.500000 0.750000 +vt 0.375000 0.625000 +vt 0.625000 0.875000 +vt 0.500000 1.000000 +vt 0.375000 0.875000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.250000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.125000 0.125000 +vt 0.562500 0.062500 +vt 0.562500 0.187500 +vt 0.437500 0.187500 +vt 0.437500 0.062500 +vt 0.562500 0.312500 +vt 0.562500 0.437500 +vt 0.437500 0.437500 +vt 0.437500 0.312500 +vt 0.562500 0.562500 +vt 0.562500 0.687500 +vt 0.437500 0.687500 +vt 0.437500 0.562500 +vt 0.562500 0.812500 +vt 0.562500 0.937500 +vt 0.437500 0.937500 +vt 0.437500 0.812500 +vt 0.812500 0.062500 +vt 0.812500 0.187500 +vt 0.687500 0.187500 +vt 0.687500 0.062500 +vt 0.312500 0.062500 +vt 0.312500 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.062500 +vt 0.562500 0.000000 +vt 0.625000 0.062500 +vt 0.562500 0.125000 +vt 0.500000 0.062500 +vt 0.625000 0.187500 +vt 0.562500 0.250000 +vt 0.500000 0.187500 +vt 0.437500 0.250000 +vt 0.375000 0.187500 +vt 0.437500 0.125000 +vt 0.375000 0.062500 +vt 0.437500 0.000000 +vt 0.625000 0.312500 +vt 0.562500 0.375000 +vt 0.500000 0.312500 +vt 0.625000 0.437500 +vt 0.562500 0.500000 +vt 0.500000 0.437500 +vt 0.437500 0.500000 +vt 0.375000 0.437500 +vt 0.437500 0.375000 +vt 0.375000 0.312500 +vt 0.625000 0.562500 +vt 0.562500 0.625000 +vt 0.500000 0.562500 +vt 0.625000 0.687500 +vt 0.562500 0.750000 +vt 0.500000 0.687500 +vt 0.437500 0.750000 +vt 0.375000 0.687500 +vt 0.437500 0.625000 +vt 0.375000 0.562500 +vt 0.625000 0.812500 +vt 0.562500 0.875000 +vt 0.500000 0.812500 +vt 0.625000 0.937500 +vt 0.562500 1.000000 +vt 0.500000 0.937500 +vt 0.437500 1.000000 +vt 0.375000 0.937500 +vt 0.437500 0.875000 +vt 0.375000 0.812500 +vt 0.812500 0.000000 +vt 0.875000 0.062500 +vt 0.812500 0.125000 +vt 0.750000 0.062500 +vt 0.875000 0.187500 +vt 0.812500 0.250000 +vt 0.750000 0.187500 +vt 0.687500 0.250000 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.125000 +vt 0.250000 0.062500 +vt 0.312500 0.250000 +vt 0.250000 0.187500 +vt 0.187500 0.250000 +vt 0.125000 0.187500 +vt 0.187500 0.125000 +vt 0.125000 0.062500 +vt 0.187500 0.000000 +vt 0.593750 0.031250 +vt 0.593750 0.093750 +vt 0.531250 0.093750 +vt 0.531250 0.031250 +vt 0.593750 0.218750 +vt 0.531250 0.218750 +vt 0.531250 0.156250 +vt 0.593750 0.156250 +vt 0.406250 0.218750 +vt 0.406250 0.156250 +vt 0.468750 0.156250 +vt 0.468750 0.218750 +vt 0.406250 0.031250 +vt 0.468750 0.031250 +vt 0.468750 0.093750 +vt 0.406250 0.093750 +vt 0.593750 0.281250 +vt 0.593750 0.343750 +vt 0.531250 0.343750 +vt 0.531250 0.281250 +vt 0.593750 0.468750 +vt 0.531250 0.468750 +vt 0.531250 0.406250 +vt 0.593750 0.406250 +vt 0.406250 0.468750 +vt 0.406250 0.406250 +vt 0.468750 0.406250 +vt 0.468750 0.468750 +vt 0.406250 0.281250 +vt 0.468750 0.281250 +vt 0.468750 0.343750 +vt 0.406250 0.343750 +vt 0.593750 0.531250 +vt 0.593750 0.593750 +vt 0.531250 0.593750 +vt 0.531250 0.531250 +vt 0.593750 0.718750 +vt 0.531250 0.718750 +vt 0.531250 0.656250 +vt 0.593750 0.656250 +vt 0.406250 0.718750 +vt 0.406250 0.656250 +vt 0.468750 0.656250 +vt 0.468750 0.718750 +vt 0.406250 0.531250 +vt 0.468750 0.531250 +vt 0.468750 0.593750 +vt 0.406250 0.593750 +vt 0.593750 0.781250 +vt 0.593750 0.843750 +vt 0.531250 0.843750 +vt 0.531250 0.781250 +vt 0.593750 0.968750 +vt 0.531250 0.968750 +vt 0.531250 0.906250 +vt 0.593750 0.906250 +vt 0.406250 0.968750 +vt 0.406250 0.906250 +vt 0.468750 0.906250 +vt 0.468750 0.968750 +vt 0.406250 0.781250 +vt 0.468750 0.781250 +vt 0.468750 0.843750 +vt 0.406250 0.843750 +vt 0.843750 0.031250 +vt 0.843750 0.093750 +vt 0.781250 0.093750 +vt 0.781250 0.031250 +vt 0.843750 0.218750 +vt 0.781250 0.218750 +vt 0.781250 0.156250 +vt 0.843750 0.156250 +vt 0.656250 0.218750 +vt 0.656250 0.156250 +vt 0.718750 0.156250 +vt 0.718750 0.218750 +vt 0.656250 0.031250 +vt 0.718750 0.031250 +vt 0.718750 0.093750 +vt 0.656250 0.093750 +vt 0.343750 0.031250 +vt 0.343750 0.093750 +vt 0.281250 0.093750 +vt 0.281250 0.031250 +vt 0.343750 0.218750 +vt 0.281250 0.218750 +vt 0.281250 0.156250 +vt 0.343750 0.156250 +vt 0.156250 0.218750 +vt 0.156250 0.156250 +vt 0.218750 0.156250 +vt 0.218750 0.218750 +vt 0.156250 0.031250 +vt 0.218750 0.031250 +vt 0.218750 0.093750 +vt 0.156250 0.093750 +vt 0.593750 0.000000 +vt 0.625000 0.031250 +vt 0.593750 0.062500 +vt 0.562500 0.031250 +vt 0.625000 0.093750 +vt 0.593750 0.125000 +vt 0.562500 0.093750 +vt 0.531250 0.125000 +vt 0.500000 0.093750 +vt 0.531250 0.062500 +vt 0.500000 0.031250 +vt 0.531250 0.000000 +vt 0.625000 0.218750 +vt 0.593750 0.250000 +vt 0.562500 0.218750 +vt 0.593750 0.187500 +vt 0.531250 0.250000 +vt 0.500000 0.218750 +vt 0.531250 0.187500 +vt 0.500000 0.156250 +vt 0.562500 0.156250 +vt 0.625000 0.156250 +vt 0.406250 0.250000 +vt 0.375000 0.218750 +vt 0.406250 0.187500 +vt 0.437500 0.218750 +vt 0.375000 0.156250 +vt 0.406250 0.125000 +vt 0.437500 0.156250 +vt 0.468750 0.125000 +vt 0.468750 0.187500 +vt 0.468750 0.250000 +vt 0.375000 0.031250 +vt 0.406250 0.000000 +vt 0.437500 0.031250 +vt 0.406250 0.062500 +vt 0.468750 0.000000 +vt 0.468750 0.062500 +vt 0.437500 0.093750 +vt 0.375000 0.093750 +vt 0.625000 0.281250 +vt 0.593750 0.312500 +vt 0.562500 0.281250 +vt 0.625000 0.343750 +vt 0.593750 0.375000 +vt 0.562500 0.343750 +vt 0.531250 0.375000 +vt 0.500000 0.343750 +vt 0.531250 0.312500 +vt 0.500000 0.281250 +vt 0.625000 0.468750 +vt 0.593750 0.500000 +vt 0.562500 0.468750 +vt 0.593750 0.437500 +vt 0.531250 0.500000 +vt 0.500000 0.468750 +vt 0.531250 0.437500 +vt 0.500000 0.406250 +vt 0.562500 0.406250 +vt 0.625000 0.406250 +vt 0.406250 0.500000 +vt 0.375000 0.468750 +vt 0.406250 0.437500 +vt 0.437500 0.468750 +vt 0.375000 0.406250 +vt 0.406250 0.375000 +vt 0.437500 0.406250 +vt 0.468750 0.375000 +vt 0.468750 0.437500 +vt 0.468750 0.500000 +vt 0.375000 0.281250 +vt 0.437500 0.281250 +vt 0.406250 0.312500 +vt 0.468750 0.312500 +vt 0.437500 0.343750 +vt 0.375000 0.343750 +vt 0.625000 0.531250 +vt 0.593750 0.562500 +vt 0.562500 0.531250 +vt 0.625000 0.593750 +vt 0.593750 0.625000 +vt 0.562500 0.593750 +vt 0.531250 0.625000 +vt 0.500000 0.593750 +vt 0.531250 0.562500 +vt 0.500000 0.531250 +vt 0.625000 0.718750 +vt 0.593750 0.750000 +vt 0.562500 0.718750 +vt 0.593750 0.687500 +vt 0.531250 0.750000 +vt 0.500000 0.718750 +vt 0.531250 0.687500 +vt 0.500000 0.656250 +vt 0.562500 0.656250 +vt 0.625000 0.656250 +vt 0.406250 0.750000 +vt 0.375000 0.718750 +vt 0.406250 0.687500 +vt 0.437500 0.718750 +vt 0.375000 0.656250 +vt 0.406250 0.625000 +vt 0.437500 0.656250 +vt 0.468750 0.625000 +vt 0.468750 0.687500 +vt 0.468750 0.750000 +vt 0.375000 0.531250 +vt 0.437500 0.531250 +vt 0.406250 0.562500 +vt 0.468750 0.562500 +vt 0.437500 0.593750 +vt 0.375000 0.593750 +vt 0.625000 0.781250 +vt 0.593750 0.812500 +vt 0.562500 0.781250 +vt 0.625000 0.843750 +vt 0.593750 0.875000 +vt 0.562500 0.843750 +vt 0.531250 0.875000 +vt 0.500000 0.843750 +vt 0.531250 0.812500 +vt 0.500000 0.781250 +vt 0.625000 0.968750 +vt 0.593750 1.000000 +vt 0.562500 0.968750 +vt 0.593750 0.937500 +vt 0.531250 1.000000 +vt 0.500000 0.968750 +vt 0.531250 0.937500 +vt 0.500000 0.906250 +vt 0.562500 0.906250 +vt 0.625000 0.906250 +vt 0.406250 1.000000 +vt 0.375000 0.968750 +vt 0.406250 0.937500 +vt 0.437500 0.968750 +vt 0.375000 0.906250 +vt 0.406250 0.875000 +vt 0.437500 0.906250 +vt 0.468750 0.875000 +vt 0.468750 0.937500 +vt 0.468750 1.000000 +vt 0.375000 0.781250 +vt 0.437500 0.781250 +vt 0.406250 0.812500 +vt 0.468750 0.812500 +vt 0.437500 0.843750 +vt 0.375000 0.843750 +vt 0.843750 0.000000 +vt 0.875000 0.031250 +vt 0.843750 0.062500 +vt 0.812500 0.031250 +vt 0.875000 0.093750 +vt 0.843750 0.125000 +vt 0.812500 0.093750 +vt 0.781250 0.125000 +vt 0.750000 0.093750 +vt 0.781250 0.062500 +vt 0.750000 0.031250 +vt 0.781250 0.000000 +vt 0.875000 0.218750 +vt 0.843750 0.250000 +vt 0.812500 0.218750 +vt 0.843750 0.187500 +vt 0.781250 0.250000 +vt 0.750000 0.218750 +vt 0.781250 0.187500 +vt 0.750000 0.156250 +vt 0.812500 0.156250 +vt 0.875000 0.156250 +vt 0.656250 0.250000 +vt 0.656250 0.187500 +vt 0.687500 0.218750 +vt 0.656250 0.125000 +vt 0.687500 0.156250 +vt 0.718750 0.125000 +vt 0.718750 0.187500 +vt 0.718750 0.250000 +vt 0.656250 0.000000 +vt 0.687500 0.031250 +vt 0.656250 0.062500 +vt 0.718750 0.000000 +vt 0.718750 0.062500 +vt 0.687500 0.093750 +vt 0.343750 0.000000 +vt 0.343750 0.062500 +vt 0.312500 0.031250 +vt 0.343750 0.125000 +vt 0.312500 0.093750 +vt 0.281250 0.125000 +vt 0.250000 0.093750 +vt 0.281250 0.062500 +vt 0.250000 0.031250 +vt 0.281250 0.000000 +vt 0.343750 0.250000 +vt 0.312500 0.218750 +vt 0.343750 0.187500 +vt 0.281250 0.250000 +vt 0.250000 0.218750 +vt 0.281250 0.187500 +vt 0.250000 0.156250 +vt 0.312500 0.156250 +vt 0.156250 0.250000 +vt 0.125000 0.218750 +vt 0.156250 0.187500 +vt 0.187500 0.218750 +vt 0.125000 0.156250 +vt 0.156250 0.125000 +vt 0.187500 0.156250 +vt 0.218750 0.125000 +vt 0.218750 0.187500 +vt 0.218750 0.250000 +vt 0.125000 0.031250 +vt 0.156250 0.000000 +vt 0.187500 0.031250 +vt 0.156250 0.062500 +vt 0.218750 0.000000 +vt 0.218750 0.062500 +vt 0.187500 0.093750 +vt 0.125000 0.093750 +vn 0.461261 -0.627391 0.627391 +vn 0.577350 -0.577350 0.577350 +vn 0.627391 -0.461261 0.627391 +vn 0.479664 -0.479663 0.734742 +vn 0.668221 -0.327049 0.668221 +vn 0.504570 -0.330991 0.797405 +vn 0.337959 -0.337959 0.878389 +vn 0.330991 -0.504570 0.797405 +vn 0.327049 -0.668221 0.668221 +vn 0.696231 -0.174714 0.696231 +vn 0.707107 0.000000 0.707107 +vn 0.525865 0.000000 0.850568 +vn 0.519728 -0.174230 0.836377 +vn 0.344367 0.000000 0.938835 +vn 0.342552 -0.172616 0.923505 +vn 0.169789 -0.000000 0.985481 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.169789 0.985480 +vn 0.170583 -0.170583 0.970465 +vn -0.000000 -0.344367 0.938835 +vn 0.172616 -0.342552 0.923505 +vn -0.000000 -0.525865 0.850568 +vn -0.000000 -0.707107 0.707107 +vn 0.174713 -0.696231 0.696231 +vn 0.174230 -0.519728 0.836377 +vn 0.627391 0.461261 0.627391 +vn 0.577350 0.577350 0.577350 +vn 0.461261 0.627391 0.627391 +vn 0.479663 0.479664 0.734742 +vn 0.327049 0.668221 0.668221 +vn 0.330991 0.504570 0.797405 +vn 0.337959 0.337959 0.878389 +vn 0.504570 0.330991 0.797405 +vn 0.668221 0.327049 0.668221 +vn 0.174714 0.696231 0.696231 +vn 0.000000 0.707107 0.707107 +vn 0.000000 0.525865 0.850568 +vn 0.174230 0.519728 0.836377 +vn 0.000000 0.344367 0.938835 +vn 0.172616 0.342552 0.923505 +vn 0.000000 0.169789 0.985481 +vn 0.170583 0.170583 0.970465 +vn 0.342552 0.172616 0.923505 +vn 0.696231 0.174713 0.696231 +vn 0.519728 0.174230 0.836377 +vn -0.461261 0.627391 0.627391 +vn -0.577350 0.577350 0.577350 +vn -0.627391 0.461261 0.627391 +vn -0.479664 0.479663 0.734742 +vn -0.668221 0.327049 0.668221 +vn -0.504570 0.330991 0.797405 +vn -0.337959 0.337959 0.878389 +vn -0.330991 0.504570 0.797405 +vn -0.327049 0.668221 0.668221 +vn -0.696231 0.174714 0.696231 +vn -0.707107 -0.000000 0.707107 +vn -0.525865 -0.000000 0.850568 +vn -0.519728 0.174230 0.836377 +vn -0.344367 -0.000000 0.938835 +vn -0.342552 0.172616 0.923505 +vn -0.169789 0.000000 0.985481 +vn -0.170583 0.170583 0.970465 +vn -0.172616 0.342552 0.923505 +vn -0.174713 0.696231 0.696231 +vn -0.174230 0.519728 0.836377 +vn -0.627391 -0.461261 0.627391 +vn -0.577350 -0.577350 0.577350 +vn -0.461261 -0.627391 0.627391 +vn -0.479663 -0.479664 0.734742 +vn -0.327049 -0.668221 0.668221 +vn -0.330991 -0.504570 0.797405 +vn -0.337959 -0.337959 0.878389 +vn -0.504570 -0.330991 0.797405 +vn -0.668221 -0.327049 0.668221 +vn -0.174714 -0.696231 0.696231 +vn -0.174230 -0.519728 0.836377 +vn -0.172616 -0.342552 0.923505 +vn -0.170583 -0.170583 0.970465 +vn -0.342552 -0.172616 0.923505 +vn -0.696231 -0.174713 0.696231 +vn -0.519728 -0.174230 0.836377 +vn 0.627391 0.627391 0.461261 +vn 0.479663 0.734742 0.479664 +vn 0.668221 0.668221 0.327049 +vn 0.504570 0.797405 0.330991 +vn 0.337959 0.878389 0.337959 +vn 0.330991 0.797405 0.504570 +vn 0.696231 0.696231 0.174714 +vn 0.707107 0.707107 0.000000 +vn 0.525865 0.850568 0.000000 +vn 0.519728 0.836377 0.174230 +vn 0.344367 0.938835 0.000000 +vn 0.342552 0.923505 0.172616 +vn 0.169789 0.985480 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.000000 0.985481 0.169789 +vn 0.170583 0.970465 0.170583 +vn -0.000000 0.938835 0.344367 +vn 0.172616 0.923505 0.342552 +vn 0.000000 0.850568 0.525865 +vn 0.174230 0.836377 0.519728 +vn 0.627391 0.627391 -0.461261 +vn 0.577350 0.577350 -0.577350 +vn 0.461261 0.627391 -0.627391 +vn 0.479663 0.734742 -0.479664 +vn 0.327049 0.668221 -0.668221 +vn 0.330991 0.797405 -0.504570 +vn 0.337959 0.878389 -0.337959 +vn 0.504570 0.797405 -0.330991 +vn 0.668221 0.668221 -0.327049 +vn 0.174714 0.696231 -0.696231 +vn -0.000000 0.707107 -0.707107 +vn -0.000000 0.850568 -0.525865 +vn 0.174230 0.836377 -0.519728 +vn -0.000000 0.938835 -0.344367 +vn 0.172616 0.923505 -0.342552 +vn 0.000000 0.985481 -0.169789 +vn 0.170583 0.970465 -0.170583 +vn 0.342552 0.923505 -0.172616 +vn 0.696231 0.696231 -0.174713 +vn 0.519728 0.836377 -0.174230 +vn -0.461261 0.627391 -0.627391 +vn -0.577350 0.577350 -0.577350 +vn -0.627391 0.627391 -0.461261 +vn -0.479664 0.734742 -0.479663 +vn -0.668221 0.668221 -0.327049 +vn -0.504570 0.797405 -0.330991 +vn -0.337959 0.878389 -0.337959 +vn -0.330991 0.797405 -0.504570 +vn -0.327049 0.668221 -0.668221 +vn -0.696231 0.696231 -0.174714 +vn -0.707107 0.707107 -0.000000 +vn -0.525865 0.850568 -0.000000 +vn -0.519728 0.836377 -0.174230 +vn -0.344367 0.938835 -0.000000 +vn -0.342552 0.923505 -0.172616 +vn -0.169789 0.985480 -0.000000 +vn -0.170583 0.970465 -0.170583 +vn -0.172616 0.923505 -0.342552 +vn -0.174713 0.696231 -0.696231 +vn -0.174230 0.836377 -0.519728 +vn -0.627391 0.627391 0.461261 +vn -0.479664 0.734742 0.479663 +vn -0.330991 0.797405 0.504570 +vn -0.337959 0.878389 0.337959 +vn -0.504570 0.797405 0.330991 +vn -0.668221 0.668221 0.327049 +vn -0.174230 0.836377 0.519728 +vn -0.172616 0.923505 0.342552 +vn -0.170583 0.970465 0.170583 +vn -0.342552 0.923505 0.172616 +vn -0.696231 0.696231 0.174713 +vn -0.519728 0.836377 0.174230 +vn 0.627391 0.461261 -0.627391 +vn 0.479663 0.479663 -0.734742 +vn 0.668221 0.327049 -0.668221 +vn 0.504570 0.330991 -0.797405 +vn 0.337959 0.337959 -0.878389 +vn 0.330991 0.504570 -0.797405 +vn 0.696231 0.174714 -0.696231 +vn 0.707107 -0.000000 -0.707107 +vn 0.525865 -0.000000 -0.850568 +vn 0.519728 0.174230 -0.836377 +vn 0.344367 -0.000000 -0.938835 +vn 0.342552 0.172616 -0.923505 +vn 0.169789 0.000000 -0.985481 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.169789 -0.985480 +vn 0.170583 0.170583 -0.970465 +vn -0.000000 0.344367 -0.938835 +vn 0.172616 0.342552 -0.923505 +vn -0.000000 0.525865 -0.850568 +vn 0.174230 0.519728 -0.836377 +vn 0.627391 -0.461261 -0.627391 +vn 0.577350 -0.577350 -0.577350 +vn 0.461261 -0.627391 -0.627391 +vn 0.479663 -0.479664 -0.734742 +vn 0.327049 -0.668221 -0.668221 +vn 0.330991 -0.504570 -0.797405 +vn 0.337959 -0.337959 -0.878389 +vn 0.504570 -0.330991 -0.797405 +vn 0.668221 -0.327049 -0.668221 +vn 0.174714 -0.696231 -0.696231 +vn 0.000000 -0.707107 -0.707107 +vn 0.000000 -0.525865 -0.850568 +vn 0.174230 -0.519728 -0.836377 +vn 0.000000 -0.344367 -0.938835 +vn 0.172616 -0.342552 -0.923505 +vn 0.000000 -0.169789 -0.985481 +vn 0.170583 -0.170583 -0.970465 +vn 0.342552 -0.172616 -0.923505 +vn 0.696231 -0.174713 -0.696231 +vn 0.519728 -0.174230 -0.836377 +vn -0.461261 -0.627391 -0.627391 +vn -0.577350 -0.577350 -0.577350 +vn -0.627391 -0.461261 -0.627391 +vn -0.479664 -0.479663 -0.734742 +vn -0.668221 -0.327049 -0.668221 +vn -0.504570 -0.330991 -0.797405 +vn -0.337959 -0.337959 -0.878389 +vn -0.330991 -0.504570 -0.797405 +vn -0.327049 -0.668221 -0.668221 +vn -0.696231 -0.174714 -0.696231 +vn -0.707107 0.000000 -0.707107 +vn -0.525865 0.000000 -0.850568 +vn -0.519728 -0.174230 -0.836377 +vn -0.344367 0.000000 -0.938835 +vn -0.342552 -0.172616 -0.923505 +vn -0.169789 -0.000000 -0.985481 +vn -0.170583 -0.170583 -0.970465 +vn -0.172616 -0.342552 -0.923505 +vn -0.174713 -0.696231 -0.696231 +vn -0.174230 -0.519728 -0.836377 +vn -0.627391 0.461261 -0.627391 +vn -0.479663 0.479663 -0.734742 +vn -0.330991 0.504570 -0.797405 +vn -0.337959 0.337959 -0.878389 +vn -0.504570 0.330991 -0.797405 +vn -0.668221 0.327049 -0.668221 +vn -0.174230 0.519728 -0.836377 +vn -0.172616 0.342552 -0.923505 +vn -0.170583 0.170583 -0.970465 +vn -0.342552 0.172616 -0.923505 +vn -0.696231 0.174713 -0.696231 +vn -0.519728 0.174230 -0.836377 +vn 0.627391 -0.627391 -0.461261 +vn 0.479663 -0.734742 -0.479664 +vn 0.668221 -0.668221 -0.327049 +vn 0.504570 -0.797405 -0.330991 +vn 0.337959 -0.878389 -0.337959 +vn 0.330991 -0.797405 -0.504570 +vn 0.696231 -0.696231 -0.174714 +vn 0.707107 -0.707107 -0.000000 +vn 0.525865 -0.850568 -0.000000 +vn 0.519728 -0.836377 -0.174230 +vn 0.344367 -0.938835 -0.000000 +vn 0.342552 -0.923505 -0.172616 +vn 0.169789 -0.985480 -0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.000000 -0.985481 -0.169789 +vn 0.170583 -0.970465 -0.170583 +vn -0.000000 -0.938835 -0.344367 +vn 0.172616 -0.923505 -0.342552 +vn 0.000000 -0.850568 -0.525865 +vn 0.174230 -0.836377 -0.519728 +vn 0.627391 -0.627391 0.461261 +vn 0.479664 -0.734742 0.479663 +vn 0.330991 -0.797405 0.504570 +vn 0.337959 -0.878389 0.337959 +vn 0.504570 -0.797405 0.330991 +vn 0.668221 -0.668221 0.327049 +vn -0.000000 -0.850568 0.525865 +vn 0.174229 -0.836377 0.519728 +vn -0.000000 -0.938835 0.344367 +vn 0.172616 -0.923505 0.342552 +vn 0.000000 -0.985481 0.169789 +vn 0.170583 -0.970465 0.170583 +vn 0.342552 -0.923505 0.172616 +vn 0.696231 -0.696231 0.174713 +vn 0.519728 -0.836377 0.174230 +vn -0.627391 -0.627391 0.461261 +vn -0.479663 -0.734742 0.479664 +vn -0.668221 -0.668221 0.327049 +vn -0.504570 -0.797405 0.330991 +vn -0.337959 -0.878389 0.337959 +vn -0.330991 -0.797405 0.504570 +vn -0.696231 -0.696231 0.174714 +vn -0.707107 -0.707107 0.000000 +vn -0.525865 -0.850568 0.000000 +vn -0.519728 -0.836377 0.174230 +vn -0.344367 -0.938835 0.000000 +vn -0.342552 -0.923505 0.172616 +vn -0.169789 -0.985480 0.000000 +vn -0.170583 -0.970465 0.170583 +vn -0.172616 -0.923505 0.342552 +vn -0.174230 -0.836377 0.519728 +vn -0.627391 -0.627391 -0.461261 +vn -0.479664 -0.734742 -0.479663 +vn -0.330991 -0.797405 -0.504570 +vn -0.337959 -0.878389 -0.337959 +vn -0.504570 -0.797405 -0.330991 +vn -0.668221 -0.668221 -0.327049 +vn -0.174230 -0.836377 -0.519728 +vn -0.172616 -0.923505 -0.342552 +vn -0.170583 -0.970465 -0.170583 +vn -0.342552 -0.923505 -0.172616 +vn -0.696231 -0.696231 -0.174713 +vn -0.519728 -0.836377 -0.174230 +vn 0.734742 -0.479664 -0.479663 +vn 0.797405 -0.330991 -0.504570 +vn 0.878389 -0.337959 -0.337959 +vn 0.797405 -0.504570 -0.330991 +vn 0.850568 -0.000000 -0.525865 +vn 0.836377 -0.174230 -0.519728 +vn 0.938835 -0.000000 -0.344367 +vn 0.923505 -0.172616 -0.342552 +vn 0.985481 -0.000000 -0.169789 +vn 1.000000 0.000000 0.000000 +vn 0.985481 -0.169789 0.000000 +vn 0.970465 -0.170583 -0.170583 +vn 0.938835 -0.344367 0.000000 +vn 0.923505 -0.342552 -0.172616 +vn 0.850568 -0.525865 -0.000000 +vn 0.836377 -0.519728 -0.174230 +vn 0.734742 0.479663 -0.479664 +vn 0.797405 0.504570 -0.330991 +vn 0.878389 0.337959 -0.337959 +vn 0.797405 0.330991 -0.504570 +vn 0.850568 0.525865 0.000000 +vn 0.836377 0.519728 -0.174229 +vn 0.938835 0.344367 0.000000 +vn 0.923505 0.342552 -0.172616 +vn 0.985481 0.169789 -0.000000 +vn 0.970465 0.170583 -0.170583 +vn 0.923505 0.172616 -0.342552 +vn 0.836377 0.174230 -0.519728 +vn 0.734742 0.479664 0.479663 +vn 0.797405 0.330991 0.504570 +vn 0.878389 0.337959 0.337959 +vn 0.797405 0.504570 0.330991 +vn 0.850568 0.000000 0.525865 +vn 0.836377 0.174230 0.519728 +vn 0.938835 0.000000 0.344367 +vn 0.923505 0.172616 0.342552 +vn 0.985481 0.000000 0.169789 +vn 0.970465 0.170583 0.170583 +vn 0.923505 0.342552 0.172616 +vn 0.836377 0.519728 0.174230 +vn 0.734742 -0.479663 0.479664 +vn 0.797405 -0.504570 0.330991 +vn 0.878389 -0.337959 0.337959 +vn 0.797405 -0.330991 0.504570 +vn 0.836377 -0.519728 0.174230 +vn 0.923505 -0.342552 0.172616 +vn 0.970465 -0.170583 0.170583 +vn 0.923505 -0.172616 0.342552 +vn 0.836377 -0.174230 0.519728 +vn -0.734742 -0.479664 0.479663 +vn -0.797405 -0.330991 0.504570 +vn -0.878389 -0.337959 0.337959 +vn -0.797405 -0.504570 0.330991 +vn -0.850568 -0.000000 0.525865 +vn -0.836377 -0.174230 0.519728 +vn -0.938835 -0.000000 0.344367 +vn -0.923505 -0.172616 0.342552 +vn -0.985481 -0.000000 0.169789 +vn -1.000000 0.000000 0.000000 +vn -0.985481 -0.169789 -0.000000 +vn -0.970465 -0.170583 0.170583 +vn -0.938835 -0.344367 -0.000000 +vn -0.923505 -0.342552 0.172616 +vn -0.850568 -0.525865 0.000000 +vn -0.836377 -0.519728 0.174230 +vn -0.734742 0.479663 0.479664 +vn -0.797405 0.504570 0.330991 +vn -0.878389 0.337959 0.337959 +vn -0.797405 0.330991 0.504570 +vn -0.850568 0.525865 -0.000000 +vn -0.836377 0.519728 0.174229 +vn -0.938835 0.344367 -0.000000 +vn -0.923505 0.342552 0.172616 +vn -0.985481 0.169789 0.000000 +vn -0.970465 0.170583 0.170583 +vn -0.923505 0.172616 0.342552 +vn -0.836377 0.174230 0.519728 +vn -0.734742 0.479664 -0.479663 +vn -0.797405 0.330991 -0.504570 +vn -0.878389 0.337959 -0.337959 +vn -0.797405 0.504570 -0.330991 +vn -0.850568 0.000000 -0.525865 +vn -0.836377 0.174230 -0.519728 +vn -0.938835 0.000000 -0.344367 +vn -0.923505 0.172616 -0.342552 +vn -0.985481 0.000000 -0.169789 +vn -0.970465 0.170583 -0.170583 +vn -0.923505 0.342552 -0.172616 +vn -0.836377 0.519728 -0.174230 +vn -0.734742 -0.479663 -0.479664 +vn -0.797405 -0.504570 -0.330991 +vn -0.878389 -0.337959 -0.337959 +vn -0.797405 -0.330991 -0.504570 +vn -0.836377 -0.519728 -0.174230 +vn -0.923505 -0.342552 -0.172616 +vn -0.970465 -0.170583 -0.170583 +vn -0.923505 -0.172616 -0.342552 +vn -0.836377 -0.174230 -0.519728 +s 1 +g pCube1 +f 102/222/1 2/2/2 119/223/3 291/126/4 +f 119/223/3 37/65/5 196/224/6 291/126/4 +f 196/224/6 75/40/7 195/225/8 291/126/4 +f 195/225/8 28/64/9 102/222/1 291/126/4 +f 120/226/10 14/22/11 150/227/12 292/127/13 +f 150/227/12 52/66/14 197/228/15 292/127/13 +f 197/228/15 75/40/7 196/224/6 292/127/13 +f 196/224/6 37/65/5 120/226/10 292/127/13 +f 149/229/16 21/15/17 147/230/18 293/128/19 +f 147/230/18 51/67/20 198/231/21 293/128/19 +f 198/231/21 75/40/7 197/228/15 293/128/19 +f 197/228/15 52/66/14 149/229/16 293/128/19 +f 148/232/22 9/21/23 101/233/24 294/129/25 +f 101/233/24 28/64/9 195/225/8 294/129/25 +f 195/225/8 75/40/7 198/231/21 294/129/25 +f 198/231/21 51/67/20 148/232/22 294/129/25 +f 122/234/26 4/4/27 106/235/28 295/130/29 +f 106/235/28 30/69/30 200/236/31 295/130/29 +f 200/236/31 76/41/32 199/237/33 295/130/29 +f 199/237/33 38/68/34 122/234/26 295/130/29 +f 105/238/35 10/23/36 152/239/37 296/131/38 +f 152/239/37 53/70/39 201/240/40 296/131/38 +f 201/240/40 76/41/32 200/236/31 296/131/38 +f 200/236/31 30/69/30 105/238/35 296/131/38 +f 151/241/41 21/15/17 149/229/16 297/132/42 +f 149/229/16 52/66/14 202/242/43 297/132/42 +f 202/242/43 76/41/32 201/240/40 297/132/42 +f 201/240/40 53/70/39 151/241/41 297/132/42 +f 150/227/12 14/22/11 121/243/44 298/133/45 +f 121/243/44 38/68/34 199/237/33 298/133/45 +f 199/237/33 76/41/32 202/242/43 298/133/45 +f 202/242/43 52/66/14 150/227/12 298/133/45 +f 103/244/46 3/3/47 118/245/48 299/134/49 +f 118/245/48 36/72/50 204/246/51 299/134/49 +f 204/246/51 77/42/52 203/247/53 299/134/49 +f 203/247/53 29/71/54 103/244/46 299/134/49 +f 117/248/55 13/24/56 154/249/57 300/135/58 +f 154/249/57 54/73/59 205/250/60 300/135/58 +f 205/250/60 77/42/52 204/246/51 300/135/58 +f 204/246/51 36/72/50 117/248/55 300/135/58 +f 153/251/61 21/15/17 151/241/41 301/136/62 +f 151/241/41 53/70/39 206/252/63 301/136/62 +f 206/252/63 77/42/52 205/250/60 301/136/62 +f 205/250/60 54/73/59 153/251/61 301/136/62 +f 152/239/37 10/23/36 104/253/64 302/137/65 +f 104/253/64 29/71/54 203/247/53 302/137/65 +f 203/247/53 77/42/52 206/252/63 302/137/65 +f 206/252/63 53/70/39 152/239/37 302/137/65 +f 115/254/66 1/1/67 99/255/68 303/138/69 +f 99/255/68 27/75/70 208/256/71 303/138/69 +f 208/256/71 78/43/72 207/257/73 303/138/69 +f 207/257/73 35/74/74 115/254/66 303/138/69 +f 100/258/75 9/21/23 148/232/22 304/139/76 +f 148/232/22 51/67/20 209/259/77 304/139/76 +f 209/259/77 78/43/72 208/256/71 304/139/76 +f 208/256/71 27/75/70 100/258/75 304/139/76 +f 147/230/18 21/15/17 153/251/61 305/140/78 +f 153/251/61 54/73/59 210/260/79 305/140/78 +f 210/260/79 78/43/72 209/259/77 305/140/78 +f 209/259/77 51/67/20 147/230/18 305/140/78 +f 154/249/57 13/24/56 116/261/80 306/141/81 +f 116/261/80 35/74/74 207/257/73 306/141/81 +f 207/257/73 78/43/72 210/260/79 306/141/81 +f 210/260/79 54/73/59 154/249/57 306/141/81 +f 106/235/28 4/4/27 127/262/82 307/142/83 +f 127/262/82 41/76/84 212/263/85 307/142/83 +f 212/263/85 79/44/86 211/264/87 307/142/83 +f 211/264/87 30/69/30 106/235/28 307/142/83 +f 128/265/88 16/25/89 158/266/90 308/143/91 +f 158/266/90 56/77/92 213/267/93 308/143/91 +f 213/267/93 79/44/86 212/263/85 308/143/91 +f 212/263/85 41/76/84 128/265/88 308/143/91 +f 157/268/94 22/16/95 155/269/96 309/144/97 +f 155/269/96 55/78/98 214/270/99 309/144/97 +f 214/270/99 79/44/86 213/267/93 309/144/97 +f 213/267/93 56/77/92 157/268/94 309/144/97 +f 156/271/100 10/23/36 105/238/35 310/145/101 +f 105/238/35 30/69/30 211/264/87 310/145/101 +f 211/264/87 79/44/86 214/270/99 310/145/101 +f 214/270/99 55/78/98 156/271/100 310/145/101 +f 130/272/102 6/6/103 110/273/104 311/146/105 +f 110/273/104 32/80/106 216/274/107 311/146/105 +f 216/274/107 80/45/108 215/275/109 311/146/105 +f 215/275/109 42/79/110 130/272/102 311/146/105 +f 109/276/111 11/26/112 160/277/113 312/147/114 +f 160/277/113 57/81/115 217/278/116 312/147/114 +f 217/278/116 80/45/108 216/274/107 312/147/114 +f 216/274/107 32/80/106 109/276/111 312/147/114 +f 159/279/117 22/16/95 157/268/94 313/148/118 +f 157/268/94 56/77/92 218/280/119 313/148/118 +f 218/280/119 80/45/108 217/278/116 313/148/118 +f 217/278/116 57/81/115 159/279/117 313/148/118 +f 158/266/90 16/25/89 129/281/120 314/149/121 +f 129/281/120 42/79/110 215/275/109 314/149/121 +f 215/275/109 80/45/108 218/280/119 314/149/121 +f 218/280/119 56/77/92 158/266/90 314/149/121 +f 107/282/122 5/5/123 126/283/124 315/150/125 +f 126/283/124 40/83/126 220/284/127 315/150/125 +f 220/284/127 81/46/128 219/285/129 315/150/125 +f 219/285/129 31/82/130 107/282/122 315/150/125 +f 125/286/131 15/27/132 162/287/133 316/151/134 +f 162/287/133 58/84/135 221/288/136 316/151/134 +f 221/288/136 81/46/128 220/284/127 316/151/134 +f 220/284/127 40/83/126 125/286/131 316/151/134 +f 161/289/137 22/16/95 159/279/117 317/152/138 +f 159/279/117 57/81/115 222/290/139 317/152/138 +f 222/290/139 81/46/128 221/288/136 317/152/138 +f 221/288/136 58/84/135 161/289/137 317/152/138 +f 160/277/113 11/26/112 108/291/140 318/153/141 +f 108/291/140 31/82/130 219/285/129 318/153/141 +f 219/285/129 81/46/128 222/290/139 318/153/141 +f 222/290/139 57/81/115 160/277/113 318/153/141 +f 123/292/142 3/3/47 103/244/46 319/154/143 +f 103/244/46 29/71/54 224/293/144 319/154/143 +f 224/293/144 82/47/145 223/294/146 319/154/143 +f 223/294/146 39/85/147 123/292/142 319/154/143 +f 104/253/64 10/23/36 156/271/100 320/155/148 +f 156/271/100 55/78/98 225/295/149 320/155/148 +f 225/295/149 82/47/145 224/293/144 320/155/148 +f 224/293/144 29/71/54 104/253/64 320/155/148 +f 155/269/96 22/16/95 161/289/137 321/156/150 +f 161/289/137 58/84/135 226/296/151 321/156/150 +f 226/296/151 82/47/145 225/295/149 321/156/150 +f 225/295/149 55/78/98 155/269/96 321/156/150 +f 162/287/133 15/27/132 124/297/152 322/157/153 +f 124/297/152 39/85/147 223/294/146 322/157/153 +f 223/294/146 82/47/145 226/296/151 322/157/153 +f 226/296/151 58/84/135 162/287/133 322/157/153 +f 110/273/104 6/6/103 135/298/154 323/158/155 +f 135/298/154 45/86/156 228/299/157 323/158/155 +f 228/299/157 83/48/158 227/300/159 323/158/155 +f 227/300/159 32/80/106 110/273/104 323/158/155 +f 136/301/160 18/28/161 166/302/162 324/159/163 +f 166/302/162 60/87/164 229/303/165 324/159/163 +f 229/303/165 83/48/158 228/299/157 324/159/163 +f 228/299/157 45/86/156 136/301/160 324/159/163 +f 165/304/166 23/17/167 163/305/168 325/160/169 +f 163/305/168 59/88/170 230/306/171 325/160/169 +f 230/306/171 83/48/158 229/303/165 325/160/169 +f 229/303/165 60/87/164 165/304/166 325/160/169 +f 164/307/172 11/26/112 109/276/111 326/161/173 +f 109/276/111 32/80/106 227/300/159 326/161/173 +f 227/300/159 83/48/158 230/306/171 326/161/173 +f 230/306/171 59/88/170 164/307/172 326/161/173 +f 138/308/174 8/8/175 114/309/176 327/162/177 +f 114/309/176 34/90/178 232/310/179 327/162/177 +f 232/310/179 84/49/180 231/311/181 327/162/177 +f 231/311/181 46/89/182 138/308/174 327/162/177 +f 113/312/183 12/29/184 168/313/185 328/163/186 +f 168/313/185 61/91/187 233/314/188 328/163/186 +f 233/314/188 84/49/180 232/310/179 328/163/186 +f 232/310/179 34/90/178 113/312/183 328/163/186 +f 167/315/189 23/17/167 165/304/166 329/164/190 +f 165/304/166 60/87/164 234/316/191 329/164/190 +f 234/316/191 84/49/180 233/314/188 329/164/190 +f 233/314/188 61/91/187 167/315/189 329/164/190 +f 166/302/162 18/28/161 137/317/192 330/165/193 +f 137/317/192 46/89/182 231/311/181 330/165/193 +f 231/311/181 84/49/180 234/316/191 330/165/193 +f 234/316/191 60/87/164 166/302/162 330/165/193 +f 111/318/194 7/7/195 134/319/196 331/166/197 +f 134/319/196 44/93/198 236/320/199 331/166/197 +f 236/320/199 85/50/200 235/321/201 331/166/197 +f 235/321/201 33/92/202 111/318/194 331/166/197 +f 133/322/203 17/30/204 170/323/205 332/167/206 +f 170/323/205 62/94/207 237/324/208 332/167/206 +f 237/324/208 85/50/200 236/320/199 332/167/206 +f 236/320/199 44/93/198 133/322/203 332/167/206 +f 169/325/209 23/17/167 167/315/189 333/168/210 +f 167/315/189 61/91/187 238/326/211 333/168/210 +f 238/326/211 85/50/200 237/324/208 333/168/210 +f 237/324/208 62/94/207 169/325/209 333/168/210 +f 168/313/185 12/29/184 112/327/212 334/169/213 +f 112/327/212 33/92/202 235/321/201 334/169/213 +f 235/321/201 85/50/200 238/326/211 334/169/213 +f 238/326/211 61/91/187 168/313/185 334/169/213 +f 131/328/214 5/5/123 107/282/122 335/170/215 +f 107/282/122 31/82/130 240/329/216 335/170/215 +f 240/329/216 86/51/217 239/330/218 335/170/215 +f 239/330/218 43/95/219 131/328/214 335/170/215 +f 108/291/140 11/26/112 164/307/172 336/171/220 +f 164/307/172 59/88/170 241/331/221 336/171/220 +f 241/331/221 86/51/217 240/329/216 336/171/220 +f 240/329/216 31/82/130 108/291/140 336/171/220 +f 163/305/168 23/17/167 169/325/209 337/172/222 +f 169/325/209 62/94/207 242/332/223 337/172/222 +f 242/332/223 86/51/217 241/331/221 337/172/222 +f 241/331/221 59/88/170 163/305/168 337/172/222 +f 170/323/205 17/30/204 132/333/224 338/173/225 +f 132/333/224 43/95/219 239/330/218 338/173/225 +f 239/330/218 86/51/217 242/332/223 338/173/225 +f 242/332/223 62/94/207 170/323/205 338/173/225 +f 114/309/176 8/8/175 143/334/226 339/174/227 +f 143/334/226 49/96/228 244/335/229 339/174/227 +f 244/335/229 87/52/230 243/336/231 339/174/227 +f 243/336/231 34/90/178 114/309/176 339/174/227 +f 144/337/232 20/31/233 174/338/234 340/175/235 +f 174/338/234 64/97/236 245/339/237 340/175/235 +f 245/339/237 87/52/230 244/335/229 340/175/235 +f 244/335/229 49/96/228 144/337/232 340/175/235 +f 173/340/238 24/18/239 171/341/240 341/176/241 +f 171/341/240 63/98/242 246/342/243 341/176/241 +f 246/342/243 87/52/230 245/339/237 341/176/241 +f 245/339/237 64/97/236 173/340/238 341/176/241 +f 172/343/244 12/29/184 113/312/183 342/177/245 +f 113/312/183 34/90/178 243/336/231 342/177/245 +f 243/336/231 87/52/230 246/342/243 342/177/245 +f 246/342/243 63/98/242 172/343/244 342/177/245 +f 146/344/246 2/10/2 102/345/1 343/178/247 +f 102/345/1 28/100/9 248/346/248 343/178/247 +f 248/346/248 88/53/249 247/347/250 343/178/247 +f 247/347/250 50/99/251 146/344/246 343/178/247 +f 101/348/24 9/32/23 176/349/252 344/179/253 +f 176/349/252 65/101/254 249/350/255 344/179/253 +f 249/350/255 88/53/249 248/346/248 344/179/253 +f 248/346/248 28/100/9 101/348/24 344/179/253 +f 175/351/256 24/18/239 173/340/238 345/180/257 +f 173/340/238 64/97/236 250/352/258 345/180/257 +f 250/352/258 88/53/249 249/350/255 345/180/257 +f 249/350/255 65/101/254 175/351/256 345/180/257 +f 174/338/234 20/31/233 145/353/259 346/181/260 +f 145/353/259 50/99/251 247/347/250 346/181/260 +f 247/347/250 88/53/249 250/352/258 346/181/260 +f 250/352/258 64/97/236 174/338/234 346/181/260 +f 99/354/68 1/9/67 142/355/261 347/182/262 +f 142/355/261 48/103/263 252/356/264 347/182/262 +f 252/356/264 89/54/265 251/357/266 347/182/262 +f 251/357/266 27/102/70 99/354/68 347/182/262 +f 141/358/267 19/33/268 178/359/269 348/183/270 +f 178/359/269 66/104/271 253/360/272 348/183/270 +f 253/360/272 89/54/265 252/356/264 348/183/270 +f 252/356/264 48/103/263 141/358/267 348/183/270 +f 177/361/273 24/18/239 175/351/256 349/184/274 +f 175/351/256 65/101/254 254/362/275 349/184/274 +f 254/362/275 89/54/265 253/360/272 349/184/274 +f 253/360/272 66/104/271 177/361/273 349/184/274 +f 176/349/252 9/32/23 100/363/75 350/185/276 +f 100/363/75 27/102/70 251/357/266 350/185/276 +f 251/357/266 89/54/265 254/362/275 350/185/276 +f 254/362/275 65/101/254 176/349/252 350/185/276 +f 139/364/277 7/7/195 111/318/194 351/186/278 +f 111/318/194 33/92/202 256/365/279 351/186/278 +f 256/365/279 90/55/280 255/366/281 351/186/278 +f 255/366/281 47/105/282 139/364/277 351/186/278 +f 112/327/212 12/29/184 172/343/244 352/187/283 +f 172/343/244 63/98/242 257/367/284 352/187/283 +f 257/367/284 90/55/280 256/365/279 352/187/283 +f 256/365/279 33/92/202 112/327/212 352/187/283 +f 171/341/240 24/18/239 177/361/273 353/188/285 +f 177/361/273 66/104/271 258/368/286 353/188/285 +f 258/368/286 90/55/280 257/367/284 353/188/285 +f 257/367/284 63/98/242 171/341/240 353/188/285 +f 178/359/269 19/33/268 140/369/287 354/189/288 +f 140/369/287 47/105/282 255/366/281 354/189/288 +f 255/366/281 90/55/280 258/368/286 354/189/288 +f 258/368/286 66/104/271 178/359/269 354/189/288 +f 143/370/226 8/11/175 138/371/174 355/190/289 +f 138/371/174 46/107/182 260/372/290 355/190/289 +f 260/372/290 91/56/291 259/373/292 355/190/289 +f 259/373/292 49/106/228 143/370/226 355/190/289 +f 137/374/192 18/35/161 182/375/293 356/191/294 +f 182/375/293 68/108/295 261/376/296 356/191/294 +f 261/376/296 91/56/291 260/372/290 356/191/294 +f 260/372/290 46/107/182 137/374/192 356/191/294 +f 181/377/297 25/19/298 179/378/299 357/192/300 +f 179/378/299 67/109/301 262/379/302 357/192/300 +f 262/379/302 91/56/291 261/376/296 357/192/300 +f 261/376/296 68/108/295 181/377/297 357/192/300 +f 180/380/303 20/34/233 144/381/232 358/193/304 +f 144/381/232 49/106/228 259/373/292 358/193/304 +f 259/373/292 91/56/291 262/379/302 358/193/304 +f 262/379/302 67/109/301 180/380/303 358/193/304 +f 135/382/154 6/12/103 130/383/102 359/194/305 +f 130/383/102 42/111/110 264/384/306 359/194/305 +f 264/384/306 92/57/307 263/385/308 359/194/305 +f 263/385/308 45/110/156 135/382/154 359/194/305 +f 129/386/120 16/36/89 184/387/309 360/195/310 +f 184/387/309 69/112/311 265/388/312 360/195/310 +f 265/388/312 92/57/307 264/384/306 360/195/310 +f 264/384/306 42/111/110 129/386/120 360/195/310 +f 183/389/313 25/19/298 181/377/297 361/196/314 +f 181/377/297 68/108/295 266/390/315 361/196/314 +f 266/390/315 92/57/307 265/388/312 361/196/314 +f 265/388/312 69/112/311 183/389/313 361/196/314 +f 182/375/293 18/35/161 136/391/160 362/197/316 +f 136/391/160 45/110/156 263/385/308 362/197/316 +f 263/385/308 92/57/307 266/390/315 362/197/316 +f 266/390/315 68/108/295 182/375/293 362/197/316 +f 127/392/82 4/4/27 122/234/26 363/198/317 +f 122/234/26 38/68/34 268/393/318 363/198/317 +f 268/393/318 93/58/319 267/394/320 363/198/317 +f 267/394/320 41/113/84 127/392/82 363/198/317 +f 121/243/44 14/22/11 186/395/321 364/199/322 +f 186/395/321 70/114/323 269/396/324 364/199/322 +f 269/396/324 93/58/319 268/393/318 364/199/322 +f 268/393/318 38/68/34 121/243/44 364/199/322 +f 185/397/325 25/19/298 183/389/313 365/200/326 +f 183/389/313 69/112/311 270/398/327 365/200/326 +f 270/398/327 93/58/319 269/396/324 365/200/326 +f 269/396/324 70/114/323 185/397/325 365/200/326 +f 184/387/309 16/36/89 128/399/88 366/201/328 +f 128/399/88 41/113/84 267/394/320 366/201/328 +f 267/394/320 93/58/319 270/398/327 366/201/328 +f 270/398/327 69/112/311 184/387/309 366/201/328 +f 119/223/3 2/2/2 146/400/246 367/202/329 +f 146/400/246 50/115/251 272/401/330 367/202/329 +f 272/401/330 94/59/331 271/402/332 367/202/329 +f 271/402/332 37/65/5 119/223/3 367/202/329 +f 145/403/259 20/34/233 180/380/303 368/203/333 +f 180/380/303 67/109/301 273/404/334 368/203/333 +f 273/404/334 94/59/331 272/401/330 368/203/333 +f 272/401/330 50/115/251 145/403/259 368/203/333 +f 179/378/299 25/19/298 185/397/325 369/204/335 +f 185/397/325 70/114/323 274/405/336 369/204/335 +f 274/405/336 94/59/331 273/404/334 369/204/335 +f 273/404/334 67/109/301 179/378/299 369/204/335 +f 186/395/321 14/22/11 120/226/10 370/205/337 +f 120/226/10 37/65/5 271/402/332 370/205/337 +f 271/402/332 94/59/331 274/405/336 370/205/337 +f 274/405/336 70/114/323 186/395/321 370/205/337 +f 142/406/261 1/1/67 115/254/66 371/206/338 +f 115/254/66 35/74/74 276/407/339 371/206/338 +f 276/407/339 95/60/340 275/408/341 371/206/338 +f 275/408/341 48/116/263 142/406/261 371/206/338 +f 116/261/80 13/24/56 190/409/342 372/207/343 +f 190/409/342 72/117/344 277/410/345 372/207/343 +f 277/410/345 95/60/340 276/407/339 372/207/343 +f 276/407/339 35/74/74 116/261/80 372/207/343 +f 189/411/346 26/20/347 187/412/348 373/208/349 +f 187/412/348 71/118/350 278/413/351 373/208/349 +f 278/413/351 95/60/340 277/410/345 373/208/349 +f 277/410/345 72/117/344 189/411/346 373/208/349 +f 188/414/352 19/37/268 141/415/267 374/209/353 +f 141/415/267 48/116/263 275/408/341 374/209/353 +f 275/408/341 95/60/340 278/413/351 374/209/353 +f 278/413/351 71/118/350 188/414/352 374/209/353 +f 118/245/48 3/3/47 123/416/142 375/210/354 +f 123/416/142 39/119/147 280/417/355 375/210/354 +f 280/417/355 96/61/356 279/418/357 375/210/354 +f 279/418/357 36/72/50 118/245/48 375/210/354 +f 124/419/152 15/38/132 192/420/358 376/211/359 +f 192/420/358 73/120/360 281/421/361 376/211/359 +f 281/421/361 96/61/356 280/417/355 376/211/359 +f 280/417/355 39/119/147 124/419/152 376/211/359 +f 191/422/362 26/20/347 189/411/346 377/212/363 +f 189/411/346 72/117/344 282/423/364 377/212/363 +f 282/423/364 96/61/356 281/421/361 377/212/363 +f 281/421/361 73/120/360 191/422/362 377/212/363 +f 190/409/342 13/24/56 117/248/55 378/213/365 +f 117/248/55 36/72/50 279/418/357 378/213/365 +f 279/418/357 96/61/356 282/423/364 378/213/365 +f 282/423/364 72/117/344 190/409/342 378/213/365 +f 126/424/124 5/14/123 131/425/214 379/214/366 +f 131/425/214 43/122/219 284/426/367 379/214/366 +f 284/426/367 97/62/368 283/427/369 379/214/366 +f 283/427/369 40/121/126 126/424/124 379/214/366 +f 132/428/224 17/39/204 194/429/370 380/215/371 +f 194/429/370 74/123/372 285/430/373 380/215/371 +f 285/430/373 97/62/368 284/426/367 380/215/371 +f 284/426/367 43/122/219 132/428/224 380/215/371 +f 193/431/374 26/20/347 191/422/362 381/216/375 +f 191/422/362 73/120/360 286/432/376 381/216/375 +f 286/432/376 97/62/368 285/430/373 381/216/375 +f 285/430/373 74/123/372 193/431/374 381/216/375 +f 192/420/358 15/38/132 125/433/131 382/217/377 +f 125/433/131 40/121/126 283/427/369 382/217/377 +f 283/427/369 97/62/368 286/432/376 382/217/377 +f 286/432/376 73/120/360 192/420/358 382/217/377 +f 134/434/196 7/13/195 139/435/277 383/218/378 +f 139/435/277 47/125/282 288/436/379 383/218/378 +f 288/436/379 98/63/380 287/437/381 383/218/378 +f 287/437/381 44/124/198 134/434/196 383/218/378 +f 140/438/287 19/37/268 188/414/352 384/219/382 +f 188/414/352 71/118/350 289/439/383 384/219/382 +f 289/439/383 98/63/380 288/436/379 384/219/382 +f 288/436/379 47/125/282 140/438/287 384/219/382 +f 187/412/348 26/20/347 193/431/374 385/220/384 +f 193/431/374 74/123/372 290/440/385 385/220/384 +f 290/440/385 98/63/380 289/439/383 385/220/384 +f 289/439/383 71/118/350 187/412/348 385/220/384 +f 194/429/370 17/39/204 133/441/203 386/221/386 +f 133/441/203 44/124/198 287/437/381 386/221/386 +f 287/437/381 98/63/380 290/440/385 386/221/386 +f 290/440/385 74/123/372 194/429/370 386/221/386 diff --git a/modules/ufbx/data/maya_subsurf_3x_cube_7500_ascii.fbx b/modules/ufbx/data/maya_subsurf_3x_cube_7500_ascii.fbx new file mode 100644 index 0000000..1b16f85 --- /dev/null +++ b/modules/ufbx/data/maya_subsurf_3x_cube_7500_ascii.fbx @@ -0,0 +1,386 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 20 + Hour: 18 + Minute: 9 + Second: 34 + Millisecond: 44 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_3x_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_3x_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "20/08/2021 15:09:34.044" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_subsurf_3x_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "20/08/2021 15:09:34.044" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2612146084864, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2613615603984, "Geometry::", "Mesh" { + Smoothness: 2 + PreviewDivisionLevels: 3 + RenderDivisionLevels: 3 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2611687146752, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2612151294224, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2611624359968, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2613613992176, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2611687146752,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2613613992176,2611624359968 + + ;Geometry::, Model::pCube1 + C: "OO",2613615603984,2611687146752 + + ;Material::lambert1, Model::pCube1 + C: "OO",2612151294224,2611687146752 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_subsurf_3x_cube_crease.obj b/modules/ufbx/data/maya_subsurf_3x_cube_crease.obj new file mode 100644 index 0000000..2c48ebd --- /dev/null +++ b/modules/ufbx/data/maya_subsurf_3x_cube_crease.obj @@ -0,0 +1,1603 @@ +# ufbx:bad_normals +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -0.332031 -0.472222 0.332031 +v 0.332031 -0.472222 0.332031 +v -0.318432 0.410880 0.318432 +v 0.318432 0.410880 0.318432 +v -0.318432 0.410880 -0.318432 +v 0.318432 0.410880 -0.318432 +v -0.332031 -0.472222 -0.332031 +v 0.332031 -0.472222 -0.332031 +v 0.000000 -0.484375 0.446533 +v 0.000000 0.445312 0.410522 +v 0.000000 0.445312 -0.410522 +v 0.000000 -0.484375 -0.446533 +v -0.335938 0.000000 0.335938 +v 0.335938 0.000000 0.335938 +v -0.410522 0.445312 0.000000 +v 0.410522 0.445312 0.000000 +v -0.335938 0.000000 -0.335938 +v 0.335938 0.000000 -0.335938 +v -0.446533 -0.484375 0.000000 +v 0.446533 -0.484375 0.000000 +v 0.000000 0.000000 0.460938 +v 0.000000 0.500000 0.000000 +v 0.000000 0.000000 -0.460938 +v 0.000000 -0.500000 0.000000 +v 0.460938 0.000000 0.000000 +v -0.460938 0.000000 0.000000 +v -0.185791 -0.484375 0.416382 +v 0.185791 -0.484375 0.416382 +v -0.188456 0.442546 0.383708 +v 0.188456 0.442546 0.383708 +v -0.188456 0.442546 -0.383708 +v 0.188456 0.442546 -0.383708 +v -0.185791 -0.484375 -0.416382 +v 0.185791 -0.484375 -0.416382 +v -0.335938 -0.250000 0.335938 +v -0.334269 0.243815 0.334269 +v 0.335938 -0.250000 0.335938 +v 0.334269 0.243815 0.334269 +v -0.383708 0.442546 0.188456 +v -0.383708 0.442546 -0.188456 +v 0.383708 0.442546 0.188456 +v 0.383708 0.442546 -0.188456 +v -0.334269 0.243815 -0.334269 +v -0.335938 -0.250000 -0.335938 +v 0.334269 0.243815 -0.334269 +v 0.335938 -0.250000 -0.335938 +v -0.416382 -0.484375 -0.185791 +v -0.416382 -0.484375 0.185791 +v 0.416382 -0.484375 -0.185791 +v 0.416382 -0.484375 0.185791 +v 0.000000 -0.250000 0.460938 +v 0.183594 0.000000 0.429688 +v 0.000000 0.246094 0.457336 +v -0.183594 0.000000 0.429688 +v 0.000000 0.496094 0.226868 +v 0.226868 0.496094 0.000000 +v 0.000000 0.496094 -0.226868 +v -0.226868 0.496094 0.000000 +v 0.000000 0.246094 -0.457336 +v 0.183594 0.000000 -0.429688 +v 0.000000 -0.250000 -0.460938 +v -0.183594 0.000000 -0.429688 +v 0.000000 -0.500000 -0.230469 +v 0.230469 -0.500000 0.000000 +v 0.000000 -0.500000 0.230469 +v -0.230469 -0.500000 0.000000 +v 0.460938 -0.250000 0.000000 +v 0.429688 0.000000 -0.183594 +v 0.457336 0.246094 0.000000 +v 0.429688 0.000000 0.183594 +v -0.460938 -0.250000 0.000000 +v -0.429688 0.000000 0.183594 +v -0.457336 0.246094 0.000000 +v -0.429688 0.000000 -0.183594 +v 0.183594 -0.250000 0.429688 +v 0.183743 0.245714 0.426449 +v -0.183743 0.245714 0.426449 +v -0.183594 -0.250000 0.429688 +v 0.213437 0.492296 0.213437 +v 0.213437 0.492296 -0.213437 +v -0.213437 0.492296 -0.213437 +v -0.213437 0.492296 0.213437 +v 0.183743 0.245714 -0.426449 +v 0.183594 -0.250000 -0.429688 +v -0.183594 -0.250000 -0.429688 +v -0.183743 0.245714 -0.426449 +v 0.216309 -0.500000 -0.216309 +v 0.216309 -0.500000 0.216309 +v -0.216309 -0.500000 0.216309 +v -0.216309 -0.500000 -0.216309 +v 0.429688 -0.250000 -0.183594 +v 0.426449 0.245714 -0.183743 +v 0.426449 0.245714 0.183743 +v 0.429688 -0.250000 0.183594 +v -0.429688 -0.250000 0.183594 +v -0.426449 0.245714 0.183743 +v -0.426449 0.245714 -0.183743 +v -0.429688 -0.250000 -0.183594 +v -0.269531 -0.484375 0.378906 +v -0.094727 -0.484375 0.438965 +v 0.094727 -0.484375 0.438965 +v 0.269531 -0.484375 0.378906 +v -0.267985 0.434245 0.351969 +v -0.097168 0.445312 0.403564 +v 0.097168 0.445312 0.403564 +v 0.267985 0.434245 0.351969 +v -0.267985 0.434245 -0.351969 +v -0.097168 0.445312 -0.403564 +v 0.097168 0.445312 -0.403564 +v 0.267985 0.434245 -0.351969 +v -0.269531 -0.484375 -0.378906 +v -0.094727 -0.484375 -0.438965 +v 0.094727 -0.484375 -0.438965 +v 0.269531 -0.484375 -0.378906 +v -0.335938 -0.375000 0.335938 +v -0.335938 -0.125000 0.335938 +v -0.335938 0.125000 0.335938 +v -0.329264 0.350260 0.329264 +v 0.335938 -0.375000 0.335938 +v 0.335938 -0.125000 0.335938 +v 0.335938 0.125000 0.335938 +v 0.329264 0.350260 0.329264 +v -0.351969 0.434245 0.267985 +v -0.403564 0.445312 0.097168 +v -0.403564 0.445312 -0.097168 +v -0.351969 0.434245 -0.267985 +v 0.351969 0.434245 0.267985 +v 0.403564 0.445312 0.097168 +v 0.403564 0.445312 -0.097168 +v 0.351969 0.434245 -0.267985 +v -0.329264 0.350260 -0.329264 +v -0.335938 0.125000 -0.335938 +v -0.335938 -0.125000 -0.335938 +v -0.335938 -0.375000 -0.335938 +v 0.329264 0.350260 -0.329264 +v 0.335938 0.125000 -0.335938 +v 0.335938 -0.125000 -0.335938 +v 0.335938 -0.375000 -0.335938 +v -0.378906 -0.484375 -0.269531 +v -0.438965 -0.484375 -0.094727 +v -0.438965 -0.484375 0.094727 +v -0.378906 -0.484375 0.269531 +v 0.378906 -0.484375 -0.269531 +v 0.438965 -0.484375 -0.094727 +v 0.438965 -0.484375 0.094727 +v 0.378906 -0.484375 0.269531 +v 0.000000 -0.125000 0.460938 +v 0.000000 -0.375000 0.460938 +v 0.093750 0.000000 0.453125 +v 0.265625 0.000000 0.390625 +v 0.000000 0.125000 0.460938 +v 0.000000 0.359375 0.446533 +v -0.093750 0.000000 0.453125 +v -0.265625 0.000000 0.390625 +v 0.000000 0.500000 0.115234 +v 0.000000 0.484375 0.331299 +v 0.115234 0.500000 0.000000 +v 0.331299 0.484375 0.000000 +v 0.000000 0.500000 -0.115234 +v 0.000000 0.484375 -0.331299 +v -0.115234 0.500000 0.000000 +v -0.331299 0.484375 0.000000 +v 0.000000 0.125000 -0.460938 +v 0.000000 0.359375 -0.446533 +v 0.093750 0.000000 -0.453125 +v 0.265625 0.000000 -0.390625 +v 0.000000 -0.125000 -0.460938 +v 0.000000 -0.375000 -0.460938 +v -0.093750 0.000000 -0.453125 +v -0.265625 0.000000 -0.390625 +v 0.000000 -0.500000 -0.115234 +v 0.000000 -0.500000 -0.345703 +v 0.115234 -0.500000 0.000000 +v 0.345703 -0.500000 0.000000 +v 0.000000 -0.500000 0.115234 +v 0.000000 -0.500000 0.345703 +v -0.115234 -0.500000 0.000000 +v -0.345703 -0.500000 0.000000 +v 0.460938 -0.125000 0.000000 +v 0.460938 -0.375000 0.000000 +v 0.453125 0.000000 -0.093750 +v 0.390625 0.000000 -0.265625 +v 0.460938 0.125000 0.000000 +v 0.446533 0.359375 0.000000 +v 0.453125 0.000000 0.093750 +v 0.390625 0.000000 0.265625 +v -0.460938 -0.125000 0.000000 +v -0.460938 -0.375000 0.000000 +v -0.453125 0.000000 0.093750 +v -0.390625 0.000000 0.265625 +v -0.460938 0.125000 0.000000 +v -0.446533 0.359375 0.000000 +v -0.453125 0.000000 -0.093750 +v -0.390625 0.000000 -0.265625 +v 0.183594 -0.375000 0.429688 +v 0.265625 -0.250000 0.390625 +v 0.183594 -0.125000 0.429688 +v 0.093750 -0.250000 0.453125 +v 0.265001 0.244575 0.388048 +v 0.184191 0.357856 0.416734 +v 0.093994 0.246094 0.449585 +v 0.183594 0.125000 0.429688 +v -0.184191 0.357856 0.416734 +v -0.265001 0.244575 0.388048 +v -0.183594 0.125000 0.429688 +v -0.093994 0.246094 0.449585 +v -0.265625 -0.250000 0.390625 +v -0.183594 -0.375000 0.429688 +v -0.093750 -0.250000 0.453125 +v -0.183594 -0.125000 0.429688 +v 0.200060 0.480903 0.310533 +v 0.310533 0.480903 0.200060 +v 0.223022 0.496094 0.108643 +v 0.108643 0.496094 0.223022 +v 0.310533 0.480903 -0.200060 +v 0.200060 0.480903 -0.310533 +v 0.108643 0.496094 -0.223022 +v 0.223022 0.496094 -0.108643 +v -0.200060 0.480903 -0.310533 +v -0.310533 0.480903 -0.200060 +v -0.223022 0.496094 -0.108643 +v -0.108643 0.496094 -0.223022 +v -0.310533 0.480903 0.200060 +v -0.200060 0.480903 0.310533 +v -0.108643 0.496094 0.223022 +v -0.223022 0.496094 0.108643 +v 0.184191 0.357856 -0.416734 +v 0.265001 0.244575 -0.388048 +v 0.183594 0.125000 -0.429688 +v 0.093994 0.246094 -0.449585 +v 0.265625 -0.250000 -0.390625 +v 0.183594 -0.375000 -0.429688 +v 0.093750 -0.250000 -0.453125 +v 0.183594 -0.125000 -0.429688 +v -0.183594 -0.375000 -0.429688 +v -0.265625 -0.250000 -0.390625 +v -0.183594 -0.125000 -0.429688 +v -0.093750 -0.250000 -0.453125 +v -0.265001 0.244575 -0.388048 +v -0.184191 0.357856 -0.416734 +v -0.093994 0.246094 -0.449585 +v -0.183594 0.125000 -0.429688 +v 0.201172 -0.500000 -0.323242 +v 0.323242 -0.500000 -0.201172 +v 0.226562 -0.500000 -0.108398 +v 0.108398 -0.500000 -0.226562 +v 0.323242 -0.500000 0.201172 +v 0.201172 -0.500000 0.323242 +v 0.108398 -0.500000 0.226562 +v 0.226562 -0.500000 0.108398 +v -0.201172 -0.500000 0.323242 +v -0.323242 -0.500000 0.201172 +v -0.226562 -0.500000 0.108398 +v -0.108398 -0.500000 0.226562 +v -0.323242 -0.500000 -0.201172 +v -0.201172 -0.500000 -0.323242 +v -0.108398 -0.500000 -0.226562 +v -0.226562 -0.500000 -0.108398 +v 0.429688 -0.375000 -0.183594 +v 0.390625 -0.250000 -0.265625 +v 0.429688 -0.125000 -0.183594 +v 0.453125 -0.250000 -0.093750 +v 0.388048 0.244575 -0.265001 +v 0.416734 0.357856 -0.184191 +v 0.449585 0.246094 -0.093994 +v 0.429688 0.125000 -0.183594 +v 0.416734 0.357856 0.184191 +v 0.388048 0.244575 0.265001 +v 0.429688 0.125000 0.183594 +v 0.449585 0.246094 0.093994 +v 0.390625 -0.250000 0.265625 +v 0.429688 -0.375000 0.183594 +v 0.453125 -0.250000 0.093750 +v 0.429688 -0.125000 0.183594 +v -0.429688 -0.375000 0.183594 +v -0.390625 -0.250000 0.265625 +v -0.429688 -0.125000 0.183594 +v -0.453125 -0.250000 0.093750 +v -0.388048 0.244575 0.265001 +v -0.416734 0.357856 0.184191 +v -0.449585 0.246094 0.093994 +v -0.429688 0.125000 0.183594 +v -0.416734 0.357856 -0.184191 +v -0.388048 0.244575 -0.265001 +v -0.429688 0.125000 -0.183594 +v -0.449585 0.246094 -0.093994 +v -0.390625 -0.250000 -0.265625 +v -0.429688 -0.375000 -0.183594 +v -0.453125 -0.250000 -0.093750 +v -0.429688 -0.125000 -0.183594 +v 0.265625 -0.375000 0.390625 +v 0.265625 -0.125000 0.390625 +v 0.093750 -0.125000 0.453125 +v 0.093750 -0.375000 0.453125 +v 0.263129 0.353299 0.380317 +v 0.094727 0.359375 0.438965 +v 0.093750 0.125000 0.453125 +v 0.265625 0.125000 0.390625 +v -0.263129 0.353299 0.380317 +v -0.265625 0.125000 0.390625 +v -0.093750 0.125000 0.453125 +v -0.094727 0.359375 0.438965 +v -0.265625 -0.375000 0.390625 +v -0.093750 -0.375000 0.453125 +v -0.093750 -0.125000 0.453125 +v -0.265625 -0.125000 0.390625 +v 0.287543 0.470486 0.287543 +v 0.325684 0.484375 0.102539 +v 0.113281 0.500000 0.113281 +v 0.102539 0.484375 0.325684 +v 0.287543 0.470486 -0.287543 +v 0.102539 0.484375 -0.325684 +v 0.113281 0.500000 -0.113281 +v 0.325684 0.484375 -0.102539 +v -0.287543 0.470486 -0.287543 +v -0.325684 0.484375 -0.102539 +v -0.113281 0.500000 -0.113281 +v -0.102539 0.484375 -0.325684 +v -0.287543 0.470486 0.287543 +v -0.102539 0.484375 0.325684 +v -0.113281 0.500000 0.113281 +v -0.325684 0.484375 0.102539 +v 0.263129 0.353299 -0.380317 +v 0.265625 0.125000 -0.390625 +v 0.093750 0.125000 -0.453125 +v 0.094727 0.359375 -0.438965 +v 0.265625 -0.375000 -0.390625 +v 0.093750 -0.375000 -0.453125 +v 0.093750 -0.125000 -0.453125 +v 0.265625 -0.125000 -0.390625 +v -0.265625 -0.375000 -0.390625 +v -0.265625 -0.125000 -0.390625 +v -0.093750 -0.125000 -0.453125 +v -0.093750 -0.375000 -0.453125 +v -0.263129 0.353299 -0.380317 +v -0.094727 0.359375 -0.438965 +v -0.093750 0.125000 -0.453125 +v -0.265625 0.125000 -0.390625 +v 0.296875 -0.500000 -0.296875 +v 0.339844 -0.500000 -0.101562 +v 0.113281 -0.500000 -0.113281 +v 0.101562 -0.500000 -0.339844 +v 0.296875 -0.500000 0.296875 +v 0.101562 -0.500000 0.339844 +v 0.113281 -0.500000 0.113281 +v 0.339844 -0.500000 0.101562 +v -0.296875 -0.500000 0.296875 +v -0.339844 -0.500000 0.101562 +v -0.113281 -0.500000 0.113281 +v -0.101562 -0.500000 0.339844 +v -0.296875 -0.500000 -0.296875 +v -0.101562 -0.500000 -0.339844 +v -0.113281 -0.500000 -0.113281 +v -0.339844 -0.500000 -0.101562 +v 0.390625 -0.375000 -0.265625 +v 0.390625 -0.125000 -0.265625 +v 0.453125 -0.125000 -0.093750 +v 0.453125 -0.375000 -0.093750 +v 0.380317 0.353299 -0.263129 +v 0.438965 0.359375 -0.094727 +v 0.453125 0.125000 -0.093750 +v 0.390625 0.125000 -0.265625 +v 0.380317 0.353299 0.263129 +v 0.390625 0.125000 0.265625 +v 0.453125 0.125000 0.093750 +v 0.438965 0.359375 0.094727 +v 0.390625 -0.375000 0.265625 +v 0.453125 -0.375000 0.093750 +v 0.453125 -0.125000 0.093750 +v 0.390625 -0.125000 0.265625 +v -0.390625 -0.375000 0.265625 +v -0.390625 -0.125000 0.265625 +v -0.453125 -0.125000 0.093750 +v -0.453125 -0.375000 0.093750 +v -0.380317 0.353299 0.263129 +v -0.438965 0.359375 0.094727 +v -0.453125 0.125000 0.093750 +v -0.390625 0.125000 0.265625 +v -0.380317 0.353299 -0.263129 +v -0.390625 0.125000 -0.265625 +v -0.453125 0.125000 -0.093750 +v -0.438965 0.359375 -0.094727 +v -0.390625 -0.375000 -0.265625 +v -0.453125 -0.375000 -0.093750 +v -0.453125 -0.125000 -0.093750 +v -0.390625 -0.125000 -0.265625 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.500000 0.125000 +vt 0.500000 0.375000 +vt 0.500000 0.625000 +vt 0.500000 0.875000 +vt 0.750000 0.125000 +vt 0.250000 0.125000 +vt 0.500000 0.000000 +vt 0.625000 0.125000 +vt 0.500000 0.250000 +vt 0.375000 0.125000 +vt 0.625000 0.375000 +vt 0.500000 0.500000 +vt 0.375000 0.375000 +vt 0.625000 0.625000 +vt 0.500000 0.750000 +vt 0.375000 0.625000 +vt 0.625000 0.875000 +vt 0.500000 1.000000 +vt 0.375000 0.875000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.250000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.125000 0.125000 +vt 0.562500 0.062500 +vt 0.562500 0.187500 +vt 0.437500 0.187500 +vt 0.437500 0.062500 +vt 0.562500 0.312500 +vt 0.562500 0.437500 +vt 0.437500 0.437500 +vt 0.437500 0.312500 +vt 0.562500 0.562500 +vt 0.562500 0.687500 +vt 0.437500 0.687500 +vt 0.437500 0.562500 +vt 0.562500 0.812500 +vt 0.562500 0.937500 +vt 0.437500 0.937500 +vt 0.437500 0.812500 +vt 0.812500 0.062500 +vt 0.812500 0.187500 +vt 0.687500 0.187500 +vt 0.687500 0.062500 +vt 0.312500 0.062500 +vt 0.312500 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.062500 +vt 0.562500 0.000000 +vt 0.625000 0.062500 +vt 0.562500 0.125000 +vt 0.500000 0.062500 +vt 0.625000 0.187500 +vt 0.562500 0.250000 +vt 0.500000 0.187500 +vt 0.437500 0.250000 +vt 0.375000 0.187500 +vt 0.437500 0.125000 +vt 0.375000 0.062500 +vt 0.437500 0.000000 +vt 0.625000 0.312500 +vt 0.562500 0.375000 +vt 0.500000 0.312500 +vt 0.625000 0.437500 +vt 0.562500 0.500000 +vt 0.500000 0.437500 +vt 0.437500 0.500000 +vt 0.375000 0.437500 +vt 0.437500 0.375000 +vt 0.375000 0.312500 +vt 0.625000 0.562500 +vt 0.562500 0.625000 +vt 0.500000 0.562500 +vt 0.625000 0.687500 +vt 0.562500 0.750000 +vt 0.500000 0.687500 +vt 0.437500 0.750000 +vt 0.375000 0.687500 +vt 0.437500 0.625000 +vt 0.375000 0.562500 +vt 0.625000 0.812500 +vt 0.562500 0.875000 +vt 0.500000 0.812500 +vt 0.625000 0.937500 +vt 0.562500 1.000000 +vt 0.500000 0.937500 +vt 0.437500 1.000000 +vt 0.375000 0.937500 +vt 0.437500 0.875000 +vt 0.375000 0.812500 +vt 0.812500 0.000000 +vt 0.875000 0.062500 +vt 0.812500 0.125000 +vt 0.750000 0.062500 +vt 0.875000 0.187500 +vt 0.812500 0.250000 +vt 0.750000 0.187500 +vt 0.687500 0.250000 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.125000 +vt 0.250000 0.062500 +vt 0.312500 0.250000 +vt 0.250000 0.187500 +vt 0.187500 0.250000 +vt 0.125000 0.187500 +vt 0.187500 0.125000 +vt 0.125000 0.062500 +vt 0.187500 0.000000 +vt 0.593750 0.031250 +vt 0.593750 0.093750 +vt 0.531250 0.093750 +vt 0.531250 0.031250 +vt 0.593750 0.218750 +vt 0.531250 0.218750 +vt 0.531250 0.156250 +vt 0.593750 0.156250 +vt 0.406250 0.218750 +vt 0.406250 0.156250 +vt 0.468750 0.156250 +vt 0.468750 0.218750 +vt 0.406250 0.031250 +vt 0.468750 0.031250 +vt 0.468750 0.093750 +vt 0.406250 0.093750 +vt 0.593750 0.281250 +vt 0.593750 0.343750 +vt 0.531250 0.343750 +vt 0.531250 0.281250 +vt 0.593750 0.468750 +vt 0.531250 0.468750 +vt 0.531250 0.406250 +vt 0.593750 0.406250 +vt 0.406250 0.468750 +vt 0.406250 0.406250 +vt 0.468750 0.406250 +vt 0.468750 0.468750 +vt 0.406250 0.281250 +vt 0.468750 0.281250 +vt 0.468750 0.343750 +vt 0.406250 0.343750 +vt 0.593750 0.531250 +vt 0.593750 0.593750 +vt 0.531250 0.593750 +vt 0.531250 0.531250 +vt 0.593750 0.718750 +vt 0.531250 0.718750 +vt 0.531250 0.656250 +vt 0.593750 0.656250 +vt 0.406250 0.718750 +vt 0.406250 0.656250 +vt 0.468750 0.656250 +vt 0.468750 0.718750 +vt 0.406250 0.531250 +vt 0.468750 0.531250 +vt 0.468750 0.593750 +vt 0.406250 0.593750 +vt 0.593750 0.781250 +vt 0.593750 0.843750 +vt 0.531250 0.843750 +vt 0.531250 0.781250 +vt 0.593750 0.968750 +vt 0.531250 0.968750 +vt 0.531250 0.906250 +vt 0.593750 0.906250 +vt 0.406250 0.968750 +vt 0.406250 0.906250 +vt 0.468750 0.906250 +vt 0.468750 0.968750 +vt 0.406250 0.781250 +vt 0.468750 0.781250 +vt 0.468750 0.843750 +vt 0.406250 0.843750 +vt 0.843750 0.031250 +vt 0.843750 0.093750 +vt 0.781250 0.093750 +vt 0.781250 0.031250 +vt 0.843750 0.218750 +vt 0.781250 0.218750 +vt 0.781250 0.156250 +vt 0.843750 0.156250 +vt 0.656250 0.218750 +vt 0.656250 0.156250 +vt 0.718750 0.156250 +vt 0.718750 0.218750 +vt 0.656250 0.031250 +vt 0.718750 0.031250 +vt 0.718750 0.093750 +vt 0.656250 0.093750 +vt 0.343750 0.031250 +vt 0.343750 0.093750 +vt 0.281250 0.093750 +vt 0.281250 0.031250 +vt 0.343750 0.218750 +vt 0.281250 0.218750 +vt 0.281250 0.156250 +vt 0.343750 0.156250 +vt 0.156250 0.218750 +vt 0.156250 0.156250 +vt 0.218750 0.156250 +vt 0.218750 0.218750 +vt 0.156250 0.031250 +vt 0.218750 0.031250 +vt 0.218750 0.093750 +vt 0.156250 0.093750 +vt 0.593750 0.000000 +vt 0.625000 0.031250 +vt 0.593750 0.062500 +vt 0.562500 0.031250 +vt 0.625000 0.093750 +vt 0.593750 0.125000 +vt 0.562500 0.093750 +vt 0.531250 0.125000 +vt 0.500000 0.093750 +vt 0.531250 0.062500 +vt 0.500000 0.031250 +vt 0.531250 0.000000 +vt 0.625000 0.218750 +vt 0.593750 0.250000 +vt 0.562500 0.218750 +vt 0.593750 0.187500 +vt 0.531250 0.250000 +vt 0.500000 0.218750 +vt 0.531250 0.187500 +vt 0.500000 0.156250 +vt 0.562500 0.156250 +vt 0.625000 0.156250 +vt 0.406250 0.250000 +vt 0.375000 0.218750 +vt 0.406250 0.187500 +vt 0.437500 0.218750 +vt 0.375000 0.156250 +vt 0.406250 0.125000 +vt 0.437500 0.156250 +vt 0.468750 0.125000 +vt 0.468750 0.187500 +vt 0.468750 0.250000 +vt 0.375000 0.031250 +vt 0.406250 0.000000 +vt 0.437500 0.031250 +vt 0.406250 0.062500 +vt 0.468750 0.000000 +vt 0.468750 0.062500 +vt 0.437500 0.093750 +vt 0.375000 0.093750 +vt 0.625000 0.281250 +vt 0.593750 0.312500 +vt 0.562500 0.281250 +vt 0.625000 0.343750 +vt 0.593750 0.375000 +vt 0.562500 0.343750 +vt 0.531250 0.375000 +vt 0.500000 0.343750 +vt 0.531250 0.312500 +vt 0.500000 0.281250 +vt 0.625000 0.468750 +vt 0.593750 0.500000 +vt 0.562500 0.468750 +vt 0.593750 0.437500 +vt 0.531250 0.500000 +vt 0.500000 0.468750 +vt 0.531250 0.437500 +vt 0.500000 0.406250 +vt 0.562500 0.406250 +vt 0.625000 0.406250 +vt 0.406250 0.500000 +vt 0.375000 0.468750 +vt 0.406250 0.437500 +vt 0.437500 0.468750 +vt 0.375000 0.406250 +vt 0.406250 0.375000 +vt 0.437500 0.406250 +vt 0.468750 0.375000 +vt 0.468750 0.437500 +vt 0.468750 0.500000 +vt 0.375000 0.281250 +vt 0.437500 0.281250 +vt 0.406250 0.312500 +vt 0.468750 0.312500 +vt 0.437500 0.343750 +vt 0.375000 0.343750 +vt 0.625000 0.531250 +vt 0.593750 0.562500 +vt 0.562500 0.531250 +vt 0.625000 0.593750 +vt 0.593750 0.625000 +vt 0.562500 0.593750 +vt 0.531250 0.625000 +vt 0.500000 0.593750 +vt 0.531250 0.562500 +vt 0.500000 0.531250 +vt 0.625000 0.718750 +vt 0.593750 0.750000 +vt 0.562500 0.718750 +vt 0.593750 0.687500 +vt 0.531250 0.750000 +vt 0.500000 0.718750 +vt 0.531250 0.687500 +vt 0.500000 0.656250 +vt 0.562500 0.656250 +vt 0.625000 0.656250 +vt 0.406250 0.750000 +vt 0.375000 0.718750 +vt 0.406250 0.687500 +vt 0.437500 0.718750 +vt 0.375000 0.656250 +vt 0.406250 0.625000 +vt 0.437500 0.656250 +vt 0.468750 0.625000 +vt 0.468750 0.687500 +vt 0.468750 0.750000 +vt 0.375000 0.531250 +vt 0.437500 0.531250 +vt 0.406250 0.562500 +vt 0.468750 0.562500 +vt 0.437500 0.593750 +vt 0.375000 0.593750 +vt 0.625000 0.781250 +vt 0.593750 0.812500 +vt 0.562500 0.781250 +vt 0.625000 0.843750 +vt 0.593750 0.875000 +vt 0.562500 0.843750 +vt 0.531250 0.875000 +vt 0.500000 0.843750 +vt 0.531250 0.812500 +vt 0.500000 0.781250 +vt 0.625000 0.968750 +vt 0.593750 1.000000 +vt 0.562500 0.968750 +vt 0.593750 0.937500 +vt 0.531250 1.000000 +vt 0.500000 0.968750 +vt 0.531250 0.937500 +vt 0.500000 0.906250 +vt 0.562500 0.906250 +vt 0.625000 0.906250 +vt 0.406250 1.000000 +vt 0.375000 0.968750 +vt 0.406250 0.937500 +vt 0.437500 0.968750 +vt 0.375000 0.906250 +vt 0.406250 0.875000 +vt 0.437500 0.906250 +vt 0.468750 0.875000 +vt 0.468750 0.937500 +vt 0.468750 1.000000 +vt 0.375000 0.781250 +vt 0.437500 0.781250 +vt 0.406250 0.812500 +vt 0.468750 0.812500 +vt 0.437500 0.843750 +vt 0.375000 0.843750 +vt 0.843750 0.000000 +vt 0.875000 0.031250 +vt 0.843750 0.062500 +vt 0.812500 0.031250 +vt 0.875000 0.093750 +vt 0.843750 0.125000 +vt 0.812500 0.093750 +vt 0.781250 0.125000 +vt 0.750000 0.093750 +vt 0.781250 0.062500 +vt 0.750000 0.031250 +vt 0.781250 0.000000 +vt 0.875000 0.218750 +vt 0.843750 0.250000 +vt 0.812500 0.218750 +vt 0.843750 0.187500 +vt 0.781250 0.250000 +vt 0.750000 0.218750 +vt 0.781250 0.187500 +vt 0.750000 0.156250 +vt 0.812500 0.156250 +vt 0.875000 0.156250 +vt 0.656250 0.250000 +vt 0.656250 0.187500 +vt 0.687500 0.218750 +vt 0.656250 0.125000 +vt 0.687500 0.156250 +vt 0.718750 0.125000 +vt 0.718750 0.187500 +vt 0.718750 0.250000 +vt 0.656250 0.000000 +vt 0.687500 0.031250 +vt 0.656250 0.062500 +vt 0.718750 0.000000 +vt 0.718750 0.062500 +vt 0.687500 0.093750 +vt 0.343750 0.000000 +vt 0.343750 0.062500 +vt 0.312500 0.031250 +vt 0.343750 0.125000 +vt 0.312500 0.093750 +vt 0.281250 0.125000 +vt 0.250000 0.093750 +vt 0.281250 0.062500 +vt 0.250000 0.031250 +vt 0.281250 0.000000 +vt 0.343750 0.250000 +vt 0.312500 0.218750 +vt 0.343750 0.187500 +vt 0.281250 0.250000 +vt 0.250000 0.218750 +vt 0.281250 0.187500 +vt 0.250000 0.156250 +vt 0.312500 0.156250 +vt 0.156250 0.250000 +vt 0.125000 0.218750 +vt 0.156250 0.187500 +vt 0.187500 0.218750 +vt 0.125000 0.156250 +vt 0.156250 0.125000 +vt 0.187500 0.156250 +vt 0.218750 0.125000 +vt 0.218750 0.187500 +vt 0.218750 0.250000 +vt 0.125000 0.031250 +vt 0.156250 0.000000 +vt 0.187500 0.031250 +vt 0.156250 0.062500 +vt 0.218750 0.000000 +vt 0.218750 0.062500 +vt 0.187500 0.093750 +vt 0.125000 0.093750 +vn 0.421933 -0.546828 0.723154 +vn 0.668585 -0.325558 0.668585 +vn 0.706862 -0.026337 0.706861 +vn 0.515686 -0.035549 0.856040 +vn 0.707107 0.000000 0.707107 +vn 0.524097 0.000000 0.851658 +vn 0.341743 0.000000 0.939793 +vn 0.335850 -0.049491 0.940615 +vn 0.257079 -0.613351 0.746801 +vn 0.707107 0.000000 0.707107 +vn 0.707107 0.000000 0.707107 +vn 0.524097 0.000000 0.851658 +vn 0.524097 0.000000 0.851658 +vn 0.341743 0.000000 0.939793 +vn 0.341743 0.000000 0.939793 +vn 0.167799 0.000000 0.985821 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.167799 0.000000 0.985821 +vn 0.000000 0.000000 1.000000 +vn 0.167799 0.000000 0.985821 +vn 0.000000 -0.060600 0.998162 +vn 0.000000 -0.668974 0.743286 +vn 0.121045 -0.656553 0.744504 +vn 0.164990 -0.057974 0.984590 +vn 0.701361 0.127221 0.701361 +vn 0.660195 0.358168 0.660195 +vn 0.436774 0.544061 0.716398 +vn 0.503044 0.155062 0.850237 +vn 0.256463 0.618846 0.742467 +vn 0.320076 0.194038 0.927308 +vn 0.336268 0.051529 0.940355 +vn 0.520454 0.044552 0.852727 +vn 0.706492 0.041687 0.706492 +vn 0.114276 0.660763 0.741845 +vn 0.000000 0.671186 0.741289 +vn 0.000000 0.225778 0.974179 +vn 0.154059 0.218120 0.963685 +vn 0.000000 0.060634 0.998160 +vn 0.164277 0.058100 0.984702 +vn 0.000000 0.014464 0.999895 +vn 0.167084 0.013827 0.985846 +vn 0.340571 0.012182 0.940140 +vn 0.707073 0.009772 0.707073 +vn 0.523289 0.010468 0.852091 +vn -0.436774 0.544061 0.716398 +vn -0.660195 0.358168 0.660195 +vn -0.701361 0.127221 0.701361 +vn -0.503044 0.155062 0.850237 +vn -0.706492 0.041687 0.706492 +vn -0.520454 0.044552 0.852727 +vn -0.336268 0.051529 0.940355 +vn -0.320077 0.194038 0.927308 +vn -0.256463 0.618846 0.742467 +vn -0.707073 0.009772 0.707073 +vn -0.707107 0.000000 0.707107 +vn -0.524097 0.000000 0.851658 +vn -0.523289 0.010468 0.852091 +vn -0.341743 0.000000 0.939793 +vn -0.340571 0.012182 0.940140 +vn -0.167799 0.000000 0.985821 +vn -0.167084 0.013827 0.985846 +vn -0.164277 0.058100 0.984702 +vn -0.114276 0.660763 0.741845 +vn -0.154059 0.218120 0.963685 +vn -0.706862 -0.026337 0.706861 +vn -0.668585 -0.325558 0.668585 +vn -0.421933 -0.546828 0.723154 +vn -0.515686 -0.035549 0.856040 +vn -0.257079 -0.613351 0.746801 +vn -0.335850 -0.049491 0.940615 +vn -0.341743 0.000000 0.939793 +vn -0.524097 0.000000 0.851658 +vn -0.707107 0.000000 0.707107 +vn -0.121045 -0.656553 0.744504 +vn -0.164990 -0.057974 0.984590 +vn -0.167799 0.000000 0.985821 +vn -0.167799 0.000000 0.985821 +vn -0.341743 0.000000 0.939793 +vn -0.707107 0.000000 0.707107 +vn -0.524097 0.000000 0.851658 +vn 0.716398 0.544061 0.436774 +vn 0.330377 0.884139 0.330377 +vn 0.742467 0.618846 0.256463 +vn 0.291875 0.947056 0.133766 +vn 0.084608 0.992816 0.084608 +vn 0.133766 0.947056 0.291875 +vn 0.741845 0.660763 0.114276 +vn 0.741289 0.671186 0.000000 +vn 0.269890 0.962891 -0.000000 +vn 0.273956 0.960577 0.047331 +vn 0.072717 0.997353 0.000000 +vn 0.074693 0.996945 0.022836 +vn 0.017303 0.999850 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.999850 0.017303 +vn 0.018186 0.999669 0.018186 +vn 0.000000 0.997353 0.072717 +vn 0.022836 0.996945 0.074693 +vn -0.000000 0.962891 0.269890 +vn 0.047331 0.960577 0.273956 +vn 0.716398 0.544061 -0.436774 +vn 0.660195 0.358168 -0.660195 +vn 0.436774 0.544061 -0.716398 +vn 0.330377 0.884139 -0.330377 +vn 0.256463 0.618846 -0.742467 +vn 0.133766 0.947056 -0.291875 +vn 0.084608 0.992816 -0.084608 +vn 0.291875 0.947056 -0.133766 +vn 0.742467 0.618846 -0.256463 +vn 0.114276 0.660763 -0.741845 +vn 0.000000 0.671186 -0.741289 +vn -0.000000 0.962891 -0.269890 +vn 0.047331 0.960577 -0.273956 +vn 0.000000 0.997353 -0.072717 +vn 0.022836 0.996945 -0.074693 +vn 0.000000 0.999850 -0.017303 +vn 0.018186 0.999669 -0.018186 +vn 0.074693 0.996945 -0.022836 +vn 0.741845 0.660763 -0.114276 +vn 0.273956 0.960577 -0.047331 +vn -0.436774 0.544061 -0.716398 +vn -0.660195 0.358168 -0.660195 +vn -0.716398 0.544061 -0.436774 +vn -0.330377 0.884139 -0.330377 +vn -0.742467 0.618846 -0.256463 +vn -0.291875 0.947056 -0.133766 +vn -0.084608 0.992816 -0.084608 +vn -0.133766 0.947056 -0.291875 +vn -0.256463 0.618846 -0.742467 +vn -0.741845 0.660763 -0.114276 +vn -0.741289 0.671186 0.000000 +vn -0.269890 0.962891 0.000000 +vn -0.273956 0.960577 -0.047331 +vn -0.072717 0.997353 0.000000 +vn -0.074693 0.996945 -0.022836 +vn -0.017303 0.999850 0.000000 +vn -0.018186 0.999669 -0.018186 +vn -0.022836 0.996945 -0.074693 +vn -0.114276 0.660763 -0.741845 +vn -0.047331 0.960577 -0.273956 +vn -0.716398 0.544061 0.436774 +vn -0.330377 0.884139 0.330377 +vn -0.133766 0.947056 0.291875 +vn -0.084608 0.992816 0.084608 +vn -0.291875 0.947056 0.133766 +vn -0.742467 0.618846 0.256463 +vn -0.047331 0.960577 0.273956 +vn -0.022836 0.996945 0.074693 +vn -0.018186 0.999669 0.018186 +vn -0.074693 0.996945 0.022836 +vn -0.741845 0.660763 0.114276 +vn -0.273956 0.960577 0.047331 +vn 0.701361 0.127221 -0.701361 +vn 0.503044 0.155062 -0.850237 +vn 0.706492 0.041687 -0.706492 +vn 0.520454 0.044552 -0.852727 +vn 0.336268 0.051529 -0.940355 +vn 0.320077 0.194038 -0.927308 +vn 0.707073 0.009772 -0.707073 +vn 0.707107 0.000000 -0.707107 +vn 0.524097 0.000000 -0.851658 +vn 0.523289 0.010468 -0.852091 +vn 0.341743 0.000000 -0.939793 +vn 0.340571 0.012182 -0.940140 +vn 0.167799 0.000000 -0.985821 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.014464 -0.999895 +vn 0.167084 0.013827 -0.985846 +vn 0.000000 0.060634 -0.998160 +vn 0.164277 0.058100 -0.984702 +vn 0.000000 0.225778 -0.974179 +vn 0.154059 0.218120 -0.963685 +vn 0.706862 -0.026337 -0.706861 +vn 0.668585 -0.325558 -0.668585 +vn 0.421933 -0.546828 -0.723154 +vn 0.515686 -0.035549 -0.856040 +vn 0.257079 -0.613351 -0.746801 +vn 0.335850 -0.049491 -0.940615 +vn 0.341743 0.000000 -0.939793 +vn 0.524097 0.000000 -0.851658 +vn 0.707107 0.000000 -0.707107 +vn 0.121045 -0.656553 -0.744504 +vn 0.000000 -0.668974 -0.743286 +vn 0.000000 -0.060600 -0.998162 +vn 0.164990 -0.057974 -0.984590 +vn 0.000000 0.000000 -1.000000 +vn 0.167799 0.000000 -0.985821 +vn 0.000000 0.000000 -1.000000 +vn 0.167799 0.000000 -0.985821 +vn 0.341743 0.000000 -0.939793 +vn 0.707107 0.000000 -0.707107 +vn 0.524097 0.000000 -0.851658 +vn -0.421933 -0.546828 -0.723154 +vn -0.668585 -0.325558 -0.668585 +vn -0.706862 -0.026337 -0.706861 +vn -0.515686 -0.035549 -0.856040 +vn -0.707107 0.000000 -0.707107 +vn -0.524097 0.000000 -0.851658 +vn -0.341743 0.000000 -0.939793 +vn -0.335850 -0.049491 -0.940615 +vn -0.257079 -0.613351 -0.746801 +vn -0.707107 0.000000 -0.707107 +vn -0.707107 0.000000 -0.707107 +vn -0.524097 0.000000 -0.851658 +vn -0.524097 0.000000 -0.851658 +vn -0.341743 0.000000 -0.939793 +vn -0.341743 0.000000 -0.939793 +vn -0.167799 0.000000 -0.985821 +vn -0.167799 0.000000 -0.985821 +vn -0.167799 0.000000 -0.985821 +vn -0.121045 -0.656553 -0.744504 +vn -0.164990 -0.057974 -0.984590 +vn -0.701361 0.127221 -0.701361 +vn -0.503044 0.155062 -0.850237 +vn -0.320076 0.194038 -0.927308 +vn -0.336268 0.051529 -0.940355 +vn -0.520454 0.044552 -0.852727 +vn -0.706492 0.041687 -0.706492 +vn -0.154059 0.218120 -0.963685 +vn -0.164277 0.058100 -0.984702 +vn -0.167084 0.013827 -0.985846 +vn -0.340571 0.012182 -0.940140 +vn -0.707073 0.009772 -0.707073 +vn -0.523289 0.010468 -0.852091 +vn 0.723154 -0.546828 -0.421933 +vn 0.117531 -0.986090 -0.117531 +vn 0.746801 -0.613351 -0.257079 +vn 0.079913 -0.996521 -0.023643 +vn 0.000000 -1.000000 0.000000 +vn 0.023643 -0.996521 -0.079913 +vn 0.744504 -0.656553 -0.121045 +vn 0.743286 -0.668974 0.000000 +vn 0.073093 -0.997325 0.000000 +vn 0.074421 -0.997170 -0.010678 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -0.997325 -0.073093 +vn 0.010678 -0.997170 -0.074420 +vn 0.723154 -0.546828 0.421933 +vn 0.117531 -0.986090 0.117531 +vn 0.023643 -0.996521 0.079913 +vn 0.000000 -1.000000 0.000000 +vn 0.079913 -0.996521 0.023643 +vn 0.746801 -0.613351 0.257079 +vn 0.000000 -0.997325 0.073093 +vn 0.010678 -0.997170 0.074420 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.744504 -0.656553 0.121045 +vn 0.074421 -0.997170 0.010678 +vn -0.723154 -0.546828 0.421933 +vn -0.117531 -0.986090 0.117531 +vn -0.746801 -0.613351 0.257079 +vn -0.079913 -0.996521 0.023643 +vn 0.000000 -1.000000 0.000000 +vn -0.023643 -0.996521 0.079913 +vn -0.744504 -0.656553 0.121045 +vn -0.743286 -0.668974 0.000000 +vn -0.073093 -0.997325 0.000000 +vn -0.074421 -0.997170 0.010678 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.010678 -0.997170 0.074420 +vn -0.723154 -0.546828 -0.421933 +vn -0.117531 -0.986090 -0.117531 +vn -0.023643 -0.996521 -0.079913 +vn 0.000000 -1.000000 0.000000 +vn -0.079913 -0.996521 -0.023643 +vn -0.746801 -0.613351 -0.257079 +vn -0.010678 -0.997170 -0.074420 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.744504 -0.656553 -0.121045 +vn -0.074421 -0.997170 -0.010678 +vn 0.856040 -0.035549 -0.515685 +vn 0.851658 0.000000 -0.524097 +vn 0.939793 0.000000 -0.341743 +vn 0.940615 -0.049491 -0.335850 +vn 0.851658 0.000000 -0.524097 +vn 0.851658 0.000000 -0.524097 +vn 0.939793 0.000000 -0.341743 +vn 0.939793 0.000000 -0.341743 +vn 0.985821 0.000000 -0.167799 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.985821 0.000000 -0.167799 +vn 1.000000 0.000000 0.000000 +vn 0.985821 0.000000 -0.167799 +vn 0.998162 -0.060600 0.000000 +vn 0.984590 -0.057974 -0.164990 +vn 0.850237 0.155062 -0.503044 +vn 0.927308 0.194038 -0.320077 +vn 0.940355 0.051529 -0.336268 +vn 0.852727 0.044552 -0.520454 +vn 0.974179 0.225778 0.000000 +vn 0.963685 0.218120 -0.154059 +vn 0.998160 0.060634 -0.000000 +vn 0.984702 0.058101 -0.164277 +vn 0.999895 0.014464 0.000000 +vn 0.985846 0.013827 -0.167084 +vn 0.940140 0.012182 -0.340571 +vn 0.852091 0.010468 -0.523289 +vn 0.850237 0.155062 0.503044 +vn 0.852727 0.044552 0.520454 +vn 0.940355 0.051529 0.336268 +vn 0.927308 0.194038 0.320077 +vn 0.851658 0.000000 0.524097 +vn 0.852091 0.010468 0.523289 +vn 0.939793 0.000000 0.341743 +vn 0.940140 0.012182 0.340571 +vn 0.985821 0.000000 0.167799 +vn 0.985846 0.013827 0.167084 +vn 0.984702 0.058101 0.164277 +vn 0.963685 0.218120 0.154059 +vn 0.856040 -0.035549 0.515685 +vn 0.940615 -0.049491 0.335850 +vn 0.939793 0.000000 0.341743 +vn 0.851658 0.000000 0.524097 +vn 0.984590 -0.057974 0.164990 +vn 0.985821 0.000000 0.167799 +vn 0.985821 0.000000 0.167799 +vn 0.939793 0.000000 0.341743 +vn 0.851658 0.000000 0.524097 +vn -0.856040 -0.035549 0.515685 +vn -0.851658 0.000000 0.524097 +vn -0.939793 0.000000 0.341743 +vn -0.940615 -0.049491 0.335850 +vn -0.851658 0.000000 0.524097 +vn -0.851658 0.000000 0.524097 +vn -0.939793 0.000000 0.341743 +vn -0.939793 0.000000 0.341743 +vn -0.985821 0.000000 0.167799 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.985821 0.000000 0.167799 +vn -1.000000 0.000000 0.000000 +vn -0.985821 0.000000 0.167799 +vn -0.998162 -0.060600 0.000000 +vn -0.984590 -0.057974 0.164990 +vn -0.850237 0.155062 0.503044 +vn -0.927308 0.194038 0.320077 +vn -0.940355 0.051529 0.336268 +vn -0.852727 0.044552 0.520454 +vn -0.974179 0.225778 0.000000 +vn -0.963685 0.218120 0.154059 +vn -0.998160 0.060634 0.000000 +vn -0.984702 0.058101 0.164277 +vn -0.999895 0.014464 0.000000 +vn -0.985846 0.013827 0.167084 +vn -0.940140 0.012182 0.340571 +vn -0.852091 0.010468 0.523289 +vn -0.850237 0.155062 -0.503044 +vn -0.852727 0.044552 -0.520454 +vn -0.940355 0.051529 -0.336268 +vn -0.927308 0.194038 -0.320077 +vn -0.851658 0.000000 -0.524097 +vn -0.852091 0.010468 -0.523289 +vn -0.939793 0.000000 -0.341743 +vn -0.940140 0.012182 -0.340571 +vn -0.985821 0.000000 -0.167799 +vn -0.985846 0.013827 -0.167084 +vn -0.984702 0.058101 -0.164277 +vn -0.963685 0.218120 -0.154059 +vn -0.856040 -0.035549 -0.515685 +vn -0.940615 -0.049491 -0.335850 +vn -0.939793 0.000000 -0.341743 +vn -0.851658 0.000000 -0.524097 +vn -0.984590 -0.057974 -0.164990 +vn -0.985821 0.000000 -0.167799 +vn -0.985821 0.000000 -0.167799 +vn -0.939793 0.000000 -0.341743 +vn -0.851658 0.000000 -0.524097 +s 1 +g pCube1 +f 102/222/1 2/2/2 119/223/3 291/126/4 +f 119/223/3 37/65/5 196/224/6 291/126/4 +f 196/224/6 75/40/7 195/225/8 291/126/4 +f 195/225/8 28/64/9 102/222/1 291/126/4 +f 120/226/10 14/22/11 150/227/12 292/127/13 +f 150/227/12 52/66/14 197/228/15 292/127/13 +f 197/228/15 75/40/7 196/224/6 292/127/13 +f 196/224/6 37/65/5 120/226/10 292/127/13 +f 149/229/16 21/15/17 147/230/18 293/128/19 +f 147/230/18 51/67/20 198/231/21 293/128/19 +f 198/231/21 75/40/7 197/228/15 293/128/19 +f 197/228/15 52/66/14 149/229/16 293/128/19 +f 148/232/22 9/21/23 101/233/24 294/129/25 +f 101/233/24 28/64/9 195/225/8 294/129/25 +f 195/225/8 75/40/7 198/231/21 294/129/25 +f 198/231/21 51/67/20 148/232/22 294/129/25 +f 122/234/26 4/4/27 106/235/28 295/130/29 +f 106/235/28 30/69/30 200/236/31 295/130/29 +f 200/236/31 76/41/32 199/237/33 295/130/29 +f 199/237/33 38/68/34 122/234/26 295/130/29 +f 105/238/35 10/23/36 152/239/37 296/131/38 +f 152/239/37 53/70/39 201/240/40 296/131/38 +f 201/240/40 76/41/32 200/236/31 296/131/38 +f 200/236/31 30/69/30 105/238/35 296/131/38 +f 151/241/41 21/15/17 149/229/16 297/132/42 +f 149/229/16 52/66/14 202/242/43 297/132/42 +f 202/242/43 76/41/32 201/240/40 297/132/42 +f 201/240/40 53/70/39 151/241/41 297/132/42 +f 150/227/12 14/22/11 121/243/44 298/133/45 +f 121/243/44 38/68/34 199/237/33 298/133/45 +f 199/237/33 76/41/32 202/242/43 298/133/45 +f 202/242/43 52/66/14 150/227/12 298/133/45 +f 103/244/46 3/3/47 118/245/48 299/134/49 +f 118/245/48 36/72/50 204/246/51 299/134/49 +f 204/246/51 77/42/52 203/247/53 299/134/49 +f 203/247/53 29/71/54 103/244/46 299/134/49 +f 117/248/55 13/24/56 154/249/57 300/135/58 +f 154/249/57 54/73/59 205/250/60 300/135/58 +f 205/250/60 77/42/52 204/246/51 300/135/58 +f 204/246/51 36/72/50 117/248/55 300/135/58 +f 153/251/61 21/15/17 151/241/41 301/136/62 +f 151/241/41 53/70/39 206/252/63 301/136/62 +f 206/252/63 77/42/52 205/250/60 301/136/62 +f 205/250/60 54/73/59 153/251/61 301/136/62 +f 152/239/37 10/23/36 104/253/64 302/137/65 +f 104/253/64 29/71/54 203/247/53 302/137/65 +f 203/247/53 77/42/52 206/252/63 302/137/65 +f 206/252/63 53/70/39 152/239/37 302/137/65 +f 115/254/66 1/1/67 99/255/68 303/138/69 +f 99/255/68 27/75/70 208/256/71 303/138/69 +f 208/256/71 78/43/72 207/257/73 303/138/69 +f 207/257/73 35/74/74 115/254/66 303/138/69 +f 100/258/75 9/21/23 148/232/22 304/139/76 +f 148/232/22 51/67/20 209/259/77 304/139/76 +f 209/259/77 78/43/72 208/256/71 304/139/76 +f 208/256/71 27/75/70 100/258/75 304/139/76 +f 147/230/18 21/15/17 153/251/61 305/140/78 +f 153/251/61 54/73/59 210/260/79 305/140/78 +f 210/260/79 78/43/72 209/259/77 305/140/78 +f 209/259/77 51/67/20 147/230/18 305/140/78 +f 154/249/57 13/24/56 116/261/80 306/141/81 +f 116/261/80 35/74/74 207/257/73 306/141/81 +f 207/257/73 78/43/72 210/260/79 306/141/81 +f 210/260/79 54/73/59 154/249/57 306/141/81 +f 106/235/28 4/4/27 127/262/82 307/142/83 +f 127/262/82 41/76/84 212/263/85 307/142/83 +f 212/263/85 79/44/86 211/264/87 307/142/83 +f 211/264/87 30/69/30 106/235/28 307/142/83 +f 128/265/88 16/25/89 158/266/90 308/143/91 +f 158/266/90 56/77/92 213/267/93 308/143/91 +f 213/267/93 79/44/86 212/263/85 308/143/91 +f 212/263/85 41/76/84 128/265/88 308/143/91 +f 157/268/94 22/16/95 155/269/96 309/144/97 +f 155/269/96 55/78/98 214/270/99 309/144/97 +f 214/270/99 79/44/86 213/267/93 309/144/97 +f 213/267/93 56/77/92 157/268/94 309/144/97 +f 156/271/100 10/23/36 105/238/35 310/145/101 +f 105/238/35 30/69/30 211/264/87 310/145/101 +f 211/264/87 79/44/86 214/270/99 310/145/101 +f 214/270/99 55/78/98 156/271/100 310/145/101 +f 130/272/102 6/6/103 110/273/104 311/146/105 +f 110/273/104 32/80/106 216/274/107 311/146/105 +f 216/274/107 80/45/108 215/275/109 311/146/105 +f 215/275/109 42/79/110 130/272/102 311/146/105 +f 109/276/111 11/26/112 160/277/113 312/147/114 +f 160/277/113 57/81/115 217/278/116 312/147/114 +f 217/278/116 80/45/108 216/274/107 312/147/114 +f 216/274/107 32/80/106 109/276/111 312/147/114 +f 159/279/117 22/16/95 157/268/94 313/148/118 +f 157/268/94 56/77/92 218/280/119 313/148/118 +f 218/280/119 80/45/108 217/278/116 313/148/118 +f 217/278/116 57/81/115 159/279/117 313/148/118 +f 158/266/90 16/25/89 129/281/120 314/149/121 +f 129/281/120 42/79/110 215/275/109 314/149/121 +f 215/275/109 80/45/108 218/280/119 314/149/121 +f 218/280/119 56/77/92 158/266/90 314/149/121 +f 107/282/122 5/5/123 126/283/124 315/150/125 +f 126/283/124 40/83/126 220/284/127 315/150/125 +f 220/284/127 81/46/128 219/285/129 315/150/125 +f 219/285/129 31/82/130 107/282/122 315/150/125 +f 125/286/131 15/27/132 162/287/133 316/151/134 +f 162/287/133 58/84/135 221/288/136 316/151/134 +f 221/288/136 81/46/128 220/284/127 316/151/134 +f 220/284/127 40/83/126 125/286/131 316/151/134 +f 161/289/137 22/16/95 159/279/117 317/152/138 +f 159/279/117 57/81/115 222/290/139 317/152/138 +f 222/290/139 81/46/128 221/288/136 317/152/138 +f 221/288/136 58/84/135 161/289/137 317/152/138 +f 160/277/113 11/26/112 108/291/140 318/153/141 +f 108/291/140 31/82/130 219/285/129 318/153/141 +f 219/285/129 81/46/128 222/290/139 318/153/141 +f 222/290/139 57/81/115 160/277/113 318/153/141 +f 123/292/142 3/3/47 103/244/46 319/154/143 +f 103/244/46 29/71/54 224/293/144 319/154/143 +f 224/293/144 82/47/145 223/294/146 319/154/143 +f 223/294/146 39/85/147 123/292/142 319/154/143 +f 104/253/64 10/23/36 156/271/100 320/155/148 +f 156/271/100 55/78/98 225/295/149 320/155/148 +f 225/295/149 82/47/145 224/293/144 320/155/148 +f 224/293/144 29/71/54 104/253/64 320/155/148 +f 155/269/96 22/16/95 161/289/137 321/156/150 +f 161/289/137 58/84/135 226/296/151 321/156/150 +f 226/296/151 82/47/145 225/295/149 321/156/150 +f 225/295/149 55/78/98 155/269/96 321/156/150 +f 162/287/133 15/27/132 124/297/152 322/157/153 +f 124/297/152 39/85/147 223/294/146 322/157/153 +f 223/294/146 82/47/145 226/296/151 322/157/153 +f 226/296/151 58/84/135 162/287/133 322/157/153 +f 110/273/104 6/6/103 135/298/154 323/158/155 +f 135/298/154 45/86/156 228/299/157 323/158/155 +f 228/299/157 83/48/158 227/300/159 323/158/155 +f 227/300/159 32/80/106 110/273/104 323/158/155 +f 136/301/160 18/28/161 166/302/162 324/159/163 +f 166/302/162 60/87/164 229/303/165 324/159/163 +f 229/303/165 83/48/158 228/299/157 324/159/163 +f 228/299/157 45/86/156 136/301/160 324/159/163 +f 165/304/166 23/17/167 163/305/168 325/160/169 +f 163/305/168 59/88/170 230/306/171 325/160/169 +f 230/306/171 83/48/158 229/303/165 325/160/169 +f 229/303/165 60/87/164 165/304/166 325/160/169 +f 164/307/172 11/26/112 109/276/111 326/161/173 +f 109/276/111 32/80/106 227/300/159 326/161/173 +f 227/300/159 83/48/158 230/306/171 326/161/173 +f 230/306/171 59/88/170 164/307/172 326/161/173 +f 138/308/174 8/8/175 114/309/176 327/162/177 +f 114/309/176 34/90/178 232/310/179 327/162/177 +f 232/310/179 84/49/180 231/311/181 327/162/177 +f 231/311/181 46/89/182 138/308/174 327/162/177 +f 113/312/183 12/29/184 168/313/185 328/163/186 +f 168/313/185 61/91/187 233/314/188 328/163/186 +f 233/314/188 84/49/180 232/310/179 328/163/186 +f 232/310/179 34/90/178 113/312/183 328/163/186 +f 167/315/189 23/17/167 165/304/166 329/164/190 +f 165/304/166 60/87/164 234/316/191 329/164/190 +f 234/316/191 84/49/180 233/314/188 329/164/190 +f 233/314/188 61/91/187 167/315/189 329/164/190 +f 166/302/162 18/28/161 137/317/192 330/165/193 +f 137/317/192 46/89/182 231/311/181 330/165/193 +f 231/311/181 84/49/180 234/316/191 330/165/193 +f 234/316/191 60/87/164 166/302/162 330/165/193 +f 111/318/194 7/7/195 134/319/196 331/166/197 +f 134/319/196 44/93/198 236/320/199 331/166/197 +f 236/320/199 85/50/200 235/321/201 331/166/197 +f 235/321/201 33/92/202 111/318/194 331/166/197 +f 133/322/203 17/30/204 170/323/205 332/167/206 +f 170/323/205 62/94/207 237/324/208 332/167/206 +f 237/324/208 85/50/200 236/320/199 332/167/206 +f 236/320/199 44/93/198 133/322/203 332/167/206 +f 169/325/209 23/17/167 167/315/189 333/168/210 +f 167/315/189 61/91/187 238/326/211 333/168/210 +f 238/326/211 85/50/200 237/324/208 333/168/210 +f 237/324/208 62/94/207 169/325/209 333/168/210 +f 168/313/185 12/29/184 112/327/212 334/169/213 +f 112/327/212 33/92/202 235/321/201 334/169/213 +f 235/321/201 85/50/200 238/326/211 334/169/213 +f 238/326/211 61/91/187 168/313/185 334/169/213 +f 131/328/214 5/5/123 107/282/122 335/170/215 +f 107/282/122 31/82/130 240/329/216 335/170/215 +f 240/329/216 86/51/217 239/330/218 335/170/215 +f 239/330/218 43/95/219 131/328/214 335/170/215 +f 108/291/140 11/26/112 164/307/172 336/171/220 +f 164/307/172 59/88/170 241/331/221 336/171/220 +f 241/331/221 86/51/217 240/329/216 336/171/220 +f 240/329/216 31/82/130 108/291/140 336/171/220 +f 163/305/168 23/17/167 169/325/209 337/172/222 +f 169/325/209 62/94/207 242/332/223 337/172/222 +f 242/332/223 86/51/217 241/331/221 337/172/222 +f 241/331/221 59/88/170 163/305/168 337/172/222 +f 170/323/205 17/30/204 132/333/224 338/173/225 +f 132/333/224 43/95/219 239/330/218 338/173/225 +f 239/330/218 86/51/217 242/332/223 338/173/225 +f 242/332/223 62/94/207 170/323/205 338/173/225 +f 114/309/176 8/8/175 143/334/226 339/174/227 +f 143/334/226 49/96/228 244/335/229 339/174/227 +f 244/335/229 87/52/230 243/336/231 339/174/227 +f 243/336/231 34/90/178 114/309/176 339/174/227 +f 144/337/232 20/31/233 174/338/234 340/175/235 +f 174/338/234 64/97/236 245/339/237 340/175/235 +f 245/339/237 87/52/230 244/335/229 340/175/235 +f 244/335/229 49/96/228 144/337/232 340/175/235 +f 173/340/238 24/18/239 171/341/240 341/176/241 +f 171/341/240 63/98/242 246/342/243 341/176/241 +f 246/342/243 87/52/230 245/339/237 341/176/241 +f 245/339/237 64/97/236 173/340/238 341/176/241 +f 172/343/244 12/29/184 113/312/183 342/177/245 +f 113/312/183 34/90/178 243/336/231 342/177/245 +f 243/336/231 87/52/230 246/342/243 342/177/245 +f 246/342/243 63/98/242 172/343/244 342/177/245 +f 146/344/246 2/10/2 102/345/1 343/178/247 +f 102/345/1 28/100/9 248/346/248 343/178/247 +f 248/346/248 88/53/249 247/347/250 343/178/247 +f 247/347/250 50/99/251 146/344/246 343/178/247 +f 101/348/24 9/32/23 176/349/252 344/179/253 +f 176/349/252 65/101/254 249/350/255 344/179/253 +f 249/350/255 88/53/249 248/346/248 344/179/253 +f 248/346/248 28/100/9 101/348/24 344/179/253 +f 175/351/256 24/18/239 173/340/238 345/180/257 +f 173/340/238 64/97/236 250/352/258 345/180/257 +f 250/352/258 88/53/249 249/350/255 345/180/257 +f 249/350/255 65/101/254 175/351/256 345/180/257 +f 174/338/234 20/31/233 145/353/259 346/181/260 +f 145/353/259 50/99/251 247/347/250 346/181/260 +f 247/347/250 88/53/249 250/352/258 346/181/260 +f 250/352/258 64/97/236 174/338/234 346/181/260 +f 99/354/68 1/9/67 142/355/261 347/182/262 +f 142/355/261 48/103/263 252/356/264 347/182/262 +f 252/356/264 89/54/265 251/357/266 347/182/262 +f 251/357/266 27/102/70 99/354/68 347/182/262 +f 141/358/267 19/33/268 178/359/269 348/183/270 +f 178/359/269 66/104/271 253/360/272 348/183/270 +f 253/360/272 89/54/265 252/356/264 348/183/270 +f 252/356/264 48/103/263 141/358/267 348/183/270 +f 177/361/273 24/18/239 175/351/256 349/184/274 +f 175/351/256 65/101/254 254/362/275 349/184/274 +f 254/362/275 89/54/265 253/360/272 349/184/274 +f 253/360/272 66/104/271 177/361/273 349/184/274 +f 176/349/252 9/32/23 100/363/75 350/185/276 +f 100/363/75 27/102/70 251/357/266 350/185/276 +f 251/357/266 89/54/265 254/362/275 350/185/276 +f 254/362/275 65/101/254 176/349/252 350/185/276 +f 139/364/277 7/7/195 111/318/194 351/186/278 +f 111/318/194 33/92/202 256/365/279 351/186/278 +f 256/365/279 90/55/280 255/366/281 351/186/278 +f 255/366/281 47/105/282 139/364/277 351/186/278 +f 112/327/212 12/29/184 172/343/244 352/187/283 +f 172/343/244 63/98/242 257/367/284 352/187/283 +f 257/367/284 90/55/280 256/365/279 352/187/283 +f 256/365/279 33/92/202 112/327/212 352/187/283 +f 171/341/240 24/18/239 177/361/273 353/188/285 +f 177/361/273 66/104/271 258/368/286 353/188/285 +f 258/368/286 90/55/280 257/367/284 353/188/285 +f 257/367/284 63/98/242 171/341/240 353/188/285 +f 178/359/269 19/33/268 140/369/287 354/189/288 +f 140/369/287 47/105/282 255/366/281 354/189/288 +f 255/366/281 90/55/280 258/368/286 354/189/288 +f 258/368/286 66/104/271 178/359/269 354/189/288 +f 143/370/226 8/11/175 138/371/174 355/190/289 +f 138/371/174 46/107/182 260/372/290 355/190/289 +f 260/372/290 91/56/291 259/373/292 355/190/289 +f 259/373/292 49/106/228 143/370/226 355/190/289 +f 137/374/192 18/35/161 182/375/293 356/191/294 +f 182/375/293 68/108/295 261/376/296 356/191/294 +f 261/376/296 91/56/291 260/372/290 356/191/294 +f 260/372/290 46/107/182 137/374/192 356/191/294 +f 181/377/297 25/19/298 179/378/299 357/192/300 +f 179/378/299 67/109/301 262/379/302 357/192/300 +f 262/379/302 91/56/291 261/376/296 357/192/300 +f 261/376/296 68/108/295 181/377/297 357/192/300 +f 180/380/303 20/34/233 144/381/232 358/193/304 +f 144/381/232 49/106/228 259/373/292 358/193/304 +f 259/373/292 91/56/291 262/379/302 358/193/304 +f 262/379/302 67/109/301 180/380/303 358/193/304 +f 135/382/154 6/12/103 130/383/102 359/194/305 +f 130/383/102 42/111/110 264/384/306 359/194/305 +f 264/384/306 92/57/307 263/385/308 359/194/305 +f 263/385/308 45/110/156 135/382/154 359/194/305 +f 129/386/120 16/36/89 184/387/309 360/195/310 +f 184/387/309 69/112/311 265/388/312 360/195/310 +f 265/388/312 92/57/307 264/384/306 360/195/310 +f 264/384/306 42/111/110 129/386/120 360/195/310 +f 183/389/313 25/19/298 181/377/297 361/196/314 +f 181/377/297 68/108/295 266/390/315 361/196/314 +f 266/390/315 92/57/307 265/388/312 361/196/314 +f 265/388/312 69/112/311 183/389/313 361/196/314 +f 182/375/293 18/35/161 136/391/160 362/197/316 +f 136/391/160 45/110/156 263/385/308 362/197/316 +f 263/385/308 92/57/307 266/390/315 362/197/316 +f 266/390/315 68/108/295 182/375/293 362/197/316 +f 127/392/82 4/4/27 122/234/26 363/198/317 +f 122/234/26 38/68/34 268/393/318 363/198/317 +f 268/393/318 93/58/319 267/394/320 363/198/317 +f 267/394/320 41/113/84 127/392/82 363/198/317 +f 121/243/44 14/22/11 186/395/321 364/199/322 +f 186/395/321 70/114/323 269/396/324 364/199/322 +f 269/396/324 93/58/319 268/393/318 364/199/322 +f 268/393/318 38/68/34 121/243/44 364/199/322 +f 185/397/325 25/19/298 183/389/313 365/200/326 +f 183/389/313 69/112/311 270/398/327 365/200/326 +f 270/398/327 93/58/319 269/396/324 365/200/326 +f 269/396/324 70/114/323 185/397/325 365/200/326 +f 184/387/309 16/36/89 128/399/88 366/201/328 +f 128/399/88 41/113/84 267/394/320 366/201/328 +f 267/394/320 93/58/319 270/398/327 366/201/328 +f 270/398/327 69/112/311 184/387/309 366/201/328 +f 119/223/3 2/2/2 146/400/246 367/202/329 +f 146/400/246 50/115/251 272/401/330 367/202/329 +f 272/401/330 94/59/331 271/402/332 367/202/329 +f 271/402/332 37/65/5 119/223/3 367/202/329 +f 145/403/259 20/34/233 180/380/303 368/203/333 +f 180/380/303 67/109/301 273/404/334 368/203/333 +f 273/404/334 94/59/331 272/401/330 368/203/333 +f 272/401/330 50/115/251 145/403/259 368/203/333 +f 179/378/299 25/19/298 185/397/325 369/204/335 +f 185/397/325 70/114/323 274/405/336 369/204/335 +f 274/405/336 94/59/331 273/404/334 369/204/335 +f 273/404/334 67/109/301 179/378/299 369/204/335 +f 186/395/321 14/22/11 120/226/10 370/205/337 +f 120/226/10 37/65/5 271/402/332 370/205/337 +f 271/402/332 94/59/331 274/405/336 370/205/337 +f 274/405/336 70/114/323 186/395/321 370/205/337 +f 142/406/261 1/1/67 115/254/66 371/206/338 +f 115/254/66 35/74/74 276/407/339 371/206/338 +f 276/407/339 95/60/340 275/408/341 371/206/338 +f 275/408/341 48/116/263 142/406/261 371/206/338 +f 116/261/80 13/24/56 190/409/342 372/207/343 +f 190/409/342 72/117/344 277/410/345 372/207/343 +f 277/410/345 95/60/340 276/407/339 372/207/343 +f 276/407/339 35/74/74 116/261/80 372/207/343 +f 189/411/346 26/20/347 187/412/348 373/208/349 +f 187/412/348 71/118/350 278/413/351 373/208/349 +f 278/413/351 95/60/340 277/410/345 373/208/349 +f 277/410/345 72/117/344 189/411/346 373/208/349 +f 188/414/352 19/37/268 141/415/267 374/209/353 +f 141/415/267 48/116/263 275/408/341 374/209/353 +f 275/408/341 95/60/340 278/413/351 374/209/353 +f 278/413/351 71/118/350 188/414/352 374/209/353 +f 118/245/48 3/3/47 123/416/142 375/210/354 +f 123/416/142 39/119/147 280/417/355 375/210/354 +f 280/417/355 96/61/356 279/418/357 375/210/354 +f 279/418/357 36/72/50 118/245/48 375/210/354 +f 124/419/152 15/38/132 192/420/358 376/211/359 +f 192/420/358 73/120/360 281/421/361 376/211/359 +f 281/421/361 96/61/356 280/417/355 376/211/359 +f 280/417/355 39/119/147 124/419/152 376/211/359 +f 191/422/362 26/20/347 189/411/346 377/212/363 +f 189/411/346 72/117/344 282/423/364 377/212/363 +f 282/423/364 96/61/356 281/421/361 377/212/363 +f 281/421/361 73/120/360 191/422/362 377/212/363 +f 190/409/342 13/24/56 117/248/55 378/213/365 +f 117/248/55 36/72/50 279/418/357 378/213/365 +f 279/418/357 96/61/356 282/423/364 378/213/365 +f 282/423/364 72/117/344 190/409/342 378/213/365 +f 126/424/124 5/14/123 131/425/214 379/214/366 +f 131/425/214 43/122/219 284/426/367 379/214/366 +f 284/426/367 97/62/368 283/427/369 379/214/366 +f 283/427/369 40/121/126 126/424/124 379/214/366 +f 132/428/224 17/39/204 194/429/370 380/215/371 +f 194/429/370 74/123/372 285/430/373 380/215/371 +f 285/430/373 97/62/368 284/426/367 380/215/371 +f 284/426/367 43/122/219 132/428/224 380/215/371 +f 193/431/374 26/20/347 191/422/362 381/216/375 +f 191/422/362 73/120/360 286/432/376 381/216/375 +f 286/432/376 97/62/368 285/430/373 381/216/375 +f 285/430/373 74/123/372 193/431/374 381/216/375 +f 192/420/358 15/38/132 125/433/131 382/217/377 +f 125/433/131 40/121/126 283/427/369 382/217/377 +f 283/427/369 97/62/368 286/432/376 382/217/377 +f 286/432/376 73/120/360 192/420/358 382/217/377 +f 134/434/196 7/13/195 139/435/277 383/218/378 +f 139/435/277 47/125/282 288/436/379 383/218/378 +f 288/436/379 98/63/380 287/437/381 383/218/378 +f 287/437/381 44/124/198 134/434/196 383/218/378 +f 140/438/287 19/37/268 188/414/352 384/219/382 +f 188/414/352 71/118/350 289/439/383 384/219/382 +f 289/439/383 98/63/380 288/436/379 384/219/382 +f 288/436/379 47/125/282 140/438/287 384/219/382 +f 187/412/348 26/20/347 193/431/374 385/220/384 +f 193/431/374 74/123/372 290/440/385 385/220/384 +f 290/440/385 98/63/380 289/439/383 385/220/384 +f 289/439/383 71/118/350 187/412/348 385/220/384 +f 194/429/370 17/39/204 133/441/203 386/221/386 +f 133/441/203 44/124/198 287/437/381 386/221/386 +f 287/437/381 98/63/380 290/440/385 386/221/386 +f 290/440/385 74/123/372 194/429/370 386/221/386 diff --git a/modules/ufbx/data/maya_subsurf_3x_cube_crease_7500_ascii.fbx b/modules/ufbx/data/maya_subsurf_3x_cube_crease_7500_ascii.fbx new file mode 100644 index 0000000..4cce0d8 --- /dev/null +++ b/modules/ufbx/data/maya_subsurf_3x_cube_crease_7500_ascii.fbx @@ -0,0 +1,399 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 20 + Hour: 18 + Minute: 17 + Second: 38 + Millisecond: 830 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_3x_cube_crease_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_3x_cube_crease_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "20/08/2021 15:17:38.829" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_subsurf_3x_cube_crease_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "20/08/2021 15:17:38.829" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2612126344048, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2612147962048, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 3 + RenderDivisionLevels: 3 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *12 { + a: 0.249999809265137,0.15,0.15,0.249999809265137,0,0,0.15,0.15,0,0,0.249999809265137,0.249999809265137 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2611687188512, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2612151333824, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2611624395952, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2613614216224, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2611687188512,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2613614216224,2611624395952 + + ;Geometry::, Model::pCube1 + C: "OO",2612147962048,2611687188512 + + ;Material::lambert1, Model::pCube1 + C: "OO",2612151333824,2611687188512 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_subsurf_cube.obj b/modules/ufbx/data/maya_subsurf_cube.obj new file mode 100644 index 0000000..3e48039 --- /dev/null +++ b/modules/ufbx/data/maya_subsurf_cube.obj @@ -0,0 +1,122 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_subsurf_cube.mtl +g default +v -0.277778 -0.277778 0.277778 +v 0.277778 -0.277778 0.277778 +v -0.277778 0.277778 0.277778 +v 0.277778 0.277778 0.277778 +v -0.277778 0.277778 -0.277778 +v 0.277778 0.277778 -0.277778 +v -0.277778 -0.277778 -0.277778 +v 0.277778 -0.277778 -0.277778 +v 0.000000 -0.375000 0.375000 +v 0.000000 0.375000 0.375000 +v 0.000000 0.375000 -0.375000 +v 0.000000 -0.375000 -0.375000 +v -0.375000 0.000000 0.375000 +v 0.375000 0.000000 0.375000 +v -0.375000 0.375000 0.000000 +v 0.375000 0.375000 0.000000 +v -0.375000 0.000000 -0.375000 +v 0.375000 0.000000 -0.375000 +v -0.375000 -0.375000 0.000000 +v 0.375000 -0.375000 0.000000 +v 0.000000 0.000000 0.500000 +v 0.000000 0.500000 0.000000 +v 0.000000 0.000000 -0.500000 +v 0.000000 -0.500000 0.000000 +v 0.500000 0.000000 0.000000 +v -0.500000 0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.500000 0.125000 +vt 0.500000 0.375000 +vt 0.500000 0.625000 +vt 0.500000 0.875000 +vt 0.750000 0.125000 +vt 0.250000 0.125000 +vt 0.500000 0.000000 +vt 0.625000 0.125000 +vt 0.500000 0.250000 +vt 0.375000 0.125000 +vt 0.625000 0.375000 +vt 0.500000 0.500000 +vt 0.375000 0.375000 +vt 0.625000 0.625000 +vt 0.500000 0.750000 +vt 0.375000 0.625000 +vt 0.625000 0.875000 +vt 0.500000 1.000000 +vt 0.375000 0.875000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.250000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.125000 0.125000 +vn 0.000000 -0.707107 0.707107 +vn 0.577350 -0.577350 0.577350 +vn 0.707107 0.000000 0.707107 +vn 0.000000 0.000000 1.000000 +vn 0.577350 0.577350 0.577350 +vn 0.000000 0.707107 0.707107 +vn -0.577350 0.577350 0.577350 +vn -0.707107 0.000000 0.707107 +vn -0.577350 -0.577350 0.577350 +vn 0.707107 0.707107 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.577350 0.577350 -0.577350 +vn 0.000000 0.707107 -0.707107 +vn -0.577350 0.577350 -0.577350 +vn -0.707107 0.707107 0.000000 +vn 0.707107 0.000000 -0.707107 +vn 0.000000 0.000000 -1.000000 +vn 0.577350 -0.577350 -0.577350 +vn 0.000000 -0.707107 -0.707107 +vn -0.577350 -0.577350 -0.577350 +vn -0.707107 0.000000 -0.707107 +vn 0.707107 -0.707107 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.707107 -0.707107 0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +s 1 +g pCube1 +usemtl initialShadingGroup +f 9/21/1 2/2/2 14/22/3 21/15/4 +f 14/22/3 4/4/5 10/23/6 21/15/4 +f 10/23/6 3/3/7 13/24/8 21/15/4 +f 13/24/8 1/1/9 9/21/1 21/15/4 +f 10/23/6 4/4/5 16/25/10 22/16/11 +f 16/25/10 6/6/12 11/26/13 22/16/11 +f 11/26/13 5/5/14 15/27/15 22/16/11 +f 15/27/15 3/3/7 10/23/6 22/16/11 +f 11/26/13 6/6/12 18/28/16 23/17/17 +f 18/28/16 8/8/18 12/29/19 23/17/17 +f 12/29/19 7/7/20 17/30/21 23/17/17 +f 17/30/21 5/5/14 11/26/13 23/17/17 +f 12/29/19 8/8/18 20/31/22 24/18/23 +f 20/31/22 2/10/2 9/32/1 24/18/23 +f 9/32/1 1/9/9 19/33/24 24/18/23 +f 19/33/24 7/7/20 12/29/19 24/18/23 +f 20/34/22 8/11/18 18/35/16 25/19/25 +f 18/35/16 6/12/12 16/36/10 25/19/25 +f 16/36/10 4/4/5 14/22/3 25/19/25 +f 14/22/3 2/2/2 20/34/22 25/19/25 +f 19/37/24 1/1/9 13/24/8 26/20/26 +f 13/24/8 3/3/7 15/38/15 26/20/26 +f 15/38/15 5/14/14 17/39/21 26/20/26 +f 17/39/21 7/13/20 19/37/24 26/20/26 diff --git a/modules/ufbx/data/maya_subsurf_cube_7500_ascii.fbx b/modules/ufbx/data/maya_subsurf_cube_7500_ascii.fbx new file mode 100644 index 0000000..1ce5c0b --- /dev/null +++ b/modules/ufbx/data/maya_subsurf_cube_7500_ascii.fbx @@ -0,0 +1,386 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 10 + Hour: 23 + Minute: 11 + Second: 10 + Millisecond: 668 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "10/08/2021 20:11:10.667" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_subsurf_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "10/08/2021 20:11:10.667" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1854163129568, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1854987684080, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 1 + RenderDivisionLevels: 1 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1854923975888, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1855425274768, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1854989880176, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1855431069344, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1854923975888,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1855431069344,1854989880176 + + ;Geometry::, Model::pCube1 + C: "OO",1854987684080,1854923975888 + + ;Material::lambert1, Model::pCube1 + C: "OO",1855425274768,1854923975888 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_subsurf_cube_crease.obj b/modules/ufbx/data/maya_subsurf_cube_crease.obj new file mode 100644 index 0000000..ae06cc9 --- /dev/null +++ b/modules/ufbx/data/maya_subsurf_cube_crease.obj @@ -0,0 +1,122 @@ +# ufbx:bad_normals +# This file uses centimeters as units for non-parametric coordinates. + +mtllib maya_subsurf_cube.mtl +g default +v -0.326389 -0.388889 0.326389 +v 0.326389 -0.388889 0.326389 +v -0.375000 0.500000 0.375000 +v 0.375000 0.500000 0.375000 +v -0.375000 0.500000 -0.375000 +v 0.375000 0.500000 -0.375000 +v -0.326389 -0.388889 -0.326389 +v 0.326389 -0.388889 -0.326389 +v 0.000000 -0.437500 0.437500 +v 0.000000 0.500000 0.500000 +v 0.000000 0.500000 -0.500000 +v 0.000000 -0.437500 -0.437500 +v -0.375000 0.000000 0.375000 +v 0.375000 0.000000 0.375000 +v -0.500000 0.500000 0.000000 +v 0.500000 0.500000 0.000000 +v -0.375000 0.000000 -0.375000 +v 0.375000 0.000000 -0.375000 +v -0.437500 -0.437500 0.000000 +v 0.437500 -0.437500 0.000000 +v 0.000000 0.000000 0.500000 +v 0.000000 0.500000 0.000000 +v 0.000000 0.000000 -0.500000 +v 0.000000 -0.500000 0.000000 +v 0.500000 0.000000 0.000000 +v -0.500000 0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.500000 0.125000 +vt 0.500000 0.375000 +vt 0.500000 0.625000 +vt 0.500000 0.875000 +vt 0.750000 0.125000 +vt 0.250000 0.125000 +vt 0.500000 0.000000 +vt 0.625000 0.125000 +vt 0.500000 0.250000 +vt 0.375000 0.125000 +vt 0.625000 0.375000 +vt 0.500000 0.500000 +vt 0.375000 0.375000 +vt 0.625000 0.625000 +vt 0.500000 0.750000 +vt 0.375000 0.625000 +vt 0.625000 0.875000 +vt 0.500000 1.000000 +vt 0.375000 0.875000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.250000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.125000 0.125000 +vn 0.000000 -0.659901 0.751352 +vn 0.581283 -0.569403 0.581283 +vn 0.705425 -0.068932 0.705425 +vn 0.000000 -0.066122 0.997812 +vn 0.566340 0.598763 0.566340 +vn 0.000000 0.622386 0.782711 +vn -0.566340 0.598763 0.566340 +vn -0.705425 -0.068932 0.705425 +vn -0.581283 -0.569403 0.581283 +vn 0.782711 0.622386 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.566340 0.598763 -0.566340 +vn 0.000000 0.622386 -0.782711 +vn -0.566340 0.598763 -0.566340 +vn -0.782711 0.622386 0.000000 +vn 0.705425 -0.068932 -0.705425 +vn 0.000000 -0.066122 -0.997812 +vn 0.581283 -0.569403 -0.581283 +vn 0.000000 -0.659901 -0.751352 +vn -0.581283 -0.569403 -0.581283 +vn -0.705425 -0.068932 -0.705425 +vn 0.751352 -0.659901 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.751352 -0.659901 0.000000 +vn 0.997812 -0.066122 0.000000 +vn -0.997812 -0.066122 -0.000000 +g pCube1 +usemtl initialShadingGroup +f 9/21/1 2/2/2 14/22/3 21/15/4 +f 14/22/3 4/4/5 10/23/6 21/15/4 +f 10/23/6 3/3/7 13/24/8 21/15/4 +f 13/24/8 1/1/9 9/21/1 21/15/4 +f 10/23/6 4/4/5 16/25/10 22/16/11 +f 16/25/10 6/6/12 11/26/13 22/16/11 +f 11/26/13 5/5/14 15/27/15 22/16/11 +f 15/27/15 3/3/7 10/23/6 22/16/11 +f 11/26/13 6/6/12 18/28/16 23/17/17 +f 18/28/16 8/8/18 12/29/19 23/17/17 +f 12/29/19 7/7/20 17/30/21 23/17/17 +f 17/30/21 5/5/14 11/26/13 23/17/17 +f 12/29/19 8/8/18 20/31/22 24/18/23 +f 20/31/22 2/10/2 9/32/1 24/18/23 +f 9/32/1 1/9/9 19/33/24 24/18/23 +f 19/33/24 7/7/20 12/29/19 24/18/23 +f 20/34/22 8/11/18 18/35/16 25/19/25 +f 18/35/16 6/12/12 16/36/10 25/19/25 +f 16/36/10 4/4/5 14/22/3 25/19/25 +f 14/22/3 2/2/2 20/34/22 25/19/25 +f 19/37/24 1/1/9 13/24/8 26/20/26 +f 13/24/8 3/3/7 15/38/15 26/20/26 +f 15/38/15 5/14/14 17/39/21 26/20/26 +f 17/39/21 7/13/20 19/37/24 26/20/26 diff --git a/modules/ufbx/data/maya_subsurf_cube_crease_7500_ascii.fbx b/modules/ufbx/data/maya_subsurf_cube_crease_7500_ascii.fbx new file mode 100644 index 0000000..16cf143 --- /dev/null +++ b/modules/ufbx/data/maya_subsurf_cube_crease_7500_ascii.fbx @@ -0,0 +1,399 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 10 + Hour: 22 + Minute: 4 + Second: 58 + Millisecond: 708 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "10/08/2021 19:04:58.706" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_subsurf_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "10/08/2021 19:04:58.706" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2888548270096, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2888311751616, "Geometry::", "Mesh" { + Smoothness: 2 + PreviewDivisionLevels: 1 + RenderDivisionLevels: 1 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *12 { + a: 0.05,0.723000383377075,0.723000383377075,0.05,0,0,0.723000383377075,0.723000383377075,0,0,0.05,0.05 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2888294623872, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2888307355360, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2888265177152, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2888284678576, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2888294623872,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2888284678576,2888265177152 + + ;Geometry::, Model::pCube1 + C: "OO",2888311751616,2888294623872 + + ;Material::lambert1, Model::pCube1 + C: "OO",2888307355360,2888294623872 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_subsurf_max_crease_7500_ascii.fbx b/modules/ufbx/data/maya_subsurf_max_crease_7500_ascii.fbx new file mode 100644 index 0000000..d2dcb0a --- /dev/null +++ b/modules/ufbx/data/maya_subsurf_max_crease_7500_ascii.fbx @@ -0,0 +1,399 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 13 + Hour: 17 + Minute: 6 + Second: 14 + Millisecond: 312 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_max_crease_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_max_crease_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "13/08/2021 14:06:14.311" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_subsurf_max_crease_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "13/08/2021 14:06:14.311" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2415932752672, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2415599391024, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *12 { + a: 0.89999828338623,1,1,0.89999828338623,0,0,1,1,0,0,0.89999828338623,0.89999828338623 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2415110086336, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2415627124064, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2414455819808, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2415730079728, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2415110086336,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2415730079728,2414455819808 + + ;Geometry::, Model::pCube1 + C: "OO",2415599391024,2415110086336 + + ;Material::lambert1, Model::pCube1 + C: "OO",2415627124064,2415110086336 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_subsurf_plane.obj b/modules/ufbx/data/maya_subsurf_plane.obj new file mode 100644 index 0000000..67bf215 --- /dev/null +++ b/modules/ufbx/data/maya_subsurf_plane.obj @@ -0,0 +1,94 @@ +# This file uses centimeters as units for non-parametric coordinates. + +v -0.500000 1.000000 0.500000 +v 0.500000 1.000000 0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 1.000000 -0.500000 +v 0.000000 1.000000 0.500000 +v -0.500000 1.000000 0.000000 +v 0.500000 1.000000 0.000000 +v 0.000000 1.000000 -0.500000 +v 0.000000 1.000000 0.000000 +v -0.250000 1.000000 0.500000 +v 0.250000 1.000000 0.500000 +v -0.500000 1.000000 0.250000 +v -0.500000 1.000000 -0.250000 +v 0.500000 1.000000 0.250000 +v 0.500000 1.000000 -0.250000 +v -0.250000 1.000000 -0.500000 +v 0.250000 1.000000 -0.500000 +v 0.000000 1.000000 0.250000 +v 0.250000 1.000000 0.000000 +v 0.000000 1.000000 -0.250000 +v -0.250000 1.000000 0.000000 +v 0.250000 1.000000 0.250000 +v 0.250000 1.000000 -0.250000 +v -0.250000 1.000000 -0.250000 +v -0.250000 1.000000 0.250000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 1.000000 0.500000 +vt 0.500000 1.000000 +vt 0.000000 0.500000 +vt 0.750000 0.250000 +vt 0.750000 0.750000 +vt 0.250000 0.750000 +vt 0.250000 0.250000 +vt 0.750000 0.000000 +vt 1.000000 0.250000 +vt 0.750000 0.500000 +vt 0.500000 0.250000 +vt 1.000000 0.750000 +vt 0.750000 1.000000 +vt 0.500000 0.750000 +vt 0.250000 1.000000 +vt 0.000000 0.750000 +vt 0.250000 0.500000 +vt 0.000000 0.250000 +vt 0.250000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +g pPlane1 +f 11/14/1 2/2/2 14/15/3 22/10/4 +f 14/15/3 7/7/5 19/16/6 22/10/4 +f 19/16/6 9/5/7 18/17/8 22/10/4 +f 18/17/8 5/6/9 11/14/1 22/10/4 +f 15/18/10 4/4/11 17/19/12 23/11/13 +f 17/19/12 8/8/14 20/20/15 23/11/13 +f 20/20/15 9/5/7 19/16/6 23/11/13 +f 19/16/6 7/7/5 15/18/10 23/11/13 +f 16/21/16 3/3/17 13/22/18 24/12/19 +f 13/22/18 6/9/20 21/23/21 24/12/19 +f 21/23/21 9/5/7 20/20/15 24/12/19 +f 20/20/15 8/8/14 16/21/16 24/12/19 +f 12/24/22 1/1/23 10/25/24 25/13/25 +f 10/25/24 5/6/9 18/17/8 25/13/25 +f 18/17/8 9/5/7 21/23/21 25/13/25 +f 21/23/21 6/9/20 12/24/22 25/13/25 diff --git a/modules/ufbx/data/maya_subsurf_plane_7700_ascii.fbx b/modules/ufbx/data/maya_subsurf_plane_7700_ascii.fbx new file mode 100644 index 0000000..4217527 --- /dev/null +++ b/modules/ufbx/data/maya_subsurf_plane_7700_ascii.fbx @@ -0,0 +1,389 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 5 + Day: 26 + Hour: 15 + Minute: 33 + Second: 29 + Millisecond: 131 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_plane_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_subsurf_plane_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "26/05/2022 12:33:29.130" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_subsurf_plane_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "26/05/2022 12:33:29.130" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2167895859168, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2167797407920, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 1 + BoundaryRule: 1 + PreserveBorders: 1 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *12 { + a: -0.5,1,0.5,0.5,1,0.5,-0.5,1,-0.5,0.5,1,-0.5 + } + PolygonVertexIndex: *4 { + a: 0,1,3,-3 + } + Edges: *4 { + a: 0,3,1,2 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *12 { + a: 0,1,0,0,1,0,0,1,0,0,1,0 + } + NormalsW: *4 { + a: 1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 0,0,1,0,0,1,1,1 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2167275955136, "Model::pPlane1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2167268868272, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2167797940464, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2167907873680, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pPlane1, Model::RootNode + C: "OO",2167275955136,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2167907873680,2167797940464 + + ;Geometry::, Model::pPlane1 + C: "OO",2167797407920,2167275955136 + + ;Material::lambert1, Model::pPlane1 + C: "OO",2167268868272,2167275955136 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_subsurf_plane_7700_binary.fbx b/modules/ufbx/data/maya_subsurf_plane_7700_binary.fbx new file mode 100644 index 0000000..75a276c Binary files /dev/null and b/modules/ufbx/data/maya_subsurf_plane_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_texture_blend_modes_6100_ascii.fbx b/modules/ufbx/data/maya_texture_blend_modes_6100_ascii.fbx new file mode 100644 index 0000000..60ad16c --- /dev/null +++ b/modules/ufbx/data/maya_texture_blend_modes_6100_ascii.fbx @@ -0,0 +1,866 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 10 + Hour: 23 + Minute: 19 + Second: 29 + Millisecond: 104 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 7 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Texture" { + Count: 1 + } + ObjectType: "Video" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "LayeredTexture" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 1 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 2 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 3 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 4 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 5 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 6 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 7 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 8 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 9 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 10 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 11 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 12 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 13 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + LayerElementTexture: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 1 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Luminosity" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 2 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 3 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Saturation" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 4 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Darken" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 5 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Lighten" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 6 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Difference" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 7 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Modulate" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 8 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Subtract" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 9 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Add" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 10 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 11 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 12 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Over" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 13 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 2 + } + } + Layer: 3 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 3 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 3 + } + } + Layer: 4 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 4 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 4 + } + } + Layer: 5 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 5 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 5 + } + } + Layer: 6 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 6 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 6 + } + } + Layer: 7 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 7 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 7 + } + } + Layer: 8 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 8 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 8 + } + } + Layer: 9 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 9 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 9 + } + } + Layer: 10 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 10 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 10 + } + } + Layer: 11 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 11 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 11 + } + } + Layer: 12 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 12 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 12 + } + } + Layer: 13 { + Version: 100 + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 13 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 13 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_texture_blend_modes_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_texture_blend_modes_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "10/09/2021 20:19:29.103" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_texture_blend_modes_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "10/09/2021 20:19:29.103" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\texture_blend_modes.mb" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",1,1,1 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.800000011920929,0.800000011920929,0.800000011920929 + Property: "Opacity", "double", "",1 + } + } + Video: "Video::file1", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + Property: "RelPath", "KString", "", "textures\checkerboard_weight.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + } + Texture: "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1.39999997615814 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + LayeredTexture: "LayeredTexture::layeredTexture1", "" { + LayeredTexture: 100 + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + } + BlendModes: 5,29,5,27,7,11,22,2,24,1,5,5,4,5 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Video::file1", "Texture::file1" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Texture::file1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_texture_blend_modes_7500_ascii.fbx b/modules/ufbx/data/maya_texture_blend_modes_7500_ascii.fbx new file mode 100644 index 0000000..2c625c1 --- /dev/null +++ b/modules/ufbx/data/maya_texture_blend_modes_7500_ascii.fbx @@ -0,0 +1,577 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 10 + Hour: 23 + Minute: 17 + Second: 45 + Millisecond: 615 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_texture_blend_modes_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_texture_blend_modes_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "10/09/2021 20:17:45.613" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_texture_blend_modes_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "10/09/2021 20:17:45.613" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\texture_blend_modes.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2111364441744, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 9 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "LayeredTexture" { + Count: 1 + PropertyTemplate: "FbxLayeredTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + } + } + } + ObjectType: "Texture" { + Count: 1 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Video" { + Count: 1 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2111521037952, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2109545864336, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2109566214624, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Opacity", "double", "Number", "",1 + } + } + Video: 2110216179456, "Video::file1", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_weight.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + } + Texture: 2110216178976, "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties70: { + P: "Texture alpha", "Number", "", "A",1.39999997615814 + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + LayeredTexture: 2109835821568, "LayeredTexture::layeredTexture1", "" { + LayeredTexture: 101 + BlendModes: 5,29,5,27,7,11,22,2,24,1,5,5,4,5 + Alphas: 1,1,1,1,1,0.899999976158142,0.800000011920929,0.699999988079071,0.600000023841858,0.5,0.400000005960464,0.300000011920929,0.200000002980232,0.100000001490116 + } + AnimationStack: 2111283335088, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2111364278304, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2109545864336,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2111364278304,2111283335088 + + ;LayeredTexture::layeredTexture1, Material::lambert1 + C: "OP",2109835821568,2109566214624, "DiffuseColor" + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2110216178976,2109835821568 + + ;Video::file1, Texture::file1 + C: "OO",2110216179456,2110216178976 + + ;Geometry::, Model::pCube1 + C: "OO",2111521037952,2109545864336 + + ;Material::lambert1, Model::pCube1 + C: "OO",2109566214624,2109545864336 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_texture_layers_6100_ascii.fbx b/modules/ufbx/data/maya_texture_layers_6100_ascii.fbx new file mode 100644 index 0000000..80a8652 --- /dev/null +++ b/modules/ufbx/data/maya_texture_layers_6100_ascii.fbx @@ -0,0 +1,904 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 10 + Hour: 19 + Minute: 49 + Second: 40 + Millisecond: 647 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 15 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Texture" { + Count: 5 + } + ObjectType: "Video" { + Count: 5 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "LayeredTexture" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map3" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementBinormal: 1 { + Version: 101 + Name: "map2" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementBinormal: 2 { + Version: 101 + Name: "map3" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: -0.0212637949734926,0.999773919582367,0,-0.0208141598850489,0.999783396720886,0,-0.0203645192086697,0.999792635440826 + ,0,-0.0208141598850489,0.999783396720886,0,-0.02728471159935,0,-0.999627709388733,-0.0245812144130468,0,-0.999697804450989 + ,-0.0218775421380997,0,-0.999760687351227,-0.0245812144130468,0,-0.999697804450989,-0.0170966219156981,0.999853849411011 + ,-0,-0.017608530819416,0.999845027923584,-0,-0.0181204359978437,0.999835908412933,-0,-0.017608530819416,0.999845027923584 + ,-0,-0.0221749003976583,-0,-0.999754130840302,-0.0245468840003014,-0,-0.999698638916016,-0.0269187316298485,-0 + ,-0.999637603759766,-0.0245468840003014,-0,-0.999698638916016,-0,0.785017013549805,-0.619474172592163,-0,0.786651194095612 + ,-0.617397725582123,-0,0.788279831409454,-0.615316927433014,-0,0.786651194095612,-0.617397725582123,-0,0.774047017097473 + ,-0.633128106594086,-0,0.787808954715729,-0.615919709205627,-0,0.801188290119171,-0.598412394523621,-0,0.787808954715729 + ,-0.615919709205627 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementTangent: 1 { + Version: 101 + Name: "map2" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementTangent: 2 { + Version: 101 + Name: "map3" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 0.999773919582367,0.0212637949734926,0,0.999783396720886,0.0208141598850489,0,0.999792635440826,0.0203645192086697 + ,-0,0.999783396720886,0.0208141598850489,0,0.999627709388733,0,-0.02728471159935,0.999697923660278,0,-0.0245812181383371 + ,0.999760687351227,-0,-0.0218775421380997,0.999697923660278,0,-0.0245812181383371,0.999853849411011,0.0170966219156981 + ,0,0.999845027923584,0.017608530819416,0,0.999835908412933,0.0181204359978437,0,0.999845027923584,0.017608530819416 + ,0,0.999754130840302,0,-0.0221749003976583,0.999698758125305,0,-0.0245468877255917,0.999637722969055,0,-0.0269187353551388 + ,0.999698758125305,0,-0.0245468877255917,0,0.619474172592163,0.785017013549805,0,0.617397725582123,0.786651194095612 + ,-0,0.615316927433014,0.788279831409454,0,0.617397725582123,0.786651194095612,0,-0.633128106594086,-0.774047017097473 + ,0,-0.615919649600983,-0.787808835506439,0,-0.598412394523621,-0.801188290119171,0,-0.615919649600983,-0.787808835506439 + + } + LayerElementUV: 0 { + Version: 101 + Name: "map3" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.0325486361980438,0.0120285646989942,0.744837582111359,0,0.775998830795288,0.566053748130798,0,0.57758355140686 + ,0.754243195056915,0.990707397460938,0.0575384460389614,1,0.727653324604034,0.446685463190079,0.0827380940318108 + ,0.456544995307922 + UVIndex: 0,1,2,3,3,2,4,5,5,4,6,7,7,6,1,0,1,6,4,2,7,0,3,5 + } + LayerElementUV: 1 { + Version: 101 + Name: "map2" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.00189049646724015,0.668528079986572,0.33137047290802,0.668528079986572,0.33137047290802,0.998008012771606,0.00189049646724015 + ,0.998008012771606,0.338705003261566,0.668528079986572,0.6681849360466,0.668528079986572,0.6681849360466,0.998008012771606 + ,0.338705003261566,0.998008012771606,0.338705003261566,0.00199203193187714,0.6681849360466,0.00199203193187714 + ,0.6681849360466,0.331472009420395,0.338705003261566,0.331472009420395,0.282356202602386,0.335260063409805,0.611836194992065 + ,0.335260063409805,0.611836194992065,0.664740025997162,0.282356202602386,0.664740025997162,0.00189050065819174 + ,0.00199203612282872,0.33137047290802,0.00199203612282872,0.33137047290802,0.331472009420395,0.00189050065819174 + ,0.331472009420395,0.617658853530884,0.335260063409805,0.947138726711273,0.335260063409805,0.947138726711273 + ,0.664740025997162,0.617658853530884,0.664740025997162 + UVIndex: 16,17,18,19,8,9,10,11,20,21,22,23,12,13,14,15,0,1,2,3,4,5,6,7 + } + LayerElementUV: 2 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementEmissiveUV: 0 { + Version: 101 + Name: "map3" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.0325486361980438,0.0120285646989942,0.744837582111359,0,0.775998830795288,0.566053748130798,0,0.57758355140686 + ,0.754243195056915,0.990707397460938,0.0575384460389614,1,0.727653324604034,0.446685463190079,0.0827380940318108 + ,0.456544995307922 + UVIndex: 0,1,2,3,3,2,4,5,5,4,6,7,7,6,1,0,1,6,4,2,7,0,3,5 + } + LayerElementTransparentUV: 0 { + Version: 101 + Name: "map2" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.00189049646724015,0.668528079986572,0.33137047290802,0.668528079986572,0.33137047290802,0.998008012771606,0.00189049646724015 + ,0.998008012771606,0.338705003261566,0.668528079986572,0.6681849360466,0.668528079986572,0.6681849360466,0.998008012771606 + ,0.338705003261566,0.998008012771606,0.338705003261566,0.00199203193187714,0.6681849360466,0.00199203193187714 + ,0.6681849360466,0.331472009420395,0.338705003261566,0.331472009420395,0.282356202602386,0.335260063409805,0.611836194992065 + ,0.335260063409805,0.611836194992065,0.664740025997162,0.282356202602386,0.664740025997162,0.00189050065819174 + ,0.00199203612282872,0.33137047290802,0.00199203612282872,0.33137047290802,0.331472009420395,0.00189050065819174 + ,0.331472009420395,0.617658853530884,0.335260063409805,0.947138726711273,0.335260063409805,0.947138726711273 + ,0.664740025997162,0.617658853530884,0.664740025997162 + UVIndex: 16,17,18,19,8,9,10,11,20,21,22,23,12,13,14,15,0,1,2,3,4,5,6,7 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + LayerElementTexture: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementTexture: 1 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Over" + TextureAlpha: 1 + TextureId: 1 + } + LayerElementTexture: 2 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Add" + TextureAlpha: 1 + TextureId: 2 + } + LayerElementEmissive_Textures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 3 + } + LayerElementTransparentTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 4 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEmissive_Textures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEmissiveUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTransparentTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTransparentUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 2 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_texture_layers_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_texture_layers_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "10/09/2021 16:49:40.647" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_texture_layers_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "10/09/2021 16:49:40.647" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\texture_layers.mb" + } + } + Material: "Material::lambert2", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0.5,0.5,0.5 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",1,1,1 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0.5,0.5,0.5 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.800000011920929,0.800000011920929,0.800000011920929 + Property: "Opacity", "double", "",1 + } + } + Video: "Video::file2", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + Property: "RelPath", "KString", "", "textures\checkerboard_diffuse.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + } + Video: "Video::file1", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + Property: "RelPath", "KString", "", "textures\checkerboard_ambient.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + } + Video: "Video::file5", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + Property: "RelPath", "KString", "", "textures\checkerboard_emissive.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + } + Video: "Video::file4", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + Property: "RelPath", "KString", "", "textures\checkerboard_transparency.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + } + Video: "Video::file3", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + Property: "RelPath", "KString", "", "textures\checkerboard_weight.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + } + Texture: "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map3" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",0.5 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",4 + Property: "UVSet", "KString", "", "map2" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file5" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",1,2,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map3" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file5" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0.5,-0.207106781186548,0 + Property: "Rotation", "Vector", "A",0,0,45 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map2" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + LayeredTexture: "LayeredTexture::layeredTexture1", "" { + LayeredTexture: 100 + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + } + BlendModes: 5,4,1 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Texture::file3", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file2", "LayeredTexture::layeredTexture1" + Connect: "OO", "Texture::file1", "LayeredTexture::layeredTexture1" + Connect: "OO", "Video::file3", "Texture::file3" + Connect: "OO", "Video::file2", "Texture::file2" + Connect: "OO", "Video::file1", "Texture::file1" + Connect: "OO", "Video::file5", "Texture::file5" + Connect: "OO", "Video::file4", "Texture::file4" + Connect: "OO", "Material::lambert2", "Model::pCube1" + Connect: "OO", "Texture::file3", "Model::pCube1" + Connect: "OO", "Texture::file2", "Model::pCube1" + Connect: "OO", "Texture::file1", "Model::pCube1" + Connect: "OO", "Texture::file5", "Model::pCube1" + Connect: "OO", "Texture::file4", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_texture_layers_6100_binary.fbx b/modules/ufbx/data/maya_texture_layers_6100_binary.fbx new file mode 100644 index 0000000..82ded72 Binary files /dev/null and b/modules/ufbx/data/maya_texture_layers_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_texture_layers_7500_ascii.fbx b/modules/ufbx/data/maya_texture_layers_7500_ascii.fbx new file mode 100644 index 0000000..293cd06 --- /dev/null +++ b/modules/ufbx/data/maya_texture_layers_7500_ascii.fbx @@ -0,0 +1,778 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 9 + Day: 10 + Hour: 20 + Minute: 50 + Second: 50 + Millisecond: 385 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_texture_layers_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_texture_layers_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "10/09/2021 17:50:50.384" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_texture_layers_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "10/09/2021 17:50:50.384" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\texture_layers.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2111241399760, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 17 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "LayeredTexture" { + Count: 1 + PropertyTemplate: "FbxLayeredTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + } + } + } + ObjectType: "Texture" { + Count: 5 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Video" { + Count: 5 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2111521097856, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementBinormal: 1 { + Version: 102 + Name: "map2" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementBinormal: 2 { + Version: 102 + Name: "map3" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: -0.0212637949734926,0.999773919582367,0,-0.0208141598850489,0.999783396720886,0,-0.0203645192086697,0.999792635440826,0,-0.0208141598850489,0.999783396720886,0,-0.02728471159935,0,-0.999627709388733,-0.0245812144130468,0,-0.999697804450989,-0.0218775421380997,0,-0.999760687351227,-0.0245812144130468,0,-0.999697804450989,-0.0170966219156981,0.999853849411011,-0,-0.017608530819416,0.999845027923584,-0,-0.0181204359978437,0.999835908412933,-0,-0.017608530819416,0.999845027923584,-0,-0.0221749003976583,-0,-0.999754130840302,-0.0245468840003014,-0,-0.999698638916016,-0.0269187316298485,-0,-0.999637603759766,-0.0245468840003014,-0,-0.999698638916016,-0,0.785017013549805,-0.619474172592163,-0,0.786651194095612,-0.617397725582123,-0,0.788279831409454,-0.615316927433014,-0,0.786651194095612,-0.617397725582123,-0,0.774047017097473,-0.633128106594086,-0,0.787808954715729,-0.615919709205627,-0,0.801188290119171,-0.598412394523621,-0,0.787808954715729,-0.615919709205627 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementTangent: 1 { + Version: 102 + Name: "map2" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementTangent: 2 { + Version: 102 + Name: "map3" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 0.999773919582367,0.0212637949734926,0,0.999783396720886,0.0208141598850489,0,0.999792635440826,0.0203645192086697,-0,0.999783396720886,0.0208141598850489,0,0.999627709388733,0,-0.02728471159935,0.999697923660278,0,-0.0245812181383371,0.999760687351227,-0,-0.0218775421380997,0.999697923660278,0,-0.0245812181383371,0.999853849411011,0.0170966219156981,0,0.999845027923584,0.017608530819416,0,0.999835908412933,0.0181204359978437,0,0.999845027923584,0.017608530819416,0,0.999754130840302,0,-0.0221749003976583,0.999698758125305,0,-0.0245468877255917,0.999637722969055,0,-0.0269187353551388,0.999698758125305,0,-0.0245468877255917,0,0.619474172592163,0.785017013549805,0,0.617397725582123,0.786651194095612,-0,0.615316927433014,0.788279831409454,0,0.617397725582123,0.786651194095612,0,-0.633128106594086,-0.774047017097473,0,-0.615919649600983,-0.787808835506439,0,-0.598412394523621,-0.801188290119171,0,-0.615919649600983,-0.787808835506439 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementUV: 1 { + Version: 101 + Name: "map2" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *48 { + a: 0.00189049646724015,0.668528079986572,0.33137047290802,0.668528079986572,0.33137047290802,0.998008012771606,0.00189049646724015,0.998008012771606,0.338705003261566,0.668528079986572,0.6681849360466,0.668528079986572,0.6681849360466,0.998008012771606,0.338705003261566,0.998008012771606,0.338705003261566,0.00199203193187714,0.6681849360466,0.00199203193187714,0.6681849360466,0.331472009420395,0.338705003261566,0.331472009420395,0.282356202602386,0.335260063409805,0.611836194992065,0.335260063409805,0.611836194992065,0.664740025997162,0.282356202602386,0.664740025997162,0.00189050065819174,0.00199203612282872,0.33137047290802,0.00199203612282872,0.33137047290802,0.331472009420395,0.00189050065819174,0.331472009420395,0.617658853530884,0.335260063409805,0.947138726711273,0.335260063409805,0.947138726711273,0.664740025997162,0.617658853530884,0.664740025997162 + } + UVIndex: *24 { + a: 16,17,18,19,8,9,10,11,20,21,22,23,12,13,14,15,0,1,2,3,4,5,6,7 + } + } + LayerElementUV: 2 { + Version: 101 + Name: "map3" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *16 { + a: 0.0325486361980438,0.0120285646989942,0.744837582111359,0,0.775998830795288,0.566053748130798,0,0.57758355140686,0.754243195056915,0.990707397460938,0.0575384460389614,1,0.727653324604034,0.446685463190079,0.0827380940318108,0.456544995307922 + } + UVIndex: *24 { + a: 0,1,2,3,3,2,4,5,5,4,6,7,7,6,1,0,1,6,4,2,7,0,3,5 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 2 + } + } + } + Model: 2109545759936, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map3" + } + Shading: T + Culling: "CullingOff" + } + Material: 2109566189824, "Material::lambert2", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "EmissiveColor", "Color", "", "A",0.5,0.5,0.5 + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Opacity", "double", "Number", "",1 + } + } + Video: 2111522582368, "Video::file3", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_weight.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + } + Video: 2111522591968, "Video::file2", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_diffuse.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + } + Video: 2111522590528, "Video::file1", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_ambient.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + } + Video: 2111522597248, "Video::file5", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_emissive.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + } + Video: 2111522584288, "Video::file4", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_transparency.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + } + Texture: 2111522587648, "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties70: { + P: "Texture alpha", "Number", "", "A",0.75 + P: "CurrentTextureBlendMode", "enum", "", "",2 + P: "UVSet", "KString", "", "", "map3" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_weight.png" + RelativeFilename: "textures\checkerboard_weight.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2111522588128, "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties70: { + P: "Texture alpha", "Number", "", "A",0.5 + P: "CurrentTextureBlendMode", "enum", "", "",4 + P: "UVSet", "KString", "", "", "map2" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2111522582848, "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties70: { + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2111522577088, "Texture::file5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file5" + Properties70: { + P: "Translation", "Vector", "", "A",1,2,0 + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map3" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file5" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2111522579968, "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties70: { + P: "Translation", "Vector", "", "A",0.5,-0.207106781186548,0 + P: "Rotation", "Vector", "", "A",0,0,45 + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map2" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + LayeredTexture: 2109835829776, "LayeredTexture::layeredTexture1", "" { + LayeredTexture: 101 + BlendModes: 2,4,1 + Alphas: 0.75,0.5,1 + } + AnimationStack: 2111515246896, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2109551102352, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2109545759936,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2109551102352,2111515246896 + + ;Texture::file5, Material::lambert2 + C: "OP",2111522577088,2109566189824, "EmissiveColor" + + ;LayeredTexture::layeredTexture1, Material::lambert2 + C: "OP",2109835829776,2109566189824, "DiffuseColor" + + ;Texture::file4, Material::lambert2 + C: "OP",2111522579968,2109566189824, "TransparentColor" + + ;Texture::file3, LayeredTexture::layeredTexture1 + C: "OO",2111522587648,2109835829776 + + ;Texture::file2, LayeredTexture::layeredTexture1 + C: "OO",2111522588128,2109835829776 + + ;Texture::file1, LayeredTexture::layeredTexture1 + C: "OO",2111522582848,2109835829776 + + ;Video::file3, Texture::file3 + C: "OO",2111522582368,2111522587648 + + ;Video::file2, Texture::file2 + C: "OO",2111522591968,2111522588128 + + ;Video::file1, Texture::file1 + C: "OO",2111522590528,2111522582848 + + ;Video::file5, Texture::file5 + C: "OO",2111522597248,2111522577088 + + ;Video::file4, Texture::file4 + C: "OO",2111522584288,2111522579968 + + ;Geometry::, Model::pCube1 + C: "OO",2111521097856,2109545759936 + + ;Material::lambert2, Model::pCube1 + C: "OO",2109566189824,2109545759936 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_texture_layers_7500_binary.fbx b/modules/ufbx/data/maya_texture_layers_7500_binary.fbx new file mode 100644 index 0000000..2beb361 Binary files /dev/null and b/modules/ufbx/data/maya_texture_layers_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_textured_cube_6100_ascii.fbx b/modules/ufbx/data/maya_textured_cube_6100_ascii.fbx new file mode 100644 index 0000000..3b01087 --- /dev/null +++ b/modules/ufbx/data/maya_textured_cube_6100_ascii.fbx @@ -0,0 +1,854 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 1 + Hour: 19 + Minute: 57 + Second: 8 + Millisecond: 904 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 16 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Texture" { + Count: 6 + } + ObjectType: "Video" { + Count: 6 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementEmissiveUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementAmbientUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSpecularUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementTransparentUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementReflectionUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + LayerElementTexture: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 0 + } + LayerElementEmissive_Textures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 1 + } + LayerElementAmbientTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 2 + } + LayerElementSpecularTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 3 + } + LayerElementTransparentTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 4 + } + LayerElementReflectionTextures: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Normal" + TextureAlpha: 1 + TextureId: 5 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEmissive_Textures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEmissiveUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementAmbientTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementAmbientUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSpecularTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSpecularUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTransparentTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTransparentUV" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementReflectionTextures" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementReflectionUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "01/08/2021 16:57:08.903" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "01/08/2021 16:57:08.903" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::phong1", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0.5,0.5,0.5 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0.5,0.5,0.5 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",1,1,1 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "SpecularColor", "Color", "A",0.5,0.5,0.5 + Property: "SpecularFactor", "Number", "A",1 + Property: "ShininessExponent", "Number", "A",20 + Property: "ReflectionColor", "Color", "A",0.5,0.5,0.5 + Property: "ReflectionFactor", "Number", "A",0.5 + Property: "Emissive", "Vector3D", "",0.5,0.5,0.5 + Property: "Ambient", "Vector3D", "",0.5,0.5,0.5 + Property: "Diffuse", "Vector3D", "",0.800000011920929,0.800000011920929,0.800000011920929 + Property: "Specular", "Vector3D", "",0.5,0.5,0.5 + Property: "Shininess", "double", "",20 + Property: "Opacity", "double", "",1 + Property: "Reflectivity", "double", "",0.125 + } + } + Video: "Video::file4", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + Property: "RelPath", "KString", "", "textures\checkerboard_emissive.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + } + Video: "Video::file3", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + Property: "RelPath", "KString", "", "textures\checkerboard_ambient.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + } + Video: "Video::file5", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + Property: "RelPath", "KString", "", "textures\checkerboard_specular.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + } + Video: "Video::file2", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + Property: "RelPath", "KString", "", "textures\checkerboard_transparency.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + } + Video: "Video::file6", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_reflection.png" + Property: "RelPath", "KString", "", "textures\checkerboard_reflection.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_reflection.png" + RelativeFilename: "textures\checkerboard_reflection.png" + } + Video: "Video::file1", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + Property: "RelPath", "KString", "", "textures\checkerboard_diffuse.png" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + } + Texture: "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file5" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file5" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file6", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file6" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file6" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_reflection.png" + RelativeFilename: "textures\checkerboard_reflection.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",0 + Property: "UVSet", "KString", "", "map1" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Video::file1", "Texture::file1" + Connect: "OO", "Video::file4", "Texture::file4" + Connect: "OO", "Video::file3", "Texture::file3" + Connect: "OO", "Video::file5", "Texture::file5" + Connect: "OO", "Video::file2", "Texture::file2" + Connect: "OO", "Video::file6", "Texture::file6" + Connect: "OO", "Material::phong1", "Model::pCube1" + Connect: "OO", "Texture::file1", "Model::pCube1" + Connect: "OO", "Texture::file4", "Model::pCube1" + Connect: "OO", "Texture::file3", "Model::pCube1" + Connect: "OO", "Texture::file5", "Model::pCube1" + Connect: "OO", "Texture::file2", "Model::pCube1" + Connect: "OO", "Texture::file6", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_textured_cube_6100_binary.fbx b/modules/ufbx/data/maya_textured_cube_6100_binary.fbx new file mode 100644 index 0000000..2800caa Binary files /dev/null and b/modules/ufbx/data/maya_textured_cube_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_textured_cube_7500_ascii.fbx b/modules/ufbx/data/maya_textured_cube_7500_ascii.fbx new file mode 100644 index 0000000..cb997c1 --- /dev/null +++ b/modules/ufbx/data/maya_textured_cube_7500_ascii.fbx @@ -0,0 +1,650 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 1 + Hour: 19 + Minute: 56 + Second: 4 + Millisecond: 960 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "01/08/2021 16:56:04.959" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "01/08/2021 16:56:04.959" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2179871343728, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 18 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfacePhong" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Phong" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + P: "SpecularColor", "Color", "", "A",0.2,0.2,0.2 + P: "SpecularFactor", "Number", "", "A",1 + P: "ShininessExponent", "Number", "", "A",20 + P: "ReflectionColor", "Color", "", "A",0,0,0 + P: "ReflectionFactor", "Number", "", "A",1 + } + } + } + ObjectType: "Texture" { + Count: 6 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Video" { + Count: 6 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2179854704896, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2179263690608, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2180149143232, "Material::phong1", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "EmissiveColor", "Color", "", "A",0.5,0.5,0.5 + P: "AmbientColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "SpecularColor", "Color", "", "A",0.5,0.5,0.5 + P: "ReflectionColor", "Color", "", "A",0.5,0.5,0.5 + P: "ReflectionFactor", "Number", "", "A",0.5 + P: "Emissive", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Ambient", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Specular", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Shininess", "double", "Number", "",20 + P: "Opacity", "double", "Number", "",1 + P: "Reflectivity", "double", "Number", "",0.125 + } + } + Video: 2180149146592, "Video::file1", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_diffuse.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBECwZQ+1sKwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAFq0lEQVR42u3cW0xTdwDH8S/QymUqYuqi4gVsnBQZc0sFF0QGAx0PCwEdYMLTeNCYzAcTjEucD/K2B2Nc9rTERHFeF3SZCQs4TZlOxyAypyAggojKbUMuStFS9yAlIrTimArl93mCHtrTNt9z/ud/Wo7PzvT0J4yDrbp6PHcnwWJB639z6/dFpjQFoABEAYgCEAUgCkAUgCgAUQCiAEQBiAIQBSAKQLyVT3xExLi+D6DP8yf3+rUH0BAgCkAUgCgAUQCiAEQBiAIQBSAKQBSAKABRAKIAxCsZ9Hm6rg8gGgJEAYgCEAUgCkAUgCgAUQCiAEQBiAIQBSAKQBSAeB1dH0DXBxANAaIARAGIAhAFIApApg7Dq3jQ/MLCoZ+dTieP+/uxP3hAW3MzNyoruXz2LH29vSPuV+pmTrzmmblu6RjnzV9lZIx4Lp641uF6/DUe5tee/sYSG8sHSUnMN5sJmjkTp8NBX28vHXfv0lxXR21FBU3Xr4/pdXt6HyZ0AMN2Mb6++AcG4h8YSLDJxNIVK0jMzKRw3z6qy8q8Z0syGsnKyyPCan1ugYFpAQEEm0yYo6NJWL9+KE6v3QM8vxX6+vkxIySEhcuWEZuaSlhkJFl5eZzYs2fYmbCX2Qpdy8Z6Jszdmz7eM3EuyTk5RFit/NPSwtljx6i/coUHXV34GQxMDw7GFBrKYouFqLi417qFv/E9AIBzYICujg66Ojq4euECiZmZJGVn8+mmTXx/8iRdnZ2Tfg/wXnw8AAfz8/n73r2h2x2PHnG/vZ377e3cqKzklyNHdBB47vhxaioqeGvmTD5JS/OKIWBaYCAA9r4+zQLGoqyo6OluLyXFKwJorq0FIG3zZqbPmjW1ZwFjcae+HoC5oaH/6f6ejpxHG+89zQb+j7H35wMH+Hz3biwxMSyzWmm9dYuWxkZam5pou32b5traUWc+LzMbmJSzAHdcb0bwJNpaPLl38ybfbtvGRxs2YFm1innh4cwLDx9aPuBw0FhVxZnDh4f2FhNiD/AqP8/2tGzW7NlPQ+jpcXsk7+m5ubZy2zjn0AkWy6jrGcv7kmCxDF9/dTU/2mzg48OisDAWm82Emc0stVh4PyYGc3Q0YcuX8+WWLVwqLR2xnhdND0d7TuOdxbyxPcA7kZEAw46YJ4JHdjvTAgLwMxgYcDhGLPczGgHot9vdP8iTJzQ1NNDU0MCvZ84MTYW/2LGD9Tk55G7dOhTAlD0ITMvOBuDaxYsTKoDeri4ATG6OTeYM3t77klNX58AA3+3dC8CiZ4aGKRnAxtxc4j/+mI62Nv602SZUAHfq6gBYuXbtqMutg7c3D/6dyzcFBSwMC/P42K4D3vbW1qk1CzAYjcw2mYiIiiItK4uVcXE4HA6+3rUL/wk2b/6juJh3V69m5bp1POzpobykhJ7OTmaEhGBNSRkKo7ykZPiJIKuVg6dP89u5c9iKi/nr8mU6WlvxMxoxzZnDhwkJbMzNBeCHgoKpEYC7aU1Pdzf527dzyWYbdmDz/FTN9fvrPHfecPUqpYWFrMnIIDEzk8TMzJGvq7CQxmvXht3W1tLC23PnEp+cTHxy8ujDgNPJkf37OeXmbOCLPrh6Fe/Da9kD2O12eru7aWpooOz8eX46cYKewbF2Iio5dIjbNTXEpKYyf8kS/IOC6H/4kLv19fxeVERNefmI+3yWlERsfDxxSUlEREUxb8ECAoOCcDx+THtrK1fKyzl19Ci1VVUT6rX67ExPH9fXwvW1bl0mTiYxBaAARAGIAhAFIApAFIBMKbo+gK4PIBoCRAGIAhAFIApAFIAoAFEAogBEAYgCEAUgCkAUgHgfgz5P1z+GiIYAUQCiAEQBiAIQBSAKQBSAKABRAKIARAGIAhAFIF5H1wfQ9QFEQ4AoAFEAogBEAYgCEAUgCkAUgCgAUQCiAEQBiAIQ7/Mvxl4LkLfMIrUAAAAASUVORK5CYII=" + } + Video: 2180149147552, "Video::file4", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_emissive.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC40NARS3AAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAIYUlEQVR42u2ce1CU1xmHH+KCLhoVFZRRiCIYwFvwEpFFiIgg3qOIsU6ixKixGafJ1MSZdJrpTGPbNFanUzM2atSMMY234JUqXrBGWFHEK2AAMaJGROTiXdjF/kFBEVBhbS3we/6B2f3e71z22fec833fHrvQeab72EB2Yo4t4XgEuKPyn1/5LyCaNBJAAggJICSAkABCAggJICSAkABCAggJICSAkABCAojGip1HgJtNzwPofn7DLl8ZQEOAkABCAggJICSAkABCAggJICSAkABCAggJICSAkACiUWLQ/XTtDyA0BAgJICSAkABCAggJICSAkABCAggJICSAkABCAggJIBod2h9A+wMIDQFCAggJICSAkABCAoimg8GW4LMJT7eGHf5hYOX/uz8/CMCde3eYumBCjcc72DtwMCaJ9k7tAehucn9imQ+XAWDqFUT4gJH0cPOmjWMbLGVWbty+zsWrFzhzIY2k9ERSfzpV7TxhwSOIHDmJ3t59cGrTDovVQtH1Is5dyOZE6nHizfs4evJItfbUVJ+l76/Cs7MXv/v6YxJOH3hsH4UFj2DpH5aRlpHKmOiIevfv/1QAWzA2NzJ68HhO7E2t9t64sPGVH35dcTA48Ns3f4+/r+mRhtrTwqEFzm1d8PPqz5SQN6t0XHOH5iz5dCkhptAqcfb29hhbGHF1cSWgv4k5b71XRcjHEZcci2fnXxHWP+KJAkyMmATAptgNDScD2GLg2Z8zGWeayGfNPsNitVR5b3rUDNIz0/Dx8q0WV9H5Fd+OR8t+O2I2/r4mfr52iTVxK0nJTKboZhH2BgNtWznh5vwSvbr1JrjvsCpx82bPJ8QUSs6l8/z1q8UkJh/kWtE17A32tHfqQPeXutO/z0BGDRtTY9srMsHD9dmbEsfMUb9koLc/Lxpbc+PO9Rr7wqmNE0H+wZSUlrAlLqbWNtdEg70SGPPDBtq37sDYsPFVXh/k54+3pw8r162o13lD/IYD8PGKeexJ2UXBjWuU3bdyr/QeVwpzSc5IYvWuFUT/eUqVuIp6RP/6LTbv+p68a3lYrVbu3rvLpdyLHEj6F4uXLyT0jeCnrsv128UcPmPG3mBPiF9orceNGT4OB3sH9pvjKSwubBqTwL0pcRTcKGDGGzOrvB49+R3y8q+wNW5zvc7r2NwRgNt3b9UprpVjSwBu3rr5TNu560hseWboH1HrMRNGRJan/x3rm84qwFJmYbs5Bm9PHwIGlKfNLq5uhAQMY82mr6sNC09Lek4aAO9HfkS7F59+HnEs9RgACz76E87tXZ5ZO5PSzRTeKOBldx/cXF6q9r5nVy96+/QhvyCfePO+hrUKeNJM+ElzhK2JMUQFT+WdKbNITD7ItMhoSkpL+HbzN/Wuy5fbl7Bw9t8I6BmIv08A2ZfPkn05i59yszl/5Rzp59NqHIv/uORT1i5ZR+iQ4YSYhnEmK530rHQyz/1I5rkMjqceo+h6UZ3rU3bfSvyxPUwIiiKsfwRf/fPvVb/9ERMB2LZ7C1artV6rrQa5CgAovlXE9j1biRwVRV/fV4gcHcXmnd/Xq6MryLqUwbuLp/OLYdMI7B2EZ2cvPDt7Pcg8Vgsns4+zeudy0nMerEBSM04zetoI3ps2l/DgEfj26Ilvj54P4iwWDh8/xKJlCzmWmlK3YSB5BxOCogjxG15NgLFhrwOwMXb9c/kMbN4f4Emz1NqouA8e12kHkaOiWPGXVbRybEXcj9urzWwfV8ea7qdnk0PijiTssKObuweeXT3x7OqFb4+e+PcLoJ/XAPp6+DFr/tsQUDV2+YElLD+wBDdnd9xduuLesSuenb3o270fAQMCGeQ3mE9Wz+fwmUM1ll9bfdJGp+Lboyed7rmReDQBgIABgbi6uJJ1KZMSl1t4uLjX+Rtu6/MEzzUDAJzLPUtKZjL9vAaQlG7mYv6FZ3bu+9wnO+cs2TlniTuwC4BmzZrxm7mfMG1SNB/MnMcHK+bUGHvhag4XruaQkFq+fn/Brhlzxs5lfGAk08NnVgrwtGyK3YBvj568HjGxUoCK9B+XHPvc+v//4lLwpgPr/vP3u/96WVarlUXLPi/PLO7d6zSWr9q5rHyy6lz3jLclLoaS0hLCgyMwtjBibGEkPDiCUkspe1PimrYAh8+YGf5hIMeyjtp8ru++2Eg3N4/HHtPZtQsAuXmXK19bNOcLunRwe2xcRydXAPKL8+pcr8LiQvab42np2JIRr40kYugoHI2OHD5j5vrt4ufW9wYaGQNfeZVda/eyN2EPO/fHknLqKFeu5mIwGHDp0JGhg0OYNfVdAFZvWFkZ19ujLyvmfcOh9AR+OLmf1POnyC/Ox9DMQPvWHXjV25/JQ6eWX8Q6uLF+mW7HesKCwstTv51dlesEDVqAJy1T6jNJfNolZ0XZFWVczruMq4srYUHhhAWF15zOy8pY/u2XrI1ZUznBvFqUh3NbF0y9gjD1Cqo1bsP+f7DNHFNr2x+tz8PEm/eRX5DPIL/B2NnZkV+QT1K62eZlti392+gywJAJ/gT7v0ZoYBi9ffrg5uqGo7ElpZZScvMuc+TEYdbGrCE143SVuKkLJjLQexCDfYfwsps3ndq5YnQwUmq1kF+cx6lzJ9lmjiHrUoZN849tu7cQPXlG5dq/7L71ufaXXeg8k02Pheuxbm0TJxowEkACCAkgJICQAEICCAkgmhTaH0D7AwgNAUICCAkgJICQAEICCAkgJICQAEICCAkgJICQAEICiMaHQffT9cMQoSFASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJASADR6ND+ANofQGgIEBJASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJAND7+DXtbEsjx2g+IAAAAAElFTkSuQmCC" + } + Video: 2180149134592, "Video::file3", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_ambient.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC8i2cvWzAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAGZElEQVR42u2ce0xTVxzHv4VWYxUaHmEhIPwhGAoxE4QIF2MVhCoSB5mAGh8YyBaWZSyDmJi4v5xZYtRkziUmyxYfEBkOqJCBj4GCUMyojjCeazZfhEAAQWtsoA/3hxbtgMtTwPL9JIT23nPuOb18zu/87r3lSHJyIl9iBmi1nTOpDkHwBdufv/adQBY1FIACEApAKAChAIQCEApAKAChAIQCEApAKAChAIQCEEdFEhXlO6PvA/B5/vvdPiMApwBCAQgFIBSAUABCAQgFIBSAUABCAQgFIBSAUABCAYhDIuXzdK4PQDgFEApAKAChAIQCEApAKAChAIQCEApAKAChAIQCEApAHA6uD8D1AQinAEIBCAUgFIBQAEIByOJB+q4OvGNHNjZu3AUAqKkpQGnpdyLXwo8BAEbjCyQlrYfBMDiqjEy2BBrNH3Bz83h9/bvSbv+JE/V2761WKywWM4xGA7q6/kZdXRHa2upE67y5tl45qm8TkZsbNeZx8/K+RmPj76PK28rY2ppsO2P1ccFFAInEGaGh8bBYzLBYzAgNjYdE4jxhvWXL5EhO3jvmPrU6eeSPP6kP5uQEmWwJXF09EBQUhYyME4iO3jmno2toyIjY2AOLLwIolQJcXNzR1lYPiQQICoqCUimgtfW2aD29vhU7d6YjP/8sLBaz3b7U1Azo9a0IDAye9Eh0cpLCy8sPmzfvx7p1aqhUe1BX96tdWa22c2T0iY2q8faJ3Ym7c+cKVKpdCA7egNbW2imP6Mn0a0FGgIiI7QCAu3fLodOV220To7DwJ3h6foD4+CS77aGhUQgIUKKg4Mcp9cNqNaO7+1+UlJwEAKxY4Tano+vWrTyYTEPYsiV98SSBcrkCSqUAo/E5mptr0NxcA6PxOZRKAXK5QrTutWslePKkF7t3f2K3PS0tA319Pbh+XTOtPi1f/qrdR49a5/TkGgz9aGgoh59fCAIDIxaHAGFhakilMjQ1VcFsHobZPIympipIpTKEhalF65rNJhQXX0RAgBLh4RsAAN7eKxEdvQVFRedHTQsT5wFS+PmFICXlMF68eAaN5uScn+CbNy/AbDYhNnZhRoFZzwFsoV6nqxjZ1tDwG9av34GIiO2orS0UrV9cfAH79n2GPXs+hU5Xi5SUgzCZhlFScnFS7Y+X2Ws0p9DT82Dan2uiLP3t3ONtBga60dh4A+HhCfD3X4OHD/9y3Ajg7R0AH5/V6O/vwv37jSPbHzxoQl9fJ3x8VsPbO0D0GIOD/bhx4woiIzchOHgtEhPTcPVqEZ49G5xR35KSvkJW1g9YulQ+5ye5svICrFbrgswFZnV9gOzsDABAaenlUc+5NZpfkJmZA19fFYqKbo2ZRdtet7eXITExDadOnYNcvgIdHWWjsm3b+/+3Y58xS+DiosCaNWHIyjqMVavWIiQkFWfOfCPa/lRGuNjz/Df7OhERUYGYmO3o7VVAr2+ZVJuTKbNg1gdwdnZGXNyr7P3gwWxotY/tfjIzcwAAcXFJcHYWvyfQ3f0P9PoGuLp6oKPjDnp7H02zVy9hMAxCq63CkSNZAIBNm7bNy0g7f/57AEB6+heOOQUIQizc3T0nLOfu7glBiJ2wXHV1wevfl2alf52dr+Z/Dw+veTnRen0LtNoqqFRb4e8f4HhJYEJCCgDg+PHD0GjyxpmH9+LQoW+RkJCC27evix6vvV07btid3s2pDwEAPT1d83ayz507DUGIwf79nztWBFAo3CAIMRgeHkJlZZlIMlSG4eEhCEIMFIp3f1NGKpXBy8sb27Z9jGPHzgIAyssvz9vJbm6+i3v36hEX95FjRQC1Ohky2RJUV1+FwfBU5MbIU9TX34RKtRVqdTIKC3+e9Q8kdrmm1VYhP//suGVtl5BjRZ7xLi/HTj7Fo8Dp05ccKwIkJKQCACoqiiYsaytjq/MuMZlMGBjoh05Xi6NHv0Ru7oEp30yabXS6WrS0/LlgBJDk5ES+nNmI49e63+f2+YWQRQ4FoACEAhAKQCgAoQCEApBFBdcH4PoAhFMAoQCEAhAKQCgAoQCEAhAKQCgAoQCEAhAKQCgAoQDE8ZDyeTr/MYRwCiAUgFAAQgEIBSAUgFAAQgEIBSAUgFAAQgEIBSAUgDgcXB+A6wMQTgGEAhAKQCgAoQCEAhAKQCgAoQCEAhAKQCgAoQCEAhDH4z/mnUJ9Yd62LwAAAABJRU5ErkJggg==" + } + Video: 2180149152352, "Video::file5", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_specular.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC0BSZrFPAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAJS0lEQVR42u2ceVTVVQLHP48HDxRZBZcRlE1QUUIpAdGULUpya6yjx9Kw0hmbbB21daZjajaTU01mecZ0ss3cjtqmpqaJ+6ASSSopiggCGiKyv8f88dREQFBEy76fc94f/N6993d/9/e5++MaZgyYUk0TWHt4U1OiE+97O7r/jbu/DeJ3jQSQAEICCAkgJICQAEICCAkgJICQAEICCAkgJICQAOJmxRDTqU+Tfg+g/fzf9v3VAqgLEBJASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJA3JTYaj9d5wMIdQFCAggJICSAkABCAggJICSAkABCAggJICSAkABCAoibDp0PoPMBhLoAIQGEBBASQEgAIQHE7wfbq4nUN6E/CfcOJCikC67urpirLJQVlXDqWAE56VlkbNtPdtqRGnGmbJhR4++KsgpO55zCc4kPKxcuo7iouMb36zKTG5WXV6OfrXXNvaMnYUMj6NjTH+c2LtgYjZzJP0122hF+WLeHzF0Zdd4r1ieq3vvUF+b8c9WVj8sR+2gitw3vyxRg6bxFvDP1rQbvfR6z2UxZSRm5x3LI35PN9kWbKD1d0vwCmOxNvPTOK0TG1iwEoy2YHEw4t3HFp1cAkaOiGywQk4MJT992PPTX8SSOGMxj94znVP7JJtlcDfQdHUPU6BhsjMaaUnh54O7lQY87w8g9kM2C8W/fsFpnsDHQLfYWzFVmqqkmZkg8706fjcVsblR8o9GIo5Mj/l0D8O8aQLe4UD6a+B6nc39uXgEemjSeyNgojh/N5r//msfu5F2EOXXHaGekpWsrWnf0xKuHD12jQxqssbYOdnj38OG2sf3x6+LPw5P/xGvPTKtdUy5TK6HmSljEyP70S4rHYrGQsnIbe7/YSUFmHjY2Bty8PAi6vTthwyJpF9jhhja7/hFdcHRz4qft+zlZ+jO9B0QQERPJlrWbL99qnCsLg8FAKxcngsN68PhzT9LGvz2xjyay7MUPm1eA2CF3WJu9MU+TfTjLWuscq6kqr6LoRCFFJwo5vPMg372/tsG0qsoqObzzIN+mJzNn1Txu6x/RpEJ1buvK7WPjAPh8+mfsW7f3lyYTyMvIIS8jh51Lkhn0/H03VICQu8IASFudwvf5P9J7QAQJwxMbFOBCS1ddzZnCIratS8bX0p6H5z9Jx1v8mn8Q2LJVSwBKis9es8I4mpEJQCvnVk1Kp+eQcIy2tuxbv7fGy7+UsqISFk9ecMNevoNzS/zCgygrLuXA5h/YvGYTxUXFhEdH4uzmcsXpnco+eUGKZhdg3+4fAHhq+iTcPVtfkwIJvtXaXeQey2lSOp16+gOQ+tWuX/WoOzg+FFs7W/ZvTMNcaaayvIJNX67HzmRH3NA7rjg9n17W5849kN38g8D3pr3N65+8TZ/4fkTERnEoPYPSrDPkZ56gIPMEx9OzKCsqbdRgzcHRAb/wQKLGWZvtb5avbtQIuL4xhWt79yYVxHVr/hOszf/3a1IuXFu95CsGjhhMwvCBLJu/uOFBpMGAm4c7/ROjufuJ+zBXmflu/trmF+Bg2gHG3TWGUY+Nod+d/QkIDoTgi6YnVWay9h5m0/trOL4vq840Lp0OAuzZmsKi9z5qUsHaO9oDUF5c9qt9+Z7+7Wjb+Q8U5pwiKzUTw7nrabtSyT5yjIDgQPy6BnAoPaPRleFsYTFLX/ig3vJuUICr2U9OfXcLqe9uwd3bg2MtCugU4ENAcCChkb3wCQvAO9SXFx6ezI4NW3958ZekUXK2hOzMY2R9l8GupclEe/Vp9Dz/Ys7vp08oPouzqwtbC1I4c/pMo5/l4udvTFnUF6Yx+/oT7p8IwKrFK/jmXPjz6R1an06HJC/GPfQI62Z/0ai8FxzJY3TCCMrLyq/vQtCFAUhWAcmHN5G82vowNkYjE158jGEP3kvS04/UEKC+aV1Tf9BwnhPZJ3B2daFz9yBSkq9sHFBRVoHJwYSNnRFLZe25uNHOuqZQUXr1BW1jNBIzJB6AByYm8cDEpDrDdYu9hfVzvqTaUl1vZbBrYWLMnAl4dGrLsKR7+XTOh1efr2vZxFnMZt7/51wAvP06XtfmNXXbbgASRw6+4rglP1tXIVt7e9T5feuOntbm9lTxVecvIiYSNw/3BsM5ujnhH9HlsmEqSytY8vxCys6UMvaZcUTE9Lk+Aox6cxxu9RTSedp6tQcgPyfvugrw+ScrsFgsDLg7lrhhCfUXsHMrXpn3Wo1rx9Ot/WfPQeF1xgk9d/18uKshYXgiAG88/w9ifaIufF6NfvbC5+tZy2usE1yOwuyTrJz2KQDPvfl3OgX4NL8A3iG+PDL/Ce6Zej/BcaG4tHfDzmSHQ8sWdPD15p6x9zHzg1kALF+w+LoKcDTjCEvmLQJg8usv8NSMyQSFdMHO3oRDCwd8u/jzwONJLNz4Wa2l7D2rdlhf9OBw+iXF4eTpjMHGgJOnM30fjCN0UG9ruM93XN0ilZsL4dGRVJRXsGHVN/WGS9+QSlVFJX7hQTg4t2ww3UPbD7Bg1n9wdHJk6ryZOLk4Ne8YoCivEOc2rgT2DSawr3X4/2cm1ewGLBY+m/sxKxcuvyYvtq5ZQ43B10VjirnTZ2OyNzF09B9JHDm43u4g/dx6xgV59hxi6yffEjlyAFGjY4kaHVsrztaPvyVr7+F683G56ersl9/AzmTH5tUba216XUx5cRk/bd9PUL/uBMeH8r+lWxosn49nf0BAcCD9B0bztznTmHT/E1gsluYR4J0RM/HrHUjnqG60D/KytgAOdlRWVpGfk0fazr2s/HA5B9MO3JBpVnV1Nf9+aRZrl33NoFFD6X5rCK3bemAwGCjIzSd1xx7WrVjDni0pteJunLua7LSj9BoaQbvOHbBvZU95cTm5B7JJWbGVjC0/NqH5HwjAmmVfNxg2bc1ugvp1JyQhrFECAMx8airefh3p2SeMv7z8JG+9+Hqj82aYMWBKk34Wrp9165g48RtGAkgAIQGEBBASQEgAIQHE7wqdD6DzAYS6ACEBhAQQEkBIACEBhAQQEkBIACEBhAQQEkBIACEBxM2HrfbT9Y8hQl2AkABCAggJICSAkABCAggJICSAkABCAggJICSAkADipkPnA+h8AKEuQEgAIQGEBBASQEgAIQGEBBASQEgAIQGEBBASQEgAcfPxf2A9OVhQt049AAAAAElFTkSuQmCC" + } + Video: 2180149136992, "Video::file2", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_transparency.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC4O8giLbgAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAM/UlEQVR42u2ceVhV1d6A3yNgoCLhlOAABAiIoAIhg4SAiAM5pQ1fmpGmVFdLb15tutl8K/VmZmXKh2M5XCU0J9AIkUHFicEhVDBQSFQQUaZz4P6BB0XOOYDIdfq9z+Pz6F7r7LX29t1r2Gv9tmLA9FlVNIHMhLim/BwrLx+k/LtXfguEhxoRQAQQRABBBBBEAEEEEEQAQQQQRABBBBBEAEEEEEQAQQQQHlQUFv28mrQfQNbz7+/ypQWQLkAQAQQRQBABBBFAEAEEEUAQAQQRQBABBBFAEAEEEUAQAYQHEn1ZT5fvAwjSBQgigCACCCKAIAIIIoAgAggigCACCA86+v+LQrKS4huV32/GbABi5v+r1nGVSkVpeQV5BQXsO/4Ha2Ni6z3X+29OY+JzzwIQtmYtH3/9jda8N5f30YqfiDmcojWPuo43EzTAl7HDhuLsYI+piQlKpYrCoiIys7M5nJ7Ob/GJJKekPHwC3Cn09PRobaSHtZEZ1uZmDHTpw6i0FHJyc7XmHzEoEKVSCcCIQYF8tnARKpVKZzklZWWMG+inUQBNPNKyJd999gkB/b1rHTcwMMDIyBCzxzrh5ebKaxNexNLD++ETQNNFq1sFTU+SthZBARi3MsLR0oKJQ4OwNjfj/TenMWXW2xp/5+/lSYd27fg9IREUCgZ4euDv5Ul03B6d5f2atI+xvj54OTqQkH6s3vr949UpBPT35s+zZ/n3kjDik5O5WFCIgb4+HUxNsba0wK23M8EBATIGaApVQNG1EhKPHueTVWsA8HDpqzX/mOBhAGzYtp0NW7fVOqaLNb/FUlZRwbiBfg2q14igQQBMePPvRGzfwfkLF6u7q7IycvLyiE3ay7zFS/B75jkR4E5xNv9CtRSVlRrTTU1M8PPypKi4mKjY3UTF7qaouBg/L09MTUx0nvvSlWJ27D+Ag0V3XGyt661Lm1atACi+evX+GwTeD+vZmvL4eXoCcDLvvMY6PO3jRUsDA6IPHMbcrR8AcWlHGebhzsTQUDbEJWg9d2ZCHF+ezmDI+jWMcXdlw/JlWutk5eXDseyz9LW15usvv2D++o1culJ8R6+/Oe//fdUCKBQKOrZvz0vPjGHeB++hVCoJ3x6tMW+QuxsAUckHao5t33+gVpoucvLy2BS9E09XF1yceunM+/2mLVwtKcW7V0/Wf/AOP/59GrOeH8uzA56kn70dbVsZPdzTwOaYRl4sKOCVmbPJUtS9BGuzzth2MSf34iVSTmfVHE/LPMPZCxex7WKOtVlnTuXm6Sz3u+UrGDU4iKkhEwiZMVNrvoyz55g0bwHjBvrzpLMjtl3Mse1iXpOuVKk4ciqT/98WxdEzf4oATeVk1hmCJ4RQWlamsQkcfP0Jjz5wqE5aVPJBQgYHMtjdjUWRv+os59SZP9n+eyxD/f3o2cOWo39kaM2bd6mAues2MHfdBrp17IDFY52w6PwYtl3M6WPzOK49bOhjbcW7YSvYe/xEve9I/lfTxftCAPXNaN3KiMiwpdhYWRLyzFi+X7mqbp+mUBDg0huAFwcF8OIgzVOvAJfefL9pS71lf7tsOUP9/ZgaMoFX336vQfXNzr9Adv4F9qQdranT6yODGe3jzctDBtUSQFqARnD1WgmTZs4iMnwpb4VO5sTp02Te8okrj572mBob13suU2NjPHracyp+t858R//IICYhgSBfX2wsLW6r3pVVVYRtjWK0jzfdOnW4K0/6A9MFZOXk8OY/P2Tp3C9Y8OEcpi5azJm/ztekD7ne/M9fH8HmxL0az/GUZz9mjB3FEHc3Vi/5sd4yF4Yvx8/Li9cmvKgxfcHrU5i7bgPZ16emmujczhSA/MLL8h6gqcQkJjL/x6UYt2nNpxMnYGxUPcpu26oV/RzsKK+oIObwEe2/P3yE8ooK+jnY1ftOAOBgahqJBw4yPHCgxnRnayvC/zGdj0PGM9C1D2btTDHQ08OwZUu6dmjP00968+XklwHYeH36KV1AE1m0fAWOdj0Y6u/HnJdeYOYPYQS69sFAX5+4lDSKS0q1/ra4pJS9x07g49yLkUGDCF+3vkFjgdULF2hMO19YSKdHH6W/kyP9nRw1dwOVlayN2U1kQpIIcKeY8eHH2Nvb42Jrw9RRw3G0sqgZ6ddHVPJBfJx7MSZ4aIMEiN+fzKG0dPr2qvsf/NxH/8Ld3g7vXj2x69YVs/amGLVsSYVKRX7hZVIzs4iMTyLj7Ll7792KfClUvhQqPMSIACKAIAIIIoDwcCLfB5DvAwjSBQgPbxdwJ09269p2SUkp2bnniIyKZuWGjRTp2Cr1+ohgxvj2B+A/sXt0rtVrihe4VlJKTm4usUl7+XH1T1wqLKy3ftq4eadyQ2IF1OfVtrJnY2nB+KdH4+XmilmnTujr65N3Pp/klBT2ZueSfH2fweeTXsKjpz2/7ElkwcZIjeeaMXYUT3n2IzH9GO+ELb+3WwAjI0N6PP44M0OnsGX5Mjq2b6+5EtfX8JUqFUqVigCX3rRQKBpcjp6eHsZtWuNga0Po+BfYumIZXc3M7ui1qGMFGssbE0PYsXolE8aOwdbKijatW2P4yCNYduvKmGFD+Sp0IounTwVg0S+bqVAqCfZ4gq4d6t6rbh07MMTdjbKKChZGbLr3WgA16ifByNCQJ3o7887Uv2FvY82s10J56+NP6+RXr+HvPXYcBQrcHezw6Glf7558vxmzyUyIQ6FQYGJsjKuzE29NmYyDrY3OeIGbn9SGDsIaGysA8Or4cUx/ZRKVlZWs2hjBmsjNZGRmoqenh2W3rgzxG0DIc8/So1sXAHIuXCRiTyLPDPBhylNDeT98Za3zTQ4egr6eHj/v+p3cSwX3/higpLSU3Xv3MfOTzwDw9fDQmE+9hr9j/8GajZtDGrBxU01VVRWFRUXs2hPPGx/MqZZKR7zA7dDYWIEunR9jxuRJAEyf8xHvfTmXtBMnKCsv51pJCUf/yGDe4iW88OlX7Dt2Y4fQ8h07Kbhyhf5OjjhZWdYc72VlQX8nR/IuFbBqZ8z9NQg8mZUFQFvjNnXS1Gv4xSUl7ElLZ09aOsUlJfRzsKPt9f32jRqHZOdUS6ElXuB2aWyswLjRozEwMGBz9E4io6K15iu6do1ZS8Jr/n2trIywbVHVLcjwoTdak6eq//5d5K+UXw91u28EcHN2rm7iNMTwqdfwY4+kUaFUUaFUEXskFQN9fQJd+zS6LG+36pYjtRn23f2063eUSiXjA/3rzevl5grAus1bGl3OlqT9ZOScxcGiO359nPFxcqSnpQXJJzKIS02/d2cBdZ7uNm0Y4OnBu9P+BkDE9h118mjbvz/Mw50gd7eaAA5dKBQKOrRrx7AAP6a9HIJSqeTfS5Y2eLaiaxZwM38VFLLr0BGCnnDF0aI76Tq2eHc3N78u4vHbuncLIzbzzdRQXhk2GKVKRYVSyTdaZgb3nACabnDigYMsXrm61jEHG5sm7d+/dToIN+IFDqalN4vUq3fGEOjal3GB/ry9dJnWfG1aV3dfRcXFt1VOamYWvx06gn/f6h3Oa2N269xzeE+2AFevXSMrO4fIqGjC166j4pa+a0xwdb/W1P37N8YaN+IFGjJLacwsQE12/gXiUtPx7e2EjbkZmTqu/VETE4zbtOZy0ZXbun8/bNpaI8CyHTvv/RdBmm6wrrn7iEGBQMP271dWVWmdBjYkXuBOsir6N3x7OzEu0J/o/6zTmOds3l88amJCLzs74vcn31Y5+Zdv7CAuLS9vlmu5a6+C1bH79aHev6+7pamOF7h85QpvhU7G39ureWc153JJOnocHydHrbECSYeqW7XnRwznXuauCaCO05+/PgK/GbM1/pm/PqLB7wTU8QIACz6cg42lZbO3Ai1atNAaK/DzL5FUVlYSPDCAUYODtJ6ntaEhn02c8HAJoI7dLysvb/D+/Ya8E7g5XiBs7heYtDVutmtIP/Mnh0+e0horcDLrDGFr1gIw75/v8fnsWTg72PNIy5YYGRpib23NGxNDWP3uTDwdHe6aAM3yfYD6Blbq2P24lDRSd0Xr/k8N9CNogC8u7doSvrP2NDIzIa5OWVszMnE/kopvbyfCF33LzB/C6owf6psGahrDaLpPX1WU1IoVuLUuPycfoWN3C0b29+L5kcN5fqTm7uBQWnq96/ra0u/LXcE35v7179/fuG17rRlDQ/j8p7WcPpdbEy/QXMTvT9YZ7l0FLNi4ide+/pbt+5LJyc+npKyM0vJycvLz2ZK0n/97fSqjJk2+ay2AxAVIXIDwMCMCiACCCCCIAIIIIIgAggggiACCCCCIAIIIIIgAwoONfB9Avg8gSBcgiACCCCCIAIIIIIgAggggiACCCCCIAIIIIIgAggggiADCg4dEB0t0sCBdgCACCCKAIAIIIoAgAggigCACCCKAIAIIIoAgAggigCACCA8e/wUhxyKN56tCMgAAAABJRU5ErkJggg==" + } + Video: 2180149156192, "Video::file6", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_reflection.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_reflection.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_reflection.png" + RelativeFilename: "textures\checkerboard_reflection.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC0exJLIyQAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAHWElEQVR42u2ce1CU1xmHn70RG2QynZgLKkK4KKgZUccbVoVEJQioVKME3erEW1SKsdGJ0ZhW06bTNtPoJBkdp9F6t6ImhKJoJAYdtWqCioIiMSWVFNQoBFHRwtI/nO2A7rK7UEaz/p6/2G/P+c77sc8553vPt3sMCUMW1tMCikr2t6Q6XYIGo/bvX/tGxEONBJAAQgIICSAkgJAAQgIICSAkgJAAQgIICSAkgJAAwlsxhAX+rEXfB9Dz/B93+xoBNAUICSAkgJAAQgIICSAkgJAAQgIICSAkgJAAQgIICSC8ErOep2t/AKEpQEgAIQGEBBASQEgAIQGEBBASQEgAIQGEBBASQEgA4XVofwDtDyA0BQgJICSAkABCAggJIB4ezPY/zpUcaPRGXV0dN27U8F1pGQdyj/CXVZupuPrDPSfI/OJ3bjWUGL3I4zqdgwY1is3+uimaE4+dkNBAUqxJDIjqxdP+T2Ixmykvv0zel6f4NOMzDh445vB/5U5bzuJydE3hXUOZMDGJPv0iedr/CQDKyy5z5HAemzZ8QtHZ8y6v/Y9Lt3Dg81NOy9iv3+wsaJPJhJ+fL+ERoYRHhJI4ejgpY2dTWlrmlT0hdc5kZqdNxmQyNToeGNSRwKCOJI2No+B0EUkJU1stBoMB5i+YycvTkjEaGw/OwSGdCA7pxPiUkXy0ajPv/mEl9U6W8Gpu3mLcxGiHAjgdAe420mAw8NhjfvTs3Z2586YRHhHKG4tTmT1jkds9yp2e0dKVME96uDOmz5xA2twp2Gw2Nm/4hK1bMvm6uASTyURgUEdi44ZgnTSGbt273NNr7Stxd/csZ/E0VS51zstMnZFCXV0d69duZ3v6Ts4Xl9wZncKCGDsunpcmjGLaKxOoqbnN+8tWO2wr++9fMvrFgfSNCufoobOeCWCnvr6eysoq9uUcovRCGVl71tGvf0+v6/ntOzzFnF9NAWD+3LfJzNjb6P0zhcWcKSxm7ep0/vTem60WR8eO/sxMtWKz2Uib9Raf7W7cMQpPn2Pp6XMcO3KC5R8uZWaqlR3bdjo8147N+xkxsi/jrdEuBXDrJrCkpBQAW3291wmQMjEJi8VCVmbOPR9+QyoqfmDq5PmtFkfyhFGYzWYyduy+58NvyK6sfWR8vBuz2UxyyijHsV6tJic7j84RAfToHdJyAaIG9gag4FSR1wnQP6oXANu2Zj0QcWx30qsbsj19Z6M6jti2aT+1tbWMnxjdvCnAYDDQrt1PiYt/jllpk6itrWX5ex81++7b0ZzXVB137vhbkg3Y4wno1P6BkNsex9nCr12WPVNQ3KiOIy5drGR/Tj7PxfYivFsAZwsuuCeAoxTnypUKZk57gxN5BV43ArRt+ygAVVXVD0Qc1dU3XJa9du06AH5+vk2W27ohl+hhkYy3xrBkwTrHArh6nnzh20u8Ov1Dbt/yafLZc3N6bOegQU7P6ei4o2POsgh346m5+R8sFgs9uw2j+tpNj6/h7vbdzWrs5ezXZI8jMuJ5rl+/1WRd37ZtALhx/bbD9uzHikpgT3YkL4yIwfhoGWcKi+8pY3Q0NCZGL+LFuCVc+PYSAYFPkjgmymtXwi5drLyTZnVuf1/juFhWAcAzYa7jCA71v1OnvMJl2RUfrAdg1i9/4dlNYM3N27y9cD3V125inTKUPgO6eKUAp0/8E4DYhD73NY5TJ74BYOgLvVyWHRp3p0x+3nnX9wuFxXyx7zDDYgcTEhroWRZQ9t1V3v3tVgBee3McAYFPeJ0A2ZnHsNlsDIp5lpjhkc6HXd9HWPyOtdXi2JVxlLq6OmKGRzJgUFen5QYM7kr0sEhqa+vY9elRt8694v11GI1GZsyyep4GfnXkHBtX5+Dr24bF71hp6/cTrxKg9F+XyUg/CMCrC8aQOm80YV06YLGYeKSNhaDgp0ieFMOqTa/RNyq81eIo+/dV0jfmYjQaef03ybwyJ5GQMH98fMz4+JgJDvVnRloCr//6zjLx39bv41J5pVvnPp53miOHj5Mw8nn308CGpG/MJSSsPQOju7NgyUu8NW8NNlu9y+zh/5nWeZo2ehLPmpXZ+PhYiE/qT2xCH6fTQVHhhWbHfnc89tcN0+ONq3Pw8THz8+TBxCf1Jz6pv5McP5cta/d51P6KD9by143LmicAwJ9/n06HTu3o0SuE6WkJrFyW6TWjQH09rFyeyed7jhM3si8Rzwby+ON+YDBw5fsqCk6WkLv3JPnHv2n1WNas3E3u3nxGjO5H98hn/hfH1e+rKMgvIevjf3C+2PMHcocOfsXJ4wX06Nmt8XpPwpCFLVrf1de6tU2c+BEjASSAkABCAggJICSAkADioUL7A2h/AKEpQEgAIQGEBBASQEgAIQGEBBASQEgAIQGEBBASQEgA4X2Y9TxdPwwRmgKEBBASQEgAIQGEBBASQEgAIQGEBBASQEgAIQGEBBBeh/YH0P4AQlOAkABCAggJICSAkABCAggJICSAkABCAggJICSAkADC+/gv4A+Ym6/ZZeAAAAAASUVORK5CYII=" + } + Texture: 2180149151392, "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180149152832, "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180149144192, "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180149139392, "Texture::file5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file5" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file5" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180149135552, "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180149146112, "Texture::file6", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file6" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file6" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_reflection.png" + RelativeFilename: "textures\checkerboard_reflection.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + AnimationStack: 2180249157920, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2180157285776, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2179263690608,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2180157285776,2180249157920 + + ;Texture::file4, Material::phong1 + C: "OP",2180149152832,2180149143232, "EmissiveColor" + + ;Texture::file3, Material::phong1 + C: "OP",2180149144192,2180149143232, "AmbientColor" + + ;Texture::file1, Material::phong1 + C: "OP",2180149151392,2180149143232, "DiffuseColor" + + ;Texture::file2, Material::phong1 + C: "OP",2180149135552,2180149143232, "TransparentColor" + + ;Texture::file5, Material::phong1 + C: "OP",2180149139392,2180149143232, "SpecularColor" + + ;Texture::file6, Material::phong1 + C: "OP",2180149146112,2180149143232, "ReflectionColor" + + ;Video::file1, Texture::file1 + C: "OO",2180149146592,2180149151392 + + ;Video::file4, Texture::file4 + C: "OO",2180149147552,2180149152832 + + ;Video::file3, Texture::file3 + C: "OO",2180149134592,2180149144192 + + ;Video::file5, Texture::file5 + C: "OO",2180149152352,2180149139392 + + ;Video::file2, Texture::file2 + C: "OO",2180149136992,2180149135552 + + ;Video::file6, Texture::file6 + C: "OO",2180149156192,2180149146112 + + ;Geometry::, Model::pCube1 + C: "OO",2179854704896,2179263690608 + + ;Material::phong1, Model::pCube1 + C: "OO",2180149143232,2179263690608 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_textured_cube_7500_binary.fbx b/modules/ufbx/data/maya_textured_cube_7500_binary.fbx new file mode 100644 index 0000000..a990b50 Binary files /dev/null and b/modules/ufbx/data/maya_textured_cube_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_transform_animation_6100_ascii.fbx b/modules/ufbx/data/maya_transform_animation_6100_ascii.fbx new file mode 100644 index 0000000..c029286 --- /dev/null +++ b/modules/ufbx/data/maya_transform_animation_6100_ascii.fbx @@ -0,0 +1,424 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 13 + Hour: 18 + Minute: 53 + Second: 17 + Millisecond: 370 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_transform_animation_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_transform_animation_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "13/08/2021 15:53:17.361" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_transform_animation_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "13/08/2021 15:53:17.361" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::pCube1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0,U,s,0,0,n,26941925500,1,U,s,0,0,n,46186158000,-1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0,U,s,0,0,n,26941925500,2,U,s,0,0,n,46186158000,-2,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0,U,s,0,0,n,26941925500,3,U,s,0,0,n,46186158000,-3,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0,U,s,0,0,n,26941925500,10,U,s,0,0,n,46186158000,-10,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0,U,s,0,0,n,26941925500,20,U,s,0,0,n,46186158000,-20,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0,U,s,0,0,n,26941925500,30,U,s,0,0,n,46186158000,-30,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,1,U,s,0,0,n,26941925500,1.10000002384186,U,s,0,0,n,46186158000,0.899999976158142 + ,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,1,U,s,0,0,n,26941925500,1.20000004768372,U,s,0,0,n,46186158000,0.800000011920929 + ,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,1,U,s,0,0,n,26941925500,1.29999995231628,U,s,0,0,n,46186158000,0.699999988079071 + ,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,1,C,s,26941925500,1,C,s,46186158000,1,C,s + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_transform_animation_6100_binary.fbx b/modules/ufbx/data/maya_transform_animation_6100_binary.fbx new file mode 100644 index 0000000..c69c8c7 Binary files /dev/null and b/modules/ufbx/data/maya_transform_animation_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_transform_animation_7500_ascii.fbx b/modules/ufbx/data/maya_transform_animation_7500_ascii.fbx new file mode 100644 index 0000000..663deeb --- /dev/null +++ b/modules/ufbx/data/maya_transform_animation_7500_ascii.fbx @@ -0,0 +1,682 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 13 + Hour: 18 + Minute: 51 + Second: 53 + Millisecond: 113 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_transform_animation_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_transform_animation_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "13/08/2021 15:51:53.112" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_transform_animation_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "13/08/2021 15:51:53.112" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2656627879024, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 20 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 4 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 10 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2657134309712, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2656669897040, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",0.557578516158398,1.1151570323168,1.67273554847519 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",5.57578516158398,11.151570323168,16.7273554847519 + P: "Lcl Scaling", "Lcl Scaling", "", "A+",1.05575785161584,1.11151570323168,1.16727355484752 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2658636763952, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2658637297440, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2657134813136, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,26941925500,46186158000 + } + KeyValueFloat: *3 { + a: 1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Constant|ConstantStandard, Constant|ConstantStandard + KeyAttrFlags: *3 { + a: 2,2,2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2657134819856, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,26941925500,46186158000 + } + KeyValueFloat: *3 { + a: 0,1,-1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2657134819056, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,26941925500,46186158000 + } + KeyValueFloat: *3 { + a: 0,2,-2 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2657134820496, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,26941925500,46186158000 + } + KeyValueFloat: *3 { + a: 0,3,-3 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2657134784816, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,26941925500,46186158000 + } + KeyValueFloat: *3 { + a: 1,1.1,0.9 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2657134794576, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,26941925500,46186158000 + } + KeyValueFloat: *3 { + a: 1,1.2,0.8 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2657134795216, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,26941925500,46186158000 + } + KeyValueFloat: *3 { + a: 1,1.3,0.7 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2658624129536, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,26941925500,46186158000 + } + KeyValueFloat: *3 { + a: 0,10,-10 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2658624130656, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,26941925500,46186158000 + } + KeyValueFloat: *3 { + a: 0,20,-20 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurve: 2657134813936, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *3 { + a: 1924423250,26941925500,46186158000 + } + KeyValueFloat: *3 { + a: 0,30,-30 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *3 { + a: 24840,24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *12 { + a: 0,0,218434821,0,0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *3 { + a: 1,1,1 + } + } + AnimationCurveNode: 2658637294320, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2658637305344, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0.557578516158398 + P: "d|Y", "Number", "", "A",1.1151570323168 + P: "d|Z", "Number", "", "A",1.67273554847519 + } + } + AnimationCurveNode: 2658637306384, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.05575785161584 + P: "d|Y", "Number", "", "A",1.11151570323168 + P: "d|Z", "Number", "", "A",1.16727355484752 + } + } + AnimationCurveNode: 2658637304720, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",5.57578516158398 + P: "d|Y", "Number", "", "A",11.151570323168 + P: "d|Z", "Number", "", "A",16.7273554847519 + } + } + AnimationLayer: 2658624679488, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2656669897040,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2658624679488,2658637297440 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2658637294320,2658624679488 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2658637305344,2658624679488 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2658637306384,2658624679488 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2658637304720,2658624679488 + + ;Geometry::, Model::pCube1 + C: "OO",2657134309712,2656669897040 + + ;Material::lambert1, Model::pCube1 + C: "OO",2658636763952,2656669897040 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2658637305344,2656669897040, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2658637304720,2656669897040, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2658637306384,2656669897040, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2658637294320,2656669897040, "Visibility" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2657134813136,2658637294320, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2657134819856,2658637305344, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2657134819056,2658637305344, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2657134820496,2658637305344, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2657134784816,2658637306384, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2657134794576,2658637306384, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2657134795216,2658637306384, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2658624129536,2658637304720, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2658624130656,2658637304720, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2657134813936,2658637304720, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_transform_animation_7500_binary.fbx b/modules/ufbx/data/maya_transform_animation_7500_binary.fbx new file mode 100644 index 0000000..d23f9c7 Binary files /dev/null and b/modules/ufbx/data/maya_transform_animation_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_tri_cone_7500_binary.fbx b/modules/ufbx/data/maya_tri_cone_7500_binary.fbx new file mode 100644 index 0000000..7e7d034 Binary files /dev/null and b/modules/ufbx/data/maya_tri_cone_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_triangulate_7500_binary.fbx b/modules/ufbx/data/maya_triangulate_7500_binary.fbx new file mode 100644 index 0000000..945cb72 Binary files /dev/null and b/modules/ufbx/data/maya_triangulate_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_triangulate_down_7500_binary.fbx b/modules/ufbx/data/maya_triangulate_down_7500_binary.fbx new file mode 100644 index 0000000..600e363 Binary files /dev/null and b/modules/ufbx/data/maya_triangulate_down_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_triangulate_down_triangulated_7500_binary.fbx b/modules/ufbx/data/maya_triangulate_down_triangulated_7500_binary.fbx new file mode 100644 index 0000000..c7b3c8a Binary files /dev/null and b/modules/ufbx/data/maya_triangulate_down_triangulated_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_triangulate_triangulated_7500_binary.fbx b/modules/ufbx/data/maya_triangulate_triangulated_7500_binary.fbx new file mode 100644 index 0000000..cb84eee Binary files /dev/null and b/modules/ufbx/data/maya_triangulate_triangulated_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_unicode_6100_ascii.fbx b/modules/ufbx/data/maya_unicode_6100_ascii.fbx new file mode 100644 index 0000000..ebc6bce --- /dev/null +++ b/modules/ufbx/data/maya_unicode_6100_ascii.fbx @@ -0,0 +1,372 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 5 + Day: 11 + Hour: 18 + Minute: 1 + Second: 34 + Millisecond: 444 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::aß___", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::aß____ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_unicode_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_unicode_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "11/05/2022 15:01:34.443" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_unicode_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "11/05/2022 15:01:34.443" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",100 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::aß___", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::aß___" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_unicode_6100_binary.fbx b/modules/ufbx/data/maya_unicode_6100_binary.fbx new file mode 100644 index 0000000..4fd2ef2 Binary files /dev/null and b/modules/ufbx/data/maya_unicode_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_unicode_7400_ascii.fbx b/modules/ufbx/data/maya_unicode_7400_ascii.fbx new file mode 100644 index 0000000..5062ad8 --- /dev/null +++ b/modules/ufbx/data/maya_unicode_7400_ascii.fbx @@ -0,0 +1,425 @@ +; FBX 7.4.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7400 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 5 + Day: 11 + Hour: 17 + Minute: 59 + Second: 6 + Millisecond: 229 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_cube_unicode_7400_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_cube_unicode_7400_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "11/05/2022 14:59:06.228" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_cube_unicode_7400_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "11/05/2022 14:59:06.228" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",100 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2373105977568, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2375070045216, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2375059226816, "Model::aß___", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.01,0.01,0.01 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2374966704896, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2373103849920, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2373103060256, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::aß___, Model::RootNode + C: "OO",2375059226816,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2373103060256,2373103849920 + + ;Geometry::, Model::aß___ + C: "OO",2375070045216,2375059226816 + + ;Material::lambert1, Model::aß___ + C: "OO",2374966704896,2375059226816 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_unicode_7400_binary.fbx b/modules/ufbx/data/maya_unicode_7400_binary.fbx new file mode 100644 index 0000000..0c9118a Binary files /dev/null and b/modules/ufbx/data/maya_unicode_7400_binary.fbx differ diff --git a/modules/ufbx/data/maya_uv_and_color_sets_6100_ascii.fbx b/modules/ufbx/data/maya_uv_and_color_sets_6100_ascii.fbx new file mode 100644 index 0000000..876f36e --- /dev/null +++ b/modules/ufbx/data/maya_uv_and_color_sets_6100_ascii.fbx @@ -0,0 +1,439 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 7 + Hour: 20 + Minute: 40 + Second: 49 + Millisecond: 653 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "UVB" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "UVA" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementBinormal: 1 { + Version: 101 + Name: "UVB" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "UVA" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementTangent: 1 { + Version: 101 + Name: "UVB" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementColor: 0 { + Version: 101 + Name: "ColorA" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0 + ,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1 + ColorIndex: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + LayerElementColor: 1 { + Version: 101 + Name: "ColorB" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + ColorIndex: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + LayerElementUV: 0 { + Version: 101 + Name: "UVA" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 1 { + Version: 101 + Name: "UVB" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 1.04773789644241e-09,0,1,0,1,1,1.04773789644241e-09,1,0,0,1,0,1,1,0,1,0,-1.49011611938477e-08,1,-1.49011611938477e-08 + ,1,1,0,1,0,0,1,0,1,1,0,1,5.23868948221207e-09,-1.0710209608078e-08,1,-1.0710209608078e-08,1,1,5.23868948221207e-09 + ,1,0,0,1,0,1,1,0,1 + UVIndex: 16,17,18,19,8,9,10,11,20,21,22,23,12,13,14,15,0,1,2,3,4,5,6,7 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_uv_and_color_sets_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_uv_and_color_sets_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "07/04/2020 17:40:49.650" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_uv_and_color_sets_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "07/04/2020 17:40:49.650" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_uv_and_color_sets_6100_binary.fbx b/modules/ufbx/data/maya_uv_and_color_sets_6100_binary.fbx new file mode 100644 index 0000000..09d2378 Binary files /dev/null and b/modules/ufbx/data/maya_uv_and_color_sets_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_uv_and_color_sets_7500_ascii.fbx b/modules/ufbx/data/maya_uv_and_color_sets_7500_ascii.fbx new file mode 100644 index 0000000..c197f78 --- /dev/null +++ b/modules/ufbx/data/maya_uv_and_color_sets_7500_ascii.fbx @@ -0,0 +1,508 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 7 + Hour: 20 + Minute: 38 + Second: 23 + Millisecond: 514 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_uv_and_color_sets_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_uv_and_color_sets_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "07/04/2020 17:38:23.511" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_uv_and_color_sets_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "07/04/2020 17:38:23.511" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2091954675536, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2091948553328, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "UVA" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementBinormal: 1 { + Version: 102 + Name: "UVB" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "UVA" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementTangent: 1 { + Version: 102 + Name: "UVB" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementColor: 0 { + Version: 101 + Name: "ColorA" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: *96 { + a: 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1 + } + ColorIndex: *24 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + } + LayerElementColor: 1 { + Version: 101 + Name: "ColorB" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: *96 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ColorIndex: *24 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "UVA" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementUV: 1 { + Version: 101 + Name: "UVB" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *48 { + a: 1.04773789644241e-09,0,1,0,1,1,1.04773789644241e-09,1,0,0,1,0,1,1,0,1,0,-1.49011611938477e-08,1,-1.49011611938477e-08,1,1,0,1,0,0,1,0,1,1,0,1,5.23868948221207e-09,-1.0710209608078e-08,1,-1.0710209608078e-08,1,1,5.23868948221207e-09,1,0,0,1,0,1,1,0,1 + } + UVIndex: *24 { + a: 16,17,18,19,8,9,10,11,20,21,22,23,12,13,14,15,0,1,2,3,4,5,6,7 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + } + } + Model: 2093560274064, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "UVB" + } + Shading: T + Culling: "CullingOff" + } + Material: 2092239292288, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2092234945376, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2091670098736, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2093560274064,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2091670098736,2092234945376 + + ;Geometry::, Model::pCube1 + C: "OO",2091948553328,2093560274064 + + ;Material::lambert1, Model::pCube1 + C: "OO",2092239292288,2093560274064 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_uv_and_color_sets_7500_binary.fbx b/modules/ufbx/data/maya_uv_and_color_sets_7500_binary.fbx new file mode 100644 index 0000000..1c0833f Binary files /dev/null and b/modules/ufbx/data/maya_uv_and_color_sets_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_uv_set_tangents_6100_ascii.fbx b/modules/ufbx/data/maya_uv_set_tangents_6100_ascii.fbx new file mode 100644 index 0000000..d87602a --- /dev/null +++ b/modules/ufbx/data/maya_uv_set_tangents_6100_ascii.fbx @@ -0,0 +1,479 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 1 + Hour: 16 + Minute: 14 + Second: 8 + Millisecond: 517 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pPlane1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "Rot270" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,0,0.5,0.5,0,0.5,-0.5,0,-0.5,0.5,0,-0.5 + PolygonVertexIndex: 0,1,3,-3 + Edges: 0,3,1,2 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: 0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "Rot0" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: 0,0,-1,0,0,-1,0,0,-1,0,0,-1 + } + LayerElementBinormal: 1 { + Version: 101 + Name: "Rot90" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: -1,0,0,-1,0,1.49011611938477e-08,-1,0,2.98023223876953e-08,-1,0,1.49011611938477e-08 + } + LayerElementBinormal: 2 { + Version: 101 + Name: "Rot180" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: 5.9604651880818e-08,-0,1,4.47034871342566e-08,-0,1,2.98023223876953e-08,-0,1,4.47034871342566e-08,-0,1 + } + LayerElementBinormal: 3 { + Version: 101 + Name: "Rot270" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: 1,0,-2.9802325940409e-08,1,0,-7.45058059692383e-08,1,0,-1.19209289550781e-07,1,0,-7.45058059692383e-08 + } + LayerElementTangent: 0 { + Version: 101 + Name: "Rot0" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: 1,-0,0,1,0,0,1,0,0,1,0,0 + } + LayerElementTangent: 1 { + Version: 101 + Name: "Rot90" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: 0,0,-1,-1.49011611938477e-08,0,-1,-2.98023223876953e-08,0,-1,-1.49011611938477e-08,0,-1 + } + LayerElementTangent: 2 { + Version: 101 + Name: "Rot180" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: -1,-0,5.9604651880818e-08,-1,-0,4.47034871342566e-08,-1,-0,2.98023223876953e-08,-1,-0,4.47034871342566e-08 + } + LayerElementTangent: 3 { + Version: 101 + Name: "Rot270" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: 2.9802325940409e-08,-0,1,7.45058059692383e-08,-0,1,1.19209289550781e-07,-0,1,7.45058059692383e-08,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "Rot0" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0,0,1,0,0,1,1,1 + UVIndex: 0,1,3,2 + } + LayerElementUV: 1 { + Version: 101 + Name: "Rot90" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 2.98023223876953e-08,1,0,2.98023223876953e-08,1,1,1,0 + UVIndex: 0,1,3,2 + } + LayerElementUV: 2 { + Version: 101 + Name: "Rot180" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 1,0.999999940395355,5.96046447753906e-08,1,1,0,0,2.98023223876953e-08 + UVIndex: 0,1,3,2 + } + LayerElementUV: 3 { + Version: 101 + Name: "Rot270" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.99999988079071,0,1,0.99999988079071,0,2.98023223876953e-08,5.96046447753906e-08,1 + UVIndex: 0,1,3,2 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 2 + } + } + Layer: 3 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 3 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 3 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 3 + } + } + NodeAttributeName: "Geometry::pPlane1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_uv_set_tangents_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_uv_set_tangents_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "01/04/2020 13:14:08.515" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_uv_set_tangents_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "01/04/2020 13:14:08.515" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pPlane1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pPlane1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_uv_set_tangents_6100_binary.fbx b/modules/ufbx/data/maya_uv_set_tangents_6100_binary.fbx new file mode 100644 index 0000000..9c70de9 Binary files /dev/null and b/modules/ufbx/data/maya_uv_set_tangents_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_uv_set_tangents_7500_ascii.fbx b/modules/ufbx/data/maya_uv_set_tangents_7500_ascii.fbx new file mode 100644 index 0000000..36c6fdc --- /dev/null +++ b/modules/ufbx/data/maya_uv_set_tangents_7500_ascii.fbx @@ -0,0 +1,580 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 1 + Hour: 15 + Minute: 36 + Second: 14 + Millisecond: 748 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_uv_set_tangents_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_uv_set_tangents_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "01/04/2020 12:36:14.746" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_uv_set_tangents_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "01/04/2020 12:36:14.746" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2694179563792, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2694176668800, "Geometry::", "Mesh" { + Vertices: *12 { + a: -0.5,0,0.5,0.5,0,0.5,-0.5,0,-0.5,0.5,0,-0.5 + } + PolygonVertexIndex: *4 { + a: 0,1,3,-3 + } + Edges: *4 { + a: 0,3,1,2 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *12 { + a: 0,1,0,0,1,0,0,1,0,0,1,0 + } + NormalsW: *4 { + a: 1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "Rot0" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: *12 { + a: 0,0,-1,0,0,-1,0,0,-1,0,0,-1 + } + BinormalsW: *4 { + a: 1,1,1,1 + } + + } + LayerElementBinormal: 1 { + Version: 102 + Name: "Rot90" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: *12 { + a: -1,0,0,-1,0,1.49011611938477e-08,-1,0,2.98023223876953e-08,-1,0,1.49011611938477e-08 + } + BinormalsW: *4 { + a: 1,1,1,1 + } + + } + LayerElementBinormal: 2 { + Version: 102 + Name: "Rot180" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: *12 { + a: 5.9604651880818e-08,-0,1,4.47034871342566e-08,-0,1,2.98023223876953e-08,-0,1,4.47034871342566e-08,-0,1 + } + BinormalsW: *4 { + a: 1,1,1,1 + } + + } + LayerElementBinormal: 3 { + Version: 102 + Name: "Rot270" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: *12 { + a: 1,0,-2.9802325940409e-08,1,0,-7.45058059692383e-08,1,0,-1.19209289550781e-07,1,0,-7.45058059692383e-08 + } + BinormalsW: *4 { + a: 1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "Rot0" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: *12 { + a: 1,-0,0,1,0,0,1,0,0,1,0,0 + } + TangentsW: *4 { + a: 1,1,1,1 + } + } + LayerElementTangent: 1 { + Version: 102 + Name: "Rot90" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: *12 { + a: 0,0,-1,-1.49011611938477e-08,0,-1,-2.98023223876953e-08,0,-1,-1.49011611938477e-08,0,-1 + } + TangentsW: *4 { + a: 1,1,1,1 + } + } + LayerElementTangent: 2 { + Version: 102 + Name: "Rot180" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: *12 { + a: -1,-0,5.9604651880818e-08,-1,-0,4.47034871342566e-08,-1,-0,2.98023223876953e-08,-1,-0,4.47034871342566e-08 + } + TangentsW: *4 { + a: 1,1,1,1 + } + } + LayerElementTangent: 3 { + Version: 102 + Name: "Rot270" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: *12 { + a: 2.9802325940409e-08,-0,1,7.45058059692383e-08,-0,1,1.19209289550781e-07,-0,1,7.45058059692383e-08,-0,1 + } + TangentsW: *4 { + a: 1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "Rot0" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 0,0,1,0,0,1,1,1 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementUV: 1 { + Version: 101 + Name: "Rot90" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 2.98023223876953e-08,1,0,2.98023223876953e-08,1,1,1,0 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementUV: 2 { + Version: 101 + Name: "Rot180" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 1,0.999999940395355,5.96046447753906e-08,1,1,0,0,2.98023223876953e-08 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementUV: 3 { + Version: 101 + Name: "Rot270" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 0.99999988079071,0,1,0.99999988079071,0,2.98023223876953e-08,5.96046447753906e-08,1 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *4 { + a: 0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 2 + } + } + Layer: 3 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 3 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 3 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 3 + } + } + } + Model: 2694178308240, "Model::pPlane1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "Rot270" + } + Shading: T + Culling: "CullingOff" + } + Material: 2695032382528, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2694182103184, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2694011430160, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pPlane1, Model::RootNode + C: "OO",2694178308240,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2694011430160,2694182103184 + + ;Geometry::, Model::pPlane1 + C: "OO",2694176668800,2694178308240 + + ;Material::lambert1, Model::pPlane1 + C: "OO",2695032382528,2694178308240 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_uv_set_tangents_7500_binary.fbx b/modules/ufbx/data/maya_uv_set_tangents_7500_binary.fbx new file mode 100644 index 0000000..86566fe Binary files /dev/null and b/modules/ufbx/data/maya_uv_set_tangents_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_uv_sets_6100_ascii.fbx b/modules/ufbx/data/maya_uv_sets_6100_ascii.fbx new file mode 100644 index 0000000..fe7e33c --- /dev/null +++ b/modules/ufbx/data/maya_uv_sets_6100_ascii.fbx @@ -0,0 +1,457 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 19 + Minute: 10 + Second: 50 + Millisecond: 261 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "Default" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "Default" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementBinormal: 1 { + Version: 101 + Name: "PerFace" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementBinormal: 2 { + Version: 101 + Name: "Row" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,-0,0,-1 + ,0,0,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,-1,0,0,-1,-0,0,-1,0,0,-1 + } + LayerElementTangent: 0 { + Version: 101 + Name: "Default" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementTangent: 1 { + Version: 101 + Name: "PerFace" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementTangent: 2 { + Version: 101 + Name: "Row" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,1,-0,0,1,0,0,1,0,1 + ,-0,0,1,-0,-0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,-0,0,1,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "Default" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.401315778493881,0.105263143777847,0.598684191703796,0.105263143777847,0.401315778493881,0.302631556987762,0.598684191703796 + ,0.302631556987762,0.401315778493881,0.5,0.598684191703796,0.5,0.401315778493881,0.697368443012238,0.598684191703796 + ,0.697368443012238,0.401315778493881,0.894736886024475,0.598684191703796,0.894736886024475,0.796052634716034 + ,0.105263143777847,0.796052634716034,0.302631556987762,0.203947365283966,0.105263143777847,0.203947365283966 + ,0.302631556987762 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 1 { + Version: 101 + Name: "PerFace" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 1,0,1,0,0,0,0,1,0,0,1,1,0,0,1,1,0,1,1,1,1,0,1,1,0,0,0,1,1,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,1,1,1 + UVIndex: 17,1,20,22,2,21,5,19,4,18,7,16,6,14,9,8,15,10,11,3,12,0,23,13 + } + LayerElementUV: 2 { + Version: 101 + Name: "Row" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 5,0,1.00000011920929,0,1.00000011920929,1.00000011920929,5,1.00000011920929,2.00000023841858,0,2.00000023841858 + ,0,3.00000047683716,1.00000011920929,3.00000047683716,1.00000011920929,4.00000047683716,1.00000011920929,4.00000047683716 + ,0,4.00000047683716,0,5,0,5,0.99999988079071,6,0.99999988079071,3.00000047683716,0,4.00000047683716,1.00000011920929 + ,2.00000023841858,1.00000011920929,0,0,3.00000047683716,0,2.00000023841858,1.00000011920929,1.00000011920929 + ,1.00000011920929,1.00000011920929,0,0,1.00000011920929,6,0 + UVIndex: 17,1,20,22,2,21,5,19,4,18,7,16,6,14,9,8,15,10,11,3,12,0,23,13 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 2 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_uv_sets_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_uv_sets_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "31/03/2020 16:10:50.258" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_uv_sets_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "31/03/2020 16:10:50.258" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_uv_sets_6100_binary.fbx b/modules/ufbx/data/maya_uv_sets_6100_binary.fbx new file mode 100644 index 0000000..e824a68 Binary files /dev/null and b/modules/ufbx/data/maya_uv_sets_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_uv_sets_7500_ascii.fbx b/modules/ufbx/data/maya_uv_sets_7500_ascii.fbx new file mode 100644 index 0000000..523de2e --- /dev/null +++ b/modules/ufbx/data/maya_uv_sets_7500_ascii.fbx @@ -0,0 +1,528 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 19 + Minute: 11 + Second: 13 + Millisecond: 77 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_uv_sets_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_uv_sets_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 16:11:13.072" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_uv_sets_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 16:11:13.072" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1736561833456, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1737028813456, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "Default" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementBinormal: 1 { + Version: 102 + Name: "PerFace" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementBinormal: 2 { + Version: 102 + Name: "Row" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,-0,0,-1,0,0,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,-1,0,0,-1,-0,0,-1,0,0,-1 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "Default" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementTangent: 1 { + Version: 102 + Name: "PerFace" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementTangent: 2 { + Version: 102 + Name: "Row" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,1,-0,0,1,0,0,1,0,1,-0,0,1,-0,-0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,-0,0,1,0 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "Default" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.401315778493881,0.105263143777847,0.598684191703796,0.105263143777847,0.401315778493881,0.302631556987762,0.598684191703796,0.302631556987762,0.401315778493881,0.5,0.598684191703796,0.5,0.401315778493881,0.697368443012238,0.598684191703796,0.697368443012238,0.401315778493881,0.894736886024475,0.598684191703796,0.894736886024475,0.796052634716034,0.105263143777847,0.796052634716034,0.302631556987762,0.203947365283966,0.105263143777847,0.203947365283966,0.302631556987762 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementUV: 1 { + Version: 101 + Name: "PerFace" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *48 { + a: 1,0,1,0,0,0,0,1,0,0,1,1,0,0,1,1,0,1,1,1,1,0,1,1,0,0,0,1,1,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,1,1,1 + } + UVIndex: *24 { + a: 17,1,20,22,2,21,5,19,4,18,7,16,6,14,9,8,15,10,11,3,12,0,23,13 + } + } + LayerElementUV: 2 { + Version: 101 + Name: "Row" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *48 { + a: 5,0,1.00000011920929,0,1.00000011920929,1.00000011920929,5,1.00000011920929,2.00000023841858,0,2.00000023841858,0,3.00000047683716,1.00000011920929,3.00000047683716,1.00000011920929,4.00000047683716,1.00000011920929,4.00000047683716,0,4.00000047683716,0,5,0,5,0.99999988079071,6,0.99999988079071,3.00000047683716,0,4.00000047683716,1.00000011920929,2.00000023841858,1.00000011920929,0,0,3.00000047683716,0,2.00000023841858,1.00000011920929,1.00000011920929,1.00000011920929,1.00000011920929,0,0,1.00000011920929,6,0 + } + UVIndex: *24 { + a: 17,1,20,22,2,21,5,19,4,18,7,16,6,14,9,8,15,10,11,3,12,0,23,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 2 + } + } + } + Model: 1737025078608, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "Default" + } + Shading: T + Culling: "CullingOff" + } + Material: 1736894092448, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1736557419488, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1737163960000, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1737025078608,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1737163960000,1736557419488 + + ;Geometry::, Model::pCube1 + C: "OO",1737028813456,1737025078608 + + ;Material::lambert1, Model::pCube1 + C: "OO",1736894092448,1737025078608 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_uv_sets_7500_binary.fbx b/modules/ufbx/data/maya_uv_sets_7500_binary.fbx new file mode 100644 index 0000000..1085f63 Binary files /dev/null and b/modules/ufbx/data/maya_uv_sets_7500_binary.fbx differ diff --git a/modules/ufbx/data/maya_vertex_crease.obj b/modules/ufbx/data/maya_vertex_crease.obj new file mode 100644 index 0000000..0033193 --- /dev/null +++ b/modules/ufbx/data/maya_vertex_crease.obj @@ -0,0 +1,423 @@ +# ufbx:bad_normals +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -0.390625 -0.500000 0.390625 +v 0.437500 -0.500000 0.437500 +v -0.300926 0.300926 0.300926 +v 0.347222 0.347222 0.347222 +v -0.500000 0.500000 -0.500000 +v 0.423611 0.423611 -0.423611 +v -0.500000 -0.500000 -0.500000 +v 0.468750 -0.500000 -0.468750 +v 0.007812 -0.500000 0.492188 +v 0.010417 0.352865 0.352865 +v 0.000000 0.363281 -0.363281 +v 0.000000 -0.500000 -0.500000 +v -0.348958 -0.014323 0.348958 +v 0.365234 -0.003906 0.365234 +v -0.352865 0.352865 -0.010417 +v 0.363281 0.363281 0.000000 +v -0.365234 -0.003906 -0.365234 +v 0.365234 -0.003906 -0.365234 +v -0.492188 -0.500000 -0.007812 +v 0.500000 -0.500000 0.000000 +v 0.002713 -0.013455 0.462131 +v 0.001736 0.451389 -0.001736 +v 0.000000 -0.011719 -0.464844 +v 0.000977 -0.500000 -0.000977 +v 0.464844 -0.011719 0.000000 +v -0.462131 -0.013455 -0.002713 +v -0.218750 -0.500000 0.468750 +v 0.250000 -0.500000 0.500000 +v -0.192708 0.341146 0.341146 +v 0.234375 0.382812 0.382812 +v -0.234375 0.382812 -0.382812 +v 0.234375 0.382812 -0.382812 +v -0.250000 -0.500000 -0.500000 +v 0.250000 -0.500000 -0.500000 +v -0.367188 -0.250000 0.367188 +v -0.341146 0.192708 0.341146 +v 0.390625 -0.250000 0.390625 +v 0.382812 0.234375 0.382812 +v -0.341146 0.341146 0.192708 +v -0.382812 0.382812 -0.234375 +v 0.382812 0.382812 0.234375 +v 0.382812 0.382812 -0.234375 +v -0.382812 0.234375 -0.382812 +v -0.390625 -0.250000 -0.390625 +v 0.382812 0.234375 -0.382812 +v 0.390625 -0.250000 -0.390625 +v -0.500000 -0.500000 -0.250000 +v -0.468750 -0.500000 0.218750 +v 0.500000 -0.500000 -0.250000 +v 0.500000 -0.500000 0.250000 +v 0.003906 -0.250000 0.480469 +v 0.203125 -0.007812 0.445312 +v 0.006944 0.196181 0.430556 +v -0.192274 -0.014757 0.434462 +v 0.006944 0.430556 0.196181 +v 0.203125 0.437500 0.000000 +v 0.000000 0.437500 -0.203125 +v -0.196181 0.430556 -0.006944 +v 0.000000 0.203125 -0.437500 +v 0.203125 -0.007812 -0.445312 +v 0.000000 -0.250000 -0.484375 +v -0.203125 -0.007812 -0.445312 +v 0.000000 -0.500000 -0.250000 +v 0.250000 -0.500000 0.000000 +v 0.003906 -0.500000 0.246094 +v -0.246094 -0.500000 -0.003906 +v 0.484375 -0.250000 0.000000 +v 0.445312 -0.007812 -0.203125 +v 0.437500 0.203125 0.000000 +v 0.445312 -0.007812 0.203125 +v -0.480469 -0.250000 -0.003906 +v -0.434462 -0.014757 0.192274 +v -0.430556 0.196181 -0.006944 +v -0.445312 -0.007812 -0.203125 +v 0.218750 -0.250000 0.468750 +v 0.218750 0.218750 0.437500 +v -0.190972 0.190972 0.409722 +v -0.203125 -0.250000 0.453125 +v 0.218750 0.437500 0.218750 +v 0.218750 0.437500 -0.218750 +v -0.218750 0.437500 -0.218750 +v -0.190972 0.409722 0.190972 +v 0.218750 0.218750 -0.437500 +v 0.218750 -0.250000 -0.468750 +v -0.218750 -0.250000 -0.468750 +v -0.218750 0.218750 -0.437500 +v 0.250000 -0.500000 -0.250000 +v 0.250000 -0.500000 0.250000 +v -0.234375 -0.500000 0.234375 +v -0.250000 -0.500000 -0.250000 +v 0.468750 -0.250000 -0.218750 +v 0.437500 0.218750 -0.218750 +v 0.437500 0.218750 0.218750 +v 0.468750 -0.250000 0.218750 +v -0.453125 -0.250000 0.203125 +v -0.409722 0.190972 0.190972 +v -0.437500 0.218750 -0.218750 +v -0.468750 -0.250000 -0.218750 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.500000 0.125000 +vt 0.500000 0.375000 +vt 0.500000 0.625000 +vt 0.500000 0.875000 +vt 0.750000 0.125000 +vt 0.250000 0.125000 +vt 0.500000 0.000000 +vt 0.625000 0.125000 +vt 0.500000 0.250000 +vt 0.375000 0.125000 +vt 0.625000 0.375000 +vt 0.500000 0.500000 +vt 0.375000 0.375000 +vt 0.625000 0.625000 +vt 0.500000 0.750000 +vt 0.375000 0.625000 +vt 0.625000 0.875000 +vt 0.500000 1.000000 +vt 0.375000 0.875000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.250000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.125000 0.125000 +vt 0.562500 0.062500 +vt 0.562500 0.187500 +vt 0.437500 0.187500 +vt 0.437500 0.062500 +vt 0.562500 0.312500 +vt 0.562500 0.437500 +vt 0.437500 0.437500 +vt 0.437500 0.312500 +vt 0.562500 0.562500 +vt 0.562500 0.687500 +vt 0.437500 0.687500 +vt 0.437500 0.562500 +vt 0.562500 0.812500 +vt 0.562500 0.937500 +vt 0.437500 0.937500 +vt 0.437500 0.812500 +vt 0.812500 0.062500 +vt 0.812500 0.187500 +vt 0.687500 0.187500 +vt 0.687500 0.062500 +vt 0.312500 0.062500 +vt 0.312500 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.062500 +vt 0.562500 0.000000 +vt 0.625000 0.062500 +vt 0.562500 0.125000 +vt 0.500000 0.062500 +vt 0.625000 0.187500 +vt 0.562500 0.250000 +vt 0.500000 0.187500 +vt 0.437500 0.250000 +vt 0.375000 0.187500 +vt 0.437500 0.125000 +vt 0.375000 0.062500 +vt 0.437500 0.000000 +vt 0.625000 0.312500 +vt 0.562500 0.375000 +vt 0.500000 0.312500 +vt 0.625000 0.437500 +vt 0.562500 0.500000 +vt 0.500000 0.437500 +vt 0.437500 0.500000 +vt 0.375000 0.437500 +vt 0.437500 0.375000 +vt 0.375000 0.312500 +vt 0.625000 0.562500 +vt 0.562500 0.625000 +vt 0.500000 0.562500 +vt 0.625000 0.687500 +vt 0.562500 0.750000 +vt 0.500000 0.687500 +vt 0.437500 0.750000 +vt 0.375000 0.687500 +vt 0.437500 0.625000 +vt 0.375000 0.562500 +vt 0.625000 0.812500 +vt 0.562500 0.875000 +vt 0.500000 0.812500 +vt 0.625000 0.937500 +vt 0.562500 1.000000 +vt 0.500000 0.937500 +vt 0.437500 1.000000 +vt 0.375000 0.937500 +vt 0.437500 0.875000 +vt 0.375000 0.812500 +vt 0.812500 0.000000 +vt 0.875000 0.062500 +vt 0.812500 0.125000 +vt 0.750000 0.062500 +vt 0.875000 0.187500 +vt 0.812500 0.250000 +vt 0.750000 0.187500 +vt 0.687500 0.250000 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.125000 +vt 0.250000 0.062500 +vt 0.312500 0.250000 +vt 0.250000 0.187500 +vt 0.187500 0.250000 +vt 0.125000 0.187500 +vt 0.187500 0.125000 +vt 0.125000 0.062500 +vt 0.187500 0.000000 +vn 0.145052 -0.627707 0.764816 +vn 0.610180 -0.505332 0.610180 +vn 0.695881 0.177483 0.695881 +vn 0.201359 0.124165 0.971616 +vn 0.706351 0.046237 0.706351 +vn 0.213889 0.071020 0.974273 +vn -0.040877 0.097540 0.994392 +vn -0.043180 0.078092 0.996011 +vn -0.037572 -0.688585 0.724181 +vn 0.704400 0.087419 0.704400 +vn 0.577350 0.577350 0.577350 +vn 0.043494 0.706438 0.706438 +vn 0.132056 0.167064 0.977063 +vn -0.116575 0.702286 0.702286 +vn -0.074572 0.243471 0.967037 +vn -0.212204 0.691003 0.691003 +vn -0.577350 0.577350 0.577350 +vn -0.692623 0.201361 0.692623 +vn -0.249784 0.240199 0.938036 +vn -0.703960 0.094241 0.703960 +vn -0.285690 0.099725 0.953119 +vn -0.703109 0.106187 0.703109 +vn -0.608431 -0.509533 0.608431 +vn -0.212051 -0.631352 0.745942 +vn -0.280767 0.084262 0.956070 +vn 0.705071 0.705071 0.075825 +vn 0.125406 0.980265 0.152822 +vn 0.707107 0.707107 0.000000 +vn 0.184506 0.982821 0.004616 +vn -0.026147 0.999316 0.026147 +vn -0.072186 0.970924 0.228246 +vn 0.706932 0.706932 0.022244 +vn 0.577350 0.577350 -0.577350 +vn -0.022244 0.706932 -0.706932 +vn 0.103834 0.989160 -0.103834 +vn 0.000000 0.707107 -0.707107 +vn -0.004616 0.982821 -0.184506 +vn 0.123758 0.701671 -0.701671 +vn -0.577350 0.577350 -0.577350 +vn -0.698664 0.698664 0.154070 +vn -0.074458 0.995968 -0.050049 +vn -0.702286 0.702286 0.116575 +vn -0.228246 0.970924 0.072186 +vn -0.691003 0.691003 0.212203 +vn -0.237608 0.941852 0.237608 +vn 0.707074 -0.009615 -0.707074 +vn 0.112462 0.120072 -0.986375 +vn 0.706351 0.046237 -0.706351 +vn 0.221788 0.068797 -0.972665 +vn 0.000000 0.085245 -0.996360 +vn 0.000000 0.208898 -0.977938 +vn 0.689307 0.222963 -0.689307 +vn 0.617974 -0.486021 -0.617974 +vn 0.115627 -0.652801 -0.748653 +vn 0.188354 0.143027 -0.971631 +vn 0.000000 -0.696566 -0.717493 +vn -0.000000 0.093700 -0.995601 +vn -0.082002 -0.670691 -0.737190 +vn -0.623237 -0.472388 -0.623237 +vn -0.681260 0.267897 -0.681260 +vn -0.167224 0.158538 -0.973089 +vn -0.706351 0.046237 -0.706351 +vn -0.221788 0.068797 -0.972665 +vn -0.702800 -0.110204 -0.702800 +vn -0.077278 0.084491 -0.993423 +vn 0.748653 -0.652801 -0.115627 +vn 0.000000 -1.000000 0.000000 +vn 0.717493 -0.696566 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.759058 -0.633037 0.151974 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.745942 -0.631352 0.212051 +vn 0.000000 -1.000000 0.000000 +vn -0.724181 -0.688585 0.037572 +vn 0.000000 -1.000000 0.000000 +vn -0.741688 -0.666599 -0.074467 +vn 0.000000 -1.000000 0.000000 +vn 0.971631 0.143027 -0.188354 +vn 0.972665 0.068797 -0.221788 +vn 0.996360 0.085245 0.000000 +vn 0.995601 0.093700 0.000000 +vn 0.986375 0.120072 -0.112462 +vn 0.977938 0.208898 0.000000 +vn 0.975563 0.159328 0.151298 +vn 0.972665 0.068797 0.221788 +vn 0.969418 0.126880 0.210074 +vn -0.956070 0.084262 0.280766 +vn -0.953119 0.099725 0.285690 +vn -0.994392 0.097540 0.040877 +vn -0.996011 0.078092 0.043180 +vn -0.938036 0.240199 0.249784 +vn -0.967037 0.243471 0.074572 +vn -0.994327 0.089221 -0.057909 +vn -0.974273 0.071020 -0.213889 +vn -0.974965 0.156327 -0.158130 +s 1 +g pCube1 +f 28/64/1 2/2/2 37/65/3 75/40/4 +f 37/65/3 14/22/5 52/66/6 75/40/4 +f 52/66/6 21/15/7 51/67/8 75/40/4 +f 51/67/8 9/21/9 28/64/1 75/40/4 +f 38/68/10 4/4/11 30/69/12 76/41/13 +f 30/69/12 10/23/14 53/70/15 76/41/13 +f 53/70/15 21/15/7 52/66/6 76/41/13 +f 52/66/6 14/22/5 38/68/10 76/41/13 +f 29/71/16 3/3/17 36/72/18 77/42/19 +f 36/72/18 13/24/20 54/73/21 77/42/19 +f 54/73/21 21/15/7 53/70/15 77/42/19 +f 53/70/15 10/23/14 29/71/16 77/42/19 +f 35/74/22 1/1/23 27/75/24 78/43/25 +f 27/75/24 9/21/9 51/67/8 78/43/25 +f 51/67/8 21/15/7 54/73/21 78/43/25 +f 54/73/21 13/24/20 35/74/22 78/43/25 +f 30/69/12 4/4/11 41/76/26 79/44/27 +f 41/76/26 16/25/28 56/77/29 79/44/27 +f 56/77/29 22/16/30 55/78/31 79/44/27 +f 55/78/31 10/23/14 30/69/12 79/44/27 +f 42/79/32 6/6/33 32/80/34 80/45/35 +f 32/80/34 11/26/36 57/81/37 80/45/35 +f 57/81/37 22/16/30 56/77/29 80/45/35 +f 56/77/29 16/25/28 42/79/32 80/45/35 +f 31/82/38 5/5/39 40/83/40 81/46/41 +f 40/83/40 15/27/42 58/84/43 81/46/41 +f 58/84/43 22/16/30 57/81/37 81/46/41 +f 57/81/37 11/26/36 31/82/38 81/46/41 +f 39/85/44 3/3/17 29/71/16 82/47/45 +f 29/71/16 10/23/14 55/78/31 82/47/45 +f 55/78/31 22/16/30 58/84/43 82/47/45 +f 58/84/43 15/27/42 39/85/44 82/47/45 +f 32/80/34 6/6/33 45/86/46 83/48/47 +f 45/86/46 18/28/48 60/87/49 83/48/47 +f 60/87/49 23/17/50 59/88/51 83/48/47 +f 59/88/51 11/26/36 32/80/34 83/48/47 +f 46/89/52 8/8/53 34/90/54 84/49/55 +f 34/90/54 12/29/56 61/91/57 84/49/55 +f 61/91/57 23/17/50 60/87/49 84/49/55 +f 60/87/49 18/28/48 46/89/52 84/49/55 +f 33/92/58 7/7/59 44/93/60 85/50/61 +f 44/93/60 17/30/62 62/94/63 85/50/61 +f 62/94/63 23/17/50 61/91/57 85/50/61 +f 61/91/57 12/29/56 33/92/58 85/50/61 +f 43/95/64 5/5/39 31/82/38 86/51/65 +f 31/82/38 11/26/36 59/88/51 86/51/65 +f 59/88/51 23/17/50 62/94/63 86/51/65 +f 62/94/63 17/30/62 43/95/64 86/51/65 +f 34/90/54 8/8/53 49/96/66 87/52/67 +f 49/96/66 20/31/68 64/97/69 87/52/67 +f 64/97/69 24/18/70 63/98/71 87/52/67 +f 63/98/71 12/29/56 34/90/54 87/52/67 +f 50/99/72 2/10/2 28/100/1 88/53/73 +f 28/100/1 9/32/9 65/101/74 88/53/73 +f 65/101/74 24/18/70 64/97/69 88/53/73 +f 64/97/69 20/31/68 50/99/72 88/53/73 +f 27/102/24 1/9/23 48/103/75 89/54/76 +f 48/103/75 19/33/77 66/104/78 89/54/76 +f 66/104/78 24/18/70 65/101/74 89/54/76 +f 65/101/74 9/32/9 27/102/24 89/54/76 +f 47/105/79 7/7/59 33/92/58 90/55/80 +f 33/92/58 12/29/56 63/98/71 90/55/80 +f 63/98/71 24/18/70 66/104/78 90/55/80 +f 66/104/78 19/33/77 47/105/79 90/55/80 +f 49/106/66 8/11/53 46/107/52 91/56/81 +f 46/107/52 18/35/48 68/108/82 91/56/81 +f 68/108/82 25/19/83 67/109/84 91/56/81 +f 67/109/84 20/34/68 49/106/66 91/56/81 +f 45/110/46 6/12/33 42/111/32 92/57/85 +f 42/111/32 16/36/28 69/112/86 92/57/85 +f 69/112/86 25/19/83 68/108/82 92/57/85 +f 68/108/82 18/35/48 45/110/46 92/57/85 +f 41/113/26 4/4/11 38/68/10 93/58/87 +f 38/68/10 14/22/5 70/114/88 93/58/87 +f 70/114/88 25/19/83 69/112/86 93/58/87 +f 69/112/86 16/36/28 41/113/26 93/58/87 +f 37/65/3 2/2/2 50/115/72 94/59/89 +f 50/115/72 20/34/68 67/109/84 94/59/89 +f 67/109/84 25/19/83 70/114/88 94/59/89 +f 70/114/88 14/22/5 37/65/3 94/59/89 +f 48/116/75 1/1/23 35/74/22 95/60/90 +f 35/74/22 13/24/20 72/117/91 95/60/90 +f 72/117/91 26/20/92 71/118/93 95/60/90 +f 71/118/93 19/37/77 48/116/75 95/60/90 +f 36/72/18 3/3/17 39/119/44 96/61/94 +f 39/119/44 15/38/42 73/120/95 96/61/94 +f 73/120/95 26/20/92 72/117/91 96/61/94 +f 72/117/91 13/24/20 36/72/18 96/61/94 +f 40/121/40 5/14/39 43/122/64 97/62/96 +f 43/122/64 17/39/62 74/123/97 97/62/96 +f 74/123/97 26/20/92 73/120/95 97/62/96 +f 73/120/95 15/38/42 40/121/40 97/62/96 +f 44/124/60 7/13/59 47/125/79 98/63/98 +f 47/125/79 19/37/77 71/118/93 98/63/98 +f 71/118/93 26/20/92 74/123/97 98/63/98 +f 74/123/97 17/39/62 44/124/60 98/63/98 diff --git a/modules/ufbx/data/maya_vertex_crease_6100_ascii.fbx b/modules/ufbx/data/maya_vertex_crease_6100_ascii.fbx new file mode 100644 index 0000000..1d68508 --- /dev/null +++ b/modules/ufbx/data/maya_vertex_crease_6100_ascii.fbx @@ -0,0 +1,367 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 7 + Hour: 15 + Minute: 4 + Second: 58 + Millisecond: 260 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementEdgeCrease: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: 0.537000322341919,0,0,0.522999906539917,0,0,0,0,0,0,0.527000284194946,0.572000217437744 + } + LayerElementVertexCrease: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + VertexCrease: 0.05,0.1,0.05,0.1,0.199999904632568,0.149999904632568,0.199999904632568,0.149999904632568 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementVertexCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_vertex_crease_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\maya_vertex_crease_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "07/06/2022 12:04:58.259" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\maya_vertex_crease_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "07/06/2022 12:04:58.259" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/maya_vertex_crease_6100_binary.fbx b/modules/ufbx/data/maya_vertex_crease_6100_binary.fbx new file mode 100644 index 0000000..07b375d Binary files /dev/null and b/modules/ufbx/data/maya_vertex_crease_6100_binary.fbx differ diff --git a/modules/ufbx/data/maya_vertex_crease_7700_ascii.fbx b/modules/ufbx/data/maya_vertex_crease_7700_ascii.fbx new file mode 100644 index 0000000..55c2c1a --- /dev/null +++ b/modules/ufbx/data/maya_vertex_crease_7700_ascii.fbx @@ -0,0 +1,415 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 7 + Hour: 15 + Minute: 4 + Second: 18 + Millisecond: 927 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_vertex_crease_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_vertex_crease_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "07/06/2022 12:04:18.926" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_vertex_crease_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "07/06/2022 12:04:18.926" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2118486876288, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2118273345600, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *12 { + a: 0.537000322341919,0,0,0.522999906539917,0,0,0,0,0,0,0.527000284194946,0.572000217437744 + } + } + LayerElementVertexCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + VertexCrease: *8 { + a: 0.05,0.1,0.05,0.1,0.199999904632568,0.149999904632568,0.199999904632568,0.149999904632568 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementVertexCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2118225522608, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2118273977312, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2118456671552, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2118450532336, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2118225522608,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2118450532336,2118456671552 + + ;Geometry::, Model::pCube1 + C: "OO",2118273345600,2118225522608 + + ;Material::lambert1, Model::pCube1 + C: "OO",2118273977312,2118225522608 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_vertex_crease_7700_binary.fbx b/modules/ufbx/data/maya_vertex_crease_7700_binary.fbx new file mode 100644 index 0000000..d788c5e Binary files /dev/null and b/modules/ufbx/data/maya_vertex_crease_7700_binary.fbx differ diff --git a/modules/ufbx/data/maya_vertex_crease_single.obj b/modules/ufbx/data/maya_vertex_crease_single.obj new file mode 100644 index 0000000..07aea95 --- /dev/null +++ b/modules/ufbx/data/maya_vertex_crease_single.obj @@ -0,0 +1,121 @@ +# ufbx:bad_normals +# This file uses centimeters as units for non-parametric coordinates. + +g default +v -0.437500 -0.500000 0.437500 +v 0.500000 -0.500000 0.500000 +v -0.388889 0.388889 0.388889 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.000000 -0.500000 0.500000 +v 0.000000 0.375000 0.375000 +v 0.000000 0.375000 -0.375000 +v 0.000000 -0.500000 -0.500000 +v -0.375000 0.000000 0.375000 +v 0.375000 0.000000 0.375000 +v -0.375000 0.375000 0.000000 +v 0.375000 0.375000 0.000000 +v -0.375000 0.000000 -0.375000 +v 0.375000 0.000000 -0.375000 +v -0.500000 -0.500000 0.000000 +v 0.500000 -0.500000 0.000000 +v 0.000000 0.000000 0.500000 +v 0.000000 0.500000 0.000000 +v 0.000000 0.000000 -0.500000 +v 0.000000 -0.500000 0.000000 +v 0.500000 0.000000 0.000000 +v -0.500000 0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vt 0.500000 0.125000 +vt 0.500000 0.375000 +vt 0.500000 0.625000 +vt 0.500000 0.875000 +vt 0.750000 0.125000 +vt 0.250000 0.125000 +vt 0.500000 0.000000 +vt 0.625000 0.125000 +vt 0.500000 0.250000 +vt 0.375000 0.125000 +vt 0.625000 0.375000 +vt 0.500000 0.500000 +vt 0.375000 0.375000 +vt 0.625000 0.625000 +vt 0.500000 0.750000 +vt 0.375000 0.625000 +vt 0.625000 0.875000 +vt 0.500000 1.000000 +vt 0.375000 0.875000 +vt 0.750000 0.000000 +vt 0.875000 0.125000 +vt 0.750000 0.250000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.125000 0.125000 +vn -0.026800 -0.689703 0.723596 +vn 0.591090 -0.548839 0.591090 +vn 0.703526 0.100504 0.703526 +vn -0.047615 0.089972 0.994806 +vn 0.577350 0.577350 0.577350 +vn -0.079566 0.704865 0.704865 +vn -0.577350 0.577350 0.577350 +vn -0.701816 0.122101 0.701816 +vn -0.580850 -0.570287 0.580850 +vn 0.707107 0.707107 0.000000 +vn -0.029386 0.999136 0.029386 +vn 0.577350 0.577350 -0.577350 +vn 0.000000 0.707107 -0.707107 +vn -0.577350 0.577350 -0.577350 +vn -0.704865 0.704865 0.079566 +vn 0.703526 0.100504 -0.703526 +vn 0.000000 0.079008 -0.996874 +vn 0.591090 -0.548839 -0.591090 +vn 0.000000 -0.707107 -0.707107 +vn -0.591090 -0.548839 -0.591090 +vn -0.703526 0.100504 -0.703526 +vn 0.707107 -0.707107 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.723596 -0.689703 0.026800 +vn 0.996874 0.079008 0.000000 +vn -0.994806 0.089972 0.047615 +s 1 +g pCube1 +f 9/21/1 2/2/2 14/22/3 21/15/4 +f 14/22/3 4/4/5 10/23/6 21/15/4 +f 10/23/6 3/3/7 13/24/8 21/15/4 +f 13/24/8 1/1/9 9/21/1 21/15/4 +f 10/23/6 4/4/5 16/25/10 22/16/11 +f 16/25/10 6/6/12 11/26/13 22/16/11 +f 11/26/13 5/5/14 15/27/15 22/16/11 +f 15/27/15 3/3/7 10/23/6 22/16/11 +f 11/26/13 6/6/12 18/28/16 23/17/17 +f 18/28/16 8/8/18 12/29/19 23/17/17 +f 12/29/19 7/7/20 17/30/21 23/17/17 +f 17/30/21 5/5/14 11/26/13 23/17/17 +f 12/29/19 8/8/18 20/31/22 24/18/23 +f 20/31/22 2/10/2 9/32/1 24/18/23 +f 9/32/1 1/9/9 19/33/24 24/18/23 +f 19/33/24 7/7/20 12/29/19 24/18/23 +f 20/34/22 8/11/18 18/35/16 25/19/25 +f 18/35/16 6/12/12 16/36/10 25/19/25 +f 16/36/10 4/4/5 14/22/3 25/19/25 +f 14/22/3 2/2/2 20/34/22 25/19/25 +f 19/37/24 1/1/9 13/24/8 26/20/26 +f 13/24/8 3/3/7 15/38/15 26/20/26 +f 15/38/15 5/14/14 17/39/21 26/20/26 +f 17/39/21 7/13/20 19/37/24 26/20/26 diff --git a/modules/ufbx/data/maya_vertex_crease_single_7700_ascii.fbx b/modules/ufbx/data/maya_vertex_crease_single_7700_ascii.fbx new file mode 100644 index 0000000..53d6251 --- /dev/null +++ b/modules/ufbx/data/maya_vertex_crease_single_7700_ascii.fbx @@ -0,0 +1,415 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 7 + Hour: 15 + Minute: 32 + Second: 13 + Millisecond: 223 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_vertex_crease_single_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_vertex_crease_single_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "07/06/2022 12:32:13.222" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_vertex_crease_single_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "07/06/2022 12:32:13.222" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2118549662336, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2118273350592, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 1 + RenderDivisionLevels: 1 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *12 { + a: 0.537000322341919,0,0,0.522999906539917,0,0,0,0,0,0,0.527000284194946,0.572000217437744 + } + } + LayerElementVertexCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + VertexCrease: *8 { + a: 0.05,0.1,0.05,0.1,0.199999904632568,0.149999904632568,0.199999904632568,0.149999904632568 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementVertexCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2118225545808, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2118274015712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2118551778144, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2118551533008, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2118225545808,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2118551533008,2118551778144 + + ;Geometry::, Model::pCube1 + C: "OO",2118273350592,2118225545808 + + ;Material::lambert1, Model::pCube1 + C: "OO",2118274015712,2118225545808 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/maya_zero_end_7400_binary.fbx b/modules/ufbx/data/maya_zero_end_7400_binary.fbx new file mode 100644 index 0000000..f643ed3 Binary files /dev/null and b/modules/ufbx/data/maya_zero_end_7400_binary.fbx differ diff --git a/modules/ufbx/data/maya_zero_end_7500_binary.fbx b/modules/ufbx/data/maya_zero_end_7500_binary.fbx new file mode 100644 index 0000000..56bcd86 Binary files /dev/null and b/modules/ufbx/data/maya_zero_end_7500_binary.fbx differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0000.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0000.mtl new file mode 100644 index 0000000..636fc62 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0000.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0001.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0001.mtl new file mode 100644 index 0000000..0265ae8 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0001.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0002.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0002.mtl new file mode 100644 index 0000000..eccd658 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0002.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0003.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0003.mtl new file mode 100644 index 0000000..d91792e Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0003.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0004.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0004.mtl new file mode 100644 index 0000000..13e9724 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0004.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0005.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0005.mtl new file mode 100644 index 0000000..6c730fb Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0005.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0006.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0006.mtl new file mode 100644 index 0000000..6481cd5 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0006.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0007.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0007.mtl new file mode 100644 index 0000000..311c5f8 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0007.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0008.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0008.mtl new file mode 100644 index 0000000..2458ff6 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0008.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0009.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0009.mtl new file mode 100644 index 0000000..6816ffd Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0009.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0010.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0010.mtl new file mode 100644 index 0000000..89905d9 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0010.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0011.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0011.mtl new file mode 100644 index 0000000..50aeb8d Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0011.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0012.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0012.mtl new file mode 100644 index 0000000..ae55fae Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0012.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0013.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0013.mtl new file mode 100644 index 0000000..45b517c Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0013.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0014.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0014.mtl new file mode 100644 index 0000000..821c9ef Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0014.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0015.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0015.mtl new file mode 100644 index 0000000..c6e2df9 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0015.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0016.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0016.mtl new file mode 100644 index 0000000..3db8008 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0016.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0017.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0017.mtl new file mode 100644 index 0000000..2a3e95c Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0017.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0018.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0018.mtl new file mode 100644 index 0000000..4717cf4 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0018.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0019.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0019.mtl new file mode 100644 index 0000000..24564e5 --- /dev/null +++ b/modules/ufbx/data/mtl_fuzz/fuzz_0019.mtl @@ -0,0 +1,22 @@ +£ Blender MTL File: 'None' +# Material Count: 2 + +newmtl Red +Ns 96.078421 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.000000 0.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 0.000000 +illum 9 + +newmtl White +Ns 96.078421 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 0.000000 +illum 9 diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0020.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0020.mtl new file mode 100644 index 0000000..4ba6ba5 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0020.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0021.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0021.mtl new file mode 100644 index 0000000..244c9f7 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0021.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0022.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0022.mtl new file mode 100644 index 0000000..294f4f1 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0022.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0023.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0023.mtl new file mode 100644 index 0000000..715d08e Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0023.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0024.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0024.mtl new file mode 100644 index 0000000..a25c726 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0024.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0025.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0025.mtl new file mode 100644 index 0000000..90dc36b Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0025.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0026.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0026.mtl new file mode 100644 index 0000000..1b41138 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0026.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0027.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0027.mtl new file mode 100644 index 0000000..9ec2096 --- /dev/null +++ b/modules/ufbx/data/mtl_fuzz/fuzz_0027.mtl @@ -0,0 +1,22 @@ + +# Stanterial+propertiesd 0 1 0 +Ks 0 0 1 +Ke 1 0 1 +Ns 99 +d extension"í +newmtl PBR +Pr 0.1 +Pm0.2 +Ps 0.30.4 0.5 +Pc 0.6 +Pcr 0.7 +Tf 0.8 0931.0î d 0.75 +Ni 1.33 + +# Widen to RGB values +newm800000'l Gide +Ka 0.1 Kd 0.2 +Ks 0.3 +Ke 0.4 +Ps 0.5 +File::f 0.6 diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0028.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0028.mtl new file mode 100644 index 0000000..66f473c Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0028.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0029.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0029.mtl new file mode 100644 index 0000000..93df0c0 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0029.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0030.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0030.mtl new file mode 100644 index 0000000..ee5ab29 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0030.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0031.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0031.mtl new file mode 100644 index 0000000..a01a3e3 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0031.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0032.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0032.mtl new file mode 100644 index 0000000..ea0548d Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0032.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0033.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0033.mtl new file mode 100644 index 0000000..94b5b1e Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0033.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0034.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0034.mtl new file mode 100644 index 0000000..2a1bda1 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0034.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0035.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0035.mtl new file mode 100644 index 0000000..0f4564b Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0035.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0036.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0036.mtl new file mode 100644 index 0000000..d29cb62 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0036.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0037.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0037.mtl new file mode 100644 index 0000000..64e096a Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0037.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0038.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0038.mtl new file mode 100644 index 0000000..1223aba Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0038.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0039.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0039.mtl new file mode 100644 index 0000000..7342c5e Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0039.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0040.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0040.mtl new file mode 100644 index 0000000..2f7b9f9 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0040.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0041.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0041.mtl new file mode 100644 index 0000000..d163a3d Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0041.mtl differ diff --git a/modules/ufbx/data/mtl_fuzz/fuzz_0042.mtl b/modules/ufbx/data/mtl_fuzz/fuzz_0042.mtl new file mode 100644 index 0000000..3f9c316 Binary files /dev/null and b/modules/ufbx/data/mtl_fuzz/fuzz_0042.mtl differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0000.obj b/modules/ufbx/data/obj_fuzz/fuzz_0000.obj new file mode 100644 index 0000000..c54799e --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0000.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.:99999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0001.obj b/modules/ufbx/data/obj_fuzz/fuzz_0001.obj new file mode 100644 index 0000000..e32dfed --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0001.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.:99999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0002.obj b/modules/ufbx/data/obj_fuzz/fuzz_0002.obj new file mode 100644 index 0000000..c352cd4 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0002.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.:ù9999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0003.obj b/modules/ufbx/data/obj_fuzz/fuzz_0003.obj new file mode 100644 index 0000000..f2da99b --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0003.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.: 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0004.obj b/modules/ufbx/data/obj_fuzz/fuzz_0004.obj new file mode 100644 index 0000000..a01c9e4 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0004.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.:000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0005.obj b/modules/ufbx/data/obj_fuzz/fuzz_0005.obj new file mode 100644 index 0000000..1932806 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0005.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.:000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0006.obj b/modules/ufbx/data/obj_fuzz/fuzz_0006.obj new file mode 100644 index 0000000..e132afe Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0006.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0007.obj b/modules/ufbx/data/obj_fuzz/fuzz_0007.obj new file mode 100644 index 0000000..81883e1 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0007.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0008.obj b/modules/ufbx/data/obj_fuzz/fuzz_0008.obj new file mode 100644 index 0000000..b4651db Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0008.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0009.obj b/modules/ufbx/data/obj_fuzz/fuzz_0009.obj new file mode 100644 index 0000000..f87c485 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0009.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0010.obj b/modules/ufbx/data/obj_fuzz/fuzz_0010.obj new file mode 100644 index 0000000..1f1a25d Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0010.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0011.obj b/modules/ufbx/data/obj_fuzz/fuzz_0011.obj new file mode 100644 index 0000000..4432ab1 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0011.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0012.obj b/modules/ufbx/data/obj_fuzz/fuzz_0012.obj new file mode 100644 index 0000000..625c0bb Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0012.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0013.obj b/modules/ufbx/data/obj_fuzz/fuzz_0013.obj new file mode 100644 index 0000000..df6ae8b Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0013.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0014.obj b/modules/ufbx/data/obj_fuzz/fuzz_0014.obj new file mode 100644 index 0000000..5376138 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0014.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0015.obj b/modules/ufbx/data/obj_fuzz/fuzz_0015.obj new file mode 100644 index 0000000..5283afc Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0015.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0016.obj b/modules/ufbx/data/obj_fuzz/fuzz_0016.obj new file mode 100644 index 0000000..326b5d5 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0016.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0017.obj b/modules/ufbx/data/obj_fuzz/fuzz_0017.obj new file mode 100644 index 0000000..6433eb1 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0017.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0018.obj b/modules/ufbx/data/obj_fuzz/fuzz_0018.obj new file mode 100644 index 0000000..d54e635 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0018.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0019.obj b/modules/ufbx/data/obj_fuzz/fuzz_0019.obj new file mode 100644 index 0000000..479451d Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0019.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0020.obj b/modules/ufbx/data/obj_fuzz/fuzz_0020.obj new file mode 100644 index 0000000..4f0e3d9 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0020.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0021.obj b/modules/ufbx/data/obj_fuzz/fuzz_0021.obj new file mode 100644 index 0000000..eacd7b5 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0021.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0022.obj b/modules/ufbx/data/obj_fuzz/fuzz_0022.obj new file mode 100644 index 0000000..346f4d2 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0022.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0023.obj b/modules/ufbx/data/obj_fuzz/fuzz_0023.obj new file mode 100644 index 0000000..88805ad Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0023.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0024.obj b/modules/ufbx/data/obj_fuzz/fuzz_0024.obj new file mode 100644 index 0000000..8055dbf Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0024.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0025.obj b/modules/ufbx/data/obj_fuzz/fuzz_0025.obj new file mode 100644 index 0000000..37a837f --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0025.obj @@ -0,0 +1,21 @@ +# Blende‰ v2.79 (subOBJ File: '' +# www.blender,org +g Cu0 +s off +f 9//1 2//1 3//0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.: +v -10 -10 10 0.0 0.0 1.: v -10 11 0 0 1 +v -10 10 10 ÿÿÿ1 +v -10 10 -10 0 0 0 +vn 0.0000.0000 +vn 0.%000 1.0000 0.0000 +vn 1.0000 0.0!00 0.0000 +vn -0.0000 -00)00 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.00J0 +s of9//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0026.obj b/modules/ufbx/data/obj_fuzz/fuzz_0026.obj new file mode 100644 index 0000000..771be18 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0026.obj @@ -0,0 +1,22 @@ +# Blende.79 (subOBJ File: '' +# www.blender.org +g Cube êv 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.:99999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0027.obj b/modules/ufbx/data/obj_fuzz/fuzz_0027.obj new file mode 100644 index 0000000..44c330c --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0027.obj @@ -0,0 +1,22 @@ +# Blende(subOBJ File: '' +# www.blender.org +g ube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +g 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0028.obj b/modules/ufbx/data/obj_fuzz/fuzz_0028.obj new file mode 100644 index 0000000..bcda301 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0028.obj @@ -0,0 +1,22 @@ +# Blende(subOBJ File: '' +# www.blender.org +g ube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +o 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0029.obj b/modules/ufbx/data/obj_fuzz/fuzz_0029.obj new file mode 100644 index 0000000..2dae85a Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0029.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0030.obj b/modules/ufbx/data/obj_fuzz/fuzz_0030.obj new file mode 100644 index 0000000..3f9096e Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0030.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0031.obj b/modules/ufbx/data/obj_fuzz/fuzz_0031.obj new file mode 100644 index 0000000..9a1270a Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0031.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0032.obj b/modules/ufbx/data/obj_fuzz/fuzz_0032.obj new file mode 100644 index 0000000..17d9439 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0032.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0033.obj b/modules/ufbx/data/obj_fuzz/fuzz_0033.obj new file mode 100644 index 0000000..97df2c6 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0033.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0034.obj b/modules/ufbx/data/obj_fuzz/fuzz_0034.obj new file mode 100644 index 0000000..327dc97 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0034.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0035.obj b/modules/ufbx/data/obj_fuzz/fuzz_0035.obj new file mode 100644 index 0000000..f40bce8 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0035.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0036.obj b/modules/ufbx/data/obj_fuzz/fuzz_0036.obj new file mode 100644 index 0000000..f9724e8 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0036.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0037.obj b/modules/ufbx/data/obj_fuzz/fuzz_0037.obj new file mode 100644 index 0000000..51e81d9 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0037.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0038.obj b/modules/ufbx/data/obj_fuzz/fuzz_0038.obj new file mode 100644 index 0000000..1645f49 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0038.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0039.obj b/modules/ufbx/data/obj_fuzz/fuzz_0039.obj new file mode 100644 index 0000000..43d5ec3 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0039.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0040.obj b/modules/ufbx/data/obj_fuzz/fuzz_0040.obj new file mode 100644 index 0000000..2470334 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0040.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0041.obj b/modules/ufbx/data/obj_fuzz/fuzz_0041.obj new file mode 100644 index 0000000..81f81ae Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0041.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0042.obj b/modules/ufbx/data/obj_fuzz/fuzz_0042.obj new file mode 100644 index 0000000..4de2338 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0042.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0043.obj b/modules/ufbx/data/obj_fuzz/fuzz_0043.obj new file mode 100644 index 0000000..6cbd2a0 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0043.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0044.obj b/modules/ufbx/data/obj_fuzz/fuzz_0044.obj new file mode 100644 index 0000000..42273ec Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0044.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0045.obj b/modules/ufbx/data/obj_fuzz/fuzz_0045.obj new file mode 100644 index 0000000..7bcff60 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0045.obj @@ -0,0 +1,23 @@ +# 7//4 3//4 +f (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000000 0.0000 0.0000 +vn -0.0000 -0.1000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +g 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0046.obj b/modules/ufbx/data/obj_fuzz/fuzz_0046.obj new file mode 100644 index 0000000..a80d1b8 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0046.obj @@ -0,0 +1,23 @@ +# 7//4 3//4 +f (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000000 0.0000 0.0000 +vn -0.0000 -0.1000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +o 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0047.obj b/modules/ufbx/data/obj_fuzz/fuzz_0047.obj new file mode 100644 index 0000000..f5ce525 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0047.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0048.obj b/modules/ufbx/data/obj_fuzz/fuzz_0048.obj new file mode 100644 index 0000000..c34316c Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0048.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0049.obj b/modules/ufbx/data/obj_fuzz/fuzz_0049.obj new file mode 100644 index 0000000..cd8b840 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0049.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0050.obj b/modules/ufbx/data/obj_fuzz/fuzz_0050.obj new file mode 100644 index 0000000..40c09f7 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0050.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0051.obj b/modules/ufbx/data/obj_fuzz/fuzz_0051.obj new file mode 100644 index 0000000..f97040e Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0051.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0052.obj b/modules/ufbx/data/obj_fuzz/fuzz_0052.obj new file mode 100644 index 0000000..0b3b018 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0052.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0053.obj b/modules/ufbx/data/obj_fuzz/fuzz_0053.obj new file mode 100644 index 0000000..def3d0c Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0053.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0054.obj b/modules/ufbx/data/obj_fuzz/fuzz_0054.obj new file mode 100644 index 0000000..6250f4f Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0054.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0055.obj b/modules/ufbx/data/obj_fuzz/fuzz_0055.obj new file mode 100644 index 0000000..8a1b83c Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0055.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0056.obj b/modules/ufbx/data/obj_fuzz/fuzz_0056.obj new file mode 100644 index 0000000..c52a0bd --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0056.obj @@ -0,0 +1,22 @@ +# Blende(subOBJ File: '' +# www.blender.org +g ߊbe +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +g 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0057.obj b/modules/ufbx/data/obj_fuzz/fuzz_0057.obj new file mode 100644 index 0000000..03a28ca --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0057.obj @@ -0,0 +1,24 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +o +10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.:99999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0058.obj b/modules/ufbx/data/obj_fuzz/fuzz_0058.obj new file mode 100644 index 0000000..e6ac760 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0058.obj @@ -0,0 +1,24 @@ +# Blender v8.79 (subOBJ File: '' +# www.blender.org +f Cube +o 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0 00 +vn -0.0000 -0.0000 1.00000000 -0.00MRGB00 +vn 0.0000 0.0000 -1.0000 +s off +f 1//er.org +g Cube +o 10 -10 -10 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0059.obj b/modules/ufbx/data/obj_fuzz/fuzz_0059.obj new file mode 100644 index 0000000..4fa8b24 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0059.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0060.obj b/modules/ufbx/data/obj_fuzz/fuzz_0060.obj new file mode 100644 index 0000000..b1a2b3a Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0060.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0061.obj b/modules/ufbx/data/obj_fuzz/fuzz_0061.obj new file mode 100644 index 0000000..6c3ad4a Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0061.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0062.obj b/modules/ufbx/data/obj_fuzz/fuzz_0062.obj new file mode 100644 index 0000000..40621e8 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0062.obj @@ -0,0 +1 @@ +f Z  \ No newline at end of file diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0063.obj b/modules/ufbx/data/obj_fuzz/fuzz_0063.obj new file mode 100644 index 0000000..ae0cdf9 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0063.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0064.obj b/modules/ufbx/data/obj_fuzz/fuzz_0064.obj new file mode 100644 index 0000000..51ed9a2 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0064.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0065.obj b/modules/ufbx/data/obj_fuzz/fuzz_0065.obj new file mode 100644 index 0000000..bbed0b9 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0065.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0066.obj b/modules/ufbx/data/obj_fuzz/fuzz_0066.obj new file mode 100644 index 0000000..ad361ae Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0066.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0067.obj b/modules/ufbx/data/obj_fuzz/fuzz_0067.obj new file mode 100644 index 0000000..0bb128e Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0067.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0068.obj b/modules/ufbx/data/obj_fuzz/fuzz_0068.obj new file mode 100644 index 0000000..b9f5dea Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0068.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0069.obj b/modules/ufbx/data/obj_fuzz/fuzz_0069.obj new file mode 100644 index 0000000..8dfa6f9 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0069.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0070.obj b/modules/ufbx/data/obj_fuzz/fuzz_0070.obj new file mode 100644 index 0000000..785ba83 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0070.obj @@ -0,0 +1,26 @@ +# Blender v2.79 (subOBJ File: '' +# www.org +g Cube +o 10 -10 -10 1.0//3 2//3 +g 2//4 6//4 7 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +ön 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.E000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +g 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +g 2//4 6//4 7//4 3//4 +f 3//5 7der.org +g Cube +o 10 -10 -//5 8//5 .//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0071.obj b/modules/ufbx/data/obj_fuzz/fuzz_0071.obj new file mode 100644 index 0000000..e374237 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0071.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0072.obj b/modules/ufbx/data/obj_fuzz/fuzz_0072.obj new file mode 100644 index 0000000..73778ae Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0072.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0073.obj b/modules/ufbx/data/obj_fuzz/fuzz_0073.obj new file mode 100644 index 0000000..e674c07 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0073.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0074.obj b/modules/ufbx/data/obj_fuzz/fuzz_0074.obj new file mode 100644 index 0000000..c49336d Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0074.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0075.obj b/modules/ufbx/data/obj_fuzz/fuzz_0075.obj new file mode 100644 index 0000000..1d8bb69 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0075.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0076.obj b/modules/ufbx/data/obj_fuzz/fuzz_0076.obj new file mode 100644 index 0000000..86e76e7 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0076.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0077.obj b/modules/ufbx/data/obj_fuzz/fuzz_0077.obj new file mode 100644 index 0000000..dd55649 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0077.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0078.obj b/modules/ufbx/data/obj_fuzz/fuzz_0078.obj new file mode 100644 index 0000000..c38947f Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0078.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0079.obj b/modules/ufbx/data/obj_fuzz/fuzz_0079.obj new file mode 100644 index 0000000..4fa2bff Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0079.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0080.obj b/modules/ufbx/data/obj_fuzz/fuzz_0080.obj new file mode 100644 index 0000000..ac36f46 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0080.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0081.obj b/modules/ufbx/data/obj_fuzz/fuzz_0081.obj new file mode 100644 index 0000000..19eacfe Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0081.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0082.obj b/modules/ufbx/data/obj_fuzz/fuzz_0082.obj new file mode 100644 index 0000000..a4fb20f Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0082.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0083.obj b/modules/ufbx/data/obj_fuzz/fuzz_0083.obj new file mode 100644 index 0000000..7621e12 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0083.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0084.obj b/modules/ufbx/data/obj_fuzz/fuzz_0084.obj new file mode 100644 index 0000000..e6bbde4 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0084.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0085.obj b/modules/ufbx/data/obj_fuzz/fuzz_0085.obj new file mode 100644 index 0000000..e02c7ef Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0085.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0086.obj b/modules/ufbx/data/obj_fuzz/fuzz_0086.obj new file mode 100644 index 0000000..bc218a0 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0086.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0087.obj b/modules/ufbx/data/obj_fuzz/fuzz_0087.obj new file mode 100644 index 0000000..5a79650 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0087.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0088.obj b/modules/ufbx/data/obj_fuzz/fuzz_0088.obj new file mode 100644 index 0000000..f8d0cb8 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0088.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0089.obj b/modules/ufbx/data/obj_fuzz/fuzz_0089.obj new file mode 100644 index 0000000..498cac4 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0089.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0090.obj b/modules/ufbx/data/obj_fuzz/fuzz_0090.obj new file mode 100644 index 0000000..312c4ac Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0090.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0091.obj b/modules/ufbx/data/obj_fuzz/fuzz_0091.obj new file mode 100644 index 0000000..859acc7 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0091.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0092.obj b/modules/ufbx/data/obj_fuzz/fuzz_0092.obj new file mode 100644 index 0000000..5dfdff5 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0092.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 9//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0093.obj b/modules/ufbx/data/obj_fuzz/fuzz_0093.obj new file mode 100644 index 0000000..15fe484 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0093.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 9//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0094.obj b/modules/ufbx/data/obj_fuzz/fuzz_0094.obj new file mode 100644 index 0000000..7f42144 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0094.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 9//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0095.obj b/modules/ufbx/data/obj_fuzz/fuzz_0095.obj new file mode 100644 index 0000000..1b6a69a --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0095.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f -//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0096.obj b/modules/ufbx/data/obj_fuzz/fuzz_0096.obj new file mode 100644 index 0000000..77d9028 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0096.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 9//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0097.obj b/modules/ufbx/data/obj_fuzz/fuzz_0097.obj new file mode 100644 index 0000000..055e166 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0097.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1ÐÐÎß2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0098.obj b/modules/ufbx/data/obj_fuzz/fuzz_0098.obj new file mode 100644 index 0000000..df12351 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0098.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3ÐÐÎß4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0099.obj b/modules/ufbx/data/obj_fuzz/fuzz_0099.obj new file mode 100644 index 0000000..e237dbf Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0099.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0100.obj b/modules/ufbx/data/obj_fuzz/fuzz_0100.obj new file mode 100644 index 0000000..7259ff6 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0100.obj @@ -0,0 +1,22 @@ +# Blender v2.79 (subOBJ File: '' +# www.blen 10 10 1 1 1 +v -10 10 -10 0 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 14//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0101.obj b/modules/ufbx/data/obj_fuzz/fuzz_0101.obj new file mode 100644 index 0000000..2d8fe04 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0101.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0102.obj b/modules/ufbx/data/obj_fuzz/fuzz_0102.obj new file mode 100644 index 0000000..687e818 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0102.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0103.obj b/modules/ufbx/data/obj_fuzz/fuzz_0103.obj new file mode 100644 index 0000000..9c55e37 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0103.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7ÿÿ8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0104.obj b/modules/ufbx/data/obj_fuzz/fuzz_0104.obj new file mode 100644 index 0000000..137d23e Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0104.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0105.obj b/modules/ufbx/data/obj_fuzz/fuzz_0105.obj new file mode 100644 index 0000000..3f17678 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0105.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0106.obj b/modules/ufbx/data/obj_fuzz/fuzz_0106.obj new file mode 100644 index 0000000..10192bc Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0106.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0107.obj b/modules/ufbx/data/obj_fuzz/fuzz_0107.obj new file mode 100644 index 0000000..cc59829 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0107.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.051.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 9//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0108.obj b/modules/ufbx/data/obj_fuzz/fuzz_0108.obj new file mode 100644 index 0000000..c2f2440 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0108.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0109.obj b/modules/ufbx/data/obj_fuzz/fuzz_0109.obj new file mode 100644 index 0000000..83e1bb3 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0109.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0110.obj b/modules/ufbx/data/obj_fuzz/fuzz_0110.obj new file mode 100644 index 0000000..1848f02 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0110.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0111.obj b/modules/ufbx/data/obj_fuzz/fuzz_0111.obj new file mode 100644 index 0000000..702bfb2 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0111.obj @@ -0,0 +1,24 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00070000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +f 57//5 8//5 4//5 +f 5//6 1//6 4//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0112.obj b/modules/ufbx/data/obj_fuzz/fuzz_0112.obj new file mode 100644 index 0000000..cb20f0d --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0112.obj @@ -0,0 +1,22 @@ +# Blender v2.79 ûûûûûûûûûûûûûûûûûûûûûûûû(subOBJ File: '' +# ww.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s oÿÿÿf 1//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 9//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0113.obj b/modules/ufbx/data/obj_fuzz/fuzz_0113.obj new file mode 100644 index 0000000..af1dbb9 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0113.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0114.obj b/modules/ufbx/data/obj_fuzz/fuzz_0114.obj new file mode 100644 index 0000000..33f791b --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0114.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# sww.blender.org +g Cube +v 10 -10 -10 1. 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0001 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 -//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0115.obj b/modules/ufbx/data/obj_fuzz/fuzz_0115.obj new file mode 100644 index 0000000..b349ab8 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0115.obj @@ -0,0 +1,28 @@ +# ufbx:bad_uvs +# This file uses centimeters as u non-parametric coordinates. + +f default +v -10.000005 0.000000 10.000005 +v 10.000005 0.000000 10.000005 +v -10.000005 0.000000 -10.000005 +v 10.000005 0.000000 -10.000005 +v -10.000005 20.000010 10.000005 +v 10.000005 20.000010 10.000005 +v -10.000005 20.000010 -10.000005 +v 10.000005 20.000010 -10.000005 +vn -0.577350 -0.577350 0.577350 +vn -0.577350 -0.577350 -0.577350 +vn 0.577350 -0.577350 -0.577350 +vn 0.577350 -0.577350 0.577350 +vn -0.577350 0.577350 0.577350 +vn 0.577350 0.577350 0.577350 +vn 0.577350 0.577350 -0.577350 +vn -0.577350 0.577350 -0.577350 +s 1 +g Box01 +f 1//1 3//2 4//3 2//4 +f 5//5 6//6 8//7 7//8 +f 1//1 2//4 6//6 5//5 +f 2//4 4//3 8//7 6//6 +f 4//3 3//2 7//8 8//7 +f 3//2 1//1 5//5 7//8 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0116.obj b/modules/ufbx/data/obj_fuzz/fuzz_0116.obj new file mode 100644 index 0000000..2be05aa --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0116.obj @@ -0,0 +1,30 @@ +# ufbx:bad_vs +# This file uses centimeters as u non-pmetric coordinates. + +g default +v -10.000005 0.000000 10.000005 +v 10.000005 0.000000 10.000005 +v -10.000005 0.000000 -10.000005 +v 10.000005 0.000000 -10.000005 +v -10.000005 20.000010 10.000005 +v 10.000005 20.000010 10.000005 +v -10.000005 20.000010 -10.000005 +v 10.000005 20.000010 -10.000005 +vn -0.577350 -0.577350 0.577350 +vn -0.577350 -0.577350 -0.577350 +vn 0.577350 -0.577350 -0.577350 +vn 0.577350 -0.577350 0.577350 +vn -0.577350 0.577350 0.577350 +vn 0.577350 0.577350 0.577350 +vn 0.577350 0.577350 -0.577350 +vn -0.577350 0.577350 -0.577350 +s 1 +g Box01 +f 1 +s 1 +g Box01 +f 1//1 3//2 46//6 8//7 7//8 +f 1//1 2//4 6//6 5//5 +f 2//4 4//3 8//7 6//6 +f 4//3 3//2 7//8 8//7 +f 3//2 1//1 5//5 7//8 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0117.obj b/modules/ufbx/data/obj_fuzz/fuzz_0117.obj new file mode 100644 index 0000000..bd4e884 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0117.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0118.obj b/modules/ufbx/data/obj_fuzz/fuzz_0118.obj new file mode 100644 index 0000000..c0fa086 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0118.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0119.obj b/modules/ufbx/data/obj_fuzz/fuzz_0119.obj new file mode 100644 index 0000000..8c916af Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0119.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0120.obj b/modules/ufbx/data/obj_fuzz/fuzz_0120.obj new file mode 100644 index 0000000..5d95a6d Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0120.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0121.obj b/modules/ufbx/data/obj_fuzz/fuzz_0121.obj new file mode 100644 index 0000000..91b05b3 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0121.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0122.obj b/modules/ufbx/data/obj_fuzz/fuzz_0122.obj new file mode 100644 index 0000000..0202682 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0122.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0123.obj b/modules/ufbx/data/obj_fuzz/fuzz_0123.obj new file mode 100644 index 0000000..a313a25 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0123.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0124.obj b/modules/ufbx/data/obj_fuzz/fuzz_0124.obj new file mode 100644 index 0000000..8fdeb03 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0124.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0125.obj b/modules/ufbx/data/obj_fuzz/fuzz_0125.obj new file mode 100644 index 0000000..adf5ff5 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0125.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +o -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 9//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0126.obj b/modules/ufbx/data/obj_fuzz/fuzz_0126.obj new file mode 100644 index 0000000..999f59e Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0126.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0127.obj b/modules/ufbx/data/obj_fuzz/fuzz_0127.obj new file mode 100644 index 0000000..6e26c8b Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0127.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0128.obj b/modules/ufbx/data/obj_fuzz/fuzz_0128.obj new file mode 100644 index 0000000..4bd2d43 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0128.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0129.obj b/modules/ufbx/data/obj_fuzz/fuzz_0129.obj new file mode 100644 index 0000000..9e92bde Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0129.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0130.obj b/modules/ufbx/data/obj_fuzz/fuzz_0130.obj new file mode 100644 index 0000000..5557f25 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0130.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0131.obj b/modules/ufbx/data/obj_fuzz/fuzz_0131.obj new file mode 100644 index 0000000..71954eb Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0131.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0132.obj b/modules/ufbx/data/obj_fuzz/fuzz_0132.obj new file mode 100644 index 0000000..5c5b7dc Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0132.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0133.obj b/modules/ufbx/data/obj_fuzz/fuzz_0133.obj new file mode 100644 index 0000000..6eb4645 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0133.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0134.obj b/modules/ufbx/data/obj_fuzz/fuzz_0134.obj new file mode 100644 index 0000000..eb28441 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0134.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0135.obj b/modules/ufbx/data/obj_fuzz/fuzz_0135.obj new file mode 100644 index 0000000..18dc0fe Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0135.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0136.obj b/modules/ufbx/data/obj_fuzz/fuzz_0136.obj new file mode 100644 index 0000000..1297f88 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0136.obj @@ -0,0 +1,22 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cu +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +v -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.000H +vn 0.0000 0.0000 -1.0000 +s off +f 9//1 2//1 3//1 4//1 +f 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0137.obj b/modules/ufbx/data/obj_fuzz/fuzz_0137.obj new file mode 100644 index 0000000..7498d36 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0137.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0138.obj b/modules/ufbx/data/obj_fuzz/fuzz_0138.obj new file mode 100644 index 0000000..5830590 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0138.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0139.obj b/modules/ufbx/data/obj_fuzz/fuzz_0139.obj new file mode 100644 index 0000000..0825d19 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0139.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0140.obj b/modules/ufbx/data/obj_fuzz/fuzz_0140.obj new file mode 100644 index 0000000..9c5d15a Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0140.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0141.obj b/modules/ufbx/data/obj_fuzz/fuzz_0141.obj new file mode 100644 index 0000000..5670513 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0141.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0142.obj b/modules/ufbx/data/obj_fuzz/fuzz_0142.obj new file mode 100644 index 0000000..7602e3b --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0142.obj @@ -0,0 +1,30 @@ +# ufision +# _order +#d_normals +# File exported by ZBrush version 2022 +# www.zbrush.com +#Vertex Coun +#UVCount 13 +#Face Count 8 +#Auto sf0000 +mtllib zbr.mtl +usemtl defaultMat +v 0 1.99998998 0.00000017 +v -0.99998998 1 -0.00000006 +v 0 0.99999994 -0.99998992 +v 0.99998998 1 0.00000017 +v 0 0.00001001 0.00000017 +v 0 1 0.99998992 +#Brushfollowing MRGB block c‘ntains ZBrush Verteries per MRGB line. +#MRGB mtllibff00ff00ffff0000fffffU00ff00ffmtllibffffffE0ffff0000ff +# End of MRGB block +vt 0.625 1 +vt 0.5 0.5 +vt 0.75 0.5 +vt 0.:75 1 +vt 1 0.5 +vt 0.125 1 +vt 0 0.5 +vt 0.25 0.5 +vt %.375625875 0 +vt \ No newline at end of file diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0143.obj b/modules/ufbx/data/obj_fuzz/fuzz_0143.obj new file mode 100644 index 0000000..ba82507 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0143.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0144.obj b/modules/ufbx/data/obj_fuzz/fuzz_0144.obj new file mode 100644 index 0000000..055cc33 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0144.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +o -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 9//1 2//1 3//1 4//1 +g 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0145.obj b/modules/ufbx/data/obj_fuzz/fuzz_0145.obj new file mode 100644 index 0000000..6419284 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0145.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +f Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +o -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1//1 2//1 3//1 4//1 +o 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0146.obj b/modules/ufbx/data/obj_fuzz/fuzz_0146.obj new file mode 100644 index 0000000..2bf490a --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0146.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +o -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 9//1 2//1 3//1 4//1 +o 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +f 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0147.obj b/modules/ufbx/data/obj_fuzz/fuzz_0147.obj new file mode 100644 index 0000000..0b12700 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0147.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0148.obj b/modules/ufbx/data/obj_fuzz/fuzz_0148.obj new file mode 100644 index 0000000..4c27962 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0148.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0149.obj b/modules/ufbx/data/obj_fuzz/fuzz_0149.obj new file mode 100644 index 0000000..3398cf7 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0149.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0150.obj b/modules/ufbx/data/obj_fuzz/fuzz_0150.obj new file mode 100644 index 0000000..a2ba00e Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0150.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0151.obj b/modules/ufbx/data/obj_fuzz/fuzz_0151.obj new file mode 100644 index 0000000..45a1400 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0151.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0152.obj b/modules/ufbx/data/obj_fuzz/fuzz_0152.obj new file mode 100644 index 0000000..e3cab24 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0152.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0153.obj b/modules/ufbx/data/obj_fuzz/fuzz_0153.obj new file mode 100644 index 0000000..4605b3e Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0153.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0154.obj b/modules/ufbx/data/obj_fuzz/fuzz_0154.obj new file mode 100644 index 0000000..fe3d6e9 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0154.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0155.obj b/modules/ufbx/data/obj_fuzz/fuzz_0155.obj new file mode 100644 index 0000000..b1a731c Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0155.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0156.obj b/modules/ufbx/data/obj_fuzz/fuzz_0156.obj new file mode 100644 index 0000000..6c929ea Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0156.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0157.obj b/modules/ufbx/data/obj_fuzz/fuzz_0157.obj new file mode 100644 index 0000000..97ce815 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0157.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +o -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 9//1 2//1 3//1 4//1 +g 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +g 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0158.obj b/modules/ufbx/data/obj_fuzz/fuzz_0158.obj new file mode 100644 index 0000000..c81302a --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0158.obj @@ -0,0 +1,23 @@ +# Blender v2.79 (subOBJ File: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 10 0.0 0.0 1.0 +o -10 -10 -10 1 0 0 +v 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v -10 10 -10 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.00000000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 9//1 2//1 3//1 4//1 +g 5//2 8//2 7//2 6//2 +f 1//3 5//3 6//3 2//3 +o 2//4 6//4 7//4 3//4 +f 3//5 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0159.obj b/modules/ufbx/data/obj_fuzz/fuzz_0159.obj new file mode 100644 index 0000000..a0f8c8f Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0159.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0160.obj b/modules/ufbx/data/obj_fuzz/fuzz_0160.obj new file mode 100644 index 0000000..60ff306 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0160.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0161.obj b/modules/ufbx/data/obj_fuzz/fuzz_0161.obj new file mode 100644 index 0000000..abf5894 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0161.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0162.obj b/modules/ufbx/data/obj_fuzz/fuzz_0162.obj new file mode 100644 index 0000000..00d5543 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0162.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0163.obj b/modules/ufbx/data/obj_fuzz/fuzz_0163.obj new file mode 100644 index 0000000..86f6336 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0163.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0164.obj b/modules/ufbx/data/obj_fuzz/fuzz_0164.obj new file mode 100644 index 0000000..e0d08e1 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0164.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0165.obj b/modules/ufbx/data/obj_fuzz/fuzz_0165.obj new file mode 100644 index 0000000..0616c06 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0165.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0166.obj b/modules/ufbx/data/obj_fuzz/fuzz_0166.obj new file mode 100644 index 0000000..ab0fc6f --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0166.obj @@ -0,0 +1,54 @@ +# This file uses cen as s for no. + +g default +v -0.500000 -0.50 0.000000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +v0000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +s off +g pCube1 +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/5 4/4/6 6/6/7 5/5/8 +f 5/5/9 6/6/10 8/8/11 7/7/12 +f 7/7/13 8/8/14 2/10/15 1/9/16 +f 2/2/17 8/11/18 6/12/19 4/4/20 +f 7/13/21 1/1/22 3/3/23 5/14/24 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0167.obj b/modules/ufbx/data/obj_fuzz/fuzz_0167.obj new file mode 100644 index 0000000..9611280 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0167.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0168.obj b/modules/ufbx/data/obj_fuzz/fuzz_0168.obj new file mode 100644 index 0000000..0d1f5e4 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0168.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0169.obj b/modules/ufbx/data/obj_fuzz/fuzz_0169.obj new file mode 100644 index 0000000..011d81c Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0169.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0170.obj b/modules/ufbx/data/obj_fuzz/fuzz_0170.obj new file mode 100644 index 0000000..f56f253 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0170.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0171.obj b/modules/ufbx/data/obj_fuzz/fuzz_0171.obj new file mode 100644 index 0000000..9ce9cfb Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0171.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0172.obj b/modules/ufbx/data/obj_fuzz/fuzz_0172.obj new file mode 100644 index 0000000..a9ba951 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0172.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0173.obj b/modules/ufbx/data/obj_fuzz/fuzz_0173.obj new file mode 100644 index 0000000..ae1ea6d Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0173.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0174.obj b/modules/ufbx/data/obj_fuzz/fuzz_0174.obj new file mode 100644 index 0000000..bbe32c8 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0174.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0175.obj b/modules/ufbx/data/obj_fuzz/fuzz_0175.obj new file mode 100644 index 0000000..3e4423d Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0175.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0176.obj b/modules/ufbx/data/obj_fuzz/fuzz_0176.obj new file mode 100644 index 0000000..0b9574b Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0176.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0177.obj b/modules/ufbx/data/obj_fuzz/fuzz_0177.obj new file mode 100644 index 0000000..190c822 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0177.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0178.obj b/modules/ufbx/data/obj_fuzz/fuzz_0178.obj new file mode 100644 index 0000000..192b632 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0178.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0179.obj b/modules/ufbx/data/obj_fuzz/fuzz_0179.obj new file mode 100644 index 0000000..f168c3a Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0179.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0180.obj b/modules/ufbx/data/obj_fuzz/fuzz_0180.obj new file mode 100644 index 0000000..43a2fc2 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0180.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0181.obj b/modules/ufbx/data/obj_fuzz/fuzz_0181.obj new file mode 100644 index 0000000..3430557 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0181.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0182.obj b/modules/ufbx/data/obj_fuzz/fuzz_0182.obj new file mode 100644 index 0000000..b1639c9 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0182.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0183.obj b/modules/ufbx/data/obj_fuzz/fuzz_0183.obj new file mode 100644 index 0000000..82e8c47 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0183.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0184.obj b/modules/ufbx/data/obj_fuzz/fuzz_0184.obj new file mode 100644 index 0000000..d1b9899 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0184.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0185.obj b/modules/ufbx/data/obj_fuzz/fuzz_0185.obj new file mode 100644 index 0000000..fde6d42 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0185.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0186.obj b/modules/ufbx/data/obj_fuzz/fuzz_0186.obj new file mode 100644 index 0000000..4d3781a Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0186.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0187.obj b/modules/ufbx/data/obj_fuzz/fuzz_0187.obj new file mode 100644 index 0000000..3219d35 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0187.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0188.obj b/modules/ufbx/data/obj_fuzz/fuzz_0188.obj new file mode 100644 index 0000000..95a59ac Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0188.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0189.obj b/modules/ufbx/data/obj_fuzz/fuzz_0189.obj new file mode 100644 index 0000000..a9733f3 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0189.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0190.obj b/modules/ufbx/data/obj_fuzz/fuzz_0190.obj new file mode 100644 index 0000000..608180e Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0190.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0191.obj b/modules/ufbx/data/obj_fuzz/fuzz_0191.obj new file mode 100644 index 0000000..9cae4c8 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0191.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0192.obj b/modules/ufbx/data/obj_fuzz/fuzz_0192.obj new file mode 100644 index 0000000..7672d82 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0192.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0193.obj b/modules/ufbx/data/obj_fuzz/fuzz_0193.obj new file mode 100644 index 0000000..d073749 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0193.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0194.obj b/modules/ufbx/data/obj_fuzz/fuzz_0194.obj new file mode 100644 index 0000000..f1ff138 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0194.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0195.obj b/modules/ufbx/data/obj_fuzz/fuzz_0195.obj new file mode 100644 index 0000000..3f25d6e Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0195.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0196.obj b/modules/ufbx/data/obj_fuzz/fuzz_0196.obj new file mode 100644 index 0000000..69de6e7 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0196.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0197.obj b/modules/ufbx/data/obj_fuzz/fuzz_0197.obj new file mode 100644 index 0000000..f28a226 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0197.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0198.obj b/modules/ufbx/data/obj_fuzz/fuzz_0198.obj new file mode 100644 index 0000000..f9707cc Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0198.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0199.obj b/modules/ufbx/data/obj_fuzz/fuzz_0199.obj new file mode 100644 index 0000000..8795184 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0199.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0200.obj b/modules/ufbx/data/obj_fuzz/fuzz_0200.obj new file mode 100644 index 0000000..5765039 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0200.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0201.obj b/modules/ufbx/data/obj_fuzz/fuzz_0201.obj new file mode 100644 index 0000000..4c45f54 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0201.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0202.obj b/modules/ufbx/data/obj_fuzz/fuzz_0202.obj new file mode 100644 index 0000000..2f6c8bb Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0202.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0203.obj b/modules/ufbx/data/obj_fuzz/fuzz_0203.obj new file mode 100644 index 0000000..be5c9d4 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0203.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0204.obj b/modules/ufbx/data/obj_fuzz/fuzz_0204.obj new file mode 100644 index 0000000..2b899ab Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0204.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0205.obj b/modules/ufbx/data/obj_fuzz/fuzz_0205.obj new file mode 100644 index 0000000..81af301 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0205.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0206.obj b/modules/ufbx/data/obj_fuzz/fuzz_0206.obj new file mode 100644 index 0000000..b387ff0 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0206.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0207.obj b/modules/ufbx/data/obj_fuzz/fuzz_0207.obj new file mode 100644 index 0000000..d9afa8c Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0207.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0208.obj b/modules/ufbx/data/obj_fuzz/fuzz_0208.obj new file mode 100644 index 0000000..c54d042 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0208.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0209.obj b/modules/ufbx/data/obj_fuzz/fuzz_0209.obj new file mode 100644 index 0000000..3198cf0 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0209.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0210.obj b/modules/ufbx/data/obj_fuzz/fuzz_0210.obj new file mode 100644 index 0000000..6ee87b5 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0210.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0211.obj b/modules/ufbx/data/obj_fuzz/fuzz_0211.obj new file mode 100644 index 0000000..bbb748d Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0211.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0212.obj b/modules/ufbx/data/obj_fuzz/fuzz_0212.obj new file mode 100644 index 0000000..a5ee4df Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0212.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0213.obj b/modules/ufbx/data/obj_fuzz/fuzz_0213.obj new file mode 100644 index 0000000..5867555 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0213.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0214.obj b/modules/ufbx/data/obj_fuzz/fuzz_0214.obj new file mode 100644 index 0000000..50ecaf4 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0214.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0215.obj b/modules/ufbx/data/obj_fuzz/fuzz_0215.obj new file mode 100644 index 0000000..06ac386 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0215.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0216.obj b/modules/ufbx/data/obj_fuzz/fuzz_0216.obj new file mode 100644 index 0000000..e5cb2e4 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0216.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0217.obj b/modules/ufbx/data/obj_fuzz/fuzz_0217.obj new file mode 100644 index 0000000..1a77747 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0217.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0218.obj b/modules/ufbx/data/obj_fuzz/fuzz_0218.obj new file mode 100644 index 0000000..4bf7cb1 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0218.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0219.obj b/modules/ufbx/data/obj_fuzz/fuzz_0219.obj new file mode 100644 index 0000000..8f5d2f8 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0219.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0220.obj b/modules/ufbx/data/obj_fuzz/fuzz_0220.obj new file mode 100644 index 0000000..ed9fcb2 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0220.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0221.obj b/modules/ufbx/data/obj_fuzz/fuzz_0221.obj new file mode 100644 index 0000000..410be09 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0221.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0222.obj b/modules/ufbx/data/obj_fuzz/fuzz_0222.obj new file mode 100644 index 0000000..b2ebb2a Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0222.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0223.obj b/modules/ufbx/data/obj_fuzz/fuzz_0223.obj new file mode 100644 index 0000000..2b08cac Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0223.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0224.obj b/modules/ufbx/data/obj_fuzz/fuzz_0224.obj new file mode 100644 index 0000000..ad8dbe1 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0224.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0225.obj b/modules/ufbx/data/obj_fuzz/fuzz_0225.obj new file mode 100644 index 0000000..4e1ee64 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0225.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0226.obj b/modules/ufbx/data/obj_fuzz/fuzz_0226.obj new file mode 100644 index 0000000..80ed39b Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0226.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0227.obj b/modules/ufbx/data/obj_fuzz/fuzz_0227.obj new file mode 100644 index 0000000..877dbbb Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0227.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0228.obj b/modules/ufbx/data/obj_fuzz/fuzz_0228.obj new file mode 100644 index 0000000..84f15d5 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0228.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0229.obj b/modules/ufbx/data/obj_fuzz/fuzz_0229.obj new file mode 100644 index 0000000..e6357f8 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0229.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0230.obj b/modules/ufbx/data/obj_fuzz/fuzz_0230.obj new file mode 100644 index 0000000..ea99b6c Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0230.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0231.obj b/modules/ufbx/data/obj_fuzz/fuzz_0231.obj new file mode 100644 index 0000000..ba5b2ec Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0231.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0232.obj b/modules/ufbx/data/obj_fuzz/fuzz_0232.obj new file mode 100644 index 0000000..5eb0981 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0232.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0233.obj b/modules/ufbx/data/obj_fuzz/fuzz_0233.obj new file mode 100644 index 0000000..9327ba0 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0233.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0234.obj b/modules/ufbx/data/obj_fuzz/fuzz_0234.obj new file mode 100644 index 0000000..c16b67d --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0234.obj @@ -0,0 +1,5 @@ +# ufdnos +# File expmtl elib zbrï +usemtl default +UV Ver Count 1li˜mtk +usemtl dzbr.mtkïõŠŒšmtl defaultMat -0.00H$006 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0235.obj b/modules/ufbx/data/obj_fuzz/fuzz_0235.obj new file mode 100644 index 0000000..fccdd01 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0235.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0236.obj b/modules/ufbx/data/obj_fuzz/fuzz_0236.obj new file mode 100644 index 0000000..ce1d167 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0236.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0237.obj b/modules/ufbx/data/obj_fuzz/fuzz_0237.obj new file mode 100644 index 0000000..2b46d74 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0237.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0238.obj b/modules/ufbx/data/obj_fuzz/fuzz_0238.obj new file mode 100644 index 0000000..75a8ca3 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0238.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0239.obj b/modules/ufbx/data/obj_fuzz/fuzz_0239.obj new file mode 100644 index 0000000..1047a1d Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0239.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0240.obj b/modules/ufbx/data/obj_fuzz/fuzz_0240.obj new file mode 100644 index 0000000..4643176 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0240.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0241.obj b/modules/ufbx/data/obj_fuzz/fuzz_0241.obj new file mode 100644 index 0000000..39de9f6 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0241.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0242.obj b/modules/ufbx/data/obj_fuzz/fuzz_0242.obj new file mode 100644 index 0000000..28bb1c7 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0242.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0243.obj b/modules/ufbx/data/obj_fuzz/fuzz_0243.obj new file mode 100644 index 0000000..0c8e1a2 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0243.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0244.obj b/modules/ufbx/data/obj_fuzz/fuzz_0244.obj new file mode 100644 index 0000000..fc668e8 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0244.obj @@ -0,0 +1,5 @@ +# ufdnos +usemtl expmtl elib zbrïõŠŒšmtl default +UV Ver Count 1li˜mtk +usemtl dzbr.mtkï +usemtl defaultMat -0.00H$006 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0245.obj b/modules/ufbx/data/obj_fuzz/fuzz_0245.obj new file mode 100644 index 0000000..11880c1 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0245.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0246.obj b/modules/ufbx/data/obj_fuzz/fuzz_0246.obj new file mode 100644 index 0000000..7ce5ea6 --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0246.obj @@ -0,0 +1,5 @@ +¢ Bl: '' +# B er +g €ube ô»»»¡»»»0 -1/ð00ÿ0 @s€mmtllDB»»»»»»»0 ÿÿ0 ¨tMat /R 4//5 fMRGBlEr +o Cube ó»defau»0 »»»»»»»»»»»»»»»ÿ»»»»»»»»»»»»»&' +f \ No newline at end of file diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0247.obj b/modules/ufbx/data/obj_fuzz/fuzz_0247.obj new file mode 100644 index 0000000..174eaab Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0247.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0248.obj b/modules/ufbx/data/obj_fuzz/fuzz_0248.obj new file mode 100644 index 0000000..fb4bbfe --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0248.obj @@ -0,0 +1,23 @@ +# BlFile: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 103 +f 2//4 6//4 7//4 3//4 +g 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v 10 - 0 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +usemtl 2//1 3//1 4//1 õŠŒšmtl 8//2 7//2 6//2 +g 1//3 5//3 6//3 2//3 +usemtl 6//4 7//4 3//4 +usemtl 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0249.obj b/modules/ufbx/data/obj_fuzz/fuzz_0249.obj new file mode 100644 index 0000000..5fd18ca --- /dev/null +++ b/modules/ufbx/data/obj_fuzz/fuzz_0249.obj @@ -0,0 +1,23 @@ +# BlFile: '' +# www.blender.org +g Cube +v 10 -10 -10 1.0 0.0 0.0 +v 10 -10 10 0.0 1.0 0.0 +v -10 -10 103 +f 2//4 6//4 7//4 3//4 +g 10 10 -0.999999 0 1 0 +v 0.999999 10 11 0 0 1 +v -10 10 10 1 1 1 +v 10 - 0 0 0 0 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +s off +usemtl 2//1 3//1 4//1 +usemtl 8//2 7//2 6//2 +g 1//3 5//3 6//3 2//3 õŠŒšmtl 6//4 7//4 3//4 +usemtl 7//5 8//5 4//5 +f 5//6 1//6 4//6 8//6 diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0250.obj b/modules/ufbx/data/obj_fuzz/fuzz_0250.obj new file mode 100644 index 0000000..cf37e2e Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0250.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0251.obj b/modules/ufbx/data/obj_fuzz/fuzz_0251.obj new file mode 100644 index 0000000..fd39d2d Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0251.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0252.obj b/modules/ufbx/data/obj_fuzz/fuzz_0252.obj new file mode 100644 index 0000000..4feda76 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0252.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0253.obj b/modules/ufbx/data/obj_fuzz/fuzz_0253.obj new file mode 100644 index 0000000..5f13f39 Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0253.obj differ diff --git a/modules/ufbx/data/obj_fuzz/fuzz_0254.obj b/modules/ufbx/data/obj_fuzz/fuzz_0254.obj new file mode 100644 index 0000000..8c6ff8f Binary files /dev/null and b/modules/ufbx/data/obj_fuzz/fuzz_0254.obj differ diff --git a/modules/ufbx/data/picort/barbarian-big.picort.txt b/modules/ufbx/data/picort/barbarian-big.picort.txt new file mode 100644 index 0000000..6748bd7 --- /dev/null +++ b/modules/ufbx/data/picort/barbarian-big.picort.txt @@ -0,0 +1,9 @@ +input ../blender_293_barbarian_7400_binary.fbx +output ../../build/images/barbarian-big.png + +samples 64 +resolution 512 512 +bounces 0 +sky-exposure 3.5 +exposure 1.6 +time 0.05 diff --git a/modules/ufbx/data/picort/barbarian.picort.txt b/modules/ufbx/data/picort/barbarian.picort.txt new file mode 100644 index 0000000..c83b6bf --- /dev/null +++ b/modules/ufbx/data/picort/barbarian.picort.txt @@ -0,0 +1,11 @@ +input ../blender_293_barbarian_7400_binary.fbx +reference ../images/barbarian.png +output ../../build/images/barbarian.png + +samples 256 +resolution 256 256 +bounces 0 +sky-exposure 3.5 +exposure 1.6 +error-threshold 0.01 +time 0.93 diff --git a/modules/ufbx/data/picort/skies/blue_grotto.png b/modules/ufbx/data/picort/skies/blue_grotto.png new file mode 100644 index 0000000..6b34bd1 Binary files /dev/null and b/modules/ufbx/data/picort/skies/blue_grotto.png differ diff --git a/modules/ufbx/data/picort/slime-ascii.picort.txt b/modules/ufbx/data/picort/slime-ascii.picort.txt new file mode 100644 index 0000000..0183132 --- /dev/null +++ b/modules/ufbx/data/picort/slime-ascii.picort.txt @@ -0,0 +1,16 @@ +input ../maya_slime_7500_ascii.fbx +reference ../images/slime.png +output ../../build/images/slime-ascii.png + +samples 256 +resolution 256 256 +bounces 0 +sky skies/blue_grotto.png +sky-exposure 4.0 +exposure 1.6 +time 0.9 + +camera-position -80 95 140 +camera-target 0 80 0 +camera-fov 40 + diff --git a/modules/ufbx/data/picort/slime-big.picort.txt b/modules/ufbx/data/picort/slime-big.picort.txt new file mode 100644 index 0000000..dc6815b --- /dev/null +++ b/modules/ufbx/data/picort/slime-big.picort.txt @@ -0,0 +1,15 @@ +input ../maya_slime_7500_ascii.fbx +output ../../build/images/slime-big.png + +samples 64 +resolution 512 512 +bounces 0 +sky skies/blue_grotto.png +sky-exposure 4.0 +exposure 1.6 +time 0.1 + +camera-position -80 30 140 +camera-target 0 30 0 +camera-fov 40 + diff --git a/modules/ufbx/data/picort/slime-binary.picort.txt b/modules/ufbx/data/picort/slime-binary.picort.txt new file mode 100644 index 0000000..c8fc508 --- /dev/null +++ b/modules/ufbx/data/picort/slime-binary.picort.txt @@ -0,0 +1,16 @@ +input ../maya_slime_7500_binary.fbx +reference ../images/slime.png +output ../../build/images/slime-binary.png + +samples 256 +resolution 256 256 +bounces 0 +sky skies/blue_grotto.png +sky-exposure 4.0 +exposure 1.6 +time 0.9 + +camera-position -80 95 140 +camera-target 0 80 0 +camera-fov 40 + diff --git a/modules/ufbx/data/revit_empty_7400_binary.fbx b/modules/ufbx/data/revit_empty_7400_binary.fbx new file mode 100644 index 0000000..a5a6f4c Binary files /dev/null and b/modules/ufbx/data/revit_empty_7400_binary.fbx differ diff --git a/modules/ufbx/data/revit_empty_7700_binary.fbx b/modules/ufbx/data/revit_empty_7700_binary.fbx new file mode 100644 index 0000000..45beea0 Binary files /dev/null and b/modules/ufbx/data/revit_empty_7700_binary.fbx differ diff --git a/modules/ufbx/data/space dir/space tex.png b/modules/ufbx/data/space dir/space tex.png new file mode 100644 index 0000000..4ec2f5b Binary files /dev/null and b/modules/ufbx/data/space dir/space tex.png differ diff --git a/modules/ufbx/data/synthetic_aβカ😂_7500_ascii.fbx b/modules/ufbx/data/synthetic_aβカ😂_7500_ascii.fbx new file mode 100644 index 0000000..6bd14e6 --- /dev/null +++ b/modules/ufbx/data/synthetic_aβカ😂_7500_ascii.fbx @@ -0,0 +1,424 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 34 + Millisecond: 164 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658664160, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1908558533920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1907292239120, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1907674217712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907680138928, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631740128, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1907292239120,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631740128,1907680138928 + + ;Geometry::, Model::pCube1 + C: "OO",1908558533920,1907292239120 + + ;Material::lambert1, Model::pCube1 + C: "OO",1907674217712,1907292239120 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_binary_props_7500_ascii.fbx b/modules/ufbx/data/synthetic_binary_props_7500_ascii.fbx new file mode 100644 index 0000000..765c951 --- /dev/null +++ b/modules/ufbx/data/synthetic_binary_props_7500_ascii.fbx @@ -0,0 +1,456 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 34 + Millisecond: 164 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658664160, "", "Scene" { + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1908558533920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + } + } + Model: 1907292239120, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1907674217712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907680138928, "AnimStack::Take 001", "" { + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631740128, "AnimLayer::BaseLayer", "" { + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + } + } + Unknown: 1, "Unknown::BaseLayer", "" { + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + } + } + SceneInfo: 2, "Unknown::GlobalInfo", "" { + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + } + } + GlobalSettings: 3, "GlobalSettings::Settings", "" { + Properties70: { + P: "Binary", "Blob", "", "", 3 { BinaryData: "Yes" } + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1907292239120,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631740128,1907680138928 + + ;Geometry::, Model::pCube1 + C: "OO",1908558533920,1907292239120 + + ;Material::lambert1, Model::pCube1 + C: "OO",1907674217712,1907292239120 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_bind_to_root.obj b/modules/ufbx/data/synthetic_bind_to_root.obj new file mode 100644 index 0000000..f787ae6 --- /dev/null +++ b/modules/ufbx/data/synthetic_bind_to_root.obj @@ -0,0 +1,222 @@ +# This file uses centimeters as units for non-parametric coordinates. + +v -1.430161 1.762709 2.000000 +v 0.517278 2.033588 2.000000 +v 2.531736 2.313496 2.000000 +v -1.668167 3.715877 2.000000 +v 0.224171 4.012603 2.000000 +v 2.284123 4.331833 2.000000 +v -1.815951 5.161953 2.000000 +v -0.000000 6.000000 2.000000 +v 1.815951 6.838047 2.000000 +v -2.820420 6.212676 2.000000 +v -1.366811 7.460078 2.000000 +v 0.212676 8.820420 2.000000 +v -4.152209 7.661071 2.000000 +v -2.682516 8.967172 2.000000 +v -1.162469 10.318410 2.000000 +v -4.166102 7.625914 0.000000 +v -2.682516 8.967172 0.000000 +v -1.198930 10.308430 0.000000 +v -4.152209 7.661071 -2.000000 +v -2.682516 8.967172 -2.000000 +v -1.162469 10.318410 -2.000000 +v -2.820420 6.212676 -2.000000 +v -1.366811 7.460078 -2.000000 +v 0.212676 8.820420 -2.000000 +v -1.815951 5.161953 -2.000000 +v 0.000000 6.000000 -2.000000 +v 1.815951 6.838047 -2.000000 +v -1.668167 3.715877 -2.000000 +v 0.224171 4.012603 -2.000000 +v 2.284123 4.331833 -2.000000 +v -1.430161 1.762709 -2.000000 +v 0.517278 2.033588 -2.000000 +v 2.531736 2.313496 -2.000000 +v -1.465927 1.774949 0.000000 +v 0.517278 2.033588 0.000000 +v 2.500484 2.292227 0.000000 +v 2.211568 4.236774 0.000000 +v 1.815951 6.838047 0.000000 +v 0.093266 8.826889 0.000000 +v -1.763226 3.788432 0.000000 +v -1.815951 5.161953 0.000000 +v -2.826889 6.093266 0.000000 +vt 0.375000 0.000000 +vt 0.500000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.062500 +vt 0.500000 0.062500 +vt 0.625000 0.062500 +vt 0.375000 0.125000 +vt 0.500000 0.125000 +vt 0.625000 0.125000 +vt 0.375000 0.187500 +vt 0.500000 0.187500 +vt 0.625000 0.187500 +vt 0.375000 0.250000 +vt 0.500000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.375000 +vt 0.500000 0.375000 +vt 0.625000 0.375000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.562500 +vt 0.500000 0.562500 +vt 0.625000 0.562500 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.625000 0.625000 +vt 0.375000 0.687500 +vt 0.500000 0.687500 +vt 0.625000 0.687500 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.375000 1.000000 +vt 0.500000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.750000 0.000000 +vt 0.875000 0.062500 +vt 0.750000 0.062500 +vt 0.875000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.187500 +vt 0.750000 0.187500 +vt 0.875000 0.250000 +vt 0.750000 0.250000 +vt 0.125000 0.000000 +vt 0.250000 0.000000 +vt 0.125000 0.062500 +vt 0.250000 0.062500 +vt 0.125000 0.125000 +vt 0.250000 0.125000 +vt 0.125000 0.187500 +vt 0.250000 0.187500 +vt 0.125000 0.250000 +vt 0.250000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.667482 0.744614 -0.004226 +vn -0.667488 0.744621 0.000036 +vn -0.667488 0.744621 0.000000 +vn -0.667488 0.744621 0.000000 +vn -0.667482 0.744614 0.004226 +vn -0.667488 0.744621 0.000000 +vn -0.667488 0.744621 -0.000036 +vn -0.667482 0.744614 0.004226 +vn -0.667482 0.744614 -0.004226 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.133508 -0.991039 0.004226 +vn 0.133509 -0.991048 -0.000036 +vn 0.133509 -0.991048 0.000000 +vn 0.133509 -0.991048 0.000000 +vn 0.133508 -0.991039 -0.004226 +vn 0.133509 -0.991048 0.000000 +vn 0.133509 -0.991048 0.000036 +vn 0.133508 -0.991039 -0.004226 +vn 0.133508 -0.991039 0.004226 +vn 0.990959 0.134165 0.000000 +vn 0.990525 0.134106 0.029606 +vn 0.987915 0.152949 0.025128 +vn 0.988357 0.152151 0.000000 +vn 0.990525 0.134106 -0.029606 +vn 0.987915 0.152949 -0.025128 +vn 0.907743 0.418916 0.022631 +vn 0.907975 0.419023 0.000000 +vn 0.907743 0.418916 -0.022631 +vn 0.757380 0.652491 0.025128 +vn 0.757060 0.653345 0.000000 +vn 0.757380 0.652491 -0.025128 +vn 0.744735 0.666703 0.029606 +vn 0.745062 0.666995 0.000000 +vn 0.744735 0.666703 -0.029606 +vn -0.990583 -0.133680 -0.029564 +vn -0.991017 -0.133739 0.000000 +vn -0.994258 -0.107007 0.000000 +vn -0.993732 -0.108553 -0.026708 +vn -0.990583 -0.133680 0.029564 +vn -0.993732 -0.108553 0.026708 +vn -0.907975 -0.419024 0.000000 +vn -0.907715 -0.418903 -0.023959 +vn -0.907715 -0.418903 0.023959 +vn -0.726538 -0.687127 0.000000 +vn -0.727373 -0.685723 -0.026708 +vn -0.727373 -0.685723 0.026708 +vn -0.744775 -0.667315 0.000000 +vn -0.744450 -0.667024 -0.029564 +vn -0.744450 -0.667024 0.029564 +g pCube1 +f 1/1/1 2/2/2 5/5/3 4/4/4 +f 2/2/2 3/3/5 6/6/6 5/5/3 +f 4/4/4 5/5/3 8/8/7 7/7/8 +f 5/5/3 6/6/6 9/9/9 8/8/7 +f 7/7/8 8/8/7 11/11/10 10/10/11 +f 8/8/7 9/9/9 12/12/12 11/11/10 +f 10/10/11 11/11/10 14/14/13 13/13/14 +f 11/11/10 12/12/12 15/15/15 14/14/13 +f 13/13/16 14/14/17 17/17/18 16/16/19 +f 14/14/17 15/15/20 18/18/21 17/17/18 +f 16/16/19 17/17/18 20/20/22 19/19/23 +f 17/17/18 18/18/21 21/21/24 20/20/22 +f 19/19/25 20/20/26 23/23/27 22/22/28 +f 20/20/26 21/21/29 24/24/30 23/23/27 +f 22/22/28 23/23/27 26/26/31 25/25/32 +f 23/23/27 24/24/30 27/27/33 26/26/31 +f 25/25/32 26/26/31 29/29/34 28/28/35 +f 26/26/31 27/27/33 30/30/36 29/29/34 +f 28/28/35 29/29/34 32/32/37 31/31/38 +f 29/29/34 30/30/36 33/33/39 32/32/37 +f 31/31/40 32/32/41 35/35/42 34/34/43 +f 32/32/41 33/33/44 36/36/45 35/35/42 +f 34/34/43 35/35/42 2/38/46 1/37/47 +f 35/35/42 36/36/45 3/39/48 2/38/46 +f 36/41/49 33/40/50 30/42/51 37/43/52 +f 3/3/53 36/41/49 37/43/52 6/6/54 +f 37/43/52 30/42/51 27/44/55 38/45/56 +f 6/6/54 37/43/52 38/45/56 9/9/57 +f 38/45/56 27/44/55 24/46/58 39/47/59 +f 9/9/57 38/45/56 39/47/59 12/12/60 +f 39/47/59 24/46/58 21/48/61 18/49/62 +f 12/12/60 39/47/59 18/49/62 15/15/63 +f 31/50/64 34/51/65 40/53/66 28/52/67 +f 34/51/65 1/1/68 4/4/69 40/53/66 +f 28/52/67 40/53/66 41/55/70 25/54/71 +f 40/53/66 4/4/69 7/7/72 41/55/70 +f 25/54/71 41/55/70 42/57/73 22/56/74 +f 41/55/70 7/7/72 10/10/75 42/57/73 +f 22/56/74 42/57/73 16/59/76 19/58/77 +f 42/57/73 10/10/75 13/13/78 16/59/76 diff --git a/modules/ufbx/data/synthetic_bind_to_root_7700_ascii.fbx b/modules/ufbx/data/synthetic_bind_to_root_7700_ascii.fbx new file mode 100644 index 0000000..cf00629 --- /dev/null +++ b/modules/ufbx/data/synthetic_bind_to_root_7700_ascii.fbx @@ -0,0 +1,892 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 11 + Day: 5 + Hour: 4 + Minute: 4 + Second: 8 + Millisecond: 529 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_bind_to_root_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_bind_to_root_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "05/11/2022 02:04:08.527" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_bind_to_root_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "05/11/2022 02:04:08.527" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1758455869216, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 33 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 4 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 3 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 7 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 10 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 3 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1756906635152, "Geometry::", "Mesh" { + Vertices: *126 { + a: -0.5,-1,0.5,0,-1,0.5,0.5,-1,0.5,-0.5,-0.5,0.5,0,-0.5,0.5,0.5,-0.5,0.5,-0.5,0,0.5,0,0,0.5,0.5,0,0.5,-0.5,0.5,0.5,0,0.5,0.5,0.5,0.5,0.5,-0.5,1,0.5,0,1,0.5,0.5,1,0.5,-0.5,1,0,0,1,0,0.5,1,0,-0.5,1,-0.5,0,1,-0.5,0.5,1,-0.5,-0.5,0.5,-0.5,0,0.5,-0.5,0.5,0.5,-0.5,-0.5,0,-0.5,0,0,-0.5,0.5,0,-0.5,-0.5,-0.5,-0.5,0,-0.5,-0.5,0.5,-0.5,-0.5,-0.5,-1,-0.5,0,-1,-0.5,0.5,-1,-0.5,-0.5,-1,0,0,-1,0,0.5,-1,0,0.5,-0.5,0,0.5,0,0,0.5,0.5,0,-0.5,-0.5,0,-0.5,0,0,-0.5,0.5,0 + } + PolygonVertexIndex: *160 { + a: 0,1,4,-4,1,2,5,-5,3,4,7,-7,4,5,8,-8,6,7,10,-10,7,8,11,-11,9,10,13,-13,10,11,14,-14,12,13,16,-16,13,14,17,-17,15,16,19,-19,16,17,20,-20,18,19,22,-22,19,20,23,-23,21,22,25,-25,22,23,26,-26,24,25,28,-28,25,26,29,-29,27,28,31,-31,28,29,32,-32,30,31,34,-34,31,32,35,-35,33,34,1,-1,34,35,2,-2,35,32,29,-37,2,35,36,-6,36,29,26,-38,5,36,37,-9,37,26,23,-39,8,37,38,-12,38,23,20,-18,11,38,17,-15,30,33,39,-28,33,0,3,-40,27,39,40,-25,39,3,6,-41,24,40,41,-22,40,6,9,-42,21,41,15,-19,41,9,12,-16 + } + Edges: *80 { + a: 0,4,2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,3,1,5,11,9,13,19,17,21,27,25,29,35,33,37,43,41,45,51,49,53,59,57,61,67,65,69,75,73,77,83,81,85,91,89,93,98,102,106,110,114,118,99,107,115,123,130,134,138,142,146,150,129,137,145,153 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *480 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *160 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *118 { + a: 0.375,0,0.5,0,0.625,0,0.375,0.0625,0.5,0.0625,0.625,0.0625,0.375,0.125,0.5,0.125,0.625,0.125,0.375,0.1875,0.5,0.1875,0.625,0.1875,0.375,0.25,0.5,0.25,0.625,0.25,0.375,0.375,0.5,0.375,0.625,0.375,0.375,0.5,0.5,0.5,0.625,0.5,0.375,0.5625,0.5,0.5625,0.625,0.5625,0.375,0.625,0.5,0.625,0.625,0.625,0.375,0.6875,0.5,0.6875,0.625,0.6875,0.375,0.75,0.5,0.75,0.625,0.75,0.375,0.875,0.5,0.875,0.625,0.875,0.375,1,0.5,1,0.625,1,0.875,0,0.75,0,0.875,0.0625,0.75,0.0625,0.875,0.125,0.75,0.125,0.875,0.1875,0.75,0.1875,0.875,0.25,0.75,0.25,0.125,0,0.25,0,0.125,0.0625,0.25,0.0625,0.125,0.125,0.25,0.125,0.125,0.1875,0.25,0.1875,0.125,0.25,0.25,0.25 + } + UVIndex: *160 { + a: 0,1,4,3,1,2,5,4,3,4,7,6,4,5,8,7,6,7,10,9,7,8,11,10,9,10,13,12,10,11,14,13,12,13,16,15,13,14,17,16,15,16,19,18,16,17,20,19,18,19,22,21,19,20,23,22,21,22,25,24,22,23,26,25,24,25,28,27,25,26,29,28,27,28,31,30,28,29,32,31,30,31,34,33,31,32,35,34,33,34,37,36,34,35,38,37,40,39,41,42,2,40,42,5,42,41,43,44,5,42,44,8,44,43,45,46,8,44,46,11,46,45,47,48,11,46,48,14,49,50,52,51,50,0,3,52,51,52,54,53,52,3,6,54,53,54,56,55,54,6,9,56,55,56,58,57,56,9,12,58 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 1758819939168, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",21.8390804597701 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1758819939360, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",21.8390804597701 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 1758819938400, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",21.8390804597701 + } + TypeFlags: "Skeleton" + } + Model: 1756883918208, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,4,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",4,4,4 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1756883959968, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,2,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1756883955328, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",4,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",0,0,49.5459027633167 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1756883950688, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",4,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 1758541389568, "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 3 + PoseNode: { + Node: 1756883918208 + Matrix: *16 { + a: 4,0,0,0,0,4,0,0,0,0,4,0,0,4,0,1 + } + } + PoseNode: { + Node: 1756883959968 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 1756883955328 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,4,0,1 + } + } + } + Material: 1758529451232, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 1758541392032, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "DualQuaternion" + } + Deformer: 1758467925392, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *42 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 + } + Weights: *42 { + a: 0.837377538853255,0.847217404899722,0.837377538853255,0.818241865386329,0.867467474520774,0.818241865386329,0.5,0.5,0.5,0.181758134613671,0.132532525479226,0.181758134613671,0.162622461146745,0.152782595100278,0.162622461146745,0.152782595100278,0.152782595100278,0.152782595100278,0.162622461146745,0.152782595100278,0.162622461146745,0.181758134613671,0.132532525479226,0.181758134613671,0.5,0.5,0.5,0.818241865386329,0.867467474520774,0.818241865386329,0.837377538853255,0.847217404899722,0.837377538853255,0.847217404899722,0.847217404899722,0.847217404899722,0.867467474520774,0.5,0.132532525479226,0.867467474520774,0.5,0.132532525479226 + } + Transform: *16 { + a: 2.44929359829471e-16,-4,0,0,4,2.44929359829471e-16,0,0,0,0,4,0,4,2.44929359829471e-16,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + } + Deformer: 1758467912880, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *42 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 + } + Weights: *42 { + a: 0.162622461146745,0.152782595100278,0.162622461146745,0.181758134613671,0.132532525479226,0.181758134613671,0.5,0.5,0.5,0.818241865386329,0.867467474520774,0.818241865386329,0.837377538853255,0.847217404899722,0.837377538853255,0.847217404899722,0.847217404899722,0.847217404899722,0.837377538853255,0.847217404899722,0.837377538853255,0.818241865386329,0.867467474520774,0.818241865386329,0.5,0.5,0.5,0.181758134613671,0.132532525479226,0.181758134613671,0.162622461146745,0.152782595100278,0.162622461146745,0.152782595100278,0.152782595100278,0.152782595100278,0.132532525479226,0.5,0.867467474520774,0.132532525479226,0.5,0.867467474520774 + } + Transform: *16 { + a: 2.44929359829471e-16,-4,0,0,4,2.44929359829471e-16,0,0,0,0,4,0,0,0,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,4,0,1 + } + } + AnimationStack: 1758381381344, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 1758500399952, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,76976930000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Constant|ConstantStandard + KeyAttrFlags: *2 { + a: 2,2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 1758500401392, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,76976930000 + } + KeyValueFloat: *2 { + a: 4,4 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 1758500401712, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,76976930000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 1758500403632, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,76976930000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 1758500403792, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,76976930000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 1758500401872, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,76976930000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 1758500409072, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,76976930000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 1758500407312, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,76976930000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 1758500411792, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,76976930000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 1758500408752, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,76976930000 + } + KeyValueFloat: *2 { + a: 64.20274,-108.0638 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 1758381417744, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 1758381422320, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 1758381436256, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 1758381431056, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 1758381430224, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",4 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1758381436464, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 1758381439584, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",49.5459027633167 + } + } + AnimationLayer: 1758693555264, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1756883918208,0 + + ;Model::joint1, Model::RootNode + C: "OO",1756883959968,0 + + ; HACK + C: "OO",1758541392032,0 + C: "OO",1758467925392,0 + C: "OO",1758467912880,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1758693555264,1758381381344 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",1758381417744,1758693555264 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",1758381422320,1758693555264 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",1758381436256,1758693555264 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",1758381431056,1758693555264 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1758381430224,1758693555264 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",1758381436464,1758693555264 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",1758381439584,1758693555264 + + ;Deformer::, Geometry:: + C: "OO",1758541392032,1756906635152 + + ;Geometry::, Model::pCube1 + C: "OO",1756906635152,1756883918208 + + ;Material::lambert1, Model::pCube1 + C: "OO",1758529451232,1756883918208 + + ;NodeAttribute::, Model::joint1 + C: "OO",1758819939168,1756883959968 + + ;Model::joint2, Model::joint1 + C: "OO",1756883955328,1756883959968 + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",1758381417744,1756883959968, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint2 + C: "OO",1758819939360,1756883955328 + + ;Model::joint3, Model::joint2 + C: "OO",1756883950688,1756883955328 + + ;AnimCurveNode::T, Model::joint2 + C: "OP",1758381430224,1756883955328, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint2 + C: "OP",1758381439584,1756883955328, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint2 + C: "OP",1758381436464,1756883955328, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint2 + C: "OP",1758381431056,1756883955328, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",1758381422320,1756883955328, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint3 + C: "OO",1758819938400,1756883950688 + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",1758381436256,1756883950688, "lockInfluenceWeights" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",1758500399952,1758381431056, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1758500401392,1758381430224, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1758500401712,1758381430224, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",1758500403632,1758381430224, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1758500403792,1758381436464, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1758500401872,1758381436464, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",1758500409072,1758381436464, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1758500407312,1758381439584, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1758500411792,1758381439584, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",1758500408752,1758381439584, "d|Z" + + ;SubDeformer::, Deformer:: + C: "OO",1758467925392,1758541392032 + + ;SubDeformer::, Deformer:: + C: "OO",1758467912880,1758541392032 + + ;Model::joint1, SubDeformer:: + C: "OO",1756883959968,1758467925392 + + ;Model::joint2, SubDeformer:: + C: "OO",1756883955328,1758467912880 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_blend_order_7500_ascii.fbx b/modules/ufbx/data/synthetic_blend_order_7500_ascii.fbx new file mode 100644 index 0000000..3d8c0f0 --- /dev/null +++ b/modules/ufbx/data/synthetic_blend_order_7500_ascii.fbx @@ -0,0 +1,585 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 7 + Day: 17 + Hour: 19 + Minute: 42 + Second: 58 + Millisecond: 672 + } + Creator: "FBX SDK/FBX Plugins version 2020.1.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_blend_inbetween_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_blend_inbetween_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "202004" + P: "Original|DateTime_GMT", "DateTime", "", "", "17/07/2021 16:42:58.670" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_blend_inbetween_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "202004" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "17/07/2021 16:42:58.670" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\blend_between.ma" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2044649186144, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 18 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 6 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Deformer" { + Count: 3 + } + ObjectType: "AnimationCurveNode" { + Count: 2 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 2 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2044249333584, "Geometry::", "Mesh" { + Vertices: *78 { + a: -0.5,-0.5,0.5,0,-0.5,0.5,0.5,-0.5,0.5,-0.5,0,0.5,0,0,0.5,0.5,0,0.5,-0.5,0.5,0.5,0,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,0,0,0.5,0,0.5,0.5,0,-0.5,0.5,-0.5,0,0.5,-0.5,0.5,0.5,-0.5,-0.5,0,-0.5,0,0,-0.5,0.5,0,-0.5,-0.5,-0.5,-0.5,0,-0.5,-0.5,0.5,-0.5,-0.5,-0.5,-0.5,0,0,-0.5,0,0.5,-0.5,0,0.5,0,0,-0.5,0,0 + } + PolygonVertexIndex: *96 { + a: 0,1,4,-4,1,2,5,-5,3,4,7,-7,4,5,8,-8,6,7,10,-10,7,8,11,-11,9,10,13,-13,10,11,14,-14,12,13,16,-16,13,14,17,-17,15,16,19,-19,16,17,20,-20,18,19,22,-22,19,20,23,-23,21,22,1,-1,22,23,2,-2,23,20,17,-25,2,23,24,-6,24,17,14,-12,5,24,11,-9,18,21,25,-16,21,0,3,-26,15,25,9,-13,25,3,6,-10 + } + Edges: *48 { + a: 0,4,2,6,10,14,18,22,26,30,34,38,42,46,50,54,3,1,5,11,9,13,19,17,21,27,25,29,35,33,37,43,41,45,51,49,53,59,57,61,66,70,67,75,82,86,81,89 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *288 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *96 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *78 { + a: 0.375,0,0.5,0,0.625,0,0.375,0.125,0.5,0.125,0.625,0.125,0.375,0.25,0.5,0.25,0.625,0.25,0.375,0.375,0.5,0.375,0.625,0.375,0.375,0.5,0.5,0.5,0.625,0.5,0.375,0.625,0.5,0.625,0.625,0.625,0.375,0.75,0.5,0.75,0.625,0.75,0.375,0.875,0.5,0.875,0.625,0.875,0.375,1,0.5,1,0.625,1,0.875,0,0.75,0,0.875,0.125,0.75,0.125,0.875,0.25,0.75,0.25,0.125,0,0.25,0,0.125,0.125,0.25,0.125,0.125,0.25,0.25,0.25 + } + UVIndex: *96 { + a: 0,1,4,3,1,2,5,4,3,4,7,6,4,5,8,7,6,7,10,9,7,8,11,10,9,10,13,12,10,11,14,13,12,13,16,15,13,14,17,16,15,16,19,18,16,17,20,19,18,19,22,21,19,20,23,22,21,22,25,24,22,23,26,25,28,27,29,30,2,28,30,5,30,29,31,32,5,30,32,8,33,34,36,35,34,0,3,36,35,36,38,37,36,3,6,38 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2044643181632, "Geometry::KeyBlend.LiftTop0", "Shape" { + Properties70: { + } + Version: 100 + Indexes: *4 { + a: 6,7,9,10 + } + Vertices: *12 { + a: 0,-0.123324779287941,0,0,-0.12332478594908,0,0,-0.12332478594908,0,0,-0.12332478594908,0 + } + Normals: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Geometry: 2044643187392, "Geometry::LiftTop", "Shape" { + Properties70: { + } + Version: 100 + Indexes: *8 { + a: 6,7,9,10,19,20,22,23 + } + Vertices: *24 { + a: 0,0.174181823233084,0,0,0.174181809910806,0,0,0.174181809910806,0,0,0.174181809910806,0,0,0.15822790893435,0,0,0.15822790893435,0,0,0.15822790893435,0,0,0.15822790893435,0 + } + Normals: *24 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Geometry: 2044643187680, "Geometry::KeyBlend.MoveToSide0", "Shape" { + Properties70: { + } + Version: 100 + Indexes: *9 { + a: 6,7,8,9,10,11,12,13,14 + } + Vertices: *27 { + a: 0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0,0.00429354635707568,0,0 + } + Normals: *27 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Geometry: 2044643186240, "Geometry::KeyBlend.MoveToSide1", "Shape" { + Properties70: { + } + Version: 100 + Indexes: *9 { + a: 6,7,8,9,10,11,12,13,14 + } + Vertices: *27 { + a: 0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515,0.76889031633388,0,-0.0778823368563515 + } + Normals: *27 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Geometry: 2044643181920, "Geometry::MoveToSide", "Shape" { + Properties70: { + } + Version: 100 + Indexes: *9 { + a: 6,7,8,9,10,11,12,13,14 + } + Vertices: *27 { + a: 0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162,0,0,-0.46698249936162 + } + Normals: *27 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Model: 2044251505088, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2044478081744, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2044652614080, "Deformer::KeyBlend", "BlendShape" { + Version: 100 + Properties70: { + P: "RootGroup", "KString", "", "", "" + P: "RootGroup|LiftTop", "KString", "", "", "" + P: "RootGroup|MoveToSide", "KString", "", "", "" + } + } + Deformer: 2044639025232, "SubDeformer::KeyBlend.LiftTop", "BlendShapeChannel" { + Version: 100 + Properties70: { + P: "DeformPercent", "Number", "", "A+",-100 + } + DeformPercent: -100 + FullWeights: *2 { + a: 50,100 + } + } + Deformer: 2044639025392, "SubDeformer::KeyBlend.MoveToSide", "BlendShapeChannel" { + Version: 100 + Properties70: { + P: "DeformPercent", "Number", "", "A+",200 + } + DeformPercent: 200 + FullWeights: *3 { + a: 100,-24.9,-49.9 + } + } + AnimationStack: 2044625016480, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationCurve: 2044639029872, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,230930790000 + } + KeyValueFloat: *2 { + a: -100,200 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2044639026192, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 1924423250,230930790000 + } + KeyValueFloat: *2 { + a: 200,-100 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2044625020848, "AnimCurveNode::DeformPercent", "" { + Properties70: { + P: "d|DeformPercent", "Number", "", "A",-100 + } + } + AnimationCurveNode: 2044625016688, "AnimCurveNode::DeformPercent", "" { + Properties70: { + P: "d|DeformPercent", "Number", "", "A",200 + } + } + AnimationLayer: 2044591074064, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2044251505088,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2044591074064,2044625016480 + + ;AnimCurveNode::DeformPercent, AnimLayer::BaseLayer + C: "OO",2044625020848,2044591074064 + + ;AnimCurveNode::DeformPercent, AnimLayer::BaseLayer + C: "OO",2044625016688,2044591074064 + + ;Deformer::KeyBlend, Geometry:: + C: "OO",2044652614080,2044249333584 + + ;Geometry::, Model::pCube1 + C: "OO",2044249333584,2044251505088 + + ;Material::lambert1, Model::pCube1 + C: "OO",2044478081744,2044251505088 + + ;SubDeformer::KeyBlend.LiftTop, Deformer::KeyBlend + C: "OO",2044639025232,2044652614080 + + ;SubDeformer::KeyBlend.MoveToSide, Deformer::KeyBlend + C: "OO",2044639025392,2044652614080 + + ;Geometry::KeyBlend.LiftTop0, SubDeformer::KeyBlend.LiftTop + C: "OO",2044643181632,2044639025232 + + ;Geometry::LiftTop, SubDeformer::KeyBlend.LiftTop + C: "OO",2044643187392,2044639025232 + + ;AnimCurveNode::DeformPercent, SubDeformer::KeyBlend.LiftTop + C: "OP",2044625020848,2044639025232, "DeformPercent" + + ;AnimCurve::, AnimCurveNode::DeformPercent + C: "OP",2044639029872,2044625020848, "d|DeformPercent" + + ;Geometry::MoveToSide, SubDeformer::KeyBlend.MoveToSide + C: "OO",2044643181920,2044639025392 + + ;Geometry::KeyBlend.MoveToSide1, SubDeformer::KeyBlend.MoveToSide + C: "OO",2044643186240,2044639025392 + + ;Geometry::KeyBlend.MoveToSide0, SubDeformer::KeyBlend.MoveToSide + C: "OO",2044643187680,2044639025392 + + ;AnimCurveNode::DeformPercent, SubDeformer::KeyBlend.MoveToSide + C: "OP",2044625016688,2044639025392, "DeformPercent" + + ;AnimCurve::, AnimCurveNode::DeformPercent + C: "OP",2044639026192,2044625016688, "d|DeformPercent" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_blend_shape_order_7500_ascii.fbx b/modules/ufbx/data/synthetic_blend_shape_order_7500_ascii.fbx new file mode 100644 index 0000000..48f26e1 --- /dev/null +++ b/modules/ufbx/data/synthetic_blend_shape_order_7500_ascii.fbx @@ -0,0 +1,420 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 6 + Hour: 19 + Minute: 18 + Second: 26 + Millisecond: 631 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_blend_shape_order_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_blend_shape_order_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "06/08/2021 16:18:26.630" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_blend_shape_order_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "06/08/2021 16:18:26.630" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2055401702768, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 9 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 2 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Deformer" { + Count: 2 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2053023131024, "Geometry::", "Mesh" { + Vertices: *36 { + a: 0,0,-1,0.723606824874878,0.525731086730957,-0.447213590145111,-0.276393264532089,0.850650906562805,-0.447213649749756,-0.894427299499512,-7.81933167104398e-08,-0.447213649749756,-0.276393294334412,-0.850650787353516,-0.447213590145111,0.723606765270233,-0.525731146335602,-0.447213590145111,0.894427299499512,0,0.447213649749756,0.276393175125122,0.85065084695816,0.447213590145111,-0.723606884479523,0.525731086730957,0.447213649749756,-0.723606765270233,-0.525731205940247,0.447213590145111,0.276393324136734,-0.850650787353516,0.447213590145111,0,0,1 + } + PolygonVertexIndex: *60 { + a: 0,2,-2,0,3,-3,0,4,-4,0,5,-5,0,1,-6,1,2,-8,2,3,-9,3,4,-10,4,5,-11,5,1,-7,1,7,-7,2,8,-8,3,9,-9,4,10,-10,5,6,-11,6,7,-12,7,8,-12,8,9,-12,9,10,-12,10,6,-12 + } + Edges: *30 { + a: 0,1,2,3,4,6,7,9,10,13,16,17,19,20,22,23,25,26,28,29,31,34,37,40,43,46,47,49,52,55 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *180 { + a: 0.187592595815659,0.577350199222565,-0.794654488563538,0.18759261071682,0.577350199222565,-0.794654548168182,0.187592595815659,0.577350199222565,-0.794654488563538,-0.491123497486115,0.356821984052658,-0.794654428958893,-0.491123497486115,0.356821984052658,-0.794654488563538,-0.491123467683792,0.356821984052658,-0.794654488563538,-0.491123378276825,-0.356822162866592,-0.794654488563538,-0.491123378276825,-0.35682213306427,-0.794654488563538,-0.491123378276825,-0.35682213306427,-0.794654488563538,0.187592387199402,-0.577350378036499,-0.794654428958893,0.187592387199402,-0.577350378036499,-0.794654428958893,0.187592387199402,-0.577350378036499,-0.794654488563538,0.607062160968781,-3.1126631938605e-08,-0.794654369354248,0.607062160968781,-3.1126631938605e-08,-0.794654428958893,0.607062160968781,-3.1126631938605e-08,-0.794654369354248,0.30353108048439,0.934172332286835,-0.187592521309853,0.303531050682068,0.934172332286835,-0.187592521309853,0.30353108048439,0.934172332286835,-0.187592521309853,-0.794654548168182,0.577350199222565,-0.187592446804047,-0.794654488563538,0.577350199222565,-0.187592461705208,-0.794654488563538,0.577350199222565,-0.187592461705208,-0.794654369354248,-0.577350378036499,-0.187592402100563,-0.794654369354248,-0.577350378036499,-0.187592402100563,-0.794654369354248,-0.577350378036499,-0.187592402100563,0.303530931472778,-0.934172451496124,-0.187592536211014,0.303530871868134,-0.934172332286835,-0.187592521309853,0.303530901670456,-0.934172451496124,-0.187592536211014,0.982246875762939,0,-0.187592580914497,0.982246875762939,0,-0.187592580914497,0.982246875762939,0,-0.187592595815659,0.794654428958893,0.577350318431854,0.187592387199402,0.794654488563538,0.577350318431854,0.187592387199402,0.794654428958893,0.577350318431854,0.187592387199402,-0.303530961275101,0.934172332286835,0.187592759728432,-0.303530961275101,0.934172332286835,0.187592759728432,-0.303530961275101,0.934172332286835,0.187592759728432,-0.982246875762939,0,0.187592551112175,-0.982246875762939,0,0.187592551112175, +-0.982246875762939,0,0.187592551112175,-0.303530871868134,-0.934172391891479,0.187592446804047,-0.303530871868134,-0.934172332286835,0.187592446804047,-0.303530871868134,-0.934172391891479,0.187592446804047,0.794654548168182,-0.577350318431854,0.187592327594757,0.794654548168182,-0.577350318431854,0.187592327594757,0.794654548168182,-0.577350199222565,0.187592327594757,0.491123408079147,0.356822162866592,0.794654488563538,0.491123408079147,0.356822162866592,0.794654488563538,0.49112343788147,0.35682213306427,0.794654548168182,-0.18759249150753,0.577350318431854,0.794654428958893,-0.187592521309853,0.577350318431854,0.794654488563538,-0.187592521309853,0.577350318431854,0.794654488563538,-0.607061922550201,-1.24506513543565e-07,0.794654488563538,-0.607061982154846,-1.24506513543565e-07,0.794654548168182,-0.607061922550201,-1.24506513543565e-07,0.794654488563538,-0.187592431902885,-0.577350258827209,0.794654488563538,-0.187592417001724,-0.577350318431854,0.794654488563538,-0.187592431902885,-0.577350258827209,0.794654488563538,0.491123408079147,-0.356822073459625,0.794654488563538,0.491123408079147,-0.356822073459625,0.794654488563538,0.491123408079147,-0.356822043657303,0.794654548168182 + } + NormalsW: *60 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *30 { + a: 1,0.5,0.838104069232941,0.676208138465881,0.0881041139364243,0.823791801929474,0.176208198070526,0.5,0.0881041139364243,0.176208227872849,0.838104128837585,0.323791772127151,0.676208198070526,0.5,0.588104069232941,0.823791861534119,0.338104099035263,0.676208138465881,0.338104099035263,0.323791772127151,0.588104128837585,0.176208227872849,0.5,0.5,1.08810412883759,0.823791801929474,1.17620825767517,0.5,1.08810412883759,0.176208227872849 + } + UVIndex: *60 { + a: 0,12,1,0,13,12,0,14,13,0,5,14,0,1,5,1,12,7,2,3,8,3,4,9,14,5,10,5,1,6,1,7,6,2,8,7,3,9,8,4,10,9,5,6,10,6,7,11,7,8,11,8,9,11,9,10,11,10,6,11 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2055395289360, "Geometry::Target", "Shape" { + Version: 100 + Indexes: *12 { + a: 11,10,9,8,7,6,5,4,3,2,1,0 + } + Vertices: *36 { + a: 0.476942347103112,-0.00832856073975385,-0.128225789405406,0.476942347103112,-0.00832856073975385,-0.128225789405406,-0.29462876477357,-0.348165035247807,-0.0936588967451826,-0.1853285726773,0.0780703248456072,0.0251061035087332,0.0253878562677059,0.41790679935366,-0.00946078915148973,0.250748574823454,-0.0208541480824258,0.0387665840098634,0.560854681418277,0,0,-0.114336386073184,-0.337042252533136,0.148733525420539,-0.114336386073184,-0.337042252533136,0.148733525420539,0.0253878562677059,0.41790679935366,-0.00946078915148973,0.0253878562677059,0.41790679935366,-0.00946078915148973,-0.0839123358285647,-0.00832856073975385,-0.128225789405406 + } + Normals: *36 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Model: 2053019496512, "Model::pPlatonic1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2053920839552, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2055400281328, "Deformer::Shape", "BlendShape" { + Version: 100 + Properties70: { + P: "RootGroup", "KString", "", "", "" + P: "RootGroup|Target", "KString", "", "", "" + } + } + Deformer: 2055395745776, "SubDeformer::Shape.Target", "BlendShapeChannel" { + Version: 100 + Properties70: { + P: "DeformPercent", "Number", "", "A",100 + } + DeformPercent: 100 + FullWeights: *1 { + a: 100 + } + } + AnimationStack: 2055397543776, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2055402434880, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pPlatonic1, Model::RootNode + C: "OO",2053019496512,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2055402434880,2055397543776 + + ;Deformer::Shape, Geometry:: + C: "OO",2055400281328,2053023131024 + + ;Geometry::, Model::pPlatonic1 + C: "OO",2053023131024,2053019496512 + + ;Material::lambert1, Model::pPlatonic1 + C: "OO",2053920839552,2053019496512 + + ;SubDeformer::Shape.Target, Deformer::Shape + C: "OO",2055395745776,2055400281328 + + ;Geometry::Target, SubDeformer::Shape.Target + C: "OO",2055395289360,2055395745776 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_blender_old_exporter_6100_ascii.fbx b/modules/ufbx/data/synthetic_blender_old_exporter_6100_ascii.fbx new file mode 100644 index 0000000..b2fe8d2 --- /dev/null +++ b/modules/ufbx/data/synthetic_blender_old_exporter_6100_ascii.fbx @@ -0,0 +1,1980 @@ +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 01 + Day: 19 + Hour: 15 + Minute: 41 + Second: 02 + Millisecond: 0 + } + OtherFlags: { + FlagPLE: 0 + } +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 11 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Camera", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",7.481131553649902,5.343665122985840,6.507639884948730 + Property: "Lcl Rotation", "Lcl Rotation", "A+",22.768806135967264,142.108342135190838,34.348488581189514 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",49.134342 + Property: "FieldOfViewX", "FieldOfView", "A+",49.134342 + Property: "FieldOfViewY", "FieldOfView", "A+",28.841546 + Property: "FocalLength", "Number", "A+",35.000000 + Property: "FilmOffsetX", "Number", "A+",0.000000 + Property: "FilmOffsetY", "Number", "A+",0.000000 + Property: "BackgroundColor", "Color", "A+",0,0,0 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",3 + Property: "GateFit", "enum", "",2 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",1920 + Property: "AspectH", "double", "",1080 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",0.100000 + Property: "FarPlane", "double", "",99.999994 + Property: "FilmWidth", "double", "",1.259843 + Property: "FilmHeight", "double", "",0.708661 + Property: "FilmAspectRatio", "double", "",1.777778 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",0 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.777778 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 7.481132,5.343665,6.507640 + Up: -0.324014,0.895396,-0.305421 + LookAt: -0.685921,0.000000,0.727677 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Lamp", "Light" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4.076245307922363,5.903861999511719,-1.005453944206238 + Property: "Lcl Rotation", "Lcl Rotation", "A+",47.533574547422390,107.220753553002154,10.743666437040241 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,0.999999940395355,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + Property: "LightType", "enum", "",0 + Property: "CastLightOnObject", "bool", "",1 + Property: "DrawVolumetricLight", "bool", "",1 + Property: "DrawGroundProjection", "bool", "",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "",0 + Property: "GoboProperty", "object", "" + Property: "Color", "Color", "A+",1,1,1 + Property: "Fog", "Fog", "A+",50 + Property: "Color", "Color", "A",1.00,1.00,1.00 + Property: "Intensity", "Intensity", "A+",100.00 + Property: "Fog", "Fog", "A+",50 + Property: "LightType", "enum", "",0 + Property: "CastLightOnObject", "bool", "",1 + Property: "DrawGroundProjection", "bool", "",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "",0 + Property: "DrawVolumetricLight", "bool", "",1 + Property: "GoboProperty", "object", "" + Property: "DecayType", "enum", "",2 + Property: "EnableFarAttenuation", "bool", "",1 + Property: "FarAttenuationEnd", "double", "",60.00 + Property: "CastShadows", "bool", "",1 + Property: "ShadowColor", "ColorRGBA", "",0,0,0,1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Light" + GeometryVersion: 124 + } + Model: "Model::Cube", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: 1.000000,1.000000,-1.000000,1.000000,-1.000000,-1.000000,-1.000000,-1.000000,-1.000000,-1.000000,1.000000,-1.000000, + 1.000000,0.999999,1.000000,0.999999,-1.000001,1.000000,-1.000000,-1.000000,1.000000,-1.000000,1.000000,1.000000 + PolygonVertexIndex: 0,1,2,-4,4,7,6,-6,0,4,5,-2,1,5,6,-3,2,6,7,-4,4,0,3,-8 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000, + -0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000, + -1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::Material", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 1 + PoseNode: { + Node: "Model::Cube" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Cube", "Mesh" { + } + Model: "Model::Camera", "Camera" { + } + Model: "Model::Lamp", "Light" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::Material", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Cube", "Model::Scene" + Connect: "OO", "Model::Lamp", "Model::Scene" + Connect: "OO", "Model::Camera", "Model::Scene" + Connect: "OO", "Material::Material", "Model::Cube" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Cube" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Camera" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 7.481131553649902 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,7.481131553649902,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 5.343665122985840 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,5.343665122985840,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 6.507639884948730 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,6.507639884948730,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 22.768802720872678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,22.768802720872678,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 142.108328474812481 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,142.108328474812481,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 34.348495411378678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,34.348495411378678,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Lamp" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 4.076245307922363 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,4.076245307922363,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 5.903861999511719 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,5.903861999511719,L + Color: 0,1,0 + } + Channel: "Z" { + Default: -1.005453944206238 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-1.005453944206238,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 47.533574547422390 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,47.533574547422390,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 107.220760383191333 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,107.220760383191333,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 10.743664729492949 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,10.743664729492949,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.999999940395355 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.999999940395355,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_broken_cluster_7500_ascii.fbx b/modules/ufbx/data/synthetic_broken_cluster_7500_ascii.fbx new file mode 100644 index 0000000..0232214 --- /dev/null +++ b/modules/ufbx/data/synthetic_broken_cluster_7500_ascii.fbx @@ -0,0 +1,600 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 48 + Second: 47 + Millisecond: 311 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:47.308" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:47.308" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2519378084720, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 17 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 5 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2518685506688, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *72 { + a: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307,-0.5 + } + PolygonVertexIndex: *88 { + a: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22,18,19,23,-23,20,23,19,-17 + } + Edges: *44 { + a: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0,81,16,10 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *264 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + NormalsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *264 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1.78813934326172e-07,1,0,1.78813934326172e-07,1,0,1.78813934326172e-07,1,0,1.78813934326172e-07,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,-1.78813934326172e-07,0,1,-1.49011611938477e-07,0,1,-1.19209289550781e-07,0,1,-1.39077513949815e-07,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-1.78813934326172e-07,0,1,-1.49011611938477e-07,0,1,-1.19209289550781e-07,0,1,-1.39077513949815e-07,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,-1.39077513949815e-07,0,1,-1.19209289550781e-07,0,1,-7.94728620689966e-08,0,1,-1.19209289550781e-07,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-1.39077513949815e-07,0,1,-1.19209289550781e-07,0,1,-7.94728620689966e-08,0,1,-1.19209289550781e-07,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,-1.19209289550781e-07,0,1,-7.94728620689966e-08,0,1,0,0,1,-3.97364310344983e-08,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-1.19209289550781e-07,0,1,-7.94728620689966e-08,-0,1,0,0,1,-3.97364310344983e-08,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,-3.97364310344983e-08,0,1,0,0,1,0,0,1,0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-3.97364310344983e-08,-0,1,0,-0,1,0,-0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0 + } + BinormalsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *264 { + a: 1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,1.78813934326172e-07,1,0,1.49011611938477e-07,1,0,1.19209289550781e-07,1,0,1.39077513949815e-07,1,1,-0,-0,1,-0,0,1,-0,0,1,-0,0,0,-1.78813934326172e-07,-1,0,-1.49011611938477e-07,-1,0,-1.19209289550781e-07,-1,0,-1.39077513949815e-07,-1,1,0,0,1,0,0,1,0,0,1,0,0,0,1.39077513949815e-07,1,0,1.19209289550781e-07,1,0,7.94728620689966e-08,1,0,1.19209289550781e-07,1,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1.39077513949815e-07,-1,0,-1.19209289550781e-07,-1,0,-7.94728620689966e-08,-1,0,-1.19209289550781e-07,-1,1,0,0,1,0,0,1,0,0,1,0,0,0,1.19209289550781e-07,1,0,7.94728620689966e-08,1,0,-0,1,0,3.97364310344983e-08,1,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1.19209289550781e-07,-1,0,-7.94728620689966e-08,-1,0,0,-1,0,-3.97364310344983e-08,-1,1,0,0,1,0,0,1,0,0,1,0,0,0,3.97364310344983e-08,1,0,-0,1,0,-0,1,0,-0,1,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-3.97364310344983e-08,-1,0,0,-1,0,0,-1,0,0,-1,1,0,0,1,0,0,1,0,0,1,0,0 + } + TangentsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *76 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + } + UVIndex: *88 { + a: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35,34,29,31,37,35,33,36,30,27 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *44 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2517875174288, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2517875173904, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2517875175824, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2517875176592, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + Model: 2520147267648, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1.23333332718325,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2519924281408, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519950487616, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519261335616, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.15431302203923,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519866011712, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.07370048859635,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 2517703382240, "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 4 + PoseNode: { + Node: 2520147267648 + Matrix: *16 { + a: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 2519261335616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + } + PoseNode: { + Node: 2519950487616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + } + PoseNode: { + Node: 2519924281408 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + } + Material: 2520702827376, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2517867820672, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "Linear" + } + Deformer: 2517866673152, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 2,3,4,5,20,21,22,23 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + } + Deformer: 2519914550608, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 12,13,14,15,16,17,18,19 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + } + Deformer: 2519914546096, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 0,1,6,7,8,9,10,11 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2520147267648,0 + + ;Model::joint1, Model::RootNode + C: "OO",2519924281408,0 + + ;Deformer::, Geometry:: + C: "OO",2517867820672,2518685506688 + + ;Geometry::, Model::pCube1 + C: "OO",2518685506688,2520147267648 + + ;Material::lambert1, Model::pCube1 + C: "OO",2520702827376,2520147267648 + + ;NodeAttribute::, Model::joint1 + C: "OO",2517875174288,2519924281408 + + ;Model::joint2, Model::joint1 + C: "OO",2519950487616,2519924281408 + + ;NodeAttribute::, Model::joint2 + C: "OO",2517875173904,2519950487616 + + ;Model::joint3, Model::joint2 + C: "OO",2519261335616,2519950487616 + + ;NodeAttribute::, Model::joint3 + C: "OO",2517875175824,2519261335616 + + ;Model::joint4, Model::joint3 + C: "OO",2519866011712,2519261335616 + + ;NodeAttribute::, Model::joint4 + C: "OO",2517875176592,2519866011712 + + ;SubDeformer::, Deformer:: + C: "OO",2517866673152,2517867820672 + + ;SubDeformer::, Deformer:: + C: "OO",2519914550608,2517867820672 + + ;SubDeformer::, Deformer:: + C: "OO",2519914546096,2517867820672 + + ;Model::joint3, SubDeformer:: + C: "OO",2519261335616,2517866673152 + + ;Model::joint1, SubDeformer:: + C: "OO",2519924281408,2519914546096 +} diff --git a/modules/ufbx/data/synthetic_broken_filename_7500_ascii.fbx b/modules/ufbx/data/synthetic_broken_filename_7500_ascii.fbx new file mode 100644 index 0000000..9054505 --- /dev/null +++ b/modules/ufbx/data/synthetic_broken_filename_7500_ascii.fbx @@ -0,0 +1,503 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 1 + Hour: 19 + Minute: 56 + Second: 4 + Millisecond: 960 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "01/08/2021 16:56:04.959" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "01/08/2021 16:56:04.959" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2179871343728, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 18 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfacePhong" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Phong" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + P: "SpecularColor", "Color", "", "A",0.2,0.2,0.2 + P: "SpecularFactor", "Number", "", "A",1 + P: "ShininessExponent", "Number", "", "A",20 + P: "ReflectionColor", "Color", "", "A",0,0,0 + P: "ReflectionFactor", "Number", "", "A",1 + } + } + } + ObjectType: "Texture" { + Count: 6 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Video" { + Count: 6 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2179854704896, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2179263690608, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2180149143232, "Material::phong1", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "EmissiveColor", "Color", "", "A",0.5,0.5,0.5 + P: "AmbientColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "SpecularColor", "Color", "", "A",0.5,0.5,0.5 + P: "ReflectionColor", "Color", "", "A",0.5,0.5,0.5 + P: "ReflectionFactor", "Number", "", "A",0.5 + P: "Emissive", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Ambient", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Specular", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Shininess", "double", "Number", "",20 + P: "Opacity", "double", "Number", "",1 + P: "Reflectivity", "double", "Number", "",0.125 + } + } + Video: 2180149146592, "Video::file1", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/ª»ÌÝîÿ_diffuse.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\ª»ÌÝîÿ_diffuse.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/ª»ÌÝîÿ_diffuse.png" + RelativeFilename: "textures\ª»ÌÝîÿ_diffuse.png" + } + Texture: 2180149151392, "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/ª»ÌÝîÿ_diffuse.png" + RelativeFilename: "textures\ª»ÌÝîÿ_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + AnimationStack: 2180249157920, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2180157285776, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2179263690608,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2180157285776,2180249157920 + + ;Texture::file4, Material::phong1 + C: "OP",2180149152832,2180149143232, "EmissiveColor" + + ;Texture::file3, Material::phong1 + C: "OP",2180149144192,2180149143232, "AmbientColor" + + ;Texture::file1, Material::phong1 + C: "OP",2180149151392,2180149143232, "DiffuseColor" + + ;Texture::file2, Material::phong1 + C: "OP",2180149135552,2180149143232, "TransparentColor" + + ;Texture::file5, Material::phong1 + C: "OP",2180149139392,2180149143232, "SpecularColor" + + ;Texture::file6, Material::phong1 + C: "OP",2180149146112,2180149143232, "ReflectionColor" + + ;Video::file1, Texture::file1 + C: "OO",2180149146592,2180149151392 + + ;Video::file4, Texture::file4 + C: "OO",2180149147552,2180149152832 + + ;Video::file3, Texture::file3 + C: "OO",2180149134592,2180149144192 + + ;Video::file5, Texture::file5 + C: "OO",2180149152352,2180149139392 + + ;Video::file2, Texture::file2 + C: "OO",2180149136992,2180149135552 + + ;Video::file6, Texture::file6 + C: "OO",2180149156192,2180149146112 + + ;Geometry::, Model::pCube1 + C: "OO",2179854704896,2179263690608 + + ;Material::phong1, Model::pCube1 + C: "OO",2180149143232,2179263690608 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_broken_material_6100_ascii.fbx b/modules/ufbx/data/synthetic_broken_material_6100_ascii.fbx new file mode 100644 index 0000000..fa63f73 --- /dev/null +++ b/modules/ufbx/data/synthetic_broken_material_6100_ascii.fbx @@ -0,0 +1,371 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 33 + Second: 51 + Millisecond: 520 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "31/03/2020 18:33:51.517" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "31/03/2020 18:33:51.517" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_by_vertex_bad_index_7500_ascii.fbx b/modules/ufbx/data/synthetic_by_vertex_bad_index_7500_ascii.fbx new file mode 100644 index 0000000..b114f70 --- /dev/null +++ b/modules/ufbx/data/synthetic_by_vertex_bad_index_7500_ascii.fbx @@ -0,0 +1,378 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 6 + Hour: 15 + Minute: 52 + Second: 24 + Millisecond: 109 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_indexed_by_vertex_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_indexed_by_vertex_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "06/08/2021 12:52:24.108" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_indexed_by_vertex_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "06/08/2021 12:52:24.108" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2093283394976, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2092169136384, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5, 0.5,-0.5,0.5, -0.5,0.5,0.5, 0.5,0.5,0.5, -0.5,0.5,-0.5, 0.5,0.5,-0.5, -0.5,-0.5,-0.5, 0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "IndexToDirect" + Normals: *6 { + a: 0,-1,0, 0,1,0 + } + NormalsIndex: *8 { + a: 0,0,1,2,3,4,0,0 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2090157718112, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2092279121760, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2093307673664, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2092416809472, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2090157718112,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2092416809472,2093307673664 + + ;Geometry::, Model::pCube1 + C: "OO",2092169136384,2090157718112 + + ;Material::lambert1, Model::pCube1 + C: "OO",2092279121760,2090157718112 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_by_vertex_overflow_7500_ascii.fbx b/modules/ufbx/data/synthetic_by_vertex_overflow_7500_ascii.fbx new file mode 100644 index 0000000..233bb49 --- /dev/null +++ b/modules/ufbx/data/synthetic_by_vertex_overflow_7500_ascii.fbx @@ -0,0 +1,375 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 6 + Hour: 15 + Minute: 52 + Second: 24 + Millisecond: 109 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_indexed_by_vertex_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_indexed_by_vertex_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "06/08/2021 12:52:24.108" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_indexed_by_vertex_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "06/08/2021 12:52:24.108" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2093283394976, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2092169136384, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5, 0.5,-0.5,0.5, -0.5,0.5,0.5, 0.5,0.5,0.5, -0.5,0.5,-0.5, 0.5,0.5,-0.5, -0.5,-0.5,-0.5, 0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *12 { + a: 0,-1,0, 0,1,0, 0,0,-1, 0,0,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2090157718112, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2092279121760, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2093307673664, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2092416809472, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2090157718112,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2092416809472,2093307673664 + + ;Geometry::, Model::pCube1 + C: "OO",2092169136384,2090157718112 + + ;Material::lambert1, Model::pCube1 + C: "OO",2092279121760,2090157718112 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_color_suzanne.obj b/modules/ufbx/data/synthetic_color_suzanne.obj new file mode 100644 index 0000000..b370aa1 --- /dev/null +++ b/modules/ufbx/data/synthetic_color_suzanne.obj @@ -0,0 +1,2066 @@ +# ufbx:bad_normals +# Blender v3.2.0 OBJ File: '' +# www.blender.org +v 0.437500 -0.765625 0.164062 +v -0.437500 -0.765625 0.164062 +v 0.500000 -0.687500 0.093750 +v -0.500000 -0.687500 0.093750 +v 0.546875 -0.578125 0.054688 +v -0.546875 -0.578125 0.054688 +v 0.351562 -0.617188 -0.023438 +v -0.351562 -0.617188 -0.023438 +v 0.351562 -0.718750 0.031250 +v -0.351562 -0.718750 0.031250 +v 0.351562 -0.781250 0.132812 +v -0.351562 -0.781250 0.132812 +v 0.273438 -0.796875 0.164062 +v -0.273438 -0.796875 0.164062 +v 0.203125 -0.742188 0.093750 +v -0.203125 -0.742188 0.093750 +v 0.156250 -0.648438 0.054688 +v -0.156250 -0.648438 0.054688 +v 0.078125 -0.656250 0.242188 +v -0.078125 -0.656250 0.242188 +v 0.140625 -0.742188 0.242188 +v -0.140625 -0.742188 0.242188 +v 0.242188 -0.796875 0.242188 +v -0.242188 -0.796875 0.242188 +v 0.273438 -0.796875 0.328125 +v -0.273438 -0.796875 0.328125 +v 0.203125 -0.742188 0.390625 +v -0.203125 -0.742188 0.390625 +v 0.156250 -0.648438 0.437500 +v -0.156250 -0.648438 0.437500 +v 0.351562 -0.617188 0.515625 +v -0.351562 -0.617188 0.515625 +v 0.351562 -0.718750 0.453125 +v -0.351562 -0.718750 0.453125 +v 0.351562 -0.781250 0.359375 +v -0.351562 -0.781250 0.359375 +v 0.437500 -0.765625 0.328125 +v -0.437500 -0.765625 0.328125 +v 0.500000 -0.687500 0.390625 +v -0.500000 -0.687500 0.390625 +v 0.546875 -0.578125 0.437500 +v -0.546875 -0.578125 0.437500 +v 0.625000 -0.562500 0.242188 +v -0.625000 -0.562500 0.242188 +v 0.562500 -0.671875 0.242188 +v -0.562500 -0.671875 0.242188 +v 0.468750 -0.757812 0.242188 +v -0.468750 -0.757812 0.242188 +v 0.476562 -0.773438 0.242188 +v -0.476562 -0.773438 0.242188 +v 0.445312 -0.781250 0.335938 +v -0.445312 -0.781250 0.335938 +v 0.351562 -0.804688 0.375000 +v -0.351562 -0.804688 0.375000 +v 0.265625 -0.820312 0.335938 +v -0.265625 -0.820312 0.335938 +v 0.226562 -0.820312 0.242188 +v -0.226562 -0.820312 0.242188 +v 0.265625 -0.820312 0.156250 +v -0.265625 -0.820312 0.156250 +v 0.351562 -0.828125 0.242188 +v -0.351562 -0.828125 0.242188 +v 0.351562 -0.804688 0.117188 +v -0.351562 -0.804688 0.117188 +v 0.445312 -0.781250 0.156250 +v -0.445312 -0.781250 0.156250 +v 0.000000 -0.742188 0.429688 +v 0.000000 -0.820312 0.351562 +v 0.000000 -0.734375 -0.679688 +v 0.000000 -0.781250 -0.320312 +v 0.000000 -0.796875 -0.187500 +v 0.000000 -0.718750 -0.773438 +v 0.000000 -0.601562 0.406250 +v 0.000000 -0.570312 0.570312 +v 0.000000 0.546875 0.898438 +v 0.000000 0.851562 0.562500 +v 0.000000 0.828125 0.070312 +v 0.000000 0.351562 -0.382812 +v 0.203125 -0.562500 -0.187500 +v -0.203125 -0.562500 -0.187500 +v 0.312500 -0.570312 -0.437500 +v -0.312500 -0.570312 -0.437500 +v 0.351562 -0.570312 -0.695312 +v -0.351562 -0.570312 -0.695312 +v 0.367188 -0.531250 -0.890625 +v -0.367188 -0.531250 -0.890625 +v 0.328125 -0.523438 -0.945312 +v -0.328125 -0.523438 -0.945312 +v 0.179688 -0.554688 -0.968750 +v -0.179688 -0.554688 -0.968750 +v 0.000000 -0.578125 -0.984375 +v 0.437500 -0.531250 -0.140625 +v -0.437500 -0.531250 -0.140625 +v 0.632812 -0.539062 -0.039062 +v -0.632812 -0.539062 -0.039062 +v 0.828125 -0.445312 0.148438 +v -0.828125 -0.445312 0.148438 +v 0.859375 -0.593750 0.429688 +v -0.859375 -0.593750 0.429688 +v 0.710938 -0.625000 0.484375 +v -0.710938 -0.625000 0.484375 +v 0.492188 -0.687500 0.601562 +v -0.492188 -0.687500 0.601562 +v 0.320312 -0.734375 0.757812 +v -0.320312 -0.734375 0.757812 +v 0.156250 -0.757812 0.718750 +v -0.156250 -0.757812 0.718750 +v 0.062500 -0.750000 0.492188 +v -0.062500 -0.750000 0.492188 +v 0.164062 -0.773438 0.414062 +v -0.164062 -0.773438 0.414062 +v 0.125000 -0.765625 0.304688 +v -0.125000 -0.765625 0.304688 +v 0.203125 -0.742188 0.093750 +v -0.203125 -0.742188 0.093750 +v 0.375000 -0.703125 0.015625 +v -0.375000 -0.703125 0.015625 +v 0.492188 -0.671875 0.062500 +v -0.492188 -0.671875 0.062500 +v 0.625000 -0.648438 0.187500 +v -0.625000 -0.648438 0.187500 +v 0.640625 -0.648438 0.296875 +v -0.640625 -0.648438 0.296875 +v 0.601562 -0.664062 0.375000 +v -0.601562 -0.664062 0.375000 +v 0.429688 -0.718750 0.437500 +v -0.429688 -0.718750 0.437500 +v 0.250000 -0.757812 0.468750 +v -0.250000 -0.757812 0.468750 +v 0.000000 -0.734375 -0.765625 +v 0.109375 -0.734375 -0.718750 +v -0.109375 -0.734375 -0.718750 +v 0.117188 -0.710938 -0.835938 +v -0.117188 -0.710938 -0.835938 +v 0.062500 -0.695312 -0.882812 +v -0.062500 -0.695312 -0.882812 +v 0.000000 -0.687500 -0.890625 +v 0.000000 -0.750000 -0.195312 +v 0.000000 -0.742188 -0.140625 +v 0.101562 -0.742188 -0.148438 +v -0.101562 -0.742188 -0.148438 +v 0.125000 -0.750000 -0.226562 +v -0.125000 -0.750000 -0.226562 +v 0.085938 -0.742188 -0.289062 +v -0.085938 -0.742188 -0.289062 +v 0.398438 -0.671875 -0.046875 +v -0.398438 -0.671875 -0.046875 +v 0.617188 -0.625000 0.054688 +v -0.617188 -0.625000 0.054688 +v 0.726562 -0.601562 0.203125 +v -0.726562 -0.601562 0.203125 +v 0.742188 -0.656250 0.375000 +v -0.742188 -0.656250 0.375000 +v 0.687500 -0.726562 0.414062 +v -0.687500 -0.726562 0.414062 +v 0.437500 -0.796875 0.546875 +v -0.437500 -0.796875 0.546875 +v 0.312500 -0.835938 0.640625 +v -0.312500 -0.835938 0.640625 +v 0.203125 -0.851562 0.617188 +v -0.203125 -0.851562 0.617188 +v 0.101562 -0.843750 0.429688 +v -0.101562 -0.843750 0.429688 +v 0.125000 -0.812500 -0.101562 +v -0.125000 -0.812500 -0.101562 +v 0.210938 -0.710938 -0.445312 +v -0.210938 -0.710938 -0.445312 +v 0.250000 -0.687500 -0.703125 +v -0.250000 -0.687500 -0.703125 +v 0.265625 -0.664062 -0.820312 +v -0.265625 -0.664062 -0.820312 +v 0.234375 -0.632812 -0.914062 +v -0.234375 -0.632812 -0.914062 +v 0.164062 -0.632812 -0.929688 +v -0.164062 -0.632812 -0.929688 +v 0.000000 -0.640625 -0.945312 +v 0.000000 -0.726562 0.046875 +v 0.000000 -0.765625 0.210938 +v 0.328125 -0.742188 0.476562 +v -0.328125 -0.742188 0.476562 +v 0.164062 -0.750000 0.140625 +v -0.164062 -0.750000 0.140625 +v 0.132812 -0.757812 0.210938 +v -0.132812 -0.757812 0.210938 +v 0.117188 -0.734375 -0.687500 +v -0.117188 -0.734375 -0.687500 +v 0.078125 -0.750000 -0.445312 +v -0.078125 -0.750000 -0.445312 +v 0.000000 -0.750000 -0.445312 +v 0.000000 -0.742188 -0.328125 +v 0.093750 -0.781250 -0.273438 +v -0.093750 -0.781250 -0.273438 +v 0.132812 -0.796875 -0.226562 +v -0.132812 -0.796875 -0.226562 +v 0.109375 -0.781250 -0.132812 +v -0.109375 -0.781250 -0.132812 +v 0.039062 -0.781250 -0.125000 +v -0.039062 -0.781250 -0.125000 +v 0.000000 -0.828125 -0.203125 +v 0.046875 -0.812500 -0.148438 +v -0.046875 -0.812500 -0.148438 +v 0.093750 -0.812500 -0.156250 +v -0.093750 -0.812500 -0.156250 +v 0.109375 -0.828125 -0.226562 +v -0.109375 -0.828125 -0.226562 +v 0.078125 -0.804688 -0.250000 +v -0.078125 -0.804688 -0.250000 +v 0.000000 -0.804688 -0.289062 +v 0.257812 -0.554688 -0.312500 +v -0.257812 -0.554688 -0.312500 +v 0.164062 -0.710938 -0.242188 +v -0.164062 -0.710938 -0.242188 +v 0.179688 -0.710938 -0.312500 +v -0.179688 -0.710938 -0.312500 +v 0.234375 -0.554688 -0.250000 +v -0.234375 -0.554688 -0.250000 +v 0.000000 -0.687500 -0.875000 +v 0.046875 -0.687500 -0.867188 +v -0.046875 -0.687500 -0.867188 +v 0.093750 -0.710938 -0.820312 +v -0.093750 -0.710938 -0.820312 +v 0.093750 -0.726562 -0.742188 +v -0.093750 -0.726562 -0.742188 +v 0.000000 -0.656250 -0.781250 +v 0.093750 -0.664062 -0.750000 +v -0.093750 -0.664062 -0.750000 +v 0.093750 -0.640625 -0.812500 +v -0.093750 -0.640625 -0.812500 +v 0.046875 -0.632812 -0.851562 +v -0.046875 -0.632812 -0.851562 +v 0.000000 -0.632812 -0.859375 +v 0.171875 -0.781250 0.218750 +v -0.171875 -0.781250 0.218750 +v 0.187500 -0.773438 0.156250 +v -0.187500 -0.773438 0.156250 +v 0.335938 -0.757812 0.429688 +v -0.335938 -0.757812 0.429688 +v 0.273438 -0.773438 0.421875 +v -0.273438 -0.773438 0.421875 +v 0.421875 -0.773438 0.398438 +v -0.421875 -0.773438 0.398438 +v 0.562500 -0.695312 0.351562 +v -0.562500 -0.695312 0.351562 +v 0.585938 -0.687500 0.289062 +v -0.585938 -0.687500 0.289062 +v 0.578125 -0.679688 0.195312 +v -0.578125 -0.679688 0.195312 +v 0.476562 -0.718750 0.101562 +v -0.476562 -0.718750 0.101562 +v 0.375000 -0.742188 0.062500 +v -0.375000 -0.742188 0.062500 +v 0.226562 -0.781250 0.109375 +v -0.226562 -0.781250 0.109375 +v 0.179688 -0.781250 0.296875 +v -0.179688 -0.781250 0.296875 +v 0.210938 -0.781250 0.375000 +v -0.210938 -0.781250 0.375000 +v 0.234375 -0.757812 0.359375 +v -0.234375 -0.757812 0.359375 +v 0.195312 -0.757812 0.296875 +v -0.195312 -0.757812 0.296875 +v 0.242188 -0.757812 0.125000 +v -0.242188 -0.757812 0.125000 +v 0.375000 -0.726562 0.085938 +v -0.375000 -0.726562 0.085938 +v 0.460938 -0.703125 0.117188 +v -0.460938 -0.703125 0.117188 +v 0.546875 -0.671875 0.210938 +v -0.546875 -0.671875 0.210938 +v 0.554688 -0.671875 0.281250 +v -0.554688 -0.671875 0.281250 +v 0.531250 -0.679688 0.335938 +v -0.531250 -0.679688 0.335938 +v 0.414062 -0.750000 0.390625 +v -0.414062 -0.750000 0.390625 +v 0.281250 -0.765625 0.398438 +v -0.281250 -0.765625 0.398438 +v 0.335938 -0.750000 0.406250 +v -0.335938 -0.750000 0.406250 +v 0.203125 -0.750000 0.171875 +v -0.203125 -0.750000 0.171875 +v 0.195312 -0.750000 0.226562 +v -0.195312 -0.750000 0.226562 +v 0.109375 -0.609375 0.460938 +v -0.109375 -0.609375 0.460938 +v 0.195312 -0.617188 0.664062 +v -0.195312 -0.617188 0.664062 +v 0.335938 -0.593750 0.687500 +v -0.335938 -0.593750 0.687500 +v 0.484375 -0.554688 0.554688 +v -0.484375 -0.554688 0.554688 +v 0.679688 -0.492188 0.453125 +v -0.679688 -0.492188 0.453125 +v 0.796875 -0.460938 0.406250 +v -0.796875 -0.460938 0.406250 +v 0.773438 -0.375000 0.164062 +v -0.773438 -0.375000 0.164062 +v 0.601562 -0.414062 0.000000 +v -0.601562 -0.414062 0.000000 +v 0.437500 -0.468750 -0.093750 +v -0.437500 -0.468750 -0.093750 +v 0.000000 -0.289062 0.898438 +v 0.000000 0.078125 0.984375 +v 0.000000 0.671875 -0.195312 +v 0.000000 -0.187500 -0.460938 +v 0.000000 -0.460938 -0.976562 +v 0.000000 -0.343750 -0.804688 +v 0.000000 -0.320312 -0.570312 +v 0.000000 -0.281250 -0.484375 +v 0.851562 -0.054688 0.234375 +v -0.851562 -0.054688 0.234375 +v 0.859375 0.046875 0.320312 +v -0.859375 0.046875 0.320312 +v 0.773438 0.437500 0.265625 +v -0.773438 0.437500 0.265625 +v 0.460938 0.703125 0.437500 +v -0.460938 0.703125 0.437500 +v 0.734375 -0.070312 -0.046875 +v -0.734375 -0.070312 -0.046875 +v 0.593750 0.164062 -0.125000 +v -0.593750 0.164062 -0.125000 +v 0.640625 0.429688 -0.007812 +v -0.640625 0.429688 -0.007812 +v 0.335938 0.664062 0.054688 +v -0.335938 0.664062 0.054688 +v 0.234375 -0.406250 -0.351562 +v -0.234375 -0.406250 -0.351562 +v 0.179688 -0.257812 -0.414062 +v -0.179688 -0.257812 -0.414062 +v 0.289062 -0.382812 -0.710938 +v -0.289062 -0.382812 -0.710938 +v 0.250000 -0.390625 -0.500000 +v -0.250000 -0.390625 -0.500000 +v 0.328125 -0.398438 -0.914062 +v -0.328125 -0.398438 -0.914062 +v 0.140625 -0.367188 -0.757812 +v -0.140625 -0.367188 -0.757812 +v 0.125000 -0.359375 -0.539062 +v -0.125000 -0.359375 -0.539062 +v 0.164062 -0.437500 -0.945312 +v -0.164062 -0.437500 -0.945312 +v 0.218750 -0.429688 -0.281250 +v -0.218750 -0.429688 -0.281250 +v 0.210938 -0.468750 -0.226562 +v -0.210938 -0.468750 -0.226562 +v 0.203125 -0.500000 -0.171875 +v -0.203125 -0.500000 -0.171875 +v 0.210938 -0.164062 -0.390625 +v -0.210938 -0.164062 -0.390625 +v 0.296875 0.265625 -0.312500 +v -0.296875 0.265625 -0.312500 +v 0.343750 0.539062 -0.148438 +v -0.343750 0.539062 -0.148438 +v 0.453125 0.382812 0.867188 +v -0.453125 0.382812 0.867188 +v 0.453125 0.070312 0.929688 +v -0.453125 0.070312 0.929688 +v 0.453125 -0.234375 0.851562 +v -0.453125 -0.234375 0.851562 +v 0.460938 -0.429688 0.523438 +v -0.460938 -0.429688 0.523438 +v 0.726562 -0.335938 0.406250 +v -0.726562 -0.335938 0.406250 +v 0.632812 -0.281250 0.453125 +v -0.632812 -0.281250 0.453125 +v 0.640625 -0.054688 0.703125 +v -0.640625 -0.054688 0.703125 +v 0.796875 -0.125000 0.562500 +v -0.796875 -0.125000 0.562500 +v 0.796875 0.117188 0.617188 +v -0.796875 0.117188 0.617188 +v 0.640625 0.195312 0.750000 +v -0.640625 0.195312 0.750000 +v 0.640625 0.445312 0.679688 +v -0.640625 0.445312 0.679688 +v 0.796875 0.359375 0.539062 +v -0.796875 0.359375 0.539062 +v 0.617188 0.585938 0.328125 +v -0.617188 0.585938 0.328125 +v 0.484375 0.546875 0.023438 +v -0.484375 0.546875 0.023438 +v 0.820312 0.203125 0.328125 +v -0.820312 0.203125 0.328125 +v 0.406250 -0.148438 -0.171875 +v -0.406250 -0.148438 -0.171875 +v 0.429688 0.210938 -0.195312 +v -0.429688 0.210938 -0.195312 +v 0.890625 0.234375 0.406250 +v -0.890625 0.234375 0.406250 +v 0.773438 0.125000 -0.140625 +v -0.773438 0.125000 -0.140625 +v 1.039062 0.328125 -0.101562 +v -1.039062 0.328125 -0.101562 +v 1.281250 0.429688 0.054688 +v -1.281250 0.429688 0.054688 +v 1.351562 0.421875 0.320312 +v -1.351562 0.421875 0.320312 +v 1.234375 0.421875 0.507812 +v -1.234375 0.421875 0.507812 +v 1.023438 0.312500 0.476562 +v -1.023438 0.312500 0.476562 +v 1.015625 0.289062 0.414062 +v -1.015625 0.289062 0.414062 +v 1.187500 0.390625 0.437500 +v -1.187500 0.390625 0.437500 +v 1.265625 0.406250 0.289062 +v -1.265625 0.406250 0.289062 +v 1.210938 0.406250 0.078125 +v -1.210938 0.406250 0.078125 +v 1.031250 0.304688 -0.039062 +v -1.031250 0.304688 -0.039062 +v 0.828125 0.132812 -0.070312 +v -0.828125 0.132812 -0.070312 +v 0.921875 0.218750 0.359375 +v -0.921875 0.218750 0.359375 +v 0.945312 0.289062 0.304688 +v -0.945312 0.289062 0.304688 +v 0.882812 0.210938 -0.023438 +v -0.882812 0.210938 -0.023438 +v 1.039062 0.367188 0.000000 +v -1.039062 0.367188 0.000000 +v 1.187500 0.445312 0.093750 +v -1.187500 0.445312 0.093750 +v 1.234375 0.445312 0.250000 +v -1.234375 0.445312 0.250000 +v 1.171875 0.437500 0.359375 +v -1.171875 0.437500 0.359375 +v 1.023438 0.359375 0.343750 +v -1.023438 0.359375 0.343750 +v 0.843750 0.210938 0.289062 +v -0.843750 0.210938 0.289062 +v 0.835938 0.273438 0.171875 +v -0.835938 0.273438 0.171875 +v 0.757812 0.273438 0.093750 +v -0.757812 0.273438 0.093750 +v 0.820312 0.273438 0.085938 +v -0.820312 0.273438 0.085938 +v 0.843750 0.273438 0.015625 +v -0.843750 0.273438 0.015625 +v 0.812500 0.273438 -0.015625 +v -0.812500 0.273438 -0.015625 +v 0.726562 0.070312 0.000000 +v -0.726562 0.070312 0.000000 +v 0.718750 0.171875 -0.023438 +v -0.718750 0.171875 -0.023438 +v 0.718750 0.187500 0.039062 +v -0.718750 0.187500 0.039062 +v 0.796875 0.210938 0.203125 +v -0.796875 0.210938 0.203125 +v 0.890625 0.265625 0.242188 +v -0.890625 0.265625 0.242188 +v 0.890625 0.320312 0.234375 +v -0.890625 0.320312 0.234375 +v 0.812500 0.320312 -0.015625 +v -0.812500 0.320312 -0.015625 +v 0.851562 0.320312 0.015625 +v -0.851562 0.320312 0.015625 +v 0.828125 0.320312 0.078125 +v -0.828125 0.320312 0.078125 +v 0.765625 0.320312 0.093750 +v -0.765625 0.320312 0.093750 +v 0.843750 0.320312 0.171875 +v -0.843750 0.320312 0.171875 +v 1.039062 0.414062 0.328125 +v -1.039062 0.414062 0.328125 +v 1.187500 0.484375 0.343750 +v -1.187500 0.484375 0.343750 +v 1.257812 0.492188 0.242188 +v -1.257812 0.492188 0.242188 +v 1.210938 0.484375 0.085938 +v -1.210938 0.484375 0.085938 +v 1.046875 0.421875 0.000000 +v -1.046875 0.421875 0.000000 +v 0.882812 0.265625 -0.015625 +v -0.882812 0.265625 -0.015625 +v 0.953125 0.343750 0.289062 +v -0.953125 0.343750 0.289062 +v 0.890625 0.328125 0.109375 +v -0.890625 0.328125 0.109375 +v 0.937500 0.335938 0.062500 +v -0.937500 0.335938 0.062500 +v 1.000000 0.367188 0.125000 +v -1.000000 0.367188 0.125000 +v 0.960938 0.351562 0.171875 +v -0.960938 0.351562 0.171875 +v 1.015625 0.375000 0.234375 +v -1.015625 0.375000 0.234375 +v 1.054688 0.382812 0.187500 +v -1.054688 0.382812 0.187500 +v 1.109375 0.390625 0.210938 +v -1.109375 0.390625 0.210938 +v 1.085938 0.390625 0.273438 +v -1.085938 0.390625 0.273438 +v 1.023438 0.484375 0.437500 +v -1.023438 0.484375 0.437500 +v 1.250000 0.546875 0.468750 +v -1.250000 0.546875 0.468750 +v 1.367188 0.500000 0.296875 +v -1.367188 0.500000 0.296875 +v 1.312500 0.531250 0.054688 +v -1.312500 0.531250 0.054688 +v 1.039062 0.492188 -0.085938 +v -1.039062 0.492188 -0.085938 +v 0.789062 0.328125 -0.125000 +v -0.789062 0.328125 -0.125000 +v 0.859375 0.382812 0.382812 +v -0.859375 0.382812 0.382812 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn 0.6650 -0.7194 -0.2008 +vn -0.6650 -0.7194 -0.2008 +vn 0.8294 -0.4689 -0.3036 +vn -0.8294 -0.4689 -0.3036 +vn 0.4155 -0.4449 -0.7933 +vn -0.4155 -0.4449 -0.7933 +vn 0.3600 -0.7820 -0.5089 +vn -0.3600 -0.7820 -0.5089 +vn -0.0787 -0.8384 -0.5394 +vn 0.0787 -0.8384 -0.5394 +vn -0.2696 -0.4685 -0.8413 +vn 0.2696 -0.4685 -0.8413 +vn -0.7707 -0.5420 -0.3352 +vn 0.7707 -0.5420 -0.3352 +vn -0.4689 -0.8617 -0.1940 +vn 0.4689 -0.8617 -0.1940 +vn -0.4767 -0.8581 0.1907 +vn 0.4767 -0.8581 0.1907 +vn -0.7672 -0.5521 0.3264 +vn 0.7672 -0.5521 0.3264 +vn -0.2519 -0.5182 0.8173 +vn 0.2519 -0.5182 0.8173 +vn -0.0949 -0.8164 0.5696 +vn 0.0949 -0.8164 0.5696 +vn 0.3667 -0.7597 0.5370 +vn -0.3667 -0.7597 0.5370 +vn 0.4141 -0.4898 0.7672 +vn -0.4141 -0.4898 0.7672 +vn 0.8277 -0.4771 0.2952 +vn -0.8277 -0.4771 0.2952 +vn 0.6713 -0.7145 0.1971 +vn -0.6713 -0.7145 0.1971 +vn 0.8111 0.4867 0.3244 +vn -0.8111 0.4867 0.3244 +vn 0.2052 0.5334 0.8206 +vn -0.2052 0.5334 0.8206 +vn -0.4223 0.4607 0.7806 +vn 0.4223 0.4607 0.7806 +vn -0.8241 0.4658 0.3225 +vn 0.8241 0.4658 0.3225 +vn -0.8137 0.4650 -0.3487 +vn 0.8137 0.4650 -0.3487 +vn -0.4223 0.4607 -0.7806 +vn 0.4223 0.4607 -0.7806 +vn 0.2052 0.5334 -0.8206 +vn -0.2052 0.5334 -0.8206 +vn 0.7995 0.4875 -0.3510 +vn -0.7995 0.4875 -0.3510 +vn 0.4000 -0.9144 -0.0623 +vn -0.4000 -0.9144 -0.0623 +vn 0.3069 -0.9354 -0.1754 +vn -0.3069 -0.9354 -0.1754 +vn 0.0945 -0.9785 -0.1835 +vn -0.0945 -0.9785 -0.1835 +vn -0.0624 -0.9977 -0.0283 +vn 0.0624 -0.9977 -0.0283 +vn -0.0624 -0.9977 0.0260 +vn 0.0624 -0.9977 0.0260 +vn 0.0996 -0.9799 0.1729 +vn -0.0996 -0.9799 0.1729 +vn 0.3036 -0.9383 0.1656 +vn -0.3036 -0.9383 0.1656 +vn 0.4002 -0.9147 0.0572 +vn -0.4002 -0.9147 0.0572 +vn 0.1231 -0.4924 -0.8616 +vn -0.1231 -0.4924 -0.8616 +vn 0.2190 -0.4520 -0.8647 +vn -0.2190 -0.4520 -0.8647 +vn 0.5902 -0.6668 -0.4550 +vn -0.5902 -0.6668 -0.4550 +vn 0.7689 -0.6374 -0.0506 +vn -0.7689 -0.6374 -0.0506 +vn 0.7796 -0.6197 0.0900 +vn -0.7796 -0.6197 0.0900 +vn 0.3241 -0.4739 -0.8188 +vn -0.3241 -0.4739 -0.8188 +vn 0.3857 -0.6417 -0.6629 +vn -0.3857 -0.6417 -0.6629 +vn 0.6895 -0.5906 -0.4193 +vn -0.6895 -0.5906 -0.4193 +vn 0.6588 -0.6588 -0.3634 +vn -0.6588 -0.6588 -0.3634 +vn 0.5465 -0.7509 0.3707 +vn -0.5465 -0.7509 0.3707 +vn 0.5064 -0.5706 0.6464 +vn -0.5064 -0.5706 0.6464 +vn 0.6092 -0.6015 0.5167 +vn -0.6092 -0.6015 0.5167 +vn -0.0441 -0.7491 0.6610 +vn 0.0441 -0.7491 0.6610 +vn -0.7246 -0.6110 0.3187 +vn 0.7246 -0.6110 0.3187 +vn -0.5880 -0.5880 0.5554 +vn 0.5880 -0.5880 0.5554 +vn 0.5361 -0.7482 -0.3909 +vn -0.5361 -0.7482 -0.3909 +vn 0.2207 -0.8552 -0.4690 +vn -0.2207 -0.8552 -0.4690 +vn -0.0794 -0.8429 -0.5321 +vn 0.0794 -0.8429 -0.5321 +vn -0.0825 -0.7490 -0.6575 +vn 0.0825 -0.7490 -0.6575 +vn 0.0457 -0.8226 -0.5667 +vn -0.0457 -0.8226 -0.5667 +vn 0.2784 -0.9365 -0.2130 +vn -0.2784 -0.9365 -0.2130 +vn 0.3813 -0.9063 -0.1824 +vn -0.3813 -0.9063 -0.1824 +vn 0.3357 -0.8969 -0.2878 +vn -0.3357 -0.8969 -0.2878 +vn 0.3762 -0.9246 0.0603 +vn -0.3762 -0.9246 0.0603 +vn -0.1352 -0.9539 0.2680 +vn 0.1352 -0.9539 0.2680 +vn 0.3961 -0.8102 -0.4321 +vn -0.3961 -0.8102 -0.4321 +vn 0.1856 -0.9510 -0.2474 +vn -0.1856 -0.9510 -0.2474 +vn 0.0099 -0.9808 -0.1948 +vn -0.0099 -0.9808 -0.1948 +vn 0.0721 -0.7138 -0.6966 +vn -0.0721 -0.7138 -0.6966 +vn 0.1863 -0.7986 -0.5723 +vn -0.1863 -0.7986 -0.5723 +vn 0.3157 -0.9094 -0.2708 +vn -0.3157 -0.9094 -0.2708 +vn 0.3063 -0.9516 -0.0265 +vn -0.3063 -0.9516 -0.0265 +vn 0.3266 -0.9361 -0.1306 +vn -0.3266 -0.9361 -0.1306 +vn -0.0137 -0.9983 0.0574 +vn 0.0137 -0.9983 0.0574 +vn -0.0026 -0.9978 -0.0656 +vn 0.0026 -0.9978 -0.0656 +vn 0.0000 -1.0000 0.0000 +vn 0.8174 0.0442 -0.5744 +vn -0.8174 0.0442 -0.5744 +vn 0.9494 0.2144 0.2297 +vn -0.9494 0.2144 0.2297 +vn 0.0825 0.4124 0.9073 +vn -0.0825 0.4124 0.9073 +vn -0.8836 -0.3047 0.3555 +vn 0.8836 -0.3047 0.3555 +vn 0.4207 -0.2218 -0.8797 +vn -0.4207 -0.2218 -0.8797 +vn 0.2873 -0.7663 -0.5747 +vn -0.2873 -0.7663 -0.5747 +vn -0.6542 -0.4580 0.6019 +vn 0.6542 -0.4580 0.6019 +vn 0.1052 -0.6051 0.7892 +vn -0.1052 -0.6051 0.7892 +vn 0.7582 -0.5832 0.2916 +vn -0.7582 -0.5832 0.2916 +vn 0.3889 -0.5834 -0.7130 +vn -0.3889 -0.5834 -0.7130 +vn 0.0463 -0.9718 0.2314 +vn -0.0463 -0.9718 0.2314 +vn 0.0335 -0.9151 -0.4018 +vn -0.0335 -0.9151 -0.4018 +vn -0.4452 -0.8809 -0.1610 +vn 0.4452 -0.8809 -0.1610 +vn -0.2182 -0.8729 -0.4364 +vn 0.2182 -0.8729 -0.4364 +vn 0.4341 -0.8916 -0.1290 +vn -0.4341 -0.8916 -0.1290 +vn 0.3008 -0.9524 0.0501 +vn -0.3008 -0.9524 0.0501 +vn 0.8123 -0.4996 0.3010 +vn -0.8123 -0.4996 0.3010 +vn 0.8753 -0.4093 0.2574 +vn -0.8753 -0.4093 0.2574 +vn 0.9385 -0.3060 0.1601 +vn -0.9385 -0.3060 0.1601 +vn 0.2237 -0.7227 -0.6539 +vn -0.2237 -0.7227 -0.6539 +vn -0.1536 -0.9677 -0.1997 +vn 0.1536 -0.9677 -0.1997 +vn -0.2733 -0.9565 -0.1025 +vn 0.2733 -0.9565 -0.1025 +vn -0.0976 -0.9759 0.1952 +vn 0.0976 -0.9759 0.1952 +vn -0.1582 -0.2713 0.9494 +vn 0.1582 -0.2713 0.9494 +vn -0.6934 -0.1328 0.7082 +vn 0.6934 -0.1328 0.7082 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.3051 -0.1181 -0.9450 +vn -0.3051 -0.1181 -0.9450 +vn 0.0298 -0.9541 -0.2981 +vn -0.0298 -0.9541 -0.2981 +vn 0.1353 -0.9277 -0.3479 +vn -0.1353 -0.9277 -0.3479 +vn -0.5085 -0.8158 -0.2755 +vn 0.5085 -0.8158 -0.2755 +vn -0.3843 -0.9223 -0.0419 +vn 0.3843 -0.9223 -0.0419 +vn -0.2083 -0.9774 0.0374 +vn 0.2083 -0.9774 0.0374 +vn -0.5721 -0.6674 -0.4767 +vn 0.5721 -0.6674 -0.4767 +vn -0.1369 -0.6435 -0.7531 +vn 0.1369 -0.6435 -0.7531 +vn 0.4088 -0.6814 -0.6071 +vn -0.4088 -0.6814 -0.6071 +vn 0.5740 -0.7070 -0.4130 +vn -0.5740 -0.7070 -0.4130 +vn 0.5665 -0.8183 -0.0968 +vn -0.5665 -0.8183 -0.0968 +vn 0.5703 -0.8129 0.1180 +vn -0.5703 -0.8129 0.1180 +vn 0.4823 -0.6719 0.5621 +vn -0.4823 -0.6719 0.5621 +vn 0.2604 -0.7473 0.6114 +vn -0.2604 -0.7473 0.6114 +vn 0.1640 -0.9182 0.3607 +vn -0.1640 -0.9182 0.3607 +vn -0.0178 -0.9682 0.2495 +vn 0.0178 -0.9682 0.2495 +vn 0.3273 -0.8481 -0.4166 +vn -0.3273 -0.8481 -0.4166 +vn 0.2811 -0.9235 -0.2610 +vn -0.2811 -0.9235 -0.2610 +vn -0.2542 -0.7149 -0.6514 +vn 0.2542 -0.7149 -0.6514 +vn -0.0260 -0.5333 -0.8455 +vn 0.0260 -0.5333 -0.8455 +vn -0.3518 -0.8991 -0.2606 +vn 0.3518 -0.8991 -0.2606 +vn -0.3523 -0.9358 -0.0110 +vn 0.3523 -0.9358 -0.0110 +vn -0.1317 -0.8777 0.4608 +vn 0.1317 -0.8777 0.4608 +vn -0.0342 -0.7870 0.6159 +vn 0.0342 -0.7870 0.6159 +vn 0.3603 -0.7277 0.5836 +vn -0.3603 -0.7277 0.5836 +vn 0.4988 -0.6858 0.5300 +vn -0.4988 -0.6858 0.5300 +vn 0.6667 -0.6667 -0.3333 +vn -0.6667 -0.6667 -0.3333 +vn 0.8165 -0.5727 -0.0731 +vn -0.8165 -0.5727 -0.0731 +vn 0.7840 -0.6098 0.1161 +vn -0.7840 -0.6098 0.1161 +vn -0.5306 0.2461 0.8111 +vn 0.5306 0.2461 0.8111 +vn -0.8511 0.3730 0.3695 +vn 0.8511 0.3730 0.3695 +vn -0.2446 0.4331 0.8675 +vn 0.2446 0.4331 0.8675 +vn 0.5924 0.3030 0.7465 +vn -0.5924 0.3030 0.7465 +vn 0.3685 0.3118 0.8758 +vn -0.3685 0.3118 0.8758 +vn 0.2821 0.2880 0.9151 +vn -0.2821 0.2880 0.9151 +vn 0.8561 0.4991 0.1340 +vn -0.8561 0.4991 0.1340 +vn 0.5342 0.4376 -0.7233 +vn -0.5342 0.4376 -0.7233 +vn 0.3849 0.4368 -0.8131 +vn -0.3849 0.4368 -0.8131 +vn 0.2335 0.7800 -0.5806 +vn -0.2335 0.7800 -0.5806 +vn 0.2449 0.9678 -0.0583 +vn -0.2449 0.9678 -0.0583 +vn 0.1163 0.8837 -0.4535 +vn -0.1163 0.8837 -0.4535 +vn 0.1152 0.1388 -0.9836 +vn -0.1152 0.1388 -0.9836 +vn 0.1184 0.2260 -0.9669 +vn -0.1184 0.2260 -0.9669 +vn 0.9597 0.2808 -0.0085 +vn -0.9597 0.2808 -0.0085 +vn 0.9319 0.3242 0.1629 +vn -0.9319 0.3242 0.1629 +vn 0.1626 0.9865 0.0207 +vn -0.1626 0.9865 0.0207 +vn -0.0188 0.9758 -0.2177 +vn 0.0188 0.9758 -0.2177 +vn 0.7538 0.5884 -0.2926 +vn -0.7538 0.5884 -0.2926 +vn 0.9196 0.3678 0.1379 +vn -0.9196 0.3678 0.1379 +vn 0.9297 0.1944 0.3127 +vn -0.9297 0.1944 0.3127 +vn 0.9120 0.2329 0.3376 +vn -0.9120 0.2329 0.3376 +vn 0.9407 0.0607 0.3338 +vn -0.9407 0.0607 0.3338 +vn 0.1761 0.4402 -0.8805 +vn -0.1761 0.4402 -0.8805 +vn 0.3708 0.7991 -0.4733 +vn -0.3708 0.7991 -0.4733 +vn 0.3107 0.4660 -0.8284 +vn -0.3107 0.4660 -0.8284 +vn 0.2793 0.1287 -0.9515 +vn -0.2793 0.1287 -0.9515 +vn 0.3139 0.1807 -0.9321 +vn -0.3139 0.1807 -0.9321 +vn 0.9762 0.0609 -0.2083 +vn -0.9762 0.0609 -0.2083 +vn 0.8267 -0.2447 -0.5066 +vn -0.8267 -0.2447 -0.5066 +vn 0.3449 0.9315 -0.1158 +vn -0.3449 0.9315 -0.1158 +vn 0.1203 -0.2355 0.9644 +vn -0.1203 -0.2355 0.9644 +vn 0.1275 0.1851 0.9744 +vn -0.1275 0.1851 0.9744 +vn 0.3492 0.7241 0.5947 +vn -0.3492 0.7241 0.5947 +vn 0.4153 0.1449 0.8981 +vn -0.4153 0.1449 0.8981 +vn 0.1845 -0.6863 0.7036 +vn -0.1845 -0.6863 0.7036 +vn 0.6056 -0.1608 0.7794 +vn -0.6056 -0.1608 0.7794 +vn 0.7033 0.2053 0.6806 +vn -0.7033 0.2053 0.6806 +vn 0.6679 0.7166 0.2007 +vn -0.6679 0.7166 0.2007 +vn 0.4948 0.7528 0.4342 +vn -0.4948 0.7528 0.4342 +vn 0.6423 0.1761 0.7459 +vn -0.6423 0.1761 0.7459 +vn 0.7182 -0.1530 0.6788 +vn -0.7182 -0.1530 0.6788 +vn 0.7388 -0.5444 0.3972 +vn -0.7388 -0.5444 0.3972 +vn 0.3428 0.1579 0.9261 +vn -0.3428 0.1579 0.9261 +vn 0.2270 -0.7867 0.5740 +vn -0.2270 -0.7867 0.5740 +vn -0.1722 0.9795 0.1046 +vn 0.1722 0.9795 0.1046 +vn 0.0425 -0.4013 0.9150 +vn -0.0425 -0.4013 0.9150 +vn -0.1616 -0.9694 0.1847 +vn 0.1616 -0.9694 0.1847 +vn 0.9791 -0.0483 0.1973 +vn -0.9791 -0.0483 0.1973 +vn 0.9470 -0.3079 0.0918 +vn -0.9470 -0.3079 0.0918 +vn 0.9794 0.0661 0.1905 +vn -0.9794 0.0661 0.1905 +vn 0.9938 0.1070 0.0312 +vn -0.9938 0.1070 0.0312 +vn 0.7116 -0.0501 -0.7008 +vn -0.7116 -0.0501 -0.7008 +vn 0.3722 -0.0847 -0.9243 +vn -0.3722 -0.0847 -0.9243 +vn 0.4465 -0.2310 -0.8644 +vn -0.4465 -0.2310 -0.8644 +vn 0.6066 -0.2405 -0.7578 +vn -0.6066 -0.2405 -0.7578 +vn 0.7325 -0.2407 -0.6368 +vn -0.7325 -0.2407 -0.6368 +vn 0.2637 -0.8533 -0.4499 +vn -0.2637 -0.8533 -0.4499 +vn 0.5568 0.7673 -0.3181 +vn -0.5568 0.7673 -0.3181 +vn 0.5004 0.8190 -0.2807 +vn -0.5004 0.8190 -0.2807 +vn 0.3190 0.4205 -0.8494 +vn -0.3190 0.4205 -0.8494 +vn 0.7198 0.2793 -0.6356 +vn -0.7198 0.2793 -0.6356 +vn 0.4972 0.7473 -0.4408 +vn -0.4972 0.7473 -0.4408 +vn 0.3506 -0.8557 0.3807 +vn -0.3506 -0.8557 0.3807 +vn 0.4566 -0.8730 0.1715 +vn -0.4566 -0.8730 0.1715 +vn 0.2583 -0.9603 0.1055 +vn -0.2583 -0.9603 0.1055 +vn 0.2455 -0.9661 -0.0802 +vn -0.2455 -0.9661 -0.0802 +vn 0.4643 -0.8837 -0.0599 +vn -0.4643 -0.8837 -0.0599 +vn 0.6225 -0.7210 -0.3045 +vn -0.6225 -0.7210 -0.3045 +vn 0.4500 -0.6027 0.6590 +vn -0.4500 -0.6027 0.6590 +vn -0.2667 -0.4884 0.8309 +vn 0.2667 -0.4884 0.8309 +vn -0.8284 -0.5111 0.2291 +vn 0.8284 -0.5111 0.2291 +vn -0.5251 -0.7727 -0.3566 +vn 0.5251 -0.7727 -0.3566 +vn 0.4546 -0.6873 -0.5665 +vn -0.4546 -0.6873 -0.5665 +vn 0.6996 -0.5552 -0.4497 +vn -0.6996 -0.5552 -0.4497 +vn 0.7220 0.1126 -0.6827 +vn -0.7220 0.1126 -0.6827 +vn -0.1919 -0.9388 0.2860 +vn 0.1919 -0.9388 0.2860 +vn 0.9048 0.2047 -0.3734 +vn -0.9048 0.2047 -0.3734 +vn 0.1034 -0.9825 0.1551 +vn -0.1034 -0.9825 0.1551 +vn 0.0841 -0.3530 0.9318 +vn -0.0841 -0.3530 0.9318 +vn 0.6446 -0.7594 -0.0883 +vn -0.6446 -0.7594 -0.0883 +vn 0.4309 -0.7678 0.4740 +vn -0.4309 -0.7678 0.4740 +vn 0.8032 -0.3462 -0.4847 +vn -0.8032 -0.3462 -0.4847 +vn 0.5811 -0.7014 -0.4128 +vn -0.5811 -0.7014 -0.4128 +vn 0.5910 -0.6822 -0.4305 +vn -0.5910 -0.6822 -0.4305 +vn 0.9818 0.0591 -0.1804 +vn -0.9818 0.0591 -0.1804 +vn 0.9105 0.1175 -0.3965 +vn -0.9105 0.1175 -0.3965 +vn 0.9972 0.0725 -0.0181 +vn -0.9972 0.0725 -0.0181 +vn 0.7313 -0.1925 -0.6543 +vn -0.7313 -0.1925 -0.6543 +vn 0.7867 -0.1073 -0.6079 +vn -0.7867 -0.1073 -0.6079 +vn 0.7022 -0.1170 -0.7022 +vn -0.7022 -0.1170 -0.7022 +vn 0.1840 0.0511 0.9816 +vn -0.1840 0.0511 0.9816 +vn 0.9352 -0.1284 0.3301 +vn -0.9352 -0.1284 0.3301 +vn 0.6633 -0.0553 -0.7463 +vn -0.6633 -0.0553 -0.7463 +vn -0.0085 -0.0767 0.9970 +vn 0.0085 -0.0767 0.9970 +vn 0.6237 -0.3354 -0.7061 +vn -0.6237 -0.3354 -0.7061 +vn 0.2733 -0.3587 -0.8925 +vn -0.2733 -0.3587 -0.8925 +vn -0.8328 0.2200 -0.5080 +vn 0.8328 0.2200 -0.5080 +vn -0.8339 0.4981 0.2377 +vn 0.8339 0.4981 0.2377 +vn -0.5655 0.2539 0.7847 +vn 0.5655 0.2539 0.7847 +vn -0.0560 -0.0672 0.9962 +vn 0.0560 -0.0672 0.9962 +vn 0.1445 -0.9893 0.0222 +vn -0.1445 -0.9893 0.0222 +vn 0.3275 -0.9427 0.0645 +vn -0.3275 -0.9427 0.0645 +vn 0.3127 -0.9496 0.0232 +vn -0.3127 -0.9496 0.0232 +vn 0.1710 -0.9849 0.0274 +vn -0.1710 -0.9849 0.0274 +vn 0.3487 -0.8929 0.2849 +vn -0.3487 -0.8929 0.2849 +vn 0.4006 -0.9156 -0.0343 +vn -0.4006 -0.9156 -0.0343 +vn 0.2572 -0.9645 -0.0603 +vn -0.2572 -0.9645 -0.0603 +vn 0.0637 -0.9979 -0.0106 +vn -0.0637 -0.9979 -0.0106 +vn -0.3637 -0.6101 0.7039 +vn 0.3637 -0.6101 0.7039 +vn 0.6299 -0.7759 0.0355 +vn -0.6299 -0.7759 0.0355 +vn 0.4472 -0.8717 -0.2002 +vn -0.4472 -0.8717 -0.2002 +vn 0.5072 -0.8348 -0.2141 +vn -0.5072 -0.8348 -0.2141 +vn 0.5258 -0.8093 0.2619 +vn -0.5258 -0.8093 0.2619 +vn 0.2980 -0.7580 0.5802 +vn -0.2980 -0.7580 0.5802 +vn 0.0930 0.0805 -0.9924 +vn -0.0930 0.0805 -0.9924 +vn 0.5006 -0.0080 -0.8657 +vn -0.5006 -0.0080 -0.8657 +vn 0.9285 -0.2748 -0.2497 +vn -0.9285 -0.2748 -0.2497 +vn 0.8393 0.0378 0.5424 +vn -0.8393 0.0378 0.5424 +vn -0.2355 0.2589 0.9367 +vn 0.2355 0.2589 0.9367 +vn -0.4499 0.1285 0.8838 +vn 0.4499 0.1285 0.8838 +vn -0.5384 0.8427 -0.0098 +vn 0.5384 0.8427 -0.0098 +vn -0.1910 0.9813 -0.0241 +vn 0.1910 0.9813 -0.0241 +vn 0.4046 0.9141 0.0266 +vn -0.4046 0.9141 0.0266 +vn -0.7819 -0.0197 0.6231 +vn 0.7819 -0.0197 0.6231 +vn 0.5428 0.8142 -0.2063 +vn -0.5428 0.8142 -0.2063 +vn -0.2474 0.2945 -0.9231 +vn 0.2474 0.2945 -0.9231 +s off +f 47/1/1 1/2/1 3/3/1 45/4/1 +f 4/5/2 2/6/2 48/7/2 46/8/2 +f 45/4/3 3/3/3 5/9/3 43/10/3 +f 6/11/4 4/5/4 46/8/4 44/12/4 +f 3/3/5 9/13/5 7/14/5 5/9/5 +f 8/15/6 10/16/6 4/5/6 6/11/6 +f 1/2/7 11/17/7 9/13/7 3/3/7 +f 10/16/8 12/18/8 2/6/8 4/5/8 +f 11/17/9 13/19/9 15/20/9 9/13/9 +f 16/21/10 14/22/10 12/18/10 10/16/10 +f 9/13/11 15/20/11 17/23/11 7/14/11 +f 18/24/12 16/21/12 10/16/12 8/15/12 +f 15/20/13 21/25/13 19/26/13 17/23/13 +f 20/27/14 22/28/14 16/21/14 18/24/14 +f 13/19/15 23/29/15 21/25/15 15/20/15 +f 22/28/16 24/30/16 14/22/16 16/21/16 +f 23/29/17 25/31/17 27/32/17 21/25/17 +f 28/33/18 26/34/18 24/30/18 22/28/18 +f 21/25/19 27/32/19 29/35/19 19/26/19 +f 30/36/20 28/33/20 22/28/20 20/27/20 +f 27/32/21 33/37/21 31/38/21 29/35/21 +f 32/39/22 34/40/22 28/33/22 30/36/22 +f 25/31/23 35/41/23 33/37/23 27/32/23 +f 34/40/24 36/42/24 26/34/24 28/33/24 +f 35/41/25 37/43/25 39/44/25 33/37/25 +f 40/45/26 38/46/26 36/42/26 34/40/26 +f 33/37/27 39/44/27 41/47/27 31/38/27 +f 42/48/28 40/45/28 34/40/28 32/39/28 +f 39/44/29 45/4/29 43/10/29 41/47/29 +f 44/12/30 46/8/30 40/45/30 42/48/30 +f 37/43/31 47/1/31 45/4/31 39/44/31 +f 46/8/32 48/7/32 38/46/32 40/45/32 +f 47/1/33 37/43/33 51/49/33 49/50/33 +f 52/51/34 38/46/34 48/7/34 50/52/34 +f 37/43/35 35/41/35 53/53/35 51/49/35 +f 54/54/36 36/42/36 38/46/36 52/51/36 +f 35/41/37 25/31/37 55/55/37 53/53/37 +f 56/56/38 26/34/38 36/42/38 54/54/38 +f 25/31/39 23/29/39 57/57/39 55/55/39 +f 58/58/40 24/30/40 26/34/40 56/56/40 +f 23/29/41 13/19/41 59/59/41 57/57/41 +f 60/60/42 14/22/42 24/30/42 58/58/42 +f 13/19/43 11/17/43 63/61/43 59/59/43 +f 64/62/44 12/18/44 14/22/44 60/60/44 +f 11/17/45 1/2/45 65/63/45 63/61/45 +f 66/64/46 2/6/46 12/18/46 64/62/46 +f 1/2/47 47/1/47 49/50/47 65/63/47 +f 50/52/48 48/7/48 2/6/48 66/64/48 +f 61/65/49 65/63/49 49/50/49 +f 50/52/50 66/64/50 62/66/50 +f 63/61/51 65/63/51 61/65/51 +f 62/66/52 66/64/52 64/62/52 +f 61/65/53 59/59/53 63/61/53 +f 64/62/54 60/60/54 62/66/54 +f 61/65/55 57/57/55 59/59/55 +f 60/60/56 58/58/56 62/66/56 +f 61/65/57 55/55/57 57/57/57 +f 58/58/58 56/56/58 62/66/58 +f 61/65/59 53/53/59 55/55/59 +f 56/56/60 54/54/60 62/66/60 +f 61/65/61 51/49/61 53/53/61 +f 54/54/62 52/51/62 62/66/62 +f 61/65/63 49/50/63 51/49/63 +f 52/51/64 50/52/64 62/66/64 +f 89/67/65 174/68/65 176/69/65 91/70/65 +f 176/69/66 175/71/66 90/72/66 91/70/66 +f 87/73/67 172/74/67 174/68/67 89/67/67 +f 175/71/68 173/75/68 88/76/68 90/72/68 +f 85/77/69 170/78/69 172/74/69 87/73/69 +f 173/75/70 171/79/70 86/80/70 88/76/70 +f 83/81/71 168/82/71 170/78/71 85/77/71 +f 171/79/72 169/83/72 84/84/72 86/80/72 +f 81/85/73 166/86/73 168/82/73 83/81/73 +f 169/83/74 167/87/74 82/88/74 84/84/74 +f 79/89/75 92/90/75 146/91/75 164/92/75 +f 147/93/76 93/94/76 80/95/76 165/96/76 +f 92/90/77 94/97/77 148/98/77 146/91/77 +f 149/99/78 95/100/78 93/94/78 147/93/78 +f 94/97/79 96/101/79 150/102/79 148/98/79 +f 151/103/80 97/104/80 95/100/80 149/99/80 +f 96/101/81 98/105/81 152/106/81 150/102/81 +f 153/107/82 99/108/82 97/104/82 151/103/82 +f 98/105/83 100/109/83 154/110/83 152/106/83 +f 155/111/84 101/112/84 99/108/84 153/107/84 +f 100/109/85 102/113/85 156/114/85 154/110/85 +f 157/115/86 103/116/86 101/112/86 155/111/86 +f 102/113/87 104/117/87 158/118/87 156/114/87 +f 159/119/88 105/120/88 103/116/88 157/115/88 +f 104/117/89 106/121/89 160/122/89 158/118/89 +f 161/123/90 107/124/90 105/120/90 159/119/90 +f 106/121/91 108/125/91 162/126/91 160/122/91 +f 163/127/92 109/128/92 107/124/92 161/123/92 +f 108/125/93 67/129/93 68/130/93 162/126/93 +f 68/130/94 67/129/94 109/128/94 163/127/94 +f 110/131/95 128/132/95 160/122/95 162/126/95 +f 161/123/96 129/133/96 111/134/96 163/127/96 +f 128/132/97 179/135/97 158/118/97 160/122/97 +f 159/119/98 180/136/98 129/133/98 161/123/98 +f 126/137/99 156/114/99 158/118/99 179/135/99 +f 159/119/100 157/115/100 127/138/100 180/136/100 +f 124/139/101 154/110/101 156/114/101 126/137/101 +f 157/115/102 155/111/102 125/140/102 127/138/102 +f 122/141/103 152/106/103 154/110/103 124/139/103 +f 155/111/104 153/107/104 123/142/104 125/140/104 +f 120/143/105 150/102/105 152/106/105 122/141/105 +f 153/107/106 151/103/106 121/144/106 123/142/106 +f 118/145/107 148/98/107 150/102/107 120/143/107 +f 151/103/108 149/99/108 119/146/108 121/144/108 +f 116/147/109 146/91/109 148/98/109 118/145/109 +f 149/99/110 147/93/110 117/148/110 119/146/110 +f 114/149/111 164/92/111 146/91/111 116/147/111 +f 147/93/112 165/96/112 115/150/112 117/148/112 +f 114/149/113 181/151/113 177/152/113 164/92/113 +f 177/152/114 182/153/114 115/150/114 165/96/114 +f 110/131/115 162/126/115 68/130/115 112/154/115 +f 68/130/116 163/127/116 111/134/116 113/155/116 +f 112/154/117 68/130/117 178/156/117 183/157/117 +f 178/156/118 68/130/118 113/155/118 184/158/118 +f 177/152/119 181/151/119 183/157/119 178/156/119 +f 184/158/120 182/153/120 177/152/120 178/156/120 +f 135/159/121 137/160/121 176/69/121 174/68/121 +f 176/69/122 137/160/122 136/161/122 175/71/122 +f 133/162/123 135/159/123 174/68/123 172/74/123 +f 175/71/124 136/161/124 134/163/124 173/75/124 +f 131/164/125 133/162/125 172/74/125 170/78/125 +f 173/75/126 134/163/126 132/165/126 171/79/126 +f 166/86/127 187/166/127 185/167/127 168/82/127 +f 186/168/128 188/169/128 167/87/128 169/83/128 +f 131/164/129 170/78/129 168/82/129 185/167/129 +f 169/83/130 171/79/130 132/165/130 186/168/130 +f 144/170/131 190/171/131 189/172/131 187/166/131 +f 189/172/132 190/171/132 145/173/132 188/169/132 +f 185/167/133 187/166/133 189/172/133 69/174/133 +f 189/172/134 188/169/134 186/168/134 69/174/134 +f 130/175/135 131/164/135 185/167/135 69/174/135 +f 186/168/135 132/165/135 130/175/135 69/174/135 +f 142/176/136 193/177/136 191/178/136 144/170/136 +f 192/179/137 194/180/137 143/181/137 145/173/137 +f 140/182/138 195/183/138 193/177/138 142/176/138 +f 194/180/139 196/184/139 141/185/139 143/181/139 +f 139/186/140 197/187/140 195/183/140 140/182/140 +f 196/184/141 198/188/141 139/186/141 141/185/141 +f 138/189/142 71/190/142 197/187/142 139/186/142 +f 198/188/143 71/190/143 138/189/143 139/186/143 +f 190/171/144 144/170/144 191/178/144 70/191/144 +f 192/179/145 145/173/145 190/171/145 70/191/145 +f 70/191/146 191/178/146 206/192/146 208/193/146 +f 207/194/147 192/179/147 70/191/147 208/193/147 +f 71/190/148 199/195/148 200/196/148 197/187/148 +f 201/197/149 199/195/149 71/190/149 198/188/149 +f 197/187/150 200/196/150 202/198/150 195/183/150 +f 203/199/151 201/197/151 198/188/151 196/184/151 +f 195/183/152 202/198/152 204/200/152 193/177/152 +f 205/201/153 203/199/153 196/184/153 194/180/153 +f 193/177/154 204/200/154 206/192/154 191/178/154 +f 207/194/155 205/201/155 194/180/155 192/179/155 +f 199/195/156 204/200/156 202/198/156 200/196/156 +f 203/199/157 205/201/157 199/195/157 201/197/157 +f 199/195/158 208/193/158 206/192/158 204/200/158 +f 207/194/159 208/193/159 199/195/159 205/201/159 +f 139/186/160 140/182/160 164/92/160 177/152/160 +f 165/96/161 141/185/161 139/186/161 177/152/161 +f 140/182/162 142/176/162 211/202/162 164/92/162 +f 212/203/163 143/181/163 141/185/163 165/96/163 +f 142/176/164 144/170/164 213/204/164 211/202/164 +f 214/205/165 145/173/165 143/181/165 212/203/165 +f 144/170/166 187/166/166 166/86/166 213/204/166 +f 167/87/167 188/169/167 145/173/167 214/205/167 +f 81/85/168 209/206/168 213/204/168 166/86/168 +f 214/205/169 210/207/169 82/88/169 167/87/169 +f 209/206/170 215/208/170 211/202/170 213/204/170 +f 212/203/171 216/209/171 210/207/171 214/205/171 +f 79/89/172 164/92/172 211/202/172 215/208/172 +f 212/203/173 165/96/173 80/95/173 216/209/173 +f 131/164/174 130/175/174 72/210/174 222/211/174 +f 72/210/175 130/175/175 132/165/175 223/212/175 +f 133/162/176 131/164/176 222/211/176 220/213/176 +f 223/212/177 132/165/177 134/163/177 221/214/177 +f 135/159/178 133/162/178 220/213/178 218/215/178 +f 221/214/179 134/163/179 136/161/179 219/216/179 +f 137/160/180 135/159/180 218/215/180 217/217/180 +f 219/216/181 136/161/181 137/160/181 217/217/181 +f 217/217/182 218/215/182 229/218/182 231/219/182 +f 230/220/183 219/216/183 217/217/183 231/219/183 +f 218/215/184 220/213/184 227/221/184 229/218/184 +f 228/222/185 221/214/185 219/216/185 230/220/185 +f 220/213/186 222/211/186 225/223/186 227/221/186 +f 226/224/187 223/212/187 221/214/187 228/222/187 +f 222/211/188 72/210/188 224/225/188 225/223/188 +f 224/225/189 72/210/189 223/212/189 226/224/189 +f 224/225/190 231/219/190 229/218/190 225/223/190 +f 230/220/191 231/219/191 224/225/191 226/224/191 +f 225/223/192 229/218/192 227/221/192 +f 228/222/193 230/220/193 226/224/193 +f 183/157/194 181/151/194 234/226/194 232/227/194 +f 235/228/195 182/153/195 184/158/195 233/229/195 +f 112/154/196 183/157/196 232/227/196 254/230/196 +f 233/229/197 184/158/197 113/155/197 255/231/197 +f 110/131/198 112/154/198 254/230/198 256/232/198 +f 255/231/199 113/155/199 111/134/199 257/233/199 +f 181/151/200 114/149/200 252/234/200 234/226/200 +f 253/235/201 115/150/201 182/153/201 235/228/201 +f 114/149/202 116/147/202 250/236/202 252/234/202 +f 251/237/203 117/148/203 115/150/203 253/235/203 +f 116/147/204 118/145/204 248/238/204 250/236/204 +f 249/239/205 119/146/205 117/148/205 251/237/205 +f 118/145/206 120/143/206 246/240/206 248/238/206 +f 247/241/207 121/144/207 119/146/207 249/239/207 +f 120/143/208 122/141/208 244/242/208 246/240/208 +f 245/243/209 123/142/209 121/144/209 247/241/209 +f 122/141/210 124/139/210 242/244/210 244/242/210 +f 243/245/211 125/140/211 123/142/211 245/243/211 +f 124/139/212 126/137/212 240/246/212 242/244/212 +f 241/247/213 127/138/213 125/140/213 243/245/213 +f 126/137/214 179/135/214 236/248/214 240/246/214 +f 237/249/215 180/136/215 127/138/215 241/247/215 +f 179/135/216 128/132/216 238/250/216 236/248/216 +f 239/251/217 129/133/217 180/136/217 237/249/217 +f 128/132/218 110/131/218 256/232/218 238/250/218 +f 257/233/219 111/134/219 129/133/219 239/251/219 +f 238/250/220 256/232/220 258/252/220 276/253/220 +f 259/254/221 257/233/221 239/251/221 277/255/221 +f 236/248/222 238/250/222 276/253/222 278/256/222 +f 277/255/223 239/251/223 237/249/223 279/257/223 +f 240/246/224 236/248/224 278/256/224 274/258/224 +f 279/257/225 237/249/225 241/247/225 275/259/225 +f 242/244/226 240/246/226 274/258/226 272/260/226 +f 275/259/227 241/247/227 243/245/227 273/261/227 +f 244/242/228 242/244/228 272/260/228 270/262/228 +f 273/261/229 243/245/229 245/243/229 271/263/229 +f 246/240/230 244/242/230 270/262/230 268/264/230 +f 271/263/231 245/243/231 247/241/231 269/265/231 +f 248/238/232 246/240/232 268/264/232 266/266/232 +f 269/265/233 247/241/233 249/239/233 267/267/233 +f 250/236/234 248/238/234 266/266/234 264/268/234 +f 267/267/235 249/239/235 251/237/235 265/269/235 +f 252/234/236 250/236/236 264/268/236 262/270/236 +f 265/269/237 251/237/237 253/235/237 263/271/237 +f 234/226/238 252/234/238 262/270/238 280/272/238 +f 263/271/239 253/235/239 235/228/239 281/273/239 +f 256/232/240 254/230/240 260/274/240 258/252/240 +f 261/275/241 255/231/241 257/233/241 259/254/241 +f 254/230/242 232/227/242 282/276/242 260/274/242 +f 283/277/243 233/229/243 255/231/243 261/275/243 +f 232/227/244 234/226/244 280/272/244 282/276/244 +f 281/273/245 235/228/245 233/229/245 283/277/245 +f 67/129/246 108/125/246 284/278/246 73/279/246 +f 285/280/247 109/128/247 67/129/247 73/279/247 +f 108/125/248 106/121/248 286/281/248 284/278/248 +f 287/282/249 107/124/249 109/128/249 285/280/249 +f 106/121/250 104/117/250 288/283/250 286/281/250 +f 289/284/251 105/120/251 107/124/251 287/282/251 +f 104/117/252 102/113/252 290/285/252 288/283/252 +f 291/286/253 103/116/253 105/120/253 289/284/253 +f 102/113/254 100/109/254 292/287/254 290/285/254 +f 293/288/255 101/112/255 103/116/255 291/286/255 +f 100/109/256 98/105/256 294/289/256 292/287/256 +f 295/290/257 99/108/257 101/112/257 293/288/257 +f 98/105/258 96/101/258 296/291/258 294/289/258 +f 297/292/259 97/104/259 99/108/259 295/290/259 +f 96/101/260 94/97/260 298/293/260 296/291/260 +f 299/294/261 95/100/261 97/104/261 297/292/261 +f 94/97/262 92/90/262 300/295/262 298/293/262 +f 301/296/263 93/94/263 95/100/263 299/294/263 +f 308/297/264 309/298/264 328/299/264 338/300/264 +f 329/301/265 309/302/265 308/303/265 339/304/265 +f 307/305/266 308/297/266 338/300/266 336/306/266 +f 339/304/267 308/303/267 307/307/267 337/308/267 +f 306/309/268 307/305/268 336/306/268 340/310/268 +f 337/308/269 307/307/269 306/309/269 341/311/269 +f 89/67/270 91/70/270 306/309/270 340/310/270 +f 306/309/271 91/70/271 90/72/271 341/311/271 +f 87/73/272 89/67/272 340/310/272 334/312/272 +f 341/311/273 90/72/273 88/76/273 335/313/273 +f 85/77/274 87/73/274 334/312/274 330/314/274 +f 335/313/275 88/76/275 86/80/275 331/315/275 +f 83/81/276 85/77/276 330/314/276 332/316/276 +f 331/315/277 86/80/277 84/84/277 333/317/277 +f 330/314/278 336/306/278 338/300/278 332/316/278 +f 339/304/279 337/308/279 331/315/279 333/317/279 +f 330/314/280 334/312/280 340/310/280 336/306/280 +f 341/311/281 335/313/281 331/315/281 337/308/281 +f 326/318/282 332/316/282 338/300/282 328/299/282 +f 339/304/283 333/317/283 327/319/283 329/301/283 +f 81/85/284 83/81/284 332/316/284 326/318/284 +f 333/317/285 84/84/285 82/88/285 327/319/285 +f 209/206/286 342/320/286 344/321/286 215/208/286 +f 345/322/287 343/323/287 210/207/287 216/209/287 +f 81/85/288 326/318/288 342/320/288 209/206/288 +f 343/323/289 327/319/289 82/88/289 210/207/289 +f 79/89/290 215/208/290 344/321/290 346/324/290 +f 345/322/291 216/209/291 80/95/291 347/325/291 +f 79/89/292 346/324/292 300/295/292 92/90/292 +f 301/296/293 347/325/293 80/95/293 93/94/293 +f 77/326/294 324/327/294 352/328/294 304/329/294 +f 353/330/295 325/331/295 77/332/295 304/333/295 +f 304/329/296 352/328/296 350/334/296 78/335/296 +f 351/336/297 353/330/297 304/333/297 78/337/297 +f 78/335/298 350/334/298 348/338/298 305/339/298 +f 349/340/299 351/336/299 78/337/299 305/341/299 +f 305/339/300 348/338/300 328/299/300 309/298/300 +f 329/301/301 349/340/301 305/341/301 309/302/301 +f 326/318/302 328/299/302 348/338/302 342/320/302 +f 349/340/303 329/301/303 327/319/303 343/323/303 +f 296/291/304 298/293/304 318/342/304 310/343/304 +f 319/344/305 299/294/305 297/292/305 311/345/305 +f 76/346/306 316/347/306 324/327/306 77/326/306 +f 325/331/307 317/348/307 76/349/307 77/332/307 +f 302/350/308 358/351/308 356/352/308 303/353/308 +f 357/354/309 359/355/309 302/356/309 303/357/309 +f 303/353/310 356/352/310 354/358/310 75/359/310 +f 355/360/311 357/354/311 303/357/311 75/361/311 +f 75/359/312 354/358/312 316/347/312 76/346/312 +f 317/348/313 355/360/313 75/361/313 76/349/313 +f 292/362/314 294/289/314 362/363/314 364/364/314 +f 363/365/315 295/290/315 293/366/315 365/367/315 +f 364/364/316 362/363/316 368/368/316 366/369/316 +f 369/370/317 363/365/317 365/367/317 367/371/317 +f 366/369/318 368/368/318 370/372/318 372/373/318 +f 371/374/319 369/370/319 367/371/319 373/375/319 +f 372/373/320 370/372/320 376/376/320 374/377/320 +f 377/378/321 371/374/321 373/375/321 375/379/321 +f 314/380/322 378/381/322 374/377/322 376/376/322 +f 375/379/323 379/382/323 315/383/323 377/378/323 +f 316/347/324 354/358/324 374/377/324 378/381/324 +f 375/379/325 355/360/325 317/348/325 379/382/325 +f 354/358/326 356/352/326 372/373/326 374/377/326 +f 373/375/327 357/354/327 355/360/327 375/379/327 +f 356/352/328 358/351/328 366/369/328 372/373/328 +f 367/371/329 359/355/329 357/354/329 373/375/329 +f 358/351/330 360/384/330 364/364/330 366/369/330 +f 365/367/331 361/385/331 359/355/331 367/371/331 +f 290/386/332 292/362/332 364/364/332 360/384/332 +f 365/367/333 293/366/333 291/387/333 361/385/333 +f 74/388/334 360/384/334 358/351/334 302/350/334 +f 359/355/335 361/385/335 74/389/335 302/356/335 +f 284/390/336 286/391/336 288/392/336 290/386/336 +f 289/393/337 287/394/337 285/395/337 291/387/337 +f 284/390/338 290/386/338 360/384/338 74/388/338 +f 361/385/339 291/387/339 285/395/339 74/389/339 +f 73/396/340 284/390/340 74/388/340 +f 74/389/341 285/395/341 73/397/341 +f 294/289/342 296/291/342 310/343/342 362/363/342 +f 311/345/343 297/292/343 295/290/343 363/365/343 +f 310/343/344 312/398/344 368/368/344 362/363/344 +f 369/370/345 313/399/345 311/345/345 363/365/345 +f 312/398/346 382/400/346 370/372/346 368/368/346 +f 371/374/347 383/401/347 313/399/347 369/370/347 +f 314/380/348 376/376/348 370/372/348 382/400/348 +f 371/374/349 377/378/349 315/383/349 383/401/349 +f 348/338/350 350/334/350 386/402/350 384/403/350 +f 387/404/351 351/336/351 349/340/351 385/405/351 +f 318/342/352 384/403/352 386/402/352 320/406/352 +f 387/404/353 385/405/353 319/344/353 321/407/353 +f 298/293/354 300/295/354 384/403/354 318/342/354 +f 385/405/355 301/296/355 299/294/355 319/344/355 +f 300/295/356 344/321/356 342/320/356 384/403/356 +f 343/323/357 345/322/357 301/296/357 385/405/357 +f 342/320/358 348/338/358 384/403/358 +f 385/405/359 349/340/359 343/323/359 +f 300/295/360 346/324/360 344/321/360 +f 345/322/361 347/325/361 301/296/361 +f 314/380/362 322/408/362 380/409/362 378/381/362 +f 381/410/363 323/411/363 315/383/363 379/382/363 +f 316/347/364 378/381/364 380/409/364 324/327/364 +f 381/410/365 379/382/365 317/348/365 325/331/365 +f 320/406/366 386/402/366 380/409/366 322/408/366 +f 381/410/367 387/404/367 321/407/367 323/411/367 +f 350/334/368 352/328/368 380/409/368 386/402/368 +f 381/410/369 353/330/369 351/336/369 387/404/369 +f 324/327/370 380/409/370 352/328/370 +f 353/330/371 381/410/371 325/331/371 +f 400/412/372 388/413/372 414/414/372 402/415/372 +f 415/416/373 389/417/373 401/418/373 403/419/373 +f 400/412/374 402/415/374 404/420/374 398/421/374 +f 405/422/375 403/419/375 401/418/375 399/423/375 +f 398/421/376 404/420/376 406/424/376 396/425/376 +f 407/426/377 405/422/377 399/423/377 397/427/377 +f 396/425/378 406/424/378 408/428/378 394/429/378 +f 409/430/379 407/426/379 397/427/379 395/431/379 +f 394/429/380 408/428/380 410/432/380 392/433/380 +f 411/434/381 409/430/381 395/431/381 393/435/381 +f 392/433/382 410/432/382 412/436/382 390/437/382 +f 413/438/383 411/434/383 393/435/383 391/439/383 +f 410/432/384 420/440/384 418/441/384 412/436/384 +f 419/442/385 421/443/385 411/434/385 413/438/385 +f 408/428/386 422/444/386 420/440/386 410/432/386 +f 421/443/387 423/445/387 409/430/387 411/434/387 +f 406/424/388 424/446/388 422/444/388 408/428/388 +f 423/445/389 425/447/389 407/426/389 409/430/389 +f 404/420/390 426/448/390 424/446/390 406/424/390 +f 425/447/391 427/449/391 405/422/391 407/426/391 +f 402/415/392 428/450/392 426/448/392 404/420/392 +f 427/449/393 429/451/393 403/419/393 405/422/393 +f 402/415/394 414/414/394 416/452/394 428/450/394 +f 417/453/395 415/416/395 403/419/395 429/451/395 +f 318/342/396 320/406/396 444/454/396 442/455/396 +f 445/456/397 321/407/397 319/344/397 443/457/397 +f 320/458/398 390/437/398 412/436/398 444/459/398 +f 413/438/399 391/439/399 321/460/399 445/461/399 +f 310/343/400 318/342/400 442/455/400 312/398/400 +f 443/457/401 319/344/401 311/345/401 313/399/401 +f 382/462/402 430/463/402 414/414/402 388/413/402 +f 415/416/403 431/464/403 383/465/403 389/417/403 +f 412/436/404 418/441/404 440/466/404 444/459/404 +f 441/467/405 419/442/405 413/438/405 445/461/405 +f 438/468/406 446/469/406 444/459/406 440/466/406 +f 445/461/407 447/470/407 439/471/407 441/467/407 +f 434/472/408 446/469/408 438/468/408 436/473/408 +f 439/471/409 447/470/409 435/474/409 437/475/409 +f 432/476/410 448/477/410 446/469/410 434/472/410 +f 447/470/411 449/478/411 433/479/411 435/474/411 +f 430/463/412 448/477/412 432/476/412 450/480/412 +f 433/479/413 449/478/413 431/464/413 451/481/413 +f 414/414/414 430/463/414 450/480/414 416/452/414 +f 451/481/415 431/464/415 415/416/415 417/453/415 +f 312/398/416 448/482/416 430/483/416 382/400/416 +f 431/484/417 449/485/417 313/399/417 383/401/417 +f 312/398/418 442/455/418 446/486/418 448/482/418 +f 447/487/419 443/457/419 313/399/419 449/485/419 +f 442/455/420 444/454/420 446/486/420 +f 447/487/421 445/456/421 443/457/421 +f 416/452/422 450/480/422 452/488/422 476/489/422 +f 453/490/423 451/481/423 417/453/423 477/491/423 +f 450/480/424 432/476/424 462/492/424 452/488/424 +f 463/493/425 433/479/425 451/481/425 453/490/425 +f 432/476/426 434/472/426 460/494/426 462/492/426 +f 461/495/427 435/474/427 433/479/427 463/493/427 +f 434/472/428 436/473/428 458/496/428 460/494/428 +f 459/497/429 437/475/429 435/474/429 461/495/429 +f 436/473/430 438/468/430 456/498/430 458/496/430 +f 457/499/431 439/471/431 437/475/431 459/497/431 +f 438/468/432 440/466/432 454/500/432 456/498/432 +f 455/501/433 441/467/433 439/471/433 457/499/433 +f 440/466/434 418/441/434 474/502/434 454/500/434 +f 475/503/435 419/442/435 441/467/435 455/501/435 +f 428/450/436 416/452/436 476/489/436 464/504/436 +f 477/491/437 417/453/437 429/451/437 465/505/437 +f 426/448/438 428/450/438 464/504/438 466/506/438 +f 465/505/439 429/451/439 427/449/439 467/507/439 +f 424/446/440 426/448/440 466/506/440 468/508/440 +f 467/507/441 427/449/441 425/447/441 469/509/441 +f 422/444/442 424/446/442 468/508/442 470/510/442 +f 469/509/443 425/447/443 423/445/443 471/511/443 +f 420/440/444 422/444/444 470/510/444 472/512/444 +f 471/511/445 423/445/445 421/443/445 473/513/445 +f 418/441/446 420/440/446 472/512/446 474/502/446 +f 473/513/447 421/443/447 419/442/447 475/503/447 +f 458/496/448 456/498/448 480/514/448 478/515/448 +f 481/516/449 457/499/449 459/497/449 479/517/449 +f 478/515/450 480/514/450 482/518/450 484/519/450 +f 483/520/451 481/516/451 479/517/451 485/521/451 +f 484/519/452 482/518/452 488/522/452 486/523/452 +f 489/524/453 483/520/453 485/521/453 487/525/453 +f 486/523/454 488/522/454 490/526/454 492/527/454 +f 491/528/455 489/524/455 487/525/455 493/529/455 +f 464/504/456 476/489/456 486/523/456 492/527/456 +f 487/525/457 477/491/457 465/505/457 493/529/457 +f 452/488/458 484/519/458 486/523/458 476/489/458 +f 487/525/459 485/521/459 453/490/459 477/491/459 +f 452/488/460 462/492/460 478/515/460 484/519/460 +f 479/517/461 463/493/461 453/490/461 485/521/461 +f 458/496/462 478/515/462 462/492/462 460/494/462 +f 463/493/463 479/517/463 459/497/463 461/495/463 +f 454/500/464 474/502/464 480/514/464 456/498/464 +f 481/516/465 475/503/465 455/501/465 457/499/465 +f 472/512/466 482/518/466 480/514/466 474/502/466 +f 481/516/467 483/520/467 473/513/467 475/503/467 +f 470/510/468 488/522/468 482/518/468 472/512/468 +f 483/520/469 489/524/469 471/511/469 473/513/469 +f 468/508/470 490/526/470 488/522/470 470/510/470 +f 489/524/471 491/528/471 469/509/471 471/511/471 +f 466/506/472 492/527/472 490/526/472 468/508/472 +f 491/528/473 493/529/473 467/507/473 469/509/473 +f 464/504/474 492/527/474 466/506/474 +f 467/507/475 493/529/475 465/505/475 +f 392/433/476 390/437/476 504/530/476 502/531/476 +f 505/532/477 391/439/477 393/435/477 503/533/477 +f 394/429/478 392/433/478 502/531/478 500/534/478 +f 503/533/479 393/435/479 395/431/479 501/535/479 +f 396/425/480 394/429/480 500/534/480 498/536/480 +f 501/535/481 395/431/481 397/427/481 499/537/481 +f 398/538/482 396/425/482 498/536/482 496/539/482 +f 499/537/483 397/427/483 399/540/483 497/541/483 +f 400/542/484 398/538/484 496/539/484 494/543/484 +f 497/541/485 399/540/485 401/544/485 495/545/485 +f 388/546/486 400/542/486 494/543/486 506/547/486 +f 495/545/487 401/544/487 389/548/487 507/549/487 +f 494/543/488 502/531/488 504/530/488 506/547/488 +f 505/532/489 503/533/489 495/545/489 507/549/489 +f 494/543/490 496/539/490 500/534/490 502/531/490 +f 501/535/491 497/541/491 495/545/491 503/533/491 +f 496/539/492 498/536/492 500/534/492 +f 501/535/493 499/537/493 497/541/493 +f 314/380/494 382/400/494 388/550/494 506/551/494 +f 389/548/495 383/552/495 315/553/495 507/549/495 +f 314/554/496 506/547/496 504/530/496 322/555/496 +f 505/532/497 507/549/497 315/553/497 323/556/497 +f 320/458/498 322/555/498 504/530/498 390/437/498 +f 505/532/499 323/556/499 321/460/499 391/439/499 diff --git a/modules/ufbx/data/synthetic_color_suzanne_0_obj.obj b/modules/ufbx/data/synthetic_color_suzanne_0_obj.obj new file mode 100644 index 0000000..f116ad8 --- /dev/null +++ b/modules/ufbx/data/synthetic_color_suzanne_0_obj.obj @@ -0,0 +1,2065 @@ +# Blender v3.2.0 OBJ File: '' +# www.blender.org +v 0.437500 -0.765625 0.164062 0.718750 0.117188 0.582031 +v -0.437500 -0.765625 0.164062 0.281250 0.117188 0.582031 +v 0.500000 -0.687500 0.093750 0.750000 0.156250 0.546875 +v -0.500000 -0.687500 0.093750 0.250000 0.156250 0.546875 +v 0.546875 -0.578125 0.054688 0.773438 0.210938 0.527344 +v -0.546875 -0.578125 0.054688 0.226562 0.210938 0.527344 +v 0.351562 -0.617188 -0.023438 0.675781 0.191406 0.488281 +v -0.351562 -0.617188 -0.023438 0.324219 0.191406 0.488281 +v 0.351562 -0.718750 0.031250 0.675781 0.140625 0.515625 +v -0.351562 -0.718750 0.031250 0.324219 0.140625 0.515625 +v 0.351562 -0.781250 0.132812 0.675781 0.109375 0.566406 +v -0.351562 -0.781250 0.132812 0.324219 0.109375 0.566406 +v 0.273438 -0.796875 0.164062 0.636719 0.101562 0.582031 +v -0.273438 -0.796875 0.164062 0.363281 0.101562 0.582031 +v 0.203125 -0.742188 0.093750 0.601562 0.128906 0.546875 +v -0.203125 -0.742188 0.093750 0.398438 0.128906 0.546875 +v 0.156250 -0.648438 0.054688 0.578125 0.175781 0.527344 +v -0.156250 -0.648438 0.054688 0.421875 0.175781 0.527344 +v 0.078125 -0.656250 0.242188 0.539062 0.171875 0.621094 +v -0.078125 -0.656250 0.242188 0.460938 0.171875 0.621094 +v 0.140625 -0.742188 0.242188 0.570312 0.128906 0.621094 +v -0.140625 -0.742188 0.242188 0.429688 0.128906 0.621094 +v 0.242188 -0.796875 0.242188 0.621094 0.101562 0.621094 +v -0.242188 -0.796875 0.242188 0.378906 0.101562 0.621094 +v 0.273438 -0.796875 0.328125 0.636719 0.101562 0.664062 +v -0.273438 -0.796875 0.328125 0.363281 0.101562 0.664062 +v 0.203125 -0.742188 0.390625 0.601562 0.128906 0.695312 +v -0.203125 -0.742188 0.390625 0.398438 0.128906 0.695312 +v 0.156250 -0.648438 0.437500 0.578125 0.175781 0.718750 +v -0.156250 -0.648438 0.437500 0.421875 0.175781 0.718750 +v 0.351562 -0.617188 0.515625 0.675781 0.191406 0.757812 +v -0.351562 -0.617188 0.515625 0.324219 0.191406 0.757812 +v 0.351562 -0.718750 0.453125 0.675781 0.140625 0.726562 +v -0.351562 -0.718750 0.453125 0.324219 0.140625 0.726562 +v 0.351562 -0.781250 0.359375 0.675781 0.109375 0.679688 +v -0.351562 -0.781250 0.359375 0.324219 0.109375 0.679688 +v 0.437500 -0.765625 0.328125 0.718750 0.117188 0.664062 +v -0.437500 -0.765625 0.328125 0.281250 0.117188 0.664062 +v 0.500000 -0.687500 0.390625 0.750000 0.156250 0.695312 +v -0.500000 -0.687500 0.390625 0.250000 0.156250 0.695312 +v 0.546875 -0.578125 0.437500 0.773438 0.210938 0.718750 +v -0.546875 -0.578125 0.437500 0.226562 0.210938 0.718750 +v 0.625000 -0.562500 0.242188 0.812500 0.218750 0.621094 +v -0.625000 -0.562500 0.242188 0.187500 0.218750 0.621094 +v 0.562500 -0.671875 0.242188 0.781250 0.164062 0.621094 +v -0.562500 -0.671875 0.242188 0.218750 0.164062 0.621094 +v 0.468750 -0.757812 0.242188 0.734375 0.121094 0.621094 +v -0.468750 -0.757812 0.242188 0.265625 0.121094 0.621094 +v 0.476562 -0.773438 0.242188 0.738281 0.113281 0.621094 +v -0.476562 -0.773438 0.242188 0.261719 0.113281 0.621094 +v 0.445312 -0.781250 0.335938 0.722656 0.109375 0.667969 +v -0.445312 -0.781250 0.335938 0.277344 0.109375 0.667969 +v 0.351562 -0.804688 0.375000 0.675781 0.097656 0.687500 +v -0.351562 -0.804688 0.375000 0.324219 0.097656 0.687500 +v 0.265625 -0.820312 0.335938 0.632812 0.089844 0.667969 +v -0.265625 -0.820312 0.335938 0.367188 0.089844 0.667969 +v 0.226562 -0.820312 0.242188 0.613281 0.089844 0.621094 +v -0.226562 -0.820312 0.242188 0.386719 0.089844 0.621094 +v 0.265625 -0.820312 0.156250 0.632812 0.089844 0.578125 +v -0.265625 -0.820312 0.156250 0.367188 0.089844 0.578125 +v 0.351562 -0.828125 0.242188 0.675781 0.085938 0.621094 +v -0.351562 -0.828125 0.242188 0.324219 0.085938 0.621094 +v 0.351562 -0.804688 0.117188 0.675781 0.097656 0.558594 +v -0.351562 -0.804688 0.117188 0.324219 0.097656 0.558594 +v 0.445312 -0.781250 0.156250 0.722656 0.109375 0.578125 +v -0.445312 -0.781250 0.156250 0.277344 0.109375 0.578125 +v 0.000000 -0.742188 0.429688 0.500000 0.128906 0.714844 +v 0.000000 -0.820312 0.351562 0.500000 0.089844 0.675781 +v 0.000000 -0.734375 -0.679688 0.500000 0.132812 0.160156 +v 0.000000 -0.781250 -0.320312 0.500000 0.109375 0.339844 +v 0.000000 -0.796875 -0.187500 0.500000 0.101562 0.406250 +v 0.000000 -0.718750 -0.773438 0.500000 0.140625 0.113281 +v 0.000000 -0.601562 0.406250 0.500000 0.199219 0.703125 +v 0.000000 -0.570312 0.570312 0.500000 0.214844 0.785156 +v 0.000000 0.546875 0.898438 0.500000 0.773438 0.949219 +v 0.000000 0.851562 0.562500 0.500000 0.925781 0.781250 +v 0.000000 0.828125 0.070312 0.500000 0.914062 0.535156 +v 0.000000 0.351562 -0.382812 0.500000 0.675781 0.308594 +v 0.203125 -0.562500 -0.187500 0.601562 0.218750 0.406250 +v -0.203125 -0.562500 -0.187500 0.398438 0.218750 0.406250 +v 0.312500 -0.570312 -0.437500 0.656250 0.214844 0.281250 +v -0.312500 -0.570312 -0.437500 0.343750 0.214844 0.281250 +v 0.351562 -0.570312 -0.695312 0.675781 0.214844 0.152344 +v -0.351562 -0.570312 -0.695312 0.324219 0.214844 0.152344 +v 0.367188 -0.531250 -0.890625 0.683594 0.234375 0.054688 +v -0.367188 -0.531250 -0.890625 0.316406 0.234375 0.054688 +v 0.328125 -0.523438 -0.945312 0.664062 0.238281 0.027344 +v -0.328125 -0.523438 -0.945312 0.335938 0.238281 0.027344 +v 0.179688 -0.554688 -0.968750 0.589844 0.222656 0.015625 +v -0.179688 -0.554688 -0.968750 0.410156 0.222656 0.015625 +v 0.000000 -0.578125 -0.984375 0.500000 0.210938 0.007812 +v 0.437500 -0.531250 -0.140625 0.718750 0.234375 0.429688 +v -0.437500 -0.531250 -0.140625 0.281250 0.234375 0.429688 +v 0.632812 -0.539062 -0.039062 0.816406 0.230469 0.480469 +v -0.632812 -0.539062 -0.039062 0.183594 0.230469 0.480469 +v 0.828125 -0.445312 0.148438 0.914062 0.277344 0.574219 +v -0.828125 -0.445312 0.148438 0.085938 0.277344 0.574219 +v 0.859375 -0.593750 0.429688 0.929688 0.203125 0.714844 +v -0.859375 -0.593750 0.429688 0.070312 0.203125 0.714844 +v 0.710938 -0.625000 0.484375 0.855469 0.187500 0.742188 +v -0.710938 -0.625000 0.484375 0.144531 0.187500 0.742188 +v 0.492188 -0.687500 0.601562 0.746094 0.156250 0.800781 +v -0.492188 -0.687500 0.601562 0.253906 0.156250 0.800781 +v 0.320312 -0.734375 0.757812 0.660156 0.132812 0.878906 +v -0.320312 -0.734375 0.757812 0.339844 0.132812 0.878906 +v 0.156250 -0.757812 0.718750 0.578125 0.121094 0.859375 +v -0.156250 -0.757812 0.718750 0.421875 0.121094 0.859375 +v 0.062500 -0.750000 0.492188 0.531250 0.125000 0.746094 +v -0.062500 -0.750000 0.492188 0.468750 0.125000 0.746094 +v 0.164062 -0.773438 0.414062 0.582031 0.113281 0.707031 +v -0.164062 -0.773438 0.414062 0.417969 0.113281 0.707031 +v 0.125000 -0.765625 0.304688 0.562500 0.117188 0.652344 +v -0.125000 -0.765625 0.304688 0.437500 0.117188 0.652344 +v 0.203125 -0.742188 0.093750 0.601562 0.128906 0.546875 +v -0.203125 -0.742188 0.093750 0.398438 0.128906 0.546875 +v 0.375000 -0.703125 0.015625 0.687500 0.148438 0.507812 +v -0.375000 -0.703125 0.015625 0.312500 0.148438 0.507812 +v 0.492188 -0.671875 0.062500 0.746094 0.164062 0.531250 +v -0.492188 -0.671875 0.062500 0.253906 0.164062 0.531250 +v 0.625000 -0.648438 0.187500 0.812500 0.175781 0.593750 +v -0.625000 -0.648438 0.187500 0.187500 0.175781 0.593750 +v 0.640625 -0.648438 0.296875 0.820312 0.175781 0.648438 +v -0.640625 -0.648438 0.296875 0.179688 0.175781 0.648438 +v 0.601562 -0.664062 0.375000 0.800781 0.167969 0.687500 +v -0.601562 -0.664062 0.375000 0.199219 0.167969 0.687500 +v 0.429688 -0.718750 0.437500 0.714844 0.140625 0.718750 +v -0.429688 -0.718750 0.437500 0.285156 0.140625 0.718750 +v 0.250000 -0.757812 0.468750 0.625000 0.121094 0.734375 +v -0.250000 -0.757812 0.468750 0.375000 0.121094 0.734375 +v 0.000000 -0.734375 -0.765625 0.500000 0.132812 0.117188 +v 0.109375 -0.734375 -0.718750 0.554688 0.132812 0.140625 +v -0.109375 -0.734375 -0.718750 0.445312 0.132812 0.140625 +v 0.117188 -0.710938 -0.835938 0.558594 0.144531 0.082031 +v -0.117188 -0.710938 -0.835938 0.441406 0.144531 0.082031 +v 0.062500 -0.695312 -0.882812 0.531250 0.152344 0.058594 +v -0.062500 -0.695312 -0.882812 0.468750 0.152344 0.058594 +v 0.000000 -0.687500 -0.890625 0.500000 0.156250 0.054688 +v 0.000000 -0.750000 -0.195312 0.500000 0.125000 0.402344 +v 0.000000 -0.742188 -0.140625 0.500000 0.128906 0.429688 +v 0.101562 -0.742188 -0.148438 0.550781 0.128906 0.425781 +v -0.101562 -0.742188 -0.148438 0.449219 0.128906 0.425781 +v 0.125000 -0.750000 -0.226562 0.562500 0.125000 0.386719 +v -0.125000 -0.750000 -0.226562 0.437500 0.125000 0.386719 +v 0.085938 -0.742188 -0.289062 0.542969 0.128906 0.355469 +v -0.085938 -0.742188 -0.289062 0.457031 0.128906 0.355469 +v 0.398438 -0.671875 -0.046875 0.699219 0.164062 0.476562 +v -0.398438 -0.671875 -0.046875 0.300781 0.164062 0.476562 +v 0.617188 -0.625000 0.054688 0.808594 0.187500 0.527344 +v -0.617188 -0.625000 0.054688 0.191406 0.187500 0.527344 +v 0.726562 -0.601562 0.203125 0.863281 0.199219 0.601562 +v -0.726562 -0.601562 0.203125 0.136719 0.199219 0.601562 +v 0.742188 -0.656250 0.375000 0.871094 0.171875 0.687500 +v -0.742188 -0.656250 0.375000 0.128906 0.171875 0.687500 +v 0.687500 -0.726562 0.414062 0.843750 0.136719 0.707031 +v -0.687500 -0.726562 0.414062 0.156250 0.136719 0.707031 +v 0.437500 -0.796875 0.546875 0.718750 0.101562 0.773438 +v -0.437500 -0.796875 0.546875 0.281250 0.101562 0.773438 +v 0.312500 -0.835938 0.640625 0.656250 0.082031 0.820312 +v -0.312500 -0.835938 0.640625 0.343750 0.082031 0.820312 +v 0.203125 -0.851562 0.617188 0.601562 0.074219 0.808594 +v -0.203125 -0.851562 0.617188 0.398438 0.074219 0.808594 +v 0.101562 -0.843750 0.429688 0.550781 0.078125 0.714844 +v -0.101562 -0.843750 0.429688 0.449219 0.078125 0.714844 +v 0.125000 -0.812500 -0.101562 0.562500 0.093750 0.449219 +v -0.125000 -0.812500 -0.101562 0.437500 0.093750 0.449219 +v 0.210938 -0.710938 -0.445312 0.605469 0.144531 0.277344 +v -0.210938 -0.710938 -0.445312 0.394531 0.144531 0.277344 +v 0.250000 -0.687500 -0.703125 0.625000 0.156250 0.148438 +v -0.250000 -0.687500 -0.703125 0.375000 0.156250 0.148438 +v 0.265625 -0.664062 -0.820312 0.632812 0.167969 0.089844 +v -0.265625 -0.664062 -0.820312 0.367188 0.167969 0.089844 +v 0.234375 -0.632812 -0.914062 0.617188 0.183594 0.042969 +v -0.234375 -0.632812 -0.914062 0.382812 0.183594 0.042969 +v 0.164062 -0.632812 -0.929688 0.582031 0.183594 0.035156 +v -0.164062 -0.632812 -0.929688 0.417969 0.183594 0.035156 +v 0.000000 -0.640625 -0.945312 0.500000 0.179688 0.027344 +v 0.000000 -0.726562 0.046875 0.500000 0.136719 0.523438 +v 0.000000 -0.765625 0.210938 0.500000 0.117188 0.605469 +v 0.328125 -0.742188 0.476562 0.664062 0.128906 0.738281 +v -0.328125 -0.742188 0.476562 0.335938 0.128906 0.738281 +v 0.164062 -0.750000 0.140625 0.582031 0.125000 0.570312 +v -0.164062 -0.750000 0.140625 0.417969 0.125000 0.570312 +v 0.132812 -0.757812 0.210938 0.566406 0.121094 0.605469 +v -0.132812 -0.757812 0.210938 0.433594 0.121094 0.605469 +v 0.117188 -0.734375 -0.687500 0.558594 0.132812 0.156250 +v -0.117188 -0.734375 -0.687500 0.441406 0.132812 0.156250 +v 0.078125 -0.750000 -0.445312 0.539062 0.125000 0.277344 +v -0.078125 -0.750000 -0.445312 0.460938 0.125000 0.277344 +v 0.000000 -0.750000 -0.445312 0.500000 0.125000 0.277344 +v 0.000000 -0.742188 -0.328125 0.500000 0.128906 0.335938 +v 0.093750 -0.781250 -0.273438 0.546875 0.109375 0.363281 +v -0.093750 -0.781250 -0.273438 0.453125 0.109375 0.363281 +v 0.132812 -0.796875 -0.226562 0.566406 0.101562 0.386719 +v -0.132812 -0.796875 -0.226562 0.433594 0.101562 0.386719 +v 0.109375 -0.781250 -0.132812 0.554688 0.109375 0.433594 +v -0.109375 -0.781250 -0.132812 0.445312 0.109375 0.433594 +v 0.039062 -0.781250 -0.125000 0.519531 0.109375 0.437500 +v -0.039062 -0.781250 -0.125000 0.480469 0.109375 0.437500 +v 0.000000 -0.828125 -0.203125 0.500000 0.085938 0.398438 +v 0.046875 -0.812500 -0.148438 0.523438 0.093750 0.425781 +v -0.046875 -0.812500 -0.148438 0.476562 0.093750 0.425781 +v 0.093750 -0.812500 -0.156250 0.546875 0.093750 0.421875 +v -0.093750 -0.812500 -0.156250 0.453125 0.093750 0.421875 +v 0.109375 -0.828125 -0.226562 0.554688 0.085938 0.386719 +v -0.109375 -0.828125 -0.226562 0.445312 0.085938 0.386719 +v 0.078125 -0.804688 -0.250000 0.539062 0.097656 0.375000 +v -0.078125 -0.804688 -0.250000 0.460938 0.097656 0.375000 +v 0.000000 -0.804688 -0.289062 0.500000 0.097656 0.355469 +v 0.257812 -0.554688 -0.312500 0.628906 0.222656 0.343750 +v -0.257812 -0.554688 -0.312500 0.371094 0.222656 0.343750 +v 0.164062 -0.710938 -0.242188 0.582031 0.144531 0.378906 +v -0.164062 -0.710938 -0.242188 0.417969 0.144531 0.378906 +v 0.179688 -0.710938 -0.312500 0.589844 0.144531 0.343750 +v -0.179688 -0.710938 -0.312500 0.410156 0.144531 0.343750 +v 0.234375 -0.554688 -0.250000 0.617188 0.222656 0.375000 +v -0.234375 -0.554688 -0.250000 0.382812 0.222656 0.375000 +v 0.000000 -0.687500 -0.875000 0.500000 0.156250 0.062500 +v 0.046875 -0.687500 -0.867188 0.523438 0.156250 0.066406 +v -0.046875 -0.687500 -0.867188 0.476562 0.156250 0.066406 +v 0.093750 -0.710938 -0.820312 0.546875 0.144531 0.089844 +v -0.093750 -0.710938 -0.820312 0.453125 0.144531 0.089844 +v 0.093750 -0.726562 -0.742188 0.546875 0.136719 0.128906 +v -0.093750 -0.726562 -0.742188 0.453125 0.136719 0.128906 +v 0.000000 -0.656250 -0.781250 0.500000 0.171875 0.109375 +v 0.093750 -0.664062 -0.750000 0.546875 0.167969 0.125000 +v -0.093750 -0.664062 -0.750000 0.453125 0.167969 0.125000 +v 0.093750 -0.640625 -0.812500 0.546875 0.179688 0.093750 +v -0.093750 -0.640625 -0.812500 0.453125 0.179688 0.093750 +v 0.046875 -0.632812 -0.851562 0.523438 0.183594 0.074219 +v -0.046875 -0.632812 -0.851562 0.476562 0.183594 0.074219 +v 0.000000 -0.632812 -0.859375 0.500000 0.183594 0.070312 +v 0.171875 -0.781250 0.218750 0.585938 0.109375 0.609375 +v -0.171875 -0.781250 0.218750 0.414062 0.109375 0.609375 +v 0.187500 -0.773438 0.156250 0.593750 0.113281 0.578125 +v -0.187500 -0.773438 0.156250 0.406250 0.113281 0.578125 +v 0.335938 -0.757812 0.429688 0.667969 0.121094 0.714844 +v -0.335938 -0.757812 0.429688 0.332031 0.121094 0.714844 +v 0.273438 -0.773438 0.421875 0.636719 0.113281 0.710938 +v -0.273438 -0.773438 0.421875 0.363281 0.113281 0.710938 +v 0.421875 -0.773438 0.398438 0.710938 0.113281 0.699219 +v -0.421875 -0.773438 0.398438 0.289062 0.113281 0.699219 +v 0.562500 -0.695312 0.351562 0.781250 0.152344 0.675781 +v -0.562500 -0.695312 0.351562 0.218750 0.152344 0.675781 +v 0.585938 -0.687500 0.289062 0.792969 0.156250 0.644531 +v -0.585938 -0.687500 0.289062 0.207031 0.156250 0.644531 +v 0.578125 -0.679688 0.195312 0.789062 0.160156 0.597656 +v -0.578125 -0.679688 0.195312 0.210938 0.160156 0.597656 +v 0.476562 -0.718750 0.101562 0.738281 0.140625 0.550781 +v -0.476562 -0.718750 0.101562 0.261719 0.140625 0.550781 +v 0.375000 -0.742188 0.062500 0.687500 0.128906 0.531250 +v -0.375000 -0.742188 0.062500 0.312500 0.128906 0.531250 +v 0.226562 -0.781250 0.109375 0.613281 0.109375 0.554688 +v -0.226562 -0.781250 0.109375 0.386719 0.109375 0.554688 +v 0.179688 -0.781250 0.296875 0.589844 0.109375 0.648438 +v -0.179688 -0.781250 0.296875 0.410156 0.109375 0.648438 +v 0.210938 -0.781250 0.375000 0.605469 0.109375 0.687500 +v -0.210938 -0.781250 0.375000 0.394531 0.109375 0.687500 +v 0.234375 -0.757812 0.359375 0.617188 0.121094 0.679688 +v -0.234375 -0.757812 0.359375 0.382812 0.121094 0.679688 +v 0.195312 -0.757812 0.296875 0.597656 0.121094 0.648438 +v -0.195312 -0.757812 0.296875 0.402344 0.121094 0.648438 +v 0.242188 -0.757812 0.125000 0.621094 0.121094 0.562500 +v -0.242188 -0.757812 0.125000 0.378906 0.121094 0.562500 +v 0.375000 -0.726562 0.085938 0.687500 0.136719 0.542969 +v -0.375000 -0.726562 0.085938 0.312500 0.136719 0.542969 +v 0.460938 -0.703125 0.117188 0.730469 0.148438 0.558594 +v -0.460938 -0.703125 0.117188 0.269531 0.148438 0.558594 +v 0.546875 -0.671875 0.210938 0.773438 0.164062 0.605469 +v -0.546875 -0.671875 0.210938 0.226562 0.164062 0.605469 +v 0.554688 -0.671875 0.281250 0.777344 0.164062 0.640625 +v -0.554688 -0.671875 0.281250 0.222656 0.164062 0.640625 +v 0.531250 -0.679688 0.335938 0.765625 0.160156 0.667969 +v -0.531250 -0.679688 0.335938 0.234375 0.160156 0.667969 +v 0.414062 -0.750000 0.390625 0.707031 0.125000 0.695312 +v -0.414062 -0.750000 0.390625 0.292969 0.125000 0.695312 +v 0.281250 -0.765625 0.398438 0.640625 0.117188 0.699219 +v -0.281250 -0.765625 0.398438 0.359375 0.117188 0.699219 +v 0.335938 -0.750000 0.406250 0.667969 0.125000 0.703125 +v -0.335938 -0.750000 0.406250 0.332031 0.125000 0.703125 +v 0.203125 -0.750000 0.171875 0.601562 0.125000 0.585938 +v -0.203125 -0.750000 0.171875 0.398438 0.125000 0.585938 +v 0.195312 -0.750000 0.226562 0.597656 0.125000 0.613281 +v -0.195312 -0.750000 0.226562 0.402344 0.125000 0.613281 +v 0.109375 -0.609375 0.460938 0.554688 0.195312 0.730469 +v -0.109375 -0.609375 0.460938 0.445312 0.195312 0.730469 +v 0.195312 -0.617188 0.664062 0.597656 0.191406 0.832031 +v -0.195312 -0.617188 0.664062 0.402344 0.191406 0.832031 +v 0.335938 -0.593750 0.687500 0.667969 0.203125 0.843750 +v -0.335938 -0.593750 0.687500 0.332031 0.203125 0.843750 +v 0.484375 -0.554688 0.554688 0.742188 0.222656 0.777344 +v -0.484375 -0.554688 0.554688 0.257812 0.222656 0.777344 +v 0.679688 -0.492188 0.453125 0.839844 0.253906 0.726562 +v -0.679688 -0.492188 0.453125 0.160156 0.253906 0.726562 +v 0.796875 -0.460938 0.406250 0.898438 0.269531 0.703125 +v -0.796875 -0.460938 0.406250 0.101562 0.269531 0.703125 +v 0.773438 -0.375000 0.164062 0.886719 0.312500 0.582031 +v -0.773438 -0.375000 0.164062 0.113281 0.312500 0.582031 +v 0.601562 -0.414062 0.000000 0.800781 0.292969 0.500000 +v -0.601562 -0.414062 0.000000 0.199219 0.292969 0.500000 +v 0.437500 -0.468750 -0.093750 0.718750 0.265625 0.453125 +v -0.437500 -0.468750 -0.093750 0.281250 0.265625 0.453125 +v 0.000000 -0.289062 0.898438 0.500000 0.355469 0.949219 +v 0.000000 0.078125 0.984375 0.500000 0.539062 0.992188 +v 0.000000 0.671875 -0.195312 0.500000 0.835938 0.402344 +v 0.000000 -0.187500 -0.460938 0.500000 0.406250 0.269531 +v 0.000000 -0.460938 -0.976562 0.500000 0.269531 0.011719 +v 0.000000 -0.343750 -0.804688 0.500000 0.328125 0.097656 +v 0.000000 -0.320312 -0.570312 0.500000 0.339844 0.214844 +v 0.000000 -0.281250 -0.484375 0.500000 0.359375 0.257812 +v 0.851562 -0.054688 0.234375 0.925781 0.472656 0.617188 +v -0.851562 -0.054688 0.234375 0.074219 0.472656 0.617188 +v 0.859375 0.046875 0.320312 0.929688 0.523438 0.660156 +v -0.859375 0.046875 0.320312 0.070312 0.523438 0.660156 +v 0.773438 0.437500 0.265625 0.886719 0.718750 0.632812 +v -0.773438 0.437500 0.265625 0.113281 0.718750 0.632812 +v 0.460938 0.703125 0.437500 0.730469 0.851562 0.718750 +v -0.460938 0.703125 0.437500 0.269531 0.851562 0.718750 +v 0.734375 -0.070312 -0.046875 0.867188 0.464844 0.476562 +v -0.734375 -0.070312 -0.046875 0.132812 0.464844 0.476562 +v 0.593750 0.164062 -0.125000 0.796875 0.582031 0.437500 +v -0.593750 0.164062 -0.125000 0.203125 0.582031 0.437500 +v 0.640625 0.429688 -0.007812 0.820312 0.714844 0.496094 +v -0.640625 0.429688 -0.007812 0.179688 0.714844 0.496094 +v 0.335938 0.664062 0.054688 0.667969 0.832031 0.527344 +v -0.335938 0.664062 0.054688 0.332031 0.832031 0.527344 +v 0.234375 -0.406250 -0.351562 0.617188 0.296875 0.324219 +v -0.234375 -0.406250 -0.351562 0.382812 0.296875 0.324219 +v 0.179688 -0.257812 -0.414062 0.589844 0.371094 0.292969 +v -0.179688 -0.257812 -0.414062 0.410156 0.371094 0.292969 +v 0.289062 -0.382812 -0.710938 0.644531 0.308594 0.144531 +v -0.289062 -0.382812 -0.710938 0.355469 0.308594 0.144531 +v 0.250000 -0.390625 -0.500000 0.625000 0.304688 0.250000 +v -0.250000 -0.390625 -0.500000 0.375000 0.304688 0.250000 +v 0.328125 -0.398438 -0.914062 0.664062 0.300781 0.042969 +v -0.328125 -0.398438 -0.914062 0.335938 0.300781 0.042969 +v 0.140625 -0.367188 -0.757812 0.570312 0.316406 0.121094 +v -0.140625 -0.367188 -0.757812 0.429688 0.316406 0.121094 +v 0.125000 -0.359375 -0.539062 0.562500 0.320312 0.230469 +v -0.125000 -0.359375 -0.539062 0.437500 0.320312 0.230469 +v 0.164062 -0.437500 -0.945312 0.582031 0.281250 0.027344 +v -0.164062 -0.437500 -0.945312 0.417969 0.281250 0.027344 +v 0.218750 -0.429688 -0.281250 0.609375 0.285156 0.359375 +v -0.218750 -0.429688 -0.281250 0.390625 0.285156 0.359375 +v 0.210938 -0.468750 -0.226562 0.605469 0.265625 0.386719 +v -0.210938 -0.468750 -0.226562 0.394531 0.265625 0.386719 +v 0.203125 -0.500000 -0.171875 0.601562 0.250000 0.414062 +v -0.203125 -0.500000 -0.171875 0.398438 0.250000 0.414062 +v 0.210938 -0.164062 -0.390625 0.605469 0.417969 0.304688 +v -0.210938 -0.164062 -0.390625 0.394531 0.417969 0.304688 +v 0.296875 0.265625 -0.312500 0.648438 0.632812 0.343750 +v -0.296875 0.265625 -0.312500 0.351562 0.632812 0.343750 +v 0.343750 0.539062 -0.148438 0.671875 0.769531 0.425781 +v -0.343750 0.539062 -0.148438 0.328125 0.769531 0.425781 +v 0.453125 0.382812 0.867188 0.726562 0.691406 0.933594 +v -0.453125 0.382812 0.867188 0.273438 0.691406 0.933594 +v 0.453125 0.070312 0.929688 0.726562 0.535156 0.964844 +v -0.453125 0.070312 0.929688 0.273438 0.535156 0.964844 +v 0.453125 -0.234375 0.851562 0.726562 0.382812 0.925781 +v -0.453125 -0.234375 0.851562 0.273438 0.382812 0.925781 +v 0.460938 -0.429688 0.523438 0.730469 0.285156 0.761719 +v -0.460938 -0.429688 0.523438 0.269531 0.285156 0.761719 +v 0.726562 -0.335938 0.406250 0.863281 0.332031 0.703125 +v -0.726562 -0.335938 0.406250 0.136719 0.332031 0.703125 +v 0.632812 -0.281250 0.453125 0.816406 0.359375 0.726562 +v -0.632812 -0.281250 0.453125 0.183594 0.359375 0.726562 +v 0.640625 -0.054688 0.703125 0.820312 0.472656 0.851562 +v -0.640625 -0.054688 0.703125 0.179688 0.472656 0.851562 +v 0.796875 -0.125000 0.562500 0.898438 0.437500 0.781250 +v -0.796875 -0.125000 0.562500 0.101562 0.437500 0.781250 +v 0.796875 0.117188 0.617188 0.898438 0.558594 0.808594 +v -0.796875 0.117188 0.617188 0.101562 0.558594 0.808594 +v 0.640625 0.195312 0.750000 0.820312 0.597656 0.875000 +v -0.640625 0.195312 0.750000 0.179688 0.597656 0.875000 +v 0.640625 0.445312 0.679688 0.820312 0.722656 0.839844 +v -0.640625 0.445312 0.679688 0.179688 0.722656 0.839844 +v 0.796875 0.359375 0.539062 0.898438 0.679688 0.769531 +v -0.796875 0.359375 0.539062 0.101562 0.679688 0.769531 +v 0.617188 0.585938 0.328125 0.808594 0.792969 0.664062 +v -0.617188 0.585938 0.328125 0.191406 0.792969 0.664062 +v 0.484375 0.546875 0.023438 0.742188 0.773438 0.511719 +v -0.484375 0.546875 0.023438 0.257812 0.773438 0.511719 +v 0.820312 0.203125 0.328125 0.910156 0.601562 0.664062 +v -0.820312 0.203125 0.328125 0.089844 0.601562 0.664062 +v 0.406250 -0.148438 -0.171875 0.703125 0.425781 0.414062 +v -0.406250 -0.148438 -0.171875 0.296875 0.425781 0.414062 +v 0.429688 0.210938 -0.195312 0.714844 0.605469 0.402344 +v -0.429688 0.210938 -0.195312 0.285156 0.605469 0.402344 +v 0.890625 0.234375 0.406250 0.945312 0.617188 0.703125 +v -0.890625 0.234375 0.406250 0.054688 0.617188 0.703125 +v 0.773438 0.125000 -0.140625 0.886719 0.562500 0.429688 +v -0.773438 0.125000 -0.140625 0.113281 0.562500 0.429688 +v 1.039062 0.328125 -0.101562 1.000000 0.664062 0.449219 +v -1.039062 0.328125 -0.101562 0.000000 0.664062 0.449219 +v 1.281250 0.429688 0.054688 1.000000 0.714844 0.527344 +v -1.281250 0.429688 0.054688 0.000000 0.714844 0.527344 +v 1.351562 0.421875 0.320312 1.000000 0.710938 0.660156 +v -1.351562 0.421875 0.320312 0.000000 0.710938 0.660156 +v 1.234375 0.421875 0.507812 1.000000 0.710938 0.753906 +v -1.234375 0.421875 0.507812 0.000000 0.710938 0.753906 +v 1.023438 0.312500 0.476562 1.000000 0.656250 0.738281 +v -1.023438 0.312500 0.476562 0.000000 0.656250 0.738281 +v 1.015625 0.289062 0.414062 1.000000 0.644531 0.707031 +v -1.015625 0.289062 0.414062 0.000000 0.644531 0.707031 +v 1.187500 0.390625 0.437500 1.000000 0.695312 0.718750 +v -1.187500 0.390625 0.437500 0.000000 0.695312 0.718750 +v 1.265625 0.406250 0.289062 1.000000 0.703125 0.644531 +v -1.265625 0.406250 0.289062 0.000000 0.703125 0.644531 +v 1.210938 0.406250 0.078125 1.000000 0.703125 0.539062 +v -1.210938 0.406250 0.078125 0.000000 0.703125 0.539062 +v 1.031250 0.304688 -0.039062 1.000000 0.652344 0.480469 +v -1.031250 0.304688 -0.039062 0.000000 0.652344 0.480469 +v 0.828125 0.132812 -0.070312 0.914062 0.566406 0.464844 +v -0.828125 0.132812 -0.070312 0.085938 0.566406 0.464844 +v 0.921875 0.218750 0.359375 0.960938 0.609375 0.679688 +v -0.921875 0.218750 0.359375 0.039062 0.609375 0.679688 +v 0.945312 0.289062 0.304688 0.972656 0.644531 0.652344 +v -0.945312 0.289062 0.304688 0.027344 0.644531 0.652344 +v 0.882812 0.210938 -0.023438 0.941406 0.605469 0.488281 +v -0.882812 0.210938 -0.023438 0.058594 0.605469 0.488281 +v 1.039062 0.367188 0.000000 1.000000 0.683594 0.500000 +v -1.039062 0.367188 0.000000 0.000000 0.683594 0.500000 +v 1.187500 0.445312 0.093750 1.000000 0.722656 0.546875 +v -1.187500 0.445312 0.093750 0.000000 0.722656 0.546875 +v 1.234375 0.445312 0.250000 1.000000 0.722656 0.625000 +v -1.234375 0.445312 0.250000 0.000000 0.722656 0.625000 +v 1.171875 0.437500 0.359375 1.000000 0.718750 0.679688 +v -1.171875 0.437500 0.359375 0.000000 0.718750 0.679688 +v 1.023438 0.359375 0.343750 1.000000 0.679688 0.671875 +v -1.023438 0.359375 0.343750 0.000000 0.679688 0.671875 +v 0.843750 0.210938 0.289062 0.921875 0.605469 0.644531 +v -0.843750 0.210938 0.289062 0.078125 0.605469 0.644531 +v 0.835938 0.273438 0.171875 0.917969 0.636719 0.585938 +v -0.835938 0.273438 0.171875 0.082031 0.636719 0.585938 +v 0.757812 0.273438 0.093750 0.878906 0.636719 0.546875 +v -0.757812 0.273438 0.093750 0.121094 0.636719 0.546875 +v 0.820312 0.273438 0.085938 0.910156 0.636719 0.542969 +v -0.820312 0.273438 0.085938 0.089844 0.636719 0.542969 +v 0.843750 0.273438 0.015625 0.921875 0.636719 0.507812 +v -0.843750 0.273438 0.015625 0.078125 0.636719 0.507812 +v 0.812500 0.273438 -0.015625 0.906250 0.636719 0.492188 +v -0.812500 0.273438 -0.015625 0.093750 0.636719 0.492188 +v 0.726562 0.070312 0.000000 0.863281 0.535156 0.500000 +v -0.726562 0.070312 0.000000 0.136719 0.535156 0.500000 +v 0.718750 0.171875 -0.023438 0.859375 0.585938 0.488281 +v -0.718750 0.171875 -0.023438 0.140625 0.585938 0.488281 +v 0.718750 0.187500 0.039062 0.859375 0.593750 0.519531 +v -0.718750 0.187500 0.039062 0.140625 0.593750 0.519531 +v 0.796875 0.210938 0.203125 0.898438 0.605469 0.601562 +v -0.796875 0.210938 0.203125 0.101562 0.605469 0.601562 +v 0.890625 0.265625 0.242188 0.945312 0.632812 0.621094 +v -0.890625 0.265625 0.242188 0.054688 0.632812 0.621094 +v 0.890625 0.320312 0.234375 0.945312 0.660156 0.617188 +v -0.890625 0.320312 0.234375 0.054688 0.660156 0.617188 +v 0.812500 0.320312 -0.015625 0.906250 0.660156 0.492188 +v -0.812500 0.320312 -0.015625 0.093750 0.660156 0.492188 +v 0.851562 0.320312 0.015625 0.925781 0.660156 0.507812 +v -0.851562 0.320312 0.015625 0.074219 0.660156 0.507812 +v 0.828125 0.320312 0.078125 0.914062 0.660156 0.539062 +v -0.828125 0.320312 0.078125 0.085938 0.660156 0.539062 +v 0.765625 0.320312 0.093750 0.882812 0.660156 0.546875 +v -0.765625 0.320312 0.093750 0.117188 0.660156 0.546875 +v 0.843750 0.320312 0.171875 0.921875 0.660156 0.585938 +v -0.843750 0.320312 0.171875 0.078125 0.660156 0.585938 +v 1.039062 0.414062 0.328125 1.000000 0.707031 0.664062 +v -1.039062 0.414062 0.328125 0.000000 0.707031 0.664062 +v 1.187500 0.484375 0.343750 1.000000 0.742188 0.671875 +v -1.187500 0.484375 0.343750 0.000000 0.742188 0.671875 +v 1.257812 0.492188 0.242188 1.000000 0.746094 0.621094 +v -1.257812 0.492188 0.242188 0.000000 0.746094 0.621094 +v 1.210938 0.484375 0.085938 1.000000 0.742188 0.542969 +v -1.210938 0.484375 0.085938 0.000000 0.742188 0.542969 +v 1.046875 0.421875 0.000000 1.000000 0.710938 0.500000 +v -1.046875 0.421875 0.000000 0.000000 0.710938 0.500000 +v 0.882812 0.265625 -0.015625 0.941406 0.632812 0.492188 +v -0.882812 0.265625 -0.015625 0.058594 0.632812 0.492188 +v 0.953125 0.343750 0.289062 0.976562 0.671875 0.644531 +v -0.953125 0.343750 0.289062 0.023438 0.671875 0.644531 +v 0.890625 0.328125 0.109375 0.945312 0.664062 0.554688 +v -0.890625 0.328125 0.109375 0.054688 0.664062 0.554688 +v 0.937500 0.335938 0.062500 0.968750 0.667969 0.531250 +v -0.937500 0.335938 0.062500 0.031250 0.667969 0.531250 +v 1.000000 0.367188 0.125000 1.000000 0.683594 0.562500 +v -1.000000 0.367188 0.125000 0.000000 0.683594 0.562500 +v 0.960938 0.351562 0.171875 0.980469 0.675781 0.585938 +v -0.960938 0.351562 0.171875 0.019531 0.675781 0.585938 +v 1.015625 0.375000 0.234375 1.000000 0.687500 0.617188 +v -1.015625 0.375000 0.234375 0.000000 0.687500 0.617188 +v 1.054688 0.382812 0.187500 1.000000 0.691406 0.593750 +v -1.054688 0.382812 0.187500 0.000000 0.691406 0.593750 +v 1.109375 0.390625 0.210938 1.000000 0.695312 0.605469 +v -1.109375 0.390625 0.210938 0.000000 0.695312 0.605469 +v 1.085938 0.390625 0.273438 1.000000 0.695312 0.636719 +v -1.085938 0.390625 0.273438 0.000000 0.695312 0.636719 +v 1.023438 0.484375 0.437500 1.000000 0.742188 0.718750 +v -1.023438 0.484375 0.437500 0.000000 0.742188 0.718750 +v 1.250000 0.546875 0.468750 1.000000 0.773438 0.734375 +v -1.250000 0.546875 0.468750 0.000000 0.773438 0.734375 +v 1.367188 0.500000 0.296875 1.000000 0.750000 0.648438 +v -1.367188 0.500000 0.296875 0.000000 0.750000 0.648438 +v 1.312500 0.531250 0.054688 1.000000 0.765625 0.527344 +v -1.312500 0.531250 0.054688 0.000000 0.765625 0.527344 +v 1.039062 0.492188 -0.085938 1.000000 0.746094 0.457031 +v -1.039062 0.492188 -0.085938 0.000000 0.746094 0.457031 +v 0.789062 0.328125 -0.125000 0.894531 0.664062 0.437500 +v -0.789062 0.328125 -0.125000 0.105469 0.664062 0.437500 +v 0.859375 0.382812 0.382812 0.929688 0.691406 0.691406 +v -0.859375 0.382812 0.382812 0.070312 0.691406 0.691406 +vt 0.890955 0.590063 +vt 0.870622 0.589649 +vt 0.860081 0.560115 +vt 0.904571 0.559404 +vt 0.856226 0.850547 +vt 0.868067 0.821510 +vt 0.888398 0.821999 +vt 0.900640 0.853232 +vt 0.853018 0.521562 +vt 0.920166 0.524546 +vt 0.847458 0.888748 +vt 0.914672 0.888748 +vt 0.828900 0.590771 +vt 0.798481 0.569535 +vt 0.795104 0.838402 +vt 0.826436 0.818537 +vt 0.854402 0.604754 +vt 0.852534 0.805700 +vt 0.854107 0.625459 +vt 0.828171 0.633354 +vt 0.827598 0.775964 +vt 0.853157 0.785002 +vt 0.791018 0.645443 +vt 0.791018 0.762238 +vt 0.855181 0.668527 +vt 0.842358 0.702491 +vt 0.844839 0.707525 +vt 0.856142 0.742025 +vt 0.867508 0.642291 +vt 0.867293 0.768782 +vt 0.890474 0.641909 +vt 0.900375 0.666964 +vt 0.901223 0.745592 +vt 0.890219 0.770183 +vt 0.918898 0.699697 +vt 0.921180 0.713713 +vt 0.931889 0.636832 +vt 0.968392 0.645333 +vt 0.968213 0.770220 +vt 0.931368 0.777093 +vt 0.905882 0.627902 +vt 0.904990 0.784860 +vt 0.906232 0.605742 +vt 0.933717 0.593037 +vt 0.931250 0.820926 +vt 0.904357 0.807013 +vt 0.968392 0.573812 +vt 0.965038 0.841671 +vt 0.902359 0.607909 +vt 0.889591 0.593275 +vt 0.900583 0.804677 +vt 0.887178 0.818729 +vt 0.899781 0.626257 +vt 0.898822 0.786233 +vt 0.887842 0.636527 +vt 0.887351 0.775442 +vt 0.870908 0.635245 +vt 0.870376 0.775972 +vt 0.859881 0.623942 +vt 0.858859 0.786774 +vt 0.859664 0.608186 +vt 0.857942 0.802505 +vt 0.871664 0.593961 +vt 0.869299 0.817249 +vt 0.879400 0.616512 +vt 0.878029 0.795063 +vt 0.540260 0.053805 +vt 0.536419 0.062072 +vt 0.518925 0.059681 +vt 0.518916 0.050294 +vt 0.501452 0.062043 +vt 0.497626 0.053770 +vt 0.551930 0.058338 +vt 0.542788 0.064089 +vt 0.495083 0.064047 +vt 0.485955 0.058273 +vt 0.555073 0.061900 +vt 0.546290 0.072669 +vt 0.491565 0.072625 +vt 0.482805 0.061829 +vt 0.563812 0.076586 +vt 0.548333 0.084893 +vt 0.489507 0.084858 +vt 0.474014 0.076511 +vt 0.583135 0.108495 +vt 0.555621 0.121749 +vt 0.482177 0.121781 +vt 0.454527 0.108481 +vt 0.605512 0.165134 +vt 0.647395 0.200502 +vt 0.621513 0.227818 +vt 0.553118 0.209599 +vt 0.416514 0.229490 +vt 0.389677 0.201890 +vt 0.432024 0.165644 +vt 0.485339 0.210053 +vt 0.676379 0.233241 +vt 0.664761 0.253225 +vt 0.372747 0.256357 +vt 0.360308 0.235899 +vt 0.715342 0.265392 +vt 0.683908 0.279995 +vt 0.353696 0.284606 +vt 0.320452 0.270303 +vt 0.707254 0.310054 +vt 0.687515 0.311539 +vt 0.351187 0.317440 +vt 0.330721 0.316853 +vt 0.697446 0.332673 +vt 0.676824 0.323937 +vt 0.362723 0.329722 +vt 0.341964 0.339667 +vt 0.662817 0.372521 +vt 0.639050 0.357330 +vt 0.402772 0.362131 +vt 0.379297 0.378686 +vt 0.626842 0.395792 +vt 0.618316 0.375151 +vt 0.424583 0.379267 +vt 0.416915 0.400552 +vt 0.604826 0.397804 +vt 0.600808 0.377857 +vt 0.442396 0.381222 +vt 0.439252 0.401540 +vt 0.553095 0.390512 +vt 0.559674 0.357011 +vt 0.482938 0.358497 +vt 0.490934 0.391862 +vt 0.521923 0.386009 +vt 0.521086 0.343868 +vt 0.577279 0.340156 +vt 0.599845 0.344815 +vt 0.441977 0.347815 +vt 0.464579 0.342230 +vt 0.615546 0.342005 +vt 0.425972 0.345582 +vt 0.634472 0.332311 +vt 0.406362 0.336480 +vt 0.662406 0.312804 +vt 0.377061 0.317685 +vt 0.668440 0.297958 +vt 0.370304 0.302644 +vt 0.664101 0.277872 +vt 0.374100 0.281778 +vt 0.639236 0.253047 +vt 0.398938 0.255633 +vt 0.613992 0.242662 +vt 0.424464 0.244473 +vt 0.572941 0.258564 +vt 0.466409 0.259709 +vt 0.563905 0.272007 +vt 0.519760 0.248864 +vt 0.475886 0.273078 +vt 0.558527 0.316594 +vt 0.482619 0.317843 +vt 0.520277 0.294764 +vt 0.556923 0.291214 +vt 0.483433 0.292249 +vt 0.525483 0.068967 +vt 0.518928 0.067899 +vt 0.512375 0.068956 +vt 0.531231 0.073829 +vt 0.506626 0.073811 +vt 0.531019 0.087431 +vt 0.506827 0.087416 +vt 0.532042 0.127713 +vt 0.532669 0.090920 +vt 0.505177 0.090908 +vt 0.505828 0.127728 +vt 0.538112 0.158382 +vt 0.518981 0.151749 +vt 0.518941 0.128358 +vt 0.499851 0.158434 +vt 0.518925 0.093952 +vt 0.518927 0.085180 +vt 0.548362 0.173560 +vt 0.537959 0.175966 +vt 0.535214 0.166808 +vt 0.502799 0.166857 +vt 0.500100 0.176033 +vt 0.489683 0.173693 +vt 0.544281 0.193366 +vt 0.537248 0.187577 +vt 0.500890 0.187571 +vt 0.493996 0.193428 +vt 0.519841 0.200843 +vt 0.528757 0.191785 +vt 0.509219 0.191626 +vt 0.517577 0.190607 +vt 0.519132 0.185382 +vt 0.518998 0.159028 +vt 0.531131 0.171631 +vt 0.519016 0.165599 +vt 0.506910 0.171667 +vt 0.519099 0.179457 +vt 0.528222 0.186316 +vt 0.509787 0.186260 +vt 0.533528 0.184215 +vt 0.504547 0.184206 +vt 0.533449 0.176739 +vt 0.504604 0.176791 +vt 0.561572 0.167779 +vt 0.476363 0.167996 +vt 0.559475 0.149319 +vt 0.478371 0.149447 +vt 0.596138 0.133426 +vt 0.441395 0.133592 +vt 0.601169 0.147885 +vt 0.436337 0.148194 +vt 0.518925 0.083865 +vt 0.528933 0.084957 +vt 0.508915 0.084945 +vt 0.529036 0.075429 +vt 0.508820 0.075415 +vt 0.523751 0.070508 +vt 0.514106 0.070501 +vt 0.518929 0.069468 +vt 0.521560 0.074970 +vt 0.518928 0.074259 +vt 0.516297 0.074966 +vt 0.524236 0.076691 +vt 0.513619 0.076684 +vt 0.524601 0.079886 +vt 0.513252 0.079879 +vt 0.518926 0.079331 +vt 0.571787 0.277295 +vt 0.568351 0.292904 +vt 0.468070 0.278617 +vt 0.471978 0.294282 +vt 0.573085 0.311386 +vt 0.467790 0.313081 +vt 0.584855 0.327708 +vt 0.456477 0.329961 +vt 0.580734 0.266620 +vt 0.458737 0.268049 +vt 0.611720 0.255725 +vt 0.427062 0.257728 +vt 0.632494 0.262853 +vt 0.406068 0.265508 +vt 0.653658 0.279971 +vt 0.384904 0.283634 +vt 0.656064 0.297636 +vt 0.383015 0.301864 +vt 0.652752 0.310186 +vt 0.386858 0.314615 +vt 0.629040 0.323864 +vt 0.411556 0.327673 +vt 0.614408 0.331972 +vt 0.426727 0.335361 +vt 0.601033 0.333624 +vt 0.440344 0.336537 +vt 0.590644 0.321516 +vt 0.601799 0.328453 +vt 0.450408 0.323919 +vt 0.439372 0.331331 +vt 0.613335 0.327083 +vt 0.427623 0.330358 +vt 0.626851 0.320513 +vt 0.413648 0.324175 +vt 0.646248 0.306421 +vt 0.393381 0.310510 +vt 0.649541 0.296225 +vt 0.389662 0.300183 +vt 0.647785 0.283486 +vt 0.391040 0.287071 +vt 0.629829 0.267263 +vt 0.408893 0.269959 +vt 0.612641 0.261560 +vt 0.426254 0.263693 +vt 0.585166 0.270991 +vt 0.454369 0.272583 +vt 0.578124 0.281900 +vt 0.461798 0.283441 +vt 0.579548 0.309340 +vt 0.461204 0.311233 +vt 0.577524 0.293776 +vt 0.462754 0.295432 +vt 0.553209 0.433063 +vt 0.523031 0.433628 +vt 0.492809 0.434538 +vt 0.609819 0.431516 +vt 0.435860 0.435740 +vt 0.648174 0.419316 +vt 0.396518 0.425416 +vt 0.692106 0.388274 +vt 0.350292 0.396229 +vt 0.726332 0.341754 +vt 0.312756 0.350588 +vt 0.735879 0.312112 +vt 0.301067 0.320593 +vt 0.729900 0.256393 +vt 0.304876 0.261087 +vt 0.698172 0.216906 +vt 0.337414 0.219179 +vt 0.663103 0.190671 +vt 0.373474 0.191872 +vt 0.626908 0.015608 +vt 0.649444 0.022378 +vt 0.660451 0.076084 +vt 0.621440 0.048089 +vt 0.376796 0.075296 +vt 0.388827 0.021586 +vt 0.411318 0.015131 +vt 0.416419 0.047631 +vt 0.567460 0.000144 +vt 0.577206 0.032801 +vt 0.470636 0.000144 +vt 0.460782 0.032656 +vt 0.518922 0.024886 +vt 0.547413 0.041724 +vt 0.490511 0.041669 +vt 0.558059 0.053871 +vt 0.479842 0.053785 +vt 0.576951 0.057998 +vt 0.460920 0.057845 +vt 0.611687 0.078268 +vt 0.425932 0.077985 +vt 0.626663 0.111357 +vt 0.410618 0.111244 +vt 0.629482 0.130456 +vt 0.623495 0.146796 +vt 0.413741 0.147158 +vt 0.407648 0.130594 +vt 0.619303 0.159841 +vt 0.418035 0.160361 +vt 0.945900 0.079569 +vt 0.886245 0.121777 +vt 0.849114 0.099732 +vt 0.891780 0.036916 +vt 0.183115 0.092127 +vt 0.141314 0.112482 +vt 0.078961 0.060719 +vt 0.142277 0.021467 +vt 0.788458 0.080826 +vt 0.805584 0.010786 +vt 0.246353 0.076510 +vt 0.232648 0.003484 +vt 0.687018 0.077204 +vt 0.672384 0.022201 +vt 0.349875 0.075955 +vt 0.365979 0.020991 +vt 0.760215 0.193244 +vt 0.789046 0.233323 +vt 0.271553 0.193871 +vt 0.241255 0.236977 +vt 0.994525 0.167705 +vt 0.909112 0.183261 +vt 0.107928 0.179083 +vt 0.011829 0.155367 +vt 0.911671 0.402429 +vt 0.862868 0.338556 +vt 0.894128 0.301884 +vt 0.962901 0.344752 +vt 0.123776 0.315519 +vt 0.160557 0.356821 +vt 0.106400 0.432652 +vt 0.043968 0.367038 +vt 0.915360 0.259804 +vt 0.999856 0.254640 +vt 0.098965 0.266968 +vt 0.000144 0.259113 +vt 0.749542 0.334683 +vt 0.766337 0.300809 +vt 0.789162 0.313727 +vt 0.267408 0.310142 +vt 0.288183 0.346496 +vt 0.242992 0.325552 +vt 0.815314 0.276388 +vt 0.846174 0.293397 +vt 0.213065 0.285164 +vt 0.178537 0.304983 +vt 0.845007 0.256352 +vt 0.873517 0.265922 +vt 0.179662 0.263312 +vt 0.147089 0.274284 +vt 0.859075 0.228168 +vt 0.886999 0.233769 +vt 0.162803 0.231720 +vt 0.131514 0.237587 +vt 0.842355 0.195160 +vt 0.875030 0.184705 +vt 0.145224 0.182749 +vt 0.176788 0.196179 +vt 0.794286 0.364062 +vt 0.239776 0.382592 +vt 0.770185 0.379538 +vt 0.268122 0.398737 +vt 0.845499 0.449967 +vt 0.185281 0.484099 +vt 0.815858 0.445381 +vt 0.770572 0.444261 +vt 0.755700 0.418603 +vt 0.287033 0.442912 +vt 0.271364 0.473316 +vt 0.219260 0.477186 +vt 0.819845 0.468071 +vt 0.215894 0.503605 +vt 0.809631 0.233887 +vt 0.219168 0.237388 +vt 0.829287 0.219562 +vt 0.199067 0.222464 +vt 0.786480 0.117591 +vt 0.715482 0.139727 +vt 0.246666 0.114850 +vt 0.319538 0.139409 +vt 0.785486 0.152330 +vt 0.245969 0.151002 +vt 0.837382 0.156361 +vt 0.858171 0.137775 +vt 0.171653 0.132294 +vt 0.196622 0.155241 +vt 0.506166 0.904851 +vt 0.432388 0.894943 +vt 0.438797 0.870229 +vt 0.491058 0.881714 +vt 0.315867 0.868209 +vt 0.321637 0.893225 +vt 0.247207 0.901159 +vt 0.263032 0.878321 +vt 0.572792 0.860484 +vt 0.604825 0.879946 +vt 0.181486 0.854693 +vt 0.148729 0.873349 +vt 0.586396 0.793977 +vt 0.619962 0.791615 +vt 0.169745 0.787474 +vt 0.136063 0.784093 +vt 0.549027 0.746412 +vt 0.563786 0.739211 +vt 0.208656 0.740879 +vt 0.194086 0.733241 +vt 0.500314 0.711729 +vt 0.508270 0.697693 +vt 0.258399 0.707497 +vt 0.250811 0.693249 +vt 0.438641 0.680683 +vt 0.434803 0.658882 +vt 0.320962 0.677959 +vt 0.325318 0.656224 +vt 0.505666 0.730944 +vt 0.452955 0.700023 +vt 0.306136 0.696976 +vt 0.252524 0.726592 +vt 0.542850 0.755753 +vt 0.214575 0.750414 +vt 0.568148 0.787367 +vt 0.188269 0.781375 +vt 0.555495 0.826352 +vt 0.199850 0.820889 +vt 0.501231 0.844356 +vt 0.253846 0.840502 +vt 0.457832 0.840040 +vt 0.297562 0.837358 +vt 0.796021 0.176969 +vt 0.783193 0.187449 +vt 0.233625 0.175620 +vt 0.246955 0.187075 +vt 0.391039 0.611891 +vt 0.394766 0.686125 +vt 0.369913 0.610196 +vt 0.364838 0.684445 +vt 0.391747 0.862097 +vt 0.401605 0.841460 +vt 0.354026 0.840297 +vt 0.363377 0.861308 +vt 0.435018 0.718280 +vt 0.323658 0.715731 +vt 0.433669 0.729661 +vt 0.384658 0.710299 +vt 0.374400 0.708969 +vt 0.324726 0.727177 +vt 0.410995 0.747662 +vt 0.427812 0.742828 +vt 0.347028 0.745816 +vt 0.330270 0.740536 +vt 0.418086 0.784946 +vt 0.384657 0.795423 +vt 0.372270 0.794472 +vt 0.338952 0.783073 +vt 0.431333 0.817535 +vt 0.324790 0.815460 +vt 0.816266 0.203086 +vt 0.825107 0.209762 +vt 0.199767 0.214827 +vt 0.209828 0.206161 +vt 0.802192 0.184609 +vt 0.226485 0.183086 +vt 0.448505 0.804621 +vt 0.473386 0.824700 +vt 0.307886 0.802031 +vt 0.282357 0.821525 +vt 0.435868 0.779569 +vt 0.321237 0.777208 +vt 0.423718 0.754191 +vt 0.334089 0.752045 +vt 0.437950 0.749777 +vt 0.319919 0.747250 +vt 0.445392 0.731997 +vt 0.312907 0.729222 +vt 0.440995 0.724383 +vt 0.317510 0.721697 +vt 0.455277 0.713731 +vt 0.303460 0.710657 +vt 0.512485 0.828811 +vt 0.242975 0.824574 +vt 0.550942 0.811814 +vt 0.204839 0.806417 +vt 0.552139 0.787682 +vt 0.204331 0.782156 +vt 0.539407 0.764539 +vt 0.217774 0.759319 +vt 0.508439 0.743135 +vt 0.249419 0.738732 +vt 0.470841 0.748408 +vt 0.454776 0.761665 +vt 0.286960 0.745020 +vt 0.302729 0.758742 +vt 0.488870 0.770464 +vt 0.475403 0.783904 +vt 0.268291 0.766661 +vt 0.281439 0.780511 +vt 0.503673 0.787562 +vt 0.494476 0.802470 +vt 0.252972 0.783410 +vt 0.261790 0.798626 +vt 0.518562 0.791602 +vt 0.516802 0.807339 +vt 0.237920 0.787045 +vt 0.239243 0.802891 +vt 0.484068 0.628776 +vt 0.543385 0.683538 +vt 0.276936 0.625067 +vt 0.216123 0.678120 +vt 0.581052 0.726933 +vt 0.177176 0.720426 +vt 0.616701 0.759965 +vt 0.140379 0.752377 +vt 0.707492 0.759884 +vt 0.660647 0.741167 +vt 0.049526 0.748824 +vt 0.097038 0.732052 +vt 0.745511 0.652100 +vt 0.677256 0.670436 +vt 0.019409 0.639749 +vt 0.083564 0.662038 +vt 0.740843 0.572428 +vt 0.671403 0.592656 +vt 0.033664 0.564403 +vt 0.092820 0.589862 +vt 0.834578 0.206879 +vt 0.834705 0.206959 +vt 0.051216 0.522659 +vt 0.145041 0.562595 +vt 0.620420 0.565675 +vt 0.498072 0.552315 +vt 0.264218 0.550140 +vn 0.6650 -0.7194 -0.2008 +vn -0.6650 -0.7194 -0.2008 +vn 0.8294 -0.4689 -0.3036 +vn -0.8294 -0.4689 -0.3036 +vn 0.4155 -0.4449 -0.7933 +vn -0.4155 -0.4449 -0.7933 +vn 0.3600 -0.7820 -0.5089 +vn -0.3600 -0.7820 -0.5089 +vn -0.0787 -0.8384 -0.5394 +vn 0.0787 -0.8384 -0.5394 +vn -0.2696 -0.4685 -0.8413 +vn 0.2696 -0.4685 -0.8413 +vn -0.7707 -0.5420 -0.3352 +vn 0.7707 -0.5420 -0.3352 +vn -0.4689 -0.8617 -0.1940 +vn 0.4689 -0.8617 -0.1940 +vn -0.4767 -0.8581 0.1907 +vn 0.4767 -0.8581 0.1907 +vn -0.7672 -0.5521 0.3264 +vn 0.7672 -0.5521 0.3264 +vn -0.2519 -0.5182 0.8173 +vn 0.2519 -0.5182 0.8173 +vn -0.0949 -0.8164 0.5696 +vn 0.0949 -0.8164 0.5696 +vn 0.3667 -0.7597 0.5370 +vn -0.3667 -0.7597 0.5370 +vn 0.4141 -0.4898 0.7672 +vn -0.4141 -0.4898 0.7672 +vn 0.8277 -0.4771 0.2952 +vn -0.8277 -0.4771 0.2952 +vn 0.6713 -0.7145 0.1971 +vn -0.6713 -0.7145 0.1971 +vn 0.8111 0.4867 0.3244 +vn -0.8111 0.4867 0.3244 +vn 0.2052 0.5334 0.8206 +vn -0.2052 0.5334 0.8206 +vn -0.4223 0.4607 0.7806 +vn 0.4223 0.4607 0.7806 +vn -0.8241 0.4658 0.3225 +vn 0.8241 0.4658 0.3225 +vn -0.8137 0.4650 -0.3487 +vn 0.8137 0.4650 -0.3487 +vn -0.4223 0.4607 -0.7806 +vn 0.4223 0.4607 -0.7806 +vn 0.2052 0.5334 -0.8206 +vn -0.2052 0.5334 -0.8206 +vn 0.7995 0.4875 -0.3510 +vn -0.7995 0.4875 -0.3510 +vn 0.4000 -0.9144 -0.0623 +vn -0.4000 -0.9144 -0.0623 +vn 0.3069 -0.9354 -0.1754 +vn -0.3069 -0.9354 -0.1754 +vn 0.0945 -0.9785 -0.1835 +vn -0.0945 -0.9785 -0.1835 +vn -0.0624 -0.9977 -0.0283 +vn 0.0624 -0.9977 -0.0283 +vn -0.0624 -0.9977 0.0260 +vn 0.0624 -0.9977 0.0260 +vn 0.0996 -0.9799 0.1729 +vn -0.0996 -0.9799 0.1729 +vn 0.3036 -0.9383 0.1656 +vn -0.3036 -0.9383 0.1656 +vn 0.4002 -0.9147 0.0572 +vn -0.4002 -0.9147 0.0572 +vn 0.1231 -0.4924 -0.8616 +vn -0.1231 -0.4924 -0.8616 +vn 0.2190 -0.4520 -0.8647 +vn -0.2190 -0.4520 -0.8647 +vn 0.5902 -0.6668 -0.4550 +vn -0.5902 -0.6668 -0.4550 +vn 0.7689 -0.6374 -0.0506 +vn -0.7689 -0.6374 -0.0506 +vn 0.7796 -0.6197 0.0900 +vn -0.7796 -0.6197 0.0900 +vn 0.3241 -0.4739 -0.8188 +vn -0.3241 -0.4739 -0.8188 +vn 0.3857 -0.6417 -0.6629 +vn -0.3857 -0.6417 -0.6629 +vn 0.6895 -0.5906 -0.4193 +vn -0.6895 -0.5906 -0.4193 +vn 0.6588 -0.6588 -0.3634 +vn -0.6588 -0.6588 -0.3634 +vn 0.5465 -0.7509 0.3707 +vn -0.5465 -0.7509 0.3707 +vn 0.5064 -0.5706 0.6464 +vn -0.5064 -0.5706 0.6464 +vn 0.6092 -0.6015 0.5167 +vn -0.6092 -0.6015 0.5167 +vn -0.0441 -0.7491 0.6610 +vn 0.0441 -0.7491 0.6610 +vn -0.7246 -0.6110 0.3187 +vn 0.7246 -0.6110 0.3187 +vn -0.5880 -0.5880 0.5554 +vn 0.5880 -0.5880 0.5554 +vn 0.5361 -0.7482 -0.3909 +vn -0.5361 -0.7482 -0.3909 +vn 0.2207 -0.8552 -0.4690 +vn -0.2207 -0.8552 -0.4690 +vn -0.0794 -0.8429 -0.5321 +vn 0.0794 -0.8429 -0.5321 +vn -0.0825 -0.7490 -0.6575 +vn 0.0825 -0.7490 -0.6575 +vn 0.0457 -0.8226 -0.5667 +vn -0.0457 -0.8226 -0.5667 +vn 0.2784 -0.9365 -0.2130 +vn -0.2784 -0.9365 -0.2130 +vn 0.3813 -0.9063 -0.1824 +vn -0.3813 -0.9063 -0.1824 +vn 0.3357 -0.8969 -0.2878 +vn -0.3357 -0.8969 -0.2878 +vn 0.3762 -0.9246 0.0603 +vn -0.3762 -0.9246 0.0603 +vn -0.1352 -0.9539 0.2680 +vn 0.1352 -0.9539 0.2680 +vn 0.3961 -0.8102 -0.4321 +vn -0.3961 -0.8102 -0.4321 +vn 0.1856 -0.9510 -0.2474 +vn -0.1856 -0.9510 -0.2474 +vn 0.0099 -0.9808 -0.1948 +vn -0.0099 -0.9808 -0.1948 +vn 0.0721 -0.7138 -0.6966 +vn -0.0721 -0.7138 -0.6966 +vn 0.1863 -0.7986 -0.5723 +vn -0.1863 -0.7986 -0.5723 +vn 0.3157 -0.9094 -0.2708 +vn -0.3157 -0.9094 -0.2708 +vn 0.3063 -0.9516 -0.0265 +vn -0.3063 -0.9516 -0.0265 +vn 0.3266 -0.9361 -0.1306 +vn -0.3266 -0.9361 -0.1306 +vn -0.0137 -0.9983 0.0574 +vn 0.0137 -0.9983 0.0574 +vn -0.0026 -0.9978 -0.0656 +vn 0.0026 -0.9978 -0.0656 +vn 0.0000 -1.0000 0.0000 +vn 0.8174 0.0442 -0.5744 +vn -0.8174 0.0442 -0.5744 +vn 0.9494 0.2144 0.2297 +vn -0.9494 0.2144 0.2297 +vn 0.0825 0.4124 0.9073 +vn -0.0825 0.4124 0.9073 +vn -0.8836 -0.3047 0.3555 +vn 0.8836 -0.3047 0.3555 +vn 0.4207 -0.2218 -0.8797 +vn -0.4207 -0.2218 -0.8797 +vn 0.2873 -0.7663 -0.5747 +vn -0.2873 -0.7663 -0.5747 +vn -0.6542 -0.4580 0.6019 +vn 0.6542 -0.4580 0.6019 +vn 0.1052 -0.6051 0.7892 +vn -0.1052 -0.6051 0.7892 +vn 0.7582 -0.5832 0.2916 +vn -0.7582 -0.5832 0.2916 +vn 0.3889 -0.5834 -0.7130 +vn -0.3889 -0.5834 -0.7130 +vn 0.0463 -0.9718 0.2314 +vn -0.0463 -0.9718 0.2314 +vn 0.0335 -0.9151 -0.4018 +vn -0.0335 -0.9151 -0.4018 +vn -0.4452 -0.8809 -0.1610 +vn 0.4452 -0.8809 -0.1610 +vn -0.2182 -0.8729 -0.4364 +vn 0.2182 -0.8729 -0.4364 +vn 0.4341 -0.8916 -0.1290 +vn -0.4341 -0.8916 -0.1290 +vn 0.3008 -0.9524 0.0501 +vn -0.3008 -0.9524 0.0501 +vn 0.8123 -0.4996 0.3010 +vn -0.8123 -0.4996 0.3010 +vn 0.8753 -0.4093 0.2574 +vn -0.8753 -0.4093 0.2574 +vn 0.9385 -0.3060 0.1601 +vn -0.9385 -0.3060 0.1601 +vn 0.2237 -0.7227 -0.6539 +vn -0.2237 -0.7227 -0.6539 +vn -0.1536 -0.9677 -0.1997 +vn 0.1536 -0.9677 -0.1997 +vn -0.2733 -0.9565 -0.1025 +vn 0.2733 -0.9565 -0.1025 +vn -0.0976 -0.9759 0.1952 +vn 0.0976 -0.9759 0.1952 +vn -0.1582 -0.2713 0.9494 +vn 0.1582 -0.2713 0.9494 +vn -0.6934 -0.1328 0.7082 +vn 0.6934 -0.1328 0.7082 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.3051 -0.1181 -0.9450 +vn -0.3051 -0.1181 -0.9450 +vn 0.0298 -0.9541 -0.2981 +vn -0.0298 -0.9541 -0.2981 +vn 0.1353 -0.9277 -0.3479 +vn -0.1353 -0.9277 -0.3479 +vn -0.5085 -0.8158 -0.2755 +vn 0.5085 -0.8158 -0.2755 +vn -0.3843 -0.9223 -0.0419 +vn 0.3843 -0.9223 -0.0419 +vn -0.2083 -0.9774 0.0374 +vn 0.2083 -0.9774 0.0374 +vn -0.5721 -0.6674 -0.4767 +vn 0.5721 -0.6674 -0.4767 +vn -0.1369 -0.6435 -0.7531 +vn 0.1369 -0.6435 -0.7531 +vn 0.4088 -0.6814 -0.6071 +vn -0.4088 -0.6814 -0.6071 +vn 0.5740 -0.7070 -0.4130 +vn -0.5740 -0.7070 -0.4130 +vn 0.5665 -0.8183 -0.0968 +vn -0.5665 -0.8183 -0.0968 +vn 0.5703 -0.8129 0.1180 +vn -0.5703 -0.8129 0.1180 +vn 0.4823 -0.6719 0.5621 +vn -0.4823 -0.6719 0.5621 +vn 0.2604 -0.7473 0.6114 +vn -0.2604 -0.7473 0.6114 +vn 0.1640 -0.9182 0.3607 +vn -0.1640 -0.9182 0.3607 +vn -0.0178 -0.9682 0.2495 +vn 0.0178 -0.9682 0.2495 +vn 0.3273 -0.8481 -0.4166 +vn -0.3273 -0.8481 -0.4166 +vn 0.2811 -0.9235 -0.2610 +vn -0.2811 -0.9235 -0.2610 +vn -0.2542 -0.7149 -0.6514 +vn 0.2542 -0.7149 -0.6514 +vn -0.0260 -0.5333 -0.8455 +vn 0.0260 -0.5333 -0.8455 +vn -0.3518 -0.8991 -0.2606 +vn 0.3518 -0.8991 -0.2606 +vn -0.3523 -0.9358 -0.0110 +vn 0.3523 -0.9358 -0.0110 +vn -0.1317 -0.8777 0.4608 +vn 0.1317 -0.8777 0.4608 +vn -0.0342 -0.7870 0.6159 +vn 0.0342 -0.7870 0.6159 +vn 0.3603 -0.7277 0.5836 +vn -0.3603 -0.7277 0.5836 +vn 0.4988 -0.6858 0.5300 +vn -0.4988 -0.6858 0.5300 +vn 0.6667 -0.6667 -0.3333 +vn -0.6667 -0.6667 -0.3333 +vn 0.8165 -0.5727 -0.0731 +vn -0.8165 -0.5727 -0.0731 +vn 0.7840 -0.6098 0.1161 +vn -0.7840 -0.6098 0.1161 +vn -0.5306 0.2461 0.8111 +vn 0.5306 0.2461 0.8111 +vn -0.8511 0.3730 0.3695 +vn 0.8511 0.3730 0.3695 +vn -0.2446 0.4331 0.8675 +vn 0.2446 0.4331 0.8675 +vn 0.5924 0.3030 0.7465 +vn -0.5924 0.3030 0.7465 +vn 0.3685 0.3118 0.8758 +vn -0.3685 0.3118 0.8758 +vn 0.2821 0.2880 0.9151 +vn -0.2821 0.2880 0.9151 +vn 0.8561 0.4991 0.1340 +vn -0.8561 0.4991 0.1340 +vn 0.5342 0.4376 -0.7233 +vn -0.5342 0.4376 -0.7233 +vn 0.3849 0.4368 -0.8131 +vn -0.3849 0.4368 -0.8131 +vn 0.2335 0.7800 -0.5806 +vn -0.2335 0.7800 -0.5806 +vn 0.2449 0.9678 -0.0583 +vn -0.2449 0.9678 -0.0583 +vn 0.1163 0.8837 -0.4535 +vn -0.1163 0.8837 -0.4535 +vn 0.1152 0.1388 -0.9836 +vn -0.1152 0.1388 -0.9836 +vn 0.1184 0.2260 -0.9669 +vn -0.1184 0.2260 -0.9669 +vn 0.9597 0.2808 -0.0085 +vn -0.9597 0.2808 -0.0085 +vn 0.9319 0.3242 0.1629 +vn -0.9319 0.3242 0.1629 +vn 0.1626 0.9865 0.0207 +vn -0.1626 0.9865 0.0207 +vn -0.0188 0.9758 -0.2177 +vn 0.0188 0.9758 -0.2177 +vn 0.7538 0.5884 -0.2926 +vn -0.7538 0.5884 -0.2926 +vn 0.9196 0.3678 0.1379 +vn -0.9196 0.3678 0.1379 +vn 0.9297 0.1944 0.3127 +vn -0.9297 0.1944 0.3127 +vn 0.9120 0.2329 0.3376 +vn -0.9120 0.2329 0.3376 +vn 0.9407 0.0607 0.3338 +vn -0.9407 0.0607 0.3338 +vn 0.1761 0.4402 -0.8805 +vn -0.1761 0.4402 -0.8805 +vn 0.3708 0.7991 -0.4733 +vn -0.3708 0.7991 -0.4733 +vn 0.3107 0.4660 -0.8284 +vn -0.3107 0.4660 -0.8284 +vn 0.2793 0.1287 -0.9515 +vn -0.2793 0.1287 -0.9515 +vn 0.3139 0.1807 -0.9321 +vn -0.3139 0.1807 -0.9321 +vn 0.9762 0.0609 -0.2083 +vn -0.9762 0.0609 -0.2083 +vn 0.8267 -0.2447 -0.5066 +vn -0.8267 -0.2447 -0.5066 +vn 0.3449 0.9315 -0.1158 +vn -0.3449 0.9315 -0.1158 +vn 0.1203 -0.2355 0.9644 +vn -0.1203 -0.2355 0.9644 +vn 0.1275 0.1851 0.9744 +vn -0.1275 0.1851 0.9744 +vn 0.3492 0.7241 0.5947 +vn -0.3492 0.7241 0.5947 +vn 0.4153 0.1449 0.8981 +vn -0.4153 0.1449 0.8981 +vn 0.1845 -0.6863 0.7036 +vn -0.1845 -0.6863 0.7036 +vn 0.6056 -0.1608 0.7794 +vn -0.6056 -0.1608 0.7794 +vn 0.7033 0.2053 0.6806 +vn -0.7033 0.2053 0.6806 +vn 0.6679 0.7166 0.2007 +vn -0.6679 0.7166 0.2007 +vn 0.4948 0.7528 0.4342 +vn -0.4948 0.7528 0.4342 +vn 0.6423 0.1761 0.7459 +vn -0.6423 0.1761 0.7459 +vn 0.7182 -0.1530 0.6788 +vn -0.7182 -0.1530 0.6788 +vn 0.7388 -0.5444 0.3972 +vn -0.7388 -0.5444 0.3972 +vn 0.3428 0.1579 0.9261 +vn -0.3428 0.1579 0.9261 +vn 0.2270 -0.7867 0.5740 +vn -0.2270 -0.7867 0.5740 +vn -0.1722 0.9795 0.1046 +vn 0.1722 0.9795 0.1046 +vn 0.0425 -0.4013 0.9150 +vn -0.0425 -0.4013 0.9150 +vn -0.1616 -0.9694 0.1847 +vn 0.1616 -0.9694 0.1847 +vn 0.9791 -0.0483 0.1973 +vn -0.9791 -0.0483 0.1973 +vn 0.9470 -0.3079 0.0918 +vn -0.9470 -0.3079 0.0918 +vn 0.9794 0.0661 0.1905 +vn -0.9794 0.0661 0.1905 +vn 0.9938 0.1070 0.0312 +vn -0.9938 0.1070 0.0312 +vn 0.7116 -0.0501 -0.7008 +vn -0.7116 -0.0501 -0.7008 +vn 0.3722 -0.0847 -0.9243 +vn -0.3722 -0.0847 -0.9243 +vn 0.4465 -0.2310 -0.8644 +vn -0.4465 -0.2310 -0.8644 +vn 0.6066 -0.2405 -0.7578 +vn -0.6066 -0.2405 -0.7578 +vn 0.7325 -0.2407 -0.6368 +vn -0.7325 -0.2407 -0.6368 +vn 0.2637 -0.8533 -0.4499 +vn -0.2637 -0.8533 -0.4499 +vn 0.5568 0.7673 -0.3181 +vn -0.5568 0.7673 -0.3181 +vn 0.5004 0.8190 -0.2807 +vn -0.5004 0.8190 -0.2807 +vn 0.3190 0.4205 -0.8494 +vn -0.3190 0.4205 -0.8494 +vn 0.7198 0.2793 -0.6356 +vn -0.7198 0.2793 -0.6356 +vn 0.4972 0.7473 -0.4408 +vn -0.4972 0.7473 -0.4408 +vn 0.3506 -0.8557 0.3807 +vn -0.3506 -0.8557 0.3807 +vn 0.4566 -0.8730 0.1715 +vn -0.4566 -0.8730 0.1715 +vn 0.2583 -0.9603 0.1055 +vn -0.2583 -0.9603 0.1055 +vn 0.2455 -0.9661 -0.0802 +vn -0.2455 -0.9661 -0.0802 +vn 0.4643 -0.8837 -0.0599 +vn -0.4643 -0.8837 -0.0599 +vn 0.6225 -0.7210 -0.3045 +vn -0.6225 -0.7210 -0.3045 +vn 0.4500 -0.6027 0.6590 +vn -0.4500 -0.6027 0.6590 +vn -0.2667 -0.4884 0.8309 +vn 0.2667 -0.4884 0.8309 +vn -0.8284 -0.5111 0.2291 +vn 0.8284 -0.5111 0.2291 +vn -0.5251 -0.7727 -0.3566 +vn 0.5251 -0.7727 -0.3566 +vn 0.4546 -0.6873 -0.5665 +vn -0.4546 -0.6873 -0.5665 +vn 0.6996 -0.5552 -0.4497 +vn -0.6996 -0.5552 -0.4497 +vn 0.7220 0.1126 -0.6827 +vn -0.7220 0.1126 -0.6827 +vn -0.1919 -0.9388 0.2860 +vn 0.1919 -0.9388 0.2860 +vn 0.9048 0.2047 -0.3734 +vn -0.9048 0.2047 -0.3734 +vn 0.1034 -0.9825 0.1551 +vn -0.1034 -0.9825 0.1551 +vn 0.0841 -0.3530 0.9318 +vn -0.0841 -0.3530 0.9318 +vn 0.6446 -0.7594 -0.0883 +vn -0.6446 -0.7594 -0.0883 +vn 0.4309 -0.7678 0.4740 +vn -0.4309 -0.7678 0.4740 +vn 0.8032 -0.3462 -0.4847 +vn -0.8032 -0.3462 -0.4847 +vn 0.5811 -0.7014 -0.4128 +vn -0.5811 -0.7014 -0.4128 +vn 0.5910 -0.6822 -0.4305 +vn -0.5910 -0.6822 -0.4305 +vn 0.9818 0.0591 -0.1804 +vn -0.9818 0.0591 -0.1804 +vn 0.9105 0.1175 -0.3965 +vn -0.9105 0.1175 -0.3965 +vn 0.9972 0.0725 -0.0181 +vn -0.9972 0.0725 -0.0181 +vn 0.7313 -0.1925 -0.6543 +vn -0.7313 -0.1925 -0.6543 +vn 0.7867 -0.1073 -0.6079 +vn -0.7867 -0.1073 -0.6079 +vn 0.7022 -0.1170 -0.7022 +vn -0.7022 -0.1170 -0.7022 +vn 0.1840 0.0511 0.9816 +vn -0.1840 0.0511 0.9816 +vn 0.9352 -0.1284 0.3301 +vn -0.9352 -0.1284 0.3301 +vn 0.6633 -0.0553 -0.7463 +vn -0.6633 -0.0553 -0.7463 +vn -0.0085 -0.0767 0.9970 +vn 0.0085 -0.0767 0.9970 +vn 0.6237 -0.3354 -0.7061 +vn -0.6237 -0.3354 -0.7061 +vn 0.2733 -0.3587 -0.8925 +vn -0.2733 -0.3587 -0.8925 +vn -0.8328 0.2200 -0.5080 +vn 0.8328 0.2200 -0.5080 +vn -0.8339 0.4981 0.2377 +vn 0.8339 0.4981 0.2377 +vn -0.5655 0.2539 0.7847 +vn 0.5655 0.2539 0.7847 +vn -0.0560 -0.0672 0.9962 +vn 0.0560 -0.0672 0.9962 +vn 0.1445 -0.9893 0.0222 +vn -0.1445 -0.9893 0.0222 +vn 0.3275 -0.9427 0.0645 +vn -0.3275 -0.9427 0.0645 +vn 0.3127 -0.9496 0.0232 +vn -0.3127 -0.9496 0.0232 +vn 0.1710 -0.9849 0.0274 +vn -0.1710 -0.9849 0.0274 +vn 0.3487 -0.8929 0.2849 +vn -0.3487 -0.8929 0.2849 +vn 0.4006 -0.9156 -0.0343 +vn -0.4006 -0.9156 -0.0343 +vn 0.2572 -0.9645 -0.0603 +vn -0.2572 -0.9645 -0.0603 +vn 0.0637 -0.9979 -0.0106 +vn -0.0637 -0.9979 -0.0106 +vn -0.3637 -0.6101 0.7039 +vn 0.3637 -0.6101 0.7039 +vn 0.6299 -0.7759 0.0355 +vn -0.6299 -0.7759 0.0355 +vn 0.4472 -0.8717 -0.2002 +vn -0.4472 -0.8717 -0.2002 +vn 0.5072 -0.8348 -0.2141 +vn -0.5072 -0.8348 -0.2141 +vn 0.5258 -0.8093 0.2619 +vn -0.5258 -0.8093 0.2619 +vn 0.2980 -0.7580 0.5802 +vn -0.2980 -0.7580 0.5802 +vn 0.0930 0.0805 -0.9924 +vn -0.0930 0.0805 -0.9924 +vn 0.5006 -0.0080 -0.8657 +vn -0.5006 -0.0080 -0.8657 +vn 0.9285 -0.2748 -0.2497 +vn -0.9285 -0.2748 -0.2497 +vn 0.8393 0.0378 0.5424 +vn -0.8393 0.0378 0.5424 +vn -0.2355 0.2589 0.9367 +vn 0.2355 0.2589 0.9367 +vn -0.4499 0.1285 0.8838 +vn 0.4499 0.1285 0.8838 +vn -0.5384 0.8427 -0.0098 +vn 0.5384 0.8427 -0.0098 +vn -0.1910 0.9813 -0.0241 +vn 0.1910 0.9813 -0.0241 +vn 0.4046 0.9141 0.0266 +vn -0.4046 0.9141 0.0266 +vn -0.7819 -0.0197 0.6231 +vn 0.7819 -0.0197 0.6231 +vn 0.5428 0.8142 -0.2063 +vn -0.5428 0.8142 -0.2063 +vn -0.2474 0.2945 -0.9231 +vn 0.2474 0.2945 -0.9231 +s off +f 47/1/1 1/2/1 3/3/1 45/4/1 +f 4/5/2 2/6/2 48/7/2 46/8/2 +f 45/4/3 3/3/3 5/9/3 43/10/3 +f 6/11/4 4/5/4 46/8/4 44/12/4 +f 3/3/5 9/13/5 7/14/5 5/9/5 +f 8/15/6 10/16/6 4/5/6 6/11/6 +f 1/2/7 11/17/7 9/13/7 3/3/7 +f 10/16/8 12/18/8 2/6/8 4/5/8 +f 11/17/9 13/19/9 15/20/9 9/13/9 +f 16/21/10 14/22/10 12/18/10 10/16/10 +f 9/13/11 15/20/11 17/23/11 7/14/11 +f 18/24/12 16/21/12 10/16/12 8/15/12 +f 15/20/13 21/25/13 19/26/13 17/23/13 +f 20/27/14 22/28/14 16/21/14 18/24/14 +f 13/19/15 23/29/15 21/25/15 15/20/15 +f 22/28/16 24/30/16 14/22/16 16/21/16 +f 23/29/17 25/31/17 27/32/17 21/25/17 +f 28/33/18 26/34/18 24/30/18 22/28/18 +f 21/25/19 27/32/19 29/35/19 19/26/19 +f 30/36/20 28/33/20 22/28/20 20/27/20 +f 27/32/21 33/37/21 31/38/21 29/35/21 +f 32/39/22 34/40/22 28/33/22 30/36/22 +f 25/31/23 35/41/23 33/37/23 27/32/23 +f 34/40/24 36/42/24 26/34/24 28/33/24 +f 35/41/25 37/43/25 39/44/25 33/37/25 +f 40/45/26 38/46/26 36/42/26 34/40/26 +f 33/37/27 39/44/27 41/47/27 31/38/27 +f 42/48/28 40/45/28 34/40/28 32/39/28 +f 39/44/29 45/4/29 43/10/29 41/47/29 +f 44/12/30 46/8/30 40/45/30 42/48/30 +f 37/43/31 47/1/31 45/4/31 39/44/31 +f 46/8/32 48/7/32 38/46/32 40/45/32 +f 47/1/33 37/43/33 51/49/33 49/50/33 +f 52/51/34 38/46/34 48/7/34 50/52/34 +f 37/43/35 35/41/35 53/53/35 51/49/35 +f 54/54/36 36/42/36 38/46/36 52/51/36 +f 35/41/37 25/31/37 55/55/37 53/53/37 +f 56/56/38 26/34/38 36/42/38 54/54/38 +f 25/31/39 23/29/39 57/57/39 55/55/39 +f 58/58/40 24/30/40 26/34/40 56/56/40 +f 23/29/41 13/19/41 59/59/41 57/57/41 +f 60/60/42 14/22/42 24/30/42 58/58/42 +f 13/19/43 11/17/43 63/61/43 59/59/43 +f 64/62/44 12/18/44 14/22/44 60/60/44 +f 11/17/45 1/2/45 65/63/45 63/61/45 +f 66/64/46 2/6/46 12/18/46 64/62/46 +f 1/2/47 47/1/47 49/50/47 65/63/47 +f 50/52/48 48/7/48 2/6/48 66/64/48 +f 61/65/49 65/63/49 49/50/49 +f 50/52/50 66/64/50 62/66/50 +f 63/61/51 65/63/51 61/65/51 +f 62/66/52 66/64/52 64/62/52 +f 61/65/53 59/59/53 63/61/53 +f 64/62/54 60/60/54 62/66/54 +f 61/65/55 57/57/55 59/59/55 +f 60/60/56 58/58/56 62/66/56 +f 61/65/57 55/55/57 57/57/57 +f 58/58/58 56/56/58 62/66/58 +f 61/65/59 53/53/59 55/55/59 +f 56/56/60 54/54/60 62/66/60 +f 61/65/61 51/49/61 53/53/61 +f 54/54/62 52/51/62 62/66/62 +f 61/65/63 49/50/63 51/49/63 +f 52/51/64 50/52/64 62/66/64 +f 89/67/65 174/68/65 176/69/65 91/70/65 +f 176/69/66 175/71/66 90/72/66 91/70/66 +f 87/73/67 172/74/67 174/68/67 89/67/67 +f 175/71/68 173/75/68 88/76/68 90/72/68 +f 85/77/69 170/78/69 172/74/69 87/73/69 +f 173/75/70 171/79/70 86/80/70 88/76/70 +f 83/81/71 168/82/71 170/78/71 85/77/71 +f 171/79/72 169/83/72 84/84/72 86/80/72 +f 81/85/73 166/86/73 168/82/73 83/81/73 +f 169/83/74 167/87/74 82/88/74 84/84/74 +f 79/89/75 92/90/75 146/91/75 164/92/75 +f 147/93/76 93/94/76 80/95/76 165/96/76 +f 92/90/77 94/97/77 148/98/77 146/91/77 +f 149/99/78 95/100/78 93/94/78 147/93/78 +f 94/97/79 96/101/79 150/102/79 148/98/79 +f 151/103/80 97/104/80 95/100/80 149/99/80 +f 96/101/81 98/105/81 152/106/81 150/102/81 +f 153/107/82 99/108/82 97/104/82 151/103/82 +f 98/105/83 100/109/83 154/110/83 152/106/83 +f 155/111/84 101/112/84 99/108/84 153/107/84 +f 100/109/85 102/113/85 156/114/85 154/110/85 +f 157/115/86 103/116/86 101/112/86 155/111/86 +f 102/113/87 104/117/87 158/118/87 156/114/87 +f 159/119/88 105/120/88 103/116/88 157/115/88 +f 104/117/89 106/121/89 160/122/89 158/118/89 +f 161/123/90 107/124/90 105/120/90 159/119/90 +f 106/121/91 108/125/91 162/126/91 160/122/91 +f 163/127/92 109/128/92 107/124/92 161/123/92 +f 108/125/93 67/129/93 68/130/93 162/126/93 +f 68/130/94 67/129/94 109/128/94 163/127/94 +f 110/131/95 128/132/95 160/122/95 162/126/95 +f 161/123/96 129/133/96 111/134/96 163/127/96 +f 128/132/97 179/135/97 158/118/97 160/122/97 +f 159/119/98 180/136/98 129/133/98 161/123/98 +f 126/137/99 156/114/99 158/118/99 179/135/99 +f 159/119/100 157/115/100 127/138/100 180/136/100 +f 124/139/101 154/110/101 156/114/101 126/137/101 +f 157/115/102 155/111/102 125/140/102 127/138/102 +f 122/141/103 152/106/103 154/110/103 124/139/103 +f 155/111/104 153/107/104 123/142/104 125/140/104 +f 120/143/105 150/102/105 152/106/105 122/141/105 +f 153/107/106 151/103/106 121/144/106 123/142/106 +f 118/145/107 148/98/107 150/102/107 120/143/107 +f 151/103/108 149/99/108 119/146/108 121/144/108 +f 116/147/109 146/91/109 148/98/109 118/145/109 +f 149/99/110 147/93/110 117/148/110 119/146/110 +f 114/149/111 164/92/111 146/91/111 116/147/111 +f 147/93/112 165/96/112 115/150/112 117/148/112 +f 114/149/113 181/151/113 177/152/113 164/92/113 +f 177/152/114 182/153/114 115/150/114 165/96/114 +f 110/131/115 162/126/115 68/130/115 112/154/115 +f 68/130/116 163/127/116 111/134/116 113/155/116 +f 112/154/117 68/130/117 178/156/117 183/157/117 +f 178/156/118 68/130/118 113/155/118 184/158/118 +f 177/152/119 181/151/119 183/157/119 178/156/119 +f 184/158/120 182/153/120 177/152/120 178/156/120 +f 135/159/121 137/160/121 176/69/121 174/68/121 +f 176/69/122 137/160/122 136/161/122 175/71/122 +f 133/162/123 135/159/123 174/68/123 172/74/123 +f 175/71/124 136/161/124 134/163/124 173/75/124 +f 131/164/125 133/162/125 172/74/125 170/78/125 +f 173/75/126 134/163/126 132/165/126 171/79/126 +f 166/86/127 187/166/127 185/167/127 168/82/127 +f 186/168/128 188/169/128 167/87/128 169/83/128 +f 131/164/129 170/78/129 168/82/129 185/167/129 +f 169/83/130 171/79/130 132/165/130 186/168/130 +f 144/170/131 190/171/131 189/172/131 187/166/131 +f 189/172/132 190/171/132 145/173/132 188/169/132 +f 185/167/133 187/166/133 189/172/133 69/174/133 +f 189/172/134 188/169/134 186/168/134 69/174/134 +f 130/175/135 131/164/135 185/167/135 69/174/135 +f 186/168/135 132/165/135 130/175/135 69/174/135 +f 142/176/136 193/177/136 191/178/136 144/170/136 +f 192/179/137 194/180/137 143/181/137 145/173/137 +f 140/182/138 195/183/138 193/177/138 142/176/138 +f 194/180/139 196/184/139 141/185/139 143/181/139 +f 139/186/140 197/187/140 195/183/140 140/182/140 +f 196/184/141 198/188/141 139/186/141 141/185/141 +f 138/189/142 71/190/142 197/187/142 139/186/142 +f 198/188/143 71/190/143 138/189/143 139/186/143 +f 190/171/144 144/170/144 191/178/144 70/191/144 +f 192/179/145 145/173/145 190/171/145 70/191/145 +f 70/191/146 191/178/146 206/192/146 208/193/146 +f 207/194/147 192/179/147 70/191/147 208/193/147 +f 71/190/148 199/195/148 200/196/148 197/187/148 +f 201/197/149 199/195/149 71/190/149 198/188/149 +f 197/187/150 200/196/150 202/198/150 195/183/150 +f 203/199/151 201/197/151 198/188/151 196/184/151 +f 195/183/152 202/198/152 204/200/152 193/177/152 +f 205/201/153 203/199/153 196/184/153 194/180/153 +f 193/177/154 204/200/154 206/192/154 191/178/154 +f 207/194/155 205/201/155 194/180/155 192/179/155 +f 199/195/156 204/200/156 202/198/156 200/196/156 +f 203/199/157 205/201/157 199/195/157 201/197/157 +f 199/195/158 208/193/158 206/192/158 204/200/158 +f 207/194/159 208/193/159 199/195/159 205/201/159 +f 139/186/160 140/182/160 164/92/160 177/152/160 +f 165/96/161 141/185/161 139/186/161 177/152/161 +f 140/182/162 142/176/162 211/202/162 164/92/162 +f 212/203/163 143/181/163 141/185/163 165/96/163 +f 142/176/164 144/170/164 213/204/164 211/202/164 +f 214/205/165 145/173/165 143/181/165 212/203/165 +f 144/170/166 187/166/166 166/86/166 213/204/166 +f 167/87/167 188/169/167 145/173/167 214/205/167 +f 81/85/168 209/206/168 213/204/168 166/86/168 +f 214/205/169 210/207/169 82/88/169 167/87/169 +f 209/206/170 215/208/170 211/202/170 213/204/170 +f 212/203/171 216/209/171 210/207/171 214/205/171 +f 79/89/172 164/92/172 211/202/172 215/208/172 +f 212/203/173 165/96/173 80/95/173 216/209/173 +f 131/164/174 130/175/174 72/210/174 222/211/174 +f 72/210/175 130/175/175 132/165/175 223/212/175 +f 133/162/176 131/164/176 222/211/176 220/213/176 +f 223/212/177 132/165/177 134/163/177 221/214/177 +f 135/159/178 133/162/178 220/213/178 218/215/178 +f 221/214/179 134/163/179 136/161/179 219/216/179 +f 137/160/180 135/159/180 218/215/180 217/217/180 +f 219/216/181 136/161/181 137/160/181 217/217/181 +f 217/217/182 218/215/182 229/218/182 231/219/182 +f 230/220/183 219/216/183 217/217/183 231/219/183 +f 218/215/184 220/213/184 227/221/184 229/218/184 +f 228/222/185 221/214/185 219/216/185 230/220/185 +f 220/213/186 222/211/186 225/223/186 227/221/186 +f 226/224/187 223/212/187 221/214/187 228/222/187 +f 222/211/188 72/210/188 224/225/188 225/223/188 +f 224/225/189 72/210/189 223/212/189 226/224/189 +f 224/225/190 231/219/190 229/218/190 225/223/190 +f 230/220/191 231/219/191 224/225/191 226/224/191 +f 225/223/192 229/218/192 227/221/192 +f 228/222/193 230/220/193 226/224/193 +f 183/157/194 181/151/194 234/226/194 232/227/194 +f 235/228/195 182/153/195 184/158/195 233/229/195 +f 112/154/196 183/157/196 232/227/196 254/230/196 +f 233/229/197 184/158/197 113/155/197 255/231/197 +f 110/131/198 112/154/198 254/230/198 256/232/198 +f 255/231/199 113/155/199 111/134/199 257/233/199 +f 181/151/200 114/149/200 252/234/200 234/226/200 +f 253/235/201 115/150/201 182/153/201 235/228/201 +f 114/149/202 116/147/202 250/236/202 252/234/202 +f 251/237/203 117/148/203 115/150/203 253/235/203 +f 116/147/204 118/145/204 248/238/204 250/236/204 +f 249/239/205 119/146/205 117/148/205 251/237/205 +f 118/145/206 120/143/206 246/240/206 248/238/206 +f 247/241/207 121/144/207 119/146/207 249/239/207 +f 120/143/208 122/141/208 244/242/208 246/240/208 +f 245/243/209 123/142/209 121/144/209 247/241/209 +f 122/141/210 124/139/210 242/244/210 244/242/210 +f 243/245/211 125/140/211 123/142/211 245/243/211 +f 124/139/212 126/137/212 240/246/212 242/244/212 +f 241/247/213 127/138/213 125/140/213 243/245/213 +f 126/137/214 179/135/214 236/248/214 240/246/214 +f 237/249/215 180/136/215 127/138/215 241/247/215 +f 179/135/216 128/132/216 238/250/216 236/248/216 +f 239/251/217 129/133/217 180/136/217 237/249/217 +f 128/132/218 110/131/218 256/232/218 238/250/218 +f 257/233/219 111/134/219 129/133/219 239/251/219 +f 238/250/220 256/232/220 258/252/220 276/253/220 +f 259/254/221 257/233/221 239/251/221 277/255/221 +f 236/248/222 238/250/222 276/253/222 278/256/222 +f 277/255/223 239/251/223 237/249/223 279/257/223 +f 240/246/224 236/248/224 278/256/224 274/258/224 +f 279/257/225 237/249/225 241/247/225 275/259/225 +f 242/244/226 240/246/226 274/258/226 272/260/226 +f 275/259/227 241/247/227 243/245/227 273/261/227 +f 244/242/228 242/244/228 272/260/228 270/262/228 +f 273/261/229 243/245/229 245/243/229 271/263/229 +f 246/240/230 244/242/230 270/262/230 268/264/230 +f 271/263/231 245/243/231 247/241/231 269/265/231 +f 248/238/232 246/240/232 268/264/232 266/266/232 +f 269/265/233 247/241/233 249/239/233 267/267/233 +f 250/236/234 248/238/234 266/266/234 264/268/234 +f 267/267/235 249/239/235 251/237/235 265/269/235 +f 252/234/236 250/236/236 264/268/236 262/270/236 +f 265/269/237 251/237/237 253/235/237 263/271/237 +f 234/226/238 252/234/238 262/270/238 280/272/238 +f 263/271/239 253/235/239 235/228/239 281/273/239 +f 256/232/240 254/230/240 260/274/240 258/252/240 +f 261/275/241 255/231/241 257/233/241 259/254/241 +f 254/230/242 232/227/242 282/276/242 260/274/242 +f 283/277/243 233/229/243 255/231/243 261/275/243 +f 232/227/244 234/226/244 280/272/244 282/276/244 +f 281/273/245 235/228/245 233/229/245 283/277/245 +f 67/129/246 108/125/246 284/278/246 73/279/246 +f 285/280/247 109/128/247 67/129/247 73/279/247 +f 108/125/248 106/121/248 286/281/248 284/278/248 +f 287/282/249 107/124/249 109/128/249 285/280/249 +f 106/121/250 104/117/250 288/283/250 286/281/250 +f 289/284/251 105/120/251 107/124/251 287/282/251 +f 104/117/252 102/113/252 290/285/252 288/283/252 +f 291/286/253 103/116/253 105/120/253 289/284/253 +f 102/113/254 100/109/254 292/287/254 290/285/254 +f 293/288/255 101/112/255 103/116/255 291/286/255 +f 100/109/256 98/105/256 294/289/256 292/287/256 +f 295/290/257 99/108/257 101/112/257 293/288/257 +f 98/105/258 96/101/258 296/291/258 294/289/258 +f 297/292/259 97/104/259 99/108/259 295/290/259 +f 96/101/260 94/97/260 298/293/260 296/291/260 +f 299/294/261 95/100/261 97/104/261 297/292/261 +f 94/97/262 92/90/262 300/295/262 298/293/262 +f 301/296/263 93/94/263 95/100/263 299/294/263 +f 308/297/264 309/298/264 328/299/264 338/300/264 +f 329/301/265 309/302/265 308/303/265 339/304/265 +f 307/305/266 308/297/266 338/300/266 336/306/266 +f 339/304/267 308/303/267 307/307/267 337/308/267 +f 306/309/268 307/305/268 336/306/268 340/310/268 +f 337/308/269 307/307/269 306/309/269 341/311/269 +f 89/67/270 91/70/270 306/309/270 340/310/270 +f 306/309/271 91/70/271 90/72/271 341/311/271 +f 87/73/272 89/67/272 340/310/272 334/312/272 +f 341/311/273 90/72/273 88/76/273 335/313/273 +f 85/77/274 87/73/274 334/312/274 330/314/274 +f 335/313/275 88/76/275 86/80/275 331/315/275 +f 83/81/276 85/77/276 330/314/276 332/316/276 +f 331/315/277 86/80/277 84/84/277 333/317/277 +f 330/314/278 336/306/278 338/300/278 332/316/278 +f 339/304/279 337/308/279 331/315/279 333/317/279 +f 330/314/280 334/312/280 340/310/280 336/306/280 +f 341/311/281 335/313/281 331/315/281 337/308/281 +f 326/318/282 332/316/282 338/300/282 328/299/282 +f 339/304/283 333/317/283 327/319/283 329/301/283 +f 81/85/284 83/81/284 332/316/284 326/318/284 +f 333/317/285 84/84/285 82/88/285 327/319/285 +f 209/206/286 342/320/286 344/321/286 215/208/286 +f 345/322/287 343/323/287 210/207/287 216/209/287 +f 81/85/288 326/318/288 342/320/288 209/206/288 +f 343/323/289 327/319/289 82/88/289 210/207/289 +f 79/89/290 215/208/290 344/321/290 346/324/290 +f 345/322/291 216/209/291 80/95/291 347/325/291 +f 79/89/292 346/324/292 300/295/292 92/90/292 +f 301/296/293 347/325/293 80/95/293 93/94/293 +f 77/326/294 324/327/294 352/328/294 304/329/294 +f 353/330/295 325/331/295 77/332/295 304/333/295 +f 304/329/296 352/328/296 350/334/296 78/335/296 +f 351/336/297 353/330/297 304/333/297 78/337/297 +f 78/335/298 350/334/298 348/338/298 305/339/298 +f 349/340/299 351/336/299 78/337/299 305/341/299 +f 305/339/300 348/338/300 328/299/300 309/298/300 +f 329/301/301 349/340/301 305/341/301 309/302/301 +f 326/318/302 328/299/302 348/338/302 342/320/302 +f 349/340/303 329/301/303 327/319/303 343/323/303 +f 296/291/304 298/293/304 318/342/304 310/343/304 +f 319/344/305 299/294/305 297/292/305 311/345/305 +f 76/346/306 316/347/306 324/327/306 77/326/306 +f 325/331/307 317/348/307 76/349/307 77/332/307 +f 302/350/308 358/351/308 356/352/308 303/353/308 +f 357/354/309 359/355/309 302/356/309 303/357/309 +f 303/353/310 356/352/310 354/358/310 75/359/310 +f 355/360/311 357/354/311 303/357/311 75/361/311 +f 75/359/312 354/358/312 316/347/312 76/346/312 +f 317/348/313 355/360/313 75/361/313 76/349/313 +f 292/362/314 294/289/314 362/363/314 364/364/314 +f 363/365/315 295/290/315 293/366/315 365/367/315 +f 364/364/316 362/363/316 368/368/316 366/369/316 +f 369/370/317 363/365/317 365/367/317 367/371/317 +f 366/369/318 368/368/318 370/372/318 372/373/318 +f 371/374/319 369/370/319 367/371/319 373/375/319 +f 372/373/320 370/372/320 376/376/320 374/377/320 +f 377/378/321 371/374/321 373/375/321 375/379/321 +f 314/380/322 378/381/322 374/377/322 376/376/322 +f 375/379/323 379/382/323 315/383/323 377/378/323 +f 316/347/324 354/358/324 374/377/324 378/381/324 +f 375/379/325 355/360/325 317/348/325 379/382/325 +f 354/358/326 356/352/326 372/373/326 374/377/326 +f 373/375/327 357/354/327 355/360/327 375/379/327 +f 356/352/328 358/351/328 366/369/328 372/373/328 +f 367/371/329 359/355/329 357/354/329 373/375/329 +f 358/351/330 360/384/330 364/364/330 366/369/330 +f 365/367/331 361/385/331 359/355/331 367/371/331 +f 290/386/332 292/362/332 364/364/332 360/384/332 +f 365/367/333 293/366/333 291/387/333 361/385/333 +f 74/388/334 360/384/334 358/351/334 302/350/334 +f 359/355/335 361/385/335 74/389/335 302/356/335 +f 284/390/336 286/391/336 288/392/336 290/386/336 +f 289/393/337 287/394/337 285/395/337 291/387/337 +f 284/390/338 290/386/338 360/384/338 74/388/338 +f 361/385/339 291/387/339 285/395/339 74/389/339 +f 73/396/340 284/390/340 74/388/340 +f 74/389/341 285/395/341 73/397/341 +f 294/289/342 296/291/342 310/343/342 362/363/342 +f 311/345/343 297/292/343 295/290/343 363/365/343 +f 310/343/344 312/398/344 368/368/344 362/363/344 +f 369/370/345 313/399/345 311/345/345 363/365/345 +f 312/398/346 382/400/346 370/372/346 368/368/346 +f 371/374/347 383/401/347 313/399/347 369/370/347 +f 314/380/348 376/376/348 370/372/348 382/400/348 +f 371/374/349 377/378/349 315/383/349 383/401/349 +f 348/338/350 350/334/350 386/402/350 384/403/350 +f 387/404/351 351/336/351 349/340/351 385/405/351 +f 318/342/352 384/403/352 386/402/352 320/406/352 +f 387/404/353 385/405/353 319/344/353 321/407/353 +f 298/293/354 300/295/354 384/403/354 318/342/354 +f 385/405/355 301/296/355 299/294/355 319/344/355 +f 300/295/356 344/321/356 342/320/356 384/403/356 +f 343/323/357 345/322/357 301/296/357 385/405/357 +f 342/320/358 348/338/358 384/403/358 +f 385/405/359 349/340/359 343/323/359 +f 300/295/360 346/324/360 344/321/360 +f 345/322/361 347/325/361 301/296/361 +f 314/380/362 322/408/362 380/409/362 378/381/362 +f 381/410/363 323/411/363 315/383/363 379/382/363 +f 316/347/364 378/381/364 380/409/364 324/327/364 +f 381/410/365 379/382/365 317/348/365 325/331/365 +f 320/406/366 386/402/366 380/409/366 322/408/366 +f 381/410/367 387/404/367 321/407/367 323/411/367 +f 350/334/368 352/328/368 380/409/368 386/402/368 +f 381/410/369 353/330/369 351/336/369 387/404/369 +f 324/327/370 380/409/370 352/328/370 +f 353/330/371 381/410/371 325/331/371 +f 400/412/372 388/413/372 414/414/372 402/415/372 +f 415/416/373 389/417/373 401/418/373 403/419/373 +f 400/412/374 402/415/374 404/420/374 398/421/374 +f 405/422/375 403/419/375 401/418/375 399/423/375 +f 398/421/376 404/420/376 406/424/376 396/425/376 +f 407/426/377 405/422/377 399/423/377 397/427/377 +f 396/425/378 406/424/378 408/428/378 394/429/378 +f 409/430/379 407/426/379 397/427/379 395/431/379 +f 394/429/380 408/428/380 410/432/380 392/433/380 +f 411/434/381 409/430/381 395/431/381 393/435/381 +f 392/433/382 410/432/382 412/436/382 390/437/382 +f 413/438/383 411/434/383 393/435/383 391/439/383 +f 410/432/384 420/440/384 418/441/384 412/436/384 +f 419/442/385 421/443/385 411/434/385 413/438/385 +f 408/428/386 422/444/386 420/440/386 410/432/386 +f 421/443/387 423/445/387 409/430/387 411/434/387 +f 406/424/388 424/446/388 422/444/388 408/428/388 +f 423/445/389 425/447/389 407/426/389 409/430/389 +f 404/420/390 426/448/390 424/446/390 406/424/390 +f 425/447/391 427/449/391 405/422/391 407/426/391 +f 402/415/392 428/450/392 426/448/392 404/420/392 +f 427/449/393 429/451/393 403/419/393 405/422/393 +f 402/415/394 414/414/394 416/452/394 428/450/394 +f 417/453/395 415/416/395 403/419/395 429/451/395 +f 318/342/396 320/406/396 444/454/396 442/455/396 +f 445/456/397 321/407/397 319/344/397 443/457/397 +f 320/458/398 390/437/398 412/436/398 444/459/398 +f 413/438/399 391/439/399 321/460/399 445/461/399 +f 310/343/400 318/342/400 442/455/400 312/398/400 +f 443/457/401 319/344/401 311/345/401 313/399/401 +f 382/462/402 430/463/402 414/414/402 388/413/402 +f 415/416/403 431/464/403 383/465/403 389/417/403 +f 412/436/404 418/441/404 440/466/404 444/459/404 +f 441/467/405 419/442/405 413/438/405 445/461/405 +f 438/468/406 446/469/406 444/459/406 440/466/406 +f 445/461/407 447/470/407 439/471/407 441/467/407 +f 434/472/408 446/469/408 438/468/408 436/473/408 +f 439/471/409 447/470/409 435/474/409 437/475/409 +f 432/476/410 448/477/410 446/469/410 434/472/410 +f 447/470/411 449/478/411 433/479/411 435/474/411 +f 430/463/412 448/477/412 432/476/412 450/480/412 +f 433/479/413 449/478/413 431/464/413 451/481/413 +f 414/414/414 430/463/414 450/480/414 416/452/414 +f 451/481/415 431/464/415 415/416/415 417/453/415 +f 312/398/416 448/482/416 430/483/416 382/400/416 +f 431/484/417 449/485/417 313/399/417 383/401/417 +f 312/398/418 442/455/418 446/486/418 448/482/418 +f 447/487/419 443/457/419 313/399/419 449/485/419 +f 442/455/420 444/454/420 446/486/420 +f 447/487/421 445/456/421 443/457/421 +f 416/452/422 450/480/422 452/488/422 476/489/422 +f 453/490/423 451/481/423 417/453/423 477/491/423 +f 450/480/424 432/476/424 462/492/424 452/488/424 +f 463/493/425 433/479/425 451/481/425 453/490/425 +f 432/476/426 434/472/426 460/494/426 462/492/426 +f 461/495/427 435/474/427 433/479/427 463/493/427 +f 434/472/428 436/473/428 458/496/428 460/494/428 +f 459/497/429 437/475/429 435/474/429 461/495/429 +f 436/473/430 438/468/430 456/498/430 458/496/430 +f 457/499/431 439/471/431 437/475/431 459/497/431 +f 438/468/432 440/466/432 454/500/432 456/498/432 +f 455/501/433 441/467/433 439/471/433 457/499/433 +f 440/466/434 418/441/434 474/502/434 454/500/434 +f 475/503/435 419/442/435 441/467/435 455/501/435 +f 428/450/436 416/452/436 476/489/436 464/504/436 +f 477/491/437 417/453/437 429/451/437 465/505/437 +f 426/448/438 428/450/438 464/504/438 466/506/438 +f 465/505/439 429/451/439 427/449/439 467/507/439 +f 424/446/440 426/448/440 466/506/440 468/508/440 +f 467/507/441 427/449/441 425/447/441 469/509/441 +f 422/444/442 424/446/442 468/508/442 470/510/442 +f 469/509/443 425/447/443 423/445/443 471/511/443 +f 420/440/444 422/444/444 470/510/444 472/512/444 +f 471/511/445 423/445/445 421/443/445 473/513/445 +f 418/441/446 420/440/446 472/512/446 474/502/446 +f 473/513/447 421/443/447 419/442/447 475/503/447 +f 458/496/448 456/498/448 480/514/448 478/515/448 +f 481/516/449 457/499/449 459/497/449 479/517/449 +f 478/515/450 480/514/450 482/518/450 484/519/450 +f 483/520/451 481/516/451 479/517/451 485/521/451 +f 484/519/452 482/518/452 488/522/452 486/523/452 +f 489/524/453 483/520/453 485/521/453 487/525/453 +f 486/523/454 488/522/454 490/526/454 492/527/454 +f 491/528/455 489/524/455 487/525/455 493/529/455 +f 464/504/456 476/489/456 486/523/456 492/527/456 +f 487/525/457 477/491/457 465/505/457 493/529/457 +f 452/488/458 484/519/458 486/523/458 476/489/458 +f 487/525/459 485/521/459 453/490/459 477/491/459 +f 452/488/460 462/492/460 478/515/460 484/519/460 +f 479/517/461 463/493/461 453/490/461 485/521/461 +f 458/496/462 478/515/462 462/492/462 460/494/462 +f 463/493/463 479/517/463 459/497/463 461/495/463 +f 454/500/464 474/502/464 480/514/464 456/498/464 +f 481/516/465 475/503/465 455/501/465 457/499/465 +f 472/512/466 482/518/466 480/514/466 474/502/466 +f 481/516/467 483/520/467 473/513/467 475/503/467 +f 470/510/468 488/522/468 482/518/468 472/512/468 +f 483/520/469 489/524/469 471/511/469 473/513/469 +f 468/508/470 490/526/470 488/522/470 470/510/470 +f 489/524/471 491/528/471 469/509/471 471/511/471 +f 466/506/472 492/527/472 490/526/472 468/508/472 +f 491/528/473 493/529/473 467/507/473 469/509/473 +f 464/504/474 492/527/474 466/506/474 +f 467/507/475 493/529/475 465/505/475 +f 392/433/476 390/437/476 504/530/476 502/531/476 +f 505/532/477 391/439/477 393/435/477 503/533/477 +f 394/429/478 392/433/478 502/531/478 500/534/478 +f 503/533/479 393/435/479 395/431/479 501/535/479 +f 396/425/480 394/429/480 500/534/480 498/536/480 +f 501/535/481 395/431/481 397/427/481 499/537/481 +f 398/538/482 396/425/482 498/536/482 496/539/482 +f 499/537/483 397/427/483 399/540/483 497/541/483 +f 400/542/484 398/538/484 496/539/484 494/543/484 +f 497/541/485 399/540/485 401/544/485 495/545/485 +f 388/546/486 400/542/486 494/543/486 506/547/486 +f 495/545/487 401/544/487 389/548/487 507/549/487 +f 494/543/488 502/531/488 504/530/488 506/547/488 +f 505/532/489 503/533/489 495/545/489 507/549/489 +f 494/543/490 496/539/490 500/534/490 502/531/490 +f 501/535/491 497/541/491 495/545/491 503/533/491 +f 496/539/492 498/536/492 500/534/492 +f 501/535/493 499/537/493 497/541/493 +f 314/380/494 382/400/494 388/550/494 506/551/494 +f 389/548/495 383/552/495 315/553/495 507/549/495 +f 314/554/496 506/547/496 504/530/496 322/555/496 +f 505/532/497 507/549/497 315/553/497 323/556/497 +f 320/458/498 322/555/498 504/530/498 390/437/498 +f 505/532/499 323/556/499 321/460/499 391/439/499 diff --git a/modules/ufbx/data/synthetic_color_suzanne_1_obj.mtl b/modules/ufbx/data/synthetic_color_suzanne_1_obj.mtl new file mode 100644 index 0000000..129de24 --- /dev/null +++ b/modules/ufbx/data/synthetic_color_suzanne_1_obj.mtl @@ -0,0 +1,5 @@ +# File created by ZBrush +# ToolType: PolyMesh3D +# www.zbrush.com +newmtl defaultMat +map_Kd synthetic_color_suzanne_1_obj.bmp diff --git a/modules/ufbx/data/synthetic_color_suzanne_1_obj.obj b/modules/ufbx/data/synthetic_color_suzanne_1_obj.obj new file mode 100644 index 0000000..278578b --- /dev/null +++ b/modules/ufbx/data/synthetic_color_suzanne_1_obj.obj @@ -0,0 +1,1585 @@ +# File exported by ZBrush version 2022 +# www.zbrush.com +#Vertex Count 507 +#UV Vertex Count 556 +#Face Count 500 +#Auto scale x=0.731428 y=0.731428 z=0.731428 +#Auto offset x=0.000000 y=0.000000 z=0.000000 +mtllib synthetic_color_suzanne_1_obj.mtl +usemtl defaultMat +v 0.43750002 -0.76562502 0.16406199 +v -0.43750002 -0.76562502 0.16406199 +v 0.5 -0.6875 0.09374999 +v -0.5 -0.6875 0.09374999 +v 0.54687499 -0.57812498 0.054688 +v -0.54687499 -0.57812498 0.054688 +v 0.35156199 -0.61718798 -0.02343799 +v -0.35156199 -0.61718798 -0.02343799 +v 0.35156199 -0.71874999 0.03125 +v -0.35156199 -0.71874999 0.03125 +v 0.35156199 -0.78124998 0.13281199 +v -0.35156199 -0.78124998 0.13281199 +v 0.273438 -0.79687501 0.16406199 +v -0.273438 -0.79687501 0.16406199 +v 0.20312499 -0.74218795 0.09374999 +v -0.20312499 -0.74218795 0.09374999 +v 0.15625 -0.64843798 0.054688 +v -0.15625 -0.64843798 0.054688 +v 0.078125 -0.65625001 0.24218801 +v -0.078125 -0.65625001 0.24218801 +v 0.14062499 -0.74218795 0.24218801 +v -0.14062499 -0.74218795 0.24218801 +v 0.24218801 -0.79687501 0.24218801 +v -0.24218801 -0.79687501 0.24218801 +v 0.273438 -0.79687501 0.328125 +v -0.273438 -0.79687501 0.328125 +v 0.20312499 -0.74218795 0.39062499 +v -0.20312499 -0.74218795 0.39062499 +v 0.15625 -0.64843798 0.43750002 +v -0.15625 -0.64843798 0.43750002 +v 0.35156199 -0.61718798 0.515625 +v -0.35156199 -0.61718798 0.515625 +v 0.35156199 -0.71874999 0.45312501 +v -0.35156199 -0.71874999 0.45312501 +v 0.35156199 -0.78124998 0.35937499 +v -0.35156199 -0.78124998 0.35937499 +v 0.43750002 -0.76562502 0.328125 +v -0.43750002 -0.76562502 0.328125 +v 0.5 -0.6875 0.39062499 +v -0.5 -0.6875 0.39062499 +v 0.54687499 -0.57812498 0.43750002 +v -0.54687499 -0.57812498 0.43750002 +v 0.62500001 -0.56249999 0.24218801 +v -0.62500001 -0.56249999 0.24218801 +v 0.56249999 -0.671875 0.24218801 +v -0.56249999 -0.671875 0.24218801 +v 0.46875001 -0.75781201 0.24218801 +v -0.46875001 -0.75781201 0.24218801 +v 0.476562 -0.77343795 0.24218801 +v -0.476562 -0.77343795 0.24218801 +v 0.445312 -0.78124998 0.33593801 +v -0.445312 -0.78124998 0.33593801 +v 0.35156199 -0.80468802 0.37499999 +v -0.35156199 -0.80468802 0.37499999 +v 0.26562499 -0.820312 0.33593801 +v -0.26562499 -0.820312 0.33593801 +v 0.22656199 -0.820312 0.24218801 +v -0.22656199 -0.820312 0.24218801 +v 0.26562499 -0.820312 0.15625 +v -0.26562499 -0.820312 0.15625 +v 0.35156199 -0.82812501 0.24218801 +v -0.35156199 -0.82812501 0.24218801 +v 0.35156199 -0.80468802 0.117188 +v -0.35156199 -0.80468802 0.117188 +v 0.445312 -0.78124998 0.15625 +v -0.445312 -0.78124998 0.15625 +v 0 -0.74218795 0.42968803 +v 0 -0.820312 0.35156199 +v 0 -0.73437503 -0.67968797 +v 0 -0.78124998 -0.32031199 +v 0 -0.79687501 -0.18749999 +v 0 -0.71874999 -0.77343795 +v 0 -0.60156201 0.40624998 +v 0 -0.57031202 0.57031202 +v 0 0.54687499 0.898438 +v 0 0.85156199 0.56249999 +v 0 0.82812501 0.070312 +v 0 0.35156199 -0.38281198 +v 0.20312499 -0.56249999 -0.18749999 +v -0.20312499 -0.56249999 -0.18749999 +v 0.3125 -0.57031202 -0.43750002 +v -0.3125 -0.57031202 -0.43750002 +v 0.35156199 -0.57031202 -0.69531203 +v -0.35156199 -0.57031202 -0.69531203 +v 0.367188 -0.53124999 -0.89062499 +v -0.367188 -0.53124999 -0.89062499 +v 0.328125 -0.52343796 -0.94531205 +v -0.328125 -0.52343796 -0.94531205 +v 0.179688 -0.554688 -0.96875001 +v -0.179688 -0.554688 -0.96875001 +v 0 -0.57812498 -0.98437497 +v 0.43750002 -0.53124999 -0.14062499 +v -0.43750002 -0.53124999 -0.14062499 +v 0.63281204 -0.53906202 -0.039062 +v -0.63281204 -0.53906202 -0.039062 +v 0.82812501 -0.445312 0.148438 +v -0.82812501 -0.445312 0.148438 +v 0.859375 -0.59375002 0.42968803 +v -0.859375 -0.59375002 0.42968803 +v 0.71093796 -0.62500001 0.48437501 +v -0.71093796 -0.62500001 0.48437501 +v 0.49218801 -0.6875 0.60156201 +v -0.49218801 -0.6875 0.60156201 +v 0.32031199 -0.73437503 0.75781201 +v -0.32031199 -0.73437503 0.75781201 +v 0.15625 -0.75781201 0.71874999 +v -0.15625 -0.75781201 0.71874999 +v 0.0625 -0.74999998 0.49218801 +v -0.0625 -0.74999998 0.49218801 +v 0.16406199 -0.77343795 0.41406201 +v -0.16406199 -0.77343795 0.41406201 +v 0.125 -0.76562502 0.30468802 +v -0.125 -0.76562502 0.30468802 +v 0.20312499 -0.74218795 0.09374999 +v -0.20312499 -0.74218795 0.09374999 +v 0.37499999 -0.70312504 0.015625 +v -0.37499999 -0.70312504 0.015625 +v 0.49218801 -0.671875 0.0625 +v -0.49218801 -0.671875 0.0625 +v 0.62500001 -0.64843798 0.18749999 +v -0.62500001 -0.64843798 0.18749999 +v 0.64062501 -0.64843798 0.29687501 +v -0.64062501 -0.64843798 0.29687501 +v 0.60156201 -0.66406204 0.37499999 +v -0.60156201 -0.66406204 0.37499999 +v 0.42968803 -0.71874999 0.43750002 +v -0.42968803 -0.71874999 0.43750002 +v 0.25 -0.75781201 0.46875001 +v -0.25 -0.75781201 0.46875001 +v 0 -0.73437503 -0.76562502 +v 0.109375 -0.73437503 -0.71874999 +v -0.109375 -0.73437503 -0.71874999 +v 0.117188 -0.71093796 -0.83593801 +v -0.117188 -0.71093796 -0.83593801 +v 0.0625 -0.69531203 -0.88281207 +v -0.0625 -0.69531203 -0.88281207 +v 0 -0.6875 -0.89062499 +v 0 -0.74999998 -0.19531198 +v 0 -0.74218795 -0.14062499 +v 0.10156199 -0.74218795 -0.148438 +v -0.10156199 -0.74218795 -0.148438 +v 0.125 -0.74999998 -0.22656199 +v -0.125 -0.74999998 -0.22656199 +v 0.085938 -0.74218795 -0.289062 +v -0.085938 -0.74218795 -0.289062 +v 0.39843799 -0.671875 -0.04687499 +v -0.39843799 -0.671875 -0.04687499 +v 0.61718798 -0.62500001 0.054688 +v -0.61718798 -0.62500001 0.054688 +v 0.72656202 -0.60156201 0.20312499 +v -0.72656202 -0.60156201 0.20312499 +v 0.74218795 -0.65625001 0.37499999 +v -0.74218795 -0.65625001 0.37499999 +v 0.6875 -0.72656202 0.41406201 +v -0.6875 -0.72656202 0.41406201 +v 0.43750002 -0.79687501 0.54687499 +v -0.43750002 -0.79687501 0.54687499 +v 0.3125 -0.83593801 0.64062501 +v -0.3125 -0.83593801 0.64062501 +v 0.20312499 -0.85156199 0.61718798 +v -0.20312499 -0.85156199 0.61718798 +v 0.10156199 -0.84375004 0.42968803 +v -0.10156199 -0.84375004 0.42968803 +v 0.125 -0.81249997 -0.10156199 +v -0.125 -0.81249997 -0.10156199 +v 0.210938 -0.71093796 -0.445312 +v -0.210938 -0.71093796 -0.445312 +v 0.25 -0.6875 -0.70312504 +v -0.25 -0.6875 -0.70312504 +v 0.26562499 -0.66406204 -0.820312 +v -0.26562499 -0.66406204 -0.820312 +v 0.234375 -0.63281204 -0.91406206 +v -0.234375 -0.63281204 -0.91406206 +v 0.16406199 -0.63281204 -0.92968799 +v -0.16406199 -0.63281204 -0.92968799 +v 0 -0.64062501 -0.94531205 +v 0 -0.72656202 0.04687499 +v 0 -0.76562502 0.210938 +v 0.328125 -0.74218795 0.476562 +v -0.328125 -0.74218795 0.476562 +v 0.16406199 -0.74999998 0.14062499 +v -0.16406199 -0.74999998 0.14062499 +v 0.13281199 -0.75781201 0.210938 +v -0.13281199 -0.75781201 0.210938 +v 0.117188 -0.73437503 -0.6875 +v -0.117188 -0.73437503 -0.6875 +v 0.078125 -0.74999998 -0.445312 +v -0.078125 -0.74999998 -0.445312 +v 0 -0.74999998 -0.445312 +v 0 -0.74218795 -0.328125 +v 0.09374999 -0.78124998 -0.273438 +v -0.09374999 -0.78124998 -0.273438 +v 0.13281199 -0.79687501 -0.22656199 +v -0.13281199 -0.79687501 -0.22656199 +v 0.109375 -0.78124998 -0.13281199 +v -0.109375 -0.78124998 -0.13281199 +v 0.039062 -0.78124998 -0.125 +v -0.039062 -0.78124998 -0.125 +v 0 -0.82812501 -0.20312499 +v 0.04687499 -0.81249997 -0.148438 +v -0.04687499 -0.81249997 -0.148438 +v 0.09374999 -0.81249997 -0.15625 +v -0.09374999 -0.81249997 -0.15625 +v 0.109375 -0.82812501 -0.22656199 +v -0.109375 -0.82812501 -0.22656199 +v 0.078125 -0.80468802 -0.25 +v -0.078125 -0.80468802 -0.25 +v 0 -0.80468802 -0.289062 +v 0.25781199 -0.554688 -0.3125 +v -0.25781199 -0.554688 -0.3125 +v 0.16406199 -0.71093796 -0.24218801 +v -0.16406199 -0.71093796 -0.24218801 +v 0.179688 -0.71093796 -0.3125 +v -0.179688 -0.71093796 -0.3125 +v 0.234375 -0.554688 -0.25 +v -0.234375 -0.554688 -0.25 +v 0 -0.6875 -0.87500004 +v 0.04687499 -0.6875 -0.86718801 +v -0.04687499 -0.6875 -0.86718801 +v 0.09374999 -0.71093796 -0.820312 +v -0.09374999 -0.71093796 -0.820312 +v 0.09374999 -0.72656202 -0.74218795 +v -0.09374999 -0.72656202 -0.74218795 +v 0 -0.65625001 -0.78124998 +v 0.09374999 -0.66406204 -0.74999998 +v -0.09374999 -0.66406204 -0.74999998 +v 0.09374999 -0.64062501 -0.81249997 +v -0.09374999 -0.64062501 -0.81249997 +v 0.04687499 -0.63281204 -0.85156199 +v -0.04687499 -0.63281204 -0.85156199 +v 0 -0.63281204 -0.859375 +v 0.171875 -0.78124998 0.21875001 +v -0.171875 -0.78124998 0.21875001 +v 0.18749999 -0.77343795 0.15625 +v -0.18749999 -0.77343795 0.15625 +v 0.33593801 -0.75781201 0.42968803 +v -0.33593801 -0.75781201 0.42968803 +v 0.273438 -0.77343795 0.42187502 +v -0.273438 -0.77343795 0.42187502 +v 0.42187502 -0.77343795 0.39843799 +v -0.42187502 -0.77343795 0.39843799 +v 0.56249999 -0.69531203 0.35156199 +v -0.56249999 -0.69531203 0.35156199 +v 0.58593799 -0.6875 0.289062 +v -0.58593799 -0.6875 0.289062 +v 0.57812498 -0.67968797 0.19531198 +v -0.57812498 -0.67968797 0.19531198 +v 0.476562 -0.71874999 0.10156199 +v -0.476562 -0.71874999 0.10156199 +v 0.37499999 -0.74218795 0.0625 +v -0.37499999 -0.74218795 0.0625 +v 0.22656199 -0.78124998 0.109375 +v -0.22656199 -0.78124998 0.109375 +v 0.179688 -0.78124998 0.29687501 +v -0.179688 -0.78124998 0.29687501 +v 0.210938 -0.78124998 0.37499999 +v -0.210938 -0.78124998 0.37499999 +v 0.234375 -0.75781201 0.35937499 +v -0.234375 -0.75781201 0.35937499 +v 0.19531198 -0.75781201 0.29687501 +v -0.19531198 -0.75781201 0.29687501 +v 0.24218801 -0.75781201 0.125 +v -0.24218801 -0.75781201 0.125 +v 0.37499999 -0.72656202 0.085938 +v -0.37499999 -0.72656202 0.085938 +v 0.46093802 -0.70312504 0.117188 +v -0.46093802 -0.70312504 0.117188 +v 0.54687499 -0.671875 0.210938 +v -0.54687499 -0.671875 0.210938 +v 0.554688 -0.671875 0.28124999 +v -0.554688 -0.671875 0.28124999 +v 0.53124999 -0.67968797 0.33593801 +v -0.53124999 -0.67968797 0.33593801 +v 0.41406201 -0.74999998 0.39062499 +v -0.41406201 -0.74999998 0.39062499 +v 0.28124999 -0.76562502 0.39843799 +v -0.28124999 -0.76562502 0.39843799 +v 0.33593801 -0.74999998 0.40624998 +v -0.33593801 -0.74999998 0.40624998 +v 0.20312499 -0.74999998 0.171875 +v -0.20312499 -0.74999998 0.171875 +v 0.19531198 -0.74999998 0.22656199 +v -0.19531198 -0.74999998 0.22656199 +v 0.109375 -0.60937502 0.46093802 +v -0.109375 -0.60937502 0.46093802 +v 0.19531198 -0.61718798 0.66406204 +v -0.19531198 -0.61718798 0.66406204 +v 0.33593801 -0.59375002 0.6875 +v -0.33593801 -0.59375002 0.6875 +v 0.48437501 -0.554688 0.554688 +v -0.48437501 -0.554688 0.554688 +v 0.67968797 -0.49218801 0.45312501 +v -0.67968797 -0.49218801 0.45312501 +v 0.79687501 -0.46093802 0.40624998 +v -0.79687501 -0.46093802 0.40624998 +v 0.77343795 -0.37499999 0.16406199 +v -0.77343795 -0.37499999 0.16406199 +v 0.60156201 -0.41406201 -0 +v -0.60156201 -0.41406201 -0 +v 0.43750002 -0.46875001 -0.09374999 +v -0.43750002 -0.46875001 -0.09374999 +v 0 -0.289062 0.898438 +v 0 0.078125 0.98437497 +v 0 0.671875 -0.19531198 +v 0 -0.18749999 -0.46093802 +v 0 -0.46093802 -0.97656204 +v 0 -0.34375 -0.80468802 +v 0 -0.32031199 -0.57031202 +v 0 -0.28124999 -0.48437501 +v 0.85156199 -0.054688 0.234375 +v -0.85156199 -0.054688 0.234375 +v 0.859375 0.04687499 0.32031199 +v -0.859375 0.04687499 0.32031199 +v 0.77343795 0.43750002 0.26562499 +v -0.77343795 0.43750002 0.26562499 +v 0.46093802 0.70312504 0.43750002 +v -0.46093802 0.70312504 0.43750002 +v 0.73437503 -0.070312 -0.04687499 +v -0.73437503 -0.070312 -0.04687499 +v 0.59375002 0.16406199 -0.125 +v -0.59375002 0.16406199 -0.125 +v 0.64062501 0.42968803 -0.007812 +v -0.64062501 0.42968803 -0.007812 +v 0.33593801 0.66406204 0.054688 +v -0.33593801 0.66406204 0.054688 +v 0.234375 -0.40624998 -0.35156199 +v -0.234375 -0.40624998 -0.35156199 +v 0.179688 -0.25781199 -0.41406201 +v -0.179688 -0.25781199 -0.41406201 +v 0.289062 -0.38281198 -0.71093796 +v -0.289062 -0.38281198 -0.71093796 +v 0.25 -0.39062499 -0.5 +v -0.25 -0.39062499 -0.5 +v 0.328125 -0.39843799 -0.91406206 +v -0.328125 -0.39843799 -0.91406206 +v 0.14062499 -0.367188 -0.75781201 +v -0.14062499 -0.367188 -0.75781201 +v 0.125 -0.35937499 -0.53906202 +v -0.125 -0.35937499 -0.53906202 +v 0.16406199 -0.43750002 -0.94531205 +v -0.16406199 -0.43750002 -0.94531205 +v 0.21875001 -0.42968803 -0.28124999 +v -0.21875001 -0.42968803 -0.28124999 +v 0.210938 -0.46875001 -0.22656199 +v -0.210938 -0.46875001 -0.22656199 +v 0.20312499 -0.5 -0.171875 +v -0.20312499 -0.5 -0.171875 +v 0.210938 -0.16406199 -0.39062499 +v -0.210938 -0.16406199 -0.39062499 +v 0.29687501 0.26562499 -0.3125 +v -0.29687501 0.26562499 -0.3125 +v 0.34375 0.53906202 -0.148438 +v -0.34375 0.53906202 -0.148438 +v 0.45312501 0.38281198 0.86718801 +v -0.45312501 0.38281198 0.86718801 +v 0.45312501 0.070312 0.92968799 +v -0.45312501 0.070312 0.92968799 +v 0.45312501 -0.234375 0.85156199 +v -0.45312501 -0.234375 0.85156199 +v 0.46093802 -0.42968803 0.52343796 +v -0.46093802 -0.42968803 0.52343796 +v 0.72656202 -0.33593801 0.40624998 +v -0.72656202 -0.33593801 0.40624998 +v 0.63281204 -0.28124999 0.45312501 +v -0.63281204 -0.28124999 0.45312501 +v 0.64062501 -0.054688 0.70312504 +v -0.64062501 -0.054688 0.70312504 +v 0.79687501 -0.125 0.56249999 +v -0.79687501 -0.125 0.56249999 +v 0.79687501 0.117188 0.61718798 +v -0.79687501 0.117188 0.61718798 +v 0.64062501 0.19531198 0.74999998 +v -0.64062501 0.19531198 0.74999998 +v 0.64062501 0.445312 0.67968797 +v -0.64062501 0.445312 0.67968797 +v 0.79687501 0.35937499 0.53906202 +v -0.79687501 0.35937499 0.53906202 +v 0.61718798 0.58593799 0.328125 +v -0.61718798 0.58593799 0.328125 +v 0.48437501 0.54687499 0.02343799 +v -0.48437501 0.54687499 0.02343799 +v 0.820312 0.20312499 0.328125 +v -0.820312 0.20312499 0.328125 +v 0.40624998 -0.148438 -0.171875 +v -0.40624998 -0.148438 -0.171875 +v 0.42968803 0.210938 -0.19531198 +v -0.42968803 0.210938 -0.19531198 +v 0.89062499 0.234375 0.40624998 +v -0.89062499 0.234375 0.40624998 +v 0.77343795 0.125 -0.14062499 +v -0.77343795 0.125 -0.14062499 +v 1.03906203 0.328125 -0.10156199 +v -1.03906203 0.328125 -0.10156199 +v 1.28125002 0.42968803 0.054688 +v -1.28125002 0.42968803 0.054688 +v 1.35156204 0.42187502 0.32031199 +v -1.35156204 0.42187502 0.32031199 +v 1.23437499 0.42187502 0.50781203 +v -1.23437499 0.42187502 0.50781203 +v 1.02343797 0.3125 0.476562 +v -1.02343797 0.3125 0.476562 +v 1.01562504 0.289062 0.41406201 +v -1.01562504 0.289062 0.41406201 +v 1.18750005 0.39062499 0.43750002 +v -1.18750005 0.39062499 0.43750002 +v 1.26562499 0.40624998 0.289062 +v -1.26562499 0.40624998 0.289062 +v 1.21093801 0.40624998 0.078125 +v -1.21093801 0.40624998 0.078125 +v 1.03125 0.30468802 -0.039062 +v -1.03125 0.30468802 -0.039062 +v 0.82812501 0.13281199 -0.070312 +v -0.82812501 0.13281199 -0.070312 +v 0.92187499 0.21875001 0.35937499 +v -0.92187499 0.21875001 0.35937499 +v 0.94531205 0.289062 0.30468802 +v -0.94531205 0.289062 0.30468802 +v 0.88281207 0.210938 -0.02343799 +v -0.88281207 0.210938 -0.02343799 +v 1.03906203 0.367188 -0 +v -1.03906203 0.367188 -0 +v 1.18750005 0.445312 0.09374999 +v -1.18750005 0.445312 0.09374999 +v 1.23437499 0.445312 0.25 +v -1.23437499 0.445312 0.25 +v 1.17187501 0.43750002 0.35937499 +v -1.17187501 0.43750002 0.35937499 +v 1.02343797 0.35937499 0.34375 +v -1.02343797 0.35937499 0.34375 +v 0.84375004 0.210938 0.289062 +v -0.84375004 0.210938 0.289062 +v 0.83593801 0.273438 0.171875 +v -0.83593801 0.273438 0.171875 +v 0.75781201 0.273438 0.09374999 +v -0.75781201 0.273438 0.09374999 +v 0.820312 0.273438 0.085938 +v -0.820312 0.273438 0.085938 +v 0.84375004 0.273438 0.015625 +v -0.84375004 0.273438 0.015625 +v 0.81249997 0.273438 -0.015625 +v -0.81249997 0.273438 -0.015625 +v 0.72656202 0.070312 -0 +v -0.72656202 0.070312 -0 +v 0.71874999 0.171875 -0.02343799 +v -0.71874999 0.171875 -0.02343799 +v 0.71874999 0.18749999 0.039062 +v -0.71874999 0.18749999 0.039062 +v 0.79687501 0.210938 0.20312499 +v -0.79687501 0.210938 0.20312499 +v 0.89062499 0.26562499 0.24218801 +v -0.89062499 0.26562499 0.24218801 +v 0.89062499 0.32031199 0.234375 +v -0.89062499 0.32031199 0.234375 +v 0.81249997 0.32031199 -0.015625 +v -0.81249997 0.32031199 -0.015625 +v 0.85156199 0.32031199 0.015625 +v -0.85156199 0.32031199 0.015625 +v 0.82812501 0.32031199 0.078125 +v -0.82812501 0.32031199 0.078125 +v 0.76562502 0.32031199 0.09374999 +v -0.76562502 0.32031199 0.09374999 +v 0.84375004 0.32031199 0.171875 +v -0.84375004 0.32031199 0.171875 +v 1.03906203 0.41406201 0.328125 +v -1.03906203 0.41406201 0.328125 +v 1.18750005 0.48437501 0.34375 +v -1.18750005 0.48437501 0.34375 +v 1.25781206 0.49218801 0.24218801 +v -1.25781206 0.49218801 0.24218801 +v 1.21093801 0.48437501 0.085938 +v -1.21093801 0.48437501 0.085938 +v 1.04687504 0.42187502 -0 +v -1.04687504 0.42187502 -0 +v 0.88281207 0.26562499 -0.015625 +v -0.88281207 0.26562499 -0.015625 +v 0.95312498 0.34375 0.289062 +v -0.95312498 0.34375 0.289062 +v 0.89062499 0.328125 0.109375 +v -0.89062499 0.328125 0.109375 +v 0.93750002 0.33593801 0.0625 +v -0.93750002 0.33593801 0.0625 +v 1.00000001 0.367188 0.125 +v -1.00000001 0.367188 0.125 +v 0.96093799 0.35156199 0.171875 +v -0.96093799 0.35156199 0.171875 +v 1.01562504 0.37499999 0.234375 +v -1.01562504 0.37499999 0.234375 +v 1.05468796 0.38281198 0.18749999 +v -1.05468796 0.38281198 0.18749999 +v 1.10937502 0.39062499 0.210938 +v -1.10937502 0.39062499 0.210938 +v 1.08593796 0.39062499 0.273438 +v -1.08593796 0.39062499 0.273438 +v 1.02343797 0.48437501 0.43750002 +v -1.02343797 0.48437501 0.43750002 +v 1.25000003 0.54687499 0.46875001 +v -1.25000003 0.54687499 0.46875001 +v 1.36718797 0.5 0.29687501 +v -1.36718797 0.5 0.29687501 +v 1.31250002 0.53124999 0.054688 +v -1.31250002 0.53124999 0.054688 +v 1.03906203 0.49218801 -0.085938 +v -1.03906203 0.49218801 -0.085938 +v 0.78906201 0.328125 -0.125 +v -0.78906201 0.328125 -0.125 +v 0.859375 0.38281198 0.38281198 +v -0.859375 0.38281198 0.38281198 +# The following MRGB block contains ZBrush Vertex Color (Polypaint) and masking output as 4 hexadecimal values per vertex. The vertex color format is MMRRGGBB with up to 64 entries per MRGB line. +#MRGB ffb71d94ff471d94ffbf278bff3f278bffc53586ff393586ffac307cff52307cffac2383ff522383ffac1b90ff521b90ffa21994ff5c1994ff99208bff65208bff932c86ff6b2c86ff892b9eff752b9eff91209eff6d209eff9e199eff60199effa219a9ff5c19a9ff9920b1ff6520b1ff932cb7ff6b2cb7ffac30c1ff5230c1ffac23b9ff5223b9ffac1badff521badffb71da9ff471da9ffbf27b1ff3f27b1ffc535b7ff3935b7ffcf379eff2f379effc7299eff37299effbb1e9eff431e9effbc1c9eff421c9effb81baaff461baaffac18afff5218afffa116aaff5d16aaff9c169eff62169effa11693ff5d1693ffac159eff52159effac188eff52188e +#MRGB ffb81b93ff461b93ff7f20b6ff7f16acff7f2128ff7f1b56ff7f1967ff7f231cff7f32b3ff7f36c8ff7fc5f2ff7fecc7ff7fe988ff7fac4eff993767ff653767ffa73647ff573647ffac3626ff523626ffae3b0dff503b0dffa93c06ff553c06ff963803ff683803ff7f3501ffb73b6dff473b6dffd03a7aff2e3a7affe94692ff154692ffed33b6ff1133b6ffda2fbdff242fbdffbe27ccff4027ccffa821e0ff5621e0ff931edbff6b1edbff871fbeff771fbeff941cb4ff6a1cb4ff8f1da6ff6f1da6ff99208bff65208bffaf2581ff4f2581ffbe2987ff402987ffcf2c97ff2f2c97ffd12ca5ff2d2ca5ffcc2aafff322aafffb623b7ff4823b7ff9f1ebb +#MRGB ff5f1ebbff7f211dff8d2123ff712123ff8e2414ff702414ff87260eff77260eff7f270dff7f1f66ff7f206dff8c206cff72206cff8f1f62ff6f1f62ff8a205aff74205affb22979ff4c2979ffce2f86ff302f86ffdc3299ff223299ffde2bafff202bafffd722b4ff2722b4ffb719c5ff4719c5ffa714d1ff5714d1ff9912ceff6512ceff8c13b6ff7213b6ff8f1772ff6f1772ff9a2446ff642446ff9f2725ff5f2725ffa12a16ff5d2a16ff9d2e0aff612e0aff942e08ff6a2e08ff7f2d06ff7f2285ff7f1d9affa920bcff5520bcff941f91ff6a1f91ff901e9aff6e1e9aff8e2127ff702127ff891f46ff751f46ff7f1f46ff7f2055ff8b1b5cff731b5c +#MRGB ff901962ff6e1962ff8d1b6eff711b6eff841b6fff7a1b6fff7f1565ff85176cff79176cff8b176bff73176bff8d1562ff711562ff89185fff75185fff7f185affa03857ff5e3857ff942460ff6a2460ff962457ff682457ff9d385fff61385fff7f270fff852710ff792710ff8b2416ff732416ff8b2220ff732220ff7f2b1bff8b2a1fff732a1fff8b2d17ff732d17ff852e12ff792e12ff7f2e11ff951b9bff691b9bff971c93ff671c93ffaa1eb6ff541eb6ffa21cb5ff5c1cb5ffb51cb2ff491cb2ffc726acff3726acffca27a4ff3427a4ffc92898ff352898ffbc238cff42238cffaf2087ff4f2087ff9c1b8dff621b8dff961ba5ff681ba5ff9a1baf +#MRGB ff641bafff9d1eadff611eadff981ea5ff661ea5ff9e1e8fff601e8fffaf228aff4f228affba258eff44258effc5299aff39299affc629a3ff3829a3ffc328aaff3b28aaffb41fb1ff4a1fb1ffa31db2ff5b1db2ffaa1fb3ff541fb3ff991f95ff651f95ff981f9cff661f9cff8d31baff7131baff9830d4ff6630d4ffaa33d7ff5433d7ffbd38c6ff4138c6ffd640b9ff2840b9ffe544b3ff1944b3ffe24f94ff1c4f94ffcc4a7fff324a7fffb74373ff474373ff7f5af2ff7f89fdff7fd566ff7f6744ff7f4402ff7f5318ff7f5636ff7f5b41ffec789dff12789dffed85a8ff1185a8ffe2b7a1ff1cb7a1ffbad9b7ff44d9b7ffdd7679ff217679ffcb946f +#MRGB ff33946fffd1b67eff2db67effaad486ff54d486ff9d4b52ff614b52ff965e4aff685e4affa44e24ff5a4e24ff9f4d3fff5f4d3fffa94c0aff554c0aff91501eff6d501eff8f513aff6f513aff944706ff6a4706ff9b485bff63485bff9a4362ff644362ff993f69ff653f69ff9a6a4dff646a4dffa5a157ff59a157ffabc46cff53c46cffb9b0eeff45b0eeffb988f6ff4588f6ffb961ecff4561ecffba48c2ff4448c2ffdc54b3ff2254b3ffd05bb9ff2e5bb9ffd178d9ff2d78d9ffe56fc7ff196fc7ffe58eceff198eceffd198dfff2d98dfffd1b8d6ff2db8d6ffe5adc4ff19adc4ffcecaa9ff30caa9ffbdc582ff41c582ffe899a9ff1699a9ffb36c69 +#MRGB ff4b6c69ffb69a66ff489a66fff19db3ff0d9db3ffe28f6dff1c8f6dffffa972ff00a972ffffb686ff00b686ffffb5a8ff00b5a8ffffb5c0ff00b5c0ffffa7bcff00a7bcffffa4b4ff00a4b4ffffb1b7ff00b1b7ffffb3a4ff00b3a4ffffb389ff00b389ffffa67aff00a67affe99076ff159076fff59badff099badfff8a4a6ff06a4a6fff09a7cff0e9a7cffffae7fff00ae7fffffb88bff00b88bffffb89fff00b89fffffb7adff00b7adffffadabff00adabffeb9aa4ff139aa4ffeaa295ff14a295ffe0a28bff1ea28bffe8a28aff16a28affeba281ff13a281ffe7a27dff17a27dffdc887fff22887fffdb957cff23957cffdb9784ff239784ffe59a99 +#MRGB ff199a99fff1a19eff0da19efff1a89dff0da89dffe7a87dff17a87dffeca881ff12a881ffe9a889ff15a889ffe1a88bff1da88bffeba895ff13a895ffffb4a9ff00b4a9ffffbdabff00bdabffffbe9eff00be9effffbd8aff00bd8affffb57fff00b57ffff0a17dff0ea17dfff9aba4ff05aba4fff1a98dff0da98dfff7aa87ff07aa87ffffae8fff00ae8ffffaac95ff04ac95ffffaf9dff00af9dffffb097ff00b097ffffb19aff00b19affffb1a2ff00b1a2ffffbdb7ff00bdb7ffffc5bbff00c5bbffffbfa5ff00bfa5ffffc386ff00c386ffffbe74ff00be74ffe4a96fff1aa96fffedb0b0ff11b0b0 +# End of MRGB block +vt 0.89095 0.59006 +vt 0.87062 0.58964 +vt 0.86008 0.56011 +vt 0.90457 0.5594 +vt 0.85622 0.85054 +vt 0.86806 0.82151 +vt 0.88839 0.82199 +vt 0.90064 0.85323 +vt 0.85301 0.52156 +vt 0.92016 0.52454 +vt 0.84745 0.88874 +vt 0.91467 0.88874 +vt 0.8289 0.59077 +vt 0.79848 0.56953 +vt 0.7951 0.8384 +vt 0.82643 0.81853 +vt 0.8544 0.60475 +vt 0.85253 0.8057 +vt 0.8541 0.62545 +vt 0.82817 0.63335 +vt 0.82759 0.77596 +vt 0.85315 0.785 +vt 0.79101 0.64544 +vt 0.79101 0.76223 +vt 0.85518 0.66852 +vt 0.84235 0.70249 +vt 0.84483 0.70752 +vt 0.85614 0.74202 +vt 0.8675 0.64229 +vt 0.86729 0.76878 +vt 0.89047 0.6419 +vt 0.90037 0.66696 +vt 0.90122 0.74559 +vt 0.89021 0.77018 +vt 0.91889 0.69969 +vt 0.92118 0.71371 +vt 0.93188 0.63683 +vt 0.96839 0.64533 +vt 0.96821 0.77022 +vt 0.93136 0.77709 +vt 0.90588 0.6279 +vt 0.90499 0.78486 +vt 0.90623 0.60574 +vt 0.93371 0.59303 +vt 0.93125 0.82092 +vt 0.90435 0.80701 +vt 0.96839 0.57381 +vt 0.96503 0.84167 +vt 0.90235 0.6079 +vt 0.88959 0.59327 +vt 0.90058 0.80467 +vt 0.88717 0.81872 +vt 0.89978 0.62625 +vt 0.89882 0.78623 +vt 0.88784 0.63652 +vt 0.88735 0.77544 +vt 0.8709 0.63524 +vt 0.87037 0.77597 +vt 0.85988 0.62394 +vt 0.85885 0.78677 +vt 0.85966 0.60818 +vt 0.85794 0.8025 +vt 0.87166 0.59396 +vt 0.86929 0.81724 +vt 0.8794 0.61651 +vt 0.87802 0.79506 +vt 0.54026 0.0538 +vt 0.53641 0.06207 +vt 0.51892 0.05968 +vt 0.51891 0.05029 +vt 0.50145 0.06204 +vt 0.49762 0.05377 +vt 0.55193 0.05833 +vt 0.54278 0.06408 +vt 0.49508 0.06404 +vt 0.48595 0.05827 +vt 0.55507 0.0619 +vt 0.54629 0.07266 +vt 0.49156 0.07262 +vt 0.4828 0.06182 +vt 0.56381 0.07658 +vt 0.54833 0.08489 +vt 0.4895 0.08485 +vt 0.47401 0.07651 +vt 0.58313 0.10849 +vt 0.55562 0.12174 +vt 0.48217 0.12178 +vt 0.45452 0.10848 +vt 0.60551 0.16513 +vt 0.64739 0.2005 +vt 0.62151 0.22781 +vt 0.55311 0.20959 +vt 0.41651 0.22949 +vt 0.38967 0.20189 +vt 0.43202 0.16564 +vt 0.48533 0.21005 +vt 0.67637 0.23324 +vt 0.66476 0.25322 +vt 0.37274 0.25635 +vt 0.3603 0.23589 +vt 0.71534 0.26539 +vt 0.6839 0.27999 +vt 0.35369 0.2846 +vt 0.32045 0.2703 +vt 0.70725 0.31005 +vt 0.68751 0.31153 +vt 0.35118 0.31744 +vt 0.33072 0.31685 +vt 0.69744 0.33267 +vt 0.67682 0.32393 +vt 0.36272 0.32972 +vt 0.34196 0.33966 +vt 0.66281 0.37252 +vt 0.63905 0.35733 +vt 0.40277 0.36213 +vt 0.37929 0.37868 +vt 0.62684 0.39579 +vt 0.61831 0.37515 +vt 0.42458 0.37926 +vt 0.41691 0.40055 +vt 0.60482 0.3978 +vt 0.6008 0.37785 +vt 0.44239 0.38122 +vt 0.43925 0.40154 +vt 0.55309 0.39051 +vt 0.55967 0.35701 +vt 0.48293 0.35849 +vt 0.49093 0.39186 +vt 0.52192 0.386 +vt 0.52108 0.34386 +vt 0.57727 0.34015 +vt 0.59984 0.34481 +vt 0.44197 0.34781 +vt 0.46457 0.34223 +vt 0.61554 0.342 +vt 0.42597 0.34558 +vt 0.63447 0.33231 +vt 0.40636 0.33648 +vt 0.6624 0.3128 +vt 0.37706 0.31768 +vt 0.66844 0.29795 +vt 0.3703 0.30264 +vt 0.6641 0.27787 +vt 0.3741 0.28177 +vt 0.63923 0.25304 +vt 0.39893 0.25563 +vt 0.61399 0.24266 +vt 0.42446 0.24447 +vt 0.57294 0.25856 +vt 0.4664 0.2597 +vt 0.5639 0.272 +vt 0.51976 0.24886 +vt 0.47588 0.27307 +vt 0.55852 0.31659 +vt 0.48261 0.31784 +vt 0.52027 0.29476 +vt 0.55692 0.29121 +vt 0.48343 0.29224 +vt 0.52548 0.06896 +vt 0.51892 0.06789 +vt 0.51237 0.06895 +vt 0.53123 0.07382 +vt 0.50662 0.07381 +vt 0.53101 0.08743 +vt 0.50682 0.08741 +vt 0.53204 0.12771 +vt 0.53266 0.09092 +vt 0.50517 0.0909 +vt 0.50582 0.12772 +vt 0.53811 0.15838 +vt 0.51898 0.15174 +vt 0.51894 0.12835 +vt 0.49985 0.15843 +vt 0.51892 0.09395 +vt 0.51892 0.08518 +vt 0.54836 0.17356 +vt 0.53795 0.17596 +vt 0.53521 0.1668 +vt 0.50279 0.16685 +vt 0.5001 0.17603 +vt 0.48968 0.17369 +vt 0.54428 0.19336 +vt 0.53724 0.18757 +vt 0.50089 0.18757 +vt 0.49399 0.19342 +vt 0.51984 0.20084 +vt 0.52875 0.19178 +vt 0.50921 0.19162 +vt 0.51757 0.1906 +vt 0.51913 0.18538 +vt 0.51899 0.15902 +vt 0.53113 0.17163 +vt 0.51901 0.16559 +vt 0.50691 0.17166 +vt 0.51909 0.17945 +vt 0.52822 0.18631 +vt 0.50978 0.18626 +vt 0.53352 0.18421 +vt 0.50454 0.1842 +vt 0.53344 0.17673 +vt 0.5046 0.17679 +vt 0.56157 0.16777 +vt 0.47636 0.16799 +vt 0.55947 0.14931 +vt 0.47837 0.14944 +vt 0.59613 0.13342 +vt 0.44139 0.13359 +vt 0.60116 0.14788 +vt 0.43633 0.14819 +vt 0.51892 0.08386 +vt 0.52893 0.08495 +vt 0.50891 0.08494 +vt 0.52903 0.07542 +vt 0.50882 0.07541 +vt 0.52375 0.0705 +vt 0.5141 0.0705 +vt 0.51892 0.06946 +vt 0.52156 0.07497 +vt 0.51892 0.07425 +vt 0.51629 0.07496 +vt 0.52423 0.07669 +vt 0.51361 0.07668 +vt 0.5246 0.07988 +vt 0.51325 0.07987 +vt 0.51892 0.07933 +vt 0.57178 0.27729 +vt 0.56835 0.2929 +vt 0.46807 0.27861 +vt 0.47197 0.29428 +vt 0.57308 0.31138 +vt 0.46779 0.31308 +vt 0.58485 0.3277 +vt 0.45647 0.32996 +vt 0.58073 0.26662 +vt 0.45873 0.26804 +vt 0.61172 0.25572 +vt 0.42706 0.25772 +vt 0.63249 0.26285 +vt 0.40606 0.2655 +vt 0.65365 0.27997 +vt 0.3849 0.28363 +vt 0.65606 0.29763 +vt 0.38301 0.30186 +vt 0.65275 0.31018 +vt 0.38685 0.31461 +vt 0.62904 0.32386 +vt 0.41155 0.32767 +vt 0.6144 0.33197 +vt 0.42672 0.33536 +vt 0.60103 0.33362 +vt 0.44034 0.33653 +vt 0.59064 0.32151 +vt 0.60179 0.32845 +vt 0.4504 0.32391 +vt 0.43937 0.33133 +vt 0.61333 0.32708 +vt 0.42762 0.33035 +vt 0.62685 0.32051 +vt 0.41364 0.32417 +vt 0.64624 0.30642 +vt 0.39338 0.31051 +vt 0.64954 0.29622 +vt 0.38966 0.30018 +vt 0.64778 0.28348 +vt 0.39104 0.28707 +vt 0.62982 0.26726 +vt 0.40889 0.26995 +vt 0.61264 0.26156 +vt 0.42625 0.26369 +vt 0.58516 0.27099 +vt 0.45436 0.27258 +vt 0.57812 0.2819 +vt 0.46179 0.28344 +vt 0.57954 0.30934 +vt 0.4612 0.31123 +vt 0.57752 0.29377 +vt 0.46275 0.29543 +vt 0.5532 0.43306 +vt 0.52303 0.43362 +vt 0.4928 0.43453 +vt 0.60981 0.43151 +vt 0.43586 0.43574 +vt 0.64817 0.41931 +vt 0.39651 0.42541 +vt 0.6921 0.38827 +vt 0.35029 0.39622 +vt 0.72633 0.34175 +vt 0.31275 0.35058 +vt 0.73587 0.31211 +vt 0.30106 0.32059 +vt 0.7299 0.25639 +vt 0.30487 0.26108 +vt 0.69817 0.2169 +vt 0.33741 0.21917 +vt 0.6631 0.19067 +vt 0.37347 0.19187 +vt 0.6269 0.0156 +vt 0.64944 0.02237 +vt 0.66045 0.07608 +vt 0.62144 0.04808 +vt 0.37679 0.07529 +vt 0.38882 0.02158 +vt 0.41131 0.01513 +vt 0.41641 0.04763 +vt 0.56746 0.00014 +vt 0.5772 0.0328 +vt 0.47063 0.00014 +vt 0.46078 0.03265 +vt 0.51892 0.02488 +vt 0.54741 0.04172 +vt 0.49051 0.04166 +vt 0.55805 0.05387 +vt 0.47984 0.05378 +vt 0.57695 0.05799 +vt 0.46092 0.05784 +vt 0.61168 0.07826 +vt 0.42593 0.07798 +vt 0.62666 0.11135 +vt 0.41061 0.11124 +vt 0.62948 0.13045 +vt 0.62349 0.14679 +vt 0.41374 0.14715 +vt 0.40764 0.13059 +vt 0.6193 0.15984 +vt 0.41803 0.16036 +vt 0.9459 0.07956 +vt 0.88624 0.12177 +vt 0.84911 0.09973 +vt 0.89178 0.03691 +vt 0.18311 0.09212 +vt 0.14131 0.11248 +vt 0.07896 0.06071 +vt 0.14227 0.02146 +vt 0.78845 0.08082 +vt 0.80558 0.01078 +vt 0.24635 0.07651 +vt 0.23264 0.00348 +vt 0.68701 0.0772 +vt 0.67238 0.0222 +vt 0.34987 0.07595 +vt 0.36597 0.02099 +vt 0.76021 0.19324 +vt 0.78904 0.23332 +vt 0.27155 0.19387 +vt 0.24125 0.23697 +vt 0.99452 0.1677 +vt 0.90911 0.18326 +vt 0.10792 0.17908 +vt 0.01182 0.15536 +vt 0.91167 0.40242 +vt 0.86286 0.33855 +vt 0.89412 0.30188 +vt 0.9629 0.34475 +vt 0.12377 0.31551 +vt 0.16055 0.35682 +vt 0.1064 0.43265 +vt 0.04396 0.36703 +vt 0.91536 0.2598 +vt 0.99985 0.25464 +vt 0.09896 0.26696 +vt 0.00014 0.25911 +vt 0.74954 0.33468 +vt 0.76633 0.3008 +vt 0.78916 0.31372 +vt 0.2674 0.31014 +vt 0.28818 0.34649 +vt 0.24299 0.32555 +vt 0.81531 0.27638 +vt 0.84617 0.29339 +vt 0.21306 0.28516 +vt 0.17853 0.30498 +vt 0.845 0.25635 +vt 0.87351 0.26592 +vt 0.17966 0.26331 +vt 0.14708 0.27428 +vt 0.85907 0.22816 +vt 0.88699 0.23376 +vt 0.1628 0.23172 +vt 0.13151 0.23758 +vt 0.84235 0.19516 +vt 0.87503 0.1847 +vt 0.14522 0.18274 +vt 0.17678 0.19617 +vt 0.79428 0.36406 +vt 0.23977 0.38259 +vt 0.77018 0.37953 +vt 0.26812 0.39873 +vt 0.84549 0.44996 +vt 0.18528 0.48409 +vt 0.81585 0.44538 +vt 0.77057 0.44426 +vt 0.7557 0.4186 +vt 0.28703 0.44291 +vt 0.27136 0.47331 +vt 0.21926 0.47718 +vt 0.81984 0.46807 +vt 0.21589 0.5036 +vt 0.80963 0.23388 +vt 0.21916 0.23738 +vt 0.82928 0.21956 +vt 0.19906 0.22246 +vt 0.78648 0.11759 +vt 0.71548 0.13972 +vt 0.24666 0.11485 +vt 0.31953 0.1394 +vt 0.78548 0.15233 +vt 0.24596 0.151 +vt 0.83738 0.15636 +vt 0.85817 0.13777 +vt 0.17165 0.13229 +vt 0.19662 0.15524 +vt 0.50616 0.90485 +vt 0.43238 0.89494 +vt 0.43879 0.87022 +vt 0.49105 0.88171 +vt 0.31586 0.8682 +vt 0.32163 0.89322 +vt 0.2472 0.90115 +vt 0.26303 0.87832 +vt 0.57279 0.86048 +vt 0.60482 0.87994 +vt 0.18148 0.85469 +vt 0.14872 0.87334 +vt 0.58639 0.79397 +vt 0.61996 0.79161 +vt 0.16974 0.78747 +vt 0.13606 0.78409 +vt 0.54902 0.74641 +vt 0.56378 0.73921 +vt 0.20865 0.74087 +vt 0.19408 0.73324 +vt 0.50031 0.71172 +vt 0.50827 0.69769 +vt 0.25839 0.70749 +vt 0.25081 0.69324 +vt 0.43864 0.68068 +vt 0.4348 0.65888 +vt 0.32096 0.67795 +vt 0.32531 0.65622 +vt 0.50566 0.73094 +vt 0.45295 0.70002 +vt 0.30613 0.69697 +vt 0.25252 0.72659 +vt 0.54285 0.75575 +vt 0.21457 0.75041 +vt 0.56814 0.78736 +vt 0.18826 0.78137 +vt 0.55549 0.82635 +vt 0.19985 0.82088 +vt 0.50123 0.84435 +vt 0.25384 0.8405 +vt 0.45783 0.84004 +vt 0.29756 0.83735 +vt 0.79602 0.17696 +vt 0.78319 0.18744 +vt 0.23362 0.17562 +vt 0.24695 0.18707 +vt 0.39103 0.61189 +vt 0.39476 0.68612 +vt 0.36991 0.61019 +vt 0.36483 0.68444 +vt 0.39174 0.86209 +vt 0.4016 0.84146 +vt 0.35402 0.84029 +vt 0.36337 0.8613 +vt 0.43501 0.71828 +vt 0.32365 0.71573 +vt 0.43366 0.72966 +vt 0.38465 0.71029 +vt 0.3744 0.70896 +vt 0.32472 0.72717 +vt 0.41099 0.74766 +vt 0.42781 0.74282 +vt 0.34702 0.74581 +vt 0.33027 0.74053 +vt 0.41808 0.78494 +vt 0.38465 0.79542 +vt 0.37227 0.79447 +vt 0.33895 0.78307 +vt 0.43133 0.81753 +vt 0.32479 0.81546 +vt 0.81626 0.20308 +vt 0.8251 0.20976 +vt 0.19976 0.21482 +vt 0.20982 0.20616 +vt 0.80219 0.1846 +vt 0.22648 0.18308 +vt 0.4485 0.80462 +vt 0.47338 0.8247 +vt 0.30788 0.80203 +vt 0.28235 0.82152 +vt 0.43586 0.77956 +vt 0.32123 0.7772 +vt 0.42371 0.75419 +vt 0.33408 0.75204 +vt 0.43795 0.74977 +vt 0.31991 0.74725 +vt 0.44539 0.73199 +vt 0.3129 0.72922 +vt 0.44099 0.72438 +vt 0.31751 0.72169 +vt 0.45527 0.71373 +vt 0.30346 0.71065 +vt 0.51248 0.82881 +vt 0.24297 0.82457 +vt 0.55094 0.81181 +vt 0.20483 0.80641 +vt 0.55213 0.78768 +vt 0.20433 0.78215 +vt 0.5394 0.76453 +vt 0.21777 0.75931 +vt 0.50843 0.74313 +vt 0.24941 0.73873 +vt 0.47084 0.7484 +vt 0.45477 0.76166 +vt 0.28696 0.74502 +vt 0.30272 0.75874 +vt 0.48887 0.77046 +vt 0.4754 0.7839 +vt 0.26829 0.76666 +vt 0.28143 0.78051 +vt 0.50367 0.78756 +vt 0.49447 0.80247 +vt 0.25297 0.78341 +vt 0.26179 0.79862 +vt 0.51856 0.7916 +vt 0.5168 0.80733 +vt 0.23792 0.78704 +vt 0.23924 0.80289 +vt 0.48406 0.62877 +vt 0.54338 0.68353 +vt 0.27693 0.62506 +vt 0.21612 0.67812 +vt 0.58105 0.72693 +vt 0.17717 0.72042 +vt 0.6167 0.75996 +vt 0.14037 0.75237 +vt 0.70749 0.75988 +vt 0.66064 0.74116 +vt 0.04952 0.74882 +vt 0.09703 0.73205 +vt 0.74551 0.6521 +vt 0.67725 0.67043 +vt 0.0194 0.63974 +vt 0.08356 0.66203 +vt 0.74084 0.57242 +vt 0.6714 0.59265 +vt 0.03366 0.5644 +vt 0.09282 0.58986 +vt 0.83457 0.20687 +vt 0.8347 0.20695 +vt 0.05121 0.52265 +vt 0.14504 0.56259 +vt 0.62042 0.56567 +vt 0.49807 0.55231 +vt 0.26421 0.55014 +g ZBrush_defualt_group +f 47/1 1/2 3/3 45/4 +f 4/5 2/6 48/7 46/8 +f 45/4 3/3 5/9 43/10 +f 6/11 4/5 46/8 44/12 +f 3/3 9/13 7/14 5/9 +f 8/15 10/16 4/5 6/11 +f 1/2 11/17 9/13 3/3 +f 10/16 12/18 2/6 4/5 +f 11/17 13/19 15/20 9/13 +f 16/21 14/22 12/18 10/16 +f 9/13 15/20 17/23 7/14 +f 18/24 16/21 10/16 8/15 +f 15/20 21/25 19/26 17/23 +f 20/27 22/28 16/21 18/24 +f 13/19 23/29 21/25 15/20 +f 22/28 24/30 14/22 16/21 +f 23/29 25/31 27/32 21/25 +f 28/33 26/34 24/30 22/28 +f 21/25 27/32 29/35 19/26 +f 30/36 28/33 22/28 20/27 +f 27/32 33/37 31/38 29/35 +f 32/39 34/40 28/33 30/36 +f 25/31 35/41 33/37 27/32 +f 34/40 36/42 26/34 28/33 +f 35/41 37/43 39/44 33/37 +f 40/45 38/46 36/42 34/40 +f 33/37 39/44 41/47 31/38 +f 42/48 40/45 34/40 32/39 +f 39/44 45/4 43/10 41/47 +f 44/12 46/8 40/45 42/48 +f 37/43 47/1 45/4 39/44 +f 46/8 48/7 38/46 40/45 +f 47/1 37/43 51/49 49/50 +f 52/51 38/46 48/7 50/52 +f 37/43 35/41 53/53 51/49 +f 54/54 36/42 38/46 52/51 +f 35/41 25/31 55/55 53/53 +f 56/56 26/34 36/42 54/54 +f 25/31 23/29 57/57 55/55 +f 58/58 24/30 26/34 56/56 +f 23/29 13/19 59/59 57/57 +f 60/60 14/22 24/30 58/58 +f 13/19 11/17 63/61 59/59 +f 64/62 12/18 14/22 60/60 +f 11/17 1/2 65/63 63/61 +f 66/64 2/6 12/18 64/62 +f 1/2 47/1 49/50 65/63 +f 50/52 48/7 2/6 66/64 +f 61/65 65/63 49/50 +f 50/52 66/64 62/66 +f 63/61 65/63 61/65 +f 62/66 66/64 64/62 +f 61/65 59/59 63/61 +f 64/62 60/60 62/66 +f 61/65 57/57 59/59 +f 60/60 58/58 62/66 +f 61/65 55/55 57/57 +f 58/58 56/56 62/66 +f 61/65 53/53 55/55 +f 56/56 54/54 62/66 +f 61/65 51/49 53/53 +f 54/54 52/51 62/66 +f 61/65 49/50 51/49 +f 52/51 50/52 62/66 +f 89/67 174/68 176/69 91/70 +f 176/69 175/71 90/72 91/70 +f 87/73 172/74 174/68 89/67 +f 175/71 173/75 88/76 90/72 +f 85/77 170/78 172/74 87/73 +f 173/75 171/79 86/80 88/76 +f 83/81 168/82 170/78 85/77 +f 171/79 169/83 84/84 86/80 +f 81/85 166/86 168/82 83/81 +f 169/83 167/87 82/88 84/84 +f 79/89 92/90 146/91 164/92 +f 147/93 93/94 80/95 165/96 +f 92/90 94/97 148/98 146/91 +f 149/99 95/100 93/94 147/93 +f 94/97 96/101 150/102 148/98 +f 151/103 97/104 95/100 149/99 +f 96/101 98/105 152/106 150/102 +f 153/107 99/108 97/104 151/103 +f 98/105 100/109 154/110 152/106 +f 155/111 101/112 99/108 153/107 +f 100/109 102/113 156/114 154/110 +f 157/115 103/116 101/112 155/111 +f 102/113 104/117 158/118 156/114 +f 159/119 105/120 103/116 157/115 +f 104/117 106/121 160/122 158/118 +f 161/123 107/124 105/120 159/119 +f 106/121 108/125 162/126 160/122 +f 163/127 109/128 107/124 161/123 +f 108/125 67/129 68/130 162/126 +f 68/130 67/129 109/128 163/127 +f 110/131 128/132 160/122 162/126 +f 161/123 129/133 111/134 163/127 +f 128/132 179/135 158/118 160/122 +f 159/119 180/136 129/133 161/123 +f 126/137 156/114 158/118 179/135 +f 159/119 157/115 127/138 180/136 +f 124/139 154/110 156/114 126/137 +f 157/115 155/111 125/140 127/138 +f 122/141 152/106 154/110 124/139 +f 155/111 153/107 123/142 125/140 +f 120/143 150/102 152/106 122/141 +f 153/107 151/103 121/144 123/142 +f 118/145 148/98 150/102 120/143 +f 151/103 149/99 119/146 121/144 +f 116/147 146/91 148/98 118/145 +f 149/99 147/93 117/148 119/146 +f 114/149 164/92 146/91 116/147 +f 147/93 165/96 115/150 117/148 +f 114/149 181/151 177/152 164/92 +f 177/152 182/153 115/150 165/96 +f 110/131 162/126 68/130 112/154 +f 68/130 163/127 111/134 113/155 +f 112/154 68/130 178/156 183/157 +f 178/156 68/130 113/155 184/158 +f 177/152 181/151 183/157 178/156 +f 184/158 182/153 177/152 178/156 +f 135/159 137/160 176/69 174/68 +f 176/69 137/160 136/161 175/71 +f 133/162 135/159 174/68 172/74 +f 175/71 136/161 134/163 173/75 +f 131/164 133/162 172/74 170/78 +f 173/75 134/163 132/165 171/79 +f 166/86 187/166 185/167 168/82 +f 186/168 188/169 167/87 169/83 +f 131/164 170/78 168/82 185/167 +f 169/83 171/79 132/165 186/168 +f 144/170 190/171 189/172 187/166 +f 189/172 190/171 145/173 188/169 +f 185/167 187/166 189/172 69/174 +f 189/172 188/169 186/168 69/174 +f 130/175 131/164 185/167 69/174 +f 186/168 132/165 130/175 69/174 +f 142/176 193/177 191/178 144/170 +f 192/179 194/180 143/181 145/173 +f 140/182 195/183 193/177 142/176 +f 194/180 196/184 141/185 143/181 +f 139/186 197/187 195/183 140/182 +f 196/184 198/188 139/186 141/185 +f 138/189 71/190 197/187 139/186 +f 198/188 71/190 138/189 139/186 +f 190/171 144/170 191/178 70/191 +f 192/179 145/173 190/171 70/191 +f 70/191 191/178 206/192 208/193 +f 207/194 192/179 70/191 208/193 +f 71/190 199/195 200/196 197/187 +f 201/197 199/195 71/190 198/188 +f 197/187 200/196 202/198 195/183 +f 203/199 201/197 198/188 196/184 +f 195/183 202/198 204/200 193/177 +f 205/201 203/199 196/184 194/180 +f 193/177 204/200 206/192 191/178 +f 207/194 205/201 194/180 192/179 +f 199/195 204/200 202/198 200/196 +f 203/199 205/201 199/195 201/197 +f 199/195 208/193 206/192 204/200 +f 207/194 208/193 199/195 205/201 +f 139/186 140/182 164/92 177/152 +f 165/96 141/185 139/186 177/152 +f 140/182 142/176 211/202 164/92 +f 212/203 143/181 141/185 165/96 +f 142/176 144/170 213/204 211/202 +f 214/205 145/173 143/181 212/203 +f 144/170 187/166 166/86 213/204 +f 167/87 188/169 145/173 214/205 +f 81/85 209/206 213/204 166/86 +f 214/205 210/207 82/88 167/87 +f 209/206 215/208 211/202 213/204 +f 212/203 216/209 210/207 214/205 +f 79/89 164/92 211/202 215/208 +f 212/203 165/96 80/95 216/209 +f 131/164 130/175 72/210 222/211 +f 72/210 130/175 132/165 223/212 +f 133/162 131/164 222/211 220/213 +f 223/212 132/165 134/163 221/214 +f 135/159 133/162 220/213 218/215 +f 221/214 134/163 136/161 219/216 +f 137/160 135/159 218/215 217/217 +f 219/216 136/161 137/160 217/217 +f 217/217 218/215 229/218 231/219 +f 230/220 219/216 217/217 231/219 +f 218/215 220/213 227/221 229/218 +f 228/222 221/214 219/216 230/220 +f 220/213 222/211 225/223 227/221 +f 226/224 223/212 221/214 228/222 +f 222/211 72/210 224/225 225/223 +f 224/225 72/210 223/212 226/224 +f 224/225 231/219 229/218 225/223 +f 230/220 231/219 224/225 226/224 +f 225/223 229/218 227/221 +f 228/222 230/220 226/224 +f 183/157 181/151 234/226 232/227 +f 235/228 182/153 184/158 233/229 +f 112/154 183/157 232/227 254/230 +f 233/229 184/158 113/155 255/231 +f 110/131 112/154 254/230 256/232 +f 255/231 113/155 111/134 257/233 +f 181/151 114/149 252/234 234/226 +f 253/235 115/150 182/153 235/228 +f 114/149 116/147 250/236 252/234 +f 251/237 117/148 115/150 253/235 +f 116/147 118/145 248/238 250/236 +f 249/239 119/146 117/148 251/237 +f 118/145 120/143 246/240 248/238 +f 247/241 121/144 119/146 249/239 +f 120/143 122/141 244/242 246/240 +f 245/243 123/142 121/144 247/241 +f 122/141 124/139 242/244 244/242 +f 243/245 125/140 123/142 245/243 +f 124/139 126/137 240/246 242/244 +f 241/247 127/138 125/140 243/245 +f 126/137 179/135 236/248 240/246 +f 237/249 180/136 127/138 241/247 +f 179/135 128/132 238/250 236/248 +f 239/251 129/133 180/136 237/249 +f 128/132 110/131 256/232 238/250 +f 257/233 111/134 129/133 239/251 +f 238/250 256/232 258/252 276/253 +f 259/254 257/233 239/251 277/255 +f 236/248 238/250 276/253 278/256 +f 277/255 239/251 237/249 279/257 +f 240/246 236/248 278/256 274/258 +f 279/257 237/249 241/247 275/259 +f 242/244 240/246 274/258 272/260 +f 275/259 241/247 243/245 273/261 +f 244/242 242/244 272/260 270/262 +f 273/261 243/245 245/243 271/263 +f 246/240 244/242 270/262 268/264 +f 271/263 245/243 247/241 269/265 +f 248/238 246/240 268/264 266/266 +f 269/265 247/241 249/239 267/267 +f 250/236 248/238 266/266 264/268 +f 267/267 249/239 251/237 265/269 +f 252/234 250/236 264/268 262/270 +f 265/269 251/237 253/235 263/271 +f 234/226 252/234 262/270 280/272 +f 263/271 253/235 235/228 281/273 +f 256/232 254/230 260/274 258/252 +f 261/275 255/231 257/233 259/254 +f 254/230 232/227 282/276 260/274 +f 283/277 233/229 255/231 261/275 +f 232/227 234/226 280/272 282/276 +f 281/273 235/228 233/229 283/277 +f 67/129 108/125 284/278 73/279 +f 285/280 109/128 67/129 73/279 +f 108/125 106/121 286/281 284/278 +f 287/282 107/124 109/128 285/280 +f 106/121 104/117 288/283 286/281 +f 289/284 105/120 107/124 287/282 +f 104/117 102/113 290/285 288/283 +f 291/286 103/116 105/120 289/284 +f 102/113 100/109 292/287 290/285 +f 293/288 101/112 103/116 291/286 +f 100/109 98/105 294/289 292/287 +f 295/290 99/108 101/112 293/288 +f 98/105 96/101 296/291 294/289 +f 297/292 97/104 99/108 295/290 +f 96/101 94/97 298/293 296/291 +f 299/294 95/100 97/104 297/292 +f 94/97 92/90 300/295 298/293 +f 301/296 93/94 95/100 299/294 +f 308/297 309/298 328/299 338/300 +f 329/301 309/302 308/303 339/304 +f 307/305 308/297 338/300 336/306 +f 339/304 308/303 307/307 337/308 +f 306/309 307/305 336/306 340/310 +f 337/308 307/307 306/309 341/311 +f 89/67 91/70 306/309 340/310 +f 306/309 91/70 90/72 341/311 +f 87/73 89/67 340/310 334/312 +f 341/311 90/72 88/76 335/313 +f 85/77 87/73 334/312 330/314 +f 335/313 88/76 86/80 331/315 +f 83/81 85/77 330/314 332/316 +f 331/315 86/80 84/84 333/317 +f 330/314 336/306 338/300 332/316 +f 339/304 337/308 331/315 333/317 +f 330/314 334/312 340/310 336/306 +f 341/311 335/313 331/315 337/308 +f 326/318 332/316 338/300 328/299 +f 339/304 333/317 327/319 329/301 +f 81/85 83/81 332/316 326/318 +f 333/317 84/84 82/88 327/319 +f 209/206 342/320 344/321 215/208 +f 345/322 343/323 210/207 216/209 +f 81/85 326/318 342/320 209/206 +f 343/323 327/319 82/88 210/207 +f 79/89 215/208 344/321 346/324 +f 345/322 216/209 80/95 347/325 +f 79/89 346/324 300/295 92/90 +f 301/296 347/325 80/95 93/94 +f 77/326 324/327 352/328 304/329 +f 353/330 325/331 77/332 304/333 +f 304/329 352/328 350/334 78/335 +f 351/336 353/330 304/333 78/337 +f 78/335 350/334 348/338 305/339 +f 349/340 351/336 78/337 305/341 +f 305/339 348/338 328/299 309/298 +f 329/301 349/340 305/341 309/302 +f 326/318 328/299 348/338 342/320 +f 349/340 329/301 327/319 343/323 +f 296/291 298/293 318/342 310/343 +f 319/344 299/294 297/292 311/345 +f 76/346 316/347 324/327 77/326 +f 325/331 317/348 76/349 77/332 +f 302/350 358/351 356/352 303/353 +f 357/354 359/355 302/356 303/357 +f 303/353 356/352 354/358 75/359 +f 355/360 357/354 303/357 75/361 +f 75/359 354/358 316/347 76/346 +f 317/348 355/360 75/361 76/349 +f 292/362 294/289 362/363 364/364 +f 363/365 295/290 293/366 365/367 +f 364/364 362/363 368/368 366/369 +f 369/370 363/365 365/367 367/371 +f 366/369 368/368 370/372 372/373 +f 371/374 369/370 367/371 373/375 +f 372/373 370/372 376/376 374/377 +f 377/378 371/374 373/375 375/379 +f 314/380 378/381 374/377 376/376 +f 375/379 379/382 315/383 377/378 +f 316/347 354/358 374/377 378/381 +f 375/379 355/360 317/348 379/382 +f 354/358 356/352 372/373 374/377 +f 373/375 357/354 355/360 375/379 +f 356/352 358/351 366/369 372/373 +f 367/371 359/355 357/354 373/375 +f 358/351 360/384 364/364 366/369 +f 365/367 361/385 359/355 367/371 +f 290/386 292/362 364/364 360/384 +f 365/367 293/366 291/387 361/385 +f 74/388 360/384 358/351 302/350 +f 359/355 361/385 74/389 302/356 +f 284/390 286/391 288/392 290/386 +f 289/393 287/394 285/395 291/387 +f 284/390 290/386 360/384 74/388 +f 361/385 291/387 285/395 74/389 +f 73/396 284/390 74/388 +f 74/389 285/395 73/397 +f 294/289 296/291 310/343 362/363 +f 311/345 297/292 295/290 363/365 +f 310/343 312/398 368/368 362/363 +f 369/370 313/399 311/345 363/365 +f 312/398 382/400 370/372 368/368 +f 371/374 383/401 313/399 369/370 +f 314/380 376/376 370/372 382/400 +f 371/374 377/378 315/383 383/401 +f 348/338 350/334 386/402 384/403 +f 387/404 351/336 349/340 385/405 +f 318/342 384/403 386/402 320/406 +f 387/404 385/405 319/344 321/407 +f 298/293 300/295 384/403 318/342 +f 385/405 301/296 299/294 319/344 +f 300/295 344/321 342/320 384/403 +f 343/323 345/322 301/296 385/405 +f 342/320 348/338 384/403 +f 385/405 349/340 343/323 +f 300/295 346/324 344/321 +f 345/322 347/325 301/296 +f 314/380 322/408 380/409 378/381 +f 381/410 323/411 315/383 379/382 +f 316/347 378/381 380/409 324/327 +f 381/410 379/382 317/348 325/331 +f 320/406 386/402 380/409 322/408 +f 381/410 387/404 321/407 323/411 +f 350/334 352/328 380/409 386/402 +f 381/410 353/330 351/336 387/404 +f 324/327 380/409 352/328 +f 353/330 381/410 325/331 +f 400/412 388/413 414/414 402/415 +f 415/416 389/417 401/418 403/419 +f 400/412 402/415 404/420 398/421 +f 405/422 403/419 401/418 399/423 +f 398/421 404/420 406/424 396/425 +f 407/426 405/422 399/423 397/427 +f 396/425 406/424 408/428 394/429 +f 409/430 407/426 397/427 395/431 +f 394/429 408/428 410/432 392/433 +f 411/434 409/430 395/431 393/435 +f 392/433 410/432 412/436 390/437 +f 413/438 411/434 393/435 391/439 +f 410/432 420/440 418/441 412/436 +f 419/442 421/443 411/434 413/438 +f 408/428 422/444 420/440 410/432 +f 421/443 423/445 409/430 411/434 +f 406/424 424/446 422/444 408/428 +f 423/445 425/447 407/426 409/430 +f 404/420 426/448 424/446 406/424 +f 425/447 427/449 405/422 407/426 +f 402/415 428/450 426/448 404/420 +f 427/449 429/451 403/419 405/422 +f 402/415 414/414 416/452 428/450 +f 417/453 415/416 403/419 429/451 +f 318/342 320/406 444/454 442/455 +f 445/456 321/407 319/344 443/457 +f 320/458 390/437 412/436 444/459 +f 413/438 391/439 321/460 445/461 +f 310/343 318/342 442/455 312/398 +f 443/457 319/344 311/345 313/399 +f 382/462 430/463 414/414 388/413 +f 415/416 431/464 383/465 389/417 +f 412/436 418/441 440/466 444/459 +f 441/467 419/442 413/438 445/461 +f 438/468 446/469 444/459 440/466 +f 445/461 447/470 439/471 441/467 +f 434/472 446/469 438/468 436/473 +f 439/471 447/470 435/474 437/475 +f 432/476 448/477 446/469 434/472 +f 447/470 449/478 433/479 435/474 +f 430/463 448/477 432/476 450/480 +f 433/479 449/478 431/464 451/481 +f 414/414 430/463 450/480 416/452 +f 451/481 431/464 415/416 417/453 +f 312/398 448/482 430/483 382/400 +f 431/484 449/485 313/399 383/401 +f 312/398 442/455 446/486 448/482 +f 447/487 443/457 313/399 449/485 +f 442/455 444/454 446/486 +f 447/487 445/456 443/457 +f 416/452 450/480 452/488 476/489 +f 453/490 451/481 417/453 477/491 +f 450/480 432/476 462/492 452/488 +f 463/493 433/479 451/481 453/490 +f 432/476 434/472 460/494 462/492 +f 461/495 435/474 433/479 463/493 +f 434/472 436/473 458/496 460/494 +f 459/497 437/475 435/474 461/495 +f 436/473 438/468 456/498 458/496 +f 457/499 439/471 437/475 459/497 +f 438/468 440/466 454/500 456/498 +f 455/501 441/467 439/471 457/499 +f 440/466 418/441 474/502 454/500 +f 475/503 419/442 441/467 455/501 +f 428/450 416/452 476/489 464/504 +f 477/491 417/453 429/451 465/505 +f 426/448 428/450 464/504 466/506 +f 465/505 429/451 427/449 467/507 +f 424/446 426/448 466/506 468/508 +f 467/507 427/449 425/447 469/509 +f 422/444 424/446 468/508 470/510 +f 469/509 425/447 423/445 471/511 +f 420/440 422/444 470/510 472/512 +f 471/511 423/445 421/443 473/513 +f 418/441 420/440 472/512 474/502 +f 473/513 421/443 419/442 475/503 +f 458/496 456/498 480/514 478/515 +f 481/516 457/499 459/497 479/517 +f 478/515 480/514 482/518 484/519 +f 483/520 481/516 479/517 485/521 +f 484/519 482/518 488/522 486/523 +f 489/524 483/520 485/521 487/525 +f 486/523 488/522 490/526 492/527 +f 491/528 489/524 487/525 493/529 +f 464/504 476/489 486/523 492/527 +f 487/525 477/491 465/505 493/529 +f 452/488 484/519 486/523 476/489 +f 487/525 485/521 453/490 477/491 +f 452/488 462/492 478/515 484/519 +f 479/517 463/493 453/490 485/521 +f 458/496 478/515 462/492 460/494 +f 463/493 479/517 459/497 461/495 +f 454/500 474/502 480/514 456/498 +f 481/516 475/503 455/501 457/499 +f 472/512 482/518 480/514 474/502 +f 481/516 483/520 473/513 475/503 +f 470/510 488/522 482/518 472/512 +f 483/520 489/524 471/511 473/513 +f 468/508 490/526 488/522 470/510 +f 489/524 491/528 469/509 471/511 +f 466/506 492/527 490/526 468/508 +f 491/528 493/529 467/507 469/509 +f 464/504 492/527 466/506 +f 467/507 493/529 465/505 +f 392/433 390/437 504/530 502/531 +f 505/532 391/439 393/435 503/533 +f 394/429 392/433 502/531 500/534 +f 503/533 393/435 395/431 501/535 +f 396/425 394/429 500/534 498/536 +f 501/535 395/431 397/427 499/537 +f 398/538 396/425 498/536 496/539 +f 499/537 397/427 399/540 497/541 +f 400/542 398/538 496/539 494/543 +f 497/541 399/540 401/544 495/545 +f 388/546 400/542 494/543 506/547 +f 495/545 401/544 389/548 507/549 +f 494/543 502/531 504/530 506/547 +f 505/532 503/533 495/545 507/549 +f 494/543 496/539 500/534 502/531 +f 501/535 497/541 495/545 503/533 +f 496/539 498/536 500/534 +f 501/535 499/537 497/541 +f 314/380 382/400 388/550 506/551 +f 389/548 383/552 315/553 507/549 +f 314/554 506/547 504/530 322/555 +f 505/532 507/549 315/553 323/556 +f 320/458 322/555 504/530 390/437 +f 505/532 323/556 321/460 391/439 + + \ No newline at end of file diff --git a/modules/ufbx/data/synthetic_color_suzanne_7500_binary.fbx b/modules/ufbx/data/synthetic_color_suzanne_7500_binary.fbx new file mode 100644 index 0000000..c08c3f3 Binary files /dev/null and b/modules/ufbx/data/synthetic_color_suzanne_7500_binary.fbx differ diff --git a/modules/ufbx/data/synthetic_cube_nan_6100_ascii.fbx b/modules/ufbx/data/synthetic_cube_nan_6100_ascii.fbx new file mode 100644 index 0000000..d55d930 --- /dev/null +++ b/modules/ufbx/data/synthetic_cube_nan_6100_ascii.fbx @@ -0,0 +1,372 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 33 + Second: 51 + Millisecond: 520 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: 1.#NAN,-1.#INF,0.#INF,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "31/03/2020 18:33:51.517" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_cube_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "31/03/2020 18:33:51.517" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_cube_nan_7400_ascii.fbx b/modules/ufbx/data/synthetic_cube_nan_7400_ascii.fbx new file mode 100644 index 0000000..00579ed --- /dev/null +++ b/modules/ufbx/data/synthetic_cube_nan_7400_ascii.fbx @@ -0,0 +1,424 @@ +; FBX 7.4.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7400 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 10 + Millisecond: 814 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7400_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7400_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:10.811" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7400_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:10.811" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658701024, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1907663073408, "Geometry::", "Mesh" { + Vertices: *24 { + a: -1.#NAN,-0.5#INF,1.0#INF,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1907292236800, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1908464858960, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907674289488, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631731008, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1907292236800,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631731008,1907674289488 + + ;Geometry::, Model::pCube1 + C: "OO",1907663073408,1907292236800 + + ;Material::lambert1, Model::pCube1 + C: "OO",1908464858960,1907292236800 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_cursed_geometry_7700_ascii.fbx b/modules/ufbx/data/synthetic_cursed_geometry_7700_ascii.fbx new file mode 100644 index 0000000..462c521 --- /dev/null +++ b/modules/ufbx/data/synthetic_cursed_geometry_7700_ascii.fbx @@ -0,0 +1,342 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 7 + Hour: 23 + Minute: 17 + Second: 45 + Millisecond: 518 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_cursed_geometry_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_cursed_geometry_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "07/06/2022 20:17:45.517" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_cursed_geometry_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "07/06/2022 20:17:45.517" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1829863561136, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1829855978128, "Geometry::", "Mesh" { + Vertices: *30 { + a: -0.309017032384872,0,0.951056480407715,0.309016972780228,0,0.95105654001236,0.80901700258255,0,0.587785243988037,1,0,-0,0.80901700258255,0,-0.587785243988037,0.309016972780228,0,-0.95105654001236,-0.309017032384872,0,-0.951056480407715,-0.80901688337326,0,-0.587785363197327,-1,0,8.74227765734759e-08,-0.809016764163971,0,0.587785542011261 + } + PolygonVertexIndex: *10 { + a: + 0,1,2,3,4,5,6,7,8,-10, + -1, + 1,-1, + 0,1,0,-4, + 0,-1, + 0,0,0,0,-1, + 0,0,0,0,0,0,0,-1, + 0,1,0,1,0,1,-1, + 0,1,2,3,4,5,6,3,-1 + } + GeometryVersion: 124 + Layer: 0 { + Version: 100 + } + } + Model: 1829778113456, "Model::pDisc1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1829738509424, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1829868199232, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1829866854192, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pDisc1, Model::RootNode + C: "OO",1829778113456,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1829866854192,1829868199232 + + ;Geometry::, Model::pDisc1 + C: "OO",1829855978128,1829778113456 + + ;Material::lambert1, Model::pDisc1 + C: "OO",1829738509424,1829778113456 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_duplicate_id_6100_ascii.fbx b/modules/ufbx/data/synthetic_duplicate_id_6100_ascii.fbx new file mode 100644 index 0000000..89584ec --- /dev/null +++ b/modules/ufbx/data/synthetic_duplicate_id_6100_ascii.fbx @@ -0,0 +1,753 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 18 + Hour: 16 + Minute: 22 + Second: 40 + Millisecond: 937 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "Model" { + Count: 4 + } + ObjectType: "Material" { + Count: 2 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,1.76611596139409,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube2_ncl1_1" + } + Model: "Model::pointLight1", "Light" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0.999915985530811,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "Color", "AN",1,1,1 + Property: "LightType", "enum", "N",0 + Property: "CastLightOnObject", "bool", "N",1 + Property: "DrawVolumetricLight", "bool", "N",1 + Property: "DrawGroundProjection", "bool", "N",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "N",0 + Property: "Intensity", "Number", "AN",100 + Property: "Fog", "Number", "AN",50 + Property: "DecayType", "enum", "N",0 + Property: "DecayStart", "Number", "AN",0 + Property: "FileName", "KString", "N", "" + Property: "EnableNearAttenuation", "bool", "N",0 + Property: "NearAttenuationStart", "Number", "AN",0 + Property: "NearAttenuationEnd", "Number", "AN",0 + Property: "EnableFarAttenuation", "bool", "N",0 + Property: "FarAttenuationStart", "Number", "AN",0 + Property: "FarAttenuationEnd", "Number", "AN",0 + Property: "CastShadows", "bool", "N",1 + Property: "ShadowColor", "Color", "AN",0,0,0 + Property: "HotSpot", "Number", "AN",0 + Property: "Cone angle", "Number", "AN",45 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Light" + GeometryVersion: 124 + NodeAttributeName: "NodeAttribute::pointLight1_ncl1_1" + } + Model: "Model::pointLight1", "Light" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1.00719802086405,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "Color", "AN",1,1,1 + Property: "LightType", "enum", "N",0 + Property: "CastLightOnObject", "bool", "N",1 + Property: "DrawVolumetricLight", "bool", "N",1 + Property: "DrawGroundProjection", "bool", "N",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "N",0 + Property: "Intensity", "Number", "AN",100 + Property: "Fog", "Number", "AN",50 + Property: "DecayType", "enum", "N",0 + Property: "DecayStart", "Number", "AN",0 + Property: "FileName", "KString", "N", "" + Property: "EnableNearAttenuation", "bool", "N",0 + Property: "NearAttenuationStart", "Number", "AN",0 + Property: "NearAttenuationEnd", "Number", "AN",0 + Property: "EnableFarAttenuation", "bool", "N",0 + Property: "FarAttenuationStart", "Number", "AN",0 + Property: "FarAttenuationEnd", "Number", "AN",0 + Property: "CastShadows", "bool", "N",1 + Property: "ShadowColor", "Color", "AN",0,0,0 + Property: "HotSpot", "Number", "AN",0 + Property: "Cone angle", "Number", "AN",45 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Light" + GeometryVersion: 124 + NodeAttributeName: "NodeAttribute::pointLight2_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_id_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_id_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2023" + Property: "Original|DateTime_GMT", "DateTime", "", "18/12/2022 14:22:40.935" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_id_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2023" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "18/12/2022 14:22:40.935" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",0 + Property: "TimeSpanStop", "KTime", "",192442325000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::pointLight1", "Model::Scene" + Connect: "OO", "Model::pointLight1", "Model::Scene" + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 588000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_duplicate_id_7700_ascii.fbx b/modules/ufbx/data/synthetic_duplicate_id_7700_ascii.fbx new file mode 100644 index 0000000..cb8abce --- /dev/null +++ b/modules/ufbx/data/synthetic_duplicate_id_7700_ascii.fbx @@ -0,0 +1,626 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 18 + Hour: 16 + Minute: 40 + Second: 25 + Millisecond: 558 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_id_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_id_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "18/12/2022 14:40:25.556" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_id_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "18/12/2022 14:40:25.556" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",192442325000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2145871435376, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 2 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 2 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 4 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 2 + PropertyTemplate: "FbxLight" { + Properties70: { + P: "Color", "Color", "", "A",1,1,1 + P: "LightType", "enum", "", "",0 + P: "CastLightOnObject", "bool", "", "",1 + P: "DrawVolumetricLight", "bool", "", "",1 + P: "DrawGroundProjection", "bool", "", "",1 + P: "DrawFrontFacingVolumetricLight", "bool", "", "",0 + P: "Intensity", "Number", "", "A",100 + P: "InnerAngle", "Number", "", "A",0 + P: "OuterAngle", "Number", "", "A",45 + P: "Fog", "Number", "", "A",50 + P: "DecayType", "enum", "", "",0 + P: "DecayStart", "Number", "", "A",0 + P: "FileName", "KString", "", "", "" + P: "EnableNearAttenuation", "bool", "", "",0 + P: "NearAttenuationStart", "Number", "", "A",0 + P: "NearAttenuationEnd", "Number", "", "A",0 + P: "EnableFarAttenuation", "bool", "", "",0 + P: "FarAttenuationStart", "Number", "", "A",0 + P: "FarAttenuationEnd", "Number", "", "A",0 + P: "CastShadows", "bool", "", "",0 + P: "ShadowColor", "Color", "", "A",0,0,0 + P: "AreaLightShape", "enum", "", "",0 + P: "LeftBarnDoor", "Float", "", "A",20 + P: "RightBarnDoor", "Float", "", "A",20 + P: "TopBarnDoor", "Float", "", "A",20 + P: "BottomBarnDoor", "Float", "", "A",20 + P: "EnableBarnDoor", "Bool", "", "A",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2146384024432, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2146384024432, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2144797390640, "NodeAttribute::", "Light" { + Properties70: { + P: "CastShadows", "bool", "", "",1 + } + TypeFlags: "Light" + GeometryVersion: 124 + } + NodeAttribute: 2144797390640, "NodeAttribute::", "Light" { + Properties70: { + P: "CastShadows", "bool", "", "",1 + } + TypeFlags: "Light" + GeometryVersion: 124 + } + Model: 2144825148096, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2144825148096, "Model::pCube2", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,1.76611596139409,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2144825155056, "Model::pointLight1", "Light" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0.999915985530811,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2144825155056, "Model::pointLight2", "Light" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-1.00719802086405,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Material: 2146300909328, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Material: 2146300909328, "Material::lambert2", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2146306735056, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationLayer: 2146396470704, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2144825148096,0 + + ;Model::pointLight1, Model::RootNode + C: "OO",2144825155056,0 + + ;Model::pointLight2, Model::RootNode + C: "OO",2144825155056,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2146396470704,2146306735056 + + ;Geometry::, Model::pCube1 + C: "OO",2146384024432,2144825148096 + + ;Material::lambert1, Model::pCube1 + C: "OO",2146300909328,2144825148096 + + ;Model::pCube2, Model::pCube1 + C: "OO",2144825148096,0 + + ;Geometry::, Model::pCube2 + C: "OO",2146384024432,2144825148096 + + ;Material::lambert2, Model::pCube2 + C: "OO",2146300909328,2144825148096 + + ;NodeAttribute::, Model::pointLight1 + C: "OO",2144797390640,2144825155056 + + ;NodeAttribute::, Model::pointLight2 + C: "OO",2144797390640,2144825155056 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + } +} diff --git a/modules/ufbx/data/synthetic_duplicate_prop_6100_ascii.fbx b/modules/ufbx/data/synthetic_duplicate_prop_6100_ascii.fbx new file mode 100644 index 0000000..695c447 --- /dev/null +++ b/modules/ufbx/data/synthetic_duplicate_prop_6100_ascii.fbx @@ -0,0 +1,339 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 1 + Hour: 18 + Minute: 13 + Second: 30 + Millisecond: 99 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1,0,0 + Property: "Lcl Translation", "Lcl Translation", "A",-1,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Lcl Scaling", "Lcl Scaling", "A",2,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_prop_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_prop_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "01/08/2021 15:13:30.098" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_prop_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "01/08/2021 15:13:30.098" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_duplicate_prop_7500_ascii.fbx b/modules/ufbx/data/synthetic_duplicate_prop_7500_ascii.fbx new file mode 100644 index 0000000..ce73908 --- /dev/null +++ b/modules/ufbx/data/synthetic_duplicate_prop_7500_ascii.fbx @@ -0,0 +1,381 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 1 + Hour: 18 + Minute: 15 + Second: 28 + Millisecond: 508 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_prop_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_prop_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "01/08/2021 15:15:28.507" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_duplicate_prop_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "01/08/2021 15:15:28.507" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2179902334304, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Lcl Scaling", "Lcl Scaling", "", "A",2,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2179902052416, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2179263658128, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1,0,0 + P: "Lcl Translation", "Lcl Translation", "", "A",-1,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2179884749312, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2179900430096, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2180150707920, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2179263658128,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2180150707920,2179900430096 + + ;Geometry::, Model::pCube1 + C: "OO",2179902052416,2179263658128 + + ;Material::lambert1, Model::pCube1 + C: "OO",2179884749312,2179263658128 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_empty_elements_7500_ascii.fbx b/modules/ufbx/data/synthetic_empty_elements_7500_ascii.fbx new file mode 100644 index 0000000..c60aec6 --- /dev/null +++ b/modules/ufbx/data/synthetic_empty_elements_7500_ascii.fbx @@ -0,0 +1,431 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 34 + Millisecond: 164 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658664160, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1908558533920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1907292239120, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1907674217712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907680138928, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631740128, "AnimLayer::BaseLayer", "" { + } + Geometry: 1, "Geometry::", "Mesh" + AnimationLayer: 2, "AnimLayer::BaseLayer", "" + Material: 3, "Material::lambert1", "" + Model: 4, "Model::pCube1", "Mesh" +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1907292239120,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631740128,1907680138928 + + ;Geometry::, Model::pCube1 + C: "OO",1908558533920,1907292239120 + + ;Material::lambert1, Model::pCube1 + C: "OO",1907674217712,1907292239120 + + C: "OO",4,0 + C: "OO",1,4 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_empty_face_0_obj.obj b/modules/ufbx/data/synthetic_empty_face_0_obj.obj new file mode 100644 index 0000000..fa0e822 --- /dev/null +++ b/modules/ufbx/data/synthetic_empty_face_0_obj.obj @@ -0,0 +1,3 @@ +o Object +f + diff --git a/modules/ufbx/data/synthetic_extended_line_0_obj.obj b/modules/ufbx/data/synthetic_extended_line_0_obj.obj new file mode 100644 index 0000000..579d738 --- /dev/null +++ b/modules/ufbx/data/synthetic_extended_line_0_obj.obj @@ -0,0 +1,14 @@ +o Line + +v 0 0 0 1 0 0 +v 1 0 0 0 1 0 +v 0 1 0 0 0 1 +v 1 1 0 1 1 1 + +vt 0 0 +vt 2 0 +vt 0 2 +vt 2 2 + +l 1/1 2/2 3/3 4/4 1/1 + diff --git a/modules/ufbx/data/synthetic_extended_points_0_obj.obj b/modules/ufbx/data/synthetic_extended_points_0_obj.obj new file mode 100644 index 0000000..3e9e3cc --- /dev/null +++ b/modules/ufbx/data/synthetic_extended_points_0_obj.obj @@ -0,0 +1,8 @@ +o Points + +v 0 0 0 1 0 0 +v 1 0 0 0 1 0 +v 0 1 0 0 0 1 + +p 1 2 3 + diff --git a/modules/ufbx/data/synthetic_face_group_id_6100_ascii.fbx b/modules/ufbx/data/synthetic_face_group_id_6100_ascii.fbx new file mode 100644 index 0000000..84f3b3a --- /dev/null +++ b/modules/ufbx/data/synthetic_face_group_id_6100_ascii.fbx @@ -0,0 +1,756 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 6 + Hour: 23 + Minute: 45 + Second: 14 + Millisecond: 70 + } + Creator: "FBX SDK/FBX Plugins version 2020.0.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "Model" { + Count: 2 + } + ObjectType: "Material" { + Count: 2 + } + ObjectType: "Texture" { + Count: 1 + } + ObjectType: "Video" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::20 Sided", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: 0.866137802600861,0.999999046325684,-0.50020444393158,-5.13009688063448e-08,1.6180272102356,-0.618704557418823,-3.50126100556736e-07 + ,0.61761873960495,-0.999990046024323,0.535301983356476,9.05990600585938e-06,-0.308466523885727,-0.535303056240082 + ,9.5367431640625e-06,-0.308466225862503,-0.866137802600861,0.999999582767487,-0.500203847885132,0.535302817821503 + ,1.6187037229538,0.308466345071793,-0.535302102565765,1.61870431900024,0.308466643095016,0.866137802600861,0.618713438510895 + ,0.500203847885132,-6.79083314025775e-08,0.000685930252075195,0.618704557418823,-0.866137683391571,0.618713855743408 + ,0.50020444393158,2.30916811005955e-07,1.00109434127808,0.999990046024323 + PolygonVertexIndex: 2,1,-1,2,0,-4,2,3,-5,2,4,-6,2,5,-2,1,7,-7,0,6,-9,3,8,-10,4,9,-11,5,10,-8,6,0,-2,8,3,-1,9,4,-4,10,5,-5,7,1,-6,11,8 + ,-7,11,9,-9,11,10,-10,11,7,-11,11,6,-8 + Edges: 0,1,2,4,5,7,8,10,11,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,45,47,48,51,54 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: 0.850650733723288,0.187233654239426,-0.491260509237393,1.02138348777367e-07,0.794211116422733,-0.607641919678478 + ,-3.85467540132469e-07,-0.188309388160735,-0.982109756763663,0.525730674836928,-0.794876031157345,-0.302951072992084 + ,-0.525731468908189,-0.794875613767813,-0.302950790124206,-0.850650919148138,0.187234255046484,-0.491259959176012 + ,0.525731576831274,0.794875547342598,0.302950777122798,-0.525730884434197,0.794875888589895,0.302951083329407 + ,0.850650867750242,-0.187234256487049,0.491260047626002,-3.81473211581915e-08,-0.794211182528283,0.607641833276005 + ,-0.850650743254332,-0.187233603145446,0.491260512207145,3.81885808781724e-07,0.188309273968033,0.982109778658927 + + } + LayerElementPolygonGroup: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Index" + PolygonGroup: +2147483647,-2147483648,-2000,3000,1,2,1,2,-1,-2,0,0,50,40,30,20,10,3000,-2000,0 + } + LayerElementColor: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Colors: 1,1,1,1,0,1,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0.0274509803921569,0.0274509803921569 + ,1,1,1,1,1,1,1,1,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "DiffuseUV" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.600000023841858,1,0.5,0.647584021091461,0.699999988079071,0.647584021091461,0.800000011920929,1,0.899999976158142 + ,0.647584021091461,0,1,-0.100000001490116,0.647584021091461,0.100000001490116,0.647584021091461,0.200000002980232 + ,1,0.300000011920929,0.647584021091461,0.400000005960464,1,0.400000005960464,0.352416008710861,0.600000023841858 + ,0.352416008710861,0.800000011920929,0.352416008710861,-0.200000002980232,0.352416008710861,0,0.352416008710861 + ,0.200000002980232,0.352416008710861,0.699999988079071,0,-0.100000001490116,0,0.100000001490116,0,0.300000011920929 + ,0,0.5,0 + UVIndex: 0,1,2,3,2,4,5,6,7,8,7,9,10,9,1,1,11,12,2,12,13,6,14,15,7,15,16,9,16,11,12,2,1,13,4,2,15,7,6,16,9,7,11,1,9,17 + ,13,12,18,15,14,19,16,15,20,11,16,21,12,11 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + LayerElementEdgeCrease: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementTexture: 0 { + Version: 101 + Name: "Diffuse Layer" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Translucent" + TextureAlpha: 1 + TextureId: -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementPolygonGroup" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::20 Sided_ncl1_1" + } + Model: "Model::PolyMesh3D1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + Property: "Morph", "Number", "AN",0 + Property: "Back", "Number", "AN",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: -1.5530584107637e-07,2.82330012321472,0.25,-1.30279982089996,2.82330012321472,0,-0.444710940122604,3.02039003372192 + ,0,-0.444710940122604,2.62620496749878,0,-0.651400148868561,1.95726037025452,0,-1.5530584107637e-07,2.42910432815552 + ,0,0.651399910449982,1.95726037025452,0,0.44471064209938,2.62621021270752,0,1.30279982089996,2.82330012321472,0,0.44471064209938 + ,3.02039003372192,0,0.651399910449982,3.68934059143066,0,-1.5530584107637e-07,3.21748495101929,0,-0.651400148868561 + ,3.68933486938477,0,-1.5530584107637e-07,2.82329511642456,-0.25 + PolygonVertexIndex: 0,2,-2,3,0,-2,4,0,-4,5,0,-5,6,0,-6,0,6,-8,8,0,-8,0,8,-10,10,0,-10,0,10,-12,12,0,-12,0,12,-3,2,13,-2,13,3,-2,13,4,-4 + ,13,5,-5,13,6,-6,6,13,-8,13,8,-8,8,13,-10,13,10,-10,10,13,-12,13,12,-12,12,13,-3 + Edges: 0,1,2,3,5,6,8,9,11,12,14,16,17,18,20,22,23,24,26,28,29,30,32,34,36,37,39,42,45,48,52,54,58,60,64,66 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: 0,0,1,-1,0,2.81650199299197e-16,-0.799169337173009,0.601105956122731,-6.0192227739297e-06,-0.799171006581211 + ,-0.601103736640975,6.01920054876596e-06,-0.405196479131449,-0.914229628274904,9.15471181542992e-06,0,-0.999999999949864 + ,1.00135803217636e-05,0.405205482104045,-0.914225638006844,9.1546718589237e-06,0.799170900891885,-0.60110387715554 + ,6.01920195602474e-06,1,0,0,0.799171139377341,0.601103560087687,-6.01919878093787e-06,0.405186637527057,0.91423399011725 + ,-9.15475549368035e-06,-4.39211363030523e-06,0.999999999940219,-1.0013580321667e-05,-0.405186647113659,0.914233985868487 + ,-9.15475545077152e-06,0,0,-1 + } + LayerElementPolygonGroup: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Index" + PolygonGroup: 15349,15349,15349,15349,15349,15349,15349,15349,15349,15349,15349,15349,9598,9598,9598,9598,9598,9598,9598,9598 + ,9598,9598,9598,9598 + } + LayerElementColor: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Colors: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + ,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "DiffuseUV" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.499994963407516,0.234738901257515,0.329321622848511,0.181317999958992,0,0.234738901257515,0.329321622848511 + ,0.288161247968674,0.249997407197952,0.469477623701096,0.499994963407516,0.341585069894791,0.749992549419403 + ,0.469477623701096,0.670668244361877,0.288159817457199,0.999989986419678,0.234738901257515,0.670668244361877 + ,0.181317999958992,0.749992549419403,0,0.499994963407516,0.127895727753639,0.249997407197952,1.55095153786533e-06 + ,0.499994963407516,0.234740257263184 + UVIndex: 0,1,2,3,0,2,4,0,3,5,0,4,6,0,5,0,6,7,8,0,7,0,8,9,10,0,9,0,10,11,12,0,11,0,12,1,1,13,2,13,3,2,13,4,3,13,5,4,13 + ,6,5,6,13,7,13,8,7,8,13,9,13,10,9,10,13,11,13,12,11,12,13,1 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + LayerElementEdgeCrease: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementTexture: 0 { + Version: 101 + Name: "Diffuse Layer" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Translucent" + TextureAlpha: 1 + TextureId: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementPolygonGroup" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Shape: "Morph" { + Indexes: 13 + Vertices: -6.94987392080293e-08,0.0223557949066162,-0.943415522575378 + Normals: 0,0,1 + } + Shape: "Back" { + Indexes: 0 + Vertices: 6.5785819458597e-08,0.0109646320343018,0.841829180717468 + Normals: 0,0,-1 + } + Shape: "Morph" { + Indexes: 13 + Vertices: -6.94987392080293e-08,0.0223557949066162,-0.943415522575378 + Normals: 0,0,2 + } + Shape: "Back" { + Indexes: 0 + Vertices: 6.5785819458597e-08,0.0109646320343018,0.841829180717468 + Normals: 0,0,-2 + } + NodeAttributeName: "Geometry::PolyMesh3D1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\zbrush_d20_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\zbrush_d20_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "" + Property: "Original|ApplicationName", "KString", "", "" + Property: "Original|ApplicationVersion", "KString", "", "" + Property: "Original|DateTime_GMT", "DateTime", "", "" + Property: "Original|FileName", "KString", "", "" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "" + Property: "LastSaved|ApplicationName", "KString", "", "" + Property: "LastSaved|ApplicationVersion", "KString", "", "" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "" + } + } + Material: "Material::PolyMesh3D1_ncl1_2", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0.5,0.5,0.5 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",1 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",0 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "SpecularColor", "Color", "A",0,0,0 + Property: "SpecularFactor", "Number", "A",1 + Property: "ShininessExponent", "Number", "A",0 + Property: "ReflectionColor", "Color", "A",0,0,0 + Property: "ReflectionFactor", "Number", "A",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0.5,0.5,0.5 + Property: "Diffuse", "Vector3D", "",0.5,0.5,0.5 + Property: "Specular", "Vector3D", "",0,0,0 + Property: "Shininess", "double", "",0 + Property: "Opacity", "double", "",1 + Property: "Reflectivity", "double", "",0 + } + } + Material: "Material::20 Sided_ncl1_2", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0.5,0.5,0.5 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",1 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",0 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "SpecularColor", "Color", "A",0,0,0 + Property: "SpecularFactor", "Number", "A",1 + Property: "ShininessExponent", "Number", "A",0 + Property: "ReflectionColor", "Color", "A",0,0,0 + Property: "ReflectionFactor", "Number", "A",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0.5,0.5,0.5 + Property: "Diffuse", "Vector3D", "",0.5,0.5,0.5 + Property: "Specular", "Vector3D", "",0,0,0 + Property: "Shininess", "double", "",0 + Property: "Opacity", "double", "",1 + Property: "Reflectivity", "double", "",0 + } + } + Video: "Video::Diffuse Texture", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + Property: "RelPath", "KString", "", "PolyMesh3D1_TXTR.tga" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + RelativeFilename: "PolyMesh3D1_TXTR.tga" + } + Texture: "Texture::Diffuse Texture", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Diffuse Texture" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::Diffuse Texture" + FileName: "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + RelativeFilename: "PolyMesh3D1_TXTR.tga" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",-1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",0 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",0 + Property: "TimeSpanStop", "KTime", "",46186158000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::20 Sided", "Model::Scene" + Connect: "OO", "Model::PolyMesh3D1", "Model::Scene" + Connect: "OO", "Material::20 Sided_ncl1_2", "Model::20 Sided" + Connect: "OO", "Material::PolyMesh3D1_ncl1_2", "Model::PolyMesh3D1" + Connect: "OO", "Texture::Diffuse Texture", "Model::PolyMesh3D1" + Connect: "OO", "Video::Diffuse Texture", "Texture::Diffuse Texture" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Default animation" { + FileName: "Default_animation.tak" + LocalTime: 0,46186158000 + ReferenceTime: 0,46186158000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "30" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 141120000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_face_groups_0_obj.obj b/modules/ufbx/data/synthetic_face_groups_0_obj.obj new file mode 100644 index 0000000..66aa494 --- /dev/null +++ b/modules/ufbx/data/synthetic_face_groups_0_obj.obj @@ -0,0 +1,24 @@ +v -1 -1 -1 +v +1 -1 -1 +v -1 +1 -1 +v +1 +1 -1 +v -1 -1 +1 +v +1 -1 +1 +v -1 +1 +1 +v +1 +1 +1 + +usemtl A +o Cube +f 3 4 8 7 +g Front +f 1 2 4 3 +g Sides +f 1 3 7 5 +usemtl B +g Back +f 5 6 8 7 +g Sides +f 2 4 8 6 +g +f 1 2 6 5 + diff --git a/modules/ufbx/data/synthetic_filename_mtl_0_obj.mtl b/modules/ufbx/data/synthetic_filename_mtl_0_obj.mtl new file mode 100644 index 0000000..c18d4d0 --- /dev/null +++ b/modules/ufbx/data/synthetic_filename_mtl_0_obj.mtl @@ -0,0 +1,8 @@ + +newmtl Material +Ka 1.000000 0.000000 0.000000 +Kd 0.000000 1.000000 0.000000 +Ks 0.000000 0.000000 1.000000 + +newmtl Other + diff --git a/modules/ufbx/data/synthetic_filename_mtl_0_obj.obj b/modules/ufbx/data/synthetic_filename_mtl_0_obj.obj new file mode 100644 index 0000000..51a984d --- /dev/null +++ b/modules/ufbx/data/synthetic_filename_mtl_0_obj.obj @@ -0,0 +1,60 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib materials.mtl + +g default +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +s off +g pCube1 +usemtl Material +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/5 4/4/6 6/6/7 5/5/8 +f 5/5/9 6/6/10 8/8/11 7/7/12 +f 7/7/13 8/8/14 2/10/15 1/9/16 +f 2/2/17 8/11/18 6/12/19 4/4/20 +f 7/13/21 1/1/22 3/3/23 5/14/24 diff --git a/modules/ufbx/data/synthetic_geometric_squish.obj b/modules/ufbx/data/synthetic_geometric_squish.obj new file mode 100644 index 0000000..f51a1ad --- /dev/null +++ b/modules/ufbx/data/synthetic_geometric_squish.obj @@ -0,0 +1,264 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v 0.270598 -0.009239 -0.270598 +v 0.000000 -0.009239 -0.382683 +v -0.270598 -0.009239 -0.270598 +v -0.382683 -0.009239 0.000000 +v -0.270598 -0.009239 0.270598 +v 0.000000 -0.009239 0.382683 +v 0.270598 -0.009239 0.270598 +v 0.382683 -0.009239 0.000000 +v 0.500000 -0.007071 -0.500000 +v 0.000000 -0.007071 -0.707107 +v -0.500000 -0.007071 -0.500000 +v -0.707107 -0.007071 0.000000 +v -0.500000 -0.007071 0.500000 +v 0.000000 -0.007071 0.707107 +v 0.500000 -0.007071 0.500000 +v 0.707107 -0.007071 0.000000 +v 0.653281 -0.003827 -0.653281 +v 0.000000 -0.003827 -0.923879 +v -0.653281 -0.003827 -0.653281 +v -0.923879 -0.003827 0.000000 +v -0.653281 -0.003827 0.653281 +v 0.000000 -0.003827 0.923879 +v 0.653281 -0.003827 0.653281 +v 0.923880 -0.003827 0.000000 +v 0.707107 0.000000 -0.707107 +v 0.000000 0.000000 -1.000000 +v -0.707107 0.000000 -0.707107 +v -1.000000 0.000000 0.000000 +v -0.707107 0.000000 0.707107 +v 0.000000 0.000000 1.000000 +v 0.707107 0.000000 0.707107 +v 1.000000 0.000000 0.000000 +v 0.653281 0.003827 -0.653281 +v 0.000000 0.003827 -0.923879 +v -0.653281 0.003827 -0.653281 +v -0.923879 0.003827 0.000000 +v -0.653281 0.003827 0.653281 +v 0.000000 0.003827 0.923879 +v 0.653281 0.003827 0.653281 +v 0.923880 0.003827 0.000000 +v 0.500000 0.007071 -0.500000 +v 0.000000 0.007071 -0.707107 +v -0.500000 0.007071 -0.500000 +v -0.707107 0.007071 0.000000 +v -0.500000 0.007071 0.500000 +v 0.000000 0.007071 0.707107 +v 0.500000 0.007071 0.500000 +v 0.707107 0.007071 0.000000 +v 0.270598 0.009239 -0.270598 +v 0.000000 0.009239 -0.382683 +v -0.270598 0.009239 -0.270598 +v -0.382683 0.009239 0.000000 +v -0.270598 0.009239 0.270598 +v 0.000000 0.009239 0.382683 +v 0.270598 0.009239 0.270598 +v 0.382683 0.009239 0.000000 +v 0.000000 -0.010000 0.000000 +v 0.000000 0.010000 0.000000 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.250000 0.125000 +vt 0.375000 0.125000 +vt 0.500000 0.125000 +vt 0.625000 0.125000 +vt 0.750000 0.125000 +vt 0.875000 0.125000 +vt 1.000000 0.125000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.250000 0.250000 +vt 0.375000 0.250000 +vt 0.500000 0.250000 +vt 0.625000 0.250000 +vt 0.750000 0.250000 +vt 0.875000 0.250000 +vt 1.000000 0.250000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.250000 0.375000 +vt 0.375000 0.375000 +vt 0.500000 0.375000 +vt 0.625000 0.375000 +vt 0.750000 0.375000 +vt 0.875000 0.375000 +vt 1.000000 0.375000 +vt 0.000000 0.500000 +vt 0.125000 0.500000 +vt 0.250000 0.500000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.750000 0.500000 +vt 0.875000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 0.625000 +vt 0.125000 0.625000 +vt 0.250000 0.625000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.625000 0.625000 +vt 0.750000 0.625000 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 0.000000 0.750000 +vt 0.125000 0.750000 +vt 0.250000 0.750000 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.750000 0.750000 +vt 0.875000 0.750000 +vt 1.000000 0.750000 +vt 0.000000 0.875000 +vt 0.125000 0.875000 +vt 0.250000 0.875000 +vt 0.375000 0.875000 +vt 0.500000 0.875000 +vt 0.625000 0.875000 +vt 0.750000 0.875000 +vt 0.875000 0.875000 +vt 1.000000 0.875000 +vt 0.062500 0.000000 +vt 0.187500 0.000000 +vt 0.312500 0.000000 +vt 0.437500 0.000000 +vt 0.562500 0.000000 +vt 0.687500 0.000000 +vt 0.812500 0.000000 +vt 0.937500 0.000000 +vt 0.062500 1.000000 +vt 0.187500 1.000000 +vt 0.312500 1.000000 +vt 0.437500 1.000000 +vt 0.562500 1.000000 +vt 0.687500 1.000000 +vt 0.812500 1.000000 +vt 0.937500 1.000000 +vn 0.350881 -0.868197 -0.350881 +vn 0.000000 -0.868197 -0.496220 +vn 0.000000 -0.654266 -0.756265 +vn 0.534760 -0.654266 -0.534760 +vn -0.350881 -0.868197 -0.350881 +vn -0.534760 -0.654266 -0.534760 +vn -0.496220 -0.868197 0.000000 +vn -0.756265 -0.654266 0.000000 +vn -0.350881 -0.868197 0.350881 +vn -0.534760 -0.654266 0.534760 +vn -0.000000 -0.868197 0.496220 +vn -0.000000 -0.654266 0.756265 +vn 0.350881 -0.868197 0.350881 +vn 0.534760 -0.654266 0.534760 +vn 0.496220 -0.868197 0.000000 +vn 0.756265 -0.654266 0.000000 +vn 0.000000 -0.349894 -0.936789 +vn 0.662410 -0.349894 -0.662410 +vn -0.662410 -0.349894 -0.662410 +vn -0.936789 -0.349894 0.000000 +vn -0.662410 -0.349894 0.662410 +vn -0.000000 -0.349894 0.936789 +vn 0.662410 -0.349894 0.662410 +vn 0.936789 -0.349894 -0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.707107 0.000000 -0.707107 +vn -0.707107 0.000000 -0.707107 +vn -1.000000 0.000000 0.000000 +vn -0.707107 -0.000000 0.707107 +vn -0.000000 0.000000 1.000000 +vn 0.707107 -0.000000 0.707107 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 0.349894 -0.936789 +vn 0.662410 0.349894 -0.662410 +vn -0.662410 0.349894 -0.662410 +vn -0.936789 0.349894 0.000000 +vn -0.662410 0.349894 0.662410 +vn -0.000000 0.349894 0.936789 +vn 0.662410 0.349894 0.662410 +vn 0.936789 0.349894 -0.000000 +vn 0.000000 0.654266 -0.756265 +vn 0.534760 0.654266 -0.534760 +vn -0.534760 0.654266 -0.534760 +vn -0.756265 0.654266 0.000000 +vn -0.534760 0.654266 0.534760 +vn -0.000000 0.654266 0.756265 +vn 0.534760 0.654266 0.534760 +vn 0.756265 0.654266 0.000000 +vn 0.000000 0.868197 -0.496220 +vn 0.350881 0.868197 -0.350881 +vn -0.350881 0.868197 -0.350881 +vn -0.496220 0.868197 0.000000 +vn -0.350881 0.868197 0.350881 +vn -0.000000 0.868197 0.496220 +vn 0.350881 0.868197 0.350881 +vn 0.496220 0.868197 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +s 1 +g pSphere1 +f 1/1/1 2/2/2 10/11/3 9/10/4 +f 2/2/2 3/3/5 11/12/6 10/11/3 +f 3/3/5 4/4/7 12/13/8 11/12/6 +f 4/4/7 5/5/9 13/14/10 12/13/8 +f 5/5/9 6/6/11 14/15/12 13/14/10 +f 6/6/11 7/7/13 15/16/14 14/15/12 +f 7/7/13 8/8/15 16/17/16 15/16/14 +f 8/8/15 1/9/1 9/18/4 16/17/16 +f 9/10/4 10/11/3 18/20/17 17/19/18 +f 10/11/3 11/12/6 19/21/19 18/20/17 +f 11/12/6 12/13/8 20/22/20 19/21/19 +f 12/13/8 13/14/10 21/23/21 20/22/20 +f 13/14/10 14/15/12 22/24/22 21/23/21 +f 14/15/12 15/16/14 23/25/23 22/24/22 +f 15/16/14 16/17/16 24/26/24 23/25/23 +f 16/17/16 9/18/4 17/27/18 24/26/24 +f 17/19/18 18/20/17 26/29/25 25/28/26 +f 18/20/17 19/21/19 27/30/27 26/29/25 +f 19/21/19 20/22/20 28/31/28 27/30/27 +f 20/22/20 21/23/21 29/32/29 28/31/28 +f 21/23/21 22/24/22 30/33/30 29/32/29 +f 22/24/22 23/25/23 31/34/31 30/33/30 +f 23/25/23 24/26/24 32/35/32 31/34/31 +f 24/26/24 17/27/18 25/36/26 32/35/32 +f 25/28/26 26/29/25 34/38/33 33/37/34 +f 26/29/25 27/30/27 35/39/35 34/38/33 +f 27/30/27 28/31/28 36/40/36 35/39/35 +f 28/31/28 29/32/29 37/41/37 36/40/36 +f 29/32/29 30/33/30 38/42/38 37/41/37 +f 30/33/30 31/34/31 39/43/39 38/42/38 +f 31/34/31 32/35/32 40/44/40 39/43/39 +f 32/35/32 25/36/26 33/45/34 40/44/40 +f 33/37/34 34/38/33 42/47/41 41/46/42 +f 34/38/33 35/39/35 43/48/43 42/47/41 +f 35/39/35 36/40/36 44/49/44 43/48/43 +f 36/40/36 37/41/37 45/50/45 44/49/44 +f 37/41/37 38/42/38 46/51/46 45/50/45 +f 38/42/38 39/43/39 47/52/47 46/51/46 +f 39/43/39 40/44/40 48/53/48 47/52/47 +f 40/44/40 33/45/34 41/54/42 48/53/48 +f 41/46/42 42/47/41 50/56/49 49/55/50 +f 42/47/41 43/48/43 51/57/51 50/56/49 +f 43/48/43 44/49/44 52/58/52 51/57/51 +f 44/49/44 45/50/45 53/59/53 52/58/52 +f 45/50/45 46/51/46 54/60/54 53/59/53 +f 46/51/46 47/52/47 55/61/55 54/60/54 +f 47/52/47 48/53/48 56/62/56 55/61/55 +f 48/53/48 41/54/42 49/63/50 56/62/56 +f 2/2/2 1/1/1 57/64/57 +f 3/3/5 2/2/2 57/65/57 +f 4/4/7 3/3/5 57/66/57 +f 5/5/9 4/4/7 57/67/57 +f 6/6/11 5/5/9 57/68/57 +f 7/7/13 6/6/11 57/69/57 +f 8/8/15 7/7/13 57/70/57 +f 1/9/1 8/8/15 57/71/57 +f 49/55/50 50/56/49 58/72/58 +f 50/56/49 51/57/51 58/73/58 +f 51/57/51 52/58/52 58/74/58 +f 52/58/52 53/59/53 58/75/58 +f 53/59/53 54/60/54 58/76/58 +f 54/60/54 55/61/55 58/77/58 +f 55/61/55 56/62/56 58/78/58 +f 56/62/56 49/63/50 58/79/58 diff --git a/modules/ufbx/data/synthetic_geometric_squish_7500_ascii.fbx b/modules/ufbx/data/synthetic_geometric_squish_7500_ascii.fbx new file mode 100644 index 0000000..8e0921b --- /dev/null +++ b/modules/ufbx/data/synthetic_geometric_squish_7500_ascii.fbx @@ -0,0 +1,381 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 7 + Day: 29 + Hour: 23 + Minute: 6 + Second: 6 + Millisecond: 797 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_geometric_squish_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_geometric_squish_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "29/07/2021 20:06:06.796" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_geometric_squish_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "29/07/2021 20:06:06.796" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2040337078096, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2039503368064, "Geometry::", "Mesh" { + Vertices: *174 { + a: 0.27059805393219,-0.923879504203796,-0.27059805393219,0,-0.923879504203796,-0.382683396339417,-0.27059805393219,-0.923879504203796,-0.27059805393219,-0.382683396339417,-0.923879504203796,0,-0.27059805393219,-0.923879504203796,0.27059805393219,0,-0.923879504203796,0.382683426141739,0.27059805393219,-0.923879504203796,0.27059805393219,0.382683455944061,-0.923879504203796,0,0.499999940395355,-0.70710676908493,-0.499999940395355,0,-0.70710676908493,-0.707106709480286,-0.499999940395355,-0.70710676908493,-0.499999940395355,-0.707106709480286,-0.70710676908493,0,-0.499999940395355,-0.70710676908493,0.499999940395355,0,-0.70710676908493,0.707106709480286,0.499999970197678,-0.70710676908493,0.499999970197678,0.70710676908493,-0.70710676908493,0,0.653281390666962,-0.382683426141739,-0.653281390666962,0,-0.382683426141739,-0.923879384994507,-0.653281390666962,-0.382683426141739,-0.653281390666962,-0.923879384994507,-0.382683426141739,0,-0.653281390666962,-0.382683426141739,0.653281390666962,0,-0.382683426141739,0.923879444599152,0.653281450271606,-0.382683426141739,0.653281450271606,0.923879504203796,-0.382683426141739,0,0.707106709480286,0,-0.707106709480286,0,0,-0.99999988079071,-0.707106709480286,0,-0.707106709480286,-0.99999988079071,0,0,-0.707106709480286,0,0.707106709480286,0,0,0.999999940395355,0.70710676908493,0,0.70710676908493,1,0,0,0.653281390666962,0.382683426141739,-0.653281390666962,0,0.382683426141739,-0.923879384994507,-0.653281390666962,0.382683426141739,-0.653281390666962,-0.923879384994507,0.382683426141739,0,-0.653281390666962,0.382683426141739,0.653281390666962,0,0.382683426141739,0.923879444599152,0.653281450271606,0.382683426141739,0.653281450271606,0.923879504203796,0.382683426141739,0,0.499999940395355,0.70710676908493,-0.499999940395355,0,0.70710676908493,-0.707106709480286,-0.499999940395355,0.70710676908493,-0.499999940395355,-0.707106709480286,0.70710676908493,0,-0.499999940395355,0.70710676908493,0.499999940395355,0,0.70710676908493,0.707106709480286,0.499999970197678,0.70710676908493,0.499999970197678, +0.70710676908493,0.70710676908493,0,0.27059805393219,0.923879504203796,-0.27059805393219,0,0.923879504203796,-0.382683396339417,-0.27059805393219,0.923879504203796,-0.27059805393219,-0.382683396339417,0.923879504203796,0,-0.27059805393219,0.923879504203796,0.27059805393219,0,0.923879504203796,0.382683426141739,0.27059805393219,0.923879504203796,0.27059805393219,0.382683455944061,0.923879504203796,0,0,-1,0,0,1,0 + } + PolygonVertexIndex: *240 { + a: 0,1,9,-9,1,2,10,-10,2,3,11,-11,3,4,12,-12,4,5,13,-13,5,6,14,-14,6,7,15,-15,7,0,8,-16,8,9,17,-17,9,10,18,-18,10,11,19,-19,11,12,20,-20,12,13,21,-21,13,14,22,-22,14,15,23,-23,15,8,16,-24,16,17,25,-25,17,18,26,-26,18,19,27,-27,19,20,28,-28,20,21,29,-29,21,22,30,-30,22,23,31,-31,23,16,24,-32,24,25,33,-33,25,26,34,-34,26,27,35,-35,27,28,36,-36,28,29,37,-37,29,30,38,-38,30,31,39,-39,31,24,32,-40,32,33,41,-41,33,34,42,-42,34,35,43,-43,35,36,44,-44,36,37,45,-45,37,38,46,-46,38,39,47,-47,39,32,40,-48,40,41,49,-49,41,42,50,-50,42,43,51,-51,43,44,52,-52,44,45,53,-53,45,46,54,-54,46,47,55,-55,47,40,48,-56,1,0,-57,2,1,-57,3,2,-57,4,3,-57,5,4,-57,6,5,-57,7,6,-57,0,7,-57,48,49,-58,49,50,-58,50,51,-58,51,52,-58,52,53,-58,53,54,-58,54,55,-58,55,48,-58 + } + Edges: *120 { + a: 0,4,8,12,16,20,24,28,2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,3,1,5,9,13,17,21,25,35,33,37,41,45,49,53,57,67,65,69,73,77,81,85,89,99,97,101,105,109,113,117,121,131,129,133,137,141,145,149,153,163,161,165,169,173,177,181,185,193,194,197,200,203,206,209,212,218,217,220,223,226,229,232,235 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *174 { + a: 0.350880682468414,-0.868196785449982,-0.350880652666092,0,-0.868196666240692,-0.496220320463181,-0.350880682468414,-0.868196666240692,-0.350880652666092,-0.496220380067825,-0.868196666240692,1.08447064661732e-08,-0.350880742073059,-0.868196666240692,0.350880652666092,-3.25341176221627e-08,-0.868196666240692,0.496220141649246,0.350880682468414,-0.868196666240692,0.350880682468414,0.496220290660858,-0.868196666240692,8.67576446239582e-08,0.534760057926178,-0.654265582561493,-0.534759998321533,1.28618315997642e-08,-0.654265522956848,-0.756264865398407,-0.534759998321533,-0.654265642166138,-0.534759998321533,-0.756264805793762,-0.654265642166138,1.28618315997642e-08,-0.534759998321533,-0.654265701770782,0.534759998321533,-5.14473263990567e-08,-0.654265701770782,0.756264805793762,0.534759998321533,-0.654265642166138,0.534759998321533,0.756264925003052,-0.654265642166138,1.2861833376121e-08,0.662410020828247,-0.349893808364868,-0.662410140037537,1.02324566597645e-08,-0.349893808364868,-0.936789333820343,-0.662410020828247,-0.349893808364868,-0.662410080432892,-0.936789333820343,-0.349893838167191,1.02324584361213e-08,-0.662410080432892,-0.349893808364868,0.662410080432892,-9.20921152669507e-08,-0.349893897771835,0.936789333820343,0.662410080432892,-0.34989395737648,0.662410080432892,0.936789333820343,-0.349893927574158,-6.13947435113005e-08,0.70710676908493,0,-0.707106828689575,0,4.78306194651168e-09,-0.999999940395355,-0.70710676908493,0,-0.707106828689575,-1,0,0,-0.70710676908493,-4.78306194651168e-09,0.70710676908493,-9.56612353775199e-08,0,1,0.70710676908493,-9.56612389302336e-09,0.707106828689575,1,0,-3.82644955720934e-08,0.662410080432892,0.349893808364868,-0.662410199642181,0,0.349893838167191,-0.936789333820343,-0.662410080432892,0.349893808364868,-0.662410080432892,-0.936789333820343,0.349893838167191,0,-0.662410080432892,0.349893808364868,0.662410140037537,-8.18596603835431e-08,0.349893927574158,0.936789333820343,0.662410080432892,0.34989395737648,0.662410140037537,0.936789333820343,0.349893927574158,-5.11622886278928e-08, +0.534759998321533,0.654265582561493,-0.534759998321533,0,0.654265642166138,-0.756264925003052,-0.534759998321533,0.654265642166138,-0.534759998321533,-0.756264865398407,0.654265642166138,1.28618315997642e-08,-0.534759998321533,0.654265642166138,0.534759998321533,-2.57236631995283e-08,0.654265761375427,0.756264805793762,0.534759879112244,0.654265701770782,0.534759998321533,0.756264925003052,0.654265642166138,1.92927505082707e-08,0.350880682468414,0.868196725845337,-0.35088062286377,0,0.868196666240692,-0.496220231056213,-0.350880712270737,0.868196666240692,-0.350880593061447,-0.496220380067825,0.868196666240692,3.25341176221627e-08,-0.350880682468414,0.868196666240692,0.35088062286377,-2.16894111559895e-08,0.868196666240692,0.496220141649246,0.350880682468414,0.868196666240692,0.350880682468414,0.496220290660858,0.868196666240692,8.67576446239582e-08,1.16875567002239e-08,-1,-5.84377835011196e-09,1.16875567002239e-08,1,-5.84377835011196e-09 + } + NormalsW: *58 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *158 { + a: 0,0.125,0.125,0.125,0.25,0.125,0.375,0.125,0.5,0.125,0.625,0.125,0.75,0.125,0.875,0.125,1,0.125,0,0.25,0.125,0.25,0.25,0.25,0.375,0.25,0.5,0.25,0.625,0.25,0.75,0.25,0.875,0.25,1,0.25,0,0.375,0.125,0.375,0.25,0.375,0.375,0.375,0.5,0.375,0.625,0.375,0.75,0.375,0.875,0.375,1,0.375,0,0.5,0.125,0.5,0.25,0.5,0.375,0.5,0.5,0.5,0.625,0.5,0.75,0.5,0.875,0.5,1,0.5,0,0.625,0.125,0.625,0.25,0.625,0.375,0.625,0.5,0.625,0.625,0.625,0.75,0.625,0.875,0.625,1,0.625,0,0.75,0.125,0.75,0.25,0.75,0.375,0.75,0.5,0.75,0.625,0.75,0.75,0.75,0.875,0.75,1,0.75,0,0.875,0.125,0.875,0.25,0.875,0.375,0.875,0.5,0.875,0.625,0.875,0.75,0.875,0.875,0.875,1,0.875,0.0625,0,0.1875,0,0.3125,0,0.4375,0,0.5625,0,0.6875,0,0.8125,0,0.9375,0,0.0625,1,0.1875,1,0.3125,1,0.4375,1,0.5625,1,0.6875,1,0.8125,1,0.9375,1 + } + UVIndex: *240 { + a: 0,1,10,9,1,2,11,10,2,3,12,11,3,4,13,12,4,5,14,13,5,6,15,14,6,7,16,15,7,8,17,16,9,10,19,18,10,11,20,19,11,12,21,20,12,13,22,21,13,14,23,22,14,15,24,23,15,16,25,24,16,17,26,25,18,19,28,27,19,20,29,28,20,21,30,29,21,22,31,30,22,23,32,31,23,24,33,32,24,25,34,33,25,26,35,34,27,28,37,36,28,29,38,37,29,30,39,38,30,31,40,39,31,32,41,40,32,33,42,41,33,34,43,42,34,35,44,43,36,37,46,45,37,38,47,46,38,39,48,47,39,40,49,48,40,41,50,49,41,42,51,50,42,43,52,51,43,44,53,52,45,46,55,54,46,47,56,55,47,48,57,56,48,49,58,57,49,50,59,58,50,51,60,59,51,52,61,60,52,53,62,61,1,0,63,2,1,64,3,2,65,4,3,66,5,4,67,6,5,68,7,6,69,8,7,70,54,55,71,55,56,72,56,57,73,57,58,74,58,59,75,59,60,76,60,61,77,61,62,78 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2039067101744, "Model::pSphere1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,0.01,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2040323152000, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2039499629600, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2039497023904, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pSphere1, Model::RootNode + C: "OO",2039067101744,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2039497023904,2039499629600 + + ;Geometry::, Model::pSphere1 + C: "OO",2039503368064,2039067101744 + + ;Material::lambert1, Model::pSphere1 + C: "OO",2040323152000,2039067101744 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_geometric_transform.obj b/modules/ufbx/data/synthetic_geometric_transform.obj new file mode 100644 index 0000000..b43731b --- /dev/null +++ b/modules/ufbx/data/synthetic_geometric_transform.obj @@ -0,0 +1,115 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib synthetic_geometric_transform.mtl +g default +v 1.637900 -1.751601 -0.818349 +v 1.011202 1.265903 -1.029614 +v -0.956283 -1.100195 0.588131 +v -0.782355 1.621308 0.441113 +v -1.968758 -1.952266 -0.746140 +v -3.410567 -0.590524 -3.022427 +v -0.119069 -3.158759 -3.989986 +v -1.706136 -0.658894 -4.663503 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.574942 0.322936 0.751767 +vn 0.574942 0.322936 0.751767 +vn 0.574942 0.322936 0.751767 +vn 0.574942 0.322936 0.751767 +vn -0.818680 0.083016 0.568218 +vn -0.818680 0.083016 0.568218 +vn -0.818680 0.083016 0.568218 +vn -0.818680 0.083016 0.568218 +vn -0.666859 -0.630422 -0.397325 +vn -0.666859 -0.630422 -0.397325 +vn -0.666859 -0.630422 -0.397325 +vn -0.666859 -0.630422 -0.397325 +vn 0.814160 0.145069 -0.562226 +vn 0.814160 0.145069 -0.562226 +vn 0.814160 0.145069 -0.562226 +vn 0.814160 0.145069 -0.562226 +vn -0.222582 0.920506 -0.321132 +vn -0.222582 0.920506 -0.321132 +vn -0.222582 0.920506 -0.321132 +vn -0.222582 0.920506 -0.321132 +vn -0.023091 -0.924012 0.381665 +vn -0.023091 -0.924012 0.381665 +vn -0.023091 -0.924012 0.381665 +vn -0.023091 -0.924012 0.381665 +s off +g Parent +usemtl ParentSG +f 1/1/1 2/2/2 4/4/3 3/3/4 +f 3/3/5 4/4/6 6/6/7 5/5/8 +f 5/5/9 6/6/10 8/8/11 7/7/12 +f 7/7/13 8/8/14 2/10/15 1/9/16 +f 2/2/17 8/11/18 6/12/19 4/4/20 +f 7/13/21 1/1/22 3/3/23 5/14/24 +g default +v 0.720448 -1.686887 0.440369 +v 1.615625 -1.088665 0.215008 +v 0.156632 -0.699079 0.822924 +v 1.051810 -0.100857 0.597563 +v -0.287994 -0.486950 -0.380117 +v 0.607183 0.111272 -0.605479 +v 0.275822 -1.474758 -0.762672 +v 1.170999 -0.876536 -0.988034 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.342020 -0.163176 0.925417 +vn 0.342020 -0.163176 0.925417 +vn 0.342020 -0.163176 0.925417 +vn 0.342020 -0.163176 0.925417 +vn -0.469846 0.823173 0.318796 +vn -0.469846 0.823173 0.318796 +vn -0.469846 0.823173 0.318796 +vn -0.469846 0.823173 0.318796 +vn -0.342020 0.163176 -0.925417 +vn -0.342020 0.163176 -0.925417 +vn -0.342020 0.163176 -0.925417 +vn -0.342020 0.163176 -0.925417 +vn 0.469846 -0.823173 -0.318796 +vn 0.469846 -0.823173 -0.318796 +vn 0.469846 -0.823173 -0.318796 +vn 0.469846 -0.823173 -0.318796 +vn 0.813798 0.543838 -0.204874 +vn 0.813798 0.543838 -0.204874 +vn 0.813798 0.543838 -0.204874 +vn 0.813798 0.543838 -0.204874 +vn -0.813798 -0.543838 0.204874 +vn -0.813798 -0.543838 0.204874 +vn -0.813798 -0.543838 0.204874 +vn -0.813798 -0.543838 0.204874 +s off +g Child +usemtl ParentSG +f 9/15/25 10/16/26 12/18/27 11/17/28 +f 11/17/29 12/18/30 14/20/31 13/19/32 +f 13/19/33 14/20/34 16/22/35 15/21/36 +f 15/21/37 16/22/38 10/24/39 9/23/40 +f 10/16/41 16/25/42 14/26/43 12/18/44 +f 15/27/45 9/15/46 11/17/47 13/28/48 diff --git a/modules/ufbx/data/synthetic_geometric_transform_7500_ascii.fbx b/modules/ufbx/data/synthetic_geometric_transform_7500_ascii.fbx new file mode 100644 index 0000000..80e7aaa --- /dev/null +++ b/modules/ufbx/data/synthetic_geometric_transform_7500_ascii.fbx @@ -0,0 +1,469 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 7 + Day: 29 + Hour: 22 + Minute: 11 + Second: 31 + Millisecond: 363 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_geometric_transform_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_geometric_transform_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "29/07/2021 19:11:31.362" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_geometric_transform_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "29/07/2021 19:11:31.362" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\geometric_cube.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2701418716288, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 2 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 2 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2701438938608, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.676894247531891,-0.361003905534744,0.266383647918701,0.5,-0.174889624118805,0.5,-0.499999940395355,0.5,0.192616611719131,0.5,0.5,0.5,-0.5,0.5,-0.192616611719131,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.640591740608215,-0.174889624118805,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: -0.246525511145592,0.0748007670044899,0.966245293617249,-0.246525511145592,0.0748007744550705,0.966245353221893,-0.246525511145592,0.0748007670044899,0.966245353221893,-0.246525511145592,0.0748007744550705,0.966245353221893,0,1,0,0,1,0,0,1,0,0,1,0,-0.164657920598984,0.164657920598984,-0.972509860992432,-0.164657920598984,0.164657920598984,-0.972509920597076,-0.164657920598984,0.164657920598984,-0.972509920597076,-0.164657935500145,0.164657920598984,-0.972509860992432,0.203154042363167,-0.972598910331726,0.113047905266285,0.203154027462006,-0.972598850727081,0.113047897815704,0.203154042363167,-0.972598910331726,0.113047912716866,0.203154027462006,-0.972598791122437,0.113047897815704,0.992196977138519,0.103346310555935,0.0697473511099815,0.992196977138519,0.103346310555935,0.0697473511099815,0.992196977138519,0.103346310555935,0.0697473511099815,0.992196977138519,0.103346310555935,0.0697473511099815,-0.979839682579041,0.113753996789455,-0.164238050580025,-0.97983980178833,0.113754011690617,-0.164238095283508,-0.979839742183685,0.113754011690617,-0.164238065481186,-0.979839742183685,0.113754011690617,-0.164238065481186 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2701438932784, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2701003585232, "Model::Parent", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",5 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0.1,0.2,0.3 + P: "Lcl Rotation", "Lcl Rotation", "", "A",10,20,30 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1.1,1.2,1.3 + P: "currentUVSet", "KString", "", "U", "map1" + P: "GeometricTranslation", "Vector3D", "Vector", "",-0.5,-1.0,-1.5 + P: "GeometricRotation", "Vector3D", "Vector", "",20,40,60 + P: "GeometricScaling", "Vector3D", "Vector", "",2,3,4 + P: "notes", "KString", "", "U", " " + } + Shading: T + Culling: "CullingOff" + } + Model: 2701003580592, "Model::Child", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,-1,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2701713511664, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2701961673184, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2701718339360, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Parent, Model::RootNode + C: "OO",2701003585232,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2701718339360,2701961673184 + + ;Geometry::, Model::Parent + C: "OO",2701438938608,2701003585232 + + ;Material::lambert1, Model::Parent + C: "OO",2701713511664,2701003585232 + + ;Model::Child, Model::Parent + C: "OO",2701003580592,2701003585232 + + ;Geometry::, Model::Child + C: "OO",2701438932784,2701003580592 + + ;Material::lambert1, Model::Child + C: "OO",2701713511664,2701003580592 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_geometry_transform_camera_7500_ascii.fbx b/modules/ufbx/data/synthetic_geometry_transform_camera_7500_ascii.fbx new file mode 100644 index 0000000..f1721d4 --- /dev/null +++ b/modules/ufbx/data/synthetic_geometry_transform_camera_7500_ascii.fbx @@ -0,0 +1,437 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 9 + Hour: 1 + Minute: 13 + Second: 13 + Millisecond: 153 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\max_geometry_transform_camera_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\max_geometry_transform_camera_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "3ds Max" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "08/12/2022 23:13:13.153" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\max_geometry_transform_camera_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "3ds Max" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "08/12/2022 23:13:13.153" + P: "Original|ApplicationActiveProject", "KString", "", "", "C:\Users\Datacube\Documents\3ds Max 2023" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",2 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",1 + P: "FrontAxisSign", "int", "Integer", "",-1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",2 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",2.54 + P: "OriginalUnitScaleFactor", "double", "Number", "",2.54 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",6 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",153953860000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1845584178992, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 7 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 1 + PropertyTemplate: "FbxCamera" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Position", "Vector", "", "A",0,0,0 + P: "UpVector", "Vector", "", "A",0,1,0 + P: "InterestPosition", "Vector", "", "A",0,0,0 + P: "Roll", "Roll", "", "A",0 + P: "OpticalCenterX", "OpticalCenterX", "", "A",0 + P: "OpticalCenterY", "OpticalCenterY", "", "A",0 + P: "BackgroundColor", "Color", "", "A",0.63,0.63,0.63 + P: "TurnTable", "Number", "", "A",0 + P: "DisplayTurnTableIcon", "bool", "", "",0 + P: "UseMotionBlur", "bool", "", "",0 + P: "UseRealTimeMotionBlur", "bool", "", "",1 + P: "Motion Blur Intensity", "Number", "", "A",1 + P: "AspectRatioMode", "enum", "", "",0 + P: "AspectWidth", "double", "Number", "",320 + P: "AspectHeight", "double", "Number", "",200 + P: "PixelAspectRatio", "double", "Number", "",1 + P: "FilmOffsetX", "Number", "", "A",0 + P: "FilmOffsetY", "Number", "", "A",0 + P: "FilmWidth", "double", "Number", "",0.816 + P: "FilmHeight", "double", "Number", "",0.612 + P: "FilmAspectRatio", "double", "Number", "",1.33333333333333 + P: "FilmSqueezeRatio", "double", "Number", "",1 + P: "FilmFormatIndex", "enum", "", "",0 + P: "PreScale", "Number", "", "A",1 + P: "FilmTranslateX", "Number", "", "A",0 + P: "FilmTranslateY", "Number", "", "A",0 + P: "FilmRollPivotX", "Number", "", "A",0 + P: "FilmRollPivotY", "Number", "", "A",0 + P: "FilmRollValue", "Number", "", "A",0 + P: "FilmRollOrder", "enum", "", "",0 + P: "ApertureMode", "enum", "", "",2 + P: "GateFit", "enum", "", "",0 + P: "FieldOfView", "FieldOfView", "", "A",25.1149997711182 + P: "FieldOfViewX", "FieldOfViewX", "", "A",40 + P: "FieldOfViewY", "FieldOfViewY", "", "A",40 + P: "FocalLength", "Number", "", "A",34.8932762167263 + P: "CameraFormat", "enum", "", "",0 + P: "UseFrameColor", "bool", "", "",0 + P: "FrameColor", "ColorRGB", "Color", "",0.3,0.3,0.3 + P: "ShowName", "bool", "", "",1 + P: "ShowInfoOnMoving", "bool", "", "",1 + P: "ShowGrid", "bool", "", "",1 + P: "ShowOpticalCenter", "bool", "", "",0 + P: "ShowAzimut", "bool", "", "",1 + P: "ShowTimeCode", "bool", "", "",0 + P: "ShowAudio", "bool", "", "",0 + P: "AudioColor", "Vector3D", "Vector", "",0,1,0 + P: "NearPlane", "double", "Number", "",10 + P: "FarPlane", "double", "Number", "",4000 + P: "AutoComputeClipPanes", "bool", "", "",0 + P: "ViewCameraToLookAt", "bool", "", "",1 + P: "ViewFrustumNearFarPlane", "bool", "", "",0 + P: "ViewFrustumBackPlaneMode", "enum", "", "",2 + P: "BackPlaneDistance", "Number", "", "A",4000 + P: "BackPlaneDistanceMode", "enum", "", "",1 + P: "ViewFrustumFrontPlaneMode", "enum", "", "",2 + P: "FrontPlaneDistance", "Number", "", "A",10 + P: "FrontPlaneDistanceMode", "enum", "", "",1 + P: "LockMode", "bool", "", "",0 + P: "LockInterestNavigation", "bool", "", "",0 + P: "BackPlateFitImage", "bool", "", "",0 + P: "BackPlateCrop", "bool", "", "",0 + P: "BackPlateCenter", "bool", "", "",1 + P: "BackPlateKeepRatio", "bool", "", "",1 + P: "BackgroundAlphaTreshold", "double", "Number", "",0.5 + P: "ShowBackplate", "bool", "", "",1 + P: "BackPlaneOffsetX", "Number", "", "A",0 + P: "BackPlaneOffsetY", "Number", "", "A",0 + P: "BackPlaneRotation", "Number", "", "A",0 + P: "BackPlaneScaleX", "Number", "", "A",1 + P: "BackPlaneScaleY", "Number", "", "A",1 + P: "Background Texture", "object", "", "" + P: "FrontPlateFitImage", "bool", "", "",1 + P: "FrontPlateCrop", "bool", "", "",0 + P: "FrontPlateCenter", "bool", "", "",1 + P: "FrontPlateKeepRatio", "bool", "", "",1 + P: "Foreground Opacity", "double", "Number", "",1 + P: "ShowFrontplate", "bool", "", "",1 + P: "FrontPlaneOffsetX", "Number", "", "A",0 + P: "FrontPlaneOffsetY", "Number", "", "A",0 + P: "FrontPlaneRotation", "Number", "", "A",0 + P: "FrontPlaneScaleX", "Number", "", "A",1 + P: "FrontPlaneScaleY", "Number", "", "A",1 + P: "Foreground Texture", "object", "", "" + P: "DisplaySafeArea", "bool", "", "",0 + P: "DisplaySafeAreaOnRender", "bool", "", "",0 + P: "SafeAreaDisplayStyle", "enum", "", "",1 + P: "SafeAreaAspectRatio", "double", "Number", "",1.33333333333333 + P: "Use2DMagnifierZoom", "bool", "", "",0 + P: "2D Magnifier Zoom", "Number", "", "A",100 + P: "2D Magnifier X", "Number", "", "A",50 + P: "2D Magnifier Y", "Number", "", "A",50 + P: "CameraProjectionType", "enum", "", "",0 + P: "OrthoZoom", "double", "Number", "",1 + P: "UseRealTimeDOFAndAA", "bool", "", "",0 + P: "UseDepthOfField", "bool", "", "",0 + P: "FocusSource", "enum", "", "",0 + P: "FocusAngle", "double", "Number", "",3.5 + P: "FocusDistance", "double", "Number", "",200 + P: "UseAntialiasing", "bool", "", "",0 + P: "AntialiasingIntensity", "double", "Number", "",0.77777 + P: "AntialiasingMethod", "enum", "", "",0 + P: "UseAccumulationBuffer", "bool", "", "",0 + P: "FrameSamplingCount", "int", "Integer", "",7 + P: "FrameSamplingType", "enum", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 2 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + NodeAttribute: 1843844877760, "NodeAttribute::", "Camera" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.341176470588235,0.470588235294118,0.8 + P: "InterestPosition", "Vector", "", "A",0,0,-160 + P: "BackgroundColor", "Color", "", "A",0,0,0 + P: "AspectWidth", "double", "Number", "",1280 + P: "AspectHeight", "double", "Number", "",720 + P: "FilmWidth", "double", "Number", "",1.41732287406921 + P: "FilmHeight", "double", "Number", "",0.797244131565094 + P: "FilmAspectRatio", "double", "Number", "",1.77777774454962 + P: "ApertureMode", "enum", "", "",1 + P: "FieldOfView", "FieldOfView", "", "A",45.0000012522391 + P: "FocalLength", "Number", "", "A",43.4558439883016 + P: "AutoComputeClipPanes", "bool", "", "",1 + } + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0,0,0 + Up: 0,1,0 + LookAt: 0,0,-160 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: 1845594226992, "Model::Camera001", "Camera" { + Version: 232 + Properties70: { + P: "GeometricTranslation", "Vector3D", "Vector", "",10,20,30 + P: "GeometricRotation", "Vector3D", "Vector", "",90,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,2,3 + P: "PostRotation", "Vector3D", "Vector", "",0,-90,0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "MaxHandle", "int", "Integer", "UH",6 + } + Shading: T + Culling: "CullingOff" + } + AnimationStack: 1845588386720, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",153953860000 + P: "ReferenceStop", "KTime", "Time", "",153953860000 + } + } + AnimationCurveNode: 1845583111024, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 1845583111232, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 1845589731568, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Camera001, Model::RootNode + C: "OO",1845594226992,0 + + ;AnimCurveNode::T, Model::RootNode + C: "OP",1845583111024,0, "Lcl Translation" + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1845589731568,1845588386720 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1845583111024,1845589731568 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",1845583111232,1845589731568 + + ;NodeAttribute::, Model::Camera001 + C: "OO",1843844877760,1845594226992 + + ;AnimCurveNode::T, Model::Camera001 + C: "OP",1845583111232,1845594226992, "Lcl Translation" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,153953860000 + ReferenceTime: 0,153953860000 + } +} diff --git a/modules/ufbx/data/synthetic_id_collision_7500_ascii.fbx b/modules/ufbx/data/synthetic_id_collision_7500_ascii.fbx new file mode 100644 index 0000000..c4efbfa --- /dev/null +++ b/modules/ufbx/data/synthetic_id_collision_7500_ascii.fbx @@ -0,0 +1,20428 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 34 + Millisecond: 164 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658664160, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1908558533920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1907292239120, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1907674217712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907680138928, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631740128, "AnimLayer::BaseLayer", "" { + } + +Model:478973,"Model::First",""{} +Model:543226,"Model::A",""{} +Model:550013,"Model::A",""{} +Model:855933,"Model::A",""{} +Model:1057863,"Model::A",""{} +Model:3018902,"Model::A",""{} +Model:3851319,"Model::A",""{} +Model:4006012,"Model::A",""{} +Model:4031939,"Model::A",""{} +Model:4472588,"Model::A",""{} +Model:4733408,"Model::A",""{} +Model:5285050,"Model::A",""{} +Model:5522932,"Model::A",""{} +Model:6670855,"Model::A",""{} +Model:6855350,"Model::A",""{} +Model:7301910,"Model::A",""{} +Model:7370458,"Model::A",""{} +Model:8454867,"Model::A",""{} +Model:9437219,"Model::A",""{} +Model:10136912,"Model::A",""{} +Model:10580769,"Model::A",""{} +Model:10841982,"Model::A",""{} +Model:10901684,"Model::A",""{} +Model:11136125,"Model::A",""{} +Model:12083212,"Model::A",""{} +Model:12197102,"Model::A",""{} +Model:12532597,"Model::A",""{} +Model:13813187,"Model::A",""{} +Model:13941637,"Model::A",""{} +Model:14036994,"Model::A",""{} +Model:14089852,"Model::A",""{} +Model:14207681,"Model::A",""{} +Model:14530775,"Model::A",""{} +Model:14917654,"Model::A",""{} +Model:15171953,"Model::A",""{} +Model:15537042,"Model::A",""{} +Model:17850427,"Model::A",""{} +Model:19808749,"Model::A",""{} +Model:20517695,"Model::A",""{} +Model:21178652,"Model::A",""{} +Model:21432529,"Model::A",""{} +Model:21564892,"Model::A",""{} +Model:22053399,"Model::A",""{} +Model:24355295,"Model::A",""{} +Model:24372693,"Model::A",""{} +Model:24407171,"Model::A",""{} +Model:25218913,"Model::A",""{} +Model:26359854,"Model::A",""{} +Model:27145487,"Model::A",""{} +Model:27343700,"Model::A",""{} +Model:27584631,"Model::A",""{} +Model:27849311,"Model::A",""{} +Model:28862051,"Model::A",""{} +Model:29114447,"Model::A",""{} +Model:30710756,"Model::A",""{} +Model:32417094,"Model::A",""{} +Model:33688388,"Model::A",""{} +Model:33960199,"Model::A",""{} +Model:34995862,"Model::A",""{} +Model:35188263,"Model::A",""{} +Model:35250273,"Model::A",""{} +Model:35272741,"Model::A",""{} +Model:36229022,"Model::A",""{} +Model:36769136,"Model::A",""{} +Model:37322378,"Model::A",""{} +Model:38883892,"Model::A",""{} +Model:39116502,"Model::A",""{} +Model:39147382,"Model::A",""{} +Model:39725491,"Model::A",""{} +Model:40194782,"Model::A",""{} +Model:40794482,"Model::A",""{} +Model:41738973,"Model::A",""{} +Model:41780835,"Model::A",""{} +Model:41962422,"Model::A",""{} +Model:42427395,"Model::A",""{} +Model:43344809,"Model::A",""{} +Model:43587546,"Model::A",""{} +Model:44268968,"Model::A",""{} +Model:44824779,"Model::A",""{} +Model:45096991,"Model::A",""{} +Model:45134048,"Model::A",""{} +Model:45693509,"Model::A",""{} +Model:45838418,"Model::A",""{} +Model:45839703,"Model::A",""{} +Model:46929441,"Model::A",""{} +Model:47420744,"Model::A",""{} +Model:47737209,"Model::A",""{} +Model:50006753,"Model::A",""{} +Model:52281106,"Model::A",""{} +Model:52425774,"Model::A",""{} +Model:52765086,"Model::A",""{} +Model:53018970,"Model::A",""{} +Model:53045168,"Model::A",""{} +Model:53116974,"Model::A",""{} +Model:54067111,"Model::A",""{} +Model:55026311,"Model::A",""{} +Model:55338721,"Model::A",""{} +Model:55525133,"Model::A",""{} +Model:55748485,"Model::A",""{} +Model:57163501,"Model::A",""{} +Model:57358966,"Model::A",""{} +Model:59000125,"Model::A",""{} +Model:59270959,"Model::A",""{} +Model:59402422,"Model::A",""{} +Model:59568596,"Model::A",""{} +Model:59714457,"Model::A",""{} +Model:59824219,"Model::A",""{} +Model:60002442,"Model::A",""{} +Model:61974885,"Model::A",""{} +Model:62118349,"Model::A",""{} +Model:62930092,"Model::A",""{} +Model:62932594,"Model::A",""{} +Model:63110302,"Model::A",""{} +Model:63147227,"Model::A",""{} +Model:63324911,"Model::A",""{} +Model:63584431,"Model::A",""{} +Model:65012365,"Model::A",""{} +Model:65183480,"Model::A",""{} +Model:66385842,"Model::A",""{} +Model:66486765,"Model::A",""{} +Model:68024518,"Model::A",""{} +Model:68661371,"Model::A",""{} +Model:69021615,"Model::A",""{} +Model:69106474,"Model::A",""{} +Model:69247221,"Model::A",""{} +Model:69422507,"Model::A",""{} +Model:69586382,"Model::A",""{} +Model:69881221,"Model::A",""{} +Model:70187504,"Model::A",""{} +Model:72548649,"Model::A",""{} +Model:73601786,"Model::A",""{} +Model:73708290,"Model::A",""{} +Model:74861273,"Model::A",""{} +Model:75203396,"Model::A",""{} +Model:75722602,"Model::A",""{} +Model:76626061,"Model::A",""{} +Model:77090854,"Model::A",""{} +Model:77880317,"Model::A",""{} +Model:78690637,"Model::A",""{} +Model:79743202,"Model::A",""{} +Model:80092780,"Model::A",""{} +Model:80859982,"Model::A",""{} +Model:81010394,"Model::A",""{} +Model:81751972,"Model::A",""{} +Model:82324779,"Model::A",""{} +Model:83318380,"Model::A",""{} +Model:84400375,"Model::A",""{} +Model:85669511,"Model::A",""{} +Model:86187863,"Model::A",""{} +Model:86430917,"Model::A",""{} +Model:87253970,"Model::A",""{} +Model:87387579,"Model::A",""{} +Model:88442621,"Model::A",""{} +Model:88650387,"Model::A",""{} +Model:88657907,"Model::A",""{} +Model:88811744,"Model::A",""{} +Model:89158841,"Model::A",""{} +Model:89164655,"Model::A",""{} +Model:91209890,"Model::A",""{} +Model:91484997,"Model::A",""{} +Model:92902310,"Model::A",""{} +Model:93421318,"Model::A",""{} +Model:93488190,"Model::A",""{} +Model:94674433,"Model::A",""{} +Model:94941219,"Model::A",""{} +Model:95294869,"Model::A",""{} +Model:95440532,"Model::A",""{} +Model:95560766,"Model::A",""{} +Model:95765457,"Model::A",""{} +Model:96114162,"Model::A",""{} +Model:96691075,"Model::A",""{} +Model:97137455,"Model::A",""{} +Model:97237561,"Model::A",""{} +Model:97900141,"Model::A",""{} +Model:98624886,"Model::A",""{} +Model:99121777,"Model::A",""{} +Model:101309336,"Model::A",""{} +Model:101956111,"Model::A",""{} +Model:102762554,"Model::A",""{} +Model:103094634,"Model::A",""{} +Model:103678981,"Model::A",""{} +Model:103757723,"Model::A",""{} +Model:104784399,"Model::A",""{} +Model:104806926,"Model::A",""{} +Model:105244989,"Model::A",""{} +Model:105288449,"Model::A",""{} +Model:105431719,"Model::A",""{} +Model:105706806,"Model::A",""{} +Model:106141179,"Model::A",""{} +Model:106584484,"Model::A",""{} +Model:107054467,"Model::A",""{} +Model:107286700,"Model::A",""{} +Model:107380516,"Model::A",""{} +Model:107720024,"Model::A",""{} +Model:109094706,"Model::A",""{} +Model:109170823,"Model::A",""{} +Model:109188140,"Model::A",""{} +Model:110078854,"Model::A",""{} +Model:111230342,"Model::A",""{} +Model:111528489,"Model::A",""{} +Model:111814690,"Model::A",""{} +Model:111854015,"Model::A",""{} +Model:112084269,"Model::A",""{} +Model:112427875,"Model::A",""{} +Model:112830484,"Model::A",""{} +Model:112990155,"Model::A",""{} +Model:113314833,"Model::A",""{} +Model:113410707,"Model::A",""{} +Model:113572245,"Model::A",""{} +Model:114964887,"Model::A",""{} +Model:116397423,"Model::A",""{} +Model:117516109,"Model::A",""{} +Model:118283417,"Model::A",""{} +Model:118582494,"Model::A",""{} +Model:119100794,"Model::A",""{} +Model:119530361,"Model::A",""{} +Model:121722454,"Model::A",""{} +Model:123429207,"Model::A",""{} +Model:123775628,"Model::A",""{} +Model:125184776,"Model::A",""{} +Model:125672879,"Model::A",""{} +Model:126172822,"Model::A",""{} +Model:126946276,"Model::A",""{} +Model:127160830,"Model::A",""{} +Model:127289727,"Model::A",""{} +Model:129428923,"Model::A",""{} +Model:129740255,"Model::A",""{} +Model:130688502,"Model::A",""{} +Model:131098647,"Model::A",""{} +Model:131885809,"Model::A",""{} +Model:131908660,"Model::A",""{} +Model:132000845,"Model::A",""{} +Model:132056305,"Model::A",""{} +Model:132938949,"Model::A",""{} +Model:133159987,"Model::A",""{} +Model:133307849,"Model::A",""{} +Model:133474781,"Model::A",""{} +Model:133697606,"Model::A",""{} +Model:133976285,"Model::A",""{} +Model:134069870,"Model::A",""{} +Model:135700258,"Model::A",""{} +Model:136156748,"Model::A",""{} +Model:136757334,"Model::A",""{} +Model:137052495,"Model::A",""{} +Model:138154841,"Model::A",""{} +Model:139079410,"Model::A",""{} +Model:139350128,"Model::A",""{} +Model:139853957,"Model::A",""{} +Model:139884815,"Model::A",""{} +Model:139904431,"Model::A",""{} +Model:140389143,"Model::A",""{} +Model:140914147,"Model::A",""{} +Model:141049377,"Model::A",""{} +Model:141276836,"Model::A",""{} +Model:141502854,"Model::A",""{} +Model:142570263,"Model::A",""{} +Model:142927558,"Model::A",""{} +Model:143915497,"Model::A",""{} +Model:144281324,"Model::A",""{} +Model:144412443,"Model::A",""{} +Model:144922743,"Model::A",""{} +Model:145030346,"Model::A",""{} +Model:147652994,"Model::A",""{} +Model:149967191,"Model::A",""{} +Model:150791637,"Model::A",""{} +Model:150880802,"Model::A",""{} +Model:150891330,"Model::A",""{} +Model:150953933,"Model::A",""{} +Model:151669738,"Model::A",""{} +Model:151702302,"Model::A",""{} +Model:151710987,"Model::A",""{} +Model:151799531,"Model::A",""{} +Model:151867220,"Model::A",""{} +Model:152140955,"Model::A",""{} +Model:152673470,"Model::A",""{} +Model:153174481,"Model::A",""{} +Model:153335326,"Model::A",""{} +Model:154613212,"Model::A",""{} +Model:155201504,"Model::A",""{} +Model:155995772,"Model::A",""{} +Model:157896293,"Model::A",""{} +Model:158363431,"Model::A",""{} +Model:159176527,"Model::A",""{} +Model:159564765,"Model::A",""{} +Model:159762269,"Model::A",""{} +Model:160118418,"Model::A",""{} +Model:160300094,"Model::A",""{} +Model:160752887,"Model::A",""{} +Model:161835953,"Model::A",""{} +Model:162767629,"Model::A",""{} +Model:163556651,"Model::A",""{} +Model:164726837,"Model::A",""{} +Model:164807897,"Model::A",""{} +Model:164808124,"Model::A",""{} +Model:166206010,"Model::A",""{} +Model:166425776,"Model::A",""{} +Model:167199062,"Model::A",""{} +Model:168507135,"Model::A",""{} +Model:169290767,"Model::A",""{} +Model:169612487,"Model::A",""{} +Model:169740038,"Model::A",""{} +Model:171100983,"Model::A",""{} +Model:172223956,"Model::A",""{} +Model:172736170,"Model::A",""{} +Model:172948307,"Model::A",""{} +Model:173077573,"Model::A",""{} +Model:173147789,"Model::A",""{} +Model:174110370,"Model::A",""{} +Model:174666391,"Model::A",""{} +Model:174764494,"Model::A",""{} +Model:174777170,"Model::A",""{} +Model:175034996,"Model::A",""{} +Model:175613573,"Model::A",""{} +Model:175918883,"Model::A",""{} +Model:176197989,"Model::A",""{} +Model:176447021,"Model::A",""{} +Model:176760445,"Model::A",""{} +Model:177466533,"Model::A",""{} +Model:178193913,"Model::A",""{} +Model:178332970,"Model::A",""{} +Model:179074431,"Model::A",""{} +Model:179079353,"Model::A",""{} +Model:179343663,"Model::A",""{} +Model:179580258,"Model::A",""{} +Model:180899871,"Model::A",""{} +Model:181772103,"Model::A",""{} +Model:182033927,"Model::A",""{} +Model:183033049,"Model::A",""{} +Model:183594220,"Model::A",""{} +Model:183697983,"Model::A",""{} +Model:184041482,"Model::A",""{} +Model:184137541,"Model::A",""{} +Model:184231473,"Model::A",""{} +Model:184947931,"Model::A",""{} +Model:185421425,"Model::A",""{} +Model:185567514,"Model::A",""{} +Model:185724087,"Model::A",""{} +Model:185808695,"Model::A",""{} +Model:185994118,"Model::A",""{} +Model:186067479,"Model::A",""{} +Model:186143957,"Model::A",""{} +Model:186144056,"Model::A",""{} +Model:186186273,"Model::A",""{} +Model:186260293,"Model::A",""{} +Model:186356905,"Model::A",""{} +Model:187603395,"Model::A",""{} +Model:187817898,"Model::A",""{} +Model:189622506,"Model::A",""{} +Model:190090772,"Model::A",""{} +Model:192992362,"Model::A",""{} +Model:193827317,"Model::A",""{} +Model:194267042,"Model::A",""{} +Model:195005629,"Model::A",""{} +Model:196019535,"Model::A",""{} +Model:197597323,"Model::A",""{} +Model:198491399,"Model::A",""{} +Model:198846287,"Model::A",""{} +Model:199047185,"Model::A",""{} +Model:199306195,"Model::A",""{} +Model:199308111,"Model::A",""{} +Model:199925523,"Model::A",""{} +Model:201101395,"Model::A",""{} +Model:201111694,"Model::A",""{} +Model:201772339,"Model::A",""{} +Model:202390286,"Model::A",""{} +Model:202535131,"Model::A",""{} +Model:204907125,"Model::A",""{} +Model:205254977,"Model::A",""{} +Model:205467743,"Model::A",""{} +Model:205645411,"Model::A",""{} +Model:205774353,"Model::A",""{} +Model:206238643,"Model::A",""{} +Model:206790393,"Model::A",""{} +Model:207338650,"Model::A",""{} +Model:207616171,"Model::A",""{} +Model:207763299,"Model::A",""{} +Model:208171630,"Model::A",""{} +Model:209494622,"Model::A",""{} +Model:210690998,"Model::A",""{} +Model:212009459,"Model::A",""{} +Model:212620003,"Model::A",""{} +Model:212817814,"Model::A",""{} +Model:212852510,"Model::A",""{} +Model:213110977,"Model::A",""{} +Model:214097733,"Model::A",""{} +Model:215573662,"Model::A",""{} +Model:216190657,"Model::A",""{} +Model:216950919,"Model::A",""{} +Model:217484687,"Model::A",""{} +Model:217968225,"Model::A",""{} +Model:218194130,"Model::A",""{} +Model:218257602,"Model::A",""{} +Model:218293760,"Model::A",""{} +Model:218516355,"Model::A",""{} +Model:218690926,"Model::A",""{} +Model:218792010,"Model::A",""{} +Model:219265102,"Model::A",""{} +Model:219332654,"Model::A",""{} +Model:219474374,"Model::A",""{} +Model:220217017,"Model::A",""{} +Model:220658503,"Model::A",""{} +Model:222464457,"Model::A",""{} +Model:223441630,"Model::A",""{} +Model:224425496,"Model::A",""{} +Model:224910172,"Model::A",""{} +Model:224952629,"Model::A",""{} +Model:226824883,"Model::A",""{} +Model:227046161,"Model::A",""{} +Model:228038138,"Model::A",""{} +Model:228758089,"Model::A",""{} +Model:228842449,"Model::A",""{} +Model:230114223,"Model::A",""{} +Model:232882366,"Model::A",""{} +Model:233682582,"Model::A",""{} +Model:234260603,"Model::A",""{} +Model:234311783,"Model::A",""{} +Model:237319237,"Model::A",""{} +Model:237891584,"Model::A",""{} +Model:238000232,"Model::A",""{} +Model:238196463,"Model::A",""{} +Model:238321142,"Model::A",""{} +Model:238598204,"Model::A",""{} +Model:238953725,"Model::A",""{} +Model:240156889,"Model::A",""{} +Model:240396709,"Model::A",""{} +Model:242328107,"Model::A",""{} +Model:242331399,"Model::A",""{} +Model:242714561,"Model::A",""{} +Model:243019033,"Model::A",""{} +Model:244277275,"Model::A",""{} +Model:244914130,"Model::A",""{} +Model:245118272,"Model::A",""{} +Model:246849761,"Model::A",""{} +Model:247150799,"Model::A",""{} +Model:249340553,"Model::A",""{} +Model:249744220,"Model::A",""{} +Model:249910598,"Model::A",""{} +Model:250218302,"Model::A",""{} +Model:250232456,"Model::A",""{} +Model:252558701,"Model::A",""{} +Model:252949039,"Model::A",""{} +Model:253060874,"Model::A",""{} +Model:253533426,"Model::A",""{} +Model:253586357,"Model::A",""{} +Model:254395715,"Model::A",""{} +Model:254785273,"Model::A",""{} +Model:255559523,"Model::A",""{} +Model:256313630,"Model::A",""{} +Model:256452938,"Model::A",""{} +Model:257863306,"Model::A",""{} +Model:258662810,"Model::A",""{} +Model:258945799,"Model::A",""{} +Model:259928595,"Model::A",""{} +Model:260307349,"Model::A",""{} +Model:261076427,"Model::A",""{} +Model:261323130,"Model::A",""{} +Model:261464902,"Model::A",""{} +Model:261744567,"Model::A",""{} +Model:262035485,"Model::A",""{} +Model:262336389,"Model::A",""{} +Model:262976783,"Model::A",""{} +Model:264157594,"Model::A",""{} +Model:264323317,"Model::A",""{} +Model:264523910,"Model::A",""{} +Model:265846758,"Model::A",""{} +Model:266903761,"Model::A",""{} +Model:267725685,"Model::A",""{} +Model:268107533,"Model::A",""{} +Model:268181746,"Model::A",""{} +Model:269277340,"Model::A",""{} +Model:269311491,"Model::A",""{} +Model:269714774,"Model::A",""{} +Model:269934745,"Model::A",""{} +Model:271199498,"Model::A",""{} +Model:272789948,"Model::A",""{} +Model:273440747,"Model::A",""{} +Model:273940185,"Model::A",""{} +Model:274256454,"Model::A",""{} +Model:274531133,"Model::A",""{} +Model:275081979,"Model::A",""{} +Model:275781018,"Model::A",""{} +Model:275884086,"Model::A",""{} +Model:276343141,"Model::A",""{} +Model:276410212,"Model::A",""{} +Model:278266084,"Model::A",""{} +Model:279969093,"Model::A",""{} +Model:280619630,"Model::A",""{} +Model:280907281,"Model::A",""{} +Model:280947464,"Model::A",""{} +Model:282647432,"Model::A",""{} +Model:282873411,"Model::A",""{} +Model:283056619,"Model::A",""{} +Model:283381370,"Model::A",""{} +Model:283383378,"Model::A",""{} +Model:283749089,"Model::A",""{} +Model:283940793,"Model::A",""{} +Model:284273060,"Model::A",""{} +Model:285037437,"Model::A",""{} +Model:287102547,"Model::A",""{} +Model:287986481,"Model::A",""{} +Model:288354293,"Model::A",""{} +Model:288862347,"Model::A",""{} +Model:289378073,"Model::A",""{} +Model:289512083,"Model::A",""{} +Model:289578773,"Model::A",""{} +Model:290035091,"Model::A",""{} +Model:290484281,"Model::A",""{} +Model:292155141,"Model::A",""{} +Model:293263301,"Model::A",""{} +Model:293455159,"Model::A",""{} +Model:293587801,"Model::A",""{} +Model:293742326,"Model::A",""{} +Model:294800029,"Model::A",""{} +Model:295387904,"Model::A",""{} +Model:295621520,"Model::A",""{} +Model:296205239,"Model::A",""{} +Model:297080871,"Model::A",""{} +Model:297462878,"Model::A",""{} +Model:297468622,"Model::A",""{} +Model:297470179,"Model::A",""{} +Model:297488573,"Model::A",""{} +Model:297490943,"Model::A",""{} +Model:297498262,"Model::A",""{} +Model:297645883,"Model::A",""{} +Model:297675043,"Model::A",""{} +Model:298098766,"Model::A",""{} +Model:298945971,"Model::A",""{} +Model:299998086,"Model::A",""{} +Model:300549913,"Model::A",""{} +Model:301021405,"Model::A",""{} +Model:301160612,"Model::A",""{} +Model:301521609,"Model::A",""{} +Model:302771956,"Model::A",""{} +Model:302831947,"Model::A",""{} +Model:302995837,"Model::A",""{} +Model:303440648,"Model::A",""{} +Model:304035806,"Model::A",""{} +Model:304207879,"Model::A",""{} +Model:305292254,"Model::A",""{} +Model:305649644,"Model::A",""{} +Model:308046562,"Model::A",""{} +Model:308247239,"Model::A",""{} +Model:308509915,"Model::A",""{} +Model:309059625,"Model::A",""{} +Model:311533478,"Model::A",""{} +Model:311873394,"Model::A",""{} +Model:312337675,"Model::A",""{} +Model:312363005,"Model::A",""{} +Model:312437463,"Model::A",""{} +Model:312446356,"Model::A",""{} +Model:312674718,"Model::A",""{} +Model:313366049,"Model::A",""{} +Model:314103843,"Model::A",""{} +Model:314646399,"Model::A",""{} +Model:316282712,"Model::A",""{} +Model:316680026,"Model::A",""{} +Model:317195997,"Model::A",""{} +Model:317331547,"Model::A",""{} +Model:317681846,"Model::A",""{} +Model:317888725,"Model::A",""{} +Model:318230725,"Model::A",""{} +Model:318415852,"Model::A",""{} +Model:318518161,"Model::A",""{} +Model:319369666,"Model::A",""{} +Model:319886792,"Model::A",""{} +Model:322270861,"Model::A",""{} +Model:322477521,"Model::A",""{} +Model:322652795,"Model::A",""{} +Model:324103508,"Model::A",""{} +Model:324612297,"Model::A",""{} +Model:326523628,"Model::A",""{} +Model:326703527,"Model::A",""{} +Model:327741249,"Model::A",""{} +Model:328354304,"Model::A",""{} +Model:328435438,"Model::A",""{} +Model:328580463,"Model::A",""{} +Model:329447689,"Model::A",""{} +Model:329557811,"Model::A",""{} +Model:330021692,"Model::A",""{} +Model:330156505,"Model::A",""{} +Model:330363705,"Model::A",""{} +Model:332258993,"Model::A",""{} +Model:333284375,"Model::A",""{} +Model:333526781,"Model::A",""{} +Model:333859698,"Model::A",""{} +Model:335625859,"Model::A",""{} +Model:335954695,"Model::A",""{} +Model:335982138,"Model::A",""{} +Model:337350127,"Model::A",""{} +Model:337672612,"Model::A",""{} +Model:337679542,"Model::A",""{} +Model:337802072,"Model::A",""{} +Model:338928004,"Model::A",""{} +Model:338984504,"Model::A",""{} +Model:340372697,"Model::A",""{} +Model:341994226,"Model::A",""{} +Model:342902860,"Model::A",""{} +Model:343040116,"Model::A",""{} +Model:343146094,"Model::A",""{} +Model:343353507,"Model::A",""{} +Model:343477639,"Model::A",""{} +Model:343496185,"Model::A",""{} +Model:343733950,"Model::A",""{} +Model:345281075,"Model::A",""{} +Model:346599255,"Model::A",""{} +Model:347042175,"Model::A",""{} +Model:348332027,"Model::A",""{} +Model:348565458,"Model::A",""{} +Model:349567736,"Model::A",""{} +Model:350718897,"Model::A",""{} +Model:351119933,"Model::A",""{} +Model:351176381,"Model::A",""{} +Model:351444698,"Model::A",""{} +Model:354196002,"Model::A",""{} +Model:354232259,"Model::A",""{} +Model:354531587,"Model::A",""{} +Model:354995797,"Model::A",""{} +Model:355066322,"Model::A",""{} +Model:355394006,"Model::A",""{} +Model:355786633,"Model::A",""{} +Model:357211826,"Model::A",""{} +Model:357641131,"Model::A",""{} +Model:357660514,"Model::A",""{} +Model:357951354,"Model::A",""{} +Model:358834773,"Model::A",""{} +Model:360652723,"Model::A",""{} +Model:361285364,"Model::A",""{} +Model:361381390,"Model::A",""{} +Model:361548620,"Model::A",""{} +Model:361562651,"Model::A",""{} +Model:361635654,"Model::A",""{} +Model:362483683,"Model::A",""{} +Model:362964997,"Model::A",""{} +Model:363338571,"Model::A",""{} +Model:363900137,"Model::A",""{} +Model:364079894,"Model::A",""{} +Model:364213081,"Model::A",""{} +Model:365092374,"Model::A",""{} +Model:365780561,"Model::A",""{} +Model:367269374,"Model::A",""{} +Model:367924861,"Model::A",""{} +Model:367981702,"Model::A",""{} +Model:368039426,"Model::A",""{} +Model:369146821,"Model::A",""{} +Model:369354359,"Model::A",""{} +Model:370486087,"Model::A",""{} +Model:371266071,"Model::A",""{} +Model:371604661,"Model::A",""{} +Model:372240308,"Model::A",""{} +Model:373214786,"Model::A",""{} +Model:374164081,"Model::A",""{} +Model:376254315,"Model::A",""{} +Model:376823263,"Model::A",""{} +Model:378324049,"Model::A",""{} +Model:378641437,"Model::A",""{} +Model:380164333,"Model::A",""{} +Model:380424774,"Model::A",""{} +Model:380731935,"Model::A",""{} +Model:381038524,"Model::A",""{} +Model:381090995,"Model::A",""{} +Model:382819191,"Model::A",""{} +Model:383602342,"Model::A",""{} +Model:383704101,"Model::A",""{} +Model:385011172,"Model::A",""{} +Model:385146467,"Model::A",""{} +Model:386847003,"Model::A",""{} +Model:388273857,"Model::A",""{} +Model:390404347,"Model::A",""{} +Model:390875597,"Model::A",""{} +Model:391224395,"Model::A",""{} +Model:391753537,"Model::A",""{} +Model:393069644,"Model::A",""{} +Model:393148255,"Model::A",""{} +Model:393945335,"Model::A",""{} +Model:394522100,"Model::A",""{} +Model:394784810,"Model::A",""{} +Model:395274671,"Model::A",""{} +Model:396023431,"Model::A",""{} +Model:396808874,"Model::A",""{} +Model:397529979,"Model::A",""{} +Model:398286694,"Model::A",""{} +Model:398641353,"Model::A",""{} +Model:398842439,"Model::A",""{} +Model:399095763,"Model::A",""{} +Model:399258695,"Model::A",""{} +Model:399848837,"Model::A",""{} +Model:402535190,"Model::A",""{} +Model:402953045,"Model::A",""{} +Model:405100325,"Model::A",""{} +Model:405263428,"Model::A",""{} +Model:405429574,"Model::A",""{} +Model:405776247,"Model::A",""{} +Model:405879829,"Model::A",""{} +Model:407007188,"Model::A",""{} +Model:407178899,"Model::A",""{} +Model:407378769,"Model::A",""{} +Model:408174871,"Model::A",""{} +Model:409656019,"Model::A",""{} +Model:410546166,"Model::A",""{} +Model:410766637,"Model::A",""{} +Model:411143624,"Model::A",""{} +Model:411172079,"Model::A",""{} +Model:412608386,"Model::A",""{} +Model:413423995,"Model::A",""{} +Model:413556346,"Model::A",""{} +Model:414713470,"Model::A",""{} +Model:415119189,"Model::A",""{} +Model:415163645,"Model::A",""{} +Model:415757583,"Model::A",""{} +Model:416020386,"Model::A",""{} +Model:416949824,"Model::A",""{} +Model:418890507,"Model::A",""{} +Model:418999217,"Model::A",""{} +Model:419007135,"Model::A",""{} +Model:419486177,"Model::A",""{} +Model:420099254,"Model::A",""{} +Model:420825210,"Model::A",""{} +Model:420941054,"Model::A",""{} +Model:421695769,"Model::A",""{} +Model:421899341,"Model::A",""{} +Model:422384278,"Model::A",""{} +Model:423638867,"Model::A",""{} +Model:424153468,"Model::A",""{} +Model:424222213,"Model::A",""{} +Model:424438106,"Model::A",""{} +Model:424613039,"Model::A",""{} +Model:425000696,"Model::A",""{} +Model:426336010,"Model::A",""{} +Model:426413078,"Model::A",""{} +Model:426455610,"Model::A",""{} +Model:426714622,"Model::A",""{} +Model:428243201,"Model::A",""{} +Model:430105130,"Model::A",""{} +Model:430701971,"Model::A",""{} +Model:431140498,"Model::A",""{} +Model:433885966,"Model::A",""{} +Model:434050686,"Model::A",""{} +Model:434551989,"Model::A",""{} +Model:436061164,"Model::A",""{} +Model:436077205,"Model::A",""{} +Model:436089911,"Model::A",""{} +Model:438523580,"Model::A",""{} +Model:439102103,"Model::A",""{} +Model:439779887,"Model::A",""{} +Model:439868603,"Model::A",""{} +Model:440536722,"Model::A",""{} +Model:441552013,"Model::A",""{} +Model:441803671,"Model::A",""{} +Model:443182163,"Model::A",""{} +Model:443854237,"Model::A",""{} +Model:444048821,"Model::A",""{} +Model:444249692,"Model::A",""{} +Model:444546749,"Model::A",""{} +Model:445207629,"Model::A",""{} +Model:446004944,"Model::A",""{} +Model:446183936,"Model::A",""{} +Model:446252734,"Model::A",""{} +Model:446624705,"Model::A",""{} +Model:446633246,"Model::A",""{} +Model:448462481,"Model::A",""{} +Model:448628753,"Model::A",""{} +Model:450189052,"Model::A",""{} +Model:450606158,"Model::A",""{} +Model:451008945,"Model::A",""{} +Model:451170551,"Model::A",""{} +Model:452296815,"Model::A",""{} +Model:452534617,"Model::A",""{} +Model:452949849,"Model::A",""{} +Model:453078377,"Model::A",""{} +Model:453132527,"Model::A",""{} +Model:453703705,"Model::A",""{} +Model:454375622,"Model::A",""{} +Model:454713861,"Model::A",""{} +Model:458238428,"Model::A",""{} +Model:458272703,"Model::A",""{} +Model:459078853,"Model::A",""{} +Model:459573397,"Model::A",""{} +Model:460082236,"Model::A",""{} +Model:460387646,"Model::A",""{} +Model:460461498,"Model::A",""{} +Model:460552461,"Model::A",""{} +Model:460639159,"Model::A",""{} +Model:462029812,"Model::A",""{} +Model:462693294,"Model::A",""{} +Model:462756261,"Model::A",""{} +Model:465227749,"Model::A",""{} +Model:466506007,"Model::A",""{} +Model:467214860,"Model::A",""{} +Model:468374089,"Model::A",""{} +Model:469105666,"Model::A",""{} +Model:469243610,"Model::A",""{} +Model:469356764,"Model::A",""{} +Model:470068562,"Model::A",""{} +Model:471708591,"Model::A",""{} +Model:472565941,"Model::A",""{} +Model:472606846,"Model::A",""{} +Model:473166229,"Model::A",""{} +Model:473378922,"Model::A",""{} +Model:473806520,"Model::A",""{} +Model:475169773,"Model::A",""{} +Model:475371788,"Model::A",""{} +Model:475784026,"Model::A",""{} +Model:475997871,"Model::A",""{} +Model:477098905,"Model::A",""{} +Model:478413027,"Model::A",""{} +Model:478843098,"Model::A",""{} +Model:478962769,"Model::A",""{} +Model:479291165,"Model::A",""{} +Model:479762689,"Model::A",""{} +Model:479951830,"Model::A",""{} +Model:480478925,"Model::A",""{} +Model:480999755,"Model::A",""{} +Model:481561794,"Model::A",""{} +Model:482699987,"Model::A",""{} +Model:482706377,"Model::A",""{} +Model:484868949,"Model::A",""{} +Model:485630405,"Model::A",""{} +Model:486060801,"Model::A",""{} +Model:486943880,"Model::A",""{} +Model:488549653,"Model::A",""{} +Model:488753154,"Model::A",""{} +Model:488926280,"Model::A",""{} +Model:489335885,"Model::A",""{} +Model:489918980,"Model::A",""{} +Model:490197623,"Model::A",""{} +Model:490377069,"Model::A",""{} +Model:490892303,"Model::A",""{} +Model:491503314,"Model::A",""{} +Model:491799049,"Model::A",""{} +Model:492177820,"Model::A",""{} +Model:492433221,"Model::A",""{} +Model:493036617,"Model::A",""{} +Model:493119809,"Model::A",""{} +Model:493921619,"Model::A",""{} +Model:494133182,"Model::A",""{} +Model:494888530,"Model::A",""{} +Model:496408028,"Model::A",""{} +Model:497000227,"Model::A",""{} +Model:497010052,"Model::A",""{} +Model:498313659,"Model::A",""{} +Model:498883623,"Model::A",""{} +Model:499536923,"Model::A",""{} +Model:499538363,"Model::A",""{} +Model:499849793,"Model::A",""{} +Model:501186894,"Model::A",""{} +Model:501483572,"Model::A",""{} +Model:501650567,"Model::A",""{} +Model:503155287,"Model::A",""{} +Model:503610199,"Model::A",""{} +Model:503693529,"Model::A",""{} +Model:503805689,"Model::A",""{} +Model:504361170,"Model::A",""{} +Model:504791974,"Model::A",""{} +Model:505207160,"Model::A",""{} +Model:505571509,"Model::A",""{} +Model:505744654,"Model::A",""{} +Model:506102414,"Model::A",""{} +Model:506350623,"Model::A",""{} +Model:506363807,"Model::A",""{} +Model:506703476,"Model::A",""{} +Model:506883620,"Model::A",""{} +Model:507713153,"Model::A",""{} +Model:508095225,"Model::A",""{} +Model:508858765,"Model::A",""{} +Model:510342370,"Model::A",""{} +Model:510537380,"Model::A",""{} +Model:510573942,"Model::A",""{} +Model:511045444,"Model::A",""{} +Model:512253159,"Model::A",""{} +Model:512667379,"Model::A",""{} +Model:512949259,"Model::A",""{} +Model:513091237,"Model::A",""{} +Model:513574746,"Model::A",""{} +Model:513674234,"Model::A",""{} +Model:513921607,"Model::A",""{} +Model:514132540,"Model::A",""{} +Model:514234483,"Model::A",""{} +Model:515545117,"Model::A",""{} +Model:516312283,"Model::A",""{} +Model:517877461,"Model::A",""{} +Model:519075155,"Model::A",""{} +Model:519169108,"Model::A",""{} +Model:519675991,"Model::A",""{} +Model:519973325,"Model::A",""{} +Model:520016521,"Model::A",""{} +Model:520145781,"Model::A",""{} +Model:521397499,"Model::A",""{} +Model:522522565,"Model::A",""{} +Model:524190713,"Model::A",""{} +Model:524486271,"Model::A",""{} +Model:524578603,"Model::A",""{} +Model:525058567,"Model::A",""{} +Model:526474207,"Model::A",""{} +Model:526721585,"Model::A",""{} +Model:527009495,"Model::A",""{} +Model:527109639,"Model::A",""{} +Model:527148689,"Model::A",""{} +Model:527613093,"Model::A",""{} +Model:528463782,"Model::A",""{} +Model:528601435,"Model::A",""{} +Model:529343769,"Model::A",""{} +Model:529448513,"Model::A",""{} +Model:530192365,"Model::A",""{} +Model:530260759,"Model::A",""{} +Model:530466307,"Model::A",""{} +Model:531267815,"Model::A",""{} +Model:531278305,"Model::A",""{} +Model:532099122,"Model::A",""{} +Model:532534274,"Model::A",""{} +Model:533544046,"Model::A",""{} +Model:533984363,"Model::A",""{} +Model:534411068,"Model::A",""{} +Model:535386909,"Model::A",""{} +Model:535627564,"Model::A",""{} +Model:535665627,"Model::A",""{} +Model:535677104,"Model::A",""{} +Model:535928903,"Model::A",""{} +Model:536015977,"Model::A",""{} +Model:536727615,"Model::A",""{} +Model:536857961,"Model::A",""{} +Model:536973883,"Model::A",""{} +Model:536994383,"Model::A",""{} +Model:537581797,"Model::A",""{} +Model:537838743,"Model::A",""{} +Model:538459225,"Model::A",""{} +Model:538726579,"Model::A",""{} +Model:539944377,"Model::A",""{} +Model:540477990,"Model::A",""{} +Model:540536678,"Model::A",""{} +Model:540657289,"Model::A",""{} +Model:541060850,"Model::A",""{} +Model:541947129,"Model::A",""{} +Model:542013800,"Model::A",""{} +Model:542113511,"Model::A",""{} +Model:542999594,"Model::A",""{} +Model:543217833,"Model::A",""{} +Model:543286097,"Model::A",""{} +Model:544214572,"Model::A",""{} +Model:544399687,"Model::A",""{} +Model:544743661,"Model::A",""{} +Model:546015985,"Model::A",""{} +Model:548018765,"Model::A",""{} +Model:550013228,"Model::A",""{} +Model:551240473,"Model::A",""{} +Model:551459943,"Model::A",""{} +Model:551533373,"Model::A",""{} +Model:553882346,"Model::A",""{} +Model:553933981,"Model::A",""{} +Model:554020311,"Model::A",""{} +Model:555248633,"Model::A",""{} +Model:555287927,"Model::A",""{} +Model:555363130,"Model::A",""{} +Model:555576727,"Model::A",""{} +Model:555606342,"Model::A",""{} +Model:557957786,"Model::A",""{} +Model:558195010,"Model::A",""{} +Model:558716288,"Model::A",""{} +Model:559926890,"Model::A",""{} +Model:560149922,"Model::A",""{} +Model:560168254,"Model::A",""{} +Model:562804275,"Model::A",""{} +Model:565426590,"Model::A",""{} +Model:565536718,"Model::A",""{} +Model:566171454,"Model::A",""{} +Model:566331293,"Model::A",""{} +Model:567583786,"Model::A",""{} +Model:567842970,"Model::A",""{} +Model:568161197,"Model::A",""{} +Model:568840645,"Model::A",""{} +Model:568932111,"Model::A",""{} +Model:569100401,"Model::A",""{} +Model:571086253,"Model::A",""{} +Model:571391145,"Model::A",""{} +Model:571731293,"Model::A",""{} +Model:572694013,"Model::A",""{} +Model:573027275,"Model::A",""{} +Model:573386793,"Model::A",""{} +Model:573829684,"Model::A",""{} +Model:574179078,"Model::A",""{} +Model:575739711,"Model::A",""{} +Model:576188119,"Model::A",""{} +Model:576797837,"Model::A",""{} +Model:577738411,"Model::A",""{} +Model:577906417,"Model::A",""{} +Model:578361330,"Model::A",""{} +Model:578978231,"Model::A",""{} +Model:579076586,"Model::A",""{} +Model:579245386,"Model::A",""{} +Model:579494082,"Model::A",""{} +Model:579617581,"Model::A",""{} +Model:579627915,"Model::A",""{} +Model:579866169,"Model::A",""{} +Model:580178355,"Model::A",""{} +Model:580457387,"Model::A",""{} +Model:581200681,"Model::A",""{} +Model:581691476,"Model::A",""{} +Model:582501077,"Model::A",""{} +Model:582848337,"Model::A",""{} +Model:583456564,"Model::A",""{} +Model:585085484,"Model::A",""{} +Model:586126445,"Model::A",""{} +Model:586224313,"Model::A",""{} +Model:586568489,"Model::A",""{} +Model:586804282,"Model::A",""{} +Model:587515519,"Model::A",""{} +Model:587599396,"Model::A",""{} +Model:588391503,"Model::A",""{} +Model:589690694,"Model::A",""{} +Model:590582925,"Model::A",""{} +Model:590924387,"Model::A",""{} +Model:592175274,"Model::A",""{} +Model:592216050,"Model::A",""{} +Model:592236819,"Model::A",""{} +Model:592671161,"Model::A",""{} +Model:592702857,"Model::A",""{} +Model:592707851,"Model::A",""{} +Model:592894063,"Model::A",""{} +Model:593172620,"Model::A",""{} +Model:593184385,"Model::A",""{} +Model:594453694,"Model::A",""{} +Model:594469618,"Model::A",""{} +Model:596582913,"Model::A",""{} +Model:597257342,"Model::A",""{} +Model:597504740,"Model::A",""{} +Model:597680737,"Model::A",""{} +Model:598427586,"Model::A",""{} +Model:599905921,"Model::A",""{} +Model:600475290,"Model::A",""{} +Model:600779921,"Model::A",""{} +Model:601978439,"Model::A",""{} +Model:601985621,"Model::A",""{} +Model:602442878,"Model::A",""{} +Model:603536321,"Model::A",""{} +Model:605034973,"Model::A",""{} +Model:605919463,"Model::A",""{} +Model:607157063,"Model::A",""{} +Model:607180565,"Model::A",""{} +Model:607331099,"Model::A",""{} +Model:607344489,"Model::A",""{} +Model:608669579,"Model::A",""{} +Model:609822379,"Model::A",""{} +Model:610813262,"Model::A",""{} +Model:611193522,"Model::A",""{} +Model:611287867,"Model::A",""{} +Model:611660771,"Model::A",""{} +Model:612318257,"Model::A",""{} +Model:612391421,"Model::A",""{} +Model:613552725,"Model::A",""{} +Model:613891352,"Model::A",""{} +Model:613904841,"Model::A",""{} +Model:613932493,"Model::A",""{} +Model:614805315,"Model::A",""{} +Model:615871904,"Model::A",""{} +Model:616248013,"Model::A",""{} +Model:616472009,"Model::A",""{} +Model:617911471,"Model::A",""{} +Model:618318707,"Model::A",""{} +Model:619151775,"Model::A",""{} +Model:619608506,"Model::A",""{} +Model:620380196,"Model::A",""{} +Model:620422208,"Model::A",""{} +Model:623004703,"Model::A",""{} +Model:623518433,"Model::A",""{} +Model:624023399,"Model::A",""{} +Model:625762543,"Model::A",""{} +Model:627021030,"Model::A",""{} +Model:627101500,"Model::A",""{} +Model:627705514,"Model::A",""{} +Model:627734441,"Model::A",""{} +Model:628556371,"Model::A",""{} +Model:630183786,"Model::A",""{} +Model:630342602,"Model::A",""{} +Model:630837950,"Model::A",""{} +Model:630924116,"Model::A",""{} +Model:631023350,"Model::A",""{} +Model:631451655,"Model::A",""{} +Model:632269796,"Model::A",""{} +Model:632496080,"Model::A",""{} +Model:632805085,"Model::A",""{} +Model:632993585,"Model::A",""{} +Model:634337188,"Model::A",""{} +Model:634591649,"Model::A",""{} +Model:634921207,"Model::A",""{} +Model:634936709,"Model::A",""{} +Model:635411231,"Model::A",""{} +Model:635677299,"Model::A",""{} +Model:636059882,"Model::A",""{} +Model:636130606,"Model::A",""{} +Model:636529066,"Model::A",""{} +Model:637191273,"Model::A",""{} +Model:637594972,"Model::A",""{} +Model:638606348,"Model::A",""{} +Model:638862365,"Model::A",""{} +Model:639719742,"Model::A",""{} +Model:641249643,"Model::A",""{} +Model:641667250,"Model::A",""{} +Model:642792329,"Model::A",""{} +Model:642956015,"Model::A",""{} +Model:643266092,"Model::A",""{} +Model:643448799,"Model::A",""{} +Model:643804313,"Model::A",""{} +Model:645908167,"Model::A",""{} +Model:646635670,"Model::A",""{} +Model:646874115,"Model::A",""{} +Model:647871609,"Model::A",""{} +Model:648079430,"Model::A",""{} +Model:648107573,"Model::A",""{} +Model:648113037,"Model::A",""{} +Model:648394084,"Model::A",""{} +Model:649039427,"Model::A",""{} +Model:649896109,"Model::A",""{} +Model:649927924,"Model::A",""{} +Model:650216260,"Model::A",""{} +Model:650900655,"Model::A",""{} +Model:650926886,"Model::A",""{} +Model:650940295,"Model::A",""{} +Model:651211731,"Model::A",""{} +Model:651215269,"Model::A",""{} +Model:651227192,"Model::A",""{} +Model:651420764,"Model::A",""{} +Model:652126503,"Model::A",""{} +Model:652409070,"Model::A",""{} +Model:653999422,"Model::A",""{} +Model:654190159,"Model::A",""{} +Model:656555215,"Model::A",""{} +Model:658172084,"Model::A",""{} +Model:658227517,"Model::A",""{} +Model:658507845,"Model::A",""{} +Model:659653599,"Model::A",""{} +Model:660112317,"Model::A",""{} +Model:660644637,"Model::A",""{} +Model:661172660,"Model::A",""{} +Model:661486617,"Model::A",""{} +Model:661557527,"Model::A",""{} +Model:662327237,"Model::A",""{} +Model:662884087,"Model::A",""{} +Model:665026629,"Model::A",""{} +Model:665184821,"Model::A",""{} +Model:665780522,"Model::A",""{} +Model:665994626,"Model::A",""{} +Model:666449778,"Model::A",""{} +Model:666463846,"Model::A",""{} +Model:666552022,"Model::A",""{} +Model:668104631,"Model::A",""{} +Model:668472525,"Model::A",""{} +Model:669223137,"Model::A",""{} +Model:669395554,"Model::A",""{} +Model:669679867,"Model::A",""{} +Model:670701311,"Model::A",""{} +Model:670843118,"Model::A",""{} +Model:670933201,"Model::A",""{} +Model:671520383,"Model::A",""{} +Model:672102430,"Model::A",""{} +Model:672389491,"Model::A",""{} +Model:672464912,"Model::A",""{} +Model:672579124,"Model::A",""{} +Model:673425954,"Model::A",""{} +Model:673441988,"Model::A",""{} +Model:673651418,"Model::A",""{} +Model:673778998,"Model::A",""{} +Model:673801862,"Model::A",""{} +Model:673850615,"Model::A",""{} +Model:674000231,"Model::A",""{} +Model:675262901,"Model::A",""{} +Model:675763454,"Model::A",""{} +Model:676914601,"Model::A",""{} +Model:677851694,"Model::A",""{} +Model:678311516,"Model::A",""{} +Model:678504149,"Model::A",""{} +Model:678844695,"Model::A",""{} +Model:679238552,"Model::A",""{} +Model:679603930,"Model::A",""{} +Model:679765138,"Model::A",""{} +Model:681054001,"Model::A",""{} +Model:681460438,"Model::A",""{} +Model:681553887,"Model::A",""{} +Model:681881090,"Model::A",""{} +Model:683277137,"Model::A",""{} +Model:685764497,"Model::A",""{} +Model:686226522,"Model::A",""{} +Model:687388794,"Model::A",""{} +Model:687483005,"Model::A",""{} +Model:687545048,"Model::A",""{} +Model:687624338,"Model::A",""{} +Model:687813213,"Model::A",""{} +Model:688092739,"Model::A",""{} +Model:688313193,"Model::A",""{} +Model:689000371,"Model::A",""{} +Model:689552781,"Model::A",""{} +Model:689689684,"Model::A",""{} +Model:690304287,"Model::A",""{} +Model:690565972,"Model::A",""{} +Model:690886573,"Model::A",""{} +Model:692645229,"Model::A",""{} +Model:692750731,"Model::A",""{} +Model:693804511,"Model::A",""{} +Model:693997875,"Model::A",""{} +Model:695410370,"Model::A",""{} +Model:697346507,"Model::A",""{} +Model:697979836,"Model::A",""{} +Model:698326490,"Model::A",""{} +Model:699104521,"Model::A",""{} +Model:699724406,"Model::A",""{} +Model:699855141,"Model::A",""{} +Model:699982125,"Model::A",""{} +Model:700405265,"Model::A",""{} +Model:701258618,"Model::A",""{} +Model:702326775,"Model::A",""{} +Model:702637635,"Model::A",""{} +Model:704758876,"Model::A",""{} +Model:704812270,"Model::A",""{} +Model:705295459,"Model::A",""{} +Model:705487127,"Model::A",""{} +Model:706843353,"Model::A",""{} +Model:706911582,"Model::A",""{} +Model:711220564,"Model::A",""{} +Model:711495995,"Model::A",""{} +Model:711546111,"Model::A",""{} +Model:711853746,"Model::A",""{} +Model:711912366,"Model::A",""{} +Model:712691540,"Model::A",""{} +Model:712942973,"Model::A",""{} +Model:713504363,"Model::A",""{} +Model:713734839,"Model::A",""{} +Model:714006666,"Model::A",""{} +Model:714671859,"Model::A",""{} +Model:715082537,"Model::A",""{} +Model:715237172,"Model::A",""{} +Model:718089503,"Model::A",""{} +Model:718493226,"Model::A",""{} +Model:718903305,"Model::A",""{} +Model:720313875,"Model::A",""{} +Model:721670523,"Model::A",""{} +Model:721746425,"Model::A",""{} +Model:722347769,"Model::A",""{} +Model:722810881,"Model::A",""{} +Model:725815544,"Model::A",""{} +Model:726691501,"Model::A",""{} +Model:726788409,"Model::A",""{} +Model:726929500,"Model::A",""{} +Model:727160725,"Model::A",""{} +Model:727377137,"Model::A",""{} +Model:729491211,"Model::A",""{} +Model:729657710,"Model::A",""{} +Model:730918242,"Model::A",""{} +Model:731167801,"Model::A",""{} +Model:732157817,"Model::A",""{} +Model:732477557,"Model::A",""{} +Model:733656350,"Model::A",""{} +Model:733949810,"Model::A",""{} +Model:735955221,"Model::A",""{} +Model:736686054,"Model::A",""{} +Model:737344691,"Model::A",""{} +Model:738811545,"Model::A",""{} +Model:738903289,"Model::A",""{} +Model:740418316,"Model::A",""{} +Model:740466277,"Model::A",""{} +Model:741164913,"Model::A",""{} +Model:741779770,"Model::A",""{} +Model:741838088,"Model::A",""{} +Model:742926970,"Model::A",""{} +Model:743073774,"Model::A",""{} +Model:743835801,"Model::A",""{} +Model:744838897,"Model::A",""{} +Model:745011356,"Model::A",""{} +Model:745300985,"Model::A",""{} +Model:745814981,"Model::A",""{} +Model:747860307,"Model::A",""{} +Model:748029366,"Model::A",""{} +Model:748476211,"Model::A",""{} +Model:748509907,"Model::A",""{} +Model:750646422,"Model::A",""{} +Model:751732603,"Model::A",""{} +Model:752116425,"Model::A",""{} +Model:752618790,"Model::A",""{} +Model:752729463,"Model::A",""{} +Model:754704847,"Model::A",""{} +Model:755078108,"Model::A",""{} +Model:756716253,"Model::A",""{} +Model:757292507,"Model::A",""{} +Model:757771179,"Model::A",""{} +Model:757832143,"Model::A",""{} +Model:758415654,"Model::A",""{} +Model:759128625,"Model::A",""{} +Model:759332990,"Model::A",""{} +Model:759377087,"Model::A",""{} +Model:761468446,"Model::A",""{} +Model:761482510,"Model::A",""{} +Model:762040871,"Model::A",""{} +Model:763479404,"Model::A",""{} +Model:764154239,"Model::A",""{} +Model:765192314,"Model::A",""{} +Model:765532029,"Model::A",""{} +Model:765740926,"Model::A",""{} +Model:766191405,"Model::A",""{} +Model:766344106,"Model::A",""{} +Model:766427762,"Model::A",""{} +Model:766923653,"Model::A",""{} +Model:767411999,"Model::A",""{} +Model:769223788,"Model::A",""{} +Model:769797157,"Model::A",""{} +Model:770631083,"Model::A",""{} +Model:772713130,"Model::A",""{} +Model:773649476,"Model::A",""{} +Model:774131553,"Model::A",""{} +Model:775126855,"Model::A",""{} +Model:777796568,"Model::A",""{} +Model:777905925,"Model::A",""{} +Model:779031463,"Model::A",""{} +Model:779592139,"Model::A",""{} +Model:780158300,"Model::A",""{} +Model:781423495,"Model::A",""{} +Model:782258120,"Model::A",""{} +Model:782322661,"Model::A",""{} +Model:782854265,"Model::A",""{} +Model:783373221,"Model::A",""{} +Model:783422138,"Model::A",""{} +Model:784741467,"Model::A",""{} +Model:785716348,"Model::A",""{} +Model:785848122,"Model::A",""{} +Model:786998865,"Model::A",""{} +Model:787837337,"Model::A",""{} +Model:789066563,"Model::A",""{} +Model:789234437,"Model::A",""{} +Model:789698037,"Model::A",""{} +Model:789996478,"Model::A",""{} +Model:790739706,"Model::A",""{} +Model:791015308,"Model::A",""{} +Model:791724994,"Model::A",""{} +Model:791729049,"Model::A",""{} +Model:792004196,"Model::A",""{} +Model:792491567,"Model::A",""{} +Model:794903610,"Model::A",""{} +Model:795149629,"Model::A",""{} +Model:796754262,"Model::A",""{} +Model:798224610,"Model::A",""{} +Model:798440492,"Model::A",""{} +Model:800812534,"Model::A",""{} +Model:801200504,"Model::A",""{} +Model:801411722,"Model::A",""{} +Model:802604799,"Model::A",""{} +Model:803353052,"Model::A",""{} +Model:804586683,"Model::A",""{} +Model:804895754,"Model::A",""{} +Model:805204694,"Model::A",""{} +Model:805415939,"Model::A",""{} +Model:805443691,"Model::A",""{} +Model:805561951,"Model::A",""{} +Model:806295477,"Model::A",""{} +Model:806909606,"Model::A",""{} +Model:807150666,"Model::A",""{} +Model:808674457,"Model::A",""{} +Model:808834839,"Model::A",""{} +Model:809522015,"Model::A",""{} +Model:809577032,"Model::A",""{} +Model:810203085,"Model::A",""{} +Model:811278535,"Model::A",""{} +Model:811358793,"Model::A",""{} +Model:813207887,"Model::A",""{} +Model:813860906,"Model::A",""{} +Model:814189675,"Model::A",""{} +Model:815607725,"Model::A",""{} +Model:817013073,"Model::A",""{} +Model:817225138,"Model::A",""{} +Model:817355262,"Model::A",""{} +Model:817637597,"Model::A",""{} +Model:817998728,"Model::A",""{} +Model:819464411,"Model::A",""{} +Model:820121795,"Model::A",""{} +Model:820406618,"Model::A",""{} +Model:820847101,"Model::A",""{} +Model:820881627,"Model::A",""{} +Model:820952481,"Model::A",""{} +Model:821653415,"Model::A",""{} +Model:821680732,"Model::A",""{} +Model:821853469,"Model::A",""{} +Model:822271718,"Model::A",""{} +Model:822795622,"Model::A",""{} +Model:822856454,"Model::A",""{} +Model:823322372,"Model::A",""{} +Model:823635367,"Model::A",""{} +Model:824609867,"Model::A",""{} +Model:825179347,"Model::A",""{} +Model:826213999,"Model::A",""{} +Model:826629478,"Model::A",""{} +Model:826684242,"Model::A",""{} +Model:826972580,"Model::A",""{} +Model:827604525,"Model::A",""{} +Model:828157419,"Model::A",""{} +Model:830138764,"Model::A",""{} +Model:830854651,"Model::A",""{} +Model:830988723,"Model::A",""{} +Model:832843578,"Model::A",""{} +Model:832980380,"Model::A",""{} +Model:834857166,"Model::A",""{} +Model:837673943,"Model::A",""{} +Model:838297759,"Model::A",""{} +Model:838423921,"Model::A",""{} +Model:838846182,"Model::A",""{} +Model:839909579,"Model::A",""{} +Model:841102027,"Model::A",""{} +Model:842607265,"Model::A",""{} +Model:842731390,"Model::A",""{} +Model:843051146,"Model::A",""{} +Model:843459134,"Model::A",""{} +Model:844090583,"Model::A",""{} +Model:844308682,"Model::A",""{} +Model:844730552,"Model::A",""{} +Model:844869830,"Model::A",""{} +Model:845369202,"Model::A",""{} +Model:845916609,"Model::A",""{} +Model:846056956,"Model::A",""{} +Model:846609649,"Model::A",""{} +Model:846615209,"Model::A",""{} +Model:846816272,"Model::A",""{} +Model:847018370,"Model::A",""{} +Model:848461565,"Model::A",""{} +Model:848773827,"Model::A",""{} +Model:849647182,"Model::A",""{} +Model:849685970,"Model::A",""{} +Model:849705897,"Model::A",""{} +Model:850017988,"Model::A",""{} +Model:850669724,"Model::A",""{} +Model:850709661,"Model::A",""{} +Model:850869027,"Model::A",""{} +Model:851273345,"Model::A",""{} +Model:851463713,"Model::A",""{} +Model:851485857,"Model::A",""{} +Model:851714610,"Model::A",""{} +Model:852938938,"Model::A",""{} +Model:853356610,"Model::A",""{} +Model:854649885,"Model::A",""{} +Model:855584324,"Model::A",""{} +Model:855756203,"Model::A",""{} +Model:855985833,"Model::A",""{} +Model:855989126,"Model::A",""{} +Model:856319787,"Model::A",""{} +Model:856324754,"Model::A",""{} +Model:856394033,"Model::A",""{} +Model:856785820,"Model::A",""{} +Model:857192250,"Model::A",""{} +Model:857399884,"Model::A",""{} +Model:860030521,"Model::A",""{} +Model:860404287,"Model::A",""{} +Model:860695665,"Model::A",""{} +Model:860880666,"Model::A",""{} +Model:860908377,"Model::A",""{} +Model:861688386,"Model::A",""{} +Model:862192078,"Model::A",""{} +Model:862677982,"Model::A",""{} +Model:863366357,"Model::A",""{} +Model:863613887,"Model::A",""{} +Model:864572217,"Model::A",""{} +Model:864773072,"Model::A",""{} +Model:864848877,"Model::A",""{} +Model:865646967,"Model::A",""{} +Model:867075729,"Model::A",""{} +Model:867178736,"Model::A",""{} +Model:867404727,"Model::A",""{} +Model:867842838,"Model::A",""{} +Model:868148338,"Model::A",""{} +Model:868253109,"Model::A",""{} +Model:870766880,"Model::A",""{} +Model:870895397,"Model::A",""{} +Model:871544672,"Model::A",""{} +Model:871687636,"Model::A",""{} +Model:871821330,"Model::A",""{} +Model:873824370,"Model::A",""{} +Model:875565655,"Model::A",""{} +Model:875675285,"Model::A",""{} +Model:876494362,"Model::A",""{} +Model:877144627,"Model::A",""{} +Model:881815664,"Model::A",""{} +Model:882136735,"Model::A",""{} +Model:882193855,"Model::A",""{} +Model:882452351,"Model::A",""{} +Model:882990944,"Model::A",""{} +Model:884453360,"Model::A",""{} +Model:885954695,"Model::A",""{} +Model:886881305,"Model::A",""{} +Model:887369769,"Model::A",""{} +Model:887879619,"Model::A",""{} +Model:888349041,"Model::A",""{} +Model:888558901,"Model::A",""{} +Model:889025334,"Model::A",""{} +Model:889103884,"Model::A",""{} +Model:889153785,"Model::A",""{} +Model:889345738,"Model::A",""{} +Model:889442365,"Model::A",""{} +Model:889658086,"Model::A",""{} +Model:890039150,"Model::A",""{} +Model:892025831,"Model::A",""{} +Model:892095169,"Model::A",""{} +Model:892944019,"Model::A",""{} +Model:893222638,"Model::A",""{} +Model:893348168,"Model::A",""{} +Model:893379608,"Model::A",""{} +Model:893860143,"Model::A",""{} +Model:894469823,"Model::A",""{} +Model:895642510,"Model::A",""{} +Model:895730698,"Model::A",""{} +Model:896310291,"Model::A",""{} +Model:897205727,"Model::A",""{} +Model:897251371,"Model::A",""{} +Model:897750031,"Model::A",""{} +Model:898487325,"Model::A",""{} +Model:898531526,"Model::A",""{} +Model:899785554,"Model::A",""{} +Model:899805641,"Model::A",""{} +Model:900046322,"Model::A",""{} +Model:900867430,"Model::A",""{} +Model:901996281,"Model::A",""{} +Model:902191252,"Model::A",""{} +Model:902530129,"Model::A",""{} +Model:903224930,"Model::A",""{} +Model:903676446,"Model::A",""{} +Model:904432909,"Model::A",""{} +Model:904917695,"Model::A",""{} +Model:906710986,"Model::A",""{} +Model:907955563,"Model::A",""{} +Model:908194174,"Model::A",""{} +Model:909062048,"Model::A",""{} +Model:909332329,"Model::A",""{} +Model:910620642,"Model::A",""{} +Model:910656140,"Model::A",""{} +Model:911043010,"Model::A",""{} +Model:911683427,"Model::A",""{} +Model:912213677,"Model::A",""{} +Model:912263531,"Model::A",""{} +Model:912417034,"Model::A",""{} +Model:912637671,"Model::A",""{} +Model:912750597,"Model::A",""{} +Model:913074533,"Model::A",""{} +Model:913560932,"Model::A",""{} +Model:915159729,"Model::A",""{} +Model:915402618,"Model::A",""{} +Model:919412257,"Model::A",""{} +Model:919466409,"Model::A",""{} +Model:919732426,"Model::A",""{} +Model:919802049,"Model::A",""{} +Model:919935769,"Model::A",""{} +Model:920077489,"Model::A",""{} +Model:920215878,"Model::A",""{} +Model:920999084,"Model::A",""{} +Model:921022099,"Model::A",""{} +Model:923138697,"Model::A",""{} +Model:924399417,"Model::A",""{} +Model:924743343,"Model::A",""{} +Model:925820937,"Model::A",""{} +Model:926066469,"Model::A",""{} +Model:926350807,"Model::A",""{} +Model:926627127,"Model::A",""{} +Model:926944997,"Model::A",""{} +Model:927012331,"Model::A",""{} +Model:927662258,"Model::A",""{} +Model:927834205,"Model::A",""{} +Model:928754306,"Model::A",""{} +Model:929024370,"Model::A",""{} +Model:929045339,"Model::A",""{} +Model:929055197,"Model::A",""{} +Model:929533100,"Model::A",""{} +Model:929747192,"Model::A",""{} +Model:930079052,"Model::A",""{} +Model:930139851,"Model::A",""{} +Model:930207699,"Model::A",""{} +Model:931072694,"Model::A",""{} +Model:931317638,"Model::A",""{} +Model:932633282,"Model::A",""{} +Model:935052943,"Model::A",""{} +Model:935776732,"Model::A",""{} +Model:936070952,"Model::A",""{} +Model:936203134,"Model::A",""{} +Model:936830452,"Model::A",""{} +Model:936987453,"Model::A",""{} +Model:937732650,"Model::A",""{} +Model:938630321,"Model::A",""{} +Model:939015782,"Model::A",""{} +Model:939964057,"Model::A",""{} +Model:940067885,"Model::A",""{} +Model:941339293,"Model::A",""{} +Model:941477559,"Model::A",""{} +Model:941793922,"Model::A",""{} +Model:943023042,"Model::A",""{} +Model:943185076,"Model::A",""{} +Model:943282074,"Model::A",""{} +Model:943333111,"Model::A",""{} +Model:943408645,"Model::A",""{} +Model:944196731,"Model::A",""{} +Model:944442200,"Model::A",""{} +Model:944706453,"Model::A",""{} +Model:945966370,"Model::A",""{} +Model:946223826,"Model::A",""{} +Model:946354338,"Model::A",""{} +Model:947996757,"Model::A",""{} +Model:948996403,"Model::A",""{} +Model:950274207,"Model::A",""{} +Model:950469413,"Model::A",""{} +Model:951336313,"Model::A",""{} +Model:951995667,"Model::A",""{} +Model:952600143,"Model::A",""{} +Model:953128753,"Model::A",""{} +Model:953217407,"Model::A",""{} +Model:953405021,"Model::A",""{} +Model:953590623,"Model::A",""{} +Model:953979299,"Model::A",""{} +Model:955079429,"Model::A",""{} +Model:955944450,"Model::A",""{} +Model:956107869,"Model::A",""{} +Model:956547629,"Model::A",""{} +Model:958661636,"Model::A",""{} +Model:959409141,"Model::A",""{} +Model:959773453,"Model::A",""{} +Model:960272251,"Model::A",""{} +Model:960388890,"Model::A",""{} +Model:961166023,"Model::A",""{} +Model:962714979,"Model::A",""{} +Model:962749633,"Model::A",""{} +Model:963233249,"Model::A",""{} +Model:964771023,"Model::A",""{} +Model:965986054,"Model::A",""{} +Model:966171135,"Model::A",""{} +Model:967280668,"Model::A",""{} +Model:967566967,"Model::A",""{} +Model:967631151,"Model::A",""{} +Model:968686830,"Model::A",""{} +Model:969365879,"Model::A",""{} +Model:969483038,"Model::A",""{} +Model:970702618,"Model::A",""{} +Model:971624483,"Model::A",""{} +Model:972026836,"Model::A",""{} +Model:972180647,"Model::A",""{} +Model:972779273,"Model::A",""{} +Model:973193902,"Model::A",""{} +Model:973289077,"Model::A",""{} +Model:973451830,"Model::A",""{} +Model:973471547,"Model::A",""{} +Model:973903097,"Model::A",""{} +Model:974307774,"Model::A",""{} +Model:974492017,"Model::A",""{} +Model:974523263,"Model::A",""{} +Model:975437857,"Model::A",""{} +Model:975471173,"Model::A",""{} +Model:975509170,"Model::A",""{} +Model:975894383,"Model::A",""{} +Model:977106243,"Model::A",""{} +Model:977747072,"Model::A",""{} +Model:977921134,"Model::A",""{} +Model:978349926,"Model::A",""{} +Model:978848219,"Model::A",""{} +Model:979040474,"Model::A",""{} +Model:979192321,"Model::A",""{} +Model:979608651,"Model::A",""{} +Model:979960442,"Model::A",""{} +Model:981239702,"Model::A",""{} +Model:981410188,"Model::A",""{} +Model:981417788,"Model::A",""{} +Model:982338543,"Model::A",""{} +Model:983266724,"Model::A",""{} +Model:984451042,"Model::A",""{} +Model:984474428,"Model::A",""{} +Model:985445308,"Model::A",""{} +Model:985568461,"Model::A",""{} +Model:985672635,"Model::A",""{} +Model:986062913,"Model::A",""{} +Model:986954237,"Model::A",""{} +Model:987157940,"Model::A",""{} +Model:987365345,"Model::A",""{} +Model:987547748,"Model::A",""{} +Model:987870321,"Model::A",""{} +Model:988524119,"Model::A",""{} +Model:988788652,"Model::A",""{} +Model:989001820,"Model::A",""{} +Model:989101370,"Model::A",""{} +Model:989810125,"Model::A",""{} +Model:990342618,"Model::A",""{} +Model:991543566,"Model::A",""{} +Model:991604893,"Model::A",""{} +Model:991912703,"Model::A",""{} +Model:992932514,"Model::A",""{} +Model:993509875,"Model::A",""{} +Model:994543420,"Model::A",""{} +Model:994694373,"Model::A",""{} +Model:994885627,"Model::A",""{} +Model:995185844,"Model::A",""{} +Model:995550870,"Model::A",""{} +Model:996687800,"Model::A",""{} +Model:997590214,"Model::A",""{} +Model:997617934,"Model::A",""{} +Model:998185833,"Model::A",""{} +Model:998192303,"Model::A",""{} +Model:998449097,"Model::A",""{} +Model:998662132,"Model::A",""{} +Model:999747741,"Model::A",""{} +Model:1000916734,"Model::A",""{} +Model:1001490285,"Model::A",""{} +Model:1001510116,"Model::A",""{} +Model:1002062647,"Model::A",""{} +Model:1002465129,"Model::A",""{} +Model:1002591447,"Model::A",""{} +Model:1002613689,"Model::A",""{} +Model:1004094604,"Model::A",""{} +Model:1004430915,"Model::A",""{} +Model:1004514635,"Model::A",""{} +Model:1004537495,"Model::A",""{} +Model:1004994343,"Model::A",""{} +Model:1005672289,"Model::A",""{} +Model:1006066604,"Model::A",""{} +Model:1007578438,"Model::A",""{} +Model:1007660731,"Model::A",""{} +Model:1009657838,"Model::A",""{} +Model:1009752503,"Model::A",""{} +Model:1010194561,"Model::A",""{} +Model:1011121496,"Model::A",""{} +Model:1011380282,"Model::A",""{} +Model:1011661001,"Model::A",""{} +Model:1011983661,"Model::A",""{} +Model:1014195166,"Model::A",""{} +Model:1015575769,"Model::A",""{} +Model:1016554017,"Model::A",""{} +Model:1017262647,"Model::A",""{} +Model:1017414881,"Model::A",""{} +Model:1017894403,"Model::A",""{} +Model:1018119284,"Model::A",""{} +Model:1018194290,"Model::A",""{} +Model:1018611461,"Model::A",""{} +Model:1019321129,"Model::A",""{} +Model:1020387873,"Model::A",""{} +Model:1022385506,"Model::A",""{} +Model:1022696242,"Model::A",""{} +Model:1023750797,"Model::A",""{} +Model:1023907839,"Model::A",""{} +Model:1024261671,"Model::A",""{} +Model:1024311908,"Model::A",""{} +Model:1025292028,"Model::A",""{} +Model:1025811220,"Model::A",""{} +Model:1026690755,"Model::A",""{} +Model:1026953441,"Model::A",""{} +Model:1027807458,"Model::A",""{} +Model:1028657421,"Model::A",""{} +Model:1028850466,"Model::A",""{} +Model:1029000205,"Model::A",""{} +Model:1029343867,"Model::A",""{} +Model:1029632378,"Model::A",""{} +Model:1031882473,"Model::A",""{} +Model:1034653965,"Model::A",""{} +Model:1034761498,"Model::A",""{} +Model:1035131804,"Model::A",""{} +Model:1035306731,"Model::A",""{} +Model:1037563310,"Model::A",""{} +Model:1038145219,"Model::A",""{} +Model:1039192966,"Model::A",""{} +Model:1039646754,"Model::A",""{} +Model:1040125297,"Model::A",""{} +Model:1040540254,"Model::A",""{} +Model:1040617049,"Model::A",""{} +Model:1041063825,"Model::A",""{} +Model:1041867193,"Model::A",""{} +Model:1043041822,"Model::A",""{} +Model:1043068986,"Model::A",""{} +Model:1043516858,"Model::A",""{} +Model:1043680407,"Model::A",""{} +Model:1043865062,"Model::A",""{} +Model:1044114237,"Model::A",""{} +Model:1044422338,"Model::A",""{} +Model:1045409362,"Model::A",""{} +Model:1046485418,"Model::A",""{} +Model:1046550877,"Model::A",""{} +Model:1046575300,"Model::A",""{} +Model:1047844825,"Model::A",""{} +Model:1050285527,"Model::A",""{} +Model:1050883519,"Model::A",""{} +Model:1052449928,"Model::A",""{} +Model:1053653228,"Model::A",""{} +Model:1053901502,"Model::A",""{} +Model:1054762295,"Model::A",""{} +Model:1055047161,"Model::A",""{} +Model:1055168350,"Model::A",""{} +Model:1055816397,"Model::A",""{} +Model:1056612371,"Model::A",""{} +Model:1056671165,"Model::A",""{} +Model:1057166598,"Model::A",""{} +Model:1058605401,"Model::A",""{} +Model:1059250011,"Model::A",""{} +Model:1059893212,"Model::A",""{} +Model:1060605859,"Model::A",""{} +Model:1062349661,"Model::A",""{} +Model:1062900881,"Model::A",""{} +Model:1063477038,"Model::A",""{} +Model:1067127215,"Model::A",""{} +Model:1067444673,"Model::A",""{} +Model:1068300779,"Model::A",""{} +Model:1068319949,"Model::A",""{} +Model:1068371899,"Model::A",""{} +Model:1069017322,"Model::A",""{} +Model:1069272018,"Model::A",""{} +Model:1070007887,"Model::A",""{} +Model:1071393494,"Model::A",""{} +Model:1071765837,"Model::A",""{} +Model:1072181974,"Model::A",""{} +Model:1072215951,"Model::A",""{} +Model:1072528756,"Model::A",""{} +Model:1072552326,"Model::A",""{} +Model:1073570683,"Model::A",""{} +Model:1074072918,"Model::A",""{} +Model:1074544180,"Model::A",""{} +Model:1074852126,"Model::A",""{} +Model:1077128763,"Model::A",""{} +Model:1077209060,"Model::A",""{} +Model:1077214017,"Model::A",""{} +Model:1077243257,"Model::A",""{} +Model:1078148245,"Model::A",""{} +Model:1078617892,"Model::A",""{} +Model:1080922876,"Model::A",""{} +Model:1081116442,"Model::A",""{} +Model:1081922474,"Model::A",""{} +Model:1082430079,"Model::A",""{} +Model:1083970995,"Model::A",""{} +Model:1084385425,"Model::A",""{} +Model:1084561588,"Model::A",""{} +Model:1085634124,"Model::A",""{} +Model:1085929358,"Model::A",""{} +Model:1086067729,"Model::A",""{} +Model:1086271748,"Model::A",""{} +Model:1088487461,"Model::A",""{} +Model:1090230417,"Model::A",""{} +Model:1090680615,"Model::A",""{} +Model:1090712835,"Model::A",""{} +Model:1092261158,"Model::A",""{} +Model:1092314878,"Model::A",""{} +Model:1092496052,"Model::A",""{} +Model:1092787183,"Model::A",""{} +Model:1093214193,"Model::A",""{} +Model:1093493487,"Model::A",""{} +Model:1093538634,"Model::A",""{} +Model:1094095156,"Model::A",""{} +Model:1096364564,"Model::A",""{} +Model:1098666603,"Model::A",""{} +Model:1098905722,"Model::A",""{} +Model:1098909461,"Model::A",""{} +Model:1099267385,"Model::A",""{} +Model:1099280308,"Model::A",""{} +Model:1099328639,"Model::A",""{} +Model:1099966751,"Model::A",""{} +Model:1100299623,"Model::A",""{} +Model:1100338857,"Model::A",""{} +Model:1100664351,"Model::A",""{} +Model:1100869314,"Model::A",""{} +Model:1101513584,"Model::A",""{} +Model:1103335265,"Model::A",""{} +Model:1103340227,"Model::A",""{} +Model:1103658139,"Model::A",""{} +Model:1104487614,"Model::A",""{} +Model:1105032255,"Model::A",""{} +Model:1106637650,"Model::A",""{} +Model:1106723006,"Model::A",""{} +Model:1107414673,"Model::A",""{} +Model:1107541774,"Model::A",""{} +Model:1108028210,"Model::A",""{} +Model:1109104804,"Model::A",""{} +Model:1109359653,"Model::A",""{} +Model:1111169829,"Model::A",""{} +Model:1111879016,"Model::A",""{} +Model:1113162710,"Model::A",""{} +Model:1115586143,"Model::A",""{} +Model:1116014271,"Model::A",""{} +Model:1116361429,"Model::A",""{} +Model:1116475686,"Model::A",""{} +Model:1117167883,"Model::A",""{} +Model:1117670096,"Model::A",""{} +Model:1117906153,"Model::A",""{} +Model:1119996038,"Model::A",""{} +Model:1121187734,"Model::A",""{} +Model:1121537339,"Model::A",""{} +Model:1122332258,"Model::A",""{} +Model:1122437954,"Model::A",""{} +Model:1122615100,"Model::A",""{} +Model:1123266035,"Model::A",""{} +Model:1123540011,"Model::A",""{} +Model:1124668604,"Model::A",""{} +Model:1124958326,"Model::A",""{} +Model:1129128938,"Model::A",""{} +Model:1130184993,"Model::A",""{} +Model:1130453993,"Model::A",""{} +Model:1133396022,"Model::A",""{} +Model:1134200170,"Model::A",""{} +Model:1134822523,"Model::A",""{} +Model:1135210185,"Model::A",""{} +Model:1137101871,"Model::A",""{} +Model:1137450686,"Model::A",""{} +Model:1137590528,"Model::A",""{} +Model:1138324518,"Model::A",""{} +Model:1138591946,"Model::A",""{} +Model:1139135751,"Model::A",""{} +Model:1139592779,"Model::A",""{} +Model:1139679675,"Model::A",""{} +Model:1140217940,"Model::A",""{} +Model:1143082347,"Model::A",""{} +Model:1143297946,"Model::A",""{} +Model:1143508235,"Model::A",""{} +Model:1143652997,"Model::A",""{} +Model:1144227554,"Model::A",""{} +Model:1144328845,"Model::A",""{} +Model:1145675204,"Model::A",""{} +Model:1146107912,"Model::A",""{} +Model:1147387847,"Model::A",""{} +Model:1147757901,"Model::A",""{} +Model:1147844151,"Model::A",""{} +Model:1150297579,"Model::A",""{} +Model:1152006358,"Model::A",""{} +Model:1152073814,"Model::A",""{} +Model:1152462436,"Model::A",""{} +Model:1152760349,"Model::A",""{} +Model:1153244158,"Model::A",""{} +Model:1153495695,"Model::A",""{} +Model:1153641080,"Model::A",""{} +Model:1153647797,"Model::A",""{} +Model:1153889526,"Model::A",""{} +Model:1154939133,"Model::A",""{} +Model:1155365775,"Model::A",""{} +Model:1155397291,"Model::A",""{} +Model:1155985274,"Model::A",""{} +Model:1156032838,"Model::A",""{} +Model:1156058331,"Model::A",""{} +Model:1156948868,"Model::A",""{} +Model:1157034931,"Model::A",""{} +Model:1157384745,"Model::A",""{} +Model:1157591749,"Model::A",""{} +Model:1158751955,"Model::A",""{} +Model:1159382294,"Model::A",""{} +Model:1160538977,"Model::A",""{} +Model:1161096569,"Model::A",""{} +Model:1161497134,"Model::A",""{} +Model:1161499178,"Model::A",""{} +Model:1161501715,"Model::A",""{} +Model:1162099876,"Model::A",""{} +Model:1162173610,"Model::A",""{} +Model:1162981865,"Model::A",""{} +Model:1164009675,"Model::A",""{} +Model:1164464623,"Model::A",""{} +Model:1165028457,"Model::A",""{} +Model:1165050788,"Model::A",""{} +Model:1167528571,"Model::A",""{} +Model:1168689469,"Model::A",""{} +Model:1168883791,"Model::A",""{} +Model:1169342869,"Model::A",""{} +Model:1169389012,"Model::A",""{} +Model:1170102927,"Model::A",""{} +Model:1170740212,"Model::A",""{} +Model:1170789870,"Model::A",""{} +Model:1173885329,"Model::A",""{} +Model:1174042928,"Model::A",""{} +Model:1175718925,"Model::A",""{} +Model:1176996494,"Model::A",""{} +Model:1177690910,"Model::A",""{} +Model:1177863711,"Model::A",""{} +Model:1178150069,"Model::A",""{} +Model:1183012262,"Model::A",""{} +Model:1183076081,"Model::A",""{} +Model:1183089681,"Model::A",""{} +Model:1183106830,"Model::A",""{} +Model:1183299143,"Model::A",""{} +Model:1185570368,"Model::A",""{} +Model:1188169998,"Model::A",""{} +Model:1188340817,"Model::A",""{} +Model:1188857827,"Model::A",""{} +Model:1190906569,"Model::A",""{} +Model:1192681326,"Model::A",""{} +Model:1193593223,"Model::A",""{} +Model:1194187506,"Model::A",""{} +Model:1194990946,"Model::A",""{} +Model:1195899379,"Model::A",""{} +Model:1195991895,"Model::A",""{} +Model:1196445697,"Model::A",""{} +Model:1196472781,"Model::A",""{} +Model:1197566013,"Model::A",""{} +Model:1199185302,"Model::A",""{} +Model:1199631377,"Model::A",""{} +Model:1200198704,"Model::A",""{} +Model:1200961376,"Model::A",""{} +Model:1201431793,"Model::A",""{} +Model:1201815430,"Model::A",""{} +Model:1202005898,"Model::A",""{} +Model:1202384766,"Model::A",""{} +Model:1202586365,"Model::A",""{} +Model:1203052967,"Model::A",""{} +Model:1203178881,"Model::A",""{} +Model:1204152506,"Model::A",""{} +Model:1204821989,"Model::A",""{} +Model:1204918809,"Model::A",""{} +Model:1204968326,"Model::A",""{} +Model:1205820457,"Model::A",""{} +Model:1206021157,"Model::A",""{} +Model:1206067745,"Model::A",""{} +Model:1206332267,"Model::A",""{} +Model:1206950911,"Model::A",""{} +Model:1206951831,"Model::A",""{} +Model:1207030588,"Model::A",""{} +Model:1207568926,"Model::A",""{} +Model:1207883958,"Model::A",""{} +Model:1208763122,"Model::A",""{} +Model:1210244503,"Model::A",""{} +Model:1211416407,"Model::A",""{} +Model:1211996867,"Model::A",""{} +Model:1212912459,"Model::A",""{} +Model:1213299222,"Model::A",""{} +Model:1213491871,"Model::A",""{} +Model:1214085502,"Model::A",""{} +Model:1214273785,"Model::A",""{} +Model:1215142173,"Model::A",""{} +Model:1215525874,"Model::A",""{} +Model:1215729916,"Model::A",""{} +Model:1215822571,"Model::A",""{} +Model:1216917773,"Model::A",""{} +Model:1219702534,"Model::A",""{} +Model:1219761651,"Model::A",""{} +Model:1220295017,"Model::A",""{} +Model:1221355106,"Model::A",""{} +Model:1222274312,"Model::A",""{} +Model:1222342211,"Model::A",""{} +Model:1222947261,"Model::A",""{} +Model:1223795366,"Model::A",""{} +Model:1224778649,"Model::A",""{} +Model:1224817489,"Model::A",""{} +Model:1225355293,"Model::A",""{} +Model:1226078085,"Model::A",""{} +Model:1226085260,"Model::A",""{} +Model:1226552350,"Model::A",""{} +Model:1226562091,"Model::A",""{} +Model:1226608077,"Model::A",""{} +Model:1226673866,"Model::A",""{} +Model:1226923618,"Model::A",""{} +Model:1226930221,"Model::A",""{} +Model:1227322707,"Model::A",""{} +Model:1227336517,"Model::A",""{} +Model:1227692523,"Model::A",""{} +Model:1228772861,"Model::A",""{} +Model:1229914535,"Model::A",""{} +Model:1229982272,"Model::A",""{} +Model:1230267281,"Model::A",""{} +Model:1230500715,"Model::A",""{} +Model:1230903482,"Model::A",""{} +Model:1230944655,"Model::A",""{} +Model:1231542277,"Model::A",""{} +Model:1233101540,"Model::A",""{} +Model:1233155769,"Model::A",""{} +Model:1233358658,"Model::A",""{} +Model:1233796996,"Model::A",""{} +Model:1234113449,"Model::A",""{} +Model:1235155502,"Model::A",""{} +Model:1235832447,"Model::A",""{} +Model:1236659821,"Model::A",""{} +Model:1237193027,"Model::A",""{} +Model:1237593068,"Model::A",""{} +Model:1237739636,"Model::A",""{} +Model:1237946267,"Model::A",""{} +Model:1238164862,"Model::A",""{} +Model:1238781633,"Model::A",""{} +Model:1239486537,"Model::A",""{} +Model:1239657970,"Model::A",""{} +Model:1241744957,"Model::A",""{} +Model:1243376291,"Model::A",""{} +Model:1243405807,"Model::A",""{} +Model:1243424142,"Model::A",""{} +Model:1244445605,"Model::A",""{} +Model:1247198989,"Model::A",""{} +Model:1247222957,"Model::A",""{} +Model:1247519732,"Model::A",""{} +Model:1248125319,"Model::A",""{} +Model:1248504761,"Model::A",""{} +Model:1248917210,"Model::A",""{} +Model:1249047728,"Model::A",""{} +Model:1249551284,"Model::A",""{} +Model:1252084811,"Model::A",""{} +Model:1253053863,"Model::A",""{} +Model:1256039549,"Model::A",""{} +Model:1256180625,"Model::A",""{} +Model:1256878855,"Model::A",""{} +Model:1256949158,"Model::A",""{} +Model:1257346138,"Model::A",""{} +Model:1257804005,"Model::A",""{} +Model:1258636005,"Model::A",""{} +Model:1258976012,"Model::A",""{} +Model:1259128479,"Model::A",""{} +Model:1259190785,"Model::A",""{} +Model:1259408463,"Model::A",""{} +Model:1261119030,"Model::A",""{} +Model:1261776680,"Model::A",""{} +Model:1261829242,"Model::A",""{} +Model:1263918653,"Model::A",""{} +Model:1264810793,"Model::A",""{} +Model:1265171313,"Model::A",""{} +Model:1265986221,"Model::A",""{} +Model:1267786334,"Model::A",""{} +Model:1269375032,"Model::A",""{} +Model:1269943286,"Model::A",""{} +Model:1271504346,"Model::A",""{} +Model:1272085645,"Model::A",""{} +Model:1273093179,"Model::A",""{} +Model:1273461823,"Model::A",""{} +Model:1273503133,"Model::A",""{} +Model:1273955053,"Model::A",""{} +Model:1273958953,"Model::A",""{} +Model:1274482929,"Model::A",""{} +Model:1274617499,"Model::A",""{} +Model:1274874139,"Model::A",""{} +Model:1275067746,"Model::A",""{} +Model:1275919253,"Model::A",""{} +Model:1276504426,"Model::A",""{} +Model:1276976383,"Model::A",""{} +Model:1276987759,"Model::A",""{} +Model:1277422069,"Model::A",""{} +Model:1279968823,"Model::A",""{} +Model:1283101698,"Model::A",""{} +Model:1284629360,"Model::A",""{} +Model:1285228273,"Model::A",""{} +Model:1285372811,"Model::A",""{} +Model:1286373796,"Model::A",""{} +Model:1287730219,"Model::A",""{} +Model:1287818529,"Model::A",""{} +Model:1288353834,"Model::A",""{} +Model:1289004326,"Model::A",""{} +Model:1289474636,"Model::A",""{} +Model:1290001244,"Model::A",""{} +Model:1291595578,"Model::A",""{} +Model:1291670339,"Model::A",""{} +Model:1293345153,"Model::A",""{} +Model:1293976063,"Model::A",""{} +Model:1295172761,"Model::A",""{} +Model:1296134840,"Model::A",""{} +Model:1296499823,"Model::A",""{} +Model:1297205365,"Model::A",""{} +Model:1298580428,"Model::A",""{} +Model:1298660761,"Model::A",""{} +Model:1298747809,"Model::A",""{} +Model:1299218828,"Model::A",""{} +Model:1299424767,"Model::A",""{} +Model:1299772683,"Model::A",""{} +Model:1300859406,"Model::A",""{} +Model:1301193759,"Model::A",""{} +Model:1301309394,"Model::A",""{} +Model:1301548525,"Model::A",""{} +Model:1303413227,"Model::A",""{} +Model:1303833773,"Model::A",""{} +Model:1303999575,"Model::A",""{} +Model:1305074511,"Model::A",""{} +Model:1305839617,"Model::A",""{} +Model:1306671498,"Model::A",""{} +Model:1306750026,"Model::A",""{} +Model:1308023291,"Model::A",""{} +Model:1308058321,"Model::A",""{} +Model:1308704085,"Model::A",""{} +Model:1309367605,"Model::A",""{} +Model:1310363229,"Model::A",""{} +Model:1311131841,"Model::A",""{} +Model:1311606990,"Model::A",""{} +Model:1311610089,"Model::A",""{} +Model:1313244971,"Model::A",""{} +Model:1313594000,"Model::A",""{} +Model:1313875636,"Model::A",""{} +Model:1313967857,"Model::A",""{} +Model:1314306285,"Model::A",""{} +Model:1314811381,"Model::A",""{} +Model:1316840337,"Model::A",""{} +Model:1317117896,"Model::A",""{} +Model:1317205971,"Model::A",""{} +Model:1317818301,"Model::A",""{} +Model:1318250600,"Model::A",""{} +Model:1318648292,"Model::A",""{} +Model:1319113290,"Model::A",""{} +Model:1320467574,"Model::A",""{} +Model:1321069098,"Model::A",""{} +Model:1321375306,"Model::A",""{} +Model:1321400194,"Model::A",""{} +Model:1321646978,"Model::A",""{} +Model:1321879082,"Model::A",""{} +Model:1322008881,"Model::A",""{} +Model:1322133268,"Model::A",""{} +Model:1322540816,"Model::A",""{} +Model:1323006910,"Model::A",""{} +Model:1323999573,"Model::A",""{} +Model:1324731297,"Model::A",""{} +Model:1325140450,"Model::A",""{} +Model:1325246626,"Model::A",""{} +Model:1327568423,"Model::A",""{} +Model:1328264816,"Model::A",""{} +Model:1328325058,"Model::A",""{} +Model:1328571137,"Model::A",""{} +Model:1328977900,"Model::A",""{} +Model:1329540931,"Model::A",""{} +Model:1329858799,"Model::A",""{} +Model:1331335520,"Model::A",""{} +Model:1331598210,"Model::A",""{} +Model:1332788761,"Model::A",""{} +Model:1332942871,"Model::A",""{} +Model:1333465109,"Model::A",""{} +Model:1333656246,"Model::A",""{} +Model:1335555221,"Model::A",""{} +Model:1335608684,"Model::A",""{} +Model:1336728491,"Model::A",""{} +Model:1336853734,"Model::A",""{} +Model:1337112641,"Model::A",""{} +Model:1337757546,"Model::A",""{} +Model:1337789429,"Model::A",""{} +Model:1339035406,"Model::A",""{} +Model:1339485243,"Model::A",""{} +Model:1340106306,"Model::A",""{} +Model:1340200035,"Model::A",""{} +Model:1340266969,"Model::A",""{} +Model:1341512927,"Model::A",""{} +Model:1341624415,"Model::A",""{} +Model:1341829501,"Model::A",""{} +Model:1342113994,"Model::A",""{} +Model:1342480913,"Model::A",""{} +Model:1342671127,"Model::A",""{} +Model:1343860986,"Model::A",""{} +Model:1344733465,"Model::A",""{} +Model:1345111503,"Model::A",""{} +Model:1345121129,"Model::A",""{} +Model:1345287307,"Model::A",""{} +Model:1345746575,"Model::A",""{} +Model:1346870007,"Model::A",""{} +Model:1347125038,"Model::A",""{} +Model:1347205082,"Model::A",""{} +Model:1347423843,"Model::A",""{} +Model:1348026103,"Model::A",""{} +Model:1350805815,"Model::A",""{} +Model:1351018637,"Model::A",""{} +Model:1351336550,"Model::A",""{} +Model:1351581285,"Model::A",""{} +Model:1352660655,"Model::A",""{} +Model:1352795177,"Model::A",""{} +Model:1352876841,"Model::A",""{} +Model:1352920952,"Model::A",""{} +Model:1353002729,"Model::A",""{} +Model:1353913241,"Model::A",""{} +Model:1354097697,"Model::A",""{} +Model:1354225278,"Model::A",""{} +Model:1354475987,"Model::A",""{} +Model:1354774254,"Model::A",""{} +Model:1355463914,"Model::A",""{} +Model:1355604903,"Model::A",""{} +Model:1358547698,"Model::A",""{} +Model:1359560869,"Model::A",""{} +Model:1359740955,"Model::A",""{} +Model:1360265345,"Model::A",""{} +Model:1361048739,"Model::A",""{} +Model:1361233069,"Model::A",""{} +Model:1361387045,"Model::A",""{} +Model:1361449357,"Model::A",""{} +Model:1362150659,"Model::A",""{} +Model:1362483249,"Model::A",""{} +Model:1362764925,"Model::A",""{} +Model:1363292559,"Model::A",""{} +Model:1363688514,"Model::A",""{} +Model:1364143241,"Model::A",""{} +Model:1364356409,"Model::A",""{} +Model:1365041509,"Model::A",""{} +Model:1365232642,"Model::A",""{} +Model:1367545252,"Model::A",""{} +Model:1367545306,"Model::A",""{} +Model:1367682455,"Model::A",""{} +Model:1368606806,"Model::A",""{} +Model:1369214807,"Model::A",""{} +Model:1370360000,"Model::A",""{} +Model:1370953904,"Model::A",""{} +Model:1371360931,"Model::A",""{} +Model:1371654447,"Model::A",""{} +Model:1371769339,"Model::A",""{} +Model:1371876591,"Model::A",""{} +Model:1373754119,"Model::A",""{} +Model:1373824967,"Model::A",""{} +Model:1373890283,"Model::A",""{} +Model:1375273418,"Model::A",""{} +Model:1375861311,"Model::A",""{} +Model:1375966136,"Model::A",""{} +Model:1377951100,"Model::A",""{} +Model:1378214011,"Model::A",""{} +Model:1378511307,"Model::A",""{} +Model:1378779484,"Model::A",""{} +Model:1379269991,"Model::A",""{} +Model:1379297492,"Model::A",""{} +Model:1379835363,"Model::A",""{} +Model:1379986503,"Model::A",""{} +Model:1380059500,"Model::A",""{} +Model:1380748181,"Model::A",""{} +Model:1381296802,"Model::A",""{} +Model:1381683425,"Model::A",""{} +Model:1382269887,"Model::A",""{} +Model:1382422449,"Model::A",""{} +Model:1382471546,"Model::A",""{} +Model:1382509757,"Model::A",""{} +Model:1383557317,"Model::A",""{} +Model:1384045099,"Model::A",""{} +Model:1385014470,"Model::A",""{} +Model:1385572544,"Model::A",""{} +Model:1385591113,"Model::A",""{} +Model:1386424820,"Model::A",""{} +Model:1387505287,"Model::A",""{} +Model:1387748019,"Model::A",""{} +Model:1387951952,"Model::A",""{} +Model:1388267614,"Model::A",""{} +Model:1388435494,"Model::A",""{} +Model:1388839900,"Model::A",""{} +Model:1388959489,"Model::A",""{} +Model:1389302751,"Model::A",""{} +Model:1390095997,"Model::A",""{} +Model:1390179891,"Model::A",""{} +Model:1391412463,"Model::A",""{} +Model:1391586874,"Model::A",""{} +Model:1393033741,"Model::A",""{} +Model:1393857707,"Model::A",""{} +Model:1393882949,"Model::A",""{} +Model:1393884910,"Model::A",""{} +Model:1393925860,"Model::A",""{} +Model:1393942148,"Model::A",""{} +Model:1394870042,"Model::A",""{} +Model:1395540299,"Model::A",""{} +Model:1395986237,"Model::A",""{} +Model:1396266830,"Model::A",""{} +Model:1397047339,"Model::A",""{} +Model:1397301920,"Model::A",""{} +Model:1397451728,"Model::A",""{} +Model:1397722115,"Model::A",""{} +Model:1397994242,"Model::A",""{} +Model:1398814053,"Model::A",""{} +Model:1399123676,"Model::A",""{} +Model:1399178406,"Model::A",""{} +Model:1399743689,"Model::A",""{} +Model:1399924326,"Model::A",""{} +Model:1400005141,"Model::A",""{} +Model:1400382044,"Model::A",""{} +Model:1401225206,"Model::A",""{} +Model:1401493169,"Model::A",""{} +Model:1401530825,"Model::A",""{} +Model:1401845674,"Model::A",""{} +Model:1402156007,"Model::A",""{} +Model:1402432330,"Model::A",""{} +Model:1402840542,"Model::A",""{} +Model:1402954901,"Model::A",""{} +Model:1402966005,"Model::A",""{} +Model:1403681735,"Model::A",""{} +Model:1404180831,"Model::A",""{} +Model:1405088902,"Model::A",""{} +Model:1405123501,"Model::A",""{} +Model:1405556805,"Model::A",""{} +Model:1405916011,"Model::A",""{} +Model:1406066322,"Model::A",""{} +Model:1407540643,"Model::A",""{} +Model:1409412442,"Model::A",""{} +Model:1409520473,"Model::A",""{} +Model:1410070110,"Model::A",""{} +Model:1410094324,"Model::A",""{} +Model:1410278982,"Model::A",""{} +Model:1412448003,"Model::A",""{} +Model:1413069335,"Model::A",""{} +Model:1413564499,"Model::A",""{} +Model:1413797750,"Model::A",""{} +Model:1415761229,"Model::A",""{} +Model:1416855159,"Model::A",""{} +Model:1417688452,"Model::A",""{} +Model:1418018909,"Model::A",""{} +Model:1419018556,"Model::A",""{} +Model:1419798637,"Model::A",""{} +Model:1419884119,"Model::A",""{} +Model:1421131669,"Model::A",""{} +Model:1422022678,"Model::A",""{} +Model:1422166933,"Model::A",""{} +Model:1425198388,"Model::A",""{} +Model:1425871951,"Model::A",""{} +Model:1426470500,"Model::A",""{} +Model:1427203921,"Model::A",""{} +Model:1430500989,"Model::A",""{} +Model:1430916942,"Model::A",""{} +Model:1431410475,"Model::A",""{} +Model:1433050382,"Model::A",""{} +Model:1433538615,"Model::A",""{} +Model:1433663469,"Model::A",""{} +Model:1434344510,"Model::A",""{} +Model:1434493854,"Model::A",""{} +Model:1434763905,"Model::A",""{} +Model:1434927723,"Model::A",""{} +Model:1435394456,"Model::A",""{} +Model:1436075967,"Model::A",""{} +Model:1436756318,"Model::A",""{} +Model:1437171901,"Model::A",""{} +Model:1437532551,"Model::A",""{} +Model:1437742922,"Model::A",""{} +Model:1438354947,"Model::A",""{} +Model:1438584056,"Model::A",""{} +Model:1439162530,"Model::A",""{} +Model:1441348352,"Model::A",""{} +Model:1441692190,"Model::A",""{} +Model:1442265070,"Model::A",""{} +Model:1443724950,"Model::A",""{} +Model:1444075523,"Model::A",""{} +Model:1444443035,"Model::A",""{} +Model:1444667945,"Model::A",""{} +Model:1444842151,"Model::A",""{} +Model:1446974518,"Model::A",""{} +Model:1447525611,"Model::A",""{} +Model:1447536836,"Model::A",""{} +Model:1447666827,"Model::A",""{} +Model:1447932764,"Model::A",""{} +Model:1448490766,"Model::A",""{} +Model:1449273299,"Model::A",""{} +Model:1449628421,"Model::A",""{} +Model:1449895458,"Model::A",""{} +Model:1450229278,"Model::A",""{} +Model:1450616517,"Model::A",""{} +Model:1451064205,"Model::A",""{} +Model:1451739587,"Model::A",""{} +Model:1452670358,"Model::A",""{} +Model:1453682334,"Model::A",""{} +Model:1453871495,"Model::A",""{} +Model:1454912551,"Model::A",""{} +Model:1454975998,"Model::A",""{} +Model:1456867118,"Model::A",""{} +Model:1457218667,"Model::A",""{} +Model:1457263877,"Model::A",""{} +Model:1457886740,"Model::A",""{} +Model:1457951963,"Model::A",""{} +Model:1458221997,"Model::A",""{} +Model:1458995110,"Model::A",""{} +Model:1459869695,"Model::A",""{} +Model:1460166405,"Model::A",""{} +Model:1460673149,"Model::A",""{} +Model:1461144819,"Model::A",""{} +Model:1461290161,"Model::A",""{} +Model:1461316723,"Model::A",""{} +Model:1461360092,"Model::A",""{} +Model:1461887686,"Model::A",""{} +Model:1461890504,"Model::A",""{} +Model:1464304214,"Model::A",""{} +Model:1464445727,"Model::A",""{} +Model:1465071687,"Model::A",""{} +Model:1465514356,"Model::A",""{} +Model:1466068431,"Model::A",""{} +Model:1466869791,"Model::A",""{} +Model:1467370279,"Model::A",""{} +Model:1468318433,"Model::A",""{} +Model:1468689536,"Model::A",""{} +Model:1471231531,"Model::A",""{} +Model:1471930589,"Model::A",""{} +Model:1472191412,"Model::A",""{} +Model:1472916826,"Model::A",""{} +Model:1474329680,"Model::A",""{} +Model:1474667559,"Model::A",""{} +Model:1475030334,"Model::A",""{} +Model:1475042902,"Model::A",""{} +Model:1475406654,"Model::A",""{} +Model:1476684433,"Model::A",""{} +Model:1477283780,"Model::A",""{} +Model:1477328177,"Model::A",""{} +Model:1477386597,"Model::A",""{} +Model:1477426109,"Model::A",""{} +Model:1477797197,"Model::A",""{} +Model:1478530266,"Model::A",""{} +Model:1478635702,"Model::A",""{} +Model:1480739211,"Model::A",""{} +Model:1480815205,"Model::A",""{} +Model:1480936602,"Model::A",""{} +Model:1480958123,"Model::A",""{} +Model:1482039591,"Model::A",""{} +Model:1482436257,"Model::A",""{} +Model:1482687178,"Model::A",""{} +Model:1482977762,"Model::A",""{} +Model:1483796703,"Model::A",""{} +Model:1485138820,"Model::A",""{} +Model:1485648369,"Model::A",""{} +Model:1486790523,"Model::A",""{} +Model:1487074195,"Model::A",""{} +Model:1487459137,"Model::A",""{} +Model:1487557737,"Model::A",""{} +Model:1487907447,"Model::A",""{} +Model:1488908828,"Model::A",""{} +Model:1490523510,"Model::A",""{} +Model:1490819231,"Model::A",""{} +Model:1491310699,"Model::A",""{} +Model:1492543218,"Model::A",""{} +Model:1492657331,"Model::A",""{} +Model:1492804745,"Model::A",""{} +Model:1493810231,"Model::A",""{} +Model:1493997848,"Model::A",""{} +Model:1494464732,"Model::A",""{} +Model:1495669241,"Model::A",""{} +Model:1495732918,"Model::A",""{} +Model:1496351109,"Model::A",""{} +Model:1496465895,"Model::A",""{} +Model:1496641767,"Model::A",""{} +Model:1496979989,"Model::A",""{} +Model:1497166076,"Model::A",""{} +Model:1497339839,"Model::A",""{} +Model:1497372503,"Model::A",""{} +Model:1499050902,"Model::A",""{} +Model:1500572494,"Model::A",""{} +Model:1501829519,"Model::A",""{} +Model:1503635600,"Model::A",""{} +Model:1504124913,"Model::A",""{} +Model:1504531833,"Model::A",""{} +Model:1504588121,"Model::A",""{} +Model:1504788378,"Model::A",""{} +Model:1505137972,"Model::A",""{} +Model:1505200351,"Model::A",""{} +Model:1505556685,"Model::A",""{} +Model:1505977173,"Model::A",""{} +Model:1506049293,"Model::A",""{} +Model:1507469763,"Model::A",""{} +Model:1507698333,"Model::A",""{} +Model:1508169279,"Model::A",""{} +Model:1508501787,"Model::A",""{} +Model:1508571351,"Model::A",""{} +Model:1508901418,"Model::A",""{} +Model:1510622518,"Model::A",""{} +Model:1511199580,"Model::A",""{} +Model:1512602730,"Model::A",""{} +Model:1513783905,"Model::A",""{} +Model:1514043803,"Model::A",""{} +Model:1514109110,"Model::A",""{} +Model:1514629515,"Model::A",""{} +Model:1514975654,"Model::A",""{} +Model:1515128026,"Model::A",""{} +Model:1515290369,"Model::A",""{} +Model:1516933351,"Model::A",""{} +Model:1517382419,"Model::A",""{} +Model:1517386604,"Model::A",""{} +Model:1517753170,"Model::A",""{} +Model:1518827711,"Model::A",""{} +Model:1519737007,"Model::A",""{} +Model:1520218569,"Model::A",""{} +Model:1520483410,"Model::A",""{} +Model:1520673851,"Model::A",""{} +Model:1521285573,"Model::A",""{} +Model:1521569925,"Model::A",""{} +Model:1521877847,"Model::A",""{} +Model:1522097653,"Model::A",""{} +Model:1522421631,"Model::A",""{} +Model:1522521159,"Model::A",""{} +Model:1525759178,"Model::A",""{} +Model:1527105175,"Model::A",""{} +Model:1527718664,"Model::A",""{} +Model:1528005364,"Model::A",""{} +Model:1528466642,"Model::A",""{} +Model:1528890034,"Model::A",""{} +Model:1529767913,"Model::A",""{} +Model:1529938369,"Model::A",""{} +Model:1530380780,"Model::A",""{} +Model:1530657267,"Model::A",""{} +Model:1531374440,"Model::A",""{} +Model:1531918232,"Model::A",""{} +Model:1533014833,"Model::A",""{} +Model:1533104830,"Model::A",""{} +Model:1533430985,"Model::A",""{} +Model:1533599535,"Model::A",""{} +Model:1535995532,"Model::A",""{} +Model:1536030859,"Model::A",""{} +Model:1536410326,"Model::A",""{} +Model:1537108437,"Model::A",""{} +Model:1537496490,"Model::A",""{} +Model:1539299120,"Model::A",""{} +Model:1539408099,"Model::A",""{} +Model:1540161850,"Model::A",""{} +Model:1540347257,"Model::A",""{} +Model:1540792649,"Model::A",""{} +Model:1540986004,"Model::A",""{} +Model:1542049047,"Model::A",""{} +Model:1542713869,"Model::A",""{} +Model:1543696838,"Model::A",""{} +Model:1543782115,"Model::A",""{} +Model:1544707651,"Model::A",""{} +Model:1545034091,"Model::A",""{} +Model:1547790362,"Model::A",""{} +Model:1547907941,"Model::A",""{} +Model:1548480268,"Model::A",""{} +Model:1548496473,"Model::A",""{} +Model:1548772204,"Model::A",""{} +Model:1549471653,"Model::A",""{} +Model:1549686836,"Model::A",""{} +Model:1550775711,"Model::A",""{} +Model:1550957823,"Model::A",""{} +Model:1551983981,"Model::A",""{} +Model:1552034258,"Model::A",""{} +Model:1552352805,"Model::A",""{} +Model:1553241335,"Model::A",""{} +Model:1553793104,"Model::A",""{} +Model:1554445333,"Model::A",""{} +Model:1554698899,"Model::A",""{} +Model:1556258022,"Model::A",""{} +Model:1556437685,"Model::A",""{} +Model:1557282095,"Model::A",""{} +Model:1558210921,"Model::A",""{} +Model:1558614303,"Model::A",""{} +Model:1559600733,"Model::A",""{} +Model:1559834527,"Model::A",""{} +Model:1560967738,"Model::A",""{} +Model:1562060079,"Model::A",""{} +Model:1562477654,"Model::A",""{} +Model:1562689337,"Model::A",""{} +Model:1564043357,"Model::A",""{} +Model:1564906782,"Model::A",""{} +Model:1565125907,"Model::A",""{} +Model:1566401044,"Model::A",""{} +Model:1566519747,"Model::A",""{} +Model:1566838303,"Model::A",""{} +Model:1567428637,"Model::A",""{} +Model:1567714784,"Model::A",""{} +Model:1567785004,"Model::A",""{} +Model:1567887650,"Model::A",""{} +Model:1569395014,"Model::A",""{} +Model:1569484246,"Model::A",""{} +Model:1570446762,"Model::A",""{} +Model:1571744013,"Model::A",""{} +Model:1572110481,"Model::A",""{} +Model:1572171789,"Model::A",""{} +Model:1572597183,"Model::A",""{} +Model:1572843470,"Model::A",""{} +Model:1575978017,"Model::A",""{} +Model:1576650797,"Model::A",""{} +Model:1576849365,"Model::A",""{} +Model:1577048777,"Model::A",""{} +Model:1578222101,"Model::A",""{} +Model:1579548627,"Model::A",""{} +Model:1579712589,"Model::A",""{} +Model:1579842815,"Model::A",""{} +Model:1580151018,"Model::A",""{} +Model:1580304987,"Model::A",""{} +Model:1581465738,"Model::A",""{} +Model:1581472598,"Model::A",""{} +Model:1581478981,"Model::A",""{} +Model:1581918113,"Model::A",""{} +Model:1582129023,"Model::A",""{} +Model:1582605891,"Model::A",""{} +Model:1583170539,"Model::A",""{} +Model:1583566301,"Model::A",""{} +Model:1584961491,"Model::A",""{} +Model:1586277510,"Model::A",""{} +Model:1587487009,"Model::A",""{} +Model:1587694818,"Model::A",""{} +Model:1589904347,"Model::A",""{} +Model:1590223134,"Model::A",""{} +Model:1590296324,"Model::A",""{} +Model:1590438861,"Model::A",""{} +Model:1590537295,"Model::A",""{} +Model:1590630047,"Model::A",""{} +Model:1591250631,"Model::A",""{} +Model:1592792180,"Model::A",""{} +Model:1592927121,"Model::A",""{} +Model:1593033017,"Model::A",""{} +Model:1593404315,"Model::A",""{} +Model:1593552998,"Model::A",""{} +Model:1593665187,"Model::A",""{} +Model:1596449081,"Model::A",""{} +Model:1597326750,"Model::A",""{} +Model:1597838790,"Model::A",""{} +Model:1598067867,"Model::A",""{} +Model:1598454566,"Model::A",""{} +Model:1600480642,"Model::A",""{} +Model:1600866889,"Model::A",""{} +Model:1601779751,"Model::A",""{} +Model:1602634007,"Model::A",""{} +Model:1604133737,"Model::A",""{} +Model:1604927829,"Model::A",""{} +Model:1605172153,"Model::A",""{} +Model:1605791934,"Model::A",""{} +Model:1606428385,"Model::A",""{} +Model:1606731217,"Model::A",""{} +Model:1607025433,"Model::A",""{} +Model:1608175870,"Model::A",""{} +Model:1608300930,"Model::A",""{} +Model:1608527175,"Model::A",""{} +Model:1609107151,"Model::A",""{} +Model:1609825245,"Model::A",""{} +Model:1610404535,"Model::A",""{} +Model:1611823258,"Model::A",""{} +Model:1612156700,"Model::A",""{} +Model:1612684197,"Model::A",""{} +Model:1614471954,"Model::A",""{} +Model:1614978799,"Model::A",""{} +Model:1615216171,"Model::A",""{} +Model:1615251872,"Model::A",""{} +Model:1615275023,"Model::A",""{} +Model:1615743490,"Model::A",""{} +Model:1616849672,"Model::A",""{} +Model:1616910521,"Model::A",""{} +Model:1617064686,"Model::A",""{} +Model:1617636176,"Model::A",""{} +Model:1618133233,"Model::A",""{} +Model:1618196377,"Model::A",""{} +Model:1618306279,"Model::A",""{} +Model:1618588447,"Model::A",""{} +Model:1619020178,"Model::A",""{} +Model:1619357057,"Model::A",""{} +Model:1619456227,"Model::A",""{} +Model:1621671508,"Model::A",""{} +Model:1622163842,"Model::A",""{} +Model:1622541277,"Model::A",""{} +Model:1623298382,"Model::A",""{} +Model:1624010837,"Model::A",""{} +Model:1625373028,"Model::A",""{} +Model:1625677820,"Model::A",""{} +Model:1626246693,"Model::A",""{} +Model:1626809696,"Model::A",""{} +Model:1627398404,"Model::A",""{} +Model:1627944575,"Model::A",""{} +Model:1628127177,"Model::A",""{} +Model:1628231963,"Model::A",""{} +Model:1628350622,"Model::A",""{} +Model:1629181765,"Model::A",""{} +Model:1629296311,"Model::A",""{} +Model:1629601706,"Model::A",""{} +Model:1630995097,"Model::A",""{} +Model:1631037855,"Model::A",""{} +Model:1631554520,"Model::A",""{} +Model:1631602277,"Model::A",""{} +Model:1631765811,"Model::A",""{} +Model:1632136571,"Model::A",""{} +Model:1632705102,"Model::A",""{} +Model:1633235178,"Model::A",""{} +Model:1633254389,"Model::A",""{} +Model:1633325273,"Model::A",""{} +Model:1633540499,"Model::A",""{} +Model:1633872126,"Model::A",""{} +Model:1634040991,"Model::A",""{} +Model:1634534634,"Model::A",""{} +Model:1634571434,"Model::A",""{} +Model:1635312509,"Model::A",""{} +Model:1636273009,"Model::A",""{} +Model:1636770215,"Model::A",""{} +Model:1637852218,"Model::A",""{} +Model:1638175837,"Model::A",""{} +Model:1638373006,"Model::A",""{} +Model:1638894093,"Model::A",""{} +Model:1639075302,"Model::A",""{} +Model:1640403560,"Model::A",""{} +Model:1640693694,"Model::A",""{} +Model:1641246582,"Model::A",""{} +Model:1642107379,"Model::A",""{} +Model:1642449668,"Model::A",""{} +Model:1642550195,"Model::A",""{} +Model:1642570441,"Model::A",""{} +Model:1643764274,"Model::A",""{} +Model:1643965962,"Model::A",""{} +Model:1646058882,"Model::A",""{} +Model:1647876515,"Model::A",""{} +Model:1648030151,"Model::A",""{} +Model:1648539721,"Model::A",""{} +Model:1649684571,"Model::A",""{} +Model:1650542605,"Model::A",""{} +Model:1651070539,"Model::A",""{} +Model:1651153942,"Model::A",""{} +Model:1652752215,"Model::A",""{} +Model:1652876215,"Model::A",""{} +Model:1653523607,"Model::A",""{} +Model:1654334086,"Model::A",""{} +Model:1654510809,"Model::A",""{} +Model:1654536585,"Model::A",""{} +Model:1655557247,"Model::A",""{} +Model:1655639339,"Model::A",""{} +Model:1655814471,"Model::A",""{} +Model:1656539091,"Model::A",""{} +Model:1657022605,"Model::A",""{} +Model:1657806353,"Model::A",""{} +Model:1658305221,"Model::A",""{} +Model:1658579947,"Model::A",""{} +Model:1658587613,"Model::A",""{} +Model:1658656969,"Model::A",""{} +Model:1658897105,"Model::A",""{} +Model:1659403852,"Model::A",""{} +Model:1659769886,"Model::A",""{} +Model:1660318295,"Model::A",""{} +Model:1661184092,"Model::A",""{} +Model:1663069930,"Model::A",""{} +Model:1664124410,"Model::A",""{} +Model:1664965115,"Model::A",""{} +Model:1665318427,"Model::A",""{} +Model:1665680725,"Model::A",""{} +Model:1666625057,"Model::A",""{} +Model:1667072991,"Model::A",""{} +Model:1667463506,"Model::A",""{} +Model:1667862589,"Model::A",""{} +Model:1668495742,"Model::A",""{} +Model:1668571761,"Model::A",""{} +Model:1669006543,"Model::A",""{} +Model:1669880698,"Model::A",""{} +Model:1670034730,"Model::A",""{} +Model:1670654129,"Model::A",""{} +Model:1670822978,"Model::A",""{} +Model:1670910767,"Model::A",""{} +Model:1671145207,"Model::A",""{} +Model:1671594186,"Model::A",""{} +Model:1672392923,"Model::A",""{} +Model:1672746751,"Model::A",""{} +Model:1673442707,"Model::A",""{} +Model:1673550644,"Model::A",""{} +Model:1673808207,"Model::A",""{} +Model:1675503282,"Model::A",""{} +Model:1676973422,"Model::A",""{} +Model:1678669387,"Model::A",""{} +Model:1678784242,"Model::A",""{} +Model:1679252732,"Model::A",""{} +Model:1680103084,"Model::A",""{} +Model:1680124252,"Model::A",""{} +Model:1682035465,"Model::A",""{} +Model:1682830451,"Model::A",""{} +Model:1683172407,"Model::A",""{} +Model:1684320194,"Model::A",""{} +Model:1684350970,"Model::A",""{} +Model:1684736789,"Model::A",""{} +Model:1685089357,"Model::A",""{} +Model:1685267173,"Model::A",""{} +Model:1685772065,"Model::A",""{} +Model:1685806929,"Model::A",""{} +Model:1686273524,"Model::A",""{} +Model:1688140218,"Model::A",""{} +Model:1688344223,"Model::A",""{} +Model:1689582822,"Model::A",""{} +Model:1689884861,"Model::A",""{} +Model:1690383286,"Model::A",""{} +Model:1690551962,"Model::A",""{} +Model:1691665478,"Model::A",""{} +Model:1692358994,"Model::A",""{} +Model:1692423419,"Model::A",""{} +Model:1692626788,"Model::A",""{} +Model:1693979110,"Model::A",""{} +Model:1693985171,"Model::A",""{} +Model:1695218212,"Model::A",""{} +Model:1695226499,"Model::A",""{} +Model:1695895868,"Model::A",""{} +Model:1696448031,"Model::A",""{} +Model:1696538878,"Model::A",""{} +Model:1697005433,"Model::A",""{} +Model:1697897329,"Model::A",""{} +Model:1698428749,"Model::A",""{} +Model:1699318124,"Model::A",""{} +Model:1699369637,"Model::A",""{} +Model:1701216093,"Model::A",""{} +Model:1702122505,"Model::A",""{} +Model:1702418130,"Model::A",""{} +Model:1702685747,"Model::A",""{} +Model:1704120635,"Model::A",""{} +Model:1705409463,"Model::A",""{} +Model:1706630073,"Model::A",""{} +Model:1706747006,"Model::A",""{} +Model:1707035804,"Model::A",""{} +Model:1707906214,"Model::A",""{} +Model:1708754767,"Model::A",""{} +Model:1709535201,"Model::A",""{} +Model:1709546410,"Model::A",""{} +Model:1710316146,"Model::A",""{} +Model:1711182486,"Model::A",""{} +Model:1711328946,"Model::A",""{} +Model:1711560198,"Model::A",""{} +Model:1712102733,"Model::A",""{} +Model:1713870989,"Model::A",""{} +Model:1713969267,"Model::A",""{} +Model:1713986537,"Model::A",""{} +Model:1714914500,"Model::A",""{} +Model:1716640902,"Model::A",""{} +Model:1717194821,"Model::A",""{} +Model:1717894132,"Model::A",""{} +Model:1718627827,"Model::A",""{} +Model:1718726147,"Model::A",""{} +Model:1719272192,"Model::A",""{} +Model:1719591085,"Model::A",""{} +Model:1719611966,"Model::A",""{} +Model:1720042413,"Model::A",""{} +Model:1720341882,"Model::A",""{} +Model:1720757191,"Model::A",""{} +Model:1721727289,"Model::A",""{} +Model:1722086937,"Model::A",""{} +Model:1722309565,"Model::A",""{} +Model:1722648509,"Model::A",""{} +Model:1723015669,"Model::A",""{} +Model:1723278618,"Model::A",""{} +Model:1724558033,"Model::A",""{} +Model:1727097128,"Model::A",""{} +Model:1727473723,"Model::A",""{} +Model:1728774967,"Model::A",""{} +Model:1730133957,"Model::A",""{} +Model:1730150101,"Model::A",""{} +Model:1730326671,"Model::A",""{} +Model:1731021778,"Model::A",""{} +Model:1731099614,"Model::A",""{} +Model:1731483422,"Model::A",""{} +Model:1732930339,"Model::A",""{} +Model:1733750983,"Model::A",""{} +Model:1734299517,"Model::A",""{} +Model:1735167190,"Model::A",""{} +Model:1735783879,"Model::A",""{} +Model:1735894111,"Model::A",""{} +Model:1737500377,"Model::A",""{} +Model:1737526177,"Model::A",""{} +Model:1737681153,"Model::A",""{} +Model:1738178581,"Model::A",""{} +Model:1739325052,"Model::A",""{} +Model:1739380329,"Model::A",""{} +Model:1739642470,"Model::A",""{} +Model:1742310106,"Model::A",""{} +Model:1742516143,"Model::A",""{} +Model:1742824590,"Model::A",""{} +Model:1742891989,"Model::A",""{} +Model:1743103145,"Model::A",""{} +Model:1743502779,"Model::A",""{} +Model:1743775931,"Model::A",""{} +Model:1744511762,"Model::A",""{} +Model:1744670170,"Model::A",""{} +Model:1744863485,"Model::A",""{} +Model:1744927795,"Model::A",""{} +Model:1745794520,"Model::A",""{} +Model:1745888846,"Model::A",""{} +Model:1745948534,"Model::A",""{} +Model:1746297617,"Model::A",""{} +Model:1746779811,"Model::A",""{} +Model:1746936044,"Model::A",""{} +Model:1746947978,"Model::A",""{} +Model:1747034738,"Model::A",""{} +Model:1747999398,"Model::A",""{} +Model:1748149994,"Model::A",""{} +Model:1748314153,"Model::A",""{} +Model:1750074947,"Model::A",""{} +Model:1751240609,"Model::A",""{} +Model:1751399491,"Model::A",""{} +Model:1752198297,"Model::A",""{} +Model:1753175887,"Model::A",""{} +Model:1753257915,"Model::A",""{} +Model:1753870409,"Model::A",""{} +Model:1754275815,"Model::A",""{} +Model:1754389894,"Model::A",""{} +Model:1754493042,"Model::A",""{} +Model:1754666381,"Model::A",""{} +Model:1754766657,"Model::A",""{} +Model:1755320513,"Model::A",""{} +Model:1756182009,"Model::A",""{} +Model:1757018503,"Model::A",""{} +Model:1757296443,"Model::A",""{} +Model:1757721854,"Model::A",""{} +Model:1759289703,"Model::A",""{} +Model:1760346906,"Model::A",""{} +Model:1760540804,"Model::A",""{} +Model:1761082443,"Model::A",""{} +Model:1761227187,"Model::A",""{} +Model:1761639849,"Model::A",""{} +Model:1763174837,"Model::A",""{} +Model:1763974466,"Model::A",""{} +Model:1764228163,"Model::A",""{} +Model:1765199251,"Model::A",""{} +Model:1765658634,"Model::A",""{} +Model:1766319174,"Model::A",""{} +Model:1766390306,"Model::A",""{} +Model:1767664909,"Model::A",""{} +Model:1768444220,"Model::A",""{} +Model:1769250377,"Model::A",""{} +Model:1769799383,"Model::A",""{} +Model:1769879834,"Model::A",""{} +Model:1771651739,"Model::A",""{} +Model:1772345619,"Model::A",""{} +Model:1772462276,"Model::A",""{} +Model:1772933274,"Model::A",""{} +Model:1773211325,"Model::A",""{} +Model:1774205836,"Model::A",""{} +Model:1774531553,"Model::A",""{} +Model:1774617598,"Model::A",""{} +Model:1775259065,"Model::A",""{} +Model:1775404745,"Model::A",""{} +Model:1775454810,"Model::A",""{} +Model:1777262861,"Model::A",""{} +Model:1777978359,"Model::A",""{} +Model:1778282901,"Model::A",""{} +Model:1778699836,"Model::A",""{} +Model:1778725460,"Model::A",""{} +Model:1779229282,"Model::A",""{} +Model:1779396165,"Model::A",""{} +Model:1779486685,"Model::A",""{} +Model:1781565947,"Model::A",""{} +Model:1781729601,"Model::A",""{} +Model:1782285545,"Model::A",""{} +Model:1783205707,"Model::A",""{} +Model:1783403241,"Model::A",""{} +Model:1783511177,"Model::A",""{} +Model:1783649271,"Model::A",""{} +Model:1784802980,"Model::A",""{} +Model:1785420831,"Model::A",""{} +Model:1785767524,"Model::A",""{} +Model:1786239778,"Model::A",""{} +Model:1786464699,"Model::A",""{} +Model:1787118639,"Model::A",""{} +Model:1787430995,"Model::A",""{} +Model:1787718927,"Model::A",""{} +Model:1788611570,"Model::A",""{} +Model:1789347151,"Model::A",""{} +Model:1789384986,"Model::A",""{} +Model:1790629403,"Model::A",""{} +Model:1790706344,"Model::A",""{} +Model:1791012379,"Model::A",""{} +Model:1793529666,"Model::A",""{} +Model:1795080686,"Model::A",""{} +Model:1795285703,"Model::A",""{} +Model:1795898262,"Model::A",""{} +Model:1797102398,"Model::A",""{} +Model:1797982899,"Model::A",""{} +Model:1798205287,"Model::A",""{} +Model:1799323041,"Model::A",""{} +Model:1799523536,"Model::A",""{} +Model:1799619917,"Model::A",""{} +Model:1799833394,"Model::A",""{} +Model:1800369574,"Model::A",""{} +Model:1800615339,"Model::A",""{} +Model:1800778775,"Model::A",""{} +Model:1800904545,"Model::A",""{} +Model:1801543953,"Model::A",""{} +Model:1802110734,"Model::A",""{} +Model:1803248252,"Model::A",""{} +Model:1803439395,"Model::A",""{} +Model:1803445931,"Model::A",""{} +Model:1803528381,"Model::A",""{} +Model:1803544142,"Model::A",""{} +Model:1803858131,"Model::A",""{} +Model:1804124915,"Model::A",""{} +Model:1805119508,"Model::A",""{} +Model:1805181193,"Model::A",""{} +Model:1805196714,"Model::A",""{} +Model:1805750132,"Model::A",""{} +Model:1805997884,"Model::A",""{} +Model:1806258933,"Model::A",""{} +Model:1806293514,"Model::A",""{} +Model:1807484387,"Model::A",""{} +Model:1807785347,"Model::A",""{} +Model:1808246435,"Model::A",""{} +Model:1808598707,"Model::A",""{} +Model:1808684960,"Model::A",""{} +Model:1808803994,"Model::A",""{} +Model:1808848550,"Model::A",""{} +Model:1809313477,"Model::A",""{} +Model:1809652136,"Model::A",""{} +Model:1810198801,"Model::A",""{} +Model:1811451018,"Model::A",""{} +Model:1811990294,"Model::A",""{} +Model:1812224231,"Model::A",""{} +Model:1812757977,"Model::A",""{} +Model:1813326925,"Model::A",""{} +Model:1814566474,"Model::A",""{} +Model:1815573161,"Model::A",""{} +Model:1815793658,"Model::A",""{} +Model:1817759283,"Model::A",""{} +Model:1817790131,"Model::A",""{} +Model:1819817090,"Model::A",""{} +Model:1820469281,"Model::A",""{} +Model:1820784657,"Model::A",""{} +Model:1821043785,"Model::A",""{} +Model:1821178355,"Model::A",""{} +Model:1821595762,"Model::A",""{} +Model:1821624402,"Model::A",""{} +Model:1821760343,"Model::A",""{} +Model:1821827257,"Model::A",""{} +Model:1822000787,"Model::A",""{} +Model:1822660820,"Model::A",""{} +Model:1822790815,"Model::A",""{} +Model:1823511775,"Model::A",""{} +Model:1823667837,"Model::A",""{} +Model:1823681917,"Model::A",""{} +Model:1824902971,"Model::A",""{} +Model:1825145729,"Model::A",""{} +Model:1825950320,"Model::A",""{} +Model:1827490655,"Model::A",""{} +Model:1827913614,"Model::A",""{} +Model:1828246441,"Model::A",""{} +Model:1830622750,"Model::A",""{} +Model:1830855074,"Model::A",""{} +Model:1831515539,"Model::A",""{} +Model:1831775615,"Model::A",""{} +Model:1831918867,"Model::A",""{} +Model:1832296367,"Model::A",""{} +Model:1833787093,"Model::A",""{} +Model:1834719255,"Model::A",""{} +Model:1834737052,"Model::A",""{} +Model:1834909767,"Model::A",""{} +Model:1836527511,"Model::A",""{} +Model:1837343759,"Model::A",""{} +Model:1838912409,"Model::A",""{} +Model:1840328421,"Model::A",""{} +Model:1840777594,"Model::A",""{} +Model:1841074166,"Model::A",""{} +Model:1841541355,"Model::A",""{} +Model:1841681257,"Model::A",""{} +Model:1841684347,"Model::A",""{} +Model:1841802974,"Model::A",""{} +Model:1842381995,"Model::A",""{} +Model:1842510772,"Model::A",""{} +Model:1845668965,"Model::A",""{} +Model:1845832737,"Model::A",""{} +Model:1846361024,"Model::A",""{} +Model:1846945412,"Model::A",""{} +Model:1847086088,"Model::A",""{} +Model:1847909298,"Model::A",""{} +Model:1848804574,"Model::A",""{} +Model:1849258414,"Model::A",""{} +Model:1849439679,"Model::A",""{} +Model:1852014191,"Model::A",""{} +Model:1852352101,"Model::A",""{} +Model:1853034290,"Model::A",""{} +Model:1853064751,"Model::A",""{} +Model:1853535757,"Model::A",""{} +Model:1853649517,"Model::A",""{} +Model:1853752630,"Model::A",""{} +Model:1854860157,"Model::A",""{} +Model:1855167241,"Model::A",""{} +Model:1856249947,"Model::A",""{} +Model:1856920754,"Model::A",""{} +Model:1857190258,"Model::A",""{} +Model:1857356029,"Model::A",""{} +Model:1857724110,"Model::A",""{} +Model:1858481649,"Model::A",""{} +Model:1859270369,"Model::A",""{} +Model:1859287498,"Model::A",""{} +Model:1860353131,"Model::A",""{} +Model:1860376994,"Model::A",""{} +Model:1860668161,"Model::A",""{} +Model:1861631909,"Model::A",""{} +Model:1861809939,"Model::A",""{} +Model:1862444804,"Model::A",""{} +Model:1863137188,"Model::A",""{} +Model:1863524649,"Model::A",""{} +Model:1863810674,"Model::A",""{} +Model:1865226222,"Model::A",""{} +Model:1867189746,"Model::A",""{} +Model:1867665351,"Model::A",""{} +Model:1867805047,"Model::A",""{} +Model:1868096846,"Model::A",""{} +Model:1868334479,"Model::A",""{} +Model:1868874883,"Model::A",""{} +Model:1868918081,"Model::A",""{} +Model:1868926965,"Model::A",""{} +Model:1868958004,"Model::A",""{} +Model:1869204289,"Model::A",""{} +Model:1869248410,"Model::A",""{} +Model:1869265324,"Model::A",""{} +Model:1869563111,"Model::A",""{} +Model:1869769459,"Model::A",""{} +Model:1870986143,"Model::A",""{} +Model:1871490605,"Model::A",""{} +Model:1872247231,"Model::A",""{} +Model:1872323524,"Model::A",""{} +Model:1873193288,"Model::A",""{} +Model:1873225760,"Model::A",""{} +Model:1873617554,"Model::A",""{} +Model:1873813921,"Model::A",""{} +Model:1874003068,"Model::A",""{} +Model:1874386638,"Model::A",""{} +Model:1874785175,"Model::A",""{} +Model:1874870805,"Model::A",""{} +Model:1875454091,"Model::A",""{} +Model:1875735844,"Model::A",""{} +Model:1875787335,"Model::A",""{} +Model:1876198568,"Model::A",""{} +Model:1876231421,"Model::A",""{} +Model:1876480274,"Model::A",""{} +Model:1877248067,"Model::A",""{} +Model:1877295015,"Model::A",""{} +Model:1878870844,"Model::A",""{} +Model:1881495546,"Model::A",""{} +Model:1882097023,"Model::A",""{} +Model:1882893911,"Model::A",""{} +Model:1883078105,"Model::A",""{} +Model:1885931493,"Model::A",""{} +Model:1886274875,"Model::A",""{} +Model:1886356448,"Model::A",""{} +Model:1886442199,"Model::A",""{} +Model:1886753067,"Model::A",""{} +Model:1887043256,"Model::A",""{} +Model:1887428644,"Model::A",""{} +Model:1887536203,"Model::A",""{} +Model:1888028062,"Model::A",""{} +Model:1888305955,"Model::A",""{} +Model:1888842618,"Model::A",""{} +Model:1888938378,"Model::A",""{} +Model:1889648647,"Model::A",""{} +Model:1889950424,"Model::A",""{} +Model:1890479921,"Model::A",""{} +Model:1890949149,"Model::A",""{} +Model:1891873829,"Model::A",""{} +Model:1892117653,"Model::A",""{} +Model:1892213713,"Model::A",""{} +Model:1892592508,"Model::A",""{} +Model:1893910461,"Model::A",""{} +Model:1894044508,"Model::A",""{} +Model:1894052367,"Model::A",""{} +Model:1894124739,"Model::A",""{} +Model:1894501372,"Model::A",""{} +Model:1894579078,"Model::A",""{} +Model:1895365460,"Model::A",""{} +Model:1895423810,"Model::A",""{} +Model:1896952890,"Model::A",""{} +Model:1897447565,"Model::A",""{} +Model:1897466682,"Model::A",""{} +Model:1898889939,"Model::A",""{} +Model:1899660949,"Model::A",""{} +Model:1899931534,"Model::A",""{} +Model:1902658873,"Model::A",""{} +Model:1903217037,"Model::A",""{} +Model:1903490386,"Model::A",""{} +Model:1903515317,"Model::A",""{} +Model:1903537291,"Model::A",""{} +Model:1903885430,"Model::A",""{} +Model:1904597809,"Model::A",""{} +Model:1905364478,"Model::A",""{} +Model:1905550141,"Model::A",""{} +Model:1907191607,"Model::A",""{} +Model:1907210869,"Model::A",""{} +Model:1907643265,"Model::A",""{} +Model:1908347338,"Model::A",""{} +Model:1908892880,"Model::A",""{} +Model:1909087321,"Model::A",""{} +Model:1909171091,"Model::A",""{} +Model:1910131001,"Model::A",""{} +Model:1910697613,"Model::A",""{} +Model:1911723560,"Model::A",""{} +Model:1912715523,"Model::A",""{} +Model:1912756762,"Model::A",""{} +Model:1912842010,"Model::A",""{} +Model:1913445567,"Model::A",""{} +Model:1913917307,"Model::A",""{} +Model:1913932231,"Model::A",""{} +Model:1914114883,"Model::A",""{} +Model:1914565742,"Model::A",""{} +Model:1914588338,"Model::A",""{} +Model:1915057363,"Model::A",""{} +Model:1915711318,"Model::A",""{} +Model:1918445692,"Model::A",""{} +Model:1919223745,"Model::A",""{} +Model:1919683530,"Model::A",""{} +Model:1920015398,"Model::A",""{} +Model:1921244022,"Model::A",""{} +Model:1921541507,"Model::A",""{} +Model:1922421025,"Model::A",""{} +Model:1923622999,"Model::A",""{} +Model:1923637545,"Model::A",""{} +Model:1924256102,"Model::A",""{} +Model:1924527170,"Model::A",""{} +Model:1924905278,"Model::A",""{} +Model:1924914490,"Model::A",""{} +Model:1924914854,"Model::A",""{} +Model:1925274458,"Model::A",""{} +Model:1927346475,"Model::A",""{} +Model:1927465045,"Model::A",""{} +Model:1928000319,"Model::A",""{} +Model:1928039702,"Model::A",""{} +Model:1928290111,"Model::A",""{} +Model:1928603327,"Model::A",""{} +Model:1930000195,"Model::A",""{} +Model:1930679629,"Model::A",""{} +Model:1931290830,"Model::A",""{} +Model:1931493714,"Model::A",""{} +Model:1931685637,"Model::A",""{} +Model:1932341236,"Model::A",""{} +Model:1932462307,"Model::A",""{} +Model:1932598370,"Model::A",""{} +Model:1933504170,"Model::A",""{} +Model:1933813930,"Model::A",""{} +Model:1934222646,"Model::A",""{} +Model:1934868698,"Model::A",""{} +Model:1935152309,"Model::A",""{} +Model:1935566881,"Model::A",""{} +Model:1936407610,"Model::A",""{} +Model:1936793111,"Model::A",""{} +Model:1936863115,"Model::A",""{} +Model:1937468291,"Model::A",""{} +Model:1937992003,"Model::A",""{} +Model:1938637142,"Model::A",""{} +Model:1938752870,"Model::A",""{} +Model:1940126217,"Model::A",""{} +Model:1940279775,"Model::A",""{} +Model:1941320721,"Model::A",""{} +Model:1941635611,"Model::A",""{} +Model:1942546793,"Model::A",""{} +Model:1943027716,"Model::A",""{} +Model:1946520150,"Model::A",""{} +Model:1948155363,"Model::A",""{} +Model:1949050991,"Model::A",""{} +Model:1950162609,"Model::A",""{} +Model:1950477021,"Model::A",""{} +Model:1951385395,"Model::A",""{} +Model:1953074036,"Model::A",""{} +Model:1953192197,"Model::A",""{} +Model:1953496124,"Model::A",""{} +Model:1955142172,"Model::A",""{} +Model:1955281155,"Model::A",""{} +Model:1955408058,"Model::A",""{} +Model:1955830283,"Model::A",""{} +Model:1956159142,"Model::A",""{} +Model:1956229255,"Model::A",""{} +Model:1956340327,"Model::A",""{} +Model:1957119200,"Model::A",""{} +Model:1957525921,"Model::A",""{} +Model:1959028796,"Model::A",""{} +Model:1959095860,"Model::A",""{} +Model:1959451314,"Model::A",""{} +Model:1960243775,"Model::A",""{} +Model:1961133529,"Model::A",""{} +Model:1961630600,"Model::A",""{} +Model:1962016454,"Model::A",""{} +Model:1962122257,"Model::A",""{} +Model:1963838721,"Model::A",""{} +Model:1963947494,"Model::A",""{} +Model:1964801518,"Model::A",""{} +Model:1965038908,"Model::A",""{} +Model:1966625335,"Model::A",""{} +Model:1967229746,"Model::A",""{} +Model:1967546934,"Model::A",""{} +Model:1967727775,"Model::A",""{} +Model:1968038091,"Model::A",""{} +Model:1968107131,"Model::A",""{} +Model:1968239721,"Model::A",""{} +Model:1968482382,"Model::A",""{} +Model:1968520837,"Model::A",""{} +Model:1968694061,"Model::A",""{} +Model:1968828875,"Model::A",""{} +Model:1968932297,"Model::A",""{} +Model:1969187549,"Model::A",""{} +Model:1970106223,"Model::A",""{} +Model:1970413750,"Model::A",""{} +Model:1971907565,"Model::A",""{} +Model:1972266056,"Model::A",""{} +Model:1972595123,"Model::A",""{} +Model:1972773682,"Model::A",""{} +Model:1973331499,"Model::A",""{} +Model:1973711174,"Model::A",""{} +Model:1975207924,"Model::A",""{} +Model:1975434735,"Model::A",""{} +Model:1976207638,"Model::A",""{} +Model:1976743820,"Model::A",""{} +Model:1976814410,"Model::A",""{} +Model:1977174004,"Model::A",""{} +Model:1977327947,"Model::A",""{} +Model:1977767310,"Model::A",""{} +Model:1978057489,"Model::A",""{} +Model:1978135436,"Model::A",""{} +Model:1978179717,"Model::A",""{} +Model:1978670282,"Model::A",""{} +Model:1978791779,"Model::A",""{} +Model:1979055725,"Model::A",""{} +Model:1979356263,"Model::A",""{} +Model:1979836249,"Model::A",""{} +Model:1981873470,"Model::A",""{} +Model:1982080654,"Model::A",""{} +Model:1982365483,"Model::A",""{} +Model:1982760615,"Model::A",""{} +Model:1982795151,"Model::A",""{} +Model:1982840673,"Model::A",""{} +Model:1985581391,"Model::A",""{} +Model:1986891185,"Model::A",""{} +Model:1987123601,"Model::A",""{} +Model:1987344469,"Model::A",""{} +Model:1989129364,"Model::A",""{} +Model:1989182189,"Model::A",""{} +Model:1990099426,"Model::A",""{} +Model:1991136800,"Model::A",""{} +Model:1991499661,"Model::A",""{} +Model:1991707078,"Model::A",""{} +Model:1992164996,"Model::A",""{} +Model:1992270783,"Model::A",""{} +Model:1993858333,"Model::A",""{} +Model:1994204686,"Model::A",""{} +Model:1994464073,"Model::A",""{} +Model:1994669791,"Model::A",""{} +Model:1995075614,"Model::A",""{} +Model:1995707338,"Model::A",""{} +Model:1996023963,"Model::A",""{} +Model:1996362207,"Model::A",""{} +Model:1997082296,"Model::A",""{} +Model:1997910608,"Model::A",""{} +Model:1999801871,"Model::A",""{} +Model:2000385814,"Model::A",""{} +Model:2000578863,"Model::A",""{} +Model:2001145685,"Model::A",""{} +Model:2001224917,"Model::A",""{} +Model:2003819657,"Model::A",""{} +Model:2004895388,"Model::A",""{} +Model:2004982633,"Model::A",""{} +Model:2005056721,"Model::A",""{} +Model:2005737399,"Model::A",""{} +Model:2005837305,"Model::A",""{} +Model:2006481920,"Model::A",""{} +Model:2007364534,"Model::A",""{} +Model:2007622969,"Model::A",""{} +Model:2007752566,"Model::A",""{} +Model:2007956746,"Model::A",""{} +Model:2009049350,"Model::A",""{} +Model:2009273913,"Model::A",""{} +Model:2010598285,"Model::A",""{} +Model:2011371412,"Model::A",""{} +Model:2011788209,"Model::A",""{} +Model:2013442886,"Model::A",""{} +Model:2015606433,"Model::A",""{} +Model:2016035233,"Model::A",""{} +Model:2016288019,"Model::A",""{} +Model:2016403184,"Model::A",""{} +Model:2017377313,"Model::A",""{} +Model:2017437068,"Model::A",""{} +Model:2017442282,"Model::A",""{} +Model:2017839351,"Model::A",""{} +Model:2017921515,"Model::A",""{} +Model:2018865998,"Model::A",""{} +Model:2019657961,"Model::A",""{} +Model:2020775766,"Model::A",""{} +Model:2020940847,"Model::A",""{} +Model:2021544271,"Model::A",""{} +Model:2021574820,"Model::A",""{} +Model:2022377884,"Model::A",""{} +Model:2023369855,"Model::A",""{} +Model:2023600326,"Model::A",""{} +Model:2024017895,"Model::A",""{} +Model:2024169047,"Model::A",""{} +Model:2024755612,"Model::A",""{} +Model:2024929207,"Model::A",""{} +Model:2025257989,"Model::A",""{} +Model:2025841554,"Model::A",""{} +Model:2025912545,"Model::A",""{} +Model:2026002597,"Model::A",""{} +Model:2026174303,"Model::A",""{} +Model:2026414988,"Model::A",""{} +Model:2026600835,"Model::A",""{} +Model:2027217866,"Model::A",""{} +Model:2028147437,"Model::A",""{} +Model:2028575977,"Model::A",""{} +Model:2029752369,"Model::A",""{} +Model:2030108477,"Model::A",""{} +Model:2031217221,"Model::A",""{} +Model:2031303927,"Model::A",""{} +Model:2031530190,"Model::A",""{} +Model:2032232859,"Model::A",""{} +Model:2032239988,"Model::A",""{} +Model:2032644535,"Model::A",""{} +Model:2033233774,"Model::A",""{} +Model:2034240203,"Model::A",""{} +Model:2036043861,"Model::A",""{} +Model:2036418209,"Model::A",""{} +Model:2036519177,"Model::A",""{} +Model:2036709416,"Model::A",""{} +Model:2036713904,"Model::A",""{} +Model:2038587092,"Model::A",""{} +Model:2038778139,"Model::A",""{} +Model:2038934140,"Model::A",""{} +Model:2040510028,"Model::A",""{} +Model:2044393489,"Model::A",""{} +Model:2046156675,"Model::A",""{} +Model:2046287897,"Model::A",""{} +Model:2047386685,"Model::A",""{} +Model:2047848798,"Model::A",""{} +Model:2048199745,"Model::A",""{} +Model:2048339467,"Model::A",""{} +Model:2049136242,"Model::A",""{} +Model:2049874841,"Model::A",""{} +Model:2050234798,"Model::A",""{} +Model:2050477928,"Model::A",""{} +Model:2051321429,"Model::A",""{} +Model:2051429246,"Model::A",""{} +Model:2052393619,"Model::A",""{} +Model:2052599055,"Model::A",""{} +Model:2053764826,"Model::A",""{} +Model:2054433441,"Model::A",""{} +Model:2054448861,"Model::A",""{} +Model:2055463585,"Model::A",""{} +Model:2055699918,"Model::A",""{} +Model:2056428069,"Model::A",""{} +Model:2057212773,"Model::A",""{} +Model:2057692516,"Model::A",""{} +Model:2057818635,"Model::A",""{} +Model:2058455885,"Model::A",""{} +Model:2058715220,"Model::A",""{} +Model:2058728495,"Model::A",""{} +Model:2059264754,"Model::A",""{} +Model:2059771111,"Model::A",""{} +Model:2060803857,"Model::A",""{} +Model:2061071359,"Model::A",""{} +Model:2061472592,"Model::A",""{} +Model:2061667201,"Model::A",""{} +Model:2061678743,"Model::A",""{} +Model:2061860618,"Model::A",""{} +Model:2062211501,"Model::A",""{} +Model:2062366754,"Model::A",""{} +Model:2062441055,"Model::A",""{} +Model:2062715284,"Model::A",""{} +Model:2063062204,"Model::A",""{} +Model:2063303126,"Model::A",""{} +Model:2063958359,"Model::A",""{} +Model:2064349638,"Model::A",""{} +Model:2064528218,"Model::A",""{} +Model:2064633814,"Model::A",""{} +Model:2065199384,"Model::A",""{} +Model:2065502265,"Model::A",""{} +Model:2065937387,"Model::A",""{} +Model:2066494271,"Model::A",""{} +Model:2067011634,"Model::A",""{} +Model:2067264595,"Model::A",""{} +Model:2067496766,"Model::A",""{} +Model:2067715669,"Model::A",""{} +Model:2067895465,"Model::A",""{} +Model:2068266620,"Model::A",""{} +Model:2068552278,"Model::A",""{} +Model:2069387330,"Model::A",""{} +Model:2069965503,"Model::A",""{} +Model:2070133549,"Model::A",""{} +Model:2070247709,"Model::A",""{} +Model:2070605271,"Model::A",""{} +Model:2070741225,"Model::A",""{} +Model:2071144711,"Model::A",""{} +Model:2072892394,"Model::A",""{} +Model:2073157130,"Model::A",""{} +Model:2073267977,"Model::A",""{} +Model:2073509129,"Model::A",""{} +Model:2073819797,"Model::A",""{} +Model:2075441558,"Model::A",""{} +Model:2075657430,"Model::A",""{} +Model:2076107313,"Model::A",""{} +Model:2076336484,"Model::A",""{} +Model:2076380570,"Model::A",""{} +Model:2076652979,"Model::A",""{} +Model:2077483791,"Model::A",""{} +Model:2078334567,"Model::A",""{} +Model:2078407517,"Model::A",""{} +Model:2079517710,"Model::A",""{} +Model:2079655409,"Model::A",""{} +Model:2080169222,"Model::A",""{} +Model:2080525531,"Model::A",""{} +Model:2080548316,"Model::A",""{} +Model:2080652166,"Model::A",""{} +Model:2080703211,"Model::A",""{} +Model:2081864839,"Model::A",""{} +Model:2082079304,"Model::A",""{} +Model:2082357968,"Model::A",""{} +Model:2082968044,"Model::A",""{} +Model:2083031021,"Model::A",""{} +Model:2084062805,"Model::A",""{} +Model:2084852934,"Model::A",""{} +Model:2085264148,"Model::A",""{} +Model:2085989427,"Model::A",""{} +Model:2086755244,"Model::A",""{} +Model:2086995077,"Model::A",""{} +Model:2088923959,"Model::A",""{} +Model:2089207247,"Model::A",""{} +Model:2089373271,"Model::A",""{} +Model:2089408679,"Model::A",""{} +Model:2089675603,"Model::A",""{} +Model:2090654655,"Model::A",""{} +Model:2090685172,"Model::A",""{} +Model:2091834389,"Model::A",""{} +Model:2092656145,"Model::A",""{} +Model:2093272186,"Model::A",""{} +Model:2093341231,"Model::A",""{} +Model:2093736110,"Model::A",""{} +Model:2094505924,"Model::A",""{} +Model:2095548945,"Model::A",""{} +Model:2097224786,"Model::A",""{} +Model:2097576529,"Model::A",""{} +Model:2097631226,"Model::A",""{} +Model:2097948361,"Model::A",""{} +Model:2098869618,"Model::A",""{} +Model:2098964966,"Model::A",""{} +Model:2098967995,"Model::A",""{} +Model:2099466527,"Model::A",""{} +Model:2099639206,"Model::A",""{} +Model:2099711030,"Model::A",""{} +Model:2100567771,"Model::A",""{} +Model:2101963829,"Model::A",""{} +Model:2102155448,"Model::A",""{} +Model:2102337820,"Model::A",""{} +Model:2104310500,"Model::A",""{} +Model:2104582854,"Model::A",""{} +Model:2105249374,"Model::A",""{} +Model:2105379167,"Model::A",""{} +Model:2105736638,"Model::A",""{} +Model:2106173101,"Model::A",""{} +Model:2106175554,"Model::A",""{} +Model:2106469071,"Model::A",""{} +Model:2106801311,"Model::A",""{} +Model:2107161541,"Model::A",""{} +Model:2107720493,"Model::A",""{} +Model:2108712752,"Model::A",""{} +Model:2108820301,"Model::A",""{} +Model:2108927907,"Model::A",""{} +Model:2109333657,"Model::A",""{} +Model:2109856085,"Model::A",""{} +Model:2110149402,"Model::A",""{} +Model:2110260781,"Model::A",""{} +Model:2110362774,"Model::A",""{} +Model:2111585815,"Model::A",""{} +Model:2112304341,"Model::A",""{} +Model:2112375155,"Model::A",""{} +Model:2112773834,"Model::A",""{} +Model:2112971442,"Model::A",""{} +Model:2113601758,"Model::A",""{} +Model:2113948462,"Model::A",""{} +Model:2114689106,"Model::A",""{} +Model:2114930597,"Model::A",""{} +Model:2116370372,"Model::A",""{} +Model:2119249626,"Model::A",""{} +Model:2119371737,"Model::A",""{} +Model:2119918472,"Model::A",""{} +Model:2120180599,"Model::A",""{} +Model:2120285749,"Model::A",""{} +Model:2121025191,"Model::A",""{} +Model:2121505580,"Model::A",""{} +Model:2122149121,"Model::A",""{} +Model:2122284891,"Model::A",""{} +Model:2122359831,"Model::A",""{} +Model:2123171686,"Model::A",""{} +Model:2123545185,"Model::A",""{} +Model:2124033441,"Model::A",""{} +Model:2124866193,"Model::A",""{} +Model:2125841372,"Model::A",""{} +Model:2126563922,"Model::A",""{} +Model:2127492103,"Model::A",""{} +Model:2128079607,"Model::A",""{} +Model:2129184028,"Model::A",""{} +Model:2129335634,"Model::A",""{} +Model:2130295231,"Model::A",""{} +Model:2131757677,"Model::A",""{} +Model:2132459262,"Model::A",""{} +Model:2134270100,"Model::A",""{} +Model:2134998811,"Model::A",""{} +Model:2135437658,"Model::A",""{} +Model:2135701514,"Model::A",""{} +Model:2136121141,"Model::A",""{} +Model:2136320422,"Model::A",""{} +Model:2139059108,"Model::A",""{} +Model:2139155542,"Model::A",""{} +Model:2139248545,"Model::A",""{} +Model:2139590883,"Model::A",""{} +Model:2140610492,"Model::A",""{} +Model:2140782293,"Model::A",""{} +Model:2141111348,"Model::A",""{} +Model:2141379647,"Model::A",""{} +Model:2142934097,"Model::A",""{} +Model:2145113543,"Model::A",""{} +Model:2145804581,"Model::A",""{} +Model:2146164345,"Model::A",""{} +Model:2146224268,"Model::A",""{} +Model:2146640383,"Model::A",""{} +Model:2146674630,"Model::A",""{} +Model:2147904195,"Model::A",""{} +Model:2148586252,"Model::A",""{} +Model:2148910199,"Model::A",""{} +Model:2149030365,"Model::A",""{} +Model:2149052663,"Model::A",""{} +Model:2149621823,"Model::A",""{} +Model:2149652319,"Model::A",""{} +Model:2149673957,"Model::A",""{} +Model:2149726754,"Model::A",""{} +Model:2149917699,"Model::A",""{} +Model:2150346166,"Model::A",""{} +Model:2150414465,"Model::A",""{} +Model:2150439700,"Model::A",""{} +Model:2150503291,"Model::A",""{} +Model:2150646489,"Model::A",""{} +Model:2150772939,"Model::A",""{} +Model:2151208774,"Model::A",""{} +Model:2151896910,"Model::A",""{} +Model:2152187768,"Model::A",""{} +Model:2152316413,"Model::A",""{} +Model:2152568969,"Model::A",""{} +Model:2152693629,"Model::A",""{} +Model:2156617162,"Model::A",""{} +Model:2161769894,"Model::A",""{} +Model:2161807053,"Model::A",""{} +Model:2162077067,"Model::A",""{} +Model:2162193355,"Model::A",""{} +Model:2162472253,"Model::A",""{} +Model:2163104840,"Model::A",""{} +Model:2163356659,"Model::A",""{} +Model:2164324650,"Model::A",""{} +Model:2164341409,"Model::A",""{} +Model:2165198165,"Model::A",""{} +Model:2165257555,"Model::A",""{} +Model:2165484488,"Model::A",""{} +Model:2166052889,"Model::A",""{} +Model:2166533283,"Model::A",""{} +Model:2166559118,"Model::A",""{} +Model:2166888133,"Model::A",""{} +Model:2167269921,"Model::A",""{} +Model:2167481058,"Model::A",""{} +Model:2168272518,"Model::A",""{} +Model:2168648158,"Model::A",""{} +Model:2169977801,"Model::A",""{} +Model:2170528438,"Model::A",""{} +Model:2170569763,"Model::A",""{} +Model:2171308215,"Model::A",""{} +Model:2171714912,"Model::A",""{} +Model:2171721003,"Model::A",""{} +Model:2171746423,"Model::A",""{} +Model:2172830885,"Model::A",""{} +Model:2173179121,"Model::A",""{} +Model:2174082289,"Model::A",""{} +Model:2174643979,"Model::A",""{} +Model:2175381013,"Model::A",""{} +Model:2175462601,"Model::A",""{} +Model:2175877531,"Model::A",""{} +Model:2176171084,"Model::A",""{} +Model:2177095711,"Model::A",""{} +Model:2177365636,"Model::A",""{} +Model:2177786081,"Model::A",""{} +Model:2177799340,"Model::A",""{} +Model:2178058990,"Model::A",""{} +Model:2178248779,"Model::A",""{} +Model:2178718166,"Model::A",""{} +Model:2179201253,"Model::A",""{} +Model:2179302809,"Model::A",""{} +Model:2179764238,"Model::A",""{} +Model:2180857469,"Model::A",""{} +Model:2181271917,"Model::A",""{} +Model:2181299558,"Model::A",""{} +Model:2182573777,"Model::A",""{} +Model:2182988003,"Model::A",""{} +Model:2183258454,"Model::A",""{} +Model:2183269373,"Model::A",""{} +Model:2184457828,"Model::A",""{} +Model:2185305638,"Model::A",""{} +Model:2186201166,"Model::A",""{} +Model:2186379646,"Model::A",""{} +Model:2186891997,"Model::A",""{} +Model:2188291007,"Model::A",""{} +Model:2188360753,"Model::A",""{} +Model:2188460195,"Model::A",""{} +Model:2189442678,"Model::A",""{} +Model:2189811325,"Model::A",""{} +Model:2190504439,"Model::A",""{} +Model:2191479700,"Model::A",""{} +Model:2191672049,"Model::A",""{} +Model:2192656421,"Model::A",""{} +Model:2192937017,"Model::A",""{} +Model:2194036646,"Model::A",""{} +Model:2194428873,"Model::A",""{} +Model:2194618451,"Model::A",""{} +Model:2194942013,"Model::A",""{} +Model:2196132089,"Model::A",""{} +Model:2198102480,"Model::A",""{} +Model:2198982122,"Model::A",""{} +Model:2199066477,"Model::A",""{} +Model:2199255755,"Model::A",""{} +Model:2199475633,"Model::A",""{} +Model:2200142481,"Model::A",""{} +Model:2201568391,"Model::A",""{} +Model:2201677366,"Model::A",""{} +Model:2203116867,"Model::A",""{} +Model:2204599542,"Model::A",""{} +Model:2204852845,"Model::A",""{} +Model:2205349387,"Model::A",""{} +Model:2205644217,"Model::A",""{} +Model:2205940808,"Model::A",""{} +Model:2205989305,"Model::A",""{} +Model:2206123257,"Model::A",""{} +Model:2206979434,"Model::A",""{} +Model:2207142027,"Model::A",""{} +Model:2207303566,"Model::A",""{} +Model:2207899567,"Model::A",""{} +Model:2207908701,"Model::A",""{} +Model:2209005644,"Model::A",""{} +Model:2209782316,"Model::A",""{} +Model:2209801898,"Model::A",""{} +Model:2210277123,"Model::A",""{} +Model:2210370134,"Model::A",""{} +Model:2210431787,"Model::A",""{} +Model:2211153484,"Model::A",""{} +Model:2212878583,"Model::A",""{} +Model:2212900493,"Model::A",""{} +Model:2213260370,"Model::A",""{} +Model:2213376117,"Model::A",""{} +Model:2213502858,"Model::A",""{} +Model:2214687860,"Model::A",""{} +Model:2216752706,"Model::A",""{} +Model:2218110713,"Model::A",""{} +Model:2218804047,"Model::A",""{} +Model:2219700453,"Model::A",""{} +Model:2221644212,"Model::A",""{} +Model:2222616471,"Model::A",""{} +Model:2224126191,"Model::A",""{} +Model:2224213400,"Model::A",""{} +Model:2224839020,"Model::A",""{} +Model:2226157642,"Model::A",""{} +Model:2227413434,"Model::A",""{} +Model:2228145726,"Model::A",""{} +Model:2228925537,"Model::A",""{} +Model:2230284691,"Model::A",""{} +Model:2231717469,"Model::A",""{} +Model:2231756278,"Model::A",""{} +Model:2232562355,"Model::A",""{} +Model:2232935059,"Model::A",""{} +Model:2233066127,"Model::A",""{} +Model:2233474113,"Model::A",""{} +Model:2234147269,"Model::A",""{} +Model:2235360767,"Model::A",""{} +Model:2236339498,"Model::A",""{} +Model:2236442959,"Model::A",""{} +Model:2237273427,"Model::A",""{} +Model:2237503451,"Model::A",""{} +Model:2237531978,"Model::A",""{} +Model:2237636597,"Model::A",""{} +Model:2237892966,"Model::A",""{} +Model:2237915430,"Model::A",""{} +Model:2238275443,"Model::A",""{} +Model:2238849447,"Model::A",""{} +Model:2239176867,"Model::A",""{} +Model:2240053107,"Model::A",""{} +Model:2240427646,"Model::A",""{} +Model:2240868382,"Model::A",""{} +Model:2240916623,"Model::A",""{} +Model:2241710083,"Model::A",""{} +Model:2242433938,"Model::A",""{} +Model:2243143902,"Model::A",""{} +Model:2244504249,"Model::A",""{} +Model:2244569099,"Model::A",""{} +Model:2246908979,"Model::A",""{} +Model:2247114645,"Model::A",""{} +Model:2247448540,"Model::A",""{} +Model:2248177004,"Model::A",""{} +Model:2248863200,"Model::A",""{} +Model:2249206324,"Model::A",""{} +Model:2249364501,"Model::A",""{} +Model:2250170569,"Model::A",""{} +Model:2250483029,"Model::A",""{} +Model:2252191541,"Model::A",""{} +Model:2252429642,"Model::A",""{} +Model:2252719525,"Model::A",""{} +Model:2253254900,"Model::A",""{} +Model:2253277268,"Model::A",""{} +Model:2253342811,"Model::A",""{} +Model:2254987401,"Model::A",""{} +Model:2255118483,"Model::A",""{} +Model:2255674502,"Model::A",""{} +Model:2256929812,"Model::A",""{} +Model:2258758255,"Model::A",""{} +Model:2259203867,"Model::A",""{} +Model:2259372977,"Model::A",""{} +Model:2260043463,"Model::A",""{} +Model:2260542699,"Model::A",""{} +Model:2261080267,"Model::A",""{} +Model:2261402759,"Model::A",""{} +Model:2262308698,"Model::A",""{} +Model:2262376123,"Model::A",""{} +Model:2263434628,"Model::A",""{} +Model:2264714055,"Model::A",""{} +Model:2264882521,"Model::A",""{} +Model:2264940296,"Model::A",""{} +Model:2265339470,"Model::A",""{} +Model:2265576689,"Model::A",""{} +Model:2265663085,"Model::A",""{} +Model:2266320875,"Model::A",""{} +Model:2266423797,"Model::A",""{} +Model:2267587226,"Model::A",""{} +Model:2267838845,"Model::A",""{} +Model:2267945891,"Model::A",""{} +Model:2268051003,"Model::A",""{} +Model:2268133118,"Model::A",""{} +Model:2268400156,"Model::A",""{} +Model:2268537078,"Model::A",""{} +Model:2268627413,"Model::A",""{} +Model:2268786513,"Model::A",""{} +Model:2269869741,"Model::A",""{} +Model:2269987876,"Model::A",""{} +Model:2270222998,"Model::A",""{} +Model:2272163379,"Model::A",""{} +Model:2272284862,"Model::A",""{} +Model:2272386200,"Model::A",""{} +Model:2272460670,"Model::A",""{} +Model:2273318653,"Model::A",""{} +Model:2273430550,"Model::A",""{} +Model:2273598507,"Model::A",""{} +Model:2274930673,"Model::A",""{} +Model:2275313297,"Model::A",""{} +Model:2275547237,"Model::A",""{} +Model:2276628291,"Model::A",""{} +Model:2276648225,"Model::A",""{} +Model:2277000271,"Model::A",""{} +Model:2278298446,"Model::A",""{} +Model:2278520096,"Model::A",""{} +Model:2278763930,"Model::A",""{} +Model:2279163467,"Model::A",""{} +Model:2279323899,"Model::A",""{} +Model:2281180806,"Model::A",""{} +Model:2283314474,"Model::A",""{} +Model:2283374362,"Model::A",""{} +Model:2283706299,"Model::A",""{} +Model:2284600505,"Model::A",""{} +Model:2285386427,"Model::A",""{} +Model:2285457818,"Model::A",""{} +Model:2285615598,"Model::A",""{} +Model:2286345585,"Model::A",""{} +Model:2286386269,"Model::A",""{} +Model:2286548657,"Model::A",""{} +Model:2287863054,"Model::A",""{} +Model:2287938135,"Model::A",""{} +Model:2288008615,"Model::A",""{} +Model:2289926742,"Model::A",""{} +Model:2289945993,"Model::A",""{} +Model:2290131638,"Model::A",""{} +Model:2290190930,"Model::A",""{} +Model:2290764538,"Model::A",""{} +Model:2291546570,"Model::A",""{} +Model:2291762228,"Model::A",""{} +Model:2293130917,"Model::A",""{} +Model:2293270553,"Model::A",""{} +Model:2293313579,"Model::A",""{} +Model:2293515721,"Model::A",""{} +Model:2294373671,"Model::A",""{} +Model:2294871244,"Model::A",""{} +Model:2295195511,"Model::A",""{} +Model:2296260046,"Model::A",""{} +Model:2296814130,"Model::A",""{} +Model:2297140508,"Model::A",""{} +Model:2297308053,"Model::A",""{} +Model:2297353119,"Model::A",""{} +Model:2298012283,"Model::A",""{} +Model:2298276647,"Model::A",""{} +Model:2300082006,"Model::A",""{} +Model:2300962054,"Model::A",""{} +Model:2301118750,"Model::A",""{} +Model:2302347716,"Model::A",""{} +Model:2302435637,"Model::A",""{} +Model:2302725125,"Model::A",""{} +Model:2303467227,"Model::A",""{} +Model:2304160891,"Model::A",""{} +Model:2304572878,"Model::A",""{} +Model:2304598753,"Model::A",""{} +Model:2305645037,"Model::A",""{} +Model:2306106379,"Model::A",""{} +Model:2306358406,"Model::A",""{} +Model:2307586491,"Model::A",""{} +Model:2307878382,"Model::A",""{} +Model:2308901782,"Model::A",""{} +Model:2309969483,"Model::A",""{} +Model:2310568803,"Model::A",""{} +Model:2311830197,"Model::A",""{} +Model:2311930514,"Model::A",""{} +Model:2312094370,"Model::A",""{} +Model:2312468670,"Model::A",""{} +Model:2313085681,"Model::A",""{} +Model:2315491051,"Model::A",""{} +Model:2315667326,"Model::A",""{} +Model:2315725937,"Model::A",""{} +Model:2316367611,"Model::A",""{} +Model:2316520060,"Model::A",""{} +Model:2317439601,"Model::A",""{} +Model:2318573677,"Model::A",""{} +Model:2318629653,"Model::A",""{} +Model:2319132187,"Model::A",""{} +Model:2320082548,"Model::A",""{} +Model:2321024668,"Model::A",""{} +Model:2321047124,"Model::A",""{} +Model:2321367560,"Model::A",""{} +Model:2321419982,"Model::A",""{} +Model:2321524398,"Model::A",""{} +Model:2321539629,"Model::A",""{} +Model:2321795731,"Model::A",""{} +Model:2321960930,"Model::A",""{} +Model:2322932279,"Model::A",""{} +Model:2324497869,"Model::A",""{} +Model:2324578378,"Model::A",""{} +Model:2325882774,"Model::A",""{} +Model:2326554285,"Model::A",""{} +Model:2326673326,"Model::A",""{} +Model:2326795487,"Model::A",""{} +Model:2327594509,"Model::A",""{} +Model:2327810271,"Model::A",""{} +Model:2328023346,"Model::A",""{} +Model:2328364966,"Model::A",""{} +Model:2330725838,"Model::A",""{} +Model:2330922569,"Model::A",""{} +Model:2331351574,"Model::A",""{} +Model:2331441834,"Model::A",""{} +Model:2332251416,"Model::A",""{} +Model:2334273482,"Model::A",""{} +Model:2334501622,"Model::A",""{} +Model:2334699365,"Model::A",""{} +Model:2335320022,"Model::A",""{} +Model:2335511523,"Model::A",""{} +Model:2336867093,"Model::A",""{} +Model:2336900049,"Model::A",""{} +Model:2337882347,"Model::A",""{} +Model:2338069070,"Model::A",""{} +Model:2338678817,"Model::A",""{} +Model:2339292414,"Model::A",""{} +Model:2339871122,"Model::A",""{} +Model:2340257373,"Model::A",""{} +Model:2341124581,"Model::A",""{} +Model:2342319693,"Model::A",""{} +Model:2342965588,"Model::A",""{} +Model:2343187420,"Model::A",""{} +Model:2343202667,"Model::A",""{} +Model:2343697369,"Model::A",""{} +Model:2344516324,"Model::A",""{} +Model:2345152509,"Model::A",""{} +Model:2345538753,"Model::A",""{} +Model:2346429747,"Model::A",""{} +Model:2346891032,"Model::A",""{} +Model:2347189472,"Model::A",""{} +Model:2347330839,"Model::A",""{} +Model:2347952321,"Model::A",""{} +Model:2348481211,"Model::A",""{} +Model:2348545005,"Model::A",""{} +Model:2352207643,"Model::A",""{} +Model:2352638973,"Model::A",""{} +Model:2352806118,"Model::A",""{} +Model:2353516074,"Model::A",""{} +Model:2353823114,"Model::A",""{} +Model:2354419665,"Model::A",""{} +Model:2354637651,"Model::A",""{} +Model:2354658171,"Model::A",""{} +Model:2355419886,"Model::A",""{} +Model:2355568878,"Model::A",""{} +Model:2355739339,"Model::A",""{} +Model:2355767921,"Model::A",""{} +Model:2355861750,"Model::A",""{} +Model:2355980727,"Model::A",""{} +Model:2356827969,"Model::A",""{} +Model:2358585439,"Model::A",""{} +Model:2360671305,"Model::A",""{} +Model:2361299451,"Model::A",""{} +Model:2361723453,"Model::A",""{} +Model:2362700564,"Model::A",""{} +Model:2363014916,"Model::A",""{} +Model:2363199748,"Model::A",""{} +Model:2363247606,"Model::A",""{} +Model:2363538892,"Model::A",""{} +Model:2363901042,"Model::A",""{} +Model:2364700429,"Model::A",""{} +Model:2364791670,"Model::A",""{} +Model:2364904686,"Model::A",""{} +Model:2365641461,"Model::A",""{} +Model:2366336579,"Model::A",""{} +Model:2368431729,"Model::A",""{} +Model:2369711361,"Model::A",""{} +Model:2369969254,"Model::A",""{} +Model:2370399469,"Model::A",""{} +Model:2370836758,"Model::A",""{} +Model:2372210205,"Model::A",""{} +Model:2373844007,"Model::A",""{} +Model:2374513710,"Model::A",""{} +Model:2374761484,"Model::A",""{} +Model:2374907238,"Model::A",""{} +Model:2374978495,"Model::A",""{} +Model:2376158289,"Model::A",""{} +Model:2376482576,"Model::A",""{} +Model:2376525529,"Model::A",""{} +Model:2376740333,"Model::A",""{} +Model:2377125599,"Model::A",""{} +Model:2377485655,"Model::A",""{} +Model:2379235655,"Model::A",""{} +Model:2379301618,"Model::A",""{} +Model:2380629162,"Model::A",""{} +Model:2381025786,"Model::A",""{} +Model:2381059511,"Model::A",""{} +Model:2381887734,"Model::A",""{} +Model:2381895134,"Model::A",""{} +Model:2383055629,"Model::A",""{} +Model:2383763902,"Model::A",""{} +Model:2384293915,"Model::A",""{} +Model:2384829013,"Model::A",""{} +Model:2385135741,"Model::A",""{} +Model:2385207632,"Model::A",""{} +Model:2385216764,"Model::A",""{} +Model:2385334105,"Model::A",""{} +Model:2385553880,"Model::A",""{} +Model:2386493278,"Model::A",""{} +Model:2386747795,"Model::A",""{} +Model:2386833659,"Model::A",""{} +Model:2387951694,"Model::A",""{} +Model:2388632077,"Model::A",""{} +Model:2388642607,"Model::A",""{} +Model:2390955986,"Model::A",""{} +Model:2392151229,"Model::A",""{} +Model:2392572318,"Model::A",""{} +Model:2392854545,"Model::A",""{} +Model:2392999683,"Model::A",""{} +Model:2393650843,"Model::A",""{} +Model:2394584542,"Model::A",""{} +Model:2394782665,"Model::A",""{} +Model:2396138936,"Model::A",""{} +Model:2396918535,"Model::A",""{} +Model:2397421538,"Model::A",""{} +Model:2397782051,"Model::A",""{} +Model:2398110475,"Model::A",""{} +Model:2398469471,"Model::A",""{} +Model:2398556381,"Model::A",""{} +Model:2398663997,"Model::A",""{} +Model:2398668271,"Model::A",""{} +Model:2400193814,"Model::A",""{} +Model:2401404046,"Model::A",""{} +Model:2401989406,"Model::A",""{} +Model:2402001457,"Model::A",""{} +Model:2403147111,"Model::A",""{} +Model:2404039221,"Model::A",""{} +Model:2404363370,"Model::A",""{} +Model:2405505889,"Model::A",""{} +Model:2405889053,"Model::A",""{} +Model:2407334698,"Model::A",""{} +Model:2407540220,"Model::A",""{} +Model:2407750492,"Model::A",""{} +Model:2407892306,"Model::A",""{} +Model:2408393742,"Model::A",""{} +Model:2408502201,"Model::A",""{} +Model:2408946263,"Model::A",""{} +Model:2409290694,"Model::A",""{} +Model:2409480781,"Model::A",""{} +Model:2410092855,"Model::A",""{} +Model:2410251286,"Model::A",""{} +Model:2410315957,"Model::A",""{} +Model:2410539273,"Model::A",""{} +Model:2412302899,"Model::A",""{} +Model:2412727335,"Model::A",""{} +Model:2413049873,"Model::A",""{} +Model:2413242296,"Model::A",""{} +Model:2413316779,"Model::A",""{} +Model:2413407477,"Model::A",""{} +Model:2413682791,"Model::A",""{} +Model:2413893124,"Model::A",""{} +Model:2414214901,"Model::A",""{} +Model:2414918420,"Model::A",""{} +Model:2415083038,"Model::A",""{} +Model:2415388603,"Model::A",""{} +Model:2418071938,"Model::A",""{} +Model:2418231082,"Model::A",""{} +Model:2418785481,"Model::A",""{} +Model:2418838717,"Model::A",""{} +Model:2419152572,"Model::A",""{} +Model:2419164692,"Model::A",""{} +Model:2421011049,"Model::A",""{} +Model:2421375932,"Model::A",""{} +Model:2421506137,"Model::A",""{} +Model:2422806054,"Model::A",""{} +Model:2423103747,"Model::A",""{} +Model:2423909947,"Model::A",""{} +Model:2425121503,"Model::A",""{} +Model:2426006385,"Model::A",""{} +Model:2426547194,"Model::A",""{} +Model:2426551770,"Model::A",""{} +Model:2427151606,"Model::A",""{} +Model:2428726339,"Model::A",""{} +Model:2428884090,"Model::A",""{} +Model:2429082911,"Model::A",""{} +Model:2429522442,"Model::A",""{} +Model:2429557655,"Model::A",""{} +Model:2430362177,"Model::A",""{} +Model:2430592541,"Model::A",""{} +Model:2430997799,"Model::A",""{} +Model:2431070409,"Model::A",""{} +Model:2432767250,"Model::A",""{} +Model:2433997457,"Model::A",""{} +Model:2434843001,"Model::A",""{} +Model:2435573298,"Model::A",""{} +Model:2435670561,"Model::A",""{} +Model:2436983807,"Model::A",""{} +Model:2438164658,"Model::A",""{} +Model:2438589829,"Model::A",""{} +Model:2438907145,"Model::A",""{} +Model:2440818135,"Model::A",""{} +Model:2441158304,"Model::A",""{} +Model:2441511095,"Model::A",""{} +Model:2441633192,"Model::A",""{} +Model:2442325293,"Model::A",""{} +Model:2442531506,"Model::A",""{} +Model:2443453473,"Model::A",""{} +Model:2443579975,"Model::A",""{} +Model:2444391190,"Model::A",""{} +Model:2445652322,"Model::A",""{} +Model:2446905909,"Model::A",""{} +Model:2447101967,"Model::A",""{} +Model:2447284556,"Model::A",""{} +Model:2447812784,"Model::A",""{} +Model:2449117803,"Model::A",""{} +Model:2449533099,"Model::A",""{} +Model:2449917043,"Model::A",""{} +Model:2450189575,"Model::A",""{} +Model:2451010627,"Model::A",""{} +Model:2451029889,"Model::A",""{} +Model:2451507407,"Model::A",""{} +Model:2451532540,"Model::A",""{} +Model:2451541737,"Model::A",""{} +Model:2451589606,"Model::A",""{} +Model:2452058942,"Model::A",""{} +Model:2452490715,"Model::A",""{} +Model:2453940932,"Model::A",""{} +Model:2455081605,"Model::A",""{} +Model:2457112431,"Model::A",""{} +Model:2457958770,"Model::A",""{} +Model:2458414040,"Model::A",""{} +Model:2458425037,"Model::A",""{} +Model:2458903435,"Model::A",""{} +Model:2459290213,"Model::A",""{} +Model:2460439989,"Model::A",""{} +Model:2460973430,"Model::A",""{} +Model:2461909601,"Model::A",""{} +Model:2463678130,"Model::A",""{} +Model:2463705286,"Model::A",""{} +Model:2464072983,"Model::A",""{} +Model:2465018699,"Model::A",""{} +Model:2466276258,"Model::A",""{} +Model:2466736870,"Model::A",""{} +Model:2466924116,"Model::A",""{} +Model:2467397674,"Model::A",""{} +Model:2467560675,"Model::A",""{} +Model:2470026250,"Model::A",""{} +Model:2470318826,"Model::A",""{} +Model:2470503092,"Model::A",""{} +Model:2471014381,"Model::A",""{} +Model:2471489906,"Model::A",""{} +Model:2471820405,"Model::A",""{} +Model:2471880021,"Model::A",""{} +Model:2472473694,"Model::A",""{} +Model:2473245721,"Model::A",""{} +Model:2475369810,"Model::A",""{} +Model:2477332226,"Model::A",""{} +Model:2478053101,"Model::A",""{} +Model:2478262930,"Model::A",""{} +Model:2478949871,"Model::A",""{} +Model:2480498806,"Model::A",""{} +Model:2483291434,"Model::A",""{} +Model:2483412246,"Model::A",""{} +Model:2485305090,"Model::A",""{} +Model:2485501786,"Model::A",""{} +Model:2486206729,"Model::A",""{} +Model:2486355507,"Model::A",""{} +Model:2486853109,"Model::A",""{} +Model:2487019887,"Model::A",""{} +Model:2487170878,"Model::A",""{} +Model:2487803843,"Model::A",""{} +Model:2488053729,"Model::A",""{} +Model:2488677537,"Model::A",""{} +Model:2488697600,"Model::A",""{} +Model:2488744155,"Model::A",""{} +Model:2488753087,"Model::A",""{} +Model:2489463683,"Model::A",""{} +Model:2491651033,"Model::A",""{} +Model:2491926393,"Model::A",""{} +Model:2493729211,"Model::A",""{} +Model:2494038335,"Model::A",""{} +Model:2494319570,"Model::A",""{} +Model:2494385684,"Model::A",""{} +Model:2495216415,"Model::A",""{} +Model:2496012039,"Model::A",""{} +Model:2497805369,"Model::A",""{} +Model:2498041646,"Model::A",""{} +Model:2498604968,"Model::A",""{} +Model:2498614335,"Model::A",""{} +Model:2498825985,"Model::A",""{} +Model:2500392835,"Model::A",""{} +Model:2501384041,"Model::A",""{} +Model:2501541755,"Model::A",""{} +Model:2504174243,"Model::A",""{} +Model:2505445550,"Model::A",""{} +Model:2505529518,"Model::A",""{} +Model:2506391356,"Model::A",""{} +Model:2507150326,"Model::A",""{} +Model:2507935011,"Model::A",""{} +Model:2509810614,"Model::A",""{} +Model:2510183217,"Model::A",""{} +Model:2510535629,"Model::A",""{} +Model:2510953618,"Model::A",""{} +Model:2511120713,"Model::A",""{} +Model:2511808592,"Model::A",""{} +Model:2514842958,"Model::A",""{} +Model:2515344836,"Model::A",""{} +Model:2516173945,"Model::A",""{} +Model:2516807641,"Model::A",""{} +Model:2517418425,"Model::A",""{} +Model:2517821380,"Model::A",""{} +Model:2519075902,"Model::A",""{} +Model:2520298783,"Model::A",""{} +Model:2520528994,"Model::A",""{} +Model:2520786459,"Model::A",""{} +Model:2521523570,"Model::A",""{} +Model:2521584639,"Model::A",""{} +Model:2522347169,"Model::A",""{} +Model:2523065177,"Model::A",""{} +Model:2523127497,"Model::A",""{} +Model:2523338492,"Model::A",""{} +Model:2523771290,"Model::A",""{} +Model:2523880809,"Model::A",""{} +Model:2524754086,"Model::A",""{} +Model:2525493011,"Model::A",""{} +Model:2525802275,"Model::A",""{} +Model:2526546489,"Model::A",""{} +Model:2527884081,"Model::A",""{} +Model:2530111561,"Model::A",""{} +Model:2531918961,"Model::A",""{} +Model:2532188350,"Model::A",""{} +Model:2532270090,"Model::A",""{} +Model:2534070402,"Model::A",""{} +Model:2534306970,"Model::A",""{} +Model:2534770019,"Model::A",""{} +Model:2534956287,"Model::A",""{} +Model:2535462209,"Model::A",""{} +Model:2535594707,"Model::A",""{} +Model:2536266323,"Model::A",""{} +Model:2536303513,"Model::A",""{} +Model:2537602855,"Model::A",""{} +Model:2537784586,"Model::A",""{} +Model:2537840036,"Model::A",""{} +Model:2538715449,"Model::A",""{} +Model:2539742271,"Model::A",""{} +Model:2540451826,"Model::A",""{} +Model:2541643158,"Model::A",""{} +Model:2542222271,"Model::A",""{} +Model:2542862339,"Model::A",""{} +Model:2542931511,"Model::A",""{} +Model:2543327333,"Model::A",""{} +Model:2543469763,"Model::A",""{} +Model:2544203716,"Model::A",""{} +Model:2545508158,"Model::A",""{} +Model:2545638572,"Model::A",""{} +Model:2546810077,"Model::A",""{} +Model:2546953963,"Model::A",""{} +Model:2549035138,"Model::A",""{} +Model:2549845323,"Model::A",""{} +Model:2550520203,"Model::A",""{} +Model:2552496739,"Model::A",""{} +Model:2553088917,"Model::A",""{} +Model:2553250127,"Model::A",""{} +Model:2553718289,"Model::A",""{} +Model:2553723169,"Model::A",""{} +Model:2554037139,"Model::A",""{} +Model:2554112442,"Model::A",""{} +Model:2554146791,"Model::A",""{} +Model:2555222502,"Model::A",""{} +Model:2555965711,"Model::A",""{} +Model:2556755715,"Model::A",""{} +Model:2559100579,"Model::A",""{} +Model:2559846253,"Model::A",""{} +Model:2560038608,"Model::A",""{} +Model:2562290254,"Model::A",""{} +Model:2562768654,"Model::A",""{} +Model:2562953894,"Model::A",""{} +Model:2563183292,"Model::A",""{} +Model:2564257285,"Model::A",""{} +Model:2564357538,"Model::A",""{} +Model:2565192752,"Model::A",""{} +Model:2565787602,"Model::A",""{} +Model:2566632303,"Model::A",""{} +Model:2566894726,"Model::A",""{} +Model:2567282681,"Model::A",""{} +Model:2567936513,"Model::A",""{} +Model:2568398044,"Model::A",""{} +Model:2568676329,"Model::A",""{} +Model:2570196922,"Model::A",""{} +Model:2571264533,"Model::A",""{} +Model:2572080100,"Model::A",""{} +Model:2572919935,"Model::A",""{} +Model:2572984935,"Model::A",""{} +Model:2573292917,"Model::A",""{} +Model:2574018514,"Model::A",""{} +Model:2574125033,"Model::A",""{} +Model:2574636929,"Model::A",""{} +Model:2574745150,"Model::A",""{} +Model:2574850975,"Model::A",""{} +Model:2575097201,"Model::A",""{} +Model:2575613054,"Model::A",""{} +Model:2576111882,"Model::A",""{} +Model:2576291049,"Model::A",""{} +Model:2576342788,"Model::A",""{} +Model:2576773649,"Model::A",""{} +Model:2578044722,"Model::A",""{} +Model:2579141394,"Model::A",""{} +Model:2579461317,"Model::A",""{} +Model:2580061979,"Model::A",""{} +Model:2581441481,"Model::A",""{} +Model:2581719769,"Model::A",""{} +Model:2582609370,"Model::A",""{} +Model:2582778260,"Model::A",""{} +Model:2583377045,"Model::A",""{} +Model:2584987886,"Model::A",""{} +Model:2585245993,"Model::A",""{} +Model:2585489605,"Model::A",""{} +Model:2585596266,"Model::A",""{} +Model:2586653442,"Model::A",""{} +Model:2587067894,"Model::A",""{} +Model:2588018242,"Model::A",""{} +Model:2588260574,"Model::A",""{} +Model:2588858251,"Model::A",""{} +Model:2589010108,"Model::A",""{} +Model:2589803060,"Model::A",""{} +Model:2591303790,"Model::A",""{} +Model:2592184214,"Model::A",""{} +Model:2592546898,"Model::A",""{} +Model:2592827874,"Model::A",""{} +Model:2595607407,"Model::A",""{} +Model:2596692341,"Model::A",""{} +Model:2596854425,"Model::A",""{} +Model:2598666841,"Model::A",""{} +Model:2598782085,"Model::A",""{} +Model:2599753851,"Model::A",""{} +Model:2601229167,"Model::A",""{} +Model:2601922172,"Model::A",""{} +Model:2602878498,"Model::A",""{} +Model:2602980007,"Model::A",""{} +Model:2603176517,"Model::A",""{} +Model:2603786908,"Model::A",""{} +Model:2603845854,"Model::A",""{} +Model:2603872221,"Model::A",""{} +Model:2604058045,"Model::A",""{} +Model:2604316677,"Model::A",""{} +Model:2605059953,"Model::A",""{} +Model:2605631582,"Model::A",""{} +Model:2605658050,"Model::A",""{} +Model:2606119789,"Model::A",""{} +Model:2606895630,"Model::A",""{} +Model:2607382622,"Model::A",""{} +Model:2608506594,"Model::A",""{} +Model:2609568124,"Model::A",""{} +Model:2610106873,"Model::A",""{} +Model:2610370526,"Model::A",""{} +Model:2610636007,"Model::A",""{} +Model:2612403557,"Model::A",""{} +Model:2612699283,"Model::A",""{} +Model:2612811531,"Model::A",""{} +Model:2613469382,"Model::A",""{} +Model:2613756295,"Model::A",""{} +Model:2614147100,"Model::A",""{} +Model:2614348597,"Model::A",""{} +Model:2615094889,"Model::A",""{} +Model:2616080734,"Model::A",""{} +Model:2617715591,"Model::A",""{} +Model:2617801828,"Model::A",""{} +Model:2618665797,"Model::A",""{} +Model:2618953151,"Model::A",""{} +Model:2619247331,"Model::A",""{} +Model:2620376060,"Model::A",""{} +Model:2620387298,"Model::A",""{} +Model:2620661970,"Model::A",""{} +Model:2621133716,"Model::A",""{} +Model:2621178733,"Model::A",""{} +Model:2621647911,"Model::A",""{} +Model:2621682989,"Model::A",""{} +Model:2622708142,"Model::A",""{} +Model:2622724256,"Model::A",""{} +Model:2624005508,"Model::A",""{} +Model:2624553251,"Model::A",""{} +Model:2625612807,"Model::A",""{} +Model:2627793315,"Model::A",""{} +Model:2628056082,"Model::A",""{} +Model:2628338612,"Model::A",""{} +Model:2629158883,"Model::A",""{} +Model:2629611754,"Model::A",""{} +Model:2630052550,"Model::A",""{} +Model:2630128806,"Model::A",""{} +Model:2630324265,"Model::A",""{} +Model:2631037115,"Model::A",""{} +Model:2631500981,"Model::A",""{} +Model:2631620612,"Model::A",""{} +Model:2631861735,"Model::A",""{} +Model:2632538857,"Model::A",""{} +Model:2633625817,"Model::A",""{} +Model:2633662352,"Model::A",""{} +Model:2633713106,"Model::A",""{} +Model:2633826589,"Model::A",""{} +Model:2633858873,"Model::A",""{} +Model:2635723083,"Model::A",""{} +Model:2635723892,"Model::A",""{} +Model:2636398635,"Model::A",""{} +Model:2636562162,"Model::A",""{} +Model:2638394678,"Model::A",""{} +Model:2640831741,"Model::A",""{} +Model:2641838507,"Model::A",""{} +Model:2642115571,"Model::A",""{} +Model:2642501698,"Model::A",""{} +Model:2642776945,"Model::A",""{} +Model:2643056349,"Model::A",""{} +Model:2643514482,"Model::A",""{} +Model:2645667598,"Model::A",""{} +Model:2646428737,"Model::A",""{} +Model:2649258538,"Model::A",""{} +Model:2650691791,"Model::A",""{} +Model:2650909686,"Model::A",""{} +Model:2651112651,"Model::A",""{} +Model:2651226715,"Model::A",""{} +Model:2651814311,"Model::A",""{} +Model:2651981934,"Model::A",""{} +Model:2652007479,"Model::A",""{} +Model:2652488937,"Model::A",""{} +Model:2652670505,"Model::A",""{} +Model:2653360972,"Model::A",""{} +Model:2653678851,"Model::A",""{} +Model:2654540803,"Model::A",""{} +Model:2654641611,"Model::A",""{} +Model:2655015152,"Model::A",""{} +Model:2655170565,"Model::A",""{} +Model:2655482972,"Model::A",""{} +Model:2655694393,"Model::A",""{} +Model:2657079153,"Model::A",""{} +Model:2657701085,"Model::A",""{} +Model:2658624247,"Model::A",""{} +Model:2659490719,"Model::A",""{} +Model:2659981325,"Model::A",""{} +Model:2662552339,"Model::A",""{} +Model:2663210957,"Model::A",""{} +Model:2663389292,"Model::A",""{} +Model:2663507111,"Model::A",""{} +Model:2663637837,"Model::A",""{} +Model:2664107164,"Model::A",""{} +Model:2665063448,"Model::A",""{} +Model:2665341153,"Model::A",""{} +Model:2665425929,"Model::A",""{} +Model:2665660511,"Model::A",""{} +Model:2665772435,"Model::A",""{} +Model:2666851532,"Model::A",""{} +Model:2668514666,"Model::A",""{} +Model:2668678306,"Model::A",""{} +Model:2669157866,"Model::A",""{} +Model:2669742835,"Model::A",""{} +Model:2671454902,"Model::A",""{} +Model:2671582274,"Model::A",""{} +Model:2672718183,"Model::A",""{} +Model:2672800217,"Model::A",""{} +Model:2672845531,"Model::A",""{} +Model:2672923503,"Model::A",""{} +Model:2673097411,"Model::A",""{} +Model:2673599762,"Model::A",""{} +Model:2673771158,"Model::A",""{} +Model:2674587214,"Model::A",""{} +Model:2675826213,"Model::A",""{} +Model:2676393015,"Model::A",""{} +Model:2678504249,"Model::A",""{} +Model:2678864391,"Model::A",""{} +Model:2678930313,"Model::A",""{} +Model:2680096127,"Model::A",""{} +Model:2680829414,"Model::A",""{} +Model:2683482128,"Model::A",""{} +Model:2683514738,"Model::A",""{} +Model:2684304201,"Model::A",""{} +Model:2685275876,"Model::A",""{} +Model:2685878386,"Model::A",""{} +Model:2686819843,"Model::A",""{} +Model:2687121574,"Model::A",""{} +Model:2688199829,"Model::A",""{} +Model:2689887837,"Model::A",""{} +Model:2689963913,"Model::A",""{} +Model:2690353467,"Model::A",""{} +Model:2691506031,"Model::A",""{} +Model:2693317371,"Model::A",""{} +Model:2694228676,"Model::A",""{} +Model:2694240430,"Model::A",""{} +Model:2695110991,"Model::A",""{} +Model:2695394335,"Model::A",""{} +Model:2695602499,"Model::A",""{} +Model:2696218158,"Model::A",""{} +Model:2696629634,"Model::A",""{} +Model:2697307261,"Model::A",""{} +Model:2697336121,"Model::A",""{} +Model:2697404489,"Model::A",""{} +Model:2697587949,"Model::A",""{} +Model:2697803432,"Model::A",""{} +Model:2698015542,"Model::A",""{} +Model:2698310864,"Model::A",""{} +Model:2699082691,"Model::A",""{} +Model:2699497042,"Model::A",""{} +Model:2700139314,"Model::A",""{} +Model:2701762820,"Model::A",""{} +Model:2702003433,"Model::A",""{} +Model:2702110906,"Model::A",""{} +Model:2702716693,"Model::A",""{} +Model:2703261913,"Model::A",""{} +Model:2703352484,"Model::A",""{} +Model:2703894125,"Model::A",""{} +Model:2704319298,"Model::A",""{} +Model:2704351244,"Model::A",""{} +Model:2704624955,"Model::A",""{} +Model:2705415946,"Model::A",""{} +Model:2705943363,"Model::A",""{} +Model:2706131134,"Model::A",""{} +Model:2706249694,"Model::A",""{} +Model:2706336641,"Model::A",""{} +Model:2707987208,"Model::A",""{} +Model:2708140957,"Model::A",""{} +Model:2708830599,"Model::A",""{} +Model:2709171190,"Model::A",""{} +Model:2709253103,"Model::A",""{} +Model:2709512962,"Model::A",""{} +Model:2710384173,"Model::A",""{} +Model:2710517698,"Model::A",""{} +Model:2711302149,"Model::A",""{} +Model:2711903553,"Model::A",""{} +Model:2712134722,"Model::A",""{} +Model:2712148133,"Model::A",""{} +Model:2712800042,"Model::A",""{} +Model:2712835495,"Model::A",""{} +Model:2713010468,"Model::A",""{} +Model:2714361381,"Model::A",""{} +Model:2714976999,"Model::A",""{} +Model:2716378811,"Model::A",""{} +Model:2716576949,"Model::A",""{} +Model:2717068255,"Model::A",""{} +Model:2717154525,"Model::A",""{} +Model:2717361225,"Model::A",""{} +Model:2719454591,"Model::A",""{} +Model:2719631047,"Model::A",""{} +Model:2719700793,"Model::A",""{} +Model:2719859961,"Model::A",""{} +Model:2720095957,"Model::A",""{} +Model:2720304641,"Model::A",""{} +Model:2720967551,"Model::A",""{} +Model:2721402700,"Model::A",""{} +Model:2723151409,"Model::A",""{} +Model:2723872139,"Model::A",""{} +Model:2724079886,"Model::A",""{} +Model:2725294719,"Model::A",""{} +Model:2725749584,"Model::A",""{} +Model:2727338792,"Model::A",""{} +Model:2727608659,"Model::A",""{} +Model:2728624445,"Model::A",""{} +Model:2729255932,"Model::A",""{} +Model:2730052879,"Model::A",""{} +Model:2730671458,"Model::A",""{} +Model:2730733235,"Model::A",""{} +Model:2731356812,"Model::A",""{} +Model:2732095556,"Model::A",""{} +Model:2733156778,"Model::A",""{} +Model:2734018639,"Model::A",""{} +Model:2734220274,"Model::A",""{} +Model:2734490720,"Model::A",""{} +Model:2736014845,"Model::A",""{} +Model:2736141747,"Model::A",""{} +Model:2736210322,"Model::A",""{} +Model:2736556546,"Model::A",""{} +Model:2736990378,"Model::A",""{} +Model:2738808477,"Model::A",""{} +Model:2738812182,"Model::A",""{} +Model:2739120683,"Model::A",""{} +Model:2739609223,"Model::A",""{} +Model:2739796828,"Model::A",""{} +Model:2740982070,"Model::A",""{} +Model:2743398018,"Model::A",""{} +Model:2744999437,"Model::A",""{} +Model:2746025114,"Model::A",""{} +Model:2746414918,"Model::A",""{} +Model:2749386460,"Model::A",""{} +Model:2749902871,"Model::A",""{} +Model:2750413059,"Model::A",""{} +Model:2751066353,"Model::A",""{} +Model:2751110301,"Model::A",""{} +Model:2752415275,"Model::A",""{} +Model:2752905815,"Model::A",""{} +Model:2752989595,"Model::A",""{} +Model:2753647201,"Model::A",""{} +Model:2754035062,"Model::A",""{} +Model:2754499210,"Model::A",""{} +Model:2754559513,"Model::A",""{} +Model:2755605470,"Model::A",""{} +Model:2755667889,"Model::A",""{} +Model:2756269132,"Model::A",""{} +Model:2757957980,"Model::A",""{} +Model:2758185566,"Model::A",""{} +Model:2758555352,"Model::A",""{} +Model:2758670869,"Model::A",""{} +Model:2759149083,"Model::A",""{} +Model:2760871858,"Model::A",""{} +Model:2760997639,"Model::A",""{} +Model:2761367075,"Model::A",""{} +Model:2761979356,"Model::A",""{} +Model:2762868802,"Model::A",""{} +Model:2763424588,"Model::A",""{} +Model:2763818173,"Model::A",""{} +Model:2764927074,"Model::A",""{} +Model:2765000425,"Model::A",""{} +Model:2765410876,"Model::A",""{} +Model:2765545039,"Model::A",""{} +Model:2766548305,"Model::A",""{} +Model:2766906566,"Model::A",""{} +Model:2767436849,"Model::A",""{} +Model:2768307834,"Model::A",""{} +Model:2769078894,"Model::A",""{} +Model:2769438426,"Model::A",""{} +Model:2769726594,"Model::A",""{} +Model:2769784631,"Model::A",""{} +Model:2769815427,"Model::A",""{} +Model:2769947418,"Model::A",""{} +Model:2770566253,"Model::A",""{} +Model:2771051219,"Model::A",""{} +Model:2771640994,"Model::A",""{} +Model:2771723594,"Model::A",""{} +Model:2773343313,"Model::A",""{} +Model:2773521812,"Model::A",""{} +Model:2774062871,"Model::A",""{} +Model:2774357955,"Model::A",""{} +Model:2774701202,"Model::A",""{} +Model:2774949810,"Model::A",""{} +Model:2775926797,"Model::A",""{} +Model:2779992332,"Model::A",""{} +Model:2780328719,"Model::A",""{} +Model:2780858864,"Model::A",""{} +Model:2781261045,"Model::A",""{} +Model:2781268090,"Model::A",""{} +Model:2781273009,"Model::A",""{} +Model:2782601813,"Model::A",""{} +Model:2783130886,"Model::A",""{} +Model:2784729671,"Model::A",""{} +Model:2785387083,"Model::A",""{} +Model:2785642549,"Model::A",""{} +Model:2786231405,"Model::A",""{} +Model:2786595983,"Model::A",""{} +Model:2786736255,"Model::A",""{} +Model:2787209682,"Model::A",""{} +Model:2787218210,"Model::A",""{} +Model:2788519602,"Model::A",""{} +Model:2789046978,"Model::A",""{} +Model:2789249617,"Model::A",""{} +Model:2791807228,"Model::A",""{} +Model:2791955535,"Model::A",""{} +Model:2792771023,"Model::A",""{} +Model:2793342681,"Model::A",""{} +Model:2793976278,"Model::A",""{} +Model:2794414988,"Model::A",""{} +Model:2795723963,"Model::A",""{} +Model:2797000737,"Model::A",""{} +Model:2797152844,"Model::A",""{} +Model:2797290719,"Model::A",""{} +Model:2797783019,"Model::A",""{} +Model:2797845389,"Model::A",""{} +Model:2798163074,"Model::A",""{} +Model:2799563828,"Model::A",""{} +Model:2799912710,"Model::A",""{} +Model:2800056223,"Model::A",""{} +Model:2800754840,"Model::A",""{} +Model:2803041701,"Model::A",""{} +Model:2803515095,"Model::A",""{} +Model:2804675907,"Model::A",""{} +Model:2804799626,"Model::A",""{} +Model:2805319478,"Model::A",""{} +Model:2808243159,"Model::A",""{} +Model:2808406900,"Model::A",""{} +Model:2810280877,"Model::A",""{} +Model:2810649032,"Model::A",""{} +Model:2810703443,"Model::A",""{} +Model:2810922033,"Model::A",""{} +Model:2811821332,"Model::A",""{} +Model:2813854444,"Model::A",""{} +Model:2814601731,"Model::A",""{} +Model:2815403706,"Model::A",""{} +Model:2815744654,"Model::A",""{} +Model:2816027524,"Model::A",""{} +Model:2816643892,"Model::A",""{} +Model:2818076468,"Model::A",""{} +Model:2818564726,"Model::A",""{} +Model:2819529641,"Model::A",""{} +Model:2819908352,"Model::A",""{} +Model:2820275354,"Model::A",""{} +Model:2821160473,"Model::A",""{} +Model:2821290318,"Model::A",""{} +Model:2822127261,"Model::A",""{} +Model:2822346199,"Model::A",""{} +Model:2823635006,"Model::A",""{} +Model:2823809869,"Model::A",""{} +Model:2825377394,"Model::A",""{} +Model:2825422012,"Model::A",""{} +Model:2825423899,"Model::A",""{} +Model:2825725318,"Model::A",""{} +Model:2825775799,"Model::A",""{} +Model:2826364347,"Model::A",""{} +Model:2827786801,"Model::A",""{} +Model:2827878839,"Model::A",""{} +Model:2828937883,"Model::A",""{} +Model:2828985035,"Model::A",""{} +Model:2829297902,"Model::A",""{} +Model:2829581057,"Model::A",""{} +Model:2831028766,"Model::A",""{} +Model:2831049995,"Model::A",""{} +Model:2831772330,"Model::A",""{} +Model:2832296785,"Model::A",""{} +Model:2832541161,"Model::A",""{} +Model:2833439437,"Model::A",""{} +Model:2834189264,"Model::A",""{} +Model:2834768586,"Model::A",""{} +Model:2834834429,"Model::A",""{} +Model:2834973207,"Model::A",""{} +Model:2835016350,"Model::A",""{} +Model:2835129766,"Model::A",""{} +Model:2835233350,"Model::A",""{} +Model:2835289832,"Model::A",""{} +Model:2835391329,"Model::A",""{} +Model:2836128774,"Model::A",""{} +Model:2837364567,"Model::A",""{} +Model:2838755863,"Model::A",""{} +Model:2840399812,"Model::A",""{} +Model:2840900933,"Model::A",""{} +Model:2841373122,"Model::A",""{} +Model:2843071796,"Model::A",""{} +Model:2844073102,"Model::A",""{} +Model:2844087923,"Model::A",""{} +Model:2844117447,"Model::A",""{} +Model:2844126014,"Model::A",""{} +Model:2844254300,"Model::A",""{} +Model:2844258743,"Model::A",""{} +Model:2844939801,"Model::A",""{} +Model:2845239462,"Model::A",""{} +Model:2845763756,"Model::A",""{} +Model:2846324199,"Model::A",""{} +Model:2846367425,"Model::A",""{} +Model:2846933863,"Model::A",""{} +Model:2847730218,"Model::A",""{} +Model:2847907002,"Model::A",""{} +Model:2848349498,"Model::A",""{} +Model:2849096734,"Model::A",""{} +Model:2849826366,"Model::A",""{} +Model:2849871508,"Model::A",""{} +Model:2850265757,"Model::A",""{} +Model:2851164963,"Model::A",""{} +Model:2852271250,"Model::A",""{} +Model:2852350557,"Model::A",""{} +Model:2852377755,"Model::A",""{} +Model:2853435171,"Model::A",""{} +Model:2854523742,"Model::A",""{} +Model:2854712309,"Model::A",""{} +Model:2854812581,"Model::A",""{} +Model:2854841807,"Model::A",""{} +Model:2856417498,"Model::A",""{} +Model:2857145858,"Model::A",""{} +Model:2857235859,"Model::A",""{} +Model:2857471405,"Model::A",""{} +Model:2857746311,"Model::A",""{} +Model:2858153537,"Model::A",""{} +Model:2858790124,"Model::A",""{} +Model:2858812195,"Model::A",""{} +Model:2859091614,"Model::A",""{} +Model:2859514361,"Model::A",""{} +Model:2861171329,"Model::A",""{} +Model:2862008098,"Model::A",""{} +Model:2862784502,"Model::A",""{} +Model:2863936199,"Model::A",""{} +Model:2864784858,"Model::A",""{} +Model:2865524847,"Model::A",""{} +Model:2865920206,"Model::A",""{} +Model:2866138521,"Model::A",""{} +Model:2866579783,"Model::A",""{} +Model:2866925150,"Model::A",""{} +Model:2867182664,"Model::A",""{} +Model:2867855855,"Model::A",""{} +Model:2867988353,"Model::A",""{} +Model:2868179905,"Model::A",""{} +Model:2868455342,"Model::A",""{} +Model:2869539319,"Model::A",""{} +Model:2869717628,"Model::A",""{} +Model:2869871531,"Model::A",""{} +Model:2870501530,"Model::A",""{} +Model:2871065583,"Model::A",""{} +Model:2872222773,"Model::A",""{} +Model:2873061604,"Model::A",""{} +Model:2873283645,"Model::A",""{} +Model:2874016780,"Model::A",""{} +Model:2874176979,"Model::A",""{} +Model:2874340976,"Model::A",""{} +Model:2874630442,"Model::A",""{} +Model:2874831073,"Model::A",""{} +Model:2876194046,"Model::A",""{} +Model:2876957791,"Model::A",""{} +Model:2877285802,"Model::A",""{} +Model:2877571444,"Model::A",""{} +Model:2879439303,"Model::A",""{} +Model:2879527417,"Model::A",""{} +Model:2880026695,"Model::A",""{} +Model:2880530792,"Model::A",""{} +Model:2881038115,"Model::A",""{} +Model:2881783014,"Model::A",""{} +Model:2881991625,"Model::A",""{} +Model:2882528754,"Model::A",""{} +Model:2883579323,"Model::A",""{} +Model:2884366773,"Model::A",""{} +Model:2884546054,"Model::A",""{} +Model:2884722334,"Model::A",""{} +Model:2885578513,"Model::A",""{} +Model:2885583401,"Model::A",""{} +Model:2885734196,"Model::A",""{} +Model:2886274095,"Model::A",""{} +Model:2886307137,"Model::A",""{} +Model:2887125879,"Model::A",""{} +Model:2887131796,"Model::A",""{} +Model:2888152047,"Model::A",""{} +Model:2889307105,"Model::A",""{} +Model:2889617620,"Model::A",""{} +Model:2890048101,"Model::A",""{} +Model:2890134753,"Model::A",""{} +Model:2890625763,"Model::A",""{} +Model:2890972880,"Model::A",""{} +Model:2891798238,"Model::A",""{} +Model:2893393163,"Model::A",""{} +Model:2894320227,"Model::A",""{} +Model:2895095060,"Model::A",""{} +Model:2895101058,"Model::A",""{} +Model:2895597439,"Model::A",""{} +Model:2895600443,"Model::A",""{} +Model:2896081474,"Model::A",""{} +Model:2896464210,"Model::A",""{} +Model:2896823066,"Model::A",""{} +Model:2897020078,"Model::A",""{} +Model:2897525567,"Model::A",""{} +Model:2897862026,"Model::A",""{} +Model:2898687497,"Model::A",""{} +Model:2898833655,"Model::A",""{} +Model:2899300306,"Model::A",""{} +Model:2899379785,"Model::A",""{} +Model:2899484701,"Model::A",""{} +Model:2900899646,"Model::A",""{} +Model:2900931093,"Model::A",""{} +Model:2901060039,"Model::A",""{} +Model:2901269362,"Model::A",""{} +Model:2902972099,"Model::A",""{} +Model:2903730282,"Model::A",""{} +Model:2904680938,"Model::A",""{} +Model:2906052299,"Model::A",""{} +Model:2907249791,"Model::A",""{} +Model:2907400511,"Model::A",""{} +Model:2908150004,"Model::A",""{} +Model:2908352883,"Model::A",""{} +Model:2908406931,"Model::A",""{} +Model:2908511199,"Model::A",""{} +Model:2909409158,"Model::A",""{} +Model:2910011919,"Model::A",""{} +Model:2910854960,"Model::A",""{} +Model:2911074209,"Model::A",""{} +Model:2911125311,"Model::A",""{} +Model:2911604635,"Model::A",""{} +Model:2912398183,"Model::A",""{} +Model:2912399790,"Model::A",""{} +Model:2912665630,"Model::A",""{} +Model:2912786915,"Model::A",""{} +Model:2913230559,"Model::A",""{} +Model:2913247262,"Model::A",""{} +Model:2913402305,"Model::A",""{} +Model:2913512962,"Model::A",""{} +Model:2913647404,"Model::A",""{} +Model:2914195461,"Model::A",""{} +Model:2914986230,"Model::A",""{} +Model:2915070749,"Model::A",""{} +Model:2915718940,"Model::A",""{} +Model:2916315829,"Model::A",""{} +Model:2916662319,"Model::A",""{} +Model:2917503260,"Model::A",""{} +Model:2917620430,"Model::A",""{} +Model:2918382450,"Model::A",""{} +Model:2918961699,"Model::A",""{} +Model:2919839074,"Model::A",""{} +Model:2919934280,"Model::A",""{} +Model:2920110210,"Model::A",""{} +Model:2920252671,"Model::A",""{} +Model:2920467593,"Model::A",""{} +Model:2920659095,"Model::A",""{} +Model:2920835404,"Model::A",""{} +Model:2921590893,"Model::A",""{} +Model:2922349241,"Model::A",""{} +Model:2923199730,"Model::A",""{} +Model:2923856756,"Model::A",""{} +Model:2924106557,"Model::A",""{} +Model:2925409778,"Model::A",""{} +Model:2925522541,"Model::A",""{} +Model:2925778108,"Model::A",""{} +Model:2926135417,"Model::A",""{} +Model:2926855604,"Model::A",""{} +Model:2927172601,"Model::A",""{} +Model:2927242330,"Model::A",""{} +Model:2927786377,"Model::A",""{} +Model:2928063161,"Model::A",""{} +Model:2928598327,"Model::A",""{} +Model:2928657920,"Model::A",""{} +Model:2928809015,"Model::A",""{} +Model:2929552406,"Model::A",""{} +Model:2929920377,"Model::A",""{} +Model:2930028212,"Model::A",""{} +Model:2930566925,"Model::A",""{} +Model:2930643473,"Model::A",""{} +Model:2931424373,"Model::A",""{} +Model:2932055821,"Model::A",""{} +Model:2932369519,"Model::A",""{} +Model:2932537808,"Model::A",""{} +Model:2933113521,"Model::A",""{} +Model:2935353931,"Model::A",""{} +Model:2935774839,"Model::A",""{} +Model:2936175077,"Model::A",""{} +Model:2938104854,"Model::A",""{} +Model:2939787546,"Model::A",""{} +Model:2940274772,"Model::A",""{} +Model:2940283316,"Model::A",""{} +Model:2941271201,"Model::A",""{} +Model:2941596186,"Model::A",""{} +Model:2942004058,"Model::A",""{} +Model:2942258410,"Model::A",""{} +Model:2942509649,"Model::A",""{} +Model:2942980914,"Model::A",""{} +Model:2943026055,"Model::A",""{} +Model:2943612350,"Model::A",""{} +Model:2944270329,"Model::A",""{} +Model:2944684658,"Model::A",""{} +Model:2945694291,"Model::A",""{} +Model:2946074261,"Model::A",""{} +Model:2946415828,"Model::A",""{} +Model:2946996629,"Model::A",""{} +Model:2947262969,"Model::A",""{} +Model:2947822067,"Model::A",""{} +Model:2948092599,"Model::A",""{} +Model:2948994906,"Model::A",""{} +Model:2949351091,"Model::A",""{} +Model:2951219737,"Model::A",""{} +Model:2951389544,"Model::A",""{} +Model:2951509636,"Model::A",""{} +Model:2952207065,"Model::A",""{} +Model:2952223613,"Model::A",""{} +Model:2952266630,"Model::A",""{} +Model:2953411250,"Model::A",""{} +Model:2954177027,"Model::A",""{} +Model:2954308923,"Model::A",""{} +Model:2954817513,"Model::A",""{} +Model:2955218453,"Model::A",""{} +Model:2955785565,"Model::A",""{} +Model:2957450021,"Model::A",""{} +Model:2957665670,"Model::A",""{} +Model:2959495798,"Model::A",""{} +Model:2959666657,"Model::A",""{} +Model:2959952603,"Model::A",""{} +Model:2960030114,"Model::A",""{} +Model:2960969563,"Model::A",""{} +Model:2962655055,"Model::A",""{} +Model:2963613599,"Model::A",""{} +Model:2965558417,"Model::A",""{} +Model:2965634763,"Model::A",""{} +Model:2966050951,"Model::A",""{} +Model:2966052018,"Model::A",""{} +Model:2967286928,"Model::A",""{} +Model:2967359970,"Model::A",""{} +Model:2967536353,"Model::A",""{} +Model:2968405901,"Model::A",""{} +Model:2970129959,"Model::A",""{} +Model:2970158492,"Model::A",""{} +Model:2970346544,"Model::A",""{} +Model:2971816734,"Model::A",""{} +Model:2972190319,"Model::A",""{} +Model:2972778853,"Model::A",""{} +Model:2973987988,"Model::A",""{} +Model:2974253922,"Model::A",""{} +Model:2974332027,"Model::A",""{} +Model:2975267335,"Model::A",""{} +Model:2976313604,"Model::A",""{} +Model:2976641996,"Model::A",""{} +Model:2976687501,"Model::A",""{} +Model:2976991612,"Model::A",""{} +Model:2977012805,"Model::A",""{} +Model:2977454185,"Model::A",""{} +Model:2980613862,"Model::A",""{} +Model:2980814955,"Model::A",""{} +Model:2981473712,"Model::A",""{} +Model:2983000484,"Model::A",""{} +Model:2984559074,"Model::A",""{} +Model:2984588422,"Model::A",""{} +Model:2984636141,"Model::A",""{} +Model:2985023853,"Model::A",""{} +Model:2985614836,"Model::A",""{} +Model:2985938918,"Model::A",""{} +Model:2986858169,"Model::A",""{} +Model:2987195463,"Model::A",""{} +Model:2987240658,"Model::A",""{} +Model:2987561674,"Model::A",""{} +Model:2987567109,"Model::A",""{} +Model:2987673956,"Model::A",""{} +Model:2991103343,"Model::A",""{} +Model:2991889658,"Model::A",""{} +Model:2992585599,"Model::A",""{} +Model:2993190890,"Model::A",""{} +Model:2994728214,"Model::A",""{} +Model:2995096099,"Model::A",""{} +Model:2995393690,"Model::A",""{} +Model:2995571108,"Model::A",""{} +Model:2996529866,"Model::A",""{} +Model:2996837653,"Model::A",""{} +Model:2997421196,"Model::A",""{} +Model:2998919910,"Model::A",""{} +Model:2999117746,"Model::A",""{} +Model:2999833493,"Model::A",""{} +Model:2999962352,"Model::A",""{} +Model:3001486540,"Model::A",""{} +Model:3003037561,"Model::A",""{} +Model:3003330582,"Model::A",""{} +Model:3003878912,"Model::A",""{} +Model:3004159099,"Model::A",""{} +Model:3004478956,"Model::A",""{} +Model:3004744616,"Model::A",""{} +Model:3005289527,"Model::A",""{} +Model:3005466626,"Model::A",""{} +Model:3005623928,"Model::A",""{} +Model:3006051878,"Model::A",""{} +Model:3006516479,"Model::A",""{} +Model:3007409336,"Model::A",""{} +Model:3008416221,"Model::A",""{} +Model:3009652199,"Model::A",""{} +Model:3009847302,"Model::A",""{} +Model:3010233553,"Model::A",""{} +Model:3010307725,"Model::A",""{} +Model:3011010418,"Model::A",""{} +Model:3011254535,"Model::A",""{} +Model:3011586095,"Model::A",""{} +Model:3011643991,"Model::A",""{} +Model:3012582431,"Model::A",""{} +Model:3012615389,"Model::A",""{} +Model:3012659209,"Model::A",""{} +Model:3012684565,"Model::A",""{} +Model:3013440927,"Model::A",""{} +Model:3014215330,"Model::A",""{} +Model:3015314019,"Model::A",""{} +Model:3015684698,"Model::A",""{} +Model:3015747654,"Model::A",""{} +Model:3016619902,"Model::A",""{} +Model:3018727302,"Model::A",""{} +Model:3019067721,"Model::A",""{} +Model:3020132841,"Model::A",""{} +Model:3020217908,"Model::A",""{} +Model:3021490433,"Model::A",""{} +Model:3022061252,"Model::A",""{} +Model:3023475981,"Model::A",""{} +Model:3023573779,"Model::A",""{} +Model:3024090377,"Model::A",""{} +Model:3024984767,"Model::A",""{} +Model:3026445574,"Model::A",""{} +Model:3026952075,"Model::A",""{} +Model:3027044279,"Model::A",""{} +Model:3027336464,"Model::A",""{} +Model:3027760403,"Model::A",""{} +Model:3028062813,"Model::A",""{} +Model:3028746628,"Model::A",""{} +Model:3029349682,"Model::A",""{} +Model:3029788717,"Model::A",""{} +Model:3030203019,"Model::A",""{} +Model:3030412549,"Model::A",""{} +Model:3030429939,"Model::A",""{} +Model:3030787507,"Model::A",""{} +Model:3031385235,"Model::A",""{} +Model:3032592716,"Model::A",""{} +Model:3032876957,"Model::A",""{} +Model:3033856807,"Model::A",""{} +Model:3034901602,"Model::A",""{} +Model:3035747658,"Model::A",""{} +Model:3035886718,"Model::A",""{} +Model:3036821764,"Model::A",""{} +Model:3037381787,"Model::A",""{} +Model:3037750505,"Model::A",""{} +Model:3040124121,"Model::A",""{} +Model:3040889588,"Model::A",""{} +Model:3043761750,"Model::A",""{} +Model:3044908821,"Model::A",""{} +Model:3045280678,"Model::A",""{} +Model:3045896122,"Model::A",""{} +Model:3046520636,"Model::A",""{} +Model:3046748830,"Model::A",""{} +Model:3046929656,"Model::A",""{} +Model:3047566779,"Model::A",""{} +Model:3048869553,"Model::A",""{} +Model:3049019229,"Model::A",""{} +Model:3049409350,"Model::A",""{} +Model:3050685671,"Model::A",""{} +Model:3051123727,"Model::A",""{} +Model:3051325681,"Model::A",""{} +Model:3052270175,"Model::A",""{} +Model:3054192630,"Model::A",""{} +Model:3054488471,"Model::A",""{} +Model:3054626703,"Model::A",""{} +Model:3055092394,"Model::A",""{} +Model:3055991729,"Model::A",""{} +Model:3058869835,"Model::A",""{} +Model:3059023757,"Model::A",""{} +Model:3059466127,"Model::A",""{} +Model:3059794665,"Model::A",""{} +Model:3060100058,"Model::A",""{} +Model:3060266870,"Model::A",""{} +Model:3060566702,"Model::A",""{} +Model:3061208648,"Model::A",""{} +Model:3061209797,"Model::A",""{} +Model:3061277289,"Model::A",""{} +Model:3061484242,"Model::A",""{} +Model:3062361563,"Model::A",""{} +Model:3063100279,"Model::A",""{} +Model:3064216009,"Model::A",""{} +Model:3065061366,"Model::A",""{} +Model:3065193914,"Model::A",""{} +Model:3065738367,"Model::A",""{} +Model:3067395427,"Model::A",""{} +Model:3068274565,"Model::A",""{} +Model:3069032055,"Model::A",""{} +Model:3072480035,"Model::A",""{} +Model:3073057388,"Model::A",""{} +Model:3073651952,"Model::A",""{} +Model:3074968099,"Model::A",""{} +Model:3075089274,"Model::A",""{} +Model:3076308320,"Model::A",""{} +Model:3077175615,"Model::A",""{} +Model:3078288790,"Model::A",""{} +Model:3078485421,"Model::A",""{} +Model:3079437147,"Model::A",""{} +Model:3079543390,"Model::A",""{} +Model:3079626467,"Model::A",""{} +Model:3079660335,"Model::A",""{} +Model:3080272221,"Model::A",""{} +Model:3080382022,"Model::A",""{} +Model:3080485828,"Model::A",""{} +Model:3081139751,"Model::A",""{} +Model:3081534221,"Model::A",""{} +Model:3082213136,"Model::A",""{} +Model:3082680890,"Model::A",""{} +Model:3082700571,"Model::A",""{} +Model:3083022442,"Model::A",""{} +Model:3083594650,"Model::A",""{} +Model:3083834311,"Model::A",""{} +Model:3084520568,"Model::A",""{} +Model:3084668705,"Model::A",""{} +Model:3084883059,"Model::A",""{} +Model:3085210988,"Model::A",""{} +Model:3085689937,"Model::A",""{} +Model:3085877490,"Model::A",""{} +Model:3087083140,"Model::A",""{} +Model:3087734647,"Model::A",""{} +Model:3088046327,"Model::A",""{} +Model:3088075047,"Model::A",""{} +Model:3088282702,"Model::A",""{} +Model:3089194225,"Model::A",""{} +Model:3089365684,"Model::A",""{} +Model:3090799411,"Model::A",""{} +Model:3093165866,"Model::A",""{} +Model:3093697427,"Model::A",""{} +Model:3093939642,"Model::A",""{} +Model:3094381942,"Model::A",""{} +Model:3095378014,"Model::A",""{} +Model:3095480759,"Model::A",""{} +Model:3096607731,"Model::A",""{} +Model:3097102780,"Model::A",""{} +Model:3097145037,"Model::A",""{} +Model:3097170268,"Model::A",""{} +Model:3097194218,"Model::A",""{} +Model:3097247757,"Model::A",""{} +Model:3097831705,"Model::A",""{} +Model:3099422187,"Model::A",""{} +Model:3099860240,"Model::A",""{} +Model:3100982666,"Model::A",""{} +Model:3101249877,"Model::A",""{} +Model:3102125526,"Model::A",""{} +Model:3104332539,"Model::A",""{} +Model:3104584677,"Model::A",""{} +Model:3105720249,"Model::A",""{} +Model:3105921830,"Model::A",""{} +Model:3106012820,"Model::A",""{} +Model:3107277297,"Model::A",""{} +Model:3107910861,"Model::A",""{} +Model:3108336669,"Model::A",""{} +Model:3109326143,"Model::A",""{} +Model:3112164083,"Model::A",""{} +Model:3113215173,"Model::A",""{} +Model:3113242942,"Model::A",""{} +Model:3114147679,"Model::A",""{} +Model:3114215774,"Model::A",""{} +Model:3115737813,"Model::A",""{} +Model:3116347642,"Model::A",""{} +Model:3116612463,"Model::A",""{} +Model:3116871632,"Model::A",""{} +Model:3117458931,"Model::A",""{} +Model:3117512223,"Model::A",""{} +Model:3119281990,"Model::A",""{} +Model:3119886719,"Model::A",""{} +Model:3120232491,"Model::A",""{} +Model:3121224363,"Model::A",""{} +Model:3121246674,"Model::A",""{} +Model:3122336191,"Model::A",""{} +Model:3122832604,"Model::A",""{} +Model:3122867365,"Model::A",""{} +Model:3122964474,"Model::A",""{} +Model:3123577002,"Model::A",""{} +Model:3123635735,"Model::A",""{} +Model:3123925906,"Model::A",""{} +Model:3125355951,"Model::A",""{} +Model:3125410942,"Model::A",""{} +Model:3125411946,"Model::A",""{} +Model:3125751510,"Model::A",""{} +Model:3126374242,"Model::A",""{} +Model:3127393238,"Model::A",""{} +Model:3127948053,"Model::A",""{} +Model:3128465885,"Model::A",""{} +Model:3130164841,"Model::A",""{} +Model:3130414324,"Model::A",""{} +Model:3130416277,"Model::A",""{} +Model:3130574681,"Model::A",""{} +Model:3131620676,"Model::A",""{} +Model:3132242799,"Model::A",""{} +Model:3132455249,"Model::A",""{} +Model:3132557818,"Model::A",""{} +Model:3132897761,"Model::A",""{} +Model:3132951710,"Model::A",""{} +Model:3135085575,"Model::A",""{} +Model:3135597978,"Model::A",""{} +Model:3135773589,"Model::A",""{} +Model:3135976335,"Model::A",""{} +Model:3136104181,"Model::A",""{} +Model:3136220731,"Model::A",""{} +Model:3136825207,"Model::A",""{} +Model:3137099054,"Model::A",""{} +Model:3137168037,"Model::A",""{} +Model:3138079326,"Model::A",""{} +Model:3139472893,"Model::A",""{} +Model:3139554078,"Model::A",""{} +Model:3139674356,"Model::A",""{} +Model:3140211314,"Model::A",""{} +Model:3140316311,"Model::A",""{} +Model:3140512484,"Model::A",""{} +Model:3141015883,"Model::A",""{} +Model:3141688023,"Model::A",""{} +Model:3141830551,"Model::A",""{} +Model:3142477502,"Model::A",""{} +Model:3143553139,"Model::A",""{} +Model:3143862556,"Model::A",""{} +Model:3144108915,"Model::A",""{} +Model:3144278050,"Model::A",""{} +Model:3144365721,"Model::A",""{} +Model:3144519604,"Model::A",""{} +Model:3144578627,"Model::A",""{} +Model:3144732929,"Model::A",""{} +Model:3144956665,"Model::A",""{} +Model:3145655785,"Model::A",""{} +Model:3146500237,"Model::A",""{} +Model:3146577805,"Model::A",""{} +Model:3147133022,"Model::A",""{} +Model:3147592502,"Model::A",""{} +Model:3147989325,"Model::A",""{} +Model:3148365318,"Model::A",""{} +Model:3149046581,"Model::A",""{} +Model:3150320957,"Model::A",""{} +Model:3151910814,"Model::A",""{} +Model:3152472157,"Model::A",""{} +Model:3152541596,"Model::A",""{} +Model:3154015331,"Model::A",""{} +Model:3155321467,"Model::A",""{} +Model:3155552678,"Model::A",""{} +Model:3155714428,"Model::A",""{} +Model:3157878196,"Model::A",""{} +Model:3158475818,"Model::A",""{} +Model:3158513234,"Model::A",""{} +Model:3160219612,"Model::A",""{} +Model:3160325054,"Model::A",""{} +Model:3160744106,"Model::A",""{} +Model:3160761428,"Model::A",""{} +Model:3161849458,"Model::A",""{} +Model:3164090027,"Model::A",""{} +Model:3165230043,"Model::A",""{} +Model:3166337596,"Model::A",""{} +Model:3166972684,"Model::A",""{} +Model:3168720781,"Model::A",""{} +Model:3168981437,"Model::A",""{} +Model:3169187271,"Model::A",""{} +Model:3169697461,"Model::A",""{} +Model:3169928222,"Model::A",""{} +Model:3171534035,"Model::A",""{} +Model:3172797278,"Model::A",""{} +Model:3173145858,"Model::A",""{} +Model:3173187206,"Model::A",""{} +Model:3174776855,"Model::A",""{} +Model:3175504431,"Model::A",""{} +Model:3176733031,"Model::A",""{} +Model:3176798782,"Model::A",""{} +Model:3177195986,"Model::A",""{} +Model:3178003265,"Model::A",""{} +Model:3178509707,"Model::A",""{} +Model:3178648749,"Model::A",""{} +Model:3178669883,"Model::A",""{} +Model:3178690841,"Model::A",""{} +Model:3178725272,"Model::A",""{} +Model:3180232443,"Model::A",""{} +Model:3180938216,"Model::A",""{} +Model:3181687417,"Model::A",""{} +Model:3181994408,"Model::A",""{} +Model:3182252082,"Model::A",""{} +Model:3183925141,"Model::A",""{} +Model:3184114220,"Model::A",""{} +Model:3184226062,"Model::A",""{} +Model:3184719491,"Model::A",""{} +Model:3186581852,"Model::A",""{} +Model:3188979977,"Model::A",""{} +Model:3189509979,"Model::A",""{} +Model:3189918741,"Model::A",""{} +Model:3190183902,"Model::A",""{} +Model:3190532337,"Model::A",""{} +Model:3190714403,"Model::A",""{} +Model:3190716381,"Model::A",""{} +Model:3191421091,"Model::A",""{} +Model:3192184084,"Model::A",""{} +Model:3194208956,"Model::A",""{} +Model:3195719394,"Model::A",""{} +Model:3196076383,"Model::A",""{} +Model:3196093081,"Model::A",""{} +Model:3196564690,"Model::A",""{} +Model:3196987574,"Model::A",""{} +Model:3197079514,"Model::A",""{} +Model:3197231978,"Model::A",""{} +Model:3197269133,"Model::A",""{} +Model:3197708899,"Model::A",""{} +Model:3198828255,"Model::A",""{} +Model:3199207118,"Model::A",""{} +Model:3199429810,"Model::A",""{} +Model:3199599713,"Model::A",""{} +Model:3199722998,"Model::A",""{} +Model:3199932218,"Model::A",""{} +Model:3200910398,"Model::A",""{} +Model:3201961606,"Model::A",""{} +Model:3202416091,"Model::A",""{} +Model:3203661766,"Model::A",""{} +Model:3204359843,"Model::A",""{} +Model:3204888422,"Model::A",""{} +Model:3206035541,"Model::A",""{} +Model:3206982634,"Model::A",""{} +Model:3207696599,"Model::A",""{} +Model:3208074341,"Model::A",""{} +Model:3208259159,"Model::A",""{} +Model:3208743646,"Model::A",""{} +Model:3209204575,"Model::A",""{} +Model:3210463094,"Model::A",""{} +Model:3210463751,"Model::A",""{} +Model:3210794394,"Model::A",""{} +Model:3210981353,"Model::A",""{} +Model:3211795643,"Model::A",""{} +Model:3213359398,"Model::A",""{} +Model:3213630365,"Model::A",""{} +Model:3215329038,"Model::A",""{} +Model:3215677797,"Model::A",""{} +Model:3216096700,"Model::A",""{} +Model:3217743057,"Model::A",""{} +Model:3218180722,"Model::A",""{} +Model:3218231010,"Model::A",""{} +Model:3218391659,"Model::A",""{} +Model:3218410838,"Model::A",""{} +Model:3218806225,"Model::A",""{} +Model:3220092284,"Model::A",""{} +Model:3220153158,"Model::A",""{} +Model:3221462405,"Model::A",""{} +Model:3224130645,"Model::A",""{} +Model:3224355908,"Model::A",""{} +Model:3224553190,"Model::A",""{} +Model:3224713561,"Model::A",""{} +Model:3224932315,"Model::A",""{} +Model:3225113979,"Model::A",""{} +Model:3226131418,"Model::A",""{} +Model:3226743518,"Model::A",""{} +Model:3227135962,"Model::A",""{} +Model:3227518911,"Model::A",""{} +Model:3227792996,"Model::A",""{} +Model:3230123559,"Model::A",""{} +Model:3230151428,"Model::A",""{} +Model:3230175550,"Model::A",""{} +Model:3230583169,"Model::A",""{} +Model:3231295450,"Model::A",""{} +Model:3231467887,"Model::A",""{} +Model:3232399442,"Model::A",""{} +Model:3233135358,"Model::A",""{} +Model:3233908472,"Model::A",""{} +Model:3235876417,"Model::A",""{} +Model:3238059181,"Model::A",""{} +Model:3238293134,"Model::A",""{} +Model:3238837269,"Model::A",""{} +Model:3239002350,"Model::A",""{} +Model:3239059383,"Model::A",""{} +Model:3240470166,"Model::A",""{} +Model:3240638313,"Model::A",""{} +Model:3240895544,"Model::A",""{} +Model:3240906726,"Model::A",""{} +Model:3241363097,"Model::A",""{} +Model:3241631287,"Model::A",""{} +Model:3241920798,"Model::A",""{} +Model:3242328318,"Model::A",""{} +Model:3242540037,"Model::A",""{} +Model:3242560851,"Model::A",""{} +Model:3243851251,"Model::A",""{} +Model:3243898711,"Model::A",""{} +Model:3244392858,"Model::A",""{} +Model:3244510003,"Model::A",""{} +Model:3244962011,"Model::A",""{} +Model:3245932437,"Model::A",""{} +Model:3246660439,"Model::A",""{} +Model:3246685706,"Model::A",""{} +Model:3247319950,"Model::A",""{} +Model:3248311232,"Model::A",""{} +Model:3249562751,"Model::A",""{} +Model:3250755766,"Model::A",""{} +Model:3251381254,"Model::A",""{} +Model:3252676110,"Model::A",""{} +Model:3252780695,"Model::A",""{} +Model:3253996478,"Model::A",""{} +Model:3254044361,"Model::A",""{} +Model:3254141391,"Model::A",""{} +Model:3254303108,"Model::A",""{} +Model:3254674508,"Model::A",""{} +Model:3256709151,"Model::A",""{} +Model:3257458258,"Model::A",""{} +Model:3257795758,"Model::A",""{} +Model:3257856566,"Model::A",""{} +Model:3258209186,"Model::A",""{} +Model:3258997115,"Model::A",""{} +Model:3259727282,"Model::A",""{} +Model:3260041734,"Model::A",""{} +Model:3261414446,"Model::A",""{} +Model:3261490351,"Model::A",""{} +Model:3261655397,"Model::A",""{} +Model:3261737884,"Model::A",""{} +Model:3262274809,"Model::A",""{} +Model:3263080039,"Model::A",""{} +Model:3264216992,"Model::A",""{} +Model:3264637494,"Model::A",""{} +Model:3265926019,"Model::A",""{} +Model:3265948577,"Model::A",""{} +Model:3266107509,"Model::A",""{} +Model:3266313166,"Model::A",""{} +Model:3267524257,"Model::A",""{} +Model:3267778287,"Model::A",""{} +Model:3267887096,"Model::A",""{} +Model:3267964730,"Model::A",""{} +Model:3268576217,"Model::A",""{} +Model:3269060577,"Model::A",""{} +Model:3269595464,"Model::A",""{} +Model:3269755108,"Model::A",""{} +Model:3271446167,"Model::A",""{} +Model:3272001662,"Model::A",""{} +Model:3272243415,"Model::A",""{} +Model:3272523082,"Model::A",""{} +Model:3273076177,"Model::A",""{} +Model:3273248695,"Model::A",""{} +Model:3273921272,"Model::A",""{} +Model:3274647057,"Model::A",""{} +Model:3275121377,"Model::A",""{} +Model:3275565123,"Model::A",""{} +Model:3276451521,"Model::A",""{} +Model:3277507701,"Model::A",""{} +Model:3278021038,"Model::A",""{} +Model:3278951597,"Model::A",""{} +Model:3278971472,"Model::A",""{} +Model:3279518307,"Model::A",""{} +Model:3280151003,"Model::A",""{} +Model:3280196397,"Model::A",""{} +Model:3281035496,"Model::A",""{} +Model:3281141105,"Model::A",""{} +Model:3281922102,"Model::A",""{} +Model:3283040717,"Model::A",""{} +Model:3283222244,"Model::A",""{} +Model:3283309917,"Model::A",""{} +Model:3283377714,"Model::A",""{} +Model:3283945315,"Model::A",""{} +Model:3285107550,"Model::A",""{} +Model:3286277687,"Model::A",""{} +Model:3286797249,"Model::A",""{} +Model:3287679223,"Model::A",""{} +Model:3289237622,"Model::A",""{} +Model:3290017736,"Model::A",""{} +Model:3290125363,"Model::A",""{} +Model:3290800441,"Model::A",""{} +Model:3292250502,"Model::A",""{} +Model:3293799595,"Model::A",""{} +Model:3293991741,"Model::A",""{} +Model:3294734241,"Model::A",""{} +Model:3295992047,"Model::A",""{} +Model:3296698376,"Model::A",""{} +Model:3297933590,"Model::A",""{} +Model:3298232497,"Model::A",""{} +Model:3299693453,"Model::A",""{} +Model:3300030329,"Model::A",""{} +Model:3300352448,"Model::A",""{} +Model:3300436177,"Model::A",""{} +Model:3301155200,"Model::A",""{} +Model:3301735482,"Model::A",""{} +Model:3301802835,"Model::A",""{} +Model:3301904441,"Model::A",""{} +Model:3302155819,"Model::A",""{} +Model:3303086733,"Model::A",""{} +Model:3303935254,"Model::A",""{} +Model:3305927035,"Model::A",""{} +Model:3306108110,"Model::A",""{} +Model:3306184322,"Model::A",""{} +Model:3306711827,"Model::A",""{} +Model:3306868295,"Model::A",""{} +Model:3307273163,"Model::A",""{} +Model:3307947404,"Model::A",""{} +Model:3308694920,"Model::A",""{} +Model:3309254953,"Model::A",""{} +Model:3311199505,"Model::A",""{} +Model:3311542769,"Model::A",""{} +Model:3311564377,"Model::A",""{} +Model:3311824809,"Model::A",""{} +Model:3312109382,"Model::A",""{} +Model:3312139084,"Model::A",""{} +Model:3313634039,"Model::A",""{} +Model:3314440799,"Model::A",""{} +Model:3315462884,"Model::A",""{} +Model:3315723567,"Model::A",""{} +Model:3316761628,"Model::A",""{} +Model:3317648249,"Model::A",""{} +Model:3318100453,"Model::A",""{} +Model:3320124641,"Model::A",""{} +Model:3320427680,"Model::A",""{} +Model:3320854789,"Model::A",""{} +Model:3320949423,"Model::A",""{} +Model:3320949644,"Model::A",""{} +Model:3322199041,"Model::A",""{} +Model:3322634766,"Model::A",""{} +Model:3322658469,"Model::A",""{} +Model:3323081383,"Model::A",""{} +Model:3323162814,"Model::A",""{} +Model:3323193343,"Model::A",""{} +Model:3323547844,"Model::A",""{} +Model:3324058823,"Model::A",""{} +Model:3324634970,"Model::A",""{} +Model:3325587110,"Model::A",""{} +Model:3325724002,"Model::A",""{} +Model:3326237815,"Model::A",""{} +Model:3326470169,"Model::A",""{} +Model:3326473148,"Model::A",""{} +Model:3327822944,"Model::A",""{} +Model:3329757377,"Model::A",""{} +Model:3329920651,"Model::A",""{} +Model:3330156943,"Model::A",""{} +Model:3331037194,"Model::A",""{} +Model:3331100306,"Model::A",""{} +Model:3333186939,"Model::A",""{} +Model:3333260588,"Model::A",""{} +Model:3333417669,"Model::A",""{} +Model:3333427381,"Model::A",""{} +Model:3333764330,"Model::A",""{} +Model:3334013447,"Model::A",""{} +Model:3334057876,"Model::A",""{} +Model:3334625769,"Model::A",""{} +Model:3334711396,"Model::A",""{} +Model:3334783556,"Model::A",""{} +Model:3335160805,"Model::A",""{} +Model:3335316519,"Model::A",""{} +Model:3336574112,"Model::A",""{} +Model:3337252597,"Model::A",""{} +Model:3337565549,"Model::A",""{} +Model:3337756421,"Model::A",""{} +Model:3337940888,"Model::A",""{} +Model:3337979995,"Model::A",""{} +Model:3338204287,"Model::A",""{} +Model:3338694884,"Model::A",""{} +Model:3338751239,"Model::A",""{} +Model:3339743909,"Model::A",""{} +Model:3339931245,"Model::A",""{} +Model:3339952026,"Model::A",""{} +Model:3340780522,"Model::A",""{} +Model:3341012596,"Model::A",""{} +Model:3341093972,"Model::A",""{} +Model:3344876547,"Model::A",""{} +Model:3344921217,"Model::A",""{} +Model:3345575146,"Model::A",""{} +Model:3346087444,"Model::A",""{} +Model:3346225687,"Model::A",""{} +Model:3346232289,"Model::A",""{} +Model:3349975067,"Model::A",""{} +Model:3350033691,"Model::A",""{} +Model:3350874503,"Model::A",""{} +Model:3351074533,"Model::A",""{} +Model:3351098950,"Model::A",""{} +Model:3351554210,"Model::A",""{} +Model:3352887534,"Model::A",""{} +Model:3353634164,"Model::A",""{} +Model:3354467690,"Model::A",""{} +Model:3354689413,"Model::A",""{} +Model:3356606989,"Model::A",""{} +Model:3356612985,"Model::A",""{} +Model:3356708288,"Model::A",""{} +Model:3357999488,"Model::A",""{} +Model:3358433636,"Model::A",""{} +Model:3358512986,"Model::A",""{} +Model:3359520039,"Model::A",""{} +Model:3359541091,"Model::A",""{} +Model:3360018090,"Model::A",""{} +Model:3360104146,"Model::A",""{} +Model:3361113344,"Model::A",""{} +Model:3361992613,"Model::A",""{} +Model:3363434422,"Model::A",""{} +Model:3364549977,"Model::A",""{} +Model:3365167497,"Model::A",""{} +Model:3365342827,"Model::A",""{} +Model:3365586512,"Model::A",""{} +Model:3366237429,"Model::A",""{} +Model:3366568087,"Model::A",""{} +Model:3367084513,"Model::A",""{} +Model:3367733421,"Model::A",""{} +Model:3367872407,"Model::A",""{} +Model:3369273282,"Model::A",""{} +Model:3370837829,"Model::A",""{} +Model:3370847122,"Model::A",""{} +Model:3371889121,"Model::A",""{} +Model:3372129278,"Model::A",""{} +Model:3372205450,"Model::A",""{} +Model:3372848623,"Model::A",""{} +Model:3372985880,"Model::A",""{} +Model:3373475131,"Model::A",""{} +Model:3373964228,"Model::A",""{} +Model:3375226718,"Model::A",""{} +Model:3376009342,"Model::A",""{} +Model:3376377122,"Model::A",""{} +Model:3376412206,"Model::A",""{} +Model:3377418314,"Model::A",""{} +Model:3377892896,"Model::A",""{} +Model:3378041144,"Model::A",""{} +Model:3378061281,"Model::A",""{} +Model:3378203372,"Model::A",""{} +Model:3378680226,"Model::A",""{} +Model:3379365989,"Model::A",""{} +Model:3379815975,"Model::A",""{} +Model:3379944177,"Model::A",""{} +Model:3381106966,"Model::A",""{} +Model:3381348199,"Model::A",""{} +Model:3383736542,"Model::A",""{} +Model:3384118177,"Model::A",""{} +Model:3384260675,"Model::A",""{} +Model:3384336429,"Model::A",""{} +Model:3385594855,"Model::A",""{} +Model:3385761536,"Model::A",""{} +Model:3386018641,"Model::A",""{} +Model:3386475018,"Model::A",""{} +Model:3388245980,"Model::A",""{} +Model:3388399785,"Model::A",""{} +Model:3388563091,"Model::A",""{} +Model:3389594762,"Model::A",""{} +Model:3389923247,"Model::A",""{} +Model:3391681215,"Model::A",""{} +Model:3391786785,"Model::A",""{} +Model:3391957638,"Model::A",""{} +Model:3393599755,"Model::A",""{} +Model:3393615893,"Model::A",""{} +Model:3394394381,"Model::A",""{} +Model:3395249353,"Model::A",""{} +Model:3396787010,"Model::A",""{} +Model:3397878140,"Model::A",""{} +Model:3399124665,"Model::A",""{} +Model:3399769602,"Model::A",""{} +Model:3399974864,"Model::A",""{} +Model:3401076377,"Model::A",""{} +Model:3401142374,"Model::A",""{} +Model:3401605482,"Model::A",""{} +Model:3401940410,"Model::A",""{} +Model:3403056884,"Model::A",""{} +Model:3403223884,"Model::A",""{} +Model:3403271207,"Model::A",""{} +Model:3403347906,"Model::A",""{} +Model:3403408031,"Model::A",""{} +Model:3403972450,"Model::A",""{} +Model:3404669505,"Model::A",""{} +Model:3405737828,"Model::A",""{} +Model:3406006853,"Model::A",""{} +Model:3407210515,"Model::A",""{} +Model:3407604417,"Model::A",""{} +Model:3408034958,"Model::A",""{} +Model:3408556268,"Model::A",""{} +Model:3409402674,"Model::A",""{} +Model:3409793044,"Model::A",""{} +Model:3409867996,"Model::A",""{} +Model:3410531542,"Model::A",""{} +Model:3410631035,"Model::A",""{} +Model:3411032755,"Model::A",""{} +Model:3411270435,"Model::A",""{} +Model:3411302373,"Model::A",""{} +Model:3411309719,"Model::A",""{} +Model:3412581058,"Model::A",""{} +Model:3413397001,"Model::A",""{} +Model:3414194586,"Model::A",""{} +Model:3415156335,"Model::A",""{} +Model:3415356267,"Model::A",""{} +Model:3416793308,"Model::A",""{} +Model:3417043598,"Model::A",""{} +Model:3417655261,"Model::A",""{} +Model:3417836000,"Model::A",""{} +Model:3418490438,"Model::A",""{} +Model:3419034665,"Model::A",""{} +Model:3420722253,"Model::A",""{} +Model:3421542319,"Model::A",""{} +Model:3421839581,"Model::A",""{} +Model:3423092991,"Model::A",""{} +Model:3423160569,"Model::A",""{} +Model:3423538211,"Model::A",""{} +Model:3423650855,"Model::A",""{} +Model:3423726459,"Model::A",""{} +Model:3424488320,"Model::A",""{} +Model:3424555160,"Model::A",""{} +Model:3424800932,"Model::A",""{} +Model:3425687025,"Model::A",""{} +Model:3426550268,"Model::A",""{} +Model:3428704088,"Model::A",""{} +Model:3429926214,"Model::A",""{} +Model:3430140395,"Model::A",""{} +Model:3432313682,"Model::A",""{} +Model:3432746847,"Model::A",""{} +Model:3432888450,"Model::A",""{} +Model:3434383706,"Model::A",""{} +Model:3434939457,"Model::A",""{} +Model:3436054415,"Model::A",""{} +Model:3437099509,"Model::A",""{} +Model:3437301085,"Model::A",""{} +Model:3437321877,"Model::A",""{} +Model:3437356078,"Model::A",""{} +Model:3437447253,"Model::A",""{} +Model:3437676641,"Model::A",""{} +Model:3438659530,"Model::A",""{} +Model:3438710551,"Model::A",""{} +Model:3438806287,"Model::A",""{} +Model:3439025978,"Model::A",""{} +Model:3439186660,"Model::A",""{} +Model:3439543251,"Model::A",""{} +Model:3439648346,"Model::A",""{} +Model:3440957955,"Model::A",""{} +Model:3441583966,"Model::A",""{} +Model:3441686559,"Model::A",""{} +Model:3442395602,"Model::A",""{} +Model:3442649943,"Model::A",""{} +Model:3443923495,"Model::A",""{} +Model:3444629131,"Model::A",""{} +Model:3444784819,"Model::A",""{} +Model:3446201506,"Model::A",""{} +Model:3446659453,"Model::A",""{} +Model:3447030032,"Model::A",""{} +Model:3447482851,"Model::A",""{} +Model:3448422557,"Model::A",""{} +Model:3448568997,"Model::A",""{} +Model:3449220101,"Model::A",""{} +Model:3450420973,"Model::A",""{} +Model:3451338782,"Model::A",""{} +Model:3452461241,"Model::A",""{} +Model:3454931651,"Model::A",""{} +Model:3456165748,"Model::A",""{} +Model:3456276115,"Model::A",""{} +Model:3456432674,"Model::A",""{} +Model:3456446702,"Model::A",""{} +Model:3456811039,"Model::A",""{} +Model:3458611601,"Model::A",""{} +Model:3459377740,"Model::A",""{} +Model:3459720686,"Model::A",""{} +Model:3460116246,"Model::A",""{} +Model:3460616327,"Model::A",""{} +Model:3460710413,"Model::A",""{} +Model:3460826815,"Model::A",""{} +Model:3461409658,"Model::A",""{} +Model:3462203357,"Model::A",""{} +Model:3463455966,"Model::A",""{} +Model:3463684681,"Model::A",""{} +Model:3464737014,"Model::A",""{} +Model:3465451925,"Model::A",""{} +Model:3465595471,"Model::A",""{} +Model:3466933900,"Model::A",""{} +Model:3467392724,"Model::A",""{} +Model:3467792258,"Model::A",""{} +Model:3468062610,"Model::A",""{} +Model:3468164109,"Model::A",""{} +Model:3469169474,"Model::A",""{} +Model:3469399198,"Model::A",""{} +Model:3469812646,"Model::A",""{} +Model:3470195071,"Model::A",""{} +Model:3471366175,"Model::A",""{} +Model:3471824620,"Model::A",""{} +Model:3471857366,"Model::A",""{} +Model:3471970907,"Model::A",""{} +Model:3472067290,"Model::A",""{} +Model:3472865345,"Model::A",""{} +Model:3473854010,"Model::A",""{} +Model:3475420695,"Model::A",""{} +Model:3478603827,"Model::A",""{} +Model:3478736606,"Model::A",""{} +Model:3480198087,"Model::A",""{} +Model:3480859593,"Model::A",""{} +Model:3482143058,"Model::A",""{} +Model:3482614846,"Model::A",""{} +Model:3482802206,"Model::A",""{} +Model:3483434842,"Model::A",""{} +Model:3483453081,"Model::A",""{} +Model:3483620717,"Model::A",""{} +Model:3483669642,"Model::A",""{} +Model:3484260979,"Model::A",""{} +Model:3484778265,"Model::A",""{} +Model:3485340073,"Model::A",""{} +Model:3485369995,"Model::A",""{} +Model:3485767994,"Model::A",""{} +Model:3486849239,"Model::A",""{} +Model:3487128087,"Model::A",""{} +Model:3487696487,"Model::A",""{} +Model:3488326772,"Model::A",""{} +Model:3489149337,"Model::A",""{} +Model:3490845015,"Model::A",""{} +Model:3492259743,"Model::A",""{} +Model:3493814288,"Model::A",""{} +Model:3496239028,"Model::A",""{} +Model:3497048255,"Model::A",""{} +Model:3497654317,"Model::A",""{} +Model:3498036940,"Model::A",""{} +Model:3500322939,"Model::A",""{} +Model:3500864649,"Model::A",""{} +Model:3502288373,"Model::A",""{} +Model:3502845674,"Model::A",""{} +Model:3503466597,"Model::A",""{} +Model:3503472740,"Model::A",""{} +Model:3503614834,"Model::A",""{} +Model:3504004924,"Model::A",""{} +Model:3504427301,"Model::A",""{} +Model:3504584842,"Model::A",""{} +Model:3504671361,"Model::A",""{} +Model:3509934428,"Model::A",""{} +Model:3511625210,"Model::A",""{} +Model:3511638721,"Model::A",""{} +Model:3511655922,"Model::A",""{} +Model:3511957743,"Model::A",""{} +Model:3513512275,"Model::A",""{} +Model:3514412639,"Model::A",""{} +Model:3515003084,"Model::A",""{} +Model:3515371924,"Model::A",""{} +Model:3515968339,"Model::A",""{} +Model:3516176566,"Model::A",""{} +Model:3517000938,"Model::A",""{} +Model:3518416946,"Model::A",""{} +Model:3518497066,"Model::A",""{} +Model:3519632840,"Model::A",""{} +Model:3520485572,"Model::A",""{} +Model:3520693998,"Model::A",""{} +Model:3521358354,"Model::A",""{} +Model:3521933345,"Model::A",""{} +Model:3522112162,"Model::A",""{} +Model:3522336563,"Model::A",""{} +Model:3525005811,"Model::A",""{} +Model:3525592429,"Model::A",""{} +Model:3526706973,"Model::A",""{} +Model:3526813367,"Model::A",""{} +Model:3527086087,"Model::A",""{} +Model:3528753213,"Model::A",""{} +Model:3528931996,"Model::A",""{} +Model:3529159842,"Model::A",""{} +Model:3529699509,"Model::A",""{} +Model:3530401571,"Model::A",""{} +Model:3530499669,"Model::A",""{} +Model:3531344873,"Model::A",""{} +Model:3532571063,"Model::A",""{} +Model:3532987069,"Model::A",""{} +Model:3533059499,"Model::A",""{} +Model:3533185760,"Model::A",""{} +Model:3533566066,"Model::A",""{} +Model:3533589076,"Model::A",""{} +Model:3534643558,"Model::A",""{} +Model:3535057313,"Model::A",""{} +Model:3535558474,"Model::A",""{} +Model:3535809181,"Model::A",""{} +Model:3535838267,"Model::A",""{} +Model:3536983586,"Model::A",""{} +Model:3538157860,"Model::A",""{} +Model:3538647614,"Model::A",""{} +Model:3538751861,"Model::A",""{} +Model:3538974604,"Model::A",""{} +Model:3539037634,"Model::A",""{} +Model:3540838804,"Model::A",""{} +Model:3541578371,"Model::A",""{} +Model:3541743646,"Model::A",""{} +Model:3541859500,"Model::A",""{} +Model:3541936427,"Model::A",""{} +Model:3544326820,"Model::A",""{} +Model:3544530556,"Model::A",""{} +Model:3544939899,"Model::A",""{} +Model:3545490745,"Model::A",""{} +Model:3545887274,"Model::A",""{} +Model:3545972698,"Model::A",""{} +Model:3546052950,"Model::A",""{} +Model:3546837346,"Model::A",""{} +Model:3547386574,"Model::A",""{} +Model:3548953018,"Model::A",""{} +Model:3549819275,"Model::A",""{} +Model:3550041008,"Model::A",""{} +Model:3550052293,"Model::A",""{} +Model:3550076407,"Model::A",""{} +Model:3550248848,"Model::A",""{} +Model:3551452758,"Model::A",""{} +Model:3551643739,"Model::A",""{} +Model:3553110373,"Model::A",""{} +Model:3553228331,"Model::A",""{} +Model:3553572783,"Model::A",""{} +Model:3553681449,"Model::A",""{} +Model:3555103460,"Model::A",""{} +Model:3555376811,"Model::A",""{} +Model:3556014918,"Model::A",""{} +Model:3556190662,"Model::A",""{} +Model:3556859093,"Model::A",""{} +Model:3557319395,"Model::A",""{} +Model:3557547673,"Model::A",""{} +Model:3557964497,"Model::A",""{} +Model:3558608360,"Model::A",""{} +Model:3558977937,"Model::A",""{} +Model:3559523569,"Model::A",""{} +Model:3559589276,"Model::A",""{} +Model:3559889542,"Model::A",""{} +Model:3561059427,"Model::A",""{} +Model:3561672061,"Model::A",""{} +Model:3561822074,"Model::A",""{} +Model:3564015385,"Model::A",""{} +Model:3564914755,"Model::A",""{} +Model:3565228334,"Model::A",""{} +Model:3565557761,"Model::A",""{} +Model:3565683299,"Model::A",""{} +Model:3566682011,"Model::A",""{} +Model:3567166135,"Model::A",""{} +Model:3567254023,"Model::A",""{} +Model:3567445071,"Model::A",""{} +Model:3567763180,"Model::A",""{} +Model:3567827541,"Model::A",""{} +Model:3568110766,"Model::A",""{} +Model:3568131878,"Model::A",""{} +Model:3568427950,"Model::A",""{} +Model:3568504022,"Model::A",""{} +Model:3568910788,"Model::A",""{} +Model:3569971089,"Model::A",""{} +Model:3570309718,"Model::A",""{} +Model:3570819998,"Model::A",""{} +Model:3571333731,"Model::A",""{} +Model:3571588484,"Model::A",""{} +Model:3572467892,"Model::A",""{} +Model:3573377723,"Model::A",""{} +Model:3573836786,"Model::A",""{} +Model:3574048592,"Model::A",""{} +Model:3574064373,"Model::A",""{} +Model:3574268466,"Model::A",""{} +Model:3575215195,"Model::A",""{} +Model:3575283298,"Model::A",""{} +Model:3575480878,"Model::A",""{} +Model:3575966181,"Model::A",""{} +Model:3576786028,"Model::A",""{} +Model:3577048509,"Model::A",""{} +Model:3577187553,"Model::A",""{} +Model:3577212765,"Model::A",""{} +Model:3577382903,"Model::A",""{} +Model:3577723609,"Model::A",""{} +Model:3577957690,"Model::A",""{} +Model:3578365171,"Model::A",""{} +Model:3579318416,"Model::A",""{} +Model:3579509977,"Model::A",""{} +Model:3580630209,"Model::A",""{} +Model:3581932953,"Model::A",""{} +Model:3582429825,"Model::A",""{} +Model:3582814162,"Model::A",""{} +Model:3583276019,"Model::A",""{} +Model:3583383580,"Model::A",""{} +Model:3586168305,"Model::A",""{} +Model:3586362015,"Model::A",""{} +Model:3588476024,"Model::A",""{} +Model:3589569249,"Model::A",""{} +Model:3590039594,"Model::A",""{} +Model:3590072149,"Model::A",""{} +Model:3592505887,"Model::A",""{} +Model:3593098703,"Model::A",""{} +Model:3593242407,"Model::A",""{} +Model:3594374555,"Model::A",""{} +Model:3594724178,"Model::A",""{} +Model:3595305766,"Model::A",""{} +Model:3595508849,"Model::A",""{} +Model:3596278270,"Model::A",""{} +Model:3596763762,"Model::A",""{} +Model:3596913914,"Model::A",""{} +Model:3597079679,"Model::A",""{} +Model:3597389106,"Model::A",""{} +Model:3597649793,"Model::A",""{} +Model:3597762859,"Model::A",""{} +Model:3598074929,"Model::A",""{} +Model:3599695827,"Model::A",""{} +Model:3599806895,"Model::A",""{} +Model:3601031863,"Model::A",""{} +Model:3602183874,"Model::A",""{} +Model:3603418265,"Model::A",""{} +Model:3604485860,"Model::A",""{} +Model:3605037682,"Model::A",""{} +Model:3605097418,"Model::A",""{} +Model:3605355435,"Model::A",""{} +Model:3606833865,"Model::A",""{} +Model:3608902095,"Model::A",""{} +Model:3609667282,"Model::A",""{} +Model:3609788229,"Model::A",""{} +Model:3610806258,"Model::A",""{} +Model:3612410841,"Model::A",""{} +Model:3612655226,"Model::A",""{} +Model:3612755578,"Model::A",""{} +Model:3613438331,"Model::A",""{} +Model:3613972815,"Model::A",""{} +Model:3614414437,"Model::A",""{} +Model:3615289042,"Model::A",""{} +Model:3615982771,"Model::A",""{} +Model:3617345651,"Model::A",""{} +Model:3618155681,"Model::A",""{} +Model:3619029572,"Model::A",""{} +Model:3619081590,"Model::A",""{} +Model:3620538990,"Model::A",""{} +Model:3623339243,"Model::A",""{} +Model:3623374521,"Model::A",""{} +Model:3624056759,"Model::A",""{} +Model:3624191485,"Model::A",""{} +Model:3624592268,"Model::A",""{} +Model:3624782747,"Model::A",""{} +Model:3625000231,"Model::A",""{} +Model:3625629059,"Model::A",""{} +Model:3625695679,"Model::A",""{} +Model:3626632641,"Model::A",""{} +Model:3627264214,"Model::A",""{} +Model:3627265434,"Model::A",""{} +Model:3627275838,"Model::A",""{} +Model:3629122403,"Model::A",""{} +Model:3629163787,"Model::A",""{} +Model:3630025961,"Model::A",""{} +Model:3630376853,"Model::A",""{} +Model:3630493286,"Model::A",""{} +Model:3632211890,"Model::A",""{} +Model:3632842915,"Model::A",""{} +Model:3633579649,"Model::A",""{} +Model:3634050534,"Model::A",""{} +Model:3634309057,"Model::A",""{} +Model:3634356281,"Model::A",""{} +Model:3634548603,"Model::A",""{} +Model:3635455426,"Model::A",""{} +Model:3635967788,"Model::A",""{} +Model:3636211462,"Model::A",""{} +Model:3636425583,"Model::A",""{} +Model:3637832867,"Model::A",""{} +Model:3638778463,"Model::A",""{} +Model:3639174750,"Model::A",""{} +Model:3639377336,"Model::A",""{} +Model:3639458659,"Model::A",""{} +Model:3640219637,"Model::A",""{} +Model:3640290342,"Model::A",""{} +Model:3640418897,"Model::A",""{} +Model:3640441103,"Model::A",""{} +Model:3640784457,"Model::A",""{} +Model:3641196842,"Model::A",""{} +Model:3641466013,"Model::A",""{} +Model:3641866629,"Model::A",""{} +Model:3642737533,"Model::A",""{} +Model:3643656906,"Model::A",""{} +Model:3644084618,"Model::A",""{} +Model:3645054707,"Model::A",""{} +Model:3645510377,"Model::A",""{} +Model:3646141078,"Model::A",""{} +Model:3646397185,"Model::A",""{} +Model:3646522127,"Model::A",""{} +Model:3646869172,"Model::A",""{} +Model:3648266888,"Model::A",""{} +Model:3648504596,"Model::A",""{} +Model:3649453472,"Model::A",""{} +Model:3649937806,"Model::A",""{} +Model:3650055851,"Model::A",""{} +Model:3651561823,"Model::A",""{} +Model:3651565903,"Model::A",""{} +Model:3651927101,"Model::A",""{} +Model:3652394143,"Model::A",""{} +Model:3652416081,"Model::A",""{} +Model:3652998491,"Model::A",""{} +Model:3653855745,"Model::A",""{} +Model:3653909215,"Model::A",""{} +Model:3654116972,"Model::A",""{} +Model:3655139997,"Model::A",""{} +Model:3655397242,"Model::A",""{} +Model:3657072306,"Model::A",""{} +Model:3657229664,"Model::A",""{} +Model:3657413972,"Model::A",""{} +Model:3657746252,"Model::A",""{} +Model:3658084555,"Model::A",""{} +Model:3660840127,"Model::A",""{} +Model:3661440093,"Model::A",""{} +Model:3662103074,"Model::A",""{} +Model:3663192310,"Model::A",""{} +Model:3663461349,"Model::A",""{} +Model:3664004470,"Model::A",""{} +Model:3664137626,"Model::A",""{} +Model:3664189066,"Model::A",""{} +Model:3664738639,"Model::A",""{} +Model:3664838318,"Model::A",""{} +Model:3665029081,"Model::A",""{} +Model:3665366881,"Model::A",""{} +Model:3665472657,"Model::A",""{} +Model:3666317346,"Model::A",""{} +Model:3668817938,"Model::A",""{} +Model:3669227773,"Model::A",""{} +Model:3669833193,"Model::A",""{} +Model:3670534523,"Model::A",""{} +Model:3671415682,"Model::A",""{} +Model:3673048031,"Model::A",""{} +Model:3673301494,"Model::A",""{} +Model:3673966098,"Model::A",""{} +Model:3675303963,"Model::A",""{} +Model:3675761997,"Model::A",""{} +Model:3676275169,"Model::A",""{} +Model:3676766379,"Model::A",""{} +Model:3677070862,"Model::A",""{} +Model:3677613884,"Model::A",""{} +Model:3677718315,"Model::A",""{} +Model:3678301994,"Model::A",""{} +Model:3678440610,"Model::A",""{} +Model:3678964742,"Model::A",""{} +Model:3679017313,"Model::A",""{} +Model:3679083166,"Model::A",""{} +Model:3679563058,"Model::A",""{} +Model:3679625636,"Model::A",""{} +Model:3680162117,"Model::A",""{} +Model:3681314723,"Model::A",""{} +Model:3681557895,"Model::A",""{} +Model:3681913526,"Model::A",""{} +Model:3683306999,"Model::A",""{} +Model:3684318746,"Model::A",""{} +Model:3684511311,"Model::A",""{} +Model:3685077366,"Model::A",""{} +Model:3685432201,"Model::A",""{} +Model:3686052639,"Model::A",""{} +Model:3687497553,"Model::A",""{} +Model:3688240222,"Model::A",""{} +Model:3688744660,"Model::A",""{} +Model:3689307988,"Model::A",""{} +Model:3689761029,"Model::A",""{} +Model:3690777255,"Model::A",""{} +Model:3691120018,"Model::A",""{} +Model:3691142060,"Model::A",""{} +Model:3691778757,"Model::A",""{} +Model:3691835308,"Model::A",""{} +Model:3692151951,"Model::A",""{} +Model:3692434131,"Model::A",""{} +Model:3693626889,"Model::A",""{} +Model:3693676615,"Model::A",""{} +Model:3694370274,"Model::A",""{} +Model:3694709139,"Model::A",""{} +Model:3694742517,"Model::A",""{} +Model:3697306521,"Model::A",""{} +Model:3698020607,"Model::A",""{} +Model:3698451125,"Model::A",""{} +Model:3698661134,"Model::A",""{} +Model:3699623026,"Model::A",""{} +Model:3700984583,"Model::A",""{} +Model:3701085258,"Model::A",""{} +Model:3701154697,"Model::A",""{} +Model:3701490974,"Model::A",""{} +Model:3701545342,"Model::A",""{} +Model:3701792982,"Model::A",""{} +Model:3706041879,"Model::A",""{} +Model:3707829858,"Model::A",""{} +Model:3708458790,"Model::A",""{} +Model:3709229411,"Model::A",""{} +Model:3709531283,"Model::A",""{} +Model:3710568603,"Model::A",""{} +Model:3711085159,"Model::A",""{} +Model:3711432555,"Model::A",""{} +Model:3711538726,"Model::A",""{} +Model:3711678474,"Model::A",""{} +Model:3711880928,"Model::A",""{} +Model:3713307891,"Model::A",""{} +Model:3714012349,"Model::A",""{} +Model:3714130806,"Model::A",""{} +Model:3714414715,"Model::A",""{} +Model:3715009965,"Model::A",""{} +Model:3715784086,"Model::A",""{} +Model:3717016098,"Model::A",""{} +Model:3717851951,"Model::A",""{} +Model:3718465677,"Model::A",""{} +Model:3718520362,"Model::A",""{} +Model:3718744273,"Model::A",""{} +Model:3718929731,"Model::A",""{} +Model:3718933172,"Model::A",""{} +Model:3719542410,"Model::A",""{} +Model:3719651713,"Model::A",""{} +Model:3720700550,"Model::A",""{} +Model:3721037837,"Model::A",""{} +Model:3721780686,"Model::A",""{} +Model:3722155156,"Model::A",""{} +Model:3722498214,"Model::A",""{} +Model:3722607994,"Model::A",""{} +Model:3723592100,"Model::A",""{} +Model:3723813295,"Model::A",""{} +Model:3723829132,"Model::A",""{} +Model:3724112413,"Model::A",""{} +Model:3724669163,"Model::A",""{} +Model:3727164580,"Model::A",""{} +Model:3727459628,"Model::A",""{} +Model:3729403249,"Model::A",""{} +Model:3729639885,"Model::A",""{} +Model:3730327065,"Model::A",""{} +Model:3730406231,"Model::A",""{} +Model:3731572318,"Model::A",""{} +Model:3731615265,"Model::A",""{} +Model:3731689789,"Model::A",""{} +Model:3731737570,"Model::A",""{} +Model:3731772801,"Model::A",""{} +Model:3731827957,"Model::A",""{} +Model:3732721769,"Model::A",""{} +Model:3734121023,"Model::A",""{} +Model:3734549428,"Model::A",""{} +Model:3734663182,"Model::A",""{} +Model:3735098499,"Model::A",""{} +Model:3736045022,"Model::A",""{} +Model:3736892050,"Model::A",""{} +Model:3737244515,"Model::A",""{} +Model:3737264442,"Model::A",""{} +Model:3737356305,"Model::A",""{} +Model:3738151998,"Model::A",""{} +Model:3738589267,"Model::A",""{} +Model:3739376759,"Model::A",""{} +Model:3739736863,"Model::A",""{} +Model:3739875470,"Model::A",""{} +Model:3741100649,"Model::A",""{} +Model:3741563692,"Model::A",""{} +Model:3741677044,"Model::A",""{} +Model:3742746104,"Model::A",""{} +Model:3743540715,"Model::A",""{} +Model:3743833664,"Model::A",""{} +Model:3743915934,"Model::A",""{} +Model:3743924035,"Model::A",""{} +Model:3745635322,"Model::A",""{} +Model:3747576034,"Model::A",""{} +Model:3747970429,"Model::A",""{} +Model:3749110882,"Model::A",""{} +Model:3749470973,"Model::A",""{} +Model:3750731420,"Model::A",""{} +Model:3750818258,"Model::A",""{} +Model:3750849013,"Model::A",""{} +Model:3751229999,"Model::A",""{} +Model:3751315711,"Model::A",""{} +Model:3751439499,"Model::A",""{} +Model:3751763745,"Model::A",""{} +Model:3752785993,"Model::A",""{} +Model:3752863036,"Model::A",""{} +Model:3753047932,"Model::A",""{} +Model:3753445041,"Model::A",""{} +Model:3753725261,"Model::A",""{} +Model:3753997156,"Model::A",""{} +Model:3754039369,"Model::A",""{} +Model:3754815752,"Model::A",""{} +Model:3755932425,"Model::A",""{} +Model:3755934020,"Model::A",""{} +Model:3755994429,"Model::A",""{} +Model:3756162645,"Model::A",""{} +Model:3757047729,"Model::A",""{} +Model:3757154638,"Model::A",""{} +Model:3757158877,"Model::A",""{} +Model:3757451545,"Model::A",""{} +Model:3757690417,"Model::A",""{} +Model:3758493434,"Model::A",""{} +Model:3759058246,"Model::A",""{} +Model:3759246775,"Model::A",""{} +Model:3759588513,"Model::A",""{} +Model:3760023316,"Model::A",""{} +Model:3760046458,"Model::A",""{} +Model:3760362676,"Model::A",""{} +Model:3760920841,"Model::A",""{} +Model:3761302935,"Model::A",""{} +Model:3761835826,"Model::A",""{} +Model:3762423111,"Model::A",""{} +Model:3762722941,"Model::A",""{} +Model:3763553651,"Model::A",""{} +Model:3765351361,"Model::A",""{} +Model:3765605375,"Model::A",""{} +Model:3766113962,"Model::A",""{} +Model:3766213879,"Model::A",""{} +Model:3766558646,"Model::A",""{} +Model:3767658097,"Model::A",""{} +Model:3767727797,"Model::A",""{} +Model:3768889390,"Model::A",""{} +Model:3769013065,"Model::A",""{} +Model:3769259623,"Model::A",""{} +Model:3770055425,"Model::A",""{} +Model:3770513870,"Model::A",""{} +Model:3770710421,"Model::A",""{} +Model:3772734513,"Model::A",""{} +Model:3773009878,"Model::A",""{} +Model:3773930822,"Model::A",""{} +Model:3774275018,"Model::A",""{} +Model:3774325734,"Model::A",""{} +Model:3774586945,"Model::A",""{} +Model:3774883471,"Model::A",""{} +Model:3775746296,"Model::A",""{} +Model:3775874413,"Model::A",""{} +Model:3776599315,"Model::A",""{} +Model:3777581763,"Model::A",""{} +Model:3778723973,"Model::A",""{} +Model:3778745889,"Model::A",""{} +Model:3779455333,"Model::A",""{} +Model:3779827427,"Model::A",""{} +Model:3780193093,"Model::A",""{} +Model:3780995467,"Model::A",""{} +Model:3781697240,"Model::A",""{} +Model:3782781877,"Model::A",""{} +Model:3783315943,"Model::A",""{} +Model:3785022989,"Model::A",""{} +Model:3787203418,"Model::A",""{} +Model:3787398177,"Model::A",""{} +Model:3787508209,"Model::A",""{} +Model:3787811843,"Model::A",""{} +Model:3787935050,"Model::A",""{} +Model:3788961751,"Model::A",""{} +Model:3789248054,"Model::A",""{} +Model:3790120036,"Model::A",""{} +Model:3793469641,"Model::A",""{} +Model:3793734231,"Model::A",""{} +Model:3794605928,"Model::A",""{} +Model:3795147052,"Model::A",""{} +Model:3795524335,"Model::A",""{} +Model:3796659395,"Model::A",""{} +Model:3796804244,"Model::A",""{} +Model:3797638889,"Model::A",""{} +Model:3797883752,"Model::A",""{} +Model:3800030979,"Model::A",""{} +Model:3800664566,"Model::A",""{} +Model:3801290764,"Model::A",""{} +Model:3802269263,"Model::A",""{} +Model:3802335458,"Model::A",""{} +Model:3802793336,"Model::A",""{} +Model:3803365597,"Model::A",""{} +Model:3803806254,"Model::A",""{} +Model:3804512278,"Model::A",""{} +Model:3804557926,"Model::A",""{} +Model:3805040672,"Model::A",""{} +Model:3805098356,"Model::A",""{} +Model:3805124405,"Model::A",""{} +Model:3805327947,"Model::A",""{} +Model:3805848091,"Model::A",""{} +Model:3805856300,"Model::A",""{} +Model:3806808595,"Model::A",""{} +Model:3807298094,"Model::A",""{} +Model:3807408143,"Model::A",""{} +Model:3807441177,"Model::A",""{} +Model:3808636191,"Model::A",""{} +Model:3808963015,"Model::A",""{} +Model:3809085320,"Model::A",""{} +Model:3809393342,"Model::A",""{} +Model:3809417803,"Model::A",""{} +Model:3810135873,"Model::A",""{} +Model:3810485447,"Model::A",""{} +Model:3811864463,"Model::A",""{} +Model:3812292831,"Model::A",""{} +Model:3812772663,"Model::A",""{} +Model:3815059833,"Model::A",""{} +Model:3815399113,"Model::A",""{} +Model:3815487693,"Model::A",""{} +Model:3816051793,"Model::A",""{} +Model:3816507050,"Model::A",""{} +Model:3817152294,"Model::A",""{} +Model:3818969893,"Model::A",""{} +Model:3819276425,"Model::A",""{} +Model:3820219586,"Model::A",""{} +Model:3820335134,"Model::A",""{} +Model:3820447601,"Model::A",""{} +Model:3820753717,"Model::A",""{} +Model:3820815518,"Model::A",""{} +Model:3821767134,"Model::A",""{} +Model:3821835100,"Model::A",""{} +Model:3822632113,"Model::A",""{} +Model:3823835446,"Model::A",""{} +Model:3824538124,"Model::A",""{} +Model:3826165803,"Model::A",""{} +Model:3826898129,"Model::A",""{} +Model:3827669794,"Model::A",""{} +Model:3828037613,"Model::A",""{} +Model:3828518989,"Model::A",""{} +Model:3829191110,"Model::A",""{} +Model:3829905322,"Model::A",""{} +Model:3829962421,"Model::A",""{} +Model:3830241164,"Model::A",""{} +Model:3830645350,"Model::A",""{} +Model:3830685749,"Model::A",""{} +Model:3831717908,"Model::A",""{} +Model:3831945126,"Model::A",""{} +Model:3833010541,"Model::A",""{} +Model:3833720884,"Model::A",""{} +Model:3834174682,"Model::A",""{} +Model:3835315311,"Model::A",""{} +Model:3835455446,"Model::A",""{} +Model:3835467091,"Model::A",""{} +Model:3836041514,"Model::A",""{} +Model:3836198228,"Model::A",""{} +Model:3836848421,"Model::A",""{} +Model:3837407279,"Model::A",""{} +Model:3838761349,"Model::A",""{} +Model:3839570646,"Model::A",""{} +Model:3839835014,"Model::A",""{} +Model:3839953017,"Model::A",""{} +Model:3840233305,"Model::A",""{} +Model:3841651230,"Model::A",""{} +Model:3842708806,"Model::A",""{} +Model:3843596139,"Model::A",""{} +Model:3844048991,"Model::A",""{} +Model:3844220804,"Model::A",""{} +Model:3844374779,"Model::A",""{} +Model:3844690103,"Model::A",""{} +Model:3844915677,"Model::A",""{} +Model:3845351525,"Model::A",""{} +Model:3845637033,"Model::A",""{} +Model:3846422345,"Model::A",""{} +Model:3847046761,"Model::A",""{} +Model:3847408583,"Model::A",""{} +Model:3847980173,"Model::A",""{} +Model:3849172954,"Model::A",""{} +Model:3849614312,"Model::A",""{} +Model:3849669106,"Model::A",""{} +Model:3849878537,"Model::A",""{} +Model:3850305005,"Model::A",""{} +Model:3851243799,"Model::A",""{} +Model:3851678623,"Model::A",""{} +Model:3853200590,"Model::A",""{} +Model:3854009522,"Model::A",""{} +Model:3854061313,"Model::A",""{} +Model:3854449910,"Model::A",""{} +Model:3855117937,"Model::A",""{} +Model:3855692475,"Model::A",""{} +Model:3855837481,"Model::A",""{} +Model:3856429326,"Model::A",""{} +Model:3861269030,"Model::A",""{} +Model:3861961154,"Model::A",""{} +Model:3862049699,"Model::A",""{} +Model:3862062519,"Model::A",""{} +Model:3862644622,"Model::A",""{} +Model:3862831721,"Model::A",""{} +Model:3862984322,"Model::A",""{} +Model:3863077545,"Model::A",""{} +Model:3863093169,"Model::A",""{} +Model:3863638991,"Model::A",""{} +Model:3863938109,"Model::A",""{} +Model:3864943334,"Model::A",""{} +Model:3865033135,"Model::A",""{} +Model:3866283143,"Model::A",""{} +Model:3866716405,"Model::A",""{} +Model:3866893981,"Model::A",""{} +Model:3867369942,"Model::A",""{} +Model:3868017980,"Model::A",""{} +Model:3868474892,"Model::A",""{} +Model:3868782155,"Model::A",""{} +Model:3869698062,"Model::A",""{} +Model:3869989156,"Model::A",""{} +Model:3870041641,"Model::A",""{} +Model:3870784878,"Model::A",""{} +Model:3871973567,"Model::A",""{} +Model:3872062609,"Model::A",""{} +Model:3872266138,"Model::A",""{} +Model:3872683210,"Model::A",""{} +Model:3873923510,"Model::A",""{} +Model:3875710657,"Model::A",""{} +Model:3875833407,"Model::A",""{} +Model:3876043334,"Model::A",""{} +Model:3876053781,"Model::A",""{} +Model:3876734389,"Model::A",""{} +Model:3877376909,"Model::A",""{} +Model:3877628635,"Model::A",""{} +Model:3877962724,"Model::A",""{} +Model:3878066158,"Model::A",""{} +Model:3878291645,"Model::A",""{} +Model:3879000807,"Model::A",""{} +Model:3879448773,"Model::A",""{} +Model:3879647485,"Model::A",""{} +Model:3880893002,"Model::A",""{} +Model:3881948326,"Model::A",""{} +Model:3882178577,"Model::A",""{} +Model:3882382755,"Model::A",""{} +Model:3882540973,"Model::A",""{} +Model:3882640417,"Model::A",""{} +Model:3882714845,"Model::A",""{} +Model:3882941865,"Model::A",""{} +Model:3883871082,"Model::A",""{} +Model:3884730755,"Model::A",""{} +Model:3884858505,"Model::A",""{} +Model:3886000687,"Model::A",""{} +Model:3887412198,"Model::A",""{} +Model:3888005187,"Model::A",""{} +Model:3888289915,"Model::A",""{} +Model:3888957994,"Model::A",""{} +Model:3889275476,"Model::A",""{} +Model:3889757481,"Model::A",""{} +Model:3890611274,"Model::A",""{} +Model:3890866806,"Model::A",""{} +Model:3891064489,"Model::A",""{} +Model:3891662595,"Model::A",""{} +Model:3891680095,"Model::A",""{} +Model:3891691131,"Model::A",""{} +Model:3892120949,"Model::A",""{} +Model:3892728535,"Model::A",""{} +Model:3893016524,"Model::A",""{} +Model:3894110030,"Model::A",""{} +Model:3894375034,"Model::A",""{} +Model:3895336808,"Model::A",""{} +Model:3895459741,"Model::A",""{} +Model:3895805533,"Model::A",""{} +Model:3895912638,"Model::A",""{} +Model:3895968003,"Model::A",""{} +Model:3896524760,"Model::A",""{} +Model:3897573102,"Model::A",""{} +Model:3897938696,"Model::A",""{} +Model:3898231522,"Model::A",""{} +Model:3898764303,"Model::A",""{} +Model:3898848659,"Model::A",""{} +Model:3900041291,"Model::A",""{} +Model:3900211577,"Model::A",""{} +Model:3901333086,"Model::A",""{} +Model:3902035285,"Model::A",""{} +Model:3902203342,"Model::A",""{} +Model:3903746891,"Model::A",""{} +Model:3904010337,"Model::A",""{} +Model:3904249257,"Model::A",""{} +Model:3906703918,"Model::A",""{} +Model:3906911014,"Model::A",""{} +Model:3909346503,"Model::A",""{} +Model:3911299699,"Model::A",""{} +Model:3911448080,"Model::A",""{} +Model:3911699950,"Model::A",""{} +Model:3911702195,"Model::A",""{} +Model:3912300015,"Model::A",""{} +Model:3912335338,"Model::A",""{} +Model:3914199316,"Model::A",""{} +Model:3914436527,"Model::A",""{} +Model:3915390571,"Model::A",""{} +Model:3917411825,"Model::A",""{} +Model:3917629265,"Model::A",""{} +Model:3918292389,"Model::A",""{} +Model:3918848302,"Model::A",""{} +Model:3918946859,"Model::A",""{} +Model:3920291567,"Model::A",""{} +Model:3920642175,"Model::A",""{} +Model:3921417817,"Model::A",""{} +Model:3921423214,"Model::A",""{} +Model:3922340031,"Model::A",""{} +Model:3922855797,"Model::A",""{} +Model:3924012426,"Model::A",""{} +Model:3924075042,"Model::A",""{} +Model:3924751383,"Model::A",""{} +Model:3925158027,"Model::A",""{} +Model:3925444306,"Model::A",""{} +Model:3927120953,"Model::A",""{} +Model:3927308156,"Model::A",""{} +Model:3928071446,"Model::A",""{} +Model:3928323762,"Model::A",""{} +Model:3929725520,"Model::A",""{} +Model:3929836519,"Model::A",""{} +Model:3930460065,"Model::A",""{} +Model:3930507453,"Model::A",""{} +Model:3930869763,"Model::A",""{} +Model:3931253331,"Model::A",""{} +Model:3931527294,"Model::A",""{} +Model:3933224673,"Model::A",""{} +Model:3933710587,"Model::A",""{} +Model:3934196241,"Model::A",""{} +Model:3934301209,"Model::A",""{} +Model:3934546030,"Model::A",""{} +Model:3935643844,"Model::A",""{} +Model:3935794819,"Model::A",""{} +Model:3936049197,"Model::A",""{} +Model:3936504512,"Model::A",""{} +Model:3936611622,"Model::A",""{} +Model:3937150162,"Model::A",""{} +Model:3937532403,"Model::A",""{} +Model:3938593506,"Model::A",""{} +Model:3938747495,"Model::A",""{} +Model:3939030822,"Model::A",""{} +Model:3940363939,"Model::A",""{} +Model:3940549769,"Model::A",""{} +Model:3940777219,"Model::A",""{} +Model:3941299811,"Model::A",""{} +Model:3942033337,"Model::A",""{} +Model:3942271598,"Model::A",""{} +Model:3942303566,"Model::A",""{} +Model:3942593751,"Model::A",""{} +Model:3942706955,"Model::A",""{} +Model:3944795731,"Model::A",""{} +Model:3946689301,"Model::A",""{} +Model:3947461136,"Model::A",""{} +Model:3947622337,"Model::A",""{} +Model:3947835541,"Model::A",""{} +Model:3948150115,"Model::A",""{} +Model:3948524876,"Model::A",""{} +Model:3949363455,"Model::A",""{} +Model:3949542022,"Model::A",""{} +Model:3949842169,"Model::A",""{} +Model:3950065148,"Model::A",""{} +Model:3950709532,"Model::A",""{} +Model:3952458426,"Model::A",""{} +Model:3952611085,"Model::A",""{} +Model:3952647579,"Model::A",""{} +Model:3952781732,"Model::A",""{} +Model:3953084672,"Model::A",""{} +Model:3954108349,"Model::A",""{} +Model:3954129825,"Model::A",""{} +Model:3954181418,"Model::A",""{} +Model:3954386409,"Model::A",""{} +Model:3954595591,"Model::A",""{} +Model:3955366027,"Model::A",""{} +Model:3955855887,"Model::A",""{} +Model:3956565690,"Model::A",""{} +Model:3956900300,"Model::A",""{} +Model:3957062841,"Model::A",""{} +Model:3957383300,"Model::A",""{} +Model:3957728801,"Model::A",""{} +Model:3958281827,"Model::A",""{} +Model:3959397815,"Model::A",""{} +Model:3960527738,"Model::A",""{} +Model:3960535281,"Model::A",""{} +Model:3960989473,"Model::A",""{} +Model:3961178138,"Model::A",""{} +Model:3961404164,"Model::A",""{} +Model:3961665525,"Model::A",""{} +Model:3962443147,"Model::A",""{} +Model:3962763161,"Model::A",""{} +Model:3963198179,"Model::A",""{} +Model:3965577498,"Model::A",""{} +Model:3965816018,"Model::A",""{} +Model:3965861397,"Model::A",""{} +Model:3967432387,"Model::A",""{} +Model:3967485479,"Model::A",""{} +Model:3968451474,"Model::A",""{} +Model:3969052801,"Model::A",""{} +Model:3969301166,"Model::A",""{} +Model:3970112811,"Model::A",""{} +Model:3971601229,"Model::A",""{} +Model:3971918441,"Model::A",""{} +Model:3972494710,"Model::A",""{} +Model:3974952243,"Model::A",""{} +Model:3975300197,"Model::A",""{} +Model:3975474537,"Model::A",""{} +Model:3975564069,"Model::A",""{} +Model:3975952373,"Model::A",""{} +Model:3976785502,"Model::A",""{} +Model:3977193243,"Model::A",""{} +Model:3977327463,"Model::A",""{} +Model:3977359118,"Model::A",""{} +Model:3978050985,"Model::A",""{} +Model:3978566390,"Model::A",""{} +Model:3979240171,"Model::A",""{} +Model:3979261988,"Model::A",""{} +Model:3980895637,"Model::A",""{} +Model:3981731642,"Model::A",""{} +Model:3981822085,"Model::A",""{} +Model:3982434524,"Model::A",""{} +Model:3982482742,"Model::A",""{} +Model:3982735061,"Model::A",""{} +Model:3983019822,"Model::A",""{} +Model:3983506916,"Model::A",""{} +Model:3984598940,"Model::A",""{} +Model:3985801609,"Model::A",""{} +Model:3986673150,"Model::A",""{} +Model:3986720939,"Model::A",""{} +Model:3987784721,"Model::A",""{} +Model:3988295253,"Model::A",""{} +Model:3989424497,"Model::A",""{} +Model:3990759298,"Model::A",""{} +Model:3992368151,"Model::A",""{} +Model:3992608194,"Model::A",""{} +Model:3994058891,"Model::A",""{} +Model:3994850039,"Model::A",""{} +Model:3994929450,"Model::A",""{} +Model:3996210320,"Model::A",""{} +Model:3996262006,"Model::A",""{} +Model:3998571772,"Model::A",""{} +Model:3999405988,"Model::A",""{} +Model:3999413297,"Model::A",""{} +Model:4000317959,"Model::A",""{} +Model:4000375662,"Model::A",""{} +Model:4001137444,"Model::A",""{} +Model:4002345397,"Model::A",""{} +Model:4003193060,"Model::A",""{} +Model:4003249832,"Model::A",""{} +Model:4003880966,"Model::A",""{} +Model:4005692566,"Model::A",""{} +Model:4005879008,"Model::A",""{} +Model:4006981550,"Model::A",""{} +Model:4007138255,"Model::A",""{} +Model:4007529423,"Model::A",""{} +Model:4007889714,"Model::A",""{} +Model:4008010498,"Model::A",""{} +Model:4008054081,"Model::A",""{} +Model:4008306308,"Model::A",""{} +Model:4008752302,"Model::A",""{} +Model:4009811437,"Model::A",""{} +Model:4010169678,"Model::A",""{} +Model:4010744454,"Model::A",""{} +Model:4011151508,"Model::A",""{} +Model:4011760832,"Model::A",""{} +Model:4012232240,"Model::A",""{} +Model:4013957953,"Model::A",""{} +Model:4014014025,"Model::A",""{} +Model:4014046122,"Model::A",""{} +Model:4014053559,"Model::A",""{} +Model:4014608546,"Model::A",""{} +Model:4016054359,"Model::A",""{} +Model:4016089763,"Model::A",""{} +Model:4016604463,"Model::A",""{} +Model:4017072968,"Model::A",""{} +Model:4017222477,"Model::A",""{} +Model:4017313364,"Model::A",""{} +Model:4017992504,"Model::A",""{} +Model:4018119854,"Model::A",""{} +Model:4018259273,"Model::A",""{} +Model:4018540231,"Model::A",""{} +Model:4018564218,"Model::A",""{} +Model:4018782044,"Model::A",""{} +Model:4019900199,"Model::A",""{} +Model:4019986049,"Model::A",""{} +Model:4021588874,"Model::A",""{} +Model:4022688377,"Model::A",""{} +Model:4023647987,"Model::A",""{} +Model:4024614047,"Model::A",""{} +Model:4025306227,"Model::A",""{} +Model:4026072298,"Model::A",""{} +Model:4026273086,"Model::A",""{} +Model:4026316699,"Model::A",""{} +Model:4026639994,"Model::A",""{} +Model:4026868081,"Model::A",""{} +Model:4028111238,"Model::A",""{} +Model:4028624572,"Model::A",""{} +Model:4028760322,"Model::A",""{} +Model:4028839085,"Model::A",""{} +Model:4030314545,"Model::A",""{} +Model:4030398469,"Model::A",""{} +Model:4031513483,"Model::A",""{} +Model:4032636597,"Model::A",""{} +Model:4032689860,"Model::A",""{} +Model:4033869170,"Model::A",""{} +Model:4033887306,"Model::A",""{} +Model:4034472374,"Model::A",""{} +Model:4035859402,"Model::A",""{} +Model:4036023749,"Model::A",""{} +Model:4036099838,"Model::A",""{} +Model:4036662794,"Model::A",""{} +Model:4037069037,"Model::A",""{} +Model:4037773678,"Model::A",""{} +Model:4038354873,"Model::A",""{} +Model:4039705436,"Model::A",""{} +Model:4040543693,"Model::A",""{} +Model:4040558348,"Model::A",""{} +Model:4041054847,"Model::A",""{} +Model:4041151643,"Model::A",""{} +Model:4041729646,"Model::A",""{} +Model:4041900508,"Model::A",""{} +Model:4042116850,"Model::A",""{} +Model:4042427589,"Model::A",""{} +Model:4042510340,"Model::A",""{} +Model:4042530855,"Model::A",""{} +Model:4042531285,"Model::A",""{} +Model:4042896098,"Model::A",""{} +Model:4044061407,"Model::A",""{} +Model:4044522305,"Model::A",""{} +Model:4046568836,"Model::A",""{} +Model:4046856627,"Model::A",""{} +Model:4047112218,"Model::A",""{} +Model:4047802856,"Model::A",""{} +Model:4047991337,"Model::A",""{} +Model:4048343382,"Model::A",""{} +Model:4048494713,"Model::A",""{} +Model:4050702938,"Model::A",""{} +Model:4051639319,"Model::A",""{} +Model:4051923820,"Model::A",""{} +Model:4052137446,"Model::A",""{} +Model:4052192301,"Model::A",""{} +Model:4053406997,"Model::A",""{} +Model:4054711758,"Model::A",""{} +Model:4055235989,"Model::A",""{} +Model:4055606217,"Model::A",""{} +Model:4055633455,"Model::A",""{} +Model:4057465861,"Model::A",""{} +Model:4058187321,"Model::A",""{} +Model:4058283821,"Model::A",""{} +Model:4058351465,"Model::A",""{} +Model:4059335259,"Model::A",""{} +Model:4060102433,"Model::A",""{} +Model:4061090458,"Model::A",""{} +Model:4061813827,"Model::A",""{} +Model:4063859681,"Model::A",""{} +Model:4064374515,"Model::A",""{} +Model:4064666461,"Model::A",""{} +Model:4064727195,"Model::A",""{} +Model:4065686890,"Model::A",""{} +Model:4065915958,"Model::A",""{} +Model:4066597095,"Model::A",""{} +Model:4067035282,"Model::A",""{} +Model:4067387030,"Model::A",""{} +Model:4068820778,"Model::A",""{} +Model:4069389195,"Model::A",""{} +Model:4069407943,"Model::A",""{} +Model:4069739397,"Model::A",""{} +Model:4069835984,"Model::A",""{} +Model:4070503891,"Model::A",""{} +Model:4071033886,"Model::A",""{} +Model:4071376057,"Model::A",""{} +Model:4071753582,"Model::A",""{} +Model:4071786236,"Model::A",""{} +Model:4072122785,"Model::A",""{} +Model:4072293543,"Model::A",""{} +Model:4072383478,"Model::A",""{} +Model:4072895870,"Model::A",""{} +Model:4073185522,"Model::A",""{} +Model:4073304003,"Model::A",""{} +Model:4073342861,"Model::A",""{} +Model:4073694410,"Model::A",""{} +Model:4074167300,"Model::A",""{} +Model:4075363166,"Model::A",""{} +Model:4075639868,"Model::A",""{} +Model:4075654529,"Model::A",""{} +Model:4076495849,"Model::A",""{} +Model:4077350746,"Model::A",""{} +Model:4077381083,"Model::A",""{} +Model:4079048786,"Model::A",""{} +Model:4079207936,"Model::A",""{} +Model:4080420851,"Model::A",""{} +Model:4081228310,"Model::A",""{} +Model:4081648547,"Model::A",""{} +Model:4083060423,"Model::A",""{} +Model:4083907186,"Model::A",""{} +Model:4083937113,"Model::A",""{} +Model:4084567681,"Model::A",""{} +Model:4086700483,"Model::A",""{} +Model:4086769566,"Model::A",""{} +Model:4087631650,"Model::A",""{} +Model:4089867177,"Model::A",""{} +Model:4092440151,"Model::A",""{} +Model:4092571489,"Model::A",""{} +Model:4093323263,"Model::A",""{} +Model:4093929938,"Model::A",""{} +Model:4095284785,"Model::A",""{} +Model:4095842394,"Model::A",""{} +Model:4097431610,"Model::A",""{} +Model:4097441597,"Model::A",""{} +Model:4098422372,"Model::A",""{} +Model:4098794963,"Model::A",""{} +Model:4098877067,"Model::A",""{} +Model:4099046518,"Model::A",""{} +Model:4099572077,"Model::A",""{} +Model:4100016031,"Model::A",""{} +Model:4100192818,"Model::A",""{} +Model:4100580368,"Model::A",""{} +Model:4101167183,"Model::A",""{} +Model:4102598489,"Model::A",""{} +Model:4102871216,"Model::A",""{} +Model:4103461628,"Model::A",""{} +Model:4104592647,"Model::A",""{} +Model:4105433246,"Model::A",""{} +Model:4106032099,"Model::A",""{} +Model:4106895866,"Model::A",""{} +Model:4107020609,"Model::A",""{} +Model:4108014449,"Model::A",""{} +Model:4108236134,"Model::A",""{} +Model:4108461261,"Model::A",""{} +Model:4109173169,"Model::A",""{} +Model:4109724574,"Model::A",""{} +Model:4110068972,"Model::A",""{} +Model:4110284901,"Model::A",""{} +Model:4111050379,"Model::A",""{} +Model:4111236896,"Model::A",""{} +Model:4111507060,"Model::A",""{} +Model:4112330291,"Model::A",""{} +Model:4114425536,"Model::A",""{} +Model:4114927555,"Model::A",""{} +Model:4115637837,"Model::A",""{} +Model:4115809639,"Model::A",""{} +Model:4117342479,"Model::A",""{} +Model:4117457122,"Model::A",""{} +Model:4117836041,"Model::A",""{} +Model:4117890946,"Model::A",""{} +Model:4117949198,"Model::A",""{} +Model:4118244115,"Model::A",""{} +Model:4118432906,"Model::A",""{} +Model:4118623939,"Model::A",""{} +Model:4119487279,"Model::A",""{} +Model:4119613083,"Model::A",""{} +Model:4119933011,"Model::A",""{} +Model:4120594868,"Model::A",""{} +Model:4120929826,"Model::A",""{} +Model:4121373481,"Model::A",""{} +Model:4121817426,"Model::A",""{} +Model:4122961790,"Model::A",""{} +Model:4123030619,"Model::A",""{} +Model:4123243605,"Model::A",""{} +Model:4123893289,"Model::A",""{} +Model:4123925528,"Model::A",""{} +Model:4124318221,"Model::A",""{} +Model:4125039812,"Model::A",""{} +Model:4125283198,"Model::A",""{} +Model:4126069373,"Model::A",""{} +Model:4126651739,"Model::A",""{} +Model:4126899777,"Model::A",""{} +Model:4126966798,"Model::A",""{} +Model:4127850805,"Model::A",""{} +Model:4127890201,"Model::A",""{} +Model:4128693450,"Model::A",""{} +Model:4130718526,"Model::A",""{} +Model:4131291911,"Model::A",""{} +Model:4131907147,"Model::A",""{} +Model:4131988112,"Model::A",""{} +Model:4132087919,"Model::A",""{} +Model:4132620989,"Model::A",""{} +Model:4132765422,"Model::A",""{} +Model:4132895231,"Model::A",""{} +Model:4133004309,"Model::A",""{} +Model:4133345001,"Model::A",""{} +Model:4133543303,"Model::A",""{} +Model:4133863110,"Model::A",""{} +Model:4134017603,"Model::A",""{} +Model:4135635533,"Model::A",""{} +Model:4136188461,"Model::A",""{} +Model:4137348630,"Model::A",""{} +Model:4138208504,"Model::A",""{} +Model:4138761694,"Model::A",""{} +Model:4139248254,"Model::A",""{} +Model:4139565584,"Model::A",""{} +Model:4139643028,"Model::A",""{} +Model:4139968077,"Model::A",""{} +Model:4140203397,"Model::A",""{} +Model:4140962597,"Model::A",""{} +Model:4141591396,"Model::A",""{} +Model:4142156949,"Model::A",""{} +Model:4142436531,"Model::A",""{} +Model:4143541099,"Model::A",""{} +Model:4143917804,"Model::A",""{} +Model:4144507618,"Model::A",""{} +Model:4145922925,"Model::A",""{} +Model:4146006730,"Model::A",""{} +Model:4146348800,"Model::A",""{} +Model:4146587591,"Model::A",""{} +Model:4147277419,"Model::A",""{} +Model:4147861699,"Model::A",""{} +Model:4147877445,"Model::A",""{} +Model:4148120331,"Model::A",""{} +Model:4148570949,"Model::A",""{} +Model:4148700577,"Model::A",""{} +Model:4148780351,"Model::A",""{} +Model:4150199030,"Model::A",""{} +Model:4150623406,"Model::A",""{} +Model:4152149500,"Model::A",""{} +Model:4152342903,"Model::A",""{} +Model:4152701302,"Model::A",""{} +Model:4152706333,"Model::A",""{} +Model:4153703356,"Model::A",""{} +Model:4154519301,"Model::A",""{} +Model:4155014821,"Model::A",""{} +Model:4155364379,"Model::A",""{} +Model:4156154105,"Model::A",""{} +Model:4156976257,"Model::A",""{} +Model:4157260292,"Model::A",""{} +Model:4159261215,"Model::A",""{} +Model:4159898275,"Model::A",""{} +Model:4161477897,"Model::A",""{} +Model:4161830845,"Model::A",""{} +Model:4162266234,"Model::A",""{} +Model:4163543023,"Model::A",""{} +Model:4164250798,"Model::A",""{} +Model:4164441418,"Model::A",""{} +Model:4164508727,"Model::A",""{} +Model:4164645842,"Model::A",""{} +Model:4164899439,"Model::A",""{} +Model:4164911669,"Model::A",""{} +Model:4165283911,"Model::A",""{} +Model:4167535381,"Model::A",""{} +Model:4168775600,"Model::A",""{} +Model:4169038882,"Model::A",""{} +Model:4169455196,"Model::A",""{} +Model:4172126060,"Model::A",""{} +Model:4172215585,"Model::A",""{} +Model:4173741961,"Model::A",""{} +Model:4173851259,"Model::A",""{} +Model:4174929050,"Model::A",""{} +Model:4175125366,"Model::A",""{} +Model:4175560685,"Model::A",""{} +Model:4175712683,"Model::A",""{} +Model:4175796270,"Model::A",""{} +Model:4176316963,"Model::A",""{} +Model:4176371211,"Model::A",""{} +Model:4176383717,"Model::A",""{} +Model:4176561931,"Model::A",""{} +Model:4177116479,"Model::A",""{} +Model:4177643478,"Model::A",""{} +Model:4177857833,"Model::A",""{} +Model:4177859066,"Model::A",""{} +Model:4178038350,"Model::A",""{} +Model:4178453425,"Model::A",""{} +Model:4179207779,"Model::A",""{} +Model:4179275102,"Model::A",""{} +Model:4179955844,"Model::A",""{} +Model:4180595690,"Model::A",""{} +Model:4181039043,"Model::A",""{} +Model:4181219709,"Model::A",""{} +Model:4181284259,"Model::A",""{} +Model:4181769227,"Model::A",""{} +Model:4181958114,"Model::A",""{} +Model:4181995206,"Model::A",""{} +Model:4182285923,"Model::A",""{} +Model:4182316075,"Model::A",""{} +Model:4182330537,"Model::A",""{} +Model:4182667350,"Model::A",""{} +Model:4182879777,"Model::A",""{} +Model:4183027981,"Model::A",""{} +Model:4183207519,"Model::A",""{} +Model:4183676337,"Model::A",""{} +Model:4184217608,"Model::A",""{} +Model:4184487219,"Model::A",""{} +Model:4184716586,"Model::A",""{} +Model:4185342281,"Model::A",""{} +Model:4185371221,"Model::A",""{} +Model:4185904787,"Model::A",""{} +Model:4187356106,"Model::A",""{} +Model:4188281257,"Model::A",""{} +Model:4188288811,"Model::A",""{} +Model:4189342714,"Model::A",""{} +Model:4190841745,"Model::A",""{} +Model:4191848058,"Model::A",""{} +Model:4192171658,"Model::A",""{} +Model:4192488992,"Model::A",""{} +Model:4192842778,"Model::A",""{} +Model:4192851913,"Model::A",""{} +Model:4193458996,"Model::A",""{} +Model:4196170829,"Model::A",""{} +Model:4196350654,"Model::A",""{} +Model:4196354417,"Model::A",""{} +Model:4196404703,"Model::A",""{} +Model:4196696912,"Model::A",""{} +Model:4197459446,"Model::A",""{} +Model:4198223802,"Model::A",""{} +Model:4200615414,"Model::A",""{} +Model:4200804527,"Model::A",""{} +Model:4201223899,"Model::A",""{} +Model:4201280506,"Model::A",""{} +Model:4201497687,"Model::A",""{} +Model:4201534633,"Model::A",""{} +Model:4202206052,"Model::A",""{} +Model:4202302507,"Model::A",""{} +Model:4203691137,"Model::A",""{} +Model:4203921618,"Model::A",""{} +Model:4204219019,"Model::A",""{} +Model:4204574180,"Model::A",""{} +Model:4205117465,"Model::A",""{} +Model:4206890355,"Model::A",""{} +Model:4207257865,"Model::A",""{} +Model:4207633493,"Model::A",""{} +Model:4207885282,"Model::A",""{} +Model:4208099122,"Model::A",""{} +Model:4208439892,"Model::A",""{} +Model:4208889321,"Model::A",""{} +Model:4209241290,"Model::A",""{} +Model:4209363190,"Model::A",""{} +Model:4211851051,"Model::A",""{} +Model:4213378664,"Model::A",""{} +Model:4213478981,"Model::A",""{} +Model:4214334069,"Model::A",""{} +Model:4215108687,"Model::A",""{} +Model:4215292081,"Model::A",""{} +Model:4215463822,"Model::A",""{} +Model:4216596241,"Model::A",""{} +Model:4218209303,"Model::A",""{} +Model:4219651621,"Model::A",""{} +Model:4219784913,"Model::A",""{} +Model:4220914829,"Model::A",""{} +Model:4221584111,"Model::A",""{} +Model:4222602917,"Model::A",""{} +Model:4222798755,"Model::A",""{} +Model:4223110734,"Model::A",""{} +Model:4224334078,"Model::A",""{} +Model:4224690261,"Model::A",""{} +Model:4225515735,"Model::A",""{} +Model:4226389966,"Model::A",""{} +Model:4227032335,"Model::A",""{} +Model:4228003389,"Model::A",""{} +Model:4228522184,"Model::A",""{} +Model:4228758210,"Model::A",""{} +Model:4229403054,"Model::A",""{} +Model:4230242930,"Model::A",""{} +Model:4230354848,"Model::A",""{} +Model:4230772723,"Model::A",""{} +Model:4231359953,"Model::A",""{} +Model:4231673461,"Model::A",""{} +Model:4231871309,"Model::A",""{} +Model:4232192914,"Model::A",""{} +Model:4232792627,"Model::A",""{} +Model:4232962499,"Model::A",""{} +Model:4233303610,"Model::A",""{} +Model:4233316062,"Model::A",""{} +Model:4233554404,"Model::A",""{} +Model:4234279653,"Model::A",""{} +Model:4234639930,"Model::A",""{} +Model:4234871046,"Model::A",""{} +Model:4235320687,"Model::A",""{} +Model:4235359479,"Model::A",""{} +Model:4235539125,"Model::A",""{} +Model:4235554322,"Model::A",""{} +Model:4236077787,"Model::A",""{} +Model:4236674735,"Model::A",""{} +Model:4236715238,"Model::A",""{} +Model:4236867759,"Model::A",""{} +Model:4237401803,"Model::A",""{} +Model:4238558339,"Model::A",""{} +Model:4239540489,"Model::A",""{} +Model:4239549009,"Model::A",""{} +Model:4239973257,"Model::A",""{} +Model:4240000046,"Model::A",""{} +Model:4240683941,"Model::A",""{} +Model:4241304111,"Model::A",""{} +Model:4241775356,"Model::A",""{} +Model:4241869351,"Model::A",""{} +Model:4242918301,"Model::A",""{} +Model:4243378194,"Model::A",""{} +Model:4244556797,"Model::A",""{} +Model:4244668297,"Model::A",""{} +Model:4244829173,"Model::A",""{} +Model:4245449166,"Model::A",""{} +Model:4247242655,"Model::A",""{} +Model:4247509714,"Model::A",""{} +Model:4247980262,"Model::A",""{} +Model:4248108935,"Model::A",""{} +Model:4248918294,"Model::A",""{} +Model:4249419178,"Model::A",""{} +Model:4249528060,"Model::A",""{} +Model:4250479083,"Model::A",""{} +Model:4251130458,"Model::A",""{} +Model:4251163413,"Model::A",""{} +Model:4251448588,"Model::A",""{} +Model:4252119230,"Model::A",""{} +Model:4252849317,"Model::A",""{} +Model:4253380162,"Model::A",""{} +Model:4253682716,"Model::A",""{} +Model:4253973181,"Model::A",""{} +Model:4255272764,"Model::A",""{} +Model:4255305914,"Model::A",""{} +Model:4255715123,"Model::A",""{} +Model:4256099561,"Model::A",""{} +Model:4257061265,"Model::A",""{} +Model:4257574143,"Model::A",""{} +Model:4258028911,"Model::A",""{} +Model:4258100793,"Model::A",""{} +Model:4258622775,"Model::A",""{} +Model:4258708118,"Model::A",""{} +Model:4258759447,"Model::A",""{} +Model:4258922238,"Model::A",""{} +Model:4259723867,"Model::A",""{} +Model:4259996643,"Model::A",""{} +Model:4260236386,"Model::A",""{} +Model:4260662249,"Model::A",""{} +Model:4261518153,"Model::A",""{} +Model:4261625326,"Model::A",""{} +Model:4262684953,"Model::A",""{} +Model:4262758915,"Model::A",""{} +Model:4263284010,"Model::A",""{} +Model:4263359404,"Model::A",""{} +Model:4264526745,"Model::A",""{} +Model:4264880978,"Model::A",""{} +Model:4265045687,"Model::A",""{} +Model:4265850822,"Model::A",""{} +Model:4265987727,"Model::A",""{} +Model:4266120068,"Model::A",""{} +Model:4266861581,"Model::A",""{} +Model:4267229889,"Model::A",""{} +Model:4267349089,"Model::A",""{} +Model:4268540399,"Model::A",""{} +Model:4268570761,"Model::A",""{} +Model:4269739467,"Model::A",""{} +Model:4270421264,"Model::A",""{} +Model:4271805705,"Model::A",""{} +Model:4271845353,"Model::A",""{} +Model:4272424905,"Model::A",""{} +Model:4272621581,"Model::A",""{} +Model:4274063615,"Model::A",""{} +Model:4274392942,"Model::A",""{} +Model:4275304569,"Model::A",""{} +Model:4275699401,"Model::A",""{} +Model:4276024690,"Model::A",""{} +Model:4277063471,"Model::A",""{} +Model:4277372850,"Model::A",""{} +Model:4277491838,"Model::A",""{} +Model:4277862566,"Model::A",""{} +Model:4278347385,"Model::A",""{} +Model:4280117378,"Model::A",""{} +Model:4281166878,"Model::A",""{} +Model:4282170590,"Model::A",""{} +Model:4282617251,"Model::A",""{} +Model:4282815428,"Model::A",""{} +Model:4284386216,"Model::A",""{} +Model:4285657483,"Model::A",""{} +Model:4285821608,"Model::A",""{} +Model:4287175778,"Model::A",""{} +Model:4287839432,"Model::A",""{} +Model:4288074925,"Model::A",""{} +Model:4288732509,"Model::A",""{} +Model:4289161727,"Model::A",""{} +Model:4289168186,"Model::A",""{} +Model:4289433815,"Model::A",""{} +Model:4289764161,"Model::A",""{} +Model:4291167691,"Model::A",""{} +Model:4291873700,"Model::A",""{} +Model:4291925121,"Model::A",""{} +Model:4292425702,"Model::A",""{} +Model:4292694611,"Model::A",""{} +Model:4292699561,"Model::A",""{} +Model:4292899699,"Model::A",""{} +Model:4294142894,"Model::A",""{} +Model:4294535794,"Model::A",""{} +Model:4294572538,"Model::A",""{} +Model:4295587762,"Model::A",""{} +Model:4296751060,"Model::A",""{} +Model:4297159415,"Model::A",""{} +Model:4297198341,"Model::A",""{} +Model:4297374821,"Model::A",""{} +Model:4297755077,"Model::A",""{} +Model:4300479122,"Model::A",""{} +Model:4301549830,"Model::A",""{} +Model:4301774554,"Model::A",""{} +Model:4302077878,"Model::A",""{} +Model:4302533733,"Model::A",""{} +Model:4302888067,"Model::A",""{} +Model:4304079793,"Model::A",""{} +Model:4304563108,"Model::A",""{} +Model:4304793115,"Model::A",""{} +Model:4305150617,"Model::A",""{} +Model:4305199571,"Model::A",""{} +Model:4307623406,"Model::A",""{} +Model:4307721752,"Model::A",""{} +Model:4308776877,"Model::A",""{} +Model:4308899407,"Model::A",""{} +Model:4308985036,"Model::A",""{} +Model:4309159123,"Model::A",""{} +Model:4309285541,"Model::A",""{} +Model:4309354463,"Model::A",""{} +Model:4311950039,"Model::A",""{} +Model:4312358634,"Model::A",""{} +Model:4312720175,"Model::A",""{} +Model:4313157026,"Model::A",""{} +Model:4313199574,"Model::A",""{} +Model:4313966569,"Model::A",""{} +Model:4313988925,"Model::A",""{} +Model:4314646362,"Model::A",""{} +Model:4315309314,"Model::A",""{} +Model:4315760634,"Model::A",""{} +Model:4316324570,"Model::A",""{} +Model:4317025544,"Model::A",""{} +Model:4317169145,"Model::A",""{} +Model:4317215548,"Model::A",""{} +Model:4317395684,"Model::A",""{} +Model:4317560719,"Model::A",""{} +Model:4318339057,"Model::A",""{} +Model:4319052677,"Model::A",""{} +Model:4320783022,"Model::A",""{} +Model:4321326366,"Model::A",""{} +Model:4325640116,"Model::A",""{} +Model:4326742945,"Model::A",""{} +Model:4326833470,"Model::A",""{} +Model:4327047994,"Model::A",""{} +Model:4327081814,"Model::A",""{} +Model:4327615727,"Model::A",""{} +Model:4328108315,"Model::A",""{} +Model:4328243735,"Model::A",""{} +Model:4328452238,"Model::A",""{} +Model:4328760316,"Model::A",""{} +Model:4328959469,"Model::A",""{} +Model:4329943454,"Model::A",""{} +Model:4330454730,"Model::A",""{} +Model:4330994034,"Model::A",""{} +Model:4331219626,"Model::A",""{} +Model:4331385070,"Model::A",""{} +Model:4332187303,"Model::A",""{} +Model:4332656287,"Model::A",""{} +Model:4332875865,"Model::A",""{} +Model:4335382049,"Model::A",""{} +Model:4335808682,"Model::A",""{} +Model:4335950908,"Model::A",""{} +Model:4336536137,"Model::A",""{} +Model:4337824215,"Model::A",""{} +Model:4338119494,"Model::A",""{} +Model:4339906037,"Model::A",""{} +Model:4340759515,"Model::A",""{} +Model:4341014138,"Model::A",""{} +Model:4341369534,"Model::A",""{} +Model:4341418574,"Model::A",""{} +Model:4342164887,"Model::A",""{} +Model:4342577019,"Model::A",""{} +Model:4343412488,"Model::A",""{} +Model:4344140481,"Model::A",""{} +Model:4344644259,"Model::A",""{} +Model:4344660207,"Model::A",""{} +Model:4345374447,"Model::A",""{} +Model:4345629374,"Model::A",""{} +Model:4346154604,"Model::A",""{} +Model:4346263642,"Model::A",""{} +Model:4347408860,"Model::A",""{} +Model:4347654860,"Model::A",""{} +Model:4348534777,"Model::A",""{} +Model:4348892514,"Model::A",""{} +Model:4348977935,"Model::A",""{} +Model:4349010025,"Model::A",""{} +Model:4349372229,"Model::A",""{} +Model:4350007337,"Model::A",""{} +Model:4350267282,"Model::A",""{} +Model:4350510100,"Model::A",""{} +Model:4351138505,"Model::A",""{} +Model:4351284221,"Model::A",""{} +Model:4351753887,"Model::A",""{} +Model:4352596389,"Model::A",""{} +Model:4352684241,"Model::A",""{} +Model:4352768491,"Model::A",""{} +Model:4353102429,"Model::A",""{} +Model:4353584622,"Model::A",""{} +Model:4353657182,"Model::A",""{} +Model:4354136456,"Model::A",""{} +Model:4354482677,"Model::A",""{} +Model:4354484362,"Model::A",""{} +Model:4355243406,"Model::A",""{} +Model:4355819521,"Model::A",""{} +Model:4355962767,"Model::A",""{} +Model:4356013551,"Model::A",""{} +Model:4356517431,"Model::A",""{} +Model:4357541068,"Model::A",""{} +Model:4357966543,"Model::A",""{} +Model:4358573150,"Model::A",""{} +Model:4359366770,"Model::A",""{} +Model:4359644022,"Model::A",""{} +Model:4361032050,"Model::A",""{} +Model:4361848733,"Model::A",""{} +Model:4362254691,"Model::A",""{} +Model:4362317658,"Model::A",""{} +Model:4362466963,"Model::A",""{} +Model:4363182397,"Model::A",""{} +Model:4363480942,"Model::A",""{} +Model:4363584710,"Model::A",""{} +Model:4364193947,"Model::A",""{} +Model:4364691866,"Model::A",""{} +Model:4366071739,"Model::A",""{} +Model:4366414205,"Model::A",""{} +Model:4366492796,"Model::A",""{} +Model:4369229822,"Model::A",""{} +Model:4369493804,"Model::A",""{} +Model:4369725796,"Model::A",""{} +Model:4370997778,"Model::A",""{} +Model:4371291174,"Model::A",""{} +Model:4371591746,"Model::A",""{} +Model:4372043533,"Model::A",""{} +Model:4372469945,"Model::A",""{} +Model:4372558828,"Model::A",""{} +Model:4372833294,"Model::A",""{} +Model:4374907876,"Model::A",""{} +Model:4374969414,"Model::A",""{} +Model:4375628486,"Model::A",""{} +Model:4376819669,"Model::A",""{} +Model:4377856567,"Model::A",""{} +Model:4377941141,"Model::A",""{} +Model:4379681267,"Model::A",""{} +Model:4380413005,"Model::A",""{} +Model:4380794569,"Model::A",""{} +Model:4380985724,"Model::A",""{} +Model:4381799583,"Model::A",""{} +Model:4381986242,"Model::A",""{} +Model:4382633167,"Model::A",""{} +Model:4383127785,"Model::A",""{} +Model:4384204004,"Model::A",""{} +Model:4384267420,"Model::A",""{} +Model:4385485581,"Model::A",""{} +Model:4385544623,"Model::A",""{} +Model:4385571209,"Model::A",""{} +Model:4385719553,"Model::A",""{} +Model:4386210911,"Model::A",""{} +Model:4386554521,"Model::A",""{} +Model:4386960850,"Model::A",""{} +Model:4387070816,"Model::A",""{} +Model:4387112470,"Model::A",""{} +Model:4387221366,"Model::A",""{} +Model:4389194022,"Model::A",""{} +Model:4389769611,"Model::A",""{} +Model:4389947098,"Model::A",""{} +Model:4390114177,"Model::A",""{} +Model:4390562338,"Model::A",""{} +Model:4391157686,"Model::A",""{} +Model:4392035110,"Model::A",""{} +Model:4392399775,"Model::A",""{} +Model:4392475926,"Model::A",""{} +Model:4393126977,"Model::A",""{} +Model:4393965485,"Model::A",""{} +Model:4395360572,"Model::A",""{} +Model:4396066905,"Model::A",""{} +Model:4396171159,"Model::A",""{} +Model:4396966258,"Model::A",""{} +Model:4396984697,"Model::A",""{} +Model:4397563414,"Model::A",""{} +Model:4398190642,"Model::A",""{} +Model:4398483500,"Model::A",""{} +Model:4398710468,"Model::A",""{} +Model:4399625603,"Model::A",""{} +Model:4399706684,"Model::A",""{} +Model:4400650112,"Model::A",""{} +Model:4402043502,"Model::A",""{} +Model:4402301803,"Model::A",""{} +Model:4402687828,"Model::A",""{} +Model:4403070279,"Model::A",""{} +Model:4403734317,"Model::A",""{} +Model:4404727883,"Model::A",""{} +Model:4404740177,"Model::A",""{} +Model:4405512340,"Model::A",""{} +Model:4406059583,"Model::A",""{} +Model:4406282373,"Model::A",""{} +Model:4406514409,"Model::A",""{} +Model:4407031715,"Model::A",""{} +Model:4407267263,"Model::A",""{} +Model:4409538315,"Model::A",""{} +Model:4409802620,"Model::A",""{} +Model:4411497135,"Model::A",""{} +Model:4412340044,"Model::A",""{} +Model:4412504847,"Model::A",""{} +Model:4412773573,"Model::A",""{} +Model:4413363641,"Model::A",""{} +Model:4414028643,"Model::A",""{} +Model:4414488007,"Model::A",""{} +Model:4414603182,"Model::A",""{} +Model:4414913395,"Model::A",""{} +Model:4415298083,"Model::A",""{} +Model:4415346314,"Model::A",""{} +Model:4416377593,"Model::A",""{} +Model:4417508653,"Model::A",""{} +Model:4417899146,"Model::A",""{} +Model:4418268510,"Model::A",""{} +Model:4418712781,"Model::A",""{} +Model:4418741075,"Model::A",""{} +Model:4419708901,"Model::A",""{} +Model:4421777661,"Model::A",""{} +Model:4422356519,"Model::A",""{} +Model:4422724693,"Model::A",""{} +Model:4425363061,"Model::A",""{} +Model:4425594606,"Model::A",""{} +Model:4426562211,"Model::A",""{} +Model:4429560406,"Model::A",""{} +Model:4429618290,"Model::A",""{} +Model:4429905629,"Model::A",""{} +Model:4430172571,"Model::A",""{} +Model:4430313414,"Model::A",""{} +Model:4430476525,"Model::A",""{} +Model:4431481039,"Model::A",""{} +Model:4431772230,"Model::A",""{} +Model:4431790837,"Model::A",""{} +Model:4432489146,"Model::A",""{} +Model:4433633212,"Model::A",""{} +Model:4433633809,"Model::A",""{} +Model:4433686187,"Model::A",""{} +Model:4433924391,"Model::A",""{} +Model:4434261069,"Model::A",""{} +Model:4434507752,"Model::A",""{} +Model:4434584223,"Model::A",""{} +Model:4435902445,"Model::A",""{} +Model:4436340987,"Model::A",""{} +Model:4439987444,"Model::A",""{} +Model:4440286535,"Model::A",""{} +Model:4440301461,"Model::A",""{} +Model:4442037077,"Model::A",""{} +Model:4442151867,"Model::A",""{} +Model:4443766150,"Model::A",""{} +Model:4444050966,"Model::A",""{} +Model:4444611078,"Model::A",""{} +Model:4444649908,"Model::A",""{} +Model:4444673827,"Model::A",""{} +Model:4447103399,"Model::A",""{} +Model:4447199745,"Model::A",""{} +Model:4447344467,"Model::A",""{} +Model:4447646867,"Model::A",""{} +Model:4447722534,"Model::A",""{} +Model:4448668543,"Model::A",""{} +Model:4449174066,"Model::A",""{} +Model:4449746155,"Model::A",""{} +Model:4450028317,"Model::A",""{} +Model:4450371125,"Model::A",""{} +Model:4451065986,"Model::A",""{} +Model:4451713076,"Model::A",""{} +Model:4452186990,"Model::A",""{} +Model:4452411727,"Model::A",""{} +Model:4452572620,"Model::A",""{} +Model:4452620771,"Model::A",""{} +Model:4452871570,"Model::A",""{} +Model:4452892875,"Model::A",""{} +Model:4454260963,"Model::A",""{} +Model:4454618618,"Model::A",""{} +Model:4454894931,"Model::A",""{} +Model:4454932871,"Model::A",""{} +Model:4455025085,"Model::A",""{} +Model:4455541107,"Model::A",""{} +Model:4455607558,"Model::A",""{} +Model:4455652711,"Model::A",""{} +Model:4456078065,"Model::A",""{} +Model:4456511668,"Model::A",""{} +Model:4456583212,"Model::A",""{} +Model:4457935543,"Model::A",""{} +Model:4459571215,"Model::A",""{} +Model:4459614525,"Model::A",""{} +Model:4459762832,"Model::A",""{} +Model:4459802810,"Model::A",""{} +Model:4460433632,"Model::A",""{} +Model:4460665138,"Model::A",""{} +Model:4461250285,"Model::A",""{} +Model:4461698051,"Model::A",""{} +Model:4461750197,"Model::A",""{} +Model:4462973229,"Model::A",""{} +Model:4462974235,"Model::A",""{} +Model:4463153233,"Model::A",""{} +Model:4463817354,"Model::A",""{} +Model:4464135754,"Model::A",""{} +Model:4465134949,"Model::A",""{} +Model:4465184478,"Model::A",""{} +Model:4465275733,"Model::A",""{} +Model:4465561675,"Model::A",""{} +Model:4465835498,"Model::A",""{} +Model:4466832601,"Model::A",""{} +Model:4467101137,"Model::A",""{} +Model:4467393052,"Model::A",""{} +Model:4467441329,"Model::A",""{} +Model:4467609011,"Model::A",""{} +Model:4467693694,"Model::A",""{} +Model:4468201599,"Model::A",""{} +Model:4468563767,"Model::A",""{} +Model:4468995942,"Model::A",""{} +Model:4469810498,"Model::A",""{} +Model:4470305297,"Model::A",""{} +Model:4470582418,"Model::A",""{} +Model:4471135359,"Model::A",""{} +Model:4471309367,"Model::A",""{} +Model:4472205391,"Model::A",""{} +Model:4472792215,"Model::A",""{} +Model:4472876191,"Model::A",""{} +Model:4473544218,"Model::A",""{} +Model:4474036754,"Model::A",""{} +Model:4474405850,"Model::A",""{} +Model:4474486195,"Model::A",""{} +Model:4475079776,"Model::A",""{} +Model:4475346161,"Model::A",""{} +Model:4475484315,"Model::A",""{} +Model:4475610830,"Model::A",""{} +Model:4476031331,"Model::A",""{} +Model:4477495497,"Model::A",""{} +Model:4477564563,"Model::A",""{} +Model:4479743240,"Model::A",""{} +Model:4479799702,"Model::A",""{} +Model:4480764775,"Model::A",""{} +Model:4480794253,"Model::A",""{} +Model:4482250799,"Model::A",""{} +Model:4482279754,"Model::A",""{} +Model:4482544674,"Model::A",""{} +Model:4483384691,"Model::A",""{} +Model:4483634941,"Model::A",""{} +Model:4483743626,"Model::A",""{} +Model:4485799315,"Model::A",""{} +Model:4485893106,"Model::A",""{} +Model:4486502801,"Model::A",""{} +Model:4486812898,"Model::A",""{} +Model:4486865742,"Model::A",""{} +Model:4486889777,"Model::A",""{} +Model:4488178940,"Model::A",""{} +Model:4488193203,"Model::A",""{} +Model:4488814972,"Model::A",""{} +Model:4489802218,"Model::A",""{} +Model:4490050640,"Model::A",""{} +Model:4490723442,"Model::A",""{} +Model:4490844141,"Model::A",""{} +Model:4491670789,"Model::A",""{} +Model:4492160763,"Model::A",""{} +Model:4492830493,"Model::A",""{} +Model:4493213097,"Model::A",""{} +Model:4493723041,"Model::A",""{} +Model:4496762099,"Model::A",""{} +Model:4497453194,"Model::A",""{} +Model:4497942978,"Model::A",""{} +Model:4498159115,"Model::A",""{} +Model:4499380551,"Model::A",""{} +Model:4502750402,"Model::A",""{} +Model:4502924972,"Model::A",""{} +Model:4503015657,"Model::A",""{} +Model:4504208969,"Model::A",""{} +Model:4504643150,"Model::A",""{} +Model:4504990318,"Model::A",""{} +Model:4505007342,"Model::A",""{} +Model:4505083986,"Model::A",""{} +Model:4505321084,"Model::A",""{} +Model:4505520097,"Model::A",""{} +Model:4506107154,"Model::A",""{} +Model:4508026532,"Model::A",""{} +Model:4508270303,"Model::A",""{} +Model:4508393289,"Model::A",""{} +Model:4509497774,"Model::A",""{} +Model:4510032154,"Model::A",""{} +Model:4510930758,"Model::A",""{} +Model:4511009625,"Model::A",""{} +Model:4511449610,"Model::A",""{} +Model:4511576017,"Model::A",""{} +Model:4512086477,"Model::A",""{} +Model:4513426035,"Model::A",""{} +Model:4514102721,"Model::A",""{} +Model:4514776014,"Model::A",""{} +Model:4515187859,"Model::A",""{} +Model:4515325503,"Model::A",""{} +Model:4516206578,"Model::A",""{} +Model:4516306217,"Model::A",""{} +Model:4516783244,"Model::A",""{} +Model:4519556311,"Model::A",""{} +Model:4520660013,"Model::A",""{} +Model:4520884774,"Model::A",""{} +Model:4521261607,"Model::A",""{} +Model:4522003783,"Model::A",""{} +Model:4523551867,"Model::A",""{} +Model:4524033905,"Model::A",""{} +Model:4524465450,"Model::A",""{} +Model:4524529065,"Model::A",""{} +Model:4524652399,"Model::A",""{} +Model:4524836185,"Model::A",""{} +Model:4525690405,"Model::A",""{} +Model:4525959447,"Model::A",""{} +Model:4526675017,"Model::A",""{} +Model:4527492867,"Model::A",""{} +Model:4527606542,"Model::A",""{} +Model:4528742540,"Model::A",""{} +Model:4528917442,"Model::A",""{} +Model:4529123018,"Model::A",""{} +Model:4529511441,"Model::A",""{} +Model:4529738285,"Model::A",""{} +Model:4532212496,"Model::A",""{} +Model:4533892724,"Model::A",""{} +Model:4533969777,"Model::A",""{} +Model:4536044467,"Model::A",""{} +Model:4536125806,"Model::A",""{} +Model:4536876622,"Model::A",""{} +Model:4537321074,"Model::A",""{} +Model:4537499622,"Model::A",""{} +Model:4537547793,"Model::A",""{} +Model:4538488109,"Model::A",""{} +Model:4538722259,"Model::A",""{} +Model:4539408517,"Model::A",""{} +Model:4539636869,"Model::A",""{} +Model:4539692840,"Model::A",""{} +Model:4539725151,"Model::A",""{} +Model:4540264671,"Model::A",""{} +Model:4540727126,"Model::A",""{} +Model:4541167684,"Model::A",""{} +Model:4542668231,"Model::A",""{} +Model:4542716641,"Model::A",""{} +Model:4543337805,"Model::A",""{} +Model:4543672701,"Model::A",""{} +Model:4543782397,"Model::A",""{} +Model:4544279962,"Model::A",""{} +Model:4544419126,"Model::A",""{} +Model:4544527034,"Model::A",""{} +Model:4545390500,"Model::A",""{} +Model:4545637781,"Model::A",""{} +Model:4546176841,"Model::A",""{} +Model:4546282483,"Model::A",""{} +Model:4547272699,"Model::A",""{} +Model:4548278860,"Model::A",""{} +Model:4548506799,"Model::A",""{} +Model:4549596387,"Model::A",""{} +Model:4549941849,"Model::A",""{} +Model:4550920905,"Model::A",""{} +Model:4551594131,"Model::A",""{} +Model:4551767963,"Model::A",""{} +Model:4553243847,"Model::A",""{} +Model:4554205633,"Model::A",""{} +Model:4554622333,"Model::A",""{} +Model:4554877793,"Model::A",""{} +Model:4555580607,"Model::A",""{} +Model:4555753797,"Model::A",""{} +Model:4556220913,"Model::A",""{} +Model:4556498022,"Model::A",""{} +Model:4557236911,"Model::A",""{} +Model:4557614503,"Model::A",""{} +Model:4557871206,"Model::A",""{} +Model:4558239814,"Model::A",""{} +Model:4558366975,"Model::A",""{} +Model:4559125108,"Model::A",""{} +Model:4559378223,"Model::A",""{} +Model:4559691759,"Model::A",""{} +Model:4560334166,"Model::A",""{} +Model:4560937142,"Model::A",""{} +Model:4561851021,"Model::A",""{} +Model:4563277547,"Model::A",""{} +Model:4564064774,"Model::A",""{} +Model:4564309463,"Model::A",""{} +Model:4566481124,"Model::A",""{} +Model:4567326284,"Model::A",""{} +Model:4567723981,"Model::A",""{} +Model:4567955204,"Model::A",""{} +Model:4568228572,"Model::A",""{} +Model:4568270648,"Model::A",""{} +Model:4568310753,"Model::A",""{} +Model:4570062405,"Model::A",""{} +Model:4570546509,"Model::A",""{} +Model:4570784659,"Model::A",""{} +Model:4570873514,"Model::A",""{} +Model:4571899051,"Model::A",""{} +Model:4572538187,"Model::A",""{} +Model:4572671290,"Model::A",""{} +Model:4574071448,"Model::A",""{} +Model:4575731091,"Model::A",""{} +Model:4576432191,"Model::A",""{} +Model:4577154609,"Model::A",""{} +Model:4577159474,"Model::A",""{} +Model:4577632999,"Model::A",""{} +Model:4578583058,"Model::A",""{} +Model:4578981455,"Model::A",""{} +Model:4581128312,"Model::A",""{} +Model:4581950386,"Model::A",""{} +Model:4582031373,"Model::A",""{} +Model:4583063535,"Model::A",""{} +Model:4584914914,"Model::A",""{} +Model:4587018101,"Model::A",""{} +Model:4587186695,"Model::A",""{} +Model:4587295861,"Model::A",""{} +Model:4587360002,"Model::A",""{} +Model:4587864870,"Model::A",""{} +Model:4588724075,"Model::A",""{} +Model:4590155021,"Model::A",""{} +Model:4590204884,"Model::A",""{} +Model:4591825727,"Model::A",""{} +Model:4591978823,"Model::A",""{} +Model:4593620449,"Model::A",""{} +Model:4593768752,"Model::A",""{} +Model:4594566953,"Model::A",""{} +Model:4595219648,"Model::A",""{} +Model:4595692081,"Model::A",""{} +Model:4595700990,"Model::A",""{} +Model:4596350216,"Model::A",""{} +Model:4596579217,"Model::A",""{} +Model:4597006841,"Model::A",""{} +Model:4597125886,"Model::A",""{} +Model:4597631207,"Model::A",""{} +Model:4598578125,"Model::A",""{} +Model:4599695647,"Model::A",""{} +Model:4599811717,"Model::A",""{} +Model:4599992637,"Model::A",""{} +Model:4600734563,"Model::A",""{} +Model:4600851525,"Model::A",""{} +Model:4600924094,"Model::A",""{} +Model:4601474657,"Model::A",""{} +Model:4601598153,"Model::A",""{} +Model:4603120829,"Model::A",""{} +Model:4604110903,"Model::A",""{} +Model:4604917591,"Model::A",""{} +Model:4604924107,"Model::A",""{} +Model:4605445755,"Model::A",""{} +Model:4606317341,"Model::A",""{} +Model:4606692797,"Model::A",""{} +Model:4607683609,"Model::A",""{} +Model:4607983227,"Model::A",""{} +Model:4608032906,"Model::A",""{} +Model:4608279430,"Model::A",""{} +Model:4608777258,"Model::A",""{} +Model:4608902003,"Model::A",""{} +Model:4610111977,"Model::A",""{} +Model:4610362258,"Model::A",""{} +Model:4610949745,"Model::A",""{} +Model:4611027413,"Model::A",""{} +Model:4611047177,"Model::A",""{} +Model:4611333563,"Model::A",""{} +Model:4612379096,"Model::A",""{} +Model:4613133286,"Model::A",""{} +Model:4613373551,"Model::A",""{} +Model:4614069254,"Model::A",""{} +Model:4614076361,"Model::A",""{} +Model:4616328879,"Model::A",""{} +Model:4616687428,"Model::A",""{} +Model:4618425641,"Model::A",""{} +Model:4618456613,"Model::A",""{} +Model:4618918563,"Model::A",""{} +Model:4619890173,"Model::A",""{} +Model:4619979222,"Model::A",""{} +Model:4620125334,"Model::A",""{} +Model:4620424889,"Model::A",""{} +Model:4620935443,"Model::A",""{} +Model:4621332964,"Model::A",""{} +Model:4622124829,"Model::A",""{} +Model:4622308309,"Model::A",""{} +Model:4624048263,"Model::A",""{} +Model:4624129573,"Model::A",""{} +Model:4625254736,"Model::A",""{} +Model:4625586785,"Model::A",""{} +Model:4626719351,"Model::A",""{} +Model:4627671885,"Model::A",""{} +Model:4629293027,"Model::A",""{} +Model:4629825274,"Model::A",""{} +Model:4631888701,"Model::A",""{} +Model:4632286527,"Model::A",""{} +Model:4633618322,"Model::A",""{} +Model:4634603686,"Model::A",""{} +Model:4634874275,"Model::A",""{} +Model:4637319869,"Model::A",""{} +Model:4637720331,"Model::A",""{} +Model:4637987689,"Model::A",""{} +Model:4638230181,"Model::A",""{} +Model:4638380898,"Model::A",""{} +Model:4639395959,"Model::A",""{} +Model:4640520563,"Model::A",""{} +Model:4641749667,"Model::A",""{} +Model:4642169433,"Model::A",""{} +Model:4642718572,"Model::A",""{} +Model:4643926287,"Model::A",""{} +Model:4644058446,"Model::A",""{} +Model:4645407731,"Model::A",""{} +Model:4645836425,"Model::A",""{} +Model:4647013059,"Model::A",""{} +Model:4647231676,"Model::A",""{} +Model:4647419087,"Model::A",""{} +Model:4647631475,"Model::A",""{} +Model:4647829911,"Model::A",""{} +Model:4648029387,"Model::A",""{} +Model:4648202369,"Model::A",""{} +Model:4648322255,"Model::A",""{} +Model:4649228334,"Model::A",""{} +Model:4649604318,"Model::A",""{} +Model:4649616477,"Model::A",""{} +Model:4651010374,"Model::A",""{} +Model:4651230743,"Model::A",""{} +Model:4651545467,"Model::A",""{} +Model:4651552018,"Model::A",""{} +Model:4653076474,"Model::A",""{} +Model:4653369903,"Model::A",""{} +Model:4654004919,"Model::A",""{} +Model:4654091957,"Model::A",""{} +Model:4654336351,"Model::A",""{} +Model:4655070716,"Model::A",""{} +Model:4655201417,"Model::A",""{} +Model:4655787277,"Model::A",""{} +Model:4656028099,"Model::A",""{} +Model:4656167546,"Model::A",""{} +Model:4656359684,"Model::A",""{} +Model:4658843236,"Model::A",""{} +Model:4658885828,"Model::A",""{} +Model:4659226685,"Model::A",""{} +Model:4659513049,"Model::A",""{} +Model:4661068039,"Model::A",""{} +Model:4661854346,"Model::A",""{} +Model:4662479318,"Model::A",""{} +Model:4663331420,"Model::A",""{} +Model:4665262534,"Model::A",""{} +Model:4667865839,"Model::A",""{} +Model:4667879505,"Model::A",""{} +Model:4668456585,"Model::A",""{} +Model:4668665031,"Model::A",""{} +Model:4671318141,"Model::A",""{} +Model:4672513526,"Model::A",""{} +Model:4673988314,"Model::A",""{} +Model:4674661465,"Model::A",""{} +Model:4675567354,"Model::A",""{} +Model:4675665258,"Model::A",""{} +Model:4675948825,"Model::A",""{} +Model:4676944842,"Model::A",""{} +Model:4677183590,"Model::A",""{} +Model:4678837470,"Model::A",""{} +Model:4679128673,"Model::A",""{} +Model:4679692210,"Model::A",""{} +Model:4680411646,"Model::A",""{} +Model:4680583410,"Model::A",""{} +Model:4681769485,"Model::A",""{} +Model:4682025651,"Model::A",""{} +Model:4684322158,"Model::A",""{} +Model:4684942251,"Model::A",""{} +Model:4685022117,"Model::A",""{} +Model:4685127529,"Model::A",""{} +Model:4686249436,"Model::A",""{} +Model:4687301749,"Model::A",""{} +Model:4688325143,"Model::A",""{} +Model:4689078749,"Model::A",""{} +Model:4689935366,"Model::A",""{} +Model:4691387231,"Model::A",""{} +Model:4691475656,"Model::A",""{} +Model:4691475730,"Model::A",""{} +Model:4692091290,"Model::A",""{} +Model:4692184098,"Model::A",""{} +Model:4692339436,"Model::A",""{} +Model:4692745338,"Model::A",""{} +Model:4692769311,"Model::A",""{} +Model:4692966209,"Model::A",""{} +Model:4693953037,"Model::A",""{} +Model:4694703844,"Model::A",""{} +Model:4694792641,"Model::A",""{} +Model:4696097411,"Model::A",""{} +Model:4696826038,"Model::A",""{} +Model:4696844903,"Model::A",""{} +Model:4699005853,"Model::A",""{} +Model:4699015323,"Model::A",""{} +Model:4699127157,"Model::A",""{} +Model:4699326379,"Model::A",""{} +Model:4699741290,"Model::A",""{} +Model:4700534370,"Model::A",""{} +Model:4700737750,"Model::A",""{} +Model:4701236027,"Model::A",""{} +Model:4702413877,"Model::A",""{} +Model:4702500162,"Model::A",""{} +Model:4704143573,"Model::A",""{} +Model:4705079081,"Model::A",""{} +Model:4705418960,"Model::A",""{} +Model:4705557140,"Model::A",""{} +Model:4707581099,"Model::A",""{} +Model:4707678314,"Model::A",""{} +Model:4707943299,"Model::A",""{} +Model:4708279809,"Model::A",""{} +Model:4708369233,"Model::A",""{} +Model:4709265139,"Model::A",""{} +Model:4710896137,"Model::A",""{} +Model:4712153245,"Model::A",""{} +Model:4712731721,"Model::A",""{} +Model:4713524990,"Model::A",""{} +Model:4713804632,"Model::A",""{} +Model:4714171540,"Model::A",""{} +Model:4714769434,"Model::A",""{} +Model:4714914641,"Model::A",""{} +Model:4715227489,"Model::A",""{} +Model:4715362799,"Model::A",""{} +Model:4715567309,"Model::A",""{} +Model:4715863918,"Model::A",""{} +Model:4715929631,"Model::A",""{} +Model:4717296453,"Model::A",""{} +Model:4717965171,"Model::A",""{} +Model:4718949427,"Model::A",""{} +Model:4721847460,"Model::A",""{} +Model:4721965597,"Model::A",""{} +Model:4722107452,"Model::A",""{} +Model:4722312923,"Model::A",""{} +Model:4722617849,"Model::A",""{} +Model:4722661667,"Model::A",""{} +Model:4723215038,"Model::A",""{} +Model:4723604974,"Model::A",""{} +Model:4723612375,"Model::A",""{} +Model:4724269261,"Model::A",""{} +Model:4725931390,"Model::A",""{} +Model:4726031125,"Model::A",""{} +Model:4726271193,"Model::A",""{} +Model:4727101206,"Model::A",""{} +Model:4727694519,"Model::A",""{} +Model:4727802123,"Model::A",""{} +Model:4728225135,"Model::A",""{} +Model:4728262035,"Model::A",""{} +Model:4728764650,"Model::A",""{} +Model:4728800578,"Model::A",""{} +Model:4730910030,"Model::A",""{} +Model:4730923732,"Model::A",""{} +Model:4732191137,"Model::A",""{} +Model:4732853699,"Model::A",""{} +Model:4733033043,"Model::A",""{} +Model:4734014030,"Model::A",""{} +Model:4735190374,"Model::A",""{} +Model:4735349766,"Model::A",""{} +Model:4736137079,"Model::A",""{} +Model:4736881293,"Model::A",""{} +Model:4737282488,"Model::A",""{} +Model:4737977075,"Model::A",""{} +Model:4738403546,"Model::A",""{} +Model:4738922298,"Model::A",""{} +Model:4740109388,"Model::A",""{} +Model:4740220856,"Model::A",""{} +Model:4740346660,"Model::A",""{} +Model:4741243900,"Model::A",""{} +Model:4741433217,"Model::A",""{} +Model:4741656145,"Model::A",""{} +Model:4743055619,"Model::A",""{} +Model:4743480377,"Model::A",""{} +Model:4743777450,"Model::A",""{} +Model:4744101306,"Model::A",""{} +Model:4745554623,"Model::A",""{} +Model:4746201015,"Model::A",""{} +Model:4746325950,"Model::A",""{} +Model:4747114194,"Model::A",""{} +Model:4747375046,"Model::A",""{} +Model:4748229872,"Model::A",""{} +Model:4749043001,"Model::A",""{} +Model:4749096343,"Model::A",""{} +Model:4750294832,"Model::A",""{} +Model:4750739634,"Model::A",""{} +Model:4750907901,"Model::A",""{} +Model:4750917545,"Model::A",""{} +Model:4751022995,"Model::A",""{} +Model:4751374828,"Model::A",""{} +Model:4753499455,"Model::A",""{} +Model:4753526333,"Model::A",""{} +Model:4754184104,"Model::A",""{} +Model:4754535654,"Model::A",""{} +Model:4754549739,"Model::A",""{} +Model:4754843117,"Model::A",""{} +Model:4755556681,"Model::A",""{} +Model:4755717550,"Model::A",""{} +Model:4755739991,"Model::A",""{} +Model:4755851775,"Model::A",""{} +Model:4756343654,"Model::A",""{} +Model:4757910633,"Model::A",""{} +Model:4758175622,"Model::A",""{} +Model:4758489654,"Model::A",""{} +Model:4758577348,"Model::A",""{} +Model:4758634038,"Model::A",""{} +Model:4759011494,"Model::A",""{} +Model:4761327213,"Model::A",""{} +Model:4761539237,"Model::A",""{} +Model:4763363684,"Model::A",""{} +Model:4766752325,"Model::A",""{} +Model:4768124071,"Model::A",""{} +Model:4769276394,"Model::A",""{} +Model:4769485019,"Model::A",""{} +Model:4770019605,"Model::A",""{} +Model:4770937682,"Model::A",""{} +Model:4770955778,"Model::A",""{} +Model:4771145234,"Model::A",""{} +Model:4773095717,"Model::A",""{} +Model:4773815073,"Model::A",""{} +Model:4773897374,"Model::A",""{} +Model:4773971077,"Model::A",""{} +Model:4774641434,"Model::A",""{} +Model:4775216682,"Model::A",""{} +Model:4776083370,"Model::A",""{} +Model:4777135542,"Model::A",""{} +Model:4777256333,"Model::A",""{} +Model:4778114530,"Model::A",""{} +Model:4778582829,"Model::A",""{} +Model:4779855406,"Model::A",""{} +Model:4781555071,"Model::A",""{} +Model:4782038211,"Model::A",""{} +Model:4782436399,"Model::A",""{} +Model:4782517494,"Model::A",""{} +Model:4783638047,"Model::A",""{} +Model:4785107518,"Model::A",""{} +Model:4785631565,"Model::A",""{} +Model:4786728001,"Model::A",""{} +Model:4787084034,"Model::A",""{} +Model:4787445381,"Model::A",""{} +Model:4787832518,"Model::A",""{} +Model:4789149197,"Model::A",""{} +Model:4789414753,"Model::A",""{} +Model:4791781849,"Model::A",""{} +Model:4792896471,"Model::A",""{} +Model:4793501847,"Model::A",""{} +Model:4793508519,"Model::A",""{} +Model:4793939265,"Model::A",""{} +Model:4794598259,"Model::A",""{} +Model:4795892834,"Model::A",""{} +Model:4797239215,"Model::A",""{} +Model:4797983620,"Model::A",""{} +Model:4798007457,"Model::A",""{} +Model:4798347997,"Model::A",""{} +Model:4799496673,"Model::A",""{} +Model:4800464564,"Model::A",""{} +Model:4801601765,"Model::A",""{} +Model:4802171674,"Model::A",""{} +Model:4802675290,"Model::A",""{} +Model:4802738188,"Model::A",""{} +Model:4802929202,"Model::A",""{} +Model:4803613785,"Model::A",""{} +Model:4803667757,"Model::A",""{} +Model:4803730676,"Model::A",""{} +Model:4804152758,"Model::A",""{} +Model:4804163669,"Model::A",""{} +Model:4804270701,"Model::A",""{} +Model:4807876285,"Model::A",""{} +Model:4808399371,"Model::A",""{} +Model:4808868751,"Model::A",""{} +Model:4809905974,"Model::A",""{} +Model:4809908204,"Model::A",""{} +Model:4810711854,"Model::A",""{} +Model:4811874641,"Model::A",""{} +Model:4812140915,"Model::A",""{} +Model:4812199180,"Model::A",""{} +Model:4812722947,"Model::A",""{} +Model:4816464490,"Model::A",""{} +Model:4817386169,"Model::A",""{} +Model:4817989267,"Model::A",""{} +Model:4818500703,"Model::A",""{} +Model:4819799374,"Model::A",""{} +Model:4821363365,"Model::A",""{} +Model:4822151673,"Model::A",""{} +Model:4822203857,"Model::A",""{} +Model:4823756286,"Model::A",""{} +Model:4823995831,"Model::A",""{} +Model:4824019862,"Model::A",""{} +Model:4824095226,"Model::A",""{} +Model:4826303469,"Model::A",""{} +Model:4826835534,"Model::A",""{} +Model:4827077270,"Model::A",""{} +Model:4828650546,"Model::A",""{} +Model:4828807673,"Model::A",""{} +Model:4828818514,"Model::A",""{} +Model:4829597072,"Model::A",""{} +Model:4830221421,"Model::A",""{} +Model:4831047406,"Model::A",""{} +Model:4832820001,"Model::A",""{} +Model:4834053378,"Model::A",""{} +Model:4834336297,"Model::A",""{} +Model:4836400098,"Model::A",""{} +Model:4836960604,"Model::A",""{} +Model:4837486127,"Model::A",""{} +Model:4838378693,"Model::A",""{} +Model:4838784617,"Model::A",""{} +Model:4840887347,"Model::A",""{} +Model:4841557844,"Model::A",""{} +Model:4842862522,"Model::A",""{} +Model:4842930629,"Model::A",""{} +Model:4843679835,"Model::A",""{} +Model:4843748458,"Model::A",""{} +Model:4843862938,"Model::A",""{} +Model:4845261761,"Model::A",""{} +Model:4845320453,"Model::A",""{} +Model:4845834641,"Model::A",""{} +Model:4845992447,"Model::A",""{} +Model:4845994179,"Model::A",""{} +Model:4846179721,"Model::A",""{} +Model:4846706451,"Model::A",""{} +Model:4847682115,"Model::A",""{} +Model:4847974353,"Model::A",""{} +Model:4848319049,"Model::A",""{} +Model:4848731977,"Model::A",""{} +Model:4848893818,"Model::A",""{} +Model:4849324370,"Model::A",""{} +Model:4850216708,"Model::A",""{} +Model:4851505633,"Model::A",""{} +Model:4852391277,"Model::A",""{} +Model:4852527676,"Model::A",""{} +Model:4852900486,"Model::A",""{} +Model:4853898441,"Model::A",""{} +Model:4855648547,"Model::A",""{} +Model:4856758329,"Model::A",""{} +Model:4857011071,"Model::A",""{} +Model:4858800809,"Model::A",""{} +Model:4858877335,"Model::A",""{} +Model:4859646896,"Model::A",""{} +Model:4859803754,"Model::A",""{} +Model:4860120209,"Model::A",""{} +Model:4860686980,"Model::A",""{} +Model:4862541849,"Model::A",""{} +Model:4867167817,"Model::A",""{} +Model:4867347225,"Model::A",""{} +Model:4867528506,"Model::A",""{} +Model:4868036429,"Model::A",""{} +Model:4868531370,"Model::A",""{} +Model:4868733811,"Model::A",""{} +Model:4868873087,"Model::A",""{} +Model:4870546253,"Model::A",""{} +Model:4870653728,"Model::A",""{} +Model:4870917721,"Model::A",""{} +Model:4872628595,"Model::A",""{} +Model:4872638108,"Model::A",""{} +Model:4873016406,"Model::A",""{} +Model:4873173111,"Model::A",""{} +Model:4873195213,"Model::A",""{} +Model:4874268609,"Model::A",""{} +Model:4874878282,"Model::A",""{} +Model:4874917109,"Model::A",""{} +Model:4874985193,"Model::A",""{} +Model:4875105061,"Model::A",""{} +Model:4875280268,"Model::A",""{} +Model:4876156453,"Model::A",""{} +Model:4876760961,"Model::A",""{} +Model:4877870245,"Model::A",""{} +Model:4880560787,"Model::A",""{} +Model:4880744091,"Model::A",""{} +Model:4880828975,"Model::A",""{} +Model:4880888938,"Model::A",""{} +Model:4881259436,"Model::A",""{} +Model:4881770785,"Model::A",""{} +Model:4882648612,"Model::A",""{} +Model:4883127561,"Model::A",""{} +Model:4883308642,"Model::A",""{} +Model:4883415620,"Model::A",""{} +Model:4883542990,"Model::A",""{} +Model:4885681963,"Model::A",""{} +Model:4886117006,"Model::A",""{} +Model:4886463680,"Model::A",""{} +Model:4886527736,"Model::A",""{} +Model:4886821598,"Model::A",""{} +Model:4887186263,"Model::A",""{} +Model:4887825812,"Model::A",""{} +Model:4888331857,"Model::A",""{} +Model:4889084581,"Model::A",""{} +Model:4889312142,"Model::A",""{} +Model:4890378734,"Model::A",""{} +Model:4890588895,"Model::A",""{} +Model:4890788471,"Model::A",""{} +Model:4891653441,"Model::A",""{} +Model:4891890149,"Model::A",""{} +Model:4892085299,"Model::A",""{} +Model:4893325893,"Model::A",""{} +Model:4893329131,"Model::A",""{} +Model:4895030419,"Model::A",""{} +Model:4895501954,"Model::A",""{} +Model:4895856585,"Model::A",""{} +Model:4895877026,"Model::A",""{} +Model:4897008658,"Model::A",""{} +Model:4897109276,"Model::A",""{} +Model:4897119673,"Model::A",""{} +Model:4897627959,"Model::A",""{} +Model:4898028299,"Model::A",""{} +Model:4898746127,"Model::A",""{} +Model:4899641642,"Model::A",""{} +Model:4900370218,"Model::A",""{} +Model:4900542484,"Model::A",""{} +Model:4900820015,"Model::A",""{} +Model:4900852973,"Model::A",""{} +Model:4901422306,"Model::A",""{} +Model:4901623923,"Model::A",""{} +Model:4904641822,"Model::A",""{} +Model:4904710293,"Model::A",""{} +Model:4906387175,"Model::A",""{} +Model:4907168213,"Model::A",""{} +Model:4907724340,"Model::A",""{} +Model:4907812154,"Model::A",""{} +Model:4908508402,"Model::A",""{} +Model:4908874231,"Model::A",""{} +Model:4909814401,"Model::A",""{} +Model:4909932831,"Model::A",""{} +Model:4910432838,"Model::A",""{} +Model:4911408851,"Model::A",""{} +Model:4911742283,"Model::A",""{} +Model:4913575631,"Model::A",""{} +Model:4914528963,"Model::A",""{} +Model:4914658502,"Model::A",""{} +Model:4914954393,"Model::A",""{} +Model:4915398401,"Model::A",""{} +Model:4916488343,"Model::A",""{} +Model:4916707369,"Model::A",""{} +Model:4917577060,"Model::A",""{} +Model:4918970233,"Model::A",""{} +Model:4918973190,"Model::A",""{} +Model:4919338111,"Model::A",""{} +Model:4920130174,"Model::A",""{} +Model:4920566701,"Model::A",""{} +Model:4921587698,"Model::A",""{} +Model:4921873537,"Model::A",""{} +Model:4922440921,"Model::A",""{} +Model:4922805140,"Model::A",""{} +Model:4923118607,"Model::A",""{} +Model:4923749828,"Model::A",""{} +Model:4924288292,"Model::A",""{} +Model:4924477801,"Model::A",""{} +Model:4924585275,"Model::A",""{} +Model:4924643991,"Model::A",""{} +Model:4926385967,"Model::A",""{} +Model:4926620531,"Model::A",""{} +Model:4926645557,"Model::A",""{} +Model:4927342631,"Model::A",""{} +Model:4928198551,"Model::A",""{} +Model:4928866965,"Model::A",""{} +Model:4929288719,"Model::A",""{} +Model:4929584973,"Model::A",""{} +Model:4929838071,"Model::A",""{} +Model:4929937841,"Model::A",""{} +Model:4929974007,"Model::A",""{} +Model:4930162675,"Model::A",""{} +Model:4930249586,"Model::A",""{} +Model:4931166476,"Model::A",""{} +Model:4931244361,"Model::A",""{} +Model:4931885611,"Model::A",""{} +Model:4932456761,"Model::A",""{} +Model:4933003255,"Model::A",""{} +Model:4933025462,"Model::A",""{} +Model:4934331301,"Model::A",""{} +Model:4934861675,"Model::A",""{} +Model:4934953222,"Model::A",""{} +Model:4935541445,"Model::A",""{} +Model:4935889783,"Model::A",""{} +Model:4936277487,"Model::A",""{} +Model:4936716458,"Model::A",""{} +Model:4937399678,"Model::A",""{} +Model:4938485166,"Model::A",""{} +Model:4938618201,"Model::A",""{} +Model:4938730280,"Model::A",""{} +Model:4940074266,"Model::A",""{} +Model:4940618897,"Model::A",""{} +Model:4940854970,"Model::A",""{} +Model:4940959499,"Model::A",""{} +Model:4940967259,"Model::A",""{} +Model:4941045539,"Model::A",""{} +Model:4941180541,"Model::A",""{} +Model:4941661706,"Model::A",""{} +Model:4941737273,"Model::A",""{} +Model:4942586651,"Model::A",""{} +Model:4942815297,"Model::A",""{} +Model:4944558253,"Model::A",""{} +Model:4945294887,"Model::A",""{} +Model:4945505263,"Model::A",""{} +Model:4946241431,"Model::A",""{} +Model:4946288377,"Model::A",""{} +Model:4946518681,"Model::A",""{} +Model:4946832330,"Model::A",""{} +Model:4946988502,"Model::A",""{} +Model:4947707709,"Model::A",""{} +Model:4947813944,"Model::A",""{} +Model:4948130026,"Model::A",""{} +Model:4948621105,"Model::A",""{} +Model:4949526752,"Model::A",""{} +Model:4950391322,"Model::A",""{} +Model:4950870460,"Model::A",""{} +Model:4952882651,"Model::A",""{} +Model:4952887376,"Model::A",""{} +Model:4953707283,"Model::A",""{} +Model:4955291000,"Model::A",""{} +Model:4956170915,"Model::A",""{} +Model:4956370133,"Model::A",""{} +Model:4956805724,"Model::A",""{} +Model:4956838406,"Model::A",""{} +Model:4957141081,"Model::A",""{} +Model:4958071619,"Model::A",""{} +Model:4959182925,"Model::A",""{} +Model:4960847849,"Model::A",""{} +Model:4962061207,"Model::A",""{} +Model:4962302118,"Model::A",""{} +Model:4964127580,"Model::A",""{} +Model:4964304193,"Model::A",""{} +Model:4964618697,"Model::A",""{} +Model:4965121605,"Model::A",""{} +Model:4965701509,"Model::A",""{} +Model:4965823362,"Model::A",""{} +Model:4966890278,"Model::A",""{} +Model:4967261035,"Model::A",""{} +Model:4967390907,"Model::A",""{} +Model:4968030549,"Model::A",""{} +Model:4968422735,"Model::A",""{} +Model:4968514577,"Model::A",""{} +Model:4968656846,"Model::A",""{} +Model:4970311403,"Model::A",""{} +Model:4970717633,"Model::A",""{} +Model:4970956493,"Model::A",""{} +Model:4971604627,"Model::A",""{} +Model:4973215298,"Model::A",""{} +Model:4973913761,"Model::A",""{} +Model:4973946926,"Model::A",""{} +Model:4974084253,"Model::A",""{} +Model:4976388877,"Model::A",""{} +Model:4976764942,"Model::A",""{} +Model:4977142527,"Model::A",""{} +Model:4977234306,"Model::A",""{} +Model:4977532184,"Model::A",""{} +Model:4978463195,"Model::A",""{} +Model:4978611656,"Model::A",""{} +Model:4979939059,"Model::A",""{} +Model:4981131260,"Model::A",""{} +Model:4981168869,"Model::A",""{} +Model:4983045745,"Model::A",""{} +Model:4983979129,"Model::A",""{} +Model:4984067919,"Model::A",""{} +Model:4985245725,"Model::A",""{} +Model:4986027554,"Model::A",""{} +Model:4986097990,"Model::A",""{} +Model:4986728693,"Model::A",""{} +Model:4986952401,"Model::A",""{} +Model:4987331823,"Model::A",""{} +Model:4987720851,"Model::A",""{} +Model:4988116075,"Model::A",""{} +Model:4988139990,"Model::A",""{} +Model:4988963971,"Model::A",""{} +Model:4989793510,"Model::A",""{} +Model:4991077130,"Model::A",""{} +Model:4991518931,"Model::A",""{} +Model:4991772581,"Model::A",""{} +Model:4992107967,"Model::A",""{} +Model:4993512713,"Model::A",""{} +Model:4994523473,"Model::A",""{} +Model:4995030350,"Model::A",""{} +Model:4995385003,"Model::A",""{} +Model:4995594250,"Model::A",""{} +Model:4997147693,"Model::A",""{} +Model:4998327063,"Model::A",""{} +Model:5000225055,"Model::A",""{} +Model:5000477490,"Model::A",""{} +Model:5000608778,"Model::A",""{} +Model:5001339777,"Model::A",""{} +Model:5001488543,"Model::A",""{} +Model:5001945183,"Model::A",""{} +Model:5002130602,"Model::A",""{} +Model:5002303690,"Model::A",""{} +Model:5003609527,"Model::A",""{} +Model:5004024357,"Model::A",""{} +Model:5004942157,"Model::A",""{} +Model:5005317794,"Model::A",""{} +Model:5005335700,"Model::A",""{} +Model:5005419939,"Model::A",""{} +Model:5005557433,"Model::A",""{} +Model:5006160721,"Model::A",""{} +Model:5006610882,"Model::A",""{} +Model:5006616270,"Model::A",""{} +Model:5007552347,"Model::A",""{} +Model:5007947773,"Model::A",""{} +Model:5008092381,"Model::A",""{} +Model:5008538143,"Model::A",""{} +Model:5008857536,"Model::A",""{} +Model:5009319412,"Model::A",""{} +Model:5010027677,"Model::A",""{} +Model:5010068657,"Model::A",""{} +Model:5012575445,"Model::A",""{} +Model:5012934858,"Model::A",""{} +Model:5012947049,"Model::A",""{} +Model:5013004124,"Model::A",""{} +Model:5013015967,"Model::A",""{} +Model:5013064485,"Model::A",""{} +Model:5014092659,"Model::A",""{} +Model:5016077998,"Model::A",""{} +Model:5016148558,"Model::A",""{} +Model:5017182309,"Model::A",""{} +Model:5017397645,"Model::A",""{} +Model:5017740342,"Model::A",""{} +Model:5018177846,"Model::A",""{} +Model:5018561996,"Model::A",""{} +Model:5019165785,"Model::A",""{} +Model:5019601895,"Model::A",""{} +Model:5019985919,"Model::A",""{} +Model:5020590427,"Model::A",""{} +Model:5020946097,"Model::A",""{} +Model:5022124250,"Model::A",""{} +Model:5022233133,"Model::A",""{} +Model:5022415102,"Model::A",""{} +Model:5022438281,"Model::A",""{} +Model:5022623981,"Model::A",""{} +Model:5023139647,"Model::A",""{} +Model:5024286267,"Model::A",""{} +Model:5024836511,"Model::A",""{} +Model:5025081806,"Model::A",""{} +Model:5026270965,"Model::A",""{} +Model:5028249357,"Model::A",""{} +Model:5030099898,"Model::A",""{} +Model:5030279293,"Model::A",""{} +Model:5030471671,"Model::A",""{} +Model:5030486503,"Model::A",""{} +Model:5030929463,"Model::A",""{} +Model:5031259202,"Model::A",""{} +Model:5031661086,"Model::A",""{} +Model:5031824467,"Model::A",""{} +Model:5033292825,"Model::A",""{} +Model:5033351335,"Model::A",""{} +Model:5033481221,"Model::A",""{} +Model:5034291450,"Model::A",""{} +Model:5034681857,"Model::A",""{} +Model:5035278562,"Model::A",""{} +Model:5036038412,"Model::A",""{} +Model:5037280150,"Model::A",""{} +Model:5037846623,"Model::A",""{} +Model:5038558650,"Model::A",""{} +Model:5040544303,"Model::A",""{} +Model:5041618159,"Model::A",""{} +Model:5041694521,"Model::A",""{} +Model:5042187727,"Model::A",""{} +Model:5042416557,"Model::A",""{} +Model:5043749301,"Model::A",""{} +Model:5044124029,"Model::A",""{} +Model:5044357991,"Model::A",""{} +Model:5044493666,"Model::A",""{} +Model:5044583654,"Model::A",""{} +Model:5045749353,"Model::A",""{} +Model:5045859689,"Model::A",""{} +Model:5046337818,"Model::A",""{} +Model:5048321150,"Model::A",""{} +Model:5048428445,"Model::A",""{} +Model:5048659437,"Model::A",""{} +Model:5048878649,"Model::A",""{} +Model:5049131093,"Model::A",""{} +Model:5049480695,"Model::A",""{} +Model:5049875306,"Model::A",""{} +Model:5050699101,"Model::A",""{} +Model:5050834987,"Model::A",""{} +Model:5051334158,"Model::A",""{} +Model:5052484353,"Model::A",""{} +Model:5053750825,"Model::A",""{} +Model:5054219189,"Model::A",""{} +Model:5055117700,"Model::A",""{} +Model:5055759002,"Model::A",""{} +Model:5056170872,"Model::A",""{} +Model:5056265953,"Model::A",""{} +Model:5056370936,"Model::A",""{} +Model:5057609197,"Model::A",""{} +Model:5058078628,"Model::A",""{} +Model:5059239377,"Model::A",""{} +Model:5059836749,"Model::A",""{} +Model:5061187309,"Model::A",""{} +Model:5061281575,"Model::A",""{} +Model:5061351430,"Model::A",""{} +Model:5061467947,"Model::A",""{} +Model:5061484967,"Model::A",""{} +Model:5061854398,"Model::A",""{} +Model:5062749170,"Model::A",""{} +Model:5062750558,"Model::A",""{} +Model:5062800249,"Model::A",""{} +Model:5063028051,"Model::A",""{} +Model:5064020603,"Model::A",""{} +Model:5064091015,"Model::A",""{} +Model:5064661165,"Model::A",""{} +Model:5064985615,"Model::A",""{} +Model:5065276490,"Model::A",""{} +Model:5065773333,"Model::A",""{} +Model:5066674194,"Model::A",""{} +Model:5067084865,"Model::A",""{} +Model:5067841814,"Model::A",""{} +Model:5068034131,"Model::A",""{} +Model:5068638646,"Model::A",""{} +Model:5068996413,"Model::A",""{} +Model:5069843146,"Model::A",""{} +Model:5070693471,"Model::A",""{} +Model:5072275267,"Model::A",""{} +Model:5072370731,"Model::A",""{} +Model:5072808363,"Model::A",""{} +Model:5074342967,"Model::A",""{} +Model:5074361745,"Model::A",""{} +Model:5075086575,"Model::A",""{} +Model:5075449079,"Model::A",""{} +Model:5076085222,"Model::A",""{} +Model:5076865229,"Model::A",""{} +Model:5077066479,"Model::A",""{} +Model:5077354378,"Model::A",""{} +Model:5077407037,"Model::A",""{} +Model:5077459754,"Model::A",""{} +Model:5077497982,"Model::A",""{} +Model:5079552603,"Model::A",""{} +Model:5079807958,"Model::A",""{} +Model:5080116748,"Model::A",""{} +Model:5081012343,"Model::A",""{} +Model:5082307031,"Model::A",""{} +Model:5082700063,"Model::A",""{} +Model:5082825358,"Model::A",""{} +Model:5083025804,"Model::A",""{} +Model:5083220687,"Model::A",""{} +Model:5083287431,"Model::A",""{} +Model:5083587570,"Model::A",""{} +Model:5083743939,"Model::A",""{} +Model:5084112550,"Model::A",""{} +Model:5085055313,"Model::A",""{} +Model:5086558292,"Model::A",""{} +Model:5086688933,"Model::A",""{} +Model:5086745277,"Model::A",""{} +Model:5086746433,"Model::A",""{} +Model:5087093782,"Model::A",""{} +Model:5088179679,"Model::A",""{} +Model:5088412064,"Model::A",""{} +Model:5089065998,"Model::A",""{} +Model:5089593050,"Model::A",""{} +Model:5089773382,"Model::A",""{} +Model:5090961998,"Model::A",""{} +Model:5091182097,"Model::A",""{} +Model:5092098395,"Model::A",""{} +Model:5093217535,"Model::A",""{} +Model:5095015963,"Model::A",""{} +Model:5095704953,"Model::A",""{} +Model:5095856924,"Model::A",""{} +Model:5096220554,"Model::A",""{} +Model:5097439412,"Model::A",""{} +Model:5097802194,"Model::A",""{} +Model:5097913377,"Model::A",""{} +Model:5100131261,"Model::A",""{} +Model:5100249892,"Model::A",""{} +Model:5100330313,"Model::A",""{} +Model:5101640291,"Model::A",""{} +Model:5101663301,"Model::A",""{} +Model:5102870065,"Model::A",""{} +Model:5103828891,"Model::A",""{} +Model:5104029079,"Model::A",""{} +Model:5105391354,"Model::A",""{} +Model:5106534261,"Model::A",""{} +Model:5107447717,"Model::A",""{} +Model:5107484395,"Model::A",""{} +Model:5108283010,"Model::A",""{} +Model:5108320832,"Model::A",""{} +Model:5108340291,"Model::A",""{} +Model:5108662043,"Model::A",""{} +Model:5108752871,"Model::A",""{} +Model:5108876749,"Model::A",""{} +Model:5109437527,"Model::A",""{} +Model:5109455646,"Model::A",""{} +Model:5109605129,"Model::A",""{} +Model:5110977102,"Model::A",""{} +Model:5111336243,"Model::A",""{} +Model:5111418487,"Model::A",""{} +Model:5113252946,"Model::A",""{} +Model:5114733476,"Model::A",""{} +Model:5115030981,"Model::A",""{} +Model:5115442754,"Model::A",""{} +Model:5115993332,"Model::A",""{} +Model:5117243079,"Model::A",""{} +Model:5118615717,"Model::A",""{} +Model:5118858986,"Model::A",""{} +Model:5119596194,"Model::A",""{} +Model:5119698009,"Model::A",""{} +Model:5121005299,"Model::A",""{} +Model:5122353916,"Model::A",""{} +Model:5124115229,"Model::A",""{} +Model:5124797444,"Model::A",""{} +Model:5124965934,"Model::A",""{} +Model:5125732339,"Model::A",""{} +Model:5126233265,"Model::A",""{} +Model:5126854115,"Model::A",""{} +Model:5126913788,"Model::A",""{} +Model:5127148974,"Model::A",""{} +Model:5127290659,"Model::A",""{} +Model:5127584325,"Model::A",""{} +Model:5128787105,"Model::A",""{} +Model:5128851534,"Model::A",""{} +Model:5128870094,"Model::A",""{} +Model:5130646117,"Model::A",""{} +Model:5130844826,"Model::A",""{} +Model:5130988230,"Model::A",""{} +Model:5130990411,"Model::A",""{} +Model:5131092614,"Model::A",""{} +Model:5131240513,"Model::A",""{} +Model:5132526758,"Model::A",""{} +Model:5132807816,"Model::A",""{} +Model:5133367902,"Model::A",""{} +Model:5134625013,"Model::A",""{} +Model:5135741362,"Model::A",""{} +Model:5136098716,"Model::A",""{} +Model:5136115365,"Model::A",""{} +Model:5136305953,"Model::A",""{} +Model:5136947653,"Model::A",""{} +Model:5137656551,"Model::A",""{} +Model:5138175459,"Model::A",""{} +Model:5138771528,"Model::A",""{} +Model:5138779250,"Model::A",""{} +Model:5138957759,"Model::A",""{} +Model:5139305457,"Model::A",""{} +Model:5140227379,"Model::A",""{} +Model:5140490995,"Model::A",""{} +Model:5140970210,"Model::A",""{} +Model:5141131262,"Model::A",""{} +Model:5141306894,"Model::A",""{} +Model:5141424670,"Model::A",""{} +Model:5143670192,"Model::A",""{} +Model:5144018612,"Model::A",""{} +Model:5145003733,"Model::A",""{} +Model:5145052886,"Model::A",""{} +Model:5145948394,"Model::A",""{} +Model:5146175308,"Model::A",""{} +Model:5146516707,"Model::A",""{} +Model:5146650827,"Model::A",""{} +Model:5146678335,"Model::A",""{} +Model:5146707113,"Model::A",""{} +Model:5146714961,"Model::A",""{} +Model:5146721481,"Model::A",""{} +Model:5146957943,"Model::A",""{} +Model:5147303615,"Model::A",""{} +Model:5147309126,"Model::A",""{} +Model:5149638037,"Model::A",""{} +Model:5151070047,"Model::A",""{} +Model:5151085012,"Model::A",""{} +Model:5151249224,"Model::A",""{} +Model:5151386850,"Model::A",""{} +Model:5152072069,"Model::A",""{} +Model:5152401469,"Model::A",""{} +Model:5153120442,"Model::A",""{} +Model:5154246830,"Model::A",""{} +Model:5154759557,"Model::A",""{} +Model:5155647217,"Model::A",""{} +Model:5156370968,"Model::A",""{} +Model:5157801973,"Model::A",""{} +Model:5158784452,"Model::A",""{} +Model:5159059411,"Model::A",""{} +Model:5159920109,"Model::A",""{} +Model:5160162047,"Model::A",""{} +Model:5160465029,"Model::A",""{} +Model:5161044561,"Model::A",""{} +Model:5161126496,"Model::A",""{} +Model:5161155313,"Model::A",""{} +Model:5161949241,"Model::A",""{} +Model:5162251573,"Model::A",""{} +Model:5162562931,"Model::A",""{} +Model:5162926585,"Model::A",""{} +Model:5163208904,"Model::A",""{} +Model:5164456101,"Model::A",""{} +Model:5164859434,"Model::A",""{} +Model:5164895873,"Model::A",""{} +Model:5165584138,"Model::A",""{} +Model:5167174681,"Model::A",""{} +Model:5168588151,"Model::A",""{} +Model:5169322450,"Model::A",""{} +Model:5169506857,"Model::A",""{} +Model:5169660140,"Model::A",""{} +Model:5171079274,"Model::A",""{} +Model:5171353593,"Model::A",""{} +Model:5171458030,"Model::A",""{} +Model:5171486401,"Model::A",""{} +Model:5171542869,"Model::A",""{} +Model:5171699077,"Model::A",""{} +Model:5171716545,"Model::A",""{} +Model:5171885243,"Model::A",""{} +Model:5171912806,"Model::A",""{} +Model:5171975039,"Model::A",""{} +Model:5172167430,"Model::A",""{} +Model:5172702259,"Model::A",""{} +Model:5172761010,"Model::A",""{} +Model:5173663929,"Model::A",""{} +Model:5175682137,"Model::A",""{} +Model:5175694105,"Model::A",""{} +Model:5175978271,"Model::A",""{} +Model:5176207717,"Model::A",""{} +Model:5176687251,"Model::A",""{} +Model:5176709974,"Model::A",""{} +Model:5176723951,"Model::A",""{} +Model:5177042154,"Model::A",""{} +Model:5177064934,"Model::A",""{} +Model:5177085203,"Model::A",""{} +Model:5178582377,"Model::A",""{} +Model:5178594757,"Model::A",""{} +Model:5179034351,"Model::A",""{} +Model:5179684251,"Model::A",""{} +Model:5180474101,"Model::A",""{} +Model:5180692854,"Model::A",""{} +Model:5181366202,"Model::A",""{} +Model:5181455005,"Model::A",""{} +Model:5182332676,"Model::A",""{} +Model:5182714342,"Model::A",""{} +Model:5183182545,"Model::A",""{} +Model:5183844025,"Model::A",""{} +Model:5184115319,"Model::A",""{} +Model:5184294163,"Model::A",""{} +Model:5184322043,"Model::A",""{} +Model:5184468702,"Model::A",""{} +Model:5185757775,"Model::A",""{} +Model:5186476454,"Model::A",""{} +Model:5187292779,"Model::A",""{} +Model:5188100942,"Model::A",""{} +Model:5190912658,"Model::A",""{} +Model:5191330249,"Model::A",""{} +Model:5191608499,"Model::A",""{} +Model:5192054011,"Model::A",""{} +Model:5192600524,"Model::A",""{} +Model:5193409233,"Model::A",""{} +Model:5194344822,"Model::A",""{} +Model:5194425163,"Model::A",""{} +Model:5194881195,"Model::A",""{} +Model:5195020482,"Model::A",""{} +Model:5195480570,"Model::A",""{} +Model:5195517022,"Model::A",""{} +Model:5196711503,"Model::A",""{} +Model:5196753875,"Model::A",""{} +Model:5197589116,"Model::A",""{} +Model:5198374221,"Model::A",""{} +Model:5199400802,"Model::A",""{} +Model:5199719847,"Model::A",""{} +Model:5199748445,"Model::A",""{} +Model:5200629039,"Model::A",""{} +Model:5201485927,"Model::A",""{} +Model:5202996278,"Model::A",""{} +Model:5203064089,"Model::A",""{} +Model:5203394096,"Model::A",""{} +Model:5204248514,"Model::A",""{} +Model:5204919702,"Model::A",""{} +Model:5204976906,"Model::A",""{} +Model:5205949257,"Model::A",""{} +Model:5206091449,"Model::A",""{} +Model:5206656915,"Model::A",""{} +Model:5207043383,"Model::A",""{} +Model:5207285438,"Model::A",""{} +Model:5208291809,"Model::A",""{} +Model:5208570269,"Model::A",""{} +Model:5208723830,"Model::A",""{} +Model:5209175390,"Model::A",""{} +Model:5209655670,"Model::A",""{} +Model:5210519873,"Model::A",""{} +Model:5212314997,"Model::A",""{} +Model:5213259163,"Model::A",""{} +Model:5214339231,"Model::A",""{} +Model:5214875705,"Model::A",""{} +Model:5216517435,"Model::A",""{} +Model:5217047893,"Model::A",""{} +Model:5217951537,"Model::A",""{} +Model:5218587385,"Model::A",""{} +Model:5219784028,"Model::A",""{} +Model:5219796807,"Model::A",""{} +Model:5221726834,"Model::A",""{} +Model:5222034604,"Model::A",""{} +Model:5222065058,"Model::A",""{} +Model:5222745823,"Model::A",""{} +Model:5223369237,"Model::A",""{} +Model:5224102508,"Model::A",""{} +Model:5224460421,"Model::A",""{} +Model:5224760805,"Model::A",""{} +Model:5225303165,"Model::A",""{} +Model:5225366740,"Model::A",""{} +Model:5227046015,"Model::A",""{} +Model:5229168298,"Model::A",""{} +Model:5229186707,"Model::A",""{} +Model:5229428615,"Model::A",""{} +Model:5230130147,"Model::A",""{} +Model:5230693361,"Model::A",""{} +Model:5232775789,"Model::A",""{} +Model:5233971966,"Model::A",""{} +Model:5235151749,"Model::A",""{} +Model:5236333625,"Model::A",""{} +Model:5236546507,"Model::A",""{} +Model:5238800530,"Model::A",""{} +Model:5239110843,"Model::A",""{} +Model:5240134565,"Model::A",""{} +Model:5240954517,"Model::A",""{} +Model:5242014974,"Model::A",""{} +Model:5242742419,"Model::A",""{} +Model:5243621719,"Model::A",""{} +Model:5244843489,"Model::A",""{} +Model:5245148714,"Model::A",""{} +Model:5246590633,"Model::A",""{} +Model:5246708218,"Model::A",""{} +Model:5247618885,"Model::A",""{} +Model:5247694810,"Model::A",""{} +Model:5247755792,"Model::A",""{} +Model:5249149587,"Model::A",""{} +Model:5249193379,"Model::A",""{} +Model:5252978491,"Model::A",""{} +Model:5254009810,"Model::A",""{} +Model:5254066103,"Model::A",""{} +Model:5254344163,"Model::A",""{} +Model:5254661278,"Model::A",""{} +Model:5254780205,"Model::A",""{} +Model:5255308172,"Model::A",""{} +Model:5255416558,"Model::A",""{} +Model:5256787218,"Model::A",""{} +Model:5258445578,"Model::A",""{} +Model:5259269997,"Model::A",""{} +Model:5260415763,"Model::A",""{} +Model:5260955881,"Model::A",""{} +Model:5261249847,"Model::A",""{} +Model:5261315417,"Model::A",""{} +Model:5261319314,"Model::A",""{} +Model:5262151894,"Model::A",""{} +Model:5262698972,"Model::A",""{} +Model:5263563969,"Model::A",""{} +Model:5263936481,"Model::A",""{} +Model:5264898532,"Model::A",""{} +Model:5267134130,"Model::A",""{} +Model:5267537906,"Model::A",""{} +Model:5267886850,"Model::A",""{} +Model:5268037119,"Model::A",""{} +Model:5268807837,"Model::A",""{} +Model:5268818862,"Model::A",""{} +Model:5269318088,"Model::A",""{} +Model:5269550111,"Model::A",""{} +Model:5269830159,"Model::A",""{} +Model:5270003217,"Model::A",""{} +Model:5270266357,"Model::A",""{} +Model:5270868413,"Model::A",""{} +Model:5271119699,"Model::A",""{} +Model:5271235897,"Model::A",""{} +Model:5271554409,"Model::A",""{} +Model:5272137257,"Model::A",""{} +Model:5272220882,"Model::A",""{} +Model:5272350161,"Model::A",""{} +Model:5273834002,"Model::A",""{} +Model:5274407551,"Model::A",""{} +Model:5274816743,"Model::A",""{} +Model:5275272698,"Model::A",""{} +Model:5275869821,"Model::A",""{} +Model:5276018933,"Model::A",""{} +Model:5276748340,"Model::A",""{} +Model:5277582921,"Model::A",""{} +Model:5277904129,"Model::A",""{} +Model:5278082653,"Model::A",""{} +Model:5278448480,"Model::A",""{} +Model:5278836073,"Model::A",""{} +Model:5278885286,"Model::A",""{} +Model:5279607639,"Model::A",""{} +Model:5279702000,"Model::A",""{} +Model:5279717726,"Model::A",""{} +Model:5279948990,"Model::A",""{} +Model:5280023428,"Model::A",""{} +Model:5281179019,"Model::A",""{} +Model:5281470271,"Model::A",""{} +Model:5281588154,"Model::A",""{} +Model:5284034473,"Model::A",""{} +Model:5286027746,"Model::A",""{} +Model:5286413534,"Model::A",""{} +Model:5286951178,"Model::A",""{} +Model:5287190409,"Model::A",""{} +Model:5288152516,"Model::A",""{} +Model:5288782603,"Model::A",""{} +Model:5289087911,"Model::A",""{} +Model:5289328714,"Model::A",""{} +Model:5289392713,"Model::A",""{} +Model:5290056519,"Model::A",""{} +Model:5290187506,"Model::A",""{} +Model:5290245605,"Model::A",""{} +Model:5290424079,"Model::A",""{} +Model:5291971190,"Model::A",""{} +Model:5292736469,"Model::A",""{} +Model:5293837017,"Model::A",""{} +Model:5294077625,"Model::A",""{} +Model:5294502465,"Model::A",""{} +Model:5294542910,"Model::A",""{} +Model:5295000439,"Model::A",""{} +Model:5295139807,"Model::A",""{} +Model:5295694482,"Model::A",""{} +Model:5295740003,"Model::A",""{} +Model:5296244654,"Model::A",""{} +Model:5296262804,"Model::A",""{} +Model:5296308652,"Model::A",""{} +Model:5296321016,"Model::A",""{} +Model:5297171509,"Model::A",""{} +Model:5297465120,"Model::A",""{} +Model:5299888556,"Model::A",""{} +Model:5299998290,"Model::A",""{} +Model:5300678714,"Model::A",""{} +Model:5301310767,"Model::A",""{} +Model:5305958857,"Model::A",""{} +Model:5306143593,"Model::A",""{} +Model:5307479957,"Model::A",""{} +Model:5307904973,"Model::A",""{} +Model:5307929540,"Model::A",""{} +Model:5309581907,"Model::A",""{} +Model:5309824190,"Model::A",""{} +Model:5311105341,"Model::A",""{} +Model:5311435087,"Model::A",""{} +Model:5311530743,"Model::A",""{} +Model:5311566458,"Model::A",""{} +Model:5312382519,"Model::A",""{} +Model:5314545224,"Model::A",""{} +Model:5314838706,"Model::A",""{} +Model:5315247916,"Model::A",""{} +Model:5315729319,"Model::A",""{} +Model:5315763939,"Model::A",""{} +Model:5316083378,"Model::A",""{} +Model:5316360805,"Model::A",""{} +Model:5316423668,"Model::A",""{} +Model:5317793469,"Model::A",""{} +Model:5318275598,"Model::A",""{} +Model:5318531450,"Model::A",""{} +Model:5318615098,"Model::A",""{} +Model:5320088234,"Model::A",""{} +Model:5321600792,"Model::A",""{} +Model:5321680418,"Model::A",""{} +Model:5322157107,"Model::A",""{} +Model:5322223007,"Model::A",""{} +Model:5323128082,"Model::A",""{} +Model:5323176121,"Model::A",""{} +Model:5324651319,"Model::A",""{} +Model:5324759962,"Model::A",""{} +Model:5325304635,"Model::A",""{} +Model:5326247636,"Model::A",""{} +Model:5327667534,"Model::A",""{} +Model:5327674161,"Model::A",""{} +Model:5328005365,"Model::A",""{} +Model:5328228632,"Model::A",""{} +Model:5330234349,"Model::A",""{} +Model:5330350235,"Model::A",""{} +Model:5331114789,"Model::A",""{} +Model:5331221615,"Model::A",""{} +Model:5331295237,"Model::A",""{} +Model:5331296529,"Model::A",""{} +Model:5331305766,"Model::A",""{} +Model:5331306853,"Model::A",""{} +Model:5331578285,"Model::A",""{} +Model:5332653801,"Model::A",""{} +Model:5335640129,"Model::A",""{} +Model:5335897461,"Model::A",""{} +Model:5336412009,"Model::A",""{} +Model:5336522558,"Model::A",""{} +Model:5337616053,"Model::A",""{} +Model:5337847946,"Model::A",""{} +Model:5338596532,"Model::A",""{} +Model:5338867179,"Model::A",""{} +Model:5340423155,"Model::A",""{} +Model:5340624917,"Model::A",""{} +Model:5341544449,"Model::A",""{} +Model:5342661010,"Model::A",""{} +Model:5343032789,"Model::A",""{} +Model:5343730843,"Model::A",""{} +Model:5345654953,"Model::A",""{} +Model:5346234164,"Model::A",""{} +Model:5346785300,"Model::A",""{} +Model:5346848925,"Model::A",""{} +Model:5346957872,"Model::A",""{} +Model:5347241048,"Model::A",""{} +Model:5347640001,"Model::A",""{} +Model:5347982151,"Model::A",""{} +Model:5348354419,"Model::A",""{} +Model:5348870548,"Model::A",""{} +Model:5349844280,"Model::A",""{} +Model:5351070103,"Model::A",""{} +Model:5351155196,"Model::A",""{} +Model:5353011131,"Model::A",""{} +Model:5354717017,"Model::A",""{} +Model:5354884715,"Model::A",""{} +Model:5355535285,"Model::A",""{} +Model:5355628297,"Model::A",""{} +Model:5356979901,"Model::A",""{} +Model:5357233762,"Model::A",""{} +Model:5360519098,"Model::A",""{} +Model:5360571464,"Model::A",""{} +Model:5361044009,"Model::A",""{} +Model:5361159901,"Model::A",""{} +Model:5362504156,"Model::A",""{} +Model:5362997882,"Model::A",""{} +Model:5363613745,"Model::A",""{} +Model:5364307209,"Model::A",""{} +Model:5364534513,"Model::A",""{} +Model:5364818756,"Model::A",""{} +Model:5368783274,"Model::A",""{} +Model:5368957591,"Model::A",""{} +Model:5372050651,"Model::A",""{} +Model:5372086313,"Model::A",""{} +Model:5372395430,"Model::A",""{} +Model:5373299817,"Model::A",""{} +Model:5373916040,"Model::A",""{} +Model:5374065994,"Model::A",""{} +Model:5374740043,"Model::A",""{} +Model:5375524450,"Model::A",""{} +Model:5375767994,"Model::A",""{} +Model:5375971286,"Model::A",""{} +Model:5376948967,"Model::A",""{} +Model:5377120471,"Model::A",""{} +Model:5377151714,"Model::A",""{} +Model:5377575898,"Model::A",""{} +Model:5377675806,"Model::A",""{} +Model:5378057727,"Model::A",""{} +Model:5378164653,"Model::A",""{} +Model:5379381598,"Model::A",""{} +Model:5379556186,"Model::A",""{} +Model:5380771561,"Model::A",""{} +Model:5380908123,"Model::A",""{} +Model:5381106399,"Model::A",""{} +Model:5381222989,"Model::A",""{} +Model:5381723528,"Model::A",""{} +Model:5381822561,"Model::A",""{} +Model:5381903019,"Model::A",""{} +Model:5382192915,"Model::A",""{} +Model:5382905841,"Model::A",""{} +Model:5383100428,"Model::A",""{} +Model:5383521858,"Model::A",""{} +Model:5383571994,"Model::A",""{} +Model:5384041723,"Model::A",""{} +Model:5384383515,"Model::A",""{} +Model:5384402001,"Model::A",""{} +Model:5384414445,"Model::A",""{} +Model:5384665837,"Model::A",""{} +Model:5385819130,"Model::A",""{} +Model:5386209220,"Model::A",""{} +Model:5386234435,"Model::A",""{} +Model:5386242863,"Model::A",""{} +Model:5386263634,"Model::A",""{} +Model:5386513454,"Model::A",""{} +Model:5387171471,"Model::A",""{} +Model:5387262723,"Model::A",""{} +Model:5387540962,"Model::A",""{} +Model:5387804038,"Model::A",""{} +Model:5387973422,"Model::A",""{} +Model:5388152969,"Model::A",""{} +Model:5388190330,"Model::A",""{} +Model:5388224881,"Model::A",""{} +Model:5388796399,"Model::A",""{} +Model:5389118199,"Model::A",""{} +Model:5391848694,"Model::A",""{} +Model:5392392866,"Model::A",""{} +Model:5393115967,"Model::A",""{} +Model:5393333816,"Model::A",""{} +Model:5393640715,"Model::A",""{} +Model:5393679386,"Model::A",""{} +Model:5393735237,"Model::A",""{} +Model:5397166578,"Model::A",""{} +Model:5397840201,"Model::A",""{} +Model:5398339539,"Model::A",""{} +Model:5398793794,"Model::A",""{} +Model:5399162350,"Model::A",""{} +Model:5399581999,"Model::A",""{} +Model:5399815790,"Model::A",""{} +Model:5400073851,"Model::A",""{} +Model:5400880953,"Model::A",""{} +Model:5401707272,"Model::A",""{} +Model:5403531414,"Model::A",""{} +Model:5404486739,"Model::A",""{} +Model:5405256266,"Model::A",""{} +Model:5406274402,"Model::A",""{} +Model:5406401337,"Model::A",""{} +Model:5406512278,"Model::A",""{} +Model:5406870153,"Model::A",""{} +Model:5407478106,"Model::A",""{} +Model:5408443906,"Model::A",""{} +Model:5408498639,"Model::A",""{} +Model:5408761711,"Model::A",""{} +Model:5409077763,"Model::A",""{} +Model:5409303278,"Model::A",""{} +Model:5409467325,"Model::A",""{} +Model:5410087789,"Model::A",""{} +Model:5410672615,"Model::A",""{} +Model:5410843398,"Model::A",""{} +Model:5410963493,"Model::A",""{} +Model:5411874851,"Model::A",""{} +Model:5413749793,"Model::A",""{} +Model:5414839923,"Model::A",""{} +Model:5415861751,"Model::A",""{} +Model:5416805027,"Model::A",""{} +Model:5416945973,"Model::A",""{} +Model:5417278772,"Model::A",""{} +Model:5417559311,"Model::A",""{} +Model:5418129165,"Model::A",""{} +Model:5418384443,"Model::A",""{} +Model:5418565803,"Model::A",""{} +Model:5419308632,"Model::A",""{} +Model:5419508370,"Model::A",""{} +Model:5421079421,"Model::A",""{} +Model:5421681329,"Model::A",""{} +Model:5421694559,"Model::A",""{} +Model:5422405509,"Model::A",""{} +Model:5422910144,"Model::A",""{} +Model:5423166593,"Model::A",""{} +Model:5423438977,"Model::A",""{} +Model:5424329937,"Model::A",""{} +Model:5425047998,"Model::A",""{} +Model:5425209642,"Model::A",""{} +Model:5426880913,"Model::A",""{} +Model:5428147473,"Model::A",""{} +Model:5429689710,"Model::A",""{} +Model:5429741275,"Model::A",""{} +Model:5430025505,"Model::A",""{} +Model:5431871715,"Model::A",""{} +Model:5432473594,"Model::A",""{} +Model:5432554817,"Model::A",""{} +Model:5432664020,"Model::A",""{} +Model:5433726802,"Model::A",""{} +Model:5434018765,"Model::A",""{} +Model:5434754291,"Model::A",""{} +Model:5437773766,"Model::A",""{} +Model:5438195264,"Model::A",""{} +Model:5438596820,"Model::A",""{} +Model:5439114375,"Model::A",""{} +Model:5440611223,"Model::A",""{} +Model:5441116497,"Model::A",""{} +Model:5442356229,"Model::A",""{} +Model:5444513385,"Model::A",""{} +Model:5444517307,"Model::A",""{} +Model:5444906334,"Model::A",""{} +Model:5445148770,"Model::A",""{} +Model:5446561567,"Model::A",""{} +Model:5447122350,"Model::A",""{} +Model:5448376483,"Model::A",""{} +Model:5448415717,"Model::A",""{} +Model:5449121734,"Model::A",""{} +Model:5449551069,"Model::A",""{} +Model:5450521947,"Model::A",""{} +Model:5450936131,"Model::A",""{} +Model:5451133172,"Model::A",""{} +Model:5451604537,"Model::A",""{} +Model:5452068987,"Model::A",""{} +Model:5452239371,"Model::A",""{} +Model:5452585759,"Model::A",""{} +Model:5453357650,"Model::A",""{} +Model:5455644339,"Model::A",""{} +Model:5455931768,"Model::A",""{} +Model:5457022190,"Model::A",""{} +Model:5457115022,"Model::A",""{} +Model:5458271229,"Model::A",""{} +Model:5458395382,"Model::A",""{} +Model:5458410585,"Model::A",""{} +Model:5459006989,"Model::A",""{} +Model:5460797965,"Model::A",""{} +Model:5460879417,"Model::A",""{} +Model:5461389993,"Model::A",""{} +Model:5461489135,"Model::A",""{} +Model:5461966769,"Model::A",""{} +Model:5462198085,"Model::A",""{} +Model:5462320434,"Model::A",""{} +Model:5462426010,"Model::A",""{} +Model:5462480798,"Model::A",""{} +Model:5463186093,"Model::A",""{} +Model:5463908164,"Model::A",""{} +Model:5466631981,"Model::A",""{} +Model:5466721586,"Model::A",""{} +Model:5468146228,"Model::A",""{} +Model:5468564649,"Model::A",""{} +Model:5468975653,"Model::A",""{} +Model:5469939083,"Model::A",""{} +Model:5469957775,"Model::A",""{} +Model:5470175398,"Model::A",""{} +Model:5473290227,"Model::A",""{} +Model:5474985506,"Model::A",""{} +Model:5475627338,"Model::A",""{} +Model:5475859563,"Model::A",""{} +Model:5476264870,"Model::A",""{} +Model:5476561820,"Model::A",""{} +Model:5479139483,"Model::A",""{} +Model:5479719077,"Model::A",""{} +Model:5480135071,"Model::A",""{} +Model:5480659866,"Model::A",""{} +Model:5481020397,"Model::A",""{} +Model:5481224264,"Model::A",""{} +Model:5481959787,"Model::A",""{} +Model:5482664095,"Model::A",""{} +Model:5482765393,"Model::A",""{} +Model:5483470919,"Model::A",""{} +Model:5483626582,"Model::A",""{} +Model:5484535758,"Model::A",""{} +Model:5485348842,"Model::A",""{} +Model:5486589285,"Model::A",""{} +Model:5487044192,"Model::A",""{} +Model:5487531846,"Model::A",""{} +Model:5487973714,"Model::A",""{} +Model:5489305294,"Model::A",""{} +Model:5489483094,"Model::A",""{} +Model:5489819267,"Model::A",""{} +Model:5489834360,"Model::A",""{} +Model:5491054066,"Model::A",""{} +Model:5491177366,"Model::A",""{} +Model:5491748103,"Model::A",""{} +Model:5492014319,"Model::A",""{} +Model:5492570119,"Model::A",""{} +Model:5492779136,"Model::A",""{} +Model:5493571378,"Model::A",""{} +Model:5493749274,"Model::A",""{} +Model:5494059191,"Model::A",""{} +Model:5494596331,"Model::A",""{} +Model:5494693863,"Model::A",""{} +Model:5495027266,"Model::A",""{} +Model:5495242019,"Model::A",""{} +Model:5495325532,"Model::A",""{} +Model:5497019329,"Model::A",""{} +Model:5497544881,"Model::A",""{} +Model:5498289369,"Model::A",""{} +Model:5499010842,"Model::A",""{} +Model:5499366786,"Model::A",""{} +Model:5499375899,"Model::A",""{} +Model:5499433865,"Model::A",""{} +Model:5499912772,"Model::A",""{} +Model:5500114821,"Model::A",""{} +Model:5500316421,"Model::A",""{} +Model:5500896762,"Model::A",""{} +Model:5501190416,"Model::A",""{} +Model:5502246097,"Model::A",""{} +Model:5502504271,"Model::A",""{} +Model:5502596570,"Model::A",""{} +Model:5502666364,"Model::A",""{} +Model:5502674365,"Model::A",""{} +Model:5502974989,"Model::A",""{} +Model:5504831893,"Model::A",""{} +Model:5505139162,"Model::A",""{} +Model:5505296823,"Model::A",""{} +Model:5505798045,"Model::A",""{} +Model:5507802541,"Model::A",""{} +Model:5507852874,"Model::A",""{} +Model:5507991987,"Model::A",""{} +Model:5508452650,"Model::A",""{} +Model:5508900510,"Model::A",""{} +Model:5509325027,"Model::A",""{} +Model:5510622515,"Model::A",""{} +Model:5510853605,"Model::A",""{} +Model:5511042812,"Model::A",""{} +Model:5511246599,"Model::A",""{} +Model:5511599306,"Model::A",""{} +Model:5512191859,"Model::A",""{} +Model:5512252478,"Model::A",""{} +Model:5512264455,"Model::A",""{} +Model:5512487349,"Model::A",""{} +Model:5513474173,"Model::A",""{} +Model:5514905494,"Model::A",""{} +Model:5515930989,"Model::A",""{} +Model:5517323287,"Model::A",""{} +Model:5518072337,"Model::A",""{} +Model:5518669646,"Model::A",""{} +Model:5519927013,"Model::A",""{} +Model:5520435781,"Model::A",""{} +Model:5520738687,"Model::A",""{} +Model:5520787758,"Model::A",""{} +Model:5521080920,"Model::A",""{} +Model:5521493204,"Model::A",""{} +Model:5521929302,"Model::A",""{} +Model:5523390965,"Model::A",""{} +Model:5523408229,"Model::A",""{} +Model:5524322747,"Model::A",""{} +Model:5527066964,"Model::A",""{} +Model:5527210782,"Model::A",""{} +Model:5527830613,"Model::A",""{} +Model:5528233761,"Model::A",""{} +Model:5529483535,"Model::A",""{} +Model:5529741174,"Model::A",""{} +Model:5531280330,"Model::A",""{} +Model:5532914408,"Model::A",""{} +Model:5532964578,"Model::A",""{} +Model:5535372310,"Model::A",""{} +Model:5535571641,"Model::A",""{} +Model:5536274721,"Model::A",""{} +Model:5536415225,"Model::A",""{} +Model:5536614251,"Model::A",""{} +Model:5537188727,"Model::A",""{} +Model:5538029285,"Model::A",""{} +Model:5539022046,"Model::A",""{} +Model:5539210907,"Model::A",""{} +Model:5540048869,"Model::A",""{} +Model:5540204503,"Model::A",""{} +Model:5540253894,"Model::A",""{} +Model:5540325194,"Model::A",""{} +Model:5540523902,"Model::A",""{} +Model:5541318710,"Model::A",""{} +Model:5542873305,"Model::A",""{} +Model:5543286327,"Model::A",""{} +Model:5543305373,"Model::A",""{} +Model:5543375513,"Model::A",""{} +Model:5544809742,"Model::A",""{} +Model:5547201749,"Model::A",""{} +Model:5548455641,"Model::A",""{} +Model:5548745677,"Model::A",""{} +Model:5549462120,"Model::A",""{} +Model:5550589209,"Model::A",""{} +Model:5551027649,"Model::A",""{} +Model:5552570125,"Model::A",""{} +Model:5553455563,"Model::A",""{} +Model:5555726891,"Model::A",""{} +Model:5556434260,"Model::A",""{} +Model:5556843511,"Model::A",""{} +Model:5557336926,"Model::A",""{} +Model:5557387340,"Model::A",""{} +Model:5559260845,"Model::A",""{} +Model:5559339397,"Model::A",""{} +Model:5560390314,"Model::A",""{} +Model:5560656306,"Model::A",""{} +Model:5560755615,"Model::A",""{} +Model:5561325578,"Model::A",""{} +Model:5562333519,"Model::A",""{} +Model:5562792014,"Model::A",""{} +Model:5563436284,"Model::A",""{} +Model:5563666997,"Model::A",""{} +Model:5564569448,"Model::A",""{} +Model:5565090622,"Model::A",""{} +Model:5565120023,"Model::A",""{} +Model:5565925751,"Model::A",""{} +Model:5566051492,"Model::A",""{} +Model:5566741239,"Model::A",""{} +Model:5567688818,"Model::A",""{} +Model:5567800208,"Model::A",""{} +Model:5568598089,"Model::A",""{} +Model:5568611816,"Model::A",""{} +Model:5569207051,"Model::A",""{} +Model:5569503929,"Model::A",""{} +Model:5569724009,"Model::A",""{} +Model:5569877914,"Model::A",""{} +Model:5570093907,"Model::A",""{} +Model:5570229248,"Model::A",""{} +Model:5571395522,"Model::A",""{} +Model:5571573489,"Model::A",""{} +Model:5572445854,"Model::A",""{} +Model:5573635165,"Model::A",""{} +Model:5573842671,"Model::A",""{} +Model:5574624365,"Model::A",""{} +Model:5574814141,"Model::A",""{} +Model:5577338106,"Model::A",""{} +Model:5579559081,"Model::A",""{} +Model:5579860797,"Model::A",""{} +Model:5580401217,"Model::A",""{} +Model:5580724101,"Model::A",""{} +Model:5581216789,"Model::A",""{} +Model:5582065016,"Model::A",""{} +Model:5582599997,"Model::A",""{} +Model:5584225894,"Model::A",""{} +Model:5584239284,"Model::A",""{} +Model:5584530662,"Model::A",""{} +Model:5585624529,"Model::A",""{} +Model:5585782361,"Model::A",""{} +Model:5586993591,"Model::A",""{} +Model:5587446931,"Model::A",""{} +Model:5587606333,"Model::A",""{} +Model:5587622003,"Model::A",""{} +Model:5587857105,"Model::A",""{} +Model:5589134264,"Model::A",""{} +Model:5590145624,"Model::A",""{} +Model:5591357125,"Model::A",""{} +Model:5591902709,"Model::A",""{} +Model:5593164067,"Model::A",""{} +Model:5593407713,"Model::A",""{} +Model:5595279281,"Model::A",""{} +Model:5595407519,"Model::A",""{} +Model:5595415562,"Model::A",""{} +Model:5595525458,"Model::A",""{} +Model:5596086652,"Model::A",""{} +Model:5596326953,"Model::A",""{} +Model:5596415879,"Model::A",""{} +Model:5597440449,"Model::A",""{} +Model:5597900954,"Model::A",""{} +Model:5598859021,"Model::A",""{} +Model:5599267461,"Model::A",""{} +Model:5599818766,"Model::A",""{} +Model:5600334573,"Model::A",""{} +Model:5601411100,"Model::A",""{} +Model:5602045978,"Model::A",""{} +Model:5602690738,"Model::A",""{} +Model:5603231183,"Model::A",""{} +Model:5603321034,"Model::A",""{} +Model:5603492589,"Model::A",""{} +Model:5603569225,"Model::A",""{} +Model:5603651377,"Model::A",""{} +Model:5603883374,"Model::A",""{} +Model:5604157243,"Model::A",""{} +Model:5604676588,"Model::A",""{} +Model:5604752251,"Model::A",""{} +Model:5604875629,"Model::A",""{} +Model:5605365059,"Model::A",""{} +Model:5606112429,"Model::A",""{} +Model:5606901199,"Model::A",""{} +Model:5607711453,"Model::A",""{} +Model:5607883377,"Model::A",""{} +Model:5608176632,"Model::A",""{} +Model:5608910413,"Model::A",""{} +Model:5608938507,"Model::A",""{} +Model:5609140688,"Model::A",""{} +Model:5609489384,"Model::A",""{} +Model:5610115850,"Model::A",""{} +Model:5610873698,"Model::A",""{} +Model:5612191736,"Model::A",""{} +Model:5612632717,"Model::A",""{} +Model:5615814830,"Model::A",""{} +Model:5616014518,"Model::A",""{} +Model:5616616711,"Model::A",""{} +Model:5616910181,"Model::A",""{} +Model:5617834875,"Model::A",""{} +Model:5618525135,"Model::A",""{} +Model:5618618068,"Model::A",""{} +Model:5618975538,"Model::A",""{} +Model:5619375045,"Model::A",""{} +Model:5620256501,"Model::A",""{} +Model:5620659866,"Model::A",""{} +Model:5620782403,"Model::A",""{} +Model:5621202893,"Model::A",""{} +Model:5621231563,"Model::A",""{} +Model:5621293253,"Model::A",""{} +Model:5621303588,"Model::A",""{} +Model:5623622677,"Model::A",""{} +Model:5624836754,"Model::A",""{} +Model:5625113319,"Model::A",""{} +Model:5625195450,"Model::A",""{} +Model:5625562023,"Model::A",""{} +Model:5625988306,"Model::A",""{} +Model:5626156185,"Model::A",""{} +Model:5626299777,"Model::A",""{} +Model:5627047062,"Model::A",""{} +Model:5627681966,"Model::A",""{} +Model:5627824394,"Model::A",""{} +Model:5628270326,"Model::A",""{} +Model:5628374283,"Model::A",""{} +Model:5628534483,"Model::A",""{} +Model:5629622630,"Model::A",""{} +Model:5629863878,"Model::A",""{} +Model:5630240701,"Model::A",""{} +Model:5630414915,"Model::A",""{} +Model:5630938186,"Model::A",""{} +Model:5631689585,"Model::A",""{} +Model:5632027505,"Model::A",""{} +Model:5632675701,"Model::A",""{} +Model:5632882981,"Model::A",""{} +Model:5633586681,"Model::A",""{} +Model:5633622570,"Model::A",""{} +Model:5635616756,"Model::A",""{} +Model:5636244711,"Model::A",""{} +Model:5636765002,"Model::A",""{} +Model:5636786118,"Model::A",""{} +Model:5637052414,"Model::A",""{} +Model:5637397739,"Model::A",""{} +Model:5638098823,"Model::A",""{} +Model:5639575910,"Model::A",""{} +Model:5640162383,"Model::A",""{} +Model:5640913663,"Model::A",""{} +Model:5641330655,"Model::A",""{} +Model:5643130189,"Model::A",""{} +Model:5643673897,"Model::A",""{} +Model:5644549653,"Model::A",""{} +Model:5644892573,"Model::A",""{} +Model:5644962890,"Model::A",""{} +Model:5645354386,"Model::A",""{} +Model:5645693504,"Model::A",""{} +Model:5645802097,"Model::A",""{} +Model:5645909294,"Model::A",""{} +Model:5646102347,"Model::A",""{} +Model:5646122739,"Model::A",""{} +Model:5646302798,"Model::A",""{} +Model:5647667062,"Model::A",""{} +Model:5647803316,"Model::A",""{} +Model:5647810598,"Model::A",""{} +Model:5648456485,"Model::A",""{} +Model:5648657969,"Model::A",""{} +Model:5648898045,"Model::A",""{} +Model:5651439922,"Model::A",""{} +Model:5652330674,"Model::A",""{} +Model:5652630416,"Model::A",""{} +Model:5652974926,"Model::A",""{} +Model:5653031078,"Model::A",""{} +Model:5653324497,"Model::A",""{} +Model:5654550925,"Model::A",""{} +Model:5655156297,"Model::A",""{} +Model:5655477961,"Model::A",""{} +Model:5655550732,"Model::A",""{} +Model:5655625915,"Model::A",""{} +Model:5655643550,"Model::A",""{} +Model:5656339125,"Model::A",""{} +Model:5657606480,"Model::A",""{} +Model:5659545093,"Model::A",""{} +Model:5660735455,"Model::A",""{} +Model:5660837853,"Model::A",""{} +Model:5661283073,"Model::A",""{} +Model:5661376940,"Model::A",""{} +Model:5662209795,"Model::A",""{} +Model:5664029252,"Model::A",""{} +Model:5664787676,"Model::A",""{} +Model:5665171394,"Model::A",""{} +Model:5665261786,"Model::A",""{} +Model:5665914742,"Model::A",""{} +Model:5666535964,"Model::A",""{} +Model:5667810974,"Model::A",""{} +Model:5668205487,"Model::A",""{} +Model:5668407083,"Model::A",""{} +Model:5668785927,"Model::A",""{} +Model:5669599277,"Model::A",""{} +Model:5670444309,"Model::A",""{} +Model:5670610388,"Model::A",""{} +Model:5670853042,"Model::A",""{} +Model:5671359434,"Model::A",""{} +Model:5672099902,"Model::A",""{} +Model:5672416688,"Model::A",""{} +Model:5673815930,"Model::A",""{} +Model:5674382013,"Model::A",""{} +Model:5674430159,"Model::A",""{} +Model:5674953356,"Model::A",""{} +Model:5674956878,"Model::A",""{} +Model:5675038166,"Model::A",""{} +Model:5675897367,"Model::A",""{} +Model:5676087022,"Model::A",""{} +Model:5677488378,"Model::A",""{} +Model:5677733355,"Model::A",""{} +Model:5677774487,"Model::A",""{} +Model:5677908100,"Model::A",""{} +Model:5677934877,"Model::A",""{} +Model:5677975311,"Model::A",""{} +Model:5678994119,"Model::A",""{} +Model:5680885383,"Model::A",""{} +Model:5681254563,"Model::A",""{} +Model:5682467601,"Model::A",""{} +Model:5683509357,"Model::A",""{} +Model:5684531155,"Model::A",""{} +Model:5684944295,"Model::A",""{} +Model:5685078262,"Model::A",""{} +Model:5685093253,"Model::A",""{} +Model:5685844726,"Model::A",""{} +Model:5686072828,"Model::A",""{} +Model:5686765877,"Model::A",""{} +Model:5687313229,"Model::A",""{} +Model:5689067516,"Model::A",""{} +Model:5689587311,"Model::A",""{} +Model:5690464407,"Model::A",""{} +Model:5691507395,"Model::A",""{} +Model:5691576757,"Model::A",""{} +Model:5691951462,"Model::A",""{} +Model:5692479954,"Model::A",""{} +Model:5692589540,"Model::A",""{} +Model:5694479345,"Model::A",""{} +Model:5694523117,"Model::A",""{} +Model:5695134939,"Model::A",""{} +Model:5695295365,"Model::A",""{} +Model:5696594445,"Model::A",""{} +Model:5696625885,"Model::A",""{} +Model:5697745042,"Model::A",""{} +Model:5698784525,"Model::A",""{} +Model:5698794056,"Model::A",""{} +Model:5699047018,"Model::A",""{} +Model:5700096027,"Model::A",""{} +Model:5700669995,"Model::A",""{} +Model:5700829355,"Model::A",""{} +Model:5701512020,"Model::A",""{} +Model:5702104091,"Model::A",""{} +Model:5702310510,"Model::A",""{} +Model:5702560218,"Model::A",""{} +Model:5702905029,"Model::A",""{} +Model:5703191202,"Model::A",""{} +Model:5705668563,"Model::A",""{} +Model:5707194758,"Model::A",""{} +Model:5707650087,"Model::A",""{} +Model:5707677257,"Model::A",""{} +Model:5708071923,"Model::A",""{} +Model:5709466722,"Model::A",""{} +Model:5710481285,"Model::A",""{} +Model:5710753311,"Model::A",""{} +Model:5710784766,"Model::A",""{} +Model:5712010289,"Model::A",""{} +Model:5712045202,"Model::A",""{} +Model:5712358665,"Model::A",""{} +Model:5712449539,"Model::A",""{} +Model:5712669335,"Model::A",""{} +Model:5712976444,"Model::A",""{} +Model:5713145062,"Model::A",""{} +Model:5713432351,"Model::A",""{} +Model:5713958957,"Model::A",""{} +Model:5714119238,"Model::A",""{} +Model:5714740735,"Model::A",""{} +Model:5714901870,"Model::A",""{} +Model:5715098467,"Model::A",""{} +Model:5715842846,"Model::A",""{} +Model:5716822514,"Model::A",""{} +Model:5717599274,"Model::A",""{} +Model:5718103664,"Model::A",""{} +Model:5718317572,"Model::A",""{} +Model:5718353361,"Model::A",""{} +Model:5719557010,"Model::A",""{} +Model:5719669453,"Model::A",""{} +Model:5719714571,"Model::A",""{} +Model:5719984765,"Model::A",""{} +Model:5720001452,"Model::A",""{} +Model:5720284999,"Model::A",""{} +Model:5720332566,"Model::A",""{} +Model:5720567524,"Model::A",""{} +Model:5722090230,"Model::A",""{} +Model:5722128893,"Model::A",""{} +Model:5722591712,"Model::A",""{} +Model:5722591947,"Model::A",""{} +Model:5723251765,"Model::A",""{} +Model:5723727565,"Model::A",""{} +Model:5724090305,"Model::A",""{} +Model:5724592529,"Model::A",""{} +Model:5726857037,"Model::A",""{} +Model:5727451034,"Model::A",""{} +Model:5727945283,"Model::A",""{} +Model:5728437631,"Model::A",""{} +Model:5728552126,"Model::A",""{} +Model:5728764933,"Model::A",""{} +Model:5728965920,"Model::A",""{} +Model:5729816300,"Model::A",""{} +Model:5730089601,"Model::A",""{} +Model:5730333113,"Model::A",""{} +Model:5730365554,"Model::A",""{} +Model:5730395561,"Model::A",""{} +Model:5732242497,"Model::A",""{} +Model:5732900837,"Model::A",""{} +Model:5733329576,"Model::A",""{} +Model:5733349170,"Model::A",""{} +Model:5733473227,"Model::A",""{} +Model:5734281107,"Model::A",""{} +Model:5735396876,"Model::A",""{} +Model:5736049945,"Model::A",""{} +Model:5736348947,"Model::A",""{} +Model:5736366225,"Model::A",""{} +Model:5737052375,"Model::A",""{} +Model:5738760494,"Model::A",""{} +Model:5738959820,"Model::A",""{} +Model:5738961246,"Model::A",""{} +Model:5739898083,"Model::A",""{} +Model:5739993645,"Model::A",""{} +Model:5740372501,"Model::A",""{} +Model:5740645547,"Model::A",""{} +Model:5740713724,"Model::A",""{} +Model:5740822503,"Model::A",""{} +Model:5741336738,"Model::A",""{} +Model:5741438967,"Model::A",""{} +Model:5741456743,"Model::A",""{} +Model:5741517802,"Model::A",""{} +Model:5741764130,"Model::A",""{} +Model:5741836561,"Model::A",""{} +Model:5742455389,"Model::A",""{} +Model:5743186549,"Model::A",""{} +Model:5743567537,"Model::A",""{} +Model:5743960902,"Model::A",""{} +Model:5744001539,"Model::A",""{} +Model:5744017865,"Model::A",""{} +Model:5744084552,"Model::A",""{} +Model:5744582230,"Model::A",""{} +Model:5745934856,"Model::A",""{} +Model:5746978906,"Model::A",""{} +Model:5747164001,"Model::A",""{} +Model:5747423890,"Model::A",""{} +Model:5748275437,"Model::A",""{} +Model:5749499755,"Model::A",""{} +Model:5749898180,"Model::A",""{} +Model:5750091310,"Model::A",""{} +Model:5750303146,"Model::A",""{} +Model:5751104378,"Model::A",""{} +Model:5751902867,"Model::A",""{} +Model:5754027986,"Model::A",""{} +Model:5754503613,"Model::A",""{} +Model:5754841165,"Model::A",""{} +Model:5755963345,"Model::A",""{} +Model:5756935641,"Model::A",""{} +Model:5757062783,"Model::A",""{} +Model:5758442380,"Model::A",""{} +Model:5759437918,"Model::A",""{} +Model:5760762947,"Model::A",""{} +Model:5761015753,"Model::A",""{} +Model:5762592998,"Model::A",""{} +Model:5765144001,"Model::A",""{} +Model:5765987914,"Model::A",""{} +Model:5766885499,"Model::A",""{} +Model:5766965867,"Model::A",""{} +Model:5767663972,"Model::A",""{} +Model:5768285857,"Model::A",""{} +Model:5769195670,"Model::A",""{} +Model:5770025203,"Model::A",""{} +Model:5770306527,"Model::A",""{} +Model:5772044135,"Model::A",""{} +Model:5772515138,"Model::A",""{} +Model:5773131970,"Model::A",""{} +Model:5774655095,"Model::A",""{} +Model:5775181287,"Model::A",""{} +Model:5775869287,"Model::A",""{} +Model:5776962051,"Model::A",""{} +Model:5777793125,"Model::A",""{} +Model:5777829151,"Model::A",""{} +Model:5778093885,"Model::A",""{} +Model:5778826636,"Model::A",""{} +Model:5779019359,"Model::A",""{} +Model:5779650935,"Model::A",""{} +Model:5779805119,"Model::A",""{} +Model:5780897552,"Model::A",""{} +Model:5781889854,"Model::A",""{} +Model:5782561343,"Model::A",""{} +Model:5782818183,"Model::A",""{} +Model:5784637010,"Model::A",""{} +Model:5785057386,"Model::A",""{} +Model:5785597009,"Model::A",""{} +Model:5785883509,"Model::A",""{} +Model:5787457019,"Model::A",""{} +Model:5787496006,"Model::A",""{} +Model:5787703553,"Model::A",""{} +Model:5787905518,"Model::A",""{} +Model:5789147793,"Model::A",""{} +Model:5789258750,"Model::A",""{} +Model:5789410526,"Model::A",""{} +Model:5790343733,"Model::A",""{} +Model:5792141885,"Model::A",""{} +Model:5792194766,"Model::A",""{} +Model:5793745030,"Model::A",""{} +Model:5793993563,"Model::A",""{} +Model:5794226468,"Model::A",""{} +Model:5796326009,"Model::A",""{} +Model:5796347668,"Model::A",""{} +Model:5796526673,"Model::A",""{} +Model:5796738223,"Model::A",""{} +Model:5796968910,"Model::A",""{} +Model:5797486338,"Model::A",""{} +Model:5797835029,"Model::A",""{} +Model:5798013404,"Model::A",""{} +Model:5799385269,"Model::A",""{} +Model:5799424388,"Model::A",""{} +Model:5799443422,"Model::A",""{} +Model:5799730769,"Model::A",""{} +Model:5799900250,"Model::A",""{} +Model:5801352201,"Model::A",""{} +Model:5803164179,"Model::A",""{} +Model:5803180155,"Model::A",""{} +Model:5804123971,"Model::A",""{} +Model:5804590193,"Model::A",""{} +Model:5805909743,"Model::A",""{} +Model:5806021743,"Model::A",""{} +Model:5807195109,"Model::A",""{} +Model:5807612965,"Model::A",""{} +Model:5807957162,"Model::A",""{} +Model:5808423397,"Model::A",""{} +Model:5808593350,"Model::A",""{} +Model:5809163487,"Model::A",""{} +Model:5809656710,"Model::A",""{} +Model:5809669780,"Model::A",""{} +Model:5809829399,"Model::A",""{} +Model:5809904651,"Model::A",""{} +Model:5812002807,"Model::A",""{} +Model:5812207494,"Model::A",""{} +Model:5812665422,"Model::A",""{} +Model:5812835597,"Model::A",""{} +Model:5813336403,"Model::A",""{} +Model:5813533520,"Model::A",""{} +Model:5813702587,"Model::A",""{} +Model:5814423082,"Model::A",""{} +Model:5814730473,"Model::A",""{} +Model:5815042645,"Model::A",""{} +Model:5815493886,"Model::A",""{} +Model:5816532806,"Model::A",""{} +Model:5816802188,"Model::A",""{} +Model:5817309919,"Model::A",""{} +Model:5818699986,"Model::A",""{} +Model:5819799471,"Model::A",""{} +Model:5820180109,"Model::A",""{} +Model:5820788847,"Model::A",""{} +Model:5821256876,"Model::A",""{} +Model:5821300011,"Model::A",""{} +Model:5821765889,"Model::A",""{} +Model:5822803531,"Model::A",""{} +Model:5822890691,"Model::A",""{} +Model:5823425190,"Model::A",""{} +Model:5823557619,"Model::A",""{} +Model:5823864543,"Model::A",""{} +Model:5823911773,"Model::A",""{} +Model:5825009278,"Model::A",""{} +Model:5825227679,"Model::A",""{} +Model:5825970134,"Model::A",""{} +Model:5826791501,"Model::A",""{} +Model:5827070636,"Model::A",""{} +Model:5827257212,"Model::A",""{} +Model:5827601551,"Model::A",""{} +Model:5827786169,"Model::A",""{} +Model:5828132233,"Model::A",""{} +Model:5829170793,"Model::A",""{} +Model:5829273355,"Model::A",""{} +Model:5831052290,"Model::A",""{} +Model:5831073663,"Model::A",""{} +Model:5831109669,"Model::A",""{} +Model:5831294135,"Model::A",""{} +Model:5831339987,"Model::A",""{} +Model:5831584585,"Model::A",""{} +Model:5832023648,"Model::A",""{} +Model:5832331198,"Model::A",""{} +Model:5832337487,"Model::A",""{} +Model:5833115825,"Model::A",""{} +Model:5834101575,"Model::A",""{} +Model:5834574639,"Model::A",""{} +Model:5837057300,"Model::A",""{} +Model:5837828363,"Model::A",""{} +Model:5838166717,"Model::A",""{} +Model:5838324521,"Model::A",""{} +Model:5839123025,"Model::A",""{} +Model:5839643726,"Model::A",""{} +Model:5839676761,"Model::A",""{} +Model:5840116474,"Model::A",""{} +Model:5841009299,"Model::A",""{} +Model:5842426699,"Model::A",""{} +Model:5843184754,"Model::A",""{} +Model:5843934323,"Model::A",""{} +Model:5844548790,"Model::A",""{} +Model:5845275659,"Model::A",""{} +Model:5846021259,"Model::A",""{} +Model:5846519462,"Model::A",""{} +Model:5847107576,"Model::A",""{} +Model:5847123267,"Model::A",""{} +Model:5848731335,"Model::A",""{} +Model:5849598034,"Model::A",""{} +Model:5850473687,"Model::A",""{} +Model:5850760191,"Model::A",""{} +Model:5851641454,"Model::A",""{} +Model:5851802733,"Model::A",""{} +Model:5852304625,"Model::A",""{} +Model:5853368083,"Model::A",""{} +Model:5853706507,"Model::A",""{} +Model:5855241034,"Model::A",""{} +Model:5857153141,"Model::A",""{} +Model:5858514503,"Model::A",""{} +Model:5858781067,"Model::A",""{} +Model:5858915630,"Model::A",""{} +Model:5859492978,"Model::A",""{} +Model:5859665692,"Model::A",""{} +Model:5860104702,"Model::A",""{} +Model:5860173999,"Model::A",""{} +Model:5861249085,"Model::A",""{} +Model:5861622945,"Model::A",""{} +Model:5862395837,"Model::A",""{} +Model:5862553492,"Model::A",""{} +Model:5863149426,"Model::A",""{} +Model:5863364491,"Model::A",""{} +Model:5863367355,"Model::A",""{} +Model:5863546819,"Model::A",""{} +Model:5863879361,"Model::A",""{} +Model:5864544763,"Model::A",""{} +Model:5864986793,"Model::A",""{} +Model:5865022039,"Model::A",""{} +Model:5865892985,"Model::A",""{} +Model:5866324622,"Model::A",""{} +Model:5866816052,"Model::A",""{} +Model:5867060234,"Model::A",""{} +Model:5867607511,"Model::A",""{} +Model:5867861695,"Model::A",""{} +Model:5868335792,"Model::A",""{} +Model:5868466517,"Model::A",""{} +Model:5869717099,"Model::A",""{} +Model:5869778847,"Model::A",""{} +Model:5870081456,"Model::A",""{} +Model:5870441806,"Model::A",""{} +Model:5870769762,"Model::A",""{} +Model:5871678897,"Model::A",""{} +Model:5872724623,"Model::A",""{} +Model:5873004507,"Model::A",""{} +Model:5873524859,"Model::A",""{} +Model:5873629747,"Model::A",""{} +Model:5873804085,"Model::A",""{} +Model:5875531158,"Model::A",""{} +Model:5875794140,"Model::A",""{} +Model:5875804397,"Model::A",""{} +Model:5875875183,"Model::A",""{} +Model:5876897534,"Model::A",""{} +Model:5877298435,"Model::A",""{} +Model:5877715479,"Model::A",""{} +Model:5878508927,"Model::A",""{} +Model:5878920262,"Model::A",""{} +Model:5880220123,"Model::A",""{} +Model:5880286094,"Model::A",""{} +Model:5882665959,"Model::A",""{} +Model:5882887993,"Model::A",""{} +Model:5883633571,"Model::A",""{} +Model:5883838098,"Model::A",""{} +Model:5883885391,"Model::A",""{} +Model:5884611086,"Model::A",""{} +Model:5884926997,"Model::A",""{} +Model:5885232955,"Model::A",""{} +Model:5885278754,"Model::A",""{} +Model:5885328061,"Model::A",""{} +Model:5886251070,"Model::A",""{} +Model:5887242607,"Model::A",""{} +Model:5888308037,"Model::A",""{} +Model:5889339966,"Model::A",""{} +Model:5889997022,"Model::A",""{} +Model:5890816803,"Model::A",""{} +Model:5891249735,"Model::A",""{} +Model:5893143069,"Model::A",""{} +Model:5894416218,"Model::A",""{} +Model:5894817989,"Model::A",""{} +Model:5896032627,"Model::A",""{} +Model:5896664543,"Model::A",""{} +Model:5896678940,"Model::A",""{} +Model:5896682318,"Model::A",""{} +Model:5897536491,"Model::A",""{} +Model:5898173867,"Model::A",""{} +Model:5898702830,"Model::A",""{} +Model:5898811054,"Model::A",""{} +Model:5898867979,"Model::A",""{} +Model:5900100178,"Model::A",""{} +Model:5901081260,"Model::A",""{} +Model:5901226382,"Model::A",""{} +Model:5901232523,"Model::A",""{} +Model:5902132794,"Model::A",""{} +Model:5902564388,"Model::A",""{} +Model:5902650869,"Model::A",""{} +Model:5903798636,"Model::A",""{} +Model:5903942575,"Model::A",""{} +Model:5904087460,"Model::A",""{} +Model:5904749938,"Model::A",""{} +Model:5905629723,"Model::A",""{} +Model:5905870870,"Model::A",""{} +Model:5906908814,"Model::A",""{} +Model:5907119649,"Model::A",""{} +Model:5907790797,"Model::A",""{} +Model:5909237204,"Model::A",""{} +Model:5910325467,"Model::A",""{} +Model:5910327309,"Model::A",""{} +Model:5911555129,"Model::A",""{} +Model:5911952960,"Model::A",""{} +Model:5912859989,"Model::A",""{} +Model:5912982131,"Model::A",""{} +Model:5913227623,"Model::A",""{} +Model:5913327021,"Model::A",""{} +Model:5913826294,"Model::A",""{} +Model:5914038089,"Model::A",""{} +Model:5914569902,"Model::A",""{} +Model:5914671871,"Model::A",""{} +Model:5915753019,"Model::A",""{} +Model:5916591599,"Model::A",""{} +Model:5916690807,"Model::A",""{} + +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1907292239120,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631740128,1907680138928 + + ;Geometry::, Model::pCube1 + C: "OO",1908558533920,1907292239120 + + ;Material::lambert1, Model::pCube1 + C: "OO",1907674217712,1907292239120 + +C: "OO", 478973, 543226 +C: "OO", 543226, 550013 +C: "OO", 550013, 855933 +C: "OO", 855933, 1057863 +C: "OO", 1057863, 3018902 +C: "OO", 3018902, 3851319 +C: "OO", 3851319, 4006012 +C: "OO", 4006012, 4031939 +C: "OO", 4031939, 4472588 +C: "OO", 4472588, 4733408 +C: "OO", 4733408, 5285050 +C: "OO", 5285050, 5522932 +C: "OO", 5522932, 6670855 +C: "OO", 6670855, 6855350 +C: "OO", 6855350, 7301910 +C: "OO", 7301910, 7370458 +C: "OO", 7370458, 8454867 +C: "OO", 8454867, 9437219 +C: "OO", 9437219, 10136912 +C: "OO", 10136912, 10580769 +C: "OO", 10580769, 10841982 +C: "OO", 10841982, 10901684 +C: "OO", 10901684, 11136125 +C: "OO", 11136125, 12083212 +C: "OO", 12083212, 12197102 +C: "OO", 12197102, 12532597 +C: "OO", 12532597, 13813187 +C: "OO", 13813187, 13941637 +C: "OO", 13941637, 14036994 +C: "OO", 14036994, 14089852 +C: "OO", 14089852, 14207681 +C: "OO", 14207681, 14530775 +C: "OO", 14530775, 14917654 +C: "OO", 14917654, 15171953 +C: "OO", 15171953, 15537042 +C: "OO", 15537042, 17850427 +C: "OO", 17850427, 19808749 +C: "OO", 19808749, 20517695 +C: "OO", 20517695, 21178652 +C: "OO", 21178652, 21432529 +C: "OO", 21432529, 21564892 +C: "OO", 21564892, 22053399 +C: "OO", 22053399, 24355295 +C: "OO", 24355295, 24372693 +C: "OO", 24372693, 24407171 +C: "OO", 24407171, 25218913 +C: "OO", 25218913, 26359854 +C: "OO", 26359854, 27145487 +C: "OO", 27145487, 27343700 +C: "OO", 27343700, 27584631 +C: "OO", 27584631, 27849311 +C: "OO", 27849311, 28862051 +C: "OO", 28862051, 29114447 +C: "OO", 29114447, 30710756 +C: "OO", 30710756, 32417094 +C: "OO", 32417094, 33688388 +C: "OO", 33688388, 33960199 +C: "OO", 33960199, 34995862 +C: "OO", 34995862, 35188263 +C: "OO", 35188263, 35250273 +C: "OO", 35250273, 35272741 +C: "OO", 35272741, 36229022 +C: "OO", 36229022, 36769136 +C: "OO", 36769136, 37322378 +C: "OO", 37322378, 38883892 +C: "OO", 38883892, 39116502 +C: "OO", 39116502, 39147382 +C: "OO", 39147382, 39725491 +C: "OO", 39725491, 40194782 +C: "OO", 40194782, 40794482 +C: "OO", 40794482, 41738973 +C: "OO", 41738973, 41780835 +C: "OO", 41780835, 41962422 +C: "OO", 41962422, 42427395 +C: "OO", 42427395, 43344809 +C: "OO", 43344809, 43587546 +C: "OO", 43587546, 44268968 +C: "OO", 44268968, 44824779 +C: "OO", 44824779, 45096991 +C: "OO", 45096991, 45134048 +C: "OO", 45134048, 45693509 +C: "OO", 45693509, 45838418 +C: "OO", 45838418, 45839703 +C: "OO", 45839703, 46929441 +C: "OO", 46929441, 47420744 +C: "OO", 47420744, 47737209 +C: "OO", 47737209, 50006753 +C: "OO", 50006753, 52281106 +C: "OO", 52281106, 52425774 +C: "OO", 52425774, 52765086 +C: "OO", 52765086, 53018970 +C: "OO", 53018970, 53045168 +C: "OO", 53045168, 53116974 +C: "OO", 53116974, 54067111 +C: "OO", 54067111, 55026311 +C: "OO", 55026311, 55338721 +C: "OO", 55338721, 55525133 +C: "OO", 55525133, 55748485 +C: "OO", 55748485, 57163501 +C: "OO", 57163501, 57358966 +C: "OO", 57358966, 59000125 +C: "OO", 59000125, 59270959 +C: "OO", 59270959, 59402422 +C: "OO", 59402422, 59568596 +C: "OO", 59568596, 59714457 +C: "OO", 59714457, 59824219 +C: "OO", 59824219, 60002442 +C: "OO", 60002442, 61974885 +C: "OO", 61974885, 62118349 +C: "OO", 62118349, 62930092 +C: "OO", 62930092, 62932594 +C: "OO", 62932594, 63110302 +C: "OO", 63110302, 63147227 +C: "OO", 63147227, 63324911 +C: "OO", 63324911, 63584431 +C: "OO", 63584431, 65012365 +C: "OO", 65012365, 65183480 +C: "OO", 65183480, 66385842 +C: "OO", 66385842, 66486765 +C: "OO", 66486765, 68024518 +C: "OO", 68024518, 68661371 +C: "OO", 68661371, 69021615 +C: "OO", 69021615, 69106474 +C: "OO", 69106474, 69247221 +C: "OO", 69247221, 69422507 +C: "OO", 69422507, 69586382 +C: "OO", 69586382, 69881221 +C: "OO", 69881221, 70187504 +C: "OO", 70187504, 72548649 +C: "OO", 72548649, 73601786 +C: "OO", 73601786, 73708290 +C: "OO", 73708290, 74861273 +C: "OO", 74861273, 75203396 +C: "OO", 75203396, 75722602 +C: "OO", 75722602, 76626061 +C: "OO", 76626061, 77090854 +C: "OO", 77090854, 77880317 +C: "OO", 77880317, 78690637 +C: "OO", 78690637, 79743202 +C: "OO", 79743202, 80092780 +C: "OO", 80092780, 80859982 +C: "OO", 80859982, 81010394 +C: "OO", 81010394, 81751972 +C: "OO", 81751972, 82324779 +C: "OO", 82324779, 83318380 +C: "OO", 83318380, 84400375 +C: "OO", 84400375, 85669511 +C: "OO", 85669511, 86187863 +C: "OO", 86187863, 86430917 +C: "OO", 86430917, 87253970 +C: "OO", 87253970, 87387579 +C: "OO", 87387579, 88442621 +C: "OO", 88442621, 88650387 +C: "OO", 88650387, 88657907 +C: "OO", 88657907, 88811744 +C: "OO", 88811744, 89158841 +C: "OO", 89158841, 89164655 +C: "OO", 89164655, 91209890 +C: "OO", 91209890, 91484997 +C: "OO", 91484997, 92902310 +C: "OO", 92902310, 93421318 +C: "OO", 93421318, 93488190 +C: "OO", 93488190, 94674433 +C: "OO", 94674433, 94941219 +C: "OO", 94941219, 95294869 +C: "OO", 95294869, 95440532 +C: "OO", 95440532, 95560766 +C: "OO", 95560766, 95765457 +C: "OO", 95765457, 96114162 +C: "OO", 96114162, 96691075 +C: "OO", 96691075, 97137455 +C: "OO", 97137455, 97237561 +C: "OO", 97237561, 97900141 +C: "OO", 97900141, 98624886 +C: "OO", 98624886, 99121777 +C: "OO", 99121777, 101309336 +C: "OO", 101309336, 101956111 +C: "OO", 101956111, 102762554 +C: "OO", 102762554, 103094634 +C: "OO", 103094634, 103678981 +C: "OO", 103678981, 103757723 +C: "OO", 103757723, 104784399 +C: "OO", 104784399, 104806926 +C: "OO", 104806926, 105244989 +C: "OO", 105244989, 105288449 +C: "OO", 105288449, 105431719 +C: "OO", 105431719, 105706806 +C: "OO", 105706806, 106141179 +C: "OO", 106141179, 106584484 +C: "OO", 106584484, 107054467 +C: "OO", 107054467, 107286700 +C: "OO", 107286700, 107380516 +C: "OO", 107380516, 107720024 +C: "OO", 107720024, 109094706 +C: "OO", 109094706, 109170823 +C: "OO", 109170823, 109188140 +C: "OO", 109188140, 110078854 +C: "OO", 110078854, 111230342 +C: "OO", 111230342, 111528489 +C: "OO", 111528489, 111814690 +C: "OO", 111814690, 111854015 +C: "OO", 111854015, 112084269 +C: "OO", 112084269, 112427875 +C: "OO", 112427875, 112830484 +C: "OO", 112830484, 112990155 +C: "OO", 112990155, 113314833 +C: "OO", 113314833, 113410707 +C: "OO", 113410707, 113572245 +C: "OO", 113572245, 114964887 +C: "OO", 114964887, 116397423 +C: "OO", 116397423, 117516109 +C: "OO", 117516109, 118283417 +C: "OO", 118283417, 118582494 +C: "OO", 118582494, 119100794 +C: "OO", 119100794, 119530361 +C: "OO", 119530361, 121722454 +C: "OO", 121722454, 123429207 +C: "OO", 123429207, 123775628 +C: "OO", 123775628, 125184776 +C: "OO", 125184776, 125672879 +C: "OO", 125672879, 126172822 +C: "OO", 126172822, 126946276 +C: "OO", 126946276, 127160830 +C: "OO", 127160830, 127289727 +C: "OO", 127289727, 129428923 +C: "OO", 129428923, 129740255 +C: "OO", 129740255, 130688502 +C: "OO", 130688502, 131098647 +C: "OO", 131098647, 131885809 +C: "OO", 131885809, 131908660 +C: "OO", 131908660, 132000845 +C: "OO", 132000845, 132056305 +C: "OO", 132056305, 132938949 +C: "OO", 132938949, 133159987 +C: "OO", 133159987, 133307849 +C: "OO", 133307849, 133474781 +C: "OO", 133474781, 133697606 +C: "OO", 133697606, 133976285 +C: "OO", 133976285, 134069870 +C: "OO", 134069870, 135700258 +C: "OO", 135700258, 136156748 +C: "OO", 136156748, 136757334 +C: "OO", 136757334, 137052495 +C: "OO", 137052495, 138154841 +C: "OO", 138154841, 139079410 +C: "OO", 139079410, 139350128 +C: "OO", 139350128, 139853957 +C: "OO", 139853957, 139884815 +C: "OO", 139884815, 139904431 +C: "OO", 139904431, 140389143 +C: "OO", 140389143, 140914147 +C: "OO", 140914147, 141049377 +C: "OO", 141049377, 141276836 +C: "OO", 141276836, 141502854 +C: "OO", 141502854, 142570263 +C: "OO", 142570263, 142927558 +C: "OO", 142927558, 143915497 +C: "OO", 143915497, 144281324 +C: "OO", 144281324, 144412443 +C: "OO", 144412443, 144922743 +C: "OO", 144922743, 145030346 +C: "OO", 145030346, 147652994 +C: "OO", 147652994, 149967191 +C: "OO", 149967191, 150791637 +C: "OO", 150791637, 150880802 +C: "OO", 150880802, 150891330 +C: "OO", 150891330, 150953933 +C: "OO", 150953933, 151669738 +C: "OO", 151669738, 151702302 +C: "OO", 151702302, 151710987 +C: "OO", 151710987, 151799531 +C: "OO", 151799531, 151867220 +C: "OO", 151867220, 152140955 +C: "OO", 152140955, 152673470 +C: "OO", 152673470, 153174481 +C: "OO", 153174481, 153335326 +C: "OO", 153335326, 154613212 +C: "OO", 154613212, 155201504 +C: "OO", 155201504, 155995772 +C: "OO", 155995772, 157896293 +C: "OO", 157896293, 158363431 +C: "OO", 158363431, 159176527 +C: "OO", 159176527, 159564765 +C: "OO", 159564765, 159762269 +C: "OO", 159762269, 160118418 +C: "OO", 160118418, 160300094 +C: "OO", 160300094, 160752887 +C: "OO", 160752887, 161835953 +C: "OO", 161835953, 162767629 +C: "OO", 162767629, 163556651 +C: "OO", 163556651, 164726837 +C: "OO", 164726837, 164807897 +C: "OO", 164807897, 164808124 +C: "OO", 164808124, 166206010 +C: "OO", 166206010, 166425776 +C: "OO", 166425776, 167199062 +C: "OO", 167199062, 168507135 +C: "OO", 168507135, 169290767 +C: "OO", 169290767, 169612487 +C: "OO", 169612487, 169740038 +C: "OO", 169740038, 171100983 +C: "OO", 171100983, 172223956 +C: "OO", 172223956, 172736170 +C: "OO", 172736170, 172948307 +C: "OO", 172948307, 173077573 +C: "OO", 173077573, 173147789 +C: "OO", 173147789, 174110370 +C: "OO", 174110370, 174666391 +C: "OO", 174666391, 174764494 +C: "OO", 174764494, 174777170 +C: "OO", 174777170, 175034996 +C: "OO", 175034996, 175613573 +C: "OO", 175613573, 175918883 +C: "OO", 175918883, 176197989 +C: "OO", 176197989, 176447021 +C: "OO", 176447021, 176760445 +C: "OO", 176760445, 177466533 +C: "OO", 177466533, 178193913 +C: "OO", 178193913, 178332970 +C: "OO", 178332970, 179074431 +C: "OO", 179074431, 179079353 +C: "OO", 179079353, 179343663 +C: "OO", 179343663, 179580258 +C: "OO", 179580258, 180899871 +C: "OO", 180899871, 181772103 +C: "OO", 181772103, 182033927 +C: "OO", 182033927, 183033049 +C: "OO", 183033049, 183594220 +C: "OO", 183594220, 183697983 +C: "OO", 183697983, 184041482 +C: "OO", 184041482, 184137541 +C: "OO", 184137541, 184231473 +C: "OO", 184231473, 184947931 +C: "OO", 184947931, 185421425 +C: "OO", 185421425, 185567514 +C: "OO", 185567514, 185724087 +C: "OO", 185724087, 185808695 +C: "OO", 185808695, 185994118 +C: "OO", 185994118, 186067479 +C: "OO", 186067479, 186143957 +C: "OO", 186143957, 186144056 +C: "OO", 186144056, 186186273 +C: "OO", 186186273, 186260293 +C: "OO", 186260293, 186356905 +C: "OO", 186356905, 187603395 +C: "OO", 187603395, 187817898 +C: "OO", 187817898, 189622506 +C: "OO", 189622506, 190090772 +C: "OO", 190090772, 192992362 +C: "OO", 192992362, 193827317 +C: "OO", 193827317, 194267042 +C: "OO", 194267042, 195005629 +C: "OO", 195005629, 196019535 +C: "OO", 196019535, 197597323 +C: "OO", 197597323, 198491399 +C: "OO", 198491399, 198846287 +C: "OO", 198846287, 199047185 +C: "OO", 199047185, 199306195 +C: "OO", 199306195, 199308111 +C: "OO", 199308111, 199925523 +C: "OO", 199925523, 201101395 +C: "OO", 201101395, 201111694 +C: "OO", 201111694, 201772339 +C: "OO", 201772339, 202390286 +C: "OO", 202390286, 202535131 +C: "OO", 202535131, 204907125 +C: "OO", 204907125, 205254977 +C: "OO", 205254977, 205467743 +C: "OO", 205467743, 205645411 +C: "OO", 205645411, 205774353 +C: "OO", 205774353, 206238643 +C: "OO", 206238643, 206790393 +C: "OO", 206790393, 207338650 +C: "OO", 207338650, 207616171 +C: "OO", 207616171, 207763299 +C: "OO", 207763299, 208171630 +C: "OO", 208171630, 209494622 +C: "OO", 209494622, 210690998 +C: "OO", 210690998, 212009459 +C: "OO", 212009459, 212620003 +C: "OO", 212620003, 212817814 +C: "OO", 212817814, 212852510 +C: "OO", 212852510, 213110977 +C: "OO", 213110977, 214097733 +C: "OO", 214097733, 215573662 +C: "OO", 215573662, 216190657 +C: "OO", 216190657, 216950919 +C: "OO", 216950919, 217484687 +C: "OO", 217484687, 217968225 +C: "OO", 217968225, 218194130 +C: "OO", 218194130, 218257602 +C: "OO", 218257602, 218293760 +C: "OO", 218293760, 218516355 +C: "OO", 218516355, 218690926 +C: "OO", 218690926, 218792010 +C: "OO", 218792010, 219265102 +C: "OO", 219265102, 219332654 +C: "OO", 219332654, 219474374 +C: "OO", 219474374, 220217017 +C: "OO", 220217017, 220658503 +C: "OO", 220658503, 222464457 +C: "OO", 222464457, 223441630 +C: "OO", 223441630, 224425496 +C: "OO", 224425496, 224910172 +C: "OO", 224910172, 224952629 +C: "OO", 224952629, 226824883 +C: "OO", 226824883, 227046161 +C: "OO", 227046161, 228038138 +C: "OO", 228038138, 228758089 +C: "OO", 228758089, 228842449 +C: "OO", 228842449, 230114223 +C: "OO", 230114223, 232882366 +C: "OO", 232882366, 233682582 +C: "OO", 233682582, 234260603 +C: "OO", 234260603, 234311783 +C: "OO", 234311783, 237319237 +C: "OO", 237319237, 237891584 +C: "OO", 237891584, 238000232 +C: "OO", 238000232, 238196463 +C: "OO", 238196463, 238321142 +C: "OO", 238321142, 238598204 +C: "OO", 238598204, 238953725 +C: "OO", 238953725, 240156889 +C: "OO", 240156889, 240396709 +C: "OO", 240396709, 242328107 +C: "OO", 242328107, 242331399 +C: "OO", 242331399, 242714561 +C: "OO", 242714561, 243019033 +C: "OO", 243019033, 244277275 +C: "OO", 244277275, 244914130 +C: "OO", 244914130, 245118272 +C: "OO", 245118272, 246849761 +C: "OO", 246849761, 247150799 +C: "OO", 247150799, 249340553 +C: "OO", 249340553, 249744220 +C: "OO", 249744220, 249910598 +C: "OO", 249910598, 250218302 +C: "OO", 250218302, 250232456 +C: "OO", 250232456, 252558701 +C: "OO", 252558701, 252949039 +C: "OO", 252949039, 253060874 +C: "OO", 253060874, 253533426 +C: "OO", 253533426, 253586357 +C: "OO", 253586357, 254395715 +C: "OO", 254395715, 254785273 +C: "OO", 254785273, 255559523 +C: "OO", 255559523, 256313630 +C: "OO", 256313630, 256452938 +C: "OO", 256452938, 257863306 +C: "OO", 257863306, 258662810 +C: "OO", 258662810, 258945799 +C: "OO", 258945799, 259928595 +C: "OO", 259928595, 260307349 +C: "OO", 260307349, 261076427 +C: "OO", 261076427, 261323130 +C: "OO", 261323130, 261464902 +C: "OO", 261464902, 261744567 +C: "OO", 261744567, 262035485 +C: "OO", 262035485, 262336389 +C: "OO", 262336389, 262976783 +C: "OO", 262976783, 264157594 +C: "OO", 264157594, 264323317 +C: "OO", 264323317, 264523910 +C: "OO", 264523910, 265846758 +C: "OO", 265846758, 266903761 +C: "OO", 266903761, 267725685 +C: "OO", 267725685, 268107533 +C: "OO", 268107533, 268181746 +C: "OO", 268181746, 269277340 +C: "OO", 269277340, 269311491 +C: "OO", 269311491, 269714774 +C: "OO", 269714774, 269934745 +C: "OO", 269934745, 271199498 +C: "OO", 271199498, 272789948 +C: "OO", 272789948, 273440747 +C: "OO", 273440747, 273940185 +C: "OO", 273940185, 274256454 +C: "OO", 274256454, 274531133 +C: "OO", 274531133, 275081979 +C: "OO", 275081979, 275781018 +C: "OO", 275781018, 275884086 +C: "OO", 275884086, 276343141 +C: "OO", 276343141, 276410212 +C: "OO", 276410212, 278266084 +C: "OO", 278266084, 279969093 +C: "OO", 279969093, 280619630 +C: "OO", 280619630, 280907281 +C: "OO", 280907281, 280947464 +C: "OO", 280947464, 282647432 +C: "OO", 282647432, 282873411 +C: "OO", 282873411, 283056619 +C: "OO", 283056619, 283381370 +C: "OO", 283381370, 283383378 +C: "OO", 283383378, 283749089 +C: "OO", 283749089, 283940793 +C: "OO", 283940793, 284273060 +C: "OO", 284273060, 285037437 +C: "OO", 285037437, 287102547 +C: "OO", 287102547, 287986481 +C: "OO", 287986481, 288354293 +C: "OO", 288354293, 288862347 +C: "OO", 288862347, 289378073 +C: "OO", 289378073, 289512083 +C: "OO", 289512083, 289578773 +C: "OO", 289578773, 290035091 +C: "OO", 290035091, 290484281 +C: "OO", 290484281, 292155141 +C: "OO", 292155141, 293263301 +C: "OO", 293263301, 293455159 +C: "OO", 293455159, 293587801 +C: "OO", 293587801, 293742326 +C: "OO", 293742326, 294800029 +C: "OO", 294800029, 295387904 +C: "OO", 295387904, 295621520 +C: "OO", 295621520, 296205239 +C: "OO", 296205239, 297080871 +C: "OO", 297080871, 297462878 +C: "OO", 297462878, 297468622 +C: "OO", 297468622, 297470179 +C: "OO", 297470179, 297488573 +C: "OO", 297488573, 297490943 +C: "OO", 297490943, 297498262 +C: "OO", 297498262, 297645883 +C: "OO", 297645883, 297675043 +C: "OO", 297675043, 298098766 +C: "OO", 298098766, 298945971 +C: "OO", 298945971, 299998086 +C: "OO", 299998086, 300549913 +C: "OO", 300549913, 301021405 +C: "OO", 301021405, 301160612 +C: "OO", 301160612, 301521609 +C: "OO", 301521609, 302771956 +C: "OO", 302771956, 302831947 +C: "OO", 302831947, 302995837 +C: "OO", 302995837, 303440648 +C: "OO", 303440648, 304035806 +C: "OO", 304035806, 304207879 +C: "OO", 304207879, 305292254 +C: "OO", 305292254, 305649644 +C: "OO", 305649644, 308046562 +C: "OO", 308046562, 308247239 +C: "OO", 308247239, 308509915 +C: "OO", 308509915, 309059625 +C: "OO", 309059625, 311533478 +C: "OO", 311533478, 311873394 +C: "OO", 311873394, 312337675 +C: "OO", 312337675, 312363005 +C: "OO", 312363005, 312437463 +C: "OO", 312437463, 312446356 +C: "OO", 312446356, 312674718 +C: "OO", 312674718, 313366049 +C: "OO", 313366049, 314103843 +C: "OO", 314103843, 314646399 +C: "OO", 314646399, 316282712 +C: "OO", 316282712, 316680026 +C: "OO", 316680026, 317195997 +C: "OO", 317195997, 317331547 +C: "OO", 317331547, 317681846 +C: "OO", 317681846, 317888725 +C: "OO", 317888725, 318230725 +C: "OO", 318230725, 318415852 +C: "OO", 318415852, 318518161 +C: "OO", 318518161, 319369666 +C: "OO", 319369666, 319886792 +C: "OO", 319886792, 322270861 +C: "OO", 322270861, 322477521 +C: "OO", 322477521, 322652795 +C: "OO", 322652795, 324103508 +C: "OO", 324103508, 324612297 +C: "OO", 324612297, 326523628 +C: "OO", 326523628, 326703527 +C: "OO", 326703527, 327741249 +C: "OO", 327741249, 328354304 +C: "OO", 328354304, 328435438 +C: "OO", 328435438, 328580463 +C: "OO", 328580463, 329447689 +C: "OO", 329447689, 329557811 +C: "OO", 329557811, 330021692 +C: "OO", 330021692, 330156505 +C: "OO", 330156505, 330363705 +C: "OO", 330363705, 332258993 +C: "OO", 332258993, 333284375 +C: "OO", 333284375, 333526781 +C: "OO", 333526781, 333859698 +C: "OO", 333859698, 335625859 +C: "OO", 335625859, 335954695 +C: "OO", 335954695, 335982138 +C: "OO", 335982138, 337350127 +C: "OO", 337350127, 337672612 +C: "OO", 337672612, 337679542 +C: "OO", 337679542, 337802072 +C: "OO", 337802072, 338928004 +C: "OO", 338928004, 338984504 +C: "OO", 338984504, 340372697 +C: "OO", 340372697, 341994226 +C: "OO", 341994226, 342902860 +C: "OO", 342902860, 343040116 +C: "OO", 343040116, 343146094 +C: "OO", 343146094, 343353507 +C: "OO", 343353507, 343477639 +C: "OO", 343477639, 343496185 +C: "OO", 343496185, 343733950 +C: "OO", 343733950, 345281075 +C: "OO", 345281075, 346599255 +C: "OO", 346599255, 347042175 +C: "OO", 347042175, 348332027 +C: "OO", 348332027, 348565458 +C: "OO", 348565458, 349567736 +C: "OO", 349567736, 350718897 +C: "OO", 350718897, 351119933 +C: "OO", 351119933, 351176381 +C: "OO", 351176381, 351444698 +C: "OO", 351444698, 354196002 +C: "OO", 354196002, 354232259 +C: "OO", 354232259, 354531587 +C: "OO", 354531587, 354995797 +C: "OO", 354995797, 355066322 +C: "OO", 355066322, 355394006 +C: "OO", 355394006, 355786633 +C: "OO", 355786633, 357211826 +C: "OO", 357211826, 357641131 +C: "OO", 357641131, 357660514 +C: "OO", 357660514, 357951354 +C: "OO", 357951354, 358834773 +C: "OO", 358834773, 360652723 +C: "OO", 360652723, 361285364 +C: "OO", 361285364, 361381390 +C: "OO", 361381390, 361548620 +C: "OO", 361548620, 361562651 +C: "OO", 361562651, 361635654 +C: "OO", 361635654, 362483683 +C: "OO", 362483683, 362964997 +C: "OO", 362964997, 363338571 +C: "OO", 363338571, 363900137 +C: "OO", 363900137, 364079894 +C: "OO", 364079894, 364213081 +C: "OO", 364213081, 365092374 +C: "OO", 365092374, 365780561 +C: "OO", 365780561, 367269374 +C: "OO", 367269374, 367924861 +C: "OO", 367924861, 367981702 +C: "OO", 367981702, 368039426 +C: "OO", 368039426, 369146821 +C: "OO", 369146821, 369354359 +C: "OO", 369354359, 370486087 +C: "OO", 370486087, 371266071 +C: "OO", 371266071, 371604661 +C: "OO", 371604661, 372240308 +C: "OO", 372240308, 373214786 +C: "OO", 373214786, 374164081 +C: "OO", 374164081, 376254315 +C: "OO", 376254315, 376823263 +C: "OO", 376823263, 378324049 +C: "OO", 378324049, 378641437 +C: "OO", 378641437, 380164333 +C: "OO", 380164333, 380424774 +C: "OO", 380424774, 380731935 +C: "OO", 380731935, 381038524 +C: "OO", 381038524, 381090995 +C: "OO", 381090995, 382819191 +C: "OO", 382819191, 383602342 +C: "OO", 383602342, 383704101 +C: "OO", 383704101, 385011172 +C: "OO", 385011172, 385146467 +C: "OO", 385146467, 386847003 +C: "OO", 386847003, 388273857 +C: "OO", 388273857, 390404347 +C: "OO", 390404347, 390875597 +C: "OO", 390875597, 391224395 +C: "OO", 391224395, 391753537 +C: "OO", 391753537, 393069644 +C: "OO", 393069644, 393148255 +C: "OO", 393148255, 393945335 +C: "OO", 393945335, 394522100 +C: "OO", 394522100, 394784810 +C: "OO", 394784810, 395274671 +C: "OO", 395274671, 396023431 +C: "OO", 396023431, 396808874 +C: "OO", 396808874, 397529979 +C: "OO", 397529979, 398286694 +C: "OO", 398286694, 398641353 +C: "OO", 398641353, 398842439 +C: "OO", 398842439, 399095763 +C: "OO", 399095763, 399258695 +C: "OO", 399258695, 399848837 +C: "OO", 399848837, 402535190 +C: "OO", 402535190, 402953045 +C: "OO", 402953045, 405100325 +C: "OO", 405100325, 405263428 +C: "OO", 405263428, 405429574 +C: "OO", 405429574, 405776247 +C: "OO", 405776247, 405879829 +C: "OO", 405879829, 407007188 +C: "OO", 407007188, 407178899 +C: "OO", 407178899, 407378769 +C: "OO", 407378769, 408174871 +C: "OO", 408174871, 409656019 +C: "OO", 409656019, 410546166 +C: "OO", 410546166, 410766637 +C: "OO", 410766637, 411143624 +C: "OO", 411143624, 411172079 +C: "OO", 411172079, 412608386 +C: "OO", 412608386, 413423995 +C: "OO", 413423995, 413556346 +C: "OO", 413556346, 414713470 +C: "OO", 414713470, 415119189 +C: "OO", 415119189, 415163645 +C: "OO", 415163645, 415757583 +C: "OO", 415757583, 416020386 +C: "OO", 416020386, 416949824 +C: "OO", 416949824, 418890507 +C: "OO", 418890507, 418999217 +C: "OO", 418999217, 419007135 +C: "OO", 419007135, 419486177 +C: "OO", 419486177, 420099254 +C: "OO", 420099254, 420825210 +C: "OO", 420825210, 420941054 +C: "OO", 420941054, 421695769 +C: "OO", 421695769, 421899341 +C: "OO", 421899341, 422384278 +C: "OO", 422384278, 423638867 +C: "OO", 423638867, 424153468 +C: "OO", 424153468, 424222213 +C: "OO", 424222213, 424438106 +C: "OO", 424438106, 424613039 +C: "OO", 424613039, 425000696 +C: "OO", 425000696, 426336010 +C: "OO", 426336010, 426413078 +C: "OO", 426413078, 426455610 +C: "OO", 426455610, 426714622 +C: "OO", 426714622, 428243201 +C: "OO", 428243201, 430105130 +C: "OO", 430105130, 430701971 +C: "OO", 430701971, 431140498 +C: "OO", 431140498, 433885966 +C: "OO", 433885966, 434050686 +C: "OO", 434050686, 434551989 +C: "OO", 434551989, 436061164 +C: "OO", 436061164, 436077205 +C: "OO", 436077205, 436089911 +C: "OO", 436089911, 438523580 +C: "OO", 438523580, 439102103 +C: "OO", 439102103, 439779887 +C: "OO", 439779887, 439868603 +C: "OO", 439868603, 440536722 +C: "OO", 440536722, 441552013 +C: "OO", 441552013, 441803671 +C: "OO", 441803671, 443182163 +C: "OO", 443182163, 443854237 +C: "OO", 443854237, 444048821 +C: "OO", 444048821, 444249692 +C: "OO", 444249692, 444546749 +C: "OO", 444546749, 445207629 +C: "OO", 445207629, 446004944 +C: "OO", 446004944, 446183936 +C: "OO", 446183936, 446252734 +C: "OO", 446252734, 446624705 +C: "OO", 446624705, 446633246 +C: "OO", 446633246, 448462481 +C: "OO", 448462481, 448628753 +C: "OO", 448628753, 450189052 +C: "OO", 450189052, 450606158 +C: "OO", 450606158, 451008945 +C: "OO", 451008945, 451170551 +C: "OO", 451170551, 452296815 +C: "OO", 452296815, 452534617 +C: "OO", 452534617, 452949849 +C: "OO", 452949849, 453078377 +C: "OO", 453078377, 453132527 +C: "OO", 453132527, 453703705 +C: "OO", 453703705, 454375622 +C: "OO", 454375622, 454713861 +C: "OO", 454713861, 458238428 +C: "OO", 458238428, 458272703 +C: "OO", 458272703, 459078853 +C: "OO", 459078853, 459573397 +C: "OO", 459573397, 460082236 +C: "OO", 460082236, 460387646 +C: "OO", 460387646, 460461498 +C: "OO", 460461498, 460552461 +C: "OO", 460552461, 460639159 +C: "OO", 460639159, 462029812 +C: "OO", 462029812, 462693294 +C: "OO", 462693294, 462756261 +C: "OO", 462756261, 465227749 +C: "OO", 465227749, 466506007 +C: "OO", 466506007, 467214860 +C: "OO", 467214860, 468374089 +C: "OO", 468374089, 469105666 +C: "OO", 469105666, 469243610 +C: "OO", 469243610, 469356764 +C: "OO", 469356764, 470068562 +C: "OO", 470068562, 471708591 +C: "OO", 471708591, 472565941 +C: "OO", 472565941, 472606846 +C: "OO", 472606846, 473166229 +C: "OO", 473166229, 473378922 +C: "OO", 473378922, 473806520 +C: "OO", 473806520, 475169773 +C: "OO", 475169773, 475371788 +C: "OO", 475371788, 475784026 +C: "OO", 475784026, 475997871 +C: "OO", 475997871, 477098905 +C: "OO", 477098905, 478413027 +C: "OO", 478413027, 478843098 +C: "OO", 478843098, 478962769 +C: "OO", 478962769, 479291165 +C: "OO", 479291165, 479762689 +C: "OO", 479762689, 479951830 +C: "OO", 479951830, 480478925 +C: "OO", 480478925, 480999755 +C: "OO", 480999755, 481561794 +C: "OO", 481561794, 482699987 +C: "OO", 482699987, 482706377 +C: "OO", 482706377, 484868949 +C: "OO", 484868949, 485630405 +C: "OO", 485630405, 486060801 +C: "OO", 486060801, 486943880 +C: "OO", 486943880, 488549653 +C: "OO", 488549653, 488753154 +C: "OO", 488753154, 488926280 +C: "OO", 488926280, 489335885 +C: "OO", 489335885, 489918980 +C: "OO", 489918980, 490197623 +C: "OO", 490197623, 490377069 +C: "OO", 490377069, 490892303 +C: "OO", 490892303, 491503314 +C: "OO", 491503314, 491799049 +C: "OO", 491799049, 492177820 +C: "OO", 492177820, 492433221 +C: "OO", 492433221, 493036617 +C: "OO", 493036617, 493119809 +C: "OO", 493119809, 493921619 +C: "OO", 493921619, 494133182 +C: "OO", 494133182, 494888530 +C: "OO", 494888530, 496408028 +C: "OO", 496408028, 497000227 +C: "OO", 497000227, 497010052 +C: "OO", 497010052, 498313659 +C: "OO", 498313659, 498883623 +C: "OO", 498883623, 499536923 +C: "OO", 499536923, 499538363 +C: "OO", 499538363, 499849793 +C: "OO", 499849793, 501186894 +C: "OO", 501186894, 501483572 +C: "OO", 501483572, 501650567 +C: "OO", 501650567, 503155287 +C: "OO", 503155287, 503610199 +C: "OO", 503610199, 503693529 +C: "OO", 503693529, 503805689 +C: "OO", 503805689, 504361170 +C: "OO", 504361170, 504791974 +C: "OO", 504791974, 505207160 +C: "OO", 505207160, 505571509 +C: "OO", 505571509, 505744654 +C: "OO", 505744654, 506102414 +C: "OO", 506102414, 506350623 +C: "OO", 506350623, 506363807 +C: "OO", 506363807, 506703476 +C: "OO", 506703476, 506883620 +C: "OO", 506883620, 507713153 +C: "OO", 507713153, 508095225 +C: "OO", 508095225, 508858765 +C: "OO", 508858765, 510342370 +C: "OO", 510342370, 510537380 +C: "OO", 510537380, 510573942 +C: "OO", 510573942, 511045444 +C: "OO", 511045444, 512253159 +C: "OO", 512253159, 512667379 +C: "OO", 512667379, 512949259 +C: "OO", 512949259, 513091237 +C: "OO", 513091237, 513574746 +C: "OO", 513574746, 513674234 +C: "OO", 513674234, 513921607 +C: "OO", 513921607, 514132540 +C: "OO", 514132540, 514234483 +C: "OO", 514234483, 515545117 +C: "OO", 515545117, 516312283 +C: "OO", 516312283, 517877461 +C: "OO", 517877461, 519075155 +C: "OO", 519075155, 519169108 +C: "OO", 519169108, 519675991 +C: "OO", 519675991, 519973325 +C: "OO", 519973325, 520016521 +C: "OO", 520016521, 520145781 +C: "OO", 520145781, 521397499 +C: "OO", 521397499, 522522565 +C: "OO", 522522565, 524190713 +C: "OO", 524190713, 524486271 +C: "OO", 524486271, 524578603 +C: "OO", 524578603, 525058567 +C: "OO", 525058567, 526474207 +C: "OO", 526474207, 526721585 +C: "OO", 526721585, 527009495 +C: "OO", 527009495, 527109639 +C: "OO", 527109639, 527148689 +C: "OO", 527148689, 527613093 +C: "OO", 527613093, 528463782 +C: "OO", 528463782, 528601435 +C: "OO", 528601435, 529343769 +C: "OO", 529343769, 529448513 +C: "OO", 529448513, 530192365 +C: "OO", 530192365, 530260759 +C: "OO", 530260759, 530466307 +C: "OO", 530466307, 531267815 +C: "OO", 531267815, 531278305 +C: "OO", 531278305, 532099122 +C: "OO", 532099122, 532534274 +C: "OO", 532534274, 533544046 +C: "OO", 533544046, 533984363 +C: "OO", 533984363, 534411068 +C: "OO", 534411068, 535386909 +C: "OO", 535386909, 535627564 +C: "OO", 535627564, 535665627 +C: "OO", 535665627, 535677104 +C: "OO", 535677104, 535928903 +C: "OO", 535928903, 536015977 +C: "OO", 536015977, 536727615 +C: "OO", 536727615, 536857961 +C: "OO", 536857961, 536973883 +C: "OO", 536973883, 536994383 +C: "OO", 536994383, 537581797 +C: "OO", 537581797, 537838743 +C: "OO", 537838743, 538459225 +C: "OO", 538459225, 538726579 +C: "OO", 538726579, 539944377 +C: "OO", 539944377, 540477990 +C: "OO", 540477990, 540536678 +C: "OO", 540536678, 540657289 +C: "OO", 540657289, 541060850 +C: "OO", 541060850, 541947129 +C: "OO", 541947129, 542013800 +C: "OO", 542013800, 542113511 +C: "OO", 542113511, 542999594 +C: "OO", 542999594, 543217833 +C: "OO", 543217833, 543286097 +C: "OO", 543286097, 544214572 +C: "OO", 544214572, 544399687 +C: "OO", 544399687, 544743661 +C: "OO", 544743661, 546015985 +C: "OO", 546015985, 548018765 +C: "OO", 548018765, 550013228 +C: "OO", 550013228, 551240473 +C: "OO", 551240473, 551459943 +C: "OO", 551459943, 551533373 +C: "OO", 551533373, 553882346 +C: "OO", 553882346, 553933981 +C: "OO", 553933981, 554020311 +C: "OO", 554020311, 555248633 +C: "OO", 555248633, 555287927 +C: "OO", 555287927, 555363130 +C: "OO", 555363130, 555576727 +C: "OO", 555576727, 555606342 +C: "OO", 555606342, 557957786 +C: "OO", 557957786, 558195010 +C: "OO", 558195010, 558716288 +C: "OO", 558716288, 559926890 +C: "OO", 559926890, 560149922 +C: "OO", 560149922, 560168254 +C: "OO", 560168254, 562804275 +C: "OO", 562804275, 565426590 +C: "OO", 565426590, 565536718 +C: "OO", 565536718, 566171454 +C: "OO", 566171454, 566331293 +C: "OO", 566331293, 567583786 +C: "OO", 567583786, 567842970 +C: "OO", 567842970, 568161197 +C: "OO", 568161197, 568840645 +C: "OO", 568840645, 568932111 +C: "OO", 568932111, 569100401 +C: "OO", 569100401, 571086253 +C: "OO", 571086253, 571391145 +C: "OO", 571391145, 571731293 +C: "OO", 571731293, 572694013 +C: "OO", 572694013, 573027275 +C: "OO", 573027275, 573386793 +C: "OO", 573386793, 573829684 +C: "OO", 573829684, 574179078 +C: "OO", 574179078, 575739711 +C: "OO", 575739711, 576188119 +C: "OO", 576188119, 576797837 +C: "OO", 576797837, 577738411 +C: "OO", 577738411, 577906417 +C: "OO", 577906417, 578361330 +C: "OO", 578361330, 578978231 +C: "OO", 578978231, 579076586 +C: "OO", 579076586, 579245386 +C: "OO", 579245386, 579494082 +C: "OO", 579494082, 579617581 +C: "OO", 579617581, 579627915 +C: "OO", 579627915, 579866169 +C: "OO", 579866169, 580178355 +C: "OO", 580178355, 580457387 +C: "OO", 580457387, 581200681 +C: "OO", 581200681, 581691476 +C: "OO", 581691476, 582501077 +C: "OO", 582501077, 582848337 +C: "OO", 582848337, 583456564 +C: "OO", 583456564, 585085484 +C: "OO", 585085484, 586126445 +C: "OO", 586126445, 586224313 +C: "OO", 586224313, 586568489 +C: "OO", 586568489, 586804282 +C: "OO", 586804282, 587515519 +C: "OO", 587515519, 587599396 +C: "OO", 587599396, 588391503 +C: "OO", 588391503, 589690694 +C: "OO", 589690694, 590582925 +C: "OO", 590582925, 590924387 +C: "OO", 590924387, 592175274 +C: "OO", 592175274, 592216050 +C: "OO", 592216050, 592236819 +C: "OO", 592236819, 592671161 +C: "OO", 592671161, 592702857 +C: "OO", 592702857, 592707851 +C: "OO", 592707851, 592894063 +C: "OO", 592894063, 593172620 +C: "OO", 593172620, 593184385 +C: "OO", 593184385, 594453694 +C: "OO", 594453694, 594469618 +C: "OO", 594469618, 596582913 +C: "OO", 596582913, 597257342 +C: "OO", 597257342, 597504740 +C: "OO", 597504740, 597680737 +C: "OO", 597680737, 598427586 +C: "OO", 598427586, 599905921 +C: "OO", 599905921, 600475290 +C: "OO", 600475290, 600779921 +C: "OO", 600779921, 601978439 +C: "OO", 601978439, 601985621 +C: "OO", 601985621, 602442878 +C: "OO", 602442878, 603536321 +C: "OO", 603536321, 605034973 +C: "OO", 605034973, 605919463 +C: "OO", 605919463, 607157063 +C: "OO", 607157063, 607180565 +C: "OO", 607180565, 607331099 +C: "OO", 607331099, 607344489 +C: "OO", 607344489, 608669579 +C: "OO", 608669579, 609822379 +C: "OO", 609822379, 610813262 +C: "OO", 610813262, 611193522 +C: "OO", 611193522, 611287867 +C: "OO", 611287867, 611660771 +C: "OO", 611660771, 612318257 +C: "OO", 612318257, 612391421 +C: "OO", 612391421, 613552725 +C: "OO", 613552725, 613891352 +C: "OO", 613891352, 613904841 +C: "OO", 613904841, 613932493 +C: "OO", 613932493, 614805315 +C: "OO", 614805315, 615871904 +C: "OO", 615871904, 616248013 +C: "OO", 616248013, 616472009 +C: "OO", 616472009, 617911471 +C: "OO", 617911471, 618318707 +C: "OO", 618318707, 619151775 +C: "OO", 619151775, 619608506 +C: "OO", 619608506, 620380196 +C: "OO", 620380196, 620422208 +C: "OO", 620422208, 623004703 +C: "OO", 623004703, 623518433 +C: "OO", 623518433, 624023399 +C: "OO", 624023399, 625762543 +C: "OO", 625762543, 627021030 +C: "OO", 627021030, 627101500 +C: "OO", 627101500, 627705514 +C: "OO", 627705514, 627734441 +C: "OO", 627734441, 628556371 +C: "OO", 628556371, 630183786 +C: "OO", 630183786, 630342602 +C: "OO", 630342602, 630837950 +C: "OO", 630837950, 630924116 +C: "OO", 630924116, 631023350 +C: "OO", 631023350, 631451655 +C: "OO", 631451655, 632269796 +C: "OO", 632269796, 632496080 +C: "OO", 632496080, 632805085 +C: "OO", 632805085, 632993585 +C: "OO", 632993585, 634337188 +C: "OO", 634337188, 634591649 +C: "OO", 634591649, 634921207 +C: "OO", 634921207, 634936709 +C: "OO", 634936709, 635411231 +C: "OO", 635411231, 635677299 +C: "OO", 635677299, 636059882 +C: "OO", 636059882, 636130606 +C: "OO", 636130606, 636529066 +C: "OO", 636529066, 637191273 +C: "OO", 637191273, 637594972 +C: "OO", 637594972, 638606348 +C: "OO", 638606348, 638862365 +C: "OO", 638862365, 639719742 +C: "OO", 639719742, 641249643 +C: "OO", 641249643, 641667250 +C: "OO", 641667250, 642792329 +C: "OO", 642792329, 642956015 +C: "OO", 642956015, 643266092 +C: "OO", 643266092, 643448799 +C: "OO", 643448799, 643804313 +C: "OO", 643804313, 645908167 +C: "OO", 645908167, 646635670 +C: "OO", 646635670, 646874115 +C: "OO", 646874115, 647871609 +C: "OO", 647871609, 648079430 +C: "OO", 648079430, 648107573 +C: "OO", 648107573, 648113037 +C: "OO", 648113037, 648394084 +C: "OO", 648394084, 649039427 +C: "OO", 649039427, 649896109 +C: "OO", 649896109, 649927924 +C: "OO", 649927924, 650216260 +C: "OO", 650216260, 650900655 +C: "OO", 650900655, 650926886 +C: "OO", 650926886, 650940295 +C: "OO", 650940295, 651211731 +C: "OO", 651211731, 651215269 +C: "OO", 651215269, 651227192 +C: "OO", 651227192, 651420764 +C: "OO", 651420764, 652126503 +C: "OO", 652126503, 652409070 +C: "OO", 652409070, 653999422 +C: "OO", 653999422, 654190159 +C: "OO", 654190159, 656555215 +C: "OO", 656555215, 658172084 +C: "OO", 658172084, 658227517 +C: "OO", 658227517, 658507845 +C: "OO", 658507845, 659653599 +C: "OO", 659653599, 660112317 +C: "OO", 660112317, 660644637 +C: "OO", 660644637, 661172660 +C: "OO", 661172660, 661486617 +C: "OO", 661486617, 661557527 +C: "OO", 661557527, 662327237 +C: "OO", 662327237, 662884087 +C: "OO", 662884087, 665026629 +C: "OO", 665026629, 665184821 +C: "OO", 665184821, 665780522 +C: "OO", 665780522, 665994626 +C: "OO", 665994626, 666449778 +C: "OO", 666449778, 666463846 +C: "OO", 666463846, 666552022 +C: "OO", 666552022, 668104631 +C: "OO", 668104631, 668472525 +C: "OO", 668472525, 669223137 +C: "OO", 669223137, 669395554 +C: "OO", 669395554, 669679867 +C: "OO", 669679867, 670701311 +C: "OO", 670701311, 670843118 +C: "OO", 670843118, 670933201 +C: "OO", 670933201, 671520383 +C: "OO", 671520383, 672102430 +C: "OO", 672102430, 672389491 +C: "OO", 672389491, 672464912 +C: "OO", 672464912, 672579124 +C: "OO", 672579124, 673425954 +C: "OO", 673425954, 673441988 +C: "OO", 673441988, 673651418 +C: "OO", 673651418, 673778998 +C: "OO", 673778998, 673801862 +C: "OO", 673801862, 673850615 +C: "OO", 673850615, 674000231 +C: "OO", 674000231, 675262901 +C: "OO", 675262901, 675763454 +C: "OO", 675763454, 676914601 +C: "OO", 676914601, 677851694 +C: "OO", 677851694, 678311516 +C: "OO", 678311516, 678504149 +C: "OO", 678504149, 678844695 +C: "OO", 678844695, 679238552 +C: "OO", 679238552, 679603930 +C: "OO", 679603930, 679765138 +C: "OO", 679765138, 681054001 +C: "OO", 681054001, 681460438 +C: "OO", 681460438, 681553887 +C: "OO", 681553887, 681881090 +C: "OO", 681881090, 683277137 +C: "OO", 683277137, 685764497 +C: "OO", 685764497, 686226522 +C: "OO", 686226522, 687388794 +C: "OO", 687388794, 687483005 +C: "OO", 687483005, 687545048 +C: "OO", 687545048, 687624338 +C: "OO", 687624338, 687813213 +C: "OO", 687813213, 688092739 +C: "OO", 688092739, 688313193 +C: "OO", 688313193, 689000371 +C: "OO", 689000371, 689552781 +C: "OO", 689552781, 689689684 +C: "OO", 689689684, 690304287 +C: "OO", 690304287, 690565972 +C: "OO", 690565972, 690886573 +C: "OO", 690886573, 692645229 +C: "OO", 692645229, 692750731 +C: "OO", 692750731, 693804511 +C: "OO", 693804511, 693997875 +C: "OO", 693997875, 695410370 +C: "OO", 695410370, 697346507 +C: "OO", 697346507, 697979836 +C: "OO", 697979836, 698326490 +C: "OO", 698326490, 699104521 +C: "OO", 699104521, 699724406 +C: "OO", 699724406, 699855141 +C: "OO", 699855141, 699982125 +C: "OO", 699982125, 700405265 +C: "OO", 700405265, 701258618 +C: "OO", 701258618, 702326775 +C: "OO", 702326775, 702637635 +C: "OO", 702637635, 704758876 +C: "OO", 704758876, 704812270 +C: "OO", 704812270, 705295459 +C: "OO", 705295459, 705487127 +C: "OO", 705487127, 706843353 +C: "OO", 706843353, 706911582 +C: "OO", 706911582, 711220564 +C: "OO", 711220564, 711495995 +C: "OO", 711495995, 711546111 +C: "OO", 711546111, 711853746 +C: "OO", 711853746, 711912366 +C: "OO", 711912366, 712691540 +C: "OO", 712691540, 712942973 +C: "OO", 712942973, 713504363 +C: "OO", 713504363, 713734839 +C: "OO", 713734839, 714006666 +C: "OO", 714006666, 714671859 +C: "OO", 714671859, 715082537 +C: "OO", 715082537, 715237172 +C: "OO", 715237172, 718089503 +C: "OO", 718089503, 718493226 +C: "OO", 718493226, 718903305 +C: "OO", 718903305, 720313875 +C: "OO", 720313875, 721670523 +C: "OO", 721670523, 721746425 +C: "OO", 721746425, 722347769 +C: "OO", 722347769, 722810881 +C: "OO", 722810881, 725815544 +C: "OO", 725815544, 726691501 +C: "OO", 726691501, 726788409 +C: "OO", 726788409, 726929500 +C: "OO", 726929500, 727160725 +C: "OO", 727160725, 727377137 +C: "OO", 727377137, 729491211 +C: "OO", 729491211, 729657710 +C: "OO", 729657710, 730918242 +C: "OO", 730918242, 731167801 +C: "OO", 731167801, 732157817 +C: "OO", 732157817, 732477557 +C: "OO", 732477557, 733656350 +C: "OO", 733656350, 733949810 +C: "OO", 733949810, 735955221 +C: "OO", 735955221, 736686054 +C: "OO", 736686054, 737344691 +C: "OO", 737344691, 738811545 +C: "OO", 738811545, 738903289 +C: "OO", 738903289, 740418316 +C: "OO", 740418316, 740466277 +C: "OO", 740466277, 741164913 +C: "OO", 741164913, 741779770 +C: "OO", 741779770, 741838088 +C: "OO", 741838088, 742926970 +C: "OO", 742926970, 743073774 +C: "OO", 743073774, 743835801 +C: "OO", 743835801, 744838897 +C: "OO", 744838897, 745011356 +C: "OO", 745011356, 745300985 +C: "OO", 745300985, 745814981 +C: "OO", 745814981, 747860307 +C: "OO", 747860307, 748029366 +C: "OO", 748029366, 748476211 +C: "OO", 748476211, 748509907 +C: "OO", 748509907, 750646422 +C: "OO", 750646422, 751732603 +C: "OO", 751732603, 752116425 +C: "OO", 752116425, 752618790 +C: "OO", 752618790, 752729463 +C: "OO", 752729463, 754704847 +C: "OO", 754704847, 755078108 +C: "OO", 755078108, 756716253 +C: "OO", 756716253, 757292507 +C: "OO", 757292507, 757771179 +C: "OO", 757771179, 757832143 +C: "OO", 757832143, 758415654 +C: "OO", 758415654, 759128625 +C: "OO", 759128625, 759332990 +C: "OO", 759332990, 759377087 +C: "OO", 759377087, 761468446 +C: "OO", 761468446, 761482510 +C: "OO", 761482510, 762040871 +C: "OO", 762040871, 763479404 +C: "OO", 763479404, 764154239 +C: "OO", 764154239, 765192314 +C: "OO", 765192314, 765532029 +C: "OO", 765532029, 765740926 +C: "OO", 765740926, 766191405 +C: "OO", 766191405, 766344106 +C: "OO", 766344106, 766427762 +C: "OO", 766427762, 766923653 +C: "OO", 766923653, 767411999 +C: "OO", 767411999, 769223788 +C: "OO", 769223788, 769797157 +C: "OO", 769797157, 770631083 +C: "OO", 770631083, 772713130 +C: "OO", 772713130, 773649476 +C: "OO", 773649476, 774131553 +C: "OO", 774131553, 775126855 +C: "OO", 775126855, 777796568 +C: "OO", 777796568, 777905925 +C: "OO", 777905925, 779031463 +C: "OO", 779031463, 779592139 +C: "OO", 779592139, 780158300 +C: "OO", 780158300, 781423495 +C: "OO", 781423495, 782258120 +C: "OO", 782258120, 782322661 +C: "OO", 782322661, 782854265 +C: "OO", 782854265, 783373221 +C: "OO", 783373221, 783422138 +C: "OO", 783422138, 784741467 +C: "OO", 784741467, 785716348 +C: "OO", 785716348, 785848122 +C: "OO", 785848122, 786998865 +C: "OO", 786998865, 787837337 +C: "OO", 787837337, 789066563 +C: "OO", 789066563, 789234437 +C: "OO", 789234437, 789698037 +C: "OO", 789698037, 789996478 +C: "OO", 789996478, 790739706 +C: "OO", 790739706, 791015308 +C: "OO", 791015308, 791724994 +C: "OO", 791724994, 791729049 +C: "OO", 791729049, 792004196 +C: "OO", 792004196, 792491567 +C: "OO", 792491567, 794903610 +C: "OO", 794903610, 795149629 +C: "OO", 795149629, 796754262 +C: "OO", 796754262, 798224610 +C: "OO", 798224610, 798440492 +C: "OO", 798440492, 800812534 +C: "OO", 800812534, 801200504 +C: "OO", 801200504, 801411722 +C: "OO", 801411722, 802604799 +C: "OO", 802604799, 803353052 +C: "OO", 803353052, 804586683 +C: "OO", 804586683, 804895754 +C: "OO", 804895754, 805204694 +C: "OO", 805204694, 805415939 +C: "OO", 805415939, 805443691 +C: "OO", 805443691, 805561951 +C: "OO", 805561951, 806295477 +C: "OO", 806295477, 806909606 +C: "OO", 806909606, 807150666 +C: "OO", 807150666, 808674457 +C: "OO", 808674457, 808834839 +C: "OO", 808834839, 809522015 +C: "OO", 809522015, 809577032 +C: "OO", 809577032, 810203085 +C: "OO", 810203085, 811278535 +C: "OO", 811278535, 811358793 +C: "OO", 811358793, 813207887 +C: "OO", 813207887, 813860906 +C: "OO", 813860906, 814189675 +C: "OO", 814189675, 815607725 +C: "OO", 815607725, 817013073 +C: "OO", 817013073, 817225138 +C: "OO", 817225138, 817355262 +C: "OO", 817355262, 817637597 +C: "OO", 817637597, 817998728 +C: "OO", 817998728, 819464411 +C: "OO", 819464411, 820121795 +C: "OO", 820121795, 820406618 +C: "OO", 820406618, 820847101 +C: "OO", 820847101, 820881627 +C: "OO", 820881627, 820952481 +C: "OO", 820952481, 821653415 +C: "OO", 821653415, 821680732 +C: "OO", 821680732, 821853469 +C: "OO", 821853469, 822271718 +C: "OO", 822271718, 822795622 +C: "OO", 822795622, 822856454 +C: "OO", 822856454, 823322372 +C: "OO", 823322372, 823635367 +C: "OO", 823635367, 824609867 +C: "OO", 824609867, 825179347 +C: "OO", 825179347, 826213999 +C: "OO", 826213999, 826629478 +C: "OO", 826629478, 826684242 +C: "OO", 826684242, 826972580 +C: "OO", 826972580, 827604525 +C: "OO", 827604525, 828157419 +C: "OO", 828157419, 830138764 +C: "OO", 830138764, 830854651 +C: "OO", 830854651, 830988723 +C: "OO", 830988723, 832843578 +C: "OO", 832843578, 832980380 +C: "OO", 832980380, 834857166 +C: "OO", 834857166, 837673943 +C: "OO", 837673943, 838297759 +C: "OO", 838297759, 838423921 +C: "OO", 838423921, 838846182 +C: "OO", 838846182, 839909579 +C: "OO", 839909579, 841102027 +C: "OO", 841102027, 842607265 +C: "OO", 842607265, 842731390 +C: "OO", 842731390, 843051146 +C: "OO", 843051146, 843459134 +C: "OO", 843459134, 844090583 +C: "OO", 844090583, 844308682 +C: "OO", 844308682, 844730552 +C: "OO", 844730552, 844869830 +C: "OO", 844869830, 845369202 +C: "OO", 845369202, 845916609 +C: "OO", 845916609, 846056956 +C: "OO", 846056956, 846609649 +C: "OO", 846609649, 846615209 +C: "OO", 846615209, 846816272 +C: "OO", 846816272, 847018370 +C: "OO", 847018370, 848461565 +C: "OO", 848461565, 848773827 +C: "OO", 848773827, 849647182 +C: "OO", 849647182, 849685970 +C: "OO", 849685970, 849705897 +C: "OO", 849705897, 850017988 +C: "OO", 850017988, 850669724 +C: "OO", 850669724, 850709661 +C: "OO", 850709661, 850869027 +C: "OO", 850869027, 851273345 +C: "OO", 851273345, 851463713 +C: "OO", 851463713, 851485857 +C: "OO", 851485857, 851714610 +C: "OO", 851714610, 852938938 +C: "OO", 852938938, 853356610 +C: "OO", 853356610, 854649885 +C: "OO", 854649885, 855584324 +C: "OO", 855584324, 855756203 +C: "OO", 855756203, 855985833 +C: "OO", 855985833, 855989126 +C: "OO", 855989126, 856319787 +C: "OO", 856319787, 856324754 +C: "OO", 856324754, 856394033 +C: "OO", 856394033, 856785820 +C: "OO", 856785820, 857192250 +C: "OO", 857192250, 857399884 +C: "OO", 857399884, 860030521 +C: "OO", 860030521, 860404287 +C: "OO", 860404287, 860695665 +C: "OO", 860695665, 860880666 +C: "OO", 860880666, 860908377 +C: "OO", 860908377, 861688386 +C: "OO", 861688386, 862192078 +C: "OO", 862192078, 862677982 +C: "OO", 862677982, 863366357 +C: "OO", 863366357, 863613887 +C: "OO", 863613887, 864572217 +C: "OO", 864572217, 864773072 +C: "OO", 864773072, 864848877 +C: "OO", 864848877, 865646967 +C: "OO", 865646967, 867075729 +C: "OO", 867075729, 867178736 +C: "OO", 867178736, 867404727 +C: "OO", 867404727, 867842838 +C: "OO", 867842838, 868148338 +C: "OO", 868148338, 868253109 +C: "OO", 868253109, 870766880 +C: "OO", 870766880, 870895397 +C: "OO", 870895397, 871544672 +C: "OO", 871544672, 871687636 +C: "OO", 871687636, 871821330 +C: "OO", 871821330, 873824370 +C: "OO", 873824370, 875565655 +C: "OO", 875565655, 875675285 +C: "OO", 875675285, 876494362 +C: "OO", 876494362, 877144627 +C: "OO", 877144627, 881815664 +C: "OO", 881815664, 882136735 +C: "OO", 882136735, 882193855 +C: "OO", 882193855, 882452351 +C: "OO", 882452351, 882990944 +C: "OO", 882990944, 884453360 +C: "OO", 884453360, 885954695 +C: "OO", 885954695, 886881305 +C: "OO", 886881305, 887369769 +C: "OO", 887369769, 887879619 +C: "OO", 887879619, 888349041 +C: "OO", 888349041, 888558901 +C: "OO", 888558901, 889025334 +C: "OO", 889025334, 889103884 +C: "OO", 889103884, 889153785 +C: "OO", 889153785, 889345738 +C: "OO", 889345738, 889442365 +C: "OO", 889442365, 889658086 +C: "OO", 889658086, 890039150 +C: "OO", 890039150, 892025831 +C: "OO", 892025831, 892095169 +C: "OO", 892095169, 892944019 +C: "OO", 892944019, 893222638 +C: "OO", 893222638, 893348168 +C: "OO", 893348168, 893379608 +C: "OO", 893379608, 893860143 +C: "OO", 893860143, 894469823 +C: "OO", 894469823, 895642510 +C: "OO", 895642510, 895730698 +C: "OO", 895730698, 896310291 +C: "OO", 896310291, 897205727 +C: "OO", 897205727, 897251371 +C: "OO", 897251371, 897750031 +C: "OO", 897750031, 898487325 +C: "OO", 898487325, 898531526 +C: "OO", 898531526, 899785554 +C: "OO", 899785554, 899805641 +C: "OO", 899805641, 900046322 +C: "OO", 900046322, 900867430 +C: "OO", 900867430, 901996281 +C: "OO", 901996281, 902191252 +C: "OO", 902191252, 902530129 +C: "OO", 902530129, 903224930 +C: "OO", 903224930, 903676446 +C: "OO", 903676446, 904432909 +C: "OO", 904432909, 904917695 +C: "OO", 904917695, 906710986 +C: "OO", 906710986, 907955563 +C: "OO", 907955563, 908194174 +C: "OO", 908194174, 909062048 +C: "OO", 909062048, 909332329 +C: "OO", 909332329, 910620642 +C: "OO", 910620642, 910656140 +C: "OO", 910656140, 911043010 +C: "OO", 911043010, 911683427 +C: "OO", 911683427, 912213677 +C: "OO", 912213677, 912263531 +C: "OO", 912263531, 912417034 +C: "OO", 912417034, 912637671 +C: "OO", 912637671, 912750597 +C: "OO", 912750597, 913074533 +C: "OO", 913074533, 913560932 +C: "OO", 913560932, 915159729 +C: "OO", 915159729, 915402618 +C: "OO", 915402618, 919412257 +C: "OO", 919412257, 919466409 +C: "OO", 919466409, 919732426 +C: "OO", 919732426, 919802049 +C: "OO", 919802049, 919935769 +C: "OO", 919935769, 920077489 +C: "OO", 920077489, 920215878 +C: "OO", 920215878, 920999084 +C: "OO", 920999084, 921022099 +C: "OO", 921022099, 923138697 +C: "OO", 923138697, 924399417 +C: "OO", 924399417, 924743343 +C: "OO", 924743343, 925820937 +C: "OO", 925820937, 926066469 +C: "OO", 926066469, 926350807 +C: "OO", 926350807, 926627127 +C: "OO", 926627127, 926944997 +C: "OO", 926944997, 927012331 +C: "OO", 927012331, 927662258 +C: "OO", 927662258, 927834205 +C: "OO", 927834205, 928754306 +C: "OO", 928754306, 929024370 +C: "OO", 929024370, 929045339 +C: "OO", 929045339, 929055197 +C: "OO", 929055197, 929533100 +C: "OO", 929533100, 929747192 +C: "OO", 929747192, 930079052 +C: "OO", 930079052, 930139851 +C: "OO", 930139851, 930207699 +C: "OO", 930207699, 931072694 +C: "OO", 931072694, 931317638 +C: "OO", 931317638, 932633282 +C: "OO", 932633282, 935052943 +C: "OO", 935052943, 935776732 +C: "OO", 935776732, 936070952 +C: "OO", 936070952, 936203134 +C: "OO", 936203134, 936830452 +C: "OO", 936830452, 936987453 +C: "OO", 936987453, 937732650 +C: "OO", 937732650, 938630321 +C: "OO", 938630321, 939015782 +C: "OO", 939015782, 939964057 +C: "OO", 939964057, 940067885 +C: "OO", 940067885, 941339293 +C: "OO", 941339293, 941477559 +C: "OO", 941477559, 941793922 +C: "OO", 941793922, 943023042 +C: "OO", 943023042, 943185076 +C: "OO", 943185076, 943282074 +C: "OO", 943282074, 943333111 +C: "OO", 943333111, 943408645 +C: "OO", 943408645, 944196731 +C: "OO", 944196731, 944442200 +C: "OO", 944442200, 944706453 +C: "OO", 944706453, 945966370 +C: "OO", 945966370, 946223826 +C: "OO", 946223826, 946354338 +C: "OO", 946354338, 947996757 +C: "OO", 947996757, 948996403 +C: "OO", 948996403, 950274207 +C: "OO", 950274207, 950469413 +C: "OO", 950469413, 951336313 +C: "OO", 951336313, 951995667 +C: "OO", 951995667, 952600143 +C: "OO", 952600143, 953128753 +C: "OO", 953128753, 953217407 +C: "OO", 953217407, 953405021 +C: "OO", 953405021, 953590623 +C: "OO", 953590623, 953979299 +C: "OO", 953979299, 955079429 +C: "OO", 955079429, 955944450 +C: "OO", 955944450, 956107869 +C: "OO", 956107869, 956547629 +C: "OO", 956547629, 958661636 +C: "OO", 958661636, 959409141 +C: "OO", 959409141, 959773453 +C: "OO", 959773453, 960272251 +C: "OO", 960272251, 960388890 +C: "OO", 960388890, 961166023 +C: "OO", 961166023, 962714979 +C: "OO", 962714979, 962749633 +C: "OO", 962749633, 963233249 +C: "OO", 963233249, 964771023 +C: "OO", 964771023, 965986054 +C: "OO", 965986054, 966171135 +C: "OO", 966171135, 967280668 +C: "OO", 967280668, 967566967 +C: "OO", 967566967, 967631151 +C: "OO", 967631151, 968686830 +C: "OO", 968686830, 969365879 +C: "OO", 969365879, 969483038 +C: "OO", 969483038, 970702618 +C: "OO", 970702618, 971624483 +C: "OO", 971624483, 972026836 +C: "OO", 972026836, 972180647 +C: "OO", 972180647, 972779273 +C: "OO", 972779273, 973193902 +C: "OO", 973193902, 973289077 +C: "OO", 973289077, 973451830 +C: "OO", 973451830, 973471547 +C: "OO", 973471547, 973903097 +C: "OO", 973903097, 974307774 +C: "OO", 974307774, 974492017 +C: "OO", 974492017, 974523263 +C: "OO", 974523263, 975437857 +C: "OO", 975437857, 975471173 +C: "OO", 975471173, 975509170 +C: "OO", 975509170, 975894383 +C: "OO", 975894383, 977106243 +C: "OO", 977106243, 977747072 +C: "OO", 977747072, 977921134 +C: "OO", 977921134, 978349926 +C: "OO", 978349926, 978848219 +C: "OO", 978848219, 979040474 +C: "OO", 979040474, 979192321 +C: "OO", 979192321, 979608651 +C: "OO", 979608651, 979960442 +C: "OO", 979960442, 981239702 +C: "OO", 981239702, 981410188 +C: "OO", 981410188, 981417788 +C: "OO", 981417788, 982338543 +C: "OO", 982338543, 983266724 +C: "OO", 983266724, 984451042 +C: "OO", 984451042, 984474428 +C: "OO", 984474428, 985445308 +C: "OO", 985445308, 985568461 +C: "OO", 985568461, 985672635 +C: "OO", 985672635, 986062913 +C: "OO", 986062913, 986954237 +C: "OO", 986954237, 987157940 +C: "OO", 987157940, 987365345 +C: "OO", 987365345, 987547748 +C: "OO", 987547748, 987870321 +C: "OO", 987870321, 988524119 +C: "OO", 988524119, 988788652 +C: "OO", 988788652, 989001820 +C: "OO", 989001820, 989101370 +C: "OO", 989101370, 989810125 +C: "OO", 989810125, 990342618 +C: "OO", 990342618, 991543566 +C: "OO", 991543566, 991604893 +C: "OO", 991604893, 991912703 +C: "OO", 991912703, 992932514 +C: "OO", 992932514, 993509875 +C: "OO", 993509875, 994543420 +C: "OO", 994543420, 994694373 +C: "OO", 994694373, 994885627 +C: "OO", 994885627, 995185844 +C: "OO", 995185844, 995550870 +C: "OO", 995550870, 996687800 +C: "OO", 996687800, 997590214 +C: "OO", 997590214, 997617934 +C: "OO", 997617934, 998185833 +C: "OO", 998185833, 998192303 +C: "OO", 998192303, 998449097 +C: "OO", 998449097, 998662132 +C: "OO", 998662132, 999747741 +C: "OO", 999747741, 1000916734 +C: "OO", 1000916734, 1001490285 +C: "OO", 1001490285, 1001510116 +C: "OO", 1001510116, 1002062647 +C: "OO", 1002062647, 1002465129 +C: "OO", 1002465129, 1002591447 +C: "OO", 1002591447, 1002613689 +C: "OO", 1002613689, 1004094604 +C: "OO", 1004094604, 1004430915 +C: "OO", 1004430915, 1004514635 +C: "OO", 1004514635, 1004537495 +C: "OO", 1004537495, 1004994343 +C: "OO", 1004994343, 1005672289 +C: "OO", 1005672289, 1006066604 +C: "OO", 1006066604, 1007578438 +C: "OO", 1007578438, 1007660731 +C: "OO", 1007660731, 1009657838 +C: "OO", 1009657838, 1009752503 +C: "OO", 1009752503, 1010194561 +C: "OO", 1010194561, 1011121496 +C: "OO", 1011121496, 1011380282 +C: "OO", 1011380282, 1011661001 +C: "OO", 1011661001, 1011983661 +C: "OO", 1011983661, 1014195166 +C: "OO", 1014195166, 1015575769 +C: "OO", 1015575769, 1016554017 +C: "OO", 1016554017, 1017262647 +C: "OO", 1017262647, 1017414881 +C: "OO", 1017414881, 1017894403 +C: "OO", 1017894403, 1018119284 +C: "OO", 1018119284, 1018194290 +C: "OO", 1018194290, 1018611461 +C: "OO", 1018611461, 1019321129 +C: "OO", 1019321129, 1020387873 +C: "OO", 1020387873, 1022385506 +C: "OO", 1022385506, 1022696242 +C: "OO", 1022696242, 1023750797 +C: "OO", 1023750797, 1023907839 +C: "OO", 1023907839, 1024261671 +C: "OO", 1024261671, 1024311908 +C: "OO", 1024311908, 1025292028 +C: "OO", 1025292028, 1025811220 +C: "OO", 1025811220, 1026690755 +C: "OO", 1026690755, 1026953441 +C: "OO", 1026953441, 1027807458 +C: "OO", 1027807458, 1028657421 +C: "OO", 1028657421, 1028850466 +C: "OO", 1028850466, 1029000205 +C: "OO", 1029000205, 1029343867 +C: "OO", 1029343867, 1029632378 +C: "OO", 1029632378, 1031882473 +C: "OO", 1031882473, 1034653965 +C: "OO", 1034653965, 1034761498 +C: "OO", 1034761498, 1035131804 +C: "OO", 1035131804, 1035306731 +C: "OO", 1035306731, 1037563310 +C: "OO", 1037563310, 1038145219 +C: "OO", 1038145219, 1039192966 +C: "OO", 1039192966, 1039646754 +C: "OO", 1039646754, 1040125297 +C: "OO", 1040125297, 1040540254 +C: "OO", 1040540254, 1040617049 +C: "OO", 1040617049, 1041063825 +C: "OO", 1041063825, 1041867193 +C: "OO", 1041867193, 1043041822 +C: "OO", 1043041822, 1043068986 +C: "OO", 1043068986, 1043516858 +C: "OO", 1043516858, 1043680407 +C: "OO", 1043680407, 1043865062 +C: "OO", 1043865062, 1044114237 +C: "OO", 1044114237, 1044422338 +C: "OO", 1044422338, 1045409362 +C: "OO", 1045409362, 1046485418 +C: "OO", 1046485418, 1046550877 +C: "OO", 1046550877, 1046575300 +C: "OO", 1046575300, 1047844825 +C: "OO", 1047844825, 1050285527 +C: "OO", 1050285527, 1050883519 +C: "OO", 1050883519, 1052449928 +C: "OO", 1052449928, 1053653228 +C: "OO", 1053653228, 1053901502 +C: "OO", 1053901502, 1054762295 +C: "OO", 1054762295, 1055047161 +C: "OO", 1055047161, 1055168350 +C: "OO", 1055168350, 1055816397 +C: "OO", 1055816397, 1056612371 +C: "OO", 1056612371, 1056671165 +C: "OO", 1056671165, 1057166598 +C: "OO", 1057166598, 1058605401 +C: "OO", 1058605401, 1059250011 +C: "OO", 1059250011, 1059893212 +C: "OO", 1059893212, 1060605859 +C: "OO", 1060605859, 1062349661 +C: "OO", 1062349661, 1062900881 +C: "OO", 1062900881, 1063477038 +C: "OO", 1063477038, 1067127215 +C: "OO", 1067127215, 1067444673 +C: "OO", 1067444673, 1068300779 +C: "OO", 1068300779, 1068319949 +C: "OO", 1068319949, 1068371899 +C: "OO", 1068371899, 1069017322 +C: "OO", 1069017322, 1069272018 +C: "OO", 1069272018, 1070007887 +C: "OO", 1070007887, 1071393494 +C: "OO", 1071393494, 1071765837 +C: "OO", 1071765837, 1072181974 +C: "OO", 1072181974, 1072215951 +C: "OO", 1072215951, 1072528756 +C: "OO", 1072528756, 1072552326 +C: "OO", 1072552326, 1073570683 +C: "OO", 1073570683, 1074072918 +C: "OO", 1074072918, 1074544180 +C: "OO", 1074544180, 1074852126 +C: "OO", 1074852126, 1077128763 +C: "OO", 1077128763, 1077209060 +C: "OO", 1077209060, 1077214017 +C: "OO", 1077214017, 1077243257 +C: "OO", 1077243257, 1078148245 +C: "OO", 1078148245, 1078617892 +C: "OO", 1078617892, 1080922876 +C: "OO", 1080922876, 1081116442 +C: "OO", 1081116442, 1081922474 +C: "OO", 1081922474, 1082430079 +C: "OO", 1082430079, 1083970995 +C: "OO", 1083970995, 1084385425 +C: "OO", 1084385425, 1084561588 +C: "OO", 1084561588, 1085634124 +C: "OO", 1085634124, 1085929358 +C: "OO", 1085929358, 1086067729 +C: "OO", 1086067729, 1086271748 +C: "OO", 1086271748, 1088487461 +C: "OO", 1088487461, 1090230417 +C: "OO", 1090230417, 1090680615 +C: "OO", 1090680615, 1090712835 +C: "OO", 1090712835, 1092261158 +C: "OO", 1092261158, 1092314878 +C: "OO", 1092314878, 1092496052 +C: "OO", 1092496052, 1092787183 +C: "OO", 1092787183, 1093214193 +C: "OO", 1093214193, 1093493487 +C: "OO", 1093493487, 1093538634 +C: "OO", 1093538634, 1094095156 +C: "OO", 1094095156, 1096364564 +C: "OO", 1096364564, 1098666603 +C: "OO", 1098666603, 1098905722 +C: "OO", 1098905722, 1098909461 +C: "OO", 1098909461, 1099267385 +C: "OO", 1099267385, 1099280308 +C: "OO", 1099280308, 1099328639 +C: "OO", 1099328639, 1099966751 +C: "OO", 1099966751, 1100299623 +C: "OO", 1100299623, 1100338857 +C: "OO", 1100338857, 1100664351 +C: "OO", 1100664351, 1100869314 +C: "OO", 1100869314, 1101513584 +C: "OO", 1101513584, 1103335265 +C: "OO", 1103335265, 1103340227 +C: "OO", 1103340227, 1103658139 +C: "OO", 1103658139, 1104487614 +C: "OO", 1104487614, 1105032255 +C: "OO", 1105032255, 1106637650 +C: "OO", 1106637650, 1106723006 +C: "OO", 1106723006, 1107414673 +C: "OO", 1107414673, 1107541774 +C: "OO", 1107541774, 1108028210 +C: "OO", 1108028210, 1109104804 +C: "OO", 1109104804, 1109359653 +C: "OO", 1109359653, 1111169829 +C: "OO", 1111169829, 1111879016 +C: "OO", 1111879016, 1113162710 +C: "OO", 1113162710, 1115586143 +C: "OO", 1115586143, 1116014271 +C: "OO", 1116014271, 1116361429 +C: "OO", 1116361429, 1116475686 +C: "OO", 1116475686, 1117167883 +C: "OO", 1117167883, 1117670096 +C: "OO", 1117670096, 1117906153 +C: "OO", 1117906153, 1119996038 +C: "OO", 1119996038, 1121187734 +C: "OO", 1121187734, 1121537339 +C: "OO", 1121537339, 1122332258 +C: "OO", 1122332258, 1122437954 +C: "OO", 1122437954, 1122615100 +C: "OO", 1122615100, 1123266035 +C: "OO", 1123266035, 1123540011 +C: "OO", 1123540011, 1124668604 +C: "OO", 1124668604, 1124958326 +C: "OO", 1124958326, 1129128938 +C: "OO", 1129128938, 1130184993 +C: "OO", 1130184993, 1130453993 +C: "OO", 1130453993, 1133396022 +C: "OO", 1133396022, 1134200170 +C: "OO", 1134200170, 1134822523 +C: "OO", 1134822523, 1135210185 +C: "OO", 1135210185, 1137101871 +C: "OO", 1137101871, 1137450686 +C: "OO", 1137450686, 1137590528 +C: "OO", 1137590528, 1138324518 +C: "OO", 1138324518, 1138591946 +C: "OO", 1138591946, 1139135751 +C: "OO", 1139135751, 1139592779 +C: "OO", 1139592779, 1139679675 +C: "OO", 1139679675, 1140217940 +C: "OO", 1140217940, 1143082347 +C: "OO", 1143082347, 1143297946 +C: "OO", 1143297946, 1143508235 +C: "OO", 1143508235, 1143652997 +C: "OO", 1143652997, 1144227554 +C: "OO", 1144227554, 1144328845 +C: "OO", 1144328845, 1145675204 +C: "OO", 1145675204, 1146107912 +C: "OO", 1146107912, 1147387847 +C: "OO", 1147387847, 1147757901 +C: "OO", 1147757901, 1147844151 +C: "OO", 1147844151, 1150297579 +C: "OO", 1150297579, 1152006358 +C: "OO", 1152006358, 1152073814 +C: "OO", 1152073814, 1152462436 +C: "OO", 1152462436, 1152760349 +C: "OO", 1152760349, 1153244158 +C: "OO", 1153244158, 1153495695 +C: "OO", 1153495695, 1153641080 +C: "OO", 1153641080, 1153647797 +C: "OO", 1153647797, 1153889526 +C: "OO", 1153889526, 1154939133 +C: "OO", 1154939133, 1155365775 +C: "OO", 1155365775, 1155397291 +C: "OO", 1155397291, 1155985274 +C: "OO", 1155985274, 1156032838 +C: "OO", 1156032838, 1156058331 +C: "OO", 1156058331, 1156948868 +C: "OO", 1156948868, 1157034931 +C: "OO", 1157034931, 1157384745 +C: "OO", 1157384745, 1157591749 +C: "OO", 1157591749, 1158751955 +C: "OO", 1158751955, 1159382294 +C: "OO", 1159382294, 1160538977 +C: "OO", 1160538977, 1161096569 +C: "OO", 1161096569, 1161497134 +C: "OO", 1161497134, 1161499178 +C: "OO", 1161499178, 1161501715 +C: "OO", 1161501715, 1162099876 +C: "OO", 1162099876, 1162173610 +C: "OO", 1162173610, 1162981865 +C: "OO", 1162981865, 1164009675 +C: "OO", 1164009675, 1164464623 +C: "OO", 1164464623, 1165028457 +C: "OO", 1165028457, 1165050788 +C: "OO", 1165050788, 1167528571 +C: "OO", 1167528571, 1168689469 +C: "OO", 1168689469, 1168883791 +C: "OO", 1168883791, 1169342869 +C: "OO", 1169342869, 1169389012 +C: "OO", 1169389012, 1170102927 +C: "OO", 1170102927, 1170740212 +C: "OO", 1170740212, 1170789870 +C: "OO", 1170789870, 1173885329 +C: "OO", 1173885329, 1174042928 +C: "OO", 1174042928, 1175718925 +C: "OO", 1175718925, 1176996494 +C: "OO", 1176996494, 1177690910 +C: "OO", 1177690910, 1177863711 +C: "OO", 1177863711, 1178150069 +C: "OO", 1178150069, 1183012262 +C: "OO", 1183012262, 1183076081 +C: "OO", 1183076081, 1183089681 +C: "OO", 1183089681, 1183106830 +C: "OO", 1183106830, 1183299143 +C: "OO", 1183299143, 1185570368 +C: "OO", 1185570368, 1188169998 +C: "OO", 1188169998, 1188340817 +C: "OO", 1188340817, 1188857827 +C: "OO", 1188857827, 1190906569 +C: "OO", 1190906569, 1192681326 +C: "OO", 1192681326, 1193593223 +C: "OO", 1193593223, 1194187506 +C: "OO", 1194187506, 1194990946 +C: "OO", 1194990946, 1195899379 +C: "OO", 1195899379, 1195991895 +C: "OO", 1195991895, 1196445697 +C: "OO", 1196445697, 1196472781 +C: "OO", 1196472781, 1197566013 +C: "OO", 1197566013, 1199185302 +C: "OO", 1199185302, 1199631377 +C: "OO", 1199631377, 1200198704 +C: "OO", 1200198704, 1200961376 +C: "OO", 1200961376, 1201431793 +C: "OO", 1201431793, 1201815430 +C: "OO", 1201815430, 1202005898 +C: "OO", 1202005898, 1202384766 +C: "OO", 1202384766, 1202586365 +C: "OO", 1202586365, 1203052967 +C: "OO", 1203052967, 1203178881 +C: "OO", 1203178881, 1204152506 +C: "OO", 1204152506, 1204821989 +C: "OO", 1204821989, 1204918809 +C: "OO", 1204918809, 1204968326 +C: "OO", 1204968326, 1205820457 +C: "OO", 1205820457, 1206021157 +C: "OO", 1206021157, 1206067745 +C: "OO", 1206067745, 1206332267 +C: "OO", 1206332267, 1206950911 +C: "OO", 1206950911, 1206951831 +C: "OO", 1206951831, 1207030588 +C: "OO", 1207030588, 1207568926 +C: "OO", 1207568926, 1207883958 +C: "OO", 1207883958, 1208763122 +C: "OO", 1208763122, 1210244503 +C: "OO", 1210244503, 1211416407 +C: "OO", 1211416407, 1211996867 +C: "OO", 1211996867, 1212912459 +C: "OO", 1212912459, 1213299222 +C: "OO", 1213299222, 1213491871 +C: "OO", 1213491871, 1214085502 +C: "OO", 1214085502, 1214273785 +C: "OO", 1214273785, 1215142173 +C: "OO", 1215142173, 1215525874 +C: "OO", 1215525874, 1215729916 +C: "OO", 1215729916, 1215822571 +C: "OO", 1215822571, 1216917773 +C: "OO", 1216917773, 1219702534 +C: "OO", 1219702534, 1219761651 +C: "OO", 1219761651, 1220295017 +C: "OO", 1220295017, 1221355106 +C: "OO", 1221355106, 1222274312 +C: "OO", 1222274312, 1222342211 +C: "OO", 1222342211, 1222947261 +C: "OO", 1222947261, 1223795366 +C: "OO", 1223795366, 1224778649 +C: "OO", 1224778649, 1224817489 +C: "OO", 1224817489, 1225355293 +C: "OO", 1225355293, 1226078085 +C: "OO", 1226078085, 1226085260 +C: "OO", 1226085260, 1226552350 +C: "OO", 1226552350, 1226562091 +C: "OO", 1226562091, 1226608077 +C: "OO", 1226608077, 1226673866 +C: "OO", 1226673866, 1226923618 +C: "OO", 1226923618, 1226930221 +C: "OO", 1226930221, 1227322707 +C: "OO", 1227322707, 1227336517 +C: "OO", 1227336517, 1227692523 +C: "OO", 1227692523, 1228772861 +C: "OO", 1228772861, 1229914535 +C: "OO", 1229914535, 1229982272 +C: "OO", 1229982272, 1230267281 +C: "OO", 1230267281, 1230500715 +C: "OO", 1230500715, 1230903482 +C: "OO", 1230903482, 1230944655 +C: "OO", 1230944655, 1231542277 +C: "OO", 1231542277, 1233101540 +C: "OO", 1233101540, 1233155769 +C: "OO", 1233155769, 1233358658 +C: "OO", 1233358658, 1233796996 +C: "OO", 1233796996, 1234113449 +C: "OO", 1234113449, 1235155502 +C: "OO", 1235155502, 1235832447 +C: "OO", 1235832447, 1236659821 +C: "OO", 1236659821, 1237193027 +C: "OO", 1237193027, 1237593068 +C: "OO", 1237593068, 1237739636 +C: "OO", 1237739636, 1237946267 +C: "OO", 1237946267, 1238164862 +C: "OO", 1238164862, 1238781633 +C: "OO", 1238781633, 1239486537 +C: "OO", 1239486537, 1239657970 +C: "OO", 1239657970, 1241744957 +C: "OO", 1241744957, 1243376291 +C: "OO", 1243376291, 1243405807 +C: "OO", 1243405807, 1243424142 +C: "OO", 1243424142, 1244445605 +C: "OO", 1244445605, 1247198989 +C: "OO", 1247198989, 1247222957 +C: "OO", 1247222957, 1247519732 +C: "OO", 1247519732, 1248125319 +C: "OO", 1248125319, 1248504761 +C: "OO", 1248504761, 1248917210 +C: "OO", 1248917210, 1249047728 +C: "OO", 1249047728, 1249551284 +C: "OO", 1249551284, 1252084811 +C: "OO", 1252084811, 1253053863 +C: "OO", 1253053863, 1256039549 +C: "OO", 1256039549, 1256180625 +C: "OO", 1256180625, 1256878855 +C: "OO", 1256878855, 1256949158 +C: "OO", 1256949158, 1257346138 +C: "OO", 1257346138, 1257804005 +C: "OO", 1257804005, 1258636005 +C: "OO", 1258636005, 1258976012 +C: "OO", 1258976012, 1259128479 +C: "OO", 1259128479, 1259190785 +C: "OO", 1259190785, 1259408463 +C: "OO", 1259408463, 1261119030 +C: "OO", 1261119030, 1261776680 +C: "OO", 1261776680, 1261829242 +C: "OO", 1261829242, 1263918653 +C: "OO", 1263918653, 1264810793 +C: "OO", 1264810793, 1265171313 +C: "OO", 1265171313, 1265986221 +C: "OO", 1265986221, 1267786334 +C: "OO", 1267786334, 1269375032 +C: "OO", 1269375032, 1269943286 +C: "OO", 1269943286, 1271504346 +C: "OO", 1271504346, 1272085645 +C: "OO", 1272085645, 1273093179 +C: "OO", 1273093179, 1273461823 +C: "OO", 1273461823, 1273503133 +C: "OO", 1273503133, 1273955053 +C: "OO", 1273955053, 1273958953 +C: "OO", 1273958953, 1274482929 +C: "OO", 1274482929, 1274617499 +C: "OO", 1274617499, 1274874139 +C: "OO", 1274874139, 1275067746 +C: "OO", 1275067746, 1275919253 +C: "OO", 1275919253, 1276504426 +C: "OO", 1276504426, 1276976383 +C: "OO", 1276976383, 1276987759 +C: "OO", 1276987759, 1277422069 +C: "OO", 1277422069, 1279968823 +C: "OO", 1279968823, 1283101698 +C: "OO", 1283101698, 1284629360 +C: "OO", 1284629360, 1285228273 +C: "OO", 1285228273, 1285372811 +C: "OO", 1285372811, 1286373796 +C: "OO", 1286373796, 1287730219 +C: "OO", 1287730219, 1287818529 +C: "OO", 1287818529, 1288353834 +C: "OO", 1288353834, 1289004326 +C: "OO", 1289004326, 1289474636 +C: "OO", 1289474636, 1290001244 +C: "OO", 1290001244, 1291595578 +C: "OO", 1291595578, 1291670339 +C: "OO", 1291670339, 1293345153 +C: "OO", 1293345153, 1293976063 +C: "OO", 1293976063, 1295172761 +C: "OO", 1295172761, 1296134840 +C: "OO", 1296134840, 1296499823 +C: "OO", 1296499823, 1297205365 +C: "OO", 1297205365, 1298580428 +C: "OO", 1298580428, 1298660761 +C: "OO", 1298660761, 1298747809 +C: "OO", 1298747809, 1299218828 +C: "OO", 1299218828, 1299424767 +C: "OO", 1299424767, 1299772683 +C: "OO", 1299772683, 1300859406 +C: "OO", 1300859406, 1301193759 +C: "OO", 1301193759, 1301309394 +C: "OO", 1301309394, 1301548525 +C: "OO", 1301548525, 1303413227 +C: "OO", 1303413227, 1303833773 +C: "OO", 1303833773, 1303999575 +C: "OO", 1303999575, 1305074511 +C: "OO", 1305074511, 1305839617 +C: "OO", 1305839617, 1306671498 +C: "OO", 1306671498, 1306750026 +C: "OO", 1306750026, 1308023291 +C: "OO", 1308023291, 1308058321 +C: "OO", 1308058321, 1308704085 +C: "OO", 1308704085, 1309367605 +C: "OO", 1309367605, 1310363229 +C: "OO", 1310363229, 1311131841 +C: "OO", 1311131841, 1311606990 +C: "OO", 1311606990, 1311610089 +C: "OO", 1311610089, 1313244971 +C: "OO", 1313244971, 1313594000 +C: "OO", 1313594000, 1313875636 +C: "OO", 1313875636, 1313967857 +C: "OO", 1313967857, 1314306285 +C: "OO", 1314306285, 1314811381 +C: "OO", 1314811381, 1316840337 +C: "OO", 1316840337, 1317117896 +C: "OO", 1317117896, 1317205971 +C: "OO", 1317205971, 1317818301 +C: "OO", 1317818301, 1318250600 +C: "OO", 1318250600, 1318648292 +C: "OO", 1318648292, 1319113290 +C: "OO", 1319113290, 1320467574 +C: "OO", 1320467574, 1321069098 +C: "OO", 1321069098, 1321375306 +C: "OO", 1321375306, 1321400194 +C: "OO", 1321400194, 1321646978 +C: "OO", 1321646978, 1321879082 +C: "OO", 1321879082, 1322008881 +C: "OO", 1322008881, 1322133268 +C: "OO", 1322133268, 1322540816 +C: "OO", 1322540816, 1323006910 +C: "OO", 1323006910, 1323999573 +C: "OO", 1323999573, 1324731297 +C: "OO", 1324731297, 1325140450 +C: "OO", 1325140450, 1325246626 +C: "OO", 1325246626, 1327568423 +C: "OO", 1327568423, 1328264816 +C: "OO", 1328264816, 1328325058 +C: "OO", 1328325058, 1328571137 +C: "OO", 1328571137, 1328977900 +C: "OO", 1328977900, 1329540931 +C: "OO", 1329540931, 1329858799 +C: "OO", 1329858799, 1331335520 +C: "OO", 1331335520, 1331598210 +C: "OO", 1331598210, 1332788761 +C: "OO", 1332788761, 1332942871 +C: "OO", 1332942871, 1333465109 +C: "OO", 1333465109, 1333656246 +C: "OO", 1333656246, 1335555221 +C: "OO", 1335555221, 1335608684 +C: "OO", 1335608684, 1336728491 +C: "OO", 1336728491, 1336853734 +C: "OO", 1336853734, 1337112641 +C: "OO", 1337112641, 1337757546 +C: "OO", 1337757546, 1337789429 +C: "OO", 1337789429, 1339035406 +C: "OO", 1339035406, 1339485243 +C: "OO", 1339485243, 1340106306 +C: "OO", 1340106306, 1340200035 +C: "OO", 1340200035, 1340266969 +C: "OO", 1340266969, 1341512927 +C: "OO", 1341512927, 1341624415 +C: "OO", 1341624415, 1341829501 +C: "OO", 1341829501, 1342113994 +C: "OO", 1342113994, 1342480913 +C: "OO", 1342480913, 1342671127 +C: "OO", 1342671127, 1343860986 +C: "OO", 1343860986, 1344733465 +C: "OO", 1344733465, 1345111503 +C: "OO", 1345111503, 1345121129 +C: "OO", 1345121129, 1345287307 +C: "OO", 1345287307, 1345746575 +C: "OO", 1345746575, 1346870007 +C: "OO", 1346870007, 1347125038 +C: "OO", 1347125038, 1347205082 +C: "OO", 1347205082, 1347423843 +C: "OO", 1347423843, 1348026103 +C: "OO", 1348026103, 1350805815 +C: "OO", 1350805815, 1351018637 +C: "OO", 1351018637, 1351336550 +C: "OO", 1351336550, 1351581285 +C: "OO", 1351581285, 1352660655 +C: "OO", 1352660655, 1352795177 +C: "OO", 1352795177, 1352876841 +C: "OO", 1352876841, 1352920952 +C: "OO", 1352920952, 1353002729 +C: "OO", 1353002729, 1353913241 +C: "OO", 1353913241, 1354097697 +C: "OO", 1354097697, 1354225278 +C: "OO", 1354225278, 1354475987 +C: "OO", 1354475987, 1354774254 +C: "OO", 1354774254, 1355463914 +C: "OO", 1355463914, 1355604903 +C: "OO", 1355604903, 1358547698 +C: "OO", 1358547698, 1359560869 +C: "OO", 1359560869, 1359740955 +C: "OO", 1359740955, 1360265345 +C: "OO", 1360265345, 1361048739 +C: "OO", 1361048739, 1361233069 +C: "OO", 1361233069, 1361387045 +C: "OO", 1361387045, 1361449357 +C: "OO", 1361449357, 1362150659 +C: "OO", 1362150659, 1362483249 +C: "OO", 1362483249, 1362764925 +C: "OO", 1362764925, 1363292559 +C: "OO", 1363292559, 1363688514 +C: "OO", 1363688514, 1364143241 +C: "OO", 1364143241, 1364356409 +C: "OO", 1364356409, 1365041509 +C: "OO", 1365041509, 1365232642 +C: "OO", 1365232642, 1367545252 +C: "OO", 1367545252, 1367545306 +C: "OO", 1367545306, 1367682455 +C: "OO", 1367682455, 1368606806 +C: "OO", 1368606806, 1369214807 +C: "OO", 1369214807, 1370360000 +C: "OO", 1370360000, 1370953904 +C: "OO", 1370953904, 1371360931 +C: "OO", 1371360931, 1371654447 +C: "OO", 1371654447, 1371769339 +C: "OO", 1371769339, 1371876591 +C: "OO", 1371876591, 1373754119 +C: "OO", 1373754119, 1373824967 +C: "OO", 1373824967, 1373890283 +C: "OO", 1373890283, 1375273418 +C: "OO", 1375273418, 1375861311 +C: "OO", 1375861311, 1375966136 +C: "OO", 1375966136, 1377951100 +C: "OO", 1377951100, 1378214011 +C: "OO", 1378214011, 1378511307 +C: "OO", 1378511307, 1378779484 +C: "OO", 1378779484, 1379269991 +C: "OO", 1379269991, 1379297492 +C: "OO", 1379297492, 1379835363 +C: "OO", 1379835363, 1379986503 +C: "OO", 1379986503, 1380059500 +C: "OO", 1380059500, 1380748181 +C: "OO", 1380748181, 1381296802 +C: "OO", 1381296802, 1381683425 +C: "OO", 1381683425, 1382269887 +C: "OO", 1382269887, 1382422449 +C: "OO", 1382422449, 1382471546 +C: "OO", 1382471546, 1382509757 +C: "OO", 1382509757, 1383557317 +C: "OO", 1383557317, 1384045099 +C: "OO", 1384045099, 1385014470 +C: "OO", 1385014470, 1385572544 +C: "OO", 1385572544, 1385591113 +C: "OO", 1385591113, 1386424820 +C: "OO", 1386424820, 1387505287 +C: "OO", 1387505287, 1387748019 +C: "OO", 1387748019, 1387951952 +C: "OO", 1387951952, 1388267614 +C: "OO", 1388267614, 1388435494 +C: "OO", 1388435494, 1388839900 +C: "OO", 1388839900, 1388959489 +C: "OO", 1388959489, 1389302751 +C: "OO", 1389302751, 1390095997 +C: "OO", 1390095997, 1390179891 +C: "OO", 1390179891, 1391412463 +C: "OO", 1391412463, 1391586874 +C: "OO", 1391586874, 1393033741 +C: "OO", 1393033741, 1393857707 +C: "OO", 1393857707, 1393882949 +C: "OO", 1393882949, 1393884910 +C: "OO", 1393884910, 1393925860 +C: "OO", 1393925860, 1393942148 +C: "OO", 1393942148, 1394870042 +C: "OO", 1394870042, 1395540299 +C: "OO", 1395540299, 1395986237 +C: "OO", 1395986237, 1396266830 +C: "OO", 1396266830, 1397047339 +C: "OO", 1397047339, 1397301920 +C: "OO", 1397301920, 1397451728 +C: "OO", 1397451728, 1397722115 +C: "OO", 1397722115, 1397994242 +C: "OO", 1397994242, 1398814053 +C: "OO", 1398814053, 1399123676 +C: "OO", 1399123676, 1399178406 +C: "OO", 1399178406, 1399743689 +C: "OO", 1399743689, 1399924326 +C: "OO", 1399924326, 1400005141 +C: "OO", 1400005141, 1400382044 +C: "OO", 1400382044, 1401225206 +C: "OO", 1401225206, 1401493169 +C: "OO", 1401493169, 1401530825 +C: "OO", 1401530825, 1401845674 +C: "OO", 1401845674, 1402156007 +C: "OO", 1402156007, 1402432330 +C: "OO", 1402432330, 1402840542 +C: "OO", 1402840542, 1402954901 +C: "OO", 1402954901, 1402966005 +C: "OO", 1402966005, 1403681735 +C: "OO", 1403681735, 1404180831 +C: "OO", 1404180831, 1405088902 +C: "OO", 1405088902, 1405123501 +C: "OO", 1405123501, 1405556805 +C: "OO", 1405556805, 1405916011 +C: "OO", 1405916011, 1406066322 +C: "OO", 1406066322, 1407540643 +C: "OO", 1407540643, 1409412442 +C: "OO", 1409412442, 1409520473 +C: "OO", 1409520473, 1410070110 +C: "OO", 1410070110, 1410094324 +C: "OO", 1410094324, 1410278982 +C: "OO", 1410278982, 1412448003 +C: "OO", 1412448003, 1413069335 +C: "OO", 1413069335, 1413564499 +C: "OO", 1413564499, 1413797750 +C: "OO", 1413797750, 1415761229 +C: "OO", 1415761229, 1416855159 +C: "OO", 1416855159, 1417688452 +C: "OO", 1417688452, 1418018909 +C: "OO", 1418018909, 1419018556 +C: "OO", 1419018556, 1419798637 +C: "OO", 1419798637, 1419884119 +C: "OO", 1419884119, 1421131669 +C: "OO", 1421131669, 1422022678 +C: "OO", 1422022678, 1422166933 +C: "OO", 1422166933, 1425198388 +C: "OO", 1425198388, 1425871951 +C: "OO", 1425871951, 1426470500 +C: "OO", 1426470500, 1427203921 +C: "OO", 1427203921, 1430500989 +C: "OO", 1430500989, 1430916942 +C: "OO", 1430916942, 1431410475 +C: "OO", 1431410475, 1433050382 +C: "OO", 1433050382, 1433538615 +C: "OO", 1433538615, 1433663469 +C: "OO", 1433663469, 1434344510 +C: "OO", 1434344510, 1434493854 +C: "OO", 1434493854, 1434763905 +C: "OO", 1434763905, 1434927723 +C: "OO", 1434927723, 1435394456 +C: "OO", 1435394456, 1436075967 +C: "OO", 1436075967, 1436756318 +C: "OO", 1436756318, 1437171901 +C: "OO", 1437171901, 1437532551 +C: "OO", 1437532551, 1437742922 +C: "OO", 1437742922, 1438354947 +C: "OO", 1438354947, 1438584056 +C: "OO", 1438584056, 1439162530 +C: "OO", 1439162530, 1441348352 +C: "OO", 1441348352, 1441692190 +C: "OO", 1441692190, 1442265070 +C: "OO", 1442265070, 1443724950 +C: "OO", 1443724950, 1444075523 +C: "OO", 1444075523, 1444443035 +C: "OO", 1444443035, 1444667945 +C: "OO", 1444667945, 1444842151 +C: "OO", 1444842151, 1446974518 +C: "OO", 1446974518, 1447525611 +C: "OO", 1447525611, 1447536836 +C: "OO", 1447536836, 1447666827 +C: "OO", 1447666827, 1447932764 +C: "OO", 1447932764, 1448490766 +C: "OO", 1448490766, 1449273299 +C: "OO", 1449273299, 1449628421 +C: "OO", 1449628421, 1449895458 +C: "OO", 1449895458, 1450229278 +C: "OO", 1450229278, 1450616517 +C: "OO", 1450616517, 1451064205 +C: "OO", 1451064205, 1451739587 +C: "OO", 1451739587, 1452670358 +C: "OO", 1452670358, 1453682334 +C: "OO", 1453682334, 1453871495 +C: "OO", 1453871495, 1454912551 +C: "OO", 1454912551, 1454975998 +C: "OO", 1454975998, 1456867118 +C: "OO", 1456867118, 1457218667 +C: "OO", 1457218667, 1457263877 +C: "OO", 1457263877, 1457886740 +C: "OO", 1457886740, 1457951963 +C: "OO", 1457951963, 1458221997 +C: "OO", 1458221997, 1458995110 +C: "OO", 1458995110, 1459869695 +C: "OO", 1459869695, 1460166405 +C: "OO", 1460166405, 1460673149 +C: "OO", 1460673149, 1461144819 +C: "OO", 1461144819, 1461290161 +C: "OO", 1461290161, 1461316723 +C: "OO", 1461316723, 1461360092 +C: "OO", 1461360092, 1461887686 +C: "OO", 1461887686, 1461890504 +C: "OO", 1461890504, 1464304214 +C: "OO", 1464304214, 1464445727 +C: "OO", 1464445727, 1465071687 +C: "OO", 1465071687, 1465514356 +C: "OO", 1465514356, 1466068431 +C: "OO", 1466068431, 1466869791 +C: "OO", 1466869791, 1467370279 +C: "OO", 1467370279, 1468318433 +C: "OO", 1468318433, 1468689536 +C: "OO", 1468689536, 1471231531 +C: "OO", 1471231531, 1471930589 +C: "OO", 1471930589, 1472191412 +C: "OO", 1472191412, 1472916826 +C: "OO", 1472916826, 1474329680 +C: "OO", 1474329680, 1474667559 +C: "OO", 1474667559, 1475030334 +C: "OO", 1475030334, 1475042902 +C: "OO", 1475042902, 1475406654 +C: "OO", 1475406654, 1476684433 +C: "OO", 1476684433, 1477283780 +C: "OO", 1477283780, 1477328177 +C: "OO", 1477328177, 1477386597 +C: "OO", 1477386597, 1477426109 +C: "OO", 1477426109, 1477797197 +C: "OO", 1477797197, 1478530266 +C: "OO", 1478530266, 1478635702 +C: "OO", 1478635702, 1480739211 +C: "OO", 1480739211, 1480815205 +C: "OO", 1480815205, 1480936602 +C: "OO", 1480936602, 1480958123 +C: "OO", 1480958123, 1482039591 +C: "OO", 1482039591, 1482436257 +C: "OO", 1482436257, 1482687178 +C: "OO", 1482687178, 1482977762 +C: "OO", 1482977762, 1483796703 +C: "OO", 1483796703, 1485138820 +C: "OO", 1485138820, 1485648369 +C: "OO", 1485648369, 1486790523 +C: "OO", 1486790523, 1487074195 +C: "OO", 1487074195, 1487459137 +C: "OO", 1487459137, 1487557737 +C: "OO", 1487557737, 1487907447 +C: "OO", 1487907447, 1488908828 +C: "OO", 1488908828, 1490523510 +C: "OO", 1490523510, 1490819231 +C: "OO", 1490819231, 1491310699 +C: "OO", 1491310699, 1492543218 +C: "OO", 1492543218, 1492657331 +C: "OO", 1492657331, 1492804745 +C: "OO", 1492804745, 1493810231 +C: "OO", 1493810231, 1493997848 +C: "OO", 1493997848, 1494464732 +C: "OO", 1494464732, 1495669241 +C: "OO", 1495669241, 1495732918 +C: "OO", 1495732918, 1496351109 +C: "OO", 1496351109, 1496465895 +C: "OO", 1496465895, 1496641767 +C: "OO", 1496641767, 1496979989 +C: "OO", 1496979989, 1497166076 +C: "OO", 1497166076, 1497339839 +C: "OO", 1497339839, 1497372503 +C: "OO", 1497372503, 1499050902 +C: "OO", 1499050902, 1500572494 +C: "OO", 1500572494, 1501829519 +C: "OO", 1501829519, 1503635600 +C: "OO", 1503635600, 1504124913 +C: "OO", 1504124913, 1504531833 +C: "OO", 1504531833, 1504588121 +C: "OO", 1504588121, 1504788378 +C: "OO", 1504788378, 1505137972 +C: "OO", 1505137972, 1505200351 +C: "OO", 1505200351, 1505556685 +C: "OO", 1505556685, 1505977173 +C: "OO", 1505977173, 1506049293 +C: "OO", 1506049293, 1507469763 +C: "OO", 1507469763, 1507698333 +C: "OO", 1507698333, 1508169279 +C: "OO", 1508169279, 1508501787 +C: "OO", 1508501787, 1508571351 +C: "OO", 1508571351, 1508901418 +C: "OO", 1508901418, 1510622518 +C: "OO", 1510622518, 1511199580 +C: "OO", 1511199580, 1512602730 +C: "OO", 1512602730, 1513783905 +C: "OO", 1513783905, 1514043803 +C: "OO", 1514043803, 1514109110 +C: "OO", 1514109110, 1514629515 +C: "OO", 1514629515, 1514975654 +C: "OO", 1514975654, 1515128026 +C: "OO", 1515128026, 1515290369 +C: "OO", 1515290369, 1516933351 +C: "OO", 1516933351, 1517382419 +C: "OO", 1517382419, 1517386604 +C: "OO", 1517386604, 1517753170 +C: "OO", 1517753170, 1518827711 +C: "OO", 1518827711, 1519737007 +C: "OO", 1519737007, 1520218569 +C: "OO", 1520218569, 1520483410 +C: "OO", 1520483410, 1520673851 +C: "OO", 1520673851, 1521285573 +C: "OO", 1521285573, 1521569925 +C: "OO", 1521569925, 1521877847 +C: "OO", 1521877847, 1522097653 +C: "OO", 1522097653, 1522421631 +C: "OO", 1522421631, 1522521159 +C: "OO", 1522521159, 1525759178 +C: "OO", 1525759178, 1527105175 +C: "OO", 1527105175, 1527718664 +C: "OO", 1527718664, 1528005364 +C: "OO", 1528005364, 1528466642 +C: "OO", 1528466642, 1528890034 +C: "OO", 1528890034, 1529767913 +C: "OO", 1529767913, 1529938369 +C: "OO", 1529938369, 1530380780 +C: "OO", 1530380780, 1530657267 +C: "OO", 1530657267, 1531374440 +C: "OO", 1531374440, 1531918232 +C: "OO", 1531918232, 1533014833 +C: "OO", 1533014833, 1533104830 +C: "OO", 1533104830, 1533430985 +C: "OO", 1533430985, 1533599535 +C: "OO", 1533599535, 1535995532 +C: "OO", 1535995532, 1536030859 +C: "OO", 1536030859, 1536410326 +C: "OO", 1536410326, 1537108437 +C: "OO", 1537108437, 1537496490 +C: "OO", 1537496490, 1539299120 +C: "OO", 1539299120, 1539408099 +C: "OO", 1539408099, 1540161850 +C: "OO", 1540161850, 1540347257 +C: "OO", 1540347257, 1540792649 +C: "OO", 1540792649, 1540986004 +C: "OO", 1540986004, 1542049047 +C: "OO", 1542049047, 1542713869 +C: "OO", 1542713869, 1543696838 +C: "OO", 1543696838, 1543782115 +C: "OO", 1543782115, 1544707651 +C: "OO", 1544707651, 1545034091 +C: "OO", 1545034091, 1547790362 +C: "OO", 1547790362, 1547907941 +C: "OO", 1547907941, 1548480268 +C: "OO", 1548480268, 1548496473 +C: "OO", 1548496473, 1548772204 +C: "OO", 1548772204, 1549471653 +C: "OO", 1549471653, 1549686836 +C: "OO", 1549686836, 1550775711 +C: "OO", 1550775711, 1550957823 +C: "OO", 1550957823, 1551983981 +C: "OO", 1551983981, 1552034258 +C: "OO", 1552034258, 1552352805 +C: "OO", 1552352805, 1553241335 +C: "OO", 1553241335, 1553793104 +C: "OO", 1553793104, 1554445333 +C: "OO", 1554445333, 1554698899 +C: "OO", 1554698899, 1556258022 +C: "OO", 1556258022, 1556437685 +C: "OO", 1556437685, 1557282095 +C: "OO", 1557282095, 1558210921 +C: "OO", 1558210921, 1558614303 +C: "OO", 1558614303, 1559600733 +C: "OO", 1559600733, 1559834527 +C: "OO", 1559834527, 1560967738 +C: "OO", 1560967738, 1562060079 +C: "OO", 1562060079, 1562477654 +C: "OO", 1562477654, 1562689337 +C: "OO", 1562689337, 1564043357 +C: "OO", 1564043357, 1564906782 +C: "OO", 1564906782, 1565125907 +C: "OO", 1565125907, 1566401044 +C: "OO", 1566401044, 1566519747 +C: "OO", 1566519747, 1566838303 +C: "OO", 1566838303, 1567428637 +C: "OO", 1567428637, 1567714784 +C: "OO", 1567714784, 1567785004 +C: "OO", 1567785004, 1567887650 +C: "OO", 1567887650, 1569395014 +C: "OO", 1569395014, 1569484246 +C: "OO", 1569484246, 1570446762 +C: "OO", 1570446762, 1571744013 +C: "OO", 1571744013, 1572110481 +C: "OO", 1572110481, 1572171789 +C: "OO", 1572171789, 1572597183 +C: "OO", 1572597183, 1572843470 +C: "OO", 1572843470, 1575978017 +C: "OO", 1575978017, 1576650797 +C: "OO", 1576650797, 1576849365 +C: "OO", 1576849365, 1577048777 +C: "OO", 1577048777, 1578222101 +C: "OO", 1578222101, 1579548627 +C: "OO", 1579548627, 1579712589 +C: "OO", 1579712589, 1579842815 +C: "OO", 1579842815, 1580151018 +C: "OO", 1580151018, 1580304987 +C: "OO", 1580304987, 1581465738 +C: "OO", 1581465738, 1581472598 +C: "OO", 1581472598, 1581478981 +C: "OO", 1581478981, 1581918113 +C: "OO", 1581918113, 1582129023 +C: "OO", 1582129023, 1582605891 +C: "OO", 1582605891, 1583170539 +C: "OO", 1583170539, 1583566301 +C: "OO", 1583566301, 1584961491 +C: "OO", 1584961491, 1586277510 +C: "OO", 1586277510, 1587487009 +C: "OO", 1587487009, 1587694818 +C: "OO", 1587694818, 1589904347 +C: "OO", 1589904347, 1590223134 +C: "OO", 1590223134, 1590296324 +C: "OO", 1590296324, 1590438861 +C: "OO", 1590438861, 1590537295 +C: "OO", 1590537295, 1590630047 +C: "OO", 1590630047, 1591250631 +C: "OO", 1591250631, 1592792180 +C: "OO", 1592792180, 1592927121 +C: "OO", 1592927121, 1593033017 +C: "OO", 1593033017, 1593404315 +C: "OO", 1593404315, 1593552998 +C: "OO", 1593552998, 1593665187 +C: "OO", 1593665187, 1596449081 +C: "OO", 1596449081, 1597326750 +C: "OO", 1597326750, 1597838790 +C: "OO", 1597838790, 1598067867 +C: "OO", 1598067867, 1598454566 +C: "OO", 1598454566, 1600480642 +C: "OO", 1600480642, 1600866889 +C: "OO", 1600866889, 1601779751 +C: "OO", 1601779751, 1602634007 +C: "OO", 1602634007, 1604133737 +C: "OO", 1604133737, 1604927829 +C: "OO", 1604927829, 1605172153 +C: "OO", 1605172153, 1605791934 +C: "OO", 1605791934, 1606428385 +C: "OO", 1606428385, 1606731217 +C: "OO", 1606731217, 1607025433 +C: "OO", 1607025433, 1608175870 +C: "OO", 1608175870, 1608300930 +C: "OO", 1608300930, 1608527175 +C: "OO", 1608527175, 1609107151 +C: "OO", 1609107151, 1609825245 +C: "OO", 1609825245, 1610404535 +C: "OO", 1610404535, 1611823258 +C: "OO", 1611823258, 1612156700 +C: "OO", 1612156700, 1612684197 +C: "OO", 1612684197, 1614471954 +C: "OO", 1614471954, 1614978799 +C: "OO", 1614978799, 1615216171 +C: "OO", 1615216171, 1615251872 +C: "OO", 1615251872, 1615275023 +C: "OO", 1615275023, 1615743490 +C: "OO", 1615743490, 1616849672 +C: "OO", 1616849672, 1616910521 +C: "OO", 1616910521, 1617064686 +C: "OO", 1617064686, 1617636176 +C: "OO", 1617636176, 1618133233 +C: "OO", 1618133233, 1618196377 +C: "OO", 1618196377, 1618306279 +C: "OO", 1618306279, 1618588447 +C: "OO", 1618588447, 1619020178 +C: "OO", 1619020178, 1619357057 +C: "OO", 1619357057, 1619456227 +C: "OO", 1619456227, 1621671508 +C: "OO", 1621671508, 1622163842 +C: "OO", 1622163842, 1622541277 +C: "OO", 1622541277, 1623298382 +C: "OO", 1623298382, 1624010837 +C: "OO", 1624010837, 1625373028 +C: "OO", 1625373028, 1625677820 +C: "OO", 1625677820, 1626246693 +C: "OO", 1626246693, 1626809696 +C: "OO", 1626809696, 1627398404 +C: "OO", 1627398404, 1627944575 +C: "OO", 1627944575, 1628127177 +C: "OO", 1628127177, 1628231963 +C: "OO", 1628231963, 1628350622 +C: "OO", 1628350622, 1629181765 +C: "OO", 1629181765, 1629296311 +C: "OO", 1629296311, 1629601706 +C: "OO", 1629601706, 1630995097 +C: "OO", 1630995097, 1631037855 +C: "OO", 1631037855, 1631554520 +C: "OO", 1631554520, 1631602277 +C: "OO", 1631602277, 1631765811 +C: "OO", 1631765811, 1632136571 +C: "OO", 1632136571, 1632705102 +C: "OO", 1632705102, 1633235178 +C: "OO", 1633235178, 1633254389 +C: "OO", 1633254389, 1633325273 +C: "OO", 1633325273, 1633540499 +C: "OO", 1633540499, 1633872126 +C: "OO", 1633872126, 1634040991 +C: "OO", 1634040991, 1634534634 +C: "OO", 1634534634, 1634571434 +C: "OO", 1634571434, 1635312509 +C: "OO", 1635312509, 1636273009 +C: "OO", 1636273009, 1636770215 +C: "OO", 1636770215, 1637852218 +C: "OO", 1637852218, 1638175837 +C: "OO", 1638175837, 1638373006 +C: "OO", 1638373006, 1638894093 +C: "OO", 1638894093, 1639075302 +C: "OO", 1639075302, 1640403560 +C: "OO", 1640403560, 1640693694 +C: "OO", 1640693694, 1641246582 +C: "OO", 1641246582, 1642107379 +C: "OO", 1642107379, 1642449668 +C: "OO", 1642449668, 1642550195 +C: "OO", 1642550195, 1642570441 +C: "OO", 1642570441, 1643764274 +C: "OO", 1643764274, 1643965962 +C: "OO", 1643965962, 1646058882 +C: "OO", 1646058882, 1647876515 +C: "OO", 1647876515, 1648030151 +C: "OO", 1648030151, 1648539721 +C: "OO", 1648539721, 1649684571 +C: "OO", 1649684571, 1650542605 +C: "OO", 1650542605, 1651070539 +C: "OO", 1651070539, 1651153942 +C: "OO", 1651153942, 1652752215 +C: "OO", 1652752215, 1652876215 +C: "OO", 1652876215, 1653523607 +C: "OO", 1653523607, 1654334086 +C: "OO", 1654334086, 1654510809 +C: "OO", 1654510809, 1654536585 +C: "OO", 1654536585, 1655557247 +C: "OO", 1655557247, 1655639339 +C: "OO", 1655639339, 1655814471 +C: "OO", 1655814471, 1656539091 +C: "OO", 1656539091, 1657022605 +C: "OO", 1657022605, 1657806353 +C: "OO", 1657806353, 1658305221 +C: "OO", 1658305221, 1658579947 +C: "OO", 1658579947, 1658587613 +C: "OO", 1658587613, 1658656969 +C: "OO", 1658656969, 1658897105 +C: "OO", 1658897105, 1659403852 +C: "OO", 1659403852, 1659769886 +C: "OO", 1659769886, 1660318295 +C: "OO", 1660318295, 1661184092 +C: "OO", 1661184092, 1663069930 +C: "OO", 1663069930, 1664124410 +C: "OO", 1664124410, 1664965115 +C: "OO", 1664965115, 1665318427 +C: "OO", 1665318427, 1665680725 +C: "OO", 1665680725, 1666625057 +C: "OO", 1666625057, 1667072991 +C: "OO", 1667072991, 1667463506 +C: "OO", 1667463506, 1667862589 +C: "OO", 1667862589, 1668495742 +C: "OO", 1668495742, 1668571761 +C: "OO", 1668571761, 1669006543 +C: "OO", 1669006543, 1669880698 +C: "OO", 1669880698, 1670034730 +C: "OO", 1670034730, 1670654129 +C: "OO", 1670654129, 1670822978 +C: "OO", 1670822978, 1670910767 +C: "OO", 1670910767, 1671145207 +C: "OO", 1671145207, 1671594186 +C: "OO", 1671594186, 1672392923 +C: "OO", 1672392923, 1672746751 +C: "OO", 1672746751, 1673442707 +C: "OO", 1673442707, 1673550644 +C: "OO", 1673550644, 1673808207 +C: "OO", 1673808207, 1675503282 +C: "OO", 1675503282, 1676973422 +C: "OO", 1676973422, 1678669387 +C: "OO", 1678669387, 1678784242 +C: "OO", 1678784242, 1679252732 +C: "OO", 1679252732, 1680103084 +C: "OO", 1680103084, 1680124252 +C: "OO", 1680124252, 1682035465 +C: "OO", 1682035465, 1682830451 +C: "OO", 1682830451, 1683172407 +C: "OO", 1683172407, 1684320194 +C: "OO", 1684320194, 1684350970 +C: "OO", 1684350970, 1684736789 +C: "OO", 1684736789, 1685089357 +C: "OO", 1685089357, 1685267173 +C: "OO", 1685267173, 1685772065 +C: "OO", 1685772065, 1685806929 +C: "OO", 1685806929, 1686273524 +C: "OO", 1686273524, 1688140218 +C: "OO", 1688140218, 1688344223 +C: "OO", 1688344223, 1689582822 +C: "OO", 1689582822, 1689884861 +C: "OO", 1689884861, 1690383286 +C: "OO", 1690383286, 1690551962 +C: "OO", 1690551962, 1691665478 +C: "OO", 1691665478, 1692358994 +C: "OO", 1692358994, 1692423419 +C: "OO", 1692423419, 1692626788 +C: "OO", 1692626788, 1693979110 +C: "OO", 1693979110, 1693985171 +C: "OO", 1693985171, 1695218212 +C: "OO", 1695218212, 1695226499 +C: "OO", 1695226499, 1695895868 +C: "OO", 1695895868, 1696448031 +C: "OO", 1696448031, 1696538878 +C: "OO", 1696538878, 1697005433 +C: "OO", 1697005433, 1697897329 +C: "OO", 1697897329, 1698428749 +C: "OO", 1698428749, 1699318124 +C: "OO", 1699318124, 1699369637 +C: "OO", 1699369637, 1701216093 +C: "OO", 1701216093, 1702122505 +C: "OO", 1702122505, 1702418130 +C: "OO", 1702418130, 1702685747 +C: "OO", 1702685747, 1704120635 +C: "OO", 1704120635, 1705409463 +C: "OO", 1705409463, 1706630073 +C: "OO", 1706630073, 1706747006 +C: "OO", 1706747006, 1707035804 +C: "OO", 1707035804, 1707906214 +C: "OO", 1707906214, 1708754767 +C: "OO", 1708754767, 1709535201 +C: "OO", 1709535201, 1709546410 +C: "OO", 1709546410, 1710316146 +C: "OO", 1710316146, 1711182486 +C: "OO", 1711182486, 1711328946 +C: "OO", 1711328946, 1711560198 +C: "OO", 1711560198, 1712102733 +C: "OO", 1712102733, 1713870989 +C: "OO", 1713870989, 1713969267 +C: "OO", 1713969267, 1713986537 +C: "OO", 1713986537, 1714914500 +C: "OO", 1714914500, 1716640902 +C: "OO", 1716640902, 1717194821 +C: "OO", 1717194821, 1717894132 +C: "OO", 1717894132, 1718627827 +C: "OO", 1718627827, 1718726147 +C: "OO", 1718726147, 1719272192 +C: "OO", 1719272192, 1719591085 +C: "OO", 1719591085, 1719611966 +C: "OO", 1719611966, 1720042413 +C: "OO", 1720042413, 1720341882 +C: "OO", 1720341882, 1720757191 +C: "OO", 1720757191, 1721727289 +C: "OO", 1721727289, 1722086937 +C: "OO", 1722086937, 1722309565 +C: "OO", 1722309565, 1722648509 +C: "OO", 1722648509, 1723015669 +C: "OO", 1723015669, 1723278618 +C: "OO", 1723278618, 1724558033 +C: "OO", 1724558033, 1727097128 +C: "OO", 1727097128, 1727473723 +C: "OO", 1727473723, 1728774967 +C: "OO", 1728774967, 1730133957 +C: "OO", 1730133957, 1730150101 +C: "OO", 1730150101, 1730326671 +C: "OO", 1730326671, 1731021778 +C: "OO", 1731021778, 1731099614 +C: "OO", 1731099614, 1731483422 +C: "OO", 1731483422, 1732930339 +C: "OO", 1732930339, 1733750983 +C: "OO", 1733750983, 1734299517 +C: "OO", 1734299517, 1735167190 +C: "OO", 1735167190, 1735783879 +C: "OO", 1735783879, 1735894111 +C: "OO", 1735894111, 1737500377 +C: "OO", 1737500377, 1737526177 +C: "OO", 1737526177, 1737681153 +C: "OO", 1737681153, 1738178581 +C: "OO", 1738178581, 1739325052 +C: "OO", 1739325052, 1739380329 +C: "OO", 1739380329, 1739642470 +C: "OO", 1739642470, 1742310106 +C: "OO", 1742310106, 1742516143 +C: "OO", 1742516143, 1742824590 +C: "OO", 1742824590, 1742891989 +C: "OO", 1742891989, 1743103145 +C: "OO", 1743103145, 1743502779 +C: "OO", 1743502779, 1743775931 +C: "OO", 1743775931, 1744511762 +C: "OO", 1744511762, 1744670170 +C: "OO", 1744670170, 1744863485 +C: "OO", 1744863485, 1744927795 +C: "OO", 1744927795, 1745794520 +C: "OO", 1745794520, 1745888846 +C: "OO", 1745888846, 1745948534 +C: "OO", 1745948534, 1746297617 +C: "OO", 1746297617, 1746779811 +C: "OO", 1746779811, 1746936044 +C: "OO", 1746936044, 1746947978 +C: "OO", 1746947978, 1747034738 +C: "OO", 1747034738, 1747999398 +C: "OO", 1747999398, 1748149994 +C: "OO", 1748149994, 1748314153 +C: "OO", 1748314153, 1750074947 +C: "OO", 1750074947, 1751240609 +C: "OO", 1751240609, 1751399491 +C: "OO", 1751399491, 1752198297 +C: "OO", 1752198297, 1753175887 +C: "OO", 1753175887, 1753257915 +C: "OO", 1753257915, 1753870409 +C: "OO", 1753870409, 1754275815 +C: "OO", 1754275815, 1754389894 +C: "OO", 1754389894, 1754493042 +C: "OO", 1754493042, 1754666381 +C: "OO", 1754666381, 1754766657 +C: "OO", 1754766657, 1755320513 +C: "OO", 1755320513, 1756182009 +C: "OO", 1756182009, 1757018503 +C: "OO", 1757018503, 1757296443 +C: "OO", 1757296443, 1757721854 +C: "OO", 1757721854, 1759289703 +C: "OO", 1759289703, 1760346906 +C: "OO", 1760346906, 1760540804 +C: "OO", 1760540804, 1761082443 +C: "OO", 1761082443, 1761227187 +C: "OO", 1761227187, 1761639849 +C: "OO", 1761639849, 1763174837 +C: "OO", 1763174837, 1763974466 +C: "OO", 1763974466, 1764228163 +C: "OO", 1764228163, 1765199251 +C: "OO", 1765199251, 1765658634 +C: "OO", 1765658634, 1766319174 +C: "OO", 1766319174, 1766390306 +C: "OO", 1766390306, 1767664909 +C: "OO", 1767664909, 1768444220 +C: "OO", 1768444220, 1769250377 +C: "OO", 1769250377, 1769799383 +C: "OO", 1769799383, 1769879834 +C: "OO", 1769879834, 1771651739 +C: "OO", 1771651739, 1772345619 +C: "OO", 1772345619, 1772462276 +C: "OO", 1772462276, 1772933274 +C: "OO", 1772933274, 1773211325 +C: "OO", 1773211325, 1774205836 +C: "OO", 1774205836, 1774531553 +C: "OO", 1774531553, 1774617598 +C: "OO", 1774617598, 1775259065 +C: "OO", 1775259065, 1775404745 +C: "OO", 1775404745, 1775454810 +C: "OO", 1775454810, 1777262861 +C: "OO", 1777262861, 1777978359 +C: "OO", 1777978359, 1778282901 +C: "OO", 1778282901, 1778699836 +C: "OO", 1778699836, 1778725460 +C: "OO", 1778725460, 1779229282 +C: "OO", 1779229282, 1779396165 +C: "OO", 1779396165, 1779486685 +C: "OO", 1779486685, 1781565947 +C: "OO", 1781565947, 1781729601 +C: "OO", 1781729601, 1782285545 +C: "OO", 1782285545, 1783205707 +C: "OO", 1783205707, 1783403241 +C: "OO", 1783403241, 1783511177 +C: "OO", 1783511177, 1783649271 +C: "OO", 1783649271, 1784802980 +C: "OO", 1784802980, 1785420831 +C: "OO", 1785420831, 1785767524 +C: "OO", 1785767524, 1786239778 +C: "OO", 1786239778, 1786464699 +C: "OO", 1786464699, 1787118639 +C: "OO", 1787118639, 1787430995 +C: "OO", 1787430995, 1787718927 +C: "OO", 1787718927, 1788611570 +C: "OO", 1788611570, 1789347151 +C: "OO", 1789347151, 1789384986 +C: "OO", 1789384986, 1790629403 +C: "OO", 1790629403, 1790706344 +C: "OO", 1790706344, 1791012379 +C: "OO", 1791012379, 1793529666 +C: "OO", 1793529666, 1795080686 +C: "OO", 1795080686, 1795285703 +C: "OO", 1795285703, 1795898262 +C: "OO", 1795898262, 1797102398 +C: "OO", 1797102398, 1797982899 +C: "OO", 1797982899, 1798205287 +C: "OO", 1798205287, 1799323041 +C: "OO", 1799323041, 1799523536 +C: "OO", 1799523536, 1799619917 +C: "OO", 1799619917, 1799833394 +C: "OO", 1799833394, 1800369574 +C: "OO", 1800369574, 1800615339 +C: "OO", 1800615339, 1800778775 +C: "OO", 1800778775, 1800904545 +C: "OO", 1800904545, 1801543953 +C: "OO", 1801543953, 1802110734 +C: "OO", 1802110734, 1803248252 +C: "OO", 1803248252, 1803439395 +C: "OO", 1803439395, 1803445931 +C: "OO", 1803445931, 1803528381 +C: "OO", 1803528381, 1803544142 +C: "OO", 1803544142, 1803858131 +C: "OO", 1803858131, 1804124915 +C: "OO", 1804124915, 1805119508 +C: "OO", 1805119508, 1805181193 +C: "OO", 1805181193, 1805196714 +C: "OO", 1805196714, 1805750132 +C: "OO", 1805750132, 1805997884 +C: "OO", 1805997884, 1806258933 +C: "OO", 1806258933, 1806293514 +C: "OO", 1806293514, 1807484387 +C: "OO", 1807484387, 1807785347 +C: "OO", 1807785347, 1808246435 +C: "OO", 1808246435, 1808598707 +C: "OO", 1808598707, 1808684960 +C: "OO", 1808684960, 1808803994 +C: "OO", 1808803994, 1808848550 +C: "OO", 1808848550, 1809313477 +C: "OO", 1809313477, 1809652136 +C: "OO", 1809652136, 1810198801 +C: "OO", 1810198801, 1811451018 +C: "OO", 1811451018, 1811990294 +C: "OO", 1811990294, 1812224231 +C: "OO", 1812224231, 1812757977 +C: "OO", 1812757977, 1813326925 +C: "OO", 1813326925, 1814566474 +C: "OO", 1814566474, 1815573161 +C: "OO", 1815573161, 1815793658 +C: "OO", 1815793658, 1817759283 +C: "OO", 1817759283, 1817790131 +C: "OO", 1817790131, 1819817090 +C: "OO", 1819817090, 1820469281 +C: "OO", 1820469281, 1820784657 +C: "OO", 1820784657, 1821043785 +C: "OO", 1821043785, 1821178355 +C: "OO", 1821178355, 1821595762 +C: "OO", 1821595762, 1821624402 +C: "OO", 1821624402, 1821760343 +C: "OO", 1821760343, 1821827257 +C: "OO", 1821827257, 1822000787 +C: "OO", 1822000787, 1822660820 +C: "OO", 1822660820, 1822790815 +C: "OO", 1822790815, 1823511775 +C: "OO", 1823511775, 1823667837 +C: "OO", 1823667837, 1823681917 +C: "OO", 1823681917, 1824902971 +C: "OO", 1824902971, 1825145729 +C: "OO", 1825145729, 1825950320 +C: "OO", 1825950320, 1827490655 +C: "OO", 1827490655, 1827913614 +C: "OO", 1827913614, 1828246441 +C: "OO", 1828246441, 1830622750 +C: "OO", 1830622750, 1830855074 +C: "OO", 1830855074, 1831515539 +C: "OO", 1831515539, 1831775615 +C: "OO", 1831775615, 1831918867 +C: "OO", 1831918867, 1832296367 +C: "OO", 1832296367, 1833787093 +C: "OO", 1833787093, 1834719255 +C: "OO", 1834719255, 1834737052 +C: "OO", 1834737052, 1834909767 +C: "OO", 1834909767, 1836527511 +C: "OO", 1836527511, 1837343759 +C: "OO", 1837343759, 1838912409 +C: "OO", 1838912409, 1840328421 +C: "OO", 1840328421, 1840777594 +C: "OO", 1840777594, 1841074166 +C: "OO", 1841074166, 1841541355 +C: "OO", 1841541355, 1841681257 +C: "OO", 1841681257, 1841684347 +C: "OO", 1841684347, 1841802974 +C: "OO", 1841802974, 1842381995 +C: "OO", 1842381995, 1842510772 +C: "OO", 1842510772, 1845668965 +C: "OO", 1845668965, 1845832737 +C: "OO", 1845832737, 1846361024 +C: "OO", 1846361024, 1846945412 +C: "OO", 1846945412, 1847086088 +C: "OO", 1847086088, 1847909298 +C: "OO", 1847909298, 1848804574 +C: "OO", 1848804574, 1849258414 +C: "OO", 1849258414, 1849439679 +C: "OO", 1849439679, 1852014191 +C: "OO", 1852014191, 1852352101 +C: "OO", 1852352101, 1853034290 +C: "OO", 1853034290, 1853064751 +C: "OO", 1853064751, 1853535757 +C: "OO", 1853535757, 1853649517 +C: "OO", 1853649517, 1853752630 +C: "OO", 1853752630, 1854860157 +C: "OO", 1854860157, 1855167241 +C: "OO", 1855167241, 1856249947 +C: "OO", 1856249947, 1856920754 +C: "OO", 1856920754, 1857190258 +C: "OO", 1857190258, 1857356029 +C: "OO", 1857356029, 1857724110 +C: "OO", 1857724110, 1858481649 +C: "OO", 1858481649, 1859270369 +C: "OO", 1859270369, 1859287498 +C: "OO", 1859287498, 1860353131 +C: "OO", 1860353131, 1860376994 +C: "OO", 1860376994, 1860668161 +C: "OO", 1860668161, 1861631909 +C: "OO", 1861631909, 1861809939 +C: "OO", 1861809939, 1862444804 +C: "OO", 1862444804, 1863137188 +C: "OO", 1863137188, 1863524649 +C: "OO", 1863524649, 1863810674 +C: "OO", 1863810674, 1865226222 +C: "OO", 1865226222, 1867189746 +C: "OO", 1867189746, 1867665351 +C: "OO", 1867665351, 1867805047 +C: "OO", 1867805047, 1868096846 +C: "OO", 1868096846, 1868334479 +C: "OO", 1868334479, 1868874883 +C: "OO", 1868874883, 1868918081 +C: "OO", 1868918081, 1868926965 +C: "OO", 1868926965, 1868958004 +C: "OO", 1868958004, 1869204289 +C: "OO", 1869204289, 1869248410 +C: "OO", 1869248410, 1869265324 +C: "OO", 1869265324, 1869563111 +C: "OO", 1869563111, 1869769459 +C: "OO", 1869769459, 1870986143 +C: "OO", 1870986143, 1871490605 +C: "OO", 1871490605, 1872247231 +C: "OO", 1872247231, 1872323524 +C: "OO", 1872323524, 1873193288 +C: "OO", 1873193288, 1873225760 +C: "OO", 1873225760, 1873617554 +C: "OO", 1873617554, 1873813921 +C: "OO", 1873813921, 1874003068 +C: "OO", 1874003068, 1874386638 +C: "OO", 1874386638, 1874785175 +C: "OO", 1874785175, 1874870805 +C: "OO", 1874870805, 1875454091 +C: "OO", 1875454091, 1875735844 +C: "OO", 1875735844, 1875787335 +C: "OO", 1875787335, 1876198568 +C: "OO", 1876198568, 1876231421 +C: "OO", 1876231421, 1876480274 +C: "OO", 1876480274, 1877248067 +C: "OO", 1877248067, 1877295015 +C: "OO", 1877295015, 1878870844 +C: "OO", 1878870844, 1881495546 +C: "OO", 1881495546, 1882097023 +C: "OO", 1882097023, 1882893911 +C: "OO", 1882893911, 1883078105 +C: "OO", 1883078105, 1885931493 +C: "OO", 1885931493, 1886274875 +C: "OO", 1886274875, 1886356448 +C: "OO", 1886356448, 1886442199 +C: "OO", 1886442199, 1886753067 +C: "OO", 1886753067, 1887043256 +C: "OO", 1887043256, 1887428644 +C: "OO", 1887428644, 1887536203 +C: "OO", 1887536203, 1888028062 +C: "OO", 1888028062, 1888305955 +C: "OO", 1888305955, 1888842618 +C: "OO", 1888842618, 1888938378 +C: "OO", 1888938378, 1889648647 +C: "OO", 1889648647, 1889950424 +C: "OO", 1889950424, 1890479921 +C: "OO", 1890479921, 1890949149 +C: "OO", 1890949149, 1891873829 +C: "OO", 1891873829, 1892117653 +C: "OO", 1892117653, 1892213713 +C: "OO", 1892213713, 1892592508 +C: "OO", 1892592508, 1893910461 +C: "OO", 1893910461, 1894044508 +C: "OO", 1894044508, 1894052367 +C: "OO", 1894052367, 1894124739 +C: "OO", 1894124739, 1894501372 +C: "OO", 1894501372, 1894579078 +C: "OO", 1894579078, 1895365460 +C: "OO", 1895365460, 1895423810 +C: "OO", 1895423810, 1896952890 +C: "OO", 1896952890, 1897447565 +C: "OO", 1897447565, 1897466682 +C: "OO", 1897466682, 1898889939 +C: "OO", 1898889939, 1899660949 +C: "OO", 1899660949, 1899931534 +C: "OO", 1899931534, 1902658873 +C: "OO", 1902658873, 1903217037 +C: "OO", 1903217037, 1903490386 +C: "OO", 1903490386, 1903515317 +C: "OO", 1903515317, 1903537291 +C: "OO", 1903537291, 1903885430 +C: "OO", 1903885430, 1904597809 +C: "OO", 1904597809, 1905364478 +C: "OO", 1905364478, 1905550141 +C: "OO", 1905550141, 1907191607 +C: "OO", 1907191607, 1907210869 +C: "OO", 1907210869, 1907643265 +C: "OO", 1907643265, 1908347338 +C: "OO", 1908347338, 1908892880 +C: "OO", 1908892880, 1909087321 +C: "OO", 1909087321, 1909171091 +C: "OO", 1909171091, 1910131001 +C: "OO", 1910131001, 1910697613 +C: "OO", 1910697613, 1911723560 +C: "OO", 1911723560, 1912715523 +C: "OO", 1912715523, 1912756762 +C: "OO", 1912756762, 1912842010 +C: "OO", 1912842010, 1913445567 +C: "OO", 1913445567, 1913917307 +C: "OO", 1913917307, 1913932231 +C: "OO", 1913932231, 1914114883 +C: "OO", 1914114883, 1914565742 +C: "OO", 1914565742, 1914588338 +C: "OO", 1914588338, 1915057363 +C: "OO", 1915057363, 1915711318 +C: "OO", 1915711318, 1918445692 +C: "OO", 1918445692, 1919223745 +C: "OO", 1919223745, 1919683530 +C: "OO", 1919683530, 1920015398 +C: "OO", 1920015398, 1921244022 +C: "OO", 1921244022, 1921541507 +C: "OO", 1921541507, 1922421025 +C: "OO", 1922421025, 1923622999 +C: "OO", 1923622999, 1923637545 +C: "OO", 1923637545, 1924256102 +C: "OO", 1924256102, 1924527170 +C: "OO", 1924527170, 1924905278 +C: "OO", 1924905278, 1924914490 +C: "OO", 1924914490, 1924914854 +C: "OO", 1924914854, 1925274458 +C: "OO", 1925274458, 1927346475 +C: "OO", 1927346475, 1927465045 +C: "OO", 1927465045, 1928000319 +C: "OO", 1928000319, 1928039702 +C: "OO", 1928039702, 1928290111 +C: "OO", 1928290111, 1928603327 +C: "OO", 1928603327, 1930000195 +C: "OO", 1930000195, 1930679629 +C: "OO", 1930679629, 1931290830 +C: "OO", 1931290830, 1931493714 +C: "OO", 1931493714, 1931685637 +C: "OO", 1931685637, 1932341236 +C: "OO", 1932341236, 1932462307 +C: "OO", 1932462307, 1932598370 +C: "OO", 1932598370, 1933504170 +C: "OO", 1933504170, 1933813930 +C: "OO", 1933813930, 1934222646 +C: "OO", 1934222646, 1934868698 +C: "OO", 1934868698, 1935152309 +C: "OO", 1935152309, 1935566881 +C: "OO", 1935566881, 1936407610 +C: "OO", 1936407610, 1936793111 +C: "OO", 1936793111, 1936863115 +C: "OO", 1936863115, 1937468291 +C: "OO", 1937468291, 1937992003 +C: "OO", 1937992003, 1938637142 +C: "OO", 1938637142, 1938752870 +C: "OO", 1938752870, 1940126217 +C: "OO", 1940126217, 1940279775 +C: "OO", 1940279775, 1941320721 +C: "OO", 1941320721, 1941635611 +C: "OO", 1941635611, 1942546793 +C: "OO", 1942546793, 1943027716 +C: "OO", 1943027716, 1946520150 +C: "OO", 1946520150, 1948155363 +C: "OO", 1948155363, 1949050991 +C: "OO", 1949050991, 1950162609 +C: "OO", 1950162609, 1950477021 +C: "OO", 1950477021, 1951385395 +C: "OO", 1951385395, 1953074036 +C: "OO", 1953074036, 1953192197 +C: "OO", 1953192197, 1953496124 +C: "OO", 1953496124, 1955142172 +C: "OO", 1955142172, 1955281155 +C: "OO", 1955281155, 1955408058 +C: "OO", 1955408058, 1955830283 +C: "OO", 1955830283, 1956159142 +C: "OO", 1956159142, 1956229255 +C: "OO", 1956229255, 1956340327 +C: "OO", 1956340327, 1957119200 +C: "OO", 1957119200, 1957525921 +C: "OO", 1957525921, 1959028796 +C: "OO", 1959028796, 1959095860 +C: "OO", 1959095860, 1959451314 +C: "OO", 1959451314, 1960243775 +C: "OO", 1960243775, 1961133529 +C: "OO", 1961133529, 1961630600 +C: "OO", 1961630600, 1962016454 +C: "OO", 1962016454, 1962122257 +C: "OO", 1962122257, 1963838721 +C: "OO", 1963838721, 1963947494 +C: "OO", 1963947494, 1964801518 +C: "OO", 1964801518, 1965038908 +C: "OO", 1965038908, 1966625335 +C: "OO", 1966625335, 1967229746 +C: "OO", 1967229746, 1967546934 +C: "OO", 1967546934, 1967727775 +C: "OO", 1967727775, 1968038091 +C: "OO", 1968038091, 1968107131 +C: "OO", 1968107131, 1968239721 +C: "OO", 1968239721, 1968482382 +C: "OO", 1968482382, 1968520837 +C: "OO", 1968520837, 1968694061 +C: "OO", 1968694061, 1968828875 +C: "OO", 1968828875, 1968932297 +C: "OO", 1968932297, 1969187549 +C: "OO", 1969187549, 1970106223 +C: "OO", 1970106223, 1970413750 +C: "OO", 1970413750, 1971907565 +C: "OO", 1971907565, 1972266056 +C: "OO", 1972266056, 1972595123 +C: "OO", 1972595123, 1972773682 +C: "OO", 1972773682, 1973331499 +C: "OO", 1973331499, 1973711174 +C: "OO", 1973711174, 1975207924 +C: "OO", 1975207924, 1975434735 +C: "OO", 1975434735, 1976207638 +C: "OO", 1976207638, 1976743820 +C: "OO", 1976743820, 1976814410 +C: "OO", 1976814410, 1977174004 +C: "OO", 1977174004, 1977327947 +C: "OO", 1977327947, 1977767310 +C: "OO", 1977767310, 1978057489 +C: "OO", 1978057489, 1978135436 +C: "OO", 1978135436, 1978179717 +C: "OO", 1978179717, 1978670282 +C: "OO", 1978670282, 1978791779 +C: "OO", 1978791779, 1979055725 +C: "OO", 1979055725, 1979356263 +C: "OO", 1979356263, 1979836249 +C: "OO", 1979836249, 1981873470 +C: "OO", 1981873470, 1982080654 +C: "OO", 1982080654, 1982365483 +C: "OO", 1982365483, 1982760615 +C: "OO", 1982760615, 1982795151 +C: "OO", 1982795151, 1982840673 +C: "OO", 1982840673, 1985581391 +C: "OO", 1985581391, 1986891185 +C: "OO", 1986891185, 1987123601 +C: "OO", 1987123601, 1987344469 +C: "OO", 1987344469, 1989129364 +C: "OO", 1989129364, 1989182189 +C: "OO", 1989182189, 1990099426 +C: "OO", 1990099426, 1991136800 +C: "OO", 1991136800, 1991499661 +C: "OO", 1991499661, 1991707078 +C: "OO", 1991707078, 1992164996 +C: "OO", 1992164996, 1992270783 +C: "OO", 1992270783, 1993858333 +C: "OO", 1993858333, 1994204686 +C: "OO", 1994204686, 1994464073 +C: "OO", 1994464073, 1994669791 +C: "OO", 1994669791, 1995075614 +C: "OO", 1995075614, 1995707338 +C: "OO", 1995707338, 1996023963 +C: "OO", 1996023963, 1996362207 +C: "OO", 1996362207, 1997082296 +C: "OO", 1997082296, 1997910608 +C: "OO", 1997910608, 1999801871 +C: "OO", 1999801871, 2000385814 +C: "OO", 2000385814, 2000578863 +C: "OO", 2000578863, 2001145685 +C: "OO", 2001145685, 2001224917 +C: "OO", 2001224917, 2003819657 +C: "OO", 2003819657, 2004895388 +C: "OO", 2004895388, 2004982633 +C: "OO", 2004982633, 2005056721 +C: "OO", 2005056721, 2005737399 +C: "OO", 2005737399, 2005837305 +C: "OO", 2005837305, 2006481920 +C: "OO", 2006481920, 2007364534 +C: "OO", 2007364534, 2007622969 +C: "OO", 2007622969, 2007752566 +C: "OO", 2007752566, 2007956746 +C: "OO", 2007956746, 2009049350 +C: "OO", 2009049350, 2009273913 +C: "OO", 2009273913, 2010598285 +C: "OO", 2010598285, 2011371412 +C: "OO", 2011371412, 2011788209 +C: "OO", 2011788209, 2013442886 +C: "OO", 2013442886, 2015606433 +C: "OO", 2015606433, 2016035233 +C: "OO", 2016035233, 2016288019 +C: "OO", 2016288019, 2016403184 +C: "OO", 2016403184, 2017377313 +C: "OO", 2017377313, 2017437068 +C: "OO", 2017437068, 2017442282 +C: "OO", 2017442282, 2017839351 +C: "OO", 2017839351, 2017921515 +C: "OO", 2017921515, 2018865998 +C: "OO", 2018865998, 2019657961 +C: "OO", 2019657961, 2020775766 +C: "OO", 2020775766, 2020940847 +C: "OO", 2020940847, 2021544271 +C: "OO", 2021544271, 2021574820 +C: "OO", 2021574820, 2022377884 +C: "OO", 2022377884, 2023369855 +C: "OO", 2023369855, 2023600326 +C: "OO", 2023600326, 2024017895 +C: "OO", 2024017895, 2024169047 +C: "OO", 2024169047, 2024755612 +C: "OO", 2024755612, 2024929207 +C: "OO", 2024929207, 2025257989 +C: "OO", 2025257989, 2025841554 +C: "OO", 2025841554, 2025912545 +C: "OO", 2025912545, 2026002597 +C: "OO", 2026002597, 2026174303 +C: "OO", 2026174303, 2026414988 +C: "OO", 2026414988, 2026600835 +C: "OO", 2026600835, 2027217866 +C: "OO", 2027217866, 2028147437 +C: "OO", 2028147437, 2028575977 +C: "OO", 2028575977, 2029752369 +C: "OO", 2029752369, 2030108477 +C: "OO", 2030108477, 2031217221 +C: "OO", 2031217221, 2031303927 +C: "OO", 2031303927, 2031530190 +C: "OO", 2031530190, 2032232859 +C: "OO", 2032232859, 2032239988 +C: "OO", 2032239988, 2032644535 +C: "OO", 2032644535, 2033233774 +C: "OO", 2033233774, 2034240203 +C: "OO", 2034240203, 2036043861 +C: "OO", 2036043861, 2036418209 +C: "OO", 2036418209, 2036519177 +C: "OO", 2036519177, 2036709416 +C: "OO", 2036709416, 2036713904 +C: "OO", 2036713904, 2038587092 +C: "OO", 2038587092, 2038778139 +C: "OO", 2038778139, 2038934140 +C: "OO", 2038934140, 2040510028 +C: "OO", 2040510028, 2044393489 +C: "OO", 2044393489, 2046156675 +C: "OO", 2046156675, 2046287897 +C: "OO", 2046287897, 2047386685 +C: "OO", 2047386685, 2047848798 +C: "OO", 2047848798, 2048199745 +C: "OO", 2048199745, 2048339467 +C: "OO", 2048339467, 2049136242 +C: "OO", 2049136242, 2049874841 +C: "OO", 2049874841, 2050234798 +C: "OO", 2050234798, 2050477928 +C: "OO", 2050477928, 2051321429 +C: "OO", 2051321429, 2051429246 +C: "OO", 2051429246, 2052393619 +C: "OO", 2052393619, 2052599055 +C: "OO", 2052599055, 2053764826 +C: "OO", 2053764826, 2054433441 +C: "OO", 2054433441, 2054448861 +C: "OO", 2054448861, 2055463585 +C: "OO", 2055463585, 2055699918 +C: "OO", 2055699918, 2056428069 +C: "OO", 2056428069, 2057212773 +C: "OO", 2057212773, 2057692516 +C: "OO", 2057692516, 2057818635 +C: "OO", 2057818635, 2058455885 +C: "OO", 2058455885, 2058715220 +C: "OO", 2058715220, 2058728495 +C: "OO", 2058728495, 2059264754 +C: "OO", 2059264754, 2059771111 +C: "OO", 2059771111, 2060803857 +C: "OO", 2060803857, 2061071359 +C: "OO", 2061071359, 2061472592 +C: "OO", 2061472592, 2061667201 +C: "OO", 2061667201, 2061678743 +C: "OO", 2061678743, 2061860618 +C: "OO", 2061860618, 2062211501 +C: "OO", 2062211501, 2062366754 +C: "OO", 2062366754, 2062441055 +C: "OO", 2062441055, 2062715284 +C: "OO", 2062715284, 2063062204 +C: "OO", 2063062204, 2063303126 +C: "OO", 2063303126, 2063958359 +C: "OO", 2063958359, 2064349638 +C: "OO", 2064349638, 2064528218 +C: "OO", 2064528218, 2064633814 +C: "OO", 2064633814, 2065199384 +C: "OO", 2065199384, 2065502265 +C: "OO", 2065502265, 2065937387 +C: "OO", 2065937387, 2066494271 +C: "OO", 2066494271, 2067011634 +C: "OO", 2067011634, 2067264595 +C: "OO", 2067264595, 2067496766 +C: "OO", 2067496766, 2067715669 +C: "OO", 2067715669, 2067895465 +C: "OO", 2067895465, 2068266620 +C: "OO", 2068266620, 2068552278 +C: "OO", 2068552278, 2069387330 +C: "OO", 2069387330, 2069965503 +C: "OO", 2069965503, 2070133549 +C: "OO", 2070133549, 2070247709 +C: "OO", 2070247709, 2070605271 +C: "OO", 2070605271, 2070741225 +C: "OO", 2070741225, 2071144711 +C: "OO", 2071144711, 2072892394 +C: "OO", 2072892394, 2073157130 +C: "OO", 2073157130, 2073267977 +C: "OO", 2073267977, 2073509129 +C: "OO", 2073509129, 2073819797 +C: "OO", 2073819797, 2075441558 +C: "OO", 2075441558, 2075657430 +C: "OO", 2075657430, 2076107313 +C: "OO", 2076107313, 2076336484 +C: "OO", 2076336484, 2076380570 +C: "OO", 2076380570, 2076652979 +C: "OO", 2076652979, 2077483791 +C: "OO", 2077483791, 2078334567 +C: "OO", 2078334567, 2078407517 +C: "OO", 2078407517, 2079517710 +C: "OO", 2079517710, 2079655409 +C: "OO", 2079655409, 2080169222 +C: "OO", 2080169222, 2080525531 +C: "OO", 2080525531, 2080548316 +C: "OO", 2080548316, 2080652166 +C: "OO", 2080652166, 2080703211 +C: "OO", 2080703211, 2081864839 +C: "OO", 2081864839, 2082079304 +C: "OO", 2082079304, 2082357968 +C: "OO", 2082357968, 2082968044 +C: "OO", 2082968044, 2083031021 +C: "OO", 2083031021, 2084062805 +C: "OO", 2084062805, 2084852934 +C: "OO", 2084852934, 2085264148 +C: "OO", 2085264148, 2085989427 +C: "OO", 2085989427, 2086755244 +C: "OO", 2086755244, 2086995077 +C: "OO", 2086995077, 2088923959 +C: "OO", 2088923959, 2089207247 +C: "OO", 2089207247, 2089373271 +C: "OO", 2089373271, 2089408679 +C: "OO", 2089408679, 2089675603 +C: "OO", 2089675603, 2090654655 +C: "OO", 2090654655, 2090685172 +C: "OO", 2090685172, 2091834389 +C: "OO", 2091834389, 2092656145 +C: "OO", 2092656145, 2093272186 +C: "OO", 2093272186, 2093341231 +C: "OO", 2093341231, 2093736110 +C: "OO", 2093736110, 2094505924 +C: "OO", 2094505924, 2095548945 +C: "OO", 2095548945, 2097224786 +C: "OO", 2097224786, 2097576529 +C: "OO", 2097576529, 2097631226 +C: "OO", 2097631226, 2097948361 +C: "OO", 2097948361, 2098869618 +C: "OO", 2098869618, 2098964966 +C: "OO", 2098964966, 2098967995 +C: "OO", 2098967995, 2099466527 +C: "OO", 2099466527, 2099639206 +C: "OO", 2099639206, 2099711030 +C: "OO", 2099711030, 2100567771 +C: "OO", 2100567771, 2101963829 +C: "OO", 2101963829, 2102155448 +C: "OO", 2102155448, 2102337820 +C: "OO", 2102337820, 2104310500 +C: "OO", 2104310500, 2104582854 +C: "OO", 2104582854, 2105249374 +C: "OO", 2105249374, 2105379167 +C: "OO", 2105379167, 2105736638 +C: "OO", 2105736638, 2106173101 +C: "OO", 2106173101, 2106175554 +C: "OO", 2106175554, 2106469071 +C: "OO", 2106469071, 2106801311 +C: "OO", 2106801311, 2107161541 +C: "OO", 2107161541, 2107720493 +C: "OO", 2107720493, 2108712752 +C: "OO", 2108712752, 2108820301 +C: "OO", 2108820301, 2108927907 +C: "OO", 2108927907, 2109333657 +C: "OO", 2109333657, 2109856085 +C: "OO", 2109856085, 2110149402 +C: "OO", 2110149402, 2110260781 +C: "OO", 2110260781, 2110362774 +C: "OO", 2110362774, 2111585815 +C: "OO", 2111585815, 2112304341 +C: "OO", 2112304341, 2112375155 +C: "OO", 2112375155, 2112773834 +C: "OO", 2112773834, 2112971442 +C: "OO", 2112971442, 2113601758 +C: "OO", 2113601758, 2113948462 +C: "OO", 2113948462, 2114689106 +C: "OO", 2114689106, 2114930597 +C: "OO", 2114930597, 2116370372 +C: "OO", 2116370372, 2119249626 +C: "OO", 2119249626, 2119371737 +C: "OO", 2119371737, 2119918472 +C: "OO", 2119918472, 2120180599 +C: "OO", 2120180599, 2120285749 +C: "OO", 2120285749, 2121025191 +C: "OO", 2121025191, 2121505580 +C: "OO", 2121505580, 2122149121 +C: "OO", 2122149121, 2122284891 +C: "OO", 2122284891, 2122359831 +C: "OO", 2122359831, 2123171686 +C: "OO", 2123171686, 2123545185 +C: "OO", 2123545185, 2124033441 +C: "OO", 2124033441, 2124866193 +C: "OO", 2124866193, 2125841372 +C: "OO", 2125841372, 2126563922 +C: "OO", 2126563922, 2127492103 +C: "OO", 2127492103, 2128079607 +C: "OO", 2128079607, 2129184028 +C: "OO", 2129184028, 2129335634 +C: "OO", 2129335634, 2130295231 +C: "OO", 2130295231, 2131757677 +C: "OO", 2131757677, 2132459262 +C: "OO", 2132459262, 2134270100 +C: "OO", 2134270100, 2134998811 +C: "OO", 2134998811, 2135437658 +C: "OO", 2135437658, 2135701514 +C: "OO", 2135701514, 2136121141 +C: "OO", 2136121141, 2136320422 +C: "OO", 2136320422, 2139059108 +C: "OO", 2139059108, 2139155542 +C: "OO", 2139155542, 2139248545 +C: "OO", 2139248545, 2139590883 +C: "OO", 2139590883, 2140610492 +C: "OO", 2140610492, 2140782293 +C: "OO", 2140782293, 2141111348 +C: "OO", 2141111348, 2141379647 +C: "OO", 2141379647, 2142934097 +C: "OO", 2142934097, 2145113543 +C: "OO", 2145113543, 2145804581 +C: "OO", 2145804581, 2146164345 +C: "OO", 2146164345, 2146224268 +C: "OO", 2146224268, 2146640383 +C: "OO", 2146640383, 2146674630 +C: "OO", 2146674630, 2147904195 +C: "OO", 2147904195, 2148586252 +C: "OO", 2148586252, 2148910199 +C: "OO", 2148910199, 2149030365 +C: "OO", 2149030365, 2149052663 +C: "OO", 2149052663, 2149621823 +C: "OO", 2149621823, 2149652319 +C: "OO", 2149652319, 2149673957 +C: "OO", 2149673957, 2149726754 +C: "OO", 2149726754, 2149917699 +C: "OO", 2149917699, 2150346166 +C: "OO", 2150346166, 2150414465 +C: "OO", 2150414465, 2150439700 +C: "OO", 2150439700, 2150503291 +C: "OO", 2150503291, 2150646489 +C: "OO", 2150646489, 2150772939 +C: "OO", 2150772939, 2151208774 +C: "OO", 2151208774, 2151896910 +C: "OO", 2151896910, 2152187768 +C: "OO", 2152187768, 2152316413 +C: "OO", 2152316413, 2152568969 +C: "OO", 2152568969, 2152693629 +C: "OO", 2152693629, 2156617162 +C: "OO", 2156617162, 2161769894 +C: "OO", 2161769894, 2161807053 +C: "OO", 2161807053, 2162077067 +C: "OO", 2162077067, 2162193355 +C: "OO", 2162193355, 2162472253 +C: "OO", 2162472253, 2163104840 +C: "OO", 2163104840, 2163356659 +C: "OO", 2163356659, 2164324650 +C: "OO", 2164324650, 2164341409 +C: "OO", 2164341409, 2165198165 +C: "OO", 2165198165, 2165257555 +C: "OO", 2165257555, 2165484488 +C: "OO", 2165484488, 2166052889 +C: "OO", 2166052889, 2166533283 +C: "OO", 2166533283, 2166559118 +C: "OO", 2166559118, 2166888133 +C: "OO", 2166888133, 2167269921 +C: "OO", 2167269921, 2167481058 +C: "OO", 2167481058, 2168272518 +C: "OO", 2168272518, 2168648158 +C: "OO", 2168648158, 2169977801 +C: "OO", 2169977801, 2170528438 +C: "OO", 2170528438, 2170569763 +C: "OO", 2170569763, 2171308215 +C: "OO", 2171308215, 2171714912 +C: "OO", 2171714912, 2171721003 +C: "OO", 2171721003, 2171746423 +C: "OO", 2171746423, 2172830885 +C: "OO", 2172830885, 2173179121 +C: "OO", 2173179121, 2174082289 +C: "OO", 2174082289, 2174643979 +C: "OO", 2174643979, 2175381013 +C: "OO", 2175381013, 2175462601 +C: "OO", 2175462601, 2175877531 +C: "OO", 2175877531, 2176171084 +C: "OO", 2176171084, 2177095711 +C: "OO", 2177095711, 2177365636 +C: "OO", 2177365636, 2177786081 +C: "OO", 2177786081, 2177799340 +C: "OO", 2177799340, 2178058990 +C: "OO", 2178058990, 2178248779 +C: "OO", 2178248779, 2178718166 +C: "OO", 2178718166, 2179201253 +C: "OO", 2179201253, 2179302809 +C: "OO", 2179302809, 2179764238 +C: "OO", 2179764238, 2180857469 +C: "OO", 2180857469, 2181271917 +C: "OO", 2181271917, 2181299558 +C: "OO", 2181299558, 2182573777 +C: "OO", 2182573777, 2182988003 +C: "OO", 2182988003, 2183258454 +C: "OO", 2183258454, 2183269373 +C: "OO", 2183269373, 2184457828 +C: "OO", 2184457828, 2185305638 +C: "OO", 2185305638, 2186201166 +C: "OO", 2186201166, 2186379646 +C: "OO", 2186379646, 2186891997 +C: "OO", 2186891997, 2188291007 +C: "OO", 2188291007, 2188360753 +C: "OO", 2188360753, 2188460195 +C: "OO", 2188460195, 2189442678 +C: "OO", 2189442678, 2189811325 +C: "OO", 2189811325, 2190504439 +C: "OO", 2190504439, 2191479700 +C: "OO", 2191479700, 2191672049 +C: "OO", 2191672049, 2192656421 +C: "OO", 2192656421, 2192937017 +C: "OO", 2192937017, 2194036646 +C: "OO", 2194036646, 2194428873 +C: "OO", 2194428873, 2194618451 +C: "OO", 2194618451, 2194942013 +C: "OO", 2194942013, 2196132089 +C: "OO", 2196132089, 2198102480 +C: "OO", 2198102480, 2198982122 +C: "OO", 2198982122, 2199066477 +C: "OO", 2199066477, 2199255755 +C: "OO", 2199255755, 2199475633 +C: "OO", 2199475633, 2200142481 +C: "OO", 2200142481, 2201568391 +C: "OO", 2201568391, 2201677366 +C: "OO", 2201677366, 2203116867 +C: "OO", 2203116867, 2204599542 +C: "OO", 2204599542, 2204852845 +C: "OO", 2204852845, 2205349387 +C: "OO", 2205349387, 2205644217 +C: "OO", 2205644217, 2205940808 +C: "OO", 2205940808, 2205989305 +C: "OO", 2205989305, 2206123257 +C: "OO", 2206123257, 2206979434 +C: "OO", 2206979434, 2207142027 +C: "OO", 2207142027, 2207303566 +C: "OO", 2207303566, 2207899567 +C: "OO", 2207899567, 2207908701 +C: "OO", 2207908701, 2209005644 +C: "OO", 2209005644, 2209782316 +C: "OO", 2209782316, 2209801898 +C: "OO", 2209801898, 2210277123 +C: "OO", 2210277123, 2210370134 +C: "OO", 2210370134, 2210431787 +C: "OO", 2210431787, 2211153484 +C: "OO", 2211153484, 2212878583 +C: "OO", 2212878583, 2212900493 +C: "OO", 2212900493, 2213260370 +C: "OO", 2213260370, 2213376117 +C: "OO", 2213376117, 2213502858 +C: "OO", 2213502858, 2214687860 +C: "OO", 2214687860, 2216752706 +C: "OO", 2216752706, 2218110713 +C: "OO", 2218110713, 2218804047 +C: "OO", 2218804047, 2219700453 +C: "OO", 2219700453, 2221644212 +C: "OO", 2221644212, 2222616471 +C: "OO", 2222616471, 2224126191 +C: "OO", 2224126191, 2224213400 +C: "OO", 2224213400, 2224839020 +C: "OO", 2224839020, 2226157642 +C: "OO", 2226157642, 2227413434 +C: "OO", 2227413434, 2228145726 +C: "OO", 2228145726, 2228925537 +C: "OO", 2228925537, 2230284691 +C: "OO", 2230284691, 2231717469 +C: "OO", 2231717469, 2231756278 +C: "OO", 2231756278, 2232562355 +C: "OO", 2232562355, 2232935059 +C: "OO", 2232935059, 2233066127 +C: "OO", 2233066127, 2233474113 +C: "OO", 2233474113, 2234147269 +C: "OO", 2234147269, 2235360767 +C: "OO", 2235360767, 2236339498 +C: "OO", 2236339498, 2236442959 +C: "OO", 2236442959, 2237273427 +C: "OO", 2237273427, 2237503451 +C: "OO", 2237503451, 2237531978 +C: "OO", 2237531978, 2237636597 +C: "OO", 2237636597, 2237892966 +C: "OO", 2237892966, 2237915430 +C: "OO", 2237915430, 2238275443 +C: "OO", 2238275443, 2238849447 +C: "OO", 2238849447, 2239176867 +C: "OO", 2239176867, 2240053107 +C: "OO", 2240053107, 2240427646 +C: "OO", 2240427646, 2240868382 +C: "OO", 2240868382, 2240916623 +C: "OO", 2240916623, 2241710083 +C: "OO", 2241710083, 2242433938 +C: "OO", 2242433938, 2243143902 +C: "OO", 2243143902, 2244504249 +C: "OO", 2244504249, 2244569099 +C: "OO", 2244569099, 2246908979 +C: "OO", 2246908979, 2247114645 +C: "OO", 2247114645, 2247448540 +C: "OO", 2247448540, 2248177004 +C: "OO", 2248177004, 2248863200 +C: "OO", 2248863200, 2249206324 +C: "OO", 2249206324, 2249364501 +C: "OO", 2249364501, 2250170569 +C: "OO", 2250170569, 2250483029 +C: "OO", 2250483029, 2252191541 +C: "OO", 2252191541, 2252429642 +C: "OO", 2252429642, 2252719525 +C: "OO", 2252719525, 2253254900 +C: "OO", 2253254900, 2253277268 +C: "OO", 2253277268, 2253342811 +C: "OO", 2253342811, 2254987401 +C: "OO", 2254987401, 2255118483 +C: "OO", 2255118483, 2255674502 +C: "OO", 2255674502, 2256929812 +C: "OO", 2256929812, 2258758255 +C: "OO", 2258758255, 2259203867 +C: "OO", 2259203867, 2259372977 +C: "OO", 2259372977, 2260043463 +C: "OO", 2260043463, 2260542699 +C: "OO", 2260542699, 2261080267 +C: "OO", 2261080267, 2261402759 +C: "OO", 2261402759, 2262308698 +C: "OO", 2262308698, 2262376123 +C: "OO", 2262376123, 2263434628 +C: "OO", 2263434628, 2264714055 +C: "OO", 2264714055, 2264882521 +C: "OO", 2264882521, 2264940296 +C: "OO", 2264940296, 2265339470 +C: "OO", 2265339470, 2265576689 +C: "OO", 2265576689, 2265663085 +C: "OO", 2265663085, 2266320875 +C: "OO", 2266320875, 2266423797 +C: "OO", 2266423797, 2267587226 +C: "OO", 2267587226, 2267838845 +C: "OO", 2267838845, 2267945891 +C: "OO", 2267945891, 2268051003 +C: "OO", 2268051003, 2268133118 +C: "OO", 2268133118, 2268400156 +C: "OO", 2268400156, 2268537078 +C: "OO", 2268537078, 2268627413 +C: "OO", 2268627413, 2268786513 +C: "OO", 2268786513, 2269869741 +C: "OO", 2269869741, 2269987876 +C: "OO", 2269987876, 2270222998 +C: "OO", 2270222998, 2272163379 +C: "OO", 2272163379, 2272284862 +C: "OO", 2272284862, 2272386200 +C: "OO", 2272386200, 2272460670 +C: "OO", 2272460670, 2273318653 +C: "OO", 2273318653, 2273430550 +C: "OO", 2273430550, 2273598507 +C: "OO", 2273598507, 2274930673 +C: "OO", 2274930673, 2275313297 +C: "OO", 2275313297, 2275547237 +C: "OO", 2275547237, 2276628291 +C: "OO", 2276628291, 2276648225 +C: "OO", 2276648225, 2277000271 +C: "OO", 2277000271, 2278298446 +C: "OO", 2278298446, 2278520096 +C: "OO", 2278520096, 2278763930 +C: "OO", 2278763930, 2279163467 +C: "OO", 2279163467, 2279323899 +C: "OO", 2279323899, 2281180806 +C: "OO", 2281180806, 2283314474 +C: "OO", 2283314474, 2283374362 +C: "OO", 2283374362, 2283706299 +C: "OO", 2283706299, 2284600505 +C: "OO", 2284600505, 2285386427 +C: "OO", 2285386427, 2285457818 +C: "OO", 2285457818, 2285615598 +C: "OO", 2285615598, 2286345585 +C: "OO", 2286345585, 2286386269 +C: "OO", 2286386269, 2286548657 +C: "OO", 2286548657, 2287863054 +C: "OO", 2287863054, 2287938135 +C: "OO", 2287938135, 2288008615 +C: "OO", 2288008615, 2289926742 +C: "OO", 2289926742, 2289945993 +C: "OO", 2289945993, 2290131638 +C: "OO", 2290131638, 2290190930 +C: "OO", 2290190930, 2290764538 +C: "OO", 2290764538, 2291546570 +C: "OO", 2291546570, 2291762228 +C: "OO", 2291762228, 2293130917 +C: "OO", 2293130917, 2293270553 +C: "OO", 2293270553, 2293313579 +C: "OO", 2293313579, 2293515721 +C: "OO", 2293515721, 2294373671 +C: "OO", 2294373671, 2294871244 +C: "OO", 2294871244, 2295195511 +C: "OO", 2295195511, 2296260046 +C: "OO", 2296260046, 2296814130 +C: "OO", 2296814130, 2297140508 +C: "OO", 2297140508, 2297308053 +C: "OO", 2297308053, 2297353119 +C: "OO", 2297353119, 2298012283 +C: "OO", 2298012283, 2298276647 +C: "OO", 2298276647, 2300082006 +C: "OO", 2300082006, 2300962054 +C: "OO", 2300962054, 2301118750 +C: "OO", 2301118750, 2302347716 +C: "OO", 2302347716, 2302435637 +C: "OO", 2302435637, 2302725125 +C: "OO", 2302725125, 2303467227 +C: "OO", 2303467227, 2304160891 +C: "OO", 2304160891, 2304572878 +C: "OO", 2304572878, 2304598753 +C: "OO", 2304598753, 2305645037 +C: "OO", 2305645037, 2306106379 +C: "OO", 2306106379, 2306358406 +C: "OO", 2306358406, 2307586491 +C: "OO", 2307586491, 2307878382 +C: "OO", 2307878382, 2308901782 +C: "OO", 2308901782, 2309969483 +C: "OO", 2309969483, 2310568803 +C: "OO", 2310568803, 2311830197 +C: "OO", 2311830197, 2311930514 +C: "OO", 2311930514, 2312094370 +C: "OO", 2312094370, 2312468670 +C: "OO", 2312468670, 2313085681 +C: "OO", 2313085681, 2315491051 +C: "OO", 2315491051, 2315667326 +C: "OO", 2315667326, 2315725937 +C: "OO", 2315725937, 2316367611 +C: "OO", 2316367611, 2316520060 +C: "OO", 2316520060, 2317439601 +C: "OO", 2317439601, 2318573677 +C: "OO", 2318573677, 2318629653 +C: "OO", 2318629653, 2319132187 +C: "OO", 2319132187, 2320082548 +C: "OO", 2320082548, 2321024668 +C: "OO", 2321024668, 2321047124 +C: "OO", 2321047124, 2321367560 +C: "OO", 2321367560, 2321419982 +C: "OO", 2321419982, 2321524398 +C: "OO", 2321524398, 2321539629 +C: "OO", 2321539629, 2321795731 +C: "OO", 2321795731, 2321960930 +C: "OO", 2321960930, 2322932279 +C: "OO", 2322932279, 2324497869 +C: "OO", 2324497869, 2324578378 +C: "OO", 2324578378, 2325882774 +C: "OO", 2325882774, 2326554285 +C: "OO", 2326554285, 2326673326 +C: "OO", 2326673326, 2326795487 +C: "OO", 2326795487, 2327594509 +C: "OO", 2327594509, 2327810271 +C: "OO", 2327810271, 2328023346 +C: "OO", 2328023346, 2328364966 +C: "OO", 2328364966, 2330725838 +C: "OO", 2330725838, 2330922569 +C: "OO", 2330922569, 2331351574 +C: "OO", 2331351574, 2331441834 +C: "OO", 2331441834, 2332251416 +C: "OO", 2332251416, 2334273482 +C: "OO", 2334273482, 2334501622 +C: "OO", 2334501622, 2334699365 +C: "OO", 2334699365, 2335320022 +C: "OO", 2335320022, 2335511523 +C: "OO", 2335511523, 2336867093 +C: "OO", 2336867093, 2336900049 +C: "OO", 2336900049, 2337882347 +C: "OO", 2337882347, 2338069070 +C: "OO", 2338069070, 2338678817 +C: "OO", 2338678817, 2339292414 +C: "OO", 2339292414, 2339871122 +C: "OO", 2339871122, 2340257373 +C: "OO", 2340257373, 2341124581 +C: "OO", 2341124581, 2342319693 +C: "OO", 2342319693, 2342965588 +C: "OO", 2342965588, 2343187420 +C: "OO", 2343187420, 2343202667 +C: "OO", 2343202667, 2343697369 +C: "OO", 2343697369, 2344516324 +C: "OO", 2344516324, 2345152509 +C: "OO", 2345152509, 2345538753 +C: "OO", 2345538753, 2346429747 +C: "OO", 2346429747, 2346891032 +C: "OO", 2346891032, 2347189472 +C: "OO", 2347189472, 2347330839 +C: "OO", 2347330839, 2347952321 +C: "OO", 2347952321, 2348481211 +C: "OO", 2348481211, 2348545005 +C: "OO", 2348545005, 2352207643 +C: "OO", 2352207643, 2352638973 +C: "OO", 2352638973, 2352806118 +C: "OO", 2352806118, 2353516074 +C: "OO", 2353516074, 2353823114 +C: "OO", 2353823114, 2354419665 +C: "OO", 2354419665, 2354637651 +C: "OO", 2354637651, 2354658171 +C: "OO", 2354658171, 2355419886 +C: "OO", 2355419886, 2355568878 +C: "OO", 2355568878, 2355739339 +C: "OO", 2355739339, 2355767921 +C: "OO", 2355767921, 2355861750 +C: "OO", 2355861750, 2355980727 +C: "OO", 2355980727, 2356827969 +C: "OO", 2356827969, 2358585439 +C: "OO", 2358585439, 2360671305 +C: "OO", 2360671305, 2361299451 +C: "OO", 2361299451, 2361723453 +C: "OO", 2361723453, 2362700564 +C: "OO", 2362700564, 2363014916 +C: "OO", 2363014916, 2363199748 +C: "OO", 2363199748, 2363247606 +C: "OO", 2363247606, 2363538892 +C: "OO", 2363538892, 2363901042 +C: "OO", 2363901042, 2364700429 +C: "OO", 2364700429, 2364791670 +C: "OO", 2364791670, 2364904686 +C: "OO", 2364904686, 2365641461 +C: "OO", 2365641461, 2366336579 +C: "OO", 2366336579, 2368431729 +C: "OO", 2368431729, 2369711361 +C: "OO", 2369711361, 2369969254 +C: "OO", 2369969254, 2370399469 +C: "OO", 2370399469, 2370836758 +C: "OO", 2370836758, 2372210205 +C: "OO", 2372210205, 2373844007 +C: "OO", 2373844007, 2374513710 +C: "OO", 2374513710, 2374761484 +C: "OO", 2374761484, 2374907238 +C: "OO", 2374907238, 2374978495 +C: "OO", 2374978495, 2376158289 +C: "OO", 2376158289, 2376482576 +C: "OO", 2376482576, 2376525529 +C: "OO", 2376525529, 2376740333 +C: "OO", 2376740333, 2377125599 +C: "OO", 2377125599, 2377485655 +C: "OO", 2377485655, 2379235655 +C: "OO", 2379235655, 2379301618 +C: "OO", 2379301618, 2380629162 +C: "OO", 2380629162, 2381025786 +C: "OO", 2381025786, 2381059511 +C: "OO", 2381059511, 2381887734 +C: "OO", 2381887734, 2381895134 +C: "OO", 2381895134, 2383055629 +C: "OO", 2383055629, 2383763902 +C: "OO", 2383763902, 2384293915 +C: "OO", 2384293915, 2384829013 +C: "OO", 2384829013, 2385135741 +C: "OO", 2385135741, 2385207632 +C: "OO", 2385207632, 2385216764 +C: "OO", 2385216764, 2385334105 +C: "OO", 2385334105, 2385553880 +C: "OO", 2385553880, 2386493278 +C: "OO", 2386493278, 2386747795 +C: "OO", 2386747795, 2386833659 +C: "OO", 2386833659, 2387951694 +C: "OO", 2387951694, 2388632077 +C: "OO", 2388632077, 2388642607 +C: "OO", 2388642607, 2390955986 +C: "OO", 2390955986, 2392151229 +C: "OO", 2392151229, 2392572318 +C: "OO", 2392572318, 2392854545 +C: "OO", 2392854545, 2392999683 +C: "OO", 2392999683, 2393650843 +C: "OO", 2393650843, 2394584542 +C: "OO", 2394584542, 2394782665 +C: "OO", 2394782665, 2396138936 +C: "OO", 2396138936, 2396918535 +C: "OO", 2396918535, 2397421538 +C: "OO", 2397421538, 2397782051 +C: "OO", 2397782051, 2398110475 +C: "OO", 2398110475, 2398469471 +C: "OO", 2398469471, 2398556381 +C: "OO", 2398556381, 2398663997 +C: "OO", 2398663997, 2398668271 +C: "OO", 2398668271, 2400193814 +C: "OO", 2400193814, 2401404046 +C: "OO", 2401404046, 2401989406 +C: "OO", 2401989406, 2402001457 +C: "OO", 2402001457, 2403147111 +C: "OO", 2403147111, 2404039221 +C: "OO", 2404039221, 2404363370 +C: "OO", 2404363370, 2405505889 +C: "OO", 2405505889, 2405889053 +C: "OO", 2405889053, 2407334698 +C: "OO", 2407334698, 2407540220 +C: "OO", 2407540220, 2407750492 +C: "OO", 2407750492, 2407892306 +C: "OO", 2407892306, 2408393742 +C: "OO", 2408393742, 2408502201 +C: "OO", 2408502201, 2408946263 +C: "OO", 2408946263, 2409290694 +C: "OO", 2409290694, 2409480781 +C: "OO", 2409480781, 2410092855 +C: "OO", 2410092855, 2410251286 +C: "OO", 2410251286, 2410315957 +C: "OO", 2410315957, 2410539273 +C: "OO", 2410539273, 2412302899 +C: "OO", 2412302899, 2412727335 +C: "OO", 2412727335, 2413049873 +C: "OO", 2413049873, 2413242296 +C: "OO", 2413242296, 2413316779 +C: "OO", 2413316779, 2413407477 +C: "OO", 2413407477, 2413682791 +C: "OO", 2413682791, 2413893124 +C: "OO", 2413893124, 2414214901 +C: "OO", 2414214901, 2414918420 +C: "OO", 2414918420, 2415083038 +C: "OO", 2415083038, 2415388603 +C: "OO", 2415388603, 2418071938 +C: "OO", 2418071938, 2418231082 +C: "OO", 2418231082, 2418785481 +C: "OO", 2418785481, 2418838717 +C: "OO", 2418838717, 2419152572 +C: "OO", 2419152572, 2419164692 +C: "OO", 2419164692, 2421011049 +C: "OO", 2421011049, 2421375932 +C: "OO", 2421375932, 2421506137 +C: "OO", 2421506137, 2422806054 +C: "OO", 2422806054, 2423103747 +C: "OO", 2423103747, 2423909947 +C: "OO", 2423909947, 2425121503 +C: "OO", 2425121503, 2426006385 +C: "OO", 2426006385, 2426547194 +C: "OO", 2426547194, 2426551770 +C: "OO", 2426551770, 2427151606 +C: "OO", 2427151606, 2428726339 +C: "OO", 2428726339, 2428884090 +C: "OO", 2428884090, 2429082911 +C: "OO", 2429082911, 2429522442 +C: "OO", 2429522442, 2429557655 +C: "OO", 2429557655, 2430362177 +C: "OO", 2430362177, 2430592541 +C: "OO", 2430592541, 2430997799 +C: "OO", 2430997799, 2431070409 +C: "OO", 2431070409, 2432767250 +C: "OO", 2432767250, 2433997457 +C: "OO", 2433997457, 2434843001 +C: "OO", 2434843001, 2435573298 +C: "OO", 2435573298, 2435670561 +C: "OO", 2435670561, 2436983807 +C: "OO", 2436983807, 2438164658 +C: "OO", 2438164658, 2438589829 +C: "OO", 2438589829, 2438907145 +C: "OO", 2438907145, 2440818135 +C: "OO", 2440818135, 2441158304 +C: "OO", 2441158304, 2441511095 +C: "OO", 2441511095, 2441633192 +C: "OO", 2441633192, 2442325293 +C: "OO", 2442325293, 2442531506 +C: "OO", 2442531506, 2443453473 +C: "OO", 2443453473, 2443579975 +C: "OO", 2443579975, 2444391190 +C: "OO", 2444391190, 2445652322 +C: "OO", 2445652322, 2446905909 +C: "OO", 2446905909, 2447101967 +C: "OO", 2447101967, 2447284556 +C: "OO", 2447284556, 2447812784 +C: "OO", 2447812784, 2449117803 +C: "OO", 2449117803, 2449533099 +C: "OO", 2449533099, 2449917043 +C: "OO", 2449917043, 2450189575 +C: "OO", 2450189575, 2451010627 +C: "OO", 2451010627, 2451029889 +C: "OO", 2451029889, 2451507407 +C: "OO", 2451507407, 2451532540 +C: "OO", 2451532540, 2451541737 +C: "OO", 2451541737, 2451589606 +C: "OO", 2451589606, 2452058942 +C: "OO", 2452058942, 2452490715 +C: "OO", 2452490715, 2453940932 +C: "OO", 2453940932, 2455081605 +C: "OO", 2455081605, 2457112431 +C: "OO", 2457112431, 2457958770 +C: "OO", 2457958770, 2458414040 +C: "OO", 2458414040, 2458425037 +C: "OO", 2458425037, 2458903435 +C: "OO", 2458903435, 2459290213 +C: "OO", 2459290213, 2460439989 +C: "OO", 2460439989, 2460973430 +C: "OO", 2460973430, 2461909601 +C: "OO", 2461909601, 2463678130 +C: "OO", 2463678130, 2463705286 +C: "OO", 2463705286, 2464072983 +C: "OO", 2464072983, 2465018699 +C: "OO", 2465018699, 2466276258 +C: "OO", 2466276258, 2466736870 +C: "OO", 2466736870, 2466924116 +C: "OO", 2466924116, 2467397674 +C: "OO", 2467397674, 2467560675 +C: "OO", 2467560675, 2470026250 +C: "OO", 2470026250, 2470318826 +C: "OO", 2470318826, 2470503092 +C: "OO", 2470503092, 2471014381 +C: "OO", 2471014381, 2471489906 +C: "OO", 2471489906, 2471820405 +C: "OO", 2471820405, 2471880021 +C: "OO", 2471880021, 2472473694 +C: "OO", 2472473694, 2473245721 +C: "OO", 2473245721, 2475369810 +C: "OO", 2475369810, 2477332226 +C: "OO", 2477332226, 2478053101 +C: "OO", 2478053101, 2478262930 +C: "OO", 2478262930, 2478949871 +C: "OO", 2478949871, 2480498806 +C: "OO", 2480498806, 2483291434 +C: "OO", 2483291434, 2483412246 +C: "OO", 2483412246, 2485305090 +C: "OO", 2485305090, 2485501786 +C: "OO", 2485501786, 2486206729 +C: "OO", 2486206729, 2486355507 +C: "OO", 2486355507, 2486853109 +C: "OO", 2486853109, 2487019887 +C: "OO", 2487019887, 2487170878 +C: "OO", 2487170878, 2487803843 +C: "OO", 2487803843, 2488053729 +C: "OO", 2488053729, 2488677537 +C: "OO", 2488677537, 2488697600 +C: "OO", 2488697600, 2488744155 +C: "OO", 2488744155, 2488753087 +C: "OO", 2488753087, 2489463683 +C: "OO", 2489463683, 2491651033 +C: "OO", 2491651033, 2491926393 +C: "OO", 2491926393, 2493729211 +C: "OO", 2493729211, 2494038335 +C: "OO", 2494038335, 2494319570 +C: "OO", 2494319570, 2494385684 +C: "OO", 2494385684, 2495216415 +C: "OO", 2495216415, 2496012039 +C: "OO", 2496012039, 2497805369 +C: "OO", 2497805369, 2498041646 +C: "OO", 2498041646, 2498604968 +C: "OO", 2498604968, 2498614335 +C: "OO", 2498614335, 2498825985 +C: "OO", 2498825985, 2500392835 +C: "OO", 2500392835, 2501384041 +C: "OO", 2501384041, 2501541755 +C: "OO", 2501541755, 2504174243 +C: "OO", 2504174243, 2505445550 +C: "OO", 2505445550, 2505529518 +C: "OO", 2505529518, 2506391356 +C: "OO", 2506391356, 2507150326 +C: "OO", 2507150326, 2507935011 +C: "OO", 2507935011, 2509810614 +C: "OO", 2509810614, 2510183217 +C: "OO", 2510183217, 2510535629 +C: "OO", 2510535629, 2510953618 +C: "OO", 2510953618, 2511120713 +C: "OO", 2511120713, 2511808592 +C: "OO", 2511808592, 2514842958 +C: "OO", 2514842958, 2515344836 +C: "OO", 2515344836, 2516173945 +C: "OO", 2516173945, 2516807641 +C: "OO", 2516807641, 2517418425 +C: "OO", 2517418425, 2517821380 +C: "OO", 2517821380, 2519075902 +C: "OO", 2519075902, 2520298783 +C: "OO", 2520298783, 2520528994 +C: "OO", 2520528994, 2520786459 +C: "OO", 2520786459, 2521523570 +C: "OO", 2521523570, 2521584639 +C: "OO", 2521584639, 2522347169 +C: "OO", 2522347169, 2523065177 +C: "OO", 2523065177, 2523127497 +C: "OO", 2523127497, 2523338492 +C: "OO", 2523338492, 2523771290 +C: "OO", 2523771290, 2523880809 +C: "OO", 2523880809, 2524754086 +C: "OO", 2524754086, 2525493011 +C: "OO", 2525493011, 2525802275 +C: "OO", 2525802275, 2526546489 +C: "OO", 2526546489, 2527884081 +C: "OO", 2527884081, 2530111561 +C: "OO", 2530111561, 2531918961 +C: "OO", 2531918961, 2532188350 +C: "OO", 2532188350, 2532270090 +C: "OO", 2532270090, 2534070402 +C: "OO", 2534070402, 2534306970 +C: "OO", 2534306970, 2534770019 +C: "OO", 2534770019, 2534956287 +C: "OO", 2534956287, 2535462209 +C: "OO", 2535462209, 2535594707 +C: "OO", 2535594707, 2536266323 +C: "OO", 2536266323, 2536303513 +C: "OO", 2536303513, 2537602855 +C: "OO", 2537602855, 2537784586 +C: "OO", 2537784586, 2537840036 +C: "OO", 2537840036, 2538715449 +C: "OO", 2538715449, 2539742271 +C: "OO", 2539742271, 2540451826 +C: "OO", 2540451826, 2541643158 +C: "OO", 2541643158, 2542222271 +C: "OO", 2542222271, 2542862339 +C: "OO", 2542862339, 2542931511 +C: "OO", 2542931511, 2543327333 +C: "OO", 2543327333, 2543469763 +C: "OO", 2543469763, 2544203716 +C: "OO", 2544203716, 2545508158 +C: "OO", 2545508158, 2545638572 +C: "OO", 2545638572, 2546810077 +C: "OO", 2546810077, 2546953963 +C: "OO", 2546953963, 2549035138 +C: "OO", 2549035138, 2549845323 +C: "OO", 2549845323, 2550520203 +C: "OO", 2550520203, 2552496739 +C: "OO", 2552496739, 2553088917 +C: "OO", 2553088917, 2553250127 +C: "OO", 2553250127, 2553718289 +C: "OO", 2553718289, 2553723169 +C: "OO", 2553723169, 2554037139 +C: "OO", 2554037139, 2554112442 +C: "OO", 2554112442, 2554146791 +C: "OO", 2554146791, 2555222502 +C: "OO", 2555222502, 2555965711 +C: "OO", 2555965711, 2556755715 +C: "OO", 2556755715, 2559100579 +C: "OO", 2559100579, 2559846253 +C: "OO", 2559846253, 2560038608 +C: "OO", 2560038608, 2562290254 +C: "OO", 2562290254, 2562768654 +C: "OO", 2562768654, 2562953894 +C: "OO", 2562953894, 2563183292 +C: "OO", 2563183292, 2564257285 +C: "OO", 2564257285, 2564357538 +C: "OO", 2564357538, 2565192752 +C: "OO", 2565192752, 2565787602 +C: "OO", 2565787602, 2566632303 +C: "OO", 2566632303, 2566894726 +C: "OO", 2566894726, 2567282681 +C: "OO", 2567282681, 2567936513 +C: "OO", 2567936513, 2568398044 +C: "OO", 2568398044, 2568676329 +C: "OO", 2568676329, 2570196922 +C: "OO", 2570196922, 2571264533 +C: "OO", 2571264533, 2572080100 +C: "OO", 2572080100, 2572919935 +C: "OO", 2572919935, 2572984935 +C: "OO", 2572984935, 2573292917 +C: "OO", 2573292917, 2574018514 +C: "OO", 2574018514, 2574125033 +C: "OO", 2574125033, 2574636929 +C: "OO", 2574636929, 2574745150 +C: "OO", 2574745150, 2574850975 +C: "OO", 2574850975, 2575097201 +C: "OO", 2575097201, 2575613054 +C: "OO", 2575613054, 2576111882 +C: "OO", 2576111882, 2576291049 +C: "OO", 2576291049, 2576342788 +C: "OO", 2576342788, 2576773649 +C: "OO", 2576773649, 2578044722 +C: "OO", 2578044722, 2579141394 +C: "OO", 2579141394, 2579461317 +C: "OO", 2579461317, 2580061979 +C: "OO", 2580061979, 2581441481 +C: "OO", 2581441481, 2581719769 +C: "OO", 2581719769, 2582609370 +C: "OO", 2582609370, 2582778260 +C: "OO", 2582778260, 2583377045 +C: "OO", 2583377045, 2584987886 +C: "OO", 2584987886, 2585245993 +C: "OO", 2585245993, 2585489605 +C: "OO", 2585489605, 2585596266 +C: "OO", 2585596266, 2586653442 +C: "OO", 2586653442, 2587067894 +C: "OO", 2587067894, 2588018242 +C: "OO", 2588018242, 2588260574 +C: "OO", 2588260574, 2588858251 +C: "OO", 2588858251, 2589010108 +C: "OO", 2589010108, 2589803060 +C: "OO", 2589803060, 2591303790 +C: "OO", 2591303790, 2592184214 +C: "OO", 2592184214, 2592546898 +C: "OO", 2592546898, 2592827874 +C: "OO", 2592827874, 2595607407 +C: "OO", 2595607407, 2596692341 +C: "OO", 2596692341, 2596854425 +C: "OO", 2596854425, 2598666841 +C: "OO", 2598666841, 2598782085 +C: "OO", 2598782085, 2599753851 +C: "OO", 2599753851, 2601229167 +C: "OO", 2601229167, 2601922172 +C: "OO", 2601922172, 2602878498 +C: "OO", 2602878498, 2602980007 +C: "OO", 2602980007, 2603176517 +C: "OO", 2603176517, 2603786908 +C: "OO", 2603786908, 2603845854 +C: "OO", 2603845854, 2603872221 +C: "OO", 2603872221, 2604058045 +C: "OO", 2604058045, 2604316677 +C: "OO", 2604316677, 2605059953 +C: "OO", 2605059953, 2605631582 +C: "OO", 2605631582, 2605658050 +C: "OO", 2605658050, 2606119789 +C: "OO", 2606119789, 2606895630 +C: "OO", 2606895630, 2607382622 +C: "OO", 2607382622, 2608506594 +C: "OO", 2608506594, 2609568124 +C: "OO", 2609568124, 2610106873 +C: "OO", 2610106873, 2610370526 +C: "OO", 2610370526, 2610636007 +C: "OO", 2610636007, 2612403557 +C: "OO", 2612403557, 2612699283 +C: "OO", 2612699283, 2612811531 +C: "OO", 2612811531, 2613469382 +C: "OO", 2613469382, 2613756295 +C: "OO", 2613756295, 2614147100 +C: "OO", 2614147100, 2614348597 +C: "OO", 2614348597, 2615094889 +C: "OO", 2615094889, 2616080734 +C: "OO", 2616080734, 2617715591 +C: "OO", 2617715591, 2617801828 +C: "OO", 2617801828, 2618665797 +C: "OO", 2618665797, 2618953151 +C: "OO", 2618953151, 2619247331 +C: "OO", 2619247331, 2620376060 +C: "OO", 2620376060, 2620387298 +C: "OO", 2620387298, 2620661970 +C: "OO", 2620661970, 2621133716 +C: "OO", 2621133716, 2621178733 +C: "OO", 2621178733, 2621647911 +C: "OO", 2621647911, 2621682989 +C: "OO", 2621682989, 2622708142 +C: "OO", 2622708142, 2622724256 +C: "OO", 2622724256, 2624005508 +C: "OO", 2624005508, 2624553251 +C: "OO", 2624553251, 2625612807 +C: "OO", 2625612807, 2627793315 +C: "OO", 2627793315, 2628056082 +C: "OO", 2628056082, 2628338612 +C: "OO", 2628338612, 2629158883 +C: "OO", 2629158883, 2629611754 +C: "OO", 2629611754, 2630052550 +C: "OO", 2630052550, 2630128806 +C: "OO", 2630128806, 2630324265 +C: "OO", 2630324265, 2631037115 +C: "OO", 2631037115, 2631500981 +C: "OO", 2631500981, 2631620612 +C: "OO", 2631620612, 2631861735 +C: "OO", 2631861735, 2632538857 +C: "OO", 2632538857, 2633625817 +C: "OO", 2633625817, 2633662352 +C: "OO", 2633662352, 2633713106 +C: "OO", 2633713106, 2633826589 +C: "OO", 2633826589, 2633858873 +C: "OO", 2633858873, 2635723083 +C: "OO", 2635723083, 2635723892 +C: "OO", 2635723892, 2636398635 +C: "OO", 2636398635, 2636562162 +C: "OO", 2636562162, 2638394678 +C: "OO", 2638394678, 2640831741 +C: "OO", 2640831741, 2641838507 +C: "OO", 2641838507, 2642115571 +C: "OO", 2642115571, 2642501698 +C: "OO", 2642501698, 2642776945 +C: "OO", 2642776945, 2643056349 +C: "OO", 2643056349, 2643514482 +C: "OO", 2643514482, 2645667598 +C: "OO", 2645667598, 2646428737 +C: "OO", 2646428737, 2649258538 +C: "OO", 2649258538, 2650691791 +C: "OO", 2650691791, 2650909686 +C: "OO", 2650909686, 2651112651 +C: "OO", 2651112651, 2651226715 +C: "OO", 2651226715, 2651814311 +C: "OO", 2651814311, 2651981934 +C: "OO", 2651981934, 2652007479 +C: "OO", 2652007479, 2652488937 +C: "OO", 2652488937, 2652670505 +C: "OO", 2652670505, 2653360972 +C: "OO", 2653360972, 2653678851 +C: "OO", 2653678851, 2654540803 +C: "OO", 2654540803, 2654641611 +C: "OO", 2654641611, 2655015152 +C: "OO", 2655015152, 2655170565 +C: "OO", 2655170565, 2655482972 +C: "OO", 2655482972, 2655694393 +C: "OO", 2655694393, 2657079153 +C: "OO", 2657079153, 2657701085 +C: "OO", 2657701085, 2658624247 +C: "OO", 2658624247, 2659490719 +C: "OO", 2659490719, 2659981325 +C: "OO", 2659981325, 2662552339 +C: "OO", 2662552339, 2663210957 +C: "OO", 2663210957, 2663389292 +C: "OO", 2663389292, 2663507111 +C: "OO", 2663507111, 2663637837 +C: "OO", 2663637837, 2664107164 +C: "OO", 2664107164, 2665063448 +C: "OO", 2665063448, 2665341153 +C: "OO", 2665341153, 2665425929 +C: "OO", 2665425929, 2665660511 +C: "OO", 2665660511, 2665772435 +C: "OO", 2665772435, 2666851532 +C: "OO", 2666851532, 2668514666 +C: "OO", 2668514666, 2668678306 +C: "OO", 2668678306, 2669157866 +C: "OO", 2669157866, 2669742835 +C: "OO", 2669742835, 2671454902 +C: "OO", 2671454902, 2671582274 +C: "OO", 2671582274, 2672718183 +C: "OO", 2672718183, 2672800217 +C: "OO", 2672800217, 2672845531 +C: "OO", 2672845531, 2672923503 +C: "OO", 2672923503, 2673097411 +C: "OO", 2673097411, 2673599762 +C: "OO", 2673599762, 2673771158 +C: "OO", 2673771158, 2674587214 +C: "OO", 2674587214, 2675826213 +C: "OO", 2675826213, 2676393015 +C: "OO", 2676393015, 2678504249 +C: "OO", 2678504249, 2678864391 +C: "OO", 2678864391, 2678930313 +C: "OO", 2678930313, 2680096127 +C: "OO", 2680096127, 2680829414 +C: "OO", 2680829414, 2683482128 +C: "OO", 2683482128, 2683514738 +C: "OO", 2683514738, 2684304201 +C: "OO", 2684304201, 2685275876 +C: "OO", 2685275876, 2685878386 +C: "OO", 2685878386, 2686819843 +C: "OO", 2686819843, 2687121574 +C: "OO", 2687121574, 2688199829 +C: "OO", 2688199829, 2689887837 +C: "OO", 2689887837, 2689963913 +C: "OO", 2689963913, 2690353467 +C: "OO", 2690353467, 2691506031 +C: "OO", 2691506031, 2693317371 +C: "OO", 2693317371, 2694228676 +C: "OO", 2694228676, 2694240430 +C: "OO", 2694240430, 2695110991 +C: "OO", 2695110991, 2695394335 +C: "OO", 2695394335, 2695602499 +C: "OO", 2695602499, 2696218158 +C: "OO", 2696218158, 2696629634 +C: "OO", 2696629634, 2697307261 +C: "OO", 2697307261, 2697336121 +C: "OO", 2697336121, 2697404489 +C: "OO", 2697404489, 2697587949 +C: "OO", 2697587949, 2697803432 +C: "OO", 2697803432, 2698015542 +C: "OO", 2698015542, 2698310864 +C: "OO", 2698310864, 2699082691 +C: "OO", 2699082691, 2699497042 +C: "OO", 2699497042, 2700139314 +C: "OO", 2700139314, 2701762820 +C: "OO", 2701762820, 2702003433 +C: "OO", 2702003433, 2702110906 +C: "OO", 2702110906, 2702716693 +C: "OO", 2702716693, 2703261913 +C: "OO", 2703261913, 2703352484 +C: "OO", 2703352484, 2703894125 +C: "OO", 2703894125, 2704319298 +C: "OO", 2704319298, 2704351244 +C: "OO", 2704351244, 2704624955 +C: "OO", 2704624955, 2705415946 +C: "OO", 2705415946, 2705943363 +C: "OO", 2705943363, 2706131134 +C: "OO", 2706131134, 2706249694 +C: "OO", 2706249694, 2706336641 +C: "OO", 2706336641, 2707987208 +C: "OO", 2707987208, 2708140957 +C: "OO", 2708140957, 2708830599 +C: "OO", 2708830599, 2709171190 +C: "OO", 2709171190, 2709253103 +C: "OO", 2709253103, 2709512962 +C: "OO", 2709512962, 2710384173 +C: "OO", 2710384173, 2710517698 +C: "OO", 2710517698, 2711302149 +C: "OO", 2711302149, 2711903553 +C: "OO", 2711903553, 2712134722 +C: "OO", 2712134722, 2712148133 +C: "OO", 2712148133, 2712800042 +C: "OO", 2712800042, 2712835495 +C: "OO", 2712835495, 2713010468 +C: "OO", 2713010468, 2714361381 +C: "OO", 2714361381, 2714976999 +C: "OO", 2714976999, 2716378811 +C: "OO", 2716378811, 2716576949 +C: "OO", 2716576949, 2717068255 +C: "OO", 2717068255, 2717154525 +C: "OO", 2717154525, 2717361225 +C: "OO", 2717361225, 2719454591 +C: "OO", 2719454591, 2719631047 +C: "OO", 2719631047, 2719700793 +C: "OO", 2719700793, 2719859961 +C: "OO", 2719859961, 2720095957 +C: "OO", 2720095957, 2720304641 +C: "OO", 2720304641, 2720967551 +C: "OO", 2720967551, 2721402700 +C: "OO", 2721402700, 2723151409 +C: "OO", 2723151409, 2723872139 +C: "OO", 2723872139, 2724079886 +C: "OO", 2724079886, 2725294719 +C: "OO", 2725294719, 2725749584 +C: "OO", 2725749584, 2727338792 +C: "OO", 2727338792, 2727608659 +C: "OO", 2727608659, 2728624445 +C: "OO", 2728624445, 2729255932 +C: "OO", 2729255932, 2730052879 +C: "OO", 2730052879, 2730671458 +C: "OO", 2730671458, 2730733235 +C: "OO", 2730733235, 2731356812 +C: "OO", 2731356812, 2732095556 +C: "OO", 2732095556, 2733156778 +C: "OO", 2733156778, 2734018639 +C: "OO", 2734018639, 2734220274 +C: "OO", 2734220274, 2734490720 +C: "OO", 2734490720, 2736014845 +C: "OO", 2736014845, 2736141747 +C: "OO", 2736141747, 2736210322 +C: "OO", 2736210322, 2736556546 +C: "OO", 2736556546, 2736990378 +C: "OO", 2736990378, 2738808477 +C: "OO", 2738808477, 2738812182 +C: "OO", 2738812182, 2739120683 +C: "OO", 2739120683, 2739609223 +C: "OO", 2739609223, 2739796828 +C: "OO", 2739796828, 2740982070 +C: "OO", 2740982070, 2743398018 +C: "OO", 2743398018, 2744999437 +C: "OO", 2744999437, 2746025114 +C: "OO", 2746025114, 2746414918 +C: "OO", 2746414918, 2749386460 +C: "OO", 2749386460, 2749902871 +C: "OO", 2749902871, 2750413059 +C: "OO", 2750413059, 2751066353 +C: "OO", 2751066353, 2751110301 +C: "OO", 2751110301, 2752415275 +C: "OO", 2752415275, 2752905815 +C: "OO", 2752905815, 2752989595 +C: "OO", 2752989595, 2753647201 +C: "OO", 2753647201, 2754035062 +C: "OO", 2754035062, 2754499210 +C: "OO", 2754499210, 2754559513 +C: "OO", 2754559513, 2755605470 +C: "OO", 2755605470, 2755667889 +C: "OO", 2755667889, 2756269132 +C: "OO", 2756269132, 2757957980 +C: "OO", 2757957980, 2758185566 +C: "OO", 2758185566, 2758555352 +C: "OO", 2758555352, 2758670869 +C: "OO", 2758670869, 2759149083 +C: "OO", 2759149083, 2760871858 +C: "OO", 2760871858, 2760997639 +C: "OO", 2760997639, 2761367075 +C: "OO", 2761367075, 2761979356 +C: "OO", 2761979356, 2762868802 +C: "OO", 2762868802, 2763424588 +C: "OO", 2763424588, 2763818173 +C: "OO", 2763818173, 2764927074 +C: "OO", 2764927074, 2765000425 +C: "OO", 2765000425, 2765410876 +C: "OO", 2765410876, 2765545039 +C: "OO", 2765545039, 2766548305 +C: "OO", 2766548305, 2766906566 +C: "OO", 2766906566, 2767436849 +C: "OO", 2767436849, 2768307834 +C: "OO", 2768307834, 2769078894 +C: "OO", 2769078894, 2769438426 +C: "OO", 2769438426, 2769726594 +C: "OO", 2769726594, 2769784631 +C: "OO", 2769784631, 2769815427 +C: "OO", 2769815427, 2769947418 +C: "OO", 2769947418, 2770566253 +C: "OO", 2770566253, 2771051219 +C: "OO", 2771051219, 2771640994 +C: "OO", 2771640994, 2771723594 +C: "OO", 2771723594, 2773343313 +C: "OO", 2773343313, 2773521812 +C: "OO", 2773521812, 2774062871 +C: "OO", 2774062871, 2774357955 +C: "OO", 2774357955, 2774701202 +C: "OO", 2774701202, 2774949810 +C: "OO", 2774949810, 2775926797 +C: "OO", 2775926797, 2779992332 +C: "OO", 2779992332, 2780328719 +C: "OO", 2780328719, 2780858864 +C: "OO", 2780858864, 2781261045 +C: "OO", 2781261045, 2781268090 +C: "OO", 2781268090, 2781273009 +C: "OO", 2781273009, 2782601813 +C: "OO", 2782601813, 2783130886 +C: "OO", 2783130886, 2784729671 +C: "OO", 2784729671, 2785387083 +C: "OO", 2785387083, 2785642549 +C: "OO", 2785642549, 2786231405 +C: "OO", 2786231405, 2786595983 +C: "OO", 2786595983, 2786736255 +C: "OO", 2786736255, 2787209682 +C: "OO", 2787209682, 2787218210 +C: "OO", 2787218210, 2788519602 +C: "OO", 2788519602, 2789046978 +C: "OO", 2789046978, 2789249617 +C: "OO", 2789249617, 2791807228 +C: "OO", 2791807228, 2791955535 +C: "OO", 2791955535, 2792771023 +C: "OO", 2792771023, 2793342681 +C: "OO", 2793342681, 2793976278 +C: "OO", 2793976278, 2794414988 +C: "OO", 2794414988, 2795723963 +C: "OO", 2795723963, 2797000737 +C: "OO", 2797000737, 2797152844 +C: "OO", 2797152844, 2797290719 +C: "OO", 2797290719, 2797783019 +C: "OO", 2797783019, 2797845389 +C: "OO", 2797845389, 2798163074 +C: "OO", 2798163074, 2799563828 +C: "OO", 2799563828, 2799912710 +C: "OO", 2799912710, 2800056223 +C: "OO", 2800056223, 2800754840 +C: "OO", 2800754840, 2803041701 +C: "OO", 2803041701, 2803515095 +C: "OO", 2803515095, 2804675907 +C: "OO", 2804675907, 2804799626 +C: "OO", 2804799626, 2805319478 +C: "OO", 2805319478, 2808243159 +C: "OO", 2808243159, 2808406900 +C: "OO", 2808406900, 2810280877 +C: "OO", 2810280877, 2810649032 +C: "OO", 2810649032, 2810703443 +C: "OO", 2810703443, 2810922033 +C: "OO", 2810922033, 2811821332 +C: "OO", 2811821332, 2813854444 +C: "OO", 2813854444, 2814601731 +C: "OO", 2814601731, 2815403706 +C: "OO", 2815403706, 2815744654 +C: "OO", 2815744654, 2816027524 +C: "OO", 2816027524, 2816643892 +C: "OO", 2816643892, 2818076468 +C: "OO", 2818076468, 2818564726 +C: "OO", 2818564726, 2819529641 +C: "OO", 2819529641, 2819908352 +C: "OO", 2819908352, 2820275354 +C: "OO", 2820275354, 2821160473 +C: "OO", 2821160473, 2821290318 +C: "OO", 2821290318, 2822127261 +C: "OO", 2822127261, 2822346199 +C: "OO", 2822346199, 2823635006 +C: "OO", 2823635006, 2823809869 +C: "OO", 2823809869, 2825377394 +C: "OO", 2825377394, 2825422012 +C: "OO", 2825422012, 2825423899 +C: "OO", 2825423899, 2825725318 +C: "OO", 2825725318, 2825775799 +C: "OO", 2825775799, 2826364347 +C: "OO", 2826364347, 2827786801 +C: "OO", 2827786801, 2827878839 +C: "OO", 2827878839, 2828937883 +C: "OO", 2828937883, 2828985035 +C: "OO", 2828985035, 2829297902 +C: "OO", 2829297902, 2829581057 +C: "OO", 2829581057, 2831028766 +C: "OO", 2831028766, 2831049995 +C: "OO", 2831049995, 2831772330 +C: "OO", 2831772330, 2832296785 +C: "OO", 2832296785, 2832541161 +C: "OO", 2832541161, 2833439437 +C: "OO", 2833439437, 2834189264 +C: "OO", 2834189264, 2834768586 +C: "OO", 2834768586, 2834834429 +C: "OO", 2834834429, 2834973207 +C: "OO", 2834973207, 2835016350 +C: "OO", 2835016350, 2835129766 +C: "OO", 2835129766, 2835233350 +C: "OO", 2835233350, 2835289832 +C: "OO", 2835289832, 2835391329 +C: "OO", 2835391329, 2836128774 +C: "OO", 2836128774, 2837364567 +C: "OO", 2837364567, 2838755863 +C: "OO", 2838755863, 2840399812 +C: "OO", 2840399812, 2840900933 +C: "OO", 2840900933, 2841373122 +C: "OO", 2841373122, 2843071796 +C: "OO", 2843071796, 2844073102 +C: "OO", 2844073102, 2844087923 +C: "OO", 2844087923, 2844117447 +C: "OO", 2844117447, 2844126014 +C: "OO", 2844126014, 2844254300 +C: "OO", 2844254300, 2844258743 +C: "OO", 2844258743, 2844939801 +C: "OO", 2844939801, 2845239462 +C: "OO", 2845239462, 2845763756 +C: "OO", 2845763756, 2846324199 +C: "OO", 2846324199, 2846367425 +C: "OO", 2846367425, 2846933863 +C: "OO", 2846933863, 2847730218 +C: "OO", 2847730218, 2847907002 +C: "OO", 2847907002, 2848349498 +C: "OO", 2848349498, 2849096734 +C: "OO", 2849096734, 2849826366 +C: "OO", 2849826366, 2849871508 +C: "OO", 2849871508, 2850265757 +C: "OO", 2850265757, 2851164963 +C: "OO", 2851164963, 2852271250 +C: "OO", 2852271250, 2852350557 +C: "OO", 2852350557, 2852377755 +C: "OO", 2852377755, 2853435171 +C: "OO", 2853435171, 2854523742 +C: "OO", 2854523742, 2854712309 +C: "OO", 2854712309, 2854812581 +C: "OO", 2854812581, 2854841807 +C: "OO", 2854841807, 2856417498 +C: "OO", 2856417498, 2857145858 +C: "OO", 2857145858, 2857235859 +C: "OO", 2857235859, 2857471405 +C: "OO", 2857471405, 2857746311 +C: "OO", 2857746311, 2858153537 +C: "OO", 2858153537, 2858790124 +C: "OO", 2858790124, 2858812195 +C: "OO", 2858812195, 2859091614 +C: "OO", 2859091614, 2859514361 +C: "OO", 2859514361, 2861171329 +C: "OO", 2861171329, 2862008098 +C: "OO", 2862008098, 2862784502 +C: "OO", 2862784502, 2863936199 +C: "OO", 2863936199, 2864784858 +C: "OO", 2864784858, 2865524847 +C: "OO", 2865524847, 2865920206 +C: "OO", 2865920206, 2866138521 +C: "OO", 2866138521, 2866579783 +C: "OO", 2866579783, 2866925150 +C: "OO", 2866925150, 2867182664 +C: "OO", 2867182664, 2867855855 +C: "OO", 2867855855, 2867988353 +C: "OO", 2867988353, 2868179905 +C: "OO", 2868179905, 2868455342 +C: "OO", 2868455342, 2869539319 +C: "OO", 2869539319, 2869717628 +C: "OO", 2869717628, 2869871531 +C: "OO", 2869871531, 2870501530 +C: "OO", 2870501530, 2871065583 +C: "OO", 2871065583, 2872222773 +C: "OO", 2872222773, 2873061604 +C: "OO", 2873061604, 2873283645 +C: "OO", 2873283645, 2874016780 +C: "OO", 2874016780, 2874176979 +C: "OO", 2874176979, 2874340976 +C: "OO", 2874340976, 2874630442 +C: "OO", 2874630442, 2874831073 +C: "OO", 2874831073, 2876194046 +C: "OO", 2876194046, 2876957791 +C: "OO", 2876957791, 2877285802 +C: "OO", 2877285802, 2877571444 +C: "OO", 2877571444, 2879439303 +C: "OO", 2879439303, 2879527417 +C: "OO", 2879527417, 2880026695 +C: "OO", 2880026695, 2880530792 +C: "OO", 2880530792, 2881038115 +C: "OO", 2881038115, 2881783014 +C: "OO", 2881783014, 2881991625 +C: "OO", 2881991625, 2882528754 +C: "OO", 2882528754, 2883579323 +C: "OO", 2883579323, 2884366773 +C: "OO", 2884366773, 2884546054 +C: "OO", 2884546054, 2884722334 +C: "OO", 2884722334, 2885578513 +C: "OO", 2885578513, 2885583401 +C: "OO", 2885583401, 2885734196 +C: "OO", 2885734196, 2886274095 +C: "OO", 2886274095, 2886307137 +C: "OO", 2886307137, 2887125879 +C: "OO", 2887125879, 2887131796 +C: "OO", 2887131796, 2888152047 +C: "OO", 2888152047, 2889307105 +C: "OO", 2889307105, 2889617620 +C: "OO", 2889617620, 2890048101 +C: "OO", 2890048101, 2890134753 +C: "OO", 2890134753, 2890625763 +C: "OO", 2890625763, 2890972880 +C: "OO", 2890972880, 2891798238 +C: "OO", 2891798238, 2893393163 +C: "OO", 2893393163, 2894320227 +C: "OO", 2894320227, 2895095060 +C: "OO", 2895095060, 2895101058 +C: "OO", 2895101058, 2895597439 +C: "OO", 2895597439, 2895600443 +C: "OO", 2895600443, 2896081474 +C: "OO", 2896081474, 2896464210 +C: "OO", 2896464210, 2896823066 +C: "OO", 2896823066, 2897020078 +C: "OO", 2897020078, 2897525567 +C: "OO", 2897525567, 2897862026 +C: "OO", 2897862026, 2898687497 +C: "OO", 2898687497, 2898833655 +C: "OO", 2898833655, 2899300306 +C: "OO", 2899300306, 2899379785 +C: "OO", 2899379785, 2899484701 +C: "OO", 2899484701, 2900899646 +C: "OO", 2900899646, 2900931093 +C: "OO", 2900931093, 2901060039 +C: "OO", 2901060039, 2901269362 +C: "OO", 2901269362, 2902972099 +C: "OO", 2902972099, 2903730282 +C: "OO", 2903730282, 2904680938 +C: "OO", 2904680938, 2906052299 +C: "OO", 2906052299, 2907249791 +C: "OO", 2907249791, 2907400511 +C: "OO", 2907400511, 2908150004 +C: "OO", 2908150004, 2908352883 +C: "OO", 2908352883, 2908406931 +C: "OO", 2908406931, 2908511199 +C: "OO", 2908511199, 2909409158 +C: "OO", 2909409158, 2910011919 +C: "OO", 2910011919, 2910854960 +C: "OO", 2910854960, 2911074209 +C: "OO", 2911074209, 2911125311 +C: "OO", 2911125311, 2911604635 +C: "OO", 2911604635, 2912398183 +C: "OO", 2912398183, 2912399790 +C: "OO", 2912399790, 2912665630 +C: "OO", 2912665630, 2912786915 +C: "OO", 2912786915, 2913230559 +C: "OO", 2913230559, 2913247262 +C: "OO", 2913247262, 2913402305 +C: "OO", 2913402305, 2913512962 +C: "OO", 2913512962, 2913647404 +C: "OO", 2913647404, 2914195461 +C: "OO", 2914195461, 2914986230 +C: "OO", 2914986230, 2915070749 +C: "OO", 2915070749, 2915718940 +C: "OO", 2915718940, 2916315829 +C: "OO", 2916315829, 2916662319 +C: "OO", 2916662319, 2917503260 +C: "OO", 2917503260, 2917620430 +C: "OO", 2917620430, 2918382450 +C: "OO", 2918382450, 2918961699 +C: "OO", 2918961699, 2919839074 +C: "OO", 2919839074, 2919934280 +C: "OO", 2919934280, 2920110210 +C: "OO", 2920110210, 2920252671 +C: "OO", 2920252671, 2920467593 +C: "OO", 2920467593, 2920659095 +C: "OO", 2920659095, 2920835404 +C: "OO", 2920835404, 2921590893 +C: "OO", 2921590893, 2922349241 +C: "OO", 2922349241, 2923199730 +C: "OO", 2923199730, 2923856756 +C: "OO", 2923856756, 2924106557 +C: "OO", 2924106557, 2925409778 +C: "OO", 2925409778, 2925522541 +C: "OO", 2925522541, 2925778108 +C: "OO", 2925778108, 2926135417 +C: "OO", 2926135417, 2926855604 +C: "OO", 2926855604, 2927172601 +C: "OO", 2927172601, 2927242330 +C: "OO", 2927242330, 2927786377 +C: "OO", 2927786377, 2928063161 +C: "OO", 2928063161, 2928598327 +C: "OO", 2928598327, 2928657920 +C: "OO", 2928657920, 2928809015 +C: "OO", 2928809015, 2929552406 +C: "OO", 2929552406, 2929920377 +C: "OO", 2929920377, 2930028212 +C: "OO", 2930028212, 2930566925 +C: "OO", 2930566925, 2930643473 +C: "OO", 2930643473, 2931424373 +C: "OO", 2931424373, 2932055821 +C: "OO", 2932055821, 2932369519 +C: "OO", 2932369519, 2932537808 +C: "OO", 2932537808, 2933113521 +C: "OO", 2933113521, 2935353931 +C: "OO", 2935353931, 2935774839 +C: "OO", 2935774839, 2936175077 +C: "OO", 2936175077, 2938104854 +C: "OO", 2938104854, 2939787546 +C: "OO", 2939787546, 2940274772 +C: "OO", 2940274772, 2940283316 +C: "OO", 2940283316, 2941271201 +C: "OO", 2941271201, 2941596186 +C: "OO", 2941596186, 2942004058 +C: "OO", 2942004058, 2942258410 +C: "OO", 2942258410, 2942509649 +C: "OO", 2942509649, 2942980914 +C: "OO", 2942980914, 2943026055 +C: "OO", 2943026055, 2943612350 +C: "OO", 2943612350, 2944270329 +C: "OO", 2944270329, 2944684658 +C: "OO", 2944684658, 2945694291 +C: "OO", 2945694291, 2946074261 +C: "OO", 2946074261, 2946415828 +C: "OO", 2946415828, 2946996629 +C: "OO", 2946996629, 2947262969 +C: "OO", 2947262969, 2947822067 +C: "OO", 2947822067, 2948092599 +C: "OO", 2948092599, 2948994906 +C: "OO", 2948994906, 2949351091 +C: "OO", 2949351091, 2951219737 +C: "OO", 2951219737, 2951389544 +C: "OO", 2951389544, 2951509636 +C: "OO", 2951509636, 2952207065 +C: "OO", 2952207065, 2952223613 +C: "OO", 2952223613, 2952266630 +C: "OO", 2952266630, 2953411250 +C: "OO", 2953411250, 2954177027 +C: "OO", 2954177027, 2954308923 +C: "OO", 2954308923, 2954817513 +C: "OO", 2954817513, 2955218453 +C: "OO", 2955218453, 2955785565 +C: "OO", 2955785565, 2957450021 +C: "OO", 2957450021, 2957665670 +C: "OO", 2957665670, 2959495798 +C: "OO", 2959495798, 2959666657 +C: "OO", 2959666657, 2959952603 +C: "OO", 2959952603, 2960030114 +C: "OO", 2960030114, 2960969563 +C: "OO", 2960969563, 2962655055 +C: "OO", 2962655055, 2963613599 +C: "OO", 2963613599, 2965558417 +C: "OO", 2965558417, 2965634763 +C: "OO", 2965634763, 2966050951 +C: "OO", 2966050951, 2966052018 +C: "OO", 2966052018, 2967286928 +C: "OO", 2967286928, 2967359970 +C: "OO", 2967359970, 2967536353 +C: "OO", 2967536353, 2968405901 +C: "OO", 2968405901, 2970129959 +C: "OO", 2970129959, 2970158492 +C: "OO", 2970158492, 2970346544 +C: "OO", 2970346544, 2971816734 +C: "OO", 2971816734, 2972190319 +C: "OO", 2972190319, 2972778853 +C: "OO", 2972778853, 2973987988 +C: "OO", 2973987988, 2974253922 +C: "OO", 2974253922, 2974332027 +C: "OO", 2974332027, 2975267335 +C: "OO", 2975267335, 2976313604 +C: "OO", 2976313604, 2976641996 +C: "OO", 2976641996, 2976687501 +C: "OO", 2976687501, 2976991612 +C: "OO", 2976991612, 2977012805 +C: "OO", 2977012805, 2977454185 +C: "OO", 2977454185, 2980613862 +C: "OO", 2980613862, 2980814955 +C: "OO", 2980814955, 2981473712 +C: "OO", 2981473712, 2983000484 +C: "OO", 2983000484, 2984559074 +C: "OO", 2984559074, 2984588422 +C: "OO", 2984588422, 2984636141 +C: "OO", 2984636141, 2985023853 +C: "OO", 2985023853, 2985614836 +C: "OO", 2985614836, 2985938918 +C: "OO", 2985938918, 2986858169 +C: "OO", 2986858169, 2987195463 +C: "OO", 2987195463, 2987240658 +C: "OO", 2987240658, 2987561674 +C: "OO", 2987561674, 2987567109 +C: "OO", 2987567109, 2987673956 +C: "OO", 2987673956, 2991103343 +C: "OO", 2991103343, 2991889658 +C: "OO", 2991889658, 2992585599 +C: "OO", 2992585599, 2993190890 +C: "OO", 2993190890, 2994728214 +C: "OO", 2994728214, 2995096099 +C: "OO", 2995096099, 2995393690 +C: "OO", 2995393690, 2995571108 +C: "OO", 2995571108, 2996529866 +C: "OO", 2996529866, 2996837653 +C: "OO", 2996837653, 2997421196 +C: "OO", 2997421196, 2998919910 +C: "OO", 2998919910, 2999117746 +C: "OO", 2999117746, 2999833493 +C: "OO", 2999833493, 2999962352 +C: "OO", 2999962352, 3001486540 +C: "OO", 3001486540, 3003037561 +C: "OO", 3003037561, 3003330582 +C: "OO", 3003330582, 3003878912 +C: "OO", 3003878912, 3004159099 +C: "OO", 3004159099, 3004478956 +C: "OO", 3004478956, 3004744616 +C: "OO", 3004744616, 3005289527 +C: "OO", 3005289527, 3005466626 +C: "OO", 3005466626, 3005623928 +C: "OO", 3005623928, 3006051878 +C: "OO", 3006051878, 3006516479 +C: "OO", 3006516479, 3007409336 +C: "OO", 3007409336, 3008416221 +C: "OO", 3008416221, 3009652199 +C: "OO", 3009652199, 3009847302 +C: "OO", 3009847302, 3010233553 +C: "OO", 3010233553, 3010307725 +C: "OO", 3010307725, 3011010418 +C: "OO", 3011010418, 3011254535 +C: "OO", 3011254535, 3011586095 +C: "OO", 3011586095, 3011643991 +C: "OO", 3011643991, 3012582431 +C: "OO", 3012582431, 3012615389 +C: "OO", 3012615389, 3012659209 +C: "OO", 3012659209, 3012684565 +C: "OO", 3012684565, 3013440927 +C: "OO", 3013440927, 3014215330 +C: "OO", 3014215330, 3015314019 +C: "OO", 3015314019, 3015684698 +C: "OO", 3015684698, 3015747654 +C: "OO", 3015747654, 3016619902 +C: "OO", 3016619902, 3018727302 +C: "OO", 3018727302, 3019067721 +C: "OO", 3019067721, 3020132841 +C: "OO", 3020132841, 3020217908 +C: "OO", 3020217908, 3021490433 +C: "OO", 3021490433, 3022061252 +C: "OO", 3022061252, 3023475981 +C: "OO", 3023475981, 3023573779 +C: "OO", 3023573779, 3024090377 +C: "OO", 3024090377, 3024984767 +C: "OO", 3024984767, 3026445574 +C: "OO", 3026445574, 3026952075 +C: "OO", 3026952075, 3027044279 +C: "OO", 3027044279, 3027336464 +C: "OO", 3027336464, 3027760403 +C: "OO", 3027760403, 3028062813 +C: "OO", 3028062813, 3028746628 +C: "OO", 3028746628, 3029349682 +C: "OO", 3029349682, 3029788717 +C: "OO", 3029788717, 3030203019 +C: "OO", 3030203019, 3030412549 +C: "OO", 3030412549, 3030429939 +C: "OO", 3030429939, 3030787507 +C: "OO", 3030787507, 3031385235 +C: "OO", 3031385235, 3032592716 +C: "OO", 3032592716, 3032876957 +C: "OO", 3032876957, 3033856807 +C: "OO", 3033856807, 3034901602 +C: "OO", 3034901602, 3035747658 +C: "OO", 3035747658, 3035886718 +C: "OO", 3035886718, 3036821764 +C: "OO", 3036821764, 3037381787 +C: "OO", 3037381787, 3037750505 +C: "OO", 3037750505, 3040124121 +C: "OO", 3040124121, 3040889588 +C: "OO", 3040889588, 3043761750 +C: "OO", 3043761750, 3044908821 +C: "OO", 3044908821, 3045280678 +C: "OO", 3045280678, 3045896122 +C: "OO", 3045896122, 3046520636 +C: "OO", 3046520636, 3046748830 +C: "OO", 3046748830, 3046929656 +C: "OO", 3046929656, 3047566779 +C: "OO", 3047566779, 3048869553 +C: "OO", 3048869553, 3049019229 +C: "OO", 3049019229, 3049409350 +C: "OO", 3049409350, 3050685671 +C: "OO", 3050685671, 3051123727 +C: "OO", 3051123727, 3051325681 +C: "OO", 3051325681, 3052270175 +C: "OO", 3052270175, 3054192630 +C: "OO", 3054192630, 3054488471 +C: "OO", 3054488471, 3054626703 +C: "OO", 3054626703, 3055092394 +C: "OO", 3055092394, 3055991729 +C: "OO", 3055991729, 3058869835 +C: "OO", 3058869835, 3059023757 +C: "OO", 3059023757, 3059466127 +C: "OO", 3059466127, 3059794665 +C: "OO", 3059794665, 3060100058 +C: "OO", 3060100058, 3060266870 +C: "OO", 3060266870, 3060566702 +C: "OO", 3060566702, 3061208648 +C: "OO", 3061208648, 3061209797 +C: "OO", 3061209797, 3061277289 +C: "OO", 3061277289, 3061484242 +C: "OO", 3061484242, 3062361563 +C: "OO", 3062361563, 3063100279 +C: "OO", 3063100279, 3064216009 +C: "OO", 3064216009, 3065061366 +C: "OO", 3065061366, 3065193914 +C: "OO", 3065193914, 3065738367 +C: "OO", 3065738367, 3067395427 +C: "OO", 3067395427, 3068274565 +C: "OO", 3068274565, 3069032055 +C: "OO", 3069032055, 3072480035 +C: "OO", 3072480035, 3073057388 +C: "OO", 3073057388, 3073651952 +C: "OO", 3073651952, 3074968099 +C: "OO", 3074968099, 3075089274 +C: "OO", 3075089274, 3076308320 +C: "OO", 3076308320, 3077175615 +C: "OO", 3077175615, 3078288790 +C: "OO", 3078288790, 3078485421 +C: "OO", 3078485421, 3079437147 +C: "OO", 3079437147, 3079543390 +C: "OO", 3079543390, 3079626467 +C: "OO", 3079626467, 3079660335 +C: "OO", 3079660335, 3080272221 +C: "OO", 3080272221, 3080382022 +C: "OO", 3080382022, 3080485828 +C: "OO", 3080485828, 3081139751 +C: "OO", 3081139751, 3081534221 +C: "OO", 3081534221, 3082213136 +C: "OO", 3082213136, 3082680890 +C: "OO", 3082680890, 3082700571 +C: "OO", 3082700571, 3083022442 +C: "OO", 3083022442, 3083594650 +C: "OO", 3083594650, 3083834311 +C: "OO", 3083834311, 3084520568 +C: "OO", 3084520568, 3084668705 +C: "OO", 3084668705, 3084883059 +C: "OO", 3084883059, 3085210988 +C: "OO", 3085210988, 3085689937 +C: "OO", 3085689937, 3085877490 +C: "OO", 3085877490, 3087083140 +C: "OO", 3087083140, 3087734647 +C: "OO", 3087734647, 3088046327 +C: "OO", 3088046327, 3088075047 +C: "OO", 3088075047, 3088282702 +C: "OO", 3088282702, 3089194225 +C: "OO", 3089194225, 3089365684 +C: "OO", 3089365684, 3090799411 +C: "OO", 3090799411, 3093165866 +C: "OO", 3093165866, 3093697427 +C: "OO", 3093697427, 3093939642 +C: "OO", 3093939642, 3094381942 +C: "OO", 3094381942, 3095378014 +C: "OO", 3095378014, 3095480759 +C: "OO", 3095480759, 3096607731 +C: "OO", 3096607731, 3097102780 +C: "OO", 3097102780, 3097145037 +C: "OO", 3097145037, 3097170268 +C: "OO", 3097170268, 3097194218 +C: "OO", 3097194218, 3097247757 +C: "OO", 3097247757, 3097831705 +C: "OO", 3097831705, 3099422187 +C: "OO", 3099422187, 3099860240 +C: "OO", 3099860240, 3100982666 +C: "OO", 3100982666, 3101249877 +C: "OO", 3101249877, 3102125526 +C: "OO", 3102125526, 3104332539 +C: "OO", 3104332539, 3104584677 +C: "OO", 3104584677, 3105720249 +C: "OO", 3105720249, 3105921830 +C: "OO", 3105921830, 3106012820 +C: "OO", 3106012820, 3107277297 +C: "OO", 3107277297, 3107910861 +C: "OO", 3107910861, 3108336669 +C: "OO", 3108336669, 3109326143 +C: "OO", 3109326143, 3112164083 +C: "OO", 3112164083, 3113215173 +C: "OO", 3113215173, 3113242942 +C: "OO", 3113242942, 3114147679 +C: "OO", 3114147679, 3114215774 +C: "OO", 3114215774, 3115737813 +C: "OO", 3115737813, 3116347642 +C: "OO", 3116347642, 3116612463 +C: "OO", 3116612463, 3116871632 +C: "OO", 3116871632, 3117458931 +C: "OO", 3117458931, 3117512223 +C: "OO", 3117512223, 3119281990 +C: "OO", 3119281990, 3119886719 +C: "OO", 3119886719, 3120232491 +C: "OO", 3120232491, 3121224363 +C: "OO", 3121224363, 3121246674 +C: "OO", 3121246674, 3122336191 +C: "OO", 3122336191, 3122832604 +C: "OO", 3122832604, 3122867365 +C: "OO", 3122867365, 3122964474 +C: "OO", 3122964474, 3123577002 +C: "OO", 3123577002, 3123635735 +C: "OO", 3123635735, 3123925906 +C: "OO", 3123925906, 3125355951 +C: "OO", 3125355951, 3125410942 +C: "OO", 3125410942, 3125411946 +C: "OO", 3125411946, 3125751510 +C: "OO", 3125751510, 3126374242 +C: "OO", 3126374242, 3127393238 +C: "OO", 3127393238, 3127948053 +C: "OO", 3127948053, 3128465885 +C: "OO", 3128465885, 3130164841 +C: "OO", 3130164841, 3130414324 +C: "OO", 3130414324, 3130416277 +C: "OO", 3130416277, 3130574681 +C: "OO", 3130574681, 3131620676 +C: "OO", 3131620676, 3132242799 +C: "OO", 3132242799, 3132455249 +C: "OO", 3132455249, 3132557818 +C: "OO", 3132557818, 3132897761 +C: "OO", 3132897761, 3132951710 +C: "OO", 3132951710, 3135085575 +C: "OO", 3135085575, 3135597978 +C: "OO", 3135597978, 3135773589 +C: "OO", 3135773589, 3135976335 +C: "OO", 3135976335, 3136104181 +C: "OO", 3136104181, 3136220731 +C: "OO", 3136220731, 3136825207 +C: "OO", 3136825207, 3137099054 +C: "OO", 3137099054, 3137168037 +C: "OO", 3137168037, 3138079326 +C: "OO", 3138079326, 3139472893 +C: "OO", 3139472893, 3139554078 +C: "OO", 3139554078, 3139674356 +C: "OO", 3139674356, 3140211314 +C: "OO", 3140211314, 3140316311 +C: "OO", 3140316311, 3140512484 +C: "OO", 3140512484, 3141015883 +C: "OO", 3141015883, 3141688023 +C: "OO", 3141688023, 3141830551 +C: "OO", 3141830551, 3142477502 +C: "OO", 3142477502, 3143553139 +C: "OO", 3143553139, 3143862556 +C: "OO", 3143862556, 3144108915 +C: "OO", 3144108915, 3144278050 +C: "OO", 3144278050, 3144365721 +C: "OO", 3144365721, 3144519604 +C: "OO", 3144519604, 3144578627 +C: "OO", 3144578627, 3144732929 +C: "OO", 3144732929, 3144956665 +C: "OO", 3144956665, 3145655785 +C: "OO", 3145655785, 3146500237 +C: "OO", 3146500237, 3146577805 +C: "OO", 3146577805, 3147133022 +C: "OO", 3147133022, 3147592502 +C: "OO", 3147592502, 3147989325 +C: "OO", 3147989325, 3148365318 +C: "OO", 3148365318, 3149046581 +C: "OO", 3149046581, 3150320957 +C: "OO", 3150320957, 3151910814 +C: "OO", 3151910814, 3152472157 +C: "OO", 3152472157, 3152541596 +C: "OO", 3152541596, 3154015331 +C: "OO", 3154015331, 3155321467 +C: "OO", 3155321467, 3155552678 +C: "OO", 3155552678, 3155714428 +C: "OO", 3155714428, 3157878196 +C: "OO", 3157878196, 3158475818 +C: "OO", 3158475818, 3158513234 +C: "OO", 3158513234, 3160219612 +C: "OO", 3160219612, 3160325054 +C: "OO", 3160325054, 3160744106 +C: "OO", 3160744106, 3160761428 +C: "OO", 3160761428, 3161849458 +C: "OO", 3161849458, 3164090027 +C: "OO", 3164090027, 3165230043 +C: "OO", 3165230043, 3166337596 +C: "OO", 3166337596, 3166972684 +C: "OO", 3166972684, 3168720781 +C: "OO", 3168720781, 3168981437 +C: "OO", 3168981437, 3169187271 +C: "OO", 3169187271, 3169697461 +C: "OO", 3169697461, 3169928222 +C: "OO", 3169928222, 3171534035 +C: "OO", 3171534035, 3172797278 +C: "OO", 3172797278, 3173145858 +C: "OO", 3173145858, 3173187206 +C: "OO", 3173187206, 3174776855 +C: "OO", 3174776855, 3175504431 +C: "OO", 3175504431, 3176733031 +C: "OO", 3176733031, 3176798782 +C: "OO", 3176798782, 3177195986 +C: "OO", 3177195986, 3178003265 +C: "OO", 3178003265, 3178509707 +C: "OO", 3178509707, 3178648749 +C: "OO", 3178648749, 3178669883 +C: "OO", 3178669883, 3178690841 +C: "OO", 3178690841, 3178725272 +C: "OO", 3178725272, 3180232443 +C: "OO", 3180232443, 3180938216 +C: "OO", 3180938216, 3181687417 +C: "OO", 3181687417, 3181994408 +C: "OO", 3181994408, 3182252082 +C: "OO", 3182252082, 3183925141 +C: "OO", 3183925141, 3184114220 +C: "OO", 3184114220, 3184226062 +C: "OO", 3184226062, 3184719491 +C: "OO", 3184719491, 3186581852 +C: "OO", 3186581852, 3188979977 +C: "OO", 3188979977, 3189509979 +C: "OO", 3189509979, 3189918741 +C: "OO", 3189918741, 3190183902 +C: "OO", 3190183902, 3190532337 +C: "OO", 3190532337, 3190714403 +C: "OO", 3190714403, 3190716381 +C: "OO", 3190716381, 3191421091 +C: "OO", 3191421091, 3192184084 +C: "OO", 3192184084, 3194208956 +C: "OO", 3194208956, 3195719394 +C: "OO", 3195719394, 3196076383 +C: "OO", 3196076383, 3196093081 +C: "OO", 3196093081, 3196564690 +C: "OO", 3196564690, 3196987574 +C: "OO", 3196987574, 3197079514 +C: "OO", 3197079514, 3197231978 +C: "OO", 3197231978, 3197269133 +C: "OO", 3197269133, 3197708899 +C: "OO", 3197708899, 3198828255 +C: "OO", 3198828255, 3199207118 +C: "OO", 3199207118, 3199429810 +C: "OO", 3199429810, 3199599713 +C: "OO", 3199599713, 3199722998 +C: "OO", 3199722998, 3199932218 +C: "OO", 3199932218, 3200910398 +C: "OO", 3200910398, 3201961606 +C: "OO", 3201961606, 3202416091 +C: "OO", 3202416091, 3203661766 +C: "OO", 3203661766, 3204359843 +C: "OO", 3204359843, 3204888422 +C: "OO", 3204888422, 3206035541 +C: "OO", 3206035541, 3206982634 +C: "OO", 3206982634, 3207696599 +C: "OO", 3207696599, 3208074341 +C: "OO", 3208074341, 3208259159 +C: "OO", 3208259159, 3208743646 +C: "OO", 3208743646, 3209204575 +C: "OO", 3209204575, 3210463094 +C: "OO", 3210463094, 3210463751 +C: "OO", 3210463751, 3210794394 +C: "OO", 3210794394, 3210981353 +C: "OO", 3210981353, 3211795643 +C: "OO", 3211795643, 3213359398 +C: "OO", 3213359398, 3213630365 +C: "OO", 3213630365, 3215329038 +C: "OO", 3215329038, 3215677797 +C: "OO", 3215677797, 3216096700 +C: "OO", 3216096700, 3217743057 +C: "OO", 3217743057, 3218180722 +C: "OO", 3218180722, 3218231010 +C: "OO", 3218231010, 3218391659 +C: "OO", 3218391659, 3218410838 +C: "OO", 3218410838, 3218806225 +C: "OO", 3218806225, 3220092284 +C: "OO", 3220092284, 3220153158 +C: "OO", 3220153158, 3221462405 +C: "OO", 3221462405, 3224130645 +C: "OO", 3224130645, 3224355908 +C: "OO", 3224355908, 3224553190 +C: "OO", 3224553190, 3224713561 +C: "OO", 3224713561, 3224932315 +C: "OO", 3224932315, 3225113979 +C: "OO", 3225113979, 3226131418 +C: "OO", 3226131418, 3226743518 +C: "OO", 3226743518, 3227135962 +C: "OO", 3227135962, 3227518911 +C: "OO", 3227518911, 3227792996 +C: "OO", 3227792996, 3230123559 +C: "OO", 3230123559, 3230151428 +C: "OO", 3230151428, 3230175550 +C: "OO", 3230175550, 3230583169 +C: "OO", 3230583169, 3231295450 +C: "OO", 3231295450, 3231467887 +C: "OO", 3231467887, 3232399442 +C: "OO", 3232399442, 3233135358 +C: "OO", 3233135358, 3233908472 +C: "OO", 3233908472, 3235876417 +C: "OO", 3235876417, 3238059181 +C: "OO", 3238059181, 3238293134 +C: "OO", 3238293134, 3238837269 +C: "OO", 3238837269, 3239002350 +C: "OO", 3239002350, 3239059383 +C: "OO", 3239059383, 3240470166 +C: "OO", 3240470166, 3240638313 +C: "OO", 3240638313, 3240895544 +C: "OO", 3240895544, 3240906726 +C: "OO", 3240906726, 3241363097 +C: "OO", 3241363097, 3241631287 +C: "OO", 3241631287, 3241920798 +C: "OO", 3241920798, 3242328318 +C: "OO", 3242328318, 3242540037 +C: "OO", 3242540037, 3242560851 +C: "OO", 3242560851, 3243851251 +C: "OO", 3243851251, 3243898711 +C: "OO", 3243898711, 3244392858 +C: "OO", 3244392858, 3244510003 +C: "OO", 3244510003, 3244962011 +C: "OO", 3244962011, 3245932437 +C: "OO", 3245932437, 3246660439 +C: "OO", 3246660439, 3246685706 +C: "OO", 3246685706, 3247319950 +C: "OO", 3247319950, 3248311232 +C: "OO", 3248311232, 3249562751 +C: "OO", 3249562751, 3250755766 +C: "OO", 3250755766, 3251381254 +C: "OO", 3251381254, 3252676110 +C: "OO", 3252676110, 3252780695 +C: "OO", 3252780695, 3253996478 +C: "OO", 3253996478, 3254044361 +C: "OO", 3254044361, 3254141391 +C: "OO", 3254141391, 3254303108 +C: "OO", 3254303108, 3254674508 +C: "OO", 3254674508, 3256709151 +C: "OO", 3256709151, 3257458258 +C: "OO", 3257458258, 3257795758 +C: "OO", 3257795758, 3257856566 +C: "OO", 3257856566, 3258209186 +C: "OO", 3258209186, 3258997115 +C: "OO", 3258997115, 3259727282 +C: "OO", 3259727282, 3260041734 +C: "OO", 3260041734, 3261414446 +C: "OO", 3261414446, 3261490351 +C: "OO", 3261490351, 3261655397 +C: "OO", 3261655397, 3261737884 +C: "OO", 3261737884, 3262274809 +C: "OO", 3262274809, 3263080039 +C: "OO", 3263080039, 3264216992 +C: "OO", 3264216992, 3264637494 +C: "OO", 3264637494, 3265926019 +C: "OO", 3265926019, 3265948577 +C: "OO", 3265948577, 3266107509 +C: "OO", 3266107509, 3266313166 +C: "OO", 3266313166, 3267524257 +C: "OO", 3267524257, 3267778287 +C: "OO", 3267778287, 3267887096 +C: "OO", 3267887096, 3267964730 +C: "OO", 3267964730, 3268576217 +C: "OO", 3268576217, 3269060577 +C: "OO", 3269060577, 3269595464 +C: "OO", 3269595464, 3269755108 +C: "OO", 3269755108, 3271446167 +C: "OO", 3271446167, 3272001662 +C: "OO", 3272001662, 3272243415 +C: "OO", 3272243415, 3272523082 +C: "OO", 3272523082, 3273076177 +C: "OO", 3273076177, 3273248695 +C: "OO", 3273248695, 3273921272 +C: "OO", 3273921272, 3274647057 +C: "OO", 3274647057, 3275121377 +C: "OO", 3275121377, 3275565123 +C: "OO", 3275565123, 3276451521 +C: "OO", 3276451521, 3277507701 +C: "OO", 3277507701, 3278021038 +C: "OO", 3278021038, 3278951597 +C: "OO", 3278951597, 3278971472 +C: "OO", 3278971472, 3279518307 +C: "OO", 3279518307, 3280151003 +C: "OO", 3280151003, 3280196397 +C: "OO", 3280196397, 3281035496 +C: "OO", 3281035496, 3281141105 +C: "OO", 3281141105, 3281922102 +C: "OO", 3281922102, 3283040717 +C: "OO", 3283040717, 3283222244 +C: "OO", 3283222244, 3283309917 +C: "OO", 3283309917, 3283377714 +C: "OO", 3283377714, 3283945315 +C: "OO", 3283945315, 3285107550 +C: "OO", 3285107550, 3286277687 +C: "OO", 3286277687, 3286797249 +C: "OO", 3286797249, 3287679223 +C: "OO", 3287679223, 3289237622 +C: "OO", 3289237622, 3290017736 +C: "OO", 3290017736, 3290125363 +C: "OO", 3290125363, 3290800441 +C: "OO", 3290800441, 3292250502 +C: "OO", 3292250502, 3293799595 +C: "OO", 3293799595, 3293991741 +C: "OO", 3293991741, 3294734241 +C: "OO", 3294734241, 3295992047 +C: "OO", 3295992047, 3296698376 +C: "OO", 3296698376, 3297933590 +C: "OO", 3297933590, 3298232497 +C: "OO", 3298232497, 3299693453 +C: "OO", 3299693453, 3300030329 +C: "OO", 3300030329, 3300352448 +C: "OO", 3300352448, 3300436177 +C: "OO", 3300436177, 3301155200 +C: "OO", 3301155200, 3301735482 +C: "OO", 3301735482, 3301802835 +C: "OO", 3301802835, 3301904441 +C: "OO", 3301904441, 3302155819 +C: "OO", 3302155819, 3303086733 +C: "OO", 3303086733, 3303935254 +C: "OO", 3303935254, 3305927035 +C: "OO", 3305927035, 3306108110 +C: "OO", 3306108110, 3306184322 +C: "OO", 3306184322, 3306711827 +C: "OO", 3306711827, 3306868295 +C: "OO", 3306868295, 3307273163 +C: "OO", 3307273163, 3307947404 +C: "OO", 3307947404, 3308694920 +C: "OO", 3308694920, 3309254953 +C: "OO", 3309254953, 3311199505 +C: "OO", 3311199505, 3311542769 +C: "OO", 3311542769, 3311564377 +C: "OO", 3311564377, 3311824809 +C: "OO", 3311824809, 3312109382 +C: "OO", 3312109382, 3312139084 +C: "OO", 3312139084, 3313634039 +C: "OO", 3313634039, 3314440799 +C: "OO", 3314440799, 3315462884 +C: "OO", 3315462884, 3315723567 +C: "OO", 3315723567, 3316761628 +C: "OO", 3316761628, 3317648249 +C: "OO", 3317648249, 3318100453 +C: "OO", 3318100453, 3320124641 +C: "OO", 3320124641, 3320427680 +C: "OO", 3320427680, 3320854789 +C: "OO", 3320854789, 3320949423 +C: "OO", 3320949423, 3320949644 +C: "OO", 3320949644, 3322199041 +C: "OO", 3322199041, 3322634766 +C: "OO", 3322634766, 3322658469 +C: "OO", 3322658469, 3323081383 +C: "OO", 3323081383, 3323162814 +C: "OO", 3323162814, 3323193343 +C: "OO", 3323193343, 3323547844 +C: "OO", 3323547844, 3324058823 +C: "OO", 3324058823, 3324634970 +C: "OO", 3324634970, 3325587110 +C: "OO", 3325587110, 3325724002 +C: "OO", 3325724002, 3326237815 +C: "OO", 3326237815, 3326470169 +C: "OO", 3326470169, 3326473148 +C: "OO", 3326473148, 3327822944 +C: "OO", 3327822944, 3329757377 +C: "OO", 3329757377, 3329920651 +C: "OO", 3329920651, 3330156943 +C: "OO", 3330156943, 3331037194 +C: "OO", 3331037194, 3331100306 +C: "OO", 3331100306, 3333186939 +C: "OO", 3333186939, 3333260588 +C: "OO", 3333260588, 3333417669 +C: "OO", 3333417669, 3333427381 +C: "OO", 3333427381, 3333764330 +C: "OO", 3333764330, 3334013447 +C: "OO", 3334013447, 3334057876 +C: "OO", 3334057876, 3334625769 +C: "OO", 3334625769, 3334711396 +C: "OO", 3334711396, 3334783556 +C: "OO", 3334783556, 3335160805 +C: "OO", 3335160805, 3335316519 +C: "OO", 3335316519, 3336574112 +C: "OO", 3336574112, 3337252597 +C: "OO", 3337252597, 3337565549 +C: "OO", 3337565549, 3337756421 +C: "OO", 3337756421, 3337940888 +C: "OO", 3337940888, 3337979995 +C: "OO", 3337979995, 3338204287 +C: "OO", 3338204287, 3338694884 +C: "OO", 3338694884, 3338751239 +C: "OO", 3338751239, 3339743909 +C: "OO", 3339743909, 3339931245 +C: "OO", 3339931245, 3339952026 +C: "OO", 3339952026, 3340780522 +C: "OO", 3340780522, 3341012596 +C: "OO", 3341012596, 3341093972 +C: "OO", 3341093972, 3344876547 +C: "OO", 3344876547, 3344921217 +C: "OO", 3344921217, 3345575146 +C: "OO", 3345575146, 3346087444 +C: "OO", 3346087444, 3346225687 +C: "OO", 3346225687, 3346232289 +C: "OO", 3346232289, 3349975067 +C: "OO", 3349975067, 3350033691 +C: "OO", 3350033691, 3350874503 +C: "OO", 3350874503, 3351074533 +C: "OO", 3351074533, 3351098950 +C: "OO", 3351098950, 3351554210 +C: "OO", 3351554210, 3352887534 +C: "OO", 3352887534, 3353634164 +C: "OO", 3353634164, 3354467690 +C: "OO", 3354467690, 3354689413 +C: "OO", 3354689413, 3356606989 +C: "OO", 3356606989, 3356612985 +C: "OO", 3356612985, 3356708288 +C: "OO", 3356708288, 3357999488 +C: "OO", 3357999488, 3358433636 +C: "OO", 3358433636, 3358512986 +C: "OO", 3358512986, 3359520039 +C: "OO", 3359520039, 3359541091 +C: "OO", 3359541091, 3360018090 +C: "OO", 3360018090, 3360104146 +C: "OO", 3360104146, 3361113344 +C: "OO", 3361113344, 3361992613 +C: "OO", 3361992613, 3363434422 +C: "OO", 3363434422, 3364549977 +C: "OO", 3364549977, 3365167497 +C: "OO", 3365167497, 3365342827 +C: "OO", 3365342827, 3365586512 +C: "OO", 3365586512, 3366237429 +C: "OO", 3366237429, 3366568087 +C: "OO", 3366568087, 3367084513 +C: "OO", 3367084513, 3367733421 +C: "OO", 3367733421, 3367872407 +C: "OO", 3367872407, 3369273282 +C: "OO", 3369273282, 3370837829 +C: "OO", 3370837829, 3370847122 +C: "OO", 3370847122, 3371889121 +C: "OO", 3371889121, 3372129278 +C: "OO", 3372129278, 3372205450 +C: "OO", 3372205450, 3372848623 +C: "OO", 3372848623, 3372985880 +C: "OO", 3372985880, 3373475131 +C: "OO", 3373475131, 3373964228 +C: "OO", 3373964228, 3375226718 +C: "OO", 3375226718, 3376009342 +C: "OO", 3376009342, 3376377122 +C: "OO", 3376377122, 3376412206 +C: "OO", 3376412206, 3377418314 +C: "OO", 3377418314, 3377892896 +C: "OO", 3377892896, 3378041144 +C: "OO", 3378041144, 3378061281 +C: "OO", 3378061281, 3378203372 +C: "OO", 3378203372, 3378680226 +C: "OO", 3378680226, 3379365989 +C: "OO", 3379365989, 3379815975 +C: "OO", 3379815975, 3379944177 +C: "OO", 3379944177, 3381106966 +C: "OO", 3381106966, 3381348199 +C: "OO", 3381348199, 3383736542 +C: "OO", 3383736542, 3384118177 +C: "OO", 3384118177, 3384260675 +C: "OO", 3384260675, 3384336429 +C: "OO", 3384336429, 3385594855 +C: "OO", 3385594855, 3385761536 +C: "OO", 3385761536, 3386018641 +C: "OO", 3386018641, 3386475018 +C: "OO", 3386475018, 3388245980 +C: "OO", 3388245980, 3388399785 +C: "OO", 3388399785, 3388563091 +C: "OO", 3388563091, 3389594762 +C: "OO", 3389594762, 3389923247 +C: "OO", 3389923247, 3391681215 +C: "OO", 3391681215, 3391786785 +C: "OO", 3391786785, 3391957638 +C: "OO", 3391957638, 3393599755 +C: "OO", 3393599755, 3393615893 +C: "OO", 3393615893, 3394394381 +C: "OO", 3394394381, 3395249353 +C: "OO", 3395249353, 3396787010 +C: "OO", 3396787010, 3397878140 +C: "OO", 3397878140, 3399124665 +C: "OO", 3399124665, 3399769602 +C: "OO", 3399769602, 3399974864 +C: "OO", 3399974864, 3401076377 +C: "OO", 3401076377, 3401142374 +C: "OO", 3401142374, 3401605482 +C: "OO", 3401605482, 3401940410 +C: "OO", 3401940410, 3403056884 +C: "OO", 3403056884, 3403223884 +C: "OO", 3403223884, 3403271207 +C: "OO", 3403271207, 3403347906 +C: "OO", 3403347906, 3403408031 +C: "OO", 3403408031, 3403972450 +C: "OO", 3403972450, 3404669505 +C: "OO", 3404669505, 3405737828 +C: "OO", 3405737828, 3406006853 +C: "OO", 3406006853, 3407210515 +C: "OO", 3407210515, 3407604417 +C: "OO", 3407604417, 3408034958 +C: "OO", 3408034958, 3408556268 +C: "OO", 3408556268, 3409402674 +C: "OO", 3409402674, 3409793044 +C: "OO", 3409793044, 3409867996 +C: "OO", 3409867996, 3410531542 +C: "OO", 3410531542, 3410631035 +C: "OO", 3410631035, 3411032755 +C: "OO", 3411032755, 3411270435 +C: "OO", 3411270435, 3411302373 +C: "OO", 3411302373, 3411309719 +C: "OO", 3411309719, 3412581058 +C: "OO", 3412581058, 3413397001 +C: "OO", 3413397001, 3414194586 +C: "OO", 3414194586, 3415156335 +C: "OO", 3415156335, 3415356267 +C: "OO", 3415356267, 3416793308 +C: "OO", 3416793308, 3417043598 +C: "OO", 3417043598, 3417655261 +C: "OO", 3417655261, 3417836000 +C: "OO", 3417836000, 3418490438 +C: "OO", 3418490438, 3419034665 +C: "OO", 3419034665, 3420722253 +C: "OO", 3420722253, 3421542319 +C: "OO", 3421542319, 3421839581 +C: "OO", 3421839581, 3423092991 +C: "OO", 3423092991, 3423160569 +C: "OO", 3423160569, 3423538211 +C: "OO", 3423538211, 3423650855 +C: "OO", 3423650855, 3423726459 +C: "OO", 3423726459, 3424488320 +C: "OO", 3424488320, 3424555160 +C: "OO", 3424555160, 3424800932 +C: "OO", 3424800932, 3425687025 +C: "OO", 3425687025, 3426550268 +C: "OO", 3426550268, 3428704088 +C: "OO", 3428704088, 3429926214 +C: "OO", 3429926214, 3430140395 +C: "OO", 3430140395, 3432313682 +C: "OO", 3432313682, 3432746847 +C: "OO", 3432746847, 3432888450 +C: "OO", 3432888450, 3434383706 +C: "OO", 3434383706, 3434939457 +C: "OO", 3434939457, 3436054415 +C: "OO", 3436054415, 3437099509 +C: "OO", 3437099509, 3437301085 +C: "OO", 3437301085, 3437321877 +C: "OO", 3437321877, 3437356078 +C: "OO", 3437356078, 3437447253 +C: "OO", 3437447253, 3437676641 +C: "OO", 3437676641, 3438659530 +C: "OO", 3438659530, 3438710551 +C: "OO", 3438710551, 3438806287 +C: "OO", 3438806287, 3439025978 +C: "OO", 3439025978, 3439186660 +C: "OO", 3439186660, 3439543251 +C: "OO", 3439543251, 3439648346 +C: "OO", 3439648346, 3440957955 +C: "OO", 3440957955, 3441583966 +C: "OO", 3441583966, 3441686559 +C: "OO", 3441686559, 3442395602 +C: "OO", 3442395602, 3442649943 +C: "OO", 3442649943, 3443923495 +C: "OO", 3443923495, 3444629131 +C: "OO", 3444629131, 3444784819 +C: "OO", 3444784819, 3446201506 +C: "OO", 3446201506, 3446659453 +C: "OO", 3446659453, 3447030032 +C: "OO", 3447030032, 3447482851 +C: "OO", 3447482851, 3448422557 +C: "OO", 3448422557, 3448568997 +C: "OO", 3448568997, 3449220101 +C: "OO", 3449220101, 3450420973 +C: "OO", 3450420973, 3451338782 +C: "OO", 3451338782, 3452461241 +C: "OO", 3452461241, 3454931651 +C: "OO", 3454931651, 3456165748 +C: "OO", 3456165748, 3456276115 +C: "OO", 3456276115, 3456432674 +C: "OO", 3456432674, 3456446702 +C: "OO", 3456446702, 3456811039 +C: "OO", 3456811039, 3458611601 +C: "OO", 3458611601, 3459377740 +C: "OO", 3459377740, 3459720686 +C: "OO", 3459720686, 3460116246 +C: "OO", 3460116246, 3460616327 +C: "OO", 3460616327, 3460710413 +C: "OO", 3460710413, 3460826815 +C: "OO", 3460826815, 3461409658 +C: "OO", 3461409658, 3462203357 +C: "OO", 3462203357, 3463455966 +C: "OO", 3463455966, 3463684681 +C: "OO", 3463684681, 3464737014 +C: "OO", 3464737014, 3465451925 +C: "OO", 3465451925, 3465595471 +C: "OO", 3465595471, 3466933900 +C: "OO", 3466933900, 3467392724 +C: "OO", 3467392724, 3467792258 +C: "OO", 3467792258, 3468062610 +C: "OO", 3468062610, 3468164109 +C: "OO", 3468164109, 3469169474 +C: "OO", 3469169474, 3469399198 +C: "OO", 3469399198, 3469812646 +C: "OO", 3469812646, 3470195071 +C: "OO", 3470195071, 3471366175 +C: "OO", 3471366175, 3471824620 +C: "OO", 3471824620, 3471857366 +C: "OO", 3471857366, 3471970907 +C: "OO", 3471970907, 3472067290 +C: "OO", 3472067290, 3472865345 +C: "OO", 3472865345, 3473854010 +C: "OO", 3473854010, 3475420695 +C: "OO", 3475420695, 3478603827 +C: "OO", 3478603827, 3478736606 +C: "OO", 3478736606, 3480198087 +C: "OO", 3480198087, 3480859593 +C: "OO", 3480859593, 3482143058 +C: "OO", 3482143058, 3482614846 +C: "OO", 3482614846, 3482802206 +C: "OO", 3482802206, 3483434842 +C: "OO", 3483434842, 3483453081 +C: "OO", 3483453081, 3483620717 +C: "OO", 3483620717, 3483669642 +C: "OO", 3483669642, 3484260979 +C: "OO", 3484260979, 3484778265 +C: "OO", 3484778265, 3485340073 +C: "OO", 3485340073, 3485369995 +C: "OO", 3485369995, 3485767994 +C: "OO", 3485767994, 3486849239 +C: "OO", 3486849239, 3487128087 +C: "OO", 3487128087, 3487696487 +C: "OO", 3487696487, 3488326772 +C: "OO", 3488326772, 3489149337 +C: "OO", 3489149337, 3490845015 +C: "OO", 3490845015, 3492259743 +C: "OO", 3492259743, 3493814288 +C: "OO", 3493814288, 3496239028 +C: "OO", 3496239028, 3497048255 +C: "OO", 3497048255, 3497654317 +C: "OO", 3497654317, 3498036940 +C: "OO", 3498036940, 3500322939 +C: "OO", 3500322939, 3500864649 +C: "OO", 3500864649, 3502288373 +C: "OO", 3502288373, 3502845674 +C: "OO", 3502845674, 3503466597 +C: "OO", 3503466597, 3503472740 +C: "OO", 3503472740, 3503614834 +C: "OO", 3503614834, 3504004924 +C: "OO", 3504004924, 3504427301 +C: "OO", 3504427301, 3504584842 +C: "OO", 3504584842, 3504671361 +C: "OO", 3504671361, 3509934428 +C: "OO", 3509934428, 3511625210 +C: "OO", 3511625210, 3511638721 +C: "OO", 3511638721, 3511655922 +C: "OO", 3511655922, 3511957743 +C: "OO", 3511957743, 3513512275 +C: "OO", 3513512275, 3514412639 +C: "OO", 3514412639, 3515003084 +C: "OO", 3515003084, 3515371924 +C: "OO", 3515371924, 3515968339 +C: "OO", 3515968339, 3516176566 +C: "OO", 3516176566, 3517000938 +C: "OO", 3517000938, 3518416946 +C: "OO", 3518416946, 3518497066 +C: "OO", 3518497066, 3519632840 +C: "OO", 3519632840, 3520485572 +C: "OO", 3520485572, 3520693998 +C: "OO", 3520693998, 3521358354 +C: "OO", 3521358354, 3521933345 +C: "OO", 3521933345, 3522112162 +C: "OO", 3522112162, 3522336563 +C: "OO", 3522336563, 3525005811 +C: "OO", 3525005811, 3525592429 +C: "OO", 3525592429, 3526706973 +C: "OO", 3526706973, 3526813367 +C: "OO", 3526813367, 3527086087 +C: "OO", 3527086087, 3528753213 +C: "OO", 3528753213, 3528931996 +C: "OO", 3528931996, 3529159842 +C: "OO", 3529159842, 3529699509 +C: "OO", 3529699509, 3530401571 +C: "OO", 3530401571, 3530499669 +C: "OO", 3530499669, 3531344873 +C: "OO", 3531344873, 3532571063 +C: "OO", 3532571063, 3532987069 +C: "OO", 3532987069, 3533059499 +C: "OO", 3533059499, 3533185760 +C: "OO", 3533185760, 3533566066 +C: "OO", 3533566066, 3533589076 +C: "OO", 3533589076, 3534643558 +C: "OO", 3534643558, 3535057313 +C: "OO", 3535057313, 3535558474 +C: "OO", 3535558474, 3535809181 +C: "OO", 3535809181, 3535838267 +C: "OO", 3535838267, 3536983586 +C: "OO", 3536983586, 3538157860 +C: "OO", 3538157860, 3538647614 +C: "OO", 3538647614, 3538751861 +C: "OO", 3538751861, 3538974604 +C: "OO", 3538974604, 3539037634 +C: "OO", 3539037634, 3540838804 +C: "OO", 3540838804, 3541578371 +C: "OO", 3541578371, 3541743646 +C: "OO", 3541743646, 3541859500 +C: "OO", 3541859500, 3541936427 +C: "OO", 3541936427, 3544326820 +C: "OO", 3544326820, 3544530556 +C: "OO", 3544530556, 3544939899 +C: "OO", 3544939899, 3545490745 +C: "OO", 3545490745, 3545887274 +C: "OO", 3545887274, 3545972698 +C: "OO", 3545972698, 3546052950 +C: "OO", 3546052950, 3546837346 +C: "OO", 3546837346, 3547386574 +C: "OO", 3547386574, 3548953018 +C: "OO", 3548953018, 3549819275 +C: "OO", 3549819275, 3550041008 +C: "OO", 3550041008, 3550052293 +C: "OO", 3550052293, 3550076407 +C: "OO", 3550076407, 3550248848 +C: "OO", 3550248848, 3551452758 +C: "OO", 3551452758, 3551643739 +C: "OO", 3551643739, 3553110373 +C: "OO", 3553110373, 3553228331 +C: "OO", 3553228331, 3553572783 +C: "OO", 3553572783, 3553681449 +C: "OO", 3553681449, 3555103460 +C: "OO", 3555103460, 3555376811 +C: "OO", 3555376811, 3556014918 +C: "OO", 3556014918, 3556190662 +C: "OO", 3556190662, 3556859093 +C: "OO", 3556859093, 3557319395 +C: "OO", 3557319395, 3557547673 +C: "OO", 3557547673, 3557964497 +C: "OO", 3557964497, 3558608360 +C: "OO", 3558608360, 3558977937 +C: "OO", 3558977937, 3559523569 +C: "OO", 3559523569, 3559589276 +C: "OO", 3559589276, 3559889542 +C: "OO", 3559889542, 3561059427 +C: "OO", 3561059427, 3561672061 +C: "OO", 3561672061, 3561822074 +C: "OO", 3561822074, 3564015385 +C: "OO", 3564015385, 3564914755 +C: "OO", 3564914755, 3565228334 +C: "OO", 3565228334, 3565557761 +C: "OO", 3565557761, 3565683299 +C: "OO", 3565683299, 3566682011 +C: "OO", 3566682011, 3567166135 +C: "OO", 3567166135, 3567254023 +C: "OO", 3567254023, 3567445071 +C: "OO", 3567445071, 3567763180 +C: "OO", 3567763180, 3567827541 +C: "OO", 3567827541, 3568110766 +C: "OO", 3568110766, 3568131878 +C: "OO", 3568131878, 3568427950 +C: "OO", 3568427950, 3568504022 +C: "OO", 3568504022, 3568910788 +C: "OO", 3568910788, 3569971089 +C: "OO", 3569971089, 3570309718 +C: "OO", 3570309718, 3570819998 +C: "OO", 3570819998, 3571333731 +C: "OO", 3571333731, 3571588484 +C: "OO", 3571588484, 3572467892 +C: "OO", 3572467892, 3573377723 +C: "OO", 3573377723, 3573836786 +C: "OO", 3573836786, 3574048592 +C: "OO", 3574048592, 3574064373 +C: "OO", 3574064373, 3574268466 +C: "OO", 3574268466, 3575215195 +C: "OO", 3575215195, 3575283298 +C: "OO", 3575283298, 3575480878 +C: "OO", 3575480878, 3575966181 +C: "OO", 3575966181, 3576786028 +C: "OO", 3576786028, 3577048509 +C: "OO", 3577048509, 3577187553 +C: "OO", 3577187553, 3577212765 +C: "OO", 3577212765, 3577382903 +C: "OO", 3577382903, 3577723609 +C: "OO", 3577723609, 3577957690 +C: "OO", 3577957690, 3578365171 +C: "OO", 3578365171, 3579318416 +C: "OO", 3579318416, 3579509977 +C: "OO", 3579509977, 3580630209 +C: "OO", 3580630209, 3581932953 +C: "OO", 3581932953, 3582429825 +C: "OO", 3582429825, 3582814162 +C: "OO", 3582814162, 3583276019 +C: "OO", 3583276019, 3583383580 +C: "OO", 3583383580, 3586168305 +C: "OO", 3586168305, 3586362015 +C: "OO", 3586362015, 3588476024 +C: "OO", 3588476024, 3589569249 +C: "OO", 3589569249, 3590039594 +C: "OO", 3590039594, 3590072149 +C: "OO", 3590072149, 3592505887 +C: "OO", 3592505887, 3593098703 +C: "OO", 3593098703, 3593242407 +C: "OO", 3593242407, 3594374555 +C: "OO", 3594374555, 3594724178 +C: "OO", 3594724178, 3595305766 +C: "OO", 3595305766, 3595508849 +C: "OO", 3595508849, 3596278270 +C: "OO", 3596278270, 3596763762 +C: "OO", 3596763762, 3596913914 +C: "OO", 3596913914, 3597079679 +C: "OO", 3597079679, 3597389106 +C: "OO", 3597389106, 3597649793 +C: "OO", 3597649793, 3597762859 +C: "OO", 3597762859, 3598074929 +C: "OO", 3598074929, 3599695827 +C: "OO", 3599695827, 3599806895 +C: "OO", 3599806895, 3601031863 +C: "OO", 3601031863, 3602183874 +C: "OO", 3602183874, 3603418265 +C: "OO", 3603418265, 3604485860 +C: "OO", 3604485860, 3605037682 +C: "OO", 3605037682, 3605097418 +C: "OO", 3605097418, 3605355435 +C: "OO", 3605355435, 3606833865 +C: "OO", 3606833865, 3608902095 +C: "OO", 3608902095, 3609667282 +C: "OO", 3609667282, 3609788229 +C: "OO", 3609788229, 3610806258 +C: "OO", 3610806258, 3612410841 +C: "OO", 3612410841, 3612655226 +C: "OO", 3612655226, 3612755578 +C: "OO", 3612755578, 3613438331 +C: "OO", 3613438331, 3613972815 +C: "OO", 3613972815, 3614414437 +C: "OO", 3614414437, 3615289042 +C: "OO", 3615289042, 3615982771 +C: "OO", 3615982771, 3617345651 +C: "OO", 3617345651, 3618155681 +C: "OO", 3618155681, 3619029572 +C: "OO", 3619029572, 3619081590 +C: "OO", 3619081590, 3620538990 +C: "OO", 3620538990, 3623339243 +C: "OO", 3623339243, 3623374521 +C: "OO", 3623374521, 3624056759 +C: "OO", 3624056759, 3624191485 +C: "OO", 3624191485, 3624592268 +C: "OO", 3624592268, 3624782747 +C: "OO", 3624782747, 3625000231 +C: "OO", 3625000231, 3625629059 +C: "OO", 3625629059, 3625695679 +C: "OO", 3625695679, 3626632641 +C: "OO", 3626632641, 3627264214 +C: "OO", 3627264214, 3627265434 +C: "OO", 3627265434, 3627275838 +C: "OO", 3627275838, 3629122403 +C: "OO", 3629122403, 3629163787 +C: "OO", 3629163787, 3630025961 +C: "OO", 3630025961, 3630376853 +C: "OO", 3630376853, 3630493286 +C: "OO", 3630493286, 3632211890 +C: "OO", 3632211890, 3632842915 +C: "OO", 3632842915, 3633579649 +C: "OO", 3633579649, 3634050534 +C: "OO", 3634050534, 3634309057 +C: "OO", 3634309057, 3634356281 +C: "OO", 3634356281, 3634548603 +C: "OO", 3634548603, 3635455426 +C: "OO", 3635455426, 3635967788 +C: "OO", 3635967788, 3636211462 +C: "OO", 3636211462, 3636425583 +C: "OO", 3636425583, 3637832867 +C: "OO", 3637832867, 3638778463 +C: "OO", 3638778463, 3639174750 +C: "OO", 3639174750, 3639377336 +C: "OO", 3639377336, 3639458659 +C: "OO", 3639458659, 3640219637 +C: "OO", 3640219637, 3640290342 +C: "OO", 3640290342, 3640418897 +C: "OO", 3640418897, 3640441103 +C: "OO", 3640441103, 3640784457 +C: "OO", 3640784457, 3641196842 +C: "OO", 3641196842, 3641466013 +C: "OO", 3641466013, 3641866629 +C: "OO", 3641866629, 3642737533 +C: "OO", 3642737533, 3643656906 +C: "OO", 3643656906, 3644084618 +C: "OO", 3644084618, 3645054707 +C: "OO", 3645054707, 3645510377 +C: "OO", 3645510377, 3646141078 +C: "OO", 3646141078, 3646397185 +C: "OO", 3646397185, 3646522127 +C: "OO", 3646522127, 3646869172 +C: "OO", 3646869172, 3648266888 +C: "OO", 3648266888, 3648504596 +C: "OO", 3648504596, 3649453472 +C: "OO", 3649453472, 3649937806 +C: "OO", 3649937806, 3650055851 +C: "OO", 3650055851, 3651561823 +C: "OO", 3651561823, 3651565903 +C: "OO", 3651565903, 3651927101 +C: "OO", 3651927101, 3652394143 +C: "OO", 3652394143, 3652416081 +C: "OO", 3652416081, 3652998491 +C: "OO", 3652998491, 3653855745 +C: "OO", 3653855745, 3653909215 +C: "OO", 3653909215, 3654116972 +C: "OO", 3654116972, 3655139997 +C: "OO", 3655139997, 3655397242 +C: "OO", 3655397242, 3657072306 +C: "OO", 3657072306, 3657229664 +C: "OO", 3657229664, 3657413972 +C: "OO", 3657413972, 3657746252 +C: "OO", 3657746252, 3658084555 +C: "OO", 3658084555, 3660840127 +C: "OO", 3660840127, 3661440093 +C: "OO", 3661440093, 3662103074 +C: "OO", 3662103074, 3663192310 +C: "OO", 3663192310, 3663461349 +C: "OO", 3663461349, 3664004470 +C: "OO", 3664004470, 3664137626 +C: "OO", 3664137626, 3664189066 +C: "OO", 3664189066, 3664738639 +C: "OO", 3664738639, 3664838318 +C: "OO", 3664838318, 3665029081 +C: "OO", 3665029081, 3665366881 +C: "OO", 3665366881, 3665472657 +C: "OO", 3665472657, 3666317346 +C: "OO", 3666317346, 3668817938 +C: "OO", 3668817938, 3669227773 +C: "OO", 3669227773, 3669833193 +C: "OO", 3669833193, 3670534523 +C: "OO", 3670534523, 3671415682 +C: "OO", 3671415682, 3673048031 +C: "OO", 3673048031, 3673301494 +C: "OO", 3673301494, 3673966098 +C: "OO", 3673966098, 3675303963 +C: "OO", 3675303963, 3675761997 +C: "OO", 3675761997, 3676275169 +C: "OO", 3676275169, 3676766379 +C: "OO", 3676766379, 3677070862 +C: "OO", 3677070862, 3677613884 +C: "OO", 3677613884, 3677718315 +C: "OO", 3677718315, 3678301994 +C: "OO", 3678301994, 3678440610 +C: "OO", 3678440610, 3678964742 +C: "OO", 3678964742, 3679017313 +C: "OO", 3679017313, 3679083166 +C: "OO", 3679083166, 3679563058 +C: "OO", 3679563058, 3679625636 +C: "OO", 3679625636, 3680162117 +C: "OO", 3680162117, 3681314723 +C: "OO", 3681314723, 3681557895 +C: "OO", 3681557895, 3681913526 +C: "OO", 3681913526, 3683306999 +C: "OO", 3683306999, 3684318746 +C: "OO", 3684318746, 3684511311 +C: "OO", 3684511311, 3685077366 +C: "OO", 3685077366, 3685432201 +C: "OO", 3685432201, 3686052639 +C: "OO", 3686052639, 3687497553 +C: "OO", 3687497553, 3688240222 +C: "OO", 3688240222, 3688744660 +C: "OO", 3688744660, 3689307988 +C: "OO", 3689307988, 3689761029 +C: "OO", 3689761029, 3690777255 +C: "OO", 3690777255, 3691120018 +C: "OO", 3691120018, 3691142060 +C: "OO", 3691142060, 3691778757 +C: "OO", 3691778757, 3691835308 +C: "OO", 3691835308, 3692151951 +C: "OO", 3692151951, 3692434131 +C: "OO", 3692434131, 3693626889 +C: "OO", 3693626889, 3693676615 +C: "OO", 3693676615, 3694370274 +C: "OO", 3694370274, 3694709139 +C: "OO", 3694709139, 3694742517 +C: "OO", 3694742517, 3697306521 +C: "OO", 3697306521, 3698020607 +C: "OO", 3698020607, 3698451125 +C: "OO", 3698451125, 3698661134 +C: "OO", 3698661134, 3699623026 +C: "OO", 3699623026, 3700984583 +C: "OO", 3700984583, 3701085258 +C: "OO", 3701085258, 3701154697 +C: "OO", 3701154697, 3701490974 +C: "OO", 3701490974, 3701545342 +C: "OO", 3701545342, 3701792982 +C: "OO", 3701792982, 3706041879 +C: "OO", 3706041879, 3707829858 +C: "OO", 3707829858, 3708458790 +C: "OO", 3708458790, 3709229411 +C: "OO", 3709229411, 3709531283 +C: "OO", 3709531283, 3710568603 +C: "OO", 3710568603, 3711085159 +C: "OO", 3711085159, 3711432555 +C: "OO", 3711432555, 3711538726 +C: "OO", 3711538726, 3711678474 +C: "OO", 3711678474, 3711880928 +C: "OO", 3711880928, 3713307891 +C: "OO", 3713307891, 3714012349 +C: "OO", 3714012349, 3714130806 +C: "OO", 3714130806, 3714414715 +C: "OO", 3714414715, 3715009965 +C: "OO", 3715009965, 3715784086 +C: "OO", 3715784086, 3717016098 +C: "OO", 3717016098, 3717851951 +C: "OO", 3717851951, 3718465677 +C: "OO", 3718465677, 3718520362 +C: "OO", 3718520362, 3718744273 +C: "OO", 3718744273, 3718929731 +C: "OO", 3718929731, 3718933172 +C: "OO", 3718933172, 3719542410 +C: "OO", 3719542410, 3719651713 +C: "OO", 3719651713, 3720700550 +C: "OO", 3720700550, 3721037837 +C: "OO", 3721037837, 3721780686 +C: "OO", 3721780686, 3722155156 +C: "OO", 3722155156, 3722498214 +C: "OO", 3722498214, 3722607994 +C: "OO", 3722607994, 3723592100 +C: "OO", 3723592100, 3723813295 +C: "OO", 3723813295, 3723829132 +C: "OO", 3723829132, 3724112413 +C: "OO", 3724112413, 3724669163 +C: "OO", 3724669163, 3727164580 +C: "OO", 3727164580, 3727459628 +C: "OO", 3727459628, 3729403249 +C: "OO", 3729403249, 3729639885 +C: "OO", 3729639885, 3730327065 +C: "OO", 3730327065, 3730406231 +C: "OO", 3730406231, 3731572318 +C: "OO", 3731572318, 3731615265 +C: "OO", 3731615265, 3731689789 +C: "OO", 3731689789, 3731737570 +C: "OO", 3731737570, 3731772801 +C: "OO", 3731772801, 3731827957 +C: "OO", 3731827957, 3732721769 +C: "OO", 3732721769, 3734121023 +C: "OO", 3734121023, 3734549428 +C: "OO", 3734549428, 3734663182 +C: "OO", 3734663182, 3735098499 +C: "OO", 3735098499, 3736045022 +C: "OO", 3736045022, 3736892050 +C: "OO", 3736892050, 3737244515 +C: "OO", 3737244515, 3737264442 +C: "OO", 3737264442, 3737356305 +C: "OO", 3737356305, 3738151998 +C: "OO", 3738151998, 3738589267 +C: "OO", 3738589267, 3739376759 +C: "OO", 3739376759, 3739736863 +C: "OO", 3739736863, 3739875470 +C: "OO", 3739875470, 3741100649 +C: "OO", 3741100649, 3741563692 +C: "OO", 3741563692, 3741677044 +C: "OO", 3741677044, 3742746104 +C: "OO", 3742746104, 3743540715 +C: "OO", 3743540715, 3743833664 +C: "OO", 3743833664, 3743915934 +C: "OO", 3743915934, 3743924035 +C: "OO", 3743924035, 3745635322 +C: "OO", 3745635322, 3747576034 +C: "OO", 3747576034, 3747970429 +C: "OO", 3747970429, 3749110882 +C: "OO", 3749110882, 3749470973 +C: "OO", 3749470973, 3750731420 +C: "OO", 3750731420, 3750818258 +C: "OO", 3750818258, 3750849013 +C: "OO", 3750849013, 3751229999 +C: "OO", 3751229999, 3751315711 +C: "OO", 3751315711, 3751439499 +C: "OO", 3751439499, 3751763745 +C: "OO", 3751763745, 3752785993 +C: "OO", 3752785993, 3752863036 +C: "OO", 3752863036, 3753047932 +C: "OO", 3753047932, 3753445041 +C: "OO", 3753445041, 3753725261 +C: "OO", 3753725261, 3753997156 +C: "OO", 3753997156, 3754039369 +C: "OO", 3754039369, 3754815752 +C: "OO", 3754815752, 3755932425 +C: "OO", 3755932425, 3755934020 +C: "OO", 3755934020, 3755994429 +C: "OO", 3755994429, 3756162645 +C: "OO", 3756162645, 3757047729 +C: "OO", 3757047729, 3757154638 +C: "OO", 3757154638, 3757158877 +C: "OO", 3757158877, 3757451545 +C: "OO", 3757451545, 3757690417 +C: "OO", 3757690417, 3758493434 +C: "OO", 3758493434, 3759058246 +C: "OO", 3759058246, 3759246775 +C: "OO", 3759246775, 3759588513 +C: "OO", 3759588513, 3760023316 +C: "OO", 3760023316, 3760046458 +C: "OO", 3760046458, 3760362676 +C: "OO", 3760362676, 3760920841 +C: "OO", 3760920841, 3761302935 +C: "OO", 3761302935, 3761835826 +C: "OO", 3761835826, 3762423111 +C: "OO", 3762423111, 3762722941 +C: "OO", 3762722941, 3763553651 +C: "OO", 3763553651, 3765351361 +C: "OO", 3765351361, 3765605375 +C: "OO", 3765605375, 3766113962 +C: "OO", 3766113962, 3766213879 +C: "OO", 3766213879, 3766558646 +C: "OO", 3766558646, 3767658097 +C: "OO", 3767658097, 3767727797 +C: "OO", 3767727797, 3768889390 +C: "OO", 3768889390, 3769013065 +C: "OO", 3769013065, 3769259623 +C: "OO", 3769259623, 3770055425 +C: "OO", 3770055425, 3770513870 +C: "OO", 3770513870, 3770710421 +C: "OO", 3770710421, 3772734513 +C: "OO", 3772734513, 3773009878 +C: "OO", 3773009878, 3773930822 +C: "OO", 3773930822, 3774275018 +C: "OO", 3774275018, 3774325734 +C: "OO", 3774325734, 3774586945 +C: "OO", 3774586945, 3774883471 +C: "OO", 3774883471, 3775746296 +C: "OO", 3775746296, 3775874413 +C: "OO", 3775874413, 3776599315 +C: "OO", 3776599315, 3777581763 +C: "OO", 3777581763, 3778723973 +C: "OO", 3778723973, 3778745889 +C: "OO", 3778745889, 3779455333 +C: "OO", 3779455333, 3779827427 +C: "OO", 3779827427, 3780193093 +C: "OO", 3780193093, 3780995467 +C: "OO", 3780995467, 3781697240 +C: "OO", 3781697240, 3782781877 +C: "OO", 3782781877, 3783315943 +C: "OO", 3783315943, 3785022989 +C: "OO", 3785022989, 3787203418 +C: "OO", 3787203418, 3787398177 +C: "OO", 3787398177, 3787508209 +C: "OO", 3787508209, 3787811843 +C: "OO", 3787811843, 3787935050 +C: "OO", 3787935050, 3788961751 +C: "OO", 3788961751, 3789248054 +C: "OO", 3789248054, 3790120036 +C: "OO", 3790120036, 3793469641 +C: "OO", 3793469641, 3793734231 +C: "OO", 3793734231, 3794605928 +C: "OO", 3794605928, 3795147052 +C: "OO", 3795147052, 3795524335 +C: "OO", 3795524335, 3796659395 +C: "OO", 3796659395, 3796804244 +C: "OO", 3796804244, 3797638889 +C: "OO", 3797638889, 3797883752 +C: "OO", 3797883752, 3800030979 +C: "OO", 3800030979, 3800664566 +C: "OO", 3800664566, 3801290764 +C: "OO", 3801290764, 3802269263 +C: "OO", 3802269263, 3802335458 +C: "OO", 3802335458, 3802793336 +C: "OO", 3802793336, 3803365597 +C: "OO", 3803365597, 3803806254 +C: "OO", 3803806254, 3804512278 +C: "OO", 3804512278, 3804557926 +C: "OO", 3804557926, 3805040672 +C: "OO", 3805040672, 3805098356 +C: "OO", 3805098356, 3805124405 +C: "OO", 3805124405, 3805327947 +C: "OO", 3805327947, 3805848091 +C: "OO", 3805848091, 3805856300 +C: "OO", 3805856300, 3806808595 +C: "OO", 3806808595, 3807298094 +C: "OO", 3807298094, 3807408143 +C: "OO", 3807408143, 3807441177 +C: "OO", 3807441177, 3808636191 +C: "OO", 3808636191, 3808963015 +C: "OO", 3808963015, 3809085320 +C: "OO", 3809085320, 3809393342 +C: "OO", 3809393342, 3809417803 +C: "OO", 3809417803, 3810135873 +C: "OO", 3810135873, 3810485447 +C: "OO", 3810485447, 3811864463 +C: "OO", 3811864463, 3812292831 +C: "OO", 3812292831, 3812772663 +C: "OO", 3812772663, 3815059833 +C: "OO", 3815059833, 3815399113 +C: "OO", 3815399113, 3815487693 +C: "OO", 3815487693, 3816051793 +C: "OO", 3816051793, 3816507050 +C: "OO", 3816507050, 3817152294 +C: "OO", 3817152294, 3818969893 +C: "OO", 3818969893, 3819276425 +C: "OO", 3819276425, 3820219586 +C: "OO", 3820219586, 3820335134 +C: "OO", 3820335134, 3820447601 +C: "OO", 3820447601, 3820753717 +C: "OO", 3820753717, 3820815518 +C: "OO", 3820815518, 3821767134 +C: "OO", 3821767134, 3821835100 +C: "OO", 3821835100, 3822632113 +C: "OO", 3822632113, 3823835446 +C: "OO", 3823835446, 3824538124 +C: "OO", 3824538124, 3826165803 +C: "OO", 3826165803, 3826898129 +C: "OO", 3826898129, 3827669794 +C: "OO", 3827669794, 3828037613 +C: "OO", 3828037613, 3828518989 +C: "OO", 3828518989, 3829191110 +C: "OO", 3829191110, 3829905322 +C: "OO", 3829905322, 3829962421 +C: "OO", 3829962421, 3830241164 +C: "OO", 3830241164, 3830645350 +C: "OO", 3830645350, 3830685749 +C: "OO", 3830685749, 3831717908 +C: "OO", 3831717908, 3831945126 +C: "OO", 3831945126, 3833010541 +C: "OO", 3833010541, 3833720884 +C: "OO", 3833720884, 3834174682 +C: "OO", 3834174682, 3835315311 +C: "OO", 3835315311, 3835455446 +C: "OO", 3835455446, 3835467091 +C: "OO", 3835467091, 3836041514 +C: "OO", 3836041514, 3836198228 +C: "OO", 3836198228, 3836848421 +C: "OO", 3836848421, 3837407279 +C: "OO", 3837407279, 3838761349 +C: "OO", 3838761349, 3839570646 +C: "OO", 3839570646, 3839835014 +C: "OO", 3839835014, 3839953017 +C: "OO", 3839953017, 3840233305 +C: "OO", 3840233305, 3841651230 +C: "OO", 3841651230, 3842708806 +C: "OO", 3842708806, 3843596139 +C: "OO", 3843596139, 3844048991 +C: "OO", 3844048991, 3844220804 +C: "OO", 3844220804, 3844374779 +C: "OO", 3844374779, 3844690103 +C: "OO", 3844690103, 3844915677 +C: "OO", 3844915677, 3845351525 +C: "OO", 3845351525, 3845637033 +C: "OO", 3845637033, 3846422345 +C: "OO", 3846422345, 3847046761 +C: "OO", 3847046761, 3847408583 +C: "OO", 3847408583, 3847980173 +C: "OO", 3847980173, 3849172954 +C: "OO", 3849172954, 3849614312 +C: "OO", 3849614312, 3849669106 +C: "OO", 3849669106, 3849878537 +C: "OO", 3849878537, 3850305005 +C: "OO", 3850305005, 3851243799 +C: "OO", 3851243799, 3851678623 +C: "OO", 3851678623, 3853200590 +C: "OO", 3853200590, 3854009522 +C: "OO", 3854009522, 3854061313 +C: "OO", 3854061313, 3854449910 +C: "OO", 3854449910, 3855117937 +C: "OO", 3855117937, 3855692475 +C: "OO", 3855692475, 3855837481 +C: "OO", 3855837481, 3856429326 +C: "OO", 3856429326, 3861269030 +C: "OO", 3861269030, 3861961154 +C: "OO", 3861961154, 3862049699 +C: "OO", 3862049699, 3862062519 +C: "OO", 3862062519, 3862644622 +C: "OO", 3862644622, 3862831721 +C: "OO", 3862831721, 3862984322 +C: "OO", 3862984322, 3863077545 +C: "OO", 3863077545, 3863093169 +C: "OO", 3863093169, 3863638991 +C: "OO", 3863638991, 3863938109 +C: "OO", 3863938109, 3864943334 +C: "OO", 3864943334, 3865033135 +C: "OO", 3865033135, 3866283143 +C: "OO", 3866283143, 3866716405 +C: "OO", 3866716405, 3866893981 +C: "OO", 3866893981, 3867369942 +C: "OO", 3867369942, 3868017980 +C: "OO", 3868017980, 3868474892 +C: "OO", 3868474892, 3868782155 +C: "OO", 3868782155, 3869698062 +C: "OO", 3869698062, 3869989156 +C: "OO", 3869989156, 3870041641 +C: "OO", 3870041641, 3870784878 +C: "OO", 3870784878, 3871973567 +C: "OO", 3871973567, 3872062609 +C: "OO", 3872062609, 3872266138 +C: "OO", 3872266138, 3872683210 +C: "OO", 3872683210, 3873923510 +C: "OO", 3873923510, 3875710657 +C: "OO", 3875710657, 3875833407 +C: "OO", 3875833407, 3876043334 +C: "OO", 3876043334, 3876053781 +C: "OO", 3876053781, 3876734389 +C: "OO", 3876734389, 3877376909 +C: "OO", 3877376909, 3877628635 +C: "OO", 3877628635, 3877962724 +C: "OO", 3877962724, 3878066158 +C: "OO", 3878066158, 3878291645 +C: "OO", 3878291645, 3879000807 +C: "OO", 3879000807, 3879448773 +C: "OO", 3879448773, 3879647485 +C: "OO", 3879647485, 3880893002 +C: "OO", 3880893002, 3881948326 +C: "OO", 3881948326, 3882178577 +C: "OO", 3882178577, 3882382755 +C: "OO", 3882382755, 3882540973 +C: "OO", 3882540973, 3882640417 +C: "OO", 3882640417, 3882714845 +C: "OO", 3882714845, 3882941865 +C: "OO", 3882941865, 3883871082 +C: "OO", 3883871082, 3884730755 +C: "OO", 3884730755, 3884858505 +C: "OO", 3884858505, 3886000687 +C: "OO", 3886000687, 3887412198 +C: "OO", 3887412198, 3888005187 +C: "OO", 3888005187, 3888289915 +C: "OO", 3888289915, 3888957994 +C: "OO", 3888957994, 3889275476 +C: "OO", 3889275476, 3889757481 +C: "OO", 3889757481, 3890611274 +C: "OO", 3890611274, 3890866806 +C: "OO", 3890866806, 3891064489 +C: "OO", 3891064489, 3891662595 +C: "OO", 3891662595, 3891680095 +C: "OO", 3891680095, 3891691131 +C: "OO", 3891691131, 3892120949 +C: "OO", 3892120949, 3892728535 +C: "OO", 3892728535, 3893016524 +C: "OO", 3893016524, 3894110030 +C: "OO", 3894110030, 3894375034 +C: "OO", 3894375034, 3895336808 +C: "OO", 3895336808, 3895459741 +C: "OO", 3895459741, 3895805533 +C: "OO", 3895805533, 3895912638 +C: "OO", 3895912638, 3895968003 +C: "OO", 3895968003, 3896524760 +C: "OO", 3896524760, 3897573102 +C: "OO", 3897573102, 3897938696 +C: "OO", 3897938696, 3898231522 +C: "OO", 3898231522, 3898764303 +C: "OO", 3898764303, 3898848659 +C: "OO", 3898848659, 3900041291 +C: "OO", 3900041291, 3900211577 +C: "OO", 3900211577, 3901333086 +C: "OO", 3901333086, 3902035285 +C: "OO", 3902035285, 3902203342 +C: "OO", 3902203342, 3903746891 +C: "OO", 3903746891, 3904010337 +C: "OO", 3904010337, 3904249257 +C: "OO", 3904249257, 3906703918 +C: "OO", 3906703918, 3906911014 +C: "OO", 3906911014, 3909346503 +C: "OO", 3909346503, 3911299699 +C: "OO", 3911299699, 3911448080 +C: "OO", 3911448080, 3911699950 +C: "OO", 3911699950, 3911702195 +C: "OO", 3911702195, 3912300015 +C: "OO", 3912300015, 3912335338 +C: "OO", 3912335338, 3914199316 +C: "OO", 3914199316, 3914436527 +C: "OO", 3914436527, 3915390571 +C: "OO", 3915390571, 3917411825 +C: "OO", 3917411825, 3917629265 +C: "OO", 3917629265, 3918292389 +C: "OO", 3918292389, 3918848302 +C: "OO", 3918848302, 3918946859 +C: "OO", 3918946859, 3920291567 +C: "OO", 3920291567, 3920642175 +C: "OO", 3920642175, 3921417817 +C: "OO", 3921417817, 3921423214 +C: "OO", 3921423214, 3922340031 +C: "OO", 3922340031, 3922855797 +C: "OO", 3922855797, 3924012426 +C: "OO", 3924012426, 3924075042 +C: "OO", 3924075042, 3924751383 +C: "OO", 3924751383, 3925158027 +C: "OO", 3925158027, 3925444306 +C: "OO", 3925444306, 3927120953 +C: "OO", 3927120953, 3927308156 +C: "OO", 3927308156, 3928071446 +C: "OO", 3928071446, 3928323762 +C: "OO", 3928323762, 3929725520 +C: "OO", 3929725520, 3929836519 +C: "OO", 3929836519, 3930460065 +C: "OO", 3930460065, 3930507453 +C: "OO", 3930507453, 3930869763 +C: "OO", 3930869763, 3931253331 +C: "OO", 3931253331, 3931527294 +C: "OO", 3931527294, 3933224673 +C: "OO", 3933224673, 3933710587 +C: "OO", 3933710587, 3934196241 +C: "OO", 3934196241, 3934301209 +C: "OO", 3934301209, 3934546030 +C: "OO", 3934546030, 3935643844 +C: "OO", 3935643844, 3935794819 +C: "OO", 3935794819, 3936049197 +C: "OO", 3936049197, 3936504512 +C: "OO", 3936504512, 3936611622 +C: "OO", 3936611622, 3937150162 +C: "OO", 3937150162, 3937532403 +C: "OO", 3937532403, 3938593506 +C: "OO", 3938593506, 3938747495 +C: "OO", 3938747495, 3939030822 +C: "OO", 3939030822, 3940363939 +C: "OO", 3940363939, 3940549769 +C: "OO", 3940549769, 3940777219 +C: "OO", 3940777219, 3941299811 +C: "OO", 3941299811, 3942033337 +C: "OO", 3942033337, 3942271598 +C: "OO", 3942271598, 3942303566 +C: "OO", 3942303566, 3942593751 +C: "OO", 3942593751, 3942706955 +C: "OO", 3942706955, 3944795731 +C: "OO", 3944795731, 3946689301 +C: "OO", 3946689301, 3947461136 +C: "OO", 3947461136, 3947622337 +C: "OO", 3947622337, 3947835541 +C: "OO", 3947835541, 3948150115 +C: "OO", 3948150115, 3948524876 +C: "OO", 3948524876, 3949363455 +C: "OO", 3949363455, 3949542022 +C: "OO", 3949542022, 3949842169 +C: "OO", 3949842169, 3950065148 +C: "OO", 3950065148, 3950709532 +C: "OO", 3950709532, 3952458426 +C: "OO", 3952458426, 3952611085 +C: "OO", 3952611085, 3952647579 +C: "OO", 3952647579, 3952781732 +C: "OO", 3952781732, 3953084672 +C: "OO", 3953084672, 3954108349 +C: "OO", 3954108349, 3954129825 +C: "OO", 3954129825, 3954181418 +C: "OO", 3954181418, 3954386409 +C: "OO", 3954386409, 3954595591 +C: "OO", 3954595591, 3955366027 +C: "OO", 3955366027, 3955855887 +C: "OO", 3955855887, 3956565690 +C: "OO", 3956565690, 3956900300 +C: "OO", 3956900300, 3957062841 +C: "OO", 3957062841, 3957383300 +C: "OO", 3957383300, 3957728801 +C: "OO", 3957728801, 3958281827 +C: "OO", 3958281827, 3959397815 +C: "OO", 3959397815, 3960527738 +C: "OO", 3960527738, 3960535281 +C: "OO", 3960535281, 3960989473 +C: "OO", 3960989473, 3961178138 +C: "OO", 3961178138, 3961404164 +C: "OO", 3961404164, 3961665525 +C: "OO", 3961665525, 3962443147 +C: "OO", 3962443147, 3962763161 +C: "OO", 3962763161, 3963198179 +C: "OO", 3963198179, 3965577498 +C: "OO", 3965577498, 3965816018 +C: "OO", 3965816018, 3965861397 +C: "OO", 3965861397, 3967432387 +C: "OO", 3967432387, 3967485479 +C: "OO", 3967485479, 3968451474 +C: "OO", 3968451474, 3969052801 +C: "OO", 3969052801, 3969301166 +C: "OO", 3969301166, 3970112811 +C: "OO", 3970112811, 3971601229 +C: "OO", 3971601229, 3971918441 +C: "OO", 3971918441, 3972494710 +C: "OO", 3972494710, 3974952243 +C: "OO", 3974952243, 3975300197 +C: "OO", 3975300197, 3975474537 +C: "OO", 3975474537, 3975564069 +C: "OO", 3975564069, 3975952373 +C: "OO", 3975952373, 3976785502 +C: "OO", 3976785502, 3977193243 +C: "OO", 3977193243, 3977327463 +C: "OO", 3977327463, 3977359118 +C: "OO", 3977359118, 3978050985 +C: "OO", 3978050985, 3978566390 +C: "OO", 3978566390, 3979240171 +C: "OO", 3979240171, 3979261988 +C: "OO", 3979261988, 3980895637 +C: "OO", 3980895637, 3981731642 +C: "OO", 3981731642, 3981822085 +C: "OO", 3981822085, 3982434524 +C: "OO", 3982434524, 3982482742 +C: "OO", 3982482742, 3982735061 +C: "OO", 3982735061, 3983019822 +C: "OO", 3983019822, 3983506916 +C: "OO", 3983506916, 3984598940 +C: "OO", 3984598940, 3985801609 +C: "OO", 3985801609, 3986673150 +C: "OO", 3986673150, 3986720939 +C: "OO", 3986720939, 3987784721 +C: "OO", 3987784721, 3988295253 +C: "OO", 3988295253, 3989424497 +C: "OO", 3989424497, 3990759298 +C: "OO", 3990759298, 3992368151 +C: "OO", 3992368151, 3992608194 +C: "OO", 3992608194, 3994058891 +C: "OO", 3994058891, 3994850039 +C: "OO", 3994850039, 3994929450 +C: "OO", 3994929450, 3996210320 +C: "OO", 3996210320, 3996262006 +C: "OO", 3996262006, 3998571772 +C: "OO", 3998571772, 3999405988 +C: "OO", 3999405988, 3999413297 +C: "OO", 3999413297, 4000317959 +C: "OO", 4000317959, 4000375662 +C: "OO", 4000375662, 4001137444 +C: "OO", 4001137444, 4002345397 +C: "OO", 4002345397, 4003193060 +C: "OO", 4003193060, 4003249832 +C: "OO", 4003249832, 4003880966 +C: "OO", 4003880966, 4005692566 +C: "OO", 4005692566, 4005879008 +C: "OO", 4005879008, 4006981550 +C: "OO", 4006981550, 4007138255 +C: "OO", 4007138255, 4007529423 +C: "OO", 4007529423, 4007889714 +C: "OO", 4007889714, 4008010498 +C: "OO", 4008010498, 4008054081 +C: "OO", 4008054081, 4008306308 +C: "OO", 4008306308, 4008752302 +C: "OO", 4008752302, 4009811437 +C: "OO", 4009811437, 4010169678 +C: "OO", 4010169678, 4010744454 +C: "OO", 4010744454, 4011151508 +C: "OO", 4011151508, 4011760832 +C: "OO", 4011760832, 4012232240 +C: "OO", 4012232240, 4013957953 +C: "OO", 4013957953, 4014014025 +C: "OO", 4014014025, 4014046122 +C: "OO", 4014046122, 4014053559 +C: "OO", 4014053559, 4014608546 +C: "OO", 4014608546, 4016054359 +C: "OO", 4016054359, 4016089763 +C: "OO", 4016089763, 4016604463 +C: "OO", 4016604463, 4017072968 +C: "OO", 4017072968, 4017222477 +C: "OO", 4017222477, 4017313364 +C: "OO", 4017313364, 4017992504 +C: "OO", 4017992504, 4018119854 +C: "OO", 4018119854, 4018259273 +C: "OO", 4018259273, 4018540231 +C: "OO", 4018540231, 4018564218 +C: "OO", 4018564218, 4018782044 +C: "OO", 4018782044, 4019900199 +C: "OO", 4019900199, 4019986049 +C: "OO", 4019986049, 4021588874 +C: "OO", 4021588874, 4022688377 +C: "OO", 4022688377, 4023647987 +C: "OO", 4023647987, 4024614047 +C: "OO", 4024614047, 4025306227 +C: "OO", 4025306227, 4026072298 +C: "OO", 4026072298, 4026273086 +C: "OO", 4026273086, 4026316699 +C: "OO", 4026316699, 4026639994 +C: "OO", 4026639994, 4026868081 +C: "OO", 4026868081, 4028111238 +C: "OO", 4028111238, 4028624572 +C: "OO", 4028624572, 4028760322 +C: "OO", 4028760322, 4028839085 +C: "OO", 4028839085, 4030314545 +C: "OO", 4030314545, 4030398469 +C: "OO", 4030398469, 4031513483 +C: "OO", 4031513483, 4032636597 +C: "OO", 4032636597, 4032689860 +C: "OO", 4032689860, 4033869170 +C: "OO", 4033869170, 4033887306 +C: "OO", 4033887306, 4034472374 +C: "OO", 4034472374, 4035859402 +C: "OO", 4035859402, 4036023749 +C: "OO", 4036023749, 4036099838 +C: "OO", 4036099838, 4036662794 +C: "OO", 4036662794, 4037069037 +C: "OO", 4037069037, 4037773678 +C: "OO", 4037773678, 4038354873 +C: "OO", 4038354873, 4039705436 +C: "OO", 4039705436, 4040543693 +C: "OO", 4040543693, 4040558348 +C: "OO", 4040558348, 4041054847 +C: "OO", 4041054847, 4041151643 +C: "OO", 4041151643, 4041729646 +C: "OO", 4041729646, 4041900508 +C: "OO", 4041900508, 4042116850 +C: "OO", 4042116850, 4042427589 +C: "OO", 4042427589, 4042510340 +C: "OO", 4042510340, 4042530855 +C: "OO", 4042530855, 4042531285 +C: "OO", 4042531285, 4042896098 +C: "OO", 4042896098, 4044061407 +C: "OO", 4044061407, 4044522305 +C: "OO", 4044522305, 4046568836 +C: "OO", 4046568836, 4046856627 +C: "OO", 4046856627, 4047112218 +C: "OO", 4047112218, 4047802856 +C: "OO", 4047802856, 4047991337 +C: "OO", 4047991337, 4048343382 +C: "OO", 4048343382, 4048494713 +C: "OO", 4048494713, 4050702938 +C: "OO", 4050702938, 4051639319 +C: "OO", 4051639319, 4051923820 +C: "OO", 4051923820, 4052137446 +C: "OO", 4052137446, 4052192301 +C: "OO", 4052192301, 4053406997 +C: "OO", 4053406997, 4054711758 +C: "OO", 4054711758, 4055235989 +C: "OO", 4055235989, 4055606217 +C: "OO", 4055606217, 4055633455 +C: "OO", 4055633455, 4057465861 +C: "OO", 4057465861, 4058187321 +C: "OO", 4058187321, 4058283821 +C: "OO", 4058283821, 4058351465 +C: "OO", 4058351465, 4059335259 +C: "OO", 4059335259, 4060102433 +C: "OO", 4060102433, 4061090458 +C: "OO", 4061090458, 4061813827 +C: "OO", 4061813827, 4063859681 +C: "OO", 4063859681, 4064374515 +C: "OO", 4064374515, 4064666461 +C: "OO", 4064666461, 4064727195 +C: "OO", 4064727195, 4065686890 +C: "OO", 4065686890, 4065915958 +C: "OO", 4065915958, 4066597095 +C: "OO", 4066597095, 4067035282 +C: "OO", 4067035282, 4067387030 +C: "OO", 4067387030, 4068820778 +C: "OO", 4068820778, 4069389195 +C: "OO", 4069389195, 4069407943 +C: "OO", 4069407943, 4069739397 +C: "OO", 4069739397, 4069835984 +C: "OO", 4069835984, 4070503891 +C: "OO", 4070503891, 4071033886 +C: "OO", 4071033886, 4071376057 +C: "OO", 4071376057, 4071753582 +C: "OO", 4071753582, 4071786236 +C: "OO", 4071786236, 4072122785 +C: "OO", 4072122785, 4072293543 +C: "OO", 4072293543, 4072383478 +C: "OO", 4072383478, 4072895870 +C: "OO", 4072895870, 4073185522 +C: "OO", 4073185522, 4073304003 +C: "OO", 4073304003, 4073342861 +C: "OO", 4073342861, 4073694410 +C: "OO", 4073694410, 4074167300 +C: "OO", 4074167300, 4075363166 +C: "OO", 4075363166, 4075639868 +C: "OO", 4075639868, 4075654529 +C: "OO", 4075654529, 4076495849 +C: "OO", 4076495849, 4077350746 +C: "OO", 4077350746, 4077381083 +C: "OO", 4077381083, 4079048786 +C: "OO", 4079048786, 4079207936 +C: "OO", 4079207936, 4080420851 +C: "OO", 4080420851, 4081228310 +C: "OO", 4081228310, 4081648547 +C: "OO", 4081648547, 4083060423 +C: "OO", 4083060423, 4083907186 +C: "OO", 4083907186, 4083937113 +C: "OO", 4083937113, 4084567681 +C: "OO", 4084567681, 4086700483 +C: "OO", 4086700483, 4086769566 +C: "OO", 4086769566, 4087631650 +C: "OO", 4087631650, 4089867177 +C: "OO", 4089867177, 4092440151 +C: "OO", 4092440151, 4092571489 +C: "OO", 4092571489, 4093323263 +C: "OO", 4093323263, 4093929938 +C: "OO", 4093929938, 4095284785 +C: "OO", 4095284785, 4095842394 +C: "OO", 4095842394, 4097431610 +C: "OO", 4097431610, 4097441597 +C: "OO", 4097441597, 4098422372 +C: "OO", 4098422372, 4098794963 +C: "OO", 4098794963, 4098877067 +C: "OO", 4098877067, 4099046518 +C: "OO", 4099046518, 4099572077 +C: "OO", 4099572077, 4100016031 +C: "OO", 4100016031, 4100192818 +C: "OO", 4100192818, 4100580368 +C: "OO", 4100580368, 4101167183 +C: "OO", 4101167183, 4102598489 +C: "OO", 4102598489, 4102871216 +C: "OO", 4102871216, 4103461628 +C: "OO", 4103461628, 4104592647 +C: "OO", 4104592647, 4105433246 +C: "OO", 4105433246, 4106032099 +C: "OO", 4106032099, 4106895866 +C: "OO", 4106895866, 4107020609 +C: "OO", 4107020609, 4108014449 +C: "OO", 4108014449, 4108236134 +C: "OO", 4108236134, 4108461261 +C: "OO", 4108461261, 4109173169 +C: "OO", 4109173169, 4109724574 +C: "OO", 4109724574, 4110068972 +C: "OO", 4110068972, 4110284901 +C: "OO", 4110284901, 4111050379 +C: "OO", 4111050379, 4111236896 +C: "OO", 4111236896, 4111507060 +C: "OO", 4111507060, 4112330291 +C: "OO", 4112330291, 4114425536 +C: "OO", 4114425536, 4114927555 +C: "OO", 4114927555, 4115637837 +C: "OO", 4115637837, 4115809639 +C: "OO", 4115809639, 4117342479 +C: "OO", 4117342479, 4117457122 +C: "OO", 4117457122, 4117836041 +C: "OO", 4117836041, 4117890946 +C: "OO", 4117890946, 4117949198 +C: "OO", 4117949198, 4118244115 +C: "OO", 4118244115, 4118432906 +C: "OO", 4118432906, 4118623939 +C: "OO", 4118623939, 4119487279 +C: "OO", 4119487279, 4119613083 +C: "OO", 4119613083, 4119933011 +C: "OO", 4119933011, 4120594868 +C: "OO", 4120594868, 4120929826 +C: "OO", 4120929826, 4121373481 +C: "OO", 4121373481, 4121817426 +C: "OO", 4121817426, 4122961790 +C: "OO", 4122961790, 4123030619 +C: "OO", 4123030619, 4123243605 +C: "OO", 4123243605, 4123893289 +C: "OO", 4123893289, 4123925528 +C: "OO", 4123925528, 4124318221 +C: "OO", 4124318221, 4125039812 +C: "OO", 4125039812, 4125283198 +C: "OO", 4125283198, 4126069373 +C: "OO", 4126069373, 4126651739 +C: "OO", 4126651739, 4126899777 +C: "OO", 4126899777, 4126966798 +C: "OO", 4126966798, 4127850805 +C: "OO", 4127850805, 4127890201 +C: "OO", 4127890201, 4128693450 +C: "OO", 4128693450, 4130718526 +C: "OO", 4130718526, 4131291911 +C: "OO", 4131291911, 4131907147 +C: "OO", 4131907147, 4131988112 +C: "OO", 4131988112, 4132087919 +C: "OO", 4132087919, 4132620989 +C: "OO", 4132620989, 4132765422 +C: "OO", 4132765422, 4132895231 +C: "OO", 4132895231, 4133004309 +C: "OO", 4133004309, 4133345001 +C: "OO", 4133345001, 4133543303 +C: "OO", 4133543303, 4133863110 +C: "OO", 4133863110, 4134017603 +C: "OO", 4134017603, 4135635533 +C: "OO", 4135635533, 4136188461 +C: "OO", 4136188461, 4137348630 +C: "OO", 4137348630, 4138208504 +C: "OO", 4138208504, 4138761694 +C: "OO", 4138761694, 4139248254 +C: "OO", 4139248254, 4139565584 +C: "OO", 4139565584, 4139643028 +C: "OO", 4139643028, 4139968077 +C: "OO", 4139968077, 4140203397 +C: "OO", 4140203397, 4140962597 +C: "OO", 4140962597, 4141591396 +C: "OO", 4141591396, 4142156949 +C: "OO", 4142156949, 4142436531 +C: "OO", 4142436531, 4143541099 +C: "OO", 4143541099, 4143917804 +C: "OO", 4143917804, 4144507618 +C: "OO", 4144507618, 4145922925 +C: "OO", 4145922925, 4146006730 +C: "OO", 4146006730, 4146348800 +C: "OO", 4146348800, 4146587591 +C: "OO", 4146587591, 4147277419 +C: "OO", 4147277419, 4147861699 +C: "OO", 4147861699, 4147877445 +C: "OO", 4147877445, 4148120331 +C: "OO", 4148120331, 4148570949 +C: "OO", 4148570949, 4148700577 +C: "OO", 4148700577, 4148780351 +C: "OO", 4148780351, 4150199030 +C: "OO", 4150199030, 4150623406 +C: "OO", 4150623406, 4152149500 +C: "OO", 4152149500, 4152342903 +C: "OO", 4152342903, 4152701302 +C: "OO", 4152701302, 4152706333 +C: "OO", 4152706333, 4153703356 +C: "OO", 4153703356, 4154519301 +C: "OO", 4154519301, 4155014821 +C: "OO", 4155014821, 4155364379 +C: "OO", 4155364379, 4156154105 +C: "OO", 4156154105, 4156976257 +C: "OO", 4156976257, 4157260292 +C: "OO", 4157260292, 4159261215 +C: "OO", 4159261215, 4159898275 +C: "OO", 4159898275, 4161477897 +C: "OO", 4161477897, 4161830845 +C: "OO", 4161830845, 4162266234 +C: "OO", 4162266234, 4163543023 +C: "OO", 4163543023, 4164250798 +C: "OO", 4164250798, 4164441418 +C: "OO", 4164441418, 4164508727 +C: "OO", 4164508727, 4164645842 +C: "OO", 4164645842, 4164899439 +C: "OO", 4164899439, 4164911669 +C: "OO", 4164911669, 4165283911 +C: "OO", 4165283911, 4167535381 +C: "OO", 4167535381, 4168775600 +C: "OO", 4168775600, 4169038882 +C: "OO", 4169038882, 4169455196 +C: "OO", 4169455196, 4172126060 +C: "OO", 4172126060, 4172215585 +C: "OO", 4172215585, 4173741961 +C: "OO", 4173741961, 4173851259 +C: "OO", 4173851259, 4174929050 +C: "OO", 4174929050, 4175125366 +C: "OO", 4175125366, 4175560685 +C: "OO", 4175560685, 4175712683 +C: "OO", 4175712683, 4175796270 +C: "OO", 4175796270, 4176316963 +C: "OO", 4176316963, 4176371211 +C: "OO", 4176371211, 4176383717 +C: "OO", 4176383717, 4176561931 +C: "OO", 4176561931, 4177116479 +C: "OO", 4177116479, 4177643478 +C: "OO", 4177643478, 4177857833 +C: "OO", 4177857833, 4177859066 +C: "OO", 4177859066, 4178038350 +C: "OO", 4178038350, 4178453425 +C: "OO", 4178453425, 4179207779 +C: "OO", 4179207779, 4179275102 +C: "OO", 4179275102, 4179955844 +C: "OO", 4179955844, 4180595690 +C: "OO", 4180595690, 4181039043 +C: "OO", 4181039043, 4181219709 +C: "OO", 4181219709, 4181284259 +C: "OO", 4181284259, 4181769227 +C: "OO", 4181769227, 4181958114 +C: "OO", 4181958114, 4181995206 +C: "OO", 4181995206, 4182285923 +C: "OO", 4182285923, 4182316075 +C: "OO", 4182316075, 4182330537 +C: "OO", 4182330537, 4182667350 +C: "OO", 4182667350, 4182879777 +C: "OO", 4182879777, 4183027981 +C: "OO", 4183027981, 4183207519 +C: "OO", 4183207519, 4183676337 +C: "OO", 4183676337, 4184217608 +C: "OO", 4184217608, 4184487219 +C: "OO", 4184487219, 4184716586 +C: "OO", 4184716586, 4185342281 +C: "OO", 4185342281, 4185371221 +C: "OO", 4185371221, 4185904787 +C: "OO", 4185904787, 4187356106 +C: "OO", 4187356106, 4188281257 +C: "OO", 4188281257, 4188288811 +C: "OO", 4188288811, 4189342714 +C: "OO", 4189342714, 4190841745 +C: "OO", 4190841745, 4191848058 +C: "OO", 4191848058, 4192171658 +C: "OO", 4192171658, 4192488992 +C: "OO", 4192488992, 4192842778 +C: "OO", 4192842778, 4192851913 +C: "OO", 4192851913, 4193458996 +C: "OO", 4193458996, 4196170829 +C: "OO", 4196170829, 4196350654 +C: "OO", 4196350654, 4196354417 +C: "OO", 4196354417, 4196404703 +C: "OO", 4196404703, 4196696912 +C: "OO", 4196696912, 4197459446 +C: "OO", 4197459446, 4198223802 +C: "OO", 4198223802, 4200615414 +C: "OO", 4200615414, 4200804527 +C: "OO", 4200804527, 4201223899 +C: "OO", 4201223899, 4201280506 +C: "OO", 4201280506, 4201497687 +C: "OO", 4201497687, 4201534633 +C: "OO", 4201534633, 4202206052 +C: "OO", 4202206052, 4202302507 +C: "OO", 4202302507, 4203691137 +C: "OO", 4203691137, 4203921618 +C: "OO", 4203921618, 4204219019 +C: "OO", 4204219019, 4204574180 +C: "OO", 4204574180, 4205117465 +C: "OO", 4205117465, 4206890355 +C: "OO", 4206890355, 4207257865 +C: "OO", 4207257865, 4207633493 +C: "OO", 4207633493, 4207885282 +C: "OO", 4207885282, 4208099122 +C: "OO", 4208099122, 4208439892 +C: "OO", 4208439892, 4208889321 +C: "OO", 4208889321, 4209241290 +C: "OO", 4209241290, 4209363190 +C: "OO", 4209363190, 4211851051 +C: "OO", 4211851051, 4213378664 +C: "OO", 4213378664, 4213478981 +C: "OO", 4213478981, 4214334069 +C: "OO", 4214334069, 4215108687 +C: "OO", 4215108687, 4215292081 +C: "OO", 4215292081, 4215463822 +C: "OO", 4215463822, 4216596241 +C: "OO", 4216596241, 4218209303 +C: "OO", 4218209303, 4219651621 +C: "OO", 4219651621, 4219784913 +C: "OO", 4219784913, 4220914829 +C: "OO", 4220914829, 4221584111 +C: "OO", 4221584111, 4222602917 +C: "OO", 4222602917, 4222798755 +C: "OO", 4222798755, 4223110734 +C: "OO", 4223110734, 4224334078 +C: "OO", 4224334078, 4224690261 +C: "OO", 4224690261, 4225515735 +C: "OO", 4225515735, 4226389966 +C: "OO", 4226389966, 4227032335 +C: "OO", 4227032335, 4228003389 +C: "OO", 4228003389, 4228522184 +C: "OO", 4228522184, 4228758210 +C: "OO", 4228758210, 4229403054 +C: "OO", 4229403054, 4230242930 +C: "OO", 4230242930, 4230354848 +C: "OO", 4230354848, 4230772723 +C: "OO", 4230772723, 4231359953 +C: "OO", 4231359953, 4231673461 +C: "OO", 4231673461, 4231871309 +C: "OO", 4231871309, 4232192914 +C: "OO", 4232192914, 4232792627 +C: "OO", 4232792627, 4232962499 +C: "OO", 4232962499, 4233303610 +C: "OO", 4233303610, 4233316062 +C: "OO", 4233316062, 4233554404 +C: "OO", 4233554404, 4234279653 +C: "OO", 4234279653, 4234639930 +C: "OO", 4234639930, 4234871046 +C: "OO", 4234871046, 4235320687 +C: "OO", 4235320687, 4235359479 +C: "OO", 4235359479, 4235539125 +C: "OO", 4235539125, 4235554322 +C: "OO", 4235554322, 4236077787 +C: "OO", 4236077787, 4236674735 +C: "OO", 4236674735, 4236715238 +C: "OO", 4236715238, 4236867759 +C: "OO", 4236867759, 4237401803 +C: "OO", 4237401803, 4238558339 +C: "OO", 4238558339, 4239540489 +C: "OO", 4239540489, 4239549009 +C: "OO", 4239549009, 4239973257 +C: "OO", 4239973257, 4240000046 +C: "OO", 4240000046, 4240683941 +C: "OO", 4240683941, 4241304111 +C: "OO", 4241304111, 4241775356 +C: "OO", 4241775356, 4241869351 +C: "OO", 4241869351, 4242918301 +C: "OO", 4242918301, 4243378194 +C: "OO", 4243378194, 4244556797 +C: "OO", 4244556797, 4244668297 +C: "OO", 4244668297, 4244829173 +C: "OO", 4244829173, 4245449166 +C: "OO", 4245449166, 4247242655 +C: "OO", 4247242655, 4247509714 +C: "OO", 4247509714, 4247980262 +C: "OO", 4247980262, 4248108935 +C: "OO", 4248108935, 4248918294 +C: "OO", 4248918294, 4249419178 +C: "OO", 4249419178, 4249528060 +C: "OO", 4249528060, 4250479083 +C: "OO", 4250479083, 4251130458 +C: "OO", 4251130458, 4251163413 +C: "OO", 4251163413, 4251448588 +C: "OO", 4251448588, 4252119230 +C: "OO", 4252119230, 4252849317 +C: "OO", 4252849317, 4253380162 +C: "OO", 4253380162, 4253682716 +C: "OO", 4253682716, 4253973181 +C: "OO", 4253973181, 4255272764 +C: "OO", 4255272764, 4255305914 +C: "OO", 4255305914, 4255715123 +C: "OO", 4255715123, 4256099561 +C: "OO", 4256099561, 4257061265 +C: "OO", 4257061265, 4257574143 +C: "OO", 4257574143, 4258028911 +C: "OO", 4258028911, 4258100793 +C: "OO", 4258100793, 4258622775 +C: "OO", 4258622775, 4258708118 +C: "OO", 4258708118, 4258759447 +C: "OO", 4258759447, 4258922238 +C: "OO", 4258922238, 4259723867 +C: "OO", 4259723867, 4259996643 +C: "OO", 4259996643, 4260236386 +C: "OO", 4260236386, 4260662249 +C: "OO", 4260662249, 4261518153 +C: "OO", 4261518153, 4261625326 +C: "OO", 4261625326, 4262684953 +C: "OO", 4262684953, 4262758915 +C: "OO", 4262758915, 4263284010 +C: "OO", 4263284010, 4263359404 +C: "OO", 4263359404, 4264526745 +C: "OO", 4264526745, 4264880978 +C: "OO", 4264880978, 4265045687 +C: "OO", 4265045687, 4265850822 +C: "OO", 4265850822, 4265987727 +C: "OO", 4265987727, 4266120068 +C: "OO", 4266120068, 4266861581 +C: "OO", 4266861581, 4267229889 +C: "OO", 4267229889, 4267349089 +C: "OO", 4267349089, 4268540399 +C: "OO", 4268540399, 4268570761 +C: "OO", 4268570761, 4269739467 +C: "OO", 4269739467, 4270421264 +C: "OO", 4270421264, 4271805705 +C: "OO", 4271805705, 4271845353 +C: "OO", 4271845353, 4272424905 +C: "OO", 4272424905, 4272621581 +C: "OO", 4272621581, 4274063615 +C: "OO", 4274063615, 4274392942 +C: "OO", 4274392942, 4275304569 +C: "OO", 4275304569, 4275699401 +C: "OO", 4275699401, 4276024690 +C: "OO", 4276024690, 4277063471 +C: "OO", 4277063471, 4277372850 +C: "OO", 4277372850, 4277491838 +C: "OO", 4277491838, 4277862566 +C: "OO", 4277862566, 4278347385 +C: "OO", 4278347385, 4280117378 +C: "OO", 4280117378, 4281166878 +C: "OO", 4281166878, 4282170590 +C: "OO", 4282170590, 4282617251 +C: "OO", 4282617251, 4282815428 +C: "OO", 4282815428, 4284386216 +C: "OO", 4284386216, 4285657483 +C: "OO", 4285657483, 4285821608 +C: "OO", 4285821608, 4287175778 +C: "OO", 4287175778, 4287839432 +C: "OO", 4287839432, 4288074925 +C: "OO", 4288074925, 4288732509 +C: "OO", 4288732509, 4289161727 +C: "OO", 4289161727, 4289168186 +C: "OO", 4289168186, 4289433815 +C: "OO", 4289433815, 4289764161 +C: "OO", 4289764161, 4291167691 +C: "OO", 4291167691, 4291873700 +C: "OO", 4291873700, 4291925121 +C: "OO", 4291925121, 4292425702 +C: "OO", 4292425702, 4292694611 +C: "OO", 4292694611, 4292699561 +C: "OO", 4292699561, 4292899699 +C: "OO", 4292899699, 4294142894 +C: "OO", 4294142894, 4294535794 +C: "OO", 4294535794, 4294572538 +C: "OO", 4294572538, 4295587762 +C: "OO", 4295587762, 4296751060 +C: "OO", 4296751060, 4297159415 +C: "OO", 4297159415, 4297198341 +C: "OO", 4297198341, 4297374821 +C: "OO", 4297374821, 4297755077 +C: "OO", 4297755077, 4300479122 +C: "OO", 4300479122, 4301549830 +C: "OO", 4301549830, 4301774554 +C: "OO", 4301774554, 4302077878 +C: "OO", 4302077878, 4302533733 +C: "OO", 4302533733, 4302888067 +C: "OO", 4302888067, 4304079793 +C: "OO", 4304079793, 4304563108 +C: "OO", 4304563108, 4304793115 +C: "OO", 4304793115, 4305150617 +C: "OO", 4305150617, 4305199571 +C: "OO", 4305199571, 4307623406 +C: "OO", 4307623406, 4307721752 +C: "OO", 4307721752, 4308776877 +C: "OO", 4308776877, 4308899407 +C: "OO", 4308899407, 4308985036 +C: "OO", 4308985036, 4309159123 +C: "OO", 4309159123, 4309285541 +C: "OO", 4309285541, 4309354463 +C: "OO", 4309354463, 4311950039 +C: "OO", 4311950039, 4312358634 +C: "OO", 4312358634, 4312720175 +C: "OO", 4312720175, 4313157026 +C: "OO", 4313157026, 4313199574 +C: "OO", 4313199574, 4313966569 +C: "OO", 4313966569, 4313988925 +C: "OO", 4313988925, 4314646362 +C: "OO", 4314646362, 4315309314 +C: "OO", 4315309314, 4315760634 +C: "OO", 4315760634, 4316324570 +C: "OO", 4316324570, 4317025544 +C: "OO", 4317025544, 4317169145 +C: "OO", 4317169145, 4317215548 +C: "OO", 4317215548, 4317395684 +C: "OO", 4317395684, 4317560719 +C: "OO", 4317560719, 4318339057 +C: "OO", 4318339057, 4319052677 +C: "OO", 4319052677, 4320783022 +C: "OO", 4320783022, 4321326366 +C: "OO", 4321326366, 4325640116 +C: "OO", 4325640116, 4326742945 +C: "OO", 4326742945, 4326833470 +C: "OO", 4326833470, 4327047994 +C: "OO", 4327047994, 4327081814 +C: "OO", 4327081814, 4327615727 +C: "OO", 4327615727, 4328108315 +C: "OO", 4328108315, 4328243735 +C: "OO", 4328243735, 4328452238 +C: "OO", 4328452238, 4328760316 +C: "OO", 4328760316, 4328959469 +C: "OO", 4328959469, 4329943454 +C: "OO", 4329943454, 4330454730 +C: "OO", 4330454730, 4330994034 +C: "OO", 4330994034, 4331219626 +C: "OO", 4331219626, 4331385070 +C: "OO", 4331385070, 4332187303 +C: "OO", 4332187303, 4332656287 +C: "OO", 4332656287, 4332875865 +C: "OO", 4332875865, 4335382049 +C: "OO", 4335382049, 4335808682 +C: "OO", 4335808682, 4335950908 +C: "OO", 4335950908, 4336536137 +C: "OO", 4336536137, 4337824215 +C: "OO", 4337824215, 4338119494 +C: "OO", 4338119494, 4339906037 +C: "OO", 4339906037, 4340759515 +C: "OO", 4340759515, 4341014138 +C: "OO", 4341014138, 4341369534 +C: "OO", 4341369534, 4341418574 +C: "OO", 4341418574, 4342164887 +C: "OO", 4342164887, 4342577019 +C: "OO", 4342577019, 4343412488 +C: "OO", 4343412488, 4344140481 +C: "OO", 4344140481, 4344644259 +C: "OO", 4344644259, 4344660207 +C: "OO", 4344660207, 4345374447 +C: "OO", 4345374447, 4345629374 +C: "OO", 4345629374, 4346154604 +C: "OO", 4346154604, 4346263642 +C: "OO", 4346263642, 4347408860 +C: "OO", 4347408860, 4347654860 +C: "OO", 4347654860, 4348534777 +C: "OO", 4348534777, 4348892514 +C: "OO", 4348892514, 4348977935 +C: "OO", 4348977935, 4349010025 +C: "OO", 4349010025, 4349372229 +C: "OO", 4349372229, 4350007337 +C: "OO", 4350007337, 4350267282 +C: "OO", 4350267282, 4350510100 +C: "OO", 4350510100, 4351138505 +C: "OO", 4351138505, 4351284221 +C: "OO", 4351284221, 4351753887 +C: "OO", 4351753887, 4352596389 +C: "OO", 4352596389, 4352684241 +C: "OO", 4352684241, 4352768491 +C: "OO", 4352768491, 4353102429 +C: "OO", 4353102429, 4353584622 +C: "OO", 4353584622, 4353657182 +C: "OO", 4353657182, 4354136456 +C: "OO", 4354136456, 4354482677 +C: "OO", 4354482677, 4354484362 +C: "OO", 4354484362, 4355243406 +C: "OO", 4355243406, 4355819521 +C: "OO", 4355819521, 4355962767 +C: "OO", 4355962767, 4356013551 +C: "OO", 4356013551, 4356517431 +C: "OO", 4356517431, 4357541068 +C: "OO", 4357541068, 4357966543 +C: "OO", 4357966543, 4358573150 +C: "OO", 4358573150, 4359366770 +C: "OO", 4359366770, 4359644022 +C: "OO", 4359644022, 4361032050 +C: "OO", 4361032050, 4361848733 +C: "OO", 4361848733, 4362254691 +C: "OO", 4362254691, 4362317658 +C: "OO", 4362317658, 4362466963 +C: "OO", 4362466963, 4363182397 +C: "OO", 4363182397, 4363480942 +C: "OO", 4363480942, 4363584710 +C: "OO", 4363584710, 4364193947 +C: "OO", 4364193947, 4364691866 +C: "OO", 4364691866, 4366071739 +C: "OO", 4366071739, 4366414205 +C: "OO", 4366414205, 4366492796 +C: "OO", 4366492796, 4369229822 +C: "OO", 4369229822, 4369493804 +C: "OO", 4369493804, 4369725796 +C: "OO", 4369725796, 4370997778 +C: "OO", 4370997778, 4371291174 +C: "OO", 4371291174, 4371591746 +C: "OO", 4371591746, 4372043533 +C: "OO", 4372043533, 4372469945 +C: "OO", 4372469945, 4372558828 +C: "OO", 4372558828, 4372833294 +C: "OO", 4372833294, 4374907876 +C: "OO", 4374907876, 4374969414 +C: "OO", 4374969414, 4375628486 +C: "OO", 4375628486, 4376819669 +C: "OO", 4376819669, 4377856567 +C: "OO", 4377856567, 4377941141 +C: "OO", 4377941141, 4379681267 +C: "OO", 4379681267, 4380413005 +C: "OO", 4380413005, 4380794569 +C: "OO", 4380794569, 4380985724 +C: "OO", 4380985724, 4381799583 +C: "OO", 4381799583, 4381986242 +C: "OO", 4381986242, 4382633167 +C: "OO", 4382633167, 4383127785 +C: "OO", 4383127785, 4384204004 +C: "OO", 4384204004, 4384267420 +C: "OO", 4384267420, 4385485581 +C: "OO", 4385485581, 4385544623 +C: "OO", 4385544623, 4385571209 +C: "OO", 4385571209, 4385719553 +C: "OO", 4385719553, 4386210911 +C: "OO", 4386210911, 4386554521 +C: "OO", 4386554521, 4386960850 +C: "OO", 4386960850, 4387070816 +C: "OO", 4387070816, 4387112470 +C: "OO", 4387112470, 4387221366 +C: "OO", 4387221366, 4389194022 +C: "OO", 4389194022, 4389769611 +C: "OO", 4389769611, 4389947098 +C: "OO", 4389947098, 4390114177 +C: "OO", 4390114177, 4390562338 +C: "OO", 4390562338, 4391157686 +C: "OO", 4391157686, 4392035110 +C: "OO", 4392035110, 4392399775 +C: "OO", 4392399775, 4392475926 +C: "OO", 4392475926, 4393126977 +C: "OO", 4393126977, 4393965485 +C: "OO", 4393965485, 4395360572 +C: "OO", 4395360572, 4396066905 +C: "OO", 4396066905, 4396171159 +C: "OO", 4396171159, 4396966258 +C: "OO", 4396966258, 4396984697 +C: "OO", 4396984697, 4397563414 +C: "OO", 4397563414, 4398190642 +C: "OO", 4398190642, 4398483500 +C: "OO", 4398483500, 4398710468 +C: "OO", 4398710468, 4399625603 +C: "OO", 4399625603, 4399706684 +C: "OO", 4399706684, 4400650112 +C: "OO", 4400650112, 4402043502 +C: "OO", 4402043502, 4402301803 +C: "OO", 4402301803, 4402687828 +C: "OO", 4402687828, 4403070279 +C: "OO", 4403070279, 4403734317 +C: "OO", 4403734317, 4404727883 +C: "OO", 4404727883, 4404740177 +C: "OO", 4404740177, 4405512340 +C: "OO", 4405512340, 4406059583 +C: "OO", 4406059583, 4406282373 +C: "OO", 4406282373, 4406514409 +C: "OO", 4406514409, 4407031715 +C: "OO", 4407031715, 4407267263 +C: "OO", 4407267263, 4409538315 +C: "OO", 4409538315, 4409802620 +C: "OO", 4409802620, 4411497135 +C: "OO", 4411497135, 4412340044 +C: "OO", 4412340044, 4412504847 +C: "OO", 4412504847, 4412773573 +C: "OO", 4412773573, 4413363641 +C: "OO", 4413363641, 4414028643 +C: "OO", 4414028643, 4414488007 +C: "OO", 4414488007, 4414603182 +C: "OO", 4414603182, 4414913395 +C: "OO", 4414913395, 4415298083 +C: "OO", 4415298083, 4415346314 +C: "OO", 4415346314, 4416377593 +C: "OO", 4416377593, 4417508653 +C: "OO", 4417508653, 4417899146 +C: "OO", 4417899146, 4418268510 +C: "OO", 4418268510, 4418712781 +C: "OO", 4418712781, 4418741075 +C: "OO", 4418741075, 4419708901 +C: "OO", 4419708901, 4421777661 +C: "OO", 4421777661, 4422356519 +C: "OO", 4422356519, 4422724693 +C: "OO", 4422724693, 4425363061 +C: "OO", 4425363061, 4425594606 +C: "OO", 4425594606, 4426562211 +C: "OO", 4426562211, 4429560406 +C: "OO", 4429560406, 4429618290 +C: "OO", 4429618290, 4429905629 +C: "OO", 4429905629, 4430172571 +C: "OO", 4430172571, 4430313414 +C: "OO", 4430313414, 4430476525 +C: "OO", 4430476525, 4431481039 +C: "OO", 4431481039, 4431772230 +C: "OO", 4431772230, 4431790837 +C: "OO", 4431790837, 4432489146 +C: "OO", 4432489146, 4433633212 +C: "OO", 4433633212, 4433633809 +C: "OO", 4433633809, 4433686187 +C: "OO", 4433686187, 4433924391 +C: "OO", 4433924391, 4434261069 +C: "OO", 4434261069, 4434507752 +C: "OO", 4434507752, 4434584223 +C: "OO", 4434584223, 4435902445 +C: "OO", 4435902445, 4436340987 +C: "OO", 4436340987, 4439987444 +C: "OO", 4439987444, 4440286535 +C: "OO", 4440286535, 4440301461 +C: "OO", 4440301461, 4442037077 +C: "OO", 4442037077, 4442151867 +C: "OO", 4442151867, 4443766150 +C: "OO", 4443766150, 4444050966 +C: "OO", 4444050966, 4444611078 +C: "OO", 4444611078, 4444649908 +C: "OO", 4444649908, 4444673827 +C: "OO", 4444673827, 4447103399 +C: "OO", 4447103399, 4447199745 +C: "OO", 4447199745, 4447344467 +C: "OO", 4447344467, 4447646867 +C: "OO", 4447646867, 4447722534 +C: "OO", 4447722534, 4448668543 +C: "OO", 4448668543, 4449174066 +C: "OO", 4449174066, 4449746155 +C: "OO", 4449746155, 4450028317 +C: "OO", 4450028317, 4450371125 +C: "OO", 4450371125, 4451065986 +C: "OO", 4451065986, 4451713076 +C: "OO", 4451713076, 4452186990 +C: "OO", 4452186990, 4452411727 +C: "OO", 4452411727, 4452572620 +C: "OO", 4452572620, 4452620771 +C: "OO", 4452620771, 4452871570 +C: "OO", 4452871570, 4452892875 +C: "OO", 4452892875, 4454260963 +C: "OO", 4454260963, 4454618618 +C: "OO", 4454618618, 4454894931 +C: "OO", 4454894931, 4454932871 +C: "OO", 4454932871, 4455025085 +C: "OO", 4455025085, 4455541107 +C: "OO", 4455541107, 4455607558 +C: "OO", 4455607558, 4455652711 +C: "OO", 4455652711, 4456078065 +C: "OO", 4456078065, 4456511668 +C: "OO", 4456511668, 4456583212 +C: "OO", 4456583212, 4457935543 +C: "OO", 4457935543, 4459571215 +C: "OO", 4459571215, 4459614525 +C: "OO", 4459614525, 4459762832 +C: "OO", 4459762832, 4459802810 +C: "OO", 4459802810, 4460433632 +C: "OO", 4460433632, 4460665138 +C: "OO", 4460665138, 4461250285 +C: "OO", 4461250285, 4461698051 +C: "OO", 4461698051, 4461750197 +C: "OO", 4461750197, 4462973229 +C: "OO", 4462973229, 4462974235 +C: "OO", 4462974235, 4463153233 +C: "OO", 4463153233, 4463817354 +C: "OO", 4463817354, 4464135754 +C: "OO", 4464135754, 4465134949 +C: "OO", 4465134949, 4465184478 +C: "OO", 4465184478, 4465275733 +C: "OO", 4465275733, 4465561675 +C: "OO", 4465561675, 4465835498 +C: "OO", 4465835498, 4466832601 +C: "OO", 4466832601, 4467101137 +C: "OO", 4467101137, 4467393052 +C: "OO", 4467393052, 4467441329 +C: "OO", 4467441329, 4467609011 +C: "OO", 4467609011, 4467693694 +C: "OO", 4467693694, 4468201599 +C: "OO", 4468201599, 4468563767 +C: "OO", 4468563767, 4468995942 +C: "OO", 4468995942, 4469810498 +C: "OO", 4469810498, 4470305297 +C: "OO", 4470305297, 4470582418 +C: "OO", 4470582418, 4471135359 +C: "OO", 4471135359, 4471309367 +C: "OO", 4471309367, 4472205391 +C: "OO", 4472205391, 4472792215 +C: "OO", 4472792215, 4472876191 +C: "OO", 4472876191, 4473544218 +C: "OO", 4473544218, 4474036754 +C: "OO", 4474036754, 4474405850 +C: "OO", 4474405850, 4474486195 +C: "OO", 4474486195, 4475079776 +C: "OO", 4475079776, 4475346161 +C: "OO", 4475346161, 4475484315 +C: "OO", 4475484315, 4475610830 +C: "OO", 4475610830, 4476031331 +C: "OO", 4476031331, 4477495497 +C: "OO", 4477495497, 4477564563 +C: "OO", 4477564563, 4479743240 +C: "OO", 4479743240, 4479799702 +C: "OO", 4479799702, 4480764775 +C: "OO", 4480764775, 4480794253 +C: "OO", 4480794253, 4482250799 +C: "OO", 4482250799, 4482279754 +C: "OO", 4482279754, 4482544674 +C: "OO", 4482544674, 4483384691 +C: "OO", 4483384691, 4483634941 +C: "OO", 4483634941, 4483743626 +C: "OO", 4483743626, 4485799315 +C: "OO", 4485799315, 4485893106 +C: "OO", 4485893106, 4486502801 +C: "OO", 4486502801, 4486812898 +C: "OO", 4486812898, 4486865742 +C: "OO", 4486865742, 4486889777 +C: "OO", 4486889777, 4488178940 +C: "OO", 4488178940, 4488193203 +C: "OO", 4488193203, 4488814972 +C: "OO", 4488814972, 4489802218 +C: "OO", 4489802218, 4490050640 +C: "OO", 4490050640, 4490723442 +C: "OO", 4490723442, 4490844141 +C: "OO", 4490844141, 4491670789 +C: "OO", 4491670789, 4492160763 +C: "OO", 4492160763, 4492830493 +C: "OO", 4492830493, 4493213097 +C: "OO", 4493213097, 4493723041 +C: "OO", 4493723041, 4496762099 +C: "OO", 4496762099, 4497453194 +C: "OO", 4497453194, 4497942978 +C: "OO", 4497942978, 4498159115 +C: "OO", 4498159115, 4499380551 +C: "OO", 4499380551, 4502750402 +C: "OO", 4502750402, 4502924972 +C: "OO", 4502924972, 4503015657 +C: "OO", 4503015657, 4504208969 +C: "OO", 4504208969, 4504643150 +C: "OO", 4504643150, 4504990318 +C: "OO", 4504990318, 4505007342 +C: "OO", 4505007342, 4505083986 +C: "OO", 4505083986, 4505321084 +C: "OO", 4505321084, 4505520097 +C: "OO", 4505520097, 4506107154 +C: "OO", 4506107154, 4508026532 +C: "OO", 4508026532, 4508270303 +C: "OO", 4508270303, 4508393289 +C: "OO", 4508393289, 4509497774 +C: "OO", 4509497774, 4510032154 +C: "OO", 4510032154, 4510930758 +C: "OO", 4510930758, 4511009625 +C: "OO", 4511009625, 4511449610 +C: "OO", 4511449610, 4511576017 +C: "OO", 4511576017, 4512086477 +C: "OO", 4512086477, 4513426035 +C: "OO", 4513426035, 4514102721 +C: "OO", 4514102721, 4514776014 +C: "OO", 4514776014, 4515187859 +C: "OO", 4515187859, 4515325503 +C: "OO", 4515325503, 4516206578 +C: "OO", 4516206578, 4516306217 +C: "OO", 4516306217, 4516783244 +C: "OO", 4516783244, 4519556311 +C: "OO", 4519556311, 4520660013 +C: "OO", 4520660013, 4520884774 +C: "OO", 4520884774, 4521261607 +C: "OO", 4521261607, 4522003783 +C: "OO", 4522003783, 4523551867 +C: "OO", 4523551867, 4524033905 +C: "OO", 4524033905, 4524465450 +C: "OO", 4524465450, 4524529065 +C: "OO", 4524529065, 4524652399 +C: "OO", 4524652399, 4524836185 +C: "OO", 4524836185, 4525690405 +C: "OO", 4525690405, 4525959447 +C: "OO", 4525959447, 4526675017 +C: "OO", 4526675017, 4527492867 +C: "OO", 4527492867, 4527606542 +C: "OO", 4527606542, 4528742540 +C: "OO", 4528742540, 4528917442 +C: "OO", 4528917442, 4529123018 +C: "OO", 4529123018, 4529511441 +C: "OO", 4529511441, 4529738285 +C: "OO", 4529738285, 4532212496 +C: "OO", 4532212496, 4533892724 +C: "OO", 4533892724, 4533969777 +C: "OO", 4533969777, 4536044467 +C: "OO", 4536044467, 4536125806 +C: "OO", 4536125806, 4536876622 +C: "OO", 4536876622, 4537321074 +C: "OO", 4537321074, 4537499622 +C: "OO", 4537499622, 4537547793 +C: "OO", 4537547793, 4538488109 +C: "OO", 4538488109, 4538722259 +C: "OO", 4538722259, 4539408517 +C: "OO", 4539408517, 4539636869 +C: "OO", 4539636869, 4539692840 +C: "OO", 4539692840, 4539725151 +C: "OO", 4539725151, 4540264671 +C: "OO", 4540264671, 4540727126 +C: "OO", 4540727126, 4541167684 +C: "OO", 4541167684, 4542668231 +C: "OO", 4542668231, 4542716641 +C: "OO", 4542716641, 4543337805 +C: "OO", 4543337805, 4543672701 +C: "OO", 4543672701, 4543782397 +C: "OO", 4543782397, 4544279962 +C: "OO", 4544279962, 4544419126 +C: "OO", 4544419126, 4544527034 +C: "OO", 4544527034, 4545390500 +C: "OO", 4545390500, 4545637781 +C: "OO", 4545637781, 4546176841 +C: "OO", 4546176841, 4546282483 +C: "OO", 4546282483, 4547272699 +C: "OO", 4547272699, 4548278860 +C: "OO", 4548278860, 4548506799 +C: "OO", 4548506799, 4549596387 +C: "OO", 4549596387, 4549941849 +C: "OO", 4549941849, 4550920905 +C: "OO", 4550920905, 4551594131 +C: "OO", 4551594131, 4551767963 +C: "OO", 4551767963, 4553243847 +C: "OO", 4553243847, 4554205633 +C: "OO", 4554205633, 4554622333 +C: "OO", 4554622333, 4554877793 +C: "OO", 4554877793, 4555580607 +C: "OO", 4555580607, 4555753797 +C: "OO", 4555753797, 4556220913 +C: "OO", 4556220913, 4556498022 +C: "OO", 4556498022, 4557236911 +C: "OO", 4557236911, 4557614503 +C: "OO", 4557614503, 4557871206 +C: "OO", 4557871206, 4558239814 +C: "OO", 4558239814, 4558366975 +C: "OO", 4558366975, 4559125108 +C: "OO", 4559125108, 4559378223 +C: "OO", 4559378223, 4559691759 +C: "OO", 4559691759, 4560334166 +C: "OO", 4560334166, 4560937142 +C: "OO", 4560937142, 4561851021 +C: "OO", 4561851021, 4563277547 +C: "OO", 4563277547, 4564064774 +C: "OO", 4564064774, 4564309463 +C: "OO", 4564309463, 4566481124 +C: "OO", 4566481124, 4567326284 +C: "OO", 4567326284, 4567723981 +C: "OO", 4567723981, 4567955204 +C: "OO", 4567955204, 4568228572 +C: "OO", 4568228572, 4568270648 +C: "OO", 4568270648, 4568310753 +C: "OO", 4568310753, 4570062405 +C: "OO", 4570062405, 4570546509 +C: "OO", 4570546509, 4570784659 +C: "OO", 4570784659, 4570873514 +C: "OO", 4570873514, 4571899051 +C: "OO", 4571899051, 4572538187 +C: "OO", 4572538187, 4572671290 +C: "OO", 4572671290, 4574071448 +C: "OO", 4574071448, 4575731091 +C: "OO", 4575731091, 4576432191 +C: "OO", 4576432191, 4577154609 +C: "OO", 4577154609, 4577159474 +C: "OO", 4577159474, 4577632999 +C: "OO", 4577632999, 4578583058 +C: "OO", 4578583058, 4578981455 +C: "OO", 4578981455, 4581128312 +C: "OO", 4581128312, 4581950386 +C: "OO", 4581950386, 4582031373 +C: "OO", 4582031373, 4583063535 +C: "OO", 4583063535, 4584914914 +C: "OO", 4584914914, 4587018101 +C: "OO", 4587018101, 4587186695 +C: "OO", 4587186695, 4587295861 +C: "OO", 4587295861, 4587360002 +C: "OO", 4587360002, 4587864870 +C: "OO", 4587864870, 4588724075 +C: "OO", 4588724075, 4590155021 +C: "OO", 4590155021, 4590204884 +C: "OO", 4590204884, 4591825727 +C: "OO", 4591825727, 4591978823 +C: "OO", 4591978823, 4593620449 +C: "OO", 4593620449, 4593768752 +C: "OO", 4593768752, 4594566953 +C: "OO", 4594566953, 4595219648 +C: "OO", 4595219648, 4595692081 +C: "OO", 4595692081, 4595700990 +C: "OO", 4595700990, 4596350216 +C: "OO", 4596350216, 4596579217 +C: "OO", 4596579217, 4597006841 +C: "OO", 4597006841, 4597125886 +C: "OO", 4597125886, 4597631207 +C: "OO", 4597631207, 4598578125 +C: "OO", 4598578125, 4599695647 +C: "OO", 4599695647, 4599811717 +C: "OO", 4599811717, 4599992637 +C: "OO", 4599992637, 4600734563 +C: "OO", 4600734563, 4600851525 +C: "OO", 4600851525, 4600924094 +C: "OO", 4600924094, 4601474657 +C: "OO", 4601474657, 4601598153 +C: "OO", 4601598153, 4603120829 +C: "OO", 4603120829, 4604110903 +C: "OO", 4604110903, 4604917591 +C: "OO", 4604917591, 4604924107 +C: "OO", 4604924107, 4605445755 +C: "OO", 4605445755, 4606317341 +C: "OO", 4606317341, 4606692797 +C: "OO", 4606692797, 4607683609 +C: "OO", 4607683609, 4607983227 +C: "OO", 4607983227, 4608032906 +C: "OO", 4608032906, 4608279430 +C: "OO", 4608279430, 4608777258 +C: "OO", 4608777258, 4608902003 +C: "OO", 4608902003, 4610111977 +C: "OO", 4610111977, 4610362258 +C: "OO", 4610362258, 4610949745 +C: "OO", 4610949745, 4611027413 +C: "OO", 4611027413, 4611047177 +C: "OO", 4611047177, 4611333563 +C: "OO", 4611333563, 4612379096 +C: "OO", 4612379096, 4613133286 +C: "OO", 4613133286, 4613373551 +C: "OO", 4613373551, 4614069254 +C: "OO", 4614069254, 4614076361 +C: "OO", 4614076361, 4616328879 +C: "OO", 4616328879, 4616687428 +C: "OO", 4616687428, 4618425641 +C: "OO", 4618425641, 4618456613 +C: "OO", 4618456613, 4618918563 +C: "OO", 4618918563, 4619890173 +C: "OO", 4619890173, 4619979222 +C: "OO", 4619979222, 4620125334 +C: "OO", 4620125334, 4620424889 +C: "OO", 4620424889, 4620935443 +C: "OO", 4620935443, 4621332964 +C: "OO", 4621332964, 4622124829 +C: "OO", 4622124829, 4622308309 +C: "OO", 4622308309, 4624048263 +C: "OO", 4624048263, 4624129573 +C: "OO", 4624129573, 4625254736 +C: "OO", 4625254736, 4625586785 +C: "OO", 4625586785, 4626719351 +C: "OO", 4626719351, 4627671885 +C: "OO", 4627671885, 4629293027 +C: "OO", 4629293027, 4629825274 +C: "OO", 4629825274, 4631888701 +C: "OO", 4631888701, 4632286527 +C: "OO", 4632286527, 4633618322 +C: "OO", 4633618322, 4634603686 +C: "OO", 4634603686, 4634874275 +C: "OO", 4634874275, 4637319869 +C: "OO", 4637319869, 4637720331 +C: "OO", 4637720331, 4637987689 +C: "OO", 4637987689, 4638230181 +C: "OO", 4638230181, 4638380898 +C: "OO", 4638380898, 4639395959 +C: "OO", 4639395959, 4640520563 +C: "OO", 4640520563, 4641749667 +C: "OO", 4641749667, 4642169433 +C: "OO", 4642169433, 4642718572 +C: "OO", 4642718572, 4643926287 +C: "OO", 4643926287, 4644058446 +C: "OO", 4644058446, 4645407731 +C: "OO", 4645407731, 4645836425 +C: "OO", 4645836425, 4647013059 +C: "OO", 4647013059, 4647231676 +C: "OO", 4647231676, 4647419087 +C: "OO", 4647419087, 4647631475 +C: "OO", 4647631475, 4647829911 +C: "OO", 4647829911, 4648029387 +C: "OO", 4648029387, 4648202369 +C: "OO", 4648202369, 4648322255 +C: "OO", 4648322255, 4649228334 +C: "OO", 4649228334, 4649604318 +C: "OO", 4649604318, 4649616477 +C: "OO", 4649616477, 4651010374 +C: "OO", 4651010374, 4651230743 +C: "OO", 4651230743, 4651545467 +C: "OO", 4651545467, 4651552018 +C: "OO", 4651552018, 4653076474 +C: "OO", 4653076474, 4653369903 +C: "OO", 4653369903, 4654004919 +C: "OO", 4654004919, 4654091957 +C: "OO", 4654091957, 4654336351 +C: "OO", 4654336351, 4655070716 +C: "OO", 4655070716, 4655201417 +C: "OO", 4655201417, 4655787277 +C: "OO", 4655787277, 4656028099 +C: "OO", 4656028099, 4656167546 +C: "OO", 4656167546, 4656359684 +C: "OO", 4656359684, 4658843236 +C: "OO", 4658843236, 4658885828 +C: "OO", 4658885828, 4659226685 +C: "OO", 4659226685, 4659513049 +C: "OO", 4659513049, 4661068039 +C: "OO", 4661068039, 4661854346 +C: "OO", 4661854346, 4662479318 +C: "OO", 4662479318, 4663331420 +C: "OO", 4663331420, 4665262534 +C: "OO", 4665262534, 4667865839 +C: "OO", 4667865839, 4667879505 +C: "OO", 4667879505, 4668456585 +C: "OO", 4668456585, 4668665031 +C: "OO", 4668665031, 4671318141 +C: "OO", 4671318141, 4672513526 +C: "OO", 4672513526, 4673988314 +C: "OO", 4673988314, 4674661465 +C: "OO", 4674661465, 4675567354 +C: "OO", 4675567354, 4675665258 +C: "OO", 4675665258, 4675948825 +C: "OO", 4675948825, 4676944842 +C: "OO", 4676944842, 4677183590 +C: "OO", 4677183590, 4678837470 +C: "OO", 4678837470, 4679128673 +C: "OO", 4679128673, 4679692210 +C: "OO", 4679692210, 4680411646 +C: "OO", 4680411646, 4680583410 +C: "OO", 4680583410, 4681769485 +C: "OO", 4681769485, 4682025651 +C: "OO", 4682025651, 4684322158 +C: "OO", 4684322158, 4684942251 +C: "OO", 4684942251, 4685022117 +C: "OO", 4685022117, 4685127529 +C: "OO", 4685127529, 4686249436 +C: "OO", 4686249436, 4687301749 +C: "OO", 4687301749, 4688325143 +C: "OO", 4688325143, 4689078749 +C: "OO", 4689078749, 4689935366 +C: "OO", 4689935366, 4691387231 +C: "OO", 4691387231, 4691475656 +C: "OO", 4691475656, 4691475730 +C: "OO", 4691475730, 4692091290 +C: "OO", 4692091290, 4692184098 +C: "OO", 4692184098, 4692339436 +C: "OO", 4692339436, 4692745338 +C: "OO", 4692745338, 4692769311 +C: "OO", 4692769311, 4692966209 +C: "OO", 4692966209, 4693953037 +C: "OO", 4693953037, 4694703844 +C: "OO", 4694703844, 4694792641 +C: "OO", 4694792641, 4696097411 +C: "OO", 4696097411, 4696826038 +C: "OO", 4696826038, 4696844903 +C: "OO", 4696844903, 4699005853 +C: "OO", 4699005853, 4699015323 +C: "OO", 4699015323, 4699127157 +C: "OO", 4699127157, 4699326379 +C: "OO", 4699326379, 4699741290 +C: "OO", 4699741290, 4700534370 +C: "OO", 4700534370, 4700737750 +C: "OO", 4700737750, 4701236027 +C: "OO", 4701236027, 4702413877 +C: "OO", 4702413877, 4702500162 +C: "OO", 4702500162, 4704143573 +C: "OO", 4704143573, 4705079081 +C: "OO", 4705079081, 4705418960 +C: "OO", 4705418960, 4705557140 +C: "OO", 4705557140, 4707581099 +C: "OO", 4707581099, 4707678314 +C: "OO", 4707678314, 4707943299 +C: "OO", 4707943299, 4708279809 +C: "OO", 4708279809, 4708369233 +C: "OO", 4708369233, 4709265139 +C: "OO", 4709265139, 4710896137 +C: "OO", 4710896137, 4712153245 +C: "OO", 4712153245, 4712731721 +C: "OO", 4712731721, 4713524990 +C: "OO", 4713524990, 4713804632 +C: "OO", 4713804632, 4714171540 +C: "OO", 4714171540, 4714769434 +C: "OO", 4714769434, 4714914641 +C: "OO", 4714914641, 4715227489 +C: "OO", 4715227489, 4715362799 +C: "OO", 4715362799, 4715567309 +C: "OO", 4715567309, 4715863918 +C: "OO", 4715863918, 4715929631 +C: "OO", 4715929631, 4717296453 +C: "OO", 4717296453, 4717965171 +C: "OO", 4717965171, 4718949427 +C: "OO", 4718949427, 4721847460 +C: "OO", 4721847460, 4721965597 +C: "OO", 4721965597, 4722107452 +C: "OO", 4722107452, 4722312923 +C: "OO", 4722312923, 4722617849 +C: "OO", 4722617849, 4722661667 +C: "OO", 4722661667, 4723215038 +C: "OO", 4723215038, 4723604974 +C: "OO", 4723604974, 4723612375 +C: "OO", 4723612375, 4724269261 +C: "OO", 4724269261, 4725931390 +C: "OO", 4725931390, 4726031125 +C: "OO", 4726031125, 4726271193 +C: "OO", 4726271193, 4727101206 +C: "OO", 4727101206, 4727694519 +C: "OO", 4727694519, 4727802123 +C: "OO", 4727802123, 4728225135 +C: "OO", 4728225135, 4728262035 +C: "OO", 4728262035, 4728764650 +C: "OO", 4728764650, 4728800578 +C: "OO", 4728800578, 4730910030 +C: "OO", 4730910030, 4730923732 +C: "OO", 4730923732, 4732191137 +C: "OO", 4732191137, 4732853699 +C: "OO", 4732853699, 4733033043 +C: "OO", 4733033043, 4734014030 +C: "OO", 4734014030, 4735190374 +C: "OO", 4735190374, 4735349766 +C: "OO", 4735349766, 4736137079 +C: "OO", 4736137079, 4736881293 +C: "OO", 4736881293, 4737282488 +C: "OO", 4737282488, 4737977075 +C: "OO", 4737977075, 4738403546 +C: "OO", 4738403546, 4738922298 +C: "OO", 4738922298, 4740109388 +C: "OO", 4740109388, 4740220856 +C: "OO", 4740220856, 4740346660 +C: "OO", 4740346660, 4741243900 +C: "OO", 4741243900, 4741433217 +C: "OO", 4741433217, 4741656145 +C: "OO", 4741656145, 4743055619 +C: "OO", 4743055619, 4743480377 +C: "OO", 4743480377, 4743777450 +C: "OO", 4743777450, 4744101306 +C: "OO", 4744101306, 4745554623 +C: "OO", 4745554623, 4746201015 +C: "OO", 4746201015, 4746325950 +C: "OO", 4746325950, 4747114194 +C: "OO", 4747114194, 4747375046 +C: "OO", 4747375046, 4748229872 +C: "OO", 4748229872, 4749043001 +C: "OO", 4749043001, 4749096343 +C: "OO", 4749096343, 4750294832 +C: "OO", 4750294832, 4750739634 +C: "OO", 4750739634, 4750907901 +C: "OO", 4750907901, 4750917545 +C: "OO", 4750917545, 4751022995 +C: "OO", 4751022995, 4751374828 +C: "OO", 4751374828, 4753499455 +C: "OO", 4753499455, 4753526333 +C: "OO", 4753526333, 4754184104 +C: "OO", 4754184104, 4754535654 +C: "OO", 4754535654, 4754549739 +C: "OO", 4754549739, 4754843117 +C: "OO", 4754843117, 4755556681 +C: "OO", 4755556681, 4755717550 +C: "OO", 4755717550, 4755739991 +C: "OO", 4755739991, 4755851775 +C: "OO", 4755851775, 4756343654 +C: "OO", 4756343654, 4757910633 +C: "OO", 4757910633, 4758175622 +C: "OO", 4758175622, 4758489654 +C: "OO", 4758489654, 4758577348 +C: "OO", 4758577348, 4758634038 +C: "OO", 4758634038, 4759011494 +C: "OO", 4759011494, 4761327213 +C: "OO", 4761327213, 4761539237 +C: "OO", 4761539237, 4763363684 +C: "OO", 4763363684, 4766752325 +C: "OO", 4766752325, 4768124071 +C: "OO", 4768124071, 4769276394 +C: "OO", 4769276394, 4769485019 +C: "OO", 4769485019, 4770019605 +C: "OO", 4770019605, 4770937682 +C: "OO", 4770937682, 4770955778 +C: "OO", 4770955778, 4771145234 +C: "OO", 4771145234, 4773095717 +C: "OO", 4773095717, 4773815073 +C: "OO", 4773815073, 4773897374 +C: "OO", 4773897374, 4773971077 +C: "OO", 4773971077, 4774641434 +C: "OO", 4774641434, 4775216682 +C: "OO", 4775216682, 4776083370 +C: "OO", 4776083370, 4777135542 +C: "OO", 4777135542, 4777256333 +C: "OO", 4777256333, 4778114530 +C: "OO", 4778114530, 4778582829 +C: "OO", 4778582829, 4779855406 +C: "OO", 4779855406, 4781555071 +C: "OO", 4781555071, 4782038211 +C: "OO", 4782038211, 4782436399 +C: "OO", 4782436399, 4782517494 +C: "OO", 4782517494, 4783638047 +C: "OO", 4783638047, 4785107518 +C: "OO", 4785107518, 4785631565 +C: "OO", 4785631565, 4786728001 +C: "OO", 4786728001, 4787084034 +C: "OO", 4787084034, 4787445381 +C: "OO", 4787445381, 4787832518 +C: "OO", 4787832518, 4789149197 +C: "OO", 4789149197, 4789414753 +C: "OO", 4789414753, 4791781849 +C: "OO", 4791781849, 4792896471 +C: "OO", 4792896471, 4793501847 +C: "OO", 4793501847, 4793508519 +C: "OO", 4793508519, 4793939265 +C: "OO", 4793939265, 4794598259 +C: "OO", 4794598259, 4795892834 +C: "OO", 4795892834, 4797239215 +C: "OO", 4797239215, 4797983620 +C: "OO", 4797983620, 4798007457 +C: "OO", 4798007457, 4798347997 +C: "OO", 4798347997, 4799496673 +C: "OO", 4799496673, 4800464564 +C: "OO", 4800464564, 4801601765 +C: "OO", 4801601765, 4802171674 +C: "OO", 4802171674, 4802675290 +C: "OO", 4802675290, 4802738188 +C: "OO", 4802738188, 4802929202 +C: "OO", 4802929202, 4803613785 +C: "OO", 4803613785, 4803667757 +C: "OO", 4803667757, 4803730676 +C: "OO", 4803730676, 4804152758 +C: "OO", 4804152758, 4804163669 +C: "OO", 4804163669, 4804270701 +C: "OO", 4804270701, 4807876285 +C: "OO", 4807876285, 4808399371 +C: "OO", 4808399371, 4808868751 +C: "OO", 4808868751, 4809905974 +C: "OO", 4809905974, 4809908204 +C: "OO", 4809908204, 4810711854 +C: "OO", 4810711854, 4811874641 +C: "OO", 4811874641, 4812140915 +C: "OO", 4812140915, 4812199180 +C: "OO", 4812199180, 4812722947 +C: "OO", 4812722947, 4816464490 +C: "OO", 4816464490, 4817386169 +C: "OO", 4817386169, 4817989267 +C: "OO", 4817989267, 4818500703 +C: "OO", 4818500703, 4819799374 +C: "OO", 4819799374, 4821363365 +C: "OO", 4821363365, 4822151673 +C: "OO", 4822151673, 4822203857 +C: "OO", 4822203857, 4823756286 +C: "OO", 4823756286, 4823995831 +C: "OO", 4823995831, 4824019862 +C: "OO", 4824019862, 4824095226 +C: "OO", 4824095226, 4826303469 +C: "OO", 4826303469, 4826835534 +C: "OO", 4826835534, 4827077270 +C: "OO", 4827077270, 4828650546 +C: "OO", 4828650546, 4828807673 +C: "OO", 4828807673, 4828818514 +C: "OO", 4828818514, 4829597072 +C: "OO", 4829597072, 4830221421 +C: "OO", 4830221421, 4831047406 +C: "OO", 4831047406, 4832820001 +C: "OO", 4832820001, 4834053378 +C: "OO", 4834053378, 4834336297 +C: "OO", 4834336297, 4836400098 +C: "OO", 4836400098, 4836960604 +C: "OO", 4836960604, 4837486127 +C: "OO", 4837486127, 4838378693 +C: "OO", 4838378693, 4838784617 +C: "OO", 4838784617, 4840887347 +C: "OO", 4840887347, 4841557844 +C: "OO", 4841557844, 4842862522 +C: "OO", 4842862522, 4842930629 +C: "OO", 4842930629, 4843679835 +C: "OO", 4843679835, 4843748458 +C: "OO", 4843748458, 4843862938 +C: "OO", 4843862938, 4845261761 +C: "OO", 4845261761, 4845320453 +C: "OO", 4845320453, 4845834641 +C: "OO", 4845834641, 4845992447 +C: "OO", 4845992447, 4845994179 +C: "OO", 4845994179, 4846179721 +C: "OO", 4846179721, 4846706451 +C: "OO", 4846706451, 4847682115 +C: "OO", 4847682115, 4847974353 +C: "OO", 4847974353, 4848319049 +C: "OO", 4848319049, 4848731977 +C: "OO", 4848731977, 4848893818 +C: "OO", 4848893818, 4849324370 +C: "OO", 4849324370, 4850216708 +C: "OO", 4850216708, 4851505633 +C: "OO", 4851505633, 4852391277 +C: "OO", 4852391277, 4852527676 +C: "OO", 4852527676, 4852900486 +C: "OO", 4852900486, 4853898441 +C: "OO", 4853898441, 4855648547 +C: "OO", 4855648547, 4856758329 +C: "OO", 4856758329, 4857011071 +C: "OO", 4857011071, 4858800809 +C: "OO", 4858800809, 4858877335 +C: "OO", 4858877335, 4859646896 +C: "OO", 4859646896, 4859803754 +C: "OO", 4859803754, 4860120209 +C: "OO", 4860120209, 4860686980 +C: "OO", 4860686980, 4862541849 +C: "OO", 4862541849, 4867167817 +C: "OO", 4867167817, 4867347225 +C: "OO", 4867347225, 4867528506 +C: "OO", 4867528506, 4868036429 +C: "OO", 4868036429, 4868531370 +C: "OO", 4868531370, 4868733811 +C: "OO", 4868733811, 4868873087 +C: "OO", 4868873087, 4870546253 +C: "OO", 4870546253, 4870653728 +C: "OO", 4870653728, 4870917721 +C: "OO", 4870917721, 4872628595 +C: "OO", 4872628595, 4872638108 +C: "OO", 4872638108, 4873016406 +C: "OO", 4873016406, 4873173111 +C: "OO", 4873173111, 4873195213 +C: "OO", 4873195213, 4874268609 +C: "OO", 4874268609, 4874878282 +C: "OO", 4874878282, 4874917109 +C: "OO", 4874917109, 4874985193 +C: "OO", 4874985193, 4875105061 +C: "OO", 4875105061, 4875280268 +C: "OO", 4875280268, 4876156453 +C: "OO", 4876156453, 4876760961 +C: "OO", 4876760961, 4877870245 +C: "OO", 4877870245, 4880560787 +C: "OO", 4880560787, 4880744091 +C: "OO", 4880744091, 4880828975 +C: "OO", 4880828975, 4880888938 +C: "OO", 4880888938, 4881259436 +C: "OO", 4881259436, 4881770785 +C: "OO", 4881770785, 4882648612 +C: "OO", 4882648612, 4883127561 +C: "OO", 4883127561, 4883308642 +C: "OO", 4883308642, 4883415620 +C: "OO", 4883415620, 4883542990 +C: "OO", 4883542990, 4885681963 +C: "OO", 4885681963, 4886117006 +C: "OO", 4886117006, 4886463680 +C: "OO", 4886463680, 4886527736 +C: "OO", 4886527736, 4886821598 +C: "OO", 4886821598, 4887186263 +C: "OO", 4887186263, 4887825812 +C: "OO", 4887825812, 4888331857 +C: "OO", 4888331857, 4889084581 +C: "OO", 4889084581, 4889312142 +C: "OO", 4889312142, 4890378734 +C: "OO", 4890378734, 4890588895 +C: "OO", 4890588895, 4890788471 +C: "OO", 4890788471, 4891653441 +C: "OO", 4891653441, 4891890149 +C: "OO", 4891890149, 4892085299 +C: "OO", 4892085299, 4893325893 +C: "OO", 4893325893, 4893329131 +C: "OO", 4893329131, 4895030419 +C: "OO", 4895030419, 4895501954 +C: "OO", 4895501954, 4895856585 +C: "OO", 4895856585, 4895877026 +C: "OO", 4895877026, 4897008658 +C: "OO", 4897008658, 4897109276 +C: "OO", 4897109276, 4897119673 +C: "OO", 4897119673, 4897627959 +C: "OO", 4897627959, 4898028299 +C: "OO", 4898028299, 4898746127 +C: "OO", 4898746127, 4899641642 +C: "OO", 4899641642, 4900370218 +C: "OO", 4900370218, 4900542484 +C: "OO", 4900542484, 4900820015 +C: "OO", 4900820015, 4900852973 +C: "OO", 4900852973, 4901422306 +C: "OO", 4901422306, 4901623923 +C: "OO", 4901623923, 4904641822 +C: "OO", 4904641822, 4904710293 +C: "OO", 4904710293, 4906387175 +C: "OO", 4906387175, 4907168213 +C: "OO", 4907168213, 4907724340 +C: "OO", 4907724340, 4907812154 +C: "OO", 4907812154, 4908508402 +C: "OO", 4908508402, 4908874231 +C: "OO", 4908874231, 4909814401 +C: "OO", 4909814401, 4909932831 +C: "OO", 4909932831, 4910432838 +C: "OO", 4910432838, 4911408851 +C: "OO", 4911408851, 4911742283 +C: "OO", 4911742283, 4913575631 +C: "OO", 4913575631, 4914528963 +C: "OO", 4914528963, 4914658502 +C: "OO", 4914658502, 4914954393 +C: "OO", 4914954393, 4915398401 +C: "OO", 4915398401, 4916488343 +C: "OO", 4916488343, 4916707369 +C: "OO", 4916707369, 4917577060 +C: "OO", 4917577060, 4918970233 +C: "OO", 4918970233, 4918973190 +C: "OO", 4918973190, 4919338111 +C: "OO", 4919338111, 4920130174 +C: "OO", 4920130174, 4920566701 +C: "OO", 4920566701, 4921587698 +C: "OO", 4921587698, 4921873537 +C: "OO", 4921873537, 4922440921 +C: "OO", 4922440921, 4922805140 +C: "OO", 4922805140, 4923118607 +C: "OO", 4923118607, 4923749828 +C: "OO", 4923749828, 4924288292 +C: "OO", 4924288292, 4924477801 +C: "OO", 4924477801, 4924585275 +C: "OO", 4924585275, 4924643991 +C: "OO", 4924643991, 4926385967 +C: "OO", 4926385967, 4926620531 +C: "OO", 4926620531, 4926645557 +C: "OO", 4926645557, 4927342631 +C: "OO", 4927342631, 4928198551 +C: "OO", 4928198551, 4928866965 +C: "OO", 4928866965, 4929288719 +C: "OO", 4929288719, 4929584973 +C: "OO", 4929584973, 4929838071 +C: "OO", 4929838071, 4929937841 +C: "OO", 4929937841, 4929974007 +C: "OO", 4929974007, 4930162675 +C: "OO", 4930162675, 4930249586 +C: "OO", 4930249586, 4931166476 +C: "OO", 4931166476, 4931244361 +C: "OO", 4931244361, 4931885611 +C: "OO", 4931885611, 4932456761 +C: "OO", 4932456761, 4933003255 +C: "OO", 4933003255, 4933025462 +C: "OO", 4933025462, 4934331301 +C: "OO", 4934331301, 4934861675 +C: "OO", 4934861675, 4934953222 +C: "OO", 4934953222, 4935541445 +C: "OO", 4935541445, 4935889783 +C: "OO", 4935889783, 4936277487 +C: "OO", 4936277487, 4936716458 +C: "OO", 4936716458, 4937399678 +C: "OO", 4937399678, 4938485166 +C: "OO", 4938485166, 4938618201 +C: "OO", 4938618201, 4938730280 +C: "OO", 4938730280, 4940074266 +C: "OO", 4940074266, 4940618897 +C: "OO", 4940618897, 4940854970 +C: "OO", 4940854970, 4940959499 +C: "OO", 4940959499, 4940967259 +C: "OO", 4940967259, 4941045539 +C: "OO", 4941045539, 4941180541 +C: "OO", 4941180541, 4941661706 +C: "OO", 4941661706, 4941737273 +C: "OO", 4941737273, 4942586651 +C: "OO", 4942586651, 4942815297 +C: "OO", 4942815297, 4944558253 +C: "OO", 4944558253, 4945294887 +C: "OO", 4945294887, 4945505263 +C: "OO", 4945505263, 4946241431 +C: "OO", 4946241431, 4946288377 +C: "OO", 4946288377, 4946518681 +C: "OO", 4946518681, 4946832330 +C: "OO", 4946832330, 4946988502 +C: "OO", 4946988502, 4947707709 +C: "OO", 4947707709, 4947813944 +C: "OO", 4947813944, 4948130026 +C: "OO", 4948130026, 4948621105 +C: "OO", 4948621105, 4949526752 +C: "OO", 4949526752, 4950391322 +C: "OO", 4950391322, 4950870460 +C: "OO", 4950870460, 4952882651 +C: "OO", 4952882651, 4952887376 +C: "OO", 4952887376, 4953707283 +C: "OO", 4953707283, 4955291000 +C: "OO", 4955291000, 4956170915 +C: "OO", 4956170915, 4956370133 +C: "OO", 4956370133, 4956805724 +C: "OO", 4956805724, 4956838406 +C: "OO", 4956838406, 4957141081 +C: "OO", 4957141081, 4958071619 +C: "OO", 4958071619, 4959182925 +C: "OO", 4959182925, 4960847849 +C: "OO", 4960847849, 4962061207 +C: "OO", 4962061207, 4962302118 +C: "OO", 4962302118, 4964127580 +C: "OO", 4964127580, 4964304193 +C: "OO", 4964304193, 4964618697 +C: "OO", 4964618697, 4965121605 +C: "OO", 4965121605, 4965701509 +C: "OO", 4965701509, 4965823362 +C: "OO", 4965823362, 4966890278 +C: "OO", 4966890278, 4967261035 +C: "OO", 4967261035, 4967390907 +C: "OO", 4967390907, 4968030549 +C: "OO", 4968030549, 4968422735 +C: "OO", 4968422735, 4968514577 +C: "OO", 4968514577, 4968656846 +C: "OO", 4968656846, 4970311403 +C: "OO", 4970311403, 4970717633 +C: "OO", 4970717633, 4970956493 +C: "OO", 4970956493, 4971604627 +C: "OO", 4971604627, 4973215298 +C: "OO", 4973215298, 4973913761 +C: "OO", 4973913761, 4973946926 +C: "OO", 4973946926, 4974084253 +C: "OO", 4974084253, 4976388877 +C: "OO", 4976388877, 4976764942 +C: "OO", 4976764942, 4977142527 +C: "OO", 4977142527, 4977234306 +C: "OO", 4977234306, 4977532184 +C: "OO", 4977532184, 4978463195 +C: "OO", 4978463195, 4978611656 +C: "OO", 4978611656, 4979939059 +C: "OO", 4979939059, 4981131260 +C: "OO", 4981131260, 4981168869 +C: "OO", 4981168869, 4983045745 +C: "OO", 4983045745, 4983979129 +C: "OO", 4983979129, 4984067919 +C: "OO", 4984067919, 4985245725 +C: "OO", 4985245725, 4986027554 +C: "OO", 4986027554, 4986097990 +C: "OO", 4986097990, 4986728693 +C: "OO", 4986728693, 4986952401 +C: "OO", 4986952401, 4987331823 +C: "OO", 4987331823, 4987720851 +C: "OO", 4987720851, 4988116075 +C: "OO", 4988116075, 4988139990 +C: "OO", 4988139990, 4988963971 +C: "OO", 4988963971, 4989793510 +C: "OO", 4989793510, 4991077130 +C: "OO", 4991077130, 4991518931 +C: "OO", 4991518931, 4991772581 +C: "OO", 4991772581, 4992107967 +C: "OO", 4992107967, 4993512713 +C: "OO", 4993512713, 4994523473 +C: "OO", 4994523473, 4995030350 +C: "OO", 4995030350, 4995385003 +C: "OO", 4995385003, 4995594250 +C: "OO", 4995594250, 4997147693 +C: "OO", 4997147693, 4998327063 +C: "OO", 4998327063, 5000225055 +C: "OO", 5000225055, 5000477490 +C: "OO", 5000477490, 5000608778 +C: "OO", 5000608778, 5001339777 +C: "OO", 5001339777, 5001488543 +C: "OO", 5001488543, 5001945183 +C: "OO", 5001945183, 5002130602 +C: "OO", 5002130602, 5002303690 +C: "OO", 5002303690, 5003609527 +C: "OO", 5003609527, 5004024357 +C: "OO", 5004024357, 5004942157 +C: "OO", 5004942157, 5005317794 +C: "OO", 5005317794, 5005335700 +C: "OO", 5005335700, 5005419939 +C: "OO", 5005419939, 5005557433 +C: "OO", 5005557433, 5006160721 +C: "OO", 5006160721, 5006610882 +C: "OO", 5006610882, 5006616270 +C: "OO", 5006616270, 5007552347 +C: "OO", 5007552347, 5007947773 +C: "OO", 5007947773, 5008092381 +C: "OO", 5008092381, 5008538143 +C: "OO", 5008538143, 5008857536 +C: "OO", 5008857536, 5009319412 +C: "OO", 5009319412, 5010027677 +C: "OO", 5010027677, 5010068657 +C: "OO", 5010068657, 5012575445 +C: "OO", 5012575445, 5012934858 +C: "OO", 5012934858, 5012947049 +C: "OO", 5012947049, 5013004124 +C: "OO", 5013004124, 5013015967 +C: "OO", 5013015967, 5013064485 +C: "OO", 5013064485, 5014092659 +C: "OO", 5014092659, 5016077998 +C: "OO", 5016077998, 5016148558 +C: "OO", 5016148558, 5017182309 +C: "OO", 5017182309, 5017397645 +C: "OO", 5017397645, 5017740342 +C: "OO", 5017740342, 5018177846 +C: "OO", 5018177846, 5018561996 +C: "OO", 5018561996, 5019165785 +C: "OO", 5019165785, 5019601895 +C: "OO", 5019601895, 5019985919 +C: "OO", 5019985919, 5020590427 +C: "OO", 5020590427, 5020946097 +C: "OO", 5020946097, 5022124250 +C: "OO", 5022124250, 5022233133 +C: "OO", 5022233133, 5022415102 +C: "OO", 5022415102, 5022438281 +C: "OO", 5022438281, 5022623981 +C: "OO", 5022623981, 5023139647 +C: "OO", 5023139647, 5024286267 +C: "OO", 5024286267, 5024836511 +C: "OO", 5024836511, 5025081806 +C: "OO", 5025081806, 5026270965 +C: "OO", 5026270965, 5028249357 +C: "OO", 5028249357, 5030099898 +C: "OO", 5030099898, 5030279293 +C: "OO", 5030279293, 5030471671 +C: "OO", 5030471671, 5030486503 +C: "OO", 5030486503, 5030929463 +C: "OO", 5030929463, 5031259202 +C: "OO", 5031259202, 5031661086 +C: "OO", 5031661086, 5031824467 +C: "OO", 5031824467, 5033292825 +C: "OO", 5033292825, 5033351335 +C: "OO", 5033351335, 5033481221 +C: "OO", 5033481221, 5034291450 +C: "OO", 5034291450, 5034681857 +C: "OO", 5034681857, 5035278562 +C: "OO", 5035278562, 5036038412 +C: "OO", 5036038412, 5037280150 +C: "OO", 5037280150, 5037846623 +C: "OO", 5037846623, 5038558650 +C: "OO", 5038558650, 5040544303 +C: "OO", 5040544303, 5041618159 +C: "OO", 5041618159, 5041694521 +C: "OO", 5041694521, 5042187727 +C: "OO", 5042187727, 5042416557 +C: "OO", 5042416557, 5043749301 +C: "OO", 5043749301, 5044124029 +C: "OO", 5044124029, 5044357991 +C: "OO", 5044357991, 5044493666 +C: "OO", 5044493666, 5044583654 +C: "OO", 5044583654, 5045749353 +C: "OO", 5045749353, 5045859689 +C: "OO", 5045859689, 5046337818 +C: "OO", 5046337818, 5048321150 +C: "OO", 5048321150, 5048428445 +C: "OO", 5048428445, 5048659437 +C: "OO", 5048659437, 5048878649 +C: "OO", 5048878649, 5049131093 +C: "OO", 5049131093, 5049480695 +C: "OO", 5049480695, 5049875306 +C: "OO", 5049875306, 5050699101 +C: "OO", 5050699101, 5050834987 +C: "OO", 5050834987, 5051334158 +C: "OO", 5051334158, 5052484353 +C: "OO", 5052484353, 5053750825 +C: "OO", 5053750825, 5054219189 +C: "OO", 5054219189, 5055117700 +C: "OO", 5055117700, 5055759002 +C: "OO", 5055759002, 5056170872 +C: "OO", 5056170872, 5056265953 +C: "OO", 5056265953, 5056370936 +C: "OO", 5056370936, 5057609197 +C: "OO", 5057609197, 5058078628 +C: "OO", 5058078628, 5059239377 +C: "OO", 5059239377, 5059836749 +C: "OO", 5059836749, 5061187309 +C: "OO", 5061187309, 5061281575 +C: "OO", 5061281575, 5061351430 +C: "OO", 5061351430, 5061467947 +C: "OO", 5061467947, 5061484967 +C: "OO", 5061484967, 5061854398 +C: "OO", 5061854398, 5062749170 +C: "OO", 5062749170, 5062750558 +C: "OO", 5062750558, 5062800249 +C: "OO", 5062800249, 5063028051 +C: "OO", 5063028051, 5064020603 +C: "OO", 5064020603, 5064091015 +C: "OO", 5064091015, 5064661165 +C: "OO", 5064661165, 5064985615 +C: "OO", 5064985615, 5065276490 +C: "OO", 5065276490, 5065773333 +C: "OO", 5065773333, 5066674194 +C: "OO", 5066674194, 5067084865 +C: "OO", 5067084865, 5067841814 +C: "OO", 5067841814, 5068034131 +C: "OO", 5068034131, 5068638646 +C: "OO", 5068638646, 5068996413 +C: "OO", 5068996413, 5069843146 +C: "OO", 5069843146, 5070693471 +C: "OO", 5070693471, 5072275267 +C: "OO", 5072275267, 5072370731 +C: "OO", 5072370731, 5072808363 +C: "OO", 5072808363, 5074342967 +C: "OO", 5074342967, 5074361745 +C: "OO", 5074361745, 5075086575 +C: "OO", 5075086575, 5075449079 +C: "OO", 5075449079, 5076085222 +C: "OO", 5076085222, 5076865229 +C: "OO", 5076865229, 5077066479 +C: "OO", 5077066479, 5077354378 +C: "OO", 5077354378, 5077407037 +C: "OO", 5077407037, 5077459754 +C: "OO", 5077459754, 5077497982 +C: "OO", 5077497982, 5079552603 +C: "OO", 5079552603, 5079807958 +C: "OO", 5079807958, 5080116748 +C: "OO", 5080116748, 5081012343 +C: "OO", 5081012343, 5082307031 +C: "OO", 5082307031, 5082700063 +C: "OO", 5082700063, 5082825358 +C: "OO", 5082825358, 5083025804 +C: "OO", 5083025804, 5083220687 +C: "OO", 5083220687, 5083287431 +C: "OO", 5083287431, 5083587570 +C: "OO", 5083587570, 5083743939 +C: "OO", 5083743939, 5084112550 +C: "OO", 5084112550, 5085055313 +C: "OO", 5085055313, 5086558292 +C: "OO", 5086558292, 5086688933 +C: "OO", 5086688933, 5086745277 +C: "OO", 5086745277, 5086746433 +C: "OO", 5086746433, 5087093782 +C: "OO", 5087093782, 5088179679 +C: "OO", 5088179679, 5088412064 +C: "OO", 5088412064, 5089065998 +C: "OO", 5089065998, 5089593050 +C: "OO", 5089593050, 5089773382 +C: "OO", 5089773382, 5090961998 +C: "OO", 5090961998, 5091182097 +C: "OO", 5091182097, 5092098395 +C: "OO", 5092098395, 5093217535 +C: "OO", 5093217535, 5095015963 +C: "OO", 5095015963, 5095704953 +C: "OO", 5095704953, 5095856924 +C: "OO", 5095856924, 5096220554 +C: "OO", 5096220554, 5097439412 +C: "OO", 5097439412, 5097802194 +C: "OO", 5097802194, 5097913377 +C: "OO", 5097913377, 5100131261 +C: "OO", 5100131261, 5100249892 +C: "OO", 5100249892, 5100330313 +C: "OO", 5100330313, 5101640291 +C: "OO", 5101640291, 5101663301 +C: "OO", 5101663301, 5102870065 +C: "OO", 5102870065, 5103828891 +C: "OO", 5103828891, 5104029079 +C: "OO", 5104029079, 5105391354 +C: "OO", 5105391354, 5106534261 +C: "OO", 5106534261, 5107447717 +C: "OO", 5107447717, 5107484395 +C: "OO", 5107484395, 5108283010 +C: "OO", 5108283010, 5108320832 +C: "OO", 5108320832, 5108340291 +C: "OO", 5108340291, 5108662043 +C: "OO", 5108662043, 5108752871 +C: "OO", 5108752871, 5108876749 +C: "OO", 5108876749, 5109437527 +C: "OO", 5109437527, 5109455646 +C: "OO", 5109455646, 5109605129 +C: "OO", 5109605129, 5110977102 +C: "OO", 5110977102, 5111336243 +C: "OO", 5111336243, 5111418487 +C: "OO", 5111418487, 5113252946 +C: "OO", 5113252946, 5114733476 +C: "OO", 5114733476, 5115030981 +C: "OO", 5115030981, 5115442754 +C: "OO", 5115442754, 5115993332 +C: "OO", 5115993332, 5117243079 +C: "OO", 5117243079, 5118615717 +C: "OO", 5118615717, 5118858986 +C: "OO", 5118858986, 5119596194 +C: "OO", 5119596194, 5119698009 +C: "OO", 5119698009, 5121005299 +C: "OO", 5121005299, 5122353916 +C: "OO", 5122353916, 5124115229 +C: "OO", 5124115229, 5124797444 +C: "OO", 5124797444, 5124965934 +C: "OO", 5124965934, 5125732339 +C: "OO", 5125732339, 5126233265 +C: "OO", 5126233265, 5126854115 +C: "OO", 5126854115, 5126913788 +C: "OO", 5126913788, 5127148974 +C: "OO", 5127148974, 5127290659 +C: "OO", 5127290659, 5127584325 +C: "OO", 5127584325, 5128787105 +C: "OO", 5128787105, 5128851534 +C: "OO", 5128851534, 5128870094 +C: "OO", 5128870094, 5130646117 +C: "OO", 5130646117, 5130844826 +C: "OO", 5130844826, 5130988230 +C: "OO", 5130988230, 5130990411 +C: "OO", 5130990411, 5131092614 +C: "OO", 5131092614, 5131240513 +C: "OO", 5131240513, 5132526758 +C: "OO", 5132526758, 5132807816 +C: "OO", 5132807816, 5133367902 +C: "OO", 5133367902, 5134625013 +C: "OO", 5134625013, 5135741362 +C: "OO", 5135741362, 5136098716 +C: "OO", 5136098716, 5136115365 +C: "OO", 5136115365, 5136305953 +C: "OO", 5136305953, 5136947653 +C: "OO", 5136947653, 5137656551 +C: "OO", 5137656551, 5138175459 +C: "OO", 5138175459, 5138771528 +C: "OO", 5138771528, 5138779250 +C: "OO", 5138779250, 5138957759 +C: "OO", 5138957759, 5139305457 +C: "OO", 5139305457, 5140227379 +C: "OO", 5140227379, 5140490995 +C: "OO", 5140490995, 5140970210 +C: "OO", 5140970210, 5141131262 +C: "OO", 5141131262, 5141306894 +C: "OO", 5141306894, 5141424670 +C: "OO", 5141424670, 5143670192 +C: "OO", 5143670192, 5144018612 +C: "OO", 5144018612, 5145003733 +C: "OO", 5145003733, 5145052886 +C: "OO", 5145052886, 5145948394 +C: "OO", 5145948394, 5146175308 +C: "OO", 5146175308, 5146516707 +C: "OO", 5146516707, 5146650827 +C: "OO", 5146650827, 5146678335 +C: "OO", 5146678335, 5146707113 +C: "OO", 5146707113, 5146714961 +C: "OO", 5146714961, 5146721481 +C: "OO", 5146721481, 5146957943 +C: "OO", 5146957943, 5147303615 +C: "OO", 5147303615, 5147309126 +C: "OO", 5147309126, 5149638037 +C: "OO", 5149638037, 5151070047 +C: "OO", 5151070047, 5151085012 +C: "OO", 5151085012, 5151249224 +C: "OO", 5151249224, 5151386850 +C: "OO", 5151386850, 5152072069 +C: "OO", 5152072069, 5152401469 +C: "OO", 5152401469, 5153120442 +C: "OO", 5153120442, 5154246830 +C: "OO", 5154246830, 5154759557 +C: "OO", 5154759557, 5155647217 +C: "OO", 5155647217, 5156370968 +C: "OO", 5156370968, 5157801973 +C: "OO", 5157801973, 5158784452 +C: "OO", 5158784452, 5159059411 +C: "OO", 5159059411, 5159920109 +C: "OO", 5159920109, 5160162047 +C: "OO", 5160162047, 5160465029 +C: "OO", 5160465029, 5161044561 +C: "OO", 5161044561, 5161126496 +C: "OO", 5161126496, 5161155313 +C: "OO", 5161155313, 5161949241 +C: "OO", 5161949241, 5162251573 +C: "OO", 5162251573, 5162562931 +C: "OO", 5162562931, 5162926585 +C: "OO", 5162926585, 5163208904 +C: "OO", 5163208904, 5164456101 +C: "OO", 5164456101, 5164859434 +C: "OO", 5164859434, 5164895873 +C: "OO", 5164895873, 5165584138 +C: "OO", 5165584138, 5167174681 +C: "OO", 5167174681, 5168588151 +C: "OO", 5168588151, 5169322450 +C: "OO", 5169322450, 5169506857 +C: "OO", 5169506857, 5169660140 +C: "OO", 5169660140, 5171079274 +C: "OO", 5171079274, 5171353593 +C: "OO", 5171353593, 5171458030 +C: "OO", 5171458030, 5171486401 +C: "OO", 5171486401, 5171542869 +C: "OO", 5171542869, 5171699077 +C: "OO", 5171699077, 5171716545 +C: "OO", 5171716545, 5171885243 +C: "OO", 5171885243, 5171912806 +C: "OO", 5171912806, 5171975039 +C: "OO", 5171975039, 5172167430 +C: "OO", 5172167430, 5172702259 +C: "OO", 5172702259, 5172761010 +C: "OO", 5172761010, 5173663929 +C: "OO", 5173663929, 5175682137 +C: "OO", 5175682137, 5175694105 +C: "OO", 5175694105, 5175978271 +C: "OO", 5175978271, 5176207717 +C: "OO", 5176207717, 5176687251 +C: "OO", 5176687251, 5176709974 +C: "OO", 5176709974, 5176723951 +C: "OO", 5176723951, 5177042154 +C: "OO", 5177042154, 5177064934 +C: "OO", 5177064934, 5177085203 +C: "OO", 5177085203, 5178582377 +C: "OO", 5178582377, 5178594757 +C: "OO", 5178594757, 5179034351 +C: "OO", 5179034351, 5179684251 +C: "OO", 5179684251, 5180474101 +C: "OO", 5180474101, 5180692854 +C: "OO", 5180692854, 5181366202 +C: "OO", 5181366202, 5181455005 +C: "OO", 5181455005, 5182332676 +C: "OO", 5182332676, 5182714342 +C: "OO", 5182714342, 5183182545 +C: "OO", 5183182545, 5183844025 +C: "OO", 5183844025, 5184115319 +C: "OO", 5184115319, 5184294163 +C: "OO", 5184294163, 5184322043 +C: "OO", 5184322043, 5184468702 +C: "OO", 5184468702, 5185757775 +C: "OO", 5185757775, 5186476454 +C: "OO", 5186476454, 5187292779 +C: "OO", 5187292779, 5188100942 +C: "OO", 5188100942, 5190912658 +C: "OO", 5190912658, 5191330249 +C: "OO", 5191330249, 5191608499 +C: "OO", 5191608499, 5192054011 +C: "OO", 5192054011, 5192600524 +C: "OO", 5192600524, 5193409233 +C: "OO", 5193409233, 5194344822 +C: "OO", 5194344822, 5194425163 +C: "OO", 5194425163, 5194881195 +C: "OO", 5194881195, 5195020482 +C: "OO", 5195020482, 5195480570 +C: "OO", 5195480570, 5195517022 +C: "OO", 5195517022, 5196711503 +C: "OO", 5196711503, 5196753875 +C: "OO", 5196753875, 5197589116 +C: "OO", 5197589116, 5198374221 +C: "OO", 5198374221, 5199400802 +C: "OO", 5199400802, 5199719847 +C: "OO", 5199719847, 5199748445 +C: "OO", 5199748445, 5200629039 +C: "OO", 5200629039, 5201485927 +C: "OO", 5201485927, 5202996278 +C: "OO", 5202996278, 5203064089 +C: "OO", 5203064089, 5203394096 +C: "OO", 5203394096, 5204248514 +C: "OO", 5204248514, 5204919702 +C: "OO", 5204919702, 5204976906 +C: "OO", 5204976906, 5205949257 +C: "OO", 5205949257, 5206091449 +C: "OO", 5206091449, 5206656915 +C: "OO", 5206656915, 5207043383 +C: "OO", 5207043383, 5207285438 +C: "OO", 5207285438, 5208291809 +C: "OO", 5208291809, 5208570269 +C: "OO", 5208570269, 5208723830 +C: "OO", 5208723830, 5209175390 +C: "OO", 5209175390, 5209655670 +C: "OO", 5209655670, 5210519873 +C: "OO", 5210519873, 5212314997 +C: "OO", 5212314997, 5213259163 +C: "OO", 5213259163, 5214339231 +C: "OO", 5214339231, 5214875705 +C: "OO", 5214875705, 5216517435 +C: "OO", 5216517435, 5217047893 +C: "OO", 5217047893, 5217951537 +C: "OO", 5217951537, 5218587385 +C: "OO", 5218587385, 5219784028 +C: "OO", 5219784028, 5219796807 +C: "OO", 5219796807, 5221726834 +C: "OO", 5221726834, 5222034604 +C: "OO", 5222034604, 5222065058 +C: "OO", 5222065058, 5222745823 +C: "OO", 5222745823, 5223369237 +C: "OO", 5223369237, 5224102508 +C: "OO", 5224102508, 5224460421 +C: "OO", 5224460421, 5224760805 +C: "OO", 5224760805, 5225303165 +C: "OO", 5225303165, 5225366740 +C: "OO", 5225366740, 5227046015 +C: "OO", 5227046015, 5229168298 +C: "OO", 5229168298, 5229186707 +C: "OO", 5229186707, 5229428615 +C: "OO", 5229428615, 5230130147 +C: "OO", 5230130147, 5230693361 +C: "OO", 5230693361, 5232775789 +C: "OO", 5232775789, 5233971966 +C: "OO", 5233971966, 5235151749 +C: "OO", 5235151749, 5236333625 +C: "OO", 5236333625, 5236546507 +C: "OO", 5236546507, 5238800530 +C: "OO", 5238800530, 5239110843 +C: "OO", 5239110843, 5240134565 +C: "OO", 5240134565, 5240954517 +C: "OO", 5240954517, 5242014974 +C: "OO", 5242014974, 5242742419 +C: "OO", 5242742419, 5243621719 +C: "OO", 5243621719, 5244843489 +C: "OO", 5244843489, 5245148714 +C: "OO", 5245148714, 5246590633 +C: "OO", 5246590633, 5246708218 +C: "OO", 5246708218, 5247618885 +C: "OO", 5247618885, 5247694810 +C: "OO", 5247694810, 5247755792 +C: "OO", 5247755792, 5249149587 +C: "OO", 5249149587, 5249193379 +C: "OO", 5249193379, 5252978491 +C: "OO", 5252978491, 5254009810 +C: "OO", 5254009810, 5254066103 +C: "OO", 5254066103, 5254344163 +C: "OO", 5254344163, 5254661278 +C: "OO", 5254661278, 5254780205 +C: "OO", 5254780205, 5255308172 +C: "OO", 5255308172, 5255416558 +C: "OO", 5255416558, 5256787218 +C: "OO", 5256787218, 5258445578 +C: "OO", 5258445578, 5259269997 +C: "OO", 5259269997, 5260415763 +C: "OO", 5260415763, 5260955881 +C: "OO", 5260955881, 5261249847 +C: "OO", 5261249847, 5261315417 +C: "OO", 5261315417, 5261319314 +C: "OO", 5261319314, 5262151894 +C: "OO", 5262151894, 5262698972 +C: "OO", 5262698972, 5263563969 +C: "OO", 5263563969, 5263936481 +C: "OO", 5263936481, 5264898532 +C: "OO", 5264898532, 5267134130 +C: "OO", 5267134130, 5267537906 +C: "OO", 5267537906, 5267886850 +C: "OO", 5267886850, 5268037119 +C: "OO", 5268037119, 5268807837 +C: "OO", 5268807837, 5268818862 +C: "OO", 5268818862, 5269318088 +C: "OO", 5269318088, 5269550111 +C: "OO", 5269550111, 5269830159 +C: "OO", 5269830159, 5270003217 +C: "OO", 5270003217, 5270266357 +C: "OO", 5270266357, 5270868413 +C: "OO", 5270868413, 5271119699 +C: "OO", 5271119699, 5271235897 +C: "OO", 5271235897, 5271554409 +C: "OO", 5271554409, 5272137257 +C: "OO", 5272137257, 5272220882 +C: "OO", 5272220882, 5272350161 +C: "OO", 5272350161, 5273834002 +C: "OO", 5273834002, 5274407551 +C: "OO", 5274407551, 5274816743 +C: "OO", 5274816743, 5275272698 +C: "OO", 5275272698, 5275869821 +C: "OO", 5275869821, 5276018933 +C: "OO", 5276018933, 5276748340 +C: "OO", 5276748340, 5277582921 +C: "OO", 5277582921, 5277904129 +C: "OO", 5277904129, 5278082653 +C: "OO", 5278082653, 5278448480 +C: "OO", 5278448480, 5278836073 +C: "OO", 5278836073, 5278885286 +C: "OO", 5278885286, 5279607639 +C: "OO", 5279607639, 5279702000 +C: "OO", 5279702000, 5279717726 +C: "OO", 5279717726, 5279948990 +C: "OO", 5279948990, 5280023428 +C: "OO", 5280023428, 5281179019 +C: "OO", 5281179019, 5281470271 +C: "OO", 5281470271, 5281588154 +C: "OO", 5281588154, 5284034473 +C: "OO", 5284034473, 5286027746 +C: "OO", 5286027746, 5286413534 +C: "OO", 5286413534, 5286951178 +C: "OO", 5286951178, 5287190409 +C: "OO", 5287190409, 5288152516 +C: "OO", 5288152516, 5288782603 +C: "OO", 5288782603, 5289087911 +C: "OO", 5289087911, 5289328714 +C: "OO", 5289328714, 5289392713 +C: "OO", 5289392713, 5290056519 +C: "OO", 5290056519, 5290187506 +C: "OO", 5290187506, 5290245605 +C: "OO", 5290245605, 5290424079 +C: "OO", 5290424079, 5291971190 +C: "OO", 5291971190, 5292736469 +C: "OO", 5292736469, 5293837017 +C: "OO", 5293837017, 5294077625 +C: "OO", 5294077625, 5294502465 +C: "OO", 5294502465, 5294542910 +C: "OO", 5294542910, 5295000439 +C: "OO", 5295000439, 5295139807 +C: "OO", 5295139807, 5295694482 +C: "OO", 5295694482, 5295740003 +C: "OO", 5295740003, 5296244654 +C: "OO", 5296244654, 5296262804 +C: "OO", 5296262804, 5296308652 +C: "OO", 5296308652, 5296321016 +C: "OO", 5296321016, 5297171509 +C: "OO", 5297171509, 5297465120 +C: "OO", 5297465120, 5299888556 +C: "OO", 5299888556, 5299998290 +C: "OO", 5299998290, 5300678714 +C: "OO", 5300678714, 5301310767 +C: "OO", 5301310767, 5305958857 +C: "OO", 5305958857, 5306143593 +C: "OO", 5306143593, 5307479957 +C: "OO", 5307479957, 5307904973 +C: "OO", 5307904973, 5307929540 +C: "OO", 5307929540, 5309581907 +C: "OO", 5309581907, 5309824190 +C: "OO", 5309824190, 5311105341 +C: "OO", 5311105341, 5311435087 +C: "OO", 5311435087, 5311530743 +C: "OO", 5311530743, 5311566458 +C: "OO", 5311566458, 5312382519 +C: "OO", 5312382519, 5314545224 +C: "OO", 5314545224, 5314838706 +C: "OO", 5314838706, 5315247916 +C: "OO", 5315247916, 5315729319 +C: "OO", 5315729319, 5315763939 +C: "OO", 5315763939, 5316083378 +C: "OO", 5316083378, 5316360805 +C: "OO", 5316360805, 5316423668 +C: "OO", 5316423668, 5317793469 +C: "OO", 5317793469, 5318275598 +C: "OO", 5318275598, 5318531450 +C: "OO", 5318531450, 5318615098 +C: "OO", 5318615098, 5320088234 +C: "OO", 5320088234, 5321600792 +C: "OO", 5321600792, 5321680418 +C: "OO", 5321680418, 5322157107 +C: "OO", 5322157107, 5322223007 +C: "OO", 5322223007, 5323128082 +C: "OO", 5323128082, 5323176121 +C: "OO", 5323176121, 5324651319 +C: "OO", 5324651319, 5324759962 +C: "OO", 5324759962, 5325304635 +C: "OO", 5325304635, 5326247636 +C: "OO", 5326247636, 5327667534 +C: "OO", 5327667534, 5327674161 +C: "OO", 5327674161, 5328005365 +C: "OO", 5328005365, 5328228632 +C: "OO", 5328228632, 5330234349 +C: "OO", 5330234349, 5330350235 +C: "OO", 5330350235, 5331114789 +C: "OO", 5331114789, 5331221615 +C: "OO", 5331221615, 5331295237 +C: "OO", 5331295237, 5331296529 +C: "OO", 5331296529, 5331305766 +C: "OO", 5331305766, 5331306853 +C: "OO", 5331306853, 5331578285 +C: "OO", 5331578285, 5332653801 +C: "OO", 5332653801, 5335640129 +C: "OO", 5335640129, 5335897461 +C: "OO", 5335897461, 5336412009 +C: "OO", 5336412009, 5336522558 +C: "OO", 5336522558, 5337616053 +C: "OO", 5337616053, 5337847946 +C: "OO", 5337847946, 5338596532 +C: "OO", 5338596532, 5338867179 +C: "OO", 5338867179, 5340423155 +C: "OO", 5340423155, 5340624917 +C: "OO", 5340624917, 5341544449 +C: "OO", 5341544449, 5342661010 +C: "OO", 5342661010, 5343032789 +C: "OO", 5343032789, 5343730843 +C: "OO", 5343730843, 5345654953 +C: "OO", 5345654953, 5346234164 +C: "OO", 5346234164, 5346785300 +C: "OO", 5346785300, 5346848925 +C: "OO", 5346848925, 5346957872 +C: "OO", 5346957872, 5347241048 +C: "OO", 5347241048, 5347640001 +C: "OO", 5347640001, 5347982151 +C: "OO", 5347982151, 5348354419 +C: "OO", 5348354419, 5348870548 +C: "OO", 5348870548, 5349844280 +C: "OO", 5349844280, 5351070103 +C: "OO", 5351070103, 5351155196 +C: "OO", 5351155196, 5353011131 +C: "OO", 5353011131, 5354717017 +C: "OO", 5354717017, 5354884715 +C: "OO", 5354884715, 5355535285 +C: "OO", 5355535285, 5355628297 +C: "OO", 5355628297, 5356979901 +C: "OO", 5356979901, 5357233762 +C: "OO", 5357233762, 5360519098 +C: "OO", 5360519098, 5360571464 +C: "OO", 5360571464, 5361044009 +C: "OO", 5361044009, 5361159901 +C: "OO", 5361159901, 5362504156 +C: "OO", 5362504156, 5362997882 +C: "OO", 5362997882, 5363613745 +C: "OO", 5363613745, 5364307209 +C: "OO", 5364307209, 5364534513 +C: "OO", 5364534513, 5364818756 +C: "OO", 5364818756, 5368783274 +C: "OO", 5368783274, 5368957591 +C: "OO", 5368957591, 5372050651 +C: "OO", 5372050651, 5372086313 +C: "OO", 5372086313, 5372395430 +C: "OO", 5372395430, 5373299817 +C: "OO", 5373299817, 5373916040 +C: "OO", 5373916040, 5374065994 +C: "OO", 5374065994, 5374740043 +C: "OO", 5374740043, 5375524450 +C: "OO", 5375524450, 5375767994 +C: "OO", 5375767994, 5375971286 +C: "OO", 5375971286, 5376948967 +C: "OO", 5376948967, 5377120471 +C: "OO", 5377120471, 5377151714 +C: "OO", 5377151714, 5377575898 +C: "OO", 5377575898, 5377675806 +C: "OO", 5377675806, 5378057727 +C: "OO", 5378057727, 5378164653 +C: "OO", 5378164653, 5379381598 +C: "OO", 5379381598, 5379556186 +C: "OO", 5379556186, 5380771561 +C: "OO", 5380771561, 5380908123 +C: "OO", 5380908123, 5381106399 +C: "OO", 5381106399, 5381222989 +C: "OO", 5381222989, 5381723528 +C: "OO", 5381723528, 5381822561 +C: "OO", 5381822561, 5381903019 +C: "OO", 5381903019, 5382192915 +C: "OO", 5382192915, 5382905841 +C: "OO", 5382905841, 5383100428 +C: "OO", 5383100428, 5383521858 +C: "OO", 5383521858, 5383571994 +C: "OO", 5383571994, 5384041723 +C: "OO", 5384041723, 5384383515 +C: "OO", 5384383515, 5384402001 +C: "OO", 5384402001, 5384414445 +C: "OO", 5384414445, 5384665837 +C: "OO", 5384665837, 5385819130 +C: "OO", 5385819130, 5386209220 +C: "OO", 5386209220, 5386234435 +C: "OO", 5386234435, 5386242863 +C: "OO", 5386242863, 5386263634 +C: "OO", 5386263634, 5386513454 +C: "OO", 5386513454, 5387171471 +C: "OO", 5387171471, 5387262723 +C: "OO", 5387262723, 5387540962 +C: "OO", 5387540962, 5387804038 +C: "OO", 5387804038, 5387973422 +C: "OO", 5387973422, 5388152969 +C: "OO", 5388152969, 5388190330 +C: "OO", 5388190330, 5388224881 +C: "OO", 5388224881, 5388796399 +C: "OO", 5388796399, 5389118199 +C: "OO", 5389118199, 5391848694 +C: "OO", 5391848694, 5392392866 +C: "OO", 5392392866, 5393115967 +C: "OO", 5393115967, 5393333816 +C: "OO", 5393333816, 5393640715 +C: "OO", 5393640715, 5393679386 +C: "OO", 5393679386, 5393735237 +C: "OO", 5393735237, 5397166578 +C: "OO", 5397166578, 5397840201 +C: "OO", 5397840201, 5398339539 +C: "OO", 5398339539, 5398793794 +C: "OO", 5398793794, 5399162350 +C: "OO", 5399162350, 5399581999 +C: "OO", 5399581999, 5399815790 +C: "OO", 5399815790, 5400073851 +C: "OO", 5400073851, 5400880953 +C: "OO", 5400880953, 5401707272 +C: "OO", 5401707272, 5403531414 +C: "OO", 5403531414, 5404486739 +C: "OO", 5404486739, 5405256266 +C: "OO", 5405256266, 5406274402 +C: "OO", 5406274402, 5406401337 +C: "OO", 5406401337, 5406512278 +C: "OO", 5406512278, 5406870153 +C: "OO", 5406870153, 5407478106 +C: "OO", 5407478106, 5408443906 +C: "OO", 5408443906, 5408498639 +C: "OO", 5408498639, 5408761711 +C: "OO", 5408761711, 5409077763 +C: "OO", 5409077763, 5409303278 +C: "OO", 5409303278, 5409467325 +C: "OO", 5409467325, 5410087789 +C: "OO", 5410087789, 5410672615 +C: "OO", 5410672615, 5410843398 +C: "OO", 5410843398, 5410963493 +C: "OO", 5410963493, 5411874851 +C: "OO", 5411874851, 5413749793 +C: "OO", 5413749793, 5414839923 +C: "OO", 5414839923, 5415861751 +C: "OO", 5415861751, 5416805027 +C: "OO", 5416805027, 5416945973 +C: "OO", 5416945973, 5417278772 +C: "OO", 5417278772, 5417559311 +C: "OO", 5417559311, 5418129165 +C: "OO", 5418129165, 5418384443 +C: "OO", 5418384443, 5418565803 +C: "OO", 5418565803, 5419308632 +C: "OO", 5419308632, 5419508370 +C: "OO", 5419508370, 5421079421 +C: "OO", 5421079421, 5421681329 +C: "OO", 5421681329, 5421694559 +C: "OO", 5421694559, 5422405509 +C: "OO", 5422405509, 5422910144 +C: "OO", 5422910144, 5423166593 +C: "OO", 5423166593, 5423438977 +C: "OO", 5423438977, 5424329937 +C: "OO", 5424329937, 5425047998 +C: "OO", 5425047998, 5425209642 +C: "OO", 5425209642, 5426880913 +C: "OO", 5426880913, 5428147473 +C: "OO", 5428147473, 5429689710 +C: "OO", 5429689710, 5429741275 +C: "OO", 5429741275, 5430025505 +C: "OO", 5430025505, 5431871715 +C: "OO", 5431871715, 5432473594 +C: "OO", 5432473594, 5432554817 +C: "OO", 5432554817, 5432664020 +C: "OO", 5432664020, 5433726802 +C: "OO", 5433726802, 5434018765 +C: "OO", 5434018765, 5434754291 +C: "OO", 5434754291, 5437773766 +C: "OO", 5437773766, 5438195264 +C: "OO", 5438195264, 5438596820 +C: "OO", 5438596820, 5439114375 +C: "OO", 5439114375, 5440611223 +C: "OO", 5440611223, 5441116497 +C: "OO", 5441116497, 5442356229 +C: "OO", 5442356229, 5444513385 +C: "OO", 5444513385, 5444517307 +C: "OO", 5444517307, 5444906334 +C: "OO", 5444906334, 5445148770 +C: "OO", 5445148770, 5446561567 +C: "OO", 5446561567, 5447122350 +C: "OO", 5447122350, 5448376483 +C: "OO", 5448376483, 5448415717 +C: "OO", 5448415717, 5449121734 +C: "OO", 5449121734, 5449551069 +C: "OO", 5449551069, 5450521947 +C: "OO", 5450521947, 5450936131 +C: "OO", 5450936131, 5451133172 +C: "OO", 5451133172, 5451604537 +C: "OO", 5451604537, 5452068987 +C: "OO", 5452068987, 5452239371 +C: "OO", 5452239371, 5452585759 +C: "OO", 5452585759, 5453357650 +C: "OO", 5453357650, 5455644339 +C: "OO", 5455644339, 5455931768 +C: "OO", 5455931768, 5457022190 +C: "OO", 5457022190, 5457115022 +C: "OO", 5457115022, 5458271229 +C: "OO", 5458271229, 5458395382 +C: "OO", 5458395382, 5458410585 +C: "OO", 5458410585, 5459006989 +C: "OO", 5459006989, 5460797965 +C: "OO", 5460797965, 5460879417 +C: "OO", 5460879417, 5461389993 +C: "OO", 5461389993, 5461489135 +C: "OO", 5461489135, 5461966769 +C: "OO", 5461966769, 5462198085 +C: "OO", 5462198085, 5462320434 +C: "OO", 5462320434, 5462426010 +C: "OO", 5462426010, 5462480798 +C: "OO", 5462480798, 5463186093 +C: "OO", 5463186093, 5463908164 +C: "OO", 5463908164, 5466631981 +C: "OO", 5466631981, 5466721586 +C: "OO", 5466721586, 5468146228 +C: "OO", 5468146228, 5468564649 +C: "OO", 5468564649, 5468975653 +C: "OO", 5468975653, 5469939083 +C: "OO", 5469939083, 5469957775 +C: "OO", 5469957775, 5470175398 +C: "OO", 5470175398, 5473290227 +C: "OO", 5473290227, 5474985506 +C: "OO", 5474985506, 5475627338 +C: "OO", 5475627338, 5475859563 +C: "OO", 5475859563, 5476264870 +C: "OO", 5476264870, 5476561820 +C: "OO", 5476561820, 5479139483 +C: "OO", 5479139483, 5479719077 +C: "OO", 5479719077, 5480135071 +C: "OO", 5480135071, 5480659866 +C: "OO", 5480659866, 5481020397 +C: "OO", 5481020397, 5481224264 +C: "OO", 5481224264, 5481959787 +C: "OO", 5481959787, 5482664095 +C: "OO", 5482664095, 5482765393 +C: "OO", 5482765393, 5483470919 +C: "OO", 5483470919, 5483626582 +C: "OO", 5483626582, 5484535758 +C: "OO", 5484535758, 5485348842 +C: "OO", 5485348842, 5486589285 +C: "OO", 5486589285, 5487044192 +C: "OO", 5487044192, 5487531846 +C: "OO", 5487531846, 5487973714 +C: "OO", 5487973714, 5489305294 +C: "OO", 5489305294, 5489483094 +C: "OO", 5489483094, 5489819267 +C: "OO", 5489819267, 5489834360 +C: "OO", 5489834360, 5491054066 +C: "OO", 5491054066, 5491177366 +C: "OO", 5491177366, 5491748103 +C: "OO", 5491748103, 5492014319 +C: "OO", 5492014319, 5492570119 +C: "OO", 5492570119, 5492779136 +C: "OO", 5492779136, 5493571378 +C: "OO", 5493571378, 5493749274 +C: "OO", 5493749274, 5494059191 +C: "OO", 5494059191, 5494596331 +C: "OO", 5494596331, 5494693863 +C: "OO", 5494693863, 5495027266 +C: "OO", 5495027266, 5495242019 +C: "OO", 5495242019, 5495325532 +C: "OO", 5495325532, 5497019329 +C: "OO", 5497019329, 5497544881 +C: "OO", 5497544881, 5498289369 +C: "OO", 5498289369, 5499010842 +C: "OO", 5499010842, 5499366786 +C: "OO", 5499366786, 5499375899 +C: "OO", 5499375899, 5499433865 +C: "OO", 5499433865, 5499912772 +C: "OO", 5499912772, 5500114821 +C: "OO", 5500114821, 5500316421 +C: "OO", 5500316421, 5500896762 +C: "OO", 5500896762, 5501190416 +C: "OO", 5501190416, 5502246097 +C: "OO", 5502246097, 5502504271 +C: "OO", 5502504271, 5502596570 +C: "OO", 5502596570, 5502666364 +C: "OO", 5502666364, 5502674365 +C: "OO", 5502674365, 5502974989 +C: "OO", 5502974989, 5504831893 +C: "OO", 5504831893, 5505139162 +C: "OO", 5505139162, 5505296823 +C: "OO", 5505296823, 5505798045 +C: "OO", 5505798045, 5507802541 +C: "OO", 5507802541, 5507852874 +C: "OO", 5507852874, 5507991987 +C: "OO", 5507991987, 5508452650 +C: "OO", 5508452650, 5508900510 +C: "OO", 5508900510, 5509325027 +C: "OO", 5509325027, 5510622515 +C: "OO", 5510622515, 5510853605 +C: "OO", 5510853605, 5511042812 +C: "OO", 5511042812, 5511246599 +C: "OO", 5511246599, 5511599306 +C: "OO", 5511599306, 5512191859 +C: "OO", 5512191859, 5512252478 +C: "OO", 5512252478, 5512264455 +C: "OO", 5512264455, 5512487349 +C: "OO", 5512487349, 5513474173 +C: "OO", 5513474173, 5514905494 +C: "OO", 5514905494, 5515930989 +C: "OO", 5515930989, 5517323287 +C: "OO", 5517323287, 5518072337 +C: "OO", 5518072337, 5518669646 +C: "OO", 5518669646, 5519927013 +C: "OO", 5519927013, 5520435781 +C: "OO", 5520435781, 5520738687 +C: "OO", 5520738687, 5520787758 +C: "OO", 5520787758, 5521080920 +C: "OO", 5521080920, 5521493204 +C: "OO", 5521493204, 5521929302 +C: "OO", 5521929302, 5523390965 +C: "OO", 5523390965, 5523408229 +C: "OO", 5523408229, 5524322747 +C: "OO", 5524322747, 5527066964 +C: "OO", 5527066964, 5527210782 +C: "OO", 5527210782, 5527830613 +C: "OO", 5527830613, 5528233761 +C: "OO", 5528233761, 5529483535 +C: "OO", 5529483535, 5529741174 +C: "OO", 5529741174, 5531280330 +C: "OO", 5531280330, 5532914408 +C: "OO", 5532914408, 5532964578 +C: "OO", 5532964578, 5535372310 +C: "OO", 5535372310, 5535571641 +C: "OO", 5535571641, 5536274721 +C: "OO", 5536274721, 5536415225 +C: "OO", 5536415225, 5536614251 +C: "OO", 5536614251, 5537188727 +C: "OO", 5537188727, 5538029285 +C: "OO", 5538029285, 5539022046 +C: "OO", 5539022046, 5539210907 +C: "OO", 5539210907, 5540048869 +C: "OO", 5540048869, 5540204503 +C: "OO", 5540204503, 5540253894 +C: "OO", 5540253894, 5540325194 +C: "OO", 5540325194, 5540523902 +C: "OO", 5540523902, 5541318710 +C: "OO", 5541318710, 5542873305 +C: "OO", 5542873305, 5543286327 +C: "OO", 5543286327, 5543305373 +C: "OO", 5543305373, 5543375513 +C: "OO", 5543375513, 5544809742 +C: "OO", 5544809742, 5547201749 +C: "OO", 5547201749, 5548455641 +C: "OO", 5548455641, 5548745677 +C: "OO", 5548745677, 5549462120 +C: "OO", 5549462120, 5550589209 +C: "OO", 5550589209, 5551027649 +C: "OO", 5551027649, 5552570125 +C: "OO", 5552570125, 5553455563 +C: "OO", 5553455563, 5555726891 +C: "OO", 5555726891, 5556434260 +C: "OO", 5556434260, 5556843511 +C: "OO", 5556843511, 5557336926 +C: "OO", 5557336926, 5557387340 +C: "OO", 5557387340, 5559260845 +C: "OO", 5559260845, 5559339397 +C: "OO", 5559339397, 5560390314 +C: "OO", 5560390314, 5560656306 +C: "OO", 5560656306, 5560755615 +C: "OO", 5560755615, 5561325578 +C: "OO", 5561325578, 5562333519 +C: "OO", 5562333519, 5562792014 +C: "OO", 5562792014, 5563436284 +C: "OO", 5563436284, 5563666997 +C: "OO", 5563666997, 5564569448 +C: "OO", 5564569448, 5565090622 +C: "OO", 5565090622, 5565120023 +C: "OO", 5565120023, 5565925751 +C: "OO", 5565925751, 5566051492 +C: "OO", 5566051492, 5566741239 +C: "OO", 5566741239, 5567688818 +C: "OO", 5567688818, 5567800208 +C: "OO", 5567800208, 5568598089 +C: "OO", 5568598089, 5568611816 +C: "OO", 5568611816, 5569207051 +C: "OO", 5569207051, 5569503929 +C: "OO", 5569503929, 5569724009 +C: "OO", 5569724009, 5569877914 +C: "OO", 5569877914, 5570093907 +C: "OO", 5570093907, 5570229248 +C: "OO", 5570229248, 5571395522 +C: "OO", 5571395522, 5571573489 +C: "OO", 5571573489, 5572445854 +C: "OO", 5572445854, 5573635165 +C: "OO", 5573635165, 5573842671 +C: "OO", 5573842671, 5574624365 +C: "OO", 5574624365, 5574814141 +C: "OO", 5574814141, 5577338106 +C: "OO", 5577338106, 5579559081 +C: "OO", 5579559081, 5579860797 +C: "OO", 5579860797, 5580401217 +C: "OO", 5580401217, 5580724101 +C: "OO", 5580724101, 5581216789 +C: "OO", 5581216789, 5582065016 +C: "OO", 5582065016, 5582599997 +C: "OO", 5582599997, 5584225894 +C: "OO", 5584225894, 5584239284 +C: "OO", 5584239284, 5584530662 +C: "OO", 5584530662, 5585624529 +C: "OO", 5585624529, 5585782361 +C: "OO", 5585782361, 5586993591 +C: "OO", 5586993591, 5587446931 +C: "OO", 5587446931, 5587606333 +C: "OO", 5587606333, 5587622003 +C: "OO", 5587622003, 5587857105 +C: "OO", 5587857105, 5589134264 +C: "OO", 5589134264, 5590145624 +C: "OO", 5590145624, 5591357125 +C: "OO", 5591357125, 5591902709 +C: "OO", 5591902709, 5593164067 +C: "OO", 5593164067, 5593407713 +C: "OO", 5593407713, 5595279281 +C: "OO", 5595279281, 5595407519 +C: "OO", 5595407519, 5595415562 +C: "OO", 5595415562, 5595525458 +C: "OO", 5595525458, 5596086652 +C: "OO", 5596086652, 5596326953 +C: "OO", 5596326953, 5596415879 +C: "OO", 5596415879, 5597440449 +C: "OO", 5597440449, 5597900954 +C: "OO", 5597900954, 5598859021 +C: "OO", 5598859021, 5599267461 +C: "OO", 5599267461, 5599818766 +C: "OO", 5599818766, 5600334573 +C: "OO", 5600334573, 5601411100 +C: "OO", 5601411100, 5602045978 +C: "OO", 5602045978, 5602690738 +C: "OO", 5602690738, 5603231183 +C: "OO", 5603231183, 5603321034 +C: "OO", 5603321034, 5603492589 +C: "OO", 5603492589, 5603569225 +C: "OO", 5603569225, 5603651377 +C: "OO", 5603651377, 5603883374 +C: "OO", 5603883374, 5604157243 +C: "OO", 5604157243, 5604676588 +C: "OO", 5604676588, 5604752251 +C: "OO", 5604752251, 5604875629 +C: "OO", 5604875629, 5605365059 +C: "OO", 5605365059, 5606112429 +C: "OO", 5606112429, 5606901199 +C: "OO", 5606901199, 5607711453 +C: "OO", 5607711453, 5607883377 +C: "OO", 5607883377, 5608176632 +C: "OO", 5608176632, 5608910413 +C: "OO", 5608910413, 5608938507 +C: "OO", 5608938507, 5609140688 +C: "OO", 5609140688, 5609489384 +C: "OO", 5609489384, 5610115850 +C: "OO", 5610115850, 5610873698 +C: "OO", 5610873698, 5612191736 +C: "OO", 5612191736, 5612632717 +C: "OO", 5612632717, 5615814830 +C: "OO", 5615814830, 5616014518 +C: "OO", 5616014518, 5616616711 +C: "OO", 5616616711, 5616910181 +C: "OO", 5616910181, 5617834875 +C: "OO", 5617834875, 5618525135 +C: "OO", 5618525135, 5618618068 +C: "OO", 5618618068, 5618975538 +C: "OO", 5618975538, 5619375045 +C: "OO", 5619375045, 5620256501 +C: "OO", 5620256501, 5620659866 +C: "OO", 5620659866, 5620782403 +C: "OO", 5620782403, 5621202893 +C: "OO", 5621202893, 5621231563 +C: "OO", 5621231563, 5621293253 +C: "OO", 5621293253, 5621303588 +C: "OO", 5621303588, 5623622677 +C: "OO", 5623622677, 5624836754 +C: "OO", 5624836754, 5625113319 +C: "OO", 5625113319, 5625195450 +C: "OO", 5625195450, 5625562023 +C: "OO", 5625562023, 5625988306 +C: "OO", 5625988306, 5626156185 +C: "OO", 5626156185, 5626299777 +C: "OO", 5626299777, 5627047062 +C: "OO", 5627047062, 5627681966 +C: "OO", 5627681966, 5627824394 +C: "OO", 5627824394, 5628270326 +C: "OO", 5628270326, 5628374283 +C: "OO", 5628374283, 5628534483 +C: "OO", 5628534483, 5629622630 +C: "OO", 5629622630, 5629863878 +C: "OO", 5629863878, 5630240701 +C: "OO", 5630240701, 5630414915 +C: "OO", 5630414915, 5630938186 +C: "OO", 5630938186, 5631689585 +C: "OO", 5631689585, 5632027505 +C: "OO", 5632027505, 5632675701 +C: "OO", 5632675701, 5632882981 +C: "OO", 5632882981, 5633586681 +C: "OO", 5633586681, 5633622570 +C: "OO", 5633622570, 5635616756 +C: "OO", 5635616756, 5636244711 +C: "OO", 5636244711, 5636765002 +C: "OO", 5636765002, 5636786118 +C: "OO", 5636786118, 5637052414 +C: "OO", 5637052414, 5637397739 +C: "OO", 5637397739, 5638098823 +C: "OO", 5638098823, 5639575910 +C: "OO", 5639575910, 5640162383 +C: "OO", 5640162383, 5640913663 +C: "OO", 5640913663, 5641330655 +C: "OO", 5641330655, 5643130189 +C: "OO", 5643130189, 5643673897 +C: "OO", 5643673897, 5644549653 +C: "OO", 5644549653, 5644892573 +C: "OO", 5644892573, 5644962890 +C: "OO", 5644962890, 5645354386 +C: "OO", 5645354386, 5645693504 +C: "OO", 5645693504, 5645802097 +C: "OO", 5645802097, 5645909294 +C: "OO", 5645909294, 5646102347 +C: "OO", 5646102347, 5646122739 +C: "OO", 5646122739, 5646302798 +C: "OO", 5646302798, 5647667062 +C: "OO", 5647667062, 5647803316 +C: "OO", 5647803316, 5647810598 +C: "OO", 5647810598, 5648456485 +C: "OO", 5648456485, 5648657969 +C: "OO", 5648657969, 5648898045 +C: "OO", 5648898045, 5651439922 +C: "OO", 5651439922, 5652330674 +C: "OO", 5652330674, 5652630416 +C: "OO", 5652630416, 5652974926 +C: "OO", 5652974926, 5653031078 +C: "OO", 5653031078, 5653324497 +C: "OO", 5653324497, 5654550925 +C: "OO", 5654550925, 5655156297 +C: "OO", 5655156297, 5655477961 +C: "OO", 5655477961, 5655550732 +C: "OO", 5655550732, 5655625915 +C: "OO", 5655625915, 5655643550 +C: "OO", 5655643550, 5656339125 +C: "OO", 5656339125, 5657606480 +C: "OO", 5657606480, 5659545093 +C: "OO", 5659545093, 5660735455 +C: "OO", 5660735455, 5660837853 +C: "OO", 5660837853, 5661283073 +C: "OO", 5661283073, 5661376940 +C: "OO", 5661376940, 5662209795 +C: "OO", 5662209795, 5664029252 +C: "OO", 5664029252, 5664787676 +C: "OO", 5664787676, 5665171394 +C: "OO", 5665171394, 5665261786 +C: "OO", 5665261786, 5665914742 +C: "OO", 5665914742, 5666535964 +C: "OO", 5666535964, 5667810974 +C: "OO", 5667810974, 5668205487 +C: "OO", 5668205487, 5668407083 +C: "OO", 5668407083, 5668785927 +C: "OO", 5668785927, 5669599277 +C: "OO", 5669599277, 5670444309 +C: "OO", 5670444309, 5670610388 +C: "OO", 5670610388, 5670853042 +C: "OO", 5670853042, 5671359434 +C: "OO", 5671359434, 5672099902 +C: "OO", 5672099902, 5672416688 +C: "OO", 5672416688, 5673815930 +C: "OO", 5673815930, 5674382013 +C: "OO", 5674382013, 5674430159 +C: "OO", 5674430159, 5674953356 +C: "OO", 5674953356, 5674956878 +C: "OO", 5674956878, 5675038166 +C: "OO", 5675038166, 5675897367 +C: "OO", 5675897367, 5676087022 +C: "OO", 5676087022, 5677488378 +C: "OO", 5677488378, 5677733355 +C: "OO", 5677733355, 5677774487 +C: "OO", 5677774487, 5677908100 +C: "OO", 5677908100, 5677934877 +C: "OO", 5677934877, 5677975311 +C: "OO", 5677975311, 5678994119 +C: "OO", 5678994119, 5680885383 +C: "OO", 5680885383, 5681254563 +C: "OO", 5681254563, 5682467601 +C: "OO", 5682467601, 5683509357 +C: "OO", 5683509357, 5684531155 +C: "OO", 5684531155, 5684944295 +C: "OO", 5684944295, 5685078262 +C: "OO", 5685078262, 5685093253 +C: "OO", 5685093253, 5685844726 +C: "OO", 5685844726, 5686072828 +C: "OO", 5686072828, 5686765877 +C: "OO", 5686765877, 5687313229 +C: "OO", 5687313229, 5689067516 +C: "OO", 5689067516, 5689587311 +C: "OO", 5689587311, 5690464407 +C: "OO", 5690464407, 5691507395 +C: "OO", 5691507395, 5691576757 +C: "OO", 5691576757, 5691951462 +C: "OO", 5691951462, 5692479954 +C: "OO", 5692479954, 5692589540 +C: "OO", 5692589540, 5694479345 +C: "OO", 5694479345, 5694523117 +C: "OO", 5694523117, 5695134939 +C: "OO", 5695134939, 5695295365 +C: "OO", 5695295365, 5696594445 +C: "OO", 5696594445, 5696625885 +C: "OO", 5696625885, 5697745042 +C: "OO", 5697745042, 5698784525 +C: "OO", 5698784525, 5698794056 +C: "OO", 5698794056, 5699047018 +C: "OO", 5699047018, 5700096027 +C: "OO", 5700096027, 5700669995 +C: "OO", 5700669995, 5700829355 +C: "OO", 5700829355, 5701512020 +C: "OO", 5701512020, 5702104091 +C: "OO", 5702104091, 5702310510 +C: "OO", 5702310510, 5702560218 +C: "OO", 5702560218, 5702905029 +C: "OO", 5702905029, 5703191202 +C: "OO", 5703191202, 5705668563 +C: "OO", 5705668563, 5707194758 +C: "OO", 5707194758, 5707650087 +C: "OO", 5707650087, 5707677257 +C: "OO", 5707677257, 5708071923 +C: "OO", 5708071923, 5709466722 +C: "OO", 5709466722, 5710481285 +C: "OO", 5710481285, 5710753311 +C: "OO", 5710753311, 5710784766 +C: "OO", 5710784766, 5712010289 +C: "OO", 5712010289, 5712045202 +C: "OO", 5712045202, 5712358665 +C: "OO", 5712358665, 5712449539 +C: "OO", 5712449539, 5712669335 +C: "OO", 5712669335, 5712976444 +C: "OO", 5712976444, 5713145062 +C: "OO", 5713145062, 5713432351 +C: "OO", 5713432351, 5713958957 +C: "OO", 5713958957, 5714119238 +C: "OO", 5714119238, 5714740735 +C: "OO", 5714740735, 5714901870 +C: "OO", 5714901870, 5715098467 +C: "OO", 5715098467, 5715842846 +C: "OO", 5715842846, 5716822514 +C: "OO", 5716822514, 5717599274 +C: "OO", 5717599274, 5718103664 +C: "OO", 5718103664, 5718317572 +C: "OO", 5718317572, 5718353361 +C: "OO", 5718353361, 5719557010 +C: "OO", 5719557010, 5719669453 +C: "OO", 5719669453, 5719714571 +C: "OO", 5719714571, 5719984765 +C: "OO", 5719984765, 5720001452 +C: "OO", 5720001452, 5720284999 +C: "OO", 5720284999, 5720332566 +C: "OO", 5720332566, 5720567524 +C: "OO", 5720567524, 5722090230 +C: "OO", 5722090230, 5722128893 +C: "OO", 5722128893, 5722591712 +C: "OO", 5722591712, 5722591947 +C: "OO", 5722591947, 5723251765 +C: "OO", 5723251765, 5723727565 +C: "OO", 5723727565, 5724090305 +C: "OO", 5724090305, 5724592529 +C: "OO", 5724592529, 5726857037 +C: "OO", 5726857037, 5727451034 +C: "OO", 5727451034, 5727945283 +C: "OO", 5727945283, 5728437631 +C: "OO", 5728437631, 5728552126 +C: "OO", 5728552126, 5728764933 +C: "OO", 5728764933, 5728965920 +C: "OO", 5728965920, 5729816300 +C: "OO", 5729816300, 5730089601 +C: "OO", 5730089601, 5730333113 +C: "OO", 5730333113, 5730365554 +C: "OO", 5730365554, 5730395561 +C: "OO", 5730395561, 5732242497 +C: "OO", 5732242497, 5732900837 +C: "OO", 5732900837, 5733329576 +C: "OO", 5733329576, 5733349170 +C: "OO", 5733349170, 5733473227 +C: "OO", 5733473227, 5734281107 +C: "OO", 5734281107, 5735396876 +C: "OO", 5735396876, 5736049945 +C: "OO", 5736049945, 5736348947 +C: "OO", 5736348947, 5736366225 +C: "OO", 5736366225, 5737052375 +C: "OO", 5737052375, 5738760494 +C: "OO", 5738760494, 5738959820 +C: "OO", 5738959820, 5738961246 +C: "OO", 5738961246, 5739898083 +C: "OO", 5739898083, 5739993645 +C: "OO", 5739993645, 5740372501 +C: "OO", 5740372501, 5740645547 +C: "OO", 5740645547, 5740713724 +C: "OO", 5740713724, 5740822503 +C: "OO", 5740822503, 5741336738 +C: "OO", 5741336738, 5741438967 +C: "OO", 5741438967, 5741456743 +C: "OO", 5741456743, 5741517802 +C: "OO", 5741517802, 5741764130 +C: "OO", 5741764130, 5741836561 +C: "OO", 5741836561, 5742455389 +C: "OO", 5742455389, 5743186549 +C: "OO", 5743186549, 5743567537 +C: "OO", 5743567537, 5743960902 +C: "OO", 5743960902, 5744001539 +C: "OO", 5744001539, 5744017865 +C: "OO", 5744017865, 5744084552 +C: "OO", 5744084552, 5744582230 +C: "OO", 5744582230, 5745934856 +C: "OO", 5745934856, 5746978906 +C: "OO", 5746978906, 5747164001 +C: "OO", 5747164001, 5747423890 +C: "OO", 5747423890, 5748275437 +C: "OO", 5748275437, 5749499755 +C: "OO", 5749499755, 5749898180 +C: "OO", 5749898180, 5750091310 +C: "OO", 5750091310, 5750303146 +C: "OO", 5750303146, 5751104378 +C: "OO", 5751104378, 5751902867 +C: "OO", 5751902867, 5754027986 +C: "OO", 5754027986, 5754503613 +C: "OO", 5754503613, 5754841165 +C: "OO", 5754841165, 5755963345 +C: "OO", 5755963345, 5756935641 +C: "OO", 5756935641, 5757062783 +C: "OO", 5757062783, 5758442380 +C: "OO", 5758442380, 5759437918 +C: "OO", 5759437918, 5760762947 +C: "OO", 5760762947, 5761015753 +C: "OO", 5761015753, 5762592998 +C: "OO", 5762592998, 5765144001 +C: "OO", 5765144001, 5765987914 +C: "OO", 5765987914, 5766885499 +C: "OO", 5766885499, 5766965867 +C: "OO", 5766965867, 5767663972 +C: "OO", 5767663972, 5768285857 +C: "OO", 5768285857, 5769195670 +C: "OO", 5769195670, 5770025203 +C: "OO", 5770025203, 5770306527 +C: "OO", 5770306527, 5772044135 +C: "OO", 5772044135, 5772515138 +C: "OO", 5772515138, 5773131970 +C: "OO", 5773131970, 5774655095 +C: "OO", 5774655095, 5775181287 +C: "OO", 5775181287, 5775869287 +C: "OO", 5775869287, 5776962051 +C: "OO", 5776962051, 5777793125 +C: "OO", 5777793125, 5777829151 +C: "OO", 5777829151, 5778093885 +C: "OO", 5778093885, 5778826636 +C: "OO", 5778826636, 5779019359 +C: "OO", 5779019359, 5779650935 +C: "OO", 5779650935, 5779805119 +C: "OO", 5779805119, 5780897552 +C: "OO", 5780897552, 5781889854 +C: "OO", 5781889854, 5782561343 +C: "OO", 5782561343, 5782818183 +C: "OO", 5782818183, 5784637010 +C: "OO", 5784637010, 5785057386 +C: "OO", 5785057386, 5785597009 +C: "OO", 5785597009, 5785883509 +C: "OO", 5785883509, 5787457019 +C: "OO", 5787457019, 5787496006 +C: "OO", 5787496006, 5787703553 +C: "OO", 5787703553, 5787905518 +C: "OO", 5787905518, 5789147793 +C: "OO", 5789147793, 5789258750 +C: "OO", 5789258750, 5789410526 +C: "OO", 5789410526, 5790343733 +C: "OO", 5790343733, 5792141885 +C: "OO", 5792141885, 5792194766 +C: "OO", 5792194766, 5793745030 +C: "OO", 5793745030, 5793993563 +C: "OO", 5793993563, 5794226468 +C: "OO", 5794226468, 5796326009 +C: "OO", 5796326009, 5796347668 +C: "OO", 5796347668, 5796526673 +C: "OO", 5796526673, 5796738223 +C: "OO", 5796738223, 5796968910 +C: "OO", 5796968910, 5797486338 +C: "OO", 5797486338, 5797835029 +C: "OO", 5797835029, 5798013404 +C: "OO", 5798013404, 5799385269 +C: "OO", 5799385269, 5799424388 +C: "OO", 5799424388, 5799443422 +C: "OO", 5799443422, 5799730769 +C: "OO", 5799730769, 5799900250 +C: "OO", 5799900250, 5801352201 +C: "OO", 5801352201, 5803164179 +C: "OO", 5803164179, 5803180155 +C: "OO", 5803180155, 5804123971 +C: "OO", 5804123971, 5804590193 +C: "OO", 5804590193, 5805909743 +C: "OO", 5805909743, 5806021743 +C: "OO", 5806021743, 5807195109 +C: "OO", 5807195109, 5807612965 +C: "OO", 5807612965, 5807957162 +C: "OO", 5807957162, 5808423397 +C: "OO", 5808423397, 5808593350 +C: "OO", 5808593350, 5809163487 +C: "OO", 5809163487, 5809656710 +C: "OO", 5809656710, 5809669780 +C: "OO", 5809669780, 5809829399 +C: "OO", 5809829399, 5809904651 +C: "OO", 5809904651, 5812002807 +C: "OO", 5812002807, 5812207494 +C: "OO", 5812207494, 5812665422 +C: "OO", 5812665422, 5812835597 +C: "OO", 5812835597, 5813336403 +C: "OO", 5813336403, 5813533520 +C: "OO", 5813533520, 5813702587 +C: "OO", 5813702587, 5814423082 +C: "OO", 5814423082, 5814730473 +C: "OO", 5814730473, 5815042645 +C: "OO", 5815042645, 5815493886 +C: "OO", 5815493886, 5816532806 +C: "OO", 5816532806, 5816802188 +C: "OO", 5816802188, 5817309919 +C: "OO", 5817309919, 5818699986 +C: "OO", 5818699986, 5819799471 +C: "OO", 5819799471, 5820180109 +C: "OO", 5820180109, 5820788847 +C: "OO", 5820788847, 5821256876 +C: "OO", 5821256876, 5821300011 +C: "OO", 5821300011, 5821765889 +C: "OO", 5821765889, 5822803531 +C: "OO", 5822803531, 5822890691 +C: "OO", 5822890691, 5823425190 +C: "OO", 5823425190, 5823557619 +C: "OO", 5823557619, 5823864543 +C: "OO", 5823864543, 5823911773 +C: "OO", 5823911773, 5825009278 +C: "OO", 5825009278, 5825227679 +C: "OO", 5825227679, 5825970134 +C: "OO", 5825970134, 5826791501 +C: "OO", 5826791501, 5827070636 +C: "OO", 5827070636, 5827257212 +C: "OO", 5827257212, 5827601551 +C: "OO", 5827601551, 5827786169 +C: "OO", 5827786169, 5828132233 +C: "OO", 5828132233, 5829170793 +C: "OO", 5829170793, 5829273355 +C: "OO", 5829273355, 5831052290 +C: "OO", 5831052290, 5831073663 +C: "OO", 5831073663, 5831109669 +C: "OO", 5831109669, 5831294135 +C: "OO", 5831294135, 5831339987 +C: "OO", 5831339987, 5831584585 +C: "OO", 5831584585, 5832023648 +C: "OO", 5832023648, 5832331198 +C: "OO", 5832331198, 5832337487 +C: "OO", 5832337487, 5833115825 +C: "OO", 5833115825, 5834101575 +C: "OO", 5834101575, 5834574639 +C: "OO", 5834574639, 5837057300 +C: "OO", 5837057300, 5837828363 +C: "OO", 5837828363, 5838166717 +C: "OO", 5838166717, 5838324521 +C: "OO", 5838324521, 5839123025 +C: "OO", 5839123025, 5839643726 +C: "OO", 5839643726, 5839676761 +C: "OO", 5839676761, 5840116474 +C: "OO", 5840116474, 5841009299 +C: "OO", 5841009299, 5842426699 +C: "OO", 5842426699, 5843184754 +C: "OO", 5843184754, 5843934323 +C: "OO", 5843934323, 5844548790 +C: "OO", 5844548790, 5845275659 +C: "OO", 5845275659, 5846021259 +C: "OO", 5846021259, 5846519462 +C: "OO", 5846519462, 5847107576 +C: "OO", 5847107576, 5847123267 +C: "OO", 5847123267, 5848731335 +C: "OO", 5848731335, 5849598034 +C: "OO", 5849598034, 5850473687 +C: "OO", 5850473687, 5850760191 +C: "OO", 5850760191, 5851641454 +C: "OO", 5851641454, 5851802733 +C: "OO", 5851802733, 5852304625 +C: "OO", 5852304625, 5853368083 +C: "OO", 5853368083, 5853706507 +C: "OO", 5853706507, 5855241034 +C: "OO", 5855241034, 5857153141 +C: "OO", 5857153141, 5858514503 +C: "OO", 5858514503, 5858781067 +C: "OO", 5858781067, 5858915630 +C: "OO", 5858915630, 5859492978 +C: "OO", 5859492978, 5859665692 +C: "OO", 5859665692, 5860104702 +C: "OO", 5860104702, 5860173999 +C: "OO", 5860173999, 5861249085 +C: "OO", 5861249085, 5861622945 +C: "OO", 5861622945, 5862395837 +C: "OO", 5862395837, 5862553492 +C: "OO", 5862553492, 5863149426 +C: "OO", 5863149426, 5863364491 +C: "OO", 5863364491, 5863367355 +C: "OO", 5863367355, 5863546819 +C: "OO", 5863546819, 5863879361 +C: "OO", 5863879361, 5864544763 +C: "OO", 5864544763, 5864986793 +C: "OO", 5864986793, 5865022039 +C: "OO", 5865022039, 5865892985 +C: "OO", 5865892985, 5866324622 +C: "OO", 5866324622, 5866816052 +C: "OO", 5866816052, 5867060234 +C: "OO", 5867060234, 5867607511 +C: "OO", 5867607511, 5867861695 +C: "OO", 5867861695, 5868335792 +C: "OO", 5868335792, 5868466517 +C: "OO", 5868466517, 5869717099 +C: "OO", 5869717099, 5869778847 +C: "OO", 5869778847, 5870081456 +C: "OO", 5870081456, 5870441806 +C: "OO", 5870441806, 5870769762 +C: "OO", 5870769762, 5871678897 +C: "OO", 5871678897, 5872724623 +C: "OO", 5872724623, 5873004507 +C: "OO", 5873004507, 5873524859 +C: "OO", 5873524859, 5873629747 +C: "OO", 5873629747, 5873804085 +C: "OO", 5873804085, 5875531158 +C: "OO", 5875531158, 5875794140 +C: "OO", 5875794140, 5875804397 +C: "OO", 5875804397, 5875875183 +C: "OO", 5875875183, 5876897534 +C: "OO", 5876897534, 5877298435 +C: "OO", 5877298435, 5877715479 +C: "OO", 5877715479, 5878508927 +C: "OO", 5878508927, 5878920262 +C: "OO", 5878920262, 5880220123 +C: "OO", 5880220123, 5880286094 +C: "OO", 5880286094, 5882665959 +C: "OO", 5882665959, 5882887993 +C: "OO", 5882887993, 5883633571 +C: "OO", 5883633571, 5883838098 +C: "OO", 5883838098, 5883885391 +C: "OO", 5883885391, 5884611086 +C: "OO", 5884611086, 5884926997 +C: "OO", 5884926997, 5885232955 +C: "OO", 5885232955, 5885278754 +C: "OO", 5885278754, 5885328061 +C: "OO", 5885328061, 5886251070 +C: "OO", 5886251070, 5887242607 +C: "OO", 5887242607, 5888308037 +C: "OO", 5888308037, 5889339966 +C: "OO", 5889339966, 5889997022 +C: "OO", 5889997022, 5890816803 +C: "OO", 5890816803, 5891249735 +C: "OO", 5891249735, 5893143069 +C: "OO", 5893143069, 5894416218 +C: "OO", 5894416218, 5894817989 +C: "OO", 5894817989, 5896032627 +C: "OO", 5896032627, 5896664543 +C: "OO", 5896664543, 5896678940 +C: "OO", 5896678940, 5896682318 +C: "OO", 5896682318, 5897536491 +C: "OO", 5897536491, 5898173867 +C: "OO", 5898173867, 5898702830 +C: "OO", 5898702830, 5898811054 +C: "OO", 5898811054, 5898867979 +C: "OO", 5898867979, 5900100178 +C: "OO", 5900100178, 5901081260 +C: "OO", 5901081260, 5901226382 +C: "OO", 5901226382, 5901232523 +C: "OO", 5901232523, 5902132794 +C: "OO", 5902132794, 5902564388 +C: "OO", 5902564388, 5902650869 +C: "OO", 5902650869, 5903798636 +C: "OO", 5903798636, 5903942575 +C: "OO", 5903942575, 5904087460 +C: "OO", 5904087460, 5904749938 +C: "OO", 5904749938, 5905629723 +C: "OO", 5905629723, 5905870870 +C: "OO", 5905870870, 5906908814 +C: "OO", 5906908814, 5907119649 +C: "OO", 5907119649, 5907790797 +C: "OO", 5907790797, 5909237204 +C: "OO", 5909237204, 5910325467 +C: "OO", 5910325467, 5910327309 +C: "OO", 5910327309, 5911555129 +C: "OO", 5911555129, 5911952960 +C: "OO", 5911952960, 5912859989 +C: "OO", 5912859989, 5912982131 +C: "OO", 5912982131, 5913227623 +C: "OO", 5913227623, 5913327021 +C: "OO", 5913327021, 5913826294 +C: "OO", 5913826294, 5914038089 +C: "OO", 5914038089, 5914569902 +C: "OO", 5914569902, 5914671871 +C: "OO", 5914671871, 5915753019 +C: "OO", 5915753019, 5916591599 +C: "OO", 5916591599, 5916690807 +C: "OO", 5916690807, 0 + +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_indexed_by_vertex_7500_ascii.fbx b/modules/ufbx/data/synthetic_indexed_by_vertex_7500_ascii.fbx new file mode 100644 index 0000000..18817e7 --- /dev/null +++ b/modules/ufbx/data/synthetic_indexed_by_vertex_7500_ascii.fbx @@ -0,0 +1,378 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 6 + Hour: 15 + Minute: 52 + Second: 24 + Millisecond: 109 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_indexed_by_vertex_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_indexed_by_vertex_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "06/08/2021 12:52:24.108" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_indexed_by_vertex_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "06/08/2021 12:52:24.108" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2093283394976, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2092169136384, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5, 0.5,-0.5,0.5, -0.5,0.5,0.5, 0.5,0.5,0.5, -0.5,0.5,-0.5, 0.5,0.5,-0.5, -0.5,-0.5,-0.5, 0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "IndexToDirect" + Normals: *6 { + a: 0,-1,0, 0,1,0 + } + NormalsIndex: *8 { + a: 0,0,1,1,1,1,0,0 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2090157718112, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2092279121760, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2093307673664, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2092416809472, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2090157718112,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2092416809472,2093307673664 + + ;Geometry::, Model::pCube1 + C: "OO",2092169136384,2090157718112 + + ;Material::lambert1, Model::pCube1 + C: "OO",2092279121760,2090157718112 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_legacy_nonzero_material_5800_ascii.fbx b/modules/ufbx/data/synthetic_legacy_nonzero_material_5800_ascii.fbx new file mode 100644 index 0000000..413b744 --- /dev/null +++ b/modules/ufbx/data/synthetic_legacy_nonzero_material_5800_ascii.fbx @@ -0,0 +1,1351 @@ +; FBX 5.8.0 project file +; Copyright (C) 1997-2007 Autodesk Inc. and/or its licensors. +; All rights reserved. +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 5800 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 29 + Hour: 11 + Minute: 37 + Second: 14 + Millisecond: 227 + } + Creator: "FBX SDK/FBX Plugins build 20080212" + OtherFlags: { + FlagPLE: 0 + } +} +CreationTime: "2021-08-29 11:37:14:227" +Creator: "FBX SDK/FBX Plugins build 20080212" +Media: { + Video: { + } +} +Switcher: { + CameraIndexName: "Model::Camera01" +} +Model: "Model::FDirect02" { + Version: 194 + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Limits: { + TAuto: 1 + RAuto: 0 + SAuto: 1 + REnable: 0 + RXAxis: -90 + } + AnimatedProperty: "mTranslationProperty", "mRotationProperty", "mScalingProperty" + Animated: "Lcl Translation", "Lcl Rotation", "Lcl Scaling" + Type: "Light" + TypeFlags: "Light" + GeometryVersion: 123 + LightTypeVersion: 202 + LightType: 1 + CastLight: 1 + Color: 0.533333361148834,0.858823597431183,0.647058844566345 + Intensity: 100 + ConeAngle: 45 + Fog: 0 +} +Model: "Model::Omni01" { + Version: 194 + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Limits: { + TAuto: 1 + RAuto: 0 + SAuto: 1 + REnable: 0 + RXAxis: -90 + } + AnimatedProperty: "mTranslationProperty", "mRotationProperty", "mScalingProperty" + Animated: "Lcl Translation", "Lcl Rotation", "Lcl Scaling" + Type: "Light" + TypeFlags: "Light" + GeometryVersion: 123 + LightTypeVersion: 202 + LightType: 0 + CastLight: 1 + Color: 0.172549024224281,0.364705890417099,1 + Intensity: 100 + ConeAngle: 45 + Fog: 0 +} +Model: "Model::Camera01" { + Version: 194 + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Limits: { + TAuto: 1 + RAuto: 0 + SAuto: 1 + REnable: 0 + RYAxis: -90 + } + AnimatedProperty: "mTranslationProperty", "mRotationProperty", "mScalingProperty" + Animated: "Lcl Translation", "Lcl Rotation", "Lcl Scaling" + Type: "Camera" + TypeFlags: "Camera" + Version: 220 + Name: "Model::Camera01" + Position: 113.362701416016,-2.43022918701172,0 + Up: 0,0,1 + LookAt: 111.954688727284,157.563575381379,0 + Roll: 0 + TurnTable: 0 + Type: 0 + FormatName: "Custom" + AspectType: 0 + AspectW: 0 + AspectH: 0 + PixelRatio: 1 + NearPlane: 10 + FarPlane: 4000 + CameraLock: 0 + ApertureFormat: "Custom" + ApertureMode: 1 + CameraAperture: 1.41732287406921,1.06299209594727 + SqueezeRatio: 1 + FocalLength: 43.4558439883016 + Aperture: 45.0000012522391 + FieldOfViewXProperty: 40 + FieldOfViewYProperty: 40 + OpticalCenterXProperty: 0 + OpticalCenterYProperty: 0 + ViewFrustumPlane: 2 + BackgroundMode: 0 + ForegroundTransparent: 1 + BackgroundTreshold: 0.5 + DisplayMode: 6 + ViewFrustumPlaneDistance: 100 + ViewFrustumPlaneDistanceMode: 0 + ViewLookAt: 1 + ViewFrustum: 0 + ShowGrid: 1 + ShowAzimut: 1 + ShowName: 1 + ShowInfoOnMoving: 1 + ShowTimeCode: 0 + DisplaySafeArea: 0 + SafeAreaStyle: 1 + DisplaySafeAreaOnRender: 0 + ShowAudio: 0 + BackGroundColor: 0.63,0.63,0.63 + AudioColor: 0,1,0 + UseFrameColor: 0 + FrameColor: 0.3,0.3,0.3 + CameraAndLens: { + DepthOfField: 0,0,3.5,200 + Antialiasing: 0,0,0.77777 + OverSampling: 7,1,0 + UseOverSamplingTime: 0 + } +} +Model: "Model::Fspot01" { + Version: 194 + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Limits: { + TAuto: 1 + RAuto: 0 + SAuto: 1 + REnable: 0 + RXAxis: -90 + } + AnimatedProperty: "mTranslationProperty", "mRotationProperty", "mScalingProperty" + Animated: "Lcl Translation", "Lcl Rotation", "Lcl Scaling" + Type: "Light" + TypeFlags: "Light" + GeometryVersion: 123 + LightTypeVersion: 202 + LightType: 2 + CastLight: 1 + Color: 0.972549080848694,0.0705882385373116,0.0705882385373116 + Intensity: 100 + ConeAngle: 45 + Fog: 0 +} +Model: "Model::Box01" { + Version: 194 + MultiLayer: 0 + MultiTake: 1 + Shading: T + Culling: "CullingOff" + Limits: { + TAuto: 1 + RAuto: 1 + SAuto: 1 + } + AnimatedProperty: "mTranslationProperty", "mRotationProperty", "mScalingProperty" + Animated: "Lcl Translation", "Lcl Rotation", "Lcl Scaling" + Material: "Material::Right" { + Version: 100 + ShadingModel: "phong" + Ambient: 0.588235318660736,0.588235318660736,0.588235318660736 + Diffuse: 0.588235318660736,0.588235318660736,0.588235318660736 + Specular: 0,0,0 + Emissive: 0,0.803921639919281,0 + Shininess: 7.99999900844507 + Alpha: 1 + Reflectivity: 1 + } + Material: "Material::Left" { + Version: 100 + ShadingModel: "phong" + Ambient: 0.588235318660736,0.588235318660736,0.588235318660736 + Diffuse: 0.588235318660736,0.588235318660736,0.588235318660736 + Specular: 0.179999984502793,0.179999984502793,0.179999984502793 + Emissive: 0.823529481887817,0,0 + Shininess: 1.99999991737042 + Alpha: 1 + Reflectivity: 1 + } + GeometryVersion: 123 + Vertices: 0,0,0, 1,0,0, 0,1,0 + MaterialAssignation: "AllSame" + Materials: 1 + PolygonVertexIndex: 0,1,-2 + GeometryUVInfo: { + Version: 240 + MappingInformationType: "ByPolygon" + TextureUV: 0,0,1,0,0,1 + TextureUVVerticeIndex: 0,1,2 + } +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,36948926400 + ReferenceTime: 0,36948926400 + ;Models animation + ;---------------------------------------------------- + + Model: "Model::FDirect02" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 25.8810729980469 + Color: 1,1,1 + } + Channel: "Y" { + Default: -53.8989562988281 + Color: 1,1,1 + } + Channel: "Z" { + Default: 113.885711669922 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 27.5977668762207 + Color: 1,1,1 + } + Channel: "Y" { + Default: -0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Omni01" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -17.43505859375 + Color: 1,1,1 + } + Channel: "Y" { + Default: 43.0893516540527 + Color: 1,1,1 + } + Channel: "Z" { + Default: 74.018310546875 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Camera01" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 113.362701416016 + Color: 1,1,1 + } + Channel: "Y" { + Default: -2.43022918701172 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 90 + Color: 1,1,1 + } + Channel: "Y" { + Default: -0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 90.5042114257813 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Fspot01" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 84.9012756347656 + Color: 1,1,1 + } + Channel: "Y" { + Default: 73.4773101806641 + Color: 1,1,1 + } + Channel: "Z" { + Default: 101.438201904297 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 42.467155456543 + Color: 1,1,1 + } + Channel: "Z" { + Default: 32.9069976806641 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Box01" { + Version: 1.1 + Channel: "Transform" { + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 2 + Key: 0,0,U,s,0,-0,a,0.333233326673508,0.333233326673508,36948926400,0,U,s,0,0,r,0.989998996257782 + + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 2 + Key: 0,0,U,s,0,-0,a,0.333233326673508,0.333233326673508,36948926400,0,U,s,0,0,r,0.989998996257782 + + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 2 + Key: 0,0,U,s,0,-0,a,0.333233326673508,0.333233326673508,36948926400,-167.801681518555,U + ,s,0,0,r,0.989998996257782 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "T" { + Channel: "X" { + Default: 0.860116004943848 + Color: 1,1,1 + } + Channel: "Y" { + Default: 2.74418640136719 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid04" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -40.4315414428711 + Color: 1,1,1 + } + Channel: "Y" { + Default: -41.1997528076172 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid05" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -40.4315414428711 + Color: 1,1,1 + } + Channel: "Y" { + Default: -15.0629539489746 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid06" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -40.4315414428711 + Color: 1,1,1 + } + Channel: "Y" { + Default: 11.073844909668 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid07" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -40.4315414428711 + Color: 1,1,1 + } + Channel: "Y" { + Default: 37.2106437683105 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid08" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -11.3556032180786 + Color: 1,1,1 + } + Channel: "Y" { + Default: -15.0629539489746 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid09" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -11.3556032180786 + Color: 1,1,1 + } + Channel: "Y" { + Default: 11.073844909668 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid10" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -11.3556032180786 + Color: 1,1,1 + } + Channel: "Y" { + Default: 37.2106437683105 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid11" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: -11.3556032180786 + Color: 1,1,1 + } + Channel: "Y" { + Default: -41.1997528076172 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid12" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 17.7203369140625 + Color: 1,1,1 + } + Channel: "Y" { + Default: -15.0629539489746 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid13" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 17.7203369140625 + Color: 1,1,1 + } + Channel: "Y" { + Default: 11.073844909668 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid14" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 17.7203369140625 + Color: 1,1,1 + } + Channel: "Y" { + Default: 37.2106437683105 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid15" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 17.7203369140625 + Color: 1,1,1 + } + Channel: "Y" { + Default: -41.1997528076172 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid16" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 46.7962760925293 + Color: 1,1,1 + } + Channel: "Y" { + Default: -15.0629539489746 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid17" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 46.7962760925293 + Color: 1,1,1 + } + Channel: "Y" { + Default: 11.073844909668 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid18" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 46.7962760925293 + Color: 1,1,1 + } + Channel: "Y" { + Default: 37.2106437683105 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + Model: "Model::Pyramid19" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 46.7962760925293 + Color: 1,1,1 + } + Channel: "Y" { + Default: -41.1997528076172 + Color: 1,1,1 + } + Channel: "Z" { + Default: -25.7016258239746 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + } +} +GoboManager: { +} +SceneGenericPersistence: { + SceneInfo: "SceneInfo::GlobalInfo" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + } +} +AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 +} +FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 +} +RendererSetting: { + DefaultCamera: "" + DefaultViewingMode: 0 +} +Settings: { + TimeMode: 3 + FrameRate: "30" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 +} diff --git a/modules/ufbx/data/synthetic_map_feature_0_mtl.mtl b/modules/ufbx/data/synthetic_map_feature_0_mtl.mtl new file mode 100644 index 0000000..1233578 --- /dev/null +++ b/modules/ufbx/data/synthetic_map_feature_0_mtl.mtl @@ -0,0 +1,19 @@ + +newmtl Phong +map_Kd diffuse.png +map_Ks specular.png + +newmtl PBR +map_Pr roughness.png +map_Pm metalness.png + +newmtl Extended +map_Ps sheen.png +map_Pc coat.png +map_Pm metalness.png +map_Ni ior.png +map_d opacity.png +map_Tf transmission.png +map_Ke emission.png + + diff --git a/modules/ufbx/data/synthetic_missing_exporter_6100_ascii.fbx b/modules/ufbx/data/synthetic_missing_exporter_6100_ascii.fbx new file mode 100644 index 0000000..b2fe8d2 --- /dev/null +++ b/modules/ufbx/data/synthetic_missing_exporter_6100_ascii.fbx @@ -0,0 +1,1980 @@ +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 01 + Day: 19 + Hour: 15 + Minute: 41 + Second: 02 + Millisecond: 0 + } + OtherFlags: { + FlagPLE: 0 + } +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 11 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Camera", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",7.481131553649902,5.343665122985840,6.507639884948730 + Property: "Lcl Rotation", "Lcl Rotation", "A+",22.768806135967264,142.108342135190838,34.348488581189514 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",49.134342 + Property: "FieldOfViewX", "FieldOfView", "A+",49.134342 + Property: "FieldOfViewY", "FieldOfView", "A+",28.841546 + Property: "FocalLength", "Number", "A+",35.000000 + Property: "FilmOffsetX", "Number", "A+",0.000000 + Property: "FilmOffsetY", "Number", "A+",0.000000 + Property: "BackgroundColor", "Color", "A+",0,0,0 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",3 + Property: "GateFit", "enum", "",2 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",1920 + Property: "AspectH", "double", "",1080 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",0.100000 + Property: "FarPlane", "double", "",99.999994 + Property: "FilmWidth", "double", "",1.259843 + Property: "FilmHeight", "double", "",0.708661 + Property: "FilmAspectRatio", "double", "",1.777778 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",0 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.777778 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 7.481132,5.343665,6.507640 + Up: -0.324014,0.895396,-0.305421 + LookAt: -0.685921,0.000000,0.727677 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Lamp", "Light" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4.076245307922363,5.903861999511719,-1.005453944206238 + Property: "Lcl Rotation", "Lcl Rotation", "A+",47.533574547422390,107.220753553002154,10.743666437040241 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,0.999999940395355,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + Property: "LightType", "enum", "",0 + Property: "CastLightOnObject", "bool", "",1 + Property: "DrawVolumetricLight", "bool", "",1 + Property: "DrawGroundProjection", "bool", "",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "",0 + Property: "GoboProperty", "object", "" + Property: "Color", "Color", "A+",1,1,1 + Property: "Fog", "Fog", "A+",50 + Property: "Color", "Color", "A",1.00,1.00,1.00 + Property: "Intensity", "Intensity", "A+",100.00 + Property: "Fog", "Fog", "A+",50 + Property: "LightType", "enum", "",0 + Property: "CastLightOnObject", "bool", "",1 + Property: "DrawGroundProjection", "bool", "",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "",0 + Property: "DrawVolumetricLight", "bool", "",1 + Property: "GoboProperty", "object", "" + Property: "DecayType", "enum", "",2 + Property: "EnableFarAttenuation", "bool", "",1 + Property: "FarAttenuationEnd", "double", "",60.00 + Property: "CastShadows", "bool", "",1 + Property: "ShadowColor", "ColorRGBA", "",0,0,0,1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Light" + GeometryVersion: 124 + } + Model: "Model::Cube", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: 1.000000,1.000000,-1.000000,1.000000,-1.000000,-1.000000,-1.000000,-1.000000,-1.000000,-1.000000,1.000000,-1.000000, + 1.000000,0.999999,1.000000,0.999999,-1.000001,1.000000,-1.000000,-1.000000,1.000000,-1.000000,1.000000,1.000000 + PolygonVertexIndex: 0,1,2,-4,4,7,6,-6,0,4,5,-2,1,5,6,-3,2,6,7,-4,4,0,3,-8 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000, + -0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000, + -1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::Material", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 1 + PoseNode: { + Node: "Model::Cube" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Cube", "Mesh" { + } + Model: "Model::Camera", "Camera" { + } + Model: "Model::Lamp", "Light" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::Material", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Cube", "Model::Scene" + Connect: "OO", "Model::Lamp", "Model::Scene" + Connect: "OO", "Model::Camera", "Model::Scene" + Connect: "OO", "Material::Material", "Model::Cube" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Cube" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Camera" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 7.481131553649902 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,7.481131553649902,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 5.343665122985840 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,5.343665122985840,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 6.507639884948730 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,6.507639884948730,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 22.768802720872678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,22.768802720872678,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 142.108328474812481 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,142.108328474812481,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 34.348495411378678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,34.348495411378678,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Lamp" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 4.076245307922363 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,4.076245307922363,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 5.903861999511719 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,5.903861999511719,L + Color: 0,1,0 + } + Channel: "Z" { + Default: -1.005453944206238 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-1.005453944206238,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 47.533574547422390 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,47.533574547422390,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 107.220760383191333 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,107.220760383191333,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 10.743664729492949 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,10.743664729492949,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.999999940395355 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.999999940395355,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_missing_material_factor_6100_ascii.fbx b/modules/ufbx/data/synthetic_missing_material_factor_6100_ascii.fbx new file mode 100644 index 0000000..cbaf85e --- /dev/null +++ b/modules/ufbx/data/synthetic_missing_material_factor_6100_ascii.fbx @@ -0,0 +1,337 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 11 + Hour: 16 + Minute: 47 + Second: 41 + Millisecond: 673 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_missing_material_factor_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_missing_material_factor_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "11/06/2022 13:47:41.672" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_missing_material_factor_6100_ascii.fbx" + + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "11/06/2022 13:47:41.672" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::phong1", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0.100000001490116,0.109999999403954,0.119999997317791 + Property: "AmbientColor", "Color", "A",0.0700000002980232,0.0799999982118607,0.0900000035762787 + Property: "DiffuseColor", "Color", "A",0.00999999977648258,0.0199999995529652,0.0299999993294477 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "TransparentColor", "Color", "A",0.0399999991059303,0.0500000007450581,0.0599999986588955 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "SpecularColor", "Color", "A",0.129999995231628,0.140000000596046,0.150000005960464 + Property: "ShininessExponent", "Number", "A",20 + Property: "ReflectionColor", "Color", "A",0.159999996423721,0.170000001788139,0.180000007152557 + Property: "Emissive", "Vector3D", "",0.100000001490116,0.109999999403954,0.119999997317791 + Property: "Ambient", "Vector3D", "",0.0700000002980232,0.0799999982118607,0.0900000035762787 + Property: "Diffuse", "Vector3D", "",0.00799999994039535,0.0159999998807907,0.0239999998211861 + Property: "Specular", "Vector3D", "",0.129999995231628,0.140000000596046,0.150000005960464 + Property: "Shininess", "double", "",20 + Property: "Opacity", "double", "",0.950000000496705 + Property: "Reflectivity", "double", "",0.0272000010967255 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::phong1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_missing_normals_7400_ascii.fbx b/modules/ufbx/data/synthetic_missing_normals_7400_ascii.fbx new file mode 100644 index 0000000..19872f3 --- /dev/null +++ b/modules/ufbx/data/synthetic_missing_normals_7400_ascii.fbx @@ -0,0 +1,412 @@ +; FBX 7.4.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7400 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 10 + Millisecond: 814 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7400_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7400_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:10.811" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7400_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:10.811" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658701024, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1907663073408, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1907292236800, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1908464858960, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907674289488, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631731008, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1907292236800,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631731008,1907674289488 + + ;Geometry::, Model::pCube1 + C: "OO",1907663073408,1907292236800 + + ;Material::lambert1, Model::pCube1 + C: "OO",1908464858960,1907292236800 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_missing_position_fail_0_obj.obj b/modules/ufbx/data/synthetic_missing_position_fail_0_obj.obj new file mode 100644 index 0000000..10f04d0 --- /dev/null +++ b/modules/ufbx/data/synthetic_missing_position_fail_0_obj.obj @@ -0,0 +1,5 @@ +vt 1 0 +vt 0 1 +vt 1 1 +f /1 /2 /3 + diff --git a/modules/ufbx/data/synthetic_missing_version_6100_ascii.fbx b/modules/ufbx/data/synthetic_missing_version_6100_ascii.fbx new file mode 100644 index 0000000..c63a2b4 --- /dev/null +++ b/modules/ufbx/data/synthetic_missing_version_6100_ascii.fbx @@ -0,0 +1,1981 @@ +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 01 + Day: 19 + Hour: 15 + Minute: 41 + Second: 02 + Millisecond: 0 + } + Creator: "FBX SDK/FBX Plugins build 20070228" + OtherFlags: { + FlagPLE: 0 + } +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 11 + } + ObjectType: "Geometry" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Camera Switcher", "CameraSwitcher" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Camera Index", "Integer", "A+",100 + } + MultiLayer: 0 + MultiTake: 1 + Hidden: "True" + Shading: W + Culling: "CullingOff" + Version: 101 + Name: "Model::Camera Switcher" + CameraId: 0 + CameraName: 100 + CameraIndexName: + } + Model: "Model::Camera", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",7.481131553649902,5.343665122985840,6.507639884948730 + Property: "Lcl Rotation", "Lcl Rotation", "A+",22.768806135967264,142.108342135190838,34.348488581189514 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",49.134342 + Property: "FieldOfViewX", "FieldOfView", "A+",49.134342 + Property: "FieldOfViewY", "FieldOfView", "A+",28.841546 + Property: "FocalLength", "Number", "A+",35.000000 + Property: "FilmOffsetX", "Number", "A+",0.000000 + Property: "FilmOffsetY", "Number", "A+",0.000000 + Property: "BackgroundColor", "Color", "A+",0,0,0 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",3 + Property: "GateFit", "enum", "",2 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",1920 + Property: "AspectH", "double", "",1080 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",0.100000 + Property: "FarPlane", "double", "",99.999994 + Property: "FilmWidth", "double", "",1.259843 + Property: "FilmHeight", "double", "",0.708661 + Property: "FilmAspectRatio", "double", "",1.777778 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",0 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.777778 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 7.481132,5.343665,6.507640 + Up: -0.324014,0.895396,-0.305421 + LookAt: -0.685921,0.000000,0.727677 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Lamp", "Light" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4.076245307922363,5.903861999511719,-1.005453944206238 + Property: "Lcl Rotation", "Lcl Rotation", "A+",47.533574547422390,107.220753553002154,10.743666437040241 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,0.999999940395355,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + Property: "LightType", "enum", "",0 + Property: "CastLightOnObject", "bool", "",1 + Property: "DrawVolumetricLight", "bool", "",1 + Property: "DrawGroundProjection", "bool", "",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "",0 + Property: "GoboProperty", "object", "" + Property: "Color", "Color", "A+",1,1,1 + Property: "Fog", "Fog", "A+",50 + Property: "Color", "Color", "A",1.00,1.00,1.00 + Property: "Intensity", "Intensity", "A+",100.00 + Property: "Fog", "Fog", "A+",50 + Property: "LightType", "enum", "",0 + Property: "CastLightOnObject", "bool", "",1 + Property: "DrawGroundProjection", "bool", "",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "",0 + Property: "DrawVolumetricLight", "bool", "",1 + Property: "GoboProperty", "object", "" + Property: "DecayType", "enum", "",2 + Property: "EnableFarAttenuation", "bool", "",1 + Property: "FarAttenuationEnd", "double", "",60.00 + Property: "CastShadows", "bool", "",1 + Property: "ShadowColor", "ColorRGBA", "",0,0,0,1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Light" + GeometryVersion: 124 + } + Model: "Model::Cube", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",-90.000009334538021,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Size", "double", "",100 + Property: "Look", "enum", "",1 + } + MultiLayer: 0 + MultiTake: 1 + Shading: Y + Culling: "CullingOff" + Vertices: 1.000000,1.000000,-1.000000,1.000000,-1.000000,-1.000000,-1.000000,-1.000000,-1.000000,-1.000000,1.000000,-1.000000, + 1.000000,0.999999,1.000000,0.999999,-1.000001,1.000000,-1.000000,-1.000000,1.000000,-1.000000,1.000000,1.000000 + PolygonVertexIndex: 0,1,2,-4,4,7,6,-6,0,4,5,-2,1,5,6,-3,2,6,7,-4,4,0,3,-8 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-1.000000, + 0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000, + 1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000,1.000000,-0.000000,0.000000, + -0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000,-0.000000,-1.000000,-0.000000, + -1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000,-1.000000,0.000000,-0.000000, + 0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + } + Model: "Model::Producer Perspective", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,71.299999999999997,287.500000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",10.000000 + Property: "FarPlane", "double", "",4000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",0 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,71.300000,287.500000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Top", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Bottom", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,-4000.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,-4000.000000,0.000000 + Up: 0,0,-1 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Front", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Back", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",0.000000000000000,0.000000000000000,-4000.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 0.000000,0.000000,-4000.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Right", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: 4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Model: "Model::Producer Left", "Camera" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "bool", "",0 + Property: "Visibility", "Visibility", "A+",1 + Property: "Lcl Translation", "Lcl Translation", "A+",-4000.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0.000000000000000,0.000000000000000,0.000000000000000 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1.000000000000000,1.000000000000000,1.000000000000000 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",1,1,1 + Property: "ScalingMax", "Vector3D", "",1,1,1 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Color", "Color", "A",0.8,0.8,0.8 + Property: "Roll", "Roll", "A+",0 + Property: "FieldOfView", "FieldOfView", "A+",40 + Property: "FieldOfViewX", "FieldOfView", "A+",1 + Property: "FieldOfViewY", "FieldOfView", "A+",1 + Property: "OpticalCenterX", "Real", "A+",0 + Property: "OpticalCenterY", "Real", "A+",0 + Property: "BackgroundColor", "Color", "A+",0.63,0.63,0.63 + Property: "TurnTable", "Real", "A+",0 + Property: "DisplayTurnTableIcon", "bool", "",1 + Property: "Motion Blur Intensity", "Real", "A+",1 + Property: "UseMotionBlur", "bool", "",0 + Property: "UseRealTimeMotionBlur", "bool", "",1 + Property: "ResolutionMode", "enum", "",0 + Property: "ApertureMode", "enum", "",2 + Property: "GateFit", "enum", "",0 + Property: "FocalLength", "Real", "A+",21.3544940948486 + Property: "CameraFormat", "enum", "",0 + Property: "AspectW", "double", "",320 + Property: "AspectH", "double", "",200 + Property: "PixelAspectRatio", "double", "",1 + Property: "UseFrameColor", "bool", "",0 + Property: "FrameColor", "ColorRGB", "",0.3,0.3,0.3 + Property: "ShowName", "bool", "",1 + Property: "ShowGrid", "bool", "",1 + Property: "ShowOpticalCenter", "bool", "",0 + Property: "ShowAzimut", "bool", "",1 + Property: "ShowTimeCode", "bool", "",0 + Property: "NearPlane", "double", "",1.000000 + Property: "FarPlane", "double", "",30000.000000 + Property: "FilmWidth", "double", "",0.816 + Property: "FilmHeight", "double", "",0.612 + Property: "FilmAspectRatio", "double", "",1.33333333333333 + Property: "FilmSqueezeRatio", "double", "",1 + Property: "FilmFormatIndex", "enum", "",4 + Property: "ViewFrustum", "bool", "",1 + Property: "ViewFrustumNearFarPlane", "bool", "",0 + Property: "ViewFrustumBackPlaneMode", "enum", "",2 + Property: "BackPlaneDistance", "double", "",100 + Property: "BackPlaneDistanceMode", "enum", "",0 + Property: "ViewCameraToLookAt", "bool", "",1 + Property: "LockMode", "bool", "",0 + Property: "LockInterestNavigation", "bool", "",0 + Property: "FitImage", "bool", "",0 + Property: "Crop", "bool", "",0 + Property: "Center", "bool", "",1 + Property: "KeepRatio", "bool", "",1 + Property: "BackgroundMode", "enum", "",0 + Property: "BackgroundAlphaTreshold", "double", "",0.5 + Property: "ForegroundTransparent", "bool", "",1 + Property: "DisplaySafeArea", "bool", "",0 + Property: "SafeAreaDisplayStyle", "enum", "",1 + Property: "SafeAreaAspectRatio", "double", "",1.33333333333333 + Property: "Use2DMagnifierZoom", "bool", "",0 + Property: "2D Magnifier Zoom", "Real", "A+",100 + Property: "2D Magnifier X", "Real", "A+",50 + Property: "2D Magnifier Y", "Real", "A+",50 + Property: "CameraProjectionType", "enum", "",1 + Property: "UseRealTimeDOFAndAA", "bool", "",0 + Property: "UseDepthOfField", "bool", "",0 + Property: "FocusSource", "enum", "",0 + Property: "FocusAngle", "double", "",3.5 + Property: "FocusDistance", "double", "",200 + Property: "UseAntialiasing", "bool", "",0 + Property: "AntialiasingIntensity", "double", "",0.77777 + Property: "UseAccumulationBuffer", "bool", "",0 + Property: "FrameSamplingCount", "int", "",7 + } + MultiLayer: 0 + MultiTake: 0 + Hidden: "True" + Shading: Y + Culling: "CullingOff" + TypeFlags: "Camera" + GeometryVersion: 124 + Position: -4000.000000,0.000000,0.000000 + Up: 0,1,0 + LookAt: 0,0,0 + ShowInfoOnMoving: 1 + ShowAudio: 0 + AudioColor: 0,1,0 + CameraOrthoZoom: 1 + } + Material: "Material::Material", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "EmissiveFactor", "double", "",0.0000 + Property: "AmbientColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "AmbientFactor", "double", "",1.0000 + Property: "DiffuseColor", "ColorRGB", "",0.8000,0.8000,0.8000 + Property: "DiffuseFactor", "double", "",0.8000 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "TransparentColor", "ColorRGB", "",1,1,1 + Property: "TransparencyFactor", "double", "",0.0000 + Property: "SpecularColor", "ColorRGB", "",1.0000,1.0000,1.0000 + Property: "SpecularFactor", "double", "",0.5000 + Property: "ShininessExponent", "double", "",12.3 + Property: "ReflectionColor", "ColorRGB", "",0,0,0 + Property: "ReflectionFactor", "double", "",1 + Property: "Emissive", "ColorRGB", "",0,0,0 + Property: "Ambient", "ColorRGB", "",1.0,1.0,1.0 + Property: "Diffuse", "ColorRGB", "",0.8,0.8,0.8 + Property: "Specular", "ColorRGB", "",1.0,1.0,1.0 + Property: "Shininess", "double", "",12.3 + Property: "Opacity", "double", "",1.0 + Property: "Reflectivity", "double", "",0 + } + } + Pose: "Pose::BIND_POSES", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 1 + PoseNode: { + Node: "Model::Cube" + Matrix: 0.000000075497901,0.000000000000000,-1.000000000000000,0.000000000000000,-1.000000000000000,0.000000000000000,-0.000000075497901,0.000000000000000,0.000000000000000,1.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,1.000000000000000 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + } + } +} + +; Object relations +;------------------------------------------------------------------ + +Relations: { + Model: "Model::Cube", "Mesh" { + } + Model: "Model::Camera", "Camera" { + } + Model: "Model::Lamp", "Light" { + } + Model: "Model::Producer Perspective", "Camera" { + } + Model: "Model::Producer Top", "Camera" { + } + Model: "Model::Producer Bottom", "Camera" { + } + Model: "Model::Producer Front", "Camera" { + } + Model: "Model::Producer Back", "Camera" { + } + Model: "Model::Producer Right", "Camera" { + } + Model: "Model::Producer Left", "Camera" { + } + Model: "Model::Camera Switcher", "CameraSwitcher" { + } + Material: "Material::Material", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Cube", "Model::Scene" + Connect: "OO", "Model::Lamp", "Model::Scene" + Connect: "OO", "Model::Camera", "Model::Scene" + Connect: "OO", "Material::Material", "Model::Cube" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Default Take" + Take: "Default Take" { + FileName: "Default_Take.tak" + LocalTime: 0,479181389250 + ReferenceTime: 0,479181389250 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::Cube" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: -90.000002504348856 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-90.000002504348856,L + Color: 1,0,0 + } + Channel: "Y" { + Default: -0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-0.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 0.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.000000000000000,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Camera" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 7.481131553649902 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,7.481131553649902,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 5.343665122985840 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,5.343665122985840,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 6.507639884948730 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,6.507639884948730,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 22.768802720872678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,22.768802720872678,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 142.108328474812481 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,142.108328474812481,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 34.348495411378678 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,34.348495411378678,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + Model: "Model::Lamp" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 4.076245307922363 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,4.076245307922363,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 5.903861999511719 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,5.903861999511719,L + Color: 0,1,0 + } + Channel: "Z" { + Default: -1.005453944206238 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,-1.005453944206238,L + Color: 0,0,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 47.533574547422390 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,47.533574547422390,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 107.220760383191333 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,107.220760383191333,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 10.743664729492949 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,10.743664729492949,L + Color: 0,0,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 1,0,0 + } + Channel: "Y" { + Default: 0.999999940395355 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,0.999999940395355,L + Color: 0,1,0 + } + Channel: "Z" { + Default: 1.000000000000000 + KeyVer: 4005 + KeyCount: 1 + Key: + 1924423250,1.000000000000000,L + Color: 0,0,1 + } + LayerType: 3 + } + } + } + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0.0,0.0,0.0,0 + } + FogOptions: { + FogEnable: 0 + FogMode: 0 + FogDensity: 0.000 + FogStart: 5.000 + FogEnd: 25.000 + FogColor: 0.1,0.1,0.1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 479181389250 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_mixed_attribs_0_obj.obj b/modules/ufbx/data/synthetic_mixed_attribs_0_obj.obj new file mode 100644 index 0000000..12721aa --- /dev/null +++ b/modules/ufbx/data/synthetic_mixed_attribs_0_obj.obj @@ -0,0 +1,80 @@ +# vertex +v -1 0 0 +v 1 0 0 +v 0 1 0 +g V +f 1 2 3 + +# vertex + texcoord +v -2 0 1 +v 2 0 1 +v 0 2 1 +vt 0 0 +vt 1 0 +vt 0 1 +g VT +f 4/1 5/2 6/3 + +# vertex + normal +v -3 0 2 +v 3 0 2 +v 0 3 2 +vn 0 -1 0 +vn 0 -1 0 +vn 0 1 0 +g VN +f 7//1 8//2 9//3 + +# vertex + texcoord + normal +v -4 0 3 +v 4 0 3 +v 0 4 3 +vt 0 0 +vt 2 0 +vt 0 2 +vn 0 -2 0 +vn 0 -2 0 +vn 0 2 0 +g VTN +f 10/4/4 11/5/5 12/6/6 + +# vertex + color +v -5 0 4 1 0 0 +v 5 0 4 0 1 0 +v 0 5 4 0 0 1 +g VC +f 13 14 15 + +# vertex + texcoord + color +v -6 0 5 2 0 0 +v 6 0 5 0 2 0 +v 0 6 5 0 0 2 +vt 0 0 +vt 3 0 +vt 0 3 +g VTC +f 16/7 17/8 18/9 + +# vertex + normal + color +v -7 0 6 3 0 0 +v 7 0 6 0 3 0 +v 0 7 6 0 0 3 +vn 0 -3 0 +vn 0 -3 0 +vn 0 3 0 +g VNC +f 19//7 20//8 21//9 + +# vertex + texcoord + normal + color +v -8 0 7 4 0 0 +v 8 0 7 0 4 0 +v 0 8 7 0 0 4 +vt 0 0 +vt 4 0 +vt 0 4 +vn 0 -4 0 +vn 0 -4 0 +vn 0 4 0 +g VTNC +f 22/10/10 23/11/11 24/12/12 + diff --git a/modules/ufbx/data/synthetic_mixed_attribs_reuse_0_obj.obj b/modules/ufbx/data/synthetic_mixed_attribs_reuse_0_obj.obj new file mode 100644 index 0000000..dd5455c --- /dev/null +++ b/modules/ufbx/data/synthetic_mixed_attribs_reuse_0_obj.obj @@ -0,0 +1,44 @@ +# vertex +v -1 0 0 +v 1 0 0 +v 0 1 0 +g V +f 1 2 3 + +# vertex + texcoord +vt 0 0 +vt 1 0 +vt 0 1 +g VT +f 1/1 2/2 3/3 + +# vertex + normal +vn 0 -1 0 +vn 0 -1 0 +vn 0 1 0 +g VN +f 1//1 2//2 3//3 + +# vertex + texcoord + normal +g VTN +f 1/1/1 2/2/2 3/3/3 + +# vertex + color +v -2 0 1 1 0 0 +v 2 0 1 0 1 0 +v 0 2 1 0 0 1 +g VC +f 4 5 6 + +# vertex + texcoord + color +g VTC +f 4/1 5/2 6/3 + +# vertex + normal + color +g VNC +f 4//1 5//2 6//3 + +# vertex + texcoord + normal + color +g VTNC +f 4/1/1 5/2/2 6/3/3 + diff --git a/modules/ufbx/data/synthetic_mixed_attribs_reverse_0_obj.obj b/modules/ufbx/data/synthetic_mixed_attribs_reverse_0_obj.obj new file mode 100644 index 0000000..1e67731 --- /dev/null +++ b/modules/ufbx/data/synthetic_mixed_attribs_reverse_0_obj.obj @@ -0,0 +1,80 @@ +# vertex +v -1 0 0 +v 1 0 0 +v 0 1 0 +g V +f -3 -2 -1 + +# vertex + texcoord +v -2 0 1 +v 2 0 1 +v 0 2 1 +vt 0 0 +vt 1 0 +vt 0 1 +g VT +f -3/-3 -2/-2 -1/-1 + +# vertex + normal +v -3 0 2 +v 3 0 2 +v 0 3 2 +vn 0 -1 0 +vn 0 -1 0 +vn 0 1 0 +g VN +f -3//-3 -2//-2 -1//-1 + +# vertex + texcoord + normal +v -4 0 3 +v 4 0 3 +v 0 4 3 +vt 0 0 +vt 2 0 +vt 0 2 +vn 0 -2 0 +vn 0 -2 0 +vn 0 2 0 +g VTN +f -3/-3/-3 -2/-2/-2 -1/-1/-1 + +# vertex + color +v -5 0 4 1 0 0 +v 5 0 4 0 1 0 +v 0 5 4 0 0 1 +g VC +f -3 -2 -1 + +# vertex + texcoord + color +v -6 0 5 2 0 0 +v 6 0 5 0 2 0 +v 0 6 5 0 0 2 +vt 0 0 +vt 3 0 +vt 0 3 +g VTC +f -3/-3 -2/-2 -1/-1 + +# vertex + normal + color +v -7 0 6 3 0 0 +v 7 0 6 0 3 0 +v 0 7 6 0 0 3 +vn 0 -3 0 +vn 0 -3 0 +vn 0 3 0 +g VNC +f -3//-3 -2//-2 -1//-1 + +# vertex + texcoord + normal + color +v -8 0 7 4 0 0 +v 8 0 7 0 4 0 +v 0 8 7 0 0 4 +vt 0 0 +vt 4 0 +vt 0 4 +vn 0 -4 0 +vn 0 -4 0 +vn 0 4 0 +g VTNC +f -3/-3/-3 -2/-2/-2 -1/-1/-1 + diff --git a/modules/ufbx/data/synthetic_node_cycle_fail_7700_ascii.fbx b/modules/ufbx/data/synthetic_node_cycle_fail_7700_ascii.fbx new file mode 100644 index 0000000..24b8e7f --- /dev/null +++ b/modules/ufbx/data/synthetic_node_cycle_fail_7700_ascii.fbx @@ -0,0 +1,627 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 18 + Hour: 20 + Minute: 56 + Second: 7 + Millisecond: 400 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_node_dag_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_node_dag_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "18/06/2022 17:56:07.398" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_node_dag_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "18/06/2022 17:56:07.398" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1916279125344, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 12 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 4 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 4 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1916274466688, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1916274470432, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1916274467520, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1916274454624, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1916009471136, "Model::A", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1916009480416, "Model::B", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,2,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1916009482736, "Model::C", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2,2,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1916009494336, "Model::D", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2,-2,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1915999038592, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1916280579968, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1916275065552, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::A, Model::D + C: "OO",1916009471136,1916009494336 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1916275065552,1916280579968 + + ;Geometry::, Model::A + C: "OO",1916274466688,1916009471136 + + ;Material::lambert1, Model::A + C: "OO",1915999038592,1916009471136 + + ;Model::B, Model::A + C: "OO",1916009480416,1916009471136 + + ;Geometry::, Model::B + C: "OO",1916274470432,1916009480416 + + ;Material::lambert1, Model::B + C: "OO",1915999038592,1916009480416 + + ;Model::C, Model::B + C: "OO",1916009482736,1916009480416 + + ;Geometry::, Model::C + C: "OO",1916274467520,1916009482736 + + ;Material::lambert1, Model::C + C: "OO",1915999038592,1916009482736 + + ;Model::D, Model::C + C: "OO",1916009494336,1916009482736 + + ;Geometry::, Model::D + C: "OO",1916274454624,1916009494336 + + ;Material::lambert1, Model::D + C: "OO",1915999038592,1916009494336 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_node_dag_7700_ascii.fbx b/modules/ufbx/data/synthetic_node_dag_7700_ascii.fbx new file mode 100644 index 0000000..796544d --- /dev/null +++ b/modules/ufbx/data/synthetic_node_dag_7700_ascii.fbx @@ -0,0 +1,630 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 18 + Hour: 20 + Minute: 56 + Second: 7 + Millisecond: 400 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_node_dag_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_node_dag_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "18/06/2022 17:56:07.398" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_node_dag_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "18/06/2022 17:56:07.398" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1916279125344, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 12 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 4 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 4 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1916274466688, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1916274470432, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1916274467520, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1916274454624, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1916009471136, "Model::A", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1916009480416, "Model::B", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",2,2,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1916009482736, "Model::C", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2,2,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1916009494336, "Model::D", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-2,-2,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1915999038592, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1916280579968, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1916275065552, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::A, Model::RootNode + C: "OO",1916009471136,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1916275065552,1916280579968 + + ;Geometry::, Model::A + C: "OO",1916274466688,1916009471136 + + ;Material::lambert1, Model::A + C: "OO",1915999038592,1916009471136 + + ;Model::B, Model::A + C: "OO",1916009480416,1916009471136 + + ;Geometry::, Model::B + C: "OO",1916274470432,1916009480416 + + ;Material::lambert1, Model::B + C: "OO",1915999038592,1916009480416 + + ;Model::C, Model::B + C: "OO",1916009482736,1916009480416 + + ;Geometry::, Model::C + C: "OO",1916274467520,1916009482736 + + ;Material::lambert1, Model::C + C: "OO",1915999038592,1916009482736 + + ;Model::D, Model::C + C: "OO",1916009494336,1916009482736 + + ;Model::D, Model::A + C: "OO",1916009494336,1916009471136 + + ;Geometry::, Model::D + C: "OO",1916274454624,1916009494336 + + ;Material::lambert1, Model::D + C: "OO",1915999038592,1916009494336 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_node_depth_fail_7400_binary.fbx b/modules/ufbx/data/synthetic_node_depth_fail_7400_binary.fbx new file mode 100644 index 0000000..4a161b8 Binary files /dev/null and b/modules/ufbx/data/synthetic_node_depth_fail_7400_binary.fbx differ diff --git a/modules/ufbx/data/synthetic_node_depth_fail_7500_ascii.fbx b/modules/ufbx/data/synthetic_node_depth_fail_7500_ascii.fbx new file mode 100644 index 0000000..82d9aeb --- /dev/null +++ b/modules/ufbx/data/synthetic_node_depth_fail_7500_ascii.fbx @@ -0,0 +1,425 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + A: {A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: {A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: {A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: {A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { A: { }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 34 + Millisecond: 164 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658664160, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1908558533920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1907292239120, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1907674217712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907680138928, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631740128, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1907292239120,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631740128,1907680138928 + + ;Geometry::, Model::pCube1 + C: "OO",1908558533920,1907292239120 + + ;Material::lambert1, Model::pCube1 + C: "OO",1907674217712,1907292239120 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_nurbs_invalid_7700_ascii.fbx b/modules/ufbx/data/synthetic_nurbs_invalid_7700_ascii.fbx new file mode 100644 index 0000000..ee62437 --- /dev/null +++ b/modules/ufbx/data/synthetic_nurbs_invalid_7700_ascii.fbx @@ -0,0 +1,390 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 6 + Hour: 15 + Minute: 37 + Second: 58 + Millisecond: 511 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_invalid_nurbs_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_invalid_nurbs_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "06/06/2022 12:37:58.509" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_invalid_nurbs_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "06/06/2022 12:37:58.509" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",100 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2448666946256, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 2 + PropertyTemplate: "FbxNurbsCurve" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 2 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2448661885648, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 20 + Dimension: 3 + Form: "Open" + Rational: 0 + Points: *24 { + a: -1.8570548083462,0,2.52740443035194,1,-0.751710968919704,0,2.1595571524959,1,1.45897670993328,0,1.4238625967838,1,-3.12380185977598,0,-1.0017502230123,1,-0.649925544423618,0,-1.73638512287701,1,0.587012613252567,0,-2.10370257280936,1 + } + KnotVector: *10 { + a: 0,0,0,0,1,2,3,3,3,3 + } + } + Geometry: 2448582130720, "Geometry::", "NurbsSurface" { + Type: "NurbsSurface" + NurbsSurfaceVersion: 100 + SurfaceDisplay: 4,4,4 + NurbsSurfaceOrder: 8,4 + Dimensions: 4,4 + Step: 4,4 + Form: "Open", "Open" + Points: *64 { + a: -0.5,-3.06161699786838e-17,0.5,1,-0.166666666666667,-3.06161699786838e-17,0.5,1,0.166666666666667,-3.06161699786838e-17,0.5,1,0.5,-3.06161699786838e-17,0.5,1,-0.5,-1.02053899928946e-17,0.166666666666667,1,-0.166666666666667,-1.02053899928946e-17,0.166666666666667,1,0.166666666666667,-1.02053899928946e-17,0.166666666666667,1,0.5,-1.02053899928946e-17,0.166666666666667,1,-0.5,1.02053899928946e-17,-0.166666666666667,1,-0.166666666666667,1.02053899928946e-17,-0.166666666666667,1,0.166666666666667,1.02053899928946e-17,-0.166666666666667,1,0.5,1.02053899928946e-17,-0.166666666666667,1,-0.5,3.06161699786838e-17,-0.5,1,-0.166666666666667,3.06161699786838e-17,-0.5,1,0.166666666666667,3.06161699786838e-17,-0.5,1,0.5,3.06161699786838e-17,-0.5,1 + } + KnotVectorU: *8 { + a: 0,0,0,0,1,1,1,1 + } + KnotVectorV: *8 { + a: 0,0,0,0,1,1 + } + GeometryVersion: 124 + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + FlipNormals: 0 + } + Model: 2448574152896, "Model::curve1", "NurbsCurve" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2448574155216, "Model::nurbsPlane1", "NurbsSurface" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.01,0.01,0.01 + } + Shading: T + Culling: "CullingOff" + } + Material: 2448468898256, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2448658372880, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2448664616224, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::curve1, Model::RootNode + C: "OO",2448574152896,0 + + ;Model::nurbsPlane1, Model::RootNode + C: "OO",2448574155216,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2448664616224,2448658372880 + + ;Geometry::, Model::curve1 + C: "OO",2448661885648,2448574152896 + + ;Geometry::, Model::nurbsPlane1 + C: "OO",2448582130720,2448574155216 + + ;Material::lambert1, Model::nurbsPlane1 + C: "OO",2448468898256,2448574155216 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_nurbs_truncated_7700_ascii.fbx b/modules/ufbx/data/synthetic_nurbs_truncated_7700_ascii.fbx new file mode 100644 index 0000000..1c30039 --- /dev/null +++ b/modules/ufbx/data/synthetic_nurbs_truncated_7700_ascii.fbx @@ -0,0 +1,390 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 6 + Hour: 15 + Minute: 37 + Second: 58 + Millisecond: 511 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_invalid_nurbs_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_invalid_nurbs_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "06/06/2022 12:37:58.509" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_invalid_nurbs_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "06/06/2022 12:37:58.509" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",100 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2448666946256, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 2 + PropertyTemplate: "FbxNurbsCurve" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 2 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2448661885648, "Geometry::", "NurbsCurve" { + GeometryVersion: 124 + Type: "NurbsCurve" + NurbsCurveVersion: 100 + Order: 4 + Dimension: 3 + Form: "Open" + Rational: 0 + Points: *21 { + a: -1.8570548083462,0,2.52740443035194,1,-0.751710968919704,0,2.1595571524959,1,1.45897670993328,0,1.4238625967838,1,-3.12380185977598,0,-1.0017502230123,1,-0.649925544423618,0,-1.73638512287701,1 + } + KnotVector: *10 { + a: 0,0,0,0,1,2,3,3,3,3 + } + } + Geometry: 2448582130720, "Geometry::", "NurbsSurface" { + Type: "NurbsSurface" + NurbsSurfaceVersion: 100 + SurfaceDisplay: 4,4,4 + NurbsSurfaceOrder: 4,4 + Dimensions: 4,3 + Step: 4,4 + Form: "Open", "Open" + Points: *48 { + a: -0.5,-3.06161699786838e-17,0.5,1,-0.166666666666667,-3.06161699786838e-17,0.5,1,0.166666666666667,-3.06161699786838e-17,0.5,1,0.5,-3.06161699786838e-17,0.5,1,-0.5,-1.02053899928946e-17,0.166666666666667,1,-0.166666666666667,-1.02053899928946e-17,0.166666666666667,1,0.166666666666667,-1.02053899928946e-17,0.166666666666667,1,0.5,-1.02053899928946e-17,0.166666666666667,1,-0.5,1.02053899928946e-17,-0.166666666666667,1,-0.166666666666667,1.02053899928946e-17,-0.166666666666667,1,0.166666666666667,1.02053899928946e-17,-0.166666666666667,1,0.5,1.02053899928946e-17,-0.166666666666667,1 + } + KnotVectorU: *8 { + a: 0,0,0,0,1,1,1,1 + } + KnotVectorV: *8 { + a: 0,0,0,0,1,1,1,1 + } + GeometryVersion: 124 + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + } + FlipNormals: 0 + } + Model: 2448574152896, "Model::curve1", "NurbsCurve" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.01,0.01,0.01 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2448574155216, "Model::nurbsPlane1", "NurbsSurface" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.01,0.01,0.01 + } + Shading: T + Culling: "CullingOff" + } + Material: 2448468898256, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2448658372880, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2448664616224, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::curve1, Model::RootNode + C: "OO",2448574152896,0 + + ;Model::nurbsPlane1, Model::RootNode + C: "OO",2448574155216,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2448664616224,2448658372880 + + ;Geometry::, Model::curve1 + C: "OO",2448661885648,2448574152896 + + ;Geometry::, Model::nurbsPlane1 + C: "OO",2448582130720,2448574155216 + + ;Material::lambert1, Model::nurbsPlane1 + C: "OO",2448468898256,2448574155216 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_obj_zoo_0_obj.obj b/modules/ufbx/data/synthetic_obj_zoo_0_obj.obj new file mode 100644 index 0000000..d54c697 --- /dev/null +++ b/modules/ufbx/data/synthetic_obj_zoo_0_obj.obj @@ -0,0 +1,48 @@ +v 1 1 1 +v 1 1 1 2 +v 1 1 1 3 4 5 +vt 1 2 3 + +o Object +g Tri +f 1/1 2/1 3/1 +g Lines +l 1 2 +l 1/1 2/1 +g Points +p 1 +p 1 2 3 + +cstype bmatrix +deg 3 3 +step 3 1 +bmat u 1 -3 3 -1 \ + 0 3 -6 3 \ + 0 0 3 -3 \ + 0 0 0 1 +bmat v 0.16666 -0.50000 0.50000 -0.16666 \ + 0.66666 0.00000 -1.00000 0.50000 \ + 0.16666 0.50000 0.50000 -0.50000 \ + 0.00000 0.00000 0.00000 0.16666 +end + +cstype rat bspline +deg 2 2 +surf -1.0 2.5 -2.0 2.0 -9 -8 -7 -6 -5 -4 -3 -2 -1 +parm u -1.00 -1.00 -1.00 2.50 2.50 2.50 +parm v -2.00 -2.00 -2.00 -2.00 -2.00 -2.00 +trim 0.0 2.0 1 +end + +vp -0.675 1.850 3.000 +vp 0.915 1.930 +vp 2.485 0.470 2.000 +vp 2.485 -1.030 +vp 1.605 -1.890 10.700 +vp -0.745 -0.654 0.500 +cstype rat bezier +curv2 -6 -5 -4 -3 -2 -1 -6 +parm u 0.00 1.00 2.00 +sp 2 3 +end + diff --git a/modules/ufbx/data/synthetic_parent_directory_7700_ascii.fbx b/modules/ufbx/data/synthetic_parent_directory_7700_ascii.fbx new file mode 100644 index 0000000..e954f68 --- /dev/null +++ b/modules/ufbx/data/synthetic_parent_directory_7700_ascii.fbx @@ -0,0 +1,495 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 17 + Hour: 21 + Minute: 24 + Second: 1 + Millisecond: 29 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_parent_directory_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_parent_directory_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "17/06/2022 18:24:01.028" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_parent_directory_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "17/06/2022 18:24:01.028" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2538510451056, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 10 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Texture" { + Count: 2 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Video" { + Count: 2 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2538503168160, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2538336671968, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2539874884000, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Opacity", "double", "Number", "",1 + } + } + Video: 2538497066576, "Video::file1", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/temporary.png" + P: "RelPath", "KString", "XRefUrl", "", "..\temporary.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/temporary.png" + RelativeFilename: "..\temporary.png" + } + Video: 2538497065616, "Video::file2", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/directory/inner.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/directory/inner.png" + } + Texture: 2538497068496, "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/temporary.png" + RelativeFilename: "../../../temporary.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2538497062736, "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/directory/inner.png" + RelativeFilename: "..\..\..\..\directory\inner.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + AnimationStack: 2538499892160, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2538497815200, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2538336671968,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2538497815200,2538499892160 + + ;Texture::file1, Material::lambert1 + C: "OP",2538497068496,2539874884000, "DiffuseColor" + + ;Texture::file2, Material::lambert1 + C: "OP",2538497062736,2539874884000, "TransparentColor" + + ;Video::file1, Texture::file1 + C: "OO",2538497066576,2538497068496 + + ;Video::file2, Texture::file2 + C: "OO",2538497065616,2538497062736 + + ;Geometry::, Model::pCube1 + C: "OO",2538503168160,2538336671968 + + ;Material::lambert1, Model::pCube1 + C: "OO",2539874884000,2538336671968 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_partial_attrib_0_obj.obj b/modules/ufbx/data/synthetic_partial_attrib_0_obj.obj new file mode 100644 index 0000000..f3840d1 --- /dev/null +++ b/modules/ufbx/data/synthetic_partial_attrib_0_obj.obj @@ -0,0 +1,27 @@ +v 1 2 3 +v 4 5 6 +v 7 8 9 +v 1 2 3 1 0 0 +v 4 5 6 0 1 0 +v 7 8 9 0 0 1 +vt 0 0 +vt 1 0 +vt 1 1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 + +g Mesh +f 1 2 3 +f 1/1 2/2 3/3 +f 1//1 2//2 3//3 +f 1/1/1 2/2/2 3/3/3 +f 4 5 6 +f 4/1 5/2 6/3 +f 4//1 5//2 6//3 +f 4/1/1 5/2/2 6/3/3 +f 0 100 -100 +f /1 100/2 -100/3 +f //1 100//2 -100//3 +f /1/1 100/2/2 -100/3/3 + diff --git a/modules/ufbx/data/synthetic_partial_attrib_face_0_obj.obj b/modules/ufbx/data/synthetic_partial_attrib_face_0_obj.obj new file mode 100644 index 0000000..7d1cd8e --- /dev/null +++ b/modules/ufbx/data/synthetic_partial_attrib_face_0_obj.obj @@ -0,0 +1,36 @@ +v 1 2 3 +v 4 5 6 +v 7 8 9 +v 10 11 12 +v 1 2 3 1 0 0 +v 4 5 6 0 1 0 +v 7 8 9 0 0 1 +v 10 11 12 1 1 1 +vt 0 0 +vt 1 0 +vt 0 1 +vt 1 1 +vt 0 2 +vt 2 0 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 -1 + +g Mesh +f \ + 1 \ + 2/1 \ + 3//1 \ + 4/2/2 \ + 5 \ + 6/3 \ + 7//3 \ + 8/4/4 \ + 0 \ + /5 \ + //5 \ + /6/6 \ + diff --git a/modules/ufbx/data/synthetic_partial_material_0_obj.obj b/modules/ufbx/data/synthetic_partial_material_0_obj.obj new file mode 100644 index 0000000..5cf6da9 --- /dev/null +++ b/modules/ufbx/data/synthetic_partial_material_0_obj.obj @@ -0,0 +1,29 @@ +v 0 0 0 +v 1 0 0 +v 1 1 0 + +o First +f 1 2 3 + +o Second +f 1 2 3 +usemtl A +f 1 2 3 +usemtl A +usemtl B +f 1 2 3 +usemtl C +usemtl D +f 1 2 3 +usemtl A +f 1 2 3 + +usemtl E +o Third +usemtl F +f 1 2 3 +usemtl G +usemtl A +f 1 2 3 +usemtl H + diff --git a/modules/ufbx/data/synthetic_pre_post_rotate.obj b/modules/ufbx/data/synthetic_pre_post_rotate.obj new file mode 100644 index 0000000..87ae717 --- /dev/null +++ b/modules/ufbx/data/synthetic_pre_post_rotate.obj @@ -0,0 +1,148 @@ +# This file uses centimeters as units for non-parametric coordinates. + +g default +v 0.172804 0.090495 0.697093 +v -0.371230 -0.109337 0.774685 +v 0.177192 0.311352 1.220606 +v 0.008267 0.133216 1.331353 +v 0.529091 -0.106483 1.204872 +v 0.326081 -0.030665 1.802754 +v 0.263007 -0.232721 0.807491 +v -0.102531 -0.415288 0.549341 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn -0.360053 0.919904 -0.155364 +vn -0.360053 0.919904 -0.155364 +vn -0.360053 0.919904 -0.155364 +vn -0.774546 0.585078 -0.240338 +vn -0.774546 0.585078 -0.240338 +vn -0.774546 0.585078 -0.240338 +vn 0.334795 0.247729 0.909144 +vn 0.334795 0.247729 0.909144 +vn 0.334795 0.247729 0.909144 +vn 0.423717 0.905328 0.029067 +vn 0.423717 0.905328 0.029067 +vn 0.423717 0.905328 0.029067 +vn 0.250011 -0.946315 0.204894 +vn 0.250011 -0.946315 0.204894 +vn 0.250011 -0.946315 0.204894 +vn 0.462487 -0.886179 -0.028161 +vn 0.462487 -0.886179 -0.028161 +vn 0.462487 -0.886179 -0.028161 +vn 0.606812 -0.099982 -0.788532 +vn 0.606812 -0.099982 -0.788532 +vn 0.606812 -0.099982 -0.788532 +vn -0.272811 0.403627 -0.873304 +vn -0.272811 0.403627 -0.873304 +vn -0.272811 0.403627 -0.873304 +vn -0.363007 -0.737889 0.568987 +vn -0.363007 -0.737889 0.568987 +vn -0.363007 -0.737889 0.568987 +vn -0.815032 -0.413719 0.405659 +vn -0.815032 -0.413719 0.405659 +vn -0.815032 -0.413719 0.405659 +vn 0.824797 0.037482 -0.564185 +vn 0.824797 0.037482 -0.564185 +vn 0.824797 0.037482 -0.564185 +vn 0.731370 0.626136 -0.270281 +vn 0.731370 0.626136 -0.270281 +vn 0.731370 0.626136 -0.270281 +s off +g pCube1 +f 2/2/1 4/4/2 1/1/3 +f 1/1/4 4/4/5 3/3/6 +f 3/3/7 4/4/8 5/5/9 +f 5/5/10 4/4/11 6/6/12 +f 6/6/13 8/8/14 5/5/15 +f 5/5/16 8/8/17 7/7/18 +f 7/7/19 8/8/20 1/9/21 +f 1/9/22 8/8/23 2/10/24 +f 2/2/25 8/11/26 4/4/27 +f 4/4/28 8/11/29 6/12/30 +f 7/13/31 1/1/32 5/14/33 +f 5/14/34 1/1/35 3/3/36 +g default +v -0.022041 0.152714 -1.325570 +v -0.361373 0.220666 -0.854228 +v 0.420587 0.010442 -0.998919 +v 0.277790 -0.097106 -0.797485 +v 0.262949 -0.430658 -1.280428 +v 0.550466 -0.619637 -0.745595 +v -0.157303 -0.173624 -1.324811 +v -0.586782 0.012218 -1.203978 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +vn 0.425318 0.887312 0.178276 +vn 0.425318 0.887312 0.178276 +vn 0.425318 0.887312 0.178276 +vn -0.042588 0.893570 0.446899 +vn -0.042588 0.893570 0.446900 +vn -0.042588 0.893570 0.446900 +vn 0.812678 -0.490850 0.314039 +vn 0.812678 -0.490850 0.314039 +vn 0.812678 -0.490850 0.314039 +vn 0.854457 0.414828 -0.312764 +vn 0.854457 0.414828 -0.312764 +vn 0.854457 0.414828 -0.312764 +vn -0.465661 -0.882816 -0.061605 +vn -0.465661 -0.882816 -0.061605 +vn -0.465661 -0.882816 -0.061605 +vn -0.454917 -0.808324 -0.373715 +vn -0.454917 -0.808324 -0.373715 +vn -0.454917 -0.808324 -0.373715 +vn -0.231806 0.093827 -0.968226 +vn -0.231806 0.093827 -0.968226 +vn -0.231806 0.093827 -0.968226 +vn -0.295477 0.892282 -0.341360 +vn -0.295477 0.892282 -0.341360 +vn -0.295477 0.892282 -0.341360 +vn -0.385963 -0.661503 0.642998 +vn -0.385963 -0.661503 0.642998 +vn -0.385963 -0.661503 0.642998 +vn -0.435696 -0.139050 0.889288 +vn -0.435696 -0.139050 0.889288 +vn -0.435696 -0.139050 0.889288 +vn 0.082775 -0.036626 -0.995895 +vn 0.082775 -0.036626 -0.995895 +vn 0.082775 -0.036626 -0.995895 +vn 0.625606 0.248397 -0.739538 +vn 0.625606 0.248397 -0.739538 +vn 0.625606 0.248397 -0.739538 +s off +g pCube2 +f 10/16/37 12/18/38 9/15/39 +f 9/15/40 12/18/41 11/17/42 +f 11/17/43 12/18/44 13/19/45 +f 13/19/46 12/18/47 14/20/48 +f 14/20/49 16/22/50 13/19/51 +f 13/19/52 16/22/53 15/21/54 +f 15/21/55 16/22/56 9/23/57 +f 9/23/58 16/22/59 10/24/60 +f 10/16/61 16/25/62 12/18/63 +f 12/18/64 16/25/65 14/26/66 +f 15/27/67 9/15/68 13/28/69 +f 13/28/70 9/15/71 11/17/72 diff --git a/modules/ufbx/data/synthetic_pre_post_rotate_7500_ascii.fbx b/modules/ufbx/data/synthetic_pre_post_rotate_7500_ascii.fbx new file mode 100644 index 0000000..83e3a60 --- /dev/null +++ b/modules/ufbx/data/synthetic_pre_post_rotate_7500_ascii.fbx @@ -0,0 +1,562 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 7 + Hour: 20 + Minute: 50 + Second: 51 + Millisecond: 652 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_pre_rotate_order_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_pre_rotate_order_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "07/04/2020 17:50:51.650" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_pre_rotate_order_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "07/04/2020 17:50:51.650" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2142073008112, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 2 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 2 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2141920570240, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.418393850326538,-0.341942727565765,-0.0123836398124695,0.436771154403687,-0.5,0.102691292762756,-0.330338418483734,0.446155309677124,0.300303280353546,0.0532375276088715,0.5,0.185364276170731,-0.5,0.5,-0.5,-0.0189733505249023,1.27946376800537,-0.233094662427902,-0.263801336288452,-0.203426539897919,-0.499999821186066,0.199826151132584,-0.760887086391449,-0.5 + } + PolygonVertexIndex: *36 { + a: 1,3,-1,0,3,-3,2,3,-5,4,3,-6,5,7,-5,4,7,-7,6,7,-1,0,7,-2,1,7,-4,3,7,-6,6,0,-5,4,0,-3 + } + Edges: *18 { + a: 2,4,11,16,5,0,8,10,17,12,20,22,1,7,13,19,25,31 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *108 { + a: -0.157623440027237,-0.141253903508186,0.977344512939453,-0.157623425126076,-0.141253873705864,0.977344453334808,-0.157623440027237,-0.141253873705864,0.977344453334808,0.31405371427536,-0.38024565577507,0.869933068752289,0.31405371427536,-0.380245625972748,0.869933068752289,0.31405371427536,-0.380245625972748,0.869933009147644,-0.111860305070877,0.989612996578217,0.0902955755591393,-0.111860319972038,0.989613115787506,0.0902955904603004,-0.111860312521458,0.989613056182861,0.0902955904603004,-0.752137720584869,0.256265759468079,0.607138097286224,-0.752137720584869,0.256265759468079,0.607138097286224,-0.752137780189514,0.256265789270401,0.607138156890869,0.277074933052063,0.153784051537514,-0.948461949825287,0.277074933052063,0.153784036636353,-0.948461890220642,0.277074933052063,0.153784036636353,-0.948461949825287,-1.53259622948099e-06,-6.43530540855863e-07,-1,-1.53259645685466e-06,-6.43530597699282e-07,-1,-1.53259645685466e-06,-6.43530654542701e-07,-1,-0.707492887973785,-0.588405907154083,-0.39144891500473,-0.70749294757843,-0.588405966758728,-0.391448944807053,-0.70749294757843,-0.588405966758728,-0.391448944807053,-0.220828086137772,-0.860413253307343,0.459264636039734,-0.22082807123661,-0.860413253307343,0.459264606237411,-0.220828101038933,-0.860413253307343,0.459264606237411,0.810446739196777,0.349689304828644,-0.469993084669113,0.810446679592133,0.349689275026321,-0.469993025064468,0.810446739196777,0.349689304828644,-0.469993084669113,0.994361877441406,0.103788278996944,0.0217356197535992,0.994361937046051,0.103788278996944,0.0217356197535992,0.994361877441406,0.103788271546364,0.0217356216162443,-0.882903635501862,-0.296464085578918,-0.364129424095154,-0.882903635501862,-0.296464055776596,-0.364129394292831,-0.882903635501862,-0.296464055776596,-0.364129394292831,-0.97756016254425,0.0262976530939341,0.209008753299713,-0.97756016254425,0.0262976512312889,0.209008738398552,-0.977560102939606,0.0262976475059986,0.209008723497391 + } + NormalsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *108 { + a: 0.157566100358963,0.973438918590546,0.166101261973381,0.157566100358963,0.97343897819519,0.16610124707222,0.157566100358963,0.97343897819519,0.16610124707222,-0.00776232779026031,0.915233671665192,0.402848720550537,-0.00776234269142151,0.915233671665192,0.402848690748215,-0.00776232872158289,0.915233731269836,0.402848750352859,-0.293559640645981,0.0539021119475365,-0.954419910907745,-0.293559640645981,0.0539021156728268,-0.954419910907745,-0.293559640645981,0.0539021231234074,-0.95441997051239,-0.424347221851349,0.516540288925171,-0.74371737241745,-0.424347221851349,0.516540288925171,-0.74371737241745,-0.424347251653671,0.516540348529816,-0.743717432022095,0.817931115627289,-0.555730640888214,0.148836448788643,0.817931056022644,-0.555730640888214,0.148836463689804,0.817931056022644,-0.555730640888214,0.148836463689804,-0.768846929073334,-0.639432847499847,1.58982652465056e-06,-0.768846929073334,-0.639432847499847,1.58982675202424e-06,-0.768846929073334,-0.639432847499847,1.58982675202424e-06,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.0301197022199631,0.476681232452393,0.878560066223145,-0.0301196910440922,0.47668120265007,0.878560066223145,-0.0301196947693825,0.47668120265007,0.878560066223145,-0.47749075293541,0.859119534492493,-0.1841641664505,-0.477490723133087,0.859119474887848,-0.184164151549339,-0.47749075293541,0.859119534492493,-0.1841641664505,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.0680162906646729,0.467008024454117,0.881633341312408,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.367951095104218,0.918582439422607,0.144285723567009,-0.367951065301895,0.918582439422607,0.144285708665848,-0.367951065301895,0.918582439422607,0.144285708665848,0.0393971242010593,0.997494459152222,0.0587597265839577,0.039397120475769,0.997494459152222,0.0587597265839577,0.039397120475769,0.997494518756866,0.0587597265839577 + } + BinormalsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *108 { + a: 0.974847674369812,-0.180177807807922,0.131179973483086,0.974847674369812,-0.180177807807922,0.131179973483086,0.974847674369812,-0.180177807807922,0.131179988384247,0.949373483657837,0.1332688331604,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480959177017,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763758182526,0.504200637340546,0.817015290260315,0.279763758182526,0.504200637340546,0.817015290260315,0.279763728380203,0.639432847499847,-0.768846929073334,-4.85215878143208e-07,0.639432847499847,-0.768846929073334,-4.85215991830046e-07,0.639432847499847,-0.768846929073334,-4.85215934986627e-07,0.639432847499847,-0.768846929073334,-2.47408053155596e-07,0.639432847499847,-0.768846929073334,-2.44388530745709e-07,0.639432847499847,-0.768846929073334,-2.44388530745709e-07,0.974847555160522,-0.180177822709084,0.131179988384247,0.974847674369812,-0.180177837610245,0.131179988384247,0.974847555160522,-0.180177852511406,0.131179988384247,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.33937993645668,-0.373672544956207,-0.863243937492371,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.0813524946570396,0.878140926361084,-0.471434265375137,-0.0813524946570396,0.878140926361084,-0.471434265375137,-0.081352487206459,0.878140926361084,-0.471434265375137,-0.291707336902618,-0.261372208595276,0.920104026794434,-0.291707336902618,-0.261372178792953,0.920104026794434,-0.291707336902618,-0.261372178792953,0.920104026794434,0.206939816474915,-0.0656755045056343,0.976146817207336,0.206939801573753,-0.0656755045056343,0.976146817207336,0.206939801573753,-0.0656755045056343,0.976146817207336 + } + TangentsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *36 { + a: 1,3,0,0,3,2,2,3,4,4,3,5,5,7,4,4,7,6,6,7,8,8,7,9,1,10,3,3,10,11,12,0,13,13,0,2 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *18 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2141920587648, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.418393850326538,-0.341942727565765,-0.0123836398124695,0.436771154403687,-0.5,0.102691292762756,-0.330338418483734,0.446155309677124,0.300303280353546,0.0532375276088715,0.5,0.185364276170731,-0.5,0.5,-0.5,-0.0189733505249023,1.27946376800537,-0.233094662427902,-0.263801336288452,-0.203426539897919,-0.499999821186066,0.199826151132584,-0.760887086391449,-0.5 + } + PolygonVertexIndex: *36 { + a: 1,3,-1,0,3,-3,2,3,-5,4,3,-6,5,7,-5,4,7,-7,6,7,-1,0,7,-2,1,7,-4,3,7,-6,6,0,-5,4,0,-3 + } + Edges: *18 { + a: 2,4,11,16,5,0,8,10,17,12,20,22,1,7,13,19,25,31 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *108 { + a: -0.157623440027237,-0.141253903508186,0.977344512939453,-0.157623425126076,-0.141253873705864,0.977344453334808,-0.157623440027237,-0.141253873705864,0.977344453334808,0.31405371427536,-0.38024565577507,0.869933068752289,0.31405371427536,-0.380245625972748,0.869933068752289,0.31405371427536,-0.380245625972748,0.869933009147644,-0.111860305070877,0.989612996578217,0.0902955755591393,-0.111860319972038,0.989613115787506,0.0902955904603004,-0.111860312521458,0.989613056182861,0.0902955904603004,-0.752137720584869,0.256265759468079,0.607138097286224,-0.752137720584869,0.256265759468079,0.607138097286224,-0.752137780189514,0.256265789270401,0.607138156890869,0.277074933052063,0.153784051537514,-0.948461949825287,0.277074933052063,0.153784036636353,-0.948461890220642,0.277074933052063,0.153784036636353,-0.948461949825287,-1.53259622948099e-06,-6.43530540855863e-07,-1,-1.53259645685466e-06,-6.43530597699282e-07,-1,-1.53259645685466e-06,-6.43530654542701e-07,-1,-0.707492887973785,-0.588405907154083,-0.39144891500473,-0.70749294757843,-0.588405966758728,-0.391448944807053,-0.70749294757843,-0.588405966758728,-0.391448944807053,-0.220828086137772,-0.860413253307343,0.459264636039734,-0.22082807123661,-0.860413253307343,0.459264606237411,-0.220828101038933,-0.860413253307343,0.459264606237411,0.810446739196777,0.349689304828644,-0.469993084669113,0.810446679592133,0.349689275026321,-0.469993025064468,0.810446739196777,0.349689304828644,-0.469993084669113,0.994361877441406,0.103788278996944,0.0217356197535992,0.994361937046051,0.103788278996944,0.0217356197535992,0.994361877441406,0.103788271546364,0.0217356216162443,-0.882903635501862,-0.296464085578918,-0.364129424095154,-0.882903635501862,-0.296464055776596,-0.364129394292831,-0.882903635501862,-0.296464055776596,-0.364129394292831,-0.97756016254425,0.0262976530939341,0.209008753299713,-0.97756016254425,0.0262976512312889,0.209008738398552,-0.977560102939606,0.0262976475059986,0.209008723497391 + } + NormalsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *108 { + a: 0.157566100358963,0.973438918590546,0.166101261973381,0.157566100358963,0.97343897819519,0.16610124707222,0.157566100358963,0.97343897819519,0.16610124707222,-0.00776232779026031,0.915233671665192,0.402848720550537,-0.00776234269142151,0.915233671665192,0.402848690748215,-0.00776232872158289,0.915233731269836,0.402848750352859,-0.293559640645981,0.0539021119475365,-0.954419910907745,-0.293559640645981,0.0539021156728268,-0.954419910907745,-0.293559640645981,0.0539021231234074,-0.95441997051239,-0.424347221851349,0.516540288925171,-0.74371737241745,-0.424347221851349,0.516540288925171,-0.74371737241745,-0.424347251653671,0.516540348529816,-0.743717432022095,0.817931115627289,-0.555730640888214,0.148836448788643,0.817931056022644,-0.555730640888214,0.148836463689804,0.817931056022644,-0.555730640888214,0.148836463689804,-0.768846929073334,-0.639432847499847,1.58982652465056e-06,-0.768846929073334,-0.639432847499847,1.58982675202424e-06,-0.768846929073334,-0.639432847499847,1.58982675202424e-06,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.300964176654816,-0.250305503606796,0.920199871063232,-0.0301197022199631,0.476681232452393,0.878560066223145,-0.0301196910440922,0.47668120265007,0.878560066223145,-0.0301196947693825,0.47668120265007,0.878560066223145,-0.47749075293541,0.859119534492493,-0.1841641664505,-0.477490723133087,0.859119474887848,-0.184164151549339,-0.47749075293541,0.859119534492493,-0.1841641664505,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.0680162906646729,0.467008024454117,0.881633341312408,-0.0680162981152534,0.467008054256439,0.881633400917053,-0.367951095104218,0.918582439422607,0.144285723567009,-0.367951065301895,0.918582439422607,0.144285708665848,-0.367951065301895,0.918582439422607,0.144285708665848,0.0393971242010593,0.997494459152222,0.0587597265839577,0.039397120475769,0.997494459152222,0.0587597265839577,0.039397120475769,0.997494518756866,0.0587597265839577 + } + BinormalsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *108 { + a: 0.974847674369812,-0.180177807807922,0.131179973483086,0.974847674369812,-0.180177807807922,0.131179973483086,0.974847674369812,-0.180177807807922,0.131179988384247,0.949373483657837,0.1332688331604,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480959177017,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.949373483657837,0.133268848061562,-0.284480929374695,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763787984848,0.504200637340546,0.817015290260315,0.279763758182526,0.504200637340546,0.817015290260315,0.279763758182526,0.504200637340546,0.817015290260315,0.279763728380203,0.639432847499847,-0.768846929073334,-4.85215878143208e-07,0.639432847499847,-0.768846929073334,-4.85215991830046e-07,0.639432847499847,-0.768846929073334,-4.85215934986627e-07,0.639432847499847,-0.768846929073334,-2.47408053155596e-07,0.639432847499847,-0.768846929073334,-2.44388530745709e-07,0.639432847499847,-0.768846929073334,-2.44388530745709e-07,0.974847555160522,-0.180177822709084,0.131179988384247,0.974847674369812,-0.180177837610245,0.131179988384247,0.974847555160522,-0.180177852511406,0.131179988384247,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.33937993645668,-0.373672544956207,-0.863243937492371,-0.339379966259003,-0.373672544956207,-0.863243937492371,-0.0813524946570396,0.878140926361084,-0.471434265375137,-0.0813524946570396,0.878140926361084,-0.471434265375137,-0.081352487206459,0.878140926361084,-0.471434265375137,-0.291707336902618,-0.261372208595276,0.920104026794434,-0.291707336902618,-0.261372178792953,0.920104026794434,-0.291707336902618,-0.261372178792953,0.920104026794434,0.206939816474915,-0.0656755045056343,0.976146817207336,0.206939801573753,-0.0656755045056343,0.976146817207336,0.206939801573753,-0.0656755045056343,0.976146817207336 + } + TangentsW: *36 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *36 { + a: 1,3,0,0,3,2,2,3,4,4,3,5,5,7,4,4,7,6,6,7,8,8,7,9,1,10,3,3,10,11,12,0,13,13,0,2 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *18 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2141638288816, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",20.0,40.0,60.0 + P: "PostRotation", "Vector3D", "Vector", "",26.0640382322082,-36.7417712642165,-61.4466190640661 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,1 + P: "Lcl Rotation", "Lcl Rotation", "", "A",30,50,70 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.666581577274735,0.666581577274735,0.666581577274735 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2141638291136, "Model::pCube2", "Mesh" { + Version: 232 + Properties70: { + P: "RotationOrder", "enum", "", "",5 + P: "PreRotation", "Vector3D", "Vector", "",20.0,40.0,60.0 + P: "PostRotation", "Vector3D", "Vector", "",26.0640382322082,-36.7417712642165,-61.4466190640661 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,-1 + P: "Lcl Rotation", "Lcl Rotation", "", "A",30,50,70 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.666581577274735,0.666581577274735,0.666581577274735 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2142068134096, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2142914173280, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2141923623552, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2141638288816,0 + + ;Model::pCube2, Model::RootNode + C: "OO",2141638291136,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2141923623552,2142914173280 + + ;Geometry::, Model::pCube1 + C: "OO",2141920570240,2141638288816 + + ;Material::lambert1, Model::pCube1 + C: "OO",2142068134096,2141638288816 + + ;Geometry::, Model::pCube2 + C: "OO",2141920587648,2141638291136 + + ;Material::lambert1, Model::pCube2 + C: "OO",2142068134096,2141638291136 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_recursive_connections_7700_ascii.fbx b/modules/ufbx/data/synthetic_recursive_connections_7700_ascii.fbx new file mode 100644 index 0000000..8303f20 --- /dev/null +++ b/modules/ufbx/data/synthetic_recursive_connections_7700_ascii.fbx @@ -0,0 +1,1240 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 25 + Hour: 20 + Minute: 3 + Second: 44 + Millisecond: 210 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_recursive_connections_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_recursive_connections_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "25/12/2022 18:03:44.209" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_recursive_connections_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "25/12/2022 18:03:44.209" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",192442325000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2487649029344, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 38 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 3 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 3 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 8 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 20 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2487764387680, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2487764397984, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 2487764394848, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2487472470816, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2487472466176, "Model::pCube2", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2487472475456, "Model::pCube3", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2485284542848, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2487653501904, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationCurve: 2487653131440, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Constant|ConstantStandard + KeyAttrFlags: *2 { + a: 2,2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653127760, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653122960, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653124880, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653129040, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653126000, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653126320, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653124720, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653129680, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653130160, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653128400, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Constant|ConstantStandard + KeyAttrFlags: *2 { + a: 2,2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653122480, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653125040, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653126160, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653126800, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653124400, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653123120, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653122160, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653132240, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487653124080, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,23093079000 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2487653502528, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2487653500240, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2487653502736, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2487653501696, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2487653501072, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2487653500032, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2487653500448, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2487653501488, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2487765740192, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2487472470816,0 + + ;Model::pCube2, Model::RootNode + C: "OO",2487472466176,0 + + ;Model::pCube3, Model::RootNode + C: "OO",2487472475456,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2487765740192,2487653501904 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2487653502528,2487765740192 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2487653500240,2487765740192 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2487653502736,2487765740192 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2487653501696,2487765740192 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2487653501072,2487765740192 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2487653500032,2487765740192 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2487653500448,2487765740192 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2487653501488,2487765740192 + + ;Geometry::, Model::pCube1 + C: "OO",2487764387680,2487472470816 + + ;Material::lambert1, Model::pCube1 + C: "OO",2485284542848,2487472470816 + + ;Model::pCube1, Model::pCube1 + C: "PP",2487472470816, "Lcl Translation", 2487472470816, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2487653500240,2487472470816, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2487653501696,2487472470816, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2487653502736,2487472470816, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2487653502528,2487472470816, "Visibility" + + ;Geometry::, Model::pCube2 + C: "OO",2487764397984,2487472466176 + + ;Material::lambert1, Model::pCube2 + C: "OO",2485284542848,2487472466176 + + ;Geometry::, Model::pCube3 + C: "OO",2487764394848,2487472475456 + + ;Material::lambert1, Model::pCube3 + C: "OO",2485284542848,2487472475456 + + ;Model::pCube1, Model::pCube3 + C: "PP",2487472470816, "Lcl Translation", 2487472475456, "Lcl Translation" + + ;Model::pCube3, Model::pCube1 + C: "PP",2487472475456, "Lcl Translation", 2487472470816, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube3 + C: "OP",2487653500032,2487472475456, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube3 + C: "OP",2487653501488,2487472475456, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube3 + C: "OP",2487653500448,2487472475456, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::pCube3 + C: "OP",2487653501072,2487472475456, "Visibility" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2487653131440,2487653502528, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487653127760,2487653500240, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487653122960,2487653500240, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487653124880,2487653500240, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487653129040,2487653502736, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487653126000,2487653502736, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487653126320,2487653502736, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487653124720,2487653501696, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487653129680,2487653501696, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487653130160,2487653501696, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2487653128400,2487653501072, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487653122480,2487653500032, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487653125040,2487653500032, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487653126160,2487653500032, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487653126800,2487653500448, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487653124400,2487653500448, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487653123120,2487653500448, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487653122160,2487653501488, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487653132240,2487653501488, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487653124080,2487653501488, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + } +} diff --git a/modules/ufbx/data/synthetic_recursive_transform_6100_ascii.fbx b/modules/ufbx/data/synthetic_recursive_transform_6100_ascii.fbx new file mode 100644 index 0000000..aa26b8c --- /dev/null +++ b/modules/ufbx/data/synthetic_recursive_transform_6100_ascii.fbx @@ -0,0 +1,448 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 25 + Hour: 19 + Minute: 52 + Second: 59 + Millisecond: 455 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_recursive_transform_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_recursive_transform_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2023" + Property: "Original|DateTime_GMT", "DateTime", "", "25/12/2022 17:52:59.454" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_recursive_transform_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2023" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "25/12/2022 17:52:59.454" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",0 + Property: "TimeSpanStop", "KTime", "",192442325000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::pCube1" { + Version: 1.1 + Channel: "Transform" { + Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { Channel: "Transform" { + } } } } } } } } } } } } } } } } } } } } } } } } } } } } + + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 1 + Key: 0,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 1 + Key: 0,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 1 + Key: 0,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 1 + Key: 0,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 1 + Key: 0,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 1 + Key: 0,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 1 + Key: 0,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 1 + Key: 0,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 1 + Key: 0,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 1 + Key: 0,1,C,s + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 588000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_rotation_order_layers_7700_ascii.fbx b/modules/ufbx/data/synthetic_rotation_order_layers_7700_ascii.fbx new file mode 100644 index 0000000..b476d72 --- /dev/null +++ b/modules/ufbx/data/synthetic_rotation_order_layers_7700_ascii.fbx @@ -0,0 +1,1080 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 25 + Hour: 20 + Minute: 32 + Second: 16 + Millisecond: 959 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_rotation_order_layers_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_rotation_order_layers_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "25/12/2022 18:32:16.957" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_rotation_order_layers_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "25/12/2022 18:32:16.957" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",192442325000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2487873581600, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 40 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 3 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 12 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 20 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2487764483104, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2487472459216, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Rotation", "Lcl Rotation", "", "A+",-91.1038487844727,0,0 + P: "currentUVSet", "KString", "", "U", "map1" + P: "RotationOrder", "enum", "", "",0 + } + Shading: T + Culling: "CullingOff" + } + Material: 2487869408016, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2487879694352, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationCurve: 2487879448080, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Constant|ConstantStandard + KeyAttrFlags: *2 { + a: 2,2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879443920, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard, Constant|ConstantStandard + KeyAttrFlags: *2 { + a: 2,2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0; RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879447280, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879447600, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879444080, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879450640, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879447760, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879444240, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879448400, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879450160, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879444560, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879444720, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879449200, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879445680, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879444400, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: -91.10385,-181.4519 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879450320, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879447440, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 0,-5.852221e-13 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879451280, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 0,91.52747 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879444880, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurve: 2487879445840, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *2 { + a: 0,19244232500 + } + KeyValueFloat: *2 { + a: 0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive, Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *2 { + a: 24840,24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0; RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *8 { + a: 0,0,218434821,0,0,0,218434821,0 + } + KeyAttrRefCount: *2 { + a: 1,1 + } + } + AnimationCurveNode: 2487879694560, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2487879694768, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2487879695184, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2487879695808, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2487879697680, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2487879696016, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2487879696432, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2487879697056, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2487879698928, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2487879699760, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-91.1038487844727 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2487879697264, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2487879697888, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",-91.1038487844727 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2487305674896, "AnimLayer::BaseLayer", "" { + } + AnimationLayer: 2487305671856, "AnimLayer::Base", "" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + P: "RotationAccumulationMode", "enum", "", "",1 + } + } + AnimationLayer: 2487305672464, "AnimLayer::Rotation", "" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.5,1,0 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2487472459216,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2487305674896,2487879694352 + + ;AnimLayer::Base, AnimStack::Take 001 + C: "OO",2487305671856,2487879694352 + + ;AnimLayer::Rotation, AnimStack::Take 001 + C: "OO",2487305672464,2487879694352 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2487879694560,2487305674896 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2487879696016,2487305674896 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2487879698928,2487305674896 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2487879697888,2487305674896 + + ;Geometry::, Model::pCube1 + C: "OO",2487764483104,2487472459216 + + ;Material::lambert1, Model::pCube1 + C: "OO",2487869408016,2487472459216 + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2487879695808,2487472459216, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2487879697680,2487472459216, "Lcl Translation" + + ;AnimCurveNode::T, Model::pCube1 + C: "OP",2487879696016,2487472459216, "Lcl Translation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2487879699760,2487472459216, "Lcl Rotation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2487879697264,2487472459216, "Lcl Rotation" + + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2487879697888,2487472459216, "Lcl Rotation" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2487879696432,2487472459216, "Lcl Scaling" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2487879697056,2487472459216, "Lcl Scaling" + + ;AnimCurveNode::S, Model::pCube1 + C: "OP",2487879698928,2487472459216, "Lcl Scaling" + + ; -- HACK + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2487879699760,2487472459216, "RotationOrder" + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2487879697264,2487472459216, "RotationOrder" + ;AnimCurveNode::R, Model::pCube1 + C: "OP",2487879697888,2487472459216, "RotationOrder" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2487879694560,2487472459216, "Visibility" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2487879694768,2487472459216, "Visibility" + + ;AnimCurveNode::Visibility, Model::pCube1 + C: "OP",2487879695184,2487472459216, "Visibility" + + ;AnimCurveNode::Visibility, AnimLayer::Base + C: "OO",2487879695184,2487305671856 + + ;AnimCurveNode::T, AnimLayer::Base + C: "OO",2487879697680,2487305671856 + + ;AnimCurveNode::S, AnimLayer::Base + C: "OO",2487879697056,2487305671856 + + ;AnimCurveNode::R, AnimLayer::Base + C: "OO",2487879697264,2487305671856 + + ;AnimCurveNode::Visibility, AnimLayer::Rotation + C: "OO",2487879694768,2487305672464 + + ;AnimCurveNode::T, AnimLayer::Rotation + C: "OO",2487879695808,2487305672464 + + ;AnimCurveNode::S, AnimLayer::Rotation + C: "OO",2487879696432,2487305672464 + + ;AnimCurveNode::R, AnimLayer::Rotation + C: "OO",2487879699760,2487305672464 + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2487879443920,2487879694560, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2487879448080,2487879694768, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487879447280,2487879695808, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487879444080,2487879695808, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487879447760,2487879695808, "d|Z" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487879447600,2487879696016, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487879450640,2487879696016, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2487879444240,2487879696016, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487879448400,2487879696432, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487879444560,2487879696432, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487879449200,2487879696432, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487879450160,2487879698928, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487879444720,2487879698928, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2487879445680,2487879698928, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487879444400,2487879699760, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487879447440,2487879699760, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487879444880,2487879699760, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487879450320,2487879697888, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487879451280,2487879697888, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2487879445840,2487879697888, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + } +} diff --git a/modules/ufbx/data/synthetic_sausage_wiggle_no_bind_6100_ascii.fbx b/modules/ufbx/data/synthetic_sausage_wiggle_no_bind_6100_ascii.fbx new file mode 100644 index 0000000..e4f5b7a --- /dev/null +++ b/modules/ufbx/data/synthetic_sausage_wiggle_no_bind_6100_ascii.fbx @@ -0,0 +1,1207 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 52 + Second: 11 + Millisecond: 993 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 5 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1.23333332718325,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292 + ,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5 + ,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336 + ,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321 + ,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307 + ,-0.5 + PolygonVertexIndex: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13 + ,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22 + ,18,19,23,-23,20,23,19,-17 + Edges: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0 + ,81,16,10 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07 + ,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0 + ,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1 + ,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355 + ,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355 + ,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + ,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355 + ,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355 + ,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0 + ,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1 + ,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678 + ,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355 + ,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858 + ,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232 + ,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + + UVIndex: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22 + ,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35 + ,34,29,31,37,35,33,36,30,27 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::joint1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint1_ncl1_1" + } + Model: "Model::joint2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint2_ncl1_1" + } + Model: "Model::joint3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1.15431302203923,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint3_ncl1_1" + } + Model: "Model::joint4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.07370048859635,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint4_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_wiggle.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_wiggle.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "04/04/2020 12:52:11.991" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_wiggle.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "04/04/2020 12:52:11.991" + Property: "Original|ApplicationActiveProject", "KString", "", "W:\Temp\ufbx_test_source" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + Deformer: "Deformer::Skin pCube1", "Skin" { + Version: 100 + Properties60: { + } + Link_DeformAcuracy: 50 + } + Deformer: "SubDeformer::Cluster joint3", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 2,3,4,5,20,21,22,23 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16 + ,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + Deformer: "SubDeformer::Cluster joint2", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 12,13,14,15,16,17,18,19 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + Deformer: "SubDeformer::Cluster joint1", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 0,1,6,7,8,9,10,11 + Weights: 1,1,1,1,1,1,1,1 + Transform: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + TransformLink: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::joint1", "Model::Scene" + Connect: "OO", "Deformer::Skin pCube1", "Model::pCube1" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Model::joint2", "Model::joint1" + Connect: "OO", "Model::joint3", "Model::joint2" + Connect: "OO", "Model::joint4", "Model::joint3" + Connect: "OO", "SubDeformer::Cluster joint3", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint2", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint1", "Deformer::Skin pCube1" + Connect: "OO", "Model::joint3", "SubDeformer::Cluster joint3" + Connect: "OO", "Model::joint2", "SubDeformer::Cluster joint2" + Connect: "OO", "Model::joint1", "SubDeformer::Cluster joint1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "wiggle" { + FileName: "wiggle.tak" + LocalTime: 1924423250,38488465000 + ReferenceTime: 1924423250,38488465000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::joint1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,149.82275390625,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,-46.0104217529297,U,s,0,109.28205871582,n,3848846500,-43.6388473510742 + ,U,s,109.28205871582,191.243606567383,n,5773269750,-37.2830352783203,U,s,191.243606567383 + ,245.884628295898,n,7697693000,-28.0813331604004,U,s,245.884628295898,273.205139160156 + ,n,9622116250,-17.1721038818359,U,s,273.205139160156,273.205139160156,n,11546539500 + ,-5.69369220733643,U,s,273.205139160156,245.884628295898,n,13470962750,5.21554279327393 + ,U,s,245.884628295898,191.243591308594,n,15395386000,14.4172439575195,U,s,191.243591308594 + ,109.282051086426,n,17319809250,20.7730579376221,U,s,109.282051086426,0,n,19244232500 + ,23.1446304321289,U,s,0,-107.657447814941,n,21168655750,20.7949638366699,U,s,-107.657447814941 + ,-184.555633544922,n,23093079000,14.6003875732422,U,s,-184.555633544922,-230.694549560547 + ,n,25017502250,5.84254026412964,U,s,-230.694549560547,-246.074172973633,n,26941925500 + ,-4.19694519042969,U,s,-246.074172973633,-230.694549560547,n,28866348750,-14.2364292144775 + ,U,s,-230.694549560547,-184.555633544922,n,30790772000,-22.9942779541016,U,s,-184.555633544922 + ,-107.657447814941,n,32715195250,-29.1888523101807,U,s,-107.657447814941,0,n,34639618500 + ,-31.5385189056396,U,s,0,567.693298339844,n,36564041750,-15.7692594528198,U,s,567.693298339844 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint2" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,125.077178955078,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,67.3346862792969,U,s,0,-221.996795654297,n,3848846500,62.5170440673828 + ,U,s,-221.996795654297,-388.494384765625,n,5773269750,49.6057739257813,U,s,-388.494384765625 + ,-499.492767333984,n,7697693000,30.9133358001709,U,s,-499.492767333984,-554.992004394531 + ,n,9622116250,8.75220108032227,U,s,-554.992004394531,-554.992004394531,n,11546539500 + ,-14.5651721954346,U,s,-554.992004394531,-499.492767333984,n,13470962750,-36.7263107299805 + ,U,s,-499.492767333984,-388.494384765625,n,15395386000,-55.4187469482422,U,s,-388.494384765625 + ,-221.996780395508,n,17319809250,-68.3300170898438,U,s,-221.996780395508,0,n,19244232500 + ,-73.1476593017578,U,s,0,245.2412109375,n,21168655750,-67.7951736450195,U,s,245.2412109375 + ,420.413482666016,n,23093079000,-53.6840744018555,U,s,420.413482666016,525.516906738281 + ,n,25017502250,-33.7338943481445,U,s,525.516906738281,560.551330566406,n,26941925500 + ,-10.8641777038574,U,s,560.551330566406,525.516906738281,n,28866348750,12.0055389404297 + ,U,s,525.516906738281,420.413482666016,n,30790772000,31.9557151794434,U,s,420.413482666016 + ,245.2412109375,n,32715195250,46.0668182373047,U,s,245.2412109375,0,n,34639618500 + ,51.419303894043,U,s,0,-925.547424316406,n,36564041750,25.7096519470215,U,s,-925.547424316406 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint3" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.15431296825409 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1.15431296825409,U,s,0,0,n,3848846500,1.15431296825409,U,s,0,0,n,5773269750 + ,1.15431296825409,U,s,0,0,n,7697693000,1.15431296825409,U,s,0,0,n,9622116250,1.15431296825409 + ,U,s,0,0,n,11546539500,1.15431296825409,U,s,0,0,n,13470962750,1.15431296825409,U,s + ,0,0,n,15395386000,1.15431296825409,U,s,0,0,n,17319809250,1.15431296825409,U,s,0,0 + ,n,19244232500,1.15431296825409,U,s,0,0,n,21168655750,1.15431296825409,U,s,0,0,n,23093079000 + ,1.15431296825409,U,s,0,0,n,25017502250,1.15431296825409,U,s,0,0,n,26941925500,1.15431296825409 + ,U,s,0,0,n,28866348750,1.15431296825409,U,s,0,0,n,30790772000,1.15431296825409,U,s + ,0,0,n,32715195250,1.15431296825409,U,s,0,0,n,34639618500,1.15431296825409,U,s,0,0 + ,n,36564041750,1.15431296825409,U,s,0,0,n,38488465000,1.15431296825409,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,-144.71484375,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,39.172191619873,U,s,0,-124.010719299316,n,3848846500,36.4809875488281,U + ,s,-124.010719299316,-217.018753051758,n,5773269750,29.2685585021973,U,s,-217.018753051758 + ,-279.024108886719,n,7697693000,18.8266830444336,U,s,-279.024108886719,-310.026794433594 + ,n,9622116250,6.44714164733887,U,s,-310.026794433594,-310.026794433594,n,11546539500 + ,-6.57829093933105,U,s,-310.026794433594,-279.024108886719,n,13470962750,-18.9578304290771 + ,U,s,-279.024108886719,-217.018753051758,n,15395386000,-29.3997058868408,U,s,-217.018753051758 + ,-124.010711669922,n,17319809250,-36.6121368408203,U,s,-124.010711669922,0,n,19244232500 + ,-39.3033409118652,U,s,0,151.208068847656,n,21168655750,-36.0031623840332,U,s,151.208068847656 + ,259.213806152344,n,23093079000,-27.3027019500732,U,s,259.213806152344,324.017303466797 + ,n,25017502250,-15.0020446777344,U,s,324.017303466797,345.618438720703,n,26941925500 + ,-0.901290893554688,U,s,345.618438720703,324.017303466797,n,28866348750,13.199462890625 + ,U,s,324.017303466797,259.213806152344,n,30790772000,25.5001182556152,U,s,259.213806152344 + ,151.208068847656,n,32715195250,34.2005805969238,U,s,151.208068847656,0,n,34639618500 + ,37.5007591247559,U,s,0,-675.013671875,n,36564041750,18.7503795623779,U,s,-675.013671875 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_sausage_wiggle_no_bind_7500_ascii.fbx b/modules/ufbx/data/synthetic_sausage_wiggle_no_bind_7500_ascii.fbx new file mode 100644 index 0000000..5b25deb --- /dev/null +++ b/modules/ufbx/data/synthetic_sausage_wiggle_no_bind_7500_ascii.fbx @@ -0,0 +1,1499 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 48 + Second: 3 + Millisecond: 851 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_wiggle.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_wiggle.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:03.848" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_wiggle.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:03.848" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2520147257712, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 64 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 5 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 15 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 30 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2516906940624, "Geometry::", "Mesh" { + Vertices: *72 { + a: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307,-0.5 + } + PolygonVertexIndex: *88 { + a: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22,18,19,23,-23,20,23,19,-17 + } + Edges: *44 { + a: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0,81,16,10 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *264 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + NormalsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *76 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + } + UVIndex: *88 { + a: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35,34,29,31,37,35,33,36,30,27 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *44 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2516901326896, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901324784, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901323056, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901324592, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + Model: 2519866011712, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1.23333332718325,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2519261335616, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519950487616, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519924281408, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1.15431302203923,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2520147267648, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.07370048859635,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Material: 2520702829776, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2516901325168, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "Linear" + } + Deformer: 2517866673152, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 2,3,4,5,20,21,22,23 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-2.15431302203923,-1.3191362734009e-16,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,2.15431302203923,0,1 + } + } + Deformer: 2519593291888, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 12,13,14,15,16,17,18,19 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,-1,-6.12323399573677e-17,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,1,0,1 + } + } + Deformer: 2519593292640, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 0,1,6,7,8,9,10,11 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + Transform: *16 { + a: 6.12323399573677e-17,-1,0,0,1.23333332718325,7.55198855708364e-17,0,0,0,0,1,0,0,0,0,1 + } + TransformLink: *16 { + a: 6.12323399573677e-17,1,0,0,-1,6.12323399573677e-17,0,0,0,-0,1,0,-0,0,0,1 + } + } + AnimationStack: 2520543546384, "AnimStack::wiggle", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationCurve: 2516914037264, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914034704, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914037104, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039344, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914041904, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914042224, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914037424, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039024, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914033264, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914038064, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: -46.01042,-43.63885,-37.28304,-28.08133,-17.1721,-5.693692,5.215543,14.41724,20.77306,23.14463,20.79496,14.60039,5.84254,-4.196945,-14.23643,-22.99428,-29.18885,-31.53852,-15.76926,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039824, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914038544, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039664, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914041424, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914034224, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914035504, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914034544, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914035344, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914043664, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914049264, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 67.33469,62.51704,49.60577,30.91334,8.752201,-14.56517,-36.72631,-55.41875,-68.33002,-73.14766,-67.79517,-53.68407,-33.73389,-10.86418,12.00554,31.95572,46.06682,51.4193,25.70965,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914052304, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914047984, "AnimCurve::", "" { + Default: 1.15431296825409 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914047824, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914046544, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914052944, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914052784, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914044464, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914045744, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914051824, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914048784, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 39.17219,36.48099,29.26856,18.82668,6.447142,-6.578291,-18.95783,-29.39971,-36.61214,-39.30334,-36.00316,-27.3027,-15.00204,-0.9012909,13.19946,25.50012,34.20058,37.50076,18.75038,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurveNode: 2520543546592, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543556784, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543560320, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543562192, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543565936, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543566352, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543564064, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543557824, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543561360, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543559488, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543562400, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543557616, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543565520, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.15431302203923 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543560736, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543559696, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2518375224176, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2519866011712,0 + + ;Model::joint1, Model::RootNode + C: "OO",2519261335616,0 + + ;Deformer::, Geometry:: + C: "OO",2516901325168,2516906940624 + + ;Geometry::, Model::pCube1 + C: "OO",2516906940624,2519866011712 + + ;Material::lambert1, Model::pCube1 + C: "OO",2520702829776,2519866011712 + + ;NodeAttribute::, Model::joint1 + C: "OO",2516901326896,2519261335616 + + ;Model::joint2, Model::joint1 + C: "OO",2519950487616,2519261335616 + + ;AnimCurveNode::T, Model::joint1 + C: "OP",2520543565936,2519261335616, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint1 + C: "OP",2520543564064,2519261335616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint1 + C: "OP",2520543566352,2519261335616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint1 + C: "OP",2520543562192,2519261335616, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",2520543546592,2519261335616, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint2 + C: "OO",2516901324784,2519950487616 + + ;Model::joint3, Model::joint2 + C: "OO",2519924281408,2519950487616 + + ;AnimCurveNode::T, Model::joint2 + C: "OP",2520543561360,2519950487616, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint2 + C: "OP",2520543562400,2519950487616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint2 + C: "OP",2520543559488,2519950487616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint2 + C: "OP",2520543557824,2519950487616, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",2520543556784,2519950487616, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint3 + C: "OO",2516901323056,2519924281408 + + ;Model::joint4, Model::joint3 + C: "OO",2520147267648,2519924281408 + + ;AnimCurveNode::T, Model::joint3 + C: "OP",2520543565520,2519924281408, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint3 + C: "OP",2520543559696,2519924281408, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint3 + C: "OP",2520543560736,2519924281408, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint3 + C: "OP",2520543557616,2519924281408, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",2520543560320,2519924281408, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint4 + C: "OO",2516901324592,2520147267648 + + ;SubDeformer::, Deformer:: + C: "OO",2517866673152,2516901325168 + + ;SubDeformer::, Deformer:: + C: "OO",2519593291888,2516901325168 + + ;SubDeformer::, Deformer:: + C: "OO",2519593292640,2516901325168 + + ;Model::joint3, SubDeformer:: + C: "OO",2519924281408,2517866673152 + + ;Model::joint2, SubDeformer:: + C: "OO",2519950487616,2519593291888 + + ;Model::joint1, SubDeformer:: + C: "OO",2519261335616,2519593292640 + + ;AnimLayer::BaseLayer, AnimStack::wiggle + C: "OO",2518375224176,2520543546384 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543546592,2518375224176 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543556784,2518375224176 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543560320,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543562192,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543565936,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543566352,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543564064,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543557824,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543561360,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543559488,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543562400,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543557616,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543565520,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543560736,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543559696,2518375224176 + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914037264,2520543562192, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914034704,2520543565936, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914037104,2520543565936, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914039344,2520543565936, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914041904,2520543566352, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914042224,2520543566352, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914037424,2520543566352, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914039024,2520543564064, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914033264,2520543564064, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914038064,2520543564064, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914039824,2520543557824, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914038544,2520543561360, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914039664,2520543561360, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914041424,2520543561360, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914034224,2520543559488, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914035504,2520543559488, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914034544,2520543559488, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914035344,2520543562400, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914043664,2520543562400, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914049264,2520543562400, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914052304,2520543557616, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914047984,2520543565520, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914047824,2520543565520, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914046544,2520543565520, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914052944,2520543560736, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914052784,2520543560736, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914044464,2520543560736, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914045744,2520543559696, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914051824,2520543559696, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914048784,2520543559696, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "wiggle" { + FileName: "wiggle.tak" + LocalTime: 1924423250,38488465000 + ReferenceTime: 1924423250,38488465000 + } +} diff --git a/modules/ufbx/data/synthetic_sausage_wiggle_no_link_6100_ascii.fbx b/modules/ufbx/data/synthetic_sausage_wiggle_no_link_6100_ascii.fbx new file mode 100644 index 0000000..fbe8e07 --- /dev/null +++ b/modules/ufbx/data/synthetic_sausage_wiggle_no_link_6100_ascii.fbx @@ -0,0 +1,1223 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 52 + Second: 11 + Millisecond: 993 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "Model" { + Count: 5 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1.23333332718325,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292 + ,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5 + ,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336 + ,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321 + ,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307 + ,-0.5 + PolygonVertexIndex: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13 + ,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22 + ,18,19,23,-23,20,23,19,-17 + Edges: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0 + ,81,16,10 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07 + ,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0 + ,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1 + ,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355 + ,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355 + ,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + ,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355 + ,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355 + ,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0 + ,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1 + ,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678 + ,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355 + ,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858 + ,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232 + ,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + + UVIndex: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22 + ,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35 + ,34,29,31,37,35,33,36,30,27 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + Model: "Model::joint1", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,-0,90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint1_ncl1_1" + } + Model: "Model::joint2", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint2_ncl1_1" + } + Model: "Model::joint3", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",1.15431302203923,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A+",1 + Property: "lockInfluenceWeights", "Bool", "A+U",0 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint3_ncl1_1" + } + Model: "Model::joint4", "LimbNode" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,-90 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",2 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1.07370048859635,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "Size", "double", "N",3.33333333333333 + Property: "LimbLength", "double", "HN",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Skeleton" + NodeAttributeName: "NodeAttribute::joint4_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_wiggle.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_wiggle.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "04/04/2020 12:52:11.991" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_game_sausage_6100_ascii_wiggle.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "04/04/2020 12:52:11.991" + Property: "Original|ApplicationActiveProject", "KString", "", "W:\Temp\ufbx_test_source" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } + Pose: "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + Properties60: { + } + NbPoseNodes: 4 + PoseNode: { + Node: "Model::pCube1" + Matrix: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + PoseNode: { + Node: "Model::joint3" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + PoseNode: { + Node: "Model::joint2" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + PoseNode: { + Node: "Model::joint1" + Matrix: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + Deformer: "Deformer::Skin pCube1", "Skin" { + Version: 100 + Properties60: { + } + Link_DeformAcuracy: 50 + } + Deformer: "SubDeformer::Cluster joint3", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 2,3,4,5,20,21,22,23 + Weights: 1,1,1,1,1,1,1,1 + } + Deformer: "SubDeformer::Cluster joint2", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 12,13,14,15,16,17,18,19 + Weights: 1,1,1,1,1,1,1,1 + } + Deformer: "SubDeformer::Cluster joint1", "Cluster" { + Version: 100 + Properties60: { + Property: "SrcModelReference", "object", "" + } + UserData: "", "" + Indexes: 0,1,6,7,8,9,10,11 + Weights: 1,1,1,1,1,1,1,1 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Model::joint1", "Model::Scene" + Connect: "OO", "Deformer::Skin pCube1", "Model::pCube1" + Connect: "OO", "Material::lambert1", "Model::pCube1" + Connect: "OO", "Model::joint2", "Model::joint1" + Connect: "OO", "Model::joint3", "Model::joint2" + Connect: "OO", "Model::joint4", "Model::joint3" + Connect: "OO", "SubDeformer::Cluster joint3", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint2", "Deformer::Skin pCube1" + Connect: "OO", "SubDeformer::Cluster joint1", "Deformer::Skin pCube1" + Connect: "OO", "Model::joint3", "SubDeformer::Cluster joint3" + Connect: "OO", "Model::joint2", "SubDeformer::Cluster joint2" + Connect: "OO", "Model::joint1", "SubDeformer::Cluster joint1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "wiggle" { + FileName: "wiggle.tak" + LocalTime: 1924423250,38488465000 + ReferenceTime: 1924423250,38488465000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::joint1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,149.82275390625,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,-46.0104217529297,U,s,0,109.28205871582,n,3848846500,-43.6388473510742 + ,U,s,109.28205871582,191.243606567383,n,5773269750,-37.2830352783203,U,s,191.243606567383 + ,245.884628295898,n,7697693000,-28.0813331604004,U,s,245.884628295898,273.205139160156 + ,n,9622116250,-17.1721038818359,U,s,273.205139160156,273.205139160156,n,11546539500 + ,-5.69369220733643,U,s,273.205139160156,245.884628295898,n,13470962750,5.21554279327393 + ,U,s,245.884628295898,191.243591308594,n,15395386000,14.4172439575195,U,s,191.243591308594 + ,109.282051086426,n,17319809250,20.7730579376221,U,s,109.282051086426,0,n,19244232500 + ,23.1446304321289,U,s,0,-107.657447814941,n,21168655750,20.7949638366699,U,s,-107.657447814941 + ,-184.555633544922,n,23093079000,14.6003875732422,U,s,-184.555633544922,-230.694549560547 + ,n,25017502250,5.84254026412964,U,s,-230.694549560547,-246.074172973633,n,26941925500 + ,-4.19694519042969,U,s,-246.074172973633,-230.694549560547,n,28866348750,-14.2364292144775 + ,U,s,-230.694549560547,-184.555633544922,n,30790772000,-22.9942779541016,U,s,-184.555633544922 + ,-107.657447814941,n,32715195250,-29.1888523101807,U,s,-107.657447814941,0,n,34639618500 + ,-31.5385189056396,U,s,0,567.693298339844,n,36564041750,-15.7692594528198,U,s,567.693298339844 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint2" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,125.077178955078,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,67.3346862792969,U,s,0,-221.996795654297,n,3848846500,62.5170440673828 + ,U,s,-221.996795654297,-388.494384765625,n,5773269750,49.6057739257813,U,s,-388.494384765625 + ,-499.492767333984,n,7697693000,30.9133358001709,U,s,-499.492767333984,-554.992004394531 + ,n,9622116250,8.75220108032227,U,s,-554.992004394531,-554.992004394531,n,11546539500 + ,-14.5651721954346,U,s,-554.992004394531,-499.492767333984,n,13470962750,-36.7263107299805 + ,U,s,-499.492767333984,-388.494384765625,n,15395386000,-55.4187469482422,U,s,-388.494384765625 + ,-221.996780395508,n,17319809250,-68.3300170898438,U,s,-221.996780395508,0,n,19244232500 + ,-73.1476593017578,U,s,0,245.2412109375,n,21168655750,-67.7951736450195,U,s,245.2412109375 + ,420.413482666016,n,23093079000,-53.6840744018555,U,s,420.413482666016,525.516906738281 + ,n,25017502250,-33.7338943481445,U,s,525.516906738281,560.551330566406,n,26941925500 + ,-10.8641777038574,U,s,560.551330566406,525.516906738281,n,28866348750,12.0055389404297 + ,U,s,525.516906738281,420.413482666016,n,30790772000,31.9557151794434,U,s,420.413482666016 + ,245.2412109375,n,32715195250,46.0668182373047,U,s,245.2412109375,0,n,34639618500 + ,51.419303894043,U,s,0,-925.547424316406,n,36564041750,25.7096519470215,U,s,-925.547424316406 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + Model: "Model::joint3" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 1.15431296825409 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1.15431296825409,U,s,0,0,n,3848846500,1.15431296825409,U,s,0,0,n,5773269750 + ,1.15431296825409,U,s,0,0,n,7697693000,1.15431296825409,U,s,0,0,n,9622116250,1.15431296825409 + ,U,s,0,0,n,11546539500,1.15431296825409,U,s,0,0,n,13470962750,1.15431296825409,U,s + ,0,0,n,15395386000,1.15431296825409,U,s,0,0,n,17319809250,1.15431296825409,U,s,0,0 + ,n,19244232500,1.15431296825409,U,s,0,0,n,21168655750,1.15431296825409,U,s,0,0,n,23093079000 + ,1.15431296825409,U,s,0,0,n,25017502250,1.15431296825409,U,s,0,0,n,26941925500,1.15431296825409 + ,U,s,0,0,n,28866348750,1.15431296825409,U,s,0,0,n,30790772000,1.15431296825409,U,s + ,0,0,n,32715195250,1.15431296825409,U,s,0,0,n,34639618500,1.15431296825409,U,s,0,0 + ,n,36564041750,1.15431296825409,U,s,0,0,n,38488465000,1.15431296825409,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,-144.71484375,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,0,U,s,0,0,n,3848846500,0,U,s,0,0,n,5773269750,0,U,s,0,0,n,7697693000,0 + ,U,s,0,0,n,9622116250,0,U,s,0,0,n,11546539500,0,U,s,0,0,n,13470962750,0,U,s,0,0,n + ,15395386000,0,U,s,0,0,n,17319809250,0,U,s,0,0,n,19244232500,0,U,s,0,0,n,21168655750 + ,0,U,s,0,0,n,23093079000,0,U,s,0,0,n,25017502250,0,U,s,0,0,n,26941925500,0,U,s,0,0 + ,n,28866348750,0,U,s,0,0,n,30790772000,0,U,s,0,0,n,32715195250,0,U,s,0,0,n,34639618500 + ,0,U,s,0,0,n,36564041750,0,U,s,0,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,39.172191619873,U,s,0,-124.010719299316,n,3848846500,36.4809875488281,U + ,s,-124.010719299316,-217.018753051758,n,5773269750,29.2685585021973,U,s,-217.018753051758 + ,-279.024108886719,n,7697693000,18.8266830444336,U,s,-279.024108886719,-310.026794433594 + ,n,9622116250,6.44714164733887,U,s,-310.026794433594,-310.026794433594,n,11546539500 + ,-6.57829093933105,U,s,-310.026794433594,-279.024108886719,n,13470962750,-18.9578304290771 + ,U,s,-279.024108886719,-217.018753051758,n,15395386000,-29.3997058868408,U,s,-217.018753051758 + ,-124.010711669922,n,17319809250,-36.6121368408203,U,s,-124.010711669922,0,n,19244232500 + ,-39.3033409118652,U,s,0,151.208068847656,n,21168655750,-36.0031623840332,U,s,151.208068847656 + ,259.213806152344,n,23093079000,-27.3027019500732,U,s,259.213806152344,324.017303466797 + ,n,25017502250,-15.0020446777344,U,s,324.017303466797,345.618438720703,n,26941925500 + ,-0.901290893554688,U,s,345.618438720703,324.017303466797,n,28866348750,13.199462890625 + ,U,s,324.017303466797,259.213806152344,n,30790772000,25.5001182556152,U,s,259.213806152344 + ,151.208068847656,n,32715195250,34.2005805969238,U,s,151.208068847656,0,n,34639618500 + ,37.5007591247559,U,s,0,-675.013671875,n,36564041750,18.7503795623779,U,s,-675.013671875 + ,0,n,38488465000,0,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,U,s,0,0,n,3848846500,1,U,s,0,0,n,5773269750,1,U,s,0,0,n,7697693000,1 + ,U,s,0,0,n,9622116250,1,U,s,0,0,n,11546539500,1,U,s,0,0,n,13470962750,1,U,s,0,0,n + ,15395386000,1,U,s,0,0,n,17319809250,1,U,s,0,0,n,19244232500,1,U,s,0,0,n,21168655750 + ,1,U,s,0,0,n,23093079000,1,U,s,0,0,n,25017502250,1,U,s,0,0,n,26941925500,1,U,s,0,0 + ,n,28866348750,1,U,s,0,0,n,30790772000,1,U,s,0,0,n,32715195250,1,U,s,0,0,n,34639618500 + ,1,U,s,0,0,n,36564041750,1,U,s,0,0,n,38488465000,1,U,s,0,0,n + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Visibility" { + Default: 1 + KeyVer: 4005 + KeyCount: 20 + Key: 1924423250,1,C,s,3848846500,1,C,s,5773269750,1,C,s,7697693000,1,C,s,9622116250,1,C,s,11546539500,1,C,s + ,13470962750,1,C,s,15395386000,1,C,s,17319809250,1,C,s,19244232500,1,C,s,21168655750,1,C,s,23093079000 + ,1,C,s,25017502250,1,C,s,26941925500,1,C,s,28866348750,1,C,s,30790772000,1,C,s,32715195250,1,C,s,34639618500 + ,1,C,s,36564041750,1,C,s,38488465000,1,C,s + Color: 1,1,1 + } + Channel: "lockInfluenceWeights" { + Default: 0 + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_sausage_wiggle_no_link_7500_ascii.fbx b/modules/ufbx/data/synthetic_sausage_wiggle_no_link_7500_ascii.fbx new file mode 100644 index 0000000..a82eb83 --- /dev/null +++ b/modules/ufbx/data/synthetic_sausage_wiggle_no_link_7500_ascii.fbx @@ -0,0 +1,1510 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 4 + Hour: 15 + Minute: 48 + Second: 3 + Millisecond: 851 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_wiggle.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_wiggle.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:03.848" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_game_sausage_7500_ascii_wiggle.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "04/04/2020 12:48:03.848" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\sausage.fbx" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2520147257712, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 64 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 5 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "NodeAttribute" { + Count: 4 + PropertyTemplate: "FbxSkeleton" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "Size", "double", "Number", "",100 + P: "LimbLength", "double", "Number", "H",1 + } + } + } + ObjectType: "Pose" { + Count: 1 + } + ObjectType: "Deformer" { + Count: 4 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "AnimationCurveNode" { + Count: 15 + PropertyTemplate: "FbxAnimCurveNode" { + Properties70: { + P: "d", "Compound", "", "" + } + } + } + ObjectType: "AnimationCurve" { + Count: 30 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2516906940624, "Geometry::", "Mesh" { + Vertices: *72 { + a: -0.5,0.0147619247436523,0.5,0.5,0.0147619247436523,0.5,-0.5,2.71626615524292,0.5,0.5,2.71626615524292,0.5,-0.5,2.71626615524292,-0.5,0.5,2.71626615524292,-0.5,-0.5,0.014761745929718,-0.5,0.5,0.014761745929718,-0.5,-0.5,0.555062592029572,-0.5,-0.5,0.555062711238861,0.5,0.5,0.555062711238861,0.5,0.5,0.555062592029572,-0.5,-0.5,1.09536349773407,-0.5,-0.5,1.09536361694336,0.5,0.5,1.09536361694336,0.5,0.5,1.09536349773407,-0.5,-0.5,1.63566446304321,-0.5,-0.5,1.63566446304321,0.5,0.5,1.63566446304321,0.5,0.5,1.63566446304321,-0.5,-0.5,2.17596530914307,-0.5,-0.5,2.17596530914307,0.5,0.5,2.17596530914307,0.5,0.5,2.17596530914307,-0.5 + } + PolygonVertexIndex: *88 { + a: 21,22,3,-3,2,3,5,-5,4,5,23,-21,6,7,1,-1,22,23,5,-4,20,21,2,-5,6,0,9,-9,0,1,10,-10,1,7,11,-11,8,11,7,-7,8,9,13,-13,9,10,14,-14,10,11,15,-15,12,15,11,-9,12,13,17,-17,13,14,18,-18,14,15,19,-19,16,19,15,-13,16,17,21,-21,17,18,22,-22,18,19,23,-23,20,23,19,-17 + } + Edges: *44 { + a: 14,2,6,12,25,29,7,5,11,9,15,13,27,41,26,45,30,33,34,36,43,57,42,61,46,49,50,52,59,73,58,77,62,65,66,68,75,3,20,1,0,81,16,10 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *264 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,0,-1,1.78813934326172e-07,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-1,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,1,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0.999999940395355,0,0,1,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,0,0,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0.999999940395355,0,0,0,0,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,-0.999999940395355,0,0,-0.999999940395355,0,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0.999999940395355,0,0,0.999999940395355,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1,0,0,-0.999999940395355,0,0,-0.999999940395355 + } + NormalsW: *88 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *76 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25,0.125,0.0499999970197678,0.375,0.700000047683716,0.375,0.0499999970197678,0.625,0.0499999970197678,0.625,0.700000047683716,0.875,0.0499999970197678,0.125,0.0999999940395355,0.375,0.650000035762787,0.375,0.0999999940395355,0.625,0.0999999940395355,0.625,0.650000035762787,0.875,0.0999999940395355,0.125,0.150000005960464,0.375,0.600000023841858,0.375,0.150000005960464,0.625,0.150000005960464,0.625,0.600000023841858,0.875,0.150000005960464,0.125,0.200000002980232,0.375,0.550000011920929,0.375,0.200000002980232,0.625,0.200000002980232,0.625,0.550000011920929,0.875,0.200000002980232 + } + UVIndex: *88 { + a: 34,35,3,2,2,3,5,4,4,5,36,33,6,7,9,8,35,37,11,3,32,34,2,13,12,0,16,14,0,1,17,16,1,10,19,17,15,18,7,6,14,16,22,20,16,17,23,22,17,19,25,23,21,24,18,15,20,22,28,26,22,23,29,28,23,25,31,29,27,30,24,21,26,28,34,32,28,29,35,34,29,31,37,35,33,36,30,27 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *44 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + NodeAttribute: 2516901326896, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901324784, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901323056, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + NodeAttribute: 2516901324592, "NodeAttribute::", "LimbNode" { + Properties70: { + P: "Size", "double", "Number", "",3.33333333333333 + } + TypeFlags: "Skeleton" + } + Model: 2519866011712, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "AL7",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "AL7",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "AL7",1,1.23333332718325,1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 2519261335616, "Model::joint1", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,-0,90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519950487616, "Model::joint2", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2519924281408, "Model::joint3", "LimbNode" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A+",1.15431302203923,0,0 + P: "lockInfluenceWeights", "Bool", "", "A+U",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 2520147267648, "Model::joint4", "LimbNode" { + Version: 232 + Properties70: { + P: "PreRotation", "Vector3D", "Vector", "",0,0,-90 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",2 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.07370048859635,0,0 + } + Shading: Y + Culling: "CullingOff" + } + Pose: 2519376671616, "Pose::skinCluster1", "BindPose" { + Type: "BindPose" + Version: 100 + NbPoseNodes: 4 + PoseNode: { + Node: 2519866011712 + Matrix: *16 { + a: 1,0,0,0,0,1.23333332718325,0,0,0,0,1,0,0,0,0,1 + } + } + PoseNode: { + Node: 2519924281408 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,2.15431302203923,0,1 + } + } + PoseNode: { + Node: 2519950487616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,1,0,1 + } + } + PoseNode: { + Node: 2519261335616 + Matrix: *16 { + a: 0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1 + } + } + } + Material: 2520702829776, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Deformer: 2516901325168, "Deformer::", "Skin" { + Version: 101 + Link_DeformAcuracy: 50 + SkinningType: "Linear" + } + Deformer: 2517866673152, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 2,3,4,5,20,21,22,23 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + } + Deformer: 2519593291888, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 12,13,14,15,16,17,18,19 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + } + Deformer: 2519593292640, "SubDeformer::", "Cluster" { + Version: 100 + UserData: "", "" + Indexes: *8 { + a: 0,1,6,7,8,9,10,11 + } + Weights: *8 { + a: 1,1,1,1,1,1,1,1 + } + } + AnimationStack: 2520543546384, "AnimStack::wiggle", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationCurve: 2516914037264, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914034704, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914037104, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039344, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914041904, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914042224, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914037424, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039024, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914033264, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914038064, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: -46.01042,-43.63885,-37.28304,-28.08133,-17.1721,-5.693692,5.215543,14.41724,20.77306,23.14463,20.79496,14.60039,5.84254,-4.196945,-14.23643,-22.99428,-29.18885,-31.53852,-15.76926,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039824, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914038544, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914039664, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914041424, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914034224, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914035504, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914034544, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914035344, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914043664, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914049264, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 67.33469,62.51704,49.60577,30.91334,8.752201,-14.56517,-36.72631,-55.41875,-68.33002,-73.14766,-67.79517,-53.68407,-33.73389,-10.86418,12.00554,31.95572,46.06682,51.4193,25.70965,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914052304, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Constant|ConstantStandard + KeyAttrFlags: *1 { + a: 2 + } + ;KeyAttrDataFloat: RightSlope:0, NextLeftSlope:0, RightWeight:0.333333, NextLeftWeight:0.333333, RightVelocity:0, NextLeftVelocity:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914047984, "AnimCurve::", "" { + Default: 1.15431296825409 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313,1.154313 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914047824, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914046544, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914052944, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914052784, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914044464, "AnimCurve::", "" { + Default: 1 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914045744, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914051824, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurve: 2516914048784, "AnimCurve::", "" { + Default: 0 + KeyVer: 4009 + KeyTime: *20 { + a: 1924423250,3848846500,5773269750,7697693000,9622116250,11546539500,13470962750,15395386000,17319809250,19244232500,21168655750,23093079000,25017502250,26941925500,28866348750,30790772000,32715195250,34639618500,36564041750,38488465000 + } + KeyValueFloat: *20 { + a: 39.17219,36.48099,29.26856,18.82668,6.447142,-6.578291,-18.95783,-29.39971,-36.61214,-39.30334,-36.00316,-27.3027,-15.00204,-0.9012909,13.19946,25.50012,34.20058,37.50076,18.75038,0 + } + ;KeyAttrFlags: Cubic|TangeantAuto|GenericTimeIndependent|GenericClampProgressive + KeyAttrFlags: *1 { + a: 24840 + } + ;KeyAttrDataFloat: RightAuto:0, NextLeftAuto:0 + KeyAttrDataFloat: *4 { + a: 0,0,218434821,0 + } + KeyAttrRefCount: *1 { + a: 20 + } + } + AnimationCurveNode: 2520543546592, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543556784, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543560320, "AnimCurveNode::lockInfluenceWeights", "" { + Properties70: { + P: "d|lockInfluenceWeights", "Bool", "", "A",0 + } + } + AnimationCurveNode: 2520543562192, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543565936, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543566352, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543564064, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543557824, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543561360, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543559488, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543562400, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543557616, "AnimCurveNode::Visibility", "" { + Properties70: { + P: "d|Visibility", "Visibility", "", "A",1 + } + } + AnimationCurveNode: 2520543565520, "AnimCurveNode::T", "" { + Properties70: { + P: "d|X", "Number", "", "A",1.15431302203923 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationCurveNode: 2520543560736, "AnimCurveNode::S", "" { + Properties70: { + P: "d|X", "Number", "", "A",1 + P: "d|Y", "Number", "", "A",1 + P: "d|Z", "Number", "", "A",1 + } + } + AnimationCurveNode: 2520543559696, "AnimCurveNode::R", "" { + Properties70: { + P: "d|X", "Number", "", "A",0 + P: "d|Y", "Number", "", "A",0 + P: "d|Z", "Number", "", "A",0 + } + } + AnimationLayer: 2518375224176, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2519866011712,0 + + ;Model::joint1, Model::RootNode + C: "OO",2519261335616,0 + + ;Deformer::, Geometry:: + C: "OO",2516901325168,2516906940624 + + ;Geometry::, Model::pCube1 + C: "OO",2516906940624,2519866011712 + + ;Material::lambert1, Model::pCube1 + C: "OO",2520702829776,2519866011712 + + ;NodeAttribute::, Model::joint1 + C: "OO",2516901326896,2519261335616 + + ;Model::joint2, Model::joint1 + C: "OO",2519950487616,2519261335616 + + ;AnimCurveNode::T, Model::joint1 + C: "OP",2520543565936,2519261335616, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint1 + C: "OP",2520543564064,2519261335616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint1 + C: "OP",2520543566352,2519261335616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint1 + C: "OP",2520543562192,2519261335616, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint1 + C: "OP",2520543546592,2519261335616, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint2 + C: "OO",2516901324784,2519950487616 + + ;Model::joint3, Model::joint2 + C: "OO",2519924281408,2519950487616 + + ;AnimCurveNode::T, Model::joint2 + C: "OP",2520543561360,2519950487616, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint2 + C: "OP",2520543562400,2519950487616, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint2 + C: "OP",2520543559488,2519950487616, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint2 + C: "OP",2520543557824,2519950487616, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint2 + C: "OP",2520543556784,2519950487616, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint3 + C: "OO",2516901323056,2519924281408 + + ;Model::joint4, Model::joint3 + C: "OO",2520147267648,2519924281408 + + ;AnimCurveNode::T, Model::joint3 + C: "OP",2520543565520,2519924281408, "Lcl Translation" + + ;AnimCurveNode::R, Model::joint3 + C: "OP",2520543559696,2519924281408, "Lcl Rotation" + + ;AnimCurveNode::S, Model::joint3 + C: "OP",2520543560736,2519924281408, "Lcl Scaling" + + ;AnimCurveNode::Visibility, Model::joint3 + C: "OP",2520543557616,2519924281408, "Visibility" + + ;AnimCurveNode::lockInfluenceWeights, Model::joint3 + C: "OP",2520543560320,2519924281408, "lockInfluenceWeights" + + ;NodeAttribute::, Model::joint4 + C: "OO",2516901324592,2520147267648 + + ;SubDeformer::, Deformer:: + C: "OO",2517866673152,2516901325168 + + ;SubDeformer::, Deformer:: + C: "OO",2519593291888,2516901325168 + + ;SubDeformer::, Deformer:: + C: "OO",2519593292640,2516901325168 + + ;Model::joint3, SubDeformer:: + C: "OO",2519924281408,2517866673152 + + ;Model::joint2, SubDeformer:: + C: "OO",2519950487616,2519593291888 + + ;Model::joint1, SubDeformer:: + C: "OO",2519261335616,2519593292640 + + ;AnimLayer::BaseLayer, AnimStack::wiggle + C: "OO",2518375224176,2520543546384 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543546592,2518375224176 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543556784,2518375224176 + + ;AnimCurveNode::lockInfluenceWeights, AnimLayer::BaseLayer + C: "OO",2520543560320,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543562192,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543565936,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543566352,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543564064,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543557824,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543561360,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543559488,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543562400,2518375224176 + + ;AnimCurveNode::Visibility, AnimLayer::BaseLayer + C: "OO",2520543557616,2518375224176 + + ;AnimCurveNode::T, AnimLayer::BaseLayer + C: "OO",2520543565520,2518375224176 + + ;AnimCurveNode::S, AnimLayer::BaseLayer + C: "OO",2520543560736,2518375224176 + + ;AnimCurveNode::R, AnimLayer::BaseLayer + C: "OO",2520543559696,2518375224176 + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914037264,2520543562192, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914034704,2520543565936, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914037104,2520543565936, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914039344,2520543565936, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914041904,2520543566352, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914042224,2520543566352, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914037424,2520543566352, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914039024,2520543564064, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914033264,2520543564064, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914038064,2520543564064, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914039824,2520543557824, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914038544,2520543561360, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914039664,2520543561360, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914041424,2520543561360, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914034224,2520543559488, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914035504,2520543559488, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914034544,2520543559488, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914035344,2520543562400, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914043664,2520543562400, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914049264,2520543562400, "d|Z" + + ;AnimCurve::, AnimCurveNode::Visibility + C: "OP",2516914052304,2520543557616, "d|Visibility" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914047984,2520543565520, "d|X" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914047824,2520543565520, "d|Y" + + ;AnimCurve::, AnimCurveNode::T + C: "OP",2516914046544,2520543565520, "d|Z" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914052944,2520543560736, "d|X" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914052784,2520543560736, "d|Y" + + ;AnimCurve::, AnimCurveNode::S + C: "OP",2516914044464,2520543560736, "d|Z" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914045744,2520543559696, "d|X" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914051824,2520543559696, "d|Y" + + ;AnimCurve::, AnimCurveNode::R + C: "OP",2516914048784,2520543559696, "d|Z" +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "wiggle" { + FileName: "wiggle.tak" + LocalTime: 1924423250,38488465000 + ReferenceTime: 1924423250,38488465000 + } +} diff --git a/modules/ufbx/data/synthetic_sets_reorder_6100_ascii.fbx b/modules/ufbx/data/synthetic_sets_reorder_6100_ascii.fbx new file mode 100644 index 0000000..011eaf6 --- /dev/null +++ b/modules/ufbx/data/synthetic_sets_reorder_6100_ascii.fbx @@ -0,0 +1,460 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 14 + Minute: 36 + Second: 29 + Millisecond: 422 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementColor: 2 { + Version: 101 + Name: "Black" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0 + ,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1 + ColorIndex: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + LayerElementColor: 1 { + Version: 101 + Name: "White" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + ColorIndex: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + LayerElementColor: 0 { + Version: 101 + Name: "RGBCube" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 0,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,1,0,0,0,1,0,0,0,1,1,0,0 + ,1,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,1,0,0,0,1,0,0,1,1,0,1,1,1,0,1,0,1 + ColorIndex: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + LayerElementColor: 3 { + Version: 101 + Name: "Alpha" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + Colors: 1,1,1,0.400000005960464,1,1,1,0.5,1,1,1,0.699999988079071,1,1,1,0.600000023841858,1,1,1,0.600000023841858,1,1 + ,1,0.699999988079071,1,1,1,0.300000011920929,1,1,1,0.200000002980232,1,1,1,0.200000002980232,1,1,1,0.300000011920929 + ,1,1,1,0.100000001490116,1,1,1,0,1,1,1,0,1,1,1,0.100000001490116,1,1,1,0.5,1,1,1,0.400000005960464,1,1,1,0.5 + ,1,1,1,0.100000001490116,1,1,1,0.300000011920929,1,1,1,0.699999988079071,1,1,1,0,1,1,1,0.400000005960464,1,1 + ,1,0.600000023841858,1,1,1,0.200000002980232 + ColorIndex: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 + } + LayerElementUV: 2 { + Version: 101 + Name: "Row" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 5,0,1.00000011920929,0,1.00000011920929,1.00000011920929,5,1.00000011920929,2.00000023841858,0,2.00000023841858 + ,0,3.00000047683716,1.00000011920929,3.00000047683716,1.00000011920929,4.00000047683716,1.00000011920929,4.00000047683716 + ,0,4.00000047683716,0,5,0,5,0.99999988079071,6,0.99999988079071,3.00000047683716,0,4.00000047683716,1.00000011920929 + ,2.00000023841858,1.00000011920929,0,0,3.00000047683716,0,2.00000023841858,1.00000011920929,1.00000011920929 + ,1.00000011920929,1.00000011920929,0,0,1.00000011920929,6,0 + UVIndex: 17,1,20,22,2,21,5,19,4,18,7,16,6,14,9,8,15,10,11,3,12,0,23,13 + } + LayerElementUV: 0 { + Version: 101 + Name: "Default" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.401315778493881,0.105263143777847,0.598684191703796,0.105263143777847,0.401315778493881,0.302631556987762,0.598684191703796 + ,0.302631556987762,0.401315778493881,0.5,0.598684191703796,0.5,0.401315778493881,0.697368443012238,0.598684191703796 + ,0.697368443012238,0.401315778493881,0.894736886024475,0.598684191703796,0.894736886024475,0.796052634716034 + ,0.105263143777847,0.796052634716034,0.302631556987762,0.203947365283966,0.105263143777847,0.203947365283966 + ,0.302631556987762 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementUV: 1 { + Version: 101 + Name: "PerFace" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 1,0,1,0,0,0,0,1,0,0,1,1,0,0,1,1,0,1,1,1,1,0,1,1,0,0,0,1,1,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,1,1,1 + UVIndex: 17,1,20,22,2,21,5,19,4,18,7,16,6,14,9,8,15,10,11,3,12,0,23,13 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 2 + } + } + Layer: 3 { + Version: 100 + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 3 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_color_sets_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_color_sets_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "31/03/2020 11:36:29.421" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_color_sets_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "31/03/2020 11:36:29.421" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\color_sets.mb" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 384884650000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_simple_materials_0_mtl.mtl b/modules/ufbx/data/synthetic_simple_materials_0_mtl.mtl new file mode 100644 index 0000000..3538e63 --- /dev/null +++ b/modules/ufbx/data/synthetic_simple_materials_0_mtl.mtl @@ -0,0 +1,30 @@ + +# Standard .mtl material properties +newmtl RGB +Ka 1 0 0 +Kd 0 1 0 +Ks 0 0 1 +Ke 1 0 1 +Ns 99 +d 0.25 +illum 0 + +# PBR "extension" +newmtl PBR +Pr 0.1 +Pm 0.2 +Ps 0.3 0.4 0.5 +Pc 0.6 +Pcr 0.7 +Tf 0.8 0.9 1.0 +d 0.75 +Ni 1.33 + +# Widen to RGB values +newmtl Wide +Ka 0.1 +Kd 0.2 +Ks 0.3 +Ke 0.4 +Ps 0.5 +Tf 0.6 diff --git a/modules/ufbx/data/synthetic_simple_materials_0_obj.obj b/modules/ufbx/data/synthetic_simple_materials_0_obj.obj new file mode 100644 index 0000000..203bdd3 --- /dev/null +++ b/modules/ufbx/data/synthetic_simple_materials_0_obj.obj @@ -0,0 +1,4 @@ +usemtl RGB +mtllib synthetic_simple_materials_0_mtl.mtl +usemtl PBR + diff --git a/modules/ufbx/data/synthetic_simple_textures_0_mtl.mtl b/modules/ufbx/data/synthetic_simple_textures_0_mtl.mtl new file mode 100644 index 0000000..894fb06 --- /dev/null +++ b/modules/ufbx/data/synthetic_simple_textures_0_mtl.mtl @@ -0,0 +1,30 @@ + +# Standard .mtl material properties +newmtl RGB +map_Ka textures/checkerboard_ambient.png +map_Kd textures/checkerboard_diffuse.png +map_Ks textures/checkerboard_specular.png +map_Ke textures/checkerboard_emissive.png +map_Ns textures/checkerboard_roughness.png +map_d textures/checkerboard_transparency.png +map_bump textures/checkerboard_bump.png + +# PBR "extension" +newmtl PBR +map_Pr textures/checkerboard_roughness.png +map_Pm textures/checkerboard_metallic.png +map_Ps textures/checkerboard_reflection.png +map_Pc textures/checkerboard_specular.png +map_Pcr textures/checkerboard_weight.png +map_Tf textures/checkerboard_transparency.png +map_d textures/checkerboard_weight.png +map_Ni textures/checkerboard_specular.png +map_norm textures/checkerboard_normal.png +map_disp textures/checkerboard_displacement.png + +# Non-map_ special cases +newmtl NonMap +norm textures/checkerboard_normal.png +disp textures/checkerboard_displacement.png +bump textures/checkerboard_bump.png + diff --git a/modules/ufbx/data/synthetic_simple_textures_0_obj.obj b/modules/ufbx/data/synthetic_simple_textures_0_obj.obj new file mode 100644 index 0000000..19c05e2 --- /dev/null +++ b/modules/ufbx/data/synthetic_simple_textures_0_obj.obj @@ -0,0 +1,2 @@ +mtllib synthetic_simple_textures_0_mtl.mtl + diff --git a/modules/ufbx/data/synthetic_string_collision_7500_ascii.fbx b/modules/ufbx/data/synthetic_string_collision_7500_ascii.fbx new file mode 100644 index 0000000..96d83ce --- /dev/null +++ b/modules/ufbx/data/synthetic_string_collision_7500_ascii.fbx @@ -0,0 +1,4527 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 34 + Millisecond: 164 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} + +Collisions: { +AAAJHwT:AAAJKop:AAAKeJn:AAAPJYq:AAAQgbK:AAAVPlH:AAAVYNz:AAAXleY:AAAabnH:AAAbiZE:AAAfqcL:AAAhkRC:AAAkzYm:AAAlqGy:AAAtekx:AAAzByS:AAAzRPJ: +AABCcGY:AABDwvs:AABEWyi:AABSGby:AABTypf:AABbcnv:AABects:AABepXZ:AABnuna:AABpTKC:AABzeKo:AACCrdW:AACLQFQ:AACLyow:AACNhzV:AACXhLO:AACYjNi: +AACbjko:AACbmRM:AACddRT:AACfzhO:AACgyvO:AACkLsL:AACyNKa:AADTQfj:AADTyOL:AADVhZm:AADcpXw:AADgFBH:AADldro:AADmyVt:AADnzHt:AADxFBh:AAELtOb: +AAENeXq:AAEOWdv:AAEQDPR:AAERfVZ:AAETaES:AAEYosB:AAEZAjN:AAEjCGA:AAEkduh:AAEoMWy:AAErwiE:AAEuFbe:AAFAAFk:AAFCWTO:AAFHTzv:AAFHlus:AAFIBio: +AAFKnJa:AAFNOsK:AAFPJzA:AAFPLCA:AAFcbCI:AAFcbsA:AAFdCIr:AAFrJrd:AAFrPYh:AAGALOw:AAGDkoS:AAGHZeT:AAGJJai:AAGOmJH:AAGfqAf:AAGhCzg:AAGljnz: +AAGmCwT:AAGmzNR:AAGnmAt:AAHDBPp:AAHEMxT:AAHIXij:AAHKkOJ:AAHQwFp:AAHQylm:AAHWmjq:AAHYoCz:AAHcSlr:AAHgftC:AAHnrs:AAHqDZO:AAHqwXJ:AAHrjFO: +AAHywVF:AAHzAEX:AAHzVDq:AAIEHbk:AAIGZVG:AAIHPlA:AAIHYNs:AAIIrlq:AAITUzk:AAIVTYk:AAIhqJc:AAImByz:AAImRPc:AAIpaLY:AAIthUl:AAIwekQ:AAJIJyA: +AAJKUZR:AAJRQCB:AAJUREM:AAJZHBR:AAJeqgI:AAJkizu:AAJnqjz:AAJoEah:AAJomct:AAJqkrs:AAJsBYc:AAJsRpz:AAKHzuk:AAKPAeZ:AAKPBjl:AAKQSRu:AAKSBKv: +AAKZPok:AAKbEsW:AAKbTfe:AAKdxOD:AAKfIPB:AAKgdRM:AAKkaDG:AAKlNKx:AALAZVq:AALCwFe:AALLrDG:AALMsyL:AALPFPK:AALTOoV:AALUAEs:AALUBJE:AALZFGr: +AALkZDN:AALlBpG:AALqKr:AALwTFL:AAMAsGO:AAMLORe:AAMLosy:AAMVBIM:AAMYOSi:AAMccht:AAMdxJ:AAMmygk:AAMntdj:AAMpmgU:AAMtchT:AANEouH:AANKaec: +AANMGxM:AANROrn:AANRoSr:AANStoR:AANSyHK:AANUXNm:AANUexA:AANWczP:AANYfvj:AANZDpb:AANcvTc:AANdJrm:AANdPYa:AANeteU:AANiTvv:AANjQMS:AANkbwn: +AANnFBU:AANpcqk:AANpfrL:AANtvTC:AAOAVaI:AAOCGkH:AAOGRBd:AAOGxRU:AAOJYIW:AAOLRch:AAOMsOP:AAOTznY:AAOUGL:AAOVqnb:AAOWyPs:AAOXNGm:AAOjnrh: +AAOomfp:AAOpx:AAOvAmc:AAPGBPY:AAPPYiX:AAPRRCg:AAPZzNV:AAPgaxT:AAPhfCz:AAPnFRt:AAPqCZw:AAPurUI:AAQBrwu:AAQKPlz:AAQKYNH:AAQMlek:AAQQKdl: +AAQSGPQ:AAQcaLb:AAQdrGN:AAQfezr:AAQkqJX:AAQlkAt:AAQreqK:AARDQCK:AARQbRG:AARTejW:AARUHWm:AARUKOI:AARcunO:AARfRMl:AARihxG:AARjrgE:AARlKha: +AARpqCU:AARqzUj:AARuzyt:AASCIhs:AASFOdb:AASGknN:AASJWHH:AASLPol:AASMrwu:AASNTmH:AASTIhS:AASUGhE:AASXknn:AASZyqm:AASlxwG:AASoJNU:AASwDNP: +AASwNrn:AASxAHv:AASycNB:AASysqw:AATHOuo:AATLFGk:AATZSrE:AATbEAp:AATbnZm:AATcRBA:AATfImo:AATrxWP:AAUBoUj:AAUDWdD:AAUFlUx:AAUNJZJ:AAUNLcJ: +AAURUde:AAURjYC:AAUSerK:AAUdavS:AAUmCGs:AAUqHoc:AAUsApV:AAUtzHz:AAVBTCt:AAVDAJe:AAVEOru:AAVEoSi:AAVSqfo:AAVVHCT:AAVXYnG:AAVXjyz:AAVccqp: +AAVcfrW:AAVgJrv:AAVgPYz:AAVlPFb:AAVmwIN:AAVrsOB:AAVtEvY:AAVuCgJ:AAVuPk:AAVwtDz:AAVyHOZ:AAVzzhC:AAWFvwJ:AAWGznp:AAWHyPZ:AAWIqnK:AAWJRcx: +AAWKNGD:AAWORcA:AAWXRBM:AAWZdYH:AAWajnl:AAWfOPR:AAWtBxr:AAWvwvi:AAWxHXM:AAXIDUU:AAXMzNi:AAXNypC:AAXOqNR:AAXSYig:AAXTJAF:AAXURCX:AAXgTqq: +AAXibK:AAXkaYA:AAXoAMS:AAXruPW:AAXsieb:AAXsllB:AAXvjNU:AAYAeJu:AAYBPIp:AAYJZag:AAYJyXk:AAYLpLq:AAYPZkl:AAYScgU:AAYUWYe:AAYaoER:AAYionM: +AAYjwpB:AAYrcNz:AAYupxV:AAYvbns:AAZDXmr:AAZIGbL:AAZJPiI:AAZNJyS:AAZRyxR:AAZTplH:AAZXZKU:AAZYcGl:AAZaKEV:AAZdEaz:AAZdmcf:AAZiIrR:AAZoeZb: +AAZukad:AAaCZks:AAaFcgJ:AAaHWYz:AAaMZax:AAaMyXt:AAaOpLn:AAaTBks:AAaUPIo:AAaVGBj:AAaXGPG:AAaYJYu:AAafhWx:AAbLcGE:AAbNWyu:AAbZeje:AAbaizN: +AAbbRR:AAbeqCG:AAbkcnj:AAblhww:AAbncto:AAbnpXF:AAbpbNC:AAbswPR:AAbuqGG:AAbzzyf:AAcQZvm:AAcSwfy:AAcaaDR:AAcaiRi:AAchrsH:AAcmugn:AAcpzhc: +AAdBrDP:AAdIYHX:AAdJOoA:AAdMhZQ:AAdWZVf:AAdaUeC:AAdcsQn:AAdhRBo:AAduzHH:AAdvyVH:AAdzLSK:AAeCbvM:AAeLBIz:AAePqFH:AAeYsGx:AAebCsY:AAehApH: +AAeiWez:AAekOwY:AAekRkA:AAetJRQ:AAezQmo:AAfBHaJ:AAfDFoq:AAfGEAc:AAfKHCz:AAfMUDr:AAfMYni:AAfMjyT:AAfNWDs:AAfPDpW:AAfSOUg:AAfWOsW:AAfbVbK: +AAfdzRA:AAffBQW:AAfhCSP:AAfiKFu:AAfjdUm:AAfoWEs:AAfzyGu:AAgCfHB:AAgFVar:AAgJLOs:AAgMkoW:AAgWBpM:AAgejfr:AAgfCwP:AAgfzNV:AAgptWg:AAgrGvJ: +AAgxfcn:AAhCWpf:AAhGvNF:AAhIJAT:AAhJwFt:AAhJyli:AAhNVAK:AAhRXin:AAhXvNf:AAhdHxf:AAhguPE:AAhjDZK:AAhjwXN:AAhkjNG:AAhmmaI:AAhpftG:AAhyMfw: +AAidkRn:AAifoED:AAigDna:AAihqGT:AAipekU:AAivRPg:AAiyhXs:AAjAbnl:AAjDHBv:AAjFZvZ:AAjHrLl:AAjNKDj:AAjUTyv:AAjZlEm:AAjbmyP:AAjewPM:AAjnIrd: +AAjshuq:AAjsoNb:AAjveKL:AAkAZwR:AAkCjbb:AAkDZvD:AAkFwfP:AAkHQFt:AAkHyoR:AAkJhzs:AAkMJdB:AAkMrTz:AAkPyqv:AAkXOUc:AAkYJpw:AAkgaUo:AAkhaUO: +AAkmjkj:AAkmmRH:AAkrnza:AAksRbM:AAkvIMc:AAlGzUn:AAlHIHM:AAlNQfM:AAlNyOk:AAlPSrp:AAlRBks:AAlZYsX:AAlaESR:AAlcFBo:AAlcsUg:AAleIpG:AAlfdrH: +AAlgMzz:AAllLSp:AAlzadB:AAlziry:AAmBdEr:AAmCgXP:AAmFtOE:AAmMDPu:AAmNaEt:AAmRTcx:AAmTAji:AAmUORy:AAmUose:AAmaoRA:AAmgduO:AAmiCil:AAmlQmd: +AAmpKH:AAmwJRz:AAmwPyv:AAnEBiJ:AAnFnJd:AAnHrxO:AAnIqfx:AAnazvZ:AAnbcHs:AAnhsOU:AAnlyGl:AAnmtDm:AAnwFBY:AAoDsOl:AAoFbf:AAoIaLt:AAoJGkt: +AAoYDuY:AAofmfL:AAoiCww:AAoizNq:AAotXYs:AApCLoc:AApCQoK:AApDXig:AApFkOG:AApRGKC:AApVRbo:AApWGZJ:AApoznF:AAptTnw:AApwFRp:AAqBGAk:AAqCXMF: +AAqFleo:AAqGQcD:AAqJReK:AAqKrwq:AAqPUzT:AAqSWBJ:AAqTXMf:AAqYGBX:AAqdzue:AAqhOpc:AAqiRmc:AAqlhXH:AAqmrGJ:AAqpKHN:AAqqKeB:AAqtEAn:AAqtmCr: +AAqyIRF:AArDJyL:AArJPLu:AArJYnG:AArLlEd:AArQrWz:AArXZvS:AArYWbA:AAraeQD:AArjqjW:AArnOPh:AAroRMh:AArralm:AArsrgA:AArwKEI:AAsEFpA:AAsEZyj: +AAsNGhA:AAsVrwq:AAsaZdd:AAsajkU:AAsamRw:AAsbugx:AAsfaDD:AAspDNT:AAspNrj:AAsuxwC:AAsvXdS:AAsxJNQ:AAszpBM:AAtBIHx:AAtFkNE:AAtIsyi:AAtLhlZ: +AAtOYHj:AAtQOus:AAtTGHN:AAtYyQf:AAtanDl:AAtkEAl:AAtknZq:AAtoRpF:AAtvNRe:AAtxcnI:AAuDrzt:AAuETcA:AAuGAjP:AAuOfVD:AAuTOSl:AAuUdEK:AAuXHcA: +AAuecQe:AAuefRB:AAuhdFr:AAuhvtm:AAunTVx:AAvAouo:AAvCWDA:AAvETzx:AAvIGxj:AAvQXNJ:AAvQexf:AAvReRN:AAvSczw:AAvfbwi:AAvjcqL:AAvjfrk:AAvoyGG: +AAvpHOf:AAvrAPS:AAwAHUw:AAwEZen:AAwFYIr:AAwHRcM:AAwRqnG:AAwTNGH:AAwetWy:AAwiSLQ:AAwmayt:AAwuiEW:AAwulLw:AAwwXYj:AAwzruC:AAxIdyM:AAxJnJk: +AAxNRCD:AAxUvWO:AAxVzNu:AAxXqNN:AAxZNgA:AAxewVl:AAxgAER:AAxjFRW:AAxojFE:AAxuOpW:AAyEWBC:AAyIHwK:AAyIKoo:AAyJBkh:AAyLGBq:AAyNyPN:AAyYZpt: +AAyeqJu:AAyhuNI:AAyneqf:AAyqiZZ:AAyuqcS:AAzAQCt:AAzPejH:AAzQHWr:AAzQKOV:AAzWJyW:AAzbRMs:AAzealv:AAzfrgZ:AAzhhuc:AAzhoNp:AAzmqjL:AAzpoeo: +ABADJuf:ABAGWqT:ABAIYxV:ABAIqQp:ABANKyQ:ABAPZbS:ABAXarb:ABAXkIJ:ABAYoBg:ABAYzP:ABAiABK:ABAiNsx:ABAjedo:ABApsID:ABArxJu:ABAsKlh:ABAsNme: +ABAsevx:ABAwiZg:ABBOYXo:ABBOqqI:ABBXZBj:ABBcXxe:ABBmlDt:ABBnJJF:ABBreDV:ABBrtQd:ABBtXxE:ABBvigC:ABBwDeL:ABByZlX:ABBzxjL:ABCCDRv:ABCDQQg: +ABCOARp:ABCVOda:ABCWTXA:ABCgDQo:ABCgVcp:ABChYpS:ABCuZWB:ABDDdgj:ABDFCkL:ABDFoBz:ABDIRoK:ABDJGoO:ABDQSpL:ABDUbhv:ABDYQlb:ABDaclj:ABDawRN: +ABDiSXQ:ABDnjee:ABDnpNi:ABDohXi:ABDssHu:ABEIvvq:ABEJYMj:ABELvjV:ABEMBjx:ABEQShG:ABETVKw:ABEUSXh:ABEUtLS:ABEVrtP:ABEemQm:ABEeupd:ABEfgai: +ABEiAOc:ABEmtYD:ABErfeC:ABEwMqH:ABExWiQ:ABFGKXK:ABFMWQq:ABFPdBb:ABFQvVN:ABFUBJG:ABFWXeR:ABFWruc:ABFYSHx:ABFZVkH:ABFkvXC:ABFmmqR:ABFntfF: +ABFzNEo:ABGBYlZ:ABGDBet:ABGGaKD:ABGKrrW:ABGSgVw:ABGWLrs:ABGmHOT:ABGnRPV:ABGuZby:ABGwVq:ABGxZNG:ABHHYLA:ABHJwuM:ABHLCkd:ABHYQhG:ABHesWU: +ABHgImt:ABHhkRE:ABHooGd:ABHprZd:ABHtRpM:ABHvEMq:ABIAMkq:ABIARCY:ABIAjsa:ABIFyDB:ABIKlws:ABIMsEJ:ABINosZ:ABITpxT:ABIVtzp:ABIfruN:ABIgASx: +ABIgIEC:ABIqbGQ:ABIrSQu:ABIsUpD:ABIwxso:ABIyjYm:ABJDjGC:ABJEUZh:ABJGMKF:ABJGRcn:ABJGjSV:ABJNydu:ABJVoSm:ABJWKYA:ABJZShE:ABJbNSh:ABJcRDu: +ABJgzSO:ABJiDeE:ABJlZlq:ABJnrUy:ABJpgQV:ABJvkKm:ABKBbHT:ABKERmp:ABKFttE:ABKQCKn:ABKQobX:ABKUoDh:ABKfCFa:ABKfFEF:ABKfULA:ABKlkLN:ABKppqS: +ABKxeAh:ABKyDQv:ABKyVci:ABLBEob:ABLBxYN:ABLCLJC:ABLDCms:ABLFfZ:ABLJgon:ABLKRMy:ABLLQlI:ABLRObk:ABLTwSE:ABLVLby:ABLXHHY:ABLcAAr:ABLetau: +ABLkCfH:ABLkFeo:ABLkUlh:ABLtAAR:ABMJYiO:ABMMdbD:ABMPnwK:ABMQZyx:ABMSQyC:ABMUnPL:ABMVzrj:ABMWVKn:ABMYrtI:ABMaWaA:ABMbvsv:ABMfIRS:ABMhxLC: +ABMjJLY:ABMnAnp:ABMpgHF:ABMqoGz:ABMrokb:ABMrrhj:ABMtbjZ:ABNBmoz:ABNCbhY:ABNEvJF:ABNHQIh:ABNJgMI:ABNRWT:ABNSYmz:ABNVnWB:ABNWZYq:ABNYQYJ: +ABNZJkM:ABNZrTy:ABNbMvC:ABNcZye:ABNdiJq:ABNkfES:ABNmcMp:ABNogAy:ABNpJlP:ABNqJYm:ABNvIjI:ABNvogS:ABNxoKk:ABNxrHc:ABNzKkG:ABOBhuQ:ABOCnHY: +ABOEgVn:ABOGBeM:ABOLksM:ABOOYGB:ABOZzgx:ABOaRPo:ABObcmC:ABOekrg:ABOliEC:ABOoEfj:ABOsEmS:ABOyUYE:ABPBrRg:ABPFaWt:ABPHuMx:ABPInhP:ABPIoNV: +ABPKYLj:ABPLxzJ:ABPOCkO:ABPZYoj:ABPZzVf:ABPcrZO:ABPdHod:ABPgRpf:ABPkkRn:ABPlevB:ABPqOrS:ABPtEkQ:ABPyOYL:ABPzWGC:ABQEZbM:ABQFSHK:ABQGpxM: +ABQIXsB:ABQMlKW:ABQPHmi:ABQVYfl:ABQaSbD:ABQafuL:ABQciGd:ABQddYq:ABQdneO:ABQemMY:ABQljYt:ABQnEjn:ABQnPUh:ABQuSQl:ABQvsIz:ABQwxgg:ABQxHil: +ABQyruW:ABRAoxp:ABRDobp:ABRHoSj:ABRIJiD:ABRIRSa:ABRLShB:ABROdJV:ABRVseZ:ABRWfPT:ABRbrgE:ABReJDc:ABRjurr:ABRlCyj:ABSAFAg:ABSDHhW:ABSGRON: +ABSHDRH:ABSNJNL:ABSNusj:ABSNyYq:ABSOSPI:ABSShVR:ABSUfXi:ABSkTsL:ABSsvUS:ABSuZeY:ABSwbfO:ABSycdH:ABSzkqm:ABTCTxh:ABTExYW:ABTFEES:ABTGCmj: +ABTIFaP:ABTORoy:ABTTyyF:ABThsHg:ABTnSXC:ABTqeax:ABTypQC:ABUBeFS:ABUMYid:ABUQpew:ABUROtV:ABUTrUN:ABUWShu:ABUcgHm:ABUdoki:ABUdrha:ABUfKKE: +ABUgbjq:ABUkfLv:ABUkxLh:ABUlMqZ:ABUmWiC:ABUqboQ:ABUrtYV:ABUuSJN:ABUuhOn:ABUxvxn:ABUzupv:ABVASxA:ABVAtlz:ABVHefH:ABVKYgb:ABVMJkt:ABVNVYU: +ABVVPIi:ABVYz:ABVZwgu:ABVbWIx:ABVcMQa:ABVhIjP:ABVhogJ:ABVighv:ABVkoKR:ABVkrHZ:ABVnUGV:ABVoNEY:ABVqflm:ABVqxls:ABVrGWt:ABVrRBw:ABVsJli: +ABVvOKa:ABVwiJH:ABWBjNm:ABWCGuW:ABWIxZl:ABWLtHF:ABWMzgW:ABWQWAX:ABWRBYd:ABWZaKr:ABWfWgE:ABWhQpP:ABWmQLN:ABWqeUg:ABWsMNX:ABXACkv:ABXNjIv: +ABXVCPM:ABXWWag:ABXpQPo:ABXyMng:ABYBuzf:ABYCosH:ABYWxrQ:ABYbJdA:ABYeuRP:ABYgCYH:ABYhUpV:ABYiNmP:ABYievM:ABYjxgL:ABYmrGg:ABYsXXi:ABZAdJO: +ABZBXSr:ABZIfPM:ABZcjyD:ABZePuX:ABZjSBt:ABZkdyA:ABZligT:ABZnmmi:ABZqAsQ:ABZqIej:ABZvPOC:ABZxRDK:ABaAXE:ABaAlwX:ABaBarN:ABaBkIf:ABaCsEa: +ABaJSNq:ABaMJuj:ABaPWqX:ABaUUzt:ABaWMkZ:ABaWRCr:ABaWjsJ:ABaXxr:ABahzss:ABarABG:ABarNst:ABasRdi:ABawzsS:ABayDEY:ABbBzNt:ABbFoxB:ABbGaRg: +ABbGkiO:ABbMKYT:ABbOZBV:ABbSJUc:ABbTzAE:ABbVWQQ:ABbXYXS:ABbXqqu:ABbZHMr:ABbaxjp:ABbieDj:ABbitQX:ABbrJV:ABbwAbn:ABbxAbN:ABcCwcy:ABcMQQk: +ABcPTXM:ABcRxyr:ABcTCMO:ABcWLIQ:ABcZgOR:ABcbMpa:ABccBDw:ABceZAI:ABcfshb:ABcmdir:ABdByfg:ABdCKuo:ABdEBAE:ABdIwCr:ABdRDrq:ABdSGoS:ABdVTxF: +ABdcbFv:ABddkQT:ABdecDq:ABdfDqh:ABdfVCw:ABdiBTt:ABdkZaB:ABdqOeB:ABdwDBL:ABeFqXT:ABeIEHh:ABeRmOf:ABeSbHE:ABeUvjZ:ABeXQit:ABeZgmU:ABeatFu: +ABedElC:ABedglf:ABejQVM:ABesZYy:ABetijm:ABfATi:ABfFWQu:ABfIYmQ:ABfYbhr:ABfZmoQ:ABfafEx:ABfegAR:ABfgGWf:ABfgRBe:ABflELt:ABflgLQ:ABfrQvz: +ABfyZyN:ABfzMvh:ABgBlHx:ABgCksP:ABgDsHt:ABgEgGm:ABgHGuE:ABgYnHd:ABgYonb:ABgZhul:ABgbZNc:ABgeEfW:ABgeHLF:ABgiEmn:ABgwRPR:ABhAYoe:ABhAzVi: +ABhGkXe:ABhRgvh:ABhSxzE:ABhVLRl:ABhWqTG:ABhZrRH:ABhgZnX:ABhtZBf:ABiCYxu:ABiCqQS:ABiJKyr:ABiLYfq:ABiMfgy:ABiMznR:ABiPJYk:ABiQoXd:ABiToBd: +ABiYJIP:ABiYRsu:ABibldN:ABidABH:ABieRdf:ABigrH:ABimxgz:ABinKlk:ABinNmf:ABirrGQ:ABiuJdw:ABizuRf:ABjFJE:ABjFJUz:ABjKYXJ:ABjKqql:ABjLseq: +ABjUfGF:ABjUzNm:ABjZlWH:ABjkAbW:ABjkNSd:ABjmRDY:ABjpbgj:ABjqMep:ABjqzSc:ABjvAsC:ABjvIex:ABjygQZ:ABkKARU:ABkNRml:ABkSTXd:ABkUEOw:ABkWCMf: +ABkbYpv:ABkcDQJ:ABkcVcU:ABkeTRc:ABkthxw:ABkxshk:ABlQbhQ:ABlTRMu:ABldSXV:ABlfeaM:ABlkhXN:ABluCfd:ABluFeC:ABluUlD:ABlxDqs:ABlxVCl:ABlzTrZ: +ABmEbHL:ABmHOtA:ABmJXEh:ABmJrUY:ABmQSXM:ABmQtLv:ABmXeFD:ABmamQH:ABmaupA:ABmfbof:ABmjSJy:ABmjhOY:ABmrWit:ABmsMqm:ABmxoGF:ABmygHz:ABnBEhx: +ABnFuU:ABnKvVm:ABnLdBA:ABnQhbv:ABnUzRo:ABnVVkk:ABnXrTL:ABngmqq:ABnguPx:ABnjtfe:ABnmFTq:ABnpWAD:ABnzWIM:ABoDqte:ABoJawY:ABoMYlG:ABoOwUK: +ABoQCKb:ABocogB:ABofrzB:ABogHOi:ABogSG:ABojRPk:ABooZbD:ABpBnhT:ABpBoNR:ABpDgvc:ABpIqTL:ABpLZT:ABpLrRC:ABpOaWp:ABpPaWP:ABpSQhh:ABpUwuB: +ABpYkXn:ABpacMN:ABpdkRj:ABpgKvx:ABpgXwk:ABplrZK:ABppRpb:ABpxUyH:ABqGlwn:ABqIjgI:ABqPcvW:ABqQpxi:ABqRXsF:ABqStzM:ABqcrus:ABqnSQh:ABqsxsr: +ABquDkQ:ABqzfuH:ABrAUZK:ABrCMKe:ABrCRcM:ABrCjSu:ABrLaRq:ABrLkiY:ABrMobt:ABrSKYb:ABrUYFa:ABrXXSO:ABrYdJr:ABrbigi:ABrdmmT:ABrfxjf:ABrgNMv: +ABrgeVk:ABrkizt:ABrtSqa:ABrusiw:ABsARmS:ABsJLBS:ABsJtMV:ABsMHhS:ABsPGOn:ABsPhqA:ABsRjMa:ABsRlta:ABsYwsO:ABsdDbq:ABsnxE:ABsvBDA:ABsvBtI: +ABtBAre:ABtBJZ:ABtDgoK:ABtFQll:ABtNSpB:ABtVRoE:ABtZaQd:ABtiZww:ABtjTSG:ABtqejc:ABtqqZU:ABtycpW:ABuAVyB:ABuGmOt:ABuNYGu:ABuOdNw:ABuRzrM: +ABuTjvp:ABudxNI:ABukIJG:ABumoke:ABumrhm:ABuoKKI:ABupKKi:ABuqNen:ABurUga:ABuvJyc:ABuzOkV:ABvAOTQ:ABvCXex:ABvCruI:ABvLYIc:ABvQefT:ABvRnWg: +ABvatyQ:ABvcSji:ABvchoI:ABvjflq:ABvjxlo:ABvlWID:ABvrghj:ABvuKkB:ABvvbJv:ABvyxnb:ABwCLrI:ABwElHF:ABwHksn:ABwJgGS:ABwKjNa:ABwUtHJ:ABwZbIb: +ABwgQPi:ABwmIMU:ABwpWgi:ABwqMTT:ABwqeVH:ABwsKES:ABwwCYq:ABwxCYQ:ABwzeUk:ABxCaWI:ABxGgvz:ABxHxzW:ABxLkXw:ABxRGUl:ABxgkRs:ABxlZnJ:ABxqEkl: +ABxyMtc:AByAxru:AByDXsM:AByEtzF:AByMosl:AByNJIB:AByNRsg:AByRfgk:AByVoXv:AByamMv:ABynbGg:AByqSQC:ABysxgH:ABzAuZy:ABzBoSW:ABzHpXY:ABzIcVg: +ABzKXSv:ABzOlkc:ABzVxRN:ABzZJyB:ABzdurO:ABzfCyW:ABzfSFb:ABzgUPI:ABzjxSB:ABzlDKa:ABzrXxv:ABzwSqX:ABzxKLB:ABzxNMO:ABzxeVR:ACAAkoj:ACACFbo: +ACAGLxN:ACAPCgu:ACAPJWT:ACAUzXS:ACAdSzG:ACAdTWq:ACAewhh:ACAgHhs:ACAiiiK:ACAvilJ:ACAxHhS:ACBAfnz:ACBCHrI:ACBIxtv:ACBKmCy:ACBNySl:ACBObEh: +ACBWRwX:ACBWWvD:ACBXiSi:ACBcNri:ACBelPY:ACBgtDO:ACBikVH:ACBozqo:ACCBrVk:ACCEfXM:ACCGANP:ACCIbAg:ACCUKrg:ACCXIis:ACCequl:ACCgeaz:ACCqGJr: +ACCqewo:ACDAAao:ACDEArV:ACDQRIw:ACDQzTJ:ACDUfke:ACDUvWg:ACDYXph:ACDcOnB:ACDhVFj:ACDqmOl:ACDuuLF:ACEAGNM:ACEEwkR:ACEJARy:ACELJXA:ACELtgj: +ACENGeT:ACENkK:ACEPefy:ACESlz:ACEUsCn:ACEflGI:ACEiONM:ACEiwWr:ACEtalf:ACFbOXB:ACFoQWY:ACFqewP:ACFrvhu:ACFuImd:ACFwhNL:ACGCgVt:ACGDCfB: +ACGeWYv:ACGhBev:ACGhMji:ACGjsLv:ACGrHsU:ACGridW:ACGuQwR:ACHAFvX:ACHNkOD:ACHOyQT:ACHTJam:ACHWEjA:ACHeMfp:ACHgXtb:ACHlIQm:ACHpEHJ:ACHqXTm: +ACHxTWK:ACHyIaQ:ACIAIoU:ACICMfb:ACICxsR:ACIGFVO:ACIHbSq:ACIJDQP:ACIRAQd:ACISQyi:ACIZNID:ACIeNd:ACIlNAL:ACIlVql:ACIpZCD:ACIpklA:ACIqdAQ: +ACItmfl:ACIuIFE:ACJBSmH:ACJCIIQ:ACJJRwq:ACJJWvm:ACJPEQN:ACJPfEl:ACJPjUH:ACJPoJK:ACJRKRE:ACJTomZ:ACJVbaE:ACJbBdQ:ACJcQeY:ACJgYHg:ACJnLwl: +ACJtxBm:ACJvbHB:ACKHSMq:ACKKIih:ACKMQQd:ACKPRWH:ACKPWVT:ACKRblO:ACKRxTf:ACKTmci:ACKZfNj:ACKlQB:ACKpKMi:ACKpvKt:ACLBzSw:ACLGMXv:ACLIJxg: +ACLItGL:ACLKudy:ACLNRAA:ACLVadG:ACLcYo:ACLfSGM:ACLgqcJ:ACLiNTJ:ACLjOPd:ACLyjvR:ACMDljn:ACMKrLR:ACMLnbx:ACMTRaX:ACMdNCo:ACMnjVk:ACMqVfZ: +ACMuDzh:ACMxBym:ACNFqcs:ACNJprM:ACNRSrf:ACNSLj:ACNXMmA:ACNXwsW:ACNZHVv:ACNeOXk:ACNfYRo:ACNiLTY:ACNpcua:ACNykmU:ACONqCJ:ACOPSSS:ACOTZJo: +ACOWCfY:ACOeHsN:ACOeidL:ACOhQwI:ACOiufZ:ACOkBem:ACOkMjr:ACOmsLm:ACOrqan:ACOsFqJ:ACOsuGB:ACOtMKJ:ACOwWsd:ACOxcUX:ACOybxb:ACPIEjH:ACPQeMY: +ACPVYpP:ACPaGan:ACPbZwS:ACPbccc:ACPciLm:ACPhQqQ:ACPhfYm:ACPlIax:ACPndIU:ACPnjht:ACPownT:ACPpMPi:ACPtudi:ACPwTFn:ACQDYQC:ACQFQyN:ACQKOqD: +ACQKPCW:ACQKymj:ACQLNIC:ACQNWKG:ACQRKmL:ACQVpTl:ACQatbT:ACQbpbK:ACQddAv:ACQgbZK:ACQhZWJ:ACQhcCz:ACQnQQH:ACQnfyt:ACQrIAa:ACQtdiL:ACQtjHm: +ACQuidL:ACQvMpp:ACRDbEF:ACRKAJR:ACRNifC:ACROgQd:ACRTSz:ACRgQDX:ACRjuow:ACRplZL:ACRrgGc:ACRviBV:ACSBisP:ACSCRWa:ACSKSMX:ACSLANB:ACSMoMJ: +ACSObAU:ACSTYOJ:ACSTdYd:ACSaYhW:ACSdyLx:ACSoEyk:ACSobhR:ACSxggT:ACTAlJL:ACTNeFd:ACTQRAz:ACTSehZ:ACTUzSL:ACTXMXM:ACTberR:ACTbuSp:ACTpqGM: +ACTyqcQ:ACUDupy:ACUOaDw:ACUUYb:ACUWRaq:ACUZTDF:ACUgbcO:ACUheRY:ACUkByD:ACUqdbq:ACVLYIS:ACVMNGO:ACVVAjZ:ACVVlNb:ACVavrM:ACVbEzU:ACVbkDW: +ACVccUc:ACVebXd:ACVhSDB:ACVoGub:ACVpGuB:ACVpoP:ACVqmf:ACVuCsw:ACVwSDb:ACWHgVf:ACWKSRv:ACWVDhT:ACWcDnG:ACWcxVn:ACWfFqc:ACWfuGk:ACWnOpm: +ACWrFHE:ACWuGUm:ACXAEUD:ACXDyQf:ACXGNia:ACXKUDS:ACXOYqa:ACXQkOv:ACXSFBs:ACXTkic:ACXVapg:ACXWLXR:ACXbiDn:ACXfCgZ:ACXlXtP:ACXnZcA:ACXnkLD: +ACXtTwm:ACXtXZb:ACXuwHt:ACXwHHo:ACXyiIW:ACYDKmE:ACYHpTe:ACYKOHP:ACYLuCS:ACYUAQJ:ACYXQyG:ACYbTwR:ACYcdyB:ACYhwNd:ACYsKII:ACYvIqt:ACZEEQP: +ACZEfEr:ACZEjUV:ACZEoJU:ACZJrsh:ACZNcPo:ACZOdZr:ACZOlZD:ACZPeFe:ACZRRQB:ACZRrvW:ACZUtYS:ACZUzgq:ACZaylV:ACZecDR:ACZiiBO:ACZjMlr:ACZnQQn: +ACZslZU:ACZugGz:ACaANIQ:ACaCWKU:ACaHAQQ:ACaKlCB:ACaMTML:ACaTljP:ACaUsiK:ACacTfE:ACafKIR:ACagtbf:ACakmfy:ACarMFr:ACasNAY:ACasVqy:ACbAdZy: +ACbAlZO:ACbCifQ:ACbHKRp:ACbJomo:ACbLbap:ACbSbeq:ACbaHCK:ACbdLwY:ACbjeAm:ACbkleU:ACbkxBx:ACblEYN:ACblbHw:ACcFdzB:ACcFlzt:ACcHblX:ACcHxTq: +ACcIYOt:ACcIdYZ:ACcNbeo:ACcRHRN:ACcUyZv:ACcehYL:ACcgHcP:ACchkvO:ACcnzQh:ACcrNRn:ACcsbfB:ACcubrf:ACcuisR:ACcvtdH:ACdHrqh:ACdIwiS:ACdLArj: +ACdTlJb:ACdiAHv:ACdtNcc:ACdxmOP:ACeCMRp:ACeCfKN:ACeCvwL:ACeGHzp:ACeGXPC:ACeKuHP:ACeOAAD:ACePAAd:ACeXHzP:ACeXXPc:ACeZGNI:ACeoAhA:ACerONI: +ACerwWv:ACesHsp:ACfHCFm:ACfMblp:ACfOSsg:ACfYap:ACfeEzg:ACfekDe:ACfhWyy:ACfphNH:ACfuHSZ:ACfuiDX:ACfyuFN:ACfzewT:ACgAMFG:ACgEOuq:ACgMCfF: +ACghqaq:ACgjMKU:ACgkvRT:ACgqfET:ACgqvHz:ACgtIMk:ACgvhnC:AChAlJv:AChDIOF:AChFMFq:AChFxSA:AChKzxy:AChLLXD:AChTYqw:AChVQYz:AChYCF:AChhIfV: +AChiSZM:AChiXZt:AChjudD:AChniIA:AChqpjr:AChtdaB:AChxccN:AChyGaC:ACiGljy:ACiJCgP:ACiJJWq:ACiQzXv:ACicHhV:ACicJWy:ACipXtf:ACivXTi:ACiytbo: +ACjBFSN:ACjCJxC:ACjEbLz:ACjExtS:ACjGRQp:ACjGrve:ACjRiSL:ACjSWva:ACjctDj:ACjhseb:ACjkzqJ:ACjprZB:ACjqYHK:ACjsvkA:ACjtyld:ACjveWa:ACkOEqK: +ACkOfei:ACkOjuM:ACkOojN:ACkRIiT:ACkTQQX:ACkYRWt:ACkYWVh:ACkaquK:ACkblEe:ACkbxbH:ACkebhG:ACkmLWi:ACkvYhb:AClCGch:AClFGnG:AClIehm:AClauUt: +AClhNcZ:ACliaLl:ACloSGA:AClouFL:ACltOPH:AClwbCs:ACmArQx:ACmHJXb:ACmHtgI:ACmIGCa:ACmUnbd:ACmVMxs:ACmblGj:ACmfHsW:ACmhNtO:ACmjNrX:ACmvqCO: +ACmxjVW:ACnGcB:ACnXgvr:ACnluFg:ACnsDNS:ACnslXO:ACnsxvz:ACnvFQw:ACoZcnR:ACoaWYi:ACobYox:ACodOxV:ACoefi:ACohLtd:ACoqQwM:ACoseWD:ACowIMp: +ACoxkMh:ACoyhnX:ACozlgi:ACpHlcm:ACpHnSt:ACpKyQy:ACpMbsk:ACpPWkz:ACpTKMq:ACpXptQ:ACpdtBI:ACphmFV:ACpjEHg:ACpkbzv:ACppTFj:ACprTWf:ACpwdIQ: +ACpwjhp:ACpxaH:ACpxwnP:ACpyMPm:ACqCFVl:ACqPemD:ACqUYPM:ACqXEJU:ACqbilp:ACqgMFD:ACqhpJB:ACqkpbO:ACqmdAr:ACqolFk:ACqqIFf:ACqsuDt:ACqvTfs: +ACrEiSc:ACrUFSa:ACrZGkc:ACrZtYn:ACrZzgL:ACrcrZm:ACreKmS:ACrevkN:ACrkseM:ACrkzwQ:ACrpbFo:ACrrbRK:ACrsuos:ACsDSMT:ACsEIiM:ACsGQQA:ACsLRWm: +ACsLWVq:ACsMKH:ACsNblj:ACsNxTC:ACsQysY:ACsVfNO:ACsirzR:ACsqsEr:ACsqzWn:ACsxbfP:ACszbrt:ACtJRAf:ACtWuPn:ACtZlJP:ACtauLh:ACtbSGj:ACtbuFg: +ACtdjvU:ACtkerN:ACtkuSl:ACtmBYs:ACtvVFD:ACtzDZv:ACuBZAN:ACuMefc:ACuPYH:ACuqeRU:ACuqusw:ACuzsYE:ACvGzEs:ACvJhuM:ACvShPX:ACvTMmb:ACvTwst: +ACvVHVU:ACvaslw:ACvbYRL:ACvcLTz:ACvdkmV:ACvmYOf:ACvofeQ:ACvtFhV:ACvwTEB:ACvzJko:ACwLNgD:ACwZMMU:ACwZwSC:ACwaHsc:ACwaida:ACwkLtM:ACwpvRF: +ACwrIRv:ACwrcuh:ACwsWsI:ACwtbxo:ACwuYoQ:ACwvSdi:ACwwfEf:ACwwvHH:ACxALXv:ACxGKMJ:ACxKptj:ACxPDqq:ACxQNiE:ACxSWkA:ACxXAqE:ACxciIs:ACxfdYM: +ACxkwnk:ACxsTFQ:ACxvKiF:ACxwtBr:ACyFNIn:ACyGOqi:ACyGPCz:ACyGymG:ACyMKmA:ACyPEuK:ACySemm:ACyeCGU:ACyldyF:ACyqida:ACyuOh:ACyvJWO:ACyxiiX: +ACzAAnH:ACzGAJO:ACzKgQy:ACzTrsL:ACzWcPk:ACzXcPK:ACzYdyn:ACzkGjj:ACzkeWw:ACzllZQ:ACzriBK:ACzuhyx:ACzwHCd:ACzzylR:ADADFGR:ADAJPRN:ADAJjQN: +ADAKBLE:ADAQKVp:ADARsDI:ADATgwn:ADAbZXG:ADAcLLa:ADAcXkL:ADAjTmg:ADArbMP:ADAsqLX:ADAwyaf:ADBEfWT:ADBIvcs:ADBJzhz:ADBMStM:ADBNRec:ADBNowe: +ADBPNKi:ADBRxY:ADBWggC:ADBXrHI:ADBahZZ:ADBdvOk:ADBhdSY:ADBoVwY:ADBrDKI:ADBuHUz:ADBwhWo:ADCPcTb:ADCRZzv:ADCWmqw:ADCYTnM:ADCYjQf:ADCcLNn: +ADCghzS:ADChSPx:ADCowgr:ADCvUoA:ADCvsnL:ADCwQJK:ADCzoye:ADDCszB:ADDTnNX:ADDdLQC:ADDhZHs:ADDmUOk:ADDomCC:ADDwUns:ADEIHyz:ADERSih:ADEVQJr: +ADEbBqz:ADEcyfD:ADEeFLs:ADEjLqJ:ADEjdgV:ADEnZhz:ADEnfO:ADEuoqj:ADFAHnp:ADFILja:ADFINZx:ADFKBra:ADFKDWv:ADFLEDq:ADFMIWF:ADFOoXU:ADFOpjF: +ADFeTKE:ADFhDhg:ADFiMOZ:ADFjQkk:ADFlCjk:ADFoMVT:ADFqOIn:ADFqnhz:ADFqvXZ:ADFrFPe:ADFrqxY:ADFvihp:ADFzmYa:ADGBtDF:ADGEFZB:ADGGHNy:ADGYeCI: +ADGZcRL:ADGassa:ADGaxsX:ADGbBSs:ADGbouY:ADGoQKB:ADGqgHo:ADGrCJb:ADGsIel:ADGxFpl:ADGxqXP:ADHBqxr:ADHCoAQ:ADHFIZo:ADHGDUw:ADHTdul:ADHdyAH: +ADHfVbB:ADHhYeG:ADHlCMC:ADHqBOc:ADHrIUq:ADHrqMp:ADHsIZs:ADHtYuS:ADHzLSD:ADIGgww:ADINEoc:ADITBly:ADIUsDP:ADIWFGK:ADIagCH:ADIbSLv:ADIdbMi: +ADIjRsV:ADItVUu:ADIxZIo:ADIyBoT:ADIzUFH:ADJGwup:ADJPmN:ADJSAmd:ADJXggh:ADJaWIA:ADJcUOc:ADJcsNn:ADJdDKB:ADJnbPw:ADJpqlZ:ADJxYUJ:ADKCzHJ: +ADKINkY:ADKQLcO:ADKfVWi:ADKhUew:ADKlivb:ADKrEuK:ADKrUzs:ADLHKuG:ADLXdAc:ADLZiUX:ADLfGrI:ADLfLNs:ADLgLQl:ADLgdGp:ADLhmbt:ADLjKMo:ADLjesm: +ADLpxS:ADLrMuN:ADLuKdR:ADMPKUx:ADMaZhc:ADMbImm:ADMbhzo:ADMmLqS:ADMmdgO:ADMnGRv:ADMnLnL:ADMrKmP:ADMreSR:ADMuBqc:ADMxsmE:ADNFcrN:ADNJNIt: +ADNJWRF:ADNQjhG:ADNRlQj:ADNVnUO:ADNYaxY:ADNZyxY:ADNaLIE:ADNahAw:ADNbYvE:ADNdtOM:ADNgDPQ:ADNlWgw:ADNmSUQ:ADNpWAL:ADOCYxE:ADOEBZW:ADOLcRU: +ADONkdM:ADOONiO:ADOTYxe:ADOVIwv:ADObLOn:ADOmDpJ:ADOrImm:ADOsSuJ:ADOtXiu:ADOtduu:ADOvcNY:ADPARWo:ADPHfZd:ADPJDpR:ADPMFLJ:ADPMOCm:ADPMeXh: +ADPNoS:ADPOKvw:ADPPFqi:ADPUSVi:ADPWDSJ:ADPWqWf:ADPbOuI:ADPcBAd:ADPdBOJ:ADPfUfv:ADPvHpD:ADPxqXV:ADQEYzz:ADQNacJ:ADQUFls:ADQUOcT:ADQUexQ: +ADQWKVN:ADQZRZi:ADQgbMN:ADQhXkR:ADQkIua:ADQmYUC:ADQnEVB:ADQqYEW:ADQuCmS:ADQyIkN:ADQzmEs:ADRBKwq:ADRBuTx:ADRHUmC:ADRNSjR:ADRRXtw:ADRSQic: +ADRTmQL:ADRWTNV:ADRYIRB:ADRYgLh:ADRcqlc:ADRnIvm:ADRoAEZ:ADRtQjp:ADSHKWx:ADSHutq:ADSNhsa:ADSNxYR:ADSQUyZ:ADSRUAA:ADSWSTV:ADSXREx:ADSaUZL: +ADSdUzx:ADSiqLj:ADSoivI:ADSooyW:ADSphwT:ADSrdsB:ADSvUUl:ADSxVWb:ADTHWzi:ADTKdAz:ADTMiUA:ADTZnNn:ADTdsMC:ADTmjbR:ADUBZlG:ADUEyyi:ADUKQJd: +ADUNmDv:ADUQatp:ADUamBd:ADUhyfR:ADUnfAB:ADUrtlv:ADVBgxE:ADVDdxT:ADVGuMR:ADVNLjS:ADVNNZJ:ADVOfKr:ADVQUjy:ADVRZqn:ADVSyyj:ADVXLCa:ADVgPcE: +ADViPKh:ADVmLoL:ADVoght:ADVqUmS:ADVsdwX:ADWANiD:ADWAWrv:ADWBdUM:ADWGoAS:ADWKwBm:ADWSLJz:ADWSNzc:ADWUtDt:ADWWgXl:ADWXZQg:ADWcWGG:ADWeeap: +ADWeirk:ADWiYVu:ADWjLiu:ADWjhaG:ADWsMoA:ADWyMvO:ADWzXef:ADXFxVa:ADXLBEK:ADXPKWh:ADXSFqr:ADXTFgn:ADXXSRB:ADXZPrr:ADXZjqr:ADXkqXM:ADXuOuR: +ADXwBOQ:ADXxIZa:ADXyLYm:ADYHjTp:ADYIBlW:ADYLoWU:ADYQDsz:ADYQLsL:ADYQqwV:ADYSIOR:ADYZODl:ADYmmEZ:ADYqhjH:ADYzEhn:ADZBtmK:ADZGFbq:ADZJgjy: +ADZKhSO:ADZMggV:ADZNPF:ADZNvcF:ADZOUao:ADZcMFx:ADZgUER:ADZsLnr:ADZwhZO:ADZxSpd:ADaEIOI:ADaKjTK:ADaQSrr:ADaRfzO:ADaSPRB:ADaSjQB:ADaUtN: +ADaWrxq:ADaYKwX:ADalOUb:ADanBoa:ADasTmk:ADaxSLc:ADbDRxi:ADbLhR:ADbSzhF:ADbTStq:ADbYNKU:ADbaBJK:ADbdaAW:ADbhhZf:ADblHUF:ADbnhWS:ADbvVwe: +ADcDfwQ:ADcHvCv:ADcJWbY:ADcKRXp:ADcLaHk:ADcSgJi:ADcVgGF:ADcYEAl:ADcYcTn:ADccvon:ADclaan:ADcvhwj:ADcyAem:ADdDcOl:ADdMCGC:ADddwZQ:ADdhbLX: +ADdhmCG:ADdjSeX:ADdkKdy:ADdqZHw:ADdrIMy:ADeBsZO:ADeFzCs:ADeafAp:ADefmBV:ADenblQ:ADenmcN:ADfAiFg:ADfCmOP:ADfJOTq:ADfWUjO:ADfdghb:ADffUmE: +ADfhdwN:ADfjHWV:ADfkCIs:ADflPcS:ADfpiXH:ADfqDhc:ADfrLoZ:ADfsQko:ADfuiow:ADfvrg:ADgFKgV:ADgGifn:ADgJBRl:ADgLIwK:ADgMAYy:ADgNYdv:ADgNoxX: +ADgNpJK:ADgUUWg:ADgXLJl:ADgXNzu:ADgcSu:ADgnMvY:ADgoXep:ADgpOic:ADgpnHw:ADgpvxW:ADgqCiz:ADgtTkH:ADgxMoW:ADgzeaf:ADhLoAU:ADhPBlO:ADhRGXh: +ADhUYZn:ADhdSle:ADhiqlr:ADhlRSE:ADhwbmZ:ADhxLlk:ADhxXKF:ADiCdUg:ADiDacQ:ADiQqXy:ADiRoaZ:ADiUIzd:ADiaIuz:ADibYUx:ADidEVY:ADisRsj:ADiuVBI: +ADiukDT:ADjCvcT:ADjDLCX:ADjGZZx:ADjGbE:ADjLNKN:ADjTrHn:ADjdnjY:ADjhMFj:ADjkQje:ADjmSpv:ADjqUzp:ADjxlRP:ADjyqlV:ADkFwUw:ADkJCV:ADkLEAE: +ADkLcTG:ADkMtMR:ADkZrhe:ADkmMfA:ADkpWiF:ADkqUek:ADkrUod:ADkrsni:ADlGSIb:ADlHSIB:ADlNHYp:ADlUyYu:ADlVFe:ADldZHP:ADlgUOH:ADlqmbx:ADlxyFN: +ADmHuwh:ADmaFLn:ADmfLqW:ADmfdgK:ADmjZhg:ADmqoqw:ADmtKDi:ADnGBrN:ADnGDWY:ADnHoaG:ADnJjhC:ADnKYDT:ADnKoXz:ADnKpji:ADnNecO:ADnOcrJ:ADnQnd: +ADnRduy:ADnTzU:ADnaTKj:ADnfSUU:ADngBsu:ADnpDPU:ADnuIMr:ADnxIEj:ADnzLIA:ADnzhAs:ADoCHND:ADoEnuP:ADoIyXF:ADoJqpk:ADoPjHX:ADoQlqu:ADoSOtA: +ADoUcRQ:ADoWkdI:ADoXdUb:ADoYNik:ADoYWrY:ADoaXei:ADogPkN:ADolSuN:ADooUMu:ADovDpN:ADpBEOy:ADpCDUZ:ADpPPrm:ADpPjqm:ADpXjtd:ADpYBLC:ADpcse: +ADpgSlL:ADphZxd:ADpibmS:ADpoUfr:ADppTMD:ADqDqXf:ADqEoaE:ADqIDuc:ADqLrxg:ADqQaGI:ADqWacN:ADqbqLb:ADqeRsU:ADqjMm:ADqmSLu:ADqpVUV:ADqtZIL: +ADqwEVF:ADrAhSt:ADrAxyG:ADrCggm:ADrDUYO:ADrEUaT:ADrKKwm:ADrKuTd:ADrWSjN:ADrZtmp:ADraHUT:ADrcYUO:ADrgEUU:ADrgUZm:ADrhEUu:ADrhUZM:ADrqoYb: +ADrtYUo:ADrwIvq:ADrzUuY:ADsAXTr:ADsBRET:ADsBoWR:ADsCmqI:ADsGUMF:ADsQKWt:ADsVQt:ADsVTnS:ADsVjQx:ADsXIrG:ADsXglm:ADsYHfB:ADsbVWN:ADskQnI: +ADsmEuL:ADsmUzt:ADsrqLf:ADtBCGm:ADtTaTE:ADtWODe:ADtWpA:ADtXBMB:ADtZYWD:ADtZacG:ADtbGrl:ADtbLNV:ADtgwpV:ADtkniT:ADtqmvB:ADtttLc:ADuASiR: +ADuCMzG:ADuKZlK:ADuYnnk:ADubNIX:ADuiLqp:ADuidgl:ADujfxH:ADunwzf:ADvHYXC:ADvJBzQ:ADvUaxd:ADvZAyB:ADvcDPl:ADvfWgJ:ADvhBsL:ADvhoUf:ADviSUl: +ADvnOIx:ADvnnhl:ADvnvXL:ADvrKEa:ADvrZvE:ADvrzjd:ADvvMOL:ADvyXIs:ADvydUs:ADwAgXH:ADwKdUI:ADwPUJt:ADwQoAw:ADwRyYg:ADwSjHs:ADwUwBI:ADwiDpe: +ADwlImB:ADwngHy:ADwoSue:ADwrdWU:ADwtHwM:ADwvPCH:ADwxPke:ADwzixS:ADxJTPT:ADxJZnv:ADxJgbY:ADxKKvh:ADxORzo:ADxOowZ:ADxPxVE:ADxRSVV:ADxTCYH: +ADxZFLu:ADxZOCR:ADxZeXW:ADxbIZE:ADxthJG:ADyGYSJ:ADyHdUq:ADyJacg:ADyUxvn:ADyfIul:ADyfqmm:ADygIzn:ADyiTmT:ADyqZXt:ADyzqxB:ADzDIRA:ADzDgLk: +ADzIzhk:ADzJSjq:ADzJim:ADzMRer:ADzMowt:ADzNXtT:ADzTfWE:ADzXvcb:ADzZWBM:ADzfUzF:ADzpQjS:ADzsvOz:ADzwdSH:ADzxwGj:AEAAOWa:AEAOTnE:AEAdYlm: +AEAfFkv:AEAglRV:AEAiNMC:AEAiNVq:AEAksuU:AEAnQnL:AEApFsV:AEAuHyK:AEAwHC:AEAzaUq:AEBIMln:AEBWIzV:AEBWeqb:AEBZGfA:AEBaWMD:AEBbkpf:AEBdZfF: +AEBeO:AEBhukz:AEBpXwC:AEBtYvc:AEBwefz:AEBxuaU:AEBzrir:AECGLkI:AECGRgr:AECGiMM:AECNMLA:AECOPNg:AECXbhr:AECXhOh:AEChBti:AEChKyB:AECluzt: +AECnuKu:AECtiIB:AEDBKFE:AEDCRHO:AEDCiAJ:AEDDYNH:AEDGoRe:AEDHppy:AEDIyJM:AEDIyX:AEDJbkB:AEDQPVH:AEDRCQh:AEDRdya:AEDgHfY:AEDoUaG:AEDptYI: +AEDqeZZ:AEDuFzo:AEDwkQE:AEDzeOW:AEEHGyv:AEENsiJ:AEEWCqC:AEEWdYJ:AEEXjDp:AEEbDLN:AEEdNLF:AEEfXxe:AEEozLQ:AEEpTeD:AEEpaYM:AEEqQSd:AEEuUAL: +AEEvtyB:AEEwezQ:AEFCPBk:AEFEYDQ:AEFEeyE:AEFHuyC:AEFMspx:AEFPEvd:AEFRAdt:AEFXdlc:AEFZGmf:AEFbMjD:AEFeuqS:AEFkVBo:AEFuQvr:AEFuos:AEFvyaB: +AEFyrJn:AEGLcvR:AEGTjDd:AEGUEVM:AEGaFdX:AEGgMJm:AEGjpMZ:AEGkIPx:AEGlbKu:AEGnTol:AEGnaaC:AEGveBL:AEHBuAW:AEHGWnF:AEHRxnA:AEHVwYg:AEHcFKT: +AEHfGTB:AEHfaus:AEHimdG:AEHmFZL:AEHmaua:AEHrWSS:AEHsuKa:AEHtyex:AEHuacq:AEHvZow:AEHwJJg:AEHzYvU:AEHznWE:AEIHuaN:AEIISDq:AEIKAnG:AEIKjpe: +AEIaPrY:AEIenvt:AEIjaCH:AEIkyEA:AEIlaUj:AEIrFzu:AEIraUX:AEIseLG:AEIxFkm:AEIyukx:AEJBrsc:AEJBxhL:AEJGMXs:AEJGaJy:AEJLADm:AEJRTWl:AEJXnbb: +AEJZXVt:AEJflQR:AEJiQlp:AEJmSax:AEJrZdj:AEJyPoG:AEJzdpo:AEKAPNX:AEKFakc:AEKFrPi:AEKMVZM:AEKNJOf:AEKXRDS:AEKYLkv:AEKYRgM:AEKYiMr:AEKZFcN: +AEKZxGK:AEKglIb:AEKhglM:AEKjWmT:AEKoCEr:AEKowen:AEKquAE:AEKvZsD:AEKvsxi:AEKwlsY:AEKyXWS:AEKzZDS:AELCjdR:AELDCQa:AELDdyh:AELFGhV:AELLeRW: +AELRKOU:AELSGYT:AELTHsB:AELTbdX:AELXdrU:AELXzic:AELYoRl:AELZkft:AELbUan:AELdeZs:AELhFzF:AELkTEf:AELkayo:AELnQsF:AELobdB:AELqXXG:AEMICqX: +AEMIdYQ:AEMJPvx:AEMKGHo:AEMOGBP:AEMPLXr:AEMQbKr:AEMSABx:AEMWKol:AEMaeog:AEMcDAi:AEMdoeL:AEMhUAw:AEMjezj:AEMuydN:AEMyoKF:AENBoxM:AENDIWn: +AENGJxH:AENGeWP:AENJtXu:AENLGmm:AENXJxh:AENXeWp:AENYTUn:AENbsfv:AENcvWD:AENibFJ:AENkSIZ:AEOHeuv:AEOKADd:AEOMaEK:AEOPtxN:AEOWlzp:AEOZwZd: +AEOqbfq:AEOrmbg:AEOsSia:AEPBcXH:AEPEuAp:AEPHWna:AEPZFQv:AEPbHYn:AEPeuKf:AEPoFSs:AEPqVJM:AEPswzb:AEPtlrs:AEPvNmf:AEPvNvT:AEPxsUp:AEPzZtD: +AEQKuag:AEQTBTi:AEQdaUQ:AEQeeLN:AEQkAHi:AEQngWK:AEQoGtr:AEQoaUC:AEQppsr:AEQscCH:AEQszbs:AEQzlRd:AERAnlP:AERBXQo:AERJDNj:AERKnby:AERMXVo: +AEROADv:AERPAIW:AERTyCi:AERUTWw:AERWYtf:AERYJoD:AERZVzo:AEReXwQ:AERjeP:AERpfhQ:AERvzIp:AERxBCf:AERxXqr:AESHKfl:AESKrSs:AESQnBr:AESSXvd: +AESXvQx:AESiiIT:AESjQdA:AESjVir:AESlZDZ:AESrPOW:AESurIk:AETEKFs:AETGHdq:AETHRHy:AETIUzm:AETMpna:AETNGZM:AETPrkN:AETQcfd:AETRQEH:AETatoS: +AETjXGZ:AETkIt:AETlptC:AETpyxP:AETwWjt:AETxWjT:AEUAsix:AEUDByL:AEUEABq:AEUGRbC:AEUVrKA:AEUdzLc:AEUereZ:AEUjUqV:AEUocoD:AEUrVZV:AEUsLfL: +AEUtkXZ:AEUvCZC:AEUwjrc:AEUwybV:AEVBXls:AEVFwzf:AEVLYHl:AEVMdlq:AEVOGmt:AEVRspj:AEVUSSQ:AEVWIWw:AEVXPBy:AEVZYDC:AEVZeyW:AEVomBE:AEVusfo: +AEWBdLX:AEWCYhE:AEWLwZo:AEWRuYx:AEWStxe:AEWUNeE:AEWaQVI:AEWcNaO:AEWcquu:AEWerjU:AEWjAso:AEWlolh:AEWumbL:AEXGSdv:AEXJPQa:AEXLFQo:AEXOePF: +AEXbnVS:AEXgWSm:AEXieur:AEXjWpp:AEXkFnZ:AEXoYia:AEXtYLq:AEXvFKj:AEXwlrJ:AEXyNvm:AEYGlKw:AEYQWNQ:AEYSFqF:AEYVOWT:AEYdTvP:AEYjDoF:AEYlFiX: +AEYsZTt:AEYuYIh:AEZAGfZ:AEZCKFN:AEZDvqz:AEZJYtO:AEZLHwW:AEZVFNG:AEZWRGF:AEZWimy:AEZawO:AEZbSaj:AEZcZSo:AEZcsXB:AEZgZdx:AEZjFAr:AEZmefA: +AEZnQlb:AEaCeBH:AEaDPqQ:AEaJOWm:AEaNcx:AEaQFyB:AEaQPaF:AEaTeBh:AEaYlKN:AEabNMO:AEacgWU:AEadsuY:AEafZTm:AEahYIq:AEakGXY:AEaoFiA:AEareUb: +AEatFNJ:AEavpsL:AEawTvI:AEaxcCV:AEaxzbm:AEayFsZ:AEbIpay:AEbQPnT:AEbRMlr:AEbVaKo:AEbVrpe:AEbebhs:AEbkBTz:AEbkKYQ:AEbouZg:AEbwlin:AEbxgLA: +AEbzWMX:AEcBbhV:AEcBhOL:AEcKgPV:AEcWMLE:AEcXMLe:AEcYjCL:AEccYVh:AEcqkPm:AEcsZFM:AEdCrwg:AEdEOvB:AEdHKOx:AEdJgmK:AEdKKFA:AEdLHdc:AEdMYNL: +AEdPGbD:AEdSpnS:AEdWcfV:AEdZPVL:AEdaptQ:AEddQsk:AEdeyxB:AEdezp:AEdkNiR:AEdkzPf:AEdpkQA:AEdtoEx:AEdxUaC:AEeForj:AEeHyjB:AEeIrWl:AEeKOVI: +AEeNZZy:AEeQgzl:AEeRiaE:AEeZSeX:AEedIFh:AEefHFV:AEeikXL:AEekCZU:AEeoXxa:AEeqxUr:AEeuBtE:AEeuXgC:AEevkqJ:AEeyeoX:AEezoes:AEfPIJp:AEfXeUb: +AEffiEA:AEfhOma:AEfiTKR:AEfuttt:AEfyzoo:AEfzldt:AEgAADy:AEgBPbf:AEgCaEV:AEgDeYH:AEgFUwq:AEgGuYN:AEgNDtw:AEgNiuT:AEgVYhs:AEggYbL:AEglJbY: +AEglPiL:AEgllpK:AEgqMJI:AEgxrjc:AEgypmD:AEgzVbb:AEhTjwn:AEhZcXc:AEhdYvy:AEhdnWi:AEheFSX:AEhiYLc:AEhitZn:AEhpGTn:AEhqIa:AEhrmdK:AEhuelr: +AEiFWNC:AEiLlKe:AEiQxND:AEiUwyb:AEibFkQ:AEiheBh:AEiiYVP:AEijQnk:AEinVjO:AEioaRY:AEiqWsV:AEirukd:AEitaCt:AEiuZOr:AEivJjb:AEiwmDb:AEixmDB: +AEjDMlk:AEjIFNy:AEjLLKC:AEjLRGx:AEjLimG:AEjMYtq:AEjNCh:AEjXKFp:AEjaRND:AEjyiiH:AEjzIzG:AEjzVIn:AEkArSf:AEkAxHI:AEkUGUi:AEkUyrk:AEkVMxv: +AEkYEKH:AEkYMHm:AEkdkPJ:AEkfZFj:AEkgRnM:AEkhuzW:AEkjuKV:AEkqNKi:AEksBcX:AEksXQL:AEktFae:AEkxQLu:AElBppT:AElCoRH:AElERQH:AElFSEZ:AElLPVE: +AElMjdv:AElSGbm:AElTBYx:AElUhF:AElUqyY:AElgDlH:AElhbdF:AEljtYd:AElkUaj:AElmeZw:AElqFzB:AElskQh:AEltzlW:AElwoEQ:AElzUQb:AEmAKoH:AEmBbDe: +AEmFdRh:AEmKByA:AEmLSeC:AEmMqgA:AEmOYhg:AEmRjDO:AEmUGHK:AEmXorq:AEmYGBt:AEmZRqq:AEmbNIb:AEmbzpV:AEmiLLa:AEmjaYr:AEmoXxC:AEmqUAs:AEmsezn: +AEmykqq:AEnAeyj:AEnCUWS:AEnHYJg:AEnIId:AEnJSSl:AEnOKYv:AEnRdlL:AEnSYHQ:AEnksfr:AEnoezY:AEnsqUa:AEnurJA:AEoGYdE:AEoGeYQ:AEoQeur:AEoZdLw: +AEoaOMq:AEoguQG:AEohbKh:AEoslDd:AEotrZe:AEpNxnb:AEpRwYD:AEpWlkC:AEpaFng:AEpcoJP:AEpdmdD:AEpgFZo:AEpgauB:AEphiCt:AEpisEb:AEpmAhZ:AEpnfOG: +AEpoacR:AEpvPRC:AEpznVn:AEqAcxS:AEqDuak:AEqVBC:AEqaHyu:AEqiojO:AEqmicK:AEqneLB:AEqrwZy:AEqsFII:AErAVzS:AErBHwB:AErCIzx:AErCeqL:AErGAIk: +AErHADJ:AErKyCU:AErNTWK:AErQDNV:AErTnbE:AErVXVS:AErWGfO:AErYXQS:AErZnll:AErblQu:AErcCel:AErcwEp:AErdQlw:AErjVGl:AErklSG:AErlIzL:AErlQDV: +AErlVIe:AErmzIL:AErqkeX:AErsUlE:AEryZSz:AErysXW:AEsHGUp:AEsHyrr:AEsIVZh:AEsKIZC:AEsKeQw:AEsLEKQ:AEsLMHt:AEsNAdq:AEsSycn:AEsTTwp:AEsYDnm: +AEsclIG:AEsdXWV:AEsfBcA:AEsfXQU:AEshYVv:AEskCEW:AEskweK:AEsnrIg:AEsuziw:AEtEGbj:AEtJVUA:AEtNgZI:AEtVrwI:AEtWyJg:AEtXOvl:AEthDas:AEtjJBS: +AEtjjRp:AEtjyBE:AEtkbda:AEtlXXD:AEtoxuw:AEtrcOW:AEttVze:AEtvfka:AEtxCzp:AEtzpNZ:AEuDjDF:AEuEPvu:AEuJAlv:AEuLpNj:AEuOSej:AEuPcFo:AEuQRbg: +AEuTKfx:AEuUgMr:AEuVHDz:AEuXUZf:AEumTeR:AEuqydc:AEutoKK:AEuuNIK:AEvCJxU:AEvCeWM:AEvEIJb:AEvFTUS:AEvGXEf:AEvLXlW:AEvOwzb:AEvPwzB:AEvSfY: +AEvTJxu:AEvTeWm:AEvUtXH:AEvXXEF:AEvhmBA:AEvmASb:AEvooLe:AEvxSIg:AEwAsPg:AEwNGMy:AEwUwZk:AEwnmbH:AEwzQVM:AExAGhI:AExCcuL:AExGuWj:AExIBtc: +AExTPQE:AExUFQk:AExZOwy:AExaacK:AExiNB:AExplrN:AExrNvi:AExsgwA:AExtsUM:AExvZty:AExxYie:AEyIcUE:AEyRtB:AEybseR:AEyeFIF:AEyexlt:AEyjFNW: +AEylpsQ:AEynYVf:AEynnwv:AEystzq:AEyuFkg:AEyvlRG:AEyxNMR:AEyzsuD:AEzDDNO:AEzIXVJ:AEzKADS:AEzQTWR:AEzRbHj:AEzRhop:AEzSYtC:AEzgPoY:AEzidpQ: +AEzniiZ:AEzoIzU:AEzoQDO:AEzpWMs:AEzqZdT:AEzwQln:AFAAYjs:AFALntI:AFANRYQ:AFARRZb:AFARXAM:AFAWAcx:AFAWmqr:AFAaLza:AFAbnBm:AFAeKYN:AFAgzOn: +AFAhrgI:AFAiUsS:AFAkUBR:AFAlywe:AFApGeu:AFArvtt:AFAsfRZ:AFAufha:AFAvLxS:AFAyqEq:AFBClqC:AFBEYCL:AFBFQpU:AFBHsLv:AFBNJmz:AFBNsWM:AFBSPyX: +AFBTlqc:AFBVrXD:AFBWsLV:AFBdKXd:AFBeEFv:AFBinel:AFBkTPh:AFBluhf:AFBqQRn:AFBrfsN:AFBxdeD:AFByBmJ:AFCCBMy:AFCChZc:AFCDGsk:AFCFIhb:AFCFrag: +AFCJgKh:AFCLBBJ:AFCSJMS:AFCSswd:AFCTDPi:AFCVgAW:AFCcZyJ:AFCjKxm:AFCnOlT:AFCruHo:AFCtEsr:AFCwQrg:AFCxfSG:AFDDNuh:AFDIyCk:AFDbOXH:AFDgvKl: +AFDlJwE:AFDmRsR:AFDpMIU:AFDvMKT:AFEAloZ:AFEROQN:AFEWjQK:AFEXwUP:AFEYNUC:AFEZTqv:AFEboDM:AFEbpuE:AFEdmCL:AFEgiYy:AFElRcF:AFEqZFC:AFErSOu: +AFEwOxc:AFEyBoI:AFFEDRl:AFFOUHx:AFFQbvc:AFFeMmH:AFFekVc:AFFhelu:AFFiIJx:AFFjSLn:AFFlCVf:AFFoUBn:AFFokIb:AFFrfgk:AFFtPZm:AFFvCjw:AFFvZKL: +AFGEXGy:AFGHsvq:AFGRCqW:AFGUUho:AFGWbVt:AFGXoII:AFGjOcK:AFGnIjO:AFGoEEF:AFGpSly:AFGrhpq:AFGuUby:AFGukiu:AFHBLRA:AFHCfrA:AFHInTk:AFHJxXW: +AFHKVxk:AFHOPhO:AFHRdGR:AFHUNkA:AFHXmUp:AFHYaMN:AFHcLXq:AFHeqes:AFHjSQS:AFHovTV:AFHupfD:AFHwgVr:AFICfgm:AFIHBaL:AFIHHFV:AFIJLrz:AFIMeBU: +AFIMmAp:AFIQNES:AFIRxxl:AFIZdgi:AFIenBt:AFIgbjE:AFIgxXQ:AFImUHD:AFIoFAr:AFJEPyW:AFJGBbl:AFJJGtk:AFJNkFR:AFJOGSM:AFJPGda:AFJRhmI:AFJXgSU: +AFJdQRA:AFJiRLM:AFJiTNh:AFJkTfK:AFJnuXA:AFJpObx:AFJsCFS:AFJxFbE:AFJydhw:AFJzMvr:AFJzYqH:AFKBrkk:AFKEJMJ:AFKHgAN:AFKMQPe:AFKRVRv:AFKTzSG: +AFKUkot:AFKWhMv:AFKYuSj:AFKajkH:AFKbYmo:AFKlhOh:AFKnVWA:AFKoRlR:AFKoTnw:AFKqTFT:AFKuOBG:AFKvkRG:AFLAAlq:AFLDwuR:AFLEUpi:AFLFTQt:AFLHnLT: +AFLKLSJ:AFLUDeI:AFLWgdL:AFLeyKk:AFLsRrf:AFLxLkU:AFMFumg:AFMLTqM:AFMMUPP:AFMMWvf:AFMRxEr:AFMVWSg:AFMdZFX:AFMeJWU:AFMfLMc:AFMjYHq:AFMkOxX: +AFMyMiE:AFNDoiW:AFNNYrw:AFNRfPJ:AFNRpHN:AFNRtDH:AFNVfXw:AFNaXEA:AFNhqGH:AFNlvCl:AFNndFW:AFNoTSD:AFNoyEI:AFNxDJD:AFOBUUE:AFOBxtv:AFOHJyC: +AFOHaga:AFOJEKY:AFOKsvV:AFOOhuj:AFOTYRn:AFOWsMw:AFOaeLE:AFOhYLg:AFOjeTa:AFOuCvV:AFOwwzl:AFOzwYq:AFPAIdq:AFPAlBu:AFPArNN:AFPEdGK:AFPHNkX: +AFPMxXN:AFPNNeq:AFPSBAn:AFPSHft:AFPULRX:AFPZebw:AFPZmaR:AFPaQMG:AFPbzmP:AFPjDyU:AFPmvNQ:AFPzHtV:AFQCAbI:AFQCRYC:AFQGRZp:AFQMyUM:AFQNNKQ: +AFQSkoO:AFQeGeg:AFQfiSX:AFQfqmB:AFQkKLL:AFQnpFT:AFQrsHk:AFQsSqC:AFQszzn:AFQwzMy:AFQzfhs:AFRIbPb:AFRKQNb:AFRMyAD:AFROlUc:AFRfCFj:AFRjKqT: +AFRlMvk:AFRlYqQ:AFRtwcU:AFRuiop:AFRvgvz:AFRzZem:AFSDCOL:AFSJygV:AFSLuSE:AFSOFOz:AFSQkFO:AFSYAGt:AFSYqwl:AFScBMU:AFSnvSQ:AFSoEfi:AFSsnEs: +AFSzBqJ:AFTBbDL:AFTGwuM:AFTKnLK:AFTUkPl:AFTYyAK:AFTbOkC:AFTnEqu:AFTqEkP:AFTuEsC:AFTuPdF:AFTwBbi:AFTytFp:AFUHbdC:AFUHfUo:AFUJALa:AFUMwUB: +AFUNNUQ:AFUOTqd:AFUXaMN:AFUhOKL:AFUiOeI:AFUmYHX:AFUwZFq:AFUzbtH:AFVDfPQ:AFVDpHU:AFVDtDS:AFVFvRB:AFVgfgY:AFVhnQF:AFVjkIs:AFVogqj:AFVpWsX: +AFVyEkp:AFWAtgQ:AFWLpxi:AFWMoIg:AFWMwGP:AFWOfxG:AFWQEyN:AFWRRrg:AFWSUuy:AFWWYRG:AFWXXGW:AFWbfzB:AFWnnqM:AFWpkix:AFXArmw:AFXCHyy:AFXCXno: +AFXCfJj:AFXDPhQ:AFXFBAI:AFXFHfS:AFXHACd:AFXHmQn:AFXIExV:AFXIisb:AFXMmUn:AFXOGyI:AFXQYJO:AFXTcWX:AFXTiiv:AFXdwDP:AFXiWLj:AFXiclv:AFXuKyr: +AFXvYTd:AFXwzoR:AFXxsIF:AFXyUSo:AFYIHYn:AFYIXNx:AFYJZrY:AFYMAcS:AFYMmqY:AFYTJJd:AFYYPHf:AFYZHip:AFYaDYe:AFYeSqZ:AFYezzw:AFYhHrh:AFYjQmw: +AFYpEOy:AFYuBAl:AFZGkpS:AFZIKoA:AFZSBmm:AFZShzw:AFZVIHv:AFZVrAs:AFZbnCh:AFZndhE:AFZvso:AFZzKXy:AFaJuMt:AFaKIDf:AFaKlbb:AFaKrnY:AFaLHiw: +AFaRpTe:AFaTmEj:AFaYfgx:AFacUHQ:AFaeFAg:AFankpi:AFapzOb:AFaqrgE:AFavfWJ:AFbAaPP:AFbDkFy:AFbEEUT:AFbEfa:AFbFBmt:AFbFhzn:AFbLgkE:AFbObPP: +AFbPakm:AFbWDpd:AFbWcXm:AFbXgaz:AFbbxQr:AFblLvP:AFbmlep:AFbnApc:AFbntLj:AFbqqzJ:AFbuuhb:AFcBlQN:AFcDYcA:AFcEgsW:AFcGapY:AFcIqlR:AFcKzSZ: +AFcMgpq:AFcRPYU:AFcUrxI:AFcgYji:AFchnEa:AFcoXtH:AFcwdEI:AFcxBMG:AFczTpe:AFdAxVX:AFdDlOU:AFdGlUr:AFdJjqD:AFdLiCs:AFdNxLw:AFdVuMs:AFdafMv: +AFdbLYA:AFdbjKS:AFddodb:AFddpUj:AFdeOaN:AFdgmcC:AFdhNuz:AFdkiyV:AFdlBOF:AFdoPDN:AFdtZfL:AFduJwA:AFdvLmw:AFdzYhe:AFeCNUg:AFeGxvS:AFeQEPi: +AFeXycd:AFeZszo:AFeaOxG:AFecBom:AFehIlI:AFehJFH:AFejOAe:AFekoDI:AFekpuA:AFepBBP:AFevvkc:AFfALbK:AFfECQD:AFfIltK:AFfJbvg:AFfNDRh:AFfcvCa: +AFfeWsN:AFfhCJ:AFfhaar:AFfjAjz:AFfnMmL:AFfnkVg:AFfqelq:AFfrfSG:AFfsSLj:AFftQRu:AFfvqe:AFgFtgC:AFgNUhs:AFgPbVh:AFgTDrg:AFgaUvE:AFgawYj: +AFgdEKi:AFgeZkG:AFgnUbe:AFgnkii:AFgsOcW:AFgtMMC:AFgtkvh:AFgwfsh:AFgxIjs:AFgySle:AFhAJjA:AFhDNed:AFhEfGz:AFhKjfP:AFhMVzN:AFhNExd:AFhNisP: +AFhPebb:AFhPmaG:AFhRaMB:AFhSABU:AFhWRzl:AFhWXaC:AFhbFaE:AFhjbJr:AFhjxxf:AFhvisD:AFiBYMc:AFiDpTl:AFiFpGe:AFiHntl:AFiJVXl:AFiNPHH:AFiQvSP: +AFiRfRF:AFiSEXO:AFiXamI:AFicUsv:AFidrgl:AFieUBw:AFinvtQ:AFirLxv:AFisWls:AFiscLo:AFitqEt:AFizvno:AFjDrKX:AFjIDpc:AFjIcXj:AFjOgkb:AFjPPgu: +AFjSakJ:AFjTCop:AFjXgT:AFjXkOg:AFjZyGj:AFjaEFU:AFjbRLA:AFjbTNd:AFjdTfG:AFjoLvw:AFjyObt:AFkAhMR:AFkDPYL:AFkFBBw:AFkIGTp:AFkNDPT:AFkUgKu: +AFkXjTf:AFkhRlV:AFkhTns:AFkjTFP:AFksQrZ:AFkxdHl:AFkzYkZ:AFkzjkL:AFlDSyv:AFlGsZM:AFlTxeo:AFlXbDW:AFlZAlu:AFlaPDG:AFldEqn:AFlgSos:AFllRrb: +AFlonHZ:AFlxOkX:AFmFyaI:AFmLSYO:AFmOumc:AFmSjQT:AFmUicc:AFmWxlg:AFmabtE:AFmhRcY:AFmjvkX:AFmoLMg:AFmrMiA:AFnEUuX:AFnExTk:AFnKgaQ:AFnQtGe: +AFnXYrS:AFncIJU:AFndfSN:AFneSLc:AFngDV:AFnhCVK:AFnwhPk:AFnzGRR:AFoCoIJ:AFoKUUA:AFoKxtr:AFoQgAH:AFoeOcH:AFoifsw:AFojeLA:AFonTsY:AFonyeT: +AFoqAJJ:AFowYUd:AFpCmUu:AFpDgon:AFpEGyR:AFpFkOz:AFpKiqG:AFpOdPr:AFpWrml:AFpXjuL:AFpYHyb:AFpYXnt:AFpYfJq:AFpZZRU:AFpaHtj:AFpgHRD:AFpmKlY: +AFpoueD:AFppued:AFpqDyi:AFpuSQV:AFpxHRd:AFpyzml:AFqDvSK:AFqIeBr:AFqImAW:AFqLxxK:AFqMNEt:AFqTdgN:AFqWuL:AFqanBS:AFqcbjb:AFqcxXv:AFqfWlh: +AFqfcLt:AFqiHTS:AFqkFAU:AFqlvnT:AFqwpFX:AFqyDYP:AFrBrXn:AFrDkfZ:AFrEakC:AFrGrKq:AFrJgPV:AFrRgSp:AFrSFoO:AFrUjtX:AFrWVrl:AFrZhVX:AFrdden: +AFreRLh:AFreTNM:AFrfnef:AFrgTfn:AFrlXTo:AFroCFv:AFrqhor:AFrtYJN:AFrwYKd:AFrwjKr:AFsBgAm:AFsFaey:AFsGPYk:AFsHbpg:AFsJQng:AFsLyaA:AFsOEuC: +AFsQkoW:AFsSygZ:AFsUuSI:AFsXGD:AFsYPGE:AFsZRBj:AFsjSUE:AFskRlq:AFskTnT:AFslxqe:AFsmTFw:AFsyZEh:AFtBnLw:AFtFLSI:AFtGxeH:AFtKbDp:AFtLkPP: +AFtPyAw:AFtVJmD:AFtWSyQ:AFtayKH:AFtcLkV:AFtlPdz:AFtnBbU:AFtoRrE:AFtrVIF:AFtwEqI:AFtwdP:AFtxSoT:AFuBumJ:AFuCkpG:AFuFwUF:AFuQbdG:AFuQfUk: +AFuTkpg:AFuqOKH:AFutESH:AFutPDM:AFuuRRr:AFuvBBb:AFuxAhT:AFuzViq:AFvChUL:AFvIgXz:AFvKsmQ:AFvMJYE:AFvMaGg:AFvPvRf:AFvUUUV:AFvYhXM:AFvhvCS: +AFvjdFh:AFvoetg:AFvqnQB:AFvskIw:AFvxgqn:AFvzFrd:AFwFEKt:AFwKLBR:AFwSlTR:AFwaUbS:AFweX:AFwejcU:AFwffGV:AFwhMF:AFwjCJJ:AFwjZkq:AFwkfzF: +AFwoWSW:AFwwnqI:AFwzDjp:AFxAdGh:AFxBdPm:AFxGgoq:AFxHABC:AFxHRyI:AFxIxXm:AFxPjfF:AFxQmQj:AFxaKlf:AFxiSQi:AFxizZD:AFxjGEm:AFxofHy:AFxwsha: +AFyBHYr:AFyBXNd:AFyBfja:AFyCPHZ:AFyDiQW:AFyGdgg:AFyHdpb:AFyIyUh:AFyLmue:AFyNGYB:AFyOxxb:AFyPYjD:AFyWvSb:AFyXiSi:AFyfKLI:AFyiuEt:AFypLzV: +AFyxWla:AFyyEOe:AFzBKoM:AFzIyAc:AFzKlUD:AFzMhVc:AFzOAgZ:AFzOqWB:AFzRlqR:AFzUgSK:AFzWaPE:AFzWcz:AFzYqLN:AFzknCd:AFzoBQD:AFztEFg:AFzwYJu: +AGADftf:AGANNGw:AGANcbB:AGANlsG:AGAPNPO:AGAQKxp:AGAUZNr:AGAVnXB:AGAZHUD:AGArcYl:AGAtcjR:AGAtgsD:AGAuMoH:AGAxjDQ:AGBADXw:AGBEGGU:AGBIGsk: +AGBRPOr:AGBTNgn:AGBUNpv:AGBVfpj:AGBZArL:AGBnTAD:AGBpHCx:AGCEaAu:AGCGVKb:AGCIVFX:AGCOAew:AGCSUDw:AGCVrrF:AGCrUoA:AGCsbSU:AGDAKLB:AGDDLdR: +AGDEMLa:AGDGqoi:AGDMaaN:AGDNryY:AGDOVkY:AGDWAEL:AGDarFE:AGDazKL:AGDdSmf:AGDjhoz:AGDrKaR:AGDtHKS:AGDtjyT:AGECaPL:AGEDlQW:AGEJkoZ:AGELPuE: +AGEXPnJ:AGEaVmq:AGEbeEd:AGEdZPt:AGEfhXq:AGEhzwk:AGEoywl:AGEppwe:AGEsHCm:AGEvfRF:AGEwabC:AGEzoIc:AGFADvq:AGFDszJ:AGFIhHL:AGFPkOM:AGFRPUR: +AGFgCoQ:AGFlhxf:AGFnqBw:AGFodKf:AGFvVMF:AGFyHcz:AGGCJrz:AGGDubb:AGGShxp:AGGTImy:AGGUqUP:AGGWRTR:AGGdDpp:AGGgGbM:AGGhoTI:AGGkkvg:AGGltOV: +AGGnxkd:AGGwWpH:AGGxYWG:AGGxziP:AGHDWmq:AGHIQiu:AGHIzYY:AGHMOdl:AGHMjUF:AGHNsAt:AGHZIMr:AGHaLCz:AGHeFBI:AGHhgkB:AGHieOt:AGHmotb:AGHnKXC: +AGHnpto:AGHtxKo:AGIGvzC:AGIHNEo:AGIOiCM:AGIVopp:AGIWUYy:AGIpgox:AGItQlB:AGIteVH:AGIzhqG:AGJAHut:AGJCLLA:AGJCMWP:AGJLArE:AGJMvZL:AGJTLLa: +AGJTMWp:AGJkcJb:AGJkgSt:AGJugOW:AGJyeqs:AGKBtYs:AGKHpGP:AGKIJBW:AGKJCeB:AGKTeKW:AGKUVBZ:AGKaHkq:AGKajYv:AGKbKPD:AGKdBNH:AGKdrDG:AGKmdXE: +AGKtSWn:AGKuUoX:AGKxYAF:AGKyszu:AGLARLy:AGLFWUr:AGLIUfc:AGLNUxW:AGLPCEK:AGLQcWc:AGLWiVs:AGLbWex:AGLcQXM:AGLdqst:AGLfBSf:AGLflQt:AGLhxiB: +AGLjBnA:AGLjrdN:AGLmdZy:AGLmqSV:AGLoIPK:AGLsWGG:AGLyDmy:AGMAsZd:AGMGlQn:AGMQuAc:AGMUWTc:AGMZNiM:AGMaywu:AGMdDmn:AGMeHCt:AGMgZPM:AGMhQuh: +AGMhslN:AGMmnnd:AGMnmtN:AGMugNq:AGMzfHS:AGMzixM:AGMzwoq:AGNCkOj:AGNEPUu:AGNGszm:AGNJlMc:AGNMlqg:AGNNaup:AGNPNgv:AGNPUKq:AGNPsGx:AGNWoiK: +AGNadKa:AGNfBBl:AGNjbrq:AGNlCL:AGNlyWT:AGNmZpD:AGNnaBs:AGNofrv:AGNpbjI:AGNyCoV:AGOCzjw:AGOEkQL:AGOFhxY:AGOOpTI:AGOOsDR:AGOPLgd:AGOWyvz: +AGOXuth:AGOYsaV:AGOZODN:AGOZjud:AGOamTm:AGOiWpA:AGOpSIV:AGOpham:AGOrpAr:AGOvLzn:AGOyGbD:AGOzOfb:AGPIscY:AGPKkqU:AGPPRtb:AGPRyiV:AGPUDnf: +AGPUptP:AGPUsdK:AGPVsWo:AGPZFws:AGPbhJs:AGPcWWx:AGPfEAg:AGPfZbX:AGPtWWX:AGPvhla:AGQAvyP:AGQGQjf:AGQKrTI:AGQUGRP:AGQUOfJ:AGQUxbP:AGQYZtj: +AGQYocM:AGQeeQu:AGQjDLp:AGQlhqN:AGQnaZu:AGQvuvJ:AGRAvZs:AGRDxAJ:AGRGPOd:AGRJGGC:AGRRuUb:AGRYamG:AGRaMOg:AGRfICu:AGRmQLR:AGRmevX:AGRpDlI: +AGSEmsS:AGSHUDa:AGSNVFN:AGSQAYy:AGSTAea:AGSUFFJ:AGSUnFF:AGSWnwg:AGSZaAc:AGSgBNg:AGSgrDh:AGSuKPk:AGTAYTu:AGTJmSl:AGTSCEr:AGTXWUk:AGTcLph: +AGTcwkH:AGTddxu:AGTmBnx:AGTmrdw:AGTpIPr:AGTuWeA:AGTwlBe:AGTwqsM:AGTylQM:AGUAROx:AGUBlOc:AGUExGI:AGUGhhI:AGUKANt:AGULNiF:AGUPTyd:AGUUYfq: +AGUVGgO:AGUVZqe:AGUVxrH:AGUfjyL:AGUhzPK:AGUiywv:AGUmfHx:AGUmixf:AGUmwoZ:AGUnAvL:AGUndEV:AGUyXmW:AGUzZzr:AGUzcUH:AGVCrGq:AGVCtg:AGVIbiB: +AGVJRgF:AGVJloX:AGVLQWt:AGVMape:AGVQAnO:AGVaQUx:AGVbWsV:AGVgpWE:AGVnjYw:AGVpzpp:AGVsfhC:AGVswOa:AGVvAVw:AGVvdem:AGWFsCg:AGWGQIp:AGWHJrT: +AGWIFei:AGWKnJp:AGWRbrv:AGWRkUS:AGWaxkJ:AGWgFbn:AGWlGbc:AGWoUYi:AGWrNzl:AGWtuaZ:AGWwcoT:AGWxPYh:AGWyji:AGWzWwx:AGXLzJG:AGXMJRc:AGXbzII: +AGXewOR:AGXioVi:AGXmNOR:AGXneOF:AGXpuVm:AGXqKXq:AGXrotP:AGXzoEN:AGYAxah:AGYBotp:AGYHGRK:AGYHOfQ:AGYHxbK:AGYLnXo:AGYMMce:AGYMXND:AGYYuZH: +AGYcIcW:AGYeCSk:AGYhuvq:AGYjYIs:AGYmtdl:AGYohqU:AGZBZTz:AGZIzUR:AGZNOFZ:AGZTrtY:AGZUuUK:AGZYDXH:AGZbtDG:AGZtqNm:AGZzgOA:AGaEotY:AGaGvyb: +AGaLQjt:AGaMftb:AGaTPoO:AGaWNGs:AGaWcbF:AGaWlsC:AGaZKxt:AGacaZg:AGajQly:AGajeVs:AGaklit:AGaksze:AGanMoL:AGaqqnO:AGbAOFa:AGbEZTA:AGbEoCf: +AGbNQT:AGbTZno:AGbYHuY:AGbtMOU:AGcArYf:AGcGLDm:AGcHqOV:AGcQRlm:AGcVWuf:AGcYUFw:AGcczIp:AGcdBXC:AGcgSMY:AGchmhS:AGcjSWs:AGckxOl:AGcrWEl: +AGcsQxY:AGctlbH:AGcvBsr:AGcxxIV:AGczBNU:AGczrDZ:AGdFCfS:AGdMLdV:AGdPqom:AGdRjmG:AGdWRLV:AGdeIPd:AGdiPGb:AGdicOl:AGdjrFA:AGdjzKH:AGdkysp: +AGdlBxx:AGdmSmb:AGdxsl:AGeBPnn:AGeDDVb:AGeFROn:AGeJlLY:AGeJnMO:AGeRAWm:AGeUPuA:AGeVLoO:AGeWsZY:AGecxiW:AGedoIG:AGeohXu:AGephXU:AGeqdkU: +AGerqbD:AGevbAf:AGezVmu:AGfBapW:AGfGPNQ:AGfHrGC:AGfLPO:AGfYkOA:AGfaGbJ:AGfioix:AGflpWw:AGfnyWw:AGfrHcv:AGfsLrb:AGfuhxj:AGgBryz:AGgLQIB: +AGgLzyn:AGgMyvo:AGgPnJB:AGgYsCU:AGghpAg:AGgjMz:AGgnuvh:AGgoTqj:AGgpOfw:AGgsWwt:AGgvEak:AGgvZBT:AGhDiFt:AGhFprq:AGhHski:AGhKNsq:AGhQqNp: +AGhSqEs:AGhbPyA:AGhdWWQ:AGhgNpC:AGhhatK:AGhsNOl:AGhvGBJ:AGhwKXO:AGhwptc:AGiAUYE:AGiGzuW:AGiJNPl:AGiLKxs:AGiOARV:AGiTxaF:AGiWPoh:AGiZGgO: +AGicjDR:AGiiPm:AGilcYO:AGincjq:AGingsg:AGiqMok:AGivIcy:AGjDGsf:AGjFvZH:AGjKxAq:AGjSKXD:AGjVUyr:AGjWZnF:AGjblID:AGjbsZU:AGjcQLI:AGjcevC: +AGjjHCU:AGkAaAh:AGkGGGU:AGkHqyw:AGkKAej:AGkNqD:AGkQYtA:AGkbYAb:AGkcBeH:AGkgKAT:AGkjoyB:AGksSA:AGktwix:AGkvWgJ:AGkzqXW:AGlGaaa:AGlHJbZ: +AGlJryv:AGlLilT:AGlOIPu:AGlTVbW:AGlXUxs:AGlamHC:AGliBEA:AGlmlBX:AGlmqsp:AGlooYk:AGlqxiF:AGlsSwc:AGltUOU:AGlwYaK:AGlxsZx:AGmALZt:AGmFkog: +AGmHPux:AGmJoIF:AGmSrge:AGmYbIV:AGmZRGR:AGmZlOL:AGmbioV:AGmikBl:AGmiqAb:AGmjCnT:AGmqQul:AGmqslJ:AGmrWSB:AGmwpwQ:AGmyaNi:AGnFlqc:AGnLkOn: +AGnNPUq:AGnPuan:AGnQlli:AGnTWtn:AGnWCXM:AGnYNgr:AGnYUKu:AGndHcy:AGnmbaV:AGnwWsk:AGnybjM:AGoCsaz:AGoHDNs:AGoHpTE:AGoMFWf:AGoQqUu:AGoSRTw: +AGoUyIC:AGobTqs:AGocGbh:AGohEaR:AGohZBm:AGomgKL:AGorYWb:AGorziu:AGpBzJr:AGpFZxk:AGpGFEK:AGpIOdK:AGpIjUa:AGpNDnz:AGpNptL:AGpNsdW:AGpTkqI: +AGpaFBn:AGpdeOs:AGpeLZk:AGpiOFg:AGpjVMC:AGpqpaw:AGpxWPD:AGqAARO:AGqBnXx:AGqIPoq:AGqRZtf:AGqRocA:AGqXotg:AGqYzuN:AGqeTaG:AGqoRfX:AGrEKXC: +AGrFArf:AGrIZnA:AGrJrtL:AGrPvYU:AGrVQJc:AGrWGsA:AGrXZTo:AGrXoCH:AGrYXax:AGrmHCr:AGrteqp:AGrulIc:AGrusZr:AGrzrSK:AGsFotF:AGsNloq:AGsPeKt: +AGsUCeA:AGsVcwi:AGsWVFB:AGsYGGR:AGsadzS:AGsgdXf:AGspnET:AGssszV:AGswPd:AGsxQxG:AGszlbv:AGtBWUO:AGtCFfq:AGtJpgd:AGtSlOF:AGtTmSH:AGtZYTq: +AGtbMo:AGtfrds:AGtgbsX:AGtmWGz:AGtqqxg:AGtsDmD:AGuENGp:AGuEUkw:AGuFrgN:AGuGdtm:AGuHwSq:AGuLRGY:AGuLlOG:AGuNJZi:AGuUNiB:AGucabu:AGudQuG: +AGudsla:AGukBbj:AGumpws:AGuobRw:AGurXmS:AGuvixb:AGvAPUh:AGvCszp:AGvDxgv:AGvFhHv:AGvIlqz:AGvJaum:AGvLPNG:AGvNDvK:AGvPRoG:AGvSoiV:AGvTYFN: +AGvUQEl:AGvZAnK:AGvcyWa:AGvhyWI:AGvkaBN:AGvlbjT:AGvnoin:AGvsBBQ:AGvupWH:AGvxXMh:AGwAkQo:AGwJswU:AGwKpTj:AGwKsDq:AGwRqss:AGwSyvY:AGwZUEO: +AGwdYWm:AGwdziz:AGwkZBB:AGwpNoA:AGwtKxb:AGwtpTN:AGwuSvX:AGxGkqp:AGxHquE:AGxJRtG:AGxLyis:AGxQDnC:AGxQptu:AGxQsdn:AGxVQik:AGxVzYG:AGxXFEr: +AGxYZxR:AGxZnjk:AGxboVe:AGxnUyr:AGxvFBu:AGxweOJ:AGyCftw:AGyDMcY:AGyDXNx:AGyQGRw:AGyQOfm:AGyQxbw:AGyUZtM:AGyUocj:AGydtdP:AGyfhqi:AGylCSW: +AGyuDLw:AGzBJp:AGzJoPe:AGzKnxh:AGzLMCb:AGzLXnC:AGzWGrL:AGzWOFV:AGzWxBL:AGzbICP:AGzdgOm:AGzheqI:AGzltDk:AGznhQR:AGztCsl:AGzyYit:AHAEvOY: +AHAGaPN:AHAKNOq:AHALuOr:AHAQjKo:AHARPNh:AHAbtiT:AHAhLkm:AHAhQZE:AHAiJPN:AHAihbI:AHAnTWM:AHAnbGp:AHAoBZT:AHBAlmq:AHBFumo:AHBKrEq:AHBMIeX: +AHBRTpr:AHBXPnQ:AHBYjkV:AHBZcLC:AHBbMAO:AHBjWby:AHBjlyY:AHBqJpw:AHBqhBp:AHBrkyE:AHBtRmF:AHBtTwt:AHBtbgI:AHCBlSh:AHCHlfj:AHCLZWF:AHCNLdr: +AHCNOdQ:AHCQLXv:AHCRcqX:AHCVxqO:AHCXrFK:AHCcIfJ:AHCdDbP:AHCeQkA:AHCfBIx:AHCiBHc:AHCohJl:AHCtBCX:AHDBLee:AHDBNds:AHDCqLy:AHDMKFb:AHDNlFs: +AHDQSse:AHDWLxo:AHDabKD:AHDnBhZ:AHDpAgl:AHDtdDo:AHDuhju:AHDwzyL:AHDxSEO:AHEBzQF:AHEGoua:AHEMSJH:AHEOKXD:AHEPHqQ:AHEYSMZ:AHEYdGw:AHEctxw: +AHEdtns:AHEfHcb:AHEiHEP:AHEtwyi:AHEyehV:AHEyzKi:AHFGzqo:AHFHQZQ:AHFOAlP:AHFSZCv:AHFUKxM:AHFVHQX:AHFdTUd:AHFeEFw:AHFitNZ:AHFkvDG:AHFnWFc: +AHFoHHL:AHGJFtj:AHGRqcN:AHGWGRQ:AHGZdqP:AHGeWxk:AHGfevR:AHGvRzf:AHGwvTD:AHHACKu:AHHALZp:AHHCFyD:AHHEiiY:AHHFkQG:AHHQVPQ:AHHRld:AHHWqCg: +AHHhCCE:AHHhGZS:AHHkWXb:AHHpGIK:AHHuExt:AHHzdeq:AHICuMI:AHIDPNW:AHIFclE:AHIOLfu:AHIPJDf:AHIbUn:AHIcBZk:AHIdSsR:AHIhwni:AHIqTWR:AHIqbGo: +AHIrDsW:AHIrQzx:AHIyqqC:AHJIKRS:AHJLcLJ:AHJUMZT:AHJVLrP:AHJXumf:AHJaQzU:AHJbOPn:AHJbOUg:AHJktID:AHJnwNf:AHJtddX:AHJwRmo:AHKGRnB:AHKQgng: +AHKQzxM:AHKRvyF:AHKeSem:AHKlbHr:AHKmAGN:AHKpJpD:AHKqddM:AHKrnKt:AHKwFAp:AHKwIqn:AHKwWfR:AHLAXrP:AHLCQzj:AHLELeL:AHLENdZ:AHLLSNy:AHLLnnw: +AHLLuBp:AHLUXnJ:AHLWHAJ:AHLbcGx:AHLcQhN:AHLdcfw:AHLgElU:AHLjwzn:AHLmBch:AHLniE:AHLvJPO:AHLxZyH:AHMBKXc:AHMLlnk:AHMQQlR:AHMSqep:AHMiTFp: +AHMjuPA:AHMkXbB:AHMpEl:AHMqnfM:AHMrfkF:AHMukqn:AHMvoom:AHMxHce:AHMzljW:AHMzosV:AHNBSmj:AHNBdgG:AHNHKxt:AHNVSjx:AHNWZPC:AHNYQiE:AHNYfLv: +AHNeGbx:AHNoftn:AHNpeQ:AHNqXBU:AHNwfKq:AHOApik:AHOBUSP:AHOCOyZ:AHOFOjn:AHOHMwz:AHOIXhP:AHOKRuN:AHORXks:AHORooi:AHOaqeh:AHOfdEs:AHOhRzm: +AHOkijo:AHOmcZS:AHOqKix:AHOuTmT:AHOwHxm:AHOxevY:AHPBrIy:AHPDVPH:AHPFuUm:AHPIpIP:AHPKOYa:AHPLOJU:AHPMxhe:AHPNMWA:AHPQXHk:AHPSRUu:AHPXXKH: +AHPXoOR:AHPeGFi:AHPhSSO:AHPiExM:AHPldeH:AHPoQGE:AHPpAsM:AHPsLVG:AHPsiJT:AHPuczh:AHQFjKy:AHQHRPU:AHQJIEw:AHQSqVo:AHQoJPx:AHQuHFV:AHQzCfd: +AHQzpnj:AHRFLFE:AHRMPng:AHROcLu:AHRSQPd:AHRUiYO:AHRaDqR:AHReQqD:AHRgddg:AHRiuFO:AHRliYu:AHRpqQs:AHRsTVm:AHRuOPQ:AHRuOUX:AHRxXfF:AHSAZWt: +AHSDvyO:AHSFeUf:AHSGaGu:AHSHdiD:AHSNUHI:AHSQjSl:AHSYRnK:AHSacFU:AHSbgKB:AHSdFNS:AHShJZK:AHSjqyC:AHSkDLw:AHSsJpm:AHSvIzO:AHSvJKm:AHSxyTa: +AHSyWWk:AHTBxQd:AHTLvYv:AHTMagL:AHTVUhp:AHTZgNw:AHTaNGW:AHTiGgB:AHTlxDO:AHTpWFB:AHUCUkM:AHUEflh:AHUFQzV:AHUFqeY:AHUJGWm:AHURQgx:AHUYSBa: +AHUbBYe:AHUclsH:AHUcrVt:AHUdnfd:AHUhkqG:AHUnIu:AHUqgwd:AHUsOtB:AHUspPI:AHUtCfu:AHUuiiZ:AHUxcTC:AHUxnYK:AHVDAln:AHVLzqQ:AHVNNcH:AHVQoUv: +AHVSiBB:AHVSwdL:AHVXQGa:AHVafti:AHVceHA:AHVfORc:AHVhDVK:AHVjdYf:AHVntNd:AHVsHeG:AHVzCFl:AHWEXkj:AHWEoop:AHWHuPj:AHWIOjw:AHWKMwc:AHWLGRC: +AHWUUSI:AHWXVsP:AHWZQWq:AHWfFIV:AHWkRzt:AHWuroN:AHWxmfD:AHXDdQk:AHXKXKc:AHXKoOy:AHXQMWj:AHXTFTQ:AHXWVPc:AHXYuUF:AHXeGIY:AHXjKIh:AHXodec: +AHXsAsf:AHXzqEx:AHYLkeu:AHYLwuV:AHYQlMe:AHYaLxH:AHYabzZ:AHYgyN:AHYjblY:AHYlpnq:AHYmRoR:AHYnYZc:AHYvBWk:AHYvGUk:AHYzWBm:AHYzlYM:AHZAgVr: +AHZCIeG:AHZDgnO:AHZFMAc:AHZHaLp:AHZNcok:AHZNwWp:AHZPvbe:AHZQRpe:AHZWlmn:AHZXQfU:AHZaRvK:AHZdkhN:AHZfJpH:AHZfhBO:AHZhkyZ:AHZpbLR:AHZwsdZ: +AHZxMAP:AHaFEBK:AHaKcOI:AHaKwwR:AHaPQpO:AHaYKrG:AHadMaR:AHajyHZ:AHanwLm:AHapTvF:AHapcru:AHaqLki:AHaqQZA:AHarOpz:AHarOus:AHbDrEu:AHbImEF: +AHbJlmu:AHbKQfN:AHbQAhi:AHbWgnT:AHbXQPv:AHbatIi:AHbfROB:AHbfZBK:AHbhYzS:AHbkMAK:AHbmXfT:AHbryhc:AHbsbLI:AHbwkhU:AHbxcRL:AHbzOPC:AHbzOUJ: +AHcDSSx:AHcJLXr:AHcQXRd:AHcULEx:AHcUNDn:AHcXAYI:AHcfUN:AHcgGGM:AHclHQT:AHcnQkE:AHcsKKt:AHcsQHz:AHcvvdt:AHcwELa:AHdAcQE:AHdExQR:AHdJSsa: +AHdMLDo:AHdMODL:AHdPLxk:AHdQlsu:AHdVKFf:AHdbJkB:AHddWwd:AHdiaV:AHdjNwb:AHdkcfz:AHdnhjq:AHdrIFW:AHduBie:AHdyKkm:AHdyQhc:AHdzcGU:AHeBlnp: +AHeConU:AHeKShB:AHeRSMf:AHeRdGK:AHeXKXx:AHebHhy:AHecUhi:AHedPHf:AHehlsz:AHehrVF:AHekgkP:AHeloov:AHenvdr:AHepWfv:AHeuGBt:AHevbP:AHfAmuW: +AHfBiJ:AHfBjnb:AHfDRPB:AHfFoUd:AHfGnzr:AHfKoNl:AHfLSjM:AHfMQGs:AHfOQLp:AHfUGwf:AHfXdgr:AHfaiIq:AHfglJU:AHfgoST:AHfhHeU:AHfinSf:AHfkUHP: +AHfrtXr:AHfsgKi:AHfxeHS:AHfxzkl:AHgAGRm:AHgCles:AHgRriu:AHgSQG:AHgTVpD:AHgVuua:AHgiCPn:AHgkCcP:AHgkGzF:AHguGfe:AHgxSsC:AHgyEXA:AHhAqCK: +AHhCnlk:AHhIFTo:AHhJCKy:AHhJnnL:AHhLnyt:AHhOkQK:AHhRNqy:AHhUQwF:AHhVGrT:AHhYpFp:AHhdWXn:AHheeVW:AHhoCpw:AHhutHF:AHhvvtA:AHiCaPm:AHiFalu: +AHiGNOR:AHiHvKa:AHiVLfI:AHikBWE:AHikGUE:AHilzBz:AHinRVn:AHioWBC:AHiolYc:AHiuQQH:AHiwdDk:AHixNLl:AHiyufC:AHjAZwX:AHjBumB:AHjHvom:AHjNaLB: +AHjjhch:AHjkLXq:AHjkbZc:AHjpRmk:AHjpTwY:AHjpbgd:AHjqQZs:AHjwDqi:AHkEESF:AHkJLdM:AHkJOdn:AHkPSnV:AHkPnNX:AHkRxqp:AHkeKKo:AHkeQHa:AHkfbkB: +AHkiELz:AHkpBCg:AHkqNgC:AHkyGGV:AHlCoMb:AHlKEsM:AHlOuLV:AHlPgNh:AHlPzXB:AHlTGWR:AHlUnns:AHlUuBt:AHlVRNM:AHlXWzr:AHlfDBd:AHllAgA:AHlpdDB: +AHlsAKv:AHltSEb:AHmISJk:AHmJHqr:AHmKKXg:AHmTALZ:AHmUSMy:AHmUdGT:AHmbTFt:AHmiTun:AHmnwyJ:AHmpsTN:AHmsWfi:AHmvOrW:AHmzdyR:AHnDomj:AHnQKxh: +AHnafKM:AHneoOf:AHngvDb:AHniupJ:AHnjXBI:AHnkHHi:AHnmPhv:AHnyftR:AHoBIZ:AHoTdqw:AHoaWxL:AHohiiJ:AHopDPL:AHosvTc:AHouGiE:AHovSe:AHozKit: +AHpDxhY:AHpHXHW:AHpJRUI:AHpMVPt:AHpPpIl:AHpTmJZ:AHpbGZv:AHpfQGy:AHpgWXG:AHpjiJh:AHplGFU:AHppqEo:AHptTMS:AHpvHXj:AHqKvKx:AHqNKrY:AHqQgvN: +AHqdDQG:AHqozBc:AHqqRVw:AHqvTvx:AHqvcrK:AHrOMZw:AHrPLFy:AHrQvkq:AHrRqvj:AHrUuqU:AHrjwNE:AHrtHfS:AHruzbj:AHsDWZp:AHsIqlV:AHsJyot:AHsKHal: +AHsPeUB:AHsUtpa:AHsWLFf:AHsWrNx:AHsZXNL:AHsbyTE:AHsdNgj:AHsnZYn:AHsoimD:AHsqJZO:AHssqyG:AHswbFp:AHsxtuT:AHtALeS:AHtANdE:AHtGcQw:AHtISNF: +AHtInnH:AHtIuBO:AHtLrfD:AHtPjsQ:AHtSHAU:AHtVagH:AHtgwzQ:AHtiBcw:AHtnbhf:AHtocGG:AHtrJPP:AHtyFad:AHtyIQz:AHtyWFF:AHtzDlJ:AHuFwDQ:AHuPShT: +AHuVuLN:AHuXonC:AHuZlDN:AHucsTg:AHujGBb:AHupgkF:AHuqkqC:AHutljz:AHvBiDK:AHvRUKP:AHvTQiF:AHvTfLu:AHvWomU:AHvaByx:AHvkTfD:AHvmeHe:AHvmzkZ: +AHvpgWy:AHvrlSU:AHvrrvi:AHvsdYb:AHwGriG:AHwHADx:AHwQmjx:AHwQxGY:AHwVleA:AHwYIJb:AHwbRzH:AHwqoMR:AHwsDPe:AHwuASs:AHxFqCY:AHxGNqk:AHxHOJr: +AHxJMWf:AHxKGrF:AHxTXKo:AHxToOu:AHxWmJA:AHxaiIZ:AHxcrOk:AHxdExJ:AHxiJmx:AHxjRZq:AHxoczO:AHxsKId:AHxuFiS:AHxwTMH:AHyDRPr:AHyIiyq:AHyJMaT: +AHyKuOC:AHyMJDh:AHyTrey:AHyYmeJ:AHyZlMy:AHyeqqm:AHyoDsY:AHyoQzv:AHyqtie:AHyvRoN:AHyvZbG:AHywbQW:AHzAMZn:AHzOMAo:AHzQTpa:AHzZrEb:AHzcuFj: +AHzpLXO:AHzqkyV:AHzuBwl:AHzuGul:AHzyWbj:AHzylyJ:AIABqwl:AIAEjEk:AIASqgN:AIATnsI:AIAUGco:AIAcAtM:AIAcEa:AIAfCcV:AIAgnkF:AIAjgyk:AIAjrlh: +AIAoIdW:AIAuFkU:AIAvVvj:AIBFzWL:AIBHqWw:AIBRDLp:AIBWbDU:AIBiATV:AIBmluG:AIBwTwi:AICDJgM:AICEPef:AICKZrO:AICUZxD:AICUyAH:AICWpUR:AICZeSV: +AICixYM:AICjqBj:AIClhND:AICnpau:AICpbwp:AIDBEBr:AIDQZId:AIDRTfu:AIDXbwW:AIDdDWC:AIDgSYk:AIDiKqw:AIDlwIv:AIDmqZC:AIDshnS:AIDtcwN:AIDxbWG: +AIEDkwx:AIEJhUg:AIEOSKd:AIERutQ:AIETrMW:AIEWIqY:AIEYZoi:AIEcDWF:AIEcNkx:AIEprjL:AIEtjrG:AIEtmKe:AIExzqg:AIFDLek:AIFFJIQ:AIFGGQX:AIFOhuL: +AIFTLYv:AIFUhCU:AIFXuTZ:AIFZmEt:AIFadEi:AIFksHj:AIFnzbc:AIFyIix:AIGCDIz:AIGEHXg:AIGHExN:AIGHSTV:AIGKboI:AIGPekQ:AIGWnsP:AIGbJEw:AIGhKxs: +AIGkSgq:AIGpAiL:AIGqCBZ:AIGsRrE:AIGxQU:AIGysva:AIGzEOZ:AIHDnWD:AIHLFvu:AIHUWMw:AIHZhFk:AIHfzqI:AIHhYYT:AIHnKXz:AIHwCbS:AIIFsfH:AIIODlR: +AIIRxF:AIISqB:AIIUeFk:AIIXvwS:AIIYpBJ:AIIcwoW:AIIdHAS:AIIdsDs:AIIpfMr:AIIqGbE:AIIrqGJ:AIIxtNk:AIJARZV:AIJDMal:AIJGVDP:AIJMnSy:AIJNpbc: +AIJPyuU:AIJQJXh:AIJUycl:AIJXXpR:AIJZkVr:AIJbSuJ:AIJfIDg:AIJiRyG:AIJoCCf:AIJpDCw:AIJpwAr:AIJumxu:AIJwGBL:AIJweBi:AIJxqgC:AIKBBGs:AIKFUcC: +AIKGJgT:AIKMBrV:AIKQyIp:AIKXybq:AIKbcMe:AIKbpaL:AIKcbwi:AIKfhLD:AIKfowW:AIKuCcQ:AILDZIC:AILHwoL:AILNZoF:AILSesF:AILdqbZ:AILehnT:AILgcmL: +AILgpAe:AILhcml:AILhpAE:AILleCH:AILrkxN:AILvIkx:AILxeHq:AILySYl:AIMGzlS:AIMPyvV:AIMRhcw:AIMaEjo:AIMcslZ:AIMeIIz:AIMgMCG:AIMjyoN:AIMtslz: +AIMxMCg:AIMzhgr:AINBjwQ:AINChuw:AINDYQG:AINGBSm:AINGKgs:AINIIQU:AINMkWh:AINOzLj:AINPIQI:AINQZNo:AINVyVo:AINXUTJ:AINZBrw:AINaXdL:AINbNrY: +AINdRik:AINiEJV:AINndkL:AINpyOw:AINtLJt:AINwalR:AINxjJm:AIOAYWo:AIOFhfi:AIOKOJQ:AIONtVA:AIONyqX:AIOSlds:AIOTfOy:AIOczQk:AIOeYyv:AIOioKE: +AIOqCph:AIOsaoB:AIOtEDV:AIOuTOE:AIPAStf:AIPBbOy:AIPEHZg:AIPPraK:AIPXccX:AIPYeKa:AIPaKXC:AIPbSGA:AIPfHVi:AIPizqp:AIPjSFu:AIPjcQw:AIPkJeG: +AIPkYYm:AIPpDGE:AIPpHO:AIPsEoj:AIPwKbL:AIQDXPT:AIQFkvt:AIQLTBS:AIQLsVh:AIQQBiN:AIQQTdy:AIQRGrp:AIQSPke:AIQTbdx:AIQUozd:AIQVxKm:AIQXsfG: +AIQeqGe:AIQmDcQ:AIQmwaT:AIQsBaC:AIQtTWD:AIRCTbL:AIRCsvw:AIRHVXN:AIRKXpK:AIRLLvO:AIRLQvg:AIRSyuL:AIRTTbl:AIRTsvW:AIRZGRO:AIRbVVC:AIRifmb: +AIRkqgZ:AIRsDCn:AIRswAk:AISASFP:AISJGXw:AISKXTZ:AISOQzX:AISTrnM:AISVAyD:AISXUcH:AISlzly:AISmRB:AISmkKI:AISthAT:AISxiCo:AISyerr:AITOPEO: +AITPqfG:AITQrUI:AITRPUy:AITRYwK:AITeTRE:AITlSYU:AITvOId:AITzaua:AIUDUtt:AIUMjWO:AIUOYqY:AIUYyhU:AIUaaLl:AIUhBIQ:AIUkkbO:AIUkncB:AIUoRIu: +AIUwAQN:AIUxDWh:AIUxNkV:AIVUjwx:AIVWYQn:AIVWxu:AIVfjDo:AIVnIij:AIVshGb:AIVwRiB:AIWIBFT:AIWMTzE:AIWNOKD:AIWNojX:AIWOAsT:AIWVDIH:AIWXOlX: +AIWXcEn:AIWcHvK:AIWmcHa:AIWmfKF:AIWmuBA:AIWpvmi:AIWqJKg:AIWwEDo:AIWwQtY:AIXBgad:AIXEJcK:AIXELZK:AIXIolk:AIXMlly:AIXQGan:AIXSqbI:AIXTOkM: +AIXToJQ:AIXYXWN:AIXYeab:AIXfJkN:AIXlwPv:AIXrchH:AIXrfko:AIXrubh:AIXxHVb:AIXzAIW:AIYCVxh:AIYFmSv:AIYIHLs:AIYJxKT:AIYTOnH:AIYXEHx:AIYZwRC: +AIYcaAz:AIYefzt:AIYfBaZ:AIYgRYx:AIYhwoA:AIYjHAe:AIYjsDE:AIYrwgH:AIYxOIz:AIYyAtb:AIZCpbu:AIZDvWl:AIZEyuC:AIZLpGP:AIZPWiL:AIZZONA:AIZaqxQ: +AIZduIo:AIZhjWm:AIZloEX:AIZmwOh:AIZvFbt:AIZvXbj:AIaDygd:AIaEDlo:AIaIzwS:AIaJvni:AIaKqwh:AIaOvEE:AIaQRzb:AIaWVdd:AIacTHK:AIadwgC:AIanBdq: +AIatTHk:AIayRYs:AIbCnSV:AIbKycC:AIbOzWH:AIbQqWs:AIbRyib:AIbTjet:AIbUYpF:AIbWRZy:AIbcFKj:AIbeCCI:AIbfnKY:AIbigYt:AIbirLw:AIbrATR:AIbsBDJ: +AIbywGx:AIcCBrK:AIcDHnh:AIcDKvL:AIcFSFf:AIcPpUV:AIcTZiW:AIcXwOX:AIcgehE:AIcghBT:AIctqBN:AIcwcMX:AIcwpaq:AIcxcMx:AIcxpaQ:AIdEqfU:AIdGPUk: +AIdGYwY:AIdTyas:AIdVpui:AIdYAeM:AIdZZRt:AIdhkxe:AIdhxyv:AIdkTRw:AIdmDWO:AIeBTtb:AIeKGqo:AIeNyhG:AIeTYqK:AIeVOLR:AIeWBsa:AIeYIqY:AIeaxnM: +AIejxVi:AIekKeh:AIephgG:AIerNRU:AIetRIg:AIeyEjZ:AIfDWqy:AIfHDDO:AIfIrND:AIfNEG:AIfNSkc:AIfQGQt:AIfWFIT:AIfbDwA:AIfgxNV:AIfjJwD:AIfqKEs: +AIfrBix:AIfwzbo:AIgAOJF:AIgFYWX:AIgGoLl:AIgIldd:AIgQExr:AIgQSTj:AIgRbou:AIgUHzk:AIgWnwq:AIgaIFI:AIghCBf:AIgiaoU:AIgjOna:AIgjRry:AIgkTOR: +AIgqKxO:AIgrSgM:AIgvHve:AIgzSfy:AIhEOg:AIhTHxb:AIhWYhn:AIhWpPc:AIhZbOL:AIhdnzH:AIhmKby:AIhoAII:AIhrONX:AIhroQ:AIhtKi:AIhwKXv:AIhzSGt: +AIiIPkN:AIiKbds:AIiSTBX:AIiSsVc:AIiXVxZ:AIibtNO:AIicFBO:AIicXBQ:AIiiBah:AIijfzF:AIilRYJ:AIimHAW:AIimsDw:AIirVvW:AIixaAH:AIiyfMv:AIjANYP: +AIjAvNY:AIjBzWc:AIjDqWX:AIjKyGT:AIjPmsm:AIjSHlh:AIjXpbG:AIjbOia:AIjcOEy:AIjcRFq:AIjdATY:AIjeBDA:AIjgluh:AIjiFbF:AIjiXbX:AIjkjbB:AIjofZo: +AIjrwOZ:AIjwtnf:AIkGZiN:AIkKwOA:AIkQZxY:AIkQyAU:AIkSpUO:AIkTrR:AIkVeSK:AIkWHnq:AIkWKvU:AIkeuWS:AIkgqBW:AIkihNy:AIkkcMa:AIkkpaH:AIkmbwM: +AIkrqzI:AIlEUCN:AIlFJGY:AIlWZXP:AIlcSYH:AIlehlI:AIleoWZ:AIlnhnP:AIlqcmh:AIlqpAA:AIlrbWd:AIlzuwz:AImEYJi:AImMBRB:AImbXiu:AImfQUU:AImjrji: +AImpdKY:AImrzqB:AImsyoB:AImvjds:AImwLjA:AInFzLV:AInGWqR:AInGsfP:AInNBSQ:AInNKgO:AInOOlb:AInQhCr:AInWyHw:AIneDwj:AIneNKT:AInfMcB:AInhXdp: +AInihGw:AInmItb:AInnpAh:AInpTn:AInwSga:AInyyOK:AIoDYHL:AIoDppA:AIoInwJ:AIoLekv:AIoNlGQ:AIoOhfe:AIoUJCw:AIoULzw:AIoYoLW:AIodKxT:AIoeSgV: +AIomOnz:AIomRrb:AIoonZj:AIotsvf:AIpIYhg:AIpIpPj:AIpJEXb:AIpJStz:AIpLbOE:AIpOYwH:AIpRlDt:AIpZOjV:AIpbzql:AIpdYYq:AIppCPo:AIpraOE:AIptToB: +AIpxokB:AIpyDGY:AIpzIfY:AIqAGcU:AIqBsfk:AIqCvwP:AIqFiN:AIqIMAf:AIqJBiB:AIqJTdu:AIqMXPX:AIqOkvx:AIqPkvX:AIqSpBi:AIqTvwp:AIqVJxb:AIqfwaX: +AIqkGbf:AIqkebC:AIqlfMQ:AIqnqGi:AIqqqXM:AIqrOA:AIqtky:AIqtuis:AIqxjwq:AIrCVDM:AIrFHlq:AIrIGCb:AIrPBIu:AIrPTDB:AIrQMaQ:AIrULvK:AIrUQvc: +AIrboEs:AIrcIDZ:AIrlDCj:AIrlwAo:AIrqmxh:AIrrfmf:AIrsGBQ:AIrseBt:AIryqxz:AIsHEbS:AIsLGIm:AIsTPuF:AIsTYWt:AIshTrZ:AIsjDwb:AIsrerv:AIswkXH: +AIsxRID:AIsxYt:AItBwoq:AItJXtE:AItNHNA:AItNKVe:AItPSfO:AItlkkV:AItwKqM:AItxeRm:AIuFZoc:AIuJyvu:AIuPPh:AIuTFiy:AIuaAQj:AIucMCd:AIudzqM: +AIueyoM:AIuiLjN:AIujaLh:AIusdKv:AIutzBB:AIvCUTO:AIvRyVJ:AIvXjgo:AIvcjJh:AIvdrJY:AIvlzQr:AIvojDc:AIvpjDC:AIvtjJH:AIwABPp:AIwBOld:AIwBcER: +AIwFOJT:AIwJtVd:AIwLeAw:AIwNcCf:AIwWOKX:AIwWojD:AIwXAsH:AIwpwpC:AIxAWMI:AIxGcek:AIxKgah:AIxUDiM:AIxVfoE:AIxXBfQ:AIxabZO:AIxabjG:AIxbHVN: +AIxczoy:AIxodLw:AIxpJkb:AIxsMnf:AIxvEdj:AIyAeFA:AIyHTBv:AIyHsVM:AIyKBFl:AIyKaUU:AIyMVds:AIySnsZ:AIydqXd:AIykCnV:AIykzWP:AIysFkf:AIyuCcE: +AIyvnkU:AIywGoL:AIyygyx:AIzBVXm:AIzFXpH:AIzIkVH:AIzMpbY:AIzSBIR:AIzSTDe:AIzXHlv:AIzefmA:AIzgqgy:AIzltnx:AIzoDCM:AIzowAH:AIztfZq:AIzuoET: +AJAICwW:AJAJbNK:AJAKwIg:AJAQjnl:AJAWEZw:AJAXsOC:AJAeXPL:AJAjeRB:AJAsQwu:AJAtKBZ:AJAvOUp:AJBOCWn:AJBRbnr:AJBVuJB:AJBWjNU:AJBaElK:AJBekxx: +AJBiMsD:AJBieqX:AJBrCdd:AJBrPHM:AJBvHeE:AJCJauJ:AJCJkNb:AJCRSIu:AJCTixx:AJCaSVz:AJCbsNl:AJCsZxF:AJCwJmw:AJCxJmW:AJDJzIp:AJDOaUc:AJDObZU: +AJDOknK:AJDWZER:AJDYaq:AJDgSvs:AJDixmt:AJDoPHl:AJDqeCn:AJDsfRS:AJDwmjF:AJDzYFO:AJEDeqM:AJEEPyE:AJEEyAH:AJEKJIZ:AJETRHX:AJEXYxP:AJEZEHZ: +AJEekqP:AJEfsnR:AJEhTtZ:AJEjMwe:AJEmZXc:AJEnCxd:AJEnsof:AJEojLT:AJEweFy:AJExjBV:AJExpiZ:AJFCSwt:AJFJPYn:AJFJyac:AJFKeQf:AJFMBFA:AJFQJiQ: +AJFQuTw:AJFVHOj:AJFZDuu:AJFakkT:AJFepVI:AJFlkVP:AJFnDvl:AJFnVDs:AJFsZxh:AJFuyPu:AJFyObF:AJGAXBE:AJGArRt:AJGCSoo:AJGFWvF:AJGZmHb:AJGaSMT: +AJGahHt:AJGlEkG:AJGlgkb:AJGmFDU:AJGoQNm:AJGrQQI:AJGwdjY:AJHBPNg:AJHGheM:AJHLWVI:AJHPvQv:AJHTxyS:AJHbFSj:AJHcOLO:AJHdrpf:AJHlmvj:AJHluWc: +AJHoGPZ:AJHoREY:AJHpAhd:AJHsFdZ:AJHuQnb:AJIJEZl:AJIPGrI:AJISzFl:AJITYkr:AJIUUA:AJIZqsp:AJIeQwN:AJIjZIo:AJIvQZH:AJIybiQ:AJJBCWG:AJJCWfm: +AJJDwiw:AJJIYhy:AJJIzQu:AJJQsoS:AJJRgrg:AJJUGRb:AJJYtik:AJJZgqt:AJJcerR:AJJdCdm:AJJdPHD:AJJnKqO:AJJoZiD:AJJqQwp:AJKGzfo:AJKTxuk:AJKeZxA: +AJKfYfA:AJKjlcB:AJKkAEd:AJKkNtW:AJKlhi:AJKmRcj:AJKqMBC:AJKqztP:AJKraXf:AJKuZKN:AJKygvi:AJLAyXf:AJLEHJo:AJLOzFX:AJLSqvh:AJLbPHu:AJLlYFv: +AJLmZXv:AJLqJMG:AJMCCLV:AJMGoCP:AJMMOEz:AJMOLmr:AJMSAUQ:AJMWQKX:AJMYazL:AJMjYwr:AJMkDVN:AJMkVdQ:AJMmTUg:AJMtfrg:AJNFLne:AJNHbym:AJNJNZc: +AJNYboU:AJNldNF:AJNocwZ:AJNqTTj:AJOBEOE:AJOMtmx:AJONMZN:AJOOpbd:AJOQBmY:AJOUDIx:AJOVVLV:AJOVyYN:AJOXrsq:AJOYtKr:AJOimVL:AJOiuwE:AJOjtAX: +AJOpWfy:AJOxSw:AJOzWnp:AJPGxyL:AJPHxyl:AJPOWVV:AJPPFxY:AJPSvQi:AJPVMzw:AJPYher:AJPZXbU:AJPZrrd:AJPaJVI:AJPfFdE:AJPomvu:AJPuFSu:AJPwrpy: +AJPzSmD:AJPzhhd:AJQEtIi:AJQJLur:AJQLqsy:AJQaspo:AJQcHEn:AJQlbix:AJQoHHu:AJQtIJn:AJQwZeX:AJQxQsg:AJQzKBh:AJRDpyY:AJRHjiC:AJRIhRP:AJRLgqo: +AJRNBBL:AJRPLUk:AJRTrUO:AJRcibB:AJRdQwK:AJRfEly:AJRicJB:AJRrbIa:AJSCMlP:AJSCRDx:AJSJyCc:AJSMoEA:AJSOixj:AJSUYaT:AJSYdmG:AJSZRgL:AJSgKkN: +AJSgNjC:AJSglj:AJShZKg:AJSjATy:AJSjIBB:AJSusNB:AJTBWVk:AJTLZEL:AJTTbZK:AJTTknU:AJTXgXE:AJTfeCp:AJTftVB:AJTnxmj:AJToHNm:AJTxkLB:AJUDbOk: +AJUJVw:AJUKOcg:AJUPLmU:AJURLEO:AJURtJJ:AJUXoCw:AJUmjBx:AJUmpit:AJUncyN:AJUpAfd:AJUrtFc:AJUvOBc:AJUxiOx:AJVBYXI:AJVDEhC:AJVFCjR:AJVHFfh: +AJVJAua:AJVLghO:AJVNQkh:AJVQOCp:AJVQobl:AJVVSwF:AJVcDEZ:AJVgmgK:AJVjBgl:AJVmfRW:AJVqZps:AJVtkkf:AJVyemg:AJWAvml:AJWDBmB:AJWFXBW:AJWFrRf: +AJWGgjC:AJWOmHp:AJWWnWo:AJWYVLM:AJWYyYU:AJWZzuI:AJWgfby:AJWkgfS:AJWlxIM:AJWsIMC:AJWwfy:AJWyNbj:AJWzcjz:AJXTYNg:AJXUdEl:AJXZVGj:AJXZnPc: +AJXdGPL:AJXdREO:AJXecGB:AJXstaH:AJYARgs:AJYCapz:AJYGgQI:AJYHzFZ:AJYIwRH:AJYMEZZ:AJYNeki:AJYPktj:AJYcRWH:AJYukXl:AJYyMSP:AJYyeQL:AJZEyy: +AJZIaPu:AJZKnoq:AJZKoIw:AJZMQom:AJZNtiY:AJZThGo:AJZUgrU:AJZVsoa:AJZZGRP:AJZhHhE:AJZiRwG:AJZmkUO:AJZtZiv:AJZwEAB:AJZwHkS:AJaIplC:AJaJjnh: +AJaJmq:AJaRCwS:AJaSWFy:AJaTwIc:AJaYYHm:AJaYzqa:AJagcjM:AJaoQKo:AJaseRF:AJatCDy:AJatPhP:AJbAgqy:AJbCBBZ:AJbGeKy:AJbHgrJ:AJbPjNQ:AJbQpLz: +AJbXCWj:AJbZwiZ:AJbcZEw:AJbdKqb:AJbdXpq:AJbhibT:AJbjHkL:AJbocJt:AJbrQWH:AJbwQkV:AJbyHgx:AJcGgxn:AJcJxuP:AJcQyxj:AJcUHjc:AJcfSeN:AJcffrF: +AJciuUq:AJcjmJS:AJclHnF:AJcrPhy:AJdERGG:AJdIlld:AJdMgXw:AJdUych:AJdasni:AJdexTe:AJdgDLF:AJdjJCy:AJdouuh:AJdurRd:AJdzRCh:AJeBwdA:AJeELmg: +AJeHhQX:AJeLPyy:AJeLyAt:AJeMeqq:AJeVLNi:AJeXbYa:AJeZNzo:AJebBCO:AJebBsG:AJedZFq:AJegtFQ:AJehvRY:AJejZbS:AJelbaE:AJenccB:AJeokvg:AJfDDuY: +AJfKEBU:AJfTPYB:AJfTyaO:AJfdioQ:AJfiMWb:AJflZxd:AJfmCXc:AJfmsOa:AJfnjlS:AJfnyPy:AJftkQW:AJfusNU:AJfzkkX:AJgCoge:AJgEpbQ:AJgGOsP:AJgJQnL: +AJgLgjm:AJgNPKQ:AJgOFXu:AJgPWvz:AJgaWne:AJgfimU:AJgiauR:AJgpdjE:AJgqJvE:AJgvFDI:AJgxQNq:AJhAdij:AJhFtkp:AJhIoGr:AJhKPNc:AJhPXbN:AJhQgJZ: +AJhRSOd:AJhYmhi:AJhZtMz:AJhbKlt:AJhcNBs:AJhefkG:AJhexkY:AJhgJkC:AJhkiMb:AJhvWHW:AJhvdJR:AJhyMqP:AJiECwH:AJiFWFb:AJiGwIx:AJiJujd:AJiMjns: +AJiSEZh:AJiTpYm:AJiXjIw:AJieHGz:AJigCDb:AJigPhK:AJihMIb:AJijIJC:AJinMSB:AJipKBE:AJisOUO:AJivELM:AJiyspB:AJjKCWC:AJjMwis:AJjRzfc:AJjSjNx: +AJjXeKP:AJjZkTS:AJjdQWA:AJjmCdi:AJkKJNx:AJkLSIV:AJkPzfk:AJkjMBG:AJkjztT:AJkoYfE:AJkvecd:AJkvtvV:AJlHyXZ:AJlVzFd:AJlZqvT:AJlcSvV:AJleHNv: +AJlkPHI:AJllRCa:AJlofRv:AJlpMbH:AJlqaxm:AJlsmjc:AJltZXJ:AJluYFJ:AJlylCI:AJlzAeo:AJmBBfO:AJmHSWz:AJmXCJn:AJmbsnw:AJmeBCV:AJmgZFh:AJmjCxA: +AJmjsoC:AJmpdns:AJmsDef:AJmwmGw:AJmzWyK:AJnAhqH:AJnFeQa:AJnGBFf:AJnIaVu:AJnKwDQ:AJnNLMw:AJnQbyq:AJnRClS:AJnRoEe:AJnUQvC:AJnVocU:AJnavrI: +AJncZBC:AJnebAU:AJngcCR:AJnhkVw:AJnjDvK:AJnjVDT:AJnkBSW:AJnlTub:AJnmZfa:AJnuYO:AJnudNZ:AJnzjbz:AJnzpIv:AJoFtmt:AJoKEOI:AJoKrj:AJoagfD: +AJofAHN:AJohEkb:AJohgkG:AJopcjm:AJotGpP:AJotReS:AJpUPka:AJpXtkw:AJphmvI:AJpnEKk:AJpngKN:AJptQqe:AJpzMVl:AJqBaLa:AJqDekR:AJqFnv:AJqOplq: +AJqPBbq:AJqPhH:AJqWruR:AJqxHHq:AJrDtit:AJrKhGb:AJrLsoL:AJrQjiG:AJrXClc:AJraMiR:AJrbHes:AJrgQWz:AJrmQwO:AJrpsPr:AJrsIjs:AJrvZEE:AJrwQSz: +AJryKbu:AJsBJrd:AJsCzfB:AJsEWvV:AJsVlpV:AJsYsBO:AJsfAEi:AJsfNtZ:AJsqZKc:AJsrrrK:AJssIBF:AJsugvD:AJtMqvK:AJtTJnh:AJtTRTM:AJtgZXU:AJtlJMD: +AJtsMbW:AJtszTD:AJtuDbN:AJtzrRr:AJuBGHV:AJuBhvy:AJuFQm:AJuMAUr:AJuSazo:AJuTOcc:AJuUYxZ:AJuWEHP:AJufpip:AJugMwo:AJulWyD:AJurCAz:AJurUKZ: +AJuvTtp:AJvDbyH:AJvGGhi:AJvGhVF:AJvHQvz:AJvIjjf:AJvIlSf:AJvQLeT:AJvQtjQ:AJvSbop:AJvWtSa:AJvaoGk:AJveObx:AJvljbc:AJvlpIo:AJvmcYU:AJvqtfx: +AJvwCaE:AJvwFbb:AJvwUke:AJwGbOo:AJwONzY:AJwQzuu:AJwRVLq:AJwRyYi:AJwSjqH:AJwTrsV:AJwWYJL:AJwcmVk:AJwcuwb:AJwiOln:AJwkrPg:AJwrIUl:AJwwMQU: +AJwyPI:AJwzAiO:AJxCKe:AJxKRZ:AJxNmhw:AJxOtMd:AJxPvMk:AJxUQNE:AJxVgJD:AJxXVlJ:AJxXyyR:AJxYzUN:AJxZrSm:AJxjgFT:AJxkmvP:AJxkuWY:AJxxNBm: +AJyBwRT:AJyFqsZ:AJyIruU:AJyJRgo:AJyNhrJ:AJyQgQu:AJySBbV:AJyULuq:AJyWeku:AJyXgRF:AJycMSl:AJyceQp:AJykHHV:AJylRWT:AJynEjh:AJytKQn:AJyxiBX: +AJyzEaQ:AJzEHG:AJzFgqB:AJzHwrC:AJzKalQ:AJzNrUb:AJzPRGx:AJzRaPq:AJzUwe:AJzfkUK:AJzrRwC:AJztkxg:AJzxeqG:AJzyQzU:AKABNT:AKAHMAr:AKAKhwH: +AKALOrD:AKAOAzt:AKASbcs:AKATojT:AKAUAMv:AKAUliN:AKAUyyu:AKAVtlJ:AKAcWtn:AKAeYhv:AKAgfBA:AKAgvOo:AKAhOwn:AKAoTbR:AKAxnGp:AKBANnl:AKBCWlh: +AKBDoZK:AKBKnTf:AKBMTjq:AKBOiYX:AKBRftu:AKBUsNv:AKBZkIe:AKBayxp:AKBcTAx:AKBjdfy:AKBkmAD:AKBlqeu:AKBrxKc:AKBsNfd:AKBsVVD:AKBsoGp:AKBtcGi: +AKCAngx:AKCCpSz:AKCDdyq:AKCGOOo:AKCHOvR:AKCHPDA:AKCINNU:AKCKWLQ:AKCSlDF:AKCUTJH:AKCWGVP:AKCXfTL:AKCbMwF:AKCeEoL:AKCfXsk:AKCiyXI:AKCkTaA: +AKCoteb:AKCymxs:AKCzMAv:AKDAbBP:AKDDOyR:AKDDrtg:AKDIQYQ:AKDKiaU:AKDLgVr:AKDXAMD:AKDiHDO:AKDjyky:AKDslbQ:AKDtQCN:AKDyexl:AKEDGLj:AKEGKuO: +AKEKXxV:AKELsxe:AKENQyj:AKEQYHp:AKEVbbk:AKEWJZL:AKEcGMZ:AKEcepG:AKEoHdT:AKEpkqK:AKFBqgH:AKFHFYm:AKFPAfW:AKFQwnW:AKFTAun:AKFUxuP:AKFXXwP: +AKFZGiz:AKFcwGS:AKFlYYx:AKFqAOr:AKFrOiz:AKFrwpE:AKGBeaQ:AKGCRfO:AKGHztY:AKGJqGw:AKGKneo:AKGPGDJ:AKGSlmy:AKGWrVs:AKGXrVS:AKGdbdQ:AKGfakN: +AKGluan:AKGmSY:AKGnurV:AKGoVam:AKGwAoM:AKHBAmT:AKHBlIl:AKHByYW:AKHGMjP:AKHGwtF:AKHIHQg:AKHNgqg:AKHbCtY:AKHcOWL:AKHgFod:AKHmkCy:AKHnvuc: +AKHpIuS:AKHpcRM:AKHwkjd:AKHzDIf:AKHzxqO:AKIBDoN:AKIFbcJ:AKIMMJK:AKIPpUg:AKIXSUL:AKIZSUb:AKIZipg:AKIZmtV:AKIZyPh:AKIaTbK:AKIbGRW:AKIdJLf: +AKIgCTb:AKIhCTB:AKIlYuE:AKIsvUX:AKIyfBX:AKIyvOv:AKJBawm:AKJGlMJ:AKJLIHz:AKJNMAM:AKJPFEY:AKJXUCy:AKJcHOe:AKJcJpJ:AKJclGW:AKJdxKd:AKJtHOE: +AKJtJpj:AKJtlGw:AKKHFQW:AKKRJPu:AKKSkiu:AKKXGVy:AKKbIvB:AKKcdFi:AKKdlAP:AKKeqEe:AKKfTPP:AKKvxgK:AKLIEuv:AKLJFTJ:AKLORVt:AKLOrqa:AKLYOOv: +AKLZiTH:AKLfbAd:AKLhlWX:AKLuQbq:AKLyYOO:AKMAcwP:AKMBbBE:AKMGGLA:AKMHkXp:AKMQAmt:AKMUgvB:AKMWEvO:AKMWfbm:AKMWjrI:AKMWomJ:AKMZInP:AKMjlBa: +AKMjxeL:AKMsyKI:AKMwccM:AKNCAfN:AKNDrvU:AKNGAuw:AKNKFYt:AKNTszM:AKNUxze:AKNdAOk:AKNeOic:AKNhHTZ:AKNnHYo:AKNoYYa:AKNqaKh:AKNvvyY:AKNxuKG: +AKOAGbS:AKOGwlu:AKOIAFG:AKORuCx:AKOUVMZ:AKOYzsb:AKOcGPU:AKOfWir:AKOkOIj:AKOkwPU:AKOnHtS:AKOuYyh:AKOxiXV:AKPACAH:AKPDSuN:AKPFiPe:AKPFmTT: +AKPFypj:AKPTsGA:AKPbcrI:AKPfMMC:AKPqQPx:AKPsepq:AKPtuAk:AKPvngk:AKPwIjE:AKPyhIm:AKQDzbQ:AKQLKPu:AKQLSUi:AKQLipl:AKQLyPc:AKQMqDr:AKQOHAJ: +AKQTUyU:AKQcMLr:AKQjYhD:AKQoIg:AKQpLsX:AKQqqfV:AKQwQpq:AKQyePx:AKRCknp:AKRDGvw:AKREawt:AKRFDvf:AKRMuyj:AKRNAvR:AKRPlda:AKRPnTx:AKRSyVu: +AKRTOoH:AKRUbtg:AKRVJfL:AKRXWlv:AKRfYY:AKRhNfz:AKRhVVZ:AKRhoGn:AKRltEE:AKRmKnq:AKRpmAZ:AKRrEOk:AKRxTAf:AKRzTPj:AKSAsnA:AKSEJPR:AKSKFQp: +AKSQUci:AKSVkhl:AKSXejX:AKSYFeI:AKShGFo:AKSjikl:AKSoMAX:AKSwlAw:AKTDSjg:AKTIQvr:AKTLWqB:AKTMiTo:AKTNbKY:AKTNxsp:AKTRkYz:AKTYHuo:AKTaLpc: +AKTmvlB:AKTxbAc:AKTyNuO:AKTzbUG:AKTziTs:AKUDAmm:AKUEeac:AKUKbby:AKUMInI:AKUOQVE:AKUROof:AKUalwH:AKUdeXe:AKUekqY:AKUnQBa:AKVDsdk:AKVETcU: +AKVHxzN:AKVLsqd:AKVNtQf:AKVOGih:AKVXUZA:AKVXkyH:AKVXoPA:AKVdixT:AKVemHF:AKVhwGA:AKVqNdu:AKVteuj:AKVtuTH:AKWDXWy:AKWHuOj:AKWLRnf:AKWMqGA: +AKWPMUJ:AKWPfLt:AKWPvpv:AKWUeag:AKWVhhe:AKWdhG:AKWhFh:AKWmwgz:AKWqNsr:AKXCcB:AKXJbkZ:AKXLStM:AKXPZmq:AKXXMaf:AKXaHTP:AKXaiCR:AKXdQPW: +AKXisks:AKXnqFp:AKXsWTz:AKXuYHb:AKXwfbU:AKXxOWz:AKYEpUu:AKYGUyL:AKYMsgQ:AKYOKPl:AKYOSUp:AKYOipu:AKYOmtD:AKYOyPz:AKYWzbH:AKYZCaX:AKYiHto: +AKYiicm:AKYjQph:AKYlePa:AKYnNGN:AKYqsKL:AKYsLsA:AKYxvUJ:AKZAYvY:AKZCkHN:AKZEFEK:AKZQnGt:AKZSpsv:AKZWOoc:AKZXPdM:AKZXyJp:AKZYNnY:AKZdZpp: +AKZgwOL:AKZjQvr:AKZkiNo:AKZmTPA:AKZpdNv:AKZpjoW:AKZrMWJ:AKZswiw:AKZvXSg:AKZyyxE:AKaBqDd:AKaIZMa:AKaLYwi:AKaSbKJ:AKaWcix:AKaXAzp:AKacIJz: +AKaehiR:AKalcRv:AKapScj:AKaxGRj:AKayTbv:AKbAKJO:AKbEpso:AKbHudy:AKbJYwj:AKbMWlD:AKbVknB:AKbXFqK:AKbaIfb:AKbcdNO:AKbcjon:AKbdiCO:AKbeMWs: +AKbfGft:AKbgZpI:AKbgcdy:AKbhwOu:AKbjDyX:AKbmQvK:AKbnpmE:AKbsdfu:AKbtlaL:AKbuqey:AKbvTpL:AKbwIaa:AKcBWLm:AKcFKjf:AKcHngD:AKcJpSF:AKcLTJt: +AKcMejj:AKcWuYq:AKcZlDz:AKcZntc:AKcdTpq:AKcgIFk:AKcidnF:AKcijOg:AKcjwIG:AKckMwz:AKcmcDp:AKcrNFa:AKcrVvA:AKcrogu:AKcsQVB:AKczmaA:AKdMXXa: +AKdOsXr:AKdQcWl:AKdVmDM:AKdkiEl:AKdrQVM:AKeBfIE:AKeDHUv:AKeJiAR:AKeXQyV:AKeZbBr:AKecQcI:AKeflwf:AKemccz:AKeqieg:AKetMKZ:AKexHdH:AKfCuWt: +AKfFlMJ:AKfQGBO:AKfWwLi:AKffNdK:AKfjmHx:AKfsGpI:AKfsutb:AKfvWIn:AKgDaCM:AKgKuwC:AKgNCZi:AKgNeOk:AKgrwgh:AKguuaj:AKhBHQc:AKhEDOQ:AKhPhWN: +AKhQHB:AKhTzBe:AKhdGrh:AKhgJly:AKhlfbG:AKhlvoi:AKhmOWh:AKhxWTh:AKhyIuW:AKhycRI:AKhzYHp:AKiFMJO:AKiFwTY:AKiHHqx:AKiKAzI:AKiQAMK:AKiQlis: +AKiQyyH:AKibOwS:AKicvOR:AKikGRS:AKiqCTF:AKisScS:AKjDAvO:AKjITjR:AKjPlMN:AKjQsNU:AKjUJpF:AKjbKnL:AKjctEx:AKjhTpC:AKjziKx:AKkBiyd:AKkCNNp: +AKkDOvw:AKkDPDd:AKkDyjY:AKkKYVp:AKkTfTi:AKkWsnj:AKkbXsN:AKkcyXl:AKkdmxv:AKkeTad:AKkhXSA:AKkqwoe:AKkuinF:AKkvcgu:AKlCQYt:AKlHgVW:AKlIGlt: +AKlNAif:AKlTAMa:AKlUeAo:AKlcHDj:AKlhGmD:AKlhePY:AKljcCX:AKlqlWD:AKltexi:AKlukQU:AKmFOYn:AKmKYHW:AKmNRvq:AKmNrQd:AKmXEUs:AKmvzGZ:AKnCXwU: +AKnGuoF:AKnKwnr:AKnTXwu:AKnXuof:AKneHYS:AKnkAOW:AKoBsZh:AKoDrKf:AKoGneL:AKoJFyq:AKoOlmZ:AKoQwlY:AKoRAFK:AKoSwNK:AKoVAUr:AKoWxUL:AKomHyj: +AKonYyd:AKosAon:AKotOIf:AKotwPY:AKpCMjm:AKpDcIC:AKpEHQZ:AKpMSuJ:AKpUpua:AKpWUYX:AKpikCD:AKpjFG:AKppIjA:AKprhIi:AKpyiCy:AKqIMJd:AKqIwTr: +AKqKHqS:AKqMzbU:AKqPCaE:AKqdNGS:AKqeScX:AKqmFvv:AKqunGf:AKqvIJH:AKrClMW:AKrDsNL:AKrHIHg:AKrJMAP:AKrNudO:AKrWAvV:AKrahYV:AKrkTpZ:AKrpHOX: +AKrpJpw:AKrplGj:AKrqMau:AKrsXsg:AKruZdv:AKrukKs:AKruzxW:AKsCGVz:AKsDaWy:AKsEDVk:AKsNIhn:AKsRyvx:AKsTbTj:AKsfxkp:AKtAbfn:AKtGbbO:AKtKim: +AKtLyTn:AKtMKUn:AKtOGYD:AKtURpZ:AKtUWqF:AKtbbAG:AKtdbUc:AKtdiTW:AKtnBcZ:AKtsYOl:AKtzLpg:AKuCJZb:AKuEfIw:AKuMbkR:AKuQkyq:AKuUGyK:AKuXQVy: +AKubmf:AKucqrj:AKugNUd:AKuhboF:AKuibuL:AKuiitx:AKuktcB:AKuszVb:AKvMsdg:AKvQxzB:AKvWucv:AKvXuWf:AKvaOiD:AKvkYYF:AKvmixX:AKvrqde:AKvvIXu: +AKvvOWk:AKwDAFB:AKwEwNB:AKwNGIo:AKwTTCR:AKwURnz:AKwUzsG:AKwWOYI:AKwWrKO:AKwYMUV:AKwYfLh:AKwYvpj:AKwZfL:AKwgOIO:AKwgwPp:AKwpNDr:AKwqYyM: +AKwtmhA:AKwzjQv:AKxEhWp:AKxPpi:AKxRqdx:AKxnuAH:AKxoepR:AKxsIjf:AKxuhIN:AKyCYwb:AKyIbKa:AKyKHAW:AKyVsgU:AKyZqDO:AKybvUn:AKymqfK:AKysQpl: +AKyuePe:AKyyIJQ:AKzBDvI:AKzUEmO:AKzccGX:AKzhtEj:AKzidfH:AKzkqeD:AKzoiKj:AKzydNr:AKzyjoS:ALABBCA:ALAJUNL:ALAPKYV:ALAQBKG:ALAQDnP:ALAUoas: +ALAaCSm:ALAbcWo:ALAfOph:ALAgFic:ALAixDE:ALAjZOU:ALAjzSt:ALAqXpc:ALAqdlc:ALAsxdJ:ALAuMor:ALBGDiD:ALBJJEx:ALBLKoa:ALBUaZe:ALBYGAS:ALBZYCU: +ALBbHir:ALBdhSn:ALBkGWt:ALBmbLZ:ALBnLup:ALBpBXr:ALBpeIK:ALBsYlL:ALBuEom:ALCBFHF:ALCCKOX:ALCGoNj:ALCMIVM:ALCYeBw:ALCZfcK:ALCaCtE:ALCeIrX: +ALCjqay:ALCoLjB:ALCqGwm:ALCsblC:ALCtOLf:ALCvBve:ALDAmHf:ALDCjhw:ALDDfNl:ALDEUti:ALDHvzK:ALDLaQ:ALDLaqV:ALDiQWf:ALDlaXS:ALDoWgd:ALDphCb: +ALDtHLB:ALDvhNW:ALDxnsf:ALDyyNY:ALEBEXH:ALEBcMJ:ALECSMl:ALEEoNd:ALELgSM:ALEPvZr:ALESaQO:ALETRAT:ALEWaBv:ALEcULv:ALEhQSC:ALEodjX:ALEtaxj: +ALFaMlY:ALFhUwk:ALFhfAc:ALFlwCM:ALFnBHK:ALFpbUD:ALFtlDI:ALFuQQG:ALFzITe:ALFzhCg:ALGHQSZ:ALGLPBd:ALGQcvI:ALGTsBO:ALGVIgd:ALGVMcU:ALGVYGk: +ALGVsBa:ALGdcCA:ALGrCEH:ALGvmzB:ALHDLZk:ALHKKyH:ALHLfRX:ALHTuTx:ALHUUnR:ALHbmvI:ALHpdnr:ALHqCPO:ALHrHNj:ALHtPzo:ALHxiAt:ALHzLvf:ALIJLzR: +ALISKYq:ALITgAv:ALIVdAg:ALIcgQG:ALIxOpo:ALJBhbW:ALJDSKH:ALJEYjo:ALJPgNX:ALJVrgF:ALJVwfZ:ALJXBuS:ALJbnbw:ALJeICK:ALJfTTQ:ALKDkbe:ALKHBQe: +ALKKdLc:ALKVgnO:ALKfEqx:ALKiBxB:ALKqlGl:ALLDabT:ALLGfNw:ALLHhJY:ALLKvzP:ALLLUxy:ALLPZDH:ALLPrYu:ALLTVGe:ALLTmbY:ALLVSfl:ALLWIKs:ALLWgUY: +ALLXTFn:ALLchCy:ALLjYLb:ALLsQsa:ALLuSir:ALMEaQF:ALMFWYF:ALMNwLs:ALMTSSh:ALMUtTV:ALMXXMM:ALMZmhv:ALMbynI:ALMeLWO:ALMhWGt:ALMrQwv:ALMtIOW: +ALMxWpB:ALNaVxs:ALNoUVL:ALNpEgV:ALNqoHD:ALNrnpy:ALOBGFv:ALOKsCj:ALOaKth:ALOaeJj:ALOdwIt:ALOmGKN:ALOmLwt:ALOqItU:ALOqhcW:ALOtqgP:ALOvEGY: +ALOwohK:ALPKaaq:ALPSdaE:ALPVezC:ALPbMOW:ALPiTRf:ALPnCsH:ALPnzgx:ALPtFIF:ALPtqaz:ALPxiqS:ALQBXcL:ALQFUSc:ALQGZHt:ALQMuth:ALQQyAZ:ALQRqiw: +ALQUfrH:ALQYlhi:ALQpDQO:ALQrQRC:ALQtCSC:ALQtzGs:ALQwWxO:ALQzFiM:ALQzqAq:ALRAkBK:ALRCgNa:ALRDqaS:ALRIwfc:ALRJEVu:ALRLRfG:ALRLrAR:ALRUhbn: +ALRWSKq:ALRbquW:ALRfyXi:ALRpVlc:ALRtZpy:ALSAXDX:ALSCMsW:ALSDYcB:ALSEKnR:ALSIgnh:ALSOrGv:ALSOwFj:ALSTFuK:ALSTJeo:ALSTOzl:ALSTeai:ALSVKOv: +ALSfbTv:ALSgZAA:ALStCtk:ALSzIlY:ALSzqtX:ALTENRc:ALTFmHt:ALTMLZu:ALTUAtE:ALTfQsH:ALThJfP:ALTiHLP:ALTmnst:ALTwJfp:ALTyiOx:ALTzvVA:ALUEEXz: +ALUEcMx:ALUJoNV:ALUOUTB:ALUddjj:ALUjVNJ:ALUkswV:ALUmndq:ALUnDrz:ALUsBsd:ALVASPo:ALVCIGK:ALVCMCz:ALVCYgD:ALVCkgR:ALVCsbN:ALVKZUv:ALVXyYJ: +ALVYnWV:ALViLHM:ALViXfx:ALVjGkh:ALVjLWR:ALVoCEz:ALVoibd:ALVxfxS:ALVymoF:ALWaQqh:ALWdItJ:ALWdhcH:ALWgqgO:ALWiEGF:ALWrUWD:ALWrfaL:ALWvwcb: +ALWwwIk:ALWxBhd:ALWzstb:ALXCUsA:ALXHezJ:ALXIckO:ALXRBcM:ALXaivy:ALXcUtk:ALXdYod:ALXftVl:ALXgHNx:ALXkiqz:ALXmDYW:ALXmJxv:ALXqCsa:ALXqzgQ: +ALXrWz:ALXrcwc:ALXvOPd:ALXvnqp:ALXvvAP:ALXwFIo:ALXwqaS:ALXyxdI:ALXzZoY:ALXzzsx:ALYELSR:ALYENcK:ALYIInu:ALYNcKv:ALYUPDn:ALYXUSx:ALYkMog: +ALYqiQc:ALYsDyN:ALYsJXo:ALYtItN:ALYvgQu:ALYwCSx:ALYwzGH:ALYxWxt:ALYzdNY:ALZHdlF:ALZJaZP:ALZMBua:ALZRFhJ:ALZSKoT:ALZWRcS:ALZWonf:ALZaSuK: +ALZaZgW:ALZfqTZ:ALZiYlY:ALZkEox:ALZqCTI:ALZuIRT:ALZzqAu:ALaJgAm:ALaTaAH:ALaZZHF:ALaatgP:ALagItg:ALaiexQ:ALaiikJ:ALapxDy:ALarkYK:ALaxsjr: +ALaxtGD:ALaxxjK:ALbARfU:ALbDTIQ:ALbDZws:ALbIRcj:ALbLSOS:ALbNDJp:ALbNLJF:ALbbLJW:ALbdGWx:ALbfbLV:ALbhIRM:ALbmqAl:ALbvVlQ:ALbyeIG:ALbzZpK: +ALcDfcw:ALcFDIA:ALcGGav:ALcIFuY:ALcLFHz:ALcQSoz:ALcSDjY:ALcSLjo:ALcSqnu:ALcXGaV:ALcYTix:ALcYZWZ:ALcbSN:ALcjGwq:ALcnIrD:ALcqHIw:ALcshsk: +ALcxEgX:ALcxgZE:ALczCtY:ALdCSsT:ALdFSmY:ALdGXmq:ALdMIKd:ALdMgUN:ALdUSi:ALdUaqZ:ALdVWyZ:ALdYabc:ALdmnBa:ALdoUcc:ALdoggH:ALdryNU:ALduLwS: +ALdxWgh:ALeASFR:ALeBTwY:ALeBjHr:ALeCTfP:ALeDUTl:ALeKZdv:ALeKryK:ALeOmBg:ALePmhc:ALeShjg:ALeWUXG:ALecioo:ALehQwc:ALejIOB:ALemVNd:ALesHlG: +ALeuhnR:ALfMWcc:ALfOhFB:ALfRGfB:ALfatUu:ALfhnpB:ALfmfxA:ALfnmoT:ALfsVbf:ALfwBHO:ALfyFuf:ALfyVxH:ALgByya:ALgFamj:ALgHilR:ALgJBtm:ALgLYnk: +ALgLaZh:ALgSWCz:ALgftuL:ALgggEP:ALgmcCE:ALgostP:ALgtQqZ:ALgyKtE:ALgyeJG:ALhAaan:ALhBNCd:ALhFffE:ALhIdaZ:ALhLSYt:ALhMLZo:ALhRXCX:ALhRmVh: +ALhVUsw:ALhbMVF:ALhjCPK:ALhtivO:ALiCutE:ALiJLSD:ALiKfre:ALiSLzV:ALiTSyM:ALiZXca:ALiZmvQ:ALibOpK:ALimWxb:ALioLpK:ALiohxy:ALiojGV:ALiqHnW: +ALjBBuw:ALjHKoB:ALjKhbS:ALjMSKL:ALjOfCQ:ALjQXdl:ALjSMSc:ALjUKNf:ALjZiYb:ALjjLuS:ALjknbs:ALjoTTU:ALjwZau:ALkBxoP:ALkELjv:ALkEqnl:ALkGIVh: +ALkQBQi:ALkTYJt:ALkWBUH:ALkdHIN:ALkfhsR:ALkmQeb:ALkoEqt:ALktBbd:ALktIcP:ALlHWyQ:ALlKXbv:ALlUExv:ALlUcmt:ALlXSmR:ALlZonZ:ALlcnsa:ALlhaXt: +ALlmUEo:ALlpvVT:ALlrhNp:ALltdJf:ALlzVnF:ALmBVgB:ALmFfnp:ALmJvZW:ALmNaQJ:ALmVIkt:ALmZXK:ALmiYle:ALmnaxO:ALmqWGx:ALmtSIu:ALnBzzE:ALnJdw: +ALnOhvx:ALndejy:ALngCeR:ALnjbUg:ALnjmZx:ALnnlDj:ALnqQQd:ALnqRv:ALntITF:ALnthCD:ALnwqGC:ALnxUVP:ALnyEgJ:ALnzNpP:ALoEyyH:ALoLcvD:ALoM: +ALocMLm:ALojVBV:ALomwIp:ALopohO:ALoqnPr:ALpEXCC:ALpEmVs:ALpULsf:ALpYINA:ALphgqA:ALppPzp:ALpyxDk:ALqIcwV:ALqIjGw:ALqRdAJ:ALqaMoX:ALqmsjd: +ALqmtGR:ALqxTri:ALqyDQK:ALrBPkE:ALrBjhE:ALrEUW:ALrLgNe:ALrQICJ:ALrRwfg:ALrWYCO:ALrZkBO:ALraEoW:ALrbTTl:ALreEGg:ALregzz:ALrkquS:ALrpyXM: +ALrvlgf:ALsBRnJ:ALsDBQF:ALsGPKl:ALsGjHl:ALsIEvx:ALsKRFJ:ALsQiyR:ALsRgnl:ALsWIcC:ALsXrGr:ALsXwFn:ALsdBxA:ALsdeix:ALspbTR:ALsqqUZ:ALsuyxd: +ALszKfb:ALtHExo:ALtHcmm:ALtJZCy:ALtMQpw:ALtOmHx:ALtUEVQ:ALtVrQO:ALtfBSq:ALtmWPL:ALtnUVN:ALtnsWC:ALtpDRO:ALtqnDD:ALtzbIz:ALtzlKq:ALuLLzp: +ALuQtTq:ALuTNrf:ALuaLWh:ALuehcU:ALuhHlU:ALulnSq:ALuvJFu:ALuyvvD:ALvJSPc:ALvRPbG:ALvUKlj:ALvUSd:ALvZsbl:ALvbLHA:ALvbXft:ALvcmoj:ALvfZQq: +ALvkUVi:ALvmmZA:ALvnyBe:ALvwKTB:ALwBIgN:ALwBYGA:ALwBkGW:ALwBsBK:ALwGsCI:ALwJunw:ALwPSpj:ALwXnwS:ALwZZus:ALwhLhH:ALwiGKm:ALwiLwW:ALwlZqx: +ALwsohh:ALwxmOC:ALxDUnd:ALxRckK:ALxVNPq:ALxVWKC:ALxeiAB:ALxgQrE:ALxjCse:ALxjzgU:ALxmdnD:ALxpFIk:ALxpqaW:ALxqtGd:ALxvDYS:ALxvJxr:ALxwITS: +ALxyeXe:ALyEHWg:ALyHnlS:ALyOBKv:ALyODna:ALyQBCP:ALySoaB:ALySpSQ:ALyWcKr:ALyXcKR:ALybUTv:ALyfHne:ALyiZOD:ALyizSe:ALyjPrM:ALylDQp:ALymMvM: +ALynLVi:ALyoBJM:ALyoolg:ALypzGL:ALyuOpy:ALyunQm:ALyuvaM:ALyvFir:ALyvqAN:ALyziQg:ALzDICa:ALzEDLy:ALzFgU:ALzSaZT:ALzTfCc:ALzVDiU:ALzWGAb: +ALzYFUM:ALzYJEi:ALzYOZj:ALzYeAo:ALzbRJo:ALzkbtp:ALzlVlL:ALzmLua:ALzmXRL:ALznOlN:ALzpZpV:ALzxLJJ:ALzzGWe:AMAGFWS:AMASYaN:AMATSxe:AMAeAxR: +AMAgogU:AMAlNjr:AMAnrah:AMAqViI:AMAwrQw:AMAzuZU:AMBDPZn:AMBOHZe:AMBTeiW:AMBYHWd:AMBbNfp:AMBhYbN:AMBncTx:AMBtFeu:AMBuuTp:AMBvpXs:AMBxchi: +AMBxzIR:AMByywN:AMCEGzi:AMCGxEK:AMCKwrm:AMCLPzU:AMCXxEk:AMCYFrF:AMCYPjB:AMCYTfD:AMCefPW:AMCgfdn:AMCnNsq:AMCpKkD:AMCvaYv:AMCwFbE:AMDBzPB: +AMDEFps:AMDKNVY:AMDMvzY:AMDPFED:AMDUyoV:AMDYPeP:AMDdBHl:AMDdXzx:AMDgQgA:AMDjujm:AMDmbcw:AMDsKRU:AMDwQb:AMDwuQc:AMDxREy:AMEAAoc:AMEHrXM: +AMEHxCb:AMEJbcZ:AMELlpl:AMEOMCf:AMESnGE:AMEZoDt:AMEbYuJ:AMEeIQe:AMEeVbL:AMEfiBj:AMEouJR:AMFBHTk:AMFDQUJ:AMFDaeR:AMFHAGS:AMFRgfw:AMFXsBY: +AMFdbSL:AMFeGtU:AMFgVqw:AMFkCqb:AMFoXSV:AMFuXLt:AMFyeDo:AMGFLww:AMGMKRl:AMGNoyf:AMGPfMg:AMGTvPD:AMGVZQu:AMGZRcL:AMGZijI:AMGazGy:AMGbySe: +AMGcQXL:AMGdIzI:AMGdpeS:AMGgNaw:AMGjWAa:AMGlIMd:AMGnHMZ:AMGpLmV:AMGsCQY:AMGtJiZ:AMGtjyy:AMGtyiL:AMHLXTg:AMHQLMj:AMHdBVJ:AMHhNtr:AMHkrAV: +AMHmFOi:AMHtME:AMHxYIy:AMHzlig:AMIIUoU:AMIJPij:AMILYoP:AMILeRD:AMIMJSb:AMIOuRB:AMIOwtt:AMIQXnQ:AMIWLms:AMIXLwT:AMIamiV:AMIfzDJ:AMIgjUG: +AMIluZR:AMImozJ:AMIsyvG:AMItJiU:AMIwOFD:AMIwPwL:AMIyMAE:AMJAypy:AMJGPZw:AMJQuE:AMJXSTA:AMJbfpu:AMJcgPx:AMJeNfi:AMJfynP:AMJhFeL:AMJqYGg: +AMJqtQj:AMKDrpP:AMKFWvo:AMKLLVa:AMKPLw:AMKVBYZ:AMKbdhc:AMKfGSv:AMKhHrH:AMKigpq:AMKilYu:AMKopxc:AMKrQeo:AMKvVaK:AMKwcth:AMKyWxR:AMKzFBt: +AMKzxgF:AMLAJwb:AMLBUoq:AMLCifc:AMLFodr:AMLKMgO:AMLNABD:AMLShKR:AMLTifC:AMLWlPJ:AMLahPJ:AMLcqOU:AMLeyVQ:AMLfKRl:AMLgSKs:AMLhZmg:AMLnFuO: +AMMBMCI:AMMNyOf:AMMOPVI:AMMQMGF:AMMVvZi:AMMWUOX:AMMgggu:AMMhlBZ:AMMiWfl:AMMjFPZ:AMMkTk:AMMkyvX:AMMmSkz:AMMnZMn:AMMpuqS:AMMtSJy:AMNCZqW: +AMNESM:AMNKoYD:AMNMRZD:AMNOKdp:AMNUSUM:AMNUjoz:AMNcXSo:AMNglnV:AMNgxVE:AMNmKr:AMNmLMt:AMNoDgD:AMNpboJ:AMNqJIx:AMNqyIn:AMNrtRh:AMNxqPn: +AMOFcMz:AMOGQnV:AMOJKmm:AMONUQs:AMOQAgC:AMOZSud:AMOZjOS:AMOaVQG:AMOeCQR:AMOgIzb:AMOgpex:AMOrTng:AMOraRn:AMOvbOC:AMPIYOr:AMPIerf:AMPPYAk: +AMPQjon:AMPWKRz:AMPaCtf:AMPbocj:AMPgBVq:AMPkNtI:AMPqesC:AMPseiF:AMPtrqR:AMPweqU:AMPwpfP:AMQLaNs:AMQMPiC:AMQOYoy:AMQOeRm:AMQPnWC:AMQaTdm: +AMQaajB:AMQeyvN:AMQfCTM:AMQgPbi:AMQpbmI:AMQqNTB:AMQrSbY:AMQxzDC:AMRRXVF:AMRRuwu:AMRXAEQ:AMRZeii:AMRfFbz:AMRfxGH:AMRiZdx:AMRkKTC:AMRkmoh: +AMRoFQc:AMRpiHx:AMRqqPQ:AMRuAcV:AMRxynW:AMRzEvQ:AMSIcsW:AMSNGCk:AMSOOKI:AMSXXvQ:AMSXuWb:AMSaeIU:AMSbpxZ:AMSdyWG:AMSlFBm:AMSqKtT:AMSuihO: +AMSvENB:AMTEhKY:AMTFpjO:AMTIVqW:AMTJMSp:AMTJaAz:AMTKezH:AMTOMWp:AMTSyHQ:AMTTRoI:AMTUzPp:AMTVFHT:AMTVxlQ:AMTXIsb:AMTYDER:AMTclbx:AMTeFpx: +AMTfWFN:AMTkCnh:AMTkwNt:AMTrVLh:AMTslXC:AMTuzBH:AMUJJWr:AMUQVQl:AMUSIQG:AMUSeZs:AMUWAbT:AMUZROr:AMUcuqJ:AMUjhpZ:AMUklBC:AMUlqoE:AMUmFPC: +AMUreMK:AMUsCNS:AMUswnO:AMVAgvk:AMVFCZF:AMVFdrO:AMVLC:AMVLLsL:AMVMsBO:AMVVgQM:AMVdUjI:AMVetRG:AMVfeQT:AMVjFqa:AMVkqPA:AMVpDjw:AMVsboe: +AMWBGIQ:AMWDqRe:AMWEfMU:AMWGJVB:AMWIvPv:AMWLjOJ:AMWOTe:AMWTeyo:AMWVgVT:AMWYRik:AMWZKdm:AMWbkzT:AMWcHMh:AMWevUA:AMWfonm:AMWjUJV:AMWleqK: +AMWmkb:AMWrLGD:AMWslTd:AMWuaRW:AMWyyoo:AMXJWwr:AMXLdgI:AMXNGfL:AMXWBFs:AMXdjul:AMXoliU:AMXwoGY:AMYDuRP:AMYDwtf:AMYIKp:AMYTdGp:AMYVGFu: +AMYYXGr:AMYZlqs:AMYdYiR:AMZGuJQ:AMZIBtJ:AMZUGZe:AMZWxeG:AMZaFQj:AMZbegX:AMZfYGI:AMZftQD:AMZgKKK:AMZiahW:AMZkJAA:AMZoPYf:AMZpjV:AMZrFXr: +AMZwfDb:AMaEnWQ:AMaLlqz:AMaSWWb:AMaWNnd:AMaXFL:AMacozq:AMadyJX:AMagSbK:AMapogI:AMaqmkl:AMarnWG:AMawmim:AMbGcSR:AMbTrPL:AMbVWVs:AMbbchE: +AMbgwqX:AMbqYbB:AMbvGsj:AMbxHRT:AMbygPm:AMbylyi:AMcHTeQ:AMcLBYM:AMcLkb:AMcNHzb:AMcOQL:AMcZuwy:AMcepxt:AMcgcHn:AMcgziU:AMcpFby:AMcsFEr: +AMctutw:AMcwYBI:AMdAYwc:AMdDABq:AMdFngV:AMdGXZi:AMdHyHO:AMdNyYs:AMdOVqi:AMdPIqb:AMdPezV:AMdRMcu:AMdaPdZ:AMdcGTl:AMdgVLv:AMdiIqV:AMdiQOL: +AMdjzBV:AMdmXzt:AMdpCnv:AMdpwNj:AMdsuja:AMdtcv:AMdufcW:AMdxlbf:AMdzFpf:AMeAzpY:AMeFnIh:AMeGYWt:AMeJNvB:AMeKGMb:AMeLvZB:AMeMKmv:AMePpJf: +AMeTFPh:AMeUJDu:AMeWvXk:AMefPDm:AMekrBQ:AMelbCl:AMeulzx:AMevQGZ:AMfJyY:AMfRpek:AMfVcmn:AMfWQNB:AMfZKMy:AMfceDK:AMfdysz:AMfeDjE:AMfnGtQ: +AMfqVqS:AMfuCqF:AMfwIZv:AMfwpEl:AMfzNbj:AMgAgFH:AMgHkMz:AMgKgVB:AMgQHtT:AMgSQuu:AMgSaEm:AMgVKRh:AMgZeyY:AMgsWAe:AMhBIAH:AMhCGfZ:AMhDXNL: +AMhIosz:AMhLUOH:AMhZLMn:AMhZRQ:AMhieiy:AMhjjuZ:AMhkrqM:AMhlloL:AMhqTDY:AMhqaJv:AMhuyVz:AMhvFOm:AMhwJIH:AMhxiNy:AMhxjdx:AMhzocU:AMiBwQQ: +AMiPSxF:AMiWIaq:AMijraK:AMilViJ:AMiylIz:AMjBFZE:AMjPeir:AMjSTEs:AMjdYbk:AMjiDDE:AMjouTU:AMjqeiY:AMjrpXV:AMjtywK:AMkCxEl:AMkFPzr:AMkGwrJ: +AMkLuwB:AMkOWvc:AMkafPp:AMkblYy:AMkdNFl:AMkeyNU:AMkgZDZ:AMkjYBR:AMkpYgb:AMkptqo:AMksFbb:AMkwutl:AMlAlPv:AMlFjhZ:AMlMrxW:AMlMxcx:AMlOodn: +AMlgYUP:AMlibcR:AMlkibp:AMlnyVM:AMlpSKo:AMlsuQF:AMlzhPV:AMmBRlY:AMmBiFf:AMmFVQY:AMmGyyC:AMmKMCE:AMmMAbA:AMmOnGf:AMmRhkW:AMmUoDw:AMmWyOj: +AMmYPVe:AMmZMGJ:AMmbqoP:AMmcZOG:AMmkhVA:AMmmFUJ:AMmtyvT:AMmuKri:AMmvSkv:AMnFBRP:AMnLeWT:AMnPYEM:AMnUfma:AMnWJvv:AMnYvpB:AMnaImb:AMnbGth: +AMngmtY:AMngysc:AMniIZO:AMnipEU:AMnmKps:AMnqXLi:AMnuvuu:AMnxrNf:AMnxtLC:AMoBLwX:AMoFaEF:AMoJoyI:AMoLRzI:AMoRZQZ:AMoSKmi:AMoTGrq:AMoUYed: +AMoWUQw:AMoXf:AMoZsbM:AMoeWAn:AMofbsX:AMogGTA:AMohGTa:AMokkSo:AMolLmy:AMommTP:AMomySj:AMonDGI:AMopJiu:AMopjyV:AMopyic:AMoqUzc:AMorXsb: +AMovxvH:AMoxcdq:AMpHXTX:AMpNLWr:AMpTurD:AMpTwTr:AMpcYIf:AMpelix:AMpfpFN:AMpiJIS:AMpiPBF:AMpjCtb:AMplocN:AMpnMaC:AMpquzT:AMptYIF:AMqHeRi: +AMqNXtS:AMqVKru:AMqZYcR:AMqZrA:AMqbzDg:AMqjNTF:AMqoCTI:AMqpCTi:AMqqoCe:AMqsMAh:AMqveQZ:AMqzTdi:AMqzajF:AMrRSTb:AMrSOkz:AMrSWeM:AMraNfJ: +AMrjVAa:AMrmHRB:AMruoAx:AMrxegu:AMryFQG:AMrzqPU:AMsCyPU:AMsWAeZ:AMsYeIb:AMsegpT:AMselYP:AMsgNFE:AMshZDs:AMskpxF:AMslziG:AMssctM:AMsvaHU: +AMsyEVZ:AMszKtH:AMszmOc:AMtFMgH:AMtRJdP:AMtSaAv:AMtTvxN:AMtXGmG:AMtZKMS:AMtayVv:AMtcSKT:AMthYUk:AMtqFJo:AMtxrbt:AMtySjw:AMuEpJH:AMuLMGC: +AMuMPEe:AMuNMww:AMuRyhV:AMuTzpw:AMuUCuA:AMuUIKo:AMuXVQP:AMuZeZO:AMueWfI:AMujuqv:AMupSu:AMurlxD:AMutzbO:AMuzCNo:AMuzwns:AMvFsBC:AMvJAiJ: +AMvKYCQ:AMvOSUn:AMvOjoY:AMvPCZj:AMvPdrc:AMvVAGI:AMvWqrv:AMvXBRW:AMvYSNU:AMvZqLW:AMvdXLN:AMveLgW:AMvfltw:AMviQxm:AMvmUjE:AMvoeQX:AMvsFqm: +AMvukZG:AMvzswu:AMwBcMG:AMwEgqV:AMwFKmP:AMwGRcZ:AMwHHOR:AMwJUQN:AMwLsbT:AMwUdRT:AMwWGCj:AMwdUzZ:AMwoDJl:AMwsUJR:AMwueqO:AMwyFQz:AMwzqpZ: +AMxAPIe:AMxCerK:AMxLjoc:AMxUnwE:AMxXGfh:AMxfTDk:AMxfaJD:AMxmjuh:AMxneiK:AMxsoZe:AMxtyjL:AMyKYof:AMyKeRr:AMyVAOC:AMyYaNL:AMybinR:AMybjDS: +AMycCTr:AMynlIh:AMzBBtN:AMzFdPA:AMzUSTK:AMzXTEe:AMzafDF:AMzfKTN:AMzfmoe:AMzjiHU:AMzqKKo:AMzuJAe:AMzveiO:ANACstA:ANAHvKv:ANAIfAx:ANAMULF: +ANANRKX:ANAOUI:ANAQYkx:ANATsta:ANAWpAv:ANAdfYf:ANAeEeE:ANAgemw:ANAizdJ:ANAkyyV:ANArFkt:ANAsGKy:ANAtwCz:ANAunfZ:ANAvYuQ:ANBGChM:ANBKlMB: +ANBSoGA:ANBTRkS:ANBVwml:ANBbCSZ:ANBbZra:ANBgWJG:ANBozDA:ANBvgHu:ANBxhiK:ANByGkr:ANByLBv:ANCDRcJ:ANCDXxe:ANCFydT:ANCQjlc:ANCRutp:ANCZpma: +ANCiEvZ:ANCqHKK:ANCsQTT:ANCuYMP:ANCvbDF:ANCvkIm:ANCwsPr:ANCxzvf:ANDBxfR:ANDCgVN:ANDDayJ:ANDEkvZ:ANDHYst:ANDNYbH:ANDNgEJ:ANDOVCG:ANDPEAm: +ANDPiJY:ANDRmXN:ANDhLcf:ANDjZym:ANDpWuQ:ANDpcUM:ANEAyXs:ANECTFv:ANEClLT:ANEEhOs:ANEGqNR:ANELFvd:ANENjms:ANEOaIU:ANESzjV:ANEfwzb:ANEgBHT: +ANEigom:ANEkvjO:ANEoYSe:ANEsxHn:ANEwLuW:ANEwXMD:ANFBRGH:ANFDoFm:ANFVCVy:ANFWquU:ANFZkvn:ANFdMOW:ANFdYHm:ANFedQR:ANFlwZi:ANFngOF:ANFoiVL: +ANFqvJD:ANFucJQ:ANFwiaa:ANGDatT:ANGKNlk:ANGSIEy:ANGSdDZ:ANGYEie:ANGYyTq:ANGeVGo:ANGkBVa:ANGmsYq:ANGpIUE:ANGqcoe:ANGrOxi:ANGwbMr:ANHIOHO: +ANHKigl:ANHfEHi:ANHiERL:ANHkRJx:ANHqAqC:ANHuYmO:ANHvcOL:ANHwpyh:ANIJopq:ANIXgxs:ANIZCev:ANIdhII:ANIiUOA:ANImCsx:ANImZRC:ANIvfyu:ANJBfaH: +ANJEoGZ:ANJTUgI:ANJYChV:ANJbzDz:ANJdyYf:ANJjCoP:ANJkfyV:ANJnEEu:ANJoUoX:ANJpGGb:ANJqERT:ANJtYLF:ANKDuty:ANKFcNE:ANKFipk:ANKLpmh:ANKUHPZ: +ANKVPqL:ANKYvjT:ANKZAZy:ANKZmHs:ANKaBxf:ANKcIyD:ANKhYMy:ANKkUJr:ANLFJSW:ANLGnmq:ANLMRCZ:ANLMXXu:ANLZjLs:ANLpspb:ANLsUjK:ANMAofO:ANMDELx: +ANMGkVL:ANMIhtN:ANMKujR:ANMQGml:ANMVDiH:ANMVcAA:ANMaYSl:ANMeuAF:ANMlKAL:ANMpOUu:ANMtuqN:ANMvEJS:ANMzfjf:ANNBObu:ANNDrau:ANNERGs:ANNGoFV: +ANNJzJf:ANNLgiM:ANNRgRP:ANNTQId:ANNUFVT:ANNWjMC:ANNYVKw:ANNaiVW:ANNcPDE:ANNgMOl:ANNgYHV:ANNiiaz:ANNmkKF:ANNnLUg:ANNnXmt:ANNqbdZ:ANNrKaU: +ANNshVi:ANNvOul:ANNzuQW:ANOLUih:ANOMHq:ANORon:ANOTefO:ANOZwls:ANOcIUn:ANOdOxb:ANOfmzo:ANOibMy:ANOmnoA:ANOtJnm:ANPHxoO:ANPNlle:ANPPAUK: +ANPTUIS:ANPTWoe:ANPcyrq:ANPeLRo:ANPijrD:ANPipyQ:ANPjcOu:ANPlOXY:ANPnmZT:ANPqUAC:ANPtyrQ:ANQCCfA:ANQMDKD:ANQPJge:ANQWUQP:ANQYboK:ANQdNFj: +ANQhkPj:ANQmkOK:ANQqAeF:ANQqfJk:ANQvTJE:ANQwkPJ:ANQyAsV:ANRKgas:ANRQWiw:ANRRsoY:ANRSDkS:ANRVJGr:ANRepbp:ANRftfw:ANRhfcd:ANRjvzZ:ANRkABL: +ANRqeMn:ANRrAEC:ANRrgdr:ANRzQkn:ANSFjlq:ANSGutb:ANSHrWO:ANSIHPa:ANSLvjO:ANSSmLH:ANSTxAO:ANShxgQ:ANSnWUl:ANSncup:ANSoEvh:ANSpUqG:ANSqHmW: +ANStvWP:ANSwHKy:ANTSAzi:ANTSmhc:ANTTVCQ:ANTXgVX:ANTZkvL:ANTaYmi:ANTcspK:ANThynt:ANTqfqp:ANTxRYk:ANTysQh:ANUHDiW:ANUJgxi:ANUPbIc:ANURQWc: +ANUSsUa:ANUTyXE:ANUWELG:ANUYBtG:ANUdYTH:ANUguqq:ANUiEJl:ANUmfjY:ANUoKAs:ANUrSlA:ANUsOUJ:ANUtxHa:ANVBDBe:ANVBZYS:ANVDgRY:ANVKyxj:ANVNpfQ: +ANVOJTb:ANVOsnU:ANVVYzT:ANVWQIM:ANVYsun:ANViqCV:ANVjBTR:ANVlTip:ANVoEjc:ANVrQkv:ANVsfJV:ANVyOuE:ANWEyZz:ANWGOht:ANWJatf:ANWKkIK:ANWPtEW: +ANWRnUL:ANWVLJr:ANWYWjf:ANWbsYc:ANWdTdb:ANWruW:ANXAprp:ANXCytJ:ANXEugg:ANXLJTv:ANXUNLP:ANXfAqQ:ANXoVgT:ANXpRJj:ANXptB:ANXsOap:ANXtYQY: +ANXwsyJ:ANYMsOw:ANYNWIY:ANYWCHQ:ANYceud:ANYifyK:ANYmjZY:ANYrCsF:ANZFDkt:ANZPRGk:ANZdAED:ANZdgdu:ANZfMTP:ANZieUm:ANZkSuv:ANZlQki:ANZoaXN: +ANZuPcu:ANZvERz:ANZwCSo:ANZwZrT:ANZxtfp:ANaCUGe:ANaJYkD:ANaNfIy:ANaOErS:ANaRfAD:ANaUogV:ANacNGP:ANaiFkH:ANakwCF:ANalGKE:ANalLbA:ANamYum: +ANannff:ANapSEB:ANarzdv:ANatyyj:ANbBsTF:ANbCUqy:ANbEbOb:ANbVpaq:ANbWWiI:ANbdEEB:ANbfeMp:ANbggdl:ANbhPcl:ANbjYLq:ANbkNgk:ANbnNfC:ANbqFKs: +ANbrLBz:ANbuYUV:ANbvSey:ANbxzDM:ANbzyYQ:ANcCNrW:ANcExFA:ANcGaTX:ANcJOn:ANcMtGY:ANcOydH:ANcPAZL:ANcPmHF:ANcQLKw:ANcegOd:ANcfsqM:ANcgRyN: +ANcnfQU:ANcwyNQ:ANcyBxS:ANdCRCA:ANdCXXn:ANdKxfV:ANdMatO:ANdPjLh:ANdRrwV:ANdStgN:ANdVvJV:ANdWYbL:ANdWgEN:ANdcvmW:ANdmRYY:ANdszTH:ANdxEVQ: +ANeGQWq:ANeHaIQ:ANeICvv:ANePqNV:ANeURgG:ANeVbIQ:ANeWofb:ANefKhG:ANehMox:ANehYhB:ANeixHs:ANeowzf:ANepwzF:ANeqivc:ANergoi:ANesPdq:ANewMoX: +ANewYhb:ANeyiAN:ANfKFVk:ANfLgjT:ANfNaiZ:ANfPquQ:ANfRTfy:ANfZObJ:ANfdnYY:ANfklvZ:ANfnYsj:ANfoJbu:ANfojrV:ANfuwZm:ANfwgOB:ANfxgOb:ANgJyZL: +ANgLOhB:ANgMatP:ANgaRkh:ANgnRju:ANgsyRe:ANgyjRP:ANgypYE:ANgzcoa:ANhCfLx:ANhDWJY:ANhJNLf:ANhOyze:ANhXEIh:ANhZugQ:ANhgRKa:ANhjBvl:ANhoEHm: +ANhtVgb:ANhznOG:ANiBvKS:ANiIogo:ANiLCHC:ANiPlmL:ANiezdo:ANigyys:ANilWjI:ANioLbX:ANivZF:ANivtFK:ANixfCX:ANizvZf:ANjBba:ANjCChj:ANjERGy: +ANjHpaz:ANjIoPt:ANjKfaT:ANjNoGF:ANjOUlj:ANjSYKT:ANjchiL:ANjhUoD:ANjkzDf:ANjlDsG:ANjmyYz:ANjuGkU:ANjuLBQ:ANjwnFv:ANjySeR:ANkCvjx:ANkEEag: +ANkEijS:ANkHJsB:ANkNHPV:ANkbyff:ANkmHKn:ANkoZYg:ANkqYMu:ANkrzvC:ANkssPW:ANkxyNh:ANlAkvy:ANlGBxQ:ANlHLkG:ANlImhv:ANlKVCd:ANlUPQI:ANlZPk: +ANlaShu:ANlazcX:ANlbIYA:ANlezTO:ANlzUjw:ANmGgJv:ANmKqUs:ANmLvEf:ANmPGJn:ANmVSYL:ANmZarE:ANmePdx:ANmjdqT:ANmnxHc:ANmpXep:ANmtbDG:ANmtxWA: +ANmvLox:ANmyqcb:ANnPGMq:ANnRCVF:ANnUGjW:ANnVkvQ:ANnXhTS:ANnZuJO:ANnmKHw:ANnocJn:ANoEyXq:ANoMIEV:ANoMdDu:ANoQpRd:ANoSEiJ:ANoTCFT:ANoUuGs: +ANofnoE:ANojYMI:ANolcoj:ANopmzK:ANovAQE:ANpBJTY:ANpMyxJ:ANpUIem:ANpUddN:ANpbEHt:ANpdERq:ANphbmF:ANprIuQ:ANpscOq:ANqCfIo:ANqCpQk:ANqDWId: +ANqKbdZ:ANqPUQT:ANqRboO:ANqhNGF:ANqhyfV:ANqipBC:ANqtAep:ANqtgDA:ANquGgx:ANqvMtd:ANqvkOO:ANqzIST:ANrAUls:ANrBwmR:ANrEYKM:ANrKpaC:ANrRCFZ: +ANrRbBg:ANrVUqK:ANrXbOP:ANrlERQ:ANrqfch:ANrvkpQ:ANrxASM:ANsFpmO:ANsJaYk:ANsKJsi:ANsTYBi:ANsTgek:ANsXmxo:ANsZaTj:ANsezvh:ANsjFxm:ANsrbSZ: +ANsrxaN:ANsuyfM:ANsxHmk:ANtEjLv:ANtFuTe:ANtHHpf:ANtNpMt:ANtRmlO:ANtWHpF:ANtYBxh:ANtgQtA:ANtibds:ANtikiX:ANtjYme:ANtlspG:ANtmUjn:ANtuLYg: +ANtwfKg:ANtwfU:ANuAgIW:ANuGlhH:ANuHgrj:ANuIrAo:ANuLarB:ANuNrRp:ANuQJtQ:ANuQsNf:ANuQsU:ANuRpFb:ANuTgxU:ANuWgrJ:ANuXlhh:ANuZYZg:ANucXMn: +ANuhKAo:ANuiVnz:ANulOUV:ANuoTIc:ANupuqm:ANurEJp:ANuuQKe:ANuvfjE:ANuxhvs:ANuyAil:ANuytUe:ANvGBTl:ANvGhCv:ANvKDBa:ANvKZYW:ANvOEbc:ANvQQwh: +ANvRsuj:ANvWpfU:ANvXpfu:ANvYgXb:ANvacJg:ANvciaW:ANvnKax:ANvqSLJ:ANvrOuA:ANvsxhj:ANvvuQz:ANvxEjg:ANwBlLC:ANwHiZb:ANwPEEp:ANwQefr:ANwSatb: +ANwUAuM:ANwXTHH:ANwYUiU:ANwYWOc:ANwcmzR:ANwpJnp:ANwrLtf:ANwuNlK:ANwzMRa:ANxJkiF:ANxTyzw:ANxUJTr:ANxVOHy:ANxasyn:ANxbftN:ANxdIuZ:ANxecOz: +ANxfOXv:ANxkbmm:ANxlqFm:ANxonOU:ANxpRzq:ANxrvrp:ANxwERZ:ANxzMpi:ANyIDKy:ANyJJgX:ANyRstR:ANySUQm:ANyUbov:ANyZhLO:ANybfyO:ANyhOZI:ANylISM: +ANyoQKd:ANyoxE:ANypCOs:ANytEeV:ANyvemd:ANywAeI:ANywgDx:ANyxPCx:ANyzYle:ANzBbDj:ANzLsoz:ANzMWiT:ANzODkp:ANzYUqd:ANzZlMS:ANzaCSK:ANzaZrp: +ANzgABo:ANzhfYF:ANzljzT:ANzoMTT:ANzreUi:ANzsAEr:ANzuQkm:ANzvWJV:ANzyaXj:AOADZWT:AOAFnEM:AOAIOss:AOALkZN:AOAOsLZ:AOAUJHu:AOAeSya:AOAfTha: +AOAkhCB:AOAyLlb:AOAyOuc:AOBADal:AOBAskA:AOBBsXe:AOBJQCL:AOBQajB:AOBUzEd:AOBWUci:AOBXUcI:AOBYMsi:AOBZKlu:AOBZoTx:AOBftSv:AOBkTHH:AOBmhEY: +AOBsoTO:AOBvXg:AOByIOO:AOByWXL:AOCAnEF:AOCCQKd:AOCQUsK:AOCTQex:AOCWNJx:AOCcuyT:AOCdYFv:AOCgOKJ:AOCkaUk:AOCslfx:AOCssui:AOCyqaC:AODEabI: +AODGneO:AODGwyu:AODIQkm:AODUils:AODVHz:AODWRIL:AODXuud:AODmOkC:AODoUxI:AODodvt:AODwIOr:AODyRIC:AOEAFIT:AOEAnIX:AOEClTi:AOEFCId:AOEHVDj: +AOERYYW:AOERjBp:AOEUzQe:AOEjriv:AOElBWO:AOFBqVI:AOFIedm:AOFKkTA:AOFLanv:AOFNVda:AOFPKCz:AOFPWSY:AOFTMCY:AOFYnTt:AOFZUkt:AOFbCTs:AOFclMo: +AOFdoSu:AOFgxfq:AOFmTOV:AOFpzDt:AOFwmGt:AOGBxHS:AOGDhgS:AOGGgqo:AOGHaZH:AOGIBYe:AOGJPab:AOGLDYn:AOGRNN:AOGRlCU:AOGRnBC:AOGSGhU:AOGZAXa: +AOGbpxM:AOGeXbm:AOGgQzy:AOGloFK:AOGpkMY:AOGpqNW:AOGteJL:AOGyddY:AOHNGYe:AOHOPAU:AOHPrHG:AOHWxhd:AOHbAYa:AOHkXBz:AOHobeF:AOHtpXs:AOHvyXs: +AOIDUCK:AOIFKLw:AOIFotz:AOINLhu:AOIQqaO:AOISqjL:AOITQFF:AOITzvj:AOIXnEF:AOIadpe:AOIgCRt:AOIiBoJ:AOItFmX:AOIvuyl:AOIwKwp:AOJERrk:AOJKUcP: +AOJLKlL:AOJLoTA:AOJNJhe:AOJPsdm:AOJaVBl:AOJdNUA:AOJehNg:AOJfuNw:AOJjPvE:AOJjoRN:AOJlIOV:AOJlWXU:AOJrkYd:AOKDuUb:AOKInWE:AOKOzzS:AOKPYqa: +AOKQNHp:AOKQcmE:AOKUIOi:AOKdRie:AOKjTnz:AOKtcVK:AOKvceu:AOKzEpk:AOLAuZU:AOLDROo:AOLKPOF:AOLOXns:AOLUrSc:AOLVNhO:AOLVcMz:AOLZIoV:AOLjlFH: +AOLjsUY:AOLrHLY:AOMHJMo:AOMIaNT:AOMJrVC:AOMKVDC:AOMLiCa:AOMOGHi:AOMQmgE:AOMSAjV:AOMSba:AOMTVMb:AOMUQPy:AOMWhzc:AOMXUWF:AOMoKNh:AOMpHdI: +AOMpjVN:AOMxsuM:AOMypT:AONCKCa:AONCWSB:AONGMCB:AONLlty:AONOanm:AONPJmV:AONUqVR:AONVAvw:AONZFiD:AONZniH:AONcrIf:AONczDo:AONvHee:AONwoSn: +AONwoVg:AONxHDp:AONxjvw:AOOBeUy:AOOCzQF:AOOElbr:AOOEobQ:AOOFUjb:AOOILUh:AOOJOkV:AOOaTsb:AOOihWp:AOOkqma:AOOmbOx:AOOpbNc:AOOrCaH:AOPBUDY: +AOPBsHP:AOPGbfS:AOPOLuq:AOPPOKO:AOPQAxQ:AOPXunb:AOPYlce:AOPYnbs:AOPbbea:AOPcnAE:AOPhyXt:AOPiVBI:AOPkgaP:AOPqqMx:AOPrzXS:AOPubnZ:AOPwnqF: +AOQCOhi:AOQMgQc:AOQUFXb:AOQVCrl:AOQVIbX:AOQYqZq:AOQaNuc:AOQcunU:AOQjKwi:AOQkGml:AOQpEnV:AOQpZMi:AOQqgj:AOQugDH:AOQzYXf:AOQzzfq:AORCsdF: +AORFajP:AORLuMJ:AORNZwo:AORQOkO:AORQjZe:AORWLHe:AORbBOZ:AORgNUj:AORiFMj:AORjdPu:AORmLUo:AORmRpS:AORpTHZ:AORvxDL:AOSAfrj:AOSCYqX:AOSJUVx: +AOSNHZz:AOSNgTQ:AOSPLcO:AOSRiLL:AOSTRis:AOSgcVr:AOSljKo:AOSmTnC:AOSrURr:AOStIoM:AOTBqqj:AOTLIoY:AOTPNjG:AOTQZaE:AOTVfRC:AOTggOK:AOTjHOu: +AOTuHLv:AOUFAjI:AOUiduW:AOUlZDF:AOUmSK:AOUnrPR:AOUodWb:AOUxnJP:AOVCRCX:AOVEicq:AOVJWZS:AOVSrvS:AOVZiYr:AOVrZdI:AOVuWHf:AOWCsUG:AOWNrhB: +AOWSoFa:AOWTRHU:AOWVJUe:AOWcyxV:AOWgHLW:AOWkamy:AOWljMD:AOWpxfi:AOWsBmf:AOWvGk:AOWxGMk:AOWzfHz:AOXDAxx:AOXGPZT:AOXHxtP:AOXIsuL:AOXLxhJ: +AOXNhGJ:AOXQgQv:AOXRazQ:AOXVDyw:AOXZgYq:AOXZofW:AOXdzXZ:AOXinqO:AOXjTSR:AOXqZUq:AOXqczK:AOXrQSN:AOXtFRy:AOXvofR:AOYICrK:AOYRsxY:AOYZQcp: +AOYaUVA:AOYlYXa:AOYlzfv:AOYoSRj:AOYpWxn:AOYqFRY:AOYsEnq:AOYsZMN:AOYuoyV:AOYvtsJ:AOYysA:AOZBsNN:AOZDgqS:AOZIIDe:AOZIWbk:AOZOIBh:AOZPqzA: +AOZTyfw:AOZcKWY:AOZfFrn:AOZvUvv:AOZxSfn:AOZxhNU:AOZzpnJ:AOaAyFI:AOaDLhB:AOaKQFQ:AOaOOKH:AOaOjzb:AOaURRg:AOaXJa:AOaYzeQ:AOaeEnx:AOaeZMG: +AOafpNT:AOahGqd:AOajLuH:AOajRPt:AOanOiD:AOatNuM:AOauSFP:AOauhnk:AOazPVI:AOazorB:AObAhWF:AObCqzf:AObGyfP:AObHOSv:AObRyYe:AObUsNi:AObWgqt: +AObjhcG:AObtSYd:AObxLLg:AObxOUf:AOcCHZh:AOcCgTC:AOcHaBD:AOcJnEB:AOcJwYx:AOcOMlD:AOcOXAe:AOcQuza:AOcVMxl:AOcZRiA:AOclkoA:AOcmfOV:AOcotkM: +AOdCQEu:AOdKfRQ:AOdNabM:AOdPneK:AOdPwyq:AOdRQki:AOdVNju:AOdWuZh:AOdfOkG:AOdgEPi:AOdjauf:AOdruYY:AOdxqAN:AOeItVf:AOeNzQa:AOeSKcu:AOeSWsV: +AOeWMcV:AOedWJD:AOembQk:AOemgSk:AOesrir:AOfBltf:AOfEphN:AOfLAvh:AOfMWZe:AOfPniW:AOfQYyX:AOfRnTp:AOfSAL:AOfTzqj:AOfesUK:AOflHez:AOfsdUN: +AOfyrIy:AOfyzDp:AOfzzfs:AOgBNfX:AOgIRHC:AOgKJUs:AOgQCwu:AOgRNHj:AOgRUdm:AOgRshd:AOgUXwb:AOgXeUT:AOgbfGF:AOgbiwX:AOgeAyr:AOgedJh:AOghBmp: +AOgmjvr:AOgnyxH:AOgoNMB:AOgpamo:AOgrbEU:AOhAxhX:AOhHNFW:AOhLTVu:AOhOgYc:AOhOofE:AOhVgQd:AOhWGYy:AOhXByn:AOhapXF:AOhdXBf:AOhhfgI:AOhhiWW: +AOhnaaw:AOhrDBt:AOhvQZr:AOhvsCT:AOhwZUC:AOhwczy:AOiFkZi:AOiJqaC:AOiMUCG:AOiNMSg:AOiOotv:AOiSsDZ:AOiVaJL:AOiaSyF:AOiekyS:AOiktsx:AOimPVr: +AOimory:AOioIoa:AOioWxb:AOipCRx:AOirBoF:AOiwNuv:AOixotA:AOiyFmv:AOiyojC:AOizdpi:AOjBQfa:AOjBzVM:AOjFOkx:AOjFjZR:AOjMLHr:AOjPqAH:AOjUKlp: +AOjWJhY:AOjYrVy:AOjeuYk:AOjgOIt:AOjkUvX:AOjopnd:AOjvCrs:AOjxBOM:AOkAolP:AOkCmqD:AOkFxnn:AOkLGhg:AOkMuUn:AOkNPoU:AOkZcmI:AOkatkJ:AOkwgow: +AOlCxMZ:AOlGoLG:AOlImQS:AOlNzZH:AOlOvVZ:AOlQGHP:AOlXiS:AOlfYfB:AOlgDcZ:AOllVrf:AOlwil:AOlyEPp:AOmBCII:AOmBWqR:AOmILKL:AOmSRcL:AOmUiCe: +AOmZWzG:AOmaYNZ:AOmezdr:AOmfPhX:AOmjSBX:AOnBUiO:AOnEedr:AOnHani:AOnPMCF:AOnTQpD:AOnUnTk:AOnWzqq:AOnaoSJ:AOnaoVC:AOncxfn:AOneSxK:AOniYnc: +AOnlzfH:AOnpSba:AOoEBYH:AOoKbFn:AOoLlCx:AOoLnBn:AOoSOkR:AOoTAXL:AOoXxTd:AOocQzT:AOocscr:AOodYRw:AOofnaX:AOoipxi:AOokaAQ:AOoneJa:AOooDbR: +AOorhWt:AOotzxn:AOozTsf:AOpDlBo:AOpDoBL:AOpHCWE:AOpKNhZ:AOpKsHT:AOpLXWR:AOpXLuu:AOpYOKK:AOpgXBY:AOphQSc:AOphdqP:AOpkbee:AOpqCAU:AOpwyXx: +AOpxhwm:AOqAiiN:AOqEsDS:AOqIUJx:AOqIoLJ:AOqNqjI:AOqRsnB:AOqYIdi:AOqYWBg:AOqcCRQ:AOqeBoo:AOqlgDt:AOqrGmP:AOqsKwU:AOqvFRb:AOrBOHl:AOrCFxG: +AOrFUcW:AOrHMsW:AOrSqAS:AOrTFxg:AOrUuMF:AOrbuNP:AOrhIOq:AOrhWXr:AOriCrh:AOrkBOV:AOrtgdM:AOrzGMi:AOsCXNI:AOsLNHu:AOsOIOL:AOsTXNi:AOsXxng: +AOsZrsy:AOspcVn:AOsrceP:AOsvqaI:AOszIlX:AOszlpK:AOtAilI:AOtHQEK:AOtMgtT:AOtYvUG:AOtaUrw:AOtcIOH:AOtkjkj:AOtlTNF:AOtsHOy:AOtvcvw:AOuCaNw: +AOuLmgF:AOuMUIQ:AOuOjBz:AOuUcxQ:AOuVGpw:AOubbQE:AOubgSE:AOuilmN:AOumxFP:AOuonJl:AOusTow:AOuvwfg:AOvCMCo:AOvMVdW:AOvUUif:AOvVVmv:AOvWYyj: +AOvWjbM:AOvZUwR:AOvcSbH:AOvoQWH:AOvzsUY:AOwAlbM:AOwAobn:AOwGAXw:AOwOlCC:AOwOnBU:AOwPhf:AOwTGyD:AOwdhWo:AOwgzxU:AOwmyxr:AOwnVbO:AOwpgAV: +AOwqHLs:AOwtcZD:AOwvwQF:AOwwYRL:AOwxnaC:AOwyxfm:AOxBsuH:AOxGGHh:AOxPPZP:AOxRofn:AOxTQJT:AOxbyXY:AOxfHlX:AOxkhwD:AOxlqMu:AOxmdDd:AOxoboL: +AOxrBMi:AOxtpXp:AOxzaMv:AOyBqjv:AOyCZWe:AOyKaJZ:AOyQhwr:AOyRCrO:AOySqZR:AOyWyFd:AOyeThP:AOyfKwJ:AOygheA:AOylxdf:AOymotW:AOynoyR:AOzEqAZ: +AOzGqJY:AOzHuMo:AOzJFJJ:AOzJqoy:AOzQsXR:AOzXIBt:AOzcFMO:AOzcoJz:AOzfdPP:AOzhFMM:AOzokYj:AOzpFrR:AOzrENz:AOzrZmE:AOzutSA:APADRDP:APAEUeB: +APAHRlT:APAIdhA:APAJViI:APAMgwc:APAOppQ:APAQFdi:APAWXqj:APAYrpX:APAeRcw:APAhLof:APAhisu:APAnEAl:APAvhsN:APBDXRF:APBDgbF:APBImSh:APBOdHN: +APBTUje:APBYNhB:APBYpT:APBmAjc:APBtrVb:APCAHek:APCCjRG:APCGwls:APCScVE:APCXQiC:APCfRvw:APCgpwT:APChYCf:APCryQV:APCxToJ:APCxcky:APCzOiv: +APDCuvs:APDGKKB:APDKCGs:APDPltI:APDXjrn:APDYAqU:APDZRiB:APDeNuN:APDgDJi:APDgQCF:APDmZyt:APDobhg:APDuXS:APEGWCN:APEHDdR:APEKUQS:APELEJq: +APEOXbS:APEOgwT:APEPuuj:APEYXKh:APEanRg:APEbYgm:APEfBZp:APEhmF:APElKRX:APElQQV:APEsHHx:APEuZgb:APExBPP:APFArwo:APFBByk:APFIcHY:APFLbfM: +APFMxHN:APFREjx:APFSZnG:APFVuUc:APFYlji:APFZoTW:APFgnrn:APFiDnL:APFiFbF:APFjqEQ:APFpMDw:APFqtLc:APFyHhq:APGAmLj:APGBIvJ:APGGnCO:APGIBbA: +APGIKEd:APGKowQ:APGOQuM:APGRQPm:APGSSqF:APGaipL:APGawgO:APGdcMU:APGfbpk:APGglsh:APGgoji:APGkUqm:APGnDoD:APGprOB:APGsgrT:APHAAux:APHHIVs: +APHImlS:APHJPbv:APHLRIF:APHQBBx:APHSoWh:APHcMdD:APHcOKu:APHiiPu:APHiwGv:APHjcml:APHlbPR:APHolSQ:APHooJP:APHqnJb:APHsUQT:APHzPdD:APHzkHh: +APIENHD:APIIGKi:APIIhEB:APIMCrD:APIMLcA:APIMnWq:APIPkhv:APITnUV:APIarvD:APInhpd:APIqCIj:APIsCzT:APIsGcB:APJAODB:APJCVIy:APJDgWS:APJFpPa: +APJHgcm:APJIqZO:APJJVJC:APJQFMk:APJSyNY:APJYabJ:APJZuiy:APJmeOS:APJwCis:APKBuTq:APKMMxB:APKNauq:APKQNgw:APKVOdz:APKWRId:APKbBCS:APKpRTX: +APKpTNj:APKsBNA:APKsGLA:APKyDHZ:APLCltP:APLJutN:APLVaUN:APLXvrZ:APLsbCo:APLyDJP:APMKpeG:APMLXKC:APMPquc:APMSLAU:APMUgfX:APMVAEB:APMZxhl: +APMbhSo:APMeHHs:APMgQrb:APMhQrB:APMqEUf:APMuCEX:APMuzjb:APMvArA:APMwWNZ:APMxfmj:APNLljP:APNSSjD:APNXwdc:APNYLaN:APNaPGU:APNdNng:APNhhst: +APNmQRy:APNsYGU:APNwhsT:APOBjbD:APOKlwS:APORHhN:APOTQEn:APOVrDl:APOeovU:APOfgrs:APOiuIy:APOkHqZ:APOksYa:APOmPQE:APOyfMa:APPBrmA:APPCuul: +APPEoWa:APPHqyw:APPIURk:APPKfUN:APPLJED:APPLotn:APPYcMD:APPfgNb:APPifRI:APPquiN:APPwDOT:APQBiPS:APQCkhM:APQLZei:APQNISO:APQQrvP:APQUeaF: +APQouMQ:APRCZEB:APREyNP:APRIkHF:APRPXQS:APRRRLM:APRWgWz:APRXpPh:APRghPT:APRhCiZ:APRjBG:APRjCZd:APRjGCr:APRriSl:APRrsY:APRxEau:APSHuHx: +APSRMcZ:APSYcuD:APSaXYM:APScsGh:APShSjs:APSlDHC:APSsRTA:APSsTNs:APSxtpJ:APTAvvN:APTHuve:APTILkW:APTKHET:APTMjrx:APTNRBP:APTPODJ:APTVIFu: +APTWMCs:APTZqon:APTbqHK:APTchzK:APTkBcC:APTnSJz:APTpWYs:APTrwWA:APTyRtH:APTyTnz:APUDwDa:APUGchB:APUISws:APURyvx:APUXeLN:APUYnyO:APUgwCd: +APUiBZB:APUjyMI:APUpbQS:APUsBBz:APUyFXQ:APUyIhO:APVCXks:APVDcH:APVDpEw:APVEQcI:APVFOyI:APVHZnu:APVQWcU:APVUUqH:APVVGFr:APVVOyT:APVXjjm: +APVYXBH:APVYgWO:APVYzAe:APVbBpK:APVftLQ:APVmqEc:APVnFbt:APVnqLM:APVvbqZ:APVzJIl:APWDKAB:APWEHhW:APWGQEw:APWRSSN:APWVYft:APWXSqX:APWcgnL: +APWxgrJ:APWytaQ:APXAGnl:APXCoLN:APXCpH:APXDPdN:APXDStU:APXESGq:APXIfgm:APXJKaK:APXQYyH:APXTlWC:APXoygI:APXueQy:APXuzrF:APXvPqU:APXxgNe: +APXzlJI:APXzrou:APYCulW:APYFqzd:APYGgCF:APYHOsO:APYHzdh:APYJSm:APYNOdi:APYTXrR:APYTgBR:APYTovH:APYdEAw:APYeLyd:APYeSju:APYjRcL:APYuUfH: +APYwyYJ:APZFFMy:APZOuik:APZSGkB:APZShei:APZZNzC:APZZWfy:APZatQp:APZkrVo:APZlEfZ:APZrRCu:APZwccK:APaGXru:APaGgBu:APaGovo:APaKOsh:APaKzdO: +APaNXqV:APaQOdN:APaSViu:APaVppm:APaXgCa:APaYqzC:APaZVjO:APaiyYM:APawEAP:APbDUEI:APbHdHJ:APbMXRB:APbMgbB:APbMoVX:APbOSN:APbQzDx:APbSMNK: +APbVXQa:APbWODy:APbXrPS:APbiccB:APbqTTE:APcBQig:APcCMxi:APcGqOU:APcLAQX:APcMRIO:APcPwlw:APcSlTD:APcZuTZ:APcakQD:APcbTon:APcdOiR:APcoRvs: +APcpRvS:APcqbHJ:APdARBb:APdBjrJ:APdCgOQ:APdGQIN:APdHgwl:APdLTiN:APdRcvH:APdRwNS:APdYltM:APdcRoh:APdiOLr:APdjJik:APduRVz:APdvpWY:APeGyvn: +APeHHxv:APeLchT:APeNSwe:APeNnWk:APePdFK:APeQDdV:APeWXWV:APelwCr:APeoBZt:APeqOYN:APetNNS:APfBelq:APfDnYP:APfNgWY:APfNzAs:APfUbfI:APfVWcC: +APfeFxn:APfeIHp:APfsqEU:APftymv:APfyPGh:APgGfGv:APgKIvF:APgLPBc:APgORis:APgQnCc:APgSOSB:APgSuUp:APgXZiG:APgXqYk:APgYUrw:APgdOub:APgdfrW: +APgmcMY:APgnADY:APgobpg:APgyfrU:APgzUfA:APhAQph:APhCJEq:APhFncJ:APhHBBD:APhHKea:APhJoWT:APhPmlo:APhQIVO:APhSPbJ:APhYOsK:APhYuuy:APhbtWN: +APhflSm:APhfoJl:APhjUQh:APhmDOA:APhpiPI:APhpwGJ:APhscmP:APhubPn:APiCdhd:APiFVil:APiHulI:APiLFdl:APiUynl:APiVCrH:APiVLcM:APiYkhz:APiZiPd: +APieuMf:APijLyz:APijSjk:APirhsk:APiwhph:APjCmSK:APjDNhA:APjHGkl:APjHheG:APjQgcq:APjSxqH:APjbFpy:APjcota:APjoLYS:APjoSJB:APjprVA:APkFlTc: +APkMcVf:APkPCgy:APkQvVR:APkSgWB:APkXuVy:APkYLKK:APkjNUD:APklDjc:APklQcL:APkrqhW:APkshZW:APlAyfb:APlLltT:APlPNGL:APlUcvQ:APlUwNJ:APlcDJt: +APliRVC:APljYcr:APlrBnz:APlrGlz:APmGBYm:APmLLAQ:APmOlJO:APmQaGo:APmTpeC:APmXZNA:APmbXyU:APmeMdq:APmnHHw:APmqQrF:APmuBQd:APmvtle:APmwNNx: +APnGSWU:APnIxHs:APnRLaJ:APnWagt:APnZpEX:APnaJIc:APnblbd:APncnrS:APndDnQ:APndqLb:APnffMU:APnmbRA:APnoPGX:APnpEuy:APntHhl:APnwZGV:APoEOSM: +APoHSSS:APoLYfi:APoMQcC:APoQGNx:APoSolZ:APoTPDZ:APoTSTA:APoUSge:APoYfGy:APobwgr:APoclsK:APocojJ:APogOuM:APogfrx:APohTlV:APontal:APoosfH: +APpCmlv:APpEPbs:APpKKex:APpRQUq:APpSzhb:APpaOMH:APpapiC:APpciPP:APpcwGS:APpfcmI:APphbPw:APpknJG:APpmUQq:APppTLi:APputWW:APpvPda:APpvkHM: +APpwHZF:APqLiPo:APqNaBT:APqPnUq:APqVFmu:APqWISS:APqaeom:APqeLoh:APqjhpC:APqkCIM:APqmCzs:APqmGce:APrBpPD:APrCeAa:APrHQnG:APrKmGZ:APrQipT: +APrRkHJ:APrSabo:APrUVJF:APrWQng:APrbEfM:APrgJtk:APrphPX:APrwtQg:APsFgWk:APsGTdt:APsJauT:APsMKka:APsPPWj:APsRcux:APsYMcf:APsecks:APsfkQj: +APslTNO:APsotpv:APswQHi:APtLQIP:APtXcUA:APtbsgm:APtfyqE:APtjwur:APtlLRV:APtmTOy:APtmcKJ:APtnOIe:APtnOLl:APtpXyH:APtrRtD:APtrTnv:APuGpez: +APuHBYT:APuISJb:APuOLAh:APuQGnX:APuRRwg:APudBPf:APuiNNa:APumhSr:APupqen:APuqCEe:APuvPgS:APvCwdl:APvIVK:APvMpEs:APvOSjk:APvRHXm:APvULaa: +APvVcHO:APvXnwp:APvZdfP:APvgHhG:APvlBqT:APvrBbw:APvsEuR:APvtYGR:APvvwci:APvwDnz:APvwFbp:APvwqLI:APvxBzO:APwDGNa:APwGrMK:APwMKAF:APwPQEs: +APwRrDq:APwTYYE:APwWPDC:APwWSTX:APwXlwn:APwaODj:APwbgrn:APwgHqG:APwqZys:APwqyGd:APwvuID:APwxHqg:APwzPQx:APxEYFy:APxFfUM:APxGSQU:APxHJEg: +APxHotM:APxQSsC:APxSKaO:APxTHHZ:APxVQez:APxbgNA:APxdlJm:APxdroQ:APxhoVa:APxkwGb:APyHZeL:APySRDG:APyTUeU:APyWRlC:APyXdhV:APycWam:APyhGpD: +APynrvZ:APzDkHA:APzEabd:APzHxqz:APzRuLR:APzSUjt:APzVgcC:APzXmSy:APziWAd:APztLYa:APztSJp:AQABaWj:AQADGJD:AQAFqIc:AQAGrhS:AQAHAxw:AQANsUM: +AQAVrJJ:AQAZAtk:AQAizRx:AQAjtvH:AQAqEOl:AQAuR:AQAyCUX:AQBBAH:AQBFfdl:AQBHBmx:AQBKsg:AQBLTQi:AQBNAXx:AQBcKiB:AQBfEoC:AQBjFPs:AQBlccM: +AQBluim:AQBnzrW:AQBqyUF:AQBtMeo:AQBynqS:AQCAoqZ:AQCCRPB:AQCDHGT:AQCFnxa:AQCLylh:AQCRNrl:AQCRvee:AQCSwYd:AQCUDKw:AQCcHJB:AQCcsOb:AQCjFIz: +AQCjXId:AQClwlO:AQCrGMa:AQCukNI:AQCyXKi:AQDCTOL:AQDEpLu:AQDHbOM:AQDIWbi:AQDLdkl:AQDWEcT:AQDYwyo:AQDmuBJ:AQDpFiq:AQDpXio:AQDqgRh:AQDqrGk: +AQDrjiu:AQDwGmJ:AQDxGmj:AQDzONN:AQDzRMF:AQEEqMf:AQEIlwI:AQEKEiM:AQELHed:AQEOGBs:AQEeeyh:AQEkTyD:AQFIARI:AQFKNmM:AQFKOKK:AQFLPNY:AQFMqmQ: +AQFOwL:AQFSBYp:AQFUGpi:AQFWGbD:AQFbOBR:AQFfhjy:AQFmKWs:AQFwhio:AQFxtC:AQGBOvL:AQGKxvm:AQGOLNx:AQGVXwU:AQGajaE:AQGdUWT:AQGfscy:AQGguuR: +AQGjXvY:AQGldnz:AQGtAZX:AQGwsTC:AQGxEsI:AQGxkiY:AQGxnhT:AQGyXOD:AQGzNYQ:AQHCYZt:AQHHFUI:AQHNCSG:AQHPDOK:AQHQxVv:AQHepJG:AQHiFPx:AQHisGp: +AQHkIbP:AQHmMhm:AQHteOZ:AQIBDBB:AQICfDJ:AQIEOgr:AQIEcND:AQIIHth:AQIIgJG:AQILAtb:AQINWfF:AQIOoGh:AQIZbdq:AQIdnQu:AQImdgX:AQIotWu:AQIpCIb: +AQIpWwF:AQIqMEI:AQIrOee:AQIyBcb:AQIzSlI:AQJLhMC:AQJVjkX:AQJcPKX:AQJlnqL:AQJstVX:AQJwABM:AQJzRYD:AQKDECv:AQKFwYM:AQKGjNJ:AQKRplW:AQKSboo: +AQKVWBK:AQKWdKN:AQKdGMh:AQKfOnL:AQKfRmD:AQKhBot:AQKjtES:AQKrfqZ:AQKtRRV:AQLIvEU:AQLJEco:AQLLwyT:AQLNDkG:AQLRfzO:AQLSyLX:AQLXmxa:AQLZoQj: +AQLdjin:AQLgaKg:AQLjObm:AQLjiow:AQLlONU:AQLmBOM:AQLnkny:AQLoiwD:AQLwfQc:AQLzwDV:AQMMZyn:AQMNTMc:AQMQBLK:AQMWZse:AQMWyJi:AQMjquu:AQMqpjt: +AQMzqqu:AQNCcnU:AQNDLmV:AQNJJkq:AQNMUHB:AQNTTmZ:AQNUZYW:AQNYBlr:AQNaqxJ:AQNeowI:AQNfquy:AQNhenK:AQNkSRD:AQNmhgE:AQNnwBY:AQOALNa:AQOMYAm: +AQOUBYF:AQOVJvN:AQOVrFv:AQOaeox:AQOgUWm:AQOjzII:AQOlaVW:AQOmRpa:AQOnGtn:AQOrram:AQOvZvW:AQOvjyf:AQOzzzF:AQPBrEk:AQPFLnH:AQPHIZm:AQPKFUb: +AQPNzGR:AQPUDy:AQPVAWc:AQPVBXU:AQPVKlK:AQPYhHv:AQPgeOq:AQPgppw:AQPhEAn:AQPpXot:AQPqESy:AQPqkIi:AQPqnHd:AQQGHSD:AQQHHSd:AQQLYCH:AQQOAty: +AQQSev:AQQVlLU:AQQZnxS:AQQamue:AQQbbAs:AQQdzDM:AQQeSmf:AQQeczd:AQQhVPe:AQQlBcy:AQQmSlR:AQQsCIy:AQQuRyf:AQQwnQn:AQRAdwu:AQRBrjs:AQRHWFv: +AQRKDbR:AQRMHsO:AQRQYcc:AQRRkpk:AQRTbDA:AQRUATr:AQRWWFV:AQRedtl:AQRevFs:AQRhbQp:AQRhbax:AQRjzdF:AQRnVpn:AQRrBCr:AQRsKTP:AQRtCAu:AQRvdGH: +AQRzMeY:AQSDGyX:AQSFboP:AQSIGhQ:AQSJsmo:AQSQMJb:AQSRBMA:AQSWeML:AQSXeMl:AQScIoi:AQSsGib:AQSseiG:AQSyqSI:AQTAvnP:AQTCRQw:AQTHyhm:AQTIGYw: +AQTNHgM:AQTPnXx:AQTTyl:AQTWDGz:AQTXBmN:AQTaiwM:AQTbCHg:AQTcXkp:AQTdGDn:AQTfgRZ:AQTfrGY:AQTumTO:AQTxCEt:AQUATMx:AQUDBLP:AQUJZDl:AQUPByU: +AQUTGBa:AQUXNMh:AQUXOkn:AQUZyiR:AQUaqIP:AQUeEPy:AQUfRU:AQUgmKF:AQUhehb:AQUthIJ:AQUyChr:AQUzKwV:AQVEAnG:AQVFZBb:AQVGTms:AQVJwdm:AQVgOU: +AQVhheU:AQVjcfM:AQVjpJd:AQVmmkM:AQVvzkD:AQWCOGh:AQWEIzC:AQWMZey:AQWNZdo:AQWOjpI:AQWXrvy:AQWYJvi:AQWYmny:AQWYrFQ:AQWdraj:AQWiAZf:AQWlzzA: +AQWpjop:AQWqLaB:AQXAWzo:AQXAsmm:AQXHYZf:AQXILRL:AQXLsu:AQXSZEN:AQXVZDX:AQXZQth:AQXcziY:AQXeavG:AQXpZVg:AQXpjYV:AQXtzZv:AQXzagS:AQYCUvU: +AQYCjKs:AQYDoGz:AQYJcNV:AQYNHtz:AQYNgJU:AQYRyzy:AQYTeJs:AQYVcHb:AQYXfDX:AQYZaWQ:AQYbdTN:AQYbvfQ:AQYdtWg:AQYezZJ:AQYgYrW:AQYhTDD:AQYoEDP: +AQYsKIv:AQYwPtk:AQZDkpp:AQZGHQD:AQZIUVL:AQZIjkj:AQZOOGY:AQZOcno:AQZSOai:AQZcxW:AQZfKTk:AQZkzzS:AQZmJnd:AQZmYRN:AQZsImf:AQZvCuZ:AQaGloU: +AQaITHJ:AQaIlGO:AQaKBMk:AQaOTqz:AQaPrhO:AQaXWvS:AQabEDw:AQasPkT:AQbBhMX:AQbErjA:AQbFdwG:AQbMsuF:AQbQawa:AQbSGjO:AQbUqih:AQbVrHX:AQbYyZI: +AQbfImO:AQbitVC:AQbpEog:AQbsFPw:AQbxzrs:AQbyPKC:AQcFMJp:AQcGBMS:AQcHplz:AQcLWBf:AQcMqlB:AQcNGhC:AQcOnxe:AQcQZwI:AQcSJst:AQcVOek:AQcWyHp: +AQccMTW:AQcionR:AQcqube:AQctjIZ:AQcwmSi:AQczOBY:AQcziOC:AQdHfzp:AQdMBmX:AQdNGYa:AQdPoQU:AQdRRpM:AQdUsMv:AQdmajR:AQdnBJr:AQdrHjM:AQdrsom: +AQdsAWw:AQdxXkf:AQeBlwM:AQeFRwi:AQeMOkX:AQeOyid:AQeScNA:AQeTLMB:AQeZJKe:AQedBkG:AQeeOba:AQeliHQ:AQepESL:AQepmQP:AQevqUm:AQfAgPP:AQfDqmm: +AQfHlWB:AQfKQQi:AQfUyIk:AQfWWpg:AQfXAnu:AQfZEIF:AQfdeYc:AQfjBKH:AQfjRbQ:AQfwqxQ:AQfzTYO:AQgAFbg:AQgAZkL:AQgFYzc:AQgMjLN:AQgMrvk:AQgRCsp: +AQgbhlo:AQgfRBO:AQghpjP:AQgmBBk:AQgpsTO:AQgweoM:AQgwpPK:AQgzjaI:AQhUXWR:AQhZxVj:AQhfuUU:AQhghLD:AQhhXBO:AQhiNyV:AQhkRbd:AQhvstD:AQiBqIF: +AQiJsUh:AQiPnxD:AQiQdWi:AQiRrJo:AQiXWfj:AQiacCG:AQiauIg:AQiePkM:AQikEOI:AQirDla:AQiudTp:AQiuvfo:AQixbAd:AQixbql:AQizzDZ:AQjADbG:AQjBfdO: +AQjDawF:AQjFGjh:AQjHTQJ:AQjIoAW:AQjNogm:AQjTOGw:AQjTcnA:AQjUnXm:AQjWqtQ:AQjXHTm:AQjXgjB:AQjeFPp:AQjkyUe:AQjntwp:AQjpMeL:AQjwDLH:AQkEfZR: +AQkFylE:AQkLNrA:AQkLveH:AQkMECr:AQkOwYI:AQkPRqz:AQkPjNN:AQkQDKZ:AQkXyHY:AQkYOeB:AQkfwlb:AQklOBP:AQkliOJ:AQkmGMl:AQkoOnH:AQkrChS:AQktGdZ: +AQkuFIw:AQkuXIi:AQkvgrn:AQkvrgm:AQkwjIs:AQlApLJ:AQlDqLr:AQlEWbV:AQlSEck:AQlTybA:AQlUwyP:AQlVRQc:AQlVjnW:AQlWDkC:AQlZTiY:AQlafQG:AQlbRrk: +AQliteN:AQlqaKC:AQluONQ:AQluRMY:AQmEcNH:AQmJyBl:AQmPZsa:AQmPyJm:AQmUANS:AQmVZbv:AQmWTMg:AQmZwDy:AQmaeyE:AQmgTyi:AQmpoY:AQmvqIo:AQmxhEA: +AQmzcFY:AQmzpjp:AQnDARJ:AQnGqmr:AQnHPNz:AQnMLmR:AQnNBYs:AQnOeG:AQnRybU:AQnSJku:AQnXZSX:AQnXyjT:AQnbhjZ:AQnfCHt:AQngNr:AQnuihA:AQnyqQH: +AQoAycF:AQoDCsy:AQoEDoU:AQoFvm:AQoFxvh:AQoLhhc:AQoMFuW:AQoMOm:AQoQWZc:AQoQsMa:AQoXYzj:AQocxel:AQomKnI:AQoszIU:AQouaVK:AQowGtr:AQpCByc: +AQpKrEg:AQpLxVq:AQpPLnd:AQpSGZW:AQpTByC:AQpfUwh:AQpixEu:AQplXVe:AQpndNF:AQpsKNP:AQqDHto:AQqMlLi:AQqSEsQ:AQqWHqH:AQqYjKf:AQqeEDE:AQqiKIc: +AQqsKsl:AQqvKtg:AQrEfdV:AQrInXT:AQrJqtH:AQrUllR:AQrVHsC:AQrXnk:AQrdSMa:AQrdcZc:AQreEoy:AQrkDLq:AQrpYG:AQrrWWZ:AQrtOEy:AQrtRYa:AQrwVpb: +AQsBNUa:AQsCjNi:AQsJDgi:AQsSdKm:AQsZVse:AQsbBoW:AQshjtE:AQsowdL:AQspAwR:AQsvMTy:AQsvUup:AQsyTCm:AQszaJw:AQtGybh:AQtHNuv:AQtPMji:AQtRVOu: +AQtXGHZ:AQtZpif:AQtmXkT:AQtpmsP:AQtrIOb:AQuAUhd:AQuIZyq:AQuMwDb:AQuSZsz:AQuSyJv:AQuTTKD:AQuYByQ:AQuZLMp:AQuemQB:AQukhEZ:AQurhGC:AQuzoWO: +AQvAKVS:AQvBSmw:AQvCGbn:AQvFgPF:AQvIZdc:AQvOZYz:AQvPTmw:AQvXHPo:AQvbquT:AQvqheQ:AQvscfI:AQvtEpv:AQvvmkI:AQwFFbQ:AQwFZkz:AQwKAwi:AQwKKLA: +AQwRJvm:AQwRrFU:AQwSzgX:AQwXjpM:AQwfzIj:AQwgNYK:AQwgwt:AQwjGtM:AQwmEad:AQwmTtV:AQwqIBq:AQwsSLO:AQwyjot:AQxDIZH:AQxJyCv:AQxKZKU:AQxROgc: +AQxXJVb:AQxXmNr:AQxXrfZ:AQxhAzm:AQxisCl:AQxlkIl:AQxlnHa:AQxpRbV:AQxwBbr:AQyFYCm:AQyGkPe:AQyIbdO:AQyMWfx:AQyRhmd:AQyWHtv:AQyWgJY:AQyYJHV: +AQyYLqV:AQyaSmC:AQyaczA:AQyfKsu:AQyiSlw:AQynado:AQyqRyC:AQysnQK:AQyvIMs:AQzBUVP:AQzBjkv:AQzGDbu:AQzMkpl:AQzNbDf:AQzQHQx:AQzadtK:AQzavFT: +AQzctwb:AQzdzzO:AQzfJnx:AQzfYRR:AQzrKis:AQzuCiU:AQzuWWq:AQzvPTn:AQzwOER:AQzwRYJ:ARAAjsv:ARAAlJv:ARAItsA:ARAOtJq:ARAPAO:ARAPRSD:ARAXwMX: +ARAoCxU:ARAoUru:ARBDOjr:ARBEQwn:ARBIzle:ARBKjhX:ARBTeXw:ARBVWBL:ARBWJUK:ARBZVgj:ARBbbqU:ARBcrIw:ARBfSTJ:ARBfhQj:ARBicsV:ARBlfRr:ARBlxRl: +ARBmJgK:ARBnJRv:ARBoMHE:ARBtgVi:ARBvouM:ARBvrvE:ARBxbtu:ARCEbYc:ARCEtTT:ARCFmqG:ARCHPWM:ARCLwyQ:ARCMSVJ:ARCNgSt:ARCZexl:ARCcAO:ARCdsea: +ARCeAqn:ARChiTL:ARCkaLK:ARCkvMb:ARCtJrm:ARCwAPd:ARCzItt:ARCzoyn:ARDFhkz:ARDIpeP:ARDIyGb:ARDKCUm:ARDLaUV:ARDOsVB:ARDUusz:ARDWtPz:ARDaAEH: +ARDiQCr:ARDmOLq:ARDntbl:ARDuOgn:ARDzQnt:AREBLLV:AREFrLr:AREMnvE:AREMoPC:AREQpEg:AREQygU:ARESCuZ:ARETlvY:AREdryE:AREeoYz:ARElIsJ:AREpMjK: +AREpehW:AREqQcE:AREuOlF:AREvQnv:ARExEuD:ARFAalK:ARFAkWc:ARFDomT:ARFKpfz:ARFMXmu:ARFcezF:ARFctot:ARFdkuT:ARFeXFU:ARFgiYS:ARFisWm:ARFmxma: +ARFoDuB:ARFqEty:ARFwuLl:ARFzZRH:ARGAfYX:ARGAzPs:ARGEofE:ARGJgAX:ARGMJwq:ARGMRMT:ARGSdTc:ARGVluK:ARGXiAn:ARGdgOd:ARGmbyT:ARGujgh:ARGwETr: +ARGwPkt:ARGxeZm:ARHKQOL:ARHPaoZ:ARHWhHG:ARHXhHg:ARHoTmY:ARHqMnf:ARHrBZp:ARHrBjx:ARHuCag:ARHusve:ARHxvKf:ARICOZC:ARIJSnu:ARIPNCY:ARIQDlt: +ARIRRqr:ARIaCxZ:ARIaUrz:ARIepPP:ARIketT:ARIkqDb:ARIsgX:ARIuDom:ARIxBJq:ARIxBzy:ARJEZgN:ARJGQgu:ARJInNz:ARJKVUX:ARJNSFG:ARJSvty:ARJVBtW: +ARJYgsV:ARJZSvh:ARJdApF:ARJgadt:ARJhadT:ARJptXv:ARJrUp:ARJsitn:ARJvtGk:ARKFYWp:ARKKZGG:ARKLnIt:ARKOnns:ARKPrJO:ARKQVuQ:ARKSrJv:ARKXYsl: +ARKYgBv:ARKfWWW:ARKiAPo:ARKloye:ARKoBh:ARKqIlL:ARKqLel:ARKrcSf:ARKsxpq:ARLAlVw:ARLFjPp:ARLGGkJ:ARLKtPC:ARLPzyj:ARLTbWS:ARLWBGY:ARLaZPl: +ARLcQNX:ARLfsie:ARLlQnM:ARLqQRS:ARLueKz:ARLwMPE:ARLxEsa:ARMFeRU:ARMJYyy:ARMPYqx:ARMPzHt:ARMRPeb:ARMSREp:ARMUauF:ARMVzYc:ARMWtvr:ARMaEBP: +ARMvQrz:ARMzPQe:ARNDHsW:ARNKSVU:ARNKwAW:ARNNHEN:ARNOJGh:ARNUiaL:ARNYKgq:ARNhiYz:ARNmKrh:ARNmNse:ARNmehx:ARNqrYR:ARNtRze:ARNyaAi:AROAYXK: +ARODcHt:AROEdTX:AROFXMe:AROLHSn:AROMfNZ:AROQSvl:AROQwan:AROXyAg:AROYlIM:ARObCgd:ARObSXQ:AROhDUR:AROmkUD:AROsZrX:AROuAmF:ARPEwmu:ARPGtSL: +ARPNKKh:ARPSJPr:ARPSumT:ARPSyGO:ARPZCUW:ARPfcRQ:ARPfwlu:ARPmkhx:ARPpkos:ARPrDOO:ARPtTLf:ARPuZAK:ARPwyiV:ARQDGqO:ARQMLwf:ARQSsdF:ARQTKks: +ARQWhJG:ARQYJpi:ARQYuMO:ARQYygT:ARQcSFQ:ARQikrl:ARQmpOq:ARQskHc:ARQvkOh:ARQzhFI:ARRDYSj:ARREMCO:ARRFvtV:ARRKDPY:ARRTAEp:ARRTbVI:ARRYKft: +ARRZFH:ARRdMHs:ARRebqc:ARRhrIA:ARRpmOM:ARRpunD:ARRsGH:ARRvEro:ARRvgrJ:ARRwQWE:ARSAYyt:ARSBnnj:ARSCJub:ARSCrJV:ARSMMcp:ARSSDpf:ARSZvHn: +ARSaaDD:ARShJON:ARSpaLY:ARSpvMp:ARStvFc:ARSvmor:ARSytxf:ARTCzyA:ARTDCnd:ARTFwPT:ARTGbWx:ARTRECD:ARTSkfZ:ARTaKHL:ARTfPqg:ARToQnf:ARTobX: +ARTrOLc:ARTxsin:ARUAuSS:ARUBjWD:ARUExda:ARUIzBF:ARULwpO:ARUPhKS:ARUSYqA:ARUSzHM:ARUYbBf:ARUakaI:ARUeMju:ARUeehi:ARUhQrc:ARUoBGY:ARUpcSA: +ARUvKhw:ARUvXid:ARVAyZb:ARVIbBI:ARVUYfQ:ARVUqOw:ARVoZai:ARVsJtX:ARVwRzB:ARWFfYJ:ARWFzPa:ARWKaLr:ARWKbCD:ARWKkwZ:ARWLlId:ARWPUDH:ARWRMUf: +ARWRjMv:ARWXJKV:ARWYWOd:ARWexte:ARWfZrq:ARWgnbP:ARWjgOV:ARWmtOM:ARWoXfl:ARWqiyj:ARWsswT:ARWyJTo:ARXEJPk:ARXEumM:ARXEyGV:ARXOoZh:ARXQjSb: +ARXQljb:ARXWLtJ:ARXYtSU:ARXaswC:ARXfkRN:ARXirbw:ARXjpoS:ARYCffg:ARYEeHU:ARYEsdM:ARYFyxP:ARYIhJL:ARYKNGV:ARYRHVY:ARYVDlF:ARYfkHH:ARYgsWJ: +ARYmcra:ARYmwLE:ARYvivN:ARYyTMB:ARZBWoW:ARZBYEJ:ARZPVgE:ARZVmQs:ARZWAEi:ARZWbVP:ARZXPwy:ARZbWqm:ARZbdsh:ARZeMoq:ARZoQHx:ARZqvfE:ARZsmOT: +ARZtsEU:ARZwOf:ARZxitx:ARZyOuQ:ARaBLwt:ARaLTfH:ARaLYAQ:ARaNxGw:ARaTAly:ARaVgqW:ARaXtJu:ARaZaCd:ARaaZab:ARacjuU:ARahdWW:ARajcnk:ARaqaYn: +ARaspOC:ARayCxq:ARayUrQ:ARbIttk:ARbMOjv:ARbNrKN:ARbPDPK:ARbUFAS:ARbVYwD:ARbeWqF:ARbedsC:ARbfJoC:ARbkbqQ:ARbnalT:ARboSTN:ARbohQn:ARbvWwc: +ARcHzLz:ARcJjHG:ARcKWOg:ARcKYez:ARcOvHX:ARcQPWI:ARcTQWq:ARcUwyU:ARcYVGu:ARccQwl:ARcfQhH:ARchcSI:ARckdSX:ARclJGT:ARcnMhZ:ARcqFJD:ARcrrih: +ARdDLlE:ARdHrla:ARdPpuB:ARdUCUI:ARdVerA:ARdZYYm:ARdgbpo:ARdgrYv:ARdjHQb:ARdncsL:ARdqEbD:ARdtUGj:ARdwtbh:AReEhKA:AReFnvI:AReFoPO:AReHrN: +AReMqJQ:AReTVU:AReTaIM:AReWQvu:ARebEuh:ARembPP:ARemryI:ARevcSs:ARfKHsB:ARfQYxG:ARfTchx:ARfUdtT:ARfVXmi:ARfcNsP:ARfcehM:ARfgiDR:ARfpuLp: +ARfrCGh:ARgKyzK:ARgPaLL:ARgPbCz:ARgPkwd:ARgbeZA:ARgbtOs:ARgdXfR:ARgfiyT:ARghswj:ARgiZrO:ARgkAmQ:ARglnbn:ARgmgOh:ARgvulk:ARhCtjk:ARhEacz: +ARhFOzv:ARhGTFV:ARhGYaO:ARhNdYf:ARhTGQC:ARhThol:ARheZIU:ARhmeTA:ARhmqdw:ARhpNJQ:ARiKtJR:ARiLOZO:ARiMaCC:ARiOTfo:ARiOYAv:ARiYNCU:ARiZQoI: +ARiifKH:ARimZil:ARipMNc:ARitCAb:ARiuetx:ARiuqDN:ARjAQwS:ARjBNcT:ARjBOR:ARjCgsr:ARjKmQA:ARjNZgJ:ARjOniy:ARjPQgq:ARjSJUv:ARjSrjB:ARjhWwz: +ARjkMHx:ARjoITr:ARjooYh:ARjqadP:ARjrbtH:ARjxJoZ:ARkAvHS:ARkCgBR:ARkEBTZ:ARkISVe:ARkJVuU:ARkLrJr:ARkMSfJ:ARkMtrq:ARkTZGC:ARkVQGx:ARkWYyi: +ARkXnnw:ARkaAqA:ARketgf:ARkoMOj:ARkvaDy:ARlAfW:ARlCgHX:ARlHaUK:ARlJerx:ARlNgYF:ARlOjPt:ARlQusg:ARlUxDU:ARlYzbr:ARljtbq:ARlldgI:ARlmEUN: +ARluMJA:ARlyKg:ARmIQvz:ARmJtpN:ARmKpED:ARmKygv:ARmMLLU:ARmOeRQ:ARmPlvz:ARmQkMR:ARmRsvv:ARmSgyo:ARmVGKG:ARmkQcf:ARmpZpa:ARmrQnU:ARnKlUE: +ARnOgaV:ARnVfyV:ARnWHEB:ARnabYz:ARncUno:ARngxmD:ARnijGF:ARnkPKZ:ARnqdGC:ARnuxTy:ARnvZRm:ARnwnBL:ARnzgoJ:ARoCiAi:ARoFoMx:ARoGKGT:ARoJSvP: +ARoJwaR:ARoLpFv:ARoNtDR:ARoTiAI:ARoXKGt:ARoZYXw:ARofkUx:ARoojgO:ARowdgJ:ARoxaal:ARoyCgX:ARoySXm:ARpENcW:ARpGQOk:ARpVyXl:ARpWKKd:ARpgdwr: +ARpnZAG:ARppjUp:ARppyiZ:ARpqsvB:ARpvkht:ARpyswv:ARqDwMr:ARqFtsK:ARqHHVn:ARqICuP:ARqMGqS:ARqRJpu:ARqRuMS:ARqRygH:ARqWdyv:ARqlivy:ARqqDoH: +ARqsTla:ARqtZaL:ARqvyIQ:ARrAZgm:ARrCQgV:ARrEnNY:ARrOvtZ:ARrUNcs:ARrXWoB:ARraITu:ARraoYo:ARrbouw:ARrdbtO:ARrnFja:ARrwcsl:ARrxWqx:ARsBYWm: +ARsCYsQ:ARsGZGZ:ARsHnIi:ARsIQGa:ARsKnnn:ARsMVuL:ARsNzLH:ARsOrJk:ARsaJGF:ARsfAPR:ARslbTx:ARsvFJV:ARtFzhR:ARtLzbY:ARtOwPP:ARtVpup:ARtbsiJ: +ARtcEsn:ARtiUGx:ARtoPqc:ARtpPqC:ARtqBgf:ARttEsN:ARtzKHH:ARuDkMk:ARuUwpK:ARuVbwg:ARuiOGc:ARunQNy:ARuuPQx:ARuzkaM:ARvFYxq:ARvKoFd:ARvOjyp: +ARvSJWP:ARvSRmu:ARveSOq:ARvfsWg:ARvgxyz:ARvhHwq:ARvirkJ:ARvkqEZ:ARvliDd:ARvoJzw:ARwEluu:ARwHbbr:ARwIgAf:ARwPyzY:ARwUlIh:ARwWjYO:ARwbDUw: +ARwikUa:ARwqrKu:ARwsgOZ:ARwvRZy:ARxALtv:ARxCtSi:ARxHyXe:ARxIsDx:ARxRLWx:ARxepL:ARxjkoV:ARxnMnh:ARxndP:ARxqZAn:ARxsjUY:ARxsyis:ARxzcNg: +ARyDJpn:ARyDuMH:ARyDygS:ARyGSnk:ARyMffK:ARyNeHY:ARyNsdA:ARyUNGz:ARyVLTO:ARyXtsP:ARydPk:ARyekrK:ARyhrBr:ARyipOV:ARyokHD:ARypsWF:ARywZaw: +ARyyyIj:ARyzNjz:ARzBOjA:ARzDrKY:ARzGSvb:ARzNbyk:ARzTKfq:ARzXzlv:ARzZjhK:ARzabqF:ARzbtGA:ARzeSTY:ARzehQy:ARzhvfy:ARzjmOh:ARzjuna:ARzvQHD: +ARzxcsE:ASAERgA:ASAGOPr:ASAGrBt:ASAIfES:ASAIvyQ:ASAMHtm:ASAQuFM:ASAWkPt:ASAaYpv:ASAjqMU:ASAnIqE:ASAoyrV:ASAqDtN:ASAwQKF:ASAxQKf:ASBIZdT: +ASBVYGN:ASBZDFF:ASBbnna:ASBcIcO:ASBjuiy:ASBwqOU:ASByTKC:ASCAUpO:ASCFsnr:ASCIKYo:ASCIiyv:ASCIyYy:ASCJqMh:ASCLHHP:ASCfuhX:ASCjcz:ASColvp: +ASCoxXE:ASCpMEh:ASCzmRR:ASDBuw:ASDMpzk:ASDNFLv:ASDSJoz:ASDVUJV:ASDgxu:ASDidWl:ASDliJK:ASDnGop:ASDosRl:ASDpujW:ASDthPD:ASDvpdA:ASDxpLl: +ASEBkaz:ASEFOFW:ASEHNGm:ASEJWEi:ASEPwur:ASEQDRI:ASERpZB:ASETTCp:ASEUecn:ASEYJOs:ASEdEft:ASEdIuo:ASEgibZ:ASEhyQq:ASEiHfC:ASEiJYl:ASEilnq: +ASEjThy:ASElTyu:ASEodwe:ASEusre:ASExmqK:ASEzNOe:ASEzonq:ASFGytA:ASFHDrz:ASFIJvv:ASFIpuv:ASFJADl:ASFRfvv:ASFUXQe:ASFWsQv:ASFfQJf:ASFfiRg: +ASGHbkS:ASGIoCh:ASGMDRQ:ASGRiHV:ASGbkxs:ASGieoj:ASGkEwI:ASGkbfp:ASGnuAb:ASHDkpR:ASHJHTK:ASHNufk:ASHRRGg:ASHRzZZ:ASHVfeu:ASHVvYw:ASHYQb: +ASHbBWM:ASHbLUF:ASHoHX:ASHuSIT:ASHuuHY:ASHvuBV:ASIAehi:ASIBhak:ASIJUsT:ASIJoyT:ASIPWRe:ASIfere:ASIgBwb:ASIgLui:ASImdlW:ASIviQA:ASIwmaS: +ASIzwnT:ASJDMhX:ASJIHhr:ASJOIRf:ASJbro:ASJfmrP:ASJoJeu:ASJtfkK:ASJtvfe:ASKEgXd:ASKJMHS:ASKSAsU:ASKVocu:ASKXtek:ASKYADW:ASKYypT:ASKfWWF: +ASKkvFN:ASLBiPW:ASLDPmW:ASLDyCj:ASLVhia:ASLYsGY:ASLaEFZ:ASLaIUA:ASLdmQE:ASLhXzr:ASLktLt:ASLpSTy:ASLpTyO:ASLqORA:ASLqbtk:ASLvcNF:ASMCnnY: +ASMCwuk:ASMKNGt:ASMOUjF:ASMUQwy:ASMWFlf:ASMZzVz:ASMgEfm:ASMgIuv:ASMhDrc:ASMhxnc:ASMkyQh:ASMpXZE:ASMrKGw:ASMxStN:ASMxTYx:ASMxXtw:ASMyuJG: +ASNKQPp:ASNKlTj:ASNQGep:ASNXboU:ASNYytH:ASNihwr:ASNkHMn:ASNveOH:ASOCxZv:ASODiHM:ASOEmmy:ASOJJSO:ASONOPj:ASOSYAS:ASOTxZV:ASOYfVF:ASOohWk: +ASOteD:ASPGnLq:ASPOlDg:ASPQwEd:ASPSwgv:ASPevpa:ASPhuHp:ASPkhRB:ASPmHPW:ASPoNmf:ASPsAFS:ASQAsXn:ASQCtxl:ASQEhat:ASQJsSl:ASQKRgw:ASQKzzJ: +ASQLOPd:ASQLrBb:ASQOfEe:ASQOvyg:ASQRGMm:ASQbVhj:ASQcIqS:ASQfDtX:ASQmvPX:ASQoubF:ASQuHpn:ASRBbJp:ASRCoCW:ASRDAdu:ASRDyPv:ASREtEI:ASRGMhq: +ASROZdf:ASRVpF:ASRjkce:ASRoMeC:ASRqEtZ:ASRqkJX:ASSDDfm:ASSFIrV:ASSIocN:ASSKteP:ASSMMHh:ASSfJEE:ASSuuIr:ASSzbvr:ASTBkgH:ASTIoSM:ASTYhiH: +ASTalhf:ASTcIhk:ASTeujy:ASTfxBE:ASTihPj:ASTlLe:ASTsSTP:ASTsTyf:ASTsXTi:ASTyMhI:ASUIdpw:ASUJkGq:ASUKipG:ASUMPMG:ASUMycz:ASUQlj:ASUVIab: +ASUbpDv:ASUhqLj:ASUkXzm:ASUmmqU:ASUpcnv:ASUzOrQ:ASVLyto:ASVMADB:ASVNJvX:ASVNpuX:ASVObkS:ASVcgIS:ASVkyrk:ASVmeqJ:ASVrJZK:ASVvBjF:ASVwQkN: +ASVxQkn:ASWEYAZ:ASWEdWt:ASWNoCZ:ASWNrpI:ASWRDRc:ASWgltk:ASWigiD:ASWkBrj:ASWozNw:ASWzsKN:ASWzzYR:ASXBVdP:ASXUCsH:ASXUefJ:ASXfAFH:ASXlswr: +ASXzqma:ASYDGMd:ASYEWRs:ASYMwGF:ASYaSim:ASYcNzJ:ASYllIO:ASZVsNf:ASZYiYb:ASZYyym:ASZfbVt:ASZgYAJ:ASZhOVD:ASZszOT:ASZvuHL:ASaEQF:ASaFuJB: +ASaLsMS:ASaPxSv:ASaQqNb:ASaRMvM:ASaUtiW:ASaXhaF:ASaYehD:ASajqiM:ASaliQl:ASayGYo:ASbUgxp:ASbZMhG:ASbaguh:ASbalIR:ASbfQYv:ASbjNnP:ASbkOVm: +ASbpMqF:ASbvWwR:AScBKYk:AScBiyr:AScGNiO:AScJUpK:AScOsnv:AScPsnV:AScXNio:AScZzkO:ASchlvt:ASchxXA:ASckijJ:ASclzoD:AScqBkk:AScqMdt:AScssBk: +AScuLzf:AScyMEl:ASdJOfb:ASdSnNU:ASdSwUg:ASdaZmx:ASdazqY:ASdemHP:ASdflht:ASdhsRp:ASdiCic:ASdmNop:ASdmoNd:ASdrdWp:ASdwEFa:ASdwIUz:ASdxDRo: +ASdxxNo:ASeEUjS:ASeKkav:ASeLlMR:ASeMFls:ASeTWEE:ASeZDRE:ASecMHb:ASeepDD:ASehKGb:ASeklHM:ASemGOu:ASensri:ASeowft:ASepCl:ASeqDPY:ASeshpA: +ASexdwi:ASfARyT:ASfAWxH:ASfDbka:ASfIScm:ASfJkqT:ASfOsUZ:ASfSbBS:ASfSxzz:ASfTihA:ASfUmMu:ASfWkPp:ASfZJsC:ASfaKcu:ASfaveh:ASfkorj:ASfmbHi: +ASgKdrF:ASgVyTF:ASgXJVq:ASgXpUq:ASggrtp:ASgiKCN:ASgivES:ASgmJzB:ASgosKP:ASgozYL:ASgsoRQ:ASgubhR:ASgwuAn:ASgxtjX:AShCGKw:AShMUSG:AShMkpN: +AShMoYG:AShQsxb:AShUhAx:AShXZow:ASheGyq:AShgqIs:AShrVHf:AShvDTT:ASiARgl:ASiAzzQ:ASiSUsP:ASiSkPY:ASiSoyP:ASiWsXu:ASiYtxw:ASiamaw:ASioera: +ASiqBwF:ASiqLuM:ASivsWk:ASjEZdK:ASjFzKM:ASjOqmn:ASjRYGQ:ASjVASZ:ASjXIRb:ASjYoCz:ASjeMen:ASjlYAX:ASjpmrt:ASjsSh:ASjsqOJ:ASkLkRv:ASkaeYo: +ASkbuhu:ASkoWWB:ASkqYas:ASlACup:ASlBEdu:ASlCKCh:ASlEnNJ:ASlEwUx:ASlFDrC:ASlGpzH:ASlMNgg:ASlOWec:ASlWlmt:ASlYbut:ASlYdPc:ASlZkge:ASlcIoE: +ASledGh:ASlejfI:ASlhiJh:ASliZyn:ASljGoS:ASlliBP:ASlofWP:ASlrpdb:ASmDJOv:ASmGEDZ:ASmIKcg:ASmLDRL:ASmOecK:ASmPTCU:ASmaXzv:ASmcmqN:ASmhTyP: +ASmiIOJ:ASmkdgg:ASmkjFF:ASmnijg:ASmoZYa:ASmocMQ:ASmpOrJ:ASnBsUC:ASnCytd:ASnDJvs:ASnDpus:ASnGeHG:ASnImML:ASnLJsz:ASnUdTp:ASnUlTF:ASnWihX: +ASnetJz:ASnpMbp:ASoDoCo:ASoFbOp:ASoPGEu:ASoPtwx:ASoPzIZ:ASoWXqI:ASoXsqz:ASoZQpu:ASoZdtY:ASoZlto:ASodlKu:ASodxlX:ASoeeoM:ASofEwN:ASofbfw: +ASooGDE:ASooeyX:ASovMBy:ASoxhWw:ASozHmk:ASpOqne:ASpTGmx:ASpUWro:ASpUiW:ASpWeHC:ASpcjxN:ASpeIQF:ASpqSIq:ASpsNZV:ASpybMC:ASqFaJR:ASqNldb: +ASqQZOG:ASqSTJc:ASqVnlt:ASqijXG:ASqjhrG:ASqlHpR:ASqnNMc:ASqtvPd:ASrGDFp:ASrLoCS:ASrNtEM:ASrWkrT:ASreMqT:ASrhTKu:ASrpfkf:ASrpvfH:ASrsFfa: +ASsBChm:ASsFMHl:ASsGbBp:ASsMAsj:ASsQbjm:ASsRocJ:ASsSADh:ASsSypk:ASsTteT:ASsYYga:ASsbWWy:ASsikCx:ASskgUC:ASskliy:ASsmTkL:ASspJEa:ASsyFFx: +AStAWej:AStFupv:AStIQWc:AStMumw:AStRhiL:AStSsGt:AStWCIF:AStWJyg:AStYMHh:AStaTHz:ASteTn:AStoDpV:AStpxBa:ASuApZx:ASuEOFm:ASuGJOi:ASuHosp: +ASuIWES:ASuJNra:ASuQQwZ:ASuUuMN:ASuVbJ:ASuXhIu:ASubIHV:ASucEfN:ASucIuU:ASuduJD:ASuhhpW:ASuiThC:ASundOB:ASuqqLn:ASurStm:ASurXtT:ASuwDPo: +ASuxMHt:ASvCOpp:ASvIihW:ASvOJsU:ASvXdRk:ASvYeHH:ASvrznd:ASvtuaC:ASwCkpY:ASwIXqP:ASwKsqC:ASwLQpl:ASwLltv:ASwNbKH:ASwSGEL:ASwStwA:ASwSzIc: +ASwUJSJ:ASwWoCV:ASwWrpE:ASwbgiH:ASwdBrf:ASwkhWN:ASwmHmR:ASwnyBd:ASwwlKL:ASwwxla:ASwyQjs:ASwyirr:ASwzyRp:ASxAOpZ:ASxCnLV:ASxVujN:ASxWGmS: +ASxavpF:ASxbuBx:ASxgVHT:ASxiHPp:ASxkDTf:ASxolix:ASxpwyC:ASxzqIA:ASyARoM:ASyCCSo:ASyCeFm:ASyFTJz:ASyGxM:ASySwex:ASybNMZ:ASyfmai:ASyiqMf: +ASyksWu:ASyuAfO:ASzEMcR:ASzFHhx:ASzGHXe:ASzRKyg:ASzRyyq:ASzWNIC:ASzZUPG:ASzeFff:ASziuiH:ASzobVh:ASzqnnP:ASzxlVx:ASzxxxM:ATAEMdF:ATAEsEr: +ATAHsDp:ATAMKKz:ATAOHBT:ATAQygD:ATAXobm:ATAYhQq:ATAcUqy:ATAebrN:ATAjQvM:ATAoKsR:ATAoeMP:ATAvMKS:ATBBcll:ATBFNWV:ATBFWLd:ATBKEZx:ATBNlOH: +ATBOjve:ATBRnKm:ATBdivY:ATBhmGH:ATBiISt:ATBjiqZ:ATBlUsH:ATBoYhG:ATBtPUs:ATBvDvN:ATByQub:ATCJkzc:ATCMdKH:ATCOebi:ATCPDih:ATCRIiX:ATCTYze: +ATCTofK:ATCTpTX:ATCUjVr:ATCedIt:ATCfqFg:ATCiuF:ATCjiVN:ATCoIsc:ATCqilN:ATCrxcr:ATCtMhJ:ATDCSLG:ATDEPlw:ATDEjow:ATDGXcg:ATDIRaQ:ATDIrFD: +ATDKKIm:ATDLTNU:ATDLZpw:ATDQRdn:ATDTSHW:ATDVDMt:ATDVLMB:ATDVqIX:ATDXXcG:ATDZMTH:ATDbeNc:ATDnQBV:ATDuqFh:ATDxKAy:ATECsZy:ATEEOZk:ATEERix: +ATEGBVt:ATEHhEq:ATELfds:ATENDNE:ATENyXk:ATEQJby:ATESket:ATEdZFW:ATEeLRq:ATEgenJ:ATEhnEQ:ATEjLga:ATElTsw:ATEyHNs:ATFIrVY:ATFMZDo:ATFcDUY: +ATFfHKj:ATFjntN:ATFunEe:ATGGASV:ATGJjOv:ATGLUSh:ATGOrvP:ATGWNup:ATGdbnE:ATGdllN:ATGkihk:ATGkogu:ATGpBtN:ATGxUqq:ATGzUbI:ATHEsdR:ATHGCYw: +ATHQmqy:ATHUoBO:ATHXZRh:ATHZGaN:ATHgQVo:ATHhgbe:ATHitRy:ATHvmhX:ATICcqq:ATINajv:ATIPikN:ATIRBsq:ATISOzV:ATITLyL:ATITYiw:ATIWmQp:ATIbwdl: +ATIcwNe:ATIdyxt:ATIgnWg:ATIntrP:ATIzKZd:ATJGUiz:ATJJLtq:ATJJNDh:ATJMBlQ:ATJMDIF:ATJNfaI:ATJOBdw:ATJQYZK:ATJQoFe:ATJQptv:ATJXiXS:ATJYKYk: +ATJZXDT:ATJZmQd:ATJbnvj:ATJbvFJ:ATJcFNu:ATJcqfI:ATJfTUU:ATJjMQJ:ATJmBmj:ATKTAGM:ATKWyGA:ATKYOjL:ATKamgx:ATKcCTr:ATKmPuC:ATKqLQg:ATKqoN: +ATKsiQj:ATKuUSx:ATKyHik:ATLHDMs:ATLHLME:ATLOFoP:ATLPKhN:ATLUeeA:ATLaIUn:ATLhhTA:ATLkLMt:ATLobKu:ATLqOkp:ATLrXUr:ATLsZwh:ATLuUxO:ATLxEhb: +ATMEBri:ATMFjJN:ATMJxhT:ATMMDmD:ATMMLmr:ATMMqih:ATMOIQl:ATMeVKe:ATMgIuy:ATMlHNJ:ATMnhtV:ATMqLmc:ATMsGpL:ATMubkb:ATMzBqD:ATNIgyx:ATNTXeR: +ATNbWWQ:ATNiYKZ:ATNqoyx:ATNzhIt:ATODzVz:ATOJNui:ATONgTl:ATOVRFu:ATOgMxm:ATOzhdz:ATPALYj:ATPAYIQ:ATPLHby:ATPOyGI:ATPQseQ:ATPUQtD:ATPYPez: +ATPcsSJ:ATPfKzb:ATPoCbV:ATPrbRc:ATPuyEX:ATPvlCn:ATQCikw:ATQEBsH:ATQGCk:ATQGLyu:ATQGYiN:ATQNnpX:ATQQZrX:ATQagBU:ATQhFRZ:ATQissU:ATQrVEZ: +ATQuCbT:ATQuiEJ:ATQvBos:ATQwyxM:ATQxooC:ATRClOz:ATRKiXx:ATRMmQO:ATRQAgo:ATRZafI:ATSEYfU:ATSGIiF:ATSJFDk:ATSLHPP:ATSQcpZ:ATSVBLA:ATSVDiV: +ATSWAGT:ATSZofu:ATSZpTf:ATSbDVg:ATSdQUk:ATSeXwE:ATSedkE:ATSgcPi:ATSlCww:ATSusmh:ATSuxmQ:ATSvBMz:ATSvokP:ATTAFoY:ATTCayD:ATTHeeh:ATTLDKN: +ATTYIDV:ATTfZwA:ATTnjCJ:ATTtqro:ATTzkzF:ATUAIQk:ATUDGfL:ATUFFrc:ATUFJbG:ATUFefA:ATUQEqt:ATURDkW:ATUSRAF:ATUSrfS:ATUfCsC:ATUlIkq:ATUlqsp: +ATUnYKS:ATUtjcS:ATUvSRA:ATVBavL:ATVFaeu:ATVGXeK:ATVJILr:ATVJgRX:ATVPStB:ATVTXjg:ATVUQws:ATVXSaM:ATVZTAO:ATVdoya:ATVlUdu:ATVuWWH:ATVxDUK: +ATWAUSz:ATWHaVE:ATWMXEB:ATWPhmq:ATWPxGB:ATWRgYh:ATWWzVQ:ATWYtSu:ATWdyij:ATWiLPl:ATWjoYh:ATWmhdQ:ATWpHkQ:ATWrYkJ:ATWuwyp:ATXMuIZ:ATXUMDR: +ATXUsef:ATXXsdd:ATXeNwm:ATXfizC:ATXhHYk:ATXkmhn:ATXohDy:ATXsUQm:ATXubRZ:ATXzQVY:ATYAhaQ:ATYEHBI:ATYFygy:ATYQCyh:ATYfCBf:ATYliZJ:ATYnHyb: +ATYoKZR:ATYqGLi:ATYqLpS:ATYznWQ:ATZBYFw:ATZDBde:ATZLUih:ATZOKXg:ATZmiFN:ATZrSKx:ATZudiH:ATaFuiJ:ATaLSwW:ATaRHge:ATaRbk:ATaTTK:ATaVZrN: +ATablcG:ATahIsk:ATahhdi:ATanFRl:ATaoiZS:ATazwdC:ATbBKXH:ATbCtzb:ATbKclh:ATbPNWr:ATbRPcp:ATbTtzB:ATbVgfZ:ATbcBmW:ATbexCa:ATbhYhC:ATbjtQK: +ATbqmGL:ATbrWyq:ATbsCtF:ATbxMHy:ATbyFNH:ATbyqft:ATbzOWC:ATbznvW:ATbzvFw:ATcAnkv:ATcGqnm:ATcJEzc:ATcMloS:ATcQcLw:ATcSkzo:ATcUNwM:ATcVdKD: +ATcWPCO:ATcbxCQ:ATccPuh:ATcdZHa:ATceDVU:ATciiQA:ATckUSS:ATcsiVB:ATcwmgS:ATcxIso:ATcyCTY:ATczgVT:ATdCYDA:ATdFkEA:ATdHayv:ATdJBvA:ATdPDnP: +ATdUBRe:ATdVjjB:ATdZxHX:ATdajCx:ATdcSrj:ATdebsu:ATdiZws:ATdkUxT:ATdoKAE:ATduVki:ATdwIUu:ATeDwAP:ATeFXCb:ATeHRAT:ATeHrfA:ATeJKih:ATeKYdx: +ATeNFYn:ATeRSlB:ATeSYMe:ATeTPLr:ATeTjOr:ATeWEqF:ATeYMtM:ATembSL:ATesLgm:ATfBrVE:ATfJAsC:ATfTzvv:ATfWtsr:ATfZNUe:ATfbzi:ATfgbNP:ATfmDUe: +ATfnvQg:ATfwMXa:ATgGgYV:ATgPASZ:ATgeHko:ATgghiz:ATginTK:ATgsJAO:ATguihG:ATguogY:AThNoBK:AThSiKC:AThWLYA:AThWYIz:AThcKSt:AThcemv:AThfwnh: +AThjoGa:AThlMku:AThoGlR:AThoLPh:AThqgba:AThysSa:ATiFCyz:ATiIGAC:ATiPmQt:ATiTobB:ATifQvb:ATigUPN:ATigffF:ATioNWV:ATiumHU:ATixtrt:ATjDPci: +ATjLOJA:ATjUYFA:ATjWIIR:ATjcISI:ATjdmGu:ATjfiqg:ATjmxcw:ATjoZhG:ATjoztf:ATjrDvs:ATjuXWQ:ATjudKQ:ATkAfJ:ATkLDiK:ATkNBDz:ATkPYzF:ATkPofh: +ATkVUIw:ATkYqnb:ATkaOws:ATkanVg:ATkavfG:ATkbFnx:ATkbqFD:ATkfiVm:ATkiWYA:ATkkilm:ATklBMg:ATklokM:ATknxcQ:ATkwifQ:ATlAfDy:ATlCXcD:ATlEMTK: +ATlFTNv:ATlFZpT:ATlGKIN:ATlLxHg:ATlNSHt:ATlPCGj:ATlSDnO:ATlSyxa:ATlTGFx:ATlVFRW:ATlVJBs:ATlVeFu:ATlYFot:ATldLMp:ATlhbKq:ATljIUj:ATloHnY: +ATlqqFK:ATlvCSw:ATmCBVQ:ATmDdKW:ATmIBRp:ATmOkeQ:ATmSRDB:ATmSoIw:ATmYIQP:ATmaLRT:ATmaXuy:ATmbIkJ:ATmbqsK:ATmdYKh:ATmlGpP:ATmpIue:ATmwqfD: +ATnPfIc:ATnQUsf:ATnXavY:ATndQPI:ATnmQtU:ATnonCU:ATnqnEB:ATntyIv:ATnyLpp:ATnzoyt:AToCASs:AToKrvu:AToMzVF:AToNtSB:AToQoIY:AToSNuU:AToeJAF: +ATonMxQ:AToqVIE:ATowvqW:AToyhis:ATpAnPK:ATpFiKd:ATpOWdL:ATpOmzZ:ATpQhAm:ATpUHbu:ATpctRZ:ATpjcdS:ATpxCBG:ATpxieY:ATqJajK:ATqPLyq:ATqPYiJ: +ATqUmZM:ATqVhQg:ATqWhaz:ATqXPEa:ATqbssQ:ATqcyec:ATqeKZy:ATqjgBQ:ATqocDd:ATqpcDD:ATqqogQ:ATqtyeC:ATqyUPW:ATrEKXz:ATrJfaf:ATrTcPe:ATrYZoC: +ATrZUtT:ATrbTUz:ATrkLWQ:ATrnmqN:ATsBloE:ATsJyFv:ATsPAGP:ATsUOjQ:ATsZixG:ATseFna:ATskDVc:ATsmQUo:ATsoiQw:ATtBLMh:ATtBqIr:ATtCCGC:ATtDEQi: +ATtEDnF:ATtEyxh:ATtJBRs:ATtPYmJ:ATtQeel:ATtXYDW:ATtbhTl:ATtdKAS:ATtgLMY:ATtiGPv:ATtkbKX:ATtoZwE:ATtpLGB:ATtqBEz:ATtqIDN:ATuEoIh:ATuICgZ: +ATuRaYY:ATuWdKh:ATuaVKF:ATucIuZ:ATufHNi:ATuoGpo:ATuqbkA:ATuuIku:ATuuqst:ATuwYKW:ATvKavp:ATvRwkE:ATvSfIJ:ATvTEQi:ATwCQWV:ATwFNuN:ATwGTpc: +ATwGjOH:ATwIIlw:ATwKEqp:ATwQaVI:ATwUaEp:ATwVXEN:ATwYfis:ATwkUDp:ATwmQpY:ATwsoYd:ATxGGaD:ATxIcQR:ATxLseT:ATxNMDN:ATxNsez:ATxVuIF:ATxdLPF: +ATxhKSZ:ATxhemX:ATxiwnF:ATxmnwD:ATxnoOy:ATxrlCK:ATxxISg:ATxxhDe:ATyKKKK:ATyTMdW:ATyTsEc:ATydNWh:ATyjmHk:ATylUPp:ATylffx:ATzIXDb:ATzImQR: +ATzLgfq:ATzVafT:ATzZEZW:ATzjXWC:ATzjdKC:ATzlcpo:ATzrxce:ATztZhU:ATztztt:AUACYZa:AUAGjvi:AUANftv:AUAOqkF:AUAWGKo:AUAbbvY:AUAqrWq:AUAqtUT: +AUAvxgO:AUAylwE:AUAyxOV:AUBDGPe:AUBIVgN:AUBMCcM:AUBMdKD:AUBNPdm:AUBOGZz:AUBUbYg:AUBVyxh:AUBWAPm:AUBeLtP:AUBiypJ:AUBjbVn:AUBltkL:AUBrqiJ: +AUBwrwF:AUBwtuc:AUCIawe:AUCLWnF:AUCMnnU:AUCfstc:AUCgvEQ:AUChrho:AUCwopH:AUCznnC:AUDBJJd:AUDDIxS:AUDFXwW:AUDIjVJ:AUDKoJa:AUDLegA:AUDMIeB: +AUDNUvS:AUDTtjy:AUDYBW:AUDYlhG:AUDcNMm:AUDhtFw:AUDieJg:AUDkePb:AUDnlVW:AUDsasm:AUEDunh:AUEHren:AUELOrc:AUEVyiC:AUEbiQe:AUEcqIL:AUEdsWS: +AUEgAzK:AUEkGFP:AUEkaga:AUEocqj:AUEozPQ:AUEpTDu:AUFJXob:AUFJuNQ:AUFRePM:AUFXBFr:AUFbJxL:AUFdoxX:AUFhFhg:AUFhaGJ:AUFiEWQ:AUFkswJ:AUFlfIV: +AUFoAZr:AUFrgEP:AUFupaI:AUFvyNt:AUFwcQS:AUFwzph:AUGHFQa:AUGHhbr:AUGHxud:AUGIzIE:AUGJIjW:AUGNDKb:AUGOYnh:AUGUKTj:AUGXpsz:AUGdZAk:AUGdsJF: +AUGiqVk:AUGlkwI:AUGpdby:AUGtbzp:AUHBaxV:AUHClim:AUHLRVe:AUHNFqx:AUHNhBk:AUHOrAL:AUHOxZc:AUHPIJN:AUHkbZI:AUHskWp:AUIAqkO:AUIFeNj:AUIHHap: +AUIHbvj:AUINktF:AUIYHMh:AUIaTWT:AUIbQat:AUIebvp:AUIgUCT:AUIpkjx:AUIrCha:AUIvNXO:AUJIAPj:AUJKRpX:AUJLcTP:AUJMZHt:AUJNenS:AUJPKtG:AUJQRzM: +AUJQisH:AUJTUHY:AUJWfTf:AUJXrEa:AUJZODD:AUJelMW:AUJgTwm:AUJgaKd:AUJoKIt:AUJsBfh:AUJsXun:AUJvVHM:AUJwvLr:AUJxkJA:AUJzCHX:AUKElHY:AUKJFnL: +AUKQNWg:AUKVsbA:AUKavRV:AUKgAAm:AUKjopo:AUKstfI:AUKvejY:AUKylvi:AULRaWU:AULVuKM:AULanNs:AULdrIB:AULebtO:AULglPq:AULpoPx:AULsySl:AULvYpO: +AULyVpa:AUMCuEY:AUMNPCv:AUMOepo:AUMSeBQ:AUMTuNF:AUMUOej:AUMcnEl:AUMfnDD:AUMifit:AUMkWAz:AUMmywQ:AUMpNJR:AUMrKRg:AUMxtHk:AUNBLOB:AUNCGZq: +AUNEcGt:AUNJlYB:AUNUORs:AUNWFcS:AUNZris:AUNcaQs:AUNjFaV:AUNmVxH:AUNoHkK:AUNqFyV:AUNtCF:AUNvNjY:AUNxKrl:AUOIRvC:AUOJLYf:AUOKhbM:AUOUMNZ: +AUOUQL:AUObGMX:AUOcdbF:AUOdfzc:AUOgZAT:AUOgsJy:AUOjXeC:AUOkZvC:AUOlBQT:AUOrusU:AUOshoE:AUOuFlN:AUOzNye:AUPCIJg:AUPFYNX:AUPGDkR:AUPLrBV: +AUPORVL:AUPPrAe:AUPPxZJ:AUPQFqQ:AUPQhBB:AUPQxUT:AUPUMju:AUPVvAG:AUPekWy:AUPhGmW:AUPjYlb:AUPmsjv:AUPpVos:AUPsFsf:AUPtlcT:AUQALjB:AUQCyXM: +AUQFAKU:AUQJLNT:AUQJtDv:AUQLHMs:AUQNQLR:AUQOKkO:AUQTRCE:AUQYeNq:AUQZZhV:AUQfyQe:AUQjNXt:AUQnbJT:AUQskjc:AUQyUCo:AURAbVz:AURBghh:AURDRzd: +AURDisa:AURLrYS:AURNQwU:AURUKKD:AURWkTV:AURazbI:AURbxGv:AUReBx:AURfBfA:AURfXuG:AURkQAd:AURlCHQ:AURnIca:AURvITL:AUSBnnk:AUSGYXh:AUSISAc: +AUSPYVq:AUSPeke:AUSYLTR:AUSZDFZ:AUSZiGy:AUSbbTa:AUScmPw:AUSeVPo:AUSftfp:AUSlvEo:AUSnBOr:AUSoQdr:AUSpIbQ:AUSsrXn:AUSuFVQ:AUSyozi:AUSzPNM: +AUTFcdR:AUTGTgl:AUTNjVd:AUTPoJO:AUTRIel:AUTTPpB:AUTUJJJ:AUTUeeR:AUTVYvx:AUTVeKl:AUTWnNB:AUTYXwy:AUThqgg:AUTojLo:AUTpsTt:AUTqveF:AUTrrHx: +AUTuocb:AUTvuCz:AUUEeBX:AUUFrIq:AUUGuNo:AUUIWOn:AUUKHCt:AUUddQB:AUUeKRN:AUUtcqx:AUUtzPC:AUUynDm:AUVAGcZ:AUVJeba:AUVLrih:AUVNWoW:AUVPcjV: +AUVQHcm:AUVRrEE:AUVUFku:AUVUPsq:AUVWVif:AUVfWBw:AUVfumX:AUVggEb:AUViNjb:AUVkKrW:AUVpHkp:AUWAFiB:AUWAHeE:AUWCvaa:AUWIvch:AUWMpsL:AUWQyvg: +AUWZyQR:AUWalCr:AUWmVOU:AUWmqo:AUWnkbo:AUWruHr:AUWtuys:AUXSzij:AUXThrc:AUXaIHr:AUXaQvh:AUXeBqD:AUXeXCP:AUXgYDs:AUXkuSE:AUXmfZs:AUXsXES: +AUXtFIB:AUXvkBV:AUXzuhK:AUYBKkf:AUYGryq:AUYHgol:AUYMgHJ:AUYNHaB:AUYNbvX:AUYORZF:AUYOiSC:AUYPHvN:AUYTGpi:AUYYVGB:AUYaGmD:AUYcVhf:AUYekjj: +AUYgChs:AUYkXJG:AUYlUCF:AUYwDsp:AUYyJPP:AUYyyPF:AUYzbvb:AUZALnd:AUZAtdF:AUZCHmC:AUZEQlb:AUZJLJr:AUZKGhk:AUZMAke:AUZPvIw:AUZUHVw:AUZebjd: +AUZhITW:AUZjHTi:AUZmyqU:AUZsoYF:AUZtKIF:AUZxBfZ:AUZzlMe:AUaCUhm:AUaFpbo:AUaIqUc:AUaKctd:AUaQGzi:AUaisnA:AUajrWu:AUajtUP:AUakXJa:AUaulmC: +AUawTWy:AUawakp:AUbBYzj:AUbNqKM:AUbOJOj:AUbVSlU:AUbVjVb:AUbexGD:AUbprwz:AUbstkp:AUbyqiv:AUcBKKK:AUcLYXz:AUcNojt:AUcOSAQ:AUceIbC:AUclejr: +AUcosto:AUcsehD:AUcubyn:AUcwNSF:AUdDDfa:AUdDigB:AUdELti:AUdLnNP:AUdWUvO:AUdcJpo:AUddTym:AUdePnV:AUdkuCh:AUdlYpz:AUdvveT:AUdwlVK:AUdynNF: +AUdzrIw:AUeDSMw:AUeEepx:AUeMXOW:AUeMund:AUeNcJQ:AUeSGzm:AUeUcgh:AUecegr:AUedJXY:AUegoXm:AUekFHR:AUeqAzg:AUesaqo:AUezFAJ:AUfGrEk:AUfKORf: +AUfSuNm:AUfYGZd:AUffAZN:AUfjGfU:AUfjaGd:AUfmoxd:AUfrqiI:AUgAhRH:AUgDbZF:AUgFFiP:AUgFHeW:AUgGIhm:AUgGecY:AUgHEs:AUgHvas:AUgKMNa:AUgMgbF: +AUgNXCf:AUgSIjS:AUgWDKf:AUgXYnl:AUggetA:AUgnVUy:AUgohIP:AUgukwM:AUhEUVR:AUhGCln:AUhHziX:AUhKMjX:AUhKaxR:AUhNqA:AUhRGTc:AUhTKtw:AUhWpSg: +AUhYIJJ:AUhhqvv:AUhlYDA:AUiAPDW:AUiBCCw:AUiKSWH:AUiMRPE:AUiNVGt:AUiQHat:AUiQbvn:AUiTRZp:AUiTiSu:AUiUqc:AUiaeHE:AUieFhp:AUigkCZ:AUikoWc: +AUilDsF:AUirxgb:AUitrq:AUivBFU:AUivXUS:AUjAfTB:AUjEvIa:AUjHSlj:AUjRgOC:AUjYKtC:AUjZHVa:AUjaLts:AUjdbVM:AUjeypi:AUjftko:AUjlqii:AUjsrwe: +AUjvUci:AUjyzbd:AUkBAvI:AUkSFnH:AUkVcDf:AUkklpB:AUkpAAi:AUksopk:AUkwriQ:AUkxNSi:AUkxqGS:AUlDjVO:AUlEsBZ:AUlTlhB:AUlYFNW:AUleeJB:AUlfePg: +AUlvAav:AUlyoPt:AUmFwKr:AUmMBfL:AUmQGCV:AUmZeBm:AUmbWAF:AUmcKRx:AUmcuYt:AUmdywm:AUmeaqd:AUmgJXr:AUmjnEP:AUmvuMT:AUmwgen:AUmyNJn:AUnAjEL: +AUnFXoG:AUnFuNt:AUnNePh:AUndEWT:AUnfswO:AUnhfIs:AUniKrC:AUniuyO:AUnlyWV:AUnrnek:AUnsFaZ:AUnwthl:AUoDFQB:AUoDhbQ:AUoDxuG:AUoFIjt:AUoJDKA: +AUoOKTI:AUoXlIw:AUokGMD:AUopbzS:AUoqQVd:AUouBQH:AUpGJNh:AUpHRVH:AUpILym:AUpIRuV:AUpJFqU:AUpJhBF:AUpJxUP:AUpLIJc:AUpPDkV:AUpTMnQ:AUpUXcV: +AUpVgBv:AUpcFLe:AUpfsjr:AUpglaB:AUpiXEH:AUpjZVH:AUpqGmS:AUprdBM:AUptFLE:AUpuVuI:AUqCeNU:AUqDHao:AUqDbvu:AUqJktY:AUqMBKQ:AUqNQQ:AUqXKkK: +AUqZLjF:AUqabvo:AUqcUCK:AUqjpfq:AUqosns:AUqpICN:AUqsNXp:AUqxItc:AUrByxB:AUrIZHY:AUrKGkr:AUrPkTR:AUrSRcJ:AUrWVgd:AUrYtdy:AUralMz:AUrcaKI: +AUrgbVd:AUrkKIY:AUrmlWX:AUrmxoK:AUrrkJl:AUsEFnQ:AUsHJjG:AUsJIXp:AUsLXWt:AUsReGb:AUsTUVp:AUscAAP:AUsrjlb:AUstlvt:AUswnnY:AUsxucW:AUsyoCO: +AUtAnNf:AUtGlhm:AUtJwHy:AUtQTgH:AUtSNwS:AUtVYxe:AUtXSan:AUtabtl:AUtbmpz:AUtrrxc:AUttVpb:AUtysTp:AUuRWOb:AUuTym:AUuYVIS:AUuaVXf:AUucwhI: +AUulNJw:AUunKRB:AUvHcDc:AUvJHcq:AUvOwkb:AUvUrit:AUvVunj:AUvWWoK:AUvXWok:AUvZGcF:AUvbePh:AUvczpF:AUvsdqG:AUvtKrK:AUvwGJR:AUwGYfq:AUwJVhx: +AUwLIhS:AUwLecg:AUwONOD:AUwQaYV:AUwUrao:AUwZyvk:AUwhBQq:AUwhXce:AUwoYLh:AUwwBFc:AUwwKKH:AUwyZtC:AUxAnPg:AUxCXdq:AUxEAvh:AUxHvCm:AUxKTei: +AUxLpSI:AUxNbzQ:AUxOGGi:AUxPFIG:AUxQIHz:AUxQeCN:AUxRvAd:AUxSEYH:AUxSMZm:AUxYyqW:AUxddBJ:AUxlVoP:AUxplcw:AUxqCWn:AUxqwwr:AUxtMV:AUxylaE: +AUyBQWs:AUyDLNy:AUyKKkb:AUyMktp:AUyWHaF:AUyaDsT:AUyeNXy:AUyhWxo:AUykItJ:AUyqChW:AUysICg:AUyvzBO:AUzFrYl:AUzGgOq:AUzSkTi:AUzdkJw:AUzfCHn: +AUzmFl:AUzpGMY:AUztLtA:AUzvDSm:AUzxJpM:AUzzXjZ:AVAAemU:AVAIUbr:AVAIWDD:AVAOLAQ:AVAPLAq:AVAYDwR:AVAbEyT:AVAeNgl:AVAexX:AVAqaHe:AVAsOWb: +AVAtOyg:AVAwYzs:AVAzyYP:AVBULaF:AVBVxWG:AVBZfGS:AVBbLYY:AVBgEYc:AVBkEAp:AVBkPVu:AVBmBPZ:AVBoAzl:AVBottC:AVBwahr:AVBzOYp:AVCCUZF:AVCFlfq: +AVCNLpq:AVCPCmw:AVCPbiJ:AVCRhJe:AVCSXuP:AVCVpZy:AVCWWBv:AVCgAnb:AVCggOS:AVCkNLT:AVCkymD:AVCswHB:AVCwztf:AVCznCj:AVDBJLH:AVDGUGp:AVDGxfC: +AVDHgji:AVDLJkV:AVDLaut:AVDMgSy:AVDSUlZ:AVDhAIV:AVDjFtn:AVDneFt:AVDrpij:AVDsNlo:AVDvNmG:AVEAGke:AVEGicp:AVEKdBE:AVEPVjY:AVEUHkU:AVEUfXF: +AVEXhlt:AVEbiaz:AVEbvRS:AVEjptv:AVEnszI:AVEtvFd:AVEvfZQ:AVExLJC:AVEzqwA:AVFFxjZ:AVFGApt:AVFMiCo:AVFPyGP:AVFQdbZ:AVFZIVe:AVFZlpa:AVFhiAe: +AVFhvrL:AVFiGwZ:AVFkwvC:AVFppTi:AVFsDKA:AVFtFSd:AVFwzhS:AVFzxLD:AVGCkTD:AVGDGvW:AVGEhhS:AVGIDiD:AVGIZrr:AVGLgAc:AVGMEIF:AVGNaBm:AVGRTMN: +AVGRlGl:AVGThDK:AVGVAur:AVGVqEj:AVGYkbw:AVGdZKZ:AVGdnrn:AVGjvaw:AVGklwm:AVGoqhW:AVGqxCO:AVGvBCl:AVGxgdU:AVHAgYC:AVHHysp:AVHLGVl:AVHNyuK: +AVHQlCA:AVHSYqN:AVHTgaX:AVHVabV:AVHZTmu:AVHZlgW:AVHaKjF:AVHlZka:AVHlnRU:AVHvYxf:AVHznqw:AVIFbVa:AVIFfgM:AVIHkBa:AVIKTCF:AVIRyQP:AVIYELC: +AVIdaHL:AVIfOWK:AVIjBpd:AVImMYo:AVIpvYW:AVIvRai:AVIzikI:AVJAiqu:AVJBtnD:AVJKWAu:AVJLbvx:AVJLfGT:AVJRNGj:AVJWyqi:AVJYshb:AVJpOjJ:AVJsMyv: +AVJtsrp:AVJuvyn:AVJvTOq:AVJzZTj:AVKHfBD:AVKHtVF:AVKQQa:AVKSwFf:AVKTCCG:AVKXlfH:AVKddTY:AVKeAit:AVKffRG:AVKmnCs:AVKtWaM:AVLAsdH:AVLEtuF: +AVLICMg:AVLIbIZ:AVLKCcn:AVLUEkY:AVLWUgn:AVLYwfo:AVLaANR:AVLagoc:AVLcEYl:AVLdquO:AVLffhU:AVLpwKo:AVLsncz:AVLtDxC:AVMAhb:AVMBNwC:AVMJYIf: +AVMJgnd:AVMMEjc:AVMMiaW:AVMNepE:AVMPJxF:AVMQaRD:AVMUYXz:AVMYOtr:AVMaRrS:AVMfxlB:AVMibXu:AVMixja:AVMjymb:AVMnUzT:AVMqFsB:AVMwZRc:AVMxKkg: +AVNBNYc:AVNDxmu:AVNFnfI:AVNLRHb:AVNLXSM:AVNOBsU:AVNOHTO:AVNQhLD:AVNYVJi:AVNcpTF:AVNdgdP:AVNeDKN:AVNfyee:AVNhBSg:AVNjIRE:AVNkiAJ:AVNkvrc: +AVNqLjs:AVNsqWq:AVNzLRz:AVOETMW:AVOElGu:AVOGhDR:AVOLkbn:AVONlcc:AVOOgAz:AVOQRpy:AVOWGvN:AVOXGAb:AVOYyUi:AVOcDa:AVOfnQu:AVOiwqc:AVOkgdL: +AVOmPot:AVOpETV:AVOqYcg:AVOrdzX:AVOwZKC:AVOwnrw:AVPRkBg:AVPVEiV:AVPWRPp:AVPXGFm:AVPeZWR:AVPhYxm:AVPqgDE:AVPsvAg:AVPuKCk:AVPwcAr:AVQFemg: +AVQUINZ:AVQUdOy:AVQYpYh:AVQfJeE:AVQlikR:AVQpPVJ:AVQrYFE:AVQscdF:AVQutPu:AVQvovF:AVQvpGN:AVQxmqG:AVRCDWK:AVRKeML:AVRLshK:AVRSUBk:AVRbqMZ: +AVRdQnf:AVRfRqF:AVRoNGu:AVRpbfz:AVRwYfn:AVRycDM:AVRzJTl:AVSBolL:AVSEwFa:AVSKfBc:AVSKpZg:AVSKtVa:AVSLEyI:AVSSboV:AVSWgJL:AVSaDXm:AVSegcx: +AVSfCDf:AVSjEnC:AVSlfuk:AVSnPHm:AVSpNLJ:AVSpymZ:AVSqYgP:AVStoK:AVTAJkd:AVTAauF:AVTIUgw:AVTMhjl:AVTSpjG:AVTbSno:AVTceFF:AVTfyRG:AVTgDxz: +AVTlhbq:AVTsUdy:AVTswKV:AVTwquv:AVUCnFk:AVUEVjk:AVUNpfK:AVUPmwD:AVURmGp:AVUSJxm:AVUTGkW:AVUWfUV:AVUjYFZ:AVUkKkL:AVUqUpP:AVVCYiv:AVVCgNt: +AVVDjTg:AVVFVHy:AVVGePU:AVVGmSp:AVVKNWS:AVVROTb:AVVVpFp:AVVZarT:AVVdLjj:AVVgUZD:AVVmLhX:AVVoxLR:AVVpnPT:AVVqbow:AVVuUaj:AVVvrup:AVVwUPk: +AVVzFSR:AVWARlM:AVWComh:AVWIgBS:AVWPSRO:AVWQrJk:AVWTayF:AVWUvNE:AVWVrYt:AVWYsEb:AVWcYXK:AVWfxCY:AVWjOpx:AVWkXFj:AVWsdwk:AVWunwc:AVWvTtk: +AVWwTBg:AVXBqeC:AVXGRLR:AVXIoMw:AVXJRp:AVXSuAj:AVXUawz:AVXVPKh:AVXWPUf:AVXbwQS:AVXgFPz:AVXicAk:AVXkPuA:AVXlJiK:AVXljyh:AVXoOPG:AVXtCtl: +AVXySGF:AVYdYFL:AVYecdO:AVYfLKl:AVYfpRk:AVYkbFX:AVYpyYK:AVYrLyU:AVYrlO:AVYwEyo:AVZEElh:AVZEjCp:AVZGNGx:AVZJxdl:AVZRkbJ:AVZeOjX:AVZisrb: +AVZlJTW:AVZnOSz:AVZooVV:AVZsbfa:AVZuiKB:AVaHSkm:AVaKOcS:AVaMiLp:AVaQCMN:AVaRtNp:AVaXxwt:AVaYLAu:AVaiEcU:AVakEyP:AVapYzw:AVastTp:AVbAInc: +AVbBVK:AVbHUBy:AVbHWdO:AVbIulF:AVbXDWY:AVbdNGg:AVbebfh:AVbinDP:AVbvYZx:AVcQsDT:AVcUtUZ:AVcYbiF:AVcaztJ:AVcckDq:AVcfEwc:AVcgIXj:AVcjyWr: +AVclfPi:AVcqAnN:AVcsEyp:AVctqUS:AVcvfHI:AVdBUzA:AVdDbDZ:AVdElFv:AVdGwUP:AVdRXUW:AVdVWbq:AVdcfpB:AVdfANe:AVdfgoT:AVdikdz:AVdlEWh:AVdmANw: +AVdmfaZ:AVdnDw:AVdrwhE:AVdsUpw:AVduAXg:AVdvzTa:AVdwjqq:AVdzNlS:AVdzyMC:AVeBAQd:AVeBmCn:AVeGmGn:AVeMIvv:AVeMlPr:AVeNHkY:AVeNfXJ:AVeSygC: +AVeTdBI:AVeZGki:AVeeHfq:AVegfez:AVesptz:AVeuDkr:AVfGAqS:AVfGmcY:AVfTHKN:AVfViCk:AVfaLRq:AVfefzJ:AVfiqWZ:AVfmsZR:AVfypTm:AVgCPkE:AVgFrJY: +AVgKEGm:AVgNgBa:AVgUbBi:AVgbfaS:AVghdwY:AVgkuJs:AVgpXFX:AVguZwF:AVgwSgK:AVgxYXy:AVhDDBF:AVhDcjO:AVhFgSx:AVhLEiy:AVhSEgV:AVhThHl:AVhWyuO: +AVhXZRM:AVhanWJ:AVhcTbN:AVhhfAh:AVhjlWR:AVhnqHh:AVhpxcp:AVhsujH:AVhzPOr:AViBwgd:AViDtNy:AViObVe:AViOfgI:AViaNgA:AVifMYk:AVigLyC:AVihlI: +AVipEaj:AVipPvo:AVirqmn:AVitQNR:AVitnZh:AVivRQr:AViyvYS:AVjAyqM:AVjBOCc:AVjLgVC:AVjUfGP:AVjXjCF:AVjZiqq:AVjeRAt:AVjiBPy:AVjlMyr:AVjsahQ: +AVjuOwV:AVkAbdx:AVkMgJW:AVkOXuu:AVkQJKh:AVkQaUJ:AVkSWBS:AVkXolW:AVkbfup:AVkdPHv:AVkfCxl:AVkfZYW:AVkgpIT:AVkkNMy:AVkoFTP:AVkpnmG:AVkpnvu: +AVkrSNc:AVksefJ:AVktzoW:AVkvyrK:AVkwDXv:AVlEUzZ:AVlGbDA:AVldAIq:AVleUpL:AVlijqJ:AVljzTZ:AVlmtmJ:AVlnCXU:AVlnZyn:AVlofhY:AVlqvqg:AVlsWAH: +AVmENyv:AVmFygj:AVmLAPn:AVmLRkd:AVmOtLx:AVmPRhW:AVmPXsx:AVmSYIz:AVmSgnx:AVmTjtk:AVmVVhu:AVmWepY:AVmepts:AVmggDE:AVmhgDe:AVmjyEP:AVmmvRV: +AVmpvFA:AVmtLJf:AVmwUzH:AVmyfes:AVnANWF:AVnBxjy:AVnKNYo:AVnMxmy:AVnParA:AVnUtla:AVnWyOp:AVnYjTR:AVnZvAy:AVnexLG:AVnoRRv:AVnpFSG:AVnvZrf: +AVnxbxp:AVnxxJd:AVoAhhN:AVoEDiY:AVoEZro:AVoJaBp:AVoPhDV:AVoRAuo:AVoRqEw:AVoUkbj:AVoZktT:AVoaZKg:AVoanrS:AVoglwp:AVohFpn:AVojMdY:AVojYcc: +AVokqhJ:AVoonQq:AVorwqg:AVosBCQ:AVpDzAz:AVpGGao:AVpHIzF:AVpHrsC:AVpMlCn:AVpNgaw:AVpPRPt:AVpTTmZ:AVpTlgx:AVpjbof:AVplPOy:AVppMDP:AVppYCj: +AVpqdZU:AVprwf:AVpunqx:AVpxwQn:AVpzgDA:AVqAWaS:AVqFiQs:AVqGtNB:AVqLZK:AVqNENa:AVqUjcd:AVqWNgl:AVqZxDx:AVqhLyx:AVqiMYP:AVqjToW:AVqoJeA: +AVqqVLh:AVquOJL:AVqysRv:AVrBxWm:AVrFWAx:AVrKwGT:AVrLysr:AVrMDWo:AVrOgVj:AVrRSKt:AVrUshO:AVrWili:AVrXpyg:AVrZEBI:AVrnUu:AVsJEKS:AVsKolH: +AVsNwFe:AVsPCCd:AVsRRlw:AVsUpJt:AVsVNn:AVsZtUL:AVsbfRd:AVsfUDj:AVsfwkE:AVsgzoH:AVsiyrT:AVsphBB:AVssnmX:AVssnvj:AVswPHi:AVsyCxs:AVsyZYH: +AVsztMl:AVtDCMb:AVtFhjp:AVtJfbh:AVtJpzl:AVtJtvj:AVtQoLG:AVtTwfj:AVtVgjG:AVtdvqN:AVteCdm:AVtfdtu:AVtgwhW:AVtiENH:AVtmzOG:AVtpDxf:AVttgCs: +AVtwLIp:AVtynMW:AVtynVe:AVuCHta:AVuFYIA:AVuFgnC:AVuJepb:AVuJmsG:AVuRcEJ:AVuTOtu:AVuXpfg:AVuYmwH:AVuZpun:AVujHfC:AVuoIrK:AVuqwVb:AVusYFV: +AVutkBk:AVvBnfl:AVvDVJl:AVvJyOY:AVvLhLA:AVvQmgw:AVvRJXj:AVvVfuQ:AVvWIVo:AVvWlpk:AVvcScT:AVvczhy:AVvjfzd:AVvnqWt:AVvoHFh:AVvzKKK:AVwATMt: +AVwAlGV:AVwChDq:AVwEAuH:AVwEqEP:AVwJPuu:AVwKgAY:AVwMaBW:AVwPEGs:AVwSGvm:AVwTyUj:AVwVuay:AVwYaWI:AVweBCV:AVwfgdO:AVwivaM:AVwjZwX:AVwkFpI: +AVwlSgU:AVwmYXg:AVwpuJm:AVwsOpt:AVxBoMs:AVxEysf:AVxGTmc:AVxGlgA:AVxPrjp:AVxRjFf:AVxSRPM:AVxWzAC:AVxXgbH:AVxbYxP:AVxcSGb:AVxexcB:AVxjBca: +AVxkwQW:AVxlgDX:AVxpVEe:AVxrdWp:AVxsMDi:AVxsYCS:AVxtnWx:AVxuPue:AVxzXfq:AVyEkBw:AVyIySP:AVyMxDQ:AVyQINw:AVyQdOT:AVyXUbm:AVyYuLR:AVyaEyK: +AVyeEaX:AVygBpr:AVyiAZD:AVyitTk:AVyjPVg:AVyncdK:AVyoJtj:AVypOsg:AVyrmqj:AVytNgs:AVyyndD:AVzAgVQ:AVzGEnq:AVzHshT:AVzOiqc:AVzRcW:AVzWInN: +AVzWdom:AVzYlgB:AVzbRqY:AVzdvyX:AVzkNGj:AVzniKF:AVzqLYh:AVzuLkQ:AVzujyC:AVzuprV:AVzwtpa:AVzzmQS:AWAJdbL:AWAMhY:AWAMuWM:AWAPJLh:AWAQWBM: +AWAUEJb:AWAVAXq:AWAaHUZ:AWAcZFc:AWAeieK:AWAejTi:AWAgYKe:AWArjoi:AWAtNTY:AWAuIrD:AWAwjEO:AWAyQfG:AWAzdSs:AWBCxmO:AWBEqeu:AWBGlzS:AWBQwei: +AWBUuwt:AWBYGQs:AWBYZGY:AWBYxDt:AWBbbwL:AWBeyAb:AWBhgxF:AWBlZLn:AWBlccT:AWBmsZy:AWBpnXS:AWBrmBY:AWBuaxZ:AWBzzfW:AWCAFAh:AWCBCkf:AWCRutI: +AWCSzoy:AWCTFsl:AWCWORL:AWCWjcf:AWCabFa:AWCgYAL:AWCiSKg:AWCmZTC:AWCrLlL:AWCrRIp:AWCwoBB:AWDCasj:AWDIhNB:AWDKqcb:AWDPOJr:AWDYqSf:AWDbEWE: +AWDbZtz:AWDembV:AWDeoMg:AWDmWFz:AWDqtyD:AWDrhzC:AWDvbfX:AWDyNYy:AWEDEgk:AWEGnNR:AWEKHCT:AWEWMux:AWEWXXY:AWEaIvc:AWEacDo:AWEcRpR:AWEfORr: +AWEhhgh:AWEijRA:AWEjaLS:AWEoCEv:AWEufVj:AWEwtrq:AWEyUAX:AWEydOe:AWFCPYB:AWFJulL:AWFNZBU:AWFNoUr:AWFOrbV:AWFPmHf:AWFToBT:AWFZGdo:AWFZOPu: +AWFZxTo:AWFaHUH:AWFbVks:AWFdgVU:AWFiQZt:AWFnDzo:AWFoEIe:AWFphGQ:AWFralj:AWFykVd:AWGAmeu:AWGGrdv:AWGQtOz:AWGSnaA:AWGUURg:AWGZRzy:AWGcUyq: +AWGpBeF:AWGplgT:AWGqKFM:AWGubHw:AWGugJw:AWGyLFQ:AWHMrDm:AWHProi:AWHRizK:AWHToA:AWHUWCi:AWHmsLG:AWHqWsc:AWHulGo:AWHzxyc:AWIAxQk:AWIBQam: +AWIFVfl:AWIJDvg:AWIQYpS:AWIRQsq:AWIapau:AWIdGTa:AWIffQp:AWIhIrc:AWIjjEh:AWInfcF:AWIpBtL:AWIuzFI:AWIvLDI:AWIwZlp:AWIwcCJ:AWIxatS:AWIzFkx: +AWJAPXm:AWJERym:AWJFRqh:AWJFlyv:AWJHQAZ:AWJOAxa:AWJPDVP:AWJTTOq:AWJYYPd:AWJipAB:AWJjGtV:AWJlfqG:AWJnIRT:AWJrQFW:AWJtfCq:AWKDJdj:AWKEqsd: +AWKNbdH:AWKNkCm:AWKVMJc:AWKWipC:AWKXJQv:AWKeVZ:AWKhTgf:AWKuPOv:AWKvvbP:AWKwIve:AWKwWaf:AWLDRkS:AWLJzOI:AWLKuTy:AWLMqvo:AWLNjCV:AWLZUzh: +AWLcFkD:AWLjeYd:AWLnobr:AWMEQRC:AWMNxwj:AWMSRpb:AWMTGqc:AWMVPvQ:AWMWEgt:AWMZvls:AWMaCEI:AWMekvb:AWMitrN:AWMkhgw:AWMzMyg:AWNELZQ:AWNFDNN: +AWNKQrL:AWNPUoF:AWNVzCT:AWNXiur:AWNYGQL:AWNbUaH:AWNbdou:AWNdalc:AWNoOrb:AWNqrEX:AWNrjrQ:AWNxUkL:AWNzIVs:AWODtOC:AWOJCPE:AWONKzP:AWONWjs: +AWOWzHD:AWOXkmK:AWOaoov:AWObjOf:AWOiYWV:AWOnPqT:AWOncyZ:AWOzvm:AWPBcAs:AWPCVpX:AWPEAoO:AWPHIFA:AWPInpp:AWPJUps:AWPKkt:AWPKlmA:AWPOJtn: +AWPPawU:AWPXMZz:AWPZqyr:AWPlxyh:AWPmbeU:AWPrBSu:AWPscYs:AWPvBng:AWQBuWS:AWQEJLv:AWQFWBS:AWQRqER:AWQTlZt:AWQWaFE:AWQcBYN:AWQfgXA:AWQgGTx: +AWQifQi:AWQkieu:AWQkjTW:AWQmwHq:AWQnnxT:AWQqpae:AWQrkTx:AWQrqWv:AWQveSm:AWRCDVw:AWRGTOV:AWRJzhG:AWRPCNY:AWRTXNN:AWRaIRs:AWRcjex:AWRddsD: +AWReQFp:AWRgfCV:AWRiByG:AWRjCyf:AWRmGtq:AWRsFKh:AWRxktq:AWRyCXI:AWSALqt:AWSBOqQ:AWSFUZj:AWSHMJj:AWSIKUv:AWSTFAZ:AWSVDe:AWSWJdC:AWSZswF: +AWSbuwm:AWScpWb:AWShIvL:AWShWaO:AWSivby:AWSrJV:AWSzGtT:AWTCghB:AWTFNev:AWTHbDx:AWTJOQh:AWTKFaC:AWTLqXw:AWTPMjS:AWTQJqf:AWTRxYD:AWTaTGv: +AWTbTQr:AWTeWAh:AWTfLUQ:AWTfOLP:AWTghzQ:AWThNLb:AWTjuWT:AWTlAL:AWTpIVu:AWTpWAv:AWUBLzw:AWUBMaf:AWUDiUt:AWUEUje:AWUFRpK:AWUKXWM:AWULvlz: +AWUQRvq:AWUSNQQ:AWUSctd:AWUSlea:AWUWIVH:AWUfIvu:AWUfcDy:AWUgslG:AWUhRpD:AWUsSBT:AWUxcOj:AWUzgeB:AWVBNso:AWVCuCr:AWVHfKk:AWVTqhB:AWVUgmP: +AWVXPYt:AWVYNqH:AWVYlEx:AWVZYHY:AWVaDzY:AWVdEIS:AWVnQZB:AWVtTWB:AWVuVkE:AWVySbM:AWWEqYT:AWWHnaw:AWWKaWs:AWWLYbz:AWWRAOi:AWWSIfg:AWWUUPU: +AWWVFPZ:AWWVnPV:AWWbyEI:AWWgxYN:AWWjbHA:AWWjgJA:AWWnLFg:AWWwnSh:AWWxUyG:AWXAUrN:AWXKMZc:AWXMqyk:AWXSawL:AWXZtBn:AWXabel:AWXdBSL:AWXnSan: +AWXoxyq:AWXpdLP:AWXvWsq:AWXwQND:AWXylTu:AWXzBEo:AWYAXnl:AWYBRYH:AWYDeLZ:AWYGQsc:AWYHUsA:AWYLOru:AWYOAAk:AWYSxMC:AWYUqEy:AWYdkTs:AWYgpaG: +AWYheSf:AWYibDC:AWYozaI:AWYuyan:AWYxgXJ:AWZErQA:AWZJelA:AWZNUSZ:AWZOWbc:AWZRORn:AWZSLlP:AWZYLYR:AWZbQCh:AWZbsZN:AWZcZLY:AWZcccc:AWZhpAU: +AWZjyAU:AWZzBTe:AWaDLyp:AWaERv:AWaGeLc:AWaHQsZ:AWaKUsx:AWaNCnB:AWaQPxq:AWaURYq:AWaVRQt:AWaVlYj:AWaXQaF:AWaazaP:AWadbWY:AWafCxr:AWagkTJ: +AWagqWD:AWalLDb:AWanWEd:AWapFkS:AWazGTJ:AWbEORE:AWbJxms:AWbLuwH:AWbMelj:AWbPWbH:AWbQUSq:AWbbZff:AWbcyAv:AWbfzAy:AWbibvK:AWbmktC:AWbmqwM: +AWbtiEN:AWbtjtl:AWcKCkj:AWcLhnW:AWcNqCw:AWcdwyl:AWcrSKk:AWcsFKx:AWczbFm:AWdAuTL:AWdCFSi:AWdCqvZ:AWdDQZX:AWdDqEW:AWdHghl:AWdQCKc:AWdaLLI: +AWdaRiu:AWdjtyX:AWdlEWy:AWdlZtF:AWdodIs:AWdvYaI:AWdwSkB:AWdxSkb:AWdywYE:AWeAqHi:AWeFRvC:AWeIRpy:AWeJUjW:AWeMEgo:AWeNfbr:AWeULzE:AWeUMaT: +AWeVDnZ:AWegUKx:AWelslu:AWepORV:AWerdOa:AWetaLw:AWfEAdX:AWfFnno:AWfJHci:AWfJgmB:AWfMPYf:AWfNNV:AWfSulH:AWfVMUE:AWfVXxd:AWfbcoA:AWfdgEi: +AWfiwGX:AWfpcdR:AWfrRPo:AWfvtRL:AWfxUae:AWfxdoX:AWgBobh:AWgQrdR:AWgRcaG:AWgSGia:AWgXIfu:AWgZUPG:AWgdWqc:AWglnSz:AWgnqer:AWgpTva:AWgsrIX: +AWgtQni:AWgyojB:AWgyooK:AWhFrDi:AWhPmEj:AWhSVtL:AWhTUrx:AWhWUnh:AWhYGIz:AWhbUYn:AWhjdns:AWhnqne:AWhtbhh:AWhtgjh:AWhxLfN:AWhyriC:AWiHlYe: +AWiJJLK:AWiSDvc:AWiWToB:AWiZzHS:AWiaieh:AWiajTJ:AWicwHl:AWigmbc:AWiljoJ:AWinNTz:AWiqIrg:AWisjEl:AWitdSP:AWiuQfd:AWiwfcB:AWiyBYS:AWizCYr: +AWjCxT:AWjDGQv:AWjDxDq:AWjGack:AWjHgHL:AWjKXNE:AWjLwel:AWjPRqD:AWjPlyZ:AWjQQSJ:AWjRJlt:AWjcHuF:AWjgaTh:AWjhZLK:AWjhccq:AWjiFKC:AWjoBTw: +AWjtjOu:AWjuLdr:AWjvNtE:AWjwIRX:AWjyjeS:AWkHaSt:AWkNutn:AWkOQzz:AWkOqeu:AWkPZNK:AWkSgHN:AWkUOjl:AWkVNEz:AWkWsaS:AWkXbdt:AWkXkCQ:AWkZOqd: +AWkbWfd:AWkeFKs:AWkgZTd:AWkjmBH:AWkjomy:AWkqTgz:AWkuWad:AWkxNln:AWkzuwX:AWlChNg:AWlDCKZ:AWlEqcG:AWlGRbE:AWlTqSc:AWlUZnp:AWlhYaP:AWlseYh: +AWlwTQE:AWmExwV:AWmRNSc:AWmXfkg:AWmddOf:AWmgIui:AWmgliz:AWmofVI:AWmqDZU:AWnCGQh:AWnEPVZ:AWnFoFK:AWnGfBb:AWnMxWa:AWnORVS:AWnTQrH:AWndQZy: +AWnhtRE:AWnkEIH:AWnolIM:AWnpCeB:AWntkVi:AWnyOrF:AWoBYbQ:AWoEGix:AWoGiZM:AWoHAOB:AWoLFPq:AWoMAsZ:AWoNnmZ:AWoQURZ:AWodLFL:AWohKWD:AWolKFP: +AWoqbEx:AWotBsX:AWoxBNJ:AWpCmEA:AWpEVtG:AWpIUnc:AWpNqON:AWpPtBs:AWpQWCF:AWpTnMS:AWpVzhI:AWpdSas:AWpeUYE:AWpisLh:AWplWsl:AWpnlTH:AWpoCMT: +AWpotIg:AWppoJr:AWpyTVQ:AWqDEJX:AWqEDvZ:AWqKRQb:AWqMQaP:AWqNxQV:AWqSghj:AWqUrqu:AWqVPxg:AWqbfQm:AWqfjEu:AWqgdSI:AWqlTjN:AWqojoS:AWqqzFT: +AWqrLDT:AWqsZlm:AWqscCW:AWqtQjR:AWqtdHa:AWqtfDk:AWqvFke:AWrIEjq:AWrSYPG:AWrVafH:AWrYacd:AWrbByC:AWregxL:AWrfGtu:AWrhfqd:AWrjIRw:AWrnQFt: +AWrpfCR:AWrqBwl:AWrziEx:AWrzjtZ:AWsCXD:AWsDswj:AWsFgHw:AWsOUZf:AWsPUZF:AWsRKUz:AWsRomw:AWsTxyQ:AWsVros:AWsZLqx:AWsdTgC:AWsoPOS:AWsookX: +AWsrvbu:AWsuaBY:AWsxUOR:AWszhwq:AWtIsWC:AWtJjCq:AWtSsuU:AWtUUzo:AWtWKuS:AWtXKus:AWtYxYx:AWtZJqZ:AWtbpwg:AWtfRiG:AWtiGTQ:AWtjOPw:AWuAQRf: +AWuMiUx:AWuORpG:AWuPuLo:AWuSEgQ:AWuUUOL:AWueORH:AWugUAB:AWuhVKP:AWuiaLi:AWujgvv:AWuoIvy:AWuocDu:AWvALZr:AWvAMAc:AWvGQro:AWvJXwH:AWvPRVt: +AWvXfBE:AWvYoFl:AWvcCee:AWvgkVN:AWvifvy:AWvktRb:AWvmUaK:AWvmdov:AWvsgYd:AWvvsLB:AWwCkmH:AWwDCPf:AWwGcay:AWwRhcH:AWwSzHg:AWwTJTd:AWwXiZj: +AWwZGQB:AWwanSD:AWwhrpt:AWwkBNm:AWwqxYb:AWxAAoR:AWxEFpa:AWxEnpm:AWxGnAL:AWxKYBA:AWxLCpQ:AWxLWHJ:AWxWnMJ:AWxYzhP:AWxdBEK:AWxdlGY:AWxibhz: +AWxigjz:AWxqyer:AWxzbeh:AWyKRYL:AWyOzHA:AWyUOrq:AWyVLLO:AWyXAAo:AWybgXn:AWyfZlF:AWylmbq:AWynnHx:AWysyaB:AWyviyM:AWzPXNs:AWzTqef:AWzdBTA: +AWzfpAX:AWzkQCl:AWzksZJ:AWzqmBJ:AWzsaxi:AWztyAq:AXABrKZ:AXADYVn:AXAHlxE:AXANZfZ:AXANqVv:AXAPUkI:AXAQzGO:AXARNUv:AXAYAZp:AXAesBd:AXAfuFo: +AXAhsVw:AXAodox:AXAroyC:AXAstxz:AXAtvrG:AXAuHuk:AXBDHGc:AXBEiRj:AXBFQjC:AXBTjMi:AXBUQZg:AXBiZVC:AXBiyhT:AXBmTpE:AXBoXTw:AXBxtNe:AXBysIA: +AXCAenL:AXCCuFQ:AXCDUjz:AXCHdgy:AXCIlsf:AXCImhw:AXCMNUY:AXCMWIc:AXCbdSQ:AXCdRlO:AXCqyVI:AXCuDFb:AXDFUeM:AXDGOOG:AXDInzX:AXDLUJE:AXDORCS: +AXDPdGF:AXDSNuf:AXDUEd:AXDaGPO:AXDeqSu:AXDfrYJ:AXDlRLp:AXDqclN:AXECPXX:AXEEOkm:AXELioP:AXEMNYa:AXEMfYm:AXESykM:AXEVvTS:AXEXksH:AXEXwck: +AXEhwZY:AXEjcdA:AXElOcG:AXElOfN:AXEmkOL:AXEqHPp:AXEuWTp:AXEulOP:AXEybGV:AXFHHJj:AXFIPxA:AXFKcZS:AXFNIsH:AXFOQFB:AXFTTfB:AXFUEtF:AXFZcyD: +AXFeTad:AXFebqY:AXFhhl:AXFoQll:AXFphuu:AXFqOFw:AXFrJfg:AXFsXvZ:AXGCaQW:AXGJtfG:AXGMjEN:AXGNqzp:AXGPHwJ:AXGTcgh:AXGXdIw:AXGaYhU:AXGbZOh: +AXGeIgE:AXGeWpy:AXGlcqX:AXGncPW:AXGpBMP:AXGqxrt:AXGsSsF:AXGtwLN:AXHDqHU:AXHEZao:AXHGORx:AXHHvOT:AXHSGIh:AXHSOvN:AXHUjew:AXHVwkR:AXHctCK: +AXHilmQ:AXHmJlp:AXHoqOx:AXHsbpO:AXHyFxh:AXIBYib:AXIGGAs:AXIOfHr:AXIQuSB:AXISOds:AXITjXw:AXIUXpU:AXIWRfw:AXIZrBY:AXIdsic:AXIetnG:AXIhoea: +AXIiwhY:AXIlOzf:AXIoGTX:AXIsVkq:AXJDZUf:AXJIUKy:AXJKJJu:AXJPKje:AXJQlXu:AXJRoXP:AXJVusk:AXJXmck:AXJXtR:AXJYODz:AXJbODM:AXJfEPg:AXJjtXJ: +AXJkoYs:AXJmvRw:AXJnoEh:AXJpnEZ:AXJqsvG:AXJxwHN:AXJyVKx:AXKGUjc:AXKPucM:AXKQUEk:AXKVVer:AXKbUiR:AXKgRlV:AXKhQqE:AXKrSeo:AXKyvBT:AXLDArO: +AXLFNuI:AXLFWis:AXLKxqn:AXLLufA:AXLPGdh:AXLPhjC:AXLRlSv:AXLRmHg:AXLUuCd:AXLVrYJ:AXLYFKA:AXLfsB:AXLkdsA:AXLoAeD:AXLvCmx:AXLwLVW:AXLwSEF: +AXLxrYE:AXMAJRv:AXMAyIQ:AXMBNdy:AXMDZAc:AXMTKdL:AXMUcYb:AXMUway:AXMYISn:AXMbXPf:AXMcDeG:AXMcQlh:AXMiRyp:AXMiZty:AXMjZVz:AXMtDeg:AXMtQlH: +AXMzqgS:AXNDTKV:AXNEaZv:AXNHNDv:AXNJZal:AXNUQpS:AXNXNHp:AXNbQlE:AXNfXvs:AXNiua:AXNnbZt:AXNoZvU:AXNpCPR:AXNrYlN:AXNvMWv:AXNwXpI:AXNzBaF: +AXNzGcF:AXOAyyi:AXOBXmP:AXOBgxW:AXOFGam:AXOGgip:AXOHbIg:AXOJWLM:AXONEER:AXORuzI:AXOWlEC:AXOYaHc:AXOeZOs:AXOgCJp:AXOgzeJ:AXOkNqw:AXOsGQb: +AXOwIpA:AXPEGIa:AXPEOvG:AXPFXxz:AXPKFg:AXPMAjA:AXPNpQK:AXPPDKz:AXPQxGo:AXPRrpK:AXPTEeY:AXPXuZB:AXPYLRR:AXPYORq:AXPaDze:AXPjYHE:AXPnBuX: +AXPpOvb:AXPwPHD:AXPxEze:AXQEOdt:AXQGjXP:AXQIRfp:AXQLitB:AXQLwRL:AXQQlRs:AXQRQzB:AXQUQlO:AXQYGAt:AXQbCpL:AXQfcBz:AXQfnOr:AXQkoeF:AXQoOzA: +AXQpTcZ:AXQvPKR:AXQwsiD:AXRFtH:AXRJusR:AXRKmcr:AXRMjxg:AXRSBMY:AXRaKIf:AXRiOBL:AXRipfG:AXRkwHW:AXRlVKa:AXRrwHI:AXRsnEC:AXRxTCm:AXRydOQ: +AXSAgxI:AXSEFkC:AXSNppn:AXSOLlb:AXSOnXR:AXSPLlB:AXSPnXr:AXSQnOj:AXSRFOv:AXSVaMP:AXSZRKz:AXSjWnP:AXSpsKw:AXSsCFI:AXSuCuw:AXSuGla:AXTCOKc: +AXTDRCe:AXTLOOq:AXTNzqL:AXTULLy:AXTUnxI:AXTWFoM:AXTXFom:AXTfGPy:AXTpWNK:AXTrHi:AXTvskl:AXUBQPu:AXUFHje:AXUIrsN:AXUNgXo:AXUPMwC:AXURazP: +AXUXRmA:AXUfHPF:AXUmcdw:AXVBkSg:AXVBwCD:AXVFmSD:AXVKNDi:AXVMZas:AXVTQFT:AXVWTKI:AXVbZTi:AXVcCPM:AXVcpXC:AXVdYlq:AXVucDN:AXVvOCh:AXVvOFa: +AXWHlEj:AXWNXDb:AXWTAOo:AXWXgiY:AXWYGaD:AXWacqJ:AXWeBMB:AXWgYhg:AXWhHGr:AXWiIpH:AXWkDtr:AXWmAA:AXWrvrR:AXWyCJy:AXWyzeC:AXXAbiW:AXXHLsg: +AXXHNrq:AXXKgXg:AXXKzNM:AXXNles:AXXPahS:AXXTlPq:AXXWEeb:AXXZHWa:AXXaybH:AXXbNQG:AXXdMKM:AXXfNaD:AXXgAqN:AXXkdRM:AXXnIPq:AXXqZHQ:AXXvcQs: +AXYCQqh:AXYFfzx:AXYHJjR:AXYOrBw:AXYTHgo:AXYUcbR:AXYUirf:AXYVQJO:AXYbgat:AXYdleX:AXYedoo:AXYhoyT:AXYiOKV:AXYlWpT:AXYyZvO:AXYyyHX:AXZBStH: +AXZCTN:AXZCnlP:AXZFlXk:AXZGoXN:AXZIQQQ:AXZKQZR:AXZNUKg:AXZPJJk:AXZUiTR:AXZbAkj:AXZjgAM:AXZknPM:AXZllEa:AXZoPkB:AXZokGn:AXZtWPm:AXZxOIV: +AXZyGto:AXaGHgt:AXaHcbI:AXaPocD:AXaRitp:AXaYUkE:AXadOiT:AXaeTcH:AXansBh:AXaoWpO:AXarHSu:AXavBOn:AXawleC:AXbANuq:AXbNcBB:AXbNiRv:AXbSYvi: +AXbXAzw:AXbaoYD:AXbbPkk:AXbbkGG:AXbcHUL:AXbeufh:AXbfTpY:AXbrwOg:AXbtsbc:AXbufbp:AXbzMkK:AXbzODz:AXcFgxw:AXcJgLI:AXcTARS:AXcVNUU:AXcVWIo: +AXcnDFn:AXcnuHS:AXcwUig:AXdBfF:AXdBufj:AXdHmHL:AXdLrYa:AXdOUeI:AXdPeNw:AXdZArd:AXdaGLH:AXdlCmS:AXdtDfY:AXdtuhd:AXeEIiv:AXeFMlp:AXeJKdw: +AXeMRmS:AXeTTkb:AXeUwjW:AXeXNdB:AXeYJRM:AXeYyIj:AXeZZAX:AXeawxB:AXemSey:AXerQLq:AXeuLnQ:AXeublC:AXevXVG:AXeysHB:AXfBPxE:AXfDOKp:AXfLLPG: +AXfRyKP:AXfWIsL:AXfXafC:AXfkQgF:AXfmdre:AXfpHpm:AXftWtm:AXftloM:AXfuWVi:AXfyhuq:AXgFyyV:AXgIAOY:AXgUGiu:AXgUOVS:AXgVXXn:AXgWqhh:AXgcPhy: +AXggvrd:AXgjxrp:AXgnIgA:AXgqDZq:AXgqaik:AXgyJfk:AXgzYhQ:AXhKOvw:AXhMqZM:AXhNyYo:AXhTecY:AXhYtFz:AXhcwls:AXhdILp:AXhkcQe:AXhlbpK:AXhmcpj: +AXhrFxl:AXhvJlt:AXhwDzH:AXhwaIR:AXhzFJZ:AXiCPKM:AXiDrBe:AXiHZuS:AXiIjmw:AXiJqVS:AXiaWpF:AXidsVR:AXijEpR:AXinOKD:AXipvrb:AXiqKij:AXiypFK: +AXjBQjd:AXjDrkf:AXjFYvR:AXjIPkT:AXjIdqb:AXjNfhw:AXjVGav:AXjcZVd:AXjcyhs:AXjoEPk:AXjttNB:AXkIgMT:AXkIoyN:AXkMzkn:AXkPRKm:AXkSOko:AXkTRci: +AXkfcLt:AXkiUin:AXkkyVl:AXkmdST:AXkqAEQ:AXkvGpu:AXkzENQ:AXlCglY:AXlFUJf:AXlJdGe:AXlMArC:AXlONuE:AXlaSEj:AXlfRLS:AXlqUIW:AXlsyvU:AXlwuhC: +AXlxvbQ:AXlyAeh:AXmAczi:AXmCvYj:AXmHTFx:AXmINYB:AXmIfYN:AXmKLDs:AXmRksk:AXmRwcH:AXmVmsH:AXmehUo:AXmmBLg:AXmrRyl:AXmrZte:AXmsCpA:AXmspxO: +AXnGOKY:AXnLwJg:AXnMTKR:AXnOuyv:AXnQEtk:AXnSKDG:AXnTcyi:AXnTwAr:AXnUMI:AXnWCHv:AXnaTaI:AXnabqt:AXnbDEL:AXnbQLc:AXniqGX:AXnkQlA:AXnlLNa: +AXnlbLs:AXnoXvw:AXnqNzK:AXnxZTr:AXnyZvq:AXoAnvZ:AXoEpe:AXoJZAi:AXoMvoR:AXoPcgw:AXoQbIc:AXoSWLI:AXoaFWD:AXoaIgZ:AXoaWpf:AXodDZj:AXodaip: +AXojcPH:AXomxrk:AXooSsY:AXowAQz:AXpAgXX:AXpAzNr:AXpMLpt:AXpMrxj:AXpOjeZ:AXpadRr:AXpgFwO:AXpgIGQ:AXpgWPm:AXprGqm:AXpvzEE:AXpzNQx:AXqEAZJ: +AXqLuSA:AXqMmCa:AXqNOdp:AXqOXpv:AXqSnLD:AXqUBmJ:AXqUKJo:AXqWoxZ:AXqYQqE:AXqfnep:AXqgMKv:AXqgOdG:AXqhOzE:AXqkCpH:AXqlpFt:AXqnwhd:AXqonOv: +AXqzgaY:AXrAQZI:AXrCQLd:AXrCqSk:AXrKSHB:AXrPlrx:AXrSIYn:AXrWSts:AXrYnlK:AXranPV:AXrdUIi:AXrePkY:AXrekGu:AXrfoYv:AXrjoEM:AXrnOZJ:AXroTCQ: +AXrqCPG:AXrucbq:AXrunoy:AXsCUjD:AXsLUEl:AXsQNGK:AXsRuy:AXsUGDf:AXsUhJM:AXsYLlN:AXsadSo:AXsuvBs:AXtBgmD:AXtMdGL:AXtNVFD:AXtPgXN:AXtTFKD: +AXtUqUR:AXtsEnA:AXuBrsB:AXuEksR:AXuEwcq:AXuQcYG:AXuRRFI:AXuTISk:AXuYMwO:AXuaioP:AXudRyu:AXueCpX:AXuepxV:AXugYLD:AXuisRV:AXvAaZU:AXvHrSK: +AXvQQpp:AXvWcyN:AXvWwAU:AXveHpC:AXvjCPq:AXvkZTU:AXvmbge:AXvviOy:AXwAAJg:AXwCpqM:AXwDbIJ:AXwEdIA:AXwGrPM:AXwNuzd:AXwSaHN:AXwWlpl:AXwaDAK: +AXwaFMA:AXwaqcx:AXwbSsp:AXwbqjV:AXweOVd:AXwhPhk:AXwitcd:AXwjYhk:AXwkPhb:AXwqHGv:AXxAjeA:AXxIRXf:AXxJSXV:AXxJnxX:AXxLDKE:AXxOBvU:AXxPEef: +AXxSAor:AXxfYHz:AXxhwlA:AXxiWaF:AXxjBug:AXxmPHR:AXxqvRO:AXxxIPU:AXxzDTo:AXyBPMM:AXyDSTU:AXyEnLM:AXyHito:AXyHwRa:AXyIoxS:AXyMZfI:AXyMqVe: +AXyNjmA:AXyQNUe:AXybcBW:AXyeoek:AXylBOq:AXynnpp:AXyoUiO:AXyqoyP:AXyrkgS:AXysHuX:AXyvTPM:AXzBQQU:AXzEusQ:AXzHPmt:AXzIXPF:AXzKRFd:AXzNrbJ: +AXzQoXj:AXzSlrg:AXzUZFp:AXzWUKc:AXzcGtK:AXzdCPX:AXzhcbn:AXzhnof:AXzmoER:AXztdOR:AXzwUIv:AXzxOkk:AYAFTtG:AYAKBuo:AYALbee:AYAVLtK:AYAXPbv: +AYAYStg:AYAkEif:AYAlmry:AYAniqX:AYArEjE:AYArmhY:AYAwonT:AYAyqlD:AYAzewV:AYBCAny:AYBCBaO:AYBCKUQ:AYBMIcK:AYBQwmo:AYBbQGb:AYBeExt:AYBeTmF: +AYBgxDg:AYBsnoC:AYBvRy:AYByZoD:AYBymYW:AYCBXNp:AYCCZRE:AYCGOds:AYCOjuG:AYCOrOb:AYCYQmD:AYCYyDb:AYCaceI:AYCbMqs:AYCdhUf:AYCjpSY:AYCrdya: +AYCxLXY:AYCynOL:AYDAHhA:AYDMrSM:AYDNdNK:AYDUsLJ:AYDYaNm:AYDeCPl:AYDeWnH:AYDsmlp:AYDwSts:AYDwccq:AYDxEVk:AYECYzt:AYECpBy:AYEGAMe:AYEPBbA: +AYERnAO:AYESdnb:AYETqms:AYEbzYs:AYEdBZe:AYEeKMG:AYEfCXb:AYEtDUj:AYExyLG:AYFDVjl:AYFHLDm:AYFHQDE:AYFJeTY:AYFUTvd:AYFWPyx:AYFdzEH:AYFoVdA: +AYFrTZD:AYFxTEY:AYGBdrM:AYGDppq:AYGGfcU:AYGJagD:AYGPetP:AYGWwMz:AYGWygg:AYGjzeA:AYGsno:AYGsqju:AYGtCQT:AYGveV:AYGxgKi:AYHBKdo:AYHCLTi: +AYHESTe:AYHIgiT:AYHJNTu:AYHJOrs:AYHLqTi:AYHNPgW:AYHNYEe:AYHSQhm:AYHXAkq:AYHczRr:AYHlKnK:AYHtRfj:AYHwaGo:AYHxrLC:AYIJKDV:AYIPJrW:AYITqtP: +AYIVPGn:AYIWAwh:AYIbiqc:AYIfqHj:AYIhkye:AYIzBRu:AYJAjit:AYJDwmF:AYJIufj:AYJKJoT:AYJKmwD:AYJQjEZ:AYJZGch:AYJenoJ:AYJnulQ:AYJoEjJ:AYJokpZ: +AYJonqW:AYJpzPs:AYJraOm:AYJriYV:AYJtGmT:AYJyxDn:AYJzKwo:AYKAkEZ:AYKCyZY:AYKGjIm:AYKOuFs:AYKQJOM:AYKXhge:AYKZYCu:AYKbZOt:AYKbmyg:AYKfzCe: +AYKqEY:AYKwaoT:AYKwiyo:AYKxge:AYLDtDs:AYLDycj:AYLFXeL:AYLGWog:AYLLaNB:AYLNGSl:AYLPThN:AYLXlva:AYLbCLP:AYLsyla:AYLvtNt:AYMFHMV:AYMFgsy: +AYMHJqv:AYMHLHv:AYMOWOX:AYMVTHq:AYMYOyp:AYMYoXl:AYMbnhk:AYMdoyh:AYMuFIK:AYMvczU:AYMvfyr:AYMvupu:AYNBJjX:AYNGVjG:AYNJlQ:AYNLqun:AYNNnaI: +AYNdjeK:AYNdqZ:AYNfmJE:AYNgzEc:AYNjRKw:AYNoFyU:AYNrFPR:AYNrXPL:AYNzGTI:AYOAQdu:AYOCeti:AYOGppH:AYOOmab:AYOTsTJ:AYOmzex:AYOrANK:AYOrVOb: +AYOvinG:AYOvlgg:AYOxFpI:AYOxXpW:AYOzjpM:AYPBcWm:AYPEQhj:AYPKAkV:AYPLUqz:AYPOqTN:AYPQWId:AYPUeAv:AYPcxKM:AYPgRfM:AYPhaGH:AYPkrLd:AYPloen: +AYPoKnl:AYPtoNq:AYQCUQm:AYQHPGg:AYQHYeU:AYQJcwZ:AYQMRNr:AYQQAKa:AYQSNte:AYQSORc:AYQTUQM:AYQUGjR:AYQVTrM:AYQWbYq:AYQcKcw:AYQgEjW:AYQgmhK: +AYQhqaE:AYQmRFz:AYQqrlS:AYQtoEY:AYRCYXL:AYRDhGg:AYRHAnK:AYRHKUc:AYRIUfZ:AYRLGcs:AYRQCjD:AYRRPdz:AYRSxoU:AYReQGP:AYRnUNl:AYRtXoa:AYRvdwB: +AYRxevy:AYSHZRs:AYSMBAV:AYSMKuH:AYSNLKv:AYSRFLa:AYSVWcU:AYSVstW:AYSWPDQ:AYSZDVc:AYSgXvw:AYSmpSo:AYSoEXm:AYSqFIP:AYStDem:AYStNYS:AYSuMqE: +AYTBrqb:AYTCThW:AYTEAaF:AYTGtDj:AYTGycs:AYTJeyQ:AYTSJi:AYTXneM:AYTezKi:AYThmlf:AYTlSte:AYTlccg:AYTmQfK:AYTssda:AYTzCPz:AYUAslu:AYUEBtO: +AYUHrQk:AYUQcqa:AYUThTk:AYUXdnt:AYUYOxS:AYUbEvT:AYUbQFb:AYUcSTL:AYUccCN:AYUhczZ:AYUhupz:AYUldmm:AYUmyLQ:AYUwoyG:AYVAsth:AYVEsDG:AYVLEZN: +AYVPDRf:AYVRveS:AYVXMSe:AYVZpuo:AYVdFPK:AYVdXPU:AYVfjPO:AYVgmmg:AYVlGTP:AYVnOwt:AYVqkWx:AYVuXRX:AYVvSGC:AYVzIvn:AYWGnAy:AYWOyql:AYWPzR: +AYWREzG:AYWSNKt:AYWVDro:AYWZfcg:AYWaoWN:AYWhinL:AYWhlgl:AYWjXrq:AYWljpF:AYWpaRo:AYWsGty:AYWtRTu:AYWvkwQ:AYWwBVe:AYXAqTw:AYXCPgI:AYXHeAo: +AYXNgiJ:AYXRJut:AYXZclO:AYXcqAk:AYXhzRl:AYXiDem:AYXmDM:AYXxqPS:AYYENtb:AYYEORd:AYYGyPX:AYYIbYv:AYYMKDx:AYYPGif:AYYSgIc:AYYYXfX:AYYahsv: +AYYdrlt:AYYfeQH:AYYlkjN:AYYmzrE:AYYreZq:AYZDPds:AYZFTfW:AYZRXnd:AYZSZrQ:AYZVjEh:AYZWODg:AYZbsMR:AYZgJEJ:AYZnFir:AYZoDEO:AYZoNyq:AYZpACi: +AYZqszh:AYZrMQg:AYZthur:AYZzpsM:AYaBPbZ:AYaGHIS:AYaJZJM:AYaJysA:AYaKrGI:AYaOTtK:AYaUbei:AYaZPWo:AYaaIyA:AYadewz:AYarceP:AYaumru:AYavbEY: +AYbCWCp:AYbCsTr:AYbHYXb:AYbMIck:AYbQkeV:AYbSyzU:AYbWjia:AYbekpO:AYbenqB:AYbhaOx:AYbhiYC:AYbnrxB:AYbrZox:AYbrmYk:AYbtdYr:AYbvzci:AYcBLwY: +AYcGFLs:AYcRANr:AYcRBAD:AYcRKuZ:AYcZsrM:AYcbpiF:AYcdTMM:AYcfxdl:AYcjSuT:AYcksmB:AYclXve:AYcmhUb:AYcqIfw:AYcwFIb:AYcxZOO:AYdCHJu:AYdEFDN: +AYdFkIQ:AYdKAmH:AYdPTQU:AYdVHmB:AYdVgSm:AYdXJQb:AYdXLhb:AYdcVIt:AYdgBzh:AYdhSuC:AYdiCxo:AYdlCbQ:AYdmbXb:AYdmbhj:AYeBnEV:AYeJFdg:AYeLkiX: +AYeMYzP:AYeQAMA:AYeTslG:AYeYBbE:AYedCpa:AYedWNE:AYekzYw:AYemBZa:AYenSUJ:AYeoCXf:AYesbHc:AYesbxk:AYfCqua:AYfDRIe:AYfDxYT:AYfKDF:AYfMMSs: +AYfQLDi:AYfQQDA:AYfTkdM:AYfXZnJ:AYfZJjw:AYfeFyz:AYfhVdE:AYfjMMT:AYfvqJx:AYfxCqy:AYgAyUF:AYgFpUP:AYgGbVh:AYgKsTW:AYgOTpC:AYgOsdx:AYgTTVi: +AYgYetT:AYgbgKM:AYgfoWX:AYggTeT:AYgnVDL:AYgqTzI:AYgtasS:AYhBbEK:AYhEZjo:AYhEySc:AYhGpGy:AYhLEpn:AYhMPBx:AYhSUqq:AYhWXFC:AYhXYEI:AYhZcWF: +AYhoeWX:AYhsKCk:AYhwEJK:AYhwmHW:AYhxqAY:AYiEBuH:AYiHbeB:AYiLTrX:AYiRLtl:AYiRir:AYiSKOD:AYiXgIQ:AYibqpH:AYifEia:AYihbER:AYimqLV:AYirzrw: +AYiueZC:AYiuhpR:AYiyeQz:AYjBuff:AYjDJoX:AYjDmwH:AYjGXnz:AYjIIcn:AYjJjix:AYjOQMn:AYjOydH:AYjXZrO:AYjcxDB:AYjdZoA:AYjdmYR:AYjeACw:AYjhzcP: +AYjmLxS:AYjnnoF:AYjwdYk:AYkDLKC:AYkGUFd:AYkHuFo:AYkJJOQ:AYkJmWA:AYkOICg:AYkPjIq:AYkSwMC:AYkZkEF:AYkaaoh:AYkaiyS:AYkbGMq:AYkmuLT:AYkrLXz: +AYktnOO:AYkxxdk:AYlGnaE:AYlIrSn:AYlQsLi:AYlUBTS:AYlXrqw:AYlYqPG:AYlaCPO:AYlaWnk:AYlbPmt:AYlisdt:AYloHdL:AYlrEVH:AYlsStP:AYlsccR:AYlxcZF: +AYlxfYa:AYlxuPf:AYmCHHU:AYmFjx:AYmOHMR:AYmPqmn:AYmYtZ:AYmaKMZ:AYmgCpx:AYmsdmf:AYmtJyw:AYmutnO:AYmzQFI:AYnEeTV:AYnIpPw:AYnOaGB:AYnWnaM: +AYnZvWe:AYnaGpx:AYnnTZk:AYnoaSq:AYnqowz:AYnznyB:AYoAJJG:AYoEyqC:AYoFVJX:AYoIoO:AYoJLdY:AYoJQdq:AYoUagY:AYoYbVq:AYocjET:AYoemjZ:AYogGPc: +AYogePF:AYomqjH:AYoqMmd:AYoqULm:AYoxfHD:AYpHypl:AYpLcWI:AYpUNTv:AYpUOrp:AYpWypL:AYpYbyb:AYpeCqL:AYphKnh:AYpkuEj:AYppRfI:AYpqhSb:AYqNqtu: +AYqSAwM:AYqTQHQ:AYqZAKm:AYqbkje:AYqbxkv:AYqfIyS:AYqgDEO:AYqheZZ:AYqhhpK:AYqmCQs:AYqnKNW:AYqsueU:AYqvRFv:AYrBhqB:AYrEufM:AYrGJos:AYrGmwc: +AYrHXnQ:AYrSIcY:AYrTFlV:AYrWked:AYrZCjX:AYrcrxP:AYrdFiG:AYrgZoj:AYrgmYy:AYrhMQR:AYrjhuG:AYrnIFR:AYrppsx:AYrxsMg:AYsCjIH:AYsFyDx:AYsHBU: +AYsKuFV:AYsMJOh:AYsMmWx:AYsRYxK:AYsWLKz:AYsdLXc:AYsgnOv:AYshjXz:AYsmZOq:AYsmmyb:AYssRIg:AYstQgW:AYtClvd:AYtFaNg:AYtJThk:AYtLAaz:AYtTlUj: +AYtXnal:AYtaso:AYtdEVA:AYtdQfw:AYthFiq:AYtkcZo:AYtkfYH:AYtkuPO:AYtlzKU:AYtzDuI:AYuBdnX:AYuFtdo:AYuFyCv:AYuIeYT:AYuQrQg:AYuRTHR:AYuTAAC: +AYugKpy:AYukPMd:AYulEvx:AYulQFN:AYutzkl:AYuxKpY:AYvATvR:AYvAef:AYvBMSA:AYvCPyN:AYvEohO:AYvFJH:AYvHquS:AYvJGqr:AYvMfCj:AYvUEZJ:AYvVNky: +AYvYDRb:AYvZRhB:AYvZjWv:AYvbmJx:AYvcBsh:AYvdIvJ:AYvgHSW:AYvgsVw:AYvpjPk:AYvsarb:AYvuGTT:AYvviVr:AYvwOwp:AYvwRtx:AYvxOwP:AYvxRtX:AYvyBvH: +AYwCwML:AYwCygQ:AYwDTpq:AYwDsdJ:AYwIpUb:AYwLbVZ:AYwPsTe:AYwWMsh:AYwcDQs:AYwcwSv:AYwfmMj:AYwiIVc:AYwlTef:AYwtXrU:AYwuSgN:AYxBRnx:AYxFAkk: +AYxHUqg:AYxINTO:AYxIOrI:AYxKypu:AYxLXFU:AYxMPgm:AYxOcWP:AYxQeAk:AYxRPBn:AYxZZjy:AYxZySu:AYxcRfP:AYxgrLy:AYxkKnq:AYxlmHA:AYxqoNL:AYxteWN: +AYxyoeS:AYyBPGD:AYyBYev:AYyLAKb:AYySWip:AYyXKOR:AYyYGib:AYybqaf:AYyiRFY:AYymrlp:AYyqKNx:AYyyAT:AYzAODK:AYzIroZ:AYzLCjA:AYzNxoP:AYzODvm: +AYzRLWE:AYzWFlo:AYzaQGu:AYzejxX:AYzhDEC:AYznXoD:AYzpJEF:AYzrpIZ:AYztExc:AYztTmQ:AYzvxDp:AYzzSUH:AZAElBG:AZAOzUE:AZARzTS:AZATWDG:AZAYUOk: +AZAcgDu:AZAdiot:AZAuAwx:AZAuNFK:AZBBwfO:AZBDLWs:AZBDtXv:AZBLjXA:AZBLlaA:AZBPEZh:AZBPxlD:AZBRCXy:AZBXgZd:AZBYRxs:AZBZQYC:AZBaZJQ:AZBcybL: +AZBkeTK:AZBnYeI:AZBokYm:AZBspdp:AZBtGv:AZBuBUg:AZByCSB:AZByFPe:AZByUYb:AZCENLS:AZCNNHN:AZCTTmt:AZCTYJm:AZCVEzg:AZCVxLK:AZCZFtL:AZCbkDf: +AZCfMEX:AZCiyBC:AZCrceW:AZCwATw:AZDAYXt:AZDDlMn:AZDDqMF:AZDQANn:AZDRMHQ:AZDTCh:AZDbEyQ:AZDbgyt:AZDnJdO:AZDqZLk:AZDqcum:AZDtWtf:AZDvagX: +AZDvvfq:AZEFAnE:AZEKlmE:AZEKqmm:AZEPzGf:AZEWvCD:AZEbmdx:AZEbuEq:AZEetsl:AZEnQcT:AZEpURJ:AZEtJLH:AZEuMv:AZEvMcF:AZEwcUf:AZEyFAX:AZEzrbt: +AZFGuxR:AZFHgCM:AZFJBpn:AZFPrgm:AZFSRuW:AZFgHWU:AZFgOlF:AZFjZwC:AZFqroE:AZFrHZn:AZFuREl:AZFykgd:AZGAPnm:AZGGkFY:AZGHpkL:AZGOzti:AZGPgcz: +AZGRBPY:AZGUqAU:AZGXrGZ:AZGbMac:AZGgipW:AZGiHyO:AZGmEXg:AZGrZWt:AZGsKca:AZGsXbr:AZGwrOr:AZGzHzY:AZHAYmg:AZHAqDA:AZHRlbe:AZHSHxF:AZHVgjk: +AZHYxgU:AZHnAFn:AZHnIPU:AZHoiOV:AZHuSwK:AZHxuGt:AZHymXV:AZHzCLl:AZHzSsY:AZIAiJZ:AZIFkx:AZIGqdZ:AZIJiJF:AZIPZWy:AZISyqO:AZITHnd:AZIXaGH: +AZIYuOY:AZIaYTd:AZIelQg:AZIjeQE:AZIjtDw:AZIlXmV:AZIqxRs:AZItnij:AZIuqnS:AZJGAGc:AZJKtao:AZJLRxZ:AZJOTMR:AZJOYjK:AZJUFTj:AZJYNhh:AZJmZBQ: +AZJuqos:AZJvtTV:AZJxNAU:AZJzOPV:AZKOAgZ:AZKRRXc:AZKStAV:AZKUaHG:AZKWTmk:AZKWYJr:AZKZEPP:AZKgDdE:AZKgVVZ:AZKnBuw:AZKuZbh:AZKxMEg:AZLHwRk: +AZLKgxn:AZLRouf:AZLVeSV:AZLWVul:AZLWnbe:AZLXWIm:AZLnfYS:AZLnxYM:AZLsMCd:AZLwoRt:AZMDFjo:AZMJpPK:AZMLOAJ:AZMUSmF:AZMcvMR:AZMemdC:AZMeuEJ: +AZMiAzM:AZMjbZm:AZMmtlj:AZMnWO:AZMnhzR:AZMtfyJ:AZMtxyT:AZMvJyN:AZMwMDf:AZNCrgD:AZNGabW:AZNKgCd:AZNSpKR:AZNaorl:AZNeHZG:AZNmZwj:AZNnKPZ: +AZOBYYp:AZOMaBn:AZOSpNH:AZOSylz:AZOWbIW:AZOXEhn:AZObkGt:AZOcQAL:AZOdts:AZOgoRU:AZOjrOU:AZOkAnP:AZOsQhj:AZOydLl:AZPByjv:AZPMccE:AZPOXfT: +AZPPXft:AZPdPzE:AZPkUek:AZPlSDZ:AZPqjLB:AZPydLG:AZPynpy:AZQFyqd:AZQHomF:AZQKMa:AZQTpMr:AZQVtOV:AZQaDpT:AZQdxRX:AZQhqnx:AZQrSdS:AZQwjlK: +AZRRady:AZRWEpr:AZRZhCD:AZRbTfZ:AZRfarO:AZRoSmb:AZRtBQS:AZRuhmZ:AZRvZTm:AZRyCjD:AZSDQyz:AZSERXJ:AZSJOwX:AZSLwFv:AZSNLwJ:AZSNtxO:AZSQoWb: +AZSUoqR:AZSVjxx:AZSVlAx:AZSXaDr:AZSZwVV:AZShDWh:AZSlmuy:AZSyDdL:AZSyVVS:AZSzBAP:AZSzBqX:AZTAFJI:AZTHVuS:AZTHnbZ:AZTIeSi:AZTKWIR:AZTUouY: +AZTZhWb:AZTioRk:AZTjaos:AZTnTUl:AZTpgtA:AZTvFae:AZUGjCi:AZUNnBU:AZUOesf:AZUPYrL:AZURrAn:AZUdNPw:AZUeURx:AZUiJLz:AZUnorD:AZUwfyc:AZVGYRs: +AZVNYZR:AZVTziU:AZVYBLz:AZVctiV:AZVdOGK:AZVedln:AZVjsbF:AZVqULt:AZVsQYp:AZVuCLc:AZVyBlj:AZWDztG:AZWEpNA:AZWEyls:AZWLkFw:AZWZzRB:AZWbcXy: +AZWcEIq:AZWkQep:AZWlipy:AZWpLr:AZWqHwl:AZWvQEe:AZWwKpJ:AZXARue:AZXHHxx:AZXIgjU:AZXNxgk:AZXdjLe:AZXoZYN:AZXpKyg:AZXpNxj:AZXpecw:AZXsgdi: +AZXtiOh:AZYEZWk:AZYFcCU:AZYGpMk:AZYHtOo:AZYIBK:AZYIXFd:AZYNuOK:AZYPbiv:AZYaSWb:AZYcirB:AZYdClE:AZYdSSp:AZYhxFP:AZYuSdJ:AZYwxRA:AZYxAfG: +AZZAGZU:AZZAhdz:AZZCjXZ:AZZClaZ:AZZDadp:AZZFwvT:AZZKLWh:AZZKtXm:AZZLhCM:AZZPPkl:AZZPySa:AZZeDwJ:AZZgcki:AZZoZpf:AZZqbsp:AZZrkdR:AZZscqw: +AZZvMel:AZZwBQz:AZZwBar:AZZyZTD:AZaCoFb:AZaDKLN:AZaJHnQ:AZaKJlw:AZaMyJa:AZaRUOg:AZaTRva:AZaTjFY:AZaXzUI:AZaYiJo:AZaeugz:AZagClb:AZagSSW: +AZaiKYw:AZaiNXz:AZaieCg:AZamrrM:AZapRQz:AZasXmC:AZatJIq:AZatMpS:AZauajv:AZaxZJQ:AZbBecC:AZbCPkK:AZbCySF:AZbGadW:AZbNowG:AZbRoQw:AZbSDGP: +AZbekdu:AZbjAtd:AZbltTc:AZbwDDI:AZbwVvV:AZcAwFD:AZcHeCT:AZcHsoL:AZcKBTS:AZcOwVd:AZcPEPK:AZcWNHJ:AZcYRza:AZcbyBG:AZchkCi:AZcnkyf:AZcpaRV: +AZcqwGd:AZcsoUG:AZdJANj:AZdMlMj:AZdMqMB:AZdYvck:AZdZYXp:AZdjZLo:AZdjcui:AZdsvmf:AZdtcxz:AZdumDw:AZdvgts:AZdxGbG:AZdxRwD:AZdyAZy:AZeHNHn: +AZeOdWl:AZePAna:AZeYPyt:AZecWTi:AZeeaGW:AZehfPR:AZepMT:AZepZld:AZepcUb:AZfGEHZ:AZfHbic:AZfLYRE:AZfRYyd:AZfTBpJ:AZfcQeX:AZffULB:AZflEsm: +AZfmsbp:AZfokJl:AZfsQaX:AZfworA:AZfzroA:AZgFuXY:AZgMbIL:AZgQYrj:AZgXYYk:AZgbPZV:AZgcBLs:AZgfOLM:AZgnOgR:AZgucXK:AZgxkGo:AZhAKll:AZhCYso: +AZhDijM:AZhEzuk:AZhHWdi:AZhLjrn:AZhNbIs:AZhOUoE:AZhPRfk:AZhQRVC:AZhVyQX:AZhXoMz:AZhlJqi:AZhtxrd:AZhwAFb:AZhwIPY:AZhxqND:AZiAlBb:AZiLzTv: +AZiNWDb:AZiPqdF:AZiRHXA:AZiUUON:AZiWRvH:AZiWjFp:AZiXxGR:AZijYTx:AZikZJx:AZisRQS:AZitSWL:AZiwJIX:AZiwMpz:AZiwzFi:AZixmxQ:AZiyDpc:AZjDRZO: +AZjHYjG:AZjJEZM:AZjJxla:AZjMEpe:AZjPAGo:AZjRgZA:AZjTQYf:AZjURxV:AZjZOWD:AZjeSmu:AZjgeTn:AZjhjPA:AZjkkYH:AZjopdU:AZjxDwt:AZkAuFb:AZkAyly: +AZkKoqG:AZkNTmW:AZkNYJN:AZkTFto:AZkVAgf:AZkZtAj:AZkiOpS:AZksATT:AZktqOv:AZkuttS:AZkwBuK:AZlAKmg:AZlQwRo:AZlUVlO:AZlgWzg:AZlgdxb:AZljJdb: +AZlragu:AZluUrL:AZlvIGy:AZlvLNY:AZlxfYw:AZlxxYi:AZlyJlN:AZlzJYs:AZmFlmZ:AZmFqmr:AZmQbRd:AZmSpPO:AZmUOAN:AZmZgXs:AZmcFvw:AZmdEYe:AZmjQck: +AZmpsnf:AZmrMcy:AZmsbZi:AZmwhzV:AZnCzTs:AZnDYym:AZnJqao:AZnNRuZ:AZnTzTS:AZnUpnU:AZnUyLg:AZnfQHW:AZnirRW:AZnnANm:AZnrcxm:AZnsEie:AZnyOGt: +AZoAbIs:AZoCkFz:AZoEgrG:AZoJgcY:AZoKztJ:AZoRrGy:AZoTRUc:AZoVaBj:AZoXuXf:AZoeHyl:AZoeZC:AZoiEXD:AZolZWW:AZopoRQ:AZosrOQ:AZotHzz:AZowRex: +AZoxIxA:AZpDxgP:AZpMagV:AZpPofI:AZpUZwg:AZpVccY:AZpWpmg:AZpXtoc:AZpYXfh:AZphnIT:AZpjrRf:AZpmPzY:AZpotdi:AZpqSwn:AZpruGQ:AZpsiRN:AZptCLI: +AZpumXs:AZqMfRW:AZqQomJ:AZqcoe:AZqeRQH:AZqjUEn:AZqmxRT:AZqqqnt:AZquJQY:AZqxdlB:AZrCAGD:AZrEgZj:AZrGQYM:AZrHOqU:AZrHoPI:AZrIahY:AZrKTMu: +AZrKYjl:AZrMEZf:AZrMxlJ:AZrOCXw:AZrQFTM:AZrRbKa:AZrTNho:AZrVQDS:AZrWRZd:AZrkjPj:AZrlhmf:AZrpCjx:AZrqWkR:AZsMtAs:AZsNRXF:AZsOaHb:AZsVEPu: +AZsWFtv:AZseaRH:AZsmCsW:AZsmFpp:AZsmUyw:AZsoZbM:AZsqjpQ:AZswqOo:AZsxCJC:AZtDwRH:AZtItYG:AZtNouE:AZtReSu:AZtTWIN:AZtZFJU:AZtlJYt:AZtsaoo: +AZtwNpd:AZuCvCr:AZuFMhl:AZuHOAg:AZuIhwi:AZuJXpN:AZuMzGp:AZuToUR:AZuXesb:AZuZWiY:AZueFAn:AZugrbb:AZumTug:AZuyaOx:AZvGYyv:AZvIBpX:AZvMhur: +AZvMkmV:AZvYxOv:AZvaHZX:AZvdIXC:AZvhQaJ:AZviZwu:AZvjKPE:AZvxQeJ:AZwDrGp:AZwGRUJ:AZwReYP:AZwbrrG:AZwcoRx:AZwgHzS:AZwrtIY:AZwtdLa:AZxAjrX: +AZxBgjQ:AZxIpmx:AZxJRua:AZxPijg:AZxSofv:AZxTKlZ:AZxZHNE:AZxezS:AZxhXus:AZxkxfc:AZxuuGn:AZxwCLv:AZxwSsC:AZxyKyc:AZxyNxn:AZxyecs:AZyDaGf: +AZyDbHP:AZyNpMW:AZyOcCi:AZyPRUn:AZyVjRw:AZyYfEg:AZycioc:AZysjln:AZzHNhV:AZzNhaq:AZzPwvx:AZzQwfx:AZzUhCA:AZzeNAk:AZzpBQv:AZzrZTH:AZzxZpj: +AaAIDQf:AaAMzJZ:AaANNDi:AaAOqJa:AaAPytp:AaAQNcn:AaARRGR:AaARjxf:AaASYmT:AaASvxL:AaAURGk:AaAdnVK:AaAgTuB:AaAnOtx:AaAniyb:AaAqBYX:AaAsiaQ: +AaAslhq:AaAxTub:AaBRZtE:AaBaoAg:AaBihQk:AaBiojx:AaBnqcb:AaBucPJ:AaBzKLV:AaCCWfI:AaCDXie:AaCOHFW:AaCRZEI:AaCXZOB:AaCYpP:AaCaKAA:AaCdEem: +AaCdmgq:AaCiIvE:AaCkeUL:AaCukes:AaCzhsi:AaDFSVN:AaDHBOM:AaDPYWf:AaDbdxH:AaDksBq:AaDmhzQ:AaDqIID:AaDvrwF:AaDwFfQ:AaDwsqY:AaEFrSv:AaEJLxU: +AaERzQO:AaESWlK:AaEVhhR:AaEZBNH:AaEZKzV:AaEexSD:AaEhJjV:AaEjeYL:AaEjpfJ:AaElEWs:AaElTBA:AaEoKXa:AaEpItf:AaErSzX:AaEtXyi:AaEuEEd:AaFDYJJ: +AaFGsCr:AaFMFKR:AaFNSIX:AaFPbrg:AaFUnjc:AaFVlyV:AaFXlQL:AaFaERt:AaFhOss:AaFhRok:AaFiPbO:AaFtCmM:AaFwzLn:AaFyJXY:AaFyYds:AaFznGc:AaGDOwm: +AaGEdaJ:AaGJnJZ:AaGRFkk:AaGTEEY:AaGTSiA:AaGUpMQ:AaGlWAI:AaGnOSj:AaGnROr:AaGuKED:AaGvSZF:AaGzmCq:AaHFpze:AaHJWTy:AaHTBtk:AaHYXMq:AaHbgdx: +AaHfoxm:AaHgIyD:AaHnVky:AaHsSHi:AaHwfPX:AaIBqJF:AaIDNcI:AaIIyZJ:AaIMGOl:AaINVYJ:AaIObYd:AaIQxvq:AaITnNc:AaIWskt:AaIaOXg:AaIckxK:AaIeiaV: +AaIelhv:AaIjgDA:AaIjrQB:AaIoTjX:AaJFccY:AaJGwRs:AaJMZek:AaJVGFy:AaJXGTT:AaJfhSk:AaJuqCn:AaKDJZk:AaKIZTu:AaKLcCP:AaKMBzL:AaKZenp:AaKeqGR: +AaKgCe:AaKlhsb:AaKncpz:AaKpbJV:AaKswTG:AaKuqCR:AaKuuq:AaKyTOJ:AaLCjJr:AaLEYld:AaLOyuh:AaLQIlj:AaLWQBj:AaLWykL:AaLahzh:AaLcNOz:AaLeRTH: +AaLkxKF:AaLmALs:AaLpzlT:AaLqyrT:AaLtjye:AaLuLwW:AaMAFCp:AaMEWlD:AaMJOkt:AaMWILc:AaMYZRS:AaMcNVB:AaMfXTj:AaMhRFZ:AaMjQhJ:AaMsBtE:AaMuuCP: +AaNCbrX:AaNGYJu:AaNLBMo:AaNYsCm:AaNbCwL:AaNiWao:AaNkOsL:AaNkRoT:AaNqDzd:AaNtJVD:AaNwHkH:AaNzEYL:AaNzQiz:AaOAlzH:AaOBHeY:AaODFkb:AaOGEEp: +AaOGSih:AaOHDx:AaOKHGi:AaOMYjz:AaOPDtD:AaOSOQt:AaOScxB:AaOWOwD:AaObVfX:AaOdzVR:AaOfBUD:AaOhCWC:AaOiKBf:AaOnMso:AaOzyCf:AaPHBtP:AaPHTyg: +AaPMkkj:AaPUCn:AaPWBtp:AaPWTyG:AaPejbO:AaPjfPC:AaQCWti:AaQGvJI:AaQJyhf:AaQNVED:AaQRXma:AaQXvJi:AaQaRdt:AaQdsyI:AaQguTJ:AaQkjJH:AaQmmeF: +AaQpfpH:AaQrqzp:AaQuqeT:AaQxtsQ:AaQyMbx:AaQyUCq:AaRIyTa:AaRTcXE:AaRdkVs:AaRfoAY:AaRhqCI:AaRpeoH:AaRsuJf:AaRvRTz:AaSDHFE:AaSFZri:AaSGJZr: +AaSMBOp:AaSOGfi:AaSQytV:AaScbJO:AaSlTOS:AaSnIvW:AaTDZrq:AaTFwbe:AaTHQBA:AaTHykg:AaTPyuC:AaTXOQV:AaTgjyN:AaThaQz:AaTkrwT:AaTqdVd:AaTrEeI: +AaTvIIV:AaUGzQy:AaUHILZ:AaUNQbZ:AaUPSvg:AaURBod:AaUZYwO:AaUaEWE:AaUaTBw:AaUcFFx:AaUcsQp:AaUeItP:AaUlLWg:AaUmjYU:AaUzivn:AaVBdAe:AaVCHbh: +AaVFtKR:AaVFylK:AaVLfRj:AaVMDTb:AaVNaAc:AaVRTgo:AaVUOVn:AaVUowr:AaVaoVV:AaVgdqX:AaVkMSI:AaVlEYE:AaVlQis:AaVscUk:AaVsfVL:AaVtzDQ:AaVwJVm: +AaWIqbM:AaWNtkk:AaWNyLr:AaWTfrS:AaWVaaZ:AaWZTGV:AaWazro:AaWtQIJ:AaWwFFl:AaWxFFL:AaXIaHG:AaXPqzO:AaXYDqj:AaXZSM:AaXbqEv:AaXiCsD:AaXizJB: +AaXjmEd:AaXlIyV:AaXtnvG:AaXwTUN:AaYCQkV:AaYDXmz:AaYFkKZ:AaYLskF:AaYQVYx:AaYTbYV:AaYVRfr:AaYVxvC:AaYnmBf:AaYqIYo:AaYtTjj:AaYwFVm:AaZBGEd: +AaZCXII:AaZGQgK:AaZJRaD:AaZSWFE:AaZTXIi:AaZYGFW:AaZZPMR:AaZdzqj:AaZhOtl:AaZiRil:AaZmrCE:AaZpKLA:AaZqKaM:AaZsOH:AaZtEEa:AaZyIVI:AaaADY: +AaaCmnH:AaaDVYQ:AaaJnNx:AaaLYmh:AaaLvxp:AaaNRGW:AaaUNDU:AaaVzJf:AaaYRGn:AaaYjxZ:AaaZNcR:AaagAAA:AaajFVD:AaaojBV:AaauOtD:AaaykxP:AabIcXW: +AabJBoU:AabLGFL:AabNyTs:AabTJzW:AabWrhz:Aabgzqq:AabhuJt:AabykED:AabyxDW:AacOlAp:AacPenG:AacQKKY:Aaceahy:AacfrcU:Aachhql:AacmqnC:AacwSDM: +AacyKlQ:AadIDyn:AadLLXF:AadQFcl:AadUWLX:AadZOKh:AadeSZk:AadkJJe:AadmpFy:AadvXtv:AadxRfF:AadzQHV:AaeCLDL:AaeDAAZ:AaeDBNl:AaeDKzr:AaeESvu: +AaeHGLb:AaeNPKk:AaeOrSr:AaePrSR:AaeTLxq:AaeVJTK:AaeWGLB:AaehKXe:AaeqdXs:AafBlQh:AafHOWP:AafJLgZ:AafWEeD:AafXEed:AafaEYW:AafaQia:AafbTRD: +AaffoVD:AafgskK:AafiCCc:Aafmmcl:AafpzLj:AafrYdw:AafxKeY:Aafxkj:AafyKbR:AagFsco:AagMOwi:AagUlYK:AagayCk:AaghPBR:AagpEri:AagsCMP:Aagvzls: +AagxJxD:AagxYDn:AahBNds:AahBvsz:AahMOsp:AahOpza:AahPPvd:AahYJeO:AahZwbo:AahZyHr:AahekXV:AahfByb:Aahooxi:AaiEDQE:AaiIzJy:AaiJytS:AaiKqJB: +AaiLRGq:AaiLjxE:AaiMNcM:AaiOYmw:AaiOvxo:AaiQRGH:AaiWVYN:AaicTua:AaijOXc:AairShT:AaivIYy:AaiyRdY:AajHpHa:AajOccE:AajPwRo:AajQJQ:AajTHfI: +AajVZRe:AajXrhS:AajeKLS:AajiEEs:AajimGo:AajohSw:AajpEFP:AajsbjC:AakCBOe:AakGGtQ:AakLZEn:AakNphx:AakRZOe:AakVwrv:AakeMq:AakgeUk:Aakuhsn: +Aakwcpv:AalFXaB:AalJjJN:AalLYlX:AalMho:AalOAaD:AalOBnr:AalOKZl:AalWzqu:AalXIlV:AalbxKz:AaldALO:AalgsBT:AaliXYS:AaljNOF:AallRTt:AalqEwI: +AalsFft:AalvdVS:AamBTIH:AamNyUm:AamOFTe:AamRjjw:AamSOkx:AamTYLa:AamVOqx:AamddXT:AamjxkC:AamlAlv:Aammsbm:AamoXTf:AamphZm:AamsQhF:AamtRtM: +AamwjWk:AanGFKq:AanIkFN:AanJYUF:AanJpmK:AanMHgZ:AanUBMs:AanYqBA:AanZdAP:AaneVFK:AangzvA:AaniBuW:AankCwP:AanlKbu:AanndBI:AannvpV:AanobgU: +AanqzRc:AaoJIp:AaoOYuq:AaoRbRS:AaoXscf:AaogATV:AaohWAd:AaojOSG:AaomzVV:AaoqCWG:AaorSZk:AaoubGB:AaoubwJ:AaovHKC:Aaowzrt:AapBpzz:AapFWTf: +AapGHQP:AapLwbT:AapLyHI:AapPVek:AapTXMN:AapVkkn:Aapbfgw:AapcoxR:AapjVkf:Aapkute:AaplMBw:AapogdG:AaporqD:AapsfPG:AaqBflp:AaqIPVt:AaqJoGU: +AaqKbYI:AaqLRfM:AaqSskY:AaqVTYH:AaqjwRi:AaqlAAW:AaqmsyM:AaqyfpL:AarCwRP:AarDbJl:AarEgS:AarIZeH:AarOKkD:AarZYJn:AaracJU:AarcEFo:Aariwtm: +AarjqgX:AarqqCM:AartSdp:AasEZOL:AasIBzi:AasJbjc:AasOZEG:AasRAxu:AasXytj:Aasfcjz:AasjbJs:Aasrujm:AasuTOo:AasvDJw:AatCJtn:AatEBOs:AatGjZN: +AatKIlM:AatTUin:AatfsQ:AatlyrS:AatoLwp:AatqaQv:AatxBTK:AauOXAR:AauSZRv:AauUwBb:AauaEEN:AaubXTO:AaueIiQ:AaufQho:AaujrWS:AauoSzR:Aaupdvc: +AaurzLx:AauvjYI:AavAnjY:AavFlZB:AavHBMJ:AavJnnD:AavLqBx:AavMLgd:AavQoQD:AavUlQV:AavcWaJ:AaveOsi:AaveRoq:AavgnGy:AavlDza:AavvwmY:AawAYuv: +AawDbRT:AawEABg:AawGWPC:AawLDtg:AawOnNm:AawRHBm:AawbBUg:AawcKBE:AawjMsL:AawpovS:AawsCct:AawvJvh:AaxBaHC:AaxGXMg:AaxSVeB:AaxTVye:AaxYHQY: +AaxZnnL:Aaxajbb:AaxbzJF:AaxmVkO:AaxnGrZ:AaxoUcW:AaxpjjN:AaxwRDR:AaxzFvp:AayCvJv:AayHahZ:AayUwBd:AayUyhy:AayXDQw:AaygShf:AayhCSY:Aayimey: +Aayqqek:AayvTuS:AazLPhU:AazLYJg:AazMrhe:AazNcXh:AazOAXS:AazQQgo:AazcIVm:AazdeuD:AazjKaI:AazrRih:AazsQE:AazuaHm:AazvrCA:AazxhQx:Aazxojk: +AbAACgc:AbADEqx:AbAMpGH:AbANjEc:AbASzPa:AbAWWmr:AbAXwbh:AbAvHlj:AbAyMbr:AbBBuvq:AbBCRv:AbBKJUJ:AbBYisR:AbBbJhV:AbBgSjj:AbBiNaG:AbBiezZ: +AbBknPB:AbBmrKp:AbBuaSK:AbCApTh:AbCCtVL:AbCMPM:AbCOSdN:AbCOwsL:AbCSJus:AbCUySe:AbCeDGP:AbCjSNA:AbCjfYI:AbClUS:AbClika:AbCoCuf:AbCoSJS: +AbCqHEi:AbCurkI:AbCvPCv:AbDCEix:AbDJKYJ:AbDKPrO:AbDKyJB:AbDTdKS:AbDVCGu:AbDVonC:AbDWHdK:AbDZGCv:AbDahtP:AbDbZMg:AbDcake:AbDfvYO:AbDhZiE: +AbDjbjS:AbDlchT:AbDnDni:AbDrmLx:AbEBjaf:AbEBlXf:AbEPKyU:AbEWJbO:AbEWyur:AbEfBXN:AbEfBhF:AbEhZmx:AbElvyP:AbEnZIZ:AbEpbJL:AbErcHK:AbEssEg: +AbExaKZ:AbFAolW:AbFCPeF:AbFGwKZ:AbFHNqY:AbFKVuz:AbFPAWV:AbFPbDo:AbFPwv:AbFUxRr:AbFWKtR:AbFcFxK:AbFhfie:AbFkTLB:AbFosWj:AbFpZUS:AbFpclU: +AbGDjZs:AbGGoLl:AbGIMqR:AbGKOXY:AbGMXip:AbGMryA:AbGNQEE:AbGXbKS:AbGXtFd:AbGaNIm:AbGbUKb:AbGjOGU:AbGkWMe:AbGtWCI:AbGtdAL:AbHDWML:AbHEBUp: +AbHJpgv:AbHTYKY:AbHUjBy:AbHbCUI:AbHcwV:AbHeMBl:AbHrduD:AbHwIAM:AbHzEpP:AbIEtdE:AbIFzPH:AbIJbem:AbIKBug:AbIXsde:AbIYYkn:AbIaezG:AbIjeyd: +AbIkBUw:AbInHnZ:AbInOUI:AbIoWKF:AbIwdUs:AbJBbqM:AbJBkES:AbJJSBD:AbJLisI:AbJTjkj:AbJVbPw:AbJcPcT:AbJgSnc:AbJgfyk:AbJhJpw:AbJhMIU:AbJmYmW: +AbJrANr:AbKBfKh:AbKBzBC:AbKFotu:AbKKuVa:AbKTzMr:AbKXYTd:AbKZHAE:AbKcxKK:AbKgqwk:AbKkJHF:AbKwJFM:AbKxAny:AbLCwon:AbLFBG:AbLIbRN:AbLLRCK: +AbLPTTZ:AbLPYsC:AbLRECI:AbLRxue:AbLTCAX:AbLWLEF:AbLZgCE:AbLcBxh:AbLfCsw:AbLfsdu:AbLmdee:AbLxBLf:AbMByjr:AbMCKyz:AbMEBMP:AbMIwOg:AbMSGcF: +AbMVTtS:AbMVYSJ:AbMaZIu:AbMcbJc:AbMecHd:AbMfVOb:AbMiBXa:AbMiBhi:AbMkZmW:AbMqOiW:AbMwDNY:AbMycRz:AbNDbkQ:AbNDtff:AbNQRx:AbNSAWO:AbNSbDv: +AbNUvfi:AbNVpiz:AbNatJF:AbNsZUJ:AbNsclL:AbOANQI:AbOFYwe:AbONxrb:AbOYAwF:AbOafIu:AbOccAV:AbOgRNh:AbOrQzw:AbOyZuC:AbOycLE:AbOzMze:AbPAbpF: +AbPBlDg:AbPDsDk:AbPEgKr:AbPHGyZ:AbPRqxc:AbPZhys:AbPeEjH:AbPiEaq:AbPsrvd:AbPsrw:AbPvAWa:AbPzcaa:AbQAYch:AbQAzZd:AbQCPwr:AbQFagV:AbQGhLL: +AbQGkTh:AbQMGYs:AbQRgze:AbQSxvH:AbQWqXJ:AbQgZbU:AbQtZNk:AbQxoKm:AbQyrVm:AbRAzmP:AbRJKuA:AbRLYjB:AbRMSBm:AbRPJUX:AbRToNW:AbRUbqd:AbRUkEz: +AbRhXTl:AbRjaSY:AbRnAA:AbRnNaU:AbRnezH:AbRoxFE:AbRpnPP:AbRrrKb:AbSFJYo:AbSGzMI:AbSLsid:AbSUfKS:AbSUzBx:AbSeZSg:AbSkAnB:AbSmRHL:AbSqJPG: +AbSqMie:AbSvIim:AbTEONk:AbTMgCn:AbTNRay:AbTSTTq:AbTSYsh:AbTUECb:AbTUxuN:AbTVEiJ:AbTWCAs:AbTYFMI:AbTitMU:AbTkBLM:AbTthtb:AbTwji:AbUQbdf: +AbUUtXw:AbUWaQf:AbUXOHj:AbUXoiv:AbUkhTy:AbUmaKL:AbUqBlv:AbUtfYM:AbUuCjS:AbUuFit:AbVEbDy:AbVHvfF:AbVIBfh:AbVMDBI:AbVPVGg:AbVQSTx:AbVZZuq: +AbVbgmy:AbVnfiS:AbVpLWZ:AbVrxBG:AbVxAbY:AbVygDO:AbWBEdk:AbWLdNR:AbWQhne:AbWRSo:AbWVVgx:AbWevTs:AbWjtjv:AbWkAcl:AbWmFXb:AbWpWMW:AbWuTlk: +AbWyswC:AbXDqxh:AbXOwYF:AbXQCGo:AbXTEQt:AbXcokO:AbXfrvO:AbXgHCd:AbXlkSB:AbXoZnI:AbXpQxv:AbYBndk:AbYBoBm:AbYEtbC:AbYYCgT:AbYZbPV:AbYcHnD: +AbYcOUW:AbYkoKt:AbYlrVt:AbYrEAa:AbYwZNr:AbYxUuw:AbZByHR:AbZIjkD:AbZPczZ:AbZQptd:AbZdqWN:AbZzSnM:AbZzfyE:AbaARLM:AbaGgzw:AbaHxvZ:AbaIwyv: +AbaLkTz:AbaMEqd:AbaOprA:AbaRGYa:AbalZbG:AbaqEga:AbauksR:AbayMxn:Abayezr:AbbCczc:AbbEtvY:AbbRfkt:AbbVoTi:AbbamAi:AbbfjUD:AbbnbKx:AbbsxkW: +AbbwqWw:AbcAuVt:AbcHpTT:AbcIcZj:AbcJtVp:AbcOlgn:AbcZJuO:AbcaJHS:AbcfCuZ:AbcfSJo:AbclDGl:AbctasN:AbcxNAB:AbcyxfR:AbcznpG:AbdANqu:AbdHhxr: +AbdJNuh:AbdRfTY:AbdSKYF:AbdTezk:AbdTsVs:AbdUBml:AbdcdeP:AbdnolX:AbdovYC:AbdqZiI:AbduchX:Abdvset:AbdyBHU:AbeBEIc:AbeECgn:AbeEoNX:AbeIGcm: +AbeOOnB:AbeWftn:AbeYKyQ:AbeZPRT:AbeZyjY:AbemDNr:Abeqmlc:AbeuvyT:AbeybJH:AbfArxk:AbfBdBK:AbfFFSC:AbfGYeT:AbfLpig:AbfNOxf:AbfOhNh:AbfVYWq: +AbfYYAH:AbfgWes:Abfqfia:AbfscaB:AbfugmK:AbgDejX:AbgEVLb:AbgFWpc:AbgHdbp:AbgIJgd:AbgIrXP:AbgJVUE:AbgOYEo:AbgRPEy:AbgVwke:AbgWhnS:AbgbABp: +AbgdgdF:Abgeokz:AbgfoGb:AbgfrDj:AbghbFZ:AbgiKgn:AbgnswU:AbgoWEH:AbgrFXt:AbgsOGQ:AbgzvTe:AbhHtDV:AbhIzkG:AbhNBUt:AbhTRwT:AbhVaGb:AbhaIAi: +AbhkCUM:AbhleYW:AbhnMBh:Abhpdu:AbhsWku:Abhytpx:AbiCYkB:AbiIpGm:AbiNtdI:AbiOzKX:AbiSWmW:AbiTBuk:AbiYYcC:AbiYzZO:AbigcAc:AbimUuE:AbiqCuR: +Abiseyh:AbitMbw:AbivIaV:AbiyWKj:AbjBYjW:AbjJoNB:AbjMHar:AbjPMgS:AbjTzlS:AbjVJyc:AbjWzmE:AbjcCUx:AbjcSjM:AbjhiVB:AbjuZsk:AbkAlgW:AbkOoty: +AbkSjKm:AbkUbpp:AbkWJeM:AbkaEFN:AbkaPyH:AbkfSNd:AbkffYl:Abkjmay:AbklHEl:AbkmrYW:AbknHS:Abkpivy:AbkrPCS:AblBhZk:AblDfTP:AblEKYO:AblPdKv: +AblbvYj:Ablfbjv:Ablhchq:AbljDnL:AbmBwOk:AbmGhzR:AbmHhzr:AbmIfti:AbmLPRS:AbmQNUX:AbmVLeC:AbmXbrK:AbmZNQE:AbmaUz:AbmbBXm:AbmbBhe:AbmeCSr: +AbmesDp:Abmhvys:AbmjZIy:AbmlbJo:AbmmsED:AbmncHh:AbmuoLh:AbmurPp:AbmwNxx:AbnBQec:AbnCwKG:AbnDgaB:AbnGVug:AbnIjzu:AbnPlTk:AbnPqTC:Abndfix: +AbngUkd:AbnkJuf:AbnlZUN:AbnlclH:AbnmMZh:AbnuQZz:AbnyIK:AbnztJB:AboCoLC:AboDgPb:AboEpIw:AboFBFj:AboGOXv:AboJSDU:AboOFsS:AboRAwB:AboWxrf: +AboXEdV:AboaWEC:AboftuV:Aboooz:AborZuG:AborcLA:AbpABUM:AbpApg:AbpBuaw:AbpFxVE:AbpKlDc:AbpMsDo:AbpRoby:AbpTgZH:AbpUtBW:AbpVBik:AbpbkSm: +AbpeWkl:AbpfMXQ:AbpfeZM:AbpsHNP:AbpsOuC:AbqAtdf:AbqDbeN:AbqGBuD:AbqJzmr:AbqPbPK:AbqXndv:AbqXoBp:Abqeeyg:AbqgMbX:Abqsiil:AbqtEJE:AbqycAl: +AbrGzlJ:AbrHisl:AbrIJyz:AbrNYtJ:AbrPsIQ:AbrQUvd:AbrRbPR:AbrSMgJ:AbrSROb:AbrZyHy:AbrfDIi:AbrllhQ:AbrmANw:AbroYo:AbrwNaY:AbrwezD:AbrzIIX: +AbsConR:AbsEiSy:AbsIKUD:AbsKYJG:AbsLSbh:AbsMzLC:AbsNiSe:AbsOJYs:AbsPzMU:AbsWUVm:AbsYMGC:AbsYRok:Absarkg:AbsjMiy:AbsqlHx:AbsveHZ:AbtCHdu: +AbtFNqG:AbtHRCl:AbtTbDQ:AbtWRau:AbtbCsP:AbtbsdR:AbtcFD:AbtgiDb:AbthStv:AbuCJbe:AbuCyuX:AbuDOnl:AbuJoNv:AbuNGcC:AbuRTtv:AbuRYSo:AbuTEce: +AbuTxUI:AbuUEIM:AbuVCat:AbuXFmN:AbubVOG:Abugjgk:AbuhtmR:AbuoemF:AbuzBlJ:AbvClTL:AbvCqTd:AbvDEDX:AbvNYAV:AbvQvfJ:AbvThNv:AbvVNqC:AbvWgae: +AbvhUkC:AbvlRnb:AbvoZUi:Abvoclo:AbvpOgt:AbwDbdb:AbwIqts:AbwKEdo:AbwPStc:AbwUvZZ:AbwXBFs:AbwagMb:AbwlQzJ:AbwucLx:Abwytuo:AbxDnDt:AbxDobr: +AbxQRlY:AbxWgZc:AbxXxVN:AbxYwYb:AbxaEjg:AbxhZnM:AbxkKZX:AbxorvK:AbyBagK:AbyChLQ:AbyCkTu:AbyHYkT:AbybUuS:AbyfdUI:AbyfrZ:AbyoQXI:AbypZNv: +AbyurVp:AbzFKub:AbzGSBN:AbzTgsi:Abzixkj:AbzmqWJ:AbzqJhg:AbzvniB:AbzxCUn:AcADymQ:AcAFibB:AcAMSR:AcATkUT:AcAUbGE:AcAUdbR:AcAVaLP:AcAYOmq: +AcAaduY:AcAajTx:AcAbixY:AcAcMle:AcAkfea:AcAlXHg:AcAnkps:AcAnzCW:AcAtSfl:AcAtTKZ:AcAtXfU:AcAwXhH:AcBEObq:AcBEroD:AcBIcLC:AcBYAVg:AcBfhep: +AcBhQMb:AcBlGvb:AcBmlFY:AcBuQXm:AcCEEmE:AcCEfyg:AcCEjiC:AcCGkCZ:AcCJOBH:AcCMscD:AcCNclz:AcCOQbK:AcCOdfg:AcCOlfQ:AcCPezp:AcCRRmW:AcCRrJB: +AcCUGWK:AcCUteF:AcCayPC:AcCecxG:AcCjMPg:AcDGJdq:AcDIGYd:AcDIiGN:AcDKeZI:AcDUAnI:AcDYFBJ:AcDkGkb:AcDkuoI:AcDlWRE:AcDswkb:AcDtHOd:AcDxVZu: +AcEAulf:AcEFCAL:AcEFeTN:AcEGsAj:AcEQGRd:AcEWwUi:AcEyORd:AcFLzYB:AcFTKkf:AcFTSnz:AcFTmON:AcFTykp:AcFjMcr:AcFkMwa:AcFlFMa:AcFtBYF:AcFtMVY: +AcFvspF:AcGAAal:AcGPcrd:AcGThIE:AcGbTyj:AcGpgGe:AcHAyMs:AcHBzdZ:AcHCboa:AcHHlVU:AcHMISe:AcHOMZR:AcHOxOb:AcHQkuv:AcHSalr:AcHYUXf:AcHtDbL: +AcIDksj:AcIHzDS:AcIKYLW:AcISJKT:AcIXbOH:AcIYFJv:AcIZDMi:AcIcImc:AcIelZq:AcIiwtH:AcIjxpR:AcIkDBe:AcIwSfG:AcIwTKq:AcJCfdf:AcJDfrz:AcJHsGV: +AcJJJdf:AcJJpgf:AcJKFOk:AcJNbR:AcJRSqa:AcJTGBF:AcJZRkX:AcJZWjD:AcJbzmo:AcJfNni:AcJgbZE:AcJhbNA:AcJhiOu:AcJilLy:AcJjtXO:AcJrBxx:AcKAQbB: +AcKAdfn:AcKAlfX:AcKCiZF:AcKHKng:AcKJoQx:AcKJrbk:AcKSbYf:AcKXSQj:AcKYkCS:AcKZGbM:AcKdLKN:AcKklYB:AcKlEeY:AcLDwuO:AcLLXlh:AcLTRUw:AcLTzHJ: +AcLVObD:AcLVrpB:AcLXfwe:AcLXvKg:AcLYJdN:AcLZsjn:AcLfOrB:AcLoWRZ:AcLpDFx:AcLyNHc:AcMBFbZ:AcMRGyt:AcMYsAc:AcMfYbO:AcMiAtE:AcMlORM:AcMlwKr: +AcMtGKr:AcMtuOY:AcNBYLW:AcNETb:AcNIhLR:AcNaWOt:AcNcYSl:AcNevtu:AcNhIqd:AcNjhRL:AcNrQKY:AcNtekP:AcNuODB:AcNyLHp:AcOCZVT:AcOFgJt:AcOHCzb: +AcOOSOh:AcOeEFh:AcOekxj:AcOfvNp:AcOhWEv:AcOnIQo:AcOphrG:AcOuHoU:AcOuixW:AcOxQkR:AcOyuzA:AcPBTqn:AcPOAms:AcPQnOY:AcPUGmV:AcPWDmG:AcPZCgd: +AcPdXHm:AcPiiC:AcPrZkz:AcPxQmx:AcPxfED:AcQAlve:AcQDIsU:AcQFMzb:AcQFxoR:AcQKzDj:AcQLLdW:AcQTYMd:AcQVQei:AcQWksS:AcQhIZE:AcQiTKh:AcQiXfg: +AcQjuXW:AcQniuR:AcQqpVa:AcQxZKm:AcRByOE:AcREKNE:AcRFIUQ:AcRGGBo:AcRMRkq:AcRMWjm:AcRTbYa:AcRUSqH:AcRWfrS:AcRZyfX:AcRaGvP:AcRaeKM:AcRbsyn: +AcRbzkr:AcRdBxq:AcRjrFN:AcRnkJA:AcRybZL:AcRzusP:AcSAsgF:AcSCJDv:AcSCpGv:AcSEbpO:AcSExHf:AcSGRmE:AcSGrJP:AcSIkbl:AcSMGbV:AcSNIuh:AcSSRKH: +AcSSWJT:AcSVezB:AcSlBXH:AcSsKQi:AcSsvWt:AcSvkjx:AcTQlVw:AcTYaxG:AcTmVZc:AcTvBET:AcUFGRR:AcUICAz:AcUIeTx:AcUKzon:AcUauia:AcUiapy:AcUkfi: +AcUnvBH:AcUouzY:AcUrjJK:AcUtIcC:AcVbHOw:AcVbiXu:AcVmDRW:AcVmlDK:AcVnggn:AcVqvnR:AcVrEfJ:AcVrkXH:AcVsInb:AcVviP:AcWAbPD:AcWEcrv:AcWXgJO: +AcWkQkI:AcWluzZ:AcWqIQt:AcWtMCY:AcWvFmJ:AcWyvNk:AcXCQEW:AcXLCgm:AcXNKQu:AcXViBN:AcXblzV:AcXqdUU:AcXqjtt:AcXriXU:AcXsMLi:AcXuZkS:AcYHnoi: +AcYKymd:AcYMbOv:AcYPWWg:AcYSCGT:AcYTKql:AcYXpHL:AcYhmzK:AcYjEtz:AcYjIga:AcYkbFk:AcYpTzw:AcYwduL:AcYwjTm:AcYxwRM:AcYyMlp:AcZBgMd:AcZEyOb: +AcZNAVR:AcZPizc:AcZUEMI:AcZUfYk:AcZUjIO:AcZUoVL:AcZWkcV:AcZZObD:AcZZroq:AcZgBxV:AcZhlyg:AcZkQXx:AcZmIP:AcZnecZ:AcZqypO:AcZucXK:AcZzMpk: +AcaALdy:AcaCoaM:AcaGKqE:AcaIwgU:AcaJEiO:AcaKpHe:AcaQNUJ:AcaSWWN:AcaXAMJ:AcaeTkR:AcafdeB:AcakwRd:AcamEtS:AcamIgH:AcaqyCV:AcavKUI:AcbDYsd: +AcbDdeJ:AcbNXCB:AcbQdFR:AcbQlFd:AcbRcLO:AcbSizz:Acbbecc:AcbflFU:AcbmMpr:AccAARE:AccGAvB:AccKgmt:AccSXck:AccTOBt:AccTrOA:AccWclf:AccXclF: +AccYYSM:AccYdEc:AccgeCJ:AcckGVg:Acckekz:AccuhEu:AcdAtJW:AcdChSO:AcdJTxd:AcdMMDD:AcdRFBN:AcdVVvi:AcdYwut:AcdaICh:AcdaOLv:Acdgice:AcdyATQ: +AceEaXl:AceFJDL:AceHGyY:AceHigs:AceJezt:AceOCAH:AceOeTJ:AceXFbw:AcebQYR:AcegjJY:AceiIcQ:AceiOlO:AcejuOt:Acenapk:Acenza:AcewNhA:AcfDAAq: +AcfEGA:AcfHbXv:AcfJAvs:AcfJlRK:AcfJyBp:AcfQMqw:AcfQwoa:AcfUzYF:AcfXCZV:AcfdTYW:AcfeGiK:AcfmSXK:AcfvvnD:AcfxWeB:AcfyWOK:AcgFYuc:AcgJDtk: +AcgNbxo:AcgWMQn:AcgWwOx:AcgYHjY:AcgiMCo:AcglJWC:AcgsOlr:AcgwFTZ:AchBubP:AchEAmh:AchHkuJ:AchJalN:AchKGmM:AchQlVi:AchTISY:AchTOa:AchVMZn: +AchaXhY:AchbkPm:AchbzcI:AchcKuk:AchlxPG:AchxIzI:AchySFR:AchyTkd:AchyXFk:AciAOTK:AciBbOd:AciEWWu:AciEgx:AciJuBi:AciMksf:AciPkUs:AciRaLw: +AciWlvP:AcifVmy:AcijkpT:AcijzCp:Acinmzy:AcisJKP:AcjBsCZ:AcjDcLD:AcjEizq:AcjJfYy:AcjKJas:AcjLkcD:AcjMfrf:AcjQsGJ:AcjSJdz:AcjSpgz:AcjUbPC: +AcjUxhj:AcjWRMI:AcjZyOp:AcjbheW:AcjhLky:AcjnlyU:AcjoNnu:AcjpEEn:AcjpbTW:AcjstXS:AckBfDa:AckEXcr:AckGsca:AckOGWn:AckOtec:AckQJAh:AckSoQt: +AckSrbg:AckZFol:AckazMh:AckuEeU:Ackubtl:AckvbzB:AclDFBI:AclHVvn:AclJwWA:AclKrmh:AclOAnj:AclYCav:AclYett:AclcVZv:AclgDFD:AclhWRf:AcllATv: +AclpHOG:AclquIm:AclvHBr:AclyaPu:AcmBzha:AcmCsAG:AcmEOBO:AcmErPI:AcmFMNp:AcmFfWN:AcmFvkL:AcmXJDE:AcmbmsG:Acmfupm:AcmnWrQ:AcmoDfs:AcmuORI: +AcmuwKv:AcmvHop:AcmxNhh:AcnBSog:AcnCYUA:AcnQbpP:AcnUcRb:Acnjcil:AcnnBYy:AcnnMVf:AcoQCzf:AcoYeG:AcodfYT:AcodvTz:AcoqWEr:AcorYsc:AcosEo: +AcotOdM:AcpDlVv:AcpGISF:AcpKkuU:AcpMalQ:AcpTUXe:AcpUubO:AcpbMzT:AcpnwTB:AcpoxPX:AcppDbo:AcprhBw:Acptpvr:AcpxIMi:AcqATQe:AcqDzDv:AcqIsub: +AcqJlvy:AcqMJKq:AcqSFJS:AcqToQ:AcqVDML:AcqabFP:AcqxVmp:AcrBHnl:AcrDsGs:AcrNSqD:AcrPGBc:AcrQQmQ:AcrUiOL:AcrVWja:AcrXbyh:AcraQXS:AcrbNnL: +AcrftXj:AcrrUW:AcrsrFB:Acruvwa:AcryJHp:AcsAGWe:AcsAteh:AcsFARw:AcsGHNE:AcsSbyd:AcsTSQM:AcsUIuT:AcsVGbj:AcsWQMX:AcsiuSU:AcsmkjD:AcsyrfK: +ActBxnm:ActGFBP:ActKVvw:ActLCao:ActLetm:ActWiGT:ActdNHf:ActruZL:ActuseU:AcuHxNd:AcuIANZ:AcuMFbY:AcuPlvr:AcuUTXs:AculVzf:AcvHUBp:AcvZhij: +Acvafyv:AcvavtX:AcvfDRS:AcvflDO:Acvfxjz:AcvouZg:AcvqODo:AcvrYNk:Acvtkqq:AcwBgJk:AcwGgk:AcwKSOw:AcwaEFw:Acwakxu:AcwdWEi:AcwjIQp:AcwlhrX: +AcwmgGS:AcwqHoJ:AcwqixH:AcwtQkM:AcwveKD:AcwwOdV:AcwysPi:AcxAfoG:AcxJZK:AcxQLDM:AcxSoAy:AcxUCgi:AcxVEvl:AcxWKQq:AcxXKQQ:AcxYwGa:AcxaxPQ: +AcxbmCx:AcxfXhO:AcxnZkW:AcxouxM:AcxsiUH:AcxtQmU:AcxtfEi:AcxuTKf:AcxzRT:AcxzdUQ:Acxzjtp:AcyBMzA:AcyBxoq:AcyRQeJ:AcySbGt:AcySdbc:AcyUibS: +AcyWyqn:AcycTKK:AcycXfD:AcydIZf:AcyeBg:AcyiMZd:AcykXHv:Acymkpb:AcymzCF:AcytZKN:AcywmcA:AcyzQML:Acyzfep:AczBIUr:AczJeZX:AczLrjj:AczQArQ: +AczWAVV:AczbQyz:AczerFM:AczfYTD:Aczmsym:Aczmzkq:AdABjxl:AdAFxZv:AdALXqu:AdATFky:AdAUzW:AdAbQPd:AdAkqTZ:AdArZtl:AdAuOyE:AdAvnwj:AdAwBCF: +AdAxBWB:AdAxIVv:AdAyLUz:AdAzTAL:AdBHjXe:AdBLRVu:AdBSICG:AdBXkwf:AdBZOHy:AdBcKsb:AdBhQpm:AdBmmIO:AdBtlRO:AdCCZQm:AdCCrLP:AdCFQew:AdCGFnB: +AdCKxuO:AdCMgke:AdCTWlH:AdCbIzY:AdCcMJK:AdCfWEL:AdCgUIa:AdCsLbA:AdCvWrz:AdCvokE:AdDATsB:AdDCHjZ:AdDGSFO:AdDJtAq:AdDKXXj:AdDQwYT:AdDYWLa: +AdDZaDa:AdDaouc:AdDdYyn:AdDgIZp:AdDjUYX:AdDkWee:AdDyamD:AdEAOHm:AdECTNs:AdEEmcK:AdEHBiW:AdEJhca:AdEMzC:AdENKyj:AdERyUT:AdEYHUQ:AdEgMyC: +AdEqwVw:AdEsyJo:AdEuVmv:AdExihg:AdEzHKO:AdFDaxD:AdFGOhd:AdFHBaC:AdFITnz:AdFJaOF:AdFKmCB:AdFOopt:AdFSzOU:AdFVGSu:AdFXccc:AdFamZC:AdFlnEu: +AdFmMYJ:AdFuKak:AdFvVWq:AdGAKJK:AdGCfGN:AdGDfsW:AdGJSLf:AdGNcBT:AdGNjru:AdGPXVJ:AdGPmCz:AdGRtha:AdGeWMI:AdGghMR:AdGhCEY:AdGiILj:AdGoXq: +AdGtxQb:AdHEaTe:AdHHKLG:AdHJAUC:AdHMdTQ:AdHQLod:AdHTijT:AdHVXvS:AdHVmcc:AdHaxQT:AdHbZZD:AdHbzFe:AdHckLf:AdHfMcM:AdHiXer:AdHidyr:AdHlXiJ: +AdHxiCD:AdHytRi:AdHzUAV:AdIBJPi:AdIBOOj:AdIBeTo:AdIDKzp:AdIGaks:AdIIBdD:AdIRYVD:AdIUkWD:AdIViLP:AdIeQPO:AdIfXGL:AdIgEDY:AdIqERL:AdIqgoQ: +AdIrZrs:AdItbap:AdJBSzU:AdJDCuK:AdJJJpR:AdJJOoQ:AdJJetT:AdJLKZK:AdJMFKi:AdJUBiL:AdJUXQe:AdJWRSS:AdJWrtF:AdJdhfD:AdJhlRv:AdJkQpt:AdJnXgw: +AdJonWz:AdJpBmX:AdKFadg:AdKLTBM:AdKRdp:AdKSzds:AdKXQex:AdKfLbn:AdKkUPy:AdKtAIA:AdLHvOe:AdLJWnJ:AdLKRTc:AdLLaDx:AdLOaWa:AdLSgFz:AdLVgKU: +AdLhwkm:AdLphvL:AdLqUpf:AdLtHyl:AdLxnFH:AdMAHpo:AdMDcCa:AdMMCKN:AdMhmOJ:AdMiyWn:AdMjSiU:AdMkKht:AdMllQX:AdMqZDz:AdMrIAt:AdMrhVv:AdNBsVp: +AdNCylV:AdNFzOL:AdNQBIG:AdNUCku:AdNaMYs:AdNfmNi:AdNnmoq:AdNuQdm:AdOAiJj:AdOCXVm:AdOGfsp:AdOHyuq:AdOLnYm:AdOWUfB:AdOdgdo:AdOfUaH:AdOnPGs: +AdOpiTE:AdOqDdn:AdOrLcW:AdOsQgb:AdOuicz:AdPFKkE:AdPKKLn:AdPMAUj:AdPNYhe:AdPNotK:AdPNpFX:AdPXNvf:AdPnMzJ:AdPoXic:AdPpOep:AdPpnDd:AdPpvtD: +AdPqCei:AdPxMcD:AdPzemu:AdQHshP:AdQPrri:AdQPwsu:AdQRBIn:AdQRXqG:AdQTMFH:AdQZFkK:AdQpVnU:AdQpkhH:AdQsjQd:AdQwbai:AdQzOyW:AdRBhWq:AdRCdYR: +AdRCil:AdRNsHY:AdRQqTL:AdRUIvQ:AdRaIyO:AdRaqaN:AdRbnWQ:AdRdLua:AdRfTaw:AdRukHa:AdRyjqm:AdSCvoC:AdSDLOO:AdSGZVo:AdSLNGY:AdSTrDy:AdScwKK: +AdSdnfN:AdSkQfr:AdSnJsJ:AdSqUvg:AdSqgrL:AdTAaWn:AdTBXWP:AdTEgFu:AdTFwYb:AdTLEMP:AdTLcXR:AdTMtAG:AdTZrdp:AdTjBfN:AdTmMjT:AdTpWeS:AdTrUcq: +AdTtJSC:AdUHSEq:AdUNHUC:AdUPnBH:AdUWcCx:AdUdZDc:AdUeIAm:AdUehVo:AdUkmOS:AdUmSiL:AdUolQA:AdUsUbc:AdUsfTk:AdUvCPd:AdUviwz:AdUwwVE:AdVaVMM: +AdVfXSo:AdVfdkF:AdVjZdj:AdVoUcr:AdVtKHd:AdWFEHA:AdWHomX:AdWKYHK:AdWKoTe:AdWKpfv:AdWNeoP:AdWRdyf:AdWaTGu:AdWfSYJ:AdWuIAm:AdWxIIu:AdWzhMl: +AdWzjrC:AdXAFVr:AdXCHBI:AdXIyTK:AdXPjDU:AdXSOxL:AdXWkhD:AdXXKO:AdXXdYo:AdXYNef:AdXZepN:AdXaXid:AdXgPgC:AdXlSyC:AdXoUAx:AdXutrS:AdYCDYg: +AdYLakm:AdYOewA:AdYTyje:AdYdYiW:AdYejQc:AdYfERR:AdYfgoO:AdYgZrm:AdYhCAS:AdYiban:AdYoUjO:AdYpYyC:AdYrEzb:AdYzbYU:AdZBily:AdZDqTu:AdZEomV: +AdZIDyp:AdZJEcS:AdZLRSa:AdZLrtt:AdZMPX:AdZQaKZ:AdZfymO:AdZmZRz:AdZpVYE:AdZwEZU:AdaBewh:AdaJZby:AdaJgnV:AdaKKzg:AdaPxZJ:AdaRSZY:AdaTCUG: +AdaUIcr:AdaZeTX:AdabIVJ:AdathFH:Adaxlrz:AdbHdYl:AdbJaoz:AdbUxzs:AdbenWo:AdbfIyq:Adbfqap:AdbgBwG:AdbgIvs:AdbiTaI:AdbqZTi:AdcFtQ:AdcGUUC: +AdcJSfB:AdcNXxg:AdcSTBF:AdcUUas:AdcXvoQ:AdcfUvu:AdcxwKY:AddDOra:AddDuxa:AddJxUB:AddLgKh:AddNUMQ:AddSSXF:AddURIH:AddVFNO:AddVVrM:AddVmWq: +AddaEWj:AddaEyp:AddaUvH:AddrMjF:AddvUil:AdeBoPy:AdeCHUu:AdeGaXI:AdeIiYq:AdeJOHi:AdeKBAN:AdeLTNw:AdeMLKs:AdeMaoK:AdeRsvd:AdeSyLB:AdeVzoX: +AdeqMyg:AdezCpo:AdfAyuY:AdfBrQ:AdfDmCF:AdfHopp:AdfIhCl:AdfMdmC:AdfOiyx:AdffMYN:AdfojNk:Adfuouz:AdgHatp:AdgTLOq:AdgWiJA:AdgcPoU:Adgfkls: +AdgiQgI:Adgkgdd:AdgmIIg:AdgrmcS:AdhBfgK:AdhEjDG:AdhJuak:AdhMMH:AdhNyTY:AdhPKjN:AdhQtHd:AdhYSlc:AdhZLox:AdhdWmL:AdhfLee:AdhfhmW:AdhfjRx: +AdhhIlo:AdhkTgN:AdiDSZB:AdiHXqR:AdiMjxk:AdiOOhw:AdiRhwm:AdiSdyN:Adiamia:AdihKSl:AdinZtK:AdiqIYS:AdiqqAR:AdirnwM:AdivTAk:AdjAJpn:AdjAOom: +AdjAeth:AdjCkwc:AdjISzi:AdjQZBI:AdjQgNf:AdjTkwC:AdjVaKt:AdjWhWF:AdjXBDC:AdjdQpH:AdjgmIj:Adjkhfx:AdjpErK:AdjpgOV:AdjyUJV:AdkCFna:AdkCVRc: +AdkGxul:AdkLWNy:AdkNWlk:AdkOadk:AdkRXwl:AdkdUPu:AdkoaMn:AdktnQg:AdkzBFr:AdlCSFr:AdlGXXW:AdlYaWE:AdlcAiZ:AdlhUcZ:AdlhsbW:AdljUpb:AdlmnwG: +AdloUVE:AdlogRn:AdluLBu:AdmAmcd:AdmEoPR:AdmJGsS:AdmMcCe:AdmPIRH:AdmPMVy:AdmPYrG:AdmPkrQ:AdmPswM:AdmfmzE:AdmkVww:AdmlCPy:Admliwg:AdmqVmY: +AdmvdKR:AdnCOhy:AdnETng:AdnKopi:AdnOzOH:AdnRGSh:AdnajNR:AdnhnEh:AdnomNm:AdnqKav:AdnziHs:AdoAYHv:AdoAoTX:AdoApfK:AdoBRa:AdoIKKV:AdoJcBw: +AdoJjrV:AdoNYTx:AdoQFvF:AdoUnYi:AdonXEh:AdondYh:AdopxQA:AdoqXIP:AdorMZy:AdovnN:AdovxqN:AdowPGw:AdpBLFS:AdpBNvJ:AdpFfSk:AdpGyUj:AdpIOxg: +AdpLSlZ:AdpOKkI:AdpPijq:AdpRXvv:AdpRmcF:AdpVUFY:AdpWFVY:AdpYHBb:AdpaLCL:AdpbMch:AdpciCA:AdpeUAS:AdpjCee:AdpstRL:AdptiCa:AdpymCc:AdqEewZ: +AdqGfVF:AdqRiLu:AdqTqty:AdqUoMZ:AdqaOyk:AdqbXGi:AdqcZes:AdqeUjT:AdqhEzy:AdqoVyi:AdqvyMC:AdrHQz:AdrIFKN:AdrQBik:AdrQXQB:AdrSMfM:AdrTYvX: +AdrgQpS:AdriOYR:AdrjBcq:AdrlBwU:AdrlIva:AdrmLum:Adrrjqa:AdrvbAl:AdsARtY:AdsDXwe:AdsNzdv:AdsPSxa:AdsRRio:AdsUNGE:AdsvDGE:AdsyHYv:AdtBvOF: +AdtVZvj:AdtbwkN:AdtcnFK:Adtjhvo:AdtmUpE:AdtpUVb:AdtpgRI:AdtzQFw:AduAswz:AduEQfo:AduGhcW:AduIPwQ:AduQSEu:AduSIRQ:AduSkrH:AduSswT:AduVBiA: +AduZCKs:AdubyJY:AdueyWs:AduhlQE:AdumZDg:AduxKhI:AduyXsb:AduydKK:AduzLBH:AdvBzOc:AdvMHuN:AdvYIrX:AdvYMvi:AdvYYRW:AdvYkRA:AdveCpi:AdveiWw: +Advgyjp:AdvlSIA:AdvnlqL:AdvsZdn:Advthvb:AdvxUcv:AdvzNEv:AdwFOXA:AdwMLfu:AdwMNVl:AdwPEHe:AdwQgtc:AdwXeot:AdwbIIQ:AdwhPoc:AdwiklE:AdwtYzZ: +AdwvtCR:AdxAcbG:AdxAjRf:AdxBKkf:AdxEKLM:AdxGAUI:AdxJYhF:AdxJoth:AdxetRC:AdxfoyM:AdxlND:AdxpTgx:AdxwIix:AdxyLeS:Adxyhma:AdxyjRN:AdyEiLj: +AdyGqtf:AdyHoME:AdyNGTx:AdyXdyX:AdyZaON:AdyjVnv:Adyjkhk:AdyqZrI:AdyvIYE:AdyvqAD:AdyyYyG:AdzBDyl:AdzNomJ:AdzQIvt:AdzWYvq:AdzaEZi:Adzdjqh: +AdzeErY:AdzegOD:AdzfZRf:AdzhbAe:AdzrKsU:AeADBnP:AeADcjm:AeAGSxC:AeAJFEg:AeAJTQe:AeAOeLs:AeAQOkH:AeATWAe:AeAVGMH:AeAdVVA:AeAecCb:AeAfDSz: +AeAgWOX:AeAieiG:AeAkFro:AeAmZhH:AeAoYuT:AeAvfgv:AeAyNjX:AeAyNqj:AeBBweC:AeBGlWD:AeBLHmp:AeBOLAD:AeBQWRb:AeBSFmu:AeBbEAZ:AeBfPnD:AeBjnji: +AeBkHem:AeBrWLJ:AeBruce:AeBsZHG:AeCAGzG:AeCBNAg:AeCCKZS:AeCDvmg:AeCJYhR:AeCLFgM:AeCLHkJ:AeCVFRZ:AeCWiqd:AeCcZOr:AeCgZxe:AeCohac:AeCuhGM: +AeCxFgT:AeCyyAV:AeDADrU:AeDFXjP:AeDGGZL:AeDIXmP:AeDJnPo:AeDQMdW:AeDRGIH:AeDRynJ:AeDVEWi:AeDVMTL:AeDcUPF:AeDdPSC:AeDfGcu:AeDhFBC:AeDiZoy: +AeDisdT:AeDllod:AeDnXKn:AeDtCYO:AeDtwyS:AeEABEW:AeEBOjd:AeEEYTq:AeEGtJt:AeEPRMg:AeERJaq:AeESrwZ:AeETVII:AeEWZfT:AeEeXDU:AeEjbDv:AeElGcO: +AeEmIzE:AeEophW:AeEpvbr:AeEqfwI:AeErDpg:AeEsydD:AeEtNpo:AeEuIMh:AeEupRr:AeEvXDL:AeExKgt:AeEzlyu:AeEzxAf:AeFFcv:AeFFrKV:AeFGyvx:AeFHOJs: +AeFIKSd:AeFQQbG:AeFVpRb:AeFZcZg:AeFbcsH:AeFdVFz:AeFgesB:AeFhCFo:AeFjprE:AeFkNPX:AeFqWVW:AeFrIZr:AeFsGCx:AeFwkDV:AeFymCi:AeFyyDS:AeFzXdb: +AeGAGqh:AeGGeIH:AeGHAxZ:AeGOIVZ:AeGWDHT:AeGWiIw:AeGgzse:AeGhvKA:AeGnNcd:AeGobZo:AeGtCcK:AeGuPUo:AeGulLh:AeGwTWX:AeGzefx:AeHDJDt:AeHDekl: +AeHEtdI:AeHHXyG:AeHMoDq:AeHPUxC:AeHQKeN:AeHYXch:AeHhSuf:AeHnjBQ:AeHorFF:AeHpvkx:AeHrBae:AeHsbWK:AeHtILF:AeIAeLz:AeIGygs:AeIYSxJ:AeIYpP: +AeIhwfg:AeIiFUM:AeImWll:AeImuCC:AeIqPNb:AeIunJO:AeIyfSf:AeJDPmD:AeJEFmj:AeJJOKx:AeJMyGj:AeJQFeW:AeJQTqU:AeJSVgD:AeJXukK:AeJbNJh:AeJbNQZ: +AeJdsiL:AeJfZHx:AeJhYUd:AeJkGDL:AeJmDsJ:AeJmNG:AeJnccR:AeJoFuT:AeJreIw:AeJvpoY:AeJyFoO:AeKQPrG:AeKRMpa:AeKVrlv:AeKYCBc:AeKkBHi:AeKkKEB: +AeKouFt:AeKxgPR:AeKzWQK:AeLATkS:AeLBbtk:AeLBhSq:AeLCYHB:AeLEHKZ:AeLKNaw:AeLMvMw:AeLUyXx:AeLXMPX:AeLaZXU:AeLgQPo:AeLmbTY:AeLryaF:AeLsBhP: +AeLwufM:AeMCrkh:AeMDgaN:AeMEOjM:AeMHKSw:AeMJgqD:AeMKKZN:AeMKZL:AeMLHxl:AeMMYRC:AeMOUfP:AeMWczY:AeMZPJC:AeMdQod:AeMemcw:AeMeydM:AeMkzLi: +AeMpkMN:AeMtoYw:AeMzeFQ:AeNFonw:AeNIrKq:AeNKOJT:AeNLvGU:AeNNZFd:AeNQgfq:AeNZSyE:AeNdIZu:AeNfHZK:AeNikDQ:AeNkCFH:AeNqxIo:AeNuBhX:AeNvkmW: +AeNyesE:AeNzoyn:AeODXCv:AeOHDHs:AeOHiIP:AeOXeIo:AeOfiYL:AeOfjsM:AeOgCcl:AeOhOql:AeOuthy:AeOxjbo:AeOyzsb:AeOzlxy:AePAAXJ:AePCaYe:AePGwcK: +AePHUkB:AePIeh:AePLXcA:AePPDhD:AePPiig:AePdBal:AePhNCT:AePkyax:AePnjSz:AePqMVz:AePwNCt:AePypqw:AeQPSCP:AeQQdGZ:AeQZcDv:AeQdYjl:AeQeFOM: +AeQiYPv:AeQpaiJ:AeQrKCu:AeQuepg:AeQwqGG:AeQxqGg:AeRDLAr:AeREVgM:AeRFWRT:AeRLlWr:AeRQxRS:AeRUweu:AeRWdgQ:AeRbFwF:AeRiYJG:AeRinkW:AeRnVvX: +AeRoaNN:AeRqWoA:AeRruws:AeRuZSe:AeRvJvu:AeRwmXu:AeRxmXU:AeSBPaQ:AeSLLWv:AeSLiqr:AeSXKZE:AeSYglm:AeSqYjS:AeSsezj:AeSthau:AeStqO:AeSzIfr: +AeSzQXh:AeTCLwY:AeTKMPq:AeTVMdE:AeTVavO:AeTWlgt:AeTahgt:AeTbFGm:AeTcqxk:AeTdkLy:AeTeyao:AeTfZZY:AeThufd:AeTjuWe:AeTxQPF:AeUBplI:AeUCoNU: +AeUERMU:AeUFSYG:AeUGKsa:AeULPJX:AeUMjxk:AeUTBEe:AeUUqeD:AeUgDpU:AeUjtEy:AeUmeFj:AeUsSS:AeUskMu:AeUtzpJ:AeUwoYL:AeVAKsG:AeVBHOp:AeVBbXj: +AeVFdNg:AeVFzUQ:AeVJqEo:AeVKBeN:AeVLSyL:AeVOYth:AeVRSbw:AeVSPjs:AeVUGTD:AeVbNUm:AeVbzlY:AeVhlCN:AeViLPn:AeVjTyt:AeVmQOT:AeVnbXP:AeVoXdL: +AeVsefa:AeVvqgt:AeVwFFT:AeVzvBk:AeWAYXA:AeWAeeU:AeWCUKl:AeWNAxd:AeWOKEI:AeWSYTn:AeWZXpQ:AeWaIla:AeWdbZq:AeWkszM:AeWoeff:AeWopqc:AeWqQjb: +AeXGYxH:AeXPYvQ:AeXYIvm:AeXZdPz:AeXboTP:AeXguMJ:AeXhbWe:AeXslXi:AeXtrFh:AeYDdGs:AeYLGMS:AeYNxrq:AeYPARN:AeYPjLl:AeYRwEW:AeYWlwP:AeYaFrt: +AeYcoVC:AeYdmxW:AeYgaiQ:AeYisYq:AeYmAtI:AeYnfST:AeYpyyH:AeYrEaN:AeYvPNP:AeZFBCE:AeZJdgJ:AeZduwH:AeZhJvN:AeZkKce:AeZkmXN:AeZkrI:AeZnePw: +AeZoFfE:AeZoaIh:AeZqqgw:AeZrwFL:AeZuATp:AeZyGhk:AeZyaIZ:AeaAGtD:AeaCciA:AeaGuKg:AeaIBhn:AeaTPMH:AeaUFMf:AeaZOkt:AeacJVP:AeamfgJ:AeapgGG: +AeaplnC:AearNjd:AearNqV:AeasgkL:AeavZht:AeaxYuh:AebFSXH:AebIBCl:AebQBHY:AebUGmC:AebWxRa:AebaFfL:AebaaIa:Aebbsya:Aebdcci:AebfWoS:Aebguwa: +AebheIL:AebjFRd:AebkJvg:Aeblpob:AebnYJU:AebnnkE:Aebvggp:AebvlNt:AebwfsD:AebxNJS:AebxNQa:Aebzsiw:AecDDRZ:AecKAXF:AecQTKG:AecRhse:AecSYhV: +AecTlGI:AecUFgI:AecUHkN:AecgPsL:AecidlD:AecniuO:AecoQXZ:AecoVUi:AecpWQf:AecqZxA:AedANah:AedCvMh:AedOXjT:AedQAxM:AedVLwo:AedViQk:AedWTkL: +AedbsdP:AedfZXj:AedgVaU:AedmPSG:AedndLo:AedoGcq:AedthgB:AeduIFK:AeduQxQ:AeduVub:AeeAKZc:AeeCYRn:AeeIprq:AeeLAES:AeeMczt:AeePtJp:AeeRHCu: +AeeTQBT:AeeTarL:AeeXAPM:AeeYrkE:AeebKgP:AeedlyQ:AeedxAB:AeehVfI:AeejfwM:AeetbDR:AeeuGcK:AeewVfi:Aeeykde:AefDYtz:AefFKsU:AefGGeT:AefORml: +AefQJAz:AefRrWQ:AefSViB:AefTQyW:AefaryJ:AefctSL:AefeXdG:Aefixam:AefkcsT:AefpfWB:AefqDPl:AefrmCu:AefryDO:Aefsjns:AeftImc:Aeftpry:AefzWVK: +AegGdpA:AegOEjF:AegQAxV:AegSayy:AegWuea:AegWwCW:AegdefT:AegdpqQ:Aegergn:AeghTSg:AegtBAp:AegxNcH:AehClfK:AehMTin:AehONyu:AehSjXF:AehVeiM: +AehhopX:AehkrGg:Aehnbzj:AehseDk:AehypQx:AeiCSxf:AeiEARP:AeiEjLr:AeiLOkM:AeiTLaN:AeiVWrh:AeiWPMQ:AeiacCG:Aeieeib:AeigEaP:AeiiZhm:AeikYuq: +AeinGdY:AeirFWz:AeislnZ:AeiuNqO:AeiwsIY:AejClWg:AejFyGv:AejGcdh:AejKLAg:AejNFmv:AejSOKd:AejXSXO:AejZAry:AejgwFb:AejhFuH:AejlWLi:AejlucF: +AejoZHd:AejqYUx:AejuYs:Aejxfsc:AejyggW:AejylNS:AekGVfv:AekHemI:AekSLWM:AekSiqI:AekbzUI:AekhCyi:AekhwYu:Aekiezq:Aekpluy:AekrFgy:Aektklm: +AekvZzM:AekxuFp:Aekzuwq:AelBXjO:AelCGZS:AelDAuW:AelEKzG:AelFnPp:AelMJSD:AelNGIW:AelNynU:AelOHG:AelOvOZ:AelPIFD:AelPeMp:AelREWv:AelRMTS: +AelUawA:AelUrLK:Aeljzup:AelpCYP:AelpwyL:Aelwgpo:AelyWqv:AemLfzK:AemMrww:AemOQYq:AemQKSs:AemZplv:AemfWvM:AemgIzh:AemleSX:AemmCfu:AemoIME: +AempNpB:Aemtxir:AemyLpZ:AenBrKu:AenCgAS:AenDOJP:AenIHcE:AenKQbd:AenQGfm:AenRpRA:AenSAec:AenVcZD:AenZKzS:AendmCj:AendyDP:AenlWVT:Aenzzlt: +AeoAodk:AeoCIKH:AeoDAxy:AeoGcJv:AeoWeeH:AeoaszP:AeoiqIC:AeomyAk:AeooPUL:AeoolLK:AeopiYh:Aeopjsi:AeoqOqh:AeorotD:Aeoxbwq:AepAdPq:AepBQg: +AepCGQt:AepFsLj:AepIoDT:AepKIkw:AepfeDr:AepkrFc:AepqTsw:AepuyaT:AepvCCW:AepwPus:Aepwllt:AepxTwd:AeqACd:AeqBGMf:AeqDxrD:AeqHwEb:AeqIPMZ: +AeqVBcI:AeqZdGF:AeqbanY:AeqdfSa:AeqiWlK:AeqiuCd:AeqlPNe:AeqlmE:AeqqEH:AeqtuWD:AeqxJVB:AeqyZsR:AerCelF:AerSTrY:AerYcdq:AerhYpq:AeriDso: +AerkFuq:AeroWLP:AersTjy:AertFoJ:AerzATG:AesBFRp:AesHyxB:AesMMpb:AesPnpN:AesXGii:AesXyNk:AesYVfq:AesabtC:Aesciua:AesdNwi:AesgklJ:AesjRRM: +AeskuFW:AesmuwV:Aesnfto:AestXkO:AesvXmL:AesxYjo:AetGgLF:AetQPAZ:AetSPRS:AetXgLf:AetYUXK:AeteFBu:AetmKeV:Aetnyak:Aetzhgp:AeuKLdV:AeuLplm: +AeuMyVY:AeuNbwV:AeuPSYc:AeuQvgS:AeuVdeu:AeuapRD:AeueKgb:AeukHzM:AeulkMq:Aeumvbd:AeupoYH:AeuveFn:AevAkZB:AevBonZ:AevDRmZ:AevFKSn:AevJZFI: +AevKHOt:AevKbXn:AevLGeb:AevOdNc:AevOzUU:AevSena:AevTqEK:AevfDPZ:AeviUmp:AevnlYH:Aevrkmz:AevszPE:AevvoyC:Aevytev:AewLuew:AewLwCA:AewTEjP: +AewciYq:Aewcjsp:AewfMvp:AewiBAf:Aewqthd:Aewtjbr:AexBUka:AexFXcb:AexJDhg:AexJiiD:AexNKeD:AexRYtc:AexYsLE:AexjOQx:AexkTwK:AexneFk:AexnpQn: +AexpQJo:AexquMn:AexrqiS:Aextrvs:AeyCBnG:AeyCcjz:AeyCmI:AeyJSCu:AeyVSxT:AeyYBcp:AeybVVv:AeymKCp:AeypEyf:AeyqFFP:AeytcCu:AeyvWOO:AeyxeiP: +AeyzFrx:AezKGmV:AezMxRt:AezOArK:AezOjli:AezQweR:AezSdgv:AezePnU:Aezinjx:AezkaNi:AezlATL:AezmfsQ:AezqEAK:AezrovF:AezvFfy:AezvaIT:AezwePK: +Aezxsyt:AfAArad:AfACHuj:AfACfFy:AfADPdB:AfAFBMZ:AfAHAOw:AfAIEtE:AfAJVvo:AfAOGuZ:AfATiee:AfAdwHC:AfAqLVN:AfAsZLE:AfAuKua:AfAvYXw:AfAwzcA: +AfAxsEU:AfBGrAm:AfBHjYM:AfBIHUc:AfBIXBu:AfBIffp:AfBTJFi:AfBYPDk:AfBaDUh:AfBezvz:AfBizAm:AfBjQaz:AfBnySM:AfBpECt:AfBuBMa:AfCACcQ:AfCOosE: +AfCVIDI:AfCVrML:AfCZggC:AfCbnOW:AfCgwoA:AfCmFnH:AfCnddz:AfCzKTF:AfDCFCN:AfDEjXY:AfDJhzY:AfDSRRi:AfDTGXO:AfDUoSL:AfDXkjv:AfDZGHE:AfDahCs: +AfDdYfO:AfDgJwP:AfDgYge:AfDgjgs:AfDmwOH:AfDogZg:AfDtqVe:AfDuMZv:AfEBesE:AfEEaau:AfEFpGj:AfETlYT:AfEhiup:AfElPHh:AfEnYXg:AfEqJje:AfErohd: +AfErpYl:AfEsOmH:AfEtmoe:AfExqss:AfEzQPO:AfEznDu:AfFBWzc:AfFGSUn:AfFJeSr:AfFvYxP:AfFwcZS:AfFxcZs:AfGAwXO:AfGChTU:AfGGpDI:AfGGtHO:AfGObqx: +AfGSgTb:AfGdyIN:AfGffNU:AfGmpWa:AfGnqKo:AfGpfVu:AfGuFJe:AfGvamx:AfGyGrZ:AfGzApR:AfGzgQc:AfHEUyU:AfHFoRy:AfHIhtN:AfHLsAr:AfHOpte:AfHThyo: +AfHcas:AfHcket:AfHlwvi:AfHpzJM:AfHtySo:AfHufvN:AfHyyiu:AfIAVtI:AfIIYaF:AfINmif:AfIOJfO:AfISfKt:AfIXBMU:AfIXHjO:AfIYYWo:AfIYgpm:AfIdLlZ: +AfIevXt:AfIhbQN:AfIkrKI:AfInUnR:AfIrBmG:AfItIle:AfIunnm:AfIwxtH:AfIyysk:AfJAAog:AfJJuAG:AfJLHeD:AfJRpXV:AfJTmIY:AfJVmym:AfJWJFp:AfJgsDf: +AfJmwhS:AfJnbqq:AfJoYxg:AfJpzCQ:AfJqseE:AfKDkJt:AfKEEYY:AfKFBay:AfKFhvc:AfKJDwt:AfKJZlB:AfKLfX:AfKLggH:AfKRrGR:AfKXgmw:AfKoZir:AfKqqvG: +AfKrYAV:AfKuudo:AfLRPUJ:AfLSOwV:AfLUrtV:AfLWkJb:AfLdEjd:AfLgYfv:AfLlXPN:AfLoXxW:AfLwdIV:AfLxBAX:AfMAxZW:AfMDlCZ:AfMJERS:AfMTEPn:AfMUesl: +AfMafAy:AfMbLUN:AfMbpLI:AfMdohm:AfMdpYe:AfMeOmA:AfMgmoL:AfMhNyu:AfMkiuY:AfMlBCI:AfMoPHA:AfMtZjC:AfMvLax:AfMzYdj:AfNCNYZ:AfNGxzn:AfNKIpH: +AfNKdqk:AfNSurm:AfNYqK:AfNaOtz:AfNbUTb:AfNcBcP:AfNhYxW:AfNjLuw:AfNjjge:AfNjplp:AfNkoHt:AfNobxC:AfNpNYL:AfNtBcp:AfNvLGN:AfOALnX:AfOHUDo: +AfOIlxX:AfOJbzt:AfOOJrZ:AfOcvOr:AfOhama:AfOjAfi:AfOlApK:AfOlgQz:AfOnkZt:AfOrApy:AfOxfNL:AfPAptn:AfPFtkV:AfPJCSw:AfPJbWJ:AfPNUdf:AfPaUzP: +AfPeCFi:AfPeZgR:AfPnUnp:AfPqfKu:AfPsOoB:AfPtMAV:AfPulE:AfPwAPP:AfPxIff:AfQApky:AfQBaLt:AfQDNiS:AfQFYFJ:AfQIies:AfQLYWv:AfQLgpt:AfQNEtS: +AfQPenU:AfQPmmp:AfQRaAu:AfQWjyR:AfQXtRt:AfQYIhS:AfQYlNW:AfQYrBl:AfQbFmr:AfQgLlC:AfQhZLS:AfQjbFE:AfQjxtQ:AfQqUdd:AfQvqAi:AfQvvLZ:AfQwLVx: +AfQyxrr:AfRBYAV:AfRDpXY:AfRFpKP:AfRGmIv:AfRHnxY:AfRJVTY:AfROHek:AfRPyQl:AfRRhRt:AfRSjJn:AfRUVVp:AfRdrkY:AfRnvxd:AfRrLtC:AfRtqIA:AfRzvbZ: +AfSDrGK:AfSIcTy:AfSKgmN:AfSOggq:AfSPPkf:AfSQBnS:AfSSagY:AfSTCcc:AfSWkJM:AfSXkCt:AfSZyKy:AfSaEJF:AfSbTBw:AfScddH:AfSdTjT:AfSoLzd:AfSuYAo: +AfSxZUS:AfSxnlg:AfSyOng:AfTCDWD:AfTCZLr:AfTDPUA:AfTFBNz:AfTGEwF:AfTNctP:AfTOpsp:AfTUgGx:AfTXjXk:AfTZvpS:AfTvlcM:AfTxdDa:AfTzJwb:AfTzYgW: +AfTzjgA:AfUGsVp:AfUHEPU:AfUIiRV:AfUaPHz:AfUgScN:AfUjLaC:AfUlMEE:AfUonDg:AfUrMGD:AfVFymF:AfVOual:AfVSErC:AfVUiol:AfVabxJ:AfVdqSJ:AfVhRoV: +AfViTQH:AfVjvgW:AfVoLAh:AfVrMeN:AfVxMgO:AfWEUyE:AfWExXv:AfWKgmL:AfWMCpI:AfWQtKx:AfWTbqF:AfWYRrC:AfWcIFH:AfWhCZV:AfWlEps:AfWnGrd:AfWqtSX: +AfWzLwK:AfXAXKi:AfXHJRJ:AfXSbZd:AfXYtkO:AfXgMAO:AfXgkzd:AfXnyig:AfXugqj:AfXwEGe:AfXytso:AfYFkCO:AfYKRvP:AfYQNgQ:AfYSxSG:AfYXjyy:AfYiIlw: +AfYkvXF:AfYpuiQ:AfYuRlH:AfYzQAN:AfZEYwF:AfZEgPD:AfZIeNe:AfZKalD:AfZMNIc:AfZTdkY:AfZWNGJ:AfZanND:AfZcbfu:AfZcxTa:AfZiHXD:AfZkFMB:AfZlvbC: +AfZwpJO:AfZyDUG:AfaGgcb:AfaHANP:AfaHRuZ:AfaPjjU:AfaQAOs:AfaZuaS:Afacuih:AfaizVW:AfaofDj:Afawsdr:AfbBHUg:AfbBXBq:AfbBfft:AfbCPDO:AfbGdkr: +AfbLmyp:AfbNGUW:AfbOxtw:AfbPYfQ:AfbXETH:AfbiuIa:Afbovbh:AfbpLvC:AfbrZlH:AfbyECp:AfcFRrd:AfcHosA:AfcIyMT:AfcKTSQ:AfcKlYs:AfcMhZT:AfcOAkm: +AfcTaIL:AfcVPkP:AfcXQBR:AfcZCcU:AfcbCJz:AfcfFnL:AfcjPKw:AfcjiTm:AfcknOS:AfcwYFB:AfcxSyp:AfdDkcK:AfdEIdD:AfdErmA:AfdFhAI:AfdLRRm:AfdNoSH: +AfdOvpE:AfdcXPS:AfddONx:Afdgbqd:Afdgxbb:AfdkEjy:AfdlFNE:AfdmdDw:AfdnMZr:AfdqnoZ:AfdvwOL:AfdwiCi:AfeJJah:AfeSNyN:AfeWxZz:AfeaYdg:AfedADO: +AfegTqU:AfekZjN:AfemVRJ:AfeqOTn:AferUtv:AfesBCD:AfetnzO:AfeusLT:AfexYXC:AfezLUc:AfezjGq:AfezpLd:AffIDII:AffKgHL:AffOJAG:AffSirO:AffWCsq: +AffcOiy:AffgYDh:AffjygK:AfflLGU:AffqSCW:AffyQpD:AfgCEgk:AfgFEUu:AfgJwXC:AfgNRrQ:AfgQpDe:AfgQtHc:AfgVtKj:AfgYLnm:AfgZCsK:AfgZbwv:AfgcGrv: +AfgfkEc:AfgofLb:Afgpdj:AfgwtSj:AfgyfVy:AfhBhtR:AfhFpdN:AfhFthH:AfhOoRe:AfhPwxH:AfhRgte:AfhTXKG:AfhYptY:AfhcyiI:AfhefnR:Afhlkeh:AfhmDfd: +AfhrAWZ:AfhtFjb:AfhyUzg:AfhywUH:AfiKGuy:AfiLuaT:AfiLzQ:AfiMjyG:AfiNieF:AfiPOjW:AfiRYaJ:AfiTpxE:AfiVpkL:AfiWmij:AfiXnXE:AfiYJfc:AfiZVtE: +AficysG:AfifHxa:Afinnna:AfioQAp:AfiqKuB:Afiszcb:AfitrKE:AfjCrAp:AfjEXBh:AfjEffm:AfjFIHQ:AfjFlnU:AfjFrbn:AfjTuAc:AfjViEq:AfjavbQ:AfjiKq: +AfjlECi:AfjnHXV:AfjwKUu:AfjxYxc:AfjzseA:AfkEKcQ:AfkFOWI:AfkHYOa:AfkMkJp:AfkOhvg:AfkQhak:AfkRIDf:AfkRrMc:AfkSDwp:AfkSZlF:AfkWEWr:AfkYGxI: +AfkdicK:Afkfhcu:AfkiYFI:AfkmuTc:AfkvKTi:AflKKCJ:AflTEyF:AfliiCp:AflkPQb:AflllIb:AflnZIm:AflpqVX:AflqPkG:AfmBpGG:AfmFuRP:AfmNIPu:AfmNdQV: +AfmPlYy:AfmVyMR:AfmeQPB:AfmenDx:AfmgROb:AfmkJjH:AfmlLUj:AfmljGx:AfmlpLm:Afmmohi:AfmmpYa:AfmntNZ:AfmxROB:AfmzvGC:AfnCJAx:AfnJgf:AfnKCsN: +AfnPxzj:AfneEGP:AfniPHF:AfnjiUd:Afnmtjp:AfnpfaD:AfnsJJq:AfnvmOq:Afnybxg:AfoBJUX:AfoBaKz:AfoHhYQ:AfoNXY:AfoQXke:AfoXJrF:Afodexz:AfoiNRa: +Afoiysq:AfolNSI:AfooAwx:AfopXIc:AfopflQ:AfoqwVw:AfouzjS:AfowMaC:AfowkZh:AfpCwxs:AfpSbWF:AfpZszt:AfpmEGp:AfpntsZ:Afprvow:AfqARvG:AfqAXmh: +AfqDYaC:AfqGpxl:AfqHpkE:AfqPIho:AfqPlNk:AfqPrBP:AfqUYWJ:AfqUgpH:AfqYeni:AfqYmmL:AfqavXQ:AfqbbQk:AfqgrKl:AfqnLVD:AfqpQAY:AfqqnnH:AfqsbFy: +Afqsxtm:AfqyHxH:AfrAalq:AfrEYfO:AfrHiEv:AfrIOJG:AfrKYAZ:AfrVjYW:AfrXIHV:AfrXlnR:AfrXrbi:AfraFMw:AfrfLLF:AfrgZlV:AfrjbqR:AfrmrkU:AfrwnNq: +AfrxxRw:AfsBBaD:AfsFDwI:AfsIFcq:AfsKkjD:AfsRJan:AfsWPuL:AfsXOWP:AfsZrTP:AfsbZUw:AfsbnlC:AfseCJH:AfsmJWo:AfsmYGZ:AfsmjGL:AftARNd:AftGGHS: +AftIykt:AftRaGT:AftSymO:AftWJAG:AftXctt:AftZgMC:AftbdDE:AftgnLj:AfthXPa:AftlbqV:AftlxbP:AftnLZi:AfttYab:AfuClYb:AfuFERL:AfuGyAf:AfuQEPQ: +AfuRuAc:AfuVwyo:AfuXtPr:AfuYiOC:AfuaohR:AfuapYZ:AfugUtd:AfuhBCV:AfujsLF:AfulTqG:AfurVRX:AfusLaG:AfvCxzC:AfvFlcN:AfvUyoT:AfvXirY:AfvbYxz: +Afvcfam:AfveJJx:AfvfoHy:Afvfpyq:AfvgOMU:AfvhmOx:AfvnQpR:Afvnndh:AfvsvgS:AfvvSCA:AfwCRrg:AfwDgmH:AfwFCpM:AfwKJry:AfwNUyA:AfwNxXr:AfwZURk: +AfwbamB:AfwiOOh:AfwmIFl:Afwsfln:AfwyPVY:AfwzCfc:AfwzZGX:AfxCbQM:AfxGgtW:AfxJgMG:AfxLCPB:AfxTUYN:AfxXRRH:AfxaYYK:AfxmGRo:AfxnOoG:AfxrIfC: +AfxyXiS:AfxyfLa:AfyAuaF:AfyCieT:AfyEBMk:AfyEHjq:AfyGhrz:AfyHYWQ:AfyHgpS:AfyLenr:AfyLmmW:AfyNaAR:AfyOVtW:AfySPds:AfyTtRS:AfyWdKN:AfyYyyA: +Afydxru:AfyfbFb:Afyfxtv:AfyhysU:AfylUdc:AfynRlD:AfyoBmy:AfzCJFZ:AfzGfka:AfzJRVW:AfzJXMx:AfzLyQI:AfzTaaY:AfzZtrX:AfzaUNg:AfzhILp:AfzjvxA: +AfznLtf:AfztRLO:AfzyQaI:AgAAqqt:AgACRpv:AgAEymB:AgAHRyL:AgALzNz:AgAOQmZ:AgAQuPe:AgASnnZ:AgAYLCi:AgAYYj:AgAbYsc:AgAbzMt:AgAlGZo:AgAoFFD: +AgApuRP:AgAropm:AgAsOBo:AgAuVIk:AgAzFFF:AgAzoAs:AgBAxeg:AgBCrxy:AgBHGVD:AgBHxfD:AgBMMgj:AgBMXJK:AgBcIgX:AgBeCWd:AgBohuZ:AgCBZPg:AgCBtx: +AgCDmZT:AgCHoPf:AgCIzQO:AgCNOBG:AgCTrpD:AgCUuQV:AgCigDG:AgCpfdA:AgCtqJp:AgCurWc:AgCxIGa:AgDEItC:AgDFUBQ:AgDNRhK:AgDQWxx:AgDUMhx:AgDWqKp: +AgDeoxT:AgDhxKJ:AgDpzMV:AgDqzoU:AgDzhKc:AgEECAN:AgEFcSf:AgEGVbM:AgELtPB:AgENUbf:AgEQhQW:AgERzzx:AgEWKHl:AgEWWXO:AgEjlFy:AgEjqwQ:AgEnxmg: +AgEwPCh:AgEwcKf:AgExzma:AgFFuEd:AgFJGcc:AgFJZuI:AgFJxvd:AgFONCx:AgFOscv:AgFPBRS:AgFQDRX:AgFRwWy:AgFYhle:AgFfaJJ:AgFjDiI:AgFkzTG:AgFmWWa: +AgFnQqO:AgFnshi:AgFpYYL:AgFuCjw:AgFvkFO:AgFvqEA:AgFwCKx:AgFyFc:AgFzeAZ:AgGENMA:AgGNzzr:AgGQVTI:AgGWwwR:AgGXdPN:AgGbXIP:AgGrySq:AgGuYyg: +AgGvbnl:AgGwnJH:AgHBNWT:AgHDbvZ:AgHELco:AgHFOcJ:AgHHqjU:AgHLMXq:AgHMKGm:AgHNxkf:AgHOJCD:AgHQsOL:AgHTIoV:AgHTWIX:AgHZqaV:AgHgpEy:AgHiGzI: +AgHjckX:AgHkoyo:AgHmIdw:AgHmWst:AgHnCYn:AgHnNTf:AgHpBdP:AgHqaPn:AgHwueV:AgHxgOk:AgHzNkI:AgIBqWt:AgIIOXM:AgIJUaH:AgIJogz:AgIOsgd:AgIUJcK: +AgIVsoc:AgIdppI:AgIpcKW:AgItCya:AgItNti:AgIwapa:AgJAmzv:AgJCWb:AgJDfyM:AgJEopD:AgJIUxZ:AgJLQni:AgJPqZd:AgJTPkR:AgJURdN:AgJWNCn:AgJahuA: +AgJjQhd:AgJjeRn:AgJklmi:AgJnMkQ:AgJqqjR:AgKAGvt:AgKAOBn:AgKAxFt:AgKEZPN:AgKEoGi:AgKKoPO:AgKYHqV:AgKcfdh:AgKeDht:AgKqRBP:AgKtMKZ:AgLBTH: +AgLDKhB:AgLDWxa:AgLLnsj:AgLQRhR:AgLYUBH:AgLczMO:AgLdPcF:AgLdckH:AgLfyWT:AgLgSIf:AgLhSIF:AgLkxKS:AgMBNi:AgMDky:AgMFWZE:AgMHVoP:AgMRYrm: +AgMRjiJ:AgMeITi:AgMiPCo:AgMicKa:AgMjrBL:AgMjzOE:AgMmSio:AgNDDRq:AgNHqWl:AgNJlHJ:AgNKWPM:AgNSkkM:AgNUPqR:AgNcxmD:AgNdoMT:AgNleAS:AgNqdoF: +AgNrqfW:AgNsbDn:AgNvbEu:AgNzVif:AgOBatb:AgOGgZI:AgOHrCv:AgOIBrC:AgOKwwi:AgONqwU:AgOSGCs:AgOSZUY:AgOSxVt:AgOeXIK:AgOgsHy:AgOhwzV:AgOlpSB: +AgOnySB:AgOoajZ:AgOrHgC:AgOsDIY:AgOxqFn:AgPGbvs:AgPGkQV:AgPLQMu:AgPMufi:AgPNFal:AgPPnNu:AgPRus:AgPWaAs:AgPaCYG:AgPaNTO:AgPcBdy:AgPhpEP: +AgPlFfk:AgPqTcy:AgPrhnH:AgPtFYt:AgPvZFc:AgPymPO:AgQDiBa:AgQFpvd:AgQKNwd:AgQQqJe:AgQRJVh:AgQSqAf:AgQccKh:AgQdIDG:AgQdWSD:AgQgNtV:AgQjkRu: +AgQsNKy:AgQwppv:AgRGzqD:AgRHYzv:AgROAVE:AgRSqZM:AgRTxeU:AgRbTem:AgRkHdR:AgRncnb:AgRngwt:AgRqMkx:AgRvIgj:AgSCPDw:AgSEoTF:AgSGXeB:AgSKxEL: +AgSMrXR:AgSPYZO:AgSRNtF:AgSYqzt:AgScQHt:AgSdRBK:AgSjTET:AgSqHDk:AgSvgWM:AgSwMKA:AgTAaEe:AgTCVOr:AgTGGCX:AgTKAag:AgTNVFS:AgTOhqR:AgTPTK: +AgTQYpL:AgTbYEo:AgTcBaE:AgTgKEY:AgTjoxF:AgTkKTM:AgTohKq:AgTsLTQ:AgTswOq:AgTtwmu:AgTvWcG:AgUHJfE:AgULihK:AgUOITj:AgUTVfH:AgUkWac:AgUmlFG: +AgUmqwo:AgUpHOc:AgUqxmY:AgUtUKJ:AgUwYeT:AgVDKi:AgVFkkj:AgVHPqu:AgVJoMK:AgVLQaq:AgVSrch:AgVZlKA:AgVdqfP:AgVebDi:AgVhbEr:AgVikFa:AgViqEo: +AgVjCjY:AgVlCKV:AgVqQqa:AgVqshG:AgVrWWO:AgVyaJd:AgWElIT:AgWEoIw:AgWFluP:AgWNPQB:AgWaTXD:AgWcCkA:AgWdHgJ:AgWfZts:AgWjzSl:AgWkqFG:AgWtgjO: +AgWyjfY:AgWzYyu:AgXCseo:AgXEgZr:AgXHDJf:AgXHpPP:AgXMFSs:AgXNkUU:AgXSRPb:AgXUyMV:AgXXRYX:AgXbTuf:AgXhEeG:AgXhZFx:AgXmgOY:AgXrYSw:AgXwFYO: +AgYBzNe:AgYGqdo:AgYIjQv:AgYNDjm:AgYWqqk:AgYaFFy:AgYaoAL:AgYdeKd:AgYhTCI:AgYiOBp:AgYjVIT:AgYsGZP:AgYxWTS:AgZAAVz:AgZEqZr:AgZIPkD:AgZNUxL: +AgZeTer:AgZoRbm:AgZvUSG:AgZygds:AgaEsgI:AgaGkuE:AgaOQL:AgaQDjv:AgaZQHV:AgaZqWY:AgakWTH:AgalYsG:AgalzMP:AgapWSH:AgaplG:AgavtXl:AgbKCX: +AgbKRdq:AgbQObZ:AgbUZpz:AgbWmzI:AgbXrPy:AgbtYMX:AgcBrXd:AgcFZB:AgcHPDA:AgcJoTp:AgcLMGw:AgcLXjV:AgcWGvY:AgcWOBC:AgcWxFY:AgcbIGE:AgcdgKx: +AgcnhUG:AgcoVyE:AgctCwy:AgcyYma:AgdAVFe:AgdDhqd:AgdFYpz:AgdLGCn:AgdPAaQ:AgdVCBJ:AgdVWzQ:AgdXVOD:AgddhKG:AgdlKEo:AgdnHon:Agdycku:AgdzrbX: +AgdzzoQ:AgeTITx:AgeUtPN:AgeYeow:AgefDiP:AgeiBjh:AgeitzU:AgelYeF:AgeslFu:AgetoXo:Agewxmk:AgfChlY:AgfFAJD:AgfINmv:AgfNbMI:AgfORCM:AgfOlKS: +AgfRaTn:AgfWgzE:AgfXrcz:AgfYBRO:AgfcbVC:AgfdNFl:Agfeysf:AgfifLh:AgfiwkJ:AgfjdAF:AgfpViS:AgfuXiG:AgfwQqS:Agfwshu:AgfxwZZ:AggEuec:AggIGCd: +AggIZUN:AggIxVc:AggMExL:AggNNMM:AggWYBz:AggXhLb:AggbmPN:AggeajM:AggiDIN:Aggofls:AggowKQ:AggtCJp:AghDBx:AghDFay:AghDqDJ:AghGjqs:AghLoGi: +AghMRYv:AghTibm:AghVpVh:AghXsOp:AghcDtn:AghgoPW:Aghnuej:AghroyS:Aghsckd:AghtIdK:AghtWsH:AghwCYR:AghwNTZ:AghxaPR:AghyBdl:Aghzkry:AgiDLCd: +AgiLuPh:AgiMsEV:AgiOgzK:AgiWFsJ:AgicxOM:Agifper:AgihGZB:AgiiNKB:AgimppM:AginOBb:AgiycKS:AgizoYd:AgjDOba:AgjGMgU:AgjGXJt:AgjIuqp:AgjSPdc: +AgjUotR:AgjWXEV:Agjckdp:AgjefDG:AgjiUSu:AgjngdA:AgjogkZ:AgjseRj:AgkCfYB:AgkDoPK:AgkJGvp:AgkJOBj:AgkJxFp:AgkTRDA:AgkXUXU:AgkjuRJ:AgkorWN: +AgkuUyz:AgkzlMf:AglCUBl:AglEjIG:AglJRhV:AglKcsl:AglQMhe:AglSqKm:AglXJFq:AglYaEJ:AglenAQ:AglgqwY:AgliItD:Agllrba:Agllzoh:AglmzMk:AglqSIB: +AgluxKw:AgmBihv:AgmKnSg:AgmOYPj:AgmSKHO:AgmSWXl:AgmWMHl:AgmmbzQ:AgmmgxQ:AgmrzmB:AgmsrBH:AgmszOA:AgmuywY:AgmvSik:Agmznax:AgnARCT:AgnAlKJ: +AgnBQaZ:AgnORKq:AgnUliH:AgnUoik:AgnVlUL:AgnfLVb:AgngNFU:Agnhafx:AgniQxD:AgnidZw:AgnjFyS:AgnpysW:AgnqTxX:AgntHGV:AgnvZTo:Agnzzsp:AgoIYBq: +AgoJWpH:AgoNgZu:AgoWbmy:AgobQTB:AgodfQd:Agomztk:AgoniWN:Agonjfl:Agoocqh:Agoqwzj:AgorxMA:AgosnJo:AgoumPe:AgoyVIc:AgpDLIb:AgpGibt:AgpHibT: +AgpJpVQ:AgpKsOi:AgpMNWQ:AgpNOxG:AgpOUAB:AgpOoGp:AgpPIos:AgpWqDS:AgpYjqJ:AgpctxK:AgpeoyJ:AgpgIdR:AgpgWsQ:AgpjCYK:AgpjNTC:AgpkaPK:AgplBdu: +AgpphHv:AgpqFfE:Agpqoap:AgptbTm:AgpvNkl:AgpyObL:AgpzpPc:AgqFbVv:AgqFkqS:AgqJqJy:AgqOpvx:AgqPpvX:AgqUUaK:AgqUogy:AgqVaav:AgqYLiK:AgqahNM: +Agqecr:AgqlcKt:AgqpCyB:AgqpNtJ:AgqwFFL:AgqwoAy:AgqxmpJ:AgrCRby:AgrDGcx:AgrFPdJ:AgrGEuo:AgrHGWF:AgrOLhE:AgrOMsT:AgrYZJf:AgrtHdV:AgsAZPQ: +AgsAoGv:AgsCmZb:AgsFzQy:AgsGoPP:AgsRqzp:AgsVPKF:AgschUU:AgshUya:AgsjcvR:AgspMKE:AgswgDQ:AgszHDo:AgtRWqv:AgtjTda:AgtplfX:AgtpqWp:AgtsBwB: +AgtsluP:AgttxMF:AgtvBJE:AgtvtZx:AgtyqwR:AguBVom:AguHMHU:AguNhQM:AguPYPS:AguSRHf:AguUihO:AguVGcG:AguZAAx:AguaYep:AgubBAZ:AguerBQ:AguezOX: +AgujmLX:Agunhkn:AgurLtN:Agurwon:AguvKeF:AguzKtR:AgvBqWO:AgvDlHi:AgvGaTX:AgvOkkn:AgvQPqq:AgvTxCo:AgvVhlo:AgvYlUc:AgvZaQt:Agvapsx:AgvbkFe: +AgvbqEk:AgveVie:AgvfeAp:AgvmqfT:Agvsysx:AgvwHGy:AgvxysP:AgwFwwl:AgwIomp:AgwJqwp:AgwKQAJ:AgwLlhV:AgwNSI:AgwTAsb:AgwUkKQ:AgwWPQN:AgwaWwt: +AgwcFYC:AgwdYyY:AgwfnJv:AgwiCJb:AgwneaO:AgwoLvr:AgwsdOZ:AgwynzU:AgwzTXH:AgxBRYd:AgxGJvv:AgxHQMR:AgxLjqa:AgxUsGE:AgxWkUI:AgxfGzG:AgxhekS: +Agxjurx:AgxkTuz:AgxloPE:AgxoWsd:AgyAJcq:AgyBxKS:AgyLFst:AgyNqAc:AgyRsEh:AgyTgzu:AgymeKh:AgyrGFz:AgysVIX:AgyvFyH:AgywSmh:AgywhES:AgzARdd: +AgzCNCD:AgzCcfq:AgzClwt:AgzLXEx:AgzPxev:AgzRrxh:AgzXPdM:AgzcSPA:AgzjcnA:AgzjgwW:Agzmwuf:AgznqjX:AgzrIgI:Agztgkt:AgzxeUP:AhADdUt:AhAKoKf: +AhAOONa:AhAOzYF:AhAQMSu:AhATFPN:AhAUOYG:AhAYuQY:AhAeGMF:AhAjKMw:AhAlydd:AhAsAwy:AhAsqz:AhAzqAg:AhBHcKo:AhBHwst:AhBLkaz:AhBLwqY:AhBQlIj: +AhBTNzR:AhBVuIt:AhBjbhV:AhBlCbp:AhBmZfT:AhBrMeT:AhBvBSd:AhBvGQd:AhBzWFb:AhCAgRO:AhCCIaz:AhCHwXX:AhCPckV:AhCPwSM:AhCQRtX:AhCTkAC:AhCWliS: +AhCaRrv:AhCfTRy:AhCfcVJ:AhCsZdN:AhCtCBI:AhCtpJG:AhDAODy:AhDCqzB:AhDFgjb:AhDJGsX:AhDLRjG:AhDQODd:AhDZlWV:AhDabBx:AhDegON:AhDjCXe:AhDkfpW: +AhDqboc:AhDtmx:AhDzHUN:AhEAdMA:AhEGLbg:AhEGrjy:AhEIqZK:AhEJXjM:AhELHEM:AhEOGSq:AhEPAxV:AhEZLaK:AhEgbbq:AhEhtQU:AhEjPZS:AhEkgoG:AhEmFjV: +AhEoJoh:AhEpDsz:AhEpqQI:AhEsXDE:AhEtOdU:AhFDQcT:AhFIIkP:AhFMRte:AhFQONT:AhFQuHf:AhFSQJ:AhFVQhW:AhFXqau:AhFbOht:AhFbfoA:AhFfOpN:AhFfpTE: +AhFgCby:AhFkcPO:AhFlAYO:AhFmbmq:AhFtTqO:AhFwnbh:AhGFuhO:AhGHoJB:AhGNIKy:AhGOmqY:AhGPXBn:AhGRRTL:AhGWKxW:AhGaPyn:AhGakUB:AhGdoWz:AhGmCBp: +AhGqcpF:AhGsbMx:AhGtutm:AhGxPlQ:AhHAduV:AhHEgjt:AhHGpmF:AhHJzCj:AhHLQSe:AhHUWT:AhHVkuh:AhHfqae:AhHlgy:AhHnhnY:AhHuhmZ:AhHxCgj:AhIAmNy: +AhIAxcX:AhIFmZQ:AhIIInc:AhIQutW:AhIWZXE:AhIXySw:AhIaoiS:AhIcDtd:AhIcuzY:AhIeAwr:AhIkiMb:AhIlrKs:AhIrtLl:AhJDlIq:AhJKcKt:AhJKwso:AhJNRTz: +AhJSwxz:AhJYKvz:AhJjHBY:AhJqLoT:AhJrkLq:AhJtJTw:AhJthfp:AhJuXDJ:AhKDrAz:AhKImAI:AhKJliz:AhKKQbA:AhKQAlf:AhKSvfq:AhKXQTy:AhKatMf:AhKeZdG: +AhKfRKM:AhKfZFD:AhKgbuT:AhKkMED:AhKryll:AhKsbHF:AhKwklZ:AhKxTRp:AhKxcVC:AhKzOQE:AhKzOTL:AhLCULB:AhLDSWe:AhLGwYB:AhLMaZQ:AhLPKbb:AhLQXVy: +AhLULAe:AhLgGCP:AhLlHUI:AhLmZzs:AhLnQoX:AhLpBMA:AhLsKOi:AhLsQLg:AhLzcY:AhMJSwR:AhMKUlu:AhMOgJr:AhMUazf:AhMVKBU:AhMXpXJ:AhMYXvN:AhMZOdt: +AhManoA:AhMbJoq:AhMdWsW:AhMgNCr:AhMhMYX:AhMjNsQ:AhMnhnB:AhMoGcg:AhMrIBd:AhMtQOo:AhMuZZD:AhMxBlM:AhMzcCf:AhNBljE:AhNIZtz:AhNIqDV:AhNJUyI: +AhNMJxe:AhNMoIO:AhNRPYH:AhNRSIS:AhNalnY:AhNaowX:AhNbHlL:AhNbsDw:AhNdPLS:AhNefoj:AhNhlwO:AhNhrRs:AhNiEbW:AhNlokC:AhNmOYA:AhNpWbC:AhNwgsC: +AhOBjju:AhOCXBW:AhODRTU:AhOFoQs:AhOIKxN:AhOLSnZ:AhOMQCd:AhOOQHg:AhOSSLl:AhOUGsq:AhOXPyS:AhOXSiH:AhOXdce:AhOaiMf:AhOawZe:AhOglNB:AhOgoWC: +AhOhHaB:AhOinWq:AhOkULG:AhOxeLD:AhPAGVx:AhPAhXS:AhPClaf:AhPCmzw:AhPMVwk:AhPOQSJ:AhPTVtQ:AhPVuqt:AhPYpmI:AhPZFyQ:AhPdsYE:AhPkCgE:AhPuGbp: +AhPxLdG:AhPxSwV:AhQAqGx:AhQCnhX:AhQDzcZ:AhQKySn:AhQOkUx:AhQPkUX:AhQTnhx:AhQUQsu:AhQYpBC:AhQeeRd:AhQnhMJ:AhQoCtD:AhQutLu:AhRFwxS:AhRGNKa: +AhRGfKm:AhRMyyM:AhRNuUv:AhRPchj:AhRZLVp:AhRbwHY:AhRhXDc:AhRjRIo:AhRkBSv:AhRkGQv:AhRoWFp:AhRqDUm:AhRyubp:AhSAZsE:AhSHvkp:AhSOEfF:AhSVOYT: +AhSjhgu:AhSpRiv:AhSpTsD:AhSpbcy:AhSqDWA:AhSwDut:AhTDXVP:AhTEEWI:AhTIuhR:AhTNAXQ:AhTPSjY:AhTPnJW:AhTPufP:AhTUBDZ:AhTcBLS:AhTeQLn:AhTfboM: +AhTiEHu:AhTlYzu:AhTmCXK:AhTmzwq:AhTnAoR:AhTpBGh:AhTqNcL:AhTsMyF:AhTyGCY:AhUDlwa:AhUIKBr:AhUJlBc:AhUKpXm:AhUMSwu:AhUPgJU:AhUTGSo:AhUVRJp: +AhUdIBc:AhUeHuY:AhUfDFY:AhUgQOH:AhUkBlj:AhUqEhL:AhUtqXy:AhUuCxr:AhUuzWH:AhUwWsp:AhUyNCu:AhVISNx:AhVJHua:AhVLQXA:AhVNrYC:AhVTAHI:AhVUPYq: +AhVUSIj:AhVUdCG:AhVbTBg:AhVcwzY:AhVsWbz:AhVvMYu:AhVvOvD:AhVxDrl:AhWCUYy:AhWDJXU:AhWKlJu:AhWZSZG:AhWafOX:AhWdOyq:AhWeoKs:AhWhTbn:AhWksdG: +AhWmPlc:AhWtZDh:AhWyfpG:AhXDXlk:AhXJgjb:AhXKUWk:AhXLpmP:AhXRUxC:AhXberB:AhXfLrG:AhXfinT:AhXpdAh:AhXsvPT:AhXuGmr:AhYBimi:AhYFutA:AhYLZXS: +AhYMVTA:AhYNInu:AhYOgJK:AhYSFYA:AhZKvOm:AhZNKvL:AhZSIAn:AhZXwxL:AhZdDUR:AhZozFv:AhZqRRb:AhZvTrm:AhaFqGN:AhaHONe:AhaHzYB:AhaJMSq:AhaKGvQ: +AhaKhxz:AhaNOYC:AhaTXOx:AhaToKb:AhaWmNV:AhaWxcw:AhaYUXs:AhaaiMM:AhaiJio:AhasKMs:AhauFmD:AhayDtK:Ahayuzv:AhbDRTe:AhbJMeC:AhbKuKT:AhbSCzT: +AhbTran:AhbZlIn:AhbcWdB:Ahbequz:AhbmNHi:AhboDwN:Ahbqtmr:AhbuZDS:AhbvRkY:AhbvZfP:AhcCLBu:AhcKOYB:AhcSukm:AhcZrAW:AhcaQuT:AhcmqUC:AhcuNhP: +AhcwDWw:AhdCeQV:AhdEndw:AhdbiiP:AhdhFxu:AhdkbLK:AhdqnOM:AhduyPQ:AhdvXdP:AhdxMyT:AheBqZG:AheEgJg:AheJdMM:AhePOda:AheQLbK:AheQrjU:AheSjwe: +AheYcUc:AhedgoK:AhefFjZ:AhehiII:AhenFXl:AhepbOf:AheuJTd:AhewnoT:AhexAOy:AheyDsv:AheyqQE:AhezfPR:AhfAzUX:AhfBNGa:AhfIAHg:AhfPkNP:AhfQmQL: +AhfRjJy:AhfTRtY:AhfYKXB:AhfbokT:Ahfctjm:AhfkOvj:Ahfqimj:Ahfqwzi:Ahfvwzw:AhfwlnN:AhfwowO:AhfxHAN:AhgEQHR:AhgFZTt:AhgFqdX:AhgHQmr:AhgHfHA: +AhgJNgX:AhgOiFR:AhgPOnQ:AhgPuhc:AhgWIKu:AhgXIKU:AhgffOF:AhgsTQJ:AhguOPK:AhgwiMS:AhgwwZP:AhgzcpJ:AhhQqgl:AhhSnHL:AhhTzCN:AhhYFpH:AhhayDb: +AhheDTI:AhheuZt:AhhluPP:Ahhoqaa:Ahhtmbt:Ahhuerp:AhiEqiY:AhiNXLp:AhiSrKx:AhiTgJy:AhiVpMK:AhiZVWi:AhieKMx:AhiiTIT:AhjDALi:AhjHkae:AhjHwqF: +AhjLmaF:AhjMlIu:AhjNQBN:AhjRuIk:AhjWrau:AhjXvKD:AhjiCbO:AhjipjA:AhjzhGA:AhkCMES:AhkGqro:AhkMRtu:AhkNkAn:AhkNwQM:AhkXKVu:AhkbJtX:AhkiHbV: +AhknCBd:AhknpJj:AhkoRKI:Ahkqbup:AhkztMb:AhlDcuE:AhlGpcv:AhlMODG:AhlOXJG:AhlTlWu:AhlYKbf:AhlZlbw:AhlagOm:AhlcCb:AhleDSp:AhleqqC:Ahlgfpt: +AhllNSB:AhltIbw:AhluHUM:AhlvDfM:AhmBUlI:AhmCOdU:AhmEjwl:AhmFwyI:AhmTLan:AhmaFXE:AhmcbbT:Ahmggob:AhmiFjs:AhmkJoM:Ahmlypa:AhmmWsk:AhmnNCN: +AhmrKob:AhmrQll:AhmvEhw:AhnAuAw:AhnCOvF:AhnCkNK:AhnDIkW:AhnGRtB:AhnHSFJ:AhnMojL:AhnSUyE:AhnbOpi:AhnbpTb:AhncVyD:Ahndimq:Ahndwzr:AhnhAYh: +Ahnqfod:AhnuokO:Ahnvgoi:AhnyuTc:AhoAlJB:AhoFQCx:AhoIOVM:AhoKjji:AhoMSfa:AhoRrpg:AhoXqdQ:AhoaHLK:Ahoasdp:AhocPlT:AhodOHX:AhodfOm:AhoiVYO: +AhonAyc:AhovgSD:AhoxEBP:AhpFVwg:AhpKZxo:AhpRiMu:AhpbLdk:AhpbSwz:AhpivPA:Ahpjhnz:AhpkGmg:AhpmsYI:AhqBmZL:AhqCdUB:AhqFrKa:AhqLVWP:AhqNQsq: +AhqSZXX:AhqUySJ:AhqhrKn:AhqwhMN:AhrDKvw:AhrHCzF:AhrNTyb:AhrPuKF:AhrXOyi:AhraMeb:Ahrjquh:AhrmLoy:AhroOqC:AhroOtJ:AhrqXDg:AhrssZB:AhrvSwY: +AhrwyLj:AhrxWdP:Ahrzwjb:AhsLyYP:AhsQvkt:AhsRatC:AhsSgjd:AhsVfkp:AhsWTtF:AhsYLvm:AhsjBsk:AhsjGqk:AhsnWfm:Ahsshgq:AhsxuBm:AhtBuhV:AhtFoib: +AhtPZSR:AhtQLAH:AhtWcul:AhtYnJS:AhtYufT:AhtZDyn:AhtaYK:AhthDfD:AhtjBMl:AhtmBLw:AhtoNSk:AhtpcBs:AhtyBGl:AhuAxUB:AhuFSwq:AhuGqHM:AhuOazE: +AhuRKBv:AhuSXvm:AhuTpXi:AhuVOdW:AhuWLaq:AhuXZsk:AhudJc:AhuebOp:AhugPZi:AhuoZZg:AhurBmU:AhuvtQO:AhuxcbJ:AhvBZgS:AhvFzUJ:AhvIGSO:AhvKoqm: +AhvMSzR:AhvNPYm:AhvNSIv:AhvQfZN:AhvYYDk:AhvdEbR:AhvwyZj:AhvysPA:AhwCKxi:AhwERl:AhwKzus:AhwMNgj:AhwSAhL:AhwTPyt:AhwTSio:AhwTdcB:AhwWZGj: +AhwYHUd:AhwcnWV:AhwhTQx:AhwmtJF:AhwoHGW:AhwoQv:AhwuMyp:AhwuOVA:AhxJRYm:AhxNFpf:AhxPVtt:AhxRdM:AhxVqgB:AhxWNUp:AhxXOni:AhxXzyN:Ahxitlo: +AhxqimA:Ahxsrkp:AhxyJIc:AhyOVWw:AhyWIny:AhyZUwn:AhyaeRG:AhyeLRB:AhyeiNQ:AhyfsyY:AhykCtg:AhymCGY:AhyqtLV:AhyrvpQ:AhytGMw:AhzBahe:AhzCNKB: +AhzCfKN:AhzELVs:AhzJgrG:AhzSLby:AhzhzFj:AhzmwjE:AhzqQUX:AiAEJgt:AiAIohT:AiAKWYz:AiAMTgC:AiAMlhF:AiAOBbb:AiAQGeQ:AiASqfv:AiATrGF:AiAYXSq: +AiAdsRe:AiAztxi:AiBJxOY:AiBMZxg:AiBNKn:AiBTOjE:AiBXELu:AiBZwVN:AiBcaEw:AiBfBeW:AiBfWX:AiBhwkL:AiBjHEh:AiBmtJp:AiBrwcE:AiBxOMw:AiByApo: +AiBzWg:AiCCpff:AiCEyqP:AiCKmwL:AiCLpCC:AiCOxon:AiCQddZ:AiCZOJR:AiCloAK:AiCoAXE:AiCoVYl:AiCvFfg:AiCvXfy:AiDGrjA:AiDMyfv:AiDPAAh:AiDQcAS: +AiDVyMw:AiDbBdU:AiDbRML:AiDcOms:AiDghEX:AiDozhu:AiDpuSp:AiDrTvR:AiDtDsj:AiEDPQE:AiEDYsw:AiEFcax:AiEMrJJ:AiERTdo:AiEYHJy:AiEZSbW:AiEbeVu: +AiEhRmG:AiEphhh:AiEuqwG:AiEvkoN:AiExoxd:AiEzqzt:AiFDAxi:AiFDKCA:AiFHGuQ:AiFMXxo:AiFNPrX:AiFPrja:AiFTLAB:AiFVJmx:AiFYFzh:AiFcIPl:AiFhKaV: +AiFmSCo:AiFnxjs:AiFsJSa:AiGDZDU:AiGMUPw:AiGNFZG:AiGRWus:AiGRsbq:AiGWxYx:AiGcdoq:AiGdzfE:AiGnKAY:AiGydAO:AiHAOOP:AiHAonL:AiHJTGa:AiHJlHd: +AiHKBTx:AiHMnwv:AiHPgEY:AiHRJGV:AiHYlCp:AiHddhF:AiHfCte:AiHhMJW:AiHiQpm:AiHnoOH:AiHoDcS:AiHqCZo:AiHvbNv:AiHxzKH:AiIBaxT:AiIDGez:AiIGOoY: +AiIGoNE:AiIHAWI:AiINszs:AiIUgep:AiIVret:AiIiyZw:AiIjtYv:AiIowTb:AiIsooa:AiJEDhp:AiJIzsL:AiJJvjv:AiJKqsw:AiJMNZx:AiJOYTB:AiJOvAZ:AiJUle: +AiJcTLT:AiJqXDz:AiJtTLt:AiKKygN:AiKOzSE:AiKRymo:AiKSNzq:AiKTjay:AiKUYtK:AiKUvaS:AiKcFOg:AiKeCGD:AiKfnOT:AiKgGKM:AiKirHz:AiKvwf:AiKxGKm: +AiKywCu:AiLClxv:AiLELBy:AiLFSBU:AiLGPTD:AiLPpQe:AiLTZmd:AiLUTBu:AiLXwKk:AiLdzDB:AiLgqZV:AiLieAd:AiLmiGj:AiLskOl:AiLwcSN:AiLxcIK:AiLxpeb: +AiMDPAH:AiMFHd:AiMFrQN:AiMGYsL:AiMIlXo:AiMKEFk:AiMOGmU:AiMTyef:AiMYAaX:AiMZZVa:AiMeeVN:AiMkTVb:AiMmDSZ:AiNBTpu:AiNCrjH:AiNGLAk:AiNKGux: +AiNNylP:AiNRjSJ:AiNShQl:AiNVOHE:AiNWBwv:AiNWKCh:AiNYIuN:AiNaxjZ:AiNbXyJ:AiNddai:AiNlAUK:AiNphcP:AiNrNVB:AiNtRMp:AiNyEnM:AiOBOYf:AiOHPRh: +AiOIrJq:AiOJTPL:AiOQGUA:AiOWFMa:AiOWZDJ:AiOZjss:AiOfcsf:AiOfsLS:AiOgxJc:AiOjXYs:AiOldAP:AiOqKAF:AiOrxrG:AiOtAur:AiOwzfZ:AiOxkFs:AiPAONs: +AiPGoHY:AiPHsv:AiPOFRu:AiPRYLB:AiPRptO:AiPWnsD:AiPgtXD:AiPkTKg:AiPvviR:AiPyzUI:AiQBDml:AiQNWIh:AiQWpTp:AiQiEkL:AiQmKfj:AiQoAMZ:AiQpCfL: +AiQpWXh:AiQrOJK:AiQrRVS:AiQzSCg:AiRIPoC:AiRSTFU:AiRSsRn:AiRbtJB:AiRcFFB:AiRdcj:AiRiBee:AiRmHEZ:AiRrVrZ:AiRtUzB:AiRxaEE:AiSDqSg:AiSEymv: +AiSFNzh:AiSPmwR:AiSWddd:AiSXpfx:AiSdAPf:AiSrwKe:AiStVYr:AiTAPav:AiTGZmC:AiTHczf:AiTJWDV:AiTKwKL:AiTQyEX:AiTSpQB:AiTVeWF:AiTWKrX:AiTbqzD: +AiTgqFZ:AiTihJt:AiTkcIl:AiTkpeE:AiTnKUp:AiTwzDe:AiUDly:AiUFJCJ:AiUMZVH:AiUNcZq:AiUPWdA:AiUQBcm:AiUWyeO:AiUehhZ:AiUeoSI:AiUnhjC:AiUqpER: +AiUrbSw:AiUtCGO:AiUzusi:AiVBylk:AiVKJmj:AiVMBVw:AiVNupA:AiVPmao:AiVPrIG:AiVSIuI:AiVTZjo:AiVdkfq:AiVsykw:AiVwLnt:AiWCFZQ:AiWGWue:AiWGsbg: +AiWOOhU:AiWQhGE:AiWTuPJ:AiWVJYt:AiWVmAd:AiWVriL:AiWZZJd:AiWeNOc:AiWjzfs:AiWlaym:AiWlioV:AiWmIpU:AiWrrNW:AiWvZYm:AiWwScV:AiWxdog:AiXAFRl: +AiXDptV:AiXLeoa:AiXNlCF:AiXOhbr:AiXeScA:AiXjKFL:AiXkCFj:AiXkWxN:AiXmOjm:AiXmRvu:AiXtsrq:AiXvEKj:AiYIYlr:AiYJSpo:AiYLbKP:AiYOUYF:AiYZOnC: +AiYbzuy:AiYdJaN:AiYpCTz:AiYraKP:AiYtTkW:AiYxooW:AiYyDCL:AiYzIbL:AiZBsbX:AiZJBmq:AiZKDhB:AiZOLRO:AiZOQRg:AiZPkrk:AiZTvsC:AiZaAxy:AiZaVyP: +AiZfDgn:AiZfwek:AiZlfIb:AiZnqCZ:AiZuVrC:AiZxjsB:AiaCYsd:AiaCjdY:AiaMNx:AiaUeOq:AiaVfkr:AiaXBbf:AiabHRy:AiadAML:AiagJaW:AiamsRa:AianCzi: +AiaoEkz:AiapJoU:AiapPDY:AiavQPk:AibAXTd:AibCkrD:AibHTFC:AibHsRx:AibIyQc:AibNPoU:AibTdDI:AibYfUQ:AibaqCu:AibiDgA:AibiweD:AiboBeS:AibqTSt: +AibsHEl:AicMpfJ:AicSBMA:AicUpCO:AicXHhe:AicYWmS:Aicbael:AicefiR:Aicgqcj:Aicltjk:AicuoAG:AidAJDK:AidHcAo:AidTPaD:AidUqBL:AidVrqB:AidWPqr: +AidYlxc:AidfzhI:AidikOy:AidjOmO:AidkBdi:AidkRMp:AidnhEd:AiduevB:AieBewo:AieEymp:AieLyFq:AiePcaT:AieVrJF:AieaTVU:AieboxH:AiecDSm:Aieiwd: +AienzHr:Aieousw:AieqBDR:AieqRmK:AierOMt:AifDjCd:AifDryA:AifIhQY:AifKYuI:AifLORP:AifROyj:AifXPrd:AifcZyH:Aifcjvy:AifedOB:AiftUXr:AifvcSj: +Aifwxjo:AigLXXd:AigOYnE:AigUJMs:AigWBvn:AigXFZc:Aigcahk:AigcnYX:AigijVn:AigimoL:AiglScd:AigmzfA:AignhCr:AigrIpg:AigzDso:AigzNOQ:AihClCT: +AihEaXY:AihGGEw:AihJOOT:AihJonH:AihKAwD:AihMtRh:AihMyuq:AihOXsW:AihRDMX:AihSfKP:AihUOhh:AihswtO:AiiITgl:AiiIlhi:AiiKBbM:AiiPoNA:AiiZBtu: +AiieCTh:Aiioclx:AiioufX:AiisPDr:AiitmZm:AiiywTF:AijEqcQ:AijFGgP:AijHYTF:AijIZxZ:AijRzsH:AijTqss:AijUyMb:AijWjAt:AijfFoj:Aijhnoy:AijiCgi: +Aijmjst:AijrOMJ:AijtApr:AikEBMN:AikFGVp:AikGPOe:AikMsBg:AikNYtO:AikNvaW:AikXzSA:AikZqSz:AikbTlY:AikeaeC:AikhTsD:AikkAXf:AikkVYO:AikpXdw: +AikwaDI:AilIPqK:AilIYSy:AilKcAv:AilLAAM:AilOSBY:AilUUga:AilWTDa:AilaaQS:AiliqWi:AilmoXj:AilnTvw:AilpIOs:AiluhHf:Ailuosu:Ailzqzo:AimBlXs: +AimFRXW:AimUKYT:AimVPtA:AimdBDy:AimgaqZ:Aimligo:AimnFe:Aimrkoi:AimuIoZ:AimvqzS:Aimxeaa:AinDOys:AinHWUY:AinLTpY:AinRSOC:AinSFzM:AinWWUy: +AindKas:AineBMx:AinjxjV:AinmJSD:AinuDSA:AinzzFo:AioAjsO:AioGIUk:AioKkSV:AioMyLU:AioQTPp:AioRrJM:AioVLan:AioXIUK:AioYOYZ:AioaNvG:Aiobayx: +AiobioC:AiocRmu:AiojKAz:AiokAuN:AioqXYO:AiosdAl:AioxENH:AipBsZY:AipPUyZ:AipPYSA:AipYFRY:AipZSPS:AipewtH:AipjsrD:AipqmzC:AiprzUE:AiptJAr: +AipucuB:AiqAWF:AiqBAWt:AiqCOod:AiqCoNx:AiqEKL:AiqFohB:AiqLOHX:AiqLcan:AiqPOnh:AiqQdxO:Aiqacla:AiqafoF:AiqaufA:AiqeJog:AiqePDk:AiqkQPY: +AiqpIbg:AiquvII:AiqxzuR:AiqzJae:AirDvjY:AirEzsc:AirGqsX:AirINZW:AirKYTm:AirKvAu:AirVHHh:AirdOMA:AirgApY:AirhkAU:AirknoR:Airroaj:AisFyCo: +AisKzSX:AisLvJb:AisMqSc:AisONzl:AisPjad:AisQYtV:AisQvaN:AisXygs:AisYGVi:AiscGKP:AisfwCH:AisiaDp:AislOmz:AismAPb:AisqixS:Aisqlqs:AisrCGy: +AissXdn:AistGKp:AisvrHG:AitPZmG:AitQczb:AitSWDR:AitYJcY:AitZZKB:AitcelU:AitchFD:Aitgegl:AitrhJp:AitxegL:AiuFEFn:AiuJymB:AiuPyeC:AiuRpqY: +AiuTar:AiuVZMX:AiuYWdM:AiuZwkW:AiudusE:AiumKuk:AiuvqfA:AiuwhjO:Aiuxhjo:Aiuzciw:AivDhgr:AivEFzF:AivNhQk:AivSUpV:Aivnfu:Aivsjnq:Aivyuzf: +AiwAyLl:AiwBPRM:AiwDrJt:AiwHLaW:AiwJJMm:AiwLBvp:AiwQWuI:AiwQsbK:AiwcxJF:AiwdXYV:AiwfdAu:AiwmKAc:Aiwuaya:AiwuioZ:AixEWyR:AixGTGk:AixGlHn: +AixLSPZ:AixObkE:AixSUys:AixSYSh:AixSjDU:AixeakE:Aixppx:AixptyU:AixrHru:AixuzUl:AiyHnSX:AiyMlcC:AiyPFri:AiySSpc:AiyXohE:AiyYUYj:AiyYYsq: +AiyYjdL:AiyZWYk:AiycsRt:AiyeEko:AiyiKfI:AiyjCfo:AiyjWXK:AiylOJh:AiylRVp:AiytSCD:AizAwV:AizDyGq:AizEmWT:AizIxOv:AizKdDB:AizLnwd:AizTBBR: +AizTaQk:AizYkro:Aizbjsf:AizeBex:Aizgwkc:AiziHEG:AizufIf:AizvGfQ:Aizveft:AjAKOT:AjALhaF:AjATYJz:AjAUdAq:AjAYZZM:AjAZVCw:AjAdGTQ:AjAdRAR: +AjAeZzY:AjAitzH:AjAsteU:AjAyEf:AjBHzBi:AjBNeoZ:AjBPkpY:AjBRgDd:AjBWhve:AjBbAXW:AjBqiFw:AjCARXv:AjCGrQS:AjCNtml:AjCOgus:AjCSLQw:AjCThCZ: +AjCUlkx:AjCVskT:AjCZGVe:AjCerdd:AjChHlp:AjCtZmC:AjCwQsW:AjCyEhe:AjDAoAm:AjDIYex:AjDUopw:AjDZfdp:AjDfdZE:AjDhCZW:AjDhSeb:AjDkXcR:AjDukhw: +AjEFlTW:AjEIsfN:AjENSkv:AjERtYt:AjESRCI:AjEWlhj:AjEaZob:AjEbrVJ:AjEcIfG:AjEegRE:AjEluqF:AjEnSEk:AjErxPK:AjEtDHh:AjFAELX:AjFAxzt:AjFCCNI: +AjFHoak:AjFKRLZ:AjFLhrq:AjFPhwv:AjFRNzl:AjFbTQl:AjGAtWy:AjGDOGd:AjGDofx:AjGGElW:AjGMChr:AjGMoAD:AjGQogt:AjGRQrb:AjGVaRT:AjGYLIV:AjGbFfZ: +AjGfTPw:AjGjaDb:AjGtcsG:AjGwTqC:AjGyABg:AjHEVcU:AjHFZzo:AjHHQzT:AjHIJHS:AjHIrwg:AjHOYjX:AjHRdaS:AjHWhAd:AjHeIIW:AjHeoDM:AjHiKHY:AjHpMrf: +AjHsOhf:AjIAzQv:AjIBVhr:AjICjUK:AjIDrWU:AjIGYnO:AjIKBR:AjILZZd:AjIMYdN:AjIOJhX:AjIOrWl:AjIPnsP:AjIZvIS:AjIaUDZ:AjIbIqo:AjIbLxO:AjIeJZX: +AjIgMuV:AjIjAML:AjIkgkZ:AjIpbIf:AjIrTcA:AjIsfoA:AjIybLf:AjIzFWH:AjJAhct:AjJGjMQ:AjJJjjU:AjJQzdK:AjJRCsn:AjJUbJr:AjJgstD:AjJmQwl:AjJtPlm: +AjKAguj:AjKCBFI:AjKELQn:AjKGeOj:AjKHgvY:AjKKYdF:AjKPjJB:AjKQpHi:AjKXCSy:AjKZwmI:AjKcZAd:AjKdKuq:AjKdXtb:AjKhifG:AjKjEEN:AjKocNg:AjKuUzA: +AjKwQoE:AjKyHck:AjLJxqE:AjLOHXo:AjLUHnv:AjLaDhJ:AjLffvS:AjLiuQd:AjLjmNF:AjLkSeI:AjLlHjS:AjLpiYF:AjLrPll:AjMAZAI:AjMBSkO:AjMERCp:AjMIlhS: +AjMPKZk:AjMRYEh:AjMdXCB:AjMexPR:AjMgDHq:AjMiEIJ:AjMiPvL:AjMtKOr:AjMteUb:AjMurVS:AjNDNze:AjNELiP:AjNMeuF:AjNVwpV:AjNZHkJ:AjNgtBf:AjNhytu: +AjNokrP:AjNqxf:AjNvAbA:AjODDqL:AjOJJmH:AjOJuPn:AjOJyzu:AjOTyeZ:AjOdikD:AjOiMSw:AjOmsKt:AjOnjhF:AjOnyTl:AjOtkUB:AjOzkoM:AjPCocv:AjPDmLM: +AjPEpfB:AjPGOwC:AjPNPOB:AjPPWri:AjPPYXt:AjPaWjv:AjPbsXk:AjPfiiF:AjPiaqA:AjPivph:AjPpWlS:AjPpdnV:AjPqJrV:AjPxQJb:AjQAQZD:AjQCnsK:AjQEVhi: +AjQFtoM:AjQGrWN:AjQNBIf:AjQPXfs:AjQPrvB:AjQRSKY:AjQZbDp:AjQZtIG:AjQbKhI:AjQiWJO:AjQntzZ:AjQpSib:AjQphlB:AjQqaQx:AjQqvPQ:AjQvWLj:AjQvdNo: +AjQyJRo:AjRECsG:AjRFWBm:AjRGwMw:AjRJunk:AjRNxYY:AjRXjMx:AjReHCu:AjRgPlD:AjRhMMm:AjRjINL:AjRnMWM:AjRneUQ:AjRpKFJ:AjRtQSp:AjRvEHB:AjRystM: +AjSLbjB:AjSMwmn:AjSSjJe:AjSXeOM:AjSZkPN:AjSbWDI:AjSiQoB:AjSjCzq:AjTBJZp:AjTKJJK:AjTKRpn:AjTVqRh:AjTXuyk:AjTcqXA:AjTdrDJ:AjTgJgl:AjTnDFm: +AjToYbv:AjTpYbV:AjTtlgU:AjTxJgL:AjUGJzY:AjUSxQU:AjUTSml:AjUXzBQ:AjUZWRE:AjUbbdG:AjUcSrc:AjUdUSR:AjUeHJC:AjUirdc:AjUoSAK:AjUofVC:AjUsmnV: +AjUzJIN:AjVBBbZ:AjVCari:AjVHSSo:AjVODQn:AjVPRLh:AjVYdDI:AjVacgN:AjVbsjb:AjVeBGC:AjVeBwK:AjVjskV:AjVpdjf:AjVsDas:AjVtYsK:AjVwmCb:AjWFeUv: +AjWFsyn:AjWGBBq:AjWGsE:AjWIaRb:AjWLOah:AjWRChD:AjWRoAr:AjWUQrT:AjWVogB:AjWcZFT:AjWebEB:AjWgcGE:AjWkBgH:AjWlTqu:AjWmZbv:AjWqXv:AjWudJM: +AjWzjfm:AjWzpMa:AjXCtOk:AjXFbdv:AjXFtiA:AjXSWrv:AjXSYXk:AjXYPjX:AjXhEoW:AjXhgor:AjXpcnX:AjXsWlL:AjXsdnI:AjXtGte:AjXtRaf:AjXyiiY:AjYBwdk: +AjYGzQD:AjYLbDy:AjYLoA:AjYLtIN:AjYXtoD:AjYYWRy:AjYYYxd:AjYgTcS:AjYhmrz:AjYhuSs:AjYnEOX:AjYqQjr:AjYtQuV:AjYxwe:AjYyWLC:AjYydNF:AjZDeoO: +AjZHYDc:AjZOphl:AjZPBfl:AjZQRxj:AjZWrqO:AjZbUZd:AjZpZaA:AjZubma:AjZurDx:AjZxHLl:AjaNmlb:AjaObDF:AjaOtIq:AjaUQJP:AjaVgNQ:AjaZrWx:AjagQui: +AjajgBA:AjakmrE:AjakuSL:AjapiIi:AjasrtI:AjavfFk:AjaxNFx:AjaycNh:AjbBwVG:AjbFqwI:AjbIrqF:AjbNhvY:AjbQgUf:AjbSBfE:AjbULqb:AjbWeof:AjbXgVU: +AjbceUc:AjbgEn:Ajbhryn:AjbkHLE:AjblRSG:AjbsZah:AjbtXTn:AjbxiFK:AjbzEeB:AjbzHOS:AjcAgda:AjcDGVI:AjcKahl:AjcNqWp:AjcYpXJ:AjcYyzx:AjcZRXz: +AjcmoDW:AjcnbMq:Ajcnrdh:AjcqAxR:AjdDfdL:AjdDzmg:AjdEHXX:AjdIaqt:AjdNfsu:AjdOKzG:AjdQZaE:AjdRSKC:AjdVdiw:AjdcxIc:AjddZOw:AjdhgrP:Ajdkegy: +AjdktrK:Ajdnkhk:AjdqsJR:AjdtXcN:AjdyEiF:AjeCUYw:AjeEMHY:AjeEjPI:AjeIfDu:AjeLJzg:AjePoah:AjeToPr:AjeXSkZ:AjeaRGj:AjeeMfC:AjeezPP:AjejKOg: +AjejNNj:AjejeUw:AjetkHr:Ajeubdy:AjezXCW:AjfDtwJ:AjfZJMD:AjfZupb:AjfZyZy:AjfdCEn:AjfdFFI:AjfdUON:AjffZTt:AjflAbT:AjftiKH:AjgBCnB:AjgEddp: +AjgFbkl:AjgJQox:AjgRSsV:AjgZRlQ:AjgaTqg:AjgopMs:Ajgpkov:AjgtpRk:AjhOZzk:AjhQQzP:AjhVtOY:AjhWrwZ:AjhcffI:Ajhecnj:Ajhggbc:AjhhJOJ:AjhiGtW: +AjhiRaT:AjhlAmc:Ajhpohq:Ajhprky:Ajhsbii:AjiAAxq:AjiAbkH:AjiHDmX:AjiNYJW:AjiTVCZ:AjiTnTS:AjiXrWh:AjiYnsT:AjiaZzt:AjiacCr:AjidWBy:AjifaQG: +AjifvPn:AjinWJp:Ajiotex:AjitIiX:AjitodB:AjiwaYZ:AjixKhV:AjjAnKn:AjjAomh:AjjCYoT:AjjDphz:AjjEBfz:AjjOGvo:AjjTYLT:AjjTzuX:AjjVPXN:AjjckqP: +AjjhKUB:AjjhXTQ:AjjiZMI:AjjyQOv:AjkCRCl:AjkJIc:AjkKwvW:AjkQgvE:AjkVjmZ:AjkeRsW:AjklQWg:AjksEER:AjksHoC:AjkvsTO:AjkwENk:AjlDSKX:AjlGtyz: +AjlHdil:AjlOopP:AjlWJZE:AjlbdZb:AjljjZg:Ajlsij:AjltUsN:AjmAGK:AjmBlTr:AjmCHNQ:AjmIxQB:AjmKcUK:AjmMdIG:AjmNRCL:AjmTHNq:AjmUfSE:AjmaPLk: +AjmefVT:Ajmhuqc:AjmimnA:AjmjSEN:AjmpDHM:AjmySrt:AjnJhwS:AjnVeuJ:AjnVsYR:AjnWyEO:AjnhcSm:AjnmkOX:AjnnSt:AjnnwqZ:Ajnoadh:AjnqprE:AjnwkuW: +AjoCElt:AjoCxZX:AjoDLIU:AjoECne:AjoIHKO:AjoLogw:AjoUwPS:AjoWLao:AjoWtnj:Ajoftbc:AjojOfc:AjomikX:AjouABD:AjpAVcx:AjpAntq:AjpDdMj:AjpHjuM: +AjpKYju:AjpNPjc:AjpShAI:AjpWzqP:AjpcohX:AjpcrkP:AjpdKHT:AjpgIQi:AjpgLXI:AjpifOg:AjpixOy:AjpkJOc:AjplMUP:AjpnOhk:AjpoFwN:AjpprTb:AjpwTCG: +AjpxmRn:Ajpxusg:AjqCmlp:AjqGVCA:AjqGnTH:AjqIYdQ:AjqKJhG:AjqKrWs:AjqLnsO:AjqPjUt:AjqTYnp:AjqVvIL:AjqYXfw:AjqYrvF:AjqasxV:AjqcMuI:AjqgIiC: +AjqgodY:AjqioHa:AjqirKi:AjqkKhM:AjqmNFj:AjqncNz:AjqqJoZ:AjqrJZg:AjqtMui:AjqubLy:AjqwWBb:AjqySif:AjqyhlF:AjrChvO:AjrEzBc:AjrFjjx:AjrKzdf: +AjrNCsC:AjrPwMs:AjrnHCq:AjrotU:AjrqMMi:AjrrBzE:AjrwQsA:AjsDgvz:AjsFgdW:AjsIuNv:AjsLjJa:AjsMxyD:AjsTCSZ:AjsUWbp:AjsVwmj:AjsfEEm:AjsiInQ: +AjsmMwP:AjsmeuL:AjssCzu:AjstHch:AjsvPLY:AjszHaQ:AjszOZB:AjtAopY:AjtFZaw:AjtIyGA:AjtNaqF:AjtNkJn:AjtOuyW:Ajtbfvv:AjtcuQA:AjteCZY:AjteSel: +AjtfmNc:AjthxIQ:AjtnPlI:AjuAtYJ:AjuJJjN:AjuJRPk:AjuMSkH:AjuNfDg:AjuNzML:AjuQygx:AjuWsfP:AjuaxPu:AjucDHV:AjufJGi:Ajukuqx:AjumSEU:AjunxDd: +AjurqxD:AjvHKVL:AjvIyED:AjvOJMV:AjvOupp:AjvOyZk:AjvXQRC:AjvdvVI:AjvfZfC:AjvhbeU:AjvjcgR:Ajvkkrw:AjvlTpV:Ajvydjz:AjwBaRn:AjwGEFe:AjwJhuS: +AjwOeUz:AjwOsyb:AjwUJmM:AjwUuPk:AjwUyzp:AjwXddN:AjwdBWL:AjwdBgD:AjwfZbz:AjwisKQ:AjwjvvR:AjwlZFX:AjwnbEN:AjwpcGI:AjwqsJe:AjwrDAt:Ajwvmce: +AjwyoCI:AjxEXFI:AjxErVx:AjxmMrl:AjxnZZQ:AjxnccW:AjxwQUe:AjxzgbM:AjyEoCb:AjyGPJs:AjyHpFv:AjyJBIK:AjyKwdo:AjyNDmj:AjyOVZO:AjycWJb:AjyhbLP: +AjylSiO:Ajylhlo:AjyoUDL:AjyrWLG:AjyrdNB:AjysGTn:AjysRAm:AjyzQjv:AjzBWBR:AjzCBZn:AjzHtMT:AjzJxYf:AjzMeoK:AjzNhcb:AjzPsKl:AjzQgDu:AjzbeVm: +AjzgWdO:AjziQsZ:AjzlKFu:Ajzodzz:AjzpQSO:AkAGVZ:AkAJboi:AkAPZiB:AkAUYSJ:AkAWSqR:AkAXMeU:AkAdQTd:AkAfetm:AkAguEw:AkAnqBC:AkAqMhG:AkAucvU: +AkAxOSI:AkBMscD:AkBOKTy:AkBOSQe:AkBOmpQ:AkBOyTo:AkBSAh:AkBZCeM:AkBbhmh:AkBegXc:AkBeldY:AkBiHpz:AkBiigx:AkBleTt:AkBqsOY:AkBsLwT:AkBzWZY: +AkCAYrN:AkCBQZc:AkCCkLY:AkCQnCc:AkCQwXQ:AkCSpwa:AkCVRb:AkCWOkt:AkCXORI:AkCXyNg:AkCYNjN:AkCbqaW:AkCdZtg:AkCjQre:AkCjfZY:AkCkiJx:AkCmTTV: +AkCnIbL:AkCpdJa:AkCtbyF:AkCuEKW:AkCuIXL:AkCvXWp:AkDGARW:AkDJQzZ:AkDMGRr:AkDODRc:AkDPJBi:AkDSEIE:AkDZEvr:AkDaMEt:AkDcXWf:AkDekor:AkDmCDl: +AkDyigX:AkEBeEH:AkEDRRo:AkEDruz:AkEIAmA:AkEKbbv:AkEWKQv:AkEhzrU:AkElNqS:AkEptGu:AkEsGic:AkFEWUA:AkFLErB:AkFLjvD:AkFLoiG:AkFMSNd:AkFPoNV: +AkFSsxS:AkFUpXc:AkFWboZ:AkFWxWs:AkFYRrP:AkFYrUE:AkFcYkk:AkFctU:AkFpebT:AkFrEzw:AkFrbkN:AkFvkj:AkGKagP:AkGReEH:AkGSRBV:AkGUZbe:AkGZqcn: +AkGmjue:AkGvaOW:AkHGuGu:AkHHuse:AkHQotN:AkHUsUk:AkHWtui:AkHYhlq:AkHfOsh:AkHkqdz:AkHmeQe:AkHmupG:AkIFCES:AkIRDKw:AkIVbGs:AkIWoNT:AkIXaH: +AkIYtHJ:AkIaLP:AkIbudH:AkIfWPn:AkIgWzg:AkIjSGn:AkIkNce:AkIrGvn:AkIyte:AkJDHEO:AkJIZIr:AkJLYsz:AkJSbOY:AkJUSPN:AkJWcmk:AkJcINi:AkJehmA: +AkJlcVe:AkJpSgy:AkJwqbs:AkJxGVy:AkJyTfe:AkKAKNz:AkKEpwZ:AkKFEVp:AkKHyRr:AkKMWhq:AkKXkjw:AkKZass:AkKaIbW:AkKcdJz:AkKeMSF:AkKggd:AkKjCdN: +AkKmfZB:AkKnoCI:AkKrkOP:AkKuqaL:AkKwIeT:AkLEEIL:AkLNFaL:AkLRYST:AkLVUgl:AkLidjq:AkLijKP:AkLkMsM:AkLligq:AkLmZTw:AkLnGBJ:AkLpuGm:AkLsQRu: +AkLsfzI:AkLxpaV:AkMWGhj:AkMWtZg:AkMWzdE:AkMrQRZ:AkMulYa:AkMwgDN:AkNBfMP:AkNDHQc:AkNJiEG:AkNXdyo:AkNXlyY:AkNZbFg:AkNflss:AkNiyOk:AkNmcgo: +AkNqiar:AkNsYD:AkNtMOO:AkOFlIy:AkOMroE:AkONnAo:AkOjmLK:AkOsVEM:AkOzldA:AkPKusN:AkPNeKf:AkPQzpP:AkPfNwm:AkPrwce:AkPuSdj:AkPuueg:AkQAHea: +AkQEDKN:AkQNFU:AkQPhSQ:AkQRNDZ:AkQTzFz:AkQdGvw:AkQgJhf:AkQkCpB:AkQlffX:AkQlvkv:AkQmOSw:AkQxWPw:AkQyIqH:AkQycVV:AkQzYLo:AkRFMNB:AkRFwPT: +AkRHHuu:AkRQAIF:AkRcfFq:AkRfFKv:AkRqCPK:AkRvkNv:AkSITna:AkSNfpe:AkSQsJf:AkSUCDT:AkSUJtu:AkSVkMu:AkSZbxO:AkSctAK:AkSdpAT:AkSfdbi:AkTCNJe: +AkTDOrb:AkTDynL:AkTKYRe:AkTMQzh:AkTVhDG:AkTeTeq:AkThXWT:AkTpTTi:AkTpXyf:AkTqwkp:AkTuijS:AkUCdYM:AkUHgRB:AkUIGha:AkUItZl:AkUIzdN:AkUNAms: +AkUQyyY:AkUTAIt:AkUUeEz:AkUahzc:AkUfyoI:AkUhGiQ:AkUheTL:AkUjcGM:AkUqlSQ:AkVAErT:AkVAffv:AkVAjvR:AkVAoiQ:AkVFrPl:AkVJcsk:AkVKdyv:AkVNRrF: +AkVNrUS:AkVQGHZ:AkVQtzW:AkVQzDu:AkVWHQz:AkVXEQD:AkVYyYb:AkVdiak:AkVgMOV:AkVihZX:AkVvzCm:AkVwJG:AkVyuLj:AkWTHYs:AkWXukS:AkWmldn:AkWnOmj: +AkWnwtU:AkXDrOu:AkXOliI:AkXQwhJ:AkXRABX:AkXSwJX:AkXVAQa:AkXZGfL:AkXZixf:AkXtOMu:AkXtwTJ:AkYCwpv:AkYDcMN:AkYEHUW:AkYMSqG:AkYSJV:AkYUpql: +AkYdqBV:AkYiEyK:AkYikGI:AkYpInL:AkYrhMd:AkYugxo:AkYulDU:AkYyHPv:AkYyiGt:AkYzQTq:AkZBbgZ:AkZDlmg:AkZIwPM:AkZKHul:AkZLcmu:AkZMzfj:AkZPhVT: +AkZeSgg:AkZhYqU:AkZjkNO:AkZmFrI:AkZmuDA:AkZunCY:AkaEhSC:AkaYZiN:AkaaNcN:AkabBFL:AkabMIS:AkadsoL:AkafLWA:AkalHPo:AkaliGm:AkamQTh:Akaoeta: +AkasInU:AkazFRk:Akazudc:AkbCYso:AkbIbOl:AkbKHEZ:AkbVscX:AkbbvQc:AkbmqbF:AkbsQta:AkbueTh:Akbvuer:AkcBDrV:AkcJArb:AkcUEiP:AkcccCG:AkceLa: +AkchtAu:AkcidbW:AkcmIeC:AkcoiOu:AkcydJm:AkcyjkL:AkdAMem:AkdDFaY:AkdLUgy:AkdPYRK:AkdSTNv:AkdVOKq:AkdXNJK:AkdZWHO:AkdiccN:AkdsbYC:AkdtEkR: +AkdtIxI:AkduXwu:AkeHRtN:AkeHWuR:AkeJbOI:AkeOyPz:AkeRfml:AkeWyyg:AkeYpxP:AkevlSO:AkewbQw:AkewiPC:AkeytGy:AkfAeeS:AkfCRrt:AkfCrUa:AkfIIjy: +AkfKQRu:AkfNRTY:AkfNWUE:AkfOiph:AkfVKqm:AkfXAMZ:AkfYoNR:AkfZbBm:AkfmYkO:AkfoKNX:AkfovHE:AkfrGIx:Akfrete:AkfyebP:AkgATge:AkgDnAr:AkgLRBR: +AkgTagT:Akgfjua:AkghOSw:AkgiVEP:AkgvNWy:AkhBGMC:AkhDuKz:AkhHRjv:AkhHzwK:AkhIqCQ:AkhLMQZ:AkhLfHd:AkhLvtf:AkhMtdd:AkhNsUo:AkhOGfZ:AkhOixp: +AkhPtum:AkhQeew:AkhRhlu:AkhZotJ:Akheaoh:AkhluoG:AkhoNqu:AkhpOsL:AkhveQa:AkhvupC:AkhwLxw:AkiLZia:AkiMguA:AkiOCEW:AkiTMev:AkibJC:AkibetN: +AkilMhD:AkimvqE:AkisffE:Akisvkk:AkjZMEi:AkjfQtX:AkjheTQ:AkjiMic:AkjmLwq:AkjsEYb:AkjzOsu:AkkCORN:AkkJKNF:AkkKnCD:AkkKwXv:AkkPbxZ:AkkSNji: +AkkTORn:AkkaCdr:AkkeNba:AkkeVRA:AkkeoCu:AkkfQrB:AkkgTTq:AkkjIbk:AkkldJF:Akkljkg:AkkmwmG:AkknMSz:AkkoEKp:AkkoIXk:AkkrXWW:AkkxXwX:AklCARr: +AklDnpx:AklIbPg:AklKDRF:AklLWHv:AklSwxM:AklUEvw:AklakoW:Aklemez:AkliCDI:AkllQRy:AkllfzE:AklmNBZ:AklmVrz:AklmocN:AkloTtJ:AklpIBP:AkltMsA: +AklvIES:AklwEkK:AklwIxP:AkmEonL:AkmGbbS:AkmLier:AkmQERX:AkmQfFz:AkmSKQS:AkmZcSg:AkmcBgG:AkmelfV:AkmgEZm:AkmgbKT:AkmoLtz:AkmpgDR:AkmtiAg: +AkmwMoZ:AkmyhzT:AknAWUb:AknISNG:AknMHQo:AknNyYW:AknOsxp:AknQFpm:AknSboy:AknSxWP:AknVGHo:AknVtzb:AknavHB:AknlzCx:AknmbeC:AknnbqG:Aknnips: +Akntlyd:AknvgdK:AkoGagM:AkoJtDF:AkoLugs:AkoORBK:AkoWnAk:AkodLXU:AkokOSn:AkoxSDg:AkoxuEj:AkozuVR:AkpElit:AkpMaGD:AkpURbB:AkpWeKb:AkpXZBQ: +AkpiBzw:AkpojUq:AkpvDyr:AkqCSqh:AkqJYJB:AkqKpqC:AkqRbGN:AkqTAiK:AkqTlMs:AkqYMnO:AkqYwpY:Akqacvo:AkqbWPS:AkqdYLK:AkqgYQa:AkqmGvs:AkqnTFo: +AkquSGs:AkqxYQA:AkrCzfw:AkrHYsY:AkrQNdW:AkrTDkC:AkraDmP:AkraxUy:AkrfEYM:AkrfkgO:AkrgIQe:AkriYlb:AkrlOsz:AkrpFKR:AkrsTfF:AkrvJHk:AkrzCPO: +AksRkjR:AksTasV:AksWYsZ:AksaMSc:AksbGbd:AkscZtY:AksdiOg:AksifZg:AksjpiU:AksmpAX:Aksodbe:AkssIeq:Aksuugc:AktACXN:AktCKnV:AktEnct:AktEwxF: +AktGpWv:AktHTNd:AktMNJY:AktWnpS:AktYbXJ:AktZFUR:AktedjV:AktejKw:AktfigV:AktgMsj:AktiZTP:AktoQRR:Aktofzn:AktrtaN:AkuEbFL:AkuMdYa:AkuMlYW: +AkuOieI:AkuhMoa:AkupLtA:AkuqlYF:AkusgDi:AkuxEZV:AkuxbKo:AkvBAiS:AkvHGHf:AkvHtzk:AkvHzDI:AkvRdyJ:AkvScsW:AkvUdZR:AkvZbfg:AkveyON:AkvgGIV: +AkvgetK:AkvicgJ:AkvmiaW:AkvnMOj:AkvphZd:AkvtkuG:AkvwlyM:Akvygdb:AkwBlIZ:AkwGqcT:AkwJnAL:AkwOeEr:AkwRViv:AkwUwjk:AkwVrrP:AkwgwCo:AkwvAKn: +AkwwOmf:AkwwwtY:AkxEuss:AkxKTGL:AkxLzpM:AkxdNqG:AkxjaoZ:AkyNNDu:AkyYbox:AkyfCpM:AkygOSX:Akyhffw:AkyhvkY:Akyrvqw:AkzBwPI:AkzDHuh:AkzGDkZ: +AkzRGd:AkzTpQS:AkzYhVP:AkzfGVc:AkzhJHR:AkzlCPv:AkzoOsc:AkzqpJ:AkzsFKK:AkztgXP:Akztldj:AkzxEYt:Akzxkgv:AlACUoT:AlAIcwZ:AlAKkAB:AlAZUrU: +AlAaijl:AlAdYsq:AlAftJy:AlAgGO:AlAgHRm:AlAisl:AlAkimo:AlAmDEB:AlAmJdc:AlAnWbC:AlAqCot:AlArckv:AlAvOLq:AlAvnme:AlAwFUz:AlAzZsL:AlAzzom: +AlBELOe:AlBFKcA:AlBGtAk:AlBHEau:AlBIIrB:AlBLjMh:AlBPeFd:AlBQkay:AlBTdPR:AlBUPXY:AlBVeys:AlBixxh:AlBkMsP:AlBlYSJ:AlBntjB:AlBqiMT:AlBsDey: +AlBsJDX:AlBvWBx:AlBwCOO:AlBxopT:AlBzcKM:AlCBKRG:AlCFFbA:AlCJSWm:AlCMBiV:AlCRggR:AlCSKsc:AlCTjqT:AlCWorQ:AlCXxSN:AlCiYpn:AlCkEsO:AlCuINc: +AlCzHuP:AlDBwZf:AlDLOAQ:AlDLRrB:AlDNBMN:AlDOYVS:AlDPdPh:AlDZFTd:AlDbVGF:AlDnBdI:AlDneup:AlDyVPf:AlEHAhq:AlEREdW:AlERcqU:AlESSqs:AlEaEPE: +AlEjSuO:AlEsUpi:AlFEEjP:AlFFrmN:AlFNAHH:AlFVLfx:AlFanxE:AlFjlwp:AlFvnOy:AlFzMcJ:AlGJmaS:AlGLhZd:AlGOaQU:AlGQiPm:AlGSBHR:AlGULBo:AlGUYRT: +AlGUafW:AlGXQoa:AlGbCYn:AlGdBTi:AlGeyCW:AlGfsHo:AlGgVdN:AlGngyo:AlGotIs:AlHEKPk:AlHPmAJ:AlHUddO:AlHWipt:AlHgKhC:AlHgeVA:AlHlshv:AlHtgYv: +AlHwjGg:AlICEAW:AlIDBwG:AlIDDRP:AlIMxn:AlIZHkV:AlIdoPV:AlIfxXJ:AlIgYsh:AlIkPfQ:AlIzI:AlIzmjW:AlJBcWJ:AlJFNlp:AlJFWwB:AlJNltn:AlJPOqZ: +AlJRnpK:AlJfDeR:AlJfJDs:AlJgIhR:AlJiedd:AlJlUHn:AlJpIek:AlJsTnJ:AlJtPnU:AlJvDMh:AlKDTUD:AlKDZkf:AlKDggI:AlKIorJ:AlKLSSF:AlKNDVe:AlKNLVS: +AlKNqRI:AlKVBIH:AlKbLVB:AlKdGKm:AlKfbPC:AlKhINX:AlKpKZh:AlKvVpD:AlKyBDk:AlKyeUR:AlLCafW:AlLFDUV:AlLFyCx:AlLIFiN:AlLIJyj:AlLIOfi:AlLLFTm: +AlLQSsm:AlLSDvN:AlLSLvx:AlLSqrb:AlLYTuo:AlLYZKM:AlLYgGb:AlLbUCr:AlLhLvI:AlLjGkf:AlLlbpH:AlLnInS:AlLxgFR:AlLzChN:AlMCrMh:AlMFSql:AlMKNNH: +AlMVWeo:AlMovJJ:AlMwaDj:AlMxobb:AlNAAHa:AlNBTkj:AlNBjTA:AlNIrmg:AlNKEDG:AlNKcQE:AlNPmtP:AlNcDng:AlNhQkP:AlNjISq:AlNxyro:AlOMmah:AlOatIh: +AlOnmsI:AlOwBTR:AlOyVdU:AlOziaD:AlPByen:AlPEnkr:AlPFaqe:AlPJBhb:AlPLYrd:AlPLaFg:AlPSmAc:AlPTCbM:AlPUhzT:AlPftiC:AlPijGn:AlPtQmU:AlPyKhJ: +AlPyeVH:AlQFKeq:AlQHfzx:AlQMLFR:AlQMmK:AlQfsVI:AlQfxVp:AlQlmjP:AlQvXLd:AlQvdPd:AlRCuhV:AlRIKcs:AlRJLOW:AlRKfnv:AlRNfZo:AlRSLfE:AlRXicu: +AlRZmjB:AlRbOlX:AlRbnML:AlRfTns:AlRiLJH:AlRjMjl:AlRmWdq:AlRoLlX:AlRohdj:AlRqHrD:AlSBBid:AlSGFtO:AlSHKsQ:AlSIFbs:AlSSMOp:AlSUKRu:AlSYgRO: +AlSZiEq:AlSgQYn:AlSiOpo:AlSjXNm:AlSoTHF:AlTBxse:AlTOFTv:AlTTYVA:AlTXOp:AlTaInH:AlTfhog:AlTkLvR:AlTobpS:AlTqOPV:AlTrBju:AlTsZLN:AlTuUCi: +AlUAIWX:AlUAgIr:AlUGWGT:AlUHWef:AlUIamf:AlUXSqe:AlUYZXC:AlUZorm:AlUeQKv:AlUhaDC:AlUkobK:AlUpvJc:AlUrhRG:AlUtdVQ:AlUuyRI:AlUzVrq:AlVBFGU: +AlVFfre:AlVIgBR:AlVJvFB:AlVVIwa:AlVVgiK:AlViYpp:AlVjwbJ:AlVnadZ:AlVqoBR:AlWBzfV:AlWMQoS:AlWOhjk:AlWSrB:AlWcmgS:AlWdKHh:AlWdevj:AlWgCyA: +AlWjbIt:AlWjmFk:AlWnlXy:AlWqQMw:AlWtIHU:AlWxUJC:AlWzNlC:AlXEyeu:AlXLHYW:AlXcMPP:AlXfKAL:AlXlKhQ:AlXleVS:AlXlmP:AlXmwUM:AlXqnLO:AlXrbiM: +AlXrmfR:AlYCiCK:AlYULoi:AlYVKCM:AlYWtag:AlYXEAy:AlYYIRN:AlYhgmN:AlYyxXd:AlZFLfb:AlZIckK:AlZMKEA:AlZaMsE:AlZmsvy:AlZsClF:AlZxTnt:AlZyDMV: +AlaDUry:AlaNneA:AlaOOQf:AlaRcwV:AlaVNLl:AlagQnX:AlajCox:AlamdrY:AlapFUv:Alatimc:AlavDEN:AlavJdo:AlawIHN:AlayeDx:AlayiWc:AlbBUOS:AlbEHKh: +AlbIURR:AlbOBWy:AlbODrn:AlbSYac:AlbZkaE:AlbbUHy:AlbeClO:AlbfHrj:AlbiZSK:AlbizOj:AlbjPnB:AlbmMjB:AlbnLJf:AlboBVB:Albooph:AlbpCOs:AlbqcKq: +AlbuOlv:AlbunMb:AlbziMh:AlcEwzs:AlcMsaV:AlcOFbM:AlcSSWa:AlcUPwQ:AlcUjtQ:AlcVDuj:AlcVycD:AlcWXxA:AlcYRzw:AlcbRVP:AlccyDY:AlcdVgs:Alcdkan: +AlclVps:AlcnOpq:AlcpZli:AlcrUcN:AlcxLVu:AlczGKZ:AldAKrB:AldDieF:AldEgrx:AldKwZz:AldLBIS:AldRKSf:AldUOAM:AldWBMR:AldhRvY:AldsbHF:AlduLIW: +AlduXnz:AldwBdU:Aldweul:AldxYPk:AldzESJ:AleANNS:AleILFE:AleQAhu:AleRjtU:AleTUhK:AleYrMs:AleevJQ:AleidVc:AlejEPA:AlelbUf:AlellWm:AlesDNs: +AletmY:AlexQKD:AlezIse:AlfAEDj:AlfAcQh:AlfWAHL:AlfZTkG:AlfZjTl:AlfdMcn:AlfgUjK:AlfgskF:AlfiSUr:AlfjJZY:AlfoBot:AlftlwT:AlfznxA:AlgBQoE: +AlgUnKF:AlgXaQQ:AlgeXzh:AlgedBA:AlgkCYj:AlglCyW:AlgmBTm:AlgpsHK:Algwgyk:AlgxgyK:AlgyjgZ:AlhCSlf:AlhZyeC:AlhfVDS:AlhkLtD:AlhkXZq:AlhkdbX: +AlhqCYn:AlhtycJ:AlhzfDZ:AliBwgL:AliFkAG:AliHNLe:AliHWWW:AliIeYM:AliJPxg:AliLtaU:AliSuHZ:AlijWbf:AlirOLT:AlitTB:AliyLjD:AljBEaR:AljCtAL: +AljJeFC:AljKcWF:AljcBVy:AljcopS:AljexxO:AljfYSm:AljmiMs:AljrgMe:AljsCOh:AljyFuf:AljzPFT:AlkEdpv:AlkHDua:AlkHycO:AlkRxSi:AlkcIPk:AlkcqHj: +AlkeYpI:AlkfEsH:AlkmCHY:AlkqIND:AlktHuw:AlkvhOk:AllIdf:AllKYVv:AllOEjU:AllUBiO:AllXoRM:AllajxR:AlliZLY:AlloKzo:AlluVPC:AlmFhVg:AlmJUdG: +AlmNZXv:AlmNrEK:AlmOthc:AlmRFgY:AlmVfRi:AlmZvfN:Almaqil:AlmeDNt:AlmnUpj:AlmoMCp:AlmzwBF:AlnBrmc:AlnJAHe:AlnRLfU:AlnTzMP:AlnYmtT:AlnZNnC: +AlncEpQ:Alnmisx:AlnnvjA:AlnsISu:AloFmal:AloIdDi:AloKiPR:AloMBHm:AloOLBP:AloOYRk:AloOafh:AloUyEa:AloffdX:AlogGwC:AlogLKy:AlosMpD:AlovKaX: +AlpAGZP:AlpBHYH:AlpLmAg:AlpNhzP:AlpOddb:AlpgNLE:AlplfDS:AlpmmSF:Alpptig:AlpxFIt:AlpxVDZ:AlpyMPO:AlqCneW:AlqGnPA:AlqMqUZ:AlqPZtY:AlqSlTd: +AlqTyS:AlqVLFV:AlqWSEM:AlqbLLK:AlqbhDy:AlqcYsK:AlqetJC:AlqqWDB:AlquIEa:AlrVZTV:AlrWIrl:AlrcIhw:AlrmxXI:AlroZSy:AlrozOX:AlrpSn:AlruXlo: +Alrudpo:AlrwcKC:AlsDxSp:AlsFSSc:AlsKDuX:AlsKycv:AlsNJYd:AlsNOFg:AlsQFtc:AlsROav:AlsRRRe:AlsTBmi:Alsaar:Alscpo:AlsgHuN:AlsrEMt:AlstBDn: +AlsteUW:AltABIa:AltFFTJ:AltKoRf:AltPXXz:AltQIJA:AltRMou:AltTKrp:AltXFBv:AltfQyk:AltjNW:AltxOPj:AluBSqI:AluCXqa:AluDorA:AluEmTZ:AluIUhU: +AluJfRP:AluRamj:AluZIWT:AlubUpS:AlueQof:AlunyRE:AluqLkC:AlutobG:AlvAHcX:AlvGZxf:AlvIoRh:AlvKFGI:AlvOhvw:AlvPfrY:AlvSUDW:AlvVRj:AlvVWgQ: +AlvWaMC:AlvXaMc:AlvdQks:AlvgUPz:AlviVRt:AlvqhrB:AlvsdvT:AlvtyrL:AlvwLKJ:AlvzoBN:AlwCmjE:AlwGoYs:AlwKzfR:AlwPcJd:AlwYCBK:Alwdnlr:AlweMpM: +Alwpwup:Alwviai:AlwxHBA:AlwyGwJ:AlwyLKp:AlxAnkm:AlxBaqz:AlxHaFx:AlxLQOn:AlxNhJV:AlxQhzK:AlxUHYS:AlxofDH:AlxpQmJ:AlxrmGn:AlyBfzU:AlyHSEd: +AlyLcKV:AlyRUog:AlySZtp:AlyXnPh:AlyrUhM:AlyzPNv:AlzDquj:AlzEKcP:AlzOLff:AlzRicV:AlzTmja:AlzVtAz:AlzXIrS:AlzYZTi:AlzccP:AlzkhdI:Alzxxxy: +AlzzMsA:AmADswG:AmAGAcK:AmANTRZ:AmAWBJF:AmAXBJf:AmAZabD:AmAatsO:AmAuATk:AmAwoKl:AmAxoei:AmBDwxq:AmBTdKg:AmBVGJb:AmBYXKe:AmBauVW:AmBdYeE: +AmBuvgK:AmCGuFD:AmCQBsj:AmCUGVp:AmCWxiR:AmCaarR:AmCbekM:AmCguLR:AmCiadB:AmCkJMT:AmCoPUs:AmCrFTg:AmCwfHw:AmDBSxe:AmDCWIJ:AmDFjPN:AmDKXzE: +AmDNSCD:AmDScRz:AmDYBSU:AmDbGsN:AmDheKr:AmDiaRm:AmDlaUP:AmDoFNy:AmDoxkK:AmDsJmk:AmDvYQY:AmDvnpI:AmEDXVC:AmEEgwc:AmELDIF:AmEXrtt:AmEYhwS: +AmEZbOc:AmEZhhy:AmEbrnl:AmEeTn:AmEmkbh:AmEoUku:AmEpGXF:AmEqdwX:AmErYYs:AmEuZTJ:AmEvinS:AmExVZb:AmFBJHS:AmFCamu:AmFDvTM:AmFHGAD:AmFJKaP: +AmFaFfl:AmFhrNw:AmFiSFt:AmFnZCf:AmFoWjA:AmFuUKn:AmFvdWc:AmFxfOf:AmGCSBm:AmGDYOI:AmGFKHf:AmGIHtQ:AmGIbcK:AmGMduF:AmGMznp:AmGQeUD:AmGRrlb: +AmGTQBd:AmGVtQL:AmGcoBF:AmGholL:AmGnpso:AmGoLko:AmGpflq:AmGrmxF:AmGsQtU:AmGtIVP:AmGtpIJ:AmGwNMn:AmGzWmx:AmHBGOR:AmHFAkF:AmHISbZ:AmHWRvh: +AmHZrLU:AmHekvH:AmHiobq:AmHqlBz:AmHqxzi:AmHvpSX:AmHyDKh:AmIBNBX:AmIOdkE:AmIPYOX:AmIPaf:AmIVjck:AmIWEqB:AmIYUCr:AmIarMh:AmIkmGp:AmIlpjU: +AmInblz:AmIpNFR:AmIpqRh:AmIqmEq:AmIrvGi:AmJHGJi:AmJQPT:AmJUTrj:AmJWNbq:AmJcovd:AmJdyFM:AmJqmgy:AmJvban:AmJwmex:AmKIGVI:AmKKScb:AmKMAIT: +AmKMjWv:AmKVWZD:AmKbcdr:AmKbzEI:AmKcPUJ:AmKgnQg:AmKiauv:AmKkfHN:AmKoEzT:AmKrdDH:AmKsKGD:AmLESxJ:AmLHTid:AmLKlLc:AmLLBUx:AmLLcQE:AmLNHvW: +AmLSLZc:AmLaKgn:AmLaulb:AmLeJmd:AmLfeEN:AmLhTqD:AmLkFtw:AmLpFnL:AmLtWWm:AmLtuxB:AmLyKgM:AmMBXQz:AmMDANb:AmMFnkE:AmMGXVz:AmMNGrb:AmMPevE: +AmMRElC:AmMRMof:AmMaPhI:AmMhlTN:AmMiVNl:AmMjzNE:AmMmBDs:AmMmXvg:AmMpCbe:AmMpwBy:AmMsufr:AmMufoD:AmMwmY:AmMxlnu:AmNFnEe:AmNHXqs:AmNJNzO: +AmNKGAo:AmNLvVO:AmNPpFk:AmNRYSz:AmNTHPb:AmNUJHx:AmNWvTf:AmNaXPm:AmNhdWh:AmNiGxv:AmNkTe:AmNlbOa:AmNulvu:AmNvQKW:AmOTyMn:AmOceHt:AmOeDfz: +AmOoIad:AmOsflh:AmOteHT:AmOwIVI:AmOwpIS:AmOxNkN:AmPAgJE:AmPCHCm:AmPHkAw:AmPKgZO:AmPQHxY:AmPSQyx:AmPZeuT:AmPsWMh:AmPyfLa:AmQAdkB:AmQBIMU: +AmQCGjG:AmQDXBQ:AmQJeRG:AmQKIPD:AmQLUCU:AmQZLAs:AmQieed:AmQjjyG:AmQllcQ:AmQqTHD:AmQqaFk:AmQuyZg:AmQvFCp:AmQwJEU:AmQwlWG:AmQxiBd:AmQxjhe: +AmQzooH:AmRIdKu:AmRKGJp:AmRNsWn:AmRPStu:AmRSIps:AmRWcqM:AmRaAtB:AmRcokE:AmRfQQd:AmRgyFT:AmRjrmx:AmRlVey:AmRqsAk:AmRvIWg:AmRyNfB:AmRyqrx: +AmSBFVp:AmSPeeG:AmSTuPq:AmSVBsx:AmSbZsB:AmSedDc:AmSjcXh:AmSnerM:AmSpgpZ:AmSqWwO:AmSrpTc:AmSucdY:AmSuzEb:AmTFPve:AmTHFvk:AmTKewB:AmTOWzt: +AmTblUn:AmTcWti:AmTdNQI:AmTeyBB:AmTfsrm:AmTgZHM:AmThZSY:AmTjYNE:AmTpYku:AmTqDhk:AmTsFnu:AmTwWWT:AmUFjdO:AmUGNZi:AmUMrtB:AmUMxom:AmUXgwU: +AmUgYYE:AmUiboG:AmUkine:AmUnyZX:AmUokwN:AmUpSGz:AmUuulR:AmVCTpr:AmVGGRr:AmVGyup:AmVKELS:AmVKMOv:AmVMAnr:AmVNjDp:AmVOnKU:AmVRFiK:AmVUoHD: +AmVWyCY:AmVXyCy:AmVYPZV:AmVcZCt:AmVdVzK:AmVhlvl:AmVjQKn:AmVkhZr:AmVmFYy:AmVtNLR:AmVuBsq:AmVzRiv:AmWErpK:AmWGOqn:AmWTpwq:AmWUfal:AmWVblJ: +AmWaIao:AmWbGxe:AmWeflc:AmWfzkr:AmWgmxT:AmWiIVB:AmWipIX:AmWqBSb:AmWsHaQ:AmWuvyx:AmWxrBk:AmWzthm:AmXBtqe:AmXFQyA:AmXFaIY:AmXJouV:AmXKrPP: +AmXLRvV:AmXMOQu:AmXNKHb:AmXPVrx:AmXSKav:AmXZsnR:AmXeWMq:AmXlLaf:AmXmmXO:AmXnDKV:AmXpJej:AmXpjuI:AmXvlBD:AmXvxzW:AmXxchn:AmYHXXW:AmYPabS: +AmYYswp:AmYcYEi:AmYelew:AmYfpJA:AmYiPNI:AmYilWN:AmYjCxm:AmYlooA:AmYnMmL:AmYtYEI:AmZCerW:AmZEUcE:AmZIepj:AmZJUpm:AmZKImE:AmZMXbA:AmZNXxn: +AmZRDsk:AmZRirH:AmZRsQ:AmZSLac:AmZXcqj:AmZZYoo:AmZbzHZ:AmZcjYW:AmZelCA:AmZfBzC:AmZpCXT:AmZqJee:AmZqPnp:AmZqlww:AmZsTlG:AmZvpJb:AmZyuVb: +AmZzThT:AmaBRH:AmaDcQh:AmaPIPV:AmaWlO:AmaXGjU:AmafTHV:AmafaFy:Amaneev:Amatyfq:AmbEDsB:AmbEira:AmbIPeS:AmbKYci:AmbMUpD:AmbVACL:AmbYEE: +AmbYaBC:AmbeTlN:AmbnlEg:AmbptSH:Ambwvpw:AmcBBxS:AmcPrpC:AmcUSXV:AmcXTIx:Amcdarl:Amcegpd:AmcfKXS:Amcfmcx:AmcjiDH:AmcjtQ:AmckekA:AmcqKGr: +AmcuJMx:AmcveeR:AmcxTQX:AmdTXzA:AmdXrPt:AmdeYkg:AmdqeKv:AmdtsbI:AmdwAOQ:AmePRcY:AmeRFDD:AmeRhwW:AmeeYqy:AmeiufO:AmenZTN:AmeqXpY:Amevkbl: +AmeyGXB:AmfGhgR:AmfIhHf:AmfVRCB:AmfXhWL:AmfelNs:AmfphZD:AmfqYyl:AmfsbOn:AmftZtU:AmfuiNL:AmfxZCB:Amfyor:AmgASYr:AmgAjcE:AmgBPQv:AmgDGoA: +AmgJyMs:AmgOKHb:AmgQgjQ:AmgSHcy:AmgXkac:AmghHag:AmgiTBq:AmgmbcU:AmgoUVq:AmgqolH:AmgxpsK:AmhARvD:AmhBSbV:AmhCJZR:AmhEVrj:AmhHPqI:AmhISyM: +AmhIjCz:AmhIlr:AmhXHTj:AmhXbCp:AmhYgJn:AmhavYQ:AmhcDKD:AmheNKL:AmhfUFF:AmhnLKT:AmhqTbN:AmhrQTn:AmhubCj:AmhwUvN:AmiCAcn:AmiEabA:AmiIwXo: +AmiYdky:Amiblcj:AmidmGl:AmijmEm:AmiqATN:AmisoKI:AmivQqh:AmiwyfX:AmizrMt:AmjDYmk:AmjEjCn:AmjMcqX:AmjbVel:AmjgeEF:Amjjmgu:AmjkpJP:AmjoThf: +AmjoafI:Amjpmet:Amjqvgl:AmjwAtW:AmkCuFa:AmkDAIh:AmkDjWJ:AmkEBxz:AmkSxiw:AmkVPVi:AmkXFVg:AmkderZ:AmkfEzh:AmkgGSt:AmkgarE:AmkhpTt:AmkkYqc: +AmkknPs:Amkrlub:AmksWTe:AmktNjw:AmktNqE:AmkuybN:AmkvsRa:AmkwZhA:AmkxZsU:AmkzYnI:AmlBjPm:AmlHGvL:AmlIufX:AmlJSCg:AmlKBXC:AmlLAiQ:AmlLjws: +AmlUBUt:AmlUcQI:AmlcaRN:Amldidx:AmlhaUs:AmliAOV:AmljfhK:AmlmGsM:AmlnEZQ:AmloeEB:AmlqQiA:AmlrPuO:AmluVme:Amlvnqb:AmmCrti:AmmCxoF:AmmIneh: +AmmMACg:AmmPvvb:AmmSTPf:AmmWGrf:AmmWyUd:AmmXHpO:AmmbVNh:AmmjPhM:Ammkdwe:Ammmrnq:AmmnSfr:AmmvFFj:AmmxlVx:AmmzQkz:AmnAELN:AmnAMOk:AmnCAno: +AmnEnKH:AmnFXvw:AmnGydQ:AmnNDir:AmnOnEa:AmnQXqw:AmnSAcn:AmnYTpo:AmnZLlL:AmnZiJH:AmncfOi:AmnhQcR:AmnhVna:AmniznH:AmnoPHd:AmnpPHD:Amnphq: +AmnrGxr:AmntfOI:AmnwQcr:AmnwVnA:AmnzXPi:AmoDgjH:AmoEHtL:AmoEbcV:AmoIznm:AmoMeUY:AmoPQBy:AmoRtQQ:AmoTHXT:AmoVQYu:AmoVaim:AmoZoUb:AmodNnq: +AmodzWE:AmokLkr:AmonyDB:AmooQtH:AmoxGxJ:AmpAGEn:AmpLRoA:AmpLifD:AmpSymc:AmpTrLv:AmpVQbp:Ampakvk:Ampbehy:AmpdDFw:AmpeobR:AmpjxRS:AmpnBsd: +AmprfLe:AmpvIvD:AmqMGjc:AmqSeRC:AmqUUCQ:AmqXYCT:AmqZUPy:AmqgmGS:AmqjbAD:AmqlSNT:AmqmmER:AmqntsU:AmqrzhN:AmqsjyC:AmqtvPJ:AmqulcU:AmqvBZW: +AmqzNxo:AmrBGJL:AmrWYmB:AmrYStI:AmrZIpO:Amrjoky:AmrpThO:AmruVeE:AmrxeEo:AmsDHVy:AmsErpQ:AmsHPFe:AmsHTJc:AmsIWik:AmsMeWu:AmsXLzm:AmsfFNb: +AmskZsN:AmsmYnR:Amsuluy:AmswNjl:AmsysRz:AmtPPvY:AmtQFvw:Amtaptd:AmtdQih:AmtfFtr:Amticxo:AmtmeRJ:AmtpWWH:Amtpuxg:AmtqZSE:AmtsYNY:Amttddd: +AmuAKAQ:AmuBnkf:AmuGbOy:AmuGhhc:AmuIaMT:AmuJGrA:AmuJyUC:AmuKvtL:AmuNMoE:AmuPjdc:AmuTFIX:AmuUpfa:AmuaZTp:AmueZcg:AmufXpg:AmujYqG:Amunufq: +AmuwyZT:AmuxkwB:AmuySGv:AmuzZab:AmvBnEx:AmvDXqn:AmvFNzR:AmvIKaf:AmvLrTy:AmvLxOV:AmvNYSg:AmvOboN:AmvOhHT:AmvWhU:AmvYvVr:AmvdGxK:AmvedWU: +AmvkQcK:AmvkVnx:AmvmZCP:Amvqlvh:AmvsQKj:AmvzlNa:AmwEtQz:AmwLAKg:AmwPgzI:AmwQrlT:AmwSQBR:AmwVKAi:AmwWgjc:AmwXHck:AmwYYID:AmwiWmN:AmwkGxa: +AmwmpsY:Amwqmxp:AmwtUVc:AmwvolZ:AmwwNnZ:AmwwzWn:AmxDrPT:AmxFOQq:AmxTfAs:AmxVJZd:AmxWrLO:AmxbpSb:AmxezKm:AmxfmXK:AmxhpiG:AmxnWMu:AmxpIAp: +AmxqGXz:AmxrHAN:AmxtvYg:AmyBjcA:AmyCswT:AmyIVn:AmyMYOR:AmyUDSV:AmyUiRu:AmyYPEG:Amydeei:AmylNxf:AmyovGc:AmyriBI:AmyrjhH:AmysCxi:AmyuTLZ: +AmzCdKV:AmzKEQQ:AmzLStV:AmzbQQG:AmzdNfA:AmzlsAh:AmzpBzg:Amzwyzs:AmzyCXP:Amzzibp:AmzzjHq:AnAKhPG:AnASshZ:AnAUaBl:AnAXvWm:AnAbWvw:AnAcfeG: +AnAkYpm:AnAltZu:AnApvFX:AnArdCc:AnAweql:AnAyzxQ:AnBJXBJ:AnBNWul:AnBaMHL:AnBaksg:AnBfQwU:AnBkUgj:AnBkklf:AnBrCOs:AnBrZnH:AnBwNzf:AnCCYOd: +AnCEZWE:AnCIdBg:AnCJNnt:AnCLxZb:AnCPAGL:AnCTXdZ:AnCVyxk:AnCXjcI:AnCYfwT:AnCkpcQ:AnClgSG:AnCnyRr:AnCsqHG:AnCsvEt:AnCvxy:AnCwfMv:AnDDahb: +AnDKPMC:AnDPNNm:AnDQyPq:AnDTaec:AnDdREt:AnDgBDI:AnDqpCH:AnDwvkd:AnDyiVD:AnDyvem:AnDzZeD:AnEArNa:AnEEGat:AnEQyDh:AnESTZm:AnESlPO:AnEUhSh: +AnEWAbQ:AnEWqRI:AnEaYHe:AnEdOgM:AnEeneM:AnElFgp:AnEnMsG:AnEvwfy:AnEwBTO:AnEygsv:AnFEsiU:AnFFGQg:AnFKGvA:AnFLBHS:AnFMImH:AnFMrdM:AnFNhHE: +AnFPZEh:AnFixtL:AnFobxh:AnFoxkn:AnFsEcu:AnGEWvm:AnGjqzK:AnGlQYw:AnGlnMM:AnGnRFW:AnGoTxI:AnGsZcR:AnGtSjd:AnHAUUm:AnHBTtp:AnHDniP:AnHOwPv: +AnHPjTm:AnHRifZ:AnHSgAH:AnHYOTh:AnHZEyH:AnHcUW:AnHdMnY:AnHoYMl:AnHyENk:AnHzJRH:AnIAbxP:AnICeG:AnIGXbh:AnIKWUN:AnIYfUe:AnIYpMa:AnIYtAg: +AnIZolX:AnIZwbo:AnIeFwt:AnIfGWy:AnIgFCM:AnIhnah:AnIhnzZ:AnIlzxJ:AnInyeV:AnIudCx:AnIwfEf:AnJFLGB:AnJJYWs:AnJNfuN:AnJNpmJ:AnJNtaL:AnJWRwS: +AnJeqbl:AnJlGwr:AnJmfgV:AnJnnAc:AnJnnZQ:AnJpSyu:AnJrzXA:AnJzCsk:AnKAaHD:AnKFIab:AnKFlGf:AnKKgyE:AnKOegd:AnKOmdA:AnKTuhP:AnKVcRl:AnKVilB: +AnKdHWK:AnKeivB:AnKeqHX:AnKevEk:AnKkyzC:AnKlEjZ:AnKnHqe:AnKoUmu:AnKxYQP:AnKzsLr:AnLCNND:AnLExzR:AnLGahK:AnLPmtU:AnLQEW:AnLQLwd:AnLVJOH: +AnLWnqn:AnLegsw:AnLivkm:AnLlwak:AnLnfmF:AnLwyrB:AnMAjqs:AnMBRgX:AnMCvYK:AnMFTZv:AnMFlPT:AnMPFjD:AnMQozf:AnMTVwg:AnMVzvV:AnMWkJe:AnMYhhg: +AnMZIMj:AnMZrDo:AnMbYtF:AnMcYNO:AnMcjNY:AnMdPBp:AnMiBTt:AnMjwfB:AnMlijG:AnMmvvo:AnMnhjy:AnMoFgk:AnMplJu:AnMqYOE:AnMtYNo:AnMtjNy:AnMwOgV: +AnNAuVp:AnNICJy:AnNPABA:AnNPqrY:AnNWoZm:AnNfKTH:AnNhMSw:AnNhYTM:AnNowFi:AnNpwFI:AnNqiJl:AnNrgSf:AnNwMSW:AnNwYTm:AnOCJhM:AnOFEYF:AnOJpNK: +AnOKFa:AnOLEue:AnOLyHq:AnOVIYy:AnOVdXZ:AnOXlPu:AnOeEne:AnOfZck:AnOiEvv:AnOiPas:AnOmAMj:AnOmtCE:AnOsIIE:AnOsJcD:AnOtjNt:AnOtpEa:AnOvtGV: +AnOybQR:AnPEgAO:AnPJyfA:AnPLOTO:AnPXxsV:AnPaRWe:AnPbBGu:AnPnRVx:AnPsynh:AnPuLNv:AnPypeH:AnPzcSl:AnQBUPO:AnQHshH:AnQPhPU:AnQhFCd:AnQiGWP: +AnQjYix:AnQknaA:AnQknzs:AnQmSYW:AnQqyzu:AnQtNZM:AnQwCSI:AnQxUGA:AnQxkLM:AnRBvwF:AnRLCtV:AnRPlQY:AnRXLGY:AnRaEYu:AnRezXz:AnRgyEf:AnRjgTN: +AnRoGwI:AnRqnAX:AnRqnZj:AnRsSyN:AnRzvfs:AnSEAGz:AnSHcRe:AnSHilK:AnSOpqh:AnSPpbA:AnSVjpj:AnSWuhy:AnSXIak:AnSXlGo:AnSXrKT:AnSYHLz:AnSiwAM: +AnSjbXo:AnSjkUD:AnSkYQy:AnSnUVr:AnSrfrg:AnTByXD:AnTCvVM:AnTEiVf:AnTImpj:AnTMYoK:AnTNfbL:AnTOZwj:AnTPiLr:AnTXpBx:AnTeEJJ:AnTnLEB:AnToZeR: +AnTrbxV:AnTsslb:AnTvUvK:AnUAgVr:AnUJkJL:AnULyBA:AnUNuvR:AnUQYFD:AnUSkcX:AnUYpZA:AnUZJhr:AnUZsRE:AnUrAuO:AnUrtIF:AnUvBhb:AnUwumN:AnUyEVS: +AnVGgvk:AnVIRGh:AnVJjQC:AnVKqin:AnVPGvs:AnVVSeQ:AnVXBGR:AnVZaNX:AnVePXe:AnVhEcG:AnVjdMI:AnVonEf:AnVpXYm:AnVtbxZ:AnVvLSe:AnWCxSt:AnWLAiP: +AnWUyFc:AnWWOtm:AnWcfHZ:AnWeIIN:AnWeJcO:AnWfcsn:AnWgOdb:AnWpBJj:AnWrsEz:AnWsvNd:AnXGifD:AnXKxsO:AnXTCzk:AnXfnSz:AnXhPay:AnXiLNO:AnXjYqv: +AnXlcSU:AnXmIiu:AnXmJCt:AnXoODY:AnXpmFt:AnXvAmz:AnXvtcU:AnYBhv:AnYICTh:AnYJUMP:AnYLbsK:AnYOolv:AnYOwbA:AnYPDWD:AnYZXbF:AnYaEnj:AnYnAyt: +AnYngXE:AnYqkSk:AnYuIOp:AnYvQWY:AnZCpmx:AnZDWuw:AnZKbXI:AnZPUmG:AnZVDwS:AnZdzCg:AnZhyZE:AnZoFWm:AnZqFcT:AnZtAYc:AnZtgxR:AnZvMHw:AnZzIoG: +AnaAWUY:AnaMUMi:AnaObsr:AnaPolO:AnaPwbx:AnaZYwo:AnabOFM:AnaffVr:AnajhUw:AnamkLs:AnauqBp:AnbIDwt:AnbTabi:AnbZhpB:AnbaWVr:AnbbfEB:AnbhOfD: +AnboQwi:AnbveQi:AnbwAYD:Anbwgxu:AnbzYPh:AncBjcm:AncEmdz:AncHgjz:AncJkJn:AncSNnp:AncTypl:AncUxZf:AnccdP:AnceUmN:AncgFdx:AnchReI:AncnzhX: +AncugSC:AncwRei:AncxFdX:AncyvKY:AndBYoy:AndDZwX:AndEyXv:AndGjCT:AndJiVT:AndMnqC:AndNgJc:AndOAgQ:AndSXDG:AndXdbz:AndYNNi:AndcnGg:Andmyro: +AndrqhZ:Andrvei:AndzpCL:AneFYFr:AneGanw:AneHkcn:AneMkJz:AneQuvd:AneUPbh:AneWQKj:AneXaUJ:AneYCjm:AnebQWP:AnefECH:AnegTKy:AneiTcZ:AnemOgI: +AnenXyb:AnexMsc:AnexYtY:AneyxTh:AnfDpzN:AnfEDUg:AnfGgDY:AnfKgNf:AnfMBGD:AnfOaNN:AnfPydU:AnfSkcZ:AnfTGAI:AnfUBHW:AnfYZEl:AnfcuMa:AnfifVI: +AnfoOiZ:AnftnEp:AnfzvVi:AngDTTC:AngENpv:AngNWvi:AngPkUD:AngSwpE:AngUtYX:AngWnIC:AngZyFu:AnggsEl:AngqMLK:AngrBgA:AngwMNJ:AnhCOTD:AnhJtyg: +AnhTWVv:AnhYwPZ:AnhZNPI:AnhiqZP:AnhkQyl:AnhknmV:AnhmRfL:AnhwMlT:AnhzBjC:AniBEnS:AniHbxl:AniLYwd:AniPfUY:AniRvWJ:AnifYpj:AnigCoM:AnigZNv: +AnildCD:AninfEZ:AniqEyy:AnisfbQ:Aniuzxv:Aniwyej:AnizgtB:AnjFXBo:AnjIssg:AnjJWuI:AnjMtbi:AnjPbXW:AnjSCtA:AnjXfub:AnjXpmf:AnjYwBh:AnjZvwq: +AnjaSio:AnjdFWs:AnjfFcJ:Anjshug:Anjvfea:AnkCdBD:AnkFNnW:AnkHxZA:AnkPPmY:AnkRyxH:AnkSvvA:AnkTfwW:AnkUivj:AnkYmPf:AnkcKiJ:AnkfpcR:AnkkSTE: +AnklBdS:AnkuEjF:AnlBqs:AnlEIAi:AnlElgm:AnlErkV:AnlNxzV:AnlWBdv:AnlWHCl:AnlYmtQ:AnlZgYN:AnldiVI:AnldqhS:AnllpCE:Anlngss:AnlqStR:AnluzHh: +AnlzyZH:AnmAGak:AnmByBl:AnmChhC:AnmJozb:AnmKGqa:AnmQhSw:AnmSAbN:AnmSqRV:AnmZjqw:AnmaOgr:Anmfvvk:AnmhKtg:AnmswfF:AnmtgsI:AnmxECs:AnmyFgO: +AnnAaNG:AnnBvyD:AnnCrnu:AnnEzVY:AnnFguR:AnnIIme:AnnOYfb:AnnPoZi:AnnSVWh:AnnUTzy:AnnbjnV:AnncYhq:AnndxtA:AnngkWY:AnnhLIx:AnnhXqk:AnnjCcR: +AnnkbxE:AnnkxkC:AnnmhJv:AnnnFGd:AnnpYoJ:AnnywFM:AnoFUug:AnoFWSQ:AnoGTTz:AnoInIZ:AnoOEYB:AnoPahP:AnoWEK:AnoWiFP:AnofyNe:AnokTxt:Anovnsn: +AnoxPAm:AnozYQb:AnpBLvM:AnpGWVY:AnpJCzv:AnpMTts:AnpkYMO:AnplAmg:AnpltcH:AnprETm:AnptENh:AnqEwbj:AnqLUPc:AnqSpMD:AnqStAB:AnqTlh:AnqafGx: +AnqdnaM:Anqhzxo:AnqiDON:Anqjyes:AnqpTVN:AnrBLGe:AnrKENC:AnrLvwz:AnrQUpJ:AnrUYWt:AnrcNzH:AnrhGwU:AnrjnAD:AnrjnZv:AnrlSyR:AnrnzXf:AnroDoG: +AnrpyEz:AnrvCsL:AnrvVo:AnrzEYi:AnsBIaG:AnsBlGC:AnsBrKx:AnsEAFU:AnsFvvx:AnsRHLv:AnsbQHq:AnscfML:AnsksmT:AnstYQu:AnsuzjC:AnsvsLW:AntErHo: +AntGXKw:AntGfor:AntLjCz:AntUjPo:AntcvkN:AnthwaH:AntmWir:AntmcIn:AntqfRb:AntwQhX:Antxnj:Antybxj:AntykuA:AnuEbp:AnuJbUx:AnuLQKx:AnuMozK: +AnuPkCq:AnuSkJH:AnuUyBE:AnuWuvV:AnuXgnM:AnuewfO:Anufijj:AnukKtN:AnumMsq:AnumYtK:AnunxTz:AnvAPBC:AnvBaua:AnvECJF:AnvHhsG:AnvJqrf:AnvPYfY: +AnvRkCE:AnvSoZR:AnvYgui:AnvmgSy:AnvsYoq:Anvwxtz:AnvykWB:AnwDpNd:AnwFEuJ:AnwRlPZ:AnwlYQi:AnwnpEN:Anwocsj:Anwpoaj:AnwppPb:AnwqOdF:AnwsmfK: +AnxHOTR:AnxKAIo:AnxNEUq:AnxNyhe:AnxZlpa:AnxhENQ:AnxjRVe:Anxoynu:AnxqseE:AnxtYqR:AnxucSQ:Anxvpeu:AnyEfUO:AnyEpMK:AnyEtAM:AnyhzcT:AnyjIL: +AnyqWvF:Anytadz:AnyvAor:AnyxAyP:AnyxgXa:AnyzMhD:AnyzkSo:AnzCRwm:AnzHCts:AnzNoLm:AnzNwBZ:Anzaklr:AnzgcL:AnzpENq:AnzqCOd:Anzzklq:AoACOGS: +AoADAtM:AoAHxxe:AoAOUFg:AoARavd:AoATPMN:AoAUNdB:AoAUUHE:AoAUsDL:AoAVDuB:AoAZgUD:AoAZojb:AoAdzTo:AoAkyTh:AoArfqB:AoAsaAG:AoAvojg:AoAzBlc: +AoBIInl:AoBRstJ:AoBZQoc:AoBZqpl:AoBaUZR:AoBlYTr:AoBlzje:AoBrtB:AoBsEbb:AoBuouE:AoCBsBC:AoCIIHh:AoCIWnf:AoCLLW:AoCOINe:AoCPqvL:AoCRRwN: +AoCTyjz:AoCXLDQ:AoCbGAQ:AoCcpwx:AoCmbsv:AoCsWSt:AoCwtlJ:AoCxSjc:AoCxhBX:AoCzpbG:AoDGGdF:AoDKGPx:AoDMNFZ:AoDUaNb:AoDWnId:AoDYQGF:AoDYpM: +AoDhIcy:AoDhcQu:AoDkyZ:AoDpUTB:AoDzkcG:AoEDXbh:AoEHxBf:AoEMREn:AoEQERx:AoERoSl:AoESUze:AoETXmJ:AoEYLOR:AoEYMTC:AoEbcIQ:AoEbgPG:AoEcMLK: +AoEfqMH:AoElgLd:AoEmICP:AoEpeuT:AoEttGb:AoEujgr:AoFFiui:AoFGmpo:AoFHlla:AoFIaf:AoFLhvh:AoFTGDb:AoFVmkN:AoFYeHD:AoFhDNc:AoFirGT:AoFlhLK: +AoFpLSk:AoFpwHK:AoFslaF:AoFsqPn:AoFtKBc:AoFvHhb:AoFvjZe:AoFwxJX:AoFxKSw:AoGEJaS:AoGOmPX:AoGZqZW:AoGfwJX:AoGnDnT:AoGpStj:AoGtYbB:AoGuZhE: +AoGxWfu:AoGzCXm:AoHFguF:AoHHJYY:AoHIQfg:AoHQDcq:AoHUTzP:AoHWRDI:AoHWlLW:AoHZaSj:AoHfBBn:AoHgCmO:AoHjjzX:AoHlNAh:AoHoIgu:AoHrAuX:AoHrdFB: +AoHsQsv:AoHufvP:AoHwBLA:AoIDGUG:AoIMubg:AoIQWwg:AoIVDCJ:AoIZTZk:AoIcZsI:AoIdcvG:AoIeiPa:AoIejaC:AoIixJn:AoIjmWJ:AoIrzsD:AoIuIGn:AoIvRV: +AoIwFM:AoIwjpe:AoIyQSm:AoJDLdW:AoJKQJD:AoJKzzh:AoJOjvw:AoJYziD:AoJeEbm:AoJeZAR:AoJfpBA:AoJkelE:AoJnOeQ:AoJooWS:AoJqVnu:AoJtNyX:AoJuSJE: +AoJvubn:AoKCqvU:AoKERwW:AoKGyjc:AoKRuAg:AoKTFFB:AoKThH:AoKTqcq:AoKUsBZ:AoKbZa:AoKeWSM:AoKrLYb:AoKuTRs:AoKyWTm:AoLCHVe:AoLCgXN:AoLHaNI: +AoLJnIO:AoLJwUu:AoLLQGm:AoLOXMh:AoLQuvl:AoLVLop:AoLVMta:AoLZReL:AoLbrpy:AoLgCPG:AoLlkcL:AoLwglF:AoMCQIj:AoMDERA:AoMNanR:AoMPniT:AoMPwun: +AoMRQgv:AoMVNfj:AoMWuVw:AoMaery:AoMfOgX:AoMhhRB:AoMjayy:AoMruUF:AoMwrPB:AoMxqMQ:AoNHtwT:AoNItZi:AoNKntR:AoNLnxt:AoNMUGt:AoNSKoz:AoNWMoY: +AoNdWFK:AoNflao:AoNfqPG:AoNhBpU:AoNhlrG:AoNjxJq:AoNszht:AoNuyPl:AoOJVeB:AoOLAzU:AoOPFef:AoOPnej:AoOQtzP:AoORnXM:AoOSnTk:AoOUUgM:AoOdbpO: +AoOlHiG:AoOqKsg:AoOrxlR:AoOzzjN:AoPBNjK:AoPIRDP:AoPIlLN:AoPPth:AoPRNDy:AoPRsdw:AoPTdwd:AoPXeYG:AoPbfKU:AoPbwlw:AoPeAua:AoPhBac:AoPmjza: +AoPoNAQ:AoPrbIF:AoPxytS:AoQAxdM:AoQHNJB:AoQOgUv:AoQOojP:AoQQYEu:AoQRGDK:AoQRZRa:AoQRxQL:AoQWGUl:AoQZwpQ:AoQapTS:AoQdXNs:AoQnamb:AoQrDNa: +AoQuzso:AoQvQVg:AoQvsOA:AoQwZYV:AoQwcvl:AoRLLNf:AoRMUOp:AoROoxA:AoRPoxa:AoRRJDE:AoRSsHm:AoRTrze:AoRaSuq:AoRbOeh:AoRdVnl:AoRekud:AoRmPZE: +AoRoIcV:AoRoWtU:AoRpvwc:AoRsaWO:AoRvWtK:AoRwNyA:AoRxhOr:AoRyFaA:AoRyoft:AoSDJQP:AoSEuWK:AoSMLDG:AoSNbQr:AoSNkvW:AoSUoXH:AoSWJdl:AoSXJdL: +AoSYrZL:AoSZpY:AoScFAj:AoSgOEA:AoSihII:AoSkUzm:AoSopbQ:AoSvvWj:AoTAZwd:AoTGowe:AoTHRcO:AoTLGdt:AoTNPcF:AoTZNDo:AoTZcaZ:AoTatgY:AoTtwrM: +AoTwgcd:AoTzSWj:AoUCGqW:AoUCOEM:AoUCxAW:AoUGZWm:AoUMoWl:AoUNzVE:AoUOvZW:AoUUfWW:AoUduUM:AoUfYjO:AoUgDoW:AoUirPI:AoUzwRD:AoVBCEt:AoVCYwd: +AoVFKoa:AoVOnxo:AoVZWvz:AoVahLY:AoVeLSy:AoVewHY:AoVfPde:AoVfclk:AoVjSNe:AoVmmko:AoVrIsc:AoVuBfm:AoVwWFP:AoWAtWD:AoWHabf:AoWJVhq:AoWPMOI: +AoWRqlA:AoWUnXd:AoWVhVQ:AoWaoZL:AoWcxja:AoWeStD:AoWiYbl:AoWlzjG:AoWpSnn:AoWvhlr:AoXEBUU:AoXJqPC:AoXKbJs:AoXLlOe:AoXLnNs:AoXOaST:AoXSOgO: +AoXTATQ:AoXXxXy:AoXcQvI:AoXcsoo:AoXfnmE:AoXiptt:AoXkaML:AoXoDnO:AoXpZSl:AoXtzts:AoYBubu:AoYFWwu:AoYKNdi:AoYKUHn:AoYKsDg:AoYMdWt:AoYQWM: +AoYRqpt:AoYTloR:AoYTnnD:AoYYOGx:AoYfgmg:AoYgXNj:AoYiWpp:AoYkbiV:AoYnnMr:AoYqCMf:AoYrqbP:AoYubqn:AoYvefK:AoYwyTK:AoYyiLd:AoZDJDN:AoZEsHf: +AoZIUFM:AoZNziV:AoZOJqr:AoZPQJV:AoZPzzz:AoZTOGO:AoZTjve:AoZYWNR:AoZcNSl:AoZeBcZ:AoZfaWd:AoZlfv:AoZoNlC:AoZpDsx:AoZspWL:AoZtoWA:AoZzxhl: +AoaBRlb:AoaDeyp:AoaGGDU:AoaGxQR:AoaHUFk:AoaKLya:AoaQLLc:AoaTbjc:AoadkaY:AoadqbW:AoahefL:Aoajhd:AoamdHY:Aoaobcq:Aoarbbj:AobBqfe:AobEnIo: +AobKaFI:AobRInh:AobSqVA:AobURWC:AobWyJw:Aobaeln:AobbNlz:AobeTdC:AobfpWu:AobghiR:Aobjwlz:Aoblxhu:AobmmWu:AobmoxD:AobnouA:AobuWsY:AocEqMO: +AocGqFL:AocHuAz:AocIQOn:AocIqPa:AocJqcl:AocQsTG:AocXINa:AoccFAZ:AoccoFo:AochFAX:AociuW:AockSUj:AocrEBo:AocrZaP:AoctoUH:AodANSA:AodLMtN: +AodOxS:AodPRec:AodTEru:AodccZb:AodegpJ:AodiTbS:AodqcQq:AodsReL:AodvOGl:Aodxhrv:AodzaYM:AoeENdp:AoeEcAE:AoeFNsh:AoeGfst:AoeIIci:AoeKAqR: +AoeLNfW:AoeNTR:AoeSPLl:AoeVGDK:AoeZGpu:AoefHCe:AoeoTBZ:AoeyQOZ:AoeyeuP:AofHCfU:AofOium:AofQmpK:AofRlXO:AofWrqH:AofZVEV:AofbrGP:AofgIsU: +AofsUlO:AogBGdI:AogEmKE:AogFtzk:AogOrzc:AogUiUb:AogVmPd:AogXehO:AogZkXc:AogcKbh:AogeHHi:Aogejzn:AoghBmP:AogqWDV:AogxvV:AohDaSF:AohHGup: +AohJrdR:AohOoJq:AohPguj:AohPoJL:AohQxDq:AohRQtw:AohVVsv:AohceFn:AohgfQL:Aohhipv:AohhjAT:AohkoJi:Aohlxjy:Aohnptf:AohpBLM:Aohqpto:AohvfDj: +AohxIgy:AohzjPr:AoiCPVD:AoiDLLJ:AoiJhKZ:AoiKlrV:AoiRDug:AoiVRdN:AoiVllP:AoiYasm:Aoiabcx:Aoidbbc:AoifCMH:AoilLqX:AoispTM:AoivBlF:AoiwVNP: +AoizGap:AojCkRS:AojFqVf:AojHUi:AojMpWV:AojMsGM:AojTJqL:AojUuwW:AojsFav:AojuuuB:AojyhiU:AokEIHu:AokKINx:AokPyjg:AokZzZS:AokdEBV:AokdZai: +AokdiS:AokighH:AoknYtf:AoknzJq:AokthBE:AokuxHe:AokwoUQ:AolFGPw:AolGosj:AolHXMl:AolINFu:AolQaNM:AolSnIK:AolSwUq:AolUQGi:Aolaglb:AoldljU: +AoldsyD:AoleQoX:AoleeUR:AolhDOC:AollaYF:AolqCPc:Aoltuuy:AolukcH:Aolytgd:AomBHvz:AomBgxQ:AomEPLu:AomIRES:AomMERE:AomNXmw:AomPuVs:AomULOo: +AomWanV:AomYniP:AomYwuj:AomvCpX:AonBllL:AonDYUX:AonFkxe:AonIpDn:AonJctT:AonNtB:AonOqzm:AonPIsf:AonQtwP:AonRUET:AonUeHi:AonXaBr:AonZVHe: +AonbDNN:AondnFi:AoneBMv:AonerGy:AonfdyN:Aonfqpa:AonmWFO:Aonolak:AonoqPC:AonqGk:AonqozX:AonsVG:AonsxJu:AontxLO:AonuSTP:AonyYBx:AooBoWB: +AooJlLu:AooLYua:AooLjnF:AooQCFE:AooRcTm:AooSVeF:AooUAzQ:AooYFeb:AooYnen:AooZUem:AoodWDI:AoojDnw:AookBmO:AoolnfP:AoondYw:AoonqPX:AoopTCK: +AoouHiC:AopAbJH:AopIAME:AopKNjW:AopLDct:AopOTzu:AopRuBy:AopVWWy:AopaaMw:AopbBBK:AopeDnt:AophNAM:AopkfKI:Aopkwlk:AopvgMk:AopwXnf:AopxVf: +AoqAsDr:AoqHRdU:AoqHllK:AoqJJye:AoqKlNi:AoqKoNJ:AoqQNJN:AoqabiC:AoqgBAf:AoqljZd:AoqnNaT:AoqqfkP:AoqqwLr:AoqtAUd:AorDziA:AorGQoi:AorGqpf: +AorPbqg:AorPkVB:AorROdw:AorVUOL:AorYpQi:Aoraouo:Aorboxj:AoreNlT:AorjTdm:AornOyO:AorohON:AorrubK:AorsbSU:AoruclE:AorxIcj:AorxWti:AosARwt: +AosNyUu:AosOQOP:AosWsTy:AosdkUa:AosgEBq:AosgZaN:AospSUt:AosqTRP:AosuWTN:AosvNYD:Aoswhow:AosxFAD:AosxoFq:AotFGQZ:AotFxaZ:AotKXMU:AotLrWC: +AotRvzZ:AotXQil:AotYfwz:AothYJb:AotkDOz:AotmhrD:Aotwljl:AouExBp:AouFoWh:AouLGqS:AouLOEI:AouLxAS:AouSuVX:AoubhRm:AouhCpS:Aouofco:AouqDos: +AouvgCi:AovDtwK:AovEAfk:AovHnxk:AovIUGk:AovSMoF:AovUqLN:AovXntm:Aovblap:AovbqPX:AovfxJn:AovnBfi:AovoQr:AovozJH:AovpPdA:AovpclO:AovryPS: +AovsSNa:Aovvmkk:AovwxLT:AowBYWk:AowHAzx:AowIWVu:AowLFeK:AowLneG:AowOkXu:AowUKOn:AowZS:AowdLsv:AowdwhV:AowgCXg:AowlKsj:AowqISl:AowtBFb: +AowuPDj:AowucLd:Aowwypx:AowySnj:AoxATzj:AoxCRDs:AoxClLm:AoxFxDG:AoxMrdd:AoxNPmv:AoxPdwG:AoxRRLv:AoxTeYd:AoxWGdA:AoxWZrk:AoxWxqF:AoxgjzB: +AoxizSE:Aoxjytx:AoxkcVF:AoxnbIe:AoxtkAM:AoxtqBC:AoxxeFX:AoyBAmu:AoyJbjx:AoyKYEP:AoyQavs:AoySPMY:AoyUDuU:AoyWRlY:AoyZeyk:Aoydfky:AoyjamG: +AoynDND:AoyozsJ:AoyqfqU:AoyrQVB:AoyrsOd:Aoyuojp:AozBUFA:AozDOdL:AozFLNA:AozJiew:AozMJDB:AozNrzB:AozSkVY:AozXuaF:AozZFfc:AozZqCP:AozakuC: +AoziPZb:AozkIcq:AozkWtr:AoznBcV:AozpUZc:AozsNyf:AozuubP:AozxFad:AozyDst:ApADSpF:ApADdzk:ApAESCb:ApAJKeX:ApATlSP:ApAeHxl:ApAoycZ:ApAueUj: +ApAuzvU:ApAvPuF:ApAxgJv:ApAzlNZ:ApAzrkf:ApBCuhj:ApBDrrD:ApBHeeR:ApBIxUB:ApBRAYA:ApBVqPe:ApBYmwA:ApBZnQy:ApBbuIE:ApBdCFv:ApBditz:ApBeSnH: +ApBjTph:ApBkQzb:ApBluCA:ApBrcGo:ApBuUbu:ApBvKtD:ApBxFTs:ApBydXO:ApCFFIv:ApCGIwP:ApCOumd:ApCSGoM:ApCShaf:ApCXAyJ:ApCZWbv:ApClEbU:ApCrRGz: +ApCwcgD:ApDDMgN:ApDFNcz:ApDPaMd:ApDQidj:ApDSuRX:ApDTfRW:ApDUJYs:ApDUyBT:ApDWKoi:ApDXZJf:ApDaQLa:ApDcdYB:ApDhBJL:ApDhGHL:ApDllDj:ApDmqlv: +ApDtkDv:ApDuNQe:ApDwDnB:ApDwQgm:ApDyidp:ApEBcQy:ApEHAo:ApEIMGg:ApEOPsK:ApEYTmh:ApEgQlh:ApElscU:ApEtwqJ:ApEvLVn:ApEvQgF:ApEwqj:ApExLEF: +ApExbGT:ApFDyrD:ApFEqqf:ApFJaZA:ApFKeHR:ApFMdtp:ApFUqcz:ApFePcB:ApFhxyb:ApFlIlS:ApFrAZs:ApFsbUO:ApFvdyp:ApFynVI:ApFzSxP:ApFzqav:ApGAGJY: +ApGBRSf:ApGMxf:ApGNvDB:ApGPazX:ApGYrsQ:ApGaCad:ApGfPCR:ApGpfF:ApGrILJ:ApGuDqz:ApGxbVb:ApHAdZM:ApHFZmI:ApHHQTO:ApHPOWl:ApHQAQc:ApHWuXH: +ApHXIrh:ApHYmHH:ApHZPFm:ApHdDkf:ApHktsi:ApHsOon:ApHyitn:ApHywcm:ApHzcIw:ApIGSpY:ApIGdzt:ApIHlSo:ApINZMp:ApIOYBq:ApIayce:ApIfumE:ApIhHUf: +ApIjPuy:ApInfVB:ApIqsBp:ApIroRi:ApItvYm:ApIuKBe:ApJGXvF:ApJGgFF:ApJMMjO:ApJSVmF:ApJXUNE:ApJdcGf:ApJpvIz:ApJwEEc:ApKDUAT:ApKGRHB:ApKHdLW: +ApKMoRE:ApKQOWB:ApKSMJV:ApKXrTN:ApKdRGa:ApKqTPX:ApKsHEa:ApKwrB:ApLBQmj:ApLDidA:ApLGqKX:ApLLAUU:ApLMRMB:ApLPkxY:ApLPwhz:ApLSlPI:ApLTmxz: +ApLZuPW:ApLakUI:ApLbTkc:ApLbcoP:ApLdOhV:ApLqbLG:ApMBjvu:ApMCPsr:ApMFvrC:ApMHgsS:ApMIamt:ApMLTmq:ApMMNrK:ApMMfrG:ApMOqkc:ApMRcrw:ApMRwJl: +ApMVkXb:ApMVwHA:ApMikur:ApMjJmT:ApMmkdf:ApMuldz:ApMvpSf:ApMzsyf:ApNBtmv:ApNGyrc:ApNLclY:ApNNSsh:ApNNnSf:ApNOpzj:ApNPdBF:ApNdczi:ApNkxyE: +ApNutE:ApNxhWM:ApNzzDt:ApOBehb:ApOCazq:ApOJUuM:ApOMjnh:ApONXFM:ApONgSJ:ApOUbbZ:ApOVWgP:ApOZQgL:ApOaYCs:ApOeILc:ApOqxYR:ApOsqAF:ApOtyie: +ApOvNZJ:ApPGfCC:ApPKIrs:ApPLOob:ApPLkWo:ApPNjSF:ApPORmF:ApPQnGV:ApPSOWw:ApPSuQE:ApPUosH:ApPWlYE:ApPYUvB:ApPZjfZ:ApPdnnb:ApPfUuT:ApPjOim: +ApPjpMf:ApPlitu:ApPlwcv:ApPmcIl:ApPmnDd:ApPobtR:ApPrKbG:ApPxBDj:ApQAfQl:ApQBYBX:ApQCJAF:ApQCopl:ApQQIRx:ApQTjsM:ApQYuqN:ApQZric:ApQdsBY: +ApQhlWZ:ApQlfVi:ApQmDKv:ApQscig:ApQsndo:ApQubTY:ApRCdlq:ApRDrtH:ApRFVmy:ApRSZak:ApRUyjy:ApRVLgX:ApRVnSh:ApRWnDp:ApRYklo:ApRZiTq:ApReuIs: +ApSCmWX:ApSCxzy:ApSDNlR:ApSHhaT:ApSMuHs:ApSQggb:ApSTvn:ApSbFtj:ApScopr:ApSeHEh:ApSgAnS:ApSoBs:ApSoSNQ:ApSprRR:ApTCwhc:ApTFlPP:ApTGmxc: +ApTOAUL:ApTPCcJ:ApTUQms:ApTWidX:ApTXuRJ:ApTcRrG:ApTeYGV:ApTfsYd:ApTjNQw:ApTlDnP:ApTnidb:ApTrqld:ApTwOhO:ApTwOmF:ApUAJyH:ApUAybo:ApUFrXY: +ApULlpY:ApUPNCA:ApUUwJG:ApUVRmR:ApUYIxP:ApUcDNy:ApUcQGV:ApUhpSm:ApUiRRN:ApUlsym:ApUrBjw:ApUrGhw:ApVFSND:ApVLLEN:ApVOlNP:ApVQaCp:ApVYLXD: +ApVYNYR:ApVaWJa:ApVcNzd:ApVivyh:ApVkGZq:ApVlzDm:ApVnHLh:ApVqQvY:ApVvthz:ApVwNJg:ApWCvDl:ApWEAaP:ApWFpZZ:ApWGSSX:ApWGnsV:ApWLSnM:ApWQLYC: +ApWRLeG:ApWWacy:ApWZpAU:ApWaJMn:ApWblfi:ApWdFfV:ApWdqHo:ApWeAVS:ApWffIX:ApWmbVL:ApWoPCU:ApWpEqt:ApWtHla:ApWucJ:ApWvQVp:ApWzBuR:ApXARmO: +ApXEuQL:ApXFAQq:ApXIlYL:ApXLUvk:ApXMQgp:ApXNzLN:ApXQGJK:ApXSohi:ApXUScV:ApXYfCJ:ApXclwx:ApXcony:ApXgfvK:ApXjDkT:ApXlddy:ApXuHXX:ApYCmhc: +ApYEPff:ApYKBFH:ApYKKam:ApYLwyj:ApYOQZG:ApYRQQd:ApYSzlw:ApYapmV:ApYciTE:ApYcwCF:ApYfndT:ApYhbTb:ApYknNR:ApYmUUd:ApYutSB:ApYvkLX:ApZBQJK: +ApZInDy:ApZLiTx:ApZNaFC:ApZOVnJ:ApZPnQf:ApZVFib:ApZWIWD:ApZaekz:ApZeiwl:ApZjhtT:ApZkCMZ:ApZmGgr:ApZqtuk:ApaEYBj:ApaFQtm:ApaGSUF:ApaHJAt: +ApaQSwP:ApaTHLI:ApaVQai:ApabgJR:ApadrkB:Apafeq:ApagtEo:ApahoRr:ApakwCq:ApbCVnq:ApbHZay:ApbQeeV:ApbSuMK:ApbXdlc:ApbYmcm:ApbhGtq:ApbkuIA: +ApbmCFr:Apbnrro:ApbrdXK:ApbtRgU:ApcDkLv:ApcHxuM:ApcIVNz:ApcRuHe:ApcVggt:ApcWODi:ApcXmWN:ApcXxzo:ApcYnqv:ApcchTD:ApcjQZm:ApctSNG:ApcuEbQ: +ApdAKoM:ApdBuLH:ApdDcqT:ApdNLON:ApdPHaM:ApdRjVa:ApdSPSf:ApdVvRW:ApdXgSG:ApdbSnC:ApdcttZ:ApdfDLs:ApdoRPq:ApdoTJC:ApdykUf:ApeBNrv:ApeBfrz: +ApeCTmL:ApeENCw:ApeGupQ:ApeTybY:ApeVKOd:ApeYPso:ApeZCCU:ApegBjA:ApegGhA:Apekldg:ApelwSq:ApepQll:AperdyO:ApetNqh:ApeuRpx:ApeuTjJ:Apeubzw: +ApevDNO:ApfCclR:ApfDgbq:ApfGxlE:ApfLGbk:ApfMZJL:ApfNqcv:ApfOLyx:ApfSaZM:Apfayj:ApfdCAq:ApfdznK:ApffVD:ApffWJs:ApfhNzv:ApfqYcO:ApfrZDr: +ApgAQgY:ApgCNyi:ApgDqQc:ApgYazD:ApgZehW:ApgaKvs:ApgdPCG:ApgeEqf:ApgiSXU:ApgibL:ApgiqAs:ApgjAVA:ApgqAzv:ApgrbuJ:ApgudYu:ApgxnvL:AphHohW: +AphQQTC:AphQfqp:AphRYbD:AphSJaZ:AphSoPp:AphjHXf:AphkObg:ApholnP:AphorKl:AphtsbE:AphxlwF:AphxonG:ApiPAqf:ApiWQGg:ApiWqXh:ApiXzlY:ApijwDv: +ApiksiR:Apimfia:ApioeUI:Apiozvv:ApiqOBn:ApirOOk:ApiykLv:ApiztSl:ApjFMjK:ApjKFip:ApjPXvB:ApjPgFB:ApjPorX:ApjTNLf:ApjWUaI:ApjXGOK:ApjaEEG: +ApjddXB:ApjgekH:ApkJOWF:ApkLMJR:ApkVoRA:ApkqGTA:ApkwUBA:AplEPSm:AplMwaF:AplVrxM:ApleSnh:AplhMU:AplmbgR:AplsDnm:AplsQgB:Aplxpsy:AplyRrZ: +AplzYGk:ApmFMGZ:ApmMcQD:ApmOvrG:ApmUaQh:ApmXNOh:ApmYuph:ApmZZjr:ApmcQlu:ApmedyV:ApmltTJ:ApmrLVs:ApnAADh:ApnEaZB:ApnLtmR:ApnRgsy:ApnRzeS: +ApnSvdX:ApnUAAd:ApnVGjC:ApnWSsl:ApnWnSb:ApnXbBI:ApnYxlJ:ApnZWGc:ApndxyA:ApnhIlp:ApniabZ:ApnmbUl:ApnnAZP:ApnqJmZ:ApnrdyS:ApnsnVj:ApnuAvg: +ApnvSxs:ApnvqaU:ApoFyRx:ApoLehN:ApoQtMm:ApoSrst:ApoccZr:ApogBfz:AponILo:ApooaBE:ApowJME:ApoyZdB:AppAjff:AppBZmn:AppFJaq:AppJnGj:AppKwYF: +AppPQzk:AppSmHo:AppUPFj:Appbddl:AppegvQ:AppoBDV:AppqOiQ:AppqpMZ:AppsitI:AppswcJ:AppvcIP:AppvnDX:Appxbtn:ApqCdzQ:ApqFfcD:ApqHQQS:ApqKYBT: +ApqLSUX:ApqNGjE:ApqPngQ:ApqROwp:ApqRuqB:ApqToSO:ApqVlyB:ApqWSwn:ApqZIRt:ApqlkLo:ApqmgVj:ApqyOIj:Apqypma:AprCXve:AprCgFe:AprFxUH:AprGOwx: +AprIMjl:AprJXuF:AprLRhX:AprOVme:AprQgso:AprTOdL:AprVzZq:AprbKtn:AprdFTY:AprgdXe:AprrEBt:ApryekO:ApsBdLz:ApsCrTC:ApsIXVr:ApsIgfr:ApsIoRh: +ApsMOWo:ApshKTy:ApsiUBH:Apsmdxr:ApsqAnw:ApsqhZ:Apstuix:AptBuRn:AptGjVs:AptHAUH:AptOlPT:AptPmxg:AptTqKe:AptYrxT:AptnbLz:ApuGurG:ApuNAuA: +ApuOCCG:ApuRkXM:ApuRwHn:ApuVmXn:ApuaqLi:ApuiNqz:ApumiDo:ApurRRJ:ApusblS:Apuusyi:ApvBZJz:ApvDLyN:ApvDOym:ApvEvdA:ApvHcld:ApvLxls:ApvOUUG: +ApvXlNT:ApvcgVL:ApvgIgA:ApvgJVc:ApvhDJq:ApvhqhB:ApviyIo:ApvwHLl:ApvxHLL:ApvyZcv:ApwGjnK:ApwWZjS:ApwXLxI:ApwaqDD:ApwcFAb:ApwhvYe:ApwigvE: +ApwkFsT:ApwmDjX:ApwmFfR:ApwmqHk:ApwnCan:ApwnzNT:ApwpWjl:ApwrNZi:ApwutHw:ApwvNjj:Apwzhwy:ApxCfCf:ApxFIrv:ApxIPFS:ApxSQzr:ApxUUvg:ApxVQTQ: +ApxVfqb:ApxXJaH:ApxXoPb:ApxcBDo:ApxdOiH:ApxdpMC:ApxfitP:ApxfwcS:ApxicII:ApxinDA:Apxkbtw:Apxrgjn:ApxtlnB:Apxuddu:ApxxorN:ApyDuqI:ApyEAqt: +ApyHlyI:ApyNPfz:ApyPRMJ:ApyRoHl:ApySngz:ApyTSCS:ApyUBFt:ApyUKaQ:ApyWoSd:ApyXfcO:ApyffVN:ApygOOy:ApyiDKQ:ApyondH:ApzAIWh:ApzBrrw:ApzFeea: +ApzHzZh:ApzMGOu:ApzTklj:ApzXxUQ:ApzYVnf:ApzauIV:ApzcCFe:Apzciti:ApzkJPK:ApzshtX:ApzzQzq:AqAGAb:AqAILVA:AqAKSdx:AqALgx:AqASZAC:AqAUjTs: +AqAZQpe:AqAZyYC:AqAczmT:AqAearJ:AqAeidq:AqAgGPs:AqAlrEP:AqApZRj:AqApmdy:AqAquQv:AqAznRm:AqBCUrH:AqBCYXS:AqBCjOn:AqBDoCg:AqBJcJK:AqBNHpg: +AqBNgNH:AqBTXxB:AqBTeNn:AqBUedF:AqBZaSL:AqBbdPS:AqBbvbL:AqBdiA:AqBdtSz:AqBgYvJ:AqBmsyV:AqBsKMk:AqBwPpv:AqBzbAA:AqCCEWR:AqCGHUK:AqCIURC: +AqCIYxX:AqCIjoe:AqCOOCV:AqCSOef:AqCcKWo:AqCfKPd:AqCjHYE:AqClAFp:AqCmJjk:AqCmYVA:AqCsIii:AqCvCqU:AqCytsQ:AqDDBIu:AqDDaZL:AqDILYL:AqDIQYd: +AqDKeIx:AqDPTMO:AqDPsYt:AqDUVwM:AqDXbkd:AqDfGmv:AqDfemS:AqDrmpT:AqDuCao:AqDuzXi:AqDyTXx:AqECdor:AqEJVWz:AqENQyS:AqEQeio:AqETZSx:AqEUpmN: +AqEdVYw:AqEfMpf:AqEfUQo:AqEiTgr:AqEjanh:AqEttao:AqExSzG:AqFCHaj:AqFCKyN:AqFLymN:AqFNWTB:AqFPcJk:AqFVray:AqFYAvP:AqFboSw:AqFhSvz:AqFnzcM: +AqFoqur:AqFrOfK:AqFyrQb:AqGCZWy:AqGCynu:AqGDToG:AqGEpzo:AqGJLis:AqGMyft:AqGXcjP:AqGboXS:AqGjosL:AqGmhmM:AqGpSVA:AqGqeLe:AqGvzCv:AqGwuxs: +AqGzOFp:AqHBjtU:AqHEQPC:AqHEyye:AqHVLvg:AqHWhlD:AqHZOrn:AqHcjkl:AqHfaCX:AqHfnrk:AqHgrev:AqHmdDF:AqHrRtz:AqHyFtA:AqHyscI:AqIBJRj:AqIBmJz: +AqIBrbR:AqIFZAz:AqIHjTJ:AqIIwPx:AqISsoQ:AqIWYeI:AqIYOyk:AqIaIfv:AqIcShH:AqIijKs:AqIlacG:AqIlnRt:AqItShh:AqIuXFu:AqIvEWt:AqIvkMd:AqIvnLi: +AqIwRTE:AqIyQzU:AqJAJLn:AqJALun:AqJGlkF:AqJITLY:AqJKBIx:AqJOTui:AqJlbAH:AqJocGM:AqJofDj:AqJouMm:AqJsJDK:AqJsPoG:AqKBhIe:AqKFdsz:AqKGHPw: +AqKGgnX:AqKIJlW:AqKILUW:AqKQlce:AqKSBiA:AqKVrLe:AqKWTUP:AqKaOAZ:AqKcnuJ:AqKeodI:AqKfIir:AqKpEkZ:AqKsbaQ:AqKwcgt:AqKwfdS:AqKwumT:AqKxzvN: +AqLGaZe:AqLHphu:AqLLWFi:AqLMqhM:AqLNGlL:AqLQZsF:AqLVOad:AqLZEGT:AqLaVyI:AqLcMPX:AqLcUqQ:AqLdSZY:AqLhIkt:AqLkRVT:AqLpnde:AqLqufj:AqLtjMU: +AqLujxh:AqLwmWf:AqLzOFV:AqLziKL:AqMBkYx:AqMMBiE:AqMPoUH:AqMRRtP:AqMRxda:AqMUsIk:AqMgVYP:AqMmanO:AqMnBNo:AqMpTxH:AqMrHnP:AqMrskp:AqMsASj: +AqMsVRC:AqNFQuu:AqNMNIm:AqNMOok:AqNNHte:AqNOymW:AqNQPzO:AqNScJr:AqNXGTi:AqNeOfR:AqNfql:AqNiaZW:AqNnelG:AqNtkWA:AqNtxVR:AqNuoSn:AqNxIDw: +AqNzhMo:AqOAgTe:AqOFGws:AqOHWtr:AqONRSS:AqOOrAi:AqOPrAI:AqOWWtR:AqOfKSz:AqOrrqr:AqOxEwv:AqOxmuj:AqPAFfp:AqPDjXb:AqPEOYm:AqPLOrw:AqPMjHY: +AqPRCwg:AqPSDkK:AqPbhhx:AqPfRFX:AqPhpnG:AqPpsPX:AqPwekZ:AqQIjxK:AqQUXSG:AqQWCWN:AqQXCWn:AqQghHQ:AqQhXFZ:AqQkRfq:AqQlQzz:AqQvspQ:AqQyXRK: +AqRBqMs:AqRCrlC:AqRRrNZ:AqRUgP:AqRrDhT:AqRxbEQ:AqRxbuY:AqRymqG:AqSDPJ:AqSDasu:AqSHTUy:AqSIrLL:AqSTOCD:AqSTcjr:AqSUhIL:AqSXgnq:AqSYdsS: +AqSaAFb:AqScPPO:AqSebaX:AqSifdZ:AqSkzvg:AqSldCn:AqSntsC:AqSsEks:AqTFyhX:AqTLvaU:AqTMEGo:AqTPRug:AqTPjJS:AqTQDOG:AqTXyLD:AqTlOFM:AqTliKW: +AqTmGIq:AqToOjU:AqTrClN:AqTuFMj:AqTuXMt:AqTvgvs:AqTvrcp:AqTwjMn:AqUApHE:AqUEWfY:AqUIvXy:AqUSEgd:AqUTyfN:AqUVRUl:AqUVjjX:AqUWDoL:AqUZTmV: +AqUZsym:AqUafUH:AqUbRvd:AqUitaA:AqUmSzi:AqUqaOL:AqUuRIV:AqUwkjr:AqUyiso:AqUylzO:AqVEcJu:AqVHHat:AqVHKyP:AqVSrzX:AqVUAJn:AqVWTIZ:AqVXZfK: +AqVdqul:AqVnSvD:AqVrwfy:AqVtqql:AqVzcXA:AqWDAVY:AqWGqia:AqWHPJi:AqWKlSN:AqWMLiA:AqWRyfF:AqWSJof:AqWXZWK:AqWXynG:AqWbhnI:AqWfCLg:AqWluxA: +AqWoqqn:AqWuilR:AqWxwFn:AqXAygS:AqXDCwl:AqXLhlv:AqXMFqB:AqXQsIt:AqXYLvU:AqXbsgI:AqXcxay:AqXhdjJ:AqXuiDe:AqXwGpg:AqYChLm:AqYJPYI:AqYKCWw: +AqYLxRF:AqYPLjS:AqYRJFi:AqYUFQy:AqYVjhI:AqYVrRl:AqYWLE:AqYapNW:AqYeFTh:AqYlXRR:AqYndJq:AqYpeKJ:AqYpptL:AqYyspH:AqZDHpX:AqZDgNw:AqZGJLX: +AqZGLuX:AqZKoCx:AqZMWrV:AqZOTLo:AqZOlCj:AqZQHWo:AqZTkTK:AqZYApR:AqZboDf:AqZidcH:AqZmMAY:AqZqVTn:AqZszdd:AqZuBgr:AqZvKpP:AqZwCeu:AqZzHyq: +AqaCLjx:AqaJyGC:AqaNjxY:AqaROcV:AqaSASS:AqaXJRW:AqaXmJG:AqaXrbo:AqaauX:AqaceKa:Aqacptg:AqalEWI:AqalkMY:AqalnLT:AqamXkD:AqapRfc:AqauTPl: +AqawxyM:AqazddD:AqbFYGx:AqbGkTp:AqbMWbm:AqbMyd:AqbRhiq:AqbVdSn:AqbWHpc:AqbWgNL:AqbYJLC:AqbYLuC:AqbaSiV:AqbiShb:AqbqOaN:AqbvIIf:AqcBURG: +AqcBjoa:AqcGDfb:AqcKFyD:AqcQHUo:AqcSnXu:AqcTeDI:AqcavBC:Aqcctsu:AqcfJjo:AqcfYVE:AqclKWk:AqcoSHi:AqcrKmd:AqcuCmB:AqcuWSf:AqcvPPy:AqcwOAE: +AqdFdOa:AqdMyLR:AqdRLYH:AqdgClX:Aqdkgve:Aqdkrcf:AqdnCak:AqdnzXm:AqdwVyd:AqeSDCj:AqeTVWF:AqeWLyg:AqeWQyO:AqeXLyG:AqeXQyo:AqeZeis:AqeffUZ: +AqelFDT:AqetCAd:Aqetzxb:AqeueMX:AqfEJhG:AqfFPjl:AqfQgty:AqfVGWo:AqfXWTn:Aqfabxz:AqfdelR:AqfjkWT:AqfjxVG:Aqfpegk:AqfphMz:AqfvKsf:AqgBZFR: +AqgCcQw:AqgEWoG:AqgFBhk:AqgKJHL:AqgRHAm:AqgRKYI:AqgSGtW:AqgZNiS:AqgZOOU:AqgepNt:AqgnqUu:AqhEkxn:AqhFsOB:AqhIZai:AqhKjtY:AqhLwpk:AqhUJry: +AqhUmji:AqhUrBA:AqhYFfE:AqhYZon:AqhoaCT:Aqhonrg:Aqhpjek:AqhqreZ:AqhumDs:AqhxXff:AqiQjTN:AqiTQpX:AqiUYx:AqiaRTa:AqicGPN:AqifrEm:AqirjKw: +AqisLEE:AqiuacC:AqiunRp:AqixFTZ:AqixsCR:AqizIfr:AqjBlHl:AqjLtYP:AqjNXxo:AqjNeNC:AqjQedk:AqjTaSa:AqjVGNO:AqjXTum:AqjYrlX:AqjcJJM:AqjcYvg: +AqjhDhO:AqjjCQs:AqjoKMF:AqjqAfv:AqjubAL:AqjycGi:AqjyfDN:AqjyuMI:AqkEnXN:AqkJlhU:AqkKhIa:AqkTtyi:AqkVXXV:AqkVenz:AqkfmQE:AqkiJjt:AqkoIiv: +AqkpsYb:AqkrCqJ:AqlDLYA:AqlDQYi:AqlFeIu:AqlKyZB:AqlQphq:AqlUWFm:AqlXdOh:AqlYvxM:AqlafBl:AqlcqHT:AqlhqWp:Aqlkwne:AqlvAsw:AqlytAu:AqmEMnb: +AqmFBiA:AqmFazx:AqmLeil:AqmOpmm:AqmQwPF:AqmRJWf:AqmVylb:AqmYoUL:AqmbMpE:AqmbUQL:AqmcSzD:Aqmgfbu:AqmiqhM:Aqmnqwi:AqmpuFw:AqmqDLy:AqmtjXu: +AqmwBNk:AqmzRvI:AqnEHtY:AqnFNIQ:AqnFOoW:AqnHGWf:AqnIrzC:AqnJbdE:AqnMQuI:AqnPRsF:AqnTAvU:AqnWqIm:AqnXPje:AqnbeJp:Aqnjzch:AqnmBoH:AqnmRFQ: +AqnrhNE:AqnvClk:AqoApzH:AqoFGtL:AqoHGfa:AqoLNih:AqoLOOn:AqoLwG:AqoNyMR:AqoPPZJ:AqoPYxx:AqoQXX:AqoRcjw:AqoUQUp:AqoYrAE:AqogIdr:Aqoihmj: +AqomeLB:AqoskwD:AqosxvW:AqotOFW:AqoxazR:AqpAQPf:AqpHzcE:AqpPAst:AqpShla:AqpYXsr:AqpZPyE:AqpbEey:AqpbTpK:AqpdxYj:AqpfIFl:AqphSHR:AqpjXKc: +Aqpkhhd:AqpuFtd:Aqpuscl:AqpvUSS:AqpyMLq:AqqGyYY:AqqLrRy:AqqPFFu:AqqSYej:AqqTOyh:AqqZFQL:AqqdjKp:AqqeLEB:AqqlBfy:Aqqoddz:AqqqXFV:AqquQzv: +AqrGaSF:AqrKTuJ:AqrLODK:AqrLoeW:AqrNXI:AqrOtYw:AqrZqPQ:AqriFtP:AqrmzVt:AqrntrD:AqrtSix:AqsArnQ:AqsBOeP:AqsIsqV:AqsMBil:AqsQqmx:AqsRrLH: +AqsYclB:AqsgHYs:AqskSIo:AqsuyQr:AqsxmQL:AqtDphJ:AqtERm:AqtEbkr:AqtFTT:AqtGRTV:AqtGxDg:AqtHWFV:AqtIsiM:AqtMTMY:AqtMsYb:AqtVEGk:AqtWyFA: +AqtZDOC:AqtaaNi:AqtdojB:AqteTXN:AqtnFMn:AqtnXMp:AqtompB:AqttVc:AqtvGIu:AqtzBki:AquApmd:AquGBFo:AquGTKX:AquJPDd:AquLoUe:AquMHck:AquXOAP: +Aquganb:AqujBNB:AquqCLA:AqurnDQ:AqutFme:Aquvjma:AqvCRsY:AqvEraC:AqvGAvJ:AqvJTOf:AqvKGWy:AqvMWTx:AqvPLIR:AqvVgto:AqvYUlF:AqvaOfq:AqvehNZ: +Aqvmzcw:AqvnkDG:AqvpzOI:AqvueJo:AqvyiLa:AqwMAVE:AqwONiA:AqwOOOG:AqwRrZS:AqwSPZc:AqwSYxQ:AqwTAje:AqwYKRu:AqwcqUg:AqwfBOX:AqwfRfA:AqwyDXG: +AqxFOrP:AqxJsIx:AqxOxrq:AqxSLJd:AqxfKjP:AqxkuqN:Aqxlxau:AqxoXre:AqxqJXg:AqxyDXb:AqyHOcA:AqyLFQE:AqyPsis:AqyTDKG:AqyUxRz:AqyZSdk:Aqyadds: +AqybkMN:AqybnLC:AqywJxl:AqzIOcN:AqzIcJx:AqzMHpT:AqzZHWc:AqzfAfh:AqzstSI:AqztbEt:AqzzVTb:ArAEJTf:ArAQjWo:ArAQlno:ArAWLpG:ArAYtWX:ArAassN: +ArAfkVC:ArAiozb:ArAirfz:ArAkNNr:ArAvOL:ArBFPDb:ArBGKog:ArBMwYz:ArBRHRf:ArBVDhy:ArBWhKt:ArBYjwT:ArBYlNT:ArBaCEC:ArBasRA:ArBfkLw:ArBisSu: +ArBqoZY:ArBqrFA:ArBsNnI:ArBvirq:ArCBWkZ:ArCBYAG:ArCGdxI:ArCMERp:ArCPVcH:ArCWAAd:ArCXPst:ArCbdwe:ArChFYi:ArCjQSQ:ArCoQLu:ArCqvbH:ArCsmKY: +ArCsujP:ArCtsAX:ArCxipu:ArDBhxi:ArDHWKM:ArDHYaP:ArDLvLr:ArDMYwi:ArDPxdW:ArDRKBw:ArDXFeb:ArDgcWc:ArDhWUw:ArDhdWr:ArDpQsF:ArEEbfQ:ArEFhzr: +ArEFkbV:ArEGgOH:ArELGoM:ArEPYvv:ArERwOz:ArEVqnt:ArEZRzA:ArEaQjJ:ArEfZTk:ArEpkhr:ArEyAAV:ArFEjSX:ArFFpQs:ArFKEgC:ArFQGOf:ArFVglp:ArFXwoq: +ArFaBCe:ArFdEWM:ArFjKlK:ArFjXmX:ArFpHve:ArFvkHy:ArGPxho:ArGQztZ:ArGTJCc:ArGUoBl:ArGVyeu:ArGaZeE:ArGeJpt:ArGlSxq:ArGlfoy:ArGnaEb:ArGpmWl: +ArGrHsy:ArGxPuF:ArHCJsW:ArHCRIr:ArHFSty:ArHLWKP:ArHYJcL:ArHvUJG:ArHwHSV:ArHynfD:ArIDjWv:ArIDlnv:ArIHxcs:ArIJCWN:ArIPgUS:ArIRQVt:ArISRwD: +ArIZSJZ:ArIciRS:ArIiTHk:ArIoBZP:ArIpfok:ArJBLsy:ArJLTbE:ArJNEuV:ArJNxCz:ArJTAht:ArJVguZ:ArJXtNx:ArJYRWM:ArJZaGi:ArJaZeo:ArJcjqX:ArJcyMr: +ArJhdSZ:ArJjcjf:ArJokvS:ArJrWDb:ArJspKN:ArJuBzY:ArKDrL:ArKItpt:ArKJMGB:ArKMOni:ArKNrOQ:ArKPDTT:ArKUFEL:ArKeWuY:ArKkbuN:ArKnahK:ArKnvib: +ArKoSPQ:ArKohUq:ArLCxdp:ArLDKBp:ArLHzHw:ArLJjLJ:ArLKWKj:ArLKYaw:ArLOvLU:ArLQBZ:ArLQPSD:ArLYVCx:ArLaFyY:ArLcQsa:ArLfQlE:ArLhcWD:ArLkWUP: +ArLkdWU:ArLlJCY:ArLnMlW:ArLqFNI:ArLrrme:ArMAtTm:ArMBQRY:ArMDwOs:ArMLRzH:ArMNamA:ArMUCQz:ArMdQGE:ArMpIWj:ArMqEfw:ArMtQnc:ArNEhOT:ArNFoTZ: +ArNHglk:ArNIRAN:ArNMqND:ArNPrHK:ArNTaMX:ArNXpQh:ArNjZXe:ArNmbTE:ArNrHuH:ArNvcWf:ArNwEFn:ArOBtz:ArOIoXE:ArOKHwU:ArOTclo:ArOUdpC:ArOcKvJ: +ArOcNwG:ArOcelZ:ArOpuHg:ArOsXzz:ArOxDqI:ArPAYBM:ArPAqkk:ArPHZXH:ArPPaHy:ArPPbGO:ArPPksQ:ArPSHWl:ArPZpBH:ArPbtKF:ArPdXbg:ArPjxpn:ArPkHSi: +ArPqPUV:ArPuSXa:ArPufOi:ArQAAHR:ArQITBc:ArQIYez:ArQKEUp:ArQMCWa:ArQTGUv:ArQThkY:ArQWjWY:ArQWlnY:ArQcfoD:ArQhQE:ArQiptp:ArQjcdJ:ArQpNNd: +ArQyDxI:ArRGAhM:ArRKtNA:ArRMaGP:ArROYEe:ArRVbdh:ArRYNGF:ArRZQkZ:ArRnTIO:ArRpMJp:ArRtCEq:ArRtsRs:ArRuepk:ArSBNgY:ArSDVQQ:ArSDyDI:ArSFrnv: +ArSKmUL:ArSNZcG:ArSOnmt:ArSRnJs:ArSSrnO:ArShWsw:ArSkMLu:ArSrbpE:ArSxJkW:ArTAvLl:ArTCgFm:ArTEBPe:ArTGroA:ArTISRZ:ArTMSbu:ArTMtvN:ArTRoZL: +ArTXWfG:ArTZdtT:ArTdOQU:ArTetcY:ArTnfvy:ArTnxvg:ArToMKU:ArTpWSL:ArTvgrb:ArUCgLU:ArUGLhQ:ArUHaQF:ArUJevu:ArUKpDc:ArUOjTy:ArUQuwj:ArUZtRr: +ArUldcD:ArUmEQC:ArUqkEp:ArUuMNL:ArUueLP:ArVIQri:ArVKpAW:ArVKyce:ArVMLHF:ArVOeVB:ArVOsU:ArVPlri:ArVQkIA:ArVRsre:ArVVGOT:ArVcAaO:ArVkQgu: +ArVpZtr:ArVrQjF:ArWGclt:ArWHRzs:ArWQoid:ArWVztH:ArWaXBE:ArWcaEp:ArWfXza:ArWixiq:ArWkDqR:ArWuCCd:ArWvZVX:ArWyAIf:ArXFoIO:ArXJSrg:ArXJwee: +ArXLpBA:ArXOXIn:ArXXKCC:ArXfkQO:ArXkUJQ:ArXlXZj:ArXoxIz:ArXqjcx:ArXsEPb:ArXsPod:ArYCbDN:ArYVPdv:ArYWKOs:ArYgdse:ArYmhbI:ArYnZEP:ArYpjQg: +ArYpymM:ArYqCeW:ArYqsrU:ArYvklc:ArYyssa:ArZBOxI:ArZDwIg:ArZICqE:ArZIoXs:ArZMGuF:ArZMhKi:ArZNjwi:ArZNlNi:ArZRuIF:ArZgWDT:ArZlirl:ArZqVYB: +ArZsTht:ArZtZeY:ArZvjqn:ArZvyMD:AraALpc:AraCLXy:AraIelu:AraRLSm:AraiklH:ArajkkC:ArasjQL:Arasymf:AraxdsN:ArazcJr:ArbDaKZ:ArbLhlg:ArbPPDF: +ArbUNCM:ArbZLsV:ArbipKa:ArbokLs:ArbrkKx:ArbvMJF:Arbyjqw:ArcBvpF:ArcGSrW:ArcHgwi:ArcJPVU:ArcJj:ArcSxDD:ArcTqBh:ArcVERt:Arcabus:ArcbipQ: +ArceSPl:ArcehUL:ArcqFYm:ArcrgvZ:ArcsQSU:ArcxQLq:ArdFdXR:ArdKQSw:ArdMgWV:ArdUmue:ArdVbrF:ArdafvK:ArdaxvU:ArdcJvO:ArddMKg:ArdgiPn:Ardjtck: +ArdpvBS:ArdrmkB:ArdruJK:ArdssaC:ArdwFyr:ArdyQsJ:AreBwTd:AreIPAp:AreNEGt:AreOkiD:ArePpDQ:AreUhoX:AreVnRP:AreVotV:AreXgLg:AreYRaB:AreaeOA: +ArefkEB:ArejeLb:AremtfN:ArerEQq:ArezZxi:ArfFCJo:ArfQPaK:ArfTbFV:ArfVgoO:ArfeQvS:ArfiCye:ArfiPUL:ArfyHvi:ArgOWkC:ArgQYbA:ArgQqKg:ArgXZxD: +ArgnJph:ArgrtkJ:ArgtXBk:ArgxsSS:ArgzxPb:ArhCJch:ArhGoxg:ArhQiEp:ArhWYBV:ArhWqkp:ArhaHSr:ArhfPUm:Arhmaei:ArhpZEN:AriWAHy:ArifpkC:ArilSbc: +ArioDKf:ArioVyy:AripYjZ:Ariyfoo:ArjBeLe:ArjGJtr:ArjGuIT:ArjGycO:ArjJLPs:ArjNCqW:ArjNoXa:ArjQRuP:ArjYSjW:ArjbkLX:ArjcsSZ:ArjhThf:Arjicvq: +ArjiwHU:ArjkoZv:ArjkrFn:ArjwhBr:ArkBtpp:ArkLVcu:ArkMWkG:ArkMYAZ:ArkQvlx:ArkSgfy:ArkTPsI:ArkUBpq:ArkWrOU:ArkYSrN:ArkdFYT:ArkfQSl:Arkkvbu: +ArkmmKd:Arkmujm:ArkpGmT:ArkpRxW:ArkqAUj:ArktOqA:ArkutCM:ArlCFea:ArlHtPy:ArlMKBt:ArlQPve:ArlTFeA:ArlWtPY:ArldWUT:ArlddWQ:ArleJKQ:ArliEVO: +ArligVj:ArllQse:ArlwAuc:ArlzbUC:ArmCgOm:ArmURzD:ArmWamM:ArmZtTa:Armbdco:ArmoKLE:ArmoXMV:ArmpbtP:ArnGEgd:ArnHsrP:ArnOod:ArncQJf:ArnfOhc: +ArnhQjs:ArnmsMN:ArnokeR:ArnpEFr:ArnsQNf:ArnvbTY:AroVoiS:AroZwEy:ArobAXe:ArobNiV:ArolZVO:AronroG:Aropgkh:ArovkqS:ArpFWKs:ArpHYBq:ArpHqkW: +ArpJHWP:ArpcZEi:ArpgJPX:ArphAxl:ArprKVO:ArprNWB:ArqGLSs:ArqJbRC:ArqNtnR:ArqYCQy:ArqYoxO:ArqhWdH:ArqnUVV:ArqwWdh:ArrCGum:ArrChKB:ArrDRui: +ArrHTbx:ArrHYEa:ArrJEuk:ArrJxCG:ArrLCwz:ArrPAhI:ArrRgug:ArrZOxb:ArrgDXr:ArrhpTk:ArricDQ:Arrkmzc:ArrsUva:ArrwpTK:ArrxDXR:ArsCAAR:ArsCbRk: +ArsEvpt:ArsLSre:ArsOjlL:ArsRYst:ArsSYWH:ArsWZcC:ArsXVzy:ArsXnmp:ArsYQcx:ArsbJks:ArscZCW:ArscczQ:Arsjahd:ArsjviM:ArsmcwB:ArsnIHh:ArsnLAH: +ArsvAtK:ArtAKBM:ArtJmus:ArtMPSY:ArtPQSa:ArtPeN:ArtUVCe:ArtWjLw:ArtbQlX:ArtgWUM:ArtgdWH:ArtjMlJ:ArtliPx:ArtmOQQ:ArtyJCd:AruErhQ:AruJhoN: +AruMgLq:AruNRaT:AruQLhu:AruSevq:AruTkiR:ArumEfT:ArupKLj:ArupXMy:Arustfx:AruyON:ArvBglN:ArvFLHJ:ArvJrHn:ArvPuWq:ArvUycI:ArvWCqF:ArvYlre: +ArvZpdx:ArvlHum:Arvpkek:ArvsEFK:ArvtMnW:ArvtelK:ArvyOhZ:ArwAHAk:ArwDoXB:ArwEahG:ArwEbgq:ArwEkSo:ArwGAL:ArwHoiX:ArwLSRp:ArwLwEr:ArwMZxv: +ArwOOt:ArwOpbv:ArwQRzO:ArwUlQl:ArwXbFk:Arwgtkx:ArwlCCX:ArwpxiM:ArwrDqn:Arwykqx:ArxDxHz:ArxEzTO:ArxHJcv:ArxPoIc:ArxVcLs:ArxaJFp:ArxazIA: +Arxbaew:ArxfHSl:ArxigKx:ArxtCcc:ArxuXZf:ArxxxIv:ArxzDQU:Arxztv:AryAagj:AryCTBF:AryEEUU:AryExcy:AryGCWD:AryORUW:AryPDHQ:AryTakV:AryVwyr: +AryWSJP:ArybZMe:ArydDKH:ArydVyW:AryolX:AryukVp:Aryypkm:ArzAbrs:ArzEtNb:ArzGaGs:ArzQHRw:ArzRbdK:ArzTNGE:ArzUDhh:ArzVQky:ArzaBzc:ArzdfOX: +ArzeUvf:ArzlhBL:ArzoepH:ArzpCER:ArzpsRP:AsAKxxE:AsAUCwG:AsAUebE:AsAVzYs:AsAbWDW:AsAcNiR:AsAfABG:AsAjHYv:AsAzqin:AsBDGIy:AsBEWVn:AsBGelB: +AsBPAXb:AsBaSmp:AsBibiB:AsBllMR:AsCAzOl:AsCMhZG:AsCQUTh:AsCYSxT:AsCdEpV:AsCdkNT:AsCgYEy:AsCjBOH:AsClsfH:AsCszKg:AsCtHYk:AsCtiNi:AsDGkVU: +AsDKYzk:AsDLClu:AsDjvXg:AsDqYxz:AsDyzkn:AsEACMN:AsEBbn:AsEBkDo:AsEEkcD:AsEFbqU:AsEFdTB:AsEJPir:AsEJyGO:AsEeXPE:AsEfOVD:AsEfbpn:AsEptHq: +AsEwiFq:AsEyHBh:AsEylJZ:AsFBhMM:AsFCscu:AsFGCmG:AsFHkdf:AsFIMli:AsFIxyY:AsFRowH:AsFTNvY:AsFricy:AsFuKCL:AsFvphG:AsGBdVc:AsGNOBE:AsGXbOz: +AsGaeuf:AsGfsou:AsGhBnj:AsGkQob:AsGnrPU:AsHDEXJ:AsHFFyV:AsHHdvl:AsHIelO:AsHQIce:AsHTObJ:AsHWiyt:AsHbzJc:AsHduED:AsHlGw:AsHlsOz:AsHqQOm: +AsHtrpZ:AsHuYbS:AsHwKGD:AsHwvAY:AsIBGdt:AsIDubM:AsIGZkM:AsIHRCA:AsIITni:AsILMxm:AsILfaS:AsIRhEB:AsIZktt:AsIbyVV:AsIeWDl:AsIluFp:AsIpIUe: +AsIveVL:AsIvexV:AsIvuYt:AsJCAXK:AsJFuNM:AsJGGIP:AsJOzyC:AsJPxWy:AsJQqJm:AsJRMrB:AsJUJRs:AsJUtmX:AsJXheI:AsJYelK:AsJjqmB:AsJliUc:AsJmafT: +AsJwNxI:AsJyuYK:AsKAcDT:AsKJsJR:AsKRpxv:AsKagqU:AsKalMo:AsKbDDl:AsKblRp:AsKkORP:AsKnYXT:AsKuvxI:AsLBSXd:AsLBmyP:AsLJUtX:AsLOsje:AsLPsjE: +AsLYkVL:AsLanJO:AsLhlrg:AsLkinY:AsLlzkW:AsLqBox:AsLssFx:AsLxMUl:AsMAutU:AsMBqN:AsMIbyX:AsMJObw:AsMSwQr:AsMaZim:AsMakFh:AsMazuL:AsMemLE: +AsMflla:AsMhsVe:AsMiCmv:AsMmNke:AsMmoJq:AsMrdSe:AsMuwdC:AsMwEBt:AsMwIQo:AsMxDVz:AsMxxJz:AsNCfYo:AsNEhMT:AsNIuTn:AsNLlIe:AsNObQE:AsNOdtR: +AsNPOBL:AsNQbYc:AsNRJKH:AsNSPIb:AsNTWAr:AsNWCQA:AsNZDVr:AsNcxfy:AsNecjs:AsNhKCU:AsNiZIV:AsNicy:AsNikfS:AsNizUw:AsNoOvT:AsNqCMM:AsNuojJ: +AsOAOBl:AsODboV:AsOEdVJ:AsOJkuc:AsONPU:AsOTilv:AsOZJwt:AsOkBnC:AsOleKj:AsOmloR:AsOoQNm:AsOoiVl:AsPGObu:AsPHiyK:AsPKdvS:AsPVyPS:AsPWEXu: +AsPXJRd:AsPXpQd:AsPYFyi:AsPgrpe:AsPivAF:AsPosOE:AsPsoVD:AsPtNXk:AsPublG:AsPvbxC:AsPviyw:AsPxtnM:AsQCGOd:AsQCiQN:AsQMUWT:AsQUhEk:AsQXZkd: +AsQZsws:AsQassO:AsQeuyI:AsQmQoo:AsQrVLu:AsQsIUL:AsQsOZR:AsQvDPG:AsRARcQ:AsRDqJv:AsREfAC:AsRIXZN:AsRKGDd:AsRSUwm:AsRSkTd:AsRameJ:AsRdwjM: +AsRkyvF:AsRoeXF:AsRouyd:AsRpeXf:AsRpuyD:AsRqLqp:AsSBhZi:AsSFzOB:AsSOqia:AsSQSyx:AsSVAWU:AsSXIVm:AsSYoGu:AsSZbNR:AsSahDw:AsSeMaa:AsSjWYO: +AsSlYEW:AsSsqKE:AsSvTOs:AsTLkVk:AsTPYzU:AsTWhzP:AsTbMw:AsTbulh:AsTeIGF:AsTghdn:AsTnEPA:AsTnknC:AsTqYen:AsTtOzv:AsTwjW:AsUFDvp:AsUSUNf: +AsUYkEC:AsUZkcV:AsUliFc:AsUxqhM:AsUyllx:AsVAFhO:AsVDJKC:AsVELrn:AsVLDVy:AsVMnjp:AsVMwqB:AsVSOBg:AsVWWAY:AsVcwbH:AsVeHbS:AsVelja:AsVgick: +AsVkdsu:AsVninR:AsVpbPU:AsVqsvu:AsVzthJ:AsWAHxi:AsWBsQV:AsWCypq:AsWDJrf:AsWDpqf:AsWGeLR:AsWImIY:AsWLJwo:AsWMbOH:AsWPOtJ:AsWUQTI:AsWUdPe: +AsWUlPS:AsWWilM:AsWaNxI:AsWclZy:AsWetNo:AsWexF:AsWpMfe:AsXBKxg:AsXBSS:AsXDoGx:AsXDrtk:AsXEADp:AsXFbKg:AsXPGAb:AsXPtso:AsXPzMM:AsXXsum: +AsXZQtb:AsXZdpN:AsXZlpx:AsXdlOb:AsXdxhO:AsXeekZ:AsXfEsY:AsXvMFn:AsYFXzh:AsYNRCw:AsYOqjP:AsYRfae:AsYUWvZ:AsYVFTU:AsYWeLv:AsYeIUs:AsYeOZm: +AsYnuvV:AsYowJk:AsYqSMD:AsYquLI:AsYybIv:AsYzWDz:AsZFUwD:AsZFkTM:AsZLGot:AsZMuzo:AsZQZKt:AsZRsIn:AsZSTNP:AsZVxWK:AsZnuYY:AsZrafF:AsaAOtm: +AsaArfk:AsaCnHa:AsaHGiD:AsaNwAT:AsaWGid:Asaavtq:AsadSMm:AsagVLc:AsaiHTG:AsakDPQ:AsaolmO:AsaxhVr:AsbARkX:AsbCCWz:AsbCeBx:AsbEzyn:AsbFTNo: +AsbSwam:AsbZxXX:AsbbNIO:AsbiqIs:AsbuAbZ:AsbyHyk:AscDqiS:AscEMgA:AscEwyW:AscFHlk:AscHpxm:AscPSxF:AscRSxh:AscWNMP:AscZUTT:AscaZU:AscdYXO: +AsceFbu:AscqnjC:AscxDDw:AscxlRk:AsdBIvF:AsdDbny:AsdFldD:AsdIMLx:AsdLhzB:AsdPzoi:AsdUCly:AsdXSXQ:AsdXmye:AsdcJAu:AsdiOzd:AsdquMb:AsduWyD: +AsdynJz:AseJIEK:AseKkDs:AseLxYL:AseNTgg:AseSfyc:AseUhmX:AseYutb:AseaiFM:AsesxFu:AsexKcY:AseyZiZ:AsfDkCA:AsfEbQP:AsfEdtG:AsfFaZE:AsfIPIw: +AsfIygJ:AsfPCmK:AsfQkdj:AsfYfYz:AsfZzA:AsfdSpy:AsfeOvA:AsfebPk:Asfvift:AsfxHbm:AsgBAdU:AsgGDvd:AsgNyYB:AsgWOBy:AsgXiYG:AsgaBVM:AsgeQNx: +AsgeiVy:AsgkyfO:AsgocNK:AsgwrPi:AsgyKgW:AsgyvaJ:AshEGAp:AshJADb:AshMEXN:AshVyyu:AshWboq:AshegmT:AshgBvz:AshkzJg:AshpeUm:AshzQOi:AsiEAxd: +AsiFxxZ:AsiIFTg:AsiJWvh:AsiLeLD:AsiQRCE:AsiTqjb:AsiUMxi:AsiUfaW:AsiYHPi:AsiYXzZ:AsibABx:AsicOdp:AsimYTr:AsipiuL:AsitwJY:AsiuuFt:AsjEwad: +AsjGwCv:AsjLxXQ:AsjUsIX:AsjVZKB:AsjXTNf:AsjayvY:AsjdWdc:AsjlHyB:AsjsYty:AsjuiUg:AsjxuVO:Asjywjr:AskDSxW:AskDmYc:AskLUTk:AskSsJV:AskXHlT: +AskcbRD:AskdBOk:Askfsfk:AsknHYH:AskniNJ:AskozKD:AslCkVp:AslISXV:AslSUtD:AslYsjY:AsluzkK:AslzfOB:AslzvBl:AsmAkcc:AsmCazg:AsmIUNs:AsmNkEv: +AsmOQSL:AsmQFHS:AsmULRr:AsmdDtY:AsmexFn:AsmpEBx:AsmpIQc:AsmswBT:AsmuHBO:AsmwiCw:AsnCCmb:AsnGkCh:AsnPuTR:AsnZNCj:AsngSpP:AsngXpi:AsnhCMq: +AsnlNKb:Asnlojv:AsnmMLI:AsnpZIj:Asnpkfo:AsnpzUK:AsnqKCi:AsntmlB:AsnvEbs:AsnvIqh:AsnzyUv:AsoUAdL:AsofQog:AsojYBY:AsoueKf:AspCbOS:AspDdvO: +AspIkUf:AspKIcF:AspPObi:AspjBNF:AsplQOn:AspoYbp:AsqDRCl:AsqFrfY:AsqGMRD:AsqIJrU:AsqKunK:AsqNhEo:AsqVUWP:AsqVktY:AsqduvM:Asqgqix:AsqjdHs: +AsqkNXo:AsqvQok:AsrBGoY:AsrBiqs:AsrHsIC:AsrLxWf:AsrQJRl:AsrQtmG:AsrSuNr:AsrTheV:AsrduYt:AsrgWdx:AsroqIA:AsrrIuq:AsrrOzo:AsrsNxV:AsryeXb: +Asryevx:AssGmYJ:AssOzOF:AssRCLV:AssVMlW:AsseuLu:AssgBOB:Assoumm:AssrWsB:Asswnju:AstAhzt:AstMSXg:AstMmyS:AstPSYe:AstmOrd:AstrqkX:AsuAnYB: +AsuODvL:AsuUObr:AsuVYzb:AsuWJkv:AsuXoWo:AsuYWaL:AsubciQ:AsuioJT:AsulIkJ:AsundCg:AsunjbF:Asuqwdf:AsurIlI:AsusEBQ:AsusIQJ:AsuxhTH:AsvGkef: +AsvUDVu:AsvYegR:AsvZFhC:AsvdKCr:AsviGKe:Asvjsvy:Asvkiff:Asvtdsy:AswGfdf:AswHogO:AswKsQJ:AswLDvv:AswMJrz:AswMpqz:AswObFC:AswVfrz:AswYXUi: +AswheKM:AswibLy:AswjESn:AswjbBW:AswkiYi:AsxFelU:AsxKSGf:AsxLboO:AsxMoGt:AsxMrtg:AsxObKk:AsxPHXn:AsxQDVM:AsxRyPv:AsxViLJ:AsxYbA:AsxaYbi: +AsxcvAc:AsxoEsU:Asxobbl:AsxpNXN:Asxttnh:AsyIanR:AsyQRKT:AsySCwv:AsySebt:AsyUzYb:AsyVTnc:AsyfBSA:AsyfLQJ:Asymyt:AsyrNiC:AsyvmEp:AszAMXP: +AszAfAn:AszEHpP:AszEXZc:AszIuBp:AszOkTI:AszTWVQ:AszYvA:AszdIux:AszdOzf:Aszgyvk:AtAKnTs:AtAMuMW:AtAUIDn:AtAUYda:AtAUkdw:AtAUsak:AtAkmlc: +AtAoIWv:AtApfq:AtApqDs:AtArEdz:AtAubVW:AtAumYH:AtAzQRT:AtBAheb:AtBEHFz:AtBhCfH:AtBhiAV:AtBjBkO:AtBqGHZ:AtBrXEJ:AtBvZrO:AtCBYBb:AtCCZkK: +AtCVnzE:AtClkzf:AtCrSOm:AtDDctf:AtDDjDG:AtDGQx:AtDJUPW:AtDLyCD:AtDQUMV:AtDSaBN:AtDlLsr:AtDljDo:AtDnHmn:AtDqZLO:AtDqzPn:AtDuMuF:AtDvLUb: +AtDxSof:AtDycTu:AtEAGBY:AtEHqbG:AtEODOB:AtEPMPj:AtEXhaZ:AtEcCWV:AtEgqvc:AtElVxw:AtEvOou:AtExnaz:AtEzLCJ:AtFAeAm:AtFLizB:AtFNqBN:AtFTBVW: +AtFUDoK:AtFZKLb:AtFmqVj:AtFwjgO:AtGDtwH:AtGGomS:AtGIFxr:AtGIVDp:AtGImaL:AtGMhIL:AtGNUCw:AtGWKmU:AtGZTTr:AtGZjkY:AtGayMW:AtGeUoA:AtGjJel: +AtGoYOw:AtGqdIo:AtGsEW:AtGtbJj:AtGtlHa:AtGwqvg:AtGznGt:AtHBwOD:AtHCfmK:AtHDEuh:AtHGvYl:AtHLQSN:AtHMXNZ:AtHNmkA:AtHSIhO:AtHSgve:AtHlWsu: +AtHpJEe:AtHqSJN:AtHqjW:AtHugDc:AtHwQta:AtIFSSS:AtIJQpI:AtILhuq:AtINPaw:AtIScUZ:AtITyCD:AtIcqDj:AtIeEdc:AtIfUUy:AtIpmxI:AtIswjN:AtIwnsL: +AtIzMos:AtJFumG:AtJLSsZ:AtJRHch:AtJUzYE:AtJVZvC:AtJblgJ:AtJhIwf:AtJiqdc:AtJkEDj:AtJnFVa:AtJyCFr:AtKHnzL:AtKJwxH:AtKPNSa:AtKPWHS:AtKRPgc: +AtKVgbI:AtKcBiD:AtKcoOn:AtKdiHN:AtKexGr:AtKhYlP:AtKjtUX:AtKltDT:AtKmirN:AtKoDZc:AtKsCpU:AtKszde:AtKxMLj:AtKyqbg:AtKzOSP:AtKznrD:AtKzvBd: +AtLFaBU:AtLNjRK:AtLReYG:AtLVdOq:AtLYefp:AtLbxGd:AtLdZLT:AtLdzPu:AtLekZv:AtLnYLi:AtLxIwZ:AtLzgRa:AtMFkAt:AtMGqH:AtMIRMX:AtMJBrt:AtMMdor: +AtMPDje:AtMVjnw:AtMZxLm:AtMbgya:AtMiERI:AtMkeJj:AtNDwEG:AtNFXGu:AtNHREC:AtNHrbV:AtNQhAj:AtNRShU:AtNSYIr:AtNTPHe:AtNTjKe:AtNWEuQ:AtNYMpZ: +AtNqnAJ:AtNsLcz:AtNuTwl:AtNwKek:AtOAEUN:AtOBrRP:AtOJAwV:AtORLYf:AtOTzrc:AtOWtwg:AtOZNQp:AtOgbJE:AtOglHN:AtOmDQp:AtOnvUr:AtPBmkx:AtPDSEi: +AtPFTek:AtPPKME:AtPPOdL:AtPPunL:AtPVxCo:AtPghmI:AtPinPx:AtPlEAg:AtPuilt:AtPuocj:AtQAKoQ:AtQJmup:AtQNoFF:AtQSiON:AtQUBWq:AtQWYMw:AtQWayt: +AtQXTXH:AtQcKWy:AtQfwje:AtQjoCl:AtQlLy:AtQlMox:AtQoLTe:AtQqgfl:AtQysWl:AtRPmUk:AtRgUTQ:AtRgfbY:AtRoNSI:AtRumLJ:AtRxtvk:AtSDPgd:AtSLONL: +AtSUYBL:AtSbDZD:AtScIWD:AtSdmCx:AtSfiuj:AtSmxgz:AtSoZlJ:AtSozpk:AtStQqr:AtSwctp:AtTAyCV:AtTDeYN:AtTLBHo:AtTLDmx:AtTPpPH:AtTVUMD:AtTadMd: +AtTbFjK:AtTbqBw:AtThDzs:AtTjmcO:AtTkIws:AtTlBIT:AtTnxgb:AtTuxGM:AtUCXgW:AtUEMPX:AtUFTJe:AtUFZtG:AtUFgxh:AtULxLt:AtUNSLg:AtUPCCy:AtUTGBk: +AtUVFVD:AtUVOYc:AtUVeBf:AtUYFkg:AtUdLIc:AtUfGTL:AtUhbOb:AtUjIQy:AtUoHjJ:AtUqqBX:AtUvCWd:AtVCBRD:AtVDdOB:AtVIBVe:AtVNFKN:AtVOkaD:AtVSoMb: +AtVYIUE:AtVaLVA:AtVaXql:AtVjLij:AtVlGtE:AtVnbok:AtVpIqp:AtVwqbQ:AtWErRI:AtWGcnk:AtWHzrZ:AtWJSnM:AtWLomE:AtWQUwQ:AtWRgpL:AtWZRbU:AtWbvUK: +AtWfdIy:AtWmQpb:AtWonGb:AtWpUFP:AtWqnAu:AtWyLtG:AtXCAWF:AtXHQg:AtXMzRs:AtXQoMl:AtXXgPE:AtXeJEs:AtXfSJX:AtXqVMp:AtXtUua:AtXtstl:AtXvUfY: +AtXwvub:AtXyhmF:AtYAnTX:AtYFiOw:AtYUHff:AtYctVI:AtYfjxd:AtYxCFT:AtYxiaJ:AtYzBKS:AtZJanF:AtZKQc:AtZLjE:AtZPYmG:AtZPaYD:AtZTQPR:AtZVhUj: +AtZWhew:AtZXPAl:AtZcyan:AtZkeq:AtZkjXM:AtZmfT:AtZtyaN:AtZyUTZ:AtZyfbR:AtaAyZk:AtaDPaj:AtaGGeQ:AtaIcUG:AtaLsaA:AtaNIDj:AtaNYde:AtaNkds: +AtaNsao:AtaVuMS:AtadGhi:AtadLTS:AtagVaU:AtahKWO:AtaheiM:AtaiwjS:AtamnsQ:AtanoKl:AtaxIWr:AtayqDw:AtbABwX:AtbIyzT:AtbJntH:AtbJrH:AtbLZvh: +AtbOGEn:AtbTIdU:AtbTYDZ:AtbTkDL:AtbTsAP:AtbjmLX:AtblUTC:AtblfbK:AtboVAj:AtbqCfD:AtbqiAZ:AtbsBkC:Atbtbvl:Atbtmys:AtcBLYX:AtcCSZC:AtcGcTq: +AtcGjdP:AtcMfer:AtcNdbm:AtcVabY:AtcjXSN:AtcjdON:Atclctb:Atcrxgh:AtctZlX:Atctzpy:Atcukzz:AtdAYbe:AtdBZKL:AtdHLyC:AtdOmuD:AtdSACd:AtdYuwp: +AtdccTY:AtdgnRJ:Atdgvbj:Atdipe:AtdtdMZ:AteKFVj:AteKJFN:AteKOYM:AteKeBH:AteMKlW:AteNgMI:AteOiZw:AteTrdW:AteTweK:AteVXgy:AteXReO:AteXrBZ: +AteZKMs:Ateildj:AtfCFKP:AtfKpz:AtfLayj:AtfNDoG:AtfbCwS:AtfeOOp:AtfgBus:AtfiLcO:AtfjYOC:AtflELb:AtfvqVf:AtgEfMf:AtgFUwc:AtgIvyA:AtgLSpr: +AtgPXnW:AtgRmKl:Atgcbu:AtgjQTl:AtglIlM:AtgoVmk:AtguHOH:Atgynpl:AthDWZU:AthLhiA:AthLxCr:AthTZgP:AthTrzm:AthWmkE:AthXmAA:AthYjKT:AthZSEt: +AthfWDg:AthnYoz:Athpdib:AthtUOL:AthwQPy:Athyngy:AthzDqr:AtiGnTn:AtiOSSW:AtiXzyH:AtikIWk:AtilqDn:AtinEdg:AtiqbVJ:AtiqmYU:AtiulGG:AtivQRI: +AtiymxM:AtjByci:AtjEsAQ:AtjIQPD:AtjMPAz:AtjOumC:AtjWIdz:AtjWYDu:AtjWkDc:AtjcCFV:Atjrqdg:AtjtEDn:AtjuUut:AtjvnSA:AtjwbvC:AtkEuWr:AtkMfQR: +AtkQycJ:AtkTeyR:AtkcmuC:AtkePye:AtkhDrU:AtkjQqY:AtkkLul:AtklCpY:Atklzdi:AtkmgrT:Atkqdmx:AtkrFJW:Atkrqbk:AtkvirB:AtkxDZo:AtkzmCS:AtlEZKg: +AtlOaBi:AtlQLPZ:AtlUgBL:AtlbBIA:Atlbook:Atldxgw:AtlqMua:AtlrCPP:AtlxqBb:AtlyOsU:AtlynRA:Atlyvba:AtmAgMR:AtmGrdL:AtmGweP:AtmSBrx:AtmVYie: +AtmXPhR:AtmXjkR:AtmYBvY:AtmqXQP:AtmvBAu:AtnEkas:AtnGgmY:AtnHizg:AtnJqBk:AtnMrDG:AtnagYf:AtnrlDz:AtnxErN:AtnyBuz:Atnzejm:AtoGwoN:AtoJUCT: +AtoSAwZ:AtocsTP:AtoenGw:AtokBPb:AtouJeo:AtovSjD:AtpESPb:AtpHQSS:AtpIXNG:AtpOwOy:AtpYKMA:AtpYOdH:AtpYunH:AtpcymC:AtpiWsH:AtplDqK:AtpuEAc: +AtpuEoy:Atpvlhu:AtqLGeC:AtqNcUU:AtqWHCn:AtqZaNr:AtqaEdL:AtqbFvG:AtqlVaG:Atqowja:AtqpBKn:AtqrsWh:Atqsnsc:Atqzgfh:AtrPKON:AtrQzYx:AtrgEDW: +AtrnLtz:AtrrKwf:AtrreId:Atrxsws:AtsBnzo:AtsFchx:AtsJNSB:AtsJWHp:AtsVnOy:AtsZybo:AtsaxGQ:AtsbYls:AtscMLi:AtsftDw:Atsiirm:AtsoCpv:AtsozdF: +AtstIZY:AtsuFJx:AtsuqbD:AttBaBp:AttGUPi:AttJnZP:AttRWhO:AttTefu:AttVfqB:AttZlkc:AttaDRE:AttcQQI:AttdMux:AtteiUQ:AttfihR:AttjYLL:AttltuD: +AttncK:AttntdH:AttoiRR:AttsmcC:AttuCPI:AttuzDy:AttxUWc:AtuBkAQ:AtuFBrQ:AtuKEUo:AtuMrBH:AtuPTJY:AtuPgxT:AtuUomW:AtuYCCe:AtuZDIx:AtuZLIN: +AtuZqMT:AtudLvT:AtudXQy:AtueZsc:AtufeJo:AtuqVoy:AtusIQe:AtuxHjV:AtuzhPJ:AtvBXGR:AtvFKmX:AtvLhAm:AtvNShr:AtvRDJY:AtvUFvA:AtvUJfe:AtvUOyf: +AtvUebc:AtvXFKb:Atvcjgq:AtvjOOB:AtvkIoS:AtvkqwR:AtvlBuA:AtvmYOq:AtvuCwa:AtwFAws:AtwNLYC:AtwSQsM:AtwVNQU:AtwWTTx:AtwWjkS:AtwYIHl:AtwYgVF: +AtwcqvM:AtwgDQU:AtwjHOf:AtwlhMs:AtwnnpB:AtwtVmE:AtxDrrL:AtxLAWJ:AtxPUWT:AtxVcNn:AtxavuN:Atxchmj:Atxhbjy:Atxhlhr:Atxnngg:AtxoDql:Atxpnap: +AtyBsaj:AtyJhEz:AtyMaNK:AtyQBWL:AtySYMJ:AtySayI:AtydsWq:AtykGhb:AtykLTX:Atylgfq:AtymtVm:AtytNsO:AtyzmlL:AtzBZvu:AtzGcue:AtzPhes:AtzUioz: +AtzWBwE:Atzcfbv:AtzfCfy:AtzfiAg:AtzkNSf:AtzrtvD:AtzsgFX:AtzujXi:AuAArem:AuACQKk:AuAGgcZ:AuAHgTv:AuANGlu:AuAPbeW:AuASYFF:AuAWSPy:AuAWjjN: +AuAXdwt:AuAZGfJ:AuAamqI:AuAayvs:AuAbDoL:AuAgNgc:AuAlXIY:AuAtyJk:AuBBKWs:AuBGrEd:AuBHgSy:AuBNbJM:AuBORfS:AuBOioV:AuBRzGv:AuBaGQQ:AuBcVTs: +AuBgCTf:AuBkXvR:AuBqcaA:AuBuLhI:AuBwDOe:AuByJlE:AuByylS:AuBzbJw:AuCCXQH:AuCFLHE:AuCWovQ:AuCXIYR:AuCbySq:AuCcFJf:AuCeiKr:AuCejas:AuCfOcr: +AuCfPRz:AuChMds:AuCnNOc:AuCsVLX:AuCvshJ:AuCxrtF:AuDEYfB:AuDLLhN:AuDMDzF:AuDQPlW:AuDReyG:AuDSYjm:AuDSeWy:AuDTIdh:AuDVXkl:AuDgvns:AuDiFjm: +AuDjikY:AuDjjAX:AuDlOCy:AuDlPrq:AuDmTeJ:AuDxtZL:AuECBzB:AuEJGfH:AuETXSr:AuETurA:AuEXryG:AuEayrD:AuEgfuf:AuEnoDH:AuEriML:AuEsEkA:AuEtsKz: +AuEvHWr:AuEyFgn:AuFBONE:AuFPGFG:AuFZuRN:AuFcuqu:AuFmttV:AuFnFGA:AuFnxbs:AuFpaME:AuFrJdS:AuFtodG:AuFxFtx:AuFyEKN:AuGCjmQ:AuGDNSw:AuGJxfs: +AuGLYzB:AuGTAJR:AuGYzUl:AuGZTYS:AuGauel:AuGiFud:AuGjVSJ:AuGmYxu:AuGtrgD:AuGyqJB:AuHBoAn:AuHJAgX:AuHQhAz:AuHSluV:AuHXEEy:AuHZAjY:AuHaKwP: +AuHeKI:AuHeutf:AuHguEg:AuHmlGo:AuHoFUo:AuHrBmi:AuHxhSX:AuICJsa:AuIDAlZ:AuIFRLh:AuIHhQ:AuIIjjI:AuILGfM:AuIOsGs:AuIQqwf:AuIRfhV:AuITJsA: +AuIVvuu:AuIavpb:AuIcDbw:AuIdrKq:AuIdtIT:AuIftaw:AuIpHhk:AuIqawt:AuIrLHg:AuIubjY:AuIvJLk:AuJAGwx:AuJGLVg:AuJQSpI:AuJWGLe:AuJYqWQ:AuJaKUS: +AuJclKR:AuJcxsA:AuJdcaX:AuJivPU:AuJjrkF:AuJjtic:AuJmNBH:AuJotwL:AuJuquJ:AuJyTkJ:AuJyaWC:AuKIExz:AuKKUJJ:AuKOeYe:AuKQwQk:AuKSXKN:AuKZBCG: +AuKZFrk:AuKblla:AuKcpCW:AuKhEJ:AuKmnrC:AuKnrur:AuKzolH:AuLLYdo:AuLNoVa:AuLVdBD:AuLcBsu:AuLleVg:AuLosHz:AuLseTQ:AuLspCT:AuLtrUk:AuLwNoS: +AuLyvnh:AuMBjyP:AuMGurh:AuMIAh:AuMJSjZ:AuMMGfa:AuMRHRG:AuMSuYB:AuMdiME:AuMeEkH:AuMgsKS:AuMjfAv:AuMnEsl:AuMsYxg:AuMsnYw:AuMyfuo:AuNEeLM: +AuNJjYi:AuNMXsb:AuNMuRQ:AuNRSJc:AuNSGFX:AuNbxbL:AuNgodX:AuNhodx:AuNkFtg:AuNmskj:AuNpcqB:AuNqAFR:AuNsaMZ:AuNvESU:AuNzyRT:AuOBItI:AuOGaEL: +AuOMIvW:AuOQDWb:AuObwKA:AuOhsVf:AuOigBb:AuOokkI:AuOpkki:AuOrUbt:AuOvSon:AuOwsVF:AuPAhnU:AuPBpOC:AuPDhAA:AuPFFUM:AuPFHYJ:AuPGITp:AuPSIVN: +AuPXYRq:AuPnVid:AuPohuM:AuPqzgD:AuPukKP:AuPwUBM:AuPwrx:AuPxUBm:AuQHYFh:AuQLgct:AuQQLvY:AuQSyDV:AuQVAWN:AuQXGO:AuQXQKE:AuQZLRO:AuQZtXm: +AuQeoKg:AuQlNgM:AuQzNDo:AuRBdWC:AuRIsgC:AuRRgtA:AuRTRfM:AuRTioH:AuRjeau:AuRmrka:AuRmtiD:AuRotAg:AuRvBzh:AuRvXin:AuSAcXB:AuSHXbx:AuSIlTy: +AuSLFrl:AuSNakb:AuSRnrR:AuScaOS:AuSmolo:AuSqruU:AuSrbHX:AuStSGH:AuSvtzI:AuSzzaR:AuTBAJZ:AuTHdBM:AuTJGCH:AuTNltN:AuTSBcw:AuTVcxu:AuTfyOl: +AuTiYlO:AuTklLQ:AuTsoLx:AuTwrUB:AuTxNoz:AuUBelo:AuUFuYY:AuUHBzP:AuUIcxO:AuUKcVF:AuULyuX:AuUMryU:AuUPFWe:AuUPPOa:AuUPTCg:AuURVUv:AuUWuRF: +AuUYWSG:AuUaGZK:AuUbgyr:AuUcelD:AuUfyrV:AuUlDAx:AuUnFGf:AuUsNVR:AuUuKNg:AuVGSqk:AuVbYbM:AuVcKnO:AuVcueC:AuVdFeV:AuVeaMS:AuVgJdE:AuVsfaf: +AuVwgYY:AuVxuqc:AuVyNvY:AuWCYrW:AuWIKHU:AuWLJrC:AuWOhag:AuWQFuk:AuWQHyl:AuWXjmg:AuWcPan:AuWdUbk:AuWkItb:AuWkQJx:AuWkVGK:AuWmZjc:AuWnqJt: +AuWrYxC:AuWsQbY:AuXBRJL:AuXDFmQ:AuXDxIT:AuXFIVg:AuXJDwR:AuXMGHN:AuXOKhZ:AuXXlud:AuXiPAa:AuXkGqW:AuXqITm:AuXqQjw:AuXqVgD:AuXriGb:AuXwYXl: +AuYARFo:AuYAiOj:AuYGfhD:AuYKvug:AuYMLRT:AuYMtXv:AuYOHQs:AuYRKwO:AuYXgsE:AuYYreX:AuYcBZJ:AuYcXIL:AuYeHhy:AuYgvpP:AuYhyME:AuYlNDT:AuYpbVt: +AuYupzU:AuYzDm:AuZBKaw:AuZCerZ:AuZDbJz:AuZHzGA:AuZJkHV:AuZXKWD:AuZZLVI:AuZmzBq:AuZxIHl:AuZzHHR:AuaEKwf:AuaGkht:AuaHfhm:AuaJKaX:AuaQGWt: +AuaWLvk:AuabWdk:AuakyMl:AualJLP:AualyLF:AuasxSM:AuatcAT:AuayvpY:AuazrKJ:AuaztIo:AubBQkn:AubDLrd:AubDtxF:AubFHqC:AubMkHm:AubRYfC:AubUKaL: +AubWbJA:AubaDOI:AubeNdd:AubhWDr:AubkIHW:AubqCTJ:AubvNGf:AucEJvh:AucEeYp:AucJXQt:AucOLHy:AucRKWR:AucWDX:AucavYd:AuciSGz:AucliKN:AucljaO: +Aucnofb:AucoOcN:AucoPRF:AucsBSy:AuczSB:AudGIyU:AudRXqO:AudULhB:AudWsh:AudZKwi:AudesHM:AudkQXb:AudmNod:Audqysv:AudrFja:AudsJlD:AudsPgQ: +Audtiku:AudtjAt:AuduOCu:AudvoFY:AueIuYw:AueNcxa:AueUelA:AueZjye:AueagUw:AuecNcf:AuecNxT:AueizLD:AueocQn:AuerFgr:AuewoDT:AuexoDt:AufAOYS: +AufIDr:AufRBZI:AufWrYL:AufdGVg:AufffUm:AufiNCq:AufiNXC:AuflgYk:AufpyRO:AufuHwy:AufxFGe:AufxxbW:AugBInP:AugCzUH:AugDoaA:AugHPsS:AugMjmu: +AugRpow:AugTbFo:AugThau:AugUYzF:AugVFuy:AugWJad:AugcXyq:AugdBZt:AugsNeW:AuhKoAj:AuhLyJW:AuhXzuc:AuhcYpT:AuhgiGt:AuhhFUk:AuhiVsE:AuhpuEc: +AuhxqjM:AuiBKHs:AuiCgcy:AuiEHjQ:AuiFUtm:AuiJbet:AuiMgss:AuiRdwW:AuiYsGW:AuinyJH:AuizeAa:AujBJSj:AujCrEA:AujEQkG:AujGZTO:AujHGwD:AujKRfv: +AujKios:AujNsgx:AujPqWm:AujXSpu:AujXjJB:AujafER:AujcmQe:AujdNBt:AujfXvW:AujhKUo:AujjlKn:Aujmcad:AujpTkv:AujqLhl:AujtbJR:Aujuylv:Aujvtwp: +AukADZh:AukIUYn:AukbTED:AukiNqx:AukxyoP:AukyYLs:AulGDza:AulHLhi:AulILrN:AulKPlp:AulMYjJ:AulNJVx:AulOUyg:AulPuWX:AulPwqn:AulRXkK:AulZUjO: +AulalLd:AulbpcR:AuldFjj:AuleJlO:AulePgZ:AulgTem:AulhoFR:AullnRF:AumFGfm:AumGOnO:AumPXSW:AumPurd:AumWSQw:AumcFEj:AumdFgk:AumdxBY:AumiKQR: +Aumimjy:AummFTr:AumnEkD:AumrYBQ:AumsKNS:AumtFEJ:AumuamO:AumwJDY:AunAHrB:AunLGFd:AunQjYU:AunVuRm:AunenxZ:Aunifas:AunkyKo:AunmESi:AunseBi: +AuntEKM:AunvskV:AunxfUj:AunyKnZ:AunyueV:AuoBJrx:AuoCUjk:AuoRRjx:AuoTFMe:AuoURIf:AuoUicY:AuoVIvS:AuoZDWf:AuobhUP:AuodqJO:AuojehA:AuooFpU: +AuopVIY:Auoykkm:AupBMBL:AupFaeQ:AupNJAT:AupOFUI:AupOHYN:AupXRJa:AupZxIy:AupautY:AupcuEX:AupilGP:AupjWcf:AupkFUP:AupmFok:AupuSOs:AupzZJa: +AuqNqIj:AuqRKAc:AuqSeRN:AuqTbjn:AuqXzgU:AuqZkhB:AuqaNbR:AuqbUoX:AuqctWV:AuqdeTE:AuqhFtp:AuqiqUP:AuqjLbJ:AuqpXVh:Auqqbjt:Auqzpzj:AurBsgG: +AurDbED:AurFALN:AurGcHt:AurJZo:AurKSpj:AurLdWg:AurNGFY:AurRAbM:AurSqWr:AurVqiS:AurXcHT:AurYZTp:Aurfrke:AurhtAc:Auroqui:AurqlQS:AursTki: +AurwbJM:AurxXvQ:AusAYDu:AusNNKC:AusUBCD:AusUFrh:AusZcXF:AusertL:AusfvYr:AusibeA:AusjruQ:AusuoBn:Ausvolk:AusxetK:AusxpcN:AutHjJo:AutJoVD: +AutKAJV:AutLIyg:AutMaKy:AutQnRI:AutTGCd:AutWltB:AutXltb:AutbTag:AutbaoH:AutetZR:AutheVB:AutizAI:AutjeLG:AutkvyM:AutprUN:AutqbhC:AutsSgS: +AuuEuOB:AuuGBqY:AuubqUk:AuueKNX:AuueuET:AuuiJDR:AuujZaB:AuumTXR:AuuncmM:AuunzLv:AuuswtP:AuvAeLh:AuvDjYL:AuvIXsG:AuvIuRt:AuvJcvA:AuvLrYR: +AuvXcXH:AuvagYu:AuvbKqB:AuvbmJi:AuvfimY:AuvgEKT:AuvhquP:AuvmxbI:AuvqJdi:AuvreLC:AuvuTxi:AuvyVdD:AuwGpoY:AuwIIvt:AuwMDWA:AuwPAGy:AuwTyMG: +AuwVzUf:AuwWFMB:AuwWxiG:AuwZVtA:AuwgWCX:AuwmUbw:AuwxBMH:AuxKJRH:AuxOIVc:AuxSDwV:AuxaYXH:AuxceHq:AuxdhSn:AuxjITi:AuxjQjs:AuxlZJh:AuxrPAe: +AuyASKS:AuyBgsa:AuyGgTG:AuyHgck:AuyJHjC:AuyMLvF:AuyRAWQ:AuyVAx:AuyXHQw:AuyZQPV:AuyaoKx:AuyjkU:AuyuNDP:AuzCGLO:AuzFfHK:AuzJvUh:AuzKKas: +AuzLZTY:AuzOHJh:AuzPioe:AuzQzGE:AuzVGtT:AuzWgSJ:AuzXrEW:AuzZQkQ:AuzdHHv:Auzgoks:AuznKUY:AuzrBzE:AuzrXiC:AuzsLBZ:AuztpZZ:AvABAYn:AvABqiv: +AvAEkNk:AvAGKQy:AvAJkXU:AvAQgny:AvARtb:AvAWlOf:AvAYrfA:AvAZCa:AvAcBoP:AvAhlqQ:AvAkYta:AvAlYuK:AvAqkLR:AvAsLRS:AvAtCxY:AvAvVN:AvAyVIT: +AvAzRrG:AvAzTpb:AvBIlQm:AvBJlKJ:AvBbnJ:AvBdYJy:AvBefSn:AvBfLGY:AvBfjUK:AvBoigN:AvBsPZV:AvCAusP:AvCEjOg:AvCGNKo:AvCIxrT:AvCOlqv:AvCeOfO: +AvClIrA:AvCooZA:AvCopkI:AvCsbjv:AvCuiGU:AvCyIE:AvDBtYt:AvDWUki:AvDWxJZ:AvDXgFp:AvDbtAT:AvDiWmv:AvDpMst:AvDtITD:AvDuerI:AvDwSRR:AvDxAeO: +AvDzFXw:AvECLD:AvEEpfs:AvEJtyK:AvENCAj:AvENbEW:AvEUEUJ:AvEaLEx:AvEcnZm:AvEgPdn:AvEiCTt:AvEiZuO:AvEjtak:AvEoChe:AvEufYh:AvFEJtY:AvFJYTe: +AvFKHWM:AvFLZLD:AvFOjxH:AvFPvmc:AvFRimH:AvFVpm:AvFWRgG:AvFXxFc:AvFbUME:AvFjLDw:AvFxSOg:AvFxzDJ:AvGBciI:AvGBiWg:AvGDOXv:AvGFYSk:AvGHpJd: +AvGJpYm:AvGNVFd:AvGQHwV:AvGTHXB:AvGVfLN:AvGWEFG:AvGWiMs:AvGXVDm:AvGawza:AvGcYjU:AvGdbcC:AvGdknh:AvGesww:AvHKpAR:AvHQguZ:AvHbLho:AvHdtRU: +AvHeqdu:AvHhYSd:AvHofmu:AvHuORf:AvIBkqh:AvICGZb:AvIDyye:AvIEhSJ:AvIFuMv:AvIHPGT:AvIMGJh:AvIRDNL:AvIRJp:AvIRcfE:AvInYsS:AvIpTnd:AvIzExz: +AvJIJsk:AvJRtBc:AvJYLMf:AvJcnhL:AvJdVWI:AvJePZO:AvJiEoF:AvJkEuC:AvJpYvd:AvJsAVL:AvJstXc:AvKAIbv:AvKAdcU:AvKDARt:AvKHUNl:AvKHWhZ:AvKPeAK: +AvKZgZI:AvKdNKr:AvKinHE:AvKvYVm:AvKyyuN:AvLJUkp:AvLJxJC:AvLQsHc:AvLREul:AvLUtYm:AvLXbcS:AvLYCaL:AvLYbeq:AvLcMsm:AvLckHF:AvLhAbk:AvLhfMF: +AvLiQLT:AvLlFlw:AvLqAby:AvLqgCH:AvLsEuG:AvLvYkU:AvMElJC:AvMGoWR:AvMGwYe:AvMHCBu:AvMPUKy:AvMPxjJ:AvMWshj:AvMiMSd:AvMikhO:AvMmABB:AvMmfmo: +AvMneRY:AvMrTmA:AvMskwN:AvMuATR:AvNLrsD:AvNMIze:AvNMrPZ:AvNNHgJ:AvNNfTY:AvNPioo:AvNSykP:AvNTdNZ:AvNYkQR:AvNZGgz:AvNeHjb:AvNgfii:AvNspxi: +AvNuDga:AvOBjKM:AvOGmoT:AvORrSM:AvOTHGC:AvOTXPU:AvOTftP:AvOViOf:AvOZdnS:AvObHle:AvOdQsz:AvOefvG:AvOjEQt:AvOpvpl:AvPDloA:AvPFrFf:AvPIauK: +AvPKrUy:AvPMzmU:AvPQIVi:AvPUOEF:AvPWFqG:AvPbfml:AvPeLhv:AvPgAnE:AvPgtRL:AvPoklU:AvPpLrt:AvPpXJg:AvPsbCI:AvPsxPO:AvPuhqz:AvPwViS:AvPxYTF: +AvQDDNK:AvQDcfB:AvQKPGs:AvQLEet:AvQRkxv:AvQThDa:AvQWyyB:AvQXDEv:AvQZJR:AvQZKQW:AvQbuVM:AvQcTnC:AvQdEmP:AvQhfMe:AvQiQlE:AvQnqDe:AvQqBSa: +AvQsufE:AvRBwky:AvRDtBd:AvRObZx:AvROfkT:AvRfMUv:AvRpEmw:AvRpPzr:AvRrqas:AvRsYvC:AvRtQBO:AvRtnVu:AvRyvUN:AvSLtbS:AvSNnrH:AvSRLmv:AvSUbzO: +AvSUfKc:AvSZCaM:AvSeRMG:AvSjRLZ:AvSsadb:AvSxPZE:AvTAbhM:AvTBlja:AvTMgFb:AvTSWNf:AvTYUKN:AvTZRLP:AvTgpEa:AvTjfDu:AvTkNAL:AvToFXe:AvTqYry: +AvTvnOz:AvTwDTC:AvTxkWO:AvUEUvM:AvUGbHV:AvUbQld:AvUdAEf:AvUekwW:AvUjzXM:AvUnCTB:AvUnZuy:AvUofdN:AvVENuc:AvVGxAu:AvVIaSl:AvVLRgq:AvVPRdB: +AvVSYEo:AvVSgbm:AvVepxf:AvVggHP:AvVhgHp:AvVjyIE:AvVkvPJ:AvVmimj:AvVmqSp:AvVpvJT:AvVtLFs:AvVuWRv:AvVucrj:AvVvBf:AvVyfif:AvWBxfJ:AvWGPVR: +AvWJdyO:AvWMdnJ:AvWTYtL:AvWUrST:AvWVZlm:AvWWHGZ:AvWWXPL:AvWWftI:AvWZvMJ:AvWgwzS:AvWojl:AvWsvpu:AvWxbtC:AvWxxFW:AvXABsY:AvXAhdC:AvXBhso: +AvXEDeT:AvXHgMs:AvXIEEV:AvXRAyb:AvXRqIz:AvXUkng:AvXWKqu:AvXXFql:AvXZkxY:AvXaZGj:AvXjMhT:AvXjYon:AvXkqdG:AvYAsrd:AvYBVLT:AvYDzMe:AvYGGmp: +AvYHIvY:AvYMlOq:AvYNgmh:AvYRqrm:AvYTTaE:AvYTlkg:AvYaOrO:AvYfkLe:AvYjbcy:AvYlPCf:AvYpMHO:AvYpYOu:AvYqdVJ:AvZGtBM:AvZNEBn:AvZUjok:AvZWNkc: +AvZYxRX:AvZZxHw:AvZhLuw:AvZjTcX:AvZoJiN:AvZuOFC:AvaAbnM:AvaCQpM:AvaGTan:AvaGlkL:AvaRjJk:AvaTvbS:AvaUqrF:AvaWzMN:AvaXgnE:AvacSKo:AvaexoO: +AvajBol:AvalgHU:AvaoPCM:AvapVIh:AvasMHd:AvauPyh:Avauifr:AvavxoV:AvaxkLn:AvazLRo:AvbBEBU:AvbDuSG:AvbEkNJ:AvbMxHl:AvbQIBJ:AvbQdCi:AvbRlQa: +AvbaEuv:AvbbJiU:AvbdLsC:AvbeEme:AvbiAVy:AvbitXV:AvbnfSb:AvboIRV:AvboJxW:AvbpLGu:AvbpjUg:AvbubJA:Avbynhy:AvcWIbA:AvcWdcb:AvcXlqj:AvcYlkM: +AvcdvuW:AvcgZXS:AvckNKe:AvcnZb:AvcniGI:AvcoBqY:AvcqLUg:AvcrPzQ:Avctfsi:AvcujuL:AvdFJGc:AvdFaYA:AvdHEuy:AvdWowN:AvdWwyy:AvdXCbi:AvdZEK: +AvdbCHV:AvdfEbs:AvdhejA:AvdiEuR:AvdkqYQ:AvdpNAr:AvdyMsx:AvdykHS:AveERlY:AveGwjf:AveWCAn:AveWbES:AvecDtj:AvehWMM:Avesqyf:AveyhnA:AvfARgc: +AvfDcIv:AvfDiwX:AvfERdP:AvfGOxi:AvfLpyR:AvfPGgG:AvfRjky:AvfSusj:AvffYJJ:AvfgkNw:AvfhsWh:AvfrHLQ:AvftQSN:AvgAEFc:AvgAiMW:AvgDJTF:AvgIYtz: +AvgJHwR:AvgMOXr:AvgOYSo:AvgVRGX:AvgacRC:AvgiLdh:AvglYjQ:AvgmKGG:Avgnsws:AvgozQg:AvgqUmZ:Avgzwze:AvhFIVT:AvhMFqZ:AvhNauv:AvhOjjM:AvhTcFV: +AvheXbc:AvhmEXI:AvhnORb:AvhruvY:AvhsTNW:AvhtEMD:Avhxfmq:AvhyQLQ:AviEoAg:AviHvbj:AviKkqd:AviLGmb:AviMyyi:AviNIvk:AviOuMz:AviSPYv:AviVaUI: +AviWCQs:AviaPCt:Avidlqt:AvieYOg:AvifdVX:AvihYun:Avihjux:Avijxoo:AvikZgC:AvivRrb:AvivTpG:AvixTXd:AvjDIBc:AvjHArA:AvjLNkq:AvjuRmK:AvjzRlV: +AvkLlkv:AvkPCaX:AvkXJSn:AvkZOOE:AvkbnHI:AvkdPzJ:AvkfYjE:AvkgcHF:AvkhcHf:AvkrAvI:Avkrtxf:AvkuTCS:AvkxEOC:AvkyZXH:AvkzEUF:AvlCgFu:AvlEXyW: +AvlIWNq:AvlKDLU:AvlUUVA:AvlWbhZ:AvlcAeJ:AvleFXr:AvljAbE:AvljgCt:AvlrQLh:AvltAej:AvlzzxA:AvmDhkZ:AvmGbCV:AvmPshf:AvmQEUi:AvmYUKu:AvmYxjF: +AvmaSbX:AvmcPdM:AvmdyAZ:AvmeYKP:AvmkChF:AvmoEBc:AvmpgcM:AvmrMSh:AvmrkhC:AvmvItX:AvmweRU:AvmxQlQ:AvnEuss:AvnGcIO:AvnGiwa:AvnHHxd:AvnJLLH: +AvnKmOy:AvnWPvF:AvnYiok:AvnwwZG:AvoBpJK:AvoFmkp:AvoGJTm:AvoLIZh:AvoLrpW:AvoYGGw:AvoZUa:AvoaswX:AvoffId:AvoqyAI:AvosEQp:AvotHJo:AvoziMh: +Avozqsr:AvpGDnF:AvpGcFO:AvpHsIK:AvpQsRP:AvpRGjb:AvpWGMD:AvpXGzh:Avpaqdh:AvpdBsl:AvpfTNN:Avpkfmh:AvplQLH:AvpmKFB:AvpvuFH:AvqBuMU:AvqCOek: +AvqErfk:AvqHaUF:AvqJrut:AvqMJSU:AvqMsib:AvqSgUN:AvqTOeK:AvqUQNz:AvqVFQJ:AvqZVLi:AvqfANH:AvqftrA:AvqjYsp:AvqkuVI:AvqmEmT:AvqqfMa:AvqsKfK: +AvqthQw:AvqwOrr:AvrDJsh:AvrEeaA:AvrMUnf:AvrMWHP:AvrTLMe:AvreJic:Avrhpp:AvrkOFn:AvrvaDQ:AvryMWs:AvsAENO:AvsOknS:AvsdBqk:AvsfLUU:AvskSQW: +AvslZXa:AvsoPZy:AvsqqAx:AvsrYVH:AvssQbD:AvtNgK:AvtTCaK:AvtTbev:AvtVhFY:AvtZfNA:AvtZpVE:AvtZtZC:AvtbAbL:AvtbfMa:AvtdQLS:AvtpqYC:AvtsfDy: +AvtwTMO:AvuAlJf:AvuDDlE:AvuLgfe:AvuNXYG:AvuPJgZ:AvuPayx:AvuRWna:AvuSshO:AvuWhks:AvudMSa:AvudkhJ:AvuhItQ:AvukQlx:AvunFxb:AvureJx:AvusABU: +Avusgcd:Avuvpef:AvuwyAs:AvuzNaK:AvvGjkG:AvvIIzF:AvvIrPy:AvvNNuo:AvvPxAy:AvvRnJE:AvvTVfE:AvvUxFy:AvvZycp:AvvaUvq:AvvcfiJ:Avvfimf:AvvgLDm: +Avvnpxj:AvvrsvU:AvvuvPf:AvvzfVM:AvwCjXE:AvwFEFq:AvwFiME:AvwHDt:AvwKRGJ:AvwNrSP:AvwPXPH:AvwPftM:AvwUyKD:AvwVdnN:AvwYgQR:AvwfEQi:AvwlSoj: +AvwlzdG:AvwtKRe:AvwwDGu:AvwzsVb:AvxCaud:AvxGkXp:AvxPKqq:AvxQbNy:AvxSQPy:AvxWTAZ:AvxWlKx:AvxeYSR:AvxrKoO:AvyEgUW:AvyHEeI:AvyPBSF:AvyTDEK: +AvyVKQj:AvyYkXF:AvycQlx:AvydfMX:AvyjqDX:AvyoXBJ:AvypZgu:AvyzYtr:AvzJWmX:AvzMwkt:AvzOTOR:AvzQgzJ:AvzWEBj:AvzXsDO:AvzmYvn:AvztvUC:AvzwZxG: +AwAKMFv:AwANXk:AwANeaB:AwASakY:AwAUVaN:AwAabyy:AwAdBOY:AwAgzcx:AwAhBrK:AwAoxed:AwApdPE:AwApqYj:AwAvWod:AwAwQRQ:AwAyqyH:AwAzBYz:AwBDePM: +AwBGQot:AwBHUoV:AwBIlgF:AwBIoge:AwBLOnb:AwBSxQT:AwBUqYn:AwBWlFH:AwBdkHd:AwBdqKj:AwBeBhI:AwBheOq:AwBibXT:AwBrbKW:AwCCgTk:AwCErMt:AwCFPDf: +AwCLspq:AwCSLpe:AwCXkEv:AwCYLEg:AwCazzU:AwCbLxU:AwCcZPl:AwCdQVS:AwCdfxj:AwCfFWd:AwChocO:AwCpeoH:AwCvqHL:AwCwbju:AwCzbkn:AwDCbxU:AwDHsId: +AwDKZRj:AwDSaOU:AwDTsNv:AwDcNpO:AwDeuky:AwDhtva:AwDrwef:AwDuoqX:AwEBoQv:AwEDxEP:AwEFrSr:AwEJLMy:AwEQQFb:AwEQqYm:AwEZDdB:AwEZsno:AwEhUsS: +AwEjScK:AwEjhKp:AwEkFHV:AwEkoOc:AwElpko:AwEpFHT:AwExFwK:AwEzEKc:AwFENME:AwFEchp:AwFElyu:AwFGfZA:AwFHfZa:AwFKAXg:AwFSPeY:AwFZuPW:AwFoTko: +AwFqHiS:AwFrVWh:AwFtgjN:AwFyQfo:AwGEUsM:AwGKLFz:AwGLYTm:AwGNNzd:AwGQIje:AwGUvPw:AwGWqtV:AwGgjnZ:AwGwTKV:AwGyHIj:AwGyWJ:AwHDDr:AwHDqsX: +AwHFIzs:AwHJVHq:AwHMkqP:AwHPGuG:AwHYmyW:AwHeCqB:AwHetuq:AwHfosm:AwHfovd:AwHnZAj:AwHoTjG:AwHsdRN:AwHwqRX:AwIAnQr:AwICzth:AwIDJhk:AwIHife: +AwIJGmM:AwIKAsj:AwINtso:AwIOFlY:AwIOnlU:AwIPVhf:AwITUrB:AwIaxem:AwIgBOp:AwIkKkl:AwIkvD:AwImHAm:AwImjsj:AwIoKzx:AwIsheD:AwIvrui:AwIwLzd: +AwIwwaD:AwIyWMR:AwJFxQO:AwJGePV:AwJHbCe:AwJKUoM:AwJLaZB:AwJQPdD:AwJRrmV:AwJURED:AwJYxMu:AwJdbJW:AwJgqKq:AwJhaDZ:AwJkeOj:AwJlDgY:AwJpsfy: +AwJsoCm:AwKEONr:AwKFLpL:AwKLLEN:AwKQUOF:AwKXNmC:AwKXUAD:AwKXsMM:AwKfiEN:AwKlbkg:AwKmkht:AwKmqkz:AwKnCDL:AwKrbxD:AwKvWyZ:AwLEIaF:AwLEWGH: +AwLKIgK:AwLLhrB:AwLdwey:AwLsFWm:AwLuxaV:AwLzbZx:AwMCFOz:AwMCqjI:AwMDQFK:AwMDqYD:AwMQCWp:AwMQIGD:AwMaLPZ:AwMaRuf:AwMjteK:AwMlEKj:AwMlZhU: +AwMvzCM:AwMwSwQ:AwMxSwq:AwMywEV:AwNIvso:AwNJUvj:AwNOozf:AwNPMiA:AwNVDrg:AwNWrvr:AwNbqdb:AwNigen:AwNllcY:AwNlspH:AwNpONk:AwNtaPJ:AwNyCYo: +AwOAfzq:AwOEAxW:AwOJgqM:AwOMPEi:AwOSupG:AwOVMIJ:AwOVXdk:AwObcsN:AwOdgYf:AwOhjns:AwOpIJQ:AwOvtNC:AwOxdsW:AwPLjGs:AwPQrxM:AwPWqsa:AwPXIzj: +AwPZULX:AwPbwcN:AwPhqRa:AwPjDGB:AwPlnOe:AwPndpB:AwPnqym:AwPqZAS:AwPsrUG:AwPtQrv:AwPyosT:AwPzzK:AwQCjgZ:AwQFrXd:AwQPmYg:AwQSVhA:AwQTUnu: +AwQWUre:AwQYGUw:AwQbUEc:AwQnqrh:AwQtbte:AwQtgve:AwQwZaZ:AwQxLzC:AwQxwac:AwQyruN:AwRDNMA:AwRDUaF:AwRDsmO:AwRREVR:AwRSDjP:AwRTNcs:AwRWTsq: +AwRYoCa:AwRajHy:AwRbahD:AwRexcT:AwRjBKO:AwRkVgV:AwRpNHI:AwRqInT:AwRuQzW:AwSDGMc:AwSDxXd:AwSHgTY:AwSKXRP:AwSLwyy:AwSPRmQ:AwSPleO:AwSRJpa: +AwSSlGm:AwSSoGN:AwSWEvk:AwSYDJI:AwScHiS:AwSiFWV:AwSoBHb:AwSuLxg:AwSvNhP:AwSwINM:AwSyjyF:AwTDIi:AwTHaOc:AwTNuhy:AwTOQfm:AwTOqyb:AwTSgTY: +AwTVNYm:AwTXbxc:AwTZOms:AwTbWzs:AwTdSWw:AwTeFWd:AwTgEkL:AwTgZHs:AwTjoqn:AwTnDzk:AwTrTmi:AwTvLiJ:AwTvOpK:AwTwhFJ:AwTxNpy:AwTzukO:AwUDCWo: +AwUJek:AwUKycD:AwUNIAV:AwUNWgX:AwUTqOV:AwUWQFT:AwUhzCr:AwUkSwn:AwUoEKu:AwUoZhJ:AwUrtVN:AwUuNEi:AwUyKRJ:AwVJaGh:AwVNQNL:AwVRNOP:AwVSMih: +AwVSXDI:AwVXfwT:AwVddSU:AwVkVJ:AwVnkjm:AwVsONB:AwVtEul:AwVwaPc:AwWCGMu:AwWEPJG:AwWFoZV:AwWORJN:AwWPagq:AwWTQnU:AwWdQFd:AwWhtNX:AwWkEUU: +AwWoIIC:AwWolUP:AwWtkJt:AwWwfjc:AwXEGuu:AwXHASO:AwXLnLp:AwXMAoW:AwXNnqW:AwXPzTM:AwXQUNW:AwXdLZA:AwXdwAa:AwXewce:AwXhKKI:AwXqbYu:AwXtBoU: +AwXwzCt:AwXxBRG:AwYDlEp:AwYEVhx:AwYFQuc:AwYLrsy:AwYeUEz:AwYhheZ:AwYisPW:AwYoCQk:AwYotUX:AwYpKkr:AwYyTJn:AwZDEVU:AwZEDjW:AwZITsv:AwZKGb: +AwZKRMo:AwZKlEq:AwZSgtg:AwZUrmx:AwZVPdj:AwZdIns:AwZfjYx:AwZgdOD:AwZhQzp:AwZlTvC:AwZqzZY:AwZrLXY:AwZtdTl:AwZtfXf:AwZvFwh:AwZxoCC:AwaEFll: +AwaLWTG:AwaWnQG:AwaXlqq:AwadBYF:AwaeKzM:Awaibtw:Awaigvw:AwamLzQ:Awamwaq:AwaumBG:Awazbye:AwbKRES:AwbPlFD:AwbPnGR:AwbUOnn:AwbVLPP:AwbbgDq: +AwbfZpY:Awbjndd:AwbnnTg:AwbvieR:AwcEYLS:AwcFQOq:AwcHlGC:AwcTqyk:AwcTzX:AwcVlfM:AwcdBHL:AwchbxQ:AwciXGu:AwcksFG:AwclaHS:Awcsadd:AwcwDGg: +AwdCUFZ:AwdDKIF:AwdDoqK:AwdEMVZ:AwdFJMo:AwdGxeM:AwdHrsO:AwdJOvi:AwdMbxq:AwdOOma:AwdTqyp:AwdWskv:AwdXMk:AwdXgTK:AwdjSG:AwdlhFX:AwdpbZC: +AweBbXH:AweIUfC:AweJMvc:AweKoQr:AweLJmv:AweRaoH:AweZZrw:AwebNPR:AweduKd:AwehPsV:AwejIJE:AwetoQE:AweyLPw:AweyRuK:AwfMfwb:AwfNNMA:AwfNcht: +AwfNlyq:AwfOYtP:AwfPNZy:AwfQfZe:AwfUAXC:AwfVnRt:AwfZgQY:AwfhTkk:AwfrcSZ:Awftgyr:AwfxjNg:AwgHGMc:AwgIupj:AwgNvPs:AwgdIIU:AwgdlUF:AwgpTKR: +AwgqVwU:AwgsgJs:Awgzcsc:AwhAqED:AwhDlQw:AwhGCLz:AwhGWta:AwhIVAt:AwhLVLn:AwhNASy:AwhRFLJ:AwhRnLF:AwhSjGn:AwhfbYc:Awhzwcs:AwiAKFp:AwiAWVS: +AwiEMFS:AwiJeag:AwiLkQK:AwiOVak:AwiQifi:AwiTxN:AwiarLw:AwibPMT:AwibcEZ:AwitCQY:AwittUj:AwizUEH:AwjDUoq:AwjHOnE:AwjMxQs:AwjOqYI:AwjTGmo: +AwjTxxh:AwjXgtU:AwjaVgC:AwjhieY:Awjiqhr:Awjjdac:Awjwahq:AwjxZpR:AwjyFwZ:AwkArMQ:AwkBwyN:AwkFepQ:AwkJUOJ:AwkKazE:AwkUxqH:AwkWqyr:AwkXxmr: +Awkfkhx:Awkfqkv:Awkjeom:AwlAOmf:AwlCLGk:AwlDuhL:AwlEQCP:AwlOLmc:AwlTCwc:AwlTIgW:AwlaukZ:Awlbdus:AwleFhN:AwleQY:AwlltEx:AwlmUSI:AwlnxaJ: +AwmAsaW:AwmDIAM:AwmDWgC:AwmJqOM:AwmKJXC:AwmMKY:AwmNsKF:AwmZCWt:AwmguKM:Awmhgap:AwmjNER:AwmnKRq:AwmoGHt:AwmrFwf:Awmybzs:AwnAYtk:AwnBNMz: +AwnBchO:AwnBlyJ:AwnCNZb:AwnFIJc:AwnJnRO:AwnSGmA:AwnUPjs:AwnZoiv:AwnecSA:Awnggyi:AwnkTkp:AwnnVWw:AwoERJq:AwoGNmQ:AwoGcHd:AwoGlYa:AwoHNmq: +AwoHcHD:AwoHlYA:AwoJfzu:AwoKIjH:AwoaqDm:AwosHIG:AwoxgEa:AwoyIJU:AwoycxY:AwpBIzN:AwpIJHa:AwpJrxI:AwpKrSM:AwpSmyj:AwpTled:AwpUVHl:AwpVQUw: +AwpYURH:AwpaHaG:AwpjZAW:AwplrUC:AwpmdRs:AwpuUen:AwpxhEN:AwpyspC:AwqARFO:AwqHmBB:AwqIUlU:AwqJtsL:AwqRGUs:AwqYlEM:Awqknoh:AwqmdPO:AwqrruJ: +AwqsWMq:AwqyDgO:AwrCePs:AwrDzTL:AwrFlgx:AwrGUoh:AwrJCrR:AwrMNMM:AwrMUaJ:AwrMsmC:AwrNXrE:AwrRoCm:AwrTJPT:AwrabKi:AwrbTvh:AwrcnTu:AwrhLXr: +AwrjQvt:AwrjdTG:AwrjfXM:AwrkWYT:AwrlFwC:AwrrBEl:AwrsCdB:AwruCEM:AwrvGHZ:AwrwbXJ:AwrxfMK:AwrzInX:AwsAONU:AwsFLEi:AwsIepz:AwsMUOa:AwsUwye: +AwsXocd:AwsYukx:AwsbqHb:AwsjVGS:AwsrwtZ:AwssYwP:AwstxCQ:AwsxBee:AwtAIac:AwtAWGm:AwtFhrg:AwtGCwZ:AwtGIgn:AwtPLmZ:AwtWuhu:AwtZONp:AwtahFf: +AwtkzcG:AwtotEA:AwtpSCh:AwtphkS:AwtrpKL:AwtvLpP:AwtvRUl:AwtwDzg:AwuGaof:AwuMCWS:AwuMIGg:AwuRycx:AwuaTMl:AwudFwa:AwufEKI:AwufZhv:AwuioQk: +AwukdUC:AwuqWZv:AwuuteH:AwuvhfO:AwuwxAz:AwvBfwp:AwvCiIV:AwvERli:AwvKUSb:AwvOgQK:AwvQLfU:AwvRDrJ:AwvSaGl:AwvWQNH:AwvcUWh:AwveIjW:AwvhQfY: +AwvmjNu:AwvsCYB:Awvwkji:AwvxkjI:AwwAvPA:AwwGPEV:AwwNupX:AwwQNoM:AwwRMIu:AwwRXdT:AwwWfWI:AwwYagu:AwwaMEU:AwxEmya:AwxKpMM:AwxQASK:AwxUFLx: +AwxUnLt:AwxgBDU:AwxgrNZ:AwxgtTh:Awxjdpm:AwxjqyB:AwxpWOL:AwxtByR:AwxuKZY:AwxwNv:AwxybTc:AwxygVc:AwyDGUJ:AwyFSQ:AwyMmYZ:AwyPUnh:AwySrXY: +AwycIZD:AwydwCZ:AwyfWMh:Awyjqru:AwylDgV:AwypbyJ:AwysZaG:AwyuruS:AwzDoCb:AwzJVzX:AwzNDjS:AwzURMK:AwzUlEU:AwzVQoE:AwzXlgw:AwzXogT:Awzaxcw: +AwzdBKl:AwzhjsZ:AwzjNHj:AwzmInw:AwzqQzt:AwztBhx:AwzuBEC:AwzxbXe:AwzyGHu:AxADxKc:AxAGUrW:AxAKXAW:AxAKgTP:AxAKzBz:AxAOoWz:AxAPliD:AxAVXhL: +AxAWEiU:AxAXBzf:AxAhQrR:AxAqZDf:AxAtBsT:AxAwQrr:AxBDfDi:AxBEUqH:AxBJSru:AxBLGMh:AxBOrNB:AxBUcng:AxBXQFz:AxBZrGx:AxBdGXC:AxBedcZ:AxBiOGc: +AxBjgqg:AxBnfNU:AxBpXxn:AxBrOeZ:AxBsDlw:AxByZzz:AxByyDm:AxCEBAM:AxCEKfh:AxCFlTx:AxCJap:AxCKQVA:AxCNUGt:AxCOSRJ:AxCPJFx:AxCPowR:AxCUiXA: +AxCabSG:AxCbAgy:AxCllIr:AxClrlN:AxCoPgQ:AxCxOEE:AxDBymW:AxDDFCb:AxDHaAD:AxDIViM:AxDKQMl:AxDPZfE:AxDVUIT:AxDYnVA:AxDchss:AxDuEEf:AxDvruS: +AxDzoWS:AxEANkH:AxEEGhe:AxEEhfN:AxEICQH:AxEKFcy:AxEPxrA:AxEYVJl:AxEZuOi:AxEdhPK:AxEevnp:AxEisgx:AxFCicR:AxFFvQp:AxFGyEl:AxFJuKT:AxFLglF: +AxFSIep:AxFXHfQ:AxFbLbw:AxFkicH:AxFnDKo:AxGAcuF:AxGBRjH:AxGLvqi:AxGROGv:AxGYIEi:AxGoBmM:AxGoGoM:AxGrWZO:AxHDBZd:AxHKckV:AxHNbEB:AxHOxkA: +AxHUZMH:AxHbBRm:AxHkDMC:AxHkFAI:AxHkqop:AxHlCFu:AxHlziO:AxHmfnG:AxHrMgx:AxHstol:AxHylAv:AxHzZCv:AxIBoWQ:AxICadO:AxITSTN:AxITuXG:AxIaHkw: +AxIcQQf:AxIgBrD:AxIjbQZ:AxIlPDC:AxImEvb:AxInBaG:AxIqJqx:AxIrAQE:AxIuXZU:AxIwMGQ:AxIzbrN:AxJASdL:AxJGHkc:AxJPooS:AxJRixg:AxJYUgR:AxJberd: +AxJdOeC:AxJvBCy:AxJwliT:AxJwrLh:AxKANyd:AxKNcNW:AxKQrgH:AxKXAvb:AxKaoUQ:AxKbkKR:AxKcHYY:AxKiPrA:AxKrwCr:AxKtsnv:AxKufne:AxKweRM:AxKwzqr: +AxKzOHo:AxLFgtD:AxLKqyX:AxLORGw:AxLVNYf:AxLXqWD:AxLahpi:AxLloWj:AxLoelD:AxLyKsE:AxLzFSR:AxMBujg:AxMHmDA:AxMJIpS:AxMLrUl:AxMOUiD:AxMPeBz: +AxMaCYS:AxMdJwp:AxMjunm:AxMliSR:AxMtDjT:AxMtudi:AxNCbk:AxNEIek:AxNHEXF:AxNJKhj:AxNMRaN:AxNUwfJ:AxNYyEw:AxNZZME:AxNmSid:AxNrLqD:AxNuLbL: +AxNvXZZ:AxOBPtJ:AxOUgLv:AxOXajL:AxOgwTT:AxOkQkI:AxOtWxb:AxOtlcB:AxOuWZf:AxOxkrJ:AxPBdEn:AxPFrTG:AxPHqdu:AxPIACd:AxPUGeH:AxPUOZn:AxPWqdU: +AxPZwGr:AxPcPdD:AxPjgQy:AxPlFTh:AxPqDVL:AxPqaeV:AxPrqcx:AxPyJjV:AxQALbH:AxQKOzd:AxQTeoJ:AxQUdSH:AxQYtJi:AxQdJqA:AxQfynM:AxQhXZl:AxQpgqn: +AxQtiWl:AxQwaEA:AxQxqCo:AxQzFFI:AxRCPGX:AxRCSWC:AxRDrNp:AxRHZyF:AxRIjab:AxRJZjj:AxRJqZF:AxRKYek:AxRNJfu:AxRWSPQ:AxRdsZG:AxRmgqU:AxRnOGQ: +AxRyOnU:AxSAcNN:AxSBQfS:AxSDrgQ:AxSFYze:AxSQjAY:AxSVGmA:AxSdwCK:AxSgsno:AxShwDk:AxSmOES:AxSnGxj:AxSttBu:AxSugQn:AxSyKED:AxTEmdg:AxTINYI: +AxTIWEs:AxTKqWk:AxTNxRL:AxTPRGX:AxTRXrB:AxTYgtk:AxTZpsy:AxTooWE:AxTzEBd:AxUBqYh:AxUEnvh:AxUFUFu:AxUJdKv:AxUONyV:AxUOWel:AxUQqwt:AxUZZFl: +AxUaLZh:AxUaSIy:AxUqUED:AxUsyzF:AxUuowZ:AxUwDjm:AxUwudP:AxUxvnB:AxUzGSd:AxVAcvz:AxVCvUy:AxVEaJn:AxVHTJk:AxVINUQ:AxVNARt:AxVOjQO:AxVrZxv: +AxWBNDi:AxWDuwO:AxWGOGd:AxWMTGo:AxWOuuK:AxWPTjR:AxWQExV:AxWSKHz:AxWVArM:AxWWCDK:AxWZwOb:AxWaRwF:AxWaTmt:AxWhWxY:AxWhlcy:AxWiqKe:AxWkLQT: +AxWoXzJ:AxWpkce:AxWqNvv:AxWutSm:AxWxbVm:AxWyZzL:AxXAnzU:AxXJZMf:AxXPckx:AxXQbEl:AxXTxko:AxXaIkU:AxXdDVe:AxXoqfp:AxXqyNs:AxXxKQP:AxYAXAB: +AxYAgTE:AxYAzBo:AxYMrtw:AxYOjiG:AxYVgEb:AxYYDGc:AxYdZca:AxYgIKL:AxYvCfb:AxYvzIX:AxYwByA:AxZCGMc:AxZEooA:AxZKfDb:AxZNOhC:AxZNkPN:AxZQjTG: +AxZRSXo:AxZVltL:AxZatbW:AxZewdI:AxZfniC:AxZhOvv:AxZhfqC:AxZlOnL:AxZlpJG:AxZnisT:AxZnwdW:AxZoVga:AxZrAGM:AxZzgmj:AxaAjiN:AxaIRTi:AxaJSTY: +AxaJntW:AxaJuXP:AxaLDGJ:AxaOBzZ:AxaPEii:AxaTuVr:AxaXoWF:AxacJJO:AxadBaP:AxafYDu:AxaiWmI:AxajByh:AxapNmo:AxayQQq:AxbBPAp:AxbDSXh:AxbHixR: +AxbYSdy:AxbbcNj:AxbbnCb:AxbdbsT:AxbeAGj:AxbekG:AxbkOvQ:Axbkfqd:AxblBCL:AxbrPGB:Axbrkkn:AxbsseT:Axbvho:AxbwKeA:AxcCSpx:AxcGOHs:AxcHPag: +AxcKRJw:AxcNrnY:AxcQoTy:AxcTUQS:AxcUZJc:AxcUqzO:AxcWUGp:AxcYNyO:AxccGxX:Axchncu:AxcjbSC:AxcmoIA:AxcqURE:AxcrDLl:AxctdCA:AxcufQQ:AxcwUEe: +AxcxOgx:AxdAOcz:AxdBViI:AxdERGj:AxdIRon:AxdMFCf:AxdRuJs:AxdXmdU:AxdZIPG:AxdfLP:AxdiipO:Axdlhsw:AxdqCyG:AxdtJWd:Axdwhpt:AxdzuNy:AxeDuOM: +AxeEUik:AxeHFGh:AxePWk:AxeQyMh:AxeRCQL:AxeRnty:AxeSnca:AxeZNkL:AxeerUl:AxefSIo:AxeoGSr:AxeuCjB:AxfBHfu:AxfDjQY:AxfPvQT:AxfTuKp:AxfiTlT: +Axfichg:AxfkOjh:AxfkOoa:AxfsyRH:AxftzXO:AxgAlwG:AxgFyeq:AxgRiCO:AxgZRAH:AxgjiCU:AxgnqKS:AxgqJjA:AxgqhXF:AxgzzxV:AxhFaDz:AxhIpfV:AxhJXHR: +AxhKSIN:AxhLURi:AxhPwGi:AxhQLBD:AxhbzCG:AxheQqs:AxhfWP:AxhfZdX:AxhiBRQ:AxhjRl:AxhkNMM:AxhtJQM:AxhvyNA:AxiCBza:AxiJlic:AxiSEir:AxiTZmM: +AxiWuVi:AxiZcKS:AxinBss:AxiqBrh:AxirtOi:AxisNmt:Axixlas:AxizDmF:AxizFaL:AxizqOu:AxjAUqm:AxjBzKh:AxjCfvH:AxjDNYq:AxjQcnB:AxjVYZi:Axjalih: +AxjarLT:AxjfHyL:AxjoDlR:AxjtwcG:AxjwsNc:Axjxwdg:AxkAOpA:AxkAuvs:AxkFQVB:AxkOoOV:AxkQiXb:AxkVHKf:AxkdTOZ:AxkjsEd:AxkkPgr:AxlFNKN:AxlJGHc: +AxlJhFH:AxlOuoo:AxlVmpd:AxlXUfA:AxlpCAs:AxlqSiM:AxlrruN:AxlvTwm:AxlxDJy:AxlxuDD:AxmDCQG:AxmDntr:AxmEncj:AxmFFcv:AxmHisk:AxmJaaP:AxmKVIY: +AxmNRgz:AxmRFNq:AxmSIpW:AxmUrUh:AxmZqYU:AxmehSg:AxmneLI:Axmsuni:AxmuCaZ:AxmuiSV:AxmxEeR:AxnALHM:AxnFRaJ:AxnNIeo:AxnWOgp:AxnjDKP:AxnnQKF: +AxnqRWR:AxntBMK:AxntGOK:AxnxWXM:AxnxlCm:Axnyqkq:AxoCwFe:AxoHkr:AxoIKHe:AxoLRAA:AxoNgLr:AxoTIEd:AxoXyex:AxoaLQK:Axobkrn:AxodJjh:AxodhXo: +AxoeXzU:AxoktSr:AxolSIk:AxopwTP:AxowRwY:AxowTmk:AxoxsdP:AxozDIn:AxpGAFL:AxpKxkb:AxpNGeL:AxpNOZj:AxpPyuO:AxpQqvm:AxpWeOY:AxpchPa:AxpfFAJ: +Axpfqos:AxpgAqO:Axpifnd:AxpjOZo:AxpobqP:AxptZCU:AxpulAU:AxqBpFF:AxqHAco:AxqLgEY:AxqMGMD:AxqTGEC:AxqTOze:AxqYwgy:Axqihpn:AxqkzcW:AxqpmC: +AxqqXZp:AxqrPDO:Axqtbrk:Axqznqm:AxrBKBQ:AxrCHkD:AxrEQFd:AxrGrGf:AxrLltY:AxrTUgU:AxrUzKS:AxrWNYJ:AxrjuJs:AxrnPRO:Axrrfqt:Axrwttf:AxrxHyW: +Axrzlpe:Axrzoid:AxsBSwD:AxsCrnw:AxsHKbZ:AxsVSpV:AxsXjAe:AxsZYEl:AxsggMT:AxsmZZO:AxsmydX:AxspKEx:AxtFOcd:AxtGuJm:AxtRNYE:AxtTqWg:AxthTwj: +AxtjHbS:AxttKsF:AxtuyZu:AxuHoZ:AxuHrUQ:AxuIpSb:AxuKOCS:AxuLeBG:AxuMxrW:AxuQXRY:AxuSROG:AxuXNyR:AxuXWeh:AxuZqwp:AxufunP:AxunrW:AxusLLu: +AxusiPf:AxvDEXk:AxvGPTL:AxvIOgy:AxvMgTM:AxvNQjo:AxvPTgR:AxvQavr:AxvTNhr:AxvUHfG:AxvVZMh:AxvWygY:AxvdsDR:AxvgSiI:AxvhyRz:AxvlwVM:AxvmkRL: +AxvnLqi:AxvoJJJ:AxvohxM:AxvpOjZ:AxvpOoS:AxvqAy:AxvrXZw:AxwACDo:AxwNjqr:AxwORAZ:AxwRvuD:AxwTajS:AxwUgtt:AxwXNul:AxwYaVK:AxwZNHK:AxwcwTK: +AxwoSIp:AxwqWZy:AxwthyA:Axwukru:AxwwJjs:AxwwhXt:Axwykca:AxxIeOP:AxxJnzQ:AxxNtjs:AxxSyuf:AxxYAFE:AxxZStm:AxxZnTc:AxxZuxd:AxxjIkQ:AxxqbRM: +AxxtBAd:AxxvYdA:AxyBxKR:AxyGOzG:AxyNeoi:AxyPnZH:AxyVUrF:AxyWOzZ:AxyYjic:AxyZXAF:AxyZgTA:AxyZzBk:AxypIKH:AxysDvx:AxysaEb:AxywbrT:AxzGYeN: +AxzISrb:AxzSSPt:AxzWkPr:AxzXPAk:AxzbBCW:AxzhPGY:Axzhkku:Axzigqp:AxzsGXT:AxzxcNq:AxzxnCy:AxzzbsO:AyAAqPb:AyACYAn:AyAGBdC:AyAHeEz:AyAIKkJ: +AyAQZYz:AyARJqa:AyAWZdc:AyAZchZ:AyAhzVy:AyAiDax:AyArEO:AyAxqTF:AyAycAu:AyBENpq:AyBEOVw:AyBFjd:AyBGyTK:AyBMHXO:AyBPGmu:AyBSgMp:AyBXJQn: +AyBYXbK:AyBahwe:AyBdrhg:AyBizZH:AyBlxoN:AyBmzvV:AyBrhts:AyCFTbj:AyCGrxW:AyCKLSt:AyCOGgg:AyCRXjY:AyCVjAU:AyCWhCs:AyCbsIo:AyCgXku:AyCiJAw: +AyCkerm:AyCkpMk:AyCnFmO:AyCnszG:AyCpAGT:AyCqDAr:AyCrMUZ:AyCthqO:AyCuXRH:AyCzpwp:AyDCIGZ:AyDDFHU:AyDGkAg:AyDLDRW:AyDRUBE:AyDUGGl:AyDhsid: +AyDwDay:AyDxuHu:AyDycak:AyEAcSH:AyEFJUd:AyEFLld:AyEHAin:AyEMlrl:AyEPHNS:AyEUEnz:AyEUSBb:AyEYHlc:AyEidIP:AyEjblL:AyEktJy:AyElzYz:AyEoTYZ: +AyEpVMR:AyEwSqe:AyFDlqk:AyFHnEm:AyFNHLJ:AyFjDQH:AyFmChT:AyFpbLE:AyFrzys:AyGAwDi:AyGCDVz:AyGKOxb:AyGNUe:AyGOolW:AyGRHZY:AyGWfGr:AyGbOsH: +AyGdBrp:AyGftXW:AyGgFTW:AyGgXTI:AyGxDuB:AyGxwwG:AyHFNOx:AyHFvXq:AyHGwdp:AyHIDvc:AyHJRLC:AyHJjsw:AyHSpQj:AyHTmee:AyHXRmv:AyHZdvs:AyHcaVc: +AyHeGpU:AyHfirs:AyHgOSq:AyHgRPy:AyHhOSQ:AyHhRPY:AyHiBRI:AyHmFtN:AyHmXtP:AyHojtJ:AyHsfLg:AyHtBWI:AyHuRok:AyHvwYR:AyHxHwv:AyHxsrV:AyIITPG: +AyINBQo:AyIObAe:AyIZHxi:AyIahZx:AyIaoak:AyIfqhq:AyImEMF:AyIomVy:AyIpmVY:AyIriUx:AyIvqlq:AyJAeej:AyJBPfo:AyJJZNx:AyJJywt:AyJLpcn:AyJPZDs: +AyJScHJ:AyJUWvz:AyJZPSZ:AyJaojM:AyJdesO:AyJihzA:AyJioAR:AyJrcae:AyJupWI:AyJvbAl:AyKRvZ:AyKSjQg:AyKSrkB:AyKesIF:AyKhUs:AyKhaKK:AyKkQCm: +AyKrZkK:AyKrjdz:AyKvzgZ:AyKwyyZ:AyLBLsD:AyLGFHn:AyLRAJo:AyLRBEY:AyLRKqG:AyLSKl:AyLZsvP:AyLdTIP:AyLjSqI:AyLlXrx:AyLnNdM:AyLqIbj:AyLwsZw: +AyLxZKR:AyLxjDc:AyMCHNx:AyMHbyv:AyMKAiE:AyMMnar:AyMPTUX:AyMVHiO:AyMXJUo:AyMXLlo:AyMcVMy:AyMhSqN:AyMmblg:AyMozYQ:AyMpTYq:AyMrnLr:AyNIHnC: +AyNMpFb:AyNNENj:AyNNSbr:AyNPbYM:AyNXTuc:AyNXlzf:AyNYBfz:AyNadZd:AyNeMxu:AyNhOXY:AyNhRDA:AyNiVmB:AyNpSQu:AyNtCFg:AyNuzyj:AyNznlI:AyOBolp: +AyOCqql:AyODRMh:AyOEGuM:AyONTrm:AyOSePP:AyOWpTq:AyOXZjG:AyOZJnz:AyObTAp:AyOjMIY:AyOjUhP:AyOvqNu:AyOxCut:AyPAyQU:AyPEGDs:AyPFpQC:AyPKsPD: +AyPOTtP:AyPTTRz:AyPYepG:AyPfoSK:AyPgTaG:AyQAwYB:AyQIpCL:AyQJASh:AyQOKkx:AyQUHmd:AyQWZYH:AyQXPcN:AyQZcSs:AyQcmVB:AyQmTdr:AyQnDaj:AyQxqEl: +AyRBTpW:AyRCZDZ:AyRGwyI:AyRHbau:AyRLTvo:AyRMZNQ:AyROpcG:AyRTSpW:AyRUPfF:AyRXgMf:AyRdcal:AyRfEmV:AyRhbAe:AyRimvI:AyRuqhT:AyRwesf:AySBubs: +AySDJkM:AySGXjo:AySJjmm:AySXZvZ:AySdZkT:AySdjde:AySeAGb:AyShzgE:AySnnkS:AySyzTj:AyTDLOP:AyTGUBw:AyTJJKB:AyTJmSR:AyTNZXR:AyTOIGt:AyTPjMb: +AyTQZYD:AyTSwIP:AyTVIGh:AyTZkAU:AyTbGIb:AyTmuHG:AyTtazo:AyTzAgM:AyUFOzl:AyUFcSZ:AyUGnev:AyUJHiv:AyUJgWY:AyUQsHZ:AyUYqTt:AyUaWjX:AyUbMXW: +AyUcRdc:AyUsSpc:AyUscga:AyUtwfK:AyVCHLX:AyVKOZE:AyVKcss:AyVLBfQ:AyVOgwp:AyVPqic:AyVaKIW:AyVdtKv:AyVgCtu:AyVgWJQ:AyVsdik:AyVtPVv:AyVutjB: +AyVyTya:AyVzErr:AyVzQBD:AyWEePI:AyWIpTh:AyWOBPd:AyWPDzP:AyWUHZg:AyWWneR:AyWZYFb:AyWZvSz:AyWaGtg:AyWaetB:AyWoaWn:AyWqose:AyXAJNJ:AyXEyuN: +AyXFVNU:AyXUBpm:AyXUacT:AyXXVRR:AyXcjAY:AyXemnW:AyXfCXw:AyXfzaq:AyXgGTn:AyXgeTK:AyXmqnE:AyXqMii:AyXrGYm:AyXxfLI:AyYJWMS:AyYLcSz:AyYRrxh: +AyYYqPY:AyYeSoK:AyYgiUj:AyYkqlc:AyYpRbz:AyYtrHS:AyYveuo:AyZEETk:AyZFKKH:AyZPWmJ:AyZSAsX:AyZTQLD:AyZXrXq:AyZZAOx:AyZbknp:AyZbxoc:AyZgDAZ: +AyZmCUf:AyZnKJB:AyZvRBc:AyZyhwH:AyZzrhJ:AyaBRju:AyaDpT:AyaDrxo:AyaFAof:AyaHUuj:AyaINPB:AyaIOvD:AyaKytx:AyaLXBX:AyaMYAR:AyaQeEf:AyaRPFc: +AyaZZnt:AyaZyWx:AyadhWv:AyagrHt:AyahiUM:AyalENP:AyalmLL:AyaqoJA:AyateSC:AyayhZM:AybBPCW:AybBYae:AybCXbo:AybGQLm:AybKrXX:AybLAOq:AybPZyq: +AybQyTo:AybSWmc:AybVBDH:AybXKKA:AybYGmq:Aybbqeu:AybiRBJ:AybjacO:Aybmrhc:AybqKJk:AybxDAs:AycHOkd:AycIjQJ:AycIrko:AycLWGN:AycLsPL:AycODrX: +AycPTbN:AycWFhZ:AycXBDW:AyclcAd:AycpXkq:AycrdsR:AydAsvO:AydEjaZ:AydGYGL:AydJLOf:AydNGGh:AydQXJV:AydUTBe:AydVrXX:AydbuHQ:Aydfakm:AydmsZH: +AydqMuU:AydvXKz:AydxJax:AydzeRb:Aydzpmd:AyeGfYb:AyeMdJm:AyeTUko:AyeTYAt:AyeTjVI:AyeYHNW:AyeaPvI:AyegERM:AyehSpU:AyehcgW:Ayeqdzp:AyeuMXa: +AyexOxM:AyexRdU:AyeyVMV:AyfAGwL:AyfCqtk:AyfIXAl:AyfKcuQ:AyfLlRa:AyfPOZs:AyfPcsE:AyfQnEi:AyfSrwB:AyfXHLn:AyfZnAt:AyfaFMt:AyfgyHa:Ayfjtjt: +AyfnTyW:AyfsDQL:AygATTl:AygDOxn:AygJwDe:AygLDVv:AygMRlV:AygMjSb:AygNvaC:Aygbwqn:Aygcmiw:AyghiRF:AygkOsD:AygkRpL:AyglkSH:AygqXTe:Aygrgob: +Aygrrza:Aygvosw:AygzLV:AyhEZJE:AyhJOXg:AyhPwdl:AyhVfgw:AyhetxR:AyhfFtR:AyhfXtL:AyhiScz:AyhnGpI:AyhqOSM:AyhqRPE:Ayhsksa:AyhwXvA:Ayhyjtv: +AyiAcSD:AyiBEtL:AyiLXF:AyiMPso:AyiRTPK:AyiSZdF:AyiWwYU:AyiXbAi:AyibTdE:AyirqTc:AyitcAp:AyivEMJ:Ayixbay:AyiymVU:AyjBTvz:AyjCqpN:AyjEWmd: +AyjHLpN:AyjIHXl:AyjJSpB:AyjXTpB:AyjeqeR:Ayjhojq:Ayjjqha:AyjuqLt:AykADrQ:AykBxkl:AykIFhS:AykWUbC:AykcJAZ:AykepMF:AykjFmb:Aykjszj:AyknMUw: +AykqaKO:AylECND:AylGxKU:AylHxKu:AylRjqz:AylYYGW:AylidSb:AylqUjL:AylscaT:AylzQcp:AymBJUK:AymBLlK:AymIlQm:AymOkMX:AymPkMx:AymSHlL:AymaCHr: +Aymfblc:AymhzYU:AymqKiC:Aymttkb:AymwCTa:AymwWjE:AynFnj:AynJAIz:AynLnAM:AynQlqV:AynRHnG:AynWENn:AynWSbv:AynaQBK:AyniChI:AynlbLX:AynmmHF: +Aynnzyn:AynrVmF:AynyKIx:AyoGOxA:AyoKolt:AyoMRMl:AyoNspW:AyoSfGQ:AyoVVna:AyoejTp:AyokwyH:AyomAjv:Ayoujia:AyovCxC:AyovzAE:AyoyGtZ:AypCwdU: +AypDRLf:AypDjsR:AypEDvF:AypLMwe:AypOpQO:AypRqQw:AypTGUV:AypVptj:AypWvAs:AypYJNa:AypbABt:Aypeksx:AyphGYF:AypiXvX:AypnIRn:AypooSG:AypqRoN: +AyqKbAB:AyqLHmX:AyqNZYt:AyqUEtg:AyqVKkD:AyqaENb:AyqdqTh:Ayqhpww:AyqkbaR:Ayqleuz:AyqrxOo:AyqwDaV:AyqxhTR:AyrBgMJ:AyrBrY:AyrHpcK:AyrIAso: +AyrPwyE:AyrQbay:AyrTHMc:AyrVZyO:AyrXrCy:AyrlqtS:AyroEmZ:AyrpEmz:AyrrmvE:AysBZvf:AysChCY:AysGAju:AysGBeC:AysMkaF:AysOzzD:AysQZxA:AysREd: +AysSjmq:AysTZyW:AysVwiC:AysXQIg:AysaXRb:AysiTiJ:AyswnkO:Aysxnko:AytAGGZ:AytFXJd:AytGZVQ:AytJjah:AytMLOT:AytWZXV:AytXIGp:AytYjMf:AytdAgi: +AytgztA:AythENx:AythkTh:AythnUe:AytkGIf:AyuBpfd:AyuCkMa:AyuEbyK:AyuSHir:AyuVygQ:AyudKiZ:AyufdIf:Ayuiblz:AyukzYL:AyuwdzB:AyuyCfa:AyvDHnL: +AyvIkmh:AyvJbYb:AyvOnAf:AyvPshW:AyvUBfU:AyvXrwP:AyvYqig:AyvaMxZ:AyvbOXv:AyvbRDn:AyveVmm:AyvjSQZ:AyvobLs:AyvqzyE:AyvrSPn:AyvrcGl:AywAnev: +AywFNz:AywHVnx:AywIyUc:AywNePM:AywTTTZ:AywYaCy:AywZGdy:AywcCui:AywdMId:AywdUhm:AywggoT:AywgrzW:AywhaWj:AywvmiA:AywyCxz:AyxCbRX:AyxGdvy: +AyxHpte:AyxKTts:AyxNBpi:AyxNacP:AyxNfV:AyxTepD:AyxbwYx:AyxdAJF:AyxdVKo:Ayxnawc:AyxpGTj:AyxpeTO:AyyAyWs:AyyCpCi:AyyFASM:AyyGHxW:AyyMgmh: +AyySXBS:AyyVljz:AyyWQlQ:AyygzVN:Ayytzzp:AyyyRbv:AyzABqX:AyzDbaR:AyzDvA:AyzGZNv:AyzGywz:AyzWPST:AyzZPCb:AyzZYaP:AyzapWg:AyzdmvN:Ayzfiuo: +AyzjqLf:AyzqhtB:AyztSON:AyzueUj:AzAAcgq:AzANxcX:AzAXBK:AzAdjHV:AzAfPDJ:AzAnsXX:AzApegD:AzBEZSf:AzBFcGX:AzBGpIf:AzBHtKb:AzBIXBi:AzBNuKF: +AzBXyuP:AzBaSSo:AzBafDg:AzBbucP:AzBcivO:AzBdChH:AzBwxVL:AzBxAbJ:AzBxItq:AzCCleG:AzCFwrI:AzCKLSu:AzCLhGP:AzCPPoq:AzCQKDt:AzCZLXa:AzCeDsW: +AzCgcot:AzCimQF:AzCmvDq:AzCqbwm:AzCscuj:AzCvMaq:AzCwBUg:AzCwBeo:AzCyZPY:AzDAFpN:AzDBbob:AzDDNLl:AzDLwRB:AzDXBPu:AzDaWOQ:AzDfdXI:AzDkTBe: +AzDpoQa:AzDprMy:AzDsvdz:AzDuZTp:AzDwbWf:AzDxsXM:AzDycUa:AzEEYxJ:AzETYJo:AzEeWxm:AzEfsJp:AzEhMGo:AzEutWE:AzFBewj:AzFDWmQ:AzFEJzV:AzFErEb: +AzFJFnJ:AzFROEo:AzFSQXs:AzFTXtF:AzFTrdw:AzFcaKp:AzFdoZP:AzFdrYX:AzFrtho:AzFufTh:AzFxvIW:AzFygPB:AzFzuAO:AzGAxKN:AzGEzvu:AzGFtYd:AzGIWPz: +AzGLBHF:AzGQPJt:AzGVlYh:AzGXpOU:AzGiCRZ:AzGrMEz:AzGreGf:AzGwiTN:AzGyEwG:AzGzEZu:AzHCGDN:AzHIxku:AzHMzVN:AzHQWpA:AzHYPjO:AzHZazk:AzHhQAI: +AzHnChd:AzICfvI:AzIFXT:AzIGoIT:AzIHlfG:AzILUkk:AzINMzE:AzINRRm:AzINjbU:AzIORbE:AzIRzqE:AzITJdu:AzIUzpS:AzIYYiE:AzIaCHn:AzIdABL:AzIdITw: +AzInzbL:AzIobVE:AzIyASX:AzIyNbk:AzJCoBq:AzJJHjB:AzJKJhd:AzJMyNr:AzJRUKt:AzJTMZZ:AzJTRrr:AzJTjBJ:AzJWxCh:AzJXzQZ:AzJZJDj:AzJeuci:AzJgChq: +AzJgSWD:AzJieGt:AzJknml:AzJpRUi:AzJsXiP:AzJtJMb:AzJtzBS:AzJuane:AzJxZNB:AzKBegP:AzKBsKH:AzKCPoX:AzKCyWU:AzKNCZb:AzKNosT:AzKRoUd:AzKSDCC: +AzKbkgm:AzKhTCS:AzKjApw:AzKltPp:AzKriYk:AzKwVrE:AzLAwBy:AzLJKdd:AzLKBPn:AzLOwRY:AzLVoSm:AzLWNLw:AzLYRK:AzLbZpI:AzLfvda:AzLhZTk:AzLksXV: +AzLlcUz:AzLnDSG:AzLpTcj:AzLqwCY:AzLrmqV:AzLsdR:AzLsoQz:AzLsrMb:AzLySIF:AzMJAJe:AzMMlIe:AzMMqIM:AzMOEYQ:AzMPEYq:AzMYvgd:AzMcTQq:AzMjcqf: +AzMrVn:AzMsvii:AzMuuaq:AzMxGfH:AzMxRsK:AzNAMlC:AzNFQXT:AzNHGm:AzNHNLs:AzNOdSq:AzNPbyE:AzNUEyH:AzNcWPt:AzNeaCJ:AzNevBc:AzNhfTO:AzNoAf: +AzNpZhy:AzOBpzY:AzOHbmP:AzOLYVv:AzOPnYm:AzOTBty:AzOWaZI:AzOfUHq:AzOrkcS:AzOyovr:AzOzrkr:AzPEBhV:AzPOlyx:AzPZwdR:AzPbCrJ:AzPfHsk:AzPfOHx: +AzPkQAb:AzPnOcg:AzPusFJ:AzPxkCZ:AzQCYwx:AzQDinZ:AzQGJdL:AzQLjvy:AzQNbMd:AzQOUkR:AzQPJXY:AzQQRRT:AzQQjbl:AzQVyUO:AzQXoIm:AzQtxvs:AzQvrdC: +AzQwABu:AzQwITN:AzQxqJS:AzRAlFw:AzRCstN:AzRKzQu:AzRLzPc:AzRMJDE:AzRPYIu:AzRWMZu:AzRWjBe:AzRXxCG:AzRjYPm:AzRkZNm:AzRsRUF:AzRtSSY:AzRtfDQ: +AzRwJMM:AzRwMto:AzRyDtv:AzRzHXQ:AzSHleQ:AzSMEtP:AzSOLXw:AzSRbYG:AzSVteV:AzSbNEL:AzSdOTO:AzSrBQW:AzSvCWr:AzSvFTU:AzTAuBQ:AzTAyhJ:AzTDSar: +AzTKout:AzTPTid:AzTXAcU:AzTbMAH:AzTcZnN:AzTejzy:AzTeyFS:AzTfCNI:AzTfsYK:AzTqcOM:AzTsAPg:AzTwBqx:AzTxBqX:AzTxYE:AzUAKiz:AzUMPxn:AzUQwVr: +AzUTSyi:AzUUVhR:AzUZYxx:AzUmOzf:AzUrach:AzUrvbA:AzUsDB:AzUuUvQ:AzUvICd:AzUvLJD:AzUyJhS:AzVFliU:AzVQbVk:AzVUOEA:AzVcFrx:AzVjQgd:AzVpsji: +AzVrMgv:AzWGxKp:AzWJqeR:AzWNRqg:AzWQafN:AzWRhdB:AzWSnYJ:AzWTzPn:AzWckNX:AzWfQLj:AzWgMEd:AzWgeGx:AzWmrkU:AzWnAJP:AzWoaV:AzWukct:AzXBgdY: +AzXCkBi:AzXEgvT:AzXJggJ:AzXKzpY:AzXLwdK:AzXOtm:AzXRrCj:AzXTRQp:AzXVaFy:AzXeEWn:AzXlZSD:AzXpPP:AzXpoVB:AzXsrKB:AzXwRak:AzYDxcE:AzYHJHI: +AzYMacC:AzYMblu:AzYMkXk:AzYUZsr:AzYVcgL:AzYWpir:AzYXtkv:AzYbaNH:AzYdHA:AzYfHxS:AzYhnMA:AzYjrVs:AzYoeuN:AzYqfds:AzYruCD:AzYtSwi:AzYxxbI: +AzYzDzj:AzZCYIl:AzZFiNV:AzZJKHk:AzZLYWh:AzZPJhr:AzZXoBg:AzZYJxI:AzZYRBl:AzZblUW:AzZdAsQ:AzZdNBb:AzZhXiF:AzZjans:AzZmxVc:AzZneGb:AzZpnmz: +AzZqqjC:AzZrrvH:AzZuJUn:AzaAjvk:AzaDgD:AzaEJXK:AzaERbn:AzaIpiK:AzaJcgu:AzaKtko:AzaRukk:AzaSobE:AzakxbP:AzamDzs:AzarJuL:Azatce:AzawCHE: +AzawSwp:AzazxvA:AzbByut:AzbMxCU:AzbRXBm:AzbYfAR:AzbcikV:Azbdqjh:AzbmsxU:AzbuPdG:AzbzSSk:AzbzfDc:AzcDLXE:AzcHNlC:AzcNhed:AzcPwrm:AzcQwbm: +AzcSdVI:AzcUhGT:AzcZKDp:Azcjdxf:AzcpBUc:AzcpBek:AzcvvDu:Azczbwi:AzdAOUR:AzdAotN:AzdJLsz:AzdKbof:AzdMNLh:AzdRlEH:AzdYLxn:AzdaZfQ:AzddDSX: +AzdhmqI:AzdiqKs:AzdnOtV:AzdodXM:Azdqcaq:AzdvBuh:AzdxZpV:AzeEeWy:AzeFYVS:AzeGWMB:AzeJzck:AzeLjgV:AzeQoqI:AzeSPxX:AzeWwVD:AzeXNlG:AzeegYg: +AzegozC:AzegryK:AzekICr:AzekLJR:AzelgpQ:AzenJhE:AzesFeU:AzeurFY:AzfAVHk:AzfDYXA:AzfJVQL:AzfJnFE:AzfKewv:AzfMWmM:AzfWoQF:AzfYMlx:AzfdWXf: +Azfkovt:AzfmoZL:AzfmrYD:AzfqNTG:AzfttwN:AzgBgVq:AzgGhdp:AzgKRjj:AzgNzme:AzgOtYh:AzgUBHJ:AzgaiTb:Azggkg:AzgpHQN:AzgrCRV:AzgvHSw:AzgvOhd: +AzhDhQM:AzhDkIi:AzhElyo:AzhFsyC:AzhGpoR:AzhJGDr:AzhPPjs:AzhTUk:AzhTzVr:AzhUtyc:AzhiEzr:Azhqega:AzhsKtz:AzhwChX:AziBlZv:AziEobB:AziISYj: +AziIwNh:AziJZsl:AziQlfK:AziRblk:AziRkXu:AziSsTr:AzibPDi:AzideuP:AziekzB:AzifXIC:AzixJmQ:AzixMTs:AzjCRQb:AzjDXBt:AzjGlzA:AzjKgNR:AzjRfVR: +AzjSHjF:AzjVoiO:AzjWaCj:AzjWkxB:AzjYiNd:AzjaXQp:Azjfjhb:AzjkkZU:AzjyeUg:AzkBNhw:AzkCSAF:AzkJfIF:AzkKegT:AzkKsKL:AzkLKDy:AzkMBps:AzkQubE: +AzkTSAf:Azkdwcd:AzkfoqG:Azkkkgi:Azknsxk:AzksZNZ:AzkujZm:AzkuyfG:AzkyOTt:AzlANLS:AzlNhgD:AzlRPOe:AzlRywh:AzlUBPJ:AzlcdXv:Azldcaj:Azlovde: +AzlqZTo:AzlsbWy:AzlvVRx:AzlyBus:AzmAYxg:AzmBLT:AzmBdsl:AzmEgmA:AzmKSyv:AzmOSIY:AzmVlIa:AzmVqII:AzmYEYu:AzmgtHu:AzmqtWh:AzmzQGP:AznAJzu: +AznArEA:AznOhsB:AznQNLw:AznXvGy:AznbTql:AzngWXY:AznjFEe:Aznlrfi:AznqfTK:AznrvIt:AzntuAl:AznugPa:AznwGFU:AznwRSV:AzoAzvP:AzoBCau:AzoEbXi: +AzoQbml:AzoRgDU:AzoSkbe:AzoUgVX:AzoZgGF:AzocHQg:AzomQaw:AzonXFn:AzouEwb:AzpGzVi:AzpHtyx:AzpKWpf:AzpNBhZ:AzpSPjh:AzpTRJz:AzpVazL:AzpWhQV: +AzpWkIr:AzpeUht:AzpkCrF:Azpledy:AzpmBHj:AzqAynH:AzqDlfb:AzqHUkN:AzqJRRH:AzqJjbp:AzqOzpv:AzqPJdP:AzqVinZ:AzqZKhg:AzqiiVl:AzqmZnX:AzqtNbn: +AzquRus:AzqxXIJ:AzrEyuJ:AzrJosh:AzrMbma:AzrNUKW:AzrPMZy:AzrPRrQ:AzrPjBi:AzrTzQy:AzrVJDI:AzrdeGw:AzrerDF:Azrhikh:AzrsYPa:AzrwlUb:AzsFwbC: +AzsfApT:AzsniYH:AzsocAt:AzsqTbD:AzsrYaE:Azsshid:AzsuavQ:AztDPOl:AztDywa:AztEKdi:AztdkGy:AzttSIK:AztvepP:AztwcaC:AzuAjgd:AzuPFNk:AzuUAJz: +AzuUbYC:AzuVMLE:AzuXOeN:AzuZXTg:AzuZrDV:AzucJhw:AzueMGy:AzufFRw:AzuhQXO:AzumQGk:AzuquaN:AzuxWpr:AzvBSYF:AzvJbVo:AzvLTF:AzvOliQ:AzvOqiy: +AzvPKIu:AzvVjGO:AzvaaCg:AzvavBN:AzvnQxD:AzvwuAE:AzwCELJ:AzwFkbz:AzwNQYR:AzwPwDx:AzwTqev:AzwWRqc:AzwXRqC:AzwZafJ:AzwbKGB:AzwbXFQ:AzwcOCm: +AzwfiTt:AzwkHSa:AzwkOhr:Azwnkcp:AzwsovQ:AzwvrkQ:AzwzRAx:AzxKgdE:AzxQhDI:AzxRnyA:AzxTggv:AzxVBTU:AzxXxR:AzxYqEY:AzxbknS:AzxfMeo:Azxfegs: +AzxwKgm:AzyJbMC:AzyRyUh:AzyhJuY:AzypxvT:AzysiKJ:AzytqJt:AzzCxCB:AzzFiNv:AzzHzPF:AzzTZSu:AzzaanO:AzzeMR:AzzeYPh:AzzilUk:AzzneUI:AzzpfDt: +AzzsDtS:BAADcEz:BAAGHjA:BAAHVCl:BAAJrbd:BAATdwD:BAAXNma:BAAbQOG:BAAdWw:BAAfbui:BAAkJjD:BAApSAx:BAArgQJ:BAAurQo:BAAwyPG:BABMHJH:BABMIVR: +BABOAFS:BABRNlx:BABVJuT:BABZdWM:BABbggm:BABhQoN:BABjVQI:BABrmJn:BABulBP:BACDFer:BACEWqI:BACGuDY:BACOuKE:BACayIb:BACiLjA:BACivGf:BACuqMi: +BADBuJO:BADCFgk:BADDCQA:BADDxGk:BADIBPC:BADLqqt:BADOGRr:BADRmnc:BADUukL:BADWAFw:BADaiow:BADoLJH:BADovgo:BADsRtD:BADuvTF:BADzcPM:BAECeCc: +BAEFSDK:BAEGtzn:BAEMCil:BAEMHTY:BAEOjC:BAEQiKd:BAETuNz:BAEUoKW:BAEWuFm:BAEXuFM:BAEZgHc:BAEZtcZ:BAEblyi:BAEdHPO:BAEdOJk:BAEguYn:BAEkyha: +BAEvzTm:BAFBJLm:BAFGKDp:BAFIecl:BAFMEPs:BAFbfjc:BAFcJiW:BAFdoSk:BAFiLRq:BAFjqXz:BAFlQnc:BAFuUXW:BAFwlYF:BAGLkme:BAGOqzr:BAGRoAu:BAGdSlL: +BAGdVGM:BAGwPKV:BAHFRQp:BAHLkpl:BAHPweq:BAHUqZy:BAHfhHw:BAHiSLg:BAHiVgf:BAHjMah:BAHvtdO:BAIBcwB:BAILxAF:BAINPzB:BAIOZOD:BAIPbuW:BAIPsw: +BAIRNET:BAIVszH:BAIWdwc:BAIgVqg:BAIotix:BAIsXoM:BAItjJA:BAJASFJ:BAJCGUi:BAJFyaQ:BAJGYoT:BAJJCm:BAJLpoi:BAJMceJ:BAJSSSL:BAJSrBT:BAJUZoS: +BAJZXFM:BAJexO:BAJhPxs:BAJkgqz:BAJobUY:BAJutIo:BAJzFJL:BAKEZUT:BAKGFeY:BAKLIKA:BAKLxwq:BAKVZAP:BAKWMAk:BAKYImh:BAKjTvy:BAKjvoh:BAKmFpy: +BAKokWl:BAKwcpo:BALBoMM:BALBwil:BALLDzg:BALNWQY:BALOqqm:BALTIkz:BALTxWJ:BALWCQX:BALWxGr:BALXUCD:BALYqIM:BALdShg:BALpQrE:BALqsrL:BALrTVB: +BALrvOS:BAMBlej:BAMEbre:BAMGHuo:BAMJBsX:BAMLgHj:BAMLtcS:BAMNbai:BAMXSDB:BAMYTwW:BAMZrmm:BAMdczF:BAMmYxP:BAMrTwf:BAMrUxq:BAMutue:BAMwgVn: +BANDscJ:BANNokg:BANOBSa:BANPZuC:BANTbAp:BANVHti:BANWlES:BANeraq:BANfyNx:BANgvMm:BANhZh:BANhaoi:BANiUGV:BANlnRv:BANsYXI:BAOHObX:BAOMZlf: +BAONSMd:BAOQCcE:BAOSlYe:BAOWCIH:BAOWMrj:BAOahVq:BAOcMVN:BAOgubk:BAOikxh:BAOvfzy:BAOxpOG:BAOzCFF:BAPATqd:BAPIyBD:BAPPcLZ:BAPRowo:BAPSxfF: +BAPWZz:BAPZSYt:BAPbgdx:BAPbpVp:BAPouBR:BAPxRES:BAQBVAq:BAQIpOW:BAQOxAo:BAQUbN:BAQUcwk:BAQYafc:BAQeXoD:BAQfFjR:BAQgjJh:BAQkzVi:BAQocC: +BAQrlbw:BAQsMfO:BAQyJVR:BAREQQy:BARHVah:BARILJe:BARMXFj:BAROpoN:BARRxwx:BARSMYg:BARTQWx:BARTVZT:BARZEIm:BARlFJK:BARpypp:BARqzvp:BARzSao: +BASCssJ:BASFkSD:BASOkNs:BASQzYP:BASSARn:BASVqio:BASYiSL:BASbkWu:BAScNop:BAShFrc:BAShtZR:BASiRi:BASlXXm:BASmPpZ:BASsNfU:BAStFBj:BASzCQ: +BASzrdj:BATAqqf:BATLksM:BATMBEJ:BATWzyY:BATYONK:BATkyiY:BATzYUm:BAUDLiv:BAUFiKV:BAULTwl:BAUNgxI:BAUPjFH:BAUSRzx:BAUWnnF:BAUbrAS:BAUcaOK: +BAUfUgt:BAUgnrT:BAUjgVU:BAUpyhS:BAUscCe:BAVABSh:BAVHNE:BAVHlnj:BAVIlEZ:BAVKhVU:BAVRuAv:BAVSgXb:BAVTzlt:BAVajk:BAVkcZv:BAVquyw:BAVuyHx: +BAVvkrO:BAVxJia:BAVzwGq:BAWAkms:BAWIIPj:BAWUHdw:BAWUkEe:BAWiGDy:BAWiOyG:BAWkYbd:BAWkpOX:BAWmCFY:BAWpGmn:BAXAzIg:BAXDowf:BAXEwec:BAXFyWq: +BAXJJmE:BAXJKCu:BAXNIpE:BAXOrJp:BAXQCix:BAXQMRZ:BAXTZNC:BAXWSmt:BAXXpod:BAXZCCU:BAXcqDy:BAXoGdv:BAXoOYH:BAYBrun:BAYDYOq:BAYGEiO:BAYOxWZ: +BAYPGuL:BAYgPXV:BAYjxfC:BAYrgGq:BAYxQOR:BAYzVqU:BAZHNlo:BAZYKmb:BAZZxde:BAZfZSy:BAZhmJy:BAZoCS:BAZpxFH:BAZxggz:BAZyeRK:BAaFxDg:BAaIuVv: +BAaQSfF:BAaSGue:BAaWYOX:BAabJjx:BAaderi:BAaegGX:BAafiaU:BAalrQS:BAamxfj:BAbFHJD:BAbISSy:BAbIrBa:BAbOZEI:BAbUxnl:BAbagqO:BAbebUl:BAbjJJA: +BAbkgga:BAbleRP:BAbniAl:BAbqQoB:BAbsxFS:BAbtrqj:BAbvypB:BAcCIKV:BAcCxwf:BAcHssd:BAcKDZK:BAcPfZA:BAcRomA:BAcZkO:BAccFpN:BAcdiOb:BAcmcpX: +BAcoXqZ:BActSHk:BAcvRTQ:BAdAist:BAdDWQL:BAdJSo:BAdJnP:BAdLGak:BAdRZuZ:BAdScYW:BAdWoMx:BAdWwiY:BAdcJhY:BAdcVJm:BAdcVwR:BAdlCme:BAdtqml: +BAdxLJD:BAdxvgc:BAdzNsY:BAeAZvg:BAeBlDx:BAeHRzV:BAeMtKG:BAeTsCF:BAecZJS:BAecnDE:BAedfJp:BAeeJID:BAegwgT:BAehcCK:BAeocSK:BAeonex:BAevynt: +BAewvma:BAexaOe:BAeyUgZ:BAezltS:BAfBech:BAfDXLk:BAfFSSj:BAfFwhK:BAfHldO:BAfIZVP:BAfLCIg:BAfLHtR:BAfPiko:BAfUBj:BAfUtkp:BAfVtZe:BAfXgXp: +BAfalYb:BAfby:BAfgCRI:BAfjfdP:BAfkfjg:BAfmJis:BAfowGc:BAfuQng:BAfvuye:BAfwnEO:BAfzyHj:BAgHqzv:BAgOkPc:BAgQTQp:BAgYybP:BAgaPKr:BAgdkuT: +BAghhhX:BAglMAG:BAgrgDl:BAgrpvd:BAgtLRo:BAhAoaz:BAhKkMj:BAhOCCc:BAhYztT:BAhkLrD:BAhsMal:BAhwfdP:BAhzGMw:BAiDVCO:BAiEGuZ:BAiGNLr:BAiJyAb: +BAiPdwg:BAiTEn:BAiTNmB:BAiUQqM:BAiYLjQ:BAibbuJ:BAieJjg:BAihFBk:BAiiMfb:BAingQi:BAjBuvf:BAjMrUw:BAjOyaM:BAjUsZC:BAjVdWh:BAjZNMM:BAjdQok: +BAjfVQl:BAjliTp:BAjmFbD:BAjnmJK:BAjqPxo:BAkDomZ:BAkGmNm:BAkHmNM:BAkLqiz:BAkNBpM:BAkQqQz:BAkcLjf:BAkcvGA:BAkivth:BAklLPU:BAkoqMN:BAkpArs: +BAkwCMG:BAlDZuS:BAlGIMO:BAlIoMq:BAlIwiP:BAlMmnf:BAlVMal:BAlXIMo:BAlgQry:BAlmRta:BAlovTc:BAlvcPh:BAmAllQ:BAmCtzK:BAmQHuC:BAmSZUV:BAmUgHf: +BAmWbae:BAmXlNV:BAmntui:BAmoqxp:BAnCKDS:BAnEecO:BAnHuAC:BAnIrMh:BAnMscV:BAnVHUj:BAnawGd:BAnkeag:BAnknmW:BAnlkrz:BAnqTWc:BAnqUXt:BAoFPnN: +BAoQzis:BAoToWr:BAoUwEw:BAoVywe:BAoZJMQ:BAoZKca:BAobiif:BAokhhq:BAomhrO:BAomrOP:BAomtLf:BAosqdm:BApBRQo:BApHkps:BApNPNw:BApQqZf:BApTGPD: +BApeMaW:BApfSLX:BApfVgY:BApifdk:BApmkUD:BApuOIa:BApzPkb:BAqExWe:BAqFMyz:BAqHxAk:BAqJPzo:BAqKVAu:BAqLLjx:BAqRsze:BAqSTct:BAqSxvT:BAqXJwF: +BAqXQwE:BAqXVzi:BAqZruQ:BAqarQE:BAqffJN:BAqoFjV:BAqpFjv:BArHpoJ:BArNxar:BArQVal:BArRbUc:BArYTCm:BArYxVM:BAralBj:BArdSaK:BArgJvo:BArjzvt: +BArkkCD:BArtXOY:BAruFJO:BArvjju:BArxJvO:BAsGCyB:BAsHIKd:BAsHxwT:BAsIFGL:BAsNuyA:BAsRZAu:BAsToXq:BAsXkNO:BAsdXqh:BAsgIxM:BAshapI:BAsiFdT: +BAsnOio:BAsohKv:BAsqrdV:BAtGZuH:BAtHcYE:BAtIBI:BAtRsSO:BAtSRNl:BAtUIC:BAtUqIj:BAtXisI:BAthtWE:BAtnioI:BAtqFDm:BAtrNOu:BAtuLpE:BAtxsG: +BAtyrDo:BAuAnnz:BAuRtKU:BAuUTwp:BAuYjFT:BAuiYxw:BAujlVc:BAulvms:BAuqtuB:BAusgVI:BAutcSY:BAutnej:BAvEikQ:BAvHHUs:BAvJZuf:BAvUhVy:BAvVnNA: +BAvaraT:BAvbaoL:BAvdlTz:BAveUGs:BAvfnRS:BAvoYXl:BAvrccb:BAvwtUY:BAwBYlV:BAwFsaI:BAwHywb:BAwLJMV:BAwLKcf:BAwNlYf:BAwOSyN:BAwPIPV:BAwWoWU: +BAwXPnI:BAwekxK:BAwggDB:BAwgpvJ:BAwpGDE:BAwrYbX:BAwrpOd:BAwtCFe:BAxARWr:BAxAWNH:BAxAobD:BAxCyBi:BAxPyWU:BAxSgWG:BAxTken:BAxXIpa:BAxchve: +BAxoGMe:BAxxGdr:BAxxOYL:BAxzYBo:BAxzpoS:BAyAXfL:BAyCpOh:BAyLdca:BAyOHhb:BAyPJUl:BAyVHjP:BAyVIvJ:BAyYSsm:BAyYrbu:BAynMfP:BAyoSAi:BAyubux: +BAyzJjU:BAzCLJH:BAzDVaE:BAzGXFG:BAzMMYJ:BAzNxwU:BAzQNlk:BAzUJuG:BAzatIE:BAzrFbr:BAzvPxY:BAzyVQZ:BBAFXsj:BBAQMLe:BBAQsQK:BBAQtwh:BBASgBh: +BBASiLs:BBAVYvP:BBAWyxU:BBAaxkT:BBAcICm:BBAdEEd:BBAeCJT:BBAeGpU:BBAfIVX:BBAkqxv:BBAmXQg:BBAnYgv:BBAxpor:BBBArys:BBBFBlo:BBBGCnz:BBBHFMu: +BBBHIJF:BBBJOzu:BBBNMYb:BBBOCR:BBBUzBW:BBBWfrZ:BBBclGZ:BBBgRsp:BBBkHJ:BBBnrCe:BBByulp:BBBzVxk:BBBztaz:BBCDwOq:BBCFfps:BBCHSDi:BBCKdmF: +BBCOxjK:BBCPFmL:BBCROZL:BBCcfGC:BBCdIxo:BBChnXS:BBCmCGU:BBCoxFW:BBDIUvG:BBDJTmF:BBDRLrk:BBDUBed:BBDWhbn:BBDZbdY:BBDbVzU:BBDcEwP:BBDdwWf: +BBDjNrL:BBDkpWF:BBDtCmG:BBEAzAl:BBEBLss:BBEKpIj:BBEPKJk:BBETStM:BBEUPJJ:BBEVZlB:BBEawet:BBEbCTP:BBEcNsN:BBEiEWO:BBEmGap:BBEoNRs:BBEuRvv: +BBEwVZj:BBExAxn:BBEyuPQ:BBEzLCX:BBEzdLn:BBFBQmZ:BBFCWHw:BBFGKGO:BBFIKJL:BBFLWRr:BBFLxil:BBFNNkk:BBFVZkj:BBFXouY:BBFfmVk:BBFjFSW:BBFqHAp: +BBFsmAO:BBFtnhv:BBFwUuj:BBFyKoi:BBGHQMa:BBGKWhL:BBGOKgt:BBGQKjw:BBGQtfg:BBGVPwZ:BBGYYUG:BBGdKBC:BBGeRIH:BBGegZK:BBGfYHb:BBGlmvP:BBGrPAs: +BBGtlex:BBHJXaQ:BBHJttq:BBHORuK:BBHOsdS:BBHRvVp:BBHYPXV:BBHdpOl:BBHesVW:BBHkYGH:BBHuxxE:BBHxdWe:BBIDCWa:BBIEgBa:BBIEiLz:BBIKJLh:BBIKjbe: +BBIPXAF:BBIPtTf:BBISzJK:BBIUqFv:BBIXvvg:BBIbKTO:BBIdhkw:BBIfkSI:BBIimQY:BBIzxXr:BBJBMYY:BBJIfra:BBJKFMn:BBJLizp:BBJSSdK:BBJTzkD:BBJVDjy: +BBJVKDE:BBJYCnA:BBJiQZZ:BBJjCgw:BBJlqEF:BBJoIXM:BBJsnxq:BBJxTMS:BBJxfeb:BBKDOZE:BBKGMyr:BBKHMyR:BBKNbGR:BBKQQfe:BBKZrYc:BBKendd:BBKiVCw: +BBKllgJ:BBKoQzQ:BBKpaEl:BBKwczX:BBLDLrr:BBLIhbw:BBLKzBb:BBLMWhp:BBLNiiX:BBLiaLG:BBLpyoh:BBLqiLA:BBLrRVP:BBLsAXH:BBLudlH:BBLvupw:BBLwNeW: +BBLwaiV:BBLzGAV:BBMBbLb:BBMGLyK:BBMMNYL:BBMNUyb:BBMQbDi:BBMSiIq:BBMXLyk:BBMcEvS:BBMcNzc:BBMnTBT:BBMoalN:BBMvyOa:BBMwYLi:BBMwilH:BBNEQmC: +BBNQKzt:BBNSPWx:BBNYiGm:BBNjtkF:BBNlHBd:BBNlKop:BBNqlEZ:BBOKQMJ:BBOLgGh:BBOOZKz:BBOUWrb:BBOZjzD:BBOZkTt:BBOgKBh:BBOhOlS:BBOljn:BBOmHEZ: +BBOmRxE:BBOsQSx:BBPACwO:BBPBpmS:BBPEvVI:BBPJSmY:BBPMXah:BBPMttH:BBPPRur:BBPPsdj:BBPRRbm:BBPTyXr:BBPazdQ:BBPmZAq:BBPwpOU:BBQJBBO:BBQLnrL: +BBQSXAa:BBQStTA:BBQaRfp:BBQlxXu:BBQtxkz:BBQvzDx:BBRBcnv:BBRCgVT:BBRFrya:BBRHUnU:BBRJIDK:BBRKwfs:BBRLIDd:BBRMUSc:BBRTZNx:BBRUjUg:BBRVaEF: +BBRVxkI:BBRZbrk:BBRfnxX:BBRjBzI:BBRkpZd:BBRsEwT:BBRyzKc:BBSDxjy:BBSGcNO:BBSIfpA:BBSNUNL:BBSRcLY:BBSRzvx:BBSXKyB:BBSdxFe:BBSgSwg:BBShAGD: +BBShuJH:BBSifSY:BBSnjg:BBSpBZP:BBTABvZ:BBTCZLo:BBTJBeV:BBTMTmt:BBTNUvu:BBTShCC:BBTfCTM:BBThLns:BBTkqYV:BBTmUNt:BBUANYu:BBUEzbR:BBUFyk: +BBUiyOx:BBUjLal:BBUnwwO:BBUpQOT:BBUqTBM:BBUsGaF:BBUtCdV:BBUtNRe:BBVFjZB:BBVFktr:BBVILNR:BBVPXQh:BBVSrE:BBVVctR:BBVdliD:BBVeOLu:BBVjFmN: +BBWEFKO:BBWFSVB:BBWLkTm:BBWNLnm:BBWOsNE:BBWXpYB:BBWctKv:BBWdoX:BBWeHbT:BBWgGsI:BBWgPAA:BBWpgsN:BBWpoNp:BBWrPxo:BBWryUS:BBWtcqn:BBXBphU: +BBXHJlM:BBXVXSf:BBXYUAw:BBXgLuD:BBXjaiy:BBXkALZ:BBXqxKX:BBXsIca:BBXtEeh:BBXuCjX:BBXuGPY:BBXvIvT:BBYDAQk:BBYHzJU:BBYLDTv:BBYPJLv:BBYYRUb: +BBYYsDz:BBYnmQG:BBYqGfL:BBYraIB:BBYuBBo:BBZGoyM:BBZMclg:BBZMzVF:BBZOOOB:BBZXSde:BBZYYJp:BBZbpgu:BBZeEwS:BBZgybK:BBZjlKR:BBZsfgO:BBZtIXc: +BBaFGRl:BBaHgK:BBaJMLy:BBaJsQW:BBaJtwt:BBaKpHE:BBaNNWI:BBaNkzq:BBaOXsv:BBaPXsV:BBaQzRA:BBaRUag:BBaYpw:BBadGfg:BBaedwg:BBakzDj:BBamNFD: +BBanCJH:BBanGpI:BBatqxj:BBavvFm:BBazxkH:BBbIXpf:BBbIcfL:BBbJutP:BBbPBlC:BBbTOzY:BBbWMYn:BBbXMYN:BBbbqEQ:BBbcSEX:BBbgrlJ:BBbkzbt:BBbmigV: +BBbsVPB:BBbunDx:BBbyVck:BBcADJG:BBcLcNa:BBcOzKz:BBcPrYv:BBcTzbR:BBcWiZN:BBcYOZp:BBcczkt:BBcfRSu:BBcgxoR:BBciVXn:BBcnfSw:BBcwqex:BBcxuLu: +BBdCsdE:BBdOETG:BBdPfK:BBdSTmJ:BBdcMYr:BBddCtc:BBdhRVe:BBdlupB:BBdpGAc:BBdqtkT:BBeIsDR:BBeKLsw:BBeSkSL:BBeUEtP:BBeYRZw:BBeaVZN:BBebEWK: +BBeeQOf:BBeicEQ:BBejwep:BBelFsH:BBfBFkb:BBfDZCw:BBfIPWe:BBfJrfW:BBfPKGK:BBfVpyO:BBfaUuN:BBfiThI:BBfjHAt:BBfnvPa:BBfomVo:BBfxOLG:BBgAKrD: +BBgAhSV:BBgDOvb:BBgEZKU:BBgGoUf:BBgJFKY:BBgKWrM:BBgKxIS:BBgLZcL:BBgMNKT:BBgRrFl:BBgXKgp:BBgpYHF:BBgumvT:BBgvvpZ:BBgyFsh:BBhCiap:BBhXXVj: +BBhZpmn:BBhbdWA:BBhciva:BBhhhKD:BBhlLuR:BBhmpOh:BBhqRFD:BBiIiAo:BBiKaQn:BBiNRUP:BBiNsDH:BBiXPxM:BBieLOQ:BBifep:BBiiOpA:BBijYgS:BBiokSE: +BBiqLUm:BBitsvL:BBiwjah:BBizZas:BBjAwff:BBjCxJU:BBjNYJB:BBjOzBp:BBjPdMx:BBjTxJu:BBjWcnC:BBjYfPM:BBjapZq:BBjfVPi:BBjiBxI:BBjjrCB:BBjtxfi: +BBjwSWk:BBjwioL:BBjxAgH:BBjxujD:BBjyfsU:BBkBzKc:BBkGbRe:BBkHfRf:BBkJFmi:BBkJIjZ:BBkKxjn:BBkWzbK:BBkXCNF:BBkYBLS:BBkiCGp:BBkkqeA:BBlDUvB: +BBlEKjq:BBlMrmG:BBlPUYW:BBlQNyy:BBlVWhl:BBlZPjP:BBlfpWC:BBljYyE:BBlnCmb:BBlpNeK:BBlpaiJ:BBlyyot:BBmMGOO:BBmNJqn:BBmOjlL:BBmXhBr:BBmZzbg: +BBmaLHf:BBmhtKd:BBmiGaS:BBmpYLe:BBmpilD:BBmqRvU:BBmrAxM:BBmtdLM:BBmuuPr:BBmvNER:BBmvaIS:BBmxalB:BBnCKGR:BBnGZCn:BBnJNkv:BBnMrfN:BBnPEWR: +BBnRZkw:BBnTfS:BBnXSDx:BBnZLGv:BBnjRiN:BBnjgzM:BBnpnhk:BBnstkB:BBnuKot:BBnwPau:BBoDQMN:BBoEWhc:BBoKKjX:BBoKtfH:BBoPKZy:BBoQOuE:BBoQwYI: +BBoRPwu:BBoSYUh:BBohvpQ:BBopleW:BBosHad:BBpFXal:BBpFttL:BBpMBbB:BBpNvVM:BBpOnRA:BBpQxqO:BBpSPXk:BBpXzjA:BBpZCwK:BBpaALu:BBpfZAu:BBpiIcN: +BBpoxxx:BBqBDTk:BBqISMT:BBqLXAe:BBqLtTE:BBqOvMX:BBqTvvD:BBqWxQF:BBqbkSj:BBqdmQZ:BBrEBlQ:BBrJwoV:BBrLfPT:BBrNXpt:BBrOrym:BBrhSEJ:BBrjSWr: +BBrjioU:BBrkIXh:BBrrTMv:BBrrfeG:BBruaeb:BBrzBa:BBsJwFv:BBsKfRM:BBsLUsf:BBsRgvQ:BBsUuTK:BBsWYjR:BBsYbRn:BBsandC:BBsbBXY:BBsjpza:BBskQzv: +BBsotAM:BBsqAGX:BBsquJT:BBsvtIx:BBsxzkf:BBtFbdg:BBtHTtl:BBtHjjY:BBtJBvV:BBtSUYl:BBtVRzR:BBtWUvy:BBtZSTl:BBtqLcY:BBtqdlo:BBtrhGy:BBtsNep: +BBtsaiq:BBtvily:BBtxNZm:BBuBZlh:BBuCLyn:BBuIBEQ:BBuLzbn:BBuRhcD:BBueCtJ:BBujZcP:BBukalk:BBurODY:BBusYLL:BBusilm:BBuuAxd:BBuwLCR:BBuwdLd: +BBuzqyQ:BBvAggb:BBvJSvq:BBvLLGq:BBvPjZn:BBvQsnv:BBvSiGN:BBvVmeQ:BBvaHep:BBvaRXo:BBvbmAu:BBvfUuP:BBvhHBG:BBvhKoS:BBvsonc:BBwBpYf:BBwCUBK: +BBwEBUP:BBwEapA:BBwLoUT:BBwPSVf:BBwSPxx:BBwUcTI:BBwWLni:BBwXLnI:BBwdOln:BBwgmaB:BBwkUUg:BBwyFMU:BBxCxhs:BBxDxqd:BBxInzx:BBxPYVx:BBxVGrx: +BBxZMlm:BBxZsqC:BBxaxxs:BBxfRFv:BBxhBbP:BBxtGFs:BBxudWs:BBxvXqo:BByBXvC:BByCvMa:BByDpMG:BByHnrQ:BByUDTr:BByixXH:BBylvFB:BByoZae:BBypxkg: +BBywmQC:BByzAle:BBzBUnv:BBzDIDh:BBzFIDG:BBzHOOF:BBzPoyI:BBzQjUD:BBzVCnK:BBzdTMy:BBzdfeH:BBzgpZG:BBzhxOF:BBzpfUA:BBzqybo:BBzrlGk:BBzuBzJ: +BBzvRsA:BCAAdnc:BCAAwcf:BCAEOly:BCAJRkd:BCAMzMH:BCAQRRc:BCARirI:BCAZsuI:BCAgwaC:BCAnkxC:BCApFgu:BCAsvIY:BCAurYD:BCAwBxK:BCAzDCz:BCBBIak: +BCBDTUV:BCBFhil:BCBIiHo:BCBMbGU:BCBPnpg:BCBQjtN:BCBQyrV:BCBTfpw:BCBUsZG:BCBVVlC:BCBZOcF:BCBbVxF:BCBgXhh:BCBnnBN:BCBrsRy:BCBxAKK:BCByIsp: +BCCARRA:BCCCOyM:BCCEEA:BCCEEjZ:BCCITuo:BCCPMRi:BCCUYYX:BCCVOIr:BCCYfPN:BCCZirN:BCCbcgm:BCCgPEz:BCCgUKt:BCCiLLf:BCCljsI:BCCqqrj:BCCtnbW: +BCCyZIE:BCCyyDO:BCDJKa:BCDLMcD:BCDQnQU:BCDQznM:BCDVtIU:BCDXFVb:BCDffkk:BCDgNXQ:BCDmGLH:BCDssuF:BCDtQeJ:BCEMBJc:BCEMnfN:BCENTbW:BCEUfdv: +BCEVrxo:BCEVxCB:BCEYnql:BCEYzNt:BCEZOfz:BCEcRrI:BCEdaaX:BCEfXkD:BCEgmMS:BCEhugB:BCEoRgQ:BCEoUEV:BCFAvJt:BCFCRjG:BCFbRRf:BCFcShS:BCFdiXH: +BCFgnjG:BCFjGQg:BCFmhYR:BCFmyWh:BCFrSOL:BCFsJQx:BCGGQxL:BCGSdTd:BCGZVHV:BCGgXQf:BCGihfK:BCGlkTK:BCGrqxX:BCGtLnn:BCGxSoU:BCGzvkl:BCHCqyW: +BCHEHCr:BCHFsUK:BCHHGwB:BCHHnrP:BCHJDrh:BCHMZIG:BCHYfJR:BCHfble:BCHgseV:BCHhcgW:BCHhdte:BCHloKG:BCHpkGV:BCHqDso:BCHverx:BCIDirB:BCIKSqi: +BCILJYd:BCIODRA:BCIPVDl:BCIckzh:BCIfvIr:BCIosld:BCIpClv:BCIpgjP:BCIqokn:BCIriFL:BCIsoPJ:BCIwOQr:BCIwkhK:BCIzziA:BCJFiRL:BCJHVlX:BCJLIOe: +BCJVJjX:BCJXWCD:BCJXhiw:BCJdtXF:BCJeAIE:BCJkDNM:BCJlIsK:BCJmXZi:BCJoiJp:BCJpTWa:BCJqnsJ:BCJtItA:BCJwiIs:BCKAZOM:BCKEilN:BCKLirG:BCKMVLs: +BCKNszw:BCKPBjw:BCKVbge:BCKadSp:BCKdTRy:BCKgsnp:BCKkAiN:BCKlZIl:BCKlyDf:BCKqDnF:BCKsXzb:BCKwnSA:BCLAEQZ:BCLCrXI:BCLCvnz:BCLCxcd:BCLKTBq: +BCLUbtb:BCLaGLw:BCLlsIa:BCLnnfI:BCLoUkK:BCLsDnj:BCLxnha:BCMGEqU:BCMHCBe:BCMLIGD:BCMMVBW:BCMRMGI:BCMVGBQ:BCMZbTM:BCMaNxa:BCMfeOG:BCMgaaq: +BCMmQEZ:BCMnZsP:BCMwysW:BCMyDNe:BCMzqNa:BCNDLID:BCNDXCw:BCNHACI:BCNaqcJ:BCNdSOW:BCNeJQc:BCNfvKn:BCNgiXs:BCNrvnM:BCNsRgV:BCNzeVv:BCOALzd: +BCODdVo:BCOFrJt:BCOJLiO:BCOQXRy:BCORyDD:BCOaEaP:BCOajkQ:BCOdqxQ:BCOfqCa:BCOfxPv:BCOgLnG:BCOjJqH:BCOmdDu:BCOokTb:BCOsGqW:BCPHhCI:BCPJryH: +BCPLfJu:BCPPVJh:BCPPaAp:BCPSulu:BCPZyfp:BCPfzIO:BCPmdGU:BCPoYCK:BCPvGhN:BCPwgwy:BCPxblb:BCPzNhw:BCQBmYO:BCQFdnQ:BCQFwcT:BCQLIjK:BCQOuIl: +BCQRfjb:BCQVaag:BCQfoPs:BCQlziX:BCQobOm:BCRByFY:BCRCOiY:BCRFozI:BCRFqZO:BCRFyrd:BCRJHGJ:BCRJNGM:BCRPlMB:BCRQOzK:BCRRPEv:BCRReqn:BCRSNDK: +BCRTLvF:BCRUIaY:BCRUkhn:BCRgLlm:BCRjiIZ:BCRkDeF:BCRndsR:BCRoqRa:BCRrZBj:BCRtAmB:BCRvUnI:BCSCBjl:BCSEIou:BCSEOCM:BCSOJJH:BCSQmME:BCSXPeO: +BCSXeQW:BCSYOZr:BCSgTRb:BCSoLLT:BCSuZKF:BCSvJCa:BCSwqrX:BCSyTwq:BCTAMcR:BCTMFVt:BCTQVFv:BCTVnQC:BCTaFsF:BCTiZcH:BCTknhH:BCTlSTQ:BCTlqjY: +BCTosIH:BCTtWLp:BCTxsuP:BCUDMGV:BCUFVfO:BCUGpuX:BCULbTR:BCURLMr:BCUVMCk:BCUYOQZ:BCUbbZv:BCUfvPX:BCUipKa:BCUoZCQ:BCUzgQX:BCVDQXg:BCVHOEV: +BCVJYUF:BCVOydf:BCVVxPB:BCVbBEp:BCVdXqM:BCVjjZS:BCVnSep:BCVznju:BCWRkuB:BCWSrhL:BCWYcDN:BCWakTY:BCWeGql:BCWmRrm:BCWnhfY:BCWpgGh:BCWqOlJ: +BCWqbbm:BCWrekm:BCWztwU:BCXCTgC:BCXMawA:BCXNVdk:BCXQdNo:BCXQwCj:BCXUOLu:BCXZRKh:BCXaYCB:BCXfDsA:BCXigwp:BCXmYvQ:BCXoQhr:BCXwwAO:BCYAjiJ: +BCYITGZ:BCYJcXg:BCYRGWU:BCYRnRG:BCYaNHG:BCYkuvD:BCYoZXE:BCYpDCo:BCYqaIm:BCYuiFr:BCYvokP:BCYxypc:BCZFpNA:BCZJtJV:BCZJvaF:BCZPRSZ:BCZQRrM: +BCZSOYA:BCZUEJV:BCZYTUc:BCZZhIl:BCZdZBm:BCZfOtU:BCZhPeV:BCZhUkX:BCZlDUG:BCZnBcU:BCZoLrb:BCZpLrB:BCZrcGa:BCZwPev:BCZwUkx:BCZyLlj:BCaBxmv: +BCaJBMi:BCaPjvE:BCaRHcL:BCaSylY:BCaVzMt:BCacaSA:BCadbOC:BCaesls:BCakkgh:BCamOQe:BCapBxw:BCaqLNy:BCascGi:BCavURt:BCbAqLe:BCbCRSC:BCbHNDU: +BCbIaAv:BCbLJjo:BCbOmmB:BCbSRrX:BCbSXnZ:BCbWOzu:BCbXOiG:BCbYYym:BCbbQjM:BCbgZBt:BCbkPeO:BCbkUkA:BCblLls:BCboudp:BCbpDeX:BCbrZka:BCbtTrE: +BCcAIAn:BCcAkHY:BCcGqll:BCcLbgP:BCcMvRL:BCcPjTK:BCcPqzx:BCcPyRS:BCcQOhv:BCcSVAR:BCcWHuE:BCcXihj:BCcYMRu:BCcaVXC:BCchInw:BCciLRR:BCcqPEF: +BCcqUKH:BCcujsU:BCcvXHm:BCdHfcK:BCdWEQA:BCdXCbq:BCdfGLL:BCdgpkj:BCdhXKY:BCdphTs:BCdqNXu:BCdtFst:BCdvdKh:BCdveoS:BCdwaAe:BCdzafH:BCeEtih: +BCeKMCy:BCeLTdd:BCeNfdr:BCePGF:BCeVBJg:BCeVnfJ:BCeYDMb:BCehUat:BCehVpN:BCekFSm:BCequgF:BCeufKV:BCexhtJ:BCfIyiY:BCfKCOb:BCfKrhA:BCfMVhK: +BCfQLZP:BCfVdty:BCfaeVi:BCfcoRS:BCfdYMc:BCfiRgi:BCfoOLE:BCfobBb:BCfqEAd:BCfqjKe:BCfvhYV:BCfvyWl:BCfwLNs:BCfzCOb:BCgBQhc:BCgEYuI:BCgFqC: +BCgIOYN:BCgIUKq:BCgOLBd:BCgPOYB:BCgPvji:BCgRRJZ:BCgfnJZ:BCggevp:BCggqQY:BCgrSHN:BCgvXUa:BChByHq:BChKjVg:BChMwOj:BChPyfk:BChRmyC:BChVwCX: +BChiryZ:BChjOqG:BChkBXU:BChlGhU:BChpFwa:BChrsLQ:BCiBqYR:BCiDHcw:BCiEsuN:BCiGjix:BCiHyhH:BCiMirN:BCiURkc:BCiZPEy:BCifsES:BCilkzd:BCipDSj: +BCiqrYc:BCisBxl:BCiyClz:BCjDKyD:BCjEMrw:BCjHknM:BCjNfpP:BCjOiRP:BCjSfRw:BCjUIOy:BCjUOcA:BCjddsg:BCjfXZu:BCjgcGs:BCjhiJl:BCjjnsV:BCjnAIY: +BCjoydq:BCjrZp:BCjtDNQ:BCjvJzp:BCjwTrn:BCkFmMr:BCkJRRh:BCkJXNj:BCkUirK:BCklXzn:BCknijw:BCkpnSM:BCksITF:BCktAiB:BCkzDnJ:BClBTBM:BClJrXu: +BClJvnF:BClJxcX:BClTMgZ:BClVVFC:BClWpUT:BClbSTD:BClbjDJ:BClbqjL:BClcUAj:BClcVPP:BClfUkw:BCliaAb:BCljWLe:BClrbzz:BClvYvl:BClvvpT:BClypkm: +BCmBnrV:BCmJTbz:BCmRrxB:BCmRvNq:BCmRxCo:BCmZFvv:BCmbgQK:BCmudGt:BCmwZsT:BCnAIRr:BCnDXrv:BCnEydK:BCnMXCs:BCniLNh:BCnjqcN:BCnjxpY:BCnlCOy: +BCnmSOS:BCnphjB:BCnqktM:BCnuGQx:BCoDzHR:BCoGAcF:BCoIrhS:BCoMdVk:BCoOrJp:BCoSLiK:BCoSXcx:BCoZKdv:BCoavNB:BCoevka:BComqxU:BCooqCe:BCooxPr: +BCopqCE:BCopxPR:BCoqCoR:BCotJql:BCozEaT:BCozjkU:BCpASQC:BCpAwOU:BCpIZId:BCpUfJq:BCpYVJl:BCpYaAt:BCpZcxS:BCpcseu:BCpdXZg:BCpegJZ:BCppZxQ: +BCpuOd:BCpyYCo:BCqEjvW:BCqHylK:BCqKmYS:BCqZHOP:BCqisEz:BCqkslA:BCqooPo:BCqsOQW:BCqskhn:BCquGHE:BCqvgWr:BCqwLNK:BCrEBJy:BCrEfRn:BCrKknt: +BCrMOiu:BCrPVai:BCrSHGF:BCrSNGA:BCrSups:BCrVZoC:BCrZvrw:BCrfIsn:BCrgDNh:BCrhcGJ:BCriXZL:BCrkiJU:BCrmnso:BCrqQMe:BCrsiIV:BCrtPSE:BCrzgTc: +BCsEjTy:BCsEoZL:BCsEqzJ:BCsEyRa:BCsGfBw:BCsJBjP:BCsJfrG:BCsPOZN:BCsRNdN:BCsTkHk:BCsUxYd:BCsXmMy:BCsfZIK:BCsfyDA:BCsgAii:BCsmDna:BCsnqrd: +BCsoXzE:BCssnSf:BCsvLLh:BCsyuDk:BCszDEC:BCtFFVx:BCtGvhG:BCtHcdV:BCtObtG:BCtWMgC:BCtYEKx:BCtabLF:BCtcgSo:BCtegtI:BCthsID:BCtiRRj:BCtjnfl: +BCttynj:BCtubzc:BCtvhTM:BCtyYvu:BCtyvpM:BCtzPWb:BCuEnqF:BCuGOfp:BCuKLzH:BCuLFvq:BCuPVfs:BCucWlu:BCugsUU:BCukStT:BCukjdZ:BCunsiM:BCuxZCM: +BCuznHM:BCvFrHq:BCvOzhp:BCvPCOP:BCvPrhs:BCvcXuJ:BCvdOLw:BCvdbBP:BCvfEAV:BCvfjKW:BCvkBEt:BCvmXqI:BCvxoRa:BCwBrJk:BCwFLiP:BCwFXcc:BCwJIrb: +BCwWzHI:BCwZQKK:BCwaqxn:BCwcxPI:BCwfSoC:BCwgJqw:BCwyhJR:BCxEGwH:BCxEnrZ:BCxLTgG:BCxMcxz:BCxRBRT:BCxRxMB:BCxawAk:BCxberR:BCxeFww:BCxsZxx: +BCxtbow:BCxwXZN:BCyMHOo:BCyTOlh:BCyUuLA:BCyZjiN:BCygwCG:BCyhgWm:BCykbON:BCyodga:BCyvwaR:BCyyZXa:BCyzFWN:BCzBJjr:BCzCTUG:BCzEWCN:BCzJRrI: +BCzLOYE:BCzNEJR:BCzQIaz:BCzQkhM:BCzWqLx:BCzYUuo:BCzcLlN:BCzkqRB:BCzlgTl:BCzqVxW:BCzxINc:BCzyLrF:BDAAAjB:BDADSpc:BDAGMFv:BDAKrYl:BDAKxEn: +BDALmYh:BDAOoQA:BDAUFIX:BDAVIyO:BDAWfwu:BDAaaFh:BDAbSeX:BDAcuEc:BDAgUOD:BDAjpxc:BDAmjQo:BDAtTsE:BDAuabF:BDBEdfx:BDBFEtV:BDBIeZb:BDBKRSq: +BDBKVeB:BDBOxWX:BDBPyGK:BDBStII:BDBZozR:BDBcrLo:BDBcunh:BDBkwGa:BDBpDlG:BDBpXnH:BDBsJON:BDBsQaH:BDBxNmq:BDBzGPX:BDCBFHW:BDCCNyZ:BDCMdFG: +BDCSRsN:BDCSXHc:BDCWxwg:BDCXJJg:BDCaEDo:BDCcGZG:BDCdQU:BDCdUlC:BDCknsi:BDCpCuV:BDCpmWd:BDCqggp:BDCtnvN:BDCxDCy:BDDCaHq:BDDElQw:BDDGkTr: +BDDJRag:BDDNxHo:BDDPCIh:BDDRiYn:BDDUxyj:BDDVYoW:BDDfgZd:BDDiQSb:BDDjlEt:BDDkQhR:BDDmcDe:BDDnsDO:BDDwEVO:BDDwEvx:BDDyHTm:BDETlbG:BDETxht: +BDEXahJ:BDEgNWQ:BDEnQsY:BDEqQHI:BDEtsdT:BDEwIsp:BDFGpnC:BDFHbfH:BDFOEv:BDFQjrr:BDFZtlR:BDFepvk:BDFpEyG:BDFrAbe:BDFrRve:BDGEdTU:BDGGnWs: +BDGGszh:BDGJUBT:BDGPzbo:BDGSrKt:BDGViaS:BDGXHhF:BDGYYgO:BDGZRRG:BDGfYwQ:BDGhluX:BDGimvP:BDGkbWV:BDGlGaQ:BDGlcgw:BDGnSuo:BDGvIK:BDGxEYp: +BDGzABR:BDGzRVR:BDHCvgy:BDHDfWW:BDHFFYj:BDHNnOc:BDHQvjm:BDHWzdG:BDHZLFJ:BDHaYoL:BDHazbF:BDHbaBd:BDHgixj:BDHhdEl:BDHityS:BDHjjqM:BDHoTSg: +BDHupXA:BDHwig:BDHyCLN:BDIBKEy:BDIKFyC:BDIKbaT:BDIRYmX:BDISoBX:BDIVOQH:BDIVQqN:BDIVYYe:BDIZbM:BDIZhlK:BDIZnlL:BDIbIaX:BDIdNXb:BDIgYOE: +BDIgzBO:BDIhabm:BDIndee:BDIotYZ:BDIwlGl:BDIxwpu:BDJANZk:BDJAZes:BDJLozk:BDJMHuv:BDJRXpj:BDJYCoR:BDJanVh:BDJfBqg:BDJhTTU:BDJuYen:BDJxdvC: +BDJzrYn:BDKJTbb:BDKOETF:BDKQmHS:BDKXXPc:BDKhBgK:BDKjGxb:BDKlBQn:BDKqfXG:BDKyzHI:BDKzXuW:BDLAlBe:BDLAxHV:BDLBvcU:BDLFkOX:BDLHkTK:BDLPfxZ: +BDLTmyV:BDLVVFk:BDLdnWC:BDLiEVV:BDLiEva:BDLorlW:BDLpsci:BDLwJpx:BDLweJZ:BDLxsnx:BDMCRAW:BDMETA:BDMGlbl:BDMJSts:BDMTqsf:BDMWqvK:BDMXonW: +BDMbiVO:BDMdcdU:BDMogzT:BDMrbnq:BDMsFTO:BDMtxZL:BDMvHma:BDMyNWZ:BDMzJqR:BDNHhdz:BDNMtlK:BDNNCsv:BDNVNyV:BDNlyHj:BDNrWJg:BDNzqcZ:BDOAbFX: +BDOINUo:BDOIXfG:BDOIbyQ:BDONhDs:BDOStLB:BDOfQkK:BDOjAvr:BDOlABU:BDOlRVU:BDOqyhC:BDPDvjJ:BDPEvvH:BDPFhLE:BDPFnLB:BDPNVyT:BDPPIlH:BDPPPEI: +BDPRoCn:BDPaSYD:BDPdqFf:BDPhxcU:BDPyiEo:BDPzlyJ:BDQDoQS:BDQLMFd:BDQZTai:BDQZVJy:BDQcxqX:BDQeIaA:BDQhvSl:BDQlUOV:BDQtziR:BDQvAqb:BDQxpNi: +BDRDXpa:BDRPRSc:BDRPVeP:BDRPXhN:BDRTxWJ:BDRYdPa:BDRYgKT:BDRZdfj:BDRbQed:BDRdzhk:BDRepv:BDRfNck:BDRgXUu:BDRiBqL:BDRnmwi:BDRvDct:BDRxnSD: +BDSKXPZ:BDSMnuf:BDSMyKC:BDSNlFs:BDSXxJe:BDSYLiR:BDSYWPf:BDSZvIi:BDSZygb:BDSbNMX:BDSdGpq:BDSmXun:BDSoBQW:BDSqTte:BDStYxi:BDSwGZy:BDSzDLn: +BDSzXNa:BDTAliL:BDTDoNQ:BDTHVFd:BDTJorF:BDTOCop:BDTSqCk:BDTUMpy:BDTWmyy:BDTXkOW:BDTaxzj:BDTkIRO:BDTkyFr:BDTwJQt:BDTwTU:BDTxJpW:BDTxeJu: +BDUGYBW:BDUIfXJ:BDUIrAm:BDUJqvR:BDUMahX:BDURoRy:BDUYqcT:BDUisCy:BDUmNAm:BDUmnwS:BDVAntX:BDVFNuM:BDVFXFe:BDVFbYs:BDVIMrr:BDVIdUD:BDVLxKZ: +BDVNbfz:BDVWYGJ:BDVcZBe:BDVeEyU:BDVgAbw:BDVgRvw:BDVjpvy:BDVjxQI:BDVqKCO:BDVqozv:BDVrRrk:BDVsgcd:BDVtbSd:BDVulej:BDWECSF:BDWGnTC:BDWHrKJ: +BDWNJbk:BDWQpNj:BDWbDld:BDWkGUi:BDWopVB:BDWoxqr:BDWpbWh:BDWqSuQ:BDWyYwo:BDXBeAw:BDXCOqo:BDXCQQi:BDXCYyB:BDXDJVq:BDXETAw:BDXEVjg:BDXPIGj: +BDXQAJN:BDXTSPo:BDXWMfz:BDXdpnW:BDXiQHI:BDXjOpg:BDXllyC:BDXozIL:BDXqafd:BDXrSET:BDXsueo:BDXwUoH:BDXzpXo:BDYCIcB:BDYDrYU:BDYForY:BDYGYmF: +BDYHeaN:BDYJJvH:BDYKOQV:BDYKQqP:BDYMTaN:BDYQQgd:BDYSrxB:BDYXnoT:BDYYAjw:BDYaxCE:BDYhAqe:BDYpEPv:BDYpbHm:BDYrJkz:BDYrqAL:BDYslYZ:BDYwziu: +BDZAozY:BDZCciY:BDZMRUQ:BDZMVcq:BDZRFhC:BDZSNYN:BDZaGPS:BDZfqnf:BDZizXl:BDZmdvq:BDZpauG:BDZsGzS:BDZtULW:BDaHYmo:BDaIorp:BDaKeag:BDaMJva: +BDaNvJs:BDaTkRG:BDaUmYt:BDaXKEN:BDabQhY:BDacbHD:BDadJks:BDadqAE:BDaelYS:BDakAqL:BDampNG:BDapIbl:BDatDXd:BDavxqv:BDawClp:BDaxIao:BDazNXU: +BDbCHuc:BDbEFhd:BDbeGzT:BDbgULp:BDbmnSz:BDbxBGW:BDcBJJC:BDcEETm:BDcKFHS:BDcjggt:BDcmUlG:BDcsujU:BDczEDk:BDdGEUW:BDdRyWl:BDdSRac:BDdWlBX: +BDdWxHk:BDdZvch:BDderlj:BDdmJpE:BDdmeJg:BDdrQSf:BDdtlEP:BDdwsDK:BDdxsDk:BDdyISO:BDeBahn:BDeDlqh:BDeFktm:BDeLYBa:BDeMqvd:BDeOCiw:BDeQiyq: +BDeQpWC:BDeTxYu:BDeUYOH:BDeYRAx:BDegHtR:BDelVEj:BDeoHAa:BDesBwL:BDevEVg:BDevEvP:BDeylek:BDezQHM:BDfAIYp:BDfJyB:BDfKGaE:BDfNMrD:BDfNdUr: +BDfQbfL:BDfVUgI:BDfYXFS:BDfYbYE:BDfhWJz:BDflnck:BDfnbwe:BDfpqcG:BDfzAVf:BDfzzsi:BDgCYgc:BDgDYcI:BDgHrYe:BDgPjRI:BDgQWdR:BDgQszD:BDgVpNx: +BDgYzbc:BDgalEC:BDgcCLS:BDgiKqE:BDgoDkS:BDgsSNr:BDgtpVP:BDgwSuc:BDhDKeL:BDhEIGx:BDhHXrU:BDhJFiF:BDhMvgE:BDhaDxF:BDhgSEF:BDhkaBx:BDhpixv: +BDhqdEp:BDhsxQT:BDhuIAM:BDhwNxw:BDiCMFQ:BDiKoQf:BDiMnof:BDiOKCC:BDiOiJt:BDiUFyo:BDiUbax:BDiZIgA:BDihtYV:BDiijQH:BDinTsb:BDipYOI:BDipzBC: +BDiqaba:BDiviXo:BDiwdei:BDixClK:BDiyxqM:BDjHNZW:BDjHZeO:BDjOlQy:BDjPCon:BDjcNQ:BDjeaui:BDjfwGd:BDjhnVT:BDjrNmT:BDkGdFd:BDkLHUs:BDkMZv: +BDkMcIn:BDkPNzn:BDkPZEv:BDkWRuf:BDkWVCF:BDkXCOW:BDkaCKL:BDkeujR:BDkmGZL:BDkoAMW:BDkpnvm:BDkqBgG:BDksGxn:BDkwdVF:BDkxSbE:BDkyryk:BDkzNMm: +BDlFRaZ:BDlJlBa:BDlJxHR:BDlNiYS:BDlNpwa:BDlOxyW:BDlRYoj:BDlWYbC:BDlYray:BDlZqVF:BDlaAwv:BDlaIRd:BDlayFY:BDlcHRl:BDlfQhO:BDlgcDX:BDljjZf: +BDllNwW:BDlwVeH:BDlyscm:BDmAvCX:BDmEkoU:BDmLRAS:BDmPlbh:BDmVRcp:BDmbDOr:BDmcBiq:BDmcogV:BDmhEVl:BDmiHre:BDmkiVK:BDmlQHF:BDmojzO:BDmtBiQ: +BDmtogv:BDmvJPu:BDmvejW:BDnBxKu:BDnDbfU:BDnVtlO:BDnYntw:BDnhQKf:BDnlzsP:BDnmlUR:BDnrDLP:BDnzWw:BDoDJbV:BDoFdYC:BDoGMRT:BDoGdub:BDoKDeJ: +BDoKWhO:BDobdHS:BDoiqCW:BDoqWjj:BDorEYS:BDpBiDG:BDpGKes:BDpJSPB:BDpKXrj:BDpOhLA:BDpOnLF:BDpRmyI:BDpSICV:BDpTryA:BDpVoRM:BDpWYMR:BDpXeAZ: +BDpcixI:BDpdCLM:BDpkTSD:BDpnJXi:BDpqxcQ:BDpxAQq:BDqBIya:BDqDvGu:BDqHidH:BDqHoHp:BDqRjAu:BDqTvVC:BDqUHBz:BDqUwhI:BDqZrYN:BDqczBj:BDqslGI: +BDrFvMy:BDrMXpm:BDrRlfD:BDrSCou:BDrdTTr:BDroYeI:BDrpXUy:BDrsSBg:BDruNmO:BDrvrYI:BDrwGPf:BDrzGzn:BDsBxJY:BDsDnP:BDsDvIU:BDsGdpF:BDsGgks: +BDsNoZG:BDsXdpf:BDsXgkS:BDsYmLK:BDsdBgn:BDseDCs:BDshBQK:BDsjTty:BDsmmWn:BDsqQEc:BDsszHl:BDsuNCl:BDsvXur:BDtGIkm:BDtIqSl:BDtLEUi:BDtTorj: +BDtbSjh:BDtcEVu:BDtcEvB:BDtkHMk:BDtlscJ:BDtpJQx:BDuClbq:BDuCxhB:BDuDCie:BDuPlIw:BDuSqvV:BDuTMPB:BDuVmYB:BDuWiyC:BDuWpWq:BDuacdh:BDudEL: +BDujAWf:BDujIrt:BDujyfI:BDukEVu:BDukEvB:BDupxZQ:BDuvJqO:BDuzsNl:BDvAJBt:BDvBhdU:BDvItld:BDvNjrD:BDvPUbu:BDvRvoL:BDvancy:BDveSK:BDvfhu: +BDvfyHE:BDvkQKM:BDvlYWp:BDvoAVt:BDvqAbS:BDvqRvS:BDvrGAp:BDvrcGV:BDvsQwj:BDvtSUN:BDvuImL:BDwENUR:BDwEXfz:BDwEbyl:BDwVYgU:BDwXMRm:BDwYdYz: +BDwbZbz:BDwdEYJ:BDwfABh:BDwfRVh:BDwpKcP:BDwpoZi:BDwtlEu:BDwuAvo:BDwvnCB:BDxAvve:BDxJIle:BDxJPEd:BDxKyrq:BDxLoCC:BDxWryh:BDxYoRd:BDxaUol: +BDxbdnD:BDxmvsV:BDxrQHM:BDxsEpK:BDxsbhP:BDxtJKg:BDxtqaQ:BDxulyG:BDxyzIh:BDyBnop:BDyDKCU:BDyDiJb:BDyHMFG:BDyKmYY:BDyOIgW:BDySSpR:BDyTocz: +BDycSyP:BDyflGV:BDygJxy:BDyipxR:BDyqSei:BDyyOPZ:BDzBnUx:BDzDlQk:BDzIgiQ:BDzOviw:BDzPxWo:BDzRJjO:BDzTFVW:BDzUEta:BDzbNcN:BDzeakS:BDzgkfD: +BDzjmwL:BDznnVf:BDzoqnz:BDzrDcQ:BDzyYXw:BDzzgGx:BEABsgm:BEAFPOs:BEAIcaR:BEAKtFT:BEANBwj:BEAOkse:BEASdrI:BEATkiL:BEAWXxy:BEAcNJr:BEAeSeA: +BEAhCoz:BEAiqUV:BEAjsNJ:BEAkvMO:BEAmcSI:BEAtmCD:BEAvWsC:BEAwlSY:BEBEhlD:BEBGfw:BEBJGkG:BEBYPmc:BEBassS:BEBbcmu:BEBcale:BEBdILY:BEBdpvc: +BEBiuBC:BEBpsdf:BEBqCEV:BEBycmD:BECNxxy:BECPard:BECUbqK:BECZVCZ:BEChXNZ:BECjGML:BECjwzr:BECkANG:BECkdsG:BECkolI:BECspZA:BECvkWD:BECyJTG: +BECzRqF:BEDAADh:BEDCNTB:BEDFgnK:BEDHBdY:BEDOpXH:BEDPlSq:BEDVaRo:BEDcobO:BEDeRlI:BEDfBxb:BEDgKuj:BEDnArV:BEDnJtl:BEDpGmG:BEDpwZy:BEDyedg: +BEDzaeB:BEEATUy:BEEDrPA:BEEEvSW:BEEJJif:BEEOCsz:BEEPthg:BEESKWc:BEEYJGs:BEEeeQ:BEEfxYE:BEEijLV:BEEkeJX:BEEoadr:BEErhQm:BEEwEYw:BEExEYW: +BEEzMAw:BEFApvL:BEFCGau:BEFOJIQ:BEFRRJ:BEFTVHR:BEFUArw:BEFVtHp:BEFainf:BEFfvZg:BEFpcYx:BEFxhqz:BEFxxxk:BEFyWRI:BEGAYIr:BEGDQfr:BEGJBSp: +BEGKKuH:BEGLKZQ:BEGLglw:BEGPAqC:BEGQcEW:BEGTntH:BEGWteV:BEGXWLv:BEGfVHe:BEGpWff:BEGutco:BEGxigO:BEHBKas:BEHCKzH:BEHCgLn:BEHKQFk:BEHQImC: +BEHZobv:BEHaROC:BEHbGBT:BEHeMVP:BEIBTaC:BEIEkNl:BEIFpMM:BEIGVUo:BEIIptC:BEIOsoT:BEIQHOa:BEIVjMq:BEIWQzA:BEIXPOz:BEIdcMb:BEIercf:BEIoQvJ: +BEIoyaF:BEIpbcu:BEIxlSp:BEIyWsj:BEJCPCr:BEJCRqG:BEJJVSB:BEJKgno:BEJMdkR:BEJOiJD:BEJPfCR:BEJQQYN:BEJVHoX:BEJYqhG:BEJdsQY:BEJfBxb:BEJmmct: +BEJpoQS:BEJqCOJ:BEJssnz:BEJtIpe:BEJvbCl:BEJxYSy:BEKCarM:BEKHFoE:BEKQJaB:BEKRnQK:BEKZVkS:BEKapUM:BEKdAOZ:BEKepZH:BEKkHBt:BEKkXNs:BEKlTTW: +BEKnSlP:BEKpCqD:BELAaoc:BELClSj:BELKBdB:BELQfVv:BELbOaG:BELcwZb:BELdXAO:BELlAoc:BELlkXd:BELqHbM:BELqXnJ:BELsJgM:BELsRQV:BELtAQd:BELtTtn: +BEMApSJ:BEMKXdc:BEMLJGZ:BEMLSCW:BEMOswU:BEMRARI:BEMWdZY:BEMXIEP:BEMbTLj:BEMcWJC:BEMdhQd:BEMdxXu:BEMeVka:BEMgIaY:BEMkTQw:BEMkvDB:BEMqRNU: +BEMreCW:BEMrfAB:BEMtWJc:BEMuKmN:BEMutrc:BEMviQu:BEMxxYL:BENAGXi:BENCdnc:BENGMhk:BENJPwD:BENKoRN:BENRJgC:BENRScN:BENSYRL:BENUylc:BENcHud: +BENcyki:BENeXMc:BENiJDI:BENkNEc:BENmAOe:BENoGO:BENpNzI:BENpTdP:BENqTqn:BENsIkx:BENvKQW:BENwTlS:BEOXUEc:BEOaGMq:BEPJYib:BEPMpjh:BEPNqQA: +BEPPLsl:BEPPpfp:BEPPrIE:BEPUCDl:BEPiGmF:BEPnEjD:BEPneki:BEPogyI:BEPpaWP:BEPugiK:BEPyWFv:BEQEqHE:BEQIQzZ:BEQJbmm:BEQPykd:BEQYVUt:BEQYjrD: +BEQcbcN:BEQfLss:BEQftyk:BEQhqTj:BEQlcWa:BEQleby:BEQnHry:BEQpAPU:BEQqIPG:BEQwcMY:BEQxGuK:BERNQZq:BEROjmA:BERdaVq:BERhAcK:BERkYSP:BERlLSx: +BERnSyk:BERnqta:BERqGbf:BERsoQz:BERvalS:BERwIpL:BESAEfO:BESDbvQ:BESKCiZ:BESKFiL:BESQZgb:BESRxVs:BESYOm:BESbSlo:BESbaRb:BEScdqr:BESenpm: +BESkkWR:BESniMX:BESxDWj:BETDpXZ:BETQLnf:BETTVKc:BETZDme:BETZwJc:BETcArD:BETgarM:BETmFSH:BETmWAx:BEToaeP:BETqbpc:BETtimW:BEUByLA:BEUDCsH: +BEUWtzc:BEUgIpR:BEUhdJK:BEUhmue:BEUnjLd:BEUqScn:BEUsIVk:BEUyIaB:BEVEuVI:BEVFYRe:BEVHsWe:BEVNrpX:BEVRYzd:BEVYCSc:BEVeIkq:BEViTlZ:BEVmIPY: +BEVnWRg:BEVrmQW:BEVsjlO:BEVunRP:BEWDZVZ:BEWKUEz:BEWKXke:BEWZXqd:BEWbqkn:BEWeWfx:BEWjokf:BEWvgtT:BEWyTXZ:BEXJTAR:BEXQUes:BEXQXKl:BEXRKgs: +BEXUopr:BEXVKzf:BEXZAQt:BEXhqKg:BEXlUjY:BEXosnl:BEXpoKo:BEXtgco:BEXtzqM:BEYHgND:BEYIdrR:BEYJdKy:BEYMXxb:BEYNhub:BEYPPcY:BEYPRQl:BEYUhLP: +BEYZGKS:BEYaavS:BEYmlSB:BEYnqUm:BEYqsSG:BEYrcMa:BEYsaLq:BEYtIlM:BEYtpVw:BEYyubW:BEZDiJV:BEZHuJR:BEZOknG:BEZXRqU:BEZYyKt:BEZaSyp:BEZaqtz: +BEZesue:BEZgaVj:BEZoeQm:BEZucwq:BEZueBi:BEZvquT:BEZwHRi:BEZxTvM:BEZyQVa:BEZyyAm:BEZzcsK:BEaDQRF:BEaIjzX:BEaJbAL:BEaMGKt:BEaSRQK:BEaZVsN: +BEabvMs:BEacraj:BEadcMf:BEagIlj:BEagpVP:BEaiMMa:BEainMq:BEajNJN:BEatsqU:BEavBXn:BEbBOWA:BEbCkIG:BEbEPox:BEbHcAY:BEbISlv:BEbMGpu:BEbOjZo: +BEbQsGf:BEbVXXr:BEbbeQD:BEbdNZG:BEbisnA:BEbjvmD:BEbksQB:BEblcsB:BEbmiGp:BEboCrc:BEboEZf:BEbrNjy:BEbtSEJ:BEbvlsR:BEbwznd:BEcBCxw:BEcBzgW: +BEcCAlL:BEcCVxl:BEcDAdg:BEcGgIb:BEcImbQ:BEcJgNd:BEcNbqO:BEcQaOw:BEccAqP:BEccTTZ:BEcjKUe:BEckAOW:BEckkxP:BEcrOAS:BEcsGMH:BEcswzv:BEdAeQD: +BEdCfb:BEdFLnP:BEdIVcU:BEdKEFV:BEdNbVH:BEdOgnO:BEdTbQD:BEdaZUE:BEdiJgR:BEdiRQI:BEdjWfv:BEdmdQk:BEdnZDM:BEdonPt:BEdrpzN:BEduXc:BEdukwK: +BEdxArr:BEdxJtH:BEdyGmC:BEdzAnH:BEdzdSH:BEdzoLF:BEeEhox:BEeFSUo:BEeHARd:BEeYpSg:BEeZPWp:BEebiUq:BEediNu:BEekOWB:BEeliQX:BEeoYAF:BEepWoi: +BEewScX:BEfCtZZ:BEfFtuq:BEfJpvP:BEfKgQE:BEfNCSq:BEfRKwh:BEfYGXR:BEfYOQF:BEfcWRu:BEfexyN:BEffPFA:BEfinpX:BEfjinz:BEfmwOg:BEfnaDy:BEfvbHu: +BEfycYd:BEfzejS:BEgAtez:BEgDKAf:BEgNHiG:BEgPUUA:BEgVxig:BEgixFP:BEgkgtf:BEguGba:BEgyGMZ:BEhBnTm:BEhCsnF:BEhJKUM:BEhPceR:BEhYBsu:BEhaUjk: +BEhdEjQ:BEhfWgD:BEhhTgI:BEhmZjY:BEhyyez:BEiBPOV:BEiCaZP:BEiFujU:BEiJBwO:BEiKTaO:BEiNgNz:BEiOpMA:BEiVJYd:BEiZHOm:BEicqUs:BEifsSY:BEijBXW: +BEipmCa:BEirWsf:BEixDBq:BEjDsGA:BEjHpTF:BEjIazY:BEjMQrV:BEjNsOQ:BEjTkni:BEjVVuj:BEjVjRZ:BEjaCrd:BEjaEZa:BEjbMmq:BEjbnma:BEjgbLR:BEjiznc: +BEjkCEu:BEjlsdE:BEjmcmv:BEjnQVO:BEjnyAC:BEjqZMe:BEjtrCc:BEjxWSo:BEkACiA:BEkAFiW:BEkDfvK:BEkFlsW:BEkJxxT:BEkTpxN:BEkYbvj:BEkdOAZ:BEkeGMA: +BEkjpUI:BEksARP:BEksJTj:BEkwSlT:BEkwaRY:BElCgnt:BElKCXg:BElKzGG:BElRaRp:BElTNnC:BElVuF:BElcKuu:BEldpzu:BEljHbI:BEljXnN:BEljsH:BEllAns: +BElldSs:BElmXAK:BElppup:BEmCAVz:BEmCFOt:BEmDGxt:BEmHVhh:BEmJthJ:BEmKMHV:BEmUSCS:BEmVYrQ:BEmXswQ:BEmaOM:BEmcbhS:BEmdXPc:BEmecyb:BEmfHUy: +BEmfyKt:BEmgeJu:BEmjRNQ:BEmsNZT:BEmsTDM:BEmuMAz:BEnCTuM:BEnGvsc:BEnQArT:BEnVdzD:BEnWIeM:BEnfIAD:BEnhmQz:BEnnSCh:BEnpRnH:BEnqecJ:BEntKMS: +BEnuiqh:BEnzTqj:BEoCUUn:BEoFZcy:BEoGKAI:BEoIQhP:BEoOoBL:BEoPIdF:BEoRBsj:BEoXRbk:BEoXSRI:BEoZTaF:BEolNYP:BEonTXg:BEoxqks:BEpFQFn:BEpHHIw: +BEpIUuQ:BEpLImF:BEpSceK:BEpXIDy:BEpYrII:BEpZBSU:BEpdoqc:BEplyec:BEptNyo:BEpvTxX:BEpwEjH:BEpweke:BEpxtCS:BEqBpMj:BEqCijz:BEqGSLs:BEqHJYo: +BEqLHOf:BEqNqHY:BEqTijZ:BEqUfcL:BEqVQyP:BEqbGuw:BEqclSw:BEqdGBq:BEqfoqm:BEqiaLD:BEqnYsG:BEqoLso:BEqotyw:BEqqqTv:BEqusUi:BEqwavf:BErEPmY: +BErFVSg:BErHkIy:BErIbMj:BErTqhB:BEreeQz:BErgGUL:BErkcwf:BEroApR:BErqAcG:BErrbCI:BEruLSt:BErutYl:BErwSyg:BErwqtm:BEsGVCP:BEsHAlb:BEsHVxB: +BEsINtc:BEsLJaA:BEsNnQh:BEsVKEJ:BEsdbPP:BEseARW:BEseJTm:BEshTTt:BEsioBn:BEskRLh:BEsmKUK:BEsoDWV:BEsteJi:BEsvvsQ:BEtEaRY:BEtFXCk:BEtJCIQ: +BEtJFIG:BEtOVcg:BEtPEFD:BEtULwi:BEtcpuY:BEtjkwY:BEtmJtZ:BEtnWr:BEtoZzj:BEtrdQy:BEttnPf:BEtwDwa:BEuHMQQ:BEuHuvF:BEuKFe:BEuKswj:BEuMthq: +BEuNndi:BEuPorH:BEuSdZf:BEuWGxO:BEuXdNe:BEucIaf:BEueNZO:BEueTDV:BEufTQh:BEunJdO:BEupNee:BEuqIpv:BEurAoc:BEuwXPX:BEuxHUb:BEuxyKo:BEuzXme: +BEvCCSG:BEvMXDW:BEvNMqZ:BEvNuVM:BEvQQHs:BEvQylN:BEvVtZl:BEvZJFt:BEvjNzd:BEvlTqc:BEvlvdV:BEvnIku:BEvrIvd:BEvsRna:BEvwKMz:BEvwtRW:BEvwwrI: +BEvxIAM:BEvzWOp:BEwApJB:BEwBxUd:BEwCqqK:BEwEWLL:BEwFtel:BEwICdF:BEwKxiq:BEwMAqy:BEwMRX:BEwOYIh:BEwTXka:BEwcgYc:BEwdtcU:BEweawZ:BEwetcQ: +BEwsokb:BEwueqp:BEwwgCb:BEwyFoI:BEwyRNo:BEwzgIA:BExEceD:BExGxuM:BExIXQi:BExKtEE:BExLLsO:BExLpfS:BExLrIf:BExOZCi:BExZUew:BExZXKh:BExcGme: +BExdWFu:BExjEjg:BExjekJ:BExsxfo:BExugTY:BExyoKk:BEyLykA:BEyUPOd:BEyXcaE:BEyYSLj:BEyZtFC:BEybLsV:BEybtyN:BEydSYE:BEydqTO:BEykIPb:BEylYTf: +BEyreqX:BEyxqUA:BEyzvMX:BEzLXXg:BEzWOWt:BEzXdRW:BEzdAcl:BEzeYSw:BEzhtYG:BEzjSyL:BEzjqtF:BEzkGbA:BEzllsG:BEzpssB:BEzralt:BFAJrSm:BFAKXwX: +BFALitW:BFANxlw:BFAObKs:BFARcfM:BFAUFyG:BFAaAJh:BFAfWus:BFAfgBM:BFAkPZE:BFAoEKm:BFAtxPv:BFAuoNV:BFBPrsd:BFBcbwA:BFBedxt:BFBlWUz:BFBlgbD: +BFBmOCA:BFBmaaO:BFBqPzL:BFBtfQM:BFBuPuI:BFBvAjA:BFCEgwx:BFCIvgd:BFCNpXU:BFCOkXb:BFCQNre:BFCVjHR:BFCayNc:BFCdTi:BFCgYDx:BFCghZu:BFCkVuQ: +BFClRQr:BFConjr:BFCpkbf:BFCteVV:BFCvmNv:BFDBmgS:BFDbAKZ:BFDcoxn:BFDenqv:BFDgyNW:BFDgynj:BFDjBGV:BFDlCVg:BFDnEep:BFDosLt:BFDpUQZ:BFDrtck: +BFDsweB:BFDtXwt:BFDwiNX:BFEAhfD:BFEGkzG:BFEMCJX:BFEOXZQ:BFEQikJ:BFETPIO:BFETRfz:BFETrTS:BFEWzlu:BFEYLPv:BFEeYJP:BFEhGFT:BFElwii:BFEotWk: +BFErEDV:BFEvtHc:BFFAXFS:BFFGqIj:BFFIhFs:BFFJuzU:BFFMibB:BFFTntG:BFFaQpV:BFFmYjg:BFFxtTr:BFFyTLW:BFGApBf:BFGCPBn:BFGFFlH:BFGHvP:BFGImsl: +BFGTxwS:BFGYjVk:BFGaCBA:BFGbnuf:BFGcgzs:BFGfSZm:BFGhAyb:BFGlaLX:BFGpTvs:BFGrsVx:BFGugMu:BFHFGaN:BFHMqVO:BFHNjvP:BFHUQgF:BFHYqUY:BFHZBBn: +BFHdoSH:BFHezBX:BFHitRj:BFHlSzv:BFHnAYy:BFHralC:BFHsBLM:BFHvTVh:BFHxsvc:BFIAhK:BFIDlAq:BFIFTHD:BFIIacf:BFIIvwF:BFILByi:BFIMjnE:BFIPOks: +BFIVLot:BFIaEKb:BFIghMs:BFIgxAt:BFIhwIW:BFIlzkl:BFIqKwz:BFIqfqk:BFJEiTG:BFJLlaN:BFJQeIH:BFJSyqp:BFJTBYV:BFJWxLg:BFJjAjx:BFJmhmL:BFJmxaK: +BFJojhL:BFJrsCh:BFKABOq:BFKAnqz:BFKDDUz:BFKIUyZ:BFKLSxv:BFKPYQY:BFKVyUw:BFKYDAy:BFKfnUS:BFKftKJ:BFKgVKA:BFKhVKa:BFKjiDB:BFKmrAV:BFKniYS: +BFKyYDs:BFKyjsT:BFLCLTh:BFLENKn:BFLOUYA:BFLRYcB:BFLdtcr:BFLejKH:BFLgDeh:BFLgMZF:BFLknuh:BFLktkq:BFLmVkZ:BFLoidy:BFLpidY:BFLxDeH:BFLxMZf: +BFMASAe:BFMBOMI:BFMDikc:BFMJapO:BFMLrmN:BFMNtnc:BFMShFp:BFMVkHB:BFMZckz:BFMZroe:BFMcaHx:BFMjrAS:BFMkmyo:BFMwdwC:BFMxdwc:BFNAkZw:BFNCWrL: +BFNCqGL:BFNDIpB:BFNFyfm:BFNMRFj:BFNMrtC:BFNTsPn:BFNbzec:BFNfPrk:BFNkEdF:BFNkeek:BFNmIHP:BFNoFPn:BFNoths:BFNpraj:BFNrQDo:BFNuwIy:BFNzODg: +BFOFBbl:BFOHuPC:BFOQlSu:BFORKAV:BFOSoxY:BFOTvZU:BFOVSLx:BFOXHzj:BFOcTvJ:BFOesVA:BFOiSZT:BFOlqyp:BFPLIEn:BFPMOst:BFPPUEj:BFPXGaE:BFPXqpV: +BFPZDdx:BFPbORE:BFPealh:BFPiTVC:BFPksvH:BFPpSaP:BFPqAYR:BFPwoSc:BFQAGAW:BFQIZhd:BFQIcwD:BFQJvdm:BFQM:BFQNXYr:BFQSOkj:BFQZPwT:BFQakZV: +BFQcWQs:BFQjsO:BFQybUY:BFQzyOU:BFRGMMK:BFRHEt:BFRHlxj:BFRPLOD:BFRPkw:BFRVWEd:BFRVdbb:BFRXgju:BFRYOKc:BFRZnai:BFRawiG:BFRbzui:BFRhbwW: +BFRjzZt:BFSBNkL:BFSUiJj:BFSWTZi:BFSaXWO:BFSlYDJ:BFSlhZG:BFSljsm:BFSoELm:BFSoFNx:BFSrouG:BFSuMy:BFSwpiY:BFSxVAy:BFSyIZf:BFSyOou:BFTBUYj: +BFTCSXF:BFTJBoA:BFTJTUK:BFTJnQJ:BFTKDuJ:BFTNjIS:BFTOgWc:BFTYkxy:BFTaASI:BFTczIt:BFThwep:BFTjvDR:BFTliNj:BFTmBGd:BFTqEeB:BFTtsLF:BFTuAKh: +BFTznqD:BFUFhFk:BFUHCcE:BFUHmCg:BFUMapT:BFUOrmU:BFUQspL:BFUQzYy:BFUUOMR:BFUWikx:BFUbuES:BFUcPRI:BFUfOde:BFUjGLe:BFUkdwx:BFUrkd:BFUrnVN: +BFUttWy:BFUyRJh:BFVNCCN:BFVNmcl:BFVWsPG:BFVWzyr:BFVYBqn:BFVZSau:BFVdQDf:BFVgXiJ:BFVlODn:BFVpAOH:BFVqdWs:BFVrGfm:BFVsraC:BFVtQpx:BFVtnrn: +BFVxPrb:BFWFKfX:BFWJAUA:BFWMOQt:BFWMsCI:BFWTBND:BFWUShY:BFWabWF:BFWfMLP:BFWgtro:BFWnCBn:BFWpIho:BFWreuy:BFWsNBy:BFWsmBi:BFWunEf:BFWyBcj: +BFXCjvB:BFXKpbO:BFXNKFo:BFXRCNQ:BFXSmSE:BFXTTiW:BFXVePa:BFXXHcH:BFXYJUg:BFXemSY:BFXfAci:BFXjoSz:BFXkCbh:BFXmgZZ:BFXrZaL:BFXsRNU:BFXttyL: +BFXwPyo:BFXwiCU:BFXxIHX:BFXyNbN:BFXzeUN:BFYCgJW:BFYCxPY:BFYEOka:BFYKLof:BFYMvLF:BFYNact:BFYNvwT:BFYRGFZ:BFYSlXH:BFYezzV:BFYluNC:BFYmzUK: +BFYnwIe:BFYsbWu:BFZAPWd:BFZFzHS:BFZRZHT:BFZRcWt:BFZSaCO:BFZSvWo:BFZTaKd:BFZWGfa:BFZXJG:BFZYMMR:BFZZGag:BFZayoe:BFZbbui:BFZlWqC:BFZoEeD: +BFZpKxc:BFZvOmC:BFZzcTM:BFZzkzf:BFaCjnn:BFaFGAe:BFaGnAR:BFaHbKw:BFaSrSi:BFaUitS:BFafbWL:BFaoWuw:BFaogBI:BFapWuW:BFapgBi:BFazAJl:BFbCkjl: +BFbIyqm:BFbLMMy:BFbMxLz:BFbQfFV:BFbTFYJ:BFbZXWU:BFbcIbb:BFbczQL:BFbejhQ:BFbhsCu:BFbzPzH:BFcBirI:BFcCgNG:BFcOjfc:BFcaIAT:BFcdFNn:BFcfwEO: +BFcttCF:BFdFPyW:BFdHszg:BFdHyEh:BFdIgnN:BFdNkxo:BFdPNRh:BFdTgWu:BFdXvGi:BFdZTGK:BFdbVaF:BFdcpIf:BFdeIzY:BFdeOOJ:BFdsBGR:BFduCVc:BFdvYdu: +BFdvhzx:BFdvjSR:BFdwEet:BFdzraP:BFeAzlQ:BFeCLPR:BFeLuZF:BFePkUz:BFeQkzc:BFeSWRX:BFeSqgX:BFeTIPV:BFeVyFy:BFegnVx:BFejvGN:BFeliQT:BFelqtk: +BFerzEw:BFfBPid:BFfBRFQ:BFfBrtx:BFfFkZL:BFfGcKx:BFfGrOg:BFfKIpy:BFfLCjS:BFfPhFO:BFfSuzi:BFfWknN:BFfYWrW:BFfYqGW:BFfaeep:BFfbAXD:BFfbTLO: +BFfcIHK:BFfeFPu:BFfethh:BFfkwIb:BFgIoxl:BFgMaTM:BFgPFld:BFgatYi:BFgfbWT:BFgknuj:BFgoDHO:BFguaLT:BFgvBlZ:BFhAgdE:BFhEHZt:BFhHmSk:BFhNtNg: +BFhPpba:BFhRPbi:BFhSIEy:BFhWOqM:BFhWscp:BFhXjvl:BFhasJl:BFhgVbb:BFhmoST:BFhpCbF:BFhrgZt:BFhtgmr:BFhyAcG:BFhzORr:BFhzmSw:BFiFrSN:BFiHitt: +BFiJxlT:BFiNcfn:BFiNffx:BFiOFyd:BFiVyQC:BFiWMmW:BFiXlXv:BFiaNSp:BFibOcK:BFibaAE:BFifPZF:BFiooNu:BFipxPU:BFirzUu:BFixbWK:BFizzzh:BFjGZHF: +BFjGcWf:BFjLrsy:BFjMXWL:BFjNiTC:BFjWFYS:BFjeKxq:BFjfhmH:BFjfxaO:BFjgyoW:BFjiWUG:BFjigby:BFjlPzq:BFjpKWA:BFjpfQP:BFjuqi:BFjwonB:BFkAgwW: +BFkGmGU:BFkZBOu:BFkcYDW:BFkchZZ:BFkcjsp:BFkfrAR:BFkijkw:BFkjkbI:BFkqVKe:BFksiDF:BFkwtCm:BFkxwED:BFkzvdf:BFlCDJh:BFlCIPi:BFlEyuh:BFlFjFS: +BFlXUYE:BFlanqK:BFlcyNj:BFlcynW:BFlksLI:BFllraI:BFlmiyL:BFlsiNe:BFlunuL:BFlutkU:BFmEWRQ:BFmEqgQ:BFmNTjT:BFmVbqJ:BFmggBT:BFmktWF:BFmmttH: +BFmnRJW:BFmtQdr:BFnChFP:BFnEuzV:BFnIknq:BFnJzLA:BFnOCjL:BFnPntd:BFnQPeC:BFnRXze:BFnUwcM:BFnVTJm:BFnYcKG:BFnYrOX:BFngYjD:BFnigMV:BFnsGvb: +BFntTLT:BFnuTLP:BFoNquG:BFoPxwv:BFoSjVN:BFobSZH:BFodAyG:BFolTvV:BFoogMP:BFouOrP:BFoumsU:BFovACe:BFozosv:BFpAKaS:BFpBGai:BFpBqpz:BFpDDdT: +BFpEBBi:BFpgCxe:BFphSzQ:BFpkYNy:BFpkqYu:BFpmBLj:BFpnald:BFprTVO:BFptsvD:BFqBTHa:BFqCakH:BFqHGFM:BFqQPwh:BFqbuNT:BFqdwIr:BFqgrCi:BFqhzkI: +BFqqyOi:BFqrbUe:BFrAiTd:BFrHZHa:BFrHcWA:BFrOyqS:BFrPGaR:BFrROKo:BFrSxLD:BFrWfFh:BFrYPWQ:BFrbWqv:BFrionE:BFrlOmv:BFrpcTx:BFrpkzS:BFryyoP: +BFsEUyg:BFsFSxK:BFsHmGl:BFsNNrs:BFsVvgr:BFsZtZn:BFshAke:BFsitCt:BFspBgi:BFsrCvX:BFssJCa:BFsskSh:BFstEEO:BFsuQY:BFtANKA:BFtKUYn:BFtLYcm: +BFtLqGP:BFtTijg:BFtWjIW:BFtYjFx:BFtcDeG:BFtcMZi:BFthmnI:BFtjASM:BFtnFnu:BFtorab:BFuHrmQ:BFuLBQa:BFuOhFo:BFuQCcA:BFuQmCc:BFuVGcn:BFuVkUH: +BFuYbqQ:BFuawHX:BFugmyp:BFuhQdI:BFuluEw:BFuoOda:BFupOdA:BFusAoG:BFutGLA:BFuurAl:BFuwQdi:BFuxmyP:BFvDPej:BFvNrMZ:BFvPsPC:BFvPzyv:BFvUhfd: +BFvWCCJ:BFvWmch:BFvbPrF:BFvfGvK:BFvgRjG:BFvqnvA:BFvuODj:BFvyGlj:BFvzdWw:BFwEjVQ:BFwNoxZ:BFwODDr:BFwPvZv:BFwSqvn:BFwVplr:BFwdDHy:BFwfRnf: +BFwgdMD:BFwoMLT:BFwrBcn:BFwuSAZ:BFwvSsi:BFwvcjI:BFwxCBJ:BFwyFRN:BFwyicF:BFxAQgh:BFxEqUw:BFxGOsQ:BFxHIEK:BFxLscB:BFxQtNU:BFxWatT:BFxZHZF: +BFxmdmK:BFxpbwM:BFxsRLP:BFxvtRd:BFxxBCa:BFxyDhV:BFyHzhd:BFyMxPu:BFyULoJ:BFyfja:BFynKwD:BFynfqU:BFypAJY:BFywwIi:BFyxscI:BFzCMMn:BFzDOKf: +BFzJLOa:BFzRgjP:BFzazKY:BFzdzZQ:BFzhEeX:BFzkunD:BFztdxG:BFzzxpl:BGACcui:BGADCLT:BGADSjK:BGAGwOd:BGALXXr:BGANvie:BGAPDkh:BGAQdlI:BGASRpH: +BGATptO:BGAWZNl:BGAboAu:BGAbxdY:BGAfPqF:BGAgWlJ:BGAjXch:BGAkETk:BGAkJGM:BGAnXFG:BGAxWlj:BGAznTx:BGBAjSY:BGBBnWK:BGBDWsH:BGBFeWs:BGBPNeD: +BGBQfUh:BGBSWxu:BGBVDKc:BGBWdLB:BGBYRPC:BGBkMbu:BGBkhSr:BGBlyGm:BGBpXCc:BGBqGOS:BGBrYZt:BGBtObD:BGByPop:BGCAuXI:BGCBatf:BGCJbqG:BGCPXrE: +BGCRnbB:BGCSfTH:BGCUxwY:BGCWqsN:BGCeKFN:BGCeoUr:BGCgCBi:BGCgmKS:BGCgqMH:BGCiIyq:BGCjAfL:BGCmrUW:BGCoFCp:BGCqwKb:BGCswwS:BGCtct:BGDEJoz: +BGDGaTO:BGDHSJt:BGDNQJa:BGDPXkn:BGDSCFZ:BGDTSxu:BGDWnBk:BGDYWvX:BGDZarM:BGDZdwI:BGDbVxe:BGDeGWf:BGDfOWt:BGDfajr:BGDiDcR:BGDkKfG:BGDlIzp: +BGDmmkZ:BGDmqmA:BGDoIYx:BGDrkuk:BGDzqVf:BGEFTzV:BGEKXeH:BGERocK:BGEbELl:BGEbyKP:BGEoQHi:BGEukPA:BGExYbF:BGExfDM:BGExieI:BGFBMUy:BGFLTZO: +BGFQXEQ:BGFdCne:BGFhfUN:BGFkdAj:BGFuQhp:BGGBcNm:BGGFYYZ:BGGKvRo:BGGLRxU:BGGMWQZ:BGGNxuv:BGGOTjz:BGGPxYZ:BGGWZXz:BGGWaPL:BGGdHgd:BGGeQVk: +BGGfrfl:BGGnwXv:BGGpBXB:BGGtyVS:BGGuqQg:BGHKacR:BGHOiqr:BGHWzzO:BGHXxyc:BGHYDCk:BGHYjOM:BGHbQzR:BGHbwxd:BGHhJtY:BGHvkA:BGHvwxO:BGIFRpa: +BGIHHli:BGIKNEf:BGINfuJ:BGIQewQ:BGIXHWZ:BGIYtcz:BGIbRYr:BGIgbHn:BGIjZrM:BGIoOBf:BGIrXBT:BGIsxrI:BGIuPSZ:BGIwygO:BGIxPqO:BGIyDLh:BGIyqAw: +BGJJdLy:BGJLRPx:BGJNHLp:BGJSXxB:BGJUvIU:BGJYCsk:BGJdYZo:BGJgRyK:BGJkOsL:BGJoOFD:BGJpTtq:BGJuXfw:BGJwXbm:BGKAIEa:BGKGjDG:BGKKcCF:BGKLUlY: +BGKRhxB:BGKSCKH:BGKSOlV:BGKUaRo:BGKUdWk:BGKVWVz:BGKXyPM:BGKayLL:BGKfqvd:BGKiZFW:BGKkKLR:BGKkQgj:BGKmuWB:BGKuyDY:BGKxRxP:BGLIIeZ:BGLNhjf: +BGLOZol:BGLRULb:BGLXhXy:BGLcSrN:BGLsKli:BGLsQGQ:BGLuuwy:BGLyohT:BGLyrgS:BGMVCsh:BGMeELK:BGMeyKw:BGMfTqO:BGMhAFp:BGMhgg:BGMngwZ:BGMqVCT: +BGMwbxP:BGNMrGK:BGNOTZf:BGNPQDC:BGNPynW:BGNQEuF:BGNhAty:BGNhfXG:BGNjfFj:BGNkfUg:BGNpdr:BGNqYBv:BGNqiEy:BGNsgSK:BGNwCnL:BGNzILR:BGOBxuM: +BGOEDci:BGOEjoO:BGOIZXA:BGOIaPw:BGONWLT:BGOORxN:BGOPlAU:BGOQeYH:BGOSxYA:BGOXKSt:BGOZRjy:BGOZtnk:BGOZzcQ:BGOfHAc:BGOgyVH:BGOsBXY:BGPFdJu: +BGPGmfY:BGPHxUF:BGPURXE:BGPVmmf:BGPWxUf:BGPXmfy:BGPYQhu:BGPlHah:BGPnqqw:BGPqndS:BGPsiNW:BGPsqFB:BGPvIHp:BGQBEEx:BGQBHuY:BGQCvGQ:BGQECSm: +BGQaOBy:BGQclac:BGQeoAC:BGQexdo:BGQhPSe:BGQjOCh:BGQkAII:BGQqvEQ:BGQxcOP:BGRHTSd:BGRMHEQ:BGRNClM:BGRNSJR:BGRaOFM:BGRfGOa:BGRgUfj:BGRiQgt: +BGRoOcG:BGRytnd:BGSAbty:BGSFCKQ:BGSFOlO:BGSFuFE:BGSHQZJ:BGSIimY:BGSJhWF:BGSKhJD:BGSNXKU:BGSXVid:BGSbtdE:BGSeoHV:BGSerGQ:BGSnRfO:BGSsvKm: +BGStgrL:BGSuIUk:BGSvwKp:BGSyJDz:BGTAxWb:BGTGbTp:BGTJtvL:BGTKhXR:BGTOiMP:BGTPZoG:BGTQhjM:BGTUULI:BGTaIzb:BGThtDL:BGToqVt:BGTprZT:BGTrZfG: +BGTxBRx:BGUFHov:BGUGocu:BGUJtvT:BGUOtJT:BGUYCsQ:BGUgffD:BGUhSqL:BGUjVtK:BGUpQPj:BGUrhpu:BGUsNUv:BGVMKA:BGVggWj:BGVjuuk:BGVlILU:BGVpVTB: +BGWBWQH:BGWDTjh:BGWExYH:BGWMaoW:BGWQRmk:BGWQsRM:BGWRlml:BGWRsWu:BGWUsdf:BGWZfQV:BGWeMzC:BGWfJTR:BGWgpjU:BGWhguT:BGWoFAQ:BGWpDB:BGWpsUP: +BGWsHFb:BGWsQCD:BGWxqoC:BGWyPOd:BGXEWld:BGXNDCY:BGXWWqq:BGXcZxf:BGXdndh:BGXfiNl:BGXfqFy:BGXjxYT:BGXkMZZ:BGXmgo:BGXmpJL:BGXnDgB:BGXrGxb: +BGXusui:BGXwqfN:BGYBrci:BGYJnEN:BGYNtcL:BGYQjsM:BGYVewg:BGYaETt:BGYaJGR:BGYeSvQ:BGYgTqM:BGYpnTg:BGZAHEn:BGZJqNC:BGZKWsE:BGZNtOm:BGZRchy: +BGZaPsu:BGZcOcx:BGZeDlG:BGZeqaX:BGZfkIt:BGZtZRb:BGaDfug:BGaMNRk:BGaPZNh:BGaSNxD:BGaSYIy:BGaWTsy:BGaZdlM:BGackiV:BGahlaq:BGalSEq:BGamRVW: +BGamdAS:BGanMBz:BGawvEc:BGbDchp:BGbFwok:BGbOeWw:BGbRcUf:BGbVZnc:BGbdQpP:BGbfWLE:BGbjEtd:BGbjJgB:BGboQgB:BGbyntw:BGcAqsj:BGcEtVQ:BGcFMnx: +BGcFfwd:BGcHqNj:BGcJuXM:BGcKSjy:BGcLWVU:BGcMLMi:BGcMViR:BGcNGWu:BGcYIEN:BGcaroy:BGcbIyu:BGccRfy:BGceVXh:BGchGwk:BGcsSRZ:BGdAnBO:BGdEZoq: +BGdHabr:BGdIbQJ:BGdItHM:BGdPuxD:BGdQaTk:BGdRftE:BGdTxWT:BGdVqSC:BGdWrZQ:BGdbDcV:BGddKfC:BGdeRXV:BGdfCbd:BGdfqmE:BGdgZfq:BGdiAFA:BGdnGWb: +BGdukrn:BGdxRFP:BGeCCfL:BGeCZAR:BGeNlkZ:BGePTzz:BGeiORJ:BGenkPM:BGexQHe:BGfABtW:BGfExOA:BGfKMUe:BGfQoCN:BGfZXEM:BGfaILG:BGfeVTP:BGfjlAQ: +BGflcV:BGflxCa:BGftkpD:BGgBLdH:BGgKBnq:BGgLfx:BGgNaCg:BGgOYYV:BGgPRjn:BGgPzcF:BGgVdji:BGgWmFE:BGgXxuZ:BGgbEyE:BGgbWjF:BGgdQZG:BGgdwXq: +BGhAcnh:BGhChMW:BGhDfqA:BGhHfiF:BGhQBNx:BGhSKsJ:BGhURJG:BGhUtNU:BGhUzCo:BGhZvrj:BGhcPos:BGheSjW:BGhgEYl:BGhgWJo:BGhhEYL:BGhhWJO:BGhiQzn: +BGhiwxX:BGhlIHe:BGhtQvn:BGhuGxL:BGiGjE:BGiGnwM:BGiJDkE:BGiMdld:BGiNptb:BGiORpe:BGiQHlm:BGiRKmk:BGiSZNA:BGiXTsP:BGiaygk:BGicWlg:BGienTu: +BGifGCS:BGigETF:BGinPOv:BGiphJe:BGiqbHJ:BGitCkI:BGiuXce:BGivGoU:BGiwYzr:BGiyOBB:BGjBLUL:BGjGHwG:BGjMfUW:BGjWHLt:BGjXtCg:BGjYZnX:BGjaXbI: +BGjdRvg:BGjdYSL:BGjddac:BGjeSeA:BGjgMbJ:BGjghSM:BGjiZRP:BGjqRyo:BGjvbhs:BGjxDlu:BGjxqaj:BGkHSXS:BGkQxwv:BGkWbtd:BGkZtVX:BGkZxwI:BGkaKFa: +BGkcCBF:BGkcqMg:BGkpZeA:BGkqIZv:BGkxtdX:BGlAqnz:BGlBJoG:BGlFQzl:BGlKabk:BGlPSxh:BGlUWvE:BGlWypr:BGlbOWi:BGlbajo:BGleDcO:BGlfGfF:BGlgKfZ: +BGlgouf:BGlimkG:BGlkIYe:BGlpruc:BGmBtNa:BGmFXeK:BGmIXfy:BGmIrFt:BGmTEUU:BGmcHmL:BGmvgsX:BGnFrGG:BGnLXET:BGnUlKj:BGnYQDO:BGndElP:BGndykl: +BGneTQT:BGngAfk:BGniHMS:BGnvbXK:BGoCiQl:BGoGKue:BGoHdjb:BGoKzZQ:BGoUWLh:BGoWRF:BGoeFAD:BGoiHFw:BGoiQCQ:BGojwXQ:BGomOs:BGopyVt:BGosZXj: +BGotnDd:BGovqfu:BGoxHlP:BGozxyX:BGpDDCn:BGpDjOH:BGpFKsS:BGpItNl:BGpIzCV:BGpKiqW:BGpNRXI:BGpPeyO:BGpRxyF:BGpSzzj:BGpXZxF:BGpXapp:BGpfVsX: +BGpjgqq:BGpvyvO:BGqDtcy:BGqLewR:BGqQHeb:BGqRCvS:BGqZqnO:BGqaOSv:BGqchJB:BGqkUFY:BGqlQGg:BGqnxrJ:BGqqPSy:BGqsOCt:BGquDLK:BGquqAT:BGqvkix: +BGrAEes:BGrAHUR:BGrFhZC:BGrFjBX:BGrFypW:BGrMNeR:BGrQvIx:BGrRAUW:BGrRvgZ:BGrTCsf:BGrULUe:BGrWNrr:BGrfOsA:BGrhbhz:BGrihjU:BGrjAiB:BGrpveZ: +BGrqUfN:BGrrlAh:BGrtoaH:BGrtxDd:BGrwRvN:BGrwYSe:BGrwdaJ:BGsCGWg:BGsHUlD:BGsMtVA:BGsMxwP:BGsQaRr:BGsQdWv:BGsRWVg:BGsTjDz:BGsaqnx:BGsbyDd: +BGsgAfz:BGsktdA:BGsnoHR:BGsnrGU:BGsqWsO:BGssBLB:BGssZeX:BGsxKLo:BGsxQgW:BGtBCFl:BGtGftW:BGtHiMT:BGtIhwK:BGtJhjI:BGtKqSQ:BGtMXkX:BGtNULM: +BGtPbTt:BGtThXV:BGtUOLB:BGtUufH:BGtZxWf:BGtcIuF:BGtkrOB:BGtmRFB:BGtouwV:BGtqtDH:BGtwydM:BGtxGfM:BGtxJdw:BGtyBlK:BGtyZEQ:BGuRCsU:BGuXtJP: +BGubTqr:BGujgwg:BGukCNf:BGulVCI:BGumATs:BGumfxM:BGuqdaI:BGuyQPn:BGvBXFI:BGvBrfD:BGvFoCx:BGvItnQ:BGvLynt:BGvQFQv:BGvZeuT:BGvefUD:BGvffFI: +BGvlYBu:BGvliEz:BGvsOrU:BGwMxuH:BGwcyVm:BGwfZXs:BGwmwXH:BGwnDcV:BGwnVqp:BGwsHgZ:BGxAWqM:BGxDxyM:BGxGcnZ:BGxKZxm:BGxPRMn:BGxPsrH:BGxSeyd: +BGxTsDc:BGxdMZF:BGxeJtW:BGxfpJP:BGxlZxz:BGxrHfg:BGxrQcA:BGxuBxu:BGyBCLg:BGyBSjx:BGyJjsA:BGyLqnV:BGyMTsn:BGyTcHl:BGyVwOw:BGyaoAf:BGyaxdJ: +BGybSEf:BGydMBm:BGydhsj:BGyePqU:BGykGok:BGyofDU:BGyotNN:BGypTqA:BGytQPL:BGytcY:BGyvWlY:BGyzETx:BGzBWsy:BGzEeWb:BGzHcUs:BGzKCVc:BGzMtCI: +BGzPjSH:BGzQnWZ:BGzWtOQ:BGzYneK:BGzcObU:BGzgxRz:BGztSVT:BGzvTQH:BGzzQpE:BHABJOo:BHAFCHn:BHAJcmp:BHAPIfH:BHARHAU:BHAVugQ:BHAaSWU:BHAcYsK: +BHAdLTT:BHAogMq:BHAojOK:BHApYOq:BHAyToT:BHBBQeF:BHBCAkD:BHBCKD:BHBCsAU:BHBHbVQ:BHBQinb:BHBTlWW:BHBVIFC:BHBWJoD:BHBatwF:BHBksyv:BHBqYgO: +BHBqZpJ:BHBrctG:BHBrfhX:BHBtxtG:BHByzmT:BHCBzpm:BHCGxnG:BHCJRMx:BHCJxmu:BHCSTEm:BHCTYEH:BHCaBsX:BHCcaMX:BHClWkC:BHCnFmu:BHCtFOB:BHCtInF: +BHCtyiI:BHCwGxT:BHCyouv:BHDBAwz:BHDHzPz:BHDMxNP:BHDPRmo:BHDPxMb:BHDWRLC:BHDaceD:BHDcFSo:BHDgDJk:BHDjhFW:BHDsOkV:BHDuegT:BHDvtZP:BHDxamo: +BHECyRy:BHEFVYL:BHEIMFu:BHEKMMj:BHELqCf:BHELwUP:BHEOCEN:BHEVwGl:BHEXrfz:BHEYDaf:BHEahlG:BHElmqR:BHEnPaD:BHEtzSn:BHEwIed:BHEwQmq:BHEzhMs: +BHEzqHU:BHFEbEe:BHFFSpb:BHFGkxW:BHFNVyw:BHFOLjv:BHFPrSm:BHFTwuk:BHFUJDL:BHFUdHj:BHFYzsB:BHFaXjT:BHFjRMT:BHFkGzu:BHFpxPi:BHFrBTg:BHGAHqP: +BHGAJiK:BHGEysw:BHGFkfH:BHGPcXU:BHGRnYa:BHGapDu:BHGboXr:BHGdBCI:BHGfaBq:BHGigHP:BHGkxMi:BHGmqLc:BHGmxWd:BHGoXyN:BHGtNwz:BHHBVBt:BHHGHQO: +BHHGJIT:BHHKySh:BHHLWdU:BHHNZTq:BHHSVlV:BHHUcxj:BHHXhNy:BHHaVvI:BHHbumB:BHHdrrj:BHHgoxM:BHHhoxm:BHHiBcv:BHHjHaY:BHHlQjO:BHHldgP:BHHnawY: +BHHsLJd:BHHuOjD:BHHuXOh:BHHxpxb:BHHzoho:BHIBAYN:BHICzDV:BHIGBzm:BHIGTcj:BHIGUuR:BHIMIwh:BHIPogw:BHISQES:BHIbwxs:BHIcQPt:BHIcRqE:BHIezMV: +BHIrQeD:BHItQPT:BHItRqe:BHJDiny:BHJGNIQ:BHJOBZT:BHJOTCS:BHJOUUk:BHJUHSZ:BHJVUmD:BHJVoGN:BHJXYWF:BHJXqqK:BHJYIFX:BHJhwXJ:BHJjbgG:BHJmLtD: +BHJrTOD:BHJtePw:BHJuOcW:BHJuRlP:BHKCmPR:BHKETEd:BHKLsTi:BHKPhdn:BHKXCKW:BHKYTAL:BHKhLjr:BHKkntg:BHKmvHU:BHKrszT:BHKstzn:BHLCRmH:BHLCxME: +BHLImpK:BHLMYex:BHLMqOl:BHLOxvN:BHLVhDw:BHLWOHt:BHLhDJL:BHLmFor:BHLmINv:BHLmyIy:BHLnGXd:BHLpLKc:BHLrEWF:BHLuWKs:BHLwFME:BHLxsZM:BHMOwUI: +BHMTAHq:BHMVTej:BHMVZhP:BHMVrax:BHMgzSw:BHMnXrE:BHMomqK:BHMtjvT:BHMvgSs:BHNCtAI:BHNJskm:BHNRwzI:BHNTtAi:BHNUXrI:BHNXSpi:BHNaQmV:BHNbMpj: +BHNfbsq:BHNgCtG:BHNpIEt:BHNpQMa:BHNumQB:BHNwPAT:BHOCcGc:BHOESKk:BHOPZTr:BHOUCCh:BHOXSuf:BHOXkfQ:BHOZzWP:BHOcsNb:BHOeHxn:BHOemIi:BHOfoHi: +BHOgzys:BHOleWr:BHOqtzE:BHOsDvR:BHPDtXc:BHPFVly:BHPMTkV:BHPOhtA:BHPRRHh:BHPZNnO:BHPayQA:BHPdVny:BHPjDjI:BHPjyXf:BHPmwGT:BHPpKBL:BHPqjlS: +BHPwtZL:BHQCUMb:BHQCogh:BHQDqQM:BHQEAYQ:BHQFrVL:BHQOsSi:BHQTlFX:BHQTvbc:BHQdgMg:BHQeYOg:BHQqGyk:BHQvKYV:BHQwiQl:BHRFIWx:BHRLzdF:BHRPChW: +BHRWinP:BHRYigL:BHRdTOM:BHRkwXc:BHRmTVL:BHRnzmF:BHRpkgC:BHRubYY:BHRvZpX:BHSCWTI:BHSCcMr:BHSCjjI:BHSFXdY:BHSKCKl:BHSNVL:BHSShdU:BHSXMuk: +BHSZzJC:BHSdszO:BHSibKs:BHSsGPG:BHSszme:BHStBsj:BHTDauV:BHTEfZS:BHTLXDR:BHTXWtb:BHTXcmY:BHTXjJb:BHTaLJB:BHTbXHR:BHTgoyp:BHTkBSA:BHTmamA: +BHTnbkX:BHTyGpL:BHTyzMn:BHUAqCx:BHUAwUN:BHUIIZv:BHUQZQK:BHUUFZy:BHUaWtC:BHUbdhu:BHUbvzS:BHUnCWq:BHUsdLt:BHUtQdL:BHUukpz:BHUwCLf:BHUyert: +BHUywaw:BHVCDAO:BHVDSyu:BHVDrFS:BHVFXZm:BHVPADo:BHVXqil:BHVfhmZ:BHVgWTT:BHVglvk:BHVhSKI:BHVkhLn:BHVpGzG:BHVrfji:BHVtCwf:BHWMJxN:BHWQMpO: +BHWRuII:BHWUnYS:BHWZzEP:BHWaFOz:BHWaSVT:BHWaTEa:BHWdtzn:BHWfDvy:BHWiZVg:BHWjwgv:BHWkKbn:BHWnjLq:BHWuDJk:BHWuyxD:BHWzomh:BHXAWdC:BHXDRHQ: +BHXLNnv:BHXONT:BHXYMPt:BHXcawO:BHXfKKG:BHXiFoA:BHXiSvo:BHXiTeZ:BHXjtZU:BHXlDVB:BHXpabX:BHXsKBU:BHXxLJr:BHXyuPO:BHYBxyy:BHYEiGJ:BHYFYWK: +BHYRQEr:BHYSjDO:BHYSvWO:BHYWlFq:BHYWvbJ:BHYXbve:BHYfdHG:BHYgQeR:BHYhkMR:BHYhqkF:BHYjQFT:BHYjcIu:BHYlirm:BHYmamP:BHYsAAg:BHYySWj:BHZFssY: +BHZMYWp:BHZQQXk:BHZRAiz:BHZVmEy:BHZXQek:BHZZUsL:BHZdcTS:BHZhctj:BHZhfhu:BHZjxtj:BHZnkmK:BHZpQfM:BHZpcil:BHZqRDx:BHZriRt:BHZsrMx:BHZufTQ: +BHZuvsi:BHZytwk:BHaDQEi:BHaEjDT:BHaEvWT:BHaFUSN:BHaScmt:BHaTiNm:BHaWNiE:BHadtWI:BHahQei:BHakkMi:BHamQFo:BHamcIN:BHanqlf:BHaoirV:BHazbGS: +BHazznI:BHbDAis:BHbECha:BHbHmEp:BHbKQeB:BHbLUsE:BHbMsAq:BHbNOWr:BHbOlX:BHbXssP:BHbYHwy:BHbbYSD:BHbjAaW:BHbnjoD:BHbodhw:BHbqkmb:BHbqqKv: +BHbsQfd:BHbsciE:BHbwcTz:BHbzMw:BHcCsTd:BHcSxmq:BHcantJ:BHccvHx:BHcdcEW:BHcfOKE:BHcitzC:BHcmhfD:BHdFcMd:BHdFzjz:BHdJaud:BHdMWtp:BHdMcmK: +BHdMjJp:BHdRTef:BHdVxNL:BHdYRms:BHdbamS:BHdcFoI:BHdcINM:BHdcyIB:BHdfLJP:BHdkWKH:BHdshFK:BHeALfQ:BHeBLJA:BHeLZhE:BHeLram:BHeStaU:BHeZsKq: +BHeaCWC:BHehdLF:BHeqQMJ:BHerMPv:BHeudhG:BHeuvza:BHevbSm:BHfCFbg:BHfGLFZ:BHfHMfr:BHfJMmm:BHfNCeI:BHfSIzo:BHfXDAa:BHfYduG:BHfdeRM:BHfdwAN: +BHfufjG:BHfvMh:BHfyhmt:BHfyqhR:BHfzWsR:BHgEeNl:BHgJJiG:BHgNRku:BHgPnsb:BHgSxSp:BHgUVbg:BHgVVLE:BHgWMpq:BHgYcXY:BHgduMq:BHggrRy:BHglHAj: +BHgoomv:BHgtVNE:BHguxME:BHgzDJu:BHgzyxZ:BHhAnyz:BHhDySl:BHhESUd:BHhEkFS:BHhPHQK:BHhPJIP:BHhTTHf:BHhbNWA:BHheabj:BHhhghK:BHhjxmr:BHhkVnr: +BHhppdn:BHhqoxi:BHiLQEW:BHiVIwl:BHifGyP:BHikjOf:BHilbGZ:BHioRds:BHiofvw:BHitToY:BHiwepJ:BHjBOWI:BHjDbVN:BHjFQXy:BHjGAih:BHjLHwb:BHjMxYr: +BHjPlWH:BHjTHaA:BHjXuGE:BHjcSwA:BHjhrMj:BHjjcTa:BHjnctX:BHjnfhG:BHjqQEy:BHjrYoe:BHkERMu:BHkExmx:BHkNhuA:BHkPYEe:BHkPqoq:BHkUfzg:BHkhFsu: +BHkieGn:BHkjFmX:BHkqLjv:BHkwoYD:BHlBmpO:BHlDTey:BHlMAwy:BHlfhFt:BHlmOku:BHloegw:BHlrtZs:BHlyLKg:BHlznTz:BHmBVYi:BHmCSYY:BHmEdUE:BHmFERu: +BHmGSor:BHmLsKx:BHmSDaC:BHmTSYy:BHmVXza:BHmXSoR:BHmeXry:BHmhmqw:BHmjPaa:BHmoNOE:BHmpzSK:BHmthgQ:BHmuWSp:BHmvhMV:BHmvqHp:BHmwWtX:BHmwlVg: +BHmxSkE:BHnAbEB:BHnBAhT:BHnCkxp:BHnDqu:BHnETEo:BHnEZHU:BHnFIzt:BHnKLjQ:BHnNqcz:BHnNwuL:BHncjVQ:BHnegsv:BHnnmQN:BHnpPAX:BHntvI:BHnvzsr: +BHnzQmZ:BHoAysR:BHoBZtK:BHoFwXh:BHoMhnc:BHoQWDO:BHocYPr:BHodjLF:BHofVVS:BHoguMX:BHoiqLF:BHoixWA:BHonYlM:BHoooHu:BHosaWC:BHovKkK:BHoyFOM: +BHoySVc:BHoyTEV:BHoztzY:BHpCHQl:BHpCJIw:BHpGySK:BHpNMPA:BHpOVlu:BHpQCPn:BHpRcgf:BHpRsAy:BHpTSkn:BHpWRKE:BHpYzwU:BHpbmPM:BHpcpdI:BHpeHaZ: +BHpfzYv:BHpkghl:BHpmumA:BHpnxio:BHpqOjg:BHpqXOK:BHprsng:BHpssN:BHptHXk:BHptmil:BHpupZT:BHqIIwK:BHqJogT:BHqOQEp:BHqVsSU:BHqhOCm:BHqhRLj: +BHqiepM:BHqmwxp:BHqniQP:BHqozng:BHqxcTf:BHqxfHy:BHqzxTf:BHrCYWK:BHrCqqF:BHrDAyZ:BHrErvG:BHrRUmi:BHrRoGc:BHrUQeG:BHrXqAv:BHrdYol:BHrmTOI: +BHrubgJ:BHruzNP:BHrviqg:BHsBMuO:BHsHsTV:BHseLke:BHsmDjJ:BHsrbKw:BHtBWtF:BHtBjJF:BHtCRLi:BHtGMUd:BHtIcMR:BHtIzjL:BHtMauR:BHtRhDZ:BHtZCkc: +BHtjGXI:BHtkXHV:BHtnceN:BHtrGpH:BHtrzMj:BHuEwGV:BHuHtaC:BHuWwZC:BHuczST:BHukmqh:BHulCTM:BHupRmu:BHvJwgy:BHvMDAs:BHvNduU:BHvYADs:BHvavZX: +BHvhNoU:BHvjIEQ:BHvjQMD:BHvmsF:BHvqmQg:BHvsPAq:BHwEnsP:BHwEyBm:BHwFJxB:BHwIwSN:BHwJZTU:BHwONNA:BHwRTKX:BHwThTO:BHwWRhf:BHwXwXs:BHwaHxI: +BHwamIN:BHwfeWU:BHwmtzb:BHwoDvu:BHwyKkp:BHxAuiN:BHxKhtd:BHxLJXI:BHxOenu:BHxWCcD:BHxZybF:BHxiwGq:BHxjKBi:BHxmjlv:BHxoFW:BHxpSvS:BHxpTef: +BHxstZi:BHyBrVi:BHyDqax:BHyIcmC:BHyKiNz:BHyPYWg:BHyTRqL:BHydRdm:BHydfvi:BHyrKYs:BHysLTg:BHyvsYN:BHzTigO:BHzVlft:BHzVvBO:BHzaRlz:BHzfQEW: +BHzgTVo:BHzlaMU:BHzmcTO:BHzqctv:BHzqfhi:BHzsxtv:BHzxSwo:BHzzYSq:BIAAorr:BIABZlv:BIADJDJ:BIADgqF:BIAEIGL:BIAFbXE:BIAIzbP:BIAJRCo:BIAMhOi: +BIARkDY:BIASEIY:BIAazmh:BIAjczr:BIAsIBJ:BIAxlFW:BIBHIIF:BIBIrss:BIBOoNE:BIBPPwY:BIBQSTw:BIBWGiJ:BIBYzex:BIBjpVt:BIBqhkl:BIBvNfD:BICKgNw: +BICNrSD:BICPCpL:BICPMKn:BICQqhw:BICWlin:BICWsru:BICgGTU:BICgrGV:BIChLGW:BICqmjh:BICtpOm:BICvLkf:BIDBPfi:BIDDNUP:BIDGHqr:BIDHjbq:BIDQJnm: +BIDQQnn:BIDQVcB:BIDWjFr:BIDYsJV:BIDgSXy:BIDjAgE:BIDrJsE:BIDtekT:BIDudnF:BIDvixh:BIDylaD:BIEFVzF:BIEIdZZ:BIELyxk:BIEMJlW:BIEMjBZ:BIEUZDy: +BIEVTys:BIEWQHD:BIEczoM:BIEefsn:BIEoAGn:BIEqJov:BIEznHc:BIFEXer:BIFIiJp:BIFNItb:BIFQWaA:BIFUsjY:BIFVZeV:BIFhyPc:BIFibtr:BIFnQKT:BIFqIaB: +BIFqsYe:BIFtCTa:BIFwLEn:BIFyhRy:BIGNqPs:BIGPBID:BIGQCBt:BIGQZxU:BIGSoaQ:BIGWmN:BIGdXaq:BIGmOPO:BIGotcn:BIGrAKz:BIGxivp:BIGydsx:BIHFKfs: +BIHFsyH:BIHRfDI:BIHVLpC:BIHXiRc:BIHaPYi:BIHbkKq:BIHdlfU:BIHgTnh:BIHoCkE:BIHqWKD:BIHsZSh:BIHxWYI:BIIClUZ:BIIDTNP:BIIEBBt:BIIIJbV:BIILKFz: +BIILsYA:BIIWZOU:BIIYJUl:BIIbgoi:BIIjJpV:BIIneYV:BIIpLKp:BIIqAQE:BIIumwx:BIIvWkm:BIIwcZI:BIIyZsa:BIJCynK:BIJIoXv:BIJSktf:BIJTulM:BIJiMOd: +BIJlTeT:BIJnhLv:BIJnkab:BIJsLKH:BIKCCpk:BIKCMKI:BIKIlii:BIKIsrr:BIKLmu:BIKNGIz:BIKSzPt:BIKWXGn:BIKZuLD:BIKafCz:BIKjobA:BIKkLGp:BIKohKH: +BIKorvW:BIKotua:BILCcyq:BILFKTt:BILFnyL:BILOHsi:BILOIos:BILQKv:BILTcyQ:BILUrls:BILcZjo:BILenhA:BILhdno:BILllam:BILnJOT:BILtHEG:BIMKKtM: +BIMKnYu:BIMRsjf:BIMSNsx:BIMUHSp:BIMUIOj:BIMZVCr:BIMeyiv:BIMfBpK:BIMkeKd:BIMmiXX:BIMndNv:BIMrlAt:BIMyJSu:BINEGXF:BINLZLW:BINMWha:BINQotu: +BINQwPT:BINRGks:BINWuRm:BINXuRM:BINZEPe:BINaToz:BINavvk:BINdIak:BINdsYL:BINuRMe:BINvbvn:BINwvmg:BIOAkjG:BIOBDcF:BIOFXdK:BIOJxNk:BIOOVh: +BIOOZEF:BIOVqhl:BIOWITr:BIOXGKJ:BIOYoTL:BIOYwpm:BIOcZeH:BIOdPto:BIOeJqm:BIOeVSY:BIOeVnf:BIOfXHW:BIOgXan:BIOiTOC:BIOivVR:BIOjUDz:BIOjaIv: +BIOldsg:BIOwQkD:BIPDJuJ:BIPEfDf:BIPIsyg:BIPLbkd:BIPPEit:BIPQrtl:BIPSzUe:BIPaCkJ:BIPeZSg:BIPglfz:BIPlHIg:BIPlOSC:BIPpIbg:BIPseXc:BIPsnTS: +BIPyTng:BIPyUap:BIQBPGj:BIQCnWc:BIQHZOl:BIQKfdy:BIQLpDJ:BIQOKFC:BIQOsYx:BIQTtrL:BIQWTNi:BIQfCKu:BIQicZP:BIQloJS:BIQmlFe:BIQnvTj:BIQrqAB: +BIQsLKI:BIRJwFw:BIRMZtu:BIRNkIO:BIROLBN:BIRPkDL:BIRTZug:BIRWulf:BIRgoBc:BIRvtfm:BIRyri:BISBeyT:BISEYUO:BISGcUY:BISIZWI:BISMpvn:BISRwfL: +BISSZTN:BISULbu:BISVkit:BISXThg:BISXkdw:BISbNFm:BISeTED:BISghlf:BISgkAr:BISipOs:BISphoK:BISwiPx:BISxiPX:BITCTYV:BITFJnC:BITFVcl:BITPpVV: +BITUPfG:BITVxXn:BITWZVl:BITbyIH:BITgmsh:BITlSXW:BITmaBh:BIToVhO:BITsXEj:BITuimS:BITwtpP:BITxtpp:BIUAuoR:BIUDsjo:BIUENsq:BIUGOGN:BIUGxwq: +BIUITyA:BIUImBL:BIUJZDK:BIUKGLA:BIUKIBZ:BIULQHv:BIUNdZh:BIURJle:BIURjBh:BIUVpvA:BIUYVzt:BIUsghR:BIUwbLq:BIVAWhZ:BIVBfCn:BIVCXDi:BIVDGkH: +BIVKuRV:BIVOZLL:BIVVWaS:BIVZsjK:BIVaPTM:BIVfSQD:BIVibvu:BIViyH:BIVviVM:BIVwIap:BIVwsYW:BIVzNvq:BIWEBIR:BIWHqhe:BIWKGKc:BIWVWHq:BIWXXdB: +BIWfqtQ:BIWgAKl:BIWjLSy:BIWlNjd:BIWpvMw:BIWrypZ:BIWxQkm:BIXEgaJ:BIXGJBI:BIXIHMh:BIXMiRU:BIXPHlw:BIXQoRf:BIXRZLb:BIXSMTO:BIXTgQR:BIXTtzk: +BIXUIgX:BIXVbxQ:BIXYzBD:BIXaaC:BIXgyqP:BIXhIBA:BIXioju:BIXjaVH:BIXlDbH:BIXnAgV:BIXnnkW:BIXpABG:BIXzcZf:BIYEPGE:BIYIEID:BIYLszb:BIYNzbm: +BIYRhOT:BIYVorO:BIYXBJi:BIYYMtF:BIYZIGq:BIYaVSw:BIYeLKF:BIYiIBW:BIYjexS:BIYjntc:BIYnIbH:BIYnyBi:BIYrcCw:BIYuHiW:BIYuOss:BIYvAbN:BIYwzmu: +BIZBLBW:BIZCTHE:BIZCkDU:BIZFZwk:BIZHktt:BIZIWwD:BIZJpVL:BIZMeYv:BIZRYum:BIZVsxr:BIZXynY:BIZdipZ:BIZhLKZ:BIZlLf:BIZnMOv:BIZsPRG:BIZwGti: +BIZwrgj:BIaBzbT:BIaJorv:BIaKBJp:BIaLZlR:BIaMJDN:BIaMgqB:BIaObXA:BIaPbXa:BIaRCPM:BIaRHmx:BIaalol:BIaeWyO:BIagqAT:BIajzml:BIaqyWI:BIaroJe: +BIaucCn:BIaxtsx:BIazQwm:BIbHpgO:BIbIZuq:BIbJSTs:BIbKpYW:BIbRrsw:BIbWpgo:BIbYsRF:BIbaOpk:BIbjhkh:BIbqfcN:BIcCqCs:BIcFoxt:BIcGzEC:BIcLcUk: +BIcLfEO:BIcMXGE:BIcOnEB:BIcPStl:BIcWrSH:BIcXrSh:BIcZxN:BIcphKw:BIcwfCQ:BIcypvo:BIczmjd:BIdETzc:BIdExoC:BIdOEpg:BIdWxNr:BIdbFsa:BIddJOA: +BIdezOZ:BIdhkzj:BIdjHER:BIdrCR:BIdsrHR:BIduyIz:BIdvBPG:BIdvIxW:BIeAPFn:BIeCZvE:BIeDbLV:BIeIXFL:BIeKdNb:BIeONTG:BIePJNj:BIePQNi:BIePVCE: +BIeUyxg:BIeVHQu:BIefXVl:BIehFSZ:BIfDCbg:BIfDZXF:BIfFoAB:BIfNOwM:BIfPEPP:BIfQddw:BIfQkJK:BIfRDCJ:BIfVXDG:BIfZIRW:BIfZxng:BIfaLER:BIfbbtn: +BIfiPiu:BIfleyS:BIfnYlK:BIfsZED:BIftPTc:BIfuJQa:BIfuVNj:BIfuVsU:BIfwXAb:BIfyToO:BIfzUdv:BIfzaiz:BIgHeZ:BIgJijT:BIgMITi:BIgTAkv:BIgTXEy: +BIgbCtJ:BIgcknm:BIghbTy:BIgkcIn:BIgnPIB:BIgvLee:BIgxhrr:BIgytcJ:BIgztNX:BIhBiRG:BIhIzUN:BIhJgaX:BIhMlWP:BIhORci:BIhSnwW:BIhbWYm:BIhctlo: +BIhfTeS:BIhkkKu:BIhlyqB:BIhyczd:BIiGhOF:BIiMTNT:BIiNEIV:BIiOgAq:BIiULPN:BIiWirn:BIiZPGW:BIiaYAS:BIifTNe:BIifUAr:BIiitLf:BIikgom:BIipPyd: +BIiqyQk:BIisrxk:BIitJpr:BIixeYr:BIjDrsn:BIjECPF:BIjEMkd:BIjIsxD:BIjQdb:BIjWcuM:BIjWfei:BIjdfcw:BIjrNfy:BIjuTeP:BIjwhLr:BIjwkaf:BIjypog: +BIkByNF:BIkJIir:BIkLqht:BIkOsjC:BIkRkTk:BIkWeyi:BIkrLkE:BIkxMoi:BIlCHqW:BIlGsck:BIlTsJS:BIlYHsE:BIlZZdw:BIlcPAG:BIlnekq:BIlqdnc:BIlulaa: +BIlyIxN:BImBcYt:BImHcNH:BImNHSl:BImNIOv:BImSQHc:BImUKtq:BImUnYI:BImbZJj:BImmJoQ:BImqkZz:BImsHeB:BImtnHD:BImwdNj:BInAAKX:BInAXeW:BInLWaD: +BInOusb:BInOwRm:BInPChL:BInUBiN:BInXqHy:BInbZlt:BIncTgC:BIndIiV:BInftnV:BInjsKX:BInmIag:BInvqTM:BInwAkp:BInzLse:BIoGAkQ:BIoLWHd:BIoMijs: +BIoTGxC:BIoWUZY:BIoiTGJ:BIopvVn:BIosUDF:BIosaIJ:BIpBKfP:BIpBsyk:BIpNfDj:BIpUPgy:BIpXluP:BIpYEix:BIpZTnz:BIpbTnH:BIpjmWr:BIplWKG:BIpnZSk: +BIpqVsK:BIpuLkz:BIpvAqO:BIpxTeT:BIpyIbk:BIqBlU:BIqHKFG:BIqSJUQ:BIqflFa:BIqgczd:BIqomwE:BIqpCKQ:BIqxUAk:BIrHYup:BIrMPwO:BIrPulb:BIrVZtq: +BIrXLBJ:BIrchkn:BIrcrVq:BIrctUG:BIrdMOk:BIriPRZ:BIrjhLY:BIrjkaM:BIrrhqp:BIsConH:BIsEStz:BIsKGIG:BIsUPWt:BIsVuLY:BIskhKU:BIskrvJ:BItLVZg: +BItQrlP:BItRyXJ:BItSYVO:BItXdnO:BItYscd:BItanhb:BItfQVL:BIthrHD:BItjblb:BItoJsO:BItvgHA:BIuBTyM:BIuEJNX:BIuEVCw:BIuHtp:BIuKjfG:BIuMsjc: +BIuQOGb:BIuWdZd:BIuayiS:BIufcDq:BIulQvS:BIunVHT:BIurXeq:BIutiMH:BIuvmSs:BIvEEPb:BIvFZLp:BIvHbbh:BIvMGkt:BIvPmWe:BIvTqpR:BIveyPm:BIvjUbW: +BIvkXhi:BIvmLsN:BIvoNJS:BIvqRMB:BIwABPu:BIwBXdn:BIwEWAT:BIwHGxz:BIwIsJL:BIwNZlK:BIwSoTi:BIwSwpH:BIwZurQ:BIweivJ:BIwhdsB:BIwiNVv:BIwotNF: +BIwuSqC:BIwwRmy:BIwxbVr:BIxDRcG:BIxGeZn:BIxItRV:BIxKtcc:BIxLkdq:BIxPsZW:BIxQpdP:BIxRzBX:BIxZoRz:BIxaJPU:BIxhHIB:BIxhOSf:BIxkcJZ:BIxlIbB: +BIxsvtp:BIxuWYC:BIxwqaX:BIyASJu:BIyAwqT:BIyFJUv:BIyHCPX:BIyHHmm:BIyLirP:BIyMezw:BIyQkDH:BIyTgAO:BIyUszn:BIyVJbL:BIyXzbA:BIyamwB:BIyccZs: +BIyefsX:BIyhoJp:BIyiTNx:BIypQwx:BIyvyQU:BIyyczc:BIzDRhN:BIzIZth:BIzJkIR:BIzKLBS:BIzaGtM:BIzargN:BIzbyfd:BIzdhqI:BIzhMXV:BIzhMn:BIznpou: +BIzuhOM:BIzwMOr:BJACNLa:BJAHLin:BJAIsIF:BJAMQax:BJASYGJ:BJAWKuq:BJAWhTc:BJAYOqw:BJAkgtm:BJAkoIS:BJAmyRp:BJAocvM:BJApIUE:BJAymfe:BJBCeyz: +BJBDCge:BJBJhzA:BJBKXGo:BJBMjgl:BJBMqgo:BJBMvjC:BJBTJOS:BJBTzul:BJBUSCW:BJBbmvA:BJBjOWu:BJBjbYZ:BJBjiqJ:BJBoEbu:BJBrDgg:BJBvLhe:BJCEDSY: +BJCICGL:BJCMAVD:BJCNGUh:BJCPhZH:BJCPiFR:BJCRaVS:BJCSCPp:BJCVNPM:BJCYJoz:BJCYzUE:BJCgmVh:BJCjphJ:BJCmdpc:BJCpbyS:BJCpiQC:BJCszCn:BJCxDGn: +BJDBxlS:BJDFdJw:BJDHwaI:BJDIbya:BJDNXgZ:BJDOfWB:BJDPgQn:BJDQXwb:BJDQcaH:BJDRusT:BJDVB:BJDayeV:BJDbnvg:BJDcoyA:BJDpDZV:BJDszep:BJDwTgR: +BJEFZik:BJEGjrt:BJEObYh:BJETcIe:BJEUgqG:BJEZaVw:BJEgnVN:BJEhnVn:BJEkzlp:BJEnRTq:BJEorVB:BJEtSpM:BJEtiHj:BJEvfTs:BJFGBbL:BJFIoo:BJFOFMn: +BJFPcyl:BJFPhDY:BJFSSpo:BJFSkoT:BJFZbkZ:BJFbvzO:BJFlCsg:BJFmwBC:BJFoNTy:BJFozZo:BJFpOcD:BJFstgL:BJFuEpx:BJFvTZY:BJFytlP:BJFzUIn:BJGAtGq: +BJGBGHt:BJGCtm:BJGDjkw:BJGEJvU:BJGGPMr:BJGIlYk:BJGUFma:BJGaCcx:BJGaNUK:BJGdYXn:BJGgRqN:BJGkuWi:BJGmaXD:BJGqcBM:BJGtFtT:BJGuNtv:BJGyWWg: +BJGzLIF:BJHCksL:BJHDOQU:BJHJFln:BJHNAYt:BJHQDWy:BJHScsl:BJHWyA:BJHYlKF:BJHemFg:BJHiUrB:BJHkHEU:BJHkKhA:BJHpYoq:BJHqToE:BJHvvWm:BJICSQh: +BJIEYGC:BJIHGGQ:BJIIkSG:BJIJEpl:BJIOoRZ:BJIZWot:BJIdRNp:BJIftO:BJIjnOU:BJJSYQF:BJJaCmb:BJJaGWc:BJJbNan:BJJiXvQ:BJJjdPM:BJJjhz:BJJwGAM: +BJJyRAH:BJKBoNf:BJKDaVJ:BJKHNPT:BJKIXtk:BJKKUfZ:BJKNScg:BJKSMKD:BJKSsVj:BJKStpI:BJKVvJs:BJKaBEy:BJKgCMu:BJKgGwt:BJKhEBE:BJKjIQy:BJKoXVF: +BJKwMZw:BJKyLRi:BJLBfWi:BJLFavu:BJLGbuZ:BJLKxMQ:BJLNgbp:BJLVeYf:BJLWzEt:BJLYBkl:BJLaKGL:BJLcqJ:BJLnVWm:BJLnlzJ:BJLrrDF:BJLtVdD:BJLvYYi: +BJMAcKJ:BJMAzqk:BJMBUti:BJMCOho:BJMLaVN:BJMObUa:BJMPfUb:BJMQwAY:BJMRFjm:BJMSxmj:BJMTgBK:BJMdtFb:BJMiDzF:BJMvsxG:BJNMKmu:BJNQSSS:BJNUrjC: +BJNaFZe:BJNdtgF:BJNduhQ:BJNetgE:BJNmikF:BJNvCjf:BJNxNbO:BJNxanN:BJNyoZb:BJOBWxP:BJOBsCq:BJODLtT:BJOEkp:BJOUGHK:BJOWjkH:BJOYhdi:BJOgFtk: +BJOnQHE:BJOwYXQ:BJOxYKa:BJOyOCt:BJPOZDR:BJPUrar:BJPeTTM:BJPhvWd:BJPimQj:BJPplBb:BJPqKey:BJPsYoX:BJPuHxu:BJQEXvf:BJQFZVU:BJQLBRe:BJQLawt: +BJQMWoo:BJQRlkV:BJQSKmT:BJQStaD:BJQYOrI:BJQYxIr:BJQZDwi:BJQeIUW:BJQlHfH:BJQyYOa:BJRBRrJ:BJRBscR:BJRLDgj:BJRYxvS:BJRZxoD:BJRajzj:BJRjGAd: +BJRpFZJ:BJRqhLa:BJRtTyq:BJRyfzR:BJSEMKC:BJSEsVm:BJSEtpN:BJSGgEN:BJSGiKU:BJSIREl:BJSNCGr:BJSQSJX:BJSRDGs:BJSWRRs:BJSWsCk:BJSYpJR:BJSbvAw: +BJSfxlR:BJSgjZs:BJShzCP:BJSjMZP:BJTAWYn:BJTHQyO:BJTUUzt:BJTVXwp:BJTVcaZ:BJTXDmX:BJTXKCd:BJTcsXe:BJThzeb:BJTpSBN:BJTxoyS:BJTzTJr:BJTzfbC: +BJUDFjf:BJUDImU:BJUFWyG:BJUOaVe:BJUQzeD:BJUSfUI:BJUcRTc:BJUduKC:BJUincG:BJUtqbn:BJUwtFI:BJVEhDk:BJVFLuQ:BJVNbcc:BJVPWos:BJVUZKG:BJVZtb: +BJVkTZk:BJVryhK:BJVwMs:BJVydkk:BJWAEsZ:BJWDKME:BJWMXW:BJWQBBU:BJWTzej:BJWUUvT:BJWWGxz:BJWWTSC:BJWWjMv:BJWhKbo:BJWmCsN:BJWoLIp:BJWpTEu: +BJWsako:BJWzRqx:BJXGQjd:BJXKZlT:BJXRPnG:BJXSNlU:BJXXKUe:BJXXhtw:BJXYsir:BJXeYog:BJXfToS:BJXiHbt:BJXnUrT:BJYFtam:BJYHWuc:BJYMQJk:BJYNGGc: +BJYToRH:BJYXPNH:BJYbmqz:BJYfFtF:BJYqoYl:BJYzHBo:BJZAXGz:BJZBmie:BJZCjgy:BJZCqgz:BJZCvjV:BJZGvQj:BJZHlzg:BJZLxvh:BJZOXfK:BJZOtsk:BJZUDsE: +BJZYCgP:BJZkJZS:BJZnRAz:BJZoZFR:BJZwmvt:BJZzpHV:BJaEZYX:BJaJSck:BJaQLij:BJaSNd:BJaTRZo:BJaUcyG:BJaUmBe:BJaYSQE:BJadoYS:BJagQTF:BJamOkM: +BJaoTtb:BJatFJv:BJaxcvI:BJbFCpE:BJbGReg:BJbKhxo:BJbOSjS:BJbPnZU:BJbRonj:BJbTavF:BJbXNpX:BJbYXTg:BJbfhLS:BJbgfRT:BJbmGAV:BJbqBeu:BJbwCmy: +BJbwGWx:BJbwMk:BJbxEbI:BJbzIqu:BJcABEu:BJcCnuv:BJcJXgj:BJcLjGi:BJcLqGj:BJcLvJF:BJcMXqd:BJcShXV:BJcWSJj:BJcdfZY:BJceJzc:BJciZfb:BJcofrm: +BJcsphF:BJdAErV:BJdJjRa:BJdLeYQ:BJdMUiS:BJdOICM:BJdQckF:BJdQzQg:BJdRUTe:BJdSOHc:BJdYgQr:BJdaTgn:BJdofbm:BJdsrvw:BJdttfn:BJdvumw:BJdyDZJ: +BJeAuSQ:BJeEdjr:BJeHbYd:BJePjrx:BJeQabY:BJeQxLV:BJeboYD:BJeoEPk:BJepyES:BJeqnVb:BJerzEu:BJestNB:BJevTGW:BJeyrVn:BJezSbY:BJfAsTW:BJfLktc: +BJfTLTX:BJfbiks:BJfeEQw:BJfjtgp:BJfktgs:BJfkuhd:BJfvFZP:BJfwFTg:BJgFBBG:BJgIbKQ:BJgJUQd:BJgRSPd:BJgcLDd:BJgcdKR:BJgeNBM:BJgeaNL:BJgiUie: +BJglppe:BJgoLff:BJgrtGG:BJgtEPs:BJguTzR:BJhESqG:BJhUXVr:BJhVZvA:BJhZUej:BJhayrV:BJhccVk:BJhjOKo:BJhooyq:BJhuIuC:BJiBkSC:BJiCsIk:BJiKOgp: +BJiPDwv:BJiRcSc:BJipTOJ:BJiqrUL:BJisHBm:BJitmfh:BJixURM:BJizHeZ:BJizKHN:BJjDonU:BJjGXGL:BJjHgeZ:BJjHikA:BJjKNpG:BJjNJOp:BJjNzuO:BJjSGub: +BJjSnZJ:BJjUhzB:BJjUifX:BJjWavY:BJjXpoK:BJjbXvU:BJjcRAl:BJjjCmf:BJjjGWg:BJjkEbV:BJjmIqj:BJjrvaC:BJjvxLf:BJjxzcd:BJjyjzG:BJjzMzd:BJkDjeQ: +BJkOCPU:BJkRXtw:BJkXCuv:BJkcLRU:BJkfaNh:BJkhXVZ:BJkidpF:BJkohlC:BJkpCMi:BJkpGwh:BJkqNAe:BJkxRaC:BJkzBEe:BJlBCiU:BJlEbyF:BJlIcik:BJlKfWe: +BJlTFJz:BJlTIMI:BJlaTJG:BJlafbv:BJlervl:BJljrkI:BJmCjrQ:BJmJxmV:BJmKbYM:BJmUeya:BJmVzes:BJmXBKk:BJmaEPb:BJmbfrT:BJmcyEz:BJmetNK:BJmjqby: +BJmouMG:BJmpKgK:BJmuYyn:BJmzuKT:BJnBpnX:BJnEWXE:BJnEscd:BJnGLTA:BJnLPmx:BJnOktz:BJnQESf:BJnfcbG:BJnjFZi:BJnlOca:BJnmvzJ:BJnrQhp:BJnvCCr: +BJnvNuA:BJoKWxL:BJoKsCm:BJoMLtH:BJoNzFW:BJoTrJF:BJoUkTs:BJoWEso:BJoeLIE:BJogozG:BJokcBn:BJonCSK:BJoqjyT:BJosWWD:BJospI:BJoxozg:BJpAZlO: +BJpHZDV:BJpINlN:BJpJAYY:BJpLORt:BJpLrgB:BJpLxiO:BJpNYrY:BJpVKMi:BJpVtAy:BJpXWUw:BJpXxni:BJpiRnv:BJprmQn:BJpvFTR:BJqGEpS:BJqJZYJ:BJqNZdo: +BJqTrAO:BJqdTtp:BJqfHBv:BJqlQTT:BJqpKED:BJqqRNO:BJqrYOe:BJqtHXH:BJqxmqW:BJrDSjE:BJrEGuk:BJrEnZC:BJrIsvP:BJrItPs:BJrKges:BJrKikh:BJrLReq: +BJrNYQK:BJrPhxy:BJrUCUP:BJrYvSF:BJrZXQK:BJrlfRB:BJrppHi:BJrqsQR:BJrwBeC:BJsARRW:BJsAsCO:BJsBNPw:BJsDXth:BJsFUfY:BJsQgEj:BJsQiKq:BJsWJKc: +BJsWjen:BJsbEBf:BJscCMV:BJscGwW:BJsdIQZ:BJskXVe:BJssMZT:BJsyaNW:BJtAYMC:BJtDBki:BJtEmQn:BJtHWYR:BJtTErd:BJtWFJS:BJtjsXY:BJtlrDc:BJtnVda: +BJttabZ:BJtwukv:BJuCUZQ:BJuDgqy:BJuEXWu:BJuPWyk:BJucrKY:BJugzEg:BJutrdZ:BJuvVDX:BJvGbkT:BJvKjKv:BJvLSST:BJvPLum:BJvRHfb:BJvUheh:BJvYWoo: +BJvZinG:BJvaEpV:BJveGFi:BJvjEQe:BJvmRQo:BJvquwH:BJvrCjA:BJvsaxe:BJvvaKx:BJwBak:BJwDcYY:BJwDhdl:BJwIpNh:BJwaNtL:BJwazzZ:BJwcLOG:BJwdLfX: +BJwjTzl:BJwqKbc:BJwxLDZ:BJwxdKl:BJwzNBs:BJwzaNr:BJxAWOu:BJxNPPc:BJxOraQ:BJxUZyT:BJxZSCg:BJxZSX:BJxdmQi:BJxhFTU:BJxjIum:BJxoHxV:BJxwQtJ: +BJyAXvK:BJyFQJo:BJyGcSq:BJyIWoB:BJyWrAf:BJydYOl:BJyeTOX:BJyjvwp:BJysKEm:BJywHXa:BJzCCgt:BJzHXfO:BJzHtso:BJzOpjt:BJzPvQn:BJzQBea:BJzSnUb: +BJzamvP:BJzjFZu:BJzmzcV:BJztfzM:BJzuJZw:BJzyZFv:BKAFOPY:BKAFvcr:BKAHrAc:BKAJmRj:BKAXxyv:BKAZckM:BKAahvH:BKAlIiG:BKAmbuV:BKAuXHq:BKAuwUO: +BKAygNE:BKBFyof:BKBIXIf:BKBTNuJ:BKBTSXQ:BKBTwFG:BKBcZqC:BKBcaTL:BKBfcnF:BKBgPtE:BKBgXSu:BKBhBuo:BKBnkNG:BKBwkQp:BKByFNF:BKBzsUF:BKCBVcu: +BKCBahm:BKCEuEh:BKCURIf:BKCZHjH:BKCiZQH:BKCiatG:BKCjLwJ:BKClbFG:BKCnCee:BKCngcC:BKCqyyN:BKCxBqs:BKCyDJB:BKDCosS:BKDCqSU:BKDEtCK:BKDIqEa: +BKDKRZG:BKDPNMQ:BKDQaHr:BKDWmdF:BKDhBjh:BKDhers:BKDiqJu:BKDjQcI:BKDoZKp:BKDqAdX:BKDsUgS:BKDtLew:BKDwumt:BKDzZbe:BKEBldq:BKEDPlE:BKEIIHj: +BKEOqeh:BKETyoj:BKEXoSz:BKEYOar:BKEfADq:BKEooRr:BKEpIgs:BKEsIHt:BKEsJJK:BKEyUGZ:BKEzWrG:BKFCzge:BKFEOOK:BKFHJVI:BKFILSs:BKFLTMQ:BKFNfMG: +BKFVBcR:BKFYfTO:BKFaWEN:BKFhUHA:BKFijMa:BKFiqcg:BKFopbf:BKFpXBU:BKFqmdB:BKFyUlG:BKFzDtU:BKGAMNx:BKGCVoa:BKGHwRI:BKGLBWd:BKGRTmX:BKGSMJE: +BKGTfmN:BKGfgXV:BKGlgzt:BKGnRni:BKGnULn:BKGsFZQ:BKGvmDk:BKHAyF:BKHCxYX:BKHHPuw:BKHSCFn:BKHSraM:BKHTQTP:BKHUVaG:BKHbwua:BKHfhcU:BKHgIIi: +BKHhDRe:BKHiqxL:BKHjbUx:BKHnhVf:BKHpfvT:BKHwOEI:BKHwbKn:BKHylGl:BKHyoSN:BKHyshY:BKIFcMd:BKIPraf:BKIQOPR:BKIQUBm:BKIYzAg:BKIhXHV:BKIhwUh: +BKIlvbT:BKIoqXE:BKJHgcf:BKJJzdr:BKJROEC:BKJWgcF:BKJbuh:BKJfqwc:BKJjkQY:BKJlFNo:BKJsBQQ:BKJtwHy:BKJyCEG:BKJygCa:BKKKkRn:BKKLHjs:BKKOyOv: +BKKPzDK:BKKcobF:BKKdyyU:BKKgknW:BKKlqWZ:BKKmbEd:BKKocNV:BKKrFnV:BKKxDZn:BKKyrPg:BKLAPLg:BKLFVht:BKLRnyD:BKLVfyT:BKLXsSD:BKLYFUN:BKLcaSK: +BKLeUgX:BKLfQDX:BKLhjZs:BKLjXak:BKLpnKm:BKLwymu:BKLzABh:BKMBRzw:BKMEldH:BKMFOSA:BKMGeXd:BKMHYPY:BKMNmDv:BKMRXGn:BKMaoRk:BKMcIgJ:BKMeIHm: +BKMeJJR:BKMnuMD:BKMvnkv:BKNInOP:BKNJTKI:BKNKJVf:BKNPhwO:BKNQfMh:BKNRrQq:BKNRvgB:BKNVXUX:BKNbgxx:BKNcXBz:BKNgcip:BKNkUHn:BKNkVYT:BKNlkva: +BKNnUbs:BKNqaHf:BKOADrL:BKOAGiy:BKODDDG:BKOOBCB:BKOOnoo:BKOQJvY:BKORTkv:BKOUTmA:BKOWfmW:BKOZrqN:BKOZxJc:BKObRnP:BKObULW:BKOjmDR:BKOmcIO: +BKOrjmq:BKOrqCw:BKOvUBL:BKPAiiw:BKPCLkz:BKPGcKh:BKPZsVC:BKPdvgu:BKPmYDD:BKPmauk:BKPmiPy:BKPneTO:BKPnetx:BKPohPq:BKPphPQ:BKPqLGt:BKPtCFe: +BKQIOPg:BKQIvcL:BKQKFZX:BKQMMUt:BKQOAjJ:BKQSKvI:BKQcSLz:BKQhBlZ:BKQivGN:BKQkSAk:BKQniqp:BKQoNuA:BKQrhjc:BKQuhpj:BKQwITD:BKQxITd:BKRGHJm: +BKRHJpr:BKRKDWV:BKRNXIH:BKRTNvj:BKRUkrP:BKRYyoH:BKRedIh:BKRislI:BKRksEr:BKRlPtk:BKRpGYd:BKRsOxd:BKRuGav:BKRwLgx:BKRyNaO:BKSCzDb:BKSJRIt: +BKSOHjZ:BKSPyeO:BKSQgCv:BKSZuEz:BKSbLE:BKSckqI:BKSoqWs:BKSrBUV:BKSuQAT:BKTBdc:BKTCOsc:BKTENMc:BKTGIhq:BKTGkaF:BKTHfyM:BKTJVey:BKTNIFD: +BKTRiED:BKTVsRA:BKTXVhm:BKTftQg:BKThymL:BKTmABQ:BKTnIzj:BKTsnKT:BKTtsGz:BKTyQDa:BKUIbnf:BKUMoSH:BKUMqsN:BKUOfKs:BKUQsst:BKURBcT:BKUTIfM: +BKUTOJu:BKUXOSJ:BKUXcT:BKUZNmJ:BKUajzC:BKUnyME:BKUsAbX:BKVECkk:BKVHnXk:BKVHzgs:BKVIInJ:BKVOrWc:BKVOvaC:BKVPcmR:BKVcGEV:BKVdpbp:BKVfWEX: +BKVgaoR:BKVhNTh:BKViQlt:BKVoDtC:BKVrnoh:BKVsdBr:BKVsefI:BKVtgRA:BKVuDgK:BKVwrtM:BKWBBCm:BKWCftp:BKWDLDJ:BKWHMJS:BKWMnxB:BKWMzGZ:BKWNlkK: +BKWOOot:BKWRBWR:BKWSLsL:BKWWGvd:BKWWOIC:BKWXVow:BKWcNqF:BKWhFZG:BKWukVq:BKXAYUQ:BKXJMuV:BKXVOpE:BKXVvCn:BKXZmrv:BKXcqjk:BKXdItf:BKXeGa: +BKXgJXB:BKXnshk:BKXqhVT:BKXyhcg:BKYAsvs:BKYGYuX:BKYZiIG:BKYdhjh:BKYftYi:BKYiqJb:BKYixYu:BKYodMV:BKYpnUZ:BKYueTH:BKYvYdt:BKYvipI:BKYzfVO: +BKZCdGG:BKZCwJB:BKZJhJh:BKZLrpi:BKZNfCT:BKZRVCI:BKZRaHQ:BKZUcqv:BKZWNvs:BKZboyE:BKZdkNp:BKZiGaO:BKZlazY:BKZzLWv:BKaDAjX:BKaEMN:BKaOOPU: +BKaQewz:BKaSMUF:BKaTQBN:BKaaJxr:BKaciqb:BKaghjq:BKampY:BKargNI:BKatebL:BKawlgN:BKawosl:BKbEVCb:BKbEaHz:BKbHOEv:BKbKICV:BKbMhJC:BKbNyEJ: +BKbOrpB:BKbjwHL:BKblDjU:BKbmgwR:BKboazr:BKbrQaq:BKbsoBJ:BKbtyYY:BKcAkRy:BKcEyOa:BKcGfcd:BKcKVcy:BKcKaha:BKcLcQF:BKcQIcM:BKcShjX:BKcUrPY: +BKcXXia:BKcbZQD:BKcbatK:BKccLGQ:BKcecNA:BKcidnd:BKckYjz:BKcuaZi:BKcvPTB:BKcvXsr:BKcwCei:BKcwgcO:BKcyiOS:BKdCZfi:BKdGiEj:BKdHaHN:BKdLtCw: +BKdLvhg:BKdUlDD:BKdVOsM:BKdWPLp:BKdWexh:BKdXYpU:BKdaPZo:BKdcdzT:BKdfZKL:BKdisGT:BKdjPlw:BKdjUby:BKdqorg:BKdsIGF:BKduIha:BKdzVqr:BKeBoSV: +BKeBqsP:BKeJiaB:BKeONmT:BKePahw:BKeTtcN:BKeXqed:BKeZRzB:BKedWrk:BKekJSz:BKenZku:BKerUGV:BKewqjP:BKexqjp:BKeyQCL:BKeyjiz:BKfDrWQ:BKfDvaq: +BKfEVOL:BKfJCkY:BKfNInx:BKfOjhs:BKfQDRX:BKfQGIm:BKfTDdS:BKfXEXI:BKfabsu:BKfctVG:BKfdDtq:BKfpgZY:BKfrRND:BKfrUlC:BKfzmdF:BKgCxRq:BKgKEbg: +BKgLGvV:BKgLOIq:BKgMOXp:BKgNhWm:BKgOCKp:BKgQlky:BKgQwRM:BKgRnxp:BKgRzGh:BKgTOoF:BKgXftB:BKgexwE:BKgfyGu:BKghjml:BKghqCj:BKgitvN:BKgkvYR: +BKgnpBk:BKgogXR:BKgpWeC:BKgqaOI:BKgrNts:BKgsbeY:BKgugzp:BKgxRnM:BKgxULJ:BKgyDTX:BKhCLSx:BKhHcmI:BKhcEHL:BKhcjBM:BKhcjrn:BKhkwue:BKhnnue: +BKhogno:BKhqeBj:BKhwhVb:BKhxBLn:BKiCzAC:BKiGsvE:BKiRxyU:BKiTVAJ:BKiWQBa:BKiXLsQ:BKibhow:BKiehCX:BKifIid:BKigDrh:BKihqXA:BKiibuu:BKiqXHR: +BKiqwUl:BKiugNf:BKivOeD:BKivbkc:BKiwebc:BKixlga:BKixosC:BKixsHT:BKjDXIc:BKjFBdC:BKjNRBR:BKjZRih:BKjbquW:BKjdioq:BKjoLWD:BKjpMTL:BKjskQU: +BKjtsUc:BKjuFNc:BKkAuEO:BKkMwjY:BKkQOeF:BKkVgCC:BKkYzDw:BKkdbEX:BKkjobz:BKkkQAA:BKkmyyi:BKkrBqT:BKkuDJe:BKkvMtE:BKlCqEF:BKlKaHU:BKlYbNZ: +BKldqJr:BKloWRI:BKlpLeP:BKlsXag:BKmQiNq:BKmQpgp:BKmSOaW:BKmbasL:BKmjBJD:BKmsPLg:BKmsUBi:BKnDJVj:BKnHTMr:BKnJfMd:BKnRBcq:BKnSfTl:BKnTLdV: +BKnXMjO:BKnaZZK:BKndRNC:BKndUlD:BKnidBg:BKnkgxt:BKnlmdA:BKnsNQZ:BKnyGEC:BKoDwRT:BKoEXHW:BKoFYep:BKoGINh:BKoHBWy:BKoNTmE:BKoPfmS:BKoSBq: +BKoXBCF:BKoXnok:BKoZDrH:BKobgXK:BKogxLS:BKoigzI:BKojUhU:BKojVyo:BKorXbA:BKosmDV:BKovcIK:BKpAmrk:BKpLOpx:BKpLvCS:BKpNeWW:BKpQVah:BKpUKMe: +BKpYYUl:BKpcIIF:BKpdlGc:BKpdoSA:BKpdshV:BKpnSat:BKppiQO:BKpsOEf:BKpsbKA:BKpyhPU:BKqDxyL:BKqFckw:BKqIQBx:BKqPiIh:BKqRLKe:BKqSQqI:BKqkqXx: +BKqlaUt:BKqlipf:BKqrXXC:BKquhoN:BKrEzdq:BKrQHJI:BKrWXIL:BKrbslM:BKrcNak:BKrgsUL:BKrhkSz:BKrnyUb:BKrsMTc:BKrtCED:BKrtgCb:BKruqux:BKsGnWd: +BKsGxdL:BKsHRbb:BKsJgCz:BKsWRbB:BKsXnWD:BKsXxdl:BKslkqE:BKsnFns:BKssrPB:BKsuBqM:BKtBVhQ:BKtCVtS:BKtMYpG:BKtQfkF:BKtSFUk:BKtTVeE:BKtWIFX: +BKtXIFx:BKtcumZ:BKtdjZV:BKteDlR:BKtlnKH:BKtvABM:BKtwOtk:BKuAOpK:BKuBOSf:BKuDNmf:BKuEjtZ:BKuFIHt:BKuFkAC:BKuJmDQ:BKuQieA:BKuUsrD:BKuZssx: +BKueUBr:BKukPzD:BKunZBR:BKuocnK:BKurhY:BKurnkQ:BKvFLSy:BKvQVke:BKvQYEn:BKvWevs:BKvdfbi:BKveNQS:BKvhkvD:BKvkaHC:BKvqdnb:BKvqxlm:BKvxAia: +BKvzKdv:BKwKBCa:BKwKnoL:BKwMJvz:BKwNrwf:BKwNvAF:BKwQTmb:BKwSfmt:BKwTCKn:BKwWlkG:BKwWwRs:BKwXINO:BKwYYeW:BKwbGeS:BKwdXbF:BKwemDQ:BKwmRnS: +BKwmULT:BKwnDTF:BKwrdbw:BKwreFL:BKwsahz:BKwvaOW:BKwxQLq:BKwyxLT:BKxTAJL:BKxVLSJ:BKxhGXy:BKxmItb:BKxnCFX:BKxpSFR:BKxqJXf:BKxrvBk:BKxsiQv: +BKxwhJe:BKyEOPH:BKyEvcc:BKyFFZW:BKyFRCp:BKyGCfQ:BKyGrAr:BKygSAD:BKykNun:BKyknCP:BKymlgS:BKymosq:BKymsHf:BKypqqV:BKyrqJf:BKyrxYq:BKyvJxO: +BKyxhCj:BKyydMr:BKzAqpU:BKzCNuy:BKzCSXb:BKzCwFt:BKzPNvw:BKzQkrM:BKzUyoU:BKzWfCP:BKzadIu:BKzdLWR:BKzeslT:BKzgsEo:BKzkoyA:BKzmkNt:BKzoOxy: +BKzsLge:BKzucnu:BKzvrtX:BKzydNP:BLACLx:BLAFjit:BLAIdbQ:BLAUSEr:BLAWJYD:BLAXGzg:BLAeAMD:BLAezhK:BLAiyfF:BLAvQnb:BLAzKHX:BLBAFzp:BLBEAqu: +BLBEvzm:BLBKizY:BLBMHsL:BLBORIM:BLBPAGM:BLBQdBj:BLBUQZ:BLBjWqC:BLBldSZ:BLBnnXR:BLBtvdN:BLBwKwT:BLCBIwu:BLCDoXS:BLCOcE:BLCPBWU:BLCQpUd: +BLCSlfT:BLCVvqw:BLCgLYP:BLCidER:BLClJPw:BLClqzA:BLCoiqu:BLCojsJ:BLCqzRx:BLCsAJH:BLCsZd:BLCxJCp:BLCzxxh:BLDBIxv:BLDHAqC:BLDLTzz:BLDLVQj: +BLDRrcv:BLDWEAe:BLDXyIX:BLDYlFM:BLDaHfG:BLDapcb:BLDcDCY:BLDfzrA:BLDjpUz:BLDmLyI:BLDndek:BLDqOKj:BLDrlBn:BLDuiQl:BLDujSS:BLDyHh:BLEBcru: +BLEEWkh:BLEGvrG:BLEIbnE:BLEPeAe:BLERNBb:BLESzEF:BLEYNVW:BLEYbzz:BLEZtRN:BLEcGaw:BLEdAvL:BLEjnHQ:BLEkGds:BLEorBP:BLEqYCG:BLEwCpw:BLFDRnD: +BLFDVXd:BLFEvvY:BLFJcRL:BLFNiWm:BLFOJQf:BLFQba:BLFQdkM:BLFQgpx:BLFbHdN:BLFcToR:BLFddMd:BLFeyFv:BLFffCI:BLFlAVu:BLFpGcL:BLFrrwQ:BLFruUV: +BLGCYeW:BLGGMkL:BLGIyET:BLGJaSr:BLGLlJt:BLGQIpt:BLGSlry:BLGWCRk:BLGiJJA:BLGmsub:BLHIYEN:BLHKqxG:BLHYVzM:BLHYoIf:BLHcALq:BLHcIic:BLHnNLP: +BLHoJjX:BLIISEK:BLIPrba:BLIQIBK:BLIXjiM:BLIavDl:BLIdRiF:BLIfbHI:BLIidsx:BLImKHA:BLIofWw:BLJVIbb:BLJZrPu:BLJbQLJ:BLJdIVl:BLJolnY:BLJpmmQ: +BLJruBC:BLJsKhH:BLKDyiZ:BLKEIwN:BLKGoXh:BLKHtEm:BLKIjzX:BLKJvmN:BLKSojb:BLKUnTb:BLKWKxG:BLKWiqp:BLKYIBL:BLKcGDF:BLKeAJS:BLKnKQ:BLKptbR: +BLKvTHf:BLKxYtM:BLKxzyG:BLLIVBY:BLLKAqj:BLLLSkK:BLLOHyi:BLLSheP:BLLTgl:BLLYBwe:BLLbEKk:BLLbbSp:BLLdlBg:BLLfCwD:BLLiGdM:BLLowkv:BLLsxXX: +BLLvtBY:BLMAgOl:BLMAopK:BLMBtTf:BLMDFTp:BLMFzEY:BLMLNVH:BLMLbze:BLMNdKk:BLMSeAz:BLMUcrj:BLMXNAj:BLMYiwK:BLMmuQV:BLMnJTv:BLMnQzp:BLMnsDx: +BLMwAvS:BLMxnMi:BLMyquu:BLMzSey:BLNATye:BLNDjoq:BLNHtti:BLNLzeV:BLNRNvG:BLNRbZj:BLNSFmw:BLNXmST:BLNazcP:BLNdrwX:BLNgpgH:BLNkGAo:BLNsnhA: +BLODIpO:BLOFqHN:BLOIvxT:BLOMkTY:BLOOkOJ:BLOQBq:BLOQyLP:BLORDdf:BLOZmlW:BLOdbUY:BLOfxad:BLOhHVI:BLOlxeg:BLOpEMW:BLOqQHZ:BLOsQsj:BLOtimg: +BLOwjAC:BLPKZX:BLPKqhe:BLPLVzd:BLPLoIO:BLPQSop:BLPXDDm:BLPbNZW:BLPbnli:BLPcQAT:BLPdOjv:BLPdSQa:BLPeObG:BLPmHvb:BLPnsXC:BLPordn:BLPpIhx: +BLPtHsk:BLPyQSa:BLQCrbF:BLQHKkH:BLQLYvP:BLQMGzy:BLQNdbO:BLQOAgh:BLQSWSC:BLQZHSi:BLQaSLP:BLQbKJf:BLQfKXE:BLQgRia:BLQlCwp:BLQlDdB:BLQoyfx: +BLQtKWq:BLQygxN:BLRCJym:BLRQhsB:BLRRUYl:BLRUvTu:BLRWxpG:BLRXzyW:BLRbSUF:BLReuBz:BLRgSlG:BLRhKjq:BLRilY:BLRnYli:BLRsmmh:BLRtGzi:BLRuQLs: +BLRvSnW:BLRwIVU:BLSAkiq:BLSEBWg:BLSMSJu:BLSOGgn:BLSObG:BLSdIZy:BLSfNcC:BLSjaYL:BLSkYtd:BLSkzyn:BLSrjje:BLSttGH:BLSxidh:BLTFheK:BLTMyIJ: +BLTQFRK:BLTSflf:BLTUGGW:BLTWoSm:BLTXoSM:BLTcUTW:BLTfHfU:BLTfpcp:BLTlNrE:BLTovHm:BLTpSbr:BLTwoMf:BLULvrQ:BLUPfFt:BLUSPEa:BLUVoaC:BLUYBdK: +BLUeYY:BLUfYCQ:BLUmDxw:BLUrapu:BLUuCNX:BLUumlj:BLUzRme:BLVFljt:BLVQvRh:BLVRxlp:BLVTJQP:BLVhKOI:BLVkAqN:BLVqDWo:BLVuHdx:BLVxaPl:BLVypgW: +BLWAYtF:BLWCDfm:BLWDyLy:BLWERzv:BLWIlYM:BLWLCRY:BLWYENB:BLWbgAU:BLWeQsc:BLWijAJ:BLWkIHZ:BLWlHzO:BLWpBLb:BLWyrBt:BLXFxBB:BLXKDDv:BLXTasY: +BLXhgal:BLXjQhJ:BLXmiMw:BLXqjas:BLXsIhc:BLXuxEw:BLXwHsp:BLYCpuR:BLYEzYi:BLYUAQy:BLYUvZa:BLYapmz:BLYaxJJ:BLYcSNi:BLYkYLW:BLYlEbV:BLYnAyt: +BLYnRmt:BLYzWQO:BLZAdOj:BLZCnLL:BLZCsaW:BLZDNBg:BLZDgGu:BLZFMIh:BLZJWss:BLZNnOB:BLZOrPK:BLZQKKx:BLZWFze:BLZdfGJ:BLZeSUa:BLZfyFH:BLZhqXk: +BLZmKwA:BLZoKxu:BLZooAL:BLZrAmJ:BLZrzHE:BLZuDDr:BLZyDwe:BLaANbE:BLaAggW:BLaHtwX:BLaIChe:BLaNNnu:BLaNbBK:BLaTxPb:BLajdcz:BLalWsa:BLaoEbm: +BLarQlV:BLatIvp:BLbEjIs:BLbGUYB:BLbNtWS:BLbOCHn:BLbTOO:BLbTSeu:BLbVJyC:BLbXdBV:BLbYAGq:BLbcWSJ:BLbdAmC:BLbdzHL:BLbmysr:BLbxyFA:BLcAwSs: +BLcBhWT:BLcBnWS:BLcErbx:BLcFkio:BLcJEap:BLcJpUh:BLcLlfX:BLcOTZo:BLcUrCc:BLcYVbe:BLcbIYD:BLcfDcL:BLcmidv:BLctQSq:BLcyGDq:BLdAoYN:BLdEvQr: +BLdGnwz:BLdKkIF:BLdOYvn:BLdPEAy:BLdPpua:BLdRlFQ:BLdRqo:BLdhUTy:BLdixXm:BLdniQp:BLdnjSO:BLdrAjM:BLdroDE:BLdvLyU:BLdxdeW:BLdzbSE:BLeAnNL: +BLeAypi:BLeDdKp:BLeDgPE:BLeMxqo:BLeQTYq:BLeTjOe:BLeZFTk:BLeaNxz:BLebXNd:BLedJTm:BLedQzk:BLedsDc:BLeeSYz:BLegNvR:BLeoDwd:BLeoXuk:BLeqzCD: +BLetrWL:BLetuuK:BLezano:BLfInnu:BLfIyPP:BLfTLra:BLfTWKU:BLfUxQV:BLfVvRz:BLfWiWi:BLfXbNx:BLfYTyH:BLfaCns:BLfamLA:BLfiNXC:BLfjGDN:BLfmSyC: +BLfnrbm:BLfoNVk:BLfpYcz:BLfrGAJ:BLfwXUR:BLfyGcH:BLfzuqT:BLgACRO:BLgByEP:BLgCiBI:BLgFoiW:BLgGYtp:BLgKCta:BLgPmlh:BLgQMkh:BLgSmbh:BLgarDZ: +BLgbJJE:BLgfsuf:BLgrNzc:BLgsiPE:BLgtOJB:BLgtSqU:BLhDRXX:BLhFMKQ:BLhHyeI:BLhIaso:BLhKRxz:BLhRYEJ:BLhVCrv:BLhdsXn:BLiEAgs:BLiPnlg:BLiSJYa: +BLiaEbd:BLibCwk:BLibDdY:BLicAyF:BLicRmF:BLieblb:BLijKWj:BLimQf:BLinDPk:BLirSuJ:BLisnxl:BLiuubv:BLiwSLK:BLjAtWH:BLjDrPY:BLjHSeN:BLjMxpr: +BLjWNNe:BLjgAmX:BLjgzHW:BLjkpMQ:BLjkxja:BLjpvdi:BLkHuey:BLkKoIS:BLkMeZD:BLkOJMB:BLkPpq:BLkRvqP:BLkSvmR:BLkVhEG:BLkXmbw:BLkcdEu:BLkfOkt: +BLkglbp:BLkhlbP:BLkjCWs:BLkopud:BLktJCW:BLkuduS:BLkvHFY:BLlDIWI:BLlFoxo:BLlHVQO:BLlNuEb:BLlOrBD:BLlQoiH:BLlRoJe:BLlTnte:BLlUJmY:BLlViQw: +BLlbGdA:BLldAjT:BLlevHz:BLlkOKO:BLllEKG:BLlmlBk:BLlnJpK:BLmDTYV:BLmFFMD:BLmIPEt:BLmKHnK:BLmMFsL:BLmVlJx:BLmaSeE:BLmgKoe:BLmlanh:BLmoUWX: +BLmpUWx:BLmunHR:BLmxKoE:BLnDRhb:BLnDXSO:BLnGNaa:BLnHovw:BLnMgpU:BLnReaq:BLnTNbv:BLnUzeR:BLniSEr:BLnmsds:BLoAqXa:BLoEmbs:BLoMIpK:BLoNlrf: +BLoPZxy:BLoVxbV:BLobNlv:BLoddKR:BLolFoc:BLoxgAx:BLpBCTQ:BLpDYEC:BLpFqxJ:BLpIoup:BLpLktV:BLpNkoE:BLpUoIK:BLpVfCT:BLpVrZs:BLpWRXq:BLpYmLX: +BLpjBrr:BLpkJju:BLposUV:BLpvrbr:BLpwsXG:BLqBJFX:BLqLIBH:BLqQQiT:BLqSnlx:BLqSsAc:BLqWqc:BLqaYLz:BLqbbHj:BLqkKJb:BLqqDPt:BLqtlNS:BLquSuU: +BLqxGZZ:BLrKgGn:BLrLGZr:BLrRrBM:BLrWJfw:BLrYnLw:BLrYsal:BLrcKwz:BLreKxN:BLreoAw:BLrfRIj:BLrkDDI:BLrqKjm:BLrtVYw:BLrxgXE:BLsCHYG:BLsFvmk: +BLsRXim:BLsTIBI:BLsUfLs:BLsUsS:BLsVSJy:BLsWFBN:BLsWbZY:BLsbidD:BLseIYv:BLsrTHC:BLszicN:BLtDBwb:BLtEAqM:BLtKwsh:BLtOrBc:BLtPkIt:BLtaiQB: +BLtstgM:BLtwiDm:BLtyayI:BLtzYTa:BLtzzYk:BLuANBX:BLuJEok:BLuTiwN:BLuWTYO:BLuZCtv:BLuaGaE:BLucUWa:BLuinHk:BLulpGB:BLuoanq:BLutDwz:BLutXuu: +BLuuquP:BLuvzCZ:BLuzSYd:BLvGNbQ:BLvRPed:BLvUeaV:BLvWRhE:BLvWXSh:BLvcpgk:BLveYcT:BLvfGAl:BLviUwh:BLvouqz:BLvtmLo:BLvuAqr:BLwCENf:BLwIkTt: +BLwLDfi:BLwNRzr:BLwOXI:BLwRlYI:BLwRxSz:BLwVplI:BLwZYtB:BLwcrBP:BLwiJkt:BLwieQV:BLwjEMz:BLwjEmM:BLwlQHW:BLwnQsg:BLwtrDh:BLxGlRv:BLxHoIP: +BLxJfCo:BLxJrZH:BLxKCrd:BLxSylD:BLxTDDr:BLxaObX:BLxfam:BLxkrdq:BLxnxEs:BLxrEMt:BLxrEmC:BLxsQhN:BLxtYgg:BLxviMs:BLyDKke:BLyEnlq:BLyEsAj: +BLyIvtO:BLyJMiU:BLyJdNc:BLyTiZQ:BLyUjiG:BLyVHSD:BLyWUyv:BLyXRiE:BLyZFZx:BLybKXh:BLyboaQ:BLydgxC:BLyezd:BLyhnxz:BLykIvo:BLyrQPN:BLyrUFy: +BLytZYB:BLyvGnU:BLyxAyP:BLyxRmP:BLzDrBR:BLzIJfh:BLzKhsa:BLzOMIl:BLzOdnZ:BLzRpUO:BLzSbi:BLzTzyt:BLzZizH:BLzdKjR:BLzibhZ:BLzjYlJ:BLzmmmK: +BLzobLM:BLzppMg:BLzpxjW:BLzqqXo:BLzrSnt:BLzyWqR:BMADULU:BMADXbJ:BMAHoYT:BMAQbWi:BMAVLZm:BMAVRRm:BMAVpOq:BMAcsGj:BMAhaiO:BMAlNTi:BMAnWoW: +BMAppTe:BMAtgPh:BMAuECe:BMAueBH:BMAwWNp:BMBACMv:BMBARIi:BMBEAXI:BMBJUlN:BMBJXBQ:BMBMKnN:BMBNoyO:BMBQAVC:BMBSRKB:BMBUTHo:BMBVNrU:BMBWbwr: +BMBcNtR:BMBcqvD:BMBisgq:BMBoQx:BMBogjR:BMBozxp:BMBtxov:BMBwUcd:BMBxTqn:BMCCPDt:BMCHchj:BMCJtOl:BMCLEvZ:BMCNhEs:BMCUGBp:BMCVXqA:BMCbexw: +BMCccDS:BMCdNst:BMCiekS:BMCjvDw:BMCkrhn:BMClcZq:BMCoIen:BMCofTf:BMCrNCJ:BMCtSly:BMCvlZa:BMDHTHm:BMDLpdc:BMDMPft:BMDOQPy:BMDPasr:BMDQSez: +BMDQowG:BMDUGyy:BMDWjSc:BMDYsNj:BMDZbhw:BMDbsmN:BMDcIyr:BMDgZDn:BMDjrJh:BMDnbEy:BMDrvdH:BMDssXN:BMDwESj:BMDzNcu:BMEDXjN:BMEIVbB:BMEKAeP: +BMEKVqp:BMENEoa:BMEOJhs:BMEPYWY:BMEQmkM:BMEYaFk:BMEkAxL:BMElJNe:BMEsAFK:BMEskqL:BMEwbYb:BMEyUHg:BMEzOHO:BMFCZNw:BMFEwCY:BMFIeXH:BMFOKlc: +BMFQVjY:BMFSEOZ:BMFUlrT:BMFXnxa:BMFitzq:BMFlalj:BMFtSEz:BMFudXg:BMFwnYx:BMFywwg:BMFzpsB:BMGCNwh:BMGCbIc:BMGCtsi:BMGFdle:BMGFivd:BMGKgxv: +BMGRyWK:BMGTNwH:BMGTbIC:BMGTtsI:BMGXJoQ:BMGYGqa:BMGYOxu:BMGinYk:BMGjAGB:BMGmwfT:BMGqOsl:BMGxWfU:BMGycpW:BMHLvzX:BMHRhFS:BMHRvtm:BMHSgXA: +BMHTITC:BMHUGhM:BMHVCZu:BMHXnMp:BMHmxpJ:BMHpAgu:BMHpqxI:BMHroyK:BMHuwFc:BMHzdcv:BMIDoKg:BMIFImM:BMIHiKH:BMILKHb:BMIMZjR:BMISNRw:BMIZIDr: +BMIdgh:BMIgtjG:BMImZtx:BMIndTg:BMIqxOT:BMIyIWw:BMIyQrH:BMJAoyd:BMJBKsp:BMJBgEV:BMJOpoA:BMJZQOS:BMJagjY:BMJiUco:BMJoiNN:BMJtdtn:BMJwWOg: +BMKAhEj:BMKDjsE:BMKJPFR:BMKKchs:BMKMtOu:BMKNucQ:BMKOEvC:BMKSLUG:BMKVQVm:BMKaIeW:BMKdEsL:BMKfukM:BMKjlZX:BMKocZh:BMKpaEk:BMKtOux:BMKwNsm: +BMLGhec:BMLLsNE:BMLPbDW:BMLQcHz:BMLRUvx:BMLUEVJ:BMLVsFU:BMLWkZM:BMLadnA:BMLdvdG:BMLiESe:BMLkuKd:BMLlNcz:BMLmSLi:BMLqzgg:BMLreKC:BMLsCLq: +BMLssUQ:BMLucza:BMLvyHG:BMLyZDa:BMMCgGA:BMMDmkt:BMMFBMs:BMMKCqR:BMMKznr:BMMRxqX:BMMWbxj:BMMbCxl:BMMcCrk:BMMewWe:BMMfeMm:BMMlOHV:BMMmnUs: +BMMrcE:BMNDVjr:BMNOFFD:BMNaBsF:BMNaWZN:BMNcWoQ:BMNgZMj:BMNhReJ:BMNjBqA:BMNlpsI:BMNtAgO:BMNtdZO:BMNtoEA:BMOHnte:BMOLGqx:BMOLOxl:BMOPVad: +BMORtaF:BMOSlrX:BMOXdSQ:BMObvsQ:BMOfNlr:BMOlXYo:BMOnyBx:BMOrrWR:BMOuJmx:BMOwdCX:BMOxhs:BMOzEPv:BMPDhFT:BMPDvtj:BMPEgXF:BMPGITd:BMPHpzK: +BMPQJOA:BMPcAgR:BMPcqxn:BMPeoyl:BMPjWcB:BMPnIHX:BMPvSJt:BMPyejV:BMPyfhC:BMPzhxE:BMPzxqT:BMQCiVr:BMQLIDu:BMQOKHE:BMQPlVv:BMQUXvN:BMQXImJ: +BMQZBzf:BMQdoXP:BMQlyLP:BMQvTQk:BMRAikX:BMRBLzD:BMRBRrD:BMRBpoX:BMRLclo:BMRSIdb:BMRVZJB:BMRXlvA:BMRarlM:BMRbtJs:BMRloxg:BMRmZj:BMRtylg: +BMRwdtw:BMSFLUl:BMSHPDf:BMSOSEw:BMSOoWJ:BMSPJPk:BMSSHFB:BMSYjDr:BMSacDp:BMSbAYm:BMScBQx:BMShcDA:BMSimJN:BMSlGKu:BMSmCfp:BMSnoxi:BMSrMup: +BMSrotu:BMSvYzC:BMTAsjz:BMTBXQh:BMTEPJS:BMTERxf:BMTJkZt:BMTUMUW:BMTYHfY:BMTabEO:BMTcgd:BMTeCLh:BMTesUH:BMThsXx:BMTlZDX:BMTpTTj:BMTusmx: +BMTwAyV:BMTxIyD:BMTzbJM:BMUOVJT:BMUPAef:BMUPVqF:BMUgpSo:BMUhFwk:BMUhkqz:BMUlbYT:BMUnUHQ:BMUoZSY:BMUpAxz:BMVCLgN:BMVTCQB:BMVTzNb:BMVVAMR: +BMVWVjk:BMVXEOH:BMVcbyK:BMVfXHn:BMVfnuc:BMVgAgV:BMVgdZV:BMVgoEX:BMVnwwu:BMVopsP:BMVtYis:BMVwZsf:BMVyokU:BMVzdXu:BMWGyWY:BMWNJNy:BMWNSJt: +BMWNiUt:BMWTMAq:BMWUtam:BMWcSjV:BMWdrWY:BMWfhXG:BMWfxQV:BMWiiXv:BMWkIhz:BMWmNSS:BMWmTMJ:BMWqauy:BMWsKxM:BMWsZoD:BMWxNly:BMXAvzf:BMXBFfH: +BMXFDo:BMXKCZK:BMXTJnb:BMXTSjo:BMXTiuo:BMXYyeB:BMXbbAo:BMXeKun:BMXejeg:BMXfecI:BMXlxqM:BMXoiTa:BMXrNsh:BMXrTmq:BMXsEpF:BMXtMhF:BMXvaUB: +BMXyKXV:BMYAKHL:BMYKqxw:BMYLLZz:BMYLRRz:BMYLpOf:BMYMWEp:BMYQCmz:BMYQRie:BMYUAxE:BMYZULB:BMYaGkk:BMYgoXy:BMYjECR:BMYlini:BMYmtjm:BMYnTNJ: +BMYnfvW:BMYsqVH:BMZEIde:BMZFBzo:BMZQXXe:BMZStLI:BMZaVaZ:BMZeTuJ:BMZgGKR:BMZkGdi:BMZqtJp:BMZrAnA:BMZvRFE:BMZwZTO:BMaCZjg:BMaDAvT:BMaFRkU: +BMaHSvL:BMaINRB:BMaMULY:BMaMXbF:BMaQoYX:BMaVlVD:BMaiNPN:BMaqgJe:BMaqzXG:BMayUCS:BMbDXXL:BMbELzj:BMbERrj:BMbEpov:BMbFikv:BMbNSVG:BMbPbwn: +BMbSUlR:BMbSXBM:BMbWoyS:BMbZKsG:BMbZgEa:BMbbTqR:BMbcEcB:BMbcebo:BMbeiNy:BMbgTnZ:BMbgfVG:BMbmWOP:BMbrsgm:BMcDSEI:BMcDoWt:BMcILUR:BMcUybb: +BMcmNsx:BMcnTto:BMcyEsy:BMdAqaT:BMdEQSK:BMdGoum:BMdJMUE:BMdQTHi:BMdRPdO:BMdUpdg:BMdWArh:BMdZPJA:BMdZRxt:BMdheKh:BMdjrHU:BMdlAyD:BMdmDkw: +BMdrcdh:BMdsrJl:BMdydnj:BMeBlif:BMeCaFO:BMeIvRb:BMeIwcf:BMeJGLW:BMeJXVY:BMeKtK:BMeTVJF:BMebvzg:BMerXVk:BMesiDR:BMetZSK:BMeuJNa:BMeuRxz: +BMezBQu:BMfMZNS:BMfNvrY:BMfOqk:BMfShc:BMfXaft:BMfYKlG:BMfZAEO:BMfZVQo:BMffecD:BMfrAfT:BMfrFWB:BMfrkQS:BMfxUhx:BMfyZWg:BMfyidI:BMfzAXS: +BMgCGqE:BMgCOxQ:BMgEdGO:BMgIlrE:BMgUgxR:BMgWItp:BMgbKUC:BMgbjEJ:BMggXdO:BMgguwN:BMgkJme:BMglNWb:BMgmdCE:BMgnYhC:BMgoAfI:BMgsAGF:BMgsqXz: +BMguoYx:BMgzWCV:BMhEdsS:BMhQywp:BMhcIYC:BMhdiTs:BMhgWFn:BMhjjeu:BMhvYhA:BMhxOv:BMhyAgy:BMhyqxE:BMiAKNp:BMiDoYq:BMiIThQ:BMiKbWL:BMiOXxn: +BMiPqxe:BMiQiKT:BMiRLZH:BMiRRRH:BMiRpOT:BMicDqQ:BMihNTL:BMihqVZ:BMipgPM:BMiqrLA:BMjFUli:BMjFXBv:BMjGKni:BMjJoyh:BMjKAVd:BMjKas:BMjLZJW: +BMjMRKe:BMjOTHH:BMjRNrr:BMjSpcU:BMjdsgv:BMjgeXg:BMjiDQH:BMjjaIs:BMjkRgx:BMjpxoQ:BMjuAns:BMjvtJB:BMjwtJF:BMjyRFw:BMkAPFn:BMkDchO:BMkEucm: +BMkFtOI:BMkIGYc:BMkJhEV:BMkKjsy:BMkOGBU:BMkQsJv:BMkRXqd:BMkURXj:BMkZkzx:BMkesZa:BMkjinF:BMkknDP:BMkmukq:BMkqbeC:BMkuCld:BMkusuD:BMkxsxt: +BMlEQvh:BMlFdbf:BMlIPfW:BMlJcHv:BMlLtop:BMlMuCT:BMlNEVF:BMlPheo:BMlQGyZ:BMlWGbl:BMlYsjO:BMlcZDM:BMlmszX:BMlnczm:BMlpIER:BMlpftZ:BMluuKH: +BMlvSLe:BMmEKLE:BMmPbxn:BMmSLGZ:BMmUtNo:BMmceCf:BMmdUHz:BMmgCvk:BMmjZmg:BMmoFzt:BMmoWhD:BMmvXhz:BMmvnUw:BMmwAGB:BMmwdzB:BMmwoeL:BMnKVBv: +BMnLAMO:BMnRggL:BMnVbXg:BMnbKL:BMndwwh:BMnnokh:BMnqReN:BMnrCRf:BMnsnYW:BMoGhfY:BMoGvTg:BMoHhfy:BMoHvTG:BMoIItI:BMoPNwU:BMoPtsT:BMoQvZR: +BMoTJoL:BMofqXc:BMohoYa:BMoiwfI:BMotmxK:BMouKUZ:BMoujES:BMozsl:BMpCnMs:BMpMhFP:BMpMvtn:BMpRlRU:BMpTnMS:BMpYYsQ:BMpivgF:BMplAgV:BMplqxj: +BMpnoyh:BMpsOSx:BMptJMu:BMpvdcU:BMqBImn:BMqDBzB:BMqOQoY:BMqPQoy:BMqUIDq:BMqcWNJ:BMqiZCw:BMqjdTD:BMqqVAN:BMqsIWT:BMqsQrk:BMqwGkF:BMrABWL: +BMrBivy:BMrIBZm:BMrNKhN:BMrTXVE:BMrUQOV:BMrcUcJ:BMrhAnZ:BMrpdtK:BMrsNpW:BMrwVaA:BMsDARM:BMsGchT:BMsItOR:BMsKEvd:BMsQkGc:BMsToUH:BMsUbdY: +BMsaNCt:BMsfdNO:BMshsMo:BMsivDI:BMsprjI:BMstWzE:BMswekM:BMszDKR:BMtCheF:BMtHGbE:BMtJiCy:BMtNSep:BMtNowM:BMtOtoY:BMtQEVo:BMtSkZh:BMtYdbO: +BMtaAyj:BMtcfts:BMtlCFw:BMtxmjI:BMtzWZN:BMuSbxI:BMuTFfN:BMuVaFq:BMufOHu:BMuhGDN:BMuhwsp:BMuiAGE:BMuidzE:BMuioeK:BMuqpSC:BMuraLK:BMuyCvl: +BMvBEOl:BMvDlrb:BMvTxQL:BMvcZMw:BMvddXQ:BMvfnYN:BMvmUhj:BMvnOhB:BMvoXHj:BMvonug:BMvpXHJ:BMvpnuG:BMwHGqW:BMwHOxC:BMwWSJp:BMwWiUp:BMwhcpa: +BMwjJup:BMwjyBW:BMwnTEm:BMwphXc:BMwpxQr:BMwqVbf:BMwuEPy:BMwwMHY:BMwxMHy:BMxAGhw:BMxBYCQ:BMxFywF:BMxKFfL:BMxLYsh:BMxOdgf:BMxSMan:BMxTtAr: +BMxZdse:BMxhixi:BMxjIHe:BMxkbAk:BMxlWFX:BMxmcPZ:BMxoecM:BMxqXDf:BMxquWg:BMxrSJI:BMxsaMg:BMyHBZr:BMyKQaq:BMyKwTq:BMyOXvc:BMyTXxX:BMyUpOb: +BMyViKb:BMydVAg:BMyfQrB:BMyrTQF:BMysECV:BMytTrH:BMyuinm:BMywTNN:BMywfvS:BMzIQOi:BMzNIda:BMzPCMG:BMzPRIX:BMzTAXx:BMzWXVZ:BMzXpcC:BMzYsgX: +BMzZqXJ:BMzfoxD:BMznylD:BMzrNtc:BMzrqvu:BMzsdtT:BMzzgpb:BNABSSr:BNAFrAn:BNAUCqK:BNAVUzi:BNAWPW:BNAWTVM:BNAZbgs:BNAeCGJ:BNAeErR:BNAghbR: +BNAiYqV:BNAiqfZ:BNAkIwB:BNAlcBq:BNAlejt:BNAnUru:BNAvSCe:BNAwtFV:BNAzbHk:BNBAKCE:BNBEDBi:BNBHJBV:BNBHvef:BNBIxHY:BNBJSsK:BNBNpSb:BNBNraW: +BNBTJJD:BNBcoLY:BNBhnJL:BNBnSLy:BNBncUY:BNBpCcI:BNBqPfl:BNBtcbH:BNBteJM:BNBvURL:BNBwsUa:BNBxsUA:BNBzLcY:BNCELpc:BNCPbTk:BNCXLcC:BNCebJW: +BNCfxON:BNCnbHP:BNCuuQf:BNCvaBd:BNCwNLk:BNCwxqf:BNCxNLK:BNCxxqF:BNDLJW:BNDMaTC:BNDTMRu:BNDVbtr:BNDebbl:BNDfKHt:BNDffNe:BNDkbjN:BNDkwCF: +BNDnaAt:BNDoOrd:BNDrcAm:BNDscKj:BNDskeA:BNDuWnd:BNDvEtl:BNEBVCn:BNEHGaW:BNEJimu:BNELPCz:BNENYNJ:BNESaFN:BNEcpvS:BNEeIEl:BNElESG:BNElFQR: +BNEnwZs:BNEpIAe:BNEsBxg:BNEuCiV:BNEwEZA:BNFCPcc:BNFNVmb:BNFPsek:BNFPyZd:BNFXNMd:BNFdoJt:BNFdrg:BNFhyqb:BNFmQaf:BNFrVJP:BNFvnUs:BNGCitr: +BNGDIRW:BNGKLON:BNGQqve:BNGWbCg:BNGXkJf:BNGeRUb:BNGepg:BNGonId:BNGrvXR:BNGtiNH:BNGtqkw:BNGvtLB:BNGzzZk:BNHCsOQ:BNHCzfd:BNHGPzx:BNHHQAQ: +BNHOrPc:BNHVqVR:BNHXhYK:BNHhGiy:BNHjTSK:BNHqmFI:BNIASwo:BNIESSi:BNINKcg:BNIRDbK:BNISJbt:BNISvED:BNIUaKI:BNIbnZp:BNIdsuC:BNIlSak:BNIqRsM: +BNIttmy:BNIwDWK:BNIxOaa:BNIySTk:BNJBeOk:BNJGSWd:BNJMHEp:BNJPmLo:BNJVllo:BNJhURE:BNJnCgZ:BNJnERB:BNJpNI:BNJrWJ:BNJyMsM:BNJzgEp:BNKDBaM: +BNKGZwu:BNKGchU:BNKZate:BNKbPJG:BNKeKGB:BNKgyPd:BNKhjDA:BNKiWjt:BNKjDcA:BNKrdGz:BNKwoQq:BNKxxOQ:BNKzzJq:BNLCBFn:BNLJBAB:BNLMTwC:BNLUABm: +BNLbOrM:BNLfcKC:BNLfkeh:BNLgfCX:BNLgwQh:BNLhEte:BNLoDCn:BNLsPem:BNLwPjh:BNLxfNl:BNMBkGa:BNMIoaO:BNMPpGv:BNMXjWq:BNMaojV:BNMiCim:BNMjEZZ: +BNMkhEV:BNMmUnP:BNMnRNQ:BNMrTbh:BNMrWBv:BNMsnuQ:BNMveIu:BNMymQu:BNNBgqk:BNNCseB:BNNCyZM:BNNDabi:BNNKDUt:BNNKIOu:BNNMyjt:BNNNjYO:BNNWYnZ: +BNNhwBW:BNNinnW:BNNkyQv:BNNkyqK:BNNssSU:BNNtRnZ:BNNuifP:BNNvHaD:BNNvXhU:BNNyIau:BNOJzst:BNOPnKQ:BNORXEP:BNOUxaT:BNOVTuX:BNOWIRn:BNOevXk: +BNOgiNq:BNOgqkN:BNOiYUq:BNOpGdD:BNOqOAq:BNOstHJ:BNOtTsa:BNOutkD:BNPBWmt:BNPBqXt:BNPKhYl:BNPNbcW:BNPQkqM:BNPazMw:BNPoYux:BNPqgRj:BNPtwVA: +BNPwOax:BNPzezS:BNQCvcY:BNQFvEm:BNQVqjC:BNQZqiU:BNQdRsd:BNQhwch:BNQkSCw:BNQwgRT:BNRBUZB:BNRCqbH:BNRGtQX:BNRMPDx:BNRWQxe:BNRXQxE:BNRlMsv: +BNRnwCq:BNRsqFq:BNRtdrf:BNRuBSn:BNSAikY:BNSBAbK:BNSJTWe:BNSOyNn:BNSPjqD:BNSSxsy:BNSTEad:BNSWcyC:BNSWfyU:BNSYPhl:BNSZkUO:BNScETC:BNSioQx: +BNSrwZ:BNSyyPm:BNSzzno:BNTBLCl:BNTSaTu:BNTbWJd:BNTkEtz:BNTqoqA:BNTrjwK:BNTrrAP:BNUAaBK:BNUGiUR:BNUHlW:BNUJxta:BNUKILU:BNUKjWX:BNUKsSU: +BNUNSgW:BNUPLkr:BNUVNmo:BNUaESU:BNUdTba:BNUeIAw:BNUjtAu:BNUmAlx:BNUokaL:BNUozvE:BNUrjtR:BNUtDZr:BNVKkgQ:BNVQIlL:BNVQjwA:BNVQssL:BNVRyBN: +BNVVPcQ:BNVXYna:BNVYpgF:BNVbhef:BNVbjLL:BNVcEzj:BNVoeiE:BNVpVtY:BNVptal:BNVukAU:BNVvEsl:BNVvFqy:BNVwRna:BNWCCUr:BNWIPVE:BNWIRyp:BNWIlCY: +BNWIrKY:BNWLaol:BNWNrrm:BNWNsBO:BNWPsot:BNWPzFA:BNWSyYW:BNWWuUa:BNWbPMq:BNWgeZq:BNWiwWd:BNWkFot:BNWktWi:BNXCkEV:BNXDcTb:BNXHIoc:BNXICuI: +BNXLPzf:BNXObCw:BNXSzSd:BNXTaOW:BNXVrRV:BNXVsbt:BNXXsOO:BNXXzfz:BNXYnkA:BNXbtlk:BNXdGyE:BNXfQoP:BNXfnmF:BNXhwVx:BNXjPmJ:BNXmTSq:BNXnGiG: +BNXpIWQ:BNXyniM:BNYHqjD:BNYJaKg:BNYMjIM:BNYQKcI:BNYUDbe:BNYXJbZ:BNYXvEj:BNYYxhU:BNYZSSG:BNYbBsP:BNYeTiu:BNYelcm:BNYgQDt:BNYkSEk:BNYlDWe: +BNYmAfd:BNYnRqz:BNYsolU:BNZBFSy:BNZMqJs:BNZOOlU:BNZPIZO:BNZbOAx:BNZgasI:BNZjyCR:BNZkTIb:BNZklCz:BNZmQdc:BNZmsii:BNZpLcB:BNZsAFs:BNZvSAr: +BNZzpY:BNaDKcp:BNaMuOE:BNaNCqG:BNaPTVA:BNaReow:BNaWSwx:BNaaOmJ:BNaamlO:BNafoll:BNapSll:BNapcuL:BNawnZG:BNaxUrY:BNbAOlR:BNbIbGv:BNbLllz: +BNbMqoP:BNbTCQN:BNbUUZl:BNbVTvH:BNbdCgO:BNbdERW:BNbfhBW:BNbgOMC:BNbgmLF:BNbhYQS:BNbibhn:BNbnEAS:BNbvtfS:BNbxNT:BNbzIWG:BNcCzwI:BNcEVKc: +BNcEWzg:BNcIEav:BNcQvSg:BNcRndt:BNcSevd:BNcULKj:BNcZBav:BNciTCO:BNcizew:BNcrORy:BNcuDaY:BNcvckw:BNcxETQ:BNcyWNY:BNdCcYh:BNdLguO:BNdLxoA: +BNdRka:BNdUkuD:BNdZGyb:BNddbjJ:BNddwCB:BNdexoS:BNdoTcV:BNdozEn:BNdsEzg:BNdwcOj:BNdzzTf:BNeBvxx:BNeELkD:BNeGNtB:BNePPFF:BNeSsEV:BNeSyzY: +BNeaNbt:BNeeVjm:BNegjtd:BNeiImm:BNelpvW:BNenIEh:BNewojI:BNexwbC:BNeynNC:BNfCjVm:BNfFoAI:BNfJvXA:BNfMYnw:BNfMrH:BNfOTJu:BNfOnNt:BNfWVmf: +BNfXVmF:BNfYiMH:BNfkEsz:BNfkFqo:BNfmwzN:BNfqXia:BNfvQab:BNfvxyz:BNgBkJB:BNgFIOn:BNgMIRS:BNgZqva:BNgdmfZ:BNglaWM:BNgnwWr:BNgqzmC:BNgrdi: +BNhAhyz:BNhDkwH:BNhJLoU:BNhKbND:BNhRiTi:BNhTbCE:BNhdEAF:BNhedHI:BNhfGsT:BNhfZav:BNhswwM:BNhtRuy:BNhyzzp:BNhzDmC:BNiBrAI:BNiHJjZ:BNiIBQN: +BNiNIzJ:BNiOAJK:BNiRUzN:BNiSqBD:BNiWtqT:BNiZqOr:BNifPFR:BNifTq:BNiinZL:BNjADBL:BNjBKYI:BNjDSsn:BNjNJJa:BNjPSWh:BNjTakN:BNjWCQW:BNjYTvQ: +BNjncbm:BNjneJh:BNjqnzw:BNjvDwL:BNjxStl:BNkBvhr:BNkHMrO:BNkJbTH:BNkabJt:BNkbaaN:BNkbtDD:BNkcwVc:BNkgztX:BNkphRG:BNkrWjh:BNlAOTP:BNlGLPW: +BNlHvsW:BNlIaTn:BNlJeVT:BNlKnDD:BNlLLkZ:BNlOlgy:BNlVFFk:BNlabbA:BNldKgI:BNlfypo:BNlgbjc:BNlgwCk:BNlhjwP:BNlhrAK:BNlizjz:BNlkOrI:BNllDAi: +BNlocKG:BNlokel:BNlqdgq:BNlvoqz:BNlyDCJ:BNmDVMD:BNmEsEm:BNmEyzb:BNmHPCe:BNmMIoZ:BNmaIEs:BNmjwZl:BNmniqv:BNmoBxx:BNmvssZ:BNmwAtt:BNmxRNu: +BNmzHAk:BNmzXHz:BNnAkgn:BNnETew:BNnIPfV:BNnJGAC:BNnKgqo:BNnNLKT:BNnROBs:BNnXgHT:BNnbhC:BNnepVG:BNngIex:BNngOPk:BNnxCIb:BNnzheY:BNnzjLs: +BNoCctV:BNoCrpI:BNoEXya:BNoGaai:BNoIyYx:BNoJxoK:BNoLqvx:BNoMhyA:BNoSkeB:BNoTctv:BNoTrpi:BNoXIOw:BNoatWF:BNodgrg:BNopiNu:BNopqkJ:BNotGYQ: +BNovQOD:BNovnMR:BNoxwvl:BNpCxAy:BNpETUU:BNpIzSy:BNpXbcs:BNpYkEK:BNpcTSl:BNpoGDI:BNptvxf:BNpvqKC:BNqASSL:BNqEpse:BNqErAP:BNqJtqM:BNqPjX: +BNqQPdM:BNqRFsE:BNqUmla:BNqmRsh:BNqpgRX:BNqrOaD:BNquSTN:BNqzycn:BNrCSWC:BNrGSsE:BNrIHEW:BNrObGD:BNrUKYb:BNrYqIP:BNrZjiO:BNrbURb:BNrjScr: +BNruMsj:BNrvgrQ:BNsELcY:BNsHrLo:BNsIXhZ:BNsJikU:BNsMbTq:BNsSFfE:BNsUvhK:BNsXBfd:BNsYjqH:BNsZNAA:BNsbjDd:BNscyPA:BNsdWjq:BNsiPEG:BNslfcR: +BNslwqb:BNsmETo:BNsnAUJ:BNstcoM:BNsvABW:BNtNrlf:BNtOXHS:BNtQABN:BNtVcYF:BNtVfYP:BNtXPHi:BNtbEtF:BNtcwQK:BNtdIT:BNtkWJX:BNtnPen:BNtxyph: +BNtyhrw:BNuAyJR:BNuBaFx:BNuCjyI:BNuTILQ:BNuTsSQ:BNuUybS:BNuWqxA:BNuYTxH:BNuZaBO:BNuaMaa:BNubBxQ:BNufEZw:BNulHAb:BNulXHs:BNumwbQ:BNuoXIj: +BNurnJV:BNurtTO:BNusVTD:BNustAq:BNutmQx:BNuziFV:BNvFiuO:BNvGafA:BNvMvXs:BNvOmxm:BNvRpgB:BNvUNMr:BNvZIlH:BNvZjwE:BNvZssH:BNvaogp:BNvcnnh: +BNvdIaj:BNveyQI:BNveyqt:BNvoVJF:BNvqjTO:BNvsIMF:BNvwnjo:BNvwttv:BNvytah:BNwBuEl:BNwCbCQ:BNwEkeI:BNwGWMr:BNwGqxr:BNwMNdi:BNwNORN:BNwUkJp: +BNwYHE:BNwYaab:BNxBCuM:BNxEqVh:BNxHueW:BNxKbcj:BNxRyyh:BNxUNDR:BNxXPvz:BNxXRYO:BNxXlcf:BNxXrkf:BNxcnii:BNxkYue:BNxqeY:BNxsOae:BNxvezN: +BNxyIWU:BNxzFOK:BNxztwV:BNyDFsJ:BNyEqiV:BNyNZe:BNydSEo:BNyjaSZ:BNymycA:BNynTiq:BNynlci:BNypQDp:BNypsIz:BNysgRw:BNytErc:BNyuOak:BNyvhbc: +BNyxYqg:BNyxqfk:BNyyOmw:BNyymlr:BNzLjiV:BNzXxHN:BNzYOly:BNzdEAx:BNzfgEN:BNzjSep:BNzmRQa:BNzpasE:BNzqBSK:BNztTIn:BNztlCv:BNzvQdo:BNzvsie: +BOABDjC:BOABjfe:BOAKmDG:BOARBgL:BOATJwm:BOAThdc:BOAcHnu:BOAdVZu:BOAvSCc:BOAyuUr:BOAzQSZ:BOAzwQl:BOBDmog:BOBHcgC:BOBLYpt:BOBSxXI:BOBWjFZ: +BOBXBGS:BOBYfxj:BOBZJWr:BOBamrW:BOBbIAn:BOBbUId:BOBeBqL:BOBlrOB:BOBmgxc:BOBqHEy:BOBusIm:BOBzKRI:BOCBtfS:BOCDnLI:BOCFXr:BOCHriO:BOCRCZC: +BOCWtjk:BOCXYqA:BOCYHVG:BOCfntv:BOCgzTc:BOCoQNu:BOCoXUr:BOCplhM:BOCvnul:BODAZuD:BODDqGF:BODHtFh:BODNwfg:BODRdn:BODWUkV:BODZHLK:BODgfmE: +BODgstk:BODjcfe:BODlnTM:BODnDeb:BODoztX:BODpAuk:BODsEuf:BODwQnN:BODwXuI:BODzPzP:BOECLuG:BOEEouF:BOEGBtA:BOEHrsd:BOEIqzv:BOENMgd:BOESSce: +BOESaIt:BOEcwBZ:BOEiFta:BOEirfe:BOEkRoe:BOElQcw:BOEmFvL:BOEmVQt:BOEqTUv:BOEtqgv:BOEvqRf:BOEvrsW:BOEwsUn:BOFAUES:BOFECOr:BOFFIlk:BOFHIew: +BOFInKC:BOFJLdL:BOFMjmm:BOFQbXF:BOFQtAA:BOFQuWy:BOFWqgO:BOFZQsY:BOFZyUT:BOFmRQZ:BOFolvV:BOFqAOM:BOFrQCn:BOFuJa:BOFwTuo:BOGDojc:BOGECzg: +BOGLXTY:BOGPCU:BOGRaUJ:BOGXZrJ:BOGbwid:BOGdfoR:BOGjYkn:BOGjfMe:BOGjila:BOGzHdg:BOHAtck:BOHBcip:BOHCuRU:BOHKCZn:BOHOQMR:BOHOygF:BOHQXtp: +BOHVSvN:BOHXauC:BOHYoJJ:BOHiIEC:BOHkTRG:BOHlTXi:BOHoYKG:BOHofmL:BOHoiLH:BOHueUX:BOHwwIM:BOIJLmL:BOIPDWk:BOIQQKN:BOIVaJc:BOIjibC:BOIlQSC: +BOIlwQu:BOImcUD:BOIpHOX:BOIvJtF:BOJLfxE:BOJWQkG:BOJcqoD:BOJfxhm:BOJgDJI:BOJgVXo:BOJgma:BOJicvU:BOJjqFP:BOJkPfw:BOJlKRF:BOJncnZ:BOJoiBj: +BOJpiBJ:BOJqQsj:BOJruuB:BOJtqod:BOJxDJi:BOJxVXO:BOKFHlI:BOKKtjR:BOKNXQS:BOKRDbI:BOKWjkd:BOKWyYk:BOKZKdg:BOKZswP:BOKgPZr:BOKiyng:BOKqvTy: +BOKvPFz:BOKybAF:BOLBNQh:BOLDsbW:BOLFTZU:BOLGqGm:BOLIvno:BOLKCzS:BOLOsiT:BOLRNlg:BOLfvlO:BOLiXkU:BOLlYZP:BOLsCBl:BOLvOkg:BOLyRps:BOMBJFp: +BOMBVUp:BOMEaIo:BOMFyuV:BOMYRTz:BOMbaCX:BOMfGOq:BOMfJMK:BOMyISz:BONJSCU:BONJaiD:BONNZfT:BONQrST:BONRcjE:BONXIlb:BONdVqD:BONeQCG:BONhTuF: +BONrKeQ:BONrQNi:BOODaUM:BOOHlbY:BOOJtGm:BOOYTsY:BOOqQAF:BOOwkYn:BOPBQMk:BOPNMrL:BOPSXLp:BOPclHl:BOPfOWa:BOPhCgD:BOPjoiV:BOPlEeT:BOPlybh: +BOPoAoo:BOPwQaQ:BOQIRcA:BOQItgS:BOQIzji:BOQKiXh:BOQPdcf:BOQSzSU:BOQhHnG:BOQrwQU:BOQtLTB:BOQwqXD:BORFRDa:BORGlDf:BORJsMl:BORSixS:BORXepK: +BORZxpB:BORciBS:BORfHEo:BORrgxu:BORyHoH:BORyQjn:BORzBqZ:BOSAsBq:BOSEDbf:BOSFdeG:BOSHRyF:BOSJHeN:BOSYSB:BOSbXOi:BOScvLi:BOShPFu:BOSiMrq: +BOSqYsq:BOStQNc:BOStXUd:BOTBBe:BOTCwfU:BOTEzVq:BOTLdEX:BOTNRYY:BOTPHEQ:BOTdXJY:BOTeAuY:BOTfYSN:BOTnMRN:BOTpbav:BOTuyrh:BOTxvlV:BOTzlHd: +BOUBCoY:BOUDdI:BOUFnkh:BOUHida:BOUNUex:BOUThqc:BOUZBts:BOUoAoF:BOUqPrT:BOUtoAn:BOUtrNi:BOUxAL:BOUxGOx:BOUxJMB:BOVBZfo:BOVFbXT:BOVFtAS: +BOVFuWk:BOVNnKQ:BOVOQsK:BOVOyUF:BOVRqgj:BOVUXbT:BOVbqrM:BOVdZoo:BOVlyet:BOVlzrq:BOVmwbq:BOVrtTE:BOVsFTJ:BOVsrFN:BOVuRON:BOWPCof:BOWPZHx: +BOWTAWf:BOWdQAo:BOWeoIh:BOWgEEj:BOWgyBV:BOWrxjb:BOWsCGz:BOWufqQ:BOXBTSi:BOXEXLw:BOXNoJt:BOXOrNd:BOXVXtN:BOXYFXz:BOXjQav:BOXyVjl:BOYBRqO: +BOYCRdC:BOYEDWy:BOYFWWI:BOYGsmN:BOYTmOS:BOYXcGw:BOYbXrK:BOYdbvE:BOYexpE:BOYhHHB:BOYonMy:BOYrIaZ:BOYrUiP:BOYuwQL:BOYvyP:BOYwwvd:BOZHRQF: +BOZIWxI:BOZLxpI:BOZQSim:BOZSZqi:BOZhXRB:BOZjbVL:BOZnHhK:BOZpqxT:BOZymrj:BOaBWEr:BOaEdcx:BOaHzSK:BOaMKZr:BOaNtgM:BOaNzjw:BOaPiXv:BOaTldC: +BOaUlHS:BOabigZ:BOabqoO:BOaeXrl:BOagbvb:BOajDNt:BOakHHe:BOamVZy:BOavxHQ:BOazqfl:BObADJX:BObEZqp:BObEayF:BObMepy:BObOxpp:BObUYpp:BObcqxm: +BObfnmI:BObmbVu:BObqHhr:BObrHNn:BOburOF:BObzcuF:BOcAtjO:BOcCHVc:BOcGELr:BOcKtfW:BOcLEa:BOcOcAC:BOcTsBC:BOcVTzA:BOcWqgy:BOcXmrO:BOcaqHB: +BOchfMz:BOchsTT:BOchtGa:BOcmcFZ:BOcontr:BOcxUrt:BOcyXKA:BOdGKDa:BOdGsWV:BOdKsbX:BOdLjZu:BOdOzvB:BOdQtFl:BOdZNQG:BOdenUS:BOdiCBC:BOdpfmA: +BOdpsto:BOdptgZ:BOdscfa:BOdunTI:BOeQQcT:BOeTaKC:BOeWPp:BOeZJFO:BOeZVUO:BOedAoP:BOegvBC:BOepsUj:BOeryqt:BOeuQcs:BOezaCg:BOfACbF:BOfAOEX: +BOfAuoR:BOfHqZk:BOfNhup:BOfQIes:BOfRLUZ:BOfhrFx:BOfjROx:BOfrwbG:BOfsqGk:BOfurSJ:BOfvsus:BOgPHwW:BOgRQmg:BOgRyGs:BOgWFxq:BOgaBIZ:BOgjfqc: +BOgkZoL:BOgkgRn:BOgmTrR:BOguxjP:BOgvOwm:BOgxCGH:BOgzoIZ:BOhCoJf:BOhDCZb:BOhJtcg:BOhLuRY:BOhawIa:BOhdUo:BOhuTRk:BOiGTI:BOiJQKR:BOiMsRn: +BOiOfXP:BOiVRdm:BOiWldj:BOiXxxS:BOifcUX:BOihxHX:BOilqfe:BOioKrS:BOipcNo:BOituUw:BOivHec:BOizsiw:BOjAxpw:BOjEajf:BOjGRCo:BOjGzJG:BOjHaFH: +BOjLyY:BOjPQkK:BOjTZX:BOjYLMI:BOjaBqo:BOjeJTC:BOjgGqd:BOjjFhN:BOjlcuA:BOjoxPR:BOjyiBF:BOkAcAz:BOkDriR:BOkFZUB:BOkJTzx:BOkLvNb:BOkNcry: +BOkOHlM:BOkSwFa:BOkUzvE:BOkYELK:BOkbntk:BOkfCba:BOkkQNh:BOkkXUo:BOkrnuq:BOksWN:BOkuAUm:BOkzXOB:BOlAzvI:BOlScRP:BOlUCex:BOlUSCg:BOlYKDj: +BOlZYQU:BOlfcfJ:BOlhnTb:BOljDeM:BOljqhR:BOlmEuI:BOlpvtt:BOlqURd:BOlsohY:BOlsxMu:BOlwPXj:BOlxyNj:BOmAyYa:BOmLJFT:BOmLVUT:BOmOLDJ:BOmVtaG: +BOmeQnf:BOmgFvs:BOmgVQK:BOmhQcH:BOmkTUI:BOmrqRY:BOmrrsh:BOnBIlF:BOnEQsT:BOnEyUY:BOnGRtU:BOnJrSP:BOnTSCq:BOnULdA:BOnXRtu:BOnZQCd:BOnbyek: +BOnbzrn:BOneJmD:BOnnQCC:BOnpiy:BOnqacW:BOnxIsu:BOnyyQD:BOoACzD:BOoJSVd:BOoPrnp:BOohxjO:BOopkYj:BOozQAB:BOpDCoK:BOpDJHp:BOpDwvp:BOpGCZK: +BOpKQMw:BOpKygc:BOpXTSR:BOpvkye:BOqDLmk:BOqJTcU:BOqMQKi:BOqXRqZ:BOqYWXU:BOqaKrH:BOqccNT:BOqeibD:BOqfQSd:BOqfwQR:BOqguUL:BOqhIaO:BOqhUiE: +BOqkxHc:BOqrroc:BOqzbvP:BOrRzsR:BOrSQkb:BOrXRCF:BOrXtGT:BOrXzJn:BOrZixo:BOrcDJl:BOrcVXJ:BOrfKRc:BOrhScV:BOrjEPm:BOrjWCn:BOrmpC:BOrmuuG: +BOrocuh:BOruqFU:BOryGqm:BOsGNqb:BOsJXQp:BOsOdeK:BOsQRyJ:BOsSHeB:BOsUZGn:BOsaYzZ:BOsadHu:BOsfOov:BOshXjj:BOsjSG:BOslXOE:BOsnRPy:BOssbAe: +BOswXjJ:BOtFCzN:BOtYHEU:BOtakIU:BOtbvlr:BOtfxML:BOtoJnX:BOtpYSj:BOtsRpN:BOtwMRJ:BOtxMRj:BOuFQcf:BOuSjMB:BOuUCy:BOuWcJC:BOuaDJU:BOubJMf: +BOucQiT:BOueCKg:BOueqDF:BOufFtw:BOufrfs:BOulvBq:BOupXVA:BOutttX:BOuulVy:BOuzPrP:BOvBMGk:BOvGSCj:BOvILdz:BOvVIea:BOvaQCX:BOvdacL:BOvuyep: +BOvuzru:BOwBlbt:BOwDTsT:BOwEHwA:BOwIXlJ:BOwSrnY:BOwWmwT:BOwYCob:BOwcdhq:BOwmQAk:BOwrbqu:BOwskYC:BOwtAOu:BOxNXLs:BOxZHWx:BOxdoiu:BOxfEew: +BOxfybK:BOxsQar:BOxtfQL:BOxykyZ:BOyBKZI:BOyDRcD:BOyDtgV:BOyDzjl:BOyJdcC:BOyMxxa:BOyQDjT:BOyQjfr:BOyUaYJ:BOyZmDP:BOybJth:BOycVZb:BOydGQO: +BOyggXK:BOylwQp:BOynLTg:BOynwvX:BOyosiE:BOysqXa:BOyvnME:BOzBRDF:BOzFsMK:BOzNaFz:BOzRdCz:BOzWsrE:BOzjJTQ:BOzkrOs:BOzlGqv:BOzqUIU:BOztwqI: +BOzvwVa:BOzyqxX:BPADkED:BPAEEiU:BPAHZjp:BPANZSL:BPANrZd:BPAPIaM:BPATSga:BPAbQVt:BPAgmJW:BPAiPZA:BPAjdwO:BPAsQvC:BPAvXqj:BPAwdSN:BPAwvAh: +BPAyCoR:BPBBHo:BPBBZOE:BPBGNUQ:BPBJTPH:BPBORsv:BPBPwCc:BPBSEgx:BPBVhuH:BPBYcfy:BPBiNmn:BPBjtDA:BPBwpCs:BPByYwf:BPCATSX:BPCChot:BPCGeue: +BPCGhED:BPCOCxT:BPCRnHk:BPCRyyV:BPCVtCV:BPCXMKX:BPCYVwl:BPCYaEa:BPCZlES:BPCaQqU:BPCbKYy:BPChFtm:BPChSmC:BPCoNMe:BPCvVuL:BPCxuKc:BPCyxrV: +BPDCiUJ:BPDFvyv:BPDMCSm:BPDNTFu:BPDRvLs:BPDUAPl:BPDVYlU:BPDVqJX:BPDabbC:BPDcZKb:BPDhSLV:BPDiRjo:BPDjYhH:BPDoqzO:BPDvgVr:BPDvjTH:BPEQqZa: +BPEZApE:BPEZsZT:BPEbrVT:BPEdKeK:BPEhieP:BPEiGBw:BPErsbw:BPEtvhE:BPEuqZF:BPExtlG:BPFClEc:BPFITfJ:BPFKeEv:BPFTALB:BPFUWOt:BPFUcVO:BPFUjqt: +BPFYlI:BPFbnEh:BPFdoBf:BPFhBhW:BPFivdU:BPFjaVW:BPFvFew:BPGDTzS:BPGFUKm:BPGOTFS:BPGPhNZ:BPGRqTj:BPGabpW:BPGbac:BPGgneQ:BPGiUee:BPGjFHn: +BPGjadP:BPGkGkc:BPGkzVA:BPGsLQm:BPGwnO:BPGzOpW:BPHDqRf:BPHESKZ:BPHGFAd:BPHJdDo:BPHKFYc:BPHOSGG:BPHYZsj:BPHYrzB:BPHgkkg:BPHisZR:BPHkeii: +BPHkwzj:BPHnULC:BPHvGeF:BPHxhwD:BPIEVbv:BPIMSkc:BPIPddV:BPISFyZ:BPIVSbF:BPIZSTm:BPIfClU:BPIhXqU:BPIpCwb:BPItUlz:BPItud:BPIzSPz:BPJBwHw: +BPJFCkU:BPJFFo:BPJGcCR:BPJInBf:BPJMSnx:BPJOrP:BPJduka:BPJgXtP:BPJjHcp:BPJjmRw:BPJmaYv:BPJnxsA:BPJpgSW:BPJrxVn:BPJsVUn:BPJymkv:BPKACxO: +BPKFNGp:BPKJure:BPKOhUx:BPKUZOp:BPKcZmK:BPKdNdH:BPKeKYB:BPKhVmH:BPKkxlZ:BPKmsL:BPKpYWV:BPKtxSX:BPKualX:BPKvyJO:BPLCFgK:BPLDvLx:BPLFAdM: +BPLHwFZ:BPLJJTG:BPLMRjW:BPLNBal:BPLNTxk:BPLNUnS:BPLRcvX:BPLUxbN:BPLVNri:BPLavHg:BPLdggd:BPLeAZp:BPLeogv:BPLmYhc:BPLqWq:BPMGTfe:BPMHTfE: +BPMLvlC:BPMNADv:BPMOvYf:BPMVBAW:BPMVTXP:BPMVUNh:BPMXmee:BPMarHk:BPMeqWq:BPMgfOd:BPMqKbS:BPMrQkN:BPMtzvl:BPMusbn:BPMwKeR:BPMyReG:BPMzbBS: +BPNCaNG:BPNOxuo:BPNPxuO:BPNtqXn:BPNuOPi:BPODMNF:BPOGmEp:BPOPRWK:BPORtJf:BPOUxUx:BPOeGCk:BPOgLPl:BPOhXSt:BPOiELI:BPOoDQC:BPOzqxy:BPPFZJM: +BPPHdsi:BPPJASP:BPPNIAp:BPPRrhN:BPPSSBd:BPPUdNx:BPPVwNH:BPPWStO:BPPaWHf:BPPaqJP:BPPkjmU:BPPmgHr:BPPrxkJ:BPPtBoD:BPPuXiD:BPPxhQC:BPQDlTt: +BPQJtZJ:BPQMqrv:BPQXrHE:BPQYwaJ:BPQZXEf:BPQakKW:BPQbszB:BPQcCwK:BPQfWhM:BPQgUlS:BPQhiXP:BPQhuPZ:BPQnCoD:BPQwSeR:BPQxxKA:BPQzBOO:BPRBxHD: +BPRDVyS:BPRJPdy:BPRVMkE:BPRXcCm:BPRYCkj:BPRdxVq:BPRfrIM:BPRfwX:BPRjoCJ:BPRnzbr:BPRsgSh:BPRvxRk:BPRyOQc:BPRyXtO:BPSGnHY:BPSGyyd:BPSIFEZ: +BPSKwhG:BPSTTpQ:BPSVhoF:BPSZwcz:BPSaDqN:BPSarfJ:BPSayCa:BPScmrG:BPSjuvj:BPSpocE:BPSrHzq:BPStQqg:BPSwxSq:BPTAARm:BPTDNM:BPTEHLG:BPTHiUX: +BPTIllm:BPTKFDZ:BPTKOll:BPTLABV:BPTLDGR:BPTMXgK:BPTMbmk:BPTSBdY:BPTZUVe:BPTaiic:BPTbqwS:BPTccoD:BPTeREE:BPTgfSb:BPTkWgA:BPTwOXv:BPTwRWq: +BPTxOXV:BPTxRWQ:BPUDHgo:BPUFqZs:BPUKcVH:BPUQgU:BPUQwfJ:BPUSJtW:BPUWCsV:BPUYBDP:BPUbgvI:BPUbjts:BPUcOei:BPUckvU:BPUcqPA:BPUecrr:BPUffMb: +BPUgiIj:BPUnieb:BPUpxoT:BPUrQFt:BPUtTMM:BPUuLol:BPUyUgR:BPUzpKE:BPVJWOJ:BPVJcVq:BPVJjqJ:BPVKmKj:BPVOMnh:BPVPeEH:BPVhWpr:BPVpFTs:BPVpIuw: +BPVpyrx:BPVrGcE:BPVsGgC:BPVuvSm:BPWDtJa:BPWKxVm:BPWQmkc:BPWSzKu:BPWTtU:BPWUqTD:BPWnobq:BPWuFtZ:BPWuyRQ:BPXDrhG:BPXFXed:BPXHqXw:BPXHwNA: +BPXTkep:BPXUDzw:BPXXZJD:BPXdMKK:BPXeixr:BPXeupx:BPXhWoL:BPXhlMs:BPXmQAu:BPXpNTQ:BPXuxkc:BPXwBom:BPYBkcD:BPYDZSa:BPYDrZI:BPYJDZN:BPYKkEI: +BPYMXAl:BPYQdSY:BPYUzhq:BPYbjMe:BPYcvco:BPYdghB:BPYgGaF:BPYnWOU:BPYnlmj:BPYoSPH:BPYrYfX:BPYsQal:BPYvNtH:BPZExHm:BPZGVyz:BPZIEgg:BPZLhuW: +BPZNcfF:BPZQTsL:BPZWeUq:BPZWheP:BPZbaLw:BPZegSa:BPZgxVX:BPZhqWr:BPZhxLu:BPZmpCl:BPZnoSA:BPZpZMd:BPZqQQA:BPZrKym:BPZxFTy:BPZxSMW:BPaBkGx: +BPaMrHw:BPaOXET:BPaPSTv:BPaQXix:BPaUAsi:BPaWZSH:BPaajdB:BPabPZE:BPacCov:BPaeYfq:BPahzho:BPanhvr:BPanqsT:BPaoWhT:BPaujML:BPawghk:BPazfqA: +BPbASPx:BPbAhGw:BPbCRps:BPbLZOa:BPbTRpS:BPbVzLC:BPbZtcy:BPbapab:BPbboSz:BPbkFTb:BPbkSML:BPbrNmj:BPbuKyv:BPcDlEw:BPcEhUG:BPcGcFV:BPcINx: +BPcITpG:BPcNRSy:BPcQZoJ:BPcfDqX:BPcfyCw:BPcgosQ:BPcitdN:BPcxNMa:BPczQqQ:BPdGmEQ:BPdJsHx:BPdPvyR:BPdWTFq:BPdXTFQ:BPdaTmr:BPdlGbz:BPduqwe: +BPdwfop:BPdwvHH:BPdxqzK:BPeAILo:BPeDUvz:BPeRiuG:BPeUYLX:BPeUqjU:BPeWrmT:BPeZRJQ:BPeewCT:BPegzUC:BPehQkS:BPehRJb:BPejzvq:BPepbBN:BPerZko: +BPeujtE:BPfGTZF:BPfIUkx:BPfQccC:BPfSEEK:BPfTMnz:BPfZsOc:BPfbvdY:BPfoHX:BPfxXsH:BPgBlef:BPgHTFO:BPgLCpT:BPgMTzO:BPgOUKq:BPgTWoq:BPgTcvJ: +BPgTjQq:BPgWcCJ:BPgYEeB:BPgZees:BPgbUey:BPggtAm:BPghvDP:BPgiavR:BPgjbpK:BPgqnem:BPhHSGK:BPhISBs:BPhKdNo:BPhMStX:BPhPFAh:BPhSdDc:BPhTlth: +BPhZtzV:BPhdGAa:BPhgfQo:BPhkqSz:BPhqkkK:BPhsCWW:BPhvWHQ:BPhvqJg:BPhwULO:BPhxixL:BPhxupF:BPiLVbJ:BPiNSgB:BPiVFaa:BPiWpj:BPiYddj:BPiZFyf: +BPicmJt:BPiePZb:BPihRVi:BPimSeG:BPisdSm:BPisvAK:BPiuGEC:BPivkKb:BPixszW:BPizeIl:BPizwZo:BPjHhOr:BPjLeUc:BPjLheB:BPjNEgu:BPjOleU:BPjWnhm: +BPjWyYP:BPjXDF:BPjYFen:BPjaDmH:BPjhNDu:BPjkKpM:BPjmuke:BPjnxLG:BPjqDQz:BPjqycU:BPjsHct:BPjsmRs:BPjvovy:BPjxxse:BPjzyjr:BPkAwhj:BPkHNuE: +BPkLSNe:BPkSura:BPkVccO:BPkcsFZ:BPketAF:BPkgDMQ:BPklayk:BPkqKPT:BPkrVus:BPktLQA:BPkvOqa:BPkvXTM:BPkxsuA:BPlAFDG:BPlAOlq:BPlBYLx:BPlEQcA: +BPlFRjS:BPlOAPC:BPlOszR:BPlPAdi:BPlVqzg:BPldKBl:BPlgrvR:BPlntLa:BPlqdST:BPlrjTg:BPlskVA:BPlsqpU:BPlucRf:BPlvfmv:BPmIYLa:BPmIqjl:BPmLRJh: +BPmMQCz:BPmQTfA:BPmRFGt:BPmWApx:BPmWsZi:BPmYvYB:BPmZgge:BPmeGBj:BPmjSlB:BPmorVi:BPmpvhX:BPmtAzO:BPmtoGI:BPnHxMr:BPnJmec:BPnTIJ:BPnTtjU: +BPnYxuK:BPnaGKY:BPncsaq:BPnlElZ:BPnoFht:BPnoaDJ:BPnsDqp:BPoKTFv:BPoNzqB:BPoSfAY:BPoisAn:BPokvDi:BPonLQh:BPoqXSx:BPotOpr:BPpCFAC:BPpGltC: +BPpJLQi:BPpRkCH:BPpTZsm:BPpTrzE:BPpURj:BPpZDzB:BPpdsZU:BPpfein:BPpfwzm:BPphWHZ:BPphqJl:BPplXix:BPpmXQk:BPprjmi:BPpsvCc:BPptgHN:BPpwGAJ: +BPqEZjJ:BPqFqrz:BPqLdds:BPqRSbc:BPqVSTH:BPqcXIc:BPqgdwu:BPqkszN:BPqpWha:BPqpqjW:BPqtXIC:BPqyqfW:BPqzjMR:BPrCGz:BPrFSPV:BPrFhGY:BPrIZoJ: +BPrKNgj:BPrMwCi:BPrYnUe:BPraXbJ:BPreYwL:BPrfHcS:BPrfmRT:BPrgtDK:BPrjYKs:BPrlyju:BPrmVMR:BPrprIq:BPrsoCV:BPrtmku:BPruBXm:BPrzaLB:BPsEMKN: +BPsIsZv:BPsJCET:BPsKSpa:BPsKhgn:BPsYPDr:BPsaelX:BPsbedV:BPsbjwp:BPsmzBy:BPsrgsc:BPsuriF:BPsyocA:BPtAvLE:BPtCAdp:BPtDwFG:BPtQxbS:BPtSNrT: +BPtaAZm:BPtaogk:BPtgKBu:BPttQfY:BPtwrhM:BPtyLOA:BPuACsr:BPuFvll:BPuHUhV:BPuIAps:BPuIsZb:BPuJFdW:BPuJOLa:BPuLXGF:BPuLbMf:BPuORJC:BPuTHlJ: +BPuUshc:BPucfOK:BPucvhs:BPufgGp:BPugAzd:BPugoGb:BPujWGL:BPumSli:BPuoYHw:BPuqsbA:BPurcOI:BPutReH:BPuvcop:BPuvfso:BPuyxoP:BPvURwA:BPvWtjl: +BPvXqtI:BPveBhM:BPvqOPT:BPvyFTw:BPvyIus:BPwCmES:BPwIWoG:BPwIjQG:BPwJmkg:BPwaGCH:BPwboNJ:BPwyFEd:BPxBZJh:BPxGyID:BPxHZsT:BPxJIAU:BPxOMVW: +BPxPXeH:BPxehwz:BPxgRvr:BPxnxko:BPxpBoa:BPxsCOJ:BPxthQf:BPxuYFM:BPxvQAy:BPyKkcX:BPyMrZU:BPySLqy:BPyTDZr:BPydiXw:BPytxKf:BPyvBOh:BPyzhqo: +BPzEHjM:BPzEJrV:BPzIyhj:BPzLnhS:BPzLyYn:BPzPtcn:BPzTlek:BPzWcfJ:BPzeoCO:BPzljB:BPzvDQD:BPzvyck:BPzwoSM:BPzxNlg:BPzytDR:BQADgI:BQAJuyz: +BQASqcB:BQAVCKS:BQAYuXy:BQAYwyv:BQAcXCy:BQAevuy:BQAfTTO:BQAgNaC:BQAiRfR:BQAkvFP:BQAnhyg:BQAprVG:BQAxFVE:BQAzVg:BQBBzIc:BQBJoYA:BQBKHgP: +BQBLZGe:BQBOwmW:BQBPbsV:BQBRHFO:BQBecQA:BQBroaR:BQBsIIf:BQBsyiG:BQBwDio:BQBwlfY:BQBxtXO:BQCAtyf:BQCCTEc:BQCDgJf:BQCFJie:BQCGjtG:BQCHzih: +BQCLhDQ:BQCPoyJ:BQCRutp:BQCSBAL:BQCTILt:BQCbuks:BQCccaj:BQCcnWY:BQCildP:BQCmWrs:BQCoAZV:BQCpzfP:BQDEAUV:BQDEbpG:BQDFgeh:BQDLOpC:BQDPssq: +BQDSdUK:BQDdoIy:BQDehDj:BQDgMDU:BQDkupp:BQDoJs:BQDstmw:BQDyfhB:BQEALic:BQEBkbb:BQEIuGK:BQEKAuA:BQEKbPP:BQENosp:BQEQOPt:BQETfNK:BQEVoeZ: +BQEcfvz:BQEfgvM:BQEfpDE:BQErTNr:BQEthgP:BQEtkJD:BQFAPmQ:BQFBxSx:BQFFLxk:BQFHNWj:BQFIXms:BQFUySX:BQFlVcy:BQFrife:BQGCaTo:BQGGZOQ:BQGLbGR: +BQGNNwQ:BQGXrPf:BQGaALF:BQGgkQu:BQGtbGk:BQGuzde:BQHCWjy:BQHDwYP:BQHGsaa:BQHLCic:BQHLZSB:BQHNoJF:BQHWJPD:BQHXyOt:BQHZDHN:BQHcIjz:BQHiLNV: +BQHkhYA:BQHmtek:BQHqPbq:BQHterW:BQHvYgO:BQIBMsF:BQIKGsh:BQILUQr:BQIPiaw:BQIRiaX:BQISWCO:BQIZzkD:BQIfTDt:BQIhFBT:BQIkdxP:BQIrJzZ:BQIrVXn: +BQIrVeQ:BQIvPBN:BQJAJop:BQJAtqE:BQJLSVt:BQJNEbc:BQJOkoc:BQJSsQE:BQJWRhU:BQJZPlb:BQJfTeP:BQJfUjG:BQJoIiP:BQJpPRQ:BQJvwuW:BQJxerG:BQKCoyQ: +BQKEBAw:BQKGILo:BQKIbSF:BQKKzis:BQKMlWE:BQKOhDJ:BQKTSvM:BQKUtHh:BQKVuSi:BQKaHbi:BQKaOxM:BQKbALa:BQKczfK:BQKnTEi:BQKplKo:BQKuukh:BQKyyZg: +BQLAwWA:BQLBsAv:BQLKrxR:BQLQplj:BQLXgea:BQLfLla:BQLlfhk:BQLmWwF:BQLomwe:BQLpCTT:BQLzNme:BQMGxtt:BQMJyEJ:BQMNKQN:BQMPSKF:BQMQrXK:BQMSqcX: +BQMWsaO:BQMgiWE:BQMrGvm:BQMrOKS:BQMsmaG:BQMtYPp:BQMvCtM:BQNBVQl:BQNDrpd:BQNExSa:BQNIySa:BQNKHzS:BQNOsho:BQNTGgY:BQNTIiB:BQNgFPh:BQNmgCj: +BQNqbgI:BQNtJxd:BQNwcoE:BQNwgUD:BQOBXMc:BQOCXTt:BQOIMKy:BQOJPMA:BQOPcEL:BQObjxO:BQOdDrc:BQOjZAn:BQOmmXN:BQOsaiN:BQOuVCi:BQOyXnL:BQPIXnS: +BQPOCiZ:BQPWuxf:BQPWwYi:BQPXCcH:BQPXxub:BQPYbO:BQPgern:BQPhYgV:BQPiFPx:BQPjZgp:BQPlIbR:BQPmZNY:BQPvRiN:BQQMzkk:BQQOXNZ:BQQQuKF:BQQSiaX: +BQQUiaw:BQQbZnp:BQQdJzU:BQQdVXa:BQQerVq:BQQfXjV:BQQhPBA:BQQnFpQ:BQRABiZ:BQRGHFY:BQRNeQC:BQRRSaA:BQRTlVd:BQRbIiO:BQRglDm:BQRjTeL:BQRmtXY: +BQRvfXl:BQSAhDC:BQSFtyt:BQSGEBs:BQSHtHA:BQSRKVP:BQSTeqL:BQSXSAN:BQSXwzo:BQSZlvk:BQSdqJz:BQShcax:BQShnWK:BQSiPrA:BQSocqx:BQSpwUg:BQTAlW: +BQTHpRi:BQTKGbp:BQTZqhR:BQThtmE:BQTiRwC:BQTpupB:BQTvkgp:BQUDIbw:BQUEqcQ:BQUIsaF:BQUJXLo:BQUJwwq:BQUKlbH:BQUKsyS:BQULnNh:BQUOHVJ:BQUOkwX: +BQUTco:BQUTzNi:BQUVOPZ:BQUfWWv:BQUfman:BQUhmWU:BQUmLLQ:BQUoRWH:BQUqMdL:BQUuuPi:BQVBHxf:BQVGPmo:BQVMuDm:BQVTxEh:BQVUmis:BQVWIie:BQVaDRM: +BQVbIsm:BQVboUR:BQVincn:BQVnljB:BQVprCH:BQVwJxC:BQWBHZc:BQWGcwJ:BQWHHXq:BQWHIDk:BQWJATj:BQWMSAL:BQWMrPT:BQWSjmC:BQWYOLf:BQWbPjs:BQWcSsH: +BQWhISz:BQWhouE:BQWiybW:BQWonCy:BQWpdEW:BQWqiSy:BQWtlJU:BQWvJdl:BQWzkQG:BQXBXOQ:BQXHGSE:BQXMyOF:BQXNZGt:BQXZuYn:BQXgFby:BQXsFx:BQXsXcm: +BQXuLxJ:BQXuvUm:BQXwNAW:BQXyRFF:BQYCdOZ:BQYCkaf:BQYFBWa:BQYJXoj:BQYQsAH:BQYVZgO:BQYXbIW:BQYbFph:BQYgJzL:BQYgVXx:BQYgVeG:BQYhcBt:BQYpkew: +BQYzUIh:BQZFZdR:BQZGfOG:BQZKsrF:BQZLRhC:BQZQtYR:BQZSTeW:BQZTkou:BQZWjTs:BQZYpoT:BQZfcqN:BQZgZXF:BQZgnVP:BQZhZXf:BQZhnVp:BQZkwuA:BQZmerQ: +BQZsnwm:BQZylDd:BQaAGsU:BQaCUQo:BQaGDhL:BQaHZgD:BQaIWCr:BQaJFWI:BQaVyoV:BQaXBWj:BQaadxm:BQabFVa:BQaoTTK:BQapNaG:BQbAPlo:BQbCSVy:BQbFTel: +BQbIsQh:BQbJjTH:BQbSoYE:BQbUBac:BQbYbsR:BQbbtXk:BQbgeSY:BQbpDik:BQbqOXY:BQbrAlu:BQcGPLd:BQcKBIC:BQcLuSv:BQcYoyN:BQccVXV:BQcdcqN:BQckukw: +BQcnPrw:BQcrIii:BQcryIH:BQcvlFV:BQcwsL:BQcyzfT:BQczAio:BQdAwMI:BQdDLIp:BQdEkBq:BQdORcm:BQdPGbf:BQdXoEi:BQdohzj:BQdwqvv:BQdzQd:BQeBuGW: +BQeDbPL:BQeEgEc:BQeGwmF:BQeMTcm:BQeSREV:BQeTCQU:BQeUyPM:BQedhda:BQemfvF:BQfDdeQ:BQfObge:BQfSXth:BQfYMke:BQfZAo:BQferCz:BQfgyBR:BQfrjXS: +BQfzZar:BQgFJgC:BQgFjIN:BQgJdEZ:BQgULXl:BQgXXMt:BQgZcwd:BQgbmXy:BQgelPG:BQghALz:BQgiaiY:BQgkDrT:BQgqiFb:BQgzrcQ:BQhCZGj:BQhHuVL:BQhKCkY: +BQhUckG:BQhczN:BQhhXcs:BQhlabR:BQhmFvO:BQhndXC:BQhqLBg:BQhsIbG:BQhurvM:BQiEuyg:BQiQIyH:BQiQxEx:BQiRWJb:BQiVsAz:BQiYDhU:BQiaSzU:BQibTTr: +BQicRfo:BQievFm:BQihLnM:BQijhyZ:BQiltEp:BQiqFBP:BQirIJa:BQirsrF:BQjEoYL:BQjGuTv:BQjHuTV:BQjIIlr:BQjJJot:BQjJgZx:BQjJtqA:BQjMzIn:BQjNpof: +BQjQhdW:BQjWEbg:BQjXPL:BQjXthU:BQjaWRU:BQjeAIM:BQjfzFv:BQjmIIK:BQjmyij:BQjqcht:BQjtqjn:BQjxcAl:BQjyPRU:BQkAgJY:BQkBJiz:BQkCjtX:BQkIiyF: +BQkLHGd:BQkNZgq:BQkPJOM:BQkPgzA:BQkPtQx:BQkQILK:BQkRbSB:BQkVRHh:BQkYhDn:BQkcyZC:BQkiWrl:BQklzfO:BQkmAit:BQkuIir:BQkuyIS:BQkycHM:BQkzHbm: +BQkzOxI:BQlAbpj:BQlBoSJ:BQlIfnQ:BQlJpln:BQlLyew:BQlOdUf:BQlPkWL:BQlTIBC:BQlZwWE:BQlahzc:BQlgTnh:BQlhoY:BQlkgVW:BQltYk:BQluGVp:BQluOkN: +BQlvWwB:BQlvmAZ:BQlwYpm:BQlxmwa:BQmAzTC:BQmEuGh:BQmGAub:BQmGbPs:BQmIerA:BQmLSR:BQmPpLw:BQmZrXO:BQmftvb:BQmiNMx:BQmnqVF:BQnBNWO:BQnEXmV: +BQnFshS:BQnGdex:BQnNrgg:BQnRHzo:BQnWcWF:BQnXIdg:BQnZAtf:BQndjXZ:BQnnFPT:BQnsSSD:BQnxIsv:BQnxoUI:BQoAVqi:BQoCSAy:BQoCrPa:BQoDxsd:BQoHbGu: +BQoJNwv:BQoKXMo:BQoMdEA:BQoNsHj:BQoOCf:BQoXysd:BQoYJgX:BQoYjIU:BQoZHZV:BQoljxc:BQopbGL:BQoqfxa:BQovFpm:BQpAZnk:BQpBCct:BQpCyOq:BQpDukS: +BQpFiAM:BQpHCiF:BQpHZSg:BQpJoJc:BQpSdoV:BQpSkAj:BQpVBwm:BQpZXOf:BQpgcbX:BQphVEk:BQphVxT:BQpjXJc:BQpkPbT:BQprFPd:BQpwVEK:BQpwVxt:BQpxcbx: +BQqDIyo:BQqFGsk:BQqGCCM:BQqGxUg:BQqHUQQ:BQqXXNV:BQqYdOO:BQqYkas:BQqbTDW:BQqeRIK:BQqiZGu:BQqpXjz:BQqveRk:BQqzLbW:BQrHSVW:BQrITeB:BQrMjTf: +BQrNsQF:BQrbTes:BQrbUjd:BQretgp:BQrleSw:BQrplmn:BQrsUuZ:BQruAzw:BQsAutF:BQsCJOd:BQsCgzh:BQsCtQQ:BQsDbSK:BQsFHfR:BQsPBIQ:BQsQtHE:BQsfldf: +BQsltxR:BQswoAo:BQszeRS:BQtBUt:BQtFrxM:BQtGIBx:BQtLxTr:BQtOyeL:BQtSHve:BQtSkWw:BQtffhT:BQthYpV:BQtiWwy:BQtimAa:BQtjCTk:BQtkmwZ:BQtliwC: +BQtxTnS:BQuBoep:BQuCxtY:BQuJSKk:BQuLrXF:BQuNqcU:BQuUlbl:BQuUsyw:BQuYHVn:BQugtMJ:BQuhRWL:BQuoWWr:BQuomaj:BQuqmWQ:BQvAdqS:BQvDySb:BQvEceF: +BQvIatN:BQvJNXJ:BQvJgwb:BQvNStY:BQvNTRz:BQvNmiw:BQvRnrG:BQvTxVX:BQvUZwO:BQvUjMp:BQvVuDi:BQvaKvR:BQvcMtb:BQvmkqT:BQvoZad:BQvpJxG:BQvsdeD: +BQvtisj:BQvwljF:BQwFPMd:BQwTSTV:BQwTTru:BQwTmIx:BQwVGGu:BQwVIIn:BQwWnRh:BQwazdK:BQwfiFp:BQwjlPU:BQwkPjo:BQwnaiK:BQworcC:BQwvJXH:BQwxnCe: +BQwydEK:BQxAzKE:BQxCXnt:BQxIiAY:BQxOIYM:BQxPCkk:BQxQGSI:BQxSUqs:BQxWDHP:BQxXZGX:BQxYWcn:BQxZFwU:BQxfLBU:BQxhIbu:BQxkRtL:BQxqdXq:BQyAXoV: +BQyGzkN:BQyKuKc:BQyLyoA:BQyOiaR:BQyQojS:BQyheRb:BQyiNTK:BQyjYGz:BQykTLk:BQymthl:BQyqRTG:BQyrXCj:BQyuIJO:BQyusrh:BQywFVV:BQzCpox:BQzDKmq: +BQzDsrJ:BQzPfOK:BQzYPlX:BQzclDH:BQzgWRk:BQziAzN:BQzqZXj:BQzslmw:BQztcQr:BQzuwum:BRACjrF:BRADZrk:BRAJUgD:BRALObI:BRANUos:BRAQTJD:BRAQjTq: +BRAdYGV:BRAeOZz:BRAhdRG:BRAjaWY:BRAkQQk:BRAvuQF:BRBArxH:BRBCOHF:BRBLShp:BRBMKdV:BRBUiYO:BRBbTMW:BRBdRFN:BRBdTEx:BRBjQms:BRBplwi:BRBrrlp: +BRBurm:BRBvopB:BRBwMZV:BRBwwlN:BRByMlm:BRCFDnc:BRCFPfG:BRCGrXA:BRCNyEf:BRCRSzw:BRCgHAF:BRCntUm:BRCoQMZ:BRDCnLK:BRDDcW:BRDFxvR:BRDMXHY: +BRDNpvp:BRDShak:BRDWSsW:BRDXGly:BRDXnCQ:BRDZXGQ:BRDZown:BRDofKP:BREFzfb:BREGpSd:BREKnlr:BRELxVk:BREQLG:BRERvjm:BRETRKe:BREXyfe:BREbFce: +BREezZF:BREmJcg:BREwfki:BRFAWBq:BRFBrgC:BRFCXnZ:BRFCcxp:BRFDDtR:BRFDKZn:BRFIEkR:BRFSogh:BRFTYTu:BRFUUpW:BRFWIZI:BRFXmHX:BRFYcrB:BRFYzHc: +BRFarrv:BRFgiyj:BRFwTSX:BRFyjAd:BRFyvcP:BRGAIto:BRGEibk:BRGGgho:BRGHzUv:BRGIuJU:BRGJDTK:BRGJKzw:BRGMdsv:BRGOwXH:BRGYxUR:BRGbgB:BRGcVFB: +BRGdfYS:BRGnvCi:BRGwEIo:BRGyfky:BRHIdw:BRHIsMS:BRHJUhW:BRHLZEU:BRHOSJB:BRHRSiW:BRHRkvl:BRHaYgp:BRHeCsW:BRHlpIV:BRHmEHs:BRHmNDC:BRHzMGN: +BRIBUoJ:BRIBmdY:BRIDiWN:BRIEBHG:BRIGZrr:BRIgYGO:BRIlLPn:BRInhyH:BRInocl:BRIriRH:BRJGRcQ:BRJHRcq:BRJJQXb:BRJMPwi:BRJOsDU:BRJVgyH:BRJXZuz: +BRJgFsH:BRJiPFv:BRJiykJ:BRJjwle:BRJkcOw:BRJlMlF:BRJytuO:BRKACEI:BRKAFUm:BRKDSzn:BRKGPiJ:BRKJKlp:BRKJhMb:BRKKsPg:BRKMRCJ:BRKOQxY:BRKPQxy: +BRKUsdN:BRKVzEL:BRKXPij:BRKbpbu:BRKcGmk:BRKmgmL:BRKmoPr:BRKoPfm:BRKoyKQ:BRKpMzf:BRKxTVF:BRLFhaL:BRLLXGV:BRLLowi:BRLOCif:BRLVJVL:BRLVzls: +BRLWSZH:BRLXSZh:BRLZAor:BRLcLkf:BRLfsHG:BRLidIu:BRLlONj:BRLlihU:BRLohUp:BRLqNxV:BRLxLqz:BRMEnDI:BRMFqXF:BRMHDJX:BRMLJRX:BRMRhCi:BRMhkMY: +BRMjmOi:BRMkLKQ:BRMnaWl:BRMoArO:BRMqdiB:BRMriHb:BRMyNXa:BRNBZPA:BRNDxup:BRNGDti:BRNGKZU:BRNJCpQ:BRNPwqC:BRNQcpo:BRNUrgx:BRNflUl:BRNiTSC: +BRNpSIg:BRNsfmy:BRNunfA:BRNwlYQ:BRNyiyq:BROBOqW:BROILN:BROJoGX:BROMDTb:BRONbLY:BROPwXa:BRORxtR:BROXghF:BRObrOC:BROiEIf:BROjnOO:BROppdv: +BROwfYz:BRPGIBe:BRPQFTO:BRPUSiN:BRPUkvu:BRPfWni:BRPgunG:BRPhEiy:BRPqFMZ:BRPrNMx:BRPrzCn:BRPwEiY:BRPxung:BRPzaaJ:BRQCUHG:BRQDbRr:BRQEZeE: +BRQHjrP:BRQWFtF:BRQXjEj:BRQbtUX:BRQepiF:BRQjLVz:BRQvCJO:BRQwNmQ:BRQwzcG:BRQxNmq:BRQxzcg:BRRBKdd:BRRGEIf:BRRHOHt:BRRTOKx:BRRTwgt:BRRTxpC: +BRRVYkU:BRRqRwz:BRRqgdy:BRRsORJ:BRSFWlr:BRSFxWl:BRSKjdT:BRSKkJd:BRSQyET:BRSUzGR:BRSWKDM:BRSYDnQ:BRSYPfu:BRSlTmL:BRSnRfU:BRSnTec:BRSsKQi: +BRStQMh:BRTCqxh:BRTENiB:BRTEkDz:BRTHJVu:BRTHzlJ:BRTKSZq:BRTLSsI:BRTMGlg:BRTMnCO:BRTOXGO:BRTOowp:BRTXhau:BRTaKjq:BRTchUI:BRTdNxO:BRTkLqc: +BRToONs:BRToihL:BRTtfKN:BRUBGLN:BRUBncf:BRUDhCn:BRUFaOu:BRUIvSl:BRUJNIk:BRUJkdS:BRUQSzx:BRUXqXA:BRUhjCk:BRUlIHF:BRUqLQj:BRUuOnz:BRUuiHE: +BRVApY:BRVDgHD:BRVGTI:BRVMmHj:BRVMsy:BRVPOdw:BRVVUBo:BRVYaot:BRVcAyM:BRVcutA:BRVmpDT:BRVstoz:BRVuBfl:BRVxlYx:BRWCcRi:BRWCzhH:BRWEOqL: +BRWFiDp:BRWIwQS:BRWKUCU:BRWKWbZ:BRWMXNq:BRWNzUD:BRWSEKy:BRWTBRT:BRWXODN:BRWhVFP:BRWiSiw:BRWiiQP:BRWqHbk:BRWytOC:BRWzsad:BRXCjeH:BRXDFTd: +BRXFLGy:BRXObrP:BRXPRdn:BRXRZEg:BRXSjRr:BRXXLli:BRXcFCF:BRXdNMs:BRXdNd:BRXdzCe:BRXhuqr:BRXmqGF:BRXrEHa:BRXrNDQ:BRXuOzN:BRXviRz:BRXzCsE: +BRYQpWl:BRYSsmz:BRYURDU:BRYYSjk:BRYZJoK:BRYaQQD:BRYhCJV:BRYmWNY:BRYrTch:BRYwEhZ:BRYwNdj:BRZAXOx:BRZBZoK:BRZCzea:BRZGcjB:BRZHaNj:BRZIWVq: +BRZLzds:BRZMKYI:BRZNlRH:BRZRzgt:BRZVDNw:BRZVPFS:BRZWrxU:BRZeTvk:BRZkmHM:BRZpFMQ:BRZrIli:BRZwHaR:BRaAkMe:BRaCEjy:BRaFsmQ:BRaGTSt:BRaHeYF: +BRaIGQa:BRaUObM:BRaWUow:BRaWmdd:BRaXUoW:BRaXmdD:BRaYiWs:BRaZGay:BRaZjTu:BRabLPs:BRadhyU:BRadocq:BRaetUj:BRagUpt:BRahiRU:BRaqwiT:BRauarL: +BRbAlRQ:BRbBKTS:BRbBtXC:BRbEZoR:BRbKBkb:BRbKaNs:BRbLEIp:BRbQokF:BRbTSZZ:BRbVLYT:BRbVSBO:BRbZKLD:BRbZhmV:BRbcFMH:BRbfRwl:BRbfgdo:BRbmnvi: +BRbrpBA:BRcAvc:BRcEzDc:BRcGlrX:BRcQBKk:BRcQanz:BRcROhK:BRcWyEb:BRcYCEt:BRcYFUP:BRcZPWo:BRcaTmZ:BRcdsEr:BRcdvns:BRcqHAb:BRcwtUi:BRdACLN: +BRdDmpD:BRdEvJX:BRdHpsQ:BRdIzFW:BRdJlcF:BRdNxoI:BRdPAoY:BRdTztg:BRdUndU:BRdVqxZ:BRdXDjD:BRddFCp:BRdtKjC:BRdxkmE:BRdzmou:BReMpVu:BReNpSX: +BReRnlN:BReUxVW:BReVSSR:BReeArZ:BRekxuX:BResxFW:BRfABrs:BRfBmHt:BRfKrgO:BRfPIZE:BRfRIZj:BRfZZPv:BRfcurL:BRffVfW:BRfhfyf:BRfjcDt:BRfmlYf: +BRfrjAh:BRfyEiZ:BRgGfLo:BRgHEKW:BRgPWbt:BRgQzUj:BRgRcXu:BRgSYtp:BRgTUPR:BRgVIzL:BRgXcRG:BRgXzhf:BRgZOqb:BRgfiYo:BRgiuRE:BRgmfYO:BRgprRs: +BRgwCYY:BRgxjaa:BRgxvCU:BRgzxqb:BRhDUOY:BRhDmDJ:BRhFGAw:BRhFTjN:BRhOUGN:BRhTbrn:BRhUZEY:BRhXjRL:BRhYLGG:BRhbaRb:BRhgyqM:BRhrtuD:BRhupIZ: +BRhzLvf:BRiAHa:BRiIObt:BRiJbZr:BRiKUoN:BRiLTJy:BRiLjTL:BRiNBHC:BRiQZrV:BRiWUgy:BRiXsmh:BRiZRDG:BRiaOZg:BRidCSl:BRigTcz:BRjFPwm:BRjGXOJ: +BRjHSBD:BRjLKLO:BRjQRcu:BRjSQXf:BRjVWLF:BRjVxwX:BRjWSZq:BRjYsDq:BRjjlwF:BRjpFsL:BRjsMZy:BRjswla:BRjuMlB:BRkEgYW:BRkFZUE:BRkHoKv:BRkLPWv: +BRkNsdJ:BRkOpGd:BRkUsPC:BRkVRCN:BRkaYVV:BRkdnVY:BRkkpbq:BRkvFSW:BRkxPfi:BRkxyKU:BRkyMzb:BRkywLz:BRkzcoh:BRlGmpk:BRlIXHz:BRlRGlZ:BRlRnCr: +BRlSSst:BRlThcz:BRlVaoa:BRlYvsx:BRlZkDG:BRlafcg:BRlbRXT:BRlcFr:BRlnpQx:BRmBzfG:BRmEnlW:BRmHxVN:BRmNvjH:BRmOXhE:BRmQDJT:BRmTYhe:BRmYAOI: +BRmZGLe:BRmZncM:BRmexFn:BRmgJcB:BRmjRxk:BRmlYyC:BRmqkMU:BRmrQl:BRmsmOe:BRnAdSH:BRnExTE:BRnMogO:BRnOUpp:BRnScre:BRnSzHD:BRnbzUF:BRndjAc: +BRndvcW:BRnexxY:BRnhpyw:BRnnfKg:BRnqBdl:BRoDzUS:BRoFDTn:BRoFKzR:BRoICPV:BRoOKge:BRoQZpF:BRoSxUw:BRoYIzZ:BRocnFf:BRoeluk:BRohTsD:BRompYL: +BRosnOC:BRovlyV:BRoxiYv:BRpAUGG:BRpBNgi:BRpCTBF:BRpFKta:BRpHZEp:BRpNSir:BRpNkvI:BRpZFTs:BRpaawZ:BRpeCZJ:BRpeNly:BRplLvo:BRpowIS:BRpqQqH: +BRpuYP:BRpxCjZ:BRpyFCQ:BRqSPTy:BRqTSIK:BRqTkVp:BRqbRhe:BRqcYGl:BRqfuNB:BRqgCSK:BRqiaWc:BRqmCzs:BRqpYAe:BRquVDY:BRqwwij:BRqyaAO:BRrISZh: +BRrKLYf:BRrLPFx:BRrOKLv:BRrOhmd:BRrTyeY:BRrVCeO:BRrVFuk:BRrYXOS:BRrcFsu:BRrhGMm:BRrorlf:BRrttuR:BRruUkG:BRrvKqd:BRsAKDi:BRsCPie:BRsIiyp: +BRsUhMm:BRsVEik:BRsigmc:BRskPfB:BRsmcoC:BRspRWw:BRspgDt:BRsrOrG:BRswnVr:BRtAJrR:BRtBhaQ:BRtEAoO:BRtHhcC:BRtIztq:BRtJaoX:BRtWhcc:BRtbpQA: +BRtcawf:BRthONw:BRthihH:BRtoIhK:BRttLqg:BRtzKju:BRuBqXe:BRuLGLj:BRuLncB:BRuNXgB:BRuPaOQ:BRuTNIO:BRuTkdw:BRubhuD:BRucfkC:BRudkMz:BRugpqh: +BRuniHA:BRusNXB:BRuzLQn:BRvDbyL:BRvFEkL:BRvMgHH:BRvNWBo:BRvRaox:BRvUwxo:BRvcTSf:BRvgroM:BRvlSIB:BRvliqe:BRvmcDF:BRvylcg:BRwDZpm:BRwEjkr: +BRwLmho:BRwSfnM:BRwXaOq:BRwYbYe:BRwcEIA:BRwenOH:BRwgtWh:BRwizuv:BRwlpdQ:BRwmrOD:BRwqIfQ:BRwrAYH:BRwruTD:BRwtDcY:BRxMFTh:BRxQSii:BRxQkvR: +BRxVsMm:BRxXeyz:BRxYKtz:BRxeaaM:BRxiMGp:BRxkCjA:BRxmzCi:BRxoLvt:BRxrLpO:BRxthYi:BRxtoCM:BRxxiri:BRyKNGy:BRyRjEO:BRySFtc:BRyWSIb:BRyWkVY: +BRyaEhf:BRyaNdV:BRyrFcA:BRysFmv:BRytOZI:BRyzQQX:BRzAkjN:BRzBgyr:BRzNwgW:BRzPrxY:BRzWlRD:BRzbTEI:BRzhpBT:BRziQmb:BRzoORi:BRzqTMF:BRztsen: +BRztvNo:BSAATjK:BSAGlln:BSAGwUZ:BSAIVLu:BSAJXrm:BSAKBPw:BSALjOM:BSAMLCo:BSAREeP:BSAZxUF:BSAcaoS:BSAidIr:BSAmhze:BSAnbTK:BSAptqy:BSAqPyJ: +BSBDcLR:BSBOOwf:BSBOvDM:BSBQePI:BSBSMru:BSBTmuu:BSBciVQ:BSBghMB:BSBjarQ:BSBjiWC:BSBvjTx:BSBwsoH:BSCAyJz:BSCCdXQ:BSCErDJ:BSCILgq:BSCIXmB: +BSCNLtZ:BSCVyGS:BSCXRDi:BSCZOkJ:BSCbyyF:BSCfCaH:BSCkivf:BSClNrW:BSClnDi:BSCwRIC:BSDEnpI:BSDExCa:BSDOTid:BSDVyBN:BSDXmwv:BSDbzGa:BSDfags: +BSDfrss:BSDpkFK:BSDuaSt:BSDvNfY:BSDxsBd:BSDyYxv:BSEBwmv:BSEFNQG:BSEGRNN:BSEMjgo:BSETcVB:BSEhzgz:BSEjgPm:BSEkDMj:BSExyrk:BSFBotk:BSFBqTm: +BSFDhGI:BSFOiBn:BSFPaOJ:BSFSsUk:BSFTtDs:BSFTvoc:BSFXqBY:BSFdWUV:BSFihXN:BSFmcId:BSFnZLH:BSFxqMM:BSFyouc:BSGAIaW:BSGAOMo:BSGFyhB:BSGGOGB: +BSGJjZg:BSGJoTR:BSGJqtT:BSGKJDj:BSGLhgp:BSGNHiQ:BSGNNiV:BSGRifF:BSGWNjP:BSGXaos:BSGenlg:BSGlWuo:BSGpXFA:BSGqZEd:BSGvZlq:BSGzPKJ:BSGzUED: +BSHFxuD:BSHGNPX:BSHIFXR:BSHLrPM:BSHLvfm:BSHMVHP:BSHPMM:BSHRClE:BSHWjoo:BSHcrsC:BSHfZmN:BSHjhZG:BSHkAnS:BSHlDsm:BSHmKcD:BSHpeag:BSHzNVa: +BSIBcJE:BSICGqz:BSIDEeK:BSIPLtr:BSITGqZ:BSIakQo:BSIbsgW:BSIfguV:BSIirSZ:BSIqANJ:BSIvpEg:BSIyaHE:BSJBOwO:BSJBvDd:BSJCzfv:BSJDRdW:BSJFOKt: +BSJGsQp:BSJJvCA:BSJPcju:BSJTQFn:BSJWQeT:BSJehdm:BSJhINQ:BSJotYn:BSJqXog:BSJqwrY:BSJugiS:BSJvnrY:BSJweEV:BSKILLP:BSKKzFO:BSKLOkM:BSKOsqI: +BSKahmr:BSKfBkk:BSKgfQU:BSKnInh:BSKoDud:BSKpexd:BSKsYcn:BSKsaRA:BSKsiwS:BSLCNqe:BSLLPkl:BSLNZGW:BSLTDqM:BSLTqwG:BSLVNrk:BSLVwAf:BSLYugL: +BSLdwmd:BSLhbam:BSLjqrS:BSLkCBo:BSLkgDI:BSLlihu:BSLmsPw:BSLuyRI:BSLxMSH:BSMAHAe:BSMDVdV:BSMDaoN:BSMGcVi:BSMIuBK:BSMJkUV:BSMNyHN:BSMQDpp: +BSMQmWF:BSMZjxb:BSMeYmu:BSMkzgQ:BSMmgYG:BSMncIn:BSMpYXF:BSMqsbT:BSMvkio:BSMzBvP:BSNDEDh:BSNFjSn:BSNGtDh:BSNGvox:BSNKqBB:BSNSaOQ:BSNTYwj: +BSNWhGR:BSNYHIs:BSNYNIt:BSNaTYQ:BSNeIzq:BSNfPkH:BSNfUeF:BSNkqMV:BSNvVvM:BSNwWUM:BSNxLbT:BSNyiGc:BSOCKWC:BSOGbiU:BSOHOwt:BSOJEdc:BSOLjse: +BSOYiIu:BSOhZlx:BSOjatH:BSOlPKC:BSOlUEM:BSOvcit:BSOyACp:BSPBhpg:BSPEXod:BSPItGz:BSPgdio:BSPoPYW:BSPrApd:BSPsmce:BSPvuIt:BSPzfed:BSQCMIY: +BSQDeQQ:BSQGGLA:BSQIrvv:BSQNVLG:BSQNYbL:BSQQTlN:BSQWhPH:BSQZfMo:BSQiWbf:BSQnQKJ:BSQodFa:BSQqSzG:BSQqjjI:BSQqqDO:BSQrUoi:BSQuUEt:BSQwcpN: +BSQxaoa:BSQymCj:BSRCcjn:BSRGQFu:BSRImug:BSRLrFL:BSRWRdL:BSRYVfd:BSRbtYu:BSRdwrB:BSRkINJ:BSRlEOk:BSRljEj:BSRljuI:BSRtRif:BSRxiVC:BSSAAmr: +BSSEKqq:BSSNclk:BSSOOkd:BSSQQEd:BSSTyJT:BSSjXOw:BSSjwRI:BSSrbrP:BSSsexM:BSSvhqN:BSTGkux:BSTHREQ:BSTJgdI:BSTMyFz:BSTWDqj:BSTXnpw:BSTYHME: +BSThqpL:BSTibbr:BSTkNfg:BSTlkVv:BSUArWo:BSUBybg:BSUGZgG:BSUPwaV:BSUbcIW:BSUbdZe:BSUcPST:BSUcXtd:BSUdsbM:BSUjkiV:BSUndnW:BSUrsKv:BSUxktA: +BSVAlCr:BSVCPKF:BSVELxv:BSVJVoU:BSVYflB:BSVcZLZ:BSVeAcr:BSVliGJ:BSVmDkV:BSVrXTP:BSVtiDI:BSWGlck:BSWJOTb:BSWKLXo:BSWLNjb:BSWNIOp:BSWNkFG: +BSWRmCU:BSWUVn:BSWUZAF:BSWYibE:BSWcoUH:BSWfQDz:BSWfjnL:BSWgION:BSWgJMq:BSWhJTL:BSWjTya:BSWshxe:BSWvZEV:BSWxXtI:BSWzidP:BSXKnHq:BSXMJQG: +BSXSfJI:BSXWlLz:BSXWwuN:BSXYVla:BSXYYBj:BSXZXRy:BSXdApm:BSXemcl:BSXjcnq:BSXlfem:BSXmRIn:BSXmUki:BSXsaOG:BSXydif:BSXyxki:BSYKhPw:BSYMfMp: +BSYVrpb:BSYVvFB:BSYdUoV:BSYgkQY:BSYlXeB:BSYouid:BSYpcNH:BSYtgZL:BSYuNvn:BSYvDSB:BSZHzfd:BSZIQSZ:BSZQyjv:BSZUrdF:BSZYXMN:BSZchQl:BSZobRr: +BSZrhWp:BSZryYJ:BSZuqmS:BSZvCAD:BSaDBDL:BSaDnha:BSaFDuB:BSaFGnw:BSaOxMm:BSaSOhU:BSaWTlx:BSaXJi:BSaXMIO:BSaZVhV:BSaccNa:BSafSzQ:BSafqDY: +BSajUEb:BSalMRj:BSalcpX:BSamaow:BSanWbp:BSatdFw:BSbVini:BSbXQVh:BSbYLlD:BSbasol:BSbbeSq:BSbbesF:BSbdhWo:BSbdyYU:BSbfIsA:BSblRZc:BSbmiVu: +BSbqhMf:BSbwfqA:BSbzhHo:BScCclY:BScJdZO:BScKYry:BScbivZ:BSccRzL:BScfhmI:BSciYcu:BSciaRZ:BSciiwH:BSckyyz:BSclISN:BScmFP:BScvotT:BScvsOC: +BSdBayj:BSdETo:BSdMJwH:BSdQHaY:BSdWcvU:BSdXTih:BSdYubw:BSdaCBZ:BSddQfY:BSdfVZi:BSdjqNA:BSdjuXv:BSdkwmq:BSdnZvw:BSdnaSx:BSduYMI:BSeAjxu: +BSeDnPN:BSeDxcf:BSeEgDP:BSeGaYA:BSeJXnY:BSeLBCy:BSeOObu:BSeUybI:BSeWHAR:BSeaBvG:BSeeMsV:BSegBRP:BSehPSz:BSehXtJ:BSeqGFg:BSesbBK:BSetass: +BSfIOgW:BSfMVok:BSfPVsi:BSfWbII:BSfXOWh:BSfbAEW:BSfcOsq:BSflVvZ:BSfmQCG:BSfxZLd:BSfzaTT:BSgAoTn:BSgAqth:BSgCfLU:BSgEstR:BSgFVBV:BSgGgYI: +BSgHgYi:BSgJIak:BSgJOMS:BSgNibk:BSgQxWF:BSgRsun:BSglcia:BSgqtvh:BSguuJI:BSgwDKA:BSgxhxK:BShAjoK:BShBFXV:BShCGNU:BShDcjx:BShHGlU:BShQYnY: +BShTeqe:BShWEEV:BShadfU:BShdAnW:BShiMrH:BShicPz:BShlrsG:BShqnfJ:BShusGJ:BShwnhb:BSiACLX:BSiCllQ:BSiCwUe:BSiFtgx:BSiGBPH:BSiHFxO:BSiLVhM: +BSiSbZp:BSiUxUY:BSiVNpE:BSicaHa:BSidQKg:BSiihzZ:BSijANN:BSikDSp:BSilKCY:BSiuZMS:BSiwnFS:BSizkQk:BSjJygI:BSjKOwK:BSjLCAr:BSjLrfQ:BSjMRdS: +BSjNmuX:BSjOMrX:BSjQAMf:BSjUKQe:BSjbEOt:BSjbjEu:BSjbjuV:BSjjRiy:BSjngiW:BSjpeER:BSjxtYj:BSjzXoc:BSkBYl:BSkFVFb:BSkJLty:BSkOiNy:BSkRyGp: +BSkTCaK:BSkTrFh:BSkVmUa:BSkhNrt:BSkhnDJ:BSkjotk:BSkoBko:BSkunRd:BSkxjtl:BSlDHap:BSlGVDC:BSlLRnP:BSlMIDw:BSlOhMb:BSlQrwc:BSlRyBk:BSlUPkp: +BSlWZGK:BSlaFyQ:BSllkFn:BSlmzGd:BSlogps:BSlrdzi:BSlsPsX:BSlsXTh:BSltsBA:BSlzkIZ:BSmIfdG:BSmMVdZ:BSmMaoB:BSmPcVe:BSmSIdn:BSmWrWz:BSmXuGI: +BSmcyrl:BSmkdiG:BSmqqnq:BSmquxF:BSmtyrL:BSmugPj:BSmvLpE:BSmwpE:BSmyBRK:BSmzCbj:BSmzgdL:BSnLiiB:BSnNOFd:BSnPtDT:BSnPvoD:BSnWlCg:BSnYPKS: +BSnZOtn:BSnhIob:BSnlOzW:BSnolGg:BSnplGG:BSnsouD:BSntBmW:BSnteuL:BSnvQdv:BSnwIoB:BSnzTYm:BSoFJDo:BSoHWms:BSoIVSy:BSoRaoV:BSoSYWm:BSoVtdo: +BSoZqbE:BSoanlB:BSodIZv:BSouVVJ:BSozqmQ:BSpHOnG:BSpKGlr:BSpLrVe:BSpLxmH:BSpPOHp:BSpVDcl:BSpgAnp:BSpiKcg:BSptUOZ:BSpwkqU:BSqAhPl:BSqEbZy: +BSqHNpL:BSqHYNi:BSqKFxf:BSqNeZ:BSqOVhd:BSqQGLe:BSqTXOo:BSqVIIP:BSqXtgq:BSqZfsc:BSqerSw:BSqhnFz:BSqmANg:BSqoKCp:BSqvdId:BSqvxKk:BSqwQKN: +BSqzRil:BSqzUKk:BSrCsQo:BSrHUeC:BSrTsQO:BSrahdr:BSrfeXB:BSrktYq:BSrmXox:BSrmwrF:BSrqgiL:BSrrnrF:BSrseEI:BSrtDUb:BSsBiNP:BSsEepT:BSsEza: +BSsHmUh:BSsKKjF:BSsRcJa:BSsVQfz:BSsXVFk:BSscRIi:BSsjInE:BSskEod:BSskjUF:BSskjee:BSsqtyz:BSssXOs:BSsswRM:BSswgIG:BSsxveQ:BSsyeeB:BSszObe: +BSszblB:BStDugO:BStJZGt:BStSGyq:BStaZvA:BStaaSN:BStfCBl:BStfgDJ:BStgoEt:BSthihV:BStnrwu:BStqDmK:BStukVr:BStwFID:BStxsRD:BSuCuBn:BSuFkUs: +BSuJyHk:BSuKVJY:BSuLDpu:BSuLmWC:BSuVDQa:BSuVqWk:BSuWJWQ:BSuXHmN:BSufGFU:BSuggYb:BSuhbBy:BSujNFl:BSulBRb:BSuzMsd:BSvCtDM:BSvLyHe:BSvShGw: +BSvTHIv:BSvTNIq:BSvXKwM:BSvYZas:BSvfqMS:BSvgBmN:BSvgeuU:BSvhQdO:BSvhjNy:BSvkJmD:BSvmZLv:BSvoOzN:BSvoaTF:BSvrQCU:BSvuiGF:BSwBPkC:BSwCiby: +BSwDLXs:BSwMqbn:BSwdACw:BSwilgW:BSwlqmZ:BSwmoUt:BSwqIOr:BSwqJMM:BSwruO:BSxAXoA:BSxCVlM:BSxCYBF:BSxDBpo:BSxFJQK:BSxJTJS:BSxLfJE:BSxTBdP: +BSxVGNk:BSxbbBV:BSxcdiJ:BSxcxkE:BSxfRIb:BSxfUke:BSxkPYr:BSxoXEw:BSxvSZM:BSxvjJC:BSxvqdE:BSxwUOc:BSyAVhc:BSyLJqB:BSyMLtx:BSyPTjZ:BSyRfjL: +BSyWZU:BSyZBDY:BSyZnht:BSydWbe:BSygNsu:BSykdFB:BSylRik:BSylUKl:BSyraoB:BSyscpm:BSytmCi:BSyycNt:BSzCmuJ:BSzFAMt:BSzHrFa:BSzScLm:BSzdvES: +BSzeINg:BSzsRZx:BSzyYCA:BSzyarn:BSzzeSJ:BTARVSe:BTASZqw:BTATfjq:BTATrsV:BTAWSFq:BTAeIAY:BTAhoUp:BTAkgHv:BTAoFfm:BTAtrKW:BTAuHsl:BTAxiYP: +BTAyBEA:BTBVIYr:BTBXqas:BTBaLwB:BTBaSXw:BTBbEdj:BTBdYnN:BTBfiDZ:BTBlrmx:BTBmIan:BTBwFFZ:BTByxHy:BTCDiSj:BTCGSLZ:BTCINkA:BTCIgnS:BTCJFSC: +BTCNAXF:BTCQCaa:BTCSnfd:BTCbQYu:BTCbUOB:BTCdZPy:BTCfGgn:BTCgBut:BTChApk:BTChRdk:BTCiDmt:BTCtWze:BTCwEki:BTCxBvl:BTCyAjn:BTCzQeR:BTDJisa: +BTDLHzt:BTDPFsH:BTDQhVf:BTDTAxM:BTDTvsU:BTDWCAj:BTDYUUH:BTDZKBU:BTDaGsC:BTDacue:BTDdgiA:BTDkWZN:BTDlGGe:BTDnAJE:BTDuyzv:BTEGjsk:BTEIHpD: +BTEIwZw:BTEPrkp:BTETeSk:BTEVJDm:BTEWTSk:BTEeTAu:BTEhqTs:BTEjJJX:BTEqtNR:BTEuimr:BTEvurE:BTFAFkQ:BTFAbsF:BTFIoPJ:BTFMvXv:BTFPvDt:BTFVrKy: +BTFZesb:BTFbarJ:BTFcoDl:BTFetKH:BTFlvAG:BTFmqtZ:BTFzAcI:BTFzoMA:BTGFBmu:BTGIyye:BTGUxxc:BTGaCGF:BTGamet:BTGiNqv:BTGmSPv:BTGnKfN:BTHBfoc: +BTHCEFp:BTHTEFP:BTHYRaw:BTHYVWD:BTHYXZZ:BTHaHmv:BTHdaYb:BTHefJq:BTHfkTu:BTHgDrm:BTHgEVV:BTHjdWt:BTHkQWp:BTHlRDr:BTHxYjF:BTHywug:BTIFZqn: +BTIJKLa:BTILVTy:BTINurd:BTIWqQv:BTIYMbd:BTIirMV:BTIjERN:BTIoyTo:BTIrTNv:BTItWeA:BTJBlcU:BTJKVsu:BTJLRQD:BTJLcvg:BTJMfJa:BTJMrSF:BTJNMBM: +BTJOmEM:BTJPKlh:BTJQazs:BTJUkfp:BTJbJBC:BTJbexa:BTJkVWw:BTJpErG:BTJzWEH:BTJzxXv:BTKAAXo:BTKAvSw:BTKDryd:BTKGiSC:BTKHSLs:BTKIHZV:BTKMdGq: +BTKWKbw:BTKZGsF:BTKgZPP:BTKkApB:BTKkRdB:BTKmbef:BTKpYIL:BTKpvMT:BTKwgqQ:BTKxQgC:BTLCFsS:BTLGAxV:BTLGvsN:BTLMisz:BTLOHzo:BTLRYuf:BTLWzpF: +BTLlKqc:BTLloHZ:BTLmZpi:BTLplWF:BTLrDMd:BTLspDU:BTLsxce:BTLtSuL:BTLwgiZ:BTLxOIb:BTMDVkJ:BTMFAXy:BTMGJmM:BTMGOcx:BTMGYkU:BTMHoQp:BTMNQUj: +BTMQLTs:BTMUlow:BTMZvxT:BTMbixv:BTMbjzI:BTMhuwX:BTMjLPS:BTMkdLq:BTMnObp:BTMuats:BTMvSWC:BTMwuwx:BTNFmKh:BTNLPwL:BTNNoqk:BTNPVXK:BTNVuLf: +BTNWLth:BTNYEHD:BTNZoCa:BTNgjCo:BTNhiXm:BTNhjZR:BTNlAcP:BTNloMX:BTNoLph:BTNpLpH:BTNsOBK:BTNtEBC:BTNtbZX:BTNvJyO:BTNvqSy:BTNwiXM:BTNwjZr: +BTNxjCO:BTNztnb:BTOAeRe:BTOBmzC:BTOGNHR:BTOGZwJ:BTOLTPR:BTOMdBS:BTOMgYf:BTOPdtX:BTOUzLa:BTOaViP:BTOayoh:BTObfjW:BTOewUa:BTOiSlA:BTOmQsH: +BTOtagl:BTOuMtm:BTOzCyp:BTPHgfk:BTPHoYL:BTPLRan:BTPLXZC:BTPONhm:BTPOZWu:BTPVdTg:BTPYPlO:BTPbYWH:BTPikTl:BTPjPRV:BTPtuxQ:BTPtvik:BTQLSFc: +BTQMmko:BTQOVTR:BTQXZqe:BTQgWej:BTQgxxT:BTQjNej:BTQldBN:BTQmERe:BTQpAek:BTQpyTD:BTQsHFm:BTRBmKT:BTRCSfX:BTROXih:BTRPvQW:BTRSKlQ:BTRaHSE: +BTRbiyy:BTReBeh:BTRkTnF:BTRmWEq:BTRmxXO:BTRrouY:BTSAxYH:BTSBbtH:BTSLGsA:BTSNZtU:BTSSIKT:BTSVoUd:BTSgdjP:BTSpSEh:BTStVpD:BTSxgqv:BTTDUPT: +BTTJzpo:BTTQSlc:BTTSNKx:BTTSgNj:BTTVYqe:BTTYIkc:BTTZrKI:BTTaAdU:BTTazAZ:BTTfGsQ:BTTfcuw:BTTgOro:BTTivmD:BTTqdZP:BTTuKai:BTUArJu:BTUGPWn: +BTUKHPC:BTUQmkJ:BTUVKwp:BTUYSBA:BTUalkm:BTUbiWH:BTUgACr:BTUgomz:BTUiurw:BTUmJJj:BTUzTAG:BTVEQuZ:BTVKVKz:BTVMAxI:BTVQjSp:BTVSwzl:BTVWrKg: +BTVWxWe:BTVfQzn:BTVgiwa:BTVhJyD:BTVhqSr:BTVkGmn:BTVrqth:BTVztKz:BTWGHgv:BTWHzLx:BTWNbsD:BTWSdtA:BTWZWbV:BTWaQsq:BTWasMy:BTWeurJ:BTWgCGp: +BTWgmeB:BTWiMtT:BTWlCyI:BTWoFru:BTWtpNF:BTWwagu:BTWyGhi:BTXDbGr:BTXFjfV:BTXNzlq:BTXONkU:BTXTbSM:BTXVdbC:BTXVgyv:BTXbBuK:BTXdGjb:BTXkpno: +BTXmYjP:BTXoxrj:BTXvQSX:BTXvsmP:BTXwviD:BTXzuRc:BTYAVTK:BTYBkFK:BTYCurV:BTYHVSN:BTYJfjZ:BTYKEGj:BTYTDmG:BTYhVwL:BTYjsqi:BTYnxlF:BTYqSxk: +BTYrEDv:BTYrEdA:BTYtYNR:BTYvidF:BTZAXic:BTZEKlZ:BTZLIYg:BTZZDMN:BTZeiyR:BTZiOkd:BTZnxHL:BTZsrmM:BTZtxLO:BTZvHzH:BTZyytt:BTaGDmh:BTaMfV: +BTaNvqZ:BTaRlCA:BTaZYpH:BTaadBx:BTadEDy:BTadEdN:BTaeyTr:BTahQzd:BTahXis:BTakcVs:BTarJRt:BTarJbW:BTareXu:BTauTio:BTbCfJJ:BTbCrSm:BTbEmEf: +BTbJxKc:BTbMDMW:BTbNyea:BTbVvQe:BTbcsQy:BTbgNSm:BTbgneS:BTbhxLv:BTbjHzq:BTblEDq:BTblEdF:BTbmYnB:BTboiDV:BTbpiDv:BTbsjhR:BTbwxLV:BTbxNSM: +BTbxnes:BTbzLwN:BTbzOcl:BTcCdGD:BTcEbR:BTcFxYZ:BTcGDWl:BTcGWZi:BTcMKbB:BTcThvq:BTcWAXZ:BTcWvSB:BTcbBvP:BTcdQen:BTcgOiN:BTchgIv:BTckKQO: +BTckohv:BTclQYI:BTcmgqd:BTcolwj:BTcpGgR:BTcqfnP:BTcrAjr:BTdCdFK:BTdEhzd:BTdHNKF:BTdHgNT:BTdMzpQ:BTdRnFc:BTdYFsD:BTdcDya:BTdfBUs:BTdhDMs: +BTdiQEU:BTdjyOi:BTdkSgQ:BTdlOrQ:BTdmgiM:BTdprf:BTdqdJy:BTdsYeo:BTdvEKn:BTdxAJi:BTeBfEY:BTeDGnh:BTeFiVj:BTeFozR:BTeNSBo:BTeOtLb:BTePHPm: +BTeVmkd:BTeedWB:BTefodY:BTegxCf:BTekNjE:BTewjcc:BTexixa:BTfFIkz:BTfGFIz:BTfHvUn:BTfIScj:BTfKGNq:BTfLivS:BTfLoZk:BTfSNIj:BTfVjSn:BTfXHPA: +BTfXwzr:BTfYvDx:BTfdTap:BTfkarF:BTfptnW:BTftiMw:BTfuSkt:BTgCTPY:BTgDfON:BTgJohy:BTgXoyX:BTgczJl:BTgjGBs:BTgmdwy:BTgwayo:BTgyktx:BTgzPrB: +BThCRaS:BThGxez:BThHJXz:BThQHGm:BThUBMx:BThXngM:BThXyYh:BThagum:BThdndS:BThhDQd:BThmKFC:BThouRQ:BThsdWp:BThuRDv:BTiExkE:BTiMqAy:BTiNVSx: +BTiSSFl:BTiTyLx:BTifLWH:BTifOCj:BTigEdW:BTiiHFB:BTiprKJ:BTiqHsq:BTivEOA:BTivQhh:BTjRIYQ:BTjUEgU:BTjXMBi:BTjZmKi:BTjaQZt:BTjaXIc:BTjblwR: +BTjgIaM:BTjnAEM:BTjnytb:BTjziyD:BTkBHZZ:BTkFFSf:BTkJAXc:BTkKCaD:BTkMnfA:BTkTUpH:BTkZzPs:BTkbGnJ:BTkdAjk:BTkjyZx:BTkqADI:BTkqzaF:BTkvGSM: +BTkvcUk:BTkwORs:BTkyvMX:BTlCrYa:BTlFisF:BTlHHzS:BTlIYuZ:BTlKhVA:BTlLFso:BTlPAxj:BTlPvsr:BTlSUUo:BTlVKBr:BTlfZpU:BTlhEKe:BTljAPG:BTljRDG: +BTloyzQ:BTlvgQT:BTlwGNc:BTlxBUx:BTlznQm:BTmEMtA:BTmIxwY:BTmLEhS:BTmMocv:BTmSTSL:BTmaTAR:BTmhzrb:BTmvQZR:BTmwEbT:BTmwbzO:BTmxJYx:BTmxqsN: +BTnENIc:BTnFJMJ:BTnFQcy:BTnFYKR:BTnIvXS:BTnJUII:BTnMhlD:BTnNIqk:BTnOmKt:BTnPLtt:BTnREHX:BTnSIuz:BTnTlOp:BTnatKm:BTngTaY:BTnhwbB:BTnjIpl: +BTnmHoZ:BTnnDJd:BTntaTt:BTnuSwD:BTnyLpT:BTnzdlv:BToGfOi:BToPWbC:BToSyUG:BToTbgn:BToVjFJ:BTodXGK:BTofGmX:BTohddV:BToiSPU:BTomGBT:BTorBUW: +BTpAmZx:BTpDoHI:BTpKngT:BTpKyYq:BTpPEFM:BTpVDq:BTpYxeC:BTpafJl:BTpbkTh:BTpfdWi:BTphRDo:BTpizZb:BTpkNQb:BTpoSpb:BTppdDa:BTptDrP:BTptEVk: +BTpwndJ:BTqARqB:BTqAcVa:BTqBZqA:BTqFqrc:BTqQXIW:BTqSMbK:BTqUKLn:BTqVaZu:BTqeoUF:BTqfERa:BTqgJRf:BTqgJbE:BTqgeXg:BTqnTNY:BTqnYd:BTqpWen: +BTqpxxP:BTqtVRR:BTquCu:BTquiYf:BTqyOKP:BTrGqdd:BTrIHc:BTrKikq:BTrKpEC:BTrLmKp:BTrNVtM:BTriNEu:BTrkdbQ:BTrlErz:BTrtTnB:BTrvWEu:BTrvxXK: +BTrzHSA:BTsFNkK:BTsFgnY:BTsHAnt:BTsKbtL:BTsLDWZ:BTsSXTS:BTsSbKE:BTsWZtQ:BTsXZtq:BTsbWXz:BTscEkC:BTsddzc:BTsffnf:BTsjqqG:BTslYIo:BTslvMw: +BTsslGk:BTsuBvf:BTswukQ:BTsxKAZ:BTtCAxs:BTtCvsk:BTtKHzJ:BTtPxys:BTtSzpc:BTtZrrB:BTtfdJk:BTtnQEG:BTuBoQU:BTuJulX:BTuMLTV:BTuOEhz:BTuQloR: +BTuRKqz:BTuRixM:BTuTtLp:BTuVHpJ:BTuVwZy:BTuburk:BTueLPV:BTuibzF:BTujlkq:BTukJYQ:BTukqsg:BTumixs:BTumjzL:BTuqACN:BTuqomF:BTuuluY:BTvFPwk: +BTvJVXl:BTvPrjp:BTvSLtO:BTvUEHc:BTvWlOK:BTvXSbD:BTvZHpF:BTvcjCH:BTvetne:BTvfAcw:BTvhuRr:BTviiME:BTvldlm:BTvnEBd:BTvoQzb:BTvplKh:BTvqiwM: +BTvwaTO:BTwIdBv:BTwIgYC:BTwQzLD:BTwWbsx:BTwYjFc:BTwfDqc:BTwhnAS:BTwnagI:BTwuCyu:BTwvFrI:BTwyuXk:BTwyvIQ:BTxCery:BTxFHGs:BTxHRaM:BTxIWBS: +BTxLxed:BTxRdTD:BTxXNkY:BTxaTfP:BTxcVIL:BTxcyOt:BTxduRO:BTxfCgu:BTxfmEG:BTxgGHL:BTxkBuG:BTxmGjn:BTxnDQZ:BTxoGMH:BTxsrkk:BTxvaGp:BTxwMTq: +BTxxMTQ:BTyAYlI:BTyEMbR:BTyGmkR:BTyQVSJ:BTyRqAK:BTySrsy:BTyUmer:BTyZxkw:BTyssqm:BTywNsy:BTywnEG:BTyxxlb:BTyzHZe:BTzAkfF:BTzIqqI:BTzMqRS: +BTzUIYc:BTzUxR:BTzWqab:BTzZEgg:BTzmJcV:BTzpLwS:BTzpOcq:BTzpSXf:BTzwxHH:BTzzrkQ:BUAAnvH:BUAKMCp:BUAKudg:BUALQzY:BUANpAT:BUAREY:BUARrBv: +BUATIWn:BUAcdXN:BUAjanD:BUAneQi:BUAriCK:BUAwmcY:BUBDtZY:BUBINLN:BUBIbrE:BUBItHO:BUBJdhN:BUBQMcy:BUBQuDn:BUBRsEB:BUBZnOz:BUBbSQb:BUBiVYV: +BUBlNhg:BUBovvu:BUBpaNM:BUBrKCy:BUBrZTp:BUBtaVl:BUCDpXa:BUCGBap:BUCLAmP:BUCNRpQ:BUCPSmH:BUCbpOM:BUCgrWL:BUCqNKJ:BUCuoya:BUCygQa:BUCyzCC: +BUDGXMs:BUDLXCH:BUDVSMC:BUDVZdv:BUDXblj:BUDfxtN:BUDjTjV:BUDkAul:BUDlTIX:BUEAqZg:BUEEQhx:BUEHixD:BUELoLp:BUEMAZ:BUEQTsZ:BUEZhgI:BUEbYaY: +BUEgWaS:BUEmDPD:BUEnscy:BUEpBJB:BUEvTok:BUEydUY:BUFRMNy:BUFYVAM:BUFasvv:BUFdMNe:BUFrrSi:BUFsDpK:BUFtAbx:BUFuBjm:BUGCmpe:BUGDovm:BUGJlrj: +BUGRXMU:BUGaZvR:BUGdZgZ:BUGdtAb:BUGheXS:BUGjvak:BUGkUSO:BUGtDEL:BUGzXMg:BUHBAVX:BUHCVqa:BUHDNFr:BUHEETb:BUHGlil:BUHPVYA:BUHQCJh:BUHQzUH: +BUHUZUO:BUHZTr:BUHiCIQ:BUHiKgz:BUHnexX:BUHzkJO:BUIAtzw:BUIDKEs:BUIIADg:BUIKGjI:BUIQMZK:BUIXtGj:BUIarLc:BUIcxJl:BUIewa:BUIibzN:BUIjKNO: +BUImeXh:BUIoulB:BUIqavB:BUIrOEv:BUItNLn:BUIvYSr:BUIvYsO:BUIyPtz:BUJAXVm:BUJDuDw:BUJJnVX:BUJMdhW:BUJOYhZ:BUJaMsP:BUJcaNT:BUJdIyO:BUJihcJ: +BUJliOw:BUJrKnx:BUJzOeA:BUKAAcs:BUKBBlx:BUKIKUt:BUKQTsU:BUKSbLH:BUKWXcj:BUKXqca:BUKaWtV:BUKjecZ:BUKlDju:BUKpNOH:BUKwTiz:BUKxgKI:BUKzaep: +BULElmp:BULHBLa:BULOKum:BULURPa:BULWTSL:BULcZOY:BULfqYY:BULnoYQ:BULoeCc:BULraRw:BULtZOy:BULxxtU:BULzgFc:BUMABes:BUMDTss:BUMEQMU:BUMLaHl: +BUMMuxi:BUMQGBg:BUMVbSi:BUMWGYQ:BUMYsQr:BUMfrqv:BUMmsAe:BUMriuB:BUMuupu:BUNAonn:BUNIBEJ:BUNLVAR:BUNMQml:BUNNdyb:BUNRahU:BUNUuXP:BUNgMNz: +BUNiBjR:BUNnmqD:BUNphN:BUNrqgv:BUNxpdl:BUOBvIG:BUOBwxC:BUODGWR:BUOGovD:BUORJsr:BUOgZgs:BUOgtAK:BUOkeXz:BUOmvaB:BUOoCmw:BUOwFah:BUOwWsX: +BUOyaWp:BUPHwXZ:BUPLXQv:BUPSVYz:BUPWNFI:BUPXYla:BUPYliw:BUPtRCF:BUQKtGC:BUQOpDb:BUQQIou:BUQTnvf:BUQYvAn:BUQceQG:BUQcfSR:BUQeWXs:BUQgiCe: +BUQvmgN:BUQwNLG:BURMKec:BURWGsb:BURXGsB:BURcXbn:BUReHgt:BUReyyy:BURivHP:BURmNWs:BURrPTj:BURsnbs:BURtigU:BURtoRF:BURzaVR:BUSBlMN:BUSHxGi: +BUSJIvr:BUSKLAk:BUSKRIk:BUSKpTw:BUSRQzD:BUSRwOD:BUSfNKd:BUSjtqX:BUSkWUV:BUSouV:BUSqZXk:BUSupOc:BUSyVZR:BUTCNY:BUTCobE:BUTFRRc:BUTNpxx: +BUTQBAi:BUTUZQz:BUTVKsJ:BUTXQZS:BUTXwoS:BUTaeCj:BUTcgqx:BUTczcZ:BUTjWTf:BUTkUxN:BUTmTjd:BUTotQo:BUTpExt:BUTpeyY:BUTriUO:BUTtTul:BUTtfMq: +BUUFjhf:BUUHsuo:BUUIbSr:BUULAII:BUUOaHw:BUUWTsh:BUUXOeh:BUUZVGD:BUUbcAk:BUUdiuy:BUUfEho:BUUiNXp:BUUjSwc:BUUmsK:BUUndUK:BUUrYFS:BUUxecm: +BUUzNhn:BUVCpFC:BUVDhGp:BUVGMNo:BUVNsUd:BUVObsy:BUVPGyA:BUVVolI:BUVaGGp:BUVdMx:BUViAbn:BUVkfow:BUVkpdE:BUVpSWh:BUVrlap:BUWDlIQ:BUWEYLG: +BUWGLEr:BUWIXqP:BUWURNJ:BUWWIip:BUWaZHq:BUWddcb:BUWiDEz:BUWnOSq:BUWpXsy:BUWpnNt:BUWqdaA:BUWupGB:BUWypHG:BUXDtuC:BUXEVYs:BUXGVJA:BUXJbDn: +BUXKJSB:BUXMnck:BUXaGN:BUXbbbs:BUXeZLi:BUXfCMG:BUXnphh:BUXtJfn:BUXvdAn:BUYBgcL:BUYFMZY:BUYMJtk:BUYNADu:BUYPOcO:BUYYNlr:BUYYbRy:BUYYths: +BUYaoBF:BUYjNwQ:BUYmmcl:BUYrHGV:BUYtulP:BUYyVyj:BUYzIbb:BUZBdWt:BUZBiMu:BUZGgCg:BUZJSgB:BUZJYXM:BUZTYht:BUZbYSv:BUZbYsK:BUZeqcO:BUZfnbZ: +BUZgobM:BUZlIdP:BUZrISy:BUZzSQU:BUaEVzn:BUaGlir:BUaMnoo:BUaQXva:BUaTMCl:BUaUseW:BUaWtzL:BUaXCaQ:BUaZnvT:BUaackD:BUalIbk:BUaoNHr:BUaoTVk: +BUasanX:BUatIYC:BUayhCF:BUayxJW:BUbCvaE:BUbMpaQ:BUbOyla:BUbQrbs:BUbSIwk:BUbWXVx:BUbZMcu:BUbZuDb:BUbbdxK:BUbbmGe:BUbmeql:BUbmfsy:BUboWxX: +BUbqicN:BUbsxkw:BUbyaNA:BUcCKSo:BUcIXmd:BUcKoPj:BUcOiPE:BUcXBlm:BUcaTNP:BUccGpH:BUcfMdL:BUcpWUd:BUcsZoU:BUcvqyU:BUdBQTL:BUdGUgs:BUdKKsT: +BUdMQZM:BUdMwoM:BUdSopQ:BUdVBAw:BUdapoJ:BUdiTnk:BUdkGPs:BUdnxh:BUdojN:BUdpNkM:BUdvrwK:BUeAAIg:BUeDJKM:BUeGyyZ:BUeQoNb:BUeRQkr:BUeYBeF: +BUecdUe:BUeersz:BUefDPX:BUeibqP:BUewMnv:BUewoos:BUfDUy:BUfFonU:BUfGXJb:BUfPqzl:BUfTQHs:BUfVAiP:BUfYfQy:BUffWAX:BUfglaB:BUflDpO:BUfmsCr: +BUfobQG:BUfqYAR:BUfxduR:BUfyoCx:BUfzsvr:BUgFVQn:BUgTlrN:BUgcOSc:BUgeTFJ:BUgfZHc:BUggLn:BUghoPP:BUgiCcY:BUglKGu:BUgmFlQ:BUgtBHz:BUgtWar: +BUgwlN:BUhEbCt:BUhLVJW:BUhMNFv:BUhQLeK:BUhRmPj:BUhiJfx:BUhkZhH:BUhlWtf:BUhqBjv:BUhsDeC:BUhyXmh:BUhzBhq:BUhzWAy:BUiCJUg:BUiCSQj:BUiCiNj: +BUiHQzz:BUiJpAw:BUiaNHm:BUiaTVt:BUibEKC:BUieanG:BUigKcs:BUigZtz:BUihKcS:BUihZtZ:BUisXBz:BUiuJnJ:BUiuyYm:BUiyvhD:BUjCKex:BUjIJuh:BUjISqe: +BUjIine:BUjNQZu:BUjQPeo:BUjXAdl:BUjZGJB:BUjZOCV:BUjbhcv:BUjbxjg:BUjgEkl:BUjhEkL:BUjjMsl:BUjmZTu:BUjorlH:BUjpaVI:BUjxbZE:BUjzcKt:BUkBtwJ: +BUkFAmu:BUkJSmm:BUkJZDX:BUkZiMA:BUkaTiV:BUkcrWi:BUktarB:BUkuDjy:BUkzWtZ:BUlGqCd:BUlPTSP:BUlRblM:BUlXKuq:BUlgAuK:BUlhiUz:BUliaEu:BUlwoYM: +BUmDUME:BUmGJKt:BUmThgl:BUmWMns:BUmcWav:BUmhYFD:BUmiDPa:BUmorqz:BUmpNhy:BUmqGgl:BUmtqGc:BUmyABr:BUnCqzK:BUnGQHT:BUnLuXl:BUnPBEv:BUnTQmP: +BUnUVAn:BUnXsqw:BUnhlae:BUnoDph:BUnwmqx:BUoIxDX:BUoJZuI:BUoKvIC:BUoKwxG:BUoUVyG:BUoVCjn:BUoVzuN:BUoWVju:BUoXVQg:BUoZEtd:BUotkEy:BUpAJSo: +BUpFoVY:BUpKtuN:BUpOZUp:BUpQviZ:BUpUeCO:BUpbBt:BUpdBjM:BUpfZGn:BUpftaV:BUpjexg:BUpvFAu:BUpvWSE:BUpxawm:BUqAdHM:BUqDADj:BUqNTGD:BUqRima: +BUqWgcs:BUqZSGV:BUqZYxY:BUqcmcs:BUqfckr:BUqnOhI:BUqpNLC:BUqrYsb:BUqvnBN:BUqwoBY:BUrAsEx:BUrCtZc:BUrIdht:BUrKYhy:BUrWrbE:BUrXvaS:BUraKCC: +BUraZTJ:BUrbeqz:BUrbfso:BUrcrlw:BUrdWxN:BUrficX:BUrhxka:BUrtOeb:BUrvNlz:BUsBUWW:BUsBXyH:BUsFoBV:BUsMSmB:BUsMZDw:BUsNNIL:BUsQMx:BUsQxGm: +BUsSXcI:BUsUtwe:BUsXKSy:BUsYZqI:BUsgarm:BUshZoC:BUtAlmU:BUtHUwH:BUtHXYW:BUtKKuH:BUtLobI:BUtQRPD:BUtSTSi:BUtUblt:BUtWnFD:BUtZLap:BUtZRip: +BUtZptl:BUtmgqT:BUtmzcv:BUtpZxp:BUttpox:BUtuUxb:BUtyExx:BUtyeyU:BUtzWuM:BUuAQMr:BUuEixJ:BUuFcsl:BUuHtTj:BUuIuxN:BUuSGYv:BUuWhgG:BUuYRCI: +BUuZyyh:BUumpDR:BUupNXL:BUuvcEm:BUuvepu:BUuwqGH:BUuyTDQ:BUuzysq:BUvHVAw:BUvIVgC:BUvKAiN:BUvKzP:BUvNahp:BUvUjHa:BUvXbsu:BUvaIbp:BUvdBjW: +BUviNHi:BUvjmqa:BUvmduL:BUvorSS:BUvqYfT:BUvuEHh:BUvwuPi:BUvxNxw:BUvySWd:BUwGKWz:BUwPnCx:BUwdaWs:BUweeXY:BUwgvaa:BUwoBJs:BUwreVv:BUwwXMm: +BUwxOSM:BUwyXse:BUwynNh:BUxAZUy:BUxBxdh:BUxFGwf:BUxFXmh:BUxMKwm:BUxTYlL:BUxUmPX:BUxVLey:BUxhDeq:BUxoACY:BUxoTfS:BUxpZhz:BUxwFLH:BUxwkJY: +BUxxphL:BUyDimZ:BUyJvOd:BUyLSGm:BUyLYxb:BUyMGSD:BUyPnvy:BUyWADq:BUyaWXl:BUycVyN:BUyeIsv:BUyjoBB:BUyrmgQ:BUysNLX:BUyuYSD:BUyuYsy:BUyxXBh: +BUzEMzV:BUzLtgw:BUzPvoo:BUzQgCC:BUzSIOa:BUzWTgT:BUzXbrv:BUzaHgY:BUzaJNs:BUzayyT:BUznqcK:BUzpobI:BUzwOeK:BUzxVYe:BVAAxhb:BVALbgp:BVARhPN: +BVATmUB:BVAWafq:BVAaTzw:BVAbNj:BVAfrvB:BVAgzdH:BVAmGmR:BVAuAyF:BVBENMy:BVBIwuG:BVBMGUF:BVBQaHr:BVBRbGy:BVBXhpG:BVBZCUi:BVBZmuK:BVBcOhN: +BVBnfVb:BVBnrwD:BVBozsm:BVCBJTI:BVCPvjc:BVCUuFA:BVCVACd:BVCZqKk:BVCeOhR:BVCfcvK:BVChSJM:BVCiOdN:BVCimeK:BVClbAC:BVCrMZu:BVCtBuo:BVCxSeh: +BVDBhvp:BVDIOeV:BVDJPMR:BVDQbNr:BVDTtXr:BVDUGwG:BVDUqfT:BVDWKv:BVDYpvk:BVDaBZd:BVDoODG:BVDomEB:BVDpYXW:BVDszTq:BVDvRZw:BVDyLja:BVEAnWf: +BVEFvrK:BVEJXOT:BVEPxzg:BVEQEhz:BVETfpK:BVEVPar:BVEYvZk:BVEawxP:BVEfzgQ:BVEguXN:BVEqTJC:BVEuyA:BVEyrhw:BVFDlnL:BVFEGwx:BVFFEHS:BVFLLYb: +BVFMcAk:BVFRVbF:BVFRWSB:BVFRdtD:BVFVnwO:BVFebaQ:BVFlItv:BVFlzGX:BVFmxfO:BVFwTjJ:BVFwzLr:BVGAob:BVGBNdu:BVGEaOf:BVGEfVh:BVGFgah:BVGJvqt: +BVGMmQJ:BVGXHvM:BVGXVDs:BVGaWKE:BVGaktv:BVGiNkx:BVGmVca:BVGqIda:BVGvQHW:BVGvaWk:BVGvxPO:BVGwNIB:BVGxOIU:BVHEpnL:BVHSakX:BVHeHhu:BVHeXad: +BVHfvRp:BVHjMHv:BVHsEzF:BVHsFxS:BVHuwsr:BVHwIhd:BVICxrD:BVIGOIZ:BVIJGuh:BVIJkCN:BVINIFb:BVIPyPM:BVIRNmW:BVIZklw:BVIbSWd:BVItERF:BVIteSk: +BVIxFfn:BVIyzdO:BVJBskb:BVJDtXm:BVJEnbW:BVJFBgp:BVJIxRS:BVJMOiM:BVJPzZR:BVJRLfQ:BVJXXlv:BVJfusf:BVJgSwS:BVJhSws:BVJlEHB:BVJnGzP:BVJnZhr: +BVJzTZG:BVKADks:BVKBpTv:BVKExaC:BVKJpzx:BVKJrHM:BVKMHUq:BVKTgRr:BVKVIsN:BVKWCxh:BVKZUsJ:BVKbCTQ:BVKdglc:BVKeLJc:BVKjtOU:BVKkAUP:BVKnFDd: +BVKnPOV:BVKniul:BVKqnSH:BVKyVTu:BVLDbNk:BVLIvJs:BVLJKPM:BVLLSzj:BVLVJCe:BVLYBxq:BVLbSHH:BVLebaS:BVLfzTh:BVLjtDZ:BVLkMze:BVLnZwn:BVLpton: +BVLrCjh:BVLvcki:BVLveCl:BVLwNtl:BVLynss:BVMHAVm:BVMJauV:BVMJvav:BVMNjxu:BVMWfvr:BVMXFox:BVMZLjd:BVMbKaJ:BVMbaVM:BVMfBId:BVMhuXa:BVMiITP: +BVMjahJ:BVMmAKj:BVMmsug:BVMzNEl:BVMzxxa:BVNCXod:BVNGVh:BVNGxfd:BVNTLbV:BVNWlnu:BVNYxZW:BVNhWge:BVNlKnE:BVNnyyc:BVNoItO:BVNozGa:BVNqzcv: +BVNtDHe:BVNvNIz:BVOAYGI:BVOJGht:BVOKHvf:BVOKVDX:BVOMsLQ:BVONLbc:BVOROkD:BVOUIff:BVOXgac:BVOXohw:BVOZDWi:BVOhNIi:BVOixPd:BVOlWvV:BVOtavo: +BVOyxIT:BVOzYRc:BVOzhLn:BVOzjeD:BVPQVdc:BVPRGHO:BVPTgxC:BVPVmqZ:BVPhoCU:BVPiDsx:BVPiMLV:BVPoQhG:BVPpNiR:BVPqOiE:BVPtWVm:BVQBnBi:BVQCPSN: +BVQDXLh:BVQEQhG:BVQKryU:BVQNWDE:BVQNqqE:BVQOahu:BVQRxfW:BVQYiTl:BVQfTzY:BVQgAnV:BVQirvl:BVQxiGi:BVQxqbV:BVQztEc:BVREzoK:BVRKxHu:BVRNRPz: +BVRNljS:BVRNrbS:BVRarwz:BVRdzsS:BVRvgtY:BVRwGME:BVRxOhp:BVSCJcG:BVSGgRk:BVSISZH:BVSMpza:BVSMrHT:BVSNYru:BVSRlEE:BVSToni:BVSUpTo:BVSZFzA: +BVSmSez:BVSnyMR:BVSuEhL:BVSvnco:BVSwglz:BVTAufz:BVTDeFH:BVTESVW:BVTFHua:BVTGgiT:BVTNxAS:BVTOSzA:BVTQHLS:BVTVKJO:BVTZDKc:BVTaCnY:BVTbSES: +BVTdCjc:BVTeYXE:BVTeqOI:BVThckb:BVTheCg:BVTnLjs:BVTrSjv:BVTstoE:BVTxzTc:BVTyoEs:BVUALBp:BVUBGWG:BVUFBhl:BVUKPaD:BVUXlWx:BVUarUE:BVUbcbm: +BVUbkLF:BVUjaKZ:BVUkyYE:BVUlNEu:BVUlxxx:BVUtfjV:BVUtwxf:BVVALYT:BVVGjXE:BVVKnwy:BVVLBHe:BVVWXAW:BVVYAKJ:BVVaVJU:BVVgcHc:BVVkwXO:BVVpoxy: +BVVquxQ:BVVsxXQ:BVWBLbZ:BVWKjpE:BVWURIb:BVWcocw:BVWfDSZ:BVWfMlt:BVWviic:BVWznCZ:BVXDGHD:BVXFiDf:BVXJYgY:BVXLByQ:BVXLnGZ:BVXUvQo:BVXWLBs: +BVXbQhl:BVXbawP:BVXbxpt:BVXdOin:BVXhEzT:BVXhFxA:BVXionl:BVXkngt:BVXmyXU:BVXmyxh:BVXsNKC:BVXwVCZ:BVXxtui:BVYDxfL:BVYUNme:BVYgvQH:BVYmdy: +BVYsOHR:BVZSkxl:BVZYxFg:BVZeQfh:BVZfDdI:BVZiPdr:BVZqteS:BVZvmOO:BVaAWDw:BVaAqqw:BVaBXpO:BVaDahG:BVaJQhu:BVaLwUr:BVaPafM:BVaRsKn:BVaTtxa: +BVabQFJ:BVaitbn:BValAnd:BValTzo:BVavuSj:BVbDitg:BVbEbjm:BVbPxHg:BVbVaFt:BVbZsFl:BVbZzoY:BVbbigB:BVbdteH:BVbfzDM:BVbiDdR:BVblGMW:BVbpTZr: +BVbqtBW:BVcDhVE:BVcFQQz:BVcJqce:BVcKJTU:BVcOFzo:BVcPOGM:BVcPsUp:BVcTbng:BVcZKpA:BVcbiIx:BVcdBzq:BVcmwjn:BVcrShD:BVcvztd:BVcztdV:BVdCpvG: +BVdGUSD:BVdLQqc:BVdQJtL:BVdTufD:BVdaMzp:BVddOHW:BVdecVN:BVdgSjH:BVdhODK:BVdhmEN:BVdswJw:BVdxymE:BVeEBor:BVeMlWj:BVePvro:BVeSXOP:BVeWxFP: +BVecAKA:BVecsuL:BVefrUW:BVehNiN:BVenESv:BVezKaa:BVezaVf:BVezfgp:BVfEFOz:BVfKLbK:BVfLGpZ:BVfPEHw:BVfYXoY:BVfeoxk:BVffuxC:BVfhcFr:BVflcHq: +BVfnST:BVfpTjN:BVfpzLv:BVgAykI:BVgCYUf:BVgFaKU:BVgPjps:BVgUcjo:BVgdkhR:BVgetUV:BVgiiiU:BVgjwkk:BVgoJUC:BVgokEJ:BVgxocA:BVgyDSl:BVgyMlB: +BVhANDx:BVhDzB:BVhFIeB:BVhFszB:BVhLmqG:BVhQDcL:BVhSycA:BVhTaok:BVhTfve:BVhUjPZ:BVhfmxk:BVhlVCl:BVhpIDl:BVhsMHr:BVhxNKu:BViELFB:BViSafR: +BViUsKq:BViczdk:BVihuSU:BVioEhQ:BVipGZc:BVipZHA:BVitzSg:BVjDRPA:BVjDljh:BVjDrbh:BVjIGUc:BVjIkcE:BVjMIfi:BVjRxRO:BVjVOiQ:BVjbErm:BVjfFFE: +BVjkzsH:BVjqSwo:BVjwAYj:BVjxzDD:BVkAFzt:BVkHlEP:BVkKKWs:BVkMvLp:BVkPCxd:BVkQuFf:BVkTefT:BVkUSvK:BVkWgIH:BVkaOhu:BVkdyMG:BVkeiIC:BVkjEhy: +BVklncz:BVkpZWy:BVkqCNE:BVkrSeO:BVkuYxY:BVkuqoU:BVlDxAD:BVlLKJX:BVlPDKt:BVlQGwb:BVlQqfq:BVlUISI:BVlVCXo:BVlYUSM:BVlbQme:BVldLjd:BVljAuW: +BVlkODb:BVlkmEg:BVlnoED:BVlxVtr:BVmEXOW:BVmGVBL:BVmGWsH:BVmGdTN:BVmHVBl:BVmHWsh:BVmHdTn:BVmIxFW:BVmKEhY:BVmLxzD:BVmPfph:BVmQLyh:BVmWjxy: +BVmXyGS:BVmaxFe:BVmbzgr:BVmiCO:BVmkzlX:BVmqVji:BVmtrht:BVnMdtY:BVnVfVi:BVnaKAQ:BVnaavV:BVnhItK:BVnhzGe:BVnuEsF:BVoBgaG:BVoBohS:BVoDDWM: +BVoKBYe:BVoKTco:BVoKngn:BVoNVJi:BVoTGhP:BVoVidr:BVoZYGM:BVoeszb:BVofUgL:BVofxtM:BVoiwST:BVokvrv:BVomixN:BVooVWT:BVorQHx:BVoraWD:BVotOIz: +BVoxFXU:BVoyoNx:BVpApnQ:BVpFycX:BVpOakE:BVpTIFY:BVpZHVY:BVpZVdg:BVpcTKO:BVpcWkQ:BVpckTb:BVpfwVh:BVpmsZY:BVpqwso:BVpsvRM:BVpuiXu:BVpwVwo: +BVpxQhC:BVpzOiA:BVqCOIw:BVqMXLl:BVqNxhh:BVqUzzH:BVqaEhX:BVqbdaW:BVqcGZJ:BVqcZHh:BVqmtAV:BVqntbx:BVrAnbt:BVrExRp:BVrIOin:BVrJrYH:BVrNaHh: +BVrRPsS:BVrTQHZ:BVrWljW:BVrWrbW:BVraGMa:BVrfEHa:BVrhdAN:BVriAYu:BVrlmOb:BVrvANK:BVrxrVq:BVsAxaf:BVsDrHh:BVsGfs:BVsHgIa:BVsIHUT:BVsNgRW: +BVsPPmu:BVsSCxM:BVsTmeY:BVsdSeF:BVsgAUu:BVsjNTR:BVsjmTB:BVskcKW:BVskecR:BVssZWP:BVsutOP:BVsvaIX:BVswCJV:BVtCoNl:BVtDGwy:BVtDqfj:BVtHSzM: +BVtLpZd:BVtLrhQ:BVtMYRp:BVtOHum:BVtPgiX:BVtRJCB:BVtVgrn:BVtXBTY:BVtYCXt:BVtbzTO:BVtcEHi:BVtenCj:BVtkhKm:BVtmymW:BVtsnsT:BVtyQlp:BVtzCnU: +BVuBlWD:BVuScaH:BVubBIA:BVucbCU:BVufcfu:BVukcbq:BVukkLZ:BVunPCZ:BVutaKf:BVuuNEi:BVuuxxd:BVuvOuR:BVvJPAA:BVvOBOe:BVvPLbu:BVvZFOD:BVvcbkn: +BVvibcL:BVviwJD:BVvrNIY:BVwFVDe:BVwGGhI:BVwHidK:BVwUSe:BVwWDWT:BVweQHa:BVwexPy:BVwgOIc:BVwhWvK:BVwnIdW:BVwtJUQ:BVwtkEX:BVwvNkN:BVwyUgU: +BVwyxtT:BVwzRGT:BVxALBW:BVxGNDJ:BVxLHVR:BVxLVdl:BVxOslE:BVxOySJ:BVxTRio:BVxWIFr:BVxXycS:BVxZjPH:BVxboCz:BVxeDsW:BVxeMLy:BVxhVwD:BVxkQhh: +BVxkawT:BVxkxpp:BVxmOij:BVxnWVB:BVxtwKP:BVxywVC:BVyGkCX:BVyKahJ:BVySSH:BVyTiTs:BVyUbJy:BVyervS:BVypvQL:BVyriGV:BVyrqbi:BVyvzdY:BVyyDDF: +BVzAsFS:BVzAzof:BVzHbJk:BVzWhPi:BVzZbjR:BVzdtaf:BVzvvqG:BWABGaV:BWALXDB:BWAPadC:BWAPdaG:BWAfAPK:BWAkgDY:BWArBzs:BWArZSi:BWAztRp:BWBDXpH: +BWBDrPE:BWBIrqi:BWBKTlD:BWBQMcr:BWBTFgW:BWBVLCQ:BWBWJwf:BWBWwIf:BWBfODt:BWBikFs:BWBjbnE:BWBlAPE:BWBpTf:BWBplwF:BWBxZpj:BWBxgMH:BWCKXPQ: +BWCRHHh:BWCSZMI:BWCUQRx:BWCUyxl:BWCaTGc:BWClAbb:BWCpdWX:BWCuYTm:BWCufrf:BWCuiSb:BWCxlVw:BWCzCxw:BWDCKcT:BWDExgq:BWDMZNl:BWDMaFZ:BWDUeOe: +BWDWxOl:BWDYKaL:BWDaFWu:BWDcHzA:BWDeHPF:BWDfLKw:BWDfwiH:BWDgsvU:BWDnnRU:BWDwMlg:BWDzHqr:BWENKAu:BWEOsmu:BWEPSvQ:BWERZnU:BWERafc:BWEXKCm: +BWEZxGH:BWEfscm:BWEhmmV:BWEiqpj:BWElBnM:BWEmDUg:BWEmVGA:BWEuZnB:BWFANST:BWFBfcx:BWFDWNe:BWFHcmG:BWFKNDt:BWFOshj:BWFVKFd:BWFaXus:BWFbGyC: +BWFcYld:BWFeOTT:BWFfUms:BWFglwN:BWFhoWN:BWFhxrb:BWFkSSN:BWFmMTE:BWFmheB:BWFvsKS:BWFvtXf:BWFyTgi:BWGApBm:BWGBjTg:BWGByfh:BWGFrVU:BWGGNsm: +BWGHZjE:BWGIXnP:BWGNACh:BWGNvqe:BWGQcCk:BWGUwyf:BWGWzIB:BWGbPyY:BWGeOPV:BWGjGYz:BWGpoww:BWGtPGD:BWGuWZH:BWGvzkY:BWGwAjj:BWGyEbi:BWGyJqO: +BWGzEjg:BWHIOzD:BWHIuPN:BWHKdAy:BWHKij:BWHLQLa:BWHLyjl:BWHPqew:BWHcPmg:BWHftrn:BWHpryd:BWHrRpd:BWICyfh:BWIDqxw:BWINiJL:BWIOOZS:BWIOupY: +BWITZyr:BWIXbGI:BWIXuHv:BWIcRNu:BWIdBzz:BWIgKzW:BWIgQQo:BWIiPMp:BWIltRy:BWImEMj:BWItRNU:BWIvZpr:BWIxAPB:BWIyCIX:BWJCXKX:BWJDMci:BWJKoub: +BWJNxyM:BWJVFBn:BWJdPS:BWJdlvu:BWJgejp:BWJqBVg:BWJvhfb:BWJwNCa:BWJxODO:BWJyuCU:BWKFmHt:BWKHCPB:BWKLAhB:BWKMSiM:BWKPBbP:BWKTxYF:BWKYcvs: +BWKZGCk:BWKafCu:BWKilWV:BWKjxUF:BWKrTMD:BWKtVBW:BWKvBvL:BWLDlWg:BWLIxOs:BWLLKEF:BWLMaUb:BWLWDHj:BWLZBxt:BWLiBNk:BWLlVEM:BWLmJkG:BWLwxoV: +BWMCSvx:BWMDafj:BWMIWzI:BWMLmpO:BWMPcxk:BWMYvdi:BWMaDqO:BWMbqgA:BWMiiXa:BWMiqPt:BWMjUVL:BWMoBnd:BWMpciR:BWMtrPj:BWNAtVH:BWNFruv:BWNIzIE: +BWNNnSQ:BWNUjeR:BWNZUTU:BWNaTBA:BWNlTgr:BWNndke:BWNrWzj:BWNtnBx:BWNuEJE:BWNvEBK:BWNvJQm:BWNxvKx:BWOALCS:BWOINNk:BWOKfCh:BWOMWnu:BWONqXn: +BWOOKft:BWOPKfT:BWOSnsz:BWOcYES:BWOmvsL:BWOnkVk:BWOrTGy:BWOtdKn:BWOvQft:BWOxZDO:BWPCUzr:BWPDcUm:BWPGhJU:BWPHCps:BWPJISJ:BWPMfBH:BWPOBky: +BWPOxaY:BWPYJYs:BWPYVJs:BWPZqXN:BWPblIW:BWPgrCW:BWPmGPr:BWPmJRH:BWPpKPn:BWPpQvz:BWPpoCR:BWPrCTI:BWPtIoQ:BWPzGaO:BWQMCPZ:BWQUjrE:BWQYcuD: +BWQZatV:BWQdwAz:BWQpCiF:BWQpFuY:BWQrXiF:BWQtDur:BWQvKpg:BWQvQVs:BWQyKzP:BWQyQQh:BWQzIOX:BWRDcVQ:BWRGGcI:BWRIFBG:BWRLCPO:BWRLJwt:BWRLwIt: +BWRMBBr:BWRQxyd:BWRRECv:BWRZaJb:BWRaAPW:BWRgQFT:BWRiNCh:BWRjwvL:BWRlfpz:BWRmZpx:BWRmgMZ:BWRoSgr:BWRrYtF:BWRrfRM:BWRrisI:BWRyejy:BWSGHHZ: +BWSMGCP:BWSSBbk:BWSYmHO:BWSaAbP:BWSafNn:BWSedWj:BWSmQfM:BWSnNcQ:BWSohFR:BWStTGQ:BWSuSGk:BWSvApn:BWSwVBl:BWTAYOz:BWTDvDO:BWTFsAG:BWTImPi: +BWTMcXM:BWTNfGd:BWTVKcb:BWTXDHC:BWTZzLV:BWTgUvj:BWTnKmg:BWTxHPp:BWTxQUV:BWUDsmc:BWUEKeV:BWULvdv:BWUMlww:BWUSDUk:BWUSjYM:BWUUJHE:BWUcHwA: +BWUhrPU:BWUiggt:BWUqsVz:BWUzEOP:BWVDshx:BWVKeaQ:BWVPNDf:BWVStuz:BWVankG:BWVjvSn:BWVmxdI:BWVnxrP:BWVoPEZ:BWVsDZh:BWVsqWw:BWVzUPZ:BWWEnsa: +BWWJwyT:BWWLzIp:BWWMrUF:BWWQACZ:BWWQvqW:BWWSCek:BWWVcCY:BWWYrVg:BWWbfrV:BWWbskx:BWWbtxM:BWWecyv:BWWlAjX:BWWqlWe:BWWrXjZ:BWWwnJD:BWWxOun: +BWXAZYW:BWXEbgl:BWXEuhS:BWXFaTT:BWXJMxW:BWXJfaK:BWXLqXE:BWXMabM:BWXNuNb:BWXRGAZ:BWXSrlw:BWXaqMu:BWXarlD:BWXcZPW:BWXdync:BWXhVNg:BWXlOav: +BWXpqxE:BWXvApG:BWYACPc:BWYCXDU:BWYEnTR:BWYLato:BWYMbGW:BWYMuHh:BWYTunY:BWYUaBv:BWYVfbX:BWYVoJn:BWYWyjg:BWYXhaD:BWYhkdS:BWYkliG:BWYlSdn: +BWYnFId:BWYwDuk:BWYyQVj:BWYyocB:BWYzFKI:BWYzrYM:BWZKFgB:BWZLaJe:BWZapJ:BWZiNif:BWZigaz:BWZkVUT:BWZloVi:BWZnEZk:BWZqTgo:BWaEqxU:BWaFavW: +BWaGunr:BWaIyjl:BWaJZyG:BWaMWJ:BWaNcuV:BWaOatD:BWaPMcN:BWaUIsQ:BWaZqxB:BWaeTju:BWajqme:BWajrLT:BWakkdx:BWalZpG:BWaoSdE:BWarBDx:BWatzmY: +BWaxyrI:BWayqXU:BWbACPq:BWbAJwJ:BWbAwIJ:BWbBrqe:BWbHXsv:BWbMXpD:BWbMrPI:BWbVmhh:BWbooVP:BWbqfci:BWbylwJ:BWbzxuZ:BWcBFGr:BWcDdv:BWcHrQl: +BWcJTLA:BWcUajU:BWcVCpX:BWcVJWc:BWcVwic:BWceOdq:BWchkfv:BWdGayW:BWdKsDM:BWdMDHQ:BWdOsrf:BWdRKaH:BWdSSVL:BWdbgcT:BWdjsCP:BWdpMlc:BWdyixU: +BWeBKCI:BWeDxGl:BWeEQtM:BWeTeox:BWeVxoq:BWeXKAQ:BWefsVH:BWegqYz:BWeiHQo:BWenggF:BWeosci:BWepFwh:BWevMLz:BWewgCm:BWfAdzV:BWfCRfW:BWfDpbP: +BWfGZXs:BWfNESq:BWfNHcP:BWfOIs:BWfPUTJ:BWfQLcG:BWfdPYD:BWfhWzu:BWfiyMF:BWfjnBg:BWflEBT:BWflJQr:BWfoUmw:BWfsYeG:BWfsdWh:BWgKhLx:BWgKjTc: +BWgKyfl:BWgNsHW:BWgWACl:BWgWvqa:BWgZNdI:BWgaAjN:BWgbYLY:BWgbhd:BWgdOti:BWgjMMY:BWguUpU:BWgvlWs:BWgzSss:BWhCIZK:BWhGGAL:BWhVhAI:BWhWqXd: +BWheqxS:BWhftkk:BWhgqMC:BWhgrlr:BWhotrj:BWhtwaN:BWhuWed:BWhwBZi:BWhwZss:BWiJadf:BWiJdab:BWiKQlz:BWiKyJw:BWiOqEl:BWiVxAD:BWiXupU:BWihXim: +BWisuak:BWiutRu:BWjJXKd:BWjMMcU:BWjWHhV:BWjekFT:BWjhYtS:BWjhfRX:BWjmlvI:BWjnejL:BWjqfnb:BWjtTmS:BWjudwf:BWkAXSf:BWkFXPT:BWkFrpY:BWkJoUe: +BWkKrQu:BWkMtxL:BWkQCPN:BWkQZwP:BWkUAhN:BWkkkfo:BWksxUJ:BWkveJw:BWkxucR:BWkzZPv:BWkzgmT:BWlBWHf:BWlCsMO:BWlDKaO:BWlESVK:BWlGZNO:BWlGaFy: +BWlOeOF:BWlTsMo:BWlUKEZ:BWlbLKT:BWlbwik:BWleqGR:BWljnRv:BWllixr:BWllqpg:BWlmXmD:BWlobiJ:BWlsHWM:BWluVEQ:BWlxrpY:BWlygGx:BWmGzlT:BWmHxox: +BWmIDUp:BWmIjYV:BWmSRNW:BWmVDha:BWmWWhQ:BWmfwnT:BWmkqgE:BWmsXMS:BWmyHwZ:BWnEcmx:BWnGCZP:BWnHHAw:BWnHsVx:BWnKshu:BWnMZJC:BWnNjeV:BWnPqxA: +BWnQWNZ:BWnbXTy:BWncUmL:BWnfSSq:BWnhPgb:BWniMTZ:BWnrfRb:BWnrsKL:BWnrtXy:BWnuTgv:BWnwdka:BWoIUtZ:BWoLcCf:BWoSzIo:BWoUnAO:BWoWWeL:BWoXziJ: +BWoYKfP:BWocXUg:BWooyQi:BWoqWZe:BWosnbw:BWotEjJ:BWouEbD:BWouJqb:BWowvkw:BWpBhnm:BWpCxab:BWpHyFb:BWpQCpw:BWpSXdA:BWpUntF:BWpYjRh:BWpbHt: +BWpcrQG:BWplQqe:BWpxkDG:BWqDbBF:BWqHhNd:BWqKOZp:BWqKupz:BWqLfbE:BWqLoJs:BWqMadI:BWqMdaM:BWqNBKt:BWqNxAT:BWqVhjX:BWqWSnq:BWqZLJr:BWqaliZ: +BWqcKzt:BWqcQQL:BWqdPMs:BWqeuad:BWqirqN:BWqlJrE:BWqvrcZ:BWqyCiB:BWrASIc:BWrChM:BWrJxyh:BWrPGcE:BWrRFBK:BWrduCP:BWrfZpt:BWrfgMV:BWrlBVb: +BWruIzN:BWrwTmJ:BWsAEcs:BWsCsr:BWsDCPe:BWsHAhe:BWsKCpJ:BWsKJWq:BWsKwiq:BWsLBbw:BWsPxYa:BWsScvT:BWsVGCL:BWsXFbB:BWsYLcf:BWsaYTC:BWsafrH: +BWsaiSL:BWsdlWQ:BWsfxUa:BWsgCxy:BWsiwVI:BWsnSGw:BWsvQfQ:BWsxNcm:BWtCxOV:BWtHKEc:BWtJzuF:BWtVBxQ:BWtXJhp:BWtcBNN:BWtgHqh:BWtsJBl:BWtucIX: +BWtwPYz:BWtxKmK:BWtzcQW:BWuCWzj:BWuERNP:BWuGxCs:BWuHmpl:BWuIWhV:BWuLcxH:BWuOtXU:BWuOzUo:BWuQign:BWuUKCg:BWuYzlS:BWuanrF:BWuciXB:BWucqPW: +BWufUVo:BWuiLkd:BWvEKFR:BWvLrvz:BWvNNnm:BWvRTeP:BWvSqxh:BWvTAcG:BWvTvQJ:BWvVLcU:BWvYCZY:BWvefRK:BWvesKe:BWvetXP:BWvhcYk:BWvjnkC:BWvmzKV: +BWvqEJh:BWvuXTP:BWvxYeU:BWvxdWz:BWvznjY:BWwGfCW:BWwKziq:BWwRtUg:BWwWjEf:BWwZeAL:BWwivss:BWwncyr:BWwpnKZ:BWwrDzu:BWwrqwj:BWwwEjq:BWxChJz: +BWxGLjP:BWxKBkV:BWxKxav:BWxUqXA:BWxVaVC:BWxWuNf:BWxYyJx:BWxZZYS:BWxdgdQ:BWxeICv:BWxiJRg:BWxmFkv:BWxmryr:BWxuTJa:BWxzqMq:BWyDqEz:BWyEUZf: +BWyQGae:BWyYMXh:BWyYfAt:BWyfRPi:BWyhCIb:BWyjrcc:BWylFuD:BWypDuo:BWyrKpz:BWyrQVn:BWyrocF:BWyuAPx:BWyvIOE:BWzAumW:BWzICel:BWzKeCd:BWzZMMW: +BWzcNCK:BWzfABJ:BWzffnt:BWzhfpY:BWziTmE:BWzrOhz:BWzuODE:BWzybnt:BXAOzBH:BXATmLj:BXAZbmX:BXAfqqC:BXAiOyD:BXAkYrz:BXAkeuF:BXAlDXY:BXAtLYv: +BXAwEEs:BXBFsYO:BXBNwHk:BXBSqQT:BXBSwGb:BXBUknK:BXBdhXI:BXBfQHV:BXBmIwv:BXBniqQ:BXBoMBh:BXBqWAG:BXBsWfo:BXBslDP:BXBvqOZ:BXCDDSK:BXCZJVZ: +BXCfBFQ:BXCijmN:BXCjhxV:BXCkCfz:BXClQhI:BXCwWaX:BXCybal:BXDBMbK:BXDFnKW:BXDISYD:BXDIhNK:BXDNRzN:BXDYCQG:BXDZTzk:BXDfDXo:BXDfrOk:BXDhNeL: +BXDhUc:BXDsSDp:BXDsTWE:BXDxNdV:BXDzQXf:BXDzdUy:BXEAzwo:BXEDnAC:BXEJMBp:BXEMCLj:BXENnkl:BXEQTyK:BXEVRZu:BXEYZfF:BXEjuBK:BXEnDxT:BXEnroP: +BXEpHJZ:BXEqtmB:BXExKYc:BXEzsOm:BXFCHaq:BXFDTOo:BXFGIts:BXFHFMp:BXFHOeF:BXFIHSn:BXFMuuj:BXFRsAd:BXFWwOI:BXFgQoW:BXFhWnk:BXFiTdn:BXFpcfn: +BXFrRLo:BXFtcFW:BXFtfZH:BXFxdZc:BXFyrac:BXFzOLJ:BXFzqyb:BXGEBMJ:BXGIHAh:BXGLcrb:BXGMITj:BXGOHsw:BXGSuUs:BXGTCzl:BXGWHeT:BXGfUnh:BXGjOqE: +BXGmQON:BXGrLfV:BXGwRlV:BXHAmlH:BXHQglA:BXHSfMO:BXHWbMz:BXHbcWt:BXHfiuJ:BXHmbYf:BXHuULT:BXHwGBR:BXIAtCw:BXIHfHd:BXIIaga:BXIJllb:BXILhVi: +BXIPTOK:BXITCyP:BXIWgLH:BXIYfmF:BXIeLXU:BXIgXZe:BXIhvzr:BXIwqg:BXIwqiU:BXIynli:BXIzWYM:BXJBXhO:BXJEqQM:BXJFdzz:BXJIkJg:BXJKTwx:BXJKZzB: +BXJKrsj:BXJOtU:BXJPLtV:BXJPSNO:BXJQLXF:BXJXFHl:BXJYHtz:BXJYjgt:BXJaxby:BXJcBfw:BXJdSyk:BXJghXp:BXJlGHe:BXJpCED:BXJykbO:BXKGDSd:BXKIXLW: +BXKTVkN:BXKVSnF:BXKWMtw:BXKdIWF:BXKgxBp:BXKmhxy:BXKoqoj:BXKrTs:BXKwiQa:BXKwuYk:BXLChln:BXLThlN:BXLUalK:BXLWllY:BXLbeEd:BXLfSDi:BXLiCVg: +BXLkNdO:BXLvxEK:BXLxXka:BXLyDXv:BXLyrOr:BXLyyjY:BXMCSGY:BXMCkTn:BXMEzeo:BXMItJU:BXMLkiW:BXMTSGy:BXMTkTN:BXMXSrw:BXMecRL:BXMggVP:BXMoCvn: +BXMqNDF:BXMtapw:BXNIYeV:BXNJYEt:BXNKHNW:BXNMQjM:BXNOxRD:BXNQTOv:BXNVQWM:BXNWAYO:BXNXAme:BXNYlTN:BXNYvpu:BXNgWRa:BXNqqsl:BXNvtEm:BXOBXNq: +BXOBbDQ:BXOKxKm:BXONlEW:BXOQzvT:BXOUBHo:BXOUTQh:BXOUUGP:BXOZFNH:BXOZmWT:BXObicq:BXOhKlj:BXOibKk:BXOkYuO:BXOkZbJ:BXOnxfG:BXOqQbv:BXOqRCG: +BXOwqSg:BXOxvad:BXPHOzD:BXPIhvG:BXPNYWH:BXPVAEm:BXPZLry:BXPfWyC:BXPsogv:BXPtEeV:BXPwFax:BXPwaMF:BXPxeUc:BXQFTsr:BXQGCyi:BXQHUBL:BXQOhVP: +BXQSTOr:BXQyGNe:BXQynFy:BXRAVKl:BXRCwHY:BXREtsy:BXRISBy:BXRKFHG:BXRLdML:BXRRrtz:BXRSSNd:BXRaSLA:BXRgjMC:BXRiGlE:BXRjpVu:BXRnIrh:BXRpqCh: +BXRsCEo:BXRuXXo:BXRyQvR:BXRzjdm:BXSAAzS:BXSEIhs:BXSMZcN:BXSOJVL:BXSOdZj:BXSPbWE:BXSRHTj:BXSRjGd:BXSZLxV:BXSbqos:BXScgaQ:BXSihUo:BXSrpvN: +BXStssj:BXSvwSR:BXSxWae:BXSxqcS:BXSyCeT:BXTCRzX:BXTGEnV:BXTHald:BXTJcJU:BXTNSYR:BXTPyaW:BXTQZfN:BXTSNnn:BXTUwJm:BXTWdrF:BXTbcrj:BXTnNez: +BXTotMO:BXTqNMV:BXTrYBw:BXTuVDV:BXUCCqn:BXUFTyy:BXUKQWT:BXUMMBB:BXUOcjj:BXUQcue:BXUQsSz:BXUSSym:BXUShnb:BXUTcOh:BXUVyAH:BXUbCvW:BXUeZdj: +BXUfQxO:BXUfduP:BXUgKPc:BXUieeT:BXUrpjb:BXUspHw:BXUtozo:BXUuzKu:BXUzgzo:BXVACZG:BXVIAYF:BXVIssW:BXVNYIL:BXVORcv:BXVUsAV:BXVakUS:BXVcvAF: +BXVdqsE:BXVgASQ:BXVgonW:BXVlQwD:BXVnQBT:BXVnRce:BXVoYaB:BXVqsKt:BXVsKLH:BXVvbkI:BXVyxFe:BXWBvPe:BXWCwob:BXWJTof:BXWLFNs:BXWLmWo:BXWQsSn: +BXWRYEF:BXWRqcK:BXWTrdJ:BXWgLfD:BXWikuj:BXWkfFG:BXWoAsh:BXWooNn:BXWuSee:BXWyskM:BXXAMgP:BXXFfhc:BXXLLrp:BXXNTWD:BXXbLxr:BXXdXzB:BXXgvZU: +BXXlKIg:BXXmBaQ:BXXvqQO:BXXyOYH:BXYCcJP:BXYEElX:BXYGYwx:BXYQWfK:BXYQjXK:BXYbDXL:BXYiGJD:BXYjLYc:BXYmcwC:BXYoWYs:BXZBFPY:BXZFklX:BXZHdGy: +BXZJZCl:BXZRIHQ:BXZbIrQ:BXZcWAG:BXZcqCq:BXZeCEV:BXZhqZl:BXZtfXy:BXZyjMz:BXZzmck:BXaZxdg:BXabYrF:BXabeuz:BXapWYZ:BXauKiW:BXbATwM:BXbAZzw: +BXbNknG:BXbPsYc:BXbRAIQ:BXbRzAg:BXbWDsX:BXbYXlk:BXbZXhz:BXbhMBd:BXboQHZ:BXbwxbL:BXbyBfB:BXcJAVo:BXcKVkE:BXcMwhp:BXcOtSP:BXcRqqO:BXcRwgy: +BXcSSbP:BXcTkNP:BXcUsyT:BXcWAif:BXcWzaP:BXceqoA:BXchgac:BXcmiQJ:BXcnMbs:BXcrWFt:BXcrldK:BXcuQhM:BXdGxAN:BXdOcUh:BXdOssw:BXdSSgM:BXdSktz: +BXdXRzj:BXdYtjA:BXdaHSt:BXdfNMd:BXdggZB:BXdjVDd:BXdqNeH:BXducrX:BXdwgvD:BXeAwjD:BXeCdRo:BXeDDUN:BXeFrIO:BXeGPMH:BXeHhUG:BXeNFLd:BXeOxau: +BXeWcuS:BXeWsSL:BXeXhnt:BXefmBX:BXejzKc:BXeogzy:BXesuBO:BXexpHa:BXfBHSj:BXfCYIZ:BXfFuun:BXfHBmW:BXfLHau:BXfOoua:BXfRXnE:BXfRbde:BXfZHEI: +BXfcraG:BXfgkUe:BXfhUNU:BXfipbB:BXflOQx:BXfmebX:BXfqQos:BXfriCE:BXfycfj:BXgAsay:BXgDlEz:BXgFITn:BXgGYEp:BXgHHss:BXgLuUw:BXgNBMN:BXgRHAl: +BXgSTor:BXgSXNc:BXgVwoT:BXgXYic:BXgaRlr:BXgbcfj:BXgbfzu:BXgdxfj:BXgfQOJ:BXghTDs:BXgreBa:BXgsOqA:BXhALrB:BXhCTWv:BXhDYWS:BXhEeLB:BXhGaA: +BXhRELs:BXhWCYe:BXhgGjO:BXhiogm:BXhkEem:BXiFWfY:BXiFa:BXiFjXY:BXiIZZ:BXiPmLM:BXiQsfb:BXiZXVi:BXibqqd:BXicOyc:BXieeua:BXitUlQ:BXivGbW: +BXiwBAz:BXjDAIX:BXjDzAn:BXjIDsQ:BXjPCWY:BXjaYOG:BXjbQHs:BXjgIwS:BXjjiqt:BXjkWAb:BXjmWfJ:BXjmlDu:BXjyhuc:BXkAXHJ:BXkDqqH:BXkEJVY:BXkIAia: +BXkIzaW:BXkNwuB:BXkOrAX:BXkPLxC:BXkXkjb:BXkZZZG:BXkZrSo:BXkbBFr:BXkcSYn:BXkfhxu:BXkhQhj:BXksbaO:BXlBnKJ:BXlInaE:BXlIyPx:BXlKFlF:BXlOkIZ: +BXlPTvn:BXlVTYM:BXlcDXR:BXlcrOV:BXldNeQ:BXlrCVc:BXltNdK:BXlvdUd:BXlyKpW:BXmBhLc:BXmUkiS:BXmagzr:BXmexeF:BXmjozR:BXmoNmt:BXmuSdd:BXmuTwQ: +BXmxCvj:BXmzNDB:BXnCItL:BXnDgNv:BXnEHSQ:BXnIuuU:BXnNxkb:BXnPiUq:BXnRlTJ:BXnRvpq:BXnSwOv:BXnYCZj:BXnZTOr:BXnbQwi:BXndQBy:BXndRcH:BXnlbkd: +BXnwLFP:BXnzqsh:BXoABMg:BXoEHAE:BXoFcrO:BXoFoUQ:BXoHYEY:BXoHqcT:BXoIITG:BXoJHnX:BXoKHsZ:BXoLQJB:BXoNxrK:BXoSHey:BXoWlES:BXoXltA:BXoXvPz: +BXodeBh:BXoeOqH:BXokTDZ:BXosVrs:BXotGKR:BXouilu:BXovWrn:BXowxfC:BXpFToa:BXpITSa:BXpScjd:BXpTVb:BXpUELl:BXpWYWL:BXpcthC:BXpdtbm:BXpnnLc: +BXptthc:BXpyGjp:BXqDsfK:BXqGOZO:BXqHhVL:BXqOTsn:BXqPCyu:BXqQUBP:BXqYcJk:BXqeWYH:BXqsnlL:BXqvFAs:BXqvamM:BXqytBB:BXrAknu:BXrDAZd:BXrFZzE: +BXrFrsm:BXraPsH:BXrdjdA:BXrfgAf:BXrodzG:BXrovha:BXrskbh:BXrtpVY:BXrwIrd:BXrxIrD:BXrzUEL:BXsMAVA:BXsPVkk:BXsRLTz:BXsRSnc:BXsSdgG:BXsemCU: +BXsfjmD:BXsgPSC:BXshGLB:BXsijDj:BXsofxG:BXspSlF:BXsrCeh:BXssqzR:BXstXxh:BXsxQVU:BXsypvr:BXtCTvI:BXtHSgS:BXtHktd:BXtJzEe:BXtMRzt:BXtQalh: +BXtScJY:BXtTcUv:BXtTssi:BXtYRyU:BXteCVD:BXtgNdl:BXtlgvZ:BXtpubj:BXtqLxW:BXtrOXW:BXtvphd:BXtwNev:BXtzxzJ:BXuBRZC:BXuMCqJ:BXuNTZf:BXuPZFU: +BXuRNNu:BXuTwjv:BXuUQWp:BXuVENM:BXuacRq:BXukCvS:BXumlt:BXuntmT:BXupNmM:BXutVdM:BXvDlTC:BXvDvpx:BXvIqsf:BXvKxRi:BXvOFnN:BXvOmwR:BXvRAmH: +BXvVzVR:BXvYRcR:BXvZBhi:BXvZTqn:BXvZUgV:BXvaGkp:BXvfKKM:BXvgiCw:BXvhYaF:BXvmqsA:BXvpASU:BXvponS:BXvvrau:BXvxLFy:BXwFHeb:BXwIiua:BXwJlEH: +BXwMYiq:BXwSTob:BXwXjvD:BXwXveD:BXwZAMq:BXwebKt:BXwkQWy:BXwmQbi:BXwmRCX:BXwnKkt:BXwsqSx:BXwxAsl:BXwxoNj:BXxAlLa:BXxChvj:BXxJYWe:BXxOsFm: +BXxVmBV:BXxcGBx:BXxkLxv:BXxlGjY:BXxmXzF:BXxtFlu:BXyBTsQ:BXyDUBo:BXyGllx:BXyMTOQ:BXyOelm:BXyPMGM:BXycqio:BXyenlS:BXyiGba:BXyksHI:BXylBAL: +BXysLYg:BXyvvzH:BXyxOyU:BXyzYrk:BXyzeuW:BXzAZCP:BXzEFHb:BXzHdMi:BXzIFPe:BXzMLtX:BXzMSNA:BXzNSKy:BXzZAvc:BXzdQvW:BXzekba:BXziwsl:BXzlUEE: +BXznhuQ:BXzoXXJ:BXzuqOM:BXzxgAo:BYADSMi:BYADTkJ:BYADmPG:BYAFIPQ:BYAKxoH:BYAVSXo:BYAVrIw:BYAZYdw:BYAaVZs:BYAeXwV:BYAfJAw:BYAgZXT:BYAhnZZ: +BYAicVV:BYAiglW:BYAoQdt:BYAqxMe:BYBCuah:BYBDReU:BYBECzf:BYBExlL:BYBKeiD:BYBSmED:BYBVyVc:BYBZMJN:BYBbFoT:BYBdNdl:BYBjqFG:BYBpNXr:BYCAixI: +BYCJFlu:BYCKUHc:BYCNAMi:BYCRFNE:BYCUoFj:BYCUwbK:BYCVGYl:BYCaJcK:BYCbrOo:BYCcXsH:BYCjFOm:BYClNDU:BYCrjU:BYCsQyb:BYCxNxK:BYDBAy:BYDDCbB: +BYDIPus:BYDKSOe:BYDMrfJ:BYDYneZ:BYDZuEt:BYDaZAA:BYDanOW:BYDewlF:BYDjtAw:BYDoeJE:BYDonFu:BYDqkYx:BYDtyef:BYDxDpw:BYDzAui:BYDznyh:BYEBXGU: +BYEDSXT:BYEDwcu:BYEFloq:BYEOPUh:BYEPbYY:BYESBPO:BYEecHr:BYEhfon:BYEilTG:BYElchB:BYEoLYk:BYEyrjt:BYEzIpe:BYEzyPD:BYFAPeI:BYFFqqX:BYFGwTu: +BYFMkVN:BYFRnwi:BYFSXrh:BYFSoIS:BYFZzwh:BYFjSgF:BYFjVLG:BYFmfOu:BYFsfq:BYFxhyH:BYFxrDW:BYFxtGa:BYGCOIL:BYGLqQo:BYGOwtB:BYGUTzi:BYGUkvy: +BYGXZGr:BYGYabI:BYGZpkT:BYGufoB:BYGztTx:BYHBVqR:BYHGyJp:BYHHEbk:BYHNTho:BYHVVJn:BYHcJaU:BYHhSJi:BYHiPSR:BYHzjAW:BYIBaMW:BYIFZVi:BYIGTkc: +BYIGmPn:BYIHcKc:BYIJdHJ:BYINjPJ:BYITTHd:BYIfkHM:BYIjKOK:BYImlIC:BYIsDkP:BYIyHwU:BYJMbpv:BYJPIfr:BYJWReJ:BYJXZwF:BYJZkXG:BYJaLap:BYJavLW: +BYJcNXm:BYJmqFX:BYJpXzw:BYJuFoK:BYJwNds:BYJzObp:BYKDFNL:BYKFfqC:BYKFivp:BYKPqBc:BYKcAYJ:BYKfUPf:BYKgvlX:BYKiScI:BYKpLwQ:BYKyUVu:BYLAgsl: +BYLCjMm:BYLGLbS:BYLLuEm:BYLRwtV:BYLTQw:BYLVpvj:BYLXLbs:BYLbPKy:BYLcycv:BYLdkYA:BYLiWKY:BYLmAPA:BYLtYsn:BYLuIPG:BYLuypf:BYLvrJV:BYLwaDN: +BYLxvfJ:BYLycqx:BYLzUlq:BYMDlGJ:BYMEuJQ:BYMFBPd:BYMGzgS:BYMJJpF:BYMKleM:BYMbACU:BYMgPkP:BYMmUSF:BYMzYSg:BYNDkfV:BYNIqqA:BYNJoJF:BYNQcgy: +BYNRsjP:BYNWpKz:BYNXJFO:BYNgytB:BYNihco:BYNpksr:BYNuLYX:BYOOqQH:BYOSzWx:BYOTzBD:BYOXsJY:BYOlopQ:BYOmyTK:BYOqNTd:BYOvqOZ:BYPDxJY:BYPEckA: +BYPIVJG:BYPJNNK:BYPNsqW:BYPQThF:BYPXyJY:BYPZHck:BYPckho:BYPeHWW:BYPkXdR:BYPmFad:BYPvFIP:BYQKVQB:BYQNPQd:BYQRNnr:BYQVsQn:BYQtjag:BYQyfae: +BYRJCzp:BYRJxlZ:BYRKEBU:BYRLurW:BYRNiXI:BYROMJX:BYRPCpB:BYRPZJc:BYRQuOa:BYRRoSg:BYRYJIe:BYRZOeh:BYRdsYd:BYReUvs:BYRgdAn:BYRlOby:BYRnFyi: +BYRntQX:BYRoPFf:BYRrRms:BYSDDqv:BYSKWSA:BYSMFlC:BYSOCZI:BYSOxLc:BYSPUHU:BYSVZjz:BYSjvDB:BYSkISB:BYSkske:BYSrTUF:BYStZwX:BYSxRMj:BYTAMFf: +BYTAuMu:BYTBBxI:BYTCJvW:BYTCthb:BYTDwtY:BYTNnel:BYTOlgl:BYTPSOS:BYTQtqv:BYToQET:BYTteJs:BYTtnFC:BYTzVaw:BYUEbYK:BYUKwTF:BYUWlGS:BYUdnYA: +BYUxuri:BYVLlRt:BYVTxMn:BYVioPs:BYVnfqH:BYVpYiJ:BYVppDv:BYVrCMw:BYVssa:BYWAyIW:BYWHcGI:BYWHfWm:BYWKxmU:BYWMZGL:BYWQCHo:BYWRSRg:BYWSlrO: +BYWWCbb:BYWfTWT:BYWguIA:BYWikSB:BYWotTF:BYWtGoL:BYWtORr:BYWvYIQ:BYWvpdm:BYXApDF:BYXFPtW:BYXINGN:BYXTSme:BYXTTKF:BYXTmpK:BYXWiA:BYXimaX: +BYXjlif:BYXnaPx:BYXuXWZ:BYXwZxX:BYXxnzV:BYXycvZ:BYYALAZ:BYYBVjW:BYYEXMU:BYYGpdq:BYYKMRX:BYYNcKQ:BYYQyjI:BYYfFAt:BYYhDkB:BYYnHwG:BYYrlIQ: +BYYugzB:BYYwrzG:BYZAYo:BYZAcrQ:BYZDBbB:BYZGkEb:BYZIzRA:BYZKXwp:BYZXCro:BYZZFLa:BYZdRmh:BYZlNmd:BYZoZWz:BYZqVak:BYZzFoy:BYaDYdK:BYaGzG: +BYaOPTG:BYaPIPm:BYaQKfS:BYaQnKk:BYaYNaf:BYaYgNN:BYagaph:BYahgze:BYajxMy:BYaqeYz:BYarcVJ:BYarglK:BYasiJF:BYaxQdh:BYazVZo:BYbDMJj:BYbMReQ: +BYbOqbW:BYbTFnX:BYbVfQW:BYbViVd:BYbaZWs:BYbeXSU:BYbiiDT:BYbvUpr:BYbwLak:BYbwvLL:BYcDOEC:BYcEJiN:BYcJeIy:BYcMBBR:BYcRuAU:BYcSFlq:BYcTxLq: +BYcZbPt:BYceNMt:BYcgTUT:BYciZwJ:BYcmRMx:BYcnsyO:BYcqidm:BYdEXgJ:BYdGSxK:BYdGwCj:BYdIlOn:BYdJJgH:BYdQKoU:BYdSeHI:BYdVBpP:BYdWtqD:BYdYgsQ: +BYdZJPr:BYdcOAa:BYdhWYi:BYdjZAE:BYdjnOS:BYdkfOq:BYdlrJk:BYdoVae:BYdpUlL:BYdrAca:BYduTwZ:BYdwuRD:BYeHPUl:BYeKXGQ:BYeMSXP:BYeMwcq:BYeOlou: +BYeWKON:BYeXnEE:BYeYehR:BYeZSoz:BYeblTC:BYecoXu:BYedwLY:BYeitah:BYelCYs:BYepnoH:BYesJbi:BYeyLYO:BYfMpKg:BYfNRzU:BYfPwTq:BYfduil:BYfiini: +BYfnhcR:BYgIzWS:BYgQnWR:BYgVRZj:BYgXwtN:BYgahYG:BYgdtTT:BYgjOBD:BYgluIS:BYgvhCm:BYgzMjr:BYhBZna:BYhCgx:BYhCsXZ:BYhIAmw:BYhOYDi:BYhQEbw: +BYhZNW:BYhclsH:BYhfDKG:BYhgBBw:BYhgIjg:BYhgoLX:BYhlZxJ:BYhpMmL:BYiAVQU:BYiFxoM:BYiGZNZ:BYiGjte:BYiIsxA:BYiSdHF:BYiVyjw:BYibJAR:BYideYC: +BYiilSS:BYilrzy:BYimBbl:BYimolC:BYisKOG:BYiuMMw:BYixPsU:BYjCDQZ:BYjFbpJ:BYjGXVW:BYjGZW:BYjHfQP:BYjHiVc:BYjIGyV:BYjJofP:BYjJwBq:BYjNmEG: +BYjQAmS:BYjTDQz:BYjWqZp:BYjePFs:BYjgXzK:BYjlSCz:BYjmbdK:BYjysYQ:BYjzvdN:BYkFZWm:BYkIyvW:BYkKDqm:BYkTmep:BYkdCfZ:BYklqfS:BYkrNxf:BYlDneG: +BYlHkvO:BYlcekk:BYlmkYE:BYlpaDJ:BYlrDpJ:BYltAuT:BYltnyU:BYmBfvT:BYmKPUG:BYmPgSa:BYmUpVg:BYmaWyY:BYmbfoA:BYmcZau:BYmcnoc:BYmeJbb:BYmgwLr: +BYmhWkT:BYmieKb:BYmlTWj:BYmocxm:BYmtIpJ:BYmtyPk:BYmvadC:BYmwvFG:BYmxcQu:BYnBqqE:BYnCwTh:BYnITZC:BYnIkVS:BYnLXus:BYnLwNm:BYnNnwt:BYnQyic: +BYnVzwu:BYnXOiF:BYnfMJt:BYnjfOH:BYntNti:BYnwuiu:BYnyksv:BYoFwn:BYoHqQL:BYoOTzJ:BYoOkvZ:BYoSabj:BYoUWEK:BYoUoiG:BYoVpkw:BYoWyIj:BYocLyu: +BYofyTO:BYohhCb:BYoofoa:BYoqnN:BYorgoV:BYotLyU:BYpCjpD:BYpDEbN:BYpGamY:BYpJThJ:BYpKZvg:BYpMQzZ:BYpQLaF:BYpRVJK:BYpUXmI:BYpWpDm:BYpdPSW: +BYpeAup:BYpvFah:BYqDcKD:BYqGFS:BYqIHCn:BYqMsQR:BYqPTHC:BYqUPQX:BYqWLAO:BYqXVjB:BYqYNnN:BYqbkHj:BYqdHwR:BYqeFiU:BYqfKOl:BYqzXDW:BYrIFnF: +BYrKfQI:BYrKiVz:BYrPFLV:BYrSsxl:BYrYcrf:BYrZBbu:BYrchW:BYrnIsW:BYrnsKp:BYroiDj:BYrsNdV:BYrtTus:BYrvbfg:BYsBGYF:BYsGmeW:BYsJEbP:BYsObPZ: +BYsPuod:BYsdTMM:BYseNxA:BYsnPfc:BYsoqft:BYstUVv:BYsvdak:BYtCLbp:BYtFuEN:BYtJMFj:BYtJuMy:BYtKvu:BYtMwtU:BYtiAPb:BYtqIPd:BYtqypE:BYtsaDm: +BYtuDpm:BYtwAus:BYtwnyr:BYuArFG:BYuBBPy:BYuCzgN:BYuGleP:BYuMnEW:BYuNuey:BYuQBXr:BYuSIUj:BYuXlep:BYucejH:BYucnfx:BYuoApU:BYuvYSz:BYuwIpS: +BYuwyPr:BYvCALX:BYvCbiI:BYvIzbB:BYvNsXq:BYvUlRp:BYverDa:BYvetGW:BYvjTwk:BYvstOx:BYvwGOS:BYvwOrm:BYwCzMb:BYwFPEd:BYwIAlC:BYwIbIR:BYwWpdz: +BYwZKHK:BYwafox:BYwbiBL:BYwhopl:BYwmOBr:BYwoTWP:BYxAZDx:BYxDLai:BYxGXtq:BYxJsqt:BYxMNfz:BYxPSxG:BYxbtbd:BYxxgZq:BYxzxmm:BYyFxjE:BYyLNnW: +BYySTHZ:BYyXNgu:BYyarzk:BYylXDn:BYynjaB:BYyoFAx:BYypVZD:BYytXwa:BYyvZXc:BYyxmAc:BYzCGJq:BYzFurp:BYzGfc:BYzHBi:BYzJCpe:BYzJZJD:BYzKWzV: +BYzMuOF:BYzTOeO:BYzUJIB:BYzZeiu:BYzcdAI:BYzjJCC:BYzjVaw:BYzkPFA:BYzsekq:BYzuNmx:BYzwTuX:BYzyZWF:BZAFUHp:BZAHrLm:BZAOiOU:BZAecoV:BZAiYkT: +BZAoqpc:BZApuYn:BZAqVeP:BZAqlHw:BZAsnqj:BZBDIIK:BZBKZNB:BZBLGzT:BZBNjYW:BZBQrxe:BZBTHtc:BZBatuc:BZBduei:BZBhGTH:BZBnYjN:BZBqCAx:BZBvTwC: +BZCBzTM:BZCGSBY:BZCNVT:BZCOtUH:BZCPUCy:BZCQGZm:BZCSJdl:BZCWFl:BZCWlKR:BZCYIir:BZCbwpU:BZCcFfM:BZCrpbx:BZCsYJw:BZCywbX:BZDEzoV:BZDGlYm: +BZDKZdn:BZDOUwE:BZDQaEO:BZDRGuq:BZDTEBL:BZDWynW:BZDYCnA:BZDaTFo:BZDbHTS:BZDngoS:BZDqHjW:BZEBZvi:BZECWgh:BZEDAkf:BZEFwLG:BZEHrSI:BZETKOW: +BZEZOcG:BZEaQFr:BZEhHtj:BZEiTfV:BZEmmcq:BZEpIKy:BZEuKWb:BZEyHJn:BZEzmtU:BZFByMt:BZFEekJ:BZFPpxU:BZFRlhB:BZFSvCO:BZFVxdM:BZFepZS:BZFlFHt: +BZFpTkO:BZFwfhl:BZFxvsP:BZGAhHX:BZGAiTB:BZGCaDC:BZGFDAI:BZGTXcX:BZGXBWI:BZGYvcF:BZGZngJ:BZGaOel:BZGabkC:BZGaiCS:BZGgkFh:BZGojtE:BZGsKAn: +BZHCUIu:BZHHbga:BZHJmCp:BZHQfER:BZHTuaD:BZHWbrz:BZHXIQA:BZHZIQn:BZHaBmV:BZHnVmS:BZHnttB:BZHoSBt:BZHoizS:BZHpArW:BZHrcOp:BZHwHIh:BZHxBoC: +BZHyapD:BZIBQsD:BZICgPB:BZIKaDG:BZIMzwf:BZIOfGk:BZIUhJ:BZIXWip:BZIZcSq:BZIdlHX:BZIetDI:BZIfnqE:BZIhrvT:BZIjVVV:BZIlzWI:BZIniRk:BZIpTUk: +BZItSpe:BZIwDho:BZJAhVI:BZJIOIG:BZJJhwV:BZJKmOn:BZJOXH:BZJQZYe:BZJWULJ:BZJZLnD:BZJaOqT:BZJbYyA:BZJdAMi:BZJfdyi:BZJgTHI:BZJjaYf:BZJxQze: +BZKAeRc:BZKBtUa:BZKFJdE:BZKMBPs:BZKOhWy:BZKQUdr:BZKQmoa:BZKRbQN:BZKSTAe:BZKaiYp:BZKbCqh:BZKhYLw:BZKlCXP:BZKmhrp:BZKmohT:BZKoZvR:BZKztUp: +BZKzuZg:BZLAAKD:BZLBDEI:BZLBPMm:BZLCwle:BZLJynL:BZLNScS:BZLOXDF:BZLPLRS:BZLPSIH:BZLTjOL:BZLZcKQ:BZLZmps:BZLfmTW:BZLhoke:BZLmHWE:BZLmKzQ: +BZLoIgw:BZLtrgS:BZMGAkO:BZMMgRK:BZMTSCX:BZMWpLx:BZMbFfd:BZMcIKP:BZMkHtC:BZMyOyp:BZNBzMt:BZNCpxr:BZNElhe:BZNJCGm:BZNQXCv:BZNSRwL:BZNTYCV: +BZNUyMS:BZNZGgV:BZNaIvk:BZNcTkh:BZNjRSX:BZNlYRp:BZNoFHS:BZOGjUl:BZOGqUo:BZOGvXC:BZOKBWP:BZOMngS:BZOQPmy:BZOVXuO:BZOWXcA:BZOYnnq:BZOcYrg: +BZOdZtg:BZOjzA:BZOmxMj:BZOoJhF:BZOrRso:BZOtYrG:BZOyMHg:BZPAXua:BZPAiIQ:BZPDfEy:BZPFSqc:BZPGeKV:BZPIdXL:BZPNbkZ:BZPQKLz:BZPUolK:BZPafrI: +BZPbizx:BZPgYKY:BZPnrdp:BZPpprs:BZPuywM:BZPwokZ:BZQAfGr:BZQBwSI:BZQDUfY:BZQJgcn:BZQKSQX:BZQTbKA:BZQWKla:BZQaQoI:BZQccM:BZQirYN:BZQjDhV: +BZQknMb:BZQpfPq:BZQtrDk:BZQupRH:BZRBBcy:BZRFrxS:BZRIULC:BZRKTIB:BZRRSAC:BZRXkfF:BZRZEAZ:BZRcYlQ:BZRgCxv:BZRjhRV:BZRjoHr:BZRmCQN:BZRniyV: +BZRsLTt:BZRuVod:BZRvvhv:BZRwwBW:BZRyajr:BZRzlpG:BZSBOiW:BZSDbQq:BZSJcKl:BZSJhvY:BZSNIid:BZSQUlz:BZSTTXn:BZSbZvM:BZSjOQD:BZSkYLh:BZSoCXO: +BZSqNPf:BZSrqlL:BZSuCqw:BZSuNGD:BZSxYJa:BZTBsOT:BZTJRhP:BZTLcKX:BZTLmpz:BZTQSQt:BZTSLRz:BZTSSIa:BZTTPBP:BZTWjOe:BZTWkaU:BZTbHpO:BZTcgoA: +BZTkFxi:BZTlwgD:BZTnMgg:BZTpGFq:BZTpPty:BZTwrgz:BZUFSqM:BZUGzLz:BZUHsoM:BZUIKOe:BZUKDey:BZUMcAl:BZUPRHI:BZURQsZ:BZUWSCc:BZUYYUH:BZUhHPV: +BZUilpK:BZUqgfo:BZUrMqE:BZUsPmN:BZUucdO:BZUxgOx:BZVBqsP:BZVEnNO:BZVIJyn:BZVIjWc:BZVLnHw:BZVNXLw:BZVPadd:BZVTNbz:BZVTkOB:BZVWXFE:BZVZSQI: +BZVaFHZ:BZVdkfO:BZVnOEK:BZVnbKd:BZVnict:BZVuEpK:BZVvDuY:BZVwIcw:BZWBxDz:BZWCDUC:BZWGnOf:BZWJqSi:BZWMYcF:BZWTGGf:BZWTnhN:BZWVXlN:BZWWvak: +BZWXMYs:BZWZiYe:BZWaJhA:BZWdvSg:BZWetA:BZWtXDq:BZXDKLC:BZXIKQt:BZXLbrH:BZXVUhd:BZXVWIk:BZXXrly:BZXfEbl:BZXiokC:BZXjlRP:BZXkTXb:BZXkfpS: +BZXmvUU:BZXmvhj:BZXnapv:BZXucOB:BZYBIqZ:BZYDIqu:BZYEiOH:BZYNapW:BZYRbGz:BZYTmck:BZYcCRO:BZYkEBE:BZYtCRo:BZYuxzT:BZYyImU:BZYzfRy:BZZATxL: +BZZOxnB:BZZQWJb:BZZQsqC:BZZRzty:BZZSLFf:BZZfjKZ:BZZgOqf:BZZjEbZ:BZZmQzw:BZZqMLt:BZZrwPa:BZZsCaE:BZZuFHn:BZZytuN:BZaAoLb:BZaBQKO:BZaEIqC: +BZaGIql:BZaIOzm:BZaPSQJ:BZaQrLi:BZaVBYu:BZaXFxo:BZaZOOo:BZaZWkN:BZaeTxR:BZaefPc:BZaixzm:BZalImL:BZaofFh:BZapnMp:BZawRFj:BZbEztP:BZbJlkO: +BZbPTIP:BZbPdw:BZbRtuU:BZbSbyq:BZbVJDq:BZbZLgH:BZbbcpi:BZbdwPh:BZbeCaL:BZbfNFR:BZbfzHD:BZbhLTf:BZbjVov:BZblwBE:BZbolpU:BZbqGTL:BZbrNgo: +BZbxYlC:BZbyRCJ:BZcCIiV:BZcMjNp:BZcNLlA:BZcPrXx:BZcTNLF:BZchMlD:BZcjCAu:BZckwpQ:BZclNfK:BZcmFfi:BZcpCae:BZcsEBj:BZdCCne:BZdDZdj:BZdHUwA: +BZdJaEK:BZdNzoR:BZdPlYi:BZdQKRh:BZdUZVT:BZdbHWz:BZdbKzn:BZdeGFG:BZdePtO:BZdglPD:BZdosnC:BZdovEB:BZdrFFp:BZdsIkD:BZeCEbq:BZeQGUL:BZeRQXD: +BZeWKrQ:BZeYtsB:BZemgOn:BZenKWf:BZevmcu:BZezFfI:BZfAGgM:BZfAnHe:BZfBAda:BZfCXLe:BZfEadv:BZfHCbU:BZfNjWq:BZfTXtr:BZfTtaR:BZfWquc:BZfWvxO: +BZfbjTP:BZflmdM:BZfmsCt:BZfsYRk:BZftZTk:BZfyTkS:BZgDzGy:BZgESqB:BZgLXuZ:BZgODAE:BZgSJYE:BZgSjwH:BZgTeKO:BZgWADX:BZgZXTk:BZgZtAK:BZgbDUr: +BZgfLZp:BZgmjHq:BZgtpzV:BZhAmCL:BZhCUFu:BZhDQSQ:BZhEgpW:BZhMadR:BZhRwsE:BZhSFXq:BZhTUFU:BZhWwzL:BZhZgCb:BZhjBmj:BZhlkF:BZhqQOE:BZhrpOR: +BZhwIMR:BZhyryB:BZhzDHZ:BZiBuAa:BZiImcu:BZiKiOv:BZiLOOh:BZiLWkI:BZiRUip:BZiYfGG:BZiacou:BZintDE:BZiosjb:BZipBMS:BZivHim:BZixaPA:BZjBsFg: +BZjDRoH:BZjEUcc:BZjGZNa:BZjHSAv:BZjJZYy:BZjLLgO:BZjXBcL:BZjZhVU:BZjalpR:BZjdiyc:BZjfECG:BZjfNOw:BZjgpBb:BZjmtuc:BZjmuzt:BZjrZVA:BZjzOqH: +BZkCSBt:BZkILNO:BZkJbYA:BZkKtUe:BZkOJdA:BZkPZyn:BZkVUlA:BZkXOiL:BZkZUdv:BZkZmoe:BZkctUW:BZkeEBc:BZkfThB:BZkhqlW:BZkwaJP:BZkxZvV:BZkyaym: +BZlAzoI:BZlClYr:BZlDKRs:BZlGZdq:BZlKUwZ:BZlMaEP:BZlSynH:BZlTZkj:BZlWzlN:BZlXScw:BZlYKoQ:BZlasnx:BZlavEy:BZlmHTl:BZlnTFP:BZlomTS:BZlvQft: +BZmADeF:BZmAPmb:BZmBrUP:BZmBwLj:BZmCcAS:BZmGzOB:BZmIlyy:BZmLtsk:BZmMZDz:BZmNXdI:BZmQUWQ:BZmYZKA:BZmnIGx:BZmsHJC:BZmuRmb:BZmuTnT:BZnDPMJ: +BZnKzMp:BZnNBwc:BZnRxdn:BZnSDuW:BZnWnor:BZncvsS:BZnizqt:BZnqJHU:BZntvss:BZnzIvo:BZoICgf:BZoMvap:BZoRpXy:BZoTlHn:BZoYDUX:BZoZSXs:BZodTp: +BZogGsV:BZoiRsS:BZokBWu:BZonFhX:BZorTKc:BZpAadi:BZpGQSJ:BZpKwzw:BZpMfEu:BZpOXeU:BZpRIQf:BZpTIQI:BZpbirE:BZpdRfO:BZpiSPk:BZpkSBS:BZpkizt: +BZplffM:BZpnnmu:BZpqzwG:BZpsHIO:BZpuTue:BZqDUiy:BZqFekQ:BZqHdxK:BZqMFxA:BZqPXUf:BZqPiiV:BZqSgcr:BZqZcYf:BZqZzcG:BZqatDl:BZqbrvq:BZqcBMz: +BZqdVVs:BZqlxSZ:BZqpfRN:BZqsDhJ:BZqzvHt:BZqzvuK:BZrDOIB:BZrFUDx:BZrFmOk:BZrGbqD:BZrIGJv:BZrITaO:BZrKBcu:BZrOLgv:BZrRBpy:BZrVeri:BZrWRoq: +BZrdaYC:BZreZVx:BZrnCAb:BZrwiyZ:BZryNON:BZsASaF:BZsErXV:BZsHUlF:BZsKOik:BZsLUdq:BZsLmob:BZsMzwO:BZsNTAf:BZsSZyI:BZsZTiG:BZsbYLT:BZsfCXs: +BZshNPZ:BZsihrS:BZsiohw:BZskZvq:BZsrLtq:BZstVOa:BZsvwbR:BZsxaJw:BZtFyna:BZtHCnw:BZtHWX:BZtIWGG:BZtJOUB:BZtOGuG:BZtSRhT:BZttgFr:BZtuMQX: +BZtvPMS:BZtwMgc:BZuGOcQ:BZuHEbC:BZuMCNN:BZuPSqi:BZuRLrg:BZuVjox:BZuVkAH:BZuYRHM:BZuaKWT:BZueHJX:BZuoGfl:BZuoPTd:BZuvrGg:BZuzFXt:BZvAnGI: +BZvJvAV:BZvLsqF:BZvXXLS:BZvbxmP:BZvcfhF:BZvmkfK:BZvrsCB:BZvujTf:BZvyKaM:BZwEpXf:BZwGlHq:BZwIngp:BZwSXcb:BZwTnnr:BZwXJYS:BZwuMHD:BZxBKQh: +BZxEbgo:BZxGwsW:BZxQoln:BZxRQkC:BZxUIQO:BZxYOZa:BZxfjJB:BZxfvUI:BZxfvhv:BZxiqPK:BZxjprV:BZxufpo:BZxyxZa:BZyEUHa:BZyEWin:BZyFXEe:BZyFcSO: +BZyHKqq:BZyKbRM:BZySKlF:BZyWoLw:BZycImy:BZydrYI:BZyge:BZyhoKF:BZyilrU:BZyjTxg:BZyjfPV:BZylvHo:BZylvuP:BZymaPs:BZynxzX:BZyuEBi:BZywyWq: +BZyxYkE:BZzCHtr:BZzFLnj:BZzKGzE:BZzLJDd:BZzMjYF:BZzOckR:BZzOhVg:BZzPSbQ:BZzSIIZ:BZzbueX:BZzcCxQ:BZzdaju:BZzfGTy:BZzptur:BZzswBp:BZzxMLH: +BZzzCay:BaAAzMr:BaADoss:BaAEXZh:BaAEwav:BaAFySd:BaAGnXo:BaAJJiP:BaANItP:BaAOrNe:BaAQCmm:BaAQMVO:BaATZJV:BaAVkII:BaAWSia:BaAXdcU:BaAXpkq: +BaAyLZv:BaBBQul:BaBERD:BaBGEmx:BaBLNNK:BaBLgac:BaBNOzt:BaBNxJK:BaBOxSm:BaBPAbX:BaBRWi:BaBTndF:BaBZsWu:BaBbHXM:BaBcFFJ:BaBnBMX:BaBnIeH: +BaBnoCw:BaBsnuK:BaBvdse:BaCCTGu:BaCCxRU:BaCHJSG:BaCHQSD:BaCJrQP:BaCLYkO:BaCVJe:BaCWcDr:BaCYKiW:BaCYnDo:BaCtBmQ:BaCtIEA:BaCwHxd:BaDFAVZ: +BaDFXxU:BaDHEMk:BaDJBaw:BaDKlI:BaDLMEf:BaDMBmg:BaDSFCD:BaDVUgR:BaDXAbx:BaDYBtl:BaDcedH:BaDeNbA:BaDgTza:BaDlPIX:BaDmRbM:BaDqiKX:BaDrUyM: +BaDratA:BaDtdNP:BaEBZet:BaEHkjN:BaEKJfr:BaEReFE:BaESBMn:BaEZuNi:BaEZwof:BaElYQy:BaEmTZh:BaEphoW:BaEuvKl:BaEvsvs:BaEwUYd:BaEwaTh:BaExsdK: +BaEyCiO:BaFAzHk:BaFElJu:BaFKnjr:BaFRJhD:BaFSfYh:BaFWsdi:BaFaeEm:BaFckVP:BaFfTsj:BaFnmJP:BaFrfNJ:BaFtowB:BaGBtoV:BaGETSs:BaGIjbW:BaGMLMi: +BaGPPZp:BaGYfyc:BaGatQA:BaGcgrJ:BaGdcwZ:BaGdnAi:BaGkreL:BaGlwCE:BaGoUCk:BaGqtnt:BaGtCVo:BaGwWvN:BaGxfnA:BaHAsea:BaHBZhm:BaHFCgN:BaHQZjx: +BaHVRuY:BaHjOmw:BaHmTxu:BaHoNM:BaHohQW:BaHqiae:BaHrkqR:BaHzMEA:BaIDquo:BaIGosj:BaIHxbC:BaIJZHZ:BaIOGTe:BaIpMrr:BaItuFW:BaJIuRC:BaJJZae: +BaJNabd:BaJQSbs:BaJQTDP:BaJSGqP:BaJVdgy:BaJWYKm:BaJZcsl:BaJaXXl:BaJcipU:BaJecyl:BaJegCm:BaJkQKN:BaJnDDC:BaJtZwN:BaKFHNS:BaKFIRI:BaKISWn: +BaKIrFv:BaKRwy:BaKUOZD:BaKYGQK:BaKaguX:BaKbAZV:BaKjJNV:BaKkcYw:BaKkgcv:BaKleVG:BaKqQkU:BaKsxBD:BaKvytU:BaLCIOC:BaLCxss:BaLFFCk:BaLHswq: +BaLIyYd:BaLOXYS:BaLPiYg:BaLRoiT:BaLRwMu:BaLdiKw:BaLekSN:BaLhNkK:BaLmctM:BaLoXuO:BaLvRPD:BaMEZem:BaMKxSL:BaMLGeX:BaMRZqi:BaMWXyl:BaMYGVm: +BaMaTZQ:BaMcbIE:BaMkaTQ:BaMlCiV:BaMuPiH:BaMwXUp:BaMxLNw:BaMxvcP:BaMzNwj:BaNEJhm:BaNPkyS:BaNQEtS:BaNTsGu:BaNbcgh:BaNdfNC:BaNhcGx:BaNvyjG: +BaNxaKV:BaOBegu:BaODXHv:BaOFSWw:BaOFwlV:BaOIZRM:BaOLCMz:BaOLHpO:BaOPior:BaOSPZK:BaOUtom:BaOaai:BaOgCVT:BaOkfnz:BaOmJmn:BaOpWdX:BaOtTXf: +BaOuQjz:BaOwcwa:BaOwnAR:BaOzyLw:BaPIgsq:BaPOkTl:BaPQkYo:BaPVpDB:BaPeGiS:BaPerzP:BaPhhlW:BaPlMEH:BaPrprk:BaQAoeG:BaQFzMl:BaQJzBW:BaQKkIW: +BaQPAcv:BaQPbFg:BaQTZIo:BaQWTuF:BaQWkyV:BaQYzpi:BaQZZJh:BaQkLvy:BaQlrm:BaQphLn:BaQsMeQ:BaQwxc:BaQzpRR:BaREGqI:BaRGNHa:BaRJyEq:BaRKJQM: +BaRPdst:BaRSZyc:BaRTNiQ:BaRXZKS:BaRYLnB:BaRbbqY:BaReJnt:BaRhFFx:BaRiMbq:BaRmAzt:BaRngUz:BaSAZAU:BaSBurs:BaSMrQb:BaSOyeX:BaSQHLj:BaSZNIX: +BaSfVUy:BaSliPe:BaSmFfQ:BaTAMEp:BaTDoim:BaTDwML:BaTEGvk:BaTHmJz:BaTLqmM:BaTMAbn:BaTNBtz:BaTQFaB:BaTZRjK:BaTgSLg:BaTlLTb:BaTpAvD:BaTqqIy: +BaTwiKn:BaUACUq:BaUDZqf:BaUFFAk:BaURyyt:BaUVMeY:BaUXIIZ:BaUYquD:BaUcZQI:BaUeITk:BaUgtSk:BaUkLNX:BaUmNwE:BaUqvPV:BaUwqip:BaVAlhD:BaVNuJJ: +BaVQHqV:BaVSZQC:BaVUgLs:BaVUtgJ:BaVWbep:BaVXlJC:BaWDbVs:BaWHuEP:BaWMsgE:BaWVHQy:BaWWooh:BaWYBWN:BaWawCw:BaWjPdQ:BaWkeet:BaWkniD:BaWlkvi: +BaWqTSp:BaWttQs:BaXDTUd:BaXDkYt:BaXFxBF:BaXOzxR:BaXQzmN:BaXUXzT:BaXUwAJ:BaXWnxS:BaXfiaw:BaXkhlL:BaXmhvr:BaXmrKm:BaXxhvf:BaYAzH:BaYNPJx: +BaYTGTK:BaYeMeX:BaYfSHW:BaYfVcV:BaYmkQK:BaYuOMn:BaYzPom:BaZExSx:BaZHxEv:BaZKVEh:BaZLLne:BaZSTgi:BaZSxrI:BaZXQsX:BaZZrqL:BaZarUX:BaZffNS: +BaZoFnK:BaZpFnk:BaaARSo:BaaAWJU:BaaAofY:BaaBpdi:BaaCyFt:BaaEedg:BaaNpZQ:BaaPySH:BaaSgSZ:BaaTkas:Baachrx:BaaoGIx:BaazYFr:BaazpkN:BabAXbC: +BabCpKg:BabDabs:BabHZyM:BabJcdG:BabLdgn:BabOHlm:BabPJQc:BabVIrE:BabYSwb:BabYrfz:BaboSEf:BabqgUT:BabrAzZ:Babubqw:BabzJnZ:BacAQUi:BacDVex: +BacEbQw:BacGNat:BacIXBz:BacNxsh:BacWHLT:BacaHxH:BacgXKM:BachjnA:BacrFfO:BadCBtH:BadEefH:BadFBmc:BadKkJC:BadOOjr:BadTWuk:BadUZEy:BadbFvS: +BadeAvv:BadfRbI:Badmedl:BadnNbE:BadoYqt:BadqTzE:BadsbiQ:BaeBGeE:BaeGyyF:BaeIBAz:BaeKMek:BaeLBMj:BaeTJfv:BaeUAvW:BaeUXXX:BaeXBTa:BaeYiwZ: +BaeaaTL:BaecCik:BaefTZl:BaehZxr:BaeoPTc:BaereDE:BaetNBL:BaeybIX:BafCuJX:BafFlhV:BafGueM:BafLjBX:BafPsdm:BafYZry:Bafalpm:BafbUcd:BafcAzE: +BafcnvD:BafdAlI:BaffgRE:BafoTsM:BafpTsN:BafxmJt:BafzcgE:BagDljz:BagNrIm:BagPzhd:BagVsDf:BageakP:BagglPf:BagkTXy:Bagpeeb:BagpniR:BahCITZ: +BahFCMg:BahFMvE:BahIoSy:BahKysn:BahOJIZ:BahOKgj:BahQoES:BahVzmx:BahZzbC:BaheYfT:BahepKh:BahgCBi:BahzgT:BaiAZHf:BaiCdcP:BaiCpkt:BaiECGE: +BaiKCmH:BaiKMVj:BaiOsEJ:BaiPZJs:BaiQltJ:BaiQsoQ:BaiTdcp:BaiTpkT:BaiUJiU:BaiUKGe:BaipiAn:BaisLZS:BaiuRAJ:BaiwhVk:Baiwrkt:BaiwthB:BajAYKA: +BajFNNl:BajFgaD:BajKxSJ:BajMJsI:BajMQsJ:BajNKIY:BajNnda:BajRuRO:BajUsWr:BajdgUO:BajfxbS:BajngCa:BajoevP:BajtQKB:BajvVuE:BakIcSk:BakMaBc: +BakPSBt:BakPTdW:BakRGQW:BakScDW:BakXurD:BakYZAb:BakbiPR:BakdmNi:BakflFw:BakgMBO:BaklxBX:BakmDdD:BaksZWI:BaktcYk:Baktgcj:BakunUg:BakzQkI: +BalAJFX:BalIBmD:BalOFCg:BalQCum:BalQxcG:BalTZQz:BalVFaw:BalaYqs:BalbLTw:BalcOmd:BalebiV:BalksVy:BalsZqU:BaluItw:Balwtsw:BamGJfo:BamHOJb: +BamOBMs:BamZABl:BamaPTZ:BamgNBU:BamhNBu:BamkZxk:BamlhoJ:BamoRBY:BamqvKq:BamtsdV:BanFPzV:BanGXhk:BanISwj:BanIwLK:BanLZrP:BanPCmG:BanPHPr: +BanUeGh:BanYriO:Banaviv:BanbVnd:BanfLvU:BaniCvi:BanlcgL:BanmfNG:Banpowo:BanqwcC:BanvtNr:BanxQJg:BaoCsgh:BaoMXHr:BaoOSWs:BaoOwlR:BaoSwg: +BaoTJHp:BaodyLS:BaokOnY:BaoqcGu:BapDoEz:BapEzxM:BapJche:BapJfxA:BapKXzK:BapKwAU:BapLzPT:BapMnxL:BapRRut:BapXkTh:BapuMEL:BapvShC:BapvVCB: +BaqCsEu:BaqHgSL:BaqIJij:BaqIKGZ:BaqJedq:BaqOOFG:BaqXyFb:BaqdGIn:BaqdrZm:BarDuRF:BarNSwp:BarNrfh:BarSyEm:BarXpKu:BarYcAV:BaracyI:BaragCH: +BarbieE:BargQKk:Barixbz:BarjyTk:BartSEt:BarwgUf:BaryrUc:BarzzRK:BasDGQL:BasRZYf:BasSSBO:BasSTdl:BasVNhd:BasZJqH:BasdJNq:BasgcYP:BasggcQ: +BasmQkr:BasoxBc:BaswmNR:BasxMBt:BasylFL:BatJiYB:BatKXYv:BatQmJF:BatWZQS:BatakSk:BathqIE:Baticth:BatjiA:BatkQVY:BattLXc:BauGuNS:BauIRJN: +BauLABk:BauPFAG:BauTGVn:BaudTRG:BaudvKV:BaufaTR:BauhCiu:BaukLtg:BauoAVA:BauvSlb:BavLEtP:BavUiOh:BavXuJv:BavdTsc:BavigRk:Bavoylm:BavqrEm: +Bavryjd:BavuUcJ:BavxAzk:Bavxnvj:BawBSWZ:BawMPZf:BawPlHO:BawQuET:Bawbmjm:BawcWvx:Bawffnw:BawgJmC:BawkeDC:BawmLVe:BawpTXK:BawsPdU:Bawukvm: +Bawzakb:BaxKkTs:BaxOzPO:BaxPkiQ:BaxURuo:BaxWoEa:BaxhShx:BaxhVCy:BaxiMEw:Baxqkqd:Baxuhlh:BayExbI:BaySTuk:BayTwaE:BayYRSP:BayYWJj:BayYoff: +BayeiAx:BayfkQO:BayjhLC:BazBdgC:BazFcsV:BazLTgm:BazLxrM:BazTVEl:BazUbqc:BazYXbn:BazaJnW:BazdMbr:BazlzRT:BazwXkY:BazxjNU:BazyFno:BbABXLE: +BbACXZK:BbADjlF:BbADqlE:BbADvai:BbAJerP:BbAPXUC:BbAZJDY:BbAeMqm:BbAgLys:BbAjsZR:BbAmvjJ:BbAqxGo:BbAsIoV:BbAuCfo:BbAvNjc:BbAxIzc:BbBCPtj: +BbBLDXc:BbBPjnn:BbBVhQR:BbBViMH:BbBYRYw:BbBYsHo:BbBoszk:BbBqGjY:BbBraEW:BbBuBNz:BbBzjQW:BbCCKUo:BbCHjYS:BbCMzZU:BbCOOCQ:BbCSXlt:BbCSiPD: +BbCTwcn:BbCXShv:BbCYYFc:BbCbpkf:BbCgynX:BbCjlGA:BbCtITp:BbCuKLI:BbCxntL:BbDFbRv:BbDKKuV:BbDNjyj:BbDOoUg:BbDUzzl:BbDWOch:BbDbTaw:BbDbfIF: +BbDeaIc:BbDoyNa:BbDpYrU:BbDqtEP:BbDsBVD:BbECGcU:BbEKIPJ:BbELEXm:BbENxwn:BbEPWSN:BbEPsho:BbEUjwl:BbEXrad:BbEeYsO:BbEhtlb:BbEpMUX:BbErCxi: +BbEtFQB:BbExCXy:BbEyvqa:BbFCUuo:BbFFRVQ:BbFGUZz:BbFJSxo:BbFRExv:BbFTxWu:BbFVWsU:BbFVsHt:BbFYzMN:BbFaLOZ:BbFbhkz:BbFcNIs:BbFcaEr:BbFhNvn: +BbFnvQZ:BbFotLz:BbFouCm:BbFwcIW:BbGBxeN:BbGCSHg:BbGDNgI:BbGLZgH:BbGNZrT:BbGXQax:BbGYGlp:BbGeXT:BbGglep:BbGkndt:BbGtKnZ:BbGuReQ:BbGugvR: +BbGxHsV:BbHAsBy:BbHBLbQ:BbHCikA:BbHIOlb:BbHKYLu:BbHOjvA:BbHOkXq:BbHQOzH:BbHVZRc:BbHcoBl:BbHePts:BbHeyYO:BbIERyu:BbIEshm:BbILJDB:BbIUgnH: +BbIZYZp:BbIgEid:BbIhCfT:BbInqTv:BbIrBnX:BbIujqu:BbIxfYy:BbJFnqS:BbJKpDR:BbJNkvf:BbJQJdi:BbJRUmp:BbJdGjp:BbJmNJS:BbJvvJz:BbKCbrP:BbKFXlk: +BbKJuxe:BbKQmZq:BbKTOvl:BbKTWRM:BbKUgij:BbKbqId:BbKeVtR:BbKetmC:BbKgAkV:BbKgufZ:BbKhKLV:BbKicVq:BbKwsSf:BbLAjyC:BbLFCBL:BbLLcBR:BbLPrUE: +BbLQcJv:BbLTzna:BbLayNh:BbLblkl:BbLeBVM:BbLkSib:BbLszNN:BbLuiKl:BbLwTLl:BbMAxwW:BbMCWSw:BbMCshV:BbMDzml:BbMOEXT:BbMQLwC:BbMSTaY:BbMcMUa: +BbMdCxp:BbMhRZv:BbMnTQN:BbMpGMp:BbMqtgG:BbNTBIr:BbNXUZQ:BbNYRVz:BbNaVVC:BbNeQCk:BbNmFqr:BbOBoyB:BbOHARG:BbOJOYj:BbOJwuf:BbOJxbQ:BbOLYyG: +BbONWDL:BbOTKFw:BbOTtJg:BbOaUyq:BbOhKnc:BbOiTdv:BbOjYdB:BbOomZP:BbOpmZp:BbOwKnC:BbPDOzo:BbPEZGX:BbPGoYk:BbPJCWp:BbPJFGT:BbPLZoA:BbPMNGY: +BbPNArN:BbPRrJa:BbPorW:BbPpYDK:BbPumzY:BbPvsWV:BbQChqy:BbQCimc:BbQMerb:BbQUXLw:BbQVmbh:BbQXXZy:BbQcbRb:BbQcizr:BbQhhGW:BbQlLyA:BbQoGJ: +BbQqRJW:BbRDUmK:BbRNRYe:BbRThSr:BbRXPtx:BbRaCFD:BbRbIZH:BbRgqtf:BbRjYkf:BbRtszy:BbRwGjk:BbRyRjn:BbRzZmF:BbSCCbj:BbSGOvE:BbSGWRd:BbSKMUR: +BbSNYFu:BbSPdAO:BbSTxFB:BbSUFAE:BbSUIFv:BbSXXlb:BbSXiPR:BbSflqy:BbShsSO:BbSjrOu:BbSlVow:BbSnYRZ:BbSsZJ:BbSxufs:BbTBzGv:BbTJIfO:BbTQMuK: +BbTXCBS:BbTYWp:BbTaKlf:BbThQvH:BbTiCKe:BbTkqiT:BbTnssV:BbTtlgn:BbTxTLS:BbUDUzW:BbUEKfd:BbUFZWU:BbUMraR:BbUPUUB:BbUQNul:BbUUzNK:BbUVWdy: +BbUZPfE:BbUiKIN:BbUjYuP:BbUnCaw:BbUyyca:BbUzLMu:BbVUIpc:BbVaLDU:BbVdtLh:BbVfLBn:BbVoYSf:BbVqRzf:BbVrYUo:BbVvCAH:BbVxNIa:BbWGZOc:BbWMrjC: +BbWOOZM:BbWRZgz:BbWUCwR:BbWUFgv:BbWXSHu:BbWjReC:BbWmHsD:BbWpndf:BbWstgO:BbWuHNm:BbWuKcy:BbWvpPn:BbWwPmx:BbXDQAQ:BbXKKfG:BbXKtjW:BbXPKVf: +BbXQOyZ:BbXQrLl:BbXQwUV:BbXQxBa:BbXSYYw:BbXhTM:BbXhsWO:BbXkIRh:BbXpliH:BbYFXma:BbYFtxA:BbYIqjQ:BbYMBnO:BbYSPTf:BbYXzfL:BbYfZMx:BbYiIoC: +BbYoxtu:BbZBDXX:BbZFCLM:BbZLXMV:BbZLtXv:BbZQqJf:BbZTvzw:BbZUBNx:BbZajQL:BbZlZmO:BbZqhgG:BbZwxTB:BbZxJqN:BbZyfQt:BbaAvZY:BbaIXmx:BbaItxX: +BbaPYZG:BbaQyTB:BbaVnQo:Bbaefqz:BbafRJI:BbahBno:BbakFQB:BbatGJL:BbbBXzN:BbbCjLC:BbbCvAl:BbbDpAJ:BbbGvzP:BbbOXMq:BbbOtXQ:BbbYCLj:BbbixTE: +BbbkJqi:BbblvJO:BbboZmh:Bbbpxgj:BbbrIOS:BbbtMQh:BbbvLYv:BbcBGv:BbcBUbe:BbcCeRg:BbcFIHT:BbcHOCU:BbcNZBH:BbcPouZ:BbcQjYW:BbcVCbX:BbcYbrK: +BbcaUT:BbcdTAj:BbcgpVT:BbchxCU:Bbcixjl:BbcpfYR:BbcrlKx:Bbcsork:BbcuBvY:BbdCwCS:BbdGSHK:BbdLIhB:BbdNIhm:BbdPOcl:BbdVZbq:BbdWjyn:BbdXoUc: +BbdciCP:Bbdfcvs:BbdjtET:BbdkHpk:BbdlTaS:BbdlfIb:BbdmTLA:BbeEUUP:BbeGTPQ:BbeITad:BbeJKfv:BbeOPfW:BbeVpeW:BbeWxwj:BbeYWSJ:BbeYshk:BbegqUF: +BbeoOhN:BbeqVvw:Bbervqe:BbevliT:Bbeycih:BbfAGsR:BbfATXk:BbfBiEX:BbfCBZQ:BbfJIpU:BbfOKFM:BbfRGCJ:BbfSSxk:BbfntGA:BbftYSP:BbgDLBB:BbgEiKR: +BbgHcRo:BbgHmiM:BbgMYlf:BbgUZgL:BbgZCwd:BbggMHK:BbglPmN:BbgmHiX:BbgnlIE:BbhEKVt:BbhMikm:BbhSSZr:BbhUYLY:BbhXGLK:BbhYjvm:BbhaHnD:BbhaKCP: +BbhflEK:BbhlFAA:BbhtREj:BbhtgVi:BbhznDO:BbiEjNp:BbiHnQd:BbiJXUd:BbiNgnT:BbiOqjc:BbiPkVQ:BbiTUMG:BbiaMqJ:BbigaeI:Bbiivjm:BbimxGH:BbipEix: +BbiqCfH:BbirIzD:BbiwqTj:BbizYKj:BbjBvxz:BbjDRYr:BbjDsHj:BbjEXzw:BbjGRNM:BbjHytr:BbjIYzw:BbjKhSE:BbjOSAy:BbjTgNO:BbjYtH:BbjtjQr:BbjvEIc: +BbjwCFS:BbkEUbB:BbkHmZM:BbkIzZv:BbkJivN:BbkKOCr:BbkRzgz:BbkZFAp:BbkZIFC:BbkcfYu:Bbkeorl:BbkgTAM:BbkijSq:BbkivLz:BbkivqE:BbkkxCr:BbklVtn: +BbkpcVM:BbkqKLj:BbkxQVD:BbkyCki:BblIaif:BblIxGi:BblJjyG:BblLerw:BblOzzA:BblPmzz:BblWWpS:BblYrUA:Bblaqio:BblifyB:Bblmzgc:BblqxcE:BbltVTY: +BblttMH:BblvuFQ:Bblxcvz:BbmHEXP:BbmJxwS:BbmLWSs:BbmLshR:BbmOjwQ:BbmbjRk:BbmcucK:BbmhliM:BbmqLdA:Bbmtuck:BbmvLbz:BbmyGMt:BbnBeKF:BbnGcRv: +BbnGhoC:BbnNExY:BbnPxWZ:BbnRWsz:BbnSzMa:BbngLmw:BbnjtLV:BbnmTqC:BbnpFi:BbnrMul:Bbnswiy:BbnvFqv:BbnwjrB:BboALKt:BboASPo:BboEjVk:BboFgkg: +BboHZgU:BboKZri:BboTQae:Bboclem:BbogHiU:BbogRTJ:BbolpPA:BboymZt:BbpFzWq:BbpZQAl:BbpaPtP:BbpayYl:BbpoUq:BbpooRK:BbpvKNN:BbpzHSB:BbqCkVh: +BbqFJDg:BbqHSHC:BbqRDxD:BbqVClQ:BbqcEiA:BbqdDlS:BbqhLcQ:BbqjEr:BbqjjMh:BbqnKxC:Bbqpzhs:BbqqjqP:BbrBiMf:BbrGpDu:BbrMUmw:BbrTXlr:BbrWgNd: +BbrYRNF:Bbrbbrg:BbrbiZw:BbrgIOa:BbriNJt:BbrjDLZ:BbrnLCX:BbrpRjR:BbrwjQY:BbsAcbX:BbsBXlN:BbsEruO:BbsGQrI:BbsNQJI:BbsXQri:BbsYzNk:Bbsbfkf: +BbsdKLs:Bbsentv:BbsglKf:BbsiikF:BbsqnHh:BbsxznD:BbtBCBo:BbtKzGj:BbtLSHe:BbtMYfp:BbtTIfs:BbtVWra:BbtZMuW:BbtgfKO:Bbtwnha:Bbtyrop:BbuAFFZ: +BbuDPfi:BbuLTPo:BbuOZWY:BbuSLUG:BbuYBix:BbudRZU:BbufVvI:BbulGMS:BbunCHc:BbuuCXc:BbuuOY:BbuzTnX:BbvCxWC:BbvEWsc:BbvEsHB:BbvFzMx:BbvHjWA: +BbvLrAi:BbvPNUW:BbvdMuU:BbvfCXd:BbvhzqL:BbvmvQl:BbvxKiu:BbwBARh:BbwDOYE:BbwDrls:BbwDwuI:BbwFYyh:BbwNKFX:BbwNtJH:BbwVGlF:BbwWQaN:BbwYgkL: +BbwkswP:BbwuYdM:BbwyRTA:BbwyTWw:BbxAZGe:BbxBZRY:BbxINGd:Bbxeppq:BbxvPMg:BbyHhsh:BbyIerA:BbyQXLT:BbyRXZZ:BbySjlW:BbySqlT:BbySvax:BbyVlqI: +BbyWvZD:BbydfYS:BbyisZC:BbyyxtQ:BbzAShS:BbzDSAk:BbzKDXT:BbzNYze:BbzOjnY:BbzPhSW:BbzWzFw:BbzZXze:BbzaLCA:BbzeiZn:Bbzlfyl:BbzppcG:Bbzsjmx: +BbzwKXS:BcAMakT:BcAQdRz:BcAfDoT:BcAigke:BcAmYjD:BcAoQtg:BcBCuUX:BcBEfvv:BcBIVvk:BcBJcDT:BcBPsio:BcBRGKf:BcBRnNt:BcBSrEK:BcBTDNL:BcBUDbm: +BcBYdrE:BcBozuL:BcBqgKZ:BcBvowc:BcBxVhH:BcBxylP:BcCFpRr:BcCGKv:BcCJtVe:BcCPROi:BcCSlQV:BcCUPYb:BcCUemz:BcCWLjR:BcCcJfQ:BcCfOhf:BcCfaFn: +BcChPye:BcChUwk:BcClDIt:BcCpLnq:BcCqIRT:BcCwAqV:BcDCuLr:BcDFZSB:BcDJvNv:BcDKyzT:BcDTqpV:BcDVRop:BcDYlqO:BcDaQqd:BcDciuW:BcDdPoD:BcDdhja: +BcDjghb:BcDtoGL:BcDvIrm:BcEIwgj:BcEJYPn:BcEMBbG:BcETEMg:BcEWZID:BcEatCi:BcEbPKZ:BcEcYjM:BcEcvlu:BcEdyOe:BcEggmu:BcEjxym:BcEmgOW:BcEnVLq: +BcEoghq:BcEsRNR:BcEwmqH:BcFAxGo:BcFIEwy:BcFRYpW:BcFUDgO:BcFdyRk:BcFebFb:BcFfhhL:BcFgtcP:BcFiYJt:BcFivLL:BcFjPkc:BcFrxYT:BcFujxR:BcFuqVT: +BcFvVlH:BcFyUWo:BcGAKCO:BcGBOem:BcGBUwR:BcGEpt:BcGKOYZ:BcGMQwZ:BcGWQDk:BcGZeBn:BcGplRZ:BcGpoFx:BcGwXmA:BcGyhZl:BcGzRNX:BcHPxlg:BcHQOyS: +BcHSYiC:BcHUvqf:BcHWOED:BcHrRhI:BcHsjfV:BcHwSYu:BcHxYqp:BcHxieM:BcIAakm:BcIIOPY:BcILRWD:BcIOyPe:BcIQzqh:BcITiNi:BcIeVHn:BcIeyLv:BcIoNtr: +BcIpUnH:BcIqkDC:BcIvvuY:BcJBBnU:BcJBnBk:BcJBxqC:BcJPjjp:BcJSJEf:BcJTgVU:BcJVzQA:BcJcZDy:BcJcaav:BcJdbSv:BcJgXfO:BcJpBdB:BcJtMaS:BcJvUNA: +BcJwkdJ:BcKAqPp:BcKCROV:BcKLJvz:BcKNVaL:BcKOmqW:BcKSRnM:BcKSXrO:BcKXOuR:BcKYYex:BcKbQvX:BcKcLnN:BcKdqNj:BcKkPyZ:BcKkUwT:BcKlLpf:BcKouxe: +BcKpDyM:BcKrZwt:BcKtTnP:BcLAkTJ:BcLIUIh:BcLPjHX:BcLPoFm:BcLPqfk:BcLQOte:BcLWHiV:BcLXity:BcLYMNf:BcLaVDP:BcLgoGe:BcLhIrd:BcLiLNA:BcLqPYU: +BcLrWgP:BcLujoF:BcLwPom:BcLwhjH:BcLzfi:BcMALFB:BcMBJCx:BcMEGCj:BcMGOf:BcMHfXv:BcMPBvc:BcMPnZN:BcMRDGm:BcMgpwW:BcMhAbr:BcMigmf:BcMpfwr: +BcMqNDH:BcMxcBw:BcNEtug:BcNGLQo:BcNHJcs:BcNIrbo:BcNIvTO:BcNLTxk:BcNPZiT:BcNVBVh:BcNVnzE:BcNWfau:BcNYDQm:BcNhVlA:BcNkFOb:BcNpXwo:BcNufWY: +BcNxhhE:BcNzDAo:BcOIyuD:BcOMVtV:BcOQLFM:BcOVdhd:BcOaeJt:BcOcoNN:BcOdiEC:BcOhfcE:BcOjXmf:BcOoOPX:BcOqjWx:BcOttlc:BcOvhEK:BcOvyKq:BcOwLRn: +BcPBQtP:BcPFLY:BcPGkiG:BcPPOEq:BcPPvvZ:BcPQyUs:BcPRFON:BcPRRVi:BcPSCsH:BcPSrTk:BcPUVTa:BcPYLfz:BcPfnVi:BcPiejC:BcPiqMj:BcPkony:BcPvXIR: +BcPwOpo:BcPylrJ:BcPyofh:BcQByTD:BcQFRnh:BcQGiNB:BcQLkgF:BcQORWo:BcQRmev:BcQVdRh:BcQabsT:BcQcUnc:BcQfkFh:BcQjOmr:BcQjkTK:BcQnLrn:BcQpFkT: +BcQqMAq:BcQrsPd:BcQvolJ:BcRBDCO:BcRBqEE:BcREsiY:BcRGjuo:BcRMinY:BcRSjjI:BcRURwt:BcRUdN:BcRWgVl:BcRZPYn:BcRebPw:BcRfsYD:BcRlkfs:BcRqrEt: +BcRwMaj:BcRyCpm:BcRygvK:BcRzsbU:BcSDKeS:BcSHkrZ:BcSMsGk:BcSNflG:BcSOiNG:BcSSBVw:BcSUISn:BcSddop:BcSfXFb:BcSjnoA:BcSnAUN:BcSoZul:BcSoyxf: +BcStDRF:BcSvJfg:BcSwTny:BcTAEvJ:BcTCjaL:BcTEJVj:BcTLKEj:BcTRnLn:BcTWsfN:BcTXsfn:BcTZgKu:BcTfQqr:BcThjoY:BcTjXTA:BcTsIHs:BcTtsnp:BcTzAwB: +BcURtUE:BcUWpIg:BcUcVLc:BcUjesg:BcUpQyZ:BcUrZOp:BcUxKqd:BcVBnnK:BcVPhBa:BcVRvRl:BcVZFjk:BcVbgMV:BcVlkCO:BcVoGpA:BcVuxYf:BcVwZoI:BcWDXny: +BcWEyxD:BcWGdjo:BcWIrvt:BcWMLUO:BcWRsCP:BcWfeak:BcWgqDQ:BcWhqDq:BcWiLRg:BcWjxlV:BcWlCSv:BcWphvM:BcWqkhB:BcWuGMw:BcXDzTo:BcXOdHt:BcXZKxK: +BcXcXMv:BcXfidA:BcXmYqn:BcXmieS:BcXoyka:BcXpxLo:BcXtJmQ:BcXzjGK:BcXzjwh:BcYASMP:BcYAwSF:BcYFPyl:BcYIZUw:BcYLNcE:BcYSuuL:BcYUfVb:BcYcsyf: +BcYdPaD:BcYdXFt:BcYeCPo:BcYegVI:BcYgsBw:BcYpZdB:BcYpaAM:BcZEjjB:BcZKDbp:BcZKmEF:BcZRuPk:BcZUkGv:BcZYyZn:BcZZHSE:BcZisYo:BcZkspT:BcZooLz: +BcZsOMB:BcZuGTP:BcZvgKg:BcZyNTi:BcaEGkU:BcaEnnG:BcaJqy:BcaMcdg:BcaONcb:BcaRBNI:BcaRnbw:BcabenO:BcaeFkj:BcarLBg:BcasZde:BcasaAj:Bcatbsj: +BcawPac:BcawXFS:BcbLrEO:BcbNfvr:BcbRVvo:BcbUuPr:BcbboLc:BcbeDOo:BcbjeNx:BcbuujS:BcbyZDR:BcbzLbP:BccCTIt:BccEhuN:BccLlQR:BccNPYf:BccPLjV: +BccWqPK:BccfiUJ:BccjdoB:BcckqNq:BccpOhB:BccpaFJ:BccqVdd:BcctlUR:BccuoG:BccwogQ:BccxegY:BccyLnu:BcczQvc:BcdFVS:BcdIhuB:BcdOZSF:BcdRlqK: +BcdTeMg:BcdVLJO:BcdYtvx:BcdbJFL:BcddTka:BcdhIHA:BcdvAQK:BceHDGr:BceKVZF:BceOqc:BceUtUs:BceXJCg:Bceaqrw:Bceentx:BcefxBf:BcexVLU:BcfCpiH: +BcfEhBw:BcfIbHb:BcfJxGk:BcfLNbW:BcfXwGW:BcfbYJp:BcfbvLH:BcfcUWK:Bcfecbq:BcfiqRN:BcfmnTA:BcfngHL:BcfrRno:BcfvgMH:BcfzbpC:BcgAQDW:BcgCQAZ: +BcgDmgN:BcgFMnN:BcgGINO:BcgKyxv:BcgNcxG:BcgPyiU:BcgSxLr:BcgWkIK:BcgZKCS:BcgchZP:BcgfjFC:BcgoDU:Bcgvnve:BcgyeJO:Bcgyqmf:BchFyUF:BchIebk: +BchXQtE:BchfvRM:BchhSTh:BchljfZ:BchojGy:BchojwZ:BchpSYy:BciFyPY:BciHDBW:BciHmea:BciIDnv:BciRDcC:BciRqeI:BciUsIU:BciWjUc:BciXyTS:BcibGtw: +BcidLry:BcieZdl:BcieaAc:BcifNtN:BcihsPs:BciiYja:BcikoWY:BcivsyH:BcjPaKh:BcjSBQP:BcjkgKy:BcjnNTw:BcjqiZb:BcjtVhk:Bcjtyls:BckBpRQ:BckDOTv: +BckOOEQ:BckQEVF:BckUJvf:BckWVaP:BckasRe:BckiogV:BckkIRw:BcklQvd:BckogHx:BckxjOU:BckzXtM:BclGNxK:BclLtvQ:BclNWz:BclSRNJ:BclUOeF:BclVOFk: +BclWEvQ:BclXYEs:BclYjaW:BcljPYQ:BclqQVS:BclrLNE:Bclugho:BclzVDT:BcmEwgu:BcmGYPQ:BcmIBbX:BcmLDqb:BcmPEMx:BcmYBvg:BcmYnZJ:Bcmcgmj:BcmdazQ: +BcmgbPa:BcmjNDL:Bcmkghn:BcmoRNM:BcmpGPU:BcmqyOZ:Bcmrgmb:BcnDGce:BcnEVzv:BcnJnmC:BcnLOzu:BcnPfaq:BcnQDgb:BcnVEms:BcnYZiP:BcnabFO:BcneYJY: +BcnevLa:BcnfpWX:BcnlsIP:BcnpNdG:BcnxgMi:BcoCyij:BcoDQTC:BcoExLm:BcoGmgq:BcoIYIi:BcosXmb:BcoviDU:BcpIyIe:BcpJxlB:BcpKQtl:BcpOQWv:BcpPLfF: +BcpXyUO:BcpYOEM:BcpYvvf:BcpZCst:BcpZrTW:BcpbonE:BcpcYqu:BcpcieH:BcpnOpS:Bcpojfs:BcppjGP:Bcppjws:BcpsSYP:BcpyvRd:BcqIuuy:BcqKyTH:BcqLzqo: +BcqPRnD:BcqXJeh:Bcqdrec:BcqfBDl:BcqgLBu:BcqokFd:BcqysyS:BcrADbG:BcrAmEq:BcrEdro:BcrFBQy:BcrNRwh:BcrOGKl:BcrQytC:BcrURNo:BcrVinE:Bcraspc: +BcrdiZK:BcreoLM:BcriOMu:BcriktL:BcrkGTg:BcrmLRi:BcroFKS:BcrpMav:BcrrGo:BcrrUNd:Bcrukfo:BcsAvnu:BcsGhUE:BcsHTIJ:BcsIulQ:BcsJVai:BcsMiTs: +BcsQyZw:BcsUjhR:BcsUofg:BcsUqFa:BcsUynJ:BcsXflk:BcscAql:BcsfVdZ:BcsgWGZ:BcshLpC:BcsiiUt:BcspTnu:BcsvtDA:BcswAUB:Bcsxyxj:BctCUIK:BctIpra: +BctKOtF:BctLsgn:BctMTic:BctOhUY:BctTMNe:BctbeGN:BctdLNB:BctiAQe:BctkURn:BctuJFb:BcuAGCG:BcuEnNV:BcuNece:BcuODqK:BcuSEMQ:Bcucpwz:Bcudgmk: +BcueXWi:BcumVLG:BcupFod:Bcuwazx:BcvAtuX:BcvSfaJ:BcvVpiz:BcvaZom:BcvgPku:BcvidwA:BcvieSz:BcvjXwP:BcvkgMR:BcvxpWC:BcvyGpe:BcwFeBD:BcwGFot: +BcwGRvS:BcwMKXv:BcwOKCe:BcwPdjk:BcwRrvp:BcwVLUK:BcwZINy:BcwgRNR:BcwivWA:BcwkOPu:BcwnGMs:BcwqqDu:BcwsxlR:BcwvSSX:BcwwJMl:BcwzDGY:BcxAQWI: +BcxKQdx:BcxLOER:BcxLvvy:BcxQscm:BcxXdHp:BcxbnVJ:BcxcqMI:BcxdlrI:Bcxdofk:BcxeonZ:BcxoRhs:Bcxpide:BcxvtLw:BcxyxLk:BcyGDcQ:BcyHkgc:BcyMVxI: +BcyNDnd:BcyOPyp:BcyXIVW:BcybkFM:BcyfOmW:BcyfkTn:BcyjLrK:BcykMAT:Bcyldhi:BcynsPA:Bcyoizi:BcypoWK:Bcyrolo:BcyuDoc:Bcyzent:BczMDCH:BczMqEB: +BczOSmu:BczOwsc:BczRuUI:BczXZur:BczbsYc:BczhkfT:BczivUN:BczkrES:BczsYJJ:BcztCpj:BcztgvL:Bczuowr:Bczvsbr:BdABeMB:BdACnCx:BdADJZD:BdAEifj: +BdASPIU:BdAUoOr:BdAWvfV:BdAdpbb:BdAdull:BdAlluv:BdAmJGV:BdArSIa:BdAwqJz:BdAyJTQ:BdAzpTZ:BdBBmUN:BdBCIoQ:BdBDrUF:BdBGYaU:BdBKJSp:BdBKYUh: +BdBMVFM:BdBQQkw:BdBSrtQ:BdBXncG:BdBYAfd:BdBaxOV:BdBfGsc:BdBodrL:BdBrJgi:BdBslUI:BdBtQum:BdBwzef:BdCAovT:BdCCceT:BdCRFdN:BdCSNUC:BdCeAam: +BdCfqbk:BdCizTa:BdCkHSV:BdCoftQ:BdCpayJ:BdCqDLM:BdCqEhv:BdCxFlJ:BdDBlJG:BdDCCCv:BdDEelx:BdDKNvO:BdDKZIW:BdDLLeF:BdDMoay:BdDUgxi:BdDUoGN: +BdDVtcc:BdDXFcu:BdDbGSi:BdDcSnd:BdDeNAL:BdDfruJ:BdDjGVm:BdDknzL:BdDnBkf:BdDwPLT:BdDxaYq:BdDyGVe:BdEACcD:BdEFXWq:BdEGoBE:BdEImuM:BdEKVJp: +BdETVMu:BdEUZog:BdEVRod:BdEVcHG:BdEjNmF:BdElLIE:BdElSfp:BdEvsoR:BdExDcd:BdEzKss:BdFDuLZ:BdFJYRa:BdFKXwF:BdFMobR:BdFOyrB:BdFXIGB:BdFYYNK: +BdFZlEO:BdFdsBT:BdFoigw:BdFqQVR:BdFsOuA:BdFtyjq:BdFxFXJ:BdFzxVi:BdGAWDE:BdGEoKZ:BdGFJQz:BdGHWHw:BdGHsVa:BdGMUh:BdGMZjk:BdGfDGv:BdGjSbW: +BdGsVnz:BdGxlYq:BdHBvCO:BdHONYJ:BdHOXjb:BdHObut:BdHRYoG:BdHVrUk:BdHWIuA:BdHaANP:BdHaRZP:BdHbGms:BdHbckU:BdHdSyM:BdHeIAO:BdHkdTE:BdHqBHW: +BdHzKoH:BdHzoVq:BdIItRN:BdIJHnT:BdIJwDg:BdIKvzm:BdINrul:BdINxin:BdIRKiR:BdIYFwo:BdIbtPB:BdIfisb:BdIgulU:BdIilkG:BdIqQUK:BdIrIMs:BdItNtI: +BdIxaNF:BdIyYcn:BdIyznd:BdJDuRO:BdJGrUi:BdJHYaz:BdJKemr:BdJMJzt:BdJNvFf:BdJUmUa:BdJadrC:BdJbQdL:BdJcbDQ:BdJdJgf:BdJdqMP:BdJelUF:BdJizei: +BdJkoSQ:BdJmpBR:BdJnqjJ:BdJpIny:BdJtDTq:BdJxImz:BdKAPRo:BdKCHyP:BdKEFdW:BdKFNUZ:BdKNtEv:BdKRgXK:BdKRogl:BdKVXdc:BdKaull:BdKdAFy:BdKeGvg: +BdKfxLe:BdKkFlS:BdKsayS:BdLBJFN:BdLDFzV:BdLbDOP:BdLiYtv:BdLjdJ:BdLjgky:BdLkxlL:BdLsufX:BdLsvwb:BdLyAfP:BdLzEHf:BdMFleA:BdMGEYH:BdMQDqg: +BdMWlNG:BdMWxDt:BdMZvow:BdMlKsj:BdMmJLy:BdMmeFx:BdMtlIO:BdMwsHT:BdMxsHt:BdMzVLM:BdNAKrx:BdNBadc:BdNLYNl:BdNMqzi:BdNNfTq:BdNNrMV:BdNOCez: +BdNTxUx:BdNUYCE:BdNWDQn:BdNYRMu:BdNaElW:BdNaIV:BdNlVIg:BdNoHMl:BdNvEZj:BdNylif:BdNzXWW:BdOIdxu:BdOKsVH:BdOLYKO:BdONdYA:BdOVUkz:BdOhWFI: +BdOjBkM:BdOlnoX:BdOoSKE:BdOpqot:BdOqOLO:BdOsOwk:BdOvQGl:BdOwKOj:BdOwovS:BdOzAZU:BdPCYkv:BdPHrUp:BdPQWhG:BdPQsvQ:BdPVpBm:BdPYznv:BdPalIV: +BdPcDSt:BdPjVNJ:BdPoDgF:BdPsSBg:BdPtpZE:BdPuGmH:BdPuckn:BdPwSyv:BdQAzhn:BdQDKiY:BdQEIKm:BdQJFeS:BdQMvkP:BdQaDtS:BdQgSIS:BdQkaNm:BdQpitc: +BdQqdIe:BdQuIMX:BdQwNtb:BdRCMJf:BdRHIoG:BdRMncQ:BdRNNWo:BdROKOt:BdROiFC:BdRRFEh:BdRUFuX:BdRUbmO:BdRVGPt:BdRgzLe:BdRktpR:BdRqanV:BdRxiTX: +BdSAdjh:BdSBExF:BdSHceB:BdSMJfh:BdSVgev:BdSZBsj:BdSbdzj:BdSdftG:BdSjNr:BdSnzTw:BdSzQiF:BdTGdJw:BdTKevm:BdTPZIe:BdTVfqj:BdTWRyu:BdTWVOU: +BdTXCCD:BdTeufA:BdTlPLf:BdToAAD:BdTqBkT:BdTrSRn:BdTwdZU:BdTxSnV:BdTyrux:BdUDDqL:BdUFRmW:BdUJlNl:BdUNdR:BdUOxuZ:BdURYcg:BdUWYnN:BdUYftS: +BdUYrmt:BdUZqZK:BdUayJT:BdUfQdB:BdUfXwU:BdUgcHU:BdUjDZ:BdUjjVk:BdUqTwI:BdUwViE:BdVAZON:BdVESxH:BdVJDQw:BdVLRMl:BdVPlnW:BdVPxdd:BdVVRoO: +BdVWxUa:BdVbDCM:BdVhEZS:BdVhEzd:BdVlQDy:BdVlXWn:BdVochn:BdVqshd:BdVtBen:BdVtokI:BdVvJli:BdVvefh:BdVygvO:BdWBxGx:BdWDbjX:BdWOUnS:BdWXrgs: +BdWYnxz:BdWhQGk:BdWlAZR:BdWoBhR:BdXBSrs:BdXDJnE:BdXFdUP:BdXGdyq:BdXKDiY:BdXUNUH:BdXUgPZ:BdXgyQg:BdXiqOD:BdXjYwL:BdXjvsT:BdXqWfy:BdXufPe: +BdYMHNS:BdYOUwG:BdYQhRj:BdYSIOe:BdYVLJZ:BdYWYAa:BdYXEvv:BdYXpBn:BdYcitz:BdYqxob:BdZCFWT:BdZDFEc:BdZMKII:BdZStru:BdZUHNO:BdZcYCU:BdZioZn: +BdZjdiu:BdZktUJ:BdZvInK:BdZzDTC:BdaAvzX:BdaDhRM:BdaFzhp:BdaJVuD:BdaLAFw:BdaTQKd:BdaVrTB:BdaWruU:BdaaUcQ:BdadHQS:BdadpTv:BdajGSP:Bdasbdm: +Bdauluz:BdayzEU:BdbBncc:BdbDKOF:BdbDiFq:BdbHMJT:BdbKmUJ:BdbOIkD:BdbRPiN:BdbTooi:BdbcSuC:BdbflKE:BdbgJtj:BdbiHqd:BdbiptA:BdbjdBn:BdblzLW: +BdbpGsG:BdbqSiz:BdcBnYm:BdcBygH:BdcCfQG:BdcECci:BdcIgeD:BdcOveb:BdcOyKi:BdcRJfZ:BdcTFZB:BdcUExt:BdceagF:BdcgkjQ:BdcjCYk:BdcnnZs:Bdcoqbo: +BdcrDoD:BdcyYTb:BdczgKm:BddLRyc:BddLVOC:BddMCCR:BddRcEk:BddULeB:BddWvEY:BddWykR:BdddQIo:BddhYIN:BddjHsi:BddldZC:BddmTxu:BddnfTn:BddoVWi: +BddoyQQ:BddpDlr:BddpEHI:BddsGVi:BddtAAR:BddwBkb:BdeBqlA:BdeLYrR:BdeQoBa:BdeRaDW:BdeSyRq:BdeUVJT:BdeVkXT:BdeWulI:BdedEQh:BdedQvA:BdefOUR: +BdepVLp:BdewsbG:BdfBVmN:BdfCYNg:BdfDfTZ:BdfGvOu:BdfHmUV:BdfJVjk:BdfSYRm:BdfTqoD:BdfUXwj:BdfYyrn:BdfesOI:BdfkSFk:BdgBYaJ:BdgDdYT:BdgHWDy: +BdgMrgA:BdgSYKz:BdgTYOP:BdgaGyB:BdgcAtb:BdgdyqB:BdgeSKP:BdgmovF:BdgqliZ:BdgsDsx:BdgzVnF:BdhCnXS:BdhLAPi:BdhPDiG:BdhPWdB:BdhYUNz:BdhfWfg: +BdhiATY:BdhkWo:BdhkckY:BdhlyQy:BdhmSyA:BdhnqOZ:Bdhwlyv:BdiATMg:BdiAVfw:BdiGurZ:BdiMPIp:BdiOoOW:BdiPJsj:BdiPYur:BdiSMjj:BdiXIOK:BdiaLNt: +Bdiebdd:BdigJGs:BdigqmE:BdihiIV:BdiiifQ:Bdiijdn:Bdimosd:BdivxoL:Bdiwzli:BdjFJzx:BdjGVFn:BdjKQkT:BdjMrtr:BdjQVUt:BdjSAfG:BdjWHnD:BdjXtrK: +BdjYUWP:BdjZvZh:BdjatpG:BdjeiSg:BdjfuLP:Bdjmiio:BdjnlUJ:BdjpQuN:BdjsaJm:BdjxlKB:BdjyInu:BdkETNI:BdkGljA:BdkIRYA:BdkIVoa:BdkKmdX:BdkNFdS: +BdkYdjC:BdkZPRk:Bdkbqbv:BdkkftL:BdklgKT:BdknGvc:BdkuFlw:BdlEVIp:BdlEXDn:BdlIoaV:BdlQgxF:BdlQoGa:BdlTFDZ:BdlUNuW:BdlaNAc:BdltGVj:Bdluxlh: +BdmDiUq:BdmEyRh:BdmHYcH:BdmIulP:BdmOleE:BdmPqZd:BdmQZoZ:BdmZDqc:BdmbHma:BdmgEQQ:BdmgQvx:BdmjHXR:BdmpHAn:BdmrDcY:BdmxEZp:BdmxEzG:BdnCCCp: +BdnEYRb:BdnGqok:BdnKmUy:BdnLRoR:BdnVEyE:BdnWfTu:BdnWrMR:BdnYvOz:BdnbTpk:BdndxFb:BdnkigT:BdnlJlt:Bdnlefu:BdnwruS:BdoBdxy:BdoDhDV:BdoEUnx: +BdoGYOI:BdoHYOi:BdoKrue:BdoWdYM:BdoXkP:BdoZpbX:BdoaWdp:BdobDGS:BdofSbr:BdopdtK:Bdoyqox:BdozSYc:BdpHdXp:BdpJsvM:BdpKYAZ:BdpWdXP:Bdpbgwv: +BdpggOd:BdphDgZ:BdpiBKH:BdpmuUG:BdpvKoo:BdpvoVV:BdpzlIJ:BdqEUwR:BdqFMjQ:BdqJruK:BdqJxiI:BdqMYAt:BdqSFwH:BdqcqJD:BdqfUcc:BdqnIMT:BdqpNtn: +BdqsYcI:BdqsznC:BdqtaNa:Bdqyozr:BdqzdIi:BdrALjd:BdrCEVH:BdrCpbP:BdrDIkj:BdrJvFC:BdrNhrT:BdrPzHi:BdrYFET:BdrczeL:BdreaJd:BdrfSiT:BdrguIo: +BdrkUCH:BdrmiJ:BdrnHqJ:Bdrnpto:BdrpDTT:BdrvNTe:Bdrzanj:BdsAFdt:BdsHljf:BdsRxfp:BdsTyKw:BdshGsH:BdslrUk:BdsogKs:BdspGvL:BdstBKG:BdsuXbT: +BdszTXP:BdtGFDc:BdtadZq:BdtdaYG:BdtgGVS:BdtlFLG:Bdtugkd:BduBRoR:BduBcHq:BduGaDe:BduIROp:BduMDqH:BduORmS:BduSlNh:BduaVia:BdudDcR:BdueVLB: +BdufKsE:BduhHDL:BdujTwM:BduoQdF:BduoXwQ:BduqcHq:BduzyJP:BdvHYNq:BdvIqzt:BdvJROi:BdvJchJ:BdvMiua:BdvPxUe:BdvQYCX:BdvSDQs:BdvURMh:BdvYlnS: +BdvcHxB:BdvkHMq:BdvlDCi:BdvrgvK:BdvuXWj:BdvyjvT:BdwBrgW:BdwHYKl:BdwRUkY:BdwUNyk:BdwUXJC:BdwUbUU:BdwZhhw:BdweQyP:BdwvGpU:BdxKrlR:BdxNUNH: +BdxWrGh:BdxXnXa:BdxkQYO:BdxllyD:BdxnBHI:BdxsvsX:BdyCKoj:BdyEFwA:BdyGvku:BdyIGpJ:BdyJFUf:BdyJbMq:BdyKiHH:BdyKodp:BdyQNwQ:BdyRnCo:BdyTKoJ: +BdyXMjX:Bdyfznj:BdynQUE:BdyoNEx:BdysSUO:BdyuMe:BdyvlkI:BdywJTf:BdyyHQh:BdyypTM:Bdyzdbb:BdzFKIE:BdzKKOS:BdzKiFd:BdzMFWx:BdzOvKL:BdzVYad: +BdzZJSA:BdzZYUY:Bdzmanq:Bdzsdiy:BdzwImD:BeABkRZ:BeACOkU:BeADVIY:BeADjni:BeAHhif:BeAMywI:BeANGLa:BeAOhPT:BeAVPSl:BeAXQea:BeAZSPb:BeAcemP: +BeAeNfS:BeAkHnT:BeAmYHn:BeApMQB:BeApnQR:BeAsNVm:BeAxCse:BeAyqII:BeAzsRU:BeBEkOC:BeBIdNo:BeBJkrc:BeBLjNP:BeBUhpm:BeBVGlX:BeBaaJn:BeBdQJE: +BeBqsoz:BeBrTjI:BeBsapL:BeCCoxf:BeCJpdX:BeCPlGl:BeCTBXi:BeCWLRd:BeCcBNw:BeCiBFU:BeCkWZB:BeCoZxy:BeCpRPY:BeCteXw:BeDCcSW:BeDDxjg:BeDFwVx: +BeDHGyi:BeDHXcg:BeDJNru:BeDOVWX:BeDQAXA:BeDSNHk:BeDiBnn:BeDjFOs:BeDoBfL:BeDoWOD:BeDrCCl:BeDvCMo:BeDwCGh:BeDwKiC:BeEGnaC:BeELvAe:BeEOSIL: +BeEOYvC:BeETrLf:BeEWdyz:BeEXYFZ:BeEYJzN:BeEZJuA:BeEbOfs:BeEemip:BeEhvRM:BeEjnLt:BeEkXUy:BeEkqMa:BeEmoLc:BeEnwsK:BeEtWnY:BeEvxEb:BeEyWsJ: +BeFGpom:BeFKrlO:BeFMIyW:BeFOtiT:BeFShSr:BeFSvaL:BeFUIAb:BeFVlGw:BeFhOkh:BeFjNbp:BeFnvrD:BeFqArT:BeFqXup:BeFqqmh:BeFsolj:BeGAScX:BeGAZJm: +BeGGIxl:BeGOlCP:BeGWHub:BeGZBOY:BeGbNEZ:BeGdTDm:BeGroMV:BeGvVTL:BeGzyYV:BeHGSCS:BeHGZjf:BeHIbbz:BeHJsra:BeHKnHJ:BeHSKfS:BeHSgPu:BeHXXCc: +BeHaDDg:BeHbguy:BeHcFSq:BeHcRrW:BeHdNaz:BeHdqcl:BeHhpav:BeHqRSX:BeHuMJK:BeIBhPK:BeIJXdy:BeIKhiy:BeIRkoe:BeIUkRE:BeIVdnI:BeIWVIF:BeIWjnv: +BeIXdWB:BeIYphj:BeIbIpv:BeIbpJL:BeIcnQM:BeIeNVR:BeImvQo:BeJFECm:BeJHhpD:BeJIjFk:BeJMGwG:BeJPAgd:BeJSRmx:BeJVyWY:BeJeAlH:BeJfcoF:BeJgIPY: +BeJgfaQ:BeJgpjc:BeJiMqR:BeJinqB:BeJjCnG:BeJjEFB:BeJnSYN:BeKBgUF:BeKCLKT:BeKHbmK:BeKSand:BeKbZxB:BeKcBDi:BeKkXCw:BeKmARg:BeKmdog:BeKmopi: +BeKqpId:BeKupFa:BeKvwBD:BeLAVWQ:BeLBCDx:BeLCAPC:BeLCVDc:BeLDAXh:BeLFEZr:BeLGgum:BeLJgrk:BeLQasx:BeLSlOq:BeLcThU:BeLhdMO:BeLjCGA:BeLjKij: +BeLkAsX:BeLkFBN:BeLoblq:BeLsGqG:BeLswFy:BeMASIK:BeMAYvD:BeMJAJW:BeMJFSY:BeMMGdY:BeMMOmM:BeMNdRs:BeMQVtE:BeMTPKt:BeMYnaD:BeMbaxr:BeMeOfT: +BeMhAsu:BeMlceO:BeMmXLN:BeMneVX:BeMoHIT:BeMoyWY:BeMpXqs:BeMpubr:BeMrTPC:BeMsvfp:BeMthMM:BeMwNyS:BeNAtiM:BeNEhSk:BeNEvaU:BeNFYVs:BeNHAnw: +BeNYpot:BeNZPkc:BeNbiib:BeNdirf:BeNeiz:BeNhIjn:BeNkOkQ:BeNlimK:BeNmNbI:BeNpWSz:BeOAxuK:BeOGQzr:BeOIHuk:BeOJUIM:BeOLBOP:BeOMIQZ:BeOYIxe: +BeOaNAX:BeOaqCN:BeOwTDD:BeOxTgj:BePAtYO:BePBWpo:BePMQZK:BePTBoi:BePdRSC:BePeZAI:BePhdaV:BePixze:BePkgHS:BePqIbF:BePqQGy:BePyGqo:BeQAQNS: +BeQIkuE:BeQMQew:BeQYQfa:BeQZjQQ:BeQiTaR:BeQlWoj:BeQosRC:BeRBPsC:BeRCafE:BeRGQnJ:BeRJBKZ:BeRLFP:BeRNgro:BeROpqT:BeRVJeq:BeRZHsx:BeRcqif: +BeRdCSJ:BeRfsoL:BeRgcqj:BeRjBdB:BeRrWOs:BeSFanM:BeSLLRV:BeSQEzP:BeSSYBh:BeSTbjN:BeSmXRS:BeSoRmO:BeSrSpp:BeSsdmm:BeSunlr:BeTDfJv:BeTFlOj: +BeTJxDi:BeTTpDs:BeTWAXs:BeTYEZi:BeTZlgG:BeTjpit:BeUEANI:BeUNXxc:BeUPYnU:BeURQtG:BeURyPz:BeUTCos:BeUdTPJ:BeUhIlI:BeUiWnw:BeUpIWa:BeUurBz: +BeUwhMd:BeUwxDu:BeUxdVp:BeVCAjg:BeVCFsi:BeVDGDi:BeVHVTu:BeVJtTW:BeVKMtK:BeVVYNL:BeVXsKL:BeVcbTN:BeVfHid:BeVfywi:BeVgevh:BeVjRrL:BeVkaXB: +BeVsNfI:BeVsTxP:BeWAKio:BeWCQtT:BeWCwAT:BeWDiCZ:BeWFYUu:BeWHnho:BeWMpZG:BeWMrur:BeWTScv:BeWTZJC:BeWfpAs:BeWkEVs:BeWofcv:BeWpFsT:BeWpRRr: +BeWrqww:BeWuWza:BeXFIqJ:BeXHKfA:BeXHgPg:BeXIQTc:BeXIwac:BeXLicm:BeXMXCq:BeXPnHX:BeXbVtu:BeXdIbo:BeXdQGP:BeXjZvL:BeXnpaD:BeYCsso:BeYFHSz: +BeYLjQJ:BeYNphX:BeYPUCb:BeYTssO:BeYUkoW:BeYZkRw:BeYaHny:BeYcYHC:BeYdILG:BeYiLos:BeYitek:BeYkqHj:BeYosIu:BeYpcKA:BeYqajz:BeYtQjQ:BeZCiVm: +BeZGSpd:BeZGobY:BeZHJex:BeZLHsq:BeZNqtN:BeZNtl:BeZTiVM:BeZVQEG:BeZXuVI:BeZfoMz:BeZiapS:BeZjoAf:BeZnYOP:BeZoLOx:BeZqSek:BeZqqha:BeZwaJq: +BeaCJEZ:BeaKPQW:BeaLdnR:BeaNkuw:BeaObqd:BeaTtZO:BeaVEcy:BeaXhPP:BeaeoaD:BeafaPq:BeakcQp:BeamGiB:BearzRT:BeatTJT:BeavcOR:BeawIpM:BeawfAE: +BeawpJw:BeayMQF:BeaynQV:BeazCNS:BeazEfV:BebEjqZ:BebKJec:BebLyWt:BebROKh:BebSPqn:BebWpHH:BebZtzv:BebbLOc:BebdSep:Bebdqhz:BebjHNi:BeblYhS: +BebreMm:BebscqI:BebtNFn:Bebxqit:BebyckQ:Bebzvqm:BecGxJz:BecKGYt:BecKXCz:BecRCdL:BecVEzF:BecabLE:BecbBFQ:BecbWoY:BecmZiu:BecmtOM:BecsvoD: +BecuZFh:BeczCgu:BedGCUj:BedIpDE:BedMxjc:BedODqz:BedOvgx:BedVLry:BedbBnj:BedhBfH:Bedweve:BeeEdB:BeeICoA:BeeJTIb:BeeKnxD:BeeNdyF:BeeNicG: +BeeQtIA:BeeUhsg:BeeUvAY:BeeVSIp:BeebceT:BeecjPm:BeedeVC:Beeennr:Beemiak:BeepPzQ:BeeriIn:BeetiRj:BeexIJb:BefFnAF:BefGJZk:BefIJUD:BefNVTG: +BefSNBr:BefStFs:BefdmIu:BefgmMl:BefrWM:Befuxeg:Befynlq:BefzArX:Befzqmd:BegAMPo:BegAcpM:BegFKFD:BegFgpb:BegJAmV:BegQtyC:BegRWPc:BegdzMo: +BegeFsF:Beggqwe:BegtRsO:BeguZaE:BegxdAZ:BegytY:BegyxZi:BehEHux:BehGMpt:BehGcPV:BehNlcW:BehOBBF:BehSsrm:BehVIXk:BeheoWv:BehizmT:BehjDDk: +BeiCQeb:BeiFRMK:BeiJGLB:BeiLjfX:BeiRPSO:BeiSaFI:BeiVuvL:BeiWQNF:BeiZBkV:Beibbpb:BeicCsf:BeidzRS:BeiesRV:BeifCyE:BeihcQF:BeiiIpJ:BeiifAB: +BeiipJp:BeilCNT:BeilEfQ:BeisqIj:BeitCsF:BeiwcQf:BeizBDN:BejAkOn:BejEdNB:BejGdwI:BejIXDr:BejJhIr:BejXpHa:BejfTAP:BejhbPU:Bejlvqd:Bejoapa: +Bejqfau:BejqpjG:BejrMqV:BejrnqF:BejtNvY:BejwSYJ:BekBFsH:BekDaSw:BekKgUB:BekNBXV:BekONRs:BekTfjb:BekeBFj:BekeWob:BekfAmP:BekfTHZ:BekhaNP: +BekjCmI:BekkZxF:BekneXH:BelBGyD:BelBXcJ:BelMAXl:BelNNHf:BelSgro:BeldDkS:BeleBnC:BeljXcx:BelkBfa:BelkWOi:BellZfX:BelrBdf:BelsCGE:BelsKin: +Beltpfn:BeluwbK:BelzXrU:BemBvOs:BemHgmJ:BemJIah:BemLpOg:BemNyBW:BemPrLE:BemSAJS:BemcPzN:BemeiIq:BemgiRu:Bemjwsh:BemnWVn:BempiMx:BemrxEA: +Bemsbtz:BemuceK:BenAMtp:BenEoNU:BenHdYv:BenHiCw:BenMgMe:BenNhSw:BenNvaI:BenOIAG:BenPYVO:BenSTir:BenXnAO:BenaaXy:BeniPZA:Benjvra:BenlnlX: +Benmirz:BenvNYX:BeoGCxP:BeoKiCQ:BeoSUIA:BeoVIQV:BeoaEVX:BeoaeWu:BeobTgF:BeoggUw:BeokWzJ:BeolGQZ:BeorVTi:BeotIBs:BeotQgL:BeozZVP:BepFsrF: +BepHqMt:BepVQZw:BepXHUn:BepYUiH:BepgTGo:BepjaKe:Beptomz:BeqDpho:BeqPPQI:BeqRpQA:BeqSVIc:BeqSjnS:BeqUAGn:BeqXJED:BeqgzRJ:BeqjALB:BeqpcQn: +BeqvomF:BeqysXL:BeqzoaZ:BerIGwd:BerLQEr:BerMhIU:BerdMqQ:BerdnqA:BerkbPr:BermqiZ:BernsrF:BerovqC:BerpsME:BerqcqV:BertZQe:BerxTAW:BesMxdT: +BesVQD:BesWfjK:BesXApE:BesXVde:BesekKi:BesfXRW:BesiGQa:BeslpIi:BespFbH:BespkdY:BestbLw:BesxAmY:BesxTHS:BetCbJs:BetKLrk:BetUaNp:BetaSPM: +BetdRpV:BetfKiu:BetgFOE:Bethexx:Betkbln:BetoArs:BetodOs:Betspip:Betwpfu:BetxAsg:BetxFBq:BeuBKKN:BeuCdyP:BeuCicQ:BeuEYFP:BeuPPKY:BeuaNBs: +BeufbtS:BeujeVu:BeumIJt:BeurKqj:BeurtnG:BeurwNY:BeuuNFt:BeuuTXm:BeuvEEZ:BeuvIY:BeuyIWe:BevAIAX:BevDAnT:BevETim:BevIvoC:BevNJUr:BevSCOn: +BevWKkw:BevawSX:BeveOkr:BevgNbj:BevhWNj:BevmjpB:Bevtrbg:Bevvhmy:Bevvxdh:BevwiAD:BewCHuH:BewEUIN:BewOcYT:BewSqmR:BewUWPU:BewVtyu:Bewpghi: +BewsgEz:BewuakC:BexBQTo:BexBwao:BexKHUw:BexNBoL:BexOIqF:BexYpvd:BexaZAl:Bexoyyc:BextWZZ:Bexwomc:BexzEvH:Bexzewe:BeyBQCB:BeyBgRQ:BeyDdWl: +BeyOHSf:BeyUjQV:BeyaZqG:BeyhsIi:Beyjajf:BeyksOR:BeyrLoo:Beyrtew:BeytqHv:BeyzHne:BezBsSh:BezCQno:BezIkrp:BezJViS:BezJjNc:BezKpqq:BezWqtB: +BezavqZ:BezbYhD:BezheMz:BezjNFy:Beznsir:BezsQJV:BezxLOt:BezxtEl:BezzSeg:Bezzqhm:BfACjrO:BfAHKXk:BfAKpfB:BfALDYG:BfANKBb:BfAOBFq:BfASmWH: +BfATTmZ:BfAVeTl:BfAXHgE:BfAYJQj:BfAafN:BfAeOVQ:BfAemWT:BfAfAgd:BfAjoWw:BfAkCfe:BfArZeA:BfAsRJX:BfAvCxG:BfAwFvP:BfAwiGX:BfAxILU:BfAyNfC: +BfAymfS:BfAzcyF:BfAzeQC:BfBCgNH:BfBCxTF:BfBKLky:BfBMvHY:BfBNagk:BfBNvsK:BfBRGBE:BfBXBzH:BfBeTXq:BfBfKu:BfBkVxx:BfBmzQT:BfBnwMz:BfBrzoA: +BfBsbSj:BfCAPSi:BfCRZLY:BfCRcSy:BfCSaGB:BfCSvSb:BfCTaOi:BfCVeMs:BfCWGbl:BfCZGej:BfCaykh:BfCbbqd:BfCbwXl:BfClWuN:BfCoEaI:BfCvOiN:BfCxDZN: +BfDGBKT:BfDNGza:BfDOHds:BfDOVVM:BfDPgJm:BfDQyaK:BfDRmCt:BfDVOyQ:BfDYDnr:BfDYIts:BfDZfDV:BfDashS:BfDjpmE:BfDkVEe:BfDlOki:BfDxadz:BfDyyJM: +BfDyyjp:BfDzBcq:BfEFvCs:BfEIcXL:BfEKNOI:BfENDNK:BfENITJ:BfEUHDj:BfEUVvT:BfEVyAr:BfEXayv:BfEbCRY:BfEckwi:BfEdEaN:BfEmIVf:BfErOKp:BfEtIeg: +BfFBazb:BfFCbui:BfFGSEB:BfFIQzp:BfFJwGW:BfFPWVr:BfFPqcr:BfFQXbJ:BfFWqms:BfFYhbj:BfFbwmG:BfFfOU:BfFheAU:BfFiGRX:BfFjIln:BfFkThj:BfFlFtP: +BfFltLM:BfFqQTO:BfFqnVY:BfGACGB:BfGFGGm:BfGFkqK:BfGIbUR:BfGJaZY:BfGQTNL:BfGRwgl:BfGcAKD:BfGdGhB:BfGefDI:BfGereo:BfGpalD:BfGuzVJ:BfGxDvU: +BfGyXmf:BfHGBJX:BfHNuTx:BfHQqYR:BfHWvxZ:BfHYKbD:BfHaYjg:BfHbCFR:BfHcIls:BfHdFVv:BfHeNFE:BfHemFU:BfHpSOA:BfHuzfa:BfHxRhg:BfHytvS:BfICqRi: +BfIFpHu:BfILJQS:BfIMBjG:BfIRpdD:BfISAqB:BfIVUAG:BfIWqyM:BfIbBGi:BfIccDm:BfIdZeX:BfIfSWn:BfIfcNN:BfIhCfM:BfIiFvI:BfIiiGA:BfIleQZ:BfItcDM: +BfIvSxK:BfIwCfm:BfIzbsE:BfJCjjc:BfJENZJ:BfJFGEh:BfJHbOz:BfJPLxR:BfJSrWd:BfJVAyL:BfJfbSA:BfJnaYu:BfJoWqz:BfJogFD:BfJpWqZ:BfJpgFd:BfJuWx: +BfJzANa:BfKELKI:BfKKGbU:BfKLMIF:BfKNboA:BfKOned:BfKVLXi:BfKZXSj:BfKewXu:BfKfaZG:BfKgwmj:BfKhAyG:BfKhsGJ:BfKkzOQ:BfKtojd:BfKuujL:BfKwNwA: +BfKwxJL:BfLBivD:BfLCgJJ:BfLDPXK:BfLJiNq:BfLOjbn:BfLUaYH:BfLaIEY:BfLbWdD:BfLdEHv:BfLdFJc:BfLfwAB:BfLjXRm:BfLttGK:BfLywyv:BfMSfdf:BfMTgSf: +BfMToZr:BfMXvCz:BfMZTCX:BfMbVeU:BfMcpMu:BfMeOKY:BfMgIeN:BfMjVQO:BfMnnNl:BfMsBCA:BfMuCRp:BfMvjWA:BfMwEag:BfMzreC:BfNAzhb:BfNBkJR:BfNCLTa: +BfNHxtY:BfNObXH:BfNSWVk:BfNSqck:BfNTLTA:BfNZOIW:BfNbgiu:BfNgnRK:BfNptWm:BfNrzvh:BfODIiq:BfOGcOM:BfOGrKR:BfOKItL:BfOVifK:BfOXGGf:BfOYWvb: +BfOYqCb:BfOaeaE:BfOgGbj:BfOkwMW:BfOlgfG:BfOrvct:BfOtiun:BfOtqPQ:BfOvtwd:BfOzzaM:BfPJvxc:BfPKJyg:BfPMaPZ:BfPPFhs:BfPSSdl:BfPVhDy:BfPcCXx: +BfPdSzx:BfPfbSC:BfPltvj:BfPoDLX:BfPpOzr:BfPqhyz:BfPuaHC:BfPvBhM:BfPxyxX:BfPyTrh:BfPylxp:BfQNtJr:BfQPpft:BfQSIAl:BfQWOuX:BfQWsge:BfQXjry: +BfQasNy:BfQgVfw:BfQgcD:BfQhRJn:BfQiCxq:BfQmoWA:BfQpCfS:BfQsLxa:BfQtgig:BfQyAgR:BfQzOVg:BfQzmWb:BfRAADB:BfRCLxK:BfRHipG:BfRJxhg:BfRKbOc: +BfRNfbK:BfRVyUp:BfRZEzZ:BfRbDxv:BfRbOgx:BfRbaEv:BfRcWqC:BfRpxTf:BfRqhIl:BfRqxEk:BfRrzQF:BfRsjLl:BfRsrzw:BfRxbSx:BfRzTXc:BfSGZLK:BfSGcSk: +BfSLrwt:BfSMXSA:BfSNiPN:BfSXaGP:BfSXvSp:BfSfhiE:BfSfxeB:BfSgykZ:BfSiWQJ:BfSigft:BfSpKSL:BfSpadK:BfSwojO:BfSxaZL:BfTAgsH:BfTCDEB:BfTGmCJ: +BfTKOyo:BfTRmZV:BfTSyym:BfTUYGB:BfTZBKj:BfTZnua:BfTcjwo:BfTeUuC:BfTexfB:BfTfrEM:BfTijoh:BfTjWYe:BfTjkfV:BfTknnB:BfTmadD:BfTqVOz:BfTqtZO: +BfTwtGr:BfUCDNe:BfUCITd:BfUDjMq:BfUEyqe:BfUanuF:BfUcyJg:BfUcyjZ:BfUdMZv:BfUewDU:BfUksHD:BfUlreD:BfUsiJh:BfUunqA:BfUutoX:BfUvVoS:BfUvtzf: +BfVAbXO:BfVEWVl:BfVEqcl:BfVFXbT:BfVJyBM:BfVMxze:BfVNQzn:BfVPRbj:BfVPlXC:BfVPrPC:BfVRXu:BfVggFi:BfVmtpu:BfVneAk:BfVpTht:BfVrFtn:BfVrtLs: +BfVwXMc:BfVzuAq:BfWChBC:BfWIkjb:BfWJzHR:BfWPnpw:BfWQPaP:BfWSQZY:BfWYcOT:BfWYrKK:BfWgYnW:BfWigIE:BfWmSa:BfWoOzW:BfWsGrq:BfWtTHG:BfWuTHC: +BfXEGB:BfXNqqR:BfXPxsc:BfXcSXf:BfXhaHh:BfXlTrC:BfXnsRH:BfXogIE:BfXuOvE:BfXvAGp:BfXzowc:BfYBqtM:BfYCvXs:BfYOhdi:BfYUJfY:BfYazFH:BfYnahS: +BfYrTRx:BfYtsrs:BfYzhYj:BfZBPv:BfZBTLT:BfZHGBx:BfZLEzU:BfZQlEA:BfZVzlj:BfZbuJa:BfZcaYc:BfZdwMG:BfZectp:BfZgAYj:BfZgsgg:BfZlbYr:BfZmfxo: +BfZoANw:BfZrbQP:BfZrwxX:BfaLOuJ:BfaLsgw:BfaMjrk:BfaQKXo:BfaUDYC:BfaYxSs:Bfaaahx:BfabyXc:BfaeTRS:BfaelXK:BfagsrX:BfanSZC:Bfapbsx:BfasoWs: +BfavtVQ:BfaxBGT:BfbHzls:BfbICdr:BfbMgNl:BfbMxTb:BfbOEzl:BfbRfdK:BfbTADt:BfbnKsS:BfbnaDT:BfbnfuB:BfbobYK:BfbpANN:BfbubQi:Bfbuwxa:BfbvazS: +BfbxAYS:BfbzczJ:BfcAGbH:BfcDOOs:BfcJLKt:BfcRgnE:BfcRxtK:BfcazOL:BfchEaM:BfcjVXu:BfckujQ:BfcubyB:Bfczxty:BfdHDEP:BfdRVXt:BfdXGzM:BfdYgJa: +BfdZivo:BfdbadV:BfdjUuQ:BfdjxfP:BfdspmI:BfduOke:BfdwIEr:BfdzWdo:BfeATCM:BfeCJa:BfeDYuY:BfeFBkQ:BfeFnUZ:BfeIfdS:BfeJjMC:BfeKgSs:BfeKoZg: +BfeMDey:BfeQmcq:BfeSgJ:BfeUOYT:BfeXDNw:BfeXITv:BfeaRuY:BfecHzG:BfecXsV:BfehiJz:BfeiBCt:BfejwDG:BfekCRE:BfemEaR:BfeoUUx:BfeoxFy:BfepsHV: +BfeqAOx:BfexyJu:BfexyjH:BffDCgu:BffDmGW:BffGatd:BffHOd:BffOPAU:BffTIIm:BffWcoQ:BffWrkN:BffeAkS:Bfffdsh:BfflXMQ:BffptSI:BffqeAY:BffrtpG: +BffsIlb:BffutLA:BffwGBv:BfgAaZe:BfgBbUn:BfgHhbP:BfgIklb:BfgPXBM:BfgQtJC:BfgVSeE:BfgXQZw:BfgjEZL:BfgldSc:BfgpQtH:BfgwtPl:BfgzTHm:BfhCKbh: +BfhEpDW:BfhFAQQ:BfhIOUd:BfhIsGY:BfhPBJT:BfhQSlI:BfhUSHO:BfhXmwB:BfhdBgZ:BfhiSEn:BfhkSzm:BfhnNFI:BfhnmFY:BfhocYL:BfhoeqI:BfhpUih:BfhwZEK: +BfhxRjR:BfiDtJY:BfiFKeV:BfiHPfW:BfiLAqF:BfiMutc:BfiPqyI:BfiVBjC:BfiaOVl:BfiamWi:BfirILh:BfitmfN:Bfiwnaa:BfjAEzg:BfjDfbV:BfjFPso:BfjIvHv: +BfjKemu:BfjLyUm:BfjOGEl:BfjijLq:Bfjirzj:BfjmDzH:BfjvhIQ:BfjvxEV:BfjwyKN:BfkBCDb:BfkGOOj:BfkNPST:BfkPaOt:BfkgTxe:BfkkEaT:BfkmVXl:BfkocTY: +BfkqAyC:BfkqsGN:BfkrOiS:BfktrgU:BfkwfXF:BfkwwJv:BflKyah:BflNcxV:BflSDnQ:BflSItP:BflUyQQ:BfleVEF:Bflfpmf:BflhOkJ:Bflooqx:BflqnUr:BflsyJn: +BflsyjS:Bfluwda:BflvBcR:BflxJGz:BflxkWs:BflzEAt:BfmBvCV:BfmCays:BfmIinj:BfmRgjQ:BfmTayS:BfmYVxD:BfmcEhm:BfmcFjx:BfmewaY:BfmgIzO:BfmiXrv: +BfmlpMy:BfmnOKU:BfmpIeB:Bfmwnum:BfmxwYm:BfnAOIk:BfnPCNs:BfnShbO:BfnYkJn:BfndeAp:BfnfwLe:BfnhFtu:BfnhtLh:BfnizvT:BfnygiI:BfoBLtd:BfoEbUu: +BfoIOiR:BfoJiOX:BfoLbXt:BfoRWvn:BfoRqCn:BfofnrN:BfojTHr:Bfomzc:BfoqzVm:BfpFIay:BfpIAQx:BfpMqYw:BfpRGER:BfpRqTA:BfpacYE:BfpcUiA:BfpgBgs: +BfpiZEB:BfpkSwt:BfpkcnT:BfplAGG:BfpmCFW:BfppowT:BfpqzfD:BfqFJQp:BfqHSLy:BfqIBjd:BfqLVA:BfqOAqa:BfqRSDi:BfqSqyn:BfqYKeq:BfqZJYb:BfqdILo: +BfqfeQy:BfqgNfy:Bfqgmfi:Bfqinaf:BfqjsNu:BfqmBGj:BfqznQx:BfrANZW:BfrGfdY:BfrOrWy:BfrQipC:BfrRAyQ:BfrTnEb:BfrdPQT:BfrjhIh:BfrjxEo:BfrlDxR: +BfrlaER:BfrsEOY:BfryoJb:BfsBaGt:BfsBvST:BfsFGbZ:BfsHMIi:BfsIxHj:BfsJbon:BfsMcBP:BfsMfBF:BfsRLXF:BfsUrwp:BfsWiPJ:BfsazqK:BfsbaZh:Bfsphia: +Bfspxef:BfsqOGu:BfsrWQN:Bfsrgfp:BftEDnH:BftEItI:BftQNoj:BftVDQe:BfteMh:BftemU:Bftfije:BftnshI:BftprEi:BftsDAl:BfttWYA:Bfttkfr:BftztZK: +BfuBGZR:BfuFmcG:BfuJOYb:BfuMjMu:BfuNfde:BfuPgSE:BfuPoZQ:BfuRDeO:BfuYBkg:BfuYTQm:BfuYnUl:BfudWDp:BfuhjOe:BfujnNO:BfulaDI:BfumMZr:BfurjWb: +BfutUUN:BfutxFO:BfvBxtz:BfvLcoG:BfvLrkX:BfvPITF:BfvSCNl:BfvTPAC:BfvYRbn:BfvYlXG:BfvYrPG:BfvhiUD:BfvjtWN:BfvnQTu:BfvnnVc:BfvrPVo:BfvvGRb: +BfvweAo:BfvywLz:BfwCcOh:BfwCrKw:BfwDWvg:BfwDqCg:BfwGaZW:BfwIybF:BfwPbxD:BfwYCnc:BfwaFTe:Bfwatlx:Bfwfgfb:BfwhOzK:BfwlvcQ:BfwniuK:BfwnqPt: +BfwpYnK:BfwvXmh:Bfwztsp:BfxBlWP:BfxEpFz:BfxIBfI:BfxJFhT:BfxMmwp:BfxXIab:BfxeEzY:Bfxfnqz:BfxhgII:BfxjOzU:BfxmZs:BfxqaHd:BfxuTrO:BfxulxW: +BfxwsRD:BfyFKXX:BfyJDYt:BfyMKBq:BfyOpdN:BfybSxa:BfyhzFt:BfyioWd:BfyngiB:BfytOVB:BfytmWG:BfyuAgw:Bfywaho:BfzAXsk:BfzDipd:BfzFxhD:BfzJfbh: +BfzMagZ:BfzMvsz:BfzPemk:BfzQGBt:BfzRyUS:BfzSMiG:BfzlyKP:BfzmwMK:BfznjLo:Bfznrzt:Bfzqzop:BfzrDzV:BgAEWhk:BgANDGV:BgANjKp:BgAPago:BgATiuO: +BgAfiJc:BgAfqBv:BgAhHHS:BgAmpNC:BgAnDcM:BgAusqf:BgAwqbA:BgAxcxh:BgBBrgT:BgBItkI:BgBJnAs:BgBNtgq:BgBRnsb:BgBTWWa:BgBUqjg:BgBVesZ:BgBaCof: +BgBkcKD:BgBmnyl:BgBnTPC:BgBpnPZ:BgBtvYZ:BgCBCRL:BgCJqJP:BgCKWwV:BgCRclj:BgCaPwf:BgCcOgk:BgCdzyn:BgCeDhT:BgCeqeK:BgCfkMg:BgChExP:BgCltjh: +BgCqckS:BgCtZVq:BgDGIAD:BgDIIHX:BgDMyTH:BgDXSnS:BgDXaDB:BgDdZy:BgDeBvM:BgDfyHI:BgDlsXX:BgDpSVp:BgDsQnA:BgDvOsS:BgDvaNU:BgEAavs:BgEAdsw: +BgEBWrf:BgEHcgz:BgELCBd:BgEQyXB:BgEYtrb:BgEaWWN:BgEcBhC:BgEcZAY:BgEhKhn:BgEhQCV:BgEmgVI:BgEtsxa:BgExSvI:BgEyQNx:BgFBtNH:BgFGLQa:BgFMtrH: +BgFOEQt:BgFPmzT:BgFcQTv:BgFeNQJ:BgFiZbZ:BgFkSuP:BgFvVGQ:BgFxoDL:BgFzEHN:BgFzyOr:BgGBCWT:BgGCHZx:BgGHtnQ:BgGPCbt:BgGPJEO:BgGUmZm:BgGadEH: +BgGiQto:BgGkhTp:BgGnwDw:BgGoIHY:BgGqSUI:BgGsVPN:BgGviAr:BgHCmIP:BgHNDPi:BgHOfMe:BgHbFEe:BgHdcXj:BgHxJPF:BgIKmii:BgINQfY:BgITDpP:BgIZRIf: +BgInnp:BgIqgQY:BgIviOt:BgJDfqh:BgJKLqs:BgJMNVd:BgJPZJg:BgJSYMv:BgJUsOt:BgJWTwv:BgJZdhB:BgJazYP:BgJckmY:BgJmRRX:BgJmYws:BgJnMFu:BgJnhwr: +BgJwvAl:BgKDclm:BgKFwkv:BgKOeSj:BgKWtGA:BgKbdYW:BgKdQtM:BgKfWHX:BgKgzyI:BgKhAxz:BgKjEpy:BgKkExw:BgKoXxX:BgKynpj:BgLAqwg:BgLBaFv:BgLFMju: +BgLFfsi:BgLHqJg:BgLKSnt:BgLKaDe:BgLLWRX:BgLMLId:BgLNGSx:BgLYIAC:BgLaFyp:BgLarkt:BgLcRbt:BgLhGsf:BgLiTXg:BgLmcR:BgLsSVW:BgMEZkB:BgMIbUy: +BgMIuZF:BgMNMJB:BgMQaPX:BgMSyxI:BgMVGsO:BgMgZbB:BgMiABr:BgMlQNQ:BgMoTxP:BgMtqJP:BgNCCbY:BgNCZEG:BgNDXYH:BgNGAZY:BgNNloO:BgNnkTX:BgNxQLp: +BgOExKV:BgOIXyc:BgOKMQr:BgOKSq:BgOQoGY:BgOZXAZ:BgOaIHP:BgOeVPG:BgOjlEF:BgOlxGv:BgOmeXK:BgOtktS:BgPADPv:BgPNaGR:BgPPtjI:BgPPzgs:BgPWsVf: +BgPXxqo:BgPacCB:BgPbWns:BgPeuXZ:BgPgcXu:BgPixEu:BgPmqkH:BgPnJyw:BgPsgUT:BgPwHhN:BgQDfur:BgQGDpy:BgQHfmu:BgQLWul:BgQNTNL:BgQQQfp:BgQZvvY: +BgQfccm:BgQlILV:BgQmcxz:BgRGnsP:BgRJDoX:BgRMdhy:BgRORtx:BgRQHhp:BgRRKiv:BgRRszA:BgRTZXw:BgRXTwM:BgRaycv:BgRcWhz:BgRenPh:BgRfGGN:BgRhUBc: +BgRivYh:BgRnPKk:BgRphNx:BgRqbLW:BgRtCoT:BgRuXgx:BgRuf:BgRvGkH:BgRvOs:BgSBLQC:BgSDNvT:BgSGHsH:BgSGsdG:BgSJNat:BgSMfQX:BgSSdHr:BgSURTs: +BgSXtGh:BgSYZjW:BgSaXfF:BgSdRrh:BgSdYWC:BgSddel:BgSeSaN:BgSgMfE:BgSghWB:BgSnOft:BgSxDhz:BgSxqee:BgSyOBo:BgTByTV:BgTIhXE:BgTLIAZ:BgTMLxo: +BgTNIHF:BgTQByi:BgTQxsI:BgTaQdJ:BgTaoQb:BgTcCFy:BgTcmOC:BgTcqIX:BgTfKHi:BgTfQcQ:BgTowsC:BgUAqjw:BgUBJkJ:BgUBVxJ:BgUEyxN:BgUFyXl:BgUKaff: +BgUUWrH:BgUaGSv:BgUbOSd:BgUbanb:BgUeDgB:BgUfGbK:BgUgKbW:BgUgQDC:BgUgoqk:BgUiCfp:BgUimoJ:BgUiqiQ:BgUprqn:BgVBtJr:BgVFXaX:BgVIXbj:BgVIrBg: +BgVKaXr:BgVTEQF:BgVvgwK:BgVwgsM:BgVxOzi:BgVzexi:BgWECbf:BgWFrCr:BgWLXAa:BgWbodg:BgWdEhe:BgWdyoY:BgWwktH:BgXHdnU:BgXKTnj:BgXWXp:BgXiIlp: +BgXiUdz:BgXlLYq:BgXpyRC:BgXqqUw:BgXvijW:BgXvqbB:BgXxHhg:BgYFKwF:BgYIRNk:BgYItJy:BgYIzGC:BgYKiuB:BgYOKQK:BgYWSdw:BgYXate:BgYbsDj:BgYfVwM: +BgYjgud:BgYvyrZ:BgYwqun:BgZDtgj:BgZLesA:BgZQHaq:BgZUtDq:BgZaOWe:BgZchNQ:BgZkUBJ:BgZlQCt:BgZlXXs:BgZnxvY:BgZqPWj:BgZsOGg:BgZtzYb:BgZuDHX: +BgZuqEG:BgZvkmk:BgaAWuZ:BgaCmbi:BgaGcjM:BgaKatL:BgaPRIy:BgaRDzC:BgafpNG:BgarHbp:BgarQgV:BgaxJYn:BgbGrdq:BgbIZXa:BgbLrgp:BgbRtkM:BgbTnAW: +BgbXrdQ:BgbaoES:Bgbbxvf:BgbcSv:BgbdPWu:BgbosYN:Bgbvnyh:BgbxAMy:BgbzCob:BgcEeSQ:BgcHCwR:BgcJSNB:BgcKCRP:BgcLHsZ:BgcLsdU:BgcMgP:BgcMtGz: +BgcQnSi:BgcTqJl:BgcWtKb:BgcXtKB:BgcYnax:BgccOff:BgcfXfT:BgcgxVI:BgckyCO:BgcmTpH:BgcsvyQ:BgczckO:BgdBCOa:BgdBuBu:BgdHQnj:BgdJXOe:BgdKMQW: +BgdYbue:BgdYtlb:BgdYuzZ:BgdeBHV:BgdeZaL:BgdoyHE:BgdyAbn:BgeEiXi:BgeKqjR:BgeLytM:BgeVIaA:BgeZLif:BgeausB:BgejqJE:BgeqkqI:BgetBVH:BgfBHkf: +BgfKtND:BgfMeE:BgfUCwA:BgfWeQI:BgfbZbV:BgfcfbT:BgfzKV:Bgfzlez:BggDFUb:BggFLqd:BggLtRM:BggQtnM:BggcgSz:BggeVgT:BggjSUU:BggkTUo:BggrQts: +BggtNqO:BggyIHe:BggzdET:BghCKsX:BghHiUi:BghIakg:BghLsSE:BghTfUf:BghWDPm:BghXfMa:BghbDCk:Bghcpne:BghkFEa:BghmHhU:BghnxEN:BghoHBR:BghoQGt: +BghvcCy:BghxWnh:BgiBWhT:BgiDKQY:BgiIKSa:BgiNRNy:BgiNtJk:BgiNzGQ:BgiPiuP:BgiTlIe:BgibqBi:BgijDcR:Bgivxew:BgiwDGS:BgiwVUu:BgizqKJ:BgjAKTp: +BgjDtkD:BgjGcLp:BgjJtDg:BgjOqjJ:BgjPWWL:BgjVHag:BgjWsDs:BgjaSrA:BgjedyJ:BgjgQTP:BgjjTPn:BgjokdO:BgjqXFr:BgjuSAz:BgjwMFq:Bgjwhwv:BgjyZvk: +BgkCsoI:BgkRYmk:BgkSjWD:BgkTsoi:BgkVTWk:BgkZLQn:BgkbkMD:BgkgSRX:BgkhtjK:BgkiTUD:BgkkdYS:BgkmQtI:BgkukDV:Bgkvvaq:BglGhSY:BglNtRX:BglPMjQ: +BglPfsM:BglQqJc:BglUyXZ:BglVyxx:BglqGsb:BglrOsp:BglraNv:BgluDGV:BglwKBC:BglwQdW:BglyCFd:BglyqIE:BgmLVMd:BgmOhsf:BgmQQNz:BgmTtrg:BgmZSNO: +BgmbRBO:BgmdkqP:Bgmgvom:BgmhIqK:BgmigVl:Bgmjwop:BgmnsxD:BgmrSvl:BgnBZt:BgnCLQF:BgnEHkM:BgnHHzf:BgnItro:BgnKEQS:BgnNMqe:BgnUCBj:BgnUJeQ: +BgnahtN:BgnbAPl:BgncuQY:BgnfdeV:BgniVpp:Bgnnldy:BgnpCJy:BgnroDk:BgntEHi:BgntyOU:BgoDGQw:BgoFFpy:BgoOtRt:BgoaBdp:BgodQtj:BgofhTu:BgogNqv: +BgohOvX:BgoiuqB:BgokZBf:BgoslEJ:BgouxGz:BgozfQI:BgpBaZ:BgpDBjx:BgpFJzY:BgpFhiW:BgpGfUA:BgpKfMF:BgpNlEk:BgpOsSb:BgpPxuB:BgpQWV:BgpTDgw: +BgpTjkQ:BgpVKWJ:BgpYRng:BgpYtju:BgpYzgO:BgpiSNw:BgpkWnO:Bgprsdf:BgpvVWA:BgpzgUh:BgqGDzQ:BgqJQft:BgqVRIK:BgqVsvm:BgqXxUu:BgqaMe:BgqdsqP: +BgqlqKC:BgqmPkd:BgqpccI:BgqqWNx:BgqtuxQ:BgqvHHE:BgqzsDQ:BgrAqjQ:BgrKwKp:BgrLZJX:BgrQEAZ:BgrZHht:BgrcQCy:BgriOGJ:BgrjMFJ:BgrjhwM:BgrpGGj: +BgrrXBS:BgrxPKO:BgsEjWM:BgsJUfJ:BgsMChk:BgsMSNt:BgsQKIy:BgsQsZN:BgsRZjS:BgsSZxx:BgsYDOW:BgsbWHu:Bgsdnpg:BgseExZ:BgsfEpT:BgsfJcr:Bgshvyg: +BgskoeJ:BgsoPUy:BgspyCy:BgstXGw:BgsuGKG:BgsxOfP:BgtCMjH:BgtCfsT:BgtDJKg:BgtDVXg:BgtFapR:BgtHWRE:BgtNbus:BgtNtlt:BgtNuzL:BgtRCbG:BgtUXvQ: +BgtVnfv:BgtWIHB:BgtZhNb:BgteOsi:BgteaNo:BgtksXb:Bgtztyb:BguGSi:BguGtrH:BguJqjs:BguLadQ:BguOLip:BguOVMK:BguPBYd:BguPxSD:BguXhxH:BgubCft: +BgubmoN:BgubqiU:BgueKhd:BgujGSr:BgukTxs:BgunwSN:BguuSvC:Bguyrqj:BguzFgm:BgvOXaT:BgvRXbf:BgvRrBk:BgvVogW:BgvbVGo:BgvlHiS:BgvtwdP:BgvuoDR: +Bgvvfbf:BgvwEHP:BgvwyOl:BgwAxKq:BgwBEqc:BgwGMQU:BgwJaxw:BgwXXBo:BgwXrbb:BgwbYFS:BgwegWN:BgwglDI:BgwieXl:BgwodEf:BgwrHIZ:BgxGBja:BgxHDgN: +BgxHjkh:BgxJaGw:BgxNiUW:BgxQWUf:BgxSmBU:BgxVQLY:BgxVWZo:BgxWcJq:BgxYSDB:BgxcxEP:BgxgTk:BgxjVWx:BgxxHEd:BgyJTNo:BgyMBJh:BgyOKwZ:BgyZxQC: +BgybSng:BgyhILu:BgyoVwQ:BgyrrBY:BgzDvmx:BgzIjfX:BgzIyTW:BgzJppR:BgzUesE:BgzXCWF:BgzZCHI:BgzZSnV:BgzdXBZ:BgzjOWa:BgzkbLz:BgznZvY:BgzpCoy: +BgzsOFr:BhATFZi:BhAYMTy:BhAcasB:BhAfKOJ:BhAhsYD:BhAiFkL:BhAiSrb:BhAiTaW:BhAlDRO:BhApafU:BhAqZrQ:BhAsKFX:BhAyuTB:BhBDNmc:BhBEiCW:BhBFYSV: +BhBIgXP:BhBOTYT:BhBQFxA:BhBRQAo:BhBSvSR:BhBWlBl:BhBWvfW:BhBXXxX:BhBXbrx:BhBfdLZ:BhBgQaO:BhBhOZs:BhBhkIO:BhBjMDR:BhBjQBI:BhBjcMh:BhBlivp: +BhBmaiM:BhBrgxn:BhBsAEz:BhBvWxR:BhBySSw:BhCDTGV:BhCDUQn:BhCLNMT:BhCMYSC:BhCMquN:BhCNYsa:BhCOrrO:BhCRRUJ:BhCUTyc:BhCbzij:BhCeKzT:BhCiizO: +BhCjYcq:BhCjZtt:BhCkWdt:BhCqfRO:BhCsrIK:BhCufPb:BhCuvwZ:BhCvqEY:BhCytsX:BhDOmza:BhDXRhZ:BhDYhqb:BhDZtuw:BhDeziY:BhDpXle:BhDsFwV:BhDwDnR: +BhEEgZs:BhELOLq:BhEScIZ:BhESznD:BhETxrK:BhEWaqZ:BhEbbot:BhFAMIH:BhFECAl:BhFGHbS:BhFLFFB:BhFiCHz:BhFjsEs:BhFpiga:BhFpuok:BhFqXNM:BhFxqYj: +BhFzRiM:BhGRlKz:BhGkdLv:BhGmGZX:BhGpseL:BhGqChE:BhGreVw:BhGrwEt:BhGtWwC:BhGtquu:BhGwCsr:BhGyXnr:BhHGCtt:BhHHsec:BhHJSOt:BhHNnJg:BhHOzSO: +BhHPxWZ:BhHQFzK:BhHRVfM:BhHSwWV:BhHWDca:BhHcKoh:BhHdxMu:BhHkmMV:BhHnYTQ:BhHtrVS:BhIDhpL:BhIGRLe:BhIKumF:BhINCZz:BhIVxwA:BhIWNXS:BhIiKOs: +BhIpolM:BhIqYHu:BhIswCy:BhIvglM:BhIyVrk:BhJDQAf:BhJFUWA:BhJTiJb:BhJWNmJ:BhJYwYy:BhJdtSF:BhJegxG:BhJhQaf:BhJidLs:BhJjrws:BhJkOZZ:BhJkkIf: +BhJkqor:BhJmcMA:BhJnkCQ:BhJnqhi:BhJoivY:BhJpYg:BhJzzjF:BhKDRUM:BhKMsEL:BhKYHsD:BhKcLpf:BhKodlJ:BhKqOzc:BhKqqOK:BhKrrWJ:BhKsMdB:BhKsQbY: +BhKscmx:BhKvkch:BhKvqHP:BhKwcPG:BhLBmzX:BhLCsPw:BhLLtun:BhLSRIo:BhLSxib:BhLYmTl:BhLaGxE:BhLanpY:BhLcvLk:BhLdcAD:BhLfOOV:BhLhFzo:BhLmhbW: +BhMCezg:BhMFcIq:BhMFzno:BhMJaqq:BhMMWpe:BhMMjNe:BhMPLDG:BhMRTas:BhMVxJY:BhMYRif:BhMYxIk:BhMbaiF:BhMcIJX:BhMcyMW:BhMfLNE:BhMmFIk:BhMnFZf: +BhNBLNv:BhNKALs:BhNLTaH:BhNLZlr:BhNLreZ:BhNTXzn:BhNWZUn:BhNYdlJ:BhNZsOF:BhNhdHq:BhNrMTA:BhNvbWZ:BhOElKU:BhOHMbG:BhOILBo:BhOISxv:BhOJMiX: +BhORyvK:BhOXDET:BhOcsec:BhOdeVx:BhOgWwl:BhOgquZ:BhOphHu:BhOqqyz:BhOyiGq:BhOzWwg:BhPAhPn:BhPJHuO:BhPJJmT:BhPNRof:BhPPnwq:BhPPyFL:BhPSxWc: +BhPUVft:BhPVVHV:BhPWMtb:BhPXlzI:BhPduIb:BhPgrVj:BhPlHEy:BhPooie:BhPtVJV:BhPuxIV:BhPwxML:BhPzDNf:BhPzrYb:BhQDyWa:BhQESQi:BhQISdg:BhQMdDp: +BhQPHUF:BhQTTLk:BhQbNSL:BhQeafg:BhQhglF:BhQsHeP:BhRLIbX:BhRMHXG:BhRNHEE:BhRRucA:BhRXHwZ:BhReVDL:BhRgiZJ:BhRkgIa:BhRofrJ:BhRtptM:BhRwetw: +BhSBOSF:BhSDXXa:BhSDbRA:BhSGAmg:BhSLHsm:BhSPlSG:BhSRIBS:BhSSgxi:BhSTHeN:BhSXuCJ:BhSbWXk:BhScSsN:BhSeYWP:BhShrIe:BhSjcPn:BhSlRzo:BhSncpW: +BhSnflH:BhSpWdZ:BhSqQAv:BhSrYkj:BhSwaIt:BhSzUxq:BhTERIh:BhTExie:BhTKLdi:BhTPYAx:BhTPqkl:BhThFwh:BhTiYDO:BhTieCs:BhTjFiE:BhTqLnk:BhTtoqf: +BhUAOLc:BhUDTaJ:BhUfhBG:BhUqYdx:BhUqecD:BhUzGXU:BhUznPI:BhVGMIz:BhVJkxi:BhVLsOM:BhVNzWI:BhVTrbj:BhVUrwf:BhVWXzE:BhVXSkg:BhVYqGV:BhVbSZq: +BhVhmuB:BhVjPeT:BhVqNKp:BhVsIat:BhVsQia:BhVthcd:BhVuMTj:BhVvhIc:BhVvqLE:BhVxSop:BhVyWpm:BhVylRR:BhWAbAU:BhWBAlC:BhWETAx:BhWEZLB:BhWErEj: +BhWKLnF:BhWNqgm:BhWPkXr:BhWcjRF:BhWegwa:BhWhfnK:BhWmXVW:BhWnmUY:BhWpPEO:BhWvzwe:BhWwNkk:BhWzQiM:BhXAywG:BhXHTt:BhXHuMk:BhXMhjv:BhXOcyg: +BhXTRlH:BhXaoij:BhXcYTg:BhXdjHS:BhXfVRF:BhXguIM:BhXiqHS:BhXixST:BhXnYhX:BhXsaSV:BhXtqt:BhXxsyP:BhXyFKX:BhXySRv:BhXyTAC:BhYCJMD:BhYGRc: +BhYGyWx:BhYHTLR:BhYJZPa:BhYLNXA:BhYOVhF:BhYOaZK:BhYPEXy:BhYWROv:BhYYzsf:BhYeHei:BhYfBgF:BhYmuir:BhYnVry:BhYqOnT:BhYqXKx:BhYvYHg:BhZIIsx: +BhZJTYm:BhZOQAC:BhZTTgZ:BhZTUqb:BhZgTkM:BhZhTkm:BhZobCN:BhZozjT:BhZpQTD:BhZpRuu:BhZrzIf:BhZuKZX:BhZyiZC:BhZzZTx:BhaBVhi:BhaBaZd:BhaKhpQ: +BhaOhZa:BhaRZpk:BhaWCgq:BhaZTof:BhadXKW:BhaiwCD:BhamjhC:Bhanesk:BhauDRK:BhbBdS:BhbDqem:BhbIciV:BhbKiJo:BhbPYSr:BhbQJKI:BhbTRuY:BhbUCLH: +BhbjVDz:BhbsLPr:BhcAXXL:BhcBISH:BhcVlbg:BhcaOgn:BhcaRhi:BhcfQAD:BhclaIF:BhcoVdU:Bhcqcpe:Bhcqflz:Bhcsxpe:BhcuWXY:BhczYWb:BhdChqN:BhdHgzd: +BhdVciM:BhdVzNS:BhdZaQM:BhddbOC:BhdjnZE:Bhdoico:BhdpBwz:BhdraIz:BhdvLny:BhdyXli:BheMCow:BheNgZo:BheSlzE:BheXhQe:BheYTYl:Bhekboh:BherFWQ: +BhesUzZ:BhevDNU:BhfBZlg:BhfBreO:BhfIkzO:BhfNbap:BhfPjqQ:BhfUlkI:BhfYLbs:BhfYSXj:BhfZMID:BhfmSoN:Bhftevd:Bhftweg:BhfwWWp:BhfwqUF:BhgBdqy: +BhgCwqI:BhgDSKN:BhgaWwl:BhgbhiJ:Bhgbqll:BhgcWPD:BhghjRT:BhgiRIv:Bhgnfny:BhgyseH:BhhDCGS:BhhIRlZ:BhhRCzE:BhhUkbj:BhhYSDS:BhhbDri:Bhhfwcf: +BhhhaSD:BhhjjHa:BhhmLny:BhhoONY:BhhoXku:BhhuaFS:BhhxYTu:BhiDZpr:BhiICgh:BhiNzsP:BhiPFZT:BhiQQAR:BhiRwwI:BhiVCTk:BhibKOw:BhicFkq:BhicTaj: +BhidsYy:BhihDRr:BhikZrl:BhimKFe:Bhisqhz:BhiyolI:BhizmmI:BhjCXxU:BhjCbru:BhjHAMS:BhjKFxl:BhjKmap:BhjMQAb:BhjOUWE:BhjPUWe:BhjROsR:BhjTXxu: +BhjTbrU:BhjWAMs:BhjbdLw:BhjciUU:BhjdkIb:Bhjdqov:BhjfQBd:BhjfcME:Bhjifpx:BhjmAEW:BhjmoxQ:BhjngxC:BhjsSSZ:BhjuYwD:Bhjxriq:Bhjzcpz:BhkBswI: +BhkKrrl:BhkSFXU:BhkSmAI:BhkTvsf:BhkXwyD:BhkZJkY:BhkaKzw:BhkbRzB:Bhkdcpz:Bhkdfle:BhkhdlN:BhkjOzg:BhkjqOO:Bhkkiul:BhklMdF:BhkniVd:BhkqfPA: +Bhkqvwy:BhktgXz:BhkuAen:BhkuoXh:BhlFeZr:BhlIxRU:BhlKmzD:BhlQOlo:BhlRmTp:BhlTTAF:BhlUqK:Bhlaicf:Bhlcttb:BhlvhbK:BhmAgZT:BhmGsH:BhmLMQk: +BhmOznc:BhmRspr:BhmXmti:BhmeUzA:BhmgGtG:BhmgzIe:BhmoLNI:Bhmrvln:BhnACAI:BhnCHbv:BhnCjqx:BhnFFFg:BhnNZUR:BhnQbaY:BhnRALO:BhnUTat:BhnUZlN: +BhnUref:BhnaCPp:BhnesEv:BhngevM:BhngweN:BhnhUSg:BhniWWy:BhniqUO:BhnitL:Bhnjhcs:BhnlhIt:BhnlqLR:BhnsjrJ:BhnugWm:BhnxfNG:BhoALns:BhoIHBO: +BhoIjQA:BhoVZuk:BhoXdLO:BhoZAlv:BhoikTz:BhokChf:BhomeVt:BhomwEw:BhosXnQ:BhpBlzm:BhpEcyL:BhpJnJZ:BhpSHuK:BhpSJmP:BhpWywl:BhpXTlF:BhpZZpu: +BhpdDNB:BhpdrYF:BhpeoLK:BhpgQNk:BhpgdCt:BhpnoMZ:BhpvBGR:BhpxQNK:BhpxdCT:BhqDejr:BhqDhZS:BhqEaZV:BhqFumI:BhqGlZD:BhqMROk:BhqOyfA:BhqRxwn: +BhqTVFy:BhqYHUB:BhqYJMY:BhqfqhQ:BhqfxsV:BhqiDnk:Bhqiryo:BhqkNSH:BhqnoIh:BhqocDX:Bhqvrvg:BhrAQAY:BhrBseJ:BhrJCLZ:BhrKAMH:BhrNciD:BhrTDXw: +BhrUwYf:BhragxX:BhredLl:BhrgOZE:BhrgkIy:Bhrgqom:BhrhzIK:BhriMDd:BhrjkCN:Bhrjqhv:BhrkivF:BhrpYCP:BhrpZTU:BhrtYKE:BhsFQar:BhsGvsO:BhsIUwu: +BhsLHxH:BhsQAmC:BhsUHsi:BhsYlSC:BhsftsR:BhsggXS:Bhsjgin:BhsjjkT:Bhskdlg:BhsmOzN:Bhsmkir:BhsmqOf:BhsnfRE:BhsoMdo:BhsoQbt:BhsocmU:BhsqiVM: +BhsscPj:BhstVdC:BhsuRzk:BhsvizE:BhswcpS:BhswflL:BhtDmTo:BhtFzty:BhtNRIl:BhtNxia:BhtQASY:BhtRWPo:BhtRcIT:BhtRjno:BhtULdM:BhtWTAy:BhtXeZm: +BhtYqkh:BhtZan:BhtbFzL:BhtgaIL:Bhtihbt:BhuFAsv:BhuJLDb:BhuLzTv:BhuMhQW:BhuTRic:BhuTxIn:BhucoQm:BhudESM:BhugFWc:BhuhYdD:Bhuhecx:BhuiFIN: +BhuzBWc:BhvDdlM:BhvKLd:BhvMMBI:BhvNrwj:BhvPEVl:BhvRXVe:BhvXzWe:BhvmQIZ:BhvqdlW:BhvsGzy:BhvvYYl:BhvyzWr:BhwCLBJ:BhwCSxS:BhwJCaY:BhwNyvn: +BhwSkZv:BhwTrWa:BhwVXZB:BhwXqgQ:BhwXwqg:BhwaUsw:BhwcCsX:BhweXnX:BhwnRIX:BhwqfnW:BhwshCc:BhwtMtm:Bhwuhid:BhwuqlB:BhwwSOw:BhwxWPj:BhwxlrU: +BhxAddZ:BhxFHul:BhxFJmw:BhxHZm:BhxJRoE:BhxOVfW:BhxQuMg:BhxRVHu:BhxRazx:BhxSUe:BhxhBGU:BhxjaFm:BhxkxlZ:BhxmgLL:BhxoxIu:BhxpVJu:BhxrLnG: +BhxtONg:BhxtXkK:BhxywcX:BhyASQt:BhyAkBC:BhyCzsB:BhyIdDm:BhyUxww:Bhyfuiv:BhynHem:Bhyrasm:BhywxiB:Bhyxqhh:Bhyxxso:BhzEPB:BhzHQAG:BhzIHXj: +BhzMxDy:BhzUUIi:BhzUocc:BhzXgXo:BhzciZg:Bhzkfrg:Bhzmric:BhzoUXw:BhzqTki:BhzvQap:BhzwYKl:BhzybCj:Bhzyzjp:BiABtgr:BiAEgeG:BiAGJFD:BiAICtP: +BiAIHIe:BiAMiVX:BiAPHhz:BiAQoVk:BiARZHo:BiASMPB:BiAUIcU:BiAVmF:BiAYzFI:BiAZRgv:BiAaQSp:BiAcuDR:BiAhIFL:BiAhyfm:BiAionx:BiAjaRE:BiAlDfE: +BiAllis:BiAnnoZ:BiApAFJ:BiAqzIq:BiBBLTo:BiBEPCv:BiBIEMw:BiBJTJu:BiBXHHM:BiBYMpu:BiBZZhX:BiBaVWD:BiBeLOu:BiBiIFd:BiBpyFZ:BiBrarr:BiBslDB: +BiBtDFr:BiBtlID:BiBuHmd:BiBvACl:BiBvnOm:BiBwziF:BiCBLFB:BiCCTLP:BiCHkpa:BiCIRjk:BiCIWsQ:BiCIXdf:BiCJpRY:BiCRYqx:BiCXyjL:BiCditO:BiChLOO: +BiCiybu:BiCnMKc:BiCsPVR:BiDBAzk:BiDFZPr:BiDHLfI:BiDKzit:BiDOWSZ:BiDOXDm:BiDQRLT:BiDXzTq:BiDbhUs:BiDdXq:BiDeSQc:BiDeVzb:BiDrtyK:BiDthOM: +BiDtrrR:BiDttqd:BiDzqYo:BiEBdjG:BiEFNpb:BiEIQlm:BiEMbhs:BiEONXp:BiEPXbi:BiERcXy:BiESpRZ:BiEaaFD:BiEoXrI:BiEpjWE:BiFArHW:BiFCYrH:BiFHdJH: +BiFIsGc:BiFLNPm:BiFOQJC:BiFOVGo:BiFPZro:BiFQPGi:BiFVXBf:BiFaDE:BiFfglF:BiFmGe:BiFqtTs:BiGAZHX:BiGCFxU:BiGDIpD:BiGLZap:BiGNkNq:BiGOETj: +BiGQBxv:BiGbcmC:BiGcqPn:BiGdQOr:BiGgTkU:BiGgvrD:BiGiFmu:BiGkCPg:BiGtXEX:BiGwPmo:BiHDqTQ:BiHKqlQ:BiHOWEl:BiHQuWj:BiHQwve:BiHRRSW:BiHSCLd: +BiHSxZN:BiHTknz:BiHaRiA:BiHcvIC:BiHhrYT:BiHmsop:BiHpFYV:BiHqRFb:BiIAboi:BiICHhc:BiIFBnT:BiIGgUF:BiIHgUf:BiISlqq:BiIVrpa:BiIcAFS:BiIdzIh: +BiIkIFU:BiIkyft:BiIolij:BiIrHMJ:BiIrOWn:BiIsTau:BiIvIfJ:BiIyuD:BiJBzfY:BiJMguO:BiJRHiu:BiJSlXO:BiJYSyg:BiJalka:BiJcvPq:BiJgqEY:BiJjzia: +BiJqySD:BiJroNh:BiJucGc:BiJxtwu:BiKIZqb:BiKRrwd:BiKSCTL:BiKSMon:BiKYlMN:BiKYsVU:BiKaOtx:BiKktbh:BiKtWxp:BiKtmNh:BiKvmxS:BiKxixj:BiLCuHz: +BiLEAzp:BiLKYQh:BiLLfAz:BiLNojk:BiLOZSn:BiLPSpY:BiLSdzm:BiLSprI:BiLVSDp:BiLWldX:BiLZqlN:BiLehkL:BiLgMks:BiLiOTA:BiLphOB:BiLstBQ:BiLyfGd: +BiLzWXI:BiLzmnQ:BiMEdjn:BiMINpK:BiMJLk:BiMQcjo:BiMbFwV:BiMcjWl:BiMdJKv:BiMjHAe:BiMvBTp:BiNCZrP:BiNDbHC:BiNFWx:BiNIXBY:BiNKdJw:BiNONPR: +BiNPVGP:BiNfXRy:BiNhFWO:BiOAqts:BiODCft:BiOFoEQ:BiOJkSo:BiOPETC:BiOQkNX:BiORDGY:BiOZIVD:BiOZxjt:BiOaLAA:BiOiPmf:BiOmgu:BiOnYhX:BiOsZAW: +BiOtPPp:BiOuJUr:BiOuVJy:BiOuVwF:BiOvXlH:BiOwXEq:BiOyvrM:BiOzami:BiPDuWq:BiPLCFM:BiPMIPT:BiPNoeh:BiPRksV:BiPVOSg:BiPWkna:BiPbiri:BiPckjP: +BiPkcMS:BiPmQob:BiPpsB:BiPvYHa:BiPyFOF:BiPytgw:BiQBiVJ:BiQIzQC:BiQJgeU:BiQLJFV:BiQORgd:BiQSnsZ:BiQcthb:BiQkkOx:BiQlyuO:BiQzWOM:BiRElXV: +BiRGhKY:BiRMTJK:BiRNEMI:BiROgEn:BiRULTQ:BiRWivq:BiRZPCH:BiRaYEL:BiRfTJz:BiRfUEm:BiRitHy:BiRkgkr:BiRqyUt:BiRtJtm:BiRwUZS:BiSAlDf:BiSDrwc: +BiSECTK:BiSEMoi:BiSFqLp:BiSPgjp:BiSUYqV:BiSWfad:BiSYZsP:BiSdfgz:BiSlGpR:BiSlrcQ:BiSrNbt:BiSwkek:BiSygYb:BiSypkj:BiTAXCy:BiTAwxg:BiTByJu: +BiTFkxN:BiTHSDy:BiTJImA:BiTKrWt:BiTLqlG:BiTQpCL:BiTRkPX:BiTSSpp:BiTUmD:BiTgtyY:BiTjGyR:BiTjODl:BiTlprs:BiTmmnx:BiTomXC:BiTrLov:BiTshOk: +BiTxMkZ:BiUBEtk:BiUCHuB:BiUTsNF:BiUYHwP:BiUYIkJ:BiUcPER:BiUlJwu:BiUneod:BiUqdjv:BiUulet:BiUyBTK:BiUyoZd:BiVAMDj:BiVNIKa:BiVSQLt:BiVUKpf: +BiVXZXV:BiVXjbi:BiVeKYk:BiVmJkF:BiVsHaU:BiVtnLS:BiVzLW:BiWAAOm:BiWAXab:BiWFwH:BiWGCfk:BiWJIpr:BiWOuwW:BiWOwVX:BiWRZaF:BiWXFxC:BiWZfGL: +BiWcTcv:BiWeZAh:BiWlTkC:BiWlvrR:BiWmIeR:BiWnFmc:BiWpCPq:BiWuhVi:BiWwAoE:BiWxqPx:BiXGAob:BiXGXAm:BiXIuDq:BiXJqTc:BiXKino:BiXUhC:BiXXCLv: +BiXYEtS:BiXhYHh:BiXiTCy:BiXjZHN:BiXkbPm:BiXlIMl:BiXrsob:BiXsaMy:BiXudwh:BiXvRFp:BiYBKbC:BiYKZkl:BiYRLts:BiYUPcj:BiYXlqC:BiYYEmk:BiYZTji: +BiYetWN:BiYjmSa:BiYlWOT:BiYnZWx:BiYnnYn:BiYoJTO:BiYpSR:BiYqVwX:BiYuLoi:BiYxTaG:BiYyIfx:BiZHKBJ:BiZKbOr:BiZVlsm:BiZflBl:BiZhwZv:BiZilDW: +BiZomsH:BiZsfwR:BiZtZwq:BiZtnyg:BiZwTJr:BiZxTJq:BiZxUEf:BiaDRgR:BiaEKyg:BiaItVC:BiaKtgv:BiaRzFM:BiaZoVo:BiacwzP:BiahHMW:BiahOWs:BiakcNO: +BialIfW:BiaqlKu:Biasvpe:BiawqeM:BiazzIu:BibFJQE:BibHCTk:BibKKBS:BibLivc:BibSTJy:BibXzfr:BibcCOE:BibeWoD:BibgZwh:BibhoNC:BibkwZo:BibpQsK: +Bibrudi:Bibscnp:BibsnXC:BibvyUf:BibylkJ:BicDRlC:BicIZpe:BicSuhv:BicarcC:Bicbybi:BiccoFs:BicdhuD:BicmitS:BicngYp:Bicnpkx:BicyOtM:BidEZSy: +BidGkPf:BidHRJl:BidHWSV:BidHXDa:BidIdzz:BidQLfE:BidRTlW:BidYuHm:BidZgJY:BidchhV:BidckEB:BidhyBr:BidvrCx:BieAGhf:BieCNQN:BieGJHb:BieGjfo: +BieJpRf:BieQPbw:BieTbhO:BieVNXL:BieYXbU:BiecmwX:BieoXAZ:BievXru:BiexFwC:BieyDh:BifCBu:BifHQLf:BifQcxr:BifRprQ:BifYZrk:BifZdE:BifhiIt: +BifoglB:BifpafO:BifsbHa:BifztTw:BigCmSi:BigFuVF:BigJBmI:BigKbfd:BigTuwe:BigTwVj:BigUZat:BigbSUt:BigdRIN:BigfviL:BighLMQ:BiglAow:BigskJD: +BihBFXZ:BihEoPu:BihEwtT:BihFGOs:BihImsb:BihLuvM:BihNEte:BihPBXy:BihQbFo:BihacML:Bihbqpa:BihhNnT:BihsUFP:BihvTKZ:BihvvRK:BihxFMz:BihzCph: +BiiCJFY:BiiDzFt:BiiLoVV:BiiMHhG:BiiOZHR:BiiQgUb:BiidysI:Biieone:BiihDfX:Biihlin:BiijAcF:BiijnoG:Biikqet:BiimzIl:BiivTjN:BiivUeY:BijAPCU: +BijCSyC:BijDEMt:BijErPl:BijRHHn:BijTMpv:BijUBNY:BijVguK:BijWICA:BijeIFG:BijgnpS:BijjIfX:BijjyFy:BijlarQ:BijnDFQ:BijnlIg:BijqHmG:BijqOwc: +Bijszie:BikBnaB:BikGRlz:BikHGmq:BikJzaC:BikQXce:BikRyji:BikVkXR:BikXSde:Bikckhq:Bikhhoc:BikhtQJ:BiknPVW:Bikoqya:BikwtYE:BikzGYN:BikzOdp: +BilHZQg:BilKRJG:BilKXDJ:BilTJT:BilVpCy:BilXlmK:BilXsvP:BilefyW:BilikHx:BiljtBm:BilkyBY:BilwiXo:BilzLCR:BimBNpG:BimCuw:BimFZRE:BimGbhV: +BimLXbL:BimQMdV:BimTSnZ:BimXYRB:BimbfWB:Bimftty:BimkFwZ:BimuKyW:BinDdJk:BinHNPN:BinKPGJ:BinLZrL:BinRXBE:BinUfm:BinZPBg:Binbgle:BinltTp: +BinpXRE:BinqFWS:Binrjwi:Binwfwk:BinzZNH:BioCCdF:BioCbe:BioGRsQ:BioMcdX:BioUzDH:BioWAOv:BioWXay:BioYude:BioZDU:BioZqtw:BiodFmx:BioeFyP: +BiofkJm:BiogNrh:BiojOtk:BiokImX:BiomryR:BionJUv:BionVwB:BioyTcm:BiozZhZ:BipCZhL:BipNsNK:BipPkne:BipUcDa:Bipeqpz:BipmFYi:BipoNRQ:BipqLmA: +BiprZaj:BipsIMa:BiptJuO:BiptVjD:BipurYk:BipvXeL:BiqAZHY:BiqBwbk:BiqHLtN:BiqNtVQ:BiqPTjT:BiqQBfp:BiqWCtF:BiqWHIs:BiqdYeS:Biqgysb:Biqhvpw: +BiqiaRs:BiqjUzL:BiqkDfs:BiqkliE:BiqlAua:BiqmAcm:Biqmnol:BiqngKm:Biqpnxn:BiqvlbX:BiqwlKG:BiqxwzB:BirAivU:BirDHHw:BirEovf:BirFZhb:BirGMpO: +BirHwBp:BirIICX:BirLlsB:BirMzfD:BirRnSE:BirWEMM:BireAfg:BirjYEH:BirmIfa:Biroarh:Birzkog:BisAcqd:BisDyjf:BisHJPR:BisJlDb:BisKSdJ:BisLIMR: +BisMrwg:BisOqLt:BisSoJQ:BisUSPc:BiscgYF:BiscpkN:BiseLOE:BismGYa:BisvoFE:BisyRxm:BitCzAS:BitKnAR:BitLyJY:BitPHYp:BitPkxb:BitTImm:BitUqlK: +BitZXCu:BitZwxk:BitaNBO:BitgPvG:BitkGPi:BitkrCj:BitlhOg:BitsfGA:BitvWXl:Bitvmnt:BitxmXO:BiuAxkS:BiuFQlc:BiuKEtw:BiuLJHp:BiuRHwL:BiuRIkV: +BiuSxJb:BiuUJja:BiuUQjb:BiuUVgN:BiunAcI:BiuqyMj:BiurBTW:BiuroZx:BiuwnlD:Biuzdjj:BivBNxe:BivFsGy:BivGxKH:BivNrHM:BivQJhK:BivQjFF:BivRHUE: +BivXHWW:BivXIKM:Bivdjwp:BivgzkQ:Bivifwr:BivrPeU:BivsACr:BivxBtL:Bivxozc:BiwAuYt:BiwBoEr:BiwPWlD:BiwQBtl:BiwUWeM:BiwWFZO:BiwYsnU:BiwcPmE: +BiwpPPS:BiwuiRS:BiwyNro:BixAZAM:BixIIPy:BixPAof:BixPXAi:BixSknL:BixTBMp:BixdZac:BixkPMr:Bixthvb:BixvAON:BixwJuf:BixwVWR:BixwVjm:BiyBrpW: +BiyVJqQ:BiyXHIJ:BiydnPh:BiygkOE:Biyioc:BiysCoQ:BiyuWOP:BiyvfYH:BiywnYj:BiyxonW:BiyyJTk:BizGlQN:BizITJd:BizTPCg:BizZZKa:BizdtwC:BizetHV: +Bizhudt:BiznJtB:BizpVWU:BiztLOd:BizuAUQ:Bizymsl:BjABXRS:BjADzxJ:BjAGQnw:BjAIgdu:BjAKZhG:BjARPjT:BjASNhF:BjATLDf:BjAXKQv:BjAXhpd:BjAYsma: +BjAeYkt:BjAiHfg:BjAiTXN:BjAnUvG:BjAtHfs:BjBFKih:BjBFtex:BjBHWqv:BjBHxJh:BjBJpZo:BjBNGCv:BjBYzXc:BjBZsya:BjBbmuo:BjBfBt:BjBfFpS:BjBsUVn: +BjBzHFz:BjCBmmR:BjCEpkj:BjCMxkH:BjCODcf:BjCSnyC:BjCcxHG:BjCnREM:BjCzpLa:BjDBju:BjDECqQ:BjDIvwG:BjDJXuJ:BjDKRVO:BjDKsGW:BjDLpNN:BjDPnqX: +BjDSxKA:BjDUDCo:BjDYnYJ:BjDasuS:BjDcGea:BjDgBAB:BjDtjbw:BjDzhhd:BjEIzhQ:BjEJUmi:BjEKYIK:BjELIGw:BjENIGX:BjEPOLY:BjEQiye:BjEVZMD:BjEXozV: +BjEefdt:BjEfcYF:BjEgKCa:BjEjtja:BjElTNf:BjElffW:BjEoCdb:BjEprrM:BjExnrA:BjEyyap:BjFBbDe:BjFDEVe:BjFGFnR:BjFGIia:BjFNrZT:BjFOSGw:BjFTcOu: +BjFTzuT:BjFVOlP:BjFZKzn:BjFguOw:BjFmrOa:BjFptJh:BjFypDg:BjGBzAU:BjGCWkg:BjGDjii:BjGFBuf:BjGJrnL:BjGQtcX:BjGRKiz:BjGjCWQ:BjGmTaj:BjGoGBa: +BjGqCGQ:BjGqNqb:BjGwRUg:BjGxLkt:BjHBHBa:BjHCpK:BjHEhAk:BjHIWKl:BjHJiJD:BjHLBUm:BjHWKIQ:BjHZGLV:BjHauSK:BjHbCNB:BjHfav:BjHkyLT:BjHrwtc: +BjHsTAa:BjIDPjS:BjIEKyG:BjIFsYo:BjIIcwN:BjIKLMn:BjIPmfA:BjISSuA:BjIUYcj:BjIYkwn:BjIaHAw:BjIaKlc:BjIbQpb:BjIhljx:BjIjrqa:BjIngPm:BjInomS: +BjItGPJ:BjItPbB:BjIvlFI:BjJArEn:BjJJSgX:BjJLsyX:BjJMKYp:BjJUidi:BjJVQeO:BjJnlJO:BjJtFNE:BjJwMgp:BjJwwQh:BjJxcrz:BjJyMQK:BjKEmmy:BjKFCtp: +BjKIDwy:BjKMJoy:BjKMjAt:BjKPGqH:BjKQArd:BjKTars:BjKUziZ:BjKWqeg:BjKXNtm:BjKXNw:BjKXkYU:BjKcZBn:BjKfhHf:BjKikpx:BjKkmrH:BjKoajM:BjKqjBU: +BjLABAb:BjLCnqa:BjLLvNQ:BjLMXus:BjLORAI:BjLYoh:BjLiZbu:BjLofvz:BjLsplQ:BjMAEvC:BjMJjVt:BjMKozy:BjMMUmF:BjMOIGX:BjMPmUI:BjMQcoS:BjMQzUr: +BjMRUPp:BjMSOLv:BjMYgUg:BjMknrn:BjMoTNI:BjMoffx:BjMsrrb:BjMvAdn:BjMvuib:BjMxcYI:BjNAuWb:BjNBrZm:BjNEdnA:BjNMKzw:BjNQafj:BjNQxHe:BjNWcOl: +BjNWzuM:BjNXmuv:BjNZiYu:BjNoETX:BjNqnRQ:BjNstJq:BjNuzho:BjNvpM:BjOAsPd:BjOCRyK:BjODtcq:BjOHJRU:BjOWjxM:BjOXFIa:BjObGBH:BjOeEUD:BjOeNYt: +BjOkulW:BjOnEtw:BjOplfQ:BjOvwFL:BjOwFPT:BjPEoR:BjPFBFZ:BjPFkc:BjPIbOL:BjPJUUy:BjPRSTy:BjPRkKB:BjPcdOO:BjPeNFP:BjPeaJQ:BjPiUmx:BjPlptx: +BjPrtCZ:BjPtETn:BjQESuH:BjQVZrN:BjQZUae:BjQayvY:BjQccRd:BjQfAf:BjQuIqL:BjRBjyN:BjRLzZH:BjRMPJC:BjRPDsK:BjRXyXN:BjRgFNb:BjRpTKw:BjRtmbU: +BjRxUVp:BjRytHe:BjRzHag:BjRzKLs:BjSDXZy:BjSDojF:BjSHgaI:BjSHioR:BjSKNtT:BjSKkYl:BjSNJKc:BjSSGqq:BjSUibK:BjSWarJ:BjSXpkX:BjSZnXa:BjSbXrF: +BjSeYDW:BjSjCiu:BjSjGSt:BjSkEfE:BjSmIuy:BjSrveP:BjSvxHu:BjSxzgw:BjTDJOI:BjTDjaD:BjTRXpb:BjTWSgn:BjTXCqc:BjThXRO:BjTidtS:BjTohhV:BjTqNEp: +BjTxReV:BjTzBAp:BjUBdNg:BjUFxIj:BjUJXcJ:BjUKfSR:BjUParn:BjUVQEM:BjUWgfK:BjUXgfk:BjUaTNp:BjUaffA:BjUdpYN:BjUfxev:BjUjAdW:BjUkfpJ:BjUqidB: +BjUsRpH:BjUynGl:BjVCjvd:BjVDafE:BjVDxHJ:BjVJCMk:BjVPwLy:BjVTSGa:BjVaETW:BjVcyAO:BjVflhV:BjVgBYj:BjVjTCk:BjVnwa:BjVouIr:BjVpiLz:BjWBpjM: +BjWCxxp:BjWEsgq:BjWGLPT:BjWHzbK:BjWLPim:BjWOkpo:BjWQEWs:BjWUedl:BjWfcfR:BjWiFPK:BjWlOgt:BjWnVyM:BjWrQle:BjWvCGg:BjWvNqT:BjXNzBD:BjXTrNU: +BjXdtCS:BjXeLMV:BjXghdp:BjXlMzi:BjXnCWX:BjXsWSW:BjXxhdP:BjYEOb:BjYEyxl:BjYGCxz:BjYIzzj:BjYLOVI:BjYLwzE:BjYLxmr:BjYMDSi:BjYNYvd:BjYSzym: +BjYUlOV:BjYVKIT:BjYVtED:BjYXWQJ:BjYXxjT:BjYYZrU:BjYZpzS:BjYethg:BjYgHAE:BjYgKlQ:BjYiGPX:BjYiPbP:BjYrmUS:BjYvFPo:BjZYzYf:BjZfHFy:BjZfTxP: +BjZpKAK:BjZqgYC:BjZrYKj:BjZsOop:BjZxmuX:BjaNPTP:BjaOrcV:BjaOwzl:BjaQreb:BjaSOUl:BjaZSGT:BjadmUZ:BjaesxU:BjaevST:BjahFPf:BjbAXrV:BjbCzXO: +BjbFQNr:BjbGcWl:BjbMKdg:BjbRNHC:BjbVGu:BjbXgDp:BjbZZHB:BjbdYKq:BjbeTKE:BjbjsXl:Bjbjvsm:Bjbkmuc:BjbsKAp:BjbxHFb:BjbxTxK:BjcPvUa:BjcQBan: +BjcSnQm:BjcZXCq:BjcgdTT:BjcmzgY:BjcyZBy:BjdDpKo:BjdGYuF:BjdHzE:BjdNDCc:BjdRnYF:BjdWBAW:BjdbxhB:Bjdipld:BjdmReH:BjeGBoe:BjeIIIL:BjeMXcx: +BjeNcmn:BjeQuwv:BjeRrzy:BjeTDih:BjeTKGT:BjeUdNU:BjedlDP:BjehRpz:Bjektbp:Bjepfpx:BjfEMza:BjfJYiF:BjfKzat:BjfMBOl:BjfPiYh:BjfScMG:BjfWrZP: +BjfZDIa:BjfaVsM:Bjfcngw:BjfmQyB:BjfnCDo:BjfpxEm:BjftfDy:BjfufPQ:BjfvKcl:BjgDHbN:BjgKbgS:BjgLijk:BjgMTwX:BjgMjim:BjgOBub:BjgPLZQ:BjgSLqa: +BjgVBfn:BjgYsPI:BjgZUuM:BjgaLBO:BjgewTl:BjgfTan:BjggQlw:BjgqYzj:BjguCnM:BjhAKIu:BjhESwS:BjhIrNC:BjhLUzS:BjhQzaZ:BjhRWKh:BjhUBUi:BjhVPIT: +BjhbptG:BjhlTAe:BjhtyLP:BjhvRuh:BjhwYZa:BjhxVYt:BjhzuSO:BjiCQnT:BjiDETa:BjiGZhd:BjiIovW:BjiLSGK:BjiMxjb:BjiNLDE:BjiONhe:BjiRjYZ:BjiRkwj: +Bjienkx:BjiwFnv:Bjiyyvt:BjjDKYL:BjjHcWE:BjjQCXc:BjjQFHG:BjjRSUJ:BjjTYCa:BjjXjyU:BjjXkWe:BjjZLme:BjjeKAy:BjjgYKX:BjjjmbN:BjjpKLh:BjjsGpA: +BjjsPBI:BjjulfB:BjkCvUz:BjkDBau:BjkFnQv:BjkHxrx:BjkPjcI:BjkPqcJ:BjkPvnf:BjkSjv:BjkydTo:BjlECTw:BjlHpNk:BjlIvuq:BjlNxRs:BjlPARc:BjlQXBP: +BjlQtWp:BjlbZbi:BjlcKWY:Bjlehha:Bjlfxn:BjlpjbR:BjltKWy:BjlzmRO:BjmAfSG:BjmDuwQ:BjmGbdo:BjmHIGT:BjmRZMg:BjmSjVx:BjmTaFY:BjmTxhV:BjmYMi: +BjmZCmw:BjmbcYe:BjmhByV:BjmiafQ:Bjmnpdm:BjmqEtK:BjmsyaS:Bjmutjb:BjmvlHJ:BjmwByv:BjmzTcw:BjnABOU:BjnJXSp:BjnJcEZ:BjnKrZi:BjnNIgc:BjnObDX: +BjnPcOh:BjnPzuI:BjnROlM:BjnZoZB:BjncuOj:BjndSfN:BjnnTnr:BjnnfFC:BjnqaFf:BjnrrRY:BjnznRU:BjoELqh:BjoGHbg:BjoLboQ:BjoMtcu:BjoOGlP:BjoPjOs: +BjoQJRQ:Bjoaylr:BjoiTaG:BjokGBL:BjosRUJ:Bjottcg:Bjowusm:BjpBbGc:BjpDWKs:BjpNNZF:BjpOUzh:BjpPspy:BjpRRYV:BjpYLza:BjpgyLk:BjpjuLJ:BjptEuY: +BjptNyi:BjpwKfD:BjqDjYS:BjqDkwc:BjqFLMc:BjqJmfl:BjqOSGb:BjqWETH:BjqbljU:BjqdrqL:BjqtTPk:BjqvHfm:BjqvTXD:BjrFPJG:BjrGpZU:BjrHLdu:BjrLKqe: +BjrLhPw:BjrMsMr:BjrOidJ:BjrRmFU:BjrUOci:BjrVWql:BjrVxJr:BjrbUVT:BjrjlJl:BjrlrQu:BjrpFNf:BjsAXUM:BjsBCtU:BjsCRaw:BjsHCci:BjsKSnC:BjsNibW: +BjsQRvh:BjsQsgp:BjsbzgK:BjsfmrM:BjsiGEF:BjsmBae:BjssCii:BjssGSh:BjstNee:BjtFXcZ:BjtGXuT:BjtInxd:BjtMCCP:BjtRGQt:BjtTiBN:BjtVaRO:BjtZNTQ: +BjtZkyi:BjtbRez:BjtdYdR:BjtnkJ:BjtnplV:BjtqvEU:Bjtuxhp:BjtwzGr:BjtyCIp:BjtyGsq:BjuAKZm:BjuFjVQ:BjuGUmc:BjuKcov:BjuKzUW:BjuLweE:BjuMOLS: +BjuNUPU:BjuTgUb:BjuUXsn:BjuUceD:BjueyaZ:Bjufnrk:BjuoSFP:BjusroB:BjvAdnb:BjvExio:BjvIKzT:BjvLjvh:BjvMoZe:BjvOUMZ:BjvScOO:BjvSzun:BjvUOlj: +BjvXcMY:BjvYwLu:BjvZfsW:BjvexEs:BjvlnRR:BjvmyAc:BjvpiDG:BjvqBYF:BjvrRPM:BjvwSfi:BjvyStQ:BjvyiLv:BjvzfPO:BjwBSWv:BjwHkps:BjwJEWo:BjwLxxl: +BjwNsgm:BjwPLPH:BjwSjxn:BjwiLme:Bjwjlfr:BjwoMZz:BjwpCwk:BjwtLBa:BjxAUza:BjxDTNu:BjxKPIf:BjxNkPd:BjxPEwx:BjxTsGz:BjxbqzW:BjxdUmu:BjxeCgl: +BjxkLbV:BjxmVYF:Bjxowtu:BjxqQLn:BjxucFY:BjyASGY:BjyCLDW:BjyGjYH:BjyGkwx:BjyNovE:BjyQXRb:BjyRZrQ:BjyVUaz:BjyWcwX:BjyXBva:BjyXaSp:BjyYWKk: +BjyeljN:BjygrqW:BjymUvv:BjyuTkq:BjzAidC:BjzHzZe:BjzIYCw:BjzLDsf:BjzMjyC:BjzMkWs:BjzSoVn:BjzTyXc:BjzVCXu:BjzVFHQ:BjzXZRZ:BjzagpP:BjzaoMn: +BjzcyVM:Bjzecrp:BjzhGpW:BjzonKA:BjzttHh:BjzvHaJ:BkABdqR:BkAJMyc:BkAOXwf:BkAWylr:BkAXCJi:BkAXrmJ:BkAYFvo:BkAYRoH:BkAaYHh:BkAaayG:BkAcyRg: +BkAdIxS:BkAgCJi:BkAlOIN:BkAlbGi:BkAnlKk:BkAqtuu:BkAwvky:BkBAVMk:BkBEKaf:BkBHdQY:BkBIYyo:BkBZiEp:BkBcOie:BkBcbgB:BkBiyrl:BkBkIXx:BkBnsG: +BkBpnYm:BkBsXPx:BkBvYhC:BkBvaYl:BkBzfZx:BkCCdKR:BkCCwFW:BkCGOIH:BkCHIOh:BkCMGrQ:BkCMnwC:BkCNfOA:BkCRaDD:BkCWNzf:BkCbouP:BkCdkBe:BkCiGmZ: +BkCjewK:BkClavL:BkCmFrn:BkDAHfN:BkDEVAy:BkDGXeK:BkDNIog:BkDPhfr:BkDTfoN:BkDXVoS:BkDXadK:BkDcMxd:BkDdCiC:BkDdgoe:BkDgiCY:BkDiGug:BkDmDVS: +BkDnzlt:BkDowFH:BkDpgRb:BkDsbJA:BkDwdbn:BkDxYfP:BkEBIJp:BkEBOfH:BkEGnuI:BkEKTPx:BkEMWFq:BkEMhlB:BkETRwv:BkEXEOm:BkEYIdE:BkEYkmr:BkEZjXk: +BkEaOxc:BkEcTwG:BkEdcBz:BkEkLiq:BkEvgQS:BkExOqN:BkFAfGG:BkFBiwP:BkFCFyj:BkFDVID:BkFGIjY:BkFGOFa:BkFHIjy:BkFHOFA:BkFRJOD:BkFTVXr:BkFWMWW: +BkFfAnL:BkFgOXj:BkGIbqW:BkGOFSH:BkGQMbS:BkGSVCJ:BkGUGgK:BkGbAei:BkGeMyv:BkGjrxy:BkGkZft:BkGmnmt:BkGrkzL:BkHAVGd:BkHAYio:BkHGeZr:BkHTYEN: +BkHUFsA:BkHXeZR:BkHadBc:BkHehqt:BkHjKHw:BkHkyvd:BkHnDKv:BkHoqKr:BkHprXp:BkHsyKS:BkHynCU:BkIGieR:BkINMwJ:BkIUxe:BkIVcaC:BkIceXJ:BkIdhZH: +BkIkhCT:BkIlgbE:BkImRQX:BkIvtRx:BkIxXdq:BkIxwyO:BkJDAfM:BkJNyLB:BkJOvok:BkJSMYS:BkJaJtg:BkJbvnj:BkJeXPc:BkJghfd:BkJnvKI:BkJqRwY:BkJtenY: +BkJwsDn:BkKAfOh:BkKEVOu:BkKEaDm:BkKHOIa:BkKKIOA:BkKMhFT:BkKParU:BkKQDwr:BkKlDfB:BkKnNmJ:BkKoave:BkKqYse:BkKrQmf:BkKtVQV:BkKtyUN:BkKwkBL: +BkLEyCT:BkLGfoQ:BkLKVoL:BkLKadT:BkLQIox:BkLShfm:BkLVyid:BkLbzlK:BkLcLKd:BkLecBt:BkLedQF:BkLfaLY:BkLfrXY:BkLidbQ:BkLkYfO:BkLpOTX:BkLpkma: +BkLrGMJ:BkLtLKD:BkLvNMs:BkLwgoz:BkLxsiN:BkLyiCf:BkMJibT:BkMJpKU:BkMLOMr:BkMUlHq:BkMXyCJ:BkMYLsu:BkMaPVZ:BkMcdva:BkMdZnL:BkMisKa:BkMjAhQ: +BkMmlLq:BkMsIKs:BkMtjEV:BkMuIdT:BkMuJfk:BkNBjQp:BkNByWh:BkNDhlg:BkNJimQ:BkNONaG:BkNPadd:BkNTvDM:BkNXqiw:BkNZRvQ:BkNiZNs:BkNmTrD:BkNnZgf: +BkNpAHN:BkNrUKE:BkNvDpL:BkNwqfC:BkNxqfc:BkNyjei:BkOEVCA:BkOEfK:BkOJCgT:BkONIbu:BkOXETD:BkOYZPg:BkOZnWC:BkObhQV:BkOctZJ:BkOeYsn:BkOevuV: +BkOfFvQ:BkOlacm:BkOpgVT:BkOrRBI:BkOzmhK:BkPDxc:BkPGYEW:BkPIFsx:BkPLGzi:BkPLOEN:BkPMVcz:BkPRntO:BkPRzKW:BkPTOcy:BkPWjDE:BkPaDKo:BkPcrXi: +BkPfyKJ:BkPhjaS:BkPhqOU:BkPkAEy:BkPmKHn:BkPnpNT:BkPrNxL:BkPxRbr:BkQBvHp:BkQHcaD:BkQMxUq:BkQQkPH:BkQcEDA:BkQkXdV:BkQkwyh:BkQnnyh:BkQogbb: +BkQqeNg:BkQwhZo:BkRBQxn:BkRCzMP:BkRGszV:BkRRxuF:BkRTVMY:BkRWQNr:BkRbhcd:BkRehOK:BkRfIew:BkRhqTR:BkRibyf:BkRjowA:BkRotrH:BkRqXDA:BkRugBu: +BkRvOiW:BkRvbgp:BkRwenp:BkRxlkr:BkRxsDG:BkSBycv:BkSHwFE:BkSSzhK:BkSTyMl:BkSuFBV:BkSzvlz:BkTAuIx:BkTIaRE:BkTMdkk:BkTMwfn:BkTNZlm:BkTQOiq: +BkTTDZw:BkTVNYQ:BkTVStJ:BkTWGRh:BkTWnWz:BkTbDVE:BkTegRt:BkThbJW:BkTjqYi:BkTkQMv:BkTliCO:BkTmVqF:BkTnGuq:BkTswdK:BkTuDFR:BkTwFRW:BkTxMxr: +BkUCqIQ:BkUERVw:BkUIvwq:BkUKaDB:BkUOhLA:BkUPTPN:BkUSHPx:BkUUiMw:BkUYbBM:BkUdqFe:BkUeIKj:BkUhqWK:BkUigQe:BkUpLiG:BkUqjVh:BkUsXmp:BkUxTwq: +BkVBLSE:BkVKUPO:BkVOvWx:BkVQiBd:BkVQpke:BkVSOmB:BkVUTpg:BkVWWfn:BkVbOQQ:BkVdUKJ:BkVfllA:BkVhDpC:BkVjBFQ:BkVkLWf:BkVrLr:BkWDJZY:BkWETGv: +BkWHTAA:BkWIGZK:BkWIOel:BkWJfAW:BkWMnWZ:BkWRBoB:BkWRnCo:BkWRtv:BkWTLhe:BkWWDhG:BkWdRBp:BkWkpnv:BkWlmhr:BkWmXNe:BkWqceo:BkWrfnS:BkWuUDq: +BkWuVUK:BkWxFvh:BkXDlgm:BkXEXDZ:BkXFVGv:BkXGIBe:BkXItlD:BkXJJzP:BkXNTaH:BkXRZpw:BkXXBOK:BkXXncf:BkXZGep:BkXbgTF:BkXfbiM:BkXgdBQ:BkXigvD: +BkXjUdX:BkXjVub:BkXoPri:BkXpadP:BkXrXnL:BkXvcEF:BkYCMwt:BkYDXs:BkYLvOL:BkYQVmw:BkYUKAz:BkYXdqE:BkYYYYs:BkYbNYA:BkYcIEY:BkYdsdI:BkYnSmk: +BkYsOIy:BkYthFC:BkYvtuB:BkYyyRp:BkZByPF:BkZDxuA:BkZFcgz:BkZIQNu:BkZPiEe:BkZRLGh:BkZYszQ:BkZkqTu:BkZlYhV:BkZlaYy:BkZmowf:BkZrXTN:BkZuhcC: +BkZwRqO:BkZxkQC:BkaFXwZ:BkaKdqn:BkaTAFA:BkahGTt:BkamIxo:BkanCJU:BkaqJTk:BkarvNf:BkauXpo:BkawhFh:BkbGCjn:BkbGrMM:BkbHzMN:BkbIMYd:BkbNXWa: +BkbQdQU:BkbdfZT:BkbkNyQ:BkbknOo:Bkbmlkl:BkbmsDY:BkbptUr:BkbvCjn:BkbydAM:BkcADzR:BkcCNyt:BkcCSTo:BkcCwJy:BkcORes:BkcPNzz:BkcUycX:BkcadEx: +BkcfbjR:BkcgsIb:BkchCIp:BkchgOV:BkckouL:BkcmkBy:BkcoOtt:BkcokMM:BkcrzLG:BkcsLkh:Bkcteww:Bkcucbx:BkcudqJ:BkcvalU:BkcvrxU:BkdBRWY:BkdFOiC: +BkdGjsc:BkdINYc:BkdIStx:BkdIwjn:BkdLGRZ:BkdLnWH:BkdNaRw:BkdRdkY:BkdVNZm:BkddvLc:Bkdgdeo:BkdhGMQ:BkdlFRe:BkdmCiG:Bkdmgoa:BkdnYSg:Bkdwyya: +BkdxzlP:BkeCIda:BkeCkmV:BkeGViI:BkeIgrv:BkeKIJt:BkeKOfL:BkeQnum:BkeRjqD:BkeThLS:BkeXHPj:BkeZiMe:BkeiANA:BkejIvz:BkeonGD:BkessWs:BkewjVZ: +BkexYt:BkeyPVq:BkeyhST:BkfAMWs:BkfFnUD:BkfJfUT:BkfKiwT:BkfMFyN:BkfOBod:BkfOfws:BkfQOFE:BkfWOLh:BkfXIDH:BkfZTpu:BkfbTWJ:Bkfccbw:BkfjyAU: +BkfoAnH:BkfpOXn:Bkfrqwp:BkfungM:Bkfyswz:BkgDIbZ:BkgJcab:BkgKvms:BkgMMfJ:BkgNGgO:BkgWYeC:BkgYFSl:Bkgddbn:BkgfZVN:BkgjsLp:BkglncX:BkgxSQI: +BkgxjAG:BkgxqoA:BkhBppp:BkhEEtB:BkhGvKb:BkhKOcD:BkhNFsE:BkhOTgi:BkhRVcG:BkhSGzT:BkhSOEs:BkhTGGF:BkhXbQZ:BkhbUNs:Bkheadf:BkhldMf:BkhqkZA: +BkhwDKr:BkhxqKv:BkhyrXt:BkhzZFy:BkiFMyF:BkiSzml:BkiTFvj:BkiTRoM:BkiWsZj:BkiXMwf:BkicSJF:BkihOIk:BkihbGL:BkikGTm:BkimhZD:Bkiofzv:BkitRWL: +Bkiuhow:BkixIEK:BkiybYZ:BkjCYyH:BkjViEW:BkjbeXx:BkjbexO:Bkjdyrk:BkjeLkt:BkjhCje:BkjiSjO:BkjmkQQ:BkjqGtd:BkjulN:BkjzhcQ:BkkDIOM:BkkFhFX: +BkkGulj:BkkIHjJ:BkkJfOd:BkkNVOy:BkkNaDa:BkkQuid:BkkYarY:BkkbqER:BkkbuSe:Bkkcwfb:BkkhalL:BkkhrxL:BkkmTo:BkkmYFZ:BkkrDvY:BkktwfB:Bkkugrh: +BkkxbjK:Bkkzqyu:BklDZlx:BklJIoD:BklLhfQ:BklMyiX:BklOHJC:BklPfom:BklTVop:BklTadh:BklWuIm:BklaQMc:BkldGud:BklkbIZ:BklmNMO:BklwusL:BkmGJoN: +BkmIWFR:BkmIhla:BkmMRwY:BkmPetQ:BkmRLsy:BkmSWb:BkmWtON:BkmhuaQ:BkmnIdX:BkmnJfg:BkmpZGU:BkmqTRw:BkmrOqm:BkmtUkv:BkmuIqW:BkmzBfm:BknAfwj: +BknFiiD:BknIOLq:BknMVDM:BknRZJG:BknTlhj:BknVeTF:BknWbbo:BknXLSn:BknbDkL:BkncOXW:BkneTWs:Bknhskz:BknmQha:Bknnilr:BknpPvA:Bknphsd:BknrdVz: +BkntIDO:BkntJFp:BkoIYeH:BkoJLhx:BkoTlGy:BkoUXdN:BkoVVgb:BkoVYIi:BkoWIbq:BkoYtLP:BkoZJZD:BkoaMyY:BkojgqV:BkonRWu:Bkooncs:BkopyVb:BkorgtR: +BkovbIY:BkowdbE:BkoygVP:BkozUDL:BkozVUv:BkpCeZo:BkpDcAR:BkpKbQC:BkpSMBG:BkpTeZO:BkpYxFE:Bkpahqi:BkpcDXC:BkpeFVn:BkpfKHj:Bkpgdnr:BkpgeJI: +BkpjDKk:BkpkqKo:BkplrXm:BkpxyvY:BkpyWix:BkqFzmC:BkqIAFW:BkqJkPL:BkqKrMB:BkqLvHT:BkqNUnI:BkqPdp:BkqYQnA:BkqcvkS:BkqgvNp:Bkqhgbf:BkqjeNc: +BkqtXdR:Bkqtwyl:BkrJyLg:BkrKQxb:BkrOIww:BkrOPYE:BkrPkpS:BkrSyAN:BkrbEdZ:BkrjRBW:BkrmJV:BkrmnYs:BkrngBy:BkrxtrD:BkrzXDM:BkrzwYs:BksATbP: +BksDReA:BksFRI:BksHsPV:BksJyIz:BksMXEj:BksOBhJ:BksWBWC:BksWxHU:BksZgoc:BkshDfe:BkskPxI:BkspVQq:BkspyUi:BktAyCq:BktCfot:BktGVoi:BktGadq: +BktOhfH:BktWZla:BktmzlN:BktsPXr:BkuCyCO:BkuDibq:BkuDpKp:BkuFOMW:BkuGjqj:BkuGywr:BkuHtOg:BkuHvdw:BkuNUpZ:BkuQlHT:BkuSetx:BkuULsP:BkuVIdO: +BkuVkmx:BkuXJog:BkuZmhj:BkubgQy:BkudOqd:BkukDPV:BkulBfd:BkumqFy:BkunQoE:BkunjEs:BkuuAhT:BkvDRWi:BkvDXKk:BkvHvWt:BkvJadG:BkvNvDn:BkvRqiT: +BkvTRvr:BkvWlhM:BkvXbbH:BkvYeTa:BkvollM:BkvtIko:BkvwIDh:BkvwJFW:BkwBMfX:BkwGnTI:BkwGzkQ:BkwLtLI:BkwPDhC:BkwUZPz:BkwaYss:BkwavuK:BkwbFvL: +BkweWIz:BkwispZ:BkwmjAU:BkwmqoS:Bkwumhv:Bkwzcek:BkxEMBL:BkxGVcU:BkxHGzF:BkxHOEa:BkxLvKp:BkxLxFn:BkxMlgi:BkxPOcV:BkxSLHh:BkxVDHJ:BkxWMFq: +BkxZEtP:BkxbyKe:BkxgYSz:BkxgvUB:BkxkgTB:BkxobiI:BkxsgQF:BkxtVuF:BkxwRwe:BkyGxUL:BkyKYPH:BkyUvOH:BkyWCJz:BkyWrmY:BkyXzmZ:BkyYMyp:BkyjnyU: +BkypayT:BkywSmo:BkzBMWy:BkzCKaW:BkzJcAp:BkzKyPB:BkzPVMz:BkzQYpA:BkzTKaw:BkzUUNy:BkzYiEa:BkzaNyL:BkzanOr:BkzbIeT:Bkzclkq:BkzcsDD:BkzrOit: +BkzrbgS:BkzyfZi:BlAIYje:BlAJhcN:BlAOAMe:BlAUiFI:BlAZvhW:BlAcKDp:BlAglbU:BlAindb:BlAsQLV:BlAsUZa:BlAuZEZ:BlAwGrM:BlAyAeH:BlAyRqH:BlBCpIG: +BlBHnSN:BlBQFfi:BlBUAml:BlBUvft:BlBapQo:BlBkYpB:BlBnAEa:BlBnRQa:BlBxkp:BlBzWmZ:BlCAKbC:BlCEXuZ:BlCFSWr:BlCLhYI:BlCTAMs:BlCaIFb:BlCdSBI: +BlCiUhU:BlClHZW:BlCpjoC:BlCwLEy:BlCxLEY:BlDBbfa:BlDDicx:BlDLKDZ:BlDLiMm:BlDNjFE:BlDPMAH:BlDZIKS:BlDZPbR:BlDcdbP:BlDdoQK:BlDexvt:BlDgIfm: +BlDoIen:BlDqHzx:BlDrdIr:BlDtzGK:BlDySbf:BlDzaAV:BlEJnRa:BlEJylD:BlELlVr:BlEMChe:BlEULNu:BlEUWwA:BlEWvnn:BlEXxPv:BlEYbrl:BlEZJmV:BlEhzoW: +BlEiXRI:BlEjNdW:BlEkBvp:BlEmTSB:BlEoyzf:BlErCRg:BlErmpU:BlEzDdH:BlFEmOf:BlFOnrJ:BlFOyLo:BlFUvjB:BlFZcNW:BlFaGXQ:BlFlQBS:BlFoXrB:BlFpYBr: +BlFrHxU:BlFsTsI:BlFuyZm:BlGFqQq:BlGGZdO:BlGJqgM:BlGaHSg:BlGbFsu:BlGiHfT:BlGlEZd:BlGmBPy:BlGqgG:BlGyGkj:BlHBRdY:BlHKYEc:BlHMccX:BlHOvDq: +BlHRVao:BlHSlvj:BlHeEQe:BlHeEqR:BlHkrKS:BlIBtkT:BlIJJED:BlIPDBx:BlIUrlE:BlIYSYR:BlIeUZj:BlIfWMX:BlIiAQd:BlIiztk:BlIlyzF:BlInqde:BlIqvXu: +BlIvbTP:BlIydoa:BlJBRUM:BlJDFfp:BlJHAmu:BlJHvfm:BlJICTR:BlJKnSW:BlJNKWm:BlJRYJu:BlJTdrk:BlJXDbC:BlJXWoF:BlJhyon:BlJngDK:BlKBLAP:BlKDpId: +BlKFlzT:BlKITFc:BlKIVms:BlKTYJK:BlKUIku:BlKUPBt:BlKWoDS:BlKXJxn:BlKYjfc:BlKaCKT:BlKfaaP:BlKnFm:BlKoJLw:BlKoqfA:BlKpiBR:BlKuAVh:BlKzwWf: +BlLAHEU:BlLAwof:BlLBhkA:BlLBnkF:BlLExBo:BlLFkUz:BlLHLaI:BlLLlZM:BlLOTfz:BlLOVMj:BlLbIeQ:BlLlaAI:BlLmiXc:BlLnuBB:BlLtQod:BlLuibk:BlLyGxd: +BlMERTv:BlMEVbE:BlMHWwh:BlMIoJc:BlMLbrE:BlMMtNN:BlMNjSa:BlMQgSs:BlMQolT:BlMRtHy:BlMTFHo:BlMVzYF:BlMaNjV:BlMnrKH:BlMnuiO:BlMsPgN:BlMvMaJ: +BlNDdwM:BlNDglx:BlNMRtO:BlNMXOb:BlNQojZ:BlNTjsX:BlNUtnw:BlNYgsJ:BlNYoLm:BlNZFhV:BlNbXrY:BlNcYBi:BlNdJhP:BlNdQFV:BlNhuGm:BlNiNJo:BlNkGwF: +BlNtrkq:BlNtuIv:BlNzaRR:BlOMKYI:BlOQous:BlOQugL:BlOTIlt:BlOVqTu:BlOYZdF:BlOoEZM:BlOtbIb:BlOxHJr:BlOzDhE:BlPACnR:BlPByyM:BlPCpPf:BlPDVah: +BlPFoUJ:BlPFuGu:BlPGYHm:BlPPmPu:BlPQMWu:BlParxG:BlPbJvX:BlPsilX:BlPtSMH:BlQCbaW:BlQKXAH:BlQLhOR:BlQOZaJ:BlQPZaj:BlQaIje:BlQdvXl:BlQiWot: +BlQpKTA:BlQqSPw:BlQrfKw:BlQwRuF:BlRBjUd:BlRRrgo:BlRSJeT:BlRUZAC:BlRcAEs:BlRcRQs:BlRebPW:BlRfxvM:BlRgqDu:BlRoWmH:BlRrQRr:BlRsnDY:BlRvKtH: +BlSEoUO:BlSFovb:BlSGeFX:BlSHyuz:BlSNMaU:BlSQkuX:BlSRxbM:BlSUBKN:BlSaJLl:BlSaqfZ:BlSeGXf:BlSnUhg:BlSoxds:BlSvNNU:BlTHuYn:BlTKouD:BlTMefS: +BlTOJqU:BlTPSwk:BlTRvMG:BlTSvQE:BlTVhyP:BlTcdyb:BlTfOWc:BlTjCkd:BlTjHG:BlTkznH:BlTnSbP:BlTopIs:BlTsUHL:BlTudID:BlTvHzN:BlTwLq:BlUAdWk: +BlUIzYY:BlUONJH:BlUObfe:BlUUtHf:BlUWFHp:BlUZxmt:BlUjUKD:BlUmClh:BlVALnL:BlVAWWx:BlVDTee:BlVEbRU:BlVFFqw:BlVHdAo:BlVOzyV:BlVUNjG:BlVUbFj: +BlVVlvK:BlVWjsq:BlVgGXc:BlVidQm:BlVjWQ:BlVoMAZ:BlVpUkK:BlVwrkX:BlVxKSv:BlWHYeF:BlWIVFo:BlWIouD:BlWMmpW:BlWOaOi:BlWSkSj:BlWTyPP:BlWUDxf: +BlWcsiY:BlWhrkv:BlWiVbm:BlWksdH:BlWnKxI:BlWonPb:BlWuHUI:BlWvlBl:BlWwiqg:BlWzsCW:BlXAqdn:BlXCoit:BlXDSsp:BlXGVaA:BlXMILD:BlXNlNi:BlXPZDv: +BlXbNPy:BlXeJvq:BlXisIR:BlXlFSl:BlXmbiR:BlXzQtQ:BlYAYDJ:BlYKQuP:BlYKdsZ:BlYNSYL:BlYdSPP:BlYeKVf:BlYkDLp:BlYoSiQ:BlYpCkP:BlYpDxb:BlYqpqS: +BlYqxVc:BlYrbpy:BlYxKKQ:BlZBJzK:BlZDrgv:BlZFGFn:BlZQQUG:BlZQdSM:BlZSWcf:BlZSnPk:BlZaYpi:BlZbbty:BlZfmqh:BlZkKvq:BlZqDlg:BlZuSIF:BlZvBCM: +BlZxGfI:BlaBUeR:BlaHzEi:BlaNiFU:BlaRRuA:BlaXAMy:BlaXvFa:BlaaFg:BlacyzQ:BladGFW:BlaeOGi:BlafSRi:BlanZEF:BlaxyOb:BlbDKWx:BlbEWca:BlbEnPl: +BlbIvHR:BlbJMUH:BlbTifL:BlbUjUZ:BlbVHoY:BlbWUEk:BlbXRUX:BlbYhCK:BlbZFfe:BlbbKdu:BlbflBP:BlbhnDg:BlbkIJr:BlbrQlS:BlbrUzd:BlbsWOc:BlbvGRH: +BlbxAEM:BlbxFz:BlbxRQM:BlcDbFr:BlcQHeY:BlcQwOj:BlcRhKM:BlcRnKJ:BlcUxbc:BlcVkuv:BlcXLAE:BlcZpIq:BlcfdBc:BlcmTTh:BlcpqAn:BldDXUQ:BldESwy: +BldFFNB:BldGTl:BldMoOD:BldWjFA:BldYHEn:BldcSbB:BldldbT:BldnjVu:BleAvnJ:BleFmkT:BleHeGo:BleNBxP:BlePXwy:BleTdWY:BleTgLl:BleUfZo:BleaDkM: +BleaXiB:BledBvt:BleeHXZ:BlefTSF:Blehyzb:BlerXRM:BletJHD:BletQfB:BletsXJ:Blexugy:BlfDZBK:BlfFoje:BlfIJMY:BlfLCHj:BlfOPyQ:BlfYnrn:BlfYyLK: +BlfaaRm:Blfenqp:BlfiDDG:BlflTsM:BlfnyZi:BlfqCrh:BlfqmPZ:BlfxXrF:BlfyNDX:BlfzGXU:BlgFlVy:BlgNYep:BlgOqQu:BlgQCNf:BlgSppR:BlgTqgi:BlgWYhY: +BlgaDhH:BlgbVGX:BlgqrXs:BlgrGkn:BlgtEGk:BlhARFf:BlhExon:BlhVZDD:BlhYaoP:BlhZKyK:BlhbQOS:BlhcccD:BlhescN:BlhlBpr:BlhpHsl:BlhsVBT:BlhwVgw: +BlhxGKa:BlhzEgd:BliANru:BliKtkX:BliLCte:BliRjux:BliXxLB:BlialRe:BlibAQh:Blibztg:BlisAeo:BlisRqo:BliubpK:Blivpqa:BlivxVQ:Bliwqdi:BljIJeC: +BljLhCb:BljQtKS:BljTrLB:BljXSyU:BljdQlZ:BljdUzm:BljgdOF:BljhAqc:BljhzTl:BljnDkl:BljwAqC:BljwzTL:BljxdOf:BlkBtYz:BlkDwOs:BlkNAMV:BlkOnHu: +BlkXfN:BlkXuyR:BlkizgA:Blkppio:Blkpuga:BlkwQOq:Blkyqfm:BlkzCKX:BllCKBo:BllGXUv:BllKnkZ:BllNzCX:BllOIdJ:BllSYjN:BllTIKp:BllTPbq:BllVodV: +BllWJXk:BllWQvX:BllXTff:BllXVMv:BllaxvW:BllcIfN:Blliwwc:BllkIeM:BllrGxx:BlltAvm:BlltoXe:BlmCXwP:BlmFlay:BlmHRRy:BlmHVdY:BlmKeGF:BlmOcnQ: +BlmQLNX:BlmQWwl:BlmTTEq:BlmUbrA:BlmVFQc:Blmbzoz:BlmdNdz:BlmeXRd:BlmiTSo:BlmkyzK:BlmqAjh:BlmwGxw:Blmydqy:BlnIXWi:BlnOCHq:BlnRmOY:BlnWZBP: +BlnhQBL:BlnjzOC:BlnlNDC:BlnmBVd:BlnoTsV:BlnqyZr:BloArfc:BloCvdK:BloFKYM:BloGkHF:BloIkSU:BloMChA:BloQqDZ:BloTvdk:BloWVAu:BloXlVp:Bloasdw: +BlobHJV:BloeNfc:BlofiLE:BlohEZI:BlouJVE:BlovBNB:BloxOVb:BloxSmu:Bloysif:BlpEqth:BlpHErm:BlpLKyT:BlpPoUn:BlpPuGQ:BlpYoiY:BlpfrKP:BlpgHjo: +BlpnEzP:BlpzNPT:BlqDSYW:BlqFJEa:BlqGvhY:BlqRJZG:BlqTrGz:BlqVGfb:BlqaZEt:BlqcGrc:BlqeAef:BlqeRqf:Blqhyzc:BlqpRuz:BlqqYPe:BlqrbTu:BlqvmQd: +BlrDtKH:BlrJNRe:BlrJXaM:BlrQxlR:BlrRbAR:BlrXrq:BlrbyoI:BlrgQlA:BlrgUzv:BlrhWOq:BlrkAqx:BlrkzTw:BlroQPf:BlrvRUC:BlsBJQB:BlsKuyy:BlsQIkR: +BlsQPBS:BlsSoDt:BlsTjfd:BlsUtYQ:BlsVvqR:BlsWHek:BlsWwOX:BlshOwT:BlsjiBu:BlsspiD:BlssugJ:BltAxBJ:BltDouH:BltEoVe:BltHJqY:BltKVMO:BltTBkI: +BltWIKI:BltWPbH:BltdGxa:BltivTZ:BltmdyN:BltoEWG:BltpJlk:Bltuznd:BltwAvT:BltyuGQ:BltzqaG:BluARTU:BluAVbf:BluAXox:BluItNm:BluPFoL:BluZEsr: +BlugDdB:BlumugW:BluoCRm:BlusUKx:BluwFgh:BluynTr:BlvACHx:BlvKvNs:BlvNJMK:BlvOlAi:BlvPjsu:BlvTthm:BlvXzyR:BlvaSej:BlvcNJB:BlveGwk:BlvkDKt: +BlvoHxc:BlvwxgI:BlvyUkO:BlwBYyh:BlwFCNT:BlwGyYK:BlwIVAn:BlwKouL:BlwKugs:BlwPIlK:BlwRlnF:BlwSERO:BlwlApW:BlwlIUE:BlwlyAx:Blwqrkr:BlwxKxm: +BlxGYYC:BlxHYYc:BlxJqdj:BlxKMWX:BlxLmPX:BlxNaof:BlxRkse:BlxWlNm:BlxXoUK:BlxZrFS:BlxbsIV:Blxmilu:BlxnNFS:Blxnnpm:BlxxVBb:BlxzsDG:BlyDJZx: +BlyFhOq:BlyGNrC:BlyGXAk:BlyJYDN:BlyTKwL:BlyWrGe:BlyXYjT:BlyZdRJ:BlydDLt:BlyhSiU:BlynKVb:BlyqVex:BlyrKDA:BlysRue:Blytgdj:BlyubTj:Blyvlbd: +BlyxndS:BlzDDbm:BlzDWoh:BlzIrLP:BlzJdSQ:BlzMSyG:BlzOJeq:BlzPYdA:BlzabPr:BlznSIZ:BlztKvm:BlzwVEw:BlzzYpu:BmAAvvS:BmADJCM:BmAFJLb:BmAUXAn: +BmAXMtc:BmAXuSt:BmAYQMJ:BmAYyiw:BmAdmTJ:BmAejiR:BmAgnWM:BmAlRkx:BmAoiXT:BmAvTtZ:BmAvvao:BmAyKTc:BmAyZCj:BmBAKDy:BmBIpOK:BmBKqtB:BmBMWIE: +BmBQCaO:BmBQReP:BmBSxlx:BmBUAtp:BmBgoTL:BmBhgqy:BmBmarS:BmBmtfX:BmBsNXk:BmBtqnC:BmBysKH:BmCEIhv:BmCPskO:BmCQXTv:BmCaVmI:BmCeTyY:BmCgGGA: +BmCjMSE:BmCkGhz:BmCqtFc:BmCrAbR:BmCvRJV:BmDEHJV:BmDGqMi:BmDHqMI:BmDUBrt:BmDXTdt:BmDcydq:BmDdDGj:BmDebfb:BmDrsAW:BmDsIUk:BmDwZhw:BmDzrfq: +BmEBVpC:BmEBjWs:BmEDoyK:BmEEbHZ:BmEJek:BmEKyNS:BmEdWVF:BmEgcrV:BmEgeGN:BmEjDgQ:BmEkQSF:BmEkyDJ:BmEmbFY:BmExsvy:BmFCAay:BmFENqS:BmFJVP: +BmFUcjo:BmFaODM:BmFbJBG:BmFgRIX:BmFinuA:BmFpiHt:BmFqYEX:BmGCbTF:BmGDFJA:BmGMglK:BmGNmGX:BmGQNkz:BmGVVNW:BmGZxsH:BmGiCZc:BmGjSIT:BmGjawY: +BmGqWDL:BmGvihc:BmGwUdR:BmHAJBu:BmHASFx:BmHAiYx:BmHBXaL:BmHFsrz:BmHIPRr:BmHNnxB:BmHPASq:BmHVVmC:BmHWAWf:BmHbMDq:BmHeKta:BmHeZch:BmHhaaT: +BmHpbmX:BmIGSfs:BmIGiys:BmIJYWq:BmILQMc:BmINpvn:BmIOPry:BmIRruL:BmIUAsZ:BmIUFjT:BmIaVNe:BmIgMdZ:BmIhMdz:BmInefS:BmInfdF:BmIqKHJ:BmIqtWg: +BmIqwwy:BmIritq:BmIynWD:BmJCZfp:BmJDAzC:BmJFRgB:BmJHZSn:BmJMXnQ:BmJQoUO:BmJVlZS:BmJqgFr:BmJqzTP:BmJyUOD:BmKDXTY:BmKEpcc:BmKErLV:BmKFigc: +BmKNSZR:BmKNZsg:BmKSXNX:BmKWouF:BmKZgIt:BmKcEoW:BmKcenz:BmKeiBl:BmKgTbO:BmKgfZR:BmKiglx:BmKmWCE:BmKrskx:BmKzmX:BmLDSIz:BmLMVvu:BmLOdNE: +BmLaWvd:BmLfstN:BmLgDGs:BmLomFc:BmLtvHh:BmLusKm:BmLyIiq:BmLyfXy:BmLypSK:BmMAqmY:BmMDjhv:BmMFpQd:BmMJMYH:BmMQTDd:BmMRPhB:BmMUphj:BmMZPFL: +BmMZRty:BmMgWVm:BmMheGe:BmMjrDX:BmMlAuI:BmMmDgz:BmMrche:BmMsrFa:BmMtGPW:BmMydbg:BmMzTsa:BmNBley:BmNCaJP:BmNFxSF:BmNIwoy:BmNJXZF:BmNTVFY: +BmNZLRW:BmNbvvx:BmNrXZt:BmNsiHM:BmNuRte:BmNxRIa:BmOHVNP:BmOLxsO:BmONDhV:BmONwOP:BmOXajy:BmOZAIB:BmOfeoI:BmOgkrn:BmOrAjY:BmOvbup:BmOxUdu: +BmOyihD:BmOzTqT:BmPCOtb:BmPLTPV:BmPMowQ:BmPPizs:BmPUgta:BmPVpSt:BmPWIxC:BmPXSPD:BmPXYoK:BmPbWjB:BmPhSfS:BmPkJaV:BmPmdOv:BmPmmpX:BmPoAjz: +BmPpYDM:BmPpYdp:BmPrvKe:BmPsAKu:BmPsXLQ:BmPsqTI:BmPuoUK:BmQDKrU:BmQDqw:BmQXtpL:BmQcIUV:BmQdiXf:BmQjKyi:BmQoIso:BmQrOrP:BmQvYDi:BmQvYdT: +BmQyAkl:BmQyXlH:BmQyqtP:BmRAKBe:BmRDoUd:BmRHxlJ:BmRITdD:BmRLYLS:BmRPqtp:BmRQiGA:BmRRpCA:BmRRrlt:BmRVKpi:BmRbetK:BmRhNXY:BmRhqZO:BmRrara: +BmRrtfj:BmSAATY:BmSFXNA:BmSTxpD:BmSdskA:BmSjaED:BmSlZXJ:BmSpxcf:BmSrgQP:BmSvtFu:BmTDcdz:BmTEUZx:BmTHEzJ:BmTJhIc:BmTMqF:BmTOsbE:BmTUhpQ: +BmTZkvM:BmTfTSg:BmTiYQy:BmTjibs:BmToNOz:BmTwvHG:BmTxstA:BmTycVA:BmUEgkh:BmUFdnu:BmUIPjD:BmUJcDe:BmULtcc:BmUMuOG:BmUNEZU:BmUQGuI:BmUbOYN: +BmUilvN:BmUjqpa:BmUlTsx:BmUmsvK:BmUpIIA:BmUpfxI:BmVJgLn:BmVKbsO:BmVPbtc:BmVSLKW:BmVUtBb:BmVceOk:BmVdUDw:BmVevvS:BmVfWCQ:BmVgCzf:BmVjZaj: +BmVoFvy:BmVoWdI:BmVsbUR:BmVvXdw:BmVvnYz:BmVwAKO:BmVwdvO:BmVwoiA:BmWBDho:BmWBwOi:BmWDXzv:BmWFNkd:BmWKVNI:BmWRJDX:BmWTntq:BmWqRiq:BmWsnUh: +BmXCtPr:BmXGhjT:BmXGvXj:BmXHhjt:BmXHvXJ:BmXIIxD:BmXPbES:BmXTJcA:BmXVJln:BmXfAKR:BmXfXLv:BmXfqTn:BmXhoUl:BmXiwjD:BmXmORn:BmXpWwv:BmXtmtF: +BmXuKYW:BmXwnwA:BmYMhJC:BmYivkU:BmYknul:BmYlAkE:BmYlXla:BmYlqty:BmYowJS:BmYtJAf:BmYvdoF:BmYvmPh:BmZAoGW:BmZDBvq:BmZPQcJ:BmZSHls:BmZUUPu: +BmZVBVH:BmZYKDR:BmZiZxh:BmZjdXw:BmZyGgu:BmZzMsq:BmaAGdz:BmaBSpS:BmaKAsO:BmaKFjA:BmaOdkk:BmaSMmc:BmaWoWF:BmadIsA:Bmahitd:BmajIDh:BmakbMf: +BmalWJU:BmaqXHk:BmarSFD:BmasaAj:BmayAJm:BmbCQcm:BmbEHlt:BmbHBVO:BmbIIHE:BmbTXte:BmbWBvV:BmbdVMZ:BmbmdXP:BmbnxCc:BmcIQCz:BmcJHLC:BmcNIhr: +BmcPCAT:BmcPREK:BmcRxLc:BmcTATk:BmcWXZI:BmcXpoP:BmcYskK:BmcZqTY:BmccBH:BmcfotW:BmcggQb:Bmcgjg:BmcrNxp:Bmcrqzf:BmcsdxG:BmdBVvH:BmdEklv: +BmdGPJI:BmdKSIG:BmdNHJR:BmdQqMM:BmdTjHb:BmdVpqp:BmdWoYt:BmdfGGE:BmdksKp:BmdloxE:BmdwWvy:BmdxcRi:Bmdxegq:BmdzrdL:BmeAPFC:BmeARtv:BmeFkVd: +BmeJdWH:BmeOUzQ:BmehZHH:BmeirFN:Bmeqsah:BmfAawz:BmfHLKA:BmfKVFD:BmfMEcG:BmfPbsY:BmfToaC:BmfZleD:BmfdFvo:BmfhbUD:BmfiHGC:BmfiXKD:BmfkJBC: +BmfkRtX:BmflCzp:Bmfodtz:BmftZpt:BmfttVL:BmfwkRZ:BmfzvvE:BmgCah:BmgGaWe:BmgIBaS:BmgRAAb:BmgTNQH:BmgUbSf:BmgaGhM:BmgoJqf:BmgpYeC:BmgsSIX: +BmgsawU:BmgvRiC:BmgxnUZ:BmhBPRN:BmhIXap:BmhJJBI:BmhJSFD:BmhJiYD:BmhMsrF:BmhTKRY:BmhaJaC:BmhcixJ:BmhgTAz:BmhiTTd:BmhivAQ:BmhkINr:Bmhlayi: +BmhnZcT:BmhsIuZ:Bmhtixj:BmhwWjw:BmhzKYe:BmhzjIl:BmiEVMD:BmiHPru:BmiMnXE:BmiPJbr:BmiQXAK:BmiVAwa:BmiWtMf:BmibeoY:BmicnWh:BmikiXq:BmioTaA: +BmiqMdv:BmisaYr:BmitKTf:BmitZCo:Bmiyhtl:BmjBYLd:BmjHLVj:BmjHpCv:BmjHrlC:BmjMgia:BmjQAtU:BmjVXnM:BmjYKBR:BmjZoUS:BmjcoTi:BmjfEOB:BmjfeNo: +BmjhWBW:BmjiibY:BmjjTBZ:BmjjfzG:BmjoZOJ:BmjqWcp:BmjtsKM:BmjzaeH:BmkBZFu:BmkCKdE:BmkIXZN:BmkJxpQ:BmkMIAj:BmkNBVf:BmkOigo:BmkUlzV:BmkaTyz: +BmkcGGb:BmkxUoA:BmlBHJk:BmlCic:BmlIoYM:BmlJpqI:BmlQBri:BmlTTdi:BmlUQZO:BmlVkKf:BmlXpHg:BmlYPJp:BmlnsAJ:BmloMyY:BmlpydL:BmlsZhj:Bmlvrfl: +BmlylVz:BmmFTE:BmmGHjB:BmmHHjb:BmmMjhr:BmmQfFH:BmmesTC:BmmgbFv:BmmiYVc:BmmqoTI:BmmrCJP:BmnCnTE:BmnDLRs:BmnFetl:BmnIFjK:BmnOxSB:BmnPxSb: +BmnTXZb:BmnVNKp:BmnaCtJ:BmneAJT:BmnliHI:BmoDAIf:BmoHJDE:BmoILrZ:BmoKXFx:BmoKaS:BmoOCLB:BmoOFLT:BmoUxsK:BmoWDhR:BmoWwOT:BmoXDhr:BmoXwOt: +BmoYXzK:BmoaAwS:BmoaJqi:BmojtN:BmokDrR:BmoqXzy:BmpEPRW:BmpSAWC:BmpSTq:BmpehTn:BmpfVnk:Bmpjmtm:BmpsfDH:BmpuWOi:BmqCJbY:BmqCSfT:BmqCiyT: +BmqDYWV:BmqFQMD:BmqFyiy:BmqLoWT:BmqROTg:BmqTdky:BmqaTaJ:BmqbTtt:BmqbvaA:BmqeaYy:BmqgKTM:BmqgZCD:BmqjJAS:Bmqldos:BmqsXuD:BmquJYt:BmquynS: +BmqvXHy:BmrBZSI:BmrIXnv:BmrMoUh:BmrNCaQ:BmrNReN:BmrRiZP:BmrVpOU:BmrgsKv:Bmrhonu:BmrlaeS:BmrngLv:BmrpMsd:BmrxABs:BmrxsD:BmsALvZ:BmsApcF: +BmsArLs:BmsGxLM:BmsHTDC:BmsKYlT:BmsPKbb:BmsSouc:BmsaaRf:BmsatFm:BmscTbj:BmscfZw:BmsqeTL:BmtDBrN:BmtELYB:BmtGPHH:BmtJklh:BmtLsFO:BmtOMyB: +BmtQynr:BmtShIo:BmtTGUZ:BmtXsbI:Bmtbstm:BmtfZhM:Bmtgetk:BmtmcRw:Bmtmego:BmtnzKK:BmtoHwo:BmtpTSK:BmtqAUC:BmtrcVM:BmtsIiR:BmtsfXZ:BmtspSh: +BmtvCWL:BmuDUzc:BmuIkVV:BmuMdWz:BmuThPJ:BmuYhix:Bmucspt:BmuhYqb:BmukOYJ:BmutqpE:BmuwaiY:BmuxcvZ:BmuyiBh:BmvAcjY:BmvBZbX:BmvDDHp:BmvDwov: +BmvMVnV:BmvOAiD:BmvPVFv:BmvREcu:BmvSgLj:BmvlkRh:BmvmWvJ:BmvnYEN:BmvoWCU:BmvsZan:BmvtdtH:BmvvnuW:BmwIxsr:BmwKDhk:BmwKwOm:BmwRLkh:BmwUVNm: +BmwZbSp:BmwbeoT:BmwdvVl:BmwnFVF:BmwnWDv:Bmwrbum:BmwuihY:BmwvCZY:BmxECvV:BmxJizP:BmxMtPV:BmxQhjp:BmxQvXN:BmxRSPg:BmxRYoh:BmxidOU:BmxjYDn: +BmxjYdS:BmxlvKF:BmxoAKV:BmxoXLr:BmxoqTj:BmxqoUh:BmxtISu:Bmxvbx:BmxxiTP:BmyBJCz:BmyEJLu:BmyOruR:BmyPvvD:BmyRtpi:BmyVhJO:BmyVvxq:BmyZCVi: +BmylOru:BmyoWWm:BmyuAkI:BmyuXlm:Bmyuqtu:Bmywouw:BmzESzU:BmzHoGk:BmzLiGD:BmzPKDn:BmzYQcv:BmzZHlO:BmzaFjw:BmzaRKQ:BmzcqnT:BmzpGgI:Bmzwgqn: +BnACkYC:BnADcHw:BnADrLh:BnAHIsv:BnAKXyU:BnALPfs:BnASzOq:BnATaSB:BnAVrNC:BnAXsSZ:BnAXzzo:BnAYnwT:BnAdGeP:BnAfQsE:BnAfnqS:BnAhwJm:BnAmTOd: +BnAnGuR:BnApIKD:BnAynuX:BnBDQDH:BnBHqvW:BnBJaWt:BnBPScB:BnBXvYy:BnBYxtF:BnBZSOT:BnBaaOM:BnBbBoC:BnBeTuf:BnBgQXg:BnBgsUm:BnBkSYx:BnBlDKv: +BnBmAzw:BnBnRmi:BnBpyXn:BnBsopF:BnBvCAT:BnBxnvS:BnCAPXL:BnCBFOD:BnCIhcn:BnCKQdQ:BnCPIFr:BnCTOrF:BnCUjug:BnCeShO:BnCwdnr:BnDByRz:BnDJng: +BnDPzko:BnDSVWe:BnDSWfa:BnDSdAg:BnDUgIp:BnDZfcW:BnDvKtO:BnDvaCH:BnECFZD:BnEEvTJ:BnEHBZe:BnEIjMI:BnEKMNw:BnERLLx:BnESAcQ:BnEVXzG:BnEYWFx: +BnEZgiI:BnEZxsG:BnEcxbx:BnEdcSL:BnElzYH:BnEpEfA:BnFAqdI:BnFLaZp:BnFOBE:BnFPDBT:BnFhniT:BnFjacR:BnFnCuh:BnFphYS:BnFpjpy:BnFrUrU:BnFrxaT: +BnFwvgo:BnGDIpP:BnGDsoP:BnGITDI:BnGSgTw:BnGYLWw:BnGbnvW:BnGbthN:BnGcVhE:BnGdmmy:BnGirbR:BnGjizW:BnGrwCC:BnGxsOR:BnHJuIm:BnHJxgr:BnHSssx: +BnHSzZM:BnHVnWv:BnHWPFQ:BnHcXJu:BnHeGxC:BnHiOgq:BnHmAlW:BnHqQgy:BnHtXJU:BnHxtTM:BnHyaKw:BnHztwC:BnIEkvs:BnIPuif:BnIPxGy:BnIQkkf:BnIXXEI: +BnIYtMG:BnIdmB:BnInSby:BnIsdTG:BnIxQsL:BnIxnqZ:BnJKKel:BnJMpCS:BnJNCmr:BnJPTJt:BnJResB:BnJWJvD:BnJYSkM:BnJfopY:BnJgzaI:BnJpSpY:BnJpciy: +BnJwevM:BnJxUnl:BnKBBAp:BnKHYGy:BnKLlpI:BnKNKbJ:BnKXeSM:BnKcgnp:BnKdENd:BnKhqZl:BnKiOQp:BnKimPu:BnKjVe:BnKqnVC:BnKzIKt:BnLBCcU:BnLCzkT: +BnLEWfz:BnLNPtc:BnLPahC:BnLQvOz:BnLRnxi:BnLSejy:BnLULWw:BnLizyj:BnLrONd:BnLvcwj:BnLvkYA:BnLxEHL:BnLyWRD:BnMCcEg:BnMCfEq:BnMDLLq:BnMLxsN: +BnMUkiK:BnMZGem:BnMdbvE:BnMozYa:BnMsEfh:BnMtumt:BnMvwjR:BnMwcSe:BnMzzHi:BnNELwy:BnNNTYZ:BnNRVQB:BnNSsYk:BnNSyfd:BnNTiql:BnNeVvP:BnNgjhY: +BnNiIqP:BnNmVBJ:BnNpaBZ:BnNvrq:BnNwovt:BnNzDFY:BnNzMyw:BnOBNQS:BnOFgTN:BnOJvDR:BnOMYrd:BnOOBll:BnOOTVf:BnOOnRg:BnOQiin:BnOSTym:BnOWHCK: +BnOWVqu:BnOXHCk:BnOXVqU:BnOkEoi:BnOqXur:BnOvabM:BnOvxei:BnPBkVQ:BnPEbrH:BnPIONo:BnPJNxH:BnPZqjr:BnPdmzI:BnPnwKa:BnPprcZ:BnPqzqP:BnPtDQO: +BnQCxGb:BnQQOnV:BnQbOGa:BnQfGoa:BnQnnuJ:BnQtRiL:BnQyzQi:BnQzDqv:BnRBpoK:BnRHJvm:BnRLgGA:BnRPquw:BnRRUfy:BnRUesk:BnRZGBV:BnRZqSE:BnReyXx: +BnRfFQW:BnRfPZe:BnRhNAD:BnRhmAT:BnRievD:BnRkUnE:BnRmsiH:BnRpccs:BnRqZBF:BnRrSBC:BnRsSpp:BnRsciP:BnSExTi:BnSNJVt:BnSWCMB:BnSYTjD:BnSZSCm: +BnSZcB:BnSbtQK:BnSjCaj:BnSlIKk:BnSqnfb:BnSvDkY:BnSxShy:BnTBvta:BnTFGEo:BnTOfce:BnTPFzo:BnTabVg:BnTbtXW:BnTcwJp:BnTgzhK:BnTphNT:BnTpxBS: +BnTrgAE:BnUAOHm:BnUGLLj:BnUHAcC:BnUIaHS:BnUJvTX:BnUKnXy:BnUPMNe:BnURbhb:BnUXFZV:BnUbKTd:BnUbacc:BnUbfRu:BnUhumO:BnUizvG:BnUjtxn:BnUkOnt: +BnUocWz:BnUokyQ:BnUyabw:BnUzNpB:BnUzxMO:BnVCPZR:BnVDHcu:BnVDVQK:BnVEsYb:BnVEyfm:BnVItYp:BnVMDiT:BnVMIsU:BnVaOlo:BnVcIBx:BnVjwFc:BnVlvgA: +BnVnimy:BnVoBdw:BnVsEFQ:BnVvSb:BnVvsoU:BnVxRRz:BnVzXTu:BnWETyj:BnWIPzK:BnWKgmr:BnWNLWI:BnWXgTI:BnWZDbC:BnWepJZ:BnWgIye:BnWgOLv:BnWiIba: +BnWnwd:BnWrnIC:BnWtaCE:BnWzYgI:BnWzhyD:BnWzjPn:BnXCrlD:BnXEXel:BnXIyEu:BnXJxsF:BnXLqju:BnXMheL:BnXSkyO:BnXTrld:BnXXISz:BnXYCIP:BnXaFsV: +BnXatKK:BnXdgnj:BnXhgAQ:BnXpiRx:BnXpqwG:BnXrtPr:BnXvQSI:BnXxwja:BnXzPQS:BnYBSbs:BnYCPfh:BnYKcHl:BnYKrLs:BnYSqJb:BnYYiaJ:BnYeakN:BnYirCJ: +BnYmmZY:BnYngaf:BnYtvdU:BnYvirO:BnYvqWp:BnYxYiO:BnZASOY:BnZEpop:BnZJtmX:BnZNPAV:BnZQPxX:BnZRFoP:BnZSkL:BnZUmpt:BnZYhCz:BnZeSpk:BnZeciK: +BnZogyk:BnZpgNM:BnaEqJe:BnaHuyZ:BnaRyee:BnaXPjw:BnaXREB:BnaXrwk:Bnacnud:Bnagvdr:BnakYih:BnavEgn:BnavefC:BnaxwkV:BnayIKX:BnazFSF:BnbADGY: +BnbDFoY:BnbEquE:BnbMQDL:BnbRBad:BnbXYgm:BnbfAzs:BnbgSBq:BnbjaOI:BnbnTub:BnbpQXc:BnbpsUi:BnbsgNd:BnbtEnp:BnbxYmt:Bnbxqzx:BnbyOqd:Bnbympa: +BncCtMH:BncGPaF:BncIawI:BncRhcj:BncWJaz:BncXJaZ:BncYOpL:BncZPXH:BncbbtP:BnceCai:BnceUh:BnchMof:BnckDkK:BncmRMT:Bncpdnv:BndDfcs:BndFACL: +BndNMnj:BndOxoi:BndSceS:BndSfeE:BndVvge:BndZXZz:BndbAIv:BndehNB:BndexBE:BndgjKB:BndmbTv:BnduxSh:BndvIAQ:BneArpj:BneCiWP:BneYfCJ:BnebPyB: +Bnekomq:BnemtxX:Bnenzvq:BneuKTR:BneuacU:BneufRC:BnewAiO:BnfBDVk:BnfGUzK:BnfSjjr:BnfVgtB:Bnfaacn:BnfdnVB:BnfeVHP:BnfgiGs:BnfhiGS:BnfpDFB: +BnfpMyl:BngCmdY:BngLxHh:BngMjkQ:BngPqDL:BngaURP:BngaxAQ:BngcAHP:BngfkAE:BngiaCW:Bngmmmu:BngoAPq:BngvvGj:BnhEPJU:BnhEpL:BnhErWI:BnhLtmP: +BnhNBRM:BnhSuIq:BnhSxgn:BnhTkKq:BnhZLSl:BnhbGUl:BnhcEGL:BnhceFa:BnheIkZ:BnhgFsd:BnhgtKy:BnhhfcF:BnhiGEN:BnhjQge:Bnhmwjs:BnhrOgm:BnhvGOm: +BniFXyP:BniJTIX:BniNaSg:BniRzzJ:BniUnwq:BniYuij:BniYxGu:BnibXjr:BnidGXD:BniitWD:BniwSbu:BnixOGv:BnjBqvt:BnjDpCo:BnjRKeP:BnjTSOw:BnjUxte: +BnjaTuE:BnjcQXD:BnjcsUN:BnjhSBV:BnjiAzT:Bnjnzau:Bnjoope:BnjrtqG:BnjvZBs:BnjzCAf:BnkDhcc:BnkJqVC:BnkLpcX:BnkNqUU:BnkOjuJ:BnkPOrk:BnkUlpM: +BnkWpaG:BnkZKEg:BnkcaoY:BnkdBOW:BnkgTUr:BnkiQxs:Bnkisuy:BnkmSyl:BnkoAZc:BnkvzAB:BnkygYR:BnkztQp:BnlGTKN:BnlKCcQ:BnlLXZa:BnlNVWz:BnlNdAx: +BnlOgIO:BnlOxSA:BnlQOhy:BnlXACW:BnlYahG:BnlZvtL:BnlfEFg:BnlrKtp:BnlraCw:Bnlrfra:BnlwbVJ:BnlyzVS:BnlztXz:BnmAnXf:BnmCLwX:BnmDjMD:BnmMPTl: +BnmNkiO:BnmQCCZ:BnmRgV:BnmTVwq:BnmTWFu:BnmTdas:BnmaOnk:BnmecWe:BnmekyN:BnmhzYe:BnmxWrK:BnnBTvu:BnnBnrt:BnnEDVt:BnnFjjm:BnnGyVy:BnnHjeB: +BnnQYRW:BnndXUa:BnngwcI:Bnnpovp:BnnyxEz:BnoCqDe:BnoDLWr:BnoFNHt:BnoZDIV:BnoZISW:BnoaigC:BnofjHR:Bnookpt:Bnoxnru:BnoyDfR:BnozyMT:Bnozymi: +BnpDhEz:BnpGkKH:BnpKasE:BnpMrnD:BnpOtmi:BnpRSBo:BnpSPFt:BnpdOgt:BnphGOt:Bnpidti:BnpkrBY:BnplzFp:BnpuaKR:BnpwTog:BnpyrcV:BnqAkvT:BnqDbRM: +BnqEIsx:BnqGyeW:BnqJhes:BnqUsST:BnqUzza:BnqXOnj:BnqczfY:BnqgPqQ:BnqpzQU:BnqqfCv:BnqqrbP:BnqsQGU:BnrEvYC:BnrFDGG:BnrGBaz:BnrIuSU:BnrJCmW: +BnrLTJQ:BnrMScx:BnrNesg:BnrSSkh:BnrWSOn:BnrjQYS:BnrltZJ:BnrmYmj:Bnrmqzf:BnrpPZI:BnrqNAH:BnrqmAX:BnrvsiD:BnsAjuM:BnsDYGZ:BnsHlpj:BnsIGbS: +BnsKDgn:BnsMIFx:BnsRTjX:BnsTeSn:BnscOQS:BnscmPV:BnspZbC:BnsqSbF:BnsrSPu:BnsrcIU:BnsuFqR:BnsxeVA:BntAgIF:BntAxSH:BntILlw:BntLahn:BntOGEk: +BntRGBm:BntSnBZ:BntYTKG:BntczyG:BntdWRI:BntkcsC:BntnONI:BntrcwG:BntrkYl:Bntswml:BntzKF:BntzjXJ:BnuEXzq:BnuGVwj:BnuGWFn:BnuGdah:BnuIxsq: +BnuNfCX:BnuQLLN:BnuaxsC:BnuovD:BnurwjM:BnuscSz:BnuvzHv:BnuzEhX:BnvBtYt:BnvCNhR:BnvMHcq:BnvMVQO:BnvNiqA:BnvViIt:BnvYyVp:BnvhpjG:BnviVBg: +BnvjIYx:BnvjOlk:BnvoWca:BnvpEOs:BnvpFMf:BnvsovY:BnwCDc:BnwHtym:BnwKBlO:BnwKTVE:BnwKnRD:BnwLDII:BnwLISH:BnwRPzO:BnwTyFp:BnwesOH:BnwmiMd: +BnwpIya:BnwpOLr:BnwrIbe:BnwvAHf:BnxAbrk:BnxRCIT:BnxUqjq:BnxXuYN:BnxcuFm:BnxetTG:Bnxftwi:BnxsnUp:BnxwvDf:BnyGbRT:BnyaALB:BnybdTy:BnyeQGl: +BnymGue:BnyntWV:BnypRii:BnysGeg:BnyuQsr:Bnyunqd:BnyvDqS:BnyyPqh:BnzFSkC:BnzHgGf:BnzJIfZ:BnzNORn:BnzStmD:BnzWPAJ:BnzYaWE:BnzaIku:Bnzcevc: +BnzkZBa:BnzlccT:BnzoCAt:BnzuCAe:BnzxMOj:BoABTWZ:BoAMaqN:BoANoNG:BoAXMXl:BoAjQeE:BoAmomB:BoAylMP:BoBBRuB:BoBEDSt:BoBFQEr:BoBFWSD:BoBGsiC: +BoBSdgr:BoBXcCz:BoBbXvF:BoBdbrH:BoBextH:BoBhHLO:BoBonIt:BoBrIeW:BoBuwUA:BoBwLPV:BoBwwri:BoCHRUY:BoCJxXz:BoCLxtV:BoCQSmr:BoCSZuv:BoCXllb: +BoCgsxN:BoCjbRS:BoCmJyL:BoCnHlT:BoCogXJ:BoCymvu:BoDFmvI:BoDIcvf:BoDJCAn:BoDJSgq:BoDLHZi:BoDLsMf:BoDSfxY:BoDUWUD:BoDXtbq:BoDcGNd:BoDfXOg: +BoDgUvR:BoDioLo:BoDixiC:BoDlnqN:BoDsGbb:BoDwsPr:BoDwtCG:BoEBpYB:BoECHAM:BoEEZca:BoEMUox:BoERCaY:BoERSGF:BoETsmQ:BoEYnZm:BoEbMVr:BoEcbej: +BoEgXNE:BoEkOob:BoEnXoP:BoErShX:BoEsyJK:BoEtMoS:BoEuTyL:BoEwnyU:BoFCbyM:BoFGhuo:BoFJCFe:BoFJuKq:BoFMhGp:BoFQUat:BoFRXFa:BoFUCkU:BoFVSUz: +BoFYnod:BoFduZo:BoFgoEb:BoFgrJe:BoFhoEB:BoFhrJE:BoFilo:BoFlwzu:BoFtCrp:BoFxCRI:BoFxFNV:BoFzXRI:BoGCjiC:BoGGcnB:BoGIbYD:BoGMhUf:BoGShgy: +BoGdtPY:BoGelrx:BoGiuzF:BoGjPVQ:BoGmoek:BoGmrjl:BoGnEVK:BoGykxM:BoHEMxJ:BoHHLXi:BoHJHbb:BoHUGxC:BoHWFYM:BoHelmV:BoHfCCv:BoHmdly:BoICrJX: +BoIGmSU:BoIICKc:BoIMAsc:BoIbbUt:BoIdAkt:BoIkxNg:BoIwBmm:BoJBWAa:BoJDKxl:BoJEdgk:BoJHzWX:BoJNRgL:BoJNznd:BoJTsZI:BoJbicI:BoJgbrq:BoJjDJg: +BoJkHLv:BoJvxLB:BoKADNU:BoKAjBs:BoKKRUr:BoKMett:BoKfniD:BoKkXVv:BoKmbRx:BoKpgXa:BoKrHJc:BoKurKK:BoKxsxe:BoKzcqK:BoLAtnp:BoLGEHM:BoLGHxl: +BoLJzRf:BoLKtbh:BoLRtMk:BoLWqcF:BoLYAxI:BoLYvJD:BoLaDAb:BoLfEQf:BoLmcBe:BoLonpM:BoLrTYb:BoMDcXC:BoMKsfU:BoMOzrO:BoMQtBa:BoMZNUJ:BoMZYdw: +BoMgAdU:BoMhzpQ:BoMiCFN:BoMjkDX:BoMpfiL:BoMpspb:BoMptcW:BoMscbl:BoMunPD:BoNOhZU:BoNQQgI:BoNXfzA:BoNZJBR:BoNZVQR:BoNdAkM:BoNpsQw:BoNryui: +BoNuQgn:BoNzaGz:BoOAxZp:BoODoQh:BoOFBPo:BoOFxZO:BoONhqC:BoORLQi:BoOWhzb:BoOaoeR:BoOarjU:BoOhFPO:BoOhrBK:BoOjRKK:BoOlkxT:BoOnrxA:BoOovfi: +BoOpIxO:BoOqCrY:BoOqFnF:BoOrwft:BoOsXrY:BoOuwZe:BoPDtGk:BoPEcMp:BoPFuvU:BoPKLXB:BoPMHbI:BoPPHsb:BoPRQiR:BoPRyCF:BoPSEXW:BoPhdm:BoPjAYh: +BoPjfuV:BoPsYog:BoPsfIl:BoPsihh:BoPvOsX:BoPzoMo:BoQCoNq:BoQJtgp:BoQLuVN:BoQawMv:BoQoNxr:BoRJQOG:BoRNRv:BoRPDYN:BoRSfDB:BoRWsZf:BoRZsiu: +BoRdsXc:BoRfcQM:BoRhxLM:BoRlqbp:BoRoKvF:BoRpcJz:BoRsifJ:BoRtuQb:BoRvHav:BoRzsmb:BoSAMi:BoSAxtD:BoSDccS:BoSEanU:BoSGtCN:BoSGzNt:BoSHYtd: +BoSTBCC:BoSVJSb:BoSYLIz:BoSeJPp:BoSgGuW:BoSoxTa:BoSpxlr:BoSuPbh:BoSxcjE:BoSyiFu:BoTAcEw:BoTFZQO:BoTIqcM:BoTLAxb:BoTLvJo:BoTNcvt:BoTSwBl: +BoTTYuQ:BoTUzrH:BoTYEHF:BoTYHxg:BoTbnpf:BoTczPs:BoTekdz:BoTfCfl:BoThGbp:BoTkQJe:BoTkXQb:BoTxGNv:BoTzXKO:BoUAzrV:BoUFnhB:BoUNnZS:BoUReZk: +BoUScVO:BoUUCag:BoUUSGx:BoUYsSB:BoUZYUJ:BoUfcbU:BoUjDaR:BoUjqlM:BoUmEqV:BoUpvpk:BoUsolF:BoUsxIj:BoUxyJu:BoVNayn:BoVRZBt:BoVVteH:BoVVusp: +BoVaRus:BoVeKAQ:BoVeQji:BoVgVUD:BoVhQgG:BoVkTQF:BoVrqVV:BoVrrwg:BoVtZKt:BoVwkXJ:BoWDlW:BoWJrWm:BoWTSGL:BoWUuux:BoWXRpH:BoWZQGY:BoWbyaV: +BoWbzvS:BoWiRUJ:BoWmKah:BoWmQJP:BoWoFRE:BoWxIwH:BoXDmsn:BoXJSRw:BoXPrjc:BoXRTwN:BoXzQEQ:BoYDJLe:BoYDwre:BoYIexV:BoYJExg:BoYKQIb:BoYKycv: +BoYXTWG:BoYaNxy:BoYoOSh:BoYqeQh:BoZCDYW:BoZNzWn:BoZRaNs:BoZccJc:BoZeifs:BoZjHaO:BoZkxLT:BoZlHKH:BoZlQNn:BoZoqbi:BoZwsXz:BoaFaqJ:BoaLZVJ: +BoaTXKR:BoaYrJs:BoaaxNL:BoadeQq:BoahEaD:Boahyfx:BoasQeA:BobKKxq:BobPQEV:BobQDna:BobQjbG:BobUZUI:BoblmVj:Bobosmp:BobpLPR:Bobpwrm:BobxnIp: +Bobzict:Bobzqka:BocDDsk:BocNaBm:BocRdGm:BocWsvR:BocdxTW:BocjJPF:BockrKd:BoclGua:BocqIEH:BocqUMB:BocvLpI:BocvwRv:BodBdaw:BodHwBZ:BodINHq: +BodTcxW:BodWssO:BoddMva:BodebEy:BodjAQV:BodmOOq:Bodollk:BodpQJS:BodpXQT:BodunqJ:BodwADA:BodxzPE:BodyCfZ:BodzkdL:BoeAzRa:BoeCnZA:BoeGDFi: +BoeHdAH:BoeLHAA:BoePZqf:BoeQNhN:BoeRfXb:Boeanyy:Boeevpy:BoejPbz:BoembeF:BoeqXNi:BoerGBY:BoeuOoN:BoevUVi:BoewlLT:BoexolT:BoexxIx:BofCnoX: +BofFhGl:BofGZBf:BofJUah:BofKteZ:BofKusb:BofLbyQ:BofPhus:BofTfYR:BofToqd:BofVBpc:BofVxzC:BofgRuA:BofilRM:BofkAkV:BoflPvd:BofqrJY:BofwtpL: +BofxFpC:BofxrbG:BofzRkG:BogDhqV:BogLhgu:BogOQGk:BogPUAq:BogQXfd:BogRbYH:BogVhUj:BogWxZe:BogYukt:BogbCRU:Bogckxa:BogdrxT:BogfCrl:BogfFns: +BogiXrL:BogmIwz:Bogvoeg:BohErjM:BohHQiE:BohHyCQ:BohKXPG:BohVeXq:BohaoMX:Bohbfkl:BohcEAZ:BohcyFf:BohiYop:BohlOsO:Bohoeqo:Bohqwmz:BoiBXHG: +BoiMTWY:BoiTMXO:BoifQef:Boigoma:BoiifXX:BoitlMS:BojCcCg:BojFSMt:BojLWAE:BojPmKc:BojQxTP:BojTcCG:BojUaNA:BojWRgH:BojWtcZ:BojXYTp:BojaJYj: +BojdHLr:BojnIej:BojqBUH:BojuJpd:BojwGUC:BokCllm:BokDdGf:BokQWal:BokTllM:BokUxXu:BokZDNQ:BokZjBw:BokdXVr:BokiDjj:BokqiCD:BokqqKQ:BoksmvZ: +BokwBuA:BolBmvT:BolIHZT:BolNrnQ:BolOfxD:BolVnHv:BolYcEX:BolZtnt:BolcXOZ:BolfdLp:BolgSHR:BolhnqS:BolsfIA:BolssPo:BolstCZ:BolvcBa:BolxnpI: +BolzDAf:BolzqLy:BomAZcB:BomBHrQ:BomFHXa:BomHeZV:BomMcXG:BomQtmf:BomVqCK:BomYzrk:BomZtBe:BomeYWq:BomqTyo:BonChuL:BonDCFF:BonDOaX:BonDuKR: +BonHZBY:BonIhGS:BonLcNH:BonMUaW:BonRIHo:BonZrwy:BoncEvA:BonhrwJ:BonitpS:BonjZKY:BonryAB:BonrzVG:BooEbYa:BooHxZL:BooIhUC:BooPQGB:BooSUAX: +BooePVT:BoovvfU:BopMtGg:BopOuvY:BopSxm:BopYeXj:BopbCCQ:BopfIao:BopiAKz:BopqNXE:BoqAQIU:BoqAycA:BoqJLxE:BoqLHBN:BoqOHSe:BoqStgl:BoqTcmw: +BoqUuVR:BoqhVnU:BoqiAyo:BoqifUQ:BoqzwMj:BorFjby:BorPsZj:BorYDYB:BordsmN:BorepgJ:BormsXo:BoroqKH:BorpcQa:BorsDnE:Borugxk:BosIxXL:BosYmks: +BosbniY:BosdqKH:BosgXVk:BosibRe:BosmHlb:BosrvO:BoswIEz:BoswUMp:BotCEHb:BotCHxC:BotFtbg:BotPsFS:BotUAxf:BotUvJk:BotWLxt:BoticBJ:Botknpb: +BotlADS:BotrvHK:Bottlly:BotvoLY:Botvxiu:BotxSHy:BouCsSf:BouEZqP:BouHqCR:BouPceh:BouRwbs:BouTzRW:BouXEhY:BouXHXx:BouZuM:BouanQc:Boubzpl: +BoudkDe:BoueCFs:BougGBo:Boujfiq:Boujtcj:BouocbQ:BouqnPy:BouzQjz:BovIQWt:BovIyqy:BovKhZx:BovLrwp:BovOXFk:BovRMcp:BovRfzl:BovWSgq:BovYVdZ: +BovgwFN:BovjsQZ:BovlyuD:BovoRkq:BovpFrx:BovqQgC:BovtOzQ:BovtaGW:BowBBPL:BowBxZl:BowMnOw:BowNLQJ:BowQZbI:BowUtEu:BowUuSM:BowVaoJ:BowZMCI: +BowZfZU:BowaBaA:BowbIwl:Bowhkxw:BowkyaR:BowkzvW:BownXrZ:Bowqqvk:BowqrWZ:Bowrsqc:BowsZkI:BowwQGz:BowxFRA:BowxVuy:BoxBuvp:BoxELXg:BoxGHbl: +BoxHono:BoxNQiw:BoxNyCc:BoxPXPU:BoxVaQF:BoxZlfR:Boxfwmh:BoxkVyQ:BoxnYob:BoxnfIi:Boxnihm:BoxxEAH:BoxxyFt:BoyBexZ:BoyFtgW:BoyHuVi:BoyUXpl: +BoycBmS:Boykuxa:BoyqVYH:BozEzWR:BozFQOb:BozLDYk:BozMfDg:BozTDSg:BozVsiP:BozgDJm:BozjPBR:BozkSGV:BoznifO:BozpQWO:BozpwUy:BozzJpJ:BpADrlZ: +BpAEMYy:BpAFXay:BpATkam:BpAXZNY:BpAdMOV:BpAeute:BpAhWkQ:BpAhlIn:BpAmQEh:BpApNPL:BpArIzH:BpAwBkp:BpAzdSf:BpBBkgK:BpBDTZT:BpBDZWn:BpBKkAF: +BpBLXAr:BpBMXEc:BpBQdWV:BpBUAdH:BpBZMyR:BpBbjIj:BpBdglM:BpBgGeI:BpBlWlr:BpBnWKZ:BpBnlie:BpBoSTG:BpBrYbW:BpBsQec:BpBvNpG:BpCExLP:BpCFFaA: +BpCIEcZ:BpCQTwq:BpCVJgp:BpCWeQL:BpCWham:BpCZZKg:BpCgxRe:BpChVQe:BpCjLuW:BpCkXfB:BpClOUw:BpCmpGQ:BpCnsQW:BpCqdXc:BpCveHg:BpDFhXu:BpDInqz: +BpDQcgn:BpDSnfZ:BpDWSJD:BpDWkYs:BpDcogI:BpDdmOj:BpDmovz:BpDpqsX:BpDuNHA:BpDxZiN:BpECBei:BpECUjV:BpEITBY:BpEIXcH:BpEJHlG:BpEUPK:BpEazRR: +BpEcarb:BpEfpoP:BpEoTix:BpEtarB:BpEyGfP:BpFAxFR:BpFCNVU:BpFJuXe:BpFKBEP:BpFKUJo:BpFQXCq:BpFTOHi:BpFVXCN:BpFVbIn:BpFXQGY:BpFdQBX:BpFgrLL: +BpFlpOi:BpFpeOs:BpFqRsT:BpFwTIA:BpFxfIN:BpFzrRJ:BpGIfeG:BpGNcgm:BpGPEAe:BpGUCTs:BpGVUoV:BpGfnkC:BpGivWQ:BpGkoFd:BpGzFlU:BpHGtNm:BpHHqPH: +BpHKxiJ:BpHOJL:BpHSOWp:BpHTcGt:BpHaOtU:BpHbFRa:BpHcexW:BpHiFpv:BpHiIQr:BpHloJB:BpHoEHb:BpHqWTw:BpIDwXi:BpIGrls:BpIKwJu:BpIUVFi:BpIbzLk: +BpIcNPe:BpIeIza:BpIeQrt:BpIfQRC:BpIiWLP:BpIjdwN:BpIjveh:BpIkWkx:BpIklIG:BpItSAd:BpIvCHJ:BpIxXUJ:BpIxcc:BpJCCzr:BpJFsta:BpJLwxP:BpJMrLJ: +BpJNweE:BpJOXAi:BpJPMrv:BpJQXmE:BpJTCzR:BpJUAwT:BpJWTZO:BpJWZWu:BpJXyme:BpJcCkK:BpJdhug:BpJeYbL:BpJfQex:BpJnuTu:BpJoWli:BpJujIq:BpJvqbt: +BpJwglV:BpKASTw:BpKAhCx:BpKLZKn:BpKVzHL:BpKYQzN:BpKZtgv:BpKapem:BpKboWu:BpKczfo:BpKkFPm:BpKkSIC:BpKkTZv:BpKrNie:BpKsZIp:BpLBMOa:BpLDlAj: +BpLEhQZ:BpLGcBK:BpLITtZ:BpLNRWd:BpLQZkW:BpLVNqC:BpLZTWA:BpLfDuE:BpLfrbA:BpLfyGj:BpLgowL:BpLhNHf:BpLuXH:BpLzQuL:BpLzdxS:BpMAQZP:BpMJsLu: +BpMPlYd:BpMQYDo:BpMlGfw:BpMoQzg:BpMqrlr:BpMukXP:BpMuqsh:BpMwvLE:BpNCHLW:BpNDUrI:BpNDoXC:BpNGIYU:BpNLCwS:BpNMuXL:BpNRiqt:BpNWwbo:BpNYYdX: +BpNZRNb:BpNceOZ:BpNgQBq:BpNhRNQ:BpNiTIH:BpNjzrB:BpNrYxY:BpNyrLE:BpOIUom:BpOQcgV:BpOTMjo:BpOZsKv:BpOhqDm:BpOjHdr:BpPBlaq:BpPHTBX:BpPLCtC: +BpPOUOf:BpPTWkf:BpPTjUf:BpPYEaU:BpPZead:BpPbUan:BpPgtEz:BpPiarE:BpPpHDy:BpPqnaz:BpQISFF:BpQKdJZ:BpQMSpm:BpQbEm:BpQgfUZ:BpQjCHu:BpQkhRi: +BpQkqWO:BpQsCSb:BpQwUHz:BpQxUHZ:BpQzhxN:BpRBXEq:BpRFdWD:BpRPLYh:BpRPScq:BpRXFeR:BpRcmNG:BpRdSTU:BpRmSat:BpRoQrS:BpRpChz:BpRsvEx:BpRuGAp: +BpSFTwC:BpSHhKo:BpSIJgB:BpSNEch:BpSOlaH:BpSWnlp:BpSYFas:BpSZxLb:BpSaDiU:BpScqDO:BpSkKtP:BpSmuox:BpSnxHZ:BpSqDUg:BpSqrBc:BpSqygH:BpSsHgi: +BpSsmVn:BpSvord:BpSxxwx:BpSzyno:BpTAwle:BpTCkdd:BpTHNqJ:BpTLSJj:BpTSuvn:BpTXnft:BpTcsBU:BpTetEI:BpTiqdD:BpTtLUN:BpTvOun:BpTvXPB:BpTxsqN: +BpUAiXF:BpUBYHG:BpUEgCA:BpUFRnl:BpUKTBE:BpUMFcP:BpUMmzL:BpUOvHC:BpUTHCD:BpUdKFS:BpUeQON:BpUrgRb:BpUrjPX:BpUvfiI:BpVIYHl:BpVIqna:BpVKHcm: +BpVLRNe:BpVMQGw:BpVQTbL:BpVRFCy:BpVRmZe:BpVWAtu:BpVYlyt:BpVZgch:BpVeGFg:BpVjShO:BpVlYLQ:BpVorRd:BpVpfKm:BpVpvlU:BpVtoCD:BpWHxIa:BpWJmap: +BpWTtnF:BpWUhjS:BpWYxqX:BpWaGOJ:BpWazrh:BpWcseb:BpWkLtL:BpWlEhI:BpWoFlg:BpWsDuc:BpXElaj:BpXHOWb:BpXJOj:BpXKTBC:BpXNYzn:BpXNqPz:BpXPxiX: +BpXSfEl:BpXVAhK:BpXcHDb:BpXfWTe:BpXnFpd:BpXnyVo:BpXqXWM:BpXtEHp:BpXxexE:BpYASOJ:BpYCFEt:BpYGlpt:BpYKLyN:BpYKSCW:BpYeCSk:BpYsvGT:BpZFqvo: +BpZRSfv:BpZRrYP:BpZTdjj:BpZcXMv:BpZpWlt:BpZpqnB:BpZtXMV:BpZyqbB:BpZzjIG:BpaCbzv:BpaGyMQ:BpaHZwA:BpaOMRB:BpaSCZf:BpaVsTu:Bpaehso:BpagRrg: +Bpanxoz:BpapBkt:BpathUs:BpauYBX:BpavQEl:BpbDMyv:BpbKkgO:BpbMTZP:BpbMZWj:BpbSLun:BpbduTj:Bpblqbk:BpbtxOq:Bpbydsi:Bpbzhux:BpcDOd:BpcEDxo: +BpcGrdn:BpcIhxf:BpcKzZJ:BpcLnlf:BpcRMoU:BpcVnFI:BpcYSTZ:BpcYhCU:Bpcgmoy:Bpckorr:Bpcmxwn:Bpcoyny:BpcqxRA:BpcvDUq:BpcvrBu:BpcwsQS:BpcxNhR: +BpdEFAJ:BpdMrDa:BpdOhXi:BpdPTWz:BpdQzzE:BpdRhkV:BpdVeqG:BpdVhAf:BpdXECQ:BpddgwW:Bpdfxrn:BpdmmOv:BpdpQuw:Bpdpdxh:BpduyNv:BpdzXFI:BpeAHHw: +BpeFAFf:BpeFDCb:BpeSHlK:BpeTURU:BpeWIyI:BpeccKM:BpecfWR:BpeexKM:BpefYPP:BpegWcq:BpehbXV:BpehzqL:BpenUCK:BpepTpU:BpeseoF:BpewQbm:BpexRnM: +BpeyTiT:BpfBBEl:BpfBUJS:BpfCAvT:BpfFcRX:BpfHxFn:BpfJNVi:BpfMwbz:BpfOgcZ:BpfXXCM:BpfYHLB:BpfaQyc:BpfacvB:BpfbaRg:BpfciMZ:BpfhYxL:BpfhZoI: +BpfupOU:BpgARRy:BpgAxrt:BpgCAHl:BpgIzol:BpgJhjM:BpgdFly:BpgoGcS:BpgonkO:Bpgpojw:BpgrcZR:Bpgvixl:BpgwteF:BpgyaRy:BphDxQO:BphIAhe:BphQqPT: +BphXfEB:BphZlaD:BphahYH:Bphjofa:BphxvwT:BphyFLP:BpiAdJA:BpiBEMq:BpiJADN:BpiJzLx:BpiRXee:BpiVdwP:BpiahRr:BpiaqWT:BpikzLo:BpiphxU:BpismnS: +BpitStA:BpjATZk:BpjAZWQ:BpjFrLN:BpjJwjH:BpjYXAM:BpjfMoB:BpjhWlm:BpjjWKE:Bpjjliz:BpjrNpX:BpjtQRI:BpjwxOj:BpjyBKd:BpkDEcW:BpkIhqg:BpkJcbV: +BpkOZko:BpkPRwY:BpkSeQa:BpkbVIW:BpkfXfO:BpkjYsI:BpkkoWq:BpkmQUQ:BpkmdXN:BpkoaHG:BplBRTa:BplGxld:BplJVsQ:BplLcgm:BplMCOj:BplOcxB:BplPStj: +BplPhce:BplSSJg:BplSkYP:BplUzhQ:BplXQZS:BplYtGk:BplbzFr:Bplggwh:BpliurE:Bpljxvk:BplppEp:BplqNHb:BplrZim:BplzFpp:BplzTzk:BpmDIho:BpmGURz: +BpmGoxp:BpmJrIT:BpmYYhx:BpmYqNu:BpmcTpz:BpmeeoI:Bpmiwgt:BpmjiNT:BpmkbXy:Bpmkzqc:BpmpKAO:BpmuGfs:BpnKTbE:BpnKXCT:BpnRXCk:BpnRbIK:BpnZHhg: +BpniTPE:BpnlRsQ:BpnqbxF:Bpnrink:BpnxKap:BpnybFq:BpoJcgJ:BpoLEAB:BpoOCTT:BpoRUoq:BpoUlAf:BpoXOwn:BpoaLty:BpobGcx:Bpobnkd:BpodvWV:Bpohixg: +BpoiDuV:Bpojtoc:BpoqqDq:BposHdn:BpovWti:BpoyseW:BppCMJh:BppDYzy:BppDqPm:BppIskq:BppPcGQ:BppREaY:BppXUOj:BppdFps:BppdIQw:BppdyVx:BppoBLi: +BppsbtP:BppvIn:BppyHDu:BpqIAWN:BpqMIEn:BpqUZNS:BpqVqVc:BpqcWLs:BpqelId:Bpqfdwm:BpqfveK:BpqhCKq:BpqivGA:BpqkgLL:BpqsXmz:BpqwdSl:BprHSfM: +BprHrYk:BprJdjQ:BprLSPf:BprQAwy:BprUIeY:BpraYba:BpreNpq:BprgIZu:Bprjhrb:BprjqwD:BprkWlD:BprmWKl:BprmliS:BprvfuQ:BpryhXE:BpsAnlT:BpsBJgF: +BpsEtgi:BpsFZKQ:BpsKNQE:BpsSRwb:BpsWEcl:BpsdKtT:BpseVQs:BpsfsbZ:BpshteF:BpsjDiQ:BpslqDK:BpsrjSY:BptCcBf:BptETWL:BptHJGM:BptZwla:BptlsBQ: +BptmFpY:BptmSiw:BptmTzB:BptntEM:BptpDIZ:BptuZiD:Bptyehz:BpuCmAA:BpuLYHc:BpuPRnH:BpuQCWY:BpuYATX:BpugYXS:BpugZOV:BpuhGfj:BpuozRH:BpuqkXM: +} + +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658664160, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1908558533920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1907292239120, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + P: "BIiMTNT", "KString", "", "U", "BJKKUfZ" + P: "BbAJerP", "KString", "", "U", "AAAJKop" + P: "BpgrcZR", "KString", "", "U", "APGAmLj" + } + Shading: T + Culling: "CullingOff" + } + Material: 1907674217712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1907680138928, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1907631740128, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",1907292239120,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1907631740128,1907680138928 + + ;Geometry::, Model::pCube1 + C: "OO",1908558533920,1907292239120 + + ;Material::lambert1, Model::pCube1 + C: "OO",1907674217712,1907292239120 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_tangents_reorder_7500_ascii.fbx b/modules/ufbx/data/synthetic_tangents_reorder_7500_ascii.fbx new file mode 100644 index 0000000..5057112 --- /dev/null +++ b/modules/ufbx/data/synthetic_tangents_reorder_7500_ascii.fbx @@ -0,0 +1,580 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 4 + Day: 1 + Hour: 15 + Minute: 36 + Second: 14 + Millisecond: 748 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_uv_set_tangents_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_uv_set_tangents_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "01/04/2020 12:36:14.746" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_uv_set_tangents_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "01/04/2020 12:36:14.746" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2694179563792, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2694176668800, "Geometry::", "Mesh" { + Vertices: *12 { + a: -0.5,0,0.5,0.5,0,0.5,-0.5,0,-0.5,0.5,0,-0.5 + } + PolygonVertexIndex: *4 { + a: 0,1,3,-3 + } + Edges: *4 { + a: 0,3,1,2 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *12 { + a: 0,1,0,0,1,0,0,1,0,0,1,0 + } + NormalsW: *4 { + a: 1,1,1,1 + } + } + LayerElementBinormal: 2 { + Version: 102 + Name: "Rot180" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: *12 { + a: 5.9604651880818e-08,-0,1,4.47034871342566e-08,-0,1,2.98023223876953e-08,-0,1,4.47034871342566e-08,-0,1 + } + BinormalsW: *4 { + a: 1,1,1,1 + } + + } + LayerElementBinormal: 3 { + Version: 102 + Name: "Rot0" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: *12 { + a: 0,0,-1,0,0,-1,0,0,-1,0,0,-1 + } + BinormalsW: *4 { + a: 1,1,1,1 + } + + } + LayerElementBinormal: 1 { + Version: 102 + Name: "Rot90" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: *12 { + a: -1,0,0,-1,0,1.49011611938477e-08,-1,0,2.98023223876953e-08,-1,0,1.49011611938477e-08 + } + BinormalsW: *4 { + a: 1,1,1,1 + } + + } + LayerElementTangent: 7 { + Version: 102 + Name: "Rot270" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: *12 { + a: 2.9802325940409e-08,-0,1,7.45058059692383e-08,-0,1,1.19209289550781e-07,-0,1,7.45058059692383e-08,-0,1 + } + TangentsW: *4 { + a: 1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "Rot270" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: *12 { + a: 1,0,-2.9802325940409e-08,1,0,-7.45058059692383e-08,1,0,-1.19209289550781e-07,1,0,-7.45058059692383e-08 + } + BinormalsW: *4 { + a: 1,1,1,1 + } + + } + LayerElementTangent: 9 { + Version: 102 + Name: "Rot90" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: *12 { + a: 0,0,-1,-1.49011611938477e-08,0,-1,-2.98023223876953e-08,0,-1,-1.49011611938477e-08,0,-1 + } + TangentsW: *4 { + a: 1,1,1,1 + } + } + LayerElementTangent: 10 { + Version: 102 + Name: "Rot0" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: *12 { + a: 1,-0,0,1,0,0,1,0,0,1,0,0 + } + TangentsW: *4 { + a: 1,1,1,1 + } + } + LayerElementTangent: 8 { + Version: 102 + Name: "Rot180" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: *12 { + a: -1,-0,5.9604651880818e-08,-1,-0,4.47034871342566e-08,-1,-0,2.98023223876953e-08,-1,-0,4.47034871342566e-08 + } + TangentsW: *4 { + a: 1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "Rot0" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 0,0,1,0,0,1,1,1 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementUV: 1 { + Version: 101 + Name: "Rot90" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 2.98023223876953e-08,1,0,2.98023223876953e-08,1,1,1,0 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementUV: 2 { + Version: 101 + Name: "Rot180" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 1,0.999999940395355,5.96046447753906e-08,1,1,0,0,2.98023223876953e-08 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementUV: 3 { + Version: 101 + Name: "Rot270" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 0.99999988079071,0,1,0.99999988079071,0,2.98023223876953e-08,5.96046447753906e-08,1 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *4 { + a: 0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 3 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 10 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Layer: 1 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 1 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 9 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 1 + } + } + Layer: 2 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 2 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 8 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 2 + } + } + Layer: 3 { + Version: 100 + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 7 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 3 + } + } + } + Model: 2694178308240, "Model::pPlane1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "Rot270" + } + Shading: T + Culling: "CullingOff" + } + Material: 2695032382528, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2694182103184, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2694011430160, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pPlane1, Model::RootNode + C: "OO",2694178308240,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2694011430160,2694182103184 + + ;Geometry::, Model::pPlane1 + C: "OO",2694176668800,2694178308240 + + ;Material::lambert1, Model::pPlane1 + C: "OO",2695032382528,2694178308240 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_texture_opts_0_mtl.mtl b/modules/ufbx/data/synthetic_texture_opts_0_mtl.mtl new file mode 100644 index 0000000..c5ae823 --- /dev/null +++ b/modules/ufbx/data/synthetic_texture_opts_0_mtl.mtl @@ -0,0 +1,22 @@ + +newmtl Opts +map_Kd -blendu off -blendv on -clamp off -imfchan r -mm 1 2 -o 0.1 0.2 0.3 -s 0.4 0.5 0.6 -t 0.7 0.8 0.9 -texres 512 textures/checkerboard_diffuse.png +map_Ks \ + -blendu on \ + -blendv \ + off \ + -clamp on \ + -imfchan g \ + -mm 3 4 \ + -o -0.1 -.2 1.3 \ + -s \ + 1.4 \ + 1.5 \ + 1.6 \ + -t 1.7 1.8 1.9 \ + -texres \ + 1024 \ + -unknown hello world \ + -single-unknown \ + textures/checkerboard_specular.png + diff --git a/modules/ufbx/data/synthetic_texture_opts_0_obj.obj b/modules/ufbx/data/synthetic_texture_opts_0_obj.obj new file mode 100644 index 0000000..b151ffd --- /dev/null +++ b/modules/ufbx/data/synthetic_texture_opts_0_obj.obj @@ -0,0 +1,3 @@ + +mtllib synthetic_texture_opts_0_mtl.mtl + diff --git a/modules/ufbx/data/synthetic_texture_split_7500_ascii.fbx b/modules/ufbx/data/synthetic_texture_split_7500_ascii.fbx new file mode 100644 index 0000000..9b2a7ad --- /dev/null +++ b/modules/ufbx/data/synthetic_texture_split_7500_ascii.fbx @@ -0,0 +1,4924 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2021 + Month: 8 + Day: 1 + Hour: 19 + Minute: 56 + Second: 4 + Millisecond: 960 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "01/08/2021 16:56:04.959" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\maya_textured_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "01/08/2021 16:56:04.959" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2179871343728, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 18 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfacePhong" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Phong" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + P: "SpecularColor", "Color", "", "A",0.2,0.2,0.2 + P: "SpecularFactor", "Number", "", "A",1 + P: "ShininessExponent", "Number", "", "A",20 + P: "ReflectionColor", "Color", "", "A",0,0,0 + P: "ReflectionFactor", "Number", "", "A",1 + } + } + } + ObjectType: "Texture" { + Count: 6 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } + ObjectType: "Video" { + Count: 6 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2179854704896, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2179263690608, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2180149143232, "Material::phong1", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "EmissiveColor", "Color", "", "A",0.5,0.5,0.5 + P: "AmbientColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseColor", "Color", "", "A",1,1,1 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "SpecularColor", "Color", "", "A",0.5,0.5,0.5 + P: "ReflectionColor", "Color", "", "A",0.5,0.5,0.5 + P: "ReflectionFactor", "Number", "", "A",0.5 + P: "Emissive", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Ambient", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0.800000011920929,0.800000011920929 + P: "Specular", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Shininess", "double", "Number", "",20 + P: "Opacity", "double", "Number", "",1 + P: "Reflectivity", "double", "Number", "",0.125 + } + } + Video: 2180149146592, "Video::file1", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_diffuse.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + Content: , +"iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJ", +"TUUH5QgBECwZQ+1sKwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAFq0lE", +"QVR42u3cW0xTdwDH8S/QymUqYuqi4gVsnBQZc0sFF0QGAx0PCwEdYMLTeNCYzAcTjEucD/K2B2Nc9rTE", +"RHFeF3SZCQs4TZlOxyAypyAggojKbUMuStFS9yAlIrTimArl93mCHtrTNt9z/ud/Wo7PzvT0J4yDrbp6", +"PHcnwWJB639z6/dFpjQFoABEAYgCEAUgCkAUgCgAUQCiAEQBiAIQBSAKQLyVT3xExLi+D6DP8yf3+rUH", +"0BAgCkAUgCgAUQCiAEQBiAIQBSAKQBSAKABRAKIAxCsZ9Hm6rg8gGgJEAYgCEAUgCkAUgCgAUQCiAEQB", +"iAIQBSAKQBSAeB1dH0DXBxANAaIARAGIAhAFIApApg7Dq3jQ/MLCoZ+dTieP+/uxP3hAW3MzNyoruXz2", +"LH29vSPuV+pmTrzmmblu6RjnzV9lZIx4Lp641uF6/DUe5tee/sYSG8sHSUnMN5sJmjkTp8NBX28vHXfv", +"0lxXR21FBU3Xr4/pdXt6HyZ0AMN2Mb6++AcG4h8YSLDJxNIVK0jMzKRw3z6qy8q8Z0syGsnKyyPCan1u", +"gYFpAQEEm0yYo6NJWL9+KE6v3QM8vxX6+vkxIySEhcuWEZuaSlhkJFl5eZzYs2fYmbCX2Qpdy8Z6Jszd", +"mz7eM3EuyTk5RFit/NPSwtljx6i/coUHXV34GQxMDw7GFBrKYouFqLi417qFv/E9AIBzYICujg66Ojq4", +"euECiZmZJGVn8+mmTXx/8iRdnZ2Tfg/wXnw8AAfz8/n73r2h2x2PHnG/vZ377e3cqKzklyNHdBB47vhx", +"aioqeGvmTD5JS/OKIWBaYCAA9r4+zQLGoqyo6OluLyXFKwJorq0FIG3zZqbPmjW1ZwFjcae+HoC5oaH/", +"6f6ejpxHG+89zQb+j7H35wMH+Hz3biwxMSyzWmm9dYuWxkZam5pou32b5traUWc+LzMbmJSzAHdcb0bw", +"JNpaPLl38ybfbtvGRxs2YFm1innh4cwLDx9aPuBw0FhVxZnDh4f2FhNiD/AqP8/2tGzW7NlPQ+jpcXsk", +"7+m5ubZy2zjn0AkWy6jrGcv7kmCxDF9/dTU/2mzg48OisDAWm82Emc0stVh4PyYGc3Q0YcuX8+WWLVwq", +"LR2xnhdND0d7TuOdxbyxPcA7kZEAw46YJ4JHdjvTAgLwMxgYcDhGLPczGgHot9vdP8iTJzQ1NNDU0MCv", +"Z84MTYW/2LGD9Tk55G7dOhTAlD0ITMvOBuDaxYsTKoDeri4ATG6OTeYM3t77klNX58AA3+3dC8CiZ4aG", +"KRnAxtxc4j/+mI62Nv602SZUAHfq6gBYuXbtqMutg7c3D/6dyzcFBSwMC/P42K4D3vbW1qk1CzAYjcw2", +"mYiIiiItK4uVcXE4HA6+3rUL/wk2b/6juJh3V69m5bp1POzpobykhJ7OTmaEhGBNSRkKo7ykZPiJIKuV", +"g6dP89u5c9iKi/nr8mU6WlvxMxoxzZnDhwkJbMzNBeCHgoKpEYC7aU1Pdzf527dzyWYbdmDz/FTN9fvr", +"PHfecPUqpYWFrMnIIDEzk8TMzJGvq7CQxmvXht3W1tLC23PnEp+cTHxy8ujDgNPJkf37OeXmbOCLPrh6", +"Fe/Da9kD2O12eru7aWpooOz8eX46cYKewbF2Iio5dIjbNTXEpKYyf8kS/IOC6H/4kLv19fxeVERNefmI", +"+3yWlERsfDxxSUlEREUxb8ECAoOCcDx+THtrK1fKyzl19Ci1VVUT6rX67ExPH9fXwvW1bl0mTiYxBaAA", +"RAGIAhAFIApAFIBMKbo+gK4PIBoCRAGIAhAFIApAFIAoAFEAogBEAYgCEAUgCkAUgHgfgz5P1z+GiIYA", +"UQCiAEQBiAIQBSAKQBSAKABRAKIARAGIAhAFIF5H1wfQ9QFEQ4AoAFEAogBEAYgCEAUgCkAUgCgAUQCi", +"AEQBiAIQ7/Mvxl4LkLfMIrUAAAAASUVORK5CYII=" + } + Video: 2180149147552, "Video::file4", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_emissive.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + Content: , +"iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC40NARS3AAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAIYUlEQVR42u2ce1CU1xmHH+KCLhoVFZRRiCIYwFvwEpFF", +"iIgg3qOIsU6ixKixGafJ1MSZdJrpTGPbNFanUzM2atSMMY234JUqXrBGWFHEK2AAMaJGROTiXdjF/kFBEVBhbS3we/6B2f3e71z22fec833fHrvQeab72EB2Yo4t4XgEuKPyn1/5LyCaNBJAAggJICSAkABCAggJICSAkABCAggJICSAkABCAojGip1HgJtNzwPofn7D", +"Ll8ZQEOAkABCAggJICSAkABCAggJICSAkABCAggJICSAkACiUWLQ/XTtDyA0BAgJICSAkABCAggJICSAkABCAggJICSAkABCAggJIBod2h9A+wMIDQFCAggJICSAkABCAoimg8GW4LMJT7eGHf5hYOX/uz8/CMCde3eYumBCjcc72DtwMCaJ9k7tAehucn9imQ+XAWDq", +"FUT4gJH0cPOmjWMbLGVWbty+zsWrFzhzIY2k9ERSfzpV7TxhwSOIHDmJ3t59cGrTDovVQtH1Is5dyOZE6nHizfs4evJItfbUVJ+l76/Cs7MXv/v6YxJOH3hsH4UFj2DpH5aRlpHKmOiIevfv/1QAWzA2NzJ68HhO7E2t9t64sPGVH35dcTA48Ns3f4+/r+mRhtrTwqEF", +"zm1d8PPqz5SQN6t0XHOH5iz5dCkhptAqcfb29hhbGHF1cSWgv4k5b71XRcjHEZcci2fnXxHWP+KJAkyMmATAptgNDScD2GLg2Z8zGWeayGfNPsNitVR5b3rUDNIz0/Dx8q0WV9H5Fd+OR8t+O2I2/r4mfr52iTVxK0nJTKboZhH2BgNtWznh5vwSvbr1JrjvsCpx82bP", +"J8QUSs6l8/z1q8UkJh/kWtE17A32tHfqQPeXutO/z0BGDRtTY9srMsHD9dmbEsfMUb9koLc/Lxpbc+PO9Rr7wqmNE0H+wZSUlrAlLqbWNtdEg70SGPPDBtq37sDYsPFVXh/k54+3pw8r162o13lD/IYD8PGKeexJ2UXBjWuU3bdyr/QeVwpzSc5IYvWuFUT/eUqVuIp6", +"RP/6LTbv+p68a3lYrVbu3rvLpdyLHEj6F4uXLyT0jeCnrsv128UcPmPG3mBPiF9orceNGT4OB3sH9pvjKSwubBqTwL0pcRTcKGDGGzOrvB49+R3y8q+wNW5zvc7r2NwRgNt3b9UprpVjSwBu3rr5TNu560hseWboH1HrMRNGRJan/x3rm84qwFJmYbs5Bm9PHwIGlKfN", +"Lq5uhAQMY82mr6sNC09Lek4aAO9HfkS7F59+HnEs9RgACz76E87tXZ5ZO5PSzRTeKOBldx/cXF6q9r5nVy96+/QhvyCfePO+hrUKeNJM+ElzhK2JMUQFT+WdKbNITD7ItMhoSkpL+HbzN/Wuy5fbl7Bw9t8I6BmIv08A2ZfPkn05i59yszl/5Rzp59NqHIv/uORT1i5Z", +"R+iQ4YSYhnEmK530rHQyz/1I5rkMjqceo+h6UZ3rU3bfSvyxPUwIiiKsfwRf/fPvVb/9ERMB2LZ7C1artV6rrQa5CgAovlXE9j1biRwVRV/fV4gcHcXmnd/Xq6MryLqUwbuLp/OLYdMI7B2EZ2cvPDt7Pcg8Vgsns4+zeudy0nMerEBSM04zetoI3ps2l/DgEfj26Ilv", +"j54P4iwWDh8/xKJlCzmWmlK3YSB5BxOCogjxG15NgLFhrwOwMXb9c/kMbN4f4Emz1NqouA8e12kHkaOiWPGXVbRybEXcj9urzWwfV8ea7qdnk0PijiTssKObuweeXT3x7OqFb4+e+PcLoJ/XAPp6+DFr/tsQUDV2+YElLD+wBDdnd9xduuLesSuenb3o270fAQMCGeQ3", +"mE9Wz+fwmUM1ll9bfdJGp+Lboyed7rmReDQBgIABgbi6uJJ1KZMSl1t4uLjX+Rtu6/MEzzUDAJzLPUtKZjL9vAaQlG7mYv6FZ3bu+9wnO+cs2TlniTuwC4BmzZrxm7mfMG1SNB/MnMcHK+bUGHvhag4XruaQkFq+fn/Brhlzxs5lfGAk08NnVgrwtGyK3YBvj568HjGx", +"UoCK9B+XHPvc+v//4lLwpgPr/vP3u/96WVarlUXLPi/PLO7d6zSWr9q5rHyy6lz3jLclLoaS0hLCgyMwtjBibGEkPDiCUkspe1PimrYAh8+YGf5hIMeyjtp8ru++2Eg3N4/HHtPZtQsAuXmXK19bNOcLunRwe2xcRydXAPKL8+pcr8LiQvab42np2JIRr40kYugoHI2O", +"HD5j5vrt4ufW9wYaGQNfeZVda/eyN2EPO/fHknLqKFeu5mIwGHDp0JGhg0OYNfVdAFZvWFkZ19ujLyvmfcOh9AR+OLmf1POnyC/Ox9DMQPvWHXjV25/JQ6eWX8Q6uLF+mW7HesKCwstTv51dlesEDVqAJy1T6jNJfNolZ0XZFWVczruMq4srYUHhhAWF15zOy8pY/u2X", +"rI1ZUznBvFqUh3NbF0y9gjD1Cqo1bsP+f7DNHFNr2x+tz8PEm/eRX5DPIL/B2NnZkV+QT1K62eZlti392+gywJAJ/gT7v0ZoYBi9ffrg5uqGo7ElpZZScvMuc+TEYdbGrCE143SVuKkLJjLQexCDfYfwsps3ndq5YnQwUmq1kF+cx6lzJ9lmjiHrUoZN849tu7cQPXlG", +"5dq/7L71ufaXXeg8k02Pheuxbm0TJxowEkACCAkgJICQAEICCAkgmhTaH0D7AwgNAUICCAkgJICQAEICCAkgJICQAEICCAkgJICQAEICiMaHQffT9cMQoSFASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJASADR6ND+ANofQGgIEBJASAAhAYQEEBJASAAhAYQEEBJA", +"SAAhAYQEEBJAND7+DXtbEsjx2g+IAAAAAElFTkSuQmCC" + } + Video: 2180149134592, "Video::file3", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_ambient.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + Content: , + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC8i2cvWzAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAGZElEQVR42u2ce0xTVxzHv4VWYxUaHmEhIPwhGAoxE4QIF2MVhCoSB5mAGh8YyBaWZSyDmJi4v5xZYtRkziUmyxYfEBkOqJCBj4GCUMyojjCeazZfhEAAQWtsoA/3hxbtgMtTwPL9JIT23nPuOb18zu/87r3lSHJyIl9iBmi1nTOpDkHwBdufv/adQBY1FIACEApAKAChAIQCEApAKAChAIQCEApAKAChAIQCEEdFEhXlO6PvA/B5/vvdPiMApwBCAQgFIBSAUABCAQgFIBSAUABCAQgFIBSAUABCAYhDIuXzdK4PQDgFEApAKAChAIQCEApAKAChAIQCEApAKAChAIQCEApAHA6uD8D1AQinAEIBCAUgFIBQAEIByOJB+q4OvGNHNjZu3AUAqKkpQGnpdyLXwo8BAEbjCyQlrYfBMDiqjEy2BBrNH3Bz83h9/bvSbv+JE/V2761WKywWM4xGA7q6/kZdXRHa2upE67y5tl45qm8TkZsbNeZx8/K+RmPj76PK28rY2ppsO2P1ccFFAInEGaGh8bBYzLBYzAgNjYdE4jxhvWXL5EhO3jvmPrU6eeSPP6kP5uQEmWwJXF09EBQUhYyME4iO3jmno2toyIjY2AOLLwIolQJcXNzR1lYPiQQICoqCUimgtfW2aD29vhU7d6YjP/8sLBaz3b7U1Azo9a0IDAye9Eh0cpLCy8sPmzfvx7p1aqhUe1BX96tdWa22c2T0iY2q8faJ3Ym7c+cKVKpdCA7egNbW2imP6Mn0a0FGgIiI7QCAu3fLodOV220To7DwJ3h6foD4+CS77aGhUQgIUKKg4Mcp9cNqNaO7+1+UlJwEAKxY4Tano+vWrTyYTEPYsiV98SSBcrkCSqUAo/E5mptr0NxcA6PxOZRKAXK5QrTutWslePKkF7t3f2K3PS0tA319Pbh+XTOtPi1f/qrdR49a5/TkGgz9aGgoh59fCAIDIxaHAGFhakilMjQ1VcFsHobZPIympipIpTKEhalF65rNJhQXX0RAgBLh4RsAAN7eKxEdvQVFRedHTQsT5wFS+PmFICXlMF68eAaN5uScn+CbNy/AbDYhNnZhRoFZzwFsoV6nqxjZ1tDwG9av34GIiO2orS0UrV9cfAH79n2GPXs+hU5Xi5SUgzCZhlFScnFS7Y+X2Ws0p9DT82Dan2uiLP3t3ONtBga60dh4A+HhCfD3X4OHD/9y3Ajg7R0AH5/V6O/vwv37jSPbHzxoQl9fJ3x8VsPbO0D0GIOD/bhx4woiIzchOHgtEhPTcPVqEZ49G5xR35KSvkJW1g9YulQ+5ye5svICrFbrgswFZnV9gOzsDABAaenlUc+5NZpfkJmZA19fFYqKbo2ZRdtet7eXITExDadOnYNcvgIdHWWjsm3b+/+3Y58xS+DiosCaNWHIyjqMVavWIiQkFWfOfCPa/lRGuNjz/Df7OhERUYGYmO3o7VVAr2+ZVJuTKbNg1gdwdnZGXNyr7P3gwWxotY/tfjIzcwAAcXFJcHYWvyfQ3f0P9PoGuLp6oKPjDnp7H02zVy9hMAxCq63CkSNZAIBNm7bNy0g7f/57AEB6+heOOQUIQizc3T0nLOfu7glBiJ2wXHV1wevfl2alf52dr+Z/Dw+veTnRen0LtNoqqFRb4e8f4HhJYEJCCgDg+PHD0GjyxpmH9+LQoW+RkJCC27evix6vvV07btid3s2pDwEAPT1d83ayz507DUGIwf79nztWBFAo3CAIMRgeHkJlZZlIMlSG4eEhCEIMFIp3f1NGKpXBy8sb27Z9jGPHzgIAyssvz9vJbm6+i3v36hEX95FjRQC1Ohky2RJUV1+FwfBU5MbIU9TX34RKtRVqdTIKC3+e9Q8kdrmm1VYhP//suGVtl5BjRZ7xLi/HTj7Fo8Dp05ccKwIkJKQCACoqiiYsaytjq/MuMZlMGBjoh05Xi6NHv0Ru7oEp30yabXS6WrS0/LlgBJDk5ES+nNmI49e63+f2+YWQRQ4FoACEAhAKQCgAoQCEApBFBdcH4PoAhFMAoQCEAhAKQCgAoQCEAhAKQCgAoQCEAhAKQCgAoQDE8ZDyeTr/MYRwCiAUgFAAQgEIBSAUgFAAQgEIBSAUgFAAQgEIBSAUgDgcXB+A6wMQTgGEAhAKQCgAoQCEAhAKQCgAoQCEAhAKQCgAoQCEAhDH4z/mnUJ9Yd62LwAAAABJRU5ErkJggg==" + } + Video: 2180149152352, "Video::file5", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_specular.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + Content: , +"iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgBEC0BSZrFPAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAJS0lEQVR42u2ceVTVVQLHP48HDxRZBZcRlE1QUUIpAdGULUpya6yjx9Kw0hmbbB21daZjajaTU01mecZ0ss3cjtqmpqaJ+6ASSSopiggCGiKyv8f88dREQFBEy76fc94f/N6993d/9/e5++MaZgyYUk0TWHt4U1OiE+97O7r/jbu/DeJ3jQSQAEICCAkgJICQAEICCAkgJICQAEICCAkgJICQAOJmxRDTqU+Tfg+g/fzf9v3VAqgLEBJASAAhAYQEEBJASAAhAYQEEBJASAAhAYQEEBJA3JTYaj9d5wMIdQFCAggJICSAkABCAggJICSAkABCAggJICSAkABCAoibDp0PoPMBhLoAIQGEBBASQEgAIQHE7wfbq4nUN6E/CfcOJCikC67urpirLJQVlXDqWAE56VlkbNtPdtqRGnGmbJhR4++KsgpO55zCc4kPKxcuo7iouMb36zKTG5WXV6OfrXXNvaMnYUMj6NjTH+c2LtgYjZzJP0122hF+WLeHzF0Zdd4r1ieq3vvUF+b8c9WVj8sR+2gitw3vyxRg6bxFvDP1rQbvfR6z2UxZSRm5x3LI35PN9kWbKD1d0vwCmOxNvPTOK0TG1iwEoy2YHEw4t3HFp1cAkaOiGywQk4MJT992PPTX8SSOGMxj94znVP7JJtlcDfQdHUPU6BhsjMaaUnh54O7lQY87w8g9kM2C8W/fsFpnsDHQLfYWzFVmqqkmZkg8706fjcVsblR8o9GIo5Mj/l0D8O8aQLe4UD6a+B6nc39uXgEemjSeyNgojh/N5r//msfu5F2EOXXHaGekpWsrWnf0xKuHD12jQxqssbYOdnj38OG2sf3x", +"6+LPw5P/xGvPTKtdUy5TK6HmSljEyP70S4rHYrGQsnIbe7/YSUFmHjY2Bty8PAi6vTthwyJpF9jhhja7/hFdcHRz4qft+zlZ+jO9B0QQERPJlrWbL99qnCsLg8FAKxcngsN68PhzT9LGvz2xjyay7MUPm1eA2CF3WJu9MU+TfTjLWuscq6kqr6LoRCFFJwo5vPMg372/tsG0qsoqObzzIN+mJzNn1Txu6x/RpEJ1buvK7WPjAPh8+mfsW7f3lyYTyMvIIS8jh51Lkhn0/H03VICQu8IASFudwvf5P9J7QAQJwxMbFOBCS1ddzZnCIratS8bX0p6H5z9Jx1v8mn8Q2LJVSwBKis9es8I4mpEJQCvnVk1Kp+eQcIy2tuxbv7fGy7+UsqISFk9ecMNevoNzS/zCgygrLuXA5h/YvGYTxUXFhEdH4uzmcsXpnco+eUGKZhdg3+4fAHhq+iTcPVtfkwIJvtXaXeQey2lSOp16+gOQ+tWuX/WoOzg+FFs7W/ZvTMNcaaayvIJNX67HzmRH3NA7rjg9n17W5849kN38g8D3pr3N65+8TZ/4fkTERnEoPYPSrDPkZ56gIPMEx9OzKCsqbdRgzcHRAb/wQKLGWZvtb5avbtQIuL4xhWt79yYVxHVr/hOszf/3a1IuXFu95CsGjhhMwvCBLJu/uOFBpMGAm4c7/ROjufuJ+zBXmflu/trmF+Bg2gHG3TWGUY+Nod+d/QkIDoTgi6YnVWay9h5m0/trOL4vq840Lp0OAuzZmsKi9z5qUsHaO9oDUF5c9qt9+Z7+7Wjb+Q8U5pwiKzUTw7nrabtSyT5yjIDgQPy6BnAoPaPRleFsYTFLX/ig3vJuUICr2U9OfXcLqe9uwd3bg2MtCugU4ENAcCChkb3wCQvAO9SXFx6ezI4NW3958ZekUXK2hOzMY2R9l8GupclEe/Vp9Dz/Ys7vp08oPouzqwtbC1I4c/pMo5/l4udvTFnUF6Yx+/oT7p8IwKrF", +"K/jmXPjz6R1an06HJC/GPfQI62Z/0ai8FxzJY3TCCMrLyq/vQtCFAUhWAcmHN5G82vowNkYjE158jGEP3kvS04/UEKC+aV1Tf9BwnhPZJ3B2daFz9yBSkq9sHFBRVoHJwYSNnRFLZe25uNHOuqZQUXr1BW1jNBIzJB6AByYm8cDEpDrDdYu9hfVzvqTaUl1vZbBrYWLMnAl4dGrLsKR7+XTOh1efr2vZxFnMZt7/51wAvP06XtfmNXXbbgASRw6+4rglP1tXIVt7e9T5feuOntbm9lTxVecvIiYSNw/3BsM5ujnhH9HlsmEqSytY8vxCys6UMvaZcUTE9Lk+Aox6cxxu9RTSedp6tQcgPyfvugrw+ScrsFgsDLg7lrhhCfUXsHMrXpn3Wo1rx9Ot/WfPQeF1xgk9d/18uKshYXgiAG88/w9ifaIufF6NfvbC5+tZy2usE1yOwuyTrJz2KQDPvfl3OgX4NL8A3iG+PDL/Ce6Zej/BcaG4tHfDzmSHQ8sWdPD15p6x9zHzg1kALF+w+LoKcDTjCEvmLQJg8usv8NSMyQSFdMHO3oRDCwd8u/jzwONJLNz4Wa2l7D2rdlhf9OBw+iXF4eTpjMHGgJOnM30fjCN0UG9ruM93XN0ilZsL4dGRVJRXsGHVN/WGS9+QSlVFJX7hQTg4t2ww3UPbD7Bg1n9wdHJk6ryZOLk4Ne8YoCivEOc2rgT2DSawr3X4/2cm1ewGLBY+m/sxKxcuvyYvtq5ZQ43B10VjirnTZ2OyNzF09B9JHDm43u4g/dx6xgV59hxi6yffEjlyAFGjY4kaHVsrztaPvyVr7+F683G56ersl9/AzmTH5tUba216XUx5cRk/bd9PUL/uBMeH8r+lWxosn49nf0BAcCD9B0bztznTmHT/E1gsluYR4J0RM/HrHUjnqG60D/KytgAOdlRWVpGfk0fazr2s/HA5B9MO3JBpVnV1Nf9+aRZrl33NoFFD6X5rCK3bemAwGCjI", +"zSd1xx7WrVjDni0pteJunLua7LSj9BoaQbvOHbBvZU95cTm5B7JJWbGVjC0/NqH5HwjAmmVfNxg2bc1ugvp1JyQhrFECAMx8airefh3p2SeMv7z8JG+9+Hqj82aYMWBKk34Wrp9165g48RtGAkgAIQGEBBASQEgAIQHE7wqdD6DzAYS6ACEBhAQQEkBIACEBhAQQEkBIACEBhAQQEkBIACEBxM2HrfbT9Y8hQl2AkABCAggJICSAkABCAggJICSAkABCAggJICSAkADipkPnA+h8AKEuQEgAIQGEBBASQEgAIQGEBBASQEgAIQGEBBASQEgAcfPxf2A9OVhQt049AAAAAElFTkSuQmCC" + } + Video: 2180149136992, "Video::file2", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_transparency.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + Content: , + "iVB", + "ORw", + "0KG", + "goA", + "AAA", + "NSU", + "hEU", + "gAA", + "AIA", + "AAA", + "CAC", + "AYA", + "AAD", + "DPm", + "HLA", + "AAA", + "CXB", + "IWX", + "MAA", + "AsT", + "AAA", + "LEw", + "EAm", + "pwY", + "AAA", + "AB3", + "RJT", + "UUH", + "5Qg", + "BEC", + "4O8", + "giL", + "bgA", + "AAB", + "1pV", + "Fh0", + "Q29", + "tbW", + "Vud", + "AAA", + "AAA", + "AQ3", + "JlY", + "XRl", + "ZCB", + "3aX", + "RoI", + "EdJ", + "TVB", + "kLm", + "UHA", + "AAM", + "/Ul", + "EQV", + "R42", + "u2c", + "eVh", + "V1d", + "6A3", + "yNg", + "oCL", + "hlO", + "AAB", + "AiI", + "oAI", + "hg4", + "SAi", + "AM5", + "pQ1", + "fmp", + "GmV", + "FdL", + "b15", + "tut", + "l8K", + "/Vm", + "ZmX", + "Kh2", + "M5X", + "CU0", + "J9A", + "IkU", + "HFi", + "cEh", + "VDB", + "QSF", + "QQU", + "aZz", + "4P6", + "BB0", + "XOO", + "YDI", + "dfq", + "9z+", + "Pz6", + "F7r", + "7LX", + "29t", + "1r2", + "Gv9", + "tmL", + "A9F", + "lVN", + "IHM", + "hLi", + "m/B", + "wrL", + "x+k", + "/Lt", + "Xfg", + "uEh", + "xoR", + "QAQ", + "QRA", + "BBB", + "BBE", + "AEE", + "EEE", + "QAQ", + "QQQ", + "RAB", + "BBB", + "BEA", + "EEE", + "EEQ", + "AQQ", + "QQH", + "lQU", + "Fv2", + "8mr", + "QfQ", + "Nbz", + "7+/", + "ypQ", + "WQL", + "kAQ", + "AQQ", + "RQB", + "ABB", + "BFA", + "EAE", + "EEU", + "AQA", + "QQR", + "QBA", + "BBB", + "FAE", + "AEE", + "EUA", + "QAY", + "QHE", + "n1Z", + "T5f", + "vAw", + "jSB", + "Qgi", + "gCA", + "CCC", + "KAI", + "AII", + "IoA", + "gAg", + "gig", + "CAC", + "CA8", + "6+v", + "+LQ", + "rKS", + "4hu", + "V32", + "/Gb", + "ABi", + "5v+", + "r1n", + "GVS", + "kVp", + "eQV", + "5BQ", + "XsO", + "/4H", + "a2N", + "i6z", + "3X+", + "29O", + "Y+J", + "zzw", + "IQt", + "mYt", + "H3/", + "9jd", + "a8N", + "5f3", + "0Yq", + "fiD", + "mco", + "jWP", + "uo4", + "3Ez", + "TAl", + "7HD", + "huL", + "sYI", + "+pi", + "QlK", + "pYr", + "Coi", + "Iys", + "7M5", + "nJ7", + "Ob/", + "GJJ", + "Kek", + "PHw", + "C3C", + "n09", + "PRo", + "baS", + "HtZ", + "EZ1", + "uZm", + "DHT", + "pw6", + "i0F", + "HJy", + "c7X", + "mHz", + "EoE", + "KVS", + "CcC", + "IQY", + "F8t", + "nAR", + "KpV", + "KZz", + "klZ", + "WWM", + "G+i", + "nUQ", + "BNP", + "NKy", + "Jd9", + "99g", + "kB/", + "b1r", + "HTc", + "wMM", + "DIy", + "BCz", + "xzr", + "h5e", + "bKa", + "xNe", + "xNL", + "D++", + "ETQ", + "NNF", + "q1s", + "FTU", + "+St", + "hZB", + "ARi", + "3Ms", + "LR0", + "oKJ", + "Q4O", + "wNj", + "fj/", + "Ten", + "MWX", + "W2x", + "p/5", + "+/l", + "SYd", + "27f", + "g9I", + "REU", + "CgZ", + "4eu", + "Dv5", + "Ul0", + "3B6", + "d5f", + "2at", + "I+x", + "vj5", + "4OT", + "qQk", + "H6s", + "3vr", + "949", + "UpB", + "PT3", + "5s+", + "zZ/", + "n3k", + "jDi", + "k5O", + "5WF", + "CIg", + "b4+", + "HUx", + "Nsb", + "a0w", + "K23", + "M8E", + "BAT", + "IGa", + "ApV", + "QNG", + "1Eh", + "KPH", + "ueT", + "VWs", + "A8H", + "Dpq", + "zX/", + "mOB", + "hAG", + "zYt", + "p0N", + "W7f", + "VOq", + "aLN", + "b/F", + "UlZ", + "Rwb", + "iBf", + "g2q", + "14i", + "gQQ", + "BMe", + "PPv", + "RGz", + "fwf", + "kLF", + "6u7", + "q7I", + "ycv", + "Lyi", + "E3a", + "y7z", + "FS/", + "B75", + "jkR", + "4E5", + "xNv", + "9Ct", + "RSV", + "lRr", + "TTU", + "1M8", + "PPy", + "pKi", + "4mK", + "jY3", + "UTF", + "7qa", + "ouB", + "g/L", + "09M", + "TUx", + "0nv", + "vSl", + "WJ2", + "7D+", + "Ag0", + "V3X", + "Gyt", + "661", + "Lm1", + "atA", + "Ci+", + "evX", + "+Gw", + "TeD", + "+vZ", + "mvL", + "4eX", + "oCc", + "DLv", + "vMY", + "6PO", + "3jR", + "UsD", + "A6I", + "PHM", + "bcr", + "R8A", + "cWl", + "HGe", + "bhz", + "sTQ", + "UDb", + "EJW", + "g9d", + "2ZC", + "HF+", + "ezm", + "DI+", + "jWM", + "cXd", + "lw/", + "JlW", + "utk", + "5eX", + "Dse", + "yz9", + "LW1", + "5us", + "vv2", + "D++", + "o1c", + "ulJ", + "8R6", + "+/O", + "e//", + "fdU", + "CKB", + "QKO", + "rZv", + "z0v", + "PjG", + "HeB", + "++h", + "VCo", + "J3x", + "6tM", + "W+Q", + "uxs", + "AUc", + "kHa", + "o5t", + "33+", + "gVp", + "ouc", + "vLy", + "2BS", + "9E0", + "9XF", + "1yc", + "eun", + "M+/", + "2mL", + "Vwt", + "KcW", + "7V0", + "/Wf", + "/AO", + "P/5", + "9Gr", + "OeH", + "8uz", + "A56", + "kn7", + "0db", + "VsZ", + "Pdz", + "TwO", + "aYR", + "l4s", + "KOC", + "Vmb", + "PJU", + "tS9", + "BGu", + "zzt", + "h2M", + "Sf3", + "4iV", + "STm", + "fVH", + "E/L", + "PMP", + "ZCx", + "ex7", + "WKO", + "tVl", + "nTu", + "Xm6", + "Sz3", + "u+U", + "rGD", + "U4i", + "Kkh", + "Ewi", + "ZMV", + "Nrv", + "oyz", + "55g", + "0bw", + "HjB", + "vrz", + "pLM", + "jtl", + "3Ms", + "e1i", + "XpO", + "uVK", + "k4c", + "iqT", + "/98", + "Wxd", + "Ezf", + "4oA", + "TeV", + "k1h", + "mCJ", + "4RQ", + "Wla", + "msQ", + "kcf", + "P0J", + "jz5", + "wqE", + "5aV", + "PJB", + "QgY", + "HMt", + "jdj", + "UWR", + "v+o", + "s59", + "SZP", + "9n+", + "eyx", + "D/f", + "3o2", + "cOW", + "o39", + "kaM", + "2bd", + "6mA", + "ues", + "2MH", + "fdB", + "rp1", + "7ID", + "FY5", + "2w6", + "PwY", + "tl3", + "M6W", + "PzO", + "K49", + "bOh", + "jbc", + "W7Y", + "SvY", + "e/x", + "Eve", + "9I/", + "lfT", + "xft", + "CAP", + "XNa", + "N3K", + "iMi", + "wpd", + "hYW", + "RLy", + "zFi", + "+X7", + "mqb", + "p+m", + "UBD", + "g0h", + "uAF", + "wcF", + "8OI", + "gzV", + "OvA", + "Jfe", + "fL9", + "pS7", + "1lf", + "7ts", + "OUP", + "9/Z", + "gaM", + "oFX", + "336", + "vQf", + "XNz", + "r9A", + "dv4", + "F9q", + "Qdr", + "anT", + "6yO", + "DGe", + "3jz", + "ctD", + "BtU", + "SQF", + "qAR", + "nD1", + "Wgm", + "TZs", + "4iM", + "nwp", + "b4V", + "O5s", + "Tp0", + "2Te", + "8ok", + "rj5", + "72m", + "Bob", + "13s", + "uU2", + "NjP", + "Hra", + "cyp", + "+t8", + "58R", + "//I", + "ICY", + "hgS", + "BfX", + "2ws", + "LW6", + "r3p", + "VVV", + "YRt", + "jWK", + "0jz", + "fdO", + "nW4", + "K0/", + "6A9", + "MFZ", + "OXk", + "8OY", + "/P2", + "Tp3", + "C9Y", + "8OE", + "cpi", + "5az", + "Jm/", + "zte", + "kD7", + "ne/", + "M9f", + "H8H", + "mxL", + "0az", + "/GU", + "Zz9", + "mjB", + "3FE", + "Hc3", + "Vi/", + "5sd", + "4yF", + "4Yv", + "x8/", + "Li9", + "cmv", + "Kgx", + "fcH", + "rU5", + "i7b", + "gPZ", + "16e", + "mmu", + "jcz", + "hSA", + "/ML", + "L8h", + "6gq", + "cQk", + "JjL", + "/x6", + "UYt", + "2nN", + "pxM", + "nYG", + "xUP", + "cpu", + "26o", + "V/R", + "zsK", + "K+o", + "IOb", + "wEe", + "2/P", + "3yE", + "8oo", + "K+j", + "nY1", + "ftO", + "AOB", + "gah", + "qJB", + "w4y", + "PHC", + "gxn", + "Rna", + "yvC", + "/zG", + "dj0", + "PGM", + "9C1", + "D2b", + "tTD", + "HQ0", + "8Ow", + "ZUu", + "6dm", + "jP0", + "096", + "8+X", + "klw", + "HYe", + "H36", + "KV1", + "AE1", + "m0f", + "AWO", + "dj0", + "Y6u", + "/Hn", + "Jde", + "YOY", + "PYQ", + "S69", + "sFA", + "X5+", + "4lD", + "SKS", + "0q1", + "/ra", + "4pJ", + "S9x", + "07g", + "49y", + "LkU", + "GDC", + "F+3", + "vkF", + "jgd", + "ULF", + "2hM", + "O19", + "YSK", + "dHH", + "6W/", + "kyP", + "9nR", + "w1d", + "wOV", + "lay", + "N2U", + "1kQ", + "pII", + "cKe", + "Y8e", + "HH2", + "Nvb", + "42J", + "rw9", + "RRw", + "3G0", + "sqg", + "Z6d", + "dHV", + "PJB", + "fJx", + "7MS", + "Z4a", + "IME", + "iN+", + "fzK", + "G0d", + "Pr2", + "qvs", + "f/N", + "xH/", + "8Ld", + "3g7", + "vXj", + "2x6", + "9YV", + "s/a", + "mGL", + "VsS", + "YVK", + "RX7", + "hZV", + "Izs", + "4iM", + "TyL", + "j7L", + "l77", + "92K", + "fCl", + "Uvh", + "QqP", + "MSI", + "ACK", + "AIA", + "III", + "oDw", + "cCL", + "fB5", + "DvA", + "wjS", + "BQg", + "Pbx", + "dwJ", + "092", + "69p", + "2SU", + "kp2", + "bnn", + "iIy", + "KZu", + "WGj", + "RTp", + "2Cr", + "1+o", + "hgx", + "vj2", + "B+A", + "/sX", + "t0r", + "tVr", + "ihe", + "4Vl", + "JKT", + "m4u", + "sUl", + "7+X", + "H1T", + "1wq", + "LKy", + "3ft", + "q4e", + "ady", + "Q2I", + "F1O", + "fVt", + "rJn", + "Y2n", + "B+K", + "dH4", + "+Xm", + "ilm", + "nTu", + "jr6", + "5N3", + "Pp/", + "klB", + "T2Z", + "ueS", + "fH2", + "fwe", + "eTX", + "sKj", + "pz2", + "/7E", + "lkw", + "cZI", + "jee", + "aMX", + "YUT", + "3n2", + "IzH", + "9GO", + "+EL", + "b+3", + "WwA", + "jI0", + "N6P", + "P44", + "M0O", + "nsG", + "X5M", + "jq2", + "b6+", + "5Et", + "fX8", + "JUq", + "FUq", + "Vig", + "CX3", + "rRQ", + "KBp", + "cjp", + "6eH", + "sZt", + "WuN", + "ga0", + "Po+", + "BfY", + "umI", + "ZXc", + "3M7", + "ui1", + "qGM", + "FGs", + "sbE", + "0PY", + "sXo", + "lE8", + "aOw", + "dbK", + "ija", + "tW2", + "P4y", + "CNY", + "duv", + "KmG", + "FD+", + "Sp0", + "Iou", + "nTw", + "Vg0", + "S+b", + "qVA", + "qCf", + "Z4g", + "q4d", + "6t6", + "rbh", + "07M", + "MTd", + "jbK", + "KCh", + "ZGb", + "Lr3", + "WgA", + "16i", + "fBy", + "NCQ", + "J3o", + "788", + "7Uv", + "2Fv", + "Y82", + "s10", + "J56", + "+NP", + "6+R", + "Xr+", + "HvP", + "XYc", + "BQr", + "cHe", + "zw6", + "Glf", + "755", + "8vx", + "mzy", + "UyI", + "Q6F", + "QYG", + "Jsj", + "Kuz", + "E29", + "NmY", + "yDr", + "Y3O", + "eIG", + "bn9", + "SGD", + "sIa", + "Gys", + "A8O", + "r4c", + "Ux/", + "ZRK", + "VlZ", + "Ws2", + "hjB", + "msj", + "NZG", + "Rmo", + "qen", + "h2W", + "3rg", + "zxG", + "0DI", + "c8/", + "So1", + "sXA", + "HIu", + "XCR", + "iTy", + "LPD", + "PBh", + "ylN", + "DeT", + "98Z", + "a3z", + "TQ4", + "egr", + "6eH", + "j/v", + "+p3", + "cSw", + "X3/", + "hig", + "pLS", + "U3X", + "v3M", + "fOT", + "zwD", + "w9f", + "DQm", + "E+9", + "hr9", + "j/8", + "Gaj", + "ZtD", + "GrB", + "xU0", + "1VV", + "RWF", + "RUX", + "s2h", + "PPG", + "x/M", + "qZZ", + "KR7", + "zA7", + "dDY", + "WIE", + "unR", + "9jx", + "uRJ", + "AEy", + "f8x", + "Hvf", + "TmX", + "tBM", + "nKC", + "sv5", + "1pJ", + "CUf", + "/yG", + "De4", + "iW8", + "8Ol", + "X7D", + "t2Y", + "4fQ", + "8h0", + "7Kb", + "hyh", + "f5O", + "jjh", + "ZWd", + "Yc7", + "2Vl", + "QX8", + "nR/", + "IuF", + "bBq", + "Z8z", + "9NQ", + "g8m", + "ZUF", + "QFv", + "jNn", + "XS1", + "Gv4", + "xSU", + "l7E", + "lLZ", + "09a", + "OsU", + "lJf", + "Rzs", + "KPt", + "9f3", + "2jR", + "qHZ", + "OdU", + "S6E", + "lXu", + "B2a", + "Wys", + "wLj", + "Roz", + "EwM", + "GBz", + "9E4", + "io6", + "K15", + "iu6", + "do1", + "ZS8", + "Jr/", + "n2t", + "rIy", + "wbV", + "HVL", + "cjw", + "oTd", + "ak6", + "eq/", + "/5d", + "5K+", + "UXw", + "91u", + "28E", + "cHN", + "2rm", + "7iN", + "MTw", + "qdf", + "wY4", + "+kU", + "aFU", + "UaF", + "UEX", + "skF", + "QN9", + "fQJ", + "d+z", + "S6L", + "G+3", + "6pY", + "jtR", + "n23", + "f20", + "63e", + "USi", + "XjA", + "/3r", + "zev", + "l5g", + "rAu", + "s1b", + "Gl3", + "Olq", + "T9Z", + "OSc", + "xcG", + "iO3", + "59n", + "PFx", + "cqS", + "npQ", + "XJJ", + "zKI", + "S02", + "/d2", + "cBd", + "Z7u", + "Nm0", + "Y4O", + "nBu", + "9P+", + "BkD", + "E9h", + "118", + "mjb", + "vz/", + "Mw5", + "0gd", + "7ea", + "AA5", + "dKB", + "QKO", + "rRr", + "x7A", + "AP6", + "a9H", + "IJS", + "qeT", + "fS5", + "Y2e", + "Lai", + "axZ", + "wM3", + "8VF", + "LLr", + "0BG", + "Cnn", + "DF0", + "aI7", + "6Tq", + "2eH", + "c3N", + "78u", + "4vH", + "bun", + "cLI", + "zbz", + "zdR", + "QXh", + "k2G", + "KVK", + "RYV", + "SyT", + "daZ", + "gb3", + "nAC", + "abn", + "Dig", + "YMs", + "Xrm", + "61j", + "EHG", + "5sm", + "7d+", + "/dT", + "oIN", + "+IF", + "Dqa", + "lN4", + "vUq", + "3fG", + "EOj", + "al3", + "GB/", + "ry9", + "dJn", + "WfG", + "1aV", + "3df", + "RcX", + "Ft1", + "VOa", + "mYW", + "vx0", + "6gn", + "/f6", + "h3O", + "a2N", + "269", + "xze", + "E+2", + "AFe", + "vXS", + "MrO", + "4fI", + "qGj", + "C16", + "6j4", + "pa+", + "a0x", + "wdb", + "/W1", + "P37", + "N8Y", + "aN+", + "IFG", + "jJL", + "acw", + "sQE", + "12/", + "gXi", + "UtP", + "x7e", + "2Ej", + "bkZ", + "mTq", + "u/V", + "ETE", + "4zb", + "tOZ", + "y0Z", + "Xbu", + "n8/", + "bNp", + "aI8", + "CyH", + "Tvv", + "/Rd", + "Bmm", + "6wr", + "rn7", + "iEG", + "BQM", + "P27", + "1dW", + "VWm", + "dBj", + "YkX", + "uBO", + "sir", + "6N3", + "x7O", + "zEu", + "0J/", + "o/6", + "zTm", + "Ods", + "3l8", + "8am", + "JCL", + "zs7", + "4vc", + "n31", + "Y5+", + "Zdv", + "7CA", + "uLS", + "9vl", + "mu5", + "a6+", + "C1b", + "H79", + "aHe", + "v6+", + "7pa", + "mOF", + "7h8", + "5Qp", + "vhU", + "7G3", + "9ur", + "eWc", + "153", + "JJO", + "noc", + "Hyd", + "Hrb", + "ECS", + "Yeq", + "W7X", + "nRw", + "znX", + "uau", + "CaC", + "O05", + "+/P", + "gK/", + "GbM", + "1/p", + "m/P", + "qLB", + "7wT", + "U8Q", + "IAC", + "z6c", + "g42", + "lZb", + "O3A", + "i1a", + "tNA", + "aK/", + "DzL", + "5FU", + "VlY", + "SPD", + "CAU", + "YOD", + "tJ6", + "nta", + "Ehn", + "02c", + "8HA", + "JoI", + "7dL", + "ysv", + "b/D", + "+/Y", + "a8E", + "7g5", + "XiB", + "s7h", + "eYt", + "DVu", + "tmt", + "IP/", + "Mnh", + "0+e", + "0ho", + "rcD", + "LrD", + "GFr", + "1gI", + "w75", + "/v8", + "fns", + "WTg", + "72P", + "NIy", + "5YY", + "GRp", + "ib2", + "3NG", + "xND", + "WP3", + "uTD", + "wdH", + "e6a", + "AM3", + "yfY", + "D6B", + "lbq", + "2P2", + "4lD", + "RSd", + "0Xr", + "/k8", + "N9C", + "Nog", + "C8u", + "7do", + "Svr", + "P2N", + "DIz", + "Ia5", + "OWV", + "szM", + "nE/", + "kop", + "vby", + "fCF", + "33L", + "zB/", + "C6o", + "wf6", + "psG", + "ahr", + "DaL", + "pPX", + "1WU", + "1Io", + "VuL", + "UuP", + "ycf", + "oWN", + "3C0", + "b29", + "+L5", + "kcN", + "5fq", + "Tm7", + "uBQ", + "Wnq", + "96/", + "ra0", + "u/L", + "XcE", + "35v", + "717", + "9/f", + "uG1", + "7rR", + "lDQ", + "/j8", + "p7W", + "cPp", + "dbE", + "y/Q", + "XMT", + "vT9", + "YZ7", + "l0F", + "LNi", + "4id", + "e+/", + "pbt", + "+5L", + "Jyc", + "+np", + "KyM", + "0vJ", + "ycv", + "Lz2", + "ZK0", + "n/9", + "7fS", + "qjJ", + "k2+", + "ay2", + "AxA", + "VIX", + "IDw", + "MCM", + "CiA", + "CCC", + "CCI", + "AII", + "III", + "gAg", + "ggg", + "iAC", + "CCC", + "CIA", + "III", + "IIg", + "Awo", + "ONf", + "B9A", + "vg8", + "gSB", + "cgi", + "ACC", + "CCC", + "IAI", + "III", + "IgA", + "ggg", + "giA", + "CCC", + "CCI", + "AII", + "III", + "gAg", + "ggg", + "iAD", + "Cg4", + "dEB", + "0t0", + "sCB", + "dgC", + "ACC", + "CKA", + "IAI", + "IIo", + "AgA", + "ggi", + "gCA", + "CCC", + "KAI", + "AII", + "IoA", + "gAg", + "gig", + "CAC", + "CA8", + "e/w", + "Uhx", + "yKN", + "56t", + "CMg", + "AAA", + "ABJ", + "RU5", + "Erk", + "Jgg", + "g==" + } + Video: 2180149156192, "Video::file6", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:/Dev/clean/ufbx/data/textures/checkerboard_reflection.png" + P: "RelPath", "KString", "XRefUrl", "", "textures\checkerboard_reflection.png" + } + UseMipMap: 0 + Filename: "D:/Dev/clean/ufbx/data/textures/checkerboard_reflection.png" + RelativeFilename: "textures\checkerboard_reflection.png" + Content: , +"i", +"V", +"B", +"O", +"R", +"w", +"0", +"K", +"G", +"g", +"o", +"A", +"A", +"A", +"A", +"N", +"S", +"U", +"h", +"E", +"U", +"g", +"A", +"A", +"A", +"I", +"A", +"A", +"A", +"A", +"C", +"A", +"C", +"A", +"Y", +"A", +"A", +"A", +"D", +"D", +"P", +"m", +"H", +"L", +"A", +"A", +"A", +"A", +"C", +"X", +"B", +"I", +"W", +"X", +"M", +"A", +"A", +"A", +"s", +"T", +"A", +"A", +"A", +"L", +"E", +"w", +"E", +"A", +"m", +"p", +"w", +"Y", +"A", +"A", +"A", +"A", +"B", +"3", +"R", +"J", +"T", +"U", +"U", +"H", +"5", +"Q", +"g", +"B", +"E", +"C", +"0", +"e", +"x", +"J", +"L", +"I", +"y", +"Q", +"A", +"A", +"A", +"B", +"1", +"p", +"V", +"F", +"h", +"0", +"Q", +"2", +"9", +"t", +"b", +"W", +"V", +"u", +"d", +"A", +"A", +"A", +"A", +"A", +"A", +"A", +"Q", +"3", +"J", +"l", +"Y", +"X", +"R", +"l", +"Z", +"C", +"B", +"3", +"a", +"X", +"R", +"o", +"I", +"E", +"d", +"J", +"T", +"V", +"B", +"k", +"L", +"m", +"U", +"H", +"A", +"A", +"A", +"H", +"W", +"E", +"l", +"E", +"Q", +"V", +"R", +"4", +"2", +"u", +"2", +"c", +"e", +"1", +"C", +"U", +"1", +"x", +"m", +"H", +"n", +"7", +"0", +"R", +"G", +"2", +"Q", +"y", +"n", +"Z", +"g", +"L", +"K", +"k", +"K", +"4", +"K", +"K", +"g", +"Z", +"U", +"c", +"c", +"b", +"V", +"o", +"V", +"E", +"J", +"Q", +"i", +"o", +"V", +"K", +"M", +"E", +"3", +"e", +"r", +"E", +"W", +"1", +"S", +"K", +"s", +"d", +"G", +"J", +"0", +"Z", +"h", +"W", +"0", +"6", +"b", +"T", +"N", +"t", +"P", +"o", +"J", +"B", +"k", +"d", +"p", +"9", +"F", +"6", +"t", +"6", +"I", +"m", +"h", +"K", +"J", +"o", +"J", +"A", +"Y", +"d", +"t", +"W", +"q", +"C", +"i", +"o", +"I", +"i", +"M", +"S", +"W", +"V", +"F", +"N", +"Q", +"o", +"B", +"F", +"H", +"R", +"w", +"t", +"I", +"/", +"n", +"O", +"2", +"A", +"7", +"r", +"K", +"7", +"U", +"E", +"a", +"z", +"/", +"p", +"6", +"/", +"2", +"G", +"/", +"P", +"+", +"c", +"7", +"7", +"s", +"c", +"8", +"5", +"5", +"3", +"v", +"P", +"t", +"3", +"s", +"M", +"C", +"U", +"M", +"W", +"1", +"t", +"M", +"C", +"i", +"k", +"r", +"2", +"t", +"6", +"Q", +"6", +"X", +"Y", +"I", +"G", +"o", +"/", +"b", +"v", +"X", +"/", +"t", +"G", +"x", +"E", +"O", +"N", +"B", +"J", +"A", +"A", +"Q", +"g", +"I", +"I", +"C", +"S", +"A", +"k", +"g", +"J", +"A", +"A", +"Q", +"g", +"I", +"I", +"C", +"S", +"A", +"k", +"g", +"J", +"A", +"A", +"Q", +"g", +"I", +"I", +"C", +"S", +"A", +"k", +"g", +"J", +"A", +"A", +"w", +"l", +"s", +"x", +"h", +"A", +"X", +"+", +"r", +"E", +"X", +"f", +"B", +"9", +"D", +"z", +"/", +"B", +"9", +"3", +"+", +"x", +"o", +"B", +"N", +"A", +"U", +"I", +"C", +"S", +"A", +"k", +"g", +"J", +"A", +"A", +"Q", +"g", +"I", +"I", +"C", +"S", +"A", +"k", +"g", +"J", +"A", +"A", +"Q", +"g", +"I", +"I", +"C", +"S", +"A", +"k", +"g", +"J", +"A", +"A", +"Q", +"g", +"I", +"I", +"C", +"S", +"C", +"8", +"E", +"r", +"O", +"e", +"p", +"2", +"t", +"/", +"A", +"K", +"E", +"p", +"Q", +"E", +"g", +"A", +"I", +"Q", +"G", +"E", +"B", +"B", +"A", +"S", +"Q", +"E", +"g", +"A", +"I", +"Q", +"G", +"E", +"B", +"B", +"A", +"S", +"Q", +"E", +"g", +"A", +"I", +"Q", +"G", +"E", +"B", +"B", +"A", +"S", +"Q", +"E", +"g", +"A", +"4", +"X", +"V", +"o", +"f", +"w", +"D", +"t", +"D", +"y", +"A", +"0", +"B", +"Q", +"g", +"J", +"I", +"C", +"S", +"A", +"k", +"A", +"B", +"C", +"A", +"g", +"g", +"J", +"I", +"B", +"4", +"e", +"z", +"P", +"Y", +"/", +"z", +"p", +"U", +"c", +"a", +"P", +"R", +"G", +"X", +"V", +"0", +"d", +"N", +"2", +"7", +"U", +"8", +"F", +"1", +"p", +"G", +"Q", +"d", +"y", +"j", +"/", +"C", +"X", +"V", +"Z", +"u", +"p", +"u", +"P", +"r", +"D", +"P", +"S", +"f", +"I", +"/", +"O", +"J", +"3", +"b", +"j", +"W", +"U", +"G", +"L", +"3", +"I", +"4", +"z", +"q", +"d", +"g", +"w", +"Y", +"1", +"i", +"s", +"3", +"+", +"u", +"i", +"m", +"a", +"E", +"4", +"+", +"d", +"k", +"N", +"B", +"A", +"U", +"q", +"x", +"J", +"D", +"I", +"j", +"q", +"x", +"d", +"P", +"+", +"T", +"2", +"I", +"x", +"m", +"y", +"k", +"v", +"v", +"0", +"z", +"e", +"l", +"6", +"f", +"4", +"N", +"O", +"M", +"z", +"D", +"h", +"4", +"4", +"5", +"v", +"B", +"/", +"5", +"U", +"5", +"b", +"z", +"u", +"J", +"y", +"d", +"E", +"3", +"h", +"X", +"U", +"O", +"Z", +"M", +"D", +"G", +"J", +"P", +"v", +"0", +"i", +"e", +"d", +"r", +"/", +"C", +"Q", +"D", +"K", +"y", +"y", +"5", +"z", +"5", +"H", +"A", +"e", +"m", +"z", +"Z", +"8", +"Q", +"t", +"H", +"Z", +"8", +"y", +"6", +"v", +"/", +"Y", +"9", +"L", +"t", +"3", +"D", +"g", +"8", +"1", +"N", +"O", +"y", +"9", +"i", +"v", +"3", +"+", +"w", +"s", +"a", +"J", +"P", +"J", +"h", +"J", +"+", +"f", +"L", +"+", +"E", +"R", +"o", +"Y", +"R", +"H", +"h", +"J", +"I", +"4", +"e", +"j", +"g", +"p", +"Y", +"2", +"d", +"T", +"W", +"l", +"r", +"m", +"l", +"T", +"0", +"h", +"d", +"c", +"5", +"k", +"Z", +"q", +"d", +"N", +"x", +"m", +"Q", +"y", +"N", +"T", +"o", +"e", +"G", +"N", +"S", +"R", +"w", +"K", +"C", +"O", +"J", +"I", +"2", +"N", +"o", +"+", +"B", +"0", +"E", +"U", +"k", +"J", +"U", +"1", +"s", +"t", +"B", +"o", +"M", +"B", +"5", +"i", +"+", +"Y", +"y", +"c", +"v", +"T", +"k", +"j", +"E", +"a", +"G", +"w", +"/", +"O", +"w", +"S", +"G", +"d", +"C", +"A", +"7", +"p", +"x", +"P", +"i", +"U", +"k", +"X", +"y", +"0", +"a", +"j", +"P", +"v", +"/", +"m", +"E", +"l", +"9", +"U", +"6", +"W", +"8", +"G", +"p", +"u", +"3", +"m", +"L", +"c", +"x", +"G", +"i", +"H", +"A", +"j", +"g", +"d", +"A", +"e", +"4", +"2", +"0", +"m", +"A", +"w", +"8", +"N", +"h", +"j", +"f", +"v", +"T", +"s", +"3", +"Z", +"2", +"5", +"8", +"6", +"Y", +"R", +"H", +"h", +"H", +"K", +"G", +"4", +"t", +"T", +"m", +"T", +"1", +"j", +"k", +"d", +"s", +"9", +"y", +"p", +"2", +"e", +"0", +"d", +"K", +"V", +"M", +"E", +"9", +"6", +"u", +"D", +"O", +"m", +"z", +"5", +"x", +"A", +"2", +"t", +"w", +"p", +"2", +"G", +"w", +"2", +"N", +"m", +"/", +"4", +"h", +"K", +"1", +"b", +"M", +"v", +"m", +"6", +"u", +"A", +"S", +"T", +"y", +"U", +"R", +"g", +"U", +"E", +"d", +"i", +"4", +"4", +"Z", +"g", +"n", +"T", +"S", +"G", +"b", +"t", +"2", +"7", +"3", +"N", +"N", +"r", +"7", +"S", +"t", +"x", +"d", +"/", +"c", +"s", +"Z", +"/", +"E", +"0", +"V", +"S", +"5", +"1", +"z", +"s", +"t", +"M", +"n", +"Z", +"F", +"C", +"X", +"V", +"0", +"d", +"6", +"9", +"d", +"u", +"Z", +"3", +"v", +"6", +"T", +"s", +"4", +"X", +"l", +"9", +"w", +"Z", +"n", +"c", +"K", +"C", +"G", +"D", +"s", +"u", +"n", +"p", +"c", +"m", +"j", +"G", +"L", +"a", +"K", +"x", +"O", +"o", +"q", +"b", +"n", +"N", +"+", +"8", +"t", +"W", +"O", +"2", +"w", +"r", +"+", +"+", +"9", +"f", +"M", +"v", +"r", +"F", +"g", +"f", +"S", +"N", +"C", +"u", +"f", +"o", +"o", +"b", +"O", +"e", +"C", +"W", +"C", +"n", +"v", +"r", +"6", +"e", +"y", +"s", +"o", +"q", +"9", +"u", +"U", +"c", +"o", +"v", +"R", +"C", +"G", +"V", +"l", +"7", +"1", +"t", +"G", +"v", +"f", +"0", +"+", +"v", +"6", +"/", +"n", +"t", +"O", +"z", +"z", +"F", +"n", +"F", +"9", +"N", +"A", +"W", +"D", +"+", +"3", +"L", +"f", +"J", +"z", +"N", +"j", +"b", +"6", +"P", +"0", +"z", +"h", +"c", +"W", +"c", +"K", +"S", +"x", +"m", +"7", +"e", +"p", +"0", +"/", +"v", +"T", +"e", +"m", +"6", +"0", +"W", +"R", +"8", +"e", +"O", +"/", +"s", +"x", +"M", +"t", +"W", +"K", +"z", +"2", +"U", +"i", +"b", +"9", +"R", +"a", +"f", +"7", +"W", +"7", +"c", +"M", +"Q", +"p", +"P", +"n", +"2", +"P", +"p", +"6", +"X", +"M", +"c", +"O", +"3", +"K", +"C", +"5", +"R", +"8", +"u", +"Z", +"W", +"a", +"q", +"l", +"R", +"3", +"b", +"d", +"j", +"o", +"8", +"1", +"4", +"7", +"N", +"+", +"x", +"k", +"x", +"s", +"i", +"/", +"j", +"r", +"d", +"E", +"u", +"B", +"X", +"D", +"r", +"J", +"r", +"C", +"k", +"p", +"B", +"Q", +"A", +"W", +"3", +"2", +"9", +"1", +"w", +"m", +"Q", +"M", +"j", +"E", +"J", +"i", +"8", +"V", +"C", +"V", +"m", +"b", +"O", +"P", +"R", +"9", +"+", +"Q", +"y", +"o", +"q", +"f", +"m", +"D", +"q", +"5", +"P", +"m", +"t", +"F", +"k", +"f", +"y", +"h", +"F", +"G", +"Y", +"z", +"W", +"Y", +"y", +"d", +"u", +"y", +"+", +"5", +"8", +"N", +"v", +"y", +"K", +"6", +"s", +"f", +"W", +"R", +"8", +"v", +"B", +"u", +"z", +"2", +"U", +"x", +"y", +"y", +"i", +"j", +"H", +"s", +"V", +"6", +"t", +"J", +"i", +"c", +"7", +"j", +"8", +"4", +"R", +"A", +"f", +"T", +"o", +"H", +"d", +"J", +"y", +"A", +"a", +"I", +"G", +"9", +"g", +"a", +"g", +"4", +"F", +"S", +"R", +"1", +"w", +"n", +"Q", +"P", +"6", +"o", +"X", +"A", +"N", +"u", +"2", +"Z", +"j", +"0", +"Q", +"c", +"W", +"x", +"3", +"0", +"q", +"s", +"b", +"s", +"j", +"1", +"9", +"Z", +"6", +"M", +"6", +"j", +"t", +"i", +"2", +"a", +"T", +"+", +"1", +"t", +"b", +"W", +"M", +"n", +"x", +"j", +"d", +"v", +"C", +"n", +"A", +"Y", +"D", +"D", +"Q", +"r", +"t", +"1", +"P", +"i", +"Y", +"t", +"/", +"j", +"l", +"l", +"p", +"k", +"6", +"i", +"t", +"r", +"W", +"X", +"5", +"e", +"x", +"8", +"1", +"+", +"+", +"7", +"b", +"0", +"Z", +"z", +"X", +"V", +"B", +"1", +"3", +"7", +"v", +"h", +"b", +"k", +"g", +"3", +"Y", +"4", +"w", +"n", +"o", +"1", +"P", +"6", +"B", +"k", +"N", +"s", +"e", +"x", +"9", +"n", +"C", +"r", +"1", +"2", +"W", +"P", +"V", +"N", +"Q", +"3", +"K", +"i", +"O", +"I", +"y", +"5", +"d", +"r", +"G", +"R", +"/", +"T", +"j", +"7", +"P", +"x", +"f", +"Y", +"i", +"v", +"F", +"s", +"A", +"Z", +"w", +"s", +"u", +"u", +"C", +"e", +"A", +"o", +"x", +"T", +"n", +"y", +"p", +"U", +"K", +"Z", +"k", +"5", +"7", +"g", +"x", +"N", +"5", +"B", +"V", +"4", +"3", +"A", +"r", +"R", +"t", +"+", +"y", +"g", +"A", +"V", +"V", +"X", +"V", +"D", +"0", +"Q", +"c", +"1", +"d", +"U", +"3", +"X", +"J", +"a", +"9", +"d", +"u", +"0", +"6", +"A", +"H", +"5", +"+", +"v", +"k", +"2", +"W", +"2", +"7", +"o", +"h", +"l", +"+", +"h", +"h", +"k", +"Y", +"y", +"3", +"x", +"r", +"B", +"k", +"w", +"T", +"r", +"H", +"A", +"r", +"h", +"6", +"n", +"n", +"z", +"h", +"2", +"0", +"u", +"8", +"O", +"v", +"1", +"D", +"b", +"t", +"/", +"y", +"a", +"f", +"L", +"Z", +"c", +"3", +"N", +"6", +"b", +"O", +"e", +"g", +"Q", +"U", +"7", +"P", +"6", +"e", +"i", +"4", +"o", +"2", +"P", +"O", +"s", +"g", +"h", +"3", +"4", +"6", +"m", +"5", +"+", +"R", +"8", +"s", +"F", +"g", +"s", +"9", +"u", +"w", +"2", +"j", +"+", +"t", +"p", +"N", +"j", +"6", +"/", +"h", +"7", +"v", +"b", +"d", +"z", +"W", +"r", +"s", +"5", +"e", +"z", +"X", +"Z", +"I", +"8", +"j", +"M", +"u", +"J", +"5", +"r", +"l", +"+", +"/", +"1", +"W", +"R", +"d", +"3", +"7", +"Z", +"t", +"A", +"L", +"h", +"x", +"/", +"b", +"b", +"D", +"9", +"u", +"z", +"H", +"i", +"k", +"p", +"g", +"T", +"3", +"Y", +"k", +"L", +"4", +"y", +"I", +"w", +"f", +"h", +"o", +"G", +"W", +"c", +"K", +"i", +"+", +"8", +"p", +"Y", +"3", +"Q", +"0", +"N", +"C", +"Z", +"G", +"L", +"+", +"L", +"F", +"u", +"C", +"V", +"c", +"+", +"P", +"Y", +"S", +"A", +"Y", +"F", +"P", +"k", +"j", +"g", +"m", +"y", +"m", +"t", +"X", +"w", +"i", +"5", +"d", +"r", +"L", +"y", +"T", +"Z", +"n", +"V", +"u", +"f", +"1", +"/", +"j", +"u", +"F", +"h", +"W", +"A", +"c", +"A", +"z", +"Y", +"a", +"7", +"j", +"C", +"A", +"7", +"1", +"v", +"1", +"O", +"n", +"v", +"M", +"J", +"l", +"2", +"R", +"U", +"f", +"r", +"A", +"d", +"g", +"1", +"i", +"9", +"/", +"4", +"d", +"l", +"N", +"Y", +"M", +"3", +"N", +"2", +"7", +"y", +"9", +"c", +"D", +"3", +"V", +"1", +"2", +"5", +"i", +"n", +"T", +"K", +"U", +"P", +"g", +"O", +"6", +"e", +"K", +"U", +"A", +"p", +"0", +"/", +"8", +"E", +"4", +"D", +"Y", +"h", +"D", +"7", +"3", +"N", +"Y", +"5", +"T", +"J", +"7", +"4", +"B", +"Y", +"O", +"g", +"L", +"v", +"V", +"y", +"W", +"H", +"R", +"p", +"3", +"p", +"0", +"x", +"+", +"3", +"n", +"n", +"X", +"9", +"w", +"u", +"F", +"x", +"X", +"y", +"x", +"7", +"z", +"D", +"D", +"Y", +"g", +"c", +"T", +"E", +"h", +"r", +"o", +"W", +"R", +"Z", +"Q", +"9", +"t", +"1", +"V", +"3", +"v", +"3", +"t", +"V", +"g", +"B", +"e", +"e", +"3", +"M", +"c", +"A", +"Y", +"F", +"P", +"e", +"J", +"0", +"A", +"2", +"Z", +"n", +"H", +"s", +"N", +"l", +"s", +"D", +"I", +"p", +"5", +"l", +"p", +"j", +"h", +"k", +"c", +"6", +"H", +"X", +"d", +"9", +"H", +"W", +"P", +"y", +"O", +"t", +"d", +"X", +"i", +"2", +"J", +"V", +"x", +"l", +"L", +"q", +"6", +"O", +"m", +"K", +"G", +"R", +"z", +"J", +"g", +"U", +"F", +"e", +"n", +"5", +"Q", +"Y", +"M", +"7", +"k", +"r", +"0", +"s", +"E", +"h", +"q", +"a", +"+", +"v", +"Y", +"9", +"e", +"l", +"R", +"t", +"8", +"6", +"9", +"4", +"v", +"1", +"1", +"G", +"I", +"1", +"G", +"Z", +"s", +"y", +"y", +"e", +"p", +"4", +"G", +"f", +"n", +"X", +"k", +"H", +"B", +"t", +"X", +"5", +"+", +"D", +"r", +"2", +"4", +"b", +"F", +"7", +"1", +"h", +"p", +"6", +"/", +"c", +"T", +"r", +"x", +"K", +"g", +"9", +"F", +"+", +"X", +"y", +"U", +"g", +"/", +"C", +"M", +"C", +"r", +"C", +"8", +"a", +"Q", +"O", +"m", +"8", +"0", +"Y", +"V", +"0", +"6", +"Y", +"L", +"G", +"Y", +"e", +"K", +"S", +"N", +"h", +"a", +"D", +"g", +"p", +"0", +"i", +"e", +"F", +"M", +"O", +"q", +"T", +"a", +"/", +"R", +"N", +"y", +"q", +"8", +"1", +"e", +"I", +"o", +"+", +"/", +"d", +"V", +"0", +"j", +"f", +"m", +"Y", +"j", +"Q", +"a", +"e", +"f", +"0", +"3", +"y", +"b", +"w", +"y", +"J", +"5", +"G", +"Q", +"M", +"H", +"9", +"8", +"f", +"M", +"z", +"4", +"+", +"J", +"g", +"J", +"D", +"v", +"V", +"n", +"R", +"l", +"o", +"C", +"r", +"/", +"/", +"6", +"z", +"j", +"L", +"x", +"3", +"9", +"b", +"v", +"4", +"1", +"J", +"5", +"p", +"V", +"v", +"n", +"P", +"p", +"5", +"3", +"m", +"i", +"O", +"H", +"j", +"5", +"M", +"w", +"8", +"n", +"n", +"3", +"0", +"8", +"C", +"G", +"p", +"G", +"/", +"M", +"J", +"S", +"S", +"s", +"P", +"Q", +"O", +"j", +"u", +"7", +"N", +"g", +"y", +"U", +"u", +"8", +"N", +"W", +"8", +"N", +"N", +"l", +"u", +"9", +"y", +"+", +"z", +"h", +"/", +"5", +"n", +"W", +"e", +"Z", +"o", +"2", +"e", +"h", +"L", +"P", +"m", +"p", +"X", +"Z", +"+", +"P", +"h", +"Y", +"i", +"E", +"/", +"q", +"T", +"2", +"x", +"C", +"H", +"6", +"f", +"T", +"Q", +"V", +"H", +"h", +"h", +"W", +"b", +"H", +"f", +"n", +"c", +"8", +"9", +"t", +"c", +"N", +"0", +"+", +"O", +"N", +"q", +"3", +"P", +"w", +"8", +"T", +"H", +"z", +"8", +"+", +"T", +"B", +"x", +"C", +"f", +"1", +"J", +"z", +"6", +"p", +"v", +"5", +"M", +"c", +"P", +"5", +"c", +"t", +"a", +"/", +"d", +"5", +"1", +"P", +"6", +"K", +"D", +"9", +"b", +"y", +"1", +"4", +"3", +"L", +"m", +"i", +"c", +"A", +"w", +"J", +"9", +"/", +"n", +"0", +"6", +"H", +"T", +"u", +"3", +"o", +"0", +"S", +"u", +"E", +"6", +"W", +"k", +"J", +"r", +"F", +"y", +"W", +"6", +"T", +"W", +"j", +"Q", +"H", +"0", +"9", +"r", +"F", +"y", +"e", +"y", +"e", +"d", +"7", +"j", +"h", +"M", +"3", +"s", +"i", +"8", +"R", +"z", +"w", +"b", +"y", +"+", +"O", +"N", +"+", +"Y", +"D", +"B", +"w", +"5", +"f", +"s", +"q", +"C", +"k", +"6", +"W", +"k", +"L", +"v", +"3", +"J", +"P", +"n", +"H", +"v", +"2", +"n", +"1", +"W", +"N", +"a", +"s", +"3", +"E", +"3", +"u", +"3", +"n", +"x", +"G", +"j", +"O", +"5", +"H", +"9", +"8", +"h", +"n", +"/", +"h", +"f", +"H", +"1", +"e", +"+", +"r", +"K", +"M", +"g", +"v", +"I", +"e", +"v", +"j", +"f", +"3", +"C", +"+", +"2", +"P", +"M", +"H", +"c", +"o", +"c", +"O", +"f", +"s", +"X", +"J", +"4", +"w", +"X", +"0", +"6", +"N", +"m", +"t", +"8", +"X", +"p", +"P", +"w", +"p", +"C", +"F", +"L", +"V", +"r", +"f", +"1", +"d", +"e", +"6", +"t", +"U", +"2", +"c", +"+", +"B", +"E", +"j", +"A", +"S", +"S", +"A", +"k", +"A", +"B", +"C", +"A", +"g", +"g", +"J", +"I", +"C", +"S", +"A", +"k", +"A", +"D", +"i", +"o", +"U", +"L", +"7", +"A", +"2", +"h", +"/", +"A", +"K", +"E", +"p", +"Q", +"E", +"g", +"A", +"I", +"Q", +"G", +"E", +"B", +"B", +"A", +"S", +"Q", +"E", +"g", +"A", +"I", +"Q", +"G", +"E", +"B", +"B", +"A", +"S", +"Q", +"E", +"g", +"A", +"I", +"Q", +"G", +"E", +"B", +"B", +"A", +"S", +"Q", +"E", +"g", +"A", +"4", +"X", +"2", +"Y", +"9", +"T", +"x", +"d", +"P", +"w", +"w", +"R", +"m", +"g", +"K", +"E", +"B", +"B", +"A", +"S", +"Q", +"E", +"g", +"A", +"I", +"Q", +"G", +"E", +"B", +"B", +"A", +"S", +"Q", +"E", +"g", +"A", +"I", +"Q", +"G", +"E", +"B", +"B", +"A", +"S", +"Q", +"E", +"g", +"A", +"I", +"Q", +"G", +"E", +"B", +"B", +"B", +"e", +"h", +"/", +"Y", +"H", +"0", +"P", +"4", +"A", +"Q", +"l", +"O", +"A", +"k", +"A", +"B", +"C", +"A", +"g", +"g", +"J", +"I", +"C", +"S", +"A", +"k", +"A", +"B", +"C", +"A", +"g", +"g", +"J", +"I", +"C", +"S", +"A", +"k", +"A", +"B", +"C", +"A", +"g", +"g", +"J", +"I", +"C", +"S", +"A", +"k", +"A", +"D", +"C", +"+", +"/", +"g", +"v", +"4", +"A", +"+", +"Y", +"m", +"6", +"/", +"Z", +"Z", +"e", +"A", +"A", +"A", +"A", +"A", +"A", +"S", +"U", +"V", +"O", +"R", +"K", +"5", +"C", +"Y", +"I", +"I", +"=" + } + Texture: 2180149151392, "Texture::file1", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file1" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file1" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_diffuse.png" + RelativeFilename: "textures\checkerboard_diffuse.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180149152832, "Texture::file4", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file4" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file4" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_emissive.png" + RelativeFilename: "textures\checkerboard_emissive.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180149144192, "Texture::file3", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file3" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file3" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_ambient.png" + RelativeFilename: "textures\checkerboard_ambient.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180149139392, "Texture::file5", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file5" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file5" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_specular.png" + RelativeFilename: "textures\checkerboard_specular.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180149135552, "Texture::file2", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file2" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file2" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_transparency.png" + RelativeFilename: "textures\checkerboard_transparency.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + Texture: 2180149146112, "Texture::file6", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::file6" + Properties70: { + P: "CurrentTextureBlendMode", "enum", "", "",0 + P: "UVSet", "KString", "", "", "map1" + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::file6" + FileName: "D:/Dev/clean/ufbx/data/textures/checkerboard_reflection.png" + RelativeFilename: "textures\checkerboard_reflection.png" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + AnimationStack: 2180249157920, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2180157285776, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2179263690608,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2180157285776,2180249157920 + + ;Texture::file4, Material::phong1 + C: "OP",2180149152832,2180149143232, "EmissiveColor" + + ;Texture::file3, Material::phong1 + C: "OP",2180149144192,2180149143232, "AmbientColor" + + ;Texture::file1, Material::phong1 + C: "OP",2180149151392,2180149143232, "DiffuseColor" + + ;Texture::file2, Material::phong1 + C: "OP",2180149135552,2180149143232, "TransparentColor" + + ;Texture::file5, Material::phong1 + C: "OP",2180149139392,2180149143232, "SpecularColor" + + ;Texture::file6, Material::phong1 + C: "OP",2180149146112,2180149143232, "ReflectionColor" + + ;Video::file1, Texture::file1 + C: "OO",2180149146592,2180149151392 + + ;Video::file4, Texture::file4 + C: "OO",2180149147552,2180149152832 + + ;Video::file3, Texture::file3 + C: "OO",2180149134592,2180149144192 + + ;Video::file5, Texture::file5 + C: "OO",2180149152352,2180149139392 + + ;Video::file2, Texture::file2 + C: "OO",2180149136992,2180149135552 + + ;Video::file6, Texture::file6 + C: "OO",2180149156192,2180149146112 + + ;Geometry::, Model::pCube1 + C: "OO",2179854704896,2179263690608 + + ;Material::phong1, Model::pCube1 + C: "OO",2180149143232,2179263690608 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_texture_split_7500_binary.fbx b/modules/ufbx/data/synthetic_texture_split_7500_binary.fbx new file mode 100644 index 0000000..3b90397 Binary files /dev/null and b/modules/ufbx/data/synthetic_texture_split_7500_binary.fbx differ diff --git a/modules/ufbx/data/synthetic_truncated_crease_full_7700_ascii.fbx b/modules/ufbx/data/synthetic_truncated_crease_full_7700_ascii.fbx new file mode 100644 index 0000000..3a2c2c7 --- /dev/null +++ b/modules/ufbx/data/synthetic_truncated_crease_full_7700_ascii.fbx @@ -0,0 +1,431 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 18 + Hour: 22 + Minute: 38 + Second: 2 + Millisecond: 740 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_truncated_crease_partial_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_truncated_crease_partial_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "18/12/2022 20:38:02.739" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_truncated_crease_partial_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "18/12/2022 20:38:02.739" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",192442325000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2206498705616, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2206527113520, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *12 { + a: -0.499999970197678,-3.72529029846191e-08,0.5,0.5,-3.72529029846191e-08,0.5,-0.499999970197678,-3.72529029846191e-08,-0.499999970197678,0.5,-3.72529029846191e-08,-0.499999970197678 + } + PolygonVertexIndex: *4 { + a: 0,1,3,-3 + } + Edges: *4 { + a: 0,3,1,2 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *12 { + a: 0,1,0,0,1,0,0,1,0,0,1,0 + } + NormalsW: *4 { + a: 1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: *12 { + a: 0,0,-1,0,0,-1,0,0,-1,0,0,-1 + } + BinormalsW: *4 { + a: 1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: *12 { + a: 1,-0,0,1,0,0,1,0,0,1,0,0 + } + TangentsW: *4 { + a: 1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 0,0,1,0,0,1,1,1 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *0 { a: } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2205989638144, "Model::pPlane1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2204190380208, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2206692422064, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationLayer: 2206489682496, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pPlane1, Model::RootNode + C: "OO",2205989638144,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2206489682496,2206692422064 + + ;Geometry::, Model::pPlane1 + C: "OO",2206527113520,2205989638144 + + ;Material::lambert1, Model::pPlane1 + C: "OO",2204190380208,2205989638144 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + } +} diff --git a/modules/ufbx/data/synthetic_truncated_crease_partial_7700_ascii.fbx b/modules/ufbx/data/synthetic_truncated_crease_partial_7700_ascii.fbx new file mode 100644 index 0000000..f98d200 --- /dev/null +++ b/modules/ufbx/data/synthetic_truncated_crease_partial_7700_ascii.fbx @@ -0,0 +1,433 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 18 + Hour: 22 + Minute: 38 + Second: 2 + Millisecond: 740 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_truncated_crease_partial_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_truncated_crease_partial_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "18/12/2022 20:38:02.739" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_truncated_crease_partial_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "18/12/2022 20:38:02.739" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",192442325000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2206498705616, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2206527113520, "Geometry::", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 1 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *12 { + a: -0.499999970197678,-3.72529029846191e-08,0.5,0.5,-3.72529029846191e-08,0.5,-0.499999970197678,-3.72529029846191e-08,-0.499999970197678,0.5,-3.72529029846191e-08,-0.499999970197678 + } + PolygonVertexIndex: *4 { + a: 0,1,3,-3 + } + Edges: *4 { + a: 0,3,1,2 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *12 { + a: 0,1,0,0,1,0,0,1,0,0,1,0 + } + NormalsW: *4 { + a: 1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: *12 { + a: 0,0,-1,0,0,-1,0,0,-1,0,0,-1 + } + BinormalsW: *4 { + a: 1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: *12 { + a: 1,-0,0,1,0,0,1,0,0,1,0,0 + } + TangentsW: *4 { + a: 1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 0,0,1,0,0,1,1,1 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *2 { + a: 0.25,0.5 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2205989638144, "Model::pPlane1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2204190380208, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2206692422064, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationLayer: 2206489682496, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pPlane1, Model::RootNode + C: "OO",2205989638144,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2206489682496,2206692422064 + + ;Geometry::, Model::pPlane1 + C: "OO",2206527113520,2205989638144 + + ;Material::lambert1, Model::pPlane1 + C: "OO",2204190380208,2205989638144 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + } +} diff --git a/modules/ufbx/data/synthetic_truncated_quot_fail_7500_ascii.fbx b/modules/ufbx/data/synthetic_truncated_quot_fail_7500_ascii.fbx new file mode 100644 index 0000000..e380272 --- /dev/null +++ b/modules/ufbx/data/synthetic_truncated_quot_fail_7500_ascii.fbx @@ -0,0 +1,358 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 31 + Hour: 21 + Minute: 36 + Second: 34 + Millisecond: 164 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_cube_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "31/03/2020 18:36:34.162" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1907658664160, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1908558533920, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1907292239120, "Model::Mod&quo diff --git a/modules/ufbx/data/synthetic_unicode_7500_binary.fbx b/modules/ufbx/data/synthetic_unicode_7500_binary.fbx new file mode 100644 index 0000000..b65f34f Binary files /dev/null and b/modules/ufbx/data/synthetic_unicode_7500_binary.fbx differ diff --git a/modules/ufbx/data/synthetic_unicode_error_identity_6100_ascii.fbx b/modules/ufbx/data/synthetic_unicode_error_identity_6100_ascii.fbx new file mode 100644 index 0000000..551d6ba --- /dev/null +++ b/modules/ufbx/data/synthetic_unicode_error_identity_6100_ascii.fbx @@ -0,0 +1,764 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 5 + Day: 17 + Hour: 0 + Minute: 57 + Second: 7 + Millisecond: 816 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "Model" { + Count: 3 + } + ObjectType: "Material" { + Count: 3 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::Parent", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",0.01,0.01,0.01 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::Parent_ncl1_1" + } + Model: "Model::Child_Á", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",-1,1,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::Child_Á_ncl1_1" + } + Model: "Model::Child_Â", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",1,1,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementBinormal: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0 + ,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + LayerElementTangent: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0 + ,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementSmoothing: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: 0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::Child_Â_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_unicode_error_identity_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_unicode_error_identity_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "2022" + Property: "Original|DateTime_GMT", "DateTime", "", "16/05/2022 21:57:07.815" + Property: "Original|FileName", "KString", "", "D:\Dev\clean\ufbx\data\synthetic_unicode_error_identity_6100_ascii.fbx" + + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "2022" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "16/05/2022 21:57:07.815" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\clean\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\utf_identity.mb" + } + } + Material: "Material::Material_Á", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",1,0,0 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.800000011920929,0,0 + Property: "Opacity", "double", "",1 + } + } + Material: "Material::Material_Â", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0,1,0 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0,0.800000011920929,0 + Property: "Opacity", "double", "",1 + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",100 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",384884650000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::Parent", "Model::Scene" + Connect: "OO", "Model::Child_Á", "Model::Parent" + Connect: "OO", "Model::Child_Â", "Model::Parent" + Connect: "OO", "Material::lambert1", "Model::Parent" + Connect: "OO", "Material::Material_Á", "Model::Child_Á" + Connect: "OO", "Material::Material_Â", "Model::Child_Â" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 1176000000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/synthetic_unicode_error_identity_6100_binary.fbx b/modules/ufbx/data/synthetic_unicode_error_identity_6100_binary.fbx new file mode 100644 index 0000000..cdb419b Binary files /dev/null and b/modules/ufbx/data/synthetic_unicode_error_identity_6100_binary.fbx differ diff --git a/modules/ufbx/data/synthetic_unicode_error_identity_7700_ascii.fbx b/modules/ufbx/data/synthetic_unicode_error_identity_7700_ascii.fbx new file mode 100644 index 0000000..e2493ba --- /dev/null +++ b/modules/ufbx/data/synthetic_unicode_error_identity_7700_ascii.fbx @@ -0,0 +1,715 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 5 + Day: 17 + Hour: 2 + Minute: 43 + Second: 58 + Millisecond: 795 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_unicode_error_identity_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_unicode_error_identity_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "16/05/2022 23:43:58.794" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_unicode_error_identity_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "16/05/2022 23:43:58.794" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + P: "Original|ApplicationNativeFile", "KString", "", "", "W:\Temp\ufbx_test_source\utf_identity.mb" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",100 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1308517291184, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 12 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 3 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 3 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 3 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1308512788032, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1308512785120, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1308512784288, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1308271683472, "Model::Parent", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.01,0.01,0.01 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1308271692752, "Model::Child_Á", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-1,1,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1308271695072, "Model::Child_Â", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1,1,0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1308284387712, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + Material: 1308284394912, "Material::Material_Á", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",1,0,0 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0,0 + P: "Opacity", "double", "Number", "",1 + } + } + Material: 1308284396112, "Material::Material_Â", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0,1,0 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0,0.800000011920929,0 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1308517182352, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1308512886832, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Parent, Model::RootNode + C: "OO",1308271683472,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1308512886832,1308517182352 + + ;Geometry::, Model::Parent + C: "OO",1308512788032,1308271683472 + + ;Material::lambert1, Model::Parent + C: "OO",1308284387712,1308271683472 + + ;Model::Child_Á, Model::Parent + C: "OO",1308271692752,1308271683472 + + ;Model::Child_Â, Model::Parent + C: "OO",1308271695072,1308271683472 + + ;Geometry::, Model::Child_Á + C: "OO",1308512785120,1308271692752 + + ;Material::Material_Á, Model::Child_Á + C: "OO",1308284394912,1308271692752 + + ;Geometry::, Model::Child_Â + C: "OO",1308512784288,1308271695072 + + ;Material::Material_Â, Model::Child_Â + C: "OO",1308284396112,1308271695072 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/synthetic_unicode_error_identity_7700_binary.fbx b/modules/ufbx/data/synthetic_unicode_error_identity_7700_binary.fbx new file mode 100644 index 0000000..16546d2 Binary files /dev/null and b/modules/ufbx/data/synthetic_unicode_error_identity_7700_binary.fbx differ diff --git a/modules/ufbx/data/synthetic_unnormalized_7700_ascii.fbx b/modules/ufbx/data/synthetic_unnormalized_7700_ascii.fbx new file mode 100644 index 0000000..1a95ffb --- /dev/null +++ b/modules/ufbx/data/synthetic_unnormalized_7700_ascii.fbx @@ -0,0 +1,412 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 12 + Day: 18 + Hour: 23 + Minute: 28 + Second: 16 + Millisecond: 132 + } + Creator: "FBX SDK/FBX Plugins version 2020.3" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_unnormalized_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_unnormalized_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2023" + P: "Original|DateTime_GMT", "DateTime", "", "", "18/12/2022 21:28:16.130" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_unnormalized_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2023" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "18/12/2022 21:28:16.130" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",192442325000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2206701213888, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2206527036016, "Geometry::", "Mesh" { + Vertices: *12 { + a: -0.5,0,0.5,0.5,0,0.5,-0.5,0,-0.5,0.5,0,-0.5 + } + PolygonVertexIndex: *4 { + a: 0,1,3,-3 + } + Edges: *4 { + a: 0,3,1,2 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *12 { + a: 0,0,0,0,1,0,0,2,0,0,3,0 + } + NormalsW: *4 { + a: 1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Binormals: *12 { + a: 0,0,-0,0,0,-1,0,0,-2,0,0,-3 + } + BinormalsW: *4 { + a: 1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Tangents: *12 { + a: 0,-0,0,1,0,0,2,0,0,3,0,0 + } + TangentsW: *4 { + a: 1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *8 { + a: 0,0,1,0,0,1,1,1 + } + UVIndex: *4 { + a: 0,1,3,2 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2205989631184, "Model::pPlane1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2204190365408, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2203383138112, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStop", "KTime", "Time", "",38488465000 + P: "ReferenceStop", "KTime", "Time", "",38488465000 + } + } + AnimationLayer: 2206489509824, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pPlane1, Model::RootNode + C: "OO",2205989631184,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2206489509824,2203383138112 + + ;Geometry::, Model::pPlane1 + C: "OO",2206527036016,2205989631184 + + ;Material::lambert1, Model::pPlane1 + C: "OO",2204190365408,2205989631184 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 0,38488465000 + ReferenceTime: 0,38488465000 + } +} diff --git a/modules/ufbx/data/synthetic_unsafe_cube_7500_binary.fbx b/modules/ufbx/data/synthetic_unsafe_cube_7500_binary.fbx new file mode 100644 index 0000000..dc5f93f Binary files /dev/null and b/modules/ufbx/data/synthetic_unsafe_cube_7500_binary.fbx differ diff --git a/modules/ufbx/data/synthetic_vertex_gaps.obj b/modules/ufbx/data/synthetic_vertex_gaps.obj new file mode 100644 index 0000000..e255ca6 --- /dev/null +++ b/modules/ufbx/data/synthetic_vertex_gaps.obj @@ -0,0 +1,16 @@ +# This file uses centimeters as units for non-parametric coordinates. + +v -0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +g pPlane1 +f 1/1/1 2/2/2 4/4/3 3/3/4 diff --git a/modules/ufbx/data/synthetic_vertex_gaps_7700_ascii.fbx b/modules/ufbx/data/synthetic_vertex_gaps_7700_ascii.fbx new file mode 100644 index 0000000..00dd01d --- /dev/null +++ b/modules/ufbx/data/synthetic_vertex_gaps_7700_ascii.fbx @@ -0,0 +1,404 @@ +; FBX 7.7.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1004 + FBXVersion: 7700 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 9 + Hour: 15 + Minute: 25 + Second: 29 + Millisecond: 653 + } + Creator: "FBX SDK/FBX Plugins version 2020.1" + OtherFlags: { + TCDefinition: 127 + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_vertex_gaps_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\synthetic_vertex_gaps_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "2022" + P: "Original|DateTime_GMT", "DateTime", "", "", "09/06/2022 12:25:29.652" + P: "Original|FileName", "KString", "", "", "D:\Dev\clean\ufbx\data\synthetic_vertex_gaps_7700_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "2022" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "09/06/2022 12:25:29.652" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\clean\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2199174430672, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2200363066608, "Geometry::", "Mesh" { + Vertices: *21 { + a: + -1.0,-1.1,-1.2, + -0.5,0,0.5, + 0.5,0,0.5, + -2.0,-2.1,-2.2, + -0.5,0,-0.5, + 0.5,0,-0.5, + -3.0,-3.1,-3.2 + } + PolygonVertexIndex: *4 { + a: 1,2,5,-5 + } + Edges: *4 { + a: 0,3,1,2 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *24 { + a: + -1.0,-1.1,-1.2, + 0,1,0, + 0,1,0, + -2.0,-2.1,-2.2, + 0,1,0, + 0,1,0, + -3.0,-3.1,-3.2, + -4.0,-4.1,-4.2 + } + NormalsW: *4 { + a: 1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *16 { + a: + -1.3,-1.4, + 0,0, + -2.3,-2.4, + 1,0, + 0,1, + -3.3,-3.4, + 1,1, + -4.3,-4.4, + } + UVIndex: *4 { + a: 1,3,6,4 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2200361292448, "Model::pPlane1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2200130937056, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2200767665248, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2200203952352, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pPlane1, Model::RootNode + C: "OO",2200361292448,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2200203952352,2200767665248 + + ;Geometry::, Model::pPlane1 + C: "OO",2200363066608,2200361292448 + + ;Material::lambert1, Model::pPlane1 + C: "OO",2200130937056,2200361292448 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/data/textures/checkerboard_ambient.png b/modules/ufbx/data/textures/checkerboard_ambient.png new file mode 100644 index 0000000..f91597f Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_ambient.png differ diff --git a/modules/ufbx/data/textures/checkerboard_bump.png b/modules/ufbx/data/textures/checkerboard_bump.png new file mode 100644 index 0000000..d5b12ad Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_bump.png differ diff --git a/modules/ufbx/data/textures/checkerboard_diffuse.png b/modules/ufbx/data/textures/checkerboard_diffuse.png new file mode 100644 index 0000000..9b4d25b Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_diffuse.png differ diff --git a/modules/ufbx/data/textures/checkerboard_displacement.png b/modules/ufbx/data/textures/checkerboard_displacement.png new file mode 100644 index 0000000..3d4355b Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_displacement.png differ diff --git a/modules/ufbx/data/textures/checkerboard_emissive.png b/modules/ufbx/data/textures/checkerboard_emissive.png new file mode 100644 index 0000000..c1d180f Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_emissive.png differ diff --git a/modules/ufbx/data/textures/checkerboard_metallic.png b/modules/ufbx/data/textures/checkerboard_metallic.png new file mode 100644 index 0000000..d1bd152 Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_metallic.png differ diff --git a/modules/ufbx/data/textures/checkerboard_normal.png b/modules/ufbx/data/textures/checkerboard_normal.png new file mode 100644 index 0000000..add93a2 Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_normal.png differ diff --git a/modules/ufbx/data/textures/checkerboard_reflection.png b/modules/ufbx/data/textures/checkerboard_reflection.png new file mode 100644 index 0000000..3a83a36 Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_reflection.png differ diff --git a/modules/ufbx/data/textures/checkerboard_roughness.png b/modules/ufbx/data/textures/checkerboard_roughness.png new file mode 100644 index 0000000..f8879db Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_roughness.png differ diff --git a/modules/ufbx/data/textures/checkerboard_specular.png b/modules/ufbx/data/textures/checkerboard_specular.png new file mode 100644 index 0000000..ac1e876 Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_specular.png differ diff --git a/modules/ufbx/data/textures/checkerboard_transparency.png b/modules/ufbx/data/textures/checkerboard_transparency.png new file mode 100644 index 0000000..f8795cb Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_transparency.png differ diff --git a/modules/ufbx/data/textures/checkerboard_vector_displacement.png b/modules/ufbx/data/textures/checkerboard_vector_displacement.png new file mode 100644 index 0000000..4b7dd6e Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_vector_displacement.png differ diff --git a/modules/ufbx/data/textures/checkerboard_weight.png b/modules/ufbx/data/textures/checkerboard_weight.png new file mode 100644 index 0000000..e72f6d7 Binary files /dev/null and b/modules/ufbx/data/textures/checkerboard_weight.png differ diff --git a/modules/ufbx/data/textures/marvelous_quad_diffuse_100-1.png b/modules/ufbx/data/textures/marvelous_quad_diffuse_100-1.png new file mode 100644 index 0000000..503619e Binary files /dev/null and b/modules/ufbx/data/textures/marvelous_quad_diffuse_100-1.png differ diff --git a/modules/ufbx/data/textures/marvelous_quad_normal_100-1.png b/modules/ufbx/data/textures/marvelous_quad_normal_100-1.png new file mode 100644 index 0000000..e60a7cd Binary files /dev/null and b/modules/ufbx/data/textures/marvelous_quad_normal_100-1.png differ diff --git a/modules/ufbx/data/textures/tiny_clouds.png b/modules/ufbx/data/textures/tiny_clouds.png new file mode 100644 index 0000000..4ec2f5b Binary files /dev/null and b/modules/ufbx/data/textures/tiny_clouds.png differ diff --git a/modules/ufbx/data/zbrush_cut_sphere.obj b/modules/ufbx/data/zbrush_cut_sphere.obj new file mode 100644 index 0000000..fbf087b --- /dev/null +++ b/modules/ufbx/data/zbrush_cut_sphere.obj @@ -0,0 +1,410 @@ +# ufbx:bad_normals +# ufbx:no_subdivision +# File exported by ZBrush version 2022 +# www.zbrush.com +#Vertex Count 172 +#Face Count 228 +#Auto scale x=1.000000 y=1.000000 z=1.000000 +#Auto offset x=0.000000 y=0.000000 z=0.000000 +v -0.98010718 0.12768475 0.11158492 +v -0.89838713 0.31792798 -0.29638087 +v -0.94652473 0.23007731 0.20818394 +v -0.94297075 0.3179284 0.04311286 +v -0.98725915 0.12184575 -0.02609073 +v -0.92050069 0.15890109 -0.34513363 +v -0.96944761 0.14497532 -0.17353734 +v -0.9302895 0.32712215 -0.13768619 +v -0.8222236 0.41910907 -0.37498658 +v -0.81457686 0.23141451 -0.52284997 +v -0.82929951 0.52964109 -0.1523236 +v -0.83828604 0.52469039 0.11028178 +v -0.67083716 0.71872204 0.16119276 +v -0.66654086 0.71421289 -0.19116044 +v -0.66371595 0.55786407 -0.48312038 +v -0.46665993 0.84626734 -0.23314559 +v -0.46753364 0.66078031 -0.57114541 +v -0.46214258 0.37072759 -0.79922807 +v -0.65666848 0.30947357 -0.67989862 +v -0.4726555 0.31866252 0.81559425 +v -0.6739875 0.24900098 0.68593633 +v -0.84323155 0.16516518 0.50232434 +v -0.67804729 0.54555523 0.48040032 +v -0.83788287 0.40227717 0.35824781 +v -0.47711229 0.65881294 0.56866014 +v -0.47140893 0.8566457 0.18801371 +v -0.24565041 0.73335808 0.62018907 +v -0.24398984 0.94401729 0.20374569 +v -0.24093011 0.92839223 -0.26950308 +v 0 0.97316306 0.21061213 +v 0 0.94863796 -0.30558648 +v -0.24190755 0.726601 -0.6339665 +v 0 0.75046593 -0.65631806 +v 0 0.42125389 -0.90286636 +v -0.23907336 0.40755841 -0.8763709 +v 0 0.37743896 0.92054879 +v -0.24352607 0.36420643 0.8945865 +v 0 0.76310068 0.64186292 +v 0.98010718 0.12768475 0.11158492 +v 0.89838713 0.31792798 -0.29638087 +v 0.94652473 0.23007731 0.20818394 +v 0.94297075 0.3179284 0.04311286 +v 0.98725915 0.12184575 -0.02609073 +v 0.9878335 -0.01467168 0.11806793 +v 0.94550603 0.07295569 0.30585157 +v 0.92050069 0.15890109 -0.34513363 +v 0.96944761 0.14497532 -0.17353734 +v 0.9302895 0.32712215 -0.13768619 +v 0.8222236 0.41910907 -0.37498658 +v 0.81457686 0.23141451 -0.52284997 +v 0.82929951 0.52964109 -0.1523236 +v 0.83828604 0.52469039 0.11028178 +v 0.67083716 0.71872204 0.16119276 +v 0.66654086 0.71421289 -0.19116044 +v 0.66371595 0.55786407 -0.48312038 +v 0.46665993 0.84626734 -0.23314559 +v 0.46753364 0.66078031 -0.57114541 +v 0.46214258 0.37072759 -0.79922807 +v 0.65666848 0.30947357 -0.67989862 +v 0.452416 0.00834787 -0.88605153 +v 0.64748364 0.00433321 -0.75719308 +v 0.81358063 -0.00374025 -0.57381415 +v 0.92128348 -0.01170464 -0.37482267 +v 0.97711622 -0.01903297 -0.19079792 +v 0.4726555 0.31866252 0.81559425 +v 0.6739875 0.24900098 0.68593633 +v 0.84323155 0.16516518 0.50232434 +v 0.67804729 0.54555523 0.48040032 +v 0.83788287 0.40227717 0.35824781 +v 0.47711229 0.65881294 0.56866014 +v 0.47140893 0.8566457 0.18801371 +v 0.24565041 0.73335808 0.62018907 +v 0.24398984 0.94401729 0.20374569 +v 0.24093011 0.92839223 -0.26950308 +v 0.24190755 0.726601 -0.6339665 +v 0.23907336 0.40755841 -0.8763709 +v 0.23296484 0.00964324 -0.96688467 +v 0.24352607 0.36420643 0.8945865 +v -0.9886071 0.09391331 -0.02771973 +v -0.98180502 0.09641814 0.11300885 +v -0.94566863 0.09792506 0.29033052 +v -0.45338159 0.04430902 -0.87743544 +v -0.64912468 0.05879378 -0.74339771 +v -0.81390261 0.07250332 -0.55729007 +v -0.92084926 0.08301854 -0.35833859 +v -0.97203046 0.08978426 -0.1793456 +v -0.67288148 0.09020388 0.7059617 +v -0.47189587 0.08111393 0.8478111 +v -0.84131926 0.09623277 0.5102806 +v -0.91807657 0.09768575 0.35854411 +v -0.0000002 0.01476168 -0.9944508 +v -0.23326787 0.02938163 -0.96239519 +v -0.24353224 0.06931436 0.93788838 +v -0.00000056 0.05540394 0.96979081 +v 0.99433982 -0.02487075 -0.03464794 +v 0.99159818 -0.02330982 0.03287601 +v 0.64690816 -0.01893866 -0.75258469 +v 0.81299841 -0.0250982 -0.57000255 +v 0.98765415 -0.02575779 -0.09684658 +v 0.67231977 0.00992929 0.71608483 +v 0.47171518 0.02481484 0.85544633 +v 0.83853727 -0.0040344 0.5218538 +v 0.94041782 -0.01440382 0.31529974 +v 0.05387738 0.01166117 -0.98850774 +v 0.23290264 0.00143206 -0.96520519 +v 0.24353352 0.04026138 0.94215464 +v 0.98709356 -0.02124989 0.11939752 +v 0.98427403 -0.02081954 0.13204884 +v 0.92086273 -0.02745926 -0.37221169 +v 0.97643667 -0.02701783 -0.19017839 +v 0.45217061 -0.00997257 -0.88236045 +v 0.50686699 -0.01249089 -0.84591001 +v 0.37225484 -0.0046074 -0.85414588 +v 0.36795279 -0.0055922 -0.91417998 +v -0.00496673 0.01748448 -0.87722516 +v -0.01323765 0.01559133 -0.99263173 +v -0.38218832 0.03957635 -0.90030443 +v -0.38250953 0.03950271 -0.90479075 +v -0.39617237 0.04042927 -0.89951711 +v 0.76483917 -0.02331219 -0.62294375 +v 0.76439237 -0.02328562 -0.62295335 +v 0.76435482 -0.02329423 -0.62347626 +v 0.38824605 -0.0009478 -0.63103538 +v 0.01209926 0.02139005 -0.63911736 +v -0.36404752 0.04372793 -0.64719939 +v -0.72967404 0.06549549 -0.65242165 +v 0.89681261 -0.02693282 -0.41631239 +v 0.77935838 -0.01986035 -0.41413086 +v 0.40429067 0.00272432 -0.40716448 +v 0.02922248 0.02530902 -0.40019813 +v -0.34584569 0.0478937 -0.39323175 +v -0.72091436 0.07047841 -0.38626539 +v -0.7392171 0.06628948 -0.64164328 +v -0.90836232 0.08179079 -0.38156789 +v 0.9686914 -0.02707935 -0.21554815 +v 0.7943263 -0.01643458 -0.2052834 +v 0.4203372 0.00639694 -0.18326684 +v 0.04634761 0.02922853 -0.16125029 +v -0.32764196 0.05206009 -0.13923373 +v -0.70163154 0.07489165 -0.11721718 +v -0.980663 0.09193452 -0.10038428 +v 0.9935413 -0.02441613 -0.0149815 +v 0.80926799 -0.01301488 0.00319892 +v 0.43635559 0.01006311 0.04023933 +v 0.0634427 0.0331411 0.0772798 +v -0.30947017 0.05621913 0.11432021 +v -0.68238353 0.07929712 0.15136063 +v -0.96820378 0.09698533 0.17975041 +v 0.96999269 -0.01873033 0.19172257 +v 0.82419204 -0.00959938 0.2114228 +v 0.4523549 0.01372471 0.26346844 +v 0.08051776 0.03704884 0.31551414 +v -0.29131984 0.06037297 0.36755985 +v -0.66315746 0.08369714 0.41960549 +v -0.87237459 0.09682063 0.4488894 +v 0.89301455 -0.0095791 0.41140583 +v 0.83913278 -0.00617989 0.41989237 +v 0.46837234 0.01739063 0.48696094 +v 0.09761142 0.0409612 0.55402958 +v -0.27314949 0.06453177 0.62109828 +v -0.64390993 0.08810231 0.68816685 +v -0.68223172 0.09053855 0.69509917 +v 0.84543788 -0.00473674 0.5078634 +v 0.72104287 0.00583614 0.65915018 +v 0.48432588 0.0210419 0.70955896 +v 0.11463785 0.04485788 0.79159033 +v -0.25505065 0.06867387 0.87362182 +v -0.35195022 0.07491633 0.89512324 +v -0.6410228 0.08876301 0.72844654 +v 0.49368789 0.02318439 0.8401817 +v 0.12638172 0.04754569 0.95544898 +v -0.25064563 0.06968191 0.93508249 +f 1 3 4 5 +f 2 6 7 8 +f 2 9 10 6 +f 2 8 11 9 +f 11 12 13 14 +f 11 14 15 9 +f 11 8 4 12 +f 15 14 16 17 +f 15 17 18 19 +f 15 19 10 9 +f 22 21 23 24 +f 24 23 13 12 +f 24 12 4 3 +f 23 21 20 25 +f 23 25 26 13 +f 26 25 27 28 +f 26 28 29 16 +f 26 16 14 13 +f 29 28 30 31 +f 29 32 17 16 +f 32 33 34 35 +f 32 35 18 17 +f 37 36 38 27 +f 37 27 25 20 +f 38 30 28 27 +f 33 32 29 31 +f 8 7 5 4 +f 39 43 42 41 +f 39 44 96 +f 39 41 45 44 +f 40 48 47 46 +f 40 46 50 49 +f 40 49 51 48 +f 51 54 53 52 +f 51 49 55 54 +f 51 52 42 48 +f 55 57 56 54 +f 55 59 58 57 +f 55 49 50 59 +f 59 61 60 58 +f 59 50 62 61 +f 122 97 61 62 +f 62 50 46 63 +f 63 46 47 64 +f 99 43 95 +f 170 100 66 65 +f 164 102 67 66 +f 67 69 68 66 +f 67 45 41 69 +f 156 103 45 67 +f 69 52 53 68 +f 69 41 42 52 +f 68 70 65 66 +f 68 53 71 70 +f 71 73 72 70 +f 71 56 74 73 +f 71 53 54 56 +f 74 31 30 73 +f 74 56 57 75 +f 75 76 34 33 +f 75 57 58 76 +f 91 77 104 +f 76 58 60 77 +f 104 77 105 +f 101 65 78 106 +f 78 72 38 36 +f 78 65 70 72 +f 38 72 73 30 +f 33 31 74 75 +f 48 42 43 47 +f 107 44 108 +f 127 98 62 63 +f 135 109 63 64 +f 110 64 99 +f 96 44 107 +f 114 105 77 60 +f 112 111 60 61 +f 149 108 44 45 +f 79 80 1 5 +f 148 81 3 1 +f 82 83 19 18 +f 133 84 10 19 +f 134 85 6 10 +f 85 86 7 6 +f 141 79 5 7 +f 169 88 20 21 +f 162 87 21 22 +f 22 24 3 +f 90 22 3 +f 81 90 3 +f 155 89 22 +f 116 92 35 34 +f 119 82 18 35 +f 93 94 36 37 +f 172 93 37 20 +f 142 95 43 +f 96 43 39 +f 64 47 43 +f 99 64 43 +f 34 76 77 +f 91 34 77 +f 171 106 78 36 +f 112 113 114 111 +f 114 113 115 +f 114 115 116 +f 114 116 91 +f 114 91 104 +f 114 104 105 +f 116 115 117 +f 116 117 118 +f 116 118 92 +f 118 117 119 +f 120 121 122 +f 122 121 123 +f 122 123 113 +f 122 113 112 +f 122 112 97 +f 113 123 124 115 +f 115 124 125 117 +f 117 125 126 +f 117 126 83 +f 117 83 82 +f 117 82 119 +f 127 128 121 +f 127 121 120 +f 127 120 98 +f 121 128 129 123 +f 123 129 130 124 +f 124 130 131 125 +f 125 131 132 +f 125 132 133 +f 125 133 126 +f 133 132 134 84 +f 135 136 128 +f 135 128 127 +f 135 127 109 +f 128 136 137 129 +f 129 137 138 130 +f 130 138 139 131 +f 131 139 140 132 +f 132 140 141 +f 132 141 86 +f 132 86 85 +f 132 85 134 +f 142 143 136 +f 142 136 135 +f 142 135 110 +f 142 110 99 +f 142 99 95 +f 136 143 144 137 +f 137 144 145 138 +f 138 145 146 139 +f 139 146 147 140 +f 140 147 148 +f 140 148 80 +f 140 80 79 +f 140 79 141 +f 149 150 143 +f 149 143 142 +f 149 142 96 +f 149 96 107 +f 149 107 108 +f 143 150 151 144 +f 144 151 152 145 +f 145 152 153 146 +f 146 153 154 147 +f 147 154 155 +f 147 155 90 +f 147 90 81 +f 147 81 148 +f 156 157 150 +f 156 150 149 +f 156 149 103 +f 150 157 158 151 +f 151 158 159 152 +f 152 159 160 153 +f 153 160 161 154 +f 154 161 162 +f 154 162 89 +f 154 89 155 +f 163 157 156 +f 157 163 102 +f 157 102 164 +f 157 164 165 +f 157 165 158 +f 158 165 166 159 +f 159 166 167 160 +f 160 167 168 +f 160 168 88 +f 160 88 169 +f 160 169 161 +f 161 169 87 162 +f 170 165 164 100 +f 165 170 101 +f 165 101 106 +f 165 106 171 +f 165 171 166 +f 166 171 94 +f 166 94 93 +f 166 93 172 +f 166 172 167 +f 167 172 168 +f 86 141 7 +f 84 134 10 +f 83 126 19 +f 126 133 19 +f 92 118 35 +f 118 119 35 +f 91 116 34 +f 111 114 60 +f 97 112 61 +f 98 120 62 +f 120 122 62 +f 109 127 63 +f 110 135 64 +f 96 142 43 +f 103 149 45 +f 102 163 67 +f 163 156 67 +f 100 164 66 +f 101 170 65 +f 94 171 36 +f 88 168 20 +f 168 172 20 +f 87 169 21 +f 89 162 22 +f 90 155 22 +f 80 148 1 + + diff --git a/modules/ufbx/data/zbrush_cut_sphere_7500_ascii.fbx b/modules/ufbx/data/zbrush_cut_sphere_7500_ascii.fbx new file mode 100644 index 0000000..e43b156 --- /dev/null +++ b/modules/ufbx/data/zbrush_cut_sphere_7500_ascii.fbx @@ -0,0 +1,415 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 11 + Day: 5 + Hour: 2 + Minute: 23 + Second: 58 + Millisecond: 984 + } + Creator: "FBX SDK/FBX Plugins version 2020.0.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\zbrush_sphere_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\zbrush_sphere_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "" + P: "Original|ApplicationName", "KString", "", "", "" + P: "Original|ApplicationVersion", "KString", "", "", "" + P: "Original|DateTime_GMT", "DateTime", "", "", "" + P: "Original|FileName", "KString", "", "", "" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "" + P: "LastSaved|ApplicationName", "KString", "", "", "" + P: "LastSaved|ApplicationVersion", "KString", "", "", "" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",-1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",0 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",46186158000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 957203920, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfacePhong" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Phong" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + P: "SpecularColor", "Color", "", "A",0.2,0.2,0.2 + P: "SpecularFactor", "Number", "", "A",1 + P: "ShininessExponent", "Number", "", "A",20 + P: "ReflectionColor", "Color", "", "A",0,0,0 + P: "ReflectionFactor", "Number", "", "A",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1311784688, "Geometry::PolySphere", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *516 { + a: -0.980107188224792,0.127684757113457,0.111584924161434,-0.898387134075165,0.317927986383438,-0.296380877494812,-0.946524739265442,0.230077311396599,0.208183944225311,-0.942970752716064,0.317928403615952,0.043112862855196,-0.987259149551392,0.121845759451389,-0.0260907337069511,-0.920500695705414,0.15890109539032,-0.345133632421494,-0.969447612762451,0.144975319504738,-0.173537343740463,-0.930289506912231,0.327122151851654,-0.137686192989349,-0.822223603725433,0.41910907626152,-0.374986588954926,-0.814576864242554,0.231414511799812,-0.522849977016449,-0.829299509525299,0.529641091823578,-0.152323603630066,-0.83828604221344,0.524690389633179,0.11028178781271,-0.670837163925171,0.7187220454216,0.161192759871483,-0.666540861129761,0.714212894439697,-0.191160440444946,-0.663715958595276,0.55786406993866,-0.483120381832123,-0.466659933328629,0.846267342567444,-0.233145594596863,-0.467533648014069,0.660780310630798,-0.571145415306091,-0.462142586708069,0.370727598667145,-0.799228072166443,-0.656668484210968,0.30947357416153,-0.679898619651794,-0.47265550494194,0.318662524223328,0.815594255924225,-0.673987507820129,0.249000981450081,0.685936331748962,-0.843231558799744,0.165165185928345,0.502324342727661,-0.678047299385071,0.545555233955383,0.480400323867798,-0.837882876396179,0.402277171611786,0.358247816562653,-0.477112293243408,0.658812940120697,0.568660140037537,-0.471408933401108,0.856645703315735,0.188013717532158,-0.245650410652161,0.733358085155487,0.620189070701599,-0.243989840149879,0.944017291069031,0.203745692968369,-0.240930110216141,0.928392231464386,-0.269503086805344,0,0.973163068294525,0.210612133145332,0,0.948637962341309,-0.305586487054825,-0.241907551884651,0.726601004600525,-0.633966505527496,0,0.750465929508209,-0.656318068504333,0,0.421253889799118,-0.902866363525391,-0.239073365926743,0.407558411359787,-0.876370906829834,0,0.377438962459564,0.920548796653748,-0.243526071310043,0.364206433296204,0.894586503505707,0,0.763100683689117,0.64186292886734,0.980107188224792,0.127684757113457,0.111584924161434, +0.898387134075165,0.317927986383438,-0.296380877494812,0.946524739265442,0.230077311396599,0.208183944225311,0.942970752716064,0.317928403615952,0.043112862855196,0.987259149551392,0.121845759451389,-0.0260907337069511,0.987833499908447,-0.014671684242785,0.118067935109138,0.945506036281586,0.0729556903243065,0.305851578712463,0.920500695705414,0.15890109539032,-0.345133632421494,0.969447612762451,0.144975319504738,-0.173537343740463,0.930289506912231,0.327122151851654,-0.137686192989349,0.822223603725433,0.41910907626152,-0.374986588954926,0.814576864242554,0.231414511799812,-0.522849977016449,0.829299509525299,0.529641091823578,-0.152323603630066,0.83828604221344,0.524690389633179,0.11028178781271,0.670837163925171,0.7187220454216,0.161192759871483,0.666540861129761,0.714212894439697,-0.191160440444946,0.663715958595276,0.55786406993866,-0.483120381832123,0.466659933328629,0.846267342567444,-0.233145594596863,0.467533648014069,0.660780310630798,-0.571145415306091,0.462142586708069,0.370727598667145,-0.799228072166443,0.656668484210968,0.30947357416153,-0.679898619651794,0.452416002750397,0.00834787357598543,-0.886051535606384,0.647483646869659,0.00433321204036474,-0.757193088531494,0.813580632209778,-0.00374025106430054,-0.573814153671265,0.921283483505249,-0.0117046423256397,-0.374822676181793,0.977116227149963,-0.0190329775214195,-0.190797924995422,0.47265550494194,0.318662524223328,0.815594255924225,0.673987507820129,0.249000981450081,0.685936331748962,0.843231558799744,0.165165185928345,0.502324342727661,0.678047299385071,0.545555233955383,0.480400323867798,0.837882876396179,0.402277171611786,0.358247816562653,0.477112293243408,0.658812940120697,0.568660140037537,0.471408933401108,0.856645703315735,0.188013717532158,0.245650410652161,0.733358085155487,0.620189070701599,0.243989840149879,0.944017291069031,0.203745692968369,0.240930110216141,0.928392231464386,-0.269503086805344,0.241907551884651,0.726601004600525,-0.633966505527496,0.239073365926743,0.407558411359787,-0.876370906829834,0.232964843511581,0.00964324362576008,-0.966884672641754, +0.243526071310043,0.364206433296204,0.894586503505707,-0.988607108592987,0.0939133167266846,-0.0277197360992432,-0.981805026531219,0.0964181423187256,0.113008856773376,-0.945668637752533,0.097925066947937,0.290330529212952,-0.453381597995758,0.0443090200424194,-0.877435445785522,-0.649124681949615,0.0587937831878662,-0.74339771270752,-0.813902616500854,0.0725033283233643,-0.557290077209473,-0.92084926366806,0.0830185413360596,-0.358338594436646,-0.972030460834503,0.0897842645645142,-0.179345607757568,-0.672881484031677,0.0902038812637329,0.70596170425415,-0.4718958735466,0.0811139345169067,0.847811102867126,-0.841319262981415,0.0962327718734741,0.510280609130859,-0.918076574802399,0.0976857542991638,0.358544111251831,-2.08616256713867e-07,0.0147616863250732,-0.994450807571411,-0.23326787352562,0.0293816328048706,-0.962395191192627,-0.243532240390778,0.0693143606185913,0.937888383865356,-5.66244125366211e-07,0.0554039478302002,0.969790816307068,0.994339823722839,-0.024870753288269,-0.0346479415893555,0.991598188877106,-0.0233098268508911,0.0328760147094727,0.646908164024353,-0.0189386606216431,-0.75258469581604,0.812998414039612,-0.0250982046127319,-0.570002555847168,0.987654149532318,-0.0257577896118164,-0.0968465805053711,0.672319769859314,0.00992929935455322,0.716084837913513,0.471715182065964,0.0248148441314697,0.855446338653564,0.838537275791168,-0.00403439998626709,0.521853804588318,0.94041782617569,-0.0144038200378418,0.31529974937439,0.0538773834705353,0.011661171913147,-0.988507747650146,0.232902646064758,0.00143206119537354,-0.965205192565918,0.24353352189064,0.0402613878250122,0.9421546459198,0.987093567848206,-0.0212498903274536,0.119397521018982,0.98427402973175,-0.0208195447921753,0.132048845291138,0.92086273431778,-0.0274592638015747,-0.372211694717407,0.976436674594879,-0.0270178318023682,-0.190178394317627,0.452170610427856,-0.00997257232666016,-0.882360458374023,0.506866991519928,-0.0124908983707428,-0.845910012722015,0.372254848480225,-0.00460740923881531,-0.854145884513855,0.367952793836594,-0.00559220882132649,-0.914179980754852, +-0.00496673583984375,0.0174844861030579,-0.877225160598755,-0.0132376551628113,0.0155913373455405,-0.992631733417511,-0.382188320159912,0.0395763516426086,-0.900304436683655,-0.382509529590607,0.0395027101039886,-0.904790759086609,-0.396172374486923,0.0404292792081833,-0.899517118930817,0.764839172363281,-0.0233121942728758,-0.622943758964539,0.764392375946045,-0.0232856273651123,-0.622953355312347,0.764354825019836,-0.0232942309230566,-0.623476266860962,0.388246059417725,-0.000947803258895874,-0.631035387516022,0.0120992660522461,0.0213900506496429,-0.639117360115051,-0.364047527313232,0.0437279343605042,-0.647199392318726,-0.72967404127121,0.0654954984784126,-0.652421653270721,0.896812617778778,-0.0269328262656927,-0.416312396526337,0.779358386993408,-0.0198603570461273,-0.414130866527557,0.404290676116943,0.00272431969642639,-0.407164484262466,0.0292224884033203,0.0253090262413025,-0.400198131799698,-0.345845699310303,0.0478937029838562,-0.393231749534607,-0.720914363861084,0.0704784095287323,-0.386265397071838,-0.739217102527618,0.066289484500885,-0.641643285751343,-0.908362329006195,0.0817907974123955,-0.381567895412445,0.968691408634186,-0.0270793531090021,-0.215548157691956,0.794326305389404,-0.0164345800876617,-0.205283403396606,0.420337200164795,0.00639694929122925,-0.183266848325729,0.0463476181030273,0.029228538274765,-0.161250293254852,-0.32764196395874,0.0520600974559784,-0.139233738183975,-0.701631546020508,0.0748916566371918,-0.117217183113098,-0.980663001537323,0.0919345244765282,-0.100384287536144,0.993541300296783,-0.0244161318987608,-0.0149815045297146,0.809267997741699,-0.0130148828029633,0.00319892168045044,0.436355590820313,0.010063111782074,0.0402393341064453,0.0634427070617676,0.0331411063671112,0.077279806137085,-0.309470176696777,0.0562191307544708,0.11432021856308,-0.68238353729248,0.0792971253395081,0.151360630989075,-0.968203783035278,0.0969853326678276,0.17975041270256,0.969992697238922,-0.0187303312122822,0.191722571849823,0.824192047119141,-0.00959938764572144,0.211422801017761,0.452354907989502,0.0137247145175934,0.263468444347382, +0.0805177688598633,0.0370488464832306,0.315514147281647,-0.291319847106934,0.0603729784488678,0.367559850215912,-0.66315746307373,0.0836971402168274,0.419605493545532,-0.872374594211578,0.0968206375837326,0.448889404535294,0.893014550209045,-0.00957910530269146,0.411405831575394,0.839132785797119,-0.00617989897727966,0.419892370700836,0.468372344970703,0.017390638589859,0.48696094751358,0.0976114273071289,0.0409612059593201,0.554029583930969,-0.273149490356445,0.0645317733287811,0.621098279953003,-0.643909931182861,0.0881023108959198,0.688166856765747,-0.682231724262238,0.0905385538935661,0.695099174976349,0.84543788433075,-0.00473674479871988,0.507863402366638,0.72104287147522,0.00583614036440849,0.659150183200836,0.484325885772705,0.0210418999195099,0.709558963775635,0.114637851715088,0.0448578894138336,0.791590332984924,-0.255050659179688,0.0686738789081573,0.873621821403503,-0.351950228214264,0.0749163329601288,0.895123243331909,-0.641022801399231,0.0887630134820938,0.728446543216705,0.493687897920609,0.0231843926012516,0.840181708335876,0.126381725072861,0.0475456975400448,0.955448985099792,-0.250645637512207,0.0696819126605988,0.935082495212555 + } + PolygonVertexIndex: *796 { + a: 0,2,3,-5,1,5,6,-8,1,8,9,-6,1,7,10,-9,10,11,12,-14,10,13,14,-9,10,7,3,-12,14,13,15,-17,14,16,17,-19,14,18,9,-9,21,20,22,-24,23,22,12,-12,23,11,3,-3,22,20,19,-25,22,24,25,-13,25,24,26,-28,25,27,28,-16,25,15,13,-13,28,27,29,-31,28,31,16,-16,31,32,33,-35,31,34,17,-17,36,35,37,-27,36,26,24,-20,37,29,27,-27,32,31,28,-31,7,6,4,-4,38,42,41,-41,38,43,-96,38,40,44,-44,39,47,46,-46,39,45,49,-49,39,48,50,-48,50,53,52,-52,50,48,54,-54,50,51,41,-48,54,56,55,-54,54,58,57,-57,54,48,49,-59,58,60,59,-58,58,49,61,-61,121,96,60,-62,61,49,45,-63,62,45,46,-64,98,42,-95,169,99,65,-65,163,101,66,-66,66,68,67,-66,66,44,40,-69,155,102,44,-67,68,51,52,-68,68,40,41,-52,67,69,64,-66,67,52,70,-70,70,72,71,-70,70,55,73,-73,70,52,53,-56,73,30,29,-73,73,55,56,-75,74,75,33,-33,74,56,57,-76,90,76,-104,75,57,59,-77,103,76,-105,100,64,77,-106,77,71,37,-36,77,64,69,-72,37,71,72,-30,32,30,73,-75,47,41,42,-47,106,43,-108,126,97,61,-63,134,108,62,-64,109,63,-99,95,43,-107,113,104,76,-60,111,110,59,-61,148,107,43,-45,78,79,0,-5,147,80,2,-1,81,82,18,-18,132,83,9,-19,133,84,5,-10,84,85,6,-6,140,78,4,-7,168,87,19,-21,161,86,20,-22,21,23,-3,89,21,-3,80,89,-3,154,88,-22,115,91,34,-34,118,81,17,-35,92,93,35,-37,171,92,36,-20,141,94,-43,95,42,-39,63,46,-43,98,63,-43,33,75,-77,90,33,-77,170,105,77,-36,111,112,113,-111,113,112,-115,113,114,-116,113,115,-91,113,90,-104,113,103,-105,115,114,-117,115,116,-118,115,117,-92,117,116,-119,119,120,-122,121,120,-123,121,122,-113,121,112,-112,121,111,-97,112,122,123,-115,114,123,124,-117,116,124,-126,116,125,-83,116,82,-82,116,81,-119,126,127,-121,126,120,-120,126,119,-98,120,127,128,-123,122,128,129,-124,123,129,130,-125,124,130,-132,124,131,-133,124,132,-126,132,131,133,-84,134,135,-128,134,127,-127,134,126,-109,127,135,136,-129,128,136,137,-130,129,137,138,-131,130,138,139,-132,131,139,-141,131,140,-86,131,85,-85,131,84,-134,141,142,-136,141,135,-135,141,134,-110,141,109,-99,141,98,-95,135,142,143,-137,136,143,144,-138,137,144,145,-139,138,145,146,-140,139,146,-148,139,147,-80,139,79,-79,139,78,-141,148, +149,-143,148,142,-142,148,141,-96,148,95,-107,148,106,-108,142,149,150,-144,143,150,151,-145,144,151,152,-146,145,152,153,-147,146,153,-155,146,154,-90,146,89,-81,146,80,-148,155,156,-150,155,149,-149,155,148,-103,149,156,157,-151,150,157,158,-152,151,158,159,-153,152,159,160,-154,153,160,-162,153,161,-89,153,88,-155,162,156,-156,156,162,-102,156,101,-164,156,163,-165,156,164,-158,157,164,165,-159,158,165,166,-160,159,166,-168,159,167,-88,159,87,-169,159,168,-161,160,168,86,-162,169,164,163,-100,164,169,-101,164,100,-106,164,105,-171,164,170,-166,165,170,-94,165,93,-93,165,92,-172,165,171,-167,166,171,-168,85,140,-7,83,133,-10,82,125,-19,125,132,-19,91,117,-35,117,118,-35,90,115,-34,110,113,-60,96,111,-61,97,119,-62,119,121,-62,108,126,-63,109,134,-64,95,141,-43,102,148,-45,101,162,-67,162,155,-67,99,163,-66,100,169,-65,93,170,-36,87,167,-20,167,171,-20,86,168,-21,88,161,-22,89,154,-22,79,147,-1 + } + Edges: *398 { + a: 0,1,2,3,4,5,6,7,8,9,10,13,14,16,17,18,19,21,22,25,26,29,30,31,33,34,35,37,40,41,42,43,45,47,51,53,54,55,57,58,61,62,63,65,66,67,73,74,75,76,77,80,81,82,83,85,88,89,90,91,95,96,103,105,108,109,110,111,112,113,114,116,117,119,120,121,122,124,125,126,128,129,131,132,133,134,136,137,140,141,143,144,145,147,148,149,153,155,156,157,160,161,163,164,166,169,170,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,190,192,194,195,197,198,200,206,207,211,212,214,215,216,218,219,220,226,228,232,233,234,235,237,240,242,243,244,247,248,250,251,252,253,254,255,256,257,259,274,276,277,278,279,280,282,283,284,286,287,288,289,292,293,296,297,298,300,301,304,305,306,308,309,310,312,313,314,316,317,318,320,321,322,324,325,326,329,332,333,334,336,337,338,340,343,344,346,347,350,351,352,353,354,356,357,360,361,362,364,365,368,369,371,372,377,383,384,387,390,391,392,393,396,397,399,400,402,403,406,411,412,414,415,417,420,421,422,423,424,426,427,429,430,433,435,438,439,442,443,446,447,449,450,453,457,458,459,462,464,467,468,471,472,475,476,479,480,482,483,485,488,489,491,492,493,496,498,501,502,505,506,509,510,513,514,517,518,520,521,524,528,529,530,533,535,536,539,544,545,548,549,552,553,556,557,560,561,563,564,567,571,572,573,576,578,579,582,587,588,591,592,595,596,599,600,603,604,606,607,610,614,615,616,619,621,624,625,628,629,632,633,636,637,640,641,643,644,648,650,652,653,656,658,659,661,664,665,668,669,672,673,675,676,679,681,684,687,689,692,693,696,699,701,704,705,708,711,713,716,725,731,746,764,779 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *516 { + a: -0.9775838703533,0.178267876051209,0.112028303536446,-0.905146362294572,0.308281156848465,-0.292699147858471,-0.924027836193069,0.261542999668088,0.278868817304792,-0.942071050890868,0.33183188632186,0.0488849086472732,-0.978077745122027,0.206849812563845,-0.0240224798743589,-0.914764813320571,0.182526634670831,-0.360401670287919,-0.964422797879308,0.196833968246549,-0.176479618865648,-0.930356336177634,0.345701504759262,-0.122178383281626,-0.791154028156994,0.460721074232259,-0.402257871879762,-0.817929186130893,0.243356848680748,-0.521314963026604,-0.826842464603588,0.543268931782778,-0.145569249801818,-0.837380267342707,0.533508512155688,0.119008215357091,-0.680733253701489,0.713139095330506,0.167436161017182,-0.669417339919235,0.718991354584336,-0.186900660909578,-0.659489763222233,0.572362866471296,-0.487313042396615,-0.470629479120109,0.853769624904285,-0.222677616688188,-0.472673883373654,0.672888591268158,-0.569034571636576,-0.465398504592268,0.385234986801514,-0.796867766236857,-0.666618233014524,0.318161248683897,-0.674087198549637,-0.46387741486937,0.335403480463223,0.819952589646052,-0.68237141750522,0.310147185391086,0.661950128005052,-0.835925244628595,0.224728151528794,0.500725716638436,-0.676643928800928,0.550632020262825,0.488832662450174,-0.840589985441376,0.404458706521654,0.360307689474562,-0.475277680778871,0.668457456412509,0.572080199902056,-0.472959741558263,0.85929592717506,0.194729536551331,-0.257114720080623,0.740138915615898,0.621358516726684,-0.244094239374827,0.947528235466607,0.206417647737693,-0.243802350220161,0.938576914899041,-0.244200304761737,0,0.981360095753086,0.192177944789444,0,0.968554279968387,-0.24880234475366,-0.255453557835051,0.733283832925671,-0.630109752471148,0,0.749605930273303,-0.661884392699432,0.0222671763770169,0.378246171309524,-0.925437197623848,-0.256095209585757,0.384862005700349,-0.886733601593811,0.0119586406676856,0.394819843120451,0.918680729302473,-0.246150769336109,0.417662522907115,0.874624385501631,0,0.766035669294687,0.642798065778236, +0.989282572071861,0.107966258558185,0.0983019817085578,0.905146362294572,0.308281156848465,-0.292699147858471,0.933126723825223,0.267420983381282,0.240334215064343,0.942071050890868,0.33183188632186,0.0488849086472732,0.990973531722097,0.12853030631064,-0.0380975036705435,0.987352084610614,0.0526574608098793,0.149542812719741,0.946379641430905,0.108858840166184,0.304163323237343,0.916974029027943,0.151516198781987,-0.369054835485079,0.969823234002038,0.159488774353765,-0.184407770023289,0.930356336177634,0.345701504759262,-0.122178383281626,0.791154028156994,0.460721074232259,-0.402257871879762,0.812003048564154,0.234679503197219,-0.534393656307433,0.826842464603588,0.543268931782778,-0.145569249801818,0.837380267342707,0.533508512155688,0.119008215357091,0.680733253701489,0.713139095330506,0.167436161017182,0.669417339919235,0.718991354584336,-0.186900660909578,0.659489763222233,0.572362866471296,-0.487313042396615,0.470629479120109,0.853769624904285,-0.222677616688188,0.472673883373654,0.672888591268158,-0.569034571636576,0.465320196411076,0.37598618968741,-0.801318600792656,0.659691156754462,0.317848577496089,-0.681013846763539,0.445566299575891,0.17831220318722,-0.877311478824235,0.648440150080302,0.139823348682402,-0.7483146416629,0.810198276924022,0.0975707477672,-0.577978114853405,0.918542494360526,0.0561931471923317,-0.391308083564041,0.979669992625519,0.0591109082098181,-0.19170969219037,0.48507941349906,0.352889618270215,0.800104293149655,0.688920758933768,0.278001668730879,0.669405153918737,0.842531285981537,0.19486624001542,0.502163499912678,0.676643928800928,0.550632020262825,0.488832662450174,0.840589985441376,0.404458706521654,0.360307689474562,0.475277680778871,0.668457456412509,0.572080199902056,0.472959741558263,0.85929592717506,0.194729536551331,0.257114720080623,0.740138915615898,0.621358516726684,0.244094239374827,0.947528235466607,0.206417647737693,0.243802350220161,0.938576914899041,-0.244200304761737,0.255453557835051,0.733283832925671,-0.630109752471148,0.242013748523944,0.406153352023748,-0.881174670633049, +0.193169356149887,0.210151822976336,-0.958395435686315,0.245965172981172,0.4077342815245,0.879348559645174,-0.155990259277977,-0.987557815404526,0.0199148247250406,-0.161906293015831,-0.986333842571747,0.0305270909115866,-0.469157182972312,-0.872742288767005,0.134953455173306,-0.513316769105106,0.134759254835485,-0.847552852506368,-0.631901243313261,-0.00975407020303145,-0.774987533327879,-0.837984812895275,0.0100733430311225,-0.545600569205209,-0.419720910720086,-0.902511853084056,-0.0964713021944116,-0.319130471264743,-0.946811626260191,-0.0412733169114898,-0.625151861720478,0.0774330767587304,0.776652604715324,-0.367421283219771,-0.729744099003218,0.576606582174639,-0.316120211867125,-0.922717758555674,0.220590003615481,-0.708929344900407,-0.641115337627209,0.293922281901576,0.105433552374835,0.182748401866699,-0.977490044782447,-0.218664461868173,0.159549963326675,-0.962667991738771,-0.147601118144177,-0.449655969784278,0.88092191411041,-0.0661795859220173,-0.380479651530279,0.922418287534776,0.996685529144194,0.0373185789107529,-0.0722860959150439,0.998952724502356,0.00216892840574918,0.0457028441006797,0.41634786194438,-0.747045501791232,-0.518244610302731,0.682113520878284,-0.579628808214244,-0.445815644995962,0.993824192504898,0.0271314591575638,-0.107598133422329,0.62415134445047,0.0348007907647268,0.780528029082121,0.341842139354601,-0.303471426722122,0.889409379827259,0.722566954609843,-0.313657847016923,0.61604849736897,0.928534212751731,-0.165608808161923,0.332261852171913,-0.0301853906697112,-0.978200088549005,-0.205459068801639,0.0320028041486971,-0.935323971586475,-0.352342005304965,0.243689411324641,-0.322223291750514,0.914760963892597,0.429464446782853,-0.901446648785419,0.0543528135705541,0.970784062057107,-0.0623630442695867,0.231709204748824,0.809587172279942,-0.51023303079122,-0.290225541207823,0.531188507242128,-0.84388633818408,-0.0754626927702923,0.343672994207441,-0.55757933069399,-0.755641557244792,0.0153317124551618,-0.995659837129061,-0.0917955735388315,-0.0597110936934321,-0.998002093170068,0.020649632396186, +-0.0410627831317753,-0.9987411716423,-0.0288083305319756,-0.0597111188578947,-0.998002086415634,0.0206498860718345,-0.144273181465402,-0.631438223159289,-0.761886487242877,-0.0597109648448681,-0.998002096131789,0.0206498618360932,-0.356148657167378,0.0568501980767368,-0.932698337607883,-0.341926057650188,0.192800872588641,-0.919736046172411,0.268639154308142,-0.922998375040713,-0.275512258247815,-0.0597110572860545,-0.998002096636661,0.0206495701313466,-0.0365038467293922,-0.999333384218371,-0.000506320663298597,-0.059711055850158,-0.998002096005313,0.020649604796759,-0.0597110751178284,-0.998002096449718,0.0206495276033433,-0.0597110394856618,-0.998002099206217,0.0206494974158297,-0.28706446091559,-0.939891324718948,-0.184927804824752,-0.0011564276068869,-0.999935417507974,-0.0113059050209951,-0.0597110480722902,-0.998002094935613,0.0206496789862871,-0.0597110905590235,-0.998002092447653,0.0206496763741954,-0.0597110514210491,-0.998002093408553,0.0206497431058711,-0.0597110148019446,-0.998002096857804,0.0206496822916991,-0.059711087467107,-0.99800209314062,0.0206496518236052,-0.252390555267984,-0.955439581247637,-0.153082377159681,-0.670769757851768,-0.666496362393231,-0.325346785550544,-0.0448899233274718,-0.998861756977638,0.0161271581873631,-0.0597109922820256,-0.998002097097511,0.0206497358255904,-0.0597110817719886,-0.998002092208383,0.0206497133468928,-0.0597110864449853,-0.99800209295822,0.0206496635946347,-0.0597110424195135,-0.998002094070691,0.0206497371337129,-0.0597109936967749,-0.998002098329157,0.0206496722091295,-0.132677704527402,-0.991080608934926,0.0124841224967868,0.0272160005510759,-0.999336363912922,0.0242099375319935,-0.0597109187560487,-0.998002103251002,0.0206496510354206,-0.0597110724312221,-0.998002093648501,0.0206496707557624,-0.0597110758720473,-0.998002093802606,0.020649653358276,-0.0597110410356093,-0.998002096207727,0.0206496378521859,-0.0597110332789785,-0.998002094780548,0.0206497292571719,-0.101744205018815,-0.994382404279519,0.0291847700757357,0.0940281661877532,-0.993919203952289,0.0573002615894153, +-0.0597108482072238,-0.998002105264428,0.0206497577260396,-0.0597110691430469,-0.99800209442487,0.0206496427418804,-0.0597110651046707,-0.998002094064997,0.0206496718121,-0.0597110736688119,-0.998002094319073,0.0206496347682367,-0.0597110463084253,-0.998002095145689,0.0206496739336811,-0.161024388239607,-0.984318401949608,0.0720307571488114,0.499657103594837,-0.817130797536419,0.287471804782163,-0.059710548372266,-0.99800211927597,0.020649947548496,-0.0597110818149112,-0.998002094679166,0.0206495938093246,-0.0597110770720477,-0.998002094604743,0.0206496111208561,-0.0597111288615558,-0.998002089189705,0.0206497230747364,-0.0597110617278892,-0.998002096278908,0.0206495745775417,-0.277037524420257,-0.937724870951125,0.20957642153351,0.867640885397191,-0.232247673252042,0.439613821730154,0.467217089165276,-0.758462851214688,0.454359213529572,-0.059710986303414,-0.998002096802435,0.0206497673743726,-0.0597110012763855,-0.998002096824735,0.0206497230006447,-0.05971112463091,-0.998002096486172,0.0206493826667314,-0.288400320896822,-0.714369704320811,0.637574450911584,-0.314018883772818,-0.865866319567961,0.389445320002574,0.536934256004719,-0.26436975013759,0.801130601051319,0.0263639946943916,-0.760372510335212,0.648951912941385,-0.295606237740189,-0.691812134209025,0.658796571917496 + } + NormalsW: *172 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementPolygonGroup: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Index" + PolygonGroup: *228 { + a: 24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037,24037 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: *228 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *796 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: *228 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementPolygonGroup" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + } + } + Model: 1314557296, "Model::PolySphere", "Mesh" { + Version: 232 + Properties70: { + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Material: 743261024, "Material::PolySphere", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "SpecularColor", "Color", "", "A",0,0,0 + P: "ShininessExponent", "Number", "", "A",0 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Diffuse", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Specular", "Vector3D", "Vector", "",0,0,0 + P: "Shininess", "double", "Number", "",0 + P: "Opacity", "double", "Number", "",1 + P: "Reflectivity", "double", "Number", "",0 + } + } + AnimationStack: 748538352, "AnimStack::Default animation", "" { + } + AnimationLayer: 740824656, "AnimLayer::Base Layer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::PolySphere, Model::RootNode + C: "OO",1314557296,0 + + ;AnimLayer::Base Layer, AnimStack::Default animation + C: "OO",740824656,748538352 + + ;Geometry::PolySphere, Model::PolySphere + C: "OO",1311784688,1314557296 + + ;Material::PolySphere, Model::PolySphere + C: "OO",743261024,1314557296 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Default animation" { + FileName: "Default_animation.tak" + LocalTime: 0,46186158000 + ReferenceTime: 0,46186158000 + } +} diff --git a/modules/ufbx/data/zbrush_d20.obj b/modules/ufbx/data/zbrush_d20.obj new file mode 100644 index 0000000..e85cc57 --- /dev/null +++ b/modules/ufbx/data/zbrush_d20.obj @@ -0,0 +1,141 @@ +# ufbx:no_subdivision +# This file uses centimeters as units for non-parametric coordinates. + +g default +v 0.866138 0.999999 -0.500204 +v -0.000000 1.618027 -0.618705 +v -0.000000 0.617619 -0.999990 +v 0.535302 0.000009 -0.308467 +v -0.535303 0.000010 -0.308466 +v -0.866138 1.000000 -0.500204 +v 0.535303 1.618704 0.308466 +v -0.535302 1.618704 0.308467 +v 0.866138 0.618713 0.500204 +v -0.000000 0.000686 0.618705 +v -0.866138 0.618714 0.500204 +v 0.000000 1.001094 0.999990 +vt 0.600000 1.000000 +vt 0.500000 0.647584 +vt 0.700000 0.647584 +vt 0.800000 1.000000 +vt 0.900000 0.647584 +vt 0.000000 1.000000 +vt -0.100000 0.647584 +vt 0.100000 0.647584 +vt 0.200000 1.000000 +vt 0.300000 0.647584 +vt 0.400000 1.000000 +vt 0.400000 0.352416 +vt 0.600000 0.352416 +vt 0.800000 0.352416 +vt -0.200000 0.352416 +vt 0.000000 0.352416 +vt 0.200000 0.352416 +vt 0.700000 0.000000 +vt -0.100000 0.000000 +vt 0.100000 0.000000 +vt 0.300000 0.000000 +vt 0.500000 0.000000 +vn -0.000000 -0.188309 -0.982110 +vn 0.000000 0.794211 -0.607642 +vn 0.850651 0.187234 -0.491260 +vn 0.525731 -0.794876 -0.302951 +vn -0.525731 -0.794876 -0.302951 +vn -0.850651 0.187234 -0.491260 +vn -0.525731 0.794876 0.302951 +vn 0.525732 0.794876 0.302951 +vn 0.850651 -0.187234 0.491260 +vn -0.000000 -0.794211 0.607642 +vn -0.850651 -0.187234 0.491260 +vn 0.000000 0.188309 0.982110 +s 1 +g FBXASC0500FBXASC032Sided +f 3/1/1 2/2/2 1/3/3 +f 3/4/1 1/3/3 4/5/4 +f 3/6/1 4/7/4 5/8/5 +f 3/9/1 5/8/5 6/10/6 +f 3/11/1 6/10/6 2/2/2 +f 2/2/2 8/12/7 7/13/8 +f 1/3/3 7/13/8 9/14/9 +f 4/7/4 9/15/9 10/16/10 +f 5/8/5 10/16/10 11/17/11 +f 6/10/6 11/17/11 8/12/7 +f 7/13/8 1/3/3 2/2/2 +f 9/14/9 4/5/4 1/3/3 +f 10/16/10 5/8/5 4/7/4 +f 11/17/11 6/10/6 5/8/5 +f 8/12/7 2/2/2 6/10/6 +f 12/18/12 9/14/9 7/13/8 +f 12/19/12 10/16/10 9/15/9 +f 12/20/12 11/17/11 10/16/10 +f 12/21/12 8/12/7 11/17/11 +f 12/22/12 7/13/8 8/12/7 +g default +v -0.000000 2.823300 0.250000 +v -1.302800 2.823300 0.000000 +v -0.444711 3.020390 0.000000 +v -0.444711 2.626205 0.000000 +v -0.651400 1.957260 0.000000 +v -0.000000 2.429104 0.000000 +v 0.651400 1.957260 0.000000 +v 0.444711 2.626210 0.000000 +v 1.302800 2.823300 0.000000 +v 0.444711 3.020390 0.000000 +v 0.651400 3.689341 0.000000 +v -0.000000 3.217485 0.000000 +v -0.651400 3.689335 0.000000 +v -0.000000 2.823295 -0.250000 +vt 0.499995 0.234739 +vt 0.329322 0.181318 +vt 0.000000 0.234739 +vt 0.329322 0.288161 +vt 0.249997 0.469478 +vt 0.499995 0.341585 +vt 0.749993 0.469478 +vt 0.670668 0.288160 +vt 0.999990 0.234739 +vt 0.670668 0.181318 +vt 0.749993 0.000000 +vt 0.499995 0.127896 +vt 0.249997 0.000002 +vt 0.499995 0.234740 +vn 0.000001 0.000000 1.000000 +vn -0.775609 0.631213 -0.000007 +vn -1.000000 -0.000010 -0.000003 +vn -0.775612 -0.631210 0.000007 +vn -0.528456 -0.848961 0.000006 +vn -0.000000 -1.000000 0.000010 +vn 0.528470 -0.848952 0.000006 +vn 0.775609 -0.631214 0.000007 +vn 1.000000 0.000022 -0.000001 +vn 0.775611 0.631211 -0.000007 +vn 0.528470 0.848952 -0.000005 +vn -0.000005 1.000000 -0.000011 +vn -0.528464 0.848956 -0.000006 +vn 0.000001 0.000001 -1.000000 +s 1 +g PolyMesh3D1 +f 13/23/13 15/24/14 14/25/15 +f 16/26/16 13/23/13 14/25/15 +f 17/27/17 13/23/13 16/26/16 +f 18/28/18 13/23/13 17/27/17 +f 19/29/19 13/23/13 18/28/18 +f 13/23/13 19/29/19 20/30/20 +f 21/31/21 13/23/13 20/30/20 +f 13/23/13 21/31/21 22/32/22 +f 23/33/23 13/23/13 22/32/22 +f 13/23/13 23/33/23 24/34/24 +f 25/35/25 13/23/13 24/34/24 +f 13/23/13 25/35/25 15/24/14 +f 15/24/14 26/36/26 14/25/15 +f 26/36/26 16/26/16 14/25/15 +f 26/36/26 17/27/17 16/26/16 +f 26/36/26 18/28/18 17/27/17 +f 26/36/26 19/29/19 18/28/18 +f 19/29/19 26/36/26 20/30/20 +f 26/36/26 21/31/21 20/30/20 +f 21/31/21 26/36/26 22/32/22 +f 26/36/26 23/33/23 22/32/22 +f 23/33/23 26/36/26 24/34/24 +f 26/36/26 25/35/25 24/34/24 +f 25/35/25 26/36/26 15/24/14 diff --git a/modules/ufbx/data/zbrush_d20_6100_ascii.fbx b/modules/ufbx/data/zbrush_d20_6100_ascii.fbx new file mode 100644 index 0000000..6ee275c --- /dev/null +++ b/modules/ufbx/data/zbrush_d20_6100_ascii.fbx @@ -0,0 +1,756 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 6 + Hour: 23 + Minute: 45 + Second: 14 + Millisecond: 70 + } + Creator: "FBX SDK/FBX Plugins version 2020.0.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 8 + ObjectType: "Model" { + Count: 2 + } + ObjectType: "Material" { + Count: 2 + } + ObjectType: "Texture" { + Count: 1 + } + ObjectType: "Video" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::20 Sided", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: 0.866137802600861,0.999999046325684,-0.50020444393158,-5.13009688063448e-08,1.6180272102356,-0.618704557418823,-3.50126100556736e-07 + ,0.61761873960495,-0.999990046024323,0.535301983356476,9.05990600585938e-06,-0.308466523885727,-0.535303056240082 + ,9.5367431640625e-06,-0.308466225862503,-0.866137802600861,0.999999582767487,-0.500203847885132,0.535302817821503 + ,1.6187037229538,0.308466345071793,-0.535302102565765,1.61870431900024,0.308466643095016,0.866137802600861,0.618713438510895 + ,0.500203847885132,-6.79083314025775e-08,0.000685930252075195,0.618704557418823,-0.866137683391571,0.618713855743408 + ,0.50020444393158,2.30916811005955e-07,1.00109434127808,0.999990046024323 + PolygonVertexIndex: 2,1,-1,2,0,-4,2,3,-5,2,4,-6,2,5,-2,1,7,-7,0,6,-9,3,8,-10,4,9,-11,5,10,-8,6,0,-2,8,3,-1,9,4,-4,10,5,-5,7,1,-6,11,8 + ,-7,11,9,-9,11,10,-10,11,7,-11,11,6,-8 + Edges: 0,1,2,4,5,7,8,10,11,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,45,47,48,51,54 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: 0.850650733723288,0.187233654239426,-0.491260509237393,1.02138348777367e-07,0.794211116422733,-0.607641919678478 + ,-3.85467540132469e-07,-0.188309388160735,-0.982109756763663,0.525730674836928,-0.794876031157345,-0.302951072992084 + ,-0.525731468908189,-0.794875613767813,-0.302950790124206,-0.850650919148138,0.187234255046484,-0.491259959176012 + ,0.525731576831274,0.794875547342598,0.302950777122798,-0.525730884434197,0.794875888589895,0.302951083329407 + ,0.850650867750242,-0.187234256487049,0.491260047626002,-3.81473211581915e-08,-0.794211182528283,0.607641833276005 + ,-0.850650743254332,-0.187233603145446,0.491260512207145,3.81885808781724e-07,0.188309273968033,0.982109778658927 + + } + LayerElementPolygonGroup: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Index" + PolygonGroup: 10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105 + } + LayerElementColor: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Colors: 1,1,1,1,0,1,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0.0274509803921569,0.0274509803921569 + ,1,1,1,1,1,1,1,1,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "DiffuseUV" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.600000023841858,1,0.5,0.647584021091461,0.699999988079071,0.647584021091461,0.800000011920929,1,0.899999976158142 + ,0.647584021091461,0,1,-0.100000001490116,0.647584021091461,0.100000001490116,0.647584021091461,0.200000002980232 + ,1,0.300000011920929,0.647584021091461,0.400000005960464,1,0.400000005960464,0.352416008710861,0.600000023841858 + ,0.352416008710861,0.800000011920929,0.352416008710861,-0.200000002980232,0.352416008710861,0,0.352416008710861 + ,0.200000002980232,0.352416008710861,0.699999988079071,0,-0.100000001490116,0,0.100000001490116,0,0.300000011920929 + ,0,0.5,0 + UVIndex: 0,1,2,3,2,4,5,6,7,8,7,9,10,9,1,1,11,12,2,12,13,6,14,15,7,15,16,9,16,11,12,2,1,13,4,2,15,7,6,16,9,7,11,1,9,17 + ,13,12,18,15,14,19,16,15,20,11,16,21,12,11 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + LayerElementEdgeCrease: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementTexture: 0 { + Version: 101 + Name: "Diffuse Layer" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Translucent" + TextureAlpha: 1 + TextureId: -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementPolygonGroup" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::20 Sided_ncl1_1" + } + Model: "Model::PolyMesh3D1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + Property: "Morph", "Number", "AN",0 + Property: "Back", "Number", "AN",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: -1.5530584107637e-07,2.82330012321472,0.25,-1.30279982089996,2.82330012321472,0,-0.444710940122604,3.02039003372192 + ,0,-0.444710940122604,2.62620496749878,0,-0.651400148868561,1.95726037025452,0,-1.5530584107637e-07,2.42910432815552 + ,0,0.651399910449982,1.95726037025452,0,0.44471064209938,2.62621021270752,0,1.30279982089996,2.82330012321472,0,0.44471064209938 + ,3.02039003372192,0,0.651399910449982,3.68934059143066,0,-1.5530584107637e-07,3.21748495101929,0,-0.651400148868561 + ,3.68933486938477,0,-1.5530584107637e-07,2.82329511642456,-0.25 + PolygonVertexIndex: 0,2,-2,3,0,-2,4,0,-4,5,0,-5,6,0,-6,0,6,-8,8,0,-8,0,8,-10,10,0,-10,0,10,-12,12,0,-12,0,12,-3,2,13,-2,13,3,-2,13,4,-4 + ,13,5,-5,13,6,-6,6,13,-8,13,8,-8,8,13,-10,13,10,-10,10,13,-12,13,12,-12,12,13,-3 + Edges: 0,1,2,3,5,6,8,9,11,12,14,16,17,18,20,22,23,24,26,28,29,30,32,34,36,37,39,42,45,48,52,54,58,60,64,66 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: 0,0,1,-1,0,2.81650199299197e-16,-0.799169337173009,0.601105956122731,-6.0192227739297e-06,-0.799171006581211 + ,-0.601103736640975,6.01920054876596e-06,-0.405196479131449,-0.914229628274904,9.15471181542992e-06,0,-0.999999999949864 + ,1.00135803217636e-05,0.405205482104045,-0.914225638006844,9.1546718589237e-06,0.799170900891885,-0.60110387715554 + ,6.01920195602474e-06,1,0,0,0.799171139377341,0.601103560087687,-6.01919878093787e-06,0.405186637527057,0.91423399011725 + ,-9.15475549368035e-06,-4.39211363030523e-06,0.999999999940219,-1.0013580321667e-05,-0.405186647113659,0.914233985868487 + ,-9.15475545077152e-06,0,0,-1 + } + LayerElementPolygonGroup: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Index" + PolygonGroup: 15349,15349,15349,15349,15349,15349,15349,15349,15349,15349,15349,15349,9598,9598,9598,9598,9598,9598,9598,9598 + ,9598,9598,9598,9598 + } + LayerElementColor: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Colors: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + ,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "DiffuseUV" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.499994963407516,0.234738901257515,0.329321622848511,0.181317999958992,0,0.234738901257515,0.329321622848511 + ,0.288161247968674,0.249997407197952,0.469477623701096,0.499994963407516,0.341585069894791,0.749992549419403 + ,0.469477623701096,0.670668244361877,0.288159817457199,0.999989986419678,0.234738901257515,0.670668244361877 + ,0.181317999958992,0.749992549419403,0,0.499994963407516,0.127895727753639,0.249997407197952,1.55095153786533e-06 + ,0.499994963407516,0.234740257263184 + UVIndex: 0,1,2,3,0,2,4,0,3,5,0,4,6,0,5,0,6,7,8,0,7,0,8,9,10,0,9,0,10,11,12,0,11,0,12,1,1,13,2,13,3,2,13,4,3,13,5,4,13 + ,6,5,6,13,7,13,8,7,8,13,9,13,10,9,10,13,11,13,12,11,12,13,1 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + LayerElementEdgeCrease: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementTexture: 0 { + Version: 101 + Name: "Diffuse Layer" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Translucent" + TextureAlpha: 1 + TextureId: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementPolygonGroup" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Shape: "Morph" { + Indexes: 13 + Vertices: -6.94987392080293e-08,0.0223557949066162,-0.943415522575378 + Normals: 0,0,1 + } + Shape: "Back" { + Indexes: 0 + Vertices: 6.5785819458597e-08,0.0109646320343018,0.841829180717468 + Normals: 0,0,-1 + } + Shape: "Morph" { + Indexes: 13 + Vertices: -6.94987392080293e-08,0.0223557949066162,-0.943415522575378 + Normals: 0,0,2 + } + Shape: "Back" { + Indexes: 0 + Vertices: 6.5785819458597e-08,0.0109646320343018,0.841829180717468 + Normals: 0,0,-2 + } + NodeAttributeName: "Geometry::PolyMesh3D1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\zbrush_d20_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\zbrush_d20_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "" + Property: "Original|ApplicationName", "KString", "", "" + Property: "Original|ApplicationVersion", "KString", "", "" + Property: "Original|DateTime_GMT", "DateTime", "", "" + Property: "Original|FileName", "KString", "", "" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "" + Property: "LastSaved|ApplicationName", "KString", "", "" + Property: "LastSaved|ApplicationVersion", "KString", "", "" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "" + } + } + Material: "Material::PolyMesh3D1_ncl1_2", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0.5,0.5,0.5 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",1 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",0 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "SpecularColor", "Color", "A",0,0,0 + Property: "SpecularFactor", "Number", "A",1 + Property: "ShininessExponent", "Number", "A",0 + Property: "ReflectionColor", "Color", "A",0,0,0 + Property: "ReflectionFactor", "Number", "A",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0.5,0.5,0.5 + Property: "Diffuse", "Vector3D", "",0.5,0.5,0.5 + Property: "Specular", "Vector3D", "",0,0,0 + Property: "Shininess", "double", "",0 + Property: "Opacity", "double", "",1 + Property: "Reflectivity", "double", "",0 + } + } + Material: "Material::20 Sided_ncl1_2", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0.5,0.5,0.5 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",1 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",0 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "SpecularColor", "Color", "A",0,0,0 + Property: "SpecularFactor", "Number", "A",1 + Property: "ShininessExponent", "Number", "A",0 + Property: "ReflectionColor", "Color", "A",0,0,0 + Property: "ReflectionFactor", "Number", "A",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0.5,0.5,0.5 + Property: "Diffuse", "Vector3D", "",0.5,0.5,0.5 + Property: "Specular", "Vector3D", "",0,0,0 + Property: "Shininess", "double", "",0 + Property: "Opacity", "double", "",1 + Property: "Reflectivity", "double", "",0 + } + } + Video: "Video::Diffuse Texture", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + Property: "RelPath", "KString", "", "PolyMesh3D1_TXTR.tga" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + RelativeFilename: "PolyMesh3D1_TXTR.tga" + } + Texture: "Texture::Diffuse Texture", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Diffuse Texture" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::Diffuse Texture" + FileName: "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + RelativeFilename: "PolyMesh3D1_TXTR.tga" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",-1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",0 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",0 + Property: "TimeSpanStop", "KTime", "",46186158000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::20 Sided", "Model::Scene" + Connect: "OO", "Model::PolyMesh3D1", "Model::Scene" + Connect: "OO", "Material::20 Sided_ncl1_2", "Model::20 Sided" + Connect: "OO", "Material::PolyMesh3D1_ncl1_2", "Model::PolyMesh3D1" + Connect: "OO", "Texture::Diffuse Texture", "Model::PolyMesh3D1" + Connect: "OO", "Video::Diffuse Texture", "Texture::Diffuse Texture" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Default animation" { + FileName: "Default_animation.tak" + LocalTime: 0,46186158000 + ReferenceTime: 0,46186158000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "30" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 141120000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/zbrush_d20_6100_binary.fbx b/modules/ufbx/data/zbrush_d20_6100_binary.fbx new file mode 100644 index 0000000..0431d62 Binary files /dev/null and b/modules/ufbx/data/zbrush_d20_6100_binary.fbx differ diff --git a/modules/ufbx/data/zbrush_d20_7500_ascii.fbx b/modules/ufbx/data/zbrush_d20_7500_ascii.fbx new file mode 100644 index 0000000..0b26df4 --- /dev/null +++ b/modules/ufbx/data/zbrush_d20_7500_ascii.fbx @@ -0,0 +1,747 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 6 + Hour: 23 + Minute: 43 + Second: 52 + Millisecond: 66 + } + Creator: "FBX SDK/FBX Plugins version 2020.0.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\zbrush_d20_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\zbrush_d20_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "" + P: "Original|ApplicationName", "KString", "", "", "" + P: "Original|ApplicationVersion", "KString", "", "", "" + P: "Original|DateTime_GMT", "DateTime", "", "", "" + P: "Original|FileName", "KString", "", "", "" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "" + P: "LastSaved|ApplicationName", "KString", "", "", "" + P: "LastSaved|ApplicationVersion", "KString", "", "", "" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",-1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",0 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",46186158000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1465389536, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 16 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 4 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 2 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + } + } + } + ObjectType: "Material" { + Count: 2 + PropertyTemplate: "FbxSurfacePhong" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Phong" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + P: "SpecularColor", "Color", "", "A",0.2,0.2,0.2 + P: "SpecularFactor", "Number", "", "A",1 + P: "ShininessExponent", "Number", "", "A",20 + P: "ReflectionColor", "Color", "", "A",0,0,0 + P: "ReflectionFactor", "Number", "", "A",1 + } + } + } + ObjectType: "Texture" { + Count: 1 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Deformer" { + Count: 3 + } + ObjectType: "Video" { + Count: 1 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1464391744, "Geometry::20 Sided", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *36 { + a: 0.866137802600861,0.999999046325684,-0.50020444393158,-5.13009688063448e-08,1.6180272102356,-0.618704557418823,-3.50126100556736e-07,0.61761873960495,-0.999990046024323,0.535301983356476,9.05990600585938e-06,-0.308466523885727,-0.535303056240082,9.5367431640625e-06,-0.308466225862503,-0.866137802600861,0.999999582767487,-0.500203847885132,0.535302817821503,1.6187037229538,0.308466345071793,-0.535302102565765,1.61870431900024,0.308466643095016,0.866137802600861,0.618713438510895,0.500203847885132,-6.79083314025775e-08,0.000685930252075195,0.618704557418823,-0.866137683391571,0.618713855743408,0.50020444393158,2.30916811005955e-07,1.00109434127808,0.999990046024323 + } + PolygonVertexIndex: *60 { + a: 2,1,-1,2,0,-4,2,3,-5,2,4,-6,2,5,-2,1,7,-7,0,6,-9,3,8,-10,4,9,-11,5,10,-8,6,0,-2,8,3,-1,9,4,-4,10,5,-5,7,1,-6,11,8,-7,11,9,-9,11,10,-10,11,7,-11,11,6,-8 + } + Edges: *30 { + a: 0,1,2,4,5,7,8,10,11,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,45,47,48,51,54 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *36 { + a: 0.850650733723288,0.187233654239426,-0.491260509237393,1.02138348777367e-07,0.794211116422733,-0.607641919678478,-3.85467540132469e-07,-0.188309388160735,-0.982109756763663,0.525730674836928,-0.794876031157345,-0.302951072992084,-0.525731468908189,-0.794875613767813,-0.302950790124206,-0.850650919148138,0.187234255046484,-0.491259959176012,0.525731576831274,0.794875547342598,0.302950777122798,-0.525730884434197,0.794875888589895,0.302951083329407,0.850650867750242,-0.187234256487049,0.491260047626002,-3.81473211581915e-08,-0.794211182528283,0.607641833276005,-0.850650743254332,-0.187233603145446,0.491260512207145,3.81885808781724e-07,0.188309273968033,0.982109778658927 + } + NormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementPolygonGroup: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Index" + PolygonGroup: *20 { + a: 10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105 + } + } + LayerElementColor: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Colors: *48 { + a: 1,1,1,1,0,1,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0.0274509803921569,0.0274509803921569,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "DiffuseUV" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *44 { + a: 0.600000023841858,1,0.5,0.647584021091461,0.699999988079071,0.647584021091461,0.800000011920929,1,0.899999976158142,0.647584021091461,0,1,-0.100000001490116,0.647584021091461,0.100000001490116,0.647584021091461,0.200000002980232,1,0.300000011920929,0.647584021091461,0.400000005960464,1,0.400000005960464,0.352416008710861,0.600000023841858,0.352416008710861,0.800000011920929,0.352416008710861,-0.200000002980232,0.352416008710861,0,0.352416008710861,0.200000002980232,0.352416008710861,0.699999988079071,0,-0.100000001490116,0,0.100000001490116,0,0.300000011920929,0,0.5,0 + } + UVIndex: *60 { + a: 0,1,2,3,2,4,5,6,7,8,7,9,10,9,1,1,11,12,2,12,13,6,14,15,7,15,16,9,16,11,12,2,1,13,4,2,15,7,6,16,9,7,11,1,9,17,13,12,18,15,14,19,16,15,20,11,16,21,12,11 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *60 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementPolygonGroup" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1464388416, "Geometry::PolyMesh3D1", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *42 { + a: -1.5530584107637e-07,2.82330012321472,0.25,-1.30279982089996,2.82330012321472,-0,-0.444710940122604,3.02039003372192,-0,-0.444710940122604,2.62620496749878,-0,-0.651400148868561,1.95726037025452,-0,-1.5530584107637e-07,2.42910432815552,-0,0.651399910449982,1.95726037025452,-0,0.44471064209938,2.62621021270752,-0,1.30279982089996,2.82330012321472,-0,0.44471064209938,3.02039003372192,-0,0.651399910449982,3.68934059143066,-0,-1.5530584107637e-07,3.21748495101929,-0,-0.651400148868561,3.68933486938477,-0,-1.5530584107637e-07,2.82329511642456,-0.25 + } + PolygonVertexIndex: *72 { + a: 0,2,-2,3,0,-2,4,0,-4,5,0,-5,6,0,-6,0,6,-8,8,0,-8,0,8,-10,10,0,-10,0,10,-12,12,0,-12,0,12,-3,2,13,-2,13,3,-2,13,4,-4,13,5,-5,13,6,-6,6,13,-8,13,8,-8,8,13,-10,13,10,-10,10,13,-12,13,12,-12,12,13,-3 + } + Edges: *36 { + a: 0,1,2,3,5,6,8,9,11,12,14,16,17,18,20,22,23,24,26,28,29,30,32,34,36,37,39,42,45,48,52,54,58,60,64,66 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *42 { + a: 0,0,1,-1,0,2.81650199299197e-16,-0.799169337173009,0.601105956122731,-6.0192227739297e-06,-0.799171006581211,-0.601103736640975,6.01920054876596e-06,-0.405196479131449,-0.914229628274904,9.15471181542992e-06,0,-0.999999999949864,1.00135803217636e-05,0.405205482104045,-0.914225638006844,9.1546718589237e-06,0.799170900891885,-0.60110387715554,6.01920195602474e-06,1,0,0,0.799171139377341,0.601103560087687,-6.01919878093787e-06,0.405186637527057,0.91423399011725,-9.15475549368035e-06,-4.39211363030523e-06,0.999999999940219,-1.0013580321667e-05,-0.405186647113659,0.914233985868487,-9.15475545077152e-06,0,0,-1 + } + NormalsW: *14 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementPolygonGroup: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Index" + PolygonGroup: *24 { + a: 15349,15349,15349,15349,15349,15349,15349,15349,15349,15349,15349,15349,9598,9598,9598,9598,9598,9598,9598,9598,9598,9598,9598,9598 + } + } + LayerElementColor: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Colors: *56 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "DiffuseUV" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.499994963407516,0.234738901257515,0.329321622848511,0.181317999958992,0,0.234738901257515,0.329321622848511,0.288161247968674,0.249997407197952,0.469477623701096,0.499994963407516,0.341585069894791,0.749992549419403,0.469477623701096,0.670668244361877,0.288159817457199,0.999989986419678,0.234738901257515,0.670668244361877,0.181317999958992,0.749992549419403,0,0.499994963407516,0.127895727753639,0.249997407197952,1.55095153786533e-06,0.499994963407516,0.234740257263184 + } + UVIndex: *72 { + a: 0,1,2,3,0,2,4,0,3,5,0,4,6,0,5,0,6,7,8,0,7,0,8,9,10,0,9,0,10,11,12,0,11,0,12,1,1,13,2,13,3,2,13,4,3,13,5,4,13,6,5,6,13,7,13,8,7,8,13,9,13,10,9,10,13,11,13,12,11,12,13,1 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *72 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: *24 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementPolygonGroup" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1459809808, "Geometry::Morph", "Shape" { + Version: 100 + Indexes: *1 { + a: 13 + } + Vertices: *3 { + a: -6.94987392080293e-08,0.0223557949066162,-0.943415522575378 + } + Normals: *3 { + a: 0,0,1 + } + } + Geometry: 1459815568, "Geometry::Back", "Shape" { + Version: 100 + Indexes: *1 { + a: 0 + } + Vertices: *3 { + a: 6.5785819458597e-08,0.0109646320343018,0.841829180717468 + } + Normals: *3 { + a: 0,0,-1 + } + } + Model: 676205664, "Model::20 Sided", "Mesh" { + Version: 232 + Properties70: { + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1465573248, "Model::PolyMesh3D1", "Mesh" { + Version: 232 + Properties70: { + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Material: 1459984464, "Material::20 Sided", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "SpecularColor", "Color", "", "A",0,0,0 + P: "ShininessExponent", "Number", "", "A",0 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Diffuse", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Specular", "Vector3D", "Vector", "",0,0,0 + P: "Shininess", "double", "Number", "",0 + P: "Opacity", "double", "Number", "",1 + P: "Reflectivity", "double", "Number", "",0 + } + } + Material: 1459985424, "Material::PolyMesh3D1", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "SpecularColor", "Color", "", "A",0,0,0 + P: "ShininessExponent", "Number", "", "A",0 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Diffuse", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Specular", "Vector3D", "Vector", "",0,0,0 + P: "Shininess", "double", "Number", "",0 + P: "Opacity", "double", "Number", "",1 + P: "Reflectivity", "double", "Number", "",0 + } + } + Deformer: 1464412176, "Deformer::PolyMesh3D1_Blendshape", "BlendShape" { + Version: 100 + } + Deformer: 1460843856, "SubDeformer::", "BlendShapeChannel" { + Version: 100 + DeformPercent: 0 + FullWeights: *1 { + a: 100 + } + } + Deformer: 1456133504, "SubDeformer::", "BlendShapeChannel" { + Version: 100 + DeformPercent: 0 + FullWeights: *1 { + a: 100 + } + } + Video: 1459988304, "Video::Diffuse Texture", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + P: "RelPath", "KString", "XRefUrl", "", "PolyMesh3D1_TXTR.tga" + } + UseMipMap: 0 + Filename: "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + RelativeFilename: "PolyMesh3D1_TXTR.tga" + Content: , + "AAACAAAAAAAAAAAAIAAgABgAbjC4bjueh0GZdziGk1+Ff2KYlleTh1aQjUqRp1WLlEdxf0V1iTRLhzxVnlUxm2ozjUE2pUJSqh1ApxM6kgxcsR1TmxlccQ5ejRldtD1lvTdn3F994zyE6FiW8U6x6VbHdjimdVGdeD6ShkiJlE2Si12YhEyWnFqVq0aIoU94jV1ii1Bng0pIlEtGi0tLgmkyhEE0ljRTpDk/myBDoxhGnCRFlSxUcxdjmi1gujtlxVFozmaJ0l+Y30+W516h9ly1dFWzfVSxh0WJkFh3kV6TnluMk1OMnFCQq0aEnEZylVJ3hT5sgU1Wk187e2NBcXwqeFVFnFFPmzpemTVJiTlCfjFRdB1mdC9mjjBnrVVkw1tt2Gpy22t912KE9Hyc7XC7jlnAm1WziVickWWEjFSRnmSTsF6JqluBsV54qEmCmDhthkRfflFdeVlNanZAZ3k7fnNChW1UhGVWg0JVgUlOdTZlfzJkdzBTlz9Xp1ZfvFxx23du3nh144Z545eh/5qslVKekVSRoGOFk2Fto2OMl2d1rW16plqCllFsmlF7kFdtik5cillBYGo/dXQ9ZXUgZXxLdXlKel5acVtMgDZJiEVPgEVFgC1ckE9epV9FwWle1oRt6JJj5JRx+oyM/52Ikz+emkeCmEuBoWNnt2lksWZ2om10nGaFlVGCjkxsgFdpkFpPhXA0Z4EwcXY3ZIAkZ35AcoZBdXNRc1xDbVxIgEYycTwxbjxKdk1DnmdKyHJF3Y5R5JRX54t8+pRr/5pzlz+QqFeMqVd2rWJskmJnqHGGqWl3rFqApEtunVxmhGNHiVk0d3JCbHsqUXsjXHknXn4hbnkzcnUmaH8kcGEia1AYcmMscUxHfmI0jGNDpoNXv4dG1YNT9X9q649h751nh0yQn1KHnUaCqFtzn1F3j2iElWiJoF9zo210kF9gkXU/gnc0cHc2Wo4iXJAjUYsvYpQfXIscZpkUVY4dYX0da3cVcF0gemE1hXREjmw3nWxSwoJT0JVC745Q9rNK+8BghjejhkuOg0+Sk2aAmFl1hFh9eVlklVVgiF9hjGtohGJMc4IzZ3w2W4EtZW4yU34tYXIcZJEXU4wMQYEQS34bY2MadmIaf1kgem47nHMkoo1LwI1Dv5Zb7ZBS1ZlX7cJSdk+aekeJckOLgFmLcF1weV5ob1NzfUNmal5Xd3FWZHFJa3JFZmsvaHkeYnowYF4mYXkiVIsdWoYjSIcNTnEXZWwoXl81a3AmcXcjkIYypH4woIhOvIdC05FWy65c2MVRcTiWaEaagkmpfjiOfEp/Z15uYkBad01qZVFfeWc/f2c4b201ZHUgT3okWm4jX2MoVFsVT30LU3gVUXkfTncgVmUobm4qZ38+a309gowvkotHlIFEvYU+v4o6w6ZF4q1ccCi6aDO5dDyudDehbEmVY0xybTVlYT1edUFLeltIflFMbWg+WWIqVmwQTWIAWFQNYE4FW1kWV2snT34dVHwdVWcqUWQnXXg6U3pBZpM4eIVBl5hNpaA4xJc80JU5161MajukVj2wbTSzbESxck2BbEmHZi9kaytxZEdNc1tKZU04T2o4WWQ1YFsmW0sLQ1MNUFAeWloSTGoiSYEmSHQoVnIaVHwpVIkzYZstfqRBi6ZHnKQ9o6I+zJc64qRP6KRKXja9YUe6Ulm7X02lXDmKZjKCZjJ/ZTp3X0lcWEpTTklIR1E6RD4nX0goW1seTVkSWE4TSlkdOG0vN4osVXwlXowYTH8MS4kYb5EcjK89jJQsppYyrItIzZtE56BM6rFWZ127alnDcmO4YUOWakClWziRVR50YzJuSzt0PTVpNjxaQV1SQVM7TlElTUkXVlQYPVQgOFYtLX05LXgsNYQpRIkhUqsmVrESWr4ljb8Si7Qdq7IXoaojtK5M0LQ+3LVCfXDDeGW3XlWjWVeiSjCbWSqZVCKIYiB/VSpsPSlhMS5KNFFRMU9DN0w7R14kRlckLko3KV48LX87MYU2Q5s1RKchWa4PV8QObroAdMQEd8wHlbsXqLoprq85z8RI5sE6hlDHjU+8ZGK+WFijTkuzUDOgWSqfUS99UTN+WDhqTDVoOkRVPVFFP0M6RkQfTlwbMl82JWw0KXQ4QoM0O6MjUp4UWbsvVLoaXs8Ubckuhb0hoL8dpLgqwrdQu7A03sA5fEfcik7Oe1i1ZFe1WkapYkG4YzydUiKGVTx5YD+KSU9xP01KRTw7V0MuZEomYFseQWsvPWclM4oySpwoTJ4dSaUoUKc3ZbkpacMng8k+g7MqlrcxprA6xbFVyrBC0K5Ih1PoiUvVfj7Df1a7bEjEajuwYSycPxaeXhycWh+IXziCSkRbVVxMZ2JKcF8yZl8WU2YYXW0aTYUvRJwhSaoxR6QeWrg3c7A+hbZCic9Ajr9TpK1At7VR0q5Nzq9W45VMmjbxkDjqhkTWiELZdi7YbBm7TxSgRhalVCSqUB6aXDtxcT5obl1NdWxNcmM2dHgqYIEeZIkcXocsWpYgUagZY7Ysb8JLfbBOi71KqsJdt8BJr7RVv65r0bZm4Zxh2pllhDzomE/WdEXTZ0TVYEPMWyq4TBenLym5OSeSUjCMbjR+YERgdEtijGdGdmgyeIImcH00bIcgZJclY5gdcpkue6EnZ5JBcptdjKVamLVSrrBipaBcwZZNzJxJzKBNxYthilnFg1bOe1vZYkLhRDXNQzW6MymqMy22RC6rU0aUaDaGaD9ycTRnkElGiVw5eoo2cGwvhm46d5Mtg501gKk1hZlAhIU4eYdRm4pVpo9WkpRmm59cp35WuXpNvIFQuIZXc1fdcUfXYjvvUTrjRDbiSi7PPibOLyjCP0etWU6MaU57XT1uilRLgFpChHgolocjg2wnj2sul4w7jZpAfIxEjoVagJRYlXxLh4tiqHdasndRpYhSvXhWx3lEtHVEwXJXY1PjVUP0QDjrSz/mTz/ZNijjMj3aPjnEOUWrQz1+ZDVrcT1WjFU8kVkyq3YeqXwkl3Ayj3MqnHBLjIFOkHpLloFYlYNqmYZjqoRKnWVGnGpJsmNUxWtJvW9Ps2RTsHpXZ1rVVk7rUELtPFzjTEbPMUK3SUHGVkLAWk6hRTmOaTpaW1Bcg0U9j1dDs2wssW4vnGktl1xKkFlPintTjGVilG5Npndqm4ZzqGNtmVRGsVtfolJZvWBitm5SxXRkwVpURmDCRGHNP1jaR2LdS1jGNEOqUj2nVUS6XjulXUWDVFdwXWFOhFlXnERHvGA+v3pApltbkFNamk9TmVlem21nmnlVl2RhlGiCk294r2JcpWRnsGFvv1V5vWNuyVtr0FhpTGPPOm/MPXHHLF7FOGDIMESmOU6bW0GqSVmHQ16AVU16Z2dif1xdlUBAqVxUsGxHoV1NnEpZiFBrmkpbp2tlqHBxqmhklGeFnGaDtHRcuGp5t2JztFGJ0Et+x11szUFiSHXXNmXOJFXIH2a6JFKvM1SzS1esUlGZPV+ERl59Rl5rXV1oXVVWeFNHm2BSrVJIpE5XjVRil2B1lU9vllxpr15vrlZtrGaExHByw2x6ylt5y16Mw12GykqOzDp72Ep4L1K+N1fLIlrHLFDBNlumPUGhOkqBTk6HXV14U2ZzZml5ZV5fa1xSe0lQmFdVvUk7sVRgqlddhlV0kESQlkCLt0aQqVmXqF6Pqkp9ukKPv1WS10+Yyk2kvTmUy0+V0UF7KVW5Lli4J1mzHFSuOT6UOUJ6RFN7TFBxWFF6YVpwbmZyaVVpg0pqhkBYkjhCsFFBsVFdqVR5l0OOjzybjUOrpzWksDWduEmlwTukujKM1T+Z3zqnzzeezTqY2zSi0zmRGWy6GU+tFmGvGkGbIkOQPlVtSVlnTUFcVD1ZV0xoY0pyekZXdz9QkDtLokBWslJPqkNUl0SFnjeCqSelsx+wtSGjuTu7szG6xiKesgmgyyaz5Bew1h6q3S2i4Tet7BixD2HBF1y+BlGbEUmSIk+ON1lyKENeN0NbVzhxXERrdE1pi0JXeU5JhFRGoF1PpVFYmDtolzJ8pSSgrByovB+tuSqquhetxR2+xha6xAC03wC/5AKx4wCl5Bq49xnR8hXT" + } + Texture: 1459985904, "Texture::Diffuse Texture", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Diffuse Texture" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::Diffuse Texture" + FileName: "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + RelativeFilename: "PolyMesh3D1_TXTR.tga" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + AnimationStack: 603872144, "AnimStack::Default animation", "" { + } + AnimationLayer: 1465152928, "AnimLayer::Base Layer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::20 Sided, Model::RootNode + C: "OO",676205664,0 + + ;Model::PolyMesh3D1, Model::RootNode + C: "OO",1465573248,0 + + ;AnimLayer::Base Layer, AnimStack::Default animation + C: "OO",1465152928,603872144 + + ;Geometry::20 Sided, Model::20 Sided + C: "OO",1464391744,676205664 + + ;Material::20 Sided, Model::20 Sided + C: "OO",1459984464,676205664 + + ;Deformer::PolyMesh3D1_Blendshape, Geometry::PolyMesh3D1 + C: "OO",1464412176,1464388416 + + ;Deformer::PolyMesh3D1_Blendshape, Geometry::PolyMesh3D1 + C: "OO",1464412176,1464388416 + + ;Geometry::PolyMesh3D1, Model::PolyMesh3D1 + C: "OO",1464388416,1465573248 + + ;Material::PolyMesh3D1, Model::PolyMesh3D1 + C: "OO",1459985424,1465573248 + + ;Texture::Diffuse Texture, Model::PolyMesh3D1 + C: "OO",1459985904,1465573248 + + ;Texture::Diffuse Texture, Material::PolyMesh3D1 + C: "OP",1459985904,1459985424, "DiffuseColor" + + ;Video::Diffuse Texture, Texture::Diffuse Texture + C: "OO",1459988304,1459985904 + + ;SubDeformer::, Deformer::PolyMesh3D1_Blendshape + C: "OO",1460843856,1464412176 + + ;SubDeformer::, Deformer::PolyMesh3D1_Blendshape + C: "OO",1456133504,1464412176 + + ;Geometry::Morph, SubDeformer:: + C: "OO",1459809808,1460843856 + + ;Geometry::Back, SubDeformer:: + C: "OO",1459815568,1456133504 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Default animation" { + FileName: "Default_animation.tak" + LocalTime: 0,46186158000 + ReferenceTime: 0,46186158000 + } +} diff --git a/modules/ufbx/data/zbrush_d20_7500_binary.fbx b/modules/ufbx/data/zbrush_d20_7500_binary.fbx new file mode 100644 index 0000000..9cd1ce8 Binary files /dev/null and b/modules/ufbx/data/zbrush_d20_7500_binary.fbx differ diff --git a/modules/ufbx/data/zbrush_d20_selection_set.obj b/modules/ufbx/data/zbrush_d20_selection_set.obj new file mode 100644 index 0000000..e85cc57 --- /dev/null +++ b/modules/ufbx/data/zbrush_d20_selection_set.obj @@ -0,0 +1,141 @@ +# ufbx:no_subdivision +# This file uses centimeters as units for non-parametric coordinates. + +g default +v 0.866138 0.999999 -0.500204 +v -0.000000 1.618027 -0.618705 +v -0.000000 0.617619 -0.999990 +v 0.535302 0.000009 -0.308467 +v -0.535303 0.000010 -0.308466 +v -0.866138 1.000000 -0.500204 +v 0.535303 1.618704 0.308466 +v -0.535302 1.618704 0.308467 +v 0.866138 0.618713 0.500204 +v -0.000000 0.000686 0.618705 +v -0.866138 0.618714 0.500204 +v 0.000000 1.001094 0.999990 +vt 0.600000 1.000000 +vt 0.500000 0.647584 +vt 0.700000 0.647584 +vt 0.800000 1.000000 +vt 0.900000 0.647584 +vt 0.000000 1.000000 +vt -0.100000 0.647584 +vt 0.100000 0.647584 +vt 0.200000 1.000000 +vt 0.300000 0.647584 +vt 0.400000 1.000000 +vt 0.400000 0.352416 +vt 0.600000 0.352416 +vt 0.800000 0.352416 +vt -0.200000 0.352416 +vt 0.000000 0.352416 +vt 0.200000 0.352416 +vt 0.700000 0.000000 +vt -0.100000 0.000000 +vt 0.100000 0.000000 +vt 0.300000 0.000000 +vt 0.500000 0.000000 +vn -0.000000 -0.188309 -0.982110 +vn 0.000000 0.794211 -0.607642 +vn 0.850651 0.187234 -0.491260 +vn 0.525731 -0.794876 -0.302951 +vn -0.525731 -0.794876 -0.302951 +vn -0.850651 0.187234 -0.491260 +vn -0.525731 0.794876 0.302951 +vn 0.525732 0.794876 0.302951 +vn 0.850651 -0.187234 0.491260 +vn -0.000000 -0.794211 0.607642 +vn -0.850651 -0.187234 0.491260 +vn 0.000000 0.188309 0.982110 +s 1 +g FBXASC0500FBXASC032Sided +f 3/1/1 2/2/2 1/3/3 +f 3/4/1 1/3/3 4/5/4 +f 3/6/1 4/7/4 5/8/5 +f 3/9/1 5/8/5 6/10/6 +f 3/11/1 6/10/6 2/2/2 +f 2/2/2 8/12/7 7/13/8 +f 1/3/3 7/13/8 9/14/9 +f 4/7/4 9/15/9 10/16/10 +f 5/8/5 10/16/10 11/17/11 +f 6/10/6 11/17/11 8/12/7 +f 7/13/8 1/3/3 2/2/2 +f 9/14/9 4/5/4 1/3/3 +f 10/16/10 5/8/5 4/7/4 +f 11/17/11 6/10/6 5/8/5 +f 8/12/7 2/2/2 6/10/6 +f 12/18/12 9/14/9 7/13/8 +f 12/19/12 10/16/10 9/15/9 +f 12/20/12 11/17/11 10/16/10 +f 12/21/12 8/12/7 11/17/11 +f 12/22/12 7/13/8 8/12/7 +g default +v -0.000000 2.823300 0.250000 +v -1.302800 2.823300 0.000000 +v -0.444711 3.020390 0.000000 +v -0.444711 2.626205 0.000000 +v -0.651400 1.957260 0.000000 +v -0.000000 2.429104 0.000000 +v 0.651400 1.957260 0.000000 +v 0.444711 2.626210 0.000000 +v 1.302800 2.823300 0.000000 +v 0.444711 3.020390 0.000000 +v 0.651400 3.689341 0.000000 +v -0.000000 3.217485 0.000000 +v -0.651400 3.689335 0.000000 +v -0.000000 2.823295 -0.250000 +vt 0.499995 0.234739 +vt 0.329322 0.181318 +vt 0.000000 0.234739 +vt 0.329322 0.288161 +vt 0.249997 0.469478 +vt 0.499995 0.341585 +vt 0.749993 0.469478 +vt 0.670668 0.288160 +vt 0.999990 0.234739 +vt 0.670668 0.181318 +vt 0.749993 0.000000 +vt 0.499995 0.127896 +vt 0.249997 0.000002 +vt 0.499995 0.234740 +vn 0.000001 0.000000 1.000000 +vn -0.775609 0.631213 -0.000007 +vn -1.000000 -0.000010 -0.000003 +vn -0.775612 -0.631210 0.000007 +vn -0.528456 -0.848961 0.000006 +vn -0.000000 -1.000000 0.000010 +vn 0.528470 -0.848952 0.000006 +vn 0.775609 -0.631214 0.000007 +vn 1.000000 0.000022 -0.000001 +vn 0.775611 0.631211 -0.000007 +vn 0.528470 0.848952 -0.000005 +vn -0.000005 1.000000 -0.000011 +vn -0.528464 0.848956 -0.000006 +vn 0.000001 0.000001 -1.000000 +s 1 +g PolyMesh3D1 +f 13/23/13 15/24/14 14/25/15 +f 16/26/16 13/23/13 14/25/15 +f 17/27/17 13/23/13 16/26/16 +f 18/28/18 13/23/13 17/27/17 +f 19/29/19 13/23/13 18/28/18 +f 13/23/13 19/29/19 20/30/20 +f 21/31/21 13/23/13 20/30/20 +f 13/23/13 21/31/21 22/32/22 +f 23/33/23 13/23/13 22/32/22 +f 13/23/13 23/33/23 24/34/24 +f 25/35/25 13/23/13 24/34/24 +f 13/23/13 25/35/25 15/24/14 +f 15/24/14 26/36/26 14/25/15 +f 26/36/26 16/26/16 14/25/15 +f 26/36/26 17/27/17 16/26/16 +f 26/36/26 18/28/18 17/27/17 +f 26/36/26 19/29/19 18/28/18 +f 19/29/19 26/36/26 20/30/20 +f 26/36/26 21/31/21 20/30/20 +f 21/31/21 26/36/26 22/32/22 +f 26/36/26 23/33/23 22/32/22 +f 23/33/23 26/36/26 24/34/24 +f 26/36/26 25/35/25 24/34/24 +f 25/35/25 26/36/26 15/24/14 diff --git a/modules/ufbx/data/zbrush_d20_selection_set_6100_ascii.fbx b/modules/ufbx/data/zbrush_d20_selection_set_6100_ascii.fbx new file mode 100644 index 0000000..9e224a7 --- /dev/null +++ b/modules/ufbx/data/zbrush_d20_selection_set_6100_ascii.fbx @@ -0,0 +1,1135 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 6 + Hour: 23 + Minute: 47 + Second: 49 + Millisecond: 30 + } + Creator: "FBX SDK/FBX Plugins version 2020.0.1" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 52 + ObjectType: "Model" { + Count: 2 + } + ObjectType: "Material" { + Count: 2 + } + ObjectType: "Texture" { + Count: 1 + } + ObjectType: "Video" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "Collection" { + Count: 22 + } + ObjectType: "SelectionNode" { + Count: 22 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::20 Sided", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: 0.866137802600861,0.999999046325684,-0.50020444393158,-5.13009688063448e-08,1.6180272102356,-0.618704557418823,-3.50126100556736e-07 + ,0.61761873960495,-0.999990046024323,0.535301983356476,9.05990600585938e-06,-0.308466523885727,-0.535303056240082 + ,9.5367431640625e-06,-0.308466225862503,-0.866137802600861,0.999999582767487,-0.500203847885132,0.535302817821503 + ,1.6187037229538,0.308466345071793,-0.535302102565765,1.61870431900024,0.308466643095016,0.866137802600861,0.618713438510895 + ,0.500203847885132,-6.79083314025775e-08,0.000685930252075195,0.618704557418823,-0.866137683391571,0.618713855743408 + ,0.50020444393158,2.30916811005955e-07,1.00109434127808,0.999990046024323 + PolygonVertexIndex: 2,1,-1,2,0,-4,2,3,-5,2,4,-6,2,5,-2,1,7,-7,0,6,-9,3,8,-10,4,9,-11,5,10,-8,6,0,-2,8,3,-1,9,4,-4,10,5,-5,7,1,-6,11,8 + ,-7,11,9,-9,11,10,-10,11,7,-11,11,6,-8 + Edges: 0,1,2,4,5,7,8,10,11,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,45,47,48,51,54 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: 0.850650733723288,0.187233654239426,-0.491260509237393,1.02138348777367e-07,0.794211116422733,-0.607641919678478 + ,-3.85467540132469e-07,-0.188309388160735,-0.982109756763663,0.525730674836928,-0.794876031157345,-0.302951072992084 + ,-0.525731468908189,-0.794875613767813,-0.302950790124206,-0.850650919148138,0.187234255046484,-0.491259959176012 + ,0.525731576831274,0.794875547342598,0.302950777122798,-0.525730884434197,0.794875888589895,0.302951083329407 + ,0.850650867750242,-0.187234256487049,0.491260047626002,-3.81473211581915e-08,-0.794211182528283,0.607641833276005 + ,-0.850650743254332,-0.187233603145446,0.491260512207145,3.81885808781724e-07,0.188309273968033,0.982109778658927 + + } + LayerElementColor: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Colors: 1,1,1,1,0,1,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0.0274509803921569,0.0274509803921569 + ,1,1,1,1,1,1,1,1,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "DiffuseUV" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.600000023841858,1,0.5,0.647584021091461,0.699999988079071,0.647584021091461,0.800000011920929,1,0.899999976158142 + ,0.647584021091461,0,1,-0.100000001490116,0.647584021091461,0.100000001490116,0.647584021091461,0.200000002980232 + ,1,0.300000011920929,0.647584021091461,0.400000005960464,1,0.400000005960464,0.352416008710861,0.600000023841858 + ,0.352416008710861,0.800000011920929,0.352416008710861,-0.200000002980232,0.352416008710861,0,0.352416008710861 + ,0.200000002980232,0.352416008710861,0.699999988079071,0,-0.100000001490116,0,0.100000001490116,0,0.300000011920929 + ,0,0.5,0 + UVIndex: 0,1,2,3,2,4,5,6,7,8,7,9,10,9,1,1,11,12,2,12,13,6,14,15,7,15,16,9,16,11,12,2,1,13,4,2,15,7,6,16,9,7,11,1,9,17 + ,13,12,18,15,14,19,16,15,20,11,16,21,12,11 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + LayerElementEdgeCrease: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementTexture: 0 { + Version: 101 + Name: "Diffuse Layer" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Translucent" + TextureAlpha: 1 + TextureId: -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::20 Sided_ncl1_1" + } + Model: "Model::PolyMesh3D1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",0 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",0 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + Property: "Morph", "Number", "AN",0 + Property: "Back", "Number", "AN",0 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: -1.5530584107637e-07,2.82330012321472,0.25,-1.30279982089996,2.82330012321472,0,-0.444710940122604,3.02039003372192 + ,0,-0.444710940122604,2.62620496749878,0,-0.651400148868561,1.95726037025452,0,-1.5530584107637e-07,2.42910432815552 + ,0,0.651399910449982,1.95726037025452,0,0.44471064209938,2.62621021270752,0,1.30279982089996,2.82330012321472,0,0.44471064209938 + ,3.02039003372192,0,0.651399910449982,3.68934059143066,0,-1.5530584107637e-07,3.21748495101929,0,-0.651400148868561 + ,3.68933486938477,0,-1.5530584107637e-07,2.82329511642456,-0.25 + PolygonVertexIndex: 0,2,-2,3,0,-2,4,0,-4,5,0,-5,6,0,-6,0,6,-8,8,0,-8,0,8,-10,10,0,-10,0,10,-12,12,0,-12,0,12,-3,2,13,-2,13,3,-2,13,4,-4 + ,13,5,-5,13,6,-6,6,13,-8,13,8,-8,8,13,-10,13,10,-10,10,13,-12,13,12,-12,12,13,-3 + Edges: 0,1,2,3,5,6,8,9,11,12,14,16,17,18,20,22,23,24,26,28,29,30,32,34,36,37,39,42,45,48,52,54,58,60,64,66 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: 0,0,1,-1,0,2.81650199299197e-16,-0.799169337173009,0.601105956122731,-6.0192227739297e-06,-0.799171006581211 + ,-0.601103736640975,6.01920054876596e-06,-0.405196479131449,-0.914229628274904,9.15471181542992e-06,0,-0.999999999949864 + ,1.00135803217636e-05,0.405205482104045,-0.914225638006844,9.1546718589237e-06,0.799170900891885,-0.60110387715554 + ,6.01920195602474e-06,1,0,0,0.799171139377341,0.601103560087687,-6.01919878093787e-06,0.405186637527057,0.91423399011725 + ,-9.15475549368035e-06,-4.39211363030523e-06,0.999999999940219,-1.0013580321667e-05,-0.405186647113659,0.914233985868487 + ,-9.15475545077152e-06,0,0,-1 + } + LayerElementColor: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Colors: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + ,1 + } + LayerElementUV: 0 { + Version: 101 + Name: "DiffuseUV" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.499994963407516,0.234738901257515,0.329321622848511,0.181317999958992,0,0.234738901257515,0.329321622848511 + ,0.288161247968674,0.249997407197952,0.469477623701096,0.499994963407516,0.341585069894791,0.749992549419403 + ,0.469477623701096,0.670668244361877,0.288159817457199,0.999989986419678,0.234738901257515,0.670668244361877 + ,0.181317999958992,0.749992549419403,0,0.499994963407516,0.127895727753639,0.249997407197952,1.55095153786533e-06 + ,0.499994963407516,0.234740257263184 + UVIndex: 0,1,2,3,0,2,4,0,3,5,0,4,6,0,5,0,6,7,8,0,7,0,8,9,10,0,9,0,10,11,12,0,11,0,12,1,1,13,2,13,3,2,13,4,3,13,5,4,13 + ,6,5,6,13,7,13,8,7,8,13,9,13,10,9,10,13,11,13,12,11,12,13,1 + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + LayerElementEdgeCrease: 0 { + Version: 100 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + LayerElementTexture: 0 { + Version: 101 + Name: "Diffuse Layer" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + BlendMode: "Translucent" + TextureAlpha: 1 + TextureId: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + Shape: "Morph" { + Indexes: 13 + Vertices: -6.94987392080293e-08,0.0223557949066162,-0.943415522575378 + Normals: 0,0,1 + } + Shape: "Back" { + Indexes: 0 + Vertices: 6.5785819458597e-08,0.0109646320343018,0.841829180717468 + Normals: 0,0,-1 + } + Shape: "Morph" { + Indexes: 13 + Vertices: -6.94987392080293e-08,0.0223557949066162,-0.943415522575378 + Normals: 0,0,2 + } + Shape: "Back" { + Indexes: 0 + Vertices: 6.5785819458597e-08,0.0109646320343018,0.841829180717468 + Normals: 0,0,-2 + } + NodeAttributeName: "Geometry::PolyMesh3D1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\zbrush_d20_selection_set_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\clean\ufbx\data\zbrush_d20_selection_set_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "" + Property: "Original|ApplicationName", "KString", "", "" + Property: "Original|ApplicationVersion", "KString", "", "" + Property: "Original|DateTime_GMT", "DateTime", "", "" + Property: "Original|FileName", "KString", "", "" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "" + Property: "LastSaved|ApplicationName", "KString", "", "" + Property: "LastSaved|ApplicationVersion", "KString", "", "" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "" + } + } + SelectionNode: "SelectionNode::20 Sided_10_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 0 + } + SelectionNode: "SelectionNode::20 Sided_15_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 1 + } + SelectionNode: "SelectionNode::20 Sided_20_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 2 + } + SelectionNode: "SelectionNode::20 Sided_25_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 3 + } + SelectionNode: "SelectionNode::20 Sided_30_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 4 + } + SelectionNode: "SelectionNode::20 Sided_35_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 5 + } + SelectionNode: "SelectionNode::20 Sided_40_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 6 + } + SelectionNode: "SelectionNode::20 Sided_45_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 7 + } + SelectionNode: "SelectionNode::20 Sided_50_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 8 + } + SelectionNode: "SelectionNode::20 Sided_55_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 9 + } + SelectionNode: "SelectionNode::20 Sided_60_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 10 + } + SelectionNode: "SelectionNode::20 Sided_65_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 11 + } + SelectionNode: "SelectionNode::20 Sided_70_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 12 + } + SelectionNode: "SelectionNode::20 Sided_75_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 13 + } + SelectionNode: "SelectionNode::20 Sided_80_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 14 + } + SelectionNode: "SelectionNode::20 Sided_85_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 15 + } + SelectionNode: "SelectionNode::20 Sided_90_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 16 + } + SelectionNode: "SelectionNode::20 Sided_95_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 17 + } + SelectionNode: "SelectionNode::20 Sided_100_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 18 + } + SelectionNode: "SelectionNode::20 Sided_105_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 19 + } + SelectionNode: "SelectionNode::PolyMesh3D1_9598_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::PolyMesh3D1" + IsTheNodeInSet: 0 + PolygonIndexArray: 12,13,14,15,16,17,18,19,20,21,22,23 + } + SelectionNode: "SelectionNode::PolyMesh3D1_15349_SelectionNode", "" { + SelectionNode: 100 + Properties60: { + } + Node: "Model::PolyMesh3D1" + IsTheNodeInSet: 0 + PolygonIndexArray: 0,1,2,3,4,5,6,7,8,9,10,11 + } + Collection: "SelectionSet::20 Sided_10", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_10_SelectionNode" + } + Collection: "SelectionSet::20 Sided_15", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_15_SelectionNode" + } + Collection: "SelectionSet::20 Sided_20", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_20_SelectionNode" + } + Collection: "SelectionSet::20 Sided_25", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_25_SelectionNode" + } + Collection: "SelectionSet::20 Sided_30", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_30_SelectionNode" + } + Collection: "SelectionSet::20 Sided_35", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_35_SelectionNode" + } + Collection: "SelectionSet::20 Sided_40", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_40_SelectionNode" + } + Collection: "SelectionSet::20 Sided_45", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_45_SelectionNode" + } + Collection: "SelectionSet::20 Sided_50", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_50_SelectionNode" + } + Collection: "SelectionSet::20 Sided_55", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_55_SelectionNode" + } + Collection: "SelectionSet::20 Sided_60", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_60_SelectionNode" + } + Collection: "SelectionSet::20 Sided_65", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_65_SelectionNode" + } + Collection: "SelectionSet::20 Sided_70", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_70_SelectionNode" + } + Collection: "SelectionSet::20 Sided_75", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_75_SelectionNode" + } + Collection: "SelectionSet::20 Sided_80", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_80_SelectionNode" + } + Collection: "SelectionSet::20 Sided_85", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_85_SelectionNode" + } + Collection: "SelectionSet::20 Sided_90", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_90_SelectionNode" + } + Collection: "SelectionSet::20 Sided_95", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_95_SelectionNode" + } + Collection: "SelectionSet::20 Sided_100", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_100_SelectionNode" + } + Collection: "SelectionSet::20 Sided_105", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::20 Sided_105_SelectionNode" + } + Collection: "SelectionSet::PolyMesh3D1_9598", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::PolyMesh3D1_9598_SelectionNode" + } + Collection: "SelectionSet::PolyMesh3D1_15349", "SelectionSet" { + Version: 100 + Properties60: { + Property: "SelectionSetAnnotation", "KString", "", "" + } + NbMembers: 1 + Member: "SelectionNode::PolyMesh3D1_15349_SelectionNode" + } + Material: "Material::PolyMesh3D1_ncl1_2", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0.5,0.5,0.5 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",1 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",0 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "SpecularColor", "Color", "A",0,0,0 + Property: "SpecularFactor", "Number", "A",1 + Property: "ShininessExponent", "Number", "A",0 + Property: "ReflectionColor", "Color", "A",0,0,0 + Property: "ReflectionFactor", "Number", "A",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0.5,0.5,0.5 + Property: "Diffuse", "Vector3D", "",0.5,0.5,0.5 + Property: "Specular", "Vector3D", "",0,0,0 + Property: "Shininess", "double", "",0 + Property: "Opacity", "double", "",1 + Property: "Reflectivity", "double", "",0 + } + } + Material: "Material::20 Sided_ncl1_2", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Phong" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0.5,0.5,0.5 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",1 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",0 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "SpecularColor", "Color", "A",0,0,0 + Property: "SpecularFactor", "Number", "A",1 + Property: "ShininessExponent", "Number", "A",0 + Property: "ReflectionColor", "Color", "A",0,0,0 + Property: "ReflectionFactor", "Number", "A",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0.5,0.5,0.5 + Property: "Diffuse", "Vector3D", "",0.5,0.5,0.5 + Property: "Specular", "Vector3D", "",0,0,0 + Property: "Shininess", "double", "",0 + Property: "Opacity", "double", "",1 + Property: "Reflectivity", "double", "",0 + } + } + Video: "Video::Diffuse Texture", "Clip" { + Type: "Clip" + Properties60: { + Property: "Path", "KString", "", "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + Property: "RelPath", "KString", "", "PolyMesh3D1_TXTR.tga" + Property: "Color", "ColorRGB", "",0.8,0.8,0.8 + Property: "ClipIn", "KTime", "",0 + Property: "ClipOut", "KTime", "",0 + Property: "Offset", "KTime", "",0 + Property: "PlaySpeed", "double", "",0 + Property: "FreeRunning", "bool", "",0 + Property: "Loop", "bool", "",0 + Property: "Mute", "bool", "",0 + Property: "AccessMode", "enum", "",0 + Property: "ImageSequence", "bool", "",0 + Property: "ImageSequenceOffset", "int", "",0 + Property: "FrameRate", "double", "",0 + Property: "LastFrame", "int", "",0 + Property: "Width", "int", "",0 + Property: "Height", "int", "",0 + Property: "StartFrame", "int", "",0 + Property: "StopFrame", "int", "",0 + Property: "InterlaceMode", "enum", "",0 + } + UseMipMap: 0 + Filename: "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + RelativeFilename: "PolyMesh3D1_TXTR.tga" + } + Texture: "Texture::Diffuse Texture", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Diffuse Texture" + Properties60: { + Property: "TextureTypeUse", "enum", "",0 + Property: "Texture alpha", "Number", "A",1 + Property: "CurrentMappingType", "enum", "",0 + Property: "WrapModeU", "enum", "",0 + Property: "WrapModeV", "enum", "",0 + Property: "UVSwap", "bool", "",0 + Property: "PremultiplyAlpha", "bool", "",1 + Property: "Translation", "Vector", "A",0,0,0 + Property: "Rotation", "Vector", "A",0,0,0 + Property: "Scaling", "Vector", "A",1,1,1 + Property: "TextureRotationPivot", "Vector3D", "",0,0,0 + Property: "TextureScalingPivot", "Vector3D", "",0,0,0 + Property: "CurrentTextureBlendMode", "enum", "",1 + Property: "UVSet", "KString", "", "default" + Property: "UseMaterial", "bool", "",1 + Property: "UseMipMap", "bool", "",0 + } + Media: "Video::Diffuse Texture" + FileName: "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + RelativeFilename: "PolyMesh3D1_TXTR.tga" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",-1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",0 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",0 + Property: "TimeSpanStop", "KTime", "",46186158000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::20 Sided", "Model::Scene" + Connect: "OO", "Model::PolyMesh3D1", "Model::Scene" + Connect: "OO", "Material::20 Sided_ncl1_2", "Model::20 Sided" + Connect: "OO", "SelectionNode::20 Sided_10_SelectionNode", "SelectionSet::20 Sided_10" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_10_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_15_SelectionNode", "SelectionSet::20 Sided_15" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_15_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_20_SelectionNode", "SelectionSet::20 Sided_20" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_20_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_25_SelectionNode", "SelectionSet::20 Sided_25" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_25_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_30_SelectionNode", "SelectionSet::20 Sided_30" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_30_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_35_SelectionNode", "SelectionSet::20 Sided_35" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_35_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_40_SelectionNode", "SelectionSet::20 Sided_40" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_40_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_45_SelectionNode", "SelectionSet::20 Sided_45" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_45_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_50_SelectionNode", "SelectionSet::20 Sided_50" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_50_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_55_SelectionNode", "SelectionSet::20 Sided_55" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_55_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_60_SelectionNode", "SelectionSet::20 Sided_60" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_60_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_65_SelectionNode", "SelectionSet::20 Sided_65" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_65_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_70_SelectionNode", "SelectionSet::20 Sided_70" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_70_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_75_SelectionNode", "SelectionSet::20 Sided_75" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_75_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_80_SelectionNode", "SelectionSet::20 Sided_80" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_80_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_85_SelectionNode", "SelectionSet::20 Sided_85" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_85_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_90_SelectionNode", "SelectionSet::20 Sided_90" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_90_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_95_SelectionNode", "SelectionSet::20 Sided_95" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_95_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_100_SelectionNode", "SelectionSet::20 Sided_100" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_100_SelectionNode" + Connect: "OO", "SelectionNode::20 Sided_105_SelectionNode", "SelectionSet::20 Sided_105" + Connect: "OO", "Model::20 Sided", "SelectionNode::20 Sided_105_SelectionNode" + Connect: "OO", "Material::PolyMesh3D1_ncl1_2", "Model::PolyMesh3D1" + Connect: "OO", "Texture::Diffuse Texture", "Model::PolyMesh3D1" + Connect: "OO", "SelectionNode::PolyMesh3D1_9598_SelectionNode", "SelectionSet::PolyMesh3D1_9598" + Connect: "OO", "Model::PolyMesh3D1", "SelectionNode::PolyMesh3D1_9598_SelectionNode" + Connect: "OO", "SelectionNode::PolyMesh3D1_15349_SelectionNode", "SelectionSet::PolyMesh3D1_15349" + Connect: "OO", "Model::PolyMesh3D1", "SelectionNode::PolyMesh3D1_15349_SelectionNode" + Connect: "OO", "Video::Diffuse Texture", "Texture::Diffuse Texture" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Default animation" { + FileName: "Default_animation.tak" + LocalTime: 0,46186158000 + ReferenceTime: 0,46186158000 + + ;Models animation + ;---------------------------------------------------- + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "30" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 0 + TimeLineStopTime: 141120000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/data/zbrush_d20_selection_set_6100_binary.fbx b/modules/ufbx/data/zbrush_d20_selection_set_6100_binary.fbx new file mode 100644 index 0000000..387d3e4 Binary files /dev/null and b/modules/ufbx/data/zbrush_d20_selection_set_6100_binary.fbx differ diff --git a/modules/ufbx/data/zbrush_d20_selection_set_7500_ascii.fbx b/modules/ufbx/data/zbrush_d20_selection_set_7500_ascii.fbx new file mode 100644 index 0000000..fc04a5d --- /dev/null +++ b/modules/ufbx/data/zbrush_d20_selection_set_7500_ascii.fbx @@ -0,0 +1,1106 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 6 + Day: 6 + Hour: 23 + Minute: 45 + Second: 51 + Millisecond: 642 + } + Creator: "FBX SDK/FBX Plugins version 2020.0.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\zbrush_d20_selection_set_7700_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\zbrush_d20_selection_set_7700_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "" + P: "Original|ApplicationName", "KString", "", "", "" + P: "Original|ApplicationVersion", "KString", "", "", "" + P: "Original|DateTime_GMT", "DateTime", "", "", "" + P: "Original|FileName", "KString", "", "", "" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "" + P: "LastSaved|ApplicationName", "KString", "", "", "" + P: "LastSaved|ApplicationVersion", "KString", "", "", "" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",-1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",0 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",46186158000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1877276272, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 60 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 4 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 2 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + } + } + } + ObjectType: "Collection" { + Count: 22 + PropertyTemplate: "FbxSelectionSet" { + Properties70: { + P: "SelectionSetAnnotation", "KString", "", "", "" + } + } + } + ObjectType: "SelectionNode" { + Count: 22 + } + ObjectType: "Material" { + Count: 2 + PropertyTemplate: "FbxSurfacePhong" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Phong" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + P: "SpecularColor", "Color", "", "A",0.2,0.2,0.2 + P: "SpecularFactor", "Number", "", "A",1 + P: "ShininessExponent", "Number", "", "A",20 + P: "ReflectionColor", "Color", "", "A",0,0,0 + P: "ReflectionFactor", "Number", "", "A",1 + } + } + } + ObjectType: "Texture" { + Count: 1 + PropertyTemplate: "FbxFileTexture" { + Properties70: { + P: "TextureTypeUse", "enum", "", "",0 + P: "Texture alpha", "Number", "", "A",1 + P: "CurrentMappingType", "enum", "", "",0 + P: "WrapModeU", "enum", "", "",0 + P: "WrapModeV", "enum", "", "",0 + P: "UVSwap", "bool", "", "",0 + P: "PremultiplyAlpha", "bool", "", "",1 + P: "Translation", "Vector", "", "A",0,0,0 + P: "Rotation", "Vector", "", "A",0,0,0 + P: "Scaling", "Vector", "", "A",1,1,1 + P: "TextureRotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "TextureScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "CurrentTextureBlendMode", "enum", "", "",1 + P: "UVSet", "KString", "", "", "default" + P: "UseMaterial", "bool", "", "",0 + P: "UseMipMap", "bool", "", "",0 + } + } + } + ObjectType: "Deformer" { + Count: 3 + } + ObjectType: "Video" { + Count: 1 + PropertyTemplate: "FbxVideo" { + Properties70: { + P: "Path", "KString", "XRefUrl", "", "" + P: "RelPath", "KString", "XRefUrl", "", "" + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "ClipIn", "KTime", "Time", "",0 + P: "ClipOut", "KTime", "Time", "",0 + P: "Offset", "KTime", "Time", "",0 + P: "PlaySpeed", "double", "Number", "",0 + P: "FreeRunning", "bool", "", "",0 + P: "Loop", "bool", "", "",0 + P: "Mute", "bool", "", "",0 + P: "AccessMode", "enum", "", "",0 + P: "ImageSequence", "bool", "", "",0 + P: "ImageSequenceOffset", "int", "Integer", "",0 + P: "FrameRate", "double", "Number", "",0 + P: "LastFrame", "int", "Integer", "",0 + P: "Width", "int", "Integer", "",0 + P: "Height", "int", "Integer", "",0 + P: "StartFrame", "int", "Integer", "",0 + P: "StopFrame", "int", "Integer", "",0 + P: "InterlaceMode", "enum", "", "",0 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1464386752, "Geometry::20 Sided", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *36 { + a: 0.866137802600861,0.999999046325684,-0.50020444393158,-5.13009688063448e-08,1.6180272102356,-0.618704557418823,-3.50126100556736e-07,0.61761873960495,-0.999990046024323,0.535301983356476,9.05990600585938e-06,-0.308466523885727,-0.535303056240082,9.5367431640625e-06,-0.308466225862503,-0.866137802600861,0.999999582767487,-0.500203847885132,0.535302817821503,1.6187037229538,0.308466345071793,-0.535302102565765,1.61870431900024,0.308466643095016,0.866137802600861,0.618713438510895,0.500203847885132,-6.79083314025775e-08,0.000685930252075195,0.618704557418823,-0.866137683391571,0.618713855743408,0.50020444393158,2.30916811005955e-07,1.00109434127808,0.999990046024323 + } + PolygonVertexIndex: *60 { + a: 2,1,-1,2,0,-4,2,3,-5,2,4,-6,2,5,-2,1,7,-7,0,6,-9,3,8,-10,4,9,-11,5,10,-8,6,0,-2,8,3,-1,9,4,-4,10,5,-5,7,1,-6,11,8,-7,11,9,-9,11,10,-10,11,7,-11,11,6,-8 + } + Edges: *30 { + a: 0,1,2,4,5,7,8,10,11,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,45,47,48,51,54 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *36 { + a: 0.850650733723288,0.187233654239426,-0.491260509237393,1.02138348777367e-07,0.794211116422733,-0.607641919678478,-3.85467540132469e-07,-0.188309388160735,-0.982109756763663,0.525730674836928,-0.794876031157345,-0.302951072992084,-0.525731468908189,-0.794875613767813,-0.302950790124206,-0.850650919148138,0.187234255046484,-0.491259959176012,0.525731576831274,0.794875547342598,0.302950777122798,-0.525730884434197,0.794875888589895,0.302951083329407,0.850650867750242,-0.187234256487049,0.491260047626002,-3.81473211581915e-08,-0.794211182528283,0.607641833276005,-0.850650743254332,-0.187233603145446,0.491260512207145,3.81885808781724e-07,0.188309273968033,0.982109778658927 + } + NormalsW: *12 { + a: 1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementColor: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Colors: *48 { + a: 1,1,1,1,0,1,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0.0274509803921569,0.0274509803921569,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "DiffuseUV" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *44 { + a: 0.600000023841858,1,0.5,0.647584021091461,0.699999988079071,0.647584021091461,0.800000011920929,1,0.899999976158142,0.647584021091461,0,1,-0.100000001490116,0.647584021091461,0.100000001490116,0.647584021091461,0.200000002980232,1,0.300000011920929,0.647584021091461,0.400000005960464,1,0.400000005960464,0.352416008710861,0.600000023841858,0.352416008710861,0.800000011920929,0.352416008710861,-0.200000002980232,0.352416008710861,0,0.352416008710861,0.200000002980232,0.352416008710861,0.699999988079071,0,-0.100000001490116,0,0.100000001490116,0,0.300000011920929,0,0.5,0 + } + UVIndex: *60 { + a: 0,1,2,3,2,4,5,6,7,8,7,9,10,9,1,1,11,12,2,12,13,6,14,15,7,15,16,9,16,11,12,2,1,13,4,2,15,7,6,16,9,7,11,1,9,17,13,12,18,15,14,19,16,15,20,11,16,21,12,11 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: *20 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *60 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: *20 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1464385088, "Geometry::PolyMesh3D1", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *42 { + a: -1.5530584107637e-07,2.82330012321472,0.25,-1.30279982089996,2.82330012321472,-0,-0.444710940122604,3.02039003372192,-0,-0.444710940122604,2.62620496749878,-0,-0.651400148868561,1.95726037025452,-0,-1.5530584107637e-07,2.42910432815552,-0,0.651399910449982,1.95726037025452,-0,0.44471064209938,2.62621021270752,-0,1.30279982089996,2.82330012321472,-0,0.44471064209938,3.02039003372192,-0,0.651399910449982,3.68934059143066,-0,-1.5530584107637e-07,3.21748495101929,-0,-0.651400148868561,3.68933486938477,-0,-1.5530584107637e-07,2.82329511642456,-0.25 + } + PolygonVertexIndex: *72 { + a: 0,2,-2,3,0,-2,4,0,-4,5,0,-5,6,0,-6,0,6,-8,8,0,-8,0,8,-10,10,0,-10,0,10,-12,12,0,-12,0,12,-3,2,13,-2,13,3,-2,13,4,-4,13,5,-5,13,6,-6,6,13,-8,13,8,-8,8,13,-10,13,10,-10,10,13,-12,13,12,-12,12,13,-3 + } + Edges: *36 { + a: 0,1,2,3,5,6,8,9,11,12,14,16,17,18,20,22,23,24,26,28,29,30,32,34,36,37,39,42,45,48,52,54,58,60,64,66 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *42 { + a: 0,0,1,-1,0,2.81650199299197e-16,-0.799169337173009,0.601105956122731,-6.0192227739297e-06,-0.799171006581211,-0.601103736640975,6.01920054876596e-06,-0.405196479131449,-0.914229628274904,9.15471181542992e-06,0,-0.999999999949864,1.00135803217636e-05,0.405205482104045,-0.914225638006844,9.1546718589237e-06,0.799170900891885,-0.60110387715554,6.01920195602474e-06,1,0,0,0.799171139377341,0.601103560087687,-6.01919878093787e-06,0.405186637527057,0.91423399011725,-9.15475549368035e-06,-4.39211363030523e-06,0.999999999940219,-1.0013580321667e-05,-0.405186647113659,0.914233985868487,-9.15475545077152e-06,0,0,-1 + } + NormalsW: *14 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementColor: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Colors: *56 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "DiffuseUV" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.499994963407516,0.234738901257515,0.329321622848511,0.181317999958992,0,0.234738901257515,0.329321622848511,0.288161247968674,0.249997407197952,0.469477623701096,0.499994963407516,0.341585069894791,0.749992549419403,0.469477623701096,0.670668244361877,0.288159817457199,0.999989986419678,0.234738901257515,0.670668244361877,0.181317999958992,0.749992549419403,0,0.499994963407516,0.127895727753639,0.249997407197952,1.55095153786533e-06,0.499994963407516,0.234740257263184 + } + UVIndex: *72 { + a: 0,1,2,3,0,2,4,0,3,5,0,4,6,0,5,0,6,7,8,0,7,0,8,9,10,0,9,0,10,11,12,0,11,0,12,1,1,13,2,13,3,2,13,4,3,13,5,4,13,6,5,6,13,7,13,8,7,8,13,9,13,10,9,10,13,11,13,12,11,12,13,1 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *72 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: *24 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1870507424, "Geometry::Morph", "Shape" { + Version: 100 + Indexes: *1 { + a: 13 + } + Vertices: *3 { + a: -6.94987392080293e-08,0.0223557949066162,-0.943415522575378 + } + Normals: *3 { + a: 0,0,1 + } + } + Geometry: 1870505984, "Geometry::Back", "Shape" { + Version: 100 + Indexes: *1 { + a: 0 + } + Vertices: *3 { + a: 6.5785819458597e-08,0.0109646320343018,0.841829180717468 + } + Normals: *3 { + a: 0,0,-1 + } + } + Model: 1875276032, "Model::20 Sided", "Mesh" { + Version: 232 + Properties70: { + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Model: 1875284032, "Model::PolyMesh3D1", "Mesh" { + Version: 232 + Properties70: { + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Material: 1459984944, "Material::20 Sided", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "SpecularColor", "Color", "", "A",0,0,0 + P: "ShininessExponent", "Number", "", "A",0 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Diffuse", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Specular", "Vector3D", "Vector", "",0,0,0 + P: "Shininess", "double", "Number", "",0 + P: "Opacity", "double", "Number", "",1 + P: "Reflectivity", "double", "Number", "",0 + } + } + Material: 1459989744, "Material::PolyMesh3D1", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "SpecularColor", "Color", "", "A",0,0,0 + P: "ShininessExponent", "Number", "", "A",0 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Diffuse", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Specular", "Vector3D", "Vector", "",0,0,0 + P: "Shininess", "double", "Number", "",0 + P: "Opacity", "double", "Number", "",1 + P: "Reflectivity", "double", "Number", "",0 + } + } + Deformer: 1459449664, "Deformer::PolyMesh3D1_Blendshape", "BlendShape" { + Version: 100 + } + Deformer: 1873869888, "SubDeformer::", "BlendShapeChannel" { + Version: 100 + DeformPercent: 0 + FullWeights: *1 { + a: 100 + } + } + Deformer: 1875088672, "SubDeformer::", "BlendShapeChannel" { + Version: 100 + DeformPercent: 0 + FullWeights: *1 { + a: 100 + } + } + Video: 1459988784, "Video::Diffuse Texture", "Clip" { + Type: "Clip" + Properties70: { + P: "Path", "KString", "XRefUrl", "", "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + P: "RelPath", "KString", "XRefUrl", "", "PolyMesh3D1_TXTR.tga" + } + UseMipMap: 0 + Filename: "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + RelativeFilename: "PolyMesh3D1_TXTR.tga" + Content: , + "AAACAAAAAAAAAAAAIAAgABgAbjC4bjueh0GZdziGk1+Ff2KYlleTh1aQjUqRp1WLlEdxf0V1iTRLhzxVnlUxm2ozjUE2pUJSqh1ApxM6kgxcsR1TmxlccQ5ejRldtD1lvTdn3F994zyE6FiW8U6x6VbHdjimdVGdeD6ShkiJlE2Si12YhEyWnFqVq0aIoU94jV1ii1Bng0pIlEtGi0tLgmkyhEE0ljRTpDk/myBDoxhGnCRFlSxUcxdjmi1gujtlxVFozmaJ0l+Y30+W516h9ly1dFWzfVSxh0WJkFh3kV6TnluMk1OMnFCQq0aEnEZylVJ3hT5sgU1Wk187e2NBcXwqeFVFnFFPmzpemTVJiTlCfjFRdB1mdC9mjjBnrVVkw1tt2Gpy22t912KE9Hyc7XC7jlnAm1WziVickWWEjFSRnmSTsF6JqluBsV54qEmCmDhthkRfflFdeVlNanZAZ3k7fnNChW1UhGVWg0JVgUlOdTZlfzJkdzBTlz9Xp1ZfvFxx23du3nh144Z545eh/5qslVKekVSRoGOFk2Fto2OMl2d1rW16plqCllFsmlF7kFdtik5cillBYGo/dXQ9ZXUgZXxLdXlKel5acVtMgDZJiEVPgEVFgC1ckE9epV9FwWle1oRt6JJj5JRx+oyM/52Ikz+emkeCmEuBoWNnt2lksWZ2om10nGaFlVGCjkxsgFdpkFpPhXA0Z4EwcXY3ZIAkZ35AcoZBdXNRc1xDbVxIgEYycTwxbjxKdk1DnmdKyHJF3Y5R5JRX54t8+pRr/5pzlz+QqFeMqVd2rWJskmJnqHGGqWl3rFqApEtunVxmhGNHiVk0d3JCbHsqUXsjXHknXn4hbnkzcnUmaH8kcGEia1AYcmMscUxHfmI0jGNDpoNXv4dG1YNT9X9q649h751nh0yQn1KHnUaCqFtzn1F3j2iElWiJoF9zo210kF9gkXU/gnc0cHc2Wo4iXJAjUYsvYpQfXIscZpkUVY4dYX0da3cVcF0gemE1hXREjmw3nWxSwoJT0JVC745Q9rNK+8BghjejhkuOg0+Sk2aAmFl1hFh9eVlklVVgiF9hjGtohGJMc4IzZ3w2W4EtZW4yU34tYXIcZJEXU4wMQYEQS34bY2MadmIaf1kgem47nHMkoo1LwI1Dv5Zb7ZBS1ZlX7cJSdk+aekeJckOLgFmLcF1weV5ob1NzfUNmal5Xd3FWZHFJa3JFZmsvaHkeYnowYF4mYXkiVIsdWoYjSIcNTnEXZWwoXl81a3AmcXcjkIYypH4woIhOvIdC05FWy65c2MVRcTiWaEaagkmpfjiOfEp/Z15uYkBad01qZVFfeWc/f2c4b201ZHUgT3okWm4jX2MoVFsVT30LU3gVUXkfTncgVmUobm4qZ38+a309gowvkotHlIFEvYU+v4o6w6ZF4q1ccCi6aDO5dDyudDehbEmVY0xybTVlYT1edUFLeltIflFMbWg+WWIqVmwQTWIAWFQNYE4FW1kWV2snT34dVHwdVWcqUWQnXXg6U3pBZpM4eIVBl5hNpaA4xJc80JU5161MajukVj2wbTSzbESxck2BbEmHZi9kaytxZEdNc1tKZU04T2o4WWQ1YFsmW0sLQ1MNUFAeWloSTGoiSYEmSHQoVnIaVHwpVIkzYZstfqRBi6ZHnKQ9o6I+zJc64qRP6KRKXja9YUe6Ulm7X02lXDmKZjKCZjJ/ZTp3X0lcWEpTTklIR1E6RD4nX0goW1seTVkSWE4TSlkdOG0vN4osVXwlXowYTH8MS4kYb5EcjK89jJQsppYyrItIzZtE56BM6rFWZ127alnDcmO4YUOWakClWziRVR50YzJuSzt0PTVpNjxaQV1SQVM7TlElTUkXVlQYPVQgOFYtLX05LXgsNYQpRIkhUqsmVrESWr4ljb8Si7Qdq7IXoaojtK5M0LQ+3LVCfXDDeGW3XlWjWVeiSjCbWSqZVCKIYiB/VSpsPSlhMS5KNFFRMU9DN0w7R14kRlckLko3KV48LX87MYU2Q5s1RKchWa4PV8QObroAdMQEd8wHlbsXqLoprq85z8RI5sE6hlDHjU+8ZGK+WFijTkuzUDOgWSqfUS99UTN+WDhqTDVoOkRVPVFFP0M6RkQfTlwbMl82JWw0KXQ4QoM0O6MjUp4UWbsvVLoaXs8Ubckuhb0hoL8dpLgqwrdQu7A03sA5fEfcik7Oe1i1ZFe1WkapYkG4YzydUiKGVTx5YD+KSU9xP01KRTw7V0MuZEomYFseQWsvPWclM4oySpwoTJ4dSaUoUKc3ZbkpacMng8k+g7MqlrcxprA6xbFVyrBC0K5Ih1PoiUvVfj7Df1a7bEjEajuwYSycPxaeXhycWh+IXziCSkRbVVxMZ2JKcF8yZl8WU2YYXW0aTYUvRJwhSaoxR6QeWrg3c7A+hbZCic9Ajr9TpK1At7VR0q5Nzq9W45VMmjbxkDjqhkTWiELZdi7YbBm7TxSgRhalVCSqUB6aXDtxcT5obl1NdWxNcmM2dHgqYIEeZIkcXocsWpYgUagZY7Ysb8JLfbBOi71KqsJdt8BJr7RVv65r0bZm4Zxh2pllhDzomE/WdEXTZ0TVYEPMWyq4TBenLym5OSeSUjCMbjR+YERgdEtijGdGdmgyeIImcH00bIcgZJclY5gdcpkue6EnZ5JBcptdjKVamLVSrrBipaBcwZZNzJxJzKBNxYthilnFg1bOe1vZYkLhRDXNQzW6MymqMy22RC6rU0aUaDaGaD9ycTRnkElGiVw5eoo2cGwvhm46d5Mtg501gKk1hZlAhIU4eYdRm4pVpo9WkpRmm59cp35WuXpNvIFQuIZXc1fdcUfXYjvvUTrjRDbiSi7PPibOLyjCP0etWU6MaU57XT1uilRLgFpChHgolocjg2wnj2sul4w7jZpAfIxEjoVagJRYlXxLh4tiqHdasndRpYhSvXhWx3lEtHVEwXJXY1PjVUP0QDjrSz/mTz/ZNijjMj3aPjnEOUWrQz1+ZDVrcT1WjFU8kVkyq3YeqXwkl3Ayj3MqnHBLjIFOkHpLloFYlYNqmYZjqoRKnWVGnGpJsmNUxWtJvW9Ps2RTsHpXZ1rVVk7rUELtPFzjTEbPMUK3SUHGVkLAWk6hRTmOaTpaW1Bcg0U9j1dDs2wssW4vnGktl1xKkFlPintTjGVilG5Npndqm4ZzqGNtmVRGsVtfolJZvWBitm5SxXRkwVpURmDCRGHNP1jaR2LdS1jGNEOqUj2nVUS6XjulXUWDVFdwXWFOhFlXnERHvGA+v3pApltbkFNamk9TmVlem21nmnlVl2RhlGiCk294r2JcpWRnsGFvv1V5vWNuyVtr0FhpTGPPOm/MPXHHLF7FOGDIMESmOU6bW0GqSVmHQ16AVU16Z2dif1xdlUBAqVxUsGxHoV1NnEpZiFBrmkpbp2tlqHBxqmhklGeFnGaDtHRcuGp5t2JztFGJ0Et+x11szUFiSHXXNmXOJFXIH2a6JFKvM1SzS1esUlGZPV+ERl59Rl5rXV1oXVVWeFNHm2BSrVJIpE5XjVRil2B1lU9vllxpr15vrlZtrGaExHByw2x6ylt5y16Mw12GykqOzDp72Ep4L1K+N1fLIlrHLFDBNlumPUGhOkqBTk6HXV14U2ZzZml5ZV5fa1xSe0lQmFdVvUk7sVRgqlddhlV0kESQlkCLt0aQqVmXqF6Pqkp9ukKPv1WS10+Yyk2kvTmUy0+V0UF7KVW5Lli4J1mzHFSuOT6UOUJ6RFN7TFBxWFF6YVpwbmZyaVVpg0pqhkBYkjhCsFFBsVFdqVR5l0OOjzybjUOrpzWksDWduEmlwTukujKM1T+Z3zqnzzeezTqY2zSi0zmRGWy6GU+tFmGvGkGbIkOQPlVtSVlnTUFcVD1ZV0xoY0pyekZXdz9QkDtLokBWslJPqkNUl0SFnjeCqSelsx+wtSGjuTu7szG6xiKesgmgyyaz5Bew1h6q3S2i4Tet7BixD2HBF1y+BlGbEUmSIk+ON1lyKENeN0NbVzhxXERrdE1pi0JXeU5JhFRGoF1PpVFYmDtolzJ8pSSgrByovB+tuSqquhetxR2+xha6xAC03wC/5AKx4wCl5Bq49xnR8hXT" + } + Texture: 1459988304, "Texture::Diffuse Texture", "" { + Type: "TextureVideoClip" + Version: 202 + TextureName: "Texture::Diffuse Texture" + Properties70: { + P: "UseMaterial", "bool", "", "",1 + } + Media: "Video::Diffuse Texture" + FileName: "D:\Dev\clean\ufbx\data\PolyMesh3D1_TXTR.tga" + RelativeFilename: "PolyMesh3D1_TXTR.tga" + ModelUVTranslation: 0,0 + ModelUVScaling: 1,1 + Texture_Alpha_Source: "None" + Cropping: 0,0,0,0 + } + SelectionNode: 1465201408, "SelectionNode::20 Sided_10_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 0 + } + SelectionNode: 1465201056, "SelectionNode::20 Sided_15_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 1 + } + SelectionNode: 1465202640, "SelectionNode::20 Sided_20_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 2 + } + SelectionNode: 1465201760, "SelectionNode::20 Sided_25_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 3 + } + SelectionNode: 1465201232, "SelectionNode::20 Sided_30_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 4 + } + SelectionNode: 1465202992, "SelectionNode::20 Sided_35_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 5 + } + SelectionNode: 1465203168, "SelectionNode::20 Sided_40_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 6 + } + SelectionNode: 1465201936, "SelectionNode::20 Sided_45_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 7 + } + SelectionNode: 1465202288, "SelectionNode::20 Sided_50_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 8 + } + SelectionNode: 1465202112, "SelectionNode::20 Sided_55_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 9 + } + SelectionNode: 1465202464, "SelectionNode::20 Sided_60_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 10 + } + SelectionNode: 1465200704, "SelectionNode::20 Sided_65_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 11 + } + SelectionNode: 1465202816, "SelectionNode::20 Sided_70_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 12 + } + SelectionNode: 1465203344, "SelectionNode::20 Sided_75_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 13 + } + SelectionNode: 1465203520, "SelectionNode::20 Sided_80_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 14 + } + SelectionNode: 1465200000, "SelectionNode::20 Sided_85_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 15 + } + SelectionNode: 1465200176, "SelectionNode::20 Sided_90_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 16 + } + SelectionNode: 1465200880, "SelectionNode::20 Sided_95_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 17 + } + SelectionNode: 1465200352, "SelectionNode::20 Sided_100_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 18 + } + SelectionNode: 1465200528, "SelectionNode::20 Sided_105_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::20 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 19 + } + SelectionNode: 1870868592, "SelectionNode::PolyMesh3D1_9598_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::PolyMesh3D1" + IsTheNodeInSet: 0 + PolygonIndexArray: 12,13,14,15,16,17,18,19,20,21,22,23 + } + SelectionNode: 1870868416, "SelectionNode::PolyMesh3D1_15349_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::PolyMesh3D1" + IsTheNodeInSet: 0 + PolygonIndexArray: 0,1,2,3,4,5,6,7,8,9,10,11 + } + Collection: 1464877888, "SelectionSet::20 Sided_10", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_10_SelectionNode" + } + Collection: 1464872704, "SelectionSet::20 Sided_15", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_15_SelectionNode" + } + Collection: 1464878896, "SelectionSet::20 Sided_20", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_20_SelectionNode" + } + Collection: 1464874864, "SelectionSet::20 Sided_25", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_25_SelectionNode" + } + Collection: 1464877312, "SelectionSet::20 Sided_30", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_30_SelectionNode" + } + Collection: 1464880624, "SelectionSet::20 Sided_35", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_35_SelectionNode" + } + Collection: 1464877600, "SelectionSet::20 Sided_40", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_40_SelectionNode" + } + Collection: 1464878608, "SelectionSet::20 Sided_45", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_45_SelectionNode" + } + Collection: 1464876016, "SelectionSet::20 Sided_50", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_50_SelectionNode" + } + Collection: 1464872416, "SelectionSet::20 Sided_55", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_55_SelectionNode" + } + Collection: 1464876592, "SelectionSet::20 Sided_60", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_60_SelectionNode" + } + Collection: 1464877456, "SelectionSet::20 Sided_65", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_65_SelectionNode" + } + Collection: 1464872992, "SelectionSet::20 Sided_70", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_70_SelectionNode" + } + Collection: 1464879040, "SelectionSet::20 Sided_75", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_75_SelectionNode" + } + Collection: 1464880912, "SelectionSet::20 Sided_80", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_80_SelectionNode" + } + Collection: 1464881200, "SelectionSet::20 Sided_85", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_85_SelectionNode" + } + Collection: 1464878752, "SelectionSet::20 Sided_90", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_90_SelectionNode" + } + Collection: 1464872560, "SelectionSet::20 Sided_95", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_95_SelectionNode" + } + Collection: 1464873136, "SelectionSet::20 Sided_100", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_100_SelectionNode" + } + Collection: 1464874576, "SelectionSet::20 Sided_105", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::20 Sided_105_SelectionNode" + } + Collection: 1459449088, "SelectionSet::PolyMesh3D1_9598", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::PolyMesh3D1_9598_SelectionNode" + } + Collection: 1459449376, "SelectionSet::PolyMesh3D1_15349", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::PolyMesh3D1_15349_SelectionNode" + } + AnimationStack: 1870274240, "AnimStack::Default animation", "" { + } + AnimationLayer: 1877540080, "AnimLayer::Base Layer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::20 Sided, Model::RootNode + C: "OO",1875276032,0 + + ;Model::PolyMesh3D1, Model::RootNode + C: "OO",1875284032,0 + + ;AnimLayer::Base Layer, AnimStack::Default animation + C: "OO",1877540080,1870274240 + + ;Geometry::20 Sided, Model::20 Sided + C: "OO",1464386752,1875276032 + + ;Material::20 Sided, Model::20 Sided + C: "OO",1459984944,1875276032 + + ;SelectionNode::20 Sided_10_SelectionNode, SelectionSet::20 Sided_10 + C: "OO",1465201408,1464877888 + + ;Model::20 Sided, SelectionNode::20 Sided_10_SelectionNode + C: "OO",1875276032,1465201408 + + ;SelectionNode::20 Sided_15_SelectionNode, SelectionSet::20 Sided_15 + C: "OO",1465201056,1464872704 + + ;Model::20 Sided, SelectionNode::20 Sided_15_SelectionNode + C: "OO",1875276032,1465201056 + + ;SelectionNode::20 Sided_20_SelectionNode, SelectionSet::20 Sided_20 + C: "OO",1465202640,1464878896 + + ;Model::20 Sided, SelectionNode::20 Sided_20_SelectionNode + C: "OO",1875276032,1465202640 + + ;SelectionNode::20 Sided_25_SelectionNode, SelectionSet::20 Sided_25 + C: "OO",1465201760,1464874864 + + ;Model::20 Sided, SelectionNode::20 Sided_25_SelectionNode + C: "OO",1875276032,1465201760 + + ;SelectionNode::20 Sided_30_SelectionNode, SelectionSet::20 Sided_30 + C: "OO",1465201232,1464877312 + + ;Model::20 Sided, SelectionNode::20 Sided_30_SelectionNode + C: "OO",1875276032,1465201232 + + ;SelectionNode::20 Sided_35_SelectionNode, SelectionSet::20 Sided_35 + C: "OO",1465202992,1464880624 + + ;Model::20 Sided, SelectionNode::20 Sided_35_SelectionNode + C: "OO",1875276032,1465202992 + + ;SelectionNode::20 Sided_40_SelectionNode, SelectionSet::20 Sided_40 + C: "OO",1465203168,1464877600 + + ;Model::20 Sided, SelectionNode::20 Sided_40_SelectionNode + C: "OO",1875276032,1465203168 + + ;SelectionNode::20 Sided_45_SelectionNode, SelectionSet::20 Sided_45 + C: "OO",1465201936,1464878608 + + ;Model::20 Sided, SelectionNode::20 Sided_45_SelectionNode + C: "OO",1875276032,1465201936 + + ;SelectionNode::20 Sided_50_SelectionNode, SelectionSet::20 Sided_50 + C: "OO",1465202288,1464876016 + + ;Model::20 Sided, SelectionNode::20 Sided_50_SelectionNode + C: "OO",1875276032,1465202288 + + ;SelectionNode::20 Sided_55_SelectionNode, SelectionSet::20 Sided_55 + C: "OO",1465202112,1464872416 + + ;Model::20 Sided, SelectionNode::20 Sided_55_SelectionNode + C: "OO",1875276032,1465202112 + + ;SelectionNode::20 Sided_60_SelectionNode, SelectionSet::20 Sided_60 + C: "OO",1465202464,1464876592 + + ;Model::20 Sided, SelectionNode::20 Sided_60_SelectionNode + C: "OO",1875276032,1465202464 + + ;SelectionNode::20 Sided_65_SelectionNode, SelectionSet::20 Sided_65 + C: "OO",1465200704,1464877456 + + ;Model::20 Sided, SelectionNode::20 Sided_65_SelectionNode + C: "OO",1875276032,1465200704 + + ;SelectionNode::20 Sided_70_SelectionNode, SelectionSet::20 Sided_70 + C: "OO",1465202816,1464872992 + + ;Model::20 Sided, SelectionNode::20 Sided_70_SelectionNode + C: "OO",1875276032,1465202816 + + ;SelectionNode::20 Sided_75_SelectionNode, SelectionSet::20 Sided_75 + C: "OO",1465203344,1464879040 + + ;Model::20 Sided, SelectionNode::20 Sided_75_SelectionNode + C: "OO",1875276032,1465203344 + + ;SelectionNode::20 Sided_80_SelectionNode, SelectionSet::20 Sided_80 + C: "OO",1465203520,1464880912 + + ;Model::20 Sided, SelectionNode::20 Sided_80_SelectionNode + C: "OO",1875276032,1465203520 + + ;SelectionNode::20 Sided_85_SelectionNode, SelectionSet::20 Sided_85 + C: "OO",1465200000,1464881200 + + ;Model::20 Sided, SelectionNode::20 Sided_85_SelectionNode + C: "OO",1875276032,1465200000 + + ;SelectionNode::20 Sided_90_SelectionNode, SelectionSet::20 Sided_90 + C: "OO",1465200176,1464878752 + + ;Model::20 Sided, SelectionNode::20 Sided_90_SelectionNode + C: "OO",1875276032,1465200176 + + ;SelectionNode::20 Sided_95_SelectionNode, SelectionSet::20 Sided_95 + C: "OO",1465200880,1464872560 + + ;Model::20 Sided, SelectionNode::20 Sided_95_SelectionNode + C: "OO",1875276032,1465200880 + + ;SelectionNode::20 Sided_100_SelectionNode, SelectionSet::20 Sided_100 + C: "OO",1465200352,1464873136 + + ;Model::20 Sided, SelectionNode::20 Sided_100_SelectionNode + C: "OO",1875276032,1465200352 + + ;SelectionNode::20 Sided_105_SelectionNode, SelectionSet::20 Sided_105 + C: "OO",1465200528,1464874576 + + ;Model::20 Sided, SelectionNode::20 Sided_105_SelectionNode + C: "OO",1875276032,1465200528 + + ;Deformer::PolyMesh3D1_Blendshape, Geometry::PolyMesh3D1 + C: "OO",1459449664,1464385088 + + ;Deformer::PolyMesh3D1_Blendshape, Geometry::PolyMesh3D1 + C: "OO",1459449664,1464385088 + + ;Geometry::PolyMesh3D1, Model::PolyMesh3D1 + C: "OO",1464385088,1875284032 + + ;Material::PolyMesh3D1, Model::PolyMesh3D1 + C: "OO",1459989744,1875284032 + + ;Texture::Diffuse Texture, Model::PolyMesh3D1 + C: "OO",1459988304,1875284032 + + ;SelectionNode::PolyMesh3D1_9598_SelectionNode, SelectionSet::PolyMesh3D1_9598 + C: "OO",1870868592,1459449088 + + ;Model::PolyMesh3D1, SelectionNode::PolyMesh3D1_9598_SelectionNode + C: "OO",1875284032,1870868592 + + ;SelectionNode::PolyMesh3D1_15349_SelectionNode, SelectionSet::PolyMesh3D1_15349 + C: "OO",1870868416,1459449376 + + ;Model::PolyMesh3D1, SelectionNode::PolyMesh3D1_15349_SelectionNode + C: "OO",1875284032,1870868416 + + ;Texture::Diffuse Texture, Material::PolyMesh3D1 + C: "OP",1459988304,1459989744, "DiffuseColor" + + ;Video::Diffuse Texture, Texture::Diffuse Texture + C: "OO",1459988784,1459988304 + + ;SubDeformer::, Deformer::PolyMesh3D1_Blendshape + C: "OO",1873869888,1459449664 + + ;SubDeformer::, Deformer::PolyMesh3D1_Blendshape + C: "OO",1875088672,1459449664 + + ;Geometry::Morph, SubDeformer:: + C: "OO",1870507424,1873869888 + + ;Geometry::Back, SubDeformer:: + C: "OO",1870505984,1875088672 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Default animation" { + FileName: "Default_animation.tak" + LocalTime: 0,46186158000 + ReferenceTime: 0,46186158000 + } +} diff --git a/modules/ufbx/data/zbrush_d20_selection_set_7500_binary.fbx b/modules/ufbx/data/zbrush_d20_selection_set_7500_binary.fbx new file mode 100644 index 0000000..8ac4418 Binary files /dev/null and b/modules/ufbx/data/zbrush_d20_selection_set_7500_binary.fbx differ diff --git a/modules/ufbx/data/zbrush_polygroup_mess_0_obj.obj b/modules/ufbx/data/zbrush_polygroup_mess_0_obj.obj new file mode 100644 index 0000000..5f4a33f --- /dev/null +++ b/modules/ufbx/data/zbrush_polygroup_mess_0_obj.obj @@ -0,0 +1,24326 @@ +# File exported by ZBrush version 2022 +# www.zbrush.com +#Vertex Count 8130 +#Face Count 8683 +#Auto scale x=1.000000 y=1.000000 z=1.000000 +#Auto offset x=0.000000 y=0.000000 z=0.000000 +v -0.91665756 1.91665744 0.91665744 +v 0.91665744 1.91665744 0.91665744 +v -0.91665744 1.91665744 -0.91665744 +v 0.91665744 1.91665744 -0.91665744 +v -0.91665744 0.08334251 0.91665744 +v 0.91665744 0.08334251 0.91665744 +v -0.91665744 0.08334251 -0.91665756 +v 0.91665744 0.08334251 -0.91665744 +v 0 1.9374907 0.93749058 +v 0.93749064 1.9374907 -0 +v 0 1.9374907 -0.93749064 +v -0.93749064 1.9374907 -0 +v 0 1.99999022 -0 +v 0 0.06250938 0.93749058 +v 0.93749058 1 0.93749064 +v -0.93749064 1 0.93749058 +v 0 1 0.99998998 +v 0.93749058 0.06250938 -0 +v 0.93749064 1 -0.93749058 +v 0.99998998 1 -0 +v 0 0.06250938 -0.93749058 +v -0.93749058 1 -0.93749064 +v 0 1 -0.99998998 +v -0.93749058 0.06250938 -0 +v -0.99998998 1 -0 +v 0 0.00001001 -0 +v -0.49999499 1.9374907 0.93749058 +v 0 1.99999022 0.49999499 +v -0.49999499 1.99999022 -0 +v -0.93749064 1.9374907 0.49999499 +v -0.49999502 1.99999022 0.49999499 +v -0.49999499 0.06250938 0.93749058 +v 0 0.500005 0.99998998 +v -0.49999499 1 0.99998998 +v -0.93749064 0.500005 0.93749058 +v -0.49999502 0.500005 0.99998998 +v 0.93749058 0.06250938 0.49999499 +v 0.99998998 0.500005 -0 +v 0.99998998 1 0.49999499 +v 0.93749058 0.500005 0.93749064 +v 0.99998998 0.500005 0.49999502 +v 0.49999496 0.06250938 -0.93749058 +v 0 0.500005 -0.99998998 +v 0.49999499 1 -0.99998998 +v 0.93749064 0.500005 -0.93749058 +v 0.49999502 0.500005 -0.99998998 +v -0.93749058 0.06250938 -0.49999499 +v -0.99998998 0.500005 -0 +v -0.99998998 1 -0.49999499 +v -0.93749058 0.500005 -0.93749064 +v -0.99998998 0.500005 -0.49999502 +v -0.49999496 0.06250938 -0.93749058 +v 0 0.00001001 -0.49999499 +v -0.49999499 0.00001001 -0 +v -0.49999502 0.00001001 -0.49999499 +v 0.49999499 1.9374907 0.93749058 +v 0.93749064 1.9374907 0.49999499 +v 0.49999499 1.99999022 -0 +v 0.49999496 1.99999022 0.49999499 +v 0.93749064 1.9374907 -0.49999499 +v 0.49999499 1.9374907 -0.93749064 +v 0 1.99999022 -0.49999499 +v 0.49999496 1.99999022 -0.49999499 +v -0.49999499 1.9374907 -0.93749064 +v -0.93749064 1.9374907 -0.49999499 +v -0.49999502 1.99999022 -0.49999499 +v 0.49999499 0.06250938 0.93749058 +v 0.49999499 1 0.99998998 +v 0.49999496 0.500005 0.99998998 +v 0.93749058 1.49999511 0.93749064 +v 0 1.49999511 0.99998998 +v 0.49999496 1.49999499 0.99998998 +v -0.93749064 1.49999511 0.93749058 +v -0.49999502 1.49999499 0.99998998 +v 0.93749058 0.06250938 -0.49999499 +v 0.99998998 1 -0.49999499 +v 0.99998998 0.500005 -0.49999496 +v 0.93749064 1.49999511 -0.93749058 +v 0.99998998 1.49999511 -0 +v 0.99998998 1.49999499 -0.49999496 +v 0.99998998 1.49999499 0.49999502 +v -0.49999499 1 -0.99998998 +v -0.49999496 0.500005 -0.99998998 +v -0.93749058 1.49999511 -0.93749064 +v 0 1.49999511 -0.99998998 +v -0.49999496 1.49999499 -0.99998998 +v 0.49999502 1.49999499 -0.99998998 +v -0.93749058 0.06250938 0.49999499 +v -0.99998998 1 0.49999499 +v -0.99998998 0.500005 0.49999496 +v -0.99998998 1.49999511 -0 +v -0.99998998 1.49999499 0.49999496 +v -0.99998998 1.49999499 -0.49999502 +v 0.49999499 0.00001001 -0 +v 0.49999496 0.00001001 -0.49999499 +v 0 0.00001001 0.49999499 +v 0.49999496 0.00001001 0.49999499 +v -0.49999502 0.00001001 0.49999499 +v -0.74999249 1.9374907 0.93749064 +v -0.49999499 1.99999022 0.74999249 +v -0.74999249 1.99999022 0.49999496 +v -0.93749058 1.9374907 0.74999249 +v -0.74999243 1.99999022 0.74999249 +v -0.74999249 0.06250938 0.93749058 +v -0.49999499 0.25000751 0.99998998 +v -0.74999249 0.500005 0.99998998 +v -0.93749058 0.25000751 0.93749058 +v -0.74999243 0.25000751 0.99998998 +v 0.93749058 0.06250938 0.74999249 +v 0.99998998 0.25000751 0.49999499 +v 0.99998998 0.500005 0.74999249 +v 0.93749058 0.25000751 0.93749058 +v 0.99998998 0.25000751 0.74999243 +v 0.74999243 0.06250938 -0.93749058 +v 0.49999499 0.25000751 -0.99998998 +v 0.74999249 0.500005 -0.99998998 +v 0.93749058 0.25000751 -0.93749058 +v 0.74999243 0.25000751 -0.99998998 +v -0.93749058 0.06250938 -0.74999249 +v -0.99998998 0.25000751 -0.49999499 +v -0.99998998 0.500005 -0.74999249 +v -0.93749058 0.25000751 -0.93749058 +v -0.99998998 0.25000751 -0.74999243 +v -0.74999243 0.06250938 -0.93749058 +v -0.49999499 0.00001001 -0.74999249 +v -0.74999249 0.00001001 -0.49999496 +v -0.74999243 0.00001001 -0.74999249 +v 0.24999749 1.9374907 0.93749064 +v 0.49999499 1.99999022 0.74999249 +v 0.24999749 1.99999022 0.49999496 +v 0 1.99999022 0.74999249 +v 0.24999749 1.99999022 0.74999249 +v 0.24999749 1.99999022 -0 +v 0.49999499 1.99999022 -0.24999749 +v 0.24999749 1.99999022 -0.49999502 +v 0 1.99999022 -0.24999749 +v 0.24999749 1.99999022 -0.24999749 +v -0.74999249 1.99999022 -0 +v -0.49999499 1.99999022 -0.24999749 +v -0.74999249 1.99999022 -0.49999502 +v -0.93749058 1.9374907 -0.24999749 +v -0.74999243 1.99999022 -0.24999749 +v 0.24999749 0.06250938 0.93749058 +v 0.49999499 0.25000751 0.99998998 +v 0.24999749 0.500005 0.99998998 +v 0 0.25000751 0.99998998 +v 0.24999749 0.25000751 0.99998998 +v 0.24999749 1 0.99998998 +v 0.49999499 1.24999749 0.99998998 +v 0.24999749 1.49999511 0.99998998 +v 0 1.24999749 0.99998998 +v 0.24999749 1.24999761 0.99998998 +v -0.74999249 1 0.99998998 +v -0.49999499 1.24999749 0.99998998 +v -0.74999249 1.49999511 0.99998998 +v -0.93749058 1.24999749 0.93749058 +v -0.74999243 1.24999761 0.99998998 +v 0.93749058 0.06250938 -0.24999749 +v 0.99998998 0.25000751 -0.49999499 +v 0.99998998 0.500005 -0.24999749 +v 0.99998998 0.25000751 -0 +v 0.99998998 0.25000751 -0.24999749 +v 0.99998998 1 -0.24999749 +v 0.99998998 1.24999749 -0.49999499 +v 0.99998998 1.49999511 -0.24999749 +v 0.99998998 1.24999749 -0 +v 0.99998998 1.24999761 -0.24999749 +v 0.99998998 1 0.74999249 +v 0.99998998 1.24999749 0.49999499 +v 0.99998998 1.49999511 0.74999249 +v 0.93749058 1.24999749 0.93749058 +v 0.99998998 1.24999761 0.74999243 +v -0.24999749 0.06250938 -0.93749058 +v -0.49999499 0.25000751 -0.99998998 +v -0.24999749 0.500005 -0.99998998 +v 0 0.25000751 -0.99998998 +v -0.24999749 0.25000751 -0.99998998 +v -0.24999749 1 -0.99998998 +v -0.49999499 1.24999749 -0.99998998 +v -0.24999749 1.49999511 -0.99998998 +v 0 1.24999749 -0.99998998 +v -0.24999749 1.24999761 -0.99998998 +v 0.74999249 1 -0.99998998 +v 0.49999499 1.24999749 -0.99998998 +v 0.74999249 1.49999511 -0.99998998 +v 0.93749058 1.24999749 -0.93749058 +v 0.74999243 1.24999761 -0.99998998 +v -0.93749058 0.06250938 0.24999749 +v -0.99998998 0.25000751 0.49999499 +v -0.99998998 0.500005 0.24999749 +v -0.99998998 0.25000751 -0 +v -0.99998998 0.25000751 0.24999749 +v -0.99998998 1 0.24999749 +v -0.99998998 1.24999749 0.49999499 +v -0.99998998 1.49999511 0.24999749 +v -0.99998998 1.24999749 -0 +v -0.99998998 1.24999761 0.24999749 +v -0.99998998 1 -0.74999249 +v -0.99998998 1.24999749 -0.49999499 +v -0.99998998 1.49999511 -0.74999249 +v -0.93749058 1.24999749 -0.93749058 +v -0.99998998 1.24999761 -0.74999243 +v 0.24999749 0.06250938 -0.93749058 +v 0.49999499 0.00001001 -0.74999249 +v 0.24999749 0.00001001 -0.49999496 +v 0 0.00001001 -0.74999249 +v 0.24999749 0.00001001 -0.74999249 +v 0.24999749 0.00001001 -0 +v 0.49999499 0.00001001 0.24999749 +v 0.24999749 0.00001001 0.49999502 +v 0 0.00001001 0.24999749 +v 0.24999749 0.00001001 0.24999749 +v -0.74999249 0.00001001 -0 +v -0.49999499 0.00001001 0.24999749 +v -0.74999249 0.00001001 0.49999502 +v -0.74999243 0.00001001 0.24999749 +v -0.24999749 1.9374907 0.93749064 +v -0.24999749 1.99999022 0.49999496 +v -0.24999749 1.99999022 0.74999249 +v 0 1.99999022 0.24999749 +v -0.24999749 1.99999022 -0 +v -0.49999496 1.99999022 0.24999749 +v -0.24999749 1.99999022 0.24999749 +v -0.93749058 1.9374907 0.24999749 +v -0.74999243 1.99999022 0.24999749 +v -0.24999749 0.06250938 0.93749058 +v -0.24999749 0.500005 0.99998998 +v -0.24999749 0.25000751 0.99998998 +v 0 0.7500025 0.99998998 +v -0.24999749 1 0.99998998 +v -0.49999496 0.7500025 0.99998998 +v -0.24999749 0.7500025 0.99998998 +v -0.93749058 0.7500025 0.93749058 +v -0.74999243 0.7500025 0.99998998 +v 0.93749058 0.06250938 0.24999749 +v 0.99998998 0.500005 0.24999749 +v 0.99998998 0.25000751 0.24999749 +v 0.99998998 0.7500025 -0 +v 0.99998998 1 0.24999749 +v 0.99998998 0.7500025 0.49999496 +v 0.99998998 0.7500025 0.24999749 +v 0.93749058 0.7500025 0.93749058 +v 0.99998998 0.7500025 0.74999243 +v 0.24999749 0.500005 -0.99998998 +v 0.24999749 0.25000751 -0.99998998 +v 0 0.7500025 -0.99998998 +v 0.24999749 1 -0.99998998 +v 0.49999496 0.7500025 -0.99998998 +v 0.24999749 0.7500025 -0.99998998 +v 0.93749058 0.7500025 -0.93749058 +v 0.74999243 0.7500025 -0.99998998 +v -0.93749058 0.06250938 -0.24999749 +v -0.99998998 0.500005 -0.24999749 +v -0.99998998 0.25000751 -0.24999749 +v -0.99998998 0.7500025 -0 +v -0.99998998 1 -0.24999749 +v -0.99998998 0.7500025 -0.49999496 +v -0.99998998 0.7500025 -0.24999749 +v -0.93749058 0.7500025 -0.93749058 +v -0.99998998 0.7500025 -0.74999243 +v -0.24999749 0.00001001 -0.49999496 +v -0.24999749 0.00001001 -0.74999249 +v 0 0.00001001 -0.24999749 +v -0.24999749 0.00001001 -0 +v -0.49999496 0.00001001 -0.24999749 +v -0.24999749 0.00001001 -0.24999749 +v -0.74999243 0.00001001 -0.24999749 +v 0.74999249 1.9374907 0.93749064 +v 0.93749064 1.9374907 0.74999249 +v 0.74999243 1.99999022 0.49999496 +v 0.74999249 1.99999022 0.74999249 +v 0.93749064 1.9374907 0.24999749 +v 0.74999243 1.99999022 -0 +v 0.49999502 1.99999022 0.24999749 +v 0.74999249 1.99999022 0.24999749 +v 0.24999749 1.99999022 0.24999749 +v 0.93749064 1.9374907 -0.24999749 +v 0.74999243 1.99999022 -0.49999502 +v 0.74999249 1.99999022 -0.24999749 +v 0.93749064 1.9374907 -0.74999249 +v 0.74999249 1.9374907 -0.93749064 +v 0.49999502 1.99999022 -0.74999249 +v 0.74999249 1.99999022 -0.74999249 +v 0.24999749 1.9374907 -0.93749064 +v 0 1.99999022 -0.74999249 +v 0.24999749 1.99999022 -0.74999249 +v -0.24999749 1.99999022 -0.49999502 +v -0.24999749 1.99999022 -0.24999749 +v -0.24999749 1.9374907 -0.93749064 +v -0.49999496 1.99999022 -0.74999249 +v -0.24999749 1.99999022 -0.74999249 +v -0.74999249 1.9374907 -0.93749064 +v -0.93749058 1.9374907 -0.74999249 +v -0.74999243 1.99999022 -0.74999249 +v 0.74999249 0.06250938 0.93749058 +v 0.74999243 0.500005 0.99998998 +v 0.74999249 0.25000751 0.99998998 +v 0.74999243 1 0.99998998 +v 0.49999502 0.7500025 0.99998998 +v 0.74999249 0.7500025 0.99998998 +v 0.24999749 0.7500025 0.99998998 +v 0.74999243 1.49999511 0.99998998 +v 0.74999249 1.24999761 0.99998998 +v 0.93749058 1.7499926 0.93749058 +v 0.49999502 1.74999237 0.99998998 +v 0.74999249 1.7499926 0.99998998 +v 0 1.74999237 0.99998998 +v 0.24999749 1.7499926 0.99998998 +v -0.24999749 1.49999511 0.99998998 +v -0.24999749 1.24999761 0.99998998 +v -0.49999496 1.74999237 0.99998998 +v -0.24999749 1.7499926 0.99998998 +v -0.93749058 1.74999237 0.93749058 +v -0.74999243 1.7499926 0.99998998 +v 0.93749058 0.06250938 -0.74999249 +v 0.99998998 0.500005 -0.74999243 +v 0.99998998 0.25000751 -0.74999249 +v 0.99998998 1 -0.74999243 +v 0.99998998 0.7500025 -0.49999502 +v 0.99998998 0.7500025 -0.74999249 +v 0.99998998 0.7500025 -0.24999749 +v 0.99998998 1.49999511 -0.74999243 +v 0.99998998 1.24999761 -0.74999249 +v 0.93749058 1.7499926 -0.93749058 +v 0.99998998 1.74999237 -0.49999502 +v 0.99998998 1.7499926 -0.74999249 +v 0.99998998 1.74999237 -0 +v 0.99998998 1.7499926 -0.24999749 +v 0.99998998 1.49999511 0.24999749 +v 0.99998998 1.24999761 0.24999749 +v 0.99998998 1.74999237 0.49999496 +v 0.99998998 1.7499926 0.24999749 +v 0.99998998 1.7499926 0.74999243 +v -0.74999243 0.500005 -0.99998998 +v -0.74999249 0.25000751 -0.99998998 +v -0.74999243 1 -0.99998998 +v -0.49999502 0.7500025 -0.99998998 +v -0.74999249 0.7500025 -0.99998998 +v -0.24999749 0.7500025 -0.99998998 +v -0.74999243 1.49999511 -0.99998998 +v -0.74999249 1.24999761 -0.99998998 +v -0.93749058 1.7499926 -0.93749058 +v -0.49999502 1.74999237 -0.99998998 +v -0.74999249 1.7499926 -0.99998998 +v 0 1.74999237 -0.99998998 +v -0.24999749 1.7499926 -0.99998998 +v 0.24999749 1.49999511 -0.99998998 +v 0.24999749 1.24999761 -0.99998998 +v 0.49999496 1.74999237 -0.99998998 +v 0.24999749 1.7499926 -0.99998998 +v 0.74999243 1.7499926 -0.99998998 +v -0.93749058 0.06250938 0.74999249 +v -0.99998998 0.500005 0.74999243 +v -0.99998998 0.25000751 0.74999249 +v -0.99998998 1 0.74999243 +v -0.99998998 0.7500025 0.49999502 +v -0.99998998 0.7500025 0.74999249 +v -0.99998998 0.7500025 0.24999749 +v -0.99998998 1.49999511 0.74999243 +v -0.99998998 1.24999761 0.74999249 +v -0.99998998 1.74999237 0.49999502 +v -0.99998998 1.7499926 0.74999249 +v -0.99998998 1.74999237 -0 +v -0.99998998 1.7499926 0.24999749 +v -0.99998998 1.49999511 -0.24999749 +v -0.99998998 1.24999761 -0.24999749 +v -0.99998998 1.74999237 -0.49999496 +v -0.99998998 1.7499926 -0.24999749 +v -0.99998998 1.7499926 -0.74999243 +v 0.74999243 0.00001001 -0.49999496 +v 0.74999249 0.00001001 -0.74999249 +v 0.74999243 0.00001001 -0 +v 0.49999502 0.00001001 -0.24999749 +v 0.74999249 0.00001001 -0.24999749 +v 0.24999749 0.00001001 -0.24999749 +v 0.74999243 0.00001001 0.49999502 +v 0.74999249 0.00001001 0.24999749 +v 0.49999502 0.00001001 0.74999249 +v 0.74999249 0.00001001 0.74999249 +v 0 0.00001001 0.74999249 +v 0.24999749 0.00001001 0.74999249 +v -0.24999749 0.00001001 0.49999502 +v -0.24999749 0.00001001 0.24999749 +v -0.49999496 0.00001001 0.74999249 +v -0.24999749 0.00001001 0.74999249 +v -0.74999243 0.00001001 0.74999249 +v -0.85022378 1.96657967 0.7499926 +v -0.8502146 1.95074379 0.84502613 +v -0.74999272 1.96831226 0.84502613 +v -0.84910643 0.03304785 -0.74999237 +v -0.84912538 0.06587419 -0.86191177 +v -0.74999272 0.03731618 -0.86191177 +v -0.00000047 1.96831214 0.84502613 +v 0.24999737 1.96831226 0.84502613 +v -0.85022378 1.96657967 -0.24999761 +v -0.85022378 1.96657967 -0.00000011 +v -0.00000023 0.03731617 -0.86191177 +v 0.2499969 0.03731616 -0.86191177 +v -0.84910643 0.03304781 0.24999761 +v -0.84910643 0.03304782 0.00000011 +v -0.49999523 1.96831226 0.84502613 +v -0.24999761 1.96831214 0.84502613 +v -0.85022378 1.96657967 0.24999737 +v -0.85022378 1.96657967 0.49999523 +v -0.49999523 0.03731617 -0.86191177 +v -0.24999761 0.03731617 -0.86191177 +v -0.84910643 0.03304783 -0.24999737 +v -0.84910643 0.03304784 -0.49999499 +v 0.49999475 1.96831214 0.84502613 +v 0.74999189 1.96831214 0.84502613 +v -0.85022378 1.96657979 -0.7499926 +v -0.85022378 1.96657979 -0.49999499 +v 0.49999499 0.03731616 -0.86191177 +v 0.74999213 0.03731615 -0.86191177 +v -0.84910643 0.03304778 0.74999254 +v -0.84910643 0.03304779 0.49999511 +v 0.85671567 1.96441555 0.7499926 +v 0.85673236 1.93545138 0.84502613 +v 0.85671567 1.96441555 0.49999523 +v 0.85671567 1.96441555 0.24999737 +v 0.85671567 1.96441555 -0.00000011 +v 0.85671567 1.96441555 -0.24999761 +v 0.85671567 1.96441555 -0.49999499 +v 0.85671567 1.96441555 -0.7499926 +v 0.74999213 1.96268367 -0.86191177 +v 0.85673379 1.93303895 -0.86191177 +v 0.49999499 1.96268367 -0.86191177 +v 0.24999713 1.96268379 -0.86191177 +v -0.00000023 1.96268379 -0.86191177 +v -0.24999785 1.96268367 -0.86191177 +v -0.49999523 1.96268367 -0.86191177 +v -0.74999272 1.96268379 -0.86191177 +v -0.85021185 1.94598043 -0.86191177 +v 0.85781884 0.0552875 -0.86191177 +v 0.85783004 0.03595585 -0.74999237 +v 0.85783004 0.03595583 -0.49999499 +v 0.85783004 0.03595582 -0.24999737 +v 0.85783004 0.03595581 0.00000011 +v 0.85783004 0.0359558 0.24999761 +v 0.85783004 0.03595579 0.49999511 +v 0.85783004 0.03595578 0.74999254 +v 0.85782098 0.0517918 0.84502607 +v 0.74999213 0.03168781 0.84502607 +v 0.49999475 0.03168781 0.84502607 +v 0.24999713 0.03168782 0.84502607 +v -0.00000047 0.03168783 0.84502607 +v -0.24999785 0.03168783 0.84502607 +v -0.49999535 0.03168783 0.84502607 +v -0.74999296 0.03168784 0.84502607 +v -0.84912395 0.06346178 0.84502607 +v 0.24999737 1.9820224 0.80389511 +v -0.00000023 1.98202228 0.80389511 +v 0.24999713 0.02274883 -0.81820988 +v -0.00000023 0.02274883 -0.81820988 +v -0.24999785 1.98202228 0.80389511 +v -0.49999535 1.9820224 0.80389511 +v -0.24999785 0.02274883 -0.81820988 +v -0.49999535 0.02274883 -0.81820988 +v 0.74999213 1.98202228 0.80389511 +v 0.49999475 1.98202228 0.80389511 +v 0.74999213 0.02274883 -0.81820988 +v 0.49999499 0.02274883 -0.81820988 +v -0.74999272 1.9820224 0.80389511 +v -0.74999272 0.02274883 -0.81820988 +v 0.81414914 1.97860431 0.49999523 +v 0.81414914 1.97860431 0.7499926 +v 0.81414914 1.97860443 0.24999737 +v 0.81414914 1.97860443 -0.00000011 +v 0.81414914 1.97860443 -0.24999761 +v 0.81414914 1.97860443 -0.49999499 +v 0.81414914 1.97860443 -0.7499926 +v 0.81414914 0.02139535 -0.49999499 +v 0.81414914 0.02139536 -0.74999237 +v 0.81414914 0.02139534 -0.24999737 +v 0.81414914 0.02139533 0.00000011 +v 0.81414914 0.02139532 0.24999761 +v 0.81414914 0.02139531 0.49999511 +v 0.81414914 0.0213953 0.74999254 +v -0.8105266 1.97981166 0.7499926 +v -0.8105266 1.97082805 0.80389511 +v -0.8105266 0.02018791 -0.74999237 +v -0.8105266 0.04019257 -0.81820988 +v -0.8105266 1.97981178 -0.24999761 +v -0.8105266 1.97981214 -0.00000011 +v -0.8105266 0.02018787 0.24999761 +v -0.8105266 0.02018788 0.00000011 +v -0.8105266 1.97981178 0.24999737 +v -0.8105266 1.97981202 0.49999523 +v -0.8105266 0.02018789 -0.24999737 +v -0.8105266 0.0201879 -0.49999499 +v -0.8105266 1.97981214 -0.7499926 +v -0.8105266 1.97981214 -0.49999499 +v -0.8105266 0.02018784 0.74999254 +v -0.8105266 0.02018785 0.49999511 +v 0.81414914 1.96109449 0.80389511 +v 0.74999213 1.97725081 -0.81820988 +v 0.81414914 1.95711576 -0.81820988 +v 0.49999499 1.97725081 -0.81820988 +v 0.24999713 1.97725081 -0.81820988 +v -0.00000023 1.97725081 -0.81820988 +v -0.24999785 1.97725081 -0.81820988 +v -0.49999535 1.97725081 -0.81820988 +v -0.74999272 1.97725081 -0.81820988 +v -0.8105266 1.96716201 -0.81820988 +v 0.81414914 0.03344196 -0.81820988 +v 0.81414914 0.03037934 0.80389505 +v 0.74999213 0.01797731 0.80389505 +v 0.49999475 0.01797731 0.80389505 +v 0.24999713 0.01797731 0.80389505 +v -0.00000023 0.01797731 0.80389505 +v -0.24999785 0.01797731 0.80389505 +v -0.49999535 0.01797731 0.80389505 +v -0.74999272 0.01797731 0.80389505 +v -0.8105266 0.03792948 0.80389505 +v 0.70103883 1.99999022 0.24999737 +v 0.70103883 1.9999901 0.49999523 +v 0.70103883 1.99999022 -0.24999761 +v 0.70103883 1.99999022 -0.00000011 +v 0.49999499 1.99999022 -0.70509958 +v 0.70103883 1.9999901 -0.70509958 +v 0.70103883 1.99999022 -0.49999499 +v 0 1.99999022 -0.70509958 +v 0.24999737 1.99999022 -0.70509958 +v -0.49999535 1.99999022 -0.70509958 +v -0.24999761 1.99999022 -0.70509958 +v 0.70103883 0.00000978 -0.24999737 +v 0.70103883 0.00000979 -0.49999499 +v 0.70103883 0.00000975 0.24999761 +v 0.70103883 0.00000976 0.00000011 +v 0.70103883 0.00001 0.49999511 +v 0.70103883 0.00001001 0.70363819 +v 0.49999499 0.00000999 0.70363819 +v 0 0.00000999 0.70363819 +v 0.24999737 0.00000999 0.70363819 +v -0.49999535 0.00000999 0.70363819 +v -0.24999761 0.00000999 0.70363819 +v -0.70255756 1.9999901 0.49999523 +v -0.70255756 2.01727891 0.70363831 +v -0.49999535 1.9999901 0.70363831 +v -0.70255756 0.00000979 -0.49999499 +v -0.70255756 0.00001001 -0.70509958 +v -0.49999535 0.00000979 -0.70509958 +v 0.24999737 1.9999901 0.70363831 +v 0.49999499 1.9999901 0.70363831 +v 0 1.9999901 0.70363831 +v -0.70255756 1.99999022 -0.24999761 +v -0.70255756 1.99999022 -0.00000011 +v -0.70255756 1.99999022 -0.49999499 +v 0.24999737 0.00000979 -0.70509958 +v 0.49999499 0.00000979 -0.70509958 +v 0 0.00000979 -0.70509958 +v -0.70255756 0.00000975 0.24999761 +v -0.70255756 0.00000976 0.00000011 +v -0.70255756 0.00001 0.49999511 +v -0.24999761 1.9999901 0.70363831 +v -0.70255756 1.99999022 0.24999737 +v -0.24999761 0.00000979 -0.70509958 +v -0.70255756 0.00000978 -0.24999737 +v 0.70103883 1.99998998 0.70363831 +v -0.70255756 1.99999022 -0.70509958 +v 0.70103883 0.00001001 -0.70509958 +v -0.70255756 0.00001001 0.70363819 +v 0.64705443 1.99999022 0.24999737 +v 0.64705443 1.99998986 0.49999523 +v 0.64705443 1.99999022 -0.24999761 +v 0.64705443 1.99999022 -0.00000011 +v 0.64705443 0.00000978 -0.24999737 +v 0.64705443 0.00000979 -0.49999499 +v 0.64705443 0.00000975 0.24999761 +v 0.64705443 0.00000976 0.00000011 +v 0.49999499 1.99998986 0.66250729 +v 0.24999737 1.99998986 0.66250729 +v 0 1.99998986 0.66250729 +v 0.49999499 0.00000979 -0.66396856 +v 0.24999737 0.00000979 -0.66396856 +v 0 0.00000979 -0.66396856 +v -0.24999785 1.99998986 0.66250729 +v -0.49999547 1.99998986 0.66250729 +v -0.24999785 0.00000979 -0.66396856 +v -0.49999547 0.00000979 -0.66396856 +v 0.64705443 1.99999022 -0.49999499 +v 0.64705443 0.00001 0.49999511 +v 0.49999499 1.99999022 -0.66396856 +v 0.64705443 1.9999901 -0.66396856 +v 0.24999737 1.99999022 -0.66396856 +v 0 1.99999022 -0.66396856 +v -0.24999785 1.99999022 -0.66396856 +v -0.49999547 1.99999022 -0.66396856 +v 0.64705443 0.00001 0.66250717 +v 0.49999499 0.00000999 0.66250717 +v 0.24999737 0.00000999 0.66250717 +v 0 0.00000999 0.66250717 +v -0.24999785 0.00000999 0.66250717 +v -0.49999547 0.00000999 0.66250717 +v -0.66399729 1.99998986 0.49999523 +v -0.66399729 2.01378703 0.66250729 +v -0.66399729 0.00000979 -0.49999499 +v -0.66399729 0.00001001 -0.66396856 +v -0.66399729 1.99999022 -0.24999761 +v -0.66399729 1.99999022 -0.00000011 +v -0.66399729 1.99999022 -0.49999499 +v -0.66399729 0.00000975 0.24999761 +v -0.66399729 0.00000976 0.00000011 +v -0.66399729 0.00001 0.49999511 +v -0.66399729 1.99999022 0.24999737 +v -0.66399729 0.00000978 -0.24999737 +v 0.64705443 1.99998998 0.66250729 +v -0.66399729 1.9999901 -0.66396856 +v 0.64705443 0.00000999 -0.66396856 +v -0.66399729 0.00001 0.66250717 +v 0.60592341 1.99999022 0.24999737 +v 0.60592341 1.99998951 0.49999523 +v 0.60592341 1.99999022 -0.24999761 +v 0.60592341 1.99999022 -0.00000011 +v 0.60592341 0.00000978 -0.24999737 +v 0.60592341 0.00000979 -0.49999499 +v 0.60592341 0.00000975 0.24999761 +v 0.60592341 0.00000976 0.00000011 +v 0.49999499 1.99998951 0.61880552 +v 0.24999737 1.99998951 0.61880552 +v 0 1.99998951 0.61880552 +v 0.49999499 0.00000979 -0.61769628 +v 0.24999737 0.00000979 -0.61769628 +v 0 0.00000979 -0.61769628 +v -0.24999785 1.99998951 0.61880552 +v -0.49999547 1.99998951 0.61880552 +v -0.24999785 0.00000979 -0.61769628 +v -0.49999547 0.00000979 -0.61769628 +v 0.60592341 1.99999022 -0.49999499 +v 0.60592341 0.00001 0.49999511 +v 0.49999499 1.99999022 -0.61769628 +v 0.60592341 1.9999901 -0.61769628 +v 0.24999737 1.99999022 -0.61769628 +v 0 1.99999022 -0.61769628 +v -0.24999785 1.99999022 -0.61769628 +v -0.49999547 1.99999022 -0.61769628 +v 0.60592341 0.00001 0.6188054 +v 0.49999499 0.00000999 0.6188054 +v 0.24999737 0.00000999 0.6188054 +v 0 0.00000999 0.6188054 +v -0.24999785 0.00000999 0.6188054 +v -0.49999547 0.00000999 0.6188054 +v -0.6254369 1.99998951 0.49999523 +v -0.6254369 2.01007676 0.61880552 +v -0.6254369 0.00000979 -0.49999499 +v -0.6254369 0.00001 -0.61769628 +v -0.6254369 1.99999022 -0.24999761 +v -0.6254369 1.99999022 -0.00000011 +v -0.6254369 1.99999022 -0.49999499 +v -0.6254369 0.00000975 0.24999761 +v -0.6254369 0.00000976 0.00000011 +v -0.6254369 0.00001 0.49999511 +v -0.6254369 1.99999022 0.24999737 +v -0.6254369 0.00000978 -0.24999737 +v 0.60592341 1.99998998 0.61880552 +v -0.6254369 1.9999901 -0.61769628 +v 0.60592341 0.00001005 -0.61769628 +v -0.6254369 0.00001 0.6188054 +v 0.5545094 1.99999022 0.24999737 +v 0.5545094 1.99998951 0.49999523 +v 0.5545094 1.99999022 -0.24999761 +v 0.5545094 1.99999022 -0.00000011 +v 0.5545094 0.00000978 -0.24999737 +v 0.5545094 0.00000979 -0.49999499 +v 0.5545094 0.00000975 0.24999761 +v 0.5545094 0.00000976 0.00000011 +v 0.49999499 1.99998951 0.56739175 +v 0.24999737 1.99998951 0.56739175 +v 0 1.99998951 0.56739175 +v 0.49999499 0.00000979 -0.56885314 +v 0.24999737 0.00000979 -0.56885314 +v 0 0.00000979 -0.56885314 +v -0.24999785 1.99998951 0.56739175 +v -0.49999547 1.99998951 0.56739175 +v -0.24999785 0.00000979 -0.56885314 +v -0.49999547 0.00000979 -0.56885314 +v 0.5545094 1.99999022 -0.49999499 +v 0.5545094 0.00001 0.49999511 +v 0.49999499 1.99999022 -0.56885314 +v 0.5545094 1.99999022 -0.56885314 +v 0.24999737 1.99999022 -0.56885314 +v 0 1.99999022 -0.56885314 +v -0.24999785 1.99999022 -0.56885314 +v -0.49999547 1.99999022 -0.56885314 +v 0.5545094 0.00001 0.56739163 +v 0.49999499 0.00001 0.56739163 +v 0.24999737 0.00001 0.56739163 +v 0 0.00001 0.56739163 +v -0.24999785 0.00001 0.56739163 +v -0.49999547 0.00001 0.56739163 +v -0.58430588 1.99998951 0.49999523 +v -0.58430588 2.00571179 0.56739175 +v -0.58430588 0.00000979 -0.49999499 +v -0.58430588 0.00000998 -0.56885314 +v -0.58430588 1.99999022 -0.24999761 +v -0.58430588 1.99999022 -0.00000011 +v -0.58430588 1.99999022 -0.49999499 +v -0.58430588 0.00000975 0.24999761 +v -0.58430588 0.00000976 0.00000011 +v -0.58430588 0.00001 0.49999511 +v -0.58430588 1.99999022 0.24999737 +v -0.58430588 0.00000978 -0.24999737 +v 0.5545094 1.99998986 0.56739175 +v -0.58430588 1.9999901 -0.56885314 +v 0.5545094 0.00001001 -0.56885314 +v -0.58430588 0.00001 0.56739163 +v -0.46348357 1.99999022 0.24999737 +v -0.46348357 2.01728129 0.4645642 +v -0.24999761 1.9999901 0.4645642 +v -0.46348357 0.00000978 -0.24999737 +v -0.46348357 0.00001001 -0.47887897 +v -0.24999761 0.00000979 -0.47887897 +v 0 1.9999901 0.4645642 +v 0.24999737 1.9999901 0.4645642 +v -0.46348357 1.99999022 -0.24999761 +v -0.46348357 1.99999022 -0.00000011 +v 0 0.00000979 -0.47887897 +v 0.24999737 0.00000979 -0.47887897 +v -0.46348357 0.00000975 0.24999761 +v -0.46348357 0.00000976 0.00000011 +v 0.46967673 1.99999022 -0.24999761 +v 0.46967673 1.99999022 -0.00000011 +v 0.24999737 1.99999022 -0.47887897 +v 0.46967673 1.99999022 -0.47887897 +v 0 1.99999022 -0.47887897 +v 0.46967673 0.00000975 0.24999761 +v 0.46967673 0.00000976 0.00000011 +v 0.46967673 0.00001001 0.46456408 +v 0.24999737 0.00001 0.46456408 +v 0 0.00001 0.46456408 +v 0.46967673 1.99999022 0.24999737 +v 0.46967673 1.99999034 0.4645642 +v -0.24999761 1.99999022 -0.47887897 +v -0.46348357 1.9999901 -0.47887897 +v 0.46967673 0.00001001 -0.47887897 +v 0.46967673 0.00000978 -0.24999737 +v -0.24999761 0.00001 0.46456408 +v -0.46348357 0.00001001 0.46456408 +v 0.24999737 1.99998986 0.42857456 +v 0 1.99998986 0.42857456 +v 0.24999737 0.00000978 -0.45317196 +v 0 0.00000978 -0.45317196 +v 0.42854571 1.99999022 -0.24999761 +v 0.42854571 1.99999022 -0.00000011 +v 0.42854571 0.00000975 0.24999761 +v 0.42854571 0.00000976 0.00000011 +v -0.24999785 1.99998986 0.42857456 +v -0.24999785 0.00000978 -0.45317196 +v 0.42854571 1.99999022 0.24999737 +v 0.42854571 0.00000978 -0.24999737 +v -0.43006444 1.99999022 0.24999737 +v -0.43006444 2.01438093 0.42857456 +v -0.43006444 0.00000978 -0.24999737 +v -0.43006444 0.00000995 -0.45317196 +v -0.43006444 1.99999022 -0.24999761 +v -0.43006444 1.99999022 -0.00000011 +v -0.43006444 0.00000975 0.24999761 +v -0.43006444 0.00000976 0.00000011 +v 0.24999737 1.99999022 -0.45317196 +v 0.42854571 1.99999046 -0.45317196 +v 0 1.99999022 -0.45317196 +v 0.42854571 0.00000996 0.42857444 +v 0.24999737 0.00000975 0.42857444 +v 0 0.00000975 0.42857444 +v 0.42854571 1.99998998 0.42857456 +v -0.24999785 1.99999022 -0.45317196 +v -0.43006444 1.9999901 -0.45317196 +v 0.42854571 0.00000999 -0.45317196 +v -0.24999785 0.00000975 0.42857444 +v -0.43006444 0.00000996 0.42857444 +v 0.24999737 1.99998951 0.39001417 +v 0 1.99998951 0.39001417 +v 0.24999737 0.00000978 -0.42489457 +v 0 0.00000978 -0.42489457 +v 0.39255619 1.99999022 -0.24999761 +v 0.39255619 1.99999022 -0.00000011 +v 0.39255619 0.00000975 0.24999761 +v 0.39255619 0.00000976 0.00000011 +v -0.24999785 1.99998951 0.39001417 +v -0.24999809 0.00000978 -0.42489457 +v 0.39255619 1.99999022 0.24999737 +v 0.39255619 0.00000978 -0.24999737 +v -0.39921617 1.99999022 0.24999737 +v -0.39921617 2.01127338 0.39001417 +v -0.39921617 0.00000978 -0.24999737 +v -0.39921617 0.0000099 -0.42489457 +v -0.39921617 1.99999022 -0.24999761 +v -0.39921617 1.99999022 -0.00000011 +v -0.39921617 0.00000975 0.24999761 +v -0.39921617 0.00000976 0.00000011 +v 0.24999737 1.99999022 -0.42489457 +v 0.39255619 1.99999022 -0.42489457 +v 0 1.99999022 -0.42489457 +v 0.39255619 0.00000997 0.39001405 +v 0.24999737 0.00000975 0.39001405 +v 0 0.00000975 0.39001405 +v 0.39255619 1.99998998 0.39001417 +v -0.24999809 1.99999022 -0.42489457 +v -0.39921617 1.99999022 -0.42489457 +v 0.39255619 0.00000998 -0.42489457 +v -0.24999785 0.00000975 0.39001405 +v -0.39921617 0.00000988 0.39001405 +v 0.24999737 1.99998962 0.3463124 +v 0 1.99998962 0.3463124 +v 0.24999737 0.00000978 -0.39147543 +v 0 0.00000978 -0.39147543 +v 0.36170768 1.99999022 -0.24999761 +v 0.36170768 1.99999022 -0.00000011 +v 0.36170768 0.00000975 0.24999761 +v 0.36170768 0.00000976 0.00000011 +v -0.24999785 1.99998962 0.3463124 +v -0.24999809 0.00000978 -0.39147543 +v 0.36170768 1.99999022 0.24999737 +v 0.36170768 0.00000978 -0.24999737 +v -0.36836791 1.99999022 0.24999737 +v -0.36836791 2.0077517 0.3463124 +v -0.36836791 0.00000978 -0.24999737 +v -0.36836791 0.00000985 -0.39147543 +v -0.36836791 1.99999022 -0.24999761 +v -0.36836791 1.99999022 -0.00000011 +v -0.36836791 0.00000975 0.24999761 +v -0.36836791 0.00000976 0.00000011 +v 0.24999737 1.99999022 -0.39147543 +v 0.36170768 1.99999046 -0.39147543 +v 0 1.99999022 -0.39147543 +v 0.36170768 0.00000996 0.34631228 +v 0.24999737 0.00000975 0.34631228 +v 0 0.00000975 0.34631228 +v 0.36170768 1.99998998 0.3463124 +v -0.24999809 1.99999022 -0.39147543 +v -0.36836791 1.99999046 -0.39147543 +v 0.36170768 0.00000998 -0.39147543 +v -0.24999785 0.00000975 0.34631228 +v -0.36836791 0.00000981 0.34631228 +v 0.24999737 1.99998962 0.30775213 +v 0 1.99998962 0.30775213 +v 0.24999737 0.00000978 -0.35291528 +v 0 0.00000978 -0.35291528 +v 0.33085942 1.99999022 -0.24999761 +v 0.33085942 1.99999022 -0.00000011 +v 0.33085942 0.00000975 0.24999761 +v 0.33085942 0.00000976 0.00000011 +v -0.24999785 1.99998962 0.30775213 +v -0.24999809 0.00000978 -0.35291528 +v 0.33085942 1.99999022 0.24999737 +v 0.33085942 0.00000978 -0.24999737 +v -0.33237838 1.99999022 0.24999737 +v -0.33237838 2.00464439 0.30775213 +v -0.33237838 0.00000978 -0.24999737 +v -0.33237838 0.00000981 -0.35291528 +v -0.33237838 1.99999022 -0.24999761 +v -0.33237838 1.99999022 -0.00000011 +v -0.33237838 0.00000975 0.24999761 +v -0.33237838 0.00000976 0.00000011 +v 0.24999737 1.99999022 -0.35291528 +v 0.33085942 2.01435065 -0.35291528 +v 0 1.99999022 -0.35291528 +v 0.33085942 0.00000995 0.30775201 +v 0.24999737 0.00000975 0.30775201 +v 0 0.00000975 0.30775201 +v 0.33085942 1.9999901 0.30775213 +v -0.24999809 1.99999022 -0.35291528 +v -0.33237838 1.99999058 -0.35291528 +v 0.33085942 0.00000999 -0.35291528 +v -0.24999785 0.00000975 0.30775201 +v -0.33237838 0.00000977 0.30775201 +v 0.24999737 1.99998998 0.27690386 +v 0 1.99998998 0.27690386 +v 0.24999737 0.00000978 -0.30664277 +v 0 0.00000978 -0.30664277 +v 0.2948699 1.99999022 -0.24999761 +v 0.2948699 1.99999022 -0.00000011 +v 0.2948699 0.00000975 0.24999761 +v 0.2948699 0.00000976 0.00000011 +v -0.24999785 1.99998998 0.27690386 +v -0.24999809 0.00000978 -0.30664277 +v 0.2948699 1.99999022 0.24999737 +v 0.2948699 0.00000978 -0.24999737 +v -0.30153012 1.99999022 0.24999737 +v -0.30153012 2.0021584 0.27690386 +v -0.30153012 0.00000978 -0.24999737 +v -0.30153012 0.00000988 -0.30664277 +v -0.30153012 1.99999022 -0.24999761 +v -0.30153012 1.99999022 -0.00000011 +v -0.30153012 0.00000975 0.24999761 +v -0.30153012 0.00000976 0.00000011 +v 0.24999737 1.99999022 -0.30664277 +v 0.2948699 2.00789403 -0.30664277 +v 0 1.99999022 -0.30664277 +v 0.2948699 0.00000996 0.27690374 +v 0.24999737 0.00000975 0.27690374 +v 0 0.00000975 0.27690374 +v 0.2948699 1.9999901 0.27690386 +v -0.24999809 1.99999022 -0.30664277 +v -0.30153012 1.99999046 -0.30664277 +v 0.2948699 0.00001009 -0.30664277 +v -0.24999785 0.00000975 0.27690374 +v -0.30153012 0.00000975 0.27690374 +v 0 1.99999022 -0.22695124 +v 0.23060274 1.9999901 -0.22695124 +v 0.23060274 1.99999022 -0.00000011 +v 0.23060274 0.00000976 0.00000011 +v 0.23060274 0.00001001 0.22291922 +v 0 0.00000975 0.22291922 +v -0.22955083 1.99999022 -0.00000011 +v -0.22955083 1.99999022 0.22291934 +v 0 1.99999022 0.22291934 +v -0.22955083 0.00000976 0.00000011 +v -0.22955083 0.00001001 -0.22695136 +v 0 0.00000977 -0.22695136 +v 0.23060274 1.99999022 0.22291934 +v -0.22955083 1.99999022 -0.22695124 +v 0.23060274 0.00001001 -0.22695136 +v -0.22955083 0.00001001 0.22291922 +v 0 1.99999022 -0.2038151 +v 0.2023251 1.9999901 -0.2038151 +v 0.2023251 1.99999022 -0.00000011 +v 0.2023251 0.00000976 0.00000011 +v 0.2023251 0.00001 0.18950021 +v 0 0.00000976 0.18950021 +v -0.20384383 1.99999022 -0.00000011 +v -0.20384383 1.9999901 0.18950033 +v 0 1.99999022 0.18950033 +v -0.20384383 0.00000976 0.00000011 +v -0.20384383 0.00000996 -0.20381522 +v 0 0.00000977 -0.20381522 +v 0.2023251 1.9999901 0.18950033 +v -0.20384383 1.99999046 -0.2038151 +v 0.2023251 0.00001 -0.20381522 +v -0.20384383 0.00000994 0.18950021 +v 0 1.99999022 -0.17810821 +v 0.18175959 1.99999022 -0.17810821 +v 0.18175959 1.99999022 -0.00000011 +v 0.18175959 0.00000976 0.00000011 +v 0.18175959 0.00000999 0.15608131 +v 0 0.00000976 0.15608131 +v -0.18841981 1.99999022 -0.00000011 +v -0.18841981 1.9999901 0.15608143 +v 0 1.99999022 0.15608143 +v -0.18841981 0.00000976 0.00000011 +v -0.18841981 0.00000995 -0.17810833 +v 0 0.00000977 -0.17810833 +v 0.18175959 1.9999901 0.15608143 +v -0.18841981 1.99999046 -0.17810821 +v 0.18175959 0.00000995 -0.17810833 +v -0.18841981 0.0000099 0.15608131 +v 0 1.99999022 -0.15497195 +v 0.15348196 1.99999022 -0.15497195 +v 0.15348196 1.99999022 -0.00000011 +v 0.15348196 0.00000976 0.00000011 +v 0.15348196 0.00000997 0.12009167 +v 0 0.00000976 0.12009167 +v -0.16271281 1.99999022 -0.00000011 +v -0.16271281 1.9999901 0.12009179 +v 0 1.99999022 0.12009179 +v -0.16271281 0.00000976 0.00000011 +v -0.16271281 0.0000099 -0.15497207 +v 0 0.00000977 -0.15497207 +v 0.15348196 1.99999022 0.12009179 +v -0.16271281 1.99999022 -0.15497195 +v 0.15348196 0.00000995 -0.15497207 +v -0.16271281 0.00000985 0.12009167 +v 0 1.99999022 -0.13440644 +v 0.12777495 1.99999046 -0.13440644 +v 0.12777495 1.99999022 -0.00000011 +v 0.12777495 0.00000976 0.00000011 +v 0.12777495 0.00000996 0.08667266 +v 0 0.00000976 0.08667266 +v -0.12929391 1.99999022 -0.00000011 +v -0.12929391 1.9999901 0.08667278 +v 0 1.99999022 0.08667278 +v -0.12929391 0.00000976 0.00000011 +v -0.12929391 0.00000986 -0.13440656 +v 0 0.00000977 -0.13440656 +v 0.12777495 1.9999901 0.08667278 +v -0.12929391 1.99999022 -0.13440644 +v 0.12777495 0.00000995 -0.13440656 +v -0.12929391 0.00000981 0.08667266 +v 0 1.99999022 -0.11384093 +v 0.10206818 1.99999046 -0.11384093 +v 0.10206818 1.99999022 -0.00000011 +v 0.10206818 0.00000976 0.00000011 +v 0.10206818 0.00000995 0.06096577 +v 0 0.00000976 0.06096577 +v -0.10358691 1.99999022 -0.00000011 +v -0.10358691 1.99998998 0.06096589 +v 0 1.99999022 0.06096589 +v -0.10358691 0.00000976 0.00000011 +v -0.10358691 0.00000983 -0.11384105 +v 0 0.00000977 -0.11384105 +v 0.10206818 1.9999901 0.06096589 +v -0.10358691 1.99999022 -0.11384093 +v 0.10206818 0.00000995 -0.11384105 +v -0.10358691 0.00000978 0.06096577 +v 0 1.99999022 -0.08813405 +v 0.07893204 2.00342965 -0.08813405 +v 0.07893204 1.99999022 -0.00000011 +v 0.07893204 0.00000976 0.00000011 +v 0.07893204 0.00000994 0.04040026 +v 0 0.00000976 0.04040026 +v -0.08559227 1.99999022 -0.00000011 +v -0.08559227 1.9999901 0.04040038 +v 0 1.99999022 0.04040038 +v -0.08559227 0.00000976 0.00000011 +v -0.08559227 0.00000985 -0.08813417 +v 0 0.00000977 -0.08813417 +v 0.07893204 1.99999046 0.04040038 +v -0.08559227 1.9999901 -0.08813405 +v 0.07893204 0.00000997 -0.08813417 +v -0.08559227 0.00000977 0.04040026 +v 0 1.99999022 -0.07270991 +v 0.05836653 2.00193166 -0.07270991 +v 0.05836653 1.99999022 -0.00000011 +v 0.05836653 0.00000976 0.00000011 +v 0.05836653 0.00000992 0.01983475 +v 0 0.00000976 0.01983475 +v -0.07016801 1.99999022 -0.00000011 +v -0.07016801 1.99999046 0.01983487 +v 0 1.99999022 0.01983487 +v -0.07016801 0.00000976 0.00000011 +v -0.07016801 0.00000982 -0.07271003 +v 0 0.00000977 -0.07271003 +v 0.05836653 1.99999046 0.01983487 +v -0.07016801 1.9999901 -0.07270991 +v 0.05836653 0.00000996 -0.07271003 +v -0.07016801 0.00000977 0.01983475 +v 0.49999451 1.56563651 0.99998998 +v 0.74999189 1.56563651 0.99998998 +v 0.74999189 1.69120502 0.99998998 +v 0.49999451 1.69120502 0.99998998 +v 0 1.56563651 0.99998998 +v 0.24999737 1.56563651 0.99998998 +v 0.24999737 1.69120502 0.99998998 +v 0 1.69120502 0.99998998 +v -0.49999523 1.56563651 0.99998998 +v -0.24999761 1.56563651 0.99998998 +v -0.24999761 1.69120502 0.99998998 +v -0.49999523 1.69120502 0.99998998 +v -0.7499926 1.56563651 0.99998998 +v -0.87553942 1.56563651 0.95814114 +v -0.7499926 1.69120502 0.99998998 +v -0.87553942 1.69120502 0.95814096 +v -0.49999523 1.56563651 -0.99998998 +v -0.7499926 1.56563651 -0.99998998 +v -0.7499926 1.69120502 -0.99998998 +v -0.49999523 1.69120502 -0.99998998 +v 0 1.56563651 -0.99998998 +v -0.24999761 1.56563651 -0.99998998 +v -0.24999761 1.69120502 -0.99998998 +v 0 1.69120502 -0.99998998 +v 0.49999451 1.56563651 -0.99998998 +v 0.24999737 1.56563651 -0.99998998 +v 0.24999737 1.69120502 -0.99998998 +v 0.49999451 1.69120502 -0.99998998 +v 0.74999189 1.56563651 -0.99998998 +v 0.84693336 1.56563651 -0.96767622 +v 0.74999189 1.69120502 -0.99998998 +v 0.84693336 1.69120502 -0.96767622 +v 0.84693336 1.56563651 0.96767622 +v 0.84693336 1.69120502 0.96767622 +v -0.87553942 1.56563651 -0.95814096 +v -0.87553942 1.69120502 -0.95814096 +v 0.24999737 1.31449949 0.99998998 +v 0.49999451 1.31449949 0.99998998 +v 0.49999451 1.4318788 0.99998998 +v 0.24999737 1.4318788 0.99998998 +v 0 1.31449949 0.99998998 +v 0 1.4318788 0.99998998 +v -0.7499926 1.31449949 0.99998998 +v -0.49999523 1.31449949 0.99998998 +v -0.49999523 1.4318788 0.99998998 +v -0.7499926 1.4318788 0.99998998 +v -0.88372862 1.31449949 0.95541125 +v -0.88372862 1.4318788 0.95541125 +v -0.24999761 1.31449949 -0.99998998 +v -0.49999523 1.31449949 -0.99998998 +v -0.49999523 1.4318788 -0.99998998 +v -0.24999761 1.4318788 -0.99998998 +v 0 1.31449949 -0.99998998 +v 0 1.4318788 -0.99998998 +v 0.74999189 1.31449949 -0.99998998 +v 0.49999451 1.31449949 -0.99998998 +v 0.49999451 1.4318788 -0.99998998 +v 0.74999189 1.4318788 -0.99998998 +v 0.86877155 1.31449949 -0.960397 +v 0.86877155 1.4318788 -0.961815 +v 0.74999189 1.31449949 0.99998998 +v 0.86877155 1.31449949 0.96039682 +v 0.74999189 1.4318788 0.99998998 +v 0.86877155 1.4318788 0.960397 +v -0.24999761 1.31449949 0.99998998 +v -0.24999761 1.4318788 0.99998998 +v -0.7499926 1.31449949 -0.99998998 +v -0.88372862 1.31449949 -0.95541113 +v -0.7499926 1.4318788 -0.99998998 +v -0.88372862 1.4318788 -0.95541131 +v 0.24999737 1.31449949 -0.99998998 +v 0.24999737 1.4318788 -0.99998998 +v 0 1.07974088 0.99998998 +v 0.24999737 1.07974088 0.99998998 +v 0.24999737 1.19984996 0.99998998 +v 0 1.19984996 0.99998998 +v -0.7499926 1.07974088 0.99998998 +v -0.91375589 1.07974088 0.9454022 +v -0.7499926 1.19984996 0.99998998 +v -0.91375589 1.19984996 0.9454022 +v 0 1.07974088 -0.99998998 +v -0.24999761 1.07974088 -0.99998998 +v -0.24999761 1.19984996 -0.99998998 +v 0 1.19984996 -0.99998998 +v 0.74999189 1.07974088 -0.99998998 +v 0.8824203 1.07974088 -0.95584744 +v 0.74999189 1.19984996 -0.99998998 +v 0.8824203 1.19984996 -0.95751011 +v 0.49999451 1.07974088 0.99998998 +v 0.74999189 1.07974088 0.99998998 +v 0.74999189 1.19984996 0.99998998 +v 0.49999451 1.19984996 0.99998998 +v -0.49999523 1.07974088 0.99998998 +v -0.24999761 1.07974088 0.99998998 +v -0.24999761 1.19984996 0.99998998 +v -0.49999523 1.19984996 0.99998998 +v -0.49999523 1.07974088 -0.99998998 +v -0.7499926 1.07974088 -0.99998998 +v -0.7499926 1.19984996 -0.99998998 +v -0.49999523 1.19984996 -0.99998998 +v 0.49999451 1.07974088 -0.99998998 +v 0.24999737 1.07974088 -0.99998998 +v 0.24999737 1.19984996 -0.99998998 +v 0.49999451 1.19984996 -0.99998998 +v 0.8824203 1.07974088 0.95584732 +v 0.8824203 1.19984996 0.95584732 +v -0.91375589 1.07974088 -0.9454022 +v -0.91375589 1.19984996 -0.9454022 +v -0.24999761 0.80403602 0.99998998 +v 0 0.80403602 0.99998998 +v 0 0.92687487 0.99998998 +v -0.24999761 0.92687487 0.99998998 +v -0.49999523 0.80403602 0.99998998 +v -0.49999523 0.92687487 0.99998998 +v -0.7499926 0.80403602 0.99998998 +v -0.7499926 0.92687487 0.99998998 +v -0.89737737 0.80403602 0.95086163 +v -0.89737737 0.92687487 0.95086163 +v 0.24999737 0.80403602 -0.99998998 +v 0 0.80403602 -0.99998998 +v 0 0.92687487 -0.99998998 +v 0.24999737 0.92687487 -0.99998998 +v 0.49999451 0.80403602 -0.99998998 +v 0.49999451 0.92687487 -0.99998998 +v 0.74999189 0.80403602 -0.99998998 +v 0.74999189 0.92687487 -0.99998998 +v 0.88787961 0.80403602 -0.95402753 +v 0.88787961 0.92687487 -0.95402747 +v 0.74999189 0.80403602 0.99998998 +v 0.88787961 0.80403602 0.95402747 +v 0.74999189 0.92687487 0.99998998 +v 0.88787961 0.92687487 0.95402747 +v 0.49999451 0.80403602 0.99998998 +v 0.49999451 0.92687487 0.99998998 +v 0.24999737 0.80403602 0.99998998 +v 0.24999737 0.92687487 0.99998998 +v -0.7499926 0.80403602 -0.99998998 +v -0.89737737 0.80403602 -0.95525437 +v -0.7499926 0.92687487 -0.99998998 +v -0.89737737 0.92687487 -0.95175147 +v -0.49999523 0.80403602 -0.99998998 +v -0.49999523 0.92687487 -0.99998998 +v -0.24999761 0.80403602 -0.99998998 +v -0.24999761 0.92687487 -0.99998998 +v -0.49999523 0.56381797 0.99998998 +v -0.24999761 0.56381797 0.99998998 +v -0.24999761 0.70030546 0.99998998 +v -0.49999523 0.70030546 0.99998998 +v -0.7499926 0.56381797 0.99998998 +v -0.91102612 0.56381797 0.94631218 +v -0.7499926 0.70030546 0.99998998 +v -0.91102612 0.70030546 0.94631212 +v 0.49999451 0.56381797 -0.99998998 +v 0.24999737 0.56381797 -0.99998998 +v 0.24999737 0.70030546 -0.99998998 +v 0.49999451 0.70030546 -0.99998998 +v 0.74999189 0.56381797 -0.99998998 +v 0.90425825 0.56381797 -0.9485681 +v 0.74999189 0.70030546 -0.99998998 +v 0.90425825 0.70030546 -0.94856804 +v 0.49999451 0.56381797 0.99998998 +v 0.74999189 0.56381797 0.99998998 +v 0.74999189 0.70030546 0.99998998 +v 0.49999451 0.70030546 0.99998998 +v 0 0.56381797 0.99998998 +v 0.24999737 0.56381797 0.99998998 +v 0.24999737 0.70030546 0.99998998 +v 0 0.70030546 0.99998998 +v -0.49999523 0.56381797 -0.99998998 +v -0.7499926 0.56381797 -0.99998998 +v -0.7499926 0.70030546 -0.99998998 +v -0.49999523 0.70030546 -0.99998998 +v 0 0.56381797 -0.99998998 +v -0.24999761 0.56381797 -0.99998998 +v -0.24999761 0.70030546 -0.99998998 +v 0 0.70030546 -0.99998998 +v 0.90425825 0.56381797 0.9485681 +v 0.90425825 0.70030546 0.94856798 +v -0.91102612 0.56381797 -0.94631212 +v -0.91102612 0.70030546 -0.94631207 +v -0.7499926 0.32087016 0.99998998 +v -0.49999523 0.32087016 0.99998998 +v -0.49999523 0.46008753 0.99998998 +v -0.7499926 0.46008753 0.99998998 +v -0.90010714 0.32087016 0.94995182 +v -0.90010714 0.46008753 0.94995182 +v 0.74999189 0.32087016 -0.99998998 +v 0.49999451 0.32087016 -0.99998998 +v 0.49999451 0.46008753 -0.99998998 +v 0.74999189 0.46008753 -0.99998998 +v 0.89606905 0.32087016 -0.9512977 +v 0.89606905 0.46008753 -0.95513624 +v 0.24999737 0.32087016 0.99998998 +v 0.49999451 0.32087016 0.99998998 +v 0.49999451 0.46008753 0.99998998 +v 0.24999737 0.46008753 0.99998998 +v 0 0.32087016 0.99998998 +v 0 0.46008753 0.99998998 +v -0.24999761 0.32087016 -0.99998998 +v -0.49999523 0.32087016 -0.99998998 +v -0.49999523 0.46008753 -0.99998998 +v -0.24999761 0.46008753 -0.99998998 +v 0 0.32087016 -0.99998998 +v 0 0.46008753 -0.99998998 +v -0.24999761 0.32087016 0.99998998 +v -0.24999761 0.46008753 0.99998998 +v 0.24999737 0.32087016 -0.99998998 +v 0.24999737 0.46008753 -0.99998998 +v 0.74999189 0.32087016 0.99998998 +v 0.89606905 0.32087016 0.95129787 +v 0.74999189 0.46008753 0.99998998 +v 0.89606905 0.46008753 0.95129782 +v -0.7499926 0.32087016 -0.99998998 +v -0.90010714 0.32087016 -0.94995182 +v -0.7499926 0.46008753 -0.99998998 +v -0.90010714 0.46008753 -0.94995182 +v -0.70629477 0.25000762 -0.99998998 +v -0.70629477 0.10794949 -0.95263731 +v -0.55342888 0.25000762 -0.99998998 +v -0.55342888 0.10794949 -0.95263725 +v -0.70629477 0.75000286 -0.99998998 +v -0.70629477 0.70030546 -0.99998998 +v -0.55342888 0.70030546 -0.99998998 +v -0.55342888 0.75000286 -0.99998998 +v -0.70629477 1.24999797 -0.99998998 +v -0.70629477 1.1998502 -0.99998998 +v -0.55342888 1.1998502 -0.99998998 +v -0.55342888 1.24999797 -0.99998998 +v -0.70629477 1.74999272 -0.99998998 +v -0.70629477 1.69120526 -0.99998998 +v -0.55342888 1.69120526 -0.99998998 +v -0.55342888 1.74999272 -0.99998998 +v -0.70629477 0.25000762 0.99998998 +v -0.70629477 0.10794949 0.95263725 +v -0.55342888 0.25000762 0.99998998 +v -0.55342888 0.10794949 0.95263725 +v -0.70629477 0.50000524 0.99998998 +v -0.70629477 0.46008801 0.99998998 +v -0.55342888 0.46008801 0.99998998 +v -0.55342888 0.50000524 0.99998998 +v -0.70629477 1.24999797 0.99998998 +v -0.70629477 1.1998502 0.99998998 +v -0.55342888 1.1998502 0.99998998 +v -0.55342888 1.24999797 0.99998998 +v -0.70629477 1.49999535 0.99998998 +v -0.70629477 1.43187904 0.99998998 +v -0.55342888 1.43187904 0.99998998 +v -0.55342888 1.49999535 0.99998998 +v -0.70629477 0.75000286 0.99998998 +v -0.70629477 0.70030546 0.99998998 +v -0.55342888 0.70030546 0.99998998 +v -0.55342888 0.75000286 0.99998998 +v -0.70629477 1.00000035 0.99998998 +v -0.70629477 0.92687511 0.99998998 +v -0.55342888 0.92687511 0.99998998 +v -0.55342888 1.00000035 0.99998998 +v -0.70629477 1.74999272 0.99998998 +v -0.70629477 1.69120526 0.99998998 +v -0.55342888 1.69120526 0.99998998 +v -0.55342888 1.74999272 0.99998998 +v -0.70629477 1.89047694 0.95316189 +v -0.55342888 1.89047694 0.95316189 +v -0.70629477 0.50000524 -0.99998998 +v -0.70629477 0.46008801 -0.99998998 +v -0.55342888 0.46008801 -0.99998998 +v -0.55342888 0.50000524 -0.99998998 +v -0.70629477 1.00000035 -0.99998998 +v -0.70629477 0.92687511 -0.99998998 +v -0.55342888 0.92687511 -0.99998998 +v -0.55342888 1.00000035 -0.99998998 +v -0.70629477 1.49999535 -0.99998998 +v -0.70629477 1.43187904 -0.99998998 +v -0.55342888 1.43187904 -0.99998998 +v -0.55342888 1.49999535 -0.99998998 +v -0.70629477 1.89047694 -0.95316189 +v -0.55342888 1.89047694 -0.95316189 +v -0.70629477 1.56563675 -0.99998998 +v -0.55342888 1.56563675 -0.99998998 +v -0.70629477 1.56563675 0.99998998 +v -0.55342888 1.56563675 0.99998998 +v -0.70629477 1.31449973 0.99998998 +v -0.55342888 1.31449973 0.99998998 +v -0.70629477 1.31449973 -0.99998998 +v -0.55342888 1.31449973 -0.99998998 +v -0.70629477 1.07974124 -0.99998998 +v -0.55342888 1.07974124 -0.99998998 +v -0.70629477 1.07974124 0.99998998 +v -0.55342888 1.07974124 0.99998998 +v -0.70629477 0.80403602 0.99998998 +v -0.55342888 0.80403602 0.99998998 +v -0.70629477 0.80403602 -0.99998998 +v -0.55342888 0.80403602 -0.99998998 +v -0.70629477 0.56381821 -0.99998998 +v -0.55342888 0.56381821 -0.99998998 +v -0.70629477 0.56381821 0.99998998 +v -0.55342888 0.56381821 0.99998998 +v -0.70629477 0.32087039 0.99998998 +v -0.55342888 0.32087039 0.99998998 +v -0.70629477 0.32087039 -0.99998998 +v -0.55342888 0.32087039 -0.99998998 +v -0.44423866 0.25000762 0.99998998 +v -0.44423866 0.10521984 0.95172733 +v -0.32139992 0.25000762 0.99998998 +v -0.32139992 0.10521984 0.95172733 +v -0.44423866 0.75000286 0.99998998 +v -0.44423866 0.70030546 0.99998998 +v -0.32139992 0.70030546 0.99998998 +v -0.32139992 0.75000286 0.99998998 +v -0.44423866 1.24999797 0.99998998 +v -0.44423866 1.1998502 0.99998998 +v -0.32139992 1.1998502 0.99998998 +v -0.32139992 1.24999797 0.99998998 +v -0.44423866 1.74999272 0.99998998 +v -0.44423866 1.69120526 0.99998998 +v -0.32139992 1.69120526 0.99998998 +v -0.32139992 1.74999272 0.99998998 +v -0.44423866 0.25000762 -0.99998998 +v -0.44423866 0.10521984 -0.96065849 +v -0.32139992 0.25000762 -0.99998998 +v -0.32139992 0.10521984 -0.95501047 +v -0.44423866 0.50000524 -0.99998998 +v -0.44423866 0.46008801 -0.99998998 +v -0.32139992 0.46008801 -0.99998998 +v -0.32139992 0.50000524 -0.99998998 +v -0.44423866 1.24999797 -0.99998998 +v -0.44423866 1.1998502 -0.99998998 +v -0.32139992 1.1998502 -0.99998998 +v -0.32139992 1.24999797 -0.99998998 +v -0.44423866 1.49999535 -0.99998998 +v -0.44423866 1.43187904 -0.99998998 +v -0.32139992 1.43187904 -0.99998998 +v -0.32139992 1.49999535 -0.99998998 +v -0.44423866 0.50000524 0.99998998 +v -0.44423866 0.46008801 0.99998998 +v -0.32139992 0.46008801 0.99998998 +v -0.32139992 0.50000524 0.99998998 +v -0.44423866 1.00000035 0.99998998 +v -0.44423866 0.92687511 0.99998998 +v -0.32139992 0.92687511 0.99998998 +v -0.32139992 1.00000035 0.99998998 +v -0.44423866 1.49999535 0.99998998 +v -0.44423866 1.43187904 0.99998998 +v -0.32139992 1.43187904 0.99998998 +v -0.32139992 1.49999535 0.99998998 +v -0.44423866 1.90412569 0.94861227 +v -0.32139992 1.90412569 0.94861245 +v -0.44423866 0.75000286 -0.99998998 +v -0.44423866 0.70030546 -0.99998998 +v -0.32139992 0.70030546 -0.99998998 +v -0.32139992 0.75000286 -0.99998998 +v -0.44423866 1.00000035 -0.99998998 +v -0.44423866 0.92687511 -0.99998998 +v -0.32139992 0.92687511 -0.99998998 +v -0.32139992 1.00000035 -0.99998998 +v -0.44423866 1.74999272 -0.99998998 +v -0.44423866 1.69120526 -0.99998998 +v -0.32139992 1.69120526 -0.99998998 +v -0.32139992 1.74999272 -0.99998998 +v -0.44423866 1.90412569 -0.94861245 +v -0.32139992 1.90412569 -0.94861227 +v -0.44423866 1.56563675 0.99998998 +v -0.32139992 1.56563675 0.99998998 +v -0.44423866 1.56563675 -0.99998998 +v -0.32139992 1.56563675 -0.99998998 +v -0.44423866 1.31449973 -0.99998998 +v -0.32139992 1.31449973 -0.99998998 +v -0.44423866 1.31449973 0.99998998 +v -0.32139992 1.31449973 0.99998998 +v -0.44423866 1.07974124 0.99998998 +v -0.32139992 1.07974124 0.99998998 +v -0.44423866 1.07974124 -0.99998998 +v -0.32139992 1.07974124 -0.99998998 +v -0.44423866 0.80403602 0.99998998 +v -0.32139992 0.80403602 0.99998998 +v -0.44423866 0.80403602 -0.99998998 +v -0.32139992 0.80403602 -0.99998998 +v -0.44423866 0.56381821 0.99998998 +v -0.32139992 0.56381821 0.99998998 +v -0.44423866 0.56381821 -0.99998998 +v -0.32139992 0.56381821 -0.99998998 +v -0.44423866 0.32087039 -0.99998998 +v -0.32139992 0.32087039 -0.99998998 +v -0.44423866 0.32087039 0.99998998 +v -0.32139992 0.32087039 0.99998998 +v -0.19310164 0.25000762 -0.99998998 +v -0.19310164 0.10521984 -0.95211136 +v -0.06753301 0.25000762 -0.99998998 +v -0.06753301 0.10521984 -0.95186179 +v -0.19310164 1.24999797 -0.99998998 +v -0.19310164 1.1998502 -0.99998998 +v -0.06753301 1.1998502 -0.99998998 +v -0.06753301 1.24999797 -0.99998998 +v -0.19310164 0.75000286 -0.99998998 +v -0.19310164 0.70030546 -0.99998998 +v -0.06753301 0.70030546 -0.99998998 +v -0.06753301 0.75000286 -0.99998998 +v -0.19310164 1.74999272 -0.99998998 +v -0.19310164 1.69120526 -0.99998998 +v -0.06753301 1.69120526 -0.99998998 +v -0.06753301 1.74999272 -0.99998998 +v -0.19310164 0.50000524 -0.99998998 +v -0.19310164 0.46008801 -0.99998998 +v -0.06753301 0.46008801 -0.99998998 +v -0.06753301 0.50000524 -0.99998998 +v -0.19310164 1.49999535 -0.99998998 +v -0.19310164 1.43187904 -0.99998998 +v -0.06753301 1.43187904 -0.99998998 +v -0.06753301 1.49999535 -0.99998998 +v -0.19310164 0.25000762 0.99998998 +v -0.19310164 0.10521984 0.95172733 +v -0.06753301 0.25000762 0.99998998 +v -0.06753301 0.10521984 0.95172739 +v -0.19310164 0.50000524 0.99998998 +v -0.19310164 0.46008801 0.99998998 +v -0.06753301 0.46008801 0.99998998 +v -0.06753301 0.50000524 0.99998998 +v -0.19310164 0.75000286 0.99998998 +v -0.19310164 0.70030546 0.99998998 +v -0.06753301 0.70030546 0.99998998 +v -0.06753301 0.75000286 0.99998998 +v -0.19310164 1.00000035 0.99998998 +v -0.19310164 0.92687511 0.99998998 +v -0.06753301 0.92687511 0.99998998 +v -0.06753301 1.00000035 0.99998998 +v -0.19310164 1.24999797 0.99998998 +v -0.19310164 1.1998502 0.99998998 +v -0.06753301 1.1998502 0.99998998 +v -0.06753301 1.24999797 0.99998998 +v -0.19310164 1.49999535 0.99998998 +v -0.19310164 1.43187904 0.99998998 +v -0.06753301 1.43187904 0.99998998 +v -0.06753301 1.49999535 0.99998998 +v -0.19310164 1.74999272 0.99998998 +v -0.19310164 1.69120526 0.99998998 +v -0.06753301 1.69120526 0.99998998 +v -0.06753301 1.74999272 0.99998998 +v -0.19310164 1.90139591 0.94952231 +v -0.06753301 1.90139591 0.94952231 +v -0.19310164 1.00000035 -0.99998998 +v -0.19310164 0.92687511 -0.99998998 +v -0.06753301 0.92687511 -0.99998998 +v -0.06753301 1.00000035 -0.99998998 +v -0.19310164 1.90139591 -0.94952219 +v -0.06753301 1.90139591 -0.94952231 +v -0.19310164 1.56563675 -0.99998998 +v -0.06753301 1.56563675 -0.99998998 +v -0.19310164 1.56563675 0.99998998 +v -0.06753301 1.56563675 0.99998998 +v -0.19310164 1.31449973 -0.99998998 +v -0.06753301 1.31449973 -0.99998998 +v -0.19310164 1.31449973 0.99998998 +v -0.06753301 1.31449973 0.99998998 +v -0.19310164 1.07974124 -0.99998998 +v -0.06753301 1.07974124 -0.99998998 +v -0.19310164 1.07974124 0.99998998 +v -0.06753301 1.07974124 0.99998998 +v -0.19310164 0.80403602 0.99998998 +v -0.06753301 0.80403602 0.99998998 +v -0.19310164 0.80403602 -0.99998998 +v -0.06753301 0.80403602 -0.99998998 +v -0.19310164 0.56381821 -0.99998998 +v -0.06753301 0.56381821 -0.99998998 +v -0.19310164 0.56381821 0.99998998 +v -0.06753301 0.56381821 0.99998998 +v -0.19310164 0.32087039 -0.99998998 +v -0.06753301 0.32087039 -0.99998998 +v -0.19310164 0.32087039 0.99998998 +v -0.06753301 0.32087039 0.99998998 +v 0.06895446 0.25000762 0.99998998 +v 0.06895446 0.10521984 0.95172733 +v 0.1644957 0.25000762 0.99998998 +v 0.1644957 0.10521984 0.95172739 +v 0.06895446 1.24999797 0.99998998 +v 0.06895446 1.1998502 0.99998998 +v 0.1644957 1.1998502 0.99998998 +v 0.1644957 1.24999797 0.99998998 +v 0.06895446 0.75000286 0.99998998 +v 0.06895446 0.70030546 0.99998998 +v 0.1644957 0.70030546 0.99998998 +v 0.1644957 0.75000286 0.99998998 +v 0.06895446 1.74999272 0.99998998 +v 0.06895446 1.69120526 0.99998998 +v 0.1644957 1.69120526 0.99998998 +v 0.1644957 1.74999272 0.99998998 +v 0.06895446 0.50000524 0.99998998 +v 0.06895446 0.46008801 0.99998998 +v 0.1644957 0.46008801 0.99998998 +v 0.1644957 0.50000524 0.99998998 +v 0.06895446 1.49999535 0.99998998 +v 0.06895446 1.43187904 0.99998998 +v 0.1644957 1.43187904 0.99998998 +v 0.1644957 1.49999535 0.99998998 +v 0.06895446 0.25000762 -0.99998998 +v 0.06895446 0.10521984 -0.95172733 +v 0.1644957 0.25000762 -0.99998998 +v 0.1644957 0.10521984 -0.95172733 +v 0.06895446 0.50000524 -0.99998998 +v 0.06895446 0.46008801 -0.99998998 +v 0.1644957 0.46008801 -0.99998998 +v 0.1644957 0.50000524 -0.99998998 +v 0.06895446 0.75000286 -0.99998998 +v 0.06895446 0.70030546 -0.99998998 +v 0.1644957 0.70030546 -0.99998998 +v 0.1644957 0.75000286 -0.99998998 +v 0.06895446 1.00000035 -0.99998998 +v 0.06895446 0.92687511 -0.99998998 +v 0.1644957 0.92687511 -0.99998998 +v 0.1644957 1.00000035 -0.99998998 +v 0.06895446 1.00000035 0.99998998 +v 0.06895446 0.92687511 0.99998998 +v 0.1644957 0.92687511 0.99998998 +v 0.1644957 1.00000035 0.99998998 +v 0.06895446 1.90958523 0.94679236 +v 0.1644957 1.90958523 0.94679236 +v 0.06895446 1.24999797 -0.99998998 +v 0.06895446 1.1998502 -0.99998998 +v 0.1644957 1.1998502 -0.99998998 +v 0.1644957 1.24999797 -0.99998998 +v 0.06895446 1.49999535 -0.99998998 +v 0.06895446 1.43187904 -0.99998998 +v 0.1644957 1.43187904 -0.99998998 +v 0.1644957 1.49999535 -0.99998998 +v 0.06895446 1.74999272 -0.99998998 +v 0.06895446 1.69120526 -0.99998998 +v 0.1644957 1.69120526 -0.99998998 +v 0.1644957 1.74999272 -0.99998998 +v 0.06895446 1.90958523 -0.94679254 +v 0.1644957 1.90958523 -0.94679254 +v 0.06895446 1.56563675 0.99998998 +v 0.1644957 1.56563675 0.99998998 +v 0.06895446 1.56563675 -0.99998998 +v 0.1644957 1.56563675 -0.99998998 +v 0.06895446 1.31449973 0.99998998 +v 0.1644957 1.31449973 0.99998998 +v 0.06895446 1.31449973 -0.99998998 +v 0.1644957 1.31449973 -0.99998998 +v 0.06895446 1.07974124 0.99998998 +v 0.1644957 1.07974124 0.99998998 +v 0.06895446 1.07974124 -0.99998998 +v 0.1644957 1.07974124 -0.99998998 +v 0.06895446 0.80403602 -0.99998998 +v 0.1644957 0.80403602 -0.99998998 +v 0.06895446 0.80403602 0.99998998 +v 0.1644957 0.80403602 0.99998998 +v 0.06895446 0.56381821 0.99998998 +v 0.1644957 0.56381821 0.99998998 +v 0.06895446 0.56381821 -0.99998998 +v 0.1644957 0.56381821 -0.99998998 +v 0.06895446 0.32087039 0.99998998 +v 0.1644957 0.32087039 0.99998998 +v 0.06895446 0.32087039 -0.99998998 +v 0.1644957 0.32087039 -0.99998998 +v 0.29552364 0.25000762 -0.99998998 +v 0.29552364 0.11340904 -0.95445704 +v 0.43747091 0.25000762 -0.99998998 +v 0.43747091 0.11340904 -0.95445716 +v 0.29552364 0.75000286 -0.99998998 +v 0.29552364 0.70030546 -0.99998998 +v 0.43747091 0.70030546 -0.99998998 +v 0.43747091 0.75000286 -0.99998998 +v 0.29552364 1.24999797 -0.99998998 +v 0.29552364 1.1998502 -0.99998998 +v 0.43747091 1.1998502 -0.99998998 +v 0.43747091 1.24999797 -0.99998998 +v 0.29552364 1.74999272 -0.99998998 +v 0.29552364 1.69120526 -0.99998998 +v 0.43747091 1.69120526 -0.99998998 +v 0.43747091 1.74999272 -0.99998998 +v 0.29552364 0.25000762 0.99998998 +v 0.29552364 0.11340904 0.95445698 +v 0.43747091 0.25000762 0.99998998 +v 0.43747091 0.11340904 0.95445704 +v 0.29552364 0.50000524 0.99998998 +v 0.29552364 0.46008801 0.99998998 +v 0.43747091 0.46008801 0.99998998 +v 0.43747091 0.50000524 0.99998998 +v 0.29552364 1.24999797 0.99998998 +v 0.29552364 1.1998502 0.99998998 +v 0.43747091 1.1998502 0.99998998 +v 0.43747091 1.24999797 0.99998998 +v 0.29552364 1.49999535 0.99998998 +v 0.29552364 1.43187904 0.99998998 +v 0.43747091 1.43187904 0.99998998 +v 0.43747091 1.49999535 0.99998998 +v 0.29552364 0.50000524 -0.99998998 +v 0.29552364 0.46008801 -0.99998998 +v 0.43747091 0.46008801 -0.99998998 +v 0.43747091 0.50000524 -0.99998998 +v 0.29552364 1.00000035 -0.99998998 +v 0.29552364 0.92687511 -0.99998998 +v 0.43747091 0.92687511 -0.99998998 +v 0.43747091 1.00000035 -0.99998998 +v 0.29552364 0.75000286 0.99998998 +v 0.29552364 0.70030546 0.99998998 +v 0.43747091 0.70030546 0.99998998 +v 0.43747091 0.75000286 0.99998998 +v 0.29552364 1.00000035 0.99998998 +v 0.29552364 0.92687511 0.99998998 +v 0.43747091 0.92687511 0.99998998 +v 0.43747091 1.00000035 0.99998998 +v 0.29552364 1.74999272 0.99998998 +v 0.29552364 1.69120526 0.99998998 +v 0.43747091 1.69120526 0.99998998 +v 0.43747091 1.74999272 0.99998998 +v 0.29552364 1.88228774 0.95589166 +v 0.43747091 1.88228774 0.95589166 +v 0.29552364 1.49999535 -0.99998998 +v 0.29552364 1.43187904 -0.99998998 +v 0.43747091 1.43187904 -0.99998998 +v 0.43747091 1.49999535 -0.99998998 +v 0.29552364 1.88228774 -0.95589166 +v 0.43747091 1.88228774 -0.95589166 +v 0.29552364 1.56563675 -0.99998998 +v 0.43747091 1.56563675 -0.99998998 +v 0.29552364 1.56563675 0.99998998 +v 0.43747091 1.56563675 0.99998998 +v 0.29552364 1.31449973 0.99998998 +v 0.43747091 1.31449973 0.99998998 +v 0.29552364 1.31449973 -0.99998998 +v 0.43747091 1.31449973 -0.99998998 +v 0.29552364 1.07974124 -0.99998998 +v 0.43747091 1.07974124 -0.99998998 +v 0.29552364 1.07974124 0.99998998 +v 0.43747091 1.07974124 0.99998998 +v 0.29552364 0.80403602 -0.99998998 +v 0.43747091 0.80403602 -0.99998998 +v 0.29552364 0.80403602 0.99998998 +v 0.43747091 0.80403602 0.99998998 +v 0.29552364 0.56381821 -0.99998998 +v 0.43747091 0.56381821 -0.99998998 +v 0.29552364 0.56381821 0.99998998 +v 0.43747091 0.56381821 0.99998998 +v 0.29552364 0.32087039 0.99998998 +v 0.43747091 0.32087039 0.99998998 +v 0.29552364 0.32087039 -0.99998998 +v 0.43747091 0.32087039 -0.99998998 +v 0.56849885 0.25000762 0.99998998 +v 0.56849885 0.13524699 0.96173644 +v 0.68041873 0.25000762 0.99998998 +v 0.68041873 0.13524699 0.96173644 +v 0.56849885 0.75000286 0.99998998 +v 0.56849885 0.70030546 0.99998998 +v 0.68041873 0.70030546 0.99998998 +v 0.68041873 0.75000286 0.99998998 +v 0.56849885 1.24999797 0.99998998 +v 0.56849885 1.1998502 0.99998998 +v 0.68041873 1.1998502 0.99998998 +v 0.68041873 1.24999797 0.99998998 +v 0.56849885 1.74999272 0.99998998 +v 0.56849885 1.69120526 0.99998998 +v 0.68041873 1.69120526 0.99998998 +v 0.68041873 1.74999272 0.99998998 +v 0.56849885 0.25000762 -0.99998998 +v 0.56849885 0.13524699 -0.96173638 +v 0.68041873 0.25000762 -0.99998998 +v 0.68041873 0.13524699 -0.96173638 +v 0.56849885 0.50000524 -0.99998998 +v 0.56849885 0.46008801 -0.99998998 +v 0.68041873 0.46008801 -0.99998998 +v 0.68041873 0.50000524 -0.99998998 +v 0.56849885 1.24999797 -0.99998998 +v 0.56849885 1.1998502 -0.99998998 +v 0.68041873 1.1998502 -0.99998998 +v 0.68041873 1.24999797 -0.99998998 +v 0.56849885 1.49999535 -0.99998998 +v 0.56849885 1.43187904 -0.99998998 +v 0.68041873 1.43187904 -0.99998998 +v 0.68041873 1.49999535 -0.99998998 +v 0.56849885 0.75000286 -0.99998998 +v 0.56849885 0.70030546 -0.99998998 +v 0.68041873 0.70030546 -0.99998998 +v 0.68041873 0.75000286 -0.99998998 +v 0.56849885 1.00000035 -0.99998998 +v 0.56849885 0.92687511 -0.99998998 +v 0.68041873 0.92687511 -0.99998998 +v 0.68041873 1.00000035 -0.99998998 +v 0.56849885 0.50000524 0.99998998 +v 0.56849885 0.46008801 0.99998998 +v 0.68041873 0.46008801 0.99998998 +v 0.68041873 0.50000524 0.99998998 +v 0.56849885 1.00000035 0.99998998 +v 0.56849885 0.92687511 0.99998998 +v 0.68041873 0.92687511 0.99998998 +v 0.68041873 1.00000035 0.99998998 +v 0.56849885 1.49999535 0.99998998 +v 0.56849885 1.43187904 0.99998998 +v 0.68041873 1.43187904 0.99998998 +v 0.68041873 1.49999535 0.99998998 +v 0.56849885 1.87136864 0.9595313 +v 0.68041873 1.87136864 0.9595313 +v 0.56849885 1.74999272 -0.99998998 +v 0.56849885 1.69120526 -0.99998998 +v 0.68041873 1.69120526 -0.99998998 +v 0.68041873 1.74999272 -0.99998998 +v 0.56849885 1.87136864 -0.95953142 +v 0.68041873 1.87136864 -0.95953142 +v 0.56849885 1.56563675 0.99998998 +v 0.68041873 1.56563675 0.99998998 +v 0.56849885 1.56563675 -0.99998998 +v 0.68041873 1.56563675 -0.99998998 +v 0.56849885 1.31449973 -0.99998998 +v 0.68041873 1.31449973 -0.99998998 +v 0.56849885 1.31449973 0.99998998 +v 0.68041873 1.31449973 0.99998998 +v 0.56849885 1.07974124 0.99998998 +v 0.68041873 1.07974124 0.99998998 +v 0.56849885 1.07974124 -0.99998998 +v 0.68041873 1.07974124 -0.99998998 +v 0.56849885 0.80403602 -0.99998998 +v 0.68041873 0.80403602 -0.99998998 +v 0.56849885 0.80403602 0.99998998 +v 0.68041873 0.80403602 0.99998998 +v 0.56849885 0.56381821 0.99998998 +v 0.68041873 0.56381821 0.99998998 +v 0.56849885 0.56381821 -0.99998998 +v 0.68041873 0.56381821 -0.99998998 +v 0.56849885 0.32087039 -0.99998998 +v 0.68041873 0.32087039 -0.99998998 +v 0.56849885 0.32087039 0.99998998 +v 0.68041873 0.32087039 0.99998998 +v 0.24999713 1.63831281 0.99998986 +v 0.16449546 1.63831281 0.99998986 +v -0.24999785 1.63831281 0.99998986 +v -0.32139992 1.63831281 0.99998986 +v -0.24999785 1.63831281 -0.99998986 +v -0.19310188 1.63831281 -0.99998986 +v 0.24999713 1.63831281 -0.99998986 +v 0.29552316 1.63831281 -0.99998986 +v 0.4999938 1.63831281 0.99998986 +v 0.43747067 1.63831281 0.99998986 +v 0 1.63831281 0.99998986 +v -0.06753301 1.63831281 0.99998986 +v -0.49999547 1.63831281 0.99998986 +v -0.55342912 1.63831281 0.99998986 +v -0.49999547 1.63831281 -0.99998986 +v -0.4442389 1.63831281 -0.99998986 +v 0 1.63831281 -0.99998986 +v 0.06895399 1.63831281 -0.99998986 +v 0.4999938 1.63831281 -0.99998986 +v 0.56849885 1.63831281 -0.99998986 +v 0.4999938 1.35376107 0.99998986 +v 0.43747067 1.35376107 0.99998986 +v 0.24999713 1.35376107 0.99998986 +v 0.16449546 1.35376107 0.99998986 +v -0.49999547 1.35376107 0.99998986 +v -0.55342912 1.35376107 0.99998986 +v -0.49999547 1.35376107 -0.99998986 +v -0.4442389 1.35376107 -0.99998986 +v -0.24999785 1.35376107 -0.99998986 +v -0.19310188 1.35376107 -0.99998986 +v 0.4999938 1.35376107 -0.99998986 +v 0.56849885 1.35376107 -0.99998986 +v 0 1.35376107 0.99998986 +v -0.06753301 1.35376107 0.99998986 +v -0.24999785 1.35376107 0.99998986 +v -0.32139992 1.35376107 0.99998986 +v 0 1.35376107 -0.99998986 +v 0.06895399 1.35376107 -0.99998986 +v 0.24999713 1.35376107 -0.99998986 +v 0.29552316 1.35376107 -0.99998986 +v -0.64507341 1.43187904 0.99998986 +v -0.64507341 1.49999547 0.99998986 +v -0.64507341 1.43187904 -0.99998986 +v -0.64507341 1.49999547 -0.99998986 +v -0.64507341 1.56563687 -0.99998986 +v -0.64507341 1.63831281 -0.99998998 +v -0.55342912 1.63831281 -0.99998986 +v -0.64507341 1.56563687 0.99998986 +v -0.64507341 1.63831281 0.99998998 +v -0.64507341 1.35376107 0.99998998 +v -0.64507341 1.35376107 -0.99998998 +v -0.55342912 1.35376107 -0.99998986 +v -0.4442389 1.63831281 0.99998986 +v -0.32139992 1.63831281 -0.99998986 +v -0.32139992 1.35376107 -0.99998986 +v -0.4442389 1.35376107 0.99998986 +v -0.06753301 1.63831281 -0.99998986 +v -0.19310188 1.63831281 0.99998986 +v -0.06753301 1.35376107 -0.99998986 +v -0.19310188 1.35376107 0.99998986 +v 0.06895399 1.63831281 0.99998986 +v 0.16449546 1.63831281 -0.99998986 +v 0.06895399 1.35376107 0.99998986 +v 0.16449546 1.35376107 -0.99998986 +v 0.43747067 1.63831281 -0.99998986 +v 0.29552316 1.63831281 0.99998986 +v 0.29552316 1.35376107 0.99998986 +v 0.43747067 1.35376107 -0.99998986 +v 0.64614749 1.43187904 -0.99998986 +v 0.64614749 1.49999547 -0.99998986 +v 0.64614749 1.43187904 0.99998986 +v 0.64614749 1.49999547 0.99998986 +v 0.64614749 1.56563687 0.99998986 +v 0.56849885 1.63831281 0.99998986 +v 0.64614749 1.63831281 0.99998998 +v 0.64614749 1.56563687 -0.99998986 +v 0.64614749 1.63831281 -0.99998998 +v 0.64614749 1.35376107 -0.99998998 +v 0.56849885 1.35376107 0.99998986 +v 0.64614749 1.35376107 0.99998998 +v -0.24999785 0.63969707 0.99998986 +v -0.32139992 0.63969707 0.99998986 +v 0.24999713 0.63969707 -0.99998986 +v 0.29552316 0.63969707 -0.99998986 +v 0.24999713 0.63969707 0.99998986 +v 0.16449546 0.63969707 0.99998986 +v -0.24999785 0.63969707 -0.99998986 +v -0.19310188 0.63969707 -0.99998986 +v 0 0.63969707 0.99998986 +v -0.06753301 0.63969707 0.99998986 +v -0.49999547 0.63969707 0.99998986 +v -0.55342912 0.63969707 0.99998986 +v 0 0.63969707 -0.99998986 +v 0.06895399 0.63969707 -0.99998986 +v 0.4999938 0.63969707 -0.99998986 +v 0.56849885 0.63969707 -0.99998986 +v 0.4999938 0.63969707 0.99998986 +v 0.43747067 0.63969707 0.99998986 +v -0.49999547 0.63969707 -0.99998986 +v -0.4442389 0.63969707 -0.99998986 +v -0.49999547 0.35514545 0.99998986 +v -0.55342912 0.35514545 0.99998986 +v 0.4999938 0.35514545 -0.99998986 +v 0.56849885 0.35514545 -0.99998986 +v 0.4999938 0.35514545 0.99998986 +v 0.43747067 0.35514545 0.99998986 +v 0.24999713 0.35514545 0.99998986 +v 0.16449546 0.35514545 0.99998986 +v -0.49999547 0.35514545 -0.99998986 +v -0.4442389 0.35514545 -0.99998986 +v -0.24999785 0.35514545 -0.99998986 +v -0.19310188 0.35514545 -0.99998986 +v 0 0.35514545 0.99998986 +v -0.06753301 0.35514545 0.99998986 +v -0.24999785 0.35514545 0.99998986 +v -0.32139992 0.35514545 0.99998986 +v 0 0.35514545 -0.99998986 +v 0.06895399 0.35514545 -0.99998986 +v 0.24999713 0.35514545 -0.99998986 +v 0.29552316 0.35514545 -0.99998986 +v -0.63433551 0.46008801 0.99998986 +v -0.63433551 0.50000524 0.99998986 +v -0.63433551 0.46008801 -0.99998986 +v -0.63433551 0.50000524 -0.99998986 +v -0.63433551 0.56381821 -0.99998986 +v -0.63433551 0.63969707 -0.9999901 +v -0.55342912 0.63969707 -0.99998986 +v -0.63433551 0.56381821 0.99998986 +v -0.63433551 0.63969707 0.9999901 +v -0.63433551 0.35514545 0.99998998 +v -0.63433551 0.35514545 -0.99998998 +v -0.55342912 0.35514545 -0.99998986 +v -0.4442389 0.63969707 0.99998986 +v -0.32139992 0.63969707 -0.99998986 +v -0.32139992 0.35514545 -0.99998986 +v -0.4442389 0.35514545 0.99998986 +v -0.06753301 0.63969707 -0.99998986 +v -0.19310188 0.63969707 0.99998986 +v -0.06753301 0.35514545 -0.99998986 +v -0.19310188 0.35514545 0.99998986 +v 0.06895399 0.63969707 0.99998986 +v 0.16449546 0.63969707 -0.99998986 +v 0.06895399 0.35514545 0.99998986 +v 0.16449546 0.35514545 -0.99998986 +v 0.43747067 0.63969707 -0.99998986 +v 0.29552316 0.63969707 0.99998986 +v 0.29552316 0.35514545 0.99998986 +v 0.43747067 0.35514545 -0.99998986 +v 0.64346289 0.46008801 -0.99998986 +v 0.64346289 0.50000524 -0.99998986 +v 0.64346289 0.46008801 0.99998986 +v 0.64346289 0.50000524 0.99998986 +v 0.64346289 0.56381821 0.99998986 +v 0.56849885 0.63969707 0.99998986 +v 0.64346289 0.63969707 0.9999901 +v 0.64346289 0.56381821 -0.99998986 +v 0.64346289 0.63969707 -0.9999901 +v 0.64346289 0.35514545 -0.99998998 +v 0.56849885 0.35514545 0.99998986 +v 0.64346289 0.35514545 0.99998998 +v -0.55342912 0.61016821 0.99998986 +v -0.4999957 0.61016821 0.99998986 +v -0.4442389 0.61016821 -0.99998986 +v -0.4999957 0.61016821 -0.99998986 +v -0.6021223 0.46008801 0.99998986 +v -0.6021223 0.50000524 0.99998986 +v -0.55342912 0.61016821 -0.99998986 +v -0.6021223 0.56381821 0.99998986 +v -0.35246825 0.46008801 -0.99998986 +v -0.35246825 0.50000524 -0.99998986 +v -0.35246825 0.46008801 0.99998986 +v -0.35246825 0.50000524 0.99998986 +v -0.35246825 0.56381821 0.99998986 +v -0.4442389 0.61016821 0.99998986 +v -0.35246825 0.61016821 0.99998998 +v -0.35246825 0.56381821 -0.99998986 +v -0.35246825 0.61016821 -0.99998986 +v -0.55342912 0.39272761 0.99998986 +v -0.4999957 0.39272761 0.99998986 +v -0.4442389 0.39272761 -0.99998986 +v -0.4999957 0.39272761 -0.99998986 +v -0.6021223 0.46008801 -0.99998986 +v -0.6021223 0.50000524 -0.99998986 +v -0.6021223 0.56381821 -0.99998986 +v -0.6021223 0.61016821 -0.99998986 +v -0.6021223 0.61016821 0.9999901 +v -0.6021223 0.39272761 0.99998986 +v -0.6021223 0.39272761 -0.99998998 +v -0.55342912 0.39272761 -0.99998986 +v -0.35246825 0.39272761 -0.99998986 +v -0.4442389 0.39272761 0.99998986 +v -0.35246825 0.39272761 0.99998992 +v 0.51997828 0.46008777 -0.99998986 +v 0.51997828 0.500005 -0.99998986 +v 0.19515967 0.46008801 0.99998986 +v 0.19515967 0.50000524 0.99998986 +v 0.29552269 0.61822152 -0.99998986 +v 0.2499969 0.61822152 -0.99998986 +v 0.19515967 0.56381821 0.99998986 +v 0.19515967 0.61822152 0.99998992 +v 0.2499969 0.61822152 0.99998986 +v 0.51997828 0.56381821 -0.99998986 +v 0.51997828 0.61822152 -0.99998986 +v 0.49999356 0.61822152 -0.99998986 +v 0.43747067 0.61822152 0.99998986 +v 0.49999356 0.61822152 0.99998986 +v 0.19515967 0.46008801 -0.99998986 +v 0.19515967 0.50000524 -0.99998986 +v 0.19515967 0.56381821 -0.99998986 +v 0.19515967 0.61822152 -0.99998986 +v 0.43747067 0.61822152 -0.99998986 +v 0.29552269 0.61822152 0.99998986 +v 0.51997828 0.46008777 0.99998986 +v 0.51997828 0.500005 0.99998986 +v 0.51997828 0.56381821 0.99998986 +v 0.51997828 0.61822152 0.99998986 +v 0.4999938 0.39809656 -0.99998986 +v 0.51997828 0.39809656 -0.99998974 +v 0.43747067 0.39809656 0.99998986 +v 0.4999938 0.39809656 0.99998986 +v 0.19515967 0.39809656 0.99998986 +v 0.2499969 0.39809656 0.99998986 +v 0.29552316 0.39809656 -0.99998986 +v 0.2499969 0.39809656 -0.99998986 +v 0.19515967 0.39809656 -0.99998986 +v 0.29552316 0.39809656 0.99998986 +v 0.43747067 0.39809656 -0.99998986 +v 0.51997828 0.39809656 0.99998998 +v 0.21663522 1.43187904 0.99998986 +v 0.21663522 1.49999547 0.99998986 +v 0.54145383 1.43187904 -0.99998986 +v 0.54145383 1.49999547 -0.99998986 +v 0.21663522 1.56563663 0.99998986 +v 0.21663522 1.62220609 0.99998986 +v 0.2499969 1.62220609 0.99998986 +v 0.29552269 1.62220609 -0.99998986 +v 0.2499969 1.62220609 -0.99998986 +v 0.43747067 1.62220609 0.99998986 +v 0.49999356 1.62220609 0.99998986 +v 0.54145383 1.56563663 -0.99998986 +v 0.54145383 1.62220609 -0.99998992 +v 0.49999356 1.62220609 -0.99998986 +v 0.21663522 1.43187904 -0.99998986 +v 0.21663522 1.49999547 -0.99998986 +v 0.21663522 1.56563663 -0.99998986 +v 0.21663522 1.62220609 -0.99998986 +v 0.43747067 1.62220609 -0.99998986 +v 0.29552269 1.62220609 0.99998986 +v 0.54145383 1.43187904 0.99998986 +v 0.54145383 1.49999547 0.99998986 +v 0.54145383 1.56563663 0.99998986 +v 0.54145383 1.62220609 0.99998986 +v 0.43747067 1.37255215 0.99998986 +v 0.49999356 1.37255215 0.99998986 +v 0.21663522 1.37255215 0.99998986 +v 0.2499969 1.37255215 0.99998986 +v 0.49999356 1.37255215 -0.99998986 +v 0.54145383 1.37255215 -0.99998986 +v 0.29552269 1.37255215 -0.99998986 +v 0.2499969 1.37255215 -0.99998986 +v 0.21663522 1.37255215 -0.99998986 +v 0.29552269 1.37255215 0.99998986 +v 0.43747067 1.37255215 -0.99998986 +v 0.54145383 1.37255215 0.99998992 +v -0.55342912 1.61415278 0.99998986 +v -0.4999957 1.61415278 0.99998986 +v -0.4442389 1.61415278 -0.99998986 +v -0.4999957 1.61415278 -0.99998986 +v -0.62359786 1.43187904 0.99998986 +v -0.62359786 1.49999547 0.99998986 +v -0.55342912 1.61415278 -0.99998986 +v -0.62359786 1.56563687 0.99998986 +v -0.36320614 1.43187904 -0.99998986 +v -0.36320614 1.49999547 -0.99998986 +v -0.36320614 1.43187904 0.99998986 +v -0.36320614 1.49999547 0.99998986 +v -0.36320614 1.56563687 0.99998986 +v -0.4442389 1.61415278 0.99998986 +v -0.36320614 1.61415278 0.99998986 +v -0.36320614 1.56563687 -0.99998986 +v -0.36320614 1.61415278 -0.99998986 +v -0.55342912 1.3859744 0.99998986 +v -0.4999957 1.3859744 0.99998986 +v -0.4442389 1.3859744 -0.99998986 +v -0.4999957 1.3859744 -0.99998986 +v -0.62359786 1.43187904 -0.99998986 +v -0.62359786 1.49999547 -0.99998986 +v -0.62359786 1.56563687 -0.99998986 +v -0.62359786 1.61415278 -0.99998998 +v -0.62359786 1.61415278 0.99998992 +v -0.62359786 1.3859744 0.99998998 +v -0.62359786 1.3859744 -0.99998986 +v -0.55342912 1.3859744 -0.99998986 +v -0.36320614 1.3859744 -0.99998986 +v -0.4442389 1.3859744 0.99998986 +v -0.36320614 1.3859744 0.99998992 +v -0.55342912 1.33650267 0.99998986 +v -0.49999535 1.33650267 0.99998986 +v -0.44423878 1.33650267 -0.99998986 +v -0.49999535 1.33650267 -0.99998986 +v -0.60378789 1.43187916 0.99998974 +v -0.60378789 1.49999535 0.99998974 +v -0.60378789 1.63831281 -0.99998986 +v -0.60378789 1.67351675 -0.9999901 +v -0.55342912 1.67351675 -0.99998986 +v -0.60378789 1.56563687 0.99998974 +v -0.60378789 1.63831281 0.99998986 +v -0.60378789 1.67351675 0.99998998 +v -0.55342912 1.67351675 0.99998986 +v -0.60378789 1.35376095 0.99998986 +v -0.60378789 1.33650267 0.99998986 +v -0.60378789 1.35376095 -0.99998986 +v -0.60378789 1.33650267 -0.99998998 +v -0.55342912 1.33650267 -0.99998986 +v -0.38292002 1.43187916 -0.99998974 +v -0.38292002 1.49999558 -0.99998974 +v -0.38292002 1.63831281 0.99998974 +v -0.38292002 1.6141529 0.99998974 +v -0.38292002 1.56563687 -0.99998974 +v -0.38292002 1.63831281 -0.99998974 +v -0.38292002 1.6141529 -0.99998974 +v -0.38292002 1.33650267 -0.99998986 +v -0.38292002 1.35376095 -0.99998974 +v -0.44423878 1.33650267 0.99998986 +v -0.38292002 1.33650267 0.99998998 +v -0.38292002 1.35376095 0.99998974 +v -0.49999535 1.67351675 0.99998986 +v -0.44423878 1.67351675 -0.99998986 +v -0.49999535 1.67351675 -0.99998986 +v -0.60378789 1.6141529 -0.99998986 +v -0.60378789 1.6141529 0.99998974 +v -0.60378789 1.38597464 0.99998986 +v -0.60378789 1.38597464 -0.99998974 +v -0.44423878 1.67351675 0.99998986 +v -0.38292002 1.67351675 0.99998998 +v -0.38292002 1.67351675 -0.99998998 +v -0.38292002 1.43187916 0.99998974 +v -0.38292002 1.49999558 0.99998974 +v -0.38292002 1.56563687 0.99998974 +v -0.60378789 1.43187916 -0.99998974 +v -0.60378789 1.49999535 -0.99998974 +v -0.60378789 1.56563687 -0.99998974 +v -0.38292002 1.38597464 -0.99998974 +v -0.38292002 1.38597464 0.99998974 +v -0.55342888 0.14457726 -0.96484643 +v -0.49999511 0.14457726 -0.96484661 +v -0.68756544 0.25000762 -0.99998986 +v -0.68756544 0.14457726 -0.96484661 +v -0.68756544 0.70030546 -0.99998986 +v -0.68756544 0.75000286 -0.99998986 +v -0.68756544 1.19985032 -0.99998986 +v -0.68756544 1.24999797 -0.99998986 +v -0.68756544 1.69120538 -0.99998986 +v -0.68756544 1.74999284 -0.99998986 +v -0.68756544 0.25000762 0.99998986 +v -0.68756544 0.14457726 0.96484655 +v -0.55342888 0.14457726 0.96484643 +v -0.49999511 0.14457726 0.96484661 +v -0.68756544 1.19985032 0.99998986 +v -0.68756544 1.24999797 0.99998986 +v -0.68756544 0.70030546 0.99998986 +v -0.68756544 0.75000286 0.99998986 +v -0.68756544 0.92687499 0.99998986 +v -0.68756544 1.00000047 0.99998986 +v -0.68756544 1.69120538 0.99998986 +v -0.68756544 1.74999284 0.99998986 +v -0.49999511 1.86392009 0.96201396 +v -0.55342888 1.86392009 0.96201413 +v -0.68756544 1.86392009 0.96201425 +v -0.68756544 0.46008813 -0.99998986 +v -0.68756544 0.50000536 -0.99998986 +v -0.68756544 0.92687499 -0.99998986 +v -0.68756544 1.00000047 -0.99998986 +v -0.68756544 1.43187916 -0.99998986 +v -0.68756544 1.49999535 -0.99998986 +v -0.68756544 1.86392009 -0.96201425 +v -0.55342888 1.86392009 -0.96201413 +v -0.49999511 1.86392009 -0.96201396 +v -0.68756544 1.56563687 -0.99998986 +v -0.68756544 1.68797349 -0.99998986 +v -0.68756544 1.68797349 0.99998986 +v -0.68756544 1.31449985 0.99998986 +v -0.68756544 1.31852006 0.99998986 +v -0.68756544 1.31449985 -0.99998986 +v -0.68756544 1.31852006 -0.99998986 +v -0.68756544 1.07974112 -0.99998986 +v -0.68756544 1.07974112 0.99998986 +v -0.68756544 0.80403614 0.99998986 +v -0.68756544 0.80403614 -0.99998986 +v -0.68756544 0.56381821 -0.99998986 +v -0.68756544 0.68453061 -0.99998986 +v -0.68756544 0.68453061 0.99998986 +v -0.68756544 0.32087051 0.99998986 +v -0.68756544 0.32979154 0.99998986 +v -0.68756544 0.32087051 -0.99998986 +v -0.68756544 0.32979154 -0.99998986 +v -0.44423866 0.14457726 0.96484643 +v -0.34103119 0.14457726 0.96484649 +v -0.34103119 0.25000762 0.99998986 +v -0.34103119 0.70030546 0.99998986 +v -0.34103119 0.75000286 0.99998986 +v -0.34103119 1.19985032 0.99998986 +v -0.34103119 1.24999797 0.99998986 +v -0.34103119 1.69120538 0.99998986 +v -0.34103119 1.74999284 0.99998986 +v -0.44423866 0.14457726 -0.97134983 +v -0.34103119 0.14457726 -0.96723723 +v -0.34103119 0.25000762 -0.99998986 +v -0.34103119 1.19985032 -0.99998986 +v -0.34103119 1.24999797 -0.99998986 +v -0.34103119 0.46008813 0.99998974 +v -0.34103119 0.50000536 0.99998974 +v -0.34103119 0.92687499 0.99998986 +v -0.34103119 1.00000047 0.99998986 +v -0.34103119 1.43187916 0.99998986 +v -0.34103119 1.49999535 0.99998986 +v -0.44423866 1.86392009 0.96201396 +v -0.34103119 1.86392009 0.96201425 +v -0.34103119 0.70030546 -0.99998986 +v -0.34103119 0.75000286 -0.99998986 +v -0.34103119 0.92687499 -0.99998986 +v -0.34103119 1.00000047 -0.99998986 +v -0.34103119 1.69120538 -0.99998986 +v -0.34103119 1.74999284 -0.99998986 +v -0.34103119 1.86392009 -0.96201413 +v -0.44423866 1.86392009 -0.96201413 +v -0.34103119 1.56563687 0.99998986 +v -0.34103119 1.31449985 -0.99998986 +v -0.34103119 1.35376095 -0.99998974 +v -0.34103119 1.32152116 -0.99998986 +v -0.34103119 1.31449985 0.99998986 +v -0.34103119 1.35376095 0.99998974 +v -0.34103119 1.32152116 0.99998986 +v -0.34103119 1.07974112 0.99998986 +v -0.34103119 1.07974112 -0.99998986 +v -0.34103119 0.80403614 0.99998986 +v -0.34103119 0.80403614 -0.99998986 +v -0.34103119 0.56381821 0.99998974 +v -0.34103119 0.63969719 0.99998974 +v -0.34103119 0.62103843 0.99998986 +v -0.34103119 0.63969719 -0.99998974 +v -0.34103119 0.62103843 -0.99998974 +v -0.34103119 0.32087051 -0.99998986 +v -0.34103119 0.35514557 -0.99998974 +v -0.34103119 0.32087051 0.99998986 +v -0.34103119 0.35514557 0.99998974 +v -0.68756544 1.43187916 0.99998986 +v -0.68756544 1.49999535 0.99998986 +v -0.68756544 1.67502403 -0.99998986 +v -0.68756544 1.56563687 0.99998986 +v -0.68756544 1.67502403 0.99998986 +v -0.68756544 1.3265109 0.99998986 +v -0.68756544 1.3265109 -0.99998986 +v -0.34103119 1.68556082 0.99998986 +v -0.34103119 1.68556082 -0.99998986 +v -0.34103119 1.43187916 -0.99998986 +v -0.34103119 1.36888778 -0.99998974 +v -0.34103119 1.36888778 0.99998974 +v -0.68756544 0.46008813 0.99998986 +v -0.68756544 0.50000536 0.99998986 +v -0.68756544 0.56381821 0.99998986 +v -0.34103119 0.46008813 -0.99998974 +v -0.34103119 0.37889289 -0.99998974 +v -0.34103119 0.37889289 0.99998974 +v -0.34103119 0.50000536 -0.99998974 +v -0.34103119 0.56381821 -0.99998974 +v -0.34103119 1.49999535 -0.99998986 +v -0.34103119 1.62696778 0.99998974 +v -0.34103119 1.56563687 -0.99998986 +v -0.34103119 1.62696778 -0.99998974 +v -0.34103119 1.63831281 0.99998974 +v -0.34103119 1.63831281 -0.99998974 +v -0.67042911 1.19985032 0.99998974 +v -0.67042911 1.24999797 0.99998974 +v -0.67042911 0.70030546 0.99998974 +v -0.67042911 0.75000286 0.99998974 +v -0.67042911 0.92687499 0.99998974 +v -0.67042911 1.00000047 0.99998974 +v -0.67042911 1.69120538 0.99998974 +v -0.67042911 1.74999284 0.99998974 +v -0.55342888 1.84868788 0.9670915 +v -0.49999511 1.84868788 0.96709126 +v -0.49999523 1.84868788 -0.96709126 +v -0.55342888 1.84868788 -0.9670915 +v -0.67042911 1.69120538 -0.99998974 +v -0.67042911 1.68501651 -0.99998974 +v -0.67042911 1.68501651 0.99998974 +v -0.67042911 1.31449985 0.99998974 +v -0.67042911 1.32219839 0.99998974 +v -0.67042911 1.32219839 -0.99998974 +v -0.67042911 1.31449985 -0.99998974 +v -0.67042911 1.07974112 0.99998974 +v -0.67042911 0.80403614 0.99998974 +v -0.67042911 0.70030546 -0.99998974 +v -0.67042911 0.67009758 -0.99998986 +v -0.67042911 0.67009758 0.99998986 +v -0.67042911 0.25000762 0.99998974 +v -0.67042911 0.32087051 0.99998974 +v -0.67042911 0.33795368 0.99998974 +v -0.67042911 0.33795368 -0.99998974 +v -0.67042911 0.32087051 -0.99998974 +v -0.44423866 0.17123389 0.97373175 +v -0.49999511 0.17123389 0.97373193 +v -0.49999511 0.17123389 -0.97373193 +v -0.44423866 0.17123389 -0.9785909 +v -0.35245537 1.19985032 -0.99998974 +v -0.35245537 1.24999797 -0.99998974 +v -0.44423866 1.84868788 0.96709126 +v -0.35245537 0.70030546 -0.99998974 +v -0.35245537 0.75000286 -0.99998974 +v -0.35245537 0.92687499 -0.99998974 +v -0.35245537 1.00000047 -0.99998974 +v -0.35245537 1.69120538 -0.99998974 +v -0.35245537 1.74999284 -0.99998974 +v -0.44423866 1.84868788 -0.9670915 +v -0.35245537 1.31449985 -0.99998974 +v -0.35245537 1.07974112 -0.99998974 +v -0.35245537 0.80403614 -0.99998974 +v -0.35245537 0.63969719 0.99998974 +v -0.35245537 0.61018049 0.99998986 +v -0.35245537 0.61018049 -0.99998974 +v -0.35245537 0.63969719 -0.99998974 +v -0.35245537 0.25000762 -0.99998974 +v -0.35245537 0.32087051 -0.99998974 +v -0.35245537 0.35514557 0.99998974 +v -0.35245537 0.32087051 0.99998974 +v -0.67042911 1.43187916 0.99998974 +v -0.67042911 1.49999535 0.99998974 +v -0.67042911 1.56563687 0.99998974 +v -0.35245537 1.69120538 0.99998974 +v -0.35245537 1.68227601 0.99998974 +v -0.35245537 1.68227601 -0.99998974 +v -0.67042911 0.46008813 0.99998974 +v -0.67042911 0.50000548 0.99998974 +v -0.67042911 0.56381821 0.99998974 +v -0.35245537 0.70030546 0.99998974 +v -0.35245537 0.46008813 -0.99998974 +v -0.35245537 0.50000536 -0.99998974 +v -0.35245537 0.56381821 -0.99998974 +v -0.35245537 0.35514557 -0.99998974 +v -0.35245537 0.39271223 -0.99998974 +v -0.35245537 0.39271223 0.99998974 +v -0.35245537 1.43187916 -0.99998974 +v -0.35245537 1.49999535 -0.99998974 +v -0.35245537 1.56563687 -0.99998974 +v -0.67042911 1.66021919 -0.99998974 +v -0.67042911 1.66021919 0.99998974 +v -0.67042911 1.33750033 0.99998974 +v -0.67042911 1.33750033 -0.99998974 +v -0.35245537 1.63831281 0.99998974 +v -0.35245537 1.62036585 0.99998974 +v -0.35245537 1.62036585 -0.99998974 +v -0.35245537 1.63831281 -0.99998974 +v -0.35245537 1.3256073 -0.99998974 +v -0.35245537 1.3256073 0.99998974 +v -0.35245537 1.31449985 0.99998974 +v -0.35245537 1.35376095 -0.99998974 +v -0.35245537 1.37769079 -0.99998974 +v -0.35245537 1.37769079 0.99998974 +v -0.35245537 1.35376095 0.99998974 +v -0.55342888 0.17123389 -0.97373175 +v -0.67042911 0.25000762 -0.99998974 +v -0.67042911 0.17123389 -0.97373205 +v -0.67042911 0.75000286 -0.99998974 +v -0.67042911 1.19985032 -0.99998974 +v -0.67042911 1.24999797 -0.99998974 +v -0.67042911 1.74999284 -0.99998974 +v -0.67042911 0.17123389 0.97373205 +v -0.55342888 0.17123389 0.97373175 +v -0.67042911 1.84868788 0.96709168 +v -0.67042911 0.46008813 -0.99998974 +v -0.67042911 0.50000548 -0.99998974 +v -0.67042911 0.92687499 -0.99998974 +v -0.67042911 1.00000047 -0.99998974 +v -0.67042911 1.43187916 -0.99998974 +v -0.67042911 1.49999535 -0.99998974 +v -0.67042911 1.84868788 -0.96709173 +v -0.67042911 1.56563687 -0.99998974 +v -0.67042911 1.07974112 -0.99998974 +v -0.67042911 0.80403614 -0.99998974 +v -0.67042911 0.56381821 -0.99998974 +v -0.35245537 0.17123389 0.97373199 +v -0.35245537 0.25000762 0.99998974 +v -0.35245537 0.75000286 0.99998974 +v -0.35245537 1.19985032 0.99998974 +v -0.35245537 1.24999797 0.99998974 +v -0.35245537 1.74999284 0.99998974 +v -0.35245537 0.17123389 -0.97551822 +v -0.35245537 0.46008813 0.99998974 +v -0.35245537 0.50000536 0.99998974 +v -0.35245537 0.92687499 0.99998974 +v -0.35245537 1.00000047 0.99998974 +v -0.35245537 1.43187916 0.99998974 +v -0.35245537 1.49999535 0.99998974 +v -0.35245537 1.84868788 0.96709179 +v -0.35245537 1.84868788 -0.96709156 +v -0.35245537 1.56563687 0.99998974 +v -0.35245537 1.07974112 0.99998974 +v -0.35245537 0.80403614 0.99998974 +v -0.35245537 0.56381821 0.99998974 +v -0.58093953 0.46008813 0.99998986 +v -0.58093953 0.50000536 0.99998986 +v -0.64758074 1.19985032 0.99998974 +v -0.64758074 1.24999797 0.99998974 +v -0.58093953 1.19985032 0.99998974 +v -0.58093953 1.24999797 0.99998974 +v -0.58093953 1.43187916 0.99998974 +v -0.58093953 1.49999535 0.99998974 +v -0.64758074 0.70030546 0.99998974 +v -0.64758074 0.75000286 0.99998974 +v -0.58093953 0.70030546 0.99998974 +v -0.58093953 0.75000286 0.99998974 +v -0.64758074 0.92687499 0.99998974 +v -0.64758074 1.00000047 0.99998974 +v -0.58093953 0.92687499 0.99998974 +v -0.58093953 1.00000047 0.99998974 +v -0.64758074 1.69120538 0.99998974 +v -0.64758074 1.74999284 0.99998974 +v -0.58093953 1.69120538 0.99998974 +v -0.58093953 1.74999284 0.99998974 +v -0.64758074 1.69120538 -0.99998974 +v -0.64758074 1.68107378 -0.99998974 +v -0.58093953 1.68154215 -0.99998986 +v -0.58093953 1.69120538 -0.99998974 +v -0.58093953 1.56563687 0.99998974 +v -0.64758074 1.68107378 0.99998974 +v -0.58093953 1.68154215 0.99998986 +v -0.64758074 1.31449985 0.99998974 +v -0.58093953 1.31449985 0.99998974 +v -0.64758074 1.3271029 0.99998974 +v -0.58093953 1.32651972 0.99998986 +v -0.64758074 1.3271029 -0.99998974 +v -0.64758074 1.31449985 -0.99998974 +v -0.58093953 1.32651972 -0.99998986 +v -0.58093953 1.31449985 -0.99998974 +v -0.64758074 1.07974112 0.99998974 +v -0.58093953 1.07974112 0.99998974 +v -0.64758074 0.80403614 0.99998974 +v -0.58093953 0.80403614 0.99998974 +v -0.64758074 0.70030546 -0.99998974 +v -0.64758074 0.65085315 -0.99998986 +v -0.58093953 0.67969703 -0.99998986 +v -0.58093953 0.70030546 -0.99998974 +v -0.58093953 0.56381821 0.99998986 +v -0.64758074 0.65085315 0.99998986 +v -0.58093953 0.67969703 0.99998986 +v -0.64758074 0.25000762 0.99998974 +v -0.64758074 0.32087051 0.99998974 +v -0.58093953 0.25000762 0.99998974 +v -0.58093953 0.32087051 0.99998974 +v -0.64758074 0.34883678 0.99998974 +v -0.58093953 0.33252513 0.99998986 +v -0.64758074 0.34883678 -0.99998974 +v -0.64758074 0.32087051 -0.99998974 +v -0.58093953 0.33252513 -0.99998986 +v -0.58093953 0.32087051 -0.99998974 +v -0.64758074 1.43187916 0.99998974 +v -0.64758074 1.49999558 0.99998974 +v -0.58093953 1.63831281 -0.99998974 +v -0.58093953 1.6141529 -0.99998974 +v -0.64758074 1.56563687 0.99998974 +v -0.58093953 1.6141529 0.99998974 +v -0.58093953 1.63831281 0.99998974 +v -0.58093953 1.35376095 0.99998974 +v -0.58093953 1.38597464 0.99998974 +v -0.58093953 1.38597464 -0.99998974 +v -0.58093953 1.35376095 -0.99998974 +v -0.64758074 0.46008813 0.99998974 +v -0.64758074 0.50000548 0.99998974 +v -0.58093953 0.63969719 -0.99998986 +v -0.58093953 0.61016833 -0.99998974 +v -0.64758074 0.56381821 0.99998974 +v -0.58093953 0.63969719 0.99998986 +v -0.58093953 0.61016833 0.99998986 +v -0.58093953 0.35514557 0.99998974 +v -0.58093953 0.39272761 0.99998974 +v -0.58093953 0.35514557 -0.99998974 +v -0.58093953 0.39272761 -0.99998986 +v -0.58093953 0.46008813 -0.99998986 +v -0.58093953 0.50000536 -0.99998986 +v -0.58093953 0.56381821 -0.99998986 +v -0.58093953 1.43187916 -0.99998974 +v -0.58093953 1.67351675 -0.99998986 +v -0.64758074 1.64047932 -0.99998986 +v -0.64758074 1.64047932 0.99998986 +v -0.58093953 1.67351675 0.99998986 +v -0.58093953 1.33650267 0.99998974 +v -0.64758074 1.35215306 0.99998986 +v -0.64758074 1.35215306 -0.99998986 +v -0.58093953 1.33650267 -0.99998986 +v -0.58093953 1.49999535 -0.99998974 +v -0.58093953 1.56563687 -0.99998974 +v -0.64758074 0.25000762 -0.99998974 +v -0.64758074 0.19598627 -0.98198276 +v -0.58093953 0.25000762 -0.99998974 +v -0.58093953 0.19598627 -0.98198264 +v -0.64758074 0.75000286 -0.99998974 +v -0.58093953 0.75000286 -0.99998974 +v -0.64758074 1.19985032 -0.99998974 +v -0.64758074 1.24999797 -0.99998974 +v -0.58093953 1.19985032 -0.99998974 +v -0.58093953 1.24999797 -0.99998974 +v -0.64758074 1.74999284 -0.99998974 +v -0.58093953 1.74999284 -0.99998974 +v -0.64758074 0.19598627 0.98198276 +v -0.58093953 0.19598627 0.98198264 +v -0.64758074 1.83535957 0.97153431 +v -0.58093953 1.83535957 0.97153419 +v -0.64758074 0.46008813 -0.99998974 +v -0.64758074 0.50000548 -0.99998974 +v -0.64758074 0.92687499 -0.99998974 +v -0.64758074 1.00000047 -0.99998974 +v -0.58093953 0.92687499 -0.99998974 +v -0.58093953 1.00000047 -0.99998974 +v -0.64758074 1.43187916 -0.99998974 +v -0.64758074 1.49999558 -0.99998974 +v -0.64758074 1.83535957 -0.97153437 +v -0.58093953 1.83535957 -0.97153425 +v -0.64758074 1.56563687 -0.99998974 +v -0.64758074 1.07974112 -0.99998974 +v -0.58093953 1.07974112 -0.99998974 +v -0.64758074 0.80403614 -0.99998974 +v -0.58093953 0.80403614 -0.99998974 +v -0.64758074 0.56381821 -0.99998974 +v -0.53905081 0.46008801 0.99998986 +v -0.53905081 0.50000536 0.99998986 +v -0.53905081 1.19985032 0.99998986 +v -0.53905081 1.24999797 0.99998986 +v -0.53905081 1.43187916 0.99998986 +v -0.53905081 1.49999535 0.99998986 +v -0.46860146 0.46008801 -0.99998986 +v -0.46860146 0.50000536 -0.99998986 +v -0.46860146 1.19985008 -0.99998986 +v -0.46860146 1.24999785 -0.99998986 +v -0.46860146 1.43187904 -0.99998986 +v -0.46860146 1.49999523 -0.99998986 +v -0.53905081 0.70030546 0.99998986 +v -0.53905081 0.75000286 0.99998986 +v -0.53905081 0.92687499 0.99998986 +v -0.53905081 1.00000023 0.99998986 +v -0.53905081 1.69120538 0.99998986 +v -0.53905081 1.7499926 0.99998986 +v -0.46860146 0.70030546 -0.99998986 +v -0.46860146 0.75000262 -0.99998986 +v -0.46860146 0.92687499 -0.99998986 +v -0.46860146 1.00000023 -0.99998986 +v -0.46860146 1.69120526 -0.99998986 +v -0.46860146 1.7499926 -0.99998986 +v -0.53905081 1.56563687 0.99998986 +v -0.53905081 1.6141529 0.99998974 +v -0.46860146 1.56563687 -0.99998986 +v -0.46860146 1.6141529 -0.99998974 +v -0.53905081 1.31449961 0.99998986 +v -0.53905081 1.33650267 0.99998974 +v -0.46860146 1.31449961 -0.99998986 +v -0.46860146 1.33650267 -0.99998974 +v -0.53905081 1.07974112 0.99998986 +v -0.46860146 1.07974112 -0.99998986 +v -0.53905081 0.80403614 0.99998986 +v -0.46860146 0.80403614 -0.99998986 +v -0.53905081 0.56381821 0.99998986 +v -0.53905081 0.61016833 0.99998974 +v -0.46860146 0.56381797 -0.99998986 +v -0.46860146 0.61016833 -0.99998974 +v -0.53905081 0.25000762 0.99998986 +v -0.53905081 0.32087051 0.99998986 +v -0.53905081 0.35514557 0.99998974 +v -0.46860146 0.25000762 -0.99998986 +v -0.46860146 0.32087028 -0.99998986 +v -0.46860146 0.35514557 -0.99998974 +v -0.53905081 0.70030546 -0.99998986 +v -0.53905081 0.75000286 -0.99998986 +v -0.53905081 1.19985032 -0.99998986 +v -0.53905081 1.24999797 -0.99998986 +v -0.53905081 1.69120538 -0.99998986 +v -0.53905081 1.7499926 -0.99998986 +v -0.53905081 1.83155155 0.97280359 +v -0.49999511 1.83155155 0.97280335 +v -0.53905081 0.46008801 -0.99998986 +v -0.53905081 0.50000536 -0.99998986 +v -0.53905081 0.92687499 -0.99998986 +v -0.53905081 1.00000023 -0.99998986 +v -0.53905081 1.43187916 -0.99998986 +v -0.53905081 1.49999535 -0.99998986 +v -0.53905081 1.83155155 -0.97280371 +v -0.49999523 1.83155155 -0.97280335 +v -0.53905081 1.56563687 -0.99998986 +v -0.53905081 1.6141529 -0.99998974 +v -0.53905081 1.31449961 -0.99998986 +v -0.53905081 1.33650267 -0.99998974 +v -0.53905081 1.07974112 -0.99998986 +v -0.53905081 0.80403614 -0.99998986 +v -0.53905081 0.56381821 -0.99998986 +v -0.53905081 0.61016833 -0.99998974 +v -0.53905081 0.25000762 -0.99998986 +v -0.53905081 0.32087051 -0.99998986 +v -0.53905081 0.35514557 -0.99998974 +v -0.49999511 0.2016983 0.98388671 +v -0.46860146 0.2016983 0.9838866 +v -0.46860146 0.25000762 0.99998986 +v -0.46860146 0.70030546 0.99998986 +v -0.46860146 0.75000262 0.99998986 +v -0.46860146 1.19985008 0.99998986 +v -0.46860146 1.24999785 0.99998986 +v -0.46860146 1.69120526 0.99998986 +v -0.46860146 1.7499926 0.99998986 +v -0.49999511 0.2016983 -0.98388671 +v -0.46860146 0.2016983 -0.98474341 +v -0.46860146 0.46008801 0.99998986 +v -0.46860146 0.50000536 0.99998986 +v -0.46860146 0.92687499 0.99998986 +v -0.46860146 1.00000023 0.99998986 +v -0.46860146 1.43187904 0.99998986 +v -0.46860146 1.49999523 0.99998986 +v -0.46860146 1.83155155 0.97280341 +v -0.46860146 1.83155155 -0.97280359 +v -0.46860146 1.56563687 0.99998986 +v -0.46860146 1.6141529 0.99998974 +v -0.46860146 1.31449961 0.99998986 +v -0.46860146 1.33650267 0.99998974 +v -0.46860146 1.07974112 0.99998986 +v -0.46860146 0.80403614 0.99998986 +v -0.46860146 0.56381797 0.99998986 +v -0.46860146 0.61016833 0.99998974 +v -0.46860146 0.32087028 0.99998986 +v -0.46860146 0.35514557 0.99998974 +v -0.53905081 1.63831281 0.99998974 +v -0.53905081 1.67351675 0.99998974 +v -0.46860146 1.63831281 -0.99998974 +v -0.46860146 1.67351675 -0.99998974 +v -0.53905081 1.35376095 0.99998974 +v -0.53905081 1.38597464 0.99998974 +v -0.46860146 1.35376095 -0.99998974 +v -0.46860146 1.38597464 -0.99998974 +v -0.53905081 1.63831281 -0.99998974 +v -0.53905081 1.67351675 -0.99998974 +v -0.53905081 1.35376095 -0.99998974 +v -0.53905081 1.38597464 -0.99998974 +v -0.46860146 1.63831281 0.99998974 +v -0.46860146 1.67351675 0.99998974 +v -0.46860146 1.35376095 0.99998974 +v -0.46860146 1.38597464 0.99998974 +v -0.53905081 0.63969719 0.99998974 +v -0.46860146 0.63969719 -0.99998974 +v -0.53905081 0.39272761 0.99998974 +v -0.46860146 0.39272761 -0.99998974 +v -0.53905081 0.63969719 -0.99998974 +v -0.53905081 0.39272761 -0.99998974 +v -0.46860146 0.63969719 0.99998974 +v -0.46860146 0.39272761 0.99998974 +v -0.53905081 0.2016983 -0.98388683 +v -0.53905081 0.2016983 0.98388683 +v -0.42671275 0.46008813 -0.99998986 +v -0.42671275 0.50000536 -0.99998986 +v -0.36387968 0.46008813 -0.99998974 +v -0.36387968 0.50000536 -0.99998974 +v -0.42671275 1.19985032 -0.99998986 +v -0.42671275 1.24999797 -0.99998986 +v -0.36387968 1.19985055 -0.99998974 +v -0.36387968 1.24999797 -0.99998974 +v -0.42671275 1.43187916 -0.99998974 +v -0.42671275 1.49999535 -0.99998974 +v -0.42671275 0.70030546 -0.99998986 +v -0.42671275 0.75000286 -0.99998986 +v -0.36387968 0.70030546 -0.99998974 +v -0.36387968 0.75000286 -0.99998974 +v -0.42671275 0.92687499 -0.99998986 +v -0.42671275 1.00000047 -0.99998986 +v -0.36387968 0.92687499 -0.99998974 +v -0.36387968 1.00000047 -0.99998974 +v -0.42671275 1.69120538 -0.99998986 +v -0.42671275 1.74999284 -0.99998986 +v -0.36387968 1.6912055 -0.99998974 +v -0.36387968 1.74999284 -0.99998974 +v -0.42671275 1.63831281 0.99998974 +v -0.42671275 1.6141529 0.99998974 +v -0.42671275 1.56563687 -0.99998974 +v -0.42671275 1.6141529 -0.99998974 +v -0.42671275 1.63831281 -0.99998974 +v -0.42671275 1.31449985 -0.99998986 +v -0.36387968 1.31449985 -0.99998974 +v -0.42671275 1.07974112 -0.99998986 +v -0.36387968 1.07974112 -0.99998974 +v -0.42671275 0.80403614 -0.99998986 +v -0.36387968 0.80403637 -0.99998974 +v -0.42671275 0.63405787 0.99998974 +v -0.42671275 0.63969719 0.99998974 +v -0.36387968 0.61383998 0.99998986 +v -0.36387968 0.63969719 0.99998974 +v -0.42671275 0.56381821 -0.99998986 +v -0.36387968 0.56381821 -0.99998974 +v -0.42671275 0.63405787 -0.99998974 +v -0.42671275 0.63969719 -0.99998974 +v -0.36387968 0.63969719 -0.99998974 +v -0.36387968 0.61383998 -0.99998974 +v -0.42671275 0.25000762 -0.99998986 +v -0.42671275 0.32087051 -0.99998986 +v -0.36387968 0.25000762 -0.99998974 +v -0.36387968 0.32087051 -0.99998974 +v -0.42671275 0.35514557 0.99998974 +v -0.42671275 0.32087051 0.99998986 +v -0.36387968 0.35514557 0.99998974 +v -0.36387968 0.32087051 0.99998974 +v -0.42671275 1.68614959 0.99998986 +v -0.42671275 1.69120538 0.99998986 +v -0.36387968 1.67899131 0.99998974 +v -0.36387968 1.6845721 0.99998974 +v -0.36387968 1.6912055 0.99998974 +v -0.42671275 1.68614959 -0.99998986 +v -0.36387968 1.67899131 -0.99998974 +v -0.36387968 1.6845721 -0.99998974 +v -0.42671275 0.70030546 0.99998986 +v -0.36387968 0.70030546 0.99998974 +v -0.42671275 0.46008813 0.99998986 +v -0.42671275 0.50000536 0.99998986 +v -0.36387968 0.46008813 0.99998974 +v -0.36387968 0.50000536 0.99998974 +v -0.42671275 0.56381821 0.99998986 +v -0.36387968 0.56381821 0.99998974 +v -0.42671275 0.61016833 0.99998974 +v -0.36387968 0.61016833 0.99998986 +v -0.42671275 0.61016833 -0.99998974 +v -0.36387968 0.61016833 -0.99998974 +v -0.42671275 0.36232292 -0.99998974 +v -0.42671275 0.35514557 -0.99998974 +v -0.36387968 0.38805437 -0.99998974 +v -0.36387968 0.35514557 -0.99998974 +v -0.42671275 0.39272761 -0.99998974 +v -0.36387968 0.39272761 -0.99998974 +v -0.42671275 0.39272761 0.99998974 +v -0.36387968 0.39272761 0.99998974 +v -0.42671275 0.36232292 0.99998974 +v -0.36387968 0.38805437 0.99998974 +v -0.36387968 1.43187916 0.99998974 +v -0.36387968 1.49999558 0.99998974 +v -0.36387968 1.56563687 0.99998974 +v -0.36387968 1.6141529 0.99998974 +v -0.42671275 1.35376095 -0.99998974 +v -0.42671275 1.38597464 -0.99998974 +v -0.42671275 1.43187916 0.99998974 +v -0.42671275 1.38597464 0.99998974 +v -0.42671275 1.35376095 0.99998974 +v -0.36387968 1.43187916 -0.99998974 +v -0.36387968 1.49999558 -0.99998974 +v -0.36387968 1.61497831 0.99998974 +v -0.36387968 1.63831281 0.99998974 +v -0.36387968 1.56563687 -0.99998974 +v -0.36387968 1.61497831 -0.99998974 +v -0.36387968 1.63831281 -0.99998974 +v -0.42671275 1.32078862 -0.99998986 +v -0.36387968 1.32969307 -0.99998974 +v -0.36387968 1.32275092 -0.99998974 +v -0.42671275 1.33650267 -0.99998974 +v -0.42671275 1.33650267 0.99998974 +v -0.42671275 1.32078862 0.99998986 +v -0.42671275 1.31449985 0.99998986 +v -0.36387968 1.32969307 0.99998974 +v -0.36387968 1.32275092 0.99998974 +v -0.36387968 1.31449985 0.99998974 +v -0.42671275 1.67351675 0.99998974 +v -0.42671275 1.67351675 -0.99998974 +v -0.42671275 1.49999535 0.99998974 +v -0.42671275 1.56563687 0.99998974 +v -0.36387968 1.6141529 -0.99998974 +v -0.36387968 1.38487386 -0.99998974 +v -0.36387968 1.35376095 -0.99998974 +v -0.36387968 1.38597464 -0.99998974 +v -0.36387968 1.38597464 0.99998974 +v -0.36387968 1.38487386 0.99998974 +v -0.36387968 1.35376095 0.99998974 +v -0.42671275 0.25000762 0.99998986 +v -0.42671275 0.19408226 0.98134791 +v -0.36387968 0.25000762 0.99998974 +v -0.36387968 0.19408226 0.98134803 +v -0.42671275 0.75000286 0.99998986 +v -0.36387968 0.75000286 0.99998974 +v -0.42671275 1.19985032 0.99998986 +v -0.42671275 1.24999797 0.99998986 +v -0.36387968 1.19985055 0.99998974 +v -0.36387968 1.24999797 0.99998974 +v -0.42671275 1.74999284 0.99998986 +v -0.36387968 1.74999284 0.99998974 +v -0.42671275 0.19408226 -0.98421102 +v -0.36387968 0.19408226 -0.98261612 +v -0.42671275 0.92687499 0.99998986 +v -0.42671275 1.00000047 0.99998986 +v -0.36387968 0.92687499 0.99998974 +v -0.36387968 1.00000047 0.99998974 +v -0.42671275 1.82964754 0.97725373 +v -0.36387968 1.82964754 0.97343856 +v -0.42671275 1.82964754 -0.97343832 +v -0.36387968 1.82964754 -0.97343832 +v -0.42671275 1.07974112 0.99998986 +v -0.36387968 1.07974112 0.99998974 +v -0.42671275 0.80403614 0.99998986 +v -0.36387968 0.80403637 0.99998974 +v -0.68756544 1.76871836 0.99374795 +v -0.70089364 1.76871836 0.99374795 +v -0.68756544 1.8524959 0.96582222 +v -0.70089364 1.8524959 0.96582222 +v -0.55342888 1.8524959 0.96582204 +v -0.67471313 1.8524959 0.96582222 +v -0.55342888 1.8524959 -0.96582204 +v -0.67471313 1.8524959 -0.96582222 +v -0.68756544 1.76871836 -0.99374795 +v -0.70089364 1.76871836 -0.99374806 +v -0.68756544 1.8524959 -0.96582222 +v -0.70089364 1.8524959 -0.96582222 +v -0.44423866 1.8524959 0.96582186 +v -0.34959936 1.8524959 0.96582222 +v -0.34103119 1.76871836 0.99374795 +v -0.32770299 1.76871836 0.99374795 +v -0.34103119 1.8524959 0.96582222 +v -0.32770299 1.8524959 0.96582227 +v -0.34103119 1.76871836 -0.99374795 +v -0.32770299 1.76871836 -0.99374806 +v -0.34103119 1.8524959 -0.96582204 +v -0.32770299 1.8524959 -0.96582222 +v -0.44423866 1.8524959 -0.96582204 +v -0.34959936 1.8524959 -0.96582204 +v -0.49999523 1.8524959 0.96582186 +v -0.49999523 1.8524959 -0.96582186 +v -0.67042911 1.76871836 0.99374771 +v -0.67042911 1.76871836 -0.99374795 +v -0.35245537 1.76871836 0.99374795 +v -0.35245537 1.76871836 -0.99374771 +v -0.64758074 1.76871836 0.99374771 +v -0.55342888 1.76871836 0.99374795 +v -0.58093953 1.76871836 0.99374771 +v -0.64758074 1.76871836 -0.99374771 +v -0.58093953 1.76871836 -0.99374771 +v -0.55342888 1.76871836 -0.99374795 +v -0.53905081 1.76871836 0.99374771 +v -0.49999511 1.76871836 0.99374771 +v -0.53905081 1.76871836 -0.99374795 +v -0.49999511 1.76871836 -0.99374771 +v -0.46860146 1.76871836 0.99374771 +v -0.44423866 1.76871836 0.99374795 +v -0.44423866 1.76871836 -0.99374795 +v -0.46860146 1.76871836 -0.99374771 +v -0.42671275 1.76871836 0.99464488 +v -0.36387968 1.76871836 0.99374795 +v -0.42671275 1.76871836 -0.99374795 +v -0.36387968 1.76871836 -0.99374771 +v -0.49999523 1.44503259 0.99998986 +v -0.53905081 1.44503259 0.99998974 +v -0.49999523 1.44503259 -0.99998986 +v -0.46860146 1.44503259 -0.99998974 +v -0.49999523 1.53452217 0.99998986 +v -0.53905081 1.53452217 0.99998974 +v -0.49999511 1.53452217 -0.99998986 +v -0.46860146 1.53452217 -0.99998974 +v -0.55342888 1.44503259 0.99998986 +v -0.58093953 1.44503259 0.99998974 +v -0.70089364 1.49999535 -0.99998986 +v -0.70089364 1.44503259 -0.99998986 +v -0.68756544 1.44503259 -0.99998974 +v -0.55342888 1.44503259 -0.99998986 +v -0.53905081 1.44503259 -0.99998974 +v -0.70089364 1.53452217 -0.99998998 +v -0.68756544 1.53452217 -0.99998974 +v -0.55342888 1.53452217 -0.99998986 +v -0.53905081 1.53452217 -0.99998974 +v -0.55342888 1.53452217 0.99998986 +v -0.58093953 1.53452217 0.99998974 +v -0.44423866 1.44503259 -0.99998986 +v -0.42671275 1.44503259 -0.99998974 +v -0.44423866 1.44503259 0.99998986 +v -0.46860146 1.44503259 0.99998974 +v -0.34103119 1.44503259 0.99998974 +v -0.32579898 1.44503259 0.99998998 +v -0.32579898 1.49999535 0.99998986 +v -0.44423866 1.53452217 0.99998986 +v -0.46860146 1.53452217 0.99998974 +v -0.32579898 1.53452217 0.99998998 +v -0.34103119 1.53452217 0.99998974 +v -0.44423866 1.53452217 -0.99998986 +v -0.42671275 1.53452217 -0.99998974 +v -0.64507353 1.44503259 0.99998974 +v -0.64758074 1.44503259 0.99998974 +v -0.64507353 1.44503259 -0.99998974 +v -0.62359786 1.44503259 -0.99998974 +v -0.64507353 1.53452217 -0.99998974 +v -0.62359786 1.53452217 -0.99998974 +v -0.64507353 1.53452217 0.99998974 +v -0.64758074 1.53452217 0.99998974 +v -0.62359786 1.44503259 0.99998974 +v -0.62359786 1.53452217 0.99998974 +v -0.36320614 1.44503259 -0.99998974 +v -0.35245537 1.44503259 -0.99998974 +v -0.36320614 1.44503259 0.99998974 +v -0.36387968 1.44503259 0.99998974 +v -0.36320614 1.53452217 0.99998974 +v -0.36387968 1.53452217 0.99998974 +v -0.36320614 1.53452217 -0.99998974 +v -0.35245537 1.53452217 -0.99998974 +v -0.60378789 1.44503259 -0.99998974 +v -0.60378789 1.53452217 -0.99998974 +v -0.60378789 1.44503259 0.99998974 +v -0.60378789 1.53452217 0.99998974 +v -0.38292002 1.44503259 -0.99998974 +v -0.36387968 1.44503259 -0.99998974 +v -0.38292002 1.53452217 -0.99998974 +v -0.36387968 1.53452217 -0.99998974 +v -0.38292002 1.44503259 0.99998974 +v -0.42671275 1.44503259 0.99998974 +v -0.38292002 1.53452217 0.99998974 +v -0.42671275 1.53452217 0.99998974 +v -0.58093953 1.44503259 -0.99998974 +v -0.58093953 1.53452217 -0.99998974 +v -0.67042911 1.44503259 -0.99998974 +v -0.67042911 1.53452217 -0.99998974 +v -0.35245537 1.44503259 0.99998974 +v -0.35245537 1.53452217 0.99998974 +v -0.70089364 1.49999535 0.99998986 +v -0.70089364 1.44503259 0.99998998 +v -0.68756544 1.44503259 0.99998974 +v -0.70089364 1.53452217 0.99998998 +v -0.68756544 1.53452217 0.99998974 +v -0.34103119 1.44503259 -0.99998974 +v -0.32579898 1.44503259 -0.99998986 +v -0.32579898 1.49999535 -0.99998986 +v -0.32579898 1.53452217 -0.99998998 +v -0.34103119 1.53452217 -0.99998974 +v -0.67042911 1.44503259 0.99998974 +v -0.67042911 1.53452217 0.99998974 +v -0.64758074 1.44503259 -0.99998974 +v -0.64758074 1.53452217 -0.99998974 +v -0.49999523 1.22416472 0.99998986 +v -0.53905081 1.22416472 0.99998974 +v -0.49999523 1.22416472 -0.99998986 +v -0.46860146 1.22416472 -0.99998974 +v -0.49999523 1.28699779 0.99998986 +v -0.53905081 1.28699779 0.99998974 +v -0.49999523 1.28699779 -0.99998986 +v -0.46860146 1.28699779 -0.99998974 +v -0.70279765 1.24999797 -0.99998986 +v -0.70279765 1.22416472 -0.99998998 +v -0.68756544 1.22416472 -0.99998974 +v -0.55342888 1.22416472 -0.99998986 +v -0.53905081 1.22416472 -0.99998974 +v -0.55342888 1.22416472 0.99998986 +v -0.58093953 1.22416472 0.99998974 +v -0.55342888 1.28699779 0.99998986 +v -0.58093953 1.28699779 0.99998974 +v -0.70279765 1.28699779 -0.99998998 +v -0.68756544 1.28699779 -0.99998974 +v -0.55342888 1.28699779 -0.99998986 +v -0.53905081 1.28699779 -0.99998974 +v -0.44423866 1.22416472 0.99998986 +v -0.46860146 1.22416472 0.99998974 +v -0.34103119 1.22416472 0.99998974 +v -0.32579898 1.22416472 0.99998998 +v -0.32579898 1.24999797 0.99998986 +v -0.44423866 1.22416472 -0.99998986 +v -0.42671275 1.22416472 -0.99998974 +v -0.44423866 1.28699779 -0.99998986 +v -0.42671275 1.28699779 -0.99998974 +v -0.44423866 1.28699779 0.99998986 +v -0.46860146 1.28699779 0.99998974 +v -0.32579898 1.28699779 0.99998998 +v -0.34103119 1.28699779 0.99998974 +v -0.67042911 1.22416472 -0.99998974 +v -0.70279765 1.24999797 0.99998986 +v -0.70279765 1.22416472 0.99998998 +v -0.68756544 1.22416472 0.99998974 +v -0.70279765 1.28699779 0.9999901 +v -0.68756544 1.28699779 0.99998974 +v -0.67042911 1.28699779 -0.99998974 +v -0.35245537 1.22416472 0.99998974 +v -0.34103119 1.22416472 -0.99998974 +v -0.32579898 1.22416472 -0.99998998 +v -0.32579898 1.24999797 -0.99998986 +v -0.32579898 1.28699779 -0.99998998 +v -0.34103119 1.28699779 -0.99998974 +v -0.35245537 1.28699779 0.99998974 +v -0.67042911 1.22416472 0.99998974 +v -0.67042911 1.28699779 0.99998974 +v -0.35245537 1.22416472 -0.99998974 +v -0.35245537 1.28699779 -0.99998974 +v -0.64758074 1.22416472 -0.99998974 +v -0.64758074 1.28699779 -0.99998974 +v -0.36387968 1.22416472 0.99998974 +v -0.36387968 1.28699779 0.99998974 +v -0.64758074 1.22416472 0.99998974 +v -0.64758074 1.28699779 0.99998974 +v -0.58093953 1.22416472 -0.99998974 +v -0.58093953 1.28699779 -0.99998974 +v -0.36387968 1.22416472 -0.99998974 +v -0.36387968 1.28699779 -0.99998974 +v -0.42671275 1.22416472 0.99998974 +v -0.42671275 1.28699779 0.99998974 +v -0.49999511 1.02804911 0.99998986 +v -0.53905081 1.02804911 0.99998974 +v -0.49999523 1.17275571 0.99998986 +v -0.53905081 1.17275571 0.99998974 +v -0.49999511 1.02804911 -0.99998986 +v -0.46860146 1.02804911 -0.99998974 +v -0.49999523 1.17275571 -0.99998986 +v -0.46860146 1.17275571 -0.99998974 +v -0.70089364 1.07974112 -0.99998986 +v -0.70089364 1.02804911 -0.99998986 +v -0.68756544 1.02804911 -0.99998974 +v -0.55342888 1.02804911 -0.99998986 +v -0.53905081 1.02804911 -0.99998974 +v -0.70089364 1.17275571 -0.99998998 +v -0.68756544 1.17275571 -0.99998974 +v -0.55342888 1.17275571 -0.99998986 +v -0.53905081 1.17275571 -0.99998974 +v -0.55342888 1.02804911 0.99998986 +v -0.58093953 1.02804911 0.99998974 +v -0.55342888 1.17275571 0.99998986 +v -0.58093953 1.17275571 0.99998974 +v -0.44423866 1.02804911 0.99998986 +v -0.46860146 1.02804911 0.99998974 +v -0.34103119 1.02804911 0.99998974 +v -0.32770299 1.02804911 0.99998986 +v -0.32770299 1.07974112 0.99998986 +v -0.44423866 1.17275571 0.99998986 +v -0.46860146 1.17275571 0.99998974 +v -0.32770299 1.17275571 0.99998986 +v -0.34103119 1.17275571 0.99998974 +v -0.44423866 1.02804911 -0.99998986 +v -0.42671275 1.02804911 -0.99998974 +v -0.44423866 1.17275571 -0.99998986 +v -0.42671275 1.17275571 -0.99998974 +v -0.67042911 1.02804911 -0.99998974 +v -0.67042911 1.17275571 -0.99998974 +v -0.70089364 1.07974112 0.99998986 +v -0.70089364 1.02804911 0.99998986 +v -0.68756544 1.02804911 0.99998974 +v -0.70089364 1.17275571 0.99998998 +v -0.68756544 1.17275571 0.99998974 +v -0.35245537 1.02804911 0.99998974 +v -0.35245537 1.17275571 0.99998974 +v -0.34103119 1.02804911 -0.99998974 +v -0.32770299 1.02804911 -0.99998998 +v -0.32770299 1.07974112 -0.99998986 +v -0.32770299 1.17275571 -0.99998998 +v -0.34103119 1.17275571 -0.99998974 +v -0.67042911 1.02804911 0.99998974 +v -0.67042911 1.17275571 0.99998974 +v -0.35245537 1.02804911 -0.99998974 +v -0.35245537 1.17275571 -0.99998974 +v -0.64758074 1.02804911 -0.99998974 +v -0.64758074 1.17275571 -0.99998974 +v -0.36387968 1.02804911 0.99998974 +v -0.36387968 1.17275571 0.99998974 +v -0.64758074 1.02804911 0.99998974 +v -0.64758074 1.17275571 0.99998974 +v -0.58093953 1.02804911 -0.99998974 +v -0.58093953 1.17275571 -0.99998974 +v -0.36387968 1.02804911 -0.99998974 +v -0.36387968 1.17275571 -0.99998974 +v -0.42671275 1.02804911 0.99998974 +v -0.42671275 1.17275571 0.99998974 +v -0.49999511 0.97854423 0.99998986 +v -0.53905081 0.97854423 0.99998974 +v -0.49999511 0.97854423 -0.99998986 +v -0.46860146 0.97854423 -0.99998974 +v -0.49999523 0.86811029 0.99998986 +v -0.53905081 0.86811029 0.99998974 +v -0.49999523 0.86811029 -0.99998986 +v -0.46860146 0.86811029 -0.99998974 +v -0.55342888 0.97854423 0.99998986 +v -0.58093953 0.97854423 0.99998974 +v -0.69708561 0.92687499 -0.99998986 +v -0.69708561 0.97854423 -0.99998998 +v -0.68756544 0.97854423 -0.99998974 +v -0.55342888 0.97854423 -0.99998986 +v -0.53905081 0.97854423 -0.99998974 +v -0.55342888 0.86811029 0.99998986 +v -0.58093953 0.86811029 0.99998974 +v -0.69708561 0.86811029 -0.99998986 +v -0.68756544 0.86811029 -0.99998974 +v -0.55342888 0.86811029 -0.99998986 +v -0.53905081 0.86811029 -0.99998974 +v -0.44423866 0.97854423 0.99998986 +v -0.46860146 0.97854423 0.99998974 +v -0.32389485 0.92687499 0.99998986 +v -0.32389485 0.97854423 0.99998998 +v -0.34103119 0.97854423 0.99998974 +v -0.44423866 0.97854423 -0.99998986 +v -0.42671275 0.97854423 -0.99998974 +v -0.44423866 0.86811029 0.99998986 +v -0.46860146 0.86811029 0.99998974 +v -0.34103119 0.86811029 0.99998974 +v -0.32389485 0.86811029 0.99998998 +v -0.44423866 0.86811029 -0.99998986 +v -0.42671275 0.86811029 -0.99998974 +v -0.69708561 0.92687499 0.99998986 +v -0.69708561 0.97854423 0.99998986 +v -0.68756544 0.97854423 0.99998974 +v -0.67042911 0.97854423 -0.99998974 +v -0.69708561 0.86811029 0.99998998 +v -0.68756544 0.86811029 0.99998974 +v -0.67042911 0.86811029 -0.99998974 +v -0.35245537 0.97854423 0.99998974 +v -0.32389485 0.92687499 -0.99998986 +v -0.32389485 0.97854423 -0.99998986 +v -0.34103119 0.97854423 -0.99998974 +v -0.35245537 0.86811029 0.99998974 +v -0.34103119 0.86811029 -0.99998974 +v -0.32389485 0.86811029 -0.99998998 +v -0.67042911 0.97854423 0.99998974 +v -0.67042911 0.86811029 0.99998974 +v -0.35245537 0.97854423 -0.99998974 +v -0.35245537 0.86811029 -0.99998974 +v -0.64758074 0.97854423 -0.99998974 +v -0.64758074 0.86811029 -0.99998974 +v -0.36387968 0.97854423 0.99998974 +v -0.36387968 0.86811029 0.99998974 +v -0.64758074 0.97854423 0.99998974 +v -0.64758074 0.86811029 0.99998974 +v -0.58093953 0.97854423 -0.99998974 +v -0.58093953 0.86811029 -0.99998974 +v -0.36387968 0.97854423 -0.99998974 +v -0.36387968 0.86811029 -0.99998974 +v -0.42671275 0.97854423 0.99998974 +v -0.42671275 0.86811029 0.99998974 +v -0.53905081 0.82622158 0.99998974 +v -0.49999523 0.82622158 0.99998986 +v -0.46860146 0.82622158 -0.99998974 +v -0.49999523 0.82622158 -0.99998986 +v -0.69898963 0.70030546 -0.99998986 +v -0.69898963 0.75000286 -0.99998986 +v -0.58093953 0.82622158 0.99998974 +v -0.55342888 0.82622158 0.99998986 +v -0.69898963 0.80403614 -0.99998986 +v -0.69898963 0.82622158 -0.99998986 +v -0.68756544 0.82622158 -0.99998974 +v -0.53905081 0.82622158 -0.99998974 +v -0.55342888 0.82622158 -0.99998986 +v -0.64222598 0.67580282 -0.99998974 +v -0.58613801 0.67580282 -0.99998974 +v -0.64222598 0.67580282 0.99998974 +v -0.58613801 0.67580282 0.99998974 +v -0.32960701 0.70030546 0.99998986 +v -0.32960701 0.75000286 0.99998986 +v -0.32960701 0.80403614 0.99998986 +v -0.46860146 0.82622158 0.99998974 +v -0.44423866 0.82622158 0.99998986 +v -0.42671275 0.82622158 -0.99998974 +v -0.44423866 0.82622158 -0.99998986 +v -0.55342912 0.67580282 0.99998986 +v -0.53905081 0.67580282 0.99998974 +v -0.44423878 0.67580282 -0.99998986 +v -0.46860146 0.67580282 -0.99998974 +v -0.69898963 0.69415271 -0.99998986 +v -0.69898963 0.67580282 -0.99998986 +v -0.68756544 0.67580282 -0.99998974 +v -0.49999535 0.67580282 -0.99998986 +v -0.53905081 0.67580282 -0.99998974 +v -0.69898963 0.69415271 0.99998986 +v -0.69898963 0.67580282 0.99998986 +v -0.68756544 0.67580282 0.99998974 +v -0.49999535 0.67580282 0.99998986 +v -0.46860146 0.67580282 0.99998974 +v -0.44423878 0.67580282 0.99998986 +v -0.42671275 0.67580282 0.99998974 +v -0.34103119 0.67580282 -0.99998974 +v -0.32960701 0.67580282 -0.99998998 +v -0.32960701 0.70030546 -0.99998986 +v -0.69898963 0.70030546 0.99998986 +v -0.69898963 0.75000286 0.99998986 +v -0.69898963 0.80403614 0.99998986 +v -0.69898963 0.82622158 0.99998986 +v -0.68756544 0.82622158 0.99998974 +v -0.67042911 0.82622158 -0.99998974 +v -0.55342912 0.67580282 -0.99998986 +v -0.58093953 0.67580282 -0.99998974 +v -0.58093953 0.67580282 0.99998974 +v -0.32960701 0.75000286 -0.99998986 +v -0.35245537 0.82622158 0.99998974 +v -0.34103119 0.82622158 0.99998974 +v -0.32960701 0.80403614 -0.99998986 +v -0.67720305 0.67580282 -0.99998974 +v -0.67720305 0.67580282 0.99998974 +v -0.34103119 0.67580282 0.99998974 +v -0.32960701 0.67580282 0.99998998 +v -0.35245537 0.67580282 -0.99998974 +v -0.67042911 0.82622158 0.99998974 +v -0.67042911 0.67580282 -0.99998974 +v -0.67042911 0.67580282 0.99998974 +v -0.34103119 0.82622158 -0.99998974 +v -0.35245537 0.82622158 -0.99998974 +v -0.35245537 0.67580282 0.99998974 +v -0.64758074 0.82622158 -0.99998974 +v -0.36387968 0.82622158 0.99998974 +v -0.36387968 0.67580282 -0.99998974 +v -0.64758074 0.82622158 0.99998974 +v -0.64758074 0.67580282 -0.99998974 +v -0.64758074 0.67580282 0.99998974 +v -0.58093953 0.82622158 -0.99998974 +v -0.36387968 0.82622158 -0.99998974 +v -0.36387968 0.67580282 0.99998974 +v -0.42671275 0.82622158 0.99998974 +v -0.42671275 0.67580282 -0.99998974 +v -0.32960701 0.82622158 0.99998986 +v -0.32960701 0.82622158 -0.99998998 +v -0.49999523 0.71959567 0.99998986 +v -0.53905081 0.71959567 0.99998974 +v -0.49999523 0.71959567 -0.99998986 +v -0.46860146 0.71959567 -0.99998974 +v -0.49999511 0.7767167 0.99998986 +v -0.53905081 0.7767167 0.99998974 +v -0.49999523 0.7767167 -0.99998986 +v -0.46860146 0.7767167 -0.99998974 +v -0.55342888 0.71959567 -0.99998986 +v -0.53905081 0.71959567 -0.99998974 +v -0.55342888 0.71959567 0.99998986 +v -0.58093953 0.71959567 0.99998974 +v -0.55342888 0.7767167 0.99998986 +v -0.58093953 0.7767167 0.99998974 +v -0.55342888 0.7767167 -0.99998986 +v -0.53905081 0.7767167 -0.99998974 +v -0.44423866 0.71959567 0.99998986 +v -0.46860146 0.71959567 0.99998974 +v -0.44423866 0.71959567 -0.99998986 +v -0.42671275 0.71959567 -0.99998974 +v -0.44423866 0.7767167 0.99998986 +v -0.46860146 0.7767167 0.99998974 +v -0.44423866 0.7767167 -0.99998986 +v -0.42671275 0.7767167 -0.99998974 +v -0.68756544 0.71959567 -0.99998974 +v -0.67042911 0.71959567 -0.99998974 +v -0.69137346 0.75000286 0.99998974 +v -0.69137346 0.71959567 0.99998974 +v -0.68756544 0.71959567 0.99998974 +v -0.69137346 0.7767167 0.99998974 +v -0.68756544 0.7767167 0.99998974 +v -0.68756544 0.7767167 -0.99998974 +v -0.67042911 0.7767167 -0.99998974 +v -0.34103119 0.71959567 0.99998974 +v -0.35245537 0.71959567 0.99998974 +v -0.34103119 0.71959567 -0.99998974 +v -0.33341503 0.71959567 -0.99998986 +v -0.33341503 0.75000286 -0.99998974 +v -0.34103119 0.7767167 0.99998974 +v -0.35245537 0.7767167 0.99998974 +v -0.33341503 0.7767167 -0.99998998 +v -0.34103119 0.7767167 -0.99998974 +v -0.67042911 0.71959567 0.99998974 +v -0.67042911 0.7767167 0.99998974 +v -0.35245537 0.71959567 -0.99998974 +v -0.35245537 0.7767167 -0.99998974 +v -0.64758074 0.71959567 -0.99998974 +v -0.64758074 0.7767167 -0.99998974 +v -0.36387968 0.71959567 0.99998974 +v -0.36387968 0.7767167 0.99998974 +v -0.64758074 0.71959567 0.99998974 +v -0.64758074 0.7767167 0.99998974 +v -0.58093953 0.71959567 -0.99998974 +v -0.58093953 0.7767167 -0.99998974 +v -0.36387968 0.71959567 -0.99998974 +v -0.36387968 0.7767167 -0.99998974 +v -0.42671275 0.71959567 0.99998974 +v -0.42671275 0.7767167 0.99998974 +v -0.69137346 0.75000286 -0.99998974 +v -0.69137346 0.71959567 -0.99998974 +v -0.69137346 0.7767167 -0.99998986 +v -0.33341503 0.71959567 0.99998974 +v -0.33341503 0.75000286 0.99998974 +v -0.33341503 0.7767167 0.99998998 +v -0.49999523 0.30261218 0.99998986 +v -0.53905081 0.30261218 0.99998974 +v -0.49999523 0.30261218 -0.99998986 +v -0.46860146 0.30261218 -0.99998974 +v -0.55342888 0.30261218 0.99998986 +v -0.58093953 0.30261218 0.99998974 +v -0.70279765 0.25000762 -0.99998986 +v -0.70279765 0.30261218 -0.99998998 +v -0.68756544 0.30261218 -0.99998974 +v -0.55342888 0.30261218 -0.99998986 +v -0.53905081 0.30261218 -0.99998974 +v -0.34103119 0.20360231 0.98452132 +v -0.33151102 0.20360231 0.98452156 +v -0.33151102 0.25000762 0.99998986 +v -0.44423866 0.20360231 0.98452132 +v -0.46860146 0.20360231 0.98452121 +v -0.44423866 0.20360231 -0.98738366 +v -0.46860146 0.20360231 -0.98534423 +v -0.34103119 0.20360231 -0.98557376 +v -0.33151102 0.20360231 -0.98557376 +v -0.33151102 0.25000762 -0.99998986 +v -0.44423866 0.30261218 -0.99998986 +v -0.42671275 0.30261218 -0.99998974 +v -0.44423866 0.30261218 0.99998986 +v -0.46860146 0.30261218 0.99998974 +v -0.33151102 0.30261218 0.99998986 +v -0.34103119 0.30261218 0.99998974 +v -0.70279765 0.20360231 -0.98452156 +v -0.68756544 0.20360231 -0.98452132 +v -0.70279765 0.25000762 0.99998986 +v -0.70279765 0.20360231 0.98452156 +v -0.68756544 0.20360231 0.98452132 +v -0.70279765 0.30261218 0.99998998 +v -0.68756544 0.30261218 0.99998974 +v -0.67042911 0.30261218 -0.99998974 +v -0.35245537 0.20360231 0.98452132 +v -0.35245537 0.20360231 -0.98557353 +v -0.33151102 0.30261218 -0.99998998 +v -0.34103119 0.30261218 -0.99998974 +v -0.35245537 0.30261218 0.99998974 +v -0.67042911 0.30261218 0.99998974 +v -0.35245537 0.30261218 -0.99998974 +v -0.67042911 0.20360231 -0.98452132 +v -0.67042911 0.20360231 0.98452132 +v -0.64758074 0.30261218 -0.99998974 +v -0.36387968 0.30261218 0.99998974 +v -0.64758074 0.30261218 0.99998974 +v -0.64758074 0.20360231 -0.98452132 +v -0.58093953 0.20360231 -0.98452132 +v -0.55342888 0.20360231 -0.98452132 +v -0.58093953 0.20360231 0.98452132 +v -0.64758074 0.20360231 0.98452132 +v -0.55342888 0.20360231 0.98452132 +v -0.58093953 0.30261218 -0.99998974 +v -0.49999523 0.20360231 0.98452132 +v -0.49999523 0.20360231 -0.98452132 +v -0.53905081 0.20360231 -0.98452132 +v -0.53905081 0.20360231 0.98452132 +v -0.36387968 0.30261218 -0.99998974 +v -0.36387968 0.20360231 0.98452132 +v -0.42671275 0.20360231 0.98452121 +v -0.42671275 0.20360231 -0.98689699 +v -0.36387968 0.20360231 -0.98557353 +v -0.42671275 0.30261218 0.99998974 +v -0.53905081 0.27976381 0.99998974 +v -0.49999523 0.27976381 0.99998986 +v -0.46860146 0.27976381 -0.99998974 +v -0.49999523 0.27976381 -0.99998986 +v -0.58093953 0.27976381 0.99998974 +v -0.55342888 0.27976381 0.99998986 +v -0.53905081 0.27976381 -0.99998974 +v -0.55342888 0.27976381 -0.99998986 +v -0.44423866 0.21883463 0.98959869 +v -0.46860146 0.21883463 0.98959869 +v -0.46860146 0.21883463 -0.99015164 +v -0.44423866 0.21883463 -0.99152153 +v -0.42671275 0.27976381 -0.99998974 +v -0.44423866 0.27976381 -0.99998986 +v -0.46860146 0.27976381 0.99998974 +v -0.44423866 0.27976381 0.99998986 +v -0.62663638 0.25000762 0.99998974 +v -0.62663638 0.27976381 0.99998974 +v -0.62663638 0.25000762 -0.99998974 +v -0.62663638 0.27976381 -0.99998974 +v -0.58093953 0.27976381 -0.99998974 +v -0.49999523 0.21883463 -0.98959881 +v -0.55342888 0.21883463 -0.98959869 +v -0.53905081 0.21883463 -0.98959869 +v -0.49999523 0.21883463 0.98959881 +v -0.53905081 0.21883463 0.98959869 +v -0.55342888 0.21883463 0.98959869 +v -0.36959171 0.25000762 -0.99998974 +v -0.36959171 0.27976381 -0.99998974 +v -0.42671275 0.21883463 0.98959869 +v -0.42671275 0.21883463 -0.99119466 +v -0.42671275 0.27976381 0.99998974 +v -0.36959171 0.25000762 0.99998974 +v -0.36959171 0.27976381 0.99998974 +v -0.58093953 0.21883463 -0.98959869 +v -0.62663638 0.21883463 -0.98959869 +v -0.62663638 0.21883463 0.98959881 +v -0.58093953 0.21883463 0.98959869 +v -0.36959171 0.21883463 0.98959869 +v -0.36959171 0.21883463 -0.9903056 +v -0.44423866 0.22835481 0.9927721 +v -0.46860146 0.22835481 0.9927721 +v -0.46860146 0.22835481 -0.99315619 +v -0.44423866 0.22835481 -0.99410778 +v -0.35245537 0.22835481 0.9927721 +v -0.35055136 0.22835481 0.99277222 +v -0.35055136 0.25000762 0.99998974 +v -0.35245537 0.22835481 -0.993263 +v -0.35055136 0.22835481 -0.99326312 +v -0.35055136 0.25000762 -0.99998974 +v -0.35055136 0.28928399 0.99998974 +v -0.35245537 0.28928399 0.99998974 +v -0.35055136 0.28928399 -0.99998986 +v -0.35245537 0.28928399 -0.99998974 +v -0.66281294 0.25000762 -0.99998974 +v -0.66281294 0.28928399 -0.99998974 +v -0.64758074 0.28928399 -0.99998974 +v -0.36387968 0.28928399 0.99998974 +v -0.66281294 0.25000762 0.99998974 +v -0.66281294 0.28928399 0.99998974 +v -0.64758074 0.28928399 0.99998974 +v -0.58093953 0.28928399 0.99998974 +v -0.63536322 0.28928399 0.99998974 +v -0.66281294 0.22835481 -0.99277222 +v -0.64758074 0.22835481 -0.9927721 +v -0.66281294 0.22835481 0.99277222 +v -0.64758074 0.22835481 0.9927721 +v -0.58093953 0.28928399 -0.99998974 +v -0.63536322 0.28928399 -0.99998974 +v -0.49999523 0.22835481 -0.9927721 +v -0.55342888 0.22835481 -0.9927721 +v -0.53905081 0.22835481 -0.9927721 +v -0.49999523 0.22835481 0.9927721 +v -0.53905081 0.22835481 0.9927721 +v -0.55342888 0.22835481 0.9927721 +v -0.42671275 0.28928399 -0.99998974 +v -0.36721169 0.28928399 -0.99998974 +v -0.36387968 0.28928399 -0.99998974 +v -0.42671275 0.22835481 0.9927721 +v -0.42671275 0.22835481 -0.99388068 +v -0.42671275 0.28928399 0.99998974 +v -0.36721169 0.28928399 0.99998974 +v -0.36387968 0.22835481 0.9927721 +v -0.36959171 0.22835481 0.99277186 +v -0.36387968 0.22835481 -0.993263 +v -0.36959171 0.22835481 -0.993263 +v -0.53905081 0.28928399 0.99998974 +v -0.49999523 0.28928399 0.99998974 +v -0.46860146 0.28928399 -0.99998974 +v -0.49999523 0.28928399 -0.99998974 +v -0.55342888 0.28928399 0.99998974 +v -0.53905081 0.28928399 -0.99998974 +v -0.55342888 0.28928399 -0.99998974 +v -0.44423866 0.28928399 -0.99998974 +v -0.46860146 0.28928399 0.99998974 +v -0.44423866 0.28928399 0.99998974 +v -0.58093953 0.22835481 -0.99277186 +v -0.62663638 0.22835481 -0.99277186 +v -0.62663638 0.22835481 0.9927721 +v -0.58093953 0.22835481 0.99277186 +v -0.49999523 1.7077893 0.99998986 +v -0.53905081 1.7077893 0.99998974 +v -0.49999523 1.7077893 -0.99998986 +v -0.46860146 1.7077893 -0.99998974 +v -0.55342888 1.7077893 -0.99998986 +v -0.53905081 1.7077893 -0.99998974 +v -0.55342888 1.7077893 0.99998986 +v -0.58093953 1.7077893 0.99998974 +v -0.44423866 1.7077893 0.99998986 +v -0.46860146 1.7077893 0.99998974 +v -0.44423866 1.7077893 -0.99998986 +v -0.42671275 1.7077893 -0.99998974 +v -0.63806057 1.74999284 0.99998974 +v -0.63806057 1.7077893 0.99998974 +v -0.63806057 1.74999284 -0.99998974 +v -0.63806057 1.7077893 -0.99998974 +v -0.58093953 1.7077893 -0.99998974 +v -0.63806057 1.76871836 0.99374747 +v -0.63806057 1.8258394 0.9747076 +v -0.58093953 1.8258394 0.97470736 +v -0.63806057 1.76871836 -0.99374747 +v -0.63806057 1.8258394 -0.97470825 +v -0.58093953 1.8258394 -0.9747076 +v -0.38672804 1.7077893 -0.99998986 +v -0.38672804 1.74999284 -0.99998974 +v -0.42671275 1.7077893 0.99998974 +v -0.38672804 1.7077893 0.99998974 +v -0.38672804 1.74999284 0.99998974 +v -0.38672804 1.76871836 0.99407404 +v -0.38672804 1.8258394 0.9760952 +v -0.42671275 1.8258394 0.97834044 +v -0.38672804 1.76871836 -0.99374771 +v -0.38672804 1.8258394 -0.97470766 +v -0.42671275 1.8258394 -0.9747076 +v -0.55342888 1.8258394 0.9747076 +v -0.55342888 1.8258394 -0.9747076 +v -0.53905081 1.8258394 0.9747076 +v -0.49999523 1.8258394 0.97470718 +v -0.49999523 1.8258394 -0.97470718 +v -0.53905081 1.8258394 -0.9747076 +v -0.46860146 1.8258394 0.97470736 +v -0.44423866 1.8258394 0.97470736 +v -0.44423866 1.8258394 -0.9747076 +v -0.46860146 1.8258394 -0.9747076 +v -0.49999511 0.1236329 -0.95786511 +v -0.55342888 0.1236329 -0.95786488 +v -0.62282824 0.14457726 -0.96484643 +v -0.62282824 0.1236329 -0.957865 +v -0.62282824 0.14457726 0.96484643 +v -0.62282824 0.1236329 0.95786511 +v -0.55342888 0.1236329 0.95786488 +v -0.49999511 0.1236329 0.95786511 +v -0.62282824 1.86392009 0.96201413 +v -0.62282824 1.88105642 0.95630204 +v -0.55342888 1.88105642 0.95630186 +v -0.62282824 1.86392009 -0.96201413 +v -0.62282824 1.88105642 -0.95630204 +v -0.55342888 1.88105642 -0.95630186 +v -0.62282824 1.68120741 -0.99998986 +v -0.62282824 1.6912055 -0.99998974 +v -0.62282824 1.68120741 0.99998974 +v -0.62282824 1.6912055 0.99998974 +v -0.62282824 1.32693624 0.99998974 +v -0.62282824 1.31449985 0.99998974 +v -0.62282824 1.32693624 -0.99998974 +v -0.62282824 1.31449985 -0.99998974 +v -0.62282824 0.69265079 -0.99998974 +v -0.62282824 0.67580282 -0.99998974 +v -0.62282824 0.69265079 0.99998974 +v -0.62282824 0.67580282 0.99998974 +v -0.62282824 0.35027062 0.99998986 +v -0.62282824 0.32087051 0.99998974 +v -0.62282824 0.32087051 -0.99998974 +v -0.62282824 0.35027062 -0.99998986 +v -0.40196025 1.86392009 0.96201396 +v -0.40196025 1.88105642 0.95630198 +v -0.44423866 1.88105642 0.95630186 +v -0.40196025 1.86392009 -0.96201396 +v -0.40196025 1.88105642 -0.9563021 +v -0.44423866 1.88105642 -0.95630204 +v -0.40196025 1.68120741 0.99998986 +v -0.40196025 1.6912055 0.99998974 +v -0.40196025 1.68120741 -0.99998986 +v -0.40196025 1.6912055 -0.99998974 +v -0.62282824 0.46008813 -0.99998974 +v -0.62282824 0.50000536 -0.99998974 +v -0.62282824 0.56381821 -0.99998974 +v -0.62282824 0.46008813 0.99998974 +v -0.62282824 0.50000536 0.99998974 +v -0.62282824 0.56381821 0.99998974 +v -0.62282824 0.62914884 -0.99998986 +v -0.62282824 0.62914884 0.99998986 +v -0.62282824 0.36857056 0.99998986 +v -0.62282824 0.36857056 -0.99998986 +v -0.62282824 1.43187916 -0.99998974 +v -0.62282824 1.44503259 -0.99998974 +v -0.62282824 1.49999558 -0.99998974 +v -0.62282824 1.53452217 -0.99998974 +v -0.62282824 1.56563687 -0.99998974 +v -0.62282824 1.6141529 -0.99998986 +v -0.62282824 1.43187916 0.99998974 +v -0.62282824 1.38597464 0.99998986 +v -0.62282824 1.44503259 0.99998974 +v -0.62282824 1.65728092 -0.99998986 +v -0.62282824 1.67680251 -0.99998986 +v -0.62282824 1.49999558 0.99998974 +v -0.62282824 1.53452217 0.99998974 +v -0.62282824 1.65728092 0.99998986 +v -0.62282824 1.67680251 0.99998974 +v -0.62282824 1.34446215 0.99998986 +v -0.62282824 1.33241581 0.99998974 +v -0.62282824 1.34446215 -0.99998986 +v -0.62282824 1.33241581 -0.99998974 +v -0.40196025 1.32693624 -0.99998974 +v -0.40196025 1.31449985 -0.99998974 +v -0.40196025 1.32693624 0.99998986 +v -0.40196025 1.31449985 0.99998974 +v -0.62282824 1.63831281 -0.99998986 +v -0.62282824 1.6141529 0.99998974 +v -0.62282824 1.63831281 0.99998986 +v -0.62282824 1.35376095 0.99998986 +v -0.62282824 1.38597464 -0.99998974 +v -0.62282824 1.35376095 -0.99998986 +v -0.40196025 1.63831281 0.99998974 +v -0.40196025 1.67351675 0.99998974 +v -0.40196025 1.43187916 0.99998974 +v -0.40196025 1.44503259 0.99998974 +v -0.40196025 1.49999558 0.99998974 +v -0.40196025 1.53452217 0.99998974 +v -0.40196025 1.56563687 0.99998974 +v -0.40196025 1.6141529 0.99998974 +v -0.62282824 1.56563687 0.99998974 +v -0.62282824 0.17123389 -0.97373175 +v -0.62282824 0.17123389 0.97373175 +v -0.49999523 1.88105642 0.95630186 +v -0.62282824 1.8524959 0.96582204 +v -0.62282824 1.8524959 -0.96582204 +v -0.49999523 1.88105642 -0.95630186 +v -0.44423866 0.1236329 0.95786488 +v -0.40196025 0.1236329 0.95786511 +v -0.40196025 0.14457726 0.96484643 +v -0.44423866 0.1236329 -0.96566021 +v -0.40196025 0.1236329 -0.96397572 +v -0.40196025 0.14457726 -0.96966499 +v -0.40196025 1.8524959 0.96582186 +v -0.40196025 1.8524959 -0.96582186 +v -0.62282824 0.19598627 -0.98198264 +v -0.62282824 0.19598627 0.98198264 +v -0.62282824 1.84868788 0.9670915 +v -0.62282824 1.83535957 0.97153413 +v -0.62282824 1.84868788 -0.9670915 +v -0.62282824 1.83535957 -0.97153413 +v -0.40196025 0.17123389 0.97373175 +v -0.40196025 0.19408226 0.98134791 +v -0.40196025 0.17123389 -0.97717541 +v -0.40196025 0.19408226 -0.98358267 +v -0.40196025 1.84868788 0.9670915 +v -0.40196025 1.82964754 0.97575062 +v -0.40196025 1.84868788 -0.9670915 +v -0.40196025 1.82964754 -0.97343814 +v -0.62282824 1.19985055 0.99998974 +v -0.62282824 1.22416472 0.99998974 +v -0.62282824 0.70030546 0.99998974 +v -0.62282824 0.71959567 0.99998974 +v -0.62282824 0.92687499 0.99998974 +v -0.62282824 0.97854423 0.99998974 +v -0.62282824 1.7077893 0.99998974 +v -0.62282824 1.24999797 0.99998974 +v -0.62282824 1.28699779 0.99998974 +v -0.62282824 1.00000047 0.99998974 +v -0.62282824 1.02804911 0.99998974 +v -0.62282824 1.07974112 0.99998974 +v -0.62282824 1.17275571 0.99998974 +v -0.62282824 0.75000286 0.99998974 +v -0.62282824 0.7767167 0.99998974 +v -0.62282824 0.80403637 0.99998974 +v -0.62282824 0.82622158 0.99998974 +v -0.62282824 0.30261218 0.99998974 +v -0.62282824 0.28928399 0.99998974 +v -0.62282824 0.63969719 -0.99998986 +v -0.62282824 0.63969719 0.99998986 +v -0.62282824 0.35514557 0.99998986 +v -0.62282824 0.35514557 -0.99998986 +v -0.62282824 0.64831757 -0.99998986 +v -0.62282824 0.64831757 0.99998986 +v -0.62282824 0.20360231 -0.98452121 +v -0.62282824 0.70030546 -0.99998974 +v -0.62282824 0.71959567 -0.99998974 +v -0.62282824 1.19985055 -0.99998974 +v -0.62282824 1.22416472 -0.99998974 +v -0.62282824 1.7077893 -0.99998974 +v -0.62282824 0.20360231 0.98452121 +v -0.62282824 1.8258394 0.97470736 +v -0.62282824 0.92687499 -0.99998974 +v -0.62282824 0.97854423 -0.99998974 +v -0.62282824 1.8258394 -0.97470796 +v -0.62282824 1.24999797 -0.99998974 +v -0.62282824 1.28699779 -0.99998974 +v -0.62282824 1.00000047 -0.99998974 +v -0.62282824 1.02804911 -0.99998974 +v -0.62282824 1.07974112 -0.99998974 +v -0.62282824 1.17275571 -0.99998974 +v -0.62282824 0.75000286 -0.99998974 +v -0.62282824 0.7767167 -0.99998974 +v -0.62282824 0.80403637 -0.99998974 +v -0.62282824 0.82622158 -0.99998974 +v -0.62282824 0.30261218 -0.99998974 +v -0.62282824 0.28928399 -0.99998974 +v -0.40196025 0.46008813 -0.99998974 +v -0.40196025 0.50000548 -0.99998974 +v -0.40196025 1.19985055 -0.99998974 +v -0.40196025 1.22416472 -0.99998974 +v -0.40196025 1.43187916 -0.99998974 +v -0.40196025 1.44503259 -0.99998974 +v -0.40196025 0.70030546 -0.99998974 +v -0.40196025 0.71959567 -0.99998974 +v -0.40196025 0.92687499 -0.99998974 +v -0.40196025 0.97854423 -0.99998974 +v -0.40196025 1.49999558 -0.99998974 +v -0.40196025 1.53452217 -0.99998974 +v -0.40196025 1.6141529 -0.99998974 +v -0.40196025 1.63831281 -0.99998974 +v -0.40196025 1.24999797 -0.99998974 +v -0.40196025 1.28699779 -0.99998974 +v -0.40196025 1.00000047 -0.99998974 +v -0.40196025 1.02804911 -0.99998974 +v -0.40196025 1.07974112 -0.99998974 +v -0.40196025 1.17275571 -0.99998974 +v -0.40196025 0.75000286 -0.99998974 +v -0.40196025 0.7767167 -0.99998974 +v -0.40196025 0.80403637 -0.99998974 +v -0.40196025 0.82622158 -0.99998974 +v -0.40196025 0.62609326 0.99998974 +v -0.40196025 0.63969719 0.99998974 +v -0.40196025 0.56381821 -0.99998974 +v -0.40196025 0.63969719 -0.99998974 +v -0.40196025 0.62609326 -0.99998974 +v -0.40196025 0.30261218 -0.99998974 +v -0.40196025 0.28928399 -0.99998974 +v -0.40196025 0.35514557 0.99998974 +v -0.40196025 0.32087051 0.99998974 +v -0.40196025 1.67900919 0.99998986 +v -0.40196025 1.67900919 -0.99998986 +v -0.40196025 0.70030546 0.99998974 +v -0.40196025 0.67580282 0.99998974 +v -0.40196025 0.46008813 0.99998974 +v -0.40196025 0.50000548 0.99998974 +v -0.40196025 0.56381821 0.99998974 +v -0.40196025 0.61016833 0.99998974 +v -0.40196025 0.61016833 -0.99998974 +v -0.40196025 0.37245953 -0.99998974 +v -0.40196025 0.35514557 -0.99998974 +v -0.40196025 0.39272761 -0.99998974 +v -0.40196025 0.39272761 0.99998974 +v -0.40196025 0.37245953 0.99998974 +v -0.40196025 1.56563687 -0.99998974 +v -0.40196025 1.35376095 -0.99998974 +v -0.40196025 1.38597476 -0.99998974 +v -0.40196025 1.38597476 0.99998974 +v -0.40196025 1.35376095 0.99998974 +v -0.40196025 1.32967066 -0.99998974 +v -0.40196025 1.33650267 -0.99998974 +v -0.40196025 1.33650267 0.99998974 +v -0.40196025 1.32967066 0.99998986 +v -0.40196025 1.67351675 -0.99998974 +v -0.40196025 0.20360231 0.98452121 +v -0.40196025 0.71959567 0.99998974 +v -0.40196025 1.19985055 0.99998974 +v -0.40196025 1.22416472 0.99998974 +v -0.40196025 0.20360231 -0.98637551 +v -0.40196025 0.92687499 0.99998974 +v -0.40196025 0.97854423 0.99998974 +v -0.40196025 1.8258394 0.97695028 +v -0.40196025 1.8258394 -0.9747076 +v -0.40196025 1.24999797 0.99998974 +v -0.40196025 1.28699779 0.99998974 +v -0.40196025 1.00000047 0.99998974 +v -0.40196025 1.02804911 0.99998974 +v -0.40196025 1.07974112 0.99998974 +v -0.40196025 1.17275571 0.99998974 +v -0.40196025 0.75000286 0.99998974 +v -0.40196025 0.7767167 0.99998974 +v -0.40196025 0.80403637 0.99998974 +v -0.40196025 0.82622158 0.99998974 +v -0.40196025 0.32087051 -0.99998974 +v -0.40196025 0.30261218 0.99998974 +v -0.40196025 0.28928399 0.99998974 +v -0.40196025 0.67580282 -0.99998974 +v -0.62282824 1.74999284 0.99998974 +v -0.62282824 1.76871836 0.99374747 +v -0.40196025 1.74999284 -0.99998974 +v -0.40196025 1.76871836 -0.99374771 +v -0.62282824 0.86811029 0.99998974 +v -0.62282824 0.86811029 -0.99998974 +v -0.40196025 0.86811029 -0.99998974 +v -0.40196025 0.86811029 0.99998974 +v -0.62282824 0.21883463 -0.98959869 +v -0.62282824 0.21883463 0.98959869 +v -0.62282824 0.25000762 0.99998974 +v -0.62282824 0.27976381 0.99998974 +v -0.62282824 0.25000762 -0.99998974 +v -0.62282824 0.27976381 -0.99998974 +v -0.40196025 0.25000762 -0.99998974 +v -0.40196025 0.27976381 -0.99998974 +v -0.40196025 0.25000762 0.99998974 +v -0.40196025 0.27976381 0.99998974 +v -0.62282824 0.22835481 -0.99277174 +v -0.62282824 0.22835481 0.99277186 +v -0.40196025 0.21883463 0.98959869 +v -0.40196025 0.22835481 0.99277186 +v -0.40196025 0.21883463 -0.99080926 +v -0.40196025 0.22835481 -0.99361294 +v -0.62282824 1.74999284 -0.99998974 +v -0.62282824 1.76871836 -0.99374747 +v -0.40196025 1.7077893 -0.99998974 +v -0.40196025 1.7077893 0.99998974 +v -0.40196025 1.74999284 0.99998974 +v -0.40196025 1.76871836 0.99429136 +v -0.3543595 0.6107769 0.99998986 +v -0.3543595 0.63969719 0.99998974 +v -0.3543595 0.63969719 -0.99998974 +v -0.3543595 0.6107769 -0.99998974 +v -0.3543595 0.46008813 0.99998974 +v -0.3543595 0.50000536 0.99998974 +v -0.3543595 0.56381821 0.99998974 +v -0.3543595 0.61016833 0.99998986 +v -0.3543595 0.39195299 -0.99998974 +v -0.3543595 0.35514557 -0.99998974 +v -0.3543595 0.35514557 0.99998974 +v -0.3543595 0.39195299 0.99998974 +v -0.3543595 1.43187916 -0.99998974 +v -0.3543595 1.44503259 -0.99998974 +v -0.3543595 1.49999535 -0.99998974 +v -0.3543595 1.53452217 -0.99998974 +v -0.3543595 1.63403368 0.99998974 +v -0.3543595 1.63831281 0.99998974 +v -0.3543595 1.63403368 -0.99998974 +v -0.3543595 1.63831281 -0.99998974 +v -0.3543595 1.35946667 -0.99998974 +v -0.3543595 1.35376095 -0.99998974 +v -0.3543595 1.35946667 0.99998974 +v -0.3543595 1.35376095 0.99998974 +v -0.68185329 0.70030546 -0.99998974 +v -0.68185329 0.71959567 -0.99998974 +v -0.68185329 1.19985055 -0.99998974 +v -0.68185329 1.22416472 -0.99998974 +v -0.68185329 1.6912055 -0.99998974 +v -0.68185329 1.74999284 -0.99998974 +v -0.68185329 0.46008813 -0.99998974 +v -0.68185329 0.50000548 -0.99998974 +v -0.68185329 0.92687499 -0.99998974 +v -0.68185329 0.97854423 -0.99998974 +v -0.68185329 1.43187916 -0.99998974 +v -0.68185329 1.44503259 -0.99998974 +v -0.68185329 1.85884285 -0.96370667 +v -0.68185329 1.86392009 -0.96201413 +v -0.68185329 1.49999535 -0.99998974 +v -0.68185329 1.53452217 -0.99998974 +v -0.68185329 1.24999797 -0.99998974 +v -0.68185329 1.28699779 -0.99998974 +v -0.68185329 1.00000047 -0.99998974 +v -0.68185329 1.02804911 -0.99998974 +v -0.68185329 1.07974112 -0.99998974 +v -0.68185329 1.17275571 -0.99998974 +v -0.68185329 0.75000286 -0.99998974 +v -0.68185329 0.7767167 -0.99998974 +v -0.68185329 0.80403637 -0.99998974 +v -0.68185329 0.82622158 -0.99998974 +v -0.68185329 0.56381821 -0.99998974 +v -0.68185329 0.25000762 -0.99998974 +v -0.68185329 0.30261218 -0.99998974 +v -0.40196025 0.12553691 0.95849967 +v -0.3543595 0.12553691 0.95849973 +v -0.3543595 0.14457726 0.96484643 +v -0.44423866 0.12553691 0.95849949 +v -0.49999523 0.12553691 0.95849967 +v -0.49999523 0.12553691 -0.95849967 +v -0.44423866 0.12553691 -0.96617734 +v -0.40196025 0.12553691 -0.96449285 +v -0.3543595 0.12553691 -0.96223163 +v -0.3543595 0.14457726 -0.96776813 +v -0.3543595 1.8524959 0.96582204 +v -0.3543595 1.86392009 0.96201413 +v -0.68185329 1.56563687 -0.99998974 +v -0.68185329 1.670089 -0.99998974 +v -0.68185329 1.670089 0.99998974 +v -0.68185329 1.56563687 0.99998974 +v -0.68185329 1.43187916 0.99998974 +v -0.68185329 1.3301742 0.99998974 +v -0.68185329 1.3301742 -0.99998974 +v -0.68185329 0.59924471 -0.99998974 +v -0.68185329 0.67580282 -0.99998974 +v -0.68185329 0.59924471 0.99998974 +v -0.68185329 0.67580282 0.99998974 +v -0.68185329 0.46008813 0.99998974 +v -0.68185329 0.33251237 0.99998974 +v -0.68185329 0.33251237 -0.99998974 +v -0.68185329 1.19985055 0.99998974 +v -0.68185329 1.22416472 0.99998974 +v -0.68185329 0.70030546 0.99998974 +v -0.68185329 0.71959567 0.99998974 +v -0.68185329 0.92687499 0.99998974 +v -0.68185329 0.97854423 0.99998974 +v -0.68185329 1.6912055 0.99998974 +v -0.68185329 1.74999284 0.99998974 +v -0.68185329 1.68698787 -0.99998974 +v -0.68185329 1.68698787 0.99998974 +v -0.68185329 1.24999797 0.99998974 +v -0.68185329 1.28699779 0.99998974 +v -0.68185329 1.31449985 0.99998974 +v -0.68185329 1.31974625 0.99998974 +v -0.68185329 1.31974625 -0.99998974 +v -0.68185329 1.31449985 -0.99998974 +v -0.68185329 1.00000047 0.99998974 +v -0.68185329 1.02804911 0.99998974 +v -0.68185329 1.07974112 0.99998974 +v -0.68185329 1.17275571 0.99998974 +v -0.68185329 0.75000286 0.99998974 +v -0.68185329 0.7767167 0.99998974 +v -0.68185329 0.80403637 0.99998974 +v -0.68185329 0.82622158 0.99998974 +v -0.68185329 0.68978893 -0.99998974 +v -0.68185329 0.6797198 -0.99998974 +v -0.68185329 0.68978893 0.99998974 +v -0.68185329 0.6797198 0.99998974 +v -0.68185329 0.25000762 0.99998974 +v -0.68185329 0.30261218 0.99998974 +v -0.68185329 0.32087051 0.99998974 +v -0.68185329 0.32087051 -0.99998974 +v -0.68185329 1.44503259 0.99998974 +v -0.68185329 1.49999535 0.99998974 +v -0.68185329 1.53452217 0.99998974 +v -0.68185329 0.50000548 0.99998974 +v -0.68185329 0.56381821 0.99998974 +v -0.68185329 0.20360231 -0.98452121 +v -0.68185329 0.20360231 0.98452121 +v -0.68185329 1.76871836 0.99374771 +v -0.68185329 1.76871836 -0.99374795 +v -0.3543595 0.17504239 0.97500139 +v -0.3543595 0.17123389 0.97373193 +v -0.3543595 0.70030546 0.99998974 +v -0.3543595 0.71959567 0.99998974 +v -0.3543595 1.19985055 0.99998974 +v -0.3543595 1.22416472 0.99998974 +v -0.3543595 1.6912055 0.99998974 +v -0.3543595 1.74999284 0.99998974 +v -0.3543595 0.17504239 -0.97670114 +v -0.3543595 0.17123389 -0.97558188 +v -0.3543595 0.92687499 0.99998974 +v -0.3543595 0.97854423 0.99998974 +v -0.3543595 1.43187916 0.99998974 +v -0.3543595 1.44503259 0.99998974 +v -0.3543595 1.84551429 0.96814954 +v -0.3543595 1.84868788 0.96709168 +v -0.3543595 1.84551429 -0.9681493 +v -0.3543595 1.84868788 -0.9670915 +v -0.3543595 1.49999535 0.99998974 +v -0.3543595 1.53452217 0.99998974 +v -0.3543595 1.32628822 -0.99998974 +v -0.3543595 1.24999797 0.99998974 +v -0.3543595 1.28699779 0.99998974 +v -0.3543595 1.32628822 0.99998974 +v -0.3543595 1.00000047 0.99998974 +v -0.3543595 1.02804911 0.99998974 +v -0.3543595 1.07974112 0.99998974 +v -0.3543595 1.17275571 0.99998974 +v -0.3543595 0.75000286 0.99998974 +v -0.3543595 0.7767167 0.99998974 +v -0.3543595 0.80403637 0.99998974 +v -0.3543595 0.82622158 0.99998974 +v -0.3543595 0.32087051 -0.99998974 +v -0.3543595 0.25000762 0.99998974 +v -0.3543595 0.28928399 0.99998974 +v -0.3543595 1.37915802 -0.99998974 +v -0.3543595 1.37915802 0.99998974 +v -0.3543595 0.70030546 -0.99998974 +v -0.3543595 0.67580282 -0.99998974 +v -0.3543595 1.56563687 0.99998974 +v -0.3543595 1.61926543 0.99998974 +v -0.3543595 1.61926543 -0.99998974 +v -0.3543595 1.56563687 -0.99998974 +v -0.3543595 1.6817286 0.99998974 +v -0.3543595 1.6817286 -0.99998974 +v -0.3543595 0.46008813 -0.99998974 +v -0.3543595 0.50000536 -0.99998974 +v -0.3543595 1.19985055 -0.99998974 +v -0.3543595 1.22416472 -0.99998974 +v -0.3543595 0.71959567 -0.99998974 +v -0.3543595 0.92687499 -0.99998974 +v -0.3543595 0.97854423 -0.99998974 +v -0.3543595 1.6912055 -0.99998974 +v -0.3543595 1.74999284 -0.99998974 +v -0.3543595 1.24999797 -0.99998974 +v -0.3543595 1.28699779 -0.99998974 +v -0.3543595 1.00000047 -0.99998974 +v -0.3543595 1.02804911 -0.99998974 +v -0.3543595 1.07974112 -0.99998974 +v -0.3543595 1.17275571 -0.99998974 +v -0.3543595 0.75000286 -0.99998974 +v -0.3543595 0.7767167 -0.99998974 +v -0.3543595 0.80403637 -0.99998974 +v -0.3543595 0.82622158 -0.99998974 +v -0.3543595 0.56381821 -0.99998974 +v -0.3543595 0.25000762 -0.99998974 +v -0.3543595 0.28928399 -0.99998974 +v -0.3543595 0.32087051 0.99998974 +v -0.3543595 1.69009995 0.99998974 +v -0.3543595 1.69009995 -0.99998974 +v -0.3543595 0.67580282 0.99998974 +v -0.3543595 0.61016833 -0.99998974 +v -0.3543595 0.39272761 -0.99998974 +v -0.3543595 0.39272761 0.99998974 +v -0.3543595 1.31587517 -0.99998974 +v -0.3543595 1.31449985 -0.99998974 +v -0.3543595 1.31587517 0.99998974 +v -0.3543595 1.31449985 0.99998974 +v -0.3543595 0.20360231 0.98452121 +v -0.3543595 0.20360231 -0.98557353 +v -0.3543595 1.76871836 0.99374795 +v -0.3543595 1.76871836 -0.99374747 +v -0.68185329 1.79537487 0.98486244 +v -0.68185329 1.8524959 0.96582204 +v -0.68185329 1.85884285 0.96370667 +v -0.68185329 1.79537487 -0.98486244 +v -0.68185329 1.8524959 -0.96582204 +v -0.68185329 0.86811029 -0.99998974 +v -0.68185329 0.86811029 0.99998974 +v -0.3543595 0.86811029 0.99998974 +v -0.3543595 0.86811029 -0.99998974 +v -0.68185329 0.15346288 -0.96780836 +v -0.68185329 0.15346288 0.96780836 +v -0.3543595 0.30261218 0.99998974 +v -0.3543595 0.30261218 -0.99998974 +v -0.3543595 0.22835481 0.9927721 +v -0.3543595 0.22835481 -0.993263 +v -0.55342888 0.12553691 -0.95849949 +v -0.68185329 0.14457726 -0.96484643 +v -0.68185329 0.12553691 -0.95849978 +v -0.62282824 0.12553691 -0.95849949 +v -0.62282824 0.12553691 0.95849967 +v -0.55342888 0.12553691 0.95849949 +v -0.68185329 0.14457726 0.96484643 +v -0.68185329 0.12553691 0.95849973 +v -0.68185329 1.86392009 0.96201413 +v -0.68185329 1.88105642 0.95630204 +v -0.68185329 1.88105642 -0.95630204 +v -0.3543595 1.88105642 0.9563021 +v -0.3543595 1.86392009 -0.96201396 +v -0.3543595 1.88105642 -0.9563021 +v -0.3543595 1.8524959 -0.96582186 +v -0.53905081 1.14419519 0.99998974 +v -0.49999523 1.14419519 0.99998974 +v -0.46860146 1.14419519 -0.99998974 +v -0.49999523 1.14419519 -0.99998974 +v -0.53905081 1.14419519 -0.99998974 +v -0.55342888 1.14419519 -0.99998974 +v -0.58093953 1.14419519 0.99998974 +v -0.55342888 1.14419519 0.99998974 +v -0.32770299 1.05660963 0.99998974 +v -0.46860146 1.14419519 0.99998974 +v -0.44423866 1.14419519 0.99998974 +v -0.42671275 1.14419519 -0.99998974 +v -0.44423866 1.14419519 -0.99998974 +v -0.67042911 1.14419519 -0.99998974 +v -0.68185329 1.14419519 -0.99998974 +v -0.35245537 1.14419519 0.99998974 +v -0.34103119 1.14419519 0.99998974 +v -0.32770299 1.05660963 -0.99998986 +v -0.68756544 1.14419519 0.99998974 +v -0.68185329 1.14419519 0.99998974 +v -0.34103119 1.14419519 -0.99998974 +v -0.35245537 1.14419519 -0.99998974 +v -0.64758074 1.14419519 -0.99998974 +v -0.36387968 1.14419519 0.99998974 +v -0.3543595 1.14419519 0.99998974 +v -0.67042911 1.14419519 0.99998974 +v -0.64758074 1.14419519 0.99998974 +v -0.62282824 1.14419519 0.99998974 +v -0.58093953 1.14419519 -0.99998974 +v -0.62282824 1.14419519 -0.99998974 +v -0.36387968 1.14419519 -0.99998974 +v -0.40196025 1.14419519 -0.99998974 +v -0.3543595 1.14419519 -0.99998974 +v -0.42671275 1.14419519 0.99998974 +v -0.40196025 1.14419519 0.99998974 +v -0.53905081 1.05660963 0.99998974 +v -0.49999523 1.05660963 0.99998986 +v -0.46860146 1.05660963 -0.99998974 +v -0.49999523 1.05660963 -0.99998986 +v -0.69898963 1.07974112 -0.99998974 +v -0.69898963 1.05660963 -0.99998986 +v -0.68756544 1.05660963 -0.99998974 +v -0.53905081 1.05660963 -0.99998974 +v -0.55342888 1.05660963 -0.99998986 +v -0.69898963 1.14419519 -0.99998998 +v -0.68756544 1.14419519 -0.99998974 +v -0.58093953 1.05660963 0.99998974 +v -0.55342888 1.05660963 0.99998986 +v -0.46860146 1.05660963 0.99998974 +v -0.44423866 1.05660963 0.99998986 +v -0.34103119 1.05660963 0.99998974 +v -0.32770299 1.14419519 0.99998974 +v -0.32770299 1.14419519 0.99998986 +v -0.42671275 1.05660963 -0.99998974 +v -0.44423866 1.05660963 -0.99998986 +v -0.67042911 1.05660963 -0.99998974 +v -0.68185329 1.05660963 -0.99998974 +v -0.69898963 1.07974112 0.99998974 +v -0.69898963 1.05660963 0.99998986 +v -0.68756544 1.05660963 0.99998974 +v -0.69898963 1.14419519 0.99998998 +v -0.35245537 1.05660963 0.99998974 +v -0.34103119 1.05660963 -0.99998974 +v -0.32770299 1.14419519 -0.99998986 +v -0.32770299 1.14419519 -0.99998998 +v -0.68185329 1.05660963 0.99998974 +v -0.35245537 1.05660963 -0.99998974 +v -0.64758074 1.05660963 -0.99998974 +v -0.36387968 1.05660963 0.99998974 +v -0.3543595 1.05660963 0.99998974 +v -0.67042911 1.05660963 0.99998974 +v -0.64758074 1.05660963 0.99998974 +v -0.62282824 1.05660963 0.99998974 +v -0.58093953 1.05660963 -0.99998974 +v -0.62282824 1.05660963 -0.99998974 +v -0.36387968 1.05660963 -0.99998974 +v -0.40196025 1.05660963 -0.99998974 +v -0.3543595 1.05660963 -0.99998974 +v -0.42671275 1.05660963 0.99998974 +v -0.40196025 1.05660963 0.99998974 +v -0.51620233 1.69120526 0.99998986 +v -0.51620233 1.7077893 0.99998974 +v -0.4324249 1.69120538 -0.99998974 +v -0.4324249 1.7077893 -0.99998974 +v -0.44423866 1.69065308 -0.99998986 +v -0.46860146 1.69065308 -0.99998974 +v -0.51620233 1.69120526 -0.99998986 +v -0.51620233 1.69065308 -0.99998986 +v -0.49999523 1.69065308 -0.99998986 +v -0.49999523 1.69065308 0.99998986 +v -0.46860146 1.69065308 0.99998974 +v -0.44423866 1.69065308 0.99998986 +v -0.4423244 1.69065308 0.99998986 +v -0.4423244 1.69065308 -0.99998986 +v -0.51620233 1.7077893 -0.99998974 +v -0.51620233 1.74999237 0.99998986 +v -0.51620233 1.76871836 0.99374747 +v -0.51620233 1.74999237 -0.99998986 +v -0.51620233 1.76871836 -0.99374771 +v -0.51620233 1.69065308 0.99998998 +v -0.4324249 1.69065308 0.99998974 +v -0.4324249 1.69120538 0.99998974 +v -0.4324249 1.69065308 -0.99998974 +v -0.4324249 1.7077893 0.99998974 +v -0.4324249 1.74999284 0.99998974 +v -0.4324249 1.76871836 0.99435252 +v -0.4324249 1.74999284 -0.99998974 +v -0.4324249 1.76871836 -0.99374795 +v -0.51620233 1.80870318 0.98041951 +v -0.49999523 1.80870318 0.98041927 +v -0.51620233 1.80870318 -0.98041939 +v -0.49999523 1.80870318 -0.98041927 +v -0.46860146 1.80870318 0.98041927 +v -0.44423866 1.80870318 0.98041951 +v -0.44423866 1.80870318 -0.98041969 +v -0.46860146 1.80870318 -0.98041951 +v -0.4324249 1.80870318 0.98204773 +v -0.4324249 1.80870318 -0.98041969 +v -0.48002576 1.69120526 -0.99998974 +v -0.48002576 1.7077893 -0.99998974 +v -0.59997987 1.67646491 -0.99998986 +v -0.59997987 1.6912055 -0.99998974 +v -0.59997987 1.67646491 0.99998986 +v -0.59997987 1.6912055 0.99998974 +v -0.55342924 1.63734006 -0.99998974 +v -0.58093953 1.63734006 -0.99998974 +v -0.55342924 1.63734006 0.99998974 +v -0.58093953 1.63734006 0.99998974 +v -0.48002576 1.67351675 0.99998974 +v -0.48002576 1.63831281 0.99998974 +v -0.53905081 1.63734006 0.99998974 +v -0.49999558 1.63734006 -0.99998974 +v -0.53905081 1.63734006 -0.99998974 +v -0.49999558 1.63734006 0.99998974 +v -0.48002576 1.63734006 0.99998974 +v -0.59997987 1.63831281 -0.99998974 +v -0.59997987 1.67351675 -0.99998986 +v -0.48002576 1.69120526 0.99998974 +v -0.48002576 1.69065308 0.99998974 +v -0.59997987 1.7077893 0.99998974 +v -0.59997987 1.63734006 -0.99998998 +v -0.59997987 1.63831281 0.99998974 +v -0.59997987 1.63734006 0.99998986 +v -0.59997987 1.67351675 0.99998986 +v -0.59997987 1.67485427 -0.99998986 +v -0.59997987 1.67485427 0.99998986 +v -0.59997987 1.7077893 -0.99998974 +v -0.48002576 1.7077893 0.99998974 +v -0.48002576 1.7499926 0.99998974 +v -0.48002576 1.76871836 0.99374747 +v -0.48002576 1.7499926 -0.99998974 +v -0.48002576 1.76871836 -0.99374747 +v -0.48002576 1.67351675 -0.99998974 +v -0.48002576 1.63831281 -0.99998974 +v -0.48002576 1.63734006 -0.99998974 +v -0.48002576 1.69065308 -0.99998974 +v -0.58093953 1.78395068 0.98867029 +v -0.55342888 1.78395068 0.98867046 +v -0.59997987 1.74999284 0.99998974 +v -0.59997987 1.76871836 0.99374747 +v -0.55342888 1.78395068 -0.98867046 +v -0.58093953 1.78395068 -0.98867029 +v -0.53905081 1.78395068 0.98867029 +v -0.53905081 1.78395068 -0.98867046 +v -0.48002576 1.78395068 0.98867017 +v -0.49999523 1.78395068 0.98867005 +v -0.48002576 1.78395068 -0.98867017 +v -0.49999523 1.78395068 -0.98867005 +v -0.59997987 1.74999284 -0.99998974 +v -0.59997987 1.78395068 0.98867017 +v -0.59997987 1.76871836 -0.99374747 +v -0.59997987 1.78395068 -0.9886704 +v -0.51620233 1.78395068 0.98867005 +v -0.51620233 1.78395068 -0.98867005 +v -0.53905081 1.51738596 0.99998974 +v -0.49999523 1.51738596 0.99998986 +v -0.46860146 1.51738596 -0.99998974 +v -0.49999511 1.51738596 -0.99998986 +v -0.53905081 1.51738596 -0.99998974 +v -0.55342888 1.51738596 -0.99998986 +v -0.58093953 1.51738596 0.99998974 +v -0.55342888 1.51738596 0.99998986 +v -0.46860146 1.51738596 0.99998974 +v -0.44423866 1.51738596 0.99998986 +v -0.43623292 1.63831281 0.99998974 +v -0.43623292 1.6141529 0.99998974 +v -0.44423866 1.51738596 -0.99998986 +v -0.43623292 1.51738596 -0.99998986 +v -0.43623292 1.53452217 -0.99998974 +v -0.43623292 1.6141529 -0.99998974 +v -0.43623292 1.63831281 -0.99998974 +v -0.43623292 1.56563687 -0.99998974 +v -0.43623292 1.67351675 -0.99998974 +v -0.59426772 1.53452217 -0.99998974 +v -0.59426772 1.51738596 -0.99998974 +v -0.58093953 1.51738596 -0.99998974 +v -0.59426772 1.56563687 -0.99998974 +v -0.59426772 1.6141529 -0.99998974 +v -0.43623292 1.67928743 0.99998974 +v -0.43623292 1.68889594 0.99998974 +v -0.43623292 1.67928743 -0.99998974 +v -0.43623292 1.68889594 -0.99998974 +v -0.59426772 1.6912055 0.99998974 +v -0.59426772 1.7077893 0.99998974 +v -0.59426772 1.53452217 0.99998974 +v -0.59426772 1.51738596 0.99998974 +v -0.59426772 1.63734006 -0.99998974 +v -0.59426772 1.6141529 0.99998974 +v -0.59426772 1.63734006 0.99998974 +v -0.59426772 1.56563687 0.99998974 +v -0.59426772 1.63831281 0.99998974 +v -0.59426772 1.67351675 0.99998974 +v -0.59426772 1.6768608 -0.99998974 +v -0.59426772 1.67351675 -0.99998974 +v -0.59426772 1.6768608 0.99998974 +v -0.59426772 1.7077893 -0.99998974 +v -0.59426772 1.6912055 -0.99998974 +v -0.43623292 1.69065308 0.99998974 +v -0.43623292 1.69120538 -0.99998974 +v -0.43623292 1.69065308 -0.99998974 +v -0.43623292 1.67351675 0.99998974 +v -0.43623292 1.51738596 0.99998974 +v -0.43623292 1.53452217 0.99998974 +v -0.43623292 1.56563687 0.99998974 +v -0.43623292 1.7077893 0.99998974 +v -0.43623292 1.69120538 0.99998974 +v -0.53905081 1.73634982 0.99998974 +v -0.51620233 1.73634982 0.99998974 +v -0.46860146 1.73634982 -0.99998974 +v -0.48002576 1.73634982 -0.99998974 +v -0.53905081 1.73634982 -0.99998974 +v -0.55342888 1.73634982 -0.99998986 +v -0.58093953 1.73634982 0.99998974 +v -0.55342888 1.73634982 0.99998986 +v -0.46860146 1.73634982 0.99998974 +v -0.44423866 1.73634982 0.99998986 +v -0.59426772 1.73634982 -0.99998974 +v -0.58093953 1.73634982 -0.99998974 +v -0.44423866 1.73634982 -0.99998986 +v -0.49999511 1.73634982 -0.99998986 +v -0.51620233 1.73634982 -0.99998974 +v -0.49999511 1.73634982 0.99998986 +v -0.48002576 1.73634982 0.99998974 +v -0.43623292 1.73634982 0.99998974 +v -0.59426772 1.68088722 -0.99998974 +v -0.59426772 1.68088722 0.99998974 +v -0.43623292 1.7077893 -0.99998974 +v -0.43623292 1.73634982 -1.00183773 +v -0.59426772 1.63831281 -0.99998974 +v -0.59426772 1.73634982 0.99998974 +v -0.53905081 1.44312858 0.99998974 +v -0.49999523 1.44312858 0.99998974 +v -0.49999523 1.44312858 -0.99998974 +v -0.46860146 1.44312858 -0.99998986 +v -0.46860146 1.44503259 -0.99998974 +v -0.46860146 1.49999523 -0.99998974 +v -0.46860146 1.51738596 -0.99998974 +v -0.58093953 1.44312858 0.99998974 +v -0.55342888 1.44312858 0.99998974 +v -0.53905081 1.44312858 -0.99998974 +v -0.55342888 1.44312858 -0.99998974 +v -0.46860146 1.6141529 0.99998974 +v -0.46860146 1.56563687 0.99998974 +v -0.58093953 1.63162791 0.99998974 +v -0.55342924 1.63162791 0.99998974 +v -0.46860146 1.61415326 0.99998974 +v -0.46860146 1.63162791 0.99998974 +v -0.47721135 1.63162791 0.99998974 +v -0.5904597 1.44503259 -0.99998974 +v -0.5904597 1.44312858 -0.99998974 +v -0.58093953 1.44312858 -0.99998974 +v -0.5904597 1.49999535 -0.99998974 +v -0.5904597 1.51738596 -0.99998974 +v -0.5904597 1.44503259 0.99998974 +v -0.5904597 1.44312858 0.99998974 +v -0.5904597 1.49999535 0.99998974 +v -0.5904597 1.51738596 0.99998974 +v -0.5904597 1.6141529 -0.99998974 +v -0.5904597 1.63162791 -0.99998974 +v -0.58093953 1.63162791 -0.99998974 +v -0.5904597 1.6141529 0.99998974 +v -0.5904597 1.63162791 0.99998974 +v -0.5904597 1.56563687 0.99998974 +v -0.46860146 1.6141529 -0.99998974 +v -0.46860146 1.56563687 -0.99998974 +v -0.46860146 1.44312858 0.99998974 +v -0.46860146 1.44503259 0.99998974 +v -0.46860146 1.49999523 0.99998974 +v -0.46860146 1.51738596 0.99998974 +v -0.46860146 1.61415326 -0.99998974 +v -0.46860146 1.63162791 -0.99998974 +v -0.47721135 1.63162791 -0.99998974 +v -0.46860146 1.53452217 -0.99998974 +v -0.5904597 1.56563687 -0.99998974 +v -0.5904597 1.53452217 -0.99998974 +v -0.46860146 1.53452217 0.99998974 +v -0.55342924 1.63162791 -0.99998974 +v -0.53905081 1.63162791 0.99998974 +v -0.53905081 1.63162791 -0.99998974 +v -0.49999558 1.63162791 -0.99998974 +v -0.49999558 1.63162791 0.99998974 +v -0.48494529 1.63162791 0.99998974 +v -0.48494529 1.63162791 -0.99998974 +v -0.5904597 1.53452217 0.99998974 +v -0.55342924 1.60877955 0.99998974 +v -0.53905081 1.60877955 0.99998974 +v -0.4476571 1.56563687 -0.99998986 +v -0.4476571 1.60877955 -0.99998974 +v -0.46860146 1.60877955 -0.99998974 +v -0.49999558 1.60877955 -0.99998974 +v -0.53905081 1.60877955 -0.99998974 +v -0.55618703 1.49999535 0.99998986 +v -0.55618703 1.51738596 0.99998974 +v -0.4476571 1.49999535 0.99998986 +v -0.4476571 1.51738596 0.99998974 +v -0.49999558 1.60877955 0.99998974 +v -0.46860146 1.60877955 0.99998974 +v -0.55618703 1.56563687 0.99998986 +v -0.55618703 1.60877955 0.99998974 +v -0.55618703 1.49999535 -0.99998986 +v -0.55618703 1.51738596 -0.99998974 +v -0.55618703 1.56563687 -0.99998986 +v -0.55618703 1.60877955 -0.99998986 +v -0.55342924 1.60877955 -0.99998974 +v -0.4476571 1.49999535 -0.99998986 +v -0.4476571 1.51738596 -0.99998974 +v -0.4476571 1.56563687 0.99998986 +v -0.4476571 1.60877955 0.99998986 +v -0.53905081 1.46788096 0.99998974 +v -0.49999523 1.46788096 0.99998974 +v -0.46860146 1.46788096 -0.99998974 +v -0.55618703 1.46788096 0.99998998 +v -0.55342888 1.46788096 0.99998974 +v -0.53905081 1.46788096 -0.99998974 +v -0.55342888 1.46788096 -0.99998974 +v -0.55618703 1.53452217 0.99998974 +v -0.46860146 1.46788096 0.99998974 +v -0.4476571 1.46788096 0.99998974 +v -0.4476571 1.53452217 0.99998974 +v -0.55618703 1.46788096 -0.99998998 +v -0.55618703 1.53452217 -0.99998974 +v -0.4476571 1.46788096 -0.99998986 +v -0.4476571 1.53452217 -0.99998974 +v -0.49999511 1.46788096 -0.99998974 +v -0.57522738 1.43187916 0.99998974 +v -0.57522738 1.44312858 0.99998974 +v -0.57522738 1.51738596 0.99998974 +v -0.57522738 1.49999535 0.99998974 +v -0.55342924 1.37648737 0.99998974 +v -0.53905081 1.37648737 0.99998974 +v -0.57522738 1.38597476 0.99998974 +v -0.57522738 1.37648737 0.99998974 +v -0.57522738 1.38597476 -0.99998974 +v -0.57522738 1.37648737 -0.99998974 +v -0.55342924 1.37648737 -0.99998974 +v -0.49999558 1.37648737 -0.99998974 +v -0.53905081 1.37648737 -0.99998974 +v -0.49999558 1.37648737 0.99998974 +v -0.49144995 1.37648737 0.99998986 +v -0.49144995 1.38597464 0.99998974 +v -0.57522738 1.43187916 -0.99998974 +v -0.49144995 1.43187904 0.99998986 +v -0.57522738 1.44312858 -0.99998974 +v -0.49144995 1.51738596 0.99998974 +v -0.49144995 1.49999523 0.99998986 +v -0.49144995 1.37648737 -0.99998974 +v -0.49144995 1.38597464 -0.99998974 +v -0.49144995 1.43187904 -0.99998986 +v -0.57522738 1.44503259 0.99998974 +v -0.57522738 1.45030546 0.99998974 +v -0.57522738 1.44503259 -0.99998974 +v -0.57522738 1.45030546 -0.99998974 +v -0.49144995 1.46788096 0.99998974 +v -0.53905081 1.52119398 0.99998974 +v -0.49999523 1.52119398 0.99998974 +v -0.53905081 1.52119398 -0.99998974 +v -0.55342888 1.52119398 -0.99998974 +v -0.57522738 1.52119398 0.99998974 +v -0.55618703 1.52119398 0.99998974 +v -0.55618703 1.52119398 -0.99998974 +v -0.55342888 1.52119398 0.99998974 +v -0.49999523 1.52119398 -0.99998974 +v -0.49144995 1.52119398 0.99998986 +v -0.49144995 1.44312858 -0.99998974 +v -0.49144995 1.44503259 -0.99998974 +v -0.49144995 1.51738596 -0.99998974 +v -0.49144995 1.49999523 -0.99998986 +v -0.49144995 1.44312858 0.99998974 +v -0.49144995 1.44503259 0.99998974 +v -0.49144995 1.46788096 -0.99998974 +v -0.49144995 1.52119398 -0.99998974 +v -0.57522738 1.51738596 -0.99998974 +v -0.57522738 1.49999535 -0.99998974 +v -0.57522738 1.52119398 -0.99998986 +v -0.52953064 1.43187916 0.99998974 +v -0.52953064 1.44312858 0.99998974 +v -0.55342924 1.36125516 0.99998974 +v -0.57905602 1.36125516 0.99998974 +v -0.55342924 1.36125516 -0.99998974 +v -0.57905602 1.36125516 -0.99998974 +v -0.52953064 1.38597464 -0.99998974 +v -0.52953064 1.37648737 -0.99998974 +v -0.52953064 1.43187916 -0.99998974 +v -0.59236371 1.43187916 -0.99998974 +v -0.59236371 1.44152164 -0.99998974 +v -0.59236371 1.43187916 0.99998974 +v -0.59236371 1.38597476 0.99998974 +v -0.59236371 1.44152164 0.99998974 +v -0.59236371 1.36125516 0.99998974 +v -0.58093953 1.36125516 0.99998974 +v -0.59236371 1.38597476 -0.99998974 +v -0.59236371 1.36125516 -0.99998974 +v -0.58093953 1.36125516 -0.99998974 +v -0.52953064 1.44312858 -0.99998974 +v -0.52953064 1.38597464 0.99998974 +v -0.52953064 1.37648737 0.99998974 +v -0.52953064 1.44503259 0.99998974 +v -0.52953064 1.46788096 0.99998974 +v -0.58093953 1.48692131 -0.99998974 +v -0.5904597 1.48692131 -0.99998974 +v -0.59236371 1.44503259 0.99998974 +v -0.59236371 1.48692131 0.99998974 +v -0.5904597 1.48692131 0.99998974 +v -0.52953064 1.44503259 -0.99998974 +v -0.52953064 1.46788096 -0.99998974 +v -0.59236371 1.44503259 -0.99998974 +v -0.59236371 1.48692131 -0.99998974 +v -0.58093953 1.48692131 0.99998974 +v -0.52953064 1.48692131 0.99998974 +v -0.53905081 1.48692131 0.99998974 +v -0.55618703 1.48692131 0.99998974 +v -0.55342888 1.48692131 0.99998974 +v -0.57522738 1.48692131 0.99998974 +v -0.53905081 1.48692131 -0.99998974 +v -0.55342888 1.48692131 -0.99998974 +v -0.57522738 1.48692131 -0.99998974 +v -0.55618703 1.48692131 -0.99998974 +v -0.52953064 1.48692131 -0.99998986 +v -0.53905081 1.36125516 0.99998974 +v -0.53905081 1.36125516 -0.99998974 +v -0.52953064 1.36125516 -0.99998974 +v -0.52953064 1.36125516 0.99998974 +v -0.45908129 1.38597464 -0.99998974 +v -0.45908129 1.35376095 -0.99998974 +v -0.45908129 1.41266405 -0.99998974 +v -0.46860146 1.41266405 -0.99998974 +v -0.51429832 1.38597464 -0.99998974 +v -0.51429832 1.41266405 -0.99998998 +v -0.49999535 1.41266405 -0.99998986 +v -0.49999535 1.41266405 0.99998986 +v -0.49144995 1.41266405 0.99998974 +v -0.46860146 1.34602284 -0.99998974 +v -0.45908129 1.34602284 -0.99998974 +v -0.51429832 1.35376095 -0.99998974 +v -0.51429832 1.34602284 -0.99998986 +v -0.49999535 1.34602284 -0.99998974 +v -0.49999535 1.34602284 0.99998974 +v -0.46860146 1.34602284 0.99998974 +v -0.51429832 1.37648737 0.99998974 +v -0.51429832 1.38597464 0.99998974 +v -0.45908129 1.38597464 0.99998974 +v -0.45908129 1.35376095 0.99998974 +v -0.49144995 1.41266405 -0.99998974 +v -0.45908129 1.41266405 0.99998986 +v -0.46860146 1.41266405 0.99998974 +v -0.51429832 1.35376095 0.99998974 +v -0.51429832 1.34602284 0.99998986 +v -0.45908129 1.34602284 0.99998986 +v -0.51429832 1.37648737 -0.99998974 +v -0.51429832 1.3573904 -0.99998974 +v -0.51429832 1.3573904 0.99998974 +v -0.51429832 1.41266405 0.99998974 +v -0.31247067 1.43187916 0.99998986 +v -0.31247067 1.49453747 0.99998986 +v -0.3213998 1.49453747 0.99998986 +v -0.31247067 1.43187916 -0.99998986 +v -0.31247067 1.49453747 -0.99998986 +v -0.3213998 1.49453747 -0.99998986 +v -0.4476571 1.43187916 0.99998986 +v -0.4476571 1.44503259 0.99998974 +v -0.32579898 1.49453747 0.99998974 +v -0.4476571 1.38597464 -0.99998974 +v -0.4476571 1.3669672 -0.99998974 +v -0.4442389 1.3669672 -0.99998974 +v -0.3213998 1.3669672 0.99998974 +v -0.31247067 1.3669672 0.99998998 +v -0.3213998 1.3669672 -0.99998974 +v -0.33853876 1.3669672 -0.99998974 +v -0.31247067 1.3669672 -0.99998986 +v -0.33853876 1.3669672 0.99998974 +v -0.4476571 1.43187916 -0.99998986 +v -0.4476571 1.42745351 -0.99998986 +v -0.42671275 1.3669672 -0.99998974 +v -0.4442389 1.3669672 0.99998974 +v -0.42671275 1.3669672 0.99998974 +v -0.36360347 1.3669672 -0.99998974 +v -0.35686266 1.3669672 -0.99998974 +v -0.36360347 1.3669672 0.99998974 +v -0.35686266 1.3669672 0.99998974 +v -0.32579898 1.49453747 -0.99998974 +v -0.34103119 1.3669672 -0.99998974 +v -0.38292002 1.3669672 -0.99998974 +v -0.37483811 1.3669672 -0.99998974 +v -0.34103119 1.3669672 0.99998974 +v -0.38292002 1.3669672 0.99998974 +v -0.37483811 1.3669672 0.99998974 +v -0.35245537 1.3669672 -0.99998974 +v -0.35245537 1.3669672 0.99998974 +v -0.4476571 1.44503259 -0.99998974 +v -0.4476571 1.42745351 0.99998986 +v -0.40196025 1.3669672 -0.99998974 +v -0.40196025 1.3669672 0.99998974 +v -0.36387968 1.3669672 -0.99998974 +v -0.3543595 1.3669672 -0.99998974 +v -0.36387968 1.3669672 0.99998974 +v -0.3543595 1.3669672 0.99998974 +v -0.42671275 1.49453747 -0.99998974 +v -0.44423866 1.49453747 -0.99998986 +v -0.44423866 1.49453747 0.99998986 +v -0.4476571 1.49453747 0.99998974 +v -0.34103119 1.49453747 0.99998974 +v -0.35245537 1.49453747 -0.99998974 +v -0.3543595 1.49453747 -0.99998974 +v -0.36387968 1.49453747 0.99998974 +v -0.36320614 1.49453747 0.99998974 +v -0.36387968 1.49453747 -0.99998974 +v -0.38292002 1.49453747 -0.99998974 +v -0.42671275 1.49453747 0.99998974 +v -0.40196025 1.49453747 0.99998974 +v -0.35245537 1.49453747 0.99998974 +v -0.34103119 1.49453747 -0.99998974 +v -0.3543595 1.49453747 0.99998974 +v -0.4476571 1.49453747 -0.99998974 +v -0.40196025 1.49453747 -0.99998974 +v -0.38292002 1.49453747 0.99998974 +v -0.36320614 1.49453747 -0.99998974 +v -0.4476571 1.46788096 0.99998974 +v -0.4476571 1.49453747 0.99998986 +v -0.4476571 1.46788096 -0.99998974 +v -0.4476571 1.49453747 -0.99998986 +v -0.4476571 1.38597464 0.99998974 +v -0.4476571 1.3669672 0.99998974 +v -0.44423878 1.59735536 -0.99998974 +v -0.43623292 1.59735536 -0.99998974 +v -0.44423878 1.41266405 -0.99998986 +v -0.42671275 1.41266405 -0.99998974 +v -0.44423878 1.41266405 0.99998986 +v -0.42671275 1.41266405 0.99998974 +v -0.39624822 1.56563687 0.99998974 +v -0.39624822 1.59735536 0.99998986 +v -0.40196025 1.59735536 0.99998974 +v -0.46860146 1.59735536 -0.99998974 +v -0.47621762 1.43187916 -0.99998974 +v -0.47621762 1.41266405 -0.99998974 +v -0.39624822 1.44503259 -0.99998974 +v -0.39624822 1.43187916 -0.99998974 +v -0.39624822 1.53452217 -0.99998974 +v -0.39624822 1.49999558 -0.99998974 +v -0.42671275 1.59735536 -0.99998974 +v -0.40196025 1.59735536 -0.99998974 +v -0.40196025 1.41266405 -0.99998974 +v -0.40196025 1.41266405 0.99998974 +v -0.42671275 1.59735536 0.99998974 +v -0.43623292 1.59735536 0.99998974 +v -0.47621762 1.46788096 0.99998974 +v -0.47621762 1.49999523 0.99998974 +v -0.47621762 1.56563687 0.99998974 +v -0.47621762 1.53452217 0.99998974 +v -0.39624822 1.49453747 -0.99998974 +v -0.39624822 1.56563687 -0.99998974 +v -0.39624822 1.44503259 0.99998974 +v -0.39624822 1.43187916 0.99998974 +v -0.39624822 1.53452217 0.99998974 +v -0.39624822 1.49999558 0.99998974 +v -0.39624822 1.59735536 -0.99998986 +v -0.39624822 1.41266405 -0.99998974 +v -0.39624822 1.41266405 0.99998974 +v -0.39624822 1.49453747 0.99998974 +v -0.47621762 1.53007948 0.99998974 +v -0.44423878 1.59735536 0.99998974 +v -0.47621762 1.51738596 -0.99998974 +v -0.47621762 1.49999523 -0.99998974 +v -0.46860146 1.59735536 0.99998974 +v -0.47621762 1.56563687 -0.99998974 +v -0.47621762 1.53452217 -0.99998974 +v -0.47621762 1.53007948 -0.99998974 +v -0.4476571 1.59735536 -0.99998974 +v -0.47621762 1.59735536 0.99998974 +v -0.4476571 1.59735536 0.99998974 +v -0.47621762 1.44503259 0.99998974 +v -0.47621762 1.59735536 -0.99998962 +v -0.47621762 1.43187916 0.99998974 +v -0.47621762 1.41266405 0.99998974 +v -0.47621762 1.51738596 0.99998974 +v -0.47621762 1.44312858 -0.99998974 +v -0.47621762 1.44503259 -0.99998974 +v -0.47621762 1.44312858 0.99998974 +v -0.47621762 1.46788096 -0.99998974 +v -0.4476571 1.41266405 -0.99998974 +v -0.4476571 1.41266405 0.99998974 +v -0.45146524 1.33650267 -0.99998974 +v -0.45146524 1.31449985 -0.99998986 +v -0.48192977 1.33650267 0.99998974 +v -0.48192977 1.31449961 0.99998974 +v -0.45146524 1.35376095 -0.99998974 +v -0.45146524 1.36256504 -0.99998974 +v -0.48192977 1.38597476 0.99998974 +v -0.48192977 1.36701822 0.99998974 +v -0.45146524 1.42252373 -0.99998974 +v -0.45146524 1.42789626 -0.99998998 +v -0.46662819 1.42789626 -0.99998974 +v -0.45146524 1.34113788 -0.99998974 +v -0.48192977 1.35376095 0.99998974 +v -0.48192977 1.34602284 0.99998974 +v -0.48192977 1.33650267 -0.99998974 +v -0.48192977 1.31449961 -0.99998974 +v -0.45146524 1.33650267 0.99998974 +v -0.45146524 1.31449985 0.99998986 +v -0.48192977 1.38597476 -0.99998974 +v -0.48192977 1.36701822 -0.99998974 +v -0.48192977 1.41266405 -0.99998974 +v -0.48192977 1.42789626 -0.99998974 +v -0.47621762 1.42789626 -0.99998974 +v -0.45146524 1.42252373 0.99998974 +v -0.45146524 1.42789626 0.99998986 +v -0.46662819 1.42789626 0.99998974 +v -0.48192977 1.35376095 -0.99998974 +v -0.48192977 1.34602284 -0.99998974 +v -0.45146524 1.35376095 0.99998974 +v -0.45146524 1.34113788 0.99998974 +v -0.48192977 1.30223012 -0.99998986 +v -0.46860146 1.30223012 -0.99998974 +v -0.46860146 1.30223012 0.99998974 +v -0.45146524 1.30223012 0.99998974 +v -0.45146524 1.30223012 -0.99998998 +v -0.48192977 1.30223012 0.99998986 +v -0.47621762 1.42789626 0.99998974 +v -0.46860146 1.42789626 0.99998974 +v -0.45146524 1.36256504 0.99998974 +v -0.48192977 1.41266405 0.99998974 +v -0.45146524 1.38597476 -0.99998974 +v -0.46860146 1.42789626 -0.99998974 +v -0.45146524 1.41266405 -0.99998974 +v -0.45146524 1.38597476 0.99998974 +v -0.45146524 1.41266405 0.99998974 +v -0.48192977 1.42789626 0.99998974 +v -0.51429832 1.19985008 0.99998986 +v -0.51429832 1.22416472 0.99998974 +v -0.51429832 1.24999761 0.99998986 +v -0.51429832 1.28699779 0.99998974 +v -0.55342912 1.32507848 0.99998986 +v -0.53905081 1.32507848 0.99998974 +v -0.58474755 1.31816697 0.99998974 +v -0.58474755 1.31449985 0.99998974 +v -0.58474755 1.31816697 -0.99998974 +v -0.58474755 1.31449985 -0.99998974 +v -0.51429832 1.31449961 -0.99998986 +v -0.51429832 1.32507848 -0.99998986 +v -0.53905081 1.32507848 -0.99998974 +v -0.57764089 1.32507848 0.99998974 +v -0.55342912 1.32507848 -0.99998986 +v -0.57764089 1.32507848 -0.99998974 +v -0.58093953 1.32507848 0.99998974 +v -0.58093953 1.32507848 -0.99998974 +v -0.58474755 1.22416472 -0.99998974 +v -0.58474755 1.19985055 -0.99998974 +v -0.58474755 1.28699779 -0.99998974 +v -0.58474755 1.24999797 -0.99998974 +v -0.51429832 1.31449961 0.99998986 +v -0.51429832 1.32507848 0.99998998 +v -0.51429832 1.19985008 -0.99998986 +v -0.51429832 1.22416472 -0.99998974 +v -0.51429832 1.24999761 -0.99998986 +v -0.51429832 1.28699779 -0.99998974 +v -0.53905081 1.18798804 0.99998974 +v -0.51429832 1.18798804 0.99998986 +v -0.53905081 1.18798804 -0.99998974 +v -0.55342888 1.18798804 -0.99998986 +v -0.58093953 1.18798804 0.99998974 +v -0.55342888 1.18798804 0.99998986 +v -0.58474755 1.18798804 -0.99998974 +v -0.58093953 1.18798804 -0.99998974 +v -0.51429832 1.18798804 -0.99998974 +v -0.58474755 1.32507848 0.99998986 +v -0.58474755 1.32507848 -0.99998998 +v -0.58474755 1.22416472 0.99998974 +v -0.58474755 1.19985055 0.99998974 +v -0.58474755 1.28699779 0.99998974 +v -0.58474755 1.24999797 0.99998974 +v -0.58474755 1.18798804 0.99998974 +v -0.56761121 1.19985032 0.99998974 +v -0.56761121 1.22416472 0.99998974 +v -0.56761121 1.24999797 0.99998974 +v -0.56761121 1.28699779 0.99998974 +v -0.63234841 1.22416472 0.99998974 +v -0.63234841 1.19985055 0.99998974 +v -0.63234841 1.28699779 0.99998974 +v -0.63234841 1.24999797 0.99998974 +v -0.56761121 1.19985032 -0.99998974 +v -0.56761121 1.22416472 -0.99998974 +v -0.56761121 1.24999797 -0.99998974 +v -0.56761121 1.28699779 -0.99998974 +v -0.56761121 1.30223012 0.99998974 +v -0.58093953 1.30223012 0.99998974 +v -0.63234841 1.30223012 0.99998974 +v -0.62282824 1.30223012 0.99998974 +v -0.58093953 1.30223012 -0.99998974 +v -0.58474755 1.30223012 -0.99998974 +v -0.56761121 1.30223012 -0.99998986 +v -0.63234841 1.19179606 0.99998974 +v -0.62282824 1.19179606 0.99998974 +v -0.63234841 1.22416472 -0.99998974 +v -0.63234841 1.19985055 -0.99998974 +v -0.63234841 1.28699779 -0.99998974 +v -0.63234841 1.24999797 -0.99998974 +v -0.58474755 1.30223012 0.99998974 +v -0.63234841 1.30223012 -0.99998974 +v -0.62282824 1.30223012 -0.99998974 +v -0.63234841 1.19179606 -0.99998974 +v -0.62282824 1.19179606 -0.99998974 +v -0.58093953 1.19179606 0.99998974 +v -0.56761121 1.19179606 0.99998986 +v -0.58474755 1.19179606 -0.99998974 +v -0.58093953 1.19179606 -0.99998974 +v -0.56761121 1.19179606 -0.99998986 +v -0.58474755 1.19179606 0.99998974 +v -0.50668215 1.33650267 -0.99998974 +v -0.50668215 1.33116185 -0.99998974 +v -0.55342924 1.33840668 0.99998974 +v -0.53905081 1.33840668 0.99998974 +v -0.60378789 1.33840668 0.99998974 +v -0.58093953 1.33840668 0.99998974 +v -0.63425242 1.3299638 0.99998974 +v -0.63425242 1.33840668 0.99998986 +v -0.62282824 1.33840668 0.99998974 +v -0.63425242 1.3299638 -0.99998974 +v -0.63425242 1.33840668 -0.99998986 +v -0.62282824 1.33840668 -0.99998974 +v -0.55342924 1.33840668 -0.99998974 +v -0.58093953 1.33840668 -0.99998974 +v -0.50668215 1.33840668 -0.99998998 +v -0.53410029 1.33840668 -0.99998974 +v -0.60834276 1.33840668 0.99998974 +v -0.60378789 1.33840668 -0.99998986 +v -0.60834276 1.33840668 -0.99998986 +v -0.63425242 1.22416472 0.99998974 +v -0.63425242 1.19985067 0.99998974 +v -0.63425242 1.28699779 0.99998974 +v -0.63425242 1.24999797 0.99998974 +v -0.63425242 1.32119655 0.99998974 +v -0.63425242 1.32119655 -0.99998974 +v -0.50668215 1.33650267 0.99998974 +v -0.50668215 1.33116185 0.99998986 +v -0.50668215 1.22416472 -0.99998974 +v -0.50668215 1.19985008 -0.99998986 +v -0.50668215 1.28699779 -0.99998974 +v -0.50668215 1.24999761 -0.99998986 +v -0.50668215 1.33840668 0.99998986 +v -0.53410029 1.33840668 0.99998974 +v -0.53905081 1.33840668 -0.99998974 +v -0.63425242 1.31449985 0.99998974 +v -0.63425242 1.30376386 0.99998974 +v -0.50668215 1.31449961 -0.99998986 +v -0.50668215 1.19985008 0.99998986 +v -0.50668215 1.18798804 0.99998998 +v -0.63425242 1.18941605 0.99998974 +v -0.63425242 1.18798804 0.99998974 +v -0.62282824 1.18798804 0.99998974 +v -0.50668215 1.18798804 -0.99998998 +v -0.63425242 1.31449985 -0.99998974 +v -0.63425242 1.30376386 -0.99998974 +v -0.63425242 1.18941605 -0.99998974 +v -0.63425242 1.18798804 -0.99998974 +v -0.62282824 1.18798804 -0.99998974 +v -0.50668215 1.22416472 0.99998974 +v -0.50668215 1.28699779 0.99998974 +v -0.50668215 1.24999761 0.99998986 +v -0.50668215 1.31449961 0.99998986 +v -0.63425242 1.22416472 -0.99998974 +v -0.63425242 1.19985067 -0.99998974 +v -0.63425242 1.28699779 -0.99998974 +v -0.63425242 1.24999797 -0.99998974 +v -0.48954582 1.22416472 -0.99998974 +v -0.48954582 1.21654844 -0.99998986 +v -0.46860146 1.21654844 -0.99998974 +v -0.48954582 1.24999761 -0.99998986 +v -0.48954582 1.28699779 -0.99998974 +v -0.46860146 1.21654844 0.99998974 +v -0.44423866 1.21654844 0.99998974 +v -0.42671275 1.21654844 -0.99998974 +v -0.44423866 1.21654844 -0.99998974 +v -0.48954582 1.22416472 0.99998974 +v -0.48954582 1.21654844 0.99998998 +v -0.48954582 1.24999761 0.99998986 +v -0.48954582 1.28699779 0.99998974 +v -0.42671275 1.21654844 0.99998974 +v -0.42290473 1.21654844 0.99998974 +v -0.42290473 1.22416472 0.99998974 +v -0.42290473 1.28699779 0.99998974 +v -0.42290473 1.24999797 0.99998974 +v -0.48954582 1.29580855 -0.99998974 +v -0.42671275 1.30223012 -0.99998974 +v -0.44423866 1.30223012 -0.99998986 +v -0.44423866 1.30223012 0.99998986 +v -0.48954582 1.29580855 0.99998974 +v -0.42671275 1.30223012 0.99998974 +v -0.42290473 1.30223012 0.99998974 +v -0.42290473 1.21654844 -0.99998974 +v -0.42290473 1.22416472 -0.99998974 +v -0.42290473 1.28699779 -0.99998974 +v -0.42290473 1.24999797 -0.99998974 +v -0.42290473 1.30223012 -0.99998974 +v -0.48954582 1.30223012 -0.99998986 +v -0.48954582 1.30223012 0.99998986 +v -0.53143465 1.22416472 0.99998974 +v -0.53143465 1.20322024 0.99998986 +v -0.51429832 1.20322024 0.99998974 +v -0.46860146 1.20322024 -0.99998974 +v -0.4978863 1.20322024 -0.99998986 +v -0.53143465 1.28699779 0.99998974 +v -0.53143465 1.24999797 0.99998974 +v -0.53143465 1.33298754 -0.99998974 +v -0.53143465 1.33650267 -0.99998974 +v -0.46860146 1.20322024 0.99998974 +v -0.44423866 1.20322024 0.99998986 +v -0.42671275 1.20322024 -0.99998974 +v -0.44423866 1.20322024 -0.99998986 +v -0.46860146 1.3669672 0.99998974 +v -0.48187851 1.3669672 0.99998974 +v -0.53143465 1.339432 -0.99998974 +v -0.53143465 1.33840668 -0.99998974 +v -0.39053607 1.33267617 -0.99998974 +v -0.39053607 1.31449985 -0.99998974 +v -0.39053607 1.31449985 0.99998974 +v -0.39053607 1.33267617 0.99998986 +v -0.53143465 1.33298754 0.99998974 +v -0.53143465 1.33650267 0.99998974 +v -0.49999523 1.20322024 -0.99998986 +v -0.50668215 1.20322024 -0.99998974 +v -0.4978863 1.20322024 0.99998986 +v -0.46860146 1.3669672 -0.99998974 +v -0.48187851 1.3669672 -0.99998974 +v -0.45908129 1.3669672 0.99998974 +v -0.53143465 1.339432 0.99998974 +v -0.53143465 1.33840668 0.99998974 +v -0.40196025 1.20322024 -0.99998974 +v -0.39053607 1.20322024 -0.99998986 +v -0.39053607 1.22416472 -0.99998974 +v -0.39053607 1.28699779 -0.99998974 +v -0.39053607 1.24999797 -0.99998974 +v -0.42671275 1.20322024 0.99998974 +v -0.40196025 1.20322024 0.99998974 +v -0.40618705 1.20322024 0.99998974 +v -0.53143465 1.31449961 0.99998974 +v -0.40618705 1.20322024 -0.99998974 +v -0.39053607 1.35376095 -0.99998974 +v -0.39053607 1.3669672 -0.99998974 +v -0.39053607 1.3669672 0.99998974 +v -0.39053607 1.33377003 -0.99998974 +v -0.39053607 1.33650267 -0.99998974 +v -0.39053607 1.35376095 0.99998974 +v -0.39053607 1.33650267 0.99998974 +v -0.39053607 1.33377003 0.99998986 +v -0.39053607 1.20322024 0.99998974 +v -0.39053607 1.22416472 0.99998974 +v -0.39053607 1.28699779 0.99998974 +v -0.39053607 1.24999797 0.99998974 +v -0.49999558 1.3669672 -0.99998974 +v -0.51429832 1.3669672 -0.99998974 +v -0.49502968 1.3669672 0.99998974 +v -0.48192977 1.3669672 0.99998974 +v -0.49999558 1.3669672 0.99998974 +v -0.51429832 1.3669672 0.99998974 +v -0.49502968 1.3669672 -0.99998974 +v -0.48192977 1.3669672 -0.99998974 +v -0.53143465 1.35975647 -0.99998974 +v -0.53143465 1.35376095 -0.99998974 +v -0.53143465 1.36125516 -0.99998974 +v -0.53143465 1.3669672 -0.99998974 +v -0.52953064 1.3669672 -0.99998974 +v -0.53143465 1.36125516 0.99998974 +v -0.53143465 1.3669672 0.99998974 +v -0.52953064 1.3669672 0.99998974 +v -0.53143465 1.35975647 0.99998974 +v -0.53143465 1.35376095 0.99998974 +v -0.45908129 1.3669672 -0.99998974 +v -0.53143465 1.35138011 -0.99998974 +v -0.53143465 1.35138011 0.99998974 +v -0.45146524 1.3669672 -0.99998974 +v -0.45146524 1.3669672 0.99998974 +v -0.50668215 1.20322024 0.99998974 +v -0.53143465 1.31449961 -0.99998974 +v -0.53143465 1.32507848 -0.99998974 +v -0.53143465 1.32507848 0.99998974 +v -0.53143465 1.22416472 -0.99998974 +v -0.53143465 1.20322024 -0.99998974 +v -0.51429832 1.20322024 -0.99998974 +v -0.53143465 1.28699779 -0.99998974 +v -0.53143465 1.24999797 -0.99998974 +v -0.49999523 1.20322024 0.99998986 +v -0.51049029 1.079741 0.99998986 +v -0.51049029 1.14419519 0.99998974 +v -0.50668215 1.22035658 -0.99998974 +v -0.49999523 1.22035658 -0.99998974 +v -0.51049029 1.079741 -0.99998986 +v -0.51049029 1.14419519 -0.99998974 +v -0.41909658 1.21793329 0.99998974 +v -0.41909658 1.21351254 0.99998974 +v -0.41909658 1.17275571 0.99998974 +v -0.41909658 1.14419519 0.99998974 +v -0.51049029 1.05660963 0.99998974 +v -0.51049029 1.02995312 0.99998986 +v -0.49999523 1.02995312 0.99998974 +v -0.51049029 1.18393266 0.99998974 +v -0.51049029 1.18798804 0.99998986 +v -0.46860146 1.02995312 -0.99998974 +v -0.49999523 1.02995312 -0.99998974 +v -0.46860146 1.02995312 0.99998974 +v -0.44423866 1.02995312 0.99998974 +v -0.42671275 1.02995312 -0.99998974 +v -0.44423866 1.02995312 -0.99998974 +v -0.51049029 1.05660963 -0.99998974 +v -0.51049029 1.02995312 -0.99998974 +v -0.51049029 1.18798804 -0.99998974 +v -0.51049029 1.18393266 -0.99998974 +v -0.42671275 1.02995312 0.99998974 +v -0.41909658 1.07974112 0.99998974 +v -0.41909658 1.05660963 0.99998974 +v -0.41909658 1.19985055 0.99998974 +v -0.41909658 1.21793329 -0.99998974 +v -0.41909658 1.21351254 -0.99998974 +v -0.41909658 1.17275571 -0.99998974 +v -0.41909658 1.14419519 -0.99998974 +v -0.41909658 1.07974112 -0.99998974 +v -0.41909658 1.05660963 -0.99998974 +v -0.41909658 1.19985055 -0.99998974 +v -0.51049029 1.17275571 0.99998974 +v -0.51049029 1.17275571 -0.99998974 +v -0.41909658 1.02995312 0.99998974 +v -0.41909658 1.02995312 -0.99998974 +v -0.51049029 1.20322024 0.99998974 +v -0.51049029 1.22035658 0.99998974 +v -0.50668215 1.22035658 0.99998974 +v -0.51049029 1.20322024 -0.99998974 +v -0.51049029 1.22035658 -0.99998974 +v -0.51049029 1.19985008 0.99998974 +v -0.51049029 1.19985008 -0.99998974 +v -0.49999523 1.22035658 0.99998974 +v -0.49477052 1.22035658 -0.99998974 +v -0.46860146 1.22035658 -0.99998974 +v -0.48954582 1.22035658 -0.99998974 +v -0.46860146 1.22035658 0.99998974 +v -0.44423866 1.22035658 0.99998974 +v -0.42671275 1.22035658 -0.99998974 +v -0.44423866 1.22035658 -0.99998974 +v -0.48954582 1.22035658 0.99998974 +v -0.49477052 1.22035658 0.99998986 +v -0.42671275 1.22035658 0.99998974 +v -0.42290473 1.22035658 0.99998974 +v -0.41909658 1.20322024 0.99998974 +v -0.41909658 1.20322024 -0.99998974 +v -0.42290473 1.22035658 -0.99998974 +v -0.41909658 1.22035658 0.99998974 +v -0.41909658 1.22035658 -0.99998974 +v -0.43813693 1.07974112 -0.99998986 +v -0.43813693 1.14419519 -0.99998974 +v -0.43813693 1.07974112 0.99998986 +v -0.43813693 1.14419519 0.99998974 +v -0.53905081 1.03566527 -0.99998974 +v -0.43813693 1.17275571 -0.99998974 +v -0.43813693 1.17275571 -0.99998986 +v -0.53905081 1.03566527 0.99998974 +v -0.43813693 1.17275571 0.99998974 +v -0.43813693 1.17275571 0.99998986 +v -0.43813693 1.05660963 -0.99998974 +v -0.43813693 1.05660963 0.99998974 +v -0.51049029 1.03566527 0.99998974 +v -0.49999523 1.03566527 0.99998974 +v -0.46860146 1.03566527 -0.99998974 +v -0.49999523 1.03566527 -0.99998974 +v -0.46860146 1.03566527 0.99998974 +v -0.44423866 1.03566527 0.99998974 +v -0.44423866 1.03566527 -0.99998974 +v -0.43813693 1.03566527 -0.99998974 +v -0.51049029 1.03566527 -0.99998974 +v -0.43813693 1.03566527 0.99998974 +v -0.48002576 1.19985008 -0.99998974 +v -0.48002576 1.20322024 -0.99998974 +v -0.53905081 1.02233707 0.99998974 +v -0.49999523 1.02233707 0.99998974 +v -0.49999523 1.02233707 -0.99998974 +v -0.48002576 1.02233707 -0.99998974 +v -0.48002576 1.02804911 -0.99998974 +v -0.48002576 1.079741 -0.99998974 +v -0.48002576 1.14419519 -0.99998974 +v -0.53905081 1.20702838 -0.99998974 +v -0.55342888 1.20702838 -0.99998986 +v -0.58093953 1.20702838 0.99998974 +v -0.56761121 1.20702838 0.99998974 +v -0.53905081 1.02233707 -0.99998974 +v -0.55342888 1.02233707 -0.99998974 +v -0.58093953 1.02233707 0.99998974 +v -0.55342888 1.02233707 0.99998974 +v -0.58093953 1.20702838 -0.99998974 +v -0.58474755 1.20702838 -0.99998974 +v -0.56761121 1.20702838 -0.99998974 +v -0.58474755 1.02804911 -0.99998974 +v -0.58474755 1.02233707 -0.99998974 +v -0.58093953 1.02233707 -0.99998974 +v -0.58474755 1.17275571 -0.99998974 +v -0.58474755 1.14419519 -0.99998974 +v -0.55342888 1.20702838 0.99998986 +v -0.53905081 1.20702838 0.99998974 +v -0.48002576 1.19985008 0.99998974 +v -0.48002576 1.20322024 0.99998974 +v -0.48002576 1.02233707 0.99998986 +v -0.48002576 1.02804911 0.99998974 +v -0.48002576 1.079741 0.99998974 +v -0.48002576 1.14419519 0.99998974 +v -0.48002576 1.02995312 -0.99998974 +v -0.48002576 1.17275571 -0.99998974 +v -0.58474755 1.07974112 -0.99998974 +v -0.58474755 1.05660963 -0.99998974 +v -0.58474755 1.18798804 -0.99998974 +v -0.48002576 1.02995312 0.99998974 +v -0.48002576 1.17275571 0.99998974 +v -0.58474755 1.19985067 0.99998974 +v -0.58474755 1.20702838 0.99998974 +v -0.58474755 1.02804911 0.99998974 +v -0.58474755 1.02233707 0.99998974 +v -0.58474755 1.17275571 0.99998974 +v -0.58474755 1.14419519 0.99998974 +v -0.58474755 1.07974112 0.99998974 +v -0.58474755 1.05660963 0.99998974 +v -0.58474755 1.18798804 0.99998974 +v -0.48002576 1.05660963 -0.99998974 +v -0.48002576 1.05660963 0.99998974 +v -0.58474755 1.19985067 -0.99998974 +v -0.58474755 1.19179606 -0.99998974 +v -0.58474755 1.19179606 0.99998974 +v -0.49700963 1.20702838 -0.99998974 +v -0.49999523 1.20702838 -0.99998974 +v -0.49700963 1.20702838 0.99998974 +v -0.49999523 1.20702838 0.99998974 +v -0.53143465 1.20702838 0.99998974 +v -0.51429832 1.20702838 0.99998974 +v -0.48002576 1.20702838 -0.99998974 +v -0.49550318 1.20702838 -0.99998974 +v -0.48002576 1.20702838 0.99998974 +v -0.49550318 1.20702838 0.99998974 +v -0.53143465 1.20702838 -0.99998974 +v -0.51429832 1.20702838 -0.99998974 +v -0.50668215 1.20702838 -0.99998974 +v -0.48002576 1.03566527 -0.99998974 +v -0.48002576 1.03566527 0.99998974 +v -0.51049029 1.20702838 0.99998974 +v -0.50668215 1.20702838 0.99998974 +v -0.51049029 1.20702838 -0.99998974 +v -0.53905081 1.10801863 0.99998974 +v -0.51049029 1.10801863 0.99998974 +v -0.46860146 1.10801863 -0.99998974 +v -0.48002576 1.10801863 -0.99998974 +v -0.56761121 0.92687499 0.99998974 +v -0.56761121 0.97854423 0.99998974 +v -0.53905081 1.10801863 -0.99998974 +v -0.55342888 1.10801863 -0.99998974 +v -0.56761121 1.00000047 0.99998974 +v -0.56761121 1.02233707 0.99998974 +v -0.56761121 1.07974112 0.99998974 +v -0.56761121 1.10801863 0.99998974 +v -0.55342888 1.10801863 0.99998974 +v -0.44956111 0.92687499 0.99998986 +v -0.44956111 0.97854423 0.99998974 +v -0.44956111 1.00000047 0.99998986 +v -0.44956111 1.02804911 0.99998974 +v -0.44956111 1.07974112 0.99998986 +v -0.44956111 1.10801863 0.99998974 +v -0.46860146 1.10801863 0.99998974 +v -0.56761121 0.92687499 -0.99998974 +v -0.56761121 0.97854423 -0.99998974 +v -0.56761121 1.00000047 -0.99998974 +v -0.56761121 1.02233707 -0.99998974 +v -0.56761121 1.07974112 -0.99998974 +v -0.56761121 1.10801863 -0.99998998 +v -0.44956111 0.92687499 -0.99998986 +v -0.44956111 0.97854423 -0.99998974 +v -0.44956111 1.00000047 -0.99998986 +v -0.44956111 1.02804911 -0.99998974 +v -0.44956111 1.07974112 -0.99998986 +v -0.44956111 1.10801863 -0.99998986 +v -0.49999523 1.10801863 -0.99998974 +v -0.51049029 1.10801863 -0.99998974 +v -0.49999523 1.10801863 0.99998974 +v -0.48002576 1.10801863 0.99998974 +v -0.56761121 1.02804911 0.99998974 +v -0.56761121 1.05660963 0.99998974 +v -0.44956111 1.02995312 0.99998974 +v -0.56761121 1.02804911 -0.99998974 +v -0.56761121 1.05660963 -0.99998974 +v -0.44956111 1.02995312 -0.99998974 +v -0.53905081 0.90428698 0.99998974 +v -0.49999523 0.90428698 0.99998986 +v -0.46860146 0.90428698 -0.99998974 +v -0.49999523 0.90428698 -0.99998986 +v -0.56761121 0.90428698 0.99998986 +v -0.55342888 0.90428698 0.99998986 +v -0.53905081 0.90428698 -0.99998974 +v -0.55342888 0.90428698 -0.99998986 +v -0.46860146 0.90428698 0.99998974 +v -0.44956111 0.90428698 0.99998974 +v -0.56761121 0.90428698 -0.99998974 +v -0.44956111 0.90428698 -0.99998986 +v -0.44956111 1.05660963 0.99998974 +v -0.44956111 1.05660963 -0.99998974 +v -0.44956111 1.03566527 0.99998974 +v -0.44956111 1.03566527 -0.99998974 +v -0.43052077 0.92687499 -0.99998974 +v -0.43052077 0.97854423 -0.99998974 +v -0.43052077 1.00000047 -0.99998974 +v -0.43052077 1.02804911 -0.99998974 +v -0.55999517 0.97854423 -0.99998974 +v -0.55999517 0.92687499 -0.99998974 +v -0.55999517 1.02233707 -0.99998974 +v -0.55999517 1.00000047 -0.99998974 +v -0.43052077 0.92687499 0.99998974 +v -0.43052077 0.97854423 0.99998974 +v -0.43052077 1.00000047 0.99998974 +v -0.43052077 1.02804911 0.99998974 +v -0.53905081 1.0528016 -0.99998974 +v -0.55342888 1.0528016 -0.99998974 +v -0.43052077 1.02995312 -0.99998974 +v -0.55999517 1.02804911 -0.99998974 +v -0.55999517 1.0528016 -0.99998974 +v -0.55342888 1.0528016 0.99998974 +v -0.55081486 1.0528016 0.99998974 +v -0.43052077 1.02995312 0.99998974 +v -0.55999517 0.86811029 0.99998974 +v -0.55999517 0.90428698 0.99998974 +v -0.43052077 0.86811029 -0.99998974 +v -0.55999517 0.86811029 -0.99998974 +v -0.55999517 0.90428698 -0.99998974 +v -0.43052077 0.86811029 0.99998974 +v -0.53905081 0.86049413 0.99998974 +v -0.49999523 0.86049413 0.99998974 +v -0.46860146 0.86049413 -0.99998974 +v -0.49999523 0.86049413 -0.99998974 +v -0.55999517 0.86049413 0.99998974 +v -0.55342888 0.86049413 0.99998974 +v -0.53905081 0.86049413 -0.99998974 +v -0.55342888 0.86049413 -0.99998974 +v -0.46860146 0.86049413 0.99998974 +v -0.44423866 0.86049413 0.99998974 +v -0.44423866 0.86049413 -0.99998974 +v -0.43052077 0.86049413 -0.99998974 +v -0.55999517 0.86049413 -0.99998974 +v -0.43052077 0.86049413 0.99998974 +v -0.49999523 1.0528016 0.99998974 +v -0.51049029 1.0528016 0.99998974 +v -0.43052077 1.03185725 -0.99998974 +v -0.43052077 1.0528016 -0.99998974 +v -0.43813693 1.0528016 -0.99998974 +v -0.51049029 1.0528016 -0.99998974 +v -0.49999523 1.0528016 -0.99998974 +v -0.43052077 1.03185725 0.99998974 +v -0.43052077 1.0528016 0.99998974 +v -0.43813693 1.0528016 0.99998974 +v -0.53905081 1.0528016 0.99998974 +v -0.46860146 1.0528016 -0.99998974 +v -0.48002576 1.0528016 -0.99998974 +v -0.46860146 1.0528016 0.99998974 +v -0.44956111 1.0528016 0.99998974 +v -0.44423866 1.0528016 -0.99998974 +v -0.44956111 1.0528016 -0.99998974 +v -0.48002576 1.0528016 0.99998974 +v -0.44423866 1.0528016 0.99998974 +v -0.55999517 0.97854423 0.99998974 +v -0.55999517 0.92687499 0.99998974 +v -0.55999517 1.02233707 0.99998974 +v -0.55999517 1.00000047 0.99998974 +v -0.55999517 1.02804911 0.99998974 +v -0.55999517 1.0528016 0.99998974 +v -0.56761121 0.97854423 0.99998974 +v -0.56761121 0.92687499 0.99998974 +v -0.56761121 1.02233707 0.99998974 +v -0.56761121 1.00000047 0.99998974 +v -0.66662108 0.92687499 -0.99998974 +v -0.66662108 0.97854423 -0.99998974 +v -0.66662108 1.00000047 -0.99998974 +v -0.66662108 1.02804911 -0.99998974 +v -0.66662108 0.92687499 0.99998974 +v -0.66662108 0.97854423 0.99998974 +v -0.66662108 1.00000047 0.99998974 +v -0.66662108 1.02804911 0.99998974 +v -0.56761121 1.02804911 0.99998974 +v -0.56761121 1.03947329 0.99998974 +v -0.58093953 1.03947329 0.99998974 +v -0.66662108 1.03947329 -0.99998974 +v -0.64758074 1.03947329 -0.99998974 +v -0.66662108 1.03947329 0.99998974 +v -0.64758074 1.03947329 0.99998974 +v -0.66662108 0.89286267 -0.99998974 +v -0.64758074 0.89286267 -0.99998974 +v -0.66662108 0.89286267 0.99998974 +v -0.64758074 0.89286267 0.99998974 +v -0.62282824 0.89286267 0.99998974 +v -0.58093953 0.89286267 -0.99998974 +v -0.62282824 0.89286267 -0.99998974 +v -0.58093953 0.89286267 0.99998974 +v -0.62282824 1.03947329 0.99998974 +v -0.62282824 1.03947329 -0.99998974 +v -0.58474755 1.03947329 -0.99998974 +v -0.58474755 1.03947329 0.99998974 +v -0.58093953 1.03947329 -0.99998974 +v -0.56761121 0.97854423 -0.99998974 +v -0.56761121 0.92687499 -0.99998974 +v -0.56761121 1.02233707 -0.99998974 +v -0.56761121 1.00000047 -0.99998974 +v -0.56761121 1.02804911 -0.99998974 +v -0.56761121 1.03947329 -0.99998974 +v -0.57182014 0.89286267 0.99998974 +v -0.56761121 0.90428733 0.99998974 +v -0.56761121 0.90428674 0.99998974 +v -0.57182014 0.89286267 -0.99998974 +v -0.56761121 0.90428733 -0.99998974 +v -0.56761121 0.90428674 -0.99998974 +v -0.56761121 0.89286267 0.99998974 +v -0.56761121 0.89286267 -0.99998974 +v -0.52953064 0.92687499 0.99998974 +v -0.52953064 0.97854423 0.99998974 +v -0.52953064 0.82622158 0.99998974 +v -0.52953064 0.82050943 0.99998974 +v -0.49999523 0.82050943 0.99998974 +v -0.46860146 0.82050943 -0.99998974 +v -0.49999523 0.82050943 -0.99998974 +v -0.46860146 0.82050943 0.99998974 +v -0.44423866 0.82050943 0.99998974 +v -0.42671275 0.82050943 -0.99998974 +v -0.44423866 0.82050943 -0.99998974 +v -0.52953064 0.92687499 -0.99998974 +v -0.52953064 0.97854423 -0.99998974 +v -0.52953064 0.82622158 -0.99998974 +v -0.52953064 0.82050943 -0.99998974 +v -0.40196025 0.97854423 0.99998974 +v -0.40196025 0.92687499 0.99998974 +v -0.42671275 0.82050943 0.99998974 +v -0.40196025 0.82050943 0.99998974 +v -0.40196025 0.82622158 0.99998974 +v -0.52953064 0.98996841 0.99998986 +v -0.49999511 0.98996841 0.99998986 +v -0.46860146 0.98996841 -0.99998974 +v -0.49999511 0.98996841 -0.99998986 +v -0.52953064 0.86811029 0.99998974 +v -0.52953064 0.90428698 0.99998974 +v -0.46860146 0.98996841 0.99998974 +v -0.44956111 0.98996841 0.99998974 +v -0.42671275 0.98996841 -0.99998974 +v -0.43052077 0.98996841 -0.99998974 +v -0.44423866 0.98996841 -0.99998986 +v -0.44956111 0.98996841 -0.99998974 +v -0.52953064 0.98996841 -0.99998986 +v -0.52953064 0.86811029 -0.99998974 +v -0.52953064 0.90428698 -0.99998974 +v -0.44423866 0.98996841 0.99998986 +v -0.43052077 0.98996841 0.99998974 +v -0.40196025 0.98996841 0.99998974 +v -0.42671275 0.98996841 0.99998974 +v -0.40196025 0.86811029 0.99998974 +v -0.52953064 0.86049413 0.99998974 +v -0.52953064 0.86049413 -0.99998974 +v -0.40196025 0.97854423 -0.99998974 +v -0.40196025 0.92687499 -0.99998974 +v -0.40196025 0.82050943 -0.99998974 +v -0.40196025 0.82622158 -0.99998974 +v -0.40196025 0.98996841 -0.99998974 +v -0.40196025 0.86811029 -0.99998974 +v -0.42671275 0.92903935 -0.99998974 +v -0.43052077 0.92903935 -0.99998974 +v -0.4324249 0.82050943 -0.99998974 +v -0.4324249 0.8052771 -0.99998986 +v -0.42671275 0.8052771 -0.99998974 +v -0.36578369 0.92687499 -0.99998974 +v -0.36578369 0.92903935 -0.99998974 +v -0.40196025 0.92903935 -0.99998974 +v -0.40196025 0.8052771 -0.99998974 +v -0.36578369 0.8052771 -0.99998986 +v -0.36578369 0.82622158 -0.99998974 +v -0.4324249 0.92687499 0.99998974 +v -0.4324249 0.92903935 0.99998974 +v -0.43052077 0.92903935 0.99998974 +v -0.42671275 0.92903935 0.99998974 +v -0.40196025 0.92903935 0.99998974 +v -0.4324249 0.82050943 0.99998974 +v -0.4324249 0.8052771 0.99998998 +v -0.42671275 0.8052771 0.99998974 +v -0.40196025 0.8052771 0.99998974 +v -0.36578369 0.86811029 -0.99998974 +v -0.4324249 0.86811029 0.99998974 +v -0.36578369 0.92687499 0.99998974 +v -0.36578369 0.92903935 0.99998974 +v -0.36578369 0.8052771 0.99998986 +v -0.36578369 0.82622158 0.99998974 +v -0.36578369 0.86811029 0.99998974 +v -0.4324249 0.92687499 -0.99998974 +v -0.4324249 0.92903935 -0.99998962 +v -0.4324249 0.86811029 -0.99998974 +v -0.4324249 0.82622158 -0.99998974 +v -0.4324249 0.86049413 -0.99998974 +v -0.4324249 0.86049413 0.99998974 +v -0.4324249 0.82622158 0.99998974 +v -0.51620233 0.97854423 -0.99998974 +v -0.51620233 0.92687499 -0.99998974 +v -0.4210006 0.97854423 0.99998974 +v -0.4210006 0.92903935 0.99998974 +v -0.46860146 0.98044824 -0.99998974 +v -0.49999523 0.98044824 -0.99998974 +v -0.51620233 0.90428698 -0.99998974 +v -0.51620233 0.86811029 -0.99998974 +v -0.49999523 0.98044824 0.99998974 +v -0.46860146 0.98044824 0.99998974 +v -0.4210006 0.92687499 0.99998974 +v -0.4210006 0.86811029 0.99998974 +v -0.46860146 0.84526193 -0.99998974 +v -0.49999523 0.84526193 -0.99998974 +v -0.46860146 0.84526193 0.99998974 +v -0.44423866 0.84526193 0.99998974 +v -0.42671275 0.84526193 -0.99998974 +v -0.42882823 0.84526193 -0.99998974 +v -0.44423866 0.84526193 -0.99998974 +v -0.51620233 0.86049413 -0.99998974 +v -0.51620233 0.84526193 -0.99998974 +v -0.49999523 0.84526193 0.99998974 +v -0.42671275 0.84526193 0.99998974 +v -0.42882823 0.84526193 0.99998974 +v -0.4210006 0.84526193 0.99998974 +v -0.4324249 0.84526193 -0.99998974 +v -0.4324249 0.84526193 0.99998974 +v -0.51620233 0.97854423 0.99998974 +v -0.51620233 0.92687499 0.99998974 +v -0.51620233 0.98044824 0.99998974 +v -0.51620233 0.90428698 0.99998974 +v -0.51620233 0.86811029 0.99998974 +v -0.44956111 0.98044824 0.99998974 +v -0.43052077 0.98044824 -0.99998974 +v -0.42671275 0.98044824 -0.99998974 +v -0.44956111 0.98044824 -0.99998974 +v -0.44423866 0.98044824 -0.99998974 +v -0.51620233 0.98044824 -0.99998974 +v -0.43052077 0.98044824 0.99998974 +v -0.44423866 0.98044824 0.99998974 +v -0.4210006 0.98044824 0.99998974 +v -0.42671275 0.98044824 0.99998974 +v -0.51620233 0.86049413 0.99998974 +v -0.51620233 0.84526193 0.99998974 +v -0.4210006 0.97854423 -0.99998974 +v -0.4210006 0.92903935 -0.99998974 +v -0.4210006 0.98044824 -0.99998974 +v -0.4210006 0.92687499 -0.99998974 +v -0.4210006 0.86811029 -0.99998974 +v -0.4210006 0.84526193 -0.99998974 +v -0.4857378 0.92687499 -0.99998986 +v -0.4857378 0.97854423 -0.99998974 +v -0.46860146 1.0261451 -0.99998974 +v -0.48002576 1.0261451 -0.99998974 +v -0.46860146 1.0261451 0.99998974 +v -0.44956111 1.0261451 0.99998974 +v -0.42671275 1.0261451 -0.99998974 +v -0.43052077 1.0261451 -0.99998974 +v -0.44423866 1.0261451 -0.99998974 +v -0.44956111 1.0261451 -0.99998974 +v -0.4857378 0.92687499 0.99998986 +v -0.4857378 0.97854423 0.99998974 +v -0.48002576 1.0261451 0.99998974 +v -0.37911188 0.97854423 -0.99998974 +v -0.37911188 0.92903935 -0.99998974 +v -0.37911188 1.00000047 -0.99998974 +v -0.37911188 1.0261451 -0.99998974 +v -0.40196025 1.0261451 -0.99998974 +v -0.44423866 1.0261451 0.99998974 +v -0.43052077 1.0261451 0.99998974 +v -0.42671275 1.0261451 0.99998974 +v -0.40196025 1.0261451 0.99998974 +v -0.4857378 0.98044824 -0.99998974 +v -0.4857378 0.90428698 -0.99998974 +v -0.4857378 0.87191832 -0.99998974 +v -0.46860146 0.87191832 -0.99998974 +v -0.44423866 0.87191832 0.99998974 +v -0.44479894 0.87191832 0.99998974 +v -0.42671275 0.87191832 -0.99998974 +v -0.43052077 0.87191832 -0.99998974 +v -0.44423866 0.87191832 -0.99998974 +v -0.44479894 0.87191832 -0.99998974 +v -0.4857378 0.98044824 0.99998974 +v -0.4857378 0.90428698 0.99998974 +v -0.4857378 0.87191832 0.99998974 +v -0.46860146 0.87191832 0.99998974 +v -0.4324249 0.87191832 0.99998974 +v -0.42671275 0.87191832 0.99998974 +v -0.4210006 0.87191832 0.99998974 +v -0.37911188 0.97854423 0.99998974 +v -0.37911188 0.92903935 0.99998974 +v -0.37911188 1.00000047 0.99998974 +v -0.37911188 1.0261451 0.99998974 +v -0.40196025 0.87191832 -0.99998974 +v -0.40196025 0.87191832 0.99998974 +v -0.37911188 0.87191832 0.99998974 +v -0.37911188 0.92687499 0.99998974 +v -0.4857378 1.00000023 -0.99998986 +v -0.4857378 1.02233707 -0.99998974 +v -0.4857378 1.0261451 -0.99998974 +v -0.4857378 1.02233707 0.99998974 +v -0.4857378 1.0261451 0.99998974 +v -0.4857378 1.00000023 0.99998986 +v -0.4324249 0.87191832 -0.99998974 +v -0.43052077 0.87191832 0.99998974 +v -0.4857378 0.98996841 -0.99998974 +v -0.4857378 0.98996841 0.99998974 +v -0.4210006 0.87191832 -0.99998974 +v -0.37911188 0.92687499 -0.99998974 +v -0.37911188 0.87191832 -0.99998974 +v -0.46098542 0.75000262 0.99998974 +v -0.46098542 0.7767167 0.99998974 +v -0.46098542 0.80403614 0.99998974 +v -0.46098542 0.80908525 0.99998998 +v -0.44423866 0.80908525 0.99998974 +v -0.46098542 0.75000262 -0.99998974 +v -0.46098542 0.7767167 -0.99998974 +v -0.46098542 0.80403614 -0.99998974 +v -0.46098542 0.80908525 -0.99998986 +v -0.44423866 0.80908525 -0.99998974 +v -0.46098542 0.73482787 0.99998974 +v -0.44423866 0.73482787 0.99998986 +v -0.42671275 0.73482787 -0.99998974 +v -0.44423866 0.73482787 -0.99998986 +v -0.46098542 0.73482787 -0.99998974 +v -0.42671275 0.73482787 0.99998974 +v -0.4324249 0.80908525 -0.99998974 +v -0.42671275 0.80908525 -0.99998974 +v -0.4324249 0.80908525 0.99998986 +v -0.42671275 0.80908525 0.99998974 +v -0.61711621 0.69088423 0.99998974 +v -0.61711621 0.68722701 0.99998974 +v -0.60528981 0.68722701 0.99998974 +v -0.45336926 0.70030546 0.99998986 +v -0.45336926 0.71959567 0.99998974 +v -0.45336926 0.82050943 0.99998974 +v -0.45336926 0.80908525 0.99998974 +v -0.53905081 0.68722701 0.99998974 +v -0.55342912 0.68722701 0.99998986 +v -0.46860146 0.68722701 -0.99998974 +v -0.45336926 0.68722701 -0.99998986 +v -0.45336926 0.70030546 -0.99998986 +v -0.53905081 0.68722701 -0.99998974 +v -0.49999535 0.68722701 -0.99998986 +v -0.46860146 0.68722701 0.99998974 +v -0.49999535 0.68722701 0.99998986 +v -0.57088756 0.68722701 -0.99998974 +v -0.55342912 0.68722701 -0.99998986 +v -0.58093953 0.68722701 -0.99998974 +v -0.58093953 0.68722701 0.99998974 +v -0.57088756 0.68722701 0.99998974 +v -0.61711621 0.71959567 -0.99998974 +v -0.61711621 0.70030546 -0.99998974 +v -0.61711621 0.7767167 -0.99998974 +v -0.61711621 0.75000286 -0.99998974 +v -0.61711621 0.82622158 -0.99998974 +v -0.61711621 0.80403649 -0.99998974 +v -0.45336926 0.71959567 -0.99998974 +v -0.45336926 0.7767167 -0.99998974 +v -0.45336926 0.75000262 -0.99998974 +v -0.45336926 0.82050943 -0.99998974 +v -0.45336926 0.80908525 -0.99998974 +v -0.45336926 0.68722701 0.99998986 +v -0.53905081 0.84716594 0.99998974 +v -0.52953064 0.84716594 0.99998974 +v -0.55342888 0.84716594 0.99998974 +v -0.56814014 0.84716594 0.99998974 +v -0.53905081 0.84716594 -0.99998974 +v -0.55342888 0.84716594 -0.99998974 +v -0.61711621 0.69088423 -0.99998974 +v -0.60528981 0.68722701 -0.99998974 +v -0.61711621 0.70030546 0.99998974 +v -0.45336926 0.82622158 0.99998974 +v -0.45336926 0.84526193 0.99998974 +v -0.61711621 0.84716594 -0.99998974 +v -0.58093953 0.84716594 -0.99998974 +v -0.56814014 0.84716594 -0.99998974 +v -0.45336926 0.82622158 -0.99998974 +v -0.45336926 0.84526193 -0.99998974 +v -0.45336926 0.73482787 0.99998974 +v -0.45336926 0.73482787 -0.99998974 +v -0.45336926 0.80403614 -0.99998974 +v -0.61711621 0.68722701 -0.99998974 +v -0.61711621 0.71959567 0.99998974 +v -0.61711621 0.7767167 0.99998974 +v -0.61711621 0.75000286 0.99998974 +v -0.61711621 0.82622158 0.99998974 +v -0.61711621 0.80403649 0.99998974 +v -0.61711621 0.84716594 0.99998974 +v -0.58093953 0.84716594 0.99998974 +v -0.52953064 0.84716594 -0.99998974 +v -0.46860146 0.84716594 -0.99998974 +v -0.49999523 0.84716594 -0.99998974 +v -0.45336926 0.84716594 0.99998974 +v -0.46860146 0.84716594 0.99998974 +v -0.45336926 0.84716594 -0.99998974 +v -0.51620233 0.84716594 -0.99998974 +v -0.49999523 0.84716594 0.99998974 +v -0.51620233 0.84716594 0.99998974 +v -0.45336926 0.7767167 0.99998974 +v -0.45336926 0.75000262 0.99998974 +v -0.45336926 0.80403614 0.99998974 +v -0.52191448 0.70030546 0.99998986 +v -0.52191448 0.71959567 0.99998974 +v -0.52191448 0.75000262 0.99998986 +v -0.52191448 0.7767167 0.99998974 +v -0.52191448 0.80403614 0.99998986 +v -0.52191448 0.82050943 0.99998974 +v -0.52191448 0.70030546 -0.99998986 +v -0.52191448 0.68722701 -0.99998974 +v -0.58093953 0.65485847 0.99998974 +v -0.55342924 0.65485847 0.99998974 +v -0.58312249 0.65485847 -0.99998974 +v -0.61409676 0.65485847 -0.99998974 +v -0.58312249 0.65485847 0.99998974 +v -0.61409676 0.65485847 0.99998974 +v -0.52191448 0.71959567 -0.99998974 +v -0.52191448 0.75000262 -0.99998986 +v -0.52191448 0.7767167 -0.99998974 +v -0.52191448 0.80403614 -0.99998986 +v -0.52191448 0.82050943 -0.99998974 +v -0.52191448 0.68722701 0.99998974 +v -0.62282824 0.65485847 -0.99998974 +v -0.62282824 0.65485847 -0.99998986 +v -0.62282824 0.65485847 0.99998974 +v -0.62282824 0.65485847 0.99998986 +v -0.53905081 0.65485847 0.99998974 +v -0.53905081 0.65485847 -0.99998974 +v -0.52191448 0.65485847 -0.99998986 +v -0.52191448 0.67580282 -0.99998974 +v -0.58093953 0.65485847 -0.99998974 +v -0.55342924 0.65485847 -0.99998974 +v -0.62282824 0.86239814 0.99998974 +v -0.58093953 0.86239814 -0.99998974 +v -0.62127053 0.86239814 -0.99998974 +v -0.52191448 0.82622158 -0.99998974 +v -0.52191448 0.83710169 -0.99998974 +v -0.52191448 0.65485847 0.99998974 +v -0.52191448 0.67580282 0.99998974 +v -0.58093953 0.86239814 0.99998974 +v -0.62127053 0.86239814 0.99998974 +v -0.62282824 0.86239814 -0.99998974 +v -0.53905081 0.86239814 0.99998974 +v -0.52953064 0.86239814 0.99998974 +v -0.55999517 0.86239814 0.99998974 +v -0.55342888 0.86239814 0.99998974 +v -0.5652312 0.86239814 0.99998974 +v -0.53905081 0.86239814 -0.99998974 +v -0.55342888 0.86239814 -0.99998974 +v -0.5652312 0.86239814 -0.99998974 +v -0.55999517 0.86239814 -0.99998974 +v -0.52191448 0.82622158 0.99998974 +v -0.52191448 0.83710169 0.99998974 +v -0.52191448 0.86049413 0.99998974 +v -0.52191448 0.86239814 0.99998974 +v -0.52953064 0.86239814 -0.99998974 +v -0.52191448 0.86049413 -0.99998974 +v -0.52191448 0.84716594 -0.99998974 +v -0.52191448 0.86239814 -0.99998974 +v -0.52191448 0.84716594 0.99998974 +v -0.44423878 0.58821725 -0.99998986 +v -0.46860146 0.58821725 -0.99998974 +v -0.48954582 0.61016833 0.99998974 +v -0.48954582 0.58821725 0.99998986 +v -0.46860146 0.58821725 0.99998974 +v -0.44423878 0.68341898 -0.99998974 +v -0.45032584 0.68341898 -0.99998974 +v -0.42861676 0.67580282 0.99998974 +v -0.42861676 0.68341898 0.99998974 +v -0.44423878 0.68341898 0.99998974 +v -0.48954582 0.63969719 0.99998974 +v -0.42861676 0.58821725 -0.99998974 +v -0.42861676 0.61016833 -0.99998974 +v -0.42861676 0.63467049 0.99998974 +v -0.42861676 0.61016833 0.99998974 +v -0.42861676 0.63467049 -0.99998974 +v -0.48954582 0.61016833 -0.99998974 +v -0.48954582 0.58821725 -0.99998998 +v -0.44423878 0.58821725 0.99998986 +v -0.45032584 0.68341898 0.99998974 +v -0.48954582 0.63969719 -0.99998974 +v -0.42861676 0.63969719 0.99998974 +v -0.42861676 0.63969719 -0.99998974 +v -0.42861676 0.58821725 0.99998986 +v -0.42861676 0.67580282 -0.99998974 +v -0.42861676 0.68341898 -0.99998974 +v -0.48954582 0.67580282 0.99998974 +v -0.48954582 0.67580282 -0.99998974 +v -0.46860146 0.68341898 -0.99998974 +v -0.48954582 0.68341898 1.00095963 +v -0.46860146 0.68341898 0.99998974 +v -0.48954582 0.68341898 -0.99998986 +v -0.51049029 0.56381797 0.99998986 +v -0.51049029 0.56346488 0.99998998 +v -0.49999523 0.56346488 0.99998986 +v -0.49999523 0.56346488 -0.99998986 +v -0.46860146 0.56346488 -0.99998974 +v -0.51049029 0.61016833 -0.99998974 +v -0.51049029 0.56381797 -0.99998986 +v -0.44423866 0.56346488 0.99998986 +v -0.46860146 0.56346488 0.99998974 +v -0.44423866 0.56346488 -0.99998986 +v -0.42671275 0.56346488 -0.99998974 +v -0.44672274 0.69674718 -0.99998986 +v -0.44423878 0.69674718 -0.99998986 +v -0.46860146 0.69674718 0.99998974 +v -0.49999523 0.69674718 0.99998986 +v -0.44423878 0.69674718 0.99998986 +v -0.42711412 0.69674718 0.99998974 +v -0.51049029 0.63969719 -0.99998974 +v -0.51049029 0.61016833 0.99998974 +v -0.51049029 0.56346488 -0.99998998 +v -0.51049029 0.68722701 0.99998974 +v -0.51049029 0.69674718 0.99998986 +v -0.49999523 0.69674718 -0.99998986 +v -0.46860146 0.69674718 -0.99998974 +v -0.44672274 0.69674718 0.99998986 +v -0.51049029 0.63969719 0.99998974 +v -0.36578369 0.61445272 0.99998974 +v -0.36578369 0.63969719 0.99998974 +v -0.40196025 0.56346488 -0.99998974 +v -0.36578369 0.63969719 -0.99998974 +v -0.36578369 0.61445272 -0.99998974 +v -0.36578369 0.67580282 0.99998974 +v -0.36578369 0.69674718 0.99998974 +v -0.40196025 0.69674718 0.99998974 +v -0.42671275 0.56346488 0.99998974 +v -0.40196025 0.56346488 0.99998974 +v -0.36578369 0.56346488 0.99998986 +v -0.36578369 0.56381821 0.99998974 +v -0.36578369 0.61016833 0.99998974 +v -0.42711412 0.69674718 -0.99998974 +v -0.42671275 0.69674718 -0.99998974 +v -0.40196025 0.69674718 -0.99998974 +v -0.51049029 0.67580282 -0.99998974 +v -0.51049029 0.64695656 -0.99998974 +v -0.51049029 0.67580282 0.99998974 +v -0.51049029 0.64695656 0.99998974 +v -0.36578369 0.56346488 -0.99998986 +v -0.36578369 0.56381821 -0.99998974 +v -0.42671275 0.69674718 0.99998974 +v -0.36578369 0.61016833 -0.99998974 +v -0.36578369 0.67580282 -0.99998974 +v -0.36578369 0.69674718 -0.99998974 +v -0.45336926 0.69674718 -0.99998974 +v -0.45336926 0.69674718 0.99998974 +v -0.51049029 0.68722701 -0.99998974 +v -0.51049029 0.69674718 -0.99998998 +v -0.49716198 0.56346488 -0.99998974 +v -0.49716198 0.54632854 -0.99998986 +v -0.46860146 0.54632854 -0.99998974 +v -0.46860146 0.54632854 0.99998974 +v -0.44423866 0.54632854 0.99998974 +v -0.49716198 0.56381797 0.99998986 +v -0.49716198 0.57043337 0.99998986 +v -0.44423866 0.54632854 -0.99998974 +v -0.4324249 0.54632854 -0.99998986 +v -0.4324249 0.56346488 -0.99998974 +v -0.4442389 0.6320101 -0.99998974 +v -0.46860146 0.6320101 -0.99998974 +v -0.49716198 0.61016833 0.99998974 +v -0.49716198 0.6320101 0.99998974 +v -0.48954582 0.6320101 0.99998974 +v -0.4324249 0.61016833 0.99998974 +v -0.4324249 0.6320101 0.99998986 +v -0.4442389 0.6320101 0.99998974 +v -0.4324249 0.61016833 -0.99998974 +v -0.4324249 0.6320101 -0.99998974 +v -0.49716198 0.56381797 -0.99998986 +v -0.49716198 0.57043337 -0.99998986 +v -0.49716198 0.56346488 0.99998974 +v -0.49716198 0.54632854 0.99998986 +v -0.48954582 0.6320101 -0.99998974 +v -0.46860146 0.6320101 0.99998974 +v -0.4324249 0.54632854 0.99998986 +v -0.4324249 0.56346488 0.99998974 +v -0.4324249 0.56381821 -0.99998974 +v -0.4324249 0.58821725 -0.99998974 +v -0.49716198 0.61016833 -0.99998974 +v -0.49716198 0.6320101 -0.99998974 +v -0.4324249 0.58821725 0.99998974 +v -0.4324249 0.56381821 0.99998974 +v -0.49999511 0.49111151 0.99998986 +v -0.53905081 0.49111151 0.99998974 +v -0.49999511 0.49111151 -0.99998986 +v -0.46860146 0.49111151 -0.99998974 +v -0.45908129 0.61016833 -0.99998974 +v -0.45908129 0.58821725 -0.99998974 +v -0.55342888 0.49111151 0.99998986 +v -0.58093953 0.49111151 0.99998974 +v -0.55342888 0.49111151 -0.99998986 +v -0.53905081 0.49111151 -0.99998974 +v -0.58665156 0.67580282 0.99998974 +v -0.58665156 0.67599225 0.99998974 +v -0.46860146 0.49111151 0.99998974 +v -0.45908129 0.49111151 0.99998986 +v -0.45908129 0.50000536 0.99998974 +v -0.45908129 0.54632854 0.99998974 +v -0.45908129 0.63969719 -0.99998974 +v -0.45908129 0.6320101 -0.99998974 +v -0.58665156 0.50000548 -0.99998974 +v -0.58665156 0.49111151 -0.99998974 +v -0.58093953 0.49111151 -0.99998974 +v -0.58665156 0.56381821 -0.99998974 +v -0.58665156 0.61016833 -0.99998974 +v -0.55342924 0.685323 -0.99998974 +v -0.57342946 0.685323 -0.99998974 +v -0.58665156 0.50000548 0.99998974 +v -0.58665156 0.49111151 0.99998986 +v -0.58665156 0.56381821 0.99998974 +v -0.58665156 0.63173449 -0.99998974 +v -0.58665156 0.63969719 -0.99998974 +v -0.58665156 0.63173449 0.99998986 +v -0.58665156 0.63969719 0.99998974 +v -0.58665156 0.61016833 0.99998986 +v -0.58665156 0.64087283 -0.99998974 +v -0.58665156 0.65485847 -0.99998974 +v -0.58665156 0.64087283 0.99998974 +v -0.58665156 0.65485847 0.99998974 +v -0.45908129 0.49111151 -0.99998998 +v -0.45908129 0.50000536 -0.99998974 +v -0.45908129 0.54632854 -0.99998974 +v -0.45908129 0.61016833 0.99998974 +v -0.45908129 0.58821725 0.99998974 +v -0.45908129 0.63969719 0.99998974 +v -0.45908129 0.6320101 0.99998974 +v -0.45908129 0.67580282 -0.99998974 +v -0.57342946 0.685323 0.99998974 +v -0.55342924 0.685323 0.99998974 +v -0.45908129 0.67580282 0.99998974 +v -0.58665156 0.67580282 -0.99998974 +v -0.58665156 0.67599225 -0.99998974 +v -0.58665156 0.67541813 -0.99998974 +v -0.58665156 0.67541813 0.99998974 +v -0.58665156 0.68146359 0.99998974 +v -0.53905081 0.685323 0.99998974 +v -0.45908129 0.68341898 -0.99998974 +v -0.53905081 0.685323 -0.99998974 +v -0.52191448 0.685323 -0.99998974 +v -0.46860146 0.685323 0.99998974 +v -0.49477052 0.685323 1.00047469 +v -0.58093953 0.685323 -0.99998974 +v -0.58093953 0.685323 0.99998974 +v -0.49999535 0.685323 0.99998974 +v -0.51049029 0.685323 0.99998974 +v -0.46860146 0.685323 -0.99998974 +v -0.49477052 0.685323 -0.99998974 +v -0.45908129 0.68341898 0.99998974 +v -0.58665156 0.68146359 -0.99998974 +v -0.58665156 0.685323 -0.99998974 +v -0.58665156 0.685323 0.99998974 +v -0.51049029 0.685323 -0.99998974 +v -0.52191448 0.685323 0.99998974 +v -0.45908129 0.56381797 -0.99998974 +v -0.45908129 0.56381797 0.99998974 +v -0.45908129 0.685323 -0.99998974 +v -0.49999535 0.685323 -0.99998974 +v -0.45908129 0.685323 0.99998974 +v -0.45908129 0.56346488 0.99998974 +v -0.45908129 0.56346488 -0.99998974 +v -0.51429832 0.46008777 0.99998986 +v -0.51429832 0.49111151 0.99998974 +v -0.51429832 0.50000536 0.99998986 +v -0.51429832 0.55500376 0.99998986 +v -0.55342924 0.62058591 -0.99998974 +v -0.58093953 0.62058591 -0.99998974 +v -0.55342924 0.62058591 0.99998974 +v -0.58093953 0.62058591 0.99998974 +v -0.53905081 0.62058591 0.99998974 +v -0.61140406 0.46008813 0.99998974 +v -0.61140406 0.50000536 0.99998974 +v -0.61140406 0.56381821 0.99998974 +v -0.55342912 0.42066228 0.99998974 +v -0.53905081 0.42066228 0.99998974 +v -0.60212218 0.42066228 0.99998974 +v -0.58093953 0.42066228 0.99998974 +v -0.55342912 0.42066228 -0.99998974 +v -0.58093953 0.42066228 -0.99998974 +v -0.53905081 0.42066228 -0.99998974 +v -0.51429832 0.42066228 -0.99998974 +v -0.51429832 0.46008777 -0.99998986 +v -0.60942733 0.62058591 -0.99998974 +v -0.59464919 0.62058591 -0.99998974 +v -0.60942733 0.62058591 0.99998986 +v -0.59464919 0.62058591 0.99998986 +v -0.60212218 0.42066228 -0.99998986 +v -0.51429832 0.61016833 0.99998974 +v -0.51429832 0.56381797 0.99998974 +v -0.51429832 0.49111151 -0.99998974 +v -0.51429832 0.50000536 -0.99998986 +v -0.51429832 0.55500376 -0.99998986 +v -0.51429832 0.62058591 0.99998974 +v -0.53905081 0.62058591 -0.99998974 +v -0.51429832 0.42066228 0.99998998 +v -0.61140406 0.46008813 -0.99998974 +v -0.61140406 0.50000536 -0.99998974 +v -0.61140406 0.56381821 -0.99998974 +v -0.61140406 0.61867666 -0.99998974 +v -0.61140406 0.61867666 0.99998986 +v -0.61140406 0.42066228 0.99998974 +v -0.61140406 0.42066228 -0.99998998 +v -0.58665156 0.62058591 -0.99998974 +v -0.58665156 0.62058591 0.99998974 +v -0.51429832 0.61016833 -0.99998974 +v -0.51429832 0.56381797 -0.99998974 +v -0.51429832 0.62058591 -0.99998974 +v -0.61140406 0.62058591 -0.99998998 +v -0.61140406 0.62058591 0.9999901 +v -0.55809116 0.46008813 0.99998986 +v -0.55809116 0.49111151 0.99998974 +v -0.55809116 0.50000536 0.99998986 +v -0.55809116 0.52728819 0.99998998 +v -0.58093953 0.52728819 0.99998974 +v -0.64567673 0.46008813 0.99998974 +v -0.64567673 0.50000548 0.99998974 +v -0.63433539 0.52728819 -0.99998974 +v -0.62282824 0.52728819 -0.99998974 +v -0.64567673 0.52728819 0.99998974 +v -0.63433539 0.52728819 0.99998974 +v -0.58093953 0.36544525 0.99998974 +v -0.55809116 0.36544525 0.99998986 +v -0.55809116 0.39272761 0.99998974 +v -0.58093953 0.36544525 -0.99998974 +v -0.55809116 0.36544525 -0.99998974 +v -0.55809116 0.39272761 -0.99998974 +v -0.60212218 0.52728819 0.99998974 +v -0.61140406 0.52728819 0.99998974 +v -0.60212218 0.52728819 -0.99998974 +v -0.58665156 0.52728819 -0.99998974 +v -0.63433539 0.36544525 0.99998986 +v -0.62550711 0.36544525 0.99998974 +v -0.63433539 0.36544525 -0.99998986 +v -0.62550711 0.36544525 -0.99998974 +v -0.55809116 0.46008813 -0.99998986 +v -0.55809116 0.42066228 -0.99998974 +v -0.58665156 0.52728819 0.99998974 +v -0.5867449 0.36544525 0.99998974 +v -0.62282824 0.36544525 0.99998974 +v -0.5867449 0.36544525 -0.99998974 +v -0.62282824 0.36544525 -0.99998974 +v -0.55809116 0.49111151 -0.99998974 +v -0.55809116 0.50000536 -0.99998986 +v -0.55809116 0.52728819 -0.99998998 +v -0.58093953 0.52728819 -0.99998974 +v -0.55809116 0.42066228 0.99998974 +v -0.64567673 0.46008813 -0.99998974 +v -0.64567673 0.50000548 -0.99998974 +v -0.64567673 0.52728819 -0.99998974 +v -0.64567673 0.36544525 0.99998974 +v -0.64567673 0.36544525 -0.99998974 +v -0.61140406 0.52728819 -0.99998974 +v -0.62282824 0.52728819 0.99998974 +v -0.44423878 0.34259688 -0.99998974 +v -0.46860146 0.34259688 -0.99998974 +v -0.51049029 0.35514557 -0.99998974 +v -0.51049029 0.34259688 -0.99998986 +v -0.49999535 0.34259688 -0.99998974 +v -0.49999535 0.34259688 0.99998974 +v -0.46860146 0.34259688 0.99998974 +v -0.44423878 0.34259688 0.99998974 +v -0.43052077 0.34259688 0.99998974 +v -0.43052077 0.35514557 0.99998974 +v -0.4442389 0.36163723 -0.99998974 +v -0.46860146 0.36163723 -0.99998974 +v -0.51049029 0.36163723 -0.99998974 +v -0.49999558 0.36163723 -0.99998974 +v -0.49999558 0.36163723 0.99998974 +v -0.46860146 0.36163723 0.99998974 +v -0.43052077 0.36076343 -0.99998974 +v -0.43052077 0.36163723 -0.99998974 +v -0.43052077 0.36076343 0.99998974 +v -0.43052077 0.36163723 0.99998974 +v -0.4442389 0.36163723 0.99998974 +v -0.51049029 0.35514557 0.99998974 +v -0.51049029 0.34259688 0.99998986 +v -0.51049029 0.36163723 0.99998974 +v -0.43052077 0.35514557 -0.99998974 +v -0.43052077 0.34259688 -0.99998974 +v -0.45908129 0.35514557 -0.99998974 +v -0.45908129 0.34640491 -0.99998962 +v -0.44423878 0.34640491 -0.99998974 +v -0.44423866 0.49491965 -0.99998986 +v -0.42671275 0.49491965 -0.99998974 +v -0.44423866 0.49491965 0.99998986 +v -0.45908129 0.49491965 0.99998974 +v -0.42671275 0.34640491 0.99998974 +v -0.43052077 0.34640491 0.99998974 +v -0.45908129 0.39272761 -0.99998974 +v -0.45908129 0.36163723 -0.99998974 +v -0.45908129 0.46008813 -0.99998974 +v -0.45908129 0.49491965 -0.99998974 +v -0.45908129 0.35514557 0.99998974 +v -0.45908129 0.34640491 0.99998974 +v -0.44423878 0.34640491 0.99998974 +v -0.45908129 0.39272761 0.99998974 +v -0.45908129 0.36163723 0.99998974 +v -0.45908129 0.46008813 0.99998974 +v -0.40196025 0.49491965 -0.99998974 +v -0.40196025 0.34640491 0.99998974 +v -0.42671275 0.49491965 0.99998974 +v -0.38101589 0.46008813 0.99998974 +v -0.38101589 0.49491965 0.99998974 +v -0.40196025 0.49491965 0.99998974 +v -0.38101589 0.38103663 -0.99998974 +v -0.38101589 0.35514557 -0.99998974 +v -0.38101589 0.35514557 0.99998974 +v -0.38101589 0.38103663 0.99998974 +v -0.42671275 0.34640491 -0.99998974 +v -0.43052077 0.34640491 -0.99998974 +v -0.40196025 0.34640491 -0.99998974 +v -0.38101589 0.34640491 -0.99998974 +v -0.38101589 0.46008813 -0.99998974 +v -0.38101589 0.49491965 -0.99998974 +v -0.38101589 0.34640491 0.99998974 +v -0.38101589 0.39272761 -0.99998974 +v -0.38101589 0.39272761 0.99998974 +v -0.45908129 0.49111151 0.99998974 +v -0.45908129 0.49111151 -0.99998986 +v -0.45908129 0.49491965 -0.99998986 +v -0.53143465 0.49111151 0.99998974 +v -0.53143465 0.46008801 0.99998974 +v -0.50198817 0.51205587 0.99998986 +v -0.51429832 0.51205587 0.99998974 +v -0.46860146 0.51205587 -0.99998974 +v -0.49925804 0.51205587 -0.99998986 +v -0.46860146 0.51205587 0.99998974 +v -0.45908129 0.51205587 0.99998974 +v -0.42671275 0.51205587 -0.99998974 +v -0.42819893 0.51205587 -0.99998974 +v -0.44423878 0.39971792 -0.99998974 +v -0.45908129 0.39971792 -0.99998974 +v -0.49999558 0.39971792 -0.99998974 +v -0.50357472 0.39971792 -0.99998974 +v -0.42671275 0.39971792 -0.99998974 +v -0.49999558 0.39971792 0.99998974 +v -0.46860146 0.39971792 0.99998974 +v -0.44423878 0.39971792 0.99998974 +v -0.42671275 0.39971792 0.99998974 +v -0.44423866 0.51205587 -0.99998986 +v -0.45908129 0.51205587 -0.99998974 +v -0.50198805 0.51205587 -0.99998986 +v -0.51429832 0.51205587 -0.99998974 +v -0.49925804 0.51205587 0.99998986 +v -0.50357472 0.39971792 0.99998974 +v -0.46860146 0.39971792 -0.99998974 +v -0.45908129 0.39971792 0.99998974 +v -0.40196025 0.51205587 -0.99998974 +v -0.37720787 0.50000548 0.99998974 +v -0.37720787 0.49604988 0.99998974 +v -0.42671275 0.51205587 0.99998974 +v -0.42819893 0.51205587 0.99998974 +v -0.40196025 0.39971792 -0.99998974 +v -0.40196025 0.39971792 0.99998974 +v -0.37720787 0.50000548 -0.99998974 +v -0.37720787 0.49604988 -0.99998974 +v -0.40196025 0.51205587 0.99998974 +v -0.38101589 0.39971792 -0.99998974 +v -0.38101589 0.39971792 0.99998974 +v -0.37720787 0.51205587 0.99998974 +v -0.37720787 0.51205587 -0.99998974 +v -0.49999511 0.51205587 -0.99998986 +v -0.49999511 0.51205587 0.99998986 +v -0.44423866 0.51205587 0.99998986 +v -0.53143465 0.50000548 0.99998974 +v -0.53143465 0.51205587 0.99998986 +v -0.53143465 0.42066228 -0.99998974 +v -0.53143465 0.39971792 -0.99998974 +v -0.53143465 0.46008801 -0.99998974 +v -0.53143465 0.49111151 -0.99998974 +v -0.53143465 0.50000548 -0.99998974 +v -0.53143465 0.51205587 -0.99998986 +v -0.53143465 0.42066228 0.99998974 +v -0.53143465 0.39971792 0.99998974 +v -0.37720787 0.46008813 0.99998974 +v -0.37720787 0.46008813 -0.99998974 +v -0.37720787 0.39971792 -0.99998974 +v -0.37720787 0.39971792 0.99998974 +v -0.48383379 0.46008801 -0.99998986 +v -0.48383379 0.49111151 -0.99998974 +v -0.48383379 0.50000536 -0.99998986 +v -0.48383379 0.51205587 -0.99998974 +v -0.42798209 0.55965673 -0.99998974 +v -0.42671275 0.55965673 -0.99998974 +v -0.45908129 0.40733408 -0.99998974 +v -0.44423878 0.40733408 -0.99998974 +v -0.48383379 0.46008801 0.99998986 +v -0.48383379 0.40733408 0.99998974 +v -0.46860146 0.40733408 0.99998974 +v -0.42671275 0.40733408 0.99998974 +v -0.44423878 0.40733408 0.99998974 +v -0.48383379 0.49111151 0.99998974 +v -0.48383379 0.50000536 0.99998986 +v -0.48383379 0.51205587 0.99998974 +v -0.48383379 0.40733408 -0.99998974 +v -0.46860146 0.40733408 -0.99998974 +v -0.45908129 0.40733408 0.99998974 +v -0.38101589 0.49491989 0.99998974 +v -0.38101589 0.50000548 0.99998974 +v -0.42798209 0.55965673 0.99998974 +v -0.42671275 0.55965673 0.99998974 +v -0.40196025 0.40733408 0.99998974 +v -0.38101589 0.49491989 -0.99998974 +v -0.38101589 0.50000548 -0.99998974 +v -0.38101589 0.40733408 0.99998974 +v -0.38101589 0.46008813 0.99998974 +v -0.38101589 0.51205587 0.99998974 +v -0.38101589 0.55965673 0.99998986 +v -0.40196025 0.55965673 0.99998974 +v -0.38101589 0.51205587 -0.99998974 +v -0.38101589 0.55965673 -0.99998986 +v -0.40196025 0.55965673 -0.99998974 +v -0.48383379 0.54632854 -0.99998974 +v -0.48383379 0.55965673 -0.99998974 +v -0.46860146 0.55965673 -0.99998974 +v -0.46860146 0.55965673 0.99998974 +v -0.45908129 0.55965673 0.99998974 +v -0.44423866 0.55965673 -0.99998974 +v -0.4324249 0.55965673 -0.99998974 +v -0.45908129 0.55965673 -0.99998974 +v -0.48383379 0.54632854 0.99998974 +v -0.48383379 0.55965673 0.99998974 +v -0.44423866 0.55965673 0.99998974 +v -0.4324249 0.55965673 0.99998974 +v -0.38101589 0.49491965 0.99998974 +v -0.38101589 0.46008813 -0.99998974 +v -0.38101589 0.49491965 -0.99998974 +v -0.42671275 0.40733408 -0.99998974 +v -0.40196025 0.40733408 -0.99998974 +v -0.38101589 0.40733408 -0.99998974 +v -0.50097012 0.50000512 0.99998986 +v -0.50097012 0.50590097 0.99998986 +v -0.50097012 0.56381797 -0.99998986 +v -0.50097012 0.57679307 -0.99998986 +v -0.49999535 0.57679307 -0.99998986 +v -0.4797393 0.57679307 0.99998974 +v -0.49443841 0.57679307 0.99998974 +v -0.42671275 0.57679307 -0.99998974 +v -0.42772531 0.57679307 -0.99998974 +v -0.45908129 0.41685426 -0.99998974 +v -0.44423878 0.41685426 -0.99998974 +v -0.50097012 0.45740044 -0.99998986 +v -0.50097012 0.41685426 -0.99998974 +v -0.49999558 0.41685426 -0.99998974 +v -0.42671275 0.41685426 0.99998974 +v -0.44423878 0.41685426 0.99998974 +v -0.4797393 0.57679307 -0.99998986 +v -0.49443841 0.57679307 -0.99998974 +v -0.50097012 0.49111151 -0.99998974 +v -0.50097012 0.46008753 -0.99998986 +v -0.50097012 0.45740044 0.99998986 +v -0.50097012 0.41685426 0.99998974 +v -0.49999558 0.41685426 0.99998974 +v -0.45908129 0.41685426 0.99998974 +v -0.46860146 0.41685426 0.99998974 +v -0.42671275 0.57679307 0.99998974 +v -0.42772531 0.57679307 0.99998974 +v -0.40196025 0.57679307 -0.99998974 +v -0.40196025 0.41685426 0.99998974 +v -0.40196025 0.57679307 0.99998974 +v -0.39815223 0.56381821 -0.99998974 +v -0.39815223 0.57679307 -0.99998974 +v -0.46860146 0.57679307 -0.99998974 +v -0.45908129 0.57679307 -0.99998974 +v -0.49999535 0.57679307 0.99998986 +v -0.49716198 0.57679307 0.99998974 +v -0.44423878 0.57679307 -0.99998986 +v -0.4324249 0.57679307 -0.99998974 +v -0.49716198 0.57679307 -0.99998974 +v -0.44423878 0.57679307 0.99998986 +v -0.45908129 0.57679307 0.99998974 +v -0.4324249 0.57679307 0.99998974 +v -0.50097012 0.56381797 0.99998986 +v -0.50097012 0.56346488 0.99998974 +v -0.50097012 0.57679307 0.99998998 +v -0.50097012 0.56346488 -0.99998974 +v -0.39815223 0.56346488 0.99998974 +v -0.39815223 0.56381821 0.99998974 +v -0.39815223 0.55965673 0.99998974 +v -0.39815223 0.57679307 0.99998974 +v -0.39815223 0.56346488 -0.99998974 +v -0.39815223 0.55965673 -0.99998974 +v -0.46860146 0.57679307 0.99998974 +v -0.50097012 0.50000512 -0.99998986 +v -0.50097012 0.49111151 0.99998974 +v -0.50097012 0.46008753 0.99998986 +v -0.50097012 0.51205587 0.99998974 +v -0.50097012 0.51205587 -0.99998974 +v -0.46860146 0.41685426 -0.99998974 +v -0.39815223 0.46008813 -0.99998974 +v -0.39815223 0.49491965 -0.99998974 +v -0.50097012 0.50590169 -0.99998986 +v -0.39815223 0.49908089 0.99998974 +v -0.39815223 0.49491965 0.99998974 +v -0.39815223 0.49908089 -0.99998974 +v -0.39815223 0.50000548 -0.99998974 +v -0.39815223 0.51205587 -0.99998974 +v -0.48383379 0.41685426 0.99998974 +v -0.48383379 0.41685426 -0.99998974 +v -0.39815223 0.50000548 0.99998974 +v -0.39815223 0.41685426 0.99998974 +v -0.39815223 0.46008813 0.99998974 +v -0.39815223 0.51205587 0.99998974 +v -0.42671275 0.41685426 -0.99998974 +v -0.40196025 0.41685426 -0.99998974 +v -0.39815223 0.41685426 -1.00268864 +v -0.55342888 0.53871238 -0.99998986 +v -0.53905081 0.53871238 -0.99998974 +v -0.58093953 0.53871238 0.99998974 +v -0.55663323 0.53871238 0.99998986 +v -0.49144995 0.35514557 0.99998974 +v -0.49144995 0.34259688 0.99998974 +v -0.49144995 0.39272761 0.99998974 +v -0.49144995 0.36163723 0.99998974 +v -0.5904597 0.46008813 -0.99998974 +v -0.5904597 0.48347508 -0.99998974 +v -0.5904597 0.50000548 -0.99998974 +v -0.5904597 0.52728819 -0.99998974 +v -0.5904597 0.46008813 0.99998974 +v -0.5904597 0.42066228 0.99998974 +v -0.49144995 0.39971792 0.99998974 +v -0.49144995 0.40374517 0.99998974 +v -0.5904597 0.48347508 0.99998974 +v -0.5904597 0.35514557 0.99998974 +v -0.5904597 0.36544525 0.99998974 +v -0.5904597 0.36544525 -0.99998974 +v -0.5904597 0.37203633 -0.99998974 +v -0.58093953 0.53871238 -0.99998974 +v -0.55663323 0.53871238 -0.99998986 +v -0.5904597 0.42066228 -0.99998974 +v -0.5904597 0.33655822 0.99998974 +v -0.5904597 0.35514557 -0.99998974 +v -0.5904597 0.33655822 -0.99998974 +v -0.53905081 0.53871238 0.99998974 +v -0.55342888 0.53871238 0.99998986 +v -0.49144995 0.35514557 -0.99998974 +v -0.49144995 0.34259688 -0.99998974 +v -0.51429832 0.53871238 -0.99998974 +v -0.50639653 0.53871238 -0.99998986 +v -0.49144995 0.49111151 0.99998974 +v -0.49144995 0.46008801 0.99998986 +v -0.49144995 0.51205587 0.99998974 +v -0.49144995 0.50000536 0.99998986 +v -0.49144995 0.39272761 -0.99998974 +v -0.49144995 0.36163723 -0.99998974 +v -0.49144995 0.39971792 -0.99998974 +v -0.49144995 0.40374517 -0.99998974 +v -0.53905081 0.3064202 0.99998974 +v -0.49999523 0.3064202 0.99998974 +v -0.49999523 0.3064202 -0.99998974 +v -0.49144995 0.3064202 -0.99998986 +v -0.49144995 0.32087028 -0.99998986 +v -0.58093953 0.3064202 0.99998974 +v -0.55342888 0.3064202 0.99998974 +v -0.53905081 0.3064202 -0.99998974 +v -0.55342888 0.3064202 -0.99998974 +v -0.5904597 0.32087051 -0.99998974 +v -0.5904597 0.3064202 -0.99998974 +v -0.58093953 0.3064202 -0.99998974 +v -0.49144995 0.3064202 0.99998986 +v -0.49144995 0.32087028 0.99998986 +v -0.5904597 0.32087051 0.99998974 +v -0.5904597 0.39272761 0.99998974 +v -0.5904597 0.37203633 0.99998974 +v -0.5904597 0.39272761 -0.99998986 +v -0.5904597 0.3064202 0.99998974 +v -0.5216304 0.53871238 0.99998974 +v -0.5216304 0.53871238 -0.99998974 +v -0.49999523 0.53871238 -0.99998974 +v -0.49762785 0.53871238 -0.99998974 +v -0.49762785 0.53871238 0.99998974 +v -0.49999523 0.53871238 0.99998974 +v -0.5904597 0.50000548 0.99998974 +v -0.5904597 0.52728819 0.99998974 +v -0.50097012 0.53871238 0.99998974 +v -0.52079868 0.53871238 -0.99998974 +v -0.50097012 0.53871238 -0.99998974 +v -0.5904597 0.53871238 -0.99998974 +v -0.58665156 0.53871238 -0.99998974 +v -0.58665156 0.53871238 0.99998974 +v -0.5904597 0.53871238 0.99998974 +v -0.51429832 0.53871238 0.99998974 +v -0.50639677 0.53871238 0.99998986 +v -0.49144995 0.53871238 0.99998974 +v -0.52079868 0.53871238 0.99998974 +v -0.49144995 0.49111151 -0.99998974 +v -0.49144995 0.46008801 -0.99998986 +v -0.49144995 0.51205587 -0.99998974 +v -0.49144995 0.50000536 -0.99998986 +v -0.49144995 0.41685426 0.99998974 +v -0.49144995 0.41685426 -0.99998974 +v -0.49144995 0.53871238 -0.99998986 +v -0.52001047 0.25000762 0.99998986 +v -0.52001047 0.27976381 0.99998974 +v -0.55342912 0.32736456 0.99998986 +v -0.53905081 0.32736456 0.99998974 +v -0.52001047 0.32087051 -0.99998986 +v -0.52001047 0.32736456 -0.99998998 +v -0.530514 0.32736456 -0.99998974 +v -0.56875824 0.32736456 0.99998986 +v -0.55342912 0.32736456 -0.99998986 +v -0.56875824 0.32736456 -0.99998986 +v -0.60759604 0.28928399 0.99998974 +v -0.60759604 0.30261218 0.99998974 +v -0.58093953 0.32736456 0.99998974 +v -0.58093953 0.32736456 -0.99998974 +v -0.52001047 0.32087051 0.99998986 +v -0.52001047 0.32736456 0.99998986 +v -0.530514 0.32736456 0.99998974 +v -0.52001047 0.25000762 -0.99998986 +v -0.52001047 0.27976381 -0.99998974 +v -0.53905081 0.32736456 -0.99998974 +v -0.52001047 0.22835481 -0.9927721 +v -0.52001047 0.22835481 0.9927721 +v -0.52001047 0.30261218 0.99998974 +v -0.52001047 0.3064202 0.99998974 +v -0.60759604 0.30261218 -0.99998974 +v -0.60759604 0.30440425 -0.99998974 +v -0.52001047 0.30261218 -0.99998974 +v -0.52001047 0.3064202 -0.99998974 +v -0.52001047 0.28928399 0.99998974 +v -0.60759604 0.25000762 0.99998974 +v -0.60759604 0.27976381 0.99998974 +v -0.52001047 0.28928399 -0.99998974 +v -0.55342888 0.22454679 -0.9915027 +v -0.58093953 0.22454679 -0.99150246 +v -0.60759604 0.22835481 0.99277174 +v -0.58093953 0.22454679 0.99150246 +v -0.55342888 0.22454679 0.9915027 +v -0.53905081 0.22454679 -0.9915027 +v -0.52001047 0.22454679 -0.9915027 +v -0.53905081 0.22454679 0.9915027 +v -0.52001047 0.22454679 0.9915027 +v -0.60759604 0.22454679 0.99150258 +v -0.60759604 0.32087051 0.99998974 +v -0.60759604 0.32736456 0.99998974 +v -0.5904597 0.32736456 0.99998974 +v -0.60759604 0.32087051 -0.99998974 +v -0.60759604 0.32736456 -0.99998974 +v -0.5904597 0.32736456 -0.99998974 +v -0.60759604 0.28928399 -0.99998974 +v -0.60759604 0.30440425 0.99998974 +v -0.60759604 0.25000762 -0.99998974 +v -0.60759604 0.27976381 -0.99998974 +v -0.60759604 0.22835481 -0.99277174 +v -0.60759604 0.22454679 -0.99150246 +v -0.47621762 0.25000762 -0.99998974 +v -0.47621762 0.27976381 -0.99998974 +v -0.58474755 0.28928399 0.99998974 +v -0.58474755 0.30261218 0.99998974 +v -0.47621762 0.22835481 -0.99306291 +v -0.47621762 0.25000762 0.99998974 +v -0.47621762 0.27976381 0.99998974 +v -0.47621762 0.30388152 -0.99998974 +v -0.47621762 0.31213235 -0.99998974 +v -0.49144995 0.31213235 -0.99998974 +v -0.55342888 0.20550644 -0.985156 +v -0.58093953 0.20550644 -0.985156 +v -0.58474755 0.21883463 -0.98959869 +v -0.58474755 0.20550644 -0.985156 +v -0.58474755 0.21883463 0.98959869 +v -0.58474755 0.20550644 0.985156 +v -0.58093953 0.20550644 0.985156 +v -0.55342888 0.20550644 0.985156 +v -0.58474755 0.30413532 -0.99998974 +v -0.58474755 0.30261218 -0.99998974 +v -0.49999523 0.20550644 0.985156 +v -0.47621762 0.20550644 0.985156 +v -0.47621762 0.21883463 0.98959869 +v -0.47621762 0.30388152 0.99998974 +v -0.47621762 0.31213235 0.99998974 +v -0.49144995 0.31213235 0.99998974 +v -0.47621762 0.28928399 -0.99998974 +v -0.58474755 0.25000762 0.99998974 +v -0.58474755 0.27976381 0.99998974 +v -0.49999523 0.20550644 -0.985156 +v -0.47621762 0.20550644 -0.98574554 +v -0.47621762 0.21883463 -0.99001741 +v -0.47621762 0.28928399 0.99998974 +v -0.53905081 0.20550644 -0.985156 +v -0.53905081 0.20550644 0.985156 +v -0.58474755 0.22835481 0.99277174 +v -0.47621762 0.22835481 0.9927721 +v -0.47621762 0.30261218 -0.99998974 +v -0.47621762 0.30261218 0.99998974 +v -0.58474755 0.22454679 0.99150246 +v -0.58474755 0.30413532 0.99998974 +v -0.58474755 0.22454679 -0.99150228 +v -0.53905081 0.31213235 0.99998974 +v -0.52001047 0.31213235 0.99998974 +v -0.49999523 0.31213235 -0.99998974 +v -0.58093953 0.31213235 0.99998974 +v -0.55342888 0.31213235 0.99998974 +v -0.53905081 0.31213235 -0.99998974 +v -0.55342888 0.31213235 -0.99998974 +v -0.58474755 0.3064202 -0.99998974 +v -0.58474755 0.31213235 -0.99998962 +v -0.58093953 0.31213235 -0.99998974 +v -0.52001047 0.31213235 -0.99998974 +v -0.49999523 0.31213235 0.99998974 +v -0.58474755 0.3064202 0.99998974 +v -0.58474755 0.31213235 0.99998974 +v -0.58474755 0.28928399 -0.99998974 +v -0.58474755 0.25000762 -0.99998974 +v -0.58474755 0.27976381 -0.99998974 +v -0.58474755 0.22835481 -0.99277174 +v -0.53905081 0.35402107 0.99998974 +v -0.55342924 0.35402107 0.99998974 +v -0.62663638 0.351884 0.99998974 +v -0.62663638 0.32087051 0.99998974 +v -0.62663638 0.32087051 -0.99998974 +v -0.62663638 0.351884 -0.99998974 +v -0.55479657 0.35402107 0.99998974 +v -0.55479657 0.35402107 -0.99998974 +v -0.55342924 0.35402107 -0.99998974 +v -0.49999523 0.18456196 -0.9781745 +v -0.54713845 0.18456196 -0.9781745 +v -0.56824243 0.18456196 -0.9781745 +v -0.62282824 0.18456196 -0.9781745 +v -0.56824243 0.18456196 0.9781745 +v -0.62282824 0.18456196 0.9781745 +v -0.49999523 0.18456196 0.9781745 +v -0.54713845 0.18456196 0.9781745 +v -0.58093953 0.35402107 0.99998974 +v -0.5904597 0.35402107 0.99998974 +v -0.58093953 0.35402107 -0.99998974 +v -0.5904597 0.35402107 -0.99998974 +v -0.55342888 0.18456196 -0.9781745 +v -0.62663638 0.20360231 0.98452121 +v -0.62663638 0.19598627 0.98198252 +v -0.55342888 0.18456196 0.9781745 +v -0.62663638 0.28928399 -0.99998974 +v -0.62663638 0.30261218 -0.99998974 +v -0.49335396 0.34259688 -0.99998974 +v -0.49335396 0.35402107 -0.99998974 +v -0.49999535 0.35402107 -0.99998974 +v -0.53905081 0.35402107 -0.99998974 +v -0.49335396 0.2016983 0.9838866 +v -0.49335396 0.20360231 0.98452121 +v -0.49335396 0.18456196 0.97817462 +v -0.49335396 0.18456196 -0.97835588 +v -0.49335396 0.2016983 -0.98406785 +v -0.49335396 0.22835481 -0.99285322 +v -0.49335396 0.25000739 -0.99998986 +v -0.49335396 0.27976381 0.99998974 +v -0.49335396 0.25000739 0.99998986 +v -0.62663638 0.30261218 0.99998974 +v -0.49335396 0.20360231 -0.98469543 +v -0.49335396 0.28928399 0.99998974 +v -0.49335396 0.22835481 0.9927721 +v -0.49335396 0.21883463 0.98959869 +v -0.49335396 0.21883463 -0.98971557 +v -0.49335396 0.30261218 0.99998974 +v -0.62663638 0.19598627 -0.98198252 +v -0.62663638 0.18456196 -0.97817462 +v -0.62663638 0.18456196 0.97817462 +v -0.62663638 0.28928399 0.99998974 +v -0.62663638 0.35402107 0.99998986 +v -0.62282824 0.35402107 0.99998974 +v -0.62663638 0.35402107 -0.99998986 +v -0.62282824 0.35402107 -0.99998974 +v -0.62663638 0.20360231 -0.98452121 +v -0.53649151 0.35402107 -0.99998974 +v -0.51049029 0.35402107 -0.99998974 +v -0.51049029 0.35402107 0.99998974 +v -0.49999535 0.35402107 0.99998974 +v -0.53649151 0.35402107 0.99998974 +v -0.49335396 0.32087028 -0.99998974 +v -0.49335396 0.34259688 0.99998974 +v -0.49335396 0.35402107 0.99998974 +v -0.49335396 0.30557179 -0.99998974 +v -0.49335396 0.30261218 -0.99998974 +v -0.49335396 0.31213235 -0.99998974 +v -0.49335396 0.3064202 0.99998974 +v -0.49335396 0.31213235 0.99998974 +v -0.49335396 0.30557179 0.99998974 +v -0.49335396 0.32087028 0.99998974 +v -0.49335396 0.27976381 -0.99998974 +v -0.49335396 0.20550644 0.985156 +v -0.49335396 0.28928399 -0.99998974 +v -0.49335396 0.20550644 -0.98532056 +v -0.49335396 0.3064202 -0.99998974 +v -0.45717728 0.25000762 0.99998986 +v -0.45717728 0.22835481 0.9927721 +v -0.45717728 0.25000762 -0.99998986 +v -0.45717728 0.22835481 -0.99360221 +v -0.42671275 0.26262748 -0.99998974 +v -0.44423866 0.26262748 -0.99998986 +v -0.45717728 0.26262748 0.99998998 +v -0.44423866 0.26262748 0.99998986 +v -0.38609337 0.18075394 0.9769051 +v -0.36197555 0.18075394 0.97690534 +v -0.36197555 0.19027447 0.98007863 +v -0.38609337 0.18075394 -0.97944235 +v -0.36197555 0.18075394 -0.97863489 +v -0.36197555 0.19027447 -0.98143297 +v -0.36197555 0.25000762 0.99998974 +v -0.36197555 0.26262748 0.99998974 +v -0.36387968 0.26262748 0.99998974 +v -0.45717728 0.26262748 -0.99998998 +v -0.45717728 0.18741321 0.97912478 +v -0.45717728 0.18075394 0.9769051 +v -0.45185196 0.18075394 0.9769051 +v -0.45717728 0.18741321 -0.98185843 +v -0.45717728 0.18075394 -0.98010826 +v -0.45185196 0.18075394 -0.98051339 +v -0.36197555 0.20360231 0.98452121 +v -0.42671275 0.26262748 0.99998974 +v -0.45717728 0.20360231 0.98452121 +v -0.44423866 0.18075394 0.9769051 +v -0.45717728 0.20360231 -0.98630046 +v -0.44423866 0.18075394 -0.98117697 +v -0.43693625 0.18075394 0.9769051 +v -0.36197555 0.22835481 0.9927721 +v -0.43693625 0.18075394 -0.98093247 +v -0.45717728 0.21883463 0.98959869 +v -0.45717728 0.21883463 -0.99079382 +v -0.36630213 0.26262748 -0.99998974 +v -0.36387968 0.26262748 -0.99998974 +v -0.40196025 0.26262748 -0.99998974 +v -0.36959171 0.26262748 0.99998974 +v -0.40196025 0.26262748 0.99998974 +v -0.36630213 0.26262748 0.99998974 +v -0.36959171 0.26262748 -0.99998974 +v -0.40196025 0.18075394 0.9769051 +v -0.40196025 0.18075394 -0.97984504 +v -0.36197555 0.25000762 -0.99998974 +v -0.36197555 0.26262748 -0.99998974 +v -0.36197555 0.20360231 -0.98557353 +v -0.36197555 0.22835481 -0.993263 +v -0.42671275 0.2016983 0.9838866 +v -0.40196025 0.2016983 0.9838866 +v -0.40196025 0.2016983 -0.98581689 +v -0.37149572 0.2016983 -0.98517537 +v -0.37149572 0.20360231 -0.98573392 +v -0.37149572 0.28928399 0.99998974 +v -0.37149572 0.30261218 0.99998974 +v -0.47812163 0.32087028 -0.99998974 +v -0.47812163 0.31213235 -0.99998974 +v -0.44576048 0.2016983 0.9838866 +v -0.44423866 0.2016983 0.9838866 +v -0.45717728 0.2016983 -0.98577785 +v -0.47812163 0.32087028 0.99998974 +v -0.47812163 0.31213235 0.99998974 +v -0.37149572 0.32087051 -0.99998974 +v -0.37149572 0.30261218 -0.99998974 +v -0.44073355 0.2016983 0.9838866 +v -0.44073355 0.2016983 -0.98674905 +v -0.44423866 0.2016983 -0.98686641 +v -0.37149572 0.25000762 0.99998974 +v -0.37149572 0.26262748 0.99998974 +v -0.37149572 0.27976381 0.99998974 +v -0.37149572 0.28928399 -0.99998974 +v -0.37149572 0.2016983 0.98388785 +v -0.37149572 0.20360231 0.98452121 +v -0.42671275 0.2016983 -0.98635971 +v -0.37149572 0.32087051 0.99998974 +v -0.37149572 0.25000762 -0.99998974 +v -0.37149572 0.26262748 -0.99998974 +v -0.37149572 0.22835481 0.99277174 +v -0.37149572 0.21883463 0.98959869 +v -0.37149572 0.21883463 -0.9903351 +v -0.37149572 0.22835481 -0.99328357 +v -0.37149572 0.27976381 -0.99998974 +v -0.46860146 0.3311727 -0.99998974 +v -0.44423878 0.3311727 -0.99998974 +v -0.47812163 0.3311727 0.99998974 +v -0.46860146 0.3311727 0.99998974 +v -0.44423878 0.3311727 0.99998974 +v -0.42851853 0.3311727 0.99998974 +v -0.42851853 0.3311727 -0.99998974 +v -0.42671275 0.3311727 0.99998974 +v -0.40196025 0.3311727 0.99998974 +v -0.42671275 0.3311727 -0.99998974 +v -0.37149572 0.3311727 -0.99998962 +v -0.40196025 0.3311727 -0.99998974 +v -0.37149572 0.3311727 0.99998974 +v -0.47812163 0.30308842 -0.99998974 +v -0.47812163 0.30261218 -0.99998974 +v -0.47812163 0.30308842 0.99998974 +v -0.47812163 0.30261218 0.99998974 +v -0.47812163 0.3311727 -0.99998986 +v -0.47812163 0.27976381 -0.99998974 +v -0.47812163 0.25000762 -0.99998974 +v -0.47812163 0.30419898 -0.99998974 +v -0.47812163 0.30419898 0.99998974 +v -0.47812163 0.28928399 -0.99998974 +v -0.47812163 0.20360231 0.98452121 +v -0.47812163 0.2016983 0.9838866 +v -0.47812163 0.22835481 -0.99303942 +v -0.47812163 0.27976381 0.99998974 +v -0.47812163 0.25000762 0.99998974 +v -0.47812163 0.2016983 -0.98448348 +v -0.47812163 0.20360231 -0.9850946 +v -0.47812163 0.28928399 0.99998974 +v -0.47812163 0.22835481 0.9927721 +v -0.47812163 0.21883463 0.98959869 +v -0.47812163 0.21883463 -0.98998379 +v -0.47812163 0.20550644 0.985156 +v -0.47812163 0.20550644 -0.98569822 +v -0.47812163 0.2016983 -0.98448371 +v -0.45717728 0.2016983 0.98388636 +v -0.44576048 0.2016983 -0.98673367 +v -0.52001047 0.3353548 -0.99998974 +v -0.52001047 0.33307671 -0.99998974 +v -0.51250493 0.33307671 -0.99998974 +v -0.52001047 0.39272761 -0.99998974 +v -0.52001047 0.37200069 -0.99998974 +v -0.45908129 0.43779861 -0.99998974 +v -0.44423878 0.43779861 -0.99998974 +v -0.42671275 0.43779861 0.99998974 +v -0.44423878 0.43779861 0.99998974 +v -0.52001047 0.3353548 0.99998974 +v -0.52001047 0.33307671 0.99998986 +v -0.51250493 0.33307671 0.99998974 +v -0.52001047 0.39272761 0.99998974 +v -0.52001047 0.37200069 0.99998974 +v -0.45908129 0.43779861 0.99998974 +v -0.46860146 0.43779861 0.99998974 +v -0.36578369 0.38727462 -0.99998974 +v -0.36578369 0.35514557 -0.99998974 +v -0.40196025 0.43779861 0.99998974 +v -0.36578369 0.35514557 0.99998974 +v -0.36578369 0.38727462 0.99998974 +v -0.37207138 0.33307671 -0.99998974 +v -0.36578369 0.33307671 -0.99998974 +v -0.37207138 0.33307671 0.99998974 +v -0.36578369 0.33307671 0.99998986 +v -0.38101589 0.43779861 0.99998974 +v -0.52001047 0.39971792 -0.99998974 +v -0.52001047 0.39971792 0.99998974 +v -0.46860146 0.33307671 -0.99998974 +v -0.44423878 0.33307671 -0.99998974 +v -0.52001047 0.33751952 -0.99998974 +v -0.52001047 0.34677982 -0.99998974 +v -0.46860146 0.33307671 0.99998974 +v -0.4803431 0.33307671 0.99998974 +v -0.52001047 0.35514557 -0.99998974 +v -0.52001047 0.33751952 0.99998974 +v -0.52001047 0.34677982 0.99998974 +v -0.49999535 0.33307671 -0.99998974 +v -0.49335396 0.33307671 -0.99998974 +v -0.44423878 0.33307671 0.99998974 +v -0.52001047 0.35514557 0.99998974 +v -0.42671275 0.33307671 0.99998974 +v -0.42885232 0.33307671 0.99998974 +v -0.46860146 0.43779861 -0.99998974 +v -0.40196025 0.33307671 0.99998974 +v -0.42885232 0.33307671 -0.99998974 +v -0.42671275 0.33307671 -0.99998974 +v -0.40196025 0.33307671 -0.99998974 +v -0.37268579 0.33307671 -0.99998951 +v -0.37268579 0.33307671 0.99998974 +v -0.36578369 0.39372634 -0.99998974 +v -0.36578369 0.43779861 -0.99998962 +v -0.37720787 0.43779861 -0.99998974 +v -0.36578369 0.39372634 0.99998974 +v -0.36578369 0.43779861 0.99998962 +v -0.37720787 0.43779861 0.99998974 +v -0.36578369 0.39272761 -0.99998974 +v -0.36578369 0.39272761 0.99998974 +v -0.51429832 0.43779861 -0.99998974 +v -0.50808155 0.43779861 -0.99998974 +v -0.51429832 0.43779861 0.99998986 +v -0.50808155 0.43779861 0.99998986 +v -0.38101589 0.43779861 -0.99998974 +v -0.52001047 0.42066228 -0.99998974 +v -0.52001047 0.43779861 -0.99998974 +v -0.52001047 0.42066228 0.99998974 +v -0.52001047 0.43779861 0.99998986 +v -0.48383379 0.43779861 0.99998974 +v -0.49144995 0.43779861 0.99998974 +v -0.49999535 0.43779861 -0.99998974 +v -0.49144995 0.43779861 -0.99998974 +v -0.48383379 0.43779861 -0.99998974 +v -0.39815223 0.43779861 0.99998974 +v -0.39815223 0.43779861 -1.00138115 +v -0.50097012 0.43779861 -0.99998974 +v -0.50097012 0.43779861 0.99998974 +v -0.49999535 0.43779861 0.99998974 +v -0.42671275 0.43779861 -0.99998974 +v -0.40196025 0.43779861 -0.99998974 +v -0.49144995 0.33307671 0.99998974 +v -0.49335396 0.33307671 0.99998974 +v -0.4803431 0.33307671 -0.99998974 +v -0.49999535 0.33307671 0.99998974 +v -0.52001047 0.35402107 -0.99998974 +v -0.52001047 0.35402107 0.99998974 +v -0.49144995 0.33307671 -0.99998974 +v -0.58093953 0.46255099 0.99998974 +v -0.55809116 0.46255099 0.99998974 +v -0.63425242 0.3551104 0.99998986 +v -0.63425242 0.33878886 0.99998986 +v -0.62663638 0.33878886 0.99998974 +v -0.63425242 0.3551104 -0.99998986 +v -0.63425242 0.33878886 -0.99998974 +v -0.62663638 0.33878886 -0.99998974 +v -0.63425242 0.46008813 -0.99998974 +v -0.63425242 0.46255099 -0.99998998 +v -0.62282824 0.46255099 -0.99998974 +v -0.60212218 0.46255099 0.99998974 +v -0.61140406 0.46255099 0.99998974 +v -0.58139312 0.46255099 -0.99998974 +v -0.5904597 0.46255099 -0.99998974 +v -0.63425242 0.45942831 0.99998974 +v -0.63425242 0.36544525 0.99998974 +v -0.63425242 0.45942831 -0.99998974 +v -0.63425242 0.36544525 -0.99998974 +v -0.57332181 0.33878886 0.99998974 +v -0.55809116 0.33878886 0.99998974 +v -0.55809116 0.35131216 0.99998974 +v -0.57332181 0.33878886 -0.99998974 +v -0.55809116 0.33878886 -0.99998986 +v -0.55809116 0.35131216 -0.99998974 +v -0.58139312 0.46255099 0.99998974 +v -0.5904597 0.46255099 0.99998974 +v -0.55809116 0.46255099 -0.99998974 +v -0.55809116 0.46255099 -0.99998986 +v -0.5904597 0.33878886 0.99998974 +v -0.58093953 0.33878886 0.99998974 +v -0.59572506 0.33878886 0.99998974 +v -0.615193 0.33878886 0.99998974 +v -0.59572506 0.33878886 -0.99998974 +v -0.615193 0.33878886 -0.99998974 +v -0.61140406 0.46255099 -0.99998974 +v -0.63425242 0.46008813 0.99998974 +v -0.63425242 0.46255099 0.99998974 +v -0.62282824 0.46255099 0.99998974 +v -0.63425242 0.35514557 0.99998986 +v -0.63425242 0.35524237 0.99998986 +v -0.63425242 0.35514557 -0.99998986 +v -0.63425242 0.35524237 -0.99998986 +v -0.60212218 0.46255099 -0.99998974 +v -0.60089421 0.46255099 -0.99998974 +v -0.60089421 0.46255099 0.99998974 +v -0.55809116 0.46255099 0.99998986 +v -0.55809116 0.35514557 0.99998974 +v -0.55809116 0.35514557 -0.99998974 +v -0.58093953 0.46255099 -0.99998974 +v -0.55809116 0.35402107 0.99998974 +v -0.55809116 0.35402107 -0.99998974 +v -0.62282824 0.33878886 0.99998974 +v -0.62282824 0.33878886 -0.99998974 +v -0.5904597 0.33878886 -0.99998974 +v -0.58093953 0.33878886 -0.99998974 +v -0.63433539 0.46064698 0.99998974 +v -0.64567673 0.46064698 0.99998974 +v -0.61140406 0.46064698 0.99998974 +v -0.60212218 0.46064698 0.99998974 +v -0.56951534 0.42066228 -0.99998974 +v -0.56951534 0.46008813 -0.99998974 +v -0.66281294 0.46008813 -0.99998974 +v -0.66281294 0.46064698 -0.99998962 +v -0.64758074 0.46064698 -0.99998974 +v -0.66281294 0.46008813 0.99998974 +v -0.66281294 0.35021305 0.99998974 +v -0.64758074 0.35021305 0.99998974 +v -0.66281294 0.35021305 -0.99998974 +v -0.64758074 0.35021305 -0.99998974 +v -0.5904597 0.46064698 0.99998974 +v -0.58104252 0.46064698 0.99998974 +v -0.64469134 0.35021305 0.99998974 +v -0.63624155 0.35021305 0.99998986 +v -0.64469134 0.35021305 -0.99998974 +v -0.63624155 0.35021305 -0.99998986 +v -0.66281294 0.46064698 0.99998974 +v -0.64758074 0.46064698 0.99998974 +v -0.64567673 0.46064698 -0.99998974 +v -0.64742302 0.35021305 0.99998974 +v -0.64742302 0.35021305 -0.99998974 +v -0.61140406 0.46064698 -0.99998974 +v -0.62282824 0.46064698 -0.99998974 +v -0.62282824 0.46064698 0.99998974 +v -0.56951534 0.39272761 -0.99998974 +v -0.60212218 0.46064698 -0.99998974 +v -0.56951534 0.39272761 0.99998974 +v -0.56951534 0.36544525 0.99998974 +v -0.56951534 0.35514557 0.99998974 +v -0.56951534 0.36544525 -0.99998974 +v -0.56951534 0.35514557 -0.99998974 +v -0.56951534 0.42066228 0.99998974 +v -0.56951534 0.46008813 0.99998974 +v -0.63433539 0.46064698 -0.99998974 +v -0.5904597 0.46064698 -0.99998974 +v -0.60184371 0.46064698 -0.99998974 +v -0.60184371 0.46064698 0.99998974 +v -0.5904597 0.35021305 0.99998974 +v -0.62269234 0.35021305 0.99998974 +v -0.56951534 0.35402107 -0.99998974 +v -0.62282824 0.35021305 0.99998974 +v -0.62663638 0.35021305 0.99998974 +v -0.5904597 0.35021305 -0.99998974 +v -0.58093953 0.35021305 -0.99998974 +v -0.62269234 0.35021305 -0.99998974 +v -0.57903516 0.35021305 0.99998974 +v -0.56951534 0.35021305 0.99998974 +v -0.56951534 0.35402107 0.99998974 +v -0.57903516 0.35021305 -0.99998974 +v -0.56951534 0.35021305 -0.99998974 +v -0.56951534 0.46064698 0.99998974 +v -0.58093953 0.46064698 0.99998974 +v -0.63425242 0.35021305 0.99998974 +v -0.63425242 0.35021305 -0.99998974 +v -0.62663638 0.35021305 -0.99998974 +v -0.63425242 0.46064698 -0.99998974 +v -0.58104252 0.46064698 -0.99998974 +v -0.58093953 0.35021305 0.99998974 +v -0.62278997 0.35021305 0.99998974 +v -0.62278997 0.35021305 -0.99998974 +v -0.63425242 0.46064698 0.99998974 +v -0.56951534 0.46064698 -0.99998974 +v -0.58093953 0.46064698 -0.99998974 +v -0.62282824 0.35021305 -0.99998974 +v -0.53524267 0.49111151 0.99998974 +v -0.55342912 0.59964144 0.99998974 +v -0.53905081 0.59964144 0.99998974 +v -0.62282824 0.49111151 -0.99998974 +v -0.63431596 0.49111151 -0.99998974 +v -0.60212218 0.59964144 -0.99998974 +v -0.58665156 0.59964144 -0.99998974 +v -0.63433539 0.59964144 -0.99998986 +v -0.62282824 0.59964144 -0.99998974 +v -0.63433539 0.59964144 0.99998986 +v -0.62282824 0.59964144 0.99998974 +v -0.58093953 0.59964144 0.99998974 +v -0.64948475 0.50000548 -0.99998974 +v -0.64948475 0.49111151 -0.99998974 +v -0.64758074 0.49111151 -0.99998974 +v -0.64948475 0.56381821 -0.99998974 +v -0.64948475 0.59964144 -0.99998986 +v -0.64758074 0.59964144 -0.99998974 +v -0.64948475 0.56381821 0.99998974 +v -0.64948475 0.59964144 0.99998974 +v -0.64758074 0.59964144 0.99998974 +v -0.64948475 0.50000548 0.99998974 +v -0.64948475 0.49111151 0.99998974 +v -0.64758074 0.49111151 0.99998974 +v -0.58093953 0.59964144 -0.99998974 +v -0.55342912 0.59964144 -0.99998974 +v -0.58665156 0.59964144 0.99998974 +v -0.53524267 0.56381821 0.99998974 +v -0.53524267 0.59964144 0.99998974 +v -0.53905081 0.59964144 -0.99998974 +v -0.62282824 0.49111151 0.99998974 +v -0.63431596 0.49111151 0.99998974 +v -0.61140406 0.59964144 -0.99998974 +v -0.61140406 0.59964144 0.99998974 +v -0.53524267 0.56246221 0.99998974 +v -0.53524267 0.53871238 0.99998974 +v -0.53524267 0.56246221 -0.99998974 +v -0.53524267 0.53871238 -0.99998974 +v -0.53524267 0.50000548 0.99998974 +v -0.5958476 0.49111151 -0.99998974 +v -0.60212218 0.49111151 -0.99998974 +v -0.5958476 0.49111151 0.99998974 +v -0.60212218 0.49111151 0.99998974 +v -0.60212218 0.59964144 0.99998986 +v -0.53524267 0.50603067 -0.99998974 +v -0.53524267 0.50846672 -0.99998974 +v -0.53524267 0.56381821 -0.99998974 +v -0.53524267 0.59964144 -0.99998974 +v -0.53524267 0.50603067 0.99998974 +v -0.53524267 0.50846672 0.99998974 +v -0.53524267 0.49111151 -0.99998974 +v -0.53524267 0.50000548 -0.99998974 +v -0.5904597 0.49111151 -0.99998974 +v -0.5904597 0.49111151 0.99998974 +v -0.61140406 0.49111151 0.99998974 +v -0.61140406 0.49111151 -0.99998974 +v -0.64567673 0.49111151 0.99998974 +v -0.63433539 0.49111151 0.99998974 +v -0.64567673 0.49111151 -0.99998974 +v -0.63433539 0.49111151 -0.99998974 +v -0.55428302 0.56381821 0.99998986 +v -0.55428302 0.5571258 0.99998986 +v -0.44575309 0.50000536 0.99998986 +v -0.44575309 0.49491965 0.99998974 +v -0.47529745 0.56536889 0.99998974 +v -0.46993279 0.56536889 0.99998974 +v -0.44575309 0.46008813 -0.99998986 +v -0.44575309 0.43779861 -0.99998974 +v -0.55428302 0.56536889 0.9999901 +v -0.55342888 0.56536889 0.99998986 +v -0.55428302 0.46053934 -0.99998986 +v -0.55428302 0.48587906 -0.99998974 +v -0.55428302 0.56381821 -0.99998986 +v -0.55428302 0.5571258 -0.99998986 +v -0.55428302 0.56536889 -0.9999901 +v -0.55342888 0.56536889 -0.99998986 +v -0.55428302 0.42066228 0.99998974 +v -0.55428302 0.46008813 0.99998986 +v -0.44575309 0.50000536 -0.99998986 +v -0.44575309 0.49491965 -0.99998974 +v -0.44575309 0.54632854 -0.99998974 +v -0.44575309 0.51205587 -0.99998974 +v -0.47529745 0.56536889 -0.99998974 +v -0.46993279 0.56536889 -0.99998974 +v -0.45908129 0.56536889 -0.99998974 +v -0.46860146 0.56536889 -0.99998974 +v -0.49933111 0.56536889 -0.99998986 +v -0.49999523 0.56536889 -0.99998986 +v -0.44575309 0.56381821 0.99998986 +v -0.44575309 0.56536889 0.99998986 +v -0.45908129 0.56536889 0.99998974 +v -0.51049029 0.56536889 -0.99998974 +v -0.51429832 0.56536889 -0.99998974 +v -0.44575309 0.56381821 -0.99998986 +v -0.44575309 0.56346488 -0.99998974 +v -0.49716198 0.56536889 0.99998974 +v -0.49933111 0.56536889 0.99998986 +v -0.44575309 0.55965673 -0.99998974 +v -0.49716198 0.56536889 -0.99998974 +v -0.44575309 0.54632854 0.99998974 +v -0.44575309 0.51205587 0.99998974 +v -0.55428302 0.50000536 -0.99998986 +v -0.55428302 0.49111151 -0.99998974 +v -0.44575309 0.56536889 -0.99998998 +v -0.46860146 0.56536889 0.99998974 +v -0.44575309 0.56346488 0.99998974 +v -0.44575309 0.55965673 0.99998974 +v -0.51429832 0.56536889 0.99998974 +v -0.51049029 0.56536889 0.99998974 +v -0.55428302 0.48587906 0.99998974 +v -0.55428302 0.46053934 0.99998986 +v -0.55428302 0.50500381 0.99998986 +v -0.55428302 0.53871238 0.99998974 +v -0.55428302 0.42066228 -0.99998974 +v -0.55428302 0.46008813 -0.99998986 +v -0.55428302 0.50500381 -0.99998986 +v -0.55428302 0.53871238 -0.99998974 +v -0.55428302 0.50000536 0.99998986 +v -0.55428302 0.49111151 0.99998974 +v -0.44575309 0.46325361 0.99998986 +v -0.44575309 0.46325361 -0.99998986 +v -0.44575309 0.46008813 0.99998986 +v -0.44575309 0.43779861 0.99998974 +v -0.49144995 0.42066228 0.99998974 +v -0.48383379 0.42066228 0.99998974 +v -0.49144995 0.42066228 -0.99998974 +v -0.49999558 0.42066228 -0.99998974 +v -0.50097012 0.56536889 -0.99998974 +v -0.50097012 0.42066228 -0.99998974 +v -0.50097012 0.42066228 0.99998974 +v -0.49999523 0.56536889 0.99998986 +v -0.50097012 0.56536889 0.99998974 +v -0.49999558 0.42066228 0.99998974 +v -0.48383379 0.42066228 -0.99998974 +v -0.45908129 0.42066228 -0.99998974 +v -0.44575309 0.42066228 -0.99998974 +v -0.45908129 0.42066228 0.99998974 +v -0.46860146 0.42066228 0.99998974 +v -0.46860146 0.42066228 -0.99998974 +v -0.44575309 0.42066228 0.99998974 +v -0.53905081 0.56536889 0.99998974 +v -0.53524267 0.56536889 0.99998974 +v -0.53905081 0.56536889 -0.99998974 +v -0.53524267 0.56536889 -0.99998974 +v -0.46288943 0.58821725 -0.99998974 +v -0.46288943 0.61016833 -0.99998974 +v -0.44423866 0.49682366 0.99998974 +v -0.44575309 0.49682366 0.99998974 +v -0.46288943 0.54632854 0.99998974 +v -0.46288943 0.51205587 0.99998974 +v -0.45908129 0.49682366 -0.99998974 +v -0.44575309 0.49682366 -0.99998974 +v -0.37959039 0.49682366 0.99998974 +v -0.38101589 0.49682366 0.99998974 +v -0.42671275 0.62058591 0.99998974 +v -0.40196025 0.62058591 0.99998974 +v -0.42671275 0.62058591 -0.99998974 +v -0.40196025 0.62058591 -0.99998974 +v -0.37959039 0.49682366 -0.99998974 +v -0.38101589 0.49682366 -0.99998974 +v -0.37720787 0.61016833 -0.99998974 +v -0.37720787 0.59838879 -0.99998974 +v -0.37720787 0.61812865 0.99998974 +v -0.37720787 0.61016833 0.99998974 +v -0.38484454 0.62058591 0.99998974 +v -0.37720787 0.61812865 -0.99998974 +v -0.38484454 0.62058591 -0.99998974 +v -0.46288943 0.56381797 -0.99998974 +v -0.46288943 0.56536889 -0.99998974 +v -0.42861676 0.62058591 0.99998974 +v -0.42861676 0.62058591 -0.99998974 +v -0.46288943 0.56381797 0.99998974 +v -0.46288943 0.56346488 0.99998974 +v -0.37720787 0.62058591 0.99998986 +v -0.37720787 0.62058591 -0.99998962 +v -0.37720787 0.59838879 0.99998974 +v -0.46288943 0.55965673 0.99998974 +v -0.46288943 0.62058591 -0.99998974 +v -0.45908129 0.62058591 -0.99998974 +v -0.4324249 0.62058591 0.99998974 +v -0.4442389 0.62058591 0.99998974 +v -0.4324249 0.62058591 -0.99998974 +v -0.4442389 0.62058591 -0.99998974 +v -0.45908129 0.62058591 0.99998974 +v -0.46288943 0.50000548 0.99998974 +v -0.46288943 0.49695408 0.99998974 +v -0.45908129 0.49682366 0.99998974 +v -0.46264553 0.49682366 0.99998974 +v -0.46288943 0.50000548 -0.99998974 +v -0.46288943 0.49695408 -0.99998974 +v -0.46264553 0.49682366 -0.99998974 +v -0.46288943 0.54632854 -0.99998974 +v -0.46288943 0.51205587 -0.99998974 +v -0.46288943 0.58821725 0.99998974 +v -0.46288943 0.61016833 0.99998974 +v -0.46288943 0.56536889 0.99998974 +v -0.46288943 0.56346488 -0.99998974 +v -0.46288943 0.55965673 -0.99998974 +v -0.46288943 0.62058591 0.99998974 +v -0.42671275 0.49682366 -0.99998974 +v -0.44423866 0.49682366 -0.99998974 +v -0.40196025 0.49682366 -0.99998974 +v -0.42671275 0.49682366 0.99998974 +v -0.40196025 0.49682366 0.99998974 +v -0.46288943 0.49682366 0.99998962 +v -0.46288943 0.49682366 -0.99998986 +v -0.37720787 0.49682366 0.99998974 +v -0.39815223 0.49682366 0.99998974 +v -0.37720787 0.49682366 -0.99998974 +v -0.39815223 0.49682366 -0.99998974 +v -0.38885641 0.49682366 0.99998974 +v -0.38885641 0.49682366 -0.99998974 +v -0.37720787 0.56060874 0.99998974 +v -0.37720787 0.56060874 -0.99998974 +v -0.37720787 0.56381821 -0.99998974 +v -0.46288943 0.57679307 -0.99998974 +v -0.37720787 0.56381821 0.99998974 +v -0.37720787 0.56346488 0.99998974 +v -0.37720787 0.56346488 -0.99998974 +v -0.46288943 0.57679307 0.99998974 +v -0.42671275 0.49111151 -0.99998974 +v -0.44423866 0.49111151 -0.99998974 +v -0.35245966 0.63010597 0.99998974 +v -0.3543595 0.63010597 0.99998974 +v -0.35245966 0.63010597 -0.99998974 +v -0.3543595 0.63010597 -0.99998974 +v -0.35246837 0.49111151 -0.99998974 +v -0.35245537 0.49111151 -0.99998974 +v -0.35246837 0.49111151 0.99998974 +v -0.3543595 0.49111151 0.99998974 +v -0.35245537 0.49111151 0.99998974 +v -0.35055136 0.49111151 0.99998974 +v -0.35055136 0.50000548 0.99998974 +v -0.35055136 0.56381821 0.99998974 +v -0.35055136 0.61199009 0.99998974 +v -0.35055136 0.61199009 -0.99998974 +v -0.35055136 0.56381821 -0.99998974 +v -0.35055136 0.63010597 0.99998974 +v -0.35245537 0.63010597 0.99998974 +v -0.35055136 0.63010597 -0.99998974 +v -0.35245537 0.63010597 -0.99998974 +v -0.35055136 0.49111151 -0.99998974 +v -0.35055136 0.50000548 -0.99998974 +v -0.45336926 0.49491965 -0.99998974 +v -0.45336926 0.49682366 -0.99998974 +v -0.45336926 0.51205587 -0.99998974 +v -0.45336926 0.54632854 -0.99998974 +v -0.45336926 0.58821725 0.99998974 +v -0.45336926 0.61016833 0.99998974 +v -0.40196025 0.49111151 -0.99998974 +v -0.36387968 0.49111151 -0.99998974 +v -0.3543595 0.49111151 -0.99998974 +v -0.36387968 0.63010597 0.99998974 +v -0.36578369 0.63010597 0.99998974 +v -0.36387968 0.63010597 -0.99998974 +v -0.36578369 0.63010597 -0.99998974 +v -0.44423866 0.49111151 0.99998974 +v -0.42671275 0.49111151 0.99998974 +v -0.41443133 0.63010597 0.99998974 +v -0.42671275 0.63010597 0.99998974 +v -0.40196025 0.63010597 0.99998974 +v -0.40196025 0.63010597 -0.99998974 +v -0.41443133 0.63010597 -0.99998974 +v -0.40196025 0.49111151 0.99998974 +v -0.36387968 0.49111151 0.99998974 +v -0.42861676 0.63010597 0.99998974 +v -0.45336926 0.57679307 0.99998974 +v -0.45336926 0.56536889 0.99998974 +v -0.37151718 0.63010597 0.99998974 +v -0.38953816 0.63010597 0.99998974 +v -0.38953816 0.63010597 -0.99998951 +v -0.37151718 0.63010597 -0.99998951 +v -0.45336926 0.55965673 -0.99998974 +v -0.45336926 0.56346488 -0.99998974 +v -0.45336926 0.62058591 0.99998974 +v -0.45336926 0.58821725 -0.99998974 +v -0.45336926 0.61016833 -0.99998974 +v -0.45336926 0.57679307 -0.99998974 +v -0.45336926 0.56536889 -0.99998974 +v -0.45336926 0.56381797 0.99998974 +v -0.45336926 0.56346488 0.99998974 +v -0.45336926 0.62058591 -0.99998974 +v -0.44575309 0.49111151 0.99998974 +v -0.45336926 0.49111151 -0.99998974 +v -0.44575309 0.49111151 -0.99998974 +v -0.38101589 0.49111151 0.99998974 +v -0.37720787 0.49111151 0.99998974 +v -0.37720787 0.49111151 -0.99998974 +v -0.39815223 0.49111151 -0.99998974 +v -0.45336926 0.50000548 -0.99998974 +v -0.38101589 0.49111151 -0.99998974 +v -0.39815223 0.49111151 0.99998974 +v -0.45336926 0.49491965 0.99998974 +v -0.45336926 0.49682366 0.99998974 +v -0.45336926 0.56381797 -0.99998974 +v -0.45336926 0.51205587 0.99998974 +v -0.45336926 0.54632854 0.99998974 +v -0.45336926 0.55965673 0.99998974 +v -0.45336926 0.49111151 0.99998986 +v -0.45336926 0.50000548 0.99998974 +v -0.42671275 0.63010597 -0.99998974 +v -0.42861676 0.63010597 -0.99998974 +v -0.4442389 0.63010597 0.99998974 +v -0.4324249 0.63010597 0.99998974 +v -0.4324249 0.63010597 -0.99998974 +v -0.4442389 0.63010597 -0.99998974 +v -0.45336926 0.63010597 0.99998974 +v -0.45336926 0.63010597 -0.99998974 +v -0.53905081 0.76910054 0.99998974 +v -0.52191448 0.76910054 0.99998974 +v -0.46860146 0.76910054 -0.99998974 +v -0.49999523 0.76910054 -0.99998974 +v -0.56189918 0.70030546 0.99998974 +v -0.56189918 0.71959567 0.99998974 +v -0.56189918 0.75000286 0.99998974 +v -0.56189918 0.76910054 0.99998986 +v -0.55342888 0.76910054 0.99998974 +v -0.53905081 0.76910054 -0.99998974 +v -0.55342888 0.76910054 -0.99998974 +v -0.44004094 0.70030546 -0.99998986 +v -0.44004094 0.71959567 -0.99998974 +v -0.46860146 0.76910054 0.99998974 +v -0.46098542 0.76910054 0.99998974 +v -0.44004094 0.75000286 -0.99998986 +v -0.44004094 0.76910054 -0.99998998 +v -0.44423866 0.76910054 -0.99998974 +v -0.56189918 0.63969719 -0.99998974 +v -0.56189918 0.62439394 -0.99998974 +v -0.55342924 0.62439394 -0.99998974 +v -0.44004094 0.70030546 0.99998986 +v -0.44004094 0.69674718 0.99998974 +v -0.53905081 0.62439394 0.99998974 +v -0.55342924 0.62439394 0.99998974 +v -0.49999558 0.62439394 -0.99998974 +v -0.51049029 0.62439394 -0.99998974 +v -0.56189918 0.67700183 -0.99998974 +v -0.56189918 0.685323 -0.99998974 +v -0.56189918 0.63969719 0.99998974 +v -0.56189918 0.65485847 0.99998974 +v -0.44004094 0.63834643 0.99998974 +v -0.44004094 0.6320101 0.99998974 +v -0.44004094 0.63834643 -0.99998974 +v -0.44004094 0.6320101 -0.99998974 +v -0.56189918 0.70030546 -0.99998974 +v -0.56189918 0.69396042 -0.99998974 +v -0.56189918 0.69396042 0.99998974 +v -0.56189918 0.71959567 -0.99998974 +v -0.56189918 0.75000286 -0.99998974 +v -0.56189918 0.76910054 -0.99998986 +v -0.45336926 0.76910054 -0.99998974 +v -0.52191448 0.76910054 -0.99998974 +v -0.49999511 0.76910054 0.99998974 +v -0.51353955 0.62439394 0.99998974 +v -0.53905081 0.62439394 -0.99998974 +v -0.44004094 0.71959567 0.99998974 +v -0.44004094 0.75000286 0.99998986 +v -0.44004094 0.76910054 0.99998998 +v -0.44423866 0.76910054 0.99998974 +v -0.44004094 0.69674718 -0.99998974 +v -0.56189918 0.67580282 -0.99998974 +v -0.56189918 0.65485847 -0.99998974 +v -0.56189918 0.67700183 0.99998974 +v -0.56189918 0.685323 0.99998974 +v -0.44004094 0.63969719 -0.99998974 +v -0.44004094 0.67580282 -0.99998974 +v -0.44004094 0.73482787 -0.99998974 +v -0.44004094 0.73482787 0.99998974 +v -0.45336926 0.76910054 0.99998974 +v -0.46098542 0.76910054 -0.99998974 +v -0.56189918 0.68722701 -0.99998974 +v -0.56189918 0.68722701 0.99998974 +v -0.56189918 0.67580282 0.99998974 +v -0.44004094 0.67580282 0.99998974 +v -0.44004094 0.68341898 0.99998974 +v -0.44004094 0.63969719 0.99998974 +v -0.44004094 0.68341898 -0.99998974 +v -0.51353955 0.62439394 -0.99998974 +v -0.51049029 0.62439394 0.99998974 +v -0.49999558 0.62439394 0.99998974 +v -0.45908129 0.62439394 -0.99998974 +v -0.46479344 0.62439394 -0.99998974 +v -0.49716198 0.62439394 0.99998974 +v -0.48954582 0.62439394 0.99998974 +v -0.48954582 0.62439394 -0.99998974 +v -0.46860146 0.62439394 -0.99998974 +v -0.46860146 0.62439394 0.99998974 +v -0.49716198 0.62439394 -0.99998974 +v -0.45908129 0.62439394 0.99998974 +v -0.46479344 0.62439394 0.99998974 +v -0.56189918 0.62439394 0.99998986 +v -0.4442389 0.62439394 0.99998974 +v -0.44004094 0.62439394 0.99998974 +v -0.44004094 0.63010597 0.99998974 +v -0.4442389 0.62439394 -0.99998974 +v -0.44004094 0.62439394 -0.99998974 +v -0.44004094 0.63010597 -0.99998974 +v -0.45336926 0.62439394 0.99998974 +v -0.45336926 0.62439394 -0.99998974 +v -0.45527327 0.71959567 0.99998974 +v -0.45527327 0.70030546 0.99998974 +v -0.35246837 0.59964144 0.99998986 +v -0.3543595 0.59964144 0.99998974 +v -0.34103119 0.59964144 0.99998974 +v -0.33151102 0.59964144 0.99998974 +v -0.33151102 0.63008689 0.99998974 +v -0.34103119 0.59964144 -0.99998974 +v -0.33151102 0.59964144 -0.99998974 +v -0.33151102 0.63008689 -0.99998974 +v -0.42762601 0.59964144 -0.99998974 +v -0.42671275 0.59964144 -0.99998974 +v -0.33151102 0.70995092 -0.99998974 +v -0.33151102 0.73482787 -0.99998986 +v -0.33341503 0.73482787 -0.99998974 +v -0.33151102 0.63969719 0.99998974 +v -0.33151102 0.63969719 -0.99998974 +v -0.35055136 0.59964144 0.99998974 +v -0.35055136 0.59964144 -0.99998974 +v -0.35245537 0.59964144 0.99998974 +v -0.35245537 0.59964144 -0.99998974 +v -0.35246837 0.59964144 -0.99998974 +v -0.44423878 0.59964144 0.99998974 +v -0.45336926 0.59964144 0.99998974 +v -0.45527327 0.6320101 0.99998974 +v -0.45527327 0.63969719 0.99998974 +v -0.42762601 0.59964144 0.99998974 +v -0.42671275 0.59964144 0.99998974 +v -0.36387968 0.59964144 0.99998974 +v -0.36578369 0.59964144 0.99998974 +v -0.36387968 0.59964144 -0.99998974 +v -0.3543595 0.59964144 -0.99998974 +v -0.33151102 0.70995092 0.99998974 +v -0.33151102 0.73482787 1.00116372 +v -0.33341503 0.73482787 0.99998974 +v -0.33151102 0.67580282 -0.99998986 +v -0.33151102 0.70030546 -0.99998974 +v -0.33151102 0.67580282 0.99998986 +v -0.33151102 0.70030546 0.99998974 +v -0.45527327 0.67580282 0.99998974 +v -0.35245537 0.73482787 0.99998974 +v -0.34103119 0.73482787 0.99998974 +v -0.34103119 0.73482787 -0.99998974 +v -0.35245537 0.73482787 -0.99998974 +v -0.36387968 0.73482787 0.99998974 +v -0.3543595 0.73482787 0.99998974 +v -0.36387968 0.73482787 -0.99998974 +v -0.40196025 0.73482787 -0.99998974 +v -0.3543595 0.73482787 -0.99998974 +v -0.40196025 0.73482787 0.99998974 +v -0.40075922 0.59964144 -0.99998974 +v -0.37720787 0.59964144 -0.99998974 +v -0.45527327 0.73482787 0.99998974 +v -0.45527327 0.68341898 -0.99998974 +v -0.45527327 0.67580282 -0.99998974 +v -0.45527327 0.70030546 -0.99998974 +v -0.45527327 0.69674718 -0.99998974 +v -0.45527327 0.71959567 -0.99998974 +v -0.45527327 0.68722701 0.99998974 +v -0.45527327 0.69674718 0.99998974 +v -0.45527327 0.73482787 -0.99998974 +v -0.44423878 0.59964144 -0.99998974 +v -0.4324249 0.59964144 -0.99998974 +v -0.4324249 0.59964144 0.99998974 +v -0.45527327 0.68722701 -0.99998974 +v -0.45527327 0.68659246 -0.99998974 +v -0.45527327 0.68659246 0.99998974 +v -0.40075922 0.59964144 0.99998974 +v -0.37720787 0.59964144 0.99998974 +v -0.36578369 0.59964144 -0.99998974 +v -0.45527327 0.62058591 0.99998974 +v -0.45527327 0.61016833 0.99998974 +v -0.42861676 0.59964144 -0.99998974 +v -0.42861676 0.59964144 0.99998974 +v -0.45527327 0.61016833 -0.99998974 +v -0.45527327 0.59964144 -0.99998974 +v -0.45336926 0.59964144 -0.99998974 +v -0.45527327 0.6320101 -0.99998974 +v -0.45527327 0.63969719 -0.99998974 +v -0.45527327 0.68341898 0.99998974 +v -0.40196025 0.59964144 -0.99998974 +v -0.40196025 0.59964144 0.99998974 +v -0.37599289 0.59964144 -0.99998974 +v -0.37599289 0.59964144 0.99998974 +v -0.45527327 0.63074076 0.99998974 +v -0.45527327 0.63074076 -0.99998974 +v -0.45527327 0.59964144 0.99998974 +v -0.45527327 0.62058591 -0.99998974 +v -0.45527327 0.62439394 0.99998974 +v -0.45527327 0.62439394 -0.99998974 +v -0.54857099 0.75000286 -0.99998986 +v -0.54857099 0.76910054 -0.99998974 +v -0.54857099 0.80403614 -0.99998986 +v -0.54857099 0.82622158 -0.99998974 +v -0.44956111 0.80908525 0.99998974 +v -0.44956111 0.82050943 0.99998974 +v -0.54857099 0.75000286 0.99998986 +v -0.54857099 0.76910054 0.99998974 +v -0.54857099 0.80403614 0.99998986 +v -0.54857099 0.82622158 0.99998974 +v -0.44956111 0.7767167 -0.99998974 +v -0.44956111 0.76910054 -0.99998974 +v -0.44956111 0.82050943 -0.99998974 +v -0.44956111 0.80908525 -0.99998974 +v -0.54857099 0.86811029 -0.99998974 +v -0.54857099 0.90428698 -0.99998974 +v -0.54857099 0.86811029 0.99998974 +v -0.54857099 0.90428698 0.99998974 +v -0.54857099 0.84716594 -0.99998974 +v -0.54857099 0.84716594 0.99998974 +v -0.44956111 0.84526193 -0.99998974 +v -0.44956111 0.82622158 -0.99998974 +v -0.53905081 0.74244403 0.99998974 +v -0.52191448 0.74244403 0.99998974 +v -0.46860146 0.74244403 -0.99998974 +v -0.49999511 0.74244403 -0.99998986 +v -0.54857099 0.74244403 -0.99998998 +v -0.53905081 0.74244403 -0.99998974 +v -0.54857099 0.7767167 -0.99998974 +v -0.54857099 0.74244403 0.99998986 +v -0.54857099 0.7767167 0.99998974 +v -0.44956111 0.80403614 -0.99998974 +v -0.52191448 0.74244403 -0.99998974 +v -0.49999511 0.74244403 0.99998986 +v -0.46860146 0.74244403 0.99998974 +v -0.53905081 0.92142319 0.99998974 +v -0.52953064 0.92142319 0.99998974 +v -0.46860146 0.92142319 -0.99998974 +v -0.4857378 0.92142319 -0.99998974 +v -0.54857099 0.92142319 -0.99998986 +v -0.53905081 0.92142319 -0.99998974 +v -0.44956111 0.90428698 0.99998974 +v -0.44956111 0.92142319 0.99998986 +v -0.46860146 0.92142319 0.99998974 +v -0.44956111 0.86811029 0.99998974 +v -0.44956111 0.87191832 0.99998974 +v -0.54857099 0.92142319 0.99998986 +v -0.44956111 0.86811029 -0.99998974 +v -0.44956111 0.87191832 -0.99998974 +v -0.44956111 0.90428698 -0.99998974 +v -0.44956111 0.92142319 -0.99998974 +v -0.49999523 0.92142319 -0.99998986 +v -0.51620233 0.92142319 -0.99998974 +v -0.49999523 0.92142319 0.99998986 +v -0.4857378 0.92142319 0.99998974 +v -0.54857099 0.86049413 -0.99998974 +v -0.54857099 0.86239814 -0.99998974 +v -0.44956111 0.86049413 0.99998974 +v -0.54857099 0.86049413 0.99998974 +v -0.54857099 0.86239814 0.99998974 +v -0.44956111 0.86049413 -0.99998974 +v -0.51620233 0.92142319 0.99998974 +v -0.52953064 0.92142319 -0.99998974 +v -0.44956111 0.85272467 0.99998974 +v -0.44956111 0.85272467 -0.99998974 +v -0.44956111 0.80403614 0.99998974 +v -0.46098542 0.74244403 0.99998974 +v -0.45431792 0.74244403 0.99998974 +v -0.46098542 0.74244403 -0.99998974 +v -0.45336926 0.74244403 -0.99998974 +v -0.44956111 0.74244403 -0.99998986 +v -0.44956111 0.75000262 -0.99998974 +v -0.44956111 0.84526193 0.99998974 +v -0.44956111 0.82622158 0.99998974 +v -0.44956111 0.7767167 0.99998974 +v -0.44956111 0.76910054 0.99998974 +v -0.45336926 0.74244403 0.99998974 +v -0.44956111 0.74244403 0.99998974 +v -0.44956111 0.75000262 0.99998974 +v -0.45431792 0.74244403 -0.99998974 +v -0.50668215 0.80403614 0.99998986 +v -0.50668215 0.82050943 0.99998974 +v -0.63996458 0.69795012 -0.99998974 +v -0.63996458 0.69103515 -0.99998974 +v -0.62282824 0.69103515 -0.99998974 +v -0.53905081 0.69103515 0.99998974 +v -0.55342912 0.69103515 0.99998974 +v -0.53905081 0.69103515 -0.99998974 +v -0.52191448 0.69103515 -0.99998974 +v -0.63996458 0.71959567 0.99998974 +v -0.63996458 0.70030546 0.99998974 +v -0.63996458 0.7767167 0.99998974 +v -0.63996458 0.75000286 0.99998974 +v -0.63996458 0.82622158 0.99998974 +v -0.63996458 0.80403637 0.99998974 +v -0.57381439 0.69103515 -0.99998974 +v -0.56580436 0.69103515 -0.99998974 +v -0.57381439 0.69103515 0.99998974 +v -0.56580436 0.69103515 0.99998974 +v -0.50668215 0.71959567 -0.99998974 +v -0.50668215 0.70030546 -0.99998986 +v -0.50668215 0.7767167 -0.99998974 +v -0.50668215 0.76910054 -0.99998974 +v -0.50668215 0.82050943 -0.99998974 +v -0.50668215 0.80403614 -0.99998986 +v -0.50668215 0.70030546 0.99998986 +v -0.50668215 0.69674718 0.99998974 +v -0.55342912 0.69103515 -0.99998974 +v -0.57279443 0.83954978 0.99998974 +v -0.55342888 0.83954978 0.99998974 +v -0.53905081 0.83954978 -0.99998974 +v -0.54857099 0.83954978 -0.99998974 +v -0.61653697 0.69103515 -0.99998974 +v -0.58093953 0.69103515 -0.99998974 +v -0.61653697 0.69103515 0.99998974 +v -0.58093953 0.69103515 0.99998974 +v -0.63996458 0.83954978 0.99998974 +v -0.62282824 0.83954978 0.99998974 +v -0.55342888 0.83954978 -0.99998974 +v -0.57279443 0.83954978 -0.99998974 +v -0.54857099 0.83954978 0.99998974 +v -0.50668215 0.83407747 -0.99998974 +v -0.50668215 0.82622158 -0.99998974 +v -0.52020072 0.83954978 -0.99998974 +v -0.51791608 0.83954978 -0.99998974 +v -0.51134026 0.83954978 -0.99998974 +v -0.50668215 0.75000262 -0.99998986 +v -0.50668215 0.74244403 -0.99998974 +v -0.63996458 0.69795012 0.99998974 +v -0.63996458 0.69103515 0.99998974 +v -0.62282824 0.69103515 0.99998974 +v -0.63996458 0.71959567 -0.99998974 +v -0.63996458 0.70030546 -0.99998974 +v -0.63996458 0.7767167 -0.99998974 +v -0.63996458 0.75000286 -0.99998974 +v -0.63996458 0.82622158 -0.99998974 +v -0.63996458 0.80403637 -0.99998974 +v -0.63996458 0.83735287 -0.99998974 +v -0.63996458 0.83954978 -0.99998974 +v -0.63846147 0.83954978 -0.99998974 +v -0.50668215 0.83407747 0.99998974 +v -0.50668215 0.82622158 0.99998974 +v -0.52020072 0.83954978 0.99998974 +v -0.51791608 0.83954978 0.99998974 +v -0.51134026 0.83954978 0.99998974 +v -0.61760401 0.69103515 0.99998974 +v -0.56189918 0.69103515 -0.99998974 +v -0.52953064 0.83954978 0.99998974 +v -0.53905081 0.83954978 0.99998974 +v -0.61711621 0.69103515 -0.99998974 +v -0.61760401 0.69103515 -0.99998974 +v -0.61711621 0.69103515 0.99998974 +v -0.56189918 0.69103515 0.99998974 +v -0.61711621 0.83954978 -0.99998974 +v -0.58093953 0.83954978 -0.99998974 +v -0.61919343 0.83954978 -0.99998974 +v -0.62282824 0.83954978 -0.99998974 +v -0.61919343 0.83954978 0.99998974 +v -0.58093953 0.83954978 0.99998974 +v -0.61711621 0.83954978 0.99998974 +v -0.52953064 0.83954978 -0.99998974 +v -0.52191448 0.83954978 -0.99998974 +v -0.52191448 0.83954978 0.99998974 +v -0.50668215 0.71959567 0.99998974 +v -0.50668215 0.7767167 0.99998974 +v -0.50668215 0.76910054 0.99998974 +v -0.50668215 0.69674718 -0.99998986 +v -0.52191448 0.69103515 0.99998974 +v -0.50668215 0.83954978 -0.99998986 +v -0.50668215 0.75000262 0.99998986 +v -0.50668215 0.74244403 0.99998974 +v -0.50668215 0.83954978 0.99998986 +v -0.51049029 0.69103515 0.99998974 +v -0.50668215 0.69103515 0.99998986 +v -0.51049029 0.69103515 -0.99998974 +v -0.50668215 0.69103515 -0.99998974 +v -0.53905081 0.7500602 -0.99998974 +v -0.54857099 0.7500602 -0.99998974 +v -0.5904597 0.7767167 -0.99998974 +v -0.5904597 0.7500602 -0.99998974 +v -0.58093953 0.7500602 -0.99998974 +v -0.5904597 0.82622158 -0.99998974 +v -0.5904597 0.80403637 -0.99998974 +v -0.55342888 0.7500602 0.99998986 +v -0.54857099 0.7500602 0.99998974 +v -0.51049029 0.76910054 -0.99998974 +v -0.51049029 0.7767167 -0.99998974 +v -0.51049029 0.86811029 -0.99998974 +v -0.5904597 0.86811029 -0.99998974 +v -0.5904597 0.86239814 -0.99998974 +v -0.51049029 0.8321135 -0.99998974 +v -0.51049029 0.83855128 -0.99998974 +v -0.5904597 0.86811029 0.99998974 +v -0.5904597 0.86239814 0.99998974 +v -0.51049029 0.86049413 -0.99998974 +v -0.51049029 0.8321135 0.99998974 +v -0.51049029 0.83855128 0.99998974 +v -0.51049029 0.84716594 -0.99998974 +v -0.51049029 0.86811029 0.99998974 +v -0.51049029 0.86049413 0.99998974 +v -0.51049029 0.84716594 0.99998974 +v -0.5904597 0.83954978 -0.99998974 +v -0.5904597 0.7767167 0.99998974 +v -0.5904597 0.7500602 0.99998974 +v -0.58093953 0.7500602 0.99998974 +v -0.5904597 0.82622158 0.99998974 +v -0.5904597 0.80403637 0.99998974 +v -0.5904597 0.83954978 0.99998974 +v -0.51049029 0.84526193 -0.99998974 +v -0.51049029 0.84526193 0.99998974 +v -0.5904597 0.84716594 -0.99998974 +v -0.51049029 0.83954978 -0.99998974 +v -0.51049029 0.80403637 0.99998974 +v -0.51049029 0.7767167 0.99998974 +v -0.5904597 0.84716594 0.99998974 +v -0.51049029 0.82622158 0.99998974 +v -0.51049029 0.82050943 0.99998974 +v -0.52191448 0.7500602 0.99998974 +v -0.53905081 0.7500602 0.99998974 +v -0.56189918 0.7500602 0.99998974 +v -0.56189918 0.7500602 -0.99998974 +v -0.55342888 0.7500602 -0.99998986 +v -0.52191448 0.7500602 -0.99998974 +v -0.51049029 0.7500602 -0.99998986 +v -0.51049029 0.82050943 -0.99998974 +v -0.51049029 0.80403637 -0.99998974 +v -0.51049029 0.82622158 -0.99998974 +v -0.51049029 0.76910054 0.99998974 +v -0.51049029 0.83954978 0.99998974 +v -0.51049029 0.7500602 0.99998986 +v -0.56761121 0.82622158 0.99998974 +v -0.56761121 0.82622158 0.99998986 +v -0.56761121 0.82622158 -0.99998974 +v -0.56761121 0.82622158 -0.99998962 +v -0.61140406 0.89286267 -0.99998974 +v -0.61140406 0.90047884 -0.99998974 +v -0.58093953 0.90047884 -0.99998974 +v -0.56761121 0.83954978 0.99998974 +v -0.61140406 0.86811029 -0.99998974 +v -0.61140406 0.86239814 -0.99998974 +v -0.56761121 0.83954978 -0.99998974 +v -0.61140406 0.89286267 0.99998974 +v -0.61140406 0.90047884 0.99998974 +v -0.58093953 0.90047884 0.99998974 +v -0.57386231 0.90047884 0.99998974 +v -0.56901419 0.90047884 0.99998974 +v -0.57386231 0.90047884 -0.99998974 +v -0.56901419 0.90047884 -0.99998974 +v -0.56761121 0.85564756 0.99998974 +v -0.56761121 0.86239814 0.99998974 +v -0.56761121 0.85564756 -0.99998974 +v -0.56761121 0.86239814 -0.99998974 +v -0.61140406 0.86811029 0.99998974 +v -0.56761121 0.86811029 0.99998974 +v -0.56761121 0.89286267 0.99998974 +v -0.56761121 0.90047884 0.99998974 +v -0.56761121 0.86811029 -0.99998974 +v -0.56761121 0.89286267 -0.99998974 +v -0.56761121 0.90047884 -0.99998974 +v -0.56761121 0.84716594 0.99998974 +v -0.56761121 0.8480314 0.99998974 +v -0.56761121 0.84716594 -0.99998974 +v -0.56761121 0.8480314 -0.99998974 +v -0.61140406 0.82622158 0.99998974 +v -0.61140406 0.83954978 0.99998974 +v -0.56761121 0.86326372 0.99998974 +v -0.56761121 0.86326372 -0.99998974 +v -0.61140406 0.84716594 -0.99998974 +v -0.61140406 0.84716594 0.99998974 +v -0.61140406 0.82622158 -0.99998974 +v -0.61140406 0.86239814 0.99998974 +v -0.61140406 0.83954978 -0.99998974 +v -0.58093953 0.96712005 0.99998974 +v -0.56761121 0.96712005 0.99998974 +v -0.54857099 0.92687499 -0.99998986 +v -0.54857099 0.96712005 -0.99998974 +v -0.55342888 0.96712005 -0.99998974 +v -0.60759604 0.92687499 -0.99998974 +v -0.60759604 0.96712005 -0.99998974 +v -0.58093953 0.96712005 -0.99998974 +v -0.55999517 0.96712005 -0.99998974 +v -0.54857099 0.92687499 0.99998986 +v -0.54857099 0.96712005 0.99998974 +v -0.55342888 0.96712005 0.99998974 +v -0.55999517 0.87953448 0.99998974 +v -0.55342888 0.87953448 0.99998974 +v -0.54857099 0.87953448 -0.99998974 +v -0.60759604 0.90047884 -0.99998974 +v -0.55999517 0.87953448 -0.99998974 +v -0.55342888 0.87953448 -0.99998974 +v -0.54857099 0.87953448 0.99998974 +v -0.60759604 0.92687499 0.99998974 +v -0.60759604 0.96712005 0.99998974 +v -0.60759604 0.90047884 0.99998974 +v -0.55999517 0.96712005 0.99998974 +v -0.56761121 0.96712005 -0.99998974 +v -0.56351029 0.87953448 0.99998974 +v -0.56351029 0.87953448 -0.99998974 +v -0.5767306 0.87953448 0.99998974 +v -0.58093953 0.87953448 0.99998974 +v -0.58093953 0.87953448 -0.99998974 +v -0.5767306 0.87953448 -0.99998974 +v -0.56761121 0.87953448 0.99998974 +v -0.56761121 0.87953448 -0.99998974 +v -0.58606588 0.87953448 -0.99998974 +v -0.58606588 0.87953448 0.99998974 +v -0.60759604 0.89286267 -0.99998974 +v -0.60759604 0.89286267 0.99998974 +v -0.60759604 0.87953448 -0.99998974 +v -0.60759604 0.87953448 0.99998974 +v -0.52191448 1.00000023 0.99998986 +v -0.52191448 1.02233707 0.99998974 +v -0.60378789 0.97854423 -0.99998974 +v -0.60378789 0.96712005 -0.99998974 +v -0.60378789 1.00000047 -0.99998974 +v -0.60378789 1.01116871 -0.99998974 +v -0.52191448 1.00000023 -0.99998986 +v -0.52191448 1.02233707 -0.99998974 +v -0.52191448 0.98996841 0.99998974 +v -0.60378789 0.92687499 -0.99998974 +v -0.60378789 0.90619099 -0.99998974 +v -0.58093953 0.90619099 -0.99998974 +v -0.52191448 0.98996841 -0.99998974 +v -0.60378789 0.97854423 0.99998974 +v -0.60378789 0.96712005 0.99998974 +v -0.60378789 1.00000047 0.99998974 +v -0.60378789 1.01116871 0.99998974 +v -0.60378789 0.92687499 0.99998974 +v -0.60378789 0.90619099 0.99998986 +v -0.58093953 0.90619099 0.99998974 +v -0.52191448 1.02424109 0.99998986 +v -0.53905081 1.02424109 0.99998974 +v -0.53905081 1.02424109 -0.99998974 +v -0.55342888 1.02424109 -0.99998974 +v -0.58093953 1.02424109 0.99998974 +v -0.56761121 1.02424109 0.99998974 +v -0.60378789 1.02424109 -0.99998974 +v -0.58474755 1.02424109 -0.99998974 +v -0.58093953 1.02424109 -0.99998974 +v -0.55999517 1.02424109 -0.99998974 +v -0.55342888 1.02424109 0.99998974 +v -0.52191448 1.02424109 -0.99998974 +v -0.58474755 1.02424109 0.99998974 +v -0.60378789 1.02424109 0.99998974 +v -0.56761121 0.90619099 0.99998974 +v -0.55999517 0.90619099 0.99998974 +v -0.56873476 0.90619099 0.99998974 +v -0.57539379 0.90619099 0.99998974 +v -0.56873476 0.90619099 -0.99998974 +v -0.57539379 0.90619099 -0.99998974 +v -0.55342888 0.90619099 -0.99998974 +v -0.55999517 0.90619099 -0.99998974 +v -0.55999517 1.02424109 0.99998974 +v -0.56761121 1.02424109 -0.99998974 +v -0.55342888 0.90619099 0.99998974 +v -0.56761121 0.90619099 -0.99998974 +v -0.56873452 0.90619099 0.99998974 +v -0.56873452 0.90619099 -0.99998974 +v -0.52191448 0.97854423 0.99998974 +v -0.52191448 0.92687499 0.99998974 +v -0.52191448 0.98452842 0.99998974 +v -0.52191448 0.98452842 -0.99998974 +v -0.52191448 0.92142319 0.99998974 +v -0.52191448 0.97854423 -0.99998974 +v -0.52191448 0.92687499 -0.99998974 +v -0.52191448 0.92142319 -0.99998974 +v -0.52953064 0.90619099 0.99998974 +v -0.53905081 0.90619099 0.99998974 +v -0.54857099 0.90619099 -0.99998974 +v -0.53905081 0.90619099 -0.99998974 +v -0.54857099 0.90619099 0.99998974 +v -0.52191448 0.90619099 0.99998974 +v -0.52953064 0.90619099 -0.99998974 +v -0.52191448 0.90619099 -0.99998974 +v -0.53905081 0.97092807 0.99998974 +v -0.52953064 0.97092807 0.99998974 +v -0.46860146 0.97092807 -0.99998974 +v -0.4857378 0.97092807 -0.99998974 +v -0.51049029 1.11373066 0.99998974 +v -0.53905081 1.11373066 0.99998974 +v -0.48002576 1.11373066 -0.99998974 +v -0.46860146 1.11373066 -0.99998974 +v -0.56761121 0.97092807 0.99998974 +v -0.58093953 0.97092807 0.99998974 +v -0.55342888 0.97092807 -0.99998974 +v -0.54539763 0.97092807 -0.99998974 +v -0.55342888 1.11373066 -0.99998974 +v -0.53905081 1.11373066 -0.99998974 +v -0.55342888 1.11373066 0.99998974 +v -0.56971573 1.11373066 0.99998974 +v -0.46860146 0.97092807 0.99998974 +v -0.45717728 0.97092807 0.99998974 +v -0.45717728 0.97854423 0.99998974 +v -0.45717728 1.02804911 0.99998974 +v -0.45717728 1.0261451 0.99998974 +v -0.45717728 1.10801863 0.99998974 +v -0.45717728 1.11373066 0.99998986 +v -0.46860146 1.11373066 0.99998974 +v -0.59426772 0.97854423 -0.99998974 +v -0.59426772 0.97092807 -0.99998974 +v -0.58093953 0.97092807 -0.99998974 +v -0.55999517 0.97092807 -0.99998974 +v -0.59426772 1.01675283 -0.99998974 +v -0.59426772 1.00000047 -0.99998974 +v -0.56971573 1.11373066 -0.99998986 +v -0.55342888 0.97092807 0.99998974 +v -0.54539763 0.97092807 0.99998974 +v -0.45717728 1.10801863 -0.99998974 +v -0.45717728 1.11373066 -0.99998986 +v -0.49999523 0.97092807 -0.99998974 +v -0.51620233 0.97092807 -0.99998974 +v -0.51049029 1.11373066 -0.99998974 +v -0.49999523 1.11373066 -0.99998974 +v -0.49999523 0.97092807 0.99998974 +v -0.4857378 0.97092807 0.99998974 +v -0.48002576 1.11373066 0.99998974 +v -0.49999523 1.11373066 0.99998974 +v -0.45717728 1.02995312 0.99998974 +v -0.59426772 1.05660963 -0.99998974 +v -0.59426772 1.07974112 -0.99998974 +v -0.45717728 1.00000047 0.99998974 +v -0.45717728 0.98996841 0.99998974 +v -0.59426772 0.97854423 0.99998974 +v -0.59426772 0.97092807 0.99998974 +v -0.59426772 1.00000047 0.99998974 +v -0.59426772 1.01675283 0.99998974 +v -0.59426772 1.11373066 -0.99998974 +v -0.58474755 1.11373066 -0.99998974 +v -0.45717728 1.07974112 0.99998974 +v -0.45717728 1.05660963 0.99998974 +v -0.59426772 1.02804911 -0.99998974 +v -0.59426772 1.03947329 -0.99998974 +v -0.58093953 1.11373066 0.99998974 +v -0.58474755 1.11373066 0.99998974 +v -0.45717728 1.03566527 0.99998974 +v -0.45717728 1.0528016 0.99998974 +v -0.59426772 1.02424109 -0.99998974 +v -0.59426772 1.02804911 0.99998974 +v -0.59426772 1.02424109 0.99998974 +v -0.59426772 1.05660963 0.99998974 +v -0.59426772 1.07974112 0.99998974 +v -0.58093953 1.11373066 -0.99998974 +v -0.59426772 1.11373066 0.99998974 +v -0.59426772 1.03947329 0.99998974 +v -0.55999517 0.97092807 0.99998974 +v -0.56761121 0.97092807 -0.99998974 +v -0.45717728 0.97092807 -0.99998974 +v -0.45717728 0.97854423 -0.99998974 +v -0.45717728 1.02804911 -0.99998974 +v -0.45717728 1.0261451 -0.99998974 +v -0.45717728 1.07974112 -0.99998974 +v -0.45717728 1.02995312 -0.99998974 +v -0.45717728 1.00000047 -0.99998974 +v -0.45717728 0.98996841 -0.99998974 +v -0.45717728 1.05660963 -0.99998974 +v -0.45717728 1.03566527 -0.99998974 +v -0.45717728 1.0528016 -0.99998974 +v -0.52191448 0.97092807 0.99998974 +v -0.52953064 0.97092807 -0.99998974 +v -0.53905081 0.97092807 -0.99998974 +v -0.45717728 0.98044824 0.99998974 +v -0.45717728 0.98044824 -0.99998974 +v -0.52191448 0.97092807 -0.99998974 +v -0.51620233 0.97092807 0.99998974 +v -0.54095482 1.14419519 -0.99998974 +v -0.54095482 1.11373066 -0.99998974 +v -0.54095482 1.14419519 0.99998974 +v -0.54095482 1.11373066 0.99998974 +v -0.46860146 1.19941222 -0.99998974 +v -0.48002576 1.19941222 -0.99998974 +v -0.54095482 1.05660963 -0.99998974 +v -0.54095482 1.0528016 -0.99998974 +v -0.54095482 1.17275571 -0.99998974 +v -0.54095482 1.18798804 -0.99998974 +v -0.46860146 1.19941222 0.99998974 +v -0.44423866 1.19941222 0.99998986 +v -0.44423866 1.19941222 -0.99998986 +v -0.42689764 1.19941222 -0.99998974 +v -0.54095482 1.17275571 0.99998974 +v -0.54095482 1.18798804 0.99998974 +v -0.49999523 1.19941222 0.99998986 +v -0.48002576 1.19941222 0.99998974 +v -0.42689764 1.19941222 0.99998974 +v -0.42671275 1.19941222 0.99998974 +v -0.42671275 1.19941222 0.99998986 +v -0.54095482 1.07974112 -0.99998974 +v -0.54095482 1.07974112 0.99998974 +v -0.54095482 1.05660963 0.99998974 +v -0.53905081 1.19941222 0.99998974 +v -0.51429832 1.19941222 0.99998974 +v -0.54095482 1.19941222 -0.99998986 +v -0.53905081 1.19941222 -0.99998974 +v -0.54095482 1.19941222 0.99998986 +v -0.51429832 1.19941222 -0.99998974 +v -0.50668215 1.19941222 0.99998974 +v -0.51049029 1.19941222 0.99998974 +v -0.51049029 1.19941222 -0.99998974 +v -0.50668215 1.19941222 -0.99998974 +v -0.49999523 1.19941222 -0.99998986 +v -0.42671275 1.19941222 -0.99998974 +v -0.42671275 1.19941222 -0.99998986 +v -0.42671275 1.0528016 0.99998974 +v -0.42671275 1.0528016 -0.99998974 +v -0.54095482 1.0528016 0.99998974 +v -0.54095482 1.10801863 -0.99998974 +v -0.54095482 1.10801863 0.99998974 +v -0.46669745 1.19985008 0.99998974 +v -0.46669745 1.20322024 0.99998974 +v -0.42671275 1.25272512 -0.99998974 +v -0.44423866 1.25272512 -0.99998986 +v -0.46669745 1.24999797 0.99998974 +v -0.46669745 1.25272512 0.99998998 +v -0.44423866 1.25272512 0.99998986 +v -0.46669745 1.19985008 -0.99998974 +v -0.46669745 1.20322024 -0.99998974 +v -0.46669745 1.24999797 -0.99998974 +v -0.46669745 1.25272512 -0.99998986 +v -0.41338455 1.20895862 0.99998974 +v -0.41338455 1.2200104 0.99998974 +v -0.42671275 1.25272512 0.99998974 +v -0.42290473 1.25272512 0.99998974 +v -0.41909658 1.16323554 0.99998974 +v -0.41338455 1.16323554 0.99998974 +v -0.41338455 1.17275571 0.99998974 +v -0.46669745 1.22416472 0.99998974 +v -0.46669745 1.22416472 -0.99998974 +v -0.46669745 1.17275571 0.99998974 +v -0.46669745 1.19941222 0.99998974 +v -0.46669745 1.17275571 -0.99998974 +v -0.46669745 1.19941222 -0.99998974 +v -0.41338455 1.2200104 -0.99998974 +v -0.41338455 1.20895862 -0.99998974 +v -0.41338455 1.24999797 -0.99998974 +v -0.41338455 1.25272512 -0.99998974 +v -0.42290473 1.25272512 -0.99998974 +v -0.42671275 1.16323554 -0.99998974 +v -0.41909658 1.16323554 -0.99998974 +v -0.41338455 1.22416472 -0.99998974 +v -0.41338455 1.19985067 -0.99998974 +v -0.41338455 1.17275571 -0.99998974 +v -0.46669745 1.16323554 0.99998974 +v -0.44423866 1.16323554 0.99998974 +v -0.43813693 1.16323554 -0.99998974 +v -0.46669745 1.16323554 -0.99998974 +v -0.44423866 1.16323554 -0.99998974 +v -0.43813693 1.16323554 0.99998974 +v -0.46669745 1.21654844 0.99998974 +v -0.46669745 1.22035658 0.99998974 +v -0.46669745 1.21654844 -0.99998974 +v -0.46669745 1.22035658 -0.99998974 +v -0.41338455 1.24999797 0.99998974 +v -0.41338455 1.25272512 0.99998962 +v -0.41338455 1.22416472 0.99998974 +v -0.41338455 1.20322024 -0.99998974 +v -0.42671275 1.16323554 0.99998974 +v -0.41338455 1.19985067 0.99998974 +v -0.41338455 1.16323554 -0.99998974 +v -0.41338455 1.20322024 0.99998974 +v -0.57522738 1.22416472 0.99998974 +v -0.57522738 1.20702838 0.99998974 +v -0.57522738 1.28699779 0.99998974 +v -0.57522738 1.24999797 0.99998974 +v -0.53905081 1.30603814 0.99998974 +v -0.53143465 1.30603814 0.99998974 +v -0.57522738 1.30223012 0.99998974 +v -0.57522738 1.30603814 0.99998974 +v -0.56320953 1.30603814 0.99998974 +v -0.53905081 1.30603814 -0.99998974 +v -0.55342888 1.30603814 -0.99998986 +v -0.57522738 1.30223012 -0.99998974 +v -0.57522738 1.30603814 -0.99998974 +v -0.56320953 1.30603814 -0.99998974 +v -0.55342888 1.30603814 0.99998986 +v -0.51049029 1.22416472 0.99998974 +v -0.51049029 1.28699779 0.99998974 +v -0.51049029 1.24999761 0.99998974 +v -0.51049029 1.30603814 0.99998974 +v -0.51429832 1.30603814 0.99998974 +v -0.51429832 1.30603814 -0.99998974 +v -0.53143465 1.30603814 -0.99998974 +v -0.53905081 1.18989205 0.99998974 +v -0.51429832 1.18989205 0.99998974 +v -0.55342888 1.18989205 0.99998974 +v -0.56052005 1.18989205 0.99998974 +v -0.55342888 1.18989205 -0.99998974 +v -0.56052005 1.18989205 -0.99998974 +v -0.57522738 1.22416472 -0.99998974 +v -0.57522738 1.20702838 -0.99998974 +v -0.57522738 1.28699779 -0.99998974 +v -0.57522738 1.24999797 -0.99998974 +v -0.57522738 1.19179606 0.99998974 +v -0.57522738 1.19985055 0.99998974 +v -0.57522738 1.18989205 0.99998974 +v -0.57522738 1.19179606 -0.99998974 +v -0.57522738 1.18989205 -0.99998974 +v -0.57522738 1.19985055 -0.99998974 +v -0.51049029 1.22416472 -0.99998974 +v -0.51049029 1.28699779 -0.99998974 +v -0.51049029 1.24999761 -0.99998974 +v -0.51049029 1.30603814 -0.99998986 +v -0.51049029 1.18989205 0.99998974 +v -0.51049029 1.18989205 0.99998986 +v -0.51049029 1.18989205 -0.99998974 +v -0.51429832 1.18989205 -0.99998974 +v -0.54095482 1.18989205 -0.99998974 +v -0.53905081 1.18989205 -0.99998974 +v -0.54095482 1.18989205 0.99998974 +v -0.53524267 1.28699779 0.99998974 +v -0.53524267 1.24999797 0.99998974 +v -0.56761121 1.22035658 0.99998974 +v -0.57522738 1.22035658 0.99998974 +v -0.53905081 1.34411883 0.99998974 +v -0.55342924 1.34411883 0.99998974 +v -0.58093953 1.34411883 0.99998974 +v -0.60378789 1.34411883 0.99998974 +v -0.62282824 1.34411883 0.99998974 +v -0.638278 1.34411883 0.99998974 +v -0.62282824 1.34411883 -0.99998974 +v -0.638278 1.34411883 -0.99998974 +v -0.58093953 1.34411883 -0.99998974 +v -0.55342924 1.34411883 -0.99998974 +v -0.62200713 1.34411883 0.99998974 +v -0.62200713 1.34411883 -0.99998974 +v -0.60378789 1.34411883 -0.99998974 +v -0.6685251 1.22416472 -0.99998974 +v -0.6685251 1.22035658 -0.99998974 +v -0.64758074 1.22035658 -0.99998974 +v -0.6685251 1.24999797 -0.99998974 +v -0.6685251 1.28699779 -0.99998974 +v -0.6685251 1.33872151 0.99998974 +v -0.6685251 1.34411883 0.99998974 +v -0.6601088 1.34411883 0.99998974 +v -0.6685251 1.33872151 -0.99998974 +v -0.6685251 1.34411883 -0.99998974 +v -0.6601088 1.34411883 -0.99998974 +v -0.6685251 1.22416472 0.99998974 +v -0.6685251 1.22035658 0.99998974 +v -0.64758074 1.22035658 0.99998974 +v -0.63425242 1.22035658 0.99998974 +v -0.6685251 1.24999797 0.99998974 +v -0.6685251 1.28699779 0.99998974 +v -0.6685251 1.31449985 0.99998974 +v -0.6685251 1.32260727 0.99998974 +v -0.6685251 1.32260727 -0.99998974 +v -0.6685251 1.31449985 -0.99998974 +v -0.64758074 1.34411883 0.99998974 +v -0.64758074 1.34411883 -0.99998974 +v -0.58474755 1.22035658 -0.99998974 +v -0.58093953 1.22035658 -0.99998974 +v -0.56761121 1.22035658 -0.99998974 +v -0.55342888 1.22035658 -0.99998974 +v -0.53905081 1.34411883 -0.99998974 +v -0.53524267 1.22416472 0.99998974 +v -0.53524267 1.31449961 0.99998974 +v -0.53524267 1.30603814 0.99998974 +v -0.64598035 1.34411883 0.99998974 +v -0.64598035 1.34411883 -0.99998974 +v -0.58474755 1.22035658 0.99998974 +v -0.61436593 1.22035658 0.99998974 +v -0.62282824 1.22035658 -0.99998974 +v -0.63234841 1.22035658 -0.99998974 +v -0.53524267 1.34195029 -0.99998974 +v -0.53524267 1.34411883 -0.99998974 +v -0.53594207 1.34411883 -0.99998974 +v -0.53524267 1.34195029 0.99998974 +v -0.53524267 1.34411883 0.99998974 +v -0.53594207 1.34411883 0.99998974 +v -0.53524267 1.31449961 -0.99998974 +v -0.53524267 1.32507848 -0.99998974 +v -0.61436593 1.22035658 -0.99998974 +v -0.58093953 1.22035658 0.99998974 +v -0.55342888 1.22035658 0.99998974 +v -0.63234841 1.22035658 0.99998974 +v -0.62282824 1.22035658 0.99998974 +v -0.57522738 1.22035658 -0.99998974 +v -0.63425242 1.22035658 -0.99998974 +v -0.53524267 1.33474516 -0.99998974 +v -0.53524267 1.33796739 -0.99998974 +v -0.53524267 1.33650267 -0.99998974 +v -0.53524267 1.33474516 0.99998974 +v -0.53524267 1.32507848 0.99998974 +v -0.53524267 1.33840668 -0.99998974 +v -0.53524267 1.33840668 0.99998974 +v -0.53524267 1.33796739 0.99998974 +v -0.53905081 1.22035658 0.99998974 +v -0.53524267 1.22035658 0.99998974 +v -0.53524267 1.33650267 0.99998974 +v -0.53905081 1.22035658 -0.99998974 +v -0.53524267 1.22035658 -0.99998974 +v -0.53524267 1.22416472 -0.99998974 +v -0.53524267 1.28699779 -0.99998974 +v -0.53524267 1.24999797 -0.99998974 +v -0.53524267 1.30603814 -0.99998974 +v -0.550475 1.33650267 0.99998974 +v -0.550475 1.32507848 0.99998974 +v -0.550475 1.43187916 -0.99998986 +v -0.550475 1.44312858 -0.99998974 +v -0.550475 1.38597464 0.99998974 +v -0.550475 1.37648737 0.99998974 +v -0.550475 1.43187916 0.99998986 +v -0.550475 1.35376095 0.99998974 +v -0.550475 1.34411883 0.99998974 +v -0.40196025 1.44503259 0.99998974 +v -0.40196025 1.43187916 0.99998974 +v -0.550475 1.44312858 0.99998974 +v -0.550475 1.33650267 -0.99998974 +v -0.550475 1.32507848 -0.99998974 +v -0.550475 1.38597464 -0.99998974 +v -0.550475 1.37648737 -0.99998974 +v -0.550475 1.35376095 -0.99998974 +v -0.550475 1.34411883 -0.99998974 +v -0.40196025 1.35376095 -0.99998974 +v -0.40196025 1.3669672 -0.99998974 +v -0.40196025 1.38597476 -0.99998974 +v -0.40196025 1.41266405 -0.99998974 +v -0.40196025 1.41266405 0.99998974 +v -0.40196025 1.38597476 0.99998974 +v -0.40196025 1.3669672 0.99998974 +v -0.40196025 1.32693624 -0.99998974 +v -0.40196025 1.32967066 -0.99998974 +v -0.40196025 1.33650267 -0.99998974 +v -0.40196025 1.35376095 0.99998974 +v -0.40196025 1.33650267 0.99998974 +v -0.40196025 1.32967066 0.99998974 +v -0.40196025 1.32693624 0.99998974 +v -0.53905081 1.4469366 0.99998974 +v -0.52953064 1.4469366 0.99998974 +v -0.550475 1.44503259 -0.99998974 +v -0.550475 1.4469366 -0.99998974 +v -0.53905081 1.4469366 -0.99998974 +v -0.42671275 1.4469366 -0.99998974 +v -0.44423866 1.4469366 -0.99998974 +v -0.550475 1.44503259 0.99998974 +v -0.550475 1.4469366 0.99998986 +v -0.49999523 1.4469366 -0.99998974 +v -0.52953064 1.4469366 -0.99998974 +v -0.44423866 1.4469366 0.99998974 +v -0.42671275 1.4469366 0.99998974 +v -0.48954582 1.29270982 -0.99998974 +v -0.47359955 1.29270982 -0.99998974 +v -0.550475 1.30603814 -0.99998974 +v -0.550475 1.29270982 -0.99998986 +v -0.53905081 1.29270982 -0.99998974 +v -0.42671275 1.29270982 -0.99998974 +v -0.44423866 1.29270982 -0.99998974 +v -0.550475 1.30603814 0.99998974 +v -0.550475 1.29270982 0.99998974 +v -0.53905081 1.29270982 0.99998974 +v -0.49999523 1.29270982 -0.99998974 +v -0.50668215 1.29270982 -0.99998974 +v -0.48954582 1.29270982 0.99998974 +v -0.47359955 1.29270982 0.99998974 +v -0.44423866 1.29270982 0.99998974 +v -0.42671275 1.29270982 0.99998974 +v -0.40196025 1.31449985 0.99998974 +v -0.40196025 1.31449985 -0.99998974 +v -0.40196025 1.44503259 -0.99998974 +v -0.40196025 1.43187916 -0.99998974 +v -0.46860146 1.4469366 0.99998974 +v -0.4476571 1.4469366 0.99998974 +v -0.46860146 1.4469366 -0.99998974 +v -0.4476571 1.4469366 -0.99998974 +v -0.47621762 1.4469366 0.99998974 +v -0.49144995 1.4469366 -0.99998974 +v -0.550475 1.36125516 0.99998974 +v -0.550475 1.36125516 -0.99998974 +v -0.49144995 1.4469366 0.99998974 +v -0.49999523 1.4469366 0.99998974 +v -0.47621762 1.4469366 -0.99998974 +v -0.44452369 1.4469366 0.99998974 +v -0.40196025 1.4469366 0.99998974 +v -0.44452369 1.4469366 -0.99998974 +v -0.40196025 1.4469366 -0.99998974 +v -0.46860146 1.29270982 0.99998974 +v -0.44694864 1.29270982 0.99998974 +v -0.44694864 1.29270982 -0.99998974 +v -0.46860146 1.29270982 -0.99998974 +v -0.550475 1.31449985 0.99998986 +v -0.550475 1.31449985 -0.99998986 +v -0.550475 1.33840668 0.99998974 +v -0.550475 1.33840668 -0.99998974 +v -0.50668215 1.29270982 0.99998974 +v -0.49999523 1.29270982 0.99998974 +v -0.49322068 1.29270982 -0.99998974 +v -0.49322068 1.29270982 0.99998974 +v -0.42290473 1.29270982 0.99998974 +v -0.40196025 1.29270982 0.99998974 +v -0.42290473 1.29270982 -0.99998974 +v -0.40196025 1.29270982 -0.99998974 +v -0.53143465 1.29270982 0.99998974 +v -0.53524267 1.29270982 0.99998974 +v -0.51049029 1.29270982 0.99998974 +v -0.51429832 1.29270982 0.99998974 +v -0.53143465 1.29270982 -0.99998974 +v -0.51429832 1.29270982 -0.99998974 +v -0.51049029 1.29270982 -0.99998974 +v -0.53524267 1.29270982 -0.99998974 +v -0.44194507 1.43187916 -0.99998986 +v -0.44194507 1.43360841 -0.99998986 +v -0.42671275 1.43360841 -0.99998974 +v -0.44194507 1.35376095 -0.99998974 +v -0.44194507 1.3669672 -0.99998974 +v -0.44194507 1.38597464 -0.99998974 +v -0.44194507 1.41266405 -0.99998974 +v -0.44194507 1.43187916 0.99998986 +v -0.44194507 1.41266405 0.99998974 +v -0.44194507 1.38597464 0.99998974 +v -0.44194507 1.3669672 0.99998974 +v -0.37149572 1.43187916 -0.99998974 +v -0.37149572 1.43360841 -0.99998962 +v -0.38292002 1.43360841 -0.99998974 +v -0.37149572 1.32330107 -0.99998974 +v -0.37149572 1.31449985 -0.99998974 +v -0.44194507 1.33650267 -0.99998974 +v -0.44194507 1.35376095 0.99998974 +v -0.44194507 1.33650267 0.99998974 +v -0.37149572 1.32330107 0.99998974 +v -0.37149572 1.31449985 0.99998974 +v -0.42671275 1.43360841 0.99998974 +v -0.40196025 1.43360841 0.99998974 +v -0.37149572 1.38597476 -0.99998974 +v -0.37149572 1.43187916 0.99998974 +v -0.37149572 1.38597476 0.99998974 +v -0.44194507 1.31532275 -0.99998986 +v -0.44194507 1.31532275 0.99998986 +v -0.37149572 1.38531422 -0.99998974 +v -0.37149572 1.37242877 -0.99998974 +v -0.37149572 1.38531422 0.99998974 +v -0.37149572 1.37242877 0.99998974 +v -0.39624822 1.43360841 -0.99998974 +v -0.37149572 1.43360841 0.99998974 +v -0.38292002 1.43360841 0.99998974 +v -0.44194507 1.31449985 -0.99998986 +v -0.37149572 1.33241701 -0.99998974 +v -0.37149572 1.32825171 -0.99998974 +v -0.44194507 1.31449985 0.99998986 +v -0.37149572 1.32825171 0.99998974 +v -0.37149572 1.33241701 0.99998974 +v -0.44194507 1.43360841 1.00120329 +v -0.37149572 1.35376095 -0.99998974 +v -0.37149572 1.3669672 -0.99998974 +v -0.37149572 1.35376095 0.99998974 +v -0.37149572 1.3669672 0.99998974 +v -0.39053607 1.30032599 -0.99998974 +v -0.37149572 1.30032599 -0.99998974 +v -0.39624822 1.43360841 0.99998974 +v -0.40196025 1.43360841 -0.99998974 +v -0.40196025 1.30032599 0.99998974 +v -0.39053607 1.30032599 0.99998974 +v -0.44194507 1.30223012 -0.99998974 +v -0.44194507 1.30223012 0.99998974 +v -0.40196025 1.30032599 -0.99998974 +v -0.37149572 1.30032599 0.99998974 +v -0.44194507 1.30032599 -0.99998986 +v -0.42671275 1.30032599 -0.99998974 +v -0.44194507 1.30032599 0.99998986 +v -0.42671275 1.30032599 0.99998974 +v -0.42290473 1.30032599 0.99998974 +v -0.42290473 1.30032599 -0.99998974 +v -0.53143465 1.44312858 0.99998974 +v -0.53143465 1.43187916 0.99998974 +v -0.53143465 1.49999535 0.99998974 +v -0.53143465 1.50786566 0.99998986 +v -0.49999523 1.50786566 0.99998986 +v -0.46860146 1.50786566 -0.99998974 +v -0.44956111 1.44503259 0.99998974 +v -0.44956111 1.43187916 0.99998974 +v -0.44956111 1.49999535 0.99998974 +v -0.44956111 1.50786566 0.99998974 +v -0.46860146 1.50786566 0.99998974 +v -0.44956111 1.36476612 -0.99998974 +v -0.44956111 1.35376095 -0.99998974 +v -0.53143465 1.37648737 -0.99998974 +v -0.53143465 1.38597476 -0.99998974 +v -0.44956111 1.43187916 -0.99998974 +v -0.44956111 1.42988777 -0.99998986 +v -0.45146524 1.35173487 -0.99998974 +v -0.44956111 1.35173487 -0.99998974 +v -0.46860146 1.35173487 0.99998974 +v -0.48192977 1.35173487 0.99998974 +v -0.53143465 1.49999535 -0.99998974 +v -0.53143465 1.50786566 -0.99998986 +v -0.49999511 1.50786566 -0.99998986 +v -0.49144995 1.50786566 0.99998974 +v -0.53143465 1.38597476 0.99998974 +v -0.44956111 1.42988777 0.99998974 +v -0.49999535 1.35173487 -0.99998974 +v -0.48192977 1.35173487 -0.99998974 +v -0.45146524 1.35173487 0.99998974 +v -0.44956111 1.35173487 0.99998974 +v -0.44956111 1.35376095 0.99998974 +v -0.53143465 1.46788096 0.99998974 +v -0.53143465 1.4469366 0.99998974 +v -0.53143465 1.44503259 0.99998974 +v -0.47621762 1.50786566 -0.99998974 +v -0.44956111 1.49999535 -0.99998974 +v -0.44956111 1.50786566 -0.99998974 +v -0.53143465 1.48692131 0.99998974 +v -0.44956111 1.49503374 0.99998974 +v -0.44956111 1.46788096 0.99998974 +v -0.44956111 1.4469366 0.99998974 +v -0.44956111 1.44503259 -0.99998974 +v -0.44956111 1.4469366 -0.99998974 +v -0.44956111 1.49503374 -0.99998974 +v -0.53143465 1.48692131 -0.99998974 +v -0.47621762 1.50786566 0.99998974 +v -0.49144995 1.50786566 -0.99998974 +v -0.53143465 1.43187916 -0.99998974 +v -0.53143465 1.44312858 -0.99998974 +v -0.53143465 1.37648737 0.99998974 +v -0.53143465 1.46788096 -0.99998974 +v -0.53143465 1.4469366 -0.99998974 +v -0.53143465 1.44503259 -0.99998974 +v -0.46860146 1.35173487 -0.99998974 +v -0.45908129 1.35173487 -0.99998974 +v -0.51429832 1.35173487 -0.99998974 +v -0.44956111 1.36476612 0.99998974 +v -0.51429832 1.35173487 0.99998974 +v -0.49999535 1.35173487 0.99998974 +v -0.45908129 1.35173487 0.99998974 +v -0.44956111 1.46788096 -0.99998974 +v -0.44956111 1.38597476 0.99998974 +v -0.44956111 1.41266405 0.99998974 +v -0.44956111 1.42498862 -0.99998974 +v -0.44956111 1.41266405 -0.99998974 +v -0.44956111 1.42498862 0.99998974 +v -0.44956111 1.38597476 -0.99998974 +v -0.44956111 1.3669672 -0.99998974 +v -0.44956111 1.3669672 0.99998974 +v -0.53143465 1.35173487 -0.99998974 +v -0.53143465 1.35173487 0.99998974 +v -0.44384908 1.63831281 0.99998974 +v -0.44384908 1.6141529 0.99998974 +v -0.44384908 1.6141529 -0.99998974 +v -0.44384908 1.63831281 -0.99998974 +v -0.56951534 1.63831281 -0.99998974 +v -0.56951534 1.63734006 -0.99998974 +v -0.56951534 1.6141529 0.99998974 +v -0.56951534 1.63162791 0.99998974 +v -0.44384908 1.56563687 -0.99998986 +v -0.44384908 1.59735536 -0.99998974 +v -0.56951534 1.61167287 0.99998974 +v -0.56951534 1.63831281 0.99998974 +v -0.56951534 1.67351675 0.99998974 +v -0.55342912 1.68113279 0.99998974 +v -0.53905081 1.68113279 0.99998974 +v -0.49999535 1.68113279 -0.99998974 +v -0.52889597 1.68113279 -0.99998974 +v -0.44384908 1.67351675 -0.99998974 +v -0.56951534 1.67351675 -0.99998974 +v -0.56951534 1.68113279 -0.99998998 +v -0.55342912 1.68113279 -0.99998974 +v -0.56951534 1.68113279 0.99998974 +v -0.44384908 1.67700481 0.99998974 +v -0.44384908 1.67379772 0.99998974 +v -0.44384908 1.67700481 -0.99998974 +v -0.44384908 1.67379772 -0.99998974 +v -0.56951534 1.6141529 -0.99998974 +v -0.56951534 1.61167287 -0.99998974 +v -0.49999535 1.68113279 0.99998974 +v -0.52889597 1.68113279 0.99998974 +v -0.53905081 1.68113279 -0.99998974 +v -0.53905081 1.54404234 0.99998974 +v -0.49999523 1.54404234 0.99998974 +v -0.46860146 1.54404234 -0.99998974 +v -0.53905081 1.54404234 -0.99998974 +v -0.55342888 1.54404234 -0.99998974 +v -0.56951534 1.56563687 0.99998974 +v -0.56951534 1.54404234 0.99998974 +v -0.55618703 1.54404234 0.99998974 +v -0.46860146 1.54404234 0.99998974 +v -0.4476571 1.54404234 0.99998974 +v -0.55618703 1.54404234 -0.99998974 +v -0.55342888 1.54404234 0.99998974 +v -0.44423866 1.54404234 -0.99998974 +v -0.4476571 1.54404234 -0.99998974 +v -0.49999523 1.54404234 -0.99998974 +v -0.47621762 1.54404234 0.99998974 +v -0.44423866 1.54404234 0.99998974 +v -0.44384908 1.54404234 0.99998986 +v -0.44384908 1.56563687 0.99998986 +v -0.46860146 1.68113279 -0.99998974 +v -0.44423878 1.68113279 -0.99998974 +v -0.46860146 1.68113279 0.99998974 +v -0.48002576 1.68113279 0.99998974 +v -0.48002576 1.68113279 -0.99998974 +v -0.44423878 1.68113279 0.99998974 +v -0.56951534 1.63162791 -0.99998974 +v -0.56951534 1.63734006 0.99998974 +v -0.44384908 1.68113279 0.99998974 +v -0.44384908 1.68113279 -0.99998974 +v -0.44384908 1.67351675 0.99998974 +v -0.44384908 1.59735536 0.99998974 +v -0.44384908 1.54404234 -0.99998986 +v -0.47621762 1.54404234 -0.99998974 +v -0.56951534 1.56563687 -0.99998974 +v -0.56951534 1.54404234 -0.99998974 +g Group47027 +f 389 388 1 99 +g Group18791 +f 5 104 108 107 +g Group43079 +f 6 109 113 112 +g Group18791 +f 8 114 118 117 +g Group43079 +f 7 119 123 122 +g Group47027 +f 392 391 7 124 +g Group29571 +f 131 452 451 132 +g Group12339 +f 137 900 901 133 +g Group47027 +f 12 396 395 141 +g Group18791 +f 1498 1496 14 143 +f 152 1502 1501 1101 +f 1106 156 16 1104 +g Group43079 +f 18 158 162 161 +f 20 163 167 166 +f 15 168 172 171 +g Group18791 +f 173 1412 1414 21 +f 182 1415 1416 1109 +f 19 1112 1114 186 +g Group43079 +f 24 188 192 191 +f 25 193 197 196 +f 22 198 202 201 +g Group29571 +f 206 454 453 207 +g Group12339 +f 904 903 212 211 +g Group47027 +f 24 400 399 188 +g Group29571 +f 100 456 455 219 +g Group23409 +f 709 708 31 218 +g Group47027 +f 30 404 403 224 +g Group18791 +f 1330 1328 32 226 +f 232 1334 1333 1173 +f 1178 233 35 1176 +g Group43079 +f 37 235 237 110 +f 41 236 241 240 +f 40 111 243 242 +g Group18791 +f 203 1580 1582 42 +f 249 1583 1584 1181 +f 45 1184 1186 250 +g Group43079 +f 47 252 254 120 +f 51 253 258 257 +f 50 121 260 259 +g Group29571 +f 125 458 457 262 +g Group23409 +f 712 711 55 261 +g Group47027 +f 47 408 407 252 +g Group29571 +f 129 460 459 271 +g Group23409 +f 59 660 659 274 +g Group12339 +f 220 868 867 276 +g Group23409 +f 58 662 661 134 +g Group29571 +f 283 520 521 278 +f 285 522 523 286 +g Group23409 +f 29 716 715 139 +g Group29571 +f 290 524 525 291 +g Group47027 +f 65 412 411 293 +g Group18791 +f 1666 1664 67 295 +f 300 1670 1669 1189 +f 301 1506 1505 1193 +f 303 1674 1673 1117 +f 306 1678 1677 1029 +f 308 1510 1509 1033 +f 310 1338 1337 1121 +f 312 1342 1341 1037 +f 1042 313 73 1040 +g Group43079 +f 75 315 317 159 +f 77 316 320 319 +f 38 160 321 238 +f 76 318 323 164 +f 80 322 326 325 +f 79 165 328 327 +f 39 239 330 169 +f 81 329 332 331 +f 70 170 333 304 +g Group18791 +f 124 1244 1246 52 +f 338 1247 1248 1197 +f 339 1419 1420 1201 +f 341 1251 1252 1125 +f 344 1255 1256 1045 +f 346 1423 1424 1049 +f 348 1587 1588 1129 +f 350 1591 1592 1053 +f 78 1056 1058 324 +g Group43079 +f 88 352 354 189 +f 90 353 357 356 +f 48 190 358 255 +f 89 355 360 194 +f 92 359 362 361 +f 91 195 364 363 +f 49 256 366 199 +f 93 365 368 367 +f 84 200 369 342 +g Group29571 +f 204 462 461 371 +g Group23409 +f 95 664 663 373 +g Group12339 +f 263 870 869 375 +g Group23409 +f 94 666 665 209 +g Group29571 +f 532 531 379 378 +f 380 533 534 381 +g Group23409 +f 54 720 719 214 +g Group29571 +f 384 535 536 385 +g Group47027 +f 88 416 415 352 +g Group29571 +f 103 463 456 100 +f 539 538 103 100 +g Group47027 +f 102 387 404 30 +g Group18791 +f 1262 1260 104 32 +g Group53349 +f 6646 2471 5854 5853 +g Group18791 +f 1212 35 107 1211 +g Group43079 +f 109 37 110 113 +f 113 110 41 111 +f 112 113 111 40 +g Group18791 +f 42 1680 1682 114 +g Group51603 +f 46 1940 1939 1215 +g Group18791 +f 117 1217 1218 45 +g Group43079 +f 119 47 120 123 +f 123 120 51 121 +f 122 123 121 50 +g Group29571 +f 127 464 458 125 +f 542 541 127 125 +g Group47027 +f 119 390 408 47 +g Group29571 +f 132 451 460 129 +g Group23409 +f 130 668 667 59 +f 28 669 668 130 +g Group12339 +f 133 872 871 137 +g Group23409 +f 63 724 721 134 +f 62 725 723 135 +g Group29571 +f 138 547 546 142 +f 142 546 548 140 +g Group47027 +f 141 395 412 65 +g Group18791 +f 1598 1596 143 67 +g Group51603 +f 69 1602 1601 1221 +f 145 1942 1941 1222 +g Group18791 +f 149 1606 1605 1118 +g Group23801 +f 72 1610 1609 1065 +f 150 1976 1975 1066 +g Group17138 +f 4741 4740 2473 4571 +g Group63780 +f 2475 7994 7993 4175 +g Group18791 +f 1074 73 156 1073 +g Group43079 +f 158 75 159 162 +f 162 159 77 160 +f 161 162 160 38 +f 163 76 164 167 +f 167 164 80 165 +f 166 167 165 79 +f 168 39 169 172 +f 172 169 81 170 +f 171 172 170 70 +g Group18791 +f 52 1344 1346 173 +g Group27010 +f 2477 5911 5912 5619 +g Group50994 +f 175 1427 1428 1228 +g Group53875 +f 2479 4911 4912 4742 +g Group19664 +f 2481 4178 2794 +g Group56340 +f 180 1431 1432 1078 +g Group18791 +f 184 1687 1688 1130 +g Group23801 +f 87 1978 1977 1083 +g Group18791 +f 186 1085 1086 78 +g Group43079 +f 188 88 189 192 +f 192 189 90 190 +f 191 192 190 48 +f 193 89 194 197 +f 197 194 92 195 +f 196 197 195 91 +f 198 49 199 202 +f 202 199 93 200 +f 201 202 200 84 +g Group29571 +f 207 453 462 204 +g Group23409 +f 205 671 670 95 +f 53 672 671 205 +g Group12339 +f 208 874 873 212 +g Group23409 +f 729 728 97 210 +f 96 730 729 210 +g Group29571 +f 213 553 552 216 +f 216 552 554 215 +g Group47027 +f 188 399 416 88 +g Group29571 +f 219 455 452 131 +g Group23409 +f 218 673 669 28 +f 31 674 673 218 +g Group12339 +f 223 875 868 220 +f 907 906 223 220 +g Group23409 +f 222 707 716 29 +g Group29571 +f 101 537 556 225 +f 225 556 547 138 +g Group47027 +f 224 403 396 12 +g Group18791 +f 1438 1436 226 14 +g Group50994 +f 33 1442 1441 1224 +f 227 1362 1361 1232 +g Group18791 +f 229 1446 1445 1194 +f 17 1450 1449 1137 +f 230 1366 1365 1138 +g Group23865 +f 2483 5436 5437 3148 +g Group13699 +f 3004 7508 7509 5153 +g Group18791 +f 1144 16 233 1143 +g Group43079 +f 235 18 161 237 +f 237 161 38 236 +f 110 237 236 41 +f 236 38 238 241 +f 241 238 20 239 +f 240 241 239 39 +f 111 41 240 243 +f 243 240 39 168 +f 242 243 168 15 +g Group18791 +f 21 1520 1522 203 +g Group50994 +f 43 1523 1524 1230 +g Group51603 +f 244 1611 1612 1234 +g Group18791 +f 246 1527 1528 1202 +f 23 1531 1532 1147 +f 247 1615 1616 1148 +f 248 1695 1696 1182 +f 44 1699 1700 1150 +f 250 1153 1154 19 +g Group43079 +f 252 24 191 254 +f 254 191 48 253 +f 120 254 253 51 +f 253 48 255 258 +f 258 255 25 256 +f 257 258 256 49 +f 121 51 257 260 +f 260 257 49 198 +f 259 260 198 22 +g Group29571 +f 262 457 454 206 +g Group23409 +f 261 675 672 53 +f 55 676 675 261 +g Group12339 +f 266 876 870 263 +f 910 909 266 263 +g Group23409 +f 265 710 720 54 +g Group29571 +f 126 540 558 267 +f 267 558 553 213 +g Group47027 +f 252 407 400 24 +f 2 418 410 268 +g Group29571 +f 271 466 465 270 +f 271 559 544 129 +f 270 465 467 275 +f 275 467 468 273 +g Group23409 +f 274 659 662 58 +f 59 732 714 130 +g Group12339 +f 276 877 872 133 +f 276 911 907 220 +g Group29571 +f 273 468 469 279 +f 279 469 470 278 +g Group23409 +f 134 661 677 63 +g Group29571 +f 278 470 471 283 +g Group47027 +f 4 426 424 280 +f 61 427 425 281 +g Group29571 +f 286 523 519 282 +g Group47027 +f 284 428 427 61 +f 11 429 428 284 +g Group12339 +f 288 912 899 136 +g Group23409 +f 287 733 725 62 +f 66 734 733 287 +g Group29571 +f 291 525 522 285 +g Group47027 +f 289 430 429 11 +f 64 431 430 289 +g Group29571 +f 294 560 524 290 +g Group47027 +f 292 432 431 64 +f 3 433 432 292 +g Group18791 +f 295 6 112 297 +f 1238 1236 112 40 +f 296 1706 1705 1237 +f 1204 1203 40 242 +f 1158 1156 242 15 +f 298 1710 1709 1157 +f 299 1622 1621 1190 +f 68 1626 1625 1160 +f 148 1538 1537 1162 +f 1132 1131 15 171 +f 1090 1088 171 70 +f 302 1714 1713 1089 +f 1060 1059 70 304 +f 306 304 2 268 +f 56 1715 1716 268 +f 305 1630 1629 1030 +f 128 1631 1632 56 +f 9 1539 1540 128 +f 151 1454 1453 1102 +g Group56340 +f 71 1458 1457 1068 +f 4399 4398 309 1370 +g Group18791 +f 307 1462 1461 1034 +f 217 1463 1464 9 +f 27 1371 1372 217 +g Group21438 +f 2487 4005 4006 3376 +g Group18791 +f 99 1287 1288 27 +f 313 314 99 1 +g Group43079 +f 315 8 117 317 +f 317 117 45 316 +f 159 317 316 77 +f 316 45 250 320 +f 320 250 19 318 +f 319 320 318 76 +f 160 77 319 321 +f 321 319 76 163 +f 238 321 163 20 +f 318 19 186 323 +f 323 186 78 322 +f 164 323 322 80 +f 322 78 324 326 +f 326 324 4 280 +f 325 326 280 60 +f 165 80 325 328 +f 328 325 60 277 +f 327 328 277 10 +f 239 20 166 330 +f 330 166 79 329 +f 169 330 329 81 +f 329 79 327 332 +f 332 327 10 272 +f 331 332 272 57 +f 170 81 331 333 +f 333 331 57 269 +f 304 333 269 2 +g Group18791 +f 124 7 122 335 +f 1240 122 50 1242 +f 334 1289 1290 1241 +f 1205 50 259 1206 +f 1164 259 22 1166 +f 336 1293 1294 1165 +g Group25455 +f 1198 3149 3150 2489 +g Group23681 +f 3006 7510 7511 5285 +g Group18791 +f 178 1465 1466 1170 +f 1133 22 201 1134 +f 1094 201 84 1096 +f 340 1297 1298 1095 +f 1061 84 342 1062 +f 344 342 3 292 +f 1302 1301 292 64 +g Group21730 +f 2493 4043 4044 3378 +g Group18791 +f 1386 1385 64 289 +f 1470 1469 289 11 +f 181 1541 1542 1110 +g Group56340 +f 85 1545 1546 1080 +g Group23801 +f 347 1633 1634 1098 +g Group18791 +f 345 1549 1550 1050 +f 1554 1553 11 284 +f 1638 1637 284 61 +f 349 1717 1718 1054 +f 1722 1721 61 281 +f 324 351 281 4 +g Group43079 +f 352 5 107 354 +f 354 107 35 353 +f 189 354 353 90 +f 353 35 233 357 +f 357 233 16 355 +f 356 357 355 89 +f 190 90 356 358 +f 358 356 89 193 +f 255 358 193 25 +f 355 16 156 360 +f 360 156 73 359 +f 194 360 359 92 +f 359 73 313 362 +f 362 313 1 102 +f 361 362 102 30 +f 195 92 361 364 +f 364 361 30 224 +f 363 364 224 12 +f 256 25 196 366 +f 366 196 91 365 +f 199 366 365 93 +f 365 91 363 368 +f 368 363 12 141 +f 367 368 141 65 +f 200 93 367 369 +f 369 367 65 293 +f 342 369 293 3 +g Group47027 +f 435 434 8 315 +g Group29571 +f 371 473 472 370 +f 527 561 371 370 +f 370 472 474 374 +f 374 474 475 372 +g Group23409 +f 373 663 666 94 +f 736 735 95 373 +g Group12339 +f 375 878 874 208 +f 902 913 375 208 +g Group29571 +f 372 475 476 377 +f 377 476 477 376 +g Group23409 +f 209 665 678 97 +g Group29571 +f 376 477 478 379 +g Group47027 +f 443 442 6 295 +f 67 444 443 295 +g Group29571 +f 381 534 532 378 +g Group47027 +f 143 445 444 67 +f 14 446 445 143 +g Group12339 +f 383 914 904 211 +g Group23409 +f 382 737 730 96 +f 98 738 737 382 +g Group29571 +f 385 536 533 380 +g Group47027 +f 226 447 446 14 +f 32 448 447 226 +g Group29571 +f 386 562 535 384 +g Group47027 +f 104 449 448 32 +f 5 450 449 104 +g Group53272 +f 463 480 388 389 +g Group47027 +f 1 388 387 102 +g Group53272 +f 464 482 391 392 +g Group47027 +f 7 391 390 119 +f 393 9 128 394 +g Group53272 +f 396 484 483 395 +g Group47027 +f 397 21 203 398 +g Group53272 +f 400 486 485 399 +g Group47027 +f 401 27 217 402 +g Group53272 +f 404 488 487 403 +g Group47027 +f 405 52 173 406 +g Group53272 +f 408 490 489 407 +g Group47027 +f 409 56 268 410 +g Group53272 +f 412 492 491 411 +g Group47027 +f 413 42 114 414 +g Group53272 +f 416 494 493 415 +g Group47027 +f 389 99 27 401 +g Group53272 +f 387 479 488 404 +g Group47027 +f 392 124 52 405 +g Group53272 +f 390 481 490 408 +g Group47027 +f 394 128 56 409 +g Group53272 +f 395 483 492 412 +g Group47027 +f 398 203 42 413 +g Group53272 +f 399 485 494 416 +g Group47027 +f 402 217 9 393 +g Group53272 +f 403 487 484 396 +g Group47027 +f 406 173 21 397 +g Group53272 +f 407 489 486 400 +g Group47027 +f 417 418 2 269 +g Group53272 +f 418 495 459 410 +g Group47027 +f 417 269 57 419 +f 419 57 272 420 +f 420 272 10 421 +f 421 10 277 422 +f 422 277 60 423 +f 423 60 280 424 +f 425 426 4 281 +g Group53272 +f 426 497 471 424 +f 427 498 496 425 +f 428 499 498 427 +f 429 500 499 428 +f 430 501 500 429 +f 431 502 501 430 +f 432 503 502 431 +g Group47027 +f 411 433 3 293 +g Group53272 +f 433 504 503 432 +f 473 505 434 435 +g Group47027 +f 8 434 414 114 +f 435 315 75 436 +f 436 75 158 437 +f 437 158 18 438 +f 438 18 235 439 +f 439 235 37 440 +f 440 37 109 441 +g Group53272 +f 507 506 442 443 +g Group47027 +f 6 442 441 109 +g Group53272 +f 444 508 507 443 +f 445 509 508 444 +f 446 510 509 445 +f 447 511 510 446 +f 448 512 511 447 +f 449 513 512 448 +g Group47027 +f 415 450 5 352 +g Group53272 +f 450 514 513 449 +f 452 393 394 451 +f 454 397 398 453 +f 456 401 402 455 +f 458 405 406 457 +f 460 409 410 459 +f 462 413 414 461 +f 463 389 401 456 +f 464 392 405 458 +f 451 394 409 460 +f 453 398 413 462 +f 455 402 393 452 +f 457 406 397 454 +f 466 417 419 465 +f 465 419 420 467 +f 467 420 421 468 +f 468 421 422 469 +f 469 422 423 470 +f 470 423 424 471 +f 473 435 436 472 +f 472 436 437 474 +f 474 437 438 475 +f 475 438 439 476 +f 476 439 440 477 +f 477 440 441 478 +g Group29571 +f 480 463 103 479 +g Group53272 +f 388 480 479 387 +g Group29571 +f 482 464 127 481 +g Group53272 +f 391 482 481 390 +g Group29571 +f 484 138 142 483 +f 486 213 216 485 +f 488 101 225 487 +f 490 126 267 489 +f 492 140 294 491 +f 494 215 386 493 +f 479 103 101 488 +f 481 127 126 490 +f 483 142 140 492 +f 485 216 215 494 +f 487 225 138 484 +f 489 267 213 486 +g Group53272 +f 466 495 418 417 +g Group29571 +f 459 495 466 271 +g Group53272 +f 496 497 426 425 +g Group29571 +f 471 497 496 283 +f 498 282 283 496 +f 499 286 282 498 +f 500 285 286 499 +f 501 291 285 500 +f 502 290 291 501 +f 503 294 290 502 +g Group53272 +f 491 504 433 411 +g Group29571 +f 503 504 491 294 +f 505 473 371 461 +g Group53272 +f 434 505 461 414 +g Group29571 +f 506 507 379 478 +g Group53272 +f 442 506 478 441 +g Group29571 +f 508 378 379 507 +f 509 381 378 508 +f 510 380 381 509 +f 511 385 380 510 +f 512 384 385 511 +f 513 386 384 512 +g Group53272 +f 493 514 450 415 +g Group29571 +f 513 514 493 386 +f 516 270 275 515 +f 518 273 279 517 +f 519 520 283 282 +g Group13564 +f 520 584 581 521 +f 522 586 585 523 +f 524 588 587 525 +g Group29571 +f 527 370 374 526 +f 529 372 377 528 +g Group13564 +f 590 589 531 532 +g Group29571 +f 379 531 530 376 +g Group13564 +f 533 592 591 534 +f 535 594 593 536 +f 578 596 538 539 +g Group29571 +f 103 538 537 101 +g Group13564 +f 580 598 541 542 +g Group29571 +f 127 541 540 126 +f 543 132 129 544 +f 545 131 132 543 +g Group13564 +f 547 600 599 546 +f 546 599 601 548 +g Group29571 +f 549 207 204 550 +f 551 206 207 549 +g Group13564 +f 553 603 602 552 +f 552 602 604 554 +g Group29571 +f 555 219 131 545 +f 539 100 219 555 +g Group13564 +f 537 595 605 556 +f 556 605 600 547 +g Group29571 +f 557 262 206 551 +f 542 125 262 557 +g Group13564 +f 540 597 606 558 +f 558 606 603 553 +g Group29571 +f 516 559 271 270 +g Group13564 +f 559 607 571 544 +g Group29571 +f 515 275 273 518 +f 517 279 278 521 +g Group13564 +f 523 585 583 519 +f 525 587 586 522 +g Group29571 +f 548 560 294 140 +g Group13564 +f 560 608 588 524 +f 568 609 561 527 +g Group29571 +f 371 561 550 204 +f 526 374 372 529 +f 528 377 376 530 +g Group13564 +f 534 591 590 532 +f 536 593 592 533 +g Group29571 +f 554 562 386 215 +g Group13564 +f 562 610 594 535 +f 564 516 515 563 +f 566 518 517 565 +f 568 527 526 567 +f 570 529 528 569 +f 572 543 544 571 +f 573 545 543 572 +f 575 549 550 574 +f 576 551 549 575 +f 577 555 545 573 +f 578 539 555 577 +f 579 557 551 576 +f 580 542 557 579 +f 563 515 518 566 +f 565 517 521 581 +f 567 526 529 570 +f 569 528 530 582 +f 583 584 520 519 +g Group50689 +f 584 632 629 581 +f 586 634 633 585 +f 588 636 635 587 +f 638 637 589 590 +g Group13564 +f 531 589 582 530 +g Group50689 +f 592 640 639 591 +f 594 642 641 593 +f 626 644 596 578 +g Group13564 +f 538 596 595 537 +g Group50689 +f 628 646 598 580 +g Group13564 +f 541 598 597 540 +g Group50689 +f 600 648 647 599 +f 599 647 649 601 +f 603 651 650 602 +f 602 650 652 604 +f 595 643 653 605 +f 605 653 648 600 +f 597 645 654 606 +f 606 654 651 603 +g Group13564 +f 564 607 559 516 +g Group50689 +f 607 655 619 571 +f 585 633 631 583 +f 587 635 634 586 +g Group13564 +f 601 608 560 548 +g Group50689 +f 608 656 636 588 +f 616 657 609 568 +g Group13564 +f 561 609 574 550 +g Group50689 +f 591 639 638 590 +f 593 641 640 592 +g Group13564 +f 604 610 562 554 +g Group50689 +f 610 658 642 594 +f 612 564 563 611 +f 614 566 565 613 +f 616 568 567 615 +f 618 570 569 617 +f 620 572 571 619 +f 621 573 572 620 +f 623 575 574 622 +f 624 576 575 623 +f 625 577 573 621 +f 626 578 577 625 +f 627 579 576 624 +f 628 580 579 627 +f 611 563 566 614 +f 613 565 581 629 +f 615 567 570 618 +f 617 569 582 630 +f 631 632 584 583 +g Group10036 +f 632 680 677 629 +f 634 682 681 633 +f 636 684 683 635 +f 686 685 637 638 +g Group50689 +f 589 637 630 582 +g Group10036 +f 640 688 687 639 +f 642 690 689 641 +f 674 692 644 626 +g Group50689 +f 596 644 643 595 +g Group10036 +f 676 694 646 628 +g Group50689 +f 598 646 645 597 +g Group10036 +f 648 696 695 647 +f 647 695 697 649 +f 651 699 698 650 +f 650 698 700 652 +f 643 691 701 653 +f 653 701 696 648 +f 645 693 702 654 +f 654 702 699 651 +g Group50689 +f 612 655 607 564 +g Group10036 +f 655 703 667 619 +f 633 681 679 631 +f 635 683 682 634 +g Group50689 +f 649 656 608 601 +g Group10036 +f 656 704 684 636 +f 664 705 657 616 +g Group50689 +f 609 657 622 574 +g Group10036 +f 639 687 686 638 +f 641 689 688 640 +g Group50689 +f 652 658 610 604 +g Group10036 +f 658 706 690 642 +f 660 612 611 659 +f 662 614 613 661 +f 664 616 615 663 +f 666 618 617 665 +f 668 620 619 667 +f 669 621 620 668 +f 671 623 622 670 +f 672 624 623 671 +f 673 625 621 669 +f 674 626 625 673 +f 675 627 624 672 +f 676 628 627 675 +f 659 611 614 662 +f 661 613 629 677 +f 663 615 618 666 +f 665 617 630 678 +f 679 680 632 631 +g Group23409 +f 677 680 679 63 +f 682 62 135 681 +f 684 66 287 683 +f 685 686 97 678 +g Group10036 +f 637 685 678 630 +g Group23409 +f 688 96 210 687 +f 690 98 382 689 +f 692 674 31 691 +g Group10036 +f 644 692 691 643 +g Group23409 +f 694 676 55 693 +g Group10036 +f 646 694 693 645 +g Group23409 +f 696 29 139 695 +f 695 139 66 697 +f 699 54 214 698 +f 698 214 98 700 +f 691 31 222 701 +f 701 222 29 696 +f 693 55 265 702 +f 702 265 54 699 +g Group10036 +f 660 703 655 612 +g Group23409 +f 667 703 660 59 +f 681 135 63 679 +f 683 287 62 682 +g Group10036 +f 697 704 656 649 +g Group23409 +f 684 704 697 66 +f 705 664 95 670 +g Group10036 +f 657 705 670 622 +g Group23409 +f 687 210 97 686 +f 689 382 96 688 +g Group10036 +f 700 706 658 652 +g Group23409 +f 690 706 700 98 +g Group10108 +f 747 752 708 709 +g Group23409 +f 31 708 707 222 +g Group10108 +f 748 754 711 712 +g Group23409 +f 55 711 710 265 +f 713 28 130 714 +g Group10108 +f 716 756 755 715 +g Group23409 +f 717 53 205 718 +g Group10108 +f 720 758 757 719 +g Group23409 +f 722 58 134 721 +f 723 724 63 135 +g Group10108 +f 724 760 743 721 +f 725 761 759 723 +g Group23409 +f 727 94 209 726 +g Group10108 +f 763 762 728 729 +g Group23409 +f 97 728 726 209 +g Group10108 +f 730 764 763 729 +g Group23409 +f 709 218 28 713 +g Group10108 +f 707 751 756 716 +g Group23409 +f 712 261 53 717 +g Group10108 +f 710 753 758 720 +g Group23409 +f 731 732 59 274 +g Group10108 +f 732 765 739 714 +g Group23409 +f 731 274 58 722 +g Group10108 +f 733 766 761 725 +g Group23409 +f 715 734 66 139 +g Group10108 +f 734 767 766 733 +f 750 768 735 736 +g Group23409 +f 95 735 718 205 +f 736 373 94 727 +g Group10108 +f 737 769 764 730 +g Group23409 +f 719 738 98 214 +g Group10108 +f 738 770 769 737 +f 740 713 714 739 +f 742 717 718 741 +f 744 722 721 743 +f 746 727 726 745 +f 747 709 713 740 +f 748 712 717 742 +f 749 731 722 744 +f 750 736 727 746 +g Group31493 +f 779 784 752 747 +g Group10108 +f 708 752 751 707 +g Group31493 +f 780 786 754 748 +g Group10108 +f 711 754 753 710 +g Group31493 +f 756 788 787 755 +f 758 790 789 757 +g Group10108 +f 759 760 724 723 +g Group31493 +f 760 792 775 743 +f 761 793 791 759 +f 795 794 762 763 +g Group10108 +f 728 762 745 726 +g Group31493 +f 764 796 795 763 +f 751 783 788 756 +f 753 785 790 758 +g Group10108 +f 749 765 732 731 +g Group31493 +f 765 797 771 739 +f 766 798 793 761 +g Group10108 +f 755 767 734 715 +g Group31493 +f 767 799 798 766 +f 782 800 768 750 +g Group10108 +f 735 768 741 718 +g Group31493 +f 769 801 796 764 +g Group10108 +f 757 770 738 719 +g Group31493 +f 770 802 801 769 +f 772 740 739 771 +f 774 742 741 773 +f 776 744 743 775 +f 778 746 745 777 +f 779 747 740 772 +f 780 748 742 774 +f 781 749 744 776 +f 782 750 746 778 +g Group32822 +f 811 816 784 779 +g Group31493 +f 752 784 783 751 +g Group32822 +f 812 818 786 780 +g Group31493 +f 754 786 785 753 +g Group32822 +f 788 820 819 787 +f 790 822 821 789 +g Group31493 +f 791 792 760 759 +g Group32822 +f 792 824 807 775 +f 793 825 823 791 +f 827 826 794 795 +g Group31493 +f 762 794 777 745 +g Group32822 +f 796 828 827 795 +f 783 815 820 788 +f 785 817 822 790 +g Group31493 +f 781 797 765 749 +g Group32822 +f 797 829 803 771 +f 798 830 825 793 +g Group31493 +f 787 799 767 755 +g Group32822 +f 799 831 830 798 +f 814 832 800 782 +g Group31493 +f 768 800 773 741 +g Group32822 +f 801 833 828 796 +g Group31493 +f 789 802 770 757 +g Group32822 +f 802 834 833 801 +f 804 772 771 803 +f 806 774 773 805 +f 808 776 775 807 +f 810 778 777 809 +f 811 779 772 804 +f 812 780 774 806 +f 813 781 776 808 +f 814 782 778 810 +g Group41963 +f 843 848 816 811 +g Group32822 +f 784 816 815 783 +g Group41963 +f 844 850 818 812 +g Group32822 +f 786 818 817 785 +g Group41963 +f 820 852 851 819 +f 822 854 853 821 +g Group32822 +f 823 824 792 791 +g Group41963 +f 824 856 839 807 +f 825 857 855 823 +f 859 858 826 827 +g Group32822 +f 794 826 809 777 +g Group41963 +f 828 860 859 827 +f 815 847 852 820 +f 817 849 854 822 +g Group32822 +f 813 829 797 781 +g Group41963 +f 829 861 835 803 +f 830 862 857 825 +g Group32822 +f 819 831 799 787 +g Group41963 +f 831 863 862 830 +f 846 864 832 814 +g Group32822 +f 800 832 805 773 +g Group41963 +f 833 865 860 828 +g Group32822 +f 821 834 802 789 +g Group41963 +f 834 866 865 833 +f 836 804 803 835 +f 838 806 805 837 +f 840 808 807 839 +f 842 810 809 841 +f 843 811 804 836 +f 844 812 806 838 +f 845 813 808 840 +f 846 814 810 842 +g Group10246 +f 875 880 848 843 +g Group41963 +f 816 848 847 815 +g Group10246 +f 876 882 850 844 +g Group41963 +f 818 850 849 817 +g Group10246 +f 852 884 883 851 +f 854 886 885 853 +g Group41963 +f 855 856 824 823 +g Group10246 +f 856 888 871 839 +f 857 889 887 855 +f 891 890 858 859 +g Group41963 +f 826 858 841 809 +g Group10246 +f 860 892 891 859 +f 847 879 884 852 +f 849 881 886 854 +g Group41963 +f 845 861 829 813 +g Group10246 +f 861 893 867 835 +f 862 894 889 857 +g Group41963 +f 851 863 831 819 +g Group10246 +f 863 895 894 862 +f 878 896 864 846 +g Group41963 +f 832 864 837 805 +g Group10246 +f 865 897 892 860 +g Group41963 +f 853 866 834 821 +g Group10246 +f 866 898 897 865 +f 868 836 835 867 +f 870 838 837 869 +f 872 840 839 871 +f 874 842 841 873 +f 875 843 836 868 +f 876 844 838 870 +f 877 845 840 872 +f 878 846 842 874 +g Group12339 +f 880 875 223 879 +g Group10246 +f 848 880 879 847 +g Group12339 +f 882 876 266 881 +g Group10246 +f 850 882 881 849 +g Group12339 +f 884 221 288 883 +f 886 264 383 885 +g Group10246 +f 887 888 856 855 +g Group12339 +f 871 888 887 137 +f 889 136 137 887 +f 890 891 212 873 +g Group10246 +f 858 890 873 841 +g Group12339 +f 892 211 212 891 +f 879 223 221 884 +f 881 266 264 886 +g Group10246 +f 877 893 861 845 +g Group12339 +f 867 893 877 276 +f 894 288 136 889 +g Group10246 +f 883 895 863 851 +g Group12339 +f 894 895 883 288 +f 896 878 375 869 +g Group10246 +f 864 896 869 837 +g Group12339 +f 897 383 211 892 +g Group10246 +f 885 898 866 853 +g Group12339 +f 897 898 885 383 +f 899 900 137 136 +g Group44590 +f 900 916 917 901 +f 920 919 903 904 +g Group12339 +f 212 903 902 208 +g Group44590 +f 923 922 906 907 +g Group12339 +f 223 906 905 221 +g Group44590 +f 926 925 909 910 +g Group12339 +f 266 909 908 264 +f 901 911 276 133 +g Group44590 +f 911 927 923 907 +g Group12339 +f 905 912 288 221 +g Group44590 +f 912 928 915 899 +f 918 929 913 902 +g Group12339 +f 375 913 910 263 +f 908 914 383 264 +g Group44590 +f 914 930 920 904 +f 915 916 900 899 +g Group10847 +f 916 932 933 917 +f 936 935 919 920 +g Group44590 +f 903 919 918 902 +g Group10847 +f 939 938 922 923 +g Group44590 +f 906 922 921 905 +g Group10847 +f 942 941 925 926 +g Group44590 +f 909 925 924 908 +f 917 927 911 901 +g Group10847 +f 927 943 939 923 +g Group44590 +f 921 928 912 905 +g Group10847 +f 928 944 931 915 +f 934 945 929 918 +g Group44590 +f 913 929 926 910 +f 924 930 914 908 +g Group10847 +f 930 946 936 920 +f 931 932 916 915 +g Group37322 +f 932 948 949 933 +f 952 951 935 936 +g Group10847 +f 919 935 934 918 +g Group37322 +f 955 954 938 939 +g Group10847 +f 922 938 937 921 +g Group37322 +f 958 957 941 942 +g Group10847 +f 925 941 940 924 +f 933 943 927 917 +g Group37322 +f 943 959 955 939 +g Group10847 +f 937 944 928 921 +g Group37322 +f 944 960 947 931 +f 950 961 945 934 +g Group10847 +f 929 945 942 926 +f 940 946 930 924 +g Group37322 +f 946 962 952 936 +f 947 948 932 931 +g Group24453 +f 948 964 965 949 +f 968 967 951 952 +g Group37322 +f 935 951 950 934 +g Group24453 +f 971 970 954 955 +g Group37322 +f 938 954 953 937 +g Group24453 +f 974 973 957 958 +g Group37322 +f 941 957 956 940 +f 949 959 943 933 +g Group24453 +f 959 975 971 955 +g Group37322 +f 953 960 944 937 +g Group24453 +f 960 976 963 947 +f 966 977 961 950 +g Group37322 +f 945 961 958 942 +f 956 962 946 940 +g Group24453 +f 962 978 968 952 +f 963 964 948 947 +g Group34110 +f 964 980 981 965 +f 984 983 967 968 +g Group24453 +f 951 967 966 950 +g Group34110 +f 987 986 970 971 +g Group24453 +f 954 970 969 953 +g Group34110 +f 990 989 973 974 +g Group24453 +f 957 973 972 956 +f 965 975 959 949 +g Group34110 +f 975 991 987 971 +g Group24453 +f 969 976 960 953 +g Group34110 +f 976 992 979 963 +f 982 993 977 966 +g Group24453 +f 961 977 974 958 +f 972 978 962 956 +g Group34110 +f 978 994 984 968 +f 979 980 964 963 +g Group25973 +f 980 996 997 981 +f 1000 999 983 984 +g Group34110 +f 967 983 982 966 +g Group25973 +f 1003 1002 986 987 +g Group34110 +f 970 986 985 969 +g Group25973 +f 1006 1005 989 990 +g Group34110 +f 973 989 988 972 +f 981 991 975 965 +g Group25973 +f 991 1007 1003 987 +g Group34110 +f 985 992 976 969 +g Group25973 +f 992 1008 995 979 +f 998 1009 993 982 +g Group34110 +f 977 993 990 974 +f 988 994 978 972 +g Group25973 +f 994 1010 1000 984 +f 995 996 980 979 +g Group16638 +f 996 1012 1013 997 +f 1016 1015 999 1000 +g Group25973 +f 983 999 998 982 +g Group16638 +f 1019 1018 1002 1003 +g Group25973 +f 986 1002 1001 985 +g Group16638 +f 1022 1021 1005 1006 +g Group25973 +f 989 1005 1004 988 +f 997 1007 991 981 +g Group16638 +f 1007 1023 1019 1003 +g Group25973 +f 1001 1008 992 985 +g Group16638 +f 1008 1024 1011 995 +f 1014 1025 1009 998 +g Group25973 +f 993 1009 1006 990 +f 1004 1010 994 988 +g Group16638 +f 1010 1026 1016 1000 +f 1011 1012 996 995 +g Group54037 +f 1013 1012 1011 13 +f 1015 1016 26 1014 +g Group16638 +f 999 1015 1014 998 +g Group54037 +f 1018 1019 13 1017 +g Group16638 +f 1002 1018 1017 1001 +g Group54037 +f 1021 1022 26 1020 +g Group16638 +f 1005 1021 1020 1004 +f 1013 1023 1007 997 +g Group54037 +f 1019 1023 1013 13 +g Group16638 +f 1017 1024 1008 1001 +g Group54037 +f 1011 1024 1017 13 +f 1025 1014 26 1022 +g Group16638 +f 1009 1025 1022 1006 +f 1020 1026 1010 1004 +g Group54037 +f 1016 1026 1020 26 +g Group18791 +f 1028 1724 1714 302 +g Group37456 +f 1029 1677 1724 1028 +g Group23801 +f 1032 1979 1976 150 +g Group9469 +f 1748 1980 1981 1747 +g Group56340 +f 1036 1388 1370 309 +g Group9469 +f 1036 1749 1750 1388 +g Group18791 +f 155 1039 1040 73 +f 1041 314 313 1042 +g Group37456 +f 1039 1041 1042 1040 +g Group18791 +f 1044 1303 1297 340 +g Group37456 +f 1045 1256 1303 1044 +g Group56340 +f 1048 1471 1431 180 +g Group9469 +f 1048 1751 1752 1471 +g Group23801 +f 1052 1639 1633 347 +g Group42466 +f 1052 1983 1982 1639 +g Group18791 +f 1055 1056 78 185 +f 1057 351 324 1058 +g Group37456 +f 1055 1057 1058 1056 +f 1029 1028 1059 1060 +g Group18791 +f 70 1059 1028 302 +f 306 1029 1060 304 +g Group23801 +f 1027 1642 1610 72 +g Group42466 +f 1027 1985 1984 1642 +g Group56340 +f 1031 1474 1458 71 +g Group9469 +f 1031 1757 1758 1474 +g Group28921 +f 4099 7996 7997 4100 +g Group27218 +f 2011 4229 4230 2496 +g Group37456 +f 1045 1044 1061 1062 +g Group18791 +f 1044 340 84 1061 +f 344 1045 1062 342 +g Group61524 +f 7998 2482 4180 7998 +g Group6579 +f 2013 4232 4233 2498 +g Group56340 +f 1047 1557 1545 85 +g Group9469 +f 1047 1763 1764 1557 +g Group23801 +f 1051 1986 1978 87 +g Group9469 +f 1766 1987 1988 1765 +g Group18791 +f 1064 1644 1606 149 +g Group252 +f 1064 1767 1768 1644 +g Group18791 +f 1063 1560 1502 152 +g Group252 +f 1063 1769 1770 1560 +g Group43469 +f 2474 7742 7741 2880 +g Group12547 +f 2500 7827 7828 4576 +g Group18791 +f 157 1069 1073 156 +f 1072 155 73 1074 +g Group252 +f 1069 1072 1074 1073 +g Group14875 +f 2480 4710 4711 2882 +g Group6040 +f 1391 4526 4525 2045 +g Group18791 +f 1075 1475 1415 182 +g Group252 +f 1075 1775 1776 1475 +g Group18791 +f 1082 1727 1687 184 +g Group252 +f 1082 1777 1778 1727 +g Group18791 +f 1081 1085 186 187 +f 1084 185 78 1086 +g Group252 +f 1081 1084 1086 1085 +f 1089 1087 1088 1090 +g Group18791 +f 171 1088 1087 303 +f 302 1089 1090 70 +f 1087 1730 1674 303 +g Group252 +f 1089 1713 1730 1087 +g Group18791 +f 1067 1478 1454 151 +g Group252 +f 1067 1779 1780 1478 +g Group18791 +f 1091 1394 1338 310 +g Group252 +f 1091 1781 1782 1394 +f 1095 1093 1094 1096 +g Group18791 +f 1093 341 201 1094 +f 340 1095 1096 84 +f 1093 1309 1251 341 +g Group252 +f 1095 1298 1309 1093 +g Group18791 +f 1079 1561 1541 181 +g Group252 +f 1079 1783 1784 1561 +g Group18791 +f 1097 1645 1587 348 +g Group252 +f 1097 1785 1786 1645 +g Group18791 +f 1100 1564 1538 148 +g Group63382 +f 1101 1501 1564 1100 +g Group18791 +f 153 1103 1104 16 +f 1105 157 156 1106 +g Group63382 +f 1103 1105 1106 1104 +g Group18791 +f 1108 1479 1465 178 +g Group63382 +f 1109 1416 1479 1108 +g Group18791 +f 1111 1112 19 183 +f 1113 187 186 1114 +g Group63382 +f 1111 1113 1114 1112 +g Group18791 +f 1116 1732 1710 298 +g Group63382 +f 1117 1673 1732 1116 +g Group18791 +f 1120 1396 1366 230 +g Group63382 +f 1121 1337 1396 1120 +g Group18791 +f 1124 1311 1293 336 +g Group63382 +f 1125 1252 1311 1124 +g Group18791 +f 1128 1647 1615 247 +g Group63382 +f 1129 1588 1647 1128 +g Group18791 +f 1115 1650 1626 68 +g Group63382 +f 1118 1605 1650 1115 +g Group38228 +f 2486 7444 7445 4913 +g Group11426 +f 3925 7513 7512 4826 +g Group50841 +f 2944 5286 5287 4917 +g Group61286 +f 3927 7515 7514 4919 +g Group18791 +f 1127 1733 1699 44 +g Group63382 +f 1130 1688 1733 1127 +f 1117 1116 1131 1132 +g Group18791 +f 15 1131 1116 298 +f 303 1117 1132 171 +f 1099 1482 1450 17 +g Group63382 +f 1102 1453 1482 1099 +f 1125 1124 1133 1134 +g Group18791 +f 1124 336 22 1133 +f 341 1125 1134 201 +f 1107 1565 1531 23 +g Group63382 +f 1110 1542 1565 1107 +g Group18791 +f 1136 1484 1446 229 +g Group62320 +f 1137 1449 1484 1136 +g Group18791 +f 1135 1400 1334 232 +g Group62320 +f 1138 1365 1400 1135 +g Group17439 +f 3152 6954 6955 5439 +g Group30436 +f 5156 7215 7214 1139 +g Group18791 +f 234 1141 1143 233 +f 1142 153 16 1144 +g Group62320 +f 1141 1142 1144 1143 +g Group18791 +f 1146 1567 1527 246 +g Group62320 +f 1147 1532 1567 1146 +g Group18791 +f 1145 1651 1583 249 +g Group62320 +f 1148 1616 1651 1145 +g Group18791 +f 1149 1735 1695 248 +g Group62320 +f 1150 1700 1735 1149 +g Group18791 +f 1151 1153 250 251 +f 1152 183 19 1154 +g Group62320 +f 1151 1152 1154 1153 +f 1157 1155 1156 1158 +g Group18791 +f 242 1156 1155 300 +f 298 1157 1158 15 +f 1155 1738 1670 300 +g Group62320 +f 1157 1709 1738 1155 +g Group18791 +f 1159 1654 1622 299 +g Group62320 +f 1160 1625 1654 1159 +g Group18791 +f 1161 1570 1506 301 +g Group62320 +f 1162 1537 1570 1161 +f 1165 1163 1164 1166 +g Group18791 +f 1163 338 259 1164 +f 336 1165 1166 22 +f 1163 1317 1247 338 +g Group62320 +f 1165 1294 1317 1163 +g Group39047 +f 337 6957 6956 2490 +g Group30436 +f 1167 5158 5157 2506 +g Group18791 +f 1169 1485 1419 339 +g Group62320 +f 1170 1466 1485 1169 +g Group50994 +f 1172 1404 1362 227 +g Group34997 +f 1172 1827 1828 1404 +g Group18791 +f 106 1175 1176 35 +f 1177 234 233 1178 +g Group2794 +f 1175 1177 1178 1176 +g Group51603 +f 1180 1655 1611 244 +g Group35606 +f 1180 1944 1943 1655 +g Group18791 +f 1183 1184 45 116 +f 1185 251 250 1186 +g Group2794 +f 1183 1185 1186 1184 +g Group18791 +f 1188 1740 1706 296 +g Group2794 +f 1189 1669 1740 1188 +g Group51603 +f 1192 1945 1942 145 +g Group34997 +f 1832 1946 1947 1831 +g Group18791 +f 1196 1319 1289 334 +g Group2794 +f 1197 1248 1319 1196 +g Group50994 +f 1200 1487 1427 175 +g Group34997 +f 1200 1833 1834 1487 +g Group50994 +f 1191 1490 1442 33 +g Group34997 +f 1191 1835 1836 1490 +g Group46598 +f 5696 5963 5964 5855 +g Group23266 +f 1907 6647 6648 2508 +g Group50994 +f 1199 1573 1523 43 +g Group34997 +f 1199 1839 1840 1573 +g Group51603 +f 1179 1948 1940 46 +g Group34997 +f 1842 1949 1950 1841 +g Group2794 +f 1189 1188 1203 1204 +g Group18791 +f 40 1203 1188 296 +f 300 1189 1204 242 +g Group51603 +f 1187 1658 1602 69 +g Group35606 +f 1187 1952 1951 1658 +g Group2794 +f 1197 1196 1205 1206 +g Group18791 +f 1196 334 50 1205 +f 338 1197 1206 259 +g Group5229 +f 2478 5913 5914 5857 +g Group7992 +f 2510 6791 6790 5495 +g Group51726 +f 2511 6125 6126 3275 +g Group34117 +f 1848 6240 6239 2513 +g Group18791 +f 108 1207 1211 107 +f 1210 106 35 1212 +g Group15646 +f 1207 1210 1212 1211 +g Group18791 +f 1214 1743 1679 115 +g Group15646 +f 1214 1849 1850 1743 +g Group18791 +f 1213 1217 117 118 +f 1216 116 45 1218 +g Group15646 +f 1213 1216 1218 1217 +g Group18791 +f 1220 1660 1597 144 +g Group15646 +f 1220 1851 1852 1660 +g Group18791 +f 1219 1576 1497 147 +g Group15646 +f 1219 1853 1854 1576 +g Group17710 +f 2514 6179 6180 3277 +g Group51496 +f 5787 5813 5814 5786 +g Group18791 +f 1225 1491 1411 177 +g Group15646 +f 1225 1857 1858 1491 +g Group18791 +f 1223 1494 1437 146 +g Group15646 +f 1223 1859 1860 1494 +g Group18791 +f 1231 1410 1329 228 +g Group15646 +f 1231 1861 1862 1410 +g Group18791 +f 1229 1577 1519 176 +g Group15646 +f 1229 1863 1864 1577 +g Group18791 +f 1233 1661 1579 245 +g Group15646 +f 1233 1865 1866 1661 +f 1237 1235 1236 1238 +g Group18791 +f 112 1236 1235 297 +f 296 1237 1238 40 +f 1235 1746 1665 297 +g Group15646 +f 1237 1705 1746 1235 +f 1241 1239 1240 1242 +g Group18791 +f 1239 335 122 1240 +f 334 1241 1242 50 +f 1239 1325 1243 335 +g Group15646 +f 1241 1290 1325 1239 +g Group18791 +f 1243 1244 124 335 +f 1246 3420 3419 52 +g Group63314 +f 1244 3422 3420 1246 +f 1247 3072 3071 1248 +g Group18828 +f 1249 3155 3156 2517 +g Group63314 +f 1252 2884 2885 2097 +g Group12101 +f 1253 4921 4920 2519 +g Group63314 +f 1255 2100 2099 1256 +g Group16401 +f 1257 3379 3380 2521 +g Group63314 +f 3425 3424 1260 1262 +g Group18791 +f 104 1260 1259 108 +f 32 3426 3425 1262 +f 1263 106 1210 1264 +g Group55441 +f 5623 6522 6523 5743 +g Group18791 +f 1267 157 1105 1268 +g Group53004 +f 4923 7743 7744 7693 +g Group18791 +f 1271 155 1072 1272 +g Group7874 +f 2353 4269 4270 4182 +g Group18791 +f 1275 234 1177 1276 +g Group51716 +f 2357 6958 6959 3158 +g Group18791 +f 1279 153 1142 1280 +g Group37712 +f 3012 7517 7516 5106 +g Group18791 +f 1283 314 1041 1284 +g Group60924 +f 1285 3381 3382 2365 +g Group18791 +f 1283 1287 99 314 +g Group7350 +f 2227 2523 2524 2228 +g Group63314 +f 1287 3428 3429 1288 +f 1289 2117 2116 1290 +g Group48312 +f 1291 5624 5625 2525 +g Group63314 +f 3015 3014 1293 2119 +g Group8662 +f 3017 7519 7518 3016 +g Group63314 +f 1298 2802 2803 2120 +g Group58743 +f 2529 7829 7830 4184 +g Group63314 +f 1302 3432 3431 1301 +g Group18791 +f 292 1301 1255 344 +g Group7350 +f 2532 2531 2230 2229 +g Group63314 +f 2807 2806 1303 2125 +g Group23884 +f 1300 4104 4103 2530 +g Group25314 +f 3434 4046 4045 2050 +g Group32255 +f 2014 4234 4235 2534 +g Group18791 +f 1305 1039 155 1271 +g Group7239 +f 2354 4272 4271 4105 +g Group37456 +f 1284 1041 1039 1305 +g Group25314 +f 2054 4047 4048 3436 +g Group18791 +f 1307 1069 157 1267 +g Group20947 +f 2352 7695 7694 2891 +g Group252 +f 1272 1072 1069 1307 +g Group40856 +f 3438 4578 4577 2057 +g Group63314 +f 2893 2892 1309 2130 +g Group38432 +f 1254 2894 2895 2520 +g Group40856 +f 2059 4579 4580 3440 +g Group38178 +f 4582 4746 4747 4651 +g Group63314 +f 1293 2948 2949 2119 +g Group33191 +f 1296 4925 4924 2528 +g Group42369 +f 2953 2952 1252 2097 +g Group35273 +f 3930 7598 7599 7520 +g Group18791 +f 1313 1103 153 1279 +g Group62241 +f 2362 5109 5108 4926 +g Group63382 +f 1268 1105 1103 1313 +g Group14260 +f 3931 7523 7522 3932 +g Group18791 +f 1315 1141 234 1275 +g Group18302 +f 3160 6961 6962 3159 +g Group62320 +f 1280 1142 1141 1315 +g Group21326 +f 7365 2385 1316 +g Group63314 +f 1317 3075 3072 1247 +g Group24037 +f 6963 7310 7311 7135 +g Group41307 +f 3077 3076 3020 3021 +g Group15426 +f 2538 7136 7137 3078 +g Group63314 +f 1319 2136 2117 1289 +g Group32918 +f 1292 6039 6040 2526 +g Group28186 +f 3080 7217 7218 3442 +g Group57093 +f 5967 5966 5531 1910 +g Group18791 +f 1321 1175 106 1263 +g Group24637 +f 6042 6707 6706 2390 +g Group2794 +f 1276 1177 1175 1321 +g Group30834 +f 3444 5626 5627 5365 +g Group18791 +f 1323 1207 108 1259 +g Group25676 +f 1261 3280 3279 2395 +g Group15646 +f 1264 1210 1207 1323 +g Group32911 +f 6526 6525 2394 6242 +g Group63314 +f 3219 3218 1325 2141 +g Group46689 +f 1245 3282 3281 2541 +g Group32911 +f 2400 6528 6529 6243 +g Group52436 +f 6437 5790 6438 +g Group51646 +f 3224 3223 1330 1329 +g Group21678 +f 1327 6315 6316 3315 +g Group18791 +f 228 1329 1330 226 +g Group20418 +f 2547 7045 7044 3164 +g Group51646 +f 1334 3085 3084 1333 +g Group48838 +f 2549 7640 7641 4748 +g Group51646 +f 2900 2899 1337 1338 +g Group16693 +f 1340 3383 3384 2551 +g Group51646 +f 1342 2151 2150 1341 +g Group12673 +f 2514 6317 6318 3317 +g Group18791 +f 1345 177 173 1346 +g Group51646 +f 1346 3230 3231 1345 +g Group60072 +f 1348 6867 6866 2599 +g Group50994 +f 1350 175 1228 1349 +g Group57560 +f 1352 4751 4750 2603 +g Group18791 +f 1354 182 1109 1353 +g Group24614 +f 7933 7932 2812 2813 +g Group56340 +f 180 4401 4402 1358 +g Group34065 +f 5817 6792 6793 6709 +g Group18313 +f 1362 2158 2157 1361 +g Group4773 +f 7526 7525 4996 4997 +g Group51646 +f 3028 3027 1366 2160 +g Group14627 +f 2559 8000 7999 2815 +g Group23659 +f 2818 4405 4399 1370 +g Group7350 +f 2524 2561 2254 2228 +g Group18791 +f 217 1372 1342 312 +g Group51646 +f 1371 3451 3450 1372 +g Group47102 +f 2609 6965 6966 3166 +g Group18791 +f 1376 339 1201 1375 +g Group23264 +f 3030 5200 5201 5042 +g Group18791 +f 1380 178 1170 1379 +g Group50424 +f 2617 4007 4008 3386 +g Group18791 +f 1384 346 1049 1383 +g Group51646 +f 1386 3453 3454 1385 +g Group7350 +f 2261 2562 2532 2229 +g Group18791 +f 1384 1386 289 346 +g Group24409 +f 8003 8002 4239 4107 +g Group23659 +f 2822 2821 1388 2173 +g Group32255 +f 2012 4240 4241 4186 +g Group31941 +f 2024 8066 8065 1799 +g Group65181 +f 2608 4112 4113 2824 +g Group56340 +f 1390 1048 180 1358 +g Group31941 +f 1762 8068 8067 2013 +g Group9469 +f 1390 1800 1751 1048 +g Group18560 +f 1351 7643 7642 2604 +g Group18791 +f 1392 1075 182 1354 +g Group33107 +f 1392 2176 2175 1801 +g Group252 +f 1392 1801 1775 1075 +g Group9838 +f 2906 7645 7646 2905 +g Group51646 +f 2908 2907 1394 2177 +g Group11077 +f 1070 4528 4527 2044 +g Group33107 +f 1782 2178 2179 1394 +g Group31933 +f 4999 7527 7528 5289 +g Group51646 +f 1396 3933 2963 1366 +g Group56249 +f 7531 7530 3935 3934 +g Group30701 +f 2968 2967 1337 2148 +g Group50424 +f 2970 5290 5291 5044 +g Group18791 +f 1398 1108 178 1380 +g Group15851 +f 2628 4889 4890 3936 +g Group63382 +f 1353 1109 1108 1398 +g Group22375 +f 3168 6967 6968 5345 +g Group51646 +f 1400 3086 3085 1334 +g Group3689 +f 5160 7139 7138 5348 +g Group29639 +f 3026 3034 1400 1365 +g Group21753 +f 3170 6970 6971 3169 +g Group18791 +f 1402 1169 339 1376 +g Group24777 +f 2630 1401 5203 5204 +g Group62320 +f 1379 1170 1169 1402 +g Group14570 +f 5631 6794 6795 5860 +g Group18313 +f 1404 2184 2158 1362 +g Group33669 +f 5588 6710 6711 5968 +g Group50248 +f 1921 6868 6869 3693 +g Group15762 +f 5590 5915 5916 5861 +g Group50994 +f 1406 1200 175 1350 +g Group5045 +f 2268 6870 6871 3695 +g Group34997 +f 1406 1880 1833 1200 +g Group54533 +f 1343 6320 6319 2642 +g Group18791 +f 1408 1225 177 1345 +g Group48501 +f 1408 2189 2190 1881 +g Group15646 +f 1408 1881 1857 1225 +g Group12673 +f 3289 6321 6322 3290 +g Group51646 +f 3237 3236 1410 2191 +g Group56533 +f 2572 6043 6044 5792 +g Group14345 +f 5795 5820 5819 2646 +g Group18791 +f 1411 1412 173 177 +f 1413 176 21 1414 +g Group3766 +f 1411 1413 1414 1412 +f 1415 1418 1417 1416 +g Group18791 +f 1418 181 1110 1417 +g Group3766 +f 1419 1422 1421 1420 +g Group18791 +f 1422 246 1202 1421 +g Group3766 +f 1423 1426 1425 1424 +g Group18791 +f 1426 345 1050 1425 +g Group35969 +f 1427 1430 1429 1428 +g Group50994 +f 1430 43 1230 1429 +g Group41315 +f 1431 1434 1433 1432 +g Group56340 +f 1434 85 1080 1433 +g Group3766 +f 1437 1435 1436 1438 +g Group18791 +f 226 1436 1435 228 +f 146 1437 1438 14 +g Group50994 +f 1439 227 1232 1440 +g Group35969 +f 1442 1439 1440 1441 +g Group18791 +f 1443 232 1173 1444 +g Group3766 +f 1446 1443 1444 1445 +g Group18791 +f 1447 230 1138 1448 +g Group3766 +f 1450 1447 1448 1449 +g Group18791 +f 1451 310 1121 1452 +g Group3766 +f 1454 1451 1452 1453 +g Group56340 +f 1455 309 1092 1456 +g Group41315 +f 1458 1455 1456 1457 +g Group18791 +f 1459 312 1037 1460 +g Group3766 +f 1462 1459 1460 1461 +g Group18791 +f 1459 1463 217 312 +f 9 1464 1462 307 +g Group3766 +f 1463 1459 1462 1464 +f 1465 1468 1467 1466 +g Group18791 +f 1468 23 1147 1467 +g Group3766 +f 1470 1426 1423 1469 +g Group18791 +f 289 1469 1423 346 +f 1426 1470 11 345 +g Group41315 +f 1471 1472 1434 1431 +g Group56340 +f 1472 1047 85 1434 +g Group59980 +f 1471 1752 1803 1472 +g Group9469 +f 1472 1803 1763 1047 +g Group56340 +f 1473 1036 309 1455 +g Group41315 +f 1474 1473 1455 1458 +g Group9469 +f 1473 1804 1749 1036 +g Group59980 +f 1474 1758 1804 1473 +g Group3766 +f 1475 1476 1418 1415 +g Group18791 +f 1476 1079 181 1418 +g Group50763 +f 1475 1776 1805 1476 +g Group252 +f 1476 1805 1783 1079 +g Group18791 +f 1477 1091 310 1451 +g Group3766 +f 1478 1477 1451 1454 +g Group252 +f 1477 1806 1781 1091 +g Group50763 +f 1478 1780 1806 1477 +g Group3766 +f 1479 1480 1468 1465 +g Group18791 +f 1480 1107 23 1468 +g Group48357 +f 1416 1417 1480 1479 +g Group63382 +f 1417 1110 1107 1480 +g Group18791 +f 1481 1120 230 1447 +g Group3766 +f 1482 1481 1447 1450 +g Group63382 +f 1452 1121 1120 1481 +g Group48357 +f 1453 1452 1481 1482 +g Group18791 +f 1483 1135 232 1443 +g Group3766 +f 1484 1483 1443 1446 +g Group62320 +f 1448 1138 1135 1483 +g Group47295 +f 1449 1448 1483 1484 +g Group3766 +f 1485 1486 1422 1419 +g Group18791 +f 1486 1146 246 1422 +g Group47295 +f 1466 1467 1486 1485 +g Group62320 +f 1467 1147 1146 1486 +g Group35969 +f 1487 1488 1430 1427 +g Group50994 +f 1488 1199 43 1430 +g Group19972 +f 1487 1834 1883 1488 +g Group34997 +f 1488 1883 1839 1199 +g Group50994 +f 1489 1172 227 1439 +g Group35969 +f 1490 1489 1439 1442 +g Group34997 +f 1489 1884 1827 1172 +g Group19972 +f 1490 1836 1884 1489 +g Group3766 +f 1491 1492 1413 1411 +g Group18791 +f 1492 1229 176 1413 +g Group621 +f 1491 1858 1885 1492 +g Group15646 +f 1492 1885 1863 1229 +g Group18791 +f 1493 1231 228 1435 +g Group3766 +f 1494 1493 1435 1437 +g Group15646 +f 1493 1886 1861 1231 +g Group621 +f 1494 1860 1886 1493 +g Group37954 +f 1497 1495 1496 1498 +g Group18791 +f 14 1496 1495 146 +f 147 1497 1498 143 +f 1499 151 1102 1500 +g Group37954 +f 1502 1499 1500 1501 +g Group18791 +f 1503 229 1194 1504 +g Group37954 +f 1506 1503 1504 1505 +g Group18791 +f 1507 307 1034 1508 +g Group37954 +f 1510 1507 1508 1509 +g Group50994 +f 1511 33 1224 1512 +g Group4621 +f 1514 1511 1512 1513 +g Group56340 +f 1515 71 1068 1516 +g Group9967 +f 1518 1515 1516 1517 +g Group18791 +f 1519 1520 21 176 +f 1521 245 203 1522 +g Group37954 +f 1519 1521 1522 1520 +g Group4621 +f 1523 1526 1525 1524 +g Group50994 +f 1526 1954 1953 1525 +g Group37954 +f 1527 1530 1529 1528 +g Group18791 +f 1530 249 1181 1529 +g Group37954 +f 1531 1534 1533 1532 +g Group18791 +f 1534 247 1148 1533 +f 1535 17 1137 1536 +g Group37954 +f 1538 1535 1536 1537 +g Group18791 +f 1507 1539 9 307 +f 128 1540 1510 308 +g Group37954 +f 1539 1507 1510 1540 +f 1541 1544 1543 1542 +g Group18791 +f 1544 348 1129 1543 +g Group9967 +f 1545 1548 1547 1546 +g Group56340 +f 1548 1990 1989 1547 +g Group37954 +f 1549 1552 1551 1550 +g Group18791 +f 1552 350 1053 1551 +g Group37954 +f 1554 1552 1549 1553 +g Group18791 +f 11 1553 1549 345 +f 1552 1554 284 350 +g Group56340 +f 1555 1031 71 1515 +g Group9967 +f 1556 1555 1515 1518 +g Group9469 +f 1555 1807 1757 1031 +g Group28632 +f 1556 1748 1807 1555 +g Group9967 +f 1557 1558 1548 1545 +g Group56340 +f 1558 1991 1990 1548 +g Group28632 +f 1557 1764 1808 1558 +g Group9469 +f 1983 1992 1808 1753 +g Group18791 +f 1559 1067 151 1499 +g Group37954 +f 1560 1559 1499 1502 +g Group252 +f 1559 1809 1779 1067 +g Group19415 +f 1560 1770 1809 1559 +g Group37954 +f 1561 1562 1544 1541 +g Group18791 +f 1562 1097 348 1544 +g Group19415 +f 1561 1784 1810 1562 +g Group252 +f 1562 1810 1785 1097 +g Group18791 +f 1563 1099 17 1535 +g Group37954 +f 1564 1563 1535 1538 +g Group63382 +f 1500 1102 1099 1563 +g Group17009 +f 1501 1500 1563 1564 +g Group37954 +f 1565 1566 1534 1531 +g Group18791 +f 1566 1128 247 1534 +g Group17009 +f 1542 1543 1566 1565 +g Group63382 +f 1543 1129 1128 1566 +g Group37954 +f 1567 1568 1530 1527 +g Group18791 +f 1568 1145 249 1530 +g Group15947 +f 1532 1533 1568 1567 +g Group62320 +f 1533 1148 1145 1568 +g Group18791 +f 1569 1136 229 1503 +g Group37954 +f 1570 1569 1503 1506 +g Group62320 +f 1536 1137 1136 1569 +g Group15947 +f 1537 1536 1569 1570 +g Group50994 +f 1571 1191 33 1511 +g Group4621 +f 1572 1571 1511 1514 +g Group34997 +f 1571 1887 1835 1191 +g Group54160 +f 1572 1832 1887 1571 +g Group4621 +f 1573 1574 1526 1523 +g Group50994 +f 1574 1955 1954 1526 +g Group54160 +f 1573 1840 1888 1574 +g Group34997 +f 1944 1956 1888 1829 +g Group18791 +f 1575 1223 146 1495 +g Group37954 +f 1576 1575 1495 1497 +g Group15646 +f 1575 1889 1859 1223 +g Group34809 +f 1576 1854 1889 1575 +g Group37954 +f 1577 1578 1521 1519 +g Group18791 +f 1578 1233 245 1521 +g Group34809 +f 1577 1864 1890 1578 +g Group15646 +f 1578 1890 1865 1233 +g Group18791 +f 1579 1580 203 245 +f 1581 115 42 1582 +g Group27422 +f 1579 1581 1582 1580 +f 1583 1586 1585 1584 +g Group18791 +f 1586 248 1182 1585 +g Group27422 +f 1587 1590 1589 1588 +g Group18791 +f 1590 184 1130 1589 +g Group27422 +f 1591 1594 1593 1592 +g Group18791 +f 1594 349 1054 1593 +g Group27422 +f 1597 1595 1596 1598 +g Group18791 +f 143 1596 1595 147 +f 144 1597 1598 67 +g Group51603 +f 1599 145 1222 1600 +g Group60234 +f 1602 1599 1600 1601 +g Group18791 +f 1603 152 1101 1604 +g Group27422 +f 1606 1603 1604 1605 +g Group23801 +f 1607 150 1066 1608 +g Group32432 +f 1610 1607 1608 1609 +g Group60234 +f 1611 1614 1613 1612 +g Group51603 +f 1614 46 1215 1613 +g Group27422 +f 1615 1618 1617 1616 +g Group18791 +f 1618 44 1150 1617 +f 1619 301 1193 1620 +g Group27422 +f 1622 1619 1620 1621 +g Group18791 +f 1623 148 1162 1624 +g Group27422 +f 1626 1623 1624 1625 +g Group18791 +f 1627 308 1033 1628 +g Group27422 +f 1630 1627 1628 1629 +g Group18791 +f 1627 1631 128 308 +f 56 1632 1630 305 +g Group27422 +f 1631 1627 1630 1632 +g Group32432 +f 1633 1636 1635 1634 +g Group23801 +f 1636 87 1083 1635 +g Group27422 +f 1638 1594 1591 1637 +g Group18791 +f 284 1637 1591 350 +f 1594 1638 61 349 +g Group32432 +f 1639 1640 1636 1633 +g Group23801 +f 1640 1051 87 1636 +g Group51097 +f 1639 1982 1993 1640 +g Group42466 +f 1640 1993 1988 1051 +g Group23801 +f 1641 1032 150 1607 +g Group32432 +f 1642 1641 1607 1610 +g Group42466 +f 1641 1994 1981 1032 +g Group51097 +f 1642 1984 1994 1641 +g Group18791 +f 1643 1063 152 1603 +g Group27422 +f 1644 1643 1603 1606 +g Group252 +f 1643 1813 1769 1063 +g Group8883 +f 1644 1768 1813 1643 +g Group27422 +f 1645 1646 1590 1587 +g Group18791 +f 1646 1082 184 1590 +g Group8883 +f 1645 1786 1814 1646 +g Group252 +f 1646 1814 1777 1082 +g Group27422 +f 1647 1648 1618 1615 +g Group18791 +f 1648 1127 44 1618 +g Group6477 +f 1588 1589 1648 1647 +g Group63382 +f 1589 1130 1127 1648 +g Group18791 +f 1649 1100 148 1623 +g Group27422 +f 1650 1649 1623 1626 +g Group63382 +f 1604 1101 1100 1649 +g Group6477 +f 1605 1604 1649 1650 +g Group27422 +f 1651 1652 1586 1583 +g Group18791 +f 1652 1149 248 1586 +g Group5415 +f 1616 1617 1652 1651 +g Group62320 +f 1617 1150 1149 1652 +g Group18791 +f 1653 1161 301 1619 +g Group27422 +f 1654 1653 1619 1622 +g Group62320 +f 1624 1162 1161 1653 +g Group5415 +f 1625 1624 1653 1654 +g Group60234 +f 1655 1656 1614 1611 +g Group51603 +f 1656 1179 46 1614 +g Group44237 +f 1655 1943 1957 1656 +g Group35606 +f 1656 1957 1950 1179 +g Group51603 +f 1657 1192 145 1599 +g Group60234 +f 1658 1657 1599 1602 +g Group35606 +f 1657 1958 1947 1192 +g Group44237 +f 1658 1951 1958 1657 +g Group18791 +f 1659 1219 147 1595 +g Group27422 +f 1660 1659 1595 1597 +g Group15646 +f 1659 1893 1853 1219 +g Group24277 +f 1660 1852 1893 1659 +g Group27422 +f 1661 1662 1581 1579 +g Group18791 +f 1662 1214 115 1581 +g Group24277 +f 1661 1866 1894 1662 +g Group15646 +f 1662 1894 1849 1214 +g Group16810 +f 1665 1663 1664 1666 +g Group18791 +f 67 1664 1663 144 +f 297 1665 1666 295 +f 1667 299 1190 1668 +g Group16810 +f 1670 1667 1668 1669 +g Group18791 +f 1671 149 1118 1672 +g Group16810 +f 1674 1671 1672 1673 +g Group18791 +f 1675 305 1030 1676 +g Group16810 +f 1678 1675 1676 1677 +g Group18791 +f 1679 1680 42 115 +f 1681 118 114 1682 +g Group16810 +f 1679 1681 1682 1680 +g Group49013 +f 1683 1896 1895 1684 +g Group18791 +f 1686 116 1216 1685 +g Group16810 +f 1687 1690 1689 1688 +g Group18791 +f 1690 187 1113 1689 +g Group54359 +f 1691 1816 1815 1692 +g Group18791 +f 1694 185 1084 1693 +g Group16810 +f 1695 1698 1697 1696 +g Group18791 +f 1698 251 1185 1697 +g Group16810 +f 1699 1702 1701 1700 +g Group18791 +f 1702 183 1152 1701 +g Group50994 +f 1703 1960 1959 1704 +g Group16810 +f 1706 1898 1897 1705 +g Group18791 +f 1707 68 1160 1708 +g Group16810 +f 1710 1707 1708 1709 +g Group56340 +f 1711 1996 1995 1712 +g Group16810 +f 1714 1818 1817 1713 +g Group18791 +f 1675 1715 56 305 +f 268 1716 1678 306 +g Group16810 +f 1715 1675 1678 1716 +f 1717 1720 1719 1718 +g Group18791 +f 1720 351 1057 1719 +g Group16810 +f 1722 1720 1717 1721 +g Group18791 +f 61 1721 1717 349 +f 1720 1722 281 351 +g Group56340 +f 1723 1997 1996 1711 +g Group16810 +f 1724 1819 1818 1714 +g Group9469 +f 1985 1998 1820 1755 +g Group35475 +f 1820 1821 1677 1676 +g Group54359 +f 1725 1822 1816 1691 +g Group18791 +f 1726 1055 185 1694 +g Group35475 +f 1719 1823 1766 1718 +g Group37456 +f 1719 1057 1055 1726 +g Group16810 +f 1727 1728 1690 1687 +g Group18791 +f 1728 1081 187 1690 +g Group63807 +f 1728 1824 1815 1693 +g Group252 +f 1693 1084 1081 1728 +g Group18791 +f 1729 1064 149 1671 +g Group16810 +f 1730 1729 1671 1674 +g Group252 +f 1729 1825 1767 1064 +g Group63807 +f 1817 1826 1730 1713 +g Group18791 +f 1731 1115 68 1707 +g Group16810 +f 1732 1731 1707 1710 +g Group63382 +f 1672 1118 1115 1731 +g Group61401 +f 1673 1672 1731 1732 +g Group16810 +f 1733 1734 1702 1699 +g Group18791 +f 1734 1111 183 1702 +g Group61401 +f 1688 1689 1734 1733 +g Group63382 +f 1689 1113 1111 1734 +g Group16810 +f 1735 1736 1698 1695 +g Group18791 +f 1736 1151 251 1698 +g Group60339 +f 1700 1701 1736 1735 +g Group62320 +f 1701 1152 1151 1736 +g Group18791 +f 1737 1159 299 1667 +g Group16810 +f 1738 1737 1667 1670 +g Group62320 +f 1708 1160 1159 1737 +g Group60339 +f 1709 1708 1737 1738 +g Group50994 +f 1739 1961 1960 1703 +g Group16810 +f 1740 1899 1898 1706 +g Group34997 +f 1952 1962 1900 1843 +g Group813 +f 1900 1901 1669 1668 +g Group49013 +f 1741 1902 1896 1683 +g Group18791 +f 1742 1183 116 1686 +g Group813 +f 1697 1903 1842 1696 +g Group2794 +f 1697 1185 1183 1742 +g Group16810 +f 1743 1744 1681 1679 +g Group18791 +f 1744 1213 118 1681 +g Group13665 +f 1744 1904 1895 1685 +g Group15646 +f 1685 1216 1213 1744 +g Group18791 +f 1745 1220 144 1663 +g Group16810 +f 1746 1745 1663 1665 +g Group15646 +f 1745 1905 1851 1220 +g Group13665 +f 1897 1906 1746 1705 +g Group37456 +f 1747 1033 1509 1748 +f 1749 1037 1341 1750 +f 1751 1049 1424 1752 +f 1753 1053 1592 1754 +f 1755 1030 1629 1756 +f 1757 1034 1461 1758 +g Group42346 +f 1760 2573 2574 2055 +g Group27073 +f 1762 2575 2576 2074 +g Group37456 +f 1763 1050 1550 1764 +f 1765 1054 1718 1766 +g Group37801 +f 1767 2000 1999 1768 +f 2002 2001 1770 1769 +g Group32711 +f 2578 7831 7832 4274 +g Group64218 +f 1774 8005 8004 4407 +g Group37801 +f 1775 1078 1432 1776 +f 1778 2004 1977 1692 +f 1779 1068 1457 1780 +f 4397 4410 1781 1092 +f 1783 1080 1546 1784 +f 1785 2006 2005 1786 +g Group36056 +f 1787 2825 2826 2403 +g Group8069 +f 1789 2827 2828 2032 +g Group63514 +f 1790 2829 2830 2033 +g Group6695 +f 2405 8069 8070 4050 +g Group16443 +f 1256 2195 2125 1303 +g Group47383 +f 1761 2581 2582 2075 +g Group25965 +f 1788 2831 2832 2404 +g Group16443 +f 1305 2196 2197 1284 +g Group12061 +f 2408 8071 8072 4188 +g Group36195 +f 1772 4321 4322 2410 +g Group44775 +f 1307 2198 2193 1272 +f 1298 2120 2199 1309 +g Group36195 +f 2413 4324 4323 1798 +g Group37748 +f 2584 8007 8006 4281 +g Group47383 +f 1759 4054 4053 2073 +g Group34847 +f 2654 3456 3455 2081 +f 2082 3457 3458 2619 +g Group37456 +f 1800 1383 1049 1751 +g Group59227 +f 1357 4411 4412 2203 +g Group37801 +f 1775 4413 4400 1078 +g Group54295 +f 4532 4753 4752 2588 +g Group59227 +f 2204 4414 4409 1369 +g Group22431 +f 1752 1424 1425 1803 +g Group37456 +f 1803 1425 1050 1763 +f 1804 1460 1037 1749 +g Group22431 +f 1758 1461 1460 1804 +g Group22776 +f 1776 1432 1433 1805 +g Group37801 +f 1805 1433 1080 1783 +f 1806 1456 1092 1781 +g Group22776 +f 1780 1457 1456 1806 +g Group37456 +f 1807 1508 1034 1757 +g Group56619 +f 1748 1509 1508 1807 +f 1764 1550 1551 1808 +g Group37456 +f 1808 1551 1053 1753 +g Group37801 +f 1809 1516 1068 1779 +g Group56964 +f 1770 1517 1516 1809 +f 1784 1546 1547 1810 +g Group37801 +f 1810 2007 2006 1785 +g Group46087 +f 1754 1592 1593 1811 +g Group37456 +f 1811 1593 1054 1765 +f 1812 1628 1033 1747 +g Group46087 +f 1756 1629 1628 1812 +g Group37801 +f 1813 2008 2002 1769 +g Group46432 +f 1768 1999 2008 1813 +f 1786 2005 2009 1814 +g Group37801 +f 1814 2009 2003 1777 +g Group16810 +f 1816 1694 1693 1815 +g Group54359 +f 1818 1711 1712 1817 +f 1819 1723 1711 1818 +g Group37456 +f 1820 1676 1030 1755 +g Group7488 +f 1821 1820 1723 1819 +g Group35475 +f 1677 1821 1819 1724 +g Group16810 +f 1822 1726 1694 1816 +g Group35475 +f 1822 1823 1719 1726 +g Group7488 +f 1766 1823 1822 1725 +g Group63807 +f 1778 1824 1728 1727 +g Group35820 +f 1815 1824 1778 1692 +g Group37801 +f 1995 2010 1825 1712 +g Group35820 +f 1826 1817 1712 1825 +g Group63807 +f 1730 1826 1825 1729 +g Group2794 +f 1827 1173 1333 1828 +f 1829 1181 1584 1830 +f 1831 1193 1505 1832 +f 1833 1201 1420 1834 +f 1835 1194 1445 1836 +g Group2831 +f 1277 7220 7219 2483 +g Group2794 +f 1839 1202 1528 1840 +f 1841 1182 1696 1842 +f 1843 1190 1621 1844 +g Group40388 +f 5374 5537 5538 5499 +g Group784 +f 1848 2513 2591 1924 +g Group47849 +f 1850 1964 1939 1684 +f 1851 1966 1965 1852 +f 1968 1967 1854 1853 +g Group40874 +f 2592 5821 5822 5797 +g Group47849 +f 1857 1228 1428 1858 +f 1859 1224 1441 1860 +f 1861 1232 1361 1862 +f 1863 1230 1524 1864 +f 1865 1970 1969 1866 +g Group59520 +f 1867 6578 6579 5747 +g Group4827 +f 3460 6649 6650 1870 +f 1870 5749 5750 3460 +g Group56517 +f 5699 6973 6974 5698 +g Group47317 +f 1319 3096 3097 2136 +g Group41513 +f 5376 7221 7222 5443 +g Group42443 +f 2418 5751 5752 1874 +g Group47317 +f 3102 3101 1321 2207 +g Group58230 +f 1907 5700 5701 2420 +g Group45307 +f 1924 5755 5754 1848 +g Group60169 +f 1323 2140 2205 1264 +f 1290 2116 2142 1325 +g Group45307 +f 1878 5757 5758 1935 +g Group68 +f 5798 6440 6439 1927 +g Group9458 +f 1174 5540 5539 2547 +g Group31105 +f 2658 6975 6976 5542 +g Group35649 +f 1880 3108 3109 1375 +g Group2794 +f 1880 1375 1201 1833 +g Group15168 +f 1881 2209 2208 1349 +g Group47849 +f 1881 1349 1228 1857 +g Group45911 +f 2596 6045 6046 5801 +g Group15168 +f 1361 2157 2210 1862 +g Group53305 +f 1834 1420 1421 1883 +g Group2794 +f 1883 1421 1202 1839 +f 1884 1444 1173 1827 +g Group53305 +f 1836 1445 1444 1884 +g Group32824 +f 1858 1428 1429 1885 +g Group47849 +f 1885 1429 1230 1863 +f 1886 1440 1232 1861 +g Group32824 +f 1860 1441 1440 1886 +g Group2794 +f 1887 1504 1194 1835 +g Group21957 +f 1832 1505 1504 1887 +f 1840 1528 1529 1888 +g Group2794 +f 1888 1529 1181 1829 +g Group47849 +f 1889 1512 1224 1859 +g Group1476 +f 1854 1513 1512 1889 +f 1864 1524 1525 1890 +g Group47849 +f 1890 1971 1970 1865 +g Group11425 +f 1830 1584 1585 1891 +g Group2794 +f 1891 1585 1182 1841 +f 1892 1620 1193 1831 +g Group11425 +f 1844 1621 1620 1892 +g Group47849 +f 1893 1972 1968 1853 +g Group56480 +f 1852 1965 1972 1893 +f 1866 1969 1973 1894 +g Group47849 +f 1894 1973 1963 1849 +g Group16810 +f 1896 1686 1685 1895 +g Group49013 +f 1898 1703 1704 1897 +f 1899 1739 1703 1898 +g Group2794 +f 1900 1668 1190 1843 +g Group33016 +f 1901 1900 1739 1899 +g Group813 +f 1669 1901 1899 1740 +g Group16810 +f 1902 1742 1686 1896 +g Group813 +f 1902 1903 1697 1742 +g Group33016 +f 1842 1903 1902 1741 +g Group13665 +f 1850 1904 1744 1743 +g Group45868 +f 1895 1904 1850 1684 +g Group47849 +f 1959 1974 1905 1704 +g Group45868 +f 1906 1897 1704 1905 +g Group13665 +f 1746 1906 1905 1745 +g Group23629 +f 1838 6978 6977 2589 +g Group61847 +f 2590 5632 5633 5593 +g Group13230 +f 1911 6581 6580 5703 +g Group59169 +f 1845 6979 6980 5543 +g Group42669 +f 1912 5759 5760 5704 +g Group32491 +f 1915 6872 6873 2283 +g Group42050 +f 1917 6874 6875 3697 +g Group21717 +f 1919 3699 3698 1918 +g Group59169 +f 1837 5595 5596 5504 +g Group5720 +f 1919 7046 7047 3699 +g Group2316 +f 7050 7049 1404 1828 +g Group12158 +f 1922 2285 2284 1916 +g Group2316 +f 1406 7052 7053 1880 +g Group51944 +f 5505 7054 7055 5970 +g Group45167 +f 1265 5706 5707 2471 +g Group57183 +f 5823 6712 6713 6441 +g Group65534 +f 5635 6535 6536 6048 +g Group6385 +f 5634 6049 6050 5762 +g Group40514 +f 1930 6651 6652 5637 +g Group58649 +f 1871 6653 6654 3461 +g Group52262 +f 1875 6655 6656 3466 +g Group8640 +f 6657 6714 6715 6647 +g Group39337 +f 2347 6051 6052 5709 +g Group37779 +f 3467 6537 6538 5764 +f 1869 6539 6540 5765 +g Group29244 +f 2425 6583 6582 5711 +g Group26370 +f 5866 5975 5976 5865 +g Group29346 +f 2286 3702 3701 1936 +g Group56107 +f 1926 5863 5867 2674 +g Group6677 +f 5920 6054 6053 5869 +g Group56927 +f 1360 6444 6443 2660 +g Group29346 +f 1938 3704 3703 2271 +g Group50994 +f 1940 1683 1684 1939 +f 1942 1514 1513 1941 +g Group34997 +f 1944 1829 1830 1943 +g Group50994 +f 1945 1572 1514 1942 +g Group34997 +f 1945 1946 1832 1572 +g Group35606 +f 1947 1946 1945 1192 +g Group50994 +f 1948 1741 1683 1940 +g Group34997 +f 1948 1949 1842 1741 +g Group35606 +f 1950 1949 1948 1179 +g Group34997 +f 1952 1843 1844 1951 +g Group51603 +f 1954 244 1234 1953 +f 1955 1180 244 1954 +g Group35606 +f 1956 1944 1180 1955 +g Group34997 +f 1888 1956 1955 1574 +g Group43628 +f 1943 1830 1891 1957 +g Group34997 +f 1957 1891 1841 1950 +f 1958 1892 1831 1947 +g Group43628 +f 1951 1844 1892 1958 +g Group51603 +f 1960 69 1221 1959 +f 1961 1187 69 1960 +g Group35606 +f 1962 1952 1187 1961 +g Group34997 +f 1900 1962 1961 1739 +g Group47849 +f 1963 1964 1850 1849 +g Group48458 +f 1939 1964 1963 1215 +f 1966 1221 1601 1965 +f 1967 1968 1222 1941 +g Group47849 +f 1854 1967 1941 1513 +g Group48458 +f 1970 1234 1612 1969 +g Group47849 +f 1953 1971 1890 1525 +g Group48458 +f 1970 1971 1953 1234 +f 1972 1600 1222 1968 +g Group57089 +f 1965 1601 1600 1972 +f 1969 1612 1613 1973 +g Group48458 +f 1973 1613 1215 1963 +f 1974 1959 1221 1966 +g Group47849 +f 1905 1974 1966 1851 +g Group56340 +f 1976 1518 1517 1975 +f 1978 1691 1692 1977 +f 1979 1556 1518 1976 +g Group9469 +f 1979 1980 1748 1556 +g Group42466 +f 1981 1980 1979 1032 +g Group9469 +f 1983 1753 1754 1982 +f 1985 1755 1756 1984 +g Group56340 +f 1986 1725 1691 1978 +g Group9469 +f 1986 1987 1766 1725 +g Group42466 +f 1988 1987 1986 1051 +g Group23801 +f 1990 347 1098 1989 +f 1991 1052 347 1990 +g Group42466 +f 1992 1983 1052 1991 +g Group9469 +f 1808 1992 1991 1558 +g Group18100 +f 1982 1754 1811 1993 +g Group9469 +f 1993 1811 1765 1988 +f 1994 1812 1747 1981 +g Group18100 +f 1984 1756 1812 1994 +g Group23801 +f 1996 72 1065 1995 +f 1997 1027 72 1996 +g Group42466 +f 1998 1985 1027 1997 +g Group9469 +f 1820 1998 1997 1723 +g Group5262 +f 2000 1065 1609 1999 +f 2001 2002 1066 1975 +g Group37801 +f 1770 2001 1975 1517 +f 2003 2004 1778 1777 +g Group5262 +f 1977 2004 2003 1083 +f 2006 1098 1634 2005 +g Group37801 +f 1989 2007 1810 1547 +g Group5262 +f 2006 2007 1989 1098 +f 2008 1608 1066 2002 +g Group13893 +f 1999 1609 1608 2008 +f 2005 1634 1635 2009 +g Group5262 +f 2009 1635 1083 2003 +f 2010 1995 1065 2000 +g Group37801 +f 1825 2010 2000 1767 +g Group14359 +f 1760 4051 4055 2573 +g Group64622 +f 2013 2498 2575 1762 +g Group8069 +f 2015 2833 2825 1787 +g Group19396 +f 1761 4056 4057 2581 +g Group63514 +f 2016 2834 2831 1788 +g Group26408 +f 2289 3705 3706 2836 +g Group49795 +f 2021 2837 2838 2680 +g Group51133 +f 2022 2839 2840 2681 +g Group4123 +f 4054 4191 2585 +g Group14353 +f 2025 2683 2682 2023 +g Group42324 +f 1750 2214 2173 1388 +g Group27746 +f 2290 3707 3708 2842 +g Group42324 +f 1390 2215 2216 1800 +g Group11960 +f 4116 8073 8074 4468 +g Group13897 +f 2028 7831 7833 1273 +g Group61624 +f 2481 8008 8009 4534 +g Group51691 +f 2086 3469 3470 2843 +g Group41600 +f 2087 3471 3472 2844 +g Group4820 +f 2035 3474 3473 2034 +g Group26734 +f 1792 2035 2034 1791 +f 2018 2036 1795 1794 +g Group6205 +f 2011 8071 8075 4243 +g Group33152 +f 2037 3476 3475 2015 +g Group55066 +f 1796 2037 2015 1787 +f 2032 2038 1797 1789 +g Group58420 +f 2039 4277 4285 1299 +g Group45497 +f 4373 4372 4327 1077 +g Group13370 +f 2684 7934 7935 4417 +g Group28731 +f 2685 7936 7937 4470 +g Group45497 +f 1071 4374 4375 4286 +g Group53444 +f 2686 7938 7939 4472 +g Group21238 +f 2687 7940 7941 4419 +g Group45966 +f 2577 7834 7835 7745 +g Group26669 +f 2045 8011 8005 1774 +g Group51691 +f 2015 3475 3477 2833 +g Group45943 +f 2050 4061 4060 2049 +g Group54721 +f 2368 3479 3478 1792 +g Group41600 +f 2016 3480 3481 2834 +g Group54721 +f 1795 3482 3483 2372 +g Group21333 +f 2055 8077 8076 1760 +g Group8739 +f 2056 7748 7747 2410 +g Group17517 +f 1796 7750 7749 3484 +f 3486 7751 7752 1797 +g Group64182 +f 1798 7754 7753 2413 +g Group31706 +f 4665 4755 4754 4379 +g Group49795 +f 2848 7943 7944 2847 +g Group4973 +f 2025 3709 3710 2692 +g Group51133 +f 2062 2849 2850 2690 +g Group4973 +f 2695 3712 3711 2027 +g Group45012 +f 2068 7945 7946 4757 +g Group59524 +f 1774 7934 7947 2045 +g Group51546 +f 4382 8012 8013 4538 +g Group59524 +f 2070 7949 7948 1802 +g Group45012 +f 4758 7951 7950 2071 +g Group35066 +f 1285 8078 8079 2487 +g Group35358 +f 1382 4009 4010 2493 +g Group62863 +f 2076 3474 3492 2049 +g Group26754 +f 2582 8081 8080 2075 +g Group62863 +f 2053 3494 3493 2077 +g Group25659 +f 2078 3476 3495 2056 +f 2058 3497 3496 2079 +g Group40395 +f 2551 4062 4063 4015 +g Group55476 +f 2081 3499 3498 2063 +g Group4775 +f 1341 2200 2217 1750 +f 1800 2218 2201 1383 +g Group59928 +f 2074 8082 8068 1762 +g Group26501 +f 2852 7952 7953 7836 +g Group1532 +f 2708 3502 3503 2854 +g Group34982 +f 4475 4474 2064 3505 +g Group14353 +f 2067 2710 2693 2065 +g Group17967 +f 2428 4328 4329 4194 +g Group17332 +f 2437 4196 4197 4120 +g Group25449 +f 2076 4122 4121 2088 +g Group4820 +f 2077 3493 3506 2052 +g Group53781 +f 2078 4331 4330 2047 +g Group33152 +f 2079 3496 3469 2086 +g Group33305 +f 2712 4420 4421 3713 +g Group13089 +f 2061 7942 7954 2089 +f 2090 7956 7955 2083 +g Group33305 +f 3715 4423 4422 2716 +g Group13998 +f 2091 2307 2250 2092 +g Group63314 +f 1244 3238 3239 2094 +g Group58521 +f 2091 3421 3507 2307 +g Group30519 +f 2240 3717 3718 3172 +g Group22392 +f 2311 3719 3720 2909 +g Group8385 +f 2100 3722 3721 2099 +g Group58521 +f 2315 3508 3423 2103 +g Group63314 +f 3242 3241 1260 2102 +g Group13998 +f 2104 2249 2315 2103 +g Group63314 +f 2912 2911 1268 2105 +g Group5905 +f 3175 3174 3110 2107 +g Group63314 +f 1279 3038 3039 2110 +f 2112 1283 1284 2111 +g Group3391 +f 2113 3509 3429 2114 +g Group63314 +f 2746 1287 1283 2744 +g Group58521 +f 2114 3427 3510 2747 +g Group8385 +f 2117 3724 3723 2116 +g Group63399 +f 2319 3725 3726 3040 +g Group22392 +f 2321 3727 3728 2857 +f 2750 3729 3730 3430 +g Group63314 +f 2752 1255 1301 2754 +g Group3391 +f 2123 3432 3512 2124 +g Group12301 +f 2322 3731 3732 2858 +g Group16443 +f 2126 1256 2099 +g Group14053 +f 8085 8084 2369 1257 +g Group16443 +f 2111 1284 2127 +g Group14053 +f 2373 8086 8078 1285 +g Group63314 +f 1307 2913 2914 2128 +g Group44775 +f 2129 1307 2128 +g Group30763 +f 2377 4584 4575 2043 +g Group4487 +f 2312 3733 3734 2915 +g Group44775 +f 2130 1309 2131 +g Group30763 +f 2060 4585 4586 2380 +g Group22392 +f 2320 3735 3736 2973 +g Group55502 +f 2974 3938 3939 3738 +g Group63314 +f 2977 2976 1279 2110 +g Group42369 +f 1268 2978 2979 2105 +g Group5905 +f 3112 3176 3177 2134 +g Group41307 +f 3041 3113 3114 3042 +g Group5488 +f 2310 3739 3740 3179 +g Group8512 +f 2326 3741 3742 3115 +g Group8385 +f 2136 3743 3724 2117 +g Group55444 +f 2137 3095 3071 2095 +g Group10595 +f 3116 6981 6982 5639 +g Group55444 +f 2107 3110 3100 2138 +g Group24314 +f 2419 6983 6984 5444 +g Group63314 +f 1323 3243 3244 2139 +g Group60169 +f 2140 1323 2139 +g Group32139 +f 6240 6542 6127 +g Group31285 +f 2308 3744 3745 3245 +g Group60169 +f 2141 1325 2142 +g Group32139 +f 6133 6545 6247 +g Group5610 +f 3321 3320 3222 2145 +g Group51646 +f 3748 3747 1330 2144 +g Group3391 +f 2104 3750 3749 2143 +g Group58931 +f 2146 3180 3181 2282 +g Group62253 +f 2148 2898 2916 2331 +f 2151 2333 2276 2150 +g Group3391 +f 2152 3752 3751 2092 +g Group51646 +f 1346 3754 3755 2153 +g Group5610 +f 3229 3323 3324 2154 +g Group51646 +f 1353 2918 2919 1354 +g Group28920 +f 6878 6877 2157 2158 +g Group37724 +f 2159 3028 3044 2337 +g Group22837 +f 2161 2816 2859 2339 +g Group3391 +f 2163 3451 3509 2113 +g Group62253 +f 2164 3757 3756 2756 +g Group51646 +f 2760 2758 1342 1372 +g Group59773 +f 3119 7057 7058 3184 +g Group51646 +f 1380 3046 3047 2168 +f 2170 1384 1383 2169 +f 1384 2762 2764 1386 +g Group46853 +f 2172 3452 3520 2765 +g Group3391 +f 2124 3512 3454 2172 +g Group24175 +f 2162 2822 2860 2340 +g Group51646 +f 1392 2920 2921 2174 +g Group43714 +f 2176 2300 2303 2175 +g Group44348 +f 2149 2908 2922 2332 +g Group43714 +f 2178 2306 2301 2179 +g Group62253 +f 2160 2962 2980 2338 +g Group33012 +f 2180 3941 3940 2344 +g Group51646 +f 2983 3942 1398 1380 +g Group30701 +f 1353 2985 2986 2155 +g Group45349 +f 2147 3185 3186 2330 +g Group48373 +f 2182 3121 3120 2345 +g Group59773 +f 3122 3187 3188 2183 +g Group29639 +f 1402 3050 3045 1379 +g Group28920 +f 2184 6879 6878 2158 +g Group56403 +f 2186 7050 7059 2185 +g Group39498 +f 5599 6986 6985 1879 +g Group56403 +f 2187 7060 7053 2188 +g Group39498 +f 1846 6987 6988 5592 +g Group51646 +f 1408 3248 3249 2189 +g Group59108 +f 2189 2270 2286 2190 +g Group5610 +f 3326 3325 3237 3250 +g Group48501 +f 2191 1410 1862 2192 +g Group63314 +f 2863 2862 1272 2193 +g Group27050 +f 2195 3759 3758 2125 +g Group63314 +f 1305 2864 2865 2196 +g Group27050 +f 2196 3761 3760 2197 +g Group55382 +f 2198 3763 3762 2193 +f 2120 3727 3764 2199 +g Group4775 +f 2200 1341 2150 +g Group52648 +f 4017 8087 8088 4123 +g Group4775 +f 2169 1383 2201 +g Group52648 +f 4125 8090 8089 4018 +g Group4298 +f 2203 2304 2289 2202 +f 2161 2339 2305 2204 +g Group63314 +f 2206 1263 1264 2205 +g Group6395 +f 2241 3765 3766 3123 +g Group63314 +f 2207 1321 1263 2206 +g Group57924 +f 2207 3767 3768 3102 +g Group5240 +f 2140 3770 3769 2205 +f 2116 3723 3771 2142 +g Group35649 +f 3084 3126 1828 1333 +g Group42934 +f 2165 3107 3127 2255 +g Group25775 +f 2209 2287 2283 2208 +f 2157 2335 2288 2210 +g Group18313 +f 2211 1350 1349 2208 +g Group12923 +f 2184 7048 7061 6879 +g Group18313 +f 2212 1406 1350 2211 +g Group1474 +f 2188 7051 7062 6881 +g Group15168 +f 2209 1881 2190 +g Group46548 +f 2674 5803 5796 1926 +g Group15168 +f 2192 1862 2210 +g Group46548 +f 5806 5805 2676 1937 +g Group23659 +f 1358 4402 4424 2868 +g Group52931 +f 2214 2297 2343 2173 +g Group23659 +f 1390 2869 2870 2215 +g Group52931 +f 2215 2291 2298 2216 +g Group16443 +f 2195 1256 2126 +g Group25314 +f 2049 3492 3478 2050 +g Group16443 +f 2127 1284 2197 +g Group25314 +f 2054 3482 3494 2053 +g Group44775 +f 2198 1307 2129 +g Group53646 +f 3484 7755 7748 2056 +g Group44775 +f 2131 1309 2199 +g Group53646 +f 2058 7757 7756 3486 +g Group42324 +f 2214 1750 2217 +g Group6860 +f 2064 2683 2691 2063 +g Group42324 +f 2218 1800 2216 +g Group6860 +f 2066 2694 2710 2067 +g Group33107 +f 2176 1392 2174 +g Group38895 +f 2045 7947 7957 1391 +g Group33107 +f 2177 1394 2179 +g Group38895 +f 1393 7958 7949 2070 +g Group15382 +f 2200 2277 2296 2217 +f 2218 2299 2278 2201 +g Group5120 +f 2175 4425 4412 1801 +g Group5596 +f 2089 7959 7960 4427 +g Group5120 +f 1782 4414 4428 2178 +g Group5596 +f 4430 7962 7961 2090 +g Group8385 +f 2105 3772 3773 2912 +g Group16512 +f 2107 3774 3775 3175 +g Group49392 +f 2109 3776 3777 3039 +g Group22392 +f 2226 3779 3778 2225 +g Group3779 +f 2228 2767 2747 2227 +f 2230 2749 2768 2229 +g Group41057 +f 2232 3780 3721 2231 +f 2225 3778 3781 2233 +g Group56016 +f 2106 3782 3783 2914 +g Group3853 +f 2235 3785 3784 2234 +f 2237 3787 3786 2236 +g Group8385 +f 2110 3788 3789 2977 +g Group41495 +f 2979 3943 3944 3791 +g Group57017 +f 2108 3792 3793 3177 +g Group60041 +f 2134 3794 3795 3114 +g Group14522 +f 3123 3797 3796 2240 +f 2221 3798 3799 3124 +g Group17278 +f 2101 3800 3801 3244 +g Group19247 +f 2245 3770 3802 2244 +f 2247 3803 3771 2246 +g Group13998 +f 2249 2104 2143 2248 +f 2251 2152 2092 2250 +g Group62253 +f 2252 2925 2917 2155 +g Group3779 +f 2254 2755 2767 2228 +g Group58931 +f 2255 3191 3182 2165 +g Group37724 +f 2257 3053 3047 2167 +g Group62253 +f 2260 2170 2169 2259 +g Group3779 +f 2229 2768 2765 2261 +g Group44348 +f 2253 2926 2921 2156 +g Group62253 +f 2258 2989 2982 2168 +g Group33012 +f 2263 3946 3945 2181 +g Group45349 +f 2256 3192 3188 2166 +g Group48373 +f 2264 3132 3131 2183 +g Group1474 +f 6884 6883 2185 2265 +f 2187 6885 6886 2268 +g Group5610 +f 3249 3327 3328 3252 +g Group59108 +f 2272 2191 2192 2271 +g Group8385 +f 2193 3762 3804 2863 +g Group63830 +f 2194 3805 3806 2865 +g Group15382 +f 2277 2200 2150 2276 +f 2259 2169 2201 2278 +g Group22392 +f 2280 3807 3769 2279 +f 2281 3808 3807 2280 +g Group42934 +f 2282 3133 3125 2146 +g Group28920 +f 2208 6887 6888 2211 +g Group8587 +f 2285 6882 6888 2284 +g Group25775 +f 2287 2209 2190 2286 +f 2271 2192 2210 2288 +g Group22837 +f 2289 2836 2866 2202 +g Group24175 +f 2290 2842 2870 2213 +g Group41057 +f 2292 3759 3780 2232 +f 2233 3781 3760 2293 +g Group3853 +f 2294 3763 3785 2235 +f 2236 3786 3764 2295 +g Group52931 +f 2297 2214 2217 2296 +f 2299 2218 2216 2298 +g Group43714 +f 2300 2176 2174 2262 +f 2302 2177 2179 2301 +g Group15727 +f 2303 4431 4425 2175 +g Group4298 +f 2305 4432 4428 2204 +g Group17569 +f 2307 6249 6248 2250 +g Group17278 +f 2093 3744 3809 3239 +g Group15591 +f 2442 6250 6251 3521 +g Group34090 +f 2240 3172 3193 2386 +g Group25963 +f 2311 7759 7760 2445 +f 2313 2449 2367 2231 +g Group62092 +f 2315 6252 6253 3508 +g Group31285 +f 2243 3800 3810 3254 +g Group17569 +f 2249 6254 6255 2315 +g Group8385 +f 2112 3779 3811 2743 +g Group51873 +f 2227 3523 3524 2454 +g Group25963 +f 6585 6659 6660 6586 +g Group325 +f 2457 5110 5111 3055 +g Group25963 +f 2321 2857 2873 2461 +g Group51873 +f 2464 3526 3525 2230 +g Group22392 +f 2313 3722 3812 2770 +g Group15872 +f 2322 2858 2874 2462 +g Group33703 +f 2446 7761 7762 2928 +g Group24854 +f 2458 5112 5113 2991 +g Group62258 +f 2325 3938 3947 2466 +g Group9059 +f 2310 3179 3194 2443 +g Group12083 +f 2326 3115 3134 2468 +g Group25963 +f 2327 6661 6658 2318 +g Group34856 +f 3331 3330 3245 3255 +g Group14295 +f 6325 6324 3814 3813 +g Group46853 +f 2143 3515 3527 2248 +g Group10973 +f 2659 3815 3816 3195 +g Group14295 +f 2725 3817 3818 2929 +g Group288 +f 2333 3820 3819 2276 +g Group46853 +f 2251 3529 3518 2152 +g Group14295 +f 3822 6327 6328 3821 +g Group32491 +f 2335 6876 6874 1917 +g Group55302 +f 2733 3823 3824 3057 +g Group40415 +f 2021 3825 3826 2837 +g Group4076 +f 2736 3827 3828 3531 +g Group62253 +f 2151 2757 2771 2333 +f 2260 2772 2761 2170 +g Group4076 +f 3533 3830 3829 2738 +g Group41753 +f 2022 3831 3832 2839 +g Group47285 +f 2300 3833 3714 2303 +g Group61926 +f 2726 3834 3835 2930 +g Group47285 +f 2306 3716 3836 2301 +g Group14295 +f 2734 3837 3838 2993 +g Group47405 +f 2994 3948 3949 3840 +g Group62927 +f 2722 3841 3842 3196 +g Group415 +f 2742 3843 3844 3135 +g Group12158 +f 2346 1919 1918 2336 +g Group62679 +f 2270 3845 3702 2286 +g Group60051 +f 6331 6330 3847 3332 +g Group44628 +f 2292 2430 2465 2324 +f 2275 2407 2431 2293 +g Group7424 +f 2273 7764 2403 +f 2461 7767 2321 +g Group7869 +f 2304 3848 3705 2289 +f 2339 3825 3849 2305 +g Group9966 +f 6663 6662 2241 2387 +f 2242 6665 6666 2391 +g Group22818 +f 6589 6588 2245 2397 +f 2246 6590 6591 2399 +g Group60512 +f 2611 3850 3851 3136 +g Group29346 +f 2287 1936 1915 2283 +f 2335 1917 1938 2288 +g Group61697 +f 2346 7063 7046 1919 +g Group50248 +f 2267 7064 7065 1923 +g Group56502 +f 2297 3853 3852 2343 +f 2291 3855 3854 2298 +g Group18953 +f 2277 3856 3710 2296 +f 2299 3712 3857 2278 +g Group42482 +f 2347 6593 6592 6051 +g Group25963 +f 7771 7770 2219 2349 +g Group61701 +f 2931 7771 7772 4670 +g Group17967 +f 4199 4332 4330 2353 +g Group34090 +f 2355 3197 3189 2221 +g Group44183 +f 2355 7224 7223 3197 +g Group1434 +f 2223 5114 5115 3051 +g Group10418 +f 2359 3539 3540 3059 +g Group25963 +f 2364 2226 2225 2363 +g Group5481 +f 3382 4128 4127 2365 +g Group44628 +f 2368 2232 2231 2367 +g Group14053 +f 2370 1257 2369 +g Group54721 +f 2367 3433 3479 2368 +g Group17332 +f 4105 4201 4200 2354 +g Group44628 +f 2363 2225 2233 2372 +g Group14053 +f 2373 1285 2365 +g Group54721 +f 2372 3483 3435 2363 +g Group8058 +f 2220 7773 7774 2924 +g Group43796 +f 2350 4673 4672 2932 +g Group33069 +f 2376 7776 7775 2374 +g Group42524 +f 1308 4584 4587 2375 +g Group43162 +f 2374 4674 4657 2376 +g Group33069 +f 2379 7778 7777 2378 +g Group42524 +f 2381 4588 4586 1310 +g Group43162 +f 2378 4660 4675 2379 +g Group25963 +f 2224 5116 5117 2987 +g Group34947 +f 2360 3544 3545 2995 +g Group62258 +f 2382 3951 3950 2238 +g Group3630 +f 2996 3951 3952 3547 +g Group9059 +f 2356 3198 3190 2222 +g Group19152 +f 2356 7226 7225 3198 +g Group12083 +f 2384 3137 3128 2239 +g Group22176 +f 2384 7228 7227 3137 +g Group18093 +f 2386 3138 3129 2240 +g Group35719 +f 6990 7230 7229 2389 +g Group20059 +f 2387 3138 3080 1872 +g Group50140 +f 2348 5746 5769 5641 +g Group9966 +f 2391 3139 3130 2242 +g Group35719 +f 2357 7231 7232 6991 +g Group20059 +f 1875 3082 3139 2391 +g Group34856 +f 3251 3334 3335 3257 +g Group41361 +f 3216 6182 6181 3336 +g Group22818 +f 2397 2245 2244 2394 +g Group3334 +f 1324 6132 6137 2396 +g Group32911 +f 2394 6595 6594 2397 +g Group22818 +f 2400 2247 2246 2399 +g Group3334 +f 2402 6138 6134 1326 +g Group32911 +f 2399 6596 6597 2400 +g Group25963 +f 2403 2826 2871 2273 +g Group1515 +f 4204 4203 4131 4050 +g Group15872 +f 2404 2832 2872 2274 +g Group1515 +f 4133 4206 4188 4052 +g Group46288 +f 4334 4333 2056 2410 +f 2058 4336 4337 2413 +g Group25963 +f 6669 6668 6598 6599 +g Group22855 +f 5644 5716 5715 3554 +g Group32350 +f 2418 6664 6667 2415 +g Group22855 +f 3555 5717 5718 5646 +g Group12655 +f 3556 6056 6057 5771 +g Group8372 +f 1934 6059 6058 5773 +g Group27299 +f 1291 6716 6717 5624 +g Group24637 +f 2427 6718 6719 6061 +g Group8640 +f 6721 6720 6670 6671 +g Group18733 +f 2390 6657 6672 5643 +g Group24154 +f 5706 1265 6723 6722 +g Group19644 +f 1928 6047 6062 5719 +g Group29647 +f 2408 4205 4207 2371 +g Group64964 +f 2412 4335 4328 2428 +g Group34682 +f 2429 8083 8069 2405 +g Group44628 +f 2430 2292 2232 2368 +f 2372 2233 2293 2431 +g Group44775 +f 2432 4136 4135 2409 +g Group64182 +f 2410 7747 7746 1772 +g Group33069 +f 2376 7779 7765 7763 +f 7766 7768 7780 2378 +g Group8739 +f 2413 7753 7757 2058 +g Group11423 +f 1299 4285 4287 4185 +g Group2871 +f 1300 4244 4245 4104 +g Group6205 +f 4247 8092 8091 2017 +g Group54871 +f 2411 4275 4269 2353 +g Group24146 +f 2429 4138 4137 2369 +f 2373 4139 4136 2432 +g Group40856 +f 2433 2057 2377 +f 2380 2059 2436 +g Group34407 +f 2416 5649 5650 5446 +g Group56188 +f 3559 5651 5652 5449 +g Group42232 +f 2398 6552 6551 6063 +g Group145 +f 2423 6258 6259 6064 +g Group34856 +f 3253 3338 3339 3258 +g Group15591 +f 3260 6260 6250 2442 +g Group25684 +f 2442 3521 3560 3259 +g Group61809 +f 2389 5386 5385 3199 +g Group63351 +f 1249 6989 6992 3155 +g Group48945 +f 2933 7782 7781 4589 +g Group35324 +f 2886 7784 7783 4624 +g Group5481 +f 2370 4141 4140 3391 +g Group60924 +f 2370 3391 3379 1257 +g Group36056 +f 2451 6262 6261 3262 +g Group34856 +f 3341 3340 3254 3262 +g Group15591 +f 2452 6252 6263 3263 +g Group25963 +f 2364 2773 2769 2226 +g Group7550 +f 1286 2774 2775 2366 +g Group61966 +f 2454 3524 3567 3394 +g Group63803 +f 2455 6586 6600 5779 +g Group33934 +f 7447 7533 7534 7413 +g Group53185 +f 3016 7518 7535 5045 +g Group36056 +f 2461 2873 2827 1789 +g Group61966 +f 3397 3570 3526 2464 +g Group25963 +f 2313 2770 2776 2449 +g Group7550 +f 2450 2777 2778 1258 +g Group25965 +f 2462 2874 2829 1790 +g Group31040 +f 2448 4592 4591 2934 +g Group17419 +f 1254 4625 4626 2894 +g Group6798 +f 2460 7537 7536 4932 +g Group12178 +f 1296 5048 5047 4925 +g Group39759 +f 3576 4934 4935 3954 +g Group14260 +f 3930 7520 7538 3953 +g Group36778 +f 5388 7313 2444 +g Group18302 +f 6964 6994 3200 3161 +g Group31419 +f 3140 2469 7316 7315 +g Group21326 +f 7367 1318 2469 +g Group42443 +f 5749 5781 2470 1871 +g Group44949 +f 3255 6265 6264 3343 +g Group25676 +f 2441 3295 3282 1245 +g Group54721 +f 2430 1792 1791 2465 +f 2407 1794 1795 2431 +g Group17517 +f 2434 1796 1787 2403 +f 2461 1789 1797 2435 +g Group26446 +f 2470 6663 6653 1871 +g Group20059 +f 2391 6666 6655 1875 +g Group60658 +f 5782 6601 6594 1876 +f 1877 6596 6602 5783 +g Group48312 +f 2471 5617 5622 1265 +g Group12101 +f 2473 4937 4936 1269 +g Group32436 +f 1273 7833 7838 4183 +g Group1640 +f 6725 6889 6890 6797 +g Group24705 +f 1352 7647 7648 4751 +g Group57295 +f 1356 4415 4433 2812 +g Group18828 +f 2483 3148 3157 1277 +g Group8662 +f 3011 7539 7540 3004 +g Group16401 +f 2487 3376 3381 1285 +g Group25882 +f 1374 5375 5391 3165 +g Group430 +f 1378 5009 5010 3029 +g Group16693 +f 2493 3378 3385 1382 +g Group23884 +f 2476 4099 4106 1274 +g Group32255 +f 2496 4230 4240 2012 +g Group32326 +f 1355 4249 4250 4111 +g Group49051 +f 4476 2497 4209 4476 +g Group38432 +f 2474 2880 2890 1270 +g Group38178 +f 4676 4761 4760 4594 +g Group9838 +f 7643 7650 2882 2903 +g Group54404 +f 2501 4540 4539 2502 +g Group33191 +f 2486 4913 4927 1282 +g Group64208 +f 3925 7600 7601 7513 +g Group27590 +f 2969 5292 5293 5012 +g Group56249 +f 3937 7542 7515 3927 +g Group50950 +f 6962 7317 7318 7141 +g Group42339 +f 1316 7142 7143 3074 +g Group27521 +f 5392 7144 7145 6995 +g Group3689 +f 5353 7147 7146 5162 +g Group32918 +f 2472 6066 6067 1266 +g Group28303 +f 6648 6674 5720 2508 +g Group36351 +f 5655 6892 6891 5873 +g Group33669 +f 5979 6729 6728 5603 +g Group46689 +f 2511 3275 3280 1261 +g Group58189 +f 6446 6140 6447 +g Group12673 +f 6320 6332 3277 3288 +g Group10690 +f 6068 6267 6268 1855 +g Group25455 +f 1198 7234 7233 3149 +g Group3309 +f 2877 4828 4827 4678 +g Group37003 +f 1046 4011 4019 3377 +g Group28563 +f 2488 2779 2774 1286 +g Group33600 +f 2488 4020 4021 2779 +g Group31198 +f 1227 5982 5981 5618 +g Group30714 +f 3005 7543 7544 5234 +g Group64036 +f 1077 4327 4338 4177 +g Group49165 +f 343 4022 4023 2782 +g Group28563 +f 1258 2778 2781 2522 +g Group28921 +f 8016 8015 4103 4102 +g Group27218 +f 2534 4235 4248 2017 +g Group50940 +f 179 4681 4680 2881 +g Group51776 +f 2060 7839 7840 4585 +g Group50841 +f 82 7450 7451 4915 +g Group42695 +f 3928 7546 7545 4830 +g Group50920 +f 5452 7320 7319 6996 +g Group30436 +f 1167 7238 7237 5158 +g Group10162 +f 5545 6071 6070 5724 +g Group23266 +f 2540 6675 6671 1913 +g Group14995 +f 174 6142 6143 3278 +g Group34117 +f 2543 6269 6247 1878 +g Group41641 +f 2544 6270 6271 3265 +g Group17569 +f 6272 6334 6270 +g Group25455 +f 2547 3164 3147 1174 +g Group35284 +f 1122 4938 4939 4764 +g Group37003 +f 1038 4062 4072 3375 +g Group17569 +f 6274 6337 6273 +g Group14995 +f 174 6276 6275 3344 +g Group31198 +f 1209 6073 6072 5616 +g Group30714 +f 3003 7547 7548 5295 +g Group19664 +f 2815 4210 2559 +g Group49165 +f 311 4073 4074 2780 +g Group28855 +f 1339 2784 2783 2552 +f 2494 2786 2785 1381 +g Group33892 +f 2494 4075 4076 2786 +g Group28921 +f 4100 7997 8017 4288 +g Group6579 +f 4241 4252 2024 2564 +g Group50940 +f 154 4718 4719 2879 +g Group49367 +f 2565 4542 4541 2566 +g Group50841 +f 4941 5296 5288 2961 +g Group42695 +f 3926 7550 7549 4943 +g Group39047 +f 2548 6967 6997 231 +g Group30436 +f 2568 5159 5156 1139 +g Group9417 +f 36 6075 6074 5876 +g Group40561 +f 5512 7066 7067 6893 +g Group14995 +f 105 6278 6277 3276 +g Group51496 +f 5827 5826 5792 5793 +g Group47383 +f 2573 1759 2073 2574 +g Group32110 +f 2575 4078 4077 2576 +g Group14517 +f 2029 4384 4383 4282 +g Group54295 +f 2580 4765 4766 4544 +g Group42346 +f 2581 1793 2051 2582 +g Group6404 +f 2039 7841 7842 4279 +g Group27073 +f 2585 1799 2080 2586 +g Group49258 +f 2588 4752 4767 4385 +g Group9458 +f 1174 7239 7240 5540 +f 2489 5549 5548 1198 +g Group68 +f 1925 6448 6449 5809 +f 1927 6076 6077 5799 +g Group2831 +f 2517 7221 7241 1249 +g Group784 +f 2543 1878 1935 2594 +g Group40388 +f 5503 5541 5550 5396 +g Group13693 +f 1937 5828 5829 5806 +g Group28666 +f 2589 6977 6998 5551 +g Group1348 +f 2590 5593 5606 5514 +g Group23629 +f 2593 6999 6974 1873 +g Group6643 +f 1879 7069 7068 5599 +g Group26370 +f 5985 5984 5877 5868 +g Group6677 +f 5878 6078 6079 5927 +g Group45167 +f 2525 5712 5710 1291 +g Group18828 +f 2555 6451 6450 5830 +g Group19396 +f 2573 4055 4058 1759 +g Group4123 +f 2575 4215 4078 +g Group14359 +f 2581 4057 4049 1793 +g Group64622 +f 2564 2024 1799 2585 +g Group45241 +f 2578 8018 7994 2475 +g Group41948 +f 4547 4546 4292 4477 +g Group40204 +f 2584 7841 7829 2529 +g Group61624 +f 4549 8019 8000 2559 +g Group31706 +f 4391 4768 4769 4682 +g Group8219 +f 4380 8020 8021 4552 +g Group19659 +f 1798 7843 7844 7754 +g Group26669 +f 8024 8023 2070 1802 +g Group26754 +f 2073 8093 8094 2574 +g Group55668 +f 1046 4043 4080 4013 +g Group35066 +f 2521 8095 8085 1257 +g Group35358 +f 2551 4015 4016 1340 +g Group46689 +f 2541 3346 3345 1245 +g Group51726 +f 2541 6142 6145 3346 +g Group14995 +f 105 6125 6146 3347 +g Group46689 +f 1261 3349 3348 2511 +g Group61959 +f 2599 6866 6895 3583 +g Group56057 +f 2601 6896 6897 3858 +g Group16182 +f 2605 4771 4772 2935 +g Group288 +f 2252 3860 3861 2925 +g Group4888 +f 2847 7944 7963 4479 +g Group12860 +f 2611 3589 3590 3201 +g Group62502 +f 2255 3850 3862 3191 +g Group50156 +f 3592 5297 5298 5207 +g Group41295 +f 2257 3863 3864 3053 +g Group16182 +f 2619 3398 3399 2620 +g Group14295 +f 2620 3866 3865 2619 +g Group63618 +f 2622 3505 3498 2621 +g Group6226 +f 2062 4482 4481 2849 +g Group63618 +f 2625 3596 3595 2624 +g Group63813 +f 2606 4774 4773 2936 +g Group47919 +f 2253 3867 3868 2926 +g Group16182 +f 2999 5300 5301 3600 +g Group288 +f 2258 3869 3870 2989 +g Group49292 +f 3000 3955 3956 3602 +g Group33398 +f 2990 3946 3957 3872 +g Group64814 +f 2612 3603 3604 3202 +g Group48920 +f 2256 3873 3874 3192 +g Group2302 +f 2631 5209 5210 3141 +g Group51944 +f 2264 3875 3876 3132 +g Group20148 +f 2633 5515 5507 2632 +g Group50248 +f 2266 6884 6868 1921 +g Group606 +f 2634 6898 6899 5552 +g Group34392 +f 2600 5861 5880 3584 +g Group35724 +f 2637 3877 3859 2602 +g Group20148 +f 2638 5509 5516 2639 +g Group50248 +f 1923 6870 6886 2267 +g Group20939 +f 2640 6900 6901 5555 +g Group53007 +f 3233 3612 3613 3350 +g Group46044 +f 2269 3878 3879 3328 +g Group16232 +f 2646 5819 5832 3614 +g Group11150 +f 2649 3880 3703 2648 +g Group3553 +f 4025 4142 4124 2650 +g Group18953 +f 2276 3881 3856 2277 +g Group34847 +f 2653 2081 2652 +g Group32960 +f 2653 3881 3819 2654 +g Group5440 +f 2650 3616 3455 2651 +g Group2677 +f 1382 4143 4144 4018 +g Group18953 +f 2278 3857 3882 2259 +g Group34847 +f 2656 2082 2657 +g Group32960 +f 2619 3865 3882 2657 +g Group5440 +f 2617 3457 3617 2655 +g Group62399 +f 5559 5558 2659 3618 +g Group46505 +f 2282 3815 3883 3133 +g Group60072 +f 2660 6903 6902 1360 +g Group54354 +f 5835 6798 6799 5930 +g Group15762 +f 5883 5933 5932 5608 +g Group37611 +f 5563 5562 2663 2665 +g Group51944 +f 5988 7071 7070 5517 +g Group21614 +f 2665 7072 7073 5563 +g Group16650 +f 2636 5970 5990 3609 +g Group19727 +f 2637 7074 7075 3877 +g Group46548 +f 2671 5810 5802 2670 +g Group29346 +f 2286 1936 2287 +g Group45240 +f 2673 6453 6452 2672 +g Group57994 +f 2674 5867 5885 3627 +g Group52912 +f 2601 3858 3885 2675 +g Group58814 +f 2660 6443 6454 3620 +g Group52912 +f 2677 3886 3697 2662 +g Group46548 +f 2678 5804 5795 2646 +g Group29346 +f 1938 2271 2288 +g Group45240 +f 2679 6456 6455 2648 +g Group49795 +f 7965 7964 2838 2851 +g Group51133 +f 2681 2840 2853 2084 +g Group14353 +f 2683 2064 2085 2682 +g Group30288 +f 2623 4483 4484 3630 +g Group15257 +f 3631 7845 7846 4435 +g Group30618 +f 3632 7847 7848 4485 +g Group55331 +f 3500 7837 7849 4486 +g Group23125 +f 3633 7850 7851 4436 +g Group49795 +f 2689 2848 2835 2019 +g Group6860 +f 2692 2063 2691 +g Group56502 +f 2296 3709 3853 2297 +g Group51133 +f 2690 2850 2841 2020 +g Group6860 +f 2694 2066 2695 +g Group56502 +f 2298 3854 3711 2299 +g Group20728 +f 2626 7966 7957 2696 +g Group47285 +f 2262 3887 3833 2300 +g Group63179 +f 2698 7968 7967 2697 +g Group61292 +f 2698 3887 3888 2627 +g Group22615 +f 2696 7853 7852 2626 +g Group43244 +f 2684 7845 7854 2699 +f 2700 7856 7855 2688 +g Group20728 +f 2701 7958 7969 2702 +g Group47285 +f 2301 3836 3889 2302 +g Group63179 +f 2703 7971 7970 2704 +g Group61292 +f 2705 3890 3889 2704 +g Group22615 +f 2702 7858 7857 2701 +g Group24182 +f 2706 4145 4109 2621 +g Group26069 +f 2707 3639 3596 2625 +g Group24614 +f 2814 7972 7952 2852 +g Group65181 +f 4147 4146 2708 2854 +g Group28401 +f 2709 4487 4488 4148 +g Group14353 +f 2710 2027 2026 2693 +g Group35192 +f 2712 7973 7974 4437 +g Group7869 +f 2304 4431 4438 3848 +g Group31256 +f 2689 2019 2040 2713 +f 2714 2042 2021 2680 +g Group17025 +f 2072 7975 7976 4430 +g Group19298 +f 2306 4432 4440 3715 +g Group1702 +f 3607 6904 6905 6800 +g Group64255 +f 2667 3700 3693 2634 +g Group32823 +f 2668 6802 6803 3624 +g Group64255 +f 2641 3696 3884 2669 +g Group5440 +f 2706 3499 3616 2650 +f 2655 3617 3639 2707 +g Group48435 +f 2674 3627 3625 2670 +g Group43353 +f 2675 3885 3701 2672 +g Group48435 +f 2678 3629 3628 2676 +g Group43353 +f 2679 3704 3886 2677 +g Group6860 +f 2683 2025 2691 +f 2694 2027 2710 +g Group22615 +f 2699 7854 7853 2696 +f 2701 7857 7856 2700 +g Group23763 +f 2713 2040 2711 +f 2715 2042 2714 +g Group53119 +f 3271 6363 6364 3640 +g Group54533 +f 1327 3315 3353 2717 +g Group23300 +f 2720 6325 6339 3270 +g Group58737 +f 1332 6975 7000 3163 +g Group48989 +f 2658 3618 3641 3203 +g Group57560 +f 2723 4775 4749 1336 +g Group33014 +f 3643 7652 7651 4777 +g Group49548 +f 1340 4150 4149 3383 +g Group16182 +f 3402 3401 2654 2728 +g Group54533 +f 2642 3354 3318 1343 +g Group288 +f 2334 3821 3892 3247 +g Group25187 +f 2730 6366 6367 3273 +g Group33285 +f 3024 5212 5213 5050 +g Group41654 +f 5167 5236 5237 5215 +g Group61710 +f 1339 4029 4030 2784 +g Group14295 +f 2728 3820 3893 2788 +g Group42092 +f 3405 3647 3532 2735 +f 2737 3534 3648 3408 +g Group46145 +f 2618 4031 4032 2789 +g Group288 +f 2260 3866 3894 2772 +g Group63179 +f 2697 7967 7973 2712 +g Group18560 +f 2724 7653 7646 1335 +g Group44580 +f 2938 7653 7654 4723 +g Group63179 +f 2716 7975 7971 2703 +g Group60445 +f 2960 5302 5303 5052 +g Group52311 +f 3001 5304 5305 3652 +g Group23568 +f 1395 4891 4892 3935 +g Group19885 +f 7657 7656 3959 3654 +g Group21753 +f 7003 7002 3204 3167 +g Group35407 +f 2721 3655 3656 3204 +g Group24777 +f 5218 5217 1399 2741 +g Group52604 +f 5170 5219 3658 +g Group14345 +f 2671 5841 5842 5810 +g Group7284 +f 6458 5838 6453 +g Group54533 +f 2717 6340 6322 1327 +g Group25075 +f 3256 6369 6368 3356 +g Group42740 +f 1374 6965 7004 5538 +g Group63495 +f 3144 5566 5567 3662 +g Group34847 +f 2652 2081 2063 2692 +f 2695 2066 2082 2656 +g Group63314 +f 2112 2743 2744 1283 +f 2745 2115 1287 2746 +g Group53095 +f 2743 2745 2746 2744 +g Group48302 +f 2747 3510 3523 2227 +g Group12173 +f 2750 3511 3525 2323 +g Group53095 +f 2753 2751 2752 2754 +g Group63314 +f 2751 2100 1255 2752 +f 2122 2753 2754 1301 +g Group52034 +f 2756 3756 3828 2341 +g Group41427 +f 2759 2757 2758 2760 +g Group51646 +f 1342 2758 2757 2151 +f 2164 2759 2760 1372 +f 2761 2762 1384 2170 +f 2763 2171 1386 2764 +g Group41427 +f 2761 2763 2764 2762 +g Group36634 +f 2765 3520 3533 2261 +g Group13998 +f 2767 2113 2114 2747 +f 2749 2123 2124 2768 +f 2755 2163 2113 2767 +f 2768 2124 2172 2765 +g Group63702 +f 2743 3895 3896 2745 +g Group8385 +f 2745 3896 3897 2115 +g Group12173 +f 2316 3895 3811 2769 +f 2323 3898 3899 2750 +g Group8385 +f 2122 3729 3899 2753 +g Group12173 +f 2770 3812 3898 2323 +g Group52034 +f 2757 2759 2756 2341 +g Group62253 +f 2759 2164 2756 +g Group52034 +f 2757 2341 2771 +f 2342 2766 2763 2761 +g Group62253 +f 2766 2171 2763 +g Group52034 +f 2342 2761 2772 +g Group15744 +f 2773 2453 2316 2769 +g Group62867 +f 2774 4082 4081 2775 +g Group17643 +f 2775 4084 4083 2366 +g Group36056 +f 2776 3395 3389 2449 +g Group15744 +f 2770 2323 2463 2776 +g Group62867 +f 2777 4086 4085 2778 +g Group18344 +f 2779 4087 4082 2774 +g Group8108 +f 3411 4033 4034 3412 +f 4036 4035 3414 3413 +g Group18344 +f 2778 4085 4088 2781 +g Group23673 +f 4090 4089 4037 4034 +g Group18636 +f 2784 4038 4037 2783 +f 2786 4040 4039 2785 +g Group23673 +f 4040 4091 4092 4036 +g Group35926 +f 4038 4041 3405 3416 +g Group4076 +f 2788 3893 3827 2736 +g Group16182 +f 2788 3403 3402 2728 +g Group48032 +f 2789 3666 3665 2618 +g Group35926 +f 3408 4042 4039 3417 +g Group55605 +f 2772 3894 3829 2342 +g Group59460 +f 4342 8025 8026 7860 +g Group61524 +f 2482 4255 4180 +g Group19022 +f 2795 8097 8096 2796 +g Group30386 +f 2497 8098 4209 +g Group21971 +f 4256 4294 4293 2799 +g Group63314 +f 2801 2802 1298 1297 +g Group53223 +f 2803 2802 2801 2121 +g Group42984 +f 7863 7862 4259 4258 +g Group53223 +f 2806 2807 2121 2801 +g Group63314 +f 1303 2806 2801 1297 +g Group13985 +f 2808 8100 8099 2809 +g Group889 +f 8103 8102 2811 4260 +g Group14523 +f 2812 7865 7864 2813 +g Group32326 +f 4238 4444 4443 1367 +g Group2139 +f 2817 4405 4445 2816 +g Group12230 +f 1369 2817 2816 2161 +g Group4710 +f 2563 8104 8105 4251 +g Group13568 +f 2821 2822 2162 2818 +g Group23659 +f 1388 2821 2818 1370 +g Group9736 +f 2824 4113 4116 2623 +g Group25965 +f 2825 1788 2404 2826 +g Group63514 +f 2827 1790 2033 2828 +g Group8069 +f 2829 1791 2034 2830 +g Group36056 +f 2831 1794 2407 2832 +g Group63514 +f 2833 2016 1788 2825 +g Group8069 +f 2834 2018 1794 2831 +g Group27746 +f 2290 4446 4447 3707 +g Group39704 +f 2837 4449 4448 2838 +g Group61224 +f 2839 2023 2682 2840 +g Group37837 +f 2842 3708 3855 2291 +g Group41600 +f 2843 3470 3471 2087 +g Group51691 +f 2844 3472 3473 2088 +g Group41600 +f 2833 3477 3480 2016 +g Group51691 +f 2834 3481 3506 2018 +g Group39704 +f 2847 4451 4450 2848 +g Group61224 +f 2849 2065 2693 2850 +g Group1532 +f 2708 4452 4453 3502 +g Group11623 +f 2854 3503 3504 2709 +g Group17332 +f 2437 4343 4344 4196 +g Group10982 +f 2856 4219 4218 2438 +g Group12301 +f 2857 3728 3731 2322 +g Group22392 +f 2858 3732 3758 2324 +g Group12746 +f 2816 4445 4454 2859 +g Group34266 +f 2822 2173 2343 2860 +g Group53223 +f 2862 2863 2194 2861 +g Group63314 +f 1272 2862 2861 1271 +f 2861 2864 1305 1271 +g Group53223 +f 2865 2864 2861 2194 +g Group12230 +f 2866 2867 1357 2202 +g Group13568 +f 2868 4424 4455 2213 +g Group23659 +f 2868 2869 1390 1358 +g Group13568 +f 2870 2869 2868 2213 +g Group63830 +f 2863 3804 3805 2194 +g Group8385 +f 2865 3806 3761 2196 +g Group12746 +f 2836 4446 4455 2866 +g Group34266 +f 2842 2291 2215 2870 +g Group15872 +f 2857 2322 2462 2873 +g Group25963 +f 2858 2324 2465 2874 +g Group41753 +f 2022 4449 4456 3831 +g Group51844 +f 2839 3832 3852 2023 +g Group62229 +f 2048 4346 4347 4200 +g Group6784 +f 2846 4129 4134 2052 +g Group15872 +f 2826 2404 2274 2871 +g Group25963 +f 2832 2407 2275 2872 +g Group21971 +f 2804 4295 4296 4264 +g Group45159 +f 1304 8100 8106 4246 +g Group25965 +f 2873 2462 1790 2827 +g Group36056 +f 2874 2465 1791 2829 +g Group42984 +f 4257 7867 7859 4253 +g Group32326 +f 1355 4442 4457 4249 +g Group13985 +f 2796 8096 8107 2810 +g Group12627 +f 1389 8108 8109 4231 +g Group48277 +f 4268 7868 7869 4349 +g Group19022 +f 2809 8099 8110 2797 +g Group61524 +f 4212 4490 4489 4261 +g Group5673 +f 1035 8097 8111 4491 +g Group30939 +f 3593 4482 4493 4458 +g Group16317 +f 2849 4481 4494 2065 +g Group39704 +f 2838 4448 4459 2851 +g Group61224 +f 2840 2682 2085 2853 +g Group39704 +f 2848 4450 4460 2835 +g Group61224 +f 2850 2693 2026 2841 +g Group14523 +f 2852 7871 7870 2814 +g Group58831 +f 8114 8113 4147 4148 +g Group43469 +f 2876 7786 7742 2474 +g Group14875 +f 2878 4707 4710 2480 +g Group22239 +f 4778 7787 7788 7697 +g Group32780 +f 4711 7872 7873 2882 +g Group63314 +f 2883 2884 1252 1251 +g Group45409 +f 2885 2884 2883 2098 +g Group38432 +f 2886 1254 2520 2887 +g Group20947 +f 2889 7692 7695 2352 +g Group61063 +f 2375 7699 7700 1308 +g Group45409 +f 2892 2893 2098 2883 +g Group63314 +f 1309 2892 2883 1251 +g Group56337 +f 2894 7875 7876 2895 +g Group9838 +f 2897 7658 7644 2550 +g Group33741 +f 2899 2900 2149 2898 +g Group51646 +f 1337 2899 2898 2148 +g Group18560 +f 2901 1351 2604 2902 +g Group60598 +f 2903 7878 7877 2904 +g Group24579 +f 4558 4728 1393 4542 +g Group33741 +f 2907 2908 2149 2900 +g Group51646 +f 1394 2907 2900 1338 +g Group4487 +f 2909 3720 3733 2312 +g Group45409 +f 2911 2912 2106 2910 +g Group63314 +f 1268 2911 2910 1267 +f 2910 2913 1307 1267 +g Group45409 +f 2914 2913 2910 2106 +g Group22392 +f 2915 3734 3787 2237 +g Group44348 +f 2898 2149 2332 2916 +g Group51646 +f 2917 2918 1353 2155 +g Group33741 +f 2919 2918 2917 2156 +g Group51646 +f 2919 2920 1392 1354 +g Group33741 +f 2921 2920 2919 2156 +g Group62253 +f 2908 2177 2302 2922 +g Group56016 +f 2912 3773 3782 2106 +g Group8385 +f 2914 3783 3784 2128 +g Group44348 +f 2925 2253 2156 2917 +g Group62253 +f 2926 2262 2174 2921 +g Group33703 +f 2927 7758 7761 2446 +g Group51608 +f 2928 7762 7778 2379 +g Group61926 +f 2929 3818 3834 2726 +g Group14295 +f 2930 3835 3890 2705 +g Group8058 +f 2923 7769 7773 2220 +g Group43796 +f 2931 4670 4673 2350 +g Group25963 +f 2924 7774 7775 2234 +g Group23266 +f 3438 4685 4686 4629 +g Group31040 +f 2933 4589 4592 2448 +g Group17419 +f 2886 4624 4625 1254 +g Group5620 +f 2381 4631 4632 4580 +g Group61063 +f 7705 7704 2381 1310 +g Group38432 +f 2876 2474 1270 2888 +g Group51241 +f 2901 7659 7649 1351 +g Group56337 +f 7881 7880 2890 2880 +g Group24579 +f 4727 4559 4526 1391 +g Group50940 +f 2877 4678 4681 179 +g Group29616 +f 1076 7882 7883 4687 +g Group50940 +f 2875 4716 4718 154 +g Group32780 +f 2906 7885 7884 4719 +g Group63813 +f 2935 4772 4774 2606 +g Group47919 +f 2925 3861 3867 2253 +g Group16182 +f 2936 7978 7946 2627 +g Group288 +f 2926 3868 3888 2262 +g Group18560 +f 2937 2724 1335 2896 +g Group20447 +f 2937 4722 4724 2724 +g Group60598 +f 2938 7887 7886 2905 +g Group41154 +f 4731 7888 2702 4730 +g Group20769 +f 4837 4836 2940 2939 +g Group43274 +f 4689 4839 4838 2941 +g Group39360 +f 2944 4917 4944 4840 +g Group61865 +f 2479 7602 7603 4911 +g Group63314 +f 2947 2948 1293 1311 +g Group51833 +f 2948 3965 3966 2949 +g Group5711 +f 7604 7605 5054 3968 +g Group30888 +f 3970 3969 2952 2953 +g Group42369 +f 1252 2952 2947 1311 +g Group6968 +f 2955 7606 7607 4601 +g Group45891 +f 5120 5119 5020 3971 +g Group22556 +f 2958 4604 4603 2959 +g Group34323 +f 2961 7527 7551 4842 +g Group40165 +f 3933 3975 2962 2963 +g Group51646 +f 1366 2963 2962 2160 +g Group56828 +f 2966 7660 7661 7608 +g Group19220 +f 2968 3941 3976 2967 +g Group30701 +f 3977 1396 1337 +g Group38943 +f 2970 5044 5055 4844 +g Group14 +f 2603 7611 7610 1352 +g Group14096 +f 2325 3980 3981 3737 +g Group1447 +f 2974 3738 3719 2311 +g Group51833 +f 3984 3983 2976 2977 +g Group63314 +f 1279 2976 2975 1313 +g Group42369 +f 2975 2978 1268 1313 +g Group30888 +f 2978 3985 3943 2979 +g Group50772 +f 2962 3975 3986 2980 +g Group41308 +f 2968 2148 2331 2981 +g Group51646 +f 2982 2983 1380 2168 +g Group43350 +f 2181 2984 3942 3987 +g Group30701 +f 3989 1353 1398 +g Group19220 +f 2985 3988 3945 2986 +g Group89 +f 2133 3984 3990 3790 +g Group52976 +f 2979 3791 3772 2105 +g Group50772 +f 2989 3991 3987 2982 +g Group41308 +f 2990 2252 2155 2986 +g Group14482 +f 5122 5121 3980 3992 +g Group5018 +f 2974 2311 2445 2992 +g Group5999 +f 2740 3993 3994 3839 +g Group58886 +f 2994 3840 3817 2725 +g Group14482 +f 3995 5123 5124 3996 +g Group27760 +f 2382 3996 3997 3546 +g Group5018 +f 2996 2349 2219 2988 +g Group15111 +f 4691 3547 4692 +g Group63889 +f 3575 7553 7552 3999 +g Group50234 +f 5054 5057 5023 3968 +g Group32649 +f 2998 4934 4948 4605 +g Group22556 +f 2998 4606 4602 2954 +g Group15732 +f 4896 5059 5058 2956 +g Group43569 +f 2958 7612 7613 4604 +g Group16109 +f 2969 5012 5024 4845 +g Group32695 +f 2971 7662 7663 7610 +g Group20769 +f 2951 4847 4841 2943 +g Group43274 +f 2945 4849 4848 4693 +g Group20769 +f 2939 4941 4949 4837 +g Group43274 +f 1122 7614 7615 4938 +g Group7886 +f 2629 4000 4001 3601 +g Group57528 +f 2263 3991 4002 3871 +g Group60773 +f 3000 3602 3585 2605 +g Group44879 +f 2990 3872 3860 2252 +g Group48964 +f 2960 5052 5060 4843 +g Group44015 +f 3653 4851 4852 4004 +g Group14 +f 1336 7609 7616 2723 +g Group38502 +f 7618 4833 4853 +g Group50841 +f 34 7444 7452 5173 +g Group48210 +f 3006 5285 5306 5238 +g Group24714 +f 5025 3008 5176 5177 +g Group29116 +f 3009 5308 5309 3010 +g Group62241 +f 3012 5106 5109 2362 +g Group38785 +f 3014 3015 2118 3013 +g Group63314 +f 1293 3014 3013 1294 +g Group33191 +f 3016 1296 2528 3017 +g Group25577 +f 3018 7419 7418 5061 +g Group41307 +f 3013 3020 1317 1294 +g Group16778 +f 3021 3020 3013 2118 +g Group19677 +f 7148 7420 5031 3023 +g Group24900 +f 4998 7554 7555 5179 +g Group27117 +f 3027 3028 2159 3026 +g Group51646 +f 1366 3027 3026 1365 +g Group43391 +f 2614 5180 5181 5043 +g Group43959 +f 5034 5311 5310 1364 +g Group5110 +f 3034 3026 2159 3033 +g Group29639 +f 3121 3145 3034 3033 +g Group15430 +f 2613 5312 5313 5041 +g Group63314 +f 3037 3038 1279 1280 +g Group38785 +f 3039 3038 3037 2109 +g Group22392 +f 3040 3726 3735 2320 +g Group16778 +f 3041 3042 2109 3037 +g Group41307 +f 1315 3041 3037 1280 +g Group41392 +f 3043 3900 3725 2319 +g Group62253 +f 3028 2160 2338 3044 +g Group51646 +f 3045 3046 1380 1379 +g Group27117 +f 3047 3046 3045 2167 +g Group15717 +f 3033 2159 2337 3048 +g Group29639 +f 3050 3146 3131 3049 +g Group5110 +f 3045 3050 3049 2167 +g Group8385 +f 3039 3777 3788 2110 +g Group27385 +f 3042 3901 3776 2109 +g Group62253 +f 3053 2258 2168 3047 +g Group15717 +f 3054 2257 2167 3049 +g Group24854 +f 3055 5111 5112 2458 +g Group44963 +f 3043 5125 5126 3056 +g Group14295 +f 3057 3824 3837 2734 +g Group33295 +f 3058 3902 3823 2733 +g Group25963 +f 3051 5115 5116 2224 +g Group34947 +f 3059 3540 3544 2360 +g Group44963 +f 5128 5127 3052 3060 +g Group53947 +f 2359 5128 5129 3539 +g Group6798 +f 3061 7532 7537 2460 +g Group12178 +f 3016 5045 5048 1296 +g Group53789 +f 7421 7454 7455 7370 +g Group54826 +f 5032 7423 7422 5065 +g Group33191 +f 3004 2486 1282 3011 +g Group20557 +f 1377 5182 5183 5011 +g Group10303 +f 7151 5030 7419 7424 +g Group43959 +f 1378 5314 5315 5036 +g Group50841 +f 5175 7456 7450 82 +g Group29116 +f 3009 7321 5240 5028 +g Group55243 +f 3003 5295 5316 5242 +g Group29116 +f 5319 5318 3007 3032 +g Group16182 +f 3063 5297 5299 2616 +g Group288 +f 3053 3864 3869 2258 +g Group35182 +f 3064 5220 5205 2615 +g Group19288 +f 3054 3903 3863 2257 +g Group53412 +f 1363 5187 5188 5051 +g Group45278 +f 5190 5189 3651 2732 +g Group11278 +f 1364 5310 5320 5211 +g Group17317 +f 2731 5321 5322 5244 +g Group62894 +f 5067 5397 5398 5192 +g Group43214 +f 3070 5247 5246 3069 +g Group5905 +f 3071 3206 3171 2095 +g Group13199 +f 7243 7371 7364 3074 +g Group5905 +f 3178 3207 3075 2135 +g Group49434 +f 3076 3077 2135 3075 +g Group41307 +f 3020 3076 3075 1317 +g Group40944 +f 5401 7244 7245 7152 +g Group20059 +f 5457 1872 3080 +g Group13921 +f 5403 7246 7247 5382 +g Group20059 +f 5459 3082 1875 +g Group13921 +f 5383 7249 7248 5364 +g Group59773 +f 7078 7077 3085 3209 +f 3185 3210 3086 2182 +g Group38177 +f 3087 5406 5407 5248 +g Group46992 +f 3036 5250 5251 5078 +g Group23481 +f 3091 5445 5460 3092 +g Group29644 +f 3094 5660 5632 2590 +g Group47317 +f 3095 3096 1319 1248 +g Group55444 +f 3097 3096 3095 2137 +g Group26966 +f 1845 5569 5568 3098 +g Group55444 +f 3101 3102 2138 3100 +g Group47317 +f 1321 3101 3100 1276 +g Group34681 +f 3104 5520 5504 2595 +g Group53481 +f 3106 5501 5515 2633 +g Group24200 +f 3107 7079 7060 2187 +g Group32327 +f 2165 7080 7079 3107 +g Group63314 +f 3111 1275 1276 3110 +f 3112 1315 1275 3111 +g Group41307 +f 3112 3113 3041 1315 +g Group49434 +f 3114 3113 3112 2134 +g Group385 +f 3115 3742 3900 3043 +g Group47317 +f 3095 1248 3071 +g Group56369 +f 3117 7005 7006 5464 +g Group47317 +f 3110 1276 3100 +g Group64496 +f 2392 7007 7008 5661 +g Group51646 +f 3119 1376 1375 3109 +g Group40246 +f 3121 3033 3048 3120 +g Group51646 +f 3122 1402 1376 3119 +g Group515 +f 2137 3797 3766 3097 +g Group6395 +f 2327 3743 3765 2241 +g Group515 +f 3102 3768 3799 2138 +g Group6395 +f 2242 3767 3808 2281 +g Group32327 +f 3125 7081 7082 2146 +g Group24200 +f 2185 7059 7081 3125 +g Group34807 +f 3107 2187 2268 3127 +g Group51914 +f 3114 3795 3901 3042 +g Group6395 +f 3129 2241 3123 +g Group515 +f 2095 3717 3796 2137 +g Group6395 +f 3124 2242 3130 +g Group515 +f 2138 3798 3774 2107 +g Group40246 +f 3132 3054 3049 3131 +g Group34807 +f 3133 2265 2185 3125 +g Group3956 +f 3115 3043 3056 3134 +g Group57824 +f 3135 3844 3902 3058 +g Group52385 +f 3136 3851 3695 2640 +g Group3956 +f 3137 3060 3052 3128 +g Group14049 +f 3060 7250 7251 5466 +g Group9966 +f 3138 2387 2241 3129 +g Group28186 +f 3138 2386 3080 +g Group18093 +f 3139 2355 2221 3130 +g Group28186 +f 3082 2355 3139 +g Group9053 +f 3081 2388 3117 +f 3118 2392 3083 +g Group50178 +f 3668 7372 7373 5468 +g Group13199 +f 3079 7366 7374 7252 +g Group2321 +f 5399 7243 7254 7153 +g Group16467 +f 3090 7155 7154 5252 +g Group1186 +f 7259 7325 7324 5469 +g Group43214 +f 3087 5248 5255 3068 +g Group26966 +f 3103 5570 5571 1837 +f 3098 5521 5514 1845 +g Group23481 +f 3099 5461 5465 3116 +g Group39976 +f 3105 7083 7069 1879 +g Group59711 +f 3141 5210 5220 3064 +g Group43817 +f 3132 3876 3903 3054 +g Group54272 +f 3142 5557 5553 2635 +g Group38378 +f 3133 3883 3694 2265 +g Group46992 +f 5080 5257 5256 3066 +g Group65382 +f 5245 5258 5171 5191 +g Group7295 +f 3093 7010 7009 1846 +g Group55368 +f 3144 3662 3610 2639 +g Group37766 +f 3145 3121 2182 3086 +g Group29639 +f 3034 3145 3086 1400 +f 3122 3146 3050 1402 +g Group37766 +f 3131 3146 3122 2183 +g Group37457 +f 2484 7156 7157 5438 +g Group424 +f 3149 7159 7158 3150 +g Group42470 +f 3152 5439 5440 2505 +g Group52443 +f 3153 1167 2506 3154 +g Group59333 +f 3155 7160 7161 3156 +g Group26685 +f 3158 6959 6960 2358 +g Group43333 +f 3159 1316 2385 3160 +g Group37433 +f 3162 7162 7136 2538 +g Group851 +f 3163 5355 5413 5368 +g Group33706 +f 3165 5357 7011 6966 +g Group47406 +f 3168 5345 5346 2568 +g Group46784 +f 3170 3169 1401 2630 +g Group5488 +f 3172 3718 3739 2310 +g Group46410 +f 3174 3175 2108 3173 +g Group5905 +f 3110 3174 3173 3111 +f 3173 3176 3112 3111 +g Group46410 +f 3177 3176 3173 2108 +g Group30519 +f 3179 3740 3741 2326 +g Group33900 +f 3180 7085 7084 3181 +g Group48324 +f 3183 7056 7080 2165 +g Group34742 +f 3184 7058 7086 2166 +g Group4844 +f 3185 2182 2345 3186 +g Group59773 +f 3184 3187 3122 3119 +g Group34742 +f 3188 3187 3184 2166 +g Group57017 +f 3175 3775 3792 2108 +g Group16512 +f 3177 3793 3794 2134 +g Group33900 +f 3191 7087 7086 3182 +g Group4844 +f 3192 2264 2183 3188 +g Group9059 +f 3172 2310 2443 3193 +g Group34090 +f 3179 2326 2468 3194 +g Group62927 +f 2722 7088 7089 3841 +g Group22422 +f 3196 3842 3843 2742 +g Group9059 +f 3197 2356 2222 3189 +g Group19152 +f 3197 7223 7226 2356 +g Group34090 +f 3198 2384 2239 3190 +g Group44183 +f 3198 7225 7228 2384 +g Group36778 +f 3199 5385 5388 2444 +g Group38320 +f 3155 6992 6993 1250 +g Group53426 +f 3200 7312 7316 2469 +g Group43333 +f 3200 2469 1318 3161 +g Group59333 +f 7156 7163 3157 3148 +g Group851 +f 5357 3165 5391 5414 +g Group64346 +f 3159 7164 7142 1316 +g Group13929 +f 3169 7144 7165 1401 +g Group5402 +f 5451 7260 7261 7166 +g Group52443 +f 3153 7235 7238 1167 +g Group424 +f 3164 7168 7167 3147 +g Group52443 +f 3168 2568 1139 3151 +g Group64814 +f 2612 7090 7091 3603 +g Group48920 +f 2256 7087 7092 3873 +g Group24309 +f 3202 3604 3605 2631 +g Group8415 +f 3192 3874 3875 2264 +g Group22071 +f 3203 5359 7012 7000 +g Group23958 +f 7093 5359 3203 3641 +g Group46784 +f 3167 3204 2741 1399 +g Group60438 +f 3204 3656 3657 2741 +g Group5905 +f 3205 3206 3071 3072 +g Group46410 +f 3171 3206 3205 2096 +f 3207 3178 2096 3205 +g Group5905 +f 3075 3207 3205 3072 +g Group23293 +f 3208 7078 7085 3180 +g Group48324 +f 2146 7082 7076 3208 +g Group34742 +f 3210 3185 2147 3209 +g Group59773 +f 3086 3210 3209 3085 +g Group48425 +f 3212 6147 6148 6080 +g Group22606 +f 6084 6370 6371 6188 +g Group22375 +f 3215 6086 6085 3216 +g Group6671 +f 3218 3219 2093 3217 +g Group63314 +f 1325 3218 3217 1243 +g Group43388 +f 3220 6088 6087 3221 +g Group60539 +f 3223 3224 2145 3222 +g Group51646 +f 1330 3223 3222 2144 +g Group26574 +f 6342 6373 6372 6333 +g Group9372 +f 6374 2554 3228 6343 +g Group51646 +f 3229 3230 1346 2153 +g Group60539 +f 3231 3230 3229 2154 +g Group42227 +f 3232 1407 2643 3233 +g Group9372 +f 3234 1409 2571 3235 +g Group60539 +f 3236 3237 2145 3224 +g Group51646 +f 1410 3236 3224 1329 +g Group63314 +f 3217 3238 1244 1243 +g Group6671 +f 3239 3238 3217 2093 +f 3241 3242 2101 3240 +g Group63314 +f 1260 3241 3240 1259 +f 3240 3243 1323 1259 +g Group6671 +f 3244 3243 3240 2101 +g Group22392 +f 3245 3745 3803 2247 +g Group62253 +f 3246 2328 2144 3222 +f 3229 2153 2334 3247 +g Group51646 +f 3231 3248 1408 1345 +g Group60539 +f 3249 3248 3231 2154 +g Group62253 +f 3237 2191 2272 3250 +g Group8385 +f 3244 3801 3802 2139 +g Group62253 +f 3252 2270 2189 3249 +g Group8385 +f 3239 3809 3904 2094 +g Group22392 +f 3254 3810 3905 2314 +g Group25963 +f 3245 2247 2400 3255 +g Group14295 +f 3256 3906 3880 2649 +g Group25963 +f 3257 2394 2244 3251 +g Group36056 +f 3257 6279 6242 2394 +g Group25963 +f 3258 2440 2309 3253 +g Group24484 +f 3259 6190 6189 3260 +g Group34577 +f 3560 6192 6190 3259 +f 6195 6194 3566 3261 +g Group25963 +f 3254 2314 2451 3262 +g Group24484 +f 3263 6196 6195 3261 +g Group62415 +f 6090 6197 6198 6149 +g Group22375 +f 3264 6091 6088 3220 +g Group43388 +f 3212 6080 6086 3215 +g Group9372 +f 3214 2515 1407 3232 +g Group11694 +f 3213 6151 6152 6082 +g Group23302 +f 6201 6200 3226 3284 +g Group41641 +f 3266 6280 6274 2553 +g Group22606 +f 6204 6376 6375 6093 +g Group36604 +f 2597 6249 6260 3260 +g Group41641 +f 3266 2553 2597 3267 +f 3268 2598 2544 3265 +g Group36604 +f 3263 6263 6255 2598 +g Group16182 +f 3269 6378 6377 2645 +g Group288 +f 3252 3907 3845 2270 +g Group5407 +f 3307 3358 3357 2719 +g Group59429 +f 2718 6379 6373 6342 +g Group32193 +f 3270 6339 6346 3357 +g Group59429 +f 6344 6381 6380 2729 +g Group9181 +f 3247 3892 3909 3322 +g Group5407 +f 2644 3359 3360 3302 +g Group42227 +f 3274 2647 1409 3234 +g Group44114 +f 3274 3660 3615 2647 +g Group28645 +f 3275 6126 6153 3361 +g Group60165 +f 3277 6180 6205 3363 +g Group2595 +f 3280 3365 3336 3279 +g Group23608 +f 3282 3367 3366 3281 +g Group27270 +f 3283 6348 6341 3225 +g Group18265 +f 3285 6349 6343 3228 +g Group22447 +f 3288 3368 3350 3287 +g Group55128 +f 3290 3370 3369 3289 +g Group16276 +f 3292 3337 3335 2393 +g Group35769 +f 3279 6207 6206 2395 +g Group58392 +f 3294 3676 3675 3293 +g Group16276 +f 2439 3331 3343 3294 +g Group2595 +f 3295 3342 3367 3282 +g Group23608 +f 3275 3361 3365 3280 +g Group55128 +f 3277 3363 3368 3288 +g Group57450 +f 3278 6143 6156 3364 +g Group23302 +f 3228 6209 6210 3285 +g Group57450 +f 3276 6277 6281 3362 +g Group15550 +f 3298 6212 6189 3297 +g Group20587 +f 3296 6208 6212 3298 +f 3300 6213 6199 3299 +g Group15550 +f 3301 6196 6213 3300 +g Group61938 +f 3352 6351 6350 3303 +g Group56420 +f 2642 6319 6352 3677 +g Group60125 +f 3283 3225 3271 3304 +f 3305 3272 3227 3286 +g Group22447 +f 3306 3355 3370 3290 +g Group20291 +f 3679 6382 6383 6354 +g Group61938 +f 3308 6355 6331 3332 +g Group17618 +f 3309 6158 6157 3297 +g Group16276 +f 2439 3293 3372 3339 +g Group58392 +f 3293 3675 3681 3372 +g Group35769 +f 2395 6206 6214 3374 +g Group16276 +f 3291 2393 3341 3373 +g Group17618 +f 3301 6161 6160 3312 +g Group43668 +f 3299 6283 6282 3347 +g Group19557 +f 3304 3683 3684 3353 +g Group62012 +f 3271 3640 3683 3304 +f 3305 3685 3644 3272 +g Group56420 +f 2642 3677 3686 3354 +g Group50351 +f 3315 6316 6348 3283 +g Group41346 +f 3317 6318 6349 3285 +g Group42473 +f 3320 3321 2329 3319 +g Group5610 +f 3222 3320 3319 3246 +f 3322 3323 3229 3247 +g Group42473 +f 3324 3323 3322 2269 +f 3325 3326 2329 3321 +g Group5610 +f 3237 3325 3321 2145 +f 3324 3327 3249 2154 +g Group42473 +f 3328 3327 3324 2269 +g Group6183 +f 3330 3331 2439 3329 +g Group34856 +f 3245 3330 3329 2308 +g Group23188 +f 3332 3847 3906 3256 +g Group34856 +f 3333 3334 3251 2243 +g Group6183 +f 3335 3334 3333 2393 +g Group12688 +f 3336 6181 6207 3279 +g Group34856 +f 3329 3338 3253 2308 +g Group6183 +f 3339 3338 3329 2439 +f 3340 3341 2393 3333 +g Group34856 +f 3254 3340 3333 2243 +g Group35311 +f 3294 6264 3582 3676 +g Group43668 +f 3344 6275 6284 3296 +g Group9826 +f 3346 6162 6157 3345 +g Group43668 +f 3296 6163 6145 3344 +f 6146 6165 3299 3347 +g Group9826 +f 3349 6161 6164 3348 +g Group24334 +f 3350 3613 3678 3287 +g Group9181 +f 3328 3879 3907 3252 +g Group17670 +f 3315 3283 3304 3353 +f 3354 3305 3286 3318 +g Group61938 +f 3356 6368 6384 3308 +g Group34080 +f 3358 3313 3270 3357 +g Group3520 +f 3357 6346 6329 2719 +g Group46044 +f 3322 3909 3878 2269 +g Group34080 +f 3359 3273 3314 3360 +g Group57318 +f 3361 6153 6147 3212 +g Group23302 +f 3363 6205 6216 3214 +g Group31268 +f 3365 3215 3216 3336 +g Group52281 +f 3367 3220 3221 3366 +g Group51120 +f 3368 3232 3233 3350 +g Group18265 +f 3370 3234 3235 3369 +g Group44949 +f 3337 3257 3335 +g Group16276 +f 3292 2393 3291 +g Group44949 +f 3331 3255 3343 +g Group16276 +f 3293 2439 3294 +g Group31268 +f 3342 3264 3220 3367 +g Group52281 +f 3361 3212 3215 3365 +g Group18265 +f 3363 3214 3232 3368 +g Group20587 +f 3364 6156 6151 3213 +f 3362 6281 6285 3211 +g Group25075 +f 3351 3269 3352 +g Group5407 +f 3302 6356 6350 2644 +g Group51120 +f 3355 3274 3234 3370 +g Group25075 +f 3332 3256 3356 +g Group5407 +f 2719 6355 6353 3307 +g Group25676 +f 3371 2441 1245 3345 +g Group44949 +f 3339 3372 3310 3258 +g Group21529 +f 3372 3681 3671 3310 +g Group27711 +f 6160 6218 6193 3312 +g Group44949 +f 3373 3341 3262 3311 +g Group25676 +f 3349 1261 2395 3374 +g Group14995 +f 3347 6282 6278 105 +g Group56420 +f 3353 3684 3679 2717 +g Group19557 +f 3354 3686 3685 3305 +g Group33600 +f 2488 4151 4152 4020 +g Group33892 +f 2494 4153 4154 4075 +g Group12122 +f 3379 4156 4155 3380 +g Group56645 +f 3381 4158 4157 3382 +g Group12414 +f 3383 4160 4159 3384 +g Group46145 +f 3386 4008 4031 2618 +g Group31777 +f 3388 3541 3663 3387 +g Group36056 +f 2363 3388 3387 2364 +f 3389 3390 2367 2449 +g Group17643 +f 4162 4161 4093 2450 +g Group56645 +f 3391 4162 4156 3379 +g Group25837 +f 3392 3393 2453 2773 +g Group57687 +f 3567 4094 4081 3394 +g Group21558 +f 3396 3570 3688 3395 +g Group25837 +f 2463 3396 3395 2776 +g Group12122 +f 3376 4151 4158 3381 +g Group12414 +f 3378 4153 4163 3385 +g Group49165 +f 343 4164 4165 4022 +f 311 4166 4167 4073 +g Group52311 +f 3386 3689 3458 2617 +g Group48032 +f 2618 3665 3689 3386 +g Group61710 +f 4160 4168 4029 1339 +g Group48032 +f 3400 3690 3691 2727 +g Group52311 +f 2651 3456 3690 3400 +g Group1684 +f 3404 3647 3692 3403 +g Group5963 +f 2736 3404 3403 2788 +f 3406 3407 2738 2790 +g Group37813 +f 3408 3648 3666 2789 +g Group51873 +f 3409 2227 2454 3394 +g Group36056 +f 3392 2773 2364 3387 +g Group31777 +f 3395 3688 3687 3389 +g Group51873 +f 3397 2464 2230 3410 +g Group7350 +f 3411 2523 2227 3409 +g Group12387 +f 3412 2524 2523 3411 +f 3414 2531 2532 3413 +g Group7350 +f 3410 2230 2531 3414 +g Group12387 +f 3415 2561 2524 3412 +g Group7350 +f 3416 2254 2561 3415 +f 3418 2562 2261 3417 +g Group12387 +f 3413 2532 2562 3418 +g Group40205 +f 3405 2735 2254 3416 +g Group11903 +f 3403 3692 3691 3402 +g Group16182 +f 3406 2790 2620 3399 +g Group40205 +f 3417 2261 2737 3408 +g Group54920 +f 3420 3910 3751 3419 +g Group63314 +f 1244 3912 3913 3422 +g Group47914 +f 2091 3910 3913 3421 +f 3423 3914 3915 2103 +g Group63314 +f 3914 3917 1260 3424 +g Group54920 +f 3426 3750 3915 3425 +g Group63314 +f 3428 1287 3919 +g Group47914 +f 2114 3429 3428 3427 +f 3430 3431 3432 2123 +g Group63314 +f 3920 1301 3431 +g Group54721 +f 3433 2367 3434 +g Group24146 +f 2369 4137 4169 2370 +g Group54721 +f 3436 2363 3435 +g Group24146 +f 2365 4170 4139 2373 +g Group4727 +f 3437 4674 4685 3438 +g Group52617 +f 4587 4608 4577 2375 +g Group4727 +f 3440 4694 4675 3439 +g Group40856 +f 2380 4609 4579 2059 +g Group30834 +f 5416 5665 5664 3442 +g Group28186 +f 7264 7263 3082 3444 +g Group22539 +f 6063 6553 6554 6168 +f 6171 6556 6555 6065 +g Group36246 +f 3449 3450 3451 2163 +g Group51646 +f 3921 1372 3450 +f 3453 1386 3923 +g Group36246 +f 2172 3454 3453 3452 +g Group5440 +f 3456 2651 3455 +g Group34847 +f 2654 2081 2653 +g Group5440 +f 3457 2617 3458 +g Group34847 +f 2082 2619 2657 +g Group11517 +f 3459 6604 6603 5728 +g Group40956 +f 3460 5750 5784 5729 +g Group4827 +f 1868 6677 6676 3463 +f 3463 5785 5752 1868 +g Group29242 +f 3461 6654 6678 5730 +g Group22855 +f 3466 6656 6679 5732 +g Group8372 +f 5708 5733 3467 1933 +f 3468 5734 5719 1934 +g Group51691 +f 3469 2032 2828 3470 +g Group41600 +f 3471 2033 2830 3472 +g Group4820 +f 3474 2076 2088 3473 +g Group33152 +f 3476 2078 2047 3475 +g Group51691 +f 3475 2047 2845 3477 +g Group25314 +f 3479 2050 3478 +g Group54721 +f 2368 1792 2430 +g Group41600 +f 3480 2048 2846 3481 +g Group25314 +f 3482 2054 3483 +g Group54721 +f 1795 2372 2431 +g Group40856 +f 2057 4667 4659 3485 +g Group17517 +f 2434 7779 7789 1796 +g Group40856 +f 3487 4662 4669 2059 +g Group17517 +f 1797 7790 7780 2435 +g Group22615 +f 3489 7889 7852 3488 +g Group63179 +f 2627 7945 7968 2698 +g Group22615 +f 3490 7858 7888 3491 +g Group63179 +f 2704 7970 7950 2705 +g Group26734 +f 3474 2035 1792 3492 +f 3494 1795 2036 3493 +g Group55066 +f 3476 2037 1796 3495 +f 3497 1797 2038 3496 +g Group26069 +f 3499 2706 2621 3498 +g Group29601 +f 3501 7953 7979 4495 +g Group30939 +f 3502 4498 4497 3503 +g Group30288 +f 3504 4475 4487 2709 +g Group4820 +f 3493 2036 2018 3506 +g Group33152 +f 3496 2038 2032 3469 +g Group22392 +f 3421 3911 3904 2309 +f 2314 3905 3916 3423 +g Group18791 +f 3509 27 1288 3429 +g Group22392 +f 3427 3918 3897 2748 +g Group58521 +f 3430 2123 2749 3511 +g Group18791 +f 3432 1302 64 3512 +g Group22239 +f 3514 3746 3749 3513 +g Group51646 +f 1330 3514 3513 1328 +g Group18791 +f 3426 32 1328 3513 +f 3516 1344 52 3419 +g Group51646 +f 3516 3517 1346 1344 +g Group36246 +f 3518 3753 3752 2152 +g Group18791 +f 3451 1371 27 3509 +g Group46853 +f 3449 2163 2755 3519 +g Group10724 +f 3452 3922 3924 3520 +g Group18791 +f 3512 64 1385 3454 +g Group54721 +f 3492 1792 3478 +f 3482 1795 3494 +g Group17517 +f 3495 1796 3484 +f 3486 1797 3497 +g Group25963 +f 2309 6287 6251 3507 +f 6253 6288 2314 3508 +g Group15744 +f 3523 2316 2453 3524 +f 3526 2463 2323 3525 +g Group50424 +f 3527 6357 6345 2248 +g Group10724 +f 3515 3748 3814 3527 +f 3529 3822 3755 3518 +g Group59429 +f 3530 6358 6347 2729 +g Group40205 +f 3531 2254 2735 3532 +f 3534 2737 2261 3533 +g Group37184 +f 3536 7792 7791 4610 +g Group13186 +f 3537 5405 5417 3538 +g Group33934 +f 7517 7557 7458 7406 +g Group36056 +f 3541 3388 2363 3436 +g Group25314 +f 3433 2050 3479 +f 3483 2054 3435 +g Group19279 +f 3542 4613 4612 3543 +g Group40856 +f 3437 2057 3485 +f 3487 2059 3439 +g Group6798 +f 4954 7559 7558 2362 +g Group21168 +f 2959 4955 4956 3931 +g Group53691 +f 3548 5419 5418 3549 +g Group56715 +f 3550 5421 5420 3551 +g Group63984 +f 3552 6279 6289 3553 +g Group52262 +f 3465 1872 3554 +g Group1074 +f 2416 5699 5735 5644 +g Group52262 +f 3555 1875 3466 +g Group2787 +f 2420 5701 5736 5648 +g Group42062 +f 5764 6562 6561 3556 +g Group28065 +f 2422 6095 6096 5770 +g Group42062 +f 3557 6563 6564 5766 +g Group28065 +f 5772 6059 6097 2424 +g Group20059 +f 3554 1872 3558 +g Group926 +f 3117 5464 5446 3081 +g Group20059 +f 3559 1875 3555 +g Group926 +f 3083 5448 5444 3118 +g Group28894 +f 6291 6290 6241 3445 +g Group9859 +f 6244 6527 6563 3557 +g Group55091 +f 3521 6286 6294 3560 +g Group10538 +f 3561 7266 7265 3562 +g Group1055 +f 3564 7793 7794 4636 +g Group36056 +f 3434 2367 3390 3565 +g Group25684 +f 3522 2452 3261 3566 +g Group25837 +f 3524 2453 3393 3567 +g Group10418 +f 3568 2457 3055 3569 +g Group25837 +f 3570 3396 2463 3526 +g Group48686 +f 3571 4639 4638 3572 +g Group34947 +f 3573 2458 2991 3574 +g Group3630 +f 3576 3954 3947 2992 +g Group51043 +f 3577 7268 7267 3578 +g Group54067 +f 3579 7270 7269 3580 +g Group34577 +f 3581 6149 6173 3582 +g Group19939 +f 5936 5887 6804 6805 +g Group33014 +f 4779 7665 7664 3586 +g Group26501 +f 7890 7980 3587 +g Group48989 +f 3589 2609 3166 3590 +g Group41654 +f 5194 5207 3591 +g Group27489 +f 3505 2064 2063 3498 +g Group1532 +f 3593 2608 2824 3594 +g Group27489 +f 3596 2066 2067 3595 +g Group15109 +f 3598 7667 7668 4734 +g Group52311 +f 3600 5301 5290 2970 +g Group51154 +f 3936 7669 7670 4857 +g Group35407 +f 3603 2610 3170 3604 +g Group52604 +f 3606 5208 5196 +g Group22035 +f 2632 6904 6906 3608 +g Group37611 +f 2602 5572 5573 2637 +g Group22035 +f 3610 6907 6908 2638 +g Group16878 +f 3612 6378 6385 3613 +g Group13037 +f 6460 2648 6455 +g Group34847 +f 3616 2081 3455 +f 3457 2082 3617 +g Group63495 +f 3619 5559 5574 3106 +g Group61959 +f 3620 6909 6903 2660 +g Group34392 +f 3621 5889 5883 2661 +g Group16650 +f 3622 5992 5988 2664 +g Group17702 +f 5994 7094 7095 6807 +g Group48435 +f 3626 2671 2670 3625 +g Group21865 +f 3627 5885 5890 5848 +g Group38608 +f 5891 6461 5937 +g Group48435 +f 3629 2678 2646 3614 +g Group34982 +f 2067 4499 4484 3595 +g Group37654 +f 4780 4781 4426 2069 +g Group33718 +f 2089 4500 4480 2061 +f 4496 4501 2090 2083 +g Group26225 +f 3633 4782 4429 2090 +g Group25715 +f 3635 4783 4756 3488 +g Group46344 +f 3631 4780 4784 3636 +f 3637 4786 4785 3634 +g Group25715 +f 3490 4759 4787 3638 +g Group55476 +f 3639 2082 2066 3596 +g Group62230 +f 6808 6810 6801 3623 +f 3624 6803 6812 6811 +g Group34847 +f 3499 2081 3616 +f 3617 2082 3639 +g Group12306 +f 3627 5848 5837 3625 +f 3629 5840 5849 3628 +g Group25715 +f 3636 4784 4783 3635 +f 3638 4787 4786 3637 +g Group25187 +f 6387 6386 2720 3270 +g Group12860 +f 3618 2659 3195 3641 +g Group16182 +f 4789 4788 2725 2929 +g Group53119 +f 3644 6365 6388 3272 +g Group50156 +f 5215 5324 5323 3646 +g Group5963 +f 3647 3404 2736 3532 +f 3534 2738 3407 3648 +g Group44516 +f 3649 4791 4790 3650 +g Group16182 +f 5305 5326 2993 3652 +g Group49292 +f 3654 3959 3948 2994 +g Group64814 +f 3655 2722 3196 3656 +g Group2302 +f 5225 5224 2742 3135 +g Group16232 +f 3626 5843 5841 2671 +g Group53007 +f 3660 3274 3355 3661 +g Group62399 +f 2611 5577 5567 3589 +g Group12173 +f 3510 2748 2316 3523 +g Group48302 +f 3511 2749 2230 3525 +g Group36634 +f 3519 2755 2254 3531 +g Group505 +f 3520 3924 3830 3533 +g Group31777 +f 3664 3392 3387 3663 +g Group11903 +f 3666 3406 3399 3665 +g Group41600 +f 3470 2828 2033 3471 +g Group51691 +f 3472 2830 2034 3473 +g Group41600 +f 3477 2845 2048 3480 +g Group51691 +f 3481 2846 2052 3506 +g Group6226 +f 2084 4498 4502 4459 +g Group41030 +f 3503 4497 4473 3504 +g Group1532 +f 3593 4458 4441 2608 +g Group11623 +f 3594 2824 2623 3630 +g Group19279 +f 3536 4610 4613 3542 +g Group59395 +f 3438 4630 4640 4578 +g Group48686 +f 3564 4636 4639 3571 +g Group23266 +f 4641 4695 4694 3440 +g Group15109 +f 3586 7671 7666 3597 +g Group41154 +f 2626 7889 4736 4726 +g Group44516 +f 3643 4789 4791 3649 +g Group44254 +f 3491 7981 7982 4758 +g Group59169 +f 2383 4957 4958 3971 +g Group32649 +f 4614 4959 4955 2959 +g Group27760 +f 3575 3999 3992 2466 +g Group42212 +f 4697 4644 4698 +g Group9748 +f 2628 4858 4859 3978 +g Group31366 +f 3602 7673 7672 3585 +g Group7886 +f 3653 4004 3993 2740 +g Group60773 +f 3654 2994 2725 3642 +g Group5540 +f 3540 7457 7459 3544 +g Group53789 +f 7463 7462 7427 7377 +g Group34947 +f 3569 3055 2458 3573 +g Group53947 +f 3568 5131 5126 2457 +g Group45278 +f 3599 5198 5180 2614 +g Group40853 +f 5195 5327 3669 +g Group9149 +f 3646 5323 5325 3651 +g Group49355 +f 5330 5329 5226 5222 +g Group22707 +f 3442 5664 5666 5447 +g Group60077 +f 3441 7216 7266 3561 +g Group22707 +f 5449 5667 5626 3444 +g Group60077 +f 3537 7224 7262 3443 +g Group4740 +f 5473 3019 7326 7327 +g Group14049 +f 3668 7272 3056 +g Group65382 +f 3606 5197 5199 3669 +g Group55368 +f 3619 3106 2633 3608 +g Group8348 +f 3658 5225 5226 3670 +g Group19239 +f 3662 5576 5555 3610 +g Group53691 +f 3538 5417 5419 3548 +g Group13186 +f 3549 5418 5421 3550 +g Group51043 +f 3562 7265 7268 3577 +g Group10538 +f 3578 7267 7270 3579 +g Group23958 +f 5356 7091 3590 3166 +g Group60438 +f 3604 3170 2630 3605 +g Group64814 +f 3655 7093 7088 2722 +g Group24309 +f 3656 3196 2742 3657 +g Group62415 +f 6136 6182 6219 6098 +g Group63984 +f 6294 3310 3671 3560 +f 3311 6261 3566 3672 +g Group55091 +f 3581 6265 6243 3447 +g Group44114 +f 3612 3233 2643 3659 +g Group7985 +f 3660 6369 6389 3615 +g Group58392 +f 3674 3292 3291 3673 +g Group28985 +f 3676 6176 6175 3675 +g Group28488 +f 3302 6390 6391 6356 +g Group56420 +f 3679 6354 6340 2717 +g Group28985 +f 3675 6175 6177 3681 +g Group58392 +f 3673 3291 3373 3682 +g Group48964 +f 3683 6393 6392 3684 +g Group25883 +f 3640 6387 6393 3683 +f 3685 6394 6367 3644 +g Group20291 +f 3677 6390 6395 3686 +g Group35311 +f 6289 3292 3674 3553 +g Group5904 +f 3582 6173 6176 3676 +g Group53741 +f 3613 6385 6396 3678 +g Group24334 +f 3661 3355 3306 3680 +g Group27711 +f 3309 6191 6220 6158 +g Group21529 +f 3682 3373 3311 3672 +g Group20291 +f 3684 6392 6382 3679 +g Group48964 +f 3686 6395 6394 3685 +g Group2370 +f 3541 4064 4083 3663 +g Group31777 +f 3565 3390 3389 3687 +g Group21558 +f 3567 3393 3392 3664 +g Group57687 +f 4086 4096 3570 3397 +g Group16182 +f 3689 3398 2619 3458 +g Group11903 +f 3665 3399 3398 3689 +f 3690 3401 3402 3691 +g Group16182 +f 3456 2654 3401 3690 +g Group37813 +f 3647 3405 2787 3692 +g Group1684 +f 3648 3407 3406 3666 +g Group2370 +f 3688 4095 4093 3687 +g Group48032 +f 3692 2787 2727 3691 +g Group64255 +f 3693 6869 6898 2634 +g Group19052 +f 3695 6871 6900 2640 +g Group56057 +f 3697 6875 6910 2662 +g Group35724 +f 3699 2665 2663 3698 +g Group19727 +f 3699 7047 7072 2665 +g Group43353 +f 3702 2673 2672 3701 +f 3704 2679 2648 3703 +g Group40415 +f 3705 2019 2835 3706 +g Group41753 +f 3707 2020 2841 3708 +g Group56502 +f 3709 2296 3710 +g Group4973 +f 2025 2692 2691 +g Group56502 +f 3712 2299 3711 +g Group4973 +f 2695 2027 2694 +g Group19298 +f 3713 2303 3714 +g Group21876 +f 2040 4420 4437 2711 +g Group19298 +f 3716 2306 3715 +g Group21876 +f 2715 4439 4422 2042 +g Group16512 +f 3717 2095 3171 3718 +g Group8385 +f 3719 2097 2885 3720 +g Group22392 +f 3722 2313 2231 3721 +f 3724 2318 2317 3723 +g Group49392 +f 3725 2118 3015 3726 +g Group8385 +f 3727 2120 2803 3728 +f 3729 2122 3730 +g Group22392 +f 2750 3430 3511 +g Group63830 +f 3731 2121 2807 3732 +g Group56016 +f 3733 2098 2893 3734 +g Group8385 +f 3735 2119 2949 3736 +g Group41495 +f 3738 3939 3970 2953 +g Group57017 +f 3739 2096 3178 3740 +g Group60041 +f 3741 2135 3077 3742 +g Group22392 +f 3743 2327 2318 3724 +g Group17278 +f 3744 2093 3219 3745 +g Group117 +f 3747 3748 3515 3746 +g Group51646 +f 1330 3747 3746 3514 +g Group54920 +f 3750 3426 3513 3749 +f 3752 3516 3419 3751 +g Group51646 +f 3753 3754 1346 3517 +g Group117 +f 3755 3754 3753 3518 +g Group10724 +f 3757 3449 3519 3756 +g Group41057 +f 3759 2292 2324 3758 +f 3761 2275 2293 3760 +g Group3853 +f 3763 2294 2273 3762 +f 3727 2321 2295 3764 +g Group57924 +f 3765 2136 3097 3766 +g Group6395 +f 3767 2242 3124 3768 +g Group19247 +f 3770 2245 2279 3769 +f 3723 2317 2246 3771 +g Group22392 +f 3772 2219 2923 3773 +g Group30519 +f 3774 2221 3189 3775 +g Group63399 +f 3776 2223 3051 3777 +g Group8385 +f 3779 2112 2111 3778 +g Group27050 +f 3780 2126 2099 3721 +f 3778 2111 2127 3781 +g Group4487 +f 3782 2220 2924 3783 +g Group55382 +f 3785 2129 2128 3784 +f 3787 2130 2131 3786 +g Group22392 +f 3788 2224 2987 3789 +g Group55502 +f 3791 3944 3950 2988 +g Group5488 +f 3792 2222 3190 3793 +g Group8512 +f 3794 2239 3128 3795 +g Group515 +f 3797 2137 3796 +g Group14522 +f 3123 2240 3129 +g Group515 +f 3798 2138 3799 +g Group14522 +f 2221 3124 3130 +g Group31285 +f 3800 2243 3251 3801 +g Group5240 +f 3770 2140 2139 3802 +f 3803 2141 2142 3771 +g Group22392 +f 3762 2273 2871 3804 +g Group12301 +f 3805 2274 2872 3806 +g Group8385 +f 3807 2206 2205 3769 +f 3808 2207 2206 3807 +g Group27050 +f 3759 2195 2126 3780 +f 3781 2127 2197 3760 +g Group55382 +f 3763 2198 2129 3785 +f 3786 2131 2199 3764 +g Group31285 +f 3744 2308 3253 3809 +g Group17278 +f 3800 2101 3242 3810 +g Group22392 +f 3779 2226 2769 3811 +g Group8385 +f 3722 2100 2751 3812 +g Group288 +f 3814 2328 3813 +g Group23300 +f 3528 6357 6323 2720 +g Group62502 +f 3815 2282 3181 3816 +g Group288 +f 3817 2331 2916 3818 +g Group14295 +f 3820 2728 2654 3819 +g Group288 +f 3821 2334 3822 +g Group23300 +f 2730 6326 6358 3530 +g Group41295 +f 3823 2337 3044 3824 +g Group26408 +f 3825 2339 2859 3826 +g Group55605 +f 3827 2341 3828 +g Group4076 +f 2736 3531 3532 +g Group55605 +f 3830 2342 3829 +g Group4076 +f 3533 2738 3534 +g Group27746 +f 3831 2340 2860 3832 +g Group61292 +f 3833 2697 2712 3714 +g Group47919 +f 3834 2332 2922 3835 +g Group61292 +f 3716 2716 2703 3836 +g Group288 +f 3837 2338 2980 3838 +g Group33398 +f 3840 3949 3940 2981 +g Group48920 +f 3841 2330 3186 3842 +g Group51944 +f 3843 2345 3120 3844 +g Group11150 +f 3845 2645 2673 3702 +g Group46044 +f 3846 2329 3326 3847 +g Group21876 +f 3848 2040 2019 3705 +f 3825 2021 2042 3849 +g Group46505 +f 3850 2255 3127 3851 +g Group4973 +f 3853 2025 2023 3852 +f 3855 2026 2027 3854 +g Group32960 +f 3856 2652 2692 3710 +f 3712 2695 2656 3857 +g Group42050 +f 3858 6897 6872 1915 +g Group14295 +f 3860 2605 2935 3861 +g Group10973 +f 3850 2611 3201 3862 +g Group55302 +f 3863 2615 3063 3864 +g Group288 +f 3866 2260 2259 3865 +g Group61926 +f 3867 2606 2936 3868 +g Group14295 +f 3869 2616 2999 3870 +g Group47405 +f 3872 3957 3955 3000 +g Group62927 +f 3873 2612 3202 3874 +g Group415 +f 3875 2631 3141 3876 +g Group21717 +f 3877 1922 1916 3859 +g Group60051 +f 3879 6360 6351 3352 +g Group62679 +f 3880 2272 2271 3703 +g Group32960 +f 3881 2653 2652 3856 +g Group18953 +f 3881 2276 3819 +g Group32960 +f 3857 2656 2657 3882 +g Group18953 +f 3865 2259 3882 +g Group60512 +f 3815 2659 3142 3883 +g Group5720 +f 3877 7075 7065 1922 +g Group38905 +f 3858 1915 1936 3885 +f 3886 1938 1917 3697 +g Group4973 +f 3709 2025 3853 +f 3854 2027 3711 +g Group61292 +f 3887 2698 2697 3833 +g Group47285 +f 3887 2262 3888 +g Group61292 +f 3836 2703 2704 3889 +g Group47285 +f 3890 2302 3889 +g Group21876 +f 3848 4438 4421 2040 +f 2042 4423 4440 3849 +g Group50248 +f 3700 1921 3693 +f 3696 1923 3884 +g Group29346 +f 3885 1936 3701 +f 3704 1938 3886 +g Group288 +f 3813 2328 3246 3891 +g Group14295 +f 3821 6328 6361 3892 +g Group288 +f 3820 2333 2771 3893 +g Group14295 +f 3866 2620 2790 3894 +g Group505 +f 3756 3519 3531 3828 +g Group12173 +f 3895 2316 2748 3896 +g Group22392 +f 3896 2748 3897 +g Group63702 +f 3895 2743 3811 +f 3898 2751 2753 3899 +g Group22392 +f 3729 2750 3899 +g Group63702 +f 3812 2751 3898 +g Group55605 +f 3893 2771 2341 3827 +g Group4076 +f 3894 2790 2738 3829 +g Group41753 +f 3707 4447 4460 2020 +g Group51844 +f 3708 2841 2026 3855 +g Group63830 +f 3728 2803 2121 3731 +g Group8385 +f 3732 2807 2125 3758 +g Group12301 +f 3804 2871 2274 3805 +g Group22392 +f 3806 2872 2275 3761 +g Group27746 +f 3831 4456 4454 2340 +g Group37837 +f 3832 2860 2343 3852 +g Group56016 +f 3720 2885 2098 3733 +g Group8385 +f 3734 2893 2130 3787 +g Group4487 +f 3773 2923 2220 3782 +g Group22392 +f 3783 2924 2234 3784 +g Group47919 +f 3818 2916 2332 3834 +g Group288 +f 3835 2922 2302 3890 +g Group61926 +f 3861 2935 2606 3867 +g Group14295 +f 3868 2936 2627 3888 +g Group89 +f 3737 3981 3966 2132 +g Group52976 +f 3738 2953 2097 3719 +g Group14096 +f 3790 3990 3995 2238 +g Group1447 +f 3791 2988 2219 3772 +g Group57528 +f 3839 3994 3986 2344 +g Group44879 +f 3840 2981 2331 3817 +g Group5999 +f 3871 4002 4000 2629 +g Group58886 +f 3872 3000 2605 3860 +g Group8385 +f 3726 3015 2119 3735 +g Group27385 +f 3900 3021 2118 3725 +g Group22392 +f 3777 3051 2224 3788 +g Group41392 +f 3901 3052 2223 3776 +g Group288 +f 3824 3044 2338 3837 +g Group19288 +f 3902 3048 2337 3823 +g Group14295 +f 3864 3063 2616 3869 +g Group33295 +f 3903 3064 2615 3863 +g Group51914 +f 3742 3077 3021 3900 +g Group14522 +f 3797 3123 3766 +g Group57924 +f 3743 2136 3765 +g Group14522 +f 3768 3124 3799 +g Group57924 +f 3767 2207 3808 +g Group385 +f 3795 3128 3052 3901 +g Group14522 +f 3717 2240 3796 +f 3798 2221 3774 +g Group43817 +f 3844 3120 3048 3902 +g Group38378 +f 3851 3127 2268 3695 +g Group57824 +f 3876 3141 3064 3903 +g Group52385 +f 3883 3142 2635 3694 +g Group57017 +f 3718 3171 2096 3739 +g Group16512 +f 3740 3178 2135 3741 +g Group5488 +f 3775 3189 2222 3792 +g Group30519 +f 3793 3190 2239 3794 +g Group48920 +f 3841 7089 7084 2330 +g Group8415 +f 3842 3186 2345 3843 +g Group62927 +f 3873 7092 7090 2612 +g Group22422 +f 3874 3202 2631 3875 +g Group8385 +f 3745 3219 2141 3803 +g Group22392 +f 3801 3251 2244 3802 +f 3809 3253 2309 3904 +g Group8385 +f 3810 3242 2102 3905 +g Group288 +f 3906 3250 2272 3880 +g Group14295 +f 3907 3269 2645 3845 +g Group9181 +f 3891 3246 3319 3908 +g Group23188 +f 3892 6361 6362 3909 +g Group9181 +f 3847 3326 3250 3906 +g Group23188 +f 3879 3352 3269 3907 +g Group46044 +f 3908 3319 2329 3846 +g Group60051 +f 3909 6362 6359 3878 +g Group3391 +f 3910 2091 2092 3751 +g Group63314 +f 3911 3912 1244 2094 +g Group11785 +f 3913 3912 3911 3421 +g Group33907 +f 3910 3420 3422 3913 +f 3914 3424 3425 3915 +g Group11785 +f 3917 3914 3423 3916 +g Group63314 +f 1260 3917 3916 2102 +g Group3391 +f 3750 2104 2103 3915 +g Group63314 +f 3918 3919 1287 2115 +g Group11785 +f 3919 3918 3427 3428 +f 3431 3430 3730 3920 +g Group63314 +f 1301 3920 3730 2122 +g Group117 +f 3450 3449 3757 3921 +g Group51646 +f 1372 3921 3757 2164 +f 3922 3923 1386 2171 +g Group117 +f 3923 3922 3452 3453 +g Group8385 +f 3911 2094 3904 +g Group22392 +f 3421 2309 3507 +g Group8385 +f 3905 2102 3916 +g Group22392 +f 2314 3423 3508 +g Group8385 +f 3918 2115 3897 +g Group22392 +f 3427 2748 3510 +g Group36246 +f 3746 3515 2143 3749 +g Group22239 +f 3753 3517 3516 3752 +g Group62253 +f 3922 2171 2766 3924 +f 3748 2144 2328 3814 +f 3822 2334 2153 3755 +g Group52034 +f 3924 2766 2342 3830 +g Group8241 +f 2942 3925 3925 2942 +g Group58101 +f 3927 4919 4945 2946 +g Group3204 +f 2955 3929 3929 2955 +g Group11075 +f 3932 2958 2959 3931 +g Group54831 +f 3933 2964 3933 +g Group51646 +f 3933 1396 2964 +g Group53064 +f 7675 7674 3934 3935 +g Group54069 +f 2972 7669 7676 4894 +g Group58687 +f 3938 2325 3737 3939 +g Group29827 +f 3941 2968 2981 3940 +g Group51646 +f 2984 1398 3942 +g Group54831 +f 2984 3942 3942 +g Group44680 +f 3943 2133 3790 3944 +g Group29827 +f 3946 2990 2986 3945 +g Group59073 +f 3938 2974 2992 3947 +g Group50590 +f 3948 2740 3839 3949 +g Group59073 +f 3951 2996 2988 3950 +g Group6815 +f 3951 2382 3546 3952 +g Group42944 +f 7561 7560 3954 4935 +g Group11075 +f 3953 2998 2954 3930 +g Group32088 +f 3932 7600 7612 2958 +g Group53064 +f 3927 7677 7678 3937 +g Group39510 +f 2945 3928 4830 4862 +f 3926 4943 4950 2941 +g Group52477 +f 3955 2629 3601 3956 +g Group36583 +f 3946 2263 3871 3957 +g Group61786 +f 2965 7675 7679 4897 +g Group23070 +f 3959 4834 4851 3653 +g Group50585 +f 3960 4835 4825 2503 +g Group34909 +f 3962 4960 4918 2504 +g Group51833 +f 3964 3965 2948 2947 +g Group55018 +f 3966 3965 3964 2132 +g Group37831 +f 3967 7604 7619 2537 +g Group34073 +f 3969 3970 2132 3964 +g Group30888 +f 2952 3969 3964 2947 +g Group49076 +f 3971 5020 4993 2383 +g Group29872 +f 3973 7563 7562 2567 +g Group43350 +f 3975 3933 2964 2180 +g Group22405 +f 3941 2180 2964 3976 +g Group30701 +f 2967 3976 3977 1337 +f 3976 2964 1396 3977 +g Group36796 +f 3978 4899 4889 2628 +g Group10911 +f 3980 2973 3736 3981 +g Group55018 +f 3983 3984 2133 3982 +g Group51833 +f 2976 3983 3982 2975 +g Group30888 +f 3982 3985 2978 2975 +g Group34073 +f 3943 3985 3982 2133 +g Group53957 +f 3975 2180 2344 3986 +g Group40165 +f 3987 3942 2983 2982 +g Group30701 +f 2984 3988 3989 1398 +f 3988 2985 1353 3989 +g Group22405 +f 3988 2984 2181 3945 +g Group62440 +f 3984 2977 3789 3990 +g Group53957 +f 3991 2263 2181 3987 +g Group17667 +f 3980 2325 2466 3992 +g Group2814 +f 3993 2993 3838 3994 +g Group17667 +f 3996 2382 2238 3995 +g Group24575 +f 3996 5124 5133 3997 +g Group7930 +f 4931 7564 7565 5135 +g Group53419 +f 3968 5023 5007 1312 +g Group8896 +f 3972 7621 7620 1314 +g Group11658 +f 3979 5038 5013 1397 +g Group16318 +f 3963 4846 4829 1123 +f 3961 4961 4942 1119 +g Group4701 +f 4000 2999 3600 4001 +g Group54343 +f 3991 2989 3870 4002 +g Group44513 +f 3974 4900 4891 1395 +g Group40830 +f 4852 4863 3652 4004 +g Group38224 +f 2383 7566 7567 4957 +g Group6815 +f 3954 3575 2466 3947 +g Group54339 +f 3936 4857 4858 2628 +g Group52477 +f 3959 3653 2740 3948 +g Group54875 +f 2957 5120 5136 4953 +g Group24575 +f 3999 5134 5122 3992 +g Group40830 +f 3600 4864 4859 4001 +g Group4701 +f 4004 3652 2993 3993 +g Group44680 +f 3939 3737 2132 3970 +g Group58687 +f 3944 3790 2238 3950 +g Group36583 +f 3949 3839 2344 3940 +g Group50590 +f 3957 3871 2629 3955 +g Group62440 +f 3981 3736 2949 3966 +g Group10911 +f 3990 3789 2987 3995 +g Group54343 +f 3994 3838 2980 3986 +g Group2814 +f 4002 3870 2999 4000 +g Group37003 +f 4005 1038 3375 4006 +g Group453 +f 4007 4143 4171 4008 +g Group19793 +f 4009 8116 8115 4010 +g Group40103 +f 4012 8081 8095 2521 +g Group55668 +f 4013 4012 4011 1046 +g Group11481 +f 2586 8117 8118 4053 +g Group2677 +f 4017 1340 4016 +g Group3553 +f 2650 4123 4145 2706 +g Group2677 +f 4009 1382 4018 +g Group3553 +f 2707 4117 4125 2655 +g Group21438 +f 4011 2521 3380 4019 +g Group49165 +f 4020 311 2780 4021 +g Group33600 +f 4022 2522 2781 4023 +g Group55668 +f 4024 4014 1038 4005 +g Group40103 +f 2487 8079 8094 4024 +g Group26754 +f 2075 8080 8119 4077 +g Group19793 +f 4015 8117 8120 4016 +g Group2677 +f 4017 4142 4150 1340 +g Group3553 +f 4025 2651 4026 +f 2655 4126 4144 4027 +f 2617 4027 4007 +g Group50424 +f 4026 2651 3400 4028 +g Group46145 +f 4029 2727 2787 4030 +g Group61710 +f 4031 1381 2785 4032 +g Group23381 +f 4021 4097 4087 2779 +g Group38946 +f 2780 4090 4097 4021 +f 4023 4098 4092 2782 +g Group23381 +f 2781 4088 4098 4023 +g Group8108 +f 4037 3415 3412 4034 +g Group3071 +f 4038 3416 3415 4037 +f 4040 3418 3417 4039 +g Group8108 +f 4036 3413 3418 4040 +g Group51491 +f 4041 4038 2784 4030 +g Group35926 +f 3405 4041 4030 2787 +f 4032 4042 3408 2789 +g Group51491 +f 4039 4042 4032 2785 +g Group49165 +f 4020 4152 4166 311 +g Group61710 +f 4031 4172 4163 1381 +g Group33600 +f 4022 4165 4155 2522 +g Group46145 +f 4028 3400 2727 4029 +g Group37003 +f 4043 1046 3377 4044 +g Group40587 +f 4046 4141 4169 4045 +g Group25314 +f 3434 2050 3433 +g Group40587 +f 4047 4170 4127 4048 +g Group25314 +f 2054 3436 3435 +g Group56958 +f 4050 8070 8121 4204 +g Group6695 +f 4052 8122 8076 2409 +g Group32110 +f 4054 2585 2586 4053 +g Group64622 +f 4051 4189 4222 4055 +g Group4123 +f 4056 4224 4223 4057 +g Group19396 +f 4059 4054 1759 4058 +g Group24762 +f 4190 4192 4226 2012 +g Group61216 +f 4061 4138 4173 4060 +g Group55668 +f 4062 1038 4014 4063 +g Group6649 +f 4064 3541 3436 4048 +g Group17956 +f 4060 4065 2076 2049 +g Group16788 +f 4050 4131 4173 2405 +g Group33229 +f 4067 4133 4135 4066 +g Group17956 +f 2077 4067 4066 2053 +g Group45943 +f 4068 2054 2053 4066 +g Group25314 +f 4061 2050 4069 +f 4070 2054 4068 +g Group6649 +f 4046 3434 3565 4071 +g Group21730 +f 4062 2551 3384 4072 +g Group33892 +f 4073 2552 2783 4074 +g Group49165 +f 4075 343 2782 4076 +g Group47383 +f 4078 1761 2075 4077 +g Group4123 +f 4055 4222 4225 4058 +g Group24762 +f 2014 4227 4216 4214 +g Group19396 +f 4078 4079 4056 1761 +g Group64622 +f 4057 4223 4221 4049 +g Group40395 +f 4043 2493 4010 4080 +g Group47594 +f 4082 3409 3394 4081 +g Group2370 +f 4084 3664 3663 4083 +g Group47594 +f 4086 3397 3410 4085 +g Group3071 +f 4087 3411 3409 4082 +f 4085 3410 3414 4088 +g Group38946 +f 4089 4090 2780 4074 +g Group23673 +f 4037 4089 4074 2783 +f 4076 4091 4040 2786 +g Group38946 +f 4092 4091 4076 2782 +g Group49165 +f 4075 4154 4164 343 +g Group2370 +f 4071 3565 3687 4093 +g Group57687 +f 4084 4094 3567 3664 +g Group7424 +f 4081 4094 4084 2775 +g Group33892 +f 4073 4167 4159 2552 +g Group25314 +f 4069 2050 4045 +f 4047 2054 4070 +g Group17643 +f 4083 4174 4157 2366 +g Group7424 +f 4096 4086 2777 4095 +g Group57687 +f 3570 4096 4095 3688 +g Group17643 +f 4095 2777 2450 4093 +g Group26754 +f 4053 8118 8093 2073 +g Group11481 +f 4077 8119 8115 2576 +g Group8108 +f 4097 4033 3411 4087 +g Group23673 +f 4090 4034 4033 4097 +f 4098 4035 4036 4092 +g Group8108 +f 4088 3414 4035 4098 +g Group12480 +f 4100 4299 4298 4099 +g Group33644 +f 4101 4181 4217 2798 +g Group7443 +f 4104 4301 4300 4103 +g Group56334 +f 2811 4302 4303 4260 +g Group7968 +f 4107 4239 4263 2820 +g Group61731 +f 4110 2622 2621 4109 +g Group65181 +f 4111 4112 2608 1355 +g Group48740 +f 4113 4112 4111 2823 +g Group61731 +f 4115 2625 2624 4114 +g Group28401 +f 4116 4468 4483 2623 +g Group24182 +f 4117 2707 2625 4115 +g Group62229 +f 4118 4119 2087 2844 +g Group891 +f 4120 4197 4219 2856 +g Group9008 +f 4122 4202 4218 4121 +g Group3553 +f 4123 2650 4124 +g Group52648 +f 4016 8123 8087 4017 +g Group3553 +f 4126 2655 4125 +g Group39299 +f 8116 8124 8089 2074 +g Group21922 +f 4128 4064 4048 4127 +g Group45788 +f 4130 4201 4228 4129 +g Group62229 +f 2048 4130 4129 2846 +g Group17956 +f 4122 2076 4065 4131 +f 4133 4067 2077 4132 +g Group25449 +f 4132 2077 2052 4134 +g Group61216 +f 4136 4068 4066 4135 +g Group48417 +f 2808 4301 4304 4265 +g Group40587 +f 4138 4061 4069 4137 +f 4139 4070 4068 4136 +g Group21922 +f 4141 4046 4071 4140 +g Group7443 +f 4099 4298 4305 4106 +g Group15885 +f 4111 4250 4267 2823 +g Group12480 +f 4103 4300 4306 4102 +g Group8931 +f 4307 4503 4492 2795 +g Group52648 +f 4142 4017 4124 +g Group3553 +f 4025 2650 2651 +g Group19118 +f 4143 4007 4027 4144 +g Group7741 +f 4145 8125 8065 4109 +g Group48740 +f 4146 4147 2819 4108 +g Group65181 +f 2708 4146 4108 1367 +g Group64147 +f 1387 8114 8126 4504 +g Group453 +f 4150 4026 4028 4149 +g Group58831 +f 4113 8127 8073 4116 +g Group6784 +f 4118 2844 2088 4121 +g Group55879 +f 4129 4228 4207 4134 +g Group9736 +f 4147 2854 2709 4148 +g Group17159 +f 4151 3376 4006 4152 +g Group17451 +f 4153 3378 4044 4154 +g Group28563 +f 4156 1258 2522 4155 +g Group7550 +f 4158 1286 2366 4157 +g Group28855 +f 4160 1339 2552 4159 +g Group1202 +f 4161 4162 3391 4140 +g Group17643 +f 4093 4161 4140 4071 +g Group7550 +f 4162 2450 1258 4156 +g Group28563 +f 4151 2488 1286 4158 +g Group28855 +f 4153 2494 1381 4163 +g Group32724 +f 4164 3377 4019 4165 +f 4166 3375 4072 4167 +g Group45269 +f 4168 4160 3383 4149 +g Group61710 +f 4029 4168 4149 4028 +g Group40587 +f 4137 4069 4045 4169 +f 4170 4047 4070 4139 +g Group49548 +f 4143 1382 3385 4171 +g Group52648 +f 4123 8088 8125 4145 +f 4117 8082 8090 4125 +g Group19118 +f 4142 4025 4026 4150 +g Group52648 +f 4126 4018 4144 +g Group3553 +f 2655 4027 2617 +g Group32724 +f 4152 4006 3375 4166 +g Group61710 +f 4171 4172 4031 4008 +g Group45269 +f 4163 4172 4171 3385 +g Group17159 +f 4165 4019 3380 4155 +g Group24146 +f 4141 2370 4169 +f 4170 2365 4127 +g Group44775 +f 4138 2429 2405 4173 +g Group33229 +f 4131 4065 4060 4173 +g Group16788 +f 4133 4052 2409 4135 +g Group32724 +f 4154 4044 3377 4164 +g Group17451 +f 4167 4072 3384 4159 +g Group17643 +f 4128 4174 4083 4064 +g Group1202 +f 4157 4174 4128 3382 +g Group18883 +f 4175 7993 8027 2792 +g Group64036 +f 4177 4308 4292 1077 +g Group19139 +f 2793 4309 4308 4177 +g Group40303 +f 2794 4178 4179 +g Group50085 +f 4181 7998 8028 4505 +g Group28513 +f 4182 4270 4293 2800 +g Group13846 +f 4184 7830 7861 2805 +g Group49051 +f 4507 4187 2563 4507 +g Group56958 +f 4188 8072 8122 4052 +g Group4123 +f 4192 4191 4054 4059 +f 2585 4191 4190 2564 +g Group24762 +f 4190 4191 4192 +g Group6784 +f 2843 4350 4329 2086 +g Group38606 +f 4195 4194 4193 2855 +g Group62229 +f 4196 2087 4119 4197 +g Group38606 +f 4199 4182 2800 4198 +g Group6784 +f 2047 4332 4345 2845 +g Group62229 +f 4201 4130 2048 4200 +g Group22154 +f 4203 4204 2406 4202 +g Group1515 +f 4131 4203 4202 4122 +f 4205 4206 4133 4132 +g Group22154 +f 4188 4206 4205 2408 +g Group9008 +f 4205 4132 4134 4207 +g Group32062 +f 4185 4287 4295 2804 +g Group53075 +f 4183 7838 7866 2799 +g Group32255 +f 4208 4233 4234 2014 +g Group19139 +f 4177 4338 4348 2793 +f 4176 4312 4313 2791 +g Group64036 +f 1071 4286 4312 4176 +g Group40303 +f 4210 2815 4211 +g Group61524 +f 8003 4212 2560 8003 +g Group4123 +f 4214 4215 2575 2498 +f 4215 4216 4079 4078 +g Group24762 +f 4215 4214 4216 +g Group40360 +f 86 4311 4314 4268 +g Group30386 +f 4209 8098 8128 4508 +g Group62229 +f 4344 4351 2087 4196 +g Group55879 +f 4219 4118 4121 4218 +g Group17332 +f 4200 4347 4352 2354 +g Group61524 +f 4212 4261 2560 +g Group30386 +f 4187 8104 2563 +g Group12061 +f 4204 8121 8091 2406 +g Group19725 +f 4189 2011 2496 4222 +g Group24762 +f 4224 2014 2534 4223 +f 4186 2564 4190 2012 +g Group4123 +f 4058 4225 4226 4059 +g Group24762 +f 4225 2012 4226 +g Group4123 +f 4192 4059 4226 +g Group24762 +f 4222 2496 2012 4225 +f 4214 2498 4208 2014 +g Group4123 +f 4079 4227 4224 4056 +g Group24762 +f 4227 2014 4224 +g Group4123 +f 4227 4079 4216 +g Group19725 +f 4223 2534 2017 4221 +g Group8931 +f 2797 4509 4510 4315 +g Group45788 +f 4197 4119 4118 4219 +g Group29647 +f 4202 2406 2438 4218 +g Group891 +f 4201 4105 2811 4228 +g Group33644 +f 4213 4107 2820 4220 +g Group10982 +f 4228 2811 2371 4207 +g Group19301 +f 4229 1306 2495 4230 +g Group31292 +f 4231 4511 4467 1389 +g Group23375 +f 2497 4476 4511 4231 +g Group24338 +f 4234 1043 2533 4235 +g Group2871 +f 4236 1274 4106 4237 +g Group32326 +f 4238 1367 4108 4239 +g Group24338 +f 4240 4512 4507 4241 +g Group19554 +f 2371 8101 8075 2408 +g Group63824 +f 4229 4243 4242 1306 +g Group10788 +f 4244 4317 4316 4245 +g Group63824 +f 4247 4248 1304 4246 +g Group19554 +f 2406 8092 8129 2438 +g Group24338 +f 4230 2495 1035 4240 +g Group24409 +f 4250 8030 7998 4101 +g Group19301 +f 4235 2533 1304 4248 +g Group23375 +f 4251 4513 4507 2563 +g Group31292 +f 1387 4504 4513 4251 +g Group28921 +f 4354 8031 7995 2476 +g Group2871 +f 4236 4355 4356 1274 +g Group7239 +f 2354 4352 4357 4272 +g Group35067 +f 4259 4359 4358 4258 +g Group45159 +f 4242 8103 8107 1306 +g Group24409 +f 4238 8001 8032 4462 +g Group32326 +f 4461 8033 8034 7893 +g Group12627 +f 4251 8105 8112 1387 +g Group18422 +f 2855 4343 4360 4296 +g Group2871 +f 1300 4359 4361 4244 +g Group889 +f 2856 8130 8106 4265 +g Group35067 +f 4253 4354 4356 4257 +g Group58633 +f 4433 8035 8036 7895 +g Group24409 +f 4464 8037 8029 4249 +g Group4710 +f 4231 8109 8098 2497 +g Group28921 +f 2530 8014 8038 4358 +g Group30212 +f 4211 7892 7896 4514 +g Group48417 +f 4260 4303 4305 2810 +g Group15885 +f 4239 4108 2819 4263 +g Group56334 +f 4304 4318 2856 4265 +g Group7968 +f 4250 4101 2798 4267 +g Group24338 +f 4476 4515 4234 4233 +g Group9048 +f 2793 7868 7897 4309 +g Group11423 +f 4269 1273 4183 4270 +g Group10788 +f 4272 4236 4237 4271 +g Group29162 +f 4274 7832 7898 4363 +g Group50927 +f 4276 4273 2028 4275 +g Group47378 +f 2411 4334 4322 4276 +f 4278 4324 4337 2412 +g Group50927 +f 4279 4278 4277 2039 +g Group10968 +f 4280 4792 4793 4393 +g Group14517 +f 4283 4284 2029 4282 +g Group10968 +f 4283 4794 4795 4532 +g Group54871 +f 4277 2412 2428 4285 +g Group44452 +f 4389 4562 4561 4517 +g Group7874 +f 4285 2428 4195 4287 +g Group58420 +f 4275 2028 1273 4269 +g Group25372 +f 4288 8017 8039 4518 +g Group57207 +f 1771 4796 4797 4395 +f 1773 4798 4799 4551 +g Group14517 +f 4291 4290 4280 2031 +g Group2855 +f 4279 7842 7899 4323 +g Group45497 +f 4292 4387 4373 1077 +g Group18422 +f 4294 2800 4293 +g Group21971 +f 4256 2799 4257 +g Group18422 +f 4295 2855 4296 +g Group21971 +f 2804 4264 4259 +g Group40360 +f 4289 74 4254 4297 +g Group8931 +f 4299 2795 2796 4298 +g Group3894 +f 4301 2808 2809 4300 +g Group56334 +f 4271 4302 2811 4105 +g Group59883 +f 4303 4302 4271 4237 +g Group51966 +f 4301 4104 4245 4304 +g Group3894 +f 4298 2796 2810 4305 +g Group8931 +f 4300 2809 2797 4306 +g Group12480 +f 4307 4299 4100 4288 +g Group33644 +f 4220 4503 4518 4213 +g Group60487 +f 4308 4519 4477 4292 +g Group15590 +f 4309 4520 4519 4308 +g Group28921 +f 4310 8040 8016 4102 +g Group32062 +f 4270 4183 2799 4293 +g Group28513 +f 4287 4195 2855 4295 +g Group15590 +f 4312 4521 4514 4313 +g Group60487 +f 4286 4516 4521 4312 +g Group36811 +f 4311 4506 4522 4314 +g Group33644 +f 4181 4505 4510 4217 +g Group12480 +f 4306 4315 4310 4102 +g Group7239 +f 4317 2437 4120 4316 +g Group10788 +f 4272 4357 4355 4236 +g Group21971 +f 4296 4360 4361 4264 +g Group9048 +f 4313 7900 7901 2791 +g Group51966 +f 4303 4237 4106 4305 +g Group59883 +f 4318 4304 4245 4316 +g Group56334 +f 2856 4318 4316 4120 +g Group5499 +f 4309 7897 7902 4520 +g Group64036 +f 4319 1071 4176 4320 +g Group47378 +f 4321 4273 4276 4322 +f 4324 4278 4279 4323 +g Group38004 +f 4325 4371 4393 4326 +g Group56680 +f 4325 8007 8041 4327 +g Group6784 +f 4328 2086 4329 +g Group17967 +f 2428 4194 4195 +g Group64964 +f 4331 2411 2353 4330 +g Group6784 +f 4332 2047 4330 +g Group17967 +f 4199 2353 4182 +g Group57471 +f 4333 4334 2411 4331 +g Group46288 +f 2056 4333 4331 2078 +f 4335 4336 2058 2079 +g Group57471 +f 4337 4336 4335 2412 +g Group53781 +f 4335 2079 2086 4328 +g Group9683 +f 4327 8041 8042 4338 +g Group49187 +f 4339 8018 8043 4340 +g Group45497 +f 4319 4396 4374 1071 +g Group48277 +f 4342 7860 7901 4254 +g Group28515 +f 4343 2855 4193 4344 +g Group62229 +f 4345 4346 2048 2845 +g Group7876 +f 4347 4346 4345 4198 +g Group48021 +f 4258 8044 8045 7863 +g Group19139 +f 4320 4176 2791 4341 +g Group17967 +f 4350 4193 4194 4329 +f 4332 4199 4198 4345 +g Group30322 +f 4338 8042 8046 4348 +g Group7876 +f 4351 4344 4193 4350 +g Group62229 +f 2087 4351 4350 2843 +g Group28515 +f 4347 4198 2800 4352 +g Group51543 +f 4353 8031 8025 4342 +g Group40360 +f 74 4353 4342 4254 +g Group14054 +f 4355 4256 4257 4356 +g Group18422 +f 4352 2800 4294 4357 +g Group23884 +f 4359 1300 2530 4358 +g Group7239 +f 4343 2437 4317 4360 +g Group14054 +f 4359 4259 4264 4361 +g Group23884 +f 4354 2476 1274 4356 +g Group40360 +f 4349 4362 86 4268 +g Group40104 +f 4358 8038 8044 4258 +g Group17979 +f 4363 7898 7834 2577 +g Group36195 +f 4334 2410 4322 +g Group47378 +f 2411 4276 4275 +g Group36195 +f 4324 2413 4337 +g Group47378 +f 4278 2412 4277 +g Group15158 +f 4378 4801 4800 4365 +g Group45638 +f 4803 8006 4326 4804 +f 8043 4806 4807 4340 +g Group15158 +f 4366 4808 4809 4390 +g Group57208 +f 4323 7899 7843 1798 +g Group21971 +f 4357 4294 4256 4355 +g Group10788 +f 4360 4317 4244 4361 +g Group49258 +f 4367 4810 4765 2580 +g Group38756 +f 1356 4469 4523 4416 +g Group56751 +f 2580 4370 4369 4367 +g Group22010 +f 4372 4373 2031 4371 +g Group45497 +f 4327 4372 4371 4325 +g Group22010 +f 4374 2029 4284 4375 +g Group4460 +f 4377 4536 4525 2502 +g Group57948 +f 4368 8048 8047 2579 +g Group51003 +f 4754 7796 4811 +g Group19658 +f 1773 8020 8049 4378 +g Group9497 +f 4382 4538 4527 2566 +g Group38004 +f 4384 4339 4340 4383 +g Group64218 +f 4466 8050 8024 1802 +g Group18461 +f 4387 4545 4543 4291 +g Group56751 +f 4385 4388 4389 2588 +g Group14043 +f 2041 4471 4524 4465 +g Group19658 +f 4390 8051 8052 1771 +g Group51003 +f 4812 7799 4768 +g Group31706 +f 4380 4552 4539 2046 +g Group46509 +f 4392 8053 8012 4382 +g Group4460 +f 2566 4541 4554 4392 +g Group34455 +f 4393 4793 4804 4326 +g Group18461 +f 4284 4531 4564 4375 +g Group15158 +f 4395 4797 4807 4366 +g Group22010 +f 4387 4291 2031 4373 +g Group14517 +f 4371 2031 4280 4393 +g Group45497 +f 4384 4396 4319 4339 +g Group22010 +f 4374 4396 4384 2029 +g Group57207 +f 4394 1773 4378 +g Group23016 +f 4364 4802 4800 2583 +g Group57207 +f 4390 1771 4395 +g Group23016 +f 2577 4808 4805 4363 +g Group44911 +f 4398 4399 1369 4397 +g Group56340 +f 309 4398 4397 1092 +f 4400 4401 180 1078 +g Group44911 +f 4402 4401 4400 1357 +g Group57295 +f 4403 1368 2814 4404 +g Group12230 +f 4405 2817 1369 4399 +g Group53448 +f 4368 4810 4813 4530 +g Group6550 +f 2030 4408 4407 4406 +g Group26372 +f 4410 4397 1369 4409 +g Group37801 +f 1781 4410 4409 1782 +g Group5120 +f 4411 1801 4412 +g Group59227 +f 1357 2203 2202 +g Group37801 +f 4411 4413 1775 1801 +g Group26372 +f 4400 4413 4411 1357 +g Group5120 +f 4414 1782 4409 +g Group59227 +f 2204 1369 2161 +g Group38756 +f 4415 1356 4416 +g Group39415 +f 4370 4566 4535 4369 +g Group21238 +f 4417 7935 7936 2685 +g Group13370 +f 4419 7941 7948 2688 +g Group21876 +f 4420 2040 4421 +g Group33305 +f 2712 3713 3714 +g Group21876 +f 4423 2042 4422 +g Group33305 +f 3715 2716 3716 +g Group12230 +f 4402 1357 2867 4424 +g Group59227 +f 4425 2203 4412 +g Group17025 +f 4427 2069 4426 +g Group23763 +f 2711 7959 7954 2713 +g Group59227 +f 4414 2204 4428 +g Group17025 +f 4429 2072 4430 +g Group23763 +f 2714 7956 7961 2715 +g Group4298 +f 4431 2304 2203 4425 +g Group15727 +f 4432 2306 2178 4428 +g Group3188 +f 4415 8008 8035 4433 +g Group38756 +f 4434 1368 4403 +g Group39415 +f 4388 4550 4562 4389 +g Group23125 +f 4435 7846 7847 3632 +g Group15257 +f 4436 7851 7855 3634 +g Group23763 +f 4437 7974 7960 2711 +g Group19298 +f 4431 2303 3713 4438 +g Group23763 +f 2715 7962 7976 4439 +g Group7869 +f 4432 2305 3849 4440 +g Group65181 +f 4442 1355 2608 4441 +g Group20897 +f 4262 7903 7870 4443 +g Group13568 +f 4405 2818 2162 4445 +g Group16317 +f 4446 2836 3706 4447 +g Group51133 +f 4449 2022 2681 4448 +f 4451 2062 2690 4450 +g Group55639 +f 7871 7904 4453 4452 +g Group24175 +f 4445 2162 2340 4454 +g Group2139 +f 4424 2867 2866 4455 +g Group24175 +f 4446 2290 2213 4455 +g Group30324 +f 4449 2837 3826 4456 +g Group20897 +f 4442 7865 7905 4266 +g Group19510 +f 4458 4493 4479 3588 +g Group51133 +f 4448 2681 2084 4459 +f 4450 2690 2020 4460 +g Group65181 +f 4452 2708 1367 4443 +g Group26225 +f 4426 4781 3632 2089 +g Group37654 +f 4782 4785 2072 4429 +g Group60333 +f 4459 4502 4495 2851 +g Group55639 +f 4458 7906 7864 4441 +g Group33305 +f 4420 2712 4437 +f 4439 2716 4422 +f 4438 3713 4421 +f 4423 3715 4440 +g Group30324 +f 4447 3706 2835 4460 +g Group16317 +f 4456 3826 2859 4454 +g Group35848 +f 4261 8033 8032 2560 +g Group12980 +f 4444 4462 4461 4262 +g Group20897 +f 7893 7903 4262 +g Group47204 +f 4433 7895 7905 2812 +g Group12980 +f 4464 4457 4266 4463 +g Group35848 +f 2482 8037 8054 4255 +g Group14702 +f 4369 4567 4565 4367 +g Group6550 +f 4465 4466 4418 2041 +g Group7209 +f 4385 4767 4814 4568 +g Group25472 +f 4524 8056 8055 4465 +g Group52783 +f 4468 8074 8067 4114 +g Group53444 +f 4470 7937 7931 2607 +g Group28731 +f 4472 7939 7940 2687 +g Group59695 +f 4474 4475 3504 4473 +g Group34982 +f 2064 4474 4473 2085 +g Group44452 +f 4478 4547 4566 4370 +g Group29601 +f 4479 7963 7980 3588 +g Group30939 +f 4482 3593 3594 4481 +g Group5575 +f 4483 2624 3595 4484 +g Group55331 +f 4485 7848 7891 3587 +g Group30618 +f 4486 7849 7850 3633 +g Group3688 +f 4487 2622 4110 4488 +g Group36811 +f 4490 4289 4297 4489 +g Group30386 +f 4491 8111 8104 4187 +g Group6226 +f 4482 2062 4451 4493 +g Group41030 +f 4481 3594 3630 4494 +g Group4888 +f 4495 7979 7965 2851 +g Group6226 +f 4498 2084 2853 4497 +g Group5575 +f 4475 3505 2622 4487 +g Group34982 +f 4494 4499 2067 2065 +g Group59695 +f 4484 4499 4494 3630 +g Group33718 +f 4485 4500 2089 3632 +g Group58431 +f 4480 4500 4485 3587 +f 4501 4496 3500 4486 +g Group33718 +f 2090 4501 4486 3633 +g Group30939 +f 4498 3502 4453 4502 +g Group16317 +f 4497 2853 2085 4473 +g Group3688 +f 4468 4114 2624 4483 +g Group33644 +f 4503 4220 4492 +g Group8931 +f 4307 2795 4299 +g Group39434 +f 4504 8126 8066 2024 +g Group25372 +f 4505 8028 8040 4310 +g Group5673 +f 4508 8128 8110 1043 +g Group33644 +f 4509 4217 4510 +g Group8931 +f 2797 4315 4306 +g Group6579 +f 4511 4232 2013 4467 +g Group64198 +f 4476 4233 4232 4511 +g Group24338 +f 4491 4512 4240 1035 +g Group49051 +f 4507 4512 4491 4187 +g Group64198 +f 4513 4252 4241 4507 +g Group6579 +f 4504 2024 4252 4513 +g Group5499 +f 4514 7896 7900 4313 +g Group49051 +f 4515 4476 4209 4508 +g Group24338 +f 4234 4515 4508 1043 +g Group41948 +f 4286 4570 4561 4516 +g Group50085 +f 4518 8039 8003 4213 +g Group8931 +f 4503 4307 4288 4518 +g Group19664 +f 4519 4178 2481 4477 +g Group40303 +f 4520 4179 4178 4519 +f 4521 4210 4211 4514 +g Group19664 +f 4516 2559 4210 4521 +g Group61524 +f 4506 4180 4255 4522 +g Group8931 +f 4505 4310 4315 4510 +g Group30212 +f 4520 7902 7894 4179 +g Group14043 +f 4469 2030 4406 4523 +g Group61788 +f 4370 2580 4478 +g Group20965 +f 4370 4478 4478 +g Group38756 +f 4471 1368 4434 4524 +g Group20965 +f 4517 4389 4517 +g Group61788 +f 4517 2588 4389 +g Group60333 +f 4493 4451 2847 4479 +g Group19510 +f 4502 4453 3501 4495 +g Group50185 +f 4523 8058 8057 4416 +f 4434 8059 8056 4524 +g Group49367 +f 4526 2501 2502 4525 +g Group54404 +f 4528 2565 2566 4527 +g Group53448 +f 4529 4368 4530 +g Group64218 +f 4408 1774 4407 +g Group10968 +f 4531 4284 4283 4532 +g Group50185 +f 4416 8057 8009 4415 +g Group39415 +f 4535 4534 4533 4369 +g Group15899 +f 4529 8010 8048 4368 +g Group8219 +f 4538 8013 8052 4381 +g Group11077 +f 4540 1076 2046 4539 +g Group6040 +f 4542 1393 2070 4541 +g Group10968 +f 4544 4290 4291 4543 +g Group19739 +f 4546 4547 4478 4545 +g Group41948 +f 4292 4546 4545 4387 +g Group39415 +f 4549 4550 4388 4548 +g Group50185 +f 4403 8019 8059 4434 +g Group51546 +f 4552 8021 8047 4376 +g Group4460 +f 4554 8022 8053 4392 +g Group29616 +f 4540 4737 1076 +g Group7407 +f 2501 4556 4555 4540 +g Group2370 +f 4558 4542 2565 4557 +g Group27743 +f 2905 7908 7907 2906 +f 2882 7910 7909 2903 +g Group2370 +f 4526 4559 4556 2501 +g Group7407 +f 4528 4560 4557 2565 +g Group29616 +f 1070 4738 4528 +g Group34998 +f 2587 4753 4795 4537 +g Group10968 +f 4282 4796 4794 4283 +g Group1125 +f 4562 2559 4516 4561 +g Group34998 +f 4551 4799 4766 2579 +g Group10968 +f 4290 4798 4792 4280 +g Group26669 +f 4536 2045 4525 +g Group4460 +f 4377 2502 4376 +g Group31706 +f 4538 4381 2044 4527 +g Group53448 +f 4563 4386 4553 +g Group64218 +f 4466 1802 4418 +g Group61788 +f 4545 4478 2580 4543 +g Group9497 +f 4552 4376 2502 4539 +g Group26669 +f 4541 2070 4554 +g Group4460 +f 2566 4392 4382 +g Group61788 +f 4531 2588 4517 4564 +g Group17979 +f 4407 8061 8060 4406 +g Group61624 +f 4566 2481 4535 +f 4550 2559 4562 +g Group36911 +f 4567 8058 8060 4565 +g Group29418 +f 4814 8062 8055 4568 +g Group14702 +f 4569 4388 4385 4568 +g Group1125 +f 4547 4477 2481 4566 +g Group41948 +f 4564 4570 4286 4375 +g Group19739 +f 4561 4570 4564 4517 +g Group39415 +f 4567 4369 4533 +f 4548 4388 4569 +g Group30410 +f 7707 4866 4867 4699 +g Group52302 +f 4573 7709 7708 4574 +g Group24308 +f 4576 7828 7911 2499 +g Group52617 +f 4578 2375 4577 +g Group40856 +f 3438 2057 3437 +g Group52617 +f 4579 2381 4580 +g Group40856 +f 2059 3440 3439 +g Group11077 +f 1076 4687 4652 2046 +g Group29345 +f 4583 7802 7801 2535 +g Group42524 +f 4584 1308 4575 +g Group30763 +f 2377 2043 2433 +g Group42524 +f 4585 1310 4586 +g Group30763 +f 2060 2380 2436 +f 4584 2377 4587 +f 4588 2380 4586 +g Group37184 +f 4589 7781 7803 3564 +g Group19279 +f 4592 3571 3572 4591 +g Group49939 +f 4594 4818 4778 4593 +g Group11077 +f 2044 4677 4702 1070 +g Group17138 +f 2519 4820 4821 4595 +g Group64063 +f 4597 4823 4822 4598 +g Group63537 +f 4585 7840 7912 1310 +g Group52302 +f 4572 7707 7709 4573 +g Group56717 +f 7711 7710 4702 4593 +g Group19279 +f 4589 3564 3571 4592 +g Group59395 +f 4580 4632 4642 3440 +g Group64063 +f 4596 4819 4823 4597 +g Group2942 +f 4581 7712 7713 4816 +g Group50867 +f 4600 7715 7714 4599 +g Group12005 +f 4600 2942 4861 4838 +g Group56692 +f 7625 7624 1253 2519 +g Group35679 +f 4646 7717 7716 1269 +g Group56130 +f 3563 4962 4963 4644 +g Group49300 +f 2447 4648 4647 4590 +g Group35679 +f 1253 7718 7719 4649 +g Group56692 +f 1269 7626 7622 2473 +g Group12005 +f 4849 4862 2955 4607 +g Group25128 +f 4595 7627 7625 2519 +g Group40856 +f 4577 4608 2377 2057 +f 2377 4608 4587 +g Group52617 +f 4609 4588 2381 4579 +g Group40856 +f 4609 2380 4588 +g Group48945 +f 4610 7791 7804 2889 +g Group31040 +f 4613 2352 2891 4612 +f 4610 2889 2352 4613 +g Group5620 +f 4578 4640 4628 2375 +g Group49300 +f 4611 4650 4645 2351 +g Group37539 +f 4611 4951 4964 4650 +g Group35324 +f 4616 7743 7805 2888 +g Group17419 +f 4617 1270 2890 4618 +g Group1055 +f 4619 7806 7807 3536 +g Group48686 +f 4622 3542 3543 4621 +g Group13207 +f 4928 7782 7808 7721 +g Group60744 +f 4625 7723 7722 4626 +g Group17419 +f 4616 2888 1270 4617 +g Group13113 +f 4627 7698 7694 4618 +g Group35324 +f 2890 7706 7700 4627 +g Group48686 +f 4619 3536 3542 4622 +g Group61701 +f 2932 4672 4686 2374 +g Group1055 +f 4630 4629 4621 3543 +g Group60744 +f 4624 7720 7723 4625 +g Group48945 +f 4631 2934 4591 4632 +g Group35324 +f 4633 7705 7702 2894 +g Group38852 +f 4631 7703 7722 2934 +g Group20001 +f 4634 4635 3535 4620 +g Group15111 +f 2996 4690 4671 2349 +g Group23266 +f 4636 7794 7809 4703 +g Group5361 +f 4639 4706 4705 4638 +g Group37184 +f 4630 3543 4612 4640 +g Group5361 +f 4636 4703 4706 4639 +g Group1055 +f 4641 4642 3572 4638 +g Group61701 +f 2379 4695 4705 2928 +g Group15111 +f 2445 4704 4696 2992 +g Group20001 +f 4644 4643 4637 3563 +g Group37184 +f 4632 4591 3572 4642 +g Group39207 +f 4645 7724 7725 2351 +g Group61418 +f 7717 7726 4603 4604 +g Group59750 +f 4605 4948 4963 4647 +g Group5975 +f 4648 4606 4605 4647 +g Group61418 +f 4606 7728 7719 4602 +g Group39207 +f 2447 7729 7727 4648 +g Group48945 +f 4640 4612 2891 4628 +g Group5975 +f 4650 4614 4603 4645 +g Group12805 +f 4692 4959 4964 4635 +g Group11077 +f 4651 2046 4652 +g Group17584 +f 2536 7810 7802 4583 +g Group33176 +f 4654 7913 7827 2500 +g Group61485 +f 4655 2057 2433 4656 +g Group43162 +f 4658 7750 7789 2376 +g Group4727 +f 4659 4658 4657 3485 +f 4661 4662 3487 4660 +g Group43162 +f 2378 7790 7752 4661 +g Group51392 +f 4663 2060 2436 4664 +g Group31706 +f 4651 4665 4380 2046 +g Group12568 +f 4747 7812 7811 4666 +g Group40856 +f 4667 2057 4655 +g Group53646 +f 3484 2056 3495 +g Group40856 +f 4668 2059 4669 +g Group53646 +f 2058 3486 3497 +g Group23266 +f 4670 7772 7806 4619 +g Group5361 +f 4673 4622 4621 4672 +g Group4727 +f 4674 3437 3485 4657 +f 4660 3487 3439 4675 +g Group51392 +f 4656 2433 2043 4653 +g Group61485 +f 4664 2436 2059 4668 +g Group11077 +f 4677 2044 4676 +g Group17584 +f 4576 7814 7813 2500 +g Group30410 +f 4869 7730 4678 4827 +g Group12505 +f 4681 7732 7731 4680 +g Group58807 +f 4682 4769 4761 4676 +g Group31706 +f 4381 4682 4676 2044 +g Group6869 +f 4663 7914 7839 2060 +g Group5361 +f 4670 4619 4622 4673 +g Group61701 +f 4685 2374 4686 +g Group23266 +f 3438 4629 4630 +g Group12505 +f 4678 7730 7732 4681 +g Group56717 +f 4687 7733 7712 4581 +g Group43274 +f 2941 7614 7628 4689 +g Group4839 +f 7629 7735 4689 7628 +g Group42212 +f 4690 4691 4635 4634 +g Group15111 +f 3547 4691 4690 2996 +g Group42212 +f 4692 4635 4691 +g Group39106 +f 7737 7736 4848 4607 +g Group43274 +f 4693 7631 7632 2945 +g Group43162 +f 4674 2374 4685 +f 4694 2379 4675 +g Group13755 +f 4667 7755 7749 4659 +f 4662 7751 7756 4669 +g Group61701 +f 4695 2379 4694 +g Group23266 +f 4641 3440 4642 +g Group15111 +f 4696 4697 3576 2992 +g Group42212 +f 4644 4697 4696 4643 +g Group15111 +f 4698 3576 4697 +g Group38213 +f 4684 7815 7811 2536 +g Group31706 +f 4811 8063 8049 4379 +g Group38213 +f 2500 7817 7816 4654 +g Group31706 +f 4391 8051 8064 4812 +g Group3309 +f 4699 4867 4872 2875 +g Group50940 +f 4701 154 2879 4700 +g Group38178 +f 4687 4581 4582 4652 +f 4677 4594 4593 4702 +g Group50940 +f 4699 2875 154 4701 +g Group29616 +f 4702 7915 7916 1070 +g Group23266 +f 4672 4621 4629 4686 +g Group42212 +f 4690 4634 4620 4671 +g Group61701 +f 4703 7809 7760 2927 +g Group43796 +f 4706 2446 2928 4705 +f 4703 2927 2446 4706 +g Group23266 +f 4695 4641 4638 4705 +g Group42212 +f 4704 4637 4643 4696 +g Group51240 +f 4698 4948 3576 +f 3547 4959 4692 +g Group34578 +f 4708 4965 4966 4828 +g Group32780 +f 2878 4874 4875 4707 +g Group50940 +f 4710 179 2881 4711 +g Group59012 +f 4712 7680 7681 4876 +g Group2198 +f 4715 4879 4878 4714 +g Group34879 +f 4715 7682 7683 4879 +g Group32780 +f 4716 4880 4876 2897 +g Group34578 +f 4872 4968 4967 4717 +g Group14875 +f 4718 2550 2906 4719 +g Group2198 +f 4720 4882 4877 4713 +g Group4085 +f 4721 4883 4882 4720 +g Group59447 +f 2723 4853 4884 4775 +g Group15109 +f 7654 7685 3650 4723 +g Group50940 +f 4707 2877 179 4710 +g Group3309 +f 2881 7917 7872 4711 +g Group59087 +f 4556 7910 7873 4555 +g Group39267 +f 4726 7983 7966 2626 +g Group54050 +f 4558 7908 7886 4728 +f 4727 7878 7909 4559 +g Group14875 +f 4716 2897 2550 4718 +g Group3309 +f 4719 7884 7918 2879 +g Group59087 +f 4560 7885 7907 4557 +g Group56512 +f 4722 7686 7684 4724 +g Group57434 +f 4728 7984 7969 1393 +g Group62485 +f 4723 7919 7887 2938 +g Group33014 +f 3650 7981 7920 +g Group52311 +f 3585 7672 7687 4779 +g Group38352 +f 4733 4886 4878 2902 +g Group44580 +f 4734 7668 7642 2904 +g Group20447 +f 4733 2902 2604 4735 +g Group33014 +f 7922 7985 3598 +g Group62485 +f 2904 7877 7921 4734 +g Group29616 +f 4555 4725 4737 4540 +f 4725 7917 7882 1076 +f 1070 7916 7918 4729 +f 4729 4560 4528 4738 +g Group16432 +f 4739 4969 4970 4572 +g Group35729 +f 7786 7819 4969 4739 +g Group34578 +f 4709 4971 4972 4708 +g Group64063 +f 4745 4573 4574 4744 +g Group57475 +f 4746 7810 7812 4747 +g Group38178 +f 4582 4651 4652 +g Group29541 +f 4748 7641 7680 4712 +g Group38263 +f 4751 4715 4714 4750 +g Group34998 +f 4753 2587 4752 +g Group54295 +f 4532 2588 4531 +g Group51003 +f 4755 4666 4754 +g Group31706 +f 4665 4379 4380 +g Group25715 +f 4757 3489 3488 4756 +f 4759 3490 3491 4758 +g Group5408 +f 4751 7648 7682 4715 +g Group57475 +f 4761 7820 7813 4760 +g Group38178 +f 4676 4594 4677 +g Group35284 +f 4762 1126 4679 4763 +g Group34578 +f 4974 4973 4712 4717 +g Group34998 +f 4765 2579 4766 +g Group54295 +f 2580 4544 4543 +g Group29961 +f 4752 2587 4386 4767 +g Group51003 +f 4768 4683 4769 +g Group31706 +f 4391 4682 4381 +g Group16182 +f 4770 4771 2605 3585 +g Group62421 +f 4772 4771 4770 3586 +g Group44516 +f 4774 3597 3598 4773 +g Group38263 +f 4775 4720 4713 4749 +g Group52311 +f 4777 3642 4776 +g Group8881 +f 4831 7652 7686 4722 +g Group64063 +f 4739 4572 4573 4745 +g Group2942 +f 4778 7697 7711 4593 +g Group44516 +f 4772 3586 3597 4774 +g Group44254 +f 4757 7977 7985 3489 +g Group52311 +f 4770 3585 4779 +g Group40150 +f 4886 4888 4854 4732 +g Group18357 +f 4781 4780 3631 4435 +g Group6928 +f 4782 4436 4782 +g Group26225 +f 4782 3633 4436 +g Group45012 +f 4783 2068 4756 +g Group105 +f 4780 2069 2068 4784 +f 4786 2071 2072 4785 +g Group45012 +f 4759 2071 4787 +f 4784 2068 4783 +f 4787 2071 4786 +g Group62421 +f 4788 4789 3643 4776 +g Group16182 +f 2725 4788 4776 3642 +g Group63813 +f 4791 2726 2930 4790 +f 4789 2929 2726 4791 +g Group16182 +f 7951 7986 2930 2705 +g Group57207 +f 4792 1773 4394 4793 +f 4794 1771 4537 4795 +g Group10968 +f 4796 4282 4383 4797 +f 4798 4290 4544 4799 +g Group23016 +f 4801 2583 4800 +g Group15158 +f 4378 4365 4394 +g Group26341 +f 4803 4804 4365 4802 +g Group34199 +f 4281 4803 4802 4364 +f 4363 4805 4806 4274 +g Group26341 +f 4807 4806 4805 4366 +g Group23016 +f 4808 2577 4809 +g Group15158 +f 4366 4390 4395 +g Group29961 +f 4810 4368 2579 4765 +g Group31706 +f 4811 4379 4754 +g Group11112 +f 4684 7785 7797 7795 +g Group31706 +f 4768 4391 4812 +g Group11112 +f 7798 7800 7745 4654 +g Group15158 +f 4793 4394 4365 4804 +g Group34455 +f 4797 4383 4340 4807 +g Group15158 +f 4802 4365 4800 +f 4808 4366 4805 +g Group7209 +f 4810 4367 4565 4813 +g Group26225 +f 4435 3632 4781 +g Group6928 +f 4435 4781 4781 +g Group18357 +f 4785 4782 4436 3634 +g Group53448 +f 4767 4386 4563 4814 +g Group34998 +f 4753 4532 4795 +g Group57207 +f 4796 1771 4794 +g Group34998 +f 4799 4544 4766 +g Group57207 +f 4798 1773 4792 +g Group10121 +f 4813 8061 8004 4530 +f 4563 8050 8062 4814 +g Group62385 +f 4815 4865 4870 4688 +g Group49939 +f 4817 4582 4581 4816 +g Group3700 +f 4818 7814 7787 4778 +g Group35729 +f 4975 7822 7823 4819 +g Group16432 +f 4596 4976 4975 4819 +g Group17824 +f 4823 7825 7824 4822 +f 4819 7823 7825 4823 +g Group47884 +f 2535 7801 7826 7701 +g Group38178 +f 4746 4582 4817 +g Group58807 +f 4755 4665 4651 4747 +g Group38178 +f 4818 4594 4760 +g Group5377 +f 4821 4868 4871 4595 +g Group12568 +f 4683 7817 7820 4761 +g Group51003 +f 4811 2583 4801 8063 +f 4812 8064 4809 2577 +g Group35284 +f 4815 4688 1122 4824 +f 4743 1126 4762 +g Group3309 +f 4707 4875 4873 2877 +g Group35284 +f 4824 1122 4764 +g Group3309 +f 2875 4881 4880 4716 +g Group40150 +f 4775 4884 4832 4721 +f 4732 4855 4885 4750 +g Group42695 +f 4826 7512 7550 3926 +g Group34578 +f 4828 4966 4977 4827 +g Group11426 +f 4830 7545 7521 3929 +g Group40150 +f 4831 4721 4832 +g Group33014 +f 3643 4777 4776 +g Group51154 +f 4834 7655 7688 3958 +g Group13133 +f 4835 5082 5081 3961 +g Group20769 +f 4836 4901 4896 2940 +g Group12005 +f 4839 4600 4838 +g Group5093 +f 4840 4944 4978 4903 +g Group56 +f 4842 7551 7568 4905 +g Group33611 +f 4899 3978 5084 5085 +g Group47378 +f 4845 5024 5040 4907 +g Group20769 +f 2951 4893 4909 4847 +g Group13133 +f 3963 5087 5086 4846 +g Group12005 +f 4849 4607 4848 +g Group52038 +f 4837 4949 4979 4902 +g Group33611 +f 5089 4003 4900 5090 +g Group9748 +f 4851 2739 4003 4852 +g Group7233 +f 4833 7657 7689 4853 +g Group40150 +f 4855 4732 4854 +g Group33014 +f 4779 3586 4770 +g Group19885 +f 3956 7690 7673 3602 +g Group44015 +f 4858 3601 4001 4859 +g Group38502 +f 7634 4860 4856 +g Group39510 +f 4861 4826 3926 2941 +g Group8241 +f 4862 4830 3929 2955 +g Group54339 +f 4834 3958 2739 4851 +g Group16318 +f 4835 3961 1119 4825 +g Group50585 +f 4846 3967 2537 4829 +g Group6563 +f 4852 7635 4850 4863 +g Group40830 +f 3652 4863 4850 3001 +g Group23070 +f 4857 3956 3601 4858 +g Group40830 +f 4844 4864 3600 2970 +g Group6563 +f 4844 7636 4859 4864 +g Group51616 +f 4741 4865 4980 4970 +g Group43088 +f 4865 4815 4981 4980 +g Group43274 +f 2941 4838 4861 +g Group12005 +f 2942 4600 4599 2942 +g Group43274 +f 4862 4849 2945 +g Group12005 +f 4607 2955 4601 +g Group43088 +f 4763 4868 4982 4977 +g Group51616 +f 4868 4821 4976 4982 +g Group39106 +f 7734 7715 4600 4839 +g Group4839 +f 4848 7736 7631 4693 +g Group34578 +f 4867 4981 4968 4872 +g Group3309 +f 4828 2877 4873 +g Group15987 +f 4762 4965 4972 4743 +g Group64049 +f 4874 4709 4708 4875 +g Group27743 +f 4876 7681 7658 2897 +g Group36465 +f 4879 2901 2902 4878 +g Group3610 +f 4879 7683 7659 2901 +g Group64049 +f 4880 4717 4712 4876 +g Group3309 +f 4881 2875 4872 +g Group15987 +f 4764 4974 4967 4824 +g Group36465 +f 4882 2937 2896 4877 +g Group38352 +f 4883 4722 2937 4882 +g Group28178 +f 4853 7689 7691 4884 +g Group59447 +f 4860 2603 4750 4885 +g Group4085 +f 4886 4732 4714 4878 +g Group40150 +f 4887 4883 4721 4831 +g Group8881 +f 4887 4722 4883 +f 4733 7671 7664 4854 +f 4733 4888 4886 +g Group5377 +f 4865 4741 4571 4870 +g Group62385 +f 4868 4763 4679 4871 +g Group34578 +f 4875 4708 4873 +f 4881 4717 4880 +g Group8881 +f 4884 7691 7651 4832 +g Group40150 +f 4775 4721 4720 +g Group8881 +f 4855 7665 7687 4885 +g Group40150 +f 4732 4750 4714 +g Group23568 +f 4889 1397 3937 4890 +g Group15851 +f 4891 2739 3958 4892 +g Group15732 +f 2951 2950 4893 +g Group14 +f 4895 7611 7633 2972 +g Group7731 +f 2971 4895 4894 +g Group34646 +f 5091 3960 7621 7637 +g Group7731 +f 4898 2965 4897 +g Group14 +f 3002 7617 7616 4898 +g Group8241 +f 2942 3925 4826 4861 +g Group32088 +f 2954 7606 7598 3930 +g Group61786 +f 4894 7676 7678 2971 +g Group3204 +f 2942 3925 3925 2942 +g Group12666 +f 3958 7688 7679 4892 +g Group44513 +f 4899 3979 1397 4889 +g Group36796 +f 4900 4003 2739 4891 +g Group52038 +f 4901 4836 4837 4902 +g Group28486 +f 4901 5082 5091 4896 +g Group31724 +f 3962 5092 5093 4960 +g Group12816 +f 5095 5037 7563 7569 +g Group14697 +f 4908 5083 5055 4845 +g Group41328 +f 4899 5085 5096 3979 +g Group8473 +f 3979 5096 5097 5038 +g Group28486 +f 4893 5053 5086 4909 +g Group52038 +f 4904 4841 4847 4909 +g Group13133 +f 3961 5081 5098 4961 +g Group22414 +f 4910 5090 5099 4906 +g Group14697 +f 4843 5060 5088 4910 +g Group8241 +f 2955 3929 3929 2955 +g Group19722 +f 2942 2942 2942 +g Group35284 +f 4911 1126 4743 4912 +g Group32250 +f 7465 7464 2939 2940 +g Group50841 +f 4915 5332 5331 82 +g Group32250 +f 5287 5333 2943 4917 +g Group42695 +f 4919 7514 7546 3928 +g Group30692 +f 4921 7784 7821 4920 +g Group34413 +f 4923 7693 7725 4615 +g Group14600 +f 4925 7467 7466 4924 +g Group56263 +f 2957 7468 7469 5118 +g Group4709 +f 4928 2447 4590 4929 +g Group56624 +f 4921 1253 4623 4930 +g Group19411 +f 7471 7570 7564 4931 +g Group820 +f 2997 7472 7471 4931 +g Group6200 +f 2950 7467 7473 5056 +g Group21168 +f 4934 2998 3953 4935 +g Group30692 +f 4937 7818 7805 4936 +g Group14600 +f 4913 7465 7474 4927 +g Group32250 +f 2943 7475 7466 2951 +g Group53875 +f 4938 2549 4748 4939 +g Group32250 +f 2939 5335 5296 4941 +g Group50841 +f 34 5336 5334 4914 +g Group61286 +f 4943 7549 7531 3934 +g Group20769 +f 4917 2943 4841 4944 +g Group43274 +f 4911 7603 7632 1126 +g Group59169 +f 4946 2467 3998 4947 +g Group51240 +f 4934 3576 4948 +g Group32649 +f 2998 4605 4606 +g Group39360 +f 4941 2961 4842 4949 +g Group61865 +f 4938 7615 7608 2549 +g Group11539 +f 4952 7792 7807 3535 +g Group58484 +f 4952 4951 4611 +g Group820 +f 4953 7476 7468 2957 +g Group19411 +f 4953 7571 7572 7476 +g Group39759 +f 4955 3547 3952 4956 +g Group12224 +f 4957 7574 7573 4958 +g Group51240 +f 4959 3547 4955 +g Group32649 +f 4614 2959 4603 +g Group39510 +f 4919 3928 2945 4945 +g Group38224 +f 4946 7561 7575 2467 +g Group58101 +f 4943 3934 2966 4950 +g Group16318 +f 4960 3963 1123 4918 +g Group54875 +f 4931 5135 5137 2997 +g Group34909 +f 4961 3973 2567 4942 +g Group42944 +f 3952 7576 7567 4956 +g Group59595 +f 3545 7571 7577 5133 +g Group58484 +f 4929 4590 4962 +g Group11539 +f 3563 7793 7803 4929 +g Group37539 +f 4962 4590 4647 4963 +g Group4709 +f 4952 4611 2351 4922 +g Group56130 +f 4951 3535 4635 4964 +g Group56624 +f 4923 4615 1269 4936 +g Group60152 +f 4928 7721 7729 2447 +g Group12805 +f 4948 4698 4644 4963 +g Group59750 +f 4959 4614 4650 4964 +g Group15987 +f 4965 4762 4966 +g Group34578 +f 4708 4828 4873 +g Group15987 +f 4968 4824 4967 +g Group34578 +f 4872 4717 4881 +g Group63377 +f 4969 4740 4741 4970 +g Group17138 +f 4937 2473 4740 4969 +g Group34578 +f 4912 4971 4709 4742 +g Group15987 +f 4972 4971 4912 4743 +f 4973 4974 4764 4939 +g Group34578 +f 4712 4973 4939 4748 +g Group17138 +f 4975 4820 2519 4920 +g Group63377 +f 4976 4821 4820 4975 +g Group15987 +f 4966 4762 4763 4977 +g Group52038 +f 4944 4841 4904 4978 +g Group5093 +f 4949 4842 4905 4979 +g Group4671 +f 4970 4980 4866 4572 +g Group61679 +f 4980 4981 4867 4866 +f 4977 4982 4869 4827 +g Group4671 +f 4982 4976 4596 4869 +g Group15987 +f 4981 4815 4824 4968 +g Group34578 +f 4965 4708 4972 +f 4974 4717 4967 +g Group13133 +f 4960 5093 5087 3963 +g Group31724 +f 4961 5098 5094 3973 +g Group29640 +f 4983 2503 4825 4984 +g Group13964 +f 4985 2504 4918 4986 +g Group43164 +f 4988 7516 7578 5100 +g Group53487 +f 4990 7638 7619 1312 +g Group2157 +f 4991 5103 5102 4992 +g Group28131 +f 4994 7523 7566 2383 +g Group32474 +f 4995 4994 4993 1314 +g Group430 +f 4996 1364 3024 4997 +g Group27590 +f 4999 5289 5302 2960 +g Group60592 +f 5001 7529 7562 5000 +g Group56249 +f 3935 5001 5000 1395 +g Group23841 +f 5003 7579 7429 +g Group62241 +f 5005 5141 5140 5006 +g Group32474 +f 5008 4990 1312 5007 +g Group28131 +f 2467 7575 7538 5008 +g Group4773 +f 5009 7580 7581 5010 +g Group16886 +f 4983 7639 7620 2503 +g Group45804 +f 2944 7582 7583 5286 +g Group56249 +f 5013 5014 3937 1397 +g Group8927 +f 4985 7541 7584 2504 +g Group60909 +f 5015 1123 4829 5016 +f 5017 1119 4942 5018 +g Group50234 +f 5020 5105 5058 3972 +g Group16109 +f 4999 2960 4843 5021 +g Group45891 +f 5023 5143 5137 3998 +g Group20452 +f 5012 7582 7585 5024 +g Group43357 +f 2485 7169 7170 5152 +g Group53339 +f 2491 7171 7172 5284 +g Group2157 +f 4988 5100 5103 4991 +g Group36535 +f 4987 7478 7479 5101 +g Group43696 +f 5146 7480 7481 7378 +g Group38320 +f 7173 7408 2527 7174 +g Group20557 +f 4998 5179 5187 1363 +g Group48302 +f 7177 7176 4996 2557 +g Group24079 +f 3032 7178 7179 5319 +g Group62241 +f 5004 5138 5141 5005 +g Group43696 +f 7380 7483 7482 5149 +g Group46556 +f 1295 7484 7485 5046 +g Group38771 +f 2492 7586 7587 5174 +g Group38320 +f 7415 7180 7169 2485 +g Group50992 +f 3035 7181 7182 5315 +g Group48302 +f 5009 7184 7171 2491 +g Group60372 +f 1168 7185 7186 5235 +f 1140 7187 7188 5294 +g Group53419 +f 5020 3972 1314 4993 +g Group11658 +f 5037 3974 1395 5000 +g Group49076 +f 5023 3998 2467 5007 +g Group16001 +f 5038 7588 7584 5013 +g Group60909 +f 4984 4825 1119 5017 +g Group29640 +f 5016 4829 2537 4989 +g Group47378 +f 5021 4843 4906 5039 +g Group51721 +f 5024 7585 7589 5040 +g Group8473 +f 5037 5095 5099 3974 +g Group26687 +f 5092 3962 7588 7590 +g Group60909 +f 4986 4918 1123 5015 +g Group61715 +f 5019 7469 7486 5104 +g Group56263 +f 5142 7487 5006 +g Group13964 +f 5018 4942 2567 5002 +g Group33285 +f 5201 5228 3029 5042 +g Group60445 +f 5044 5291 5292 2969 +g Group43164 +f 5045 7535 7579 5004 +g Group2157 +f 5048 5005 5006 5047 +g Group23264 +f 5050 5213 5214 3065 +g Group50424 +f 5052 5303 5304 3001 +g Group15732 +f 5054 7605 4893 2950 +g Group48964 +f 5044 2969 4845 5055 +g Group60255 +f 5057 5054 2950 5056 +g Group50234 +f 5023 5057 5056 5022 +g Group5711 +f 5059 3972 5058 +g Group15732 +f 4896 2956 2940 +g Group38943 +f 5052 3001 4850 5060 +g Group44805 +f 5150 7430 7418 5062 +g Group53412 +f 5043 5181 5182 1377 +g Group25451 +f 5041 5313 5337 5227 +g Group2157 +f 5045 5004 5005 5048 +g Group44805 +f 5065 7422 7431 5151 +g Group43391 +f 5051 5188 5190 2732 +g Group15430 +f 5049 5338 5321 2731 +g Group40860 +f 3008 5476 5477 5176 +g Group53645 +f 5070 3009 3010 5069 +g Group41723 +f 5061 5478 5479 3018 +g Group26702 +f 5423 7382 7383 5473 +g Group2342 +f 5073 7189 7190 5481 +g Group48608 +f 5075 7191 7178 3032 +g Group49322 +f 3090 5252 5259 5230 +g Group42840 +f 3035 5229 5231 5077 +g Group63757 +f 5079 7384 7385 5483 +g Group41723 +f 3022 5482 5484 5064 +g Group29255 +f 5072 7192 7193 5479 +g Group9985 +f 5077 7194 7181 3035 +g Group53645 +f 7328 7321 3009 5070 +f 5075 3032 3007 5068 +g Group42840 +f 5076 5232 5221 3031 +g Group32819 +f 5076 5249 5260 5232 +g Group59755 +f 5082 4901 4902 5081 +g Group4676 +f 5084 7636 4844 5083 +g Group14697 +f 4908 5085 5084 5083 +g Group59755 +f 5087 4904 4909 5086 +g Group14697 +f 5088 5089 5090 4910 +g Group4676 +f 7635 5089 5088 4850 +g Group15732 +f 5091 7637 5059 4896 +g Group47400 +f 5082 4835 3960 5091 +g Group12810 +f 5092 4903 4978 5093 +g Group59438 +f 5039 5095 7569 7568 +g Group4676 +f 5083 4844 5055 +g Group14697 +f 4908 4845 4907 +g Group22414 +f 5085 4908 4907 5096 +g Group55095 +f 5096 4907 5040 5097 +g Group47400 +f 5053 3967 4846 5086 +g Group59755 +f 5081 4902 4979 5098 +g Group41328 +f 5090 4900 3974 5099 +g Group4676 +f 5060 4850 5088 +g Group14697 +f 4843 4910 4906 +g Group61715 +f 5056 7473 7487 5022 +g Group59755 +f 5093 4978 4904 5087 +g Group12810 +f 5098 4979 4905 5094 +g Group53185 +f 5100 7578 7539 3011 +g Group12178 +f 5103 1282 4927 5102 +g Group50234 +f 5104 5105 5020 5019 +g Group60255 +f 5058 5105 5104 2956 +g Group12178 +f 5100 3011 1282 5103 +g Group46556 +f 5101 7479 7488 1281 +g Group36535 +f 5046 7485 7489 5003 +g Group55095 +f 5095 5039 4906 5099 +g Group7773 +f 4903 5092 7590 7589 +g Group6200 +f 5104 7486 7474 2956 +g Group23841 +f 5107 7516 7407 +g Group62241 +f 5109 4991 4992 5108 +g Group1434 +f 5110 2319 3040 5111 +g Group25963 +f 5112 2320 2973 5113 +g Group325 +f 5114 2359 3059 5115 +g Group24854 +f 5116 2360 2995 5117 +g Group44782 +f 5119 5120 2957 5118 +g Group45891 +f 5020 5119 5118 5019 +g Group13373 +f 5121 5122 2991 5113 +g Group14482 +f 3980 5121 5113 2973 +f 5117 5123 3995 2987 +g Group13373 +f 5124 5123 5117 2995 +g Group62241 +f 5106 4988 4991 5109 +g Group25963 +f 5111 3040 2320 5112 +g Group44963 +f 5110 5125 3043 2319 +g Group43854 +f 5126 5125 5110 2457 +g Group24854 +f 5115 3059 2360 5116 +g Group43854 +f 5127 5128 2359 5114 +g Group44963 +f 3052 5127 5114 2223 +g Group55056 +f 5128 3060 3667 5129 +g Group25649 +f 5131 7368 7372 3668 +f 3667 7386 7375 5129 +g Group55056 +f 5131 3668 3056 5126 +g Group23466 +f 5124 2995 3545 5133 +g Group9039 +f 5135 7565 7552 4947 +g Group55984 +f 5120 3971 4958 5136 +g Group23466 +f 5134 3574 2991 5122 +g Group56263 +f 5019 7469 5108 +g Group55984 +f 5135 4947 3998 5137 +g Group60704 +f 5133 7577 7573 3997 +g Group37712 +f 5138 7579 7534 3061 +g Group62241 +f 5141 2460 4933 5140 +g Group45891 +f 5142 5143 5023 5022 +g Group44782 +f 5137 5143 5142 2997 +g Group7750 +f 5132 7433 7432 5144 +g Group43696 +f 5029 7478 5145 +g Group31083 +f 2361 7490 7478 5107 +g Group43696 +f 5146 5029 5145 +g Group6641 +f 5144 7378 7377 5132 +g Group62241 +f 5138 3061 2460 5141 +g Group7750 +f 5147 7435 7434 5130 +g Group43696 +f 7489 5035 5148 7489 +g Group31083 +f 5139 7489 7491 2459 +g Group43696 +f 5148 5035 5149 +g Group6641 +f 5130 7370 7380 5147 +g Group56263 +f 5142 7487 7472 2997 +g Group44805 +f 5146 5150 5062 5029 +g Group7750 +f 5144 7432 7436 7388 +g Group43696 +f 5146 7389 7388 5150 +g Group44805 +f 7431 7437 7391 +f 5151 5149 5035 5065 +g Group6641 +f 7381 7392 7391 5147 +g Group34604 +f 5153 7509 7591 7492 +g Group41368 +f 5155 5441 5485 5154 +g Group20463 +f 2505 5155 5154 3067 +g Group51341 +f 5158 3070 3069 5157 +g Group46304 +f 5159 5369 5406 3087 +g Group6086 +f 5161 5202 5230 3089 +g Group24594 +f 5162 7146 7155 3090 +g Group13699 +f 5164 7592 7593 3017 +g Group20463 +f 5165 5166 2538 3078 +g Group51341 +f 5158 7237 7256 3070 +f 5159 3087 3068 5156 +g Group41654 +f 3646 5215 5168 +g Group57449 +f 5160 5216 5233 3088 +g Group7973 +f 5170 5171 3143 5169 +g Group38431 +f 2741 3657 5219 5218 +g Group7973 +f 5170 3658 5171 +g Group38228 +f 5153 5172 2486 3004 +g Group6210 +f 5173 7452 7494 5263 +g Group43808 +f 5174 5339 5331 2492 +g Group45619 +f 5177 5176 5265 5264 +g Group45805 +f 5179 7555 7594 5266 +g Group64296 +f 5180 5268 5267 5181 +g Group41462 +f 5182 5270 5269 5183 +g Group6210 +f 5271 7495 7456 5175 +g Group38228 +f 2528 5184 5164 3017 +g Group24714 +f 5186 5185 3023 5031 +g Group50841 +f 5173 5340 5336 34 +g Group8781 +f 5187 5273 5272 5188 +g Group647 +f 5275 5274 5189 5190 +g Group45278 +f 3651 5189 5167 3646 +g Group40853 +f 3645 5328 5191 +g Group1186 +f 5485 7329 7330 7278 +g Group62894 +f 5193 5424 5401 5073 +g Group65382 +f 5171 3658 3670 5191 +g Group25151 +f 3030 5278 5279 5200 +g Group38431 +f 3605 2630 5204 5208 +g Group7973 +f 5197 5196 5161 3089 +f 3606 5196 5197 +g Group45278 +f 5194 5198 3599 3592 +g Group647 +f 5198 5280 5268 5180 +g Group33820 +f 5195 5327 5341 5281 +g Group65382 +f 5197 5283 5282 5199 +g Group11339 +f 5262 7493 7496 7195 +g Group41462 +f 5179 5266 5273 5187 +g Group59676 +f 5174 7587 7595 5238 +g Group43357 +f 5163 7196 7174 2527 +g Group8781 +f 5181 5267 5270 5182 +g Group64296 +f 5188 5272 5275 5190 +g Group61765 +f 5176 5477 5488 5265 +g Group40860 +f 5185 5489 5481 3023 +g Group37437 +f 5200 2613 5041 5201 +g Group36544 +f 5202 5360 5353 5162 +g Group50717 +f 5161 5361 5360 5202 +g Group57189 +f 5205 5206 3063 2615 +g Group64329 +f 5207 5298 5342 3591 +g Group2302 +f 5208 5209 2631 3605 +g Group16475 +f 5210 5209 5208 3606 +g Group33285 +f 5211 5212 3024 1364 +g Group47458 +f 5213 5212 5211 5049 +g Group55827 +f 5215 5237 5244 5168 +g Group50717 +f 5216 5362 5363 5169 +g Group36544 +f 5160 5348 5362 5216 +g Group49355 +f 5220 5343 5342 5205 +g Group25451 +f 5211 5320 5338 5049 +g Group8348 +f 5210 3606 3669 5220 +g Group5826 +f 5223 5324 5330 5222 +g Group57189 +f 3057 5223 5222 2733 +g Group16475 +f 5224 5225 3658 5219 +g Group2302 +f 2742 5224 5219 3657 +g Group35182 +f 5226 3058 2733 5222 +g Group59711 +f 5225 3135 3058 5226 +g Group47458 +f 5228 5201 5041 5227 +g Group33285 +f 3029 5228 5227 1378 +g Group37437 +f 5213 5049 2731 5214 +g Group11278 +f 5227 5337 5314 1378 +g Group63495 +f 5230 5259 5251 3089 +g Group57013 +f 5229 5063 5078 5231 +f 5232 5080 5066 5221 +g Group46992 +f 5232 5260 5257 5080 +g Group57449 +f 5202 5162 3090 5230 +g Group6086 +f 5216 5169 3143 5233 +g Group52604 +f 5363 5219 5170 5169 +g Group39324 +f 5200 5279 5281 2613 +g Group52604 +f 5361 5196 5208 5204 +g Group47217 +f 5234 7544 7596 7497 +g Group25151 +f 5236 3065 5214 5237 +g Group64713 +f 5238 5306 5339 5174 +g Group45619 +f 5240 5241 5185 5186 +g Group6210 +f 5242 5316 5340 5173 +g Group33820 +f 5244 5322 5328 5168 +g Group26711 +f 5247 5426 5425 5246 +g Group38587 +f 5427 7197 7191 5075 +g Group63495 +f 5250 3089 5251 +g Group46992 +f 3036 5078 5063 +g Group38587 +f 5069 7194 7198 5429 +g Group18263 +f 5193 5490 5491 5424 +g Group35241 +f 5253 7328 7331 5430 +g Group26711 +f 5248 5428 5431 5255 +g Group63495 +f 5257 3143 5256 +g Group46992 +f 5080 3066 5066 +g Group48879 +f 5258 5245 3066 5256 +g Group65382 +f 5171 5258 5256 3143 +g Group64262 +f 5163 7498 7499 7196 +g Group32819 +f 5252 5077 5231 5259 +g Group61765 +f 5241 5492 5489 5185 +g Group49322 +f 5249 3088 5233 5260 +g Group30714 +f 5261 7597 7547 3003 +g Group59133 +f 5153 7492 7494 5172 +g Group55243 +f 5242 5263 5261 3003 +g Group29116 +f 5264 7332 3007 5026 +g Group29302 +f 5266 7594 7526 4997 +g Group47793 +f 5268 3030 5042 5267 +g Group24959 +f 5270 3029 5010 5269 +g Group55243 +f 5271 5239 3005 5234 +g Group59133 +f 5184 7495 7497 5164 +g Group57814 +f 5273 3024 5050 5272 +g Group49680 +f 5274 5275 3065 5236 +g Group647 +f 5189 5274 5236 5167 +g Group43624 +f 5068 7333 7334 5431 +g Group51744 +f 5276 5487 5493 5432 +g Group41654 +f 5278 5194 5207 5279 +g Group647 +f 5278 5280 5198 5194 +g Group49680 +f 5268 5280 5278 3030 +g Group17317 +f 5281 5341 5312 2613 +g Group65382 +f 5250 5283 5197 3089 +g Group48879 +f 5282 5283 5250 3036 +g Group60372 +f 5262 7195 7187 1140 +g Group24959 +f 5266 4997 3024 5273 +g Group43173 +f 5238 7595 7581 3006 +g Group57814 +f 5267 5042 3029 5270 +g Group47793 +f 5272 5050 3065 5275 +g Group45262 +f 5265 5276 7333 7332 +g Group39324 +f 5237 5214 2731 5244 +g Group46992 +f 5259 5231 5078 5251 +g Group63495 +f 5260 5233 3143 5257 +g Group55827 +f 5279 5207 5195 5281 +g Group30714 +f 5285 7511 7543 3005 +g Group43808 +f 5286 2492 4916 5287 +g Group24900 +f 5289 7528 7554 4998 +g Group43391 +f 5290 2614 5043 5291 +g Group20557 +f 5292 1377 5011 5293 +g Group23681 +f 5295 7548 7524 3025 +g Group43808 +f 5296 4940 2558 5288 +g Group57189 +f 5297 3063 5206 5298 +g Group16182 +f 5299 5300 2999 2616 +g Group9149 +f 5301 5300 5299 3599 +g Group53412 +f 5302 1363 5051 5303 +g Group45278 +f 5304 2732 3651 5305 +g Group55243 +f 5285 3005 5239 5306 +g Group29116 +f 5307 5308 3009 5028 +g Group22083 +f 5309 5308 5307 5027 +g Group50992 +f 5311 3031 5310 +g Group43959 +f 5034 1364 4996 +g Group22463 +f 5312 3036 5063 5313 +g Group50992 +f 5314 3035 5315 +g Group43959 +f 1378 5036 5009 +g Group48210 +f 5295 3025 5243 5316 +g Group22083 +f 5318 5319 5033 5317 +g Group29116 +f 3007 5318 5317 5026 +g Group9149 +f 5297 3592 3599 5299 +g Group18311 +f 5310 3031 5221 5320 +g Group24350 +f 5321 3066 5245 5322 +g Group45278 +f 5301 3599 2614 5290 +g Group57189 +f 5324 5223 3057 5323 +g Group9149 +f 5326 5305 3651 5325 +g Group16182 +f 2993 5326 5325 2734 +f 5323 3057 2734 5325 +g Group42322 +f 5329 5330 3645 5328 +g Group49355 +f 5226 5329 5328 3670 +g Group43808 +f 5332 4916 2492 5331 +g Group25217 +f 5333 5287 4916 5332 +g Group32250 +f 2943 5333 5332 4915 +f 5334 5335 2939 4914 +g Group25217 +f 5296 5335 5334 4940 +g Group43808 +f 5336 2558 4940 5334 +g Group20557 +f 5289 4998 1363 5302 +g Group38771 +f 5286 7583 7586 2492 +g Group60372 +f 5284 7172 7185 1168 +g Group17046 +f 5319 7179 7175 5033 +g Group43959 +f 5315 7182 7183 5036 +g Group53339 +f 5294 7188 7177 2557 +g Group53412 +f 5291 5043 1377 5292 +g Group43391 +f 5303 5051 2732 5304 +g Group32484 +f 5313 5063 5229 5337 +g Group22463 +f 5338 5066 3066 5321 +g Group50841 +f 5339 5175 82 5331 +g Group43808 +f 5340 5178 2558 5336 +g Group40853 +f 5327 5199 5282 5341 +g Group5826 +f 5298 5206 5205 5342 +g Group49355 +f 5327 5343 5220 3669 +g Group42322 +f 5342 5343 5327 3591 +g Group32484 +f 5320 5221 5066 5338 +g Group64329 +f 5324 5215 3645 5330 +g Group18311 +f 5337 5229 3035 5314 +g Group6210 +f 5306 5239 5175 5339 +g Group64713 +f 5316 5243 5178 5340 +g Group40853 +f 5322 5245 5191 5328 +g Group24350 +f 5341 5282 3036 5312 +g Group10608 +f 5345 6968 7013 5433 +g Group25399 +f 5346 5347 5159 2568 +g Group57458 +f 5348 7138 7199 1399 +g Group22375 +f 5350 7014 6956 3154 +g Group13632 +f 5352 5395 5415 5351 +g Group25399 +f 5157 5352 5351 2506 +g Group22243 +f 5344 7200 7201 5434 +g Group34010 +f 2548 7168 7200 5344 +g Group21753 +f 2610 5356 7011 6969 +g Group35639 +f 5345 5433 5435 5346 +g Group34010 +f 5349 7202 7158 2490 +g Group533 +f 5357 7204 7205 1373 +g Group47406 +f 5350 3154 2506 5351 +g Group33388 +f 1331 5355 7012 7001 +g Group23640 +f 5359 2721 5359 +g Group35407 +f 5359 3655 2721 +f 2610 3603 5356 +g Group23640 +f 5356 2610 5356 +g Group24777 +f 5360 5203 1401 5353 +g Group38950 +f 5361 5204 5203 5360 +f 5362 5217 5218 5363 +g Group24777 +f 5348 1399 5217 5362 +g Group52604 +f 5218 5219 5363 +f 5161 5196 5361 +g Group9053 +f 2392 5668 5627 3083 +g Group30834 +f 5364 7279 7264 3444 +g Group13921 +f 5364 5365 5366 +g Group25882 +f 5367 1332 3163 5368 +g Group25399 +f 5369 5159 5347 5370 +g Group53389 +f 5372 5662 5669 5371 +g Group48103 +f 3093 7098 7097 5500 +g Group4421 +f 2489 7099 7100 5549 +g Group36645 +f 3099 5671 5672 5463 +g Group56874 +f 5379 5674 5673 5378 +g Group47354 +f 1249 7241 7280 6990 +g Group64496 +f 2388 6981 7005 3117 +g Group20741 +f 5380 5640 5675 5382 +f 5383 5676 5661 5384 +g Group13186 +f 5386 3561 3562 5385 +g Group53691 +f 5388 3577 3578 5387 +g Group56715 +f 5390 3579 3580 5389 +g Group8969 +f 5375 7099 7101 5391 +g Group10608 +f 5392 6995 7014 5350 +g Group25399 +f 5395 5352 5157 5394 +g Group35093 +f 3103 5677 5678 5570 +g Group56874 +f 5373 5679 5680 5377 +g Group53389 +f 5376 5671 5639 5381 +g Group34924 +f 5378 7102 7103 5539 +g Group37771 +f 3104 5663 5681 5524 +g Group45981 +f 5397 7282 7281 5398 +g Group63757 +f 5071 7394 7393 5399 +g Group57857 +f 5401 7152 7189 5073 +g Group62725 +f 5386 7283 7284 3441 +g Group30834 +f 5382 5683 5682 5404 +g Group45812 +f 2389 7246 7283 5386 +g Group62725 +f 3443 7279 7285 5405 +g Group9053 +f 5676 5684 5668 2392 +g Group45812 +f 5405 7285 7248 2357 +g Group55090 +f 5406 7207 7206 5407 +g Group15463 +f 5372 7220 7286 7016 +g Group64496 +f 3118 7017 7007 2392 +g Group51773 +f 7288 3140 7315 7335 +g Group16697 +f 5408 7289 7290 5475 +g Group63757 +f 5402 7395 7396 5079 +g Group19234 +f 5399 7153 7192 5072 +g Group38177 +f 5411 3069 5246 5412 +g Group49474 +f 5368 5413 7096 7044 +g Group53691 +f 5385 3562 3577 5388 +g Group13186 +f 5387 3578 3579 5390 +g Group49474 +f 5414 5391 7101 7104 +g Group35639 +f 5392 5350 5351 5415 +g Group30834 +f 3442 7218 7284 5403 +g Group9053 +f 3081 5665 5682 2388 +g Group13921 +f 5416 5403 5404 +g Group61809 +f 5405 2357 3158 5417 +g Group36778 +f 2358 7337 5419 +g Group39802 +f 7340 7397 5420 5421 +g Group16697 +f 5466 7251 7291 5422 +g Group31675 +f 7397 7398 7293 5420 +g Group36778 +f 5417 3158 2358 5419 +g Group61809 +f 5418 7336 7340 5421 +g Group9789 +f 5423 7292 7242 5400 +g Group31702 +f 5061 7387 7399 5480 +g Group9789 +f 5410 7253 7288 5409 +g Group31702 +f 5483 7400 7390 5064 +g Group63217 +f 5369 7139 7207 5406 +g Group46304 +f 5394 5157 3069 5411 +g Group45981 +f 5424 7294 7244 5401 +g Group43624 +f 5426 5070 5069 5425 +g Group21674 +f 5427 5428 5248 5407 +g Group65500 +f 5076 7197 7206 5249 +f 5252 7154 7198 5077 +g Group21674 +f 5425 5429 5412 5246 +g Group33241 +f 5165 7294 7295 5470 +g Group18328 +f 5430 7331 7342 5254 +g Group43624 +f 5428 5075 5068 5431 +g Group26711 +f 5431 7334 7343 5255 +g Group34831 +f 5493 7296 7276 5277 +g Group54434 +f 3167 7208 7209 7003 +g Group13632 +f 5370 5347 5346 5435 +g Group30545 +f 5395 7147 7165 5415 +g Group533 +f 7212 7211 5355 1331 +g Group52552 +f 5433 7208 7199 5435 +g Group22243 +f 5393 7213 7202 5349 +g Group57346 +f 5436 7239 7297 5437 +g Group27412 +f 3151 7298 7299 6997 +g Group20463 +f 5441 5155 2505 5440 +g Group9458 +f 5548 7300 7234 1198 +g Group56369 +f 5444 6984 7017 3118 +g Group926 +f 5446 5650 5666 3081 +g Group56188 +f 3558 5649 5645 3554 +g Group926 +f 3083 5667 5652 5448 +g Group56188 +f 3555 5647 5651 3559 +g Group23865 +f 5442 2517 3156 5450 +g Group17439 +f 5452 6996 6963 3162 +g Group20463 +f 5453 2538 5166 5454 +g Group41513 +f 5455 7301 7219 5371 +g Group20059 +f 3442 5456 5457 3080 +f 5456 3558 1872 5457 +f 3559 5458 5459 1875 +f 5458 3444 3082 5459 +g Group56962 +f 5445 1838 2589 5460 +g Group61999 +f 5462 5569 5543 2593 +g Group28518 +f 5463 5462 5461 3099 +g Group24314 +f 5464 7006 6972 2416 +g Group14049 +f 3667 3060 5466 +g Group16697 +f 5468 7373 7401 5408 +g Group33241 +f 5469 5165 5470 +g Group43214 +f 7302 7345 7342 5247 +g Group28518 +f 5471 5472 3092 5460 +g Group61999 +f 2589 5551 5571 5471 +g Group56962 +f 5461 2593 1873 5465 +g Group39047 +f 231 7303 7304 7167 +g Group10415 +f 5439 7347 7346 5440 +g Group37457 +f 5451 7166 7161 2518 +g Group42470 +f 5452 3162 2538 5453 +g Group34407 +f 5464 2416 5446 +f 5448 2419 5444 +g Group56188 +f 3558 5456 5447 +f 5458 3559 5449 +g Group36795 +f 5473 7327 7348 5423 +g Group45940 +f 7271 7273 7290 3580 +g Group7379 +f 5476 5067 5192 5477 +g Group8242 +f 5478 5071 5072 5479 +g Group60183 +f 5473 7383 7399 3019 +g Group26702 +f 5400 7394 7382 5423 +g Group35823 +f 3023 5481 7190 7148 +g Group60183 +f 3062 7400 7385 5467 +g Group26702 +f 5409 7384 7396 5410 +g Group8242 +f 5482 5074 5079 5484 +g Group62736 +f 3018 5479 7193 7150 +g Group9313 +f 5441 7350 7349 5485 +g Group41368 +f 5454 5166 5165 5469 +g Group33241 +f 5486 5154 5485 +g Group43214 +f 5255 7305 7274 3068 +g Group28284 +f 5488 5477 5192 5487 +g Group61765 +f 5265 5488 5487 5276 +g Group7379 +f 5489 5193 5073 5481 +g Group51744 +f 5490 5253 5430 5491 +g Group61765 +f 5490 5492 5241 5253 +g Group28284 +f 5489 5492 5490 5193 +g Group18263 +f 5487 5192 5398 5493 +g Group4590 +f 5463 5672 5685 5568 +g Group36645 +f 5472 5686 5669 3092 +g Group50178 +f 5475 3668 5468 +g Group48588 +f 3580 7289 7287 5389 +g Group50178 +f 5474 3667 5466 +g Group48588 +f 5420 7293 7291 3551 +g Group63757 +f 5480 5071 5478 +f 5484 5079 5483 +g Group34831 +f 5254 7257 7295 5491 +g Group33241 +f 5486 7296 7281 5154 +g Group27328 +f 5687 6813 6814 6730 +g Group13029 +f 5497 5498 2570 5496 +g Group57093 +f 1908 5997 5998 5594 +g Group48103 +f 5499 3093 5500 +g Group9885 +f 1374 5537 5578 5375 +g Group3787 +f 5502 7019 7018 5501 +g Group61608 +f 3106 5574 5542 5502 +g Group1348 +f 5504 5596 5607 2595 +g Group28520 +f 1405 5999 6000 5610 +g Group7880 +f 5494 7105 7106 5611 +g Group20148 +f 5507 6911 6905 2632 +g Group30936 +f 5506 6816 6802 2668 +g Group19912 +f 5603 6732 6733 5967 +g Group13029 +f 5495 5511 5510 2510 +g Group15998 +f 6736 6913 6912 6003 +g Group48103 +f 5513 3105 5503 +g Group9885 +f 5367 5579 5550 1332 +g Group59169 +f 5606 5613 1845 5514 +g Group27863 +f 5515 7020 6985 5507 +f 5509 6987 7009 5516 +g Group61967 +f 1920 7066 7107 5597 +g Group165 +f 5512 6002 6004 5614 +g Group61608 +f 5519 5565 5566 3144 +g Group15422 +f 5499 7021 7010 3093 +g Group26966 +f 5520 3103 1837 5504 +g Group61196 +f 5501 7018 7020 5515 +g Group34681 +f 5521 3094 2590 5514 +g Group53481 +f 5518 3144 2639 5516 +g Group51837 +f 5373 7108 7109 5689 +g Group35093 +f 5523 5674 5677 3103 +g Group42808 +f 5524 5523 5520 3104 +f 5525 5522 3094 5521 +g Group35093 +f 3098 5690 5680 5525 +g Group51837 +f 5691 7110 7102 5378 +g Group40665 +f 5527 6006 6005 5526 +g Group11875 +f 5697 6680 6681 6099 +g Group17241 +f 5530 5582 5602 2509 +g Group26590 +f 5531 6737 6738 5737 +g Group12204 +f 5534 6818 6817 2569 +g Group30760 +f 5536 5591 5610 2636 +g Group9885 +f 5537 1374 5538 +g Group40388 +f 5374 5499 5500 +g Group39961 +f 5540 5379 5378 5539 +g Group61608 +f 5542 6976 7019 5502 +g Group28666 +f 5543 7022 6999 2593 +g Group57093 +f 5544 6007 5997 1908 +g Group11662 +f 5535 6740 6739 1405 +g Group18262 +f 2539 6682 6683 6040 +g Group3484 +f 5529 6008 5965 1195 +f 5528 5604 5587 1171 +g Group9458 +f 5546 7306 7301 5455 +g Group39961 +f 7240 7307 5379 5540 +f 5549 5373 5377 5548 +g Group9885 +f 5541 1332 5550 +g Group40388 +f 5503 5396 5513 +g Group59169 +f 5551 7023 7024 1837 +g Group51442 +f 3608 6915 6914 5553 +g Group32647 +f 5536 2636 3609 5554 +g Group51442 +f 5555 6917 6916 3610 +g Group27366 +f 5558 5559 3619 5557 +g Group62399 +f 2659 5558 5557 3142 +g Group44517 +f 5533 5609 5615 1403 +g Group62054 +f 5561 6009 6010 3622 +g Group31551 +f 5941 6011 6009 5561 +g Group6253 +f 3623 7111 7112 6809 +g Group7707 +f 5538 7004 7021 5499 +g Group32992 +f 5566 2609 3589 5567 +g Group61999 +f 5569 5462 5463 5568 +f 5570 5472 5471 5571 +g Group19239 +f 5557 3619 3608 5553 +g Group31551 +f 5554 6013 6014 5944 +g Group62054 +f 3609 5993 6013 5554 +g Group32992 +f 5559 3618 2658 5574 +g Group32647 +f 5561 3622 2664 5560 +g Group21614 +f 5573 7113 7074 2637 +g Group606 +f 5564 2667 2634 5552 +f 5556 2641 2669 5575 +g Group62399 +f 5576 5577 2611 3136 +g Group27366 +f 5567 5577 5576 3662 +g Group54272 +f 5576 3136 2640 5555 +g Group34924 +f 5549 7100 7108 5373 +g Group4590 +f 5570 5678 5686 5472 +g Group4421 +f 5539 7103 7045 2547 +g Group39961 +f 5377 7309 7300 5548 +g Group9458 +f 5443 7222 7308 5580 +g Group26966 +f 5569 1845 5543 +g Group61999 +f 5462 2593 5461 +g Group26966 +f 5551 1837 5571 +g Group61999 +f 2589 5471 5460 +g Group35093 +f 5568 5685 5690 3098 +g Group40388 +f 5537 5374 5578 +g Group31105 +f 5574 2658 5542 +g Group61608 +f 3106 5502 5501 +g Group40388 +f 5579 5396 5550 +g Group31105 +f 5565 2609 5566 +g Group61608 +f 5519 3144 5518 +g Group38517 +f 5583 6102 6101 5529 +g Group52274 +f 5947 5946 5582 5530 +g Group12822 +f 5692 6818 6822 5949 +g Group53023 +f 5587 6741 6742 1171 +g Group5314 +f 5497 5968 6015 5498 +g Group32505 +f 1347 5872 5862 2600 +g Group14014 +f 5591 5951 5950 5535 +g Group10068 +f 5633 7025 7026 5593 +g Group47534 +f 5594 7027 7024 1908 +g Group61291 +f 5496 7028 7027 5594 +g Group52408 +f 5597 6825 6826 1920 +g Group38651 +f 5508 6815 6825 5597 +f 5600 6827 6816 5506 +g Group52408 +f 1909 6828 6827 5600 +g Group34603 +f 5693 6919 6918 5952 +g Group53023 +f 1195 6732 6744 5602 +g Group5314 +f 5495 5995 5979 5511 +g Group52274 +f 5604 5954 5948 5534 +g Group38517 +f 5528 6104 6103 5605 +g Group15105 +f 5593 7030 7029 5606 +g Group51335 +f 5656 7115 7114 6829 +g Group29519 +f 5608 5956 5955 5586 +g Group32505 +f 2661 5884 5896 1359 +g Group5314 +f 5594 5998 5969 5497 +g Group15105 +f 5596 7028 7031 5607 +g Group14763 +f 5610 6000 5971 2636 +g Group59659 +f 5611 7106 7116 5505 +g Group5314 +f 5511 5980 6001 5612 +g Group61291 +f 5612 7032 7029 5510 +g Group47534 +f 1910 6979 7032 5612 +g Group48210 +f 5597 7107 7117 5508 +g Group51944 +f 5614 6004 5989 5517 +g Group3484 +f 5582 5529 1195 5602 +g Group44517 +f 5591 5535 1405 5610 +g Group17241 +f 5604 5534 2569 5587 +g Group30760 +f 5609 5560 2664 5615 +g Group31568 +f 5897 6684 6646 5853 +g Group5229 +f 5619 5912 5913 2478 +g Group60894 +f 5621 7119 7120 6921 +g Group40047 +f 2348 5623 5743 5744 +g Group32918 +f 5624 1292 2526 5625 +g Group9053 +f 5626 3083 5627 +g Group31313 +f 6831 6833 6832 5630 +g Group21973 +f 2555 5830 5850 5628 +g Group48443 +f 5586 6745 6746 5896 +g Group18092 +f 5632 7122 7121 5633 +g Group45841 +f 6565 6686 6685 6048 +g Group50140 +f 2426 5636 5635 5634 +f 5634 5762 5777 2426 +g Group18733 +f 5637 6652 6670 2427 +g Group32376 +f 5639 6982 7015 5381 +g Group50140 +f 5641 5642 5623 2348 +g Group45841 +f 6055 6687 6688 6533 +g Group52228 +f 1912 6105 6106 5759 +g Group1074 +f 5645 2416 5644 +g Group22855 +f 3554 5740 5731 3465 +g Group1074 +f 5646 2419 5647 +g Group24568 +f 5717 5741 5732 1932 +g Group44330 +f 5775 6747 6748 5774 +g Group40514 +f 5643 6672 6689 1914 +g Group56188 +f 5649 3558 5447 5650 +g Group34407 +f 5651 2419 5448 5652 +g Group32918 +f 5617 2472 1266 5622 +g Group21973 +f 5619 5851 5823 2477 +g Group31313 +f 5654 6796 6836 6835 +g Group48985 +f 5584 6837 6838 5857 +g Group9417 +f 5618 5981 6016 83 +f 5616 6072 6075 36 +g Group39113 +f 5656 6840 6839 5657 +g Group61847 +f 5658 2595 5607 5659 +g Group51425 +f 5660 7098 7122 5632 +g Group20741 +f 5661 7008 7016 5384 +g Group29644 +f 5663 3104 2595 5658 +g Group9053 +f 5665 3081 5664 +g Group24568 +f 1931 5716 5735 5638 +f 5648 5736 5718 1932 +g Group926 +f 5664 3081 5666 +g Group22707 +f 3442 5447 5456 +g Group926 +f 5667 3083 5626 +g Group22707 +f 5449 3444 5458 +g Group30834 +f 5668 5366 5365 5627 +g Group31608 +f 5662 3091 3092 5669 +g Group37771 +f 5660 3094 5522 5670 +g Group58426 +f 5671 5376 5443 5672 +g Group35093 +f 5674 5523 5524 5673 +g Group64496 +f 5640 2388 5675 +f 5676 2392 5661 +g Group56874 +f 5677 5379 5546 5678 +g Group35093 +f 5679 5522 5525 5680 +g Group31608 +f 5671 3099 3116 5639 +g Group59552 +f 5663 7083 7123 5681 +g Group9053 +f 5683 5675 2388 5682 +g Group30834 +f 5683 5382 5675 +f 5668 5684 5383 5366 +f 5383 5684 5676 +f 5665 5416 5404 5682 +g Group22707 +f 5650 5447 5666 +g Group34407 +f 5649 2416 5645 +g Group22707 +f 5667 5449 5652 +g Group34407 +f 5647 2419 5651 +g Group26371 +f 5672 5443 5580 5685 +g Group58426 +f 5686 5455 5371 5669 +g Group15998 +f 5996 6923 6924 6730 +g Group61743 +f 2569 6817 6841 6750 +g Group40388 +f 5500 7097 7109 5374 +g Group30056 +f 5679 5689 5670 5522 +g Group56874 +f 5674 5379 5677 +g Group35093 +f 5523 3103 5520 +g Group56874 +f 5690 5377 5680 +g Group35093 +f 3098 5525 5521 +g Group30056 +f 5691 5673 5524 5681 +g Group40388 +f 5396 7110 7123 5513 +g Group65106 +f 5692 6926 6925 5688 +g Group43325 +f 5693 6842 6813 5687 +g Group26371 +f 5678 5546 5455 5686 +g Group56874 +f 5685 5580 5377 5690 +g Group46695 +f 5533 6751 6752 5955 +g Group19553 +f 1909 6922 6927 6828 +g Group47237 +f 5530 6842 6843 5947 +g Group10068 +f 5607 7034 7033 5659 +g Group2843 +f 5694 6018 6017 5695 +g Group48311 +f 5856 5898 5897 5696 +g Group58210 +f 5895 6104 6107 6019 +g Group58230 +f 5698 1913 2417 5699 +g Group56517 +f 6978 7035 5701 5700 +g Group13707 +f 5700 1907 2508 5702 +g Group11517 +f 5703 6580 6605 3462 +g Group40956 +f 5704 5760 5785 3463 +g Group10343 +f 5706 1924 2591 5707 +g Group37624 +f 5709 6052 6095 2422 +g Group27531 +f 5711 6582 6606 2424 +g Group9627 +f 1927 6439 6462 5866 +g Group50204 +f 5712 2525 5901 5899 +g Group24568 +f 5716 1931 5715 +g Group22855 +f 5644 3554 5645 +g Group24568 +f 5717 1932 5718 +g Group22855 +f 3555 5646 5647 +g Group54866 +f 1924 6722 5778 5755 +g Group17931 +f 5719 6062 6097 1934 +g Group26590 +f 5720 6753 6754 5544 +g Group4556 +f 5714 5901 5902 5722 +g Group31568 +f 5904 6690 6691 6100 +g Group29855 +f 5874 6071 6109 6020 +g Group18744 +f 5725 5702 2508 5720 +g Group17031 +f 5544 7023 6998 5725 +g Group13707 +f 5726 2540 1913 5698 +g Group50204 +f 2471 5707 5905 5854 +g Group9627 +f 5877 6463 6448 1925 +g Group10343 +f 5712 2594 1935 5710 +g Group13230 +f 5728 6603 6607 1928 +g Group42669 +f 5729 5784 5761 1929 +g Group30955 +f 5730 6678 6651 1930 +g Group24568 +f 5732 6679 6689 1932 +g Group10085 +f 5733 5708 1911 5703 +g Group8372 +f 3467 5733 5703 3462 +f 5728 5734 3468 3459 +g Group10085 +f 5719 5734 5728 1928 +g Group2787 +f 5699 2417 5638 5735 +g Group1074 +f 5701 2419 5646 5736 +g Group10162 +f 5697 5527 5526 5721 +g Group28303 +f 5737 6693 6675 2540 +g Group17031 +f 5739 7022 6980 5531 +g Group18744 +f 5726 5739 5737 2540 +g Group10162 +f 5738 5532 5545 5724 +g Group46598 +f 5695 6017 5963 5696 +g Group24568 +f 5740 5715 1931 5731 +g Group22855 +f 5740 3554 5715 +f 5732 5741 3555 3466 +f 3555 5741 5717 +g Group48311 +f 5722 5902 5903 5723 +g Group22855 +f 5716 5644 5735 +f 5736 5646 5718 +g Group27299 +f 5622 6755 6756 1265 +g Group40047 +f 5745 5746 2348 5744 +g Group44330 +f 5745 6757 6758 6042 +g Group63803 +f 5747 6579 6599 2414 +g Group9110 +f 5749 1871 3461 5750 +g Group42443 +f 5748 5751 2418 2415 +g Group38160 +f 5752 5751 5748 1868 +g Group17972 +f 5753 6609 6608 2422 +g Group22255 +f 2421 6610 6609 5753 +f 5756 6611 6612 2423 +g Group17972 +f 2424 6606 6611 5756 +g Group46952 +f 5759 1914 5705 5760 +g Group56511 +f 6111 6110 1930 5637 +g Group42062 +f 1876 6562 6538 5763 +g Group37779 +f 3462 6558 6537 3467 +g Group42062 +f 5765 6540 6564 1877 +g Group37779 +f 3468 6539 6530 3459 +g Group56579 +f 6760 6759 5768 5767 +g Group54423 +f 5746 6041 6112 5769 +g Group8372 +f 5771 6057 6096 1933 +g Group12655 +f 5773 6058 6064 3557 +g Group55441 +f 5774 6549 6571 5636 +g Group11905 +f 1292 6761 6762 6039 +g Group40047 +f 5777 5776 5775 2426 +g Group1497 +f 5742 6614 6613 5778 +g Group59520 +f 5779 6600 6615 1869 +g Group38160 +f 5781 5749 1870 5780 +g Group42443 +f 2470 5781 5780 2456 +g Group56375 +f 5782 5763 1867 5747 +g Group60658 +f 2414 6589 6601 5782 +f 5783 6602 6591 2455 +g Group56375 +f 5765 5783 5779 1869 +g Group45239 +f 5750 3461 5730 5784 +g Group9110 +f 5785 3464 1874 5752 +g Group37779 +f 5771 3467 5764 +g Group32348 +f 5770 2421 5753 +g Group37779 +f 5766 3468 5773 +g Group32348 +f 5756 2423 5772 +g Group11905 +f 1266 6763 6764 5622 +g Group54423 +f 5762 6111 6060 5777 +g Group56511 +f 1914 6113 6112 5643 +g Group40047 +f 5775 5774 5636 2426 +g Group45239 +f 5760 5705 3464 5785 +g Group54866 +f 5768 6759 1935 5758 +g Group65320 +f 5778 6613 6608 5755 +g Group46952 +f 5784 5730 1930 5761 +g Group8671 +f 5786 6465 6464 5787 +g Group58189 +f 6295 6467 6466 6144 +g Group10690 +f 1855 6268 6296 5788 +g Group13708 +f 6044 6469 6468 5792 +g Group18815 +f 5794 5820 5827 5793 +g Group39082 +f 2647 6402 6401 1409 +g Group18163 +f 5797 5822 5812 2516 +g Group42893 +f 5798 5799 1855 5788 +g Group5821 +f 2594 6440 6470 2543 +g Group23200 +f 5801 6046 6043 2572 +g Group46548 +f 5802 5803 2674 2670 +g Group23837 +f 5796 5803 5802 1856 +f 5805 5806 1882 5804 +g Group46548 +f 2676 5805 5804 2678 +g Group10690 +f 5807 6297 6298 1847 +g Group58189 +f 6128 6471 6472 6299 +f 1226 6473 6474 6300 +g Group8671 +f 5792 6468 6475 5793 +g Group5821 +f 2513 6476 6449 2591 +g Group42893 +f 5800 5809 5807 1847 +f 5799 6077 6068 1855 +g Group56518 +f 5806 5829 5825 1882 +g Group23837 +f 5810 1856 5802 +f 5804 1882 5795 +g Group39082 +f 1407 6398 6403 2643 +g Group57170 +f 5810 5842 5814 1856 +g Group51496 +f 5812 5813 5787 2516 +g Group24315 +f 5814 5813 5812 1856 +g Group1384 +f 5815 6846 6845 5816 +g Group27217 +f 1360 6902 6928 6765 +g Group41526 +f 5794 6478 6477 5819 +g Group13693 +f 5821 1926 5796 5822 +g Group18828 +f 5823 6441 6479 2477 +g Group60328 +f 6766 5653 6929 6930 +g Group24315 +f 5826 5827 1882 5825 +g Group51496 +f 5792 5826 5825 2572 +g Group40874 +f 5828 2596 5801 5829 +g Group24072 +f 1360 6767 6768 6444 +g Group3271 +f 5816 6845 6847 5831 +g Group43413 +f 5819 6477 6480 5832 +g Group1384 +f 5833 6848 6792 5817 +g Group63011 +f 5938 6931 5835 +g Group57944 +f 2662 6910 6932 5907 +g Group12306 +f 5838 3626 3625 5837 +f 5840 3629 3614 5839 +g Group41526 +f 5841 6482 6481 5811 +g Group7284 +f 5844 6484 6483 5843 +g Group45639 +f 5838 5844 5843 3626 +g Group37611 +f 2602 6896 6933 5888 +g Group25830 +f 3583 6895 6934 6022 +g Group45639 +f 5847 5839 3614 5832 +g Group7284 +f 5832 6480 6485 5847 +g Group3271 +f 5836 6849 6848 5833 +g Group54799 +f 2601 6487 6488 5908 +f 6491 6490 2662 5907 +g Group39487 +f 5848 6492 6452 5837 +f 5840 6456 6493 5849 +g Group43413 +f 5843 6483 6482 5841 +g Group192 +f 5850 6850 5628 +g Group38547 +f 5818 5850 5629 +g Group60328 +f 5830 6767 6765 5629 +f 5653 6766 6712 5823 +g Group38547 +f 5852 5824 5653 5851 +g Group192 +f 5619 6851 5851 +g Group57170 +f 5820 5795 1882 5827 +g Group56518 +f 5822 5796 1856 5812 +g Group18163 +f 5829 5801 2572 5825 +g Group18815 +f 5842 5811 5786 5814 +g Group4556 +f 5854 5694 5695 5853 +g Group29855 +f 5855 6115 6114 5856 +g Group54022 +f 5857 5914 5945 5584 +g Group31313 +f 5860 6795 6830 5630 +g Group32505 +f 5861 2600 5862 +g Group257 +f 5536 5915 5951 5591 +g Group23252 +f 5863 1926 5821 5864 +g Group9627 +f 5865 1927 5866 +g Group65234 +f 5974 6495 6494 5714 +g Group7314 +f 5863 5918 5960 5867 +g Group55470 +f 5869 6053 6045 2596 +g Group56107 +f 5870 1937 2676 5871 +g Group53094 +f 5873 6891 6935 5654 +g Group46598 +f 5874 6024 6016 5723 +g Group38517 +f 6103 6116 5953 5605 +g Group9627 +f 5877 1925 5868 +g Group65234 +f 5694 6496 6497 5983 +g Group9627 +f 5865 6078 6076 1927 +g Group50433 +f 5869 2596 5828 5879 +g Group17649 +f 5861 5916 5944 5880 +g Group37611 +f 5881 6852 5882 2663 +g Group63799 +f 3621 6849 6853 6025 +g Group32505 +f 5884 2661 5883 +g Group257 +f 5609 5956 5932 5560 +g Group9201 +f 5867 5960 5961 5885 +g Group57994 +f 5871 2676 3628 5886 +g Group3196 +f 5887 6854 6854 +g Group32678 +f 5831 6847 6855 6023 +g Group17649 +f 5889 5941 5933 5883 +g Group38608 +f 5962 6498 5890 +g Group21865 +f 5886 3628 5849 5891 +g Group19939 +f 5892 5939 5931 5881 +g Group37611 +f 5562 5892 5881 2663 +f 2602 5887 5893 5572 +g Group63799 +f 5880 6029 6028 3584 +g Group9417 +f 5858 83 5894 +g Group38517 +f 5583 5529 5582 +g Group15762 +f 5872 5589 5590 5862 +g Group9417 +f 5895 36 5876 +g Group38517 +f 5528 5605 5604 +g Group15762 +f 5884 5608 5586 5896 +g Group48311 +f 5853 5695 5696 5897 +g Group65186 +f 5896 6746 6708 1359 +g Group192 +f 5857 6838 6834 2478 +g Group31568 +f 6099 6695 6694 5898 +f 5856 6114 6117 5898 +g Group9417 +f 5895 6019 5964 36 +g Group15380 +f 5899 5900 2594 5712 +g Group26370 +f 5713 5866 6462 6499 +g Group1411 +f 6494 6500 5901 5714 +g Group53349 +f 6696 5901 2525 5625 +g Group48311 +f 5904 5875 5723 5903 +g Group31568 +f 5904 6108 6070 5875 +g Group9417 +f 83 6024 6020 5894 +g Group1411 +f 5854 6502 6496 5694 +g Group32123 +f 5905 5906 6463 6501 +g Group15380 +f 5707 2591 5906 5905 +g Group31568 +f 5902 6696 6697 5903 +g Group50433 +f 5864 5821 2592 5878 +g Group23252 +f 5879 5828 1937 5870 +g Group9151 +f 5907 6932 6931 5834 +g Group54354 +f 5888 6933 6936 5846 +g Group49046 +f 5909 6486 6492 5848 +g Group6006 +f 5908 6488 6498 5845 +g Group253 +f 5910 6491 6461 5891 +g Group49046 +f 5849 6493 6489 5910 +g Group11505 +f 5911 6119 6118 5912 +g Group55260 +f 5913 6121 6120 5914 +g Group257 +f 5915 5536 5916 +g Group15762 +f 5590 5861 5862 +g Group39995 +f 5918 5863 5864 5917 +g Group23865 +f 5919 6503 6451 2555 +g Group35032 +f 6030 6770 6769 6122 +g Group7314 +f 5923 5870 5871 5922 +g Group27010 +f 5919 2555 5628 5924 +g Group5229 +f 5925 2556 5859 5926 +g Group54725 +f 5976 6772 6771 6123 +g Group23865 +f 2477 6479 6507 5911 +g Group1640 +f 5921 5869 5879 5929 +g Group35444 +f 6025 6856 6799 5931 +g Group54354 +f 6852 6798 5835 5882 +g Group257 +f 5933 5560 5932 +g Group15762 +f 5883 5608 5884 +g Group9201 +f 5922 5871 5886 5934 +g Group35444 +f 5936 6805 6857 6027 +g Group54354 +f 6804 6854 5888 5846 +g Group59866 +f 6034 6508 6461 5938 +g Group38608 +f 5891 5937 5934 5886 +g Group54113 +f 6461 5937 6461 +g Group18701 +f 5940 6011 6035 5939 +g Group3196 +f 5892 6858 5940 5939 +f 6859 5893 5942 5943 +g Group47056 +f 5944 6014 6029 5880 +g Group2243 +f 5946 5947 5584 5945 +g Group52274 +f 5582 5946 5945 5583 +g Group28327 +f 5949 6822 6794 5631 +g Group29519 +f 5951 5590 5589 5950 +g Group50108 +f 5952 6918 6892 5655 +g Group52274 +f 5953 5954 5604 5605 +g Group2243 +f 5948 5954 5953 5585 +g Group14014 +f 5956 5609 5533 5955 +g Group55260 +f 5912 6118 6121 5913 +g Group5229 +f 5924 5628 2556 5925 +g Group62200 +f 5955 6752 6745 5586 +g Group62742 +f 5947 6843 6837 5584 +g Group1640 +f 5917 5864 5878 5928 +g Group39995 +f 5929 5879 5870 5923 +g Group63011 +f 5938 6931 6937 6034 +f 5845 6936 5959 +g Group38517 +f 5945 6124 6102 5583 +g Group15762 +f 5915 5590 5951 +g Group22819 +f 5918 5973 6036 5960 +g Group54022 +f 5926 5859 5585 5953 +g Group2144 +f 5916 5536 5554 5944 +g Group4323 +f 5957 5835 5930 +g Group15762 +f 5956 5608 5932 +g Group24706 +f 5960 6036 6037 5961 +g Group4323 +f 5935 5846 5959 +g Group2144 +f 5941 5561 5560 5933 +g Group38608 +f 5961 5962 5890 5885 +g Group59866 +f 5958 6498 6509 6022 +g Group54113 +f 6498 5962 6498 +g Group35444 +f 5939 6035 6032 5931 +g Group19939 +f 5942 5893 5887 5936 +g Group9417 +f 5963 36 5964 +g Group46598 +f 5696 5855 5856 +g Group53023 +f 5965 6773 6733 1195 +g Group24668 +f 5532 6737 6773 5965 +g Group5314 +f 5968 5497 5969 +g Group1244 +f 2569 6710 6741 5587 +g Group14763 +f 5970 2636 5971 +g Group40495 +f 2668 7054 7116 5506 +g Group55500 +f 5973 5918 5917 5972 +g Group59481 +f 6774 5713 6495 6510 +g Group28053 +f 1227 6505 6510 5974 +g Group22819 +f 5978 5923 5922 5977 +g Group5314 +f 5980 5511 5979 +g Group1244 +f 5602 6744 6728 2509 +g Group2843 +f 5982 5714 5722 5981 +g Group28053 +f 5983 6511 6512 1209 +g Group59481 +f 5727 6775 6511 6497 +g Group17145 +f 5987 5921 5929 5986 +g Group14763 +f 5989 2664 5988 +g Group40495 +f 5508 7117 7070 2666 +g Group53831 +f 5970 7055 7124 5990 +g Group24706 +f 5977 5922 5934 5991 +g Group53831 +f 5992 7125 7071 5988 +g Group52117 +f 6807 7126 7113 5573 +g Group46057 +f 5990 5994 5993 3609 +g Group31398 +f 5996 6861 6790 5621 +g Group19912 +f 5997 6776 6742 5588 +g Group165 +f 5999 5494 5611 6000 +g Group57093 +f 5967 1910 5612 6001 +g Group53179 +f 6003 6912 6893 5657 +g Group28520 +f 6002 1403 5615 6004 +g Group3484 +f 6006 5528 1171 6005 +g Group24668 +f 6005 6777 6754 5526 +g Group53023 +f 1171 6776 6777 6005 +g Group40665 +f 6008 5545 5532 5965 +g Group33699 +f 6009 6863 6862 6010 +g Group3196 +f 5940 6858 6863 6009 +g Group46057 +f 6012 5992 3622 6010 +g Group52117 +f 5563 7073 7127 6821 +g Group3196 +f 6013 6864 6859 5943 +g Group33699 +f 5993 6860 6864 6013 +g Group33669 +f 5968 6711 6750 6015 +f 5995 6731 6729 5979 +f 5998 5588 5969 +g Group5314 +f 5594 5497 5496 +g Group51944 +f 6000 5611 5505 5971 +g Group33669 +f 5980 5603 6001 +g Group5314 +f 5511 5612 5510 +g Group14763 +f 6004 5615 2664 5989 +g Group46598 +f 5981 5722 5723 6016 +g Group32846 +f 5999 6923 6921 5494 +g Group277 +f 6015 6865 6839 5498 +g Group31198 +f 6018 1209 5616 6017 +g Group29855 +f 6019 6107 6115 5855 +g Group58210 +f 6020 6109 6101 5894 +g Group9417 +f 6017 5616 36 5963 +g Group17145 +f 5972 5917 5928 6021 +g Group55500 +f 5986 5929 5923 5978 +g Group63011 +f 6022 6934 6936 5958 +g Group28053 +f 5982 1227 5974 +g Group9417 +f 6024 83 6016 +g Group46598 +f 5874 5723 5875 +g Group28053 +f 5983 1209 6018 +g Group4323 +f 5930 6856 6853 6026 +f 6023 6855 6857 5935 +g Group35444 +f 6029 5942 5936 6028 +g Group46598 +f 6019 5855 5964 +f 6024 5874 6020 +g Group22182 +f 6030 5920 5921 5987 +g Group6677 +f 6030 6122 6054 5920 +g Group26370 +f 5976 6123 6079 5865 +g Group22182 +f 6021 5928 5927 6031 +g Group63799 +f 6032 3621 6025 +f 6027 3584 6028 +g Group16932 +f 6033 6508 6454 5991 +g Group54113 +f 5937 6033 5991 5934 +g Group47056 +f 6011 5941 5889 6035 +g Group18701 +f 6014 5943 5942 6029 +g Group25830 +f 6034 6937 6909 3620 +g Group51174 +f 5973 6442 6513 6036 +g Group53061 +f 6036 6513 6514 6037 +g Group54113 +f 6037 6038 5962 5961 +g Group22685 +f 6022 6509 6514 3583 +g Group63799 +f 6035 5889 3621 6032 +g Group13225 +f 6039 1320 2539 6040 +g Group44330 +f 6041 5746 5745 6042 +g Group10690 +f 6298 6302 6043 1847 +g Group68 +f 6045 1925 5800 6046 +g Group22789 +f 1928 6617 6616 6047 +g Group65534 +f 5636 6571 6535 5635 +g Group52228 +f 6049 1929 5761 6050 +g Group19644 +f 6051 1911 5708 6052 +g Group26370 +f 6054 5868 6053 +g Group6677 +f 5920 5869 5921 +g Group22789 +f 6051 6592 6618 1911 +g Group65534 +f 5642 6547 6522 5623 +g Group32348 +f 6056 2421 5770 6057 +g Group28065 +f 6059 5772 6058 +g Group8372 +f 1934 5773 3468 +g Group44330 +f 6061 5776 5777 6060 +g Group39337 +f 6047 2425 5711 6062 +g Group65023 +f 3445 6620 6619 6257 +g Group45988 +f 6064 6259 6293 3557 +g Group13225 +f 6066 2507 1322 6067 +g Group56533 +f 6068 2516 5787 6069 +g Group29855 +f 6071 5874 5875 6070 +g Group11505 +f 6073 5919 5924 6072 +g Group55260 +f 6075 5925 5926 6074 +g Group45911 +f 6076 2592 5797 6077 +g Group26370 +f 6078 5865 6079 +g Group6677 +f 5878 5927 5928 +g Group32529 +f 2512 6221 6222 6139 +g Group58195 +f 6083 6410 6411 6304 +g Group61334 +f 1226 6300 6305 6223 +g Group42068 +f 6086 6225 6224 6085 +g Group63081 +f 6088 6227 6226 6087 +g Group25684 +f 3447 6170 6150 3581 +g Group16572 +f 6230 6229 6089 2402 +g Group42068 +f 6091 6230 6227 6088 +g Group63081 +f 6080 6221 6225 6086 +g Group61334 +f 1226 6223 6231 6129 +g Group31387 +f 6081 6306 6307 6232 +g Group58195 +f 6285 6413 6412 6092 +g Group42232 +f 6063 6169 6137 2398 +g Group13427 +f 6089 6172 6138 2402 +g Group8372 +f 6095 1933 6096 +g Group28065 +f 2422 5770 5753 +g Group8372 +f 6059 1934 6097 +g Group28065 +f 5772 2424 5756 +g Group16572 +f 6094 6234 6224 2396 +g Group25684 +f 3552 6174 6167 3446 +g Group37955 +f 2472 6695 6681 6066 +g Group11875 +f 5721 6673 6680 5697 +g Group37955 +f 6040 6683 6691 2526 +g Group11875 +f 5724 6682 6692 5738 +g Group58210 +f 6102 5858 5894 6101 +f 6104 5895 5876 6103 +g Group6385 +f 5635 6698 6049 5634 +f 6699 5642 5641 6105 +f 6105 5641 5769 6106 +g Group55260 +f 6072 5924 5925 6075 +g Group38517 +f 6104 5528 6006 6107 +g Group17931 +f 6052 5708 1933 6095 +g Group37624 +f 6062 5711 2424 6097 +g Group11875 +f 6100 5724 6108 +g Group31568 +f 5903 6697 6690 5904 +g Group10162 +f 6071 5545 6008 6109 +g Group57748 +f 1322 6707 6758 6067 +g Group44330 +f 5744 6763 6757 5745 +g Group10668 +f 6110 6111 5762 6050 +g Group56511 +f 1930 6110 6050 5761 +g Group34730 +f 6041 2390 5643 6112 +g Group28065 +f 6057 5770 6096 +g Group8372 +f 5771 1933 3467 +g Group32348 +f 6058 5772 2423 6064 +g Group57748 +f 6039 6762 6719 1320 +g Group44330 +f 5776 6761 6747 5775 +g Group34730 +f 6111 5637 2427 6060 +g Group56511 +f 6106 6113 1914 5759 +g Group10668 +f 6112 6113 6106 5769 +g Group39154 +f 6093 6515 6516 6309 +g Group42893 +f 6046 5800 1847 6043 +g Group13708 +f 5787 6464 6517 6069 +g Group23200 +f 6077 5797 2516 6068 +g Group10162 +f 6115 5527 5697 6114 +g Group9627 +f 6053 5868 1925 6045 +g Group58210 +f 6116 6103 5876 6074 +g Group38517 +f 5953 6116 6074 5926 +g Group55470 +f 6078 5878 2592 6076 +g Group11875 +f 6117 5697 6099 +g Group31568 +f 5898 6694 6684 5897 +g Group11875 +f 6114 5697 6117 +f 6108 5724 6070 +g Group31198 +f 6119 1227 5618 6118 +g Group9417 +f 6121 83 5858 6120 +g Group54725 +f 6122 6769 6778 5985 +g Group35032 +f 6123 6771 6779 6031 +g Group9417 +f 6118 5618 83 6121 +g Group38517 +f 6120 6124 5945 5914 +g Group58210 +f 6102 6124 6120 5858 +g Group10162 +f 6107 6006 5527 6115 +g Group38517 +f 6109 6008 5529 6101 +g Group26370 +f 6122 5985 5868 6054 +g Group6677 +f 6123 6031 5927 6079 +g Group14995 +f 6125 105 3276 6126 +g Group24347 +f 6127 1324 2512 6128 +g Group58189 +f 6130 6438 6473 1226 +g Group29384 +f 6131 6130 6129 2542 +g Group3334 +f 6132 1324 6127 +g Group13104 +f 1848 6569 6572 6245 +g Group3334 +f 6133 1326 6134 +g Group55588 +f 2423 6612 6621 6258 +g Group34577 +f 6136 3552 3553 6135 +g Group32139 +f 6132 2398 6137 +f 6138 2401 6134 +g Group29384 +f 6140 6141 2512 6139 +g Group58189 +f 1208 6518 6447 6140 +g Group51726 +f 6142 2541 3281 6143 +g Group24347 +f 6144 2542 1326 6133 +g Group14995 +f 6142 174 3344 6145 +g Group51726 +f 6125 2511 3348 6146 +g Group11694 +f 6147 3211 6081 6148 +g Group25684 +f 6149 3581 6150 +g Group32468 +f 3264 6197 6228 6091 +g Group48425 +f 6151 3221 6087 6152 +g Group57450 +f 6126 3276 3362 6153 +g Group28985 +f 6155 3674 3673 6154 +g Group28645 +f 6143 3281 3366 6156 +g Group54349 +f 6158 3371 3345 6157 +g Group28985 +f 6154 3673 3682 6159 +g Group54349 +f 6161 3349 3374 6160 +g Group5904 +f 6135 3553 3674 6155 +g Group38631 +f 6162 3298 3297 6157 +g Group43668 +f 6162 6163 3296 3298 +g Group14863 +f 6145 6163 6162 3346 +f 6165 6146 3348 6164 +g Group43668 +f 3299 6165 6164 3300 +g Group38631 +f 6161 3301 3300 6164 +g Group20587 +f 6153 3362 3211 6147 +g Group57318 +f 6156 3366 3221 6151 +g Group28853 +f 6166 6218 6214 6159 +g Group57658 +f 3672 6166 6159 3682 +g Group22539 +f 6168 6554 6574 3446 +g Group59270 +f 6169 6168 6167 6094 +f 6171 6172 6089 6170 +g Group22539 +f 3447 6575 6556 6171 +g Group5772 +f 6149 6198 6235 6173 +g Group25684 +f 6174 3552 6136 +g Group32468 +f 6085 6233 6219 3216 +g Group180 +f 6176 6237 6236 6175 +f 6175 6236 6238 6177 +g Group42635 +f 6173 6235 6237 6176 +g Group57658 +f 6177 6178 3671 3681 +g Group64442 +f 6158 6220 6238 3371 +g Group29384 +f 6131 2542 6144 +g Group39154 +f 2543 6470 6519 6295 +g Group29384 +f 6128 2512 6141 +g Group33401 +f 5807 6476 6520 6297 +g Group61334 +f 6139 6222 6232 1208 +g Group62415 +f 6170 6089 6090 6150 +g Group32529 +f 6129 6231 6226 2542 +g Group13427 +f 6169 6094 2396 6137 +g Group42232 +f 6172 6065 2401 6138 +g Group62415 +f 6174 6098 6094 6167 +g Group53299 +f 6179 6416 6415 6180 +g Group5772 +f 6182 6136 6135 6181 +g Group17710 +f 6179 2514 3317 6183 +f 6184 2546 3289 6185 +g Group14409 +f 6186 6187 2515 3214 +g Group58195 +f 6188 6371 6417 6083 +g Group60073 +f 6190 3309 3297 6189 +g Group34577 +f 6191 6192 3560 3671 +g Group4630 +f 6190 6192 6191 3309 +f 6194 6195 3312 6193 +g Group34577 +f 3566 6194 6193 3672 +g Group60073 +f 6196 3301 3312 6195 +g Group32468 +f 6197 3264 6198 +g Group62415 +f 6090 6149 6150 +g Group20587 +f 6199 6311 6283 3299 +g Group50534 +f 3265 6271 6311 6199 +g Group49998 +f 6203 6376 6418 6202 +g Group14409 +f 2571 6203 6202 3235 +g Group30218 +f 6180 6415 6419 6205 +g Group180 +f 6207 6155 6154 6206 +g Group50534 +f 6208 6313 6280 3266 +g Group20587 +f 3296 6284 6313 6208 +g Group60165 +f 6185 3289 3369 6211 +g Group45497 +f 6212 3267 3260 6189 +g Group50534 +f 6208 3266 3267 6212 +f 6213 3268 3265 6199 +g Group45497 +f 6196 3263 3268 6213 +g Group180 +f 6206 6154 6159 6214 +g Group46383 +f 6201 3284 3316 6215 +g Group42635 +f 6181 6135 6155 6207 +g Group46383 +f 6183 3317 3285 6210 +g Group58891 +f 6205 6419 6411 6216 +g Group23302 +f 6211 3369 3235 6217 +g Group57658 +f 6218 6166 3672 6193 +g Group17710 +f 6215 3316 2546 6184 +g Group32468 +f 6182 3216 6219 +g Group62415 +f 6136 6098 6174 +g Group57658 +f 6191 3671 6178 6220 +g Group2582 +f 6221 6080 6148 6222 +g Group14409 +f 6186 3214 6216 +g Group11694 +f 6082 6314 6303 3213 +g Group31387 +f 6223 6305 6314 6082 +g Group6479 +f 6225 1324 2396 6224 +g Group27492 +f 6227 1326 2542 6226 +g Group52161 +f 6229 6230 6091 6228 +g Group16572 +f 6089 6229 6228 6090 +g Group6479 +f 6230 2402 1326 6227 +g Group27492 +f 6221 2512 1324 6225 +g Group31387 +f 6223 6082 6152 6231 +g Group61334 +f 6232 6307 6309 1208 +g Group14409 +f 6217 3235 6202 +g Group11694 +f 3211 6308 6306 6081 +g Group16572 +f 6233 6234 6094 6098 +g Group52161 +f 6224 6234 6233 6085 +g Group62415 +f 6197 6090 6228 +g Group64442 +f 6218 6160 3374 6214 +g Group41361 +f 6198 3264 3342 6235 +g Group62415 +f 6233 6098 6219 +g Group35769 +f 6237 3295 2441 6236 +f 6236 2441 3371 6238 +g Group12688 +f 6235 3342 3295 6237 +g Group28853 +f 6220 6178 6177 6238 +g Group31387 +f 6222 6148 6081 6232 +g Group2582 +f 6231 6152 6087 6226 +g Group53152 +f 6240 6127 6128 6239 +g Group28894 +f 6241 6623 6622 3445 +g Group51946 +f 6243 6529 6575 3447 +g Group13104 +f 6240 1848 6245 +g Group32139 +f 6127 2398 6132 +g Group13104 +f 6246 1878 6247 +g Group32139 +f 2401 6133 6134 +g Group36604 +f 6249 2597 2553 6248 +g Group62092 +f 6250 2307 3507 6251 +g Group15591 +f 6252 2452 3522 6253 +g Group36604 +f 6254 2544 2598 6255 +g Group145 +f 6256 2421 6056 6257 +g Group19180 +f 6258 6625 6624 6259 +g Group62092 +f 6260 2307 6250 +g Group15591 +f 3260 2442 3259 +g Group55091 +f 6262 3522 3566 6261 +g Group62092 +f 6252 2315 6263 +g Group15591 +f 2452 3263 3261 +g Group63984 +f 6265 3581 3582 6264 +g Group10690 +f 6266 6267 6068 6069 +g Group29725 +f 6268 6267 6266 5790 +g Group53152 +f 6269 6144 6133 6247 +g Group22606 +f 6421 6420 6271 6270 +g Group36604 +f 6272 6270 2544 6254 +g Group17569 +f 2248 6272 6254 2249 +f 6248 6273 2251 2250 +g Group36604 +f 6274 6273 6248 2553 +g Group61496 +f 6276 6416 6422 6275 +f 6278 6424 6423 6277 +g Group55091 +f 6279 3552 3446 6242 +g Group22606 +f 6426 6425 6274 6280 +g Group17569 +f 6249 2307 6260 +g Group36604 +f 2597 3260 3267 +g Group17569 +f 6263 2315 6255 +g Group36604 +f 3263 2598 3268 +g Group38415 +f 6277 6423 6427 6281 +g Group24633 +f 6283 6429 6428 6282 +g Group16276 +f 3294 3343 6264 +g Group24633 +f 6275 6422 6430 6284 +g Group1552 +f 6281 6427 6413 6285 +g Group61496 +f 6282 6428 6424 6278 +g Group25963 +f 6286 6287 2309 2440 +g Group44998 +f 6251 6287 6286 3521 +f 6288 6253 3522 6262 +g Group25963 +f 2314 6288 6262 2451 +g Group44949 +f 6279 3257 3337 6289 +g Group9859 +f 3556 6561 6524 6241 +f 3556 6290 6291 +g Group28894 +f 6292 6293 3448 6244 +g Group9859 +f 6292 3557 6293 +g Group36056 +f 6286 2440 3258 6294 +g Group44949 +f 3258 3310 6294 +f 3311 3262 6261 +g Group36056 +f 6265 3255 2400 6243 +g Group16276 +f 3337 3292 6289 +g Group39154 +f 6269 2543 6295 +g Group58189 +f 6144 6466 6436 6131 +g Group29725 +f 6268 5790 5789 6296 +f 6297 5808 5791 6298 +g Group39154 +f 6299 2513 6239 +g Group58189 +f 6141 6445 6471 6128 +g Group39154 +f 6300 6474 6521 6084 +g Group29725 +f 6302 6298 5791 6301 +g Group10690 +f 6043 6302 6301 6044 +g Group45988 +f 6257 6056 3556 6291 +g Group65023 +f 6259 6624 6626 3448 +g Group11694 +f 6304 3213 6303 +g Group49998 +f 6216 6410 6417 6186 +g Group42299 +f 6300 6084 6188 6305 +g Group12352 +f 6306 6092 6204 6307 +g Group11694 +f 6308 3211 6285 +g Group49998 +f 6202 6418 6412 6217 +g Group58189 +f 6309 6516 6518 1208 +g Group46876 +f 6629 6628 6543 6572 +f 6546 6631 6621 6573 +g Group52436 +f 5789 6467 6519 6296 +f 6297 6520 6472 5808 +g Group14995 +f 6276 174 3278 6310 +g Group1552 +f 6311 6431 6429 6283 +g Group31499 +f 6271 6420 6431 6311 +g Group57450 +f 6310 3278 3364 6312 +g Group31499 +f 6313 6432 6426 6280 +g Group1552 +f 6284 6430 6432 6313 +g Group20587 +f 6312 3364 3213 6304 +g Group58195 +f 6314 6083 6303 +g Group12352 +f 6305 6188 6083 6314 +g Group42299 +f 6307 6204 6093 6309 +g Group58195 +f 6308 6092 6306 +g Group12673 +f 6315 2546 3316 6316 +g Group21678 +f 6317 1343 3318 6318 +g Group45528 +f 6320 3288 3287 6319 +g Group12673 +f 6315 6321 3289 2546 +g Group21678 +f 6322 6321 6315 1327 +g Group23300 +f 6324 6325 2720 6323 +g Group14295 +f 3814 6324 6323 3527 +f 6326 6327 3822 3529 +g Group23300 +f 6328 6327 6326 2730 +g Group3520 +f 6330 6331 2719 6329 +g Group60051 +f 3847 6330 6329 3846 +g Group21678 +f 6332 6320 1343 6317 +g Group12673 +f 3277 6332 6317 2514 +g Group17569 +f 6335 6334 6272 2248 +f 6333 6421 6270 6334 +g Group26574 +f 6333 6334 6335 +g Group17569 +f 6337 6433 2554 6336 +f 6337 6338 2251 6273 +g Group26574 +f 6337 6336 6338 +g Group14295 +f 6325 3813 3891 6339 +g Group45528 +f 6340 3306 3290 6322 +g Group9372 +f 2545 6434 6341 3226 +g Group17569 +f 6335 2248 6342 +g Group18377 +f 6341 6434 6372 3225 +g Group26574 +f 6336 6435 6381 6344 +g Group17569 +f 6344 2251 6338 +g Group18377 +f 3227 6435 6374 6343 +g Group50424 +f 6342 2248 6345 +g Group51232 +f 3225 6379 6363 3271 +g Group23188 +f 6339 3891 3908 6346 +g Group50424 +f 6347 2251 6344 +g Group51232 +f 3272 6388 6380 3227 +g Group18265 +f 6348 3284 3226 6341 +g Group27270 +f 6349 3286 3227 6343 +g Group5407 +f 6351 2644 6350 +g Group61938 +f 3352 3303 3351 +g Group47415 +f 6319 3287 3678 6352 +g Group11286 +f 6354 6383 6384 3680 +g Group5407 +f 6355 2719 6331 +g Group61938 +f 3308 3332 3356 +g Group41346 +f 6316 3316 3284 6348 +g Group50351 +f 6318 3318 3286 6349 +g Group60051 +f 6346 3908 3846 6329 +g Group61938 +f 6356 3303 6350 +f 6355 3308 6353 +g Group59429 +f 6357 3528 2718 6345 +g Group50424 +f 6358 3529 2251 6347 +g Group19483 +f 6356 6391 6396 3303 +g Group47415 +f 6354 3680 3306 6340 +g Group14295 +f 6357 3527 6323 +f 6326 3529 6358 +g Group60051 +f 6359 6360 3879 3878 +g Group3520 +f 6351 6360 6359 2644 +g Group23300 +f 6328 2730 3273 6361 +g Group32193 +f 6361 3273 3359 6362 +g Group3520 +f 6362 3359 2644 6359 +g Group61316 +f 6363 2718 3528 6364 +g Group25187 +f 6365 6366 2730 3530 +g Group16990 +f 6367 6366 6365 3644 +g Group16878 +f 6369 3660 3661 6368 +g Group14409 +f 6370 2515 6187 6371 +g Group18377 +f 6373 3225 6372 +g Group26574 +f 6342 6333 6335 +g Group17569 +f 6336 2554 6374 +g Group14409 +f 6376 6203 2571 6375 +g Group7985 +f 6378 3612 3659 6377 +g Group51232 +f 6379 3225 6373 +g Group59429 +f 2718 6342 6345 +g Group51232 +f 6381 3227 6380 +g Group59429 +f 6344 2729 6347 +g Group28488 +f 6382 3307 6353 6383 +g Group53741 +f 6368 3661 3680 6384 +g Group25075 +f 6378 3269 3351 6385 +g Group16990 +f 6386 6387 3640 6364 +g Group25187 +f 2720 6386 6364 3528 +g Group61316 +f 6365 3530 2729 6388 +g Group16182 +f 6369 3256 2649 6389 +g Group20291 +f 6390 3677 6352 6391 +g Group57161 +f 6393 3313 3358 6392 +g Group34080 +f 6387 3270 3313 6393 +f 6394 3314 3273 6367 +g Group28488 +f 6390 3302 3360 6395 +g Group61938 +f 6385 3351 3303 6396 +g Group28488 +f 6392 3358 3307 6382 +g Group57161 +f 6395 3360 3314 6394 +g Group6227 +f 6398 1407 2515 6397 +g Group19461 +f 6399 6469 6515 6093 +g Group11264 +f 6400 6399 6375 2571 +g Group47279 +f 6402 6478 6475 6401 +g Group6227 +f 6400 2571 1409 6401 +g Group47279 +f 6398 6465 6481 6403 +g Group39082 +f 6402 2647 6404 +g Group41526 +f 5794 5819 5820 +g Group40969 +f 6404 2647 3615 6405 +g Group39082 +f 6406 2643 6403 +g Group41526 +f 5841 5811 5842 +g Group13037 +f 6407 6484 6457 2645 +g Group4840 +f 6408 6407 6377 3659 +f 6409 6405 3615 6389 +g Group13037 +f 2649 6459 6485 6409 +g Group40969 +f 6408 3659 2643 6406 +g Group49998 +f 6410 6216 6411 +g Group58195 +f 6083 6304 6303 +g Group49998 +f 6413 6217 6412 +g Group58195 +f 6285 6092 6308 +g Group11264 +f 6414 6397 2515 6370 +g Group19461 +f 6084 6521 6517 6414 +g Group61496 +f 6416 6276 6310 6415 +g Group49998 +f 6371 6187 6186 6417 +g Group58195 +f 6376 6204 6092 6418 +g Group38415 +f 6415 6310 6312 6419 +g Group1552 +f 6419 6312 6304 6411 +g Group14409 +f 6420 6421 2545 3226 +g Group53299 +f 6416 6179 6183 6422 +f 6424 6184 6185 6423 +g Group14409 +f 6425 6426 3228 2554 +g Group30218 +f 6423 6185 6211 6427 +g Group16436 +f 6429 6201 6215 6428 +f 6422 6183 6210 6430 +g Group58891 +f 6427 6211 6217 6413 +g Group53299 +f 6428 6215 6184 6424 +g Group58195 +f 6410 6083 6417 +f 6418 6092 6412 +g Group58891 +f 6431 6200 6201 6429 +g Group23302 +f 6420 3226 6200 6431 +f 6432 6209 3228 6426 +g Group58891 +f 6430 6210 6209 6432 +g Group9372 +f 6421 2545 6421 +g Group17569 +f 6421 6333 2545 +f 6433 6337 6274 6425 +g Group9372 +f 2554 6433 6425 +g Group17569 +f 2545 6333 6434 +g Group26574 +f 6434 6333 6372 +g Group18377 +f 6435 3227 6381 +g Group26574 +f 6336 6344 6338 +f 6435 6336 6374 +g Group59429 +f 6379 2718 6363 +f 6388 2729 6380 +g Group19483 +f 6383 6353 3308 6384 +g Group11286 +f 6391 6352 3678 6396 +g Group58189 +f 6436 6437 6130 6131 +g Group52436 +f 5790 6437 6436 5789 +g Group58189 +f 6438 6130 6437 +g Group5821 +f 6440 2594 6439 +g Group68 +f 5798 1927 5799 +g Group18319 +f 5973 6781 6713 6442 +g Group51174 +f 6444 5978 5977 6443 +g Group52436 +f 6445 6446 5791 5808 +g Group58189 +f 6140 6446 6445 6141 +g Group52436 +f 6447 5791 6446 +g Group5821 +f 6448 2591 6449 +g Group68 +f 1925 5809 5800 +g Group13075 +f 6451 6783 6782 6450 +g Group39487 +f 6453 5838 5837 6452 +g Group53061 +f 6443 5977 5991 6454 +g Group39487 +f 6456 5840 5839 6455 +g Group13037 +f 6457 6458 2673 2645 +g Group7284 +f 5838 6458 6457 5844 +g Group13037 +f 6453 2673 6458 +g Group7284 +f 6459 6460 5839 5847 +g Group13037 +f 2648 6460 6459 2649 +g Group7284 +f 6455 5839 6460 +g Group15380 +f 6439 2594 5900 6462 +f 6463 5906 2591 6448 +g Group14424 +f 6465 6398 6397 6464 +g Group52436 +f 6467 5789 6466 +g Group58189 +f 6295 6144 6269 +g Group19461 +f 6469 6399 6400 6468 +g Group68 +f 6440 5798 5788 6470 +g Group52436 +f 6471 5808 6472 +g Group58189 +f 6128 6299 6239 +g Group52436 +f 6473 5790 6266 6474 +g Group14424 +f 6468 6400 6401 6475 +g Group68 +f 6476 5807 5809 6449 +g Group47279 +f 6478 6402 6404 6477 +g Group13075 +f 6441 6780 6784 6479 +g Group18319 +f 6768 6785 5978 6444 +g Group49166 +f 6477 6404 6405 6480 +g Group47279 +f 6482 6406 6403 6481 +g Group13037 +f 6484 6407 6408 6483 +f 6480 6405 6409 6485 +g Group54799 +f 6486 6487 2601 2675 +g Group49046 +f 6488 6487 6486 5909 +f 6490 6491 5910 6489 +g Group54799 +f 2662 6490 6489 2677 +g Group45240 +f 6492 2675 2672 6452 +f 6456 2679 2677 6493 +g Group49166 +f 6483 6408 6406 6482 +g Group59481 +f 6495 5713 6494 +g Group65234 +f 5974 5714 5982 +g Group59481 +f 6496 5727 6497 +g Group65234 +f 5694 5983 6018 +g Group32123 +f 6499 6462 5900 5899 +g Group61194 +f 6499 6500 6494 5713 +g Group1411 +f 5899 5901 6500 6499 +f 6501 6502 5854 5905 +g Group61194 +f 5727 6496 6502 6501 +g Group26370 +f 6501 6463 5877 5727 +g Group54799 +f 6486 2675 6492 +g Group49046 +f 5909 5848 5890 +g Group253 +f 6488 5909 5890 6498 +g Group6006 +f 6491 5907 5834 6461 +g Group54799 +f 6493 2677 6489 +g Group49046 +f 5849 5910 5891 +g Group18112 +f 6503 6770 6783 6451 +g Group8360 +f 6503 5919 6073 6504 +g Group28053 +f 6505 1227 6119 6506 +g Group18112 +f 6479 6784 6779 6507 +g Group54113 +f 6508 6033 5937 6461 +f 6498 5962 6038 6509 +g Group65234 +f 6495 5974 6510 +g Group26370 +f 5713 5975 5866 +g Group22300 +f 6505 6772 6774 6510 +f 6511 6775 6778 6512 +g Group65234 +f 6511 5983 6497 +g Group26370 +f 5984 5727 5877 +g Group22685 +f 6508 6034 3620 6454 +g Group56927 +f 6442 1348 2599 6513 +g Group58814 +f 6513 2599 3583 6514 +g Group16932 +f 6509 6038 6037 6514 +g Group33401 +f 6515 6044 6301 6516 +g Group19461 +f 6464 6397 6414 6517 +g Group28053 +f 6504 6073 1209 6512 +g Group8360 +f 6506 6119 5911 6507 +g Group52436 +f 6438 5790 6473 +g Group58189 +f 6130 1226 6129 +g Group52436 +f 6518 5791 6447 +g Group58189 +f 1208 6140 6139 +g Group33401 +f 6470 5788 6296 6519 +g Group39154 +f 6476 2513 6299 6520 +g Group52436 +f 6466 5789 6436 +f 6445 5808 6471 +g Group33401 +f 6474 6266 6069 6521 +g Group52436 +f 6516 6301 5791 6518 +g Group58189 +f 6467 6295 6519 +f 6520 6299 6472 +g Group13708 +f 6469 6044 6515 +g Group19461 +f 6399 6093 6375 +g Group41526 +f 6478 5794 5793 6475 +f 6465 5786 5811 6481 +g Group7284 +f 6484 5844 6457 +g Group13037 +f 6407 2645 6377 +g Group7284 +f 6459 5847 6485 +g Group13037 +f 2649 6409 6389 +g Group13708 +f 6521 6069 6517 +g Group19461 +f 6084 6414 6370 +g Group4642 +f 6633 6632 6523 6522 +g Group9859 +f 6524 6634 6623 6241 +g Group60658 +f 1876 6595 6634 6524 +f 6527 6635 6597 1877 +g Group9859 +f 6244 6636 6635 6527 +g Group40924 +f 6530 6637 6604 3459 +g Group26187 +f 1869 6615 6637 6530 +g Group36282 +f 6533 6688 6700 6534 +g Group14735 +f 6535 6638 6616 6536 +g Group37779 +f 6537 1867 5763 6538 +f 6539 3468 5766 6540 +g Group32139 +f 6543 6542 6240 6245 +f 6127 6542 6541 2398 +g Group46876 +f 6541 6542 6543 +g Group32139 +f 6544 6545 6133 2401 +f 6545 6546 6246 6247 +g Group46876 +f 6545 6544 6546 +g Group65534 +f 6547 5642 6055 6548 +g Group59724 +f 6550 6716 6760 5767 +f 5774 6748 6717 6550 +g Group56969 +f 6552 6639 6619 6551 +g Group37276 +f 6553 6620 6640 6554 +g Group22539 +f 6063 6168 6169 +g Group37276 +f 6556 6641 6626 6555 +g Group22539 +f 6171 6065 6172 +g Group34569 +f 6532 6649 6701 6557 +g Group26187 +f 6558 6642 6578 1867 +g Group40924 +f 3462 6605 6642 6558 +g Group42062 +f 6562 1876 6561 +f 5764 3556 5771 +f 6563 1877 6564 +f 3557 5766 5773 +g Group9859 +f 6527 1877 6563 +f 6244 3557 6292 +g Group60578 +f 6566 6617 6607 6565 +g Group52228 +f 6049 6698 6685 1929 +g Group60578 +f 6533 6581 6618 6567 +g Group52228 +f 1912 6687 6699 6105 +g Group34569 +f 6534 6700 6676 6560 +g Group36282 +f 6557 6701 6686 6565 +g Group59724 +f 6568 6755 6764 5743 +f 5742 6723 6756 6568 +g Group45307 +f 1848 5754 6569 +f 5757 1878 6570 +g Group42062 +f 6562 5764 6538 +g Group37779 +f 6558 1867 6537 +g Group42062 +f 6540 5766 6564 +g Group37779 +f 6539 1869 6530 +g Group4642 +f 6549 6643 6644 6571 +g Group45841 +f 6566 6048 6536 +g Group14735 +f 6571 6644 6638 6535 +g Group45841 +f 6548 6055 6567 +g Group14735 +f 6547 6593 6633 6522 +g Group22539 +f 6553 6063 6551 +g Group65023 +f 3445 6257 6291 +g Group27841 +f 6569 6610 6629 6572 +g Group13104 +f 6570 1878 6246 6573 +g Group37276 +f 6554 6640 6622 6574 +g Group22539 +f 6168 3446 6167 +g Group37276 +f 6575 6645 6641 6556 +g Group22539 +f 3447 6171 6170 +g Group51946 +f 6526 6242 3446 6574 +g Group1147 +f 6529 6636 6645 6575 +g Group42232 +f 6577 2401 6065 6576 +g Group9859 +f 6561 1876 6524 +f 3556 6241 6290 +g Group22539 +f 6576 6065 6555 +g Group65023 +f 6259 3448 6293 +g Group32139 +f 6552 2398 6541 +f 6543 6245 6572 +g Group46876 +f 6541 6627 6639 6552 +g Group32139 +f 6544 2401 6577 +f 6573 6246 6546 +g Group46876 +f 6577 6625 6630 6544 +g Group31773 +f 6578 6703 6702 6579 +g Group51019 +f 6581 6533 6534 6580 +g Group1497 +f 6583 5767 5768 6582 +g Group53710 +f 6585 6586 2455 6584 +g Group25963 +f 2318 6585 6584 2317 +g Group50565 +f 6588 6589 2414 6587 +g Group22818 +f 2245 6588 6587 2279 +f 6584 6590 2246 2317 +g Group50565 +f 6591 6590 6584 2455 +g Group14735 +f 6593 6547 6548 6592 +g Group60658 +f 6595 1876 6594 +f 6596 1877 6597 +g Group25963 +f 6587 6598 2280 2279 +g Group53710 +f 6599 6598 6587 2414 +g Group36056 +f 6586 6660 6704 6600 +g Group32911 +f 6601 2397 6594 +g Group60658 +f 5782 1876 5763 +g Group32911 +f 6596 2399 6602 +g Group60658 +f 1877 5783 5765 +g Group49306 +f 6604 6532 6557 6603 +f 6580 6534 6560 6605 +g Group65320 +f 6582 5768 5758 6606 +g Group51019 +f 6603 6557 6565 6607 +g Group36056 +f 6579 6702 6669 6599 +g Group55761 +f 6609 5754 5755 6608 +g Group60044 +f 6610 6569 5754 6609 +f 6611 5757 6570 6612 +g Group55761 +f 6606 5758 5757 6611 +g Group29244 +f 6614 2347 5709 6613 +g Group31773 +f 6600 6704 6705 6615 +g Group32911 +f 6589 2397 6601 +g Group60658 +f 2414 5782 5747 +g Group32911 +f 6602 2399 6591 +g Group60658 +f 5783 2455 5779 +g Group27531 +f 6613 5709 2422 6608 +g Group60578 +f 6617 6566 6536 6616 +f 6592 6548 6567 6618 +g Group37276 +f 6620 6553 6551 6619 +g Group27841 +f 6612 6570 6573 6621 +g Group1147 +f 6623 6526 6574 6622 +g Group56969 +f 6625 6577 6576 6624 +g Group37276 +f 6624 6576 6555 6626 +g Group9087 +f 6628 6629 6256 6627 +g Group46876 +f 6543 6628 6627 6541 +f 6630 6631 6546 6544 +g Group9087 +f 6621 6631 6630 6258 +g Group32389 +f 6632 6633 2347 6614 +g Group4642 +f 6523 6632 6614 5742 +g Group47648 +f 6634 6525 6526 6623 +g Group32911 +f 6595 2394 6525 6634 +f 6635 6528 2400 6597 +g Group47648 +f 6636 6529 6528 6635 +g Group13177 +f 6637 6531 6532 6604 +g Group63976 +f 6615 6705 6650 6531 +g Group42482 +f 6638 2425 6047 6616 +g Group19180 +f 6639 6256 6257 6619 +g Group65023 +f 6620 3445 6640 +f 6641 3448 6626 +g Group63976 +f 6559 6677 6703 6578 +g Group13177 +f 6605 6560 6559 6642 +g Group22789 +f 6617 1928 6607 +f 6581 1911 6618 +g Group4642 +f 6583 6643 6549 5767 +g Group32389 +f 6644 6643 6583 2425 +g Group42482 +f 6644 2425 6638 +f 6593 2347 6633 +g Group55588 +f 6610 2421 6256 6629 +g Group65023 +f 6640 3445 6622 +f 6645 3448 6641 +g Group28894 +f 6636 6244 3448 6645 +g Group9087 +f 6627 6256 6639 +f 6625 6258 6630 +g Group53349 +f 5617 2471 6646 +g Group29653 +f 6647 6715 6786 6648 +g Group63976 +f 6649 6532 6531 6650 +g Group34127 +f 6651 1931 5638 6652 +g Group52262 +f 6653 1872 3465 6654 +g Group58649 +f 6655 1874 3464 6656 +g Group2253 +f 6647 1907 2420 6657 +g Group25963 +f 6658 6659 6585 2318 +g Group32350 +f 6660 6659 6658 2456 +f 6661 2470 2456 6658 +g Group16353 +f 6662 6663 2470 6661 +g Group9966 +f 2241 6662 6661 2327 +f 6664 6665 2242 2281 +g Group16353 +f 6666 6665 6664 2418 +g Group32350 +f 6668 6669 2415 6667 +g Group25963 +f 6598 6668 6667 2280 +f 6664 2281 2280 6667 +g Group2253 +f 6670 2417 1913 6671 +g Group12346 +f 6657 2420 5648 6672 +g Group20059 +f 6663 2387 1872 6653 +g Group26446 +f 6666 2418 1874 6655 +g Group2265 +f 6673 6787 6786 2507 +g Group61414 +f 5721 6753 6787 6673 +g Group29653 +f 6675 6788 6721 6671 +g Group63976 +f 6677 6559 6560 6676 +g Group22855 +f 6654 3465 5731 6678 +g Group29242 +f 6656 3464 5705 6679 +g Group18262 +f 6680 2507 6066 6681 +g Group11875 +f 6682 5724 6100 6683 +g Group37955 +f 6684 2472 5617 6646 +g Group52228 +f 6686 1929 6685 +g Group45841 +f 6565 6048 6566 +g Group12346 +f 6652 5638 2417 6670 +g Group52228 +f 6687 1912 6688 +g Group45841 +f 6055 6533 6567 +g Group34127 +f 6672 5648 1932 6689 +g Group37955 +f 6690 2526 6691 +g Group31568 +f 5904 6100 6108 +g Group24568 +f 6678 5731 1931 6651 +g Group30955 +f 6679 5705 1914 6689 +g Group61414 +f 6692 6789 6738 5738 +g Group2265 +f 2539 6788 6789 6692 +g Group37955 +f 6695 2472 6694 +g Group31568 +f 6099 5898 6117 +g Group53349 +f 5902 5901 6696 +g Group37955 +f 6696 5625 2526 6697 +g Group31568 +f 6695 6099 6681 +g Group18262 +f 6673 2507 6680 +g Group31568 +f 6683 6100 6691 +g Group18262 +f 6682 2539 6692 +g Group65534 +f 5635 6048 6698 +f 6055 5642 6699 +g Group37955 +f 6697 2526 6690 +f 6694 2472 6684 +g Group42669 +f 6688 1912 5704 6700 +g Group40956 +f 6649 3460 5729 6701 +g Group45841 +f 6698 6048 6685 +f 6687 6055 6699 +g Group40956 +f 6700 5704 3463 6676 +g Group42669 +f 6701 5729 1929 6686 +g Group38160 +f 6703 1868 5748 6702 +g Group42443 +f 6660 2456 5780 6704 +f 6702 5748 2415 6669 +g Group38160 +f 6704 5780 1870 6705 +g Group4827 +f 6705 1870 6650 +g Group63976 +f 6615 6531 6637 +g Group4827 +f 6677 1868 6703 +g Group63976 +f 6559 6578 6642 +g Group57748 +f 6707 1322 6706 +g Group24637 +f 6042 2390 6041 +g Group21973 +f 5818 6938 6939 6832 +g Group1244 +f 6710 2569 6711 +g Group33669 +f 5588 5968 5969 +g Group24072 +f 6712 1348 6442 6713 +g Group8640 +f 6706 6714 6657 2390 +g Group41751 +f 6715 6714 6706 1322 +g Group59724 +f 6716 6550 6717 +g Group57748 +f 6718 1320 6719 +g Group24637 +f 2427 6061 6060 +g Group41751 +f 6720 6721 1320 6718 +g Group8640 +f 6670 6720 6718 2427 +g Group56579 +f 6722 6723 5742 5778 +g Group34065 +f 6725 6797 6846 5815 +g Group48443 +f 6726 5589 5872 6727 +g Group1244 +f 6729 2509 6728 +g Group33669 +f 5979 5603 5980 +g Group59753 +f 6730 6814 6861 5996 +g Group53023 +f 6732 1195 6733 +g Group19912 +f 5603 5967 6001 +g Group28776 +f 6735 6913 6925 6734 +g Group61201 +f 6002 6735 6734 1403 +g Group59701 +f 6737 5532 5738 6738 +g Group44773 +f 6740 6919 6940 6739 +g Group19912 +f 6741 5588 6742 +g Group46695 +f 6740 5535 5950 6743 +g Group19912 +f 6732 5603 6744 +g Group16018 +f 6745 6942 6941 6746 +g Group11905 +f 6747 1292 5624 6748 +g Group61201 +f 6739 6749 5999 1405 +g Group49109 +f 6730 6924 6940 5687 +g Group28632 +f 6750 6841 6865 6015 +g Group11662 +f 6751 5533 1403 6734 +g Group14270 +f 6751 6926 6943 6752 +g Group22441 +f 6722 5706 6722 +g Group54866 +f 6722 1924 5706 +g Group59701 +f 6753 5721 5526 6754 +g Group59724 +f 6755 6568 6756 +g Group11905 +f 6757 1266 6067 6758 +g Group24154 +f 6759 6760 1291 5710 +g Group44330 +f 6761 5776 6061 6762 +f 6763 5744 5743 6764 +g Group54866 +f 5710 1935 6759 +g Group22441 +f 5710 6759 6759 +g Group60328 +f 6928 6944 5629 6765 +g Group27217 +f 6766 6930 6867 1348 +g Group57183 +f 6767 5830 6450 6768 +g Group27217 +f 6767 1360 6765 +g Group60328 +f 5830 5629 5850 +g Group27217 +f 6766 1348 6712 +g Group60328 +f 5653 5823 5851 +g Group65186 +f 6727 5872 1347 6724 +g Group32761 +f 6746 6941 6945 6708 +g Group2607 +f 6770 6503 6504 6769 +g Group22300 +f 6772 6505 6506 6771 +g Group62200 +f 6743 5950 5589 6726 +g Group29775 +f 6752 6943 6942 6745 +g Group19912 +f 6773 5966 5967 6733 +g Group57093 +f 6737 5531 5966 6773 +g Group33669 +f 6710 5588 6741 +g Group26370 +f 5975 5713 6774 +g Group33669 +f 6744 5603 6728 +g Group26370 +f 5727 5984 6775 +g Group53023 +f 6776 1171 6742 +g Group19912 +f 5997 5588 5998 +g Group57093 +f 6777 6007 5544 6754 +g Group19912 +f 6776 5997 6007 6777 +g Group1244 +f 6711 2569 6750 +f 6731 2509 6729 +g Group24637 +f 6707 6042 6758 +g Group11905 +f 6763 1266 6757 +g Group24637 +f 6762 6061 6719 +g Group11905 +f 6761 1292 6747 +g Group22300 +f 6769 6504 6512 6778 +g Group2607 +f 6771 6506 6507 6779 +g Group18319 +f 6780 6781 5973 5972 +g Group51430 +f 6713 6781 6780 6441 +g Group45500 +f 6783 5987 5986 6782 +f 6780 5972 6021 6784 +g Group51430 +f 6785 6768 6450 6782 +g Group18319 +f 5978 6785 6782 5986 +g Group50537 +f 6770 6030 5987 6783 +f 6784 6021 6031 6779 +g Group54725 +f 6772 5976 5975 6774 +f 6775 5984 5985 6778 +g Group27299 +f 6716 1291 6760 +g Group59724 +f 6550 5767 6549 +g Group27299 +f 6748 5624 6717 +g Group59724 +f 5774 6550 6549 +g Group27299 +f 6755 5622 6764 +g Group59724 +f 6568 5743 6523 +g Group27299 +f 6723 1265 6756 +g Group59724 +f 5742 6568 6523 +g Group62764 +f 6715 1322 2507 6786 +g Group34690 +f 6787 6674 6648 6786 +g Group28303 +f 6753 5720 6674 6787 +g Group62764 +f 6788 2539 1320 6721 +g Group28303 +f 6789 6693 5737 6738 +g Group34690 +f 6788 6675 6693 6789 +g Group39113 +f 6791 5620 5621 6790 +g Group65186 +f 6792 1359 6708 6793 +g Group48985 +f 6794 5585 5859 6795 +g Group32761 +f 6797 6890 6935 6724 +g Group19939 +f 6798 5881 5931 6799 +g Group32823 +f 6800 2666 3623 6801 +g Group1702 +f 6802 6946 6908 3611 +g Group54354 +f 6804 5846 5935 6805 +g Group40668 +f 5575 7126 7095 6806 +g Group17702 +f 5990 7124 7094 5994 +g Group31109 +f 6809 5564 5552 6808 +f 6810 3607 6801 +g Group62230 +f 6808 3623 6809 +g Group31109 +f 6811 5556 5575 6806 +f 6803 3611 6812 +g Group62230 +f 3624 6811 6806 +g Group61743 +f 6813 2509 6731 6814 +g Group30936 +f 6815 5508 2666 6800 +g Group65351 +f 6816 6947 6946 6802 +g Group43325 +f 6818 5692 5688 6817 +g Group31109 +f 6819 6915 6906 3607 +f 5552 6899 6914 6819 +g Group62230 +f 6808 6819 6810 +g Group31109 +f 6820 6917 6901 5556 +f 3611 6907 6916 6820 +g Group62230 +f 6820 6811 6812 +g Group40668 +f 6809 7112 7127 5564 +g Group17702 +f 6012 7111 7125 5992 +g Group47237 +f 6818 5534 5948 6822 +g Group29554 +f 6823 6824 5620 6791 +g Group63969 +f 2510 7030 7026 6823 +g Group21287 +f 7038 7037 6825 6949 +g Group7530 +f 6815 6911 6949 6825 +f 6827 6950 6947 6816 +g Group21287 +f 6827 7040 7041 6950 +g Group20400 +f 5599 7068 7128 6952 +g Group192 +f 6830 2556 6831 +f 6833 5818 6832 +g Group31313 +f 6831 5630 6830 +g Group192 +f 6835 2478 6834 +f 6836 6796 5824 5852 +g Group31313 +f 5654 6835 6834 +g Group14570 +f 6837 5655 5873 6838 +g Group7992 +f 6840 2570 5498 6839 +g Group27328 +f 6817 5688 6736 6841 +g Group12204 +f 6842 5530 2509 6813 +g Group20400 +f 6953 7129 7121 5592 +g Group12822 +f 6842 5693 5952 6843 +g Group63969 +f 6844 7034 7031 2570 +g Group29554 +f 6829 6844 6840 5656 +g Group32505 +f 6846 1347 2600 6845 +g Group34392 +f 6845 2600 3584 6847 +g Group32505 +f 6848 2661 1359 6792 +g Group34392 +f 6849 3621 2661 6848 +g Group192 +f 6833 6850 5850 5818 +f 5628 6850 6831 2556 +g Group31313 +f 6831 6850 6833 +g Group192 +f 6835 6851 5619 2478 +f 6851 6836 5852 5851 +g Group31313 +f 6851 6835 6836 +g Group192 +f 6795 5859 2556 6830 +g Group3196 +f 6852 5881 6852 +g Group32678 +f 6849 5836 6026 6853 +g Group37611 +f 2602 5888 6854 5887 +g Group63799 +f 6847 3584 6027 6855 +g Group31313 +f 6838 5873 5654 6834 +g Group4323 +f 6856 5930 6799 +g Group35444 +f 6025 5931 6032 +g Group19939 +f 5881 6798 6852 +g Group4323 +f 6805 5935 6857 +g Group35444 +f 5936 6027 6028 +g Group19939 +f 6854 6804 5887 +g Group37611 +f 5892 5562 6858 +f 5572 5893 6859 +g Group62742 +f 6822 5948 5585 6794 +g Group28327 +f 6843 5952 5655 6837 +g Group17702 +f 6860 5993 5994 6807 +g Group277 +f 6861 5995 5495 6790 +g Group2578 +f 6863 5562 5563 6862 +g Group37611 +f 6858 5562 6863 +g Group3196 +f 5940 6009 6011 +g Group17702 +f 6821 6012 6010 6862 +g Group37611 +f 6864 5572 6859 +g Group3196 +f 6013 5943 6014 +g Group2578 +f 6860 5573 5572 6864 +g Group31398 +f 6865 6003 5657 6839 +g Group35444 +f 6856 6025 6853 +g Group4323 +f 5930 6026 5957 +g Group35444 +f 6855 6027 6857 +g Group4323 +f 6023 5935 5959 +g Group53094 +f 6832 6939 6945 5630 +g Group65186 +f 6797 6724 1347 6846 +g Group28632 +f 6814 6731 5995 6861 +g Group59753 +f 6841 6736 6003 6865 +g Group39739 +f 6867 5815 5816 6866 +g Group5045 +f 6868 2265 3694 6869 +g Group50248 +f 6870 1923 3696 6871 +g Group12158 +f 6872 1916 2284 6873 +g Group21717 +f 6874 1918 3698 6875 +g Group8587 +f 6877 6878 2336 6876 +g Group28920 +f 2157 6877 6876 2335 +g Group8587 +f 6879 2346 2336 6878 +g Group58126 +f 6879 7061 7063 2346 +g Group46677 +f 6881 7062 7064 2267 +f 6883 6884 2266 6880 +g Group1474 +f 2185 6883 6880 2186 +f 6881 6885 2187 2188 +g Group46677 +f 6886 6885 6881 2267 +g Group28920 +f 6873 6887 2208 2283 +g Group8587 +f 6888 6887 6873 2284 +g Group28920 +f 6882 2212 2211 6888 +g Group12158 +f 6876 2336 1918 6874 +g Group21973 +f 6889 5824 6796 6890 +g Group16018 +f 6892 6726 6727 6891 +g Group60894 +f 7067 7130 5657 6893 +g Group41626 +f 6866 5816 5831 6895 +g Group35724 +f 6896 2602 3859 6897 +g Group5045 +f 6884 2265 6868 +g Group20939 +f 6898 2635 5553 6899 +g Group5045 +f 6870 2268 6886 +g Group606 +f 6900 2641 5556 6901 +g Group39739 +f 6903 5833 5817 6902 +g Group22035 +f 6904 2632 6905 +g Group1702 +f 3607 6800 6801 +f 6904 3607 6906 +g Group22035 +f 2632 3608 2633 +g Group1702 +f 6907 3611 6908 +g Group22035 +f 3610 2638 2639 +g Group41626 +f 6909 5836 5833 6903 +g Group19052 +f 6869 3694 2635 6898 +g Group64255 +f 6871 3696 2641 6900 +g Group35724 +f 6875 3698 2663 6910 +g Group21717 +f 6897 3859 1916 6872 +g Group65351 +f 6911 6815 6800 6905 +g Group61201 +f 6913 6735 6002 6912 +g Group31109 +f 6915 6819 6914 +f 6917 6820 6916 +g Group14270 +f 6919 6740 6743 6918 +g Group19553 +f 6894 1920 6826 6920 +g Group40561 +f 6921 7120 7105 5494 +g Group61201 +f 6923 5999 6749 6924 +g Group44773 +f 6926 6751 6734 6925 +g Group39886 +f 6922 7118 7131 6927 +g Group6884 +f 6902 5817 6709 6928 +g Group60328 +f 6889 6929 5653 5824 +g Group39995 +f 6930 6929 6889 6725 +g Group37611 +f 6910 2663 5882 6932 +g Group57944 +f 6896 2601 5908 6933 +g Group5497 +f 6895 5831 6023 6934 +g Group32761 +f 6891 6727 6724 6935 +g Group54354 +f 6932 5882 5835 6931 +g Group9151 +f 6933 5908 5845 6936 +g Group29775 +f 6918 6743 6726 6892 +g Group42678 +f 6931 5957 6026 6937 +g Group32846 +f 6912 6002 5512 6893 +g Group53179 +f 6923 5996 5621 6921 +g Group42678 +f 6934 6023 5959 6936 +g Group5497 +f 6937 6026 5836 6909 +g Group1640 +f 6938 6709 6793 6939 +g Group49109 +f 6913 6736 5688 6925 +g Group65106 +f 6919 5693 5687 6940 +g Group36351 +f 6942 5631 5860 6941 +g Group28776 +f 6924 6749 6739 6940 +g Group34603 +f 6926 5692 5949 6943 +g Group39995 +f 6944 6928 6709 6938 +g Group60328 +f 6944 6938 5818 5629 +g Group6884 +f 6930 6725 5815 6867 +g Group53094 +f 6941 5860 5630 6945 +g Group50108 +f 6943 5949 5631 6942 +g Group53094 +f 6890 6796 5654 6935 +g Group22035 +f 6946 2638 6908 +g Group1702 +f 6802 3611 6803 +g Group20148 +f 6947 5509 2638 6946 +g Group51442 +f 6915 3608 6906 +g Group31109 +f 6819 3607 6810 +g Group51442 +f 6899 5553 6914 +g Group31109 +f 5552 6819 6808 +g Group51442 +f 6917 5555 6901 +g Group31109 +f 6820 5556 6811 +g Group51442 +f 6907 3610 6916 +g Group31109 +f 3611 6820 6812 +g Group53255 +f 6948 7038 6986 5599 +g Group27863 +f 6911 5507 5598 6949 +f 6950 5601 5509 6947 +g Group41620 +f 6950 7041 6988 5601 +g Group20214 +f 6829 7114 7132 7033 +g Group53968 +f 6826 7036 7042 6920 +f 6927 7043 7039 6828 +g Group8765 +f 6927 7131 7133 7043 +g Group32761 +f 6939 6793 6708 6945 +g Group29074 +f 6954 7352 7351 6955 +g Group27412 +f 6957 3153 3154 6956 +g Group63351 +f 6958 1277 3157 6959 +g Group18302 +f 6960 7353 7338 2358 +g Group29937 +f 1278 7317 7353 6960 +g Group12402 +f 6963 7135 7162 3162 +g Group58737 +f 6965 1374 3165 6966 +g Group34010 +f 6967 2548 5344 6968 +g Group21753 +f 6969 6970 3170 2610 +g Group33388 +f 6971 6970 6969 1373 +g Group56517 +f 6972 6973 5699 2416 +g Group2616 +f 6974 6973 6972 1873 +g Group42740 +f 6975 1332 5541 6976 +g Group11994 +f 6978 5700 5702 6977 +g Group47534 +f 6979 1910 5531 6980 +g Group64496 +f 6981 2388 5640 6982 +g Group35949 +f 6983 1838 5445 6984 +g Group27863 +f 6986 5598 5507 6985 +f 6987 5509 5601 6988 +g Group47354 +f 6989 1249 6990 +g Group3828 +f 5382 7247 7229 5380 +g Group47354 +f 6991 1277 6958 +g Group3828 +f 5384 7231 7249 5383 +g Group51716 +f 6989 2389 3199 6992 +g Group29937 +f 6993 7354 7355 1250 +g Group18302 +f 2444 7314 7354 6993 +g Group39315 +f 6962 7141 7164 3159 +g Group39156 +f 6995 7145 7205 5393 +g Group5402 +f 7260 7357 7319 7236 +g Group27412 +f 6967 3168 3151 6997 +g Group17031 +f 6977 5702 5725 6998 +g Group11994 +f 6999 5726 5698 6974 +g Group47102 +f 6975 2658 3203 7000 +g Group33388 +f 7002 7003 1331 7001 +g Group21753 +f 3204 7002 7001 2721 +g Group31105 +f 6965 2609 5565 7004 +g Group2468 +f 7005 3116 5465 7006 +g Group10595 +f 7007 3091 5662 7008 +g Group61196 +f 7010 5518 5516 7009 +g Group38320 +f 6959 3157 1278 6960 +g Group22071 +f 6966 7011 5356 3166 +g Group26685 +f 6992 3199 2444 6993 +g Group33706 +f 7000 7012 5355 3163 +g Group22243 +f 6968 5344 5434 7013 +g Group34010 +f 7014 5349 2490 6956 +g Group33388 +f 6969 7011 5357 1373 +g Group21753 +f 7001 7012 5359 2721 +g Group3828 +f 5380 7230 7280 7015 +g Group10595 +f 6981 3116 7005 +g Group22243 +f 6995 5393 5349 7014 +g Group3828 +f 7016 7286 7232 5384 +g Group10595 +f 7017 3091 7007 +g Group533 +f 7003 7209 7212 1331 +g Group39047 +f 6997 7299 7303 231 +g Group2468 +f 6984 5445 3091 7017 +g Group29074 +f 6996 7356 7310 6963 +g Group35949 +f 7006 5465 1873 6972 +g Group15422 +f 7019 5503 3105 7018 +g Group39498 +f 7020 1879 6985 +f 6987 1846 7009 +g Group3787 +f 7021 5519 5518 7010 +g Group7295 +f 7018 3105 1879 7020 +g Group7707 +f 6976 5541 5503 7019 +g Group17031 +f 7022 5739 5726 6999 +g Group47534 +f 7023 5544 1908 7024 +g Group61608 +f 7004 5565 5519 7021 +g Group63969 +f 7025 6824 6823 7026 +g Group59169 +f 7027 5595 1837 7024 +g Group7390 +f 7028 5596 5595 7027 +g Group3470 +f 7030 2510 5510 7029 +f 7028 5496 2570 7031 +g Group7390 +f 7032 5613 5606 7029 +g Group59169 +f 6979 1845 5613 7032 +g Group20741 +f 6982 5640 5380 7015 +g Group32376 +f 7008 5662 5372 7016 +g Group63969 +f 7034 6844 6829 7033 +g Group2616 +f 7035 6978 1838 6983 +g Group56517 +f 5701 7035 6983 2419 +g Group28666 +f 7023 5551 6998 +g Group17031 +f 5544 5725 5720 +g Group28666 +f 7022 5543 6980 +g Group17031 +f 5739 5531 5737 +g Group10068 +f 7030 5593 7026 +g Group63969 +f 2510 6823 6791 +g Group32922 +f 7037 7038 6948 7036 +g Group21287 +f 6825 7037 7036 6826 +f 7039 7040 6827 6828 +g Group32922 +f 7041 7040 7039 6951 +g Group10068 +f 7034 5607 7031 +g Group63969 +f 6844 2570 6840 +g Group41620 +f 7038 6949 5598 6986 +g Group53255 +f 7041 6951 5592 6988 +g Group31849 +f 7033 7132 7128 5659 +g Group67 +f 7036 6948 6952 7042 +f 7043 6953 6951 7039 +g Group20400 +f 7043 7133 7129 6953 +g Group8969 +f 7045 5367 5368 7044 +g Group59807 +f 7046 1921 3700 7047 +g Group56403 +f 7049 7050 2186 7048 +g Group2316 +f 1404 7049 7048 2184 +f 7051 7052 1406 2212 +g Group56403 +f 7053 7052 7051 2188 +g Group40495 +f 7054 2668 7055 +g Group51944 +f 5505 5970 5971 +g Group59773 +f 7056 7057 3119 3109 +g Group48324 +f 7058 7057 7056 3183 +g Group2316 +f 7050 1828 7059 +f 7060 1880 7053 +g Group1474 +f 7048 2186 6880 7061 +g Group12923 +f 7051 2212 6882 7062 +g Group50248 +f 7063 2266 1921 7046 +g Group61697 +f 7064 2285 1922 7065 +g Group29112 +f 7066 1920 6894 7067 +g Group18092 +f 7069 5658 5659 7068 +g Group40495 +f 7071 2666 7070 +g Group51944 +f 5988 5517 5989 +g Group10165 +f 7072 2667 5564 7073 +g Group8278 +f 7074 2669 3884 7075 +g Group48324 +f 7077 7078 3208 7076 +g Group59773 +f 3085 7077 7076 3084 +g Group35649 +f 7079 3108 1880 7060 +g Group43776 +f 7080 3109 3108 7079 +f 7081 3126 3084 7082 +g Group35649 +f 7059 1828 3126 7081 +g Group51425 +f 7083 5663 5658 7069 +g Group45349 +f 7085 2147 2330 7084 +g Group59773 +f 7056 3109 7080 +g Group48324 +f 3183 2165 3182 +g Group23293 +f 7058 3183 3182 7086 +g Group45349 +f 7087 2256 2166 7086 +g Group51478 +f 7088 3195 3816 7089 +g Group53365 +f 7090 3201 3590 7091 +g Group37471 +f 7087 3191 3862 7092 +g Group35407 +f 3655 5359 7093 +g Group34742 +f 7078 3209 2147 7085 +g Group59773 +f 7082 3084 7076 +g Group48324 +f 2146 3208 3180 +g Group6253 +f 7094 3624 6806 7095 +g Group35407 +f 5356 3603 7091 +g Group53365 +f 7093 3641 3195 7088 +g Group8278 +f 7047 3700 2667 7072 +g Group59807 +f 7075 3884 1923 7065 +g Group37471 +f 7089 3816 3181 7084 +g Group51478 +f 7092 3862 3201 7090 +g Group49156 +f 5413 7210 7201 7096 +g Group37707 +f 5413 7096 7096 +g Group59552 +f 7098 5660 5670 7097 +g Group58508 +f 7099 5375 5578 7100 +g Group20418 +f 7099 2489 3150 7101 +g Group23475 +f 7102 5396 5579 7103 +g Group60923 +f 7044 7096 5354 3164 +f 7104 7101 3150 5358 +g Group37707 +f 7104 5414 7104 +g Group49156 +f 7104 7213 7203 5414 +g Group61967 +f 7105 1909 5600 7106 +g Group7880 +f 7066 5512 5614 7107 +g Group40388 +f 7108 5374 7109 +g Group51837 +f 5373 5689 5679 +g Group40388 +f 7110 5396 7102 +g Group51837 +f 5691 5378 5673 +g Group17702 +f 7111 6012 6821 7112 +g Group10165 +f 7113 5575 2669 7074 +g Group23475 +f 7100 5578 5374 7108 +g Group58508 +f 7103 5579 5367 7045 +g Group39886 +f 7115 6894 6920 7114 +g Group48210 +f 7106 5600 5506 7116 +g Group59659 +f 7107 5614 5517 7117 +g Group60894 +f 7118 7119 5621 5620 +g Group49445 +f 7120 7119 7118 6922 +g Group6643 +f 7122 1846 5592 7121 +g Group39976 +f 7098 3093 1846 7122 +g Group48103 +f 7083 3105 5513 7123 +g Group51837 +f 7097 5670 5689 7109 +f 7110 5691 5681 7123 +g Group51944 +f 7054 5505 7116 +f 7117 5517 7070 +g Group42382 +f 7055 2668 3624 7124 +f 7125 3623 2666 7071 +g Group40668 +f 7126 5575 7113 +g Group52117 +f 6807 5573 6860 +g Group40668 +f 7073 5564 7127 +g Group52117 +f 5563 6821 6862 +f 7126 6807 7095 +g Group6253 +f 7124 3624 7094 +g Group52117 +f 7112 6821 7127 +g Group6253 +f 7111 3623 7125 +g Group31849 +f 7068 5659 7128 +g Group20400 +f 5599 6952 6948 +g Group31849 +f 7129 5633 7121 +g Group20400 +f 6953 5592 6951 +g Group46677 +f 7061 6880 2266 7063 +g Group58126 +f 7062 6882 2285 7064 +g Group49445 +f 7130 7067 6894 7115 +g Group60894 +f 5657 7130 7115 5656 +g Group29112 +f 7120 6922 1909 7105 +g Group51335 +f 7118 5620 6824 7131 +g Group8765 +f 7114 6920 7042 7132 +g Group20214 +f 7131 6824 7025 7133 +g Group20400 +f 7132 7042 6952 7128 +g Group31849 +f 7133 7025 5633 7129 +g Group50950 +f 7135 7311 7355 6964 +g Group42339 +f 7136 1318 3079 7137 +g Group42312 +f 7139 5369 5370 7138 +g Group24037 +f 7141 7318 7352 6954 +g Group15426 +f 7142 2505 3067 7143 +g Group54434 +f 7144 3169 6971 7145 +g Group42312 +f 7147 5395 5394 7146 +g Group10303 +f 5032 7149 7420 7423 +g Group19677 +f 5025 7424 7150 3008 +g Group2321 +f 7152 7245 7252 5402 +g Group40944 +f 7153 7254 7282 5397 +g Group55090 +f 7155 5411 5412 7154 +g Group64370 +f 7156 3148 5437 7157 +g Group39047 +f 7159 337 2490 7158 +g Group59333 +f 7134 7160 3155 1250 +g Group32420 +f 7161 7160 7134 2518 +g Group64346 +f 7162 3161 1318 7136 +g Group32420 +f 7163 7156 2484 7140 +g Group59333 +f 3157 7163 7140 1278 +g Group37433 +f 7164 3152 2505 7142 +g Group52552 +f 7144 5392 5415 7165 +g Group32315 +f 7166 7261 7233 5450 +g Group39047 +f 7168 2548 231 7167 +g Group16444 +f 7169 7501 7500 7170 +g Group26426 +f 7171 5027 5307 7172 +g Group24020 +f 7149 7502 7503 5031 +g Group14646 +f 5032 7484 7502 7149 +g Group21389 +f 7176 7177 5033 7175 +g Group48302 +f 4996 7176 7175 5034 +g Group50992 +f 7178 3031 5311 7179 +g Group2033 +f 1281 7488 7504 7180 +g Group24020 +f 5025 7501 7504 7151 +g Group24079 +f 7181 3010 5309 7182 +g Group48302 +f 7183 7184 5009 5036 +g Group21389 +f 7171 7184 7183 5027 +g Group33459 +f 7185 5028 5240 7186 +f 7187 5026 5317 7188 +g Group29255 +f 7189 5074 5482 7190 +g Group9985 +f 7191 5076 3031 7178 +g Group2342 +f 7192 5067 5476 7193 +g Group48608 +f 7194 5069 3010 7181 +g Group63217 +f 7146 5394 5411 7155 +g Group49962 +f 7496 7505 5264 7195 +g Group16444 +f 7196 7506 7503 7174 +g Group65500 +f 7197 5076 7191 +g Group38587 +f 5427 5075 5428 +g Group65500 +f 7194 5077 7198 +g Group38587 +f 5069 5429 5425 +g Group49962 +f 5240 7507 7499 7186 +g Group33459 +f 7195 5264 5026 7187 +f 7172 5307 5028 7185 +g Group43959 +f 7179 5311 5034 7175 +g Group17046 +f 7182 5309 5027 7183 +g Group26426 +f 7188 5317 5033 7177 +g Group30545 +f 7138 5370 5435 7199 +g Group49156 +f 7200 5354 7096 7201 +g Group60923 +f 7168 3164 5354 7200 +f 7202 5358 3150 7158 +g Group533 +f 7203 7204 5357 5414 +g Group39156 +f 7205 7204 7203 5393 +g Group19234 +f 7152 5402 5074 7189 +g Group16467 +f 7207 3088 5249 7206 +g Group57857 +f 7153 5397 5067 7192 +g Group24594 +f 7139 5160 3088 7207 +g Group38587 +f 7197 5427 5407 7206 +f 7154 5412 5429 7198 +g Group27521 +f 7208 5433 7013 7209 +g Group57458 +f 7147 5353 1401 7165 +g Group39156 +f 7211 7212 5434 7210 +g Group533 +f 5355 7211 7210 5413 +g Group13929 +f 7208 3167 1399 7199 +g Group49156 +f 7213 7104 5358 7202 +g Group424 +f 7167 7304 7297 3147 +g Group64370 +f 7166 5450 3156 7161 +g Group62736 +f 7148 7190 5482 3022 +g Group35823 +f 7150 7193 5476 3008 +g Group39315 +f 7135 6964 3161 7162 +g Group12402 +f 7141 6954 3152 7164 +g Group533 +f 7145 6971 1373 7205 +g Group39156 +f 7209 7013 5434 7212 +g Group22243 +f 7210 5434 7201 +f 7213 5393 7203 +g Group62327 +f 7215 7350 7346 7214 +g Group28186 +f 7216 7217 3080 2386 +g Group60077 +f 7218 7217 7216 3441 +g Group36476 +f 7220 5372 5371 7219 +g Group7868 +f 7221 2517 5442 7222 +g Group10538 +f 7224 3537 3538 7223 +g Group51043 +f 7226 3548 3549 7225 +g Group54067 +f 7228 3550 3551 7227 +g Group3828 +f 7230 5380 7229 +g Group35719 +f 6990 2389 6989 +g Group3828 +f 7231 5384 7232 +g Group35719 +f 2357 6991 6958 +g Group57346 +f 7234 5442 5450 7233 +g Group27412 +f 7235 3153 6957 7236 +g Group62327 +f 7238 7359 7358 7237 +g Group41349 +f 7239 5436 5547 7240 +g Group36476 +f 7221 5376 5381 7241 +g Group9789 +f 7242 7371 7393 5400 +g Group7299 +f 7244 3078 7137 7245 +g Group45812 +f 7246 2389 7247 +g Group13921 +f 5403 5382 5404 +g Group45812 +f 7249 2357 7248 +g Group13921 +f 5383 5364 5366 +g Group14049 +f 7227 7250 3060 3137 +g Group45940 +f 7251 7250 7227 3551 +g Group46844 +f 7252 7374 7395 5402 +g Group34212 +f 7243 3074 7143 7254 +g Group43214 +f 7255 3070 7256 +g Group1186 +f 5470 7257 7258 5469 +g Group34831 +f 7257 5254 7259 7258 +g Group9569 +f 7256 7360 7324 7255 +g Group51043 +f 7223 3538 3548 7226 +g Group10538 +f 7225 3549 3550 7228 +g Group39047 +f 7260 337 7159 7261 +g Group18798 +f 7235 7320 7359 7238 +g Group60077 +f 7263 7264 3443 7262 +g Group28186 +f 3082 7263 7262 2355 +g Group44183 +f 7266 2386 3193 7265 +g Group19152 +f 7268 2443 3194 7267 +g Group22176 +f 7270 2468 3134 7269 +g Group28186 +f 7216 2386 7266 +f 7224 2355 7262 +g Group14049 +f 7273 7272 3668 5475 +f 3056 7272 7271 3134 +g Group45940 +f 7271 7272 7273 +g Group19152 +f 7265 3193 2443 7268 +g Group44183 +f 7267 3194 2468 7270 +g Group17696 +f 7237 7358 7360 7256 +g Group43214 +f 7275 3068 7274 +g Group1186 +f 5485 7277 7276 5486 +g Group34831 +f 7278 5277 7276 7277 +g Group9569 +f 7274 7329 7349 7275 +g Group62725 +f 7279 3443 7264 +g Group30834 +f 5364 3444 5365 +g Group15463 +f 7241 5381 7015 7280 +g Group12336 +f 7282 3067 5154 7281 +g Group62725 +f 7283 5403 7284 +f 5386 3441 3561 +g Group45812 +f 7246 5403 7283 +g Group62725 +f 7279 5364 7285 +f 3443 5405 3537 +g Group45812 +f 7285 5364 7248 +g Group47354 +f 7220 1277 6991 7286 +g Group19882 +f 7288 7335 7344 5409 +g Group48588 +f 7289 3580 7290 +g Group16697 +f 5408 5475 5468 +g Group62725 +f 7218 3441 7284 +g Group30834 +f 3442 5403 5416 +g Group48588 +f 7251 3551 7291 +g Group16697 +f 5466 5422 5474 +g Group65320 +f 7293 7398 7402 5422 +g Group41680 +f 7292 3073 7242 +f 7253 3140 7288 +g Group12336 +f 7294 5165 3078 7244 +g Group1350 +f 7294 5424 5491 7295 +g Group1186 +f 7296 5486 7276 +g Group34831 +f 5493 5277 5432 +g Group25455 +f 7239 1174 3147 7297 +g Group59303 +f 7298 7347 7361 7299 +g Group41349 +f 7300 5581 5442 7234 +g Group7868 +f 7301 5436 2483 7219 +g Group43214 +f 7255 7302 5247 3070 +g Group9569 +f 7255 7325 7345 7302 +g Group5402 +f 7303 5438 7157 7304 +g Group52443 +f 7298 3151 1139 7214 +g Group14049 +f 7269 3134 7271 +f 7273 5475 7290 +g Group45940 +f 7271 3580 7269 +g Group51341 +f 7215 5156 3068 7275 +g Group34831 +f 7278 7362 7343 5277 +g Group9569 +f 7305 7362 7330 7274 +g Group16697 +f 7289 5408 7287 +f 7293 5422 7291 +g Group1186 +f 7257 5470 7295 +g Group34831 +f 5254 5491 5430 +g Group1350 +f 7296 5493 5398 7281 +g Group41349 +f 7306 5547 5436 7301 +g Group6316 +f 7307 7240 5547 7306 +g Group39961 +f 5379 7307 7306 5546 +f 7308 7309 5377 5580 +g Group6316 +f 7300 7309 7308 5581 +g Group41349 +f 7222 5442 5581 7308 +g Group35719 +f 7247 2389 7229 +f 7231 2357 7249 +g Group39047 +f 7236 6957 337 7260 +g Group35719 +f 7230 6990 7280 +f 7286 6991 7232 +g Group5402 +f 7361 7363 7303 7299 +g Group34212 +f 7245 7137 3079 7252 +g Group7299 +f 7254 7143 3067 7282 +g Group424 +f 7261 7159 3149 7233 +g Group32315 +f 7304 7157 5437 7297 +g Group24037 +f 7310 2518 7134 7311 +g Group36778 +f 7312 7313 5388 5387 +g Group28395 +f 7314 7313 7312 3200 +f 2444 7313 7314 +g Group39802 +f 5389 7403 7316 5390 +g Group50950 +f 7317 1278 7140 7318 +g Group59303 +f 7320 7235 7236 7319 +g Group29116 +f 5241 5240 7321 +g Group20733 +f 5241 7321 7321 +g Group4740 +f 7323 7322 3062 5467 +g Group9569 +f 7325 7255 7324 +g Group1186 +f 7259 5469 7258 +g Group61809 +f 7312 5387 5390 7316 +g Group50178 +f 5474 7404 7386 3667 +g Group45262 +f 7321 7328 5253 5241 +g Group45747 +f 7322 3062 7322 +g Group54130 +f 7322 7438 7434 3062 +f 3019 7433 7439 7326 +g Group45747 +f 3019 7326 7326 +g Group9569 +f 7329 7274 7330 +g Group1186 +f 5485 7278 7277 +g Group43624 +f 7328 5070 5426 7331 +g Group20733 +f 7332 5265 7332 +g Group29116 +f 7332 5264 5265 +g Group35241 +f 7333 5276 5432 7334 +g Group53645 +f 7332 7333 5068 3007 +g Group60156 +f 7335 7315 7403 7405 +g Group28395 +f 7337 7338 3160 7336 +g Group36778 +f 5419 7337 7336 5418 +g Group28395 +f 7337 2358 7338 +g Group31419 +f 7339 7340 2385 3073 +g Group51773 +f 7341 7339 3073 7292 +g Group53426 +f 7336 3160 2385 7340 +g Group26711 +f 7331 5426 5247 7342 +g Group18328 +f 7334 5432 5277 7343 +g Group36795 +f 7323 5467 5409 7344 +g Group34831 +f 7345 7259 5254 7342 +g Group18798 +f 7347 7298 7214 7346 +g Group45178 +f 7327 7404 7402 7348 +g Group17696 +f 7350 7215 7275 7349 +g Group29074 +f 7352 2484 5438 7351 +g Group18302 +f 7353 6961 3160 7338 +g Group29937 +f 7317 6962 6961 7353 +f 7354 6994 6964 7355 +g Group18302 +f 7314 3200 6994 7354 +g Group5402 +f 7356 7357 7260 5451 +g Group62555 +f 7319 7357 7356 6996 +g Group29074 +f 7356 5451 2518 7310 +g Group50950 +f 7311 7134 1250 7355 +g Group24037 +f 7318 7140 2484 7352 +g Group53944 +f 7350 5441 5440 7346 +f 7359 5453 5454 7358 +g Group1186 +f 7360 5469 7324 +g Group10415 +f 7320 5452 5453 7359 +g Group9313 +f 7358 5454 5469 7360 +g Group1186 +f 7329 5485 7349 +g Group28265 +f 7335 7405 7401 7344 +g Group19882 +f 7341 7292 5423 7348 +g Group50920 +f 7347 5439 6955 7361 +g Group1186 +f 7325 7259 7345 +g Group43214 +f 7362 7305 5255 7343 +g Group1186 +f 7362 7278 7330 +g Group62555 +f 7363 7361 6955 7351 +g Group5402 +f 7303 7363 7351 5438 +g Group21326 +f 3074 7364 7365 1316 +f 7364 3073 2385 7365 +f 3140 7366 7367 2469 +f 7366 3079 1318 7367 +g Group53021 +f 7369 7421 7440 7368 +g Group24540 +f 3568 7369 7368 5131 +g Group41680 +f 7371 7242 3073 7364 +g Group13123 +f 7372 7322 7323 7373 +g Group41680 +f 7366 3140 7253 7374 +g Group24540 +f 7375 7376 3539 5129 +g Group16734 +f 7377 7427 7441 5132 +g Group6641 +f 7378 5144 7379 +g Group43696 +f 5145 7490 7480 5146 +g Group6641 +f 7381 5147 7380 +g Group43696 +f 5149 7482 7491 5148 +g Group63757 +f 7382 5071 5480 7383 +g Group26702 +f 7384 5409 5467 7385 +g Group54130 +f 7372 7442 7438 7322 +f 7439 7443 7386 7326 +g Group43696 +f 7378 7481 7463 7377 +f 7370 7455 7483 7380 +g Group44805 +f 7436 7430 5150 +g Group6641 +f 7389 7379 5144 7388 +g Group43696 +f 7389 5146 7379 +g Group7750 +f 7391 7437 7435 5147 +g Group43696 +f 7391 7392 5149 5151 +f 5149 7392 7381 +g Group26702 +f 7394 5400 7393 +g Group63757 +f 5071 5399 5072 +g Group26702 +f 7395 5410 7396 +g Group63757 +f 5402 5079 5074 +g Group2747 +f 7397 7339 7397 +g Group39802 +f 7397 7340 7339 +g Group60156 +f 7398 7397 7339 7341 +g Group60183 +f 7387 3019 7399 +g Group31702 +f 5061 5480 5478 +g Group60183 +f 7400 3062 7390 +g Group31702 +f 5483 5064 5484 +g Group45178 +f 7373 7323 7344 7401 +g Group31702 +f 7383 5480 7399 +g Group63757 +f 7394 5071 7382 +g Group31702 +f 7400 5483 7385 +g Group63757 +f 7384 5079 7396 +g Group46844 +f 7371 7243 5399 7393 +g Group9789 +f 7374 7253 5410 7395 +g Group28265 +f 7398 7341 7348 7402 +g Group39802 +f 7315 7316 7403 +g Group2747 +f 7315 7403 7403 +g Group13123 +f 7404 7327 7326 7386 +g Group31675 +f 7405 7403 5389 7287 +g Group16697 +f 7404 5474 5422 7402 +g Group65320 +f 7405 7287 5408 7401 +g Group53090 +f 7406 2361 5107 7407 +g Group60327 +f 7409 7519 7593 2527 +g Group24040 +f 7410 7409 7408 1295 +g Group10260 +f 7412 7447 7453 7411 +g Group46547 +f 3569 7412 7411 3568 +g Group3027 +f 7410 1295 5046 7414 +g Group24040 +f 7416 7417 1281 7415 +g Group60327 +f 2485 7508 7540 7416 +g Group54826 +f 7419 5030 5062 7418 +g Group19677 +f 7149 5031 7420 +g Group48926 +f 7149 7420 7420 +g Group24540 +f 7421 7369 3568 7411 +g Group25577 +f 7423 3022 5064 7422 +g Group46590 +f 7424 7419 3018 7150 +g Group46547 +f 7425 7426 3540 3539 +g Group63183 +f 7406 7458 7461 2361 +g Group24540 +f 7425 3539 7376 7427 +g Group58542 +f 7407 4987 5101 7428 +g Group2033 +f 7173 1295 7408 +f 1281 7180 7415 +g Group58542 +f 7414 5046 5003 7429 +g Group15556 +f 7430 5061 7418 +f 7422 5064 7431 +g Group3027 +f 7428 5101 1281 7417 +g Group53090 +f 7429 5139 2459 7413 +g Group44037 +f 7433 3019 7432 +f 7435 3062 7434 +f 7432 3019 7387 7436 +g Group15556 +f 7431 5064 7390 7437 +g Group46590 +f 7423 7420 7148 3022 +g Group48926 +f 7424 7151 7424 +g Group19677 +f 7424 5025 7151 +g Group17843 +f 7438 5130 7434 +f 7433 5132 7439 +g Group16734 +f 7421 7370 5130 7440 +g Group53021 +f 7427 7376 7375 7441 +g Group54130 +f 7440 7442 7372 7368 +g Group17843 +f 7438 7442 7440 5130 +f 7443 7439 5132 7441 +g Group54130 +f 7386 7443 7441 7375 +g Group15556 +f 7436 7387 5061 7430 +g Group44037 +f 7437 7390 3062 7435 +g Group50841 +f 7444 34 4914 7445 +g Group46547 +f 7447 7412 3569 7446 +g Group5540 +f 7448 3573 7449 +g Group6798 +f 2460 4932 4933 +g Group38228 +f 7450 2528 4924 7451 +f 7444 2486 5172 7452 +g Group5540 +f 7446 3569 3573 7448 +g Group53789 +f 7453 7454 7421 7411 +g Group41176 +f 7455 7454 7453 2459 +g Group38228 +f 7456 5184 2528 7450 +g Group46547 +f 7457 3540 7426 7458 +g Group5540 +f 7460 3544 7459 +g Group6798 +f 4954 2362 4926 +g Group58463 +f 7457 7556 7558 7459 +g Group41176 +f 7462 7463 2361 7461 +g Group53789 +f 7427 7462 7461 7425 +g Group19637 +f 7464 7465 4913 7445 +g Group32250 +f 2939 7464 7445 4914 +g Group27213 +f 7467 2950 2951 7466 +g Group43650 +f 7468 4926 5108 7469 +g Group58463 +f 7470 7570 7536 7449 +g Group5540 +f 3574 7470 7449 3573 +g Group53743 +f 7472 4933 4932 7471 +g Group59123 +f 7467 4925 5047 7473 +g Group27213 +f 7465 2940 2956 7474 +g Group32250 +f 7451 7475 2943 4915 +g Group19637 +f 7466 7475 7451 4924 +g Group53743 +f 7476 4954 4926 7468 +g Group5540 +f 7460 7477 3545 3544 +g Group6798 +f 7476 7572 7559 4954 +g Group49148 +f 7478 5029 5062 7479 +g Group31083 +f 7480 2361 7481 +g Group43696 +f 5146 7378 7379 +g Group31083 +f 7483 2459 7482 +g Group43696 +f 7380 5149 7381 +g Group59169 +f 7484 5032 5065 7485 +g Group49102 +f 7469 4992 5102 7486 +f 7473 5047 5006 7487 +g Group59169 +f 7479 5062 5030 7488 +g Group49148 +f 7485 5065 5035 7489 +g Group59123 +f 7486 5102 4927 7474 +g Group43696 +f 7490 5145 7478 +f 7489 5148 7491 +g Group43650 +f 7487 5140 4933 7472 +g Group47217 +f 7492 7591 7597 5261 +g Group59133 +f 7452 5172 7494 +g Group6210 +f 5173 5263 5242 +g Group59133 +f 7495 5184 7456 +g Group6210 +f 5271 5175 5239 +g Group64262 +f 7493 5152 7170 7496 +g Group34604 +f 7497 7596 7592 5164 +g Group11339 +f 7498 5235 7186 7499 +g Group6210 +f 7492 5261 5263 7494 +f 7495 5271 5234 7497 +g Group29057 +f 7501 5025 5177 7500 +g Group11407 +f 7502 7173 7174 7503 +g Group2033 +f 7484 1295 7173 7502 +g Group14646 +f 7488 5030 7151 7504 +g Group11407 +f 7501 7169 7180 7504 +g Group37349 +f 7505 7496 7170 7500 +g Group49962 +f 5264 7505 7500 5177 +g Group29057 +f 7506 5186 5031 7503 +g Group49962 +f 7506 7507 5240 5186 +g Group37349 +f 7499 7507 7506 7196 +g Group31083 +f 7490 2361 7480 +f 7482 2459 7491 +f 7481 2361 7463 +f 7455 2459 7483 +g Group63183 +f 7447 7413 2459 7453 +g Group10260 +f 7458 7426 7425 7461 +g Group65364 +f 7508 2485 5152 7509 +g Group9810 +f 7510 2491 5284 7511 +g Group25297 +f 7513 4983 4984 7512 +g Group9621 +f 7515 4985 4986 7514 +g Group23841 +f 7517 7406 7407 7516 +g Group60327 +f 7519 7409 7410 7518 +g Group49144 +f 7520 7599 7638 4990 +g Group28131 +f 7523 4994 4995 7522 +g Group18644 +f 7525 7526 3025 7524 +g Group4773 +f 4996 7525 7524 2557 +g Group45804 +f 7527 2961 5288 7528 +g Group4584 +f 7530 7531 5002 7529 +g Group56249 +f 3935 7530 7529 5001 +g Group33934 +f 7532 7533 7447 7446 +g Group47805 +f 7534 7533 7532 3061 +g Group39314 +f 7518 7410 7414 7535 +g Group58463 +f 7537 7448 7449 7536 +g Group28131 +f 7520 4990 5008 7538 +g Group60327 +f 7539 7417 7416 7540 +g Group12543 +f 7513 7601 7639 4983 +g Group56249 +f 7541 7542 3937 5014 +g Group4584 +f 7515 7542 7541 4985 +g Group16843 +f 7543 1168 5235 7544 +g Group56566 +f 7546 5015 5016 7545 +g Group16843 +f 7547 1140 5294 7548 +g Group56566 +f 7550 5017 5018 7549 +g Group20452 +f 7527 4999 5021 7551 +g Group12224 +f 7553 4946 4947 7552 +g Group38771 +f 7554 2558 5178 7555 +g Group58463 +f 7532 7446 7448 7537 +g Group47805 +f 7557 7517 3012 7556 +g Group33934 +f 7458 7557 7556 7457 +g Group58463 +f 7559 7460 7459 7558 +g Group56815 +f 7560 7561 4946 7553 +g Group42944 +f 3954 7560 7553 3575 +g Group16001 +f 7563 5037 5000 7562 +g Group59595 +f 7564 3574 5134 7565 +g Group24353 +f 7566 3931 4956 7567 +g Group56566 +f 7512 4984 5017 7550 +g Group25297 +f 7545 5016 4989 7521 +g Group51721 +f 7551 5021 5039 7568 +g Group26687 +f 7569 7563 3973 5094 +g Group56566 +f 7514 4986 5015 7546 +g Group5540 +f 7570 7470 3574 7564 +g Group9621 +f 7549 5018 5002 7531 +g Group5540 +f 7571 3545 7477 7572 +g Group63889 +f 7574 3546 3997 7573 +g Group24353 +f 7561 4935 3953 7575 +g Group42944 +f 7574 7576 3952 3546 +g Group56815 +f 7567 7576 7574 4957 +g Group7930 +f 7571 4953 5136 7577 +g Group29293 +f 7516 7407 7428 7578 +g Group14260 +f 7523 3931 7566 +g Group28131 +f 4994 2383 4993 +g Group8927 +f 7529 5002 2567 7562 +g Group14260 +f 7575 3953 7538 +g Group28131 +f 2467 5008 5007 +g Group4773 +f 7510 7580 5009 2491 +g Group18644 +f 7581 7580 7510 3006 +g Group31933 +f 7582 5012 5293 7583 +g Group60592 +f 7541 5014 5013 7584 +g Group34323 +f 7582 2944 4840 7585 +g Group24900 +f 7586 5011 5183 7587 +g Group29872 +f 7588 3962 2504 7584 +g Group56 +f 7585 4840 4903 7589 +g Group12816 +f 7590 7588 5038 5097 +g Group29293 +f 7535 7414 7429 7579 +g Group7773 +f 7568 7569 5094 4905 +g Group39314 +f 7578 7428 7417 7539 +g Group59438 +f 7589 7590 5097 5040 +g Group60704 +f 7565 5134 3999 7552 +g Group9039 +f 7577 5136 4958 7573 +g Group23841 +f 7579 7429 7413 7534 +g Group20733 +f 7509 5152 7493 7591 +g Group65364 +f 7592 5163 2527 7593 +g Group59676 +f 7555 5178 5243 7594 +g Group45805 +f 7587 5183 5269 7595 +g Group33346 +f 7544 5235 7498 7596 +g Group16843 +f 7597 5262 1140 7547 +g Group43173 +f 7594 5243 3025 7526 +g Group29302 +f 7595 5269 5010 7581 +g Group16843 +f 7511 5284 1168 7543 +g Group38771 +f 7528 5288 2558 7554 +g Group9810 +f 7548 5294 2557 7524 +g Group24900 +f 7583 5293 5011 7586 +g Group8662 +f 7519 3017 7593 +g Group60327 +f 7409 2527 7408 +g Group8662 +f 7508 3004 7540 +g Group60327 +f 2485 7416 7415 +g Group6798 +f 7556 3012 2362 7558 +f 7570 7471 4932 7536 +g Group58463 +f 7572 7477 7460 7559 +g Group33346 +f 7591 7493 5262 7597 +g Group20733 +f 7596 7498 5163 7592 +g Group64208 +f 7598 3929 7521 7599 +g Group35273 +f 7600 3932 7522 7601 +g Group61865 +f 7602 2946 4945 7603 +g Group34646 +f 7605 7604 3967 5053 +g Group43569 +f 7606 2954 4602 7607 +g Group56828 +f 7608 7661 7640 2549 +g Group14 +f 7611 4895 2971 7610 +g Group6968 +f 7612 2942 4599 7613 +g Group32695 +f 7610 7663 7647 1352 +g Group43274 +f 7614 2941 4950 7615 +g Group14 +f 7609 2965 4898 7616 +g Group38502 +f 2723 7617 7618 4853 +f 7617 3002 4833 7618 +g Group61023 +f 7600 3925 2942 7612 +g Group8896 +f 7604 3968 1312 7619 +g Group37831 +f 7621 3960 2503 7620 +g Group25128 +f 7623 4571 2473 7622 +g Group45830 +f 7607 7738 7739 4601 +g Group16895 +f 4602 7718 7738 7607 +f 7613 7740 7716 4604 +g Group45830 +f 4599 7714 7740 7613 +g Group25128 +f 7627 7737 7739 7625 +g Group43274 +f 7614 1122 4688 7628 +g Group4839 +f 7629 7628 4688 4870 +g Group13367 +f 7630 7627 4595 4871 +g Group43274 +f 7631 4679 1126 7632 +g Group38502 +f 2972 7633 7634 4856 +f 7633 2603 4860 7634 +g Group35498 +f 7635 4003 7635 +g Group6563 +f 7635 4852 4003 +f 3978 4859 7636 +g Group35498 +f 3978 7636 7636 +g Group13367 +f 7623 7629 4870 4571 +g Group4839 +f 7631 7630 4871 4679 +g Group14 +f 7611 2603 7633 +f 4895 2972 4894 +g Group5711 +f 7637 7621 3972 5059 +g Group14 +f 7617 2723 7616 +f 3002 4898 4897 +g Group61023 +f 7606 2955 3929 7598 +g Group43274 +f 7603 4945 2945 7632 +g Group61865 +f 7615 4950 2966 7608 +g Group16886 +f 7638 4989 2537 7619 +g Group53487 +f 7639 4995 1314 7620 +g Group15732 +f 5053 4893 7605 +g Group44667 +f 5053 7605 7605 +g Group33611 +f 7636 5084 3978 +f 4003 5089 7635 +g Group44667 +f 7637 5091 7637 +g Group12543 +f 7599 7521 4989 7638 +g Group49144 +f 7601 7522 4995 7639 +g Group24705 +f 7640 1336 4749 7641 +g Group42693 +f 7643 2903 2904 7642 +g Group9838 +f 7644 7645 2906 2550 +g Group51241 +f 7646 7645 7644 1335 +g Group48838 +f 7647 2479 4742 7648 +g Group51241 +f 7650 7643 1351 7649 +g Group9838 +f 2882 7650 7649 2480 +g Group8881 +f 7652 4831 4832 7651 +g Group42693 +f 7653 2938 2905 7646 +g Group20447 +f 7653 2724 4724 7654 +g Group61288 +f 7656 7657 4833 7655 +g Group19885 +f 3959 7656 7655 4834 +g Group51241 +f 7658 2896 1335 7644 +g Group9838 +f 7659 2878 2480 7649 +g Group32695 +f 7660 2965 7609 7661 +g Group56828 +f 7662 2946 7602 7663 +g Group8881 +f 7665 4855 4854 7664 +g Group15109 +f 7666 7667 3598 3597 +g Group56512 +f 7668 7667 7666 4735 +g Group27021 +f 7669 2972 4856 7670 +g Group56512 +f 7671 4733 4735 7666 +g Group7233 +f 7673 4856 4860 7672 +g Group28931 +f 7674 7675 2965 7660 +g Group53064 +f 3934 7674 7660 2966 +g Group12666 +f 7669 3936 4890 7676 +g Group53064 +f 7662 7677 3927 2946 +g Group28931 +f 7678 7677 7662 2971 +g Group20383 +f 7675 3935 4892 7679 +g Group34879 +f 7680 4713 4877 7681 +g Group59012 +f 7682 4709 4874 7683 +g Group56512 +f 7685 7654 4724 7684 +g Group15109 +f 3650 7685 7684 3649 +f 7686 3643 3649 7684 +g Group28178 +f 7672 4860 4885 7687 +g Group20447 +f 7668 4735 2604 7642 +g Group5408 +f 7641 4749 4713 7680 +g Group29541 +f 7648 4742 4709 7682 +g Group33014 +f 7652 3643 7686 +g Group8881 +f 4831 4722 4887 +g Group27021 +f 7655 4833 3002 7688 +g Group31366 +f 7657 3654 3642 7689 +g Group19885 +f 7670 7690 3956 4857 +g Group61288 +f 7673 7690 7670 4856 +g Group3610 +f 7681 4877 2896 7658 +g Group27743 +f 7683 4874 2878 7659 +g Group52311 +f 7689 3642 4777 7691 +g Group33014 +f 7671 3586 7664 +g Group8881 +f 4733 4854 4888 +g Group33014 +f 7691 4777 7651 +f 7665 4779 7687 +g Group20383 +f 7676 4890 3937 7678 +g Group54069 +f 7688 3002 4897 7679 +g Group32695 +f 7661 7609 1336 7640 +g Group56828 +f 7663 7602 2479 7647 +g Group13207 +f 7693 7744 7804 4922 +g Group60744 +f 7695 4617 4618 7694 +g Group35729 +f 4744 7923 7924 7741 +g Group60744 +f 7692 4616 4617 7695 +g Group61063 +f 7698 7699 2375 4628 +g Group35324 +f 7700 7699 7698 4627 +g Group42847 +f 7701 7874 7912 2535 +g Group35324 +f 7704 7705 4633 7703 +g Group61063 +f 2381 7704 7703 4631 +g Group16540 +f 7706 7879 7911 1308 +g Group4671 +f 4572 4866 7707 +g Group12505 +f 7709 4701 4700 7708 +f 7707 4699 4701 7709 +g Group4671 +f 7708 7925 7926 4574 +g Group30410 +f 4700 7915 7925 7708 +g Group42739 +f 7712 7928 7927 7713 +g Group25128 +f 7715 7623 7622 7714 +g Group61418 +f 7717 4604 7716 +g Group35679 +f 4646 1269 4615 +g Group61418 +f 7718 4602 7719 +g Group35679 +f 1253 4649 4623 +g Group53004 +f 7721 7808 7783 4930 +g Group20947 +f 7723 2448 2934 7722 +g Group38852 +f 7698 4628 2891 7694 +g Group61063 +f 7706 1308 7700 +g Group35324 +f 2890 4627 4618 +g Group20947 +f 7720 2933 2448 7723 +g Group61063 +f 7705 1310 7702 +g Group35324 +f 4633 2894 4626 +g Group13113 +f 7703 4633 4626 7722 +g Group13468 +f 7724 4646 4615 7725 +g Group35679 +f 7726 7717 4646 7724 +g Group61418 +f 4603 7726 7724 4645 +f 7727 7728 4606 4648 +g Group35679 +f 7719 7728 7727 4649 +g Group13468 +f 7729 4623 4649 7727 +g Group4671 +f 4869 4596 7730 +g Group52302 +f 7732 4597 4598 7731 +f 7730 4596 4597 7732 +g Group30410 +f 7731 7929 7883 4680 +g Group4671 +f 4598 7928 7929 7731 +g Group44636 +f 7735 7629 7734 +g Group4839 +f 4689 7735 7734 4839 +g Group13367 +f 7736 7737 7627 7630 +g Group42739 +f 7697 7923 7926 7711 +g Group61374 +f 2895 7876 7930 7824 +g Group13367 +f 7715 7734 7629 7623 +g Group4839 +f 7630 7631 7736 +g Group44636 +f 7630 7736 7736 +g Group60152 +f 7693 4922 2351 7725 +g Group34413 +f 7721 4930 4623 7729 +g Group20091 +f 7738 7624 7625 7739 +g Group56692 +f 7718 1253 7624 7738 +f 7740 7626 1269 7716 +g Group20091 +f 7714 7622 7626 7740 +g Group50867 +f 7737 4607 4601 7739 +g Group17824 +f 7742 4745 4744 7741 +g Group13113 +f 7743 4616 7692 7744 +g Group6075 +f 7745 7835 7913 4654 +g Group34384 +f 7748 4655 4656 7747 +g Group43162 +f 7750 4658 4659 7749 +f 7751 4662 4661 7752 +g Group24291 +f 7754 4663 4664 7753 +g Group13755 +f 7755 4667 4655 7748 +f 7757 4668 4669 7756 +g Group25963 +f 7758 7759 2311 2909 +g Group51608 +f 7760 7759 7758 2927 +g Group8058 +f 7761 2312 2915 7762 +g Group7424 +f 7763 7764 2273 2294 +f 7764 7765 2434 2403 +g Group33069 +f 7764 7763 7765 +g Group7424 +f 7768 7767 2461 2435 +f 2321 7767 7766 2295 +g Group33069 +f 7766 7767 7768 +g Group51608 +f 7770 7771 2931 7769 +g Group25963 +f 2219 7770 7769 2923 +g Group36056 +f 7771 2349 4671 7772 +g Group33703 +f 7773 2350 2932 7774 +g Group7424 +f 7776 2235 2234 7775 +f 7778 2237 2236 7777 +g Group24291 +f 7747 4656 4653 7746 +g Group7424 +f 7763 2294 2235 7776 +f 7779 2434 7765 +g Group33069 +f 2376 7763 7776 +g Group7424 +f 7777 2236 2295 7766 +f 7768 2435 7780 +g Group33069 +f 7766 2378 7777 +g Group34384 +f 7753 4664 4668 7757 +g Group23300 +f 7782 4928 4929 7781 +g Group9679 +f 7784 4921 4930 7783 +g Group45304 +f 7754 7844 7914 4663 +g Group17824 +f 7786 4739 4745 7742 +g Group47884 +f 7787 2499 7696 7788 +g Group8058 +f 7758 2909 2312 7761 +g Group25963 +f 7762 2915 2237 7778 +g Group33703 +f 7769 2931 2350 7773 +g Group51608 +f 7774 2932 2374 7775 +g Group43162 +f 7779 2376 7789 +f 7790 2378 7780 +g Group11539 +f 7792 4952 7791 +g Group40946 +f 7793 3563 4637 7794 +g Group51003 +f 7795 7796 4754 4666 +f 7796 7797 2583 4811 +g Group11112 +f 7796 7795 7797 +g Group51003 +f 7800 7799 4812 2577 +f 4768 7799 7798 4683 +g Group11112 +f 7798 7799 7800 +g Group3700 +f 7802 4817 4816 7801 +g Group11539 +f 7781 4929 7803 +g Group23300 +f 7791 4952 4922 7804 +g Group9679 +f 7743 4923 4936 7805 +g Group40946 +f 7806 4620 3535 7807 +g Group38852 +f 7782 2933 7720 7808 +g Group63157 +f 7794 4637 4704 7809 +g Group57475 +f 7810 4746 4817 7802 +g Group17517 +f 7750 1796 7789 +g Group43162 +f 4658 2376 4657 +g Group17517 +f 7790 1797 7752 +g Group43162 +f 2378 4661 4660 +g Group38213 +f 7812 2536 7811 +g Group12568 +f 4747 4666 4755 +g Group63157 +f 7772 4671 4620 7806 +g Group57475 +f 7814 4818 4760 7813 +g Group13755 +f 7755 3484 7749 +f 7751 3486 7756 +g Group12568 +f 7815 4666 7811 +f 7817 4683 7816 +g Group36056 +f 7809 4704 2445 7760 +g Group61374 +f 7819 7786 2876 7818 +g Group35729 +f 4969 7819 7818 4937 +g Group17584 +f 7810 2536 7812 +f 7820 2500 7813 +g Group51003 +f 7795 4666 7815 +f 7785 2583 7797 +g Group11112 +f 4684 7795 7815 +g Group51003 +f 7816 4683 7798 +f 7800 2577 7745 +g Group11112 +f 7798 4654 7816 +g Group29345 +f 7814 4576 2499 7787 +g Group35729 +f 7821 7822 4975 4920 +g Group61374 +f 7823 7822 7821 2887 +g Group43469 +f 7825 2520 2895 7824 +f 7823 2887 2520 7825 +g Group22239 +f 7801 4816 7713 7826 +g Group38213 +f 7817 2500 7820 +g Group12568 +f 4683 4761 4769 +g Group56337 +f 7784 2886 2887 7821 +f 7818 2876 2888 7805 +g Group37184 +f 7792 3536 7807 +g Group11539 +f 4952 3535 4951 +g Group37184 +f 7793 3564 7803 +g Group11539 +f 3563 4929 4962 +g Group38852 +f 7744 7692 2889 7804 +g Group61374 +f 7741 7924 7881 2880 +g Group13113 +f 7808 7720 4624 7783 +g Group35729 +f 7824 7930 7927 4822 +g Group51776 +f 7827 2043 4575 7828 +g Group32436 +f 7829 1299 4185 7830 +g Group6404 +f 7831 2028 4273 7832 +g Group40204 +f 7831 2578 2475 7833 +g Group19659 +f 7834 1772 7746 7835 +g Group26501 +f 3501 7953 7837 +g Group58743 +f 7833 2475 4175 7838 +g Group12547 +f 7839 2536 4583 7840 +g Group32711 +f 7841 2584 4281 7842 +g Group13897 +f 7841 2039 1299 7829 +g Group45966 +f 7843 2583 7785 7844 +g Group15257 +f 7845 2684 4417 7846 +g Group30618 +f 7847 2685 4470 7848 +g Group55331 +f 7837 2686 4472 7849 +g Group23125 +f 7850 2687 4419 7851 +g Group22615 +f 7853 3635 3488 7852 +g Group43244 +f 7845 3631 3636 7854 +f 7856 3637 3634 7855 +g Group22615 +f 7858 3490 3638 7857 +f 7854 3636 3635 7853 +f 7857 3638 3637 7856 +g Group20231 +f 7860 8026 8027 4341 +g Group3755 +f 7862 7863 2805 7861 +g Group42984 +f 4259 7862 7861 2804 +g Group53752 +f 7865 4442 4441 7864 +g Group42984 +f 7866 7867 4257 2799 +g Group3755 +f 7859 7867 7866 2792 +g Group9048 +f 7868 2793 4348 7869 +g Group53752 +f 7871 4452 4443 7870 +g Group59087 +f 7872 4725 4555 7873 +g Group56337 +f 7874 7875 2894 7702 +g Group17108 +f 7876 7875 7874 7701 +g Group21369 +f 7878 7987 7988 7877 +g Group17108 +f 7880 7881 7696 7879 +g Group56337 +f 2890 7880 7879 7706 +g Group3309 +f 7882 2881 4680 7883 +g Group59087 +f 7885 4560 4729 7884 +g Group21369 +f 7990 7989 7886 7887 +g Group22615 +f 7889 2626 7852 +f 7858 2702 7888 +g Group26501 +f 7890 7980 7933 2813 +g Group53075 +f 7830 4185 2804 7861 +g Group13846 +f 7838 4175 2792 7866 +g Group58633 +f 7893 8034 7999 4404 +g Group32326 +f 7895 8036 8054 4463 +g Group3905 +f 7892 4261 4489 7896 +g Group48277 +f 7868 4268 4314 7897 +g Group2855 +f 7832 4273 4321 7898 +g Group29162 +f 7842 4281 4364 7899 +g Group48277 +f 7900 4297 4254 7901 +g Group44728 +f 7897 4314 4522 7902 +g Group9048 +f 7860 4341 2791 7901 +g Group8792 +f 7863 8045 8046 2805 +g Group57208 +f 7898 4321 1772 7834 +g Group17979 +f 7899 4364 2583 7843 +g Group23125 +f 7846 4417 2685 7847 +g Group15257 +f 7851 4419 2688 7855 +g Group47204 +f 7903 2814 7870 +g Group20897 +f 4262 4443 4444 +g Group16410 +f 7904 7871 2852 7836 +g Group55639 +f 4453 7904 7836 3501 +g Group47204 +f 7865 2812 7905 +g Group20897 +f 4442 4266 4457 +g Group55639 +f 7890 7906 4458 3588 +g Group16410 +f 7864 7906 7890 2813 +g Group47204 +f 7893 4404 2814 7903 +g Group20897 +f 7895 4463 4266 7905 +g Group55331 +f 7848 4470 2607 7891 +g Group30618 +f 7849 4472 2687 7850 +g Group44728 +f 7896 4489 4297 7900 +g Group3905 +f 7902 4522 4255 7894 +g Group54050 +f 7908 4558 4557 7907 +f 7910 4556 4559 7909 +g Group63537 +f 7828 4575 1308 7911 +g Group24308 +f 7840 4583 2535 7912 +g Group6869 +f 7913 4653 2043 7827 +g Group33176 +f 7914 4684 2536 7839 +g Group3309 +f 7915 4700 2879 7916 +g Group29616 +f 7917 4725 7872 +g Group32780 +f 7910 2882 7873 +g Group27743 +f 7908 2905 7886 +f 7878 2903 7909 +g Group29616 +f 7884 4729 7918 +g Group32780 +f 7885 2906 7907 +g Group23256 +f 7919 7991 7990 7887 +g Group59321 +f 7920 7981 7991 7919 +g Group33014 +f 3650 7920 7919 4723 +g Group59321 +f 7981 7920 7981 +g Group33014 +f 7921 7922 3598 4734 +g Group41154 +f 7889 7985 7992 4736 +g Group59321 +f 7985 7922 7985 +g Group23256 +f 7877 7988 7992 7921 +g Group3309 +f 7917 2881 7882 +g Group29616 +f 4725 1076 4737 +g Group3309 +f 7916 2879 7918 +g Group29616 +f 1070 4729 4738 +g Group62036 +f 7923 7697 7788 7924 +g Group16540 +f 7874 7702 1310 7912 +g Group42847 +f 7879 7696 2499 7911 +g Group30978 +f 7925 7710 7711 7926 +g Group56717 +f 7915 4702 7710 7925 +g Group16432 +f 7928 4598 4822 7927 +g Group56717 +f 7929 7733 4687 7883 +g Group30978 +f 7928 7712 7733 7929 +g Group16432 +f 7923 4744 4574 7926 +g Group22145 +f 7876 7701 7826 7930 +g Group45304 +f 7835 7746 4653 7913 +g Group6075 +f 7844 7785 4684 7914 +g Group22145 +f 7924 7788 7696 7881 +g Group62036 +f 7930 7826 7713 7927 +g Group6447 +f 7932 7933 2607 7931 +g Group24614 +f 2812 7932 7931 1356 +g Group31537 +f 7934 1774 4408 7935 +g Group46898 +f 7936 2030 4469 7937 +g Group6075 +f 7938 1368 4471 7939 +g Group39405 +f 7940 2041 4418 7941 +g Group49795 +f 7942 7943 2848 2689 +g Group31628 +f 7944 7943 7942 2061 +g Group63179 +f 7945 2627 7946 +g Group45012 +f 2068 4757 4756 +g Group41357 +f 7934 2684 2699 7947 +f 7949 2700 2688 7948 +g Group63179 +f 7951 2705 7950 +g Group45012 +f 4758 2071 4759 +g Group8334 +f 7952 2686 7837 7953 +g Group31256 +f 7942 2689 2713 7954 +f 7956 2714 2680 7955 +g Group20728 +f 7947 2699 2696 7957 +f 7958 2701 2700 7949 +g Group23763 +f 7959 2711 7960 +g Group5596 +f 2089 4427 4426 +g Group23763 +f 7962 2715 7961 +g Group5596 +f 4430 2090 4429 +g Group52257 +f 7944 2061 4480 7963 +g Group31628 +f 7964 7965 2083 7955 +g Group49795 +f 2838 7964 7955 2680 +g Group38895 +f 7966 1391 7957 +g Group45012 +f 7968 2068 7967 +g Group38895 +f 7958 1393 7969 +g Group45012 +f 7971 2071 7970 +g Group24614 +f 7938 7972 2814 1368 +g Group6447 +f 7952 7972 7938 2686 +g Group17025 +f 7973 2069 4427 7974 +g Group35192 +f 7975 2716 4439 7976 +g Group45012 +f 7967 2068 2069 7973 +f 7975 2072 2071 7971 +g Group16182 +f 7977 7978 2936 4773 +g Group63551 +f 7946 7978 7977 4757 +g Group45012 +f 7945 2068 7968 +f 7970 2071 7950 +g Group11434 +f 7953 3500 4496 7979 +g Group62421 +f 7981 3650 4790 7982 +g Group39405 +f 7935 4408 2030 7936 +g Group31537 +f 7941 4418 1802 7948 +g Group5596 +f 7959 2089 7954 +f 7956 2090 7961 +f 7974 4427 7960 +f 7962 4430 7976 +g Group6075 +f 7937 4469 1356 7931 +g Group46898 +f 7939 4471 2041 7940 +g Group11434 +f 7963 4480 3587 7980 +g Group52257 +f 7979 4496 2083 7965 +g Group57434 +f 7983 4727 1391 7966 +g Group39267 +f 7984 4730 2702 7969 +g Group62421 +f 7977 4773 3598 7985 +g Group63551 +f 7986 7951 4758 7982 +g Group16182 +f 2930 7986 7982 4790 +g Group21369 +f 7983 7987 7878 4727 +g Group3202 +f 7988 7987 7983 4726 +f 7989 7990 4730 7984 +g Group21369 +f 7886 7989 7984 4728 +g Group8334 +f 7980 7891 2607 7933 +g Group5089 +f 7991 4731 4730 7990 +g Group41154 +f 7981 7888 4731 7991 +g Group59321 +f 7985 7922 7921 7992 +g Group5089 +f 7988 4726 4736 7992 +g Group9683 +f 7994 4319 4320 7993 +g Group28921 +f 7995 7996 4099 2476 +g Group40360 +f 7997 7996 7995 74 +g Group3188 +f 8000 4403 4404 7999 +g Group35848 +f 8002 8003 2560 8001 +g Group24409 +f 4239 8002 8001 4238 +g Group10121 +f 8005 4529 4530 8004 +g Group49187 +f 8007 4325 4326 8006 +g Group50185 +f 8008 4415 8009 +g Group61624 +f 2481 4534 4535 +g Group26669 +f 8010 8011 2045 4536 +g Group38108 +f 8005 8011 8010 4529 +g Group62985 +f 8012 2587 4537 8013 +g Group40360 +f 8015 8016 86 8014 +g Group28921 +f 4103 8015 8014 2530 +g Group40360 +f 7997 74 4289 8017 +g Group56680 +f 8018 4339 4319 7994 +g Group50185 +f 8019 4403 8000 +g Group61624 +f 4549 2559 4550 +g Group19658 +f 8020 1773 4551 8021 +g Group38108 +f 8023 8024 4553 8022 +g Group26669 +f 2070 8023 8022 4554 +g Group48021 +f 8025 4253 7859 8026 +g Group30322 +f 7993 4320 4341 8027 +g Group61524 +f 7998 4180 4506 8028 +g Group24409 +f 8029 8030 4250 4249 +g Group35848 +f 7998 8030 8029 2482 +g Group40360 +f 8031 4353 74 7995 +g Group35848 +f 8001 2560 8032 +g Group24409 +f 4238 4462 4444 +g Group43765 +f 8033 4261 7892 8034 +g Group4536 +f 8035 2794 7894 8036 +g Group35848 +f 8037 2482 8029 +g Group24409 +f 4464 4249 4457 +g Group40360 +f 8014 86 4362 8038 +g Group36811 +f 8017 4289 4490 8039 +g Group40360 +f 8040 4311 86 8016 +g Group45241 +f 8007 2584 2529 8041 +g Group63780 +f 8041 2529 4184 8042 +g Group37748 +f 8018 2578 4274 8043 +g Group59460 +f 8044 4349 7869 8045 +g Group18883 +f 8042 4184 2805 8046 +g Group40104 +f 8031 4354 4253 8025 +g Group51543 +f 8038 4362 4349 8044 +g Group34199 +f 4803 4281 8006 +f 4274 4806 8043 +g Group46509 +f 8048 4377 4376 8047 +g Group8219 +f 8020 4380 4379 8049 +g Group10121 +f 8050 4563 4553 8024 +g Group8219 +f 8051 4391 4381 8052 +g Group57948 +f 8053 4386 2587 8012 +g Group14627 +f 8008 2481 2794 8035 +g Group24409 +f 8033 4461 4462 8032 +f 8037 4464 4463 8054 +g Group36911 +f 8056 4569 4568 8055 +g Group36811 +f 8028 4506 4311 8040 +g Group61524 +f 8039 4490 4212 8003 +g Group61624 +f 8058 4567 4533 8057 +f 8059 4548 4569 8056 +f 8057 4533 4534 8009 +g Group4460 +f 8010 4536 4377 8048 +g Group19658 +f 8013 4537 1771 8052 +g Group61624 +f 8019 4549 4548 8059 +g Group62985 +f 8021 4551 2579 8047 +g Group15899 +f 8022 4553 4386 8053 +g Group29418 +f 8061 4813 4565 8060 +g Group25472 +f 8058 4523 4406 8060 +g Group17979 +f 8062 4466 4465 8055 +g Group43145 +f 8063 4801 4378 8049 +f 8051 4390 4809 8064 +g Group64218 +f 8061 4407 8004 +f 8050 4466 8062 +g Group62442 +f 8064 4812 8064 +g Group8792 +f 8026 7859 2792 8027 +g Group4536 +f 8034 7892 2815 7999 +g Group43765 +f 8036 7894 4255 8054 +g Group20231 +f 8045 7869 4348 8046 +g Group45290 +f 8066 4110 4109 8065 +f 8068 4115 4114 8067 +g Group58882 +f 8069 1793 4049 8070 +g Group64248 +f 8071 2011 4189 8072 +g Group64147 +f 8073 1389 4467 8074 +g Group19554 +f 8071 2408 8075 +g Group6205 +f 2011 4243 4229 +g Group34682 +f 8077 2432 2409 8076 +g Group21717 +f 8078 2055 2574 8079 +g Group40103 +f 8081 4012 4013 8080 +g Group7741 +f 8082 4117 4115 8068 +g Group704 +f 8084 8085 2051 8083 +g Group14053 +f 2369 8084 8083 2429 +f 8077 8086 2373 2432 +g Group704 +f 8078 8086 8077 2055 +g Group39299 +f 8087 2080 8088 +g Group52648 +f 4017 4123 4124 +g Group39299 +f 8090 2074 8089 +g Group52648 +f 4125 4018 4126 +g Group21333 +f 8083 2051 1793 8069 +g Group19554 +f 8092 2406 8091 +g Group6205 +f 4247 2017 4248 +g Group40103 +f 8093 4014 4024 8094 +g Group21717 +f 8095 2582 2051 8085 +g Group5673 +f 8097 1035 2495 8096 +g Group636 +f 8100 1304 2533 8099 +g Group53076 +f 8102 8103 4242 8101 +g Group889 +f 2811 8102 8101 2371 +g Group18059 +f 8104 2820 4263 8105 +g Group58508 +f 8100 2808 4265 8106 +g Group636 +f 8096 2495 1306 8107 +g Group25976 +f 8108 2823 4267 8109 +g Group5673 +f 8099 2533 1043 8110 +g Group19022 +f 8097 2795 4492 8111 +g Group45482 +f 8113 8114 1387 8112 +g Group58831 +f 4147 8113 8112 2819 +g Group6444 +f 8116 2074 2576 8115 +g Group26754 +f 8081 2582 8095 +g Group40103 +f 4012 2521 4011 +g Group24830 +f 8117 4015 4063 8118 +g Group26754 +f 8079 2574 8094 +g Group40103 +f 2487 4024 4005 +f 8080 4013 4080 8119 +g Group6444 +f 8117 2586 2080 8120 +g Group43609 +f 8070 4049 4221 8121 +g Group58882 +f 8122 4051 1760 8076 +g Group40103 +f 8118 4063 4014 8093 +g Group24830 +f 8119 4080 4010 8115 +g Group39299 +f 8123 8120 2080 8087 +g Group52648 +f 8123 4016 8120 +f 8089 8124 4009 4018 +f 4009 8124 8116 +g Group59928 +f 8125 2080 1799 8065 +g Group11960 +f 8114 4148 4488 8126 +g Group58831 +f 8108 8127 4113 2823 +g Group45482 +f 8073 8127 8108 1389 +g Group39299 +f 8088 2080 8125 +f 8082 2074 8090 +g Group43609 +f 8072 4189 4051 8122 +g Group43735 +f 8098 4217 4509 8128 +g Group64248 +f 8121 4221 2017 8091 +g Group6205 +f 8101 4242 4243 8075 +f 8092 4247 4246 8129 +g Group58508 +f 8103 4260 2810 8107 +g Group25976 +f 8105 4263 2819 8112 +g Group889 +f 8129 8130 2856 2438 +g Group53076 +f 8106 8130 8129 4246 +g Group18059 +f 8109 4267 2798 8098 +g Group39434 +f 8074 4467 2013 8067 +g Group43735 +f 8111 4492 4220 8104 +g Group52783 +f 8126 4488 4110 8066 +g Group19022 +f 8128 4509 2797 8110 + + \ No newline at end of file diff --git a/modules/ufbx/data/zbrush_polygroup_mess_7500_binary.fbx b/modules/ufbx/data/zbrush_polygroup_mess_7500_binary.fbx new file mode 100644 index 0000000..bf6a9e0 Binary files /dev/null and b/modules/ufbx/data/zbrush_polygroup_mess_7500_binary.fbx differ diff --git a/modules/ufbx/data/zbrush_vertex_color.mtl b/modules/ufbx/data/zbrush_vertex_color.mtl new file mode 100644 index 0000000..7a769c2 --- /dev/null +++ b/modules/ufbx/data/zbrush_vertex_color.mtl @@ -0,0 +1,5 @@ +# File created by ZBrush +# ToolType: PolyMesh3D +# www.zbrush.com +newmtl defaultMat +map_Kd zbrush_vertex_color.bmp diff --git a/modules/ufbx/data/zbrush_vertex_color.obj b/modules/ufbx/data/zbrush_vertex_color.obj new file mode 100644 index 0000000..d0b5319 Binary files /dev/null and b/modules/ufbx/data/zbrush_vertex_color.obj differ diff --git a/modules/ufbx/data/zbrush_vertex_color_0_obj.obj b/modules/ufbx/data/zbrush_vertex_color_0_obj.obj new file mode 100644 index 0000000..d0b5319 Binary files /dev/null and b/modules/ufbx/data/zbrush_vertex_color_0_obj.obj differ diff --git a/modules/ufbx/data/zbrush_vertex_color_7500_ascii.fbx b/modules/ufbx/data/zbrush_vertex_color_7500_ascii.fbx new file mode 100644 index 0000000..6cf6ea8 --- /dev/null +++ b/modules/ufbx/data/zbrush_vertex_color_7500_ascii.fbx @@ -0,0 +1,573 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2022 + Month: 10 + Day: 23 + Hour: 17 + Minute: 13 + Second: 17 + Millisecond: 837 + } + Creator: "FBX SDK/FBX Plugins version 2020.0.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\zbrush_vertex_color_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\clean\ufbx\data\zbrush_vertex_color_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "" + P: "Original|ApplicationName", "KString", "", "", "" + P: "Original|ApplicationVersion", "KString", "", "", "" + P: "Original|DateTime_GMT", "DateTime", "", "", "" + P: "Original|FileName", "KString", "", "", "" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "" + P: "LastSaved|ApplicationName", "KString", "", "", "" + P: "LastSaved|ApplicationVersion", "KString", "", "", "" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",-1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",0 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",0 + P: "TimeSpanStop", "KTime", "Time", "",46186158000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1271606176, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 22 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + } + } + } + ObjectType: "Collection" { + Count: 8 + PropertyTemplate: "FbxSelectionSet" { + Properties70: { + P: "SelectionSetAnnotation", "KString", "", "", "" + } + } + } + ObjectType: "SelectionNode" { + Count: 8 + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfacePhong" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Phong" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + P: "SpecularColor", "Color", "", "A",0.2,0.2,0.2 + P: "SpecularFactor", "Number", "", "A",1 + P: "ShininessExponent", "Number", "", "A",20 + P: "ReflectionColor", "Color", "", "A",0,0,0 + P: "ReflectionFactor", "Number", "", "A",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1024773056, "Geometry::8 Sided", "Mesh" { + Smoothness: 3 + PreviewDivisionLevels: 2 + RenderDivisionLevels: 2 + DisplaySubdivisions: 0 + BoundaryRule: 0 + PreserveBorders: 0 + PreserveHardEdges: 0 + PropagateEdgeHardness: 0 + Vertices: *18 { + a: 0,1.99998998641968,1.7882450720208e-07,-0.999989986419678,1,-5.96046447753906e-08,0,0.999999940395355,-0.999989926815033,0.999989986419678,1,1.7882450720208e-07,0,1.00135803222656e-05,1.7882450720208e-07,0,1,0.999989926815033 + } + PolygonVertexIndex: *24 { + a: 2,1,-1,2,0,-4,2,3,-5,2,4,-2,5,0,-2,5,3,-1,5,4,-4,5,1,-5 + } + Edges: *12 { + a: 0,1,2,4,5,7,8,10,12,14,15,18 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Normals: *18 { + a: 3.5527850424014e-15,1,-2.98026225950252e-08,-1,0,0,1.19215769762846e-07,0,-0.999999999999993,1,0,0,-3.5527850424014e-15,-1,2.98026225950252e-08,-1.19215769762846e-07,0,0.999999999999993 + } + NormalsW: *6 { + a: 1,1,1,1,1,1 + } + } + LayerElementColor: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByVertice" + ReferenceInformationType: "Direct" + Colors: *24 { + a: 0,1,0,1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "DiffuseUV" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *26 { + a: 0.625,1,0.5,0.5,0.75,0.5,0.875,1,1,0.5,0.125,1,0,0.5,0.25,0.5,0.375,1,0.625,0,0.875,0,0.125,0,0.375,0 + } + UVIndex: *24 { + a: 0,1,2,3,2,4,5,6,7,8,7,1,9,2,1,10,4,2,11,7,6,12,1,7 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "Direct" + Smoothing: *8 { + a: 1,1,1,1,1,1,1,1 + } + } + LayerElementEdgeCrease: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + EdgeCrease: *24 { + a: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygon" + ReferenceInformationType: "IndexToDirect" + Materials: *8 { + a: 0,0,0,0,0,0,0,0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementColor" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementEdgeCrease" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTexture" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 630885952, "Model::8 Sided", "Mesh" { + Version: 232 + Properties70: { + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + } + Shading: Y + Culling: "CullingOff" + } + Material: 1783750944, "Material::8 Sided", "" { + Version: 102 + ShadingModel: "phong" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "SpecularColor", "Color", "", "A",0,0,0 + P: "ShininessExponent", "Number", "", "A",0 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Diffuse", "Vector3D", "Vector", "",0.5,0.5,0.5 + P: "Specular", "Vector3D", "Vector", "",0,0,0 + P: "Shininess", "double", "Number", "",0 + P: "Opacity", "double", "Number", "",1 + P: "Reflectivity", "double", "Number", "",0 + } + } + SelectionNode: 1273243328, "SelectionNode::8 Sided_10_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::8 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 0 + } + SelectionNode: 1273242096, "SelectionNode::8 Sided_15_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::8 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 1 + } + SelectionNode: 1273242448, "SelectionNode::8 Sided_20_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::8 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 2 + } + SelectionNode: 1273241920, "SelectionNode::8 Sided_25_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::8 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 3 + } + SelectionNode: 1273243504, "SelectionNode::8 Sided_30_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::8 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 4 + } + SelectionNode: 1273242272, "SelectionNode::8 Sided_35_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::8 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 5 + } + SelectionNode: 1273242976, "SelectionNode::8 Sided_40_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::8 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 6 + } + SelectionNode: 1273242624, "SelectionNode::8 Sided_45_SelectionNode", "" { + SelectionNode: 100 + Node: "Model::8 Sided" + IsTheNodeInSet: 0 + PolygonIndexArray: 7 + } + Collection: 1272020320, "SelectionSet::8 Sided_10", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::8 Sided_10_SelectionNode" + } + Collection: 1272018304, "SelectionSet::8 Sided_15", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::8 Sided_15_SelectionNode" + } + Collection: 1272018592, "SelectionSet::8 Sided_20", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::8 Sided_20_SelectionNode" + } + Collection: 1272019168, "SelectionSet::8 Sided_25", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::8 Sided_25_SelectionNode" + } + Collection: 1272019456, "SelectionSet::8 Sided_30", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::8 Sided_30_SelectionNode" + } + Collection: 1272017872, "SelectionSet::8 Sided_35", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::8 Sided_35_SelectionNode" + } + Collection: 1272019600, "SelectionSet::8 Sided_40", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::8 Sided_40_SelectionNode" + } + Collection: 1272020896, "SelectionSet::8 Sided_45", "SelectionSet" { + Version: 100 + NbMembers: 1 + Member: "SelectionNode::8 Sided_45_SelectionNode" + } + AnimationStack: 1784493632, "AnimStack::Default animation", "" { + } + AnimationLayer: 1271908752, "AnimLayer::Base Layer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::8 Sided, Model::RootNode + C: "OO",630885952,0 + + ;AnimLayer::Base Layer, AnimStack::Default animation + C: "OO",1271908752,1784493632 + + ;Geometry::8 Sided, Model::8 Sided + C: "OO",1024773056,630885952 + + ;Material::8 Sided, Model::8 Sided + C: "OO",1783750944,630885952 + + ;SelectionNode::8 Sided_10_SelectionNode, SelectionSet::8 Sided_10 + C: "OO",1273243328,1272020320 + + ;Model::8 Sided, SelectionNode::8 Sided_10_SelectionNode + C: "OO",630885952,1273243328 + + ;SelectionNode::8 Sided_15_SelectionNode, SelectionSet::8 Sided_15 + C: "OO",1273242096,1272018304 + + ;Model::8 Sided, SelectionNode::8 Sided_15_SelectionNode + C: "OO",630885952,1273242096 + + ;SelectionNode::8 Sided_20_SelectionNode, SelectionSet::8 Sided_20 + C: "OO",1273242448,1272018592 + + ;Model::8 Sided, SelectionNode::8 Sided_20_SelectionNode + C: "OO",630885952,1273242448 + + ;SelectionNode::8 Sided_25_SelectionNode, SelectionSet::8 Sided_25 + C: "OO",1273241920,1272019168 + + ;Model::8 Sided, SelectionNode::8 Sided_25_SelectionNode + C: "OO",630885952,1273241920 + + ;SelectionNode::8 Sided_30_SelectionNode, SelectionSet::8 Sided_30 + C: "OO",1273243504,1272019456 + + ;Model::8 Sided, SelectionNode::8 Sided_30_SelectionNode + C: "OO",630885952,1273243504 + + ;SelectionNode::8 Sided_35_SelectionNode, SelectionSet::8 Sided_35 + C: "OO",1273242272,1272017872 + + ;Model::8 Sided, SelectionNode::8 Sided_35_SelectionNode + C: "OO",630885952,1273242272 + + ;SelectionNode::8 Sided_40_SelectionNode, SelectionSet::8 Sided_40 + C: "OO",1273242976,1272019600 + + ;Model::8 Sided, SelectionNode::8 Sided_40_SelectionNode + C: "OO",630885952,1273242976 + + ;SelectionNode::8 Sided_45_SelectionNode, SelectionSet::8 Sided_45 + C: "OO",1273242624,1272020896 + + ;Model::8 Sided, SelectionNode::8 Sided_45_SelectionNode + C: "OO",630885952,1273242624 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "" + Take: "Default animation" { + FileName: "Default_animation.tak" + LocalTime: 0,46186158000 + ReferenceTime: 0,46186158000 + } +} diff --git a/modules/ufbx/examples/picort/picort.cpp b/modules/ufbx/examples/picort/picort.cpp new file mode 100644 index 0000000..8fa0b81 --- /dev/null +++ b/modules/ufbx/examples/picort/picort.cpp @@ -0,0 +1,3555 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../ufbx.h" + +#ifndef GUI +#define GUI 0 +#endif + +#ifndef SSE +#define SSE 0 +#endif + +#if GUI + #define NOMINMAX + #include +#endif + +#include +#include +#include +#include + +#if SSE + #ifdef _MSC_VER + #include + #else + #include + #endif +#endif + +#if defined(_MSC_VER) + #define picort_forceinline inline __forceinline +#elif defined(__GNUC__) + #define picort_forceinline inline __attribute__((always_inline)) +#else + #define picort_forceinline inline +#endif + +// -- Global options + +bool g_verbose = false; + +static void verbosef(const char *fmt, ...) +{ + if (!g_verbose) return; + + va_list args; + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); +} + +// -- Generic math definitions + +using std::sin; +using std::cos; +using std::atan2; +using std::acos; +using std::asin; +using std::abs; + +using Real = float; +static const constexpr Real Inf = INFINITY; +static const constexpr Real Pi = (Real)3.14159265359; + +struct Vec2 +{ + Real x = 0.0f, y = 0.0f; + + picort_forceinline Vec2 operator-() const { return { -x, -y }; }; + picort_forceinline Vec2 operator+(const Vec2 &b) const { return { x + b.x, y + b.y }; } + picort_forceinline Vec2 operator-(const Vec2 &b) const { return { x - b.x, y - b.y }; } + picort_forceinline Vec2 operator*(const Vec2 &b) const { return { x * b.x, y * b.y }; } + picort_forceinline Vec2 operator/(const Vec2 &b) const { return { x / b.x, y / b.y }; } + picort_forceinline Vec2 operator*(Real b) const { return { x * b, y * b }; } + picort_forceinline Vec2 operator/(Real b) const { return { x / b, y / b }; } + + picort_forceinline Real operator[](int axis) const { return (&x)[axis]; } +}; + +struct Vec3 +{ + Real x = 0.0f, y = 0.0f, z = 0.0f; + + picort_forceinline Vec3 operator-() const { return { -x, -y, -z }; }; + picort_forceinline Vec3 operator+(const Vec3 &b) const { return { x + b.x, y + b.y, z + b.z }; } + picort_forceinline Vec3 operator-(const Vec3 &b) const { return { x - b.x, y - b.y, z - b.z }; } + picort_forceinline Vec3 operator*(const Vec3 &b) const { return { x * b.x, y * b.y, z * b.z }; } + picort_forceinline Vec3 operator/(const Vec3 &b) const { return { x / b.x, y / b.y, z / b.z }; } + picort_forceinline Vec3 operator*(Real b) const { return { x * b, y * b, z * b }; } + picort_forceinline Vec3 operator/(Real b) const { return { x / b, y / b, z / b }; } + + picort_forceinline Real operator[](int axis) const { return (&x)[axis]; } + + picort_forceinline bool operator==(const Vec3 &rhs) const { return x == rhs.x && y == rhs.y && z == rhs.z; } + picort_forceinline bool operator!=(const Vec3 &rhs) const { return x != rhs.x || y != rhs.y || z != rhs.z; } +}; + +#if SSE +picort_forceinline Real min(Real a, Real b) { return _mm_cvtss_f32(_mm_min_ss(_mm_set_ss(a), _mm_set_ss(b))); } +picort_forceinline Real max(Real a, Real b) { return _mm_cvtss_f32(_mm_max_ss(_mm_set_ss(a), _mm_set_ss(b))); } +picort_forceinline Real floor_real(Real a) { return _mm_cvtss_f32(_mm_floor_ss(_mm_setzero_ps(), _mm_set_ss(a))); } +picort_forceinline Real ceil_real(Real a) { return _mm_cvtss_f32(_mm_ceil_ss(_mm_setzero_ps(), _mm_set_ss(a))); } +#else +picort_forceinline Real min(Real a, Real b) { return a < b ? a : b; } +picort_forceinline Real max(Real a, Real b) { return b < a ? a : b; } +picort_forceinline Real floor_real(Real a) { return std::floor(a); } +picort_forceinline Real ceil_real(Real a) { return std::ceil(a); } +#endif + +picort_forceinline Vec2 min(const Vec2 &a, const Vec2 &b) { return { min(a.x, b.x), min(a.y, b.y) }; } +picort_forceinline Vec2 max(const Vec2 &a, const Vec2 &b) { return { max(a.x, b.x), max(a.y, b.y) }; } + +picort_forceinline Vec3 min(const Vec3 &a, const Vec3 &b) { return { min(a.x, b.x), min(a.y, b.y), min(a.z, b.z) }; } +picort_forceinline Vec3 max(const Vec3 &a, const Vec3 &b) { return { max(a.x, b.x), max(a.y, b.y), max(a.z, b.z) }; } + +picort_forceinline Real min_component(const Vec2 &a) { return min(min(a.x, a.y), +Inf); } +picort_forceinline Real max_component(const Vec2 &a) { return max(max(a.x, a.y), -Inf); } + +picort_forceinline Real min_component(const Vec3 &a) { return min(min(min(a.x, a.y), a.z), +Inf); } +picort_forceinline Real max_component(const Vec3 &a) { return max(max(max(a.x, a.y), a.z), -Inf); } + +picort_forceinline Vec2 abs(const Vec2 &a) { return { abs(a.x), abs(a.y) }; } +picort_forceinline Vec3 abs(const Vec3 &a) { return { abs(a.x), abs(a.y), abs(a.z) }; } + +picort_forceinline Real dot(const Vec2 &a, const Vec2 &b) { return a.x*b.x + a.y*b.y; } +picort_forceinline Real dot(const Vec3 &a, const Vec3 &b) { return a.x*b.x + a.y*b.y + a.z*b.z; } +picort_forceinline Vec3 cross(const Vec3 &a, const Vec3 &b) { + return { a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x }; +} + +picort_forceinline Real length(const Vec2 &a) { return sqrt(dot(a, a)); } +picort_forceinline Real length(const Vec3 &a) { return sqrt(dot(a, a)); } + +picort_forceinline Vec2 normalize(const Vec2 &a) { return a / length(a); } +picort_forceinline Vec3 normalize(const Vec3 &a) { return a / length(a); } + +picort_forceinline Real lerp(Real a, Real b, Real t) { return a * (1.0f - t) + b * t; } +picort_forceinline Vec2 lerp(const Vec2 &a, const Vec2 &b, Real t) { return a * (1.0f - t) + b * t; } +picort_forceinline Vec3 lerp(const Vec3 &a, const Vec3 &b, Real t) { return a * (1.0f - t) + b * t; } + +picort_forceinline int largest_axis(const Vec3 &v) { + Real m = max_component(v); + return v.x == m ? 0 : v.y == m ? 1 : 2; +} + +picort_forceinline Vec3 reflect(const Vec3 &n, const Vec3 &v) { return -v + n * (2.0f * dot(n, v)); } + +picort_forceinline Real sqrt_safe(Real a) { return std::sqrt(a); } + +picort_forceinline Real clamp(Real a, Real min_v, Real max_v) { return min(max(a, min_v), max_v); } + +// -- SIMD + +#if SSE + +struct Real4 +{ + __m128 v; + + struct Mask { + __m128 v; + + Mask() { } + Mask(__m128 v) : v(v) { } + Mask(bool x, bool y, bool z, bool w) : v(_mm_castsi128_ps(_mm_setr_epi32(-(int)x, -(int)y, -(int)z, -(int)w))) { } + + uint32_t mask() const { return _mm_movemask_ps(v); } + uint32_t count() const { return _mm_popcnt_u32((unsigned)_mm_movemask_ps(v)); } + bool any() const { return !_mm_test_all_zeros(_mm_castps_si128(v), _mm_castps_si128(v)); } + bool all() const { return _mm_test_all_ones(_mm_castps_si128(v)); } + + Mask operator&(const Mask &rhs) const { return { _mm_and_ps(v, rhs.v) }; } + Mask operator|(const Mask &rhs) const { return { _mm_or_ps(v, rhs.v) }; } + Mask operator^(const Mask &rhs) const { return { _mm_xor_ps(v, rhs.v) }; } + Mask operator~() const { return { _mm_xor_ps(v, _mm_castsi128_ps(_mm_set1_epi32(-1))) }; } + }; + + struct Index { + __m128i v; + + Index() { } + Index(uint32_t x, uint32_t y, uint32_t z, uint32_t w) : v(_mm_setr_epi32( + (int)(x * 0x04040404u + 0x03020100u), (int)(y * 0x04040404u + 0x03020100u), + (int)(z * 0x04040404u + 0x03020100u), (int)(w * 0x04040404u + 0x03020100u))) { } + }; + + Real4() { } + Real4(Real v) : v(_mm_set1_ps(v)) { } + Real4(Real x, Real y, Real z, Real w) : v(_mm_setr_ps(x, y, z, w)) { } + Real4(__m128 v) : v(v) { } + + picort_forceinline Real4 operator+(const Real4 &rhs) const { return { _mm_add_ps(v, rhs.v) }; } + picort_forceinline Real4 operator-(const Real4 &rhs) const { return { _mm_sub_ps(v, rhs.v) }; } + picort_forceinline Real4 operator*(const Real4 &rhs) const { return { _mm_mul_ps(v, rhs.v) }; } + + picort_forceinline Mask operator==(const Real4 &rhs) const { return { _mm_cmpeq_ps(v, rhs.v) }; } + picort_forceinline Mask operator!=(const Real4 &rhs) const { return { _mm_cmpneq_ps(v, rhs.v) }; } + picort_forceinline Mask operator<(const Real4 &rhs) const { return { _mm_cmplt_ps(v, rhs.v) }; } + picort_forceinline Mask operator<=(const Real4 &rhs) const { return { _mm_cmple_ps(v, rhs.v) }; } + picort_forceinline Mask operator>=(const Real4 &rhs) const { return { _mm_cmpge_ps(v, rhs.v) }; } + picort_forceinline Mask operator>(const Real4 &rhs) const { return { _mm_cmpgt_ps(v, rhs.v) }; } + + picort_forceinline Real get(uint32_t ix) const { return _mm_cvtss_f32(_mm_castsi128_ps(_mm_shuffle_epi8(_mm_castps_si128(v), _mm_cvtsi32_si128((int)(ix * 0x04040404u + 0x03020100u))))); } + + picort_forceinline Real x() const { return _mm_cvtss_f32(v); } + picort_forceinline Real y() const { return _mm_cvtss_f32(_mm_shuffle_ps(v, v, _MM_SHUFFLE(3,2,1,1))); } + picort_forceinline Real z() const { return _mm_cvtss_f32(_mm_shuffle_ps(v, v, _MM_SHUFFLE(3,2,1,2))); } + picort_forceinline Real w() const { return _mm_cvtss_f32(_mm_shuffle_ps(v, v, _MM_SHUFFLE(3,2,1,3))); } + + picort_forceinline Real4 xs() const { return _mm_cvtss_f32(_mm_shuffle_ps(v, v, _MM_SHUFFLE(0,0,0,0))); } + picort_forceinline Real4 ys() const { return _mm_cvtss_f32(_mm_shuffle_ps(v, v, _MM_SHUFFLE(1,1,1,1))); } + picort_forceinline Real4 zs() const { return _mm_cvtss_f32(_mm_shuffle_ps(v, v, _MM_SHUFFLE(2,2,2,2))); } + picort_forceinline Real4 ws() const { return _mm_cvtss_f32(_mm_shuffle_ps(v, v, _MM_SHUFFLE(3,3,3,3))); } + + picort_forceinline Real min() const { + __m128 t = _mm_min_ps(v, _mm_shuffle_ps(v, v, _MM_SHUFFLE(1,0,3,2))); + return _mm_cvtss_f32(_mm_min_ps(t, _mm_shuffle_ps(t, t, _MM_SHUFFLE(2,3,0,1)))); + } + picort_forceinline Real max() const { + __m128 t = _mm_max_ps(v, _mm_shuffle_ps(v, v, _MM_SHUFFLE(1,0,3,2))); + return _mm_cvtss_f32(_mm_max_ps(t, _mm_shuffle_ps(t, t, _MM_SHUFFLE(2,3,0,1)))); + } + + static picort_forceinline Real4 min(const Real4 &a, const Real4 &b) { return { _mm_min_ps(a.v, b.v) }; } + static picort_forceinline Real4 max(const Real4 &a, const Real4 &b) { return { _mm_max_ps(a.v, b.v) }; } + + static picort_forceinline Real4 load(const Real *ptr) { return { _mm_loadu_ps(ptr) }; } + static picort_forceinline Real4 load_shuffle(const Real *ptr, const Index &index) { return { _mm_castsi128_ps(_mm_shuffle_epi8(_mm_loadu_si128((const __m128i*)ptr), index.v)) }; } + static picort_forceinline Real4 load_u16(const uint16_t *ptr) { return _mm_cvtepi32_ps(_mm_cvtepu16_epi32(_mm_loadl_epi64((const __m128i*)ptr))); } + static picort_forceinline Real4 load_i16(const int16_t *ptr) { return _mm_cvtepi32_ps(_mm_cvtepi16_epi32(_mm_loadl_epi64((const __m128i*)ptr))); } + static picort_forceinline void store(Real *ptr, const Real4 &a) { _mm_storeu_ps(ptr, a.v); } + + static picort_forceinline Real4 select(const Mask &mask, const Real4 &a, const Real4 &b) { return { _mm_blendv_ps(b.v, a.v, mask.v) }; } + static picort_forceinline Real4 shuffle(const Real4 &a, const Index &index) { return { _mm_castsi128_ps(_mm_shuffle_epi8(_mm_castps_si128(a.v), index.v)) }; } + static picort_forceinline void transpose(Real4 &a, Real4 &b, Real4 &c, Real4 &d) { _MM_TRANSPOSE4_PS(a.v, b.v, c.v, d.v); } +}; + +#else + +struct Real4 +{ + Real x_, y_, z_, w_; + + struct Mask { + int x_, y_, z_, w_; + + int mask() const { return (int)x_ | (int)y_<<1 | (int)z_<<2 | (int)w_<<3; } + int count() const { return (int)x_ + (int)y_ + (int)z_ + (int)w_; } + bool any() const { return x_ | y_ | z_ | w_; } + bool all() const { return x_ & y_ & z_ & w_; } + + Mask operator&(const Mask &rhs) const { return { x_&rhs.x_, y_&rhs.y_, z_&rhs.z_, w_&rhs.w_ }; } + Mask operator|(const Mask &rhs) const { return { x_|rhs.x_, y_|rhs.y_, z_|rhs.z_, w_|rhs.w_}; } + Mask operator^(const Mask &rhs) const { return { x_^rhs.x_, y_^rhs.y_, z_^rhs.z_, w_^rhs.w_ }; } + Mask operator~() const { return { !x_, !y_, !z_, !w_ }; } + }; + + struct Index { + uint8_t x_, y_, z_, w_; + + Index() { } + Index(uint32_t x, uint32_t y, uint32_t z, uint32_t w) + : x_((uint8_t)x), y_((uint8_t)y), z_((uint8_t)z), w_((uint8_t)w) { } + }; + + Real4() { } + Real4(Real v) : x_(v), y_(v), z_(v), w_(v) { } + Real4(Real x, Real y, Real z, Real w) : x_(x), y_(y), z_(z), w_(w) { } + + picort_forceinline Real4 operator+(const Real4 &rhs) const { return { x_+rhs.x_, y_+rhs.y_, z_+rhs.z_, w_+rhs.w_ }; } + picort_forceinline Real4 operator-(const Real4 &rhs) const { return { x_-rhs.x_, y_-rhs.y_, z_-rhs.z_, w_-rhs.w_ }; } + picort_forceinline Real4 operator*(const Real4 &rhs) const { return { x_*rhs.x_, y_*rhs.y_, z_*rhs.z_, w_*rhs.w_ }; } + + picort_forceinline Mask operator==(const Real4 &rhs) const { return { x_==rhs.x_, y_==rhs.y_, z_==rhs.z_, w_==rhs.w_ }; } + picort_forceinline Mask operator!=(const Real4 &rhs) const { return { x_!=rhs.x_, y_!=rhs.y_, z_!=rhs.z_, w_!=rhs.w_ }; } + picort_forceinline Mask operator<(const Real4 &rhs) const { return { x_=(const Real4 &rhs) const { return { x_>=rhs.x_, y_>=rhs.y_, z_>=rhs.z_, w_>=rhs.w_ }; } + picort_forceinline Mask operator>(const Real4 &rhs) const { return { x_>rhs.x_, y_>rhs.y_, z_>rhs.z_, w_>rhs.w_ }; } + + picort_forceinline Real get(uint32_t ix) const { + Real v[] = { x_, y_, z_, w_ }; + return v[ix]; + }; + + picort_forceinline Real x() const { return x_; } + picort_forceinline Real y() const { return y_; } + picort_forceinline Real z() const { return z_; } + picort_forceinline Real w() const { return w_; } + + picort_forceinline Real4 xs() const { return { x_, x_, x_, x_ }; } + picort_forceinline Real4 ys() const { return { y_, y_, y_, y_ }; } + picort_forceinline Real4 zs() const { return { z_, z_, z_, z_ }; } + picort_forceinline Real4 ws() const { return { w_, w_, w_, w_ }; } + + picort_forceinline Real min() const { return ::min(::min(x_, y_), ::min(z_, w_)); } + picort_forceinline Real max() const { return ::max(::max(x_, y_), ::max(z_, w_)); } + + static picort_forceinline Real4 min(const Real4 &a, const Real4 &b) { return { ::min(a.x_, b.x_), ::min(a.y_, b.y_), ::min(a.z_, b.z_), ::min(a.w_, b.w_) }; } + static picort_forceinline Real4 max(const Real4 &a, const Real4 &b) { return { ::max(a.x_, b.x_), ::max(a.y_, b.y_), ::max(a.z_, b.z_), ::max(a.w_, b.w_) }; } + + static picort_forceinline Real4 load(const Real *ptr) { return { ptr[0], ptr[1], ptr[2], ptr[3] }; } + static picort_forceinline Real4 load_u16(const uint16_t *ptr) { return { (Real)ptr[0], (Real)ptr[1], (Real)ptr[2], (Real)ptr[3] }; } + static picort_forceinline Real4 load_i16(const int16_t *ptr) { return { (Real)ptr[0], (Real)ptr[1], (Real)ptr[2], (Real)ptr[3] }; } + static picort_forceinline Real4 load_shuffle(const Real *ptr, const Index &index) { return { ptr[index.x_], ptr[index.y_], ptr[index.z_], ptr[index.w_] }; } + static picort_forceinline void store(Real *ptr, const Real4 &a) { ptr[0] = a.x_; ptr[1] = a.y_; ptr[2] = a.z_; ptr[3] = a.w_; } + + static picort_forceinline Real4 select(const Mask &mask, const Real4 &a, const Real4 &b) { + return { mask.x_ ? a.x_ : b.x_, mask.y_ ? a.y_ : b.y_, mask.z_ ? a.z_ : b.z_, mask.w_ ? a.w_ : b.w_ }; + } + + static picort_forceinline Real4 shuffle(const Real4 &a, const Index &index) { + Real arr[4] = { a.x_, a.y_, a.z_, a.w_ }; + return { arr[index.x_], arr[index.y_], arr[index.z_], arr[index.w_] }; + } + + static picort_forceinline void transpose(Real4 &a, Real4 &b, Real4 &c, Real4 &d) { + Real t; + t = a.y_; a.y_ = b.x_; b.x_ = t; + t = a.z_; a.z_ = c.x_; c.x_ = t; + t = a.w_; a.w_ = d.x_; d.x_ = t; + t = b.z_; b.z_ = c.y_; c.y_ = t; + t = b.w_; b.w_ = d.y_; d.y_ = t; + t = c.w_; c.w_ = d.z_; d.z_ = t; + } + + static picort_forceinline int min_component_index(Real4 a) { + if (::min(a.x_, a.y_) < ::min(a.z_, a.w_)) { + return a.x_ < a.y_ ? 0 : 1; + } else { + return 2 + (a.z_ < a.w_ ? 0 : 1); + } + } +}; + +#endif + +// -- Some mask utilities + +#if SSE +picort_forceinline uint32_t popcount4(uint32_t v) { return _mm_popcnt_u32(v); } +picort_forceinline uint32_t first_set4(uint32_t v) { return _tzcnt_u32(v); } +#else +static uint8_t pop4_table[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; +static uint8_t ffs4_table[16] = { 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 }; +picort_forceinline uint32_t popcount4(uint32_t v) { return pop4_table[v]; } +picort_forceinline uint32_t first_set4(uint32_t v) { return ffs4_table[v]; } +#endif + +// -- Prefetch + +#if SSE + #define picort_prefetch(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +#else + #define picort_prefetch(ptr) (void)0 +#endif + +// -- Random series + +// *Really* minimal PCG32 code / (c) 2014 M.E. O'Neill / pcg-random.org +// Licensed under Apache License 2.0 (NO WARRANTY, etc. see website) +struct Random +{ + uint64_t state = 1, inc = 1; + + uint32_t next() { + uint64_t oldstate = state; + // Advance internal state + state = oldstate * 6364136223846793005ULL + inc; + // Calculate output function (XSH RR), uses old state for max ILP + uint32_t xorshifted = (uint32_t)(((oldstate >> 18u) ^ oldstate) >> 27u); + uint32_t rot = oldstate >> 59u; + return (xorshifted >> rot) | (xorshifted << ((0-rot) & 31)); + } +}; + +Real uniform_real(Random &rng) { return (Real)rng.next() * (Real)2.3283064e-10; } +Vec2 uniform_vec2(Random &rng) { return { uniform_real(rng), uniform_real(rng) }; } +Vec3 uniform_vec3(Random &rng) { return { uniform_real(rng), uniform_real(rng), uniform_real(rng) }; } + +// -- Images + +struct alignas(4) Pixel { + uint8_t r=0, g=0, b=0, a=0xff; +}; + +struct alignas(8) Pixel16 { + uint16_t r=0, g=0, b=0, a=0xffff; + + bool operator==(const Pixel16 &p) const { return r==p.r && g==p.g && b==p.b && a==p.a; } + bool operator!=(const Pixel16 &p) const { return !(*this == p); } +}; + +struct Image +{ + const char *error = nullptr; + uint32_t width = 0, height = 0; + std::vector pixels; + bool srgb = false; +}; + +picort_forceinline Real4 lerp(const Real4 &a, const Real4 &b, Real t) +{ + return a * (1.0f - t) + b * t; +} + +// Fetch a single pixel from `image` at pixel coordinate `{x, y}` +picort_forceinline Real4 fetch_image(const Image &image, int32_t x, int32_t y) +{ + if (((image.width & (image.width - 1)) | (image.height & (image.height - 1))) == 0) { + x &= image.width - 1; + y &= image.height - 1; + } else { + x = ((x % image.width) + image.width) % image.width; + y = ((y % image.height) + image.height) % image.height; + } + Pixel16 p = image.pixels[y * image.width + x]; + Real4 v = Real4::load_u16(&image.pixels[y * image.width + x].r); + v = v * (Real)(1.0 / 65535.0); + if (image.srgb) v = Real4::select(Real4::Mask{true, true, true, false}, v * v, v); + return v; +} + +// Bilinearly sample `image` at normalized coordinate `uv` +Real4 sample_image(const Image &image, const Vec2 &uv) +{ + if (image.width == 0 || image.height == 0) return { }; + Vec2 px = uv * Vec2{ (Real)image.width, -(Real)image.height }; + Real x = floor_real(px.x), y = floor_real(px.y), dx = px.x - x, dy = px.y - y; + Real4 p00 = fetch_image(image, (int32_t)x + 0, (int32_t)y + 0); + Real4 p10 = fetch_image(image, (int32_t)x + 1, (int32_t)y + 0); + Real4 p01 = fetch_image(image, (int32_t)x + 0, (int32_t)y + 1); + Real4 p11 = fetch_image(image, (int32_t)x + 1, (int32_t)y + 1); + Real4 v = lerp(lerp(p00, p10, dx), lerp(p01, p11, dx), dy); + return v; +} + +// Load a PNG image file +// http://www.libpng.org/pub/png/spec/1.2/PNG-Contents.html +Image read_png(const void *data, size_t size) +{ + Image image; + + const uint8_t *ptr = (const uint8_t*)data, *end = ptr + size; + uint8_t bit_depth = 0, pixel_values = 0, pixel_format; + std::vector deflate_data, src, dst; + std::vector palette; + static const uint8_t lace_none[] = { 0,0,1,1, 0,0,0,0 }; + static const uint8_t lace_adam7[] = { + 0,0,8,8, 4,0,8,8, 0,4,4,8, 2,0,4,4, 0,2,2,4, 1,0,2,2, 0,1,1,2, 0,0,0,0, }; + uint32_t scale = 1; + const uint8_t *lace = lace_none; // Interlacing pattern (x0,y0,dx,dy) + Pixel16 trns = { 0, 0, 0, 0 }; // Transparent pixel value for RGB + + if (end - ptr < 8) return { "file header truncated" }; + if (memcmp(ptr, "\x89PNG\r\n\x1a\n", 8)) return { "bad file header" }; + ptr += 8; + + // Iterate chunks: gather IDAT into a single buffer + for (;;) { + if (end - ptr < 8) return { "chunk header truncated" }; + uint32_t chunk_len = ptr[0]<<24 | ptr[1]<<16 | ptr[2]<<8 | ptr[3]; + const uint8_t *tag = ptr + 4; + ptr += 8; + if ((uint32_t)(end - ptr) < chunk_len + 4) return { "chunk data truncated" }; + if (!memcmp(tag, "IHDR", 4) && chunk_len >= 13) { + image.width = ptr[0]<<24 | ptr[1]<<16 | ptr[2]<<8 | ptr[3]; + image.height = ptr[4]<<24 | ptr[5]<<16 | ptr[6]<<8 | ptr[7]; + bit_depth = ptr[8]; + pixel_format = ptr[9]; + switch (pixel_format) { + case 0: pixel_values = 1; break; + case 2: pixel_values = 3; break; + case 3: pixel_values = 1; break; + case 4: pixel_values = 2; break; + case 6: pixel_values = 4; break; + default: return { "unknown pixel format" }; + } + for (uint32_t i = 0; i < 16 && pixel_format != 3; i += bit_depth) scale |= 1u << i; + if (ptr[12] != 0) lace = lace_adam7; + if (ptr[10] != 0 || ptr[11] != 0) return { "unknown settings" }; + } else if (!memcmp(tag, "IDAT", 4)) { + deflate_data.insert(deflate_data.end(), ptr, ptr + chunk_len); + } else if (!memcmp(tag, "PLTE", 4)) { + for (size_t i = 0; i < chunk_len; i += 3) { + palette.push_back({ (uint16_t)(ptr[i]*0x101), (uint16_t)(ptr[i+1]*0x101), (uint16_t)(ptr[i+2]*0x101) }); + } + } else if (!memcmp(tag, "IEND", 4)) { + break; + } else if (!memcmp(tag, "tRNS", 4)) { + if (pixel_format == 2 && chunk_len >= 6) { + trns = { + (uint16_t)((ptr[0]<<8 | ptr[1]) * scale), + (uint16_t)((ptr[2]<<8 | ptr[3]) * scale), + (uint16_t)((ptr[4]<<8 | ptr[5]) * scale) }; + } else if (pixel_format == 0 && chunk_len >= 2) { + uint16_t v = (uint16_t)(ptr[0]<<8 | ptr[1]) * scale; + trns = { v, v, v }; + } else if (pixel_format == 3) { + for (size_t i = 0; i < chunk_len; i++) { + if (i < palette.size()) palette[i].a = ptr[i] * 0x101; + } + } + } + ptr += chunk_len + 4; // Skip data and CRC + } + + size_t bpp = (pixel_values * bit_depth + 7) / 8; + size_t stride = (image.width * pixel_values * bit_depth + 7) / 8; + if (image.width == 0 || image.height == 0) return { "bad image size" }; + src.resize(image.height * stride + image.height * (lace == lace_adam7 ? 14 : 1)); + dst.resize((image.height + 1) * (stride + bpp)); + image.pixels.resize(image.width * image.height); + + // Decompress the combined IDAT chunks + ufbx_inflate_retain retain; + retain.initialized = false; + + ufbx_inflate_input input = { 0 }; + input.total_size = deflate_data.size(); + input.data_size = deflate_data.size(); + input.data = deflate_data.data(); + + ptrdiff_t res = ufbx_inflate(src.data(), src.size(), &input, &retain); + if (res < 0) return { "deflate error" }; + uint8_t *sp = src.data(), *sp_end = sp + src.size(); + + for (; lace[2]; lace += 4) { + int32_t width = ((int32_t)image.width - lace[0] + lace[2] - 1) / lace[2]; + int32_t height = ((int32_t)image.height - lace[1] + lace[3] - 1) / lace[3]; + if (width <= 0 || height <= 0) continue; + size_t lace_stride = (width * pixel_values * bit_depth + 7) / 8; + if ((size_t)(sp_end - sp) < height * (1 + lace_stride)) return { "data truncated" }; + + // Unfilter the scanlines + ptrdiff_t dx = bpp, dy = stride + bpp; + for (int32_t y = 0; y < height; y++) { + uint8_t *dp = dst.data() + (stride + bpp) * (1 + y) + bpp; + uint8_t filter = *sp++; + for (int32_t x = 0; x < lace_stride; x++) { + uint8_t s = *sp++, *d = dp++; + switch (filter) { + case 0: d[0] = s; break; // 6.2: No filter + case 1: d[0] = d[-dx] + s; break; // 6.3: Sub (predict left) + case 2: d[0] = d[-dy] + s; break; // 6.4: Up (predict top) + case 3: d[0] = (d[-dx] + d[-dy]) / 2 + s; break; // 6.5: Average (top+left) + case 4: { // 6.6: Paeth (choose closest of 3 to estimate) + int32_t a = d[-dx], b = d[-dy], c = d[-dx - dy], p = a+b-c; + int32_t pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); + if (pa <= pb && pa <= pc) d[0] = (uint8_t)(a + s); + else if (pb <= pc) d[0] = (uint8_t)(b + s); + else d[0] = (uint8_t)(c + s); + } break; + default: return { "unknown filter" }; + } + } + } + + // Expand to RGBA pixels + for (int32_t y = 0; y < height; y++) { + uint8_t *dr = dst.data() + (stride + bpp) * (y + 1) + bpp; + for (int32_t x = 0; x < width; x++) { + uint16_t v[4]; + for (uint32_t c = 0; c < pixel_values; c++) { + ptrdiff_t bit = (x * pixel_values + c + 1) * bit_depth; + uint32_t raw = (dr[(bit - 9) >> 3] << 8 | dr[(bit - 1) >> 3]) >> ((8 - bit) & 7); + v[c] = (raw & ((1 << bit_depth) - 1)) * scale; + } + + Pixel16 px; + switch (pixel_format) { + case 0: px = { v[0], v[0], v[0], 0xffff }; break; + case 2: px = { v[0], v[1], v[2], 0xffff }; break; + case 3: px = v[0] < palette.size() ? palette[v[0]] : Pixel16{ }; break; + case 4: px = { v[0], v[0], v[0], v[1] }; break; + case 6: px = { v[0], v[1], v[2], v[3] }; break; + } + if (px == trns) px = { 0, 0, 0, 0 }; + image.pixels[(lace[1]+y*lace[3]) * image.width + (lace[0]+x*lace[2])] = px; + } + } + + } + + return image; +} + +std::vector load_file(const char *filename) +{ + std::vector data; + FILE *f = fopen(filename, "rb"); + if (f) { + fseek(f, 0, SEEK_END); + size_t size = ftell(f); + fseek(f, 0, SEEK_SET); + data.resize(size); + size_t result = fread(data.data(), 1, size, f); + ufbx_assert(result == size); + fclose(f); + } + return data; +} + +Image load_png(const char *filename) +{ + std::vector data = load_file(filename); + return read_png(data.data(), data.size()); +} + +struct HuffSymbol { + uint16_t length, bits; +}; + +uint32_t bit_reverse(uint32_t mask, uint32_t num_bits) +{ + ufbx_assert(num_bits <= 16); + uint32_t x = mask; + x = (((x & 0xaaaa) >> 1) | ((x & 0x5555) << 1)); + x = (((x & 0xcccc) >> 2) | ((x & 0x3333) << 2)); + x = (((x & 0xf0f0) >> 4) | ((x & 0x0f0f) << 4)); + x = (((x & 0xff00) >> 8) | ((x & 0x00ff) << 8)); + return x >> (16 - num_bits); +} + +void build_huffman(HuffSymbol *symbols, uint32_t *counts, uint32_t num_symbols, uint32_t max_bits) +{ + struct HuffNode { + uint16_t index; uint16_t parent; uint32_t count; + bool operator<(const HuffNode &rhs) const { + return count != rhs.count ? count < rhs.count : index > rhs.index; + } + }; + HuffNode nodes[1024]; + + uint32_t bias = 0; + for (;;) { + for (uint32_t i = 0; i < num_symbols; i++) { + nodes[i] = { (uint16_t)i, UINT16_MAX, counts[i] ? counts[i] + bias : 0 }; + } + std::sort(nodes, nodes + num_symbols); + uint32_t cs = 0, ce = num_symbols, qs = 512, qe = qs; + while (cs + 2 < ce && nodes[cs].count == 0) cs++; + while (ce-cs + qe-qs > 1) { + uint32_t a = ce-cs > 0 && (qe-qs == 0 || nodes[cs].count < nodes[qs].count) ? cs++ : qs++; + uint32_t b = ce-cs > 0 && (qe-qs == 0 || nodes[cs].count < nodes[qs].count) ? cs++ : qs++; + nodes[a].parent = nodes[b].parent = (uint16_t)qe; + nodes[qe++] = { UINT16_MAX, UINT16_MAX, nodes[a].count + nodes[b].count }; + } + + bool fail = false; + uint32_t length_counts[16] = { }, length_codes[16] = { }; + for (uint32_t i = 0; i < num_symbols; i++) { + uint32_t len = 0; + for (uint32_t a = nodes[i].parent; a != UINT16_MAX; a = nodes[a].parent) len++; + if (len > max_bits) { fail = true; break; } + length_counts[len]++; + symbols[nodes[i].index].length = (uint16_t)len; + } + if (fail) { + bias = bias ? bias << 1 : 1; + continue; + } + + uint32_t code = 0, prev_count = 0; + for (uint32_t bits = 1; bits < 16; bits++) { + uint32_t count = length_counts[bits]; + code = (code + prev_count) << 1; + prev_count = count; + length_codes[bits] = code; + } + + for (uint32_t i = 0; i < num_symbols; i++) { + uint32_t len = symbols[i].length; + symbols[i].bits = len ? bit_reverse(length_codes[len]++, len) : 0; + } + + break; + } +} + +uint32_t match_len(const unsigned char *a, const unsigned char *b, uint32_t max_length) +{ + if (max_length > 258) max_length = 258; + for (uint32_t len = 0; len < max_length; len++) { + if (*a++ != *b++) return len; + } + return max_length; +} + +uint16_t encode_lit(uint32_t value, uint32_t bits) +{ + return (uint16_t)(value | (0xfffeu << bits)); +} + +uint32_t sym_offset_bits(HuffSymbol *syms, uint32_t code, uint32_t base, const uint16_t *counts, uint32_t value) +{ + for (uint32_t bits = 0; counts[bits]; bits++) { + uint32_t num = counts[bits] << bits, delta = value - base; + if (delta < num) { + return syms[code + (delta >> bits)].length + bits; + } + code += counts[bits]; + base += num; + } + return syms[code].bits; +} + +size_t encode_sym_offset(uint16_t *dst, uint16_t code, uint32_t base, const uint16_t *counts, uint32_t value) +{ + for (uint32_t bits = 0; counts[bits]; bits++) { + uint32_t num = counts[bits] << bits, delta = value - base; + if (delta < num) { + dst[0] = code + (delta >> bits); + if (bits > 0) { + dst[1] = encode_lit(delta & ((1 << bits) - 1), bits); + return 2; + } else { + return 1; + } + } + code += counts[bits]; + base += num; + } + dst[0] = code; + return 1; +} + +uint32_t lz_hash(const unsigned char *d) +{ + uint32_t x = (uint32_t)d[0] | (uint32_t)d[1] << 8 | (uint32_t)d[2] << 16; + x ^= x >> 16; + x *= UINT32_C(0x7feb352d); + x ^= x >> 15; + x *= UINT32_C(0x846ca68b); + x ^= x >> 16; + return x ? x : 1; +} + +void init_tri_dist(uint16_t *tri_dist, const void *data, uint32_t length) +{ + const uint32_t max_scan = 32; + const unsigned char *d = (const unsigned char*)data; + struct Match { + uint32_t hash = 0; + uint32_t offset = 0x80000000; + }; + std::vector match_table; + uint32_t mask = 0x1ffff; + match_table.resize(mask + 1); + for (uint32_t i = 0; i < length; i++) { + if (length - i >= 3) { + uint32_t hash = lz_hash(d + i), replace_ix = 0, replace_score = 0; + for (uint32_t scan = 0; scan < max_scan; scan++) { + uint32_t ix = (hash + scan) & mask; + uint32_t delta = (uint32_t)(i - match_table[ix].offset); + if (match_table[ix].hash == hash && delta <= 32768) { + tri_dist[i] = (uint16_t)delta; + match_table[ix].offset = i; + replace_ix = UINT32_MAX; + break; + } else { + uint32_t score = delta <= 32768 ? delta : 32768 + max_scan - scan; + if (score > replace_score) { + replace_score = score; + replace_ix = ix; + if (score > 32768) break; + } + } + } + if (replace_ix != UINT32_MAX) { + match_table[replace_ix].hash = hash; + match_table[replace_ix].offset = i; + tri_dist[i] = UINT16_MAX; + } + } else { + tri_dist[i] = UINT16_MAX; + } + } +} + +static picort_forceinline bool cmp3(const void *a, const void *b) +{ + const char *ca = (const char*)a, *cb = (const char*)b; + return ca[0] == cb[0] && ca[1] == cb[1] && ca[2] == cb[2]; +} + +struct LzMatch +{ + uint32_t len = 0, dist = 0, bits = 0; +}; + +static const uint16_t len_counts[] = { 8, 4, 4, 4, 4, 4, 0 }; +static const uint16_t dist_counts[] = { 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0 }; + +LzMatch find_match(HuffSymbol *syms, const uint16_t *tri_dist, const void *data, uint32_t begin, uint32_t end) +{ + const unsigned char *d = (const unsigned char*)data; + int32_t max_len = (int32_t)end - begin - 1; + if (max_len > 258) max_len = 258; + if (max_len < 3) return { }; + uint32_t best_len = 0, best_dist = 0; + int32_t m_off = begin - tri_dist[begin], m_end = m_off, m_delta = 0; + uint32_t best_bits = syms[d[begin + 0]].length + syms[d[begin + 1]].length; + for (size_t scan = 0; scan < 1000; scan++) { + if (begin - m_off > 32768 || m_off < 0 || m_end < 0 || m_delta > max_len - 3) break; + int32_t delta = m_end - m_off - 3; + + bool ok = true; + if (m_off >= 0 && (m_end - m_off < m_delta || !cmp3(d + m_off + m_delta, d + begin + m_delta))) { + m_off -= tri_dist[m_off]; + if (m_off >= 0 && m_end - m_off > m_delta && cmp3(d + m_off + m_delta, d + begin + m_delta)) { + m_end = m_off + m_delta; + } + ok = false; + } + if (m_end >= m_delta && (m_end - m_off < m_delta || !cmp3(d + m_end - m_delta, d + begin))) { + m_end -= tri_dist[m_end]; + if (m_end >= m_delta && m_end - m_off < m_delta && cmp3(d + m_end - m_delta, d + begin)) { + m_off = m_end - m_delta; + } + ok = false; + } + if (!ok) continue; + + if (m_delta <= 3 || !memcmp(d + begin, d + m_off, m_delta + 3)) { + do { + uint32_t m_len = m_delta + 3, m_dist = begin - m_off; + uint32_t m_bits = sym_offset_bits(syms, 257, 3, len_counts, m_len) + + sym_offset_bits(syms, 286, 1, dist_counts, m_dist); + + best_bits += syms[d[begin + m_len - 1]].length; + if (m_bits < best_bits) { + best_bits = m_bits; + best_len = m_len; + best_dist = m_dist; + } + + m_end++; + m_delta++; + } while (m_delta <= max_len - 3 && d[begin + m_delta + 2] == d[m_off + m_delta + 2]); + } else { + m_off--; + } + } + return { best_len, best_dist, best_bits }; +} + +uint32_t encode_lz(HuffSymbol *syms, uint16_t *dst, const uint16_t *tri_dist, const void *data, uint32_t begin, uint32_t end, uint32_t *p_bits) +{ + const unsigned char *d = (const unsigned char*)data; + uint16_t *p = dst; + uint32_t bits = 0; + for (int32_t i = (int32_t)begin; i < (int32_t)end; i++) { + + LzMatch match = find_match(syms, tri_dist, data, i, end); + while (match.len > 0) { + LzMatch next = find_match(syms, tri_dist, data, i + 1, end); + if (next.len == 0) break; + + uint32_t match_bits = match.bits, next_bits = next.bits + syms[d[i]].length; + for (uint32_t j = i + match.len; j < i + 1 + next.len; j++) match_bits += syms[d[j]].length; + for (uint32_t j = i + 1 + next.len; j < i + match.len; j++) next_bits += syms[d[j]].length; + if (next_bits >= match_bits) break; + + bits += syms[d[i]].length; + *p++ = d[i++]; + match = next; + } + + if (match.len > 0) { + assert(!memcmp(d + i, d + i - match.dist, match.len)); + p += encode_sym_offset(p, 257, 3, len_counts, match.len); + p += encode_sym_offset(p, 286, 1, dist_counts, match.dist); + i += match.len - 1; + } else { + *p++ = d[i]; + } + } + return (uint32_t)(p - dst); +} + +size_t encode_lengths(uint16_t *dst, HuffSymbol *syms, uint32_t *p_count, uint32_t min_count) +{ + uint32_t count = *p_count; + while (count > min_count && syms[count - 1].length == 0) count--; + *p_count = count; + + uint16_t *p = dst; + for (uint32_t begin = 0; begin < count; ) { + uint16_t len = syms[begin].length; + uint32_t end = begin + 1; + while (end < count && syms[end].length == len) { + end++; + } + + uint32_t span_begin = begin; + while (begin < end) { + uint32_t num = end - begin; + if (num < 3 || (len > 0 && begin == span_begin)) { + num = 1; + *p++ = len; + } else if (len == 0 && end - begin < 11) { + *p++ = 17; + *p++ = encode_lit(num - 3, 3); + } else if (len == 0) { + if (num > 138) num = 138; + *p++ = 18; + *p++ = encode_lit(num - 11, 7); + } else { + if (num > 6) num = 6; + *p++ = 16; + *p++ = encode_lit(num - 3, 2); + } + begin += num; + } + } + return (size_t)(p - dst); +} + +size_t flush_bits(char **p_dst, size_t reg, size_t num) +{ + char *dst = *p_dst; + for (; num >= 8; num -= 8) { + *dst++ = (uint8_t)reg; + reg >>= 8; + } + *p_dst = dst; + return reg; +} + +picort_forceinline void push_bits(char **p_dst, size_t *p_reg, size_t *p_num, uint32_t value, uint32_t bits) +{ + if (*p_num + bits > sizeof(size_t) * 8) { + *p_reg = flush_bits(p_dst, *p_reg, *p_num); + *p_num &= 0x7; + } + *p_reg |= (size_t)value << *p_num; + *p_num += bits; +} + +void encode_syms(char **p_dst, size_t *p_reg, size_t *p_num, HuffSymbol *table, const uint16_t *syms, size_t num_syms) +{ + size_t reg = *p_reg, num = *p_num; + for (size_t i = 0; i < num_syms; i++) { + uint32_t sym = syms[i]; + if (sym & 0x8000) { + // TODO: BSR? + uint32_t bits = 15; + while (sym & (1 << bits)) bits--; + push_bits(p_dst, ®, &num, sym & ((1 << bits) - 1), bits); + } else { + HuffSymbol hs = table[sym]; + push_bits(p_dst, ®, &num, hs.bits, hs.length); + } + } + *p_reg = reg; + *p_num = num; +} + +uint32_t adler32(const void *data, size_t size) +{ + size_t a = 1, b = 0; + const char *p = (const char*)data; + const size_t num_before_wrap = sizeof(size_t) == 8 ? 380368439u : 5552u; + size_t size_left = size; + while (size_left > 0) { + size_t num = size_left <= num_before_wrap ? size_left : num_before_wrap; + size_left -= num; + const char *end = p + num; + while (p != end) { + a += (size_t)(uint8_t)*p++; b += a; + } + a %= 65521u; + b %= 65521u; + } + return (uint32_t)((b << 16) | (a & 0xffff)); +} + +size_t deflate(void *dst, const void *data, size_t length) +{ + char *dp = (char*)dst; + + static const uint32_t lz_block_size = 8*1024*1024; + static const uint32_t huff_block_size = 64*1024; + + std::vector sym_buf, tri_buf; + sym_buf.resize(std::min((size_t)huff_block_size, length)); + tri_buf.resize(std::min((size_t)lz_block_size, length)); + + size_t reg = 0, num = 0; + + push_bits(&dp, ®, &num, 0x78, 8); + push_bits(&dp, ®, &num, 0x9c, 8); + + for (size_t lz_base = 0; lz_base < length; lz_base += lz_block_size) { + size_t lz_length = length - lz_base; + if (lz_length > lz_block_size) lz_length = lz_block_size; + + init_tri_dist(tri_buf.data(), (const char*)data + lz_base, (uint32_t)lz_length); + + for (size_t huff_base = 0; huff_base < lz_length; huff_base += huff_block_size) { + size_t huff_length = lz_length - huff_base; + if (huff_length > huff_block_size) huff_length = huff_block_size; + + uint16_t *syms = sym_buf.data(); + size_t num_syms = 0; + + HuffSymbol sym_huffs[316]; + for (uint32_t i = 0; i < 316; i++) { + sym_huffs[i].length = i >= 256 ? 6 : 8; + } + + for (uint32_t i = 0; i < 2; i++) { + uint32_t bits = 0; + num_syms = encode_lz(sym_huffs, syms, tri_buf.data(), (const char*)data + lz_base, (uint32_t)huff_base, (uint32_t)(huff_base + huff_length), &bits); + + uint32_t sym_counts[316] = { }; + for (size_t i = 0; i < num_syms; i++) { + uint32_t sym = syms[i]; + if (sym < 316) sym_counts[sym]++; + } + sym_counts[256] = 1; + + build_huffman(sym_huffs + 0, sym_counts + 0, 286, 15); + build_huffman(sym_huffs + 286, sym_counts + 286, 30, 15); + } + + uint32_t hlit = 286, hdist = 30; + uint16_t header_syms[316], *header_dst = header_syms; + header_dst += encode_lengths(header_dst, sym_huffs + 0, &hlit, 257); + header_dst += encode_lengths(header_dst, sym_huffs + 286, &hdist, 1); + size_t header_len = (size_t)(header_dst - header_syms); + + uint32_t header_counts[19] = { }; + HuffSymbol header_huffs[19]; + for (size_t i = 0; i < header_len; i++) { + uint32_t sym = header_syms[i]; + if (sym < 19) header_counts[sym]++; + } + + build_huffman(header_huffs, header_counts, 19, 7); + static const uint8_t lens[] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + uint32_t hclen = 19; + while (hclen > 4 && header_huffs[lens[hclen - 1]].length == 0) hclen--; + + bool end = huff_base + huff_length == lz_length && lz_base + lz_length == length; + push_bits(&dp, ®, &num, end ? 0x5 : 0x4, 3); + + push_bits(&dp, ®, &num, hlit - 257, 5); + push_bits(&dp, ®, &num, hdist - 1, 5); + push_bits(&dp, ®, &num, hclen - 4, 4); + for (uint32_t i = 0; i < hclen; i++) { + push_bits(&dp, ®, &num, header_huffs[lens[i]].length, 3); + } + + encode_syms(&dp, ®, &num, header_huffs, header_syms, header_len); + encode_syms(&dp, ®, &num, sym_huffs, syms, num_syms); + + HuffSymbol end_hs = sym_huffs[256]; + push_bits(&dp, ®, &num, end_hs.bits, end_hs.length); + } + } + + if (num % 8 != 0) push_bits(&dp, ®, &num, 0, 8 - (num % 8)); + uint32_t checksum = adler32(data, length); + for (size_t i = 0; i < 4; i++) { + push_bits(&dp, ®, &num, (checksum >> (24 - i * 8)) & 0xff, 8); + } + + flush_bits(&dp, reg, num); + + return (size_t)(dp - (char*)dst); +} + +void png_filter_row(uint32_t method, uint8_t *dst, const uint8_t *line, const uint8_t *prev, uint32_t width, uint32_t num_channels) +{ + int32_t dx = (int32_t)num_channels, pitch = (int32_t)(width * num_channels); + if (method == 0) { + for (int32_t i = 0; i < pitch; i++) dst[i] = line[i]; + } else if (method == 1) { + for (int32_t i = 0; i < pitch; i++) dst[i] = line[i] - line[i-dx]; + } else if (method == 2) { + for (int32_t i = 0; i < pitch; i++) dst[i] = line[i] - prev[i]; + } else if (method == 3) { + for (int32_t i = 0; i < pitch; i++) dst[i] = line[i] - (line[i-dx] + prev[i]) / 2; + } else if (method == 4) { + for (int32_t i = 0; i < pitch; i++) { + int32_t s = line[i], a = line[i-dx], b = prev[i], c = prev[i-dx], p = a+b-c; + int32_t pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); + if (pa <= pb && pa <= pc) dst[i] = (uint8_t)(s - a); + else if (pb <= pc) dst[i] = (uint8_t)(s - b); + else dst[i] = (uint8_t)(s - c); + } + } +} + +void crc32_init(uint32_t *crc_table) +{ + for (uint32_t i = 0; i < 256; i++) { + uint32_t r = i; + for(uint32_t k = 0; k < 8; ++k) { + r = ((r & 1) ? UINT32_C(0xEDB88320) : 0) ^ (r >> 1); + } + crc_table[i] = r; + } +} + +uint32_t crc32(uint32_t *crc_table, const void *data, size_t size, uint32_t seed) +{ + uint32_t crc = ~seed; + const uint8_t *src = (const uint8_t*)data; + for (size_t i = 0; i < size; i++) { + crc = crc_table[(crc ^ src[i]) & 0xff] ^ (crc >> 8); + } + return ~crc; +} + +void png_add_chunk(uint32_t *crc_table, std::vector &dst, const char *tag, const void *data, size_t size) +{ + uint8_t be_size[] = { (uint8_t)(size>>24), (uint8_t)(size>>16), (uint8_t)(size>>8), (uint8_t)size }; + dst.insert(dst.end(), be_size, be_size + 4); + dst.insert(dst.end(), (const uint8_t*)tag, (const uint8_t*)tag + 4); + dst.insert(dst.end(), (const uint8_t*)data, (const uint8_t*)data + size); + uint32_t crc = crc32(crc_table, dst.data() + dst.size() - (size + 4), size + 4, 0); + uint8_t be_crc[] = { (uint8_t)(crc>>24), (uint8_t)(crc>>16), (uint8_t)(crc>>8), (uint8_t)crc }; + dst.insert(dst.end(), be_crc, be_crc + 4); +} + +std::vector write_png(const void *data, uint32_t width, uint32_t height) +{ + std::vector result; + + const uint8_t *pixels = (const uint8_t*)data; + size_t num_pixels = (size_t)width * (size_t)height; + + uint32_t num_channels = 3; + for (size_t i = 0; i < num_pixels; i++) { + if (pixels[i * 4 + 3] < 255) { + num_channels = 4; + break; + } + } + + std::vector lines[2]; + lines[0].resize((width + 1) * num_channels); + lines[1].resize((width + 1) * num_channels); + uint8_t *prev = lines[0].data() + num_channels; + uint8_t *line = lines[1].data() + num_channels; + + std::vector idat, idat_deflate; + idat.resize((width * num_channels + 1) * height); + // TODO: Proper bound... + idat_deflate.resize(idat.size() + idat.size() / 10); + + uint32_t pitch = width * num_channels; + uint8_t *dst = idat.data(); + for (uint32_t y = 0; y < height; y++) { + const uint8_t *src = pixels + y * width * 4; + for (uint32_t c = 0; c < num_channels; c++) { + for (uint32_t x = 0; x < width; x++) { + line[x*num_channels + c] = src[x*4 + c]; + } + } + + uint32_t best_filter = 0, best_entropy = UINT32_MAX; + for (uint32_t f = 0; f <= 4; f++) { + png_filter_row(f, dst + 1, line, prev, width, num_channels); + uint32_t entropy = 0; + for (uint32_t x = 0; x < pitch; x++) { + entropy += abs((int8_t)dst[1 + x]); + } + if (entropy < best_entropy) { + best_filter = f; + best_entropy = entropy; + } + } + if (best_filter != 4) { + png_filter_row(best_filter, dst + 1, line, prev, width, num_channels); + } + dst[0] = (uint8_t)best_filter; + + dst += width * num_channels + 1; + std::swap(prev, line); + } + + size_t idat_length = deflate(idat_deflate.data(), idat.data(), idat.size()); + + uint8_t ihdr[] = { + (uint8_t)(width>>24), (uint8_t)(width>>16), (uint8_t)(width>>8), (uint8_t)width, + (uint8_t)(height>>24), (uint8_t)(height>>16), (uint8_t)(height>>8), (uint8_t)height, + 8, (uint8_t)(num_channels == 4 ? 6 : 2), 0, 0, 0, + }; + + uint32_t crc_table[256]; + crc32_init(crc_table); + + const char magic[] = "\x89PNG\r\n\x1a\n"; + result.insert(result.end(), magic, magic + 8); + png_add_chunk(crc_table, result, "IHDR", ihdr, sizeof(ihdr)); + png_add_chunk(crc_table, result, "IDAT", idat_deflate.data(), idat_length); + png_add_chunk(crc_table, result, "IEND", NULL, 0); + return result; +} + +// -- BVH construction + +struct Bounds +{ + Vec3 min = { +Inf, +Inf, +Inf }; + Vec3 max = { -Inf, -Inf, -Inf }; + + Vec3 center() const { return (min + max) * 0.5f; } + Vec3 diagonal() const { return max - min; } + Real area() const { + Vec3 d = max - min; + return 2.0f * (d.x*d.y + d.y*d.z + d.z*d.x); + } + + void add(const Bounds &b) { + min = ::min(min, b.min); + max = ::max(max, b.max); + } +}; + +struct Triangle +{ + Vec3 v[3]; + size_t index = 0; + + Bounds bounds() const { return { min(min(v[0], v[1]), v[2]), max(max(v[0], v[1]), v[2]) }; } +}; + +struct BVH +{ + Triangle *triangles = nullptr; + size_t num_triangles = 0; + Bounds child_bounds[2]; + Real spacer = 0.0f; + std::unique_ptr child_nodes; +}; + +struct BVHBucket +{ + Bounds bounds; + size_t count = 0; + + inline void add(const Bounds &b) { bounds.add(b); count++; } + inline void add(const BVHBucket &b) { bounds.add(b.bounds); count += b.count; } + Real cost(Real parent_area) { + return bounds.area() / parent_area * (Real)((count + 3) / 4); + } +}; + +struct BVHSplit +{ + Real cost = Inf; + int axis = -1; + size_t bucket = 0; + BVHBucket left, right; +}; + +Bounds merge_triangle_bounds(const Triangle *triangles, size_t count) +{ + Bounds bounds; + for (size_t i = 0; i < count; i++) bounds.add(triangles[i].bounds()); + return bounds; +} + +BVHBucket merge_buckets(const BVHBucket *buckets, size_t count) +{ + BVHBucket bucket; + for (size_t i = 0; i < count; i++) bucket.add(buckets[i]); + return bucket; +} + +void bvh_recurse(BVH &bvh, Triangle *triangles, size_t count, const Bounds &bounds, int depth); + +// Split a BVH node to two containing equal amount of triangles on the largest axis +void bvh_split_equal(BVH &bvh, Triangle *triangles, size_t count, const Bounds &bounds, int depth) +{ + int axis = largest_axis(bounds.diagonal()); + std::sort(triangles, triangles + count, [axis](const Triangle &a, const Triangle &b) { + return a.bounds().center()[axis] < b.bounds().center()[axis]; }); + + size_t num_left = count / 2, num_right = count - num_left; + Triangle *right = triangles + num_left; + bvh.child_bounds[0] = merge_triangle_bounds(triangles, num_left); + bvh.child_bounds[1] = merge_triangle_bounds(right, num_right); + + bvh.child_nodes = std::make_unique(2); + bvh_recurse(bvh.child_nodes[0], triangles, num_left, bvh.child_bounds[0], depth + 1); + bvh_recurse(bvh.child_nodes[1], right, num_right, bvh.child_bounds[1], depth + 1); +} + +// Split a BVH node based on the SAH heuristic +// https://pbr-book.org/3ed-2018/Primitives_and_Intersection_Acceleration/Bounding_Volume_Hierarchies#TheSurfaceAreaHeuristic +void bvh_split_bucketed(BVH &bvh, Triangle *triangles, size_t count, const Bounds &bounds, int depth) +{ + constexpr size_t num_buckets = 8; + BVHBucket buckets[3][num_buckets]; + + // Initialized buckets with triangles + Real nb = (Real)num_buckets - 0.0001f; + Vec3 to_bucket = Vec3{ nb, nb, nb } / (bounds.max - bounds.min); + for (size_t i = 0; i < count; i++) { + Triangle &tri = triangles[i]; + Bounds tri_bounds = tri.bounds(); + Vec3 t = (tri_bounds.center() - bounds.min) * to_bucket; + t = min(max(t, Vec3{}), Vec3{ nb, nb, nb }); + buckets[0][(size_t)t.x].add(tri_bounds); + buckets[1][(size_t)t.y].add(tri_bounds); + buckets[2][(size_t)t.z].add(tri_bounds); + } + + // Find the best split that minimizes the estimated SAH cost + BVHSplit split; + Real parent_area = bounds.area(); + for (int axis = 0; axis < 3; axis++) { + for (size_t bucket = 1; bucket < num_buckets - 1; bucket++) { + BVHBucket left = merge_buckets(buckets[axis], bucket); + BVHBucket right = merge_buckets(buckets[axis] + bucket, num_buckets - bucket); + if (left.count == 0 || right.count == 0) continue; + + Real cost = 0.5f + left.cost(parent_area) + right.cost(parent_area); + if (cost < split.cost) { + split = { cost, axis, bucket, left, right }; + } + } + } + + Real leaf_cost = (Real)((count + 3) / 4); + + // Partition the triangles to the left and right halves and recurse if we found + // a split better than a leaf node, otherwise create a leaf or an equal split BVH. + if (split.axis >= 0 && (split.cost < leaf_cost || count > 16)) { + Triangle *first = triangles, *last = triangles + count; + while (first != last) { + Bounds tri_bounds = first->bounds(); + Vec3 t = (tri_bounds.center() - bounds.min) * to_bucket; + t = min(max(t, Vec3{}), Vec3{ nb, nb, nb }); + if ((size_t)t[split.axis] < split.bucket) { + ++first; + } else { + std::swap(*first, *--last); + } + } + + size_t num_left = first - triangles, num_right = count - num_left; + assert(num_left == split.left.count && num_right == split.right.count); + bvh.child_bounds[0] = split.left.bounds; + bvh.child_bounds[1] = split.right.bounds; + bvh.child_nodes = std::make_unique(2); + + // TODO: Thread limit + if (depth < 4 && (num_left > count / 8 || num_right > count / 8)) { + std::thread a { bvh_recurse, std::ref(bvh.child_nodes[0]), triangles, num_left, bvh.child_bounds[0], depth + 1 }; + std::thread b { bvh_recurse, std::ref(bvh.child_nodes[1]), first, num_right, bvh.child_bounds[1], depth + 1 }; + a.join(); + b.join(); + } else { + bvh_recurse(bvh.child_nodes[0], triangles, num_left, bvh.child_bounds[0], depth + 1); + bvh_recurse(bvh.child_nodes[1], first, num_right, bvh.child_bounds[1], depth + 1); + } + + } else if (count > 16) { + bvh_split_equal(bvh, triangles, count, bounds, depth); + } else { + bvh.triangles = triangles; + bvh.num_triangles = count; + } +} + +// Choose a split method for the current BVH node +void bvh_recurse(BVH &bvh, Triangle *triangles, size_t count, const Bounds &bounds, int depth) +{ + if (count <= 4) { + bvh.triangles = triangles; + bvh.num_triangles = count; + } else if (depth > 32) { + bvh_split_equal(bvh, triangles, count, bounds, depth); + } else { + bvh_split_bucketed(bvh, triangles, count, bounds, depth); + } +} + +// Build a BVH structure from `count` `triangles`. +BVH build_bvh(Triangle *triangles, size_t count) +{ + BVH bvh; + Bounds bounds = merge_triangle_bounds(triangles, count); + bvh_recurse(bvh, triangles, count, bounds, 0); + return bvh; +} + +struct Ray +{ + Vec3 origin; + Vec3 direction; +}; + +struct RayHit { Real t = Inf, u = 0.0f, v = 0.0f; size_t index = SIZE_MAX; size_t steps = 0; }; + +struct RayTrace +{ + struct Axes { int x = -1, y = -1, z = -1; }; + + Ray ray; + Vec3 rcp_direction; + Real spacer = 0.0f; + + Axes axes; + Vec3 shear; + + Real max_t = Inf; + RayHit hit; +}; + +// Precompute some values to trace with for `ray` +RayTrace setup_trace(const Ray &ray, Real max_t=Inf) +{ + int kz = largest_axis(abs(ray.direction)); + int kx = (kz + 1) % 3, ky = (kz + 2) % 3; + if (ray.direction[kz] < 0.0f) std::swap(kx, ky); + + RayTrace trace; + trace.ray = ray; + trace.rcp_direction = Vec3{1.0f, 1.0f, 1.0f} / ray.direction; + trace.axes = { kx, ky, kz }; + trace.shear = Vec3{ray.direction[kx], ray.direction[ky], 1.0f} / ray.direction[kz]; + trace.max_t = max_t; + return trace; +} + +// Test if `trace` intersects `bounds`, returns front intersection t value +// https://pbr-book.org/3ed-2018/Shapes/Basic_Shape_Interface#RayndashBoundsIntersections +picort_forceinline Real intersect_bounds(const RayTrace &trace, const Bounds &bounds) +{ + Vec3 ts_min = (bounds.min - trace.ray.origin) * trace.rcp_direction; + Vec3 ts_max = (bounds.max - trace.ray.origin) * trace.rcp_direction; + Vec3 ts_near = min(ts_min, ts_max); + Vec3 ts_far = max(ts_min, ts_max); + Real t_near = max(max_component(ts_near), 0.0f); + Real t_far = min_component(ts_far); + return t_near <= t_far ? t_near : Inf; +} + +// Check if `trace` intersects `triangle` in a watertight manner, updates `trace.hit` +// http://jcgt.org/published/0002/01/05/ +// https://pbr-book.org/3ed-2018/Shapes/Triangle_Meshes#TriangleIntersection +void intersect_triangle(RayTrace &trace, const Triangle &triangle) +{ + int kx = trace.axes.x, ky = trace.axes.y, kz = trace.axes.z; + Vec3 s = trace.shear; + + Vec3 a = triangle.v[0] - trace.ray.origin; + Vec3 b = triangle.v[1] - trace.ray.origin; + Vec3 c = triangle.v[2] - trace.ray.origin; + + Real ax = a[kx] - s.x*a[kz], ay = a[ky] - s.y*a[kz]; + Real bx = b[kx] - s.x*b[kz], by = b[ky] - s.y*b[kz]; + Real cx = c[kx] - s.x*c[kz], cy = c[ky] - s.y*c[kz]; + + Real u = cx*by - cy*bx; + Real v = ax*cy - ay*cx; + Real w = bx*ay - by*ax; + if (sizeof(Real) < 8 && (u == 0.0f || v == 0.0f || w == 0.0f)) { + using D = double; + u = (Real)((D)cx*(D)by - (D)cy*(D)bx); + v = (Real)((D)ax*(D)cy - (D)ay*(D)cx); + w = (Real)((D)bx*(D)ay - (D)by*(D)ax); + } + + if ((u<0.0f || v<0.0f || w<0.0f) && (u>0.0f || v>0.0f || w>0.0f)) return; + + Real det = u + v + w; + Real t = u*s.z*a[kz] + v*s.z*b[kz] + w*s.z*c[kz]; + + if (det == 0.0f) return; + if (det < 0.0f && (t >= 0.0f || t < trace.max_t * det)) return; + if (det > 0.0f && (t <= 0.0f || t > trace.max_t * det)) return; + + Real rcp_det = 1.0f / det; + trace.max_t = t * rcp_det; + trace.hit = { t * rcp_det, u * rcp_det, v * rcp_det, triangle.index, trace.hit.steps }; +} + +struct BVHHit +{ + const BVH *bvh; + Real t; +}; + +// Check if `trace` intersects anything within `bvh`, updates `trace.hit` +void intersect_bvh(RayTrace &trace, const BVH &root) +{ + BVHHit stack[64]; + uint32_t depth = 1; + stack[0].bvh = &root; + stack[0].t = 0.0f; + + while (depth > 0) { + depth--; + if (stack[depth].t >= trace.max_t) continue; + const BVH *bvh = stack[depth].bvh; + + while (bvh && bvh->num_triangles == 0) { + trace.hit.steps++; + const BVH *child0 = &bvh->child_nodes[0], *child1 = &bvh->child_nodes[1]; + picort_prefetch(&child0->child_bounds); + picort_prefetch(&child1->child_bounds); + Real t0 = intersect_bounds(trace, bvh->child_bounds[0]); + Real t1 = intersect_bounds(trace, bvh->child_bounds[1]); + bvh = NULL; + if (t0 < t1) { + if (t1 < trace.max_t) { + stack[depth].bvh = child1; + stack[depth].t = t1; + depth++; + } + if (t0 < trace.max_t) { + bvh = child0; + } + } else { + if (t0 < trace.max_t) { + stack[depth].bvh = child0; + stack[depth].t = t0; + depth++; + } + if (t1 < trace.max_t) { + bvh = child1; + } + } + } + + if (bvh && bvh->num_triangles > 0) { + trace.hit.steps++; + for (size_t i = 0; i < bvh->num_triangles; i++) { + intersect_triangle(trace, bvh->triangles[i]); + } + } + } +} + +#if SSE + +picort_forceinline Real scale_to_real(uint8_t scale) +{ + return _mm_cvtss_f32(_mm_castsi128_ps(_mm_set1_epi32((int)scale << 23))); +} + +uint8_t real_to_scale(Real v) +{ + uint32_t exp = ((uint32_t)_mm_cvtsi128_si32(_mm_castps_si128(_mm_set_ss(v * 2.125f))) >> 23) & 0xff; + if (exp < 1) exp = 1; + if (exp > 254) exp = 254; + return exp; +} + +#else + +struct ScaleTable +{ + Real v[256]; + + ScaleTable() { + for (int i = 0; i < 256; i++) { + v[i] = ldexp((Real)1.0, i - 127); + } + } +}; + +ScaleTable g_scale_table; + +picort_forceinline Real scale_to_real(uint8_t scale) +{ + return g_scale_table.v[(uint32_t)scale]; +} + +uint8_t real_to_scale(Real v) +{ + int exp; + float frac = frexp(v * 2.125f, &exp); + exp += 127; + if (exp < 1) exp = 1; + if (exp > 254) exp = 254; + return (uint8_t)exp; +} + + +#endif + +picort_forceinline uint8_t rcp_scale(uint8_t v) +{ + return 254 - v; +} + +union alignas(64) BVH4 +{ + struct { + const void *data; + uint8_t tag_node; + } common; + struct { + const void *children; + uint8_t origin_scale; + uint8_t bounds_scale; + int16_t origin[3]; + int16_t bounds[3][2][4]; + } node; + struct { + const void *vertices; + uint8_t tag_zero; + uint8_t num_triangles; + uint32_t triangle_offset; + uint8_t triangles[4][3][4]; + } leaf; + struct { + uintptr_t data_index; + } build; +}; + +static_assert(sizeof(uintptr_t) == sizeof(void*), "Aliasing breaks BVH4"); +static_assert(sizeof(BVH4) == 64, "BVH4 is too big"); + +struct Trace4 +{ + int sx, sy, sz; + Real max_t; + const BVH4 *bvhs; + + Real4 ray_origin; + Real4 ray_rcp_dir; + + Real4::Index triangle_shuffle; + Real4 shear; + + RayHit hit; + + bool shadow; +}; + +static const Real4::Index sort_indices[] = { + { 1, 2, 3, 1 }, { 2, 3, 0, 2 }, { 3, 0, 1, 3 }, { 0, 1, 2, 0 }, +}; + +Real4 to_real4(const Vec3 &v) +{ + return { v.x, v.y, v.z, 0.0f }; +} + +struct Scene4 +{ + std::vector bvhs; + std::vector vertices; + std::vector triangle_indices; +}; + +static std::atomic_uint64_t a_count[5]; + +RayHit intersect4(const Scene4 &scene, const Ray &ray, Real ray_max_t=Inf, bool shadow=false) +{ + RayHit hit; + + int kz = largest_axis(abs(ray.direction)); + int kx = (kz + 1) % 3, ky = (kz + 2) % 3; + if (ray.direction[kz] < 0.0f) std::swap(kx, ky); + + Real4::Index triangle_shuffle = { (uint8_t)kx, (uint8_t)ky, (uint8_t)kz, 3 }; + + Real4 ray_origin = to_real4(ray.origin); + Real4 ray_rcp_dir = to_real4(Vec3{1.0f, 1.0f, 1.0f} / ray.direction); + Real4 ray_shear = to_real4(Vec3{ray.direction[kx], ray.direction[ky], 1.0f} / ray.direction[kz]); + + // TODO: These get reloaded by MSVC.... + int sx = ray.direction.x < 0.0f ? 8 : 0; + int sy = ray.direction.y < 0.0f ? 8 : 0; + int sz = ray.direction.z < 0.0f ? 8 : 0; + + const BVH4 *bvh = scene.bvhs.data(); + picort_prefetch((const char*)bvh->common.data + 0*64); + picort_prefetch((const char*)bvh->common.data + 1*64); + picort_prefetch((const char*)bvh->common.data + 2*64); + picort_prefetch((const char*)bvh->common.data + 3*64); + + const BVH4 *stack_bvh[64]; + Real stack_t[64]; + int stack_top = 0; + + for (;;) { + hit.steps++; + + if (bvh->common.tag_node) { + Real origin_scale = scale_to_real(bvh->node.origin_scale); + Real bounds_scale = scale_to_real(bvh->node.bounds_scale); + Real rcp_bounds_scale = scale_to_real(rcp_scale(bvh->node.bounds_scale)); + Real4 bvh_origin = Real4::load_i16(bvh->node.origin) * origin_scale; + + Real4 origin = (ray_origin - bvh_origin) * rcp_bounds_scale; + Real4 rcp_dir = ray_rcp_dir * bounds_scale; + + Real4 min_x = (Real4::load_i16((const int16_t*)((const char*)bvh->node.bounds[0] + (sx^0))) - origin.xs()) * rcp_dir.xs(); + Real4 max_x = (Real4::load_i16((const int16_t*)((const char*)bvh->node.bounds[0] + (sx^8))) - origin.xs()) * rcp_dir.xs(); + Real4 min_y = (Real4::load_i16((const int16_t*)((const char*)bvh->node.bounds[1] + (sy^0))) - origin.ys()) * rcp_dir.ys(); + Real4 max_y = (Real4::load_i16((const int16_t*)((const char*)bvh->node.bounds[1] + (sy^8))) - origin.ys()) * rcp_dir.ys(); + Real4 min_z = (Real4::load_i16((const int16_t*)((const char*)bvh->node.bounds[2] + (sz^0))) - origin.zs()) * rcp_dir.zs(); + Real4 max_z = (Real4::load_i16((const int16_t*)((const char*)bvh->node.bounds[2] + (sz^8))) - origin.zs()) * rcp_dir.zs(); + Real4 min_t = Real4::max(Real4::max(min_x, min_y), Real4::max(min_z, 0.0f)); + Real4 max_t = Real4::min(Real4::min(max_x, max_y), max_z); + Real4 t = Real4::select(min_t <= max_t, min_t, Inf); + Real4::Mask hit_mask = t < ray_max_t; + if (hit_mask.any()) { + int mask = hit_mask.mask(); + int count = (int)popcount4((unsigned)mask); + const BVH4 *children = (const BVH4*)bvh->node.children; + + if (count > 1) { + int closest = (int)first_set4((unsigned)(t == t.min()).mask()); + bvh = children + closest; + picort_prefetch((const char*)bvh->common.data + 0*64); + picort_prefetch((const char*)bvh->common.data + 1*64); + picort_prefetch((const char*)bvh->common.data + 2*64); + picort_prefetch((const char*)bvh->common.data + 3*64); + + Real4 rest = Real4::shuffle(t, sort_indices[closest]); + + Real va = rest.x(), vb = rest.y(), vc = rest.z(); + int mab = va < vb ? 0 : 1; + int mbc = 1 + (vb < vc ? 0 : 1); + int mac = (va < vc ? 0 : 1) << 1; + int tmp = va < vc ? mbc : mab; + + int i0 = mab == mbc ? 1 : mac; + int i1 = mab == mbc ? mac : tmp; + int i2 = i0 ^ i1 ^ 3; + + const BVH4 *c0 = children + ((closest + 1 + i0) & 3); + const BVH4 *c1 = children + ((closest + 1 + i1) & 3); + const BVH4 *c2 = children + ((closest + 1 + i2) & 3); + + stack_bvh[stack_top + ((count - 2) & 3)] = c0; + stack_t[stack_top + ((count - 2) & 3)] = rest.get(i0); + stack_bvh[stack_top + ((count - 3) & 3)] = c1; + stack_t[stack_top + ((count - 3) & 3)] = rest.get(i1); + stack_bvh[stack_top + ((count - 4) & 3)] = c2; + stack_t[stack_top + ((count - 4) & 3)] = rest.get(i2); + stack_top += count - 1; + + continue; + } else { + int closest = (int)first_set4((unsigned)(mask)); + bvh = children + closest; + picort_prefetch((const char*)bvh->common.data + 0*64); + picort_prefetch((const char*)bvh->common.data + 1*64); + picort_prefetch((const char*)bvh->common.data + 2*64); + picort_prefetch((const char*)bvh->common.data + 3*64); + continue; + } + + } + } else { + Real4::Index shuf = triangle_shuffle; + Real4 sx = ray_shear.xs(); + Real4 sy = ray_shear.ys(); + Real4 sz = ray_shear.zs(); + Real4 shuf_origin = Real4::shuffle(ray_origin, shuf); + uint32_t num_tris = bvh->leaf.num_triangles; + uint32_t num_blocks = (uint32_t)(num_tris + 3) / 4; + uint32_t valid_mask = (1u << num_tris) - 1; + for (uint32_t base = 0; base < num_blocks; base++) { + const Vec3 *vertices = (const Vec3*)bvh->leaf.vertices; + + Real4 v0x = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][0][0]), shuf) - shuf_origin; + Real4 v0y = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][0][1]), shuf) - shuf_origin; + Real4 v0z = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][0][2]), shuf) - shuf_origin; + Real4 v0w = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][0][3]), shuf) - shuf_origin; + Real4::transpose(v0x, v0y, v0z, v0w); + Real4 ax = v0x - sx*v0z, ay = v0y - sy*v0z; + + Real4 v1x = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][1][0]), shuf) - shuf_origin; + Real4 v1y = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][1][1]), shuf) - shuf_origin; + Real4 v1z = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][1][2]), shuf) - shuf_origin; + Real4 v1w = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][1][3]), shuf) - shuf_origin; + Real4::transpose(v1x, v1y, v1z, v1w); + Real4 bx = v1x - sx*v1z, by = v1y - sy*v1z; + + Real4 v2x = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][2][0]), shuf) - shuf_origin; + Real4 v2y = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][2][1]), shuf) - shuf_origin; + Real4 v2z = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][2][2]), shuf) - shuf_origin; + Real4 v2w = Real4::load_shuffle((const Real*)(vertices + bvh->leaf.triangles[base][2][3]), shuf) - shuf_origin; + Real4::transpose(v2x, v2y, v2z, v2w); + Real4 cx = v2x - sx*v2z, cy = v2y - sy*v2z; + + Real4 u = cx*by - cy*bx; + Real4 v = ax*cy - ay*cx; + Real4 w = bx*ay - by*ax; + + if (sizeof(Real) < 8 && ((u == 0.0f) | (v == 0.0f) | (w == 0.0f)).any()) { + using D = double; + u = Real4 { + (Real)((D)cx.x()*(D)by.x() - (D)cy.x()*(D)bx.x()), + (Real)((D)cx.y()*(D)by.y() - (D)cy.y()*(D)bx.y()), + (Real)((D)cx.z()*(D)by.z() - (D)cy.z()*(D)bx.z()), + (Real)((D)cx.w()*(D)by.w() - (D)cy.w()*(D)bx.w()), }; + v = Real4 { + (Real)((D)ax.x()*(D)cy.x() - (D)ay.x()*(D)cx.x()), + (Real)((D)ax.y()*(D)cy.y() - (D)ay.y()*(D)cx.y()), + (Real)((D)ax.z()*(D)cy.z() - (D)ay.z()*(D)cx.z()), + (Real)((D)ax.w()*(D)cy.w() - (D)ay.w()*(D)cx.w()), }; + w = Real4 { + (Real)((D)bx.x()*(D)ay.x() - (D)by.x()*(D)ax.x()), + (Real)((D)bx.y()*(D)ay.y() - (D)by.y()*(D)ax.y()), + (Real)((D)bx.z()*(D)ay.z() - (D)by.z()*(D)ax.z()), + (Real)((D)bx.w()*(D)ay.w() - (D)by.w()*(D)ax.w()), }; + } + + Real4::Mask bad = ((u<0.0f) | (v<0.0f) | (w<0.0f)) & ((u>0.0f) | (v>0.0f) | (w>0.0f)); + if (!bad.all()) { + uint32_t bad_mask = bad.mask(); + + Real4 t = u*sz*v0z + v*sz*v1z + w*sz*v2z; + + uint32_t good_mask = (bad_mask ^ 0xf) & valid_mask; + do { + assert(good_mask); + uint32_t i = first_set4(good_mask); + good_mask &= good_mask - 1; + + Real ui = u.get(i), vi = v.get(i), wi = w.get(i), ti = t.get(i); + + Real det = ui + vi + wi; + if (det == 0.0f) continue; + if (det < 0.0f && (ti >= 0.0f || ti < ray_max_t * det)) continue; + if (det > 0.0f && (ti <= 0.0f || ti > ray_max_t * det)) continue; + + uint32_t index = scene.triangle_indices[bvh->leaf.triangle_offset + (uint32_t)(base * 4 + i)]; + + Real rcp_det = 1.0f / det; + ray_max_t = ti * rcp_det; + hit = { ti * rcp_det, ui * rcp_det, vi * rcp_det, index, hit.steps }; + + if (shadow) return hit; + } while (good_mask); + } + + valid_mask >>= 4; + } + } + + for (;;) { + if (stack_top == 0) return hit; + stack_top--; + if (stack_t[stack_top] < ray_max_t) { + bvh = stack_bvh[stack_top]; + picort_prefetch((const char*)bvh->common.data + 0*64); + picort_prefetch((const char*)bvh->common.data + 1*64); + picort_prefetch((const char*)bvh->common.data + 2*64); + picort_prefetch((const char*)bvh->common.data + 3*64); + break; + } + } + } +} + +void create_node4(Scene4 &scene, size_t dst_ix, const BVH &src) +{ + BVH4 dst = { 0 }; + if (src.num_triangles > 0) { + size_t base = scene.vertices.size() > 12 ? scene.vertices.size() - 12 : 0; + dst.leaf.tag_zero = 0; + uint8_t min_offset = UINT8_MAX; + dst.leaf.triangle_offset = (uint32_t)scene.triangle_indices.size(); + dst.leaf.num_triangles = (uint8_t)src.num_triangles; + + for (uint32_t tri_ix = 0; tri_ix < src.num_triangles; tri_ix++) { + scene.triangle_indices.push_back((uint32_t)src.triangles[tri_ix].index); + + for (uint32_t vert_ix = 0; vert_ix < 3; vert_ix++) { + Vec3 v = src.triangles[tri_ix].v[vert_ix]; + size_t i, count = scene.vertices.size(); + for (i = base; i < count; i++) { + if (scene.vertices[i] == v) break; + } + i = count; + if (i == count) scene.vertices.push_back(v); + uint8_t offset = (uint8_t)(i - base); + if (offset < min_offset) min_offset = offset; + dst.leaf.triangles[tri_ix/4][vert_ix][tri_ix%4] = offset; + } + } + + for (uint32_t tri_ix = 0; tri_ix < src.num_triangles; tri_ix++) { + for (uint32_t vert_ix = 0; vert_ix < 3; vert_ix++) { + dst.leaf.triangles[tri_ix/4][vert_ix][tri_ix%4] -= min_offset; + } + } + + uint32_t last_ix = (uint32_t)src.num_triangles - 1; + for (uint32_t tri_ix = (uint32_t)src.num_triangles; tri_ix < 16; tri_ix++) { + for (uint32_t vert_ix = 0; vert_ix < 3; vert_ix++) { + uint8_t v = dst.leaf.triangles[last_ix/4][vert_ix][last_ix%4]; + dst.leaf.triangles[tri_ix/4][vert_ix][tri_ix%4] = v; + } + } + + dst.build.data_index = base + min_offset; + } else { + struct BVHChild + { + const BVH *bvh; + Bounds bounds; + }; + + size_t child_base = scene.bvhs.size(); + dst.build.data_index = (uint32_t)child_base; + scene.bvhs.insert(scene.bvhs.end(), 4, BVH4{}); + + BVHChild children[4]; + uint32_t num_children = 0; + + for (uint32_t i = 0; i < 2; i++) { + const BVH &child = src.child_nodes[i]; + if (child.num_triangles > 0) { + children[num_children++] = { &child, src.child_bounds[i] }; + } else { + children[num_children++] = { &child.child_nodes[0], child.child_bounds[0] }; + children[num_children++] = { &child.child_nodes[1], child.child_bounds[1] }; + } + } + + Bounds bounds; + for (uint32_t i = 0; i < num_children; i++) { + bounds.add(children[i].bounds); + } + + + Vec3 origin = bounds.center(); + uint8_t origin_scale_ix = real_to_scale(max_component(abs(origin)) / INT16_MAX); + Real origin_scale = scale_to_real(origin_scale_ix); + + dst.node.origin_scale = origin_scale_ix; + + dst.node.origin[0] = (int16_t)(origin.x / origin_scale); + dst.node.origin[1] = (int16_t)(origin.y / origin_scale); + dst.node.origin[2] = (int16_t)(origin.z / origin_scale); + + origin = Vec3{ (Real)dst.node.origin[0], (Real)dst.node.origin[1], (Real)dst.node.origin[2] } * origin_scale; + + Vec3 max_delta; + for (uint32_t i = 0; i < num_children; i++) { + Vec3 v = max(abs(children[i].bounds.min - origin), abs(children[i].bounds.max - origin)); + max_delta = max(max_delta, v); + } + uint8_t bounds_scale_ix = real_to_scale(max_component(max_delta) / INT16_MAX); + Real bounds_scale = scale_to_real(bounds_scale_ix); + + dst.node.bounds_scale = bounds_scale_ix; + + for (uint32_t i = 0; i < num_children; i++) { + Vec3 min = children[i].bounds.min - origin; + Vec3 max = children[i].bounds.max - origin; + for (uint32_t c = 0; c < 3; c++) { + dst.node.bounds[c][0][i] = (int16_t)floor_real(min[c] / bounds_scale - 0.03125f); + dst.node.bounds[c][1][i] = (int16_t)ceil_real(max[c] / bounds_scale + 0.03125f); + } + } + for (uint32_t i = num_children; i < 4; i++) { + for (uint32_t c = 0; c < 3; c++) { + dst.node.bounds[c][0][i] = INT16_MAX; + dst.node.bounds[c][1][i] = INT16_MIN; + } + } + + for (uint32_t i = 0; i < num_children; i++) { + create_node4(scene, child_base + i, *children[i].bvh); + } + } + + scene.bvhs[dst_ix] = dst; +} + +Scene4 create_scene4(const BVH &root) +{ + Scene4 scene; + scene.bvhs.emplace_back(); + create_node4(scene, 0, root); + + for (BVH4 &bvh : scene.bvhs) { + if (bvh.common.tag_node) { + bvh.node.children = scene.bvhs.data() + bvh.build.data_index; + } else { + bvh.leaf.vertices = scene.vertices.data() + bvh.build.data_index; + } + } + + return scene; +} + +// -- Sampling + +template +inline Real radical_inverse(uint64_t a, Real offset) { + const Real inv_base = 1.0f / (Real)Base; + uint64_t rev_digits = 0; + Real inv_base_n = 1.0f; + while (a) { + uint64_t next = a / Base; + uint64_t digit = a - next * Base; + rev_digits = rev_digits * Base + digit; + inv_base_n *= inv_base; + a = next; + } + return fmod((Real)(rev_digits * inv_base_n + offset), 1.0f); +} + +Vec2 halton_vec2(uint64_t a, const Vec2 &offset=Vec2{}) +{ + return { + radical_inverse<2>(a, offset.x), + radical_inverse<3>(a, offset.y), + }; +} + +Vec3 halton_vec3(uint64_t a, const Vec3 &offset=Vec3{}) +{ + return { + radical_inverse<2>(a, offset.x), + radical_inverse<3>(a, offset.y), + radical_inverse<5>(a, offset.z), + }; +} + +Vec3 cosine_hemisphere_sample(const Vec2 &uv) +{ + Real r = sqrt(uv.x); + Real t = 2.0f*Pi*uv.y; + return { r * cos(t), r * sin(t), sqrt_safe(1.0f - r) }; +} + +// Probability distribution for `cosine_hemisphere_sample()` +Real cosine_hemisphere_pdf(const Vec3 &wi) +{ + return wi.z / Pi; +} + +Vec3 uniform_sphere_sample(const Vec2 &uv) +{ + Real t = 2.0f*Pi*uv.x; + Real p = 2.0f*uv.y - 1.0f, q = sqrt_safe(1.0f - p*p); + return { q * cos(t), q * sin(t), p }; +} + +struct Basis +{ + Vec3 x, y, z; + + Vec3 to_basis(const Vec3 &v) const { return { dot(x, v), dot(y, v), dot(z, v) }; } + Vec3 to_world(const Vec3 &v) const { return x*v.x + y*v.y + z*v.z; } +}; + +Basis basis_normal(const Vec3 &axis_z) +{ + Vec3 z = normalize(axis_z); + Real t = sqrt(z.x*z.x + z.y*z.y); + Vec3 x = t > 0.0f ? Vec3{-z.y/t, z.x/t, 0.0f} : Vec3{1.0f, 0.0f, 0.0f}; + Vec3 y = normalize(cross(z, x)); + return { x, y, z }; +} + +// -- Material + +Vec3 schlick_f(const Vec3 &f0, const Vec3 &wo) +{ + Real x = 1.0f - wo.z; + return f0 + (Vec3{1.0f,1.0f,1.0f} - f0) * (x*x*x*x*x); +} + +Real ggx_d(const Vec3 &wm, Real a2) +{ + Real x = wm.z * wm.z * (a2 - 1.0f) + 1.0f; + return a2 / (Pi * x * x); +} + +Real ggx_g1(const Vec3 &wo, Real a2) +{ + Real x = sqrt_safe(a2 + (1.0f - a2) * wo.z * wo.z) + wo.z; + return (2.0f * wo.z) / x; +} + +Real ggx_g2(const Vec3 &wo, const Vec3 &wi, Real a2) +{ + Real x = wo.z * sqrt_safe(a2 + (1.0f - a2) * wi.z * wi.z); + Real y = wi.z * sqrt_safe(a2 + (1.0f - a2) * wo.z * wo.z); + return (2.0f * wo.z * wi.z) / (x + y); +} + +// Sample a visible normal vector for `uv` +// http://www.jcgt.org/published/0007/04/01/paper.pdf +Vec3 ggx_vndf_wm_sample(const Vec3 &wo, Real a, const Vec2 &uv) +{ + Basis basis = basis_normal(Vec3{a*wo.x, a*wo.y, wo.z}); + Real x = 1.0f / (1.0f + basis.z.z); + Real r = sqrt_safe(uv.x); + Real t = uv.y < x ? uv.y/x * Pi : Pi + (uv.y-x) / (1.0f-x) * Pi; + Vec2 p { r*cos(t), r*sin(t)*(uv.y < x ? 1.0f : basis.z.z) }; + Vec3 n = basis.to_world(Vec3{ p.x, p.y, sqrt_safe(1.0f - p.x*p.x - p.y*p.y) }); + return normalize(Vec3{a*n.x, a*n.y, max(n.z, 0.0f)}); +} + +// Probability distribution for `ggx_vndf_wm_sample()` +// http://www.jcgt.org/published/0007/04/01/paper.pdf eq. (17) and (3) +Real ggx_vndf_wm_pdf(const Vec3 &wo, const Vec3 &wm, Real a2) +{ + // TODO: dot(wo, wm) / wo.z^2? + return (ggx_g1(wo, a2) * ggx_d(wm, a2)) / (wo.z * 4.0f); +} + +struct Texture +{ + Vec3 value; + Image image; +}; + +struct Material +{ + bool has_alpha = false; + Texture base_factor; + Texture base_color; + Texture roughness; + Texture metallic; + Texture emission_factor; + Texture emission_color; +}; + +struct Light +{ + Vec3 position; + Vec3 color; + Real radius = 0.0f; + bool directional = false; +}; + +struct Surface +{ + Vec3 diffuse; + Vec3 specular; + Vec3 emission; + Real alpha = 1.0f; + Real roughness = 0.0f; +}; + +Vec3 eval_texture(const Texture &texture, const Vec2 &uv) +{ + if (texture.image.width > 0) { + Real4 v = sample_image(texture.image, uv); + return { v.x(), v.y(), v.z() }; + } + return texture.value; +} + +Surface eval_surface(const Material &material, const Vec2 &uv) +{ + Vec3 base_color = eval_texture(material.base_color, uv) * eval_texture(material.base_factor, uv).x; + Vec3 emission = eval_texture(material.emission_color, uv) * eval_texture(material.emission_factor, uv).x; + Real metallic = eval_texture(material.metallic, uv).x; + Surface s; + s.diffuse = lerp(base_color, Vec3{}, metallic); + s.specular = lerp(Vec3{0.04f,0.04f,0.04f}, base_color, metallic); + s.emission = emission; + s.roughness = max(0.05f, eval_texture(material.roughness, uv).x); // TODO?? + return s; +} + +Vec3 surface_wi_sample(const Vec3 &uvw, const Surface &surface, const Vec3 &wo, Real *out_pdf) +{ + Real a = surface.roughness * surface.roughness, a2 = a * a; + Vec3 f = schlick_f(surface.specular, wo); + + Real kd = length(surface.diffuse), ks = length(f); + Real pd = kd / (kd + ks), ps = 1.0f - pd; + + Vec3 wm, wi; + if (uvw.z <= pd) { + wi = cosine_hemisphere_sample(Vec2{ uvw.x, uvw.y }); + wm = normalize(wi + wo); + } else { + wm = ggx_vndf_wm_sample(wo, a, Vec2{ uvw.x, uvw.y }); + wi = reflect(wm, wo); + } + if (wi.z <= 0.0f) return Vec3{}; + + *out_pdf = pd * cosine_hemisphere_pdf(wi) + ps * ggx_vndf_wm_pdf(wo, wm, a2); + return wi; +} + +Real surface_wi_pdf(const Surface &surface, const Vec3 &wo, const Vec3 &wi) +{ + // TODO: Cache these + if (wi.z <= 0.0f) return 0.0f; + Real a = surface.roughness * surface.roughness, a2 = a * a; + Vec3 f = schlick_f(surface.specular, wo); + Vec3 wm = normalize(wi + wo); + Real kd = length(surface.diffuse), ks = length(f); + Real pd = kd / (kd + ks), ps = 1.0f - pd; + return pd * cosine_hemisphere_pdf(wi) + ps * ggx_vndf_wm_pdf(wo, wm, a2); +} + +Vec3 surface_brdf(const Surface &surface, const Vec3 &wo, const Vec3 &wi) +{ + Real a = surface.roughness * surface.roughness, a2 = a * a; + Vec3 wm = normalize(wi + wo); + Vec3 f = schlick_f(surface.specular, wo); + + Vec3 dif = surface.diffuse * (wi.z / Pi); + + Real g = ggx_g2(wo, wi, a2); + Real d = ggx_d(wm, a2); + Vec3 spec = f * (d * g) / (4.0f * wo.z); + + return dif*(Vec3{1.0f,1.0f,1.0f} - f) + spec; +} + +struct TriangleInfo +{ + Vec3 v[3]; + Vec2 uv[3]; + Vec3 normal[3]; + uint32_t material = 0; +}; + +struct Camera +{ + Vec3 origin; + Vec3 forward; + Vec3 planeX; + Vec3 planeY; +}; + +static const uint32_t SkyGridX = 128; +static const uint32_t SkyGridY = 64; +static const Vec2 SkyGridCell = { 2.0f * Pi / (Real)SkyGridX, Pi / (Real)SkyGridY }; + +struct Scene +{ + Camera camera; + BVH *root = nullptr; + TriangleInfo *triangles = nullptr; + Material *materials = nullptr; + + Image sky; + Real sky_factor = 0.0f; + Real sky_rotation = 0.0f; + std::vector sky_grid; + + Light *lights = nullptr; + size_t num_lights = 0; + + Real exposure; + Vec3 indirect_clamp; + int indirect_depth; + bool bvh_heatmap; + + Scene4 scene4; +}; + +Vec3 shade_sky(Scene &scene, const Ray &ray) +{ + Vec3 sky; + if (scene.sky.width > 0) { + Vec3 dir = normalize(ray.direction); + Vec2 uv = { + (atan2(dir.z, dir.x) + scene.sky_rotation) * (0.5f/Pi), + 0.99f - acos(clamp(dir.y, -1.0f, 1.0f)) * (0.98f/Pi), + }; + Real4 v = sample_image(scene.sky, uv); + sky = Vec3{ v.x(), v.y(), v.z() }; + } else { + sky = (Vec3{ 0.05f, 0.05f, 0.05f } + + Vec3{ 1.0f, 1.0f, 1.3f } * max(ray.direction.y, 0.0f) + + Vec3{ 0.12f, 0.15f, 0.0f } * max(-ray.direction.y, 0.0f)) * 0.03f; + } + return sky * scene.sky_factor; +} + +void init_sky_grid(Scene &scene) +{ + constexpr size_t num_samples = 128; + + Real total_weight = 0.0f; + scene.sky_grid.resize(1 + SkyGridX * SkyGridY); + Real *sky_grid = scene.sky_grid.data(); + + for (size_t i = 0; i < SkyGridX * SkyGridY; i++) { + Vec2 base = { (Real)(i % SkyGridX), (Real)(i / SkyGridX) }; + + Real weight = 0.0f; + for (size_t j = 0; j < num_samples; j++) { + Vec2 uv = (base + halton_vec2(j)) * SkyGridCell; + Real sin_y = sin(uv.y); + Vec3 dir = { sin_y * cos(uv.x), cos(uv.y), sin_y * sin(uv.x) }; + Ray ray = { { }, dir }; + Vec3 sky = shade_sky(scene, ray); + weight += (0.001f + sin_y) * (0.001f + sqrt(length(sky))); + } + + weight /= (Real)num_samples; + total_weight += weight; + sky_grid[1 + i] = weight; + } + + for (size_t i = 0; i < SkyGridX * SkyGridY; i++) { + sky_grid[1 + i] /= total_weight; + } + + for (size_t i = 0; i < SkyGridX * SkyGridY; i++) { + sky_grid[1 + i] += sky_grid[i]; + } +} + +Vec3 sky_grid_sample(Scene &scene, Vec3 uvw, Real *out_pdf) +{ + Real w = uvw.z; + Real *weight = std::lower_bound(scene.sky_grid.data(), scene.sky_grid.data() + scene.sky_grid.size(), w); + uint32_t ix = (uint32_t)(weight - scene.sky_grid.data()); + if (ix == 0) ix = 1; + if (ix >= scene.sky_grid.size()) ix = (uint32_t)scene.sky_grid.size() - 1; + Vec2 base = { (Real)(ix % SkyGridX), (Real)(ix / SkyGridX) }; + Vec2 uv = (base + Vec2{ uvw.x, uvw.y }) * SkyGridCell; + Real sin_y = sin(uv.y); + Vec3 dir = { sin_y * cos(uv.x), cos(uv.y), sin_y * sin(uv.x) }; + *out_pdf = (weight[0] - weight[-1]) * (Real)(SkyGridX * SkyGridY) / (sin_y * (2.0f * Pi * Pi)); + return dir; +} + +Real sky_grid_pdf(Scene &scene, Vec3 dir) +{ + Vec2 uv = { + (atan2(dir.z, dir.x)) * (0.5f/Pi), + acos(clamp(dir.y, -1.0f, 1.0f)) * (1.0f/Pi), + }; + + uint32_t x = (uint32_t)((uv.x + 1.0f) * (Real)SkyGridX) % SkyGridX; + uint32_t y = std::min((uint32_t)(uv.y * (Real)SkyGridY), SkyGridY); + uint32_t ix = y * SkyGridX + x; + Real *weight = scene.sky_grid.data() + ix; + Real sin_y = sqrt_safe(1.0f - dir.y * dir.y); + return (weight[0] - weight[-1]) * (Real)(SkyGridX * SkyGridY) / (sin_y * (2.0f * Pi * Pi)); +} + +RayHit trace_ray_imp(Scene &scene, const Ray &ray, Real max_t=Inf, bool shadow=false) +{ +#if 0 + RayTrace trace = setup_trace(ray); + intersect_bvh(trace, *scene.root); + return trace.hit; +#else + return intersect4(scene.scene4, ray, max_t, shadow); +#endif +} + +RayHit trace_ray(Random &rng, Scene &scene, const Ray &ray, Real max_t=Inf, bool shadow=false) +{ + RayHit hit = { }; + Real t_offset = 0.0f; + uint32_t depth = 0; + for (;;) { + depth++; + Ray test_ray = { ray.origin + ray.direction * t_offset, ray.direction }; + hit = trace_ray_imp(scene, test_ray, max_t, shadow && depth == 1); + if (hit.index == SIZE_MAX || depth > 64) break; + + const TriangleInfo &tri = scene.triangles[hit.index]; + const Material &material = scene.materials[tri.material]; + if (!material.has_alpha) break; + + if (depth == 1 && shadow) continue; + + Real u = hit.u, v = hit.v, w = 1.0f - u - v; + Vec2 uv = tri.uv[0]*u + tri.uv[1]*v + tri.uv[2]*w; + Real alpha = sample_image(material.base_color.image, uv).w(); + if (uniform_real(rng) < alpha) break; + + t_offset += hit.t * 1.001f + 0.00001f; + } + + hit.t += t_offset; + return hit; +} + +Vec3 trace_path(Random &rng, Scene &scene, const Ray &ray, const Vec3 &uvw, int depth=0) +{ + if (depth > scene.indirect_depth) return { }; + + RayHit hit = trace_ray(rng, scene, ray); + if (scene.bvh_heatmap) { + return Vec3{ 0.005f, 0.003f, 0.1f } * (Real)hit.steps / scene.exposure; + } + + if (hit.t >= Inf) { + return depth == 0 ? shade_sky(scene, ray) : Vec3{ }; + } + + Real u = hit.u, v = hit.v, w = 1.0f - u - v; + const TriangleInfo &tri = scene.triangles[hit.index]; + + Vec3 pos = ray.origin + ray.direction * (hit.t * 0.9999f); + Vec2 uv = tri.uv[0]*u + tri.uv[1]*v + tri.uv[2]*w; + Vec3 normal = tri.normal[0]*u + tri.normal[1]*v + tri.normal[2]*w; + + Basis basis = basis_normal(normal); + + Vec3 wo = basis.to_basis(-ray.direction); + if (wo.z <= 0.001f) { + wo.z = 0.001f; + wo = normalize(wo); + } + + const Material &material = scene.materials[tri.material]; + Surface surface = eval_surface(material, uv); + + Vec3 li = surface.emission; + + for (size_t i = 0; i < scene.num_lights; i++) { + const Light &light = scene.lights[i]; + + Real max_t = 1.0f; + Vec3 delta; + if (light.directional) { + max_t = Inf; + delta = light.position; + } else { + Vec3 p = light.position + uniform_sphere_sample(uniform_vec2(rng)) * light.radius; + delta = p - pos; + max_t = length(delta); + } + + Vec3 dir = normalize(delta); + Vec3 wi = basis.to_basis(dir); + if (wi.z <= 0.0f) continue; + + Ray shadow_ray = { pos, dir }; + RayHit shadow_hit = trace_ray(rng, scene, shadow_ray, max_t, true); + if (shadow_hit.t < max_t) continue; + + Real att = light.directional ? 1.0f : max(dot(delta, delta), 0.01f); + li = li + light.color * surface_brdf(surface, wo, wi) / att; + } + + { + Real grid_pdf = 0.0f; + Vec3 grid_dir = sky_grid_sample(scene, uvw, &grid_pdf); + Vec3 grid_wi = basis.to_basis(grid_dir); + Vec3 grid_li; + + Real brdf_pdf = 0.0f; + Vec3 brdf_wi = surface_wi_sample(uvw, surface, wo, &brdf_pdf); + Vec3 brdf_dir = basis.to_world(brdf_wi); + Vec3 brdf_li; + + Real grid_brdf_pdf = sky_grid_pdf(scene, brdf_dir); + Real brdf_grid_pdf = surface_wi_pdf(surface, wo, grid_wi); + + if (grid_wi.z >= 0.0f) { + Ray shadow_ray = { pos, grid_dir }; + RayHit shadow_hit = trace_ray(rng, scene, shadow_ray, Inf, true); + if (shadow_hit.t >= Inf) { + Vec3 sky = shade_sky(scene, shadow_ray); + grid_li = surface_brdf(surface, wo, grid_wi) * sky; + } + } + + if (brdf_wi.z >= 0.0f && brdf_pdf > 0.0f) { + Ray shadow_ray = { pos, brdf_dir }; + RayHit shadow_hit = trace_ray(rng, scene, shadow_ray, Inf, true); + if (shadow_hit.t >= Inf) { + Vec3 sky = shade_sky(scene, shadow_ray); + brdf_li = surface_brdf(surface, wo, brdf_wi) * sky; + } + } + + Vec3 result = grid_li / (grid_pdf + brdf_grid_pdf) + brdf_li / (brdf_pdf + grid_brdf_pdf); + li = li + result; + } + + { + Real pdf = 0.0f; + Vec3 wi = surface_wi_sample(uniform_vec3(rng), surface, wo, &pdf); + if (pdf == 0.0f) return li; + + Vec3 next_dir = basis.to_world(wi); + Ray next_ray = { pos - ray.direction * 0.0001f, next_dir }; + Vec3 uvw = uniform_vec3(rng); + Vec3 l = trace_path(rng, scene, next_ray, uvw, depth + 1); + l = surface_brdf(surface, wo, wi) * l / pdf; + l = min(l, scene.indirect_clamp); + return li + l; + } +} + +struct Framebuffer +{ + std::vector pixels; + uint32_t width = 0, height = 0; + + Framebuffer() { } + Framebuffer(uint32_t width, uint32_t height) + : pixels(width * height), width(width), height(height) { } +}; + +struct ImagerTracer +{ + Scene scene; + Pixel *pixels; + uint32_t width, height; + size_t num_samples; + uint64_t seed; + std::atomic_uint32_t a_counter { 0 }; + std::atomic_uint32_t a_workers { 0 }; +}; + +Ray camera_ray(Camera &camera, Vec2 uv) +{ + Ray ray; + ray.origin = camera.origin; + ray.direction = normalize(camera.forward + + camera.planeX*(uv.x*2.0f - 1.0f) + + camera.planeY*(uv.y*-2.0f + 1.0f)); + return ray; +} + +void trace_image(ImagerTracer &tracer, bool print_status) +{ + static const size_t tile_size = 16; + uint32_t num_tiles_x = (tracer.width + tile_size - 1) / tile_size; + uint32_t num_tiles_y = (tracer.height + tile_size - 1) / tile_size; + Vec2 resolution = { (Real)tracer.width, (Real)tracer.height }; + + tracer.a_workers.fetch_add(1u, std::memory_order_relaxed); + + for (;;) { + uint32_t tile_ix = tracer.a_counter.fetch_add(1u, std::memory_order_relaxed); + if (tile_ix >= num_tiles_x * num_tiles_y) break; + + uint32_t tile_x = tile_ix % num_tiles_x; + uint32_t tile_y = tile_ix / num_tiles_x; + + Random rng { (tracer.seed << 32u) + tile_ix }; + rng.next(); + + for (uint32_t dy = 0; dy < tile_size; dy++) + for (uint32_t dx = 0; dx < tile_size; dx++) { + uint32_t x = tile_x * tile_size + dx, y = tile_y * tile_size + dy; + if (x >= tracer.width || y >= tracer.height) continue; + + static constexpr uint32_t num_buckets = 6; + Vec3 totals[num_buckets]; + Real weights[num_buckets] = { }; + + Real exposure = tracer.scene.exposure; + Vec3 offset = uniform_vec3(rng); + + for (size_t i = 0; i < tracer.num_samples; i++) { + Vec2 aa = uniform_vec2(rng) - Vec2{ 0.5f, 0.5f }; + Vec2 uv = Vec2 { (Real)x + aa.x, (Real)y + aa.y } / resolution; + + Ray ray = camera_ray(tracer.scene.camera, uv); + + Vec3 uvw = halton_vec3(i, offset); + Vec3 l = trace_path(rng, tracer.scene, ray, uvw) * exposure; + l = min(l, Vec3{ 100.0f, 100.0f, 100.0f }); + + uint32_t bucket = rng.next() % num_buckets; + totals[bucket] = totals[bucket] + l; + weights[bucket] += 1.0f; + +#if 0 + Vec3 mean; + for (uint32_t i = 0; i < num_buckets; i++) { + mean = mean + totals[i] / (weights[i] * num_buckets); + } + Real variance = 0.0f; + for (uint32_t i = 0; i < num_buckets; i++) { + Vec3 delta = (mean - (totals[i] / weights[i])) / mean; + variance += dot(delta, delta); + } + if (i > 64 && variance < 0.04f) { + break; + } +#endif + + } + + Vec3 color; + Real weight = 0.0f; + for (uint32_t i = 0; i < num_buckets; i++) { + color = color + totals[i]; + weight = weight + weights[i]; + } + color = color / weight; + + // Reinhard tonemap + color = color / (Vec3{1.0f, 1.0f, 1.0f} + color); + + // TODO: sRGB + color.x = sqrt(color.x); + color.y = sqrt(color.y); + color.z = sqrt(color.z); + color = min(max(color, Vec3{0.0f,0.0f,0.0f}), Vec3{1.0f,1.0f,1.0f}) * 255.9f; + + size_t ix = y * tracer.width + x; + tracer.pixels[ix] = { (uint8_t)color.x, (uint8_t)color.y, (uint8_t)color.z }; + } + + if (print_status) { + verbosef("%u/%u\n", tile_ix+1, num_tiles_x*num_tiles_y); + } + } + + tracer.a_workers.fetch_sub(1u, std::memory_order_relaxed); +} + +struct BmpHeaderRgba +{ + char data[122] = + // magic size unused data offset DIB size width height + "" "BM" "????" "\0\0\0\0" "\x7a\0\0\0" "\x6c\0\0\0" "????" "????" + // 1-plane 32-bits bitfields data-size print resolution + "" "\x1\0" "\x20\0" "\x3\0\0\0" "????" "\x13\xb\0\0\x13\xb\0\0" + // palette counts channel masks for RGBA colors + "" "\0\0\0\0\0\0\0\0" "\xff\0\0\0\0\xff\0\0\0\0\xff\0\0\0\0\xff" "sRGB"; + + BmpHeaderRgba(size_t width=0, size_t height=0) { + size_t size = width * height * 4; + patch(0x02, 122 + size); // total size + patch(0x12, width); // width (left-to-right) + patch(0x16, 0 - height); // height (top-to-bottom) + patch(0x22, size); // data size + } + + void patch(size_t offset, size_t value) { + data[offset+0] = (char)((value >> 0) & 0xff); + data[offset+1] = (char)((value >> 8) & 0xff); + data[offset+2] = (char)((value >> 16) & 0xff); + data[offset+3] = (char)((value >> 24) & 0xff); + } +}; + +#if GUI + +struct GuiStateWin32 +{ + HANDLE init_event = NULL; + std::thread thread; + HWND hwnd; + + UINT_PTR timer; + std::recursive_mutex mutex; + Framebuffer internal_framebuffer; + const Framebuffer *framebuffer; +}; + +static GuiStateWin32 g_gui; + +LRESULT CALLBACK win32_wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + std::lock_guard lg { g_gui.mutex }; + const Framebuffer *fb = g_gui.framebuffer; + + switch (uMsg) + { + case WM_CLOSE: DestroyWindow(hwnd); return 0; + case WM_DESTROY: PostQuitMessage(0); return 0; + case WM_TIMER: { + if (fb) { + RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_INVALIDATE); + } + } return 0; + default: return DefWindowProcW(hwnd, uMsg, wParam, lParam); + case WM_PAINT: { + PAINTSTRUCT ps; + HDC hdc = BeginPaint(hwnd, &ps); + + if (fb) { + RECT rect; + GetClientRect(hwnd, &rect); + int width = rect.right - rect.left, height = rect.bottom - rect.top; + + BmpHeaderRgba header { fb->width, fb->height }; + StretchDIBits(hdc, 0, 0, width, height, 0, 0, (int)fb->width, (int)fb->height, + fb->pixels.data(), (BITMAPINFO*)(header.data + 0xe), DIB_RGB_COLORS, SRCCOPY); + } + + EndPaint(hwnd, &ps); + } return 0; + } +} + +void win32_gui_thread(const Framebuffer *fb) +{ + WNDCLASSW wc = { }; + wc.lpfnWndProc = &win32_wndproc; + wc.hInstance = GetModuleHandleW(NULL); + wc.lpszClassName = L"picort"; + wc.hCursor = LoadCursorW(NULL, IDC_ARROW); + ATOM atom = RegisterClassW(&wc); + + DWORD style = WS_VISIBLE|WS_OVERLAPPEDWINDOW; + RECT rect = { 0, 0, (int)fb->width, (int)fb->height }; + AdjustWindowRectEx(&rect, style, FALSE, 0); + g_gui.hwnd = CreateWindowExW(0, MAKEINTATOM(atom), L"picort", style, + CW_USEDEFAULT, CW_USEDEFAULT, rect.right-rect.left, rect.bottom-rect.top, + NULL, NULL, wc.hInstance, NULL); + + SetEvent(g_gui.init_event); + + MSG msg; + while (GetMessageW(&msg, NULL, 0, 0) != 0) { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } +} + +void enable_gui(const Framebuffer *fb) +{ + if (!g_gui.init_event) { + g_gui.internal_framebuffer = Framebuffer{ 1, 1 }; + g_gui.framebuffer = &g_gui.internal_framebuffer; + g_gui.init_event = CreateEventW(NULL, FALSE, FALSE, NULL); + g_gui.thread = std::thread{ win32_gui_thread, fb }; + WaitForSingleObject(g_gui.init_event, INFINITE); + } + + std::lock_guard lg { g_gui.mutex }; + g_gui.framebuffer = fb; + if (!g_gui.timer) { + g_gui.timer = SetTimer(g_gui.hwnd, NULL, 100, NULL); + } +} + +void disable_gui(Framebuffer &&fb) +{ + { + std::lock_guard lg { g_gui.mutex }; + g_gui.internal_framebuffer = std::move(fb); + g_gui.framebuffer = &g_gui.internal_framebuffer; + KillTimer(g_gui.hwnd, g_gui.timer); + g_gui.timer = 0; + } + + RedrawWindow(g_gui.hwnd, NULL, NULL, RDW_INVALIDATE | RDW_INVALIDATE); +} + +void close_gui() +{ + PostMessageW(g_gui.hwnd, WM_CLOSE, 0, 0); +} + +void wait_gui() +{ + g_gui.thread.join(); +} + +#else + +void enable_gui(const Framebuffer *fb) { } +void disable_gui(Framebuffer &&fb) { } +void close_gui() { } +void wait_gui() { } + +#endif + +Vec3 from_ufbx(const ufbx_vec3 &v) { return { (Real)v.x, (Real)v.y, (Real)v.z }; } + +bool ends_with(const std::string &str, const char *suffix) +{ + size_t len = strlen(suffix); + return str.size() >= len && !str.compare(str.size() - len, len, suffix); +} + +void setup_texture(Texture &texture, const ufbx_material_map &map) +{ + if (map.has_value) { + texture.value = from_ufbx(map.value_vec3); + } + if (map.texture && map.texture->content.size > 0) { + verbosef("Loading texture: %s\n", map.texture->relative_filename.data); + + texture.image = read_png(map.texture->content.data, map.texture->content.size); + if (!texture.image.error) return; + fprintf(stderr, "Failed to load %s: %s\n", + map.texture->relative_filename.data, texture.image.error); + } + + if (map.texture) { + std::string path { map.texture->filename.data, map.texture->filename.length }; + if (!ends_with(path, ".png")) { + size_t dot = path.rfind('.'); + if (dot != std::string::npos) { + path = path.substr(0, dot) + ".png"; + } + texture.image = load_png(path.c_str()); + } + } +} + +struct ProgressState +{ +}; + +ufbx_progress_result progress(void *user, const ufbx_progress *progress) +{ + ProgressState *state = (ProgressState*)user; + static int timer; + if ((timer++ & 0xfff) == 0) { + verbosef("%.1f/%.1f MB\n", (double)progress->bytes_read/1e6, (double)progress->bytes_total/1e6); + } + return UFBX_PROGRESS_CONTINUE; +} + +struct alignas(8) OptBase +{ + const char *name, *desc, *alias; + uint32_t num_args, size; + bool defined = false; + bool from_arg = false; + + OptBase(const char *name, const char *desc, const char *alias, uint32_t num_args, uint32_t size) + : name(name), desc(desc), alias(alias), num_args(num_args), size(size) { } + + virtual void parse(const char **args) = 0; + virtual int print(char *buf, size_t size) = 0; +}; + +template +struct OptTraits { }; + +template <> struct OptTraits { + enum { num_args = 0 }; + static bool parse(const char **args) { return true; } + static int print(bool v, char *buf, size_t size) { return snprintf(buf, size, "%s", v ? "true" : "false"); } +}; + +template <> struct OptTraits { + enum { num_args = 1 }; + static Real parse(const char **args) { return (Real)strtod(args[0], NULL); } + static int print(Real v, char *buf, size_t size) { return snprintf(buf, size, "%g", v); } +}; + +template <> struct OptTraits { + enum { num_args = 1 }; + static int parse(const char **args) { return atoi(args[0]); } + static int print(int v, char *buf, size_t size) { return snprintf(buf, size, "%d", v); } +}; + +template <> struct OptTraits { + enum { num_args = 1 }; + static double parse(const char **args) { return (double)strtod(args[0], NULL); } + static int print(double v, char *buf, size_t size) { return snprintf(buf, size, "%g", v); } +}; + +template <> struct OptTraits { + enum { num_args = 2 }; + static Vec2 parse(const char **args) { + return { (Real)strtod(args[0], NULL), (Real)strtod(args[1], NULL) }; + } + static int print(const Vec2 &v, char *buf, size_t size) { return snprintf(buf, size, "(%g, %g)", v.x, v.y); } +}; + +template <> struct OptTraits { + enum { num_args = 3 }; + static Vec3 parse(const char **args) { + return { (Real)strtod(args[0], NULL), (Real)strtod(args[1], NULL), (Real)strtod(args[2], NULL) }; + } + static int print(const Vec3 &v, char *buf, size_t size) { return snprintf(buf, size, "(%g, %g, %g)", v.x, v.y, v.z); } +}; + +template <> struct OptTraits { + enum { num_args = 1 }; + static std::string parse(const char **args) { return { args[0] }; } + static int print(const std::string &v, char *buf, size_t size) { return snprintf(buf, size, "%s", v.c_str()); } +}; + +struct StringPair { std::string v[2]; }; + +template <> struct OptTraits { + enum { num_args = 2 }; + static StringPair parse(const char **args) { return { { { args[0] }, { args[1] } } }; } + static int print(const StringPair &v, char *buf, size_t size) { return snprintf(buf, size, "(%s, %s)", v.v[0].c_str(), v.v[1].c_str()); } +}; + +template > +struct Opt : OptBase +{ + T value; + Opt(const char *name, const char *desc, T def = T{}, const char *alias=nullptr) : OptBase(name, desc, alias, Traits::num_args, sizeof(*this)), value(def) { } + virtual void parse(const char **args) override { + value = Traits::parse(args); + } + virtual int print(char *buf, size_t size) override { + return Traits::print(value, buf, size); + } +}; + +struct OptIter +{ + OptBase *ptr; + OptIter(void *ptr) : ptr((OptBase*)ptr) { } + OptIter &operator++() { ptr = (OptBase*)((char*)ptr + ptr->size); return *this; } + OptIter operator++(int) { OptIter it = *this; ptr = (OptBase*)((char*)ptr + ptr->size); return it; } + OptBase &operator*() const { return *ptr; } + OptBase *operator->() const { return ptr; } + bool operator==(const OptIter &rhs) const { return ptr == rhs.ptr; } + bool operator!=(const OptIter &rhs) const { return ptr != rhs.ptr; } +}; + +struct Opts +{ + Opt help { "help", "Display this help", false, "h" }; + Opt input { "input", "Input .fbx file (does not need -i if the path doesn't start with a '-')", "", "i" }; + Opt output { "output", "Output .bmp file (defaults to 'picort-output.bmp')", "picort-output.bmp", "o" }; + Opt verbose { "verbose", "Enable verbose output", false, "v" }; + Opt camera { "camera", "Camera name (defaults to 'picort_camera')", "picort_camera" }; + Opt samples { "samples", "Samples to use while rendering", 64 }; + Opt bounces { "bounces", "Number of indirect bounces", 1 }; + Opt threads { "threads", "Threads to use while rendering (0 for auto-detect)" }; + Opt animation { "animation", "Name of the animation to use" }; + Opt frame { "frame", "Time in frames (can be fractional)", 1 }; + Opt num_frames { "num-frames", "Number of frames to render (starting from --frame)", 1 }; + Opt frame_offset { "frame-offset", "Frame number to start rendering from", 0 }; + Opt fps { "fps", "Frames per second for --num-frames (overrides one set in FBX file)" }; + Opt resolution { "resolution", "Resolution", { 512.0f, 512.0f } }; + Opt resolution_scale { "resolution-scale", "Scale factor to resolution", 1.0 }; + Opt gui { "gui", "Show a GUI window" }; + Opt keep_open { "keep-open", "Keep the GUI open" }; + Opt time { "time", "Time in seconds" }; + Opt scene_scale { "scene-scale", "Global scene scale", 1.0f }; + Opt camera_position { "camera-position", "World space camera position", { 0.0f, 0.0f, 10.0f } }; + Opt camera_direction { "camera-direction", "World space camera direction", { 0.0f, 0.0f, -1.0f } }; + Opt camera_target { "camera-target", "World space camera target", { 0.0f, 0.0f, 0.0f } }; + Opt camera_up { "camera-direction", "World space camera up direction", { 0.0f, 1.0f, 0.0f } }; + Opt camera_fov { "camera-fov", "Camera field of view in degrees", 60.0f }; + Opt sky { "sky", "Sky .png file" }; + Opt sky_exposure { "sky-exposure", "Exposure of the sky", 5.0f }; + Opt sky_rotation { "sky-rotation", "Rotation of the sky in degrees" }; + Opt exposure { "exposure", "Exposure for the camera", 3.0f }; + Opt indirect_clamp { "indirect-clamp", "Clamping for indirect samples", 10.0f }; + Opt base_path { "base-path", "Base directory to look up files from" }; + Opt compare { "compare", "Compare two result images" }; + Opt reference { "reference", "Compare the resulting image to a reference" }; + Opt error_threshold { "error-threshold", "Error threshold (MSE) for comparison", 0.05 }; + Opt bvh_heatmap { "bvh-heatmap", "Visualize BVH heatmap" }; + + OptIter begin() { return this; } + OptIter end() { return this + 1; } +}; + +std::string get_path(const Opts &opts, const Opt &opt) +{ + if (opts.base_path.defined && !opt.from_arg) { + return opts.base_path.value + opt.value; + } else { + return opt.value; + } +} + +void render_frame(ufbx_scene *original_scene, const Opts &opts, int frame_offset=0) +{ + std::vector triangles; + std::vector triangle_infos; + std::vector materials; + std::vector lights; + Camera camera; + + bool has_time = opts.time.defined; + double time = opts.time.value; + if (opts.frame.defined) { + time = opts.frame.value / original_scene->settings.frames_per_second; + has_time = true; + } + + if (frame_offset > 0) { + double fps = opts.fps.defined ? opts.fps.value : original_scene->settings.frames_per_second; + time += frame_offset / fps; + } + + ufbx_scene *scene; + if (has_time) { + ufbx_evaluate_opts eval_opts = { }; + eval_opts.evaluate_skinning = true; + eval_opts.evaluate_caches = true; + eval_opts.load_external_files = true; + + ufbx_anim anim = original_scene->anim; + if (opts.animation.defined) { + ufbx_anim_stack *stack = (ufbx_anim_stack*)ufbx_find_element(original_scene, UFBX_ELEMENT_ANIM_STACK, opts.animation.value.c_str()); + if (stack) { + anim = stack->anim; + } + } + + ufbx_error error; + scene = ufbx_evaluate_scene(original_scene, &anim, time, &eval_opts, &error); + if (!scene) { + char buf[4096]; + ufbx_format_error(buf, sizeof(buf), &error); + fprintf(stderr, "%s\n", buf); + exit(1); + } + } else { + scene = original_scene; + } + + materials.resize(scene->materials.count + 1); + + // Reserve one undefined material + materials[0].base_factor.value.x = 1.0f; + materials[0].base_color.value = Vec3{ 0.8f, 0.8f, 0.8f }; + materials[0].roughness.value.x = 0.5f; + materials[0].metallic.value.x = 0.0f; + + verbosef("Processing materials: %zu\n", scene->materials.count); + + for (size_t i = 0; i < scene->materials.count; i++) { + ufbx_material *mat = scene->materials.data[i]; + Material &dst = materials[i + 1]; + dst.base_factor.value.x = 1.0f; + setup_texture(dst.base_factor, mat->pbr.base_factor); + setup_texture(dst.base_color, mat->pbr.base_color); + setup_texture(dst.roughness, mat->pbr.roughness); + setup_texture(dst.metallic, mat->pbr.metalness); + setup_texture(dst.emission_factor, mat->pbr.emission_factor); + setup_texture(dst.emission_color, mat->pbr.emission_color); + dst.base_color.image.srgb = true; + dst.emission_color.image.srgb = true; + + if (dst.base_color.image.width > 0) { + uint32_t num_pixels = dst.base_color.image.width * dst.base_color.image.height; + const Pixel16 *pixels = dst.base_color.image.pixels.data(); + for (uint32_t i = 0; i < num_pixels; i++) { + if (pixels[i].a < 0xffff) { + dst.has_alpha = true; + break; + } + } + } + } + + verbosef("Processing meshes: %zu\n", scene->meshes.count); + + uint32_t indices[128]; + for (ufbx_mesh *original_mesh : scene->meshes) { + if (original_mesh->instances.count == 0) continue; + ufbx_mesh *mesh = ufbx_subdivide_mesh(original_mesh, 0, NULL, NULL); + + // Iterate over all instances of the mesh + for (ufbx_node *node : mesh->instances) { + if (!node->visible) continue; + + verbosef("%s: %zu triangles\n", node->name.data, mesh->num_triangles); + + ufbx_matrix normal_to_world = ufbx_matrix_for_normals(&node->geometry_to_world); + + // Iterate over all the N-gon faces of the mesh + for (size_t face_ix = 0; face_ix < mesh->num_faces; face_ix++) { + + // Split each face into triangles + size_t num_tris = ufbx_triangulate_face(indices, 128, mesh, mesh->faces[face_ix]); + + // Iterate over reach split triangle + for (size_t tri_ix = 0; tri_ix < num_tris; tri_ix++) { + Triangle tri; + TriangleInfo info; + tri.index = triangles.size(); + + if (mesh->face_material.count > 0) { + ufbx_material *mat = mesh->materials.data[mesh->face_material[face_ix]].material; + info.material = mat->element.typed_id + 1; + } + + for (size_t corner_ix = 0; corner_ix < 3; corner_ix++) { + uint32_t index = indices[tri_ix*3 + corner_ix]; + + // Load the skinned vertex position at `index` + ufbx_vec3 v = ufbx_get_vertex_vec3(&mesh->skinned_position, index); + + ufbx_vec2 uv = mesh->vertex_uv.exists ? ufbx_get_vertex_vec2(&mesh->vertex_uv, index) : ufbx_vec2{}; + ufbx_vec3 n = ufbx_get_vertex_vec3(&mesh->skinned_normal, index); + + // If the skinned positions are local we must apply `to_root` to get + // to world coordinates + if (mesh->skinned_is_local) { + v = ufbx_transform_position(&node->geometry_to_world, v); + n = ufbx_transform_direction(&normal_to_world, n); + } + + info.v[corner_ix] = tri.v[corner_ix] = { (Real)v.x, (Real)v.y, (Real)v.z }; + info.uv[corner_ix] = { (Real)uv.x, (Real)uv.y }; + info.normal[corner_ix] = normalize({ (Real)n.x, (Real)n.y, (Real)n.z }); + } + + triangles.push_back(tri); + triangle_infos.push_back(info); + } + } + } + + // Free the potentially subdivided mesh + ufbx_free_mesh(mesh); + } + + for (ufbx_light *light : scene->lights) { + + // Iterate over all instances of the light + for (ufbx_node *node : light->instances) { + Light l; + + ufbx_prop *radius = ufbx_find_prop(&light->props, "Radius"); + if (!radius) radius = ufbx_find_prop(&node->props, "Radius"); + + if (light->type == UFBX_LIGHT_DIRECTIONAL) { + ufbx_vec3 dir = ufbx_transform_direction(&node->node_to_world, light->local_direction); + l.position = normalize(-from_ufbx(dir)); + l.directional = true; + } else { + l.position = from_ufbx(node->world_transform.translation); + } + + l.color = from_ufbx(light->color) * (Real)light->intensity; + if (radius) l.radius = (Real)radius->value_real; + + lights.push_back(l); + } + } + + uint32_t width = (uint32_t)opts.resolution.value.x, height = (uint32_t)opts.resolution.value.y; + + { + ufbx_node *camera_node = ufbx_find_node(scene, opts.camera.value.c_str()); + if (!camera_node && scene->cameras.count > 0) { + camera_node = scene->cameras[0]->instances.data[0]; + } + + if (camera_node && camera_node->camera && !opts.camera_position.defined) { + ufbx_camera *cam = camera_node->camera; + + Vec3 m0 = normalize(from_ufbx(camera_node->node_to_world.cols[0])); + Vec3 m1 = normalize(from_ufbx(camera_node->node_to_world.cols[1])); + Vec3 m2 = normalize(from_ufbx(camera_node->node_to_world.cols[2])); + Vec3 m3 = from_ufbx(camera_node->node_to_world.cols[3]); + + if (!opts.resolution.defined) { + if (cam->resolution_is_pixels) { + width = (uint32_t)round(cam->resolution.x); + height = (uint32_t)round(cam->resolution.y); + } else if (cam->aspect_mode != UFBX_ASPECT_MODE_WINDOW_SIZE) { + width = (uint32_t)((double)width * cam->resolution.x / cam->resolution.y); + } + } + + camera.planeX = m2 * (Real)cam->field_of_view_tan.x; + camera.planeY = m1 * (Real)cam->field_of_view_tan.y; + camera.forward = m0; + camera.origin = m3; + } else { + Vec3 forward = normalize(opts.camera_direction.value); + if (opts.camera_target.defined) { + forward = normalize(opts.camera_target.value - opts.camera_position.value); + } + Vec3 right = normalize(cross(forward, opts.camera_up.value)); + Vec3 up = normalize(cross(right, forward)); + Real aspect = (Real)width / (Real)height; + Real tan_fov = tan(opts.camera_fov.value * 0.5f * (Pi / 180.0f)); + + camera.planeX = right * tan_fov * aspect; + camera.planeY = up * tan_fov; + camera.forward = forward; + camera.origin = opts.camera_position.value; + } + } + + double res_scale = opts.resolution_scale.value; + if (res_scale != 1.0) { + width = (uint32_t)(width * res_scale); + height = (uint32_t)(height * res_scale); + } + + verbosef("Building BVH: %zu triangles\n", triangles.size()); + + BVH bvh = build_bvh(triangles.data(), triangles.size()); + + Framebuffer framebuffer { width, height }; + + ImagerTracer tracer; + tracer.scene.root = &bvh; + tracer.scene.triangles = triangle_infos.data(); + tracer.scene.materials = materials.data(); + tracer.scene.camera = camera; + tracer.scene.lights = lights.data(); + tracer.scene.num_lights = lights.size(); + if (opts.sky.defined) { + std::string path = get_path(opts, opts.sky); + tracer.scene.sky = load_png(path.c_str()); + tracer.scene.sky.srgb = true; + } + tracer.scene.sky_factor = pow((Real)2.0, opts.sky_exposure.value); + tracer.scene.sky_rotation = opts.sky_rotation.value * (Pi/180.0f); + tracer.scene.exposure = pow((Real)2.0, opts.exposure.value); + tracer.scene.indirect_clamp = Vec3{ 1.0f, 1.0f, 1.0f } * opts.indirect_clamp.value / tracer.scene.exposure; + tracer.scene.indirect_depth = opts.bounces.value; + tracer.scene.bvh_heatmap = opts.bvh_heatmap.value; + tracer.width = width; + tracer.height = height; + tracer.pixels = framebuffer.pixels.data(); + tracer.num_samples = (size_t)opts.samples.value; + tracer.seed = (uint64_t)frame_offset; + + tracer.scene.scene4 = create_scene4(*tracer.scene.root); + + init_sky_grid(tracer.scene); + + size_t num_threads = std::thread::hardware_concurrency() - 1; + if (opts.threads.value > 0) num_threads = (size_t)opts.threads.value - 1; + std::unique_ptr threads = std::make_unique(num_threads); + + verbosef("Using %zu threads\n", num_threads + 1); + + auto time_begin = std::chrono::high_resolution_clock::now(); + + for (size_t i = 0; i < num_threads; i++) { + threads[i] = std::thread { trace_image, std::ref(tracer), false }; + } + + if (opts.gui.value) { + enable_gui(&framebuffer); + } + + trace_image(tracer, true); + + auto time_end = std::chrono::high_resolution_clock::now(); + printf("Done in %.2fs\n", (double)std::chrono::duration_cast(time_end - time_begin).count() * 1e-9); + + for (size_t i = 0; i < num_threads; i++) { + threads[i].join(); + } + + std::string output_path = get_path(opts, opts.output); + + std::vector name; + for (const char *c = output_path.c_str(); *c;) { + if (*c != '#') { + name.push_back(*c++); + } else { + int width = 0; + while (*c == '#') { + width++; + c++; + } + + if (width > 0) { + char tmp[64]; + int len = snprintf(tmp, sizeof(tmp), "%0*d", width, frame_offset); + name.insert(name.end(), tmp, tmp + len); + } + } + } + name.push_back('\0'); + + std::vector png = write_png(framebuffer.pixels.data(), framebuffer.width, framebuffer.height); + + Image image = read_png(png.data(), png.size()); + + bool write_fail = false; + FILE *f = fopen(name.data(), "wb"); + if (f) { + if (fwrite(png.data(), 1, png.size(), f) != png.size()) write_fail = true; + if (fclose(f) != 0) write_fail = true; + } else { + write_fail = true; + } + + if (write_fail) { + fprintf(stderr, "Failed to save result file: %s\n", name.data()); + exit(1); + } + + if (opts.gui.value) { + disable_gui(std::move(framebuffer)); + } + + if (scene != original_scene) { + ufbx_free_scene(scene); + } +} + +void render_file(const Opts &opts) +{ + verbosef("Loading scene: %s\n", opts.input.value.c_str()); + + ProgressState progress_state = { }; + + ufbx_error error; + + ufbx_load_opts load_opts = { }; + + load_opts.evaluate_skinning = true; + + load_opts.progress_cb.fn = &progress; + load_opts.progress_cb.user = &progress_state; + + ufbx_real scale = (ufbx_real)opts.scene_scale.value; + + load_opts.use_root_transform = true; + load_opts.root_transform.rotation = ufbx_identity_quat; + load_opts.root_transform.scale = ufbx_vec3{ scale, scale, scale }; + + std::string path = get_path(opts, opts.input); + ufbx_scene *scene = ufbx_load_file(path.c_str(), &load_opts, &error); + + if (!scene) { + char buf[4096]; + ufbx_format_error(buf, sizeof(buf), &error); + fprintf(stderr, "%s\n", buf); + exit(1); + } + + for (int i = opts.frame_offset.value; i < opts.num_frames.value; i++) { + render_frame(scene, opts, i); + } + + ufbx_free_scene(scene); + + if (opts.gui.value) { + if (!opts.keep_open.value) close_gui(); + wait_gui(); + } +} + +void parse_args(Opts &opts, int argc, char **argv, bool ignore_input) +{ + for (int argi = 1; argi < argc; ) { + const char *arg = argv[argi++]; + if (arg[0] == '-') { + arg++; + if (arg[0] == '-') arg++; + for (OptBase &opt : opts) { + if (!ignore_input && !strcmp(opt.name, "input")) continue; + if (!strcmp(opt.name, arg) || (opt.alias && !strcmp(opt.alias, arg))) { + if ((uint32_t)(argc - argi) >= opt.num_args) { + opt.parse((const char**)argv + argi); + opt.defined = true; + opt.from_arg = true; + argi += opt.num_args; + break; + } + } + } + } else { + if (!ignore_input) { + opts.input.value = arg; + opts.input.defined = true; + opts.input.from_arg = true; + } + } + } +} + +size_t parse_line(const char **tokens, char *line, size_t max_tokens) +{ + size_t num_tokens = 0; + char *src = line, *dst = line; + const char *token = dst; + while (num_tokens < max_tokens) { + while (*src == ' ' || *src == '\r' || *src == '\t' || *src == '\n') { + src++; + } + if (*src == '\0' || *src == '#') break; + if (*src == '"') { + src++; + while (*src != '\0' && *src != '"') { + if (*src == '\\') src++; + *dst++ = *src++; + } + } else { + while (*src != '\0' && *src != ' ' && *src != '\t' && *src != '\r' && *src != '\n') { + *dst++ = *src++; + } + } + if (*src != '\0') src++; + *dst++ = '\0'; + tokens[num_tokens++] = token; + token = dst; + } + return num_tokens; +} + +void parse_file(Opts &opts, const char *filename) +{ + FILE *f = fopen(filename, "rb"); + if (!f) { + fprintf(stderr, "Failed to open: %s\n", filename); + exit(1); + } + + { + size_t len = strlen(filename); + while (len > 0 && filename[len - 1] != '\\' && filename[len - 1] != '/') { + len--; + } + opts.base_path.value = std::string{ filename, len }; + opts.base_path.defined = true; + } + + char line[1024]; + const char *tokens[16]; + while (fgets(line, sizeof(line), f)) { + size_t num_tokens = parse_line(tokens, line, 16); + if (num_tokens < 1) continue; + for (OptBase &opt : opts) { + if (!strcmp(opt.name, tokens[0]) && num_tokens - 1 >= opt.num_args) { + opt.parse(tokens + 1); + opt.defined = true; + break; + } + } + } + + fclose(f); +} + +static void compare_images(Opts &opts, const char *path_a, const char *path_b) +{ + const char *paths[] = { path_a, path_b }; + Image img[2]; + + for (uint32_t i = 0; i < 2; i++) { + const char *path = paths[i]; + img[i] = load_png(path); + if (img[i].error) { + fprintf(stderr, "Failed to load %s: %s\n", path, img[i].error); + exit(1); + } + } + + if (img[0].width != img[1].width || img[0].height != img[1].height) { + fprintf(stderr, "Resolution mismatch: %ux%u vs %ux%u\n", + img[0].width, img[0].height, img[1].width, img[1].height); + exit(1); + } + + double error = 0.0; + for (uint32_t y = 0; y < img[0].height; y++) { + for (uint32_t x = 0; x < img[0].width; x++) { + Pixel16 a = img[0].pixels[y * img[0].width + x]; + Pixel16 b = img[1].pixels[y * img[1].width + x]; + for (uint32_t c = 0; c < 4; c++) { + uint16_t ca = (&a.r)[c], cb = (&b.r)[c]; + double va = (double)ca * (1.0/65535.0), vb = (double)cb * (1.0/65535.0); + error += (va - vb) * (va - vb); + } + } + } + error /= (double)(img[0].width * img[0].height); + + printf("Difference (MSE): %.4f\n", error); + if (error > opts.error_threshold.value) { + printf("ERROR: Over threshold of %.4f\n", opts.error_threshold.value); + exit(1); + } +} + +int main(int argc, char **argv) +{ + Opts opts; + parse_args(opts, argc, argv, false); + + if (opts.help.value) { + fprintf(stderr, "Usage: picort input.fbx (--help)\n"); + for (OptBase &opt : opts) { + char name[64]; + if (opt.alias) { + snprintf(name, sizeof(name), "--%s (-%s)", opt.name, opt.alias); + } else { + snprintf(name, sizeof(name), "--%s", opt.name); + } + fprintf(stderr, " %-20s %s\n", name, opt.desc); + } + return 0; + } + + if (opts.verbose.value) { + g_verbose = true; + } + + if (opts.compare.defined) { + compare_images(opts, opts.compare.value.v[0].c_str(), opts.compare.value.v[1].c_str()); + return 0; + } + + if (!opts.input.defined) { + fprintf(stderr, "Usage: picort input.fbx/.picort.txt (--help)\n"); + return 0; + } + + if (ends_with(opts.input.value, ".txt")) { + std::string path = std::move(opts.input.value); + opts = Opts{}; + parse_file(opts, path.c_str()); + parse_args(opts, argc, argv, true); + } + + if (opts.verbose.defined) { + char buf[512]; + for (OptBase &opt : opts) { + if (opt.defined) { + opt.print(buf, sizeof(buf)); + if (opt.from_arg) { + printf("%s: %s (--)\n", opt.name, buf); + } else { + printf("%s: %s\n", opt.name, buf); + } + } + } + } + + if (opts.num_frames.defined) { + if (!opts.time.defined) { + opts.frame.defined = true; + } + } + + render_file(opts); + + if (opts.reference.defined) { + std::string output = get_path(opts, opts.output); + std::string reference = get_path(opts, opts.reference); + compare_images(opts, output.c_str(), reference.c_str()); + } + + return 0; +} diff --git a/modules/ufbx/examples/viewer/README.md b/modules/ufbx/examples/viewer/README.md new file mode 100644 index 0000000..ef4674a --- /dev/null +++ b/modules/ufbx/examples/viewer/README.md @@ -0,0 +1,38 @@ +# Viewer example + +This example contains a small model viewer using [Sokol](https://github.com/floooh/sokol). + +## Building + +To build the example you need to compile `../../ufbx.c`, `external.c`, and `viewer.c` and link +with the necessary platform libraries. + +### Linux + +```bash +# Install dependencies if missing (Debian/Ubuntu specific here) +sudo apt install -y libgl1-mesa-dev libx11-dev libxi-dev libxcursor-dev + +# Compile and link system libraries +clang -lm -ldl -lGL -lX11 -lXi -lXcursor ../../ufbx.c external.c viewer.c -o viewer + +# Run the executable +./viewer /path/to/my/model.fbx +``` + +### Windows + +Create a new Visual Studio solution and add `../../ufbx.c`, `external.c`, and `viewer.c` as source files. +Either build and run from the command line giving the desired model as an argument or +set the command line arguments from the project "Debugging" settings. + +## Shaders + +The compiled shaders are committed to the repository, so unless modifying `.glsl` files you don't need to do anything. +The shaders are compiled using [sokol-shdc](https://github.com/floooh/sokol-tools/blob/master/docs/sokol-shdc.md), +you can download the prebuilt binaries from [sokol-tools-bin](https://github.com/floooh/sokol-tools-bin). + +```bash +# Compile the mesh shader to a header +sokol-shdc --input shaders/mesh.glsl --output shaders/mesh.h --slang glsl330:hlsl5:metal_macos -b +``` diff --git a/modules/ufbx/examples/viewer/external.c b/modules/ufbx/examples/viewer/external.c new file mode 100644 index 0000000..8977594 --- /dev/null +++ b/modules/ufbx/examples/viewer/external.c @@ -0,0 +1,27 @@ +#define SOKOL_IMPL + +#if defined(__APPLE__) + #define SOKOL_METAL +#elif defined(_WIN32) + #define SOKOL_D3D11 +#elif defined(__EMSCRIPTEN__) + #define SOKOL_GLES2 +#else + #define SOKOL_GLCORE33 +#endif + +#define UMATH_IMPLEMENTATION + +#if defined(TEST_VIEWER) + #define DUMMY_SAPP_MAX_FRAMES 64 + #include "external/dummy_sokol_app.h" + #include "external/dummy_sokol_time.h" + #include "external/dummy_sokol_gfx.h" +#else + #include "external/sokol_app.h" + #include "external/sokol_time.h" + #include "external/sokol_gfx.h" +#endif + +#include "external/sokol_glue.h" +#include "external/umath.h" diff --git a/modules/ufbx/examples/viewer/external/dummy_sokol_app.h b/modules/ufbx/examples/viewer/external/dummy_sokol_app.h new file mode 100644 index 0000000..acdec32 --- /dev/null +++ b/modules/ufbx/examples/viewer/external/dummy_sokol_app.h @@ -0,0 +1,1724 @@ +#if defined(SOKOL_IMPL) && !defined(SOKOL_APP_IMPL) +#define SOKOL_APP_IMPL +#endif +#ifndef SOKOL_APP_INCLUDED +/* + sokol_app.h -- cross-platform application wrapper + + Project URL: https://github.com/floooh/sokol + + Do this: + #define SOKOL_IMPL or + #define SOKOL_APP_IMPL + before you include this file in *one* C or C++ file to create the + implementation. + + In the same place define one of the following to select the 3D-API + which should be initialized by sokol_app.h (this must also match + the backend selected for sokol_gfx.h if both are used in the same + project): + + #define SOKOL_GLCORE33 + #define SOKOL_GLES2 + #define SOKOL_GLES3 + #define SOKOL_D3D11 + #define SOKOL_METAL + #define SOKOL_WGPU + + Optionally provide the following defines with your own implementations: + + SOKOL_ASSERT(c) - your own assert macro (default: assert(c)) + SOKOL_LOG(msg) - your own logging function (default: puts(msg)) + SOKOL_UNREACHABLE() - a guard macro for unreachable code (default: assert(false)) + SOKOL_ABORT() - called after an unrecoverable error (default: abort()) + SOKOL_WIN32_FORCE_MAIN - define this on Win32 to use a main() entry point instead of WinMain + SOKOL_NO_ENTRY - define this if sokol_app.h shouldn't "hijack" the main() function + SOKOL_APP_API_DECL - public function declaration prefix (default: extern) + SOKOL_API_DECL - same as SOKOL_APP_API_DECL + SOKOL_API_IMPL - public function implementation prefix (default: -) + SOKOL_CALLOC - your own calloc function (default: calloc(n, s)) + SOKOL_FREE - your own free function (default: free(p)) + + Optionally define the following to force debug checks and validations + even in release mode: + + SOKOL_DEBUG - by default this is defined if _DEBUG is defined + + If sokol_app.h is compiled as a DLL, define the following before + including the declaration or implementation: + + SOKOL_DLL + + On Windows, SOKOL_DLL will define SOKOL_APP_API_DECL as __declspec(dllexport) + or __declspec(dllimport) as needed. + + For example code, see https://github.com/floooh/sokol-samples/tree/master/sapp + + Portions of the Windows and Linux GL initialization, event-, icon- etc... code + have been taken from GLFW (http://www.glfw.org/) + + iOS onscreen keyboard support 'inspired' by libgdx. + + Link with the following system libraries: + + - on macOS with Metal: Cocoa, QuartzCore, Metal, MetalKit + - on macOS with GL: Cocoa, QuartzCore, OpenGL + - on iOS with Metal: Foundation, UIKit, Metal, MetalKit + - on iOS with GL: Foundation, UIKit, OpenGLES, GLKit + - on Linux: X11, Xi, Xcursor, GL, dl, pthread, m(?) + - on Android: GLESv3, EGL, log, android + - on Windows with the MSVC or Clang toolchains: no action needed, libs are defined in-source via pragma-comment-lib + - on Windows with MINGW/MSYS2 gcc: compile with '-mwin32' so that _WIN32 is defined + - link with the following libs: -lkernel32 -luser32 -lshell32 + - additionally with the GL backend: -lgdi32 + - additionally with the D3D11 backend: -ld3d11 -ldxgi + + On Linux, you also need to use the -pthread compiler and linker option, otherwise weird + things will happen, see here for details: https://github.com/floooh/sokol/issues/376 + + Building for UWP requires a recent Visual Studio toolchain and Windows SDK + (at least VS2019 and Windows SDK 10.0.19041.0). When the UWP backend is + selected, the sokol_app.h implementation must be compiled as C++17. + + On macOS and iOS, the implementation must be compiled as Objective-C. + + FEATURE OVERVIEW + ================ + sokol_app.h provides a minimalistic cross-platform API which + implements the 'application-wrapper' parts of a 3D application: + + - a common application entry function + - creates a window and 3D-API context/device with a 'default framebuffer' + - makes the rendered frame visible + - provides keyboard-, mouse- and low-level touch-events + - platforms: MacOS, iOS, HTML5, Win32, Linux, Android (TODO: RaspberryPi) + - 3D-APIs: Metal, D3D11, GL3.2, GLES2, GLES3, WebGL, WebGL2 + + FEATURE/PLATFORM MATRIX + ======================= + | Windows | macOS | Linux | iOS | Android | UWP | Raspi | HTML5 + --------------------+---------+-------+-------+-------+---------+------+-------+------- + gl 3.x | YES | YES | YES | --- | --- | --- | --- | --- + gles2/webgl | --- | --- | --- | YES | YES | --- | TODO | YES + gles3/webgl2 | --- | --- | --- | YES | YES | --- | --- | YES + metal | --- | YES | --- | YES | --- | --- | --- | --- + d3d11 | YES | --- | --- | --- | --- | YES | --- | --- + KEY_DOWN | YES | YES | YES | SOME | TODO | YES | TODO | YES + KEY_UP | YES | YES | YES | SOME | TODO | YES | TODO | YES + CHAR | YES | YES | YES | YES | TODO | YES | TODO | YES + MOUSE_DOWN | YES | YES | YES | --- | --- | YES | TODO | YES + MOUSE_UP | YES | YES | YES | --- | --- | YES | TODO | YES + MOUSE_SCROLL | YES | YES | YES | --- | --- | YES | TODO | YES + MOUSE_MOVE | YES | YES | YES | --- | --- | YES | TODO | YES + MOUSE_ENTER | YES | YES | YES | --- | --- | YES | TODO | YES + MOUSE_LEAVE | YES | YES | YES | --- | --- | YES | TODO | YES + TOUCHES_BEGAN | --- | --- | --- | YES | YES | TODO | --- | YES + TOUCHES_MOVED | --- | --- | --- | YES | YES | TODO | --- | YES + TOUCHES_ENDED | --- | --- | --- | YES | YES | TODO | --- | YES + TOUCHES_CANCELLED | --- | --- | --- | YES | YES | TODO | --- | YES + RESIZED | YES | YES | YES | YES | YES | YES | --- | YES + ICONIFIED | YES | YES | YES | --- | --- | YES | --- | --- + RESTORED | YES | YES | YES | --- | --- | YES | --- | --- + FOCUSED | YES | YES | YES | --- | --- | --- | --- | YES + UNFOCUSED | YES | YES | YES | --- | --- | --- | --- | YES + SUSPENDED | --- | --- | --- | YES | YES | YES | --- | TODO + RESUMED | --- | --- | --- | YES | YES | YES | --- | TODO + QUIT_REQUESTED | YES | YES | YES | --- | --- | --- | TODO | YES + UPDATE_CURSOR | YES | YES | TODO | --- | --- | TODO | --- | TODO + IME | TODO | TODO? | TODO | ??? | TODO | --- | ??? | ??? + key repeat flag | YES | YES | YES | --- | --- | YES | TODO | YES + windowed | YES | YES | YES | --- | --- | YES | TODO | YES + fullscreen | YES | YES | YES | YES | YES | YES | TODO | --- + mouse hide | YES | YES | YES | --- | --- | YES | TODO | TODO + mouse lock | YES | YES | YES | --- | --- | TODO | TODO | YES + screen keyboard | --- | --- | --- | YES | TODO | TODO | --- | YES + swap interval | YES | YES | YES | YES | TODO | --- | TODO | YES + high-dpi | YES | YES | TODO | YES | YES | YES | TODO | YES + clipboard | YES | YES | TODO | --- | --- | TODO | --- | YES + MSAA | YES | YES | YES | YES | YES | TODO | TODO | YES + drag'n'drop | YES | YES | YES | --- | --- | TODO | TODO | YES + window icon | YES | YES(1)| YES | --- | --- | TODO | TODO | YES + + (1) macOS has no regular window icons, instead the dock icon is changed + + STEP BY STEP + ============ + --- Add a sokol_main() function to your code which returns a sapp_desc structure + with initialization parameters and callback function pointers. This + function is called very early, usually at the start of the + platform's entry function (e.g. main or WinMain). You should do as + little as possible here, since the rest of your code might be called + from another thread (this depends on the platform): + + sapp_desc sokol_main(int argc, char* argv[]) { + return (sapp_desc) { + .width = 640, + .height = 480, + .init_cb = my_init_func, + .frame_cb = my_frame_func, + .cleanup_cb = my_cleanup_func, + .event_cb = my_event_func, + ... + }; + } + + There are many more setup parameters, but these are the most important. + For a complete list search for the sapp_desc structure declaration + below. + + DO NOT call any sokol-app function from inside sokol_main(), since + sokol-app will not be initialized at this point. + + The .width and .height parameters are the preferred size of the 3D + rendering canvas. The actual size may differ from this depending on + platform and other circumstances. Also the canvas size may change at + any time (for instance when the user resizes the application window, + or rotates the mobile device). + + All provided function callbacks will be called from the same thread, + but this may be different from the thread where sokol_main() was called. + + .init_cb (void (*)(void)) + This function is called once after the application window, + 3D rendering context and swap chain have been created. The + function takes no arguments and has no return value. + .frame_cb (void (*)(void)) + This is the per-frame callback, which is usually called 60 + times per second. This is where your application would update + most of its state and perform all rendering. + .cleanup_cb (void (*)(void)) + The cleanup callback is called once right before the application + quits. + .event_cb (void (*)(const sapp_event* event)) + The event callback is mainly for input handling, but is also + used to communicate other types of events to the application. Keep the + event_cb struct member zero-initialized if your application doesn't require + event handling. + .fail_cb (void (*)(const char* msg)) + The fail callback is called when a fatal error is encountered + during start which doesn't allow the program to continue. + Providing a callback here gives you a chance to show an error message + to the user. The default behaviour is SOKOL_LOG(msg) + + As you can see, those 'standard callbacks' don't have a user_data + argument, so any data that needs to be preserved between callbacks + must live in global variables. If keeping state in global variables + is not an option, there's an alternative set of callbacks with + an additional user_data pointer argument: + + .user_data (void*) + The user-data argument for the callbacks below + .init_userdata_cb (void (*)(void* user_data)) + .frame_userdata_cb (void (*)(void* user_data)) + .cleanup_userdata_cb (void (*)(void* user_data)) + .event_userdata_cb (void(*)(const sapp_event* event, void* user_data)) + .fail_userdata_cb (void(*)(const char* msg, void* user_data)) + These are the user-data versions of the callback functions. You + can mix those with the standard callbacks that don't have the + user_data argument. + + The function sapp_userdata() can be used to query the user_data + pointer provided in the sapp_desc struct. + + You can also call sapp_query_desc() to get a copy of the + original sapp_desc structure. + + NOTE that there's also an alternative compile mode where sokol_app.h + doesn't "hijack" the main() function. Search below for SOKOL_NO_ENTRY. + + --- Implement the initialization callback function (init_cb), this is called + once after the rendering surface, 3D API and swap chain have been + initialized by sokol_app. All sokol-app functions can be called + from inside the initialization callback, the most useful functions + at this point are: + + int sapp_width(void) + int sapp_height(void) + Returns the current width and height of the default framebuffer in pixels, + this may change from one frame to the next, and it may be different + from the initial size provided in the sapp_desc struct. + + float sapp_widthf(void) + float sapp_heightf(void) + These are alternatives to sapp_width() and sapp_height() which return + the default framebuffer size as float values instead of integer. This + may help to prevent casting back and forth between int and float + in more strongly typed languages than C and C++. + + int sapp_color_format(void) + int sapp_depth_format(void) + The color and depth-stencil pixelformats of the default framebuffer, + as integer values which are compatible with sokol-gfx's + sg_pixel_format enum (so that they can be plugged directly in places + where sg_pixel_format is expected). Possible values are: + + 23 == SG_PIXELFORMAT_RGBA8 + 27 == SG_PIXELFORMAT_BGRA8 + 41 == SG_PIXELFORMAT_DEPTH + 42 == SG_PIXELFORMAT_DEPTH_STENCIL + + int sapp_sample_count(void) + Return the MSAA sample count of the default framebuffer. + + bool sapp_gles2(void) + Returns true if a GLES2 or WebGL context has been created. This + is useful when a GLES3/WebGL2 context was requested but is not + available so that sokol_app.h had to fallback to GLES2/WebGL. + + const void* sapp_metal_get_device(void) + const void* sapp_metal_get_renderpass_descriptor(void) + const void* sapp_metal_get_drawable(void) + If the Metal backend has been selected, these functions return pointers + to various Metal API objects required for rendering, otherwise + they return a null pointer. These void pointers are actually + Objective-C ids converted with a (ARC) __bridge cast so that + the ids can be tunnel through C code. Also note that the returned + pointers to the renderpass-descriptor and drawable may change from one + frame to the next, only the Metal device object is guaranteed to + stay the same. + + const void* sapp_macos_get_window(void) + On macOS, get the NSWindow object pointer, otherwise a null pointer. + Before being used as Objective-C object, the void* must be converted + back with a (ARC) __bridge cast. + + const void* sapp_ios_get_window(void) + On iOS, get the UIWindow object pointer, otherwise a null pointer. + Before being used as Objective-C object, the void* must be converted + back with a (ARC) __bridge cast. + + const void* sapp_win32_get_hwnd(void) + On Windows, get the window's HWND, otherwise a null pointer. The + HWND has been cast to a void pointer in order to be tunneled + through code which doesn't include Windows.h. + + const void* sapp_d3d11_get_device(void) + const void* sapp_d3d11_get_device_context(void) + const void* sapp_d3d11_get_render_target_view(void) + const void* sapp_d3d11_get_depth_stencil_view(void) + Similar to the sapp_metal_* functions, the sapp_d3d11_* functions + return pointers to D3D11 API objects required for rendering, + only if the D3D11 backend has been selected. Otherwise they + return a null pointer. Note that the returned pointers to the + render-target-view and depth-stencil-view may change from one + frame to the next! + + const void* sapp_wgpu_get_device(void) + const void* sapp_wgpu_get_render_view(void) + const void* sapp_wgpu_get_resolve_view(void) + const void* sapp_wgpu_get_depth_stencil_view(void) + These are the WebGPU-specific functions to get the WebGPU + objects and values required for rendering. If sokol_app.h + is not compiled with SOKOL_WGPU, these functions return null. + + const void* sapp_android_get_native_activity(void); + On Android, get the native activity ANativeActivity pointer, otherwise + a null pointer. + + --- Implement the frame-callback function, this function will be called + on the same thread as the init callback, but might be on a different + thread than the sokol_main() function. Note that the size of + the rendering framebuffer might have changed since the frame callback + was called last. Call the functions sapp_width() and sapp_height() + each frame to get the current size. + + --- Optionally implement the event-callback to handle input events. + sokol-app provides the following type of input events: + - a 'virtual key' was pressed down or released + - a single text character was entered (provided as UTF-32 code point) + - a mouse button was pressed down or released (left, right, middle) + - mouse-wheel or 2D scrolling events + - the mouse was moved + - the mouse has entered or left the application window boundaries + - low-level, portable multi-touch events (began, moved, ended, cancelled) + - the application window was resized, iconified or restored + - the application was suspended or restored (on mobile platforms) + - the user or application code has asked to quit the application + - a string was pasted to the system clipboard + - one or more files have been dropped onto the application window + + To explicitly 'consume' an event and prevent that the event is + forwarded for further handling to the operating system, call + sapp_consume_event() from inside the event handler (NOTE that + this behaviour is currently only implemented for some HTML5 + events, support for other platforms and event types will + be added as needed, please open a github ticket and/or provide + a PR if needed). + + NOTE: Do *not* call any 3D API rendering functions in the event + callback function, since the 3D API context may not be active when the + event callback is called (it may work on some platforms and 3D APIs, + but not others, and the exact behaviour may change between + sokol-app versions). + + --- Implement the cleanup-callback function, this is called once + after the user quits the application (see the section + "APPLICATION QUIT" for detailed information on quitting + behaviour, and how to intercept a pending quit - for instance to show a + "Really Quit?" dialog box). Note that the cleanup-callback isn't + guaranteed to be called on the web and mobile platforms. + + MOUSE LOCK (AKA POINTER LOCK, AKA MOUSE CAPTURE) + ================================================ + In normal mouse mode, no mouse movement events are reported when the + mouse leaves the windows client area or hits the screen border (whether + it's one or the other depends on the platform), and the mouse move events + (SAPP_EVENTTYPE_MOUSE_MOVE) contain absolute mouse positions in + framebuffer pixels in the sapp_event items mouse_x and mouse_y, and + relative movement in framebuffer pixels in the sapp_event items mouse_dx + and mouse_dy. + + To get continuous mouse movement (also when the mouse leaves the window + client area or hits the screen border), activate mouse-lock mode + by calling: + + sapp_lock_mouse(true) + + When mouse lock is activated, the mouse pointer is hidden, the + reported absolute mouse position (sapp_event.mouse_x/y) appears + frozen, and the relative mouse movement in sapp_event.mouse_dx/dy + no longer has a direct relation to framebuffer pixels but instead + uses "raw mouse input" (what "raw mouse input" exactly means also + differs by platform). + + To deactivate mouse lock and return to normal mouse mode, call + + sapp_lock_mouse(false) + + And finally, to check if mouse lock is currently active, call + + if (sapp_mouse_locked()) { ... } + + On native platforms, the sapp_lock_mouse() and sapp_mouse_locked() + functions work as expected (mouse lock is activated or deactivated + immediately when sapp_lock_mouse() is called, and sapp_mouse_locked() + also immediately returns the new state after sapp_lock_mouse() + is called. + + On the web platform, sapp_lock_mouse() and sapp_mouse_locked() behave + differently, as dictated by the limitations of the HTML5 Pointer Lock API: + + - sapp_lock_mouse(true) can be called at any time, but it will + only take effect in a 'short-lived input event handler of a specific + type', meaning when one of the following events happens: + - SAPP_EVENTTYPE_MOUSE_DOWN + - SAPP_EVENTTYPE_MOUSE_UP + - SAPP_EVENTTYPE_MOUSE_SCROLL + - SAPP_EVENTYTPE_KEY_UP + - SAPP_EVENTTYPE_KEY_DOWN + - The mouse lock/unlock action on the web platform is asynchronous, + this means that sapp_mouse_locked() won't immediately return + the new status after calling sapp_lock_mouse(), instead the + reported status will only change when the pointer lock has actually + been activated or deactivated in the browser. + - On the web, mouse lock can be deactivated by the user at any time + by pressing the Esc key. When this happens, sokol_app.h behaves + the same as if sapp_lock_mouse(false) is called. + + For things like camera manipulation it's most straightforward to lock + and unlock the mouse right from the sokol_app.h event handler, for + instance the following code enters and leaves mouse lock when the + left mouse button is pressed and released, and then uses the relative + movement information to manipulate a camera (taken from the + cgltf-sapp.c sample in the sokol-samples repository + at https://github.com/floooh/sokol-samples): + + static void input(const sapp_event* ev) { + switch (ev->type) { + case SAPP_EVENTTYPE_MOUSE_DOWN: + if (ev->mouse_button == SAPP_MOUSEBUTTON_LEFT) { + sapp_lock_mouse(true); + } + break; + + case SAPP_EVENTTYPE_MOUSE_UP: + if (ev->mouse_button == SAPP_MOUSEBUTTON_LEFT) { + sapp_lock_mouse(false); + } + break; + + case SAPP_EVENTTYPE_MOUSE_MOVE: + if (sapp_mouse_locked()) { + cam_orbit(&state.camera, ev->mouse_dx * 0.25f, ev->mouse_dy * 0.25f); + } + break; + + default: + break; + } + } + + CLIPBOARD SUPPORT + ================= + Applications can send and receive UTF-8 encoded text data from and to the + system clipboard. By default, clipboard support is disabled and + must be enabled at startup via the following sapp_desc struct + members: + + sapp_desc.enable_clipboard - set to true to enable clipboard support + sapp_desc.clipboard_size - size of the internal clipboard buffer in bytes + + Enabling the clipboard will dynamically allocate a clipboard buffer + for UTF-8 encoded text data of the requested size in bytes, the default + size is 8 KBytes. Strings that don't fit into the clipboard buffer + (including the terminating zero) will be silently clipped, so it's + important that you provide a big enough clipboard size for your + use case. + + To send data to the clipboard, call sapp_set_clipboard_string() with + a pointer to an UTF-8 encoded, null-terminated C-string. + + NOTE that on the HTML5 platform, sapp_set_clipboard_string() must be + called from inside a 'short-lived event handler', and there are a few + other HTML5-specific caveats to workaround. You'll basically have to + tinker until it works in all browsers :/ (maybe the situation will + improve when all browsers agree on and implement the new + HTML5 navigator.clipboard API). + + To get data from the clipboard, check for the SAPP_EVENTTYPE_CLIPBOARD_PASTED + event in your event handler function, and then call sapp_get_clipboard_string() + to obtain the pasted UTF-8 encoded text. + + NOTE that behaviour of sapp_get_clipboard_string() is slightly different + depending on platform: + + - on the HTML5 platform, the internal clipboard buffer will only be updated + right before the SAPP_EVENTTYPE_CLIPBOARD_PASTED event is sent, + and sapp_get_clipboard_string() will simply return the current content + of the clipboard buffer + - on 'native' platforms, the call to sapp_get_clipboard_string() will + update the internal clipboard buffer with the most recent data + from the system clipboard + + Portable code should check for the SAPP_EVENTTYPE_CLIPBOARD_PASTED event, + and then call sapp_get_clipboard_string() right in the event handler. + + The SAPP_EVENTTYPE_CLIPBOARD_PASTED event will be generated by sokol-app + as follows: + + - on macOS: when the Cmd+V key is pressed down + - on HTML5: when the browser sends a 'paste' event to the global 'window' object + - on all other platforms: when the Ctrl+V key is pressed down + + DRAG AND DROP SUPPORT + ===================== + PLEASE NOTE: the drag'n'drop feature works differently on WASM/HTML5 + and on the native desktop platforms (Win32, Linux and macOS) because + of security-related restrictions in the HTML5 drag'n'drop API. The + WASM/HTML5 specifics are described at the end of this documentation + section: + + Like clipboard support, drag'n'drop support must be explicitly enabled + at startup in the sapp_desc struct. + + sapp_desc sokol_main() { + return (sapp_desc) { + .enable_dragndrop = true, // default is false + ... + }; + } + + You can also adjust the maximum number of files that are accepted + in a drop operation, and the maximum path length in bytes if needed: + + sapp_desc sokol_main() { + return (sapp_desc) { + .enable_dragndrop = true, // default is false + .max_dropped_files = 8, // default is 1 + .max_dropped_file_path_length = 8192, // in bytes, default is 2048 + ... + }; + } + + When drag'n'drop is enabled, the event callback will be invoked with an + event of type SAPP_EVENTTYPE_FILES_DROPPED whenever the user drops files on + the application window. + + After the SAPP_EVENTTYPE_FILES_DROPPED is received, you can query the + number of dropped files, and their absolute paths by calling separate + functions: + + void on_event(const sapp_event* ev) { + if (ev->type == SAPP_EVENTTYPE_FILES_DROPPED) { + + // the mouse position where the drop happened + float x = ev->mouse_x; + float y = ev->mouse_y; + + // get the number of files and their paths like this: + const int num_dropped_files = sapp_get_num_dropped_files(); + for (int i = 0; i < num_dropped_files; i++) { + const char* path = sapp_get_dropped_file_path(i); + ... + } + } + } + + The returned file paths are UTF-8 encoded strings. + + You can call sapp_get_num_dropped_files() and sapp_get_dropped_file_path() + anywhere, also outside the event handler callback, but be aware that the + file path strings will be overwritten with the next drop operation. + + In any case, sapp_get_dropped_file_path() will never return a null pointer, + instead an empty string "" will be returned if the drag'n'drop feature + hasn't been enabled, the last drop-operation failed, or the file path index + is out of range. + + Drag'n'drop caveats: + + - if more files are dropped in a single drop-action + than sapp_desc.max_dropped_files, the additional + files will be silently ignored + - if any of the file paths is longer than + sapp_desc.max_dropped_file_path_length (in number of bytes, after UTF-8 + encoding) the entire drop operation will be silently ignored (this + needs some sort of error feedback in the future) + - no mouse positions are reported while the drag is in + process, this may change in the future + + Drag'n'drop on HTML5/WASM: + + The HTML5 drag'n'drop API doesn't return file paths, but instead + black-box 'file objects' which must be used to load the content + of dropped files. This is the reason why sokol_app.h adds two + HTML5-specific functions to the drag'n'drop API: + + uint32_t sapp_html5_get_dropped_file_size(int index) + Returns the size in bytes of a dropped file. + + void sapp_html5_fetch_dropped_file(const sapp_html5_fetch_request* request) + Asynchronously loads the content of a dropped file into a + provided memory buffer (which must be big enough to hold + the file content) + + To start loading the first dropped file after an SAPP_EVENTTYPE_FILES_DROPPED + event is received: + + sapp_html5_fetch_dropped_file(&(sapp_html5_fetch_request){ + .dropped_file_index = 0, + .callback = fetch_cb + .buffer_ptr = buf, + .buffer_size = buf_size, + .user_data = ... + }); + + Make sure that the memory pointed to by 'buf' stays valid until the + callback function is called! + + As result of the asynchronous loading operation (no matter if succeeded or + failed) the 'fetch_cb' function will be called: + + void fetch_cb(const sapp_html5_fetch_response* response) { + // IMPORTANT: check if the loading operation actually succeeded: + if (response->succeeded) { + // the size of the loaded file: + const uint32_t num_bytes = response->fetched_size; + // and the pointer to the data (same as 'buf' in the fetch-call): + const void* ptr = response->buffer_ptr; + } + else { + // on error check the error code: + switch (response->error_code) { + case SAPP_HTML5_FETCH_ERROR_BUFFER_TOO_SMALL: + ... + break; + case SAPP_HTML5_FETCH_ERROR_OTHER: + ... + break; + } + } + } + + Check the droptest-sapp example for a real-world example which works + both on native platforms and the web: + + https://github.com/floooh/sokol-samples/blob/master/sapp/droptest-sapp.c + + HIGH-DPI RENDERING + ================== + You can set the sapp_desc.high_dpi flag during initialization to request + a full-resolution framebuffer on HighDPI displays. The default behaviour + is sapp_desc.high_dpi=false, this means that the application will + render to a lower-resolution framebuffer on HighDPI displays and the + rendered content will be upscaled by the window system composer. + + In a HighDPI scenario, you still request the same window size during + sokol_main(), but the framebuffer sizes returned by sapp_width() + and sapp_height() will be scaled up according to the DPI scaling + ratio. You can also get a DPI scaling factor with the function + sapp_dpi_scale(). + + Here's an example on a Mac with Retina display: + + sapp_desc sokol_main() { + return (sapp_desc) { + .width = 640, + .height = 480, + .high_dpi = true, + ... + }; + } + + The functions sapp_width(), sapp_height() and sapp_dpi_scale() will + return the following values: + + sapp_width -> 1280 + sapp_height -> 960 + sapp_dpi_scale -> 2.0 + + If the high_dpi flag is false, or you're not running on a Retina display, + the values would be: + + sapp_width -> 640 + sapp_height -> 480 + sapp_dpi_scale -> 1.0 + + APPLICATION QUIT + ================ + Without special quit handling, a sokol_app.h application will quit + 'gracefully' when the user clicks the window close-button unless a + platform's application model prevents this (e.g. on web or mobile). + 'Graceful exit' means that the application-provided cleanup callback will + be called before the application quits. + + On native desktop platforms sokol_app.h provides more control over the + application-quit-process. It's possible to initiate a 'programmatic quit' + from the application code, and a quit initiated by the application user can + be intercepted (for instance to show a custom dialog box). + + This 'programmatic quit protocol' is implemented through 3 functions + and 1 event: + + - sapp_quit(): This function simply quits the application without + giving the user a chance to intervene. Usually this might + be called when the user clicks the 'Ok' button in a 'Really Quit?' + dialog box + - sapp_request_quit(): Calling sapp_request_quit() will send the + event SAPP_EVENTTYPE_QUIT_REQUESTED to the applications event handler + callback, giving the user code a chance to intervene and cancel the + pending quit process (for instance to show a 'Really Quit?' dialog + box). If the event handler callback does nothing, the application + will be quit as usual. To prevent this, call the function + sapp_cancel_quit() from inside the event handler. + - sapp_cancel_quit(): Cancels a pending quit request, either initiated + by the user clicking the window close button, or programmatically + by calling sapp_request_quit(). The only place where calling this + function makes sense is from inside the event handler callback when + the SAPP_EVENTTYPE_QUIT_REQUESTED event has been received. + - SAPP_EVENTTYPE_QUIT_REQUESTED: this event is sent when the user + clicks the window's close button or application code calls the + sapp_request_quit() function. The event handler callback code can handle + this event by calling sapp_cancel_quit() to cancel the quit. + If the event is ignored, the application will quit as usual. + + On the web platform, the quit behaviour differs from native platforms, + because of web-specific restrictions: + + A `programmatic quit` initiated by calling sapp_quit() or + sapp_request_quit() will work as described above: the cleanup callback is + called, platform-specific cleanup is performed (on the web + this means that JS event handlers are unregisters), and then + the request-animation-loop will be exited. However that's all. The + web page itself will continue to exist (e.g. it's not possible to + programmatically close the browser tab). + + On the web it's also not possible to run custom code when the user + closes a brower tab, so it's not possible to prevent this with a + fancy custom dialog box. + + Instead the standard "Leave Site?" dialog box can be activated (or + deactivated) with the following function: + + sapp_html5_ask_leave_site(bool ask); + + The initial state of the associated internal flag can be provided + at startup via sapp_desc.html5_ask_leave_site. + + This feature should only be used sparingly in critical situations - for + instance when the user would loose data - since popping up modal dialog + boxes is considered quite rude in the web world. Note that there's no way + to customize the content of this dialog box or run any code as a result + of the user's decision. Also note that the user must have interacted with + the site before the dialog box will appear. These are all security measures + to prevent fishing. + + The Dear ImGui HighDPI sample contains example code of how to + implement a 'Really Quit?' dialog box with Dear ImGui (native desktop + platforms only), and for showing the hardwired "Leave Site?" dialog box + when running on the web platform: + + https://floooh.github.io/sokol-html5/wasm/imgui-highdpi-sapp.html + + FULLSCREEN + ========== + If the sapp_desc.fullscreen flag is true, sokol-app will try to create + a fullscreen window on platforms with a 'proper' window system + (mobile devices will always use fullscreen). The implementation details + depend on the target platform, in general sokol-app will use a + 'soft approach' which doesn't interfere too much with the platform's + window system (for instance borderless fullscreen window instead of + a 'real' fullscreen mode). Such details might change over time + as sokol-app is adapted for different needs. + + The most important effect of fullscreen mode to keep in mind is that + the requested canvas width and height will be ignored for the initial + window size, calling sapp_width() and sapp_height() will instead return + the resolution of the fullscreen canvas (however the provided size + might still be used for the non-fullscreen window, in case the user can + switch back from fullscreen- to windowed-mode). + + To toggle fullscreen mode programmatically, call sapp_toggle_fullscreen(). + + To check if the application window is currently in fullscreen mode, + call sapp_is_fullscreen(). + + WINDOW ICON SUPPORT + =================== + Some sokol_app.h backends allow to change the window icon programmatically: + + - on Win32: the small icon in the window's title bar, and the + bigger icon in the task bar + - on Linux: highly dependent on the used window manager, but usually + the window's title bar icon and/or the task bar icon + - on HTML5: the favicon shown in the page's browser tab + + NOTE that it is not possible to set the actual application icon which is + displayed by the operating system on the desktop or 'home screen'. Those + icons must be provided 'traditionally' through operating-system-specific + resources which are associated with the application (sokol_app.h might + later support setting the window icon from platform specific resource data + though). + + There are two ways to set the window icon: + + - at application start in the sokol_main() function by initializing + the sapp_desc.icon nested struct + - or later by calling the function sapp_set_icon() + + As a convenient shortcut, sokol_app.h comes with a builtin default-icon + (a rainbow-colored 'S', which at least looks a bit better than the Windows + default icon for applications), which can be activated like this: + + At startup in sokol_main(): + + sapp_desc sokol_main(...) { + return (sapp_desc){ + ... + icon.sokol_default = true + }; + } + + Or later by calling: + + sapp_set_icon(&(sapp_icon_desc){ .sokol_default = true }); + + NOTE that a completely zero-initialized sapp_icon_desc struct will not + update the window icon in any way. This is an 'escape hatch' so that you + can handle the window icon update yourself (or if you do this already, + sokol_app.h won't get in your way, in this case just leave the + sapp_desc.icon struct zero-initialized). + + Providing your own icon images works exactly like in GLFW (down to the + data format): + + You provide one or more 'candidate images' in different sizes, and the + sokol_app.h platform backends pick the best match for the specific backend + and icon type. + + For each candidate image, you need to provide: + + - the width in pixels + - the height in pixels + - and the actual pixel data in RGBA8 pixel format (e.g. 0xFFCC8844 + on a little-endian CPU means: alpha=0xFF, blue=0xCC, green=0x88, red=0x44) + + For instance, if you have 3 candidate images (small, medium, big) of + sizes 16x16, 32x32 and 64x64 the corresponding sapp_icon_desc struct is setup + like this: + + // the actual pixel data (RGBA8, origin top-left) + const uint32_t small[16][16] = { ... }; + const uint32_t medium[32][32] = { ... }; + const uint32_t big[64][64] = { ... }; + + const sapp_icon_desc icon_desc = { + .images = { + { .width = 16, .height = 16, .pixels = SAPP_RANGE(small) }, + { .width = 32, .height = 32, .pixels = SAPP_RANGE(medium) }, + // ...or without the SAPP_RANGE helper macro: + { .width = 64, .height = 64, .pixels = { .ptr=big, .size=sizeof(big) } } + } + }; + + An sapp_icon_desc struct initialized like this can then either be applied + at application start in sokol_main: + + sapp_desc sokol_main(...) { + return (sapp_desc){ + ... + icon = icon_desc + }; + } + + ...or later by calling sapp_set_icon(): + + sapp_set_icon(&icon_desc); + + Some window icon caveats: + + - once the window icon has been updated, there's no way to go back to + the platform's default icon, this is because some platforms (Linux + and HTML5) don't switch the icon visual back to the default even if + the custom icon is deleted or removed + - on HTML5, if the sokol_app.h icon doesn't show up in the browser + tab, check that there's no traditional favicon 'link' element + is defined in the page's index.html, sokol_app.h will only + append a new favicon link element, but not delete any manually + defined favicon in the page + + For an example and test of the window icon feature, check out the the + 'icon-sapp' sample on the sokol-samples git repository. + + ONSCREEN KEYBOARD + ================= + On some platforms which don't provide a physical keyboard, sokol-app + can display the platform's integrated onscreen keyboard for text + input. To request that the onscreen keyboard is shown, call + + sapp_show_keyboard(true); + + Likewise, to hide the keyboard call: + + sapp_show_keyboard(false); + + Note that on the web platform, the keyboard can only be shown from + inside an input handler. On such platforms, sapp_show_keyboard() + will only work as expected when it is called from inside the + sokol-app event callback function. When called from other places, + an internal flag will be set, and the onscreen keyboard will be + called at the next 'legal' opportunity (when the next input event + is handled). + + OPTIONAL: DON'T HIJACK main() (#define SOKOL_NO_ENTRY) + ====================================================== + In its default configuration, sokol_app.h "hijacks" the platform's + standard main() function. This was done because different platforms + have different main functions which are not compatible with + C's main() (for instance WinMain on Windows has completely different + arguments). However, this "main hijacking" posed a problem for + usage scenarios like integrating sokol_app.h with other languages than + C or C++, so an alternative SOKOL_NO_ENTRY mode has been added + in which the user code provides the platform's main function: + + - define SOKOL_NO_ENTRY before including the sokol_app.h implementation + - do *not* provide a sokol_main() function + - instead provide the standard main() function of the platform + - from the main function, call the function ```sapp_run()``` which + takes a pointer to an ```sapp_desc``` structure. + - ```sapp_run()``` takes over control and calls the provided init-, frame-, + shutdown- and event-callbacks just like in the default model, it + will only return when the application quits (or not at all on some + platforms, like emscripten) + + NOTE: SOKOL_NO_ENTRY is currently not supported on Android. + + WINDOWS CONSOLE OUTPUT + ====================== + On Windows, regular windowed applications don't show any stdout/stderr text + output, which can be a bit of a hassle for printf() debugging or generally + logging text to the console. Also, console output by default uses a local + codepage setting and thus international UTF-8 encoded text is printed + as garbage. + + To help with these issues, sokol_app.h can be configured at startup + via the following Windows-specific sapp_desc flags: + + sapp_desc.win32_console_utf8 (default: false) + When set to true, the output console codepage will be switched + to UTF-8 (and restored to the original codepage on exit) + + sapp_desc.win32_console_attach (default: false) + When set to true, stdout and stderr will be attached to the + console of the parent process (if the parent process actually + has a console). This means that if the application was started + in a command line window, stdout and stderr output will be printed + to the terminal, just like a regular command line program. But if + the application is started via double-click, it will behave like + a regular UI application, and stdout/stderr will not be visible. + + sapp_desc.win32_console_create (default: false) + When set to true, a new console window will be created and + stdout/stderr will be redirected to that console window. It + doesn't matter if the application is started from the command + line or via double-click. + + TEMP NOTE DUMP + ============== + - onscreen keyboard support on Android requires Java :(, should we even bother? + - sapp_desc needs a bool whether to initialize depth-stencil surface + - GL context initialization needs more control (at least what GL version to initialize) + - application icon + - the UPDATE_CURSOR event currently behaves differently between Win32 and OSX + (Win32 sends the event each frame when the mouse moves and is inside the window + client area, OSX sends it only once when the mouse enters the client area) + - the Android implementation calls cleanup_cb() and destroys the egl context in onDestroy + at the latest but should do it earlier, in onStop, as an app is "killable" after onStop + on Android Honeycomb and later (it can't be done at the moment as the app may be started + again after onStop and the sokol lifecycle does not yet handle context teardown/bringup) + + + LICENSE + ======= + zlib/libpng license + + Copyright (c) 2018 Andre Weissflog + + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the + use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ +#define SOKOL_APP_INCLUDED (1) +#include // size_t +#include +#include + +#if defined(SOKOL_API_DECL) && !defined(SOKOL_APP_API_DECL) +#define SOKOL_APP_API_DECL SOKOL_API_DECL +#endif +#ifndef SOKOL_APP_API_DECL +#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_APP_IMPL) +#define SOKOL_APP_API_DECL __declspec(dllexport) +#elif defined(_WIN32) && defined(SOKOL_DLL) +#define SOKOL_APP_API_DECL __declspec(dllimport) +#else +#define SOKOL_APP_API_DECL extern +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* misc constants */ +enum { + SAPP_MAX_TOUCHPOINTS = 8, + SAPP_MAX_MOUSEBUTTONS = 3, + SAPP_MAX_KEYCODES = 512, + SAPP_MAX_ICONIMAGES = 8, +}; + +/* + sapp_event_type + + The type of event that's passed to the event handler callback + in the sapp_event.type field. These are not just "traditional" + input events, but also notify the application about state changes + or other user-invoked actions. +*/ +typedef enum sapp_event_type { + SAPP_EVENTTYPE_INVALID, + SAPP_EVENTTYPE_KEY_DOWN, + SAPP_EVENTTYPE_KEY_UP, + SAPP_EVENTTYPE_CHAR, + SAPP_EVENTTYPE_MOUSE_DOWN, + SAPP_EVENTTYPE_MOUSE_UP, + SAPP_EVENTTYPE_MOUSE_SCROLL, + SAPP_EVENTTYPE_MOUSE_MOVE, + SAPP_EVENTTYPE_MOUSE_ENTER, + SAPP_EVENTTYPE_MOUSE_LEAVE, + SAPP_EVENTTYPE_TOUCHES_BEGAN, + SAPP_EVENTTYPE_TOUCHES_MOVED, + SAPP_EVENTTYPE_TOUCHES_ENDED, + SAPP_EVENTTYPE_TOUCHES_CANCELLED, + SAPP_EVENTTYPE_RESIZED, + SAPP_EVENTTYPE_ICONIFIED, + SAPP_EVENTTYPE_RESTORED, + SAPP_EVENTTYPE_FOCUSED, + SAPP_EVENTTYPE_UNFOCUSED, + SAPP_EVENTTYPE_SUSPENDED, + SAPP_EVENTTYPE_RESUMED, + SAPP_EVENTTYPE_UPDATE_CURSOR, + SAPP_EVENTTYPE_QUIT_REQUESTED, + SAPP_EVENTTYPE_CLIPBOARD_PASTED, + SAPP_EVENTTYPE_FILES_DROPPED, + _SAPP_EVENTTYPE_NUM, + _SAPP_EVENTTYPE_FORCE_U32 = 0x7FFFFFFF +} sapp_event_type; + +/* + sapp_keycode + + The 'virtual keycode' of a KEY_DOWN or KEY_UP event in the + struct field sapp_event.key_code. + + Note that the keycode values are identical with GLFW. +*/ +typedef enum sapp_keycode { + SAPP_KEYCODE_INVALID = 0, + SAPP_KEYCODE_SPACE = 32, + SAPP_KEYCODE_APOSTROPHE = 39, /* ' */ + SAPP_KEYCODE_COMMA = 44, /* , */ + SAPP_KEYCODE_MINUS = 45, /* - */ + SAPP_KEYCODE_PERIOD = 46, /* . */ + SAPP_KEYCODE_SLASH = 47, /* / */ + SAPP_KEYCODE_0 = 48, + SAPP_KEYCODE_1 = 49, + SAPP_KEYCODE_2 = 50, + SAPP_KEYCODE_3 = 51, + SAPP_KEYCODE_4 = 52, + SAPP_KEYCODE_5 = 53, + SAPP_KEYCODE_6 = 54, + SAPP_KEYCODE_7 = 55, + SAPP_KEYCODE_8 = 56, + SAPP_KEYCODE_9 = 57, + SAPP_KEYCODE_SEMICOLON = 59, /* ; */ + SAPP_KEYCODE_EQUAL = 61, /* = */ + SAPP_KEYCODE_A = 65, + SAPP_KEYCODE_B = 66, + SAPP_KEYCODE_C = 67, + SAPP_KEYCODE_D = 68, + SAPP_KEYCODE_E = 69, + SAPP_KEYCODE_F = 70, + SAPP_KEYCODE_G = 71, + SAPP_KEYCODE_H = 72, + SAPP_KEYCODE_I = 73, + SAPP_KEYCODE_J = 74, + SAPP_KEYCODE_K = 75, + SAPP_KEYCODE_L = 76, + SAPP_KEYCODE_M = 77, + SAPP_KEYCODE_N = 78, + SAPP_KEYCODE_O = 79, + SAPP_KEYCODE_P = 80, + SAPP_KEYCODE_Q = 81, + SAPP_KEYCODE_R = 82, + SAPP_KEYCODE_S = 83, + SAPP_KEYCODE_T = 84, + SAPP_KEYCODE_U = 85, + SAPP_KEYCODE_V = 86, + SAPP_KEYCODE_W = 87, + SAPP_KEYCODE_X = 88, + SAPP_KEYCODE_Y = 89, + SAPP_KEYCODE_Z = 90, + SAPP_KEYCODE_LEFT_BRACKET = 91, /* [ */ + SAPP_KEYCODE_BACKSLASH = 92, /* \ */ + SAPP_KEYCODE_RIGHT_BRACKET = 93, /* ] */ + SAPP_KEYCODE_GRAVE_ACCENT = 96, /* ` */ + SAPP_KEYCODE_WORLD_1 = 161, /* non-US #1 */ + SAPP_KEYCODE_WORLD_2 = 162, /* non-US #2 */ + SAPP_KEYCODE_ESCAPE = 256, + SAPP_KEYCODE_ENTER = 257, + SAPP_KEYCODE_TAB = 258, + SAPP_KEYCODE_BACKSPACE = 259, + SAPP_KEYCODE_INSERT = 260, + SAPP_KEYCODE_DELETE = 261, + SAPP_KEYCODE_RIGHT = 262, + SAPP_KEYCODE_LEFT = 263, + SAPP_KEYCODE_DOWN = 264, + SAPP_KEYCODE_UP = 265, + SAPP_KEYCODE_PAGE_UP = 266, + SAPP_KEYCODE_PAGE_DOWN = 267, + SAPP_KEYCODE_HOME = 268, + SAPP_KEYCODE_END = 269, + SAPP_KEYCODE_CAPS_LOCK = 280, + SAPP_KEYCODE_SCROLL_LOCK = 281, + SAPP_KEYCODE_NUM_LOCK = 282, + SAPP_KEYCODE_PRINT_SCREEN = 283, + SAPP_KEYCODE_PAUSE = 284, + SAPP_KEYCODE_F1 = 290, + SAPP_KEYCODE_F2 = 291, + SAPP_KEYCODE_F3 = 292, + SAPP_KEYCODE_F4 = 293, + SAPP_KEYCODE_F5 = 294, + SAPP_KEYCODE_F6 = 295, + SAPP_KEYCODE_F7 = 296, + SAPP_KEYCODE_F8 = 297, + SAPP_KEYCODE_F9 = 298, + SAPP_KEYCODE_F10 = 299, + SAPP_KEYCODE_F11 = 300, + SAPP_KEYCODE_F12 = 301, + SAPP_KEYCODE_F13 = 302, + SAPP_KEYCODE_F14 = 303, + SAPP_KEYCODE_F15 = 304, + SAPP_KEYCODE_F16 = 305, + SAPP_KEYCODE_F17 = 306, + SAPP_KEYCODE_F18 = 307, + SAPP_KEYCODE_F19 = 308, + SAPP_KEYCODE_F20 = 309, + SAPP_KEYCODE_F21 = 310, + SAPP_KEYCODE_F22 = 311, + SAPP_KEYCODE_F23 = 312, + SAPP_KEYCODE_F24 = 313, + SAPP_KEYCODE_F25 = 314, + SAPP_KEYCODE_KP_0 = 320, + SAPP_KEYCODE_KP_1 = 321, + SAPP_KEYCODE_KP_2 = 322, + SAPP_KEYCODE_KP_3 = 323, + SAPP_KEYCODE_KP_4 = 324, + SAPP_KEYCODE_KP_5 = 325, + SAPP_KEYCODE_KP_6 = 326, + SAPP_KEYCODE_KP_7 = 327, + SAPP_KEYCODE_KP_8 = 328, + SAPP_KEYCODE_KP_9 = 329, + SAPP_KEYCODE_KP_DECIMAL = 330, + SAPP_KEYCODE_KP_DIVIDE = 331, + SAPP_KEYCODE_KP_MULTIPLY = 332, + SAPP_KEYCODE_KP_SUBTRACT = 333, + SAPP_KEYCODE_KP_ADD = 334, + SAPP_KEYCODE_KP_ENTER = 335, + SAPP_KEYCODE_KP_EQUAL = 336, + SAPP_KEYCODE_LEFT_SHIFT = 340, + SAPP_KEYCODE_LEFT_CONTROL = 341, + SAPP_KEYCODE_LEFT_ALT = 342, + SAPP_KEYCODE_LEFT_SUPER = 343, + SAPP_KEYCODE_RIGHT_SHIFT = 344, + SAPP_KEYCODE_RIGHT_CONTROL = 345, + SAPP_KEYCODE_RIGHT_ALT = 346, + SAPP_KEYCODE_RIGHT_SUPER = 347, + SAPP_KEYCODE_MENU = 348, +} sapp_keycode; + +/* + sapp_touchpoint + + Describes a single touchpoint in a multitouch event (TOUCHES_BEGAN, + TOUCHES_MOVED, TOUCHES_ENDED). + + Touch points are stored in the nested array sapp_event.touches[], + and the number of touches is stored in sapp_event.num_touches. +*/ +typedef struct sapp_touchpoint { + uintptr_t identifier; + float pos_x; + float pos_y; + bool changed; +} sapp_touchpoint; + +/* + sapp_mousebutton + + The currently pressed mouse button in the events MOUSE_DOWN + and MOUSE_UP, stored in the struct field sapp_event.mouse_button. +*/ +typedef enum sapp_mousebutton { + SAPP_MOUSEBUTTON_LEFT = 0x0, + SAPP_MOUSEBUTTON_RIGHT = 0x1, + SAPP_MOUSEBUTTON_MIDDLE = 0x2, + SAPP_MOUSEBUTTON_INVALID = 0x100, +} sapp_mousebutton; + +/* + These are currently pressed modifier keys (and mouse buttons) which are + passed in the event struct field sapp_event.modifiers. +*/ +enum { + SAPP_MODIFIER_SHIFT = 0x1, // left or right shift key + SAPP_MODIFIER_CTRL = 0x2, // left or right control key + SAPP_MODIFIER_ALT = 0x4, // left or right alt key + SAPP_MODIFIER_SUPER = 0x8, // left or right 'super' key + SAPP_MODIFIER_LMB = 0x100, // left mouse button + SAPP_MODIFIER_RMB = 0x200, // right mouse button + SAPP_MODIFIER_MMB = 0x400, // middle mouse button +}; + +/* + sapp_event + + This is an all-in-one event struct passed to the event handler + user callback function. Note that it depends on the event + type what struct fields actually contain useful values, so you + should first check the event type before reading other struct + fields. +*/ +typedef struct sapp_event { + uint64_t frame_count; // current frame counter, always valid, useful for checking if two events were issued in the same frame + sapp_event_type type; // the event type, always valid + sapp_keycode key_code; // the virtual key code, only valid in KEY_UP, KEY_DOWN + uint32_t char_code; // the UTF-32 character code, only valid in CHAR events + bool key_repeat; // true if this is a key-repeat event, valid in KEY_UP, KEY_DOWN and CHAR + uint32_t modifiers; // current modifier keys, valid in all key-, char- and mouse-events + sapp_mousebutton mouse_button; // mouse button that was pressed or released, valid in MOUSE_DOWN, MOUSE_UP + float mouse_x; // current horizontal mouse position in pixels, always valid except during mouse lock + float mouse_y; // current vertical mouse position in pixels, always valid except during mouse lock + float mouse_dx; // relative horizontal mouse movement since last frame, always valid + float mouse_dy; // relative vertical mouse movement since last frame, always valid + float scroll_x; // horizontal mouse wheel scroll distance, valid in MOUSE_SCROLL events + float scroll_y; // vertical mouse wheel scroll distance, valid in MOUSE_SCROLL events + int num_touches; // number of valid items in the touches[] array + sapp_touchpoint touches[SAPP_MAX_TOUCHPOINTS]; // current touch points, valid in TOUCHES_BEGIN, TOUCHES_MOVED, TOUCHES_ENDED + int window_width; // current window- and framebuffer sizes in pixels, always valid + int window_height; + int framebuffer_width; // = window_width * dpi_scale + int framebuffer_height; // = window_height * dpi_scale +} sapp_event; + +/* + sg_range + + A general pointer/size-pair struct and constructor macros for passing binary blobs + into sokol_app.h. +*/ +typedef struct sapp_range { + const void* ptr; + size_t size; +} sapp_range; +// disabling this for every includer isn't great, but the warnings are also quite pointless +#if defined(_MSC_VER) +#pragma warning(disable:4221) /* /W4 only: nonstandard extension used: 'x': cannot be initialized using address of automatic variable 'y' */ +#pragma warning(disable:4204) /* VS2015: nonstandard extension used: non-constant aggregate initializer */ +#endif +#if defined(__cplusplus) +#define SAPP_RANGE(x) sapp_range{ &x, sizeof(x) } +#else +#define SAPP_RANGE(x) (sapp_range){ &x, sizeof(x) } +#endif + +/* + sapp_image_desc + + This is used to describe image data to sokol_app.h (at first, window + icons, later maybe cursor images). + + Note that the actual image pixel format depends on the use case: + + - window icon pixels are RGBA8 + - cursor images are ??? (FIXME) +*/ +typedef struct sapp_image_desc { + int width; + int height; + sapp_range pixels; +} sapp_image_desc; + +/* + sapp_icon_desc + + An icon description structure for use in sapp_desc.icon and + sapp_set_icon(). + + When setting a custom image, the application can provide a number of + candidates differing in size, and sokol_app.h will pick the image(s) + closest to the size expected by the platform's window system. + + To set sokol-app's default icon, set .sokol_default to true. + + Otherwise provide candidate images of different sizes in the + images[] array. + + If both the sokol_default flag is set to true, any image candidates + will be ignored and the sokol_app.h default icon will be set. +*/ +typedef struct sapp_icon_desc { + bool sokol_default; + sapp_image_desc images[SAPP_MAX_ICONIMAGES]; +} sapp_icon_desc; + + +typedef struct sapp_desc { + void (*init_cb)(void); // these are the user-provided callbacks without user data + void (*frame_cb)(void); + void (*cleanup_cb)(void); + void (*event_cb)(const sapp_event*); + void (*fail_cb)(const char*); + + void* user_data; // these are the user-provided callbacks with user data + void (*init_userdata_cb)(void*); + void (*frame_userdata_cb)(void*); + void (*cleanup_userdata_cb)(void*); + void (*event_userdata_cb)(const sapp_event*, void*); + void (*fail_userdata_cb)(const char*, void*); + + int width; // the preferred width of the window / canvas + int height; // the preferred height of the window / canvas + int sample_count; // MSAA sample count + int swap_interval; // the preferred swap interval (ignored on some platforms) + bool high_dpi; // whether the rendering canvas is full-resolution on HighDPI displays + bool fullscreen; // whether the window should be created in fullscreen mode + bool alpha; // whether the framebuffer should have an alpha channel (ignored on some platforms) + const char* window_title; // the window title as UTF-8 encoded string + bool user_cursor; // if true, user is expected to manage cursor image in SAPP_EVENTTYPE_UPDATE_CURSOR + bool enable_clipboard; // enable clipboard access, default is false + int clipboard_size; // max size of clipboard content in bytes + bool enable_dragndrop; // enable file dropping (drag'n'drop), default is false + int max_dropped_files; // max number of dropped files to process (default: 1) + int max_dropped_file_path_length; // max length in bytes of a dropped UTF-8 file path (default: 2048) + sapp_icon_desc icon; // the initial window icon to set + + /* backend-specific options */ + bool gl_force_gles2; // if true, setup GLES2/WebGL even if GLES3/WebGL2 is available + bool win32_console_utf8; // if true, set the output console codepage to UTF-8 + bool win32_console_create; // if true, attach stdout/stderr to a new console window + bool win32_console_attach; // if true, attach stdout/stderr to parent process + const char* html5_canvas_name; // the name (id) of the HTML5 canvas element, default is "canvas" + bool html5_canvas_resize; // if true, the HTML5 canvas size is set to sapp_desc.width/height, otherwise canvas size is tracked + bool html5_preserve_drawing_buffer; // HTML5 only: whether to preserve default framebuffer content between frames + bool html5_premultiplied_alpha; // HTML5 only: whether the rendered pixels use premultiplied alpha convention + bool html5_ask_leave_site; // initial state of the internal html5_ask_leave_site flag (see sapp_html5_ask_leave_site()) + bool ios_keyboard_resizes_canvas; // if true, showing the iOS keyboard shrinks the canvas +} sapp_desc; + +/* HTML5 specific: request and response structs for + asynchronously loading dropped-file content. +*/ +typedef enum sapp_html5_fetch_error { + SAPP_HTML5_FETCH_ERROR_NO_ERROR, + SAPP_HTML5_FETCH_ERROR_BUFFER_TOO_SMALL, + SAPP_HTML5_FETCH_ERROR_OTHER, +} sapp_html5_fetch_error; + +typedef struct sapp_html5_fetch_response { + bool succeeded; /* true if the loading operation has succeeded */ + sapp_html5_fetch_error error_code; + int file_index; /* index of the dropped file (0..sapp_get_num_dropped_filed()-1) */ + uint32_t fetched_size; /* size in bytes of loaded data */ + void* buffer_ptr; /* pointer to user-provided buffer which contains the loaded data */ + uint32_t buffer_size; /* size of user-provided buffer (buffer_size >= fetched_size) */ + void* user_data; /* user-provided user data pointer */ +} sapp_html5_fetch_response; + +typedef struct sapp_html5_fetch_request { + int dropped_file_index; /* 0..sapp_get_num_dropped_files()-1 */ + void (*callback)(const sapp_html5_fetch_response*); /* response callback function pointer (required) */ + void* buffer_ptr; /* pointer to buffer to load data into */ + uint32_t buffer_size; /* size in bytes of buffer */ + void* user_data; /* optional userdata pointer */ +} sapp_html5_fetch_request; + +/* user-provided functions */ +extern sapp_desc sokol_main(int argc, char* argv[]); + +/* returns true after sokol-app has been initialized */ +SOKOL_APP_API_DECL bool sapp_isvalid(void); +/* returns the current framebuffer width in pixels */ +SOKOL_APP_API_DECL int sapp_width(void); +/* same as sapp_width(), but returns float */ +SOKOL_APP_API_DECL float sapp_widthf(void); +/* returns the current framebuffer height in pixels */ +SOKOL_APP_API_DECL int sapp_height(void); +/* same as sapp_height(), but returns float */ +SOKOL_APP_API_DECL float sapp_heightf(void); +/* get default framebuffer color pixel format */ +SOKOL_APP_API_DECL int sapp_color_format(void); +/* get default framebuffer depth pixel format */ +SOKOL_APP_API_DECL int sapp_depth_format(void); +/* get default framebuffer sample count */ +SOKOL_APP_API_DECL int sapp_sample_count(void); +/* returns true when high_dpi was requested and actually running in a high-dpi scenario */ +SOKOL_APP_API_DECL bool sapp_high_dpi(void); +/* returns the dpi scaling factor (window pixels to framebuffer pixels) */ +SOKOL_APP_API_DECL float sapp_dpi_scale(void); +/* show or hide the mobile device onscreen keyboard */ +SOKOL_APP_API_DECL void sapp_show_keyboard(bool show); +/* return true if the mobile device onscreen keyboard is currently shown */ +SOKOL_APP_API_DECL bool sapp_keyboard_shown(void); +/* query fullscreen mode */ +SOKOL_APP_API_DECL bool sapp_is_fullscreen(void); +/* toggle fullscreen mode */ +SOKOL_APP_API_DECL void sapp_toggle_fullscreen(void); +/* show or hide the mouse cursor */ +SOKOL_APP_API_DECL void sapp_show_mouse(bool show); +/* show or hide the mouse cursor */ +SOKOL_APP_API_DECL bool sapp_mouse_shown(void); +/* enable/disable mouse-pointer-lock mode */ +SOKOL_APP_API_DECL void sapp_lock_mouse(bool lock); +/* return true if in mouse-pointer-lock mode (this may toggle a few frames later) */ +SOKOL_APP_API_DECL bool sapp_mouse_locked(void); +/* return the userdata pointer optionally provided in sapp_desc */ +SOKOL_APP_API_DECL void* sapp_userdata(void); +/* return a copy of the sapp_desc structure */ +SOKOL_APP_API_DECL sapp_desc sapp_query_desc(void); +/* initiate a "soft quit" (sends SAPP_EVENTTYPE_QUIT_REQUESTED) */ +SOKOL_APP_API_DECL void sapp_request_quit(void); +/* cancel a pending quit (when SAPP_EVENTTYPE_QUIT_REQUESTED has been received) */ +SOKOL_APP_API_DECL void sapp_cancel_quit(void); +/* initiate a "hard quit" (quit application without sending SAPP_EVENTTYPE_QUIT_REQUSTED) */ +SOKOL_APP_API_DECL void sapp_quit(void); +/* call from inside event callback to consume the current event (don't forward to platform) */ +SOKOL_APP_API_DECL void sapp_consume_event(void); +/* get the current frame counter (for comparison with sapp_event.frame_count) */ +SOKOL_APP_API_DECL uint64_t sapp_frame_count(void); +/* write string into clipboard */ +SOKOL_APP_API_DECL void sapp_set_clipboard_string(const char* str); +/* read string from clipboard (usually during SAPP_EVENTTYPE_CLIPBOARD_PASTED) */ +SOKOL_APP_API_DECL const char* sapp_get_clipboard_string(void); +/* set the window title (only on desktop platforms) */ +SOKOL_APP_API_DECL void sapp_set_window_title(const char* str); +/* set the window icon (only on Windows and Linux) */ +SOKOL_APP_API_DECL void sapp_set_icon(const sapp_icon_desc* icon_desc); +/* gets the total number of dropped files (after an SAPP_EVENTTYPE_FILES_DROPPED event) */ +SOKOL_APP_API_DECL int sapp_get_num_dropped_files(void); +/* gets the dropped file paths */ +SOKOL_APP_API_DECL const char* sapp_get_dropped_file_path(int index); + +/* special run-function for SOKOL_NO_ENTRY (in standard mode this is an empty stub) */ +SOKOL_APP_API_DECL void sapp_run(const sapp_desc* desc); + +/* GL: return true when GLES2 fallback is active (to detect fallback from GLES3) */ +SOKOL_APP_API_DECL bool sapp_gles2(void); + +/* HTML5: enable or disable the hardwired "Leave Site?" dialog box */ +SOKOL_APP_API_DECL void sapp_html5_ask_leave_site(bool ask); +/* HTML5: get byte size of a dropped file */ +SOKOL_APP_API_DECL uint32_t sapp_html5_get_dropped_file_size(int index); +/* HTML5: asynchronously load the content of a dropped file */ +SOKOL_APP_API_DECL void sapp_html5_fetch_dropped_file(const sapp_html5_fetch_request* request); + +/* Metal: get bridged pointer to Metal device object */ +SOKOL_APP_API_DECL const void* sapp_metal_get_device(void); +/* Metal: get bridged pointer to this frame's renderpass descriptor */ +SOKOL_APP_API_DECL const void* sapp_metal_get_renderpass_descriptor(void); +/* Metal: get bridged pointer to current drawable */ +SOKOL_APP_API_DECL const void* sapp_metal_get_drawable(void); +/* macOS: get bridged pointer to macOS NSWindow */ +SOKOL_APP_API_DECL const void* sapp_macos_get_window(void); +/* iOS: get bridged pointer to iOS UIWindow */ +SOKOL_APP_API_DECL const void* sapp_ios_get_window(void); + +/* D3D11: get pointer to ID3D11Device object */ +SOKOL_APP_API_DECL const void* sapp_d3d11_get_device(void); +/* D3D11: get pointer to ID3D11DeviceContext object */ +SOKOL_APP_API_DECL const void* sapp_d3d11_get_device_context(void); +/* D3D11: get pointer to IDXGISwapChain object */ +SOKOL_APP_API_DECL const void* sapp_d3d11_get_swap_chain(void); +/* D3D11: get pointer to ID3D11RenderTargetView object */ +SOKOL_APP_API_DECL const void* sapp_d3d11_get_render_target_view(void); +/* D3D11: get pointer to ID3D11DepthStencilView */ +SOKOL_APP_API_DECL const void* sapp_d3d11_get_depth_stencil_view(void); +/* Win32: get the HWND window handle */ +SOKOL_APP_API_DECL const void* sapp_win32_get_hwnd(void); + +/* WebGPU: get WGPUDevice handle */ +SOKOL_APP_API_DECL const void* sapp_wgpu_get_device(void); +/* WebGPU: get swapchain's WGPUTextureView handle for rendering */ +SOKOL_APP_API_DECL const void* sapp_wgpu_get_render_view(void); +/* WebGPU: get swapchain's MSAA-resolve WGPUTextureView (may return null) */ +SOKOL_APP_API_DECL const void* sapp_wgpu_get_resolve_view(void); +/* WebGPU: get swapchain's WGPUTextureView for the depth-stencil surface */ +SOKOL_APP_API_DECL const void* sapp_wgpu_get_depth_stencil_view(void); + +/* Android: get native activity handle */ +SOKOL_APP_API_DECL const void* sapp_android_get_native_activity(void); + +#ifdef __cplusplus +} /* extern "C" */ + +/* reference-based equivalents for C++ */ +inline void sapp_run(const sapp_desc& desc) { return sapp_run(&desc); } + +#endif + +// this WinRT specific hack is required when wWinMain is in a static library +#if defined(_MSC_VER) && defined(UNICODE) +#include +#if defined(WINAPI_FAMILY_PARTITION) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +#pragma comment(linker, "/include:wWinMain") +#endif +#endif + +#endif // SOKOL_APP_INCLUDED + +#ifdef SOKOL_APP_IMPL +#define SOKOL_APP_IMPL_INCLUDED (1) + +#ifndef SOKOL_API_IMPL + #define SOKOL_API_IMPL +#endif + +#include // memset +#include // size_t + +uint64_t dummy_stm_time_ns = UINT64_C(1000000000); + +typedef struct { + bool valid; + sapp_desc desc; + bool mouse_shown; + bool mouse_locked; + bool want_quit; + bool force_quit; + uint64_t frame_count; +} dummy_sapp; + +dummy_sapp _sapp; + +void _sapp_call_event(const sapp_event *ev) +{ + if (_sapp.desc.event_cb) { + _sapp.desc.event_cb(ev); + } else if (_sapp.desc.event_userdata_cb) { + _sapp.desc.event_userdata_cb(ev, _sapp.desc.user_data); + } +} + +int main(int argc, char **argv) +{ + sapp_desc desc = sokol_main(argc, argv); + + _sapp.valid = true; + _sapp.desc = desc; + _sapp.mouse_shown = true; + _sapp.mouse_locked = true; + + if (_sapp.desc.init_cb) { + _sapp.desc.init_cb(); + } else if (_sapp.desc.init_userdata_cb) { + _sapp.desc.init_userdata_cb(_sapp.desc.user_data); + } + + for (;;) { + + if (_sapp.force_quit) break; + + if (_sapp.want_quit) { + sapp_event ev = { _sapp.frame_count, SAPP_EVENTTYPE_QUIT_REQUESTED }; + _sapp_call_event(&ev); + if (_sapp.want_quit) break; + } + + if (_sapp.desc.frame_cb) { + _sapp.desc.frame_cb(); + } else if (_sapp.desc.frame_userdata_cb) { + _sapp.desc.frame_userdata_cb(_sapp.desc.user_data); + } + + dummy_stm_time_ns += UINT64_C(16666666); + _sapp.frame_count++; + #if defined(DUMMY_SAPP_MAX_FRAMES) + if (_sapp.frame_count >= DUMMY_SAPP_MAX_FRAMES) break; + #endif + } + + if (_sapp.desc.cleanup_cb) { + _sapp.desc.cleanup_cb(); + } else if (_sapp.desc.cleanup_userdata_cb) { + _sapp.desc.cleanup_userdata_cb(_sapp.desc.user_data); + } + + return 0; +} + +/* returns true after sokol-app has been initialized */ +SOKOL_API_IMPL bool sapp_isvalid(void) { return _sapp.valid; } +/* returns the current framebuffer width in pixels */ +SOKOL_API_IMPL int sapp_width(void) { return _sapp.desc.width; } +/* same as sapp_width(), but returns float */ +SOKOL_API_IMPL float sapp_widthf(void) { return (float)_sapp.desc.width; } +/* returns the current framebuffer height in pixels */ +SOKOL_API_IMPL int sapp_height(void) { return _sapp.desc.height; } +/* same as sapp_height(), but returns float */ +SOKOL_API_IMPL float sapp_heightf(void) { return (float)_sapp.desc.height; } +/* get default framebuffer color pixel format */ +SOKOL_API_IMPL int sapp_color_format(void) { return 23; /* _SAPP_PIXELFORMAT_RGBA8 */ } +/* get default framebuffer depth pixel format */ +SOKOL_API_IMPL int sapp_depth_format(void) { return 42; /* _SAPP_PIXELFORMAT_DEPTH_STENCIL */ } +/* get default framebuffer sample count */ +SOKOL_API_IMPL int sapp_sample_count(void) { return _sapp.desc.sample_count; } +/* returns true when high_dpi was requested and actually running in a high-dpi scenario */ +SOKOL_API_IMPL bool sapp_high_dpi(void) { return _sapp.desc.high_dpi; } +/* returns the dpi scaling factor (window pixels to framebuffer pixels) */ +SOKOL_API_IMPL float sapp_dpi_scale(void) { return 1.0f; } +/* show or hide the mobile device onscreen keyboard */ +SOKOL_API_IMPL void sapp_show_keyboard(bool show) { } +/* return true if the mobile device onscreen keyboard is currently shown */ +SOKOL_API_IMPL bool sapp_keyboard_shown(void) { return false; } +/* query fullscreen mode */ +SOKOL_API_IMPL bool sapp_is_fullscreen(void) { return _sapp.desc.fullscreen; } +/* toggle fullscreen mode */ +SOKOL_API_IMPL void sapp_toggle_fullscreen(void) { _sapp.desc.fullscreen = !_sapp.desc.fullscreen; } +/* show or hide the mouse cursor */ +SOKOL_API_IMPL void sapp_show_mouse(bool show) { _sapp.mouse_shown = show; } +/* show or hide the mouse cursor */ +SOKOL_API_IMPL bool sapp_mouse_shown(void) { return _sapp.mouse_shown; } +/* enable/disable mouse-pointer-lock mode */ +SOKOL_API_IMPL void sapp_lock_mouse(bool lock) { _sapp.mouse_locked = lock; } +/* return true if in mouse-pointer-lock mode (this may toggle a few frames later) */ +SOKOL_APP_API_DECL bool sapp_mouse_locked(void) { return _sapp.mouse_locked; } +/* return the userdata pointer optionally provided in sapp_desc */ +SOKOL_API_IMPL void* sapp_userdata(void) { return _sapp.desc.user_data; } +/* return a copy of the sapp_desc structure */ +SOKOL_API_IMPL sapp_desc sapp_query_desc(void) { return _sapp.desc; } +/* initiate a "soft quit" (sends SAPP_EVENTTYPE_QUIT_REQUESTED) */ +SOKOL_API_IMPL void sapp_request_quit(void) { _sapp.want_quit = true; } +/* cancel a pending quit (when SAPP_EVENTTYPE_QUIT_REQUESTED has been received) */ +SOKOL_API_IMPL void sapp_cancel_quit(void) { _sapp.want_quit = false; } +/* initiate a "hard quit" (quit application without sending SAPP_EVENTTYPE_QUIT_REQUSTED) */ +SOKOL_API_IMPL void sapp_quit(void) { _sapp.force_quit = true; } +/* call from inside event callback to consume the current event (don't forward to platform) */ +SOKOL_API_IMPL void sapp_consume_event(void) { } +/* get the current frame counter (for comparison with sapp_event.frame_count) */ +SOKOL_API_IMPL uint64_t sapp_frame_count(void) { return _sapp.frame_count; } +/* write string into clipboard */ +SOKOL_API_IMPL void sapp_set_clipboard_string(const char* str) { } +/* read string from clipboard (usually during SAPP_EVENTTYPE_CLIPBOARD_PASTED) */ +SOKOL_API_IMPL const char* sapp_get_clipboard_string(void) { return ""; } +/* set the window title (only on desktop platforms) */ +SOKOL_API_IMPL void sapp_set_window_title(const char* str) { } +/* set the window icon (only on Windows and Linux) */ +SOKOL_API_IMPL void sapp_set_icon(const sapp_icon_desc* icon_desc) { } +/* gets the total number of dropped files (after an SAPP_EVENTTYPE_FILES_DROPPED event) */ +SOKOL_API_IMPL int sapp_get_num_dropped_files(void) { return 0; } +/* gets the dropped file paths */ +SOKOL_API_IMPL const char* sapp_get_dropped_file_path(int index) { return NULL; } + +/* GL: return true when GLES2 fallback is active (to detect fallback from GLES3) */ +SOKOL_API_IMPL bool sapp_gles2(void) { return false; } + +/* HTML5: enable or disable the hardwired "Leave Site?" dialog box */ +SOKOL_API_IMPL void sapp_html5_ask_leave_site(bool ask) { } +/* HTML5: get byte size of a dropped file */ +SOKOL_API_IMPL uint32_t sapp_html5_get_dropped_file_size(int index) { return 0; } +/* HTML5: asynchronously load the content of a dropped file */ +SOKOL_API_IMPL void sapp_html5_fetch_dropped_file(const sapp_html5_fetch_request* request) { } + +/* Metal: get bridged pointer to Metal device object */ +SOKOL_API_IMPL const void* sapp_metal_get_device(void) { return NULL; } +/* Metal: get bridged pointer to this frame's renderpass descriptor */ +SOKOL_API_IMPL const void* sapp_metal_get_renderpass_descriptor(void) { return NULL; } +/* Metal: get bridged pointer to current drawable */ +SOKOL_API_IMPL const void* sapp_metal_get_drawable(void) { return NULL; } +/* macOS: get bridged pointer to macOS NSWindow */ +SOKOL_API_IMPL const void* sapp_macos_get_window(void) { return NULL; } +/* iOS: get bridged pointer to iOS UIWindow */ +SOKOL_API_IMPL const void* sapp_ios_get_window(void) { return NULL; } + +/* D3D11: get pointer to ID3D11Device object */ +SOKOL_API_IMPL const void* sapp_d3d11_get_device(void) { return NULL; } +/* D3D11: get pointer to ID3D11DeviceContext object */ +SOKOL_API_IMPL const void* sapp_d3d11_get_device_context(void) { return NULL; } +/* D3D11: get pointer to IDXGISwapChain object */ +SOKOL_API_IMPL const void* sapp_d3d11_get_swap_chain(void) { return NULL; } +/* D3D11: get pointer to ID3D11RenderTargetView object */ +SOKOL_API_IMPL const void* sapp_d3d11_get_render_target_view(void) { return NULL; } +/* D3D11: get pointer to ID3D11DepthStencilView */ +SOKOL_API_IMPL const void* sapp_d3d11_get_depth_stencil_view(void) { return NULL; } +/* Win32: get the HWND window handle */ +SOKOL_API_IMPL const void* sapp_win32_get_hwnd(void) { return NULL; } + +/* WebGPU: get WGPUDevice handle */ +SOKOL_API_IMPL const void* sapp_wgpu_get_device(void) { return NULL; } +/* WebGPU: get swapchain's WGPUTextureView handle for rendering */ +SOKOL_API_IMPL const void* sapp_wgpu_get_render_view(void) { return NULL; } +/* WebGPU: get swapchain's MSAA-resolve WGPUTextureView (may return null) */ +SOKOL_API_IMPL const void* sapp_wgpu_get_resolve_view(void) { return NULL; } +/* WebGPU: get swapchain's WGPUTextureView for the depth-stencil surface */ +SOKOL_API_IMPL const void* sapp_wgpu_get_depth_stencil_view(void) { return NULL; } + +/* Android: get native activity handle */ +SOKOL_API_IMPL const void* sapp_android_get_native_activity(void) { return NULL; } + +#endif /* SOKOL_APP_IMPL */ \ No newline at end of file diff --git a/modules/ufbx/examples/viewer/external/dummy_sokol_gfx.h b/modules/ufbx/examples/viewer/external/dummy_sokol_gfx.h new file mode 100644 index 0000000..f437c1f --- /dev/null +++ b/modules/ufbx/examples/viewer/external/dummy_sokol_gfx.h @@ -0,0 +1,2741 @@ +#if defined(SOKOL_IMPL) && !defined(SOKOL_GFX_IMPL) +#define SOKOL_GFX_IMPL +#endif +#ifndef SOKOL_GFX_INCLUDED +/* + sokol_gfx.h -- simple 3D API wrapper + + Project URL: https://github.com/floooh/sokol + + Example code: https://github.com/floooh/sokol-samples + + Do this: + #define SOKOL_IMPL or + #define SOKOL_GFX_IMPL + before you include this file in *one* C or C++ file to create the + implementation. + + In the same place define one of the following to select the rendering + backend: + #define SOKOL_GLCORE33 + #define SOKOL_GLES2 + #define SOKOL_GLES3 + #define SOKOL_D3D11 + #define SOKOL_METAL + #define SOKOL_WGPU + #define SOKOL_DUMMY_BACKEND + + I.e. for the GL 3.3 Core Profile it should look like this: + + #include ... + #include ... + #define SOKOL_IMPL + #define SOKOL_GLCORE33 + #include "sokol_gfx.h" + + The dummy backend replaces the platform-specific backend code with empty + stub functions. This is useful for writing tests that need to run on the + command line. + + Optionally provide the following defines with your own implementations: + + SOKOL_ASSERT(c) - your own assert macro (default: assert(c)) + SOKOL_MALLOC(s) - your own malloc function (default: malloc(s)) + SOKOL_FREE(p) - your own free function (default: free(p)) + SOKOL_LOG(msg) - your own logging function (default: puts(msg)) + SOKOL_UNREACHABLE() - a guard macro for unreachable code (default: assert(false)) + SOKOL_GFX_API_DECL - public function declaration prefix (default: extern) + SOKOL_API_DECL - same as SOKOL_GFX_API_DECL + SOKOL_API_IMPL - public function implementation prefix (default: -) + SOKOL_TRACE_HOOKS - enable trace hook callbacks (search below for TRACE HOOKS) + SOKOL_EXTERNAL_GL_LOADER - indicates that you're using your own GL loader, in this case + sokol_gfx.h will not include any platform GL headers and disable + the integrated Win32 GL loader + + If sokol_gfx.h is compiled as a DLL, define the following before + including the declaration or implementation: + + SOKOL_DLL + + On Windows, SOKOL_DLL will define SOKOL_GFX_API_DECL as __declspec(dllexport) + or __declspec(dllimport) as needed. + + If you want to compile without deprecated structs and functions, + define: + + SOKOL_NO_DEPRECATED + + Optionally define the following to force debug checks and validations + even in release mode: + + SOKOL_DEBUG - by default this is defined if _DEBUG is defined + + sokol_gfx DOES NOT: + =================== + - create a window or the 3D-API context/device, you must do this + before sokol_gfx is initialized, and pass any required information + (like 3D device pointers) to the sokol_gfx initialization call + + - present the rendered frame, how this is done exactly usually depends + on how the window and 3D-API context/device was created + + - provide a unified shader language, instead 3D-API-specific shader + source-code or shader-bytecode must be provided (for the "official" + offline shader cross-compiler, see here: + https://github.com/floooh/sokol-tools/blob/master/docs/sokol-shdc.md) + + STEP BY STEP + ============ + --- to initialize sokol_gfx, after creating a window and a 3D-API + context/device, call: + + sg_setup(const sg_desc*) + + --- create resource objects (at least buffers, shaders and pipelines, + and optionally images and passes): + + sg_buffer sg_make_buffer(const sg_buffer_desc*) + sg_image sg_make_image(const sg_image_desc*) + sg_shader sg_make_shader(const sg_shader_desc*) + sg_pipeline sg_make_pipeline(const sg_pipeline_desc*) + sg_pass sg_make_pass(const sg_pass_desc*) + + --- start rendering to the default frame buffer with: + + sg_begin_default_pass(const sg_pass_action* action, int width, int height) + + ...or alternatively with: + + sg_begin_default_passf(const sg_pass_action* action, float width, float height) + + ...which takes the framebuffer width and height as float values. + + --- or start rendering to an offscreen framebuffer with: + + sg_begin_pass(sg_pass pass, const sg_pass_action* action) + + --- set the pipeline state for the next draw call with: + + sg_apply_pipeline(sg_pipeline pip) + + --- fill an sg_bindings struct with the resource bindings for the next + draw call (1..N vertex buffers, 0 or 1 index buffer, 0..N image objects + to use as textures each on the vertex-shader- and fragment-shader-stage + and then call + + sg_apply_bindings(const sg_bindings* bindings) + + to update the resource bindings + + --- optionally update shader uniform data with: + + sg_apply_uniforms(sg_shader_stage stage, int ub_index, const sg_range* data) + + Read the section 'UNIFORM DATA LAYOUT' to learn about the expected memory layout + of the uniform data passed into sg_apply_uniforms(). + + --- kick off a draw call with: + + sg_draw(int base_element, int num_elements, int num_instances) + + The sg_draw() function unifies all the different ways to render primitives + in a single call (indexed vs non-indexed rendering, and instanced vs non-instanced + rendering). In case of indexed rendering, base_element and num_element specify + indices in the currently bound index buffer. In case of non-indexed rendering + base_element and num_elements specify vertices in the currently bound + vertex-buffer(s). To perform instanced rendering, the rendering pipeline + must be setup for instancing (see sg_pipeline_desc below), a separate vertex buffer + containing per-instance data must be bound, and the num_instances parameter + must be > 1. + + --- finish the current rendering pass with: + + sg_end_pass() + + --- when done with the current frame, call + + sg_commit() + + --- at the end of your program, shutdown sokol_gfx with: + + sg_shutdown() + + --- if you need to destroy resources before sg_shutdown(), call: + + sg_destroy_buffer(sg_buffer buf) + sg_destroy_image(sg_image img) + sg_destroy_shader(sg_shader shd) + sg_destroy_pipeline(sg_pipeline pip) + sg_destroy_pass(sg_pass pass) + + --- to set a new viewport rectangle, call + + sg_apply_viewport(int x, int y, int width, int height, bool origin_top_left) + + ...or if you want to specifiy the viewport rectangle with float values: + + sg_apply_viewportf(float x, float y, float width, float height, bool origin_top_left) + + --- to set a new scissor rect, call: + + sg_apply_scissor_rect(int x, int y, int width, int height, bool origin_top_left) + + ...or with float values: + + sg_apply_scissor_rectf(float x, float y, float width, float height, bool origin_top_left) + + Both sg_apply_viewport() and sg_apply_scissor_rect() must be called + inside a rendering pass + + Note that sg_begin_default_pass() and sg_begin_pass() will reset both the + viewport and scissor rectangles to cover the entire framebuffer. + + --- to update (overwrite) the content of buffer and image resources, call: + + sg_update_buffer(sg_buffer buf, const sg_range* data) + sg_update_image(sg_image img, const sg_image_data* data) + + Buffers and images to be updated must have been created with + SG_USAGE_DYNAMIC or SG_USAGE_STREAM + + Only one update per frame is allowed for buffer and image resources when + using the sg_update_*() functions. The rationale is to have a simple + countermeasure to avoid the CPU scribbling over data the GPU is currently + using, or the CPU having to wait for the GPU + + Buffer and image updates can be partial, as long as a rendering + operation only references the valid (updated) data in the + buffer or image. + + --- to append a chunk of data to a buffer resource, call: + + int sg_append_buffer(sg_buffer buf, const sg_range* data) + + The difference to sg_update_buffer() is that sg_append_buffer() + can be called multiple times per frame to append new data to the + buffer piece by piece, optionally interleaved with draw calls referencing + the previously written data. + + sg_append_buffer() returns a byte offset to the start of the + written data, this offset can be assigned to + sg_bindings.vertex_buffer_offsets[n] or + sg_bindings.index_buffer_offset + + Code example: + + for (...) { + const void* data = ...; + const int num_bytes = ...; + int offset = sg_append_buffer(buf, &(sg_range) { .ptr=data, .size=num_bytes }); + bindings.vertex_buffer_offsets[0] = offset; + sg_apply_pipeline(pip); + sg_apply_bindings(&bindings); + sg_apply_uniforms(...); + sg_draw(...); + } + + A buffer to be used with sg_append_buffer() must have been created + with SG_USAGE_DYNAMIC or SG_USAGE_STREAM. + + If the application appends more data to the buffer then fits into + the buffer, the buffer will go into the "overflow" state for the + rest of the frame. + + Any draw calls attempting to render an overflown buffer will be + silently dropped (in debug mode this will also result in a + validation error). + + You can also check manually if a buffer is in overflow-state by calling + + bool sg_query_buffer_overflow(sg_buffer buf) + + NOTE: Due to restrictions in underlying 3D-APIs, appended chunks of + data will be 4-byte aligned in the destination buffer. This means + that there will be gaps in index buffers containing 16-bit indices + when the number of indices in a call to sg_append_buffer() is + odd. This isn't a problem when each call to sg_append_buffer() + is associated with one draw call, but will be problematic when + a single indexed draw call spans several appended chunks of indices. + + --- to check at runtime for optional features, limits and pixelformat support, + call: + + sg_features sg_query_features() + sg_limits sg_query_limits() + sg_pixelformat_info sg_query_pixelformat(sg_pixel_format fmt) + + --- if you need to call into the underlying 3D-API directly, you must call: + + sg_reset_state_cache() + + ...before calling sokol_gfx functions again + + --- you can inspect the original sg_desc structure handed to sg_setup() + by calling sg_query_desc(). This will return an sg_desc struct with + the default values patched in instead of any zero-initialized values + + --- you can inspect various internal resource attributes via: + + sg_buffer_info sg_query_buffer_info(sg_buffer buf) + sg_image_info sg_query_image_info(sg_image img) + sg_shader_info sg_query_shader_info(sg_shader shd) + sg_pipeline_info sg_query_pipeline_info(sg_pipeline pip) + sg_pass_info sg_query_pass_info(sg_pass pass) + + ...please note that the returned info-structs are tied quite closely + to sokol_gfx.h internals, and may change more often than other + public API functions and structs. + + --- you can ask at runtime what backend sokol_gfx.h has been compiled + for, or whether the GLES3 backend had to fall back to GLES2 with: + + sg_backend sg_query_backend(void) + + --- you can query the default resource creation parameters through the functions + + sg_buffer_desc sg_query_buffer_defaults(const sg_buffer_desc* desc) + sg_image_desc sg_query_image_defaults(const sg_image_desc* desc) + sg_shader_desc sg_query_shader_defaults(const sg_shader_desc* desc) + sg_pipeline_desc sg_query_pipeline_defaults(const sg_pipeline_desc* desc) + sg_pass_desc sg_query_pass_defaults(const sg_pass_desc* desc) + + These functions take a pointer to a desc structure which may contain + zero-initialized items for default values. These zero-init values + will be replaced with their concrete values in the returned desc + struct. + + ON INITIALIZATION: + ================== + When calling sg_setup(), a pointer to an sg_desc struct must be provided + which contains initialization options. These options provide two types + of information to sokol-gfx: + + (1) upper bounds and limits needed to allocate various internal + data structures: + - the max number of resources of each type that can + be alive at the same time, this is used for allocating + internal pools + - the max overall size of uniform data that can be + updated per frame, including a worst-case alignment + per uniform update (this worst-case alignment is 256 bytes) + - the max size of all dynamic resource updates (sg_update_buffer, + sg_append_buffer and sg_update_image) per frame + - the max number of entries in the texture sampler cache + (how many unique texture sampler can exist at the same time) + Not all of those limit values are used by all backends, but it is + good practice to provide them none-the-less. + + (2) 3D-API "context information" (sometimes also called "bindings"): + sokol_gfx.h doesn't create or initialize 3D API objects which are + closely related to the presentation layer (this includes the "rendering + device", the swapchain, and any objects which depend on the + swapchain). These API objects (or callback functions to obtain + them, if those objects might change between frames), must + be provided in a nested sg_context_desc struct inside the + sg_desc struct. If sokol_gfx.h is used together with + sokol_app.h, have a look at the sokol_glue.h header which provides + a convenience function to get a sg_context_desc struct filled out + with context information provided by sokol_app.h + + See the documention block of the sg_desc struct below for more information. + + + UNIFORM DATA LAYOUT: + ==================== + NOTE: if you use the sokol-shdc shader compiler tool, you don't need to worry + about the following details. + + The data that's passed into the sg_apply_uniforms() function must adhere to + specific layout rules so that the GPU shader finds the uniform block + items at the right offset. + + For the D3D11 and Metal backends, sokol-gfx only cares about the size of uniform + blocks, but not about the internal layout. The data will just be copied into + a uniform/constant buffer in a single operation and it's up you to arrange the + CPU-side layout so that it matches the GPU side layout. This also means that with + the D3D11 and Metal backends you are not limited to a 'cross-platform' subset + of uniform variable types. + + If you ever only use one of the D3D11, Metal *or* WebGPU backend, you can stop reading here. + + For the GL backends, the internal layout of uniform blocks matters though, + and you are limited to a small number of uniform variable types. This is + because sokol-gfx must be able to locate the uniform block members in order + to upload them to the GPU with glUniformXXX() calls. + + To describe the uniform block layout to sokol-gfx, the following information + must be passed to the sg_make_shader() call in the sg_shader_desc struct: + + - a hint about the used packing rule (either SG_UNIFORMLAYOUT_NATIVE or + SG_UNIFORMLAYOUT_STD140) + - a list of the uniform block members types in the correct order they + appear on the CPU side + + For example if the GLSL shader has the following uniform declarations: + + uniform mat4 mvp; + uniform vec2 offset0; + uniform vec2 offset1; + uniform vec2 offset2; + + ...and on the CPU side, there's a similar C struct: + + typedef struct { + float mvp[16]; + float offset0[2]; + float offset1[2]; + float offset2[2]; + } params_t; + + ...the uniform block description in the sg_shader_desc must look like this: + + sg_shader_desc desc = { + .vs.uniform_blocks[0] = { + .size = sizeof(params_t), + .layout = SG_UNIFORMLAYOUT_NATIVE, // this is the default and can be omitted + .uniforms = { + // order must be the same as in 'params_t': + [0] = { .name = "mvp", .type = SG_UNIFORMTYPE_MAT4 }, + [1] = { .name = "offset0", .type = SG_UNIFORMTYPE_VEC2 }, + [2] = { .name = "offset1", .type = SG_UNIFORMTYPE_VEC2 }, + [3] = { .name = "offset2", .type = SG_UNIFORMTYPE_VEC2 }, + } + } + }; + + With this information sokol-gfx can now compute the correct offsets of the data items + within the uniform block struct. + + The SG_UNIFORMLAYOUT_NATIVE packing rule works fine if only the GL backends are used, + but for proper D3D11/Metal/GL a subset of the std140 layout must be used which is + described in the next section: + + + CROSS-BACKEND COMMON UNIFORM DATA LAYOUT + ======================================== + For cross-platform / cross-3D-backend code it is important that the same uniform block + layout on the CPU side can be used for all sokol-gfx backends. To achieve this, + a common subset of the std140 layout must be used: + + - The uniform block layout hint in sg_shader_desc must be explicitely set to + SG_UNIFORMLAYOUT_STD140. + - Only the following GLSL uniform types can be used (with their associated sokol-gfx enums): + - float => SG_UNIFORMTYPE_FLOAT + - vec2 => SG_UNIFORMTYPE_FLOAT2 + - vec3 => SG_UNIFORMTYPE_FLOAT3 + - vec4 => SG_UNIFORMTYPE_FLOAT4 + - int => SG_UNIFORMTYPE_INT + - ivec2 => SG_UNIFORMTYPE_INT2 + - ivec3 => SG_UNIFORMTYPE_INT3 + - ivec4 => SG_UNIFORMTYPE_INT4 + - mat4 => SG_UNIFORMTYPE_MAT4 + - Alignment for those types must be as follows (in bytes): + - float => 4 + - vec2 => 8 + - vec3 => 16 + - vec4 => 16 + - int => 4 + - ivec2 => 8 + - ivec3 => 16 + - ivec4 => 16 + - mat4 => 16 + - Arrays are only allowed for the following types: vec4, int4, mat4. + + Note that the HLSL cbuffer layout rules are slightly different from the + std140 layout rules, this means that the cbuffer declarations in HLSL code + must be tweaked so that the layout is compatible with std140. + + The by far easiest way to tacke the common uniform block layout problem is + to use the sokol-shdc shader cross-compiler tool! + + + BACKEND-SPECIFIC TOPICS: + ======================== + --- The GL backends need to know about the internal structure of uniform + blocks, and the texture sampler-name and -type. The uniform layout details + are described in the UNIFORM DATA LAYOUT section above. + + // uniform block structure and texture image definition in sg_shader_desc: + sg_shader_desc desc = { + // uniform block description (size and internal structure) + .vs.uniform_blocks[0] = { + ... + }, + // one texture on the fragment-shader-stage, GLES2/WebGL needs name and image type + .fs.images[0] = { .name="tex", .type=SG_IMAGETYPE_ARRAY } + ... + }; + + --- the Metal and D3D11 backends only need to know the size of uniform blocks, + not their internal member structure, and they only need to know + the type of a texture sampler, not its name: + + sg_shader_desc desc = { + .vs.uniform_blocks[0].size = sizeof(params_t), + .fs.images[0].type = SG_IMAGETYPE_ARRAY, + ... + }; + + --- when creating a shader object, GLES2/WebGL need to know the vertex + attribute names as used in the vertex shader: + + sg_shader_desc desc = { + .attrs = { + [0] = { .name="position" }, + [1] = { .name="color1" } + } + }; + + The vertex attribute names provided when creating a shader will be + used later in sg_create_pipeline() for matching the vertex layout + to vertex shader inputs. + + --- on D3D11 you need to provide a semantic name and semantic index in the + shader description struct instead (see the D3D11 documentation on + D3D11_INPUT_ELEMENT_DESC for details): + + sg_shader_desc desc = { + .attrs = { + [0] = { .sem_name="POSITION", .sem_index=0 } + [1] = { .sem_name="COLOR", .sem_index=1 } + } + }; + + The provided semantic information will be used later in sg_create_pipeline() + to match the vertex layout to vertex shader inputs. + + --- on D3D11, and when passing HLSL source code (instead of byte code) to shader + creation, you can optionally define the shader model targets on the vertex + stage: + + sg_shader_Desc desc = { + .vs = { + ... + .d3d11_target = "vs_5_0" + }, + .fs = { + ... + .d3d11_target = "ps_5_0" + } + }; + + The default targets are "ps_4_0" and "fs_4_0". Note that those target names + are only used when compiling shaders from source. They are ignored when + creating a shader from bytecode. + + --- on Metal, GL 3.3 or GLES3/WebGL2, you don't need to provide an attribute + name or semantic name, since vertex attributes can be bound by their slot index + (this is mandatory in Metal, and optional in GL): + + sg_pipeline_desc desc = { + .layout = { + .attrs = { + [0] = { .format=SG_VERTEXFORMAT_FLOAT3 }, + [1] = { .format=SG_VERTEXFORMAT_FLOAT4 } + } + } + }; + + WORKING WITH CONTEXTS + ===================== + sokol-gfx allows to switch between different rendering contexts and + associate resource objects with contexts. This is useful to + create GL applications that render into multiple windows. + + A rendering context keeps track of all resources created while + the context is active. When the context is destroyed, all resources + "belonging to the context" are destroyed as well. + + A default context will be created and activated implicitly in + sg_setup(), and destroyed in sg_shutdown(). So for a typical application + which *doesn't* use multiple contexts, nothing changes, and calling + the context functions isn't necessary. + + Three functions have been added to work with contexts: + + --- sg_context sg_setup_context(): + This must be called once after a GL context has been created and + made active. + + --- void sg_activate_context(sg_context ctx) + This must be called after making a different GL context active. + Apart from 3D-API-specific actions, the call to sg_activate_context() + will internally call sg_reset_state_cache(). + + --- void sg_discard_context(sg_context ctx) + This must be called right before a GL context is destroyed and + will destroy all resources associated with the context (that + have been created while the context was active) The GL context must be + active at the time sg_discard_context(sg_context ctx) is called. + + Also note that resources (buffers, images, shaders and pipelines) must + only be used or destroyed while the same GL context is active that + was also active while the resource was created (an exception is + resource sharing on GL, such resources can be used while + another context is active, but must still be destroyed under + the same context that was active during creation). + + For more information, check out the multiwindow-glfw sample: + + https://github.com/floooh/sokol-samples/blob/master/glfw/multiwindow-glfw.c + + TRACE HOOKS: + ============ + sokol_gfx.h optionally allows to install "trace hook" callbacks for + each public API functions. When a public API function is called, and + a trace hook callback has been installed for this function, the + callback will be invoked with the parameters and result of the function. + This is useful for things like debugging- and profiling-tools, or + keeping track of resource creation and destruction. + + To use the trace hook feature: + + --- Define SOKOL_TRACE_HOOKS before including the implementation. + + --- Setup an sg_trace_hooks structure with your callback function + pointers (keep all function pointers you're not interested + in zero-initialized), optionally set the user_data member + in the sg_trace_hooks struct. + + --- Install the trace hooks by calling sg_install_trace_hooks(), + the return value of this function is another sg_trace_hooks + struct which contains the previously set of trace hooks. + You should keep this struct around, and call those previous + functions pointers from your own trace callbacks for proper + chaining. + + As an example of how trace hooks are used, have a look at the + imgui/sokol_gfx_imgui.h header which implements a realtime + debugging UI for sokol_gfx.h on top of Dear ImGui. + + A NOTE ON PORTABLE PACKED VERTEX FORMATS: + ========================================= + There are two things to consider when using packed + vertex formats like UBYTE4, SHORT2, etc which need to work + across all backends: + + - D3D11 can only convert *normalized* vertex formats to + floating point during vertex fetch, normalized formats + have a trailing 'N', and are "normalized" to a range + -1.0..+1.0 (for the signed formats) or 0.0..1.0 (for the + unsigned formats): + + - SG_VERTEXFORMAT_BYTE4N + - SG_VERTEXFORMAT_UBYTE4N + - SG_VERTEXFORMAT_SHORT2N + - SG_VERTEXFORMAT_USHORT2N + - SG_VERTEXFORMAT_SHORT4N + - SG_VERTEXFORMAT_USHORT4N + + D3D11 will not convert *non-normalized* vertex formats to floating point + vertex shader inputs, those can only be uses with the *ivecn* vertex shader + input types when D3D11 is used as backend (GL and Metal can use both formats) + + - SG_VERTEXFORMAT_BYTE4, + - SG_VERTEXFORMAT_UBYTE4 + - SG_VERTEXFORMAT_SHORT2 + - SG_VERTEXFORMAT_SHORT4 + + - WebGL/GLES2 cannot use integer vertex shader inputs (int or ivecn) + + - SG_VERTEXFORMAT_UINT10_N2 is not supported on WebGL/GLES2 + + So for a vertex input layout which works on all platforms, only use the following + vertex formats, and if needed "expand" the normalized vertex shader + inputs in the vertex shader by multiplying with 127.0, 255.0, 32767.0 or + 65535.0: + + - SG_VERTEXFORMAT_FLOAT, + - SG_VERTEXFORMAT_FLOAT2, + - SG_VERTEXFORMAT_FLOAT3, + - SG_VERTEXFORMAT_FLOAT4, + - SG_VERTEXFORMAT_BYTE4N, + - SG_VERTEXFORMAT_UBYTE4N, + - SG_VERTEXFORMAT_SHORT2N, + - SG_VERTEXFORMAT_USHORT2N + - SG_VERTEXFORMAT_SHORT4N, + - SG_VERTEXFORMAT_USHORT4N + + TODO: + ==== + - talk about asynchronous resource creation + + zlib/libpng license + + Copyright (c) 2018 Andre Weissflog + + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the + use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ +#define SOKOL_GFX_INCLUDED (1) +#include // size_t +#include +#include + +#if defined(SOKOL_API_DECL) && !defined(SOKOL_GFX_API_DECL) +#define SOKOL_GFX_API_DECL SOKOL_API_DECL +#endif +#ifndef SOKOL_GFX_API_DECL +#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_GFX_IMPL) +#define SOKOL_GFX_API_DECL __declspec(dllexport) +#elif defined(_WIN32) && defined(SOKOL_DLL) +#define SOKOL_GFX_API_DECL __declspec(dllimport) +#else +#define SOKOL_GFX_API_DECL extern +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + Resource id typedefs: + + sg_buffer: vertex- and index-buffers + sg_image: textures and render targets + sg_shader: vertex- and fragment-shaders, uniform blocks + sg_pipeline: associated shader and vertex-layouts, and render states + sg_pass: a bundle of render targets and actions on them + sg_context: a 'context handle' for switching between 3D-API contexts + + Instead of pointers, resource creation functions return a 32-bit + number which uniquely identifies the resource object. + + The 32-bit resource id is split into a 16-bit pool index in the lower bits, + and a 16-bit 'unique counter' in the upper bits. The index allows fast + pool lookups, and combined with the unique-mask it allows to detect + 'dangling accesses' (trying to use an object which no longer exists, and + its pool slot has been reused for a new object) + + The resource ids are wrapped into a struct so that the compiler + can complain when the wrong resource type is used. +*/ +typedef struct sg_buffer { uint32_t id; } sg_buffer; +typedef struct sg_image { uint32_t id; } sg_image; +typedef struct sg_shader { uint32_t id; } sg_shader; +typedef struct sg_pipeline { uint32_t id; } sg_pipeline; +typedef struct sg_pass { uint32_t id; } sg_pass; +typedef struct sg_context { uint32_t id; } sg_context; + +/* + sg_range is a pointer-size-pair struct used to pass memory blobs into + sokol-gfx. When initialized from a value type (array or struct), you can + use the SG_RANGE() macro to build an sg_range struct. For functions which + take either a sg_range pointer, or a (C++) sg_range reference, use the + SG_RANGE_REF macro as a solution which compiles both in C and C++. +*/ +typedef struct sg_range { + const void* ptr; + size_t size; +} sg_range; + +// disabling this for every includer isn't great, but the warnings are also quite pointless +#if defined(_MSC_VER) +#pragma warning(disable:4221) /* /W4 only: nonstandard extension used: 'x': cannot be initialized using address of automatic variable 'y' */ +#pragma warning(disable:4204) /* VS2015: nonstandard extension used: non-constant aggregate initializer */ +#endif +#if defined(__cplusplus) +#define SG_RANGE(x) sg_range{ &x, sizeof(x) } +#define SG_RANGE_REF(x) sg_range{ &x, sizeof(x) } +#else +#define SG_RANGE(x) (sg_range){ &x, sizeof(x) } +#define SG_RANGE_REF(x) &(sg_range){ &x, sizeof(x) } +#endif + +// various compile-time constants +enum { + SG_INVALID_ID = 0, + SG_NUM_SHADER_STAGES = 2, + SG_NUM_INFLIGHT_FRAMES = 2, + SG_MAX_COLOR_ATTACHMENTS = 4, + SG_MAX_SHADERSTAGE_BUFFERS = 8, + SG_MAX_SHADERSTAGE_IMAGES = 12, + SG_MAX_SHADERSTAGE_UBS = 4, + SG_MAX_UB_MEMBERS = 16, + SG_MAX_VERTEX_ATTRIBUTES = 16, /* NOTE: actual max vertex attrs can be less on GLES2, see sg_limits! */ + SG_MAX_MIPMAPS = 16, + SG_MAX_TEXTUREARRAY_LAYERS = 128 +}; + +/* + sg_color + + An RGBA color value. +*/ +typedef struct sg_color { float r, g, b, a; } sg_color; + +/* + sg_backend + + The active 3D-API backend, use the function sg_query_backend() + to get the currently active backend. + + NOTE that SG_BACKEND_GLES2 will be returned if sokol-gfx was + compiled with SOKOL_GLES3, but the runtime platform doesn't support + GLES3/WebGL2 and sokol-gfx had to fallback to GLES2/WebGL. +*/ +typedef enum sg_backend { + SG_BACKEND_GLCORE33, + SG_BACKEND_GLES2, + SG_BACKEND_GLES3, + SG_BACKEND_D3D11, + SG_BACKEND_METAL_IOS, + SG_BACKEND_METAL_MACOS, + SG_BACKEND_METAL_SIMULATOR, + SG_BACKEND_WGPU, + SG_BACKEND_DUMMY, +} sg_backend; + +/* + sg_pixel_format + + sokol_gfx.h basically uses the same pixel formats as WebGPU, since these + are supported on most newer GPUs. GLES2 and WebGL only supports a much + smaller subset of actually available pixel formats. Call + sg_query_pixelformat() to check at runtime if a pixel format supports the + desired features. + + A pixelformat name consist of three parts: + + - components (R, RG, RGB or RGBA) + - bit width per component (8, 16 or 32) + - component data type: + - unsigned normalized (no postfix) + - signed normalized (SN postfix) + - unsigned integer (UI postfix) + - signed integer (SI postfix) + - float (F postfix) + + Not all pixel formats can be used for everything, call sg_query_pixelformat() + to inspect the capabilities of a given pixelformat. The function returns + an sg_pixelformat_info struct with the following bool members: + + - sample: the pixelformat can be sampled as texture at least with + nearest filtering + - filter: the pixelformat can be samples as texture with linear + filtering + - render: the pixelformat can be used for render targets + - blend: blending is supported when using the pixelformat for + render targets + - msaa: multisample-antialiasing is supported when using the + pixelformat for render targets + - depth: the pixelformat can be used for depth-stencil attachments + + When targeting GLES2/WebGL, the only safe formats to use + as texture are SG_PIXELFORMAT_R8 and SG_PIXELFORMAT_RGBA8. For rendering + in GLES2/WebGL, only SG_PIXELFORMAT_RGBA8 is safe. All other formats + must be checked via sg_query_pixelformats(). + + The default pixel format for texture images is SG_PIXELFORMAT_RGBA8. + + The default pixel format for render target images is platform-dependent: + - for Metal and D3D11 it is SG_PIXELFORMAT_BGRA8 + - for GL backends it is SG_PIXELFORMAT_RGBA8 + + This is mainly because of the default framebuffer which is setup outside + of sokol_gfx.h. On some backends, using BGRA for the default frame buffer + allows more efficient frame flips. For your own offscreen-render-targets, + use whatever renderable pixel format is convenient for you. +*/ +typedef enum sg_pixel_format { + _SG_PIXELFORMAT_DEFAULT, /* value 0 reserved for default-init */ + SG_PIXELFORMAT_NONE, + + SG_PIXELFORMAT_R8, + SG_PIXELFORMAT_R8SN, + SG_PIXELFORMAT_R8UI, + SG_PIXELFORMAT_R8SI, + + SG_PIXELFORMAT_R16, + SG_PIXELFORMAT_R16SN, + SG_PIXELFORMAT_R16UI, + SG_PIXELFORMAT_R16SI, + SG_PIXELFORMAT_R16F, + SG_PIXELFORMAT_RG8, + SG_PIXELFORMAT_RG8SN, + SG_PIXELFORMAT_RG8UI, + SG_PIXELFORMAT_RG8SI, + + SG_PIXELFORMAT_R32UI, + SG_PIXELFORMAT_R32SI, + SG_PIXELFORMAT_R32F, + SG_PIXELFORMAT_RG16, + SG_PIXELFORMAT_RG16SN, + SG_PIXELFORMAT_RG16UI, + SG_PIXELFORMAT_RG16SI, + SG_PIXELFORMAT_RG16F, + SG_PIXELFORMAT_RGBA8, + SG_PIXELFORMAT_RGBA8SN, + SG_PIXELFORMAT_RGBA8UI, + SG_PIXELFORMAT_RGBA8SI, + SG_PIXELFORMAT_BGRA8, + SG_PIXELFORMAT_RGB10A2, + SG_PIXELFORMAT_RG11B10F, + + SG_PIXELFORMAT_RG32UI, + SG_PIXELFORMAT_RG32SI, + SG_PIXELFORMAT_RG32F, + SG_PIXELFORMAT_RGBA16, + SG_PIXELFORMAT_RGBA16SN, + SG_PIXELFORMAT_RGBA16UI, + SG_PIXELFORMAT_RGBA16SI, + SG_PIXELFORMAT_RGBA16F, + + SG_PIXELFORMAT_RGBA32UI, + SG_PIXELFORMAT_RGBA32SI, + SG_PIXELFORMAT_RGBA32F, + + SG_PIXELFORMAT_DEPTH, + SG_PIXELFORMAT_DEPTH_STENCIL, + + SG_PIXELFORMAT_BC1_RGBA, + SG_PIXELFORMAT_BC2_RGBA, + SG_PIXELFORMAT_BC3_RGBA, + SG_PIXELFORMAT_BC4_R, + SG_PIXELFORMAT_BC4_RSN, + SG_PIXELFORMAT_BC5_RG, + SG_PIXELFORMAT_BC5_RGSN, + SG_PIXELFORMAT_BC6H_RGBF, + SG_PIXELFORMAT_BC6H_RGBUF, + SG_PIXELFORMAT_BC7_RGBA, + SG_PIXELFORMAT_PVRTC_RGB_2BPP, + SG_PIXELFORMAT_PVRTC_RGB_4BPP, + SG_PIXELFORMAT_PVRTC_RGBA_2BPP, + SG_PIXELFORMAT_PVRTC_RGBA_4BPP, + SG_PIXELFORMAT_ETC2_RGB8, + SG_PIXELFORMAT_ETC2_RGB8A1, + SG_PIXELFORMAT_ETC2_RGBA8, + SG_PIXELFORMAT_ETC2_RG11, + SG_PIXELFORMAT_ETC2_RG11SN, + + _SG_PIXELFORMAT_NUM, + _SG_PIXELFORMAT_FORCE_U32 = 0x7FFFFFFF +} sg_pixel_format; + +/* + Runtime information about a pixel format, returned + by sg_query_pixelformat(). +*/ +typedef struct sg_pixelformat_info { + bool sample; // pixel format can be sampled in shaders + bool filter; // pixel format can be sampled with filtering + bool render; // pixel format can be used as render target + bool blend; // alpha-blending is supported + bool msaa; // pixel format can be used as MSAA render target + bool depth; // pixel format is a depth format + #if defined(SOKOL_ZIG_BINDINGS) + uint32_t __pad[3]; + #endif +} sg_pixelformat_info; + +/* + Runtime information about available optional features, + returned by sg_query_features() +*/ +typedef struct sg_features { + bool instancing; // hardware instancing supported + bool origin_top_left; // framebuffer and texture origin is in top left corner + bool multiple_render_targets; // offscreen render passes can have multiple render targets attached + bool msaa_render_targets; // offscreen render passes support MSAA antialiasing + bool imagetype_3d; // creation of SG_IMAGETYPE_3D images is supported + bool imagetype_array; // creation of SG_IMAGETYPE_ARRAY images is supported + bool image_clamp_to_border; // border color and clamp-to-border UV-wrap mode is supported + bool mrt_independent_blend_state; // multiple-render-target rendering can use per-render-target blend state + bool mrt_independent_write_mask; // multiple-render-target rendering can use per-render-target color write masks + #if defined(SOKOL_ZIG_BINDINGS) + uint32_t __pad[3]; + #endif +} sg_features; + +/* + Runtime information about resource limits, returned by sg_query_limit() +*/ +typedef struct sg_limits { + int max_image_size_2d; // max width/height of SG_IMAGETYPE_2D images + int max_image_size_cube; // max width/height of SG_IMAGETYPE_CUBE images + int max_image_size_3d; // max width/height/depth of SG_IMAGETYPE_3D images + int max_image_size_array; // max width/height of SG_IMAGETYPE_ARRAY images + int max_image_array_layers; // max number of layers in SG_IMAGETYPE_ARRAY images + int max_vertex_attrs; // <= SG_MAX_VERTEX_ATTRIBUTES or less (on some GLES2 impls) + int gl_max_vertex_uniform_vectors; // <= GL_MAX_VERTEX_UNIFORM_VECTORS (only on GL backends) +} sg_limits; + +/* + sg_resource_state + + The current state of a resource in its resource pool. + Resources start in the INITIAL state, which means the + pool slot is unoccupied and can be allocated. When a resource is + created, first an id is allocated, and the resource pool slot + is set to state ALLOC. After allocation, the resource is + initialized, which may result in the VALID or FAILED state. The + reason why allocation and initialization are separate is because + some resource types (e.g. buffers and images) might be asynchronously + initialized by the user application. If a resource which is not + in the VALID state is attempted to be used for rendering, rendering + operations will silently be dropped. + + The special INVALID state is returned in sg_query_xxx_state() if no + resource object exists for the provided resource id. +*/ +typedef enum sg_resource_state { + SG_RESOURCESTATE_INITIAL, + SG_RESOURCESTATE_ALLOC, + SG_RESOURCESTATE_VALID, + SG_RESOURCESTATE_FAILED, + SG_RESOURCESTATE_INVALID, + _SG_RESOURCESTATE_FORCE_U32 = 0x7FFFFFFF +} sg_resource_state; + +/* + sg_usage + + A resource usage hint describing the update strategy of + buffers and images. This is used in the sg_buffer_desc.usage + and sg_image_desc.usage members when creating buffers + and images: + + SG_USAGE_IMMUTABLE: the resource will never be updated with + new data, instead the content of the + resource must be provided on creation + SG_USAGE_DYNAMIC: the resource will be updated infrequently + with new data (this could range from "once + after creation", to "quite often but not + every frame") + SG_USAGE_STREAM: the resource will be updated each frame + with new content + + The rendering backends use this hint to prevent that the + CPU needs to wait for the GPU when attempting to update + a resource that might be currently accessed by the GPU. + + Resource content is updated with the functions sg_update_buffer() or + sg_append_buffer() for buffer objects, and sg_update_image() for image + objects. For the sg_update_*() functions, only one update is allowed per + frame and resource object, while sg_append_buffer() can be called + multiple times per frame on the same buffer. The application must update + all data required for rendering (this means that the update data can be + smaller than the resource size, if only a part of the overall resource + size is used for rendering, you only need to make sure that the data that + *is* used is valid). + + The default usage is SG_USAGE_IMMUTABLE. +*/ +typedef enum sg_usage { + _SG_USAGE_DEFAULT, /* value 0 reserved for default-init */ + SG_USAGE_IMMUTABLE, + SG_USAGE_DYNAMIC, + SG_USAGE_STREAM, + _SG_USAGE_NUM, + _SG_USAGE_FORCE_U32 = 0x7FFFFFFF +} sg_usage; + +/* + sg_buffer_type + + This indicates whether a buffer contains vertex- or index-data, + used in the sg_buffer_desc.type member when creating a buffer. + + The default value is SG_BUFFERTYPE_VERTEXBUFFER. +*/ +typedef enum sg_buffer_type { + _SG_BUFFERTYPE_DEFAULT, /* value 0 reserved for default-init */ + SG_BUFFERTYPE_VERTEXBUFFER, + SG_BUFFERTYPE_INDEXBUFFER, + _SG_BUFFERTYPE_NUM, + _SG_BUFFERTYPE_FORCE_U32 = 0x7FFFFFFF +} sg_buffer_type; + +/* + sg_index_type + + Indicates whether indexed rendering (fetching vertex-indices from an + index buffer) is used, and if yes, the index data type (16- or 32-bits). + This is used in the sg_pipeline_desc.index_type member when creating a + pipeline object. + + The default index type is SG_INDEXTYPE_NONE. +*/ +typedef enum sg_index_type { + _SG_INDEXTYPE_DEFAULT, /* value 0 reserved for default-init */ + SG_INDEXTYPE_NONE, + SG_INDEXTYPE_UINT16, + SG_INDEXTYPE_UINT32, + _SG_INDEXTYPE_NUM, + _SG_INDEXTYPE_FORCE_U32 = 0x7FFFFFFF +} sg_index_type; + +/* + sg_image_type + + Indicates the basic type of an image object (2D-texture, cubemap, + 3D-texture or 2D-array-texture). 3D- and array-textures are not supported + on the GLES2/WebGL backend (use sg_query_features().imagetype_3d and + sg_query_features().imagetype_array to check for support). The image type + is used in the sg_image_desc.type member when creating an image, and + in sg_shader_image_desc when describing a shader's texture sampler binding. + + The default image type when creating an image is SG_IMAGETYPE_2D. +*/ +typedef enum sg_image_type { + _SG_IMAGETYPE_DEFAULT, /* value 0 reserved for default-init */ + SG_IMAGETYPE_2D, + SG_IMAGETYPE_CUBE, + SG_IMAGETYPE_3D, + SG_IMAGETYPE_ARRAY, + _SG_IMAGETYPE_NUM, + _SG_IMAGETYPE_FORCE_U32 = 0x7FFFFFFF +} sg_image_type; + +/* + sg_sampler_type + + Indicates the basic data type of a shader's texture sampler which + can be float , unsigned integer or signed integer. The sampler + type is used in the sg_shader_image_desc to describe the + sampler type of a shader's texture sampler binding. + + The default sampler type is SG_SAMPLERTYPE_FLOAT. +*/ +typedef enum sg_sampler_type { + _SG_SAMPLERTYPE_DEFAULT, /* value 0 reserved for default-init */ + SG_SAMPLERTYPE_FLOAT, + SG_SAMPLERTYPE_SINT, + SG_SAMPLERTYPE_UINT, +} sg_sampler_type; + +/* + sg_cube_face + + The cubemap faces. Use these as indices in the sg_image_desc.content + array. +*/ +typedef enum sg_cube_face { + SG_CUBEFACE_POS_X, + SG_CUBEFACE_NEG_X, + SG_CUBEFACE_POS_Y, + SG_CUBEFACE_NEG_Y, + SG_CUBEFACE_POS_Z, + SG_CUBEFACE_NEG_Z, + SG_CUBEFACE_NUM, + _SG_CUBEFACE_FORCE_U32 = 0x7FFFFFFF +} sg_cube_face; + +/* + sg_shader_stage + + There are 2 shader stages: vertex- and fragment-shader-stage. + Each shader stage consists of: + + - one slot for a shader function (provided as source- or byte-code) + - SG_MAX_SHADERSTAGE_UBS slots for uniform blocks + - SG_MAX_SHADERSTAGE_IMAGES slots for images used as textures by + the shader function +*/ +typedef enum sg_shader_stage { + SG_SHADERSTAGE_VS, + SG_SHADERSTAGE_FS, + _SG_SHADERSTAGE_FORCE_U32 = 0x7FFFFFFF +} sg_shader_stage; + +/* + sg_primitive_type + + This is the common subset of 3D primitive types supported across all 3D + APIs. This is used in the sg_pipeline_desc.primitive_type member when + creating a pipeline object. + + The default primitive type is SG_PRIMITIVETYPE_TRIANGLES. +*/ +typedef enum sg_primitive_type { + _SG_PRIMITIVETYPE_DEFAULT, /* value 0 reserved for default-init */ + SG_PRIMITIVETYPE_POINTS, + SG_PRIMITIVETYPE_LINES, + SG_PRIMITIVETYPE_LINE_STRIP, + SG_PRIMITIVETYPE_TRIANGLES, + SG_PRIMITIVETYPE_TRIANGLE_STRIP, + _SG_PRIMITIVETYPE_NUM, + _SG_PRIMITIVETYPE_FORCE_U32 = 0x7FFFFFFF +} sg_primitive_type; + +/* + sg_filter + + The filtering mode when sampling a texture image. This is + used in the sg_image_desc.min_filter and sg_image_desc.mag_filter + members when creating an image object. + + The default filter mode is SG_FILTER_NEAREST. +*/ +typedef enum sg_filter { + _SG_FILTER_DEFAULT, /* value 0 reserved for default-init */ + SG_FILTER_NEAREST, + SG_FILTER_LINEAR, + SG_FILTER_NEAREST_MIPMAP_NEAREST, + SG_FILTER_NEAREST_MIPMAP_LINEAR, + SG_FILTER_LINEAR_MIPMAP_NEAREST, + SG_FILTER_LINEAR_MIPMAP_LINEAR, + _SG_FILTER_NUM, + _SG_FILTER_FORCE_U32 = 0x7FFFFFFF +} sg_filter; + +/* + sg_wrap + + The texture coordinates wrapping mode when sampling a texture + image. This is used in the sg_image_desc.wrap_u, .wrap_v + and .wrap_w members when creating an image. + + The default wrap mode is SG_WRAP_REPEAT. + + NOTE: SG_WRAP_CLAMP_TO_BORDER is not supported on all backends + and platforms. To check for support, call sg_query_features() + and check the "clamp_to_border" boolean in the returned + sg_features struct. + + Platforms which don't support SG_WRAP_CLAMP_TO_BORDER will silently fall back + to SG_WRAP_CLAMP_TO_EDGE without a validation error. + + Platforms which support clamp-to-border are: + + - all desktop GL platforms + - Metal on macOS + - D3D11 + + Platforms which do not support clamp-to-border: + + - GLES2/3 and WebGL/WebGL2 + - Metal on iOS +*/ +typedef enum sg_wrap { + _SG_WRAP_DEFAULT, /* value 0 reserved for default-init */ + SG_WRAP_REPEAT, + SG_WRAP_CLAMP_TO_EDGE, + SG_WRAP_CLAMP_TO_BORDER, + SG_WRAP_MIRRORED_REPEAT, + _SG_WRAP_NUM, + _SG_WRAP_FORCE_U32 = 0x7FFFFFFF +} sg_wrap; + +/* + sg_border_color + + The border color to use when sampling a texture, and the UV wrap + mode is SG_WRAP_CLAMP_TO_BORDER. + + The default border color is SG_BORDERCOLOR_OPAQUE_BLACK +*/ +typedef enum sg_border_color { + _SG_BORDERCOLOR_DEFAULT, /* value 0 reserved for default-init */ + SG_BORDERCOLOR_TRANSPARENT_BLACK, + SG_BORDERCOLOR_OPAQUE_BLACK, + SG_BORDERCOLOR_OPAQUE_WHITE, + _SG_BORDERCOLOR_NUM, + _SG_BORDERCOLOR_FORCE_U32 = 0x7FFFFFFF +} sg_border_color; + +/* + sg_vertex_format + + The data type of a vertex component. This is used to describe + the layout of vertex data when creating a pipeline object. +*/ +typedef enum sg_vertex_format { + SG_VERTEXFORMAT_INVALID, + SG_VERTEXFORMAT_FLOAT, + SG_VERTEXFORMAT_FLOAT2, + SG_VERTEXFORMAT_FLOAT3, + SG_VERTEXFORMAT_FLOAT4, + SG_VERTEXFORMAT_BYTE4, + SG_VERTEXFORMAT_BYTE4N, + SG_VERTEXFORMAT_UBYTE4, + SG_VERTEXFORMAT_UBYTE4N, + SG_VERTEXFORMAT_SHORT2, + SG_VERTEXFORMAT_SHORT2N, + SG_VERTEXFORMAT_USHORT2N, + SG_VERTEXFORMAT_SHORT4, + SG_VERTEXFORMAT_SHORT4N, + SG_VERTEXFORMAT_USHORT4N, + SG_VERTEXFORMAT_UINT10_N2, + _SG_VERTEXFORMAT_NUM, + _SG_VERTEXFORMAT_FORCE_U32 = 0x7FFFFFFF +} sg_vertex_format; + +/* + sg_vertex_step + + Defines whether the input pointer of a vertex input stream is advanced + 'per vertex' or 'per instance'. The default step-func is + SG_VERTEXSTEP_PER_VERTEX. SG_VERTEXSTEP_PER_INSTANCE is used with + instanced-rendering. + + The vertex-step is part of the vertex-layout definition + when creating pipeline objects. +*/ +typedef enum sg_vertex_step { + _SG_VERTEXSTEP_DEFAULT, /* value 0 reserved for default-init */ + SG_VERTEXSTEP_PER_VERTEX, + SG_VERTEXSTEP_PER_INSTANCE, + _SG_VERTEXSTEP_NUM, + _SG_VERTEXSTEP_FORCE_U32 = 0x7FFFFFFF +} sg_vertex_step; + +/* + sg_uniform_type + + The data type of a uniform block member. This is used to + describe the internal layout of uniform blocks when creating + a shader object. +*/ +typedef enum sg_uniform_type { + SG_UNIFORMTYPE_INVALID, + SG_UNIFORMTYPE_FLOAT, + SG_UNIFORMTYPE_FLOAT2, + SG_UNIFORMTYPE_FLOAT3, + SG_UNIFORMTYPE_FLOAT4, + SG_UNIFORMTYPE_INT, + SG_UNIFORMTYPE_INT2, + SG_UNIFORMTYPE_INT3, + SG_UNIFORMTYPE_INT4, + SG_UNIFORMTYPE_MAT4, + _SG_UNIFORMTYPE_NUM, + _SG_UNIFORMTYPE_FORCE_U32 = 0x7FFFFFFF +} sg_uniform_type; + +/* + sg_uniform_layout + + A hint for the interior memory layout of uniform blocks. This is + only really relevant for the GL backend where the internal layout + of uniform blocks must be known to sokol-gfx. For all other backends the + internal memory layout of uniform blocks doesn't matter, sokol-gfx + will just pass uniform data as a single memory blob to the + 3D backend. + + SG_UNIFORMLAYOUT_NATIVE (default) + Native layout means that a 'backend-native' memory layout + is used. For the GL backend this means that uniforms + are packed tightly in memory (e.g. there are no padding + bytes). + + SG_UNIFORMLAYOUT_STD140 + The memory layout is a subset of std140. Arrays are only + allowed for the FLOAT4, INT4 and MAT4. Alignment is as + is as follows: + + FLOAT, INT: 4 byte alignment + FLOAT2, INT2: 8 byte alignment + FLOAT3, INT3: 16 byte alignment(!) + FLOAT4, INT4: 16 byte alignment + MAT4: 16 byte alignment + FLOAT4[], INT4[]: 16 byte alignment + + The overall size of the uniform block must be a multiple + of 16. + + For more information search for 'UNIFORM DATA LAYOUT' in the documentation block + at the start of the header. +*/ +typedef enum sg_uniform_layout { + _SG_UNIFORMLAYOUT_DEFAULT, /* value 0 reserved for default-init */ + SG_UNIFORMLAYOUT_NATIVE, /* default: layout depends on currently active backend */ + SG_UNIFORMLAYOUT_STD140, /* std140: memory layout according to std140 */ + _SG_UNIFORMLAYOUT_NUM, + _SG_UNIFORMLAYOUT_FORCE_U32 = 0x7FFFFFFF +} sg_uniform_layout; + +/* + sg_cull_mode + + The face-culling mode, this is used in the + sg_pipeline_desc.cull_mode member when creating a + pipeline object. + + The default cull mode is SG_CULLMODE_NONE +*/ +typedef enum sg_cull_mode { + _SG_CULLMODE_DEFAULT, /* value 0 reserved for default-init */ + SG_CULLMODE_NONE, + SG_CULLMODE_FRONT, + SG_CULLMODE_BACK, + _SG_CULLMODE_NUM, + _SG_CULLMODE_FORCE_U32 = 0x7FFFFFFF +} sg_cull_mode; + +/* + sg_face_winding + + The vertex-winding rule that determines a front-facing primitive. This + is used in the member sg_pipeline_desc.face_winding + when creating a pipeline object. + + The default winding is SG_FACEWINDING_CW (clockwise) +*/ +typedef enum sg_face_winding { + _SG_FACEWINDING_DEFAULT, /* value 0 reserved for default-init */ + SG_FACEWINDING_CCW, + SG_FACEWINDING_CW, + _SG_FACEWINDING_NUM, + _SG_FACEWINDING_FORCE_U32 = 0x7FFFFFFF +} sg_face_winding; + +/* + sg_compare_func + + The compare-function for depth- and stencil-ref tests. + This is used when creating pipeline objects in the members: + + sg_pipeline_desc + .depth + .compare + .stencil + .front.compare + .back.compar + + The default compare func for depth- and stencil-tests is + SG_COMPAREFUNC_ALWAYS. +*/ +typedef enum sg_compare_func { + _SG_COMPAREFUNC_DEFAULT, /* value 0 reserved for default-init */ + SG_COMPAREFUNC_NEVER, + SG_COMPAREFUNC_LESS, + SG_COMPAREFUNC_EQUAL, + SG_COMPAREFUNC_LESS_EQUAL, + SG_COMPAREFUNC_GREATER, + SG_COMPAREFUNC_NOT_EQUAL, + SG_COMPAREFUNC_GREATER_EQUAL, + SG_COMPAREFUNC_ALWAYS, + _SG_COMPAREFUNC_NUM, + _SG_COMPAREFUNC_FORCE_U32 = 0x7FFFFFFF +} sg_compare_func; + +/* + sg_stencil_op + + The operation performed on a currently stored stencil-value when a + comparison test passes or fails. This is used when creating a pipeline + object in the members: + + sg_pipeline_desc + .stencil + .front + .fail_op + .depth_fail_op + .pass_op + .back + .fail_op + .depth_fail_op + .pass_op + + The default value is SG_STENCILOP_KEEP. +*/ +typedef enum sg_stencil_op { + _SG_STENCILOP_DEFAULT, /* value 0 reserved for default-init */ + SG_STENCILOP_KEEP, + SG_STENCILOP_ZERO, + SG_STENCILOP_REPLACE, + SG_STENCILOP_INCR_CLAMP, + SG_STENCILOP_DECR_CLAMP, + SG_STENCILOP_INVERT, + SG_STENCILOP_INCR_WRAP, + SG_STENCILOP_DECR_WRAP, + _SG_STENCILOP_NUM, + _SG_STENCILOP_FORCE_U32 = 0x7FFFFFFF +} sg_stencil_op; + +/* + sg_blend_factor + + The source and destination factors in blending operations. + This is used in the following members when creating a pipeline object: + + sg_pipeline_desc + .colors[i] + .blend + .src_factor_rgb + .dst_factor_rgb + .src_factor_alpha + .dst_factor_alpha + + The default value is SG_BLENDFACTOR_ONE for source + factors, and SG_BLENDFACTOR_ZERO for destination factors. +*/ +typedef enum sg_blend_factor { + _SG_BLENDFACTOR_DEFAULT, /* value 0 reserved for default-init */ + SG_BLENDFACTOR_ZERO, + SG_BLENDFACTOR_ONE, + SG_BLENDFACTOR_SRC_COLOR, + SG_BLENDFACTOR_ONE_MINUS_SRC_COLOR, + SG_BLENDFACTOR_SRC_ALPHA, + SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, + SG_BLENDFACTOR_DST_COLOR, + SG_BLENDFACTOR_ONE_MINUS_DST_COLOR, + SG_BLENDFACTOR_DST_ALPHA, + SG_BLENDFACTOR_ONE_MINUS_DST_ALPHA, + SG_BLENDFACTOR_SRC_ALPHA_SATURATED, + SG_BLENDFACTOR_BLEND_COLOR, + SG_BLENDFACTOR_ONE_MINUS_BLEND_COLOR, + SG_BLENDFACTOR_BLEND_ALPHA, + SG_BLENDFACTOR_ONE_MINUS_BLEND_ALPHA, + _SG_BLENDFACTOR_NUM, + _SG_BLENDFACTOR_FORCE_U32 = 0x7FFFFFFF +} sg_blend_factor; + +/* + sg_blend_op + + Describes how the source and destination values are combined in the + fragment blending operation. It is used in the following members when + creating a pipeline object: + + sg_pipeline_desc + .colors[i] + .blend + .op_rgb + .op_alpha + + The default value is SG_BLENDOP_ADD. +*/ +typedef enum sg_blend_op { + _SG_BLENDOP_DEFAULT, /* value 0 reserved for default-init */ + SG_BLENDOP_ADD, + SG_BLENDOP_SUBTRACT, + SG_BLENDOP_REVERSE_SUBTRACT, + _SG_BLENDOP_NUM, + _SG_BLENDOP_FORCE_U32 = 0x7FFFFFFF +} sg_blend_op; + +/* + sg_color_mask + + Selects the active color channels when writing a fragment color to the + framebuffer. This is used in the members + sg_pipeline_desc.colors[i].write_mask when creating a pipeline object. + + The default colormask is SG_COLORMASK_RGBA (write all colors channels) + + NOTE: since the color mask value 0 is reserved for the default value + (SG_COLORMASK_RGBA), use SG_COLORMASK_NONE if all color channels + should be disabled. +*/ +typedef enum sg_color_mask { + _SG_COLORMASK_DEFAULT = 0, /* value 0 reserved for default-init */ + SG_COLORMASK_NONE = 0x10, /* special value for 'all channels disabled */ + SG_COLORMASK_R = 0x1, + SG_COLORMASK_G = 0x2, + SG_COLORMASK_RG = 0x3, + SG_COLORMASK_B = 0x4, + SG_COLORMASK_RB = 0x5, + SG_COLORMASK_GB = 0x6, + SG_COLORMASK_RGB = 0x7, + SG_COLORMASK_A = 0x8, + SG_COLORMASK_RA = 0x9, + SG_COLORMASK_GA = 0xA, + SG_COLORMASK_RGA = 0xB, + SG_COLORMASK_BA = 0xC, + SG_COLORMASK_RBA = 0xD, + SG_COLORMASK_GBA = 0xE, + SG_COLORMASK_RGBA = 0xF, + _SG_COLORMASK_FORCE_U32 = 0x7FFFFFFF +} sg_color_mask; + +/* + sg_action + + Defines what action should be performed at the start of a render pass: + + SG_ACTION_CLEAR: clear the render target image + SG_ACTION_LOAD: load the previous content of the render target image + SG_ACTION_DONTCARE: leave the render target image content undefined + + This is used in the sg_pass_action structure. + + The default action for all pass attachments is SG_ACTION_CLEAR, with the + clear color rgba = {0.5f, 0.5f, 0.5f, 1.0f], depth=1.0 and stencil=0. + + If you want to override the default behaviour, it is important to not + only set the clear color, but the 'action' field as well (as long as this + is in its _SG_ACTION_DEFAULT, the value fields will be ignored). +*/ +typedef enum sg_action { + _SG_ACTION_DEFAULT, + SG_ACTION_CLEAR, + SG_ACTION_LOAD, + SG_ACTION_DONTCARE, + _SG_ACTION_NUM, + _SG_ACTION_FORCE_U32 = 0x7FFFFFFF +} sg_action; + +/* + sg_pass_action + + The sg_pass_action struct defines the actions to be performed + at the start of a rendering pass in the functions sg_begin_pass() + and sg_begin_default_pass(). + + A separate action and clear values can be defined for each + color attachment, and for the depth-stencil attachment. + + The default clear values are defined by the macros: + + - SG_DEFAULT_CLEAR_RED: 0.5f + - SG_DEFAULT_CLEAR_GREEN: 0.5f + - SG_DEFAULT_CLEAR_BLUE: 0.5f + - SG_DEFAULT_CLEAR_ALPHA: 1.0f + - SG_DEFAULT_CLEAR_DEPTH: 1.0f + - SG_DEFAULT_CLEAR_STENCIL: 0 +*/ +typedef struct sg_color_attachment_action { + sg_action action; + sg_color value; +} sg_color_attachment_action; + +typedef struct sg_depth_attachment_action { + sg_action action; + float value; +} sg_depth_attachment_action; + +typedef struct sg_stencil_attachment_action { + sg_action action; + uint8_t value; +} sg_stencil_attachment_action; + +typedef struct sg_pass_action { + uint32_t _start_canary; + sg_color_attachment_action colors[SG_MAX_COLOR_ATTACHMENTS]; + sg_depth_attachment_action depth; + sg_stencil_attachment_action stencil; + uint32_t _end_canary; +} sg_pass_action; + +/* + sg_bindings + + The sg_bindings structure defines the resource binding slots + of the sokol_gfx render pipeline, used as argument to the + sg_apply_bindings() function. + + A resource binding struct contains: + + - 1..N vertex buffers + - 0..N vertex buffer offsets + - 0..1 index buffers + - 0..1 index buffer offsets + - 0..N vertex shader stage images + - 0..N fragment shader stage images + + The max number of vertex buffer and shader stage images + are defined by the SG_MAX_SHADERSTAGE_BUFFERS and + SG_MAX_SHADERSTAGE_IMAGES configuration constants. + + The optional buffer offsets can be used to put different unrelated + chunks of vertex- and/or index-data into the same buffer objects. +*/ +typedef struct sg_bindings { + uint32_t _start_canary; + sg_buffer vertex_buffers[SG_MAX_SHADERSTAGE_BUFFERS]; + int vertex_buffer_offsets[SG_MAX_SHADERSTAGE_BUFFERS]; + sg_buffer index_buffer; + int index_buffer_offset; + sg_image vs_images[SG_MAX_SHADERSTAGE_IMAGES]; + sg_image fs_images[SG_MAX_SHADERSTAGE_IMAGES]; + uint32_t _end_canary; +} sg_bindings; + +/* + sg_buffer_desc + + Creation parameters for sg_buffer objects, used in the + sg_make_buffer() call. + + The default configuration is: + + .size: 0 (*must* be >0 for buffers without data) + .type: SG_BUFFERTYPE_VERTEXBUFFER + .usage: SG_USAGE_IMMUTABLE + .data.ptr 0 (*must* be valid for immutable buffers) + .data.size 0 (*must* be > 0 for immutable buffers) + .label 0 (optional string label for trace hooks) + + The label will be ignored by sokol_gfx.h, it is only useful + when hooking into sg_make_buffer() or sg_init_buffer() via + the sg_install_trace_hooks() function. + + For immutable buffers which are initialized with initial data, + keep the .size item zero-initialized, and set the size together with the + pointer to the initial data in the .data item. + + For mutable buffers without initial data, keep the .data item + zero-initialized, and set the buffer size in the .size item instead. + + You can also set both size values, but currently both size values must + be identical (this may change in the future when the dynamic resource + management may become more flexible). + + ADVANCED TOPIC: Injecting native 3D-API buffers: + + The following struct members allow to inject your own GL, Metal + or D3D11 buffers into sokol_gfx: + + .gl_buffers[SG_NUM_INFLIGHT_FRAMES] + .mtl_buffers[SG_NUM_INFLIGHT_FRAMES] + .d3d11_buffer + + You must still provide all other struct items except the .data item, and + these must match the creation parameters of the native buffers you + provide. For SG_USAGE_IMMUTABLE, only provide a single native 3D-API + buffer, otherwise you need to provide SG_NUM_INFLIGHT_FRAMES buffers + (only for GL and Metal, not D3D11). Providing multiple buffers for GL and + Metal is necessary because sokol_gfx will rotate through them when + calling sg_update_buffer() to prevent lock-stalls. + + Note that it is expected that immutable injected buffer have already been + initialized with content, and the .content member must be 0! + + Also you need to call sg_reset_state_cache() after calling native 3D-API + functions, and before calling any sokol_gfx function. +*/ +typedef struct sg_buffer_desc { + uint32_t _start_canary; + size_t size; + sg_buffer_type type; + sg_usage usage; + sg_range data; + const char* label; + /* GL specific */ + uint32_t gl_buffers[SG_NUM_INFLIGHT_FRAMES]; + /* Metal specific */ + const void* mtl_buffers[SG_NUM_INFLIGHT_FRAMES]; + /* D3D11 specific */ + const void* d3d11_buffer; + /* WebGPU specific */ + const void* wgpu_buffer; + uint32_t _end_canary; +} sg_buffer_desc; + +/* + sg_image_data + + Defines the content of an image through a 2D array of sg_range structs. + The first array dimension is the cubemap face, and the second array + dimension the mipmap level. +*/ +typedef struct sg_image_data { + sg_range subimage[SG_CUBEFACE_NUM][SG_MAX_MIPMAPS]; +} sg_image_data; + +/* + sg_image_desc + + Creation parameters for sg_image objects, used in the sg_make_image() + call. + + The default configuration is: + + .type: SG_IMAGETYPE_2D + .render_target: false + .width 0 (must be set to >0) + .height 0 (must be set to >0) + .num_slices 1 (3D textures: depth; array textures: number of layers) + .num_mipmaps: 1 + .usage: SG_USAGE_IMMUTABLE + .pixel_format: SG_PIXELFORMAT_RGBA8 for textures, or sg_desc.context.color_format for render targets + .sample_count: 1 for textures, or sg_desc.context.sample_count for render targets + .min_filter: SG_FILTER_NEAREST + .mag_filter: SG_FILTER_NEAREST + .wrap_u: SG_WRAP_REPEAT + .wrap_v: SG_WRAP_REPEAT + .wrap_w: SG_WRAP_REPEAT (only SG_IMAGETYPE_3D) + .border_color SG_BORDERCOLOR_OPAQUE_BLACK + .max_anisotropy 1 (must be 1..16) + .min_lod 0.0f + .max_lod FLT_MAX + .data an sg_image_data struct to define the initial content + .label 0 (optional string label for trace hooks) + + Q: Why is the default sample_count for render targets identical with the + "default sample count" from sg_desc.context.sample_count? + + A: So that it matches the default sample count in pipeline objects. Even + though it is a bit strange/confusing that offscreen render targets by default + get the same sample count as the default framebuffer, but it's better that + an offscreen render target created with default parameters matches + a pipeline object created with default parameters. + + NOTE: + + SG_IMAGETYPE_ARRAY and SG_IMAGETYPE_3D are not supported on WebGL/GLES2, + use sg_query_features().imagetype_array and + sg_query_features().imagetype_3d at runtime to check if array- and + 3D-textures are supported. + + Images with usage SG_USAGE_IMMUTABLE must be fully initialized by + providing a valid .data member which points to initialization data. + + ADVANCED TOPIC: Injecting native 3D-API textures: + + The following struct members allow to inject your own GL, Metal or D3D11 + textures into sokol_gfx: + + .gl_textures[SG_NUM_INFLIGHT_FRAMES] + .mtl_textures[SG_NUM_INFLIGHT_FRAMES] + .d3d11_texture + .d3d11_shader_resource_view + + For GL, you can also specify the texture target or leave it empty to use + the default texture target for the image type (GL_TEXTURE_2D for + SG_IMAGETYPE_2D etc) + + For D3D11, you can provide either a D3D11 texture, or a + shader-resource-view, or both. If only a texture is provided, a matching + shader-resource-view will be created. If only a shader-resource-view is + provided, the texture will be looked up from the shader-resource-view. + + The same rules apply as for injecting native buffers (see sg_buffer_desc + documentation for more details). +*/ +typedef struct sg_image_desc { + uint32_t _start_canary; + sg_image_type type; + bool render_target; + int width; + int height; + int num_slices; + int num_mipmaps; + sg_usage usage; + sg_pixel_format pixel_format; + int sample_count; + sg_filter min_filter; + sg_filter mag_filter; + sg_wrap wrap_u; + sg_wrap wrap_v; + sg_wrap wrap_w; + sg_border_color border_color; + uint32_t max_anisotropy; + float min_lod; + float max_lod; + sg_image_data data; + const char* label; + /* GL specific */ + uint32_t gl_textures[SG_NUM_INFLIGHT_FRAMES]; + uint32_t gl_texture_target; + /* Metal specific */ + const void* mtl_textures[SG_NUM_INFLIGHT_FRAMES]; + /* D3D11 specific */ + const void* d3d11_texture; + const void* d3d11_shader_resource_view; + /* WebGPU specific */ + const void* wgpu_texture; + uint32_t _end_canary; +} sg_image_desc; + +/* + sg_shader_desc + + The structure sg_shader_desc defines all creation parameters for shader + programs, used as input to the sg_make_shader() function: + + - reflection information for vertex attributes (vertex shader inputs): + - vertex attribute name (required for GLES2, optional for GLES3 and GL) + - a semantic name and index (required for D3D11) + - for each shader-stage (vertex and fragment): + - the shader source or bytecode + - an optional entry function name + - an optional compile target (only for D3D11 when source is provided, + defaults are "vs_4_0" and "ps_4_0") + - reflection info for each uniform block used by the shader stage: + - the size of the uniform block in bytes + - a memory layout hint (native vs std140, only required for GL backends) + - reflection info for each uniform block member (only required for GL backends): + - member name + - member type (SG_UNIFORMTYPE_xxx) + - if the member is an array, the number of array items + - reflection info for the texture images used by the shader stage: + - the image type (SG_IMAGETYPE_xxx) + - the sampler type (SG_SAMPLERTYPE_xxx, default is SG_SAMPLERTYPE_FLOAT) + - the name of the texture sampler (required for GLES2, optional everywhere else) + + For all GL backends, shader source-code must be provided. For D3D11 and Metal, + either shader source-code or byte-code can be provided. + + For D3D11, if source code is provided, the d3dcompiler_47.dll will be loaded + on demand. If this fails, shader creation will fail. When compiling HLSL + source code, you can provide an optional target string via + sg_shader_stage_desc.d3d11_target, the default target is "vs_4_0" for the + vertex shader stage and "ps_4_0" for the pixel shader stage. +*/ +typedef struct sg_shader_attr_desc { + const char* name; // GLSL vertex attribute name (only strictly required for GLES2) + const char* sem_name; // HLSL semantic name + int sem_index; // HLSL semantic index +} sg_shader_attr_desc; + +typedef struct sg_shader_uniform_desc { + const char* name; + sg_uniform_type type; + int array_count; +} sg_shader_uniform_desc; + +typedef struct sg_shader_uniform_block_desc { + size_t size; + sg_uniform_layout layout; + sg_shader_uniform_desc uniforms[SG_MAX_UB_MEMBERS]; +} sg_shader_uniform_block_desc; + +typedef struct sg_shader_image_desc { + const char* name; + sg_image_type image_type; + sg_sampler_type sampler_type; +} sg_shader_image_desc; + +typedef struct sg_shader_stage_desc { + const char* source; + sg_range bytecode; + const char* entry; + const char* d3d11_target; + sg_shader_uniform_block_desc uniform_blocks[SG_MAX_SHADERSTAGE_UBS]; + sg_shader_image_desc images[SG_MAX_SHADERSTAGE_IMAGES]; +} sg_shader_stage_desc; + +typedef struct sg_shader_desc { + uint32_t _start_canary; + sg_shader_attr_desc attrs[SG_MAX_VERTEX_ATTRIBUTES]; + sg_shader_stage_desc vs; + sg_shader_stage_desc fs; + const char* label; + uint32_t _end_canary; +} sg_shader_desc; + +/* + sg_pipeline_desc + + The sg_pipeline_desc struct defines all creation parameters for an + sg_pipeline object, used as argument to the sg_make_pipeline() function: + + - the vertex layout for all input vertex buffers + - a shader object + - the 3D primitive type (points, lines, triangles, ...) + - the index type (none, 16- or 32-bit) + - all the fixed-function-pipeline state (depth-, stencil-, blend-state, etc...) + + If the vertex data has no gaps between vertex components, you can omit + the .layout.buffers[].stride and layout.attrs[].offset items (leave them + default-initialized to 0), sokol-gfx will then compute the offsets and + strides from the vertex component formats (.layout.attrs[].format). + Please note that ALL vertex attribute offsets must be 0 in order for the + automatic offset computation to kick in. + + The default configuration is as follows: + + .shader: 0 (must be initialized with a valid sg_shader id!) + .layout: + .buffers[]: vertex buffer layouts + .stride: 0 (if no stride is given it will be computed) + .step_func SG_VERTEXSTEP_PER_VERTEX + .step_rate 1 + .attrs[]: vertex attribute declarations + .buffer_index 0 the vertex buffer bind slot + .offset 0 (offsets can be omitted if the vertex layout has no gaps) + .format SG_VERTEXFORMAT_INVALID (must be initialized!) + .depth: + .pixel_format: sg_desc.context.depth_format + .compare: SG_COMPAREFUNC_ALWAYS + .write_enabled: false + .bias: 0.0f + .bias_slope_scale: 0.0f + .bias_clamp: 0.0f + .stencil: + .enabled: false + .front/back: + .compare: SG_COMPAREFUNC_ALWAYS + .depth_fail_op: SG_STENCILOP_KEEP + .pass_op: SG_STENCILOP_KEEP + .compare: SG_COMPAREFUNC_ALWAYS + .read_mask: 0 + .write_mask: 0 + .ref: 0 + .color_count 1 + .colors[0..color_count] + .pixel_format sg_desc.context.color_format + .write_mask: SG_COLORMASK_RGBA + .blend: + .enabled: false + .src_factor_rgb: SG_BLENDFACTOR_ONE + .dst_factor_rgb: SG_BLENDFACTOR_ZERO + .op_rgb: SG_BLENDOP_ADD + .src_factor_alpha: SG_BLENDFACTOR_ONE + .dst_factor_alpha: SG_BLENDFACTOR_ZERO + .op_alpha: SG_BLENDOP_ADD + .primitive_type: SG_PRIMITIVETYPE_TRIANGLES + .index_type: SG_INDEXTYPE_NONE + .cull_mode: SG_CULLMODE_NONE + .face_winding: SG_FACEWINDING_CW + .sample_count: sg_desc.context.sample_count + .blend_color: (sg_color) { 0.0f, 0.0f, 0.0f, 0.0f } + .alpha_to_coverage_enabled: false + .label 0 (optional string label for trace hooks) +*/ +typedef struct sg_buffer_layout_desc { + int stride; + sg_vertex_step step_func; + int step_rate; + #if defined(SOKOL_ZIG_BINDINGS) + uint32_t __pad[2]; + #endif +} sg_buffer_layout_desc; + +typedef struct sg_vertex_attr_desc { + int buffer_index; + int offset; + sg_vertex_format format; + #if defined(SOKOL_ZIG_BINDINGS) + uint32_t __pad[2]; + #endif +} sg_vertex_attr_desc; + +typedef struct sg_layout_desc { + sg_buffer_layout_desc buffers[SG_MAX_SHADERSTAGE_BUFFERS]; + sg_vertex_attr_desc attrs[SG_MAX_VERTEX_ATTRIBUTES]; +} sg_layout_desc; + +typedef struct sg_stencil_face_state { + sg_compare_func compare; + sg_stencil_op fail_op; + sg_stencil_op depth_fail_op; + sg_stencil_op pass_op; +} sg_stencil_face_state; + +typedef struct sg_stencil_state { + bool enabled; + sg_stencil_face_state front; + sg_stencil_face_state back; + uint8_t read_mask; + uint8_t write_mask; + uint8_t ref; +} sg_stencil_state; + +typedef struct sg_depth_state { + sg_pixel_format pixel_format; + sg_compare_func compare; + bool write_enabled; + float bias; + float bias_slope_scale; + float bias_clamp; +} sg_depth_state; + +typedef struct sg_blend_state { + bool enabled; + sg_blend_factor src_factor_rgb; + sg_blend_factor dst_factor_rgb; + sg_blend_op op_rgb; + sg_blend_factor src_factor_alpha; + sg_blend_factor dst_factor_alpha; + sg_blend_op op_alpha; +} sg_blend_state; + +typedef struct sg_color_state { + sg_pixel_format pixel_format; + sg_color_mask write_mask; + sg_blend_state blend; +} sg_color_state; + +typedef struct sg_pipeline_desc { + uint32_t _start_canary; + sg_shader shader; + sg_layout_desc layout; + sg_depth_state depth; + sg_stencil_state stencil; + int color_count; + sg_color_state colors[SG_MAX_COLOR_ATTACHMENTS]; + sg_primitive_type primitive_type; + sg_index_type index_type; + sg_cull_mode cull_mode; + sg_face_winding face_winding; + int sample_count; + sg_color blend_color; + bool alpha_to_coverage_enabled; + const char* label; + uint32_t _end_canary; +} sg_pipeline_desc; + +/* + sg_pass_desc + + Creation parameters for an sg_pass object, used as argument + to the sg_make_pass() function. + + A pass object contains 1..4 color-attachments and none, or one, + depth-stencil-attachment. Each attachment consists of + an image, and two additional indices describing + which subimage the pass will render to: one mipmap index, and + if the image is a cubemap, array-texture or 3D-texture, the + face-index, array-layer or depth-slice. + + Pass images must fulfill the following requirements: + + All images must have: + - been created as render target (sg_image_desc.render_target = true) + - the same size + - the same sample count + + In addition, all color-attachment images must have the same pixel format. +*/ +typedef struct sg_pass_attachment_desc { + sg_image image; + int mip_level; + int slice; /* cube texture: face; array texture: layer; 3D texture: slice */ +} sg_pass_attachment_desc; + +typedef struct sg_pass_desc { + uint32_t _start_canary; + sg_pass_attachment_desc color_attachments[SG_MAX_COLOR_ATTACHMENTS]; + sg_pass_attachment_desc depth_stencil_attachment; + const char* label; + uint32_t _end_canary; +} sg_pass_desc; + +/* + sg_trace_hooks + + Installable callback functions to keep track of the sokol-gfx calls, + this is useful for debugging, or keeping track of resource creation + and destruction. + + Trace hooks are installed with sg_install_trace_hooks(), this returns + another sg_trace_hooks struct with the previous set of + trace hook function pointers. These should be invoked by the + new trace hooks to form a proper call chain. +*/ +typedef struct sg_trace_hooks { + void* user_data; + void (*reset_state_cache)(void* user_data); + void (*make_buffer)(const sg_buffer_desc* desc, sg_buffer result, void* user_data); + void (*make_image)(const sg_image_desc* desc, sg_image result, void* user_data); + void (*make_shader)(const sg_shader_desc* desc, sg_shader result, void* user_data); + void (*make_pipeline)(const sg_pipeline_desc* desc, sg_pipeline result, void* user_data); + void (*make_pass)(const sg_pass_desc* desc, sg_pass result, void* user_data); + void (*destroy_buffer)(sg_buffer buf, void* user_data); + void (*destroy_image)(sg_image img, void* user_data); + void (*destroy_shader)(sg_shader shd, void* user_data); + void (*destroy_pipeline)(sg_pipeline pip, void* user_data); + void (*destroy_pass)(sg_pass pass, void* user_data); + void (*update_buffer)(sg_buffer buf, const sg_range* data, void* user_data); + void (*update_image)(sg_image img, const sg_image_data* data, void* user_data); + void (*append_buffer)(sg_buffer buf, const sg_range* data, int result, void* user_data); + void (*begin_default_pass)(const sg_pass_action* pass_action, int width, int height, void* user_data); + void (*begin_pass)(sg_pass pass, const sg_pass_action* pass_action, void* user_data); + void (*apply_viewport)(int x, int y, int width, int height, bool origin_top_left, void* user_data); + void (*apply_scissor_rect)(int x, int y, int width, int height, bool origin_top_left, void* user_data); + void (*apply_pipeline)(sg_pipeline pip, void* user_data); + void (*apply_bindings)(const sg_bindings* bindings, void* user_data); + void (*apply_uniforms)(sg_shader_stage stage, int ub_index, const sg_range* data, void* user_data); + void (*draw)(int base_element, int num_elements, int num_instances, void* user_data); + void (*end_pass)(void* user_data); + void (*commit)(void* user_data); + void (*alloc_buffer)(sg_buffer result, void* user_data); + void (*alloc_image)(sg_image result, void* user_data); + void (*alloc_shader)(sg_shader result, void* user_data); + void (*alloc_pipeline)(sg_pipeline result, void* user_data); + void (*alloc_pass)(sg_pass result, void* user_data); + void (*dealloc_buffer)(sg_buffer buf_id, void* user_data); + void (*dealloc_image)(sg_image img_id, void* user_data); + void (*dealloc_shader)(sg_shader shd_id, void* user_data); + void (*dealloc_pipeline)(sg_pipeline pip_id, void* user_data); + void (*dealloc_pass)(sg_pass pass_id, void* user_data); + void (*init_buffer)(sg_buffer buf_id, const sg_buffer_desc* desc, void* user_data); + void (*init_image)(sg_image img_id, const sg_image_desc* desc, void* user_data); + void (*init_shader)(sg_shader shd_id, const sg_shader_desc* desc, void* user_data); + void (*init_pipeline)(sg_pipeline pip_id, const sg_pipeline_desc* desc, void* user_data); + void (*init_pass)(sg_pass pass_id, const sg_pass_desc* desc, void* user_data); + void (*uninit_buffer)(sg_buffer buf_id, void* user_data); + void (*uninit_image)(sg_image img_id, void* user_data); + void (*uninit_shader)(sg_shader shd_id, void* user_data); + void (*uninit_pipeline)(sg_pipeline pip_id, void* user_data); + void (*uninit_pass)(sg_pass pass_id, void* user_data); + void (*fail_buffer)(sg_buffer buf_id, void* user_data); + void (*fail_image)(sg_image img_id, void* user_data); + void (*fail_shader)(sg_shader shd_id, void* user_data); + void (*fail_pipeline)(sg_pipeline pip_id, void* user_data); + void (*fail_pass)(sg_pass pass_id, void* user_data); + void (*push_debug_group)(const char* name, void* user_data); + void (*pop_debug_group)(void* user_data); + void (*err_buffer_pool_exhausted)(void* user_data); + void (*err_image_pool_exhausted)(void* user_data); + void (*err_shader_pool_exhausted)(void* user_data); + void (*err_pipeline_pool_exhausted)(void* user_data); + void (*err_pass_pool_exhausted)(void* user_data); + void (*err_context_mismatch)(void* user_data); + void (*err_pass_invalid)(void* user_data); + void (*err_draw_invalid)(void* user_data); + void (*err_bindings_invalid)(void* user_data); +} sg_trace_hooks; + +/* + sg_buffer_info + sg_image_info + sg_shader_info + sg_pipeline_info + sg_pass_info + + These structs contain various internal resource attributes which + might be useful for debug-inspection. Please don't rely on the + actual content of those structs too much, as they are quite closely + tied to sokol_gfx.h internals and may change more frequently than + the other public API elements. + + The *_info structs are used as the return values of the following functions: + + sg_query_buffer_info() + sg_query_image_info() + sg_query_shader_info() + sg_query_pipeline_info() + sg_query_pass_info() +*/ +typedef struct sg_slot_info { + sg_resource_state state; /* the current state of this resource slot */ + uint32_t res_id; /* type-neutral resource if (e.g. sg_buffer.id) */ + uint32_t ctx_id; /* the context this resource belongs to */ +} sg_slot_info; + +typedef struct sg_buffer_info { + sg_slot_info slot; /* resource pool slot info */ + uint32_t update_frame_index; /* frame index of last sg_update_buffer() */ + uint32_t append_frame_index; /* frame index of last sg_append_buffer() */ + int append_pos; /* current position in buffer for sg_append_buffer() */ + bool append_overflow; /* is buffer in overflow state (due to sg_append_buffer) */ + int num_slots; /* number of renaming-slots for dynamically updated buffers */ + int active_slot; /* currently active write-slot for dynamically updated buffers */ +} sg_buffer_info; + +typedef struct sg_image_info { + sg_slot_info slot; /* resource pool slot info */ + uint32_t upd_frame_index; /* frame index of last sg_update_image() */ + int num_slots; /* number of renaming-slots for dynamically updated images */ + int active_slot; /* currently active write-slot for dynamically updated images */ + int width; /* image width */ + int height; /* image height */ +} sg_image_info; + +typedef struct sg_shader_info { + sg_slot_info slot; /* resoure pool slot info */ +} sg_shader_info; + +typedef struct sg_pipeline_info { + sg_slot_info slot; /* resource pool slot info */ +} sg_pipeline_info; + +typedef struct sg_pass_info { + sg_slot_info slot; /* resource pool slot info */ +} sg_pass_info; + +/* + sg_desc + + The sg_desc struct contains configuration values for sokol_gfx, + it is used as parameter to the sg_setup() call. + + NOTE that all callback function pointers come in two versions, one without + a userdata pointer, and one with a userdata pointer. You would + either initialize one or the other depending on whether you pass data + to your callbacks. + + FIXME: explain the various configuration options + + The default configuration is: + + .buffer_pool_size 128 + .image_pool_size 128 + .shader_pool_size 32 + .pipeline_pool_size 64 + .pass_pool_size 16 + .context_pool_size 16 + .sampler_cache_size 64 + .uniform_buffer_size 4 MB (4*1024*1024) + .staging_buffer_size 8 MB (8*1024*1024) + + .context.color_format: default value depends on selected backend: + all GL backends: SG_PIXELFORMAT_RGBA8 + Metal and D3D11: SG_PIXELFORMAT_BGRA8 + WGPU: *no default* (must be queried from WGPU swapchain) + .context.depth_format SG_PIXELFORMAT_DEPTH_STENCIL + .context.sample_count 1 + + GL specific: + .context.gl.force_gles2 + if this is true the GL backend will act in "GLES2 fallback mode" even + when compiled with SOKOL_GLES3, this is useful to fall back + to traditional WebGL if a browser doesn't support a WebGL2 context + + Metal specific: + (NOTE: All Objective-C object references are transferred through + a bridged (const void*) to sokol_gfx, which will use a unretained + bridged cast (__bridged id) to retrieve the Objective-C + references back. Since the bridge cast is unretained, the caller + must hold a strong reference to the Objective-C object for the + duration of the sokol_gfx call! + + .context.metal.device + a pointer to the MTLDevice object + .context.metal.renderpass_descriptor_cb + .context.metal_renderpass_descriptor_userdata_cb + A C callback function to obtain the MTLRenderPassDescriptor for the + current frame when rendering to the default framebuffer, will be called + in sg_begin_default_pass(). + .context.metal.drawable_cb + .context.metal.drawable_userdata_cb + a C callback function to obtain a MTLDrawable for the current + frame when rendering to the default framebuffer, will be called in + sg_end_pass() of the default pass + .context.metal.user_data + optional user data pointer passed to the userdata versions of + callback functions + + D3D11 specific: + .context.d3d11.device + a pointer to the ID3D11Device object, this must have been created + before sg_setup() is called + .context.d3d11.device_context + a pointer to the ID3D11DeviceContext object + .context.d3d11.render_target_view_cb + .context.d3d11.render_target_view_userdata_cb + a C callback function to obtain a pointer to the current + ID3D11RenderTargetView object of the default framebuffer, + this function will be called in sg_begin_pass() when rendering + to the default framebuffer + .context.d3d11.depth_stencil_view_cb + .context.d3d11.depth_stencil_view_userdata_cb + a C callback function to obtain a pointer to the current + ID3D11DepthStencilView object of the default framebuffer, + this function will be called in sg_begin_pass() when rendering + to the default framebuffer + .context.metal.user_data + optional user data pointer passed to the userdata versions of + callback functions + + WebGPU specific: + .context.wgpu.device + a WGPUDevice handle + .context.wgpu.render_format + WGPUTextureFormat of the swap chain surface + .context.wgpu.render_view_cb + .context.wgpu.render_view_userdata_cb + callback to get the current WGPUTextureView of the swapchain's + rendering attachment (may be an MSAA surface) + .context.wgpu.resolve_view_cb + .context.wgpu.resolve_view_userdata_cb + callback to get the current WGPUTextureView of the swapchain's + MSAA-resolve-target surface, must return 0 if not MSAA rendering + .context.wgpu.depth_stencil_view_cb + .context.wgpu.depth_stencil_view_userdata_cb + callback to get current default-pass depth-stencil-surface WGPUTextureView + the pixel format of the default WGPUTextureView must be WGPUTextureFormat_Depth24Plus8 + .context.metal.user_data + optional user data pointer passed to the userdata versions of + callback functions + + When using sokol_gfx.h and sokol_app.h together, consider using the + helper function sapp_sgcontext() in the sokol_glue.h header to + initialize the sg_desc.context nested struct. sapp_sgcontext() returns + a completely initialized sg_context_desc struct with information + provided by sokol_app.h. +*/ +typedef struct sg_gl_context_desc { + bool force_gles2; +} sg_gl_context_desc; + +typedef struct sg_metal_context_desc { + const void* device; + const void* (*renderpass_descriptor_cb)(void); + const void* (*renderpass_descriptor_userdata_cb)(void*); + const void* (*drawable_cb)(void); + const void* (*drawable_userdata_cb)(void*); + void* user_data; +} sg_metal_context_desc; + +typedef struct sg_d3d11_context_desc { + const void* device; + const void* device_context; + const void* (*render_target_view_cb)(void); + const void* (*render_target_view_userdata_cb)(void*); + const void* (*depth_stencil_view_cb)(void); + const void* (*depth_stencil_view_userdata_cb)(void*); + void* user_data; +} sg_d3d11_context_desc; + +typedef struct sg_wgpu_context_desc { + const void* device; /* WGPUDevice */ + const void* (*render_view_cb)(void); /* returns WGPUTextureView */ + const void* (*render_view_userdata_cb)(void*); + const void* (*resolve_view_cb)(void); /* returns WGPUTextureView */ + const void* (*resolve_view_userdata_cb)(void*); + const void* (*depth_stencil_view_cb)(void); /* returns WGPUTextureView, must be WGPUTextureFormat_Depth24Plus8 */ + const void* (*depth_stencil_view_userdata_cb)(void*); + void* user_data; +} sg_wgpu_context_desc; + +typedef struct sg_context_desc { + sg_pixel_format color_format; + sg_pixel_format depth_format; + int sample_count; + sg_gl_context_desc gl; + sg_metal_context_desc metal; + sg_d3d11_context_desc d3d11; + sg_wgpu_context_desc wgpu; +} sg_context_desc; + +typedef struct sg_desc { + uint32_t _start_canary; + int buffer_pool_size; + int image_pool_size; + int shader_pool_size; + int pipeline_pool_size; + int pass_pool_size; + int context_pool_size; + int uniform_buffer_size; + int staging_buffer_size; + int sampler_cache_size; + sg_context_desc context; + uint32_t _end_canary; +} sg_desc; + +/* setup and misc functions */ +SOKOL_GFX_API_DECL void sg_setup(const sg_desc* desc); +SOKOL_GFX_API_DECL void sg_shutdown(void); +SOKOL_GFX_API_DECL bool sg_isvalid(void); +SOKOL_GFX_API_DECL void sg_reset_state_cache(void); +SOKOL_GFX_API_DECL sg_trace_hooks sg_install_trace_hooks(const sg_trace_hooks* trace_hooks); +SOKOL_GFX_API_DECL void sg_push_debug_group(const char* name); +SOKOL_GFX_API_DECL void sg_pop_debug_group(void); + +/* resource creation, destruction and updating */ +SOKOL_GFX_API_DECL sg_buffer sg_make_buffer(const sg_buffer_desc* desc); +SOKOL_GFX_API_DECL sg_image sg_make_image(const sg_image_desc* desc); +SOKOL_GFX_API_DECL sg_shader sg_make_shader(const sg_shader_desc* desc); +SOKOL_GFX_API_DECL sg_pipeline sg_make_pipeline(const sg_pipeline_desc* desc); +SOKOL_GFX_API_DECL sg_pass sg_make_pass(const sg_pass_desc* desc); +SOKOL_GFX_API_DECL void sg_destroy_buffer(sg_buffer buf); +SOKOL_GFX_API_DECL void sg_destroy_image(sg_image img); +SOKOL_GFX_API_DECL void sg_destroy_shader(sg_shader shd); +SOKOL_GFX_API_DECL void sg_destroy_pipeline(sg_pipeline pip); +SOKOL_GFX_API_DECL void sg_destroy_pass(sg_pass pass); +SOKOL_GFX_API_DECL void sg_update_buffer(sg_buffer buf, const sg_range* data); +SOKOL_GFX_API_DECL void sg_update_image(sg_image img, const sg_image_data* data); +SOKOL_GFX_API_DECL int sg_append_buffer(sg_buffer buf, const sg_range* data); +SOKOL_GFX_API_DECL bool sg_query_buffer_overflow(sg_buffer buf); + +/* rendering functions */ +SOKOL_GFX_API_DECL void sg_begin_default_pass(const sg_pass_action* pass_action, int width, int height); +SOKOL_GFX_API_DECL void sg_begin_default_passf(const sg_pass_action* pass_action, float width, float height); +SOKOL_GFX_API_DECL void sg_begin_pass(sg_pass pass, const sg_pass_action* pass_action); +SOKOL_GFX_API_DECL void sg_apply_viewport(int x, int y, int width, int height, bool origin_top_left); +SOKOL_GFX_API_DECL void sg_apply_viewportf(float x, float y, float width, float height, bool origin_top_left); +SOKOL_GFX_API_DECL void sg_apply_scissor_rect(int x, int y, int width, int height, bool origin_top_left); +SOKOL_GFX_API_DECL void sg_apply_scissor_rectf(float x, float y, float width, float height, bool origin_top_left); +SOKOL_GFX_API_DECL void sg_apply_pipeline(sg_pipeline pip); +SOKOL_GFX_API_DECL void sg_apply_bindings(const sg_bindings* bindings); +SOKOL_GFX_API_DECL void sg_apply_uniforms(sg_shader_stage stage, int ub_index, const sg_range* data); +SOKOL_GFX_API_DECL void sg_draw(int base_element, int num_elements, int num_instances); +SOKOL_GFX_API_DECL void sg_end_pass(void); +SOKOL_GFX_API_DECL void sg_commit(void); + +/* getting information */ +SOKOL_GFX_API_DECL sg_desc sg_query_desc(void); +SOKOL_GFX_API_DECL sg_backend sg_query_backend(void); +SOKOL_GFX_API_DECL sg_features sg_query_features(void); +SOKOL_GFX_API_DECL sg_limits sg_query_limits(void); +SOKOL_GFX_API_DECL sg_pixelformat_info sg_query_pixelformat(sg_pixel_format fmt); +/* get current state of a resource (INITIAL, ALLOC, VALID, FAILED, INVALID) */ +SOKOL_GFX_API_DECL sg_resource_state sg_query_buffer_state(sg_buffer buf); +SOKOL_GFX_API_DECL sg_resource_state sg_query_image_state(sg_image img); +SOKOL_GFX_API_DECL sg_resource_state sg_query_shader_state(sg_shader shd); +SOKOL_GFX_API_DECL sg_resource_state sg_query_pipeline_state(sg_pipeline pip); +SOKOL_GFX_API_DECL sg_resource_state sg_query_pass_state(sg_pass pass); +/* get runtime information about a resource */ +SOKOL_GFX_API_DECL sg_buffer_info sg_query_buffer_info(sg_buffer buf); +SOKOL_GFX_API_DECL sg_image_info sg_query_image_info(sg_image img); +SOKOL_GFX_API_DECL sg_shader_info sg_query_shader_info(sg_shader shd); +SOKOL_GFX_API_DECL sg_pipeline_info sg_query_pipeline_info(sg_pipeline pip); +SOKOL_GFX_API_DECL sg_pass_info sg_query_pass_info(sg_pass pass); +/* get resource creation desc struct with their default values replaced */ +SOKOL_GFX_API_DECL sg_buffer_desc sg_query_buffer_defaults(const sg_buffer_desc* desc); +SOKOL_GFX_API_DECL sg_image_desc sg_query_image_defaults(const sg_image_desc* desc); +SOKOL_GFX_API_DECL sg_shader_desc sg_query_shader_defaults(const sg_shader_desc* desc); +SOKOL_GFX_API_DECL sg_pipeline_desc sg_query_pipeline_defaults(const sg_pipeline_desc* desc); +SOKOL_GFX_API_DECL sg_pass_desc sg_query_pass_defaults(const sg_pass_desc* desc); + +/* separate resource allocation and initialization (for async setup) */ +SOKOL_GFX_API_DECL sg_buffer sg_alloc_buffer(void); +SOKOL_GFX_API_DECL sg_image sg_alloc_image(void); +SOKOL_GFX_API_DECL sg_shader sg_alloc_shader(void); +SOKOL_GFX_API_DECL sg_pipeline sg_alloc_pipeline(void); +SOKOL_GFX_API_DECL sg_pass sg_alloc_pass(void); +SOKOL_GFX_API_DECL void sg_dealloc_buffer(sg_buffer buf_id); +SOKOL_GFX_API_DECL void sg_dealloc_image(sg_image img_id); +SOKOL_GFX_API_DECL void sg_dealloc_shader(sg_shader shd_id); +SOKOL_GFX_API_DECL void sg_dealloc_pipeline(sg_pipeline pip_id); +SOKOL_GFX_API_DECL void sg_dealloc_pass(sg_pass pass_id); +SOKOL_GFX_API_DECL void sg_init_buffer(sg_buffer buf_id, const sg_buffer_desc* desc); +SOKOL_GFX_API_DECL void sg_init_image(sg_image img_id, const sg_image_desc* desc); +SOKOL_GFX_API_DECL void sg_init_shader(sg_shader shd_id, const sg_shader_desc* desc); +SOKOL_GFX_API_DECL void sg_init_pipeline(sg_pipeline pip_id, const sg_pipeline_desc* desc); +SOKOL_GFX_API_DECL void sg_init_pass(sg_pass pass_id, const sg_pass_desc* desc); +SOKOL_GFX_API_DECL bool sg_uninit_buffer(sg_buffer buf_id); +SOKOL_GFX_API_DECL bool sg_uninit_image(sg_image img_id); +SOKOL_GFX_API_DECL bool sg_uninit_shader(sg_shader shd_id); +SOKOL_GFX_API_DECL bool sg_uninit_pipeline(sg_pipeline pip_id); +SOKOL_GFX_API_DECL bool sg_uninit_pass(sg_pass pass_id); +SOKOL_GFX_API_DECL void sg_fail_buffer(sg_buffer buf_id); +SOKOL_GFX_API_DECL void sg_fail_image(sg_image img_id); +SOKOL_GFX_API_DECL void sg_fail_shader(sg_shader shd_id); +SOKOL_GFX_API_DECL void sg_fail_pipeline(sg_pipeline pip_id); +SOKOL_GFX_API_DECL void sg_fail_pass(sg_pass pass_id); + +/* rendering contexts (optional) */ +SOKOL_GFX_API_DECL sg_context sg_setup_context(void); +SOKOL_GFX_API_DECL void sg_activate_context(sg_context ctx_id); +SOKOL_GFX_API_DECL void sg_discard_context(sg_context ctx_id); + +/* Backend-specific helper functions, these may come in handy for mixing + sokol-gfx rendering with 'native backend' rendering functions. + + This group of functions will be expanded as needed. +*/ + +/* D3D11: return ID3D11Device */ +SOKOL_GFX_API_DECL const void* sg_d3d11_device(void); + +/* Metal: return __bridge-casted MTLDevice */ +SOKOL_GFX_API_DECL const void* sg_mtl_device(void); + +/* Metal: return __bridge-casted MTLRenderCommandEncoder in current pass (or zero if outside pass) */ +SOKOL_GFX_API_DECL const void* sg_mtl_render_command_encoder(void); + +#ifdef __cplusplus +} /* extern "C" */ + +/* reference-based equivalents for c++ */ +inline void sg_setup(const sg_desc& desc) { return sg_setup(&desc); } + +inline sg_buffer sg_make_buffer(const sg_buffer_desc& desc) { return sg_make_buffer(&desc); } +inline sg_image sg_make_image(const sg_image_desc& desc) { return sg_make_image(&desc); } +inline sg_shader sg_make_shader(const sg_shader_desc& desc) { return sg_make_shader(&desc); } +inline sg_pipeline sg_make_pipeline(const sg_pipeline_desc& desc) { return sg_make_pipeline(&desc); } +inline sg_pass sg_make_pass(const sg_pass_desc& desc) { return sg_make_pass(&desc); } +inline void sg_update_image(sg_image img, const sg_image_data& data) { return sg_update_image(img, &data); } + +inline void sg_begin_default_pass(const sg_pass_action& pass_action, int width, int height) { return sg_begin_default_pass(&pass_action, width, height); } +inline void sg_begin_default_passf(const sg_pass_action& pass_action, float width, float height) { return sg_begin_default_passf(&pass_action, width, height); } +inline void sg_begin_pass(sg_pass pass, const sg_pass_action& pass_action) { return sg_begin_pass(pass, &pass_action); } +inline void sg_apply_bindings(const sg_bindings& bindings) { return sg_apply_bindings(&bindings); } +inline void sg_apply_uniforms(sg_shader_stage stage, int ub_index, const sg_range& data) { return sg_apply_uniforms(stage, ub_index, &data); } + +inline sg_buffer_desc sg_query_buffer_defaults(const sg_buffer_desc& desc) { return sg_query_buffer_defaults(&desc); } +inline sg_image_desc sg_query_image_defaults(const sg_image_desc& desc) { return sg_query_image_defaults(&desc); } +inline sg_shader_desc sg_query_shader_defaults(const sg_shader_desc& desc) { return sg_query_shader_defaults(&desc); } +inline sg_pipeline_desc sg_query_pipeline_defaults(const sg_pipeline_desc& desc) { return sg_query_pipeline_defaults(&desc); } +inline sg_pass_desc sg_query_pass_defaults(const sg_pass_desc& desc) { return sg_query_pass_defaults(&desc); } + +inline void sg_init_buffer(sg_buffer buf_id, const sg_buffer_desc& desc) { return sg_init_buffer(buf_id, &desc); } +inline void sg_init_image(sg_image img_id, const sg_image_desc& desc) { return sg_init_image(img_id, &desc); } +inline void sg_init_shader(sg_shader shd_id, const sg_shader_desc& desc) { return sg_init_shader(shd_id, &desc); } +inline void sg_init_pipeline(sg_pipeline pip_id, const sg_pipeline_desc& desc) { return sg_init_pipeline(pip_id, &desc); } +inline void sg_init_pass(sg_pass pass_id, const sg_pass_desc& desc) { return sg_init_pass(pass_id, &desc); } + +inline void sg_update_buffer(sg_buffer buf_id, const sg_range& data) { return sg_update_buffer(buf_id, &data); } +inline int sg_append_buffer(sg_buffer buf_id, const sg_range& data) { return sg_append_buffer(buf_id, &data); } +#endif +#endif // SOKOL_GFX_INCLUDED + +/*--- IMPLEMENTATION ---------------------------------------------------------*/ +#ifdef SOKOL_GFX_IMPL +#define SOKOL_GFX_IMPL_INCLUDED (1) + +#ifndef SOKOL_API_IMPL + #define SOKOL_API_IMPL +#endif + +typedef struct { + bool valid; + sg_desc desc; + uint32_t buffer_id; + uint32_t image_id; + uint32_t shader_id; + uint32_t pipeline_id; + uint32_t pass_id; + uint32_t ctx_id; +} _sg_state; + +_sg_state _sg; + +/* setup and misc functions */ +SOKOL_API_IMPL void sg_setup(const sg_desc* desc) +{ + _sg.valid = true; + _sg.desc = *desc; +} + +SOKOL_API_IMPL void sg_shutdown(void) +{ + _sg.valid = false; +} + +SOKOL_API_IMPL bool sg_isvalid(void) { return _sg.valid; } +SOKOL_API_IMPL void sg_reset_state_cache(void) { } +SOKOL_API_IMPL sg_trace_hooks sg_install_trace_hooks(const sg_trace_hooks* trace_hooks) { } +SOKOL_API_IMPL void sg_push_debug_group(const char* name) { } +SOKOL_API_IMPL void sg_pop_debug_group(void) { } + +/* resource creation, destruction and updating */ +SOKOL_API_IMPL sg_buffer sg_make_buffer(const sg_buffer_desc* desc) { sg_buffer res = { ++_sg.buffer_id }; return res; } +SOKOL_API_IMPL sg_image sg_make_image(const sg_image_desc* desc) { sg_image res = { ++_sg.image_id }; return res; } +SOKOL_API_IMPL sg_shader sg_make_shader(const sg_shader_desc* desc) { sg_shader res = { ++_sg.shader_id }; return res; } +SOKOL_API_IMPL sg_pipeline sg_make_pipeline(const sg_pipeline_desc* desc) { sg_pipeline res = { ++_sg.pipeline_id }; return res; } +SOKOL_API_IMPL sg_pass sg_make_pass(const sg_pass_desc* desc) { sg_pass res = { ++_sg.pass_id }; return res; } +SOKOL_API_IMPL void sg_destroy_buffer(sg_buffer buf) { } +SOKOL_API_IMPL void sg_destroy_image(sg_image img) { } +SOKOL_API_IMPL void sg_destroy_shader(sg_shader shd) { } +SOKOL_API_IMPL void sg_destroy_pipeline(sg_pipeline pip) {} +SOKOL_API_IMPL void sg_destroy_pass(sg_pass pass) {} +SOKOL_API_IMPL void sg_update_buffer(sg_buffer buf, const sg_range* data) { } +SOKOL_API_IMPL void sg_update_image(sg_image img, const sg_image_data* data) { } +SOKOL_API_IMPL int sg_append_buffer(sg_buffer buf, const sg_range* data) { return 0; } +SOKOL_API_IMPL bool sg_query_buffer_overflow(sg_buffer buf) { return false; } + +/* rendering functions */ +SOKOL_API_IMPL void sg_begin_default_pass(const sg_pass_action* pass_action, int width, int height) { } +SOKOL_API_IMPL void sg_begin_default_passf(const sg_pass_action* pass_action, float width, float height) { } +SOKOL_API_IMPL void sg_begin_pass(sg_pass pass, const sg_pass_action* pass_action) { } +SOKOL_API_IMPL void sg_apply_viewport(int x, int y, int width, int height, bool origin_top_left) { } +SOKOL_API_IMPL void sg_apply_viewportf(float x, float y, float width, float height, bool origin_top_left) { } +SOKOL_API_IMPL void sg_apply_scissor_rect(int x, int y, int width, int height, bool origin_top_left) { } +SOKOL_API_IMPL void sg_apply_scissor_rectf(float x, float y, float width, float height, bool origin_top_left) { } +SOKOL_API_IMPL void sg_apply_pipeline(sg_pipeline pip) { } +SOKOL_API_IMPL void sg_apply_bindings(const sg_bindings* bindings) { } +SOKOL_API_IMPL void sg_apply_uniforms(sg_shader_stage stage, int ub_index, const sg_range* data) { } +SOKOL_API_IMPL void sg_draw(int base_element, int num_elements, int num_instances) { } +SOKOL_API_IMPL void sg_end_pass(void) { } +SOKOL_API_IMPL void sg_commit(void) { } + +/* getting information */ +SOKOL_API_IMPL sg_desc sg_query_desc(void) { return _sg.desc; } +SOKOL_API_IMPL sg_backend sg_query_backend(void) { return SG_BACKEND_DUMMY; } +SOKOL_API_IMPL sg_features sg_query_features(void) { + sg_features features = { 0 }; + features.instancing = true; + features.origin_top_left = true; + features.multiple_render_targets = true; + features.msaa_render_targets = true; + features.imagetype_3d = true; + features.imagetype_array = true; + features.image_clamp_to_border = true; + features.mrt_independent_blend_state = true; + features.mrt_independent_write_mask = true; + return features; +} +SOKOL_API_IMPL sg_limits sg_query_limits(void) { + sg_limits limits = { 0 }; + limits.max_image_size_2d = 65536; + limits.max_image_size_cube = 65536; + limits.max_image_size_3d = 65536; + limits.max_image_size_array = 65536; + limits.max_image_array_layers = 65536; + limits.max_vertex_attrs = SG_MAX_VERTEX_ATTRIBUTES; + limits.gl_max_vertex_uniform_vectors = 65536; + return limits; +} +SOKOL_API_IMPL sg_pixelformat_info sg_query_pixelformat(sg_pixel_format fmt) { + sg_pixelformat_info info = { 0 }; + info.sample = true; + info.filter = true; + info.render = true; + info.blend = true; + info.msaa = true; + if (fmt == SG_PIXELFORMAT_DEPTH || fmt == SG_PIXELFORMAT_DEPTH_STENCIL) { + info.depth = true; + } + return info; +} +/* get current state of a resource (INITIAL, ALLOC, VALID, FAILED, INVALID) */ +SOKOL_API_IMPL sg_resource_state sg_query_buffer_state(sg_buffer buf) { return SG_RESOURCESTATE_VALID; } +SOKOL_API_IMPL sg_resource_state sg_query_image_state(sg_image img) { return SG_RESOURCESTATE_VALID; } +SOKOL_API_IMPL sg_resource_state sg_query_shader_state(sg_shader shd) { return SG_RESOURCESTATE_VALID; } +SOKOL_API_IMPL sg_resource_state sg_query_pipeline_state(sg_pipeline pip) { return SG_RESOURCESTATE_VALID; } +SOKOL_API_IMPL sg_resource_state sg_query_pass_state(sg_pass pass) { return SG_RESOURCESTATE_VALID; } +/* get runtime information about a resource */ +SOKOL_API_IMPL sg_buffer_info sg_query_buffer_info(sg_buffer buf) { sg_buffer_info info = { 0 }; return info; } +SOKOL_API_IMPL sg_image_info sg_query_image_info(sg_image img) { sg_image_info info = { 0 }; return info; } +SOKOL_API_IMPL sg_shader_info sg_query_shader_info(sg_shader shd) { sg_shader_info info = { 0 }; return info; } +SOKOL_API_IMPL sg_pipeline_info sg_query_pipeline_info(sg_pipeline pip) { sg_pipeline_info info = { 0 }; return info; } +SOKOL_API_IMPL sg_pass_info sg_query_pass_info(sg_pass pass) { sg_pass_info info = { 0 }; return info; } +/* get resource creation desc struct with their default values replaced */ +SOKOL_API_IMPL sg_buffer_desc sg_query_buffer_defaults(const sg_buffer_desc* desc) { return *desc; } +SOKOL_API_IMPL sg_image_desc sg_query_image_defaults(const sg_image_desc* desc) { return *desc; } +SOKOL_API_IMPL sg_shader_desc sg_query_shader_defaults(const sg_shader_desc* desc) { return *desc; } +SOKOL_API_IMPL sg_pipeline_desc sg_query_pipeline_defaults(const sg_pipeline_desc* desc) { return *desc; } +SOKOL_API_IMPL sg_pass_desc sg_query_pass_defaults(const sg_pass_desc* desc) { return *desc; } + +/* separate resource allocation and initialization (for async setup) */ +SOKOL_API_IMPL sg_buffer sg_alloc_buffer(void) { return sg_make_buffer(NULL); } +SOKOL_API_IMPL sg_image sg_alloc_image(void) { return sg_make_image(NULL); } +SOKOL_API_IMPL sg_shader sg_alloc_shader(void) { return sg_make_shader(NULL); } +SOKOL_API_IMPL sg_pipeline sg_alloc_pipeline(void) { return sg_make_pipeline(NULL); } +SOKOL_API_IMPL sg_pass sg_alloc_pass(void) { return sg_make_pass(NULL); } +SOKOL_API_IMPL void sg_dealloc_buffer(sg_buffer buf_id) { } +SOKOL_API_IMPL void sg_dealloc_image(sg_image img_id) { } +SOKOL_API_IMPL void sg_dealloc_shader(sg_shader shd_id) { } +SOKOL_API_IMPL void sg_dealloc_pipeline(sg_pipeline pip_id) { } +SOKOL_API_IMPL void sg_dealloc_pass(sg_pass pass_id) { } +SOKOL_API_IMPL void sg_init_buffer(sg_buffer buf_id, const sg_buffer_desc* desc) { } +SOKOL_API_IMPL void sg_init_image(sg_image img_id, const sg_image_desc* desc) { } +SOKOL_API_IMPL void sg_init_shader(sg_shader shd_id, const sg_shader_desc* desc) { } +SOKOL_API_IMPL void sg_init_pipeline(sg_pipeline pip_id, const sg_pipeline_desc* desc) { } +SOKOL_API_IMPL void sg_init_pass(sg_pass pass_id, const sg_pass_desc* desc) { } +SOKOL_API_IMPL bool sg_uninit_buffer(sg_buffer buf_id) { } +SOKOL_API_IMPL bool sg_uninit_image(sg_image img_id) { } +SOKOL_API_IMPL bool sg_uninit_shader(sg_shader shd_id) { } +SOKOL_API_IMPL bool sg_uninit_pipeline(sg_pipeline pip_id) { } +SOKOL_API_IMPL bool sg_uninit_pass(sg_pass pass_id) { } +SOKOL_API_IMPL void sg_fail_buffer(sg_buffer buf_id) { } +SOKOL_API_IMPL void sg_fail_image(sg_image img_id) { } +SOKOL_API_IMPL void sg_fail_shader(sg_shader shd_id) { } +SOKOL_API_IMPL void sg_fail_pipeline(sg_pipeline pip_id) { } +SOKOL_API_IMPL void sg_fail_pass(sg_pass pass_id) { } + +/* rendering contexts (optional) */ +SOKOL_API_IMPL sg_context sg_setup_context(void) { sg_context ctx = { ++_sg.ctx_id }; return ctx; } +SOKOL_API_IMPL void sg_activate_context(sg_context ctx_id) { } +SOKOL_API_IMPL void sg_discard_context(sg_context ctx_id) { } + +/* Backend-specific helper functions, these may come in handy for mixing + sokol-gfx rendering with 'native backend' rendering functions. + + This group of functions will be expanded as needed. +*/ + +/* D3D11: return ID3D11Device */ +SOKOL_API_IMPL const void* sg_d3d11_device(void) { return NULL; } + +/* Metal: return __bridge-casted MTLDevice */ +SOKOL_API_IMPL const void* sg_mtl_device(void) { return NULL; } + +/* Metal: return __bridge-casted MTLRenderCommandEncoder in current pass (or zero if outside pass) */ +SOKOL_API_IMPL const void* sg_mtl_render_command_encoder(void) { return NULL; } + +#endif /* SOKOL_GFX_IMPL */ diff --git a/modules/ufbx/examples/viewer/external/dummy_sokol_time.h b/modules/ufbx/examples/viewer/external/dummy_sokol_time.h new file mode 100644 index 0000000..8dc554d --- /dev/null +++ b/modules/ufbx/examples/viewer/external/dummy_sokol_time.h @@ -0,0 +1,211 @@ +#if defined(SOKOL_IMPL) && !defined(SOKOL_TIME_IMPL) +#define SOKOL_TIME_IMPL +#endif +#ifndef SOKOL_TIME_INCLUDED +/* + sokol_time.h -- simple cross-platform time measurement + + Project URL: https://github.com/floooh/sokol + + Do this: + #define SOKOL_IMPL or + #define SOKOL_TIME_IMPL + before you include this file in *one* C or C++ file to create the + implementation. + + Optionally provide the following defines with your own implementations: + SOKOL_ASSERT(c) - your own assert macro (default: assert(c)) + SOKOL_TIME_API_DECL - public function declaration prefix (default: extern) + SOKOL_API_DECL - same as SOKOL_TIME_API_DECL + SOKOL_API_IMPL - public function implementation prefix (default: -) + + If sokol_time.h is compiled as a DLL, define the following before + including the declaration or implementation: + + SOKOL_DLL + + On Windows, SOKOL_DLL will define SOKOL_TIME_API_DECL as __declspec(dllexport) + or __declspec(dllimport) as needed. + + void stm_setup(); + Call once before any other functions to initialize sokol_time + (this calls for instance QueryPerformanceFrequency on Windows) + + uint64_t stm_now(); + Get current point in time in unspecified 'ticks'. The value that + is returned has no relation to the 'wall-clock' time and is + not in a specific time unit, it is only useful to compute + time differences. + + uint64_t stm_diff(uint64_t new, uint64_t old); + Computes the time difference between new and old. This will always + return a positive, non-zero value. + + uint64_t stm_since(uint64_t start); + Takes the current time, and returns the elapsed time since start + (this is a shortcut for "stm_diff(stm_now(), start)") + + uint64_t stm_laptime(uint64_t* last_time); + This is useful for measuring frame time and other recurring + events. It takes the current time, returns the time difference + to the value in last_time, and stores the current time in + last_time for the next call. If the value in last_time is 0, + the return value will be zero (this usually happens on the + very first call). + + uint64_t stm_round_to_common_refresh_rate(uint64_t duration) + This oddly named function takes a measured frame time and + returns the closest "nearby" common display refresh rate frame duration + in ticks. If the input duration isn't close to any common display + refresh rate, the input duration will be returned unchanged as a fallback. + The main purpose of this function is to remove jitter/inaccuracies from + measured frame times, and instead use the display refresh rate as + frame duration. + + Use the following functions to convert a duration in ticks into + useful time units: + + double stm_sec(uint64_t ticks); + double stm_ms(uint64_t ticks); + double stm_us(uint64_t ticks); + double stm_ns(uint64_t ticks); + Converts a tick value into seconds, milliseconds, microseconds + or nanoseconds. Note that not all platforms will have nanosecond + or even microsecond precision. + + Uses the following time measurement functions under the hood: + + Windows: QueryPerformanceFrequency() / QueryPerformanceCounter() + MacOS/iOS: mach_absolute_time() + emscripten: performance.now() + Linux+others: clock_gettime(CLOCK_MONOTONIC) + + zlib/libpng license + + Copyright (c) 2018 Andre Weissflog + + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the + use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ +#define SOKOL_TIME_INCLUDED (1) +#include + +#if defined(SOKOL_API_DECL) && !defined(SOKOL_TIME_API_DECL) +#define SOKOL_TIME_API_DECL SOKOL_API_DECL +#endif +#ifndef SOKOL_TIME_API_DECL +#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_TIME_IMPL) +#define SOKOL_TIME_API_DECL __declspec(dllexport) +#elif defined(_WIN32) && defined(SOKOL_DLL) +#define SOKOL_TIME_API_DECL __declspec(dllimport) +#else +#define SOKOL_TIME_API_DECL extern +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +SOKOL_TIME_API_DECL void stm_setup(void); +SOKOL_TIME_API_DECL uint64_t stm_now(void); +SOKOL_TIME_API_DECL uint64_t stm_diff(uint64_t new_ticks, uint64_t old_ticks); +SOKOL_TIME_API_DECL uint64_t stm_since(uint64_t start_ticks); +SOKOL_TIME_API_DECL uint64_t stm_laptime(uint64_t* last_time); +SOKOL_TIME_API_DECL uint64_t stm_round_to_common_refresh_rate(uint64_t frame_ticks); +SOKOL_TIME_API_DECL double stm_sec(uint64_t ticks); +SOKOL_TIME_API_DECL double stm_ms(uint64_t ticks); +SOKOL_TIME_API_DECL double stm_us(uint64_t ticks); +SOKOL_TIME_API_DECL double stm_ns(uint64_t ticks); + +#ifdef __cplusplus +} /* extern "C" */ +#endif +#endif // SOKOL_TIME_INCLUDED + +/*-- IMPLEMENTATION ----------------------------------------------------------*/ +#ifdef SOKOL_TIME_IMPL +#define SOKOL_TIME_IMPL_INCLUDED (1) +#include /* memset */ + +#ifndef SOKOL_API_IMPL + #define SOKOL_API_IMPL +#endif + +extern uint64_t dummy_stm_time_ns; + +SOKOL_API_IMPL void stm_setup(void) +{ + if (dummy_stm_time_ns == 0) { + dummy_stm_time_ns = 1; + } +} + +SOKOL_API_IMPL uint64_t stm_now(void) +{ + return dummy_stm_time_ns; +} + +SOKOL_API_IMPL uint64_t stm_diff(uint64_t new_ticks, uint64_t old_ticks) +{ + return new_ticks - old_ticks; +} + +SOKOL_API_IMPL uint64_t stm_since(uint64_t start_ticks) +{ + return stm_now() - start_ticks; +} + +SOKOL_API_IMPL uint64_t stm_laptime(uint64_t* last_time) +{ + uint64_t dt = 0; + uint64_t now = stm_now(); + if (0 != *last_time) { + dt = stm_diff(now, *last_time); + } + *last_time = now; + return dt; +} + +SOKOL_API_IMPL uint64_t stm_round_to_common_refresh_rate(uint64_t frame_ticks) +{ + return frame_ticks; +} + +SOKOL_API_IMPL double stm_sec(uint64_t ticks) +{ + return (double)ticks * 1e-9; +} + +SOKOL_API_IMPL double stm_ms(uint64_t ticks) +{ + return (double)ticks * 1e-6; +} + +SOKOL_API_IMPL double stm_us(uint64_t ticks) +{ + return (double)ticks * 1e-3; +} + +SOKOL_API_IMPL double stm_ns(uint64_t ticks) +{ + return (double)ticks; +} + +#endif /* SOKOL_TIME_IMPL */ diff --git a/modules/ufbx/examples/viewer/external/sokol_app.h b/modules/ufbx/examples/viewer/external/sokol_app.h new file mode 100644 index 0000000..5455015 --- /dev/null +++ b/modules/ufbx/examples/viewer/external/sokol_app.h @@ -0,0 +1,11133 @@ +#if defined(SOKOL_IMPL) && !defined(SOKOL_APP_IMPL) +#define SOKOL_APP_IMPL +#endif +#ifndef SOKOL_APP_INCLUDED +/* + sokol_app.h -- cross-platform application wrapper + + Project URL: https://github.com/floooh/sokol + + Do this: + #define SOKOL_IMPL or + #define SOKOL_APP_IMPL + before you include this file in *one* C or C++ file to create the + implementation. + + In the same place define one of the following to select the 3D-API + which should be initialized by sokol_app.h (this must also match + the backend selected for sokol_gfx.h if both are used in the same + project): + + #define SOKOL_GLCORE33 + #define SOKOL_GLES2 + #define SOKOL_GLES3 + #define SOKOL_D3D11 + #define SOKOL_METAL + #define SOKOL_WGPU + + Optionally provide the following defines with your own implementations: + + SOKOL_ASSERT(c) - your own assert macro (default: assert(c)) + SOKOL_LOG(msg) - your own logging function (default: puts(msg)) + SOKOL_UNREACHABLE() - a guard macro for unreachable code (default: assert(false)) + SOKOL_ABORT() - called after an unrecoverable error (default: abort()) + SOKOL_WIN32_FORCE_MAIN - define this on Win32 to use a main() entry point instead of WinMain + SOKOL_NO_ENTRY - define this if sokol_app.h shouldn't "hijack" the main() function + SOKOL_APP_API_DECL - public function declaration prefix (default: extern) + SOKOL_API_DECL - same as SOKOL_APP_API_DECL + SOKOL_API_IMPL - public function implementation prefix (default: -) + SOKOL_CALLOC - your own calloc function (default: calloc(n, s)) + SOKOL_FREE - your own free function (default: free(p)) + + Optionally define the following to force debug checks and validations + even in release mode: + + SOKOL_DEBUG - by default this is defined if _DEBUG is defined + + If sokol_app.h is compiled as a DLL, define the following before + including the declaration or implementation: + + SOKOL_DLL + + On Windows, SOKOL_DLL will define SOKOL_APP_API_DECL as __declspec(dllexport) + or __declspec(dllimport) as needed. + + For example code, see https://github.com/floooh/sokol-samples/tree/master/sapp + + Portions of the Windows and Linux GL initialization, event-, icon- etc... code + have been taken from GLFW (http://www.glfw.org/) + + iOS onscreen keyboard support 'inspired' by libgdx. + + Link with the following system libraries: + + - on macOS with Metal: Cocoa, QuartzCore, Metal, MetalKit + - on macOS with GL: Cocoa, QuartzCore, OpenGL + - on iOS with Metal: Foundation, UIKit, Metal, MetalKit + - on iOS with GL: Foundation, UIKit, OpenGLES, GLKit + - on Linux: X11, Xi, Xcursor, GL, dl, pthread, m(?) + - on Android: GLESv3, EGL, log, android + - on Windows with the MSVC or Clang toolchains: no action needed, libs are defined in-source via pragma-comment-lib + - on Windows with MINGW/MSYS2 gcc: compile with '-mwin32' so that _WIN32 is defined + - link with the following libs: -lkernel32 -luser32 -lshell32 + - additionally with the GL backend: -lgdi32 + - additionally with the D3D11 backend: -ld3d11 -ldxgi + + On Linux, you also need to use the -pthread compiler and linker option, otherwise weird + things will happen, see here for details: https://github.com/floooh/sokol/issues/376 + + Building for UWP requires a recent Visual Studio toolchain and Windows SDK + (at least VS2019 and Windows SDK 10.0.19041.0). When the UWP backend is + selected, the sokol_app.h implementation must be compiled as C++17. + + On macOS and iOS, the implementation must be compiled as Objective-C. + + FEATURE OVERVIEW + ================ + sokol_app.h provides a minimalistic cross-platform API which + implements the 'application-wrapper' parts of a 3D application: + + - a common application entry function + - creates a window and 3D-API context/device with a 'default framebuffer' + - makes the rendered frame visible + - provides keyboard-, mouse- and low-level touch-events + - platforms: MacOS, iOS, HTML5, Win32, Linux, Android (TODO: RaspberryPi) + - 3D-APIs: Metal, D3D11, GL3.2, GLES2, GLES3, WebGL, WebGL2 + + FEATURE/PLATFORM MATRIX + ======================= + | Windows | macOS | Linux | iOS | Android | UWP | Raspi | HTML5 + --------------------+---------+-------+-------+-------+---------+------+-------+------- + gl 3.x | YES | YES | YES | --- | --- | --- | --- | --- + gles2/webgl | --- | --- | --- | YES | YES | --- | TODO | YES + gles3/webgl2 | --- | --- | --- | YES | YES | --- | --- | YES + metal | --- | YES | --- | YES | --- | --- | --- | --- + d3d11 | YES | --- | --- | --- | --- | YES | --- | --- + KEY_DOWN | YES | YES | YES | SOME | TODO | YES | TODO | YES + KEY_UP | YES | YES | YES | SOME | TODO | YES | TODO | YES + CHAR | YES | YES | YES | YES | TODO | YES | TODO | YES + MOUSE_DOWN | YES | YES | YES | --- | --- | YES | TODO | YES + MOUSE_UP | YES | YES | YES | --- | --- | YES | TODO | YES + MOUSE_SCROLL | YES | YES | YES | --- | --- | YES | TODO | YES + MOUSE_MOVE | YES | YES | YES | --- | --- | YES | TODO | YES + MOUSE_ENTER | YES | YES | YES | --- | --- | YES | TODO | YES + MOUSE_LEAVE | YES | YES | YES | --- | --- | YES | TODO | YES + TOUCHES_BEGAN | --- | --- | --- | YES | YES | TODO | --- | YES + TOUCHES_MOVED | --- | --- | --- | YES | YES | TODO | --- | YES + TOUCHES_ENDED | --- | --- | --- | YES | YES | TODO | --- | YES + TOUCHES_CANCELLED | --- | --- | --- | YES | YES | TODO | --- | YES + RESIZED | YES | YES | YES | YES | YES | YES | --- | YES + ICONIFIED | YES | YES | YES | --- | --- | YES | --- | --- + RESTORED | YES | YES | YES | --- | --- | YES | --- | --- + FOCUSED | YES | YES | YES | --- | --- | --- | --- | YES + UNFOCUSED | YES | YES | YES | --- | --- | --- | --- | YES + SUSPENDED | --- | --- | --- | YES | YES | YES | --- | TODO + RESUMED | --- | --- | --- | YES | YES | YES | --- | TODO + QUIT_REQUESTED | YES | YES | YES | --- | --- | --- | TODO | YES + UPDATE_CURSOR | YES | YES | TODO | --- | --- | TODO | --- | TODO + IME | TODO | TODO? | TODO | ??? | TODO | --- | ??? | ??? + key repeat flag | YES | YES | YES | --- | --- | YES | TODO | YES + windowed | YES | YES | YES | --- | --- | YES | TODO | YES + fullscreen | YES | YES | YES | YES | YES | YES | TODO | --- + mouse hide | YES | YES | YES | --- | --- | YES | TODO | TODO + mouse lock | YES | YES | YES | --- | --- | TODO | TODO | YES + screen keyboard | --- | --- | --- | YES | TODO | TODO | --- | YES + swap interval | YES | YES | YES | YES | TODO | --- | TODO | YES + high-dpi | YES | YES | TODO | YES | YES | YES | TODO | YES + clipboard | YES | YES | TODO | --- | --- | TODO | --- | YES + MSAA | YES | YES | YES | YES | YES | TODO | TODO | YES + drag'n'drop | YES | YES | YES | --- | --- | TODO | TODO | YES + window icon | YES | YES(1)| YES | --- | --- | TODO | TODO | YES + + (1) macOS has no regular window icons, instead the dock icon is changed + + STEP BY STEP + ============ + --- Add a sokol_main() function to your code which returns a sapp_desc structure + with initialization parameters and callback function pointers. This + function is called very early, usually at the start of the + platform's entry function (e.g. main or WinMain). You should do as + little as possible here, since the rest of your code might be called + from another thread (this depends on the platform): + + sapp_desc sokol_main(int argc, char* argv[]) { + return (sapp_desc) { + .width = 640, + .height = 480, + .init_cb = my_init_func, + .frame_cb = my_frame_func, + .cleanup_cb = my_cleanup_func, + .event_cb = my_event_func, + ... + }; + } + + There are many more setup parameters, but these are the most important. + For a complete list search for the sapp_desc structure declaration + below. + + DO NOT call any sokol-app function from inside sokol_main(), since + sokol-app will not be initialized at this point. + + The .width and .height parameters are the preferred size of the 3D + rendering canvas. The actual size may differ from this depending on + platform and other circumstances. Also the canvas size may change at + any time (for instance when the user resizes the application window, + or rotates the mobile device). + + All provided function callbacks will be called from the same thread, + but this may be different from the thread where sokol_main() was called. + + .init_cb (void (*)(void)) + This function is called once after the application window, + 3D rendering context and swap chain have been created. The + function takes no arguments and has no return value. + .frame_cb (void (*)(void)) + This is the per-frame callback, which is usually called 60 + times per second. This is where your application would update + most of its state and perform all rendering. + .cleanup_cb (void (*)(void)) + The cleanup callback is called once right before the application + quits. + .event_cb (void (*)(const sapp_event* event)) + The event callback is mainly for input handling, but is also + used to communicate other types of events to the application. Keep the + event_cb struct member zero-initialized if your application doesn't require + event handling. + .fail_cb (void (*)(const char* msg)) + The fail callback is called when a fatal error is encountered + during start which doesn't allow the program to continue. + Providing a callback here gives you a chance to show an error message + to the user. The default behaviour is SOKOL_LOG(msg) + + As you can see, those 'standard callbacks' don't have a user_data + argument, so any data that needs to be preserved between callbacks + must live in global variables. If keeping state in global variables + is not an option, there's an alternative set of callbacks with + an additional user_data pointer argument: + + .user_data (void*) + The user-data argument for the callbacks below + .init_userdata_cb (void (*)(void* user_data)) + .frame_userdata_cb (void (*)(void* user_data)) + .cleanup_userdata_cb (void (*)(void* user_data)) + .event_userdata_cb (void(*)(const sapp_event* event, void* user_data)) + .fail_userdata_cb (void(*)(const char* msg, void* user_data)) + These are the user-data versions of the callback functions. You + can mix those with the standard callbacks that don't have the + user_data argument. + + The function sapp_userdata() can be used to query the user_data + pointer provided in the sapp_desc struct. + + You can also call sapp_query_desc() to get a copy of the + original sapp_desc structure. + + NOTE that there's also an alternative compile mode where sokol_app.h + doesn't "hijack" the main() function. Search below for SOKOL_NO_ENTRY. + + --- Implement the initialization callback function (init_cb), this is called + once after the rendering surface, 3D API and swap chain have been + initialized by sokol_app. All sokol-app functions can be called + from inside the initialization callback, the most useful functions + at this point are: + + int sapp_width(void) + int sapp_height(void) + Returns the current width and height of the default framebuffer in pixels, + this may change from one frame to the next, and it may be different + from the initial size provided in the sapp_desc struct. + + float sapp_widthf(void) + float sapp_heightf(void) + These are alternatives to sapp_width() and sapp_height() which return + the default framebuffer size as float values instead of integer. This + may help to prevent casting back and forth between int and float + in more strongly typed languages than C and C++. + + int sapp_color_format(void) + int sapp_depth_format(void) + The color and depth-stencil pixelformats of the default framebuffer, + as integer values which are compatible with sokol-gfx's + sg_pixel_format enum (so that they can be plugged directly in places + where sg_pixel_format is expected). Possible values are: + + 23 == SG_PIXELFORMAT_RGBA8 + 27 == SG_PIXELFORMAT_BGRA8 + 41 == SG_PIXELFORMAT_DEPTH + 42 == SG_PIXELFORMAT_DEPTH_STENCIL + + int sapp_sample_count(void) + Return the MSAA sample count of the default framebuffer. + + bool sapp_gles2(void) + Returns true if a GLES2 or WebGL context has been created. This + is useful when a GLES3/WebGL2 context was requested but is not + available so that sokol_app.h had to fallback to GLES2/WebGL. + + const void* sapp_metal_get_device(void) + const void* sapp_metal_get_renderpass_descriptor(void) + const void* sapp_metal_get_drawable(void) + If the Metal backend has been selected, these functions return pointers + to various Metal API objects required for rendering, otherwise + they return a null pointer. These void pointers are actually + Objective-C ids converted with a (ARC) __bridge cast so that + the ids can be tunnel through C code. Also note that the returned + pointers to the renderpass-descriptor and drawable may change from one + frame to the next, only the Metal device object is guaranteed to + stay the same. + + const void* sapp_macos_get_window(void) + On macOS, get the NSWindow object pointer, otherwise a null pointer. + Before being used as Objective-C object, the void* must be converted + back with a (ARC) __bridge cast. + + const void* sapp_ios_get_window(void) + On iOS, get the UIWindow object pointer, otherwise a null pointer. + Before being used as Objective-C object, the void* must be converted + back with a (ARC) __bridge cast. + + const void* sapp_win32_get_hwnd(void) + On Windows, get the window's HWND, otherwise a null pointer. The + HWND has been cast to a void pointer in order to be tunneled + through code which doesn't include Windows.h. + + const void* sapp_d3d11_get_device(void) + const void* sapp_d3d11_get_device_context(void) + const void* sapp_d3d11_get_render_target_view(void) + const void* sapp_d3d11_get_depth_stencil_view(void) + Similar to the sapp_metal_* functions, the sapp_d3d11_* functions + return pointers to D3D11 API objects required for rendering, + only if the D3D11 backend has been selected. Otherwise they + return a null pointer. Note that the returned pointers to the + render-target-view and depth-stencil-view may change from one + frame to the next! + + const void* sapp_wgpu_get_device(void) + const void* sapp_wgpu_get_render_view(void) + const void* sapp_wgpu_get_resolve_view(void) + const void* sapp_wgpu_get_depth_stencil_view(void) + These are the WebGPU-specific functions to get the WebGPU + objects and values required for rendering. If sokol_app.h + is not compiled with SOKOL_WGPU, these functions return null. + + const void* sapp_android_get_native_activity(void); + On Android, get the native activity ANativeActivity pointer, otherwise + a null pointer. + + --- Implement the frame-callback function, this function will be called + on the same thread as the init callback, but might be on a different + thread than the sokol_main() function. Note that the size of + the rendering framebuffer might have changed since the frame callback + was called last. Call the functions sapp_width() and sapp_height() + each frame to get the current size. + + --- Optionally implement the event-callback to handle input events. + sokol-app provides the following type of input events: + - a 'virtual key' was pressed down or released + - a single text character was entered (provided as UTF-32 code point) + - a mouse button was pressed down or released (left, right, middle) + - mouse-wheel or 2D scrolling events + - the mouse was moved + - the mouse has entered or left the application window boundaries + - low-level, portable multi-touch events (began, moved, ended, cancelled) + - the application window was resized, iconified or restored + - the application was suspended or restored (on mobile platforms) + - the user or application code has asked to quit the application + - a string was pasted to the system clipboard + - one or more files have been dropped onto the application window + + To explicitly 'consume' an event and prevent that the event is + forwarded for further handling to the operating system, call + sapp_consume_event() from inside the event handler (NOTE that + this behaviour is currently only implemented for some HTML5 + events, support for other platforms and event types will + be added as needed, please open a github ticket and/or provide + a PR if needed). + + NOTE: Do *not* call any 3D API rendering functions in the event + callback function, since the 3D API context may not be active when the + event callback is called (it may work on some platforms and 3D APIs, + but not others, and the exact behaviour may change between + sokol-app versions). + + --- Implement the cleanup-callback function, this is called once + after the user quits the application (see the section + "APPLICATION QUIT" for detailed information on quitting + behaviour, and how to intercept a pending quit - for instance to show a + "Really Quit?" dialog box). Note that the cleanup-callback isn't + guaranteed to be called on the web and mobile platforms. + + MOUSE LOCK (AKA POINTER LOCK, AKA MOUSE CAPTURE) + ================================================ + In normal mouse mode, no mouse movement events are reported when the + mouse leaves the windows client area or hits the screen border (whether + it's one or the other depends on the platform), and the mouse move events + (SAPP_EVENTTYPE_MOUSE_MOVE) contain absolute mouse positions in + framebuffer pixels in the sapp_event items mouse_x and mouse_y, and + relative movement in framebuffer pixels in the sapp_event items mouse_dx + and mouse_dy. + + To get continuous mouse movement (also when the mouse leaves the window + client area or hits the screen border), activate mouse-lock mode + by calling: + + sapp_lock_mouse(true) + + When mouse lock is activated, the mouse pointer is hidden, the + reported absolute mouse position (sapp_event.mouse_x/y) appears + frozen, and the relative mouse movement in sapp_event.mouse_dx/dy + no longer has a direct relation to framebuffer pixels but instead + uses "raw mouse input" (what "raw mouse input" exactly means also + differs by platform). + + To deactivate mouse lock and return to normal mouse mode, call + + sapp_lock_mouse(false) + + And finally, to check if mouse lock is currently active, call + + if (sapp_mouse_locked()) { ... } + + On native platforms, the sapp_lock_mouse() and sapp_mouse_locked() + functions work as expected (mouse lock is activated or deactivated + immediately when sapp_lock_mouse() is called, and sapp_mouse_locked() + also immediately returns the new state after sapp_lock_mouse() + is called. + + On the web platform, sapp_lock_mouse() and sapp_mouse_locked() behave + differently, as dictated by the limitations of the HTML5 Pointer Lock API: + + - sapp_lock_mouse(true) can be called at any time, but it will + only take effect in a 'short-lived input event handler of a specific + type', meaning when one of the following events happens: + - SAPP_EVENTTYPE_MOUSE_DOWN + - SAPP_EVENTTYPE_MOUSE_UP + - SAPP_EVENTTYPE_MOUSE_SCROLL + - SAPP_EVENTYTPE_KEY_UP + - SAPP_EVENTTYPE_KEY_DOWN + - The mouse lock/unlock action on the web platform is asynchronous, + this means that sapp_mouse_locked() won't immediately return + the new status after calling sapp_lock_mouse(), instead the + reported status will only change when the pointer lock has actually + been activated or deactivated in the browser. + - On the web, mouse lock can be deactivated by the user at any time + by pressing the Esc key. When this happens, sokol_app.h behaves + the same as if sapp_lock_mouse(false) is called. + + For things like camera manipulation it's most straightforward to lock + and unlock the mouse right from the sokol_app.h event handler, for + instance the following code enters and leaves mouse lock when the + left mouse button is pressed and released, and then uses the relative + movement information to manipulate a camera (taken from the + cgltf-sapp.c sample in the sokol-samples repository + at https://github.com/floooh/sokol-samples): + + static void input(const sapp_event* ev) { + switch (ev->type) { + case SAPP_EVENTTYPE_MOUSE_DOWN: + if (ev->mouse_button == SAPP_MOUSEBUTTON_LEFT) { + sapp_lock_mouse(true); + } + break; + + case SAPP_EVENTTYPE_MOUSE_UP: + if (ev->mouse_button == SAPP_MOUSEBUTTON_LEFT) { + sapp_lock_mouse(false); + } + break; + + case SAPP_EVENTTYPE_MOUSE_MOVE: + if (sapp_mouse_locked()) { + cam_orbit(&state.camera, ev->mouse_dx * 0.25f, ev->mouse_dy * 0.25f); + } + break; + + default: + break; + } + } + + CLIPBOARD SUPPORT + ================= + Applications can send and receive UTF-8 encoded text data from and to the + system clipboard. By default, clipboard support is disabled and + must be enabled at startup via the following sapp_desc struct + members: + + sapp_desc.enable_clipboard - set to true to enable clipboard support + sapp_desc.clipboard_size - size of the internal clipboard buffer in bytes + + Enabling the clipboard will dynamically allocate a clipboard buffer + for UTF-8 encoded text data of the requested size in bytes, the default + size is 8 KBytes. Strings that don't fit into the clipboard buffer + (including the terminating zero) will be silently clipped, so it's + important that you provide a big enough clipboard size for your + use case. + + To send data to the clipboard, call sapp_set_clipboard_string() with + a pointer to an UTF-8 encoded, null-terminated C-string. + + NOTE that on the HTML5 platform, sapp_set_clipboard_string() must be + called from inside a 'short-lived event handler', and there are a few + other HTML5-specific caveats to workaround. You'll basically have to + tinker until it works in all browsers :/ (maybe the situation will + improve when all browsers agree on and implement the new + HTML5 navigator.clipboard API). + + To get data from the clipboard, check for the SAPP_EVENTTYPE_CLIPBOARD_PASTED + event in your event handler function, and then call sapp_get_clipboard_string() + to obtain the pasted UTF-8 encoded text. + + NOTE that behaviour of sapp_get_clipboard_string() is slightly different + depending on platform: + + - on the HTML5 platform, the internal clipboard buffer will only be updated + right before the SAPP_EVENTTYPE_CLIPBOARD_PASTED event is sent, + and sapp_get_clipboard_string() will simply return the current content + of the clipboard buffer + - on 'native' platforms, the call to sapp_get_clipboard_string() will + update the internal clipboard buffer with the most recent data + from the system clipboard + + Portable code should check for the SAPP_EVENTTYPE_CLIPBOARD_PASTED event, + and then call sapp_get_clipboard_string() right in the event handler. + + The SAPP_EVENTTYPE_CLIPBOARD_PASTED event will be generated by sokol-app + as follows: + + - on macOS: when the Cmd+V key is pressed down + - on HTML5: when the browser sends a 'paste' event to the global 'window' object + - on all other platforms: when the Ctrl+V key is pressed down + + DRAG AND DROP SUPPORT + ===================== + PLEASE NOTE: the drag'n'drop feature works differently on WASM/HTML5 + and on the native desktop platforms (Win32, Linux and macOS) because + of security-related restrictions in the HTML5 drag'n'drop API. The + WASM/HTML5 specifics are described at the end of this documentation + section: + + Like clipboard support, drag'n'drop support must be explicitly enabled + at startup in the sapp_desc struct. + + sapp_desc sokol_main() { + return (sapp_desc) { + .enable_dragndrop = true, // default is false + ... + }; + } + + You can also adjust the maximum number of files that are accepted + in a drop operation, and the maximum path length in bytes if needed: + + sapp_desc sokol_main() { + return (sapp_desc) { + .enable_dragndrop = true, // default is false + .max_dropped_files = 8, // default is 1 + .max_dropped_file_path_length = 8192, // in bytes, default is 2048 + ... + }; + } + + When drag'n'drop is enabled, the event callback will be invoked with an + event of type SAPP_EVENTTYPE_FILES_DROPPED whenever the user drops files on + the application window. + + After the SAPP_EVENTTYPE_FILES_DROPPED is received, you can query the + number of dropped files, and their absolute paths by calling separate + functions: + + void on_event(const sapp_event* ev) { + if (ev->type == SAPP_EVENTTYPE_FILES_DROPPED) { + + // the mouse position where the drop happened + float x = ev->mouse_x; + float y = ev->mouse_y; + + // get the number of files and their paths like this: + const int num_dropped_files = sapp_get_num_dropped_files(); + for (int i = 0; i < num_dropped_files; i++) { + const char* path = sapp_get_dropped_file_path(i); + ... + } + } + } + + The returned file paths are UTF-8 encoded strings. + + You can call sapp_get_num_dropped_files() and sapp_get_dropped_file_path() + anywhere, also outside the event handler callback, but be aware that the + file path strings will be overwritten with the next drop operation. + + In any case, sapp_get_dropped_file_path() will never return a null pointer, + instead an empty string "" will be returned if the drag'n'drop feature + hasn't been enabled, the last drop-operation failed, or the file path index + is out of range. + + Drag'n'drop caveats: + + - if more files are dropped in a single drop-action + than sapp_desc.max_dropped_files, the additional + files will be silently ignored + - if any of the file paths is longer than + sapp_desc.max_dropped_file_path_length (in number of bytes, after UTF-8 + encoding) the entire drop operation will be silently ignored (this + needs some sort of error feedback in the future) + - no mouse positions are reported while the drag is in + process, this may change in the future + + Drag'n'drop on HTML5/WASM: + + The HTML5 drag'n'drop API doesn't return file paths, but instead + black-box 'file objects' which must be used to load the content + of dropped files. This is the reason why sokol_app.h adds two + HTML5-specific functions to the drag'n'drop API: + + uint32_t sapp_html5_get_dropped_file_size(int index) + Returns the size in bytes of a dropped file. + + void sapp_html5_fetch_dropped_file(const sapp_html5_fetch_request* request) + Asynchronously loads the content of a dropped file into a + provided memory buffer (which must be big enough to hold + the file content) + + To start loading the first dropped file after an SAPP_EVENTTYPE_FILES_DROPPED + event is received: + + sapp_html5_fetch_dropped_file(&(sapp_html5_fetch_request){ + .dropped_file_index = 0, + .callback = fetch_cb + .buffer_ptr = buf, + .buffer_size = buf_size, + .user_data = ... + }); + + Make sure that the memory pointed to by 'buf' stays valid until the + callback function is called! + + As result of the asynchronous loading operation (no matter if succeeded or + failed) the 'fetch_cb' function will be called: + + void fetch_cb(const sapp_html5_fetch_response* response) { + // IMPORTANT: check if the loading operation actually succeeded: + if (response->succeeded) { + // the size of the loaded file: + const uint32_t num_bytes = response->fetched_size; + // and the pointer to the data (same as 'buf' in the fetch-call): + const void* ptr = response->buffer_ptr; + } + else { + // on error check the error code: + switch (response->error_code) { + case SAPP_HTML5_FETCH_ERROR_BUFFER_TOO_SMALL: + ... + break; + case SAPP_HTML5_FETCH_ERROR_OTHER: + ... + break; + } + } + } + + Check the droptest-sapp example for a real-world example which works + both on native platforms and the web: + + https://github.com/floooh/sokol-samples/blob/master/sapp/droptest-sapp.c + + HIGH-DPI RENDERING + ================== + You can set the sapp_desc.high_dpi flag during initialization to request + a full-resolution framebuffer on HighDPI displays. The default behaviour + is sapp_desc.high_dpi=false, this means that the application will + render to a lower-resolution framebuffer on HighDPI displays and the + rendered content will be upscaled by the window system composer. + + In a HighDPI scenario, you still request the same window size during + sokol_main(), but the framebuffer sizes returned by sapp_width() + and sapp_height() will be scaled up according to the DPI scaling + ratio. You can also get a DPI scaling factor with the function + sapp_dpi_scale(). + + Here's an example on a Mac with Retina display: + + sapp_desc sokol_main() { + return (sapp_desc) { + .width = 640, + .height = 480, + .high_dpi = true, + ... + }; + } + + The functions sapp_width(), sapp_height() and sapp_dpi_scale() will + return the following values: + + sapp_width -> 1280 + sapp_height -> 960 + sapp_dpi_scale -> 2.0 + + If the high_dpi flag is false, or you're not running on a Retina display, + the values would be: + + sapp_width -> 640 + sapp_height -> 480 + sapp_dpi_scale -> 1.0 + + APPLICATION QUIT + ================ + Without special quit handling, a sokol_app.h application will quit + 'gracefully' when the user clicks the window close-button unless a + platform's application model prevents this (e.g. on web or mobile). + 'Graceful exit' means that the application-provided cleanup callback will + be called before the application quits. + + On native desktop platforms sokol_app.h provides more control over the + application-quit-process. It's possible to initiate a 'programmatic quit' + from the application code, and a quit initiated by the application user can + be intercepted (for instance to show a custom dialog box). + + This 'programmatic quit protocol' is implemented through 3 functions + and 1 event: + + - sapp_quit(): This function simply quits the application without + giving the user a chance to intervene. Usually this might + be called when the user clicks the 'Ok' button in a 'Really Quit?' + dialog box + - sapp_request_quit(): Calling sapp_request_quit() will send the + event SAPP_EVENTTYPE_QUIT_REQUESTED to the applications event handler + callback, giving the user code a chance to intervene and cancel the + pending quit process (for instance to show a 'Really Quit?' dialog + box). If the event handler callback does nothing, the application + will be quit as usual. To prevent this, call the function + sapp_cancel_quit() from inside the event handler. + - sapp_cancel_quit(): Cancels a pending quit request, either initiated + by the user clicking the window close button, or programmatically + by calling sapp_request_quit(). The only place where calling this + function makes sense is from inside the event handler callback when + the SAPP_EVENTTYPE_QUIT_REQUESTED event has been received. + - SAPP_EVENTTYPE_QUIT_REQUESTED: this event is sent when the user + clicks the window's close button or application code calls the + sapp_request_quit() function. The event handler callback code can handle + this event by calling sapp_cancel_quit() to cancel the quit. + If the event is ignored, the application will quit as usual. + + On the web platform, the quit behaviour differs from native platforms, + because of web-specific restrictions: + + A `programmatic quit` initiated by calling sapp_quit() or + sapp_request_quit() will work as described above: the cleanup callback is + called, platform-specific cleanup is performed (on the web + this means that JS event handlers are unregisters), and then + the request-animation-loop will be exited. However that's all. The + web page itself will continue to exist (e.g. it's not possible to + programmatically close the browser tab). + + On the web it's also not possible to run custom code when the user + closes a brower tab, so it's not possible to prevent this with a + fancy custom dialog box. + + Instead the standard "Leave Site?" dialog box can be activated (or + deactivated) with the following function: + + sapp_html5_ask_leave_site(bool ask); + + The initial state of the associated internal flag can be provided + at startup via sapp_desc.html5_ask_leave_site. + + This feature should only be used sparingly in critical situations - for + instance when the user would loose data - since popping up modal dialog + boxes is considered quite rude in the web world. Note that there's no way + to customize the content of this dialog box or run any code as a result + of the user's decision. Also note that the user must have interacted with + the site before the dialog box will appear. These are all security measures + to prevent fishing. + + The Dear ImGui HighDPI sample contains example code of how to + implement a 'Really Quit?' dialog box with Dear ImGui (native desktop + platforms only), and for showing the hardwired "Leave Site?" dialog box + when running on the web platform: + + https://floooh.github.io/sokol-html5/wasm/imgui-highdpi-sapp.html + + FULLSCREEN + ========== + If the sapp_desc.fullscreen flag is true, sokol-app will try to create + a fullscreen window on platforms with a 'proper' window system + (mobile devices will always use fullscreen). The implementation details + depend on the target platform, in general sokol-app will use a + 'soft approach' which doesn't interfere too much with the platform's + window system (for instance borderless fullscreen window instead of + a 'real' fullscreen mode). Such details might change over time + as sokol-app is adapted for different needs. + + The most important effect of fullscreen mode to keep in mind is that + the requested canvas width and height will be ignored for the initial + window size, calling sapp_width() and sapp_height() will instead return + the resolution of the fullscreen canvas (however the provided size + might still be used for the non-fullscreen window, in case the user can + switch back from fullscreen- to windowed-mode). + + To toggle fullscreen mode programmatically, call sapp_toggle_fullscreen(). + + To check if the application window is currently in fullscreen mode, + call sapp_is_fullscreen(). + + WINDOW ICON SUPPORT + =================== + Some sokol_app.h backends allow to change the window icon programmatically: + + - on Win32: the small icon in the window's title bar, and the + bigger icon in the task bar + - on Linux: highly dependent on the used window manager, but usually + the window's title bar icon and/or the task bar icon + - on HTML5: the favicon shown in the page's browser tab + + NOTE that it is not possible to set the actual application icon which is + displayed by the operating system on the desktop or 'home screen'. Those + icons must be provided 'traditionally' through operating-system-specific + resources which are associated with the application (sokol_app.h might + later support setting the window icon from platform specific resource data + though). + + There are two ways to set the window icon: + + - at application start in the sokol_main() function by initializing + the sapp_desc.icon nested struct + - or later by calling the function sapp_set_icon() + + As a convenient shortcut, sokol_app.h comes with a builtin default-icon + (a rainbow-colored 'S', which at least looks a bit better than the Windows + default icon for applications), which can be activated like this: + + At startup in sokol_main(): + + sapp_desc sokol_main(...) { + return (sapp_desc){ + ... + icon.sokol_default = true + }; + } + + Or later by calling: + + sapp_set_icon(&(sapp_icon_desc){ .sokol_default = true }); + + NOTE that a completely zero-initialized sapp_icon_desc struct will not + update the window icon in any way. This is an 'escape hatch' so that you + can handle the window icon update yourself (or if you do this already, + sokol_app.h won't get in your way, in this case just leave the + sapp_desc.icon struct zero-initialized). + + Providing your own icon images works exactly like in GLFW (down to the + data format): + + You provide one or more 'candidate images' in different sizes, and the + sokol_app.h platform backends pick the best match for the specific backend + and icon type. + + For each candidate image, you need to provide: + + - the width in pixels + - the height in pixels + - and the actual pixel data in RGBA8 pixel format (e.g. 0xFFCC8844 + on a little-endian CPU means: alpha=0xFF, blue=0xCC, green=0x88, red=0x44) + + For instance, if you have 3 candidate images (small, medium, big) of + sizes 16x16, 32x32 and 64x64 the corresponding sapp_icon_desc struct is setup + like this: + + // the actual pixel data (RGBA8, origin top-left) + const uint32_t small[16][16] = { ... }; + const uint32_t medium[32][32] = { ... }; + const uint32_t big[64][64] = { ... }; + + const sapp_icon_desc icon_desc = { + .images = { + { .width = 16, .height = 16, .pixels = SAPP_RANGE(small) }, + { .width = 32, .height = 32, .pixels = SAPP_RANGE(medium) }, + // ...or without the SAPP_RANGE helper macro: + { .width = 64, .height = 64, .pixels = { .ptr=big, .size=sizeof(big) } } + } + }; + + An sapp_icon_desc struct initialized like this can then either be applied + at application start in sokol_main: + + sapp_desc sokol_main(...) { + return (sapp_desc){ + ... + icon = icon_desc + }; + } + + ...or later by calling sapp_set_icon(): + + sapp_set_icon(&icon_desc); + + Some window icon caveats: + + - once the window icon has been updated, there's no way to go back to + the platform's default icon, this is because some platforms (Linux + and HTML5) don't switch the icon visual back to the default even if + the custom icon is deleted or removed + - on HTML5, if the sokol_app.h icon doesn't show up in the browser + tab, check that there's no traditional favicon 'link' element + is defined in the page's index.html, sokol_app.h will only + append a new favicon link element, but not delete any manually + defined favicon in the page + + For an example and test of the window icon feature, check out the the + 'icon-sapp' sample on the sokol-samples git repository. + + ONSCREEN KEYBOARD + ================= + On some platforms which don't provide a physical keyboard, sokol-app + can display the platform's integrated onscreen keyboard for text + input. To request that the onscreen keyboard is shown, call + + sapp_show_keyboard(true); + + Likewise, to hide the keyboard call: + + sapp_show_keyboard(false); + + Note that on the web platform, the keyboard can only be shown from + inside an input handler. On such platforms, sapp_show_keyboard() + will only work as expected when it is called from inside the + sokol-app event callback function. When called from other places, + an internal flag will be set, and the onscreen keyboard will be + called at the next 'legal' opportunity (when the next input event + is handled). + + OPTIONAL: DON'T HIJACK main() (#define SOKOL_NO_ENTRY) + ====================================================== + In its default configuration, sokol_app.h "hijacks" the platform's + standard main() function. This was done because different platforms + have different main functions which are not compatible with + C's main() (for instance WinMain on Windows has completely different + arguments). However, this "main hijacking" posed a problem for + usage scenarios like integrating sokol_app.h with other languages than + C or C++, so an alternative SOKOL_NO_ENTRY mode has been added + in which the user code provides the platform's main function: + + - define SOKOL_NO_ENTRY before including the sokol_app.h implementation + - do *not* provide a sokol_main() function + - instead provide the standard main() function of the platform + - from the main function, call the function ```sapp_run()``` which + takes a pointer to an ```sapp_desc``` structure. + - ```sapp_run()``` takes over control and calls the provided init-, frame-, + shutdown- and event-callbacks just like in the default model, it + will only return when the application quits (or not at all on some + platforms, like emscripten) + + NOTE: SOKOL_NO_ENTRY is currently not supported on Android. + + WINDOWS CONSOLE OUTPUT + ====================== + On Windows, regular windowed applications don't show any stdout/stderr text + output, which can be a bit of a hassle for printf() debugging or generally + logging text to the console. Also, console output by default uses a local + codepage setting and thus international UTF-8 encoded text is printed + as garbage. + + To help with these issues, sokol_app.h can be configured at startup + via the following Windows-specific sapp_desc flags: + + sapp_desc.win32_console_utf8 (default: false) + When set to true, the output console codepage will be switched + to UTF-8 (and restored to the original codepage on exit) + + sapp_desc.win32_console_attach (default: false) + When set to true, stdout and stderr will be attached to the + console of the parent process (if the parent process actually + has a console). This means that if the application was started + in a command line window, stdout and stderr output will be printed + to the terminal, just like a regular command line program. But if + the application is started via double-click, it will behave like + a regular UI application, and stdout/stderr will not be visible. + + sapp_desc.win32_console_create (default: false) + When set to true, a new console window will be created and + stdout/stderr will be redirected to that console window. It + doesn't matter if the application is started from the command + line or via double-click. + + TEMP NOTE DUMP + ============== + - onscreen keyboard support on Android requires Java :(, should we even bother? + - sapp_desc needs a bool whether to initialize depth-stencil surface + - GL context initialization needs more control (at least what GL version to initialize) + - application icon + - the UPDATE_CURSOR event currently behaves differently between Win32 and OSX + (Win32 sends the event each frame when the mouse moves and is inside the window + client area, OSX sends it only once when the mouse enters the client area) + - the Android implementation calls cleanup_cb() and destroys the egl context in onDestroy + at the latest but should do it earlier, in onStop, as an app is "killable" after onStop + on Android Honeycomb and later (it can't be done at the moment as the app may be started + again after onStop and the sokol lifecycle does not yet handle context teardown/bringup) + + + LICENSE + ======= + zlib/libpng license + + Copyright (c) 2018 Andre Weissflog + + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the + use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ +#define SOKOL_APP_INCLUDED (1) +#include // size_t +#include +#include + +#if defined(SOKOL_API_DECL) && !defined(SOKOL_APP_API_DECL) +#define SOKOL_APP_API_DECL SOKOL_API_DECL +#endif +#ifndef SOKOL_APP_API_DECL +#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_APP_IMPL) +#define SOKOL_APP_API_DECL __declspec(dllexport) +#elif defined(_WIN32) && defined(SOKOL_DLL) +#define SOKOL_APP_API_DECL __declspec(dllimport) +#else +#define SOKOL_APP_API_DECL extern +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* misc constants */ +enum { + SAPP_MAX_TOUCHPOINTS = 8, + SAPP_MAX_MOUSEBUTTONS = 3, + SAPP_MAX_KEYCODES = 512, + SAPP_MAX_ICONIMAGES = 8, +}; + +/* + sapp_event_type + + The type of event that's passed to the event handler callback + in the sapp_event.type field. These are not just "traditional" + input events, but also notify the application about state changes + or other user-invoked actions. +*/ +typedef enum sapp_event_type { + SAPP_EVENTTYPE_INVALID, + SAPP_EVENTTYPE_KEY_DOWN, + SAPP_EVENTTYPE_KEY_UP, + SAPP_EVENTTYPE_CHAR, + SAPP_EVENTTYPE_MOUSE_DOWN, + SAPP_EVENTTYPE_MOUSE_UP, + SAPP_EVENTTYPE_MOUSE_SCROLL, + SAPP_EVENTTYPE_MOUSE_MOVE, + SAPP_EVENTTYPE_MOUSE_ENTER, + SAPP_EVENTTYPE_MOUSE_LEAVE, + SAPP_EVENTTYPE_TOUCHES_BEGAN, + SAPP_EVENTTYPE_TOUCHES_MOVED, + SAPP_EVENTTYPE_TOUCHES_ENDED, + SAPP_EVENTTYPE_TOUCHES_CANCELLED, + SAPP_EVENTTYPE_RESIZED, + SAPP_EVENTTYPE_ICONIFIED, + SAPP_EVENTTYPE_RESTORED, + SAPP_EVENTTYPE_FOCUSED, + SAPP_EVENTTYPE_UNFOCUSED, + SAPP_EVENTTYPE_SUSPENDED, + SAPP_EVENTTYPE_RESUMED, + SAPP_EVENTTYPE_UPDATE_CURSOR, + SAPP_EVENTTYPE_QUIT_REQUESTED, + SAPP_EVENTTYPE_CLIPBOARD_PASTED, + SAPP_EVENTTYPE_FILES_DROPPED, + _SAPP_EVENTTYPE_NUM, + _SAPP_EVENTTYPE_FORCE_U32 = 0x7FFFFFFF +} sapp_event_type; + +/* + sapp_keycode + + The 'virtual keycode' of a KEY_DOWN or KEY_UP event in the + struct field sapp_event.key_code. + + Note that the keycode values are identical with GLFW. +*/ +typedef enum sapp_keycode { + SAPP_KEYCODE_INVALID = 0, + SAPP_KEYCODE_SPACE = 32, + SAPP_KEYCODE_APOSTROPHE = 39, /* ' */ + SAPP_KEYCODE_COMMA = 44, /* , */ + SAPP_KEYCODE_MINUS = 45, /* - */ + SAPP_KEYCODE_PERIOD = 46, /* . */ + SAPP_KEYCODE_SLASH = 47, /* / */ + SAPP_KEYCODE_0 = 48, + SAPP_KEYCODE_1 = 49, + SAPP_KEYCODE_2 = 50, + SAPP_KEYCODE_3 = 51, + SAPP_KEYCODE_4 = 52, + SAPP_KEYCODE_5 = 53, + SAPP_KEYCODE_6 = 54, + SAPP_KEYCODE_7 = 55, + SAPP_KEYCODE_8 = 56, + SAPP_KEYCODE_9 = 57, + SAPP_KEYCODE_SEMICOLON = 59, /* ; */ + SAPP_KEYCODE_EQUAL = 61, /* = */ + SAPP_KEYCODE_A = 65, + SAPP_KEYCODE_B = 66, + SAPP_KEYCODE_C = 67, + SAPP_KEYCODE_D = 68, + SAPP_KEYCODE_E = 69, + SAPP_KEYCODE_F = 70, + SAPP_KEYCODE_G = 71, + SAPP_KEYCODE_H = 72, + SAPP_KEYCODE_I = 73, + SAPP_KEYCODE_J = 74, + SAPP_KEYCODE_K = 75, + SAPP_KEYCODE_L = 76, + SAPP_KEYCODE_M = 77, + SAPP_KEYCODE_N = 78, + SAPP_KEYCODE_O = 79, + SAPP_KEYCODE_P = 80, + SAPP_KEYCODE_Q = 81, + SAPP_KEYCODE_R = 82, + SAPP_KEYCODE_S = 83, + SAPP_KEYCODE_T = 84, + SAPP_KEYCODE_U = 85, + SAPP_KEYCODE_V = 86, + SAPP_KEYCODE_W = 87, + SAPP_KEYCODE_X = 88, + SAPP_KEYCODE_Y = 89, + SAPP_KEYCODE_Z = 90, + SAPP_KEYCODE_LEFT_BRACKET = 91, /* [ */ + SAPP_KEYCODE_BACKSLASH = 92, /* \ */ + SAPP_KEYCODE_RIGHT_BRACKET = 93, /* ] */ + SAPP_KEYCODE_GRAVE_ACCENT = 96, /* ` */ + SAPP_KEYCODE_WORLD_1 = 161, /* non-US #1 */ + SAPP_KEYCODE_WORLD_2 = 162, /* non-US #2 */ + SAPP_KEYCODE_ESCAPE = 256, + SAPP_KEYCODE_ENTER = 257, + SAPP_KEYCODE_TAB = 258, + SAPP_KEYCODE_BACKSPACE = 259, + SAPP_KEYCODE_INSERT = 260, + SAPP_KEYCODE_DELETE = 261, + SAPP_KEYCODE_RIGHT = 262, + SAPP_KEYCODE_LEFT = 263, + SAPP_KEYCODE_DOWN = 264, + SAPP_KEYCODE_UP = 265, + SAPP_KEYCODE_PAGE_UP = 266, + SAPP_KEYCODE_PAGE_DOWN = 267, + SAPP_KEYCODE_HOME = 268, + SAPP_KEYCODE_END = 269, + SAPP_KEYCODE_CAPS_LOCK = 280, + SAPP_KEYCODE_SCROLL_LOCK = 281, + SAPP_KEYCODE_NUM_LOCK = 282, + SAPP_KEYCODE_PRINT_SCREEN = 283, + SAPP_KEYCODE_PAUSE = 284, + SAPP_KEYCODE_F1 = 290, + SAPP_KEYCODE_F2 = 291, + SAPP_KEYCODE_F3 = 292, + SAPP_KEYCODE_F4 = 293, + SAPP_KEYCODE_F5 = 294, + SAPP_KEYCODE_F6 = 295, + SAPP_KEYCODE_F7 = 296, + SAPP_KEYCODE_F8 = 297, + SAPP_KEYCODE_F9 = 298, + SAPP_KEYCODE_F10 = 299, + SAPP_KEYCODE_F11 = 300, + SAPP_KEYCODE_F12 = 301, + SAPP_KEYCODE_F13 = 302, + SAPP_KEYCODE_F14 = 303, + SAPP_KEYCODE_F15 = 304, + SAPP_KEYCODE_F16 = 305, + SAPP_KEYCODE_F17 = 306, + SAPP_KEYCODE_F18 = 307, + SAPP_KEYCODE_F19 = 308, + SAPP_KEYCODE_F20 = 309, + SAPP_KEYCODE_F21 = 310, + SAPP_KEYCODE_F22 = 311, + SAPP_KEYCODE_F23 = 312, + SAPP_KEYCODE_F24 = 313, + SAPP_KEYCODE_F25 = 314, + SAPP_KEYCODE_KP_0 = 320, + SAPP_KEYCODE_KP_1 = 321, + SAPP_KEYCODE_KP_2 = 322, + SAPP_KEYCODE_KP_3 = 323, + SAPP_KEYCODE_KP_4 = 324, + SAPP_KEYCODE_KP_5 = 325, + SAPP_KEYCODE_KP_6 = 326, + SAPP_KEYCODE_KP_7 = 327, + SAPP_KEYCODE_KP_8 = 328, + SAPP_KEYCODE_KP_9 = 329, + SAPP_KEYCODE_KP_DECIMAL = 330, + SAPP_KEYCODE_KP_DIVIDE = 331, + SAPP_KEYCODE_KP_MULTIPLY = 332, + SAPP_KEYCODE_KP_SUBTRACT = 333, + SAPP_KEYCODE_KP_ADD = 334, + SAPP_KEYCODE_KP_ENTER = 335, + SAPP_KEYCODE_KP_EQUAL = 336, + SAPP_KEYCODE_LEFT_SHIFT = 340, + SAPP_KEYCODE_LEFT_CONTROL = 341, + SAPP_KEYCODE_LEFT_ALT = 342, + SAPP_KEYCODE_LEFT_SUPER = 343, + SAPP_KEYCODE_RIGHT_SHIFT = 344, + SAPP_KEYCODE_RIGHT_CONTROL = 345, + SAPP_KEYCODE_RIGHT_ALT = 346, + SAPP_KEYCODE_RIGHT_SUPER = 347, + SAPP_KEYCODE_MENU = 348, +} sapp_keycode; + +/* + sapp_touchpoint + + Describes a single touchpoint in a multitouch event (TOUCHES_BEGAN, + TOUCHES_MOVED, TOUCHES_ENDED). + + Touch points are stored in the nested array sapp_event.touches[], + and the number of touches is stored in sapp_event.num_touches. +*/ +typedef struct sapp_touchpoint { + uintptr_t identifier; + float pos_x; + float pos_y; + bool changed; +} sapp_touchpoint; + +/* + sapp_mousebutton + + The currently pressed mouse button in the events MOUSE_DOWN + and MOUSE_UP, stored in the struct field sapp_event.mouse_button. +*/ +typedef enum sapp_mousebutton { + SAPP_MOUSEBUTTON_LEFT = 0x0, + SAPP_MOUSEBUTTON_RIGHT = 0x1, + SAPP_MOUSEBUTTON_MIDDLE = 0x2, + SAPP_MOUSEBUTTON_INVALID = 0x100, +} sapp_mousebutton; + +/* + These are currently pressed modifier keys (and mouse buttons) which are + passed in the event struct field sapp_event.modifiers. +*/ +enum { + SAPP_MODIFIER_SHIFT = 0x1, // left or right shift key + SAPP_MODIFIER_CTRL = 0x2, // left or right control key + SAPP_MODIFIER_ALT = 0x4, // left or right alt key + SAPP_MODIFIER_SUPER = 0x8, // left or right 'super' key + SAPP_MODIFIER_LMB = 0x100, // left mouse button + SAPP_MODIFIER_RMB = 0x200, // right mouse button + SAPP_MODIFIER_MMB = 0x400, // middle mouse button +}; + +/* + sapp_event + + This is an all-in-one event struct passed to the event handler + user callback function. Note that it depends on the event + type what struct fields actually contain useful values, so you + should first check the event type before reading other struct + fields. +*/ +typedef struct sapp_event { + uint64_t frame_count; // current frame counter, always valid, useful for checking if two events were issued in the same frame + sapp_event_type type; // the event type, always valid + sapp_keycode key_code; // the virtual key code, only valid in KEY_UP, KEY_DOWN + uint32_t char_code; // the UTF-32 character code, only valid in CHAR events + bool key_repeat; // true if this is a key-repeat event, valid in KEY_UP, KEY_DOWN and CHAR + uint32_t modifiers; // current modifier keys, valid in all key-, char- and mouse-events + sapp_mousebutton mouse_button; // mouse button that was pressed or released, valid in MOUSE_DOWN, MOUSE_UP + float mouse_x; // current horizontal mouse position in pixels, always valid except during mouse lock + float mouse_y; // current vertical mouse position in pixels, always valid except during mouse lock + float mouse_dx; // relative horizontal mouse movement since last frame, always valid + float mouse_dy; // relative vertical mouse movement since last frame, always valid + float scroll_x; // horizontal mouse wheel scroll distance, valid in MOUSE_SCROLL events + float scroll_y; // vertical mouse wheel scroll distance, valid in MOUSE_SCROLL events + int num_touches; // number of valid items in the touches[] array + sapp_touchpoint touches[SAPP_MAX_TOUCHPOINTS]; // current touch points, valid in TOUCHES_BEGIN, TOUCHES_MOVED, TOUCHES_ENDED + int window_width; // current window- and framebuffer sizes in pixels, always valid + int window_height; + int framebuffer_width; // = window_width * dpi_scale + int framebuffer_height; // = window_height * dpi_scale +} sapp_event; + +/* + sg_range + + A general pointer/size-pair struct and constructor macros for passing binary blobs + into sokol_app.h. +*/ +typedef struct sapp_range { + const void* ptr; + size_t size; +} sapp_range; +// disabling this for every includer isn't great, but the warnings are also quite pointless +#if defined(_MSC_VER) +#pragma warning(disable:4221) /* /W4 only: nonstandard extension used: 'x': cannot be initialized using address of automatic variable 'y' */ +#pragma warning(disable:4204) /* VS2015: nonstandard extension used: non-constant aggregate initializer */ +#endif +#if defined(__cplusplus) +#define SAPP_RANGE(x) sapp_range{ &x, sizeof(x) } +#else +#define SAPP_RANGE(x) (sapp_range){ &x, sizeof(x) } +#endif + +/* + sapp_image_desc + + This is used to describe image data to sokol_app.h (at first, window + icons, later maybe cursor images). + + Note that the actual image pixel format depends on the use case: + + - window icon pixels are RGBA8 + - cursor images are ??? (FIXME) +*/ +typedef struct sapp_image_desc { + int width; + int height; + sapp_range pixels; +} sapp_image_desc; + +/* + sapp_icon_desc + + An icon description structure for use in sapp_desc.icon and + sapp_set_icon(). + + When setting a custom image, the application can provide a number of + candidates differing in size, and sokol_app.h will pick the image(s) + closest to the size expected by the platform's window system. + + To set sokol-app's default icon, set .sokol_default to true. + + Otherwise provide candidate images of different sizes in the + images[] array. + + If both the sokol_default flag is set to true, any image candidates + will be ignored and the sokol_app.h default icon will be set. +*/ +typedef struct sapp_icon_desc { + bool sokol_default; + sapp_image_desc images[SAPP_MAX_ICONIMAGES]; +} sapp_icon_desc; + + +typedef struct sapp_desc { + void (*init_cb)(void); // these are the user-provided callbacks without user data + void (*frame_cb)(void); + void (*cleanup_cb)(void); + void (*event_cb)(const sapp_event*); + void (*fail_cb)(const char*); + + void* user_data; // these are the user-provided callbacks with user data + void (*init_userdata_cb)(void*); + void (*frame_userdata_cb)(void*); + void (*cleanup_userdata_cb)(void*); + void (*event_userdata_cb)(const sapp_event*, void*); + void (*fail_userdata_cb)(const char*, void*); + + int width; // the preferred width of the window / canvas + int height; // the preferred height of the window / canvas + int sample_count; // MSAA sample count + int swap_interval; // the preferred swap interval (ignored on some platforms) + bool high_dpi; // whether the rendering canvas is full-resolution on HighDPI displays + bool fullscreen; // whether the window should be created in fullscreen mode + bool alpha; // whether the framebuffer should have an alpha channel (ignored on some platforms) + const char* window_title; // the window title as UTF-8 encoded string + bool user_cursor; // if true, user is expected to manage cursor image in SAPP_EVENTTYPE_UPDATE_CURSOR + bool enable_clipboard; // enable clipboard access, default is false + int clipboard_size; // max size of clipboard content in bytes + bool enable_dragndrop; // enable file dropping (drag'n'drop), default is false + int max_dropped_files; // max number of dropped files to process (default: 1) + int max_dropped_file_path_length; // max length in bytes of a dropped UTF-8 file path (default: 2048) + sapp_icon_desc icon; // the initial window icon to set + + /* backend-specific options */ + bool gl_force_gles2; // if true, setup GLES2/WebGL even if GLES3/WebGL2 is available + bool win32_console_utf8; // if true, set the output console codepage to UTF-8 + bool win32_console_create; // if true, attach stdout/stderr to a new console window + bool win32_console_attach; // if true, attach stdout/stderr to parent process + const char* html5_canvas_name; // the name (id) of the HTML5 canvas element, default is "canvas" + bool html5_canvas_resize; // if true, the HTML5 canvas size is set to sapp_desc.width/height, otherwise canvas size is tracked + bool html5_preserve_drawing_buffer; // HTML5 only: whether to preserve default framebuffer content between frames + bool html5_premultiplied_alpha; // HTML5 only: whether the rendered pixels use premultiplied alpha convention + bool html5_ask_leave_site; // initial state of the internal html5_ask_leave_site flag (see sapp_html5_ask_leave_site()) + bool ios_keyboard_resizes_canvas; // if true, showing the iOS keyboard shrinks the canvas +} sapp_desc; + +/* HTML5 specific: request and response structs for + asynchronously loading dropped-file content. +*/ +typedef enum sapp_html5_fetch_error { + SAPP_HTML5_FETCH_ERROR_NO_ERROR, + SAPP_HTML5_FETCH_ERROR_BUFFER_TOO_SMALL, + SAPP_HTML5_FETCH_ERROR_OTHER, +} sapp_html5_fetch_error; + +typedef struct sapp_html5_fetch_response { + bool succeeded; /* true if the loading operation has succeeded */ + sapp_html5_fetch_error error_code; + int file_index; /* index of the dropped file (0..sapp_get_num_dropped_filed()-1) */ + uint32_t fetched_size; /* size in bytes of loaded data */ + void* buffer_ptr; /* pointer to user-provided buffer which contains the loaded data */ + uint32_t buffer_size; /* size of user-provided buffer (buffer_size >= fetched_size) */ + void* user_data; /* user-provided user data pointer */ +} sapp_html5_fetch_response; + +typedef struct sapp_html5_fetch_request { + int dropped_file_index; /* 0..sapp_get_num_dropped_files()-1 */ + void (*callback)(const sapp_html5_fetch_response*); /* response callback function pointer (required) */ + void* buffer_ptr; /* pointer to buffer to load data into */ + uint32_t buffer_size; /* size in bytes of buffer */ + void* user_data; /* optional userdata pointer */ +} sapp_html5_fetch_request; + +/* user-provided functions */ +extern sapp_desc sokol_main(int argc, char* argv[]); + +/* returns true after sokol-app has been initialized */ +SOKOL_APP_API_DECL bool sapp_isvalid(void); +/* returns the current framebuffer width in pixels */ +SOKOL_APP_API_DECL int sapp_width(void); +/* same as sapp_width(), but returns float */ +SOKOL_APP_API_DECL float sapp_widthf(void); +/* returns the current framebuffer height in pixels */ +SOKOL_APP_API_DECL int sapp_height(void); +/* same as sapp_height(), but returns float */ +SOKOL_APP_API_DECL float sapp_heightf(void); +/* get default framebuffer color pixel format */ +SOKOL_APP_API_DECL int sapp_color_format(void); +/* get default framebuffer depth pixel format */ +SOKOL_APP_API_DECL int sapp_depth_format(void); +/* get default framebuffer sample count */ +SOKOL_APP_API_DECL int sapp_sample_count(void); +/* returns true when high_dpi was requested and actually running in a high-dpi scenario */ +SOKOL_APP_API_DECL bool sapp_high_dpi(void); +/* returns the dpi scaling factor (window pixels to framebuffer pixels) */ +SOKOL_APP_API_DECL float sapp_dpi_scale(void); +/* show or hide the mobile device onscreen keyboard */ +SOKOL_APP_API_DECL void sapp_show_keyboard(bool show); +/* return true if the mobile device onscreen keyboard is currently shown */ +SOKOL_APP_API_DECL bool sapp_keyboard_shown(void); +/* query fullscreen mode */ +SOKOL_APP_API_DECL bool sapp_is_fullscreen(void); +/* toggle fullscreen mode */ +SOKOL_APP_API_DECL void sapp_toggle_fullscreen(void); +/* show or hide the mouse cursor */ +SOKOL_APP_API_DECL void sapp_show_mouse(bool show); +/* show or hide the mouse cursor */ +SOKOL_APP_API_DECL bool sapp_mouse_shown(void); +/* enable/disable mouse-pointer-lock mode */ +SOKOL_APP_API_DECL void sapp_lock_mouse(bool lock); +/* return true if in mouse-pointer-lock mode (this may toggle a few frames later) */ +SOKOL_APP_API_DECL bool sapp_mouse_locked(void); +/* return the userdata pointer optionally provided in sapp_desc */ +SOKOL_APP_API_DECL void* sapp_userdata(void); +/* return a copy of the sapp_desc structure */ +SOKOL_APP_API_DECL sapp_desc sapp_query_desc(void); +/* initiate a "soft quit" (sends SAPP_EVENTTYPE_QUIT_REQUESTED) */ +SOKOL_APP_API_DECL void sapp_request_quit(void); +/* cancel a pending quit (when SAPP_EVENTTYPE_QUIT_REQUESTED has been received) */ +SOKOL_APP_API_DECL void sapp_cancel_quit(void); +/* initiate a "hard quit" (quit application without sending SAPP_EVENTTYPE_QUIT_REQUSTED) */ +SOKOL_APP_API_DECL void sapp_quit(void); +/* call from inside event callback to consume the current event (don't forward to platform) */ +SOKOL_APP_API_DECL void sapp_consume_event(void); +/* get the current frame counter (for comparison with sapp_event.frame_count) */ +SOKOL_APP_API_DECL uint64_t sapp_frame_count(void); +/* write string into clipboard */ +SOKOL_APP_API_DECL void sapp_set_clipboard_string(const char* str); +/* read string from clipboard (usually during SAPP_EVENTTYPE_CLIPBOARD_PASTED) */ +SOKOL_APP_API_DECL const char* sapp_get_clipboard_string(void); +/* set the window title (only on desktop platforms) */ +SOKOL_APP_API_DECL void sapp_set_window_title(const char* str); +/* set the window icon (only on Windows and Linux) */ +SOKOL_APP_API_DECL void sapp_set_icon(const sapp_icon_desc* icon_desc); +/* gets the total number of dropped files (after an SAPP_EVENTTYPE_FILES_DROPPED event) */ +SOKOL_APP_API_DECL int sapp_get_num_dropped_files(void); +/* gets the dropped file paths */ +SOKOL_APP_API_DECL const char* sapp_get_dropped_file_path(int index); + +/* special run-function for SOKOL_NO_ENTRY (in standard mode this is an empty stub) */ +SOKOL_APP_API_DECL void sapp_run(const sapp_desc* desc); + +/* GL: return true when GLES2 fallback is active (to detect fallback from GLES3) */ +SOKOL_APP_API_DECL bool sapp_gles2(void); + +/* HTML5: enable or disable the hardwired "Leave Site?" dialog box */ +SOKOL_APP_API_DECL void sapp_html5_ask_leave_site(bool ask); +/* HTML5: get byte size of a dropped file */ +SOKOL_APP_API_DECL uint32_t sapp_html5_get_dropped_file_size(int index); +/* HTML5: asynchronously load the content of a dropped file */ +SOKOL_APP_API_DECL void sapp_html5_fetch_dropped_file(const sapp_html5_fetch_request* request); + +/* Metal: get bridged pointer to Metal device object */ +SOKOL_APP_API_DECL const void* sapp_metal_get_device(void); +/* Metal: get bridged pointer to this frame's renderpass descriptor */ +SOKOL_APP_API_DECL const void* sapp_metal_get_renderpass_descriptor(void); +/* Metal: get bridged pointer to current drawable */ +SOKOL_APP_API_DECL const void* sapp_metal_get_drawable(void); +/* macOS: get bridged pointer to macOS NSWindow */ +SOKOL_APP_API_DECL const void* sapp_macos_get_window(void); +/* iOS: get bridged pointer to iOS UIWindow */ +SOKOL_APP_API_DECL const void* sapp_ios_get_window(void); + +/* D3D11: get pointer to ID3D11Device object */ +SOKOL_APP_API_DECL const void* sapp_d3d11_get_device(void); +/* D3D11: get pointer to ID3D11DeviceContext object */ +SOKOL_APP_API_DECL const void* sapp_d3d11_get_device_context(void); +/* D3D11: get pointer to IDXGISwapChain object */ +SOKOL_APP_API_DECL const void* sapp_d3d11_get_swap_chain(void); +/* D3D11: get pointer to ID3D11RenderTargetView object */ +SOKOL_APP_API_DECL const void* sapp_d3d11_get_render_target_view(void); +/* D3D11: get pointer to ID3D11DepthStencilView */ +SOKOL_APP_API_DECL const void* sapp_d3d11_get_depth_stencil_view(void); +/* Win32: get the HWND window handle */ +SOKOL_APP_API_DECL const void* sapp_win32_get_hwnd(void); + +/* WebGPU: get WGPUDevice handle */ +SOKOL_APP_API_DECL const void* sapp_wgpu_get_device(void); +/* WebGPU: get swapchain's WGPUTextureView handle for rendering */ +SOKOL_APP_API_DECL const void* sapp_wgpu_get_render_view(void); +/* WebGPU: get swapchain's MSAA-resolve WGPUTextureView (may return null) */ +SOKOL_APP_API_DECL const void* sapp_wgpu_get_resolve_view(void); +/* WebGPU: get swapchain's WGPUTextureView for the depth-stencil surface */ +SOKOL_APP_API_DECL const void* sapp_wgpu_get_depth_stencil_view(void); + +/* Android: get native activity handle */ +SOKOL_APP_API_DECL const void* sapp_android_get_native_activity(void); + +#ifdef __cplusplus +} /* extern "C" */ + +/* reference-based equivalents for C++ */ +inline void sapp_run(const sapp_desc& desc) { return sapp_run(&desc); } + +#endif + +// this WinRT specific hack is required when wWinMain is in a static library +#if defined(_MSC_VER) && defined(UNICODE) +#include +#if defined(WINAPI_FAMILY_PARTITION) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +#pragma comment(linker, "/include:wWinMain") +#endif +#endif + +#endif // SOKOL_APP_INCLUDED + +/*-- IMPLEMENTATION ----------------------------------------------------------*/ +#ifdef SOKOL_APP_IMPL +#define SOKOL_APP_IMPL_INCLUDED (1) + +#include // memset +#include // size_t + +/* check if the config defines are alright */ +#if defined(__APPLE__) + // see https://clang.llvm.org/docs/LanguageExtensions.html#automatic-reference-counting + #if !defined(__cplusplus) + #if __has_feature(objc_arc) && !__has_feature(objc_arc_fields) + #error "sokol_app.h requires __has_feature(objc_arc_field) if ARC is enabled (use a more recent compiler version)" + #endif + #endif + #define _SAPP_APPLE (1) + #include + #if defined(TARGET_OS_IPHONE) && !TARGET_OS_IPHONE + /* MacOS */ + #define _SAPP_MACOS (1) + #if !defined(SOKOL_METAL) && !defined(SOKOL_GLCORE33) + #error("sokol_app.h: unknown 3D API selected for MacOS, must be SOKOL_METAL or SOKOL_GLCORE33") + #endif + #else + /* iOS or iOS Simulator */ + #define _SAPP_IOS (1) + #if !defined(SOKOL_METAL) && !defined(SOKOL_GLES3) + #error("sokol_app.h: unknown 3D API selected for iOS, must be SOKOL_METAL or SOKOL_GLES3") + #endif + #endif +#elif defined(__EMSCRIPTEN__) + /* emscripten (asm.js or wasm) */ + #define _SAPP_EMSCRIPTEN (1) + #if !defined(SOKOL_GLES3) && !defined(SOKOL_GLES2) && !defined(SOKOL_WGPU) + #error("sokol_app.h: unknown 3D API selected for emscripten, must be SOKOL_GLES3, SOKOL_GLES2 or SOKOL_WGPU") + #endif +#elif defined(_WIN32) + /* Windows (D3D11 or GL) */ + #include + #if (defined(WINAPI_FAMILY_PARTITION) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) + #define _SAPP_UWP (1) + #if !defined(SOKOL_D3D11) + #error("sokol_app.h: unknown 3D API selected for UWP, must be SOKOL_D3D11") + #endif + #if !defined(__cplusplus) + #error("sokol_app.h: UWP bindings require C++/17") + #endif + #else + #define _SAPP_WIN32 (1) + #if !defined(SOKOL_D3D11) && !defined(SOKOL_GLCORE33) + #error("sokol_app.h: unknown 3D API selected for Win32, must be SOKOL_D3D11 or SOKOL_GLCORE33") + #endif + #endif +#elif defined(__ANDROID__) + /* Android */ + #define _SAPP_ANDROID (1) + #if !defined(SOKOL_GLES3) && !defined(SOKOL_GLES2) + #error("sokol_app.h: unknown 3D API selected for Android, must be SOKOL_GLES3 or SOKOL_GLES2") + #endif + #if defined(SOKOL_NO_ENTRY) + #error("sokol_app.h: SOKOL_NO_ENTRY is not supported on Android") + #endif +#elif defined(__linux__) || defined(__unix__) + /* Linux */ + #define _SAPP_LINUX (1) + #if !defined(SOKOL_GLCORE33) + #error("sokol_app.h: unknown 3D API selected for Linux, must be SOKOL_GLCORE33") + #endif +#else +#error "sokol_app.h: Unknown platform" +#endif + +#ifndef SOKOL_API_IMPL + #define SOKOL_API_IMPL +#endif +#ifndef SOKOL_DEBUG + #ifndef NDEBUG + #define SOKOL_DEBUG (1) + #endif +#endif +#ifndef SOKOL_ASSERT + #include + #define SOKOL_ASSERT(c) assert(c) +#endif +#ifndef SOKOL_UNREACHABLE + #define SOKOL_UNREACHABLE SOKOL_ASSERT(false) +#endif +#if !defined(SOKOL_CALLOC) || !defined(SOKOL_FREE) + #include +#endif +#if !defined(SOKOL_CALLOC) + #define SOKOL_CALLOC(n,s) calloc(n,s) +#endif +#if !defined(SOKOL_FREE) + #define SOKOL_FREE(p) free(p) +#endif +#ifndef SOKOL_LOG + #ifdef SOKOL_DEBUG + #if defined(__ANDROID__) + #include + #define SOKOL_LOG(s) { SOKOL_ASSERT(s); __android_log_write(ANDROID_LOG_INFO, "SOKOL_APP", s); } + #else + #include + #define SOKOL_LOG(s) { SOKOL_ASSERT(s); puts(s); } + #endif + #else + #define SOKOL_LOG(s) + #endif +#endif +#ifndef SOKOL_ABORT + #include + #define SOKOL_ABORT() abort() +#endif +#ifndef _SOKOL_PRIVATE + #if defined(__GNUC__) || defined(__clang__) + #define _SOKOL_PRIVATE __attribute__((unused)) static + #else + #define _SOKOL_PRIVATE static + #endif +#endif +#ifndef _SOKOL_UNUSED + #define _SOKOL_UNUSED(x) (void)(x) +#endif + +/*== PLATFORM SPECIFIC INCLUDES AND DEFINES ==================================*/ +#if defined(_SAPP_APPLE) + #if defined(SOKOL_METAL) + #import + #import + #endif + #if defined(_SAPP_MACOS) + #if !defined(SOKOL_METAL) + #ifndef GL_SILENCE_DEPRECATION + #define GL_SILENCE_DEPRECATION + #endif + #include + #endif + #elif defined(_SAPP_IOS) + #import + #if !defined(SOKOL_METAL) + #import + #endif + #endif +#elif defined(_SAPP_EMSCRIPTEN) + #if defined(SOKOL_WGPU) + #include + #endif + #include + #include +#elif defined(_SAPP_WIN32) + #ifdef _MSC_VER + #pragma warning(push) + #pragma warning(disable:4201) /* nonstandard extension used: nameless struct/union */ + #pragma warning(disable:4204) /* nonstandard extension used: non-constant aggregate initializer */ + #pragma warning(disable:4054) /* 'type cast': from function pointer */ + #pragma warning(disable:4055) /* 'type cast': from data pointer */ + #pragma warning(disable:4505) /* unreferenced local function has been removed */ + #pragma warning(disable:4115) /* /W4: 'ID3D11ModuleInstance': named type definition in parentheses (in d3d11.h) */ + #endif + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #ifndef NOMINMAX + #define NOMINMAX + #endif + #include + #include + #include + #if !defined(SOKOL_NO_ENTRY) // if SOKOL_NO_ENTRY is defined, it's the applications' responsibility to use the right subsystem + #if defined(SOKOL_WIN32_FORCE_MAIN) + #pragma comment (linker, "/subsystem:console") + #else + #pragma comment (linker, "/subsystem:windows") + #endif + #endif + #include /* freopen_s() */ + #include /* wcslen() */ + + #pragma comment (lib, "kernel32") + #pragma comment (lib, "user32") + #pragma comment (lib, "shell32") /* CommandLineToArgvW, DragQueryFileW, DragFinished */ + #pragma comment (lib, "gdi32") + #if defined(SOKOL_D3D11) + #pragma comment (lib, "dxgi") + #pragma comment (lib, "d3d11") + #endif + + #if defined(SOKOL_D3D11) + #ifndef D3D11_NO_HELPERS + #define D3D11_NO_HELPERS + #endif + #include + #include + // DXGI_SWAP_EFFECT_FLIP_DISCARD is only defined in newer Windows SDKs, so don't depend on it + #define _SAPP_DXGI_SWAP_EFFECT_FLIP_DISCARD (4) + #endif + #ifndef WM_MOUSEHWHEEL /* see https://github.com/floooh/sokol/issues/138 */ + #define WM_MOUSEHWHEEL (0x020E) + #endif +#elif defined(_SAPP_UWP) + #ifndef NOMINMAX + #define NOMINMAX + #endif + #ifdef _MSC_VER + #pragma warning(push) + #pragma warning(disable:4201) /* nonstandard extension used: nameless struct/union */ + #pragma warning(disable:4054) /* 'type cast': from function pointer */ + #pragma warning(disable:4055) /* 'type cast': from data pointer */ + #pragma warning(disable:4505) /* unreferenced local function has been removed */ + #pragma warning(disable:4115) /* /W4: 'ID3D11ModuleInstance': named type definition in parentheses (in d3d11.h) */ + #endif + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + #include + #include + #include + + #pragma comment (lib, "WindowsApp") + #pragma comment (lib, "dxguid") +#elif defined(_SAPP_ANDROID) + #include + #include + #include + #include + #include +#elif defined(_SAPP_LINUX) + #define GL_GLEXT_PROTOTYPES + #include + #include + #include + #include + #include + #include + #include + #include + #include /* CARD32 */ + #include /* dlopen, dlsym, dlclose */ + #include /* LONG_MAX */ + #include /* only used a linker-guard, search for _sapp_linux_run() and see first comment */ +#endif + +/*== MACOS DECLARATIONS ======================================================*/ +#if defined(_SAPP_MACOS) +@interface _sapp_macos_app_delegate : NSObject +@end +@interface _sapp_macos_window : NSWindow +@end +@interface _sapp_macos_window_delegate : NSObject +@end +#if defined(SOKOL_METAL) + @interface _sapp_macos_view : MTKView + @end +#elif defined(SOKOL_GLCORE33) + @interface _sapp_macos_view : NSOpenGLView + - (void)timerFired:(id)sender; + @end +#endif // SOKOL_GLCORE33 + +typedef struct { + uint32_t flags_changed_store; + uint8_t mouse_buttons; + NSWindow* window; + NSTrackingArea* tracking_area; + _sapp_macos_app_delegate* app_dlg; + _sapp_macos_window_delegate* win_dlg; + _sapp_macos_view* view; + #if defined(SOKOL_METAL) + id mtl_device; + #endif +} _sapp_macos_t; + +#endif // _SAPP_MACOS + +/*== IOS DECLARATIONS ========================================================*/ +#if defined(_SAPP_IOS) + +@interface _sapp_app_delegate : NSObject +@end +@interface _sapp_textfield_dlg : NSObject +- (void)keyboardWasShown:(NSNotification*)notif; +- (void)keyboardWillBeHidden:(NSNotification*)notif; +- (void)keyboardDidChangeFrame:(NSNotification*)notif; +@end +#if defined(SOKOL_METAL) + @interface _sapp_ios_view : MTKView; + @end +#else + @interface _sapp_ios_view : GLKView + @end +#endif + +typedef struct { + UIWindow* window; + _sapp_ios_view* view; + UITextField* textfield; + _sapp_textfield_dlg* textfield_dlg; + #if defined(SOKOL_METAL) + UIViewController* view_ctrl; + id mtl_device; + #else + GLKViewController* view_ctrl; + EAGLContext* eagl_ctx; + #endif + bool suspended; +} _sapp_ios_t; + +#endif // _SAPP_IOS + +/*== EMSCRIPTEN DECLARATIONS =================================================*/ +#if defined(_SAPP_EMSCRIPTEN) + +#if defined(SOKOL_WGPU) +typedef struct { + int state; + WGPUDevice device; + WGPUSwapChain swapchain; + WGPUTextureFormat render_format; + WGPUTexture msaa_tex; + WGPUTexture depth_stencil_tex; + WGPUTextureView swapchain_view; + WGPUTextureView msaa_view; + WGPUTextureView depth_stencil_view; +} _sapp_wgpu_t; +#endif + +typedef struct { + bool textfield_created; + bool wants_show_keyboard; + bool wants_hide_keyboard; + bool mouse_lock_requested; + uint16_t mouse_buttons; + #if defined(SOKOL_WGPU) + _sapp_wgpu_t wgpu; + #endif +} _sapp_emsc_t; +#endif // _SAPP_EMSCRIPTEN + +/*== WIN32 DECLARATIONS ======================================================*/ +#if defined(SOKOL_D3D11) && (defined(_SAPP_WIN32) || defined(_SAPP_UWP)) +typedef struct { + ID3D11Device* device; + ID3D11DeviceContext* device_context; + ID3D11Texture2D* rt; + ID3D11RenderTargetView* rtv; + ID3D11Texture2D* msaa_rt; + ID3D11RenderTargetView* msaa_rtv; + ID3D11Texture2D* ds; + ID3D11DepthStencilView* dsv; + DXGI_SWAP_CHAIN_DESC swap_chain_desc; + IDXGISwapChain* swap_chain; +} _sapp_d3d11_t; +#endif + +/*== WIN32 DECLARATIONS ======================================================*/ +#if defined(_SAPP_WIN32) + +#ifndef DPI_ENUMS_DECLARED +typedef enum PROCESS_DPI_AWARENESS +{ + PROCESS_DPI_UNAWARE = 0, + PROCESS_SYSTEM_DPI_AWARE = 1, + PROCESS_PER_MONITOR_DPI_AWARE = 2 +} PROCESS_DPI_AWARENESS; +typedef enum MONITOR_DPI_TYPE { + MDT_EFFECTIVE_DPI = 0, + MDT_ANGULAR_DPI = 1, + MDT_RAW_DPI = 2, + MDT_DEFAULT = MDT_EFFECTIVE_DPI +} MONITOR_DPI_TYPE; +#endif /*DPI_ENUMS_DECLARED*/ + +typedef struct { + bool aware; + float content_scale; + float window_scale; + float mouse_scale; +} _sapp_win32_dpi_t; + +typedef struct { + HWND hwnd; + HDC dc; + HICON big_icon; + HICON small_icon; + UINT orig_codepage; + LONG mouse_locked_x, mouse_locked_y; + bool is_win10_or_greater; + bool in_create_window; + bool iconified; + bool mouse_tracked; + uint8_t mouse_capture_mask; + _sapp_win32_dpi_t dpi; + bool raw_input_mousepos_valid; + LONG raw_input_mousepos_x; + LONG raw_input_mousepos_y; + uint8_t raw_input_data[256]; +} _sapp_win32_t; + +#if defined(SOKOL_GLCORE33) +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_TYPE_RGBA_ARB 0x202b +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_ALPHA_BITS_ARB 0x201b +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_SAMPLES_ARB 0x2042 +#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 +#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 +#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define WGL_CONTEXT_FLAGS_ARB 0x2094 +#define ERROR_INVALID_VERSION_ARB 0x2095 +#define ERROR_INVALID_PROFILE_ARB 0x2096 +#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 +typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC)(int); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC,int,int,UINT,const int*,int*); +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void); +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC); +typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC,HGLRC,const int*); +typedef HGLRC (WINAPI * PFN_wglCreateContext)(HDC); +typedef BOOL (WINAPI * PFN_wglDeleteContext)(HGLRC); +typedef PROC (WINAPI * PFN_wglGetProcAddress)(LPCSTR); +typedef HDC (WINAPI * PFN_wglGetCurrentDC)(void); +typedef BOOL (WINAPI * PFN_wglMakeCurrent)(HDC,HGLRC); + +typedef struct { + HINSTANCE opengl32; + HGLRC gl_ctx; + PFN_wglCreateContext CreateContext; + PFN_wglDeleteContext DeleteContext; + PFN_wglGetProcAddress GetProcAddress; + PFN_wglGetCurrentDC GetCurrentDC; + PFN_wglMakeCurrent MakeCurrent; + PFNWGLSWAPINTERVALEXTPROC SwapIntervalEXT; + PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB; + PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT; + PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB; + PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; + bool ext_swap_control; + bool arb_multisample; + bool arb_pixel_format; + bool arb_create_context; + bool arb_create_context_profile; + HWND msg_hwnd; + HDC msg_dc; +} _sapp_wgl_t; +#endif // SOKOL_GLCORE33 + +#endif // _SAPP_WIN32 + +/*== UWP DECLARATIONS ======================================================*/ +#if defined(_SAPP_UWP) + +typedef struct { + float content_scale; + float window_scale; + float mouse_scale; +} _sapp_uwp_dpi_t; + +typedef struct { + bool mouse_tracked; + uint8_t mouse_buttons; + _sapp_uwp_dpi_t dpi; +} _sapp_uwp_t; + +#endif // _SAPP_UWP + +/*== ANDROID DECLARATIONS ====================================================*/ + +#if defined(_SAPP_ANDROID) +typedef enum { + _SOKOL_ANDROID_MSG_CREATE, + _SOKOL_ANDROID_MSG_RESUME, + _SOKOL_ANDROID_MSG_PAUSE, + _SOKOL_ANDROID_MSG_FOCUS, + _SOKOL_ANDROID_MSG_NO_FOCUS, + _SOKOL_ANDROID_MSG_SET_NATIVE_WINDOW, + _SOKOL_ANDROID_MSG_SET_INPUT_QUEUE, + _SOKOL_ANDROID_MSG_DESTROY, +} _sapp_android_msg_t; + +typedef struct { + pthread_t thread; + pthread_mutex_t mutex; + pthread_cond_t cond; + int read_from_main_fd; + int write_from_main_fd; +} _sapp_android_pt_t; + +typedef struct { + ANativeWindow* window; + AInputQueue* input; +} _sapp_android_resources_t; + +typedef struct { + ANativeActivity* activity; + _sapp_android_pt_t pt; + _sapp_android_resources_t pending; + _sapp_android_resources_t current; + ALooper* looper; + bool is_thread_started; + bool is_thread_stopping; + bool is_thread_stopped; + bool has_created; + bool has_resumed; + bool has_focus; + EGLConfig config; + EGLDisplay display; + EGLContext context; + EGLSurface surface; +} _sapp_android_t; + +#endif // _SAPP_ANDROID + +/*== LINUX DECLARATIONS ======================================================*/ +#if defined(_SAPP_LINUX) + +#define _SAPP_X11_XDND_VERSION (5) + +#define GLX_VENDOR 1 +#define GLX_RGBA_BIT 0x00000001 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_DOUBLEBUFFER 5 +#define GLX_RED_SIZE 8 +#define GLX_GREEN_SIZE 9 +#define GLX_BLUE_SIZE 10 +#define GLX_ALPHA_SIZE 11 +#define GLX_DEPTH_SIZE 12 +#define GLX_STENCIL_SIZE 13 +#define GLX_SAMPLES 0x186a1 +#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 +#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 +#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define GLX_CONTEXT_FLAGS_ARB 0x2094 + +typedef XID GLXWindow; +typedef XID GLXDrawable; +typedef struct __GLXFBConfig* GLXFBConfig; +typedef struct __GLXcontext* GLXContext; +typedef void (*__GLXextproc)(void); + +typedef int (*PFNGLXGETFBCONFIGATTRIBPROC)(Display*,GLXFBConfig,int,int*); +typedef const char* (*PFNGLXGETCLIENTSTRINGPROC)(Display*,int); +typedef Bool (*PFNGLXQUERYEXTENSIONPROC)(Display*,int*,int*); +typedef Bool (*PFNGLXQUERYVERSIONPROC)(Display*,int*,int*); +typedef void (*PFNGLXDESTROYCONTEXTPROC)(Display*,GLXContext); +typedef Bool (*PFNGLXMAKECURRENTPROC)(Display*,GLXDrawable,GLXContext); +typedef void (*PFNGLXSWAPBUFFERSPROC)(Display*,GLXDrawable); +typedef const char* (*PFNGLXQUERYEXTENSIONSSTRINGPROC)(Display*,int); +typedef GLXFBConfig* (*PFNGLXGETFBCONFIGSPROC)(Display*,int,int*); +typedef __GLXextproc (* PFNGLXGETPROCADDRESSPROC)(const char *procName); +typedef void (*PFNGLXSWAPINTERVALEXTPROC)(Display*,GLXDrawable,int); +typedef XVisualInfo* (*PFNGLXGETVISUALFROMFBCONFIGPROC)(Display*,GLXFBConfig); +typedef GLXWindow (*PFNGLXCREATEWINDOWPROC)(Display*,GLXFBConfig,Window,const int*); +typedef void (*PFNGLXDESTROYWINDOWPROC)(Display*,GLXWindow); + +typedef int (*PFNGLXSWAPINTERVALMESAPROC)(int); +typedef GLXContext (*PFNGLXCREATECONTEXTATTRIBSARBPROC)(Display*,GLXFBConfig,GLXContext,Bool,const int*); + +typedef struct { + bool available; + int major_opcode; + int event_base; + int error_base; + int major; + int minor; +} _sapp_xi_t; + +typedef struct { + int version; + Window source; + Atom format; + Atom XdndAware; + Atom XdndEnter; + Atom XdndPosition; + Atom XdndStatus; + Atom XdndActionCopy; + Atom XdndDrop; + Atom XdndFinished; + Atom XdndSelection; + Atom XdndTypeList; + Atom text_uri_list; +} _sapp_xdnd_t; + +typedef struct { + uint8_t mouse_buttons; + Display* display; + int screen; + Window root; + Colormap colormap; + Window window; + Cursor hidden_cursor; + int window_state; + float dpi; + unsigned char error_code; + Atom UTF8_STRING; + Atom WM_PROTOCOLS; + Atom WM_DELETE_WINDOW; + Atom WM_STATE; + Atom NET_WM_NAME; + Atom NET_WM_ICON_NAME; + Atom NET_WM_ICON; + Atom NET_WM_STATE; + Atom NET_WM_STATE_FULLSCREEN; + _sapp_xi_t xi; + _sapp_xdnd_t xdnd; +} _sapp_x11_t; + +typedef struct { + void* libgl; + int major; + int minor; + int event_base; + int error_base; + GLXContext ctx; + GLXWindow window; + + // GLX 1.3 functions + PFNGLXGETFBCONFIGSPROC GetFBConfigs; + PFNGLXGETFBCONFIGATTRIBPROC GetFBConfigAttrib; + PFNGLXGETCLIENTSTRINGPROC GetClientString; + PFNGLXQUERYEXTENSIONPROC QueryExtension; + PFNGLXQUERYVERSIONPROC QueryVersion; + PFNGLXDESTROYCONTEXTPROC DestroyContext; + PFNGLXMAKECURRENTPROC MakeCurrent; + PFNGLXSWAPBUFFERSPROC SwapBuffers; + PFNGLXQUERYEXTENSIONSSTRINGPROC QueryExtensionsString; + PFNGLXGETVISUALFROMFBCONFIGPROC GetVisualFromFBConfig; + PFNGLXCREATEWINDOWPROC CreateWindow; + PFNGLXDESTROYWINDOWPROC DestroyWindow; + + // GLX 1.4 and extension functions + PFNGLXGETPROCADDRESSPROC GetProcAddress; + PFNGLXGETPROCADDRESSPROC GetProcAddressARB; + PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT; + PFNGLXSWAPINTERVALMESAPROC SwapIntervalMESA; + PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; + + // extension availability + bool EXT_swap_control; + bool MESA_swap_control; + bool ARB_multisample; + bool ARB_create_context; + bool ARB_create_context_profile; +} _sapp_glx_t; + +#endif // _SAPP_LINUX + +/*== COMMON DECLARATIONS =====================================================*/ + +/* helper macros */ +#define _sapp_def(val, def) (((val) == 0) ? (def) : (val)) +#define _sapp_absf(a) (((a)<0.0f)?-(a):(a)) + +#define _SAPP_MAX_TITLE_LENGTH (128) +/* NOTE: the pixel format values *must* be compatible with sg_pixel_format */ +#define _SAPP_PIXELFORMAT_RGBA8 (23) +#define _SAPP_PIXELFORMAT_BGRA8 (27) +#define _SAPP_PIXELFORMAT_DEPTH (41) +#define _SAPP_PIXELFORMAT_DEPTH_STENCIL (42) + +#if defined(_SAPP_MACOS) || defined(_SAPP_IOS) + // this is ARC compatible + #if defined(__cplusplus) + #define _SAPP_CLEAR(type, item) { item = (type) { }; } + #else + #define _SAPP_CLEAR(type, item) { item = (type) { 0 }; } + #endif +#else + #define _SAPP_CLEAR(type, item) { memset(&item, 0, sizeof(item)); } +#endif + +typedef struct { + bool enabled; + int buf_size; + char* buffer; +} _sapp_clipboard_t; + +typedef struct { + bool enabled; + int max_files; + int max_path_length; + int num_files; + int buf_size; + char* buffer; +} _sapp_drop_t; + +typedef struct { + float x, y; + float dx, dy; + bool shown; + bool locked; + bool pos_valid; +} _sapp_mouse_t; + +typedef struct { + sapp_desc desc; + bool valid; + bool fullscreen; + bool gles2_fallback; + bool first_frame; + bool init_called; + bool cleanup_called; + bool quit_requested; + bool quit_ordered; + bool event_consumed; + bool html5_ask_leave_site; + bool onscreen_keyboard_shown; + int window_width; + int window_height; + int framebuffer_width; + int framebuffer_height; + int sample_count; + int swap_interval; + float dpi_scale; + uint64_t frame_count; + sapp_event event; + _sapp_mouse_t mouse; + _sapp_clipboard_t clipboard; + _sapp_drop_t drop; + sapp_icon_desc default_icon_desc; + uint32_t* default_icon_pixels; + #if defined(_SAPP_MACOS) + _sapp_macos_t macos; + #elif defined(_SAPP_IOS) + _sapp_ios_t ios; + #elif defined(_SAPP_EMSCRIPTEN) + _sapp_emsc_t emsc; + #elif defined(_SAPP_WIN32) + _sapp_win32_t win32; + #if defined(SOKOL_D3D11) + _sapp_d3d11_t d3d11; + #elif defined(SOKOL_GLCORE33) + _sapp_wgl_t wgl; + #endif + #elif defined(_SAPP_UWP) + _sapp_uwp_t uwp; + #if defined(SOKOL_D3D11) + _sapp_d3d11_t d3d11; + #endif + #elif defined(_SAPP_ANDROID) + _sapp_android_t android; + #elif defined(_SAPP_LINUX) + _sapp_x11_t x11; + _sapp_glx_t glx; + #endif + char html5_canvas_selector[_SAPP_MAX_TITLE_LENGTH]; + char window_title[_SAPP_MAX_TITLE_LENGTH]; /* UTF-8 */ + wchar_t window_title_wide[_SAPP_MAX_TITLE_LENGTH]; /* UTF-32 or UCS-2 */ + sapp_keycode keycodes[SAPP_MAX_KEYCODES]; +} _sapp_t; +static _sapp_t _sapp; + +/*=== PRIVATE HELPER FUNCTIONS ===============================================*/ +_SOKOL_PRIVATE void _sapp_fail(const char* msg) { + if (_sapp.desc.fail_cb) { + _sapp.desc.fail_cb(msg); + } + else if (_sapp.desc.fail_userdata_cb) { + _sapp.desc.fail_userdata_cb(msg, _sapp.desc.user_data); + } + else { + SOKOL_LOG(msg); + } + SOKOL_ABORT(); +} + +_SOKOL_PRIVATE void _sapp_call_init(void) { + if (_sapp.desc.init_cb) { + _sapp.desc.init_cb(); + } + else if (_sapp.desc.init_userdata_cb) { + _sapp.desc.init_userdata_cb(_sapp.desc.user_data); + } + _sapp.init_called = true; +} + +_SOKOL_PRIVATE void _sapp_call_frame(void) { + if (_sapp.init_called && !_sapp.cleanup_called) { + if (_sapp.desc.frame_cb) { + _sapp.desc.frame_cb(); + } + else if (_sapp.desc.frame_userdata_cb) { + _sapp.desc.frame_userdata_cb(_sapp.desc.user_data); + } + } +} + +_SOKOL_PRIVATE void _sapp_call_cleanup(void) { + if (!_sapp.cleanup_called) { + if (_sapp.desc.cleanup_cb) { + _sapp.desc.cleanup_cb(); + } + else if (_sapp.desc.cleanup_userdata_cb) { + _sapp.desc.cleanup_userdata_cb(_sapp.desc.user_data); + } + _sapp.cleanup_called = true; + } +} + +_SOKOL_PRIVATE bool _sapp_call_event(const sapp_event* e) { + if (!_sapp.cleanup_called) { + if (_sapp.desc.event_cb) { + _sapp.desc.event_cb(e); + } + else if (_sapp.desc.event_userdata_cb) { + _sapp.desc.event_userdata_cb(e, _sapp.desc.user_data); + } + } + if (_sapp.event_consumed) { + _sapp.event_consumed = false; + return true; + } + else { + return false; + } +} + +_SOKOL_PRIVATE char* _sapp_dropped_file_path_ptr(int index) { + SOKOL_ASSERT(_sapp.drop.buffer); + SOKOL_ASSERT((index >= 0) && (index <= _sapp.drop.max_files)); + int offset = index * _sapp.drop.max_path_length; + SOKOL_ASSERT(offset < _sapp.drop.buf_size); + return &_sapp.drop.buffer[offset]; +} + +/* Copy a string into a fixed size buffer with guaranteed zero- + termination. + + Return false if the string didn't fit into the buffer and had to be clamped. + + FIXME: Currently UTF-8 strings might become invalid if the string + is clamped, because the last zero-byte might be written into + the middle of a multi-byte sequence. +*/ +_SOKOL_PRIVATE bool _sapp_strcpy(const char* src, char* dst, int max_len) { + SOKOL_ASSERT(src && dst && (max_len > 0)); + char* const end = &(dst[max_len-1]); + char c = 0; + for (int i = 0; i < max_len; i++) { + c = *src; + if (c != 0) { + src++; + } + *dst++ = c; + } + /* truncated? */ + if (c != 0) { + *end = 0; + return false; + } + else { + return true; + } +} + +_SOKOL_PRIVATE sapp_desc _sapp_desc_defaults(const sapp_desc* in_desc) { + sapp_desc desc = *in_desc; + desc.width = _sapp_def(desc.width, 640); + desc.height = _sapp_def(desc.height, 480); + desc.sample_count = _sapp_def(desc.sample_count, 1); + desc.swap_interval = _sapp_def(desc.swap_interval, 1); + desc.html5_canvas_name = _sapp_def(desc.html5_canvas_name, "canvas"); + desc.clipboard_size = _sapp_def(desc.clipboard_size, 8192); + desc.max_dropped_files = _sapp_def(desc.max_dropped_files, 1); + desc.max_dropped_file_path_length = _sapp_def(desc.max_dropped_file_path_length, 2048); + desc.window_title = _sapp_def(desc.window_title, "sokol_app"); + return desc; +} + +_SOKOL_PRIVATE void _sapp_init_state(const sapp_desc* desc) { + _SAPP_CLEAR(_sapp_t, _sapp); + _sapp.desc = _sapp_desc_defaults(desc); + _sapp.first_frame = true; + _sapp.window_width = _sapp.desc.width; + _sapp.window_height = _sapp.desc.height; + _sapp.framebuffer_width = _sapp.window_width; + _sapp.framebuffer_height = _sapp.window_height; + _sapp.sample_count = _sapp.desc.sample_count; + _sapp.swap_interval = _sapp.desc.swap_interval; + _sapp.html5_canvas_selector[0] = '#'; + _sapp_strcpy(_sapp.desc.html5_canvas_name, &_sapp.html5_canvas_selector[1], sizeof(_sapp.html5_canvas_selector) - 1); + _sapp.desc.html5_canvas_name = &_sapp.html5_canvas_selector[1]; + _sapp.html5_ask_leave_site = _sapp.desc.html5_ask_leave_site; + _sapp.clipboard.enabled = _sapp.desc.enable_clipboard; + if (_sapp.clipboard.enabled) { + _sapp.clipboard.buf_size = _sapp.desc.clipboard_size; + _sapp.clipboard.buffer = (char*) SOKOL_CALLOC(1, (size_t)_sapp.clipboard.buf_size); + } + _sapp.drop.enabled = _sapp.desc.enable_dragndrop; + if (_sapp.drop.enabled) { + _sapp.drop.max_files = _sapp.desc.max_dropped_files; + _sapp.drop.max_path_length = _sapp.desc.max_dropped_file_path_length; + _sapp.drop.buf_size = _sapp.drop.max_files * _sapp.drop.max_path_length; + _sapp.drop.buffer = (char*) SOKOL_CALLOC(1, (size_t)_sapp.drop.buf_size); + } + _sapp_strcpy(_sapp.desc.window_title, _sapp.window_title, sizeof(_sapp.window_title)); + _sapp.desc.window_title = _sapp.window_title; + _sapp.dpi_scale = 1.0f; + _sapp.fullscreen = _sapp.desc.fullscreen; + _sapp.mouse.shown = true; +} + +_SOKOL_PRIVATE void _sapp_discard_state(void) { + if (_sapp.clipboard.enabled) { + SOKOL_ASSERT(_sapp.clipboard.buffer); + SOKOL_FREE((void*)_sapp.clipboard.buffer); + } + if (_sapp.drop.enabled) { + SOKOL_ASSERT(_sapp.drop.buffer); + SOKOL_FREE((void*)_sapp.drop.buffer); + } + if (_sapp.default_icon_pixels) { + SOKOL_FREE((void*)_sapp.default_icon_pixels); + } + _SAPP_CLEAR(_sapp_t, _sapp); +} + +_SOKOL_PRIVATE void _sapp_init_event(sapp_event_type type) { + memset(&_sapp.event, 0, sizeof(_sapp.event)); + _sapp.event.type = type; + _sapp.event.frame_count = _sapp.frame_count; + _sapp.event.mouse_button = SAPP_MOUSEBUTTON_INVALID; + _sapp.event.window_width = _sapp.window_width; + _sapp.event.window_height = _sapp.window_height; + _sapp.event.framebuffer_width = _sapp.framebuffer_width; + _sapp.event.framebuffer_height = _sapp.framebuffer_height; + _sapp.event.mouse_x = _sapp.mouse.x; + _sapp.event.mouse_y = _sapp.mouse.y; + _sapp.event.mouse_dx = _sapp.mouse.dx; + _sapp.event.mouse_dy = _sapp.mouse.dy; +} + +_SOKOL_PRIVATE bool _sapp_events_enabled(void) { + /* only send events when an event callback is set, and the init function was called */ + return (_sapp.desc.event_cb || _sapp.desc.event_userdata_cb) && _sapp.init_called; +} + +_SOKOL_PRIVATE sapp_keycode _sapp_translate_key(int scan_code) { + if ((scan_code >= 0) && (scan_code < SAPP_MAX_KEYCODES)) { + return _sapp.keycodes[scan_code]; + } + else { + return SAPP_KEYCODE_INVALID; + } +} + +_SOKOL_PRIVATE void _sapp_clear_drop_buffer(void) { + if (_sapp.drop.enabled) { + SOKOL_ASSERT(_sapp.drop.buffer); + memset(_sapp.drop.buffer, 0, (size_t)_sapp.drop.buf_size); + } +} + +_SOKOL_PRIVATE void _sapp_frame(void) { + if (_sapp.first_frame) { + _sapp.first_frame = false; + _sapp_call_init(); + } + _sapp_call_frame(); + _sapp.frame_count++; +} + +_SOKOL_PRIVATE bool _sapp_image_validate(const sapp_image_desc* desc) { + SOKOL_ASSERT(desc->width > 0); + SOKOL_ASSERT(desc->height > 0); + SOKOL_ASSERT(desc->pixels.ptr != 0); + SOKOL_ASSERT(desc->pixels.size > 0); + const size_t wh_size = (size_t)(desc->width * desc->height) * sizeof(uint32_t); + if (wh_size != desc->pixels.size) { + SOKOL_LOG("Image data size mismatch (must be width*height*4 bytes)\n"); + return false; + } + return true; +} + +_SOKOL_PRIVATE int _sapp_image_bestmatch(const sapp_image_desc image_descs[], int num_images, int width, int height) { + int least_diff = 0x7FFFFFFF; + int least_index = 0; + for (int i = 0; i < num_images; i++) { + int diff = (image_descs[i].width * image_descs[i].height) - (width * height); + if (diff < 0) { + diff = -diff; + } + if (diff < least_diff) { + least_diff = diff; + least_index = i; + } + } + return least_index; +} + +_SOKOL_PRIVATE int _sapp_icon_num_images(const sapp_icon_desc* desc) { + int index = 0; + for (; index < SAPP_MAX_ICONIMAGES; index++) { + if (0 == desc->images[index].pixels.ptr) { + break; + } + } + return index; +} + +_SOKOL_PRIVATE bool _sapp_validate_icon_desc(const sapp_icon_desc* desc, int num_images) { + SOKOL_ASSERT(num_images <= SAPP_MAX_ICONIMAGES); + for (int i = 0; i < num_images; i++) { + const sapp_image_desc* img_desc = &desc->images[i]; + if (!_sapp_image_validate(img_desc)) { + return false; + } + } + return true; +} + +_SOKOL_PRIVATE void _sapp_setup_default_icon(void) { + SOKOL_ASSERT(0 == _sapp.default_icon_pixels); + + const int num_icons = 3; + const int icon_sizes[3] = { 16, 32, 64 }; // must be multiple of 8! + + // allocate a pixel buffer for all icon pixels + int all_num_pixels = 0; + for (int i = 0; i < num_icons; i++) { + all_num_pixels += icon_sizes[i] * icon_sizes[i]; + } + _sapp.default_icon_pixels = (uint32_t*) SOKOL_CALLOC((size_t)all_num_pixels, sizeof(uint32_t)); + + // initialize default_icon_desc struct + uint32_t* dst = _sapp.default_icon_pixels; + const uint32_t* dst_end = dst + all_num_pixels; + (void)dst_end; // silence unused warning in release mode + for (int i = 0; i < num_icons; i++) { + const int dim = (int) icon_sizes[i]; + const int num_pixels = dim * dim; + sapp_image_desc* img_desc = &_sapp.default_icon_desc.images[i]; + img_desc->width = dim; + img_desc->height = dim; + img_desc->pixels.ptr = dst; + img_desc->pixels.size = (size_t)num_pixels * sizeof(uint32_t); + dst += num_pixels; + } + SOKOL_ASSERT(dst == dst_end); + + // Amstrad CPC font 'S' + const uint8_t tile[8] = { + 0x3C, + 0x66, + 0x60, + 0x3C, + 0x06, + 0x66, + 0x3C, + 0x00, + }; + // rainbow colors + const uint32_t colors[8] = { + 0xFF4370FF, + 0xFF26A7FF, + 0xFF58EEFF, + 0xFF57E1D4, + 0xFF65CC9C, + 0xFF6ABB66, + 0xFFF5A542, + 0xFFC2577E, + }; + dst = _sapp.default_icon_pixels; + const uint32_t blank = 0x00FFFFFF; + const uint32_t shadow = 0xFF000000; + for (int i = 0; i < num_icons; i++) { + const int dim = icon_sizes[i]; + SOKOL_ASSERT((dim % 8) == 0); + const int scale = dim / 8; + for (int ty = 0, y = 0; ty < 8; ty++) { + const uint32_t color = colors[ty]; + for (int sy = 0; sy < scale; sy++, y++) { + uint8_t bits = tile[ty]; + for (int tx = 0, x = 0; tx < 8; tx++, bits<<=1) { + uint32_t pixel = (0 == (bits & 0x80)) ? blank : color; + for (int sx = 0; sx < scale; sx++, x++) { + SOKOL_ASSERT(dst < dst_end); + *dst++ = pixel; + } + } + } + } + } + SOKOL_ASSERT(dst == dst_end); + + // right shadow + dst = _sapp.default_icon_pixels; + for (int i = 0; i < num_icons; i++) { + const int dim = icon_sizes[i]; + for (int y = 0; y < dim; y++) { + uint32_t prev_color = blank; + for (int x = 0; x < dim; x++) { + const int dst_index = y * dim + x; + const uint32_t cur_color = dst[dst_index]; + if ((cur_color == blank) && (prev_color != blank)) { + dst[dst_index] = shadow; + } + prev_color = cur_color; + } + } + dst += dim * dim; + } + SOKOL_ASSERT(dst == dst_end); + + // bottom shadow + dst = _sapp.default_icon_pixels; + for (int i = 0; i < num_icons; i++) { + const int dim = icon_sizes[i]; + for (int x = 0; x < dim; x++) { + uint32_t prev_color = blank; + for (int y = 0; y < dim; y++) { + const int dst_index = y * dim + x; + const uint32_t cur_color = dst[dst_index]; + if ((cur_color == blank) && (prev_color != blank)) { + dst[dst_index] = shadow; + } + prev_color = cur_color; + } + } + dst += dim * dim; + } + SOKOL_ASSERT(dst == dst_end); +} + +/*== MacOS/iOS ===============================================================*/ +#if defined(_SAPP_APPLE) + +#if __has_feature(objc_arc) +#define _SAPP_OBJC_RELEASE(obj) { obj = nil; } +#else +#define _SAPP_OBJC_RELEASE(obj) { [obj release]; obj = nil; } +#endif + +/*== MacOS ===================================================================*/ +#if defined(_SAPP_MACOS) + +_SOKOL_PRIVATE void _sapp_macos_init_keytable(void) { + _sapp.keycodes[0x1D] = SAPP_KEYCODE_0; + _sapp.keycodes[0x12] = SAPP_KEYCODE_1; + _sapp.keycodes[0x13] = SAPP_KEYCODE_2; + _sapp.keycodes[0x14] = SAPP_KEYCODE_3; + _sapp.keycodes[0x15] = SAPP_KEYCODE_4; + _sapp.keycodes[0x17] = SAPP_KEYCODE_5; + _sapp.keycodes[0x16] = SAPP_KEYCODE_6; + _sapp.keycodes[0x1A] = SAPP_KEYCODE_7; + _sapp.keycodes[0x1C] = SAPP_KEYCODE_8; + _sapp.keycodes[0x19] = SAPP_KEYCODE_9; + _sapp.keycodes[0x00] = SAPP_KEYCODE_A; + _sapp.keycodes[0x0B] = SAPP_KEYCODE_B; + _sapp.keycodes[0x08] = SAPP_KEYCODE_C; + _sapp.keycodes[0x02] = SAPP_KEYCODE_D; + _sapp.keycodes[0x0E] = SAPP_KEYCODE_E; + _sapp.keycodes[0x03] = SAPP_KEYCODE_F; + _sapp.keycodes[0x05] = SAPP_KEYCODE_G; + _sapp.keycodes[0x04] = SAPP_KEYCODE_H; + _sapp.keycodes[0x22] = SAPP_KEYCODE_I; + _sapp.keycodes[0x26] = SAPP_KEYCODE_J; + _sapp.keycodes[0x28] = SAPP_KEYCODE_K; + _sapp.keycodes[0x25] = SAPP_KEYCODE_L; + _sapp.keycodes[0x2E] = SAPP_KEYCODE_M; + _sapp.keycodes[0x2D] = SAPP_KEYCODE_N; + _sapp.keycodes[0x1F] = SAPP_KEYCODE_O; + _sapp.keycodes[0x23] = SAPP_KEYCODE_P; + _sapp.keycodes[0x0C] = SAPP_KEYCODE_Q; + _sapp.keycodes[0x0F] = SAPP_KEYCODE_R; + _sapp.keycodes[0x01] = SAPP_KEYCODE_S; + _sapp.keycodes[0x11] = SAPP_KEYCODE_T; + _sapp.keycodes[0x20] = SAPP_KEYCODE_U; + _sapp.keycodes[0x09] = SAPP_KEYCODE_V; + _sapp.keycodes[0x0D] = SAPP_KEYCODE_W; + _sapp.keycodes[0x07] = SAPP_KEYCODE_X; + _sapp.keycodes[0x10] = SAPP_KEYCODE_Y; + _sapp.keycodes[0x06] = SAPP_KEYCODE_Z; + _sapp.keycodes[0x27] = SAPP_KEYCODE_APOSTROPHE; + _sapp.keycodes[0x2A] = SAPP_KEYCODE_BACKSLASH; + _sapp.keycodes[0x2B] = SAPP_KEYCODE_COMMA; + _sapp.keycodes[0x18] = SAPP_KEYCODE_EQUAL; + _sapp.keycodes[0x32] = SAPP_KEYCODE_GRAVE_ACCENT; + _sapp.keycodes[0x21] = SAPP_KEYCODE_LEFT_BRACKET; + _sapp.keycodes[0x1B] = SAPP_KEYCODE_MINUS; + _sapp.keycodes[0x2F] = SAPP_KEYCODE_PERIOD; + _sapp.keycodes[0x1E] = SAPP_KEYCODE_RIGHT_BRACKET; + _sapp.keycodes[0x29] = SAPP_KEYCODE_SEMICOLON; + _sapp.keycodes[0x2C] = SAPP_KEYCODE_SLASH; + _sapp.keycodes[0x0A] = SAPP_KEYCODE_WORLD_1; + _sapp.keycodes[0x33] = SAPP_KEYCODE_BACKSPACE; + _sapp.keycodes[0x39] = SAPP_KEYCODE_CAPS_LOCK; + _sapp.keycodes[0x75] = SAPP_KEYCODE_DELETE; + _sapp.keycodes[0x7D] = SAPP_KEYCODE_DOWN; + _sapp.keycodes[0x77] = SAPP_KEYCODE_END; + _sapp.keycodes[0x24] = SAPP_KEYCODE_ENTER; + _sapp.keycodes[0x35] = SAPP_KEYCODE_ESCAPE; + _sapp.keycodes[0x7A] = SAPP_KEYCODE_F1; + _sapp.keycodes[0x78] = SAPP_KEYCODE_F2; + _sapp.keycodes[0x63] = SAPP_KEYCODE_F3; + _sapp.keycodes[0x76] = SAPP_KEYCODE_F4; + _sapp.keycodes[0x60] = SAPP_KEYCODE_F5; + _sapp.keycodes[0x61] = SAPP_KEYCODE_F6; + _sapp.keycodes[0x62] = SAPP_KEYCODE_F7; + _sapp.keycodes[0x64] = SAPP_KEYCODE_F8; + _sapp.keycodes[0x65] = SAPP_KEYCODE_F9; + _sapp.keycodes[0x6D] = SAPP_KEYCODE_F10; + _sapp.keycodes[0x67] = SAPP_KEYCODE_F11; + _sapp.keycodes[0x6F] = SAPP_KEYCODE_F12; + _sapp.keycodes[0x69] = SAPP_KEYCODE_F13; + _sapp.keycodes[0x6B] = SAPP_KEYCODE_F14; + _sapp.keycodes[0x71] = SAPP_KEYCODE_F15; + _sapp.keycodes[0x6A] = SAPP_KEYCODE_F16; + _sapp.keycodes[0x40] = SAPP_KEYCODE_F17; + _sapp.keycodes[0x4F] = SAPP_KEYCODE_F18; + _sapp.keycodes[0x50] = SAPP_KEYCODE_F19; + _sapp.keycodes[0x5A] = SAPP_KEYCODE_F20; + _sapp.keycodes[0x73] = SAPP_KEYCODE_HOME; + _sapp.keycodes[0x72] = SAPP_KEYCODE_INSERT; + _sapp.keycodes[0x7B] = SAPP_KEYCODE_LEFT; + _sapp.keycodes[0x3A] = SAPP_KEYCODE_LEFT_ALT; + _sapp.keycodes[0x3B] = SAPP_KEYCODE_LEFT_CONTROL; + _sapp.keycodes[0x38] = SAPP_KEYCODE_LEFT_SHIFT; + _sapp.keycodes[0x37] = SAPP_KEYCODE_LEFT_SUPER; + _sapp.keycodes[0x6E] = SAPP_KEYCODE_MENU; + _sapp.keycodes[0x47] = SAPP_KEYCODE_NUM_LOCK; + _sapp.keycodes[0x79] = SAPP_KEYCODE_PAGE_DOWN; + _sapp.keycodes[0x74] = SAPP_KEYCODE_PAGE_UP; + _sapp.keycodes[0x7C] = SAPP_KEYCODE_RIGHT; + _sapp.keycodes[0x3D] = SAPP_KEYCODE_RIGHT_ALT; + _sapp.keycodes[0x3E] = SAPP_KEYCODE_RIGHT_CONTROL; + _sapp.keycodes[0x3C] = SAPP_KEYCODE_RIGHT_SHIFT; + _sapp.keycodes[0x36] = SAPP_KEYCODE_RIGHT_SUPER; + _sapp.keycodes[0x31] = SAPP_KEYCODE_SPACE; + _sapp.keycodes[0x30] = SAPP_KEYCODE_TAB; + _sapp.keycodes[0x7E] = SAPP_KEYCODE_UP; + _sapp.keycodes[0x52] = SAPP_KEYCODE_KP_0; + _sapp.keycodes[0x53] = SAPP_KEYCODE_KP_1; + _sapp.keycodes[0x54] = SAPP_KEYCODE_KP_2; + _sapp.keycodes[0x55] = SAPP_KEYCODE_KP_3; + _sapp.keycodes[0x56] = SAPP_KEYCODE_KP_4; + _sapp.keycodes[0x57] = SAPP_KEYCODE_KP_5; + _sapp.keycodes[0x58] = SAPP_KEYCODE_KP_6; + _sapp.keycodes[0x59] = SAPP_KEYCODE_KP_7; + _sapp.keycodes[0x5B] = SAPP_KEYCODE_KP_8; + _sapp.keycodes[0x5C] = SAPP_KEYCODE_KP_9; + _sapp.keycodes[0x45] = SAPP_KEYCODE_KP_ADD; + _sapp.keycodes[0x41] = SAPP_KEYCODE_KP_DECIMAL; + _sapp.keycodes[0x4B] = SAPP_KEYCODE_KP_DIVIDE; + _sapp.keycodes[0x4C] = SAPP_KEYCODE_KP_ENTER; + _sapp.keycodes[0x51] = SAPP_KEYCODE_KP_EQUAL; + _sapp.keycodes[0x43] = SAPP_KEYCODE_KP_MULTIPLY; + _sapp.keycodes[0x4E] = SAPP_KEYCODE_KP_SUBTRACT; +} + +_SOKOL_PRIVATE void _sapp_macos_discard_state(void) { + // NOTE: it's safe to call [release] on a nil object + _SAPP_OBJC_RELEASE(_sapp.macos.tracking_area); + _SAPP_OBJC_RELEASE(_sapp.macos.app_dlg); + _SAPP_OBJC_RELEASE(_sapp.macos.win_dlg); + _SAPP_OBJC_RELEASE(_sapp.macos.view); + #if defined(SOKOL_METAL) + _SAPP_OBJC_RELEASE(_sapp.macos.mtl_device); + #endif + _SAPP_OBJC_RELEASE(_sapp.macos.window); +} + +_SOKOL_PRIVATE void _sapp_macos_run(const sapp_desc* desc) { + _sapp_init_state(desc); + _sapp_macos_init_keytable(); + [NSApplication sharedApplication]; + // set the application dock icon as early as possible, otherwise + // the dummy icon will be visible for a short time + sapp_set_icon(&_sapp.desc.icon); + _sapp.macos.app_dlg = [[_sapp_macos_app_delegate alloc] init]; + NSApp.delegate = _sapp.macos.app_dlg; + [NSApp run]; + // NOTE: [NSApp run] never returns, instead cleanup code + // must be put into applicationWillTerminate +} + +/* MacOS entry function */ +#if !defined(SOKOL_NO_ENTRY) +int main(int argc, char* argv[]) { + sapp_desc desc = sokol_main(argc, argv); + _sapp_macos_run(&desc); + return 0; +} +#endif /* SOKOL_NO_ENTRY */ + +_SOKOL_PRIVATE uint32_t _sapp_macos_mods(NSEvent* ev) { + const NSEventModifierFlags f = ev.modifierFlags; + const NSUInteger b = NSEvent.pressedMouseButtons; + uint32_t m = 0; + if (f & NSEventModifierFlagShift) { + m |= SAPP_MODIFIER_SHIFT; + } + if (f & NSEventModifierFlagControl) { + m |= SAPP_MODIFIER_CTRL; + } + if (f & NSEventModifierFlagOption) { + m |= SAPP_MODIFIER_ALT; + } + if (f & NSEventModifierFlagCommand) { + m |= SAPP_MODIFIER_SUPER; + } + if (0 != (b & (1<<0))) { + m |= SAPP_MODIFIER_LMB; + } + if (0 != (b & (1<<1))) { + m |= SAPP_MODIFIER_RMB; + } + if (0 != (b & (1<<2))) { + m |= SAPP_MODIFIER_MMB; + } + return m; +} + +_SOKOL_PRIVATE void _sapp_macos_mouse_event(sapp_event_type type, sapp_mousebutton btn, uint32_t mod) { + if (_sapp_events_enabled()) { + _sapp_init_event(type); + _sapp.event.mouse_button = btn; + _sapp.event.modifiers = mod; + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE void _sapp_macos_key_event(sapp_event_type type, sapp_keycode key, bool repeat, uint32_t mod) { + if (_sapp_events_enabled()) { + _sapp_init_event(type); + _sapp.event.key_code = key; + _sapp.event.key_repeat = repeat; + _sapp.event.modifiers = mod; + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE void _sapp_macos_app_event(sapp_event_type type) { + if (_sapp_events_enabled()) { + _sapp_init_event(type); + _sapp_call_event(&_sapp.event); + } +} + +/* NOTE: unlike the iOS version of this function, the macOS version + can dynamically update the DPI scaling factor when a window is moved + between HighDPI / LowDPI screens. +*/ +_SOKOL_PRIVATE void _sapp_macos_update_dimensions(void) { + #if defined(SOKOL_METAL) + const NSRect fb_rect = [_sapp.macos.view bounds]; + _sapp.framebuffer_width = fb_rect.size.width * _sapp.dpi_scale; + _sapp.framebuffer_height = fb_rect.size.height * _sapp.dpi_scale; + #elif defined(SOKOL_GLCORE33) + const NSRect fb_rect = [_sapp.macos.view convertRectToBacking:[_sapp.macos.view frame]]; + _sapp.framebuffer_width = fb_rect.size.width; + _sapp.framebuffer_height = fb_rect.size.height; + #endif + const NSRect bounds = [_sapp.macos.view bounds]; + _sapp.window_width = bounds.size.width; + _sapp.window_height = bounds.size.height; + if (_sapp.framebuffer_width == 0) { + _sapp.framebuffer_width = 1; + } + if (_sapp.framebuffer_height == 0) { + _sapp.framebuffer_height = 1; + } + if (_sapp.window_width == 0) { + _sapp.window_width = 1; + } + if (_sapp.window_height == 0) { + _sapp.window_height = 1; + } + _sapp.dpi_scale = (float)_sapp.framebuffer_width / (float)_sapp.window_width; + + /* NOTE: _sapp_macos_update_dimensions() isn't called each frame, but only + when the window size actually changes, so resizing the MTKView's + in each call is fine even when MTKView doesn't ignore setting an + identical drawableSize. + */ + #if defined(SOKOL_METAL) + CGSize drawable_size = { (CGFloat) _sapp.framebuffer_width, (CGFloat) _sapp.framebuffer_height }; + _sapp.macos.view.drawableSize = drawable_size; + #endif +} + +_SOKOL_PRIVATE void _sapp_macos_toggle_fullscreen(void) { + /* NOTE: the _sapp.fullscreen flag is also notified by the + windowDidEnterFullscreen / windowDidExitFullscreen + event handlers + */ + _sapp.fullscreen = !_sapp.fullscreen; + [_sapp.macos.window toggleFullScreen:nil]; +} + +_SOKOL_PRIVATE void _sapp_macos_set_clipboard_string(const char* str) { + @autoreleasepool { + NSPasteboard* pasteboard = [NSPasteboard generalPasteboard]; + [pasteboard declareTypes:@[NSPasteboardTypeString] owner:nil]; + [pasteboard setString:@(str) forType:NSPasteboardTypeString]; + } +} + +_SOKOL_PRIVATE const char* _sapp_macos_get_clipboard_string(void) { + SOKOL_ASSERT(_sapp.clipboard.buffer); + @autoreleasepool { + _sapp.clipboard.buffer[0] = 0; + NSPasteboard* pasteboard = [NSPasteboard generalPasteboard]; + if (![[pasteboard types] containsObject:NSPasteboardTypeString]) { + return _sapp.clipboard.buffer; + } + NSString* str = [pasteboard stringForType:NSPasteboardTypeString]; + if (!str) { + return _sapp.clipboard.buffer; + } + _sapp_strcpy([str UTF8String], _sapp.clipboard.buffer, _sapp.clipboard.buf_size); + } + return _sapp.clipboard.buffer; +} + +_SOKOL_PRIVATE void _sapp_macos_update_window_title(void) { + [_sapp.macos.window setTitle: [NSString stringWithUTF8String:_sapp.window_title]]; +} + +_SOKOL_PRIVATE void _sapp_macos_update_mouse(NSEvent* event) { + if (!_sapp.mouse.locked) { + const NSPoint mouse_pos = event.locationInWindow; + float new_x = mouse_pos.x * _sapp.dpi_scale; + float new_y = _sapp.framebuffer_height - (mouse_pos.y * _sapp.dpi_scale) - 1; + /* don't update dx/dy in the very first update */ + if (_sapp.mouse.pos_valid) { + _sapp.mouse.dx = new_x - _sapp.mouse.x; + _sapp.mouse.dy = new_y - _sapp.mouse.y; + } + _sapp.mouse.x = new_x; + _sapp.mouse.y = new_y; + _sapp.mouse.pos_valid = true; + } +} + +_SOKOL_PRIVATE void _sapp_macos_show_mouse(bool visible) { + /* NOTE: this function is only called when the mouse visibility actually changes */ + if (visible) { + CGDisplayShowCursor(kCGDirectMainDisplay); + } + else { + CGDisplayHideCursor(kCGDirectMainDisplay); + } +} + +_SOKOL_PRIVATE void _sapp_macos_lock_mouse(bool lock) { + if (lock == _sapp.mouse.locked) { + return; + } + _sapp.mouse.dx = 0.0f; + _sapp.mouse.dy = 0.0f; + _sapp.mouse.locked = lock; + /* + NOTE that this code doesn't warp the mouse cursor to the window + center as everybody else does it. This lead to a spike in the + *second* mouse-moved event after the warp happened. The + mouse centering doesn't seem to be required (mouse-moved events + are reported correctly even when the cursor is at an edge of the screen). + + NOTE also that the hide/show of the mouse cursor should properly + stack with calls to sapp_show_mouse() + */ + if (_sapp.mouse.locked) { + CGAssociateMouseAndMouseCursorPosition(NO); + CGDisplayHideCursor(kCGDirectMainDisplay); + } + else { + CGDisplayShowCursor(kCGDirectMainDisplay); + CGAssociateMouseAndMouseCursorPosition(YES); + } +} + +_SOKOL_PRIVATE void _sapp_macos_set_icon(const sapp_icon_desc* icon_desc, int num_images) { + NSDockTile* dock_tile = NSApp.dockTile; + const int wanted_width = (int) dock_tile.size.width; + const int wanted_height = (int) dock_tile.size.height; + const int img_index = _sapp_image_bestmatch(icon_desc->images, num_images, wanted_width, wanted_height); + const sapp_image_desc* img_desc = &icon_desc->images[img_index]; + + CGColorSpaceRef cg_color_space = CGColorSpaceCreateDeviceRGB(); + CFDataRef cf_data = CFDataCreate(kCFAllocatorDefault, (const UInt8*)img_desc->pixels.ptr, (CFIndex)img_desc->pixels.size); + CGDataProviderRef cg_data_provider = CGDataProviderCreateWithCFData(cf_data); + CGImageRef cg_img = CGImageCreate( + (size_t)img_desc->width, // width + (size_t)img_desc->height, // height + 8, // bitsPerComponent + 32, // bitsPerPixel + (size_t)img_desc->width * 4,// bytesPerRow + cg_color_space, // space + kCGImageAlphaLast | kCGImageByteOrderDefault, // bitmapInfo + cg_data_provider, // provider + NULL, // decode + false, // shouldInterpolate + kCGRenderingIntentDefault); + CFRelease(cf_data); + CGDataProviderRelease(cg_data_provider); + CGColorSpaceRelease(cg_color_space); + + NSImage* ns_image = [[NSImage alloc] initWithCGImage:cg_img size:dock_tile.size]; + dock_tile.contentView = [NSImageView imageViewWithImage:ns_image]; + [dock_tile display]; + _SAPP_OBJC_RELEASE(ns_image); + CGImageRelease(cg_img); +} + +_SOKOL_PRIVATE void _sapp_macos_frame(void) { + _sapp_frame(); + if (_sapp.quit_requested || _sapp.quit_ordered) { + [_sapp.macos.window performClose:nil]; + } +} + +@implementation _sapp_macos_app_delegate +- (void)applicationDidFinishLaunching:(NSNotification*)aNotification { + _SOKOL_UNUSED(aNotification); + if (_sapp.fullscreen) { + NSRect screen_rect = NSScreen.mainScreen.frame; + _sapp.window_width = screen_rect.size.width; + _sapp.window_height = screen_rect.size.height; + } + if (_sapp.desc.high_dpi) { + _sapp.framebuffer_width = 2 * _sapp.window_width; + _sapp.framebuffer_height = 2 * _sapp.window_height; + } + else { + _sapp.framebuffer_width = _sapp.window_width; + _sapp.framebuffer_height = _sapp.window_height; + } + _sapp.dpi_scale = (float)_sapp.framebuffer_width / (float) _sapp.window_width; + const NSUInteger style = + NSWindowStyleMaskTitled | + NSWindowStyleMaskClosable | + NSWindowStyleMaskMiniaturizable | + NSWindowStyleMaskResizable; + NSRect window_rect = NSMakeRect(0, 0, _sapp.window_width, _sapp.window_height); + _sapp.macos.window = [[_sapp_macos_window alloc] + initWithContentRect:window_rect + styleMask:style + backing:NSBackingStoreBuffered + defer:NO]; + _sapp.macos.window.releasedWhenClosed = NO; // this is necessary for proper cleanup in applicationWillTerminate + _sapp.macos.window.title = [NSString stringWithUTF8String:_sapp.window_title]; + _sapp.macos.window.acceptsMouseMovedEvents = YES; + _sapp.macos.window.restorable = YES; + + _sapp.macos.win_dlg = [[_sapp_macos_window_delegate alloc] init]; + _sapp.macos.window.delegate = _sapp.macos.win_dlg; + #if defined(SOKOL_METAL) + _sapp.macos.mtl_device = MTLCreateSystemDefaultDevice(); + _sapp.macos.view = [[_sapp_macos_view alloc] init]; + [_sapp.macos.view updateTrackingAreas]; + _sapp.macos.view.preferredFramesPerSecond = 60 / _sapp.swap_interval; + _sapp.macos.view.device = _sapp.macos.mtl_device; + _sapp.macos.view.colorPixelFormat = MTLPixelFormatBGRA8Unorm; + _sapp.macos.view.depthStencilPixelFormat = MTLPixelFormatDepth32Float_Stencil8; + _sapp.macos.view.sampleCount = (NSUInteger) _sapp.sample_count; + _sapp.macos.view.autoResizeDrawable = false; + _sapp.macos.window.contentView = _sapp.macos.view; + [_sapp.macos.window makeFirstResponder:_sapp.macos.view]; + _sapp.macos.view.layer.magnificationFilter = kCAFilterNearest; + #elif defined(SOKOL_GLCORE33) + NSOpenGLPixelFormatAttribute attrs[32]; + int i = 0; + attrs[i++] = NSOpenGLPFAAccelerated; + attrs[i++] = NSOpenGLPFADoubleBuffer; + attrs[i++] = NSOpenGLPFAOpenGLProfile; attrs[i++] = NSOpenGLProfileVersion3_2Core; + attrs[i++] = NSOpenGLPFAColorSize; attrs[i++] = 24; + attrs[i++] = NSOpenGLPFAAlphaSize; attrs[i++] = 8; + attrs[i++] = NSOpenGLPFADepthSize; attrs[i++] = 24; + attrs[i++] = NSOpenGLPFAStencilSize; attrs[i++] = 8; + if (_sapp.sample_count > 1) { + attrs[i++] = NSOpenGLPFAMultisample; + attrs[i++] = NSOpenGLPFASampleBuffers; attrs[i++] = 1; + attrs[i++] = NSOpenGLPFASamples; attrs[i++] = (NSOpenGLPixelFormatAttribute)_sapp.sample_count; + } + else { + attrs[i++] = NSOpenGLPFASampleBuffers; attrs[i++] = 0; + } + attrs[i++] = 0; + NSOpenGLPixelFormat* glpixelformat_obj = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; + SOKOL_ASSERT(glpixelformat_obj != nil); + + _sapp.macos.view = [[_sapp_macos_view alloc] + initWithFrame:window_rect + pixelFormat:glpixelformat_obj]; + _SAPP_OBJC_RELEASE(glpixelformat_obj); + [_sapp.macos.view updateTrackingAreas]; + if (_sapp.desc.high_dpi) { + [_sapp.macos.view setWantsBestResolutionOpenGLSurface:YES]; + } + else { + [_sapp.macos.view setWantsBestResolutionOpenGLSurface:NO]; + } + + _sapp.macos.window.contentView = _sapp.macos.view; + [_sapp.macos.window makeFirstResponder:_sapp.macos.view]; + + NSTimer* timer_obj = [NSTimer timerWithTimeInterval:0.001 + target:_sapp.macos.view + selector:@selector(timerFired:) + userInfo:nil + repeats:YES]; + [[NSRunLoop currentRunLoop] addTimer:timer_obj forMode:NSDefaultRunLoopMode]; + timer_obj = nil; + #endif + _sapp.valid = true; + if (_sapp.fullscreen) { + /* on GL, this already toggles a rendered frame, so set the valid flag before */ + [_sapp.macos.window toggleFullScreen:self]; + } + else { + [_sapp.macos.window center]; + } + NSApp.activationPolicy = NSApplicationActivationPolicyRegular; + [NSApp activateIgnoringOtherApps:YES]; + [_sapp.macos.window makeKeyAndOrderFront:nil]; + _sapp_macos_update_dimensions(); + [NSEvent setMouseCoalescingEnabled:NO]; +} + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)sender { + _SOKOL_UNUSED(sender); + return YES; +} + +- (void)applicationWillTerminate:(NSNotification*)notification { + _SOKOL_UNUSED(notification); + _sapp_call_cleanup(); + _sapp_macos_discard_state(); + _sapp_discard_state(); +} +@end + +@implementation _sapp_macos_window_delegate +- (BOOL)windowShouldClose:(id)sender { + _SOKOL_UNUSED(sender); + /* only give user-code a chance to intervene when sapp_quit() wasn't already called */ + if (!_sapp.quit_ordered) { + /* if window should be closed and event handling is enabled, give user code + a chance to intervene via sapp_cancel_quit() + */ + _sapp.quit_requested = true; + _sapp_macos_app_event(SAPP_EVENTTYPE_QUIT_REQUESTED); + /* user code hasn't intervened, quit the app */ + if (_sapp.quit_requested) { + _sapp.quit_ordered = true; + } + } + if (_sapp.quit_ordered) { + return YES; + } + else { + return NO; + } +} + +- (void)windowDidResize:(NSNotification*)notification { + _SOKOL_UNUSED(notification); + _sapp_macos_update_dimensions(); + if (!_sapp.first_frame) { + _sapp_macos_app_event(SAPP_EVENTTYPE_RESIZED); + } +} + +- (void)windowDidMiniaturize:(NSNotification*)notification { + _SOKOL_UNUSED(notification); + _sapp_macos_app_event(SAPP_EVENTTYPE_ICONIFIED); +} + +- (void)windowDidDeminiaturize:(NSNotification*)notification { + _SOKOL_UNUSED(notification); + _sapp_macos_app_event(SAPP_EVENTTYPE_RESTORED); +} + +- (void)windowDidBecomeKey:(NSNotification*)notification { + _SOKOL_UNUSED(notification); + _sapp_macos_app_event(SAPP_EVENTTYPE_FOCUSED); +} + +- (void)windowDidResignKey:(NSNotification*)notification { + _SOKOL_UNUSED(notification); + _sapp_macos_app_event(SAPP_EVENTTYPE_UNFOCUSED); +} + +- (void)windowDidEnterFullScreen:(NSNotification*)notification { + _SOKOL_UNUSED(notification); + _sapp.fullscreen = true; +} + +- (void)windowDidExitFullScreen:(NSNotification*)notification { + _SOKOL_UNUSED(notification); + _sapp.fullscreen = false; +} +@end + +@implementation _sapp_macos_window +- (instancetype)initWithContentRect:(NSRect)contentRect + styleMask:(NSWindowStyleMask)style + backing:(NSBackingStoreType)backingStoreType + defer:(BOOL)flag { + if (self = [super initWithContentRect:contentRect styleMask:style backing:backingStoreType defer:flag]) { + #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 101300 + [self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeFileURL]]; + #endif + } + return self; +} + +- (NSDragOperation)draggingEntered:(id)sender { + return NSDragOperationCopy; +} + +- (NSDragOperation)draggingUpdated:(id)sender { + return NSDragOperationCopy; +} + +- (BOOL)performDragOperation:(id)sender { + #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 101300 + NSPasteboard *pboard = [sender draggingPasteboard]; + if ([pboard.types containsObject:NSPasteboardTypeFileURL]) { + _sapp_clear_drop_buffer(); + _sapp.drop.num_files = ((int)pboard.pasteboardItems.count > _sapp.drop.max_files) ? _sapp.drop.max_files : pboard.pasteboardItems.count; + bool drop_failed = false; + for (int i = 0; i < _sapp.drop.num_files; i++) { + NSURL *fileUrl = [NSURL fileURLWithPath:[pboard.pasteboardItems[(NSUInteger)i] stringForType:NSPasteboardTypeFileURL]]; + if (!_sapp_strcpy(fileUrl.standardizedURL.path.UTF8String, _sapp_dropped_file_path_ptr(i), _sapp.drop.max_path_length)) { + SOKOL_LOG("sokol_app.h: dropped file path too long (sapp_desc.max_dropped_file_path_length)\n"); + drop_failed = true; + break; + } + } + if (!drop_failed) { + if (_sapp_events_enabled()) { + _sapp_init_event(SAPP_EVENTTYPE_FILES_DROPPED); + _sapp_call_event(&_sapp.event); + } + } + else { + _sapp_clear_drop_buffer(); + _sapp.drop.num_files = 0; + } + return YES; + } + #endif + return NO; +} +@end + +@implementation _sapp_macos_view +#if defined(SOKOL_GLCORE33) +/* NOTE: this is a hack/fix when the initial window size has been clipped by + macOS because it didn't fit on the screen, in that case the + frame size of the window is reported wrong if low-dpi rendering + was requested (instead the high-dpi dimensions are returned) + until the window is resized for the first time. + + Hooking into reshape and getting the frame dimensions seems to report + the correct dimensions. +*/ +- (void)reshape { + _sapp_macos_update_dimensions(); + [super reshape]; +} +- (void)timerFired:(id)sender { + _SOKOL_UNUSED(sender); + [self setNeedsDisplay:YES]; +} +- (void)prepareOpenGL { + [super prepareOpenGL]; + GLint swapInt = 1; + NSOpenGLContext* ctx = [_sapp.macos.view openGLContext]; + [ctx setValues:&swapInt forParameter:NSOpenGLContextParameterSwapInterval]; + [ctx makeCurrentContext]; +} +#endif + +_SOKOL_PRIVATE void _sapp_macos_poll_input_events() { + /* + + NOTE: late event polling temporarily out-commented to check if this + causes infrequent and almost impossible to reproduce probelms with the + window close events, see: + https://github.com/floooh/sokol/pull/483#issuecomment-805148815 + + + const NSEventMask mask = NSEventMaskLeftMouseDown | + NSEventMaskLeftMouseUp| + NSEventMaskRightMouseDown | + NSEventMaskRightMouseUp | + NSEventMaskMouseMoved | + NSEventMaskLeftMouseDragged | + NSEventMaskRightMouseDragged | + NSEventMaskMouseEntered | + NSEventMaskMouseExited | + NSEventMaskKeyDown | + NSEventMaskKeyUp | + NSEventMaskCursorUpdate | + NSEventMaskScrollWheel | + NSEventMaskTabletPoint | + NSEventMaskTabletProximity | + NSEventMaskOtherMouseDown | + NSEventMaskOtherMouseUp | + NSEventMaskOtherMouseDragged | + NSEventMaskPressure | + NSEventMaskDirectTouch; + @autoreleasepool { + for (;;) { + // NOTE: using NSDefaultRunLoopMode here causes stuttering in the GL backend, + // see: https://github.com/floooh/sokol/issues/486 + NSEvent* event = [NSApp nextEventMatchingMask:mask untilDate:nil inMode:NSEventTrackingRunLoopMode dequeue:YES]; + if (event == nil) { + break; + } + [NSApp sendEvent:event]; + } + } + */ +} + +- (void)drawRect:(NSRect)rect { + _SOKOL_UNUSED(rect); + /* Catch any last-moment input events */ + _sapp_macos_poll_input_events(); + @autoreleasepool { + _sapp_macos_frame(); + } + #if !defined(SOKOL_METAL) + [[_sapp.macos.view openGLContext] flushBuffer]; + #endif +} + +- (BOOL)isOpaque { + return YES; +} +- (BOOL)canBecomeKeyView { + return YES; +} +- (BOOL)acceptsFirstResponder { + return YES; +} +- (void)updateTrackingAreas { + if (_sapp.macos.tracking_area != nil) { + [self removeTrackingArea:_sapp.macos.tracking_area]; + _SAPP_OBJC_RELEASE(_sapp.macos.tracking_area); + } + const NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited | + NSTrackingActiveInKeyWindow | + NSTrackingEnabledDuringMouseDrag | + NSTrackingCursorUpdate | + NSTrackingInVisibleRect | + NSTrackingAssumeInside; + _sapp.macos.tracking_area = [[NSTrackingArea alloc] initWithRect:[self bounds] options:options owner:self userInfo:nil]; + [self addTrackingArea:_sapp.macos.tracking_area]; + [super updateTrackingAreas]; +} +- (void)mouseEntered:(NSEvent*)event { + _sapp_macos_update_mouse(event); + /* don't send mouse enter/leave while dragging (so that it behaves the same as + on Windows while SetCapture is active + */ + if (0 == _sapp.macos.mouse_buttons) { + _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_ENTER, SAPP_MOUSEBUTTON_INVALID, _sapp_macos_mods(event)); + } +} +- (void)mouseExited:(NSEvent*)event { + _sapp_macos_update_mouse(event); + if (0 == _sapp.macos.mouse_buttons) { + _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_LEAVE, SAPP_MOUSEBUTTON_INVALID, _sapp_macos_mods(event)); + } +} +- (void)mouseDown:(NSEvent*)event { + _sapp_macos_update_mouse(event); + _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_DOWN, SAPP_MOUSEBUTTON_LEFT, _sapp_macos_mods(event)); + _sapp.macos.mouse_buttons |= (1< 0.0f) || (_sapp_absf(dy) > 0.0f)) { + _sapp_init_event(SAPP_EVENTTYPE_MOUSE_SCROLL); + _sapp.event.modifiers = _sapp_macos_mods(event); + _sapp.event.scroll_x = dx; + _sapp.event.scroll_y = dy; + _sapp_call_event(&_sapp.event); + } + } +} +- (void)keyDown:(NSEvent*)event { + if (_sapp_events_enabled()) { + const uint32_t mods = _sapp_macos_mods(event); + /* NOTE: macOS doesn't send keyUp events while the Cmd key is pressed, + as a workaround, to prevent key presses from sticking we'll send + a keyup event following right after the keydown if SUPER is also pressed + */ + const sapp_keycode key_code = _sapp_translate_key(event.keyCode); + _sapp_macos_key_event(SAPP_EVENTTYPE_KEY_DOWN, key_code, event.isARepeat, mods); + if (0 != (mods & SAPP_MODIFIER_SUPER)) { + _sapp_macos_key_event(SAPP_EVENTTYPE_KEY_UP, key_code, event.isARepeat, mods); + } + const NSString* chars = event.characters; + const NSUInteger len = chars.length; + if (len > 0) { + _sapp_init_event(SAPP_EVENTTYPE_CHAR); + _sapp.event.modifiers = mods; + for (NSUInteger i = 0; i < len; i++) { + const unichar codepoint = [chars characterAtIndex:i]; + if ((codepoint & 0xFF00) == 0xF700) { + continue; + } + _sapp.event.char_code = codepoint; + _sapp.event.key_repeat = event.isARepeat; + _sapp_call_event(&_sapp.event); + } + } + /* if this is a Cmd+V (paste), also send a CLIPBOARD_PASTE event */ + if (_sapp.clipboard.enabled && (mods == SAPP_MODIFIER_SUPER) && (key_code == SAPP_KEYCODE_V)) { + _sapp_init_event(SAPP_EVENTTYPE_CLIPBOARD_PASTED); + _sapp_call_event(&_sapp.event); + } + } +} +- (void)keyUp:(NSEvent*)event { + _sapp_macos_key_event(SAPP_EVENTTYPE_KEY_UP, + _sapp_translate_key(event.keyCode), + event.isARepeat, + _sapp_macos_mods(event)); +} +- (void)flagsChanged:(NSEvent*)event { + const uint32_t old_f = _sapp.macos.flags_changed_store; + const uint32_t new_f = event.modifierFlags; + _sapp.macos.flags_changed_store = new_f; + sapp_keycode key_code = SAPP_KEYCODE_INVALID; + bool down = false; + if ((new_f ^ old_f) & NSEventModifierFlagShift) { + key_code = SAPP_KEYCODE_LEFT_SHIFT; + down = 0 != (new_f & NSEventModifierFlagShift); + } + if ((new_f ^ old_f) & NSEventModifierFlagControl) { + key_code = SAPP_KEYCODE_LEFT_CONTROL; + down = 0 != (new_f & NSEventModifierFlagControl); + } + if ((new_f ^ old_f) & NSEventModifierFlagOption) { + key_code = SAPP_KEYCODE_LEFT_ALT; + down = 0 != (new_f & NSEventModifierFlagOption); + } + if ((new_f ^ old_f) & NSEventModifierFlagCommand) { + key_code = SAPP_KEYCODE_LEFT_SUPER; + down = 0 != (new_f & NSEventModifierFlagCommand); + } + if (key_code != SAPP_KEYCODE_INVALID) { + _sapp_macos_key_event(down ? SAPP_EVENTTYPE_KEY_DOWN : SAPP_EVENTTYPE_KEY_UP, + key_code, + false, + _sapp_macos_mods(event)); + } +} +- (void)cursorUpdate:(NSEvent*)event { + _SOKOL_UNUSED(event); + if (_sapp.desc.user_cursor) { + _sapp_macos_app_event(SAPP_EVENTTYPE_UPDATE_CURSOR); + } +} +@end + +#endif /* MacOS */ + +/*== iOS =====================================================================*/ +#if defined(_SAPP_IOS) + +_SOKOL_PRIVATE void _sapp_ios_discard_state(void) { + // NOTE: it's safe to call [release] on a nil object + _SAPP_OBJC_RELEASE(_sapp.ios.textfield_dlg); + _SAPP_OBJC_RELEASE(_sapp.ios.textfield); + #if defined(SOKOL_METAL) + _SAPP_OBJC_RELEASE(_sapp.ios.view_ctrl); + _SAPP_OBJC_RELEASE(_sapp.ios.mtl_device); + #else + _SAPP_OBJC_RELEASE(_sapp.ios.view_ctrl); + _SAPP_OBJC_RELEASE(_sapp.ios.eagl_ctx); + #endif + _SAPP_OBJC_RELEASE(_sapp.ios.view); + _SAPP_OBJC_RELEASE(_sapp.ios.window); +} + +_SOKOL_PRIVATE void _sapp_ios_run(const sapp_desc* desc) { + _sapp_init_state(desc); + static int argc = 1; + static char* argv[] = { (char*)"sokol_app" }; + UIApplicationMain(argc, argv, nil, NSStringFromClass([_sapp_app_delegate class])); +} + +/* iOS entry function */ +#if !defined(SOKOL_NO_ENTRY) +int main(int argc, char* argv[]) { + sapp_desc desc = sokol_main(argc, argv); + _sapp_ios_run(&desc); + return 0; +} +#endif /* SOKOL_NO_ENTRY */ + +_SOKOL_PRIVATE void _sapp_ios_app_event(sapp_event_type type) { + if (_sapp_events_enabled()) { + _sapp_init_event(type); + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE void _sapp_ios_touch_event(sapp_event_type type, NSSet* touches, UIEvent* event) { + if (_sapp_events_enabled()) { + _sapp_init_event(type); + NSEnumerator* enumerator = event.allTouches.objectEnumerator; + UITouch* ios_touch; + while ((ios_touch = [enumerator nextObject])) { + if ((_sapp.event.num_touches + 1) < SAPP_MAX_TOUCHPOINTS) { + CGPoint ios_pos = [ios_touch locationInView:_sapp.ios.view]; + sapp_touchpoint* cur_point = &_sapp.event.touches[_sapp.event.num_touches++]; + cur_point->identifier = (uintptr_t) ios_touch; + cur_point->pos_x = ios_pos.x * _sapp.dpi_scale; + cur_point->pos_y = ios_pos.y * _sapp.dpi_scale; + cur_point->changed = [touches containsObject:ios_touch]; + } + } + if (_sapp.event.num_touches > 0) { + _sapp_call_event(&_sapp.event); + } + } +} + +_SOKOL_PRIVATE void _sapp_ios_update_dimensions(void) { + CGRect screen_rect = UIScreen.mainScreen.bounds; + _sapp.framebuffer_width = (int)(screen_rect.size.width * _sapp.dpi_scale); + _sapp.framebuffer_height = (int)(screen_rect.size.height * _sapp.dpi_scale); + _sapp.window_width = (int)screen_rect.size.width; + _sapp.window_height = (int)screen_rect.size.height; + int cur_fb_width, cur_fb_height; + #if defined(SOKOL_METAL) + const CGSize fb_size = _sapp.ios.view.drawableSize; + cur_fb_width = (int) fb_size.width; + cur_fb_height = (int) fb_size.height; + #else + cur_fb_width = (int) _sapp.ios.view.drawableWidth; + cur_fb_height = (int) _sapp.ios.view.drawableHeight; + #endif + const bool dim_changed = (_sapp.framebuffer_width != cur_fb_width) || + (_sapp.framebuffer_height != cur_fb_height); + if (dim_changed) { + #if defined(SOKOL_METAL) + const CGSize drawable_size = { (CGFloat) _sapp.framebuffer_width, (CGFloat) _sapp.framebuffer_height }; + _sapp.ios.view.drawableSize = drawable_size; + #else + // nothing to do here, GLKView correctly respects the view's contentScaleFactor + #endif + if (!_sapp.first_frame) { + _sapp_ios_app_event(SAPP_EVENTTYPE_RESIZED); + } + } +} + +_SOKOL_PRIVATE void _sapp_ios_frame(void) { + _sapp_ios_update_dimensions(); + _sapp_frame(); +} + +_SOKOL_PRIVATE void _sapp_ios_show_keyboard(bool shown) { + /* if not happened yet, create an invisible text field */ + if (nil == _sapp.ios.textfield) { + _sapp.ios.textfield_dlg = [[_sapp_textfield_dlg alloc] init]; + _sapp.ios.textfield = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 100, 50)]; + _sapp.ios.textfield.keyboardType = UIKeyboardTypeDefault; + _sapp.ios.textfield.returnKeyType = UIReturnKeyDefault; + _sapp.ios.textfield.autocapitalizationType = UITextAutocapitalizationTypeNone; + _sapp.ios.textfield.autocorrectionType = UITextAutocorrectionTypeNo; + _sapp.ios.textfield.spellCheckingType = UITextSpellCheckingTypeNo; + _sapp.ios.textfield.hidden = YES; + _sapp.ios.textfield.text = @"x"; + _sapp.ios.textfield.delegate = _sapp.ios.textfield_dlg; + [_sapp.ios.view_ctrl.view addSubview:_sapp.ios.textfield]; + + [[NSNotificationCenter defaultCenter] addObserver:_sapp.ios.textfield_dlg + selector:@selector(keyboardWasShown:) + name:UIKeyboardDidShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:_sapp.ios.textfield_dlg + selector:@selector(keyboardWillBeHidden:) + name:UIKeyboardWillHideNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:_sapp.ios.textfield_dlg + selector:@selector(keyboardDidChangeFrame:) + name:UIKeyboardDidChangeFrameNotification object:nil]; + } + if (shown) { + /* setting the text field as first responder brings up the onscreen keyboard */ + [_sapp.ios.textfield becomeFirstResponder]; + } + else { + [_sapp.ios.textfield resignFirstResponder]; + } +} + +@implementation _sapp_app_delegate +- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { + CGRect screen_rect = UIScreen.mainScreen.bounds; + _sapp.ios.window = [[UIWindow alloc] initWithFrame:screen_rect]; + _sapp.window_width = screen_rect.size.width; + _sapp.window_height = screen_rect.size.height; + if (_sapp.desc.high_dpi) { + _sapp.dpi_scale = (float) UIScreen.mainScreen.nativeScale; + } + else { + _sapp.dpi_scale = 1.0f; + } + _sapp.framebuffer_width = _sapp.window_width * _sapp.dpi_scale; + _sapp.framebuffer_height = _sapp.window_height * _sapp.dpi_scale; + #if defined(SOKOL_METAL) + _sapp.ios.mtl_device = MTLCreateSystemDefaultDevice(); + _sapp.ios.view = [[_sapp_ios_view alloc] init]; + _sapp.ios.view.preferredFramesPerSecond = 60 / _sapp.swap_interval; + _sapp.ios.view.device = _sapp.ios.mtl_device; + _sapp.ios.view.colorPixelFormat = MTLPixelFormatBGRA8Unorm; + _sapp.ios.view.depthStencilPixelFormat = MTLPixelFormatDepth32Float_Stencil8; + _sapp.ios.view.sampleCount = (NSUInteger)_sapp.sample_count; + /* NOTE: iOS MTKView seems to ignore thew view's contentScaleFactor + and automatically renders at Retina resolution. We'll disable + autoResize and instead do the resizing in _sapp_ios_update_dimensions() + */ + _sapp.ios.view.autoResizeDrawable = false; + _sapp.ios.view.userInteractionEnabled = YES; + _sapp.ios.view.multipleTouchEnabled = YES; + _sapp.ios.view_ctrl = [[UIViewController alloc] init]; + _sapp.ios.view_ctrl.modalPresentationStyle = UIModalPresentationFullScreen; + _sapp.ios.view_ctrl.view = _sapp.ios.view; + _sapp.ios.window.rootViewController = _sapp.ios.view_ctrl; + #else + if (_sapp.desc.gl_force_gles2) { + _sapp.ios.eagl_ctx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; + _sapp.gles2_fallback = true; + } + else { + _sapp.ios.eagl_ctx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; + if (_sapp.ios.eagl_ctx == nil) { + _sapp.ios.eagl_ctx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; + _sapp.gles2_fallback = true; + } + } + _sapp.ios.view = [[_sapp_ios_view alloc] initWithFrame:screen_rect]; + _sapp.ios.view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888; + _sapp.ios.view.drawableDepthFormat = GLKViewDrawableDepthFormat24; + _sapp.ios.view.drawableStencilFormat = GLKViewDrawableStencilFormatNone; + GLKViewDrawableMultisample msaa = _sapp.sample_count > 1 ? GLKViewDrawableMultisample4X : GLKViewDrawableMultisampleNone; + _sapp.ios.view.drawableMultisample = msaa; + _sapp.ios.view.context = _sapp.ios.eagl_ctx; + _sapp.ios.view.enableSetNeedsDisplay = NO; + _sapp.ios.view.userInteractionEnabled = YES; + _sapp.ios.view.multipleTouchEnabled = YES; + // on GLKView, contentScaleFactor appears to work just fine! + if (_sapp.desc.high_dpi) { + _sapp.ios.view.contentScaleFactor = _sapp.dpi_scale; + } + else { + _sapp.ios.view.contentScaleFactor = 1.0; + } + _sapp.ios.view_ctrl = [[GLKViewController alloc] init]; + _sapp.ios.view_ctrl.view = _sapp.ios.view; + _sapp.ios.view_ctrl.preferredFramesPerSecond = 60 / _sapp.swap_interval; + _sapp.ios.window.rootViewController = _sapp.ios.view_ctrl; + #endif + [_sapp.ios.window makeKeyAndVisible]; + + _sapp.valid = true; + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application { + if (!_sapp.ios.suspended) { + _sapp.ios.suspended = true; + _sapp_ios_app_event(SAPP_EVENTTYPE_SUSPENDED); + } +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + if (_sapp.ios.suspended) { + _sapp.ios.suspended = false; + _sapp_ios_app_event(SAPP_EVENTTYPE_RESUMED); + } +} + +/* NOTE: this method will rarely ever be called, iOS application + which are terminated by the user are usually killed via signal 9 + by the operating system. +*/ +- (void)applicationWillTerminate:(UIApplication *)application { + _SOKOL_UNUSED(application); + _sapp_call_cleanup(); + _sapp_ios_discard_state(); + _sapp_discard_state(); +} +@end + +@implementation _sapp_textfield_dlg +- (void)keyboardWasShown:(NSNotification*)notif { + _sapp.onscreen_keyboard_shown = true; + /* query the keyboard's size, and modify the content view's size */ + if (_sapp.desc.ios_keyboard_resizes_canvas) { + NSDictionary* info = notif.userInfo; + CGFloat kbd_h = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height; + CGRect view_frame = UIScreen.mainScreen.bounds; + view_frame.size.height -= kbd_h; + _sapp.ios.view.frame = view_frame; + } +} +- (void)keyboardWillBeHidden:(NSNotification*)notif { + _sapp.onscreen_keyboard_shown = false; + if (_sapp.desc.ios_keyboard_resizes_canvas) { + _sapp.ios.view.frame = UIScreen.mainScreen.bounds; + } +} +- (void)keyboardDidChangeFrame:(NSNotification*)notif { + /* this is for the case when the screen rotation changes while the keyboard is open */ + if (_sapp.onscreen_keyboard_shown && _sapp.desc.ios_keyboard_resizes_canvas) { + NSDictionary* info = notif.userInfo; + CGFloat kbd_h = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height; + CGRect view_frame = UIScreen.mainScreen.bounds; + view_frame.size.height -= kbd_h; + _sapp.ios.view.frame = view_frame; + } +} +- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string { + if (_sapp_events_enabled()) { + const NSUInteger len = string.length; + if (len > 0) { + for (NSUInteger i = 0; i < len; i++) { + unichar c = [string characterAtIndex:i]; + if (c >= 32) { + /* ignore surrogates for now */ + if ((c < 0xD800) || (c > 0xDFFF)) { + _sapp_init_event(SAPP_EVENTTYPE_CHAR); + _sapp.event.char_code = c; + _sapp_call_event(&_sapp.event); + } + } + if (c <= 32) { + sapp_keycode k = SAPP_KEYCODE_INVALID; + switch (c) { + case 10: k = SAPP_KEYCODE_ENTER; break; + case 32: k = SAPP_KEYCODE_SPACE; break; + default: break; + } + if (k != SAPP_KEYCODE_INVALID) { + _sapp_init_event(SAPP_EVENTTYPE_KEY_DOWN); + _sapp.event.key_code = k; + _sapp_call_event(&_sapp.event); + _sapp_init_event(SAPP_EVENTTYPE_KEY_UP); + _sapp.event.key_code = k; + _sapp_call_event(&_sapp.event); + } + } + } + } + else { + /* this was a backspace */ + _sapp_init_event(SAPP_EVENTTYPE_KEY_DOWN); + _sapp.event.key_code = SAPP_KEYCODE_BACKSPACE; + _sapp_call_event(&_sapp.event); + _sapp_init_event(SAPP_EVENTTYPE_KEY_UP); + _sapp.event.key_code = SAPP_KEYCODE_BACKSPACE; + _sapp_call_event(&_sapp.event); + } + } + return NO; +} +@end + +@implementation _sapp_ios_view +- (void)drawRect:(CGRect)rect { + _SOKOL_UNUSED(rect); + @autoreleasepool { + _sapp_ios_frame(); + } +} +- (BOOL)isOpaque { + return YES; +} +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event { + _sapp_ios_touch_event(SAPP_EVENTTYPE_TOUCHES_BEGAN, touches, event); +} +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent*)event { + _sapp_ios_touch_event(SAPP_EVENTTYPE_TOUCHES_MOVED, touches, event); +} +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent*)event { + _sapp_ios_touch_event(SAPP_EVENTTYPE_TOUCHES_ENDED, touches, event); +} +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent*)event { + _sapp_ios_touch_event(SAPP_EVENTTYPE_TOUCHES_CANCELLED, touches, event); +} +@end +#endif /* TARGET_OS_IPHONE */ + +#endif /* _SAPP_APPLE */ + +/*== EMSCRIPTEN ==============================================================*/ +#if defined(_SAPP_EMSCRIPTEN) + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void (*_sapp_html5_fetch_callback) (const sapp_html5_fetch_response*); + +/* this function is called from a JS event handler when the user hides + the onscreen keyboard pressing the 'dismiss keyboard key' +*/ +EMSCRIPTEN_KEEPALIVE void _sapp_emsc_notify_keyboard_hidden(void) { + _sapp.onscreen_keyboard_shown = false; +} + +EMSCRIPTEN_KEEPALIVE void _sapp_emsc_onpaste(const char* str) { + if (_sapp.clipboard.enabled) { + _sapp_strcpy(str, _sapp.clipboard.buffer, _sapp.clipboard.buf_size); + if (_sapp_events_enabled()) { + _sapp_init_event(SAPP_EVENTTYPE_CLIPBOARD_PASTED); + _sapp_call_event(&_sapp.event); + } + } +} + +/* https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload */ +EMSCRIPTEN_KEEPALIVE int _sapp_html5_get_ask_leave_site(void) { + return _sapp.html5_ask_leave_site ? 1 : 0; +} + +EMSCRIPTEN_KEEPALIVE void _sapp_emsc_begin_drop(int num) { + if (!_sapp.drop.enabled) { + return; + } + if (num < 0) { + num = 0; + } + if (num > _sapp.drop.max_files) { + num = _sapp.drop.max_files; + } + _sapp.drop.num_files = num; + _sapp_clear_drop_buffer(); +} + +EMSCRIPTEN_KEEPALIVE void _sapp_emsc_drop(int i, const char* name) { + /* NOTE: name is only the filename part, not a path */ + if (!_sapp.drop.enabled) { + return; + } + if (0 == name) { + return; + } + SOKOL_ASSERT(_sapp.drop.num_files <= _sapp.drop.max_files); + if ((i < 0) || (i >= _sapp.drop.num_files)) { + return; + } + if (!_sapp_strcpy(name, _sapp_dropped_file_path_ptr(i), _sapp.drop.max_path_length)) { + SOKOL_LOG("sokol_app.h: dropped file path too long!\n"); + _sapp.drop.num_files = 0; + } +} + +EMSCRIPTEN_KEEPALIVE void _sapp_emsc_end_drop(int x, int y) { + if (!_sapp.drop.enabled) { + return; + } + if (0 == _sapp.drop.num_files) { + /* there was an error copying the filenames */ + _sapp_clear_drop_buffer(); + return; + + } + if (_sapp_events_enabled()) { + _sapp.mouse.x = (float)x * _sapp.dpi_scale; + _sapp.mouse.y = (float)y * _sapp.dpi_scale; + _sapp.mouse.dx = 0.0f; + _sapp.mouse.dy = 0.0f; + _sapp_init_event(SAPP_EVENTTYPE_FILES_DROPPED); + _sapp_call_event(&_sapp.event); + } +} + +EMSCRIPTEN_KEEPALIVE void _sapp_emsc_invoke_fetch_cb(int index, int success, int error_code, _sapp_html5_fetch_callback callback, uint32_t fetched_size, void* buf_ptr, uint32_t buf_size, void* user_data) { + sapp_html5_fetch_response response; + memset(&response, 0, sizeof(response)); + response.succeeded = (0 != success); + response.error_code = (sapp_html5_fetch_error) error_code; + response.file_index = index; + response.fetched_size = fetched_size; + response.buffer_ptr = buf_ptr; + response.buffer_size = buf_size; + response.user_data = user_data; + callback(&response); +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/* Javascript helper functions for mobile virtual keyboard input */ +EM_JS(void, sapp_js_create_textfield, (void), { + var _sapp_inp = document.createElement("input"); + _sapp_inp.type = "text"; + _sapp_inp.id = "_sokol_app_input_element"; + _sapp_inp.autocapitalize = "none"; + _sapp_inp.addEventListener("focusout", function(_sapp_event) { + __sapp_emsc_notify_keyboard_hidden() + + }); + document.body.append(_sapp_inp); +}); + +EM_JS(void, sapp_js_focus_textfield, (void), { + document.getElementById("_sokol_app_input_element").focus(); +}); + +EM_JS(void, sapp_js_unfocus_textfield, (void), { + document.getElementById("_sokol_app_input_element").blur(); +}); + +EM_JS(void, sapp_js_add_beforeunload_listener, (void), { + Module.sokol_beforeunload = function(event) { + if (__sapp_html5_get_ask_leave_site() != 0) { + event.preventDefault(); + event.returnValue = ' '; + } + }; + window.addEventListener('beforeunload', Module.sokol_beforeunload); +}); + +EM_JS(void, sapp_js_remove_beforeunload_listener, (void), { + window.removeEventListener('beforeunload', Module.sokol_beforeunload); +}); + +EM_JS(void, sapp_js_add_clipboard_listener, (void), { + Module.sokol_paste = function(event) { + var pasted_str = event.clipboardData.getData('text'); + ccall('_sapp_emsc_onpaste', 'void', ['string'], [pasted_str]); + }; + window.addEventListener('paste', Module.sokol_paste); +}); + +EM_JS(void, sapp_js_remove_clipboard_listener, (void), { + window.removeEventListener('paste', Module.sokol_paste); +}); + +EM_JS(void, sapp_js_write_clipboard, (const char* c_str), { + var str = UTF8ToString(c_str); + var ta = document.createElement('textarea'); + ta.setAttribute('autocomplete', 'off'); + ta.setAttribute('autocorrect', 'off'); + ta.setAttribute('autocapitalize', 'off'); + ta.setAttribute('spellcheck', 'false'); + ta.style.left = -100 + 'px'; + ta.style.top = -100 + 'px'; + ta.style.height = 1; + ta.style.width = 1; + ta.value = str; + document.body.appendChild(ta); + ta.select(); + document.execCommand('copy'); + document.body.removeChild(ta); +}); + +_SOKOL_PRIVATE void _sapp_emsc_set_clipboard_string(const char* str) { + sapp_js_write_clipboard(str); +} + +EM_JS(void, sapp_js_add_dragndrop_listeners, (const char* canvas_name_cstr), { + Module.sokol_drop_files = []; + var canvas_name = UTF8ToString(canvas_name_cstr); + var canvas = document.getElementById(canvas_name); + Module.sokol_dragenter = function(event) { + event.stopPropagation(); + event.preventDefault(); + }; + Module.sokol_dragleave = function(event) { + event.stopPropagation(); + event.preventDefault(); + }; + Module.sokol_dragover = function(event) { + event.stopPropagation(); + event.preventDefault(); + }; + Module.sokol_drop = function(event) { + event.stopPropagation(); + event.preventDefault(); + var files = event.dataTransfer.files; + Module.sokol_dropped_files = files; + __sapp_emsc_begin_drop(files.length); + var i; + for (i = 0; i < files.length; i++) { + ccall('_sapp_emsc_drop', 'void', ['number', 'string'], [i, files[i].name]); + } + // FIXME? see computation of targetX/targetY in emscripten via getClientBoundingRect + __sapp_emsc_end_drop(event.clientX, event.clientY); + }; + canvas.addEventListener('dragenter', Module.sokol_dragenter, false); + canvas.addEventListener('dragleave', Module.sokol_dragleave, false); + canvas.addEventListener('dragover', Module.sokol_dragover, false); + canvas.addEventListener('drop', Module.sokol_drop, false); +}); + +EM_JS(uint32_t, sapp_js_dropped_file_size, (int index), { + if ((index < 0) || (index >= Module.sokol_dropped_files.length)) { + return 0; + } + else { + return Module.sokol_dropped_files[index].size; + } +}); + +EM_JS(void, sapp_js_fetch_dropped_file, (int index, _sapp_html5_fetch_callback callback, void* buf_ptr, uint32_t buf_size, void* user_data), { + var reader = new FileReader(); + reader.onload = function(loadEvent) { + var content = loadEvent.target.result; + if (content.byteLength > buf_size) { + // SAPP_HTML5_FETCH_ERROR_BUFFER_TOO_SMALL + __sapp_emsc_invoke_fetch_cb(index, 0, 1, callback, 0, buf_ptr, buf_size, user_data); + } + else { + HEAPU8.set(new Uint8Array(content), buf_ptr); + __sapp_emsc_invoke_fetch_cb(index, 1, 0, callback, content.byteLength, buf_ptr, buf_size, user_data); + } + }; + reader.onerror = function() { + // SAPP_HTML5_FETCH_ERROR_OTHER + __sapp_emsc_invoke_fetch_cb(index, 0, 2, callback, 0, buf_ptr, buf_size, user_data); + }; + reader.readAsArrayBuffer(Module.sokol_dropped_files[index]); +}); + +EM_JS(void, sapp_js_remove_dragndrop_listeners, (const char* canvas_name_cstr), { + var canvas_name = UTF8ToString(canvas_name_cstr); + var canvas = document.getElementById(canvas_name); + canvas.removeEventListener('dragenter', Module.sokol_dragenter); + canvas.removeEventListener('dragleave', Module.sokol_dragleave); + canvas.removeEventListener('dragover', Module.sokol_dragover); + canvas.removeEventListener('drop', Module.sokol_drop); +}); + +/* called from the emscripten event handler to update the keyboard visibility + state, this must happen from an JS input event handler, otherwise + the request will be ignored by the browser +*/ +_SOKOL_PRIVATE void _sapp_emsc_update_keyboard_state(void) { + if (_sapp.emsc.wants_show_keyboard) { + /* create input text field on demand */ + if (!_sapp.emsc.textfield_created) { + _sapp.emsc.textfield_created = true; + sapp_js_create_textfield(); + } + /* focus the text input field, this will bring up the keyboard */ + _sapp.onscreen_keyboard_shown = true; + _sapp.emsc.wants_show_keyboard = false; + sapp_js_focus_textfield(); + } + if (_sapp.emsc.wants_hide_keyboard) { + /* unfocus the text input field */ + if (_sapp.emsc.textfield_created) { + _sapp.onscreen_keyboard_shown = false; + _sapp.emsc.wants_hide_keyboard = false; + sapp_js_unfocus_textfield(); + } + } +} + +/* actually showing the onscreen keyboard must be initiated from a JS + input event handler, so we'll just keep track of the desired + state, and the actual state change will happen with the next input event +*/ +_SOKOL_PRIVATE void _sapp_emsc_show_keyboard(bool show) { + if (show) { + _sapp.emsc.wants_show_keyboard = true; + } + else { + _sapp.emsc.wants_hide_keyboard = true; + } +} + +EM_JS(void, sapp_js_pointer_init, (const char* c_str_target), { + // lookup and store canvas object by name + var target_str = UTF8ToString(c_str_target); + Module.sapp_emsc_target = document.getElementById(target_str); + if (!Module.sapp_emsc_target) { + console.log("sokol_app.h: invalid target:" + target_str); + } + if (!Module.sapp_emsc_target.requestPointerLock) { + console.log("sokol_app.h: target doesn't support requestPointerLock:" + target_str); + } +}); + +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_pointerlockchange_cb(int emsc_type, const EmscriptenPointerlockChangeEvent* emsc_event, void* user_data) { + _SOKOL_UNUSED(emsc_type); + _SOKOL_UNUSED(user_data); + _sapp.mouse.locked = emsc_event->isActive; + return EM_TRUE; +} + +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_pointerlockerror_cb(int emsc_type, const void* reserved, void* user_data) { + _SOKOL_UNUSED(emsc_type); + _SOKOL_UNUSED(reserved); + _SOKOL_UNUSED(user_data); + _sapp.mouse.locked = false; + _sapp.emsc.mouse_lock_requested = false; + return true; +} + +EM_JS(void, sapp_js_request_pointerlock, (void), { + if (Module.sapp_emsc_target) { + if (Module.sapp_emsc_target.requestPointerLock) { + Module.sapp_emsc_target.requestPointerLock(); + } + } +}); + +EM_JS(void, sapp_js_exit_pointerlock, (void), { + if (document.exitPointerLock) { + document.exitPointerLock(); + } +}); + +_SOKOL_PRIVATE void _sapp_emsc_lock_mouse(bool lock) { + if (lock) { + /* request mouse-lock during event handler invocation (see _sapp_emsc_update_mouse_lock_state) */ + _sapp.emsc.mouse_lock_requested = true; + } + else { + /* NOTE: the _sapp.mouse_locked state will be set in the pointerlockchange callback */ + _sapp.emsc.mouse_lock_requested = false; + sapp_js_exit_pointerlock(); + } +} + +/* called from inside event handlers to check if mouse lock had been requested, + and if yes, actually enter mouse lock. +*/ +_SOKOL_PRIVATE void _sapp_emsc_update_mouse_lock_state(void) { + if (_sapp.emsc.mouse_lock_requested) { + _sapp.emsc.mouse_lock_requested = false; + sapp_js_request_pointerlock(); + } +} + +/* JS helper functions to update browser tab favicon */ +EM_JS(void, sapp_js_clear_favicon, (void), { + var link = document.getElementById('sokol-app-favicon'); + if (link) { + document.head.removeChild(link); + } +}); + +EM_JS(void, sapp_js_set_favicon, (int w, int h, const uint8_t* pixels), { + var canvas = document.createElement('canvas'); + canvas.width = w; + canvas.height = h; + var ctx = canvas.getContext('2d'); + var img_data = ctx.createImageData(w, h); + img_data.data.set(HEAPU8.subarray(pixels, pixels + w*h*4)); + ctx.putImageData(img_data, 0, 0); + var new_link = document.createElement('link'); + new_link.id = 'sokol-app-favicon'; + new_link.rel = 'shortcut icon'; + new_link.href = canvas.toDataURL(); + document.head.appendChild(new_link); +}); + +_SOKOL_PRIVATE void _sapp_emsc_set_icon(const sapp_icon_desc* icon_desc, int num_images) { + SOKOL_ASSERT((num_images > 0) && (num_images <= SAPP_MAX_ICONIMAGES)); + sapp_js_clear_favicon(); + // find the best matching image candidate for 16x16 pixels + int img_index = _sapp_image_bestmatch(icon_desc->images, num_images, 16, 16); + const sapp_image_desc* img_desc = &icon_desc->images[img_index]; + sapp_js_set_favicon(img_desc->width, img_desc->height, (const uint8_t*) img_desc->pixels.ptr); +} + +#if defined(SOKOL_WGPU) +_SOKOL_PRIVATE void _sapp_emsc_wgpu_surfaces_create(void); +_SOKOL_PRIVATE void _sapp_emsc_wgpu_surfaces_discard(void); +#endif + +_SOKOL_PRIVATE uint32_t _sapp_emsc_mouse_button_mods(uint16_t buttons) { + uint32_t m = 0; + if (0 != (buttons & (1<<0))) { m |= SAPP_MODIFIER_LMB; } + if (0 != (buttons & (1<<1))) { m |= SAPP_MODIFIER_RMB; } // not a bug + if (0 != (buttons & (1<<2))) { m |= SAPP_MODIFIER_MMB; } // not a bug + return m; +} + +_SOKOL_PRIVATE uint32_t _sapp_emsc_mouse_event_mods(const EmscriptenMouseEvent* ev) { + uint32_t m = 0; + if (ev->ctrlKey) { m |= SAPP_MODIFIER_CTRL; } + if (ev->shiftKey) { m |= SAPP_MODIFIER_SHIFT; } + if (ev->altKey) { m |= SAPP_MODIFIER_ALT; } + if (ev->metaKey) { m |= SAPP_MODIFIER_SUPER; } + m |= _sapp_emsc_mouse_button_mods(_sapp.emsc.mouse_buttons); + return m; +} + +_SOKOL_PRIVATE uint32_t _sapp_emsc_key_event_mods(const EmscriptenKeyboardEvent* ev) { + uint32_t m = 0; + if (ev->ctrlKey) { m |= SAPP_MODIFIER_CTRL; } + if (ev->shiftKey) { m |= SAPP_MODIFIER_SHIFT; } + if (ev->altKey) { m |= SAPP_MODIFIER_ALT; } + if (ev->metaKey) { m |= SAPP_MODIFIER_SUPER; } + m |= _sapp_emsc_mouse_button_mods(_sapp.emsc.mouse_buttons); + return m; +} + +_SOKOL_PRIVATE uint32_t _sapp_emsc_touch_event_mods(const EmscriptenTouchEvent* ev) { + uint32_t m = 0; + if (ev->ctrlKey) { m |= SAPP_MODIFIER_CTRL; } + if (ev->shiftKey) { m |= SAPP_MODIFIER_SHIFT; } + if (ev->altKey) { m |= SAPP_MODIFIER_ALT; } + if (ev->metaKey) { m |= SAPP_MODIFIER_SUPER; } + m |= _sapp_emsc_mouse_button_mods(_sapp.emsc.mouse_buttons); + return m; +} + +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_size_changed(int event_type, const EmscriptenUiEvent* ui_event, void* user_data) { + _SOKOL_UNUSED(event_type); + _SOKOL_UNUSED(user_data); + double w, h; + emscripten_get_element_css_size(_sapp.html5_canvas_selector, &w, &h); + /* The above method might report zero when toggling HTML5 fullscreen, + in that case use the window's inner width reported by the + emscripten event. This works ok when toggling *into* fullscreen + but doesn't properly restore the previous canvas size when switching + back from fullscreen. + + In general, due to the HTML5's fullscreen API's flaky nature it is + recommended to use 'soft fullscreen' (stretching the WebGL canvas + over the browser windows client rect) with a CSS definition like this: + + position: absolute; + top: 0px; + left: 0px; + margin: 0px; + border: 0; + width: 100%; + height: 100%; + overflow: hidden; + display: block; + */ + if (w < 1.0) { + w = ui_event->windowInnerWidth; + } + else { + _sapp.window_width = (int) w; + } + if (h < 1.0) { + h = ui_event->windowInnerHeight; + } + else { + _sapp.window_height = (int) h; + } + if (_sapp.desc.high_dpi) { + _sapp.dpi_scale = emscripten_get_device_pixel_ratio(); + } + _sapp.framebuffer_width = (int) (w * _sapp.dpi_scale); + _sapp.framebuffer_height = (int) (h * _sapp.dpi_scale); + SOKOL_ASSERT((_sapp.framebuffer_width > 0) && (_sapp.framebuffer_height > 0)); + emscripten_set_canvas_element_size(_sapp.html5_canvas_selector, _sapp.framebuffer_width, _sapp.framebuffer_height); + #if defined(SOKOL_WGPU) + /* on WebGPU: recreate size-dependent rendering surfaces */ + _sapp_emsc_wgpu_surfaces_discard(); + _sapp_emsc_wgpu_surfaces_create(); + #endif + if (_sapp_events_enabled()) { + _sapp_init_event(SAPP_EVENTTYPE_RESIZED); + _sapp_call_event(&_sapp.event); + } + return true; +} + +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_mouse_cb(int emsc_type, const EmscriptenMouseEvent* emsc_event, void* user_data) { + _SOKOL_UNUSED(user_data); + _sapp.emsc.mouse_buttons = emsc_event->buttons; + if (_sapp.mouse.locked) { + _sapp.mouse.dx = (float) emsc_event->movementX; + _sapp.mouse.dy = (float) emsc_event->movementY; + } + else { + float new_x = emsc_event->targetX * _sapp.dpi_scale; + float new_y = emsc_event->targetY * _sapp.dpi_scale; + if (_sapp.mouse.pos_valid) { + _sapp.mouse.dx = new_x - _sapp.mouse.x; + _sapp.mouse.dy = new_y - _sapp.mouse.y; + } + _sapp.mouse.x = new_x; + _sapp.mouse.y = new_y; + _sapp.mouse.pos_valid = true; + } + if (_sapp_events_enabled() && (emsc_event->button >= 0) && (emsc_event->button < SAPP_MAX_MOUSEBUTTONS)) { + sapp_event_type type; + bool is_button_event = false; + switch (emsc_type) { + case EMSCRIPTEN_EVENT_MOUSEDOWN: + type = SAPP_EVENTTYPE_MOUSE_DOWN; + is_button_event = true; + break; + case EMSCRIPTEN_EVENT_MOUSEUP: + type = SAPP_EVENTTYPE_MOUSE_UP; + is_button_event = true; + break; + case EMSCRIPTEN_EVENT_MOUSEMOVE: + type = SAPP_EVENTTYPE_MOUSE_MOVE; + break; + case EMSCRIPTEN_EVENT_MOUSEENTER: + type = SAPP_EVENTTYPE_MOUSE_ENTER; + break; + case EMSCRIPTEN_EVENT_MOUSELEAVE: + type = SAPP_EVENTTYPE_MOUSE_LEAVE; + break; + default: + type = SAPP_EVENTTYPE_INVALID; + break; + } + if (type != SAPP_EVENTTYPE_INVALID) { + _sapp_init_event(type); + _sapp.event.modifiers = _sapp_emsc_mouse_event_mods(emsc_event); + if (is_button_event) { + switch (emsc_event->button) { + case 0: _sapp.event.mouse_button = SAPP_MOUSEBUTTON_LEFT; break; + case 1: _sapp.event.mouse_button = SAPP_MOUSEBUTTON_MIDDLE; break; + case 2: _sapp.event.mouse_button = SAPP_MOUSEBUTTON_RIGHT; break; + default: _sapp.event.mouse_button = (sapp_mousebutton)emsc_event->button; break; + } + } + else { + _sapp.event.mouse_button = SAPP_MOUSEBUTTON_INVALID; + } + _sapp_call_event(&_sapp.event); + } + /* mouse lock can only be activated in mouse button events (not in move, enter or leave) */ + if (is_button_event) { + _sapp_emsc_update_mouse_lock_state(); + } + } + _sapp_emsc_update_keyboard_state(); + return true; +} + +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_wheel_cb(int emsc_type, const EmscriptenWheelEvent* emsc_event, void* user_data) { + _SOKOL_UNUSED(emsc_type); + _SOKOL_UNUSED(user_data); + _sapp.emsc.mouse_buttons = emsc_event->mouse.buttons; + if (_sapp_events_enabled()) { + _sapp_init_event(SAPP_EVENTTYPE_MOUSE_SCROLL); + _sapp.event.modifiers = _sapp_emsc_mouse_event_mods(&emsc_event->mouse); + /* see https://github.com/floooh/sokol/issues/339 */ + float scale; + switch (emsc_event->deltaMode) { + case DOM_DELTA_PIXEL: scale = -0.04f; break; + case DOM_DELTA_LINE: scale = -1.33f; break; + case DOM_DELTA_PAGE: scale = -10.0f; break; // FIXME: this is a guess + default: scale = -0.1f; break; // shouldn't happen + } + _sapp.event.scroll_x = scale * (float)emsc_event->deltaX; + _sapp.event.scroll_y = scale * (float)emsc_event->deltaY; + _sapp_call_event(&_sapp.event); + } + _sapp_emsc_update_keyboard_state(); + _sapp_emsc_update_mouse_lock_state(); + return true; +} + +static struct { + const char* str; + sapp_keycode code; +} _sapp_emsc_keymap[] = { + { "Backspace", SAPP_KEYCODE_BACKSPACE }, + { "Tab", SAPP_KEYCODE_TAB }, + { "Enter", SAPP_KEYCODE_ENTER }, + { "ShiftLeft", SAPP_KEYCODE_LEFT_SHIFT }, + { "ShiftRight", SAPP_KEYCODE_RIGHT_SHIFT }, + { "ControlLeft", SAPP_KEYCODE_LEFT_CONTROL }, + { "ControlRight", SAPP_KEYCODE_RIGHT_CONTROL }, + { "AltLeft", SAPP_KEYCODE_LEFT_ALT }, + { "AltRight", SAPP_KEYCODE_RIGHT_ALT }, + { "Pause", SAPP_KEYCODE_PAUSE }, + { "CapsLock", SAPP_KEYCODE_CAPS_LOCK }, + { "Escape", SAPP_KEYCODE_ESCAPE }, + { "Space", SAPP_KEYCODE_SPACE }, + { "PageUp", SAPP_KEYCODE_PAGE_UP }, + { "PageDown", SAPP_KEYCODE_PAGE_DOWN }, + { "End", SAPP_KEYCODE_END }, + { "Home", SAPP_KEYCODE_HOME }, + { "ArrowLeft", SAPP_KEYCODE_LEFT }, + { "ArrowUp", SAPP_KEYCODE_UP }, + { "ArrowRight", SAPP_KEYCODE_RIGHT }, + { "ArrowDown", SAPP_KEYCODE_DOWN }, + { "PrintScreen", SAPP_KEYCODE_PRINT_SCREEN }, + { "Insert", SAPP_KEYCODE_INSERT }, + { "Delete", SAPP_KEYCODE_DELETE }, + { "Digit0", SAPP_KEYCODE_0 }, + { "Digit1", SAPP_KEYCODE_1 }, + { "Digit2", SAPP_KEYCODE_2 }, + { "Digit3", SAPP_KEYCODE_3 }, + { "Digit4", SAPP_KEYCODE_4 }, + { "Digit5", SAPP_KEYCODE_5 }, + { "Digit6", SAPP_KEYCODE_6 }, + { "Digit7", SAPP_KEYCODE_7 }, + { "Digit8", SAPP_KEYCODE_8 }, + { "Digit9", SAPP_KEYCODE_9 }, + { "KeyA", SAPP_KEYCODE_A }, + { "KeyB", SAPP_KEYCODE_B }, + { "KeyC", SAPP_KEYCODE_C }, + { "KeyD", SAPP_KEYCODE_D }, + { "KeyE", SAPP_KEYCODE_E }, + { "KeyF", SAPP_KEYCODE_F }, + { "KeyG", SAPP_KEYCODE_G }, + { "KeyH", SAPP_KEYCODE_H }, + { "KeyI", SAPP_KEYCODE_I }, + { "KeyJ", SAPP_KEYCODE_J }, + { "KeyK", SAPP_KEYCODE_K }, + { "KeyL", SAPP_KEYCODE_L }, + { "KeyM", SAPP_KEYCODE_M }, + { "KeyN", SAPP_KEYCODE_N }, + { "KeyO", SAPP_KEYCODE_O }, + { "KeyP", SAPP_KEYCODE_P }, + { "KeyQ", SAPP_KEYCODE_Q }, + { "KeyR", SAPP_KEYCODE_R }, + { "KeyS", SAPP_KEYCODE_S }, + { "KeyT", SAPP_KEYCODE_T }, + { "KeyU", SAPP_KEYCODE_U }, + { "KeyV", SAPP_KEYCODE_V }, + { "KeyW", SAPP_KEYCODE_W }, + { "KeyX", SAPP_KEYCODE_X }, + { "KeyY", SAPP_KEYCODE_Y }, + { "KeyZ", SAPP_KEYCODE_Z }, + { "MetaLeft", SAPP_KEYCODE_LEFT_SUPER }, + { "MetaRight", SAPP_KEYCODE_RIGHT_SUPER }, + { "Numpad0", SAPP_KEYCODE_KP_0 }, + { "Numpad1", SAPP_KEYCODE_KP_1 }, + { "Numpad2", SAPP_KEYCODE_KP_2 }, + { "Numpad3", SAPP_KEYCODE_KP_3 }, + { "Numpad4", SAPP_KEYCODE_KP_4 }, + { "Numpad5", SAPP_KEYCODE_KP_5 }, + { "Numpad6", SAPP_KEYCODE_KP_6 }, + { "Numpad7", SAPP_KEYCODE_KP_7 }, + { "Numpad8", SAPP_KEYCODE_KP_8 }, + { "Numpad9", SAPP_KEYCODE_KP_9 }, + { "NumpadMultiply", SAPP_KEYCODE_KP_MULTIPLY }, + { "NumpadAdd", SAPP_KEYCODE_KP_ADD }, + { "NumpadSubtract", SAPP_KEYCODE_KP_SUBTRACT }, + { "NumpadDecimal", SAPP_KEYCODE_KP_DECIMAL }, + { "NumpadDivide", SAPP_KEYCODE_KP_DIVIDE }, + { "F1", SAPP_KEYCODE_F1 }, + { "F2", SAPP_KEYCODE_F2 }, + { "F3", SAPP_KEYCODE_F3 }, + { "F4", SAPP_KEYCODE_F4 }, + { "F5", SAPP_KEYCODE_F5 }, + { "F6", SAPP_KEYCODE_F6 }, + { "F7", SAPP_KEYCODE_F7 }, + { "F8", SAPP_KEYCODE_F8 }, + { "F9", SAPP_KEYCODE_F9 }, + { "F10", SAPP_KEYCODE_F10 }, + { "F11", SAPP_KEYCODE_F11 }, + { "F12", SAPP_KEYCODE_F12 }, + { "NumLock", SAPP_KEYCODE_NUM_LOCK }, + { "ScrollLock", SAPP_KEYCODE_SCROLL_LOCK }, + { "Semicolon", SAPP_KEYCODE_SEMICOLON }, + { "Equal", SAPP_KEYCODE_EQUAL }, + { "Comma", SAPP_KEYCODE_COMMA }, + { "Minus", SAPP_KEYCODE_MINUS }, + { "Period", SAPP_KEYCODE_PERIOD }, + { "Slash", SAPP_KEYCODE_SLASH }, + { "Backquote", SAPP_KEYCODE_GRAVE_ACCENT }, + { "BracketLeft", SAPP_KEYCODE_LEFT_BRACKET }, + { "Backslash", SAPP_KEYCODE_BACKSLASH }, + { "BracketRight", SAPP_KEYCODE_RIGHT_BRACKET }, + { "Quote", SAPP_KEYCODE_GRAVE_ACCENT }, // FIXME: ??? + { 0, SAPP_KEYCODE_INVALID }, +}; + +_SOKOL_PRIVATE sapp_keycode _sapp_emsc_translate_key(const char* str) { + int i = 0; + const char* keystr; + while (( keystr = _sapp_emsc_keymap[i].str )) { + if (0 == strcmp(str, keystr)) { + return _sapp_emsc_keymap[i].code; + } + i += 1; + } + return SAPP_KEYCODE_INVALID; +} + +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_key_cb(int emsc_type, const EmscriptenKeyboardEvent* emsc_event, void* user_data) { + _SOKOL_UNUSED(user_data); + bool retval = true; + if (_sapp_events_enabled()) { + sapp_event_type type; + switch (emsc_type) { + case EMSCRIPTEN_EVENT_KEYDOWN: + type = SAPP_EVENTTYPE_KEY_DOWN; + break; + case EMSCRIPTEN_EVENT_KEYUP: + type = SAPP_EVENTTYPE_KEY_UP; + break; + case EMSCRIPTEN_EVENT_KEYPRESS: + type = SAPP_EVENTTYPE_CHAR; + break; + default: + type = SAPP_EVENTTYPE_INVALID; + break; + } + if (type != SAPP_EVENTTYPE_INVALID) { + bool send_keyup_followup = false; + _sapp_init_event(type); + _sapp.event.key_repeat = emsc_event->repeat; + _sapp.event.modifiers = _sapp_emsc_key_event_mods(emsc_event); + if (type == SAPP_EVENTTYPE_CHAR) { + _sapp.event.char_code = emsc_event->charCode; + /* workaround to make Cmd+V work on Safari */ + if ((emsc_event->metaKey) && (emsc_event->charCode == 118)) { + retval = false; + } + } + else { + _sapp.event.key_code = _sapp_emsc_translate_key(emsc_event->code); + /* Special hack for macOS: if the Super key is pressed, macOS doesn't + send keyUp events. As a workaround, to prevent keys from + "sticking", we'll send a keyup event following a keydown + when the SUPER key is pressed + */ + if ((type == SAPP_EVENTTYPE_KEY_DOWN) && + (_sapp.event.key_code != SAPP_KEYCODE_LEFT_SUPER) && + (_sapp.event.key_code != SAPP_KEYCODE_RIGHT_SUPER) && + (_sapp.event.modifiers & SAPP_MODIFIER_SUPER)) + { + send_keyup_followup = true; + } + /* only forward a certain key ranges to the browser */ + switch (_sapp.event.key_code) { + case SAPP_KEYCODE_WORLD_1: + case SAPP_KEYCODE_WORLD_2: + case SAPP_KEYCODE_ESCAPE: + case SAPP_KEYCODE_ENTER: + case SAPP_KEYCODE_TAB: + case SAPP_KEYCODE_BACKSPACE: + case SAPP_KEYCODE_INSERT: + case SAPP_KEYCODE_DELETE: + case SAPP_KEYCODE_RIGHT: + case SAPP_KEYCODE_LEFT: + case SAPP_KEYCODE_DOWN: + case SAPP_KEYCODE_UP: + case SAPP_KEYCODE_PAGE_UP: + case SAPP_KEYCODE_PAGE_DOWN: + case SAPP_KEYCODE_HOME: + case SAPP_KEYCODE_END: + case SAPP_KEYCODE_CAPS_LOCK: + case SAPP_KEYCODE_SCROLL_LOCK: + case SAPP_KEYCODE_NUM_LOCK: + case SAPP_KEYCODE_PRINT_SCREEN: + case SAPP_KEYCODE_PAUSE: + case SAPP_KEYCODE_F1: + case SAPP_KEYCODE_F2: + case SAPP_KEYCODE_F3: + case SAPP_KEYCODE_F4: + case SAPP_KEYCODE_F5: + case SAPP_KEYCODE_F6: + case SAPP_KEYCODE_F7: + case SAPP_KEYCODE_F8: + case SAPP_KEYCODE_F9: + case SAPP_KEYCODE_F10: + case SAPP_KEYCODE_F11: + case SAPP_KEYCODE_F12: + case SAPP_KEYCODE_F13: + case SAPP_KEYCODE_F14: + case SAPP_KEYCODE_F15: + case SAPP_KEYCODE_F16: + case SAPP_KEYCODE_F17: + case SAPP_KEYCODE_F18: + case SAPP_KEYCODE_F19: + case SAPP_KEYCODE_F20: + case SAPP_KEYCODE_F21: + case SAPP_KEYCODE_F22: + case SAPP_KEYCODE_F23: + case SAPP_KEYCODE_F24: + case SAPP_KEYCODE_F25: + case SAPP_KEYCODE_LEFT_SHIFT: + case SAPP_KEYCODE_LEFT_CONTROL: + case SAPP_KEYCODE_LEFT_ALT: + case SAPP_KEYCODE_LEFT_SUPER: + case SAPP_KEYCODE_RIGHT_SHIFT: + case SAPP_KEYCODE_RIGHT_CONTROL: + case SAPP_KEYCODE_RIGHT_ALT: + case SAPP_KEYCODE_RIGHT_SUPER: + case SAPP_KEYCODE_MENU: + /* consume the event */ + break; + default: + /* forward key to browser */ + retval = false; + break; + } + } + if (_sapp_call_event(&_sapp.event)) { + /* consume event via sapp_consume_event() */ + retval = true; + } + if (send_keyup_followup) { + _sapp.event.type = SAPP_EVENTTYPE_KEY_UP; + if (_sapp_call_event(&_sapp.event)) { + retval = true; + } + } + } + } + _sapp_emsc_update_keyboard_state(); + _sapp_emsc_update_mouse_lock_state(); + return retval; +} + +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_touch_cb(int emsc_type, const EmscriptenTouchEvent* emsc_event, void* user_data) { + _SOKOL_UNUSED(user_data); + bool retval = true; + if (_sapp_events_enabled()) { + sapp_event_type type; + switch (emsc_type) { + case EMSCRIPTEN_EVENT_TOUCHSTART: + type = SAPP_EVENTTYPE_TOUCHES_BEGAN; + break; + case EMSCRIPTEN_EVENT_TOUCHMOVE: + type = SAPP_EVENTTYPE_TOUCHES_MOVED; + break; + case EMSCRIPTEN_EVENT_TOUCHEND: + type = SAPP_EVENTTYPE_TOUCHES_ENDED; + break; + case EMSCRIPTEN_EVENT_TOUCHCANCEL: + type = SAPP_EVENTTYPE_TOUCHES_CANCELLED; + break; + default: + type = SAPP_EVENTTYPE_INVALID; + retval = false; + break; + } + if (type != SAPP_EVENTTYPE_INVALID) { + _sapp_init_event(type); + _sapp.event.modifiers = _sapp_emsc_touch_event_mods(emsc_event); + _sapp.event.num_touches = emsc_event->numTouches; + if (_sapp.event.num_touches > SAPP_MAX_TOUCHPOINTS) { + _sapp.event.num_touches = SAPP_MAX_TOUCHPOINTS; + } + for (int i = 0; i < _sapp.event.num_touches; i++) { + const EmscriptenTouchPoint* src = &emsc_event->touches[i]; + sapp_touchpoint* dst = &_sapp.event.touches[i]; + dst->identifier = (uintptr_t)src->identifier; + dst->pos_x = src->targetX * _sapp.dpi_scale; + dst->pos_y = src->targetY * _sapp.dpi_scale; + dst->changed = src->isChanged; + } + _sapp_call_event(&_sapp.event); + } + } + _sapp_emsc_update_keyboard_state(); + return retval; +} + +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_focus_cb(int emsc_type, const EmscriptenFocusEvent* emsc_event, void* user_data) { + _SOKOL_UNUSED(emsc_type); + _SOKOL_UNUSED(emsc_event); + _SOKOL_UNUSED(user_data); + if (_sapp_events_enabled()) { + _sapp_init_event(SAPP_EVENTTYPE_FOCUSED); + _sapp_call_event(&_sapp.event); + } + return true; +} + +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_blur_cb(int emsc_type, const EmscriptenFocusEvent* emsc_event, void* user_data) { + _SOKOL_UNUSED(emsc_type); + _SOKOL_UNUSED(emsc_event); + _SOKOL_UNUSED(user_data); + if (_sapp_events_enabled()) { + _sapp_init_event(SAPP_EVENTTYPE_UNFOCUSED); + _sapp_call_event(&_sapp.event); + } + return true; +} + +#if defined(SOKOL_GLES2) || defined(SOKOL_GLES3) +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_webgl_context_cb(int emsc_type, const void* reserved, void* user_data) { + _SOKOL_UNUSED(reserved); + _SOKOL_UNUSED(user_data); + sapp_event_type type; + switch (emsc_type) { + case EMSCRIPTEN_EVENT_WEBGLCONTEXTLOST: type = SAPP_EVENTTYPE_SUSPENDED; break; + case EMSCRIPTEN_EVENT_WEBGLCONTEXTRESTORED: type = SAPP_EVENTTYPE_RESUMED; break; + default: type = SAPP_EVENTTYPE_INVALID; break; + } + if (_sapp_events_enabled() && (SAPP_EVENTTYPE_INVALID != type)) { + _sapp_init_event(type); + _sapp_call_event(&_sapp.event); + } + return true; +} + +_SOKOL_PRIVATE void _sapp_emsc_webgl_init(void) { + EmscriptenWebGLContextAttributes attrs; + emscripten_webgl_init_context_attributes(&attrs); + attrs.alpha = _sapp.desc.alpha; + attrs.depth = true; + attrs.stencil = true; + attrs.antialias = _sapp.sample_count > 1; + attrs.premultipliedAlpha = _sapp.desc.html5_premultiplied_alpha; + attrs.preserveDrawingBuffer = _sapp.desc.html5_preserve_drawing_buffer; + attrs.enableExtensionsByDefault = true; + #if defined(SOKOL_GLES3) + if (_sapp.desc.gl_force_gles2) { + attrs.majorVersion = 1; + _sapp.gles2_fallback = true; + } + else { + attrs.majorVersion = 2; + } + #endif + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_create_context(_sapp.html5_canvas_selector, &attrs); + if (!ctx) { + attrs.majorVersion = 1; + ctx = emscripten_webgl_create_context(_sapp.html5_canvas_selector, &attrs); + _sapp.gles2_fallback = true; + } + emscripten_webgl_make_context_current(ctx); + + /* some WebGL extension are not enabled automatically by emscripten */ + emscripten_webgl_enable_extension(ctx, "WEBKIT_WEBGL_compressed_texture_pvrtc"); +} +#endif + +#if defined(SOKOL_WGPU) +#define _SAPP_EMSC_WGPU_STATE_INITIAL (0) +#define _SAPP_EMSC_WGPU_STATE_READY (1) +#define _SAPP_EMSC_WGPU_STATE_RUNNING (2) + +#if defined(__cplusplus) +extern "C" { +#endif +/* called when the asynchronous WebGPU device + swapchain init code in JS has finished */ +EMSCRIPTEN_KEEPALIVE void _sapp_emsc_wgpu_ready(int device_id, int swapchain_id, int swapchain_fmt) { + SOKOL_ASSERT(0 == _sapp.emsc.wgpu.device); + _sapp.emsc.wgpu.device = (WGPUDevice) device_id; + _sapp.emsc.wgpu.swapchain = (WGPUSwapChain) swapchain_id; + _sapp.emsc.wgpu.render_format = (WGPUTextureFormat) swapchain_fmt; + _sapp.emsc.wgpu.state = _SAPP_EMSC_WGPU_STATE_READY; +} +#if defined(__cplusplus) +} // extern "C" +#endif + +/* embedded JS function to handle all the asynchronous WebGPU setup */ +EM_JS(void, sapp_js_wgpu_init, (), { + WebGPU.initManagers(); + // FIXME: the extension activation must be more clever here + navigator.gpu.requestAdapter().then(function(adapter) { + console.log("wgpu adapter extensions: " + adapter.extensions); + adapter.requestDevice({ extensions: ["textureCompressionBC"]}).then(function(device) { + var gpuContext = document.getElementById("canvas").getContext("gpupresent"); + console.log("wgpu device extensions: " + adapter.extensions); + gpuContext.getSwapChainPreferredFormat(device).then(function(fmt) { + var swapChainDescriptor = { device: device, format: fmt }; + var swapChain = gpuContext.configureSwapChain(swapChainDescriptor); + var deviceId = WebGPU.mgrDevice.create(device); + var swapChainId = WebGPU.mgrSwapChain.create(swapChain); + var fmtId = WebGPU.TextureFormat.findIndex(function(elm) { return elm==fmt; }); + console.log("wgpu device: " + device); + console.log("wgpu swap chain: " + swapChain); + console.log("wgpu preferred format: " + fmt + " (" + fmtId + ")"); + __sapp_emsc_wgpu_ready(deviceId, swapChainId, fmtId); + }); + }); + }); +}); + +_SOKOL_PRIVATE void _sapp_emsc_wgpu_surfaces_create(void) { + SOKOL_ASSERT(_sapp.emsc.wgpu.device); + SOKOL_ASSERT(_sapp.emsc.wgpu.swapchain); + SOKOL_ASSERT(0 == _sapp.emsc.wgpu.depth_stencil_tex); + SOKOL_ASSERT(0 == _sapp.emsc.wgpu.depth_stencil_view); + SOKOL_ASSERT(0 == _sapp.emsc.wgpu.msaa_tex); + SOKOL_ASSERT(0 == _sapp.emsc.wgpu.msaa_view); + + WGPUTextureDescriptor ds_desc; + memset(&ds_desc, 0, sizeof(ds_desc)); + ds_desc.usage = WGPUTextureUsage_OutputAttachment; + ds_desc.dimension = WGPUTextureDimension_2D; + ds_desc.size.width = (uint32_t) _sapp.framebuffer_width; + ds_desc.size.height = (uint32_t) _sapp.framebuffer_height; + ds_desc.size.depth = 1; + ds_desc.arrayLayerCount = 1; + ds_desc.format = WGPUTextureFormat_Depth24PlusStencil8; + ds_desc.mipLevelCount = 1; + ds_desc.sampleCount = _sapp.sample_count; + _sapp.emsc.wgpu.depth_stencil_tex = wgpuDeviceCreateTexture(_sapp.emsc.wgpu.device, &ds_desc); + _sapp.emsc.wgpu.depth_stencil_view = wgpuTextureCreateView(_sapp.emsc.wgpu.depth_stencil_tex, 0); + + if (_sapp.sample_count > 1) { + WGPUTextureDescriptor msaa_desc; + memset(&msaa_desc, 0, sizeof(msaa_desc)); + msaa_desc.usage = WGPUTextureUsage_OutputAttachment; + msaa_desc.dimension = WGPUTextureDimension_2D; + msaa_desc.size.width = (uint32_t) _sapp.framebuffer_width; + msaa_desc.size.height = (uint32_t) _sapp.framebuffer_height; + msaa_desc.size.depth = 1; + msaa_desc.arrayLayerCount = 1; + msaa_desc.format = _sapp.emsc.wgpu.render_format; + msaa_desc.mipLevelCount = 1; + msaa_desc.sampleCount = _sapp.sample_count; + _sapp.emsc.wgpu.msaa_tex = wgpuDeviceCreateTexture(_sapp.emsc.wgpu.device, &msaa_desc); + _sapp.emsc.wgpu.msaa_view = wgpuTextureCreateView(_sapp.emsc.wgpu.msaa_tex, 0); + } +} + +_SOKOL_PRIVATE void _sapp_emsc_wgpu_surfaces_discard(void) { + if (_sapp.emsc.wgpu.msaa_tex) { + wgpuTextureRelease(_sapp.emsc.wgpu.msaa_tex); + _sapp.emsc.wgpu.msaa_tex = 0; + } + if (_sapp.emsc.wgpu.msaa_view) { + wgpuTextureViewRelease(_sapp.emsc.wgpu.msaa_view); + _sapp.emsc.wgpu.msaa_view = 0; + } + if (_sapp.emsc.wgpu.depth_stencil_tex) { + wgpuTextureRelease(_sapp.emsc.wgpu.depth_stencil_tex); + _sapp.emsc.wgpu.depth_stencil_tex = 0; + } + if (_sapp.emsc.wgpu.depth_stencil_view) { + wgpuTextureViewRelease(_sapp.emsc.wgpu.depth_stencil_view); + _sapp.emsc.wgpu.depth_stencil_view = 0; + } +} + +_SOKOL_PRIVATE void _sapp_emsc_wgpu_next_frame(void) { + if (_sapp.emsc.wgpu.swapchain_view) { + wgpuTextureViewRelease(_sapp.emsc.wgpu.swapchain_view); + } + _sapp.emsc.wgpu.swapchain_view = wgpuSwapChainGetCurrentTextureView(_sapp.emsc.wgpu.swapchain); +} +#endif + +_SOKOL_PRIVATE void _sapp_emsc_register_eventhandlers(void) { + emscripten_set_mousedown_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_mouse_cb); + emscripten_set_mouseup_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_mouse_cb); + emscripten_set_mousemove_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_mouse_cb); + emscripten_set_mouseenter_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_mouse_cb); + emscripten_set_mouseleave_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_mouse_cb); + emscripten_set_wheel_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_wheel_cb); + emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, _sapp_emsc_key_cb); + emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, _sapp_emsc_key_cb); + emscripten_set_keypress_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, _sapp_emsc_key_cb); + emscripten_set_touchstart_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_touch_cb); + emscripten_set_touchmove_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_touch_cb); + emscripten_set_touchend_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_touch_cb); + emscripten_set_touchcancel_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_touch_cb); + emscripten_set_pointerlockchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, 0, true, _sapp_emsc_pointerlockchange_cb); + emscripten_set_pointerlockerror_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, 0, true, _sapp_emsc_pointerlockerror_cb); + emscripten_set_focus_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, _sapp_emsc_focus_cb); + emscripten_set_blur_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, _sapp_emsc_blur_cb); + sapp_js_add_beforeunload_listener(); + if (_sapp.clipboard.enabled) { + sapp_js_add_clipboard_listener(); + } + if (_sapp.drop.enabled) { + sapp_js_add_dragndrop_listeners(&_sapp.html5_canvas_selector[1]); + } + #if defined(SOKOL_GLES2) || defined(SOKOL_GLES3) + emscripten_set_webglcontextlost_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_webgl_context_cb); + emscripten_set_webglcontextrestored_callback(_sapp.html5_canvas_selector, 0, true, _sapp_emsc_webgl_context_cb); + #endif +} + +_SOKOL_PRIVATE void _sapp_emsc_unregister_eventhandlers() { + emscripten_set_mousedown_callback(_sapp.html5_canvas_selector, 0, true, 0); + emscripten_set_mouseup_callback(_sapp.html5_canvas_selector, 0, true, 0); + emscripten_set_mousemove_callback(_sapp.html5_canvas_selector, 0, true, 0); + emscripten_set_mouseenter_callback(_sapp.html5_canvas_selector, 0, true, 0); + emscripten_set_mouseleave_callback(_sapp.html5_canvas_selector, 0, true, 0); + emscripten_set_wheel_callback(_sapp.html5_canvas_selector, 0, true, 0); + emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, 0); + emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, 0); + emscripten_set_keypress_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, 0); + emscripten_set_touchstart_callback(_sapp.html5_canvas_selector, 0, true, 0); + emscripten_set_touchmove_callback(_sapp.html5_canvas_selector, 0, true, 0); + emscripten_set_touchend_callback(_sapp.html5_canvas_selector, 0, true, 0); + emscripten_set_touchcancel_callback(_sapp.html5_canvas_selector, 0, true, 0); + emscripten_set_pointerlockchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, 0, true, 0); + emscripten_set_pointerlockerror_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, 0, true, 0); + emscripten_set_focus_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, 0); + emscripten_set_blur_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, 0); + sapp_js_remove_beforeunload_listener(); + if (_sapp.clipboard.enabled) { + sapp_js_remove_clipboard_listener(); + } + if (_sapp.drop.enabled) { + sapp_js_remove_dragndrop_listeners(&_sapp.html5_canvas_selector[1]); + } + #if defined(SOKOL_GLES2) || defined(SOKOL_GLES3) + emscripten_set_webglcontextlost_callback(_sapp.html5_canvas_selector, 0, true, 0); + emscripten_set_webglcontextrestored_callback(_sapp.html5_canvas_selector, 0, true, 0); + #endif +} + +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_frame(double time, void* userData) { + _SOKOL_UNUSED(time); + _SOKOL_UNUSED(userData); + + #if defined(SOKOL_WGPU) + /* + on WebGPU, the emscripten frame callback will already be called while + the asynchronous WebGPU device and swapchain initialization is still + in progress + */ + switch (_sapp.emsc.wgpu.state) { + case _SAPP_EMSC_WGPU_STATE_INITIAL: + /* async JS init hasn't finished yet */ + break; + case _SAPP_EMSC_WGPU_STATE_READY: + /* perform post-async init stuff */ + _sapp_emsc_wgpu_surfaces_create(); + _sapp.emsc.wgpu.state = _SAPP_EMSC_WGPU_STATE_RUNNING; + break; + case _SAPP_EMSC_WGPU_STATE_RUNNING: + /* a regular frame */ + _sapp_emsc_wgpu_next_frame(); + _sapp_frame(); + break; + } + #else + /* WebGL code path */ + _sapp_frame(); + #endif + + /* quit-handling */ + if (_sapp.quit_requested) { + _sapp_init_event(SAPP_EVENTTYPE_QUIT_REQUESTED); + _sapp_call_event(&_sapp.event); + if (_sapp.quit_requested) { + _sapp.quit_ordered = true; + } + } + if (_sapp.quit_ordered) { + _sapp_emsc_unregister_eventhandlers(); + _sapp_call_cleanup(); + _sapp_discard_state(); + return EM_FALSE; + } + return EM_TRUE; +} + +_SOKOL_PRIVATE void _sapp_emsc_run(const sapp_desc* desc) { + _sapp_init_state(desc); + sapp_js_pointer_init(&_sapp.html5_canvas_selector[1]); + double w, h; + if (_sapp.desc.html5_canvas_resize) { + w = (double) _sapp.desc.width; + h = (double) _sapp.desc.height; + } + else { + emscripten_get_element_css_size(_sapp.html5_canvas_selector, &w, &h); + emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, false, _sapp_emsc_size_changed); + } + if (_sapp.desc.high_dpi) { + _sapp.dpi_scale = emscripten_get_device_pixel_ratio(); + } + _sapp.window_width = (int) w; + _sapp.window_height = (int) h; + _sapp.framebuffer_width = (int) (w * _sapp.dpi_scale); + _sapp.framebuffer_height = (int) (h * _sapp.dpi_scale); + emscripten_set_canvas_element_size(_sapp.html5_canvas_selector, _sapp.framebuffer_width, _sapp.framebuffer_height); + #if defined(SOKOL_GLES2) || defined(SOKOL_GLES3) + _sapp_emsc_webgl_init(); + #elif defined(SOKOL_WGPU) + sapp_js_wgpu_init(); + #endif + _sapp.valid = true; + _sapp_emsc_register_eventhandlers(); + sapp_set_icon(&desc->icon); + + /* start the frame loop */ + emscripten_request_animation_frame_loop(_sapp_emsc_frame, 0); + + /* NOT A BUG: do not call _sapp_discard_state() here, instead this is + called in _sapp_emsc_frame() when the application is ordered to quit + */ +} + +#if !defined(SOKOL_NO_ENTRY) +int main(int argc, char* argv[]) { + sapp_desc desc = sokol_main(argc, argv); + _sapp_emsc_run(&desc); + return 0; +} +#endif /* SOKOL_NO_ENTRY */ +#endif /* _SAPP_EMSCRIPTEN */ + +/*== MISC GL SUPPORT FUNCTIONS ================================================*/ +#if defined(SOKOL_GLCORE33) +typedef struct { + int red_bits; + int green_bits; + int blue_bits; + int alpha_bits; + int depth_bits; + int stencil_bits; + int samples; + bool doublebuffer; + uintptr_t handle; +} _sapp_gl_fbconfig; + +_SOKOL_PRIVATE void _sapp_gl_init_fbconfig(_sapp_gl_fbconfig* fbconfig) { + memset(fbconfig, 0, sizeof(_sapp_gl_fbconfig)); + /* -1 means "don't care" */ + fbconfig->red_bits = -1; + fbconfig->green_bits = -1; + fbconfig->blue_bits = -1; + fbconfig->alpha_bits = -1; + fbconfig->depth_bits = -1; + fbconfig->stencil_bits = -1; + fbconfig->samples = -1; +} + +_SOKOL_PRIVATE const _sapp_gl_fbconfig* _sapp_gl_choose_fbconfig(const _sapp_gl_fbconfig* desired, const _sapp_gl_fbconfig* alternatives, int count) { + int missing, least_missing = 1000000; + int color_diff, least_color_diff = 10000000; + int extra_diff, least_extra_diff = 10000000; + const _sapp_gl_fbconfig* current; + const _sapp_gl_fbconfig* closest = 0; + for (int i = 0; i < count; i++) { + current = alternatives + i; + if (desired->doublebuffer != current->doublebuffer) { + continue; + } + missing = 0; + if (desired->alpha_bits > 0 && current->alpha_bits == 0) { + missing++; + } + if (desired->depth_bits > 0 && current->depth_bits == 0) { + missing++; + } + if (desired->stencil_bits > 0 && current->stencil_bits == 0) { + missing++; + } + if (desired->samples > 0 && current->samples == 0) { + /* Technically, several multisampling buffers could be + involved, but that's a lower level implementation detail and + not important to us here, so we count them as one + */ + missing++; + } + + /* These polynomials make many small channel size differences matter + less than one large channel size difference + Calculate color channel size difference value + */ + color_diff = 0; + if (desired->red_bits != -1) { + color_diff += (desired->red_bits - current->red_bits) * (desired->red_bits - current->red_bits); + } + if (desired->green_bits != -1) { + color_diff += (desired->green_bits - current->green_bits) * (desired->green_bits - current->green_bits); + } + if (desired->blue_bits != -1) { + color_diff += (desired->blue_bits - current->blue_bits) * (desired->blue_bits - current->blue_bits); + } + + /* Calculate non-color channel size difference value */ + extra_diff = 0; + if (desired->alpha_bits != -1) { + extra_diff += (desired->alpha_bits - current->alpha_bits) * (desired->alpha_bits - current->alpha_bits); + } + if (desired->depth_bits != -1) { + extra_diff += (desired->depth_bits - current->depth_bits) * (desired->depth_bits - current->depth_bits); + } + if (desired->stencil_bits != -1) { + extra_diff += (desired->stencil_bits - current->stencil_bits) * (desired->stencil_bits - current->stencil_bits); + } + if (desired->samples != -1) { + extra_diff += (desired->samples - current->samples) * (desired->samples - current->samples); + } + + /* Figure out if the current one is better than the best one found so far + Least number of missing buffers is the most important heuristic, + then color buffer size match and lastly size match for other buffers + */ + if (missing < least_missing) { + closest = current; + } + else if (missing == least_missing) { + if ((color_diff < least_color_diff) || + (color_diff == least_color_diff && extra_diff < least_extra_diff)) + { + closest = current; + } + } + if (current == closest) { + least_missing = missing; + least_color_diff = color_diff; + least_extra_diff = extra_diff; + } + } + return closest; +} +#endif + +/*== WINDOWS DESKTOP and UWP====================================================*/ +#if defined(_SAPP_WIN32) || defined(_SAPP_UWP) +_SOKOL_PRIVATE bool _sapp_win32_uwp_utf8_to_wide(const char* src, wchar_t* dst, int dst_num_bytes) { + SOKOL_ASSERT(src && dst && (dst_num_bytes > 1)); + memset(dst, 0, (size_t)dst_num_bytes); + const int dst_chars = dst_num_bytes / (int)sizeof(wchar_t); + const int dst_needed = MultiByteToWideChar(CP_UTF8, 0, src, -1, 0, 0); + if ((dst_needed > 0) && (dst_needed < dst_chars)) { + MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, dst_chars); + return true; + } + else { + /* input string doesn't fit into destination buffer */ + return false; + } +} + +_SOKOL_PRIVATE void _sapp_win32_uwp_app_event(sapp_event_type type) { + if (_sapp_events_enabled()) { + _sapp_init_event(type); + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE void _sapp_win32_uwp_init_keytable(void) { + /* same as GLFW */ + _sapp.keycodes[0x00B] = SAPP_KEYCODE_0; + _sapp.keycodes[0x002] = SAPP_KEYCODE_1; + _sapp.keycodes[0x003] = SAPP_KEYCODE_2; + _sapp.keycodes[0x004] = SAPP_KEYCODE_3; + _sapp.keycodes[0x005] = SAPP_KEYCODE_4; + _sapp.keycodes[0x006] = SAPP_KEYCODE_5; + _sapp.keycodes[0x007] = SAPP_KEYCODE_6; + _sapp.keycodes[0x008] = SAPP_KEYCODE_7; + _sapp.keycodes[0x009] = SAPP_KEYCODE_8; + _sapp.keycodes[0x00A] = SAPP_KEYCODE_9; + _sapp.keycodes[0x01E] = SAPP_KEYCODE_A; + _sapp.keycodes[0x030] = SAPP_KEYCODE_B; + _sapp.keycodes[0x02E] = SAPP_KEYCODE_C; + _sapp.keycodes[0x020] = SAPP_KEYCODE_D; + _sapp.keycodes[0x012] = SAPP_KEYCODE_E; + _sapp.keycodes[0x021] = SAPP_KEYCODE_F; + _sapp.keycodes[0x022] = SAPP_KEYCODE_G; + _sapp.keycodes[0x023] = SAPP_KEYCODE_H; + _sapp.keycodes[0x017] = SAPP_KEYCODE_I; + _sapp.keycodes[0x024] = SAPP_KEYCODE_J; + _sapp.keycodes[0x025] = SAPP_KEYCODE_K; + _sapp.keycodes[0x026] = SAPP_KEYCODE_L; + _sapp.keycodes[0x032] = SAPP_KEYCODE_M; + _sapp.keycodes[0x031] = SAPP_KEYCODE_N; + _sapp.keycodes[0x018] = SAPP_KEYCODE_O; + _sapp.keycodes[0x019] = SAPP_KEYCODE_P; + _sapp.keycodes[0x010] = SAPP_KEYCODE_Q; + _sapp.keycodes[0x013] = SAPP_KEYCODE_R; + _sapp.keycodes[0x01F] = SAPP_KEYCODE_S; + _sapp.keycodes[0x014] = SAPP_KEYCODE_T; + _sapp.keycodes[0x016] = SAPP_KEYCODE_U; + _sapp.keycodes[0x02F] = SAPP_KEYCODE_V; + _sapp.keycodes[0x011] = SAPP_KEYCODE_W; + _sapp.keycodes[0x02D] = SAPP_KEYCODE_X; + _sapp.keycodes[0x015] = SAPP_KEYCODE_Y; + _sapp.keycodes[0x02C] = SAPP_KEYCODE_Z; + _sapp.keycodes[0x028] = SAPP_KEYCODE_APOSTROPHE; + _sapp.keycodes[0x02B] = SAPP_KEYCODE_BACKSLASH; + _sapp.keycodes[0x033] = SAPP_KEYCODE_COMMA; + _sapp.keycodes[0x00D] = SAPP_KEYCODE_EQUAL; + _sapp.keycodes[0x029] = SAPP_KEYCODE_GRAVE_ACCENT; + _sapp.keycodes[0x01A] = SAPP_KEYCODE_LEFT_BRACKET; + _sapp.keycodes[0x00C] = SAPP_KEYCODE_MINUS; + _sapp.keycodes[0x034] = SAPP_KEYCODE_PERIOD; + _sapp.keycodes[0x01B] = SAPP_KEYCODE_RIGHT_BRACKET; + _sapp.keycodes[0x027] = SAPP_KEYCODE_SEMICOLON; + _sapp.keycodes[0x035] = SAPP_KEYCODE_SLASH; + _sapp.keycodes[0x056] = SAPP_KEYCODE_WORLD_2; + _sapp.keycodes[0x00E] = SAPP_KEYCODE_BACKSPACE; + _sapp.keycodes[0x153] = SAPP_KEYCODE_DELETE; + _sapp.keycodes[0x14F] = SAPP_KEYCODE_END; + _sapp.keycodes[0x01C] = SAPP_KEYCODE_ENTER; + _sapp.keycodes[0x001] = SAPP_KEYCODE_ESCAPE; + _sapp.keycodes[0x147] = SAPP_KEYCODE_HOME; + _sapp.keycodes[0x152] = SAPP_KEYCODE_INSERT; + _sapp.keycodes[0x15D] = SAPP_KEYCODE_MENU; + _sapp.keycodes[0x151] = SAPP_KEYCODE_PAGE_DOWN; + _sapp.keycodes[0x149] = SAPP_KEYCODE_PAGE_UP; + _sapp.keycodes[0x045] = SAPP_KEYCODE_PAUSE; + _sapp.keycodes[0x146] = SAPP_KEYCODE_PAUSE; + _sapp.keycodes[0x039] = SAPP_KEYCODE_SPACE; + _sapp.keycodes[0x00F] = SAPP_KEYCODE_TAB; + _sapp.keycodes[0x03A] = SAPP_KEYCODE_CAPS_LOCK; + _sapp.keycodes[0x145] = SAPP_KEYCODE_NUM_LOCK; + _sapp.keycodes[0x046] = SAPP_KEYCODE_SCROLL_LOCK; + _sapp.keycodes[0x03B] = SAPP_KEYCODE_F1; + _sapp.keycodes[0x03C] = SAPP_KEYCODE_F2; + _sapp.keycodes[0x03D] = SAPP_KEYCODE_F3; + _sapp.keycodes[0x03E] = SAPP_KEYCODE_F4; + _sapp.keycodes[0x03F] = SAPP_KEYCODE_F5; + _sapp.keycodes[0x040] = SAPP_KEYCODE_F6; + _sapp.keycodes[0x041] = SAPP_KEYCODE_F7; + _sapp.keycodes[0x042] = SAPP_KEYCODE_F8; + _sapp.keycodes[0x043] = SAPP_KEYCODE_F9; + _sapp.keycodes[0x044] = SAPP_KEYCODE_F10; + _sapp.keycodes[0x057] = SAPP_KEYCODE_F11; + _sapp.keycodes[0x058] = SAPP_KEYCODE_F12; + _sapp.keycodes[0x064] = SAPP_KEYCODE_F13; + _sapp.keycodes[0x065] = SAPP_KEYCODE_F14; + _sapp.keycodes[0x066] = SAPP_KEYCODE_F15; + _sapp.keycodes[0x067] = SAPP_KEYCODE_F16; + _sapp.keycodes[0x068] = SAPP_KEYCODE_F17; + _sapp.keycodes[0x069] = SAPP_KEYCODE_F18; + _sapp.keycodes[0x06A] = SAPP_KEYCODE_F19; + _sapp.keycodes[0x06B] = SAPP_KEYCODE_F20; + _sapp.keycodes[0x06C] = SAPP_KEYCODE_F21; + _sapp.keycodes[0x06D] = SAPP_KEYCODE_F22; + _sapp.keycodes[0x06E] = SAPP_KEYCODE_F23; + _sapp.keycodes[0x076] = SAPP_KEYCODE_F24; + _sapp.keycodes[0x038] = SAPP_KEYCODE_LEFT_ALT; + _sapp.keycodes[0x01D] = SAPP_KEYCODE_LEFT_CONTROL; + _sapp.keycodes[0x02A] = SAPP_KEYCODE_LEFT_SHIFT; + _sapp.keycodes[0x15B] = SAPP_KEYCODE_LEFT_SUPER; + _sapp.keycodes[0x137] = SAPP_KEYCODE_PRINT_SCREEN; + _sapp.keycodes[0x138] = SAPP_KEYCODE_RIGHT_ALT; + _sapp.keycodes[0x11D] = SAPP_KEYCODE_RIGHT_CONTROL; + _sapp.keycodes[0x036] = SAPP_KEYCODE_RIGHT_SHIFT; + _sapp.keycodes[0x15C] = SAPP_KEYCODE_RIGHT_SUPER; + _sapp.keycodes[0x150] = SAPP_KEYCODE_DOWN; + _sapp.keycodes[0x14B] = SAPP_KEYCODE_LEFT; + _sapp.keycodes[0x14D] = SAPP_KEYCODE_RIGHT; + _sapp.keycodes[0x148] = SAPP_KEYCODE_UP; + _sapp.keycodes[0x052] = SAPP_KEYCODE_KP_0; + _sapp.keycodes[0x04F] = SAPP_KEYCODE_KP_1; + _sapp.keycodes[0x050] = SAPP_KEYCODE_KP_2; + _sapp.keycodes[0x051] = SAPP_KEYCODE_KP_3; + _sapp.keycodes[0x04B] = SAPP_KEYCODE_KP_4; + _sapp.keycodes[0x04C] = SAPP_KEYCODE_KP_5; + _sapp.keycodes[0x04D] = SAPP_KEYCODE_KP_6; + _sapp.keycodes[0x047] = SAPP_KEYCODE_KP_7; + _sapp.keycodes[0x048] = SAPP_KEYCODE_KP_8; + _sapp.keycodes[0x049] = SAPP_KEYCODE_KP_9; + _sapp.keycodes[0x04E] = SAPP_KEYCODE_KP_ADD; + _sapp.keycodes[0x053] = SAPP_KEYCODE_KP_DECIMAL; + _sapp.keycodes[0x135] = SAPP_KEYCODE_KP_DIVIDE; + _sapp.keycodes[0x11C] = SAPP_KEYCODE_KP_ENTER; + _sapp.keycodes[0x037] = SAPP_KEYCODE_KP_MULTIPLY; + _sapp.keycodes[0x04A] = SAPP_KEYCODE_KP_SUBTRACT; +} +#endif // _SAPP_WIN32 || _SAPP_UWP + +/*== WINDOWS DESKTOP===========================================================*/ +#if defined(_SAPP_WIN32) + +#if defined(SOKOL_D3D11) + +#if defined(__cplusplus) +#define _sapp_d3d11_Release(self) (self)->Release() +#else +#define _sapp_d3d11_Release(self) (self)->lpVtbl->Release(self) +#endif + +#define _SAPP_SAFE_RELEASE(obj) if (obj) { _sapp_d3d11_Release(obj); obj=0; } + +static const IID _sapp_IID_ID3D11Texture2D = { 0x6f15aaf2,0xd208,0x4e89,0x9a,0xb4,0x48,0x95,0x35,0xd3,0x4f,0x9c }; + +static inline HRESULT _sapp_dxgi_GetBuffer(IDXGISwapChain* self, UINT Buffer, REFIID riid, void** ppSurface) { + #if defined(__cplusplus) + return self->GetBuffer(Buffer, riid, ppSurface); + #else + return self->lpVtbl->GetBuffer(self, Buffer, riid, ppSurface); + #endif +} + +static inline HRESULT _sapp_d3d11_CreateRenderTargetView(ID3D11Device* self, ID3D11Resource *pResource, const D3D11_RENDER_TARGET_VIEW_DESC* pDesc, ID3D11RenderTargetView** ppRTView) { + #if defined(__cplusplus) + return self->CreateRenderTargetView(pResource, pDesc, ppRTView); + #else + return self->lpVtbl->CreateRenderTargetView(self, pResource, pDesc, ppRTView); + #endif +} + +static inline HRESULT _sapp_d3d11_CreateTexture2D(ID3D11Device* self, const D3D11_TEXTURE2D_DESC* pDesc, const D3D11_SUBRESOURCE_DATA* pInitialData, ID3D11Texture2D** ppTexture2D) { + #if defined(__cplusplus) + return self->CreateTexture2D(pDesc, pInitialData, ppTexture2D); + #else + return self->lpVtbl->CreateTexture2D(self, pDesc, pInitialData, ppTexture2D); + #endif +} + +static inline HRESULT _sapp_d3d11_CreateDepthStencilView(ID3D11Device* self, ID3D11Resource* pResource, const D3D11_DEPTH_STENCIL_VIEW_DESC* pDesc, ID3D11DepthStencilView** ppDepthStencilView) { + #if defined(__cplusplus) + return self->CreateDepthStencilView(pResource, pDesc, ppDepthStencilView); + #else + return self->lpVtbl->CreateDepthStencilView(self, pResource, pDesc, ppDepthStencilView); + #endif +} + +static inline void _sapp_d3d11_ResolveSubresource(ID3D11DeviceContext* self, ID3D11Resource* pDstResource, UINT DstSubresource, ID3D11Resource* pSrcResource, UINT SrcSubresource, DXGI_FORMAT Format) { + #if defined(__cplusplus) + self->ResolveSubresource(pDstResource, DstSubresource, pSrcResource, SrcSubresource, Format); + #else + self->lpVtbl->ResolveSubresource(self, pDstResource, DstSubresource, pSrcResource, SrcSubresource, Format); + #endif +} + +static inline HRESULT _sapp_dxgi_ResizeBuffers(IDXGISwapChain* self, UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags) { + #if defined(__cplusplus) + return self->ResizeBuffers(BufferCount, Width, Height, NewFormat, SwapChainFlags); + #else + return self->lpVtbl->ResizeBuffers(self, BufferCount, Width, Height, NewFormat, SwapChainFlags); + #endif +} + +static inline HRESULT _sapp_dxgi_Present(IDXGISwapChain* self, UINT SyncInterval, UINT Flags) { + #if defined(__cplusplus) + return self->Present(SyncInterval, Flags); + #else + return self->lpVtbl->Present(self, SyncInterval, Flags); + #endif +} + +_SOKOL_PRIVATE void _sapp_d3d11_create_device_and_swapchain(void) { + DXGI_SWAP_CHAIN_DESC* sc_desc = &_sapp.d3d11.swap_chain_desc; + sc_desc->BufferDesc.Width = (UINT)_sapp.framebuffer_width; + sc_desc->BufferDesc.Height = (UINT)_sapp.framebuffer_height; + sc_desc->BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + sc_desc->BufferDesc.RefreshRate.Numerator = 60; + sc_desc->BufferDesc.RefreshRate.Denominator = 1; + sc_desc->OutputWindow = _sapp.win32.hwnd; + sc_desc->Windowed = true; + if (_sapp.win32.is_win10_or_greater) { + sc_desc->BufferCount = 2; + sc_desc->SwapEffect = (DXGI_SWAP_EFFECT) _SAPP_DXGI_SWAP_EFFECT_FLIP_DISCARD; + } + else { + sc_desc->BufferCount = 1; + sc_desc->SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + } + sc_desc->SampleDesc.Count = 1; + sc_desc->SampleDesc.Quality = 0; + sc_desc->BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + UINT create_flags = D3D11_CREATE_DEVICE_SINGLETHREADED | D3D11_CREATE_DEVICE_BGRA_SUPPORT; + #if defined(SOKOL_DEBUG) + create_flags |= D3D11_CREATE_DEVICE_DEBUG; + #endif + D3D_FEATURE_LEVEL feature_level; + HRESULT hr = D3D11CreateDeviceAndSwapChain( + NULL, /* pAdapter (use default) */ + D3D_DRIVER_TYPE_HARDWARE, /* DriverType */ + NULL, /* Software */ + create_flags, /* Flags */ + NULL, /* pFeatureLevels */ + 0, /* FeatureLevels */ + D3D11_SDK_VERSION, /* SDKVersion */ + sc_desc, /* pSwapChainDesc */ + &_sapp.d3d11.swap_chain, /* ppSwapChain */ + &_sapp.d3d11.device, /* ppDevice */ + &feature_level, /* pFeatureLevel */ + &_sapp.d3d11.device_context); /* ppImmediateContext */ + _SOKOL_UNUSED(hr); + SOKOL_ASSERT(SUCCEEDED(hr) && _sapp.d3d11.swap_chain && _sapp.d3d11.device && _sapp.d3d11.device_context); +} + +_SOKOL_PRIVATE void _sapp_d3d11_destroy_device_and_swapchain(void) { + _SAPP_SAFE_RELEASE(_sapp.d3d11.swap_chain); + _SAPP_SAFE_RELEASE(_sapp.d3d11.device_context); + _SAPP_SAFE_RELEASE(_sapp.d3d11.device); +} + +_SOKOL_PRIVATE void _sapp_d3d11_create_default_render_target(void) { + SOKOL_ASSERT(0 == _sapp.d3d11.rt); + SOKOL_ASSERT(0 == _sapp.d3d11.rtv); + SOKOL_ASSERT(0 == _sapp.d3d11.msaa_rt); + SOKOL_ASSERT(0 == _sapp.d3d11.msaa_rtv); + SOKOL_ASSERT(0 == _sapp.d3d11.ds); + SOKOL_ASSERT(0 == _sapp.d3d11.dsv); + + HRESULT hr; + + /* view for the swapchain-created framebuffer */ + #ifdef __cplusplus + hr = _sapp_dxgi_GetBuffer(_sapp.d3d11.swap_chain, 0, _sapp_IID_ID3D11Texture2D, (void**)&_sapp.d3d11.rt); + #else + hr = _sapp_dxgi_GetBuffer(_sapp.d3d11.swap_chain, 0, &_sapp_IID_ID3D11Texture2D, (void**)&_sapp.d3d11.rt); + #endif + SOKOL_ASSERT(SUCCEEDED(hr) && _sapp.d3d11.rt); + hr = _sapp_d3d11_CreateRenderTargetView(_sapp.d3d11.device, (ID3D11Resource*)_sapp.d3d11.rt, NULL, &_sapp.d3d11.rtv); + SOKOL_ASSERT(SUCCEEDED(hr) && _sapp.d3d11.rtv); + + /* common desc for MSAA and depth-stencil texture */ + D3D11_TEXTURE2D_DESC tex_desc; + memset(&tex_desc, 0, sizeof(tex_desc)); + tex_desc.Width = (UINT)_sapp.framebuffer_width; + tex_desc.Height = (UINT)_sapp.framebuffer_height; + tex_desc.MipLevels = 1; + tex_desc.ArraySize = 1; + tex_desc.Usage = D3D11_USAGE_DEFAULT; + tex_desc.BindFlags = D3D11_BIND_RENDER_TARGET; + tex_desc.SampleDesc.Count = (UINT) _sapp.sample_count; + tex_desc.SampleDesc.Quality = (UINT) (_sapp.sample_count > 1 ? D3D11_STANDARD_MULTISAMPLE_PATTERN : 0); + + /* create MSAA texture and view if antialiasing requested */ + if (_sapp.sample_count > 1) { + tex_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + hr = _sapp_d3d11_CreateTexture2D(_sapp.d3d11.device, &tex_desc, NULL, &_sapp.d3d11.msaa_rt); + SOKOL_ASSERT(SUCCEEDED(hr) && _sapp.d3d11.msaa_rt); + hr = _sapp_d3d11_CreateRenderTargetView(_sapp.d3d11.device, (ID3D11Resource*)_sapp.d3d11.msaa_rt, NULL, &_sapp.d3d11.msaa_rtv); + SOKOL_ASSERT(SUCCEEDED(hr) && _sapp.d3d11.msaa_rtv); + } + + /* texture and view for the depth-stencil-surface */ + tex_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + tex_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL; + hr = _sapp_d3d11_CreateTexture2D(_sapp.d3d11.device, &tex_desc, NULL, &_sapp.d3d11.ds); + SOKOL_ASSERT(SUCCEEDED(hr) && _sapp.d3d11.ds); + hr = _sapp_d3d11_CreateDepthStencilView(_sapp.d3d11.device, (ID3D11Resource*)_sapp.d3d11.ds, NULL, &_sapp.d3d11.dsv); + SOKOL_ASSERT(SUCCEEDED(hr) && _sapp.d3d11.dsv); +} + +_SOKOL_PRIVATE void _sapp_d3d11_destroy_default_render_target(void) { + _SAPP_SAFE_RELEASE(_sapp.d3d11.rt); + _SAPP_SAFE_RELEASE(_sapp.d3d11.rtv); + _SAPP_SAFE_RELEASE(_sapp.d3d11.msaa_rt); + _SAPP_SAFE_RELEASE(_sapp.d3d11.msaa_rtv); + _SAPP_SAFE_RELEASE(_sapp.d3d11.ds); + _SAPP_SAFE_RELEASE(_sapp.d3d11.dsv); +} + +_SOKOL_PRIVATE void _sapp_d3d11_resize_default_render_target(void) { + if (_sapp.d3d11.swap_chain) { + _sapp_d3d11_destroy_default_render_target(); + _sapp_dxgi_ResizeBuffers(_sapp.d3d11.swap_chain, _sapp.d3d11.swap_chain_desc.BufferCount, (UINT)_sapp.framebuffer_width, (UINT)_sapp.framebuffer_height, DXGI_FORMAT_B8G8R8A8_UNORM, 0); + _sapp_d3d11_create_default_render_target(); + } +} + +_SOKOL_PRIVATE void _sapp_d3d11_present(void) { + /* do MSAA resolve if needed */ + if (_sapp.sample_count > 1) { + SOKOL_ASSERT(_sapp.d3d11.rt); + SOKOL_ASSERT(_sapp.d3d11.msaa_rt); + _sapp_d3d11_ResolveSubresource(_sapp.d3d11.device_context, (ID3D11Resource*)_sapp.d3d11.rt, 0, (ID3D11Resource*)_sapp.d3d11.msaa_rt, 0, DXGI_FORMAT_B8G8R8A8_UNORM); + } + _sapp_dxgi_Present(_sapp.d3d11.swap_chain, (UINT)_sapp.swap_interval, 0); +} + +#endif /* SOKOL_D3D11 */ + +#if defined(SOKOL_GLCORE33) +_SOKOL_PRIVATE void _sapp_wgl_init(void) { + _sapp.wgl.opengl32 = LoadLibraryA("opengl32.dll"); + if (!_sapp.wgl.opengl32) { + _sapp_fail("Failed to load opengl32.dll\n"); + } + SOKOL_ASSERT(_sapp.wgl.opengl32); + _sapp.wgl.CreateContext = (PFN_wglCreateContext)(void*) GetProcAddress(_sapp.wgl.opengl32, "wglCreateContext"); + SOKOL_ASSERT(_sapp.wgl.CreateContext); + _sapp.wgl.DeleteContext = (PFN_wglDeleteContext)(void*) GetProcAddress(_sapp.wgl.opengl32, "wglDeleteContext"); + SOKOL_ASSERT(_sapp.wgl.DeleteContext); + _sapp.wgl.GetProcAddress = (PFN_wglGetProcAddress)(void*) GetProcAddress(_sapp.wgl.opengl32, "wglGetProcAddress"); + SOKOL_ASSERT(_sapp.wgl.GetProcAddress); + _sapp.wgl.GetCurrentDC = (PFN_wglGetCurrentDC)(void*) GetProcAddress(_sapp.wgl.opengl32, "wglGetCurrentDC"); + SOKOL_ASSERT(_sapp.wgl.GetCurrentDC); + _sapp.wgl.MakeCurrent = (PFN_wglMakeCurrent)(void*) GetProcAddress(_sapp.wgl.opengl32, "wglMakeCurrent"); + SOKOL_ASSERT(_sapp.wgl.MakeCurrent); + + _sapp.wgl.msg_hwnd = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, + L"SOKOLAPP", + L"sokol-app message window", + WS_CLIPSIBLINGS|WS_CLIPCHILDREN, + 0, 0, 1, 1, + NULL, NULL, + GetModuleHandleW(NULL), + NULL); + if (!_sapp.wgl.msg_hwnd) { + _sapp_fail("Win32: failed to create helper window!\n"); + } + SOKOL_ASSERT(_sapp.wgl.msg_hwnd); + ShowWindow(_sapp.wgl.msg_hwnd, SW_HIDE); + MSG msg; + while (PeekMessageW(&msg, _sapp.wgl.msg_hwnd, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + _sapp.wgl.msg_dc = GetDC(_sapp.wgl.msg_hwnd); + if (!_sapp.wgl.msg_dc) { + _sapp_fail("Win32: failed to obtain helper window DC!\n"); + } +} + +_SOKOL_PRIVATE void _sapp_wgl_shutdown(void) { + SOKOL_ASSERT(_sapp.wgl.opengl32 && _sapp.wgl.msg_hwnd); + DestroyWindow(_sapp.wgl.msg_hwnd); _sapp.wgl.msg_hwnd = 0; + FreeLibrary(_sapp.wgl.opengl32); _sapp.wgl.opengl32 = 0; +} + +_SOKOL_PRIVATE bool _sapp_wgl_has_ext(const char* ext, const char* extensions) { + SOKOL_ASSERT(ext && extensions); + const char* start = extensions; + while (true) { + const char* where = strstr(start, ext); + if (!where) { + return false; + } + const char* terminator = where + strlen(ext); + if ((where == start) || (*(where - 1) == ' ')) { + if (*terminator == ' ' || *terminator == '\0') { + break; + } + } + start = terminator; + } + return true; +} + +_SOKOL_PRIVATE bool _sapp_wgl_ext_supported(const char* ext) { + SOKOL_ASSERT(ext); + if (_sapp.wgl.GetExtensionsStringEXT) { + const char* extensions = _sapp.wgl.GetExtensionsStringEXT(); + if (extensions) { + if (_sapp_wgl_has_ext(ext, extensions)) { + return true; + } + } + } + if (_sapp.wgl.GetExtensionsStringARB) { + const char* extensions = _sapp.wgl.GetExtensionsStringARB(_sapp.wgl.GetCurrentDC()); + if (extensions) { + if (_sapp_wgl_has_ext(ext, extensions)) { + return true; + } + } + } + return false; +} + +_SOKOL_PRIVATE void _sapp_wgl_load_extensions(void) { + SOKOL_ASSERT(_sapp.wgl.msg_dc); + PIXELFORMATDESCRIPTOR pfd; + memset(&pfd, 0, sizeof(pfd)); + pfd.nSize = sizeof(pfd); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 24; + if (!SetPixelFormat(_sapp.wgl.msg_dc, ChoosePixelFormat(_sapp.wgl.msg_dc, &pfd), &pfd)) { + _sapp_fail("WGL: failed to set pixel format for dummy context\n"); + } + HGLRC rc = _sapp.wgl.CreateContext(_sapp.wgl.msg_dc); + if (!rc) { + _sapp_fail("WGL: Failed to create dummy context\n"); + } + if (!_sapp.wgl.MakeCurrent(_sapp.wgl.msg_dc, rc)) { + _sapp_fail("WGL: Failed to make context current\n"); + } + _sapp.wgl.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void*) _sapp.wgl.GetProcAddress("wglGetExtensionsStringEXT"); + _sapp.wgl.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)(void*) _sapp.wgl.GetProcAddress("wglGetExtensionsStringARB"); + _sapp.wgl.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)(void*) _sapp.wgl.GetProcAddress("wglCreateContextAttribsARB"); + _sapp.wgl.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)(void*) _sapp.wgl.GetProcAddress("wglSwapIntervalEXT"); + _sapp.wgl.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(void*) _sapp.wgl.GetProcAddress("wglGetPixelFormatAttribivARB"); + _sapp.wgl.arb_multisample = _sapp_wgl_ext_supported("WGL_ARB_multisample"); + _sapp.wgl.arb_create_context = _sapp_wgl_ext_supported("WGL_ARB_create_context"); + _sapp.wgl.arb_create_context_profile = _sapp_wgl_ext_supported("WGL_ARB_create_context_profile"); + _sapp.wgl.ext_swap_control = _sapp_wgl_ext_supported("WGL_EXT_swap_control"); + _sapp.wgl.arb_pixel_format = _sapp_wgl_ext_supported("WGL_ARB_pixel_format"); + _sapp.wgl.MakeCurrent(_sapp.wgl.msg_dc, 0); + _sapp.wgl.DeleteContext(rc); +} + +_SOKOL_PRIVATE int _sapp_wgl_attrib(int pixel_format, int attrib) { + SOKOL_ASSERT(_sapp.wgl.arb_pixel_format); + int value = 0; + if (!_sapp.wgl.GetPixelFormatAttribivARB(_sapp.win32.dc, pixel_format, 0, 1, &attrib, &value)) { + _sapp_fail("WGL: Failed to retrieve pixel format attribute\n"); + } + return value; +} + +_SOKOL_PRIVATE int _sapp_wgl_find_pixel_format(void) { + SOKOL_ASSERT(_sapp.win32.dc); + SOKOL_ASSERT(_sapp.wgl.arb_pixel_format); + const _sapp_gl_fbconfig* closest; + + int native_count = _sapp_wgl_attrib(1, WGL_NUMBER_PIXEL_FORMATS_ARB); + _sapp_gl_fbconfig* usable_configs = (_sapp_gl_fbconfig*) SOKOL_CALLOC((size_t)native_count, sizeof(_sapp_gl_fbconfig)); + SOKOL_ASSERT(usable_configs); + int usable_count = 0; + for (int i = 0; i < native_count; i++) { + const int n = i + 1; + _sapp_gl_fbconfig* u = usable_configs + usable_count; + _sapp_gl_init_fbconfig(u); + if (!_sapp_wgl_attrib(n, WGL_SUPPORT_OPENGL_ARB) || !_sapp_wgl_attrib(n, WGL_DRAW_TO_WINDOW_ARB)) { + continue; + } + if (_sapp_wgl_attrib(n, WGL_PIXEL_TYPE_ARB) != WGL_TYPE_RGBA_ARB) { + continue; + } + if (_sapp_wgl_attrib(n, WGL_ACCELERATION_ARB) == WGL_NO_ACCELERATION_ARB) { + continue; + } + u->red_bits = _sapp_wgl_attrib(n, WGL_RED_BITS_ARB); + u->green_bits = _sapp_wgl_attrib(n, WGL_GREEN_BITS_ARB); + u->blue_bits = _sapp_wgl_attrib(n, WGL_BLUE_BITS_ARB); + u->alpha_bits = _sapp_wgl_attrib(n, WGL_ALPHA_BITS_ARB); + u->depth_bits = _sapp_wgl_attrib(n, WGL_DEPTH_BITS_ARB); + u->stencil_bits = _sapp_wgl_attrib(n, WGL_STENCIL_BITS_ARB); + if (_sapp_wgl_attrib(n, WGL_DOUBLE_BUFFER_ARB)) { + u->doublebuffer = true; + } + if (_sapp.wgl.arb_multisample) { + u->samples = _sapp_wgl_attrib(n, WGL_SAMPLES_ARB); + } + u->handle = (uintptr_t)n; + usable_count++; + } + SOKOL_ASSERT(usable_count > 0); + _sapp_gl_fbconfig desired; + _sapp_gl_init_fbconfig(&desired); + desired.red_bits = 8; + desired.green_bits = 8; + desired.blue_bits = 8; + desired.alpha_bits = 8; + desired.depth_bits = 24; + desired.stencil_bits = 8; + desired.doublebuffer = true; + desired.samples = _sapp.sample_count > 1 ? _sapp.sample_count : 0; + closest = _sapp_gl_choose_fbconfig(&desired, usable_configs, usable_count); + int pixel_format = 0; + if (closest) { + pixel_format = (int) closest->handle; + } + SOKOL_FREE(usable_configs); + return pixel_format; +} + +_SOKOL_PRIVATE void _sapp_wgl_create_context(void) { + int pixel_format = _sapp_wgl_find_pixel_format(); + if (0 == pixel_format) { + _sapp_fail("WGL: Didn't find matching pixel format.\n"); + } + PIXELFORMATDESCRIPTOR pfd; + if (!DescribePixelFormat(_sapp.win32.dc, pixel_format, sizeof(pfd), &pfd)) { + _sapp_fail("WGL: Failed to retrieve PFD for selected pixel format!\n"); + } + if (!SetPixelFormat(_sapp.win32.dc, pixel_format, &pfd)) { + _sapp_fail("WGL: Failed to set selected pixel format!\n"); + } + if (!_sapp.wgl.arb_create_context) { + _sapp_fail("WGL: ARB_create_context required!\n"); + } + if (!_sapp.wgl.arb_create_context_profile) { + _sapp_fail("WGL: ARB_create_context_profile required!\n"); + } + const int attrs[] = { + WGL_CONTEXT_MAJOR_VERSION_ARB, 3, + WGL_CONTEXT_MINOR_VERSION_ARB, 3, + WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, + WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, + 0, 0 + }; + _sapp.wgl.gl_ctx = _sapp.wgl.CreateContextAttribsARB(_sapp.win32.dc, 0, attrs); + if (!_sapp.wgl.gl_ctx) { + const DWORD err = GetLastError(); + if (err == (0xc0070000 | ERROR_INVALID_VERSION_ARB)) { + _sapp_fail("WGL: Driver does not support OpenGL version 3.3\n"); + } + else if (err == (0xc0070000 | ERROR_INVALID_PROFILE_ARB)) { + _sapp_fail("WGL: Driver does not support the requested OpenGL profile"); + } + else if (err == (0xc0070000 | ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB)) { + _sapp_fail("WGL: The share context is not compatible with the requested context"); + } + else { + _sapp_fail("WGL: Failed to create OpenGL context"); + } + } + _sapp.wgl.MakeCurrent(_sapp.win32.dc, _sapp.wgl.gl_ctx); + if (_sapp.wgl.ext_swap_control) { + /* FIXME: DwmIsCompositionEnabled() (see GLFW) */ + _sapp.wgl.SwapIntervalEXT(_sapp.swap_interval); + } +} + +_SOKOL_PRIVATE void _sapp_wgl_destroy_context(void) { + SOKOL_ASSERT(_sapp.wgl.gl_ctx); + _sapp.wgl.DeleteContext(_sapp.wgl.gl_ctx); + _sapp.wgl.gl_ctx = 0; +} + +_SOKOL_PRIVATE void _sapp_wgl_swap_buffers(void) { + SOKOL_ASSERT(_sapp.win32.dc); + /* FIXME: DwmIsCompositionEnabled? (see GLFW) */ + SwapBuffers(_sapp.win32.dc); +} +#endif /* SOKOL_GLCORE33 */ + +_SOKOL_PRIVATE bool _sapp_win32_wide_to_utf8(const wchar_t* src, char* dst, int dst_num_bytes) { + SOKOL_ASSERT(src && dst && (dst_num_bytes > 1)); + memset(dst, 0, (size_t)dst_num_bytes); + const int bytes_needed = WideCharToMultiByte(CP_UTF8, 0, src, -1, NULL, 0, NULL, NULL); + if (bytes_needed <= dst_num_bytes) { + WideCharToMultiByte(CP_UTF8, 0, src, -1, dst, dst_num_bytes, NULL, NULL); + return true; + } + else { + return false; + } +} + +_SOKOL_PRIVATE void _sapp_win32_toggle_fullscreen(void) { + HMONITOR monitor = MonitorFromWindow(_sapp.win32.hwnd, MONITOR_DEFAULTTONEAREST); + MONITORINFO minfo; + memset(&minfo, 0, sizeof(minfo)); + minfo.cbSize = sizeof(MONITORINFO); + GetMonitorInfo(monitor, &minfo); + const RECT mr = minfo.rcMonitor; + const int monitor_w = mr.right - mr.left; + const int monitor_h = mr.bottom - mr.top; + + const DWORD win_ex_style = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; + DWORD win_style; + RECT rect = { 0, 0, 0, 0 }; + + _sapp.fullscreen = !_sapp.fullscreen; + if (!_sapp.fullscreen) { + win_style = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SIZEBOX; + rect.right = (int) ((float)_sapp.desc.width * _sapp.win32.dpi.window_scale); + rect.bottom = (int) ((float)_sapp.desc.height * _sapp.win32.dpi.window_scale); + } + else { + win_style = WS_POPUP | WS_SYSMENU | WS_VISIBLE; + rect.right = monitor_w; + rect.bottom = monitor_h; + } + AdjustWindowRectEx(&rect, win_style, FALSE, win_ex_style); + int win_width = rect.right - rect.left; + int win_height = rect.bottom - rect.top; + if (!_sapp.fullscreen) { + rect.left = (monitor_w - win_width) / 2; + rect.top = (monitor_h - win_height) / 2; + } + + SetWindowLongPtr(_sapp.win32.hwnd, GWL_STYLE, win_style); + SetWindowPos(_sapp.win32.hwnd, HWND_TOP, mr.left + rect.left, mr.top + rect.top, win_width, win_height, SWP_SHOWWINDOW | SWP_FRAMECHANGED); +} + +_SOKOL_PRIVATE void _sapp_win32_show_mouse(bool visible) { + /* NOTE: this function is only called when the mouse visibility actually changes */ + ShowCursor((BOOL)visible); +} + +_SOKOL_PRIVATE void _sapp_win32_capture_mouse(uint8_t btn_mask) { + if (0 == _sapp.win32.mouse_capture_mask) { + SetCapture(_sapp.win32.hwnd); + } + _sapp.win32.mouse_capture_mask |= btn_mask; +} + +_SOKOL_PRIVATE void _sapp_win32_release_mouse(uint8_t btn_mask) { + if (0 != _sapp.win32.mouse_capture_mask) { + _sapp.win32.mouse_capture_mask &= ~btn_mask; + if (0 == _sapp.win32.mouse_capture_mask) { + ReleaseCapture(); + } + } +} + +_SOKOL_PRIVATE void _sapp_win32_lock_mouse(bool lock) { + if (lock == _sapp.mouse.locked) { + return; + } + _sapp.mouse.dx = 0.0f; + _sapp.mouse.dy = 0.0f; + _sapp.mouse.locked = lock; + _sapp_win32_release_mouse(0xFF); + if (_sapp.mouse.locked) { + /* store the current mouse position, so it can be restored when unlocked */ + POINT pos; + BOOL res = GetCursorPos(&pos); + SOKOL_ASSERT(res); _SOKOL_UNUSED(res); + _sapp.win32.mouse_locked_x = pos.x; + _sapp.win32.mouse_locked_y = pos.y; + + /* while the mouse is locked, make the mouse cursor invisible and + confine the mouse movement to a small rectangle inside our window + (so that we dont miss any mouse up events) + */ + RECT client_rect = { + _sapp.win32.mouse_locked_x, + _sapp.win32.mouse_locked_y, + _sapp.win32.mouse_locked_x, + _sapp.win32.mouse_locked_y + }; + ClipCursor(&client_rect); + + /* make the mouse cursor invisible, this will stack with sapp_show_mouse() */ + ShowCursor(FALSE); + + /* enable raw input for mouse, starts sending WM_INPUT messages to WinProc (see GLFW) */ + const RAWINPUTDEVICE rid = { + 0x01, // usUsagePage: HID_USAGE_PAGE_GENERIC + 0x02, // usUsage: HID_USAGE_GENERIC_MOUSE + 0, // dwFlags + _sapp.win32.hwnd // hwndTarget + }; + if (!RegisterRawInputDevices(&rid, 1, sizeof(rid))) { + SOKOL_LOG("RegisterRawInputDevices() failed (on mouse lock).\n"); + } + /* in case the raw mouse device only supports absolute position reporting, + we need to skip the dx/dy compution for the first WM_INPUT event + */ + _sapp.win32.raw_input_mousepos_valid = false; + } + else { + /* disable raw input for mouse */ + const RAWINPUTDEVICE rid = { 0x01, 0x02, RIDEV_REMOVE, NULL }; + if (!RegisterRawInputDevices(&rid, 1, sizeof(rid))) { + SOKOL_LOG("RegisterRawInputDevices() failed (on mouse unlock).\n"); + } + + /* let the mouse roam freely again */ + ClipCursor(NULL); + ShowCursor(TRUE); + + /* restore the 'pre-locked' mouse position */ + BOOL res = SetCursorPos(_sapp.win32.mouse_locked_x, _sapp.win32.mouse_locked_y); + SOKOL_ASSERT(res); _SOKOL_UNUSED(res); + } +} + +/* updates current window and framebuffer size from the window's client rect, returns true if size has changed */ +_SOKOL_PRIVATE bool _sapp_win32_update_dimensions(void) { + RECT rect; + if (GetClientRect(_sapp.win32.hwnd, &rect)) { + _sapp.window_width = (int)((float)(rect.right - rect.left) / _sapp.win32.dpi.window_scale); + _sapp.window_height = (int)((float)(rect.bottom - rect.top) / _sapp.win32.dpi.window_scale); + int fb_width = (int)((float)_sapp.window_width * _sapp.win32.dpi.content_scale); + int fb_height = (int)((float)_sapp.window_height * _sapp.win32.dpi.content_scale); + /* prevent a framebuffer size of 0 when window is minimized */ + if (0 == fb_width) { + fb_width = 1; + } + if (0 == fb_height) { + fb_height = 1; + } + if ((fb_width != _sapp.framebuffer_width) || (fb_height != _sapp.framebuffer_height)) { + _sapp.framebuffer_width = fb_width; + _sapp.framebuffer_height = fb_height; + return true; + } + } + else { + _sapp.window_width = _sapp.window_height = 1; + _sapp.framebuffer_width = _sapp.framebuffer_height = 1; + } + return false; +} + +_SOKOL_PRIVATE uint32_t _sapp_win32_mods(void) { + uint32_t mods = 0; + if (GetKeyState(VK_SHIFT) & (1<<15)) { + mods |= SAPP_MODIFIER_SHIFT; + } + if (GetKeyState(VK_CONTROL) & (1<<15)) { + mods |= SAPP_MODIFIER_CTRL; + } + if (GetKeyState(VK_MENU) & (1<<15)) { + mods |= SAPP_MODIFIER_ALT; + } + if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & (1<<15)) { + mods |= SAPP_MODIFIER_SUPER; + } + const bool swapped = (TRUE == GetSystemMetrics(SM_SWAPBUTTON)); + if (GetAsyncKeyState(VK_LBUTTON)) { + mods |= swapped ? SAPP_MODIFIER_RMB : SAPP_MODIFIER_LMB; + } + if (GetAsyncKeyState(VK_RBUTTON)) { + mods |= swapped ? SAPP_MODIFIER_LMB : SAPP_MODIFIER_RMB; + } + if (GetAsyncKeyState(VK_MBUTTON)) { + mods |= SAPP_MODIFIER_MMB; + } + return mods; +} + +_SOKOL_PRIVATE void _sapp_win32_mouse_event(sapp_event_type type, sapp_mousebutton btn) { + if (_sapp_events_enabled()) { + _sapp_init_event(type); + _sapp.event.modifiers = _sapp_win32_mods(); + _sapp.event.mouse_button = btn; + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE void _sapp_win32_scroll_event(float x, float y) { + if (_sapp_events_enabled()) { + _sapp_init_event(SAPP_EVENTTYPE_MOUSE_SCROLL); + _sapp.event.modifiers = _sapp_win32_mods(); + _sapp.event.scroll_x = -x / 30.0f; + _sapp.event.scroll_y = y / 30.0f; + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE void _sapp_win32_key_event(sapp_event_type type, int vk, bool repeat) { + if (_sapp_events_enabled() && (vk < SAPP_MAX_KEYCODES)) { + _sapp_init_event(type); + _sapp.event.modifiers = _sapp_win32_mods(); + _sapp.event.key_code = _sapp.keycodes[vk]; + _sapp.event.key_repeat = repeat; + _sapp_call_event(&_sapp.event); + /* check if a CLIPBOARD_PASTED event must be sent too */ + if (_sapp.clipboard.enabled && + (type == SAPP_EVENTTYPE_KEY_DOWN) && + (_sapp.event.modifiers == SAPP_MODIFIER_CTRL) && + (_sapp.event.key_code == SAPP_KEYCODE_V)) + { + _sapp_init_event(SAPP_EVENTTYPE_CLIPBOARD_PASTED); + _sapp_call_event(&_sapp.event); + } + } +} + +_SOKOL_PRIVATE void _sapp_win32_char_event(uint32_t c, bool repeat) { + if (_sapp_events_enabled() && (c >= 32)) { + _sapp_init_event(SAPP_EVENTTYPE_CHAR); + _sapp.event.modifiers = _sapp_win32_mods(); + _sapp.event.char_code = c; + _sapp.event.key_repeat = repeat; + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE void _sapp_win32_files_dropped(HDROP hdrop) { + if (!_sapp.drop.enabled) { + return; + } + _sapp_clear_drop_buffer(); + bool drop_failed = false; + const int count = (int) DragQueryFileW(hdrop, 0xffffffff, NULL, 0); + _sapp.drop.num_files = (count > _sapp.drop.max_files) ? _sapp.drop.max_files : count; + for (UINT i = 0; i < (UINT)_sapp.drop.num_files; i++) { + const UINT num_chars = DragQueryFileW(hdrop, i, NULL, 0) + 1; + WCHAR* buffer = (WCHAR*) SOKOL_CALLOC(num_chars, sizeof(WCHAR)); + DragQueryFileW(hdrop, i, buffer, num_chars); + if (!_sapp_win32_wide_to_utf8(buffer, _sapp_dropped_file_path_ptr((int)i), _sapp.drop.max_path_length)) { + SOKOL_LOG("sokol_app.h: dropped file path too long (sapp_desc.max_dropped_file_path_length)\n"); + drop_failed = true; + } + SOKOL_FREE(buffer); + } + DragFinish(hdrop); + if (!drop_failed) { + if (_sapp_events_enabled()) { + _sapp_init_event(SAPP_EVENTTYPE_FILES_DROPPED); + _sapp_call_event(&_sapp.event); + } + } + else { + _sapp_clear_drop_buffer(); + _sapp.drop.num_files = 0; + } +} + +_SOKOL_PRIVATE LRESULT CALLBACK _sapp_win32_wndproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + if (!_sapp.win32.in_create_window) { + switch (uMsg) { + case WM_CLOSE: + /* only give user a chance to intervene when sapp_quit() wasn't already called */ + if (!_sapp.quit_ordered) { + /* if window should be closed and event handling is enabled, give user code + a change to intervene via sapp_cancel_quit() + */ + _sapp.quit_requested = true; + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_QUIT_REQUESTED); + /* if user code hasn't intervened, quit the app */ + if (_sapp.quit_requested) { + _sapp.quit_ordered = true; + } + } + if (_sapp.quit_ordered) { + PostQuitMessage(0); + } + return 0; + case WM_SYSCOMMAND: + switch (wParam & 0xFFF0) { + case SC_SCREENSAVE: + case SC_MONITORPOWER: + if (_sapp.fullscreen) { + /* disable screen saver and blanking in fullscreen mode */ + return 0; + } + break; + case SC_KEYMENU: + /* user trying to access menu via ALT */ + return 0; + } + break; + case WM_ERASEBKGND: + return 1; + case WM_SIZE: + { + const bool iconified = wParam == SIZE_MINIMIZED; + if (iconified != _sapp.win32.iconified) { + _sapp.win32.iconified = iconified; + if (iconified) { + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_ICONIFIED); + } + else { + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_RESTORED); + } + } + } + break; + case WM_SETFOCUS: + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_FOCUSED); + break; + case WM_KILLFOCUS: + /* if focus is lost for any reason, and we're in mouse locked mode, disable mouse lock */ + if (_sapp.mouse.locked) { + _sapp_win32_lock_mouse(false); + } + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_UNFOCUSED); + break; + case WM_SETCURSOR: + if (_sapp.desc.user_cursor) { + if (LOWORD(lParam) == HTCLIENT) { + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_UPDATE_CURSOR); + return 1; + } + } + break; + case WM_LBUTTONDOWN: + _sapp_win32_mouse_event(SAPP_EVENTTYPE_MOUSE_DOWN, SAPP_MOUSEBUTTON_LEFT); + _sapp_win32_capture_mouse(1<data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE) { + /* mouse only reports absolute position + NOTE: THIS IS UNTESTED, it's unclear from reading the + Win32 RawInput docs under which circumstances absolute + positions are sent. + */ + if (_sapp.win32.raw_input_mousepos_valid) { + LONG new_x = raw_mouse_data->data.mouse.lLastX; + LONG new_y = raw_mouse_data->data.mouse.lLastY; + _sapp.mouse.dx = (float) (new_x - _sapp.win32.raw_input_mousepos_x); + _sapp.mouse.dy = (float) (new_y - _sapp.win32.raw_input_mousepos_y); + _sapp.win32.raw_input_mousepos_x = new_x; + _sapp.win32.raw_input_mousepos_y = new_y; + _sapp.win32.raw_input_mousepos_valid = true; + } + } + else { + /* mouse reports movement delta (this seems to be the common case) */ + _sapp.mouse.dx = (float) raw_mouse_data->data.mouse.lLastX; + _sapp.mouse.dy = (float) raw_mouse_data->data.mouse.lLastY; + } + _sapp_win32_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID); + } + break; + + case WM_MOUSELEAVE: + if (!_sapp.mouse.locked) { + _sapp.win32.mouse_tracked = false; + _sapp_win32_mouse_event(SAPP_EVENTTYPE_MOUSE_LEAVE, SAPP_MOUSEBUTTON_INVALID); + } + break; + case WM_MOUSEWHEEL: + _sapp_win32_scroll_event(0.0f, (float)((SHORT)HIWORD(wParam))); + break; + case WM_MOUSEHWHEEL: + _sapp_win32_scroll_event((float)((SHORT)HIWORD(wParam)), 0.0f); + break; + case WM_CHAR: + _sapp_win32_char_event((uint32_t)wParam, !!(lParam&0x40000000)); + break; + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + _sapp_win32_key_event(SAPP_EVENTTYPE_KEY_DOWN, (int)(HIWORD(lParam)&0x1FF), !!(lParam&0x40000000)); + break; + case WM_KEYUP: + case WM_SYSKEYUP: + _sapp_win32_key_event(SAPP_EVENTTYPE_KEY_UP, (int)(HIWORD(lParam)&0x1FF), false); + break; + case WM_ENTERSIZEMOVE: + SetTimer(_sapp.win32.hwnd, 1, USER_TIMER_MINIMUM, NULL); + break; + case WM_EXITSIZEMOVE: + KillTimer(_sapp.win32.hwnd, 1); + break; + case WM_TIMER: + _sapp_frame(); + #if defined(SOKOL_D3D11) + _sapp_d3d11_present(); + #endif + #if defined(SOKOL_GLCORE33) + _sapp_wgl_swap_buffers(); + #endif + /* NOTE: resizing the swap-chain during resize leads to a substantial + memory spike (hundreds of megabytes for a few seconds). + + if (_sapp_win32_update_dimensions()) { + #if defined(SOKOL_D3D11) + _sapp_d3d11_resize_default_render_target(); + #endif + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_RESIZED); + } + */ + break; + case WM_DROPFILES: + _sapp_win32_files_dropped((HDROP)wParam); + break; + default: + break; + } + } + return DefWindowProcW(hWnd, uMsg, wParam, lParam); +} + +_SOKOL_PRIVATE void _sapp_win32_create_window(void) { + WNDCLASSW wndclassw; + memset(&wndclassw, 0, sizeof(wndclassw)); + wndclassw.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; + wndclassw.lpfnWndProc = (WNDPROC) _sapp_win32_wndproc; + wndclassw.hInstance = GetModuleHandleW(NULL); + wndclassw.hCursor = LoadCursor(NULL, IDC_ARROW); + wndclassw.hIcon = LoadIcon(NULL, IDI_WINLOGO); + wndclassw.lpszClassName = L"SOKOLAPP"; + RegisterClassW(&wndclassw); + + DWORD win_style; + const DWORD win_ex_style = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; + RECT rect = { 0, 0, 0, 0 }; + if (_sapp.fullscreen) { + win_style = WS_POPUP | WS_SYSMENU | WS_VISIBLE; + rect.right = GetSystemMetrics(SM_CXSCREEN); + rect.bottom = GetSystemMetrics(SM_CYSCREEN); + } + else { + win_style = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SIZEBOX; + rect.right = (int) ((float)_sapp.window_width * _sapp.win32.dpi.window_scale); + rect.bottom = (int) ((float)_sapp.window_height * _sapp.win32.dpi.window_scale); + } + AdjustWindowRectEx(&rect, win_style, FALSE, win_ex_style); + const int win_width = rect.right - rect.left; + const int win_height = rect.bottom - rect.top; + _sapp.win32.in_create_window = true; + _sapp.win32.hwnd = CreateWindowExW( + win_ex_style, /* dwExStyle */ + L"SOKOLAPP", /* lpClassName */ + _sapp.window_title_wide, /* lpWindowName */ + win_style, /* dwStyle */ + CW_USEDEFAULT, /* X */ + CW_USEDEFAULT, /* Y */ + win_width, /* nWidth */ + win_height, /* nHeight */ + NULL, /* hWndParent */ + NULL, /* hMenu */ + GetModuleHandle(NULL), /* hInstance */ + NULL); /* lParam */ + ShowWindow(_sapp.win32.hwnd, SW_SHOW); + _sapp.win32.in_create_window = false; + _sapp.win32.dc = GetDC(_sapp.win32.hwnd); + SOKOL_ASSERT(_sapp.win32.dc); + _sapp_win32_update_dimensions(); + + DragAcceptFiles(_sapp.win32.hwnd, 1); +} + +_SOKOL_PRIVATE void _sapp_win32_destroy_window(void) { + DestroyWindow(_sapp.win32.hwnd); _sapp.win32.hwnd = 0; + UnregisterClassW(L"SOKOLAPP", GetModuleHandleW(NULL)); +} + +_SOKOL_PRIVATE void _sapp_win32_destroy_icons(void) { + if (_sapp.win32.big_icon) { + DestroyIcon(_sapp.win32.big_icon); + _sapp.win32.big_icon = 0; + } + if (_sapp.win32.small_icon) { + DestroyIcon(_sapp.win32.small_icon); + _sapp.win32.small_icon = 0; + } +} + +_SOKOL_PRIVATE void _sapp_win32_init_console(void) { + if (_sapp.desc.win32_console_create || _sapp.desc.win32_console_attach) { + BOOL con_valid = FALSE; + if (_sapp.desc.win32_console_create) { + con_valid = AllocConsole(); + } + else if (_sapp.desc.win32_console_attach) { + con_valid = AttachConsole(ATTACH_PARENT_PROCESS); + } + if (con_valid) { + FILE* res_fp = 0; + errno_t err; + err = freopen_s(&res_fp, "CON", "w", stdout); + err = freopen_s(&res_fp, "CON", "w", stderr); + (void)err; + } + } + if (_sapp.desc.win32_console_utf8) { + _sapp.win32.orig_codepage = GetConsoleOutputCP(); + SetConsoleOutputCP(CP_UTF8); + } +} + +_SOKOL_PRIVATE void _sapp_win32_restore_console(void) { + if (_sapp.desc.win32_console_utf8) { + SetConsoleOutputCP(_sapp.win32.orig_codepage); + } +} + +_SOKOL_PRIVATE void _sapp_win32_init_dpi(void) { + + typedef BOOL(WINAPI * SETPROCESSDPIAWARE_T)(void); + typedef HRESULT(WINAPI * SETPROCESSDPIAWARENESS_T)(PROCESS_DPI_AWARENESS); + typedef HRESULT(WINAPI * GETDPIFORMONITOR_T)(HMONITOR, MONITOR_DPI_TYPE, UINT*, UINT*); + + SETPROCESSDPIAWARE_T fn_setprocessdpiaware = 0; + SETPROCESSDPIAWARENESS_T fn_setprocessdpiawareness = 0; + GETDPIFORMONITOR_T fn_getdpiformonitor = 0; + HINSTANCE user32 = LoadLibraryA("user32.dll"); + if (user32) { + fn_setprocessdpiaware = (SETPROCESSDPIAWARE_T)(void*) GetProcAddress(user32, "SetProcessDPIAware"); + } + HINSTANCE shcore = LoadLibraryA("shcore.dll"); + if (shcore) { + fn_setprocessdpiawareness = (SETPROCESSDPIAWARENESS_T)(void*) GetProcAddress(shcore, "SetProcessDpiAwareness"); + fn_getdpiformonitor = (GETDPIFORMONITOR_T)(void*) GetProcAddress(shcore, "GetDpiForMonitor"); + } + if (fn_setprocessdpiawareness) { + /* if the app didn't request HighDPI rendering, let Windows do the upscaling */ + PROCESS_DPI_AWARENESS process_dpi_awareness = PROCESS_SYSTEM_DPI_AWARE; + _sapp.win32.dpi.aware = true; + if (!_sapp.desc.high_dpi) { + process_dpi_awareness = PROCESS_DPI_UNAWARE; + _sapp.win32.dpi.aware = false; + } + fn_setprocessdpiawareness(process_dpi_awareness); + } + else if (fn_setprocessdpiaware) { + fn_setprocessdpiaware(); + _sapp.win32.dpi.aware = true; + } + /* get dpi scale factor for main monitor */ + if (fn_getdpiformonitor && _sapp.win32.dpi.aware) { + POINT pt = { 1, 1 }; + HMONITOR hm = MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST); + UINT dpix, dpiy; + HRESULT hr = fn_getdpiformonitor(hm, MDT_EFFECTIVE_DPI, &dpix, &dpiy); + _SOKOL_UNUSED(hr); + SOKOL_ASSERT(SUCCEEDED(hr)); + /* clamp window scale to an integer factor */ + _sapp.win32.dpi.window_scale = (float)dpix / 96.0f; + } + else { + _sapp.win32.dpi.window_scale = 1.0f; + } + if (_sapp.desc.high_dpi) { + _sapp.win32.dpi.content_scale = _sapp.win32.dpi.window_scale; + _sapp.win32.dpi.mouse_scale = 1.0f; + } + else { + _sapp.win32.dpi.content_scale = 1.0f; + _sapp.win32.dpi.mouse_scale = 1.0f / _sapp.win32.dpi.window_scale; + } + _sapp.dpi_scale = _sapp.win32.dpi.content_scale; + if (user32) { + FreeLibrary(user32); + } + if (shcore) { + FreeLibrary(shcore); + } +} + +_SOKOL_PRIVATE bool _sapp_win32_set_clipboard_string(const char* str) { + SOKOL_ASSERT(str); + SOKOL_ASSERT(_sapp.win32.hwnd); + SOKOL_ASSERT(_sapp.clipboard.enabled && (_sapp.clipboard.buf_size > 0)); + + wchar_t* wchar_buf = 0; + const SIZE_T wchar_buf_size = (SIZE_T)_sapp.clipboard.buf_size * sizeof(wchar_t); + HANDLE object = GlobalAlloc(GMEM_MOVEABLE, wchar_buf_size); + if (!object) { + goto error; + } + wchar_buf = (wchar_t*) GlobalLock(object); + if (!wchar_buf) { + goto error; + } + if (!_sapp_win32_uwp_utf8_to_wide(str, wchar_buf, (int)wchar_buf_size)) { + goto error; + } + GlobalUnlock(wchar_buf); + wchar_buf = 0; + if (!OpenClipboard(_sapp.win32.hwnd)) { + goto error; + } + EmptyClipboard(); + SetClipboardData(CF_UNICODETEXT, object); + CloseClipboard(); + return true; + +error: + if (wchar_buf) { + GlobalUnlock(object); + } + if (object) { + GlobalFree(object); + } + return false; +} + +_SOKOL_PRIVATE const char* _sapp_win32_get_clipboard_string(void) { + SOKOL_ASSERT(_sapp.clipboard.enabled && _sapp.clipboard.buffer); + SOKOL_ASSERT(_sapp.win32.hwnd); + if (!OpenClipboard(_sapp.win32.hwnd)) { + /* silently ignore any errors and just return the current + content of the local clipboard buffer + */ + return _sapp.clipboard.buffer; + } + HANDLE object = GetClipboardData(CF_UNICODETEXT); + if (!object) { + CloseClipboard(); + return _sapp.clipboard.buffer; + } + const wchar_t* wchar_buf = (const wchar_t*) GlobalLock(object); + if (!wchar_buf) { + CloseClipboard(); + return _sapp.clipboard.buffer; + } + if (!_sapp_win32_wide_to_utf8(wchar_buf, _sapp.clipboard.buffer, _sapp.clipboard.buf_size)) { + SOKOL_LOG("sokol_app.h: clipboard string didn't fit into clipboard buffer\n"); + } + GlobalUnlock(object); + CloseClipboard(); + return _sapp.clipboard.buffer; +} + +_SOKOL_PRIVATE void _sapp_win32_update_window_title(void) { + _sapp_win32_uwp_utf8_to_wide(_sapp.window_title, _sapp.window_title_wide, sizeof(_sapp.window_title_wide)); + SetWindowTextW(_sapp.win32.hwnd, _sapp.window_title_wide); +} + +_SOKOL_PRIVATE HICON _sapp_win32_create_icon_from_image(const sapp_image_desc* desc) { + BITMAPV5HEADER bi; + memset(&bi, 0, sizeof(bi)); + bi.bV5Size = sizeof(bi); + bi.bV5Width = desc->width; + bi.bV5Height = -desc->height; // NOTE the '-' here to indicate that origin is top-left + bi.bV5Planes = 1; + bi.bV5BitCount = 32; + bi.bV5Compression = BI_BITFIELDS; + bi.bV5RedMask = 0x00FF0000; + bi.bV5GreenMask = 0x0000FF00; + bi.bV5BlueMask = 0x000000FF; + bi.bV5AlphaMask = 0xFF000000; + + uint8_t* target = 0; + const uint8_t* source = (const uint8_t*)desc->pixels.ptr; + + HDC dc = GetDC(NULL); + HBITMAP color = CreateDIBSection(dc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&target, NULL, (DWORD)0); + ReleaseDC(NULL, dc); + if (0 == color) { + return NULL; + } + SOKOL_ASSERT(target); + + HBITMAP mask = CreateBitmap(desc->width, desc->height, 1, 1, NULL); + if (0 == mask) { + DeleteObject(color); + return NULL; + } + + for (int i = 0; i < (desc->width*desc->height); i++) { + target[0] = source[2]; + target[1] = source[1]; + target[2] = source[0]; + target[3] = source[3]; + target += 4; + source += 4; + } + + ICONINFO icon_info; + memset(&icon_info, 0, sizeof(icon_info)); + icon_info.fIcon = true; + icon_info.xHotspot = 0; + icon_info.yHotspot = 0; + icon_info.hbmMask = mask; + icon_info.hbmColor = color; + HICON icon_handle = CreateIconIndirect(&icon_info); + DeleteObject(color); + DeleteObject(mask); + + return icon_handle; +} + +_SOKOL_PRIVATE void _sapp_win32_set_icon(const sapp_icon_desc* icon_desc, int num_images) { + SOKOL_ASSERT((num_images > 0) && (num_images <= SAPP_MAX_ICONIMAGES)); + + int big_img_index = _sapp_image_bestmatch(icon_desc->images, num_images, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)); + int sml_img_index = _sapp_image_bestmatch(icon_desc->images, num_images, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)); + HICON big_icon = _sapp_win32_create_icon_from_image(&icon_desc->images[big_img_index]); + HICON sml_icon = _sapp_win32_create_icon_from_image(&icon_desc->images[sml_img_index]); + + // if icon creation or lookup has failed for some reason, leave the currently set icon untouched + if (0 != big_icon) { + SendMessage(_sapp.win32.hwnd, WM_SETICON, ICON_BIG, (LPARAM) big_icon); + if (0 != _sapp.win32.big_icon) { + DestroyIcon(_sapp.win32.big_icon); + } + _sapp.win32.big_icon = big_icon; + } + if (0 != sml_icon) { + SendMessage(_sapp.win32.hwnd, WM_SETICON, ICON_SMALL, (LPARAM) sml_icon); + if (0 != _sapp.win32.small_icon) { + DestroyIcon(_sapp.win32.small_icon); + } + _sapp.win32.small_icon = sml_icon; + } +} + +/* don't laugh, but this seems to be the easiest and most robust + way to check if we're running on Win10 + + From: https://github.com/videolan/vlc/blob/232fb13b0d6110c4d1b683cde24cf9a7f2c5c2ea/modules/video_output/win32/d3d11_swapchain.c#L263 +*/ +_SOKOL_PRIVATE bool _sapp_win32_is_win10_or_greater(void) { + HMODULE h = GetModuleHandleW(L"kernel32.dll"); + if (NULL != h) { + return (NULL != GetProcAddress(h, "GetSystemCpuSetInformation")); + } + else { + return false; + } +} + +_SOKOL_PRIVATE void _sapp_win32_run(const sapp_desc* desc) { + _sapp_init_state(desc); + _sapp_win32_init_console(); + _sapp.win32.is_win10_or_greater = _sapp_win32_is_win10_or_greater(); + _sapp_win32_uwp_init_keytable(); + _sapp_win32_uwp_utf8_to_wide(_sapp.window_title, _sapp.window_title_wide, sizeof(_sapp.window_title_wide)); + _sapp_win32_init_dpi(); + _sapp_win32_create_window(); + sapp_set_icon(&desc->icon); + #if defined(SOKOL_D3D11) + _sapp_d3d11_create_device_and_swapchain(); + _sapp_d3d11_create_default_render_target(); + #endif + #if defined(SOKOL_GLCORE33) + _sapp_wgl_init(); + _sapp_wgl_load_extensions(); + _sapp_wgl_create_context(); + #endif + _sapp.valid = true; + + bool done = false; + while (!(done || _sapp.quit_ordered)) { + MSG msg; + while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) { + if (WM_QUIT == msg.message) { + done = true; + continue; + } + else { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + _sapp_frame(); + #if defined(SOKOL_D3D11) + _sapp_d3d11_present(); + if (IsIconic(_sapp.win32.hwnd)) { + Sleep((DWORD)(16 * _sapp.swap_interval)); + } + #endif + #if defined(SOKOL_GLCORE33) + _sapp_wgl_swap_buffers(); + #endif + /* check for window resized, this cannot happen in WM_SIZE as it explodes memory usage */ + if (_sapp_win32_update_dimensions()) { + #if defined(SOKOL_D3D11) + _sapp_d3d11_resize_default_render_target(); + #endif + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_RESIZED); + } + if (_sapp.quit_requested) { + PostMessage(_sapp.win32.hwnd, WM_CLOSE, 0, 0); + } + } + _sapp_call_cleanup(); + + #if defined(SOKOL_D3D11) + _sapp_d3d11_destroy_default_render_target(); + _sapp_d3d11_destroy_device_and_swapchain(); + #else + _sapp_wgl_destroy_context(); + _sapp_wgl_shutdown(); + #endif + _sapp_win32_destroy_window(); + _sapp_win32_destroy_icons(); + _sapp_win32_restore_console(); + _sapp_discard_state(); +} + +_SOKOL_PRIVATE char** _sapp_win32_command_line_to_utf8_argv(LPWSTR w_command_line, int* o_argc) { + int argc = 0; + char** argv = 0; + char* args; + + LPWSTR* w_argv = CommandLineToArgvW(w_command_line, &argc); + if (w_argv == NULL) { + _sapp_fail("Win32: failed to parse command line"); + } else { + size_t size = wcslen(w_command_line) * 4; + argv = (char**) SOKOL_CALLOC(1, ((size_t)argc + 1) * sizeof(char*) + size); + SOKOL_ASSERT(argv); + args = (char*) &argv[argc + 1]; + int n; + for (int i = 0; i < argc; ++i) { + n = WideCharToMultiByte(CP_UTF8, 0, w_argv[i], -1, args, (int)size, NULL, NULL); + if (n == 0) { + _sapp_fail("Win32: failed to convert all arguments to utf8"); + break; + } + argv[i] = args; + size -= (size_t)n; + args += n; + } + LocalFree(w_argv); + } + *o_argc = argc; + return argv; +} + +#if !defined(SOKOL_NO_ENTRY) +#if defined(SOKOL_WIN32_FORCE_MAIN) +int main(int argc, char* argv[]) { + sapp_desc desc = sokol_main(argc, argv); + _sapp_win32_run(&desc); + return 0; +} +#else +int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow) { + _SOKOL_UNUSED(hInstance); + _SOKOL_UNUSED(hPrevInstance); + _SOKOL_UNUSED(lpCmdLine); + _SOKOL_UNUSED(nCmdShow); + int argc_utf8 = 0; + char** argv_utf8 = _sapp_win32_command_line_to_utf8_argv(GetCommandLineW(), &argc_utf8); + sapp_desc desc = sokol_main(argc_utf8, argv_utf8); + _sapp_win32_run(&desc); + SOKOL_FREE(argv_utf8); + return 0; +} +#endif /* SOKOL_WIN32_FORCE_MAIN */ +#endif /* SOKOL_NO_ENTRY */ + +#ifdef _MSC_VER + #pragma warning(pop) +#endif + +#endif /* _SAPP_WIN32 */ + +/*== UWP ================================================================*/ +#if defined(_SAPP_UWP) + +// Helper functions +_SOKOL_PRIVATE void _sapp_uwp_configure_dpi(float monitor_dpi) { + _sapp.uwp.dpi.window_scale = monitor_dpi / 96.0f; + if (_sapp.desc.high_dpi) { + _sapp.uwp.dpi.content_scale = _sapp.uwp.dpi.window_scale; + _sapp.uwp.dpi.mouse_scale = 1.0f * _sapp.uwp.dpi.window_scale; + } + else { + _sapp.uwp.dpi.content_scale = 1.0f; + _sapp.uwp.dpi.mouse_scale = 1.0f; + } + _sapp.dpi_scale = _sapp.uwp.dpi.content_scale; +} + +_SOKOL_PRIVATE void _sapp_uwp_show_mouse(bool visible) { + using namespace winrt::Windows::UI::Core; + + /* NOTE: this function is only called when the mouse visibility actually changes */ + CoreWindow::GetForCurrentThread().PointerCursor(visible ? + CoreCursor(CoreCursorType::Arrow, 0) : + CoreCursor(nullptr)); +} + +_SOKOL_PRIVATE uint32_t _sapp_uwp_mods(winrt::Windows::UI::Core::CoreWindow const& sender_window) { + using namespace winrt::Windows::System; + using namespace winrt::Windows::UI::Core; + + uint32_t mods = 0; + if ((sender_window.GetKeyState(VirtualKey::Shift) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down) { + mods |= SAPP_MODIFIER_SHIFT; + } + if ((sender_window.GetKeyState(VirtualKey::Control) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down) { + mods |= SAPP_MODIFIER_CTRL; + } + if ((sender_window.GetKeyState(VirtualKey::Menu) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down) { + mods |= SAPP_MODIFIER_ALT; + } + if (((sender_window.GetKeyState(VirtualKey::LeftWindows) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down) || + ((sender_window.GetKeyState(VirtualKey::RightWindows) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down)) + { + mods |= SAPP_MODIFIER_SUPER; + } + if (0 != (_sapp.uwp.mouse_buttons & (1<= 32)) { + _sapp_init_event(SAPP_EVENTTYPE_CHAR); + _sapp.event.modifiers = _sapp_uwp_mods(sender_window); + _sapp.event.char_code = c; + _sapp.event.key_repeat = repeat; + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE void _sapp_uwp_toggle_fullscreen(void) { + auto appView = winrt::Windows::UI::ViewManagement::ApplicationView::GetForCurrentView(); + _sapp.fullscreen = appView.IsFullScreenMode(); + if (!_sapp.fullscreen) { + appView.TryEnterFullScreenMode(); + } + else { + appView.ExitFullScreenMode(); + } + _sapp.fullscreen = appView.IsFullScreenMode(); +} + +namespace {/* Empty namespace to ensure internal linkage (same as _SOKOL_PRIVATE) */ + +// Controls all the DirectX device resources. +class DeviceResources { +public: + // Provides an interface for an application that owns DeviceResources to be notified of the device being lost or created. + interface IDeviceNotify { + virtual void OnDeviceLost() = 0; + virtual void OnDeviceRestored() = 0; + }; + + DeviceResources(); + ~DeviceResources(); + void SetWindow(winrt::Windows::UI::Core::CoreWindow const& window); + void SetLogicalSize(winrt::Windows::Foundation::Size logicalSize); + void SetCurrentOrientation(winrt::Windows::Graphics::Display::DisplayOrientations currentOrientation); + void SetDpi(float dpi); + void ValidateDevice(); + void HandleDeviceLost(); + void RegisterDeviceNotify(IDeviceNotify* deviceNotify); + void Trim(); + void Present(); + +private: + + // Swapchain Rotation Matrices (Z-rotation) + static inline const DirectX::XMFLOAT4X4 DeviceResources::m_rotation0 = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + static inline const DirectX::XMFLOAT4X4 DeviceResources::m_rotation90 = { + 0.0f, 1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + static inline const DirectX::XMFLOAT4X4 DeviceResources::m_rotation180 = { + -1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, -1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + static inline const DirectX::XMFLOAT4X4 DeviceResources::m_rotation270 = { + 0.0f, -1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + + void CreateDeviceResources(); + void CreateWindowSizeDependentResources(); + void UpdateRenderTargetSize(); + DXGI_MODE_ROTATION ComputeDisplayRotation(); + bool SdkLayersAvailable(); + + // Direct3D objects. + winrt::com_ptr m_d3dDevice; + winrt::com_ptr m_d3dContext; + winrt::com_ptr m_swapChain; + + // Direct3D rendering objects. Required for 3D. + winrt::com_ptr m_d3dRenderTarget; + winrt::com_ptr m_d3dRenderTargetView; + winrt::com_ptr m_d3dMSAARenderTarget; + winrt::com_ptr m_d3dMSAARenderTargetView; + winrt::com_ptr m_d3dDepthStencil; + winrt::com_ptr m_d3dDepthStencilView; + D3D11_VIEWPORT m_screenViewport = { }; + + // Cached reference to the Window. + winrt::agile_ref< winrt::Windows::UI::Core::CoreWindow> m_window; + + // Cached device properties. + D3D_FEATURE_LEVEL m_d3dFeatureLevel = D3D_FEATURE_LEVEL_9_1; + winrt::Windows::Foundation::Size m_d3dRenderTargetSize = { }; + winrt::Windows::Foundation::Size m_outputSize = { }; + winrt::Windows::Foundation::Size m_logicalSize = { }; + winrt::Windows::Graphics::Display::DisplayOrientations m_nativeOrientation = winrt::Windows::Graphics::Display::DisplayOrientations::None; + winrt::Windows::Graphics::Display::DisplayOrientations m_currentOrientation = winrt::Windows::Graphics::Display::DisplayOrientations::None; + float m_dpi = -1.0f; + + // Transforms used for display orientation. + DirectX::XMFLOAT4X4 m_orientationTransform3D; + + // The IDeviceNotify can be held directly as it owns the DeviceResources. + IDeviceNotify* m_deviceNotify = nullptr; +}; + +// Main entry point for our app. Connects the app with the Windows shell and handles application lifecycle events. +struct App : winrt::implements { +public: + // IFrameworkViewSource Methods + winrt::Windows::ApplicationModel::Core::IFrameworkView CreateView() { return *this; } + + // IFrameworkView Methods. + virtual void Initialize(winrt::Windows::ApplicationModel::Core::CoreApplicationView const& applicationView); + virtual void SetWindow(winrt::Windows::UI::Core::CoreWindow const& window); + virtual void Load(winrt::hstring const& entryPoint); + virtual void Run(); + virtual void Uninitialize(); + +protected: + // Application lifecycle event handlers + void OnActivated(winrt::Windows::ApplicationModel::Core::CoreApplicationView const& applicationView, winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs const& args); + void OnSuspending(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::ApplicationModel::SuspendingEventArgs const& args); + void OnResuming(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::Foundation::IInspectable const& args); + + // Window event handlers + void OnWindowSizeChanged(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::WindowSizeChangedEventArgs const& args); + void OnVisibilityChanged(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::VisibilityChangedEventArgs const& args); + + // Navigation event handlers + void OnBackRequested(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Core::BackRequestedEventArgs const& args); + + // Input event handlers + void OnKeyDown(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::KeyEventArgs const& args); + void OnKeyUp(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::KeyEventArgs const& args); + void OnCharacterReceived(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::CharacterReceivedEventArgs const& args); + + // Pointer event handlers + void OnPointerEntered(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args); + void OnPointerExited(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args); + void OnPointerPressed(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args); + void OnPointerReleased(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args); + void OnPointerMoved(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args); + void OnPointerWheelChanged(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args); + + // DisplayInformation event handlers. + void OnDpiChanged(winrt::Windows::Graphics::Display::DisplayInformation const& sender, winrt::Windows::Foundation::IInspectable const& args); + void OnOrientationChanged(winrt::Windows::Graphics::Display::DisplayInformation const& sender, winrt::Windows::Foundation::IInspectable const& args); + void OnDisplayContentsInvalidated(winrt::Windows::Graphics::Display::DisplayInformation const& sender, winrt::Windows::Foundation::IInspectable const& args); + +private: + std::unique_ptr m_deviceResources; + bool m_windowVisible = true; +}; + +DeviceResources::DeviceResources() { + CreateDeviceResources(); +} + +DeviceResources::~DeviceResources() { + // Cleanup Sokol Context + _sapp.d3d11.device = nullptr; + _sapp.d3d11.device_context = nullptr; +} + +void DeviceResources::CreateDeviceResources() { + // This flag adds support for surfaces with a different color channel ordering + // than the API default. It is required for compatibility with Direct2D. + UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; + + #if defined(_DEBUG) + if (SdkLayersAvailable()) { + // If the project is in a debug build, enable debugging via SDK Layers with this flag. + creationFlags |= D3D11_CREATE_DEVICE_DEBUG; + } + #endif + + // This array defines the set of DirectX hardware feature levels this app will support. + // Note the ordering should be preserved. + // Don't forget to declare your application's minimum required feature level in its + // description. All applications are assumed to support 9.1 unless otherwise stated. + D3D_FEATURE_LEVEL featureLevels[] = { + D3D_FEATURE_LEVEL_12_1, + D3D_FEATURE_LEVEL_12_0, + D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + D3D_FEATURE_LEVEL_9_3, + D3D_FEATURE_LEVEL_9_2, + D3D_FEATURE_LEVEL_9_1 + }; + + // Create the Direct3D 11 API device object and a corresponding context. + winrt::com_ptr device; + winrt::com_ptr context; + + HRESULT hr = D3D11CreateDevice( + nullptr, // Specify nullptr to use the default adapter. + D3D_DRIVER_TYPE_HARDWARE, // Create a device using the hardware graphics driver. + 0, // Should be 0 unless the driver is D3D_DRIVER_TYPE_SOFTWARE. + creationFlags, // Set debug and Direct2D compatibility flags. + featureLevels, // List of feature levels this app can support. + ARRAYSIZE(featureLevels), // Size of the list above. + D3D11_SDK_VERSION, // Always set this to D3D11_SDK_VERSION for Microsoft Store apps. + device.put(), // Returns the Direct3D device created. + &m_d3dFeatureLevel, // Returns feature level of device created. + context.put() // Returns the device immediate context. + ); + + if (FAILED(hr)) { + // If the initialization fails, fall back to the WARP device. + // For more information on WARP, see: + // https://go.microsoft.com/fwlink/?LinkId=286690 + winrt::check_hresult( + D3D11CreateDevice( + nullptr, + D3D_DRIVER_TYPE_WARP, // Create a WARP device instead of a hardware device. + 0, + creationFlags, + featureLevels, + ARRAYSIZE(featureLevels), + D3D11_SDK_VERSION, + device.put(), + &m_d3dFeatureLevel, + context.put() + ) + ); + } + + // Store pointers to the Direct3D 11.3 API device and immediate context. + m_d3dDevice = device.as(); + m_d3dContext = context.as(); + + // Setup Sokol Context + _sapp.d3d11.device = m_d3dDevice.get(); + _sapp.d3d11.device_context = m_d3dContext.get(); +} + +void DeviceResources::CreateWindowSizeDependentResources() { + // Cleanup Sokol Context (these are non-owning raw pointers) + _sapp.d3d11.rt = nullptr; + _sapp.d3d11.rtv = nullptr; + _sapp.d3d11.msaa_rt = nullptr; + _sapp.d3d11.msaa_rtv = nullptr; + _sapp.d3d11.ds = nullptr; + _sapp.d3d11.dsv = nullptr; + + // Clear the previous window size specific context. + ID3D11RenderTargetView* nullViews[] = { nullptr }; + m_d3dContext->OMSetRenderTargets(ARRAYSIZE(nullViews), nullViews, nullptr); + // these are smart pointers, setting to nullptr will delete the objects + m_d3dRenderTarget = nullptr; + m_d3dRenderTargetView = nullptr; + m_d3dMSAARenderTarget = nullptr; + m_d3dMSAARenderTargetView = nullptr; + m_d3dDepthStencilView = nullptr; + m_d3dDepthStencil = nullptr; + m_d3dContext->Flush1(D3D11_CONTEXT_TYPE_ALL, nullptr); + + UpdateRenderTargetSize(); + + // The width and height of the swap chain must be based on the window's + // natively-oriented width and height. If the window is not in the native + // orientation, the dimensions must be reversed. + DXGI_MODE_ROTATION displayRotation = ComputeDisplayRotation(); + + bool swapDimensions = displayRotation == DXGI_MODE_ROTATION_ROTATE90 || displayRotation == DXGI_MODE_ROTATION_ROTATE270; + m_d3dRenderTargetSize.Width = swapDimensions ? m_outputSize.Height : m_outputSize.Width; + m_d3dRenderTargetSize.Height = swapDimensions ? m_outputSize.Width : m_outputSize.Height; + + if (m_swapChain != nullptr) { + // If the swap chain already exists, resize it. + HRESULT hr = m_swapChain->ResizeBuffers( + 2, // Double-buffered swap chain. + lround(m_d3dRenderTargetSize.Width), + lround(m_d3dRenderTargetSize.Height), + DXGI_FORMAT_B8G8R8A8_UNORM, + 0 + ); + + if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET) { + // If the device was removed for any reason, a new device and swap chain will need to be created. + HandleDeviceLost(); + + // Everything is set up now. Do not continue execution of this method. HandleDeviceLost will reenter this method + // and correctly set up the new device. + return; + } + else { + winrt::check_hresult(hr); + } + } + else { + // Otherwise, create a new one using the same adapter as the existing Direct3D device. + DXGI_SCALING scaling = (_sapp.uwp.dpi.content_scale == _sapp.uwp.dpi.window_scale) ? DXGI_SCALING_NONE : DXGI_SCALING_STRETCH; + DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 }; + + swapChainDesc.Width = lround(m_d3dRenderTargetSize.Width); // Match the size of the window. + swapChainDesc.Height = lround(m_d3dRenderTargetSize.Height); + swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain format. + swapChainDesc.Stereo = false; + swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling. + swapChainDesc.SampleDesc.Quality = 0; + swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapChainDesc.BufferCount = 2; // Use double-buffering to minimize latency. + swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Microsoft Store apps must use this SwapEffect. + swapChainDesc.Flags = 0; + swapChainDesc.Scaling = scaling; + swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE; + + // This sequence obtains the DXGI factory that was used to create the Direct3D device above. + winrt::com_ptr dxgiDevice = m_d3dDevice.as(); + winrt::com_ptr dxgiAdapter; + winrt::check_hresult(dxgiDevice->GetAdapter(dxgiAdapter.put())); + winrt::com_ptr dxgiFactory; + winrt::check_hresult(dxgiAdapter->GetParent(__uuidof(IDXGIFactory4), dxgiFactory.put_void())); + winrt::com_ptr swapChain; + winrt::check_hresult(dxgiFactory->CreateSwapChainForCoreWindow(m_d3dDevice.get(), m_window.get().as<::IUnknown>().get(), &swapChainDesc, nullptr, swapChain.put())); + m_swapChain = swapChain.as(); + + // Ensure that DXGI does not queue more than one frame at a time. This both reduces latency and + // ensures that the application will only render after each VSync, minimizing power consumption. + winrt::check_hresult(dxgiDevice->SetMaximumFrameLatency(1)); + + // Setup Sokol Context + winrt::check_hresult(swapChain->GetDesc(&_sapp.d3d11.swap_chain_desc)); + _sapp.d3d11.swap_chain = m_swapChain.as().detach(); + } + + // Set the proper orientation for the swap chain, and generate 2D and + // 3D matrix transformations for rendering to the rotated swap chain. + // Note the rotation angle for the 2D and 3D transforms are different. + // This is due to the difference in coordinate spaces. Additionally, + // the 3D matrix is specified explicitly to avoid rounding errors. + switch (displayRotation) { + case DXGI_MODE_ROTATION_IDENTITY: + m_orientationTransform3D = m_rotation0; + break; + + case DXGI_MODE_ROTATION_ROTATE90: + m_orientationTransform3D = m_rotation270; + break; + + case DXGI_MODE_ROTATION_ROTATE180: + m_orientationTransform3D = m_rotation180; + break; + + case DXGI_MODE_ROTATION_ROTATE270: + m_orientationTransform3D = m_rotation90; + break; + } + winrt::check_hresult(m_swapChain->SetRotation(displayRotation)); + + // Create a render target view of the swap chain back buffer. + winrt::check_hresult(m_swapChain->GetBuffer(0, IID_PPV_ARGS(&m_d3dRenderTarget))); + winrt::check_hresult(m_d3dDevice->CreateRenderTargetView1(m_d3dRenderTarget.get(), nullptr, m_d3dRenderTargetView.put())); + + // Create MSAA texture and view if needed + if (_sapp.sample_count > 1) { + CD3D11_TEXTURE2D_DESC1 msaaTexDesc( + DXGI_FORMAT_B8G8R8A8_UNORM, + lround(m_d3dRenderTargetSize.Width), + lround(m_d3dRenderTargetSize.Height), + 1, // arraySize + 1, // mipLevels + D3D11_BIND_RENDER_TARGET, + D3D11_USAGE_DEFAULT, + 0, // cpuAccessFlags + _sapp.sample_count, + _sapp.sample_count > 1 ? D3D11_STANDARD_MULTISAMPLE_PATTERN : 0 + ); + winrt::check_hresult(m_d3dDevice->CreateTexture2D1(&msaaTexDesc, nullptr, m_d3dMSAARenderTarget.put())); + winrt::check_hresult(m_d3dDevice->CreateRenderTargetView1(m_d3dMSAARenderTarget.get(), nullptr, m_d3dMSAARenderTargetView.put())); + } + + // Create a depth stencil view for use with 3D rendering if needed. + CD3D11_TEXTURE2D_DESC1 depthStencilDesc( + DXGI_FORMAT_D24_UNORM_S8_UINT, + lround(m_d3dRenderTargetSize.Width), + lround(m_d3dRenderTargetSize.Height), + 1, // This depth stencil view has only one texture. + 1, // Use a single mipmap level. + D3D11_BIND_DEPTH_STENCIL, + D3D11_USAGE_DEFAULT, + 0, // cpuAccessFlag + _sapp.sample_count, + _sapp.sample_count > 1 ? D3D11_STANDARD_MULTISAMPLE_PATTERN : 0 + ); + winrt::check_hresult(m_d3dDevice->CreateTexture2D1(&depthStencilDesc, nullptr, m_d3dDepthStencil.put())); + + CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2D); + winrt::check_hresult(m_d3dDevice->CreateDepthStencilView(m_d3dDepthStencil.get(), nullptr, m_d3dDepthStencilView.put())); + + // Set sokol window and framebuffer sizes + _sapp.window_width = (int) m_logicalSize.Width; + _sapp.window_height = (int) m_logicalSize.Height; + _sapp.framebuffer_width = lround(m_d3dRenderTargetSize.Width); + _sapp.framebuffer_height = lround(m_d3dRenderTargetSize.Height); + + // Setup Sokol Context + _sapp.d3d11.rt = m_d3dRenderTarget.as().get(); + _sapp.d3d11.rtv = m_d3dRenderTargetView.as().get(); + _sapp.d3d11.ds = m_d3dDepthStencil.as().get(); + _sapp.d3d11.dsv = m_d3dDepthStencilView.get(); + if (_sapp.sample_count > 1) { + _sapp.d3d11.msaa_rt = m_d3dMSAARenderTarget.as().get(); + _sapp.d3d11.msaa_rtv = m_d3dMSAARenderTargetView.as().get(); + } + + // Sokol app is now valid + _sapp.valid = true; +} + +// Determine the dimensions of the render target and whether it will be scaled down. +void DeviceResources::UpdateRenderTargetSize() { + // Calculate the necessary render target size in pixels. + m_outputSize.Width = m_logicalSize.Width * _sapp.uwp.dpi.content_scale; + m_outputSize.Height = m_logicalSize.Height * _sapp.uwp.dpi.content_scale; + + // Prevent zero size DirectX content from being created. + m_outputSize.Width = std::max(m_outputSize.Width, 1.0f); + m_outputSize.Height = std::max(m_outputSize.Height, 1.0f); +} + +// This method is called when the CoreWindow is created (or re-created). +void DeviceResources::SetWindow(winrt::Windows::UI::Core::CoreWindow const& window) { + auto currentDisplayInformation = winrt::Windows::Graphics::Display::DisplayInformation::GetForCurrentView(); + m_window = window; + m_logicalSize = winrt::Windows::Foundation::Size(window.Bounds().Width, window.Bounds().Height); + m_nativeOrientation = currentDisplayInformation.NativeOrientation(); + m_currentOrientation = currentDisplayInformation.CurrentOrientation(); + m_dpi = currentDisplayInformation.LogicalDpi(); + _sapp_uwp_configure_dpi(m_dpi); + CreateWindowSizeDependentResources(); +} + +// This method is called in the event handler for the SizeChanged event. +void DeviceResources::SetLogicalSize(winrt::Windows::Foundation::Size logicalSize) { + if (m_logicalSize != logicalSize) { + m_logicalSize = logicalSize; + CreateWindowSizeDependentResources(); + } +} + +// This method is called in the event handler for the DpiChanged event. +void DeviceResources::SetDpi(float dpi) { + if (dpi != m_dpi) { + m_dpi = dpi; + _sapp_uwp_configure_dpi(m_dpi); + // When the display DPI changes, the logical size of the window (measured in Dips) also changes and needs to be updated. + auto window = m_window.get(); + m_logicalSize = winrt::Windows::Foundation::Size(window.Bounds().Width, window.Bounds().Height); + CreateWindowSizeDependentResources(); + } +} + +// This method is called in the event handler for the OrientationChanged event. +void DeviceResources::SetCurrentOrientation(winrt::Windows::Graphics::Display::DisplayOrientations currentOrientation) { + if (m_currentOrientation != currentOrientation) { + m_currentOrientation = currentOrientation; + CreateWindowSizeDependentResources(); + } +} + +// This method is called in the event handler for the DisplayContentsInvalidated event. +void DeviceResources::ValidateDevice() { + // The D3D Device is no longer valid if the default adapter changed since the device + // was created or if the device has been removed. + + // First, get the information for the default adapter from when the device was created. + winrt::com_ptr dxgiDevice = m_d3dDevice.as< IDXGIDevice3>(); + winrt::com_ptr deviceAdapter; + winrt::check_hresult(dxgiDevice->GetAdapter(deviceAdapter.put())); + winrt::com_ptr deviceFactory; + winrt::check_hresult(deviceAdapter->GetParent(IID_PPV_ARGS(&deviceFactory))); + winrt::com_ptr previousDefaultAdapter; + winrt::check_hresult(deviceFactory->EnumAdapters1(0, previousDefaultAdapter.put())); + DXGI_ADAPTER_DESC1 previousDesc; + winrt::check_hresult(previousDefaultAdapter->GetDesc1(&previousDesc)); + + // Next, get the information for the current default adapter. + winrt::com_ptr currentFactory; + winrt::check_hresult(CreateDXGIFactory1(IID_PPV_ARGS(¤tFactory))); + winrt::com_ptr currentDefaultAdapter; + winrt::check_hresult(currentFactory->EnumAdapters1(0, currentDefaultAdapter.put())); + DXGI_ADAPTER_DESC1 currentDesc; + winrt::check_hresult(currentDefaultAdapter->GetDesc1(¤tDesc)); + + // If the adapter LUIDs don't match, or if the device reports that it has been removed, + // a new D3D device must be created. + if (previousDesc.AdapterLuid.LowPart != currentDesc.AdapterLuid.LowPart || + previousDesc.AdapterLuid.HighPart != currentDesc.AdapterLuid.HighPart || + FAILED(m_d3dDevice->GetDeviceRemovedReason())) + { + // Release references to resources related to the old device. + dxgiDevice = nullptr; + deviceAdapter = nullptr; + deviceFactory = nullptr; + previousDefaultAdapter = nullptr; + + // Create a new device and swap chain. + HandleDeviceLost(); + } +} + +// Recreate all device resources and set them back to the current state. +void DeviceResources::HandleDeviceLost() { + m_swapChain = nullptr; + if (m_deviceNotify != nullptr) { + m_deviceNotify->OnDeviceLost(); + } + CreateDeviceResources(); + CreateWindowSizeDependentResources(); + if (m_deviceNotify != nullptr) { + m_deviceNotify->OnDeviceRestored(); + } +} + +// Register our DeviceNotify to be informed on device lost and creation. +void DeviceResources::RegisterDeviceNotify(IDeviceNotify* deviceNotify) { + m_deviceNotify = deviceNotify; +} + +// Call this method when the app suspends. It provides a hint to the driver that the app +// is entering an idle state and that temporary buffers can be reclaimed for use by other apps. +void DeviceResources::Trim() { + m_d3dDevice.as()->Trim(); +} + +// Present the contents of the swap chain to the screen. +void DeviceResources::Present() { + + // MSAA resolve if needed + if (_sapp.sample_count > 1) { + m_d3dContext->ResolveSubresource(m_d3dRenderTarget.get(), 0, m_d3dMSAARenderTarget.get(), 0, DXGI_FORMAT_B8G8R8A8_UNORM); + m_d3dContext->DiscardView1(m_d3dMSAARenderTargetView.get(), nullptr, 0); + } + + // The first argument instructs DXGI to block until VSync, putting the application + // to sleep until the next VSync. This ensures we don't waste any cycles rendering + // frames that will never be displayed to the screen. + DXGI_PRESENT_PARAMETERS parameters = { 0 }; + HRESULT hr = m_swapChain->Present1(1, 0, ¶meters); + + // Discard the contents of the render target. + // This is a valid operation only when the existing contents will be entirely + // overwritten. If dirty or scroll rects are used, this call should be removed. + m_d3dContext->DiscardView1(m_d3dRenderTargetView.get(), nullptr, 0); + + // Discard the contents of the depth stencil. + m_d3dContext->DiscardView1(m_d3dDepthStencilView.get(), nullptr, 0); + + // If the device was removed either by a disconnection or a driver upgrade, we + // must recreate all device resources. + if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET) { + HandleDeviceLost(); + } + else { + winrt::check_hresult(hr); + } +} + +// This method determines the rotation between the display device's native orientation and the +// current display orientation. +DXGI_MODE_ROTATION DeviceResources::ComputeDisplayRotation() { + DXGI_MODE_ROTATION rotation = DXGI_MODE_ROTATION_UNSPECIFIED; + + // Note: NativeOrientation can only be Landscape or Portrait even though + // the DisplayOrientations enum has other values. + switch (m_nativeOrientation) { + case winrt::Windows::Graphics::Display::DisplayOrientations::Landscape: + switch (m_currentOrientation) { + case winrt::Windows::Graphics::Display::DisplayOrientations::Landscape: + rotation = DXGI_MODE_ROTATION_IDENTITY; + break; + + case winrt::Windows::Graphics::Display::DisplayOrientations::Portrait: + rotation = DXGI_MODE_ROTATION_ROTATE270; + break; + + case winrt::Windows::Graphics::Display::DisplayOrientations::LandscapeFlipped: + rotation = DXGI_MODE_ROTATION_ROTATE180; + break; + + case winrt::Windows::Graphics::Display::DisplayOrientations::PortraitFlipped: + rotation = DXGI_MODE_ROTATION_ROTATE90; + break; + } + break; + + case winrt::Windows::Graphics::Display::DisplayOrientations::Portrait: + switch (m_currentOrientation) { + case winrt::Windows::Graphics::Display::DisplayOrientations::Landscape: + rotation = DXGI_MODE_ROTATION_ROTATE90; + break; + + case winrt::Windows::Graphics::Display::DisplayOrientations::Portrait: + rotation = DXGI_MODE_ROTATION_IDENTITY; + break; + + case winrt::Windows::Graphics::Display::DisplayOrientations::LandscapeFlipped: + rotation = DXGI_MODE_ROTATION_ROTATE270; + break; + + case winrt::Windows::Graphics::Display::DisplayOrientations::PortraitFlipped: + rotation = DXGI_MODE_ROTATION_ROTATE180; + break; + } + break; + } + return rotation; +} + +// Check for SDK Layer support. +bool DeviceResources::SdkLayersAvailable() { + #if defined(_DEBUG) + HRESULT hr = D3D11CreateDevice( + nullptr, + D3D_DRIVER_TYPE_NULL, // There is no need to create a real hardware device. + 0, + D3D11_CREATE_DEVICE_DEBUG, // Check for the SDK layers. + nullptr, // Any feature level will do. + 0, + D3D11_SDK_VERSION, // Always set this to D3D11_SDK_VERSION for Microsoft Store apps. + nullptr, // No need to keep the D3D device reference. + nullptr, // No need to know the feature level. + nullptr // No need to keep the D3D device context reference. + ); + return SUCCEEDED(hr); + #else + return false; + #endif +} + +// The first method called when the IFrameworkView is being created. +void App::Initialize(winrt::Windows::ApplicationModel::Core::CoreApplicationView const& applicationView) { + // Register event handlers for app lifecycle. This example includes Activated, so that we + // can make the CoreWindow active and start rendering on the window. + applicationView.Activated({ this, &App::OnActivated }); + + winrt::Windows::ApplicationModel::Core::CoreApplication::Suspending({ this, &App::OnSuspending }); + winrt::Windows::ApplicationModel::Core::CoreApplication::Resuming({ this, &App::OnResuming }); + + // At this point we have access to the device. + // We can create the device-dependent resources. + m_deviceResources = std::make_unique(); +} + +// Called when the CoreWindow object is created (or re-created). +void App::SetWindow(winrt::Windows::UI::Core::CoreWindow const& window) { + window.SizeChanged({ this, &App::OnWindowSizeChanged }); + window.VisibilityChanged({ this, &App::OnVisibilityChanged }); + + window.KeyDown({ this, &App::OnKeyDown }); + window.KeyUp({ this, &App::OnKeyUp }); + window.CharacterReceived({ this, &App::OnCharacterReceived }); + + window.PointerEntered({ this, &App::OnPointerEntered }); + window.PointerExited({ this, &App::OnPointerExited }); + window.PointerPressed({ this, &App::OnPointerPressed }); + window.PointerReleased({ this, &App::OnPointerReleased }); + window.PointerMoved({ this, &App::OnPointerMoved }); + window.PointerWheelChanged({ this, &App::OnPointerWheelChanged }); + + auto currentDisplayInformation = winrt::Windows::Graphics::Display::DisplayInformation::GetForCurrentView(); + + currentDisplayInformation.DpiChanged({ this, &App::OnDpiChanged }); + currentDisplayInformation.OrientationChanged({ this, &App::OnOrientationChanged }); + winrt::Windows::Graphics::Display::DisplayInformation::DisplayContentsInvalidated({ this, &App::OnDisplayContentsInvalidated }); + + winrt::Windows::UI::Core::SystemNavigationManager::GetForCurrentView().BackRequested({ this, &App::OnBackRequested }); + + m_deviceResources->SetWindow(window); +} + +// Initializes scene resources, or loads a previously saved app state. +void App::Load(winrt::hstring const& entryPoint) { + _SOKOL_UNUSED(entryPoint); +} + +// This method is called after the window becomes active. +void App::Run() { + // NOTE: UWP will simply terminate an application, it's not possible to detect when an application is being closed + while (true) { + if (m_windowVisible) { + winrt::Windows::UI::Core::CoreWindow::GetForCurrentThread().Dispatcher().ProcessEvents(winrt::Windows::UI::Core::CoreProcessEventsOption::ProcessAllIfPresent); + _sapp_frame(); + m_deviceResources->Present(); + } + else { + winrt::Windows::UI::Core::CoreWindow::GetForCurrentThread().Dispatcher().ProcessEvents(winrt::Windows::UI::Core::CoreProcessEventsOption::ProcessOneAndAllPending); + } + } +} + +// Required for IFrameworkView. +// Terminate events do not cause Uninitialize to be called. It will be called if your IFrameworkView +// class is torn down while the app is in the foreground. +void App::Uninitialize() { + // empty +} + +// Application lifecycle event handlers. +void App::OnActivated(winrt::Windows::ApplicationModel::Core::CoreApplicationView const& applicationView, winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs const& args) { + _SOKOL_UNUSED(args); + _SOKOL_UNUSED(applicationView); + auto appView = winrt::Windows::UI::ViewManagement::ApplicationView::GetForCurrentView(); + auto targetSize = winrt::Windows::Foundation::Size((float)_sapp.desc.width, (float)_sapp.desc.height); + appView.SetPreferredMinSize(targetSize); + appView.TryResizeView(targetSize); + + // Disabling this since it can only append the title to the app name (Title - Appname). + // There's no way of just setting a string to be the window title. + //appView.Title(_sapp.window_title_wide); + + // Run() won't start until the CoreWindow is activated. + winrt::Windows::UI::Core::CoreWindow::GetForCurrentThread().Activate(); + if (_sapp.desc.fullscreen) { + appView.TryEnterFullScreenMode(); + } + _sapp.fullscreen = appView.IsFullScreenMode(); +} + +void App::OnSuspending(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::ApplicationModel::SuspendingEventArgs const& args) { + _SOKOL_UNUSED(sender); + _SOKOL_UNUSED(args); + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_SUSPENDED); +} + +void App::OnResuming(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::Foundation::IInspectable const& args) { + _SOKOL_UNUSED(args); + _SOKOL_UNUSED(sender); + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_RESUMED); +} + +void App::OnWindowSizeChanged(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::WindowSizeChangedEventArgs const& args) { + _SOKOL_UNUSED(args); + m_deviceResources->SetLogicalSize(winrt::Windows::Foundation::Size(sender.Bounds().Width, sender.Bounds().Height)); + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_RESIZED); +} + +void App::OnVisibilityChanged(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::VisibilityChangedEventArgs const& args) { + _SOKOL_UNUSED(sender); + m_windowVisible = args.Visible(); + _sapp_win32_uwp_app_event(m_windowVisible ? SAPP_EVENTTYPE_RESTORED : SAPP_EVENTTYPE_ICONIFIED); +} + +void App::OnBackRequested(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Core::BackRequestedEventArgs const& args) { + _SOKOL_UNUSED(sender); + args.Handled(true); +} + +void App::OnKeyDown(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::KeyEventArgs const& args) { + auto status = args.KeyStatus(); + _sapp_uwp_key_event(SAPP_EVENTTYPE_KEY_DOWN, sender, args); +} + +void App::OnKeyUp(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::KeyEventArgs const& args) { + auto status = args.KeyStatus(); + _sapp_uwp_key_event(SAPP_EVENTTYPE_KEY_UP, sender, args); +} + +void App::OnCharacterReceived(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::CharacterReceivedEventArgs const& args) { + _sapp_uwp_char_event(args.KeyCode(), args.KeyStatus().WasKeyDown, sender); +} + +void App::OnPointerEntered(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args) { + _SOKOL_UNUSED(args); + _sapp.uwp.mouse_tracked = true; + _sapp_uwp_mouse_event(SAPP_EVENTTYPE_MOUSE_ENTER, SAPP_MOUSEBUTTON_INVALID, sender); +} + +void App::OnPointerExited(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args) { + _SOKOL_UNUSED(args); + _sapp.uwp.mouse_tracked = false; + _sapp_uwp_mouse_event(SAPP_EVENTTYPE_MOUSE_LEAVE, SAPP_MOUSEBUTTON_INVALID, sender); +} + +void App::OnPointerPressed(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args) { + _sapp_uwp_extract_mouse_button_events(sender, args); +} + +// NOTE: for some reason this event handler is never called?? +void App::OnPointerReleased(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args) { + _sapp_uwp_extract_mouse_button_events(sender, args); +} + +void App::OnPointerMoved(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args) { + auto position = args.CurrentPoint().Position(); + const float new_x = (float)(int)(position.X * _sapp.uwp.dpi.mouse_scale + 0.5f); + const float new_y = (float)(int)(position.Y * _sapp.uwp.dpi.mouse_scale + 0.5f); + // don't update dx/dy in the very first event + if (_sapp.mouse.pos_valid) { + _sapp.mouse.dx = new_x - _sapp.mouse.x; + _sapp.mouse.dy = new_y - _sapp.mouse.y; + } + _sapp.mouse.x = new_x; + _sapp.mouse.y = new_y; + _sapp.mouse.pos_valid = true; + if (!_sapp.uwp.mouse_tracked) { + _sapp.uwp.mouse_tracked = true; + _sapp_uwp_mouse_event(SAPP_EVENTTYPE_MOUSE_ENTER, SAPP_MOUSEBUTTON_INVALID, sender); + } + _sapp_uwp_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, sender); + + // HACK for detecting multiple mouse button presses + _sapp_uwp_extract_mouse_button_events(sender, args); +} + +void App::OnPointerWheelChanged(winrt::Windows::UI::Core::CoreWindow const& sender, winrt::Windows::UI::Core::PointerEventArgs const& args) { + auto properties = args.CurrentPoint().Properties(); + _sapp_uwp_scroll_event((float)properties.MouseWheelDelta(), properties.IsHorizontalMouseWheel(), sender); +} + +void App::OnDpiChanged(winrt::Windows::Graphics::Display::DisplayInformation const& sender, winrt::Windows::Foundation::IInspectable const& args) { + // NOTE: UNTESTED + _SOKOL_UNUSED(args); + m_deviceResources->SetDpi(sender.LogicalDpi()); + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_RESIZED); +} + +void App::OnOrientationChanged(winrt::Windows::Graphics::Display::DisplayInformation const& sender, winrt::Windows::Foundation::IInspectable const& args) { + // NOTE: UNTESTED + _SOKOL_UNUSED(args); + m_deviceResources->SetCurrentOrientation(sender.CurrentOrientation()); + _sapp_win32_uwp_app_event(SAPP_EVENTTYPE_RESIZED); +} + +void App::OnDisplayContentsInvalidated(winrt::Windows::Graphics::Display::DisplayInformation const& sender, winrt::Windows::Foundation::IInspectable const& args) { + // NOTE: UNTESTED + _SOKOL_UNUSED(args); + _SOKOL_UNUSED(sender); + m_deviceResources->ValidateDevice(); +} + +} /* End empty namespace */ + +_SOKOL_PRIVATE void _sapp_uwp_run(const sapp_desc* desc) { + _sapp_init_state(desc); + _sapp_win32_uwp_init_keytable(); + _sapp_win32_uwp_utf8_to_wide(_sapp.window_title, _sapp.window_title_wide, sizeof(_sapp.window_title_wide)); + winrt::Windows::ApplicationModel::Core::CoreApplication::Run(winrt::make()); +} + +#if !defined(SOKOL_NO_ENTRY) +#if defined(UNICODE) +int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { +#else +int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow) { +#endif + _SOKOL_UNUSED(hInstance); + _SOKOL_UNUSED(hPrevInstance); + _SOKOL_UNUSED(lpCmdLine); + _SOKOL_UNUSED(nCmdShow); + sapp_desc desc = sokol_main(0, nullptr); + _sapp_uwp_run(&desc); + return 0; +} +#endif /* SOKOL_NO_ENTRY */ +#endif /* _SAPP_UWP */ + +/*== Android ================================================================*/ +#if defined(_SAPP_ANDROID) + +/* android loop thread */ +_SOKOL_PRIVATE bool _sapp_android_init_egl(void) { + SOKOL_ASSERT(_sapp.android.display == EGL_NO_DISPLAY); + SOKOL_ASSERT(_sapp.android.context == EGL_NO_CONTEXT); + + EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + if (display == EGL_NO_DISPLAY) { + return false; + } + if (eglInitialize(display, NULL, NULL) == EGL_FALSE) { + return false; + } + + EGLint alpha_size = _sapp.desc.alpha ? 8 : 0; + const EGLint cfg_attributes[] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, alpha_size, + EGL_DEPTH_SIZE, 16, + EGL_STENCIL_SIZE, 0, + EGL_NONE, + }; + EGLConfig available_cfgs[32]; + EGLint cfg_count; + eglChooseConfig(display, cfg_attributes, available_cfgs, 32, &cfg_count); + SOKOL_ASSERT(cfg_count > 0); + SOKOL_ASSERT(cfg_count <= 32); + + /* find config with 8-bit rgb buffer if available, ndk sample does not trust egl spec */ + EGLConfig config; + bool exact_cfg_found = false; + for (int i = 0; i < cfg_count; ++i) { + EGLConfig c = available_cfgs[i]; + EGLint r, g, b, a, d; + if (eglGetConfigAttrib(display, c, EGL_RED_SIZE, &r) == EGL_TRUE && + eglGetConfigAttrib(display, c, EGL_GREEN_SIZE, &g) == EGL_TRUE && + eglGetConfigAttrib(display, c, EGL_BLUE_SIZE, &b) == EGL_TRUE && + eglGetConfigAttrib(display, c, EGL_ALPHA_SIZE, &a) == EGL_TRUE && + eglGetConfigAttrib(display, c, EGL_DEPTH_SIZE, &d) == EGL_TRUE && + r == 8 && g == 8 && b == 8 && (alpha_size == 0 || a == alpha_size) && d == 16) { + exact_cfg_found = true; + config = c; + break; + } + } + if (!exact_cfg_found) { + config = available_cfgs[0]; + } + + EGLint ctx_attributes[] = { + #if defined(SOKOL_GLES3) + EGL_CONTEXT_CLIENT_VERSION, _sapp.desc.gl_force_gles2 ? 2 : 3, + #else + EGL_CONTEXT_CLIENT_VERSION, 2, + #endif + EGL_NONE, + }; + EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, ctx_attributes); + if (context == EGL_NO_CONTEXT) { + return false; + } + + _sapp.android.config = config; + _sapp.android.display = display; + _sapp.android.context = context; + return true; +} + +_SOKOL_PRIVATE void _sapp_android_cleanup_egl(void) { + if (_sapp.android.display != EGL_NO_DISPLAY) { + eglMakeCurrent(_sapp.android.display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (_sapp.android.surface != EGL_NO_SURFACE) { + SOKOL_LOG("Destroying egl surface"); + eglDestroySurface(_sapp.android.display, _sapp.android.surface); + _sapp.android.surface = EGL_NO_SURFACE; + } + if (_sapp.android.context != EGL_NO_CONTEXT) { + SOKOL_LOG("Destroying egl context"); + eglDestroyContext(_sapp.android.display, _sapp.android.context); + _sapp.android.context = EGL_NO_CONTEXT; + } + SOKOL_LOG("Terminating egl display"); + eglTerminate(_sapp.android.display); + _sapp.android.display = EGL_NO_DISPLAY; + } +} + +_SOKOL_PRIVATE bool _sapp_android_init_egl_surface(ANativeWindow* window) { + SOKOL_ASSERT(_sapp.android.display != EGL_NO_DISPLAY); + SOKOL_ASSERT(_sapp.android.context != EGL_NO_CONTEXT); + SOKOL_ASSERT(_sapp.android.surface == EGL_NO_SURFACE); + SOKOL_ASSERT(window); + + /* TODO: set window flags */ + /* ANativeActivity_setWindowFlags(activity, AWINDOW_FLAG_KEEP_SCREEN_ON, 0); */ + + /* create egl surface and make it current */ + EGLSurface surface = eglCreateWindowSurface(_sapp.android.display, _sapp.android.config, window, NULL); + if (surface == EGL_NO_SURFACE) { + return false; + } + if (eglMakeCurrent(_sapp.android.display, surface, surface, _sapp.android.context) == EGL_FALSE) { + return false; + } + _sapp.android.surface = surface; + return true; +} + +_SOKOL_PRIVATE void _sapp_android_cleanup_egl_surface(void) { + if (_sapp.android.display == EGL_NO_DISPLAY) { + return; + } + eglMakeCurrent(_sapp.android.display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (_sapp.android.surface != EGL_NO_SURFACE) { + eglDestroySurface(_sapp.android.display, _sapp.android.surface); + _sapp.android.surface = EGL_NO_SURFACE; + } +} + +_SOKOL_PRIVATE void _sapp_android_app_event(sapp_event_type type) { + if (_sapp_events_enabled()) { + _sapp_init_event(type); + SOKOL_LOG("event_cb()"); + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE void _sapp_android_update_dimensions(ANativeWindow* window, bool force_update) { + SOKOL_ASSERT(_sapp.android.display != EGL_NO_DISPLAY); + SOKOL_ASSERT(_sapp.android.context != EGL_NO_CONTEXT); + SOKOL_ASSERT(_sapp.android.surface != EGL_NO_SURFACE); + SOKOL_ASSERT(window); + + const int32_t win_w = ANativeWindow_getWidth(window); + const int32_t win_h = ANativeWindow_getHeight(window); + SOKOL_ASSERT(win_w >= 0 && win_h >= 0); + const bool win_changed = (win_w != _sapp.window_width) || (win_h != _sapp.window_height); + _sapp.window_width = win_w; + _sapp.window_height = win_h; + if (win_changed || force_update) { + if (!_sapp.desc.high_dpi) { + const int32_t buf_w = win_w / 2; + const int32_t buf_h = win_h / 2; + EGLint format; + EGLBoolean egl_result = eglGetConfigAttrib(_sapp.android.display, _sapp.android.config, EGL_NATIVE_VISUAL_ID, &format); + SOKOL_ASSERT(egl_result == EGL_TRUE); + /* NOTE: calling ANativeWindow_setBuffersGeometry() with the same dimensions + as the ANativeWindow size results in weird display artefacts, that's + why it's only called when the buffer geometry is different from + the window size + */ + int32_t result = ANativeWindow_setBuffersGeometry(window, buf_w, buf_h, format); + SOKOL_ASSERT(result == 0); + } + } + + /* query surface size */ + EGLint fb_w, fb_h; + EGLBoolean egl_result_w = eglQuerySurface(_sapp.android.display, _sapp.android.surface, EGL_WIDTH, &fb_w); + EGLBoolean egl_result_h = eglQuerySurface(_sapp.android.display, _sapp.android.surface, EGL_HEIGHT, &fb_h); + SOKOL_ASSERT(egl_result_w == EGL_TRUE); + SOKOL_ASSERT(egl_result_h == EGL_TRUE); + const bool fb_changed = (fb_w != _sapp.framebuffer_width) || (fb_h != _sapp.framebuffer_height); + _sapp.framebuffer_width = fb_w; + _sapp.framebuffer_height = fb_h; + _sapp.dpi_scale = (float)_sapp.framebuffer_width / (float)_sapp.window_width; + if (win_changed || fb_changed || force_update) { + if (!_sapp.first_frame) { + SOKOL_LOG("SAPP_EVENTTYPE_RESIZED"); + _sapp_android_app_event(SAPP_EVENTTYPE_RESIZED); + } + } +} + +_SOKOL_PRIVATE void _sapp_android_cleanup(void) { + SOKOL_LOG("Cleaning up"); + if (_sapp.android.surface != EGL_NO_SURFACE) { + /* egl context is bound, cleanup gracefully */ + if (_sapp.init_called && !_sapp.cleanup_called) { + SOKOL_LOG("cleanup_cb()"); + _sapp_call_cleanup(); + } + } + /* always try to cleanup by destroying egl context */ + _sapp_android_cleanup_egl(); +} + +_SOKOL_PRIVATE void _sapp_android_shutdown(void) { + /* try to cleanup while we still have a surface and can call cleanup_cb() */ + _sapp_android_cleanup(); + /* request exit */ + ANativeActivity_finish(_sapp.android.activity); +} + +_SOKOL_PRIVATE void _sapp_android_frame(void) { + SOKOL_ASSERT(_sapp.android.display != EGL_NO_DISPLAY); + SOKOL_ASSERT(_sapp.android.context != EGL_NO_CONTEXT); + SOKOL_ASSERT(_sapp.android.surface != EGL_NO_SURFACE); + _sapp_android_update_dimensions(_sapp.android.current.window, false); + _sapp_frame(); + eglSwapBuffers(_sapp.android.display, _sapp.android.surface); +} + +_SOKOL_PRIVATE bool _sapp_android_touch_event(const AInputEvent* e) { + if (AInputEvent_getType(e) != AINPUT_EVENT_TYPE_MOTION) { + return false; + } + if (!_sapp_events_enabled()) { + return false; + } + int32_t action_idx = AMotionEvent_getAction(e); + int32_t action = action_idx & AMOTION_EVENT_ACTION_MASK; + sapp_event_type type = SAPP_EVENTTYPE_INVALID; + switch (action) { + case AMOTION_EVENT_ACTION_DOWN: + SOKOL_LOG("Touch: down"); + case AMOTION_EVENT_ACTION_POINTER_DOWN: + SOKOL_LOG("Touch: ptr down"); + type = SAPP_EVENTTYPE_TOUCHES_BEGAN; + break; + case AMOTION_EVENT_ACTION_MOVE: + type = SAPP_EVENTTYPE_TOUCHES_MOVED; + break; + case AMOTION_EVENT_ACTION_UP: + SOKOL_LOG("Touch: up"); + case AMOTION_EVENT_ACTION_POINTER_UP: + SOKOL_LOG("Touch: ptr up"); + type = SAPP_EVENTTYPE_TOUCHES_ENDED; + break; + case AMOTION_EVENT_ACTION_CANCEL: + SOKOL_LOG("Touch: cancel"); + type = SAPP_EVENTTYPE_TOUCHES_CANCELLED; + break; + default: + break; + } + if (type == SAPP_EVENTTYPE_INVALID) { + return false; + } + int32_t idx = action_idx >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; + _sapp_init_event(type); + _sapp.event.num_touches = (int)AMotionEvent_getPointerCount(e); + if (_sapp.event.num_touches > SAPP_MAX_TOUCHPOINTS) { + _sapp.event.num_touches = SAPP_MAX_TOUCHPOINTS; + } + for (int32_t i = 0; i < _sapp.event.num_touches; i++) { + sapp_touchpoint* dst = &_sapp.event.touches[i]; + dst->identifier = (uintptr_t)AMotionEvent_getPointerId(e, (size_t)i); + dst->pos_x = (AMotionEvent_getRawX(e, (size_t)i) / _sapp.window_width) * _sapp.framebuffer_width; + dst->pos_y = (AMotionEvent_getRawY(e, (size_t)i) / _sapp.window_height) * _sapp.framebuffer_height; + + if (action == AMOTION_EVENT_ACTION_POINTER_DOWN || + action == AMOTION_EVENT_ACTION_POINTER_UP) { + dst->changed = (i == idx); + } else { + dst->changed = true; + } + } + _sapp_call_event(&_sapp.event); + return true; +} + +_SOKOL_PRIVATE bool _sapp_android_key_event(const AInputEvent* e) { + if (AInputEvent_getType(e) != AINPUT_EVENT_TYPE_KEY) { + return false; + } + if (AKeyEvent_getKeyCode(e) == AKEYCODE_BACK) { + /* FIXME: this should be hooked into a "really quit?" mechanism + so the app can ask the user for confirmation, this is currently + generally missing in sokol_app.h + */ + _sapp_android_shutdown(); + return true; + } + return false; +} + +_SOKOL_PRIVATE int _sapp_android_input_cb(int fd, int events, void* data) { + if ((events & ALOOPER_EVENT_INPUT) == 0) { + SOKOL_LOG("_sapp_android_input_cb() encountered unsupported event"); + return 1; + } + SOKOL_ASSERT(_sapp.android.current.input); + AInputEvent* event = NULL; + while (AInputQueue_getEvent(_sapp.android.current.input, &event) >= 0) { + if (AInputQueue_preDispatchEvent(_sapp.android.current.input, event) != 0) { + continue; + } + int32_t handled = 0; + if (_sapp_android_touch_event(event) || _sapp_android_key_event(event)) { + handled = 1; + } + AInputQueue_finishEvent(_sapp.android.current.input, event, handled); + } + return 1; +} + +_SOKOL_PRIVATE int _sapp_android_main_cb(int fd, int events, void* data) { + if ((events & ALOOPER_EVENT_INPUT) == 0) { + SOKOL_LOG("_sapp_android_main_cb() encountered unsupported event"); + return 1; + } + + _sapp_android_msg_t msg; + if (read(fd, &msg, sizeof(msg)) != sizeof(msg)) { + SOKOL_LOG("Could not write to read_from_main_fd"); + return 1; + } + + pthread_mutex_lock(&_sapp.android.pt.mutex); + switch (msg) { + case _SOKOL_ANDROID_MSG_CREATE: + { + SOKOL_LOG("MSG_CREATE"); + SOKOL_ASSERT(!_sapp.valid); + bool result = _sapp_android_init_egl(); + SOKOL_ASSERT(result); + _sapp.valid = true; + _sapp.android.has_created = true; + } + break; + case _SOKOL_ANDROID_MSG_RESUME: + SOKOL_LOG("MSG_RESUME"); + _sapp.android.has_resumed = true; + _sapp_android_app_event(SAPP_EVENTTYPE_RESUMED); + break; + case _SOKOL_ANDROID_MSG_PAUSE: + SOKOL_LOG("MSG_PAUSE"); + _sapp.android.has_resumed = false; + _sapp_android_app_event(SAPP_EVENTTYPE_SUSPENDED); + break; + case _SOKOL_ANDROID_MSG_FOCUS: + SOKOL_LOG("MSG_FOCUS"); + _sapp.android.has_focus = true; + break; + case _SOKOL_ANDROID_MSG_NO_FOCUS: + SOKOL_LOG("MSG_NO_FOCUS"); + _sapp.android.has_focus = false; + break; + case _SOKOL_ANDROID_MSG_SET_NATIVE_WINDOW: + SOKOL_LOG("MSG_SET_NATIVE_WINDOW"); + if (_sapp.android.current.window != _sapp.android.pending.window) { + if (_sapp.android.current.window != NULL) { + _sapp_android_cleanup_egl_surface(); + } + if (_sapp.android.pending.window != NULL) { + SOKOL_LOG("Creating egl surface ..."); + if (_sapp_android_init_egl_surface(_sapp.android.pending.window)) { + SOKOL_LOG("... ok!"); + _sapp_android_update_dimensions(_sapp.android.pending.window, true); + } else { + SOKOL_LOG("... failed!"); + _sapp_android_shutdown(); + } + } + } + _sapp.android.current.window = _sapp.android.pending.window; + break; + case _SOKOL_ANDROID_MSG_SET_INPUT_QUEUE: + SOKOL_LOG("MSG_SET_INPUT_QUEUE"); + if (_sapp.android.current.input != _sapp.android.pending.input) { + if (_sapp.android.current.input != NULL) { + AInputQueue_detachLooper(_sapp.android.current.input); + } + if (_sapp.android.pending.input != NULL) { + AInputQueue_attachLooper( + _sapp.android.pending.input, + _sapp.android.looper, + ALOOPER_POLL_CALLBACK, + _sapp_android_input_cb, + NULL); /* data */ + } + } + _sapp.android.current.input = _sapp.android.pending.input; + break; + case _SOKOL_ANDROID_MSG_DESTROY: + SOKOL_LOG("MSG_DESTROY"); + _sapp_android_cleanup(); + _sapp.valid = false; + _sapp.android.is_thread_stopping = true; + break; + default: + SOKOL_LOG("Unknown msg type received"); + break; + } + pthread_cond_broadcast(&_sapp.android.pt.cond); /* signal "received" */ + pthread_mutex_unlock(&_sapp.android.pt.mutex); + return 1; +} + +_SOKOL_PRIVATE bool _sapp_android_should_update(void) { + bool is_in_front = _sapp.android.has_resumed && _sapp.android.has_focus; + bool has_surface = _sapp.android.surface != EGL_NO_SURFACE; + return is_in_front && has_surface; +} + +_SOKOL_PRIVATE void _sapp_android_show_keyboard(bool shown) { + SOKOL_ASSERT(_sapp.valid); + /* This seems to be broken in the NDK, but there is (a very cumbersome) workaround... */ + if (shown) { + SOKOL_LOG("Showing keyboard"); + ANativeActivity_showSoftInput(_sapp.android.activity, ANATIVEACTIVITY_SHOW_SOFT_INPUT_FORCED); + } else { + SOKOL_LOG("Hiding keyboard"); + ANativeActivity_hideSoftInput(_sapp.android.activity, ANATIVEACTIVITY_HIDE_SOFT_INPUT_NOT_ALWAYS); + } +} + +_SOKOL_PRIVATE void* _sapp_android_loop(void* arg) { + _SOKOL_UNUSED(arg); + SOKOL_LOG("Loop thread started"); + + _sapp.android.looper = ALooper_prepare(0 /* or ALOOPER_PREPARE_ALLOW_NON_CALLBACKS*/); + ALooper_addFd(_sapp.android.looper, + _sapp.android.pt.read_from_main_fd, + ALOOPER_POLL_CALLBACK, + ALOOPER_EVENT_INPUT, + _sapp_android_main_cb, + NULL); /* data */ + + /* signal start to main thread */ + pthread_mutex_lock(&_sapp.android.pt.mutex); + _sapp.android.is_thread_started = true; + pthread_cond_broadcast(&_sapp.android.pt.cond); + pthread_mutex_unlock(&_sapp.android.pt.mutex); + + /* main loop */ + while (!_sapp.android.is_thread_stopping) { + /* sokol frame */ + if (_sapp_android_should_update()) { + _sapp_android_frame(); + } + + /* process all events (or stop early if app is requested to quit) */ + bool process_events = true; + while (process_events && !_sapp.android.is_thread_stopping) { + bool block_until_event = !_sapp.android.is_thread_stopping && !_sapp_android_should_update(); + process_events = ALooper_pollOnce(block_until_event ? -1 : 0, NULL, NULL, NULL) == ALOOPER_POLL_CALLBACK; + } + } + + /* cleanup thread */ + if (_sapp.android.current.input != NULL) { + AInputQueue_detachLooper(_sapp.android.current.input); + } + + /* the following causes heap corruption on exit, why?? + ALooper_removeFd(_sapp.android.looper, _sapp.android.pt.read_from_main_fd); + ALooper_release(_sapp.android.looper);*/ + + /* signal "destroyed" */ + pthread_mutex_lock(&_sapp.android.pt.mutex); + _sapp.android.is_thread_stopped = true; + pthread_cond_broadcast(&_sapp.android.pt.cond); + pthread_mutex_unlock(&_sapp.android.pt.mutex); + SOKOL_LOG("Loop thread done"); + return NULL; +} + +/* android main/ui thread */ +_SOKOL_PRIVATE void _sapp_android_msg(_sapp_android_msg_t msg) { + if (write(_sapp.android.pt.write_from_main_fd, &msg, sizeof(msg)) != sizeof(msg)) { + SOKOL_LOG("Could not write to write_from_main_fd"); + } +} + +_SOKOL_PRIVATE void _sapp_android_on_start(ANativeActivity* activity) { + SOKOL_LOG("NativeActivity onStart()"); +} + +_SOKOL_PRIVATE void _sapp_android_on_resume(ANativeActivity* activity) { + SOKOL_LOG("NativeActivity onResume()"); + _sapp_android_msg(_SOKOL_ANDROID_MSG_RESUME); +} + +_SOKOL_PRIVATE void* _sapp_android_on_save_instance_state(ANativeActivity* activity, size_t* out_size) { + SOKOL_LOG("NativeActivity onSaveInstanceState()"); + *out_size = 0; + return NULL; +} + +_SOKOL_PRIVATE void _sapp_android_on_window_focus_changed(ANativeActivity* activity, int has_focus) { + SOKOL_LOG("NativeActivity onWindowFocusChanged()"); + if (has_focus) { + _sapp_android_msg(_SOKOL_ANDROID_MSG_FOCUS); + } else { + _sapp_android_msg(_SOKOL_ANDROID_MSG_NO_FOCUS); + } +} + +_SOKOL_PRIVATE void _sapp_android_on_pause(ANativeActivity* activity) { + SOKOL_LOG("NativeActivity onPause()"); + _sapp_android_msg(_SOKOL_ANDROID_MSG_PAUSE); +} + +_SOKOL_PRIVATE void _sapp_android_on_stop(ANativeActivity* activity) { + SOKOL_LOG("NativeActivity onStop()"); +} + +_SOKOL_PRIVATE void _sapp_android_msg_set_native_window(ANativeWindow* window) { + pthread_mutex_lock(&_sapp.android.pt.mutex); + _sapp.android.pending.window = window; + _sapp_android_msg(_SOKOL_ANDROID_MSG_SET_NATIVE_WINDOW); + while (_sapp.android.current.window != window) { + pthread_cond_wait(&_sapp.android.pt.cond, &_sapp.android.pt.mutex); + } + pthread_mutex_unlock(&_sapp.android.pt.mutex); +} + +_SOKOL_PRIVATE void _sapp_android_on_native_window_created(ANativeActivity* activity, ANativeWindow* window) { + SOKOL_LOG("NativeActivity onNativeWindowCreated()"); + _sapp_android_msg_set_native_window(window); +} + +_SOKOL_PRIVATE void _sapp_android_on_native_window_destroyed(ANativeActivity* activity, ANativeWindow* window) { + SOKOL_LOG("NativeActivity onNativeWindowDestroyed()"); + _sapp_android_msg_set_native_window(NULL); +} + +_SOKOL_PRIVATE void _sapp_android_msg_set_input_queue(AInputQueue* input) { + pthread_mutex_lock(&_sapp.android.pt.mutex); + _sapp.android.pending.input = input; + _sapp_android_msg(_SOKOL_ANDROID_MSG_SET_INPUT_QUEUE); + while (_sapp.android.current.input != input) { + pthread_cond_wait(&_sapp.android.pt.cond, &_sapp.android.pt.mutex); + } + pthread_mutex_unlock(&_sapp.android.pt.mutex); +} + +_SOKOL_PRIVATE void _sapp_android_on_input_queue_created(ANativeActivity* activity, AInputQueue* queue) { + SOKOL_LOG("NativeActivity onInputQueueCreated()"); + _sapp_android_msg_set_input_queue(queue); +} + +_SOKOL_PRIVATE void _sapp_android_on_input_queue_destroyed(ANativeActivity* activity, AInputQueue* queue) { + SOKOL_LOG("NativeActivity onInputQueueDestroyed()"); + _sapp_android_msg_set_input_queue(NULL); +} + +_SOKOL_PRIVATE void _sapp_android_on_config_changed(ANativeActivity* activity) { + SOKOL_LOG("NativeActivity onConfigurationChanged()"); + /* see android:configChanges in manifest */ +} + +_SOKOL_PRIVATE void _sapp_android_on_low_memory(ANativeActivity* activity) { + SOKOL_LOG("NativeActivity onLowMemory()"); +} + +_SOKOL_PRIVATE void _sapp_android_on_destroy(ANativeActivity* activity) { + /* + * For some reason even an empty app using nativeactivity.h will crash (WIN DEATH) + * on my device (Moto X 2nd gen) when the app is removed from the task view + * (TaskStackView: onTaskViewDismissed). + * + * However, if ANativeActivity_finish() is explicitly called from for example + * _sapp_android_on_stop(), the crash disappears. Is this a bug in NativeActivity? + */ + SOKOL_LOG("NativeActivity onDestroy()"); + + /* send destroy msg */ + pthread_mutex_lock(&_sapp.android.pt.mutex); + _sapp_android_msg(_SOKOL_ANDROID_MSG_DESTROY); + while (!_sapp.android.is_thread_stopped) { + pthread_cond_wait(&_sapp.android.pt.cond, &_sapp.android.pt.mutex); + } + pthread_mutex_unlock(&_sapp.android.pt.mutex); + + /* clean up main thread */ + pthread_cond_destroy(&_sapp.android.pt.cond); + pthread_mutex_destroy(&_sapp.android.pt.mutex); + + close(_sapp.android.pt.read_from_main_fd); + close(_sapp.android.pt.write_from_main_fd); + + SOKOL_LOG("NativeActivity done"); + + /* this is a bit naughty, but causes a clean restart of the app (static globals are reset) */ + exit(0); +} + +JNIEXPORT +void ANativeActivity_onCreate(ANativeActivity* activity, void* saved_state, size_t saved_state_size) { + SOKOL_LOG("NativeActivity onCreate()"); + + sapp_desc desc = sokol_main(0, NULL); + _sapp_init_state(&desc); + + /* start loop thread */ + _sapp.android.activity = activity; + + int pipe_fd[2]; + if (pipe(pipe_fd) != 0) { + SOKOL_LOG("Could not create thread pipe"); + return; + } + _sapp.android.pt.read_from_main_fd = pipe_fd[0]; + _sapp.android.pt.write_from_main_fd = pipe_fd[1]; + + pthread_mutex_init(&_sapp.android.pt.mutex, NULL); + pthread_cond_init(&_sapp.android.pt.cond, NULL); + + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_create(&_sapp.android.pt.thread, &attr, _sapp_android_loop, 0); + pthread_attr_destroy(&attr); + + /* wait until main loop has started */ + pthread_mutex_lock(&_sapp.android.pt.mutex); + while (!_sapp.android.is_thread_started) { + pthread_cond_wait(&_sapp.android.pt.cond, &_sapp.android.pt.mutex); + } + pthread_mutex_unlock(&_sapp.android.pt.mutex); + + /* send create msg */ + pthread_mutex_lock(&_sapp.android.pt.mutex); + _sapp_android_msg(_SOKOL_ANDROID_MSG_CREATE); + while (!_sapp.android.has_created) { + pthread_cond_wait(&_sapp.android.pt.cond, &_sapp.android.pt.mutex); + } + pthread_mutex_unlock(&_sapp.android.pt.mutex); + + /* register for callbacks */ + activity->callbacks->onStart = _sapp_android_on_start; + activity->callbacks->onResume = _sapp_android_on_resume; + activity->callbacks->onSaveInstanceState = _sapp_android_on_save_instance_state; + activity->callbacks->onWindowFocusChanged = _sapp_android_on_window_focus_changed; + activity->callbacks->onPause = _sapp_android_on_pause; + activity->callbacks->onStop = _sapp_android_on_stop; + activity->callbacks->onDestroy = _sapp_android_on_destroy; + activity->callbacks->onNativeWindowCreated = _sapp_android_on_native_window_created; + /* activity->callbacks->onNativeWindowResized = _sapp_android_on_native_window_resized; */ + /* activity->callbacks->onNativeWindowRedrawNeeded = _sapp_android_on_native_window_redraw_needed; */ + activity->callbacks->onNativeWindowDestroyed = _sapp_android_on_native_window_destroyed; + activity->callbacks->onInputQueueCreated = _sapp_android_on_input_queue_created; + activity->callbacks->onInputQueueDestroyed = _sapp_android_on_input_queue_destroyed; + /* activity->callbacks->onContentRectChanged = _sapp_android_on_content_rect_changed; */ + activity->callbacks->onConfigurationChanged = _sapp_android_on_config_changed; + activity->callbacks->onLowMemory = _sapp_android_on_low_memory; + + SOKOL_LOG("NativeActivity successfully created"); + + /* NOT A BUG: do NOT call sapp_discard_state() */ +} + +#endif /* _SAPP_ANDROID */ + +/*== LINUX ==================================================================*/ +#if defined(_SAPP_LINUX) + +/* see GLFW's xkb_unicode.c */ +static const struct _sapp_x11_codepair { + uint16_t keysym; + uint16_t ucs; +} _sapp_x11_keysymtab[] = { + { 0x01a1, 0x0104 }, + { 0x01a2, 0x02d8 }, + { 0x01a3, 0x0141 }, + { 0x01a5, 0x013d }, + { 0x01a6, 0x015a }, + { 0x01a9, 0x0160 }, + { 0x01aa, 0x015e }, + { 0x01ab, 0x0164 }, + { 0x01ac, 0x0179 }, + { 0x01ae, 0x017d }, + { 0x01af, 0x017b }, + { 0x01b1, 0x0105 }, + { 0x01b2, 0x02db }, + { 0x01b3, 0x0142 }, + { 0x01b5, 0x013e }, + { 0x01b6, 0x015b }, + { 0x01b7, 0x02c7 }, + { 0x01b9, 0x0161 }, + { 0x01ba, 0x015f }, + { 0x01bb, 0x0165 }, + { 0x01bc, 0x017a }, + { 0x01bd, 0x02dd }, + { 0x01be, 0x017e }, + { 0x01bf, 0x017c }, + { 0x01c0, 0x0154 }, + { 0x01c3, 0x0102 }, + { 0x01c5, 0x0139 }, + { 0x01c6, 0x0106 }, + { 0x01c8, 0x010c }, + { 0x01ca, 0x0118 }, + { 0x01cc, 0x011a }, + { 0x01cf, 0x010e }, + { 0x01d0, 0x0110 }, + { 0x01d1, 0x0143 }, + { 0x01d2, 0x0147 }, + { 0x01d5, 0x0150 }, + { 0x01d8, 0x0158 }, + { 0x01d9, 0x016e }, + { 0x01db, 0x0170 }, + { 0x01de, 0x0162 }, + { 0x01e0, 0x0155 }, + { 0x01e3, 0x0103 }, + { 0x01e5, 0x013a }, + { 0x01e6, 0x0107 }, + { 0x01e8, 0x010d }, + { 0x01ea, 0x0119 }, + { 0x01ec, 0x011b }, + { 0x01ef, 0x010f }, + { 0x01f0, 0x0111 }, + { 0x01f1, 0x0144 }, + { 0x01f2, 0x0148 }, + { 0x01f5, 0x0151 }, + { 0x01f8, 0x0159 }, + { 0x01f9, 0x016f }, + { 0x01fb, 0x0171 }, + { 0x01fe, 0x0163 }, + { 0x01ff, 0x02d9 }, + { 0x02a1, 0x0126 }, + { 0x02a6, 0x0124 }, + { 0x02a9, 0x0130 }, + { 0x02ab, 0x011e }, + { 0x02ac, 0x0134 }, + { 0x02b1, 0x0127 }, + { 0x02b6, 0x0125 }, + { 0x02b9, 0x0131 }, + { 0x02bb, 0x011f }, + { 0x02bc, 0x0135 }, + { 0x02c5, 0x010a }, + { 0x02c6, 0x0108 }, + { 0x02d5, 0x0120 }, + { 0x02d8, 0x011c }, + { 0x02dd, 0x016c }, + { 0x02de, 0x015c }, + { 0x02e5, 0x010b }, + { 0x02e6, 0x0109 }, + { 0x02f5, 0x0121 }, + { 0x02f8, 0x011d }, + { 0x02fd, 0x016d }, + { 0x02fe, 0x015d }, + { 0x03a2, 0x0138 }, + { 0x03a3, 0x0156 }, + { 0x03a5, 0x0128 }, + { 0x03a6, 0x013b }, + { 0x03aa, 0x0112 }, + { 0x03ab, 0x0122 }, + { 0x03ac, 0x0166 }, + { 0x03b3, 0x0157 }, + { 0x03b5, 0x0129 }, + { 0x03b6, 0x013c }, + { 0x03ba, 0x0113 }, + { 0x03bb, 0x0123 }, + { 0x03bc, 0x0167 }, + { 0x03bd, 0x014a }, + { 0x03bf, 0x014b }, + { 0x03c0, 0x0100 }, + { 0x03c7, 0x012e }, + { 0x03cc, 0x0116 }, + { 0x03cf, 0x012a }, + { 0x03d1, 0x0145 }, + { 0x03d2, 0x014c }, + { 0x03d3, 0x0136 }, + { 0x03d9, 0x0172 }, + { 0x03dd, 0x0168 }, + { 0x03de, 0x016a }, + { 0x03e0, 0x0101 }, + { 0x03e7, 0x012f }, + { 0x03ec, 0x0117 }, + { 0x03ef, 0x012b }, + { 0x03f1, 0x0146 }, + { 0x03f2, 0x014d }, + { 0x03f3, 0x0137 }, + { 0x03f9, 0x0173 }, + { 0x03fd, 0x0169 }, + { 0x03fe, 0x016b }, + { 0x047e, 0x203e }, + { 0x04a1, 0x3002 }, + { 0x04a2, 0x300c }, + { 0x04a3, 0x300d }, + { 0x04a4, 0x3001 }, + { 0x04a5, 0x30fb }, + { 0x04a6, 0x30f2 }, + { 0x04a7, 0x30a1 }, + { 0x04a8, 0x30a3 }, + { 0x04a9, 0x30a5 }, + { 0x04aa, 0x30a7 }, + { 0x04ab, 0x30a9 }, + { 0x04ac, 0x30e3 }, + { 0x04ad, 0x30e5 }, + { 0x04ae, 0x30e7 }, + { 0x04af, 0x30c3 }, + { 0x04b0, 0x30fc }, + { 0x04b1, 0x30a2 }, + { 0x04b2, 0x30a4 }, + { 0x04b3, 0x30a6 }, + { 0x04b4, 0x30a8 }, + { 0x04b5, 0x30aa }, + { 0x04b6, 0x30ab }, + { 0x04b7, 0x30ad }, + { 0x04b8, 0x30af }, + { 0x04b9, 0x30b1 }, + { 0x04ba, 0x30b3 }, + { 0x04bb, 0x30b5 }, + { 0x04bc, 0x30b7 }, + { 0x04bd, 0x30b9 }, + { 0x04be, 0x30bb }, + { 0x04bf, 0x30bd }, + { 0x04c0, 0x30bf }, + { 0x04c1, 0x30c1 }, + { 0x04c2, 0x30c4 }, + { 0x04c3, 0x30c6 }, + { 0x04c4, 0x30c8 }, + { 0x04c5, 0x30ca }, + { 0x04c6, 0x30cb }, + { 0x04c7, 0x30cc }, + { 0x04c8, 0x30cd }, + { 0x04c9, 0x30ce }, + { 0x04ca, 0x30cf }, + { 0x04cb, 0x30d2 }, + { 0x04cc, 0x30d5 }, + { 0x04cd, 0x30d8 }, + { 0x04ce, 0x30db }, + { 0x04cf, 0x30de }, + { 0x04d0, 0x30df }, + { 0x04d1, 0x30e0 }, + { 0x04d2, 0x30e1 }, + { 0x04d3, 0x30e2 }, + { 0x04d4, 0x30e4 }, + { 0x04d5, 0x30e6 }, + { 0x04d6, 0x30e8 }, + { 0x04d7, 0x30e9 }, + { 0x04d8, 0x30ea }, + { 0x04d9, 0x30eb }, + { 0x04da, 0x30ec }, + { 0x04db, 0x30ed }, + { 0x04dc, 0x30ef }, + { 0x04dd, 0x30f3 }, + { 0x04de, 0x309b }, + { 0x04df, 0x309c }, + { 0x05ac, 0x060c }, + { 0x05bb, 0x061b }, + { 0x05bf, 0x061f }, + { 0x05c1, 0x0621 }, + { 0x05c2, 0x0622 }, + { 0x05c3, 0x0623 }, + { 0x05c4, 0x0624 }, + { 0x05c5, 0x0625 }, + { 0x05c6, 0x0626 }, + { 0x05c7, 0x0627 }, + { 0x05c8, 0x0628 }, + { 0x05c9, 0x0629 }, + { 0x05ca, 0x062a }, + { 0x05cb, 0x062b }, + { 0x05cc, 0x062c }, + { 0x05cd, 0x062d }, + { 0x05ce, 0x062e }, + { 0x05cf, 0x062f }, + { 0x05d0, 0x0630 }, + { 0x05d1, 0x0631 }, + { 0x05d2, 0x0632 }, + { 0x05d3, 0x0633 }, + { 0x05d4, 0x0634 }, + { 0x05d5, 0x0635 }, + { 0x05d6, 0x0636 }, + { 0x05d7, 0x0637 }, + { 0x05d8, 0x0638 }, + { 0x05d9, 0x0639 }, + { 0x05da, 0x063a }, + { 0x05e0, 0x0640 }, + { 0x05e1, 0x0641 }, + { 0x05e2, 0x0642 }, + { 0x05e3, 0x0643 }, + { 0x05e4, 0x0644 }, + { 0x05e5, 0x0645 }, + { 0x05e6, 0x0646 }, + { 0x05e7, 0x0647 }, + { 0x05e8, 0x0648 }, + { 0x05e9, 0x0649 }, + { 0x05ea, 0x064a }, + { 0x05eb, 0x064b }, + { 0x05ec, 0x064c }, + { 0x05ed, 0x064d }, + { 0x05ee, 0x064e }, + { 0x05ef, 0x064f }, + { 0x05f0, 0x0650 }, + { 0x05f1, 0x0651 }, + { 0x05f2, 0x0652 }, + { 0x06a1, 0x0452 }, + { 0x06a2, 0x0453 }, + { 0x06a3, 0x0451 }, + { 0x06a4, 0x0454 }, + { 0x06a5, 0x0455 }, + { 0x06a6, 0x0456 }, + { 0x06a7, 0x0457 }, + { 0x06a8, 0x0458 }, + { 0x06a9, 0x0459 }, + { 0x06aa, 0x045a }, + { 0x06ab, 0x045b }, + { 0x06ac, 0x045c }, + { 0x06ae, 0x045e }, + { 0x06af, 0x045f }, + { 0x06b0, 0x2116 }, + { 0x06b1, 0x0402 }, + { 0x06b2, 0x0403 }, + { 0x06b3, 0x0401 }, + { 0x06b4, 0x0404 }, + { 0x06b5, 0x0405 }, + { 0x06b6, 0x0406 }, + { 0x06b7, 0x0407 }, + { 0x06b8, 0x0408 }, + { 0x06b9, 0x0409 }, + { 0x06ba, 0x040a }, + { 0x06bb, 0x040b }, + { 0x06bc, 0x040c }, + { 0x06be, 0x040e }, + { 0x06bf, 0x040f }, + { 0x06c0, 0x044e }, + { 0x06c1, 0x0430 }, + { 0x06c2, 0x0431 }, + { 0x06c3, 0x0446 }, + { 0x06c4, 0x0434 }, + { 0x06c5, 0x0435 }, + { 0x06c6, 0x0444 }, + { 0x06c7, 0x0433 }, + { 0x06c8, 0x0445 }, + { 0x06c9, 0x0438 }, + { 0x06ca, 0x0439 }, + { 0x06cb, 0x043a }, + { 0x06cc, 0x043b }, + { 0x06cd, 0x043c }, + { 0x06ce, 0x043d }, + { 0x06cf, 0x043e }, + { 0x06d0, 0x043f }, + { 0x06d1, 0x044f }, + { 0x06d2, 0x0440 }, + { 0x06d3, 0x0441 }, + { 0x06d4, 0x0442 }, + { 0x06d5, 0x0443 }, + { 0x06d6, 0x0436 }, + { 0x06d7, 0x0432 }, + { 0x06d8, 0x044c }, + { 0x06d9, 0x044b }, + { 0x06da, 0x0437 }, + { 0x06db, 0x0448 }, + { 0x06dc, 0x044d }, + { 0x06dd, 0x0449 }, + { 0x06de, 0x0447 }, + { 0x06df, 0x044a }, + { 0x06e0, 0x042e }, + { 0x06e1, 0x0410 }, + { 0x06e2, 0x0411 }, + { 0x06e3, 0x0426 }, + { 0x06e4, 0x0414 }, + { 0x06e5, 0x0415 }, + { 0x06e6, 0x0424 }, + { 0x06e7, 0x0413 }, + { 0x06e8, 0x0425 }, + { 0x06e9, 0x0418 }, + { 0x06ea, 0x0419 }, + { 0x06eb, 0x041a }, + { 0x06ec, 0x041b }, + { 0x06ed, 0x041c }, + { 0x06ee, 0x041d }, + { 0x06ef, 0x041e }, + { 0x06f0, 0x041f }, + { 0x06f1, 0x042f }, + { 0x06f2, 0x0420 }, + { 0x06f3, 0x0421 }, + { 0x06f4, 0x0422 }, + { 0x06f5, 0x0423 }, + { 0x06f6, 0x0416 }, + { 0x06f7, 0x0412 }, + { 0x06f8, 0x042c }, + { 0x06f9, 0x042b }, + { 0x06fa, 0x0417 }, + { 0x06fb, 0x0428 }, + { 0x06fc, 0x042d }, + { 0x06fd, 0x0429 }, + { 0x06fe, 0x0427 }, + { 0x06ff, 0x042a }, + { 0x07a1, 0x0386 }, + { 0x07a2, 0x0388 }, + { 0x07a3, 0x0389 }, + { 0x07a4, 0x038a }, + { 0x07a5, 0x03aa }, + { 0x07a7, 0x038c }, + { 0x07a8, 0x038e }, + { 0x07a9, 0x03ab }, + { 0x07ab, 0x038f }, + { 0x07ae, 0x0385 }, + { 0x07af, 0x2015 }, + { 0x07b1, 0x03ac }, + { 0x07b2, 0x03ad }, + { 0x07b3, 0x03ae }, + { 0x07b4, 0x03af }, + { 0x07b5, 0x03ca }, + { 0x07b6, 0x0390 }, + { 0x07b7, 0x03cc }, + { 0x07b8, 0x03cd }, + { 0x07b9, 0x03cb }, + { 0x07ba, 0x03b0 }, + { 0x07bb, 0x03ce }, + { 0x07c1, 0x0391 }, + { 0x07c2, 0x0392 }, + { 0x07c3, 0x0393 }, + { 0x07c4, 0x0394 }, + { 0x07c5, 0x0395 }, + { 0x07c6, 0x0396 }, + { 0x07c7, 0x0397 }, + { 0x07c8, 0x0398 }, + { 0x07c9, 0x0399 }, + { 0x07ca, 0x039a }, + { 0x07cb, 0x039b }, + { 0x07cc, 0x039c }, + { 0x07cd, 0x039d }, + { 0x07ce, 0x039e }, + { 0x07cf, 0x039f }, + { 0x07d0, 0x03a0 }, + { 0x07d1, 0x03a1 }, + { 0x07d2, 0x03a3 }, + { 0x07d4, 0x03a4 }, + { 0x07d5, 0x03a5 }, + { 0x07d6, 0x03a6 }, + { 0x07d7, 0x03a7 }, + { 0x07d8, 0x03a8 }, + { 0x07d9, 0x03a9 }, + { 0x07e1, 0x03b1 }, + { 0x07e2, 0x03b2 }, + { 0x07e3, 0x03b3 }, + { 0x07e4, 0x03b4 }, + { 0x07e5, 0x03b5 }, + { 0x07e6, 0x03b6 }, + { 0x07e7, 0x03b7 }, + { 0x07e8, 0x03b8 }, + { 0x07e9, 0x03b9 }, + { 0x07ea, 0x03ba }, + { 0x07eb, 0x03bb }, + { 0x07ec, 0x03bc }, + { 0x07ed, 0x03bd }, + { 0x07ee, 0x03be }, + { 0x07ef, 0x03bf }, + { 0x07f0, 0x03c0 }, + { 0x07f1, 0x03c1 }, + { 0x07f2, 0x03c3 }, + { 0x07f3, 0x03c2 }, + { 0x07f4, 0x03c4 }, + { 0x07f5, 0x03c5 }, + { 0x07f6, 0x03c6 }, + { 0x07f7, 0x03c7 }, + { 0x07f8, 0x03c8 }, + { 0x07f9, 0x03c9 }, + { 0x08a1, 0x23b7 }, + { 0x08a2, 0x250c }, + { 0x08a3, 0x2500 }, + { 0x08a4, 0x2320 }, + { 0x08a5, 0x2321 }, + { 0x08a6, 0x2502 }, + { 0x08a7, 0x23a1 }, + { 0x08a8, 0x23a3 }, + { 0x08a9, 0x23a4 }, + { 0x08aa, 0x23a6 }, + { 0x08ab, 0x239b }, + { 0x08ac, 0x239d }, + { 0x08ad, 0x239e }, + { 0x08ae, 0x23a0 }, + { 0x08af, 0x23a8 }, + { 0x08b0, 0x23ac }, + { 0x08bc, 0x2264 }, + { 0x08bd, 0x2260 }, + { 0x08be, 0x2265 }, + { 0x08bf, 0x222b }, + { 0x08c0, 0x2234 }, + { 0x08c1, 0x221d }, + { 0x08c2, 0x221e }, + { 0x08c5, 0x2207 }, + { 0x08c8, 0x223c }, + { 0x08c9, 0x2243 }, + { 0x08cd, 0x21d4 }, + { 0x08ce, 0x21d2 }, + { 0x08cf, 0x2261 }, + { 0x08d6, 0x221a }, + { 0x08da, 0x2282 }, + { 0x08db, 0x2283 }, + { 0x08dc, 0x2229 }, + { 0x08dd, 0x222a }, + { 0x08de, 0x2227 }, + { 0x08df, 0x2228 }, + { 0x08ef, 0x2202 }, + { 0x08f6, 0x0192 }, + { 0x08fb, 0x2190 }, + { 0x08fc, 0x2191 }, + { 0x08fd, 0x2192 }, + { 0x08fe, 0x2193 }, + { 0x09e0, 0x25c6 }, + { 0x09e1, 0x2592 }, + { 0x09e2, 0x2409 }, + { 0x09e3, 0x240c }, + { 0x09e4, 0x240d }, + { 0x09e5, 0x240a }, + { 0x09e8, 0x2424 }, + { 0x09e9, 0x240b }, + { 0x09ea, 0x2518 }, + { 0x09eb, 0x2510 }, + { 0x09ec, 0x250c }, + { 0x09ed, 0x2514 }, + { 0x09ee, 0x253c }, + { 0x09ef, 0x23ba }, + { 0x09f0, 0x23bb }, + { 0x09f1, 0x2500 }, + { 0x09f2, 0x23bc }, + { 0x09f3, 0x23bd }, + { 0x09f4, 0x251c }, + { 0x09f5, 0x2524 }, + { 0x09f6, 0x2534 }, + { 0x09f7, 0x252c }, + { 0x09f8, 0x2502 }, + { 0x0aa1, 0x2003 }, + { 0x0aa2, 0x2002 }, + { 0x0aa3, 0x2004 }, + { 0x0aa4, 0x2005 }, + { 0x0aa5, 0x2007 }, + { 0x0aa6, 0x2008 }, + { 0x0aa7, 0x2009 }, + { 0x0aa8, 0x200a }, + { 0x0aa9, 0x2014 }, + { 0x0aaa, 0x2013 }, + { 0x0aae, 0x2026 }, + { 0x0aaf, 0x2025 }, + { 0x0ab0, 0x2153 }, + { 0x0ab1, 0x2154 }, + { 0x0ab2, 0x2155 }, + { 0x0ab3, 0x2156 }, + { 0x0ab4, 0x2157 }, + { 0x0ab5, 0x2158 }, + { 0x0ab6, 0x2159 }, + { 0x0ab7, 0x215a }, + { 0x0ab8, 0x2105 }, + { 0x0abb, 0x2012 }, + { 0x0abc, 0x2329 }, + { 0x0abe, 0x232a }, + { 0x0ac3, 0x215b }, + { 0x0ac4, 0x215c }, + { 0x0ac5, 0x215d }, + { 0x0ac6, 0x215e }, + { 0x0ac9, 0x2122 }, + { 0x0aca, 0x2613 }, + { 0x0acc, 0x25c1 }, + { 0x0acd, 0x25b7 }, + { 0x0ace, 0x25cb }, + { 0x0acf, 0x25af }, + { 0x0ad0, 0x2018 }, + { 0x0ad1, 0x2019 }, + { 0x0ad2, 0x201c }, + { 0x0ad3, 0x201d }, + { 0x0ad4, 0x211e }, + { 0x0ad6, 0x2032 }, + { 0x0ad7, 0x2033 }, + { 0x0ad9, 0x271d }, + { 0x0adb, 0x25ac }, + { 0x0adc, 0x25c0 }, + { 0x0add, 0x25b6 }, + { 0x0ade, 0x25cf }, + { 0x0adf, 0x25ae }, + { 0x0ae0, 0x25e6 }, + { 0x0ae1, 0x25ab }, + { 0x0ae2, 0x25ad }, + { 0x0ae3, 0x25b3 }, + { 0x0ae4, 0x25bd }, + { 0x0ae5, 0x2606 }, + { 0x0ae6, 0x2022 }, + { 0x0ae7, 0x25aa }, + { 0x0ae8, 0x25b2 }, + { 0x0ae9, 0x25bc }, + { 0x0aea, 0x261c }, + { 0x0aeb, 0x261e }, + { 0x0aec, 0x2663 }, + { 0x0aed, 0x2666 }, + { 0x0aee, 0x2665 }, + { 0x0af0, 0x2720 }, + { 0x0af1, 0x2020 }, + { 0x0af2, 0x2021 }, + { 0x0af3, 0x2713 }, + { 0x0af4, 0x2717 }, + { 0x0af5, 0x266f }, + { 0x0af6, 0x266d }, + { 0x0af7, 0x2642 }, + { 0x0af8, 0x2640 }, + { 0x0af9, 0x260e }, + { 0x0afa, 0x2315 }, + { 0x0afb, 0x2117 }, + { 0x0afc, 0x2038 }, + { 0x0afd, 0x201a }, + { 0x0afe, 0x201e }, + { 0x0ba3, 0x003c }, + { 0x0ba6, 0x003e }, + { 0x0ba8, 0x2228 }, + { 0x0ba9, 0x2227 }, + { 0x0bc0, 0x00af }, + { 0x0bc2, 0x22a5 }, + { 0x0bc3, 0x2229 }, + { 0x0bc4, 0x230a }, + { 0x0bc6, 0x005f }, + { 0x0bca, 0x2218 }, + { 0x0bcc, 0x2395 }, + { 0x0bce, 0x22a4 }, + { 0x0bcf, 0x25cb }, + { 0x0bd3, 0x2308 }, + { 0x0bd6, 0x222a }, + { 0x0bd8, 0x2283 }, + { 0x0bda, 0x2282 }, + { 0x0bdc, 0x22a2 }, + { 0x0bfc, 0x22a3 }, + { 0x0cdf, 0x2017 }, + { 0x0ce0, 0x05d0 }, + { 0x0ce1, 0x05d1 }, + { 0x0ce2, 0x05d2 }, + { 0x0ce3, 0x05d3 }, + { 0x0ce4, 0x05d4 }, + { 0x0ce5, 0x05d5 }, + { 0x0ce6, 0x05d6 }, + { 0x0ce7, 0x05d7 }, + { 0x0ce8, 0x05d8 }, + { 0x0ce9, 0x05d9 }, + { 0x0cea, 0x05da }, + { 0x0ceb, 0x05db }, + { 0x0cec, 0x05dc }, + { 0x0ced, 0x05dd }, + { 0x0cee, 0x05de }, + { 0x0cef, 0x05df }, + { 0x0cf0, 0x05e0 }, + { 0x0cf1, 0x05e1 }, + { 0x0cf2, 0x05e2 }, + { 0x0cf3, 0x05e3 }, + { 0x0cf4, 0x05e4 }, + { 0x0cf5, 0x05e5 }, + { 0x0cf6, 0x05e6 }, + { 0x0cf7, 0x05e7 }, + { 0x0cf8, 0x05e8 }, + { 0x0cf9, 0x05e9 }, + { 0x0cfa, 0x05ea }, + { 0x0da1, 0x0e01 }, + { 0x0da2, 0x0e02 }, + { 0x0da3, 0x0e03 }, + { 0x0da4, 0x0e04 }, + { 0x0da5, 0x0e05 }, + { 0x0da6, 0x0e06 }, + { 0x0da7, 0x0e07 }, + { 0x0da8, 0x0e08 }, + { 0x0da9, 0x0e09 }, + { 0x0daa, 0x0e0a }, + { 0x0dab, 0x0e0b }, + { 0x0dac, 0x0e0c }, + { 0x0dad, 0x0e0d }, + { 0x0dae, 0x0e0e }, + { 0x0daf, 0x0e0f }, + { 0x0db0, 0x0e10 }, + { 0x0db1, 0x0e11 }, + { 0x0db2, 0x0e12 }, + { 0x0db3, 0x0e13 }, + { 0x0db4, 0x0e14 }, + { 0x0db5, 0x0e15 }, + { 0x0db6, 0x0e16 }, + { 0x0db7, 0x0e17 }, + { 0x0db8, 0x0e18 }, + { 0x0db9, 0x0e19 }, + { 0x0dba, 0x0e1a }, + { 0x0dbb, 0x0e1b }, + { 0x0dbc, 0x0e1c }, + { 0x0dbd, 0x0e1d }, + { 0x0dbe, 0x0e1e }, + { 0x0dbf, 0x0e1f }, + { 0x0dc0, 0x0e20 }, + { 0x0dc1, 0x0e21 }, + { 0x0dc2, 0x0e22 }, + { 0x0dc3, 0x0e23 }, + { 0x0dc4, 0x0e24 }, + { 0x0dc5, 0x0e25 }, + { 0x0dc6, 0x0e26 }, + { 0x0dc7, 0x0e27 }, + { 0x0dc8, 0x0e28 }, + { 0x0dc9, 0x0e29 }, + { 0x0dca, 0x0e2a }, + { 0x0dcb, 0x0e2b }, + { 0x0dcc, 0x0e2c }, + { 0x0dcd, 0x0e2d }, + { 0x0dce, 0x0e2e }, + { 0x0dcf, 0x0e2f }, + { 0x0dd0, 0x0e30 }, + { 0x0dd1, 0x0e31 }, + { 0x0dd2, 0x0e32 }, + { 0x0dd3, 0x0e33 }, + { 0x0dd4, 0x0e34 }, + { 0x0dd5, 0x0e35 }, + { 0x0dd6, 0x0e36 }, + { 0x0dd7, 0x0e37 }, + { 0x0dd8, 0x0e38 }, + { 0x0dd9, 0x0e39 }, + { 0x0dda, 0x0e3a }, + { 0x0ddf, 0x0e3f }, + { 0x0de0, 0x0e40 }, + { 0x0de1, 0x0e41 }, + { 0x0de2, 0x0e42 }, + { 0x0de3, 0x0e43 }, + { 0x0de4, 0x0e44 }, + { 0x0de5, 0x0e45 }, + { 0x0de6, 0x0e46 }, + { 0x0de7, 0x0e47 }, + { 0x0de8, 0x0e48 }, + { 0x0de9, 0x0e49 }, + { 0x0dea, 0x0e4a }, + { 0x0deb, 0x0e4b }, + { 0x0dec, 0x0e4c }, + { 0x0ded, 0x0e4d }, + { 0x0df0, 0x0e50 }, + { 0x0df1, 0x0e51 }, + { 0x0df2, 0x0e52 }, + { 0x0df3, 0x0e53 }, + { 0x0df4, 0x0e54 }, + { 0x0df5, 0x0e55 }, + { 0x0df6, 0x0e56 }, + { 0x0df7, 0x0e57 }, + { 0x0df8, 0x0e58 }, + { 0x0df9, 0x0e59 }, + { 0x0ea1, 0x3131 }, + { 0x0ea2, 0x3132 }, + { 0x0ea3, 0x3133 }, + { 0x0ea4, 0x3134 }, + { 0x0ea5, 0x3135 }, + { 0x0ea6, 0x3136 }, + { 0x0ea7, 0x3137 }, + { 0x0ea8, 0x3138 }, + { 0x0ea9, 0x3139 }, + { 0x0eaa, 0x313a }, + { 0x0eab, 0x313b }, + { 0x0eac, 0x313c }, + { 0x0ead, 0x313d }, + { 0x0eae, 0x313e }, + { 0x0eaf, 0x313f }, + { 0x0eb0, 0x3140 }, + { 0x0eb1, 0x3141 }, + { 0x0eb2, 0x3142 }, + { 0x0eb3, 0x3143 }, + { 0x0eb4, 0x3144 }, + { 0x0eb5, 0x3145 }, + { 0x0eb6, 0x3146 }, + { 0x0eb7, 0x3147 }, + { 0x0eb8, 0x3148 }, + { 0x0eb9, 0x3149 }, + { 0x0eba, 0x314a }, + { 0x0ebb, 0x314b }, + { 0x0ebc, 0x314c }, + { 0x0ebd, 0x314d }, + { 0x0ebe, 0x314e }, + { 0x0ebf, 0x314f }, + { 0x0ec0, 0x3150 }, + { 0x0ec1, 0x3151 }, + { 0x0ec2, 0x3152 }, + { 0x0ec3, 0x3153 }, + { 0x0ec4, 0x3154 }, + { 0x0ec5, 0x3155 }, + { 0x0ec6, 0x3156 }, + { 0x0ec7, 0x3157 }, + { 0x0ec8, 0x3158 }, + { 0x0ec9, 0x3159 }, + { 0x0eca, 0x315a }, + { 0x0ecb, 0x315b }, + { 0x0ecc, 0x315c }, + { 0x0ecd, 0x315d }, + { 0x0ece, 0x315e }, + { 0x0ecf, 0x315f }, + { 0x0ed0, 0x3160 }, + { 0x0ed1, 0x3161 }, + { 0x0ed2, 0x3162 }, + { 0x0ed3, 0x3163 }, + { 0x0ed4, 0x11a8 }, + { 0x0ed5, 0x11a9 }, + { 0x0ed6, 0x11aa }, + { 0x0ed7, 0x11ab }, + { 0x0ed8, 0x11ac }, + { 0x0ed9, 0x11ad }, + { 0x0eda, 0x11ae }, + { 0x0edb, 0x11af }, + { 0x0edc, 0x11b0 }, + { 0x0edd, 0x11b1 }, + { 0x0ede, 0x11b2 }, + { 0x0edf, 0x11b3 }, + { 0x0ee0, 0x11b4 }, + { 0x0ee1, 0x11b5 }, + { 0x0ee2, 0x11b6 }, + { 0x0ee3, 0x11b7 }, + { 0x0ee4, 0x11b8 }, + { 0x0ee5, 0x11b9 }, + { 0x0ee6, 0x11ba }, + { 0x0ee7, 0x11bb }, + { 0x0ee8, 0x11bc }, + { 0x0ee9, 0x11bd }, + { 0x0eea, 0x11be }, + { 0x0eeb, 0x11bf }, + { 0x0eec, 0x11c0 }, + { 0x0eed, 0x11c1 }, + { 0x0eee, 0x11c2 }, + { 0x0eef, 0x316d }, + { 0x0ef0, 0x3171 }, + { 0x0ef1, 0x3178 }, + { 0x0ef2, 0x317f }, + { 0x0ef3, 0x3181 }, + { 0x0ef4, 0x3184 }, + { 0x0ef5, 0x3186 }, + { 0x0ef6, 0x318d }, + { 0x0ef7, 0x318e }, + { 0x0ef8, 0x11eb }, + { 0x0ef9, 0x11f0 }, + { 0x0efa, 0x11f9 }, + { 0x0eff, 0x20a9 }, + { 0x13a4, 0x20ac }, + { 0x13bc, 0x0152 }, + { 0x13bd, 0x0153 }, + { 0x13be, 0x0178 }, + { 0x20ac, 0x20ac }, + { 0xfe50, '`' }, + { 0xfe51, 0x00b4 }, + { 0xfe52, '^' }, + { 0xfe53, '~' }, + { 0xfe54, 0x00af }, + { 0xfe55, 0x02d8 }, + { 0xfe56, 0x02d9 }, + { 0xfe57, 0x00a8 }, + { 0xfe58, 0x02da }, + { 0xfe59, 0x02dd }, + { 0xfe5a, 0x02c7 }, + { 0xfe5b, 0x00b8 }, + { 0xfe5c, 0x02db }, + { 0xfe5d, 0x037a }, + { 0xfe5e, 0x309b }, + { 0xfe5f, 0x309c }, + { 0xfe63, '/' }, + { 0xfe64, 0x02bc }, + { 0xfe65, 0x02bd }, + { 0xfe66, 0x02f5 }, + { 0xfe67, 0x02f3 }, + { 0xfe68, 0x02cd }, + { 0xfe69, 0xa788 }, + { 0xfe6a, 0x02f7 }, + { 0xfe6e, ',' }, + { 0xfe6f, 0x00a4 }, + { 0xfe80, 'a' }, /* XK_dead_a */ + { 0xfe81, 'A' }, /* XK_dead_A */ + { 0xfe82, 'e' }, /* XK_dead_e */ + { 0xfe83, 'E' }, /* XK_dead_E */ + { 0xfe84, 'i' }, /* XK_dead_i */ + { 0xfe85, 'I' }, /* XK_dead_I */ + { 0xfe86, 'o' }, /* XK_dead_o */ + { 0xfe87, 'O' }, /* XK_dead_O */ + { 0xfe88, 'u' }, /* XK_dead_u */ + { 0xfe89, 'U' }, /* XK_dead_U */ + { 0xfe8a, 0x0259 }, + { 0xfe8b, 0x018f }, + { 0xfe8c, 0x00b5 }, + { 0xfe90, '_' }, + { 0xfe91, 0x02c8 }, + { 0xfe92, 0x02cc }, + { 0xff80 /*XKB_KEY_KP_Space*/, ' ' }, + { 0xff95 /*XKB_KEY_KP_7*/, 0x0037 }, + { 0xff96 /*XKB_KEY_KP_4*/, 0x0034 }, + { 0xff97 /*XKB_KEY_KP_8*/, 0x0038 }, + { 0xff98 /*XKB_KEY_KP_6*/, 0x0036 }, + { 0xff99 /*XKB_KEY_KP_2*/, 0x0032 }, + { 0xff9a /*XKB_KEY_KP_9*/, 0x0039 }, + { 0xff9b /*XKB_KEY_KP_3*/, 0x0033 }, + { 0xff9c /*XKB_KEY_KP_1*/, 0x0031 }, + { 0xff9d /*XKB_KEY_KP_5*/, 0x0035 }, + { 0xff9e /*XKB_KEY_KP_0*/, 0x0030 }, + { 0xffaa /*XKB_KEY_KP_Multiply*/, '*' }, + { 0xffab /*XKB_KEY_KP_Add*/, '+' }, + { 0xffac /*XKB_KEY_KP_Separator*/, ',' }, + { 0xffad /*XKB_KEY_KP_Subtract*/, '-' }, + { 0xffae /*XKB_KEY_KP_Decimal*/, '.' }, + { 0xffaf /*XKB_KEY_KP_Divide*/, '/' }, + { 0xffb0 /*XKB_KEY_KP_0*/, 0x0030 }, + { 0xffb1 /*XKB_KEY_KP_1*/, 0x0031 }, + { 0xffb2 /*XKB_KEY_KP_2*/, 0x0032 }, + { 0xffb3 /*XKB_KEY_KP_3*/, 0x0033 }, + { 0xffb4 /*XKB_KEY_KP_4*/, 0x0034 }, + { 0xffb5 /*XKB_KEY_KP_5*/, 0x0035 }, + { 0xffb6 /*XKB_KEY_KP_6*/, 0x0036 }, + { 0xffb7 /*XKB_KEY_KP_7*/, 0x0037 }, + { 0xffb8 /*XKB_KEY_KP_8*/, 0x0038 }, + { 0xffb9 /*XKB_KEY_KP_9*/, 0x0039 }, + { 0xffbd /*XKB_KEY_KP_Equal*/, '=' } +}; + +_SOKOL_PRIVATE int _sapp_x11_error_handler(Display* display, XErrorEvent* event) { + _SOKOL_UNUSED(display); + _sapp.x11.error_code = event->error_code; + return 0; +} + +_SOKOL_PRIVATE void _sapp_x11_grab_error_handler(void) { + _sapp.x11.error_code = Success; + XSetErrorHandler(_sapp_x11_error_handler); +} + +_SOKOL_PRIVATE void _sapp_x11_release_error_handler(void) { + XSync(_sapp.x11.display, False); + XSetErrorHandler(NULL); +} + +_SOKOL_PRIVATE void _sapp_x11_init_extensions(void) { + _sapp.x11.UTF8_STRING = XInternAtom(_sapp.x11.display, "UTF8_STRING", False); + _sapp.x11.WM_PROTOCOLS = XInternAtom(_sapp.x11.display, "WM_PROTOCOLS", False); + _sapp.x11.WM_DELETE_WINDOW = XInternAtom(_sapp.x11.display, "WM_DELETE_WINDOW", False); + _sapp.x11.WM_STATE = XInternAtom(_sapp.x11.display, "WM_STATE", False); + _sapp.x11.NET_WM_NAME = XInternAtom(_sapp.x11.display, "_NET_WM_NAME", False); + _sapp.x11.NET_WM_ICON_NAME = XInternAtom(_sapp.x11.display, "_NET_WM_ICON_NAME", False); + _sapp.x11.NET_WM_ICON = XInternAtom(_sapp.x11.display, "_NET_WM_ICON", False); + _sapp.x11.NET_WM_STATE = XInternAtom(_sapp.x11.display, "_NET_WM_STATE", False); + _sapp.x11.NET_WM_STATE_FULLSCREEN = XInternAtom(_sapp.x11.display, "_NET_WM_STATE_FULLSCREEN", False); + if (_sapp.drop.enabled) { + _sapp.x11.xdnd.XdndAware = XInternAtom(_sapp.x11.display, "XdndAware", False); + _sapp.x11.xdnd.XdndEnter = XInternAtom(_sapp.x11.display, "XdndEnter", False); + _sapp.x11.xdnd.XdndPosition = XInternAtom(_sapp.x11.display, "XdndPosition", False); + _sapp.x11.xdnd.XdndStatus = XInternAtom(_sapp.x11.display, "XdndStatus", False); + _sapp.x11.xdnd.XdndActionCopy = XInternAtom(_sapp.x11.display, "XdndActionCopy", False); + _sapp.x11.xdnd.XdndDrop = XInternAtom(_sapp.x11.display, "XdndDrop", False); + _sapp.x11.xdnd.XdndFinished = XInternAtom(_sapp.x11.display, "XdndFinished", False); + _sapp.x11.xdnd.XdndSelection = XInternAtom(_sapp.x11.display, "XdndSelection", False); + _sapp.x11.xdnd.XdndTypeList = XInternAtom(_sapp.x11.display, "XdndTypeList", False); + _sapp.x11.xdnd.text_uri_list = XInternAtom(_sapp.x11.display, "text/uri-list", False); + } + + /* check Xi extension for raw mouse input */ + if (XQueryExtension(_sapp.x11.display, "XInputExtension", &_sapp.x11.xi.major_opcode, &_sapp.x11.xi.event_base, &_sapp.x11.xi.error_base)) { + _sapp.x11.xi.major = 2; + _sapp.x11.xi.minor = 0; + if (XIQueryVersion(_sapp.x11.display, &_sapp.x11.xi.major, &_sapp.x11.xi.minor) == Success) { + _sapp.x11.xi.available = true; + } + } +} + +_SOKOL_PRIVATE void _sapp_x11_query_system_dpi(void) { + /* from GLFW: + + NOTE: Default to the display-wide DPI as we don't currently have a policy + for which monitor a window is considered to be on + + _sapp.x11.dpi = DisplayWidth(_sapp.x11.display, _sapp.x11.screen) * + 25.4f / DisplayWidthMM(_sapp.x11.display, _sapp.x11.screen); + + NOTE: Basing the scale on Xft.dpi where available should provide the most + consistent user experience (matches Qt, Gtk, etc), although not + always the most accurate one + */ + char* rms = XResourceManagerString(_sapp.x11.display); + if (rms) { + XrmDatabase db = XrmGetStringDatabase(rms); + if (db) { + XrmValue value; + char* type = NULL; + if (XrmGetResource(db, "Xft.dpi", "Xft.Dpi", &type, &value)) { + if (type && strcmp(type, "String") == 0) { + _sapp.x11.dpi = atof(value.addr); + } + } + XrmDestroyDatabase(db); + } + } +} + +_SOKOL_PRIVATE bool _sapp_glx_has_ext(const char* ext, const char* extensions) { + SOKOL_ASSERT(ext); + const char* start = extensions; + while (true) { + const char* where = strstr(start, ext); + if (!where) { + return false; + } + const char* terminator = where + strlen(ext); + if ((where == start) || (*(where - 1) == ' ')) { + if (*terminator == ' ' || *terminator == '\0') { + break; + } + } + start = terminator; + } + return true; +} + +_SOKOL_PRIVATE bool _sapp_glx_extsupported(const char* ext, const char* extensions) { + if (extensions) { + return _sapp_glx_has_ext(ext, extensions); + } + else { + return false; + } +} + +_SOKOL_PRIVATE void* _sapp_glx_getprocaddr(const char* procname) +{ + if (_sapp.glx.GetProcAddress) { + return (void*) _sapp.glx.GetProcAddress(procname); + } + else if (_sapp.glx.GetProcAddressARB) { + return (void*) _sapp.glx.GetProcAddressARB(procname); + } + else { + return dlsym(_sapp.glx.libgl, procname); + } +} + +_SOKOL_PRIVATE void _sapp_glx_init() { + const char* sonames[] = { "libGL.so.1", "libGL.so", 0 }; + for (int i = 0; sonames[i]; i++) { + _sapp.glx.libgl = dlopen(sonames[i], RTLD_LAZY|RTLD_GLOBAL); + if (_sapp.glx.libgl) { + break; + } + } + if (!_sapp.glx.libgl) { + _sapp_fail("GLX: failed to load libGL"); + } + _sapp.glx.GetFBConfigs = (PFNGLXGETFBCONFIGSPROC) dlsym(_sapp.glx.libgl, "glXGetFBConfigs"); + _sapp.glx.GetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC) dlsym(_sapp.glx.libgl, "glXGetFBConfigAttrib"); + _sapp.glx.GetClientString = (PFNGLXGETCLIENTSTRINGPROC) dlsym(_sapp.glx.libgl, "glXGetClientString"); + _sapp.glx.QueryExtension = (PFNGLXQUERYEXTENSIONPROC) dlsym(_sapp.glx.libgl, "glXQueryExtension"); + _sapp.glx.QueryVersion = (PFNGLXQUERYVERSIONPROC) dlsym(_sapp.glx.libgl, "glXQueryVersion"); + _sapp.glx.DestroyContext = (PFNGLXDESTROYCONTEXTPROC) dlsym(_sapp.glx.libgl, "glXDestroyContext"); + _sapp.glx.MakeCurrent = (PFNGLXMAKECURRENTPROC) dlsym(_sapp.glx.libgl, "glXMakeCurrent"); + _sapp.glx.SwapBuffers = (PFNGLXSWAPBUFFERSPROC) dlsym(_sapp.glx.libgl, "glXSwapBuffers"); + _sapp.glx.QueryExtensionsString = (PFNGLXQUERYEXTENSIONSSTRINGPROC) dlsym(_sapp.glx.libgl, "glXQueryExtensionsString"); + _sapp.glx.CreateWindow = (PFNGLXCREATEWINDOWPROC) dlsym(_sapp.glx.libgl, "glXCreateWindow"); + _sapp.glx.DestroyWindow = (PFNGLXDESTROYWINDOWPROC) dlsym(_sapp.glx.libgl, "glXDestroyWindow"); + _sapp.glx.GetProcAddress = (PFNGLXGETPROCADDRESSPROC) dlsym(_sapp.glx.libgl, "glXGetProcAddress"); + _sapp.glx.GetProcAddressARB = (PFNGLXGETPROCADDRESSPROC) dlsym(_sapp.glx.libgl, "glXGetProcAddressARB"); + _sapp.glx.GetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC) dlsym(_sapp.glx.libgl, "glXGetVisualFromFBConfig"); + if (!_sapp.glx.GetFBConfigs || + !_sapp.glx.GetFBConfigAttrib || + !_sapp.glx.GetClientString || + !_sapp.glx.QueryExtension || + !_sapp.glx.QueryVersion || + !_sapp.glx.DestroyContext || + !_sapp.glx.MakeCurrent || + !_sapp.glx.SwapBuffers || + !_sapp.glx.QueryExtensionsString || + !_sapp.glx.CreateWindow || + !_sapp.glx.DestroyWindow || + !_sapp.glx.GetProcAddress || + !_sapp.glx.GetProcAddressARB || + !_sapp.glx.GetVisualFromFBConfig) + { + _sapp_fail("GLX: failed to load required entry points"); + } + + if (!_sapp.glx.QueryExtension(_sapp.x11.display, &_sapp.glx.error_base, &_sapp.glx.event_base)) { + _sapp_fail("GLX: GLX extension not found"); + } + if (!_sapp.glx.QueryVersion(_sapp.x11.display, &_sapp.glx.major, &_sapp.glx.minor)) { + _sapp_fail("GLX: Failed to query GLX version"); + } + if (_sapp.glx.major == 1 && _sapp.glx.minor < 3) { + _sapp_fail("GLX: GLX version 1.3 is required"); + } + const char* exts = _sapp.glx.QueryExtensionsString(_sapp.x11.display, _sapp.x11.screen); + if (_sapp_glx_extsupported("GLX_EXT_swap_control", exts)) { + _sapp.glx.SwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC) _sapp_glx_getprocaddr("glXSwapIntervalEXT"); + _sapp.glx.EXT_swap_control = 0 != _sapp.glx.SwapIntervalEXT; + } + if (_sapp_glx_extsupported("GLX_MESA_swap_control", exts)) { + _sapp.glx.SwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC) _sapp_glx_getprocaddr("glXSwapIntervalMESA"); + _sapp.glx.MESA_swap_control = 0 != _sapp.glx.SwapIntervalMESA; + } + _sapp.glx.ARB_multisample = _sapp_glx_extsupported("GLX_ARB_multisample", exts); + if (_sapp_glx_extsupported("GLX_ARB_create_context", exts)) { + _sapp.glx.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) _sapp_glx_getprocaddr("glXCreateContextAttribsARB"); + _sapp.glx.ARB_create_context = 0 != _sapp.glx.CreateContextAttribsARB; + } + _sapp.glx.ARB_create_context_profile = _sapp_glx_extsupported("GLX_ARB_create_context_profile", exts); +} + +_SOKOL_PRIVATE int _sapp_glx_attrib(GLXFBConfig fbconfig, int attrib) { + int value; + _sapp.glx.GetFBConfigAttrib(_sapp.x11.display, fbconfig, attrib, &value); + return value; +} + +_SOKOL_PRIVATE GLXFBConfig _sapp_glx_choosefbconfig() { + GLXFBConfig* native_configs; + _sapp_gl_fbconfig* usable_configs; + const _sapp_gl_fbconfig* closest; + int i, native_count, usable_count; + const char* vendor; + bool trust_window_bit = true; + + /* HACK: This is a (hopefully temporary) workaround for Chromium + (VirtualBox GL) not setting the window bit on any GLXFBConfigs + */ + vendor = _sapp.glx.GetClientString(_sapp.x11.display, GLX_VENDOR); + if (vendor && strcmp(vendor, "Chromium") == 0) { + trust_window_bit = false; + } + + native_configs = _sapp.glx.GetFBConfigs(_sapp.x11.display, _sapp.x11.screen, &native_count); + if (!native_configs || !native_count) { + _sapp_fail("GLX: No GLXFBConfigs returned"); + } + + usable_configs = (_sapp_gl_fbconfig*) SOKOL_CALLOC((size_t)native_count, sizeof(_sapp_gl_fbconfig)); + usable_count = 0; + for (i = 0; i < native_count; i++) { + const GLXFBConfig n = native_configs[i]; + _sapp_gl_fbconfig* u = usable_configs + usable_count; + _sapp_gl_init_fbconfig(u); + + /* Only consider RGBA GLXFBConfigs */ + if (0 == (_sapp_glx_attrib(n, GLX_RENDER_TYPE) & GLX_RGBA_BIT)) { + continue; + } + /* Only consider window GLXFBConfigs */ + if (0 == (_sapp_glx_attrib(n, GLX_DRAWABLE_TYPE) & GLX_WINDOW_BIT)) { + if (trust_window_bit) { + continue; + } + } + u->red_bits = _sapp_glx_attrib(n, GLX_RED_SIZE); + u->green_bits = _sapp_glx_attrib(n, GLX_GREEN_SIZE); + u->blue_bits = _sapp_glx_attrib(n, GLX_BLUE_SIZE); + u->alpha_bits = _sapp_glx_attrib(n, GLX_ALPHA_SIZE); + u->depth_bits = _sapp_glx_attrib(n, GLX_DEPTH_SIZE); + u->stencil_bits = _sapp_glx_attrib(n, GLX_STENCIL_SIZE); + if (_sapp_glx_attrib(n, GLX_DOUBLEBUFFER)) { + u->doublebuffer = true; + } + if (_sapp.glx.ARB_multisample) { + u->samples = _sapp_glx_attrib(n, GLX_SAMPLES); + } + u->handle = (uintptr_t) n; + usable_count++; + } + _sapp_gl_fbconfig desired; + _sapp_gl_init_fbconfig(&desired); + desired.red_bits = 8; + desired.green_bits = 8; + desired.blue_bits = 8; + desired.alpha_bits = 8; + desired.depth_bits = 24; + desired.stencil_bits = 8; + desired.doublebuffer = true; + desired.samples = _sapp.sample_count > 1 ? _sapp.sample_count : 0; + closest = _sapp_gl_choose_fbconfig(&desired, usable_configs, usable_count); + GLXFBConfig result = 0; + if (closest) { + result = (GLXFBConfig) closest->handle; + } + XFree(native_configs); + SOKOL_FREE(usable_configs); + return result; +} + +_SOKOL_PRIVATE void _sapp_glx_choose_visual(Visual** visual, int* depth) { + GLXFBConfig native = _sapp_glx_choosefbconfig(); + if (0 == native) { + _sapp_fail("GLX: Failed to find a suitable GLXFBConfig"); + } + XVisualInfo* result = _sapp.glx.GetVisualFromFBConfig(_sapp.x11.display, native); + if (!result) { + _sapp_fail("GLX: Failed to retrieve Visual for GLXFBConfig"); + } + *visual = result->visual; + *depth = result->depth; + XFree(result); +} + +_SOKOL_PRIVATE void _sapp_glx_create_context(void) { + GLXFBConfig native = _sapp_glx_choosefbconfig(); + if (0 == native){ + _sapp_fail("GLX: Failed to find a suitable GLXFBConfig (2)"); + } + if (!(_sapp.glx.ARB_create_context && _sapp.glx.ARB_create_context_profile)) { + _sapp_fail("GLX: ARB_create_context and ARB_create_context_profile required"); + } + _sapp_x11_grab_error_handler(); + const int attribs[] = { + GLX_CONTEXT_MAJOR_VERSION_ARB, 3, + GLX_CONTEXT_MINOR_VERSION_ARB, 3, + GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, + GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, + 0, 0 + }; + _sapp.glx.ctx = _sapp.glx.CreateContextAttribsARB(_sapp.x11.display, native, NULL, True, attribs); + if (!_sapp.glx.ctx) { + _sapp_fail("GLX: failed to create GL context"); + } + _sapp_x11_release_error_handler(); + _sapp.glx.window = _sapp.glx.CreateWindow(_sapp.x11.display, native, _sapp.x11.window, NULL); + if (!_sapp.glx.window) { + _sapp_fail("GLX: failed to create window"); + } +} + +_SOKOL_PRIVATE void _sapp_glx_destroy_context(void) { + if (_sapp.glx.window) { + _sapp.glx.DestroyWindow(_sapp.x11.display, _sapp.glx.window); + _sapp.glx.window = 0; + } + if (_sapp.glx.ctx) { + _sapp.glx.DestroyContext(_sapp.x11.display, _sapp.glx.ctx); + _sapp.glx.ctx = 0; + } +} + +_SOKOL_PRIVATE void _sapp_glx_make_current(void) { + _sapp.glx.MakeCurrent(_sapp.x11.display, _sapp.glx.window, _sapp.glx.ctx); +} + +_SOKOL_PRIVATE void _sapp_glx_swap_buffers(void) { + _sapp.glx.SwapBuffers(_sapp.x11.display, _sapp.glx.window); +} + +_SOKOL_PRIVATE void _sapp_glx_swapinterval(int interval) { + _sapp_glx_make_current(); + if (_sapp.glx.EXT_swap_control) { + _sapp.glx.SwapIntervalEXT(_sapp.x11.display, _sapp.glx.window, interval); + } + else if (_sapp.glx.MESA_swap_control) { + _sapp.glx.SwapIntervalMESA(interval); + } +} + +_SOKOL_PRIVATE void _sapp_x11_send_event(Atom type, int a, int b, int c, int d, int e) { + XEvent event; + memset(&event, 0, sizeof(event)); + + event.type = ClientMessage; + event.xclient.window = _sapp.x11.window; + event.xclient.format = 32; + event.xclient.message_type = type; + event.xclient.data.l[0] = a; + event.xclient.data.l[1] = b; + event.xclient.data.l[2] = c; + event.xclient.data.l[3] = d; + event.xclient.data.l[4] = e; + + XSendEvent(_sapp.x11.display, _sapp.x11.root, + False, + SubstructureNotifyMask | SubstructureRedirectMask, + &event); +} + +_SOKOL_PRIVATE void _sapp_x11_query_window_size(void) { + XWindowAttributes attribs; + XGetWindowAttributes(_sapp.x11.display, _sapp.x11.window, &attribs); + _sapp.window_width = attribs.width; + _sapp.window_height = attribs.height; + _sapp.framebuffer_width = _sapp.window_width; + _sapp.framebuffer_height = _sapp.window_height; +} + +_SOKOL_PRIVATE void _sapp_x11_set_fullscreen(bool enable) { + /* NOTE: this function must be called after XMapWindow (which happens in _sapp_x11_show_window()) */ + if (_sapp.x11.NET_WM_STATE && _sapp.x11.NET_WM_STATE_FULLSCREEN) { + if (enable) { + const int _NET_WM_STATE_ADD = 1; + _sapp_x11_send_event(_sapp.x11.NET_WM_STATE, + _NET_WM_STATE_ADD, + _sapp.x11.NET_WM_STATE_FULLSCREEN, + 0, 1, 0); + } + else { + const int _NET_WM_STATE_REMOVE = 0; + _sapp_x11_send_event(_sapp.x11.NET_WM_STATE, + _NET_WM_STATE_REMOVE, + _sapp.x11.NET_WM_STATE_FULLSCREEN, + 0, 1, 0); + } + } + XFlush(_sapp.x11.display); +} + +_SOKOL_PRIVATE void _sapp_x11_create_hidden_cursor(void) { + SOKOL_ASSERT(0 == _sapp.x11.hidden_cursor); + const int w = 16; + const int h = 16; + XcursorImage* img = XcursorImageCreate(w, h); + SOKOL_ASSERT(img && (img->width == 16) && (img->height == 16) && img->pixels); + img->xhot = 0; + img->yhot = 0; + const size_t num_bytes = (size_t)(w * h) * sizeof(XcursorPixel); + memset(img->pixels, 0, num_bytes); + _sapp.x11.hidden_cursor = XcursorImageLoadCursor(_sapp.x11.display, img); + XcursorImageDestroy(img); +} + +_SOKOL_PRIVATE void _sapp_x11_toggle_fullscreen(void) { + _sapp.fullscreen = !_sapp.fullscreen; + _sapp_x11_set_fullscreen(_sapp.fullscreen); + _sapp_x11_query_window_size(); +} + +_SOKOL_PRIVATE void _sapp_x11_show_mouse(bool show) { + if (show) { + XUndefineCursor(_sapp.x11.display, _sapp.x11.window); + } + else { + XDefineCursor(_sapp.x11.display, _sapp.x11.window, _sapp.x11.hidden_cursor); + } +} + +_SOKOL_PRIVATE void _sapp_x11_lock_mouse(bool lock) { + if (lock == _sapp.mouse.locked) { + return; + } + _sapp.mouse.dx = 0.0f; + _sapp.mouse.dy = 0.0f; + _sapp.mouse.locked = lock; + if (_sapp.mouse.locked) { + if (_sapp.x11.xi.available) { + XIEventMask em; + unsigned char mask[XIMaskLen(XI_RawMotion)] = { 0 }; // XIMaskLen is a macro + em.deviceid = XIAllMasterDevices; + em.mask_len = sizeof(mask); + em.mask = mask; + XISetMask(mask, XI_RawMotion); + XISelectEvents(_sapp.x11.display, _sapp.x11.root, &em, 1); + } + XGrabPointer(_sapp.x11.display, // display + _sapp.x11.window, // grab_window + True, // owner_events + ButtonPressMask | ButtonReleaseMask | PointerMotionMask, // event_mask + GrabModeAsync, // pointer_mode + GrabModeAsync, // keyboard_mode + _sapp.x11.window, // confine_to + _sapp.x11.hidden_cursor, // cursor + CurrentTime); // time + } + else { + if (_sapp.x11.xi.available) { + XIEventMask em; + unsigned char mask[] = { 0 }; + em.deviceid = XIAllMasterDevices; + em.mask_len = sizeof(mask); + em.mask = mask; + XISelectEvents(_sapp.x11.display, _sapp.x11.root, &em, 1); + } + XWarpPointer(_sapp.x11.display, None, _sapp.x11.window, 0, 0, 0, 0, (int) _sapp.mouse.x, _sapp.mouse.y); + XUngrabPointer(_sapp.x11.display, CurrentTime); + } + XFlush(_sapp.x11.display); +} + +_SOKOL_PRIVATE void _sapp_x11_update_window_title(void) { + Xutf8SetWMProperties(_sapp.x11.display, + _sapp.x11.window, + _sapp.window_title, _sapp.window_title, + NULL, 0, NULL, NULL, NULL); + XChangeProperty(_sapp.x11.display, _sapp.x11.window, + _sapp.x11.NET_WM_NAME, _sapp.x11.UTF8_STRING, 8, + PropModeReplace, + (unsigned char*)_sapp.window_title, + strlen(_sapp.window_title)); + XChangeProperty(_sapp.x11.display, _sapp.x11.window, + _sapp.x11.NET_WM_ICON_NAME, _sapp.x11.UTF8_STRING, 8, + PropModeReplace, + (unsigned char*)_sapp.window_title, + strlen(_sapp.window_title)); + XFlush(_sapp.x11.display); +} + +_SOKOL_PRIVATE void _sapp_x11_set_icon(const sapp_icon_desc* icon_desc, int num_images) { + SOKOL_ASSERT((num_images > 0) && (num_images <= SAPP_MAX_ICONIMAGES)); + int long_count = 0; + for (int i = 0; i < num_images; i++) { + const sapp_image_desc* img_desc = &icon_desc->images[i]; + long_count += 2 + (img_desc->width * img_desc->height); + } + long* icon_data = (long*) SOKOL_CALLOC((size_t)long_count, sizeof(long)); + SOKOL_ASSERT(icon_data); + long* dst = icon_data; + for (int img_index = 0; img_index < num_images; img_index++) { + const sapp_image_desc* img_desc = &icon_desc->images[img_index]; + const uint8_t* src = (const uint8_t*) img_desc->pixels.ptr; + *dst++ = img_desc->width; + *dst++ = img_desc->height; + const int num_pixels = img_desc->width * img_desc->height; + for (int pixel_index = 0; pixel_index < num_pixels; pixel_index++) { + *dst++ = ((long)(src[pixel_index * 4 + 0]) << 16) | + ((long)(src[pixel_index * 4 + 1]) << 8) | + ((long)(src[pixel_index * 4 + 2]) << 0) | + ((long)(src[pixel_index * 4 + 3]) << 24); + } + } + XChangeProperty(_sapp.x11.display, _sapp.x11.window, + _sapp.x11.NET_WM_ICON, + XA_CARDINAL, 32, + PropModeReplace, + (unsigned char*)icon_data, + long_count); + SOKOL_FREE(icon_data); + XFlush(_sapp.x11.display); +} + +_SOKOL_PRIVATE void _sapp_x11_create_window(Visual* visual, int depth) { + _sapp.x11.colormap = XCreateColormap(_sapp.x11.display, _sapp.x11.root, visual, AllocNone); + XSetWindowAttributes wa; + memset(&wa, 0, sizeof(wa)); + const uint32_t wamask = CWBorderPixel | CWColormap | CWEventMask; + wa.colormap = _sapp.x11.colormap; + wa.border_pixel = 0; + wa.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask | + PointerMotionMask | ButtonPressMask | ButtonReleaseMask | + ExposureMask | FocusChangeMask | VisibilityChangeMask | + EnterWindowMask | LeaveWindowMask | PropertyChangeMask; + _sapp_x11_grab_error_handler(); + _sapp.x11.window = XCreateWindow(_sapp.x11.display, + _sapp.x11.root, + 0, 0, + (uint32_t)_sapp.window_width, + (uint32_t)_sapp.window_height, + 0, /* border width */ + depth, /* color depth */ + InputOutput, + visual, + wamask, + &wa); + _sapp_x11_release_error_handler(); + if (!_sapp.x11.window) { + _sapp_fail("X11: Failed to create window"); + } + Atom protocols[] = { + _sapp.x11.WM_DELETE_WINDOW + }; + XSetWMProtocols(_sapp.x11.display, _sapp.x11.window, protocols, 1); + + XSizeHints* hints = XAllocSizeHints(); + hints->flags |= PWinGravity; + hints->win_gravity = StaticGravity; + XSetWMNormalHints(_sapp.x11.display, _sapp.x11.window, hints); + XFree(hints); + + /* announce support for drag'n'drop */ + if (_sapp.drop.enabled) { + const Atom version = _SAPP_X11_XDND_VERSION; + XChangeProperty(_sapp.x11.display, _sapp.x11.window, _sapp.x11.xdnd.XdndAware, XA_ATOM, 32, PropModeReplace, (unsigned char*) &version, 1); + } + + _sapp_x11_update_window_title(); +} + +_SOKOL_PRIVATE void _sapp_x11_destroy_window(void) { + if (_sapp.x11.window) { + XUnmapWindow(_sapp.x11.display, _sapp.x11.window); + XDestroyWindow(_sapp.x11.display, _sapp.x11.window); + _sapp.x11.window = 0; + } + if (_sapp.x11.colormap) { + XFreeColormap(_sapp.x11.display, _sapp.x11.colormap); + _sapp.x11.colormap = 0; + } + XFlush(_sapp.x11.display); +} + +_SOKOL_PRIVATE bool _sapp_x11_window_visible(void) { + XWindowAttributes wa; + XGetWindowAttributes(_sapp.x11.display, _sapp.x11.window, &wa); + return wa.map_state == IsViewable; +} + +_SOKOL_PRIVATE void _sapp_x11_show_window(void) { + if (!_sapp_x11_window_visible()) { + XMapWindow(_sapp.x11.display, _sapp.x11.window); + XRaiseWindow(_sapp.x11.display, _sapp.x11.window); + XFlush(_sapp.x11.display); + } +} + +_SOKOL_PRIVATE void _sapp_x11_hide_window(void) { + XUnmapWindow(_sapp.x11.display, _sapp.x11.window); + XFlush(_sapp.x11.display); +} + +_SOKOL_PRIVATE unsigned long _sapp_x11_get_window_property(Window window, Atom property, Atom type, unsigned char** value) { + Atom actualType; + int actualFormat; + unsigned long itemCount, bytesAfter; + XGetWindowProperty(_sapp.x11.display, + window, + property, + 0, + LONG_MAX, + False, + type, + &actualType, + &actualFormat, + &itemCount, + &bytesAfter, + value); + return itemCount; +} + +_SOKOL_PRIVATE int _sapp_x11_get_window_state(void) { + int result = WithdrawnState; + struct { + CARD32 state; + Window icon; + } *state = NULL; + + if (_sapp_x11_get_window_property(_sapp.x11.window, _sapp.x11.WM_STATE, _sapp.x11.WM_STATE, (unsigned char**)&state) >= 2) { + result = (int)state->state; + } + if (state) { + XFree(state); + } + return result; +} + +_SOKOL_PRIVATE uint32_t _sapp_x11_key_modifier_bit(sapp_keycode key) { + switch (key) { + case SAPP_KEYCODE_LEFT_SHIFT: + case SAPP_KEYCODE_RIGHT_SHIFT: + return SAPP_MODIFIER_SHIFT; + case SAPP_KEYCODE_LEFT_CONTROL: + case SAPP_KEYCODE_RIGHT_CONTROL: + return SAPP_MODIFIER_CTRL; + case SAPP_KEYCODE_LEFT_ALT: + case SAPP_KEYCODE_RIGHT_ALT: + return SAPP_MODIFIER_ALT; + case SAPP_KEYCODE_LEFT_SUPER: + case SAPP_KEYCODE_RIGHT_SUPER: + return SAPP_MODIFIER_SUPER; + default: + return 0; + } +} + +_SOKOL_PRIVATE uint32_t _sapp_x11_button_modifier_bit(sapp_mousebutton btn) { + switch (btn) { + case SAPP_MOUSEBUTTON_LEFT: return SAPP_MODIFIER_LMB; + case SAPP_MOUSEBUTTON_RIGHT: return SAPP_MODIFIER_RMB; + case SAPP_MOUSEBUTTON_MIDDLE: return SAPP_MODIFIER_MMB; + default: return 0; + } +} + +_SOKOL_PRIVATE uint32_t _sapp_x11_mods(uint32_t x11_mods) { + uint32_t mods = 0; + if (x11_mods & ShiftMask) { + mods |= SAPP_MODIFIER_SHIFT; + } + if (x11_mods & ControlMask) { + mods |= SAPP_MODIFIER_CTRL; + } + if (x11_mods & Mod1Mask) { + mods |= SAPP_MODIFIER_ALT; + } + if (x11_mods & Mod4Mask) { + mods |= SAPP_MODIFIER_SUPER; + } + if (x11_mods & Button1Mask) { + mods |= SAPP_MODIFIER_LMB; + } + if (x11_mods & Button2Mask) { + mods |= SAPP_MODIFIER_MMB; + } + if (x11_mods & Button3Mask) { + mods |= SAPP_MODIFIER_RMB; + } + return mods; +} + +_SOKOL_PRIVATE void _sapp_x11_app_event(sapp_event_type type) { + if (_sapp_events_enabled()) { + _sapp_init_event(type); + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE sapp_mousebutton _sapp_x11_translate_button(const XEvent* event) { + switch (event->xbutton.button) { + case Button1: return SAPP_MOUSEBUTTON_LEFT; + case Button2: return SAPP_MOUSEBUTTON_MIDDLE; + case Button3: return SAPP_MOUSEBUTTON_RIGHT; + default: return SAPP_MOUSEBUTTON_INVALID; + } +} + +_SOKOL_PRIVATE void _sapp_x11_mouse_event(sapp_event_type type, sapp_mousebutton btn, uint32_t mods) { + if (_sapp_events_enabled()) { + _sapp_init_event(type); + _sapp.event.mouse_button = btn; + _sapp.event.modifiers = mods; + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE void _sapp_x11_scroll_event(float x, float y, uint32_t mods) { + if (_sapp_events_enabled()) { + _sapp_init_event(SAPP_EVENTTYPE_MOUSE_SCROLL); + _sapp.event.modifiers = mods; + _sapp.event.scroll_x = x; + _sapp.event.scroll_y = y; + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE void _sapp_x11_key_event(sapp_event_type type, sapp_keycode key, bool repeat, uint32_t mods) { + if (_sapp_events_enabled()) { + _sapp_init_event(type); + _sapp.event.key_code = key; + _sapp.event.key_repeat = repeat; + _sapp.event.modifiers = mods; + _sapp_call_event(&_sapp.event); + /* check if a CLIPBOARD_PASTED event must be sent too */ + if (_sapp.clipboard.enabled && + (type == SAPP_EVENTTYPE_KEY_DOWN) && + (_sapp.event.modifiers == SAPP_MODIFIER_CTRL) && + (_sapp.event.key_code == SAPP_KEYCODE_V)) + { + _sapp_init_event(SAPP_EVENTTYPE_CLIPBOARD_PASTED); + _sapp_call_event(&_sapp.event); + } + } +} + +_SOKOL_PRIVATE void _sapp_x11_char_event(uint32_t chr, bool repeat, uint32_t mods) { + if (_sapp_events_enabled()) { + _sapp_init_event(SAPP_EVENTTYPE_CHAR); + _sapp.event.char_code = chr; + _sapp.event.key_repeat = repeat; + _sapp.event.modifiers = mods; + _sapp_call_event(&_sapp.event); + } +} + +_SOKOL_PRIVATE sapp_keycode _sapp_x11_translate_key(int scancode) { + int dummy; + KeySym* keysyms = XGetKeyboardMapping(_sapp.x11.display, scancode, 1, &dummy); + SOKOL_ASSERT(keysyms); + KeySym keysym = keysyms[0]; + XFree(keysyms); + switch (keysym) { + case XK_Escape: return SAPP_KEYCODE_ESCAPE; + case XK_Tab: return SAPP_KEYCODE_TAB; + case XK_Shift_L: return SAPP_KEYCODE_LEFT_SHIFT; + case XK_Shift_R: return SAPP_KEYCODE_RIGHT_SHIFT; + case XK_Control_L: return SAPP_KEYCODE_LEFT_CONTROL; + case XK_Control_R: return SAPP_KEYCODE_RIGHT_CONTROL; + case XK_Meta_L: + case XK_Alt_L: return SAPP_KEYCODE_LEFT_ALT; + case XK_Mode_switch: /* Mapped to Alt_R on many keyboards */ + case XK_ISO_Level3_Shift: /* AltGr on at least some machines */ + case XK_Meta_R: + case XK_Alt_R: return SAPP_KEYCODE_RIGHT_ALT; + case XK_Super_L: return SAPP_KEYCODE_LEFT_SUPER; + case XK_Super_R: return SAPP_KEYCODE_RIGHT_SUPER; + case XK_Menu: return SAPP_KEYCODE_MENU; + case XK_Num_Lock: return SAPP_KEYCODE_NUM_LOCK; + case XK_Caps_Lock: return SAPP_KEYCODE_CAPS_LOCK; + case XK_Print: return SAPP_KEYCODE_PRINT_SCREEN; + case XK_Scroll_Lock: return SAPP_KEYCODE_SCROLL_LOCK; + case XK_Pause: return SAPP_KEYCODE_PAUSE; + case XK_Delete: return SAPP_KEYCODE_DELETE; + case XK_BackSpace: return SAPP_KEYCODE_BACKSPACE; + case XK_Return: return SAPP_KEYCODE_ENTER; + case XK_Home: return SAPP_KEYCODE_HOME; + case XK_End: return SAPP_KEYCODE_END; + case XK_Page_Up: return SAPP_KEYCODE_PAGE_UP; + case XK_Page_Down: return SAPP_KEYCODE_PAGE_DOWN; + case XK_Insert: return SAPP_KEYCODE_INSERT; + case XK_Left: return SAPP_KEYCODE_LEFT; + case XK_Right: return SAPP_KEYCODE_RIGHT; + case XK_Down: return SAPP_KEYCODE_DOWN; + case XK_Up: return SAPP_KEYCODE_UP; + case XK_F1: return SAPP_KEYCODE_F1; + case XK_F2: return SAPP_KEYCODE_F2; + case XK_F3: return SAPP_KEYCODE_F3; + case XK_F4: return SAPP_KEYCODE_F4; + case XK_F5: return SAPP_KEYCODE_F5; + case XK_F6: return SAPP_KEYCODE_F6; + case XK_F7: return SAPP_KEYCODE_F7; + case XK_F8: return SAPP_KEYCODE_F8; + case XK_F9: return SAPP_KEYCODE_F9; + case XK_F10: return SAPP_KEYCODE_F10; + case XK_F11: return SAPP_KEYCODE_F11; + case XK_F12: return SAPP_KEYCODE_F12; + case XK_F13: return SAPP_KEYCODE_F13; + case XK_F14: return SAPP_KEYCODE_F14; + case XK_F15: return SAPP_KEYCODE_F15; + case XK_F16: return SAPP_KEYCODE_F16; + case XK_F17: return SAPP_KEYCODE_F17; + case XK_F18: return SAPP_KEYCODE_F18; + case XK_F19: return SAPP_KEYCODE_F19; + case XK_F20: return SAPP_KEYCODE_F20; + case XK_F21: return SAPP_KEYCODE_F21; + case XK_F22: return SAPP_KEYCODE_F22; + case XK_F23: return SAPP_KEYCODE_F23; + case XK_F24: return SAPP_KEYCODE_F24; + case XK_F25: return SAPP_KEYCODE_F25; + + case XK_KP_Divide: return SAPP_KEYCODE_KP_DIVIDE; + case XK_KP_Multiply: return SAPP_KEYCODE_KP_MULTIPLY; + case XK_KP_Subtract: return SAPP_KEYCODE_KP_SUBTRACT; + case XK_KP_Add: return SAPP_KEYCODE_KP_ADD; + + case XK_KP_Insert: return SAPP_KEYCODE_KP_0; + case XK_KP_End: return SAPP_KEYCODE_KP_1; + case XK_KP_Down: return SAPP_KEYCODE_KP_2; + case XK_KP_Page_Down: return SAPP_KEYCODE_KP_3; + case XK_KP_Left: return SAPP_KEYCODE_KP_4; + case XK_KP_Begin: return SAPP_KEYCODE_KP_5; + case XK_KP_Right: return SAPP_KEYCODE_KP_6; + case XK_KP_Home: return SAPP_KEYCODE_KP_7; + case XK_KP_Up: return SAPP_KEYCODE_KP_8; + case XK_KP_Page_Up: return SAPP_KEYCODE_KP_9; + case XK_KP_Delete: return SAPP_KEYCODE_KP_DECIMAL; + case XK_KP_Equal: return SAPP_KEYCODE_KP_EQUAL; + case XK_KP_Enter: return SAPP_KEYCODE_KP_ENTER; + + case XK_a: return SAPP_KEYCODE_A; + case XK_b: return SAPP_KEYCODE_B; + case XK_c: return SAPP_KEYCODE_C; + case XK_d: return SAPP_KEYCODE_D; + case XK_e: return SAPP_KEYCODE_E; + case XK_f: return SAPP_KEYCODE_F; + case XK_g: return SAPP_KEYCODE_G; + case XK_h: return SAPP_KEYCODE_H; + case XK_i: return SAPP_KEYCODE_I; + case XK_j: return SAPP_KEYCODE_J; + case XK_k: return SAPP_KEYCODE_K; + case XK_l: return SAPP_KEYCODE_L; + case XK_m: return SAPP_KEYCODE_M; + case XK_n: return SAPP_KEYCODE_N; + case XK_o: return SAPP_KEYCODE_O; + case XK_p: return SAPP_KEYCODE_P; + case XK_q: return SAPP_KEYCODE_Q; + case XK_r: return SAPP_KEYCODE_R; + case XK_s: return SAPP_KEYCODE_S; + case XK_t: return SAPP_KEYCODE_T; + case XK_u: return SAPP_KEYCODE_U; + case XK_v: return SAPP_KEYCODE_V; + case XK_w: return SAPP_KEYCODE_W; + case XK_x: return SAPP_KEYCODE_X; + case XK_y: return SAPP_KEYCODE_Y; + case XK_z: return SAPP_KEYCODE_Z; + case XK_1: return SAPP_KEYCODE_1; + case XK_2: return SAPP_KEYCODE_2; + case XK_3: return SAPP_KEYCODE_3; + case XK_4: return SAPP_KEYCODE_4; + case XK_5: return SAPP_KEYCODE_5; + case XK_6: return SAPP_KEYCODE_6; + case XK_7: return SAPP_KEYCODE_7; + case XK_8: return SAPP_KEYCODE_8; + case XK_9: return SAPP_KEYCODE_9; + case XK_0: return SAPP_KEYCODE_0; + case XK_space: return SAPP_KEYCODE_SPACE; + case XK_minus: return SAPP_KEYCODE_MINUS; + case XK_equal: return SAPP_KEYCODE_EQUAL; + case XK_bracketleft: return SAPP_KEYCODE_LEFT_BRACKET; + case XK_bracketright: return SAPP_KEYCODE_RIGHT_BRACKET; + case XK_backslash: return SAPP_KEYCODE_BACKSLASH; + case XK_semicolon: return SAPP_KEYCODE_SEMICOLON; + case XK_apostrophe: return SAPP_KEYCODE_APOSTROPHE; + case XK_grave: return SAPP_KEYCODE_GRAVE_ACCENT; + case XK_comma: return SAPP_KEYCODE_COMMA; + case XK_period: return SAPP_KEYCODE_PERIOD; + case XK_slash: return SAPP_KEYCODE_SLASH; + case XK_less: return SAPP_KEYCODE_WORLD_1; /* At least in some layouts... */ + default: return SAPP_KEYCODE_INVALID; + } +} + +_SOKOL_PRIVATE int32_t _sapp_x11_keysym_to_unicode(KeySym keysym) { + int min = 0; + int max = sizeof(_sapp_x11_keysymtab) / sizeof(struct _sapp_x11_codepair) - 1; + int mid; + + /* First check for Latin-1 characters (1:1 mapping) */ + if ((keysym >= 0x0020 && keysym <= 0x007e) || + (keysym >= 0x00a0 && keysym <= 0x00ff)) + { + return keysym; + } + + /* Also check for directly encoded 24-bit UCS characters */ + if ((keysym & 0xff000000) == 0x01000000) { + return keysym & 0x00ffffff; + } + + /* Binary search in table */ + while (max >= min) { + mid = (min + max) / 2; + if (_sapp_x11_keysymtab[mid].keysym < keysym) { + min = mid + 1; + } + else if (_sapp_x11_keysymtab[mid].keysym > keysym) { + max = mid - 1; + } + else { + return _sapp_x11_keysymtab[mid].ucs; + } + } + + /* No matching Unicode value found */ + return -1; +} + +_SOKOL_PRIVATE bool _sapp_x11_parse_dropped_files_list(const char* src) { + SOKOL_ASSERT(src); + SOKOL_ASSERT(_sapp.drop.buffer); + + _sapp_clear_drop_buffer(); + _sapp.drop.num_files = 0; + + /* + src is (potentially percent-encoded) string made of one or multiple paths + separated by \r\n, each path starting with 'file://' + */ + bool err = false; + int src_count = 0; + char src_chr = 0; + char* dst_ptr = _sapp.drop.buffer; + const char* dst_end_ptr = dst_ptr + (_sapp.drop.max_path_length - 1); // room for terminating 0 + while (0 != (src_chr = *src++)) { + src_count++; + char dst_chr = 0; + /* check leading 'file://' */ + if (src_count <= 7) { + if (((src_count == 1) && (src_chr != 'f')) || + ((src_count == 2) && (src_chr != 'i')) || + ((src_count == 3) && (src_chr != 'l')) || + ((src_count == 4) && (src_chr != 'e')) || + ((src_count == 5) && (src_chr != ':')) || + ((src_count == 6) && (src_chr != '/')) || + ((src_count == 7) && (src_chr != '/'))) + { + SOKOL_LOG("sokol_app.h: dropped file URI doesn't start with file://"); + err = true; + break; + } + } + else if (src_chr == '\r') { + // skip + } + else if (src_chr == '\n') { + src_chr = 0; + src_count = 0; + _sapp.drop.num_files++; + // too many files is not an error + if (_sapp.drop.num_files >= _sapp.drop.max_files) { + break; + } + dst_ptr = _sapp.drop.buffer + _sapp.drop.num_files * _sapp.drop.max_path_length; + dst_end_ptr = dst_ptr + (_sapp.drop.max_path_length - 1); + } + else if ((src_chr == '%') && src[0] && src[1]) { + // a percent-encoded byte (most like UTF-8 multibyte sequence) + const char digits[3] = { src[0], src[1], 0 }; + src += 2; + dst_chr = (char) strtol(digits, 0, 16); + } + else { + dst_chr = src_chr; + } + if (dst_chr) { + // dst_end_ptr already has adjustment for terminating zero + if (dst_ptr < dst_end_ptr) { + *dst_ptr++ = dst_chr; + } + else { + SOKOL_LOG("sokol_app.h: dropped file path too long (sapp_desc.max_dropped_file_path_length)"); + err = true; + break; + } + } + } + if (err) { + _sapp_clear_drop_buffer(); + _sapp.drop.num_files = 0; + return false; + } + else { + return true; + } +} + +// XLib manual says keycodes are in the range [8, 255] inclusive. +// https://tronche.com/gui/x/xlib/input/keyboard-encoding.html +static bool _sapp_x11_keycodes[256]; + +_SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) { + Bool filtered = XFilterEvent(event, None); + switch (event->type) { + case GenericEvent: + if (_sapp.mouse.locked && _sapp.x11.xi.available) { + if (event->xcookie.extension == _sapp.x11.xi.major_opcode) { + if (XGetEventData(_sapp.x11.display, &event->xcookie)) { + if (event->xcookie.evtype == XI_RawMotion) { + XIRawEvent* re = (XIRawEvent*) event->xcookie.data; + if (re->valuators.mask_len) { + const double* values = re->raw_values; + if (XIMaskIsSet(re->valuators.mask, 0)) { + _sapp.mouse.dx = (float) *values; + values++; + } + if (XIMaskIsSet(re->valuators.mask, 1)) { + _sapp.mouse.dy = (float) *values; + } + _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xmotion.state)); + } + } + XFreeEventData(_sapp.x11.display, &event->xcookie); + } + } + } + break; + case FocusIn: + // NOTE: ingnoring NotifyGrab and NotifyUngrab is same behaviour as GLFW + if ((event->xfocus.mode != NotifyGrab) && (event->xfocus.mode != NotifyUngrab)) { + _sapp_x11_app_event(SAPP_EVENTTYPE_FOCUSED); + } + break; + case FocusOut: + /* if focus is lost for any reason, and we're in mouse locked mode, disable mouse lock */ + if (_sapp.mouse.locked) { + _sapp_x11_lock_mouse(false); + } + // NOTE: ingnoring NotifyGrab and NotifyUngrab is same behaviour as GLFW + if ((event->xfocus.mode != NotifyGrab) && (event->xfocus.mode != NotifyUngrab)) { + _sapp_x11_app_event(SAPP_EVENTTYPE_UNFOCUSED); + } + break; + case KeyPress: + { + int keycode = (int)event->xkey.keycode; + const sapp_keycode key = _sapp_x11_translate_key(keycode); + bool repeat = _sapp_x11_keycodes[keycode & 0xFF]; + _sapp_x11_keycodes[keycode & 0xFF] = true; + uint32_t mods = _sapp_x11_mods(event->xkey.state); + // X11 doesn't set modifier bit on key down, so emulate that + mods |= _sapp_x11_key_modifier_bit(key); + if (key != SAPP_KEYCODE_INVALID) { + _sapp_x11_key_event(SAPP_EVENTTYPE_KEY_DOWN, key, repeat, mods); + } + KeySym keysym; + XLookupString(&event->xkey, NULL, 0, &keysym, NULL); + int32_t chr = _sapp_x11_keysym_to_unicode(keysym); + if (chr > 0) { + _sapp_x11_char_event((uint32_t)chr, repeat, mods); + } + } + break; + case KeyRelease: + { + int keycode = (int)event->xkey.keycode; + const sapp_keycode key = _sapp_x11_translate_key(keycode); + _sapp_x11_keycodes[keycode & 0xFF] = false; + if (key != SAPP_KEYCODE_INVALID) { + uint32_t mods = _sapp_x11_mods(event->xkey.state); + // X11 doesn't clear modifier bit on key up, so emulate that + mods &= ~_sapp_x11_key_modifier_bit(key); + _sapp_x11_key_event(SAPP_EVENTTYPE_KEY_UP, key, false, mods); + } + } + break; + case ButtonPress: + { + const sapp_mousebutton btn = _sapp_x11_translate_button(event); + uint32_t mods = _sapp_x11_mods(event->xbutton.state); + // X11 doesn't set modifier bit on button down, so emulate that + mods |= _sapp_x11_button_modifier_bit(btn); + if (btn != SAPP_MOUSEBUTTON_INVALID) { + _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_DOWN, btn, mods); + _sapp.x11.mouse_buttons |= (1 << btn); + } + else { + /* might be a scroll event */ + switch (event->xbutton.button) { + case 4: _sapp_x11_scroll_event(0.0f, 1.0f, mods); break; + case 5: _sapp_x11_scroll_event(0.0f, -1.0f, mods); break; + case 6: _sapp_x11_scroll_event(1.0f, 0.0f, mods); break; + case 7: _sapp_x11_scroll_event(-1.0f, 0.0f, mods); break; + } + } + } + break; + case ButtonRelease: + { + const sapp_mousebutton btn = _sapp_x11_translate_button(event); + if (btn != SAPP_MOUSEBUTTON_INVALID) { + uint32_t mods = _sapp_x11_mods(event->xbutton.state); + // X11 doesn't clear modifier bit on button up, so emulate that + mods &= ~_sapp_x11_button_modifier_bit(btn); + _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_UP, btn, mods); + _sapp.x11.mouse_buttons &= ~(1 << btn); + } + } + break; + case EnterNotify: + /* don't send enter/leave events while mouse button held down */ + if (0 == _sapp.x11.mouse_buttons) { + _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_ENTER, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xcrossing.state)); + } + break; + case LeaveNotify: + if (0 == _sapp.x11.mouse_buttons) { + _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_LEAVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xcrossing.state)); + } + break; + case MotionNotify: + if (!_sapp.mouse.locked) { + const float new_x = (float) event->xmotion.x; + const float new_y = (float) event->xmotion.y; + if (_sapp.mouse.pos_valid) { + _sapp.mouse.dx = new_x - _sapp.mouse.x; + _sapp.mouse.dy = new_y - _sapp.mouse.y; + } + _sapp.mouse.x = new_x; + _sapp.mouse.y = new_y; + _sapp.mouse.pos_valid = true; + _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xmotion.state)); + } + break; + case ConfigureNotify: + if ((event->xconfigure.width != _sapp.window_width) || (event->xconfigure.height != _sapp.window_height)) { + _sapp.window_width = event->xconfigure.width; + _sapp.window_height = event->xconfigure.height; + _sapp.framebuffer_width = _sapp.window_width; + _sapp.framebuffer_height = _sapp.window_height; + _sapp_x11_app_event(SAPP_EVENTTYPE_RESIZED); + } + break; + case PropertyNotify: + if (event->xproperty.state == PropertyNewValue) { + if (event->xproperty.atom == _sapp.x11.WM_STATE) { + const int state = _sapp_x11_get_window_state(); + if (state != _sapp.x11.window_state) { + _sapp.x11.window_state = state; + if (state == IconicState) { + _sapp_x11_app_event(SAPP_EVENTTYPE_ICONIFIED); + } + else if (state == NormalState) { + _sapp_x11_app_event(SAPP_EVENTTYPE_RESTORED); + } + } + } + } + break; + case ClientMessage: + if (filtered) { + return; + } + if (event->xclient.message_type == _sapp.x11.WM_PROTOCOLS) { + const Atom protocol = (Atom)event->xclient.data.l[0]; + if (protocol == _sapp.x11.WM_DELETE_WINDOW) { + _sapp.quit_requested = true; + } + } + else if (event->xclient.message_type == _sapp.x11.xdnd.XdndEnter) { + const bool is_list = 0 != (event->xclient.data.l[1] & 1); + _sapp.x11.xdnd.source = (Window)event->xclient.data.l[0]; + _sapp.x11.xdnd.version = event->xclient.data.l[1] >> 24; + _sapp.x11.xdnd.format = None; + if (_sapp.x11.xdnd.version > _SAPP_X11_XDND_VERSION) { + return; + } + uint32_t count = 0; + Atom* formats = 0; + if (is_list) { + count = _sapp_x11_get_window_property(_sapp.x11.xdnd.source, _sapp.x11.xdnd.XdndTypeList, XA_ATOM, (unsigned char**)&formats); + } + else { + count = 3; + formats = (Atom*) event->xclient.data.l + 2; + } + for (uint32_t i = 0; i < count; i++) { + if (formats[i] == _sapp.x11.xdnd.text_uri_list) { + _sapp.x11.xdnd.format = _sapp.x11.xdnd.text_uri_list; + break; + } + } + if (is_list && formats) { + XFree(formats); + } + } + else if (event->xclient.message_type == _sapp.x11.xdnd.XdndDrop) { + if (_sapp.x11.xdnd.version > _SAPP_X11_XDND_VERSION) { + return; + } + Time time = CurrentTime; + if (_sapp.x11.xdnd.format) { + if (_sapp.x11.xdnd.version >= 1) { + time = (Time)event->xclient.data.l[2]; + } + XConvertSelection(_sapp.x11.display, + _sapp.x11.xdnd.XdndSelection, + _sapp.x11.xdnd.format, + _sapp.x11.xdnd.XdndSelection, + _sapp.x11.window, + time); + } + else if (_sapp.x11.xdnd.version >= 2) { + XEvent reply; + memset(&reply, 0, sizeof(reply)); + reply.type = ClientMessage; + reply.xclient.window = _sapp.x11.window; + reply.xclient.message_type = _sapp.x11.xdnd.XdndFinished; + reply.xclient.format = 32; + reply.xclient.data.l[0] = (long)_sapp.x11.window; + reply.xclient.data.l[1] = 0; // drag was rejected + reply.xclient.data.l[2] = None; + XSendEvent(_sapp.x11.display, _sapp.x11.xdnd.source, False, NoEventMask, &reply); + XFlush(_sapp.x11.display); + } + } + else if (event->xclient.message_type == _sapp.x11.xdnd.XdndPosition) { + /* drag operation has moved over the window + FIXME: we could track the mouse position here, but + this isn't implemented on other platforms either so far + */ + if (_sapp.x11.xdnd.version > _SAPP_X11_XDND_VERSION) { + return; + } + XEvent reply; + memset(&reply, 0, sizeof(reply)); + reply.type = ClientMessage; + reply.xclient.window = _sapp.x11.xdnd.source; + reply.xclient.message_type = _sapp.x11.xdnd.XdndStatus; + reply.xclient.format = 32; + reply.xclient.data.l[0] = (long)_sapp.x11.window; + if (_sapp.x11.xdnd.format) { + /* reply that we are ready to copy the dragged data */ + reply.xclient.data.l[1] = 1; // accept with no rectangle + if (_sapp.x11.xdnd.version >= 2) { + reply.xclient.data.l[4] = (long)_sapp.x11.xdnd.XdndActionCopy; + } + } + XSendEvent(_sapp.x11.display, _sapp.x11.xdnd.source, False, NoEventMask, &reply); + XFlush(_sapp.x11.display); + } + break; + case SelectionNotify: + if (event->xselection.property == _sapp.x11.xdnd.XdndSelection) { + char* data = 0; + uint32_t result = _sapp_x11_get_window_property(event->xselection.requestor, + event->xselection.property, + event->xselection.target, + (unsigned char**) &data); + if (_sapp.drop.enabled && result) { + if (_sapp_x11_parse_dropped_files_list(data)) { + if (_sapp_events_enabled()) { + _sapp_init_event(SAPP_EVENTTYPE_FILES_DROPPED); + _sapp_call_event(&_sapp.event); + } + } + } + if (_sapp.x11.xdnd.version >= 2) { + XEvent reply; + memset(&reply, 0, sizeof(reply)); + reply.type = ClientMessage; + reply.xclient.window = _sapp.x11.window; + reply.xclient.message_type = _sapp.x11.xdnd.XdndFinished; + reply.xclient.format = 32; + reply.xclient.data.l[0] = (long)_sapp.x11.window; + reply.xclient.data.l[1] = result; + reply.xclient.data.l[2] = (long)_sapp.x11.xdnd.XdndActionCopy; + XSendEvent(_sapp.x11.display, _sapp.x11.xdnd.source, False, NoEventMask, &reply); + XFlush(_sapp.x11.display); + } + } + break; + case DestroyNotify: + break; + } +} + +_SOKOL_PRIVATE void _sapp_linux_run(const sapp_desc* desc) { + /* The following lines are here to trigger a linker error instead of an + obscure runtime error if the user has forgotten to add -pthread to + the compiler or linker options. They have no other purpose. + */ + pthread_attr_t pthread_attr; + pthread_attr_init(&pthread_attr); + pthread_attr_destroy(&pthread_attr); + + _sapp_init_state(desc); + _sapp.x11.window_state = NormalState; + + XInitThreads(); + XrmInitialize(); + _sapp.x11.display = XOpenDisplay(NULL); + if (!_sapp.x11.display) { + _sapp_fail("XOpenDisplay() failed!\n"); + } + _sapp.x11.screen = DefaultScreen(_sapp.x11.display); + _sapp.x11.root = DefaultRootWindow(_sapp.x11.display); + XkbSetDetectableAutoRepeat(_sapp.x11.display, true, NULL); + _sapp_x11_query_system_dpi(); + _sapp.dpi_scale = _sapp.x11.dpi / 96.0f; + _sapp_x11_init_extensions(); + _sapp_x11_create_hidden_cursor(); + _sapp_glx_init(); + Visual* visual = 0; + int depth = 0; + _sapp_glx_choose_visual(&visual, &depth); + _sapp_x11_create_window(visual, depth); + _sapp_glx_create_context(); + sapp_set_icon(&desc->icon); + _sapp.valid = true; + _sapp_x11_show_window(); + if (_sapp.fullscreen) { + _sapp_x11_set_fullscreen(true); + } + _sapp_x11_query_window_size(); + _sapp_glx_swapinterval(_sapp.swap_interval); + XFlush(_sapp.x11.display); + while (!_sapp.quit_ordered) { + _sapp_glx_make_current(); + int count = XPending(_sapp.x11.display); + while (count--) { + XEvent event; + XNextEvent(_sapp.x11.display, &event); + _sapp_x11_process_event(&event); + } + _sapp_frame(); + _sapp_glx_swap_buffers(); + XFlush(_sapp.x11.display); + /* handle quit-requested, either from window or from sapp_request_quit() */ + if (_sapp.quit_requested && !_sapp.quit_ordered) { + /* give user code a chance to intervene */ + _sapp_x11_app_event(SAPP_EVENTTYPE_QUIT_REQUESTED); + /* if user code hasn't intervened, quit the app */ + if (_sapp.quit_requested) { + _sapp.quit_ordered = true; + } + } + } + _sapp_call_cleanup(); + _sapp_glx_destroy_context(); + _sapp_x11_destroy_window(); + XCloseDisplay(_sapp.x11.display); + _sapp_discard_state(); +} + +#if !defined(SOKOL_NO_ENTRY) +int main(int argc, char* argv[]) { + sapp_desc desc = sokol_main(argc, argv); + _sapp_linux_run(&desc); + return 0; +} +#endif /* SOKOL_NO_ENTRY */ +#endif /* _SAPP_LINUX */ + +/*== PUBLIC API FUNCTIONS ====================================================*/ +#if defined(SOKOL_NO_ENTRY) +SOKOL_API_IMPL void sapp_run(const sapp_desc* desc) { + SOKOL_ASSERT(desc); + #if defined(_SAPP_MACOS) + _sapp_macos_run(desc); + #elif defined(_SAPP_IOS) + _sapp_ios_run(desc); + #elif defined(_SAPP_EMSCRIPTEN) + _sapp_emsc_run(desc); + #elif defined(_SAPP_WIN32) + _sapp_win32_run(desc); + #elif defined(_SAPP_UWP) + _sapp_uwp_run(desc); + #elif defined(_SAPP_LINUX) + _sapp_linux_run(desc); + #else + // calling sapp_run() directly is not supported on Android) + _sapp_fail("sapp_run() not supported on this platform!"); + #endif +} + +/* this is just a stub so the linker doesn't complain */ +sapp_desc sokol_main(int argc, char* argv[]) { + _SOKOL_UNUSED(argc); + _SOKOL_UNUSED(argv); + sapp_desc desc; + memset(&desc, 0, sizeof(desc)); + return desc; +} +#else +/* likewise, in normal mode, sapp_run() is just an empty stub */ +SOKOL_API_IMPL void sapp_run(const sapp_desc* desc) { + _SOKOL_UNUSED(desc); +} +#endif + +SOKOL_API_IMPL bool sapp_isvalid(void) { + return _sapp.valid; +} + +SOKOL_API_IMPL void* sapp_userdata(void) { + return _sapp.desc.user_data; +} + +SOKOL_API_IMPL sapp_desc sapp_query_desc(void) { + return _sapp.desc; +} + +SOKOL_API_IMPL uint64_t sapp_frame_count(void) { + return _sapp.frame_count; +} + +SOKOL_API_IMPL int sapp_width(void) { + return (_sapp.framebuffer_width > 0) ? _sapp.framebuffer_width : 1; +} + +SOKOL_API_IMPL float sapp_widthf(void) { + return (float)sapp_width(); +} + +SOKOL_API_IMPL int sapp_height(void) { + return (_sapp.framebuffer_height > 0) ? _sapp.framebuffer_height : 1; +} + +SOKOL_API_IMPL float sapp_heightf(void) { + return (float)sapp_height(); +} + +SOKOL_API_IMPL int sapp_color_format(void) { + #if defined(_SAPP_EMSCRIPTEN) && defined(SOKOL_WGPU) + switch (_sapp.emsc.wgpu.render_format) { + case WGPUTextureFormat_RGBA8Unorm: + return _SAPP_PIXELFORMAT_RGBA8; + case WGPUTextureFormat_BGRA8Unorm: + return _SAPP_PIXELFORMAT_BGRA8; + default: + SOKOL_UNREACHABLE; + return 0; + } + #elif defined(SOKOL_METAL) || defined(SOKOL_D3D11) + return _SAPP_PIXELFORMAT_BGRA8; + #else + return _SAPP_PIXELFORMAT_RGBA8; + #endif +} + +SOKOL_API_IMPL int sapp_depth_format(void) { + return _SAPP_PIXELFORMAT_DEPTH_STENCIL; +} + +SOKOL_API_IMPL int sapp_sample_count(void) { + return _sapp.sample_count; +} + +SOKOL_API_IMPL bool sapp_high_dpi(void) { + return _sapp.desc.high_dpi && (_sapp.dpi_scale >= 1.5f); +} + +SOKOL_API_IMPL float sapp_dpi_scale(void) { + return _sapp.dpi_scale; +} + +SOKOL_API_IMPL bool sapp_gles2(void) { + return _sapp.gles2_fallback; +} + +SOKOL_API_IMPL void sapp_show_keyboard(bool show) { + #if defined(_SAPP_IOS) + _sapp_ios_show_keyboard(show); + #elif defined(_SAPP_EMSCRIPTEN) + _sapp_emsc_show_keyboard(show); + #elif defined(_SAPP_ANDROID) + _sapp_android_show_keyboard(show); + #else + _SOKOL_UNUSED(show); + #endif +} + +SOKOL_API_IMPL bool sapp_keyboard_shown(void) { + return _sapp.onscreen_keyboard_shown; +} + +SOKOL_API_IMPL bool sapp_is_fullscreen(void) { + return _sapp.fullscreen; +} + +SOKOL_API_IMPL void sapp_toggle_fullscreen(void) { + #if defined(_SAPP_MACOS) + _sapp_macos_toggle_fullscreen(); + #elif defined(_SAPP_WIN32) + _sapp_win32_toggle_fullscreen(); + #elif defined(_SAPP_UWP) + _sapp_uwp_toggle_fullscreen(); + #elif defined(_SAPP_LINUX) + _sapp_x11_toggle_fullscreen(); + #endif +} + +/* NOTE that sapp_show_mouse() does not "stack" like the Win32 or macOS API functions! */ +SOKOL_API_IMPL void sapp_show_mouse(bool show) { + if (_sapp.mouse.shown != show) { + #if defined(_SAPP_MACOS) + _sapp_macos_show_mouse(show); + #elif defined(_SAPP_WIN32) + _sapp_win32_show_mouse(show); + #elif defined(_SAPP_LINUX) + _sapp_x11_show_mouse(show); + #elif defined(_SAPP_UWP) + _sapp_uwp_show_mouse(show); + #endif + _sapp.mouse.shown = show; + } +} + +SOKOL_API_IMPL bool sapp_mouse_shown(void) { + return _sapp.mouse.shown; +} + +SOKOL_API_IMPL void sapp_lock_mouse(bool lock) { + #if defined(_SAPP_MACOS) + _sapp_macos_lock_mouse(lock); + #elif defined(_SAPP_EMSCRIPTEN) + _sapp_emsc_lock_mouse(lock); + #elif defined(_SAPP_WIN32) + _sapp_win32_lock_mouse(lock); + #elif defined(_SAPP_LINUX) + _sapp_x11_lock_mouse(lock); + #else + _sapp.mouse.locked = lock; + #endif +} + +SOKOL_API_IMPL bool sapp_mouse_locked(void) { + return _sapp.mouse.locked; +} + +SOKOL_API_IMPL void sapp_request_quit(void) { + _sapp.quit_requested = true; +} + +SOKOL_API_IMPL void sapp_cancel_quit(void) { + _sapp.quit_requested = false; +} + +SOKOL_API_IMPL void sapp_quit(void) { + _sapp.quit_ordered = true; +} + +SOKOL_API_IMPL void sapp_consume_event(void) { + _sapp.event_consumed = true; +} + +/* NOTE: on HTML5, sapp_set_clipboard_string() must be called from within event handler! */ +SOKOL_API_IMPL void sapp_set_clipboard_string(const char* str) { + SOKOL_ASSERT(_sapp.clipboard.enabled); + if (!_sapp.clipboard.enabled) { + return; + } + SOKOL_ASSERT(str); + #if defined(_SAPP_MACOS) + _sapp_macos_set_clipboard_string(str); + #elif defined(_SAPP_EMSCRIPTEN) + _sapp_emsc_set_clipboard_string(str); + #elif defined(_SAPP_WIN32) + _sapp_win32_set_clipboard_string(str); + #else + /* not implemented */ + #endif + _sapp_strcpy(str, _sapp.clipboard.buffer, _sapp.clipboard.buf_size); +} + +SOKOL_API_IMPL const char* sapp_get_clipboard_string(void) { + SOKOL_ASSERT(_sapp.clipboard.enabled); + if (!_sapp.clipboard.enabled) { + return ""; + } + #if defined(_SAPP_MACOS) + return _sapp_macos_get_clipboard_string(); + #elif defined(_SAPP_EMSCRIPTEN) + return _sapp.clipboard.buffer; + #elif defined(_SAPP_WIN32) + return _sapp_win32_get_clipboard_string(); + #else + /* not implemented */ + return _sapp.clipboard.buffer; + #endif +} + +SOKOL_API_IMPL void sapp_set_window_title(const char* title) { + SOKOL_ASSERT(title); + _sapp_strcpy(title, _sapp.window_title, sizeof(_sapp.window_title)); + #if defined(_SAPP_MACOS) + _sapp_macos_update_window_title(); + #elif defined(_SAPP_WIN32) + _sapp_win32_update_window_title(); + #elif defined(_SAPP_LINUX) + _sapp_x11_update_window_title(); + #endif +} + +SOKOL_API_IMPL void sapp_set_icon(const sapp_icon_desc* desc) { + SOKOL_ASSERT(desc); + if (desc->sokol_default) { + if (0 == _sapp.default_icon_pixels) { + _sapp_setup_default_icon(); + } + SOKOL_ASSERT(0 != _sapp.default_icon_pixels); + desc = &_sapp.default_icon_desc; + } + const int num_images = _sapp_icon_num_images(desc); + if (num_images == 0) { + return; + } + SOKOL_ASSERT((num_images > 0) && (num_images <= SAPP_MAX_ICONIMAGES)); + if (!_sapp_validate_icon_desc(desc, num_images)) { + return; + } + #if defined(_SAPP_MACOS) + _sapp_macos_set_icon(desc, num_images); + #elif defined(_SAPP_WIN32) + _sapp_win32_set_icon(desc, num_images); + #elif defined(_SAPP_LINUX) + _sapp_x11_set_icon(desc, num_images); + #elif defined(_SAPP_EMSCRIPTEN) + _sapp_emsc_set_icon(desc, num_images); + #endif +} + +SOKOL_API_IMPL int sapp_get_num_dropped_files(void) { + SOKOL_ASSERT(_sapp.drop.enabled); + return _sapp.drop.num_files; +} + +SOKOL_API_IMPL const char* sapp_get_dropped_file_path(int index) { + SOKOL_ASSERT(_sapp.drop.enabled); + SOKOL_ASSERT((index >= 0) && (index < _sapp.drop.num_files)); + SOKOL_ASSERT(_sapp.drop.buffer); + if (!_sapp.drop.enabled) { + return ""; + } + if ((index < 0) || (index >= _sapp.drop.max_files)) { + return ""; + } + return (const char*) _sapp_dropped_file_path_ptr(index); +} + +SOKOL_API_IMPL uint32_t sapp_html5_get_dropped_file_size(int index) { + SOKOL_ASSERT(_sapp.drop.enabled); + SOKOL_ASSERT((index >= 0) && (index < _sapp.drop.num_files)); + #if defined(_SAPP_EMSCRIPTEN) + if (!_sapp.drop.enabled) { + return 0; + } + return sapp_js_dropped_file_size(index); + #else + (void)index; + return 0; + #endif +} + +SOKOL_API_IMPL void sapp_html5_fetch_dropped_file(const sapp_html5_fetch_request* request) { + SOKOL_ASSERT(_sapp.drop.enabled); + SOKOL_ASSERT(request); + SOKOL_ASSERT(request->callback); + SOKOL_ASSERT(request->buffer_ptr); + SOKOL_ASSERT(request->buffer_size > 0); + #if defined(_SAPP_EMSCRIPTEN) + const int index = request->dropped_file_index; + sapp_html5_fetch_error error_code = SAPP_HTML5_FETCH_ERROR_NO_ERROR; + if ((index < 0) || (index >= _sapp.drop.num_files)) { + error_code = SAPP_HTML5_FETCH_ERROR_OTHER; + } + if (sapp_html5_get_dropped_file_size(index) > request->buffer_size) { + error_code = SAPP_HTML5_FETCH_ERROR_BUFFER_TOO_SMALL; + } + if (SAPP_HTML5_FETCH_ERROR_NO_ERROR != error_code) { + _sapp_emsc_invoke_fetch_cb(index, + false, // success + (int)error_code, + request->callback, + 0, // fetched_size + request->buffer_ptr, + request->buffer_size, + request->user_data); + } + else { + sapp_js_fetch_dropped_file(index, + request->callback, + request->buffer_ptr, + request->buffer_size, + request->user_data); + } + #else + (void)request; + #endif +} + +SOKOL_API_IMPL const void* sapp_metal_get_device(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(SOKOL_METAL) + #if defined(_SAPP_MACOS) + const void* obj = (__bridge const void*) _sapp.macos.mtl_device; + #else + const void* obj = (__bridge const void*) _sapp.ios.mtl_device; + #endif + SOKOL_ASSERT(obj); + return obj; + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_metal_get_renderpass_descriptor(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(SOKOL_METAL) + #if defined(_SAPP_MACOS) + const void* obj = (__bridge const void*) [_sapp.macos.view currentRenderPassDescriptor]; + #else + const void* obj = (__bridge const void*) [_sapp.ios.view currentRenderPassDescriptor]; + #endif + SOKOL_ASSERT(obj); + return obj; + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_metal_get_drawable(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(SOKOL_METAL) + #if defined(_SAPP_MACOS) + const void* obj = (__bridge const void*) [_sapp.macos.view currentDrawable]; + #else + const void* obj = (__bridge const void*) [_sapp.ios.view currentDrawable]; + #endif + SOKOL_ASSERT(obj); + return obj; + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_macos_get_window(void) { + #if defined(_SAPP_MACOS) + const void* obj = (__bridge const void*) _sapp.macos.window; + SOKOL_ASSERT(obj); + return obj; + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_ios_get_window(void) { + #if defined(_SAPP_IOS) + const void* obj = (__bridge const void*) _sapp.ios.window; + SOKOL_ASSERT(obj); + return obj; + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_d3d11_get_device(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(SOKOL_D3D11) + return _sapp.d3d11.device; + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_d3d11_get_device_context(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(SOKOL_D3D11) + return _sapp.d3d11.device_context; + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_d3d11_get_swap_chain(void) { + SOKOL_ASSERT(_sapp.valid); +#if defined(SOKOL_D3D11) + return _sapp.d3d11.swap_chain; +#else + return 0; +#endif +} + +SOKOL_API_IMPL const void* sapp_d3d11_get_render_target_view(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(SOKOL_D3D11) + if (_sapp.d3d11.msaa_rtv) { + return _sapp.d3d11.msaa_rtv; + } + else { + return _sapp.d3d11.rtv; + } + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_d3d11_get_depth_stencil_view(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(SOKOL_D3D11) + return _sapp.d3d11.dsv; + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_win32_get_hwnd(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(_SAPP_WIN32) + return _sapp.win32.hwnd; + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_wgpu_get_device(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(_SAPP_EMSCRIPTEN) && defined(SOKOL_WGPU) + return (const void*) _sapp.emsc.wgpu.device; + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_wgpu_get_render_view(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(_SAPP_EMSCRIPTEN) && defined(SOKOL_WGPU) + if (_sapp.sample_count > 1) { + return (const void*) _sapp.emsc.wgpu.msaa_view; + } + else { + return (const void*) _sapp.emsc.wgpu.swapchain_view; + } + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_wgpu_get_resolve_view(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(_SAPP_EMSCRIPTEN) && defined(SOKOL_WGPU) + if (_sapp.sample_count > 1) { + return (const void*) _sapp.emsc.wgpu.swapchain_view; + } + else { + return 0; + } + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_wgpu_get_depth_stencil_view(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(_SAPP_EMSCRIPTEN) && defined(SOKOL_WGPU) + return (const void*) _sapp.emsc.wgpu.depth_stencil_view; + #else + return 0; + #endif +} + +SOKOL_API_IMPL const void* sapp_android_get_native_activity(void) { + SOKOL_ASSERT(_sapp.valid); + #if defined(_SAPP_ANDROID) + return (void*)_sapp.android.activity; + #else + return 0; + #endif +} + +SOKOL_API_IMPL void sapp_html5_ask_leave_site(bool ask) { + _sapp.html5_ask_leave_site = ask; +} + +#endif /* SOKOL_APP_IMPL */ diff --git a/modules/ufbx/examples/viewer/external/sokol_gfx.h b/modules/ufbx/examples/viewer/external/sokol_gfx.h new file mode 100644 index 0000000..7005d7f --- /dev/null +++ b/modules/ufbx/examples/viewer/external/sokol_gfx.h @@ -0,0 +1,16066 @@ +#if defined(SOKOL_IMPL) && !defined(SOKOL_GFX_IMPL) +#define SOKOL_GFX_IMPL +#endif +#ifndef SOKOL_GFX_INCLUDED +/* + sokol_gfx.h -- simple 3D API wrapper + + Project URL: https://github.com/floooh/sokol + + Example code: https://github.com/floooh/sokol-samples + + Do this: + #define SOKOL_IMPL or + #define SOKOL_GFX_IMPL + before you include this file in *one* C or C++ file to create the + implementation. + + In the same place define one of the following to select the rendering + backend: + #define SOKOL_GLCORE33 + #define SOKOL_GLES2 + #define SOKOL_GLES3 + #define SOKOL_D3D11 + #define SOKOL_METAL + #define SOKOL_WGPU + #define SOKOL_DUMMY_BACKEND + + I.e. for the GL 3.3 Core Profile it should look like this: + + #include ... + #include ... + #define SOKOL_IMPL + #define SOKOL_GLCORE33 + #include "sokol_gfx.h" + + The dummy backend replaces the platform-specific backend code with empty + stub functions. This is useful for writing tests that need to run on the + command line. + + Optionally provide the following defines with your own implementations: + + SOKOL_ASSERT(c) - your own assert macro (default: assert(c)) + SOKOL_MALLOC(s) - your own malloc function (default: malloc(s)) + SOKOL_FREE(p) - your own free function (default: free(p)) + SOKOL_LOG(msg) - your own logging function (default: puts(msg)) + SOKOL_UNREACHABLE() - a guard macro for unreachable code (default: assert(false)) + SOKOL_GFX_API_DECL - public function declaration prefix (default: extern) + SOKOL_API_DECL - same as SOKOL_GFX_API_DECL + SOKOL_API_IMPL - public function implementation prefix (default: -) + SOKOL_TRACE_HOOKS - enable trace hook callbacks (search below for TRACE HOOKS) + SOKOL_EXTERNAL_GL_LOADER - indicates that you're using your own GL loader, in this case + sokol_gfx.h will not include any platform GL headers and disable + the integrated Win32 GL loader + + If sokol_gfx.h is compiled as a DLL, define the following before + including the declaration or implementation: + + SOKOL_DLL + + On Windows, SOKOL_DLL will define SOKOL_GFX_API_DECL as __declspec(dllexport) + or __declspec(dllimport) as needed. + + If you want to compile without deprecated structs and functions, + define: + + SOKOL_NO_DEPRECATED + + Optionally define the following to force debug checks and validations + even in release mode: + + SOKOL_DEBUG - by default this is defined if _DEBUG is defined + + sokol_gfx DOES NOT: + =================== + - create a window or the 3D-API context/device, you must do this + before sokol_gfx is initialized, and pass any required information + (like 3D device pointers) to the sokol_gfx initialization call + + - present the rendered frame, how this is done exactly usually depends + on how the window and 3D-API context/device was created + + - provide a unified shader language, instead 3D-API-specific shader + source-code or shader-bytecode must be provided (for the "official" + offline shader cross-compiler, see here: + https://github.com/floooh/sokol-tools/blob/master/docs/sokol-shdc.md) + + STEP BY STEP + ============ + --- to initialize sokol_gfx, after creating a window and a 3D-API + context/device, call: + + sg_setup(const sg_desc*) + + --- create resource objects (at least buffers, shaders and pipelines, + and optionally images and passes): + + sg_buffer sg_make_buffer(const sg_buffer_desc*) + sg_image sg_make_image(const sg_image_desc*) + sg_shader sg_make_shader(const sg_shader_desc*) + sg_pipeline sg_make_pipeline(const sg_pipeline_desc*) + sg_pass sg_make_pass(const sg_pass_desc*) + + --- start rendering to the default frame buffer with: + + sg_begin_default_pass(const sg_pass_action* action, int width, int height) + + ...or alternatively with: + + sg_begin_default_passf(const sg_pass_action* action, float width, float height) + + ...which takes the framebuffer width and height as float values. + + --- or start rendering to an offscreen framebuffer with: + + sg_begin_pass(sg_pass pass, const sg_pass_action* action) + + --- set the pipeline state for the next draw call with: + + sg_apply_pipeline(sg_pipeline pip) + + --- fill an sg_bindings struct with the resource bindings for the next + draw call (1..N vertex buffers, 0 or 1 index buffer, 0..N image objects + to use as textures each on the vertex-shader- and fragment-shader-stage + and then call + + sg_apply_bindings(const sg_bindings* bindings) + + to update the resource bindings + + --- optionally update shader uniform data with: + + sg_apply_uniforms(sg_shader_stage stage, int ub_index, const sg_range* data) + + Read the section 'UNIFORM DATA LAYOUT' to learn about the expected memory layout + of the uniform data passed into sg_apply_uniforms(). + + --- kick off a draw call with: + + sg_draw(int base_element, int num_elements, int num_instances) + + The sg_draw() function unifies all the different ways to render primitives + in a single call (indexed vs non-indexed rendering, and instanced vs non-instanced + rendering). In case of indexed rendering, base_element and num_element specify + indices in the currently bound index buffer. In case of non-indexed rendering + base_element and num_elements specify vertices in the currently bound + vertex-buffer(s). To perform instanced rendering, the rendering pipeline + must be setup for instancing (see sg_pipeline_desc below), a separate vertex buffer + containing per-instance data must be bound, and the num_instances parameter + must be > 1. + + --- finish the current rendering pass with: + + sg_end_pass() + + --- when done with the current frame, call + + sg_commit() + + --- at the end of your program, shutdown sokol_gfx with: + + sg_shutdown() + + --- if you need to destroy resources before sg_shutdown(), call: + + sg_destroy_buffer(sg_buffer buf) + sg_destroy_image(sg_image img) + sg_destroy_shader(sg_shader shd) + sg_destroy_pipeline(sg_pipeline pip) + sg_destroy_pass(sg_pass pass) + + --- to set a new viewport rectangle, call + + sg_apply_viewport(int x, int y, int width, int height, bool origin_top_left) + + ...or if you want to specifiy the viewport rectangle with float values: + + sg_apply_viewportf(float x, float y, float width, float height, bool origin_top_left) + + --- to set a new scissor rect, call: + + sg_apply_scissor_rect(int x, int y, int width, int height, bool origin_top_left) + + ...or with float values: + + sg_apply_scissor_rectf(float x, float y, float width, float height, bool origin_top_left) + + Both sg_apply_viewport() and sg_apply_scissor_rect() must be called + inside a rendering pass + + Note that sg_begin_default_pass() and sg_begin_pass() will reset both the + viewport and scissor rectangles to cover the entire framebuffer. + + --- to update (overwrite) the content of buffer and image resources, call: + + sg_update_buffer(sg_buffer buf, const sg_range* data) + sg_update_image(sg_image img, const sg_image_data* data) + + Buffers and images to be updated must have been created with + SG_USAGE_DYNAMIC or SG_USAGE_STREAM + + Only one update per frame is allowed for buffer and image resources when + using the sg_update_*() functions. The rationale is to have a simple + countermeasure to avoid the CPU scribbling over data the GPU is currently + using, or the CPU having to wait for the GPU + + Buffer and image updates can be partial, as long as a rendering + operation only references the valid (updated) data in the + buffer or image. + + --- to append a chunk of data to a buffer resource, call: + + int sg_append_buffer(sg_buffer buf, const sg_range* data) + + The difference to sg_update_buffer() is that sg_append_buffer() + can be called multiple times per frame to append new data to the + buffer piece by piece, optionally interleaved with draw calls referencing + the previously written data. + + sg_append_buffer() returns a byte offset to the start of the + written data, this offset can be assigned to + sg_bindings.vertex_buffer_offsets[n] or + sg_bindings.index_buffer_offset + + Code example: + + for (...) { + const void* data = ...; + const int num_bytes = ...; + int offset = sg_append_buffer(buf, &(sg_range) { .ptr=data, .size=num_bytes }); + bindings.vertex_buffer_offsets[0] = offset; + sg_apply_pipeline(pip); + sg_apply_bindings(&bindings); + sg_apply_uniforms(...); + sg_draw(...); + } + + A buffer to be used with sg_append_buffer() must have been created + with SG_USAGE_DYNAMIC or SG_USAGE_STREAM. + + If the application appends more data to the buffer then fits into + the buffer, the buffer will go into the "overflow" state for the + rest of the frame. + + Any draw calls attempting to render an overflown buffer will be + silently dropped (in debug mode this will also result in a + validation error). + + You can also check manually if a buffer is in overflow-state by calling + + bool sg_query_buffer_overflow(sg_buffer buf) + + NOTE: Due to restrictions in underlying 3D-APIs, appended chunks of + data will be 4-byte aligned in the destination buffer. This means + that there will be gaps in index buffers containing 16-bit indices + when the number of indices in a call to sg_append_buffer() is + odd. This isn't a problem when each call to sg_append_buffer() + is associated with one draw call, but will be problematic when + a single indexed draw call spans several appended chunks of indices. + + --- to check at runtime for optional features, limits and pixelformat support, + call: + + sg_features sg_query_features() + sg_limits sg_query_limits() + sg_pixelformat_info sg_query_pixelformat(sg_pixel_format fmt) + + --- if you need to call into the underlying 3D-API directly, you must call: + + sg_reset_state_cache() + + ...before calling sokol_gfx functions again + + --- you can inspect the original sg_desc structure handed to sg_setup() + by calling sg_query_desc(). This will return an sg_desc struct with + the default values patched in instead of any zero-initialized values + + --- you can inspect various internal resource attributes via: + + sg_buffer_info sg_query_buffer_info(sg_buffer buf) + sg_image_info sg_query_image_info(sg_image img) + sg_shader_info sg_query_shader_info(sg_shader shd) + sg_pipeline_info sg_query_pipeline_info(sg_pipeline pip) + sg_pass_info sg_query_pass_info(sg_pass pass) + + ...please note that the returned info-structs are tied quite closely + to sokol_gfx.h internals, and may change more often than other + public API functions and structs. + + --- you can ask at runtime what backend sokol_gfx.h has been compiled + for, or whether the GLES3 backend had to fall back to GLES2 with: + + sg_backend sg_query_backend(void) + + --- you can query the default resource creation parameters through the functions + + sg_buffer_desc sg_query_buffer_defaults(const sg_buffer_desc* desc) + sg_image_desc sg_query_image_defaults(const sg_image_desc* desc) + sg_shader_desc sg_query_shader_defaults(const sg_shader_desc* desc) + sg_pipeline_desc sg_query_pipeline_defaults(const sg_pipeline_desc* desc) + sg_pass_desc sg_query_pass_defaults(const sg_pass_desc* desc) + + These functions take a pointer to a desc structure which may contain + zero-initialized items for default values. These zero-init values + will be replaced with their concrete values in the returned desc + struct. + + ON INITIALIZATION: + ================== + When calling sg_setup(), a pointer to an sg_desc struct must be provided + which contains initialization options. These options provide two types + of information to sokol-gfx: + + (1) upper bounds and limits needed to allocate various internal + data structures: + - the max number of resources of each type that can + be alive at the same time, this is used for allocating + internal pools + - the max overall size of uniform data that can be + updated per frame, including a worst-case alignment + per uniform update (this worst-case alignment is 256 bytes) + - the max size of all dynamic resource updates (sg_update_buffer, + sg_append_buffer and sg_update_image) per frame + - the max number of entries in the texture sampler cache + (how many unique texture sampler can exist at the same time) + Not all of those limit values are used by all backends, but it is + good practice to provide them none-the-less. + + (2) 3D-API "context information" (sometimes also called "bindings"): + sokol_gfx.h doesn't create or initialize 3D API objects which are + closely related to the presentation layer (this includes the "rendering + device", the swapchain, and any objects which depend on the + swapchain). These API objects (or callback functions to obtain + them, if those objects might change between frames), must + be provided in a nested sg_context_desc struct inside the + sg_desc struct. If sokol_gfx.h is used together with + sokol_app.h, have a look at the sokol_glue.h header which provides + a convenience function to get a sg_context_desc struct filled out + with context information provided by sokol_app.h + + See the documention block of the sg_desc struct below for more information. + + + UNIFORM DATA LAYOUT: + ==================== + NOTE: if you use the sokol-shdc shader compiler tool, you don't need to worry + about the following details. + + The data that's passed into the sg_apply_uniforms() function must adhere to + specific layout rules so that the GPU shader finds the uniform block + items at the right offset. + + For the D3D11 and Metal backends, sokol-gfx only cares about the size of uniform + blocks, but not about the internal layout. The data will just be copied into + a uniform/constant buffer in a single operation and it's up you to arrange the + CPU-side layout so that it matches the GPU side layout. This also means that with + the D3D11 and Metal backends you are not limited to a 'cross-platform' subset + of uniform variable types. + + If you ever only use one of the D3D11, Metal *or* WebGPU backend, you can stop reading here. + + For the GL backends, the internal layout of uniform blocks matters though, + and you are limited to a small number of uniform variable types. This is + because sokol-gfx must be able to locate the uniform block members in order + to upload them to the GPU with glUniformXXX() calls. + + To describe the uniform block layout to sokol-gfx, the following information + must be passed to the sg_make_shader() call in the sg_shader_desc struct: + + - a hint about the used packing rule (either SG_UNIFORMLAYOUT_NATIVE or + SG_UNIFORMLAYOUT_STD140) + - a list of the uniform block members types in the correct order they + appear on the CPU side + + For example if the GLSL shader has the following uniform declarations: + + uniform mat4 mvp; + uniform vec2 offset0; + uniform vec2 offset1; + uniform vec2 offset2; + + ...and on the CPU side, there's a similar C struct: + + typedef struct { + float mvp[16]; + float offset0[2]; + float offset1[2]; + float offset2[2]; + } params_t; + + ...the uniform block description in the sg_shader_desc must look like this: + + sg_shader_desc desc = { + .vs.uniform_blocks[0] = { + .size = sizeof(params_t), + .layout = SG_UNIFORMLAYOUT_NATIVE, // this is the default and can be omitted + .uniforms = { + // order must be the same as in 'params_t': + [0] = { .name = "mvp", .type = SG_UNIFORMTYPE_MAT4 }, + [1] = { .name = "offset0", .type = SG_UNIFORMTYPE_VEC2 }, + [2] = { .name = "offset1", .type = SG_UNIFORMTYPE_VEC2 }, + [3] = { .name = "offset2", .type = SG_UNIFORMTYPE_VEC2 }, + } + } + }; + + With this information sokol-gfx can now compute the correct offsets of the data items + within the uniform block struct. + + The SG_UNIFORMLAYOUT_NATIVE packing rule works fine if only the GL backends are used, + but for proper D3D11/Metal/GL a subset of the std140 layout must be used which is + described in the next section: + + + CROSS-BACKEND COMMON UNIFORM DATA LAYOUT + ======================================== + For cross-platform / cross-3D-backend code it is important that the same uniform block + layout on the CPU side can be used for all sokol-gfx backends. To achieve this, + a common subset of the std140 layout must be used: + + - The uniform block layout hint in sg_shader_desc must be explicitely set to + SG_UNIFORMLAYOUT_STD140. + - Only the following GLSL uniform types can be used (with their associated sokol-gfx enums): + - float => SG_UNIFORMTYPE_FLOAT + - vec2 => SG_UNIFORMTYPE_FLOAT2 + - vec3 => SG_UNIFORMTYPE_FLOAT3 + - vec4 => SG_UNIFORMTYPE_FLOAT4 + - int => SG_UNIFORMTYPE_INT + - ivec2 => SG_UNIFORMTYPE_INT2 + - ivec3 => SG_UNIFORMTYPE_INT3 + - ivec4 => SG_UNIFORMTYPE_INT4 + - mat4 => SG_UNIFORMTYPE_MAT4 + - Alignment for those types must be as follows (in bytes): + - float => 4 + - vec2 => 8 + - vec3 => 16 + - vec4 => 16 + - int => 4 + - ivec2 => 8 + - ivec3 => 16 + - ivec4 => 16 + - mat4 => 16 + - Arrays are only allowed for the following types: vec4, int4, mat4. + + Note that the HLSL cbuffer layout rules are slightly different from the + std140 layout rules, this means that the cbuffer declarations in HLSL code + must be tweaked so that the layout is compatible with std140. + + The by far easiest way to tacke the common uniform block layout problem is + to use the sokol-shdc shader cross-compiler tool! + + + BACKEND-SPECIFIC TOPICS: + ======================== + --- The GL backends need to know about the internal structure of uniform + blocks, and the texture sampler-name and -type. The uniform layout details + are described in the UNIFORM DATA LAYOUT section above. + + // uniform block structure and texture image definition in sg_shader_desc: + sg_shader_desc desc = { + // uniform block description (size and internal structure) + .vs.uniform_blocks[0] = { + ... + }, + // one texture on the fragment-shader-stage, GLES2/WebGL needs name and image type + .fs.images[0] = { .name="tex", .type=SG_IMAGETYPE_ARRAY } + ... + }; + + --- the Metal and D3D11 backends only need to know the size of uniform blocks, + not their internal member structure, and they only need to know + the type of a texture sampler, not its name: + + sg_shader_desc desc = { + .vs.uniform_blocks[0].size = sizeof(params_t), + .fs.images[0].type = SG_IMAGETYPE_ARRAY, + ... + }; + + --- when creating a shader object, GLES2/WebGL need to know the vertex + attribute names as used in the vertex shader: + + sg_shader_desc desc = { + .attrs = { + [0] = { .name="position" }, + [1] = { .name="color1" } + } + }; + + The vertex attribute names provided when creating a shader will be + used later in sg_create_pipeline() for matching the vertex layout + to vertex shader inputs. + + --- on D3D11 you need to provide a semantic name and semantic index in the + shader description struct instead (see the D3D11 documentation on + D3D11_INPUT_ELEMENT_DESC for details): + + sg_shader_desc desc = { + .attrs = { + [0] = { .sem_name="POSITION", .sem_index=0 } + [1] = { .sem_name="COLOR", .sem_index=1 } + } + }; + + The provided semantic information will be used later in sg_create_pipeline() + to match the vertex layout to vertex shader inputs. + + --- on D3D11, and when passing HLSL source code (instead of byte code) to shader + creation, you can optionally define the shader model targets on the vertex + stage: + + sg_shader_Desc desc = { + .vs = { + ... + .d3d11_target = "vs_5_0" + }, + .fs = { + ... + .d3d11_target = "ps_5_0" + } + }; + + The default targets are "ps_4_0" and "fs_4_0". Note that those target names + are only used when compiling shaders from source. They are ignored when + creating a shader from bytecode. + + --- on Metal, GL 3.3 or GLES3/WebGL2, you don't need to provide an attribute + name or semantic name, since vertex attributes can be bound by their slot index + (this is mandatory in Metal, and optional in GL): + + sg_pipeline_desc desc = { + .layout = { + .attrs = { + [0] = { .format=SG_VERTEXFORMAT_FLOAT3 }, + [1] = { .format=SG_VERTEXFORMAT_FLOAT4 } + } + } + }; + + WORKING WITH CONTEXTS + ===================== + sokol-gfx allows to switch between different rendering contexts and + associate resource objects with contexts. This is useful to + create GL applications that render into multiple windows. + + A rendering context keeps track of all resources created while + the context is active. When the context is destroyed, all resources + "belonging to the context" are destroyed as well. + + A default context will be created and activated implicitly in + sg_setup(), and destroyed in sg_shutdown(). So for a typical application + which *doesn't* use multiple contexts, nothing changes, and calling + the context functions isn't necessary. + + Three functions have been added to work with contexts: + + --- sg_context sg_setup_context(): + This must be called once after a GL context has been created and + made active. + + --- void sg_activate_context(sg_context ctx) + This must be called after making a different GL context active. + Apart from 3D-API-specific actions, the call to sg_activate_context() + will internally call sg_reset_state_cache(). + + --- void sg_discard_context(sg_context ctx) + This must be called right before a GL context is destroyed and + will destroy all resources associated with the context (that + have been created while the context was active) The GL context must be + active at the time sg_discard_context(sg_context ctx) is called. + + Also note that resources (buffers, images, shaders and pipelines) must + only be used or destroyed while the same GL context is active that + was also active while the resource was created (an exception is + resource sharing on GL, such resources can be used while + another context is active, but must still be destroyed under + the same context that was active during creation). + + For more information, check out the multiwindow-glfw sample: + + https://github.com/floooh/sokol-samples/blob/master/glfw/multiwindow-glfw.c + + TRACE HOOKS: + ============ + sokol_gfx.h optionally allows to install "trace hook" callbacks for + each public API functions. When a public API function is called, and + a trace hook callback has been installed for this function, the + callback will be invoked with the parameters and result of the function. + This is useful for things like debugging- and profiling-tools, or + keeping track of resource creation and destruction. + + To use the trace hook feature: + + --- Define SOKOL_TRACE_HOOKS before including the implementation. + + --- Setup an sg_trace_hooks structure with your callback function + pointers (keep all function pointers you're not interested + in zero-initialized), optionally set the user_data member + in the sg_trace_hooks struct. + + --- Install the trace hooks by calling sg_install_trace_hooks(), + the return value of this function is another sg_trace_hooks + struct which contains the previously set of trace hooks. + You should keep this struct around, and call those previous + functions pointers from your own trace callbacks for proper + chaining. + + As an example of how trace hooks are used, have a look at the + imgui/sokol_gfx_imgui.h header which implements a realtime + debugging UI for sokol_gfx.h on top of Dear ImGui. + + A NOTE ON PORTABLE PACKED VERTEX FORMATS: + ========================================= + There are two things to consider when using packed + vertex formats like UBYTE4, SHORT2, etc which need to work + across all backends: + + - D3D11 can only convert *normalized* vertex formats to + floating point during vertex fetch, normalized formats + have a trailing 'N', and are "normalized" to a range + -1.0..+1.0 (for the signed formats) or 0.0..1.0 (for the + unsigned formats): + + - SG_VERTEXFORMAT_BYTE4N + - SG_VERTEXFORMAT_UBYTE4N + - SG_VERTEXFORMAT_SHORT2N + - SG_VERTEXFORMAT_USHORT2N + - SG_VERTEXFORMAT_SHORT4N + - SG_VERTEXFORMAT_USHORT4N + + D3D11 will not convert *non-normalized* vertex formats to floating point + vertex shader inputs, those can only be uses with the *ivecn* vertex shader + input types when D3D11 is used as backend (GL and Metal can use both formats) + + - SG_VERTEXFORMAT_BYTE4, + - SG_VERTEXFORMAT_UBYTE4 + - SG_VERTEXFORMAT_SHORT2 + - SG_VERTEXFORMAT_SHORT4 + + - WebGL/GLES2 cannot use integer vertex shader inputs (int or ivecn) + + - SG_VERTEXFORMAT_UINT10_N2 is not supported on WebGL/GLES2 + + So for a vertex input layout which works on all platforms, only use the following + vertex formats, and if needed "expand" the normalized vertex shader + inputs in the vertex shader by multiplying with 127.0, 255.0, 32767.0 or + 65535.0: + + - SG_VERTEXFORMAT_FLOAT, + - SG_VERTEXFORMAT_FLOAT2, + - SG_VERTEXFORMAT_FLOAT3, + - SG_VERTEXFORMAT_FLOAT4, + - SG_VERTEXFORMAT_BYTE4N, + - SG_VERTEXFORMAT_UBYTE4N, + - SG_VERTEXFORMAT_SHORT2N, + - SG_VERTEXFORMAT_USHORT2N + - SG_VERTEXFORMAT_SHORT4N, + - SG_VERTEXFORMAT_USHORT4N + + TODO: + ==== + - talk about asynchronous resource creation + + zlib/libpng license + + Copyright (c) 2018 Andre Weissflog + + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the + use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ +#define SOKOL_GFX_INCLUDED (1) +#include // size_t +#include +#include + +#if defined(SOKOL_API_DECL) && !defined(SOKOL_GFX_API_DECL) +#define SOKOL_GFX_API_DECL SOKOL_API_DECL +#endif +#ifndef SOKOL_GFX_API_DECL +#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_GFX_IMPL) +#define SOKOL_GFX_API_DECL __declspec(dllexport) +#elif defined(_WIN32) && defined(SOKOL_DLL) +#define SOKOL_GFX_API_DECL __declspec(dllimport) +#else +#define SOKOL_GFX_API_DECL extern +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + Resource id typedefs: + + sg_buffer: vertex- and index-buffers + sg_image: textures and render targets + sg_shader: vertex- and fragment-shaders, uniform blocks + sg_pipeline: associated shader and vertex-layouts, and render states + sg_pass: a bundle of render targets and actions on them + sg_context: a 'context handle' for switching between 3D-API contexts + + Instead of pointers, resource creation functions return a 32-bit + number which uniquely identifies the resource object. + + The 32-bit resource id is split into a 16-bit pool index in the lower bits, + and a 16-bit 'unique counter' in the upper bits. The index allows fast + pool lookups, and combined with the unique-mask it allows to detect + 'dangling accesses' (trying to use an object which no longer exists, and + its pool slot has been reused for a new object) + + The resource ids are wrapped into a struct so that the compiler + can complain when the wrong resource type is used. +*/ +typedef struct sg_buffer { uint32_t id; } sg_buffer; +typedef struct sg_image { uint32_t id; } sg_image; +typedef struct sg_shader { uint32_t id; } sg_shader; +typedef struct sg_pipeline { uint32_t id; } sg_pipeline; +typedef struct sg_pass { uint32_t id; } sg_pass; +typedef struct sg_context { uint32_t id; } sg_context; + +/* + sg_range is a pointer-size-pair struct used to pass memory blobs into + sokol-gfx. When initialized from a value type (array or struct), you can + use the SG_RANGE() macro to build an sg_range struct. For functions which + take either a sg_range pointer, or a (C++) sg_range reference, use the + SG_RANGE_REF macro as a solution which compiles both in C and C++. +*/ +typedef struct sg_range { + const void* ptr; + size_t size; +} sg_range; + +// disabling this for every includer isn't great, but the warnings are also quite pointless +#if defined(_MSC_VER) +#pragma warning(disable:4221) /* /W4 only: nonstandard extension used: 'x': cannot be initialized using address of automatic variable 'y' */ +#pragma warning(disable:4204) /* VS2015: nonstandard extension used: non-constant aggregate initializer */ +#endif +#if defined(__cplusplus) +#define SG_RANGE(x) sg_range{ &x, sizeof(x) } +#define SG_RANGE_REF(x) sg_range{ &x, sizeof(x) } +#else +#define SG_RANGE(x) (sg_range){ &x, sizeof(x) } +#define SG_RANGE_REF(x) &(sg_range){ &x, sizeof(x) } +#endif + +// various compile-time constants +enum { + SG_INVALID_ID = 0, + SG_NUM_SHADER_STAGES = 2, + SG_NUM_INFLIGHT_FRAMES = 2, + SG_MAX_COLOR_ATTACHMENTS = 4, + SG_MAX_SHADERSTAGE_BUFFERS = 8, + SG_MAX_SHADERSTAGE_IMAGES = 12, + SG_MAX_SHADERSTAGE_UBS = 4, + SG_MAX_UB_MEMBERS = 16, + SG_MAX_VERTEX_ATTRIBUTES = 16, /* NOTE: actual max vertex attrs can be less on GLES2, see sg_limits! */ + SG_MAX_MIPMAPS = 16, + SG_MAX_TEXTUREARRAY_LAYERS = 128 +}; + +/* + sg_color + + An RGBA color value. +*/ +typedef struct sg_color { float r, g, b, a; } sg_color; + +/* + sg_backend + + The active 3D-API backend, use the function sg_query_backend() + to get the currently active backend. + + NOTE that SG_BACKEND_GLES2 will be returned if sokol-gfx was + compiled with SOKOL_GLES3, but the runtime platform doesn't support + GLES3/WebGL2 and sokol-gfx had to fallback to GLES2/WebGL. +*/ +typedef enum sg_backend { + SG_BACKEND_GLCORE33, + SG_BACKEND_GLES2, + SG_BACKEND_GLES3, + SG_BACKEND_D3D11, + SG_BACKEND_METAL_IOS, + SG_BACKEND_METAL_MACOS, + SG_BACKEND_METAL_SIMULATOR, + SG_BACKEND_WGPU, + SG_BACKEND_DUMMY, +} sg_backend; + +/* + sg_pixel_format + + sokol_gfx.h basically uses the same pixel formats as WebGPU, since these + are supported on most newer GPUs. GLES2 and WebGL only supports a much + smaller subset of actually available pixel formats. Call + sg_query_pixelformat() to check at runtime if a pixel format supports the + desired features. + + A pixelformat name consist of three parts: + + - components (R, RG, RGB or RGBA) + - bit width per component (8, 16 or 32) + - component data type: + - unsigned normalized (no postfix) + - signed normalized (SN postfix) + - unsigned integer (UI postfix) + - signed integer (SI postfix) + - float (F postfix) + + Not all pixel formats can be used for everything, call sg_query_pixelformat() + to inspect the capabilities of a given pixelformat. The function returns + an sg_pixelformat_info struct with the following bool members: + + - sample: the pixelformat can be sampled as texture at least with + nearest filtering + - filter: the pixelformat can be samples as texture with linear + filtering + - render: the pixelformat can be used for render targets + - blend: blending is supported when using the pixelformat for + render targets + - msaa: multisample-antialiasing is supported when using the + pixelformat for render targets + - depth: the pixelformat can be used for depth-stencil attachments + + When targeting GLES2/WebGL, the only safe formats to use + as texture are SG_PIXELFORMAT_R8 and SG_PIXELFORMAT_RGBA8. For rendering + in GLES2/WebGL, only SG_PIXELFORMAT_RGBA8 is safe. All other formats + must be checked via sg_query_pixelformats(). + + The default pixel format for texture images is SG_PIXELFORMAT_RGBA8. + + The default pixel format for render target images is platform-dependent: + - for Metal and D3D11 it is SG_PIXELFORMAT_BGRA8 + - for GL backends it is SG_PIXELFORMAT_RGBA8 + + This is mainly because of the default framebuffer which is setup outside + of sokol_gfx.h. On some backends, using BGRA for the default frame buffer + allows more efficient frame flips. For your own offscreen-render-targets, + use whatever renderable pixel format is convenient for you. +*/ +typedef enum sg_pixel_format { + _SG_PIXELFORMAT_DEFAULT, /* value 0 reserved for default-init */ + SG_PIXELFORMAT_NONE, + + SG_PIXELFORMAT_R8, + SG_PIXELFORMAT_R8SN, + SG_PIXELFORMAT_R8UI, + SG_PIXELFORMAT_R8SI, + + SG_PIXELFORMAT_R16, + SG_PIXELFORMAT_R16SN, + SG_PIXELFORMAT_R16UI, + SG_PIXELFORMAT_R16SI, + SG_PIXELFORMAT_R16F, + SG_PIXELFORMAT_RG8, + SG_PIXELFORMAT_RG8SN, + SG_PIXELFORMAT_RG8UI, + SG_PIXELFORMAT_RG8SI, + + SG_PIXELFORMAT_R32UI, + SG_PIXELFORMAT_R32SI, + SG_PIXELFORMAT_R32F, + SG_PIXELFORMAT_RG16, + SG_PIXELFORMAT_RG16SN, + SG_PIXELFORMAT_RG16UI, + SG_PIXELFORMAT_RG16SI, + SG_PIXELFORMAT_RG16F, + SG_PIXELFORMAT_RGBA8, + SG_PIXELFORMAT_RGBA8SN, + SG_PIXELFORMAT_RGBA8UI, + SG_PIXELFORMAT_RGBA8SI, + SG_PIXELFORMAT_BGRA8, + SG_PIXELFORMAT_RGB10A2, + SG_PIXELFORMAT_RG11B10F, + + SG_PIXELFORMAT_RG32UI, + SG_PIXELFORMAT_RG32SI, + SG_PIXELFORMAT_RG32F, + SG_PIXELFORMAT_RGBA16, + SG_PIXELFORMAT_RGBA16SN, + SG_PIXELFORMAT_RGBA16UI, + SG_PIXELFORMAT_RGBA16SI, + SG_PIXELFORMAT_RGBA16F, + + SG_PIXELFORMAT_RGBA32UI, + SG_PIXELFORMAT_RGBA32SI, + SG_PIXELFORMAT_RGBA32F, + + SG_PIXELFORMAT_DEPTH, + SG_PIXELFORMAT_DEPTH_STENCIL, + + SG_PIXELFORMAT_BC1_RGBA, + SG_PIXELFORMAT_BC2_RGBA, + SG_PIXELFORMAT_BC3_RGBA, + SG_PIXELFORMAT_BC4_R, + SG_PIXELFORMAT_BC4_RSN, + SG_PIXELFORMAT_BC5_RG, + SG_PIXELFORMAT_BC5_RGSN, + SG_PIXELFORMAT_BC6H_RGBF, + SG_PIXELFORMAT_BC6H_RGBUF, + SG_PIXELFORMAT_BC7_RGBA, + SG_PIXELFORMAT_PVRTC_RGB_2BPP, + SG_PIXELFORMAT_PVRTC_RGB_4BPP, + SG_PIXELFORMAT_PVRTC_RGBA_2BPP, + SG_PIXELFORMAT_PVRTC_RGBA_4BPP, + SG_PIXELFORMAT_ETC2_RGB8, + SG_PIXELFORMAT_ETC2_RGB8A1, + SG_PIXELFORMAT_ETC2_RGBA8, + SG_PIXELFORMAT_ETC2_RG11, + SG_PIXELFORMAT_ETC2_RG11SN, + + _SG_PIXELFORMAT_NUM, + _SG_PIXELFORMAT_FORCE_U32 = 0x7FFFFFFF +} sg_pixel_format; + +/* + Runtime information about a pixel format, returned + by sg_query_pixelformat(). +*/ +typedef struct sg_pixelformat_info { + bool sample; // pixel format can be sampled in shaders + bool filter; // pixel format can be sampled with filtering + bool render; // pixel format can be used as render target + bool blend; // alpha-blending is supported + bool msaa; // pixel format can be used as MSAA render target + bool depth; // pixel format is a depth format + #if defined(SOKOL_ZIG_BINDINGS) + uint32_t __pad[3]; + #endif +} sg_pixelformat_info; + +/* + Runtime information about available optional features, + returned by sg_query_features() +*/ +typedef struct sg_features { + bool instancing; // hardware instancing supported + bool origin_top_left; // framebuffer and texture origin is in top left corner + bool multiple_render_targets; // offscreen render passes can have multiple render targets attached + bool msaa_render_targets; // offscreen render passes support MSAA antialiasing + bool imagetype_3d; // creation of SG_IMAGETYPE_3D images is supported + bool imagetype_array; // creation of SG_IMAGETYPE_ARRAY images is supported + bool image_clamp_to_border; // border color and clamp-to-border UV-wrap mode is supported + bool mrt_independent_blend_state; // multiple-render-target rendering can use per-render-target blend state + bool mrt_independent_write_mask; // multiple-render-target rendering can use per-render-target color write masks + #if defined(SOKOL_ZIG_BINDINGS) + uint32_t __pad[3]; + #endif +} sg_features; + +/* + Runtime information about resource limits, returned by sg_query_limit() +*/ +typedef struct sg_limits { + int max_image_size_2d; // max width/height of SG_IMAGETYPE_2D images + int max_image_size_cube; // max width/height of SG_IMAGETYPE_CUBE images + int max_image_size_3d; // max width/height/depth of SG_IMAGETYPE_3D images + int max_image_size_array; // max width/height of SG_IMAGETYPE_ARRAY images + int max_image_array_layers; // max number of layers in SG_IMAGETYPE_ARRAY images + int max_vertex_attrs; // <= SG_MAX_VERTEX_ATTRIBUTES or less (on some GLES2 impls) + int gl_max_vertex_uniform_vectors; // <= GL_MAX_VERTEX_UNIFORM_VECTORS (only on GL backends) +} sg_limits; + +/* + sg_resource_state + + The current state of a resource in its resource pool. + Resources start in the INITIAL state, which means the + pool slot is unoccupied and can be allocated. When a resource is + created, first an id is allocated, and the resource pool slot + is set to state ALLOC. After allocation, the resource is + initialized, which may result in the VALID or FAILED state. The + reason why allocation and initialization are separate is because + some resource types (e.g. buffers and images) might be asynchronously + initialized by the user application. If a resource which is not + in the VALID state is attempted to be used for rendering, rendering + operations will silently be dropped. + + The special INVALID state is returned in sg_query_xxx_state() if no + resource object exists for the provided resource id. +*/ +typedef enum sg_resource_state { + SG_RESOURCESTATE_INITIAL, + SG_RESOURCESTATE_ALLOC, + SG_RESOURCESTATE_VALID, + SG_RESOURCESTATE_FAILED, + SG_RESOURCESTATE_INVALID, + _SG_RESOURCESTATE_FORCE_U32 = 0x7FFFFFFF +} sg_resource_state; + +/* + sg_usage + + A resource usage hint describing the update strategy of + buffers and images. This is used in the sg_buffer_desc.usage + and sg_image_desc.usage members when creating buffers + and images: + + SG_USAGE_IMMUTABLE: the resource will never be updated with + new data, instead the content of the + resource must be provided on creation + SG_USAGE_DYNAMIC: the resource will be updated infrequently + with new data (this could range from "once + after creation", to "quite often but not + every frame") + SG_USAGE_STREAM: the resource will be updated each frame + with new content + + The rendering backends use this hint to prevent that the + CPU needs to wait for the GPU when attempting to update + a resource that might be currently accessed by the GPU. + + Resource content is updated with the functions sg_update_buffer() or + sg_append_buffer() for buffer objects, and sg_update_image() for image + objects. For the sg_update_*() functions, only one update is allowed per + frame and resource object, while sg_append_buffer() can be called + multiple times per frame on the same buffer. The application must update + all data required for rendering (this means that the update data can be + smaller than the resource size, if only a part of the overall resource + size is used for rendering, you only need to make sure that the data that + *is* used is valid). + + The default usage is SG_USAGE_IMMUTABLE. +*/ +typedef enum sg_usage { + _SG_USAGE_DEFAULT, /* value 0 reserved for default-init */ + SG_USAGE_IMMUTABLE, + SG_USAGE_DYNAMIC, + SG_USAGE_STREAM, + _SG_USAGE_NUM, + _SG_USAGE_FORCE_U32 = 0x7FFFFFFF +} sg_usage; + +/* + sg_buffer_type + + This indicates whether a buffer contains vertex- or index-data, + used in the sg_buffer_desc.type member when creating a buffer. + + The default value is SG_BUFFERTYPE_VERTEXBUFFER. +*/ +typedef enum sg_buffer_type { + _SG_BUFFERTYPE_DEFAULT, /* value 0 reserved for default-init */ + SG_BUFFERTYPE_VERTEXBUFFER, + SG_BUFFERTYPE_INDEXBUFFER, + _SG_BUFFERTYPE_NUM, + _SG_BUFFERTYPE_FORCE_U32 = 0x7FFFFFFF +} sg_buffer_type; + +/* + sg_index_type + + Indicates whether indexed rendering (fetching vertex-indices from an + index buffer) is used, and if yes, the index data type (16- or 32-bits). + This is used in the sg_pipeline_desc.index_type member when creating a + pipeline object. + + The default index type is SG_INDEXTYPE_NONE. +*/ +typedef enum sg_index_type { + _SG_INDEXTYPE_DEFAULT, /* value 0 reserved for default-init */ + SG_INDEXTYPE_NONE, + SG_INDEXTYPE_UINT16, + SG_INDEXTYPE_UINT32, + _SG_INDEXTYPE_NUM, + _SG_INDEXTYPE_FORCE_U32 = 0x7FFFFFFF +} sg_index_type; + +/* + sg_image_type + + Indicates the basic type of an image object (2D-texture, cubemap, + 3D-texture or 2D-array-texture). 3D- and array-textures are not supported + on the GLES2/WebGL backend (use sg_query_features().imagetype_3d and + sg_query_features().imagetype_array to check for support). The image type + is used in the sg_image_desc.type member when creating an image, and + in sg_shader_image_desc when describing a shader's texture sampler binding. + + The default image type when creating an image is SG_IMAGETYPE_2D. +*/ +typedef enum sg_image_type { + _SG_IMAGETYPE_DEFAULT, /* value 0 reserved for default-init */ + SG_IMAGETYPE_2D, + SG_IMAGETYPE_CUBE, + SG_IMAGETYPE_3D, + SG_IMAGETYPE_ARRAY, + _SG_IMAGETYPE_NUM, + _SG_IMAGETYPE_FORCE_U32 = 0x7FFFFFFF +} sg_image_type; + +/* + sg_sampler_type + + Indicates the basic data type of a shader's texture sampler which + can be float , unsigned integer or signed integer. The sampler + type is used in the sg_shader_image_desc to describe the + sampler type of a shader's texture sampler binding. + + The default sampler type is SG_SAMPLERTYPE_FLOAT. +*/ +typedef enum sg_sampler_type { + _SG_SAMPLERTYPE_DEFAULT, /* value 0 reserved for default-init */ + SG_SAMPLERTYPE_FLOAT, + SG_SAMPLERTYPE_SINT, + SG_SAMPLERTYPE_UINT, +} sg_sampler_type; + +/* + sg_cube_face + + The cubemap faces. Use these as indices in the sg_image_desc.content + array. +*/ +typedef enum sg_cube_face { + SG_CUBEFACE_POS_X, + SG_CUBEFACE_NEG_X, + SG_CUBEFACE_POS_Y, + SG_CUBEFACE_NEG_Y, + SG_CUBEFACE_POS_Z, + SG_CUBEFACE_NEG_Z, + SG_CUBEFACE_NUM, + _SG_CUBEFACE_FORCE_U32 = 0x7FFFFFFF +} sg_cube_face; + +/* + sg_shader_stage + + There are 2 shader stages: vertex- and fragment-shader-stage. + Each shader stage consists of: + + - one slot for a shader function (provided as source- or byte-code) + - SG_MAX_SHADERSTAGE_UBS slots for uniform blocks + - SG_MAX_SHADERSTAGE_IMAGES slots for images used as textures by + the shader function +*/ +typedef enum sg_shader_stage { + SG_SHADERSTAGE_VS, + SG_SHADERSTAGE_FS, + _SG_SHADERSTAGE_FORCE_U32 = 0x7FFFFFFF +} sg_shader_stage; + +/* + sg_primitive_type + + This is the common subset of 3D primitive types supported across all 3D + APIs. This is used in the sg_pipeline_desc.primitive_type member when + creating a pipeline object. + + The default primitive type is SG_PRIMITIVETYPE_TRIANGLES. +*/ +typedef enum sg_primitive_type { + _SG_PRIMITIVETYPE_DEFAULT, /* value 0 reserved for default-init */ + SG_PRIMITIVETYPE_POINTS, + SG_PRIMITIVETYPE_LINES, + SG_PRIMITIVETYPE_LINE_STRIP, + SG_PRIMITIVETYPE_TRIANGLES, + SG_PRIMITIVETYPE_TRIANGLE_STRIP, + _SG_PRIMITIVETYPE_NUM, + _SG_PRIMITIVETYPE_FORCE_U32 = 0x7FFFFFFF +} sg_primitive_type; + +/* + sg_filter + + The filtering mode when sampling a texture image. This is + used in the sg_image_desc.min_filter and sg_image_desc.mag_filter + members when creating an image object. + + The default filter mode is SG_FILTER_NEAREST. +*/ +typedef enum sg_filter { + _SG_FILTER_DEFAULT, /* value 0 reserved for default-init */ + SG_FILTER_NEAREST, + SG_FILTER_LINEAR, + SG_FILTER_NEAREST_MIPMAP_NEAREST, + SG_FILTER_NEAREST_MIPMAP_LINEAR, + SG_FILTER_LINEAR_MIPMAP_NEAREST, + SG_FILTER_LINEAR_MIPMAP_LINEAR, + _SG_FILTER_NUM, + _SG_FILTER_FORCE_U32 = 0x7FFFFFFF +} sg_filter; + +/* + sg_wrap + + The texture coordinates wrapping mode when sampling a texture + image. This is used in the sg_image_desc.wrap_u, .wrap_v + and .wrap_w members when creating an image. + + The default wrap mode is SG_WRAP_REPEAT. + + NOTE: SG_WRAP_CLAMP_TO_BORDER is not supported on all backends + and platforms. To check for support, call sg_query_features() + and check the "clamp_to_border" boolean in the returned + sg_features struct. + + Platforms which don't support SG_WRAP_CLAMP_TO_BORDER will silently fall back + to SG_WRAP_CLAMP_TO_EDGE without a validation error. + + Platforms which support clamp-to-border are: + + - all desktop GL platforms + - Metal on macOS + - D3D11 + + Platforms which do not support clamp-to-border: + + - GLES2/3 and WebGL/WebGL2 + - Metal on iOS +*/ +typedef enum sg_wrap { + _SG_WRAP_DEFAULT, /* value 0 reserved for default-init */ + SG_WRAP_REPEAT, + SG_WRAP_CLAMP_TO_EDGE, + SG_WRAP_CLAMP_TO_BORDER, + SG_WRAP_MIRRORED_REPEAT, + _SG_WRAP_NUM, + _SG_WRAP_FORCE_U32 = 0x7FFFFFFF +} sg_wrap; + +/* + sg_border_color + + The border color to use when sampling a texture, and the UV wrap + mode is SG_WRAP_CLAMP_TO_BORDER. + + The default border color is SG_BORDERCOLOR_OPAQUE_BLACK +*/ +typedef enum sg_border_color { + _SG_BORDERCOLOR_DEFAULT, /* value 0 reserved for default-init */ + SG_BORDERCOLOR_TRANSPARENT_BLACK, + SG_BORDERCOLOR_OPAQUE_BLACK, + SG_BORDERCOLOR_OPAQUE_WHITE, + _SG_BORDERCOLOR_NUM, + _SG_BORDERCOLOR_FORCE_U32 = 0x7FFFFFFF +} sg_border_color; + +/* + sg_vertex_format + + The data type of a vertex component. This is used to describe + the layout of vertex data when creating a pipeline object. +*/ +typedef enum sg_vertex_format { + SG_VERTEXFORMAT_INVALID, + SG_VERTEXFORMAT_FLOAT, + SG_VERTEXFORMAT_FLOAT2, + SG_VERTEXFORMAT_FLOAT3, + SG_VERTEXFORMAT_FLOAT4, + SG_VERTEXFORMAT_BYTE4, + SG_VERTEXFORMAT_BYTE4N, + SG_VERTEXFORMAT_UBYTE4, + SG_VERTEXFORMAT_UBYTE4N, + SG_VERTEXFORMAT_SHORT2, + SG_VERTEXFORMAT_SHORT2N, + SG_VERTEXFORMAT_USHORT2N, + SG_VERTEXFORMAT_SHORT4, + SG_VERTEXFORMAT_SHORT4N, + SG_VERTEXFORMAT_USHORT4N, + SG_VERTEXFORMAT_UINT10_N2, + _SG_VERTEXFORMAT_NUM, + _SG_VERTEXFORMAT_FORCE_U32 = 0x7FFFFFFF +} sg_vertex_format; + +/* + sg_vertex_step + + Defines whether the input pointer of a vertex input stream is advanced + 'per vertex' or 'per instance'. The default step-func is + SG_VERTEXSTEP_PER_VERTEX. SG_VERTEXSTEP_PER_INSTANCE is used with + instanced-rendering. + + The vertex-step is part of the vertex-layout definition + when creating pipeline objects. +*/ +typedef enum sg_vertex_step { + _SG_VERTEXSTEP_DEFAULT, /* value 0 reserved for default-init */ + SG_VERTEXSTEP_PER_VERTEX, + SG_VERTEXSTEP_PER_INSTANCE, + _SG_VERTEXSTEP_NUM, + _SG_VERTEXSTEP_FORCE_U32 = 0x7FFFFFFF +} sg_vertex_step; + +/* + sg_uniform_type + + The data type of a uniform block member. This is used to + describe the internal layout of uniform blocks when creating + a shader object. +*/ +typedef enum sg_uniform_type { + SG_UNIFORMTYPE_INVALID, + SG_UNIFORMTYPE_FLOAT, + SG_UNIFORMTYPE_FLOAT2, + SG_UNIFORMTYPE_FLOAT3, + SG_UNIFORMTYPE_FLOAT4, + SG_UNIFORMTYPE_INT, + SG_UNIFORMTYPE_INT2, + SG_UNIFORMTYPE_INT3, + SG_UNIFORMTYPE_INT4, + SG_UNIFORMTYPE_MAT4, + _SG_UNIFORMTYPE_NUM, + _SG_UNIFORMTYPE_FORCE_U32 = 0x7FFFFFFF +} sg_uniform_type; + +/* + sg_uniform_layout + + A hint for the interior memory layout of uniform blocks. This is + only really relevant for the GL backend where the internal layout + of uniform blocks must be known to sokol-gfx. For all other backends the + internal memory layout of uniform blocks doesn't matter, sokol-gfx + will just pass uniform data as a single memory blob to the + 3D backend. + + SG_UNIFORMLAYOUT_NATIVE (default) + Native layout means that a 'backend-native' memory layout + is used. For the GL backend this means that uniforms + are packed tightly in memory (e.g. there are no padding + bytes). + + SG_UNIFORMLAYOUT_STD140 + The memory layout is a subset of std140. Arrays are only + allowed for the FLOAT4, INT4 and MAT4. Alignment is as + is as follows: + + FLOAT, INT: 4 byte alignment + FLOAT2, INT2: 8 byte alignment + FLOAT3, INT3: 16 byte alignment(!) + FLOAT4, INT4: 16 byte alignment + MAT4: 16 byte alignment + FLOAT4[], INT4[]: 16 byte alignment + + The overall size of the uniform block must be a multiple + of 16. + + For more information search for 'UNIFORM DATA LAYOUT' in the documentation block + at the start of the header. +*/ +typedef enum sg_uniform_layout { + _SG_UNIFORMLAYOUT_DEFAULT, /* value 0 reserved for default-init */ + SG_UNIFORMLAYOUT_NATIVE, /* default: layout depends on currently active backend */ + SG_UNIFORMLAYOUT_STD140, /* std140: memory layout according to std140 */ + _SG_UNIFORMLAYOUT_NUM, + _SG_UNIFORMLAYOUT_FORCE_U32 = 0x7FFFFFFF +} sg_uniform_layout; + +/* + sg_cull_mode + + The face-culling mode, this is used in the + sg_pipeline_desc.cull_mode member when creating a + pipeline object. + + The default cull mode is SG_CULLMODE_NONE +*/ +typedef enum sg_cull_mode { + _SG_CULLMODE_DEFAULT, /* value 0 reserved for default-init */ + SG_CULLMODE_NONE, + SG_CULLMODE_FRONT, + SG_CULLMODE_BACK, + _SG_CULLMODE_NUM, + _SG_CULLMODE_FORCE_U32 = 0x7FFFFFFF +} sg_cull_mode; + +/* + sg_face_winding + + The vertex-winding rule that determines a front-facing primitive. This + is used in the member sg_pipeline_desc.face_winding + when creating a pipeline object. + + The default winding is SG_FACEWINDING_CW (clockwise) +*/ +typedef enum sg_face_winding { + _SG_FACEWINDING_DEFAULT, /* value 0 reserved for default-init */ + SG_FACEWINDING_CCW, + SG_FACEWINDING_CW, + _SG_FACEWINDING_NUM, + _SG_FACEWINDING_FORCE_U32 = 0x7FFFFFFF +} sg_face_winding; + +/* + sg_compare_func + + The compare-function for depth- and stencil-ref tests. + This is used when creating pipeline objects in the members: + + sg_pipeline_desc + .depth + .compare + .stencil + .front.compare + .back.compar + + The default compare func for depth- and stencil-tests is + SG_COMPAREFUNC_ALWAYS. +*/ +typedef enum sg_compare_func { + _SG_COMPAREFUNC_DEFAULT, /* value 0 reserved for default-init */ + SG_COMPAREFUNC_NEVER, + SG_COMPAREFUNC_LESS, + SG_COMPAREFUNC_EQUAL, + SG_COMPAREFUNC_LESS_EQUAL, + SG_COMPAREFUNC_GREATER, + SG_COMPAREFUNC_NOT_EQUAL, + SG_COMPAREFUNC_GREATER_EQUAL, + SG_COMPAREFUNC_ALWAYS, + _SG_COMPAREFUNC_NUM, + _SG_COMPAREFUNC_FORCE_U32 = 0x7FFFFFFF +} sg_compare_func; + +/* + sg_stencil_op + + The operation performed on a currently stored stencil-value when a + comparison test passes or fails. This is used when creating a pipeline + object in the members: + + sg_pipeline_desc + .stencil + .front + .fail_op + .depth_fail_op + .pass_op + .back + .fail_op + .depth_fail_op + .pass_op + + The default value is SG_STENCILOP_KEEP. +*/ +typedef enum sg_stencil_op { + _SG_STENCILOP_DEFAULT, /* value 0 reserved for default-init */ + SG_STENCILOP_KEEP, + SG_STENCILOP_ZERO, + SG_STENCILOP_REPLACE, + SG_STENCILOP_INCR_CLAMP, + SG_STENCILOP_DECR_CLAMP, + SG_STENCILOP_INVERT, + SG_STENCILOP_INCR_WRAP, + SG_STENCILOP_DECR_WRAP, + _SG_STENCILOP_NUM, + _SG_STENCILOP_FORCE_U32 = 0x7FFFFFFF +} sg_stencil_op; + +/* + sg_blend_factor + + The source and destination factors in blending operations. + This is used in the following members when creating a pipeline object: + + sg_pipeline_desc + .colors[i] + .blend + .src_factor_rgb + .dst_factor_rgb + .src_factor_alpha + .dst_factor_alpha + + The default value is SG_BLENDFACTOR_ONE for source + factors, and SG_BLENDFACTOR_ZERO for destination factors. +*/ +typedef enum sg_blend_factor { + _SG_BLENDFACTOR_DEFAULT, /* value 0 reserved for default-init */ + SG_BLENDFACTOR_ZERO, + SG_BLENDFACTOR_ONE, + SG_BLENDFACTOR_SRC_COLOR, + SG_BLENDFACTOR_ONE_MINUS_SRC_COLOR, + SG_BLENDFACTOR_SRC_ALPHA, + SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, + SG_BLENDFACTOR_DST_COLOR, + SG_BLENDFACTOR_ONE_MINUS_DST_COLOR, + SG_BLENDFACTOR_DST_ALPHA, + SG_BLENDFACTOR_ONE_MINUS_DST_ALPHA, + SG_BLENDFACTOR_SRC_ALPHA_SATURATED, + SG_BLENDFACTOR_BLEND_COLOR, + SG_BLENDFACTOR_ONE_MINUS_BLEND_COLOR, + SG_BLENDFACTOR_BLEND_ALPHA, + SG_BLENDFACTOR_ONE_MINUS_BLEND_ALPHA, + _SG_BLENDFACTOR_NUM, + _SG_BLENDFACTOR_FORCE_U32 = 0x7FFFFFFF +} sg_blend_factor; + +/* + sg_blend_op + + Describes how the source and destination values are combined in the + fragment blending operation. It is used in the following members when + creating a pipeline object: + + sg_pipeline_desc + .colors[i] + .blend + .op_rgb + .op_alpha + + The default value is SG_BLENDOP_ADD. +*/ +typedef enum sg_blend_op { + _SG_BLENDOP_DEFAULT, /* value 0 reserved for default-init */ + SG_BLENDOP_ADD, + SG_BLENDOP_SUBTRACT, + SG_BLENDOP_REVERSE_SUBTRACT, + _SG_BLENDOP_NUM, + _SG_BLENDOP_FORCE_U32 = 0x7FFFFFFF +} sg_blend_op; + +/* + sg_color_mask + + Selects the active color channels when writing a fragment color to the + framebuffer. This is used in the members + sg_pipeline_desc.colors[i].write_mask when creating a pipeline object. + + The default colormask is SG_COLORMASK_RGBA (write all colors channels) + + NOTE: since the color mask value 0 is reserved for the default value + (SG_COLORMASK_RGBA), use SG_COLORMASK_NONE if all color channels + should be disabled. +*/ +typedef enum sg_color_mask { + _SG_COLORMASK_DEFAULT = 0, /* value 0 reserved for default-init */ + SG_COLORMASK_NONE = 0x10, /* special value for 'all channels disabled */ + SG_COLORMASK_R = 0x1, + SG_COLORMASK_G = 0x2, + SG_COLORMASK_RG = 0x3, + SG_COLORMASK_B = 0x4, + SG_COLORMASK_RB = 0x5, + SG_COLORMASK_GB = 0x6, + SG_COLORMASK_RGB = 0x7, + SG_COLORMASK_A = 0x8, + SG_COLORMASK_RA = 0x9, + SG_COLORMASK_GA = 0xA, + SG_COLORMASK_RGA = 0xB, + SG_COLORMASK_BA = 0xC, + SG_COLORMASK_RBA = 0xD, + SG_COLORMASK_GBA = 0xE, + SG_COLORMASK_RGBA = 0xF, + _SG_COLORMASK_FORCE_U32 = 0x7FFFFFFF +} sg_color_mask; + +/* + sg_action + + Defines what action should be performed at the start of a render pass: + + SG_ACTION_CLEAR: clear the render target image + SG_ACTION_LOAD: load the previous content of the render target image + SG_ACTION_DONTCARE: leave the render target image content undefined + + This is used in the sg_pass_action structure. + + The default action for all pass attachments is SG_ACTION_CLEAR, with the + clear color rgba = {0.5f, 0.5f, 0.5f, 1.0f], depth=1.0 and stencil=0. + + If you want to override the default behaviour, it is important to not + only set the clear color, but the 'action' field as well (as long as this + is in its _SG_ACTION_DEFAULT, the value fields will be ignored). +*/ +typedef enum sg_action { + _SG_ACTION_DEFAULT, + SG_ACTION_CLEAR, + SG_ACTION_LOAD, + SG_ACTION_DONTCARE, + _SG_ACTION_NUM, + _SG_ACTION_FORCE_U32 = 0x7FFFFFFF +} sg_action; + +/* + sg_pass_action + + The sg_pass_action struct defines the actions to be performed + at the start of a rendering pass in the functions sg_begin_pass() + and sg_begin_default_pass(). + + A separate action and clear values can be defined for each + color attachment, and for the depth-stencil attachment. + + The default clear values are defined by the macros: + + - SG_DEFAULT_CLEAR_RED: 0.5f + - SG_DEFAULT_CLEAR_GREEN: 0.5f + - SG_DEFAULT_CLEAR_BLUE: 0.5f + - SG_DEFAULT_CLEAR_ALPHA: 1.0f + - SG_DEFAULT_CLEAR_DEPTH: 1.0f + - SG_DEFAULT_CLEAR_STENCIL: 0 +*/ +typedef struct sg_color_attachment_action { + sg_action action; + sg_color value; +} sg_color_attachment_action; + +typedef struct sg_depth_attachment_action { + sg_action action; + float value; +} sg_depth_attachment_action; + +typedef struct sg_stencil_attachment_action { + sg_action action; + uint8_t value; +} sg_stencil_attachment_action; + +typedef struct sg_pass_action { + uint32_t _start_canary; + sg_color_attachment_action colors[SG_MAX_COLOR_ATTACHMENTS]; + sg_depth_attachment_action depth; + sg_stencil_attachment_action stencil; + uint32_t _end_canary; +} sg_pass_action; + +/* + sg_bindings + + The sg_bindings structure defines the resource binding slots + of the sokol_gfx render pipeline, used as argument to the + sg_apply_bindings() function. + + A resource binding struct contains: + + - 1..N vertex buffers + - 0..N vertex buffer offsets + - 0..1 index buffers + - 0..1 index buffer offsets + - 0..N vertex shader stage images + - 0..N fragment shader stage images + + The max number of vertex buffer and shader stage images + are defined by the SG_MAX_SHADERSTAGE_BUFFERS and + SG_MAX_SHADERSTAGE_IMAGES configuration constants. + + The optional buffer offsets can be used to put different unrelated + chunks of vertex- and/or index-data into the same buffer objects. +*/ +typedef struct sg_bindings { + uint32_t _start_canary; + sg_buffer vertex_buffers[SG_MAX_SHADERSTAGE_BUFFERS]; + int vertex_buffer_offsets[SG_MAX_SHADERSTAGE_BUFFERS]; + sg_buffer index_buffer; + int index_buffer_offset; + sg_image vs_images[SG_MAX_SHADERSTAGE_IMAGES]; + sg_image fs_images[SG_MAX_SHADERSTAGE_IMAGES]; + uint32_t _end_canary; +} sg_bindings; + +/* + sg_buffer_desc + + Creation parameters for sg_buffer objects, used in the + sg_make_buffer() call. + + The default configuration is: + + .size: 0 (*must* be >0 for buffers without data) + .type: SG_BUFFERTYPE_VERTEXBUFFER + .usage: SG_USAGE_IMMUTABLE + .data.ptr 0 (*must* be valid for immutable buffers) + .data.size 0 (*must* be > 0 for immutable buffers) + .label 0 (optional string label for trace hooks) + + The label will be ignored by sokol_gfx.h, it is only useful + when hooking into sg_make_buffer() or sg_init_buffer() via + the sg_install_trace_hooks() function. + + For immutable buffers which are initialized with initial data, + keep the .size item zero-initialized, and set the size together with the + pointer to the initial data in the .data item. + + For mutable buffers without initial data, keep the .data item + zero-initialized, and set the buffer size in the .size item instead. + + You can also set both size values, but currently both size values must + be identical (this may change in the future when the dynamic resource + management may become more flexible). + + ADVANCED TOPIC: Injecting native 3D-API buffers: + + The following struct members allow to inject your own GL, Metal + or D3D11 buffers into sokol_gfx: + + .gl_buffers[SG_NUM_INFLIGHT_FRAMES] + .mtl_buffers[SG_NUM_INFLIGHT_FRAMES] + .d3d11_buffer + + You must still provide all other struct items except the .data item, and + these must match the creation parameters of the native buffers you + provide. For SG_USAGE_IMMUTABLE, only provide a single native 3D-API + buffer, otherwise you need to provide SG_NUM_INFLIGHT_FRAMES buffers + (only for GL and Metal, not D3D11). Providing multiple buffers for GL and + Metal is necessary because sokol_gfx will rotate through them when + calling sg_update_buffer() to prevent lock-stalls. + + Note that it is expected that immutable injected buffer have already been + initialized with content, and the .content member must be 0! + + Also you need to call sg_reset_state_cache() after calling native 3D-API + functions, and before calling any sokol_gfx function. +*/ +typedef struct sg_buffer_desc { + uint32_t _start_canary; + size_t size; + sg_buffer_type type; + sg_usage usage; + sg_range data; + const char* label; + /* GL specific */ + uint32_t gl_buffers[SG_NUM_INFLIGHT_FRAMES]; + /* Metal specific */ + const void* mtl_buffers[SG_NUM_INFLIGHT_FRAMES]; + /* D3D11 specific */ + const void* d3d11_buffer; + /* WebGPU specific */ + const void* wgpu_buffer; + uint32_t _end_canary; +} sg_buffer_desc; + +/* + sg_image_data + + Defines the content of an image through a 2D array of sg_range structs. + The first array dimension is the cubemap face, and the second array + dimension the mipmap level. +*/ +typedef struct sg_image_data { + sg_range subimage[SG_CUBEFACE_NUM][SG_MAX_MIPMAPS]; +} sg_image_data; + +/* + sg_image_desc + + Creation parameters for sg_image objects, used in the sg_make_image() + call. + + The default configuration is: + + .type: SG_IMAGETYPE_2D + .render_target: false + .width 0 (must be set to >0) + .height 0 (must be set to >0) + .num_slices 1 (3D textures: depth; array textures: number of layers) + .num_mipmaps: 1 + .usage: SG_USAGE_IMMUTABLE + .pixel_format: SG_PIXELFORMAT_RGBA8 for textures, or sg_desc.context.color_format for render targets + .sample_count: 1 for textures, or sg_desc.context.sample_count for render targets + .min_filter: SG_FILTER_NEAREST + .mag_filter: SG_FILTER_NEAREST + .wrap_u: SG_WRAP_REPEAT + .wrap_v: SG_WRAP_REPEAT + .wrap_w: SG_WRAP_REPEAT (only SG_IMAGETYPE_3D) + .border_color SG_BORDERCOLOR_OPAQUE_BLACK + .max_anisotropy 1 (must be 1..16) + .min_lod 0.0f + .max_lod FLT_MAX + .data an sg_image_data struct to define the initial content + .label 0 (optional string label for trace hooks) + + Q: Why is the default sample_count for render targets identical with the + "default sample count" from sg_desc.context.sample_count? + + A: So that it matches the default sample count in pipeline objects. Even + though it is a bit strange/confusing that offscreen render targets by default + get the same sample count as the default framebuffer, but it's better that + an offscreen render target created with default parameters matches + a pipeline object created with default parameters. + + NOTE: + + SG_IMAGETYPE_ARRAY and SG_IMAGETYPE_3D are not supported on WebGL/GLES2, + use sg_query_features().imagetype_array and + sg_query_features().imagetype_3d at runtime to check if array- and + 3D-textures are supported. + + Images with usage SG_USAGE_IMMUTABLE must be fully initialized by + providing a valid .data member which points to initialization data. + + ADVANCED TOPIC: Injecting native 3D-API textures: + + The following struct members allow to inject your own GL, Metal or D3D11 + textures into sokol_gfx: + + .gl_textures[SG_NUM_INFLIGHT_FRAMES] + .mtl_textures[SG_NUM_INFLIGHT_FRAMES] + .d3d11_texture + .d3d11_shader_resource_view + + For GL, you can also specify the texture target or leave it empty to use + the default texture target for the image type (GL_TEXTURE_2D for + SG_IMAGETYPE_2D etc) + + For D3D11, you can provide either a D3D11 texture, or a + shader-resource-view, or both. If only a texture is provided, a matching + shader-resource-view will be created. If only a shader-resource-view is + provided, the texture will be looked up from the shader-resource-view. + + The same rules apply as for injecting native buffers (see sg_buffer_desc + documentation for more details). +*/ +typedef struct sg_image_desc { + uint32_t _start_canary; + sg_image_type type; + bool render_target; + int width; + int height; + int num_slices; + int num_mipmaps; + sg_usage usage; + sg_pixel_format pixel_format; + int sample_count; + sg_filter min_filter; + sg_filter mag_filter; + sg_wrap wrap_u; + sg_wrap wrap_v; + sg_wrap wrap_w; + sg_border_color border_color; + uint32_t max_anisotropy; + float min_lod; + float max_lod; + sg_image_data data; + const char* label; + /* GL specific */ + uint32_t gl_textures[SG_NUM_INFLIGHT_FRAMES]; + uint32_t gl_texture_target; + /* Metal specific */ + const void* mtl_textures[SG_NUM_INFLIGHT_FRAMES]; + /* D3D11 specific */ + const void* d3d11_texture; + const void* d3d11_shader_resource_view; + /* WebGPU specific */ + const void* wgpu_texture; + uint32_t _end_canary; +} sg_image_desc; + +/* + sg_shader_desc + + The structure sg_shader_desc defines all creation parameters for shader + programs, used as input to the sg_make_shader() function: + + - reflection information for vertex attributes (vertex shader inputs): + - vertex attribute name (required for GLES2, optional for GLES3 and GL) + - a semantic name and index (required for D3D11) + - for each shader-stage (vertex and fragment): + - the shader source or bytecode + - an optional entry function name + - an optional compile target (only for D3D11 when source is provided, + defaults are "vs_4_0" and "ps_4_0") + - reflection info for each uniform block used by the shader stage: + - the size of the uniform block in bytes + - a memory layout hint (native vs std140, only required for GL backends) + - reflection info for each uniform block member (only required for GL backends): + - member name + - member type (SG_UNIFORMTYPE_xxx) + - if the member is an array, the number of array items + - reflection info for the texture images used by the shader stage: + - the image type (SG_IMAGETYPE_xxx) + - the sampler type (SG_SAMPLERTYPE_xxx, default is SG_SAMPLERTYPE_FLOAT) + - the name of the texture sampler (required for GLES2, optional everywhere else) + + For all GL backends, shader source-code must be provided. For D3D11 and Metal, + either shader source-code or byte-code can be provided. + + For D3D11, if source code is provided, the d3dcompiler_47.dll will be loaded + on demand. If this fails, shader creation will fail. When compiling HLSL + source code, you can provide an optional target string via + sg_shader_stage_desc.d3d11_target, the default target is "vs_4_0" for the + vertex shader stage and "ps_4_0" for the pixel shader stage. +*/ +typedef struct sg_shader_attr_desc { + const char* name; // GLSL vertex attribute name (only strictly required for GLES2) + const char* sem_name; // HLSL semantic name + int sem_index; // HLSL semantic index +} sg_shader_attr_desc; + +typedef struct sg_shader_uniform_desc { + const char* name; + sg_uniform_type type; + int array_count; +} sg_shader_uniform_desc; + +typedef struct sg_shader_uniform_block_desc { + size_t size; + sg_uniform_layout layout; + sg_shader_uniform_desc uniforms[SG_MAX_UB_MEMBERS]; +} sg_shader_uniform_block_desc; + +typedef struct sg_shader_image_desc { + const char* name; + sg_image_type image_type; + sg_sampler_type sampler_type; +} sg_shader_image_desc; + +typedef struct sg_shader_stage_desc { + const char* source; + sg_range bytecode; + const char* entry; + const char* d3d11_target; + sg_shader_uniform_block_desc uniform_blocks[SG_MAX_SHADERSTAGE_UBS]; + sg_shader_image_desc images[SG_MAX_SHADERSTAGE_IMAGES]; +} sg_shader_stage_desc; + +typedef struct sg_shader_desc { + uint32_t _start_canary; + sg_shader_attr_desc attrs[SG_MAX_VERTEX_ATTRIBUTES]; + sg_shader_stage_desc vs; + sg_shader_stage_desc fs; + const char* label; + uint32_t _end_canary; +} sg_shader_desc; + +/* + sg_pipeline_desc + + The sg_pipeline_desc struct defines all creation parameters for an + sg_pipeline object, used as argument to the sg_make_pipeline() function: + + - the vertex layout for all input vertex buffers + - a shader object + - the 3D primitive type (points, lines, triangles, ...) + - the index type (none, 16- or 32-bit) + - all the fixed-function-pipeline state (depth-, stencil-, blend-state, etc...) + + If the vertex data has no gaps between vertex components, you can omit + the .layout.buffers[].stride and layout.attrs[].offset items (leave them + default-initialized to 0), sokol-gfx will then compute the offsets and + strides from the vertex component formats (.layout.attrs[].format). + Please note that ALL vertex attribute offsets must be 0 in order for the + automatic offset computation to kick in. + + The default configuration is as follows: + + .shader: 0 (must be initialized with a valid sg_shader id!) + .layout: + .buffers[]: vertex buffer layouts + .stride: 0 (if no stride is given it will be computed) + .step_func SG_VERTEXSTEP_PER_VERTEX + .step_rate 1 + .attrs[]: vertex attribute declarations + .buffer_index 0 the vertex buffer bind slot + .offset 0 (offsets can be omitted if the vertex layout has no gaps) + .format SG_VERTEXFORMAT_INVALID (must be initialized!) + .depth: + .pixel_format: sg_desc.context.depth_format + .compare: SG_COMPAREFUNC_ALWAYS + .write_enabled: false + .bias: 0.0f + .bias_slope_scale: 0.0f + .bias_clamp: 0.0f + .stencil: + .enabled: false + .front/back: + .compare: SG_COMPAREFUNC_ALWAYS + .depth_fail_op: SG_STENCILOP_KEEP + .pass_op: SG_STENCILOP_KEEP + .compare: SG_COMPAREFUNC_ALWAYS + .read_mask: 0 + .write_mask: 0 + .ref: 0 + .color_count 1 + .colors[0..color_count] + .pixel_format sg_desc.context.color_format + .write_mask: SG_COLORMASK_RGBA + .blend: + .enabled: false + .src_factor_rgb: SG_BLENDFACTOR_ONE + .dst_factor_rgb: SG_BLENDFACTOR_ZERO + .op_rgb: SG_BLENDOP_ADD + .src_factor_alpha: SG_BLENDFACTOR_ONE + .dst_factor_alpha: SG_BLENDFACTOR_ZERO + .op_alpha: SG_BLENDOP_ADD + .primitive_type: SG_PRIMITIVETYPE_TRIANGLES + .index_type: SG_INDEXTYPE_NONE + .cull_mode: SG_CULLMODE_NONE + .face_winding: SG_FACEWINDING_CW + .sample_count: sg_desc.context.sample_count + .blend_color: (sg_color) { 0.0f, 0.0f, 0.0f, 0.0f } + .alpha_to_coverage_enabled: false + .label 0 (optional string label for trace hooks) +*/ +typedef struct sg_buffer_layout_desc { + int stride; + sg_vertex_step step_func; + int step_rate; + #if defined(SOKOL_ZIG_BINDINGS) + uint32_t __pad[2]; + #endif +} sg_buffer_layout_desc; + +typedef struct sg_vertex_attr_desc { + int buffer_index; + int offset; + sg_vertex_format format; + #if defined(SOKOL_ZIG_BINDINGS) + uint32_t __pad[2]; + #endif +} sg_vertex_attr_desc; + +typedef struct sg_layout_desc { + sg_buffer_layout_desc buffers[SG_MAX_SHADERSTAGE_BUFFERS]; + sg_vertex_attr_desc attrs[SG_MAX_VERTEX_ATTRIBUTES]; +} sg_layout_desc; + +typedef struct sg_stencil_face_state { + sg_compare_func compare; + sg_stencil_op fail_op; + sg_stencil_op depth_fail_op; + sg_stencil_op pass_op; +} sg_stencil_face_state; + +typedef struct sg_stencil_state { + bool enabled; + sg_stencil_face_state front; + sg_stencil_face_state back; + uint8_t read_mask; + uint8_t write_mask; + uint8_t ref; +} sg_stencil_state; + +typedef struct sg_depth_state { + sg_pixel_format pixel_format; + sg_compare_func compare; + bool write_enabled; + float bias; + float bias_slope_scale; + float bias_clamp; +} sg_depth_state; + +typedef struct sg_blend_state { + bool enabled; + sg_blend_factor src_factor_rgb; + sg_blend_factor dst_factor_rgb; + sg_blend_op op_rgb; + sg_blend_factor src_factor_alpha; + sg_blend_factor dst_factor_alpha; + sg_blend_op op_alpha; +} sg_blend_state; + +typedef struct sg_color_state { + sg_pixel_format pixel_format; + sg_color_mask write_mask; + sg_blend_state blend; +} sg_color_state; + +typedef struct sg_pipeline_desc { + uint32_t _start_canary; + sg_shader shader; + sg_layout_desc layout; + sg_depth_state depth; + sg_stencil_state stencil; + int color_count; + sg_color_state colors[SG_MAX_COLOR_ATTACHMENTS]; + sg_primitive_type primitive_type; + sg_index_type index_type; + sg_cull_mode cull_mode; + sg_face_winding face_winding; + int sample_count; + sg_color blend_color; + bool alpha_to_coverage_enabled; + const char* label; + uint32_t _end_canary; +} sg_pipeline_desc; + +/* + sg_pass_desc + + Creation parameters for an sg_pass object, used as argument + to the sg_make_pass() function. + + A pass object contains 1..4 color-attachments and none, or one, + depth-stencil-attachment. Each attachment consists of + an image, and two additional indices describing + which subimage the pass will render to: one mipmap index, and + if the image is a cubemap, array-texture or 3D-texture, the + face-index, array-layer or depth-slice. + + Pass images must fulfill the following requirements: + + All images must have: + - been created as render target (sg_image_desc.render_target = true) + - the same size + - the same sample count + + In addition, all color-attachment images must have the same pixel format. +*/ +typedef struct sg_pass_attachment_desc { + sg_image image; + int mip_level; + int slice; /* cube texture: face; array texture: layer; 3D texture: slice */ +} sg_pass_attachment_desc; + +typedef struct sg_pass_desc { + uint32_t _start_canary; + sg_pass_attachment_desc color_attachments[SG_MAX_COLOR_ATTACHMENTS]; + sg_pass_attachment_desc depth_stencil_attachment; + const char* label; + uint32_t _end_canary; +} sg_pass_desc; + +/* + sg_trace_hooks + + Installable callback functions to keep track of the sokol-gfx calls, + this is useful for debugging, or keeping track of resource creation + and destruction. + + Trace hooks are installed with sg_install_trace_hooks(), this returns + another sg_trace_hooks struct with the previous set of + trace hook function pointers. These should be invoked by the + new trace hooks to form a proper call chain. +*/ +typedef struct sg_trace_hooks { + void* user_data; + void (*reset_state_cache)(void* user_data); + void (*make_buffer)(const sg_buffer_desc* desc, sg_buffer result, void* user_data); + void (*make_image)(const sg_image_desc* desc, sg_image result, void* user_data); + void (*make_shader)(const sg_shader_desc* desc, sg_shader result, void* user_data); + void (*make_pipeline)(const sg_pipeline_desc* desc, sg_pipeline result, void* user_data); + void (*make_pass)(const sg_pass_desc* desc, sg_pass result, void* user_data); + void (*destroy_buffer)(sg_buffer buf, void* user_data); + void (*destroy_image)(sg_image img, void* user_data); + void (*destroy_shader)(sg_shader shd, void* user_data); + void (*destroy_pipeline)(sg_pipeline pip, void* user_data); + void (*destroy_pass)(sg_pass pass, void* user_data); + void (*update_buffer)(sg_buffer buf, const sg_range* data, void* user_data); + void (*update_image)(sg_image img, const sg_image_data* data, void* user_data); + void (*append_buffer)(sg_buffer buf, const sg_range* data, int result, void* user_data); + void (*begin_default_pass)(const sg_pass_action* pass_action, int width, int height, void* user_data); + void (*begin_pass)(sg_pass pass, const sg_pass_action* pass_action, void* user_data); + void (*apply_viewport)(int x, int y, int width, int height, bool origin_top_left, void* user_data); + void (*apply_scissor_rect)(int x, int y, int width, int height, bool origin_top_left, void* user_data); + void (*apply_pipeline)(sg_pipeline pip, void* user_data); + void (*apply_bindings)(const sg_bindings* bindings, void* user_data); + void (*apply_uniforms)(sg_shader_stage stage, int ub_index, const sg_range* data, void* user_data); + void (*draw)(int base_element, int num_elements, int num_instances, void* user_data); + void (*end_pass)(void* user_data); + void (*commit)(void* user_data); + void (*alloc_buffer)(sg_buffer result, void* user_data); + void (*alloc_image)(sg_image result, void* user_data); + void (*alloc_shader)(sg_shader result, void* user_data); + void (*alloc_pipeline)(sg_pipeline result, void* user_data); + void (*alloc_pass)(sg_pass result, void* user_data); + void (*dealloc_buffer)(sg_buffer buf_id, void* user_data); + void (*dealloc_image)(sg_image img_id, void* user_data); + void (*dealloc_shader)(sg_shader shd_id, void* user_data); + void (*dealloc_pipeline)(sg_pipeline pip_id, void* user_data); + void (*dealloc_pass)(sg_pass pass_id, void* user_data); + void (*init_buffer)(sg_buffer buf_id, const sg_buffer_desc* desc, void* user_data); + void (*init_image)(sg_image img_id, const sg_image_desc* desc, void* user_data); + void (*init_shader)(sg_shader shd_id, const sg_shader_desc* desc, void* user_data); + void (*init_pipeline)(sg_pipeline pip_id, const sg_pipeline_desc* desc, void* user_data); + void (*init_pass)(sg_pass pass_id, const sg_pass_desc* desc, void* user_data); + void (*uninit_buffer)(sg_buffer buf_id, void* user_data); + void (*uninit_image)(sg_image img_id, void* user_data); + void (*uninit_shader)(sg_shader shd_id, void* user_data); + void (*uninit_pipeline)(sg_pipeline pip_id, void* user_data); + void (*uninit_pass)(sg_pass pass_id, void* user_data); + void (*fail_buffer)(sg_buffer buf_id, void* user_data); + void (*fail_image)(sg_image img_id, void* user_data); + void (*fail_shader)(sg_shader shd_id, void* user_data); + void (*fail_pipeline)(sg_pipeline pip_id, void* user_data); + void (*fail_pass)(sg_pass pass_id, void* user_data); + void (*push_debug_group)(const char* name, void* user_data); + void (*pop_debug_group)(void* user_data); + void (*err_buffer_pool_exhausted)(void* user_data); + void (*err_image_pool_exhausted)(void* user_data); + void (*err_shader_pool_exhausted)(void* user_data); + void (*err_pipeline_pool_exhausted)(void* user_data); + void (*err_pass_pool_exhausted)(void* user_data); + void (*err_context_mismatch)(void* user_data); + void (*err_pass_invalid)(void* user_data); + void (*err_draw_invalid)(void* user_data); + void (*err_bindings_invalid)(void* user_data); +} sg_trace_hooks; + +/* + sg_buffer_info + sg_image_info + sg_shader_info + sg_pipeline_info + sg_pass_info + + These structs contain various internal resource attributes which + might be useful for debug-inspection. Please don't rely on the + actual content of those structs too much, as they are quite closely + tied to sokol_gfx.h internals and may change more frequently than + the other public API elements. + + The *_info structs are used as the return values of the following functions: + + sg_query_buffer_info() + sg_query_image_info() + sg_query_shader_info() + sg_query_pipeline_info() + sg_query_pass_info() +*/ +typedef struct sg_slot_info { + sg_resource_state state; /* the current state of this resource slot */ + uint32_t res_id; /* type-neutral resource if (e.g. sg_buffer.id) */ + uint32_t ctx_id; /* the context this resource belongs to */ +} sg_slot_info; + +typedef struct sg_buffer_info { + sg_slot_info slot; /* resource pool slot info */ + uint32_t update_frame_index; /* frame index of last sg_update_buffer() */ + uint32_t append_frame_index; /* frame index of last sg_append_buffer() */ + int append_pos; /* current position in buffer for sg_append_buffer() */ + bool append_overflow; /* is buffer in overflow state (due to sg_append_buffer) */ + int num_slots; /* number of renaming-slots for dynamically updated buffers */ + int active_slot; /* currently active write-slot for dynamically updated buffers */ +} sg_buffer_info; + +typedef struct sg_image_info { + sg_slot_info slot; /* resource pool slot info */ + uint32_t upd_frame_index; /* frame index of last sg_update_image() */ + int num_slots; /* number of renaming-slots for dynamically updated images */ + int active_slot; /* currently active write-slot for dynamically updated images */ + int width; /* image width */ + int height; /* image height */ +} sg_image_info; + +typedef struct sg_shader_info { + sg_slot_info slot; /* resoure pool slot info */ +} sg_shader_info; + +typedef struct sg_pipeline_info { + sg_slot_info slot; /* resource pool slot info */ +} sg_pipeline_info; + +typedef struct sg_pass_info { + sg_slot_info slot; /* resource pool slot info */ +} sg_pass_info; + +/* + sg_desc + + The sg_desc struct contains configuration values for sokol_gfx, + it is used as parameter to the sg_setup() call. + + NOTE that all callback function pointers come in two versions, one without + a userdata pointer, and one with a userdata pointer. You would + either initialize one or the other depending on whether you pass data + to your callbacks. + + FIXME: explain the various configuration options + + The default configuration is: + + .buffer_pool_size 128 + .image_pool_size 128 + .shader_pool_size 32 + .pipeline_pool_size 64 + .pass_pool_size 16 + .context_pool_size 16 + .sampler_cache_size 64 + .uniform_buffer_size 4 MB (4*1024*1024) + .staging_buffer_size 8 MB (8*1024*1024) + + .context.color_format: default value depends on selected backend: + all GL backends: SG_PIXELFORMAT_RGBA8 + Metal and D3D11: SG_PIXELFORMAT_BGRA8 + WGPU: *no default* (must be queried from WGPU swapchain) + .context.depth_format SG_PIXELFORMAT_DEPTH_STENCIL + .context.sample_count 1 + + GL specific: + .context.gl.force_gles2 + if this is true the GL backend will act in "GLES2 fallback mode" even + when compiled with SOKOL_GLES3, this is useful to fall back + to traditional WebGL if a browser doesn't support a WebGL2 context + + Metal specific: + (NOTE: All Objective-C object references are transferred through + a bridged (const void*) to sokol_gfx, which will use a unretained + bridged cast (__bridged id) to retrieve the Objective-C + references back. Since the bridge cast is unretained, the caller + must hold a strong reference to the Objective-C object for the + duration of the sokol_gfx call! + + .context.metal.device + a pointer to the MTLDevice object + .context.metal.renderpass_descriptor_cb + .context.metal_renderpass_descriptor_userdata_cb + A C callback function to obtain the MTLRenderPassDescriptor for the + current frame when rendering to the default framebuffer, will be called + in sg_begin_default_pass(). + .context.metal.drawable_cb + .context.metal.drawable_userdata_cb + a C callback function to obtain a MTLDrawable for the current + frame when rendering to the default framebuffer, will be called in + sg_end_pass() of the default pass + .context.metal.user_data + optional user data pointer passed to the userdata versions of + callback functions + + D3D11 specific: + .context.d3d11.device + a pointer to the ID3D11Device object, this must have been created + before sg_setup() is called + .context.d3d11.device_context + a pointer to the ID3D11DeviceContext object + .context.d3d11.render_target_view_cb + .context.d3d11.render_target_view_userdata_cb + a C callback function to obtain a pointer to the current + ID3D11RenderTargetView object of the default framebuffer, + this function will be called in sg_begin_pass() when rendering + to the default framebuffer + .context.d3d11.depth_stencil_view_cb + .context.d3d11.depth_stencil_view_userdata_cb + a C callback function to obtain a pointer to the current + ID3D11DepthStencilView object of the default framebuffer, + this function will be called in sg_begin_pass() when rendering + to the default framebuffer + .context.metal.user_data + optional user data pointer passed to the userdata versions of + callback functions + + WebGPU specific: + .context.wgpu.device + a WGPUDevice handle + .context.wgpu.render_format + WGPUTextureFormat of the swap chain surface + .context.wgpu.render_view_cb + .context.wgpu.render_view_userdata_cb + callback to get the current WGPUTextureView of the swapchain's + rendering attachment (may be an MSAA surface) + .context.wgpu.resolve_view_cb + .context.wgpu.resolve_view_userdata_cb + callback to get the current WGPUTextureView of the swapchain's + MSAA-resolve-target surface, must return 0 if not MSAA rendering + .context.wgpu.depth_stencil_view_cb + .context.wgpu.depth_stencil_view_userdata_cb + callback to get current default-pass depth-stencil-surface WGPUTextureView + the pixel format of the default WGPUTextureView must be WGPUTextureFormat_Depth24Plus8 + .context.metal.user_data + optional user data pointer passed to the userdata versions of + callback functions + + When using sokol_gfx.h and sokol_app.h together, consider using the + helper function sapp_sgcontext() in the sokol_glue.h header to + initialize the sg_desc.context nested struct. sapp_sgcontext() returns + a completely initialized sg_context_desc struct with information + provided by sokol_app.h. +*/ +typedef struct sg_gl_context_desc { + bool force_gles2; +} sg_gl_context_desc; + +typedef struct sg_metal_context_desc { + const void* device; + const void* (*renderpass_descriptor_cb)(void); + const void* (*renderpass_descriptor_userdata_cb)(void*); + const void* (*drawable_cb)(void); + const void* (*drawable_userdata_cb)(void*); + void* user_data; +} sg_metal_context_desc; + +typedef struct sg_d3d11_context_desc { + const void* device; + const void* device_context; + const void* (*render_target_view_cb)(void); + const void* (*render_target_view_userdata_cb)(void*); + const void* (*depth_stencil_view_cb)(void); + const void* (*depth_stencil_view_userdata_cb)(void*); + void* user_data; +} sg_d3d11_context_desc; + +typedef struct sg_wgpu_context_desc { + const void* device; /* WGPUDevice */ + const void* (*render_view_cb)(void); /* returns WGPUTextureView */ + const void* (*render_view_userdata_cb)(void*); + const void* (*resolve_view_cb)(void); /* returns WGPUTextureView */ + const void* (*resolve_view_userdata_cb)(void*); + const void* (*depth_stencil_view_cb)(void); /* returns WGPUTextureView, must be WGPUTextureFormat_Depth24Plus8 */ + const void* (*depth_stencil_view_userdata_cb)(void*); + void* user_data; +} sg_wgpu_context_desc; + +typedef struct sg_context_desc { + sg_pixel_format color_format; + sg_pixel_format depth_format; + int sample_count; + sg_gl_context_desc gl; + sg_metal_context_desc metal; + sg_d3d11_context_desc d3d11; + sg_wgpu_context_desc wgpu; +} sg_context_desc; + +typedef struct sg_desc { + uint32_t _start_canary; + int buffer_pool_size; + int image_pool_size; + int shader_pool_size; + int pipeline_pool_size; + int pass_pool_size; + int context_pool_size; + int uniform_buffer_size; + int staging_buffer_size; + int sampler_cache_size; + sg_context_desc context; + uint32_t _end_canary; +} sg_desc; + +/* setup and misc functions */ +SOKOL_GFX_API_DECL void sg_setup(const sg_desc* desc); +SOKOL_GFX_API_DECL void sg_shutdown(void); +SOKOL_GFX_API_DECL bool sg_isvalid(void); +SOKOL_GFX_API_DECL void sg_reset_state_cache(void); +SOKOL_GFX_API_DECL sg_trace_hooks sg_install_trace_hooks(const sg_trace_hooks* trace_hooks); +SOKOL_GFX_API_DECL void sg_push_debug_group(const char* name); +SOKOL_GFX_API_DECL void sg_pop_debug_group(void); + +/* resource creation, destruction and updating */ +SOKOL_GFX_API_DECL sg_buffer sg_make_buffer(const sg_buffer_desc* desc); +SOKOL_GFX_API_DECL sg_image sg_make_image(const sg_image_desc* desc); +SOKOL_GFX_API_DECL sg_shader sg_make_shader(const sg_shader_desc* desc); +SOKOL_GFX_API_DECL sg_pipeline sg_make_pipeline(const sg_pipeline_desc* desc); +SOKOL_GFX_API_DECL sg_pass sg_make_pass(const sg_pass_desc* desc); +SOKOL_GFX_API_DECL void sg_destroy_buffer(sg_buffer buf); +SOKOL_GFX_API_DECL void sg_destroy_image(sg_image img); +SOKOL_GFX_API_DECL void sg_destroy_shader(sg_shader shd); +SOKOL_GFX_API_DECL void sg_destroy_pipeline(sg_pipeline pip); +SOKOL_GFX_API_DECL void sg_destroy_pass(sg_pass pass); +SOKOL_GFX_API_DECL void sg_update_buffer(sg_buffer buf, const sg_range* data); +SOKOL_GFX_API_DECL void sg_update_image(sg_image img, const sg_image_data* data); +SOKOL_GFX_API_DECL int sg_append_buffer(sg_buffer buf, const sg_range* data); +SOKOL_GFX_API_DECL bool sg_query_buffer_overflow(sg_buffer buf); + +/* rendering functions */ +SOKOL_GFX_API_DECL void sg_begin_default_pass(const sg_pass_action* pass_action, int width, int height); +SOKOL_GFX_API_DECL void sg_begin_default_passf(const sg_pass_action* pass_action, float width, float height); +SOKOL_GFX_API_DECL void sg_begin_pass(sg_pass pass, const sg_pass_action* pass_action); +SOKOL_GFX_API_DECL void sg_apply_viewport(int x, int y, int width, int height, bool origin_top_left); +SOKOL_GFX_API_DECL void sg_apply_viewportf(float x, float y, float width, float height, bool origin_top_left); +SOKOL_GFX_API_DECL void sg_apply_scissor_rect(int x, int y, int width, int height, bool origin_top_left); +SOKOL_GFX_API_DECL void sg_apply_scissor_rectf(float x, float y, float width, float height, bool origin_top_left); +SOKOL_GFX_API_DECL void sg_apply_pipeline(sg_pipeline pip); +SOKOL_GFX_API_DECL void sg_apply_bindings(const sg_bindings* bindings); +SOKOL_GFX_API_DECL void sg_apply_uniforms(sg_shader_stage stage, int ub_index, const sg_range* data); +SOKOL_GFX_API_DECL void sg_draw(int base_element, int num_elements, int num_instances); +SOKOL_GFX_API_DECL void sg_end_pass(void); +SOKOL_GFX_API_DECL void sg_commit(void); + +/* getting information */ +SOKOL_GFX_API_DECL sg_desc sg_query_desc(void); +SOKOL_GFX_API_DECL sg_backend sg_query_backend(void); +SOKOL_GFX_API_DECL sg_features sg_query_features(void); +SOKOL_GFX_API_DECL sg_limits sg_query_limits(void); +SOKOL_GFX_API_DECL sg_pixelformat_info sg_query_pixelformat(sg_pixel_format fmt); +/* get current state of a resource (INITIAL, ALLOC, VALID, FAILED, INVALID) */ +SOKOL_GFX_API_DECL sg_resource_state sg_query_buffer_state(sg_buffer buf); +SOKOL_GFX_API_DECL sg_resource_state sg_query_image_state(sg_image img); +SOKOL_GFX_API_DECL sg_resource_state sg_query_shader_state(sg_shader shd); +SOKOL_GFX_API_DECL sg_resource_state sg_query_pipeline_state(sg_pipeline pip); +SOKOL_GFX_API_DECL sg_resource_state sg_query_pass_state(sg_pass pass); +/* get runtime information about a resource */ +SOKOL_GFX_API_DECL sg_buffer_info sg_query_buffer_info(sg_buffer buf); +SOKOL_GFX_API_DECL sg_image_info sg_query_image_info(sg_image img); +SOKOL_GFX_API_DECL sg_shader_info sg_query_shader_info(sg_shader shd); +SOKOL_GFX_API_DECL sg_pipeline_info sg_query_pipeline_info(sg_pipeline pip); +SOKOL_GFX_API_DECL sg_pass_info sg_query_pass_info(sg_pass pass); +/* get resource creation desc struct with their default values replaced */ +SOKOL_GFX_API_DECL sg_buffer_desc sg_query_buffer_defaults(const sg_buffer_desc* desc); +SOKOL_GFX_API_DECL sg_image_desc sg_query_image_defaults(const sg_image_desc* desc); +SOKOL_GFX_API_DECL sg_shader_desc sg_query_shader_defaults(const sg_shader_desc* desc); +SOKOL_GFX_API_DECL sg_pipeline_desc sg_query_pipeline_defaults(const sg_pipeline_desc* desc); +SOKOL_GFX_API_DECL sg_pass_desc sg_query_pass_defaults(const sg_pass_desc* desc); + +/* separate resource allocation and initialization (for async setup) */ +SOKOL_GFX_API_DECL sg_buffer sg_alloc_buffer(void); +SOKOL_GFX_API_DECL sg_image sg_alloc_image(void); +SOKOL_GFX_API_DECL sg_shader sg_alloc_shader(void); +SOKOL_GFX_API_DECL sg_pipeline sg_alloc_pipeline(void); +SOKOL_GFX_API_DECL sg_pass sg_alloc_pass(void); +SOKOL_GFX_API_DECL void sg_dealloc_buffer(sg_buffer buf_id); +SOKOL_GFX_API_DECL void sg_dealloc_image(sg_image img_id); +SOKOL_GFX_API_DECL void sg_dealloc_shader(sg_shader shd_id); +SOKOL_GFX_API_DECL void sg_dealloc_pipeline(sg_pipeline pip_id); +SOKOL_GFX_API_DECL void sg_dealloc_pass(sg_pass pass_id); +SOKOL_GFX_API_DECL void sg_init_buffer(sg_buffer buf_id, const sg_buffer_desc* desc); +SOKOL_GFX_API_DECL void sg_init_image(sg_image img_id, const sg_image_desc* desc); +SOKOL_GFX_API_DECL void sg_init_shader(sg_shader shd_id, const sg_shader_desc* desc); +SOKOL_GFX_API_DECL void sg_init_pipeline(sg_pipeline pip_id, const sg_pipeline_desc* desc); +SOKOL_GFX_API_DECL void sg_init_pass(sg_pass pass_id, const sg_pass_desc* desc); +SOKOL_GFX_API_DECL bool sg_uninit_buffer(sg_buffer buf_id); +SOKOL_GFX_API_DECL bool sg_uninit_image(sg_image img_id); +SOKOL_GFX_API_DECL bool sg_uninit_shader(sg_shader shd_id); +SOKOL_GFX_API_DECL bool sg_uninit_pipeline(sg_pipeline pip_id); +SOKOL_GFX_API_DECL bool sg_uninit_pass(sg_pass pass_id); +SOKOL_GFX_API_DECL void sg_fail_buffer(sg_buffer buf_id); +SOKOL_GFX_API_DECL void sg_fail_image(sg_image img_id); +SOKOL_GFX_API_DECL void sg_fail_shader(sg_shader shd_id); +SOKOL_GFX_API_DECL void sg_fail_pipeline(sg_pipeline pip_id); +SOKOL_GFX_API_DECL void sg_fail_pass(sg_pass pass_id); + +/* rendering contexts (optional) */ +SOKOL_GFX_API_DECL sg_context sg_setup_context(void); +SOKOL_GFX_API_DECL void sg_activate_context(sg_context ctx_id); +SOKOL_GFX_API_DECL void sg_discard_context(sg_context ctx_id); + +/* Backend-specific helper functions, these may come in handy for mixing + sokol-gfx rendering with 'native backend' rendering functions. + + This group of functions will be expanded as needed. +*/ + +/* D3D11: return ID3D11Device */ +SOKOL_GFX_API_DECL const void* sg_d3d11_device(void); + +/* Metal: return __bridge-casted MTLDevice */ +SOKOL_GFX_API_DECL const void* sg_mtl_device(void); + +/* Metal: return __bridge-casted MTLRenderCommandEncoder in current pass (or zero if outside pass) */ +SOKOL_GFX_API_DECL const void* sg_mtl_render_command_encoder(void); + +#ifdef __cplusplus +} /* extern "C" */ + +/* reference-based equivalents for c++ */ +inline void sg_setup(const sg_desc& desc) { return sg_setup(&desc); } + +inline sg_buffer sg_make_buffer(const sg_buffer_desc& desc) { return sg_make_buffer(&desc); } +inline sg_image sg_make_image(const sg_image_desc& desc) { return sg_make_image(&desc); } +inline sg_shader sg_make_shader(const sg_shader_desc& desc) { return sg_make_shader(&desc); } +inline sg_pipeline sg_make_pipeline(const sg_pipeline_desc& desc) { return sg_make_pipeline(&desc); } +inline sg_pass sg_make_pass(const sg_pass_desc& desc) { return sg_make_pass(&desc); } +inline void sg_update_image(sg_image img, const sg_image_data& data) { return sg_update_image(img, &data); } + +inline void sg_begin_default_pass(const sg_pass_action& pass_action, int width, int height) { return sg_begin_default_pass(&pass_action, width, height); } +inline void sg_begin_default_passf(const sg_pass_action& pass_action, float width, float height) { return sg_begin_default_passf(&pass_action, width, height); } +inline void sg_begin_pass(sg_pass pass, const sg_pass_action& pass_action) { return sg_begin_pass(pass, &pass_action); } +inline void sg_apply_bindings(const sg_bindings& bindings) { return sg_apply_bindings(&bindings); } +inline void sg_apply_uniforms(sg_shader_stage stage, int ub_index, const sg_range& data) { return sg_apply_uniforms(stage, ub_index, &data); } + +inline sg_buffer_desc sg_query_buffer_defaults(const sg_buffer_desc& desc) { return sg_query_buffer_defaults(&desc); } +inline sg_image_desc sg_query_image_defaults(const sg_image_desc& desc) { return sg_query_image_defaults(&desc); } +inline sg_shader_desc sg_query_shader_defaults(const sg_shader_desc& desc) { return sg_query_shader_defaults(&desc); } +inline sg_pipeline_desc sg_query_pipeline_defaults(const sg_pipeline_desc& desc) { return sg_query_pipeline_defaults(&desc); } +inline sg_pass_desc sg_query_pass_defaults(const sg_pass_desc& desc) { return sg_query_pass_defaults(&desc); } + +inline void sg_init_buffer(sg_buffer buf_id, const sg_buffer_desc& desc) { return sg_init_buffer(buf_id, &desc); } +inline void sg_init_image(sg_image img_id, const sg_image_desc& desc) { return sg_init_image(img_id, &desc); } +inline void sg_init_shader(sg_shader shd_id, const sg_shader_desc& desc) { return sg_init_shader(shd_id, &desc); } +inline void sg_init_pipeline(sg_pipeline pip_id, const sg_pipeline_desc& desc) { return sg_init_pipeline(pip_id, &desc); } +inline void sg_init_pass(sg_pass pass_id, const sg_pass_desc& desc) { return sg_init_pass(pass_id, &desc); } + +inline void sg_update_buffer(sg_buffer buf_id, const sg_range& data) { return sg_update_buffer(buf_id, &data); } +inline int sg_append_buffer(sg_buffer buf_id, const sg_range& data) { return sg_append_buffer(buf_id, &data); } +#endif +#endif // SOKOL_GFX_INCLUDED + +/*--- IMPLEMENTATION ---------------------------------------------------------*/ +#ifdef SOKOL_GFX_IMPL +#define SOKOL_GFX_IMPL_INCLUDED (1) + +#if !(defined(SOKOL_GLCORE33)||defined(SOKOL_GLES2)||defined(SOKOL_GLES3)||defined(SOKOL_D3D11)||defined(SOKOL_METAL)||defined(SOKOL_WGPU)||defined(SOKOL_DUMMY_BACKEND)) +#error "Please select a backend with SOKOL_GLCORE33, SOKOL_GLES2, SOKOL_GLES3, SOKOL_D3D11, SOKOL_METAL, SOKOL_WGPU or SOKOL_DUMMY_BACKEND" +#endif +#include /* memset */ +#include /* FLT_MAX */ + +#ifndef SOKOL_API_IMPL + #define SOKOL_API_IMPL +#endif +#ifndef SOKOL_DEBUG + #ifndef NDEBUG + #define SOKOL_DEBUG (1) + #endif +#endif +#ifndef SOKOL_ASSERT + #include + #define SOKOL_ASSERT(c) assert(c) +#endif +#ifndef SOKOL_VALIDATE_BEGIN + #define SOKOL_VALIDATE_BEGIN() _sg_validate_begin() +#endif +#ifndef SOKOL_VALIDATE + #define SOKOL_VALIDATE(cond, err) _sg_validate((cond), err) +#endif +#ifndef SOKOL_VALIDATE_END + #define SOKOL_VALIDATE_END() _sg_validate_end() +#endif +#ifndef SOKOL_UNREACHABLE + #define SOKOL_UNREACHABLE SOKOL_ASSERT(false) +#endif +#ifndef SOKOL_MALLOC + #include + #define SOKOL_MALLOC(s) malloc(s) + #define SOKOL_FREE(p) free(p) +#endif +#ifndef SOKOL_LOG + #ifdef SOKOL_DEBUG + #include + #define SOKOL_LOG(s) { SOKOL_ASSERT(s); puts(s); } + #else + #define SOKOL_LOG(s) + #endif +#endif + +#ifndef _SOKOL_PRIVATE + #if defined(__GNUC__) || defined(__clang__) + #define _SOKOL_PRIVATE __attribute__((unused)) static + #else + #define _SOKOL_PRIVATE static + #endif +#endif + +#ifndef _SOKOL_UNUSED + #define _SOKOL_UNUSED(x) (void)(x) +#endif + +#if defined(SOKOL_TRACE_HOOKS) +#define _SG_TRACE_ARGS(fn, ...) if (_sg.hooks.fn) { _sg.hooks.fn(__VA_ARGS__, _sg.hooks.user_data); } +#define _SG_TRACE_NOARGS(fn) if (_sg.hooks.fn) { _sg.hooks.fn(_sg.hooks.user_data); } +#else +#define _SG_TRACE_ARGS(fn, ...) +#define _SG_TRACE_NOARGS(fn) +#endif + +/* default clear values */ +#ifndef SG_DEFAULT_CLEAR_RED +#define SG_DEFAULT_CLEAR_RED (0.5f) +#endif +#ifndef SG_DEFAULT_CLEAR_GREEN +#define SG_DEFAULT_CLEAR_GREEN (0.5f) +#endif +#ifndef SG_DEFAULT_CLEAR_BLUE +#define SG_DEFAULT_CLEAR_BLUE (0.5f) +#endif +#ifndef SG_DEFAULT_CLEAR_ALPHA +#define SG_DEFAULT_CLEAR_ALPHA (1.0f) +#endif +#ifndef SG_DEFAULT_CLEAR_DEPTH +#define SG_DEFAULT_CLEAR_DEPTH (1.0f) +#endif +#ifndef SG_DEFAULT_CLEAR_STENCIL +#define SG_DEFAULT_CLEAR_STENCIL (0) +#endif + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4115) /* named type definition in parentheses */ +#pragma warning(disable:4505) /* unreferenced local function has been removed */ +#pragma warning(disable:4201) /* nonstandard extension used: nameless struct/union (needed by d3d11.h) */ +#pragma warning(disable:4054) /* 'type cast': from function pointer */ +#pragma warning(disable:4055) /* 'type cast': from data pointer */ +#endif + +#if defined(SOKOL_D3D11) + #ifndef D3D11_NO_HELPERS + #define D3D11_NO_HELPERS + #endif + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #ifndef NOMINMAX + #define NOMINMAX + #endif + #include + #include + #ifdef _MSC_VER + #if (defined(WINAPI_FAMILY_PARTITION) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) + #pragma comment (lib, "WindowsApp") + #else + #pragma comment (lib, "kernel32") + #pragma comment (lib, "user32") + #pragma comment (lib, "dxgi") + #pragma comment (lib, "d3d11") + #endif + #endif +#elif defined(SOKOL_METAL) + // see https://clang.llvm.org/docs/LanguageExtensions.html#automatic-reference-counting + #if !defined(__cplusplus) + #if __has_feature(objc_arc) && !__has_feature(objc_arc_fields) + #error "sokol_gfx.h requires __has_feature(objc_arc_field) if ARC is enabled (use a more recent compiler version)" + #endif + #endif + #include + #if defined(TARGET_OS_IPHONE) && !TARGET_OS_IPHONE + #define _SG_TARGET_MACOS (1) + #else + #define _SG_TARGET_IOS (1) + #if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR + #define _SG_TARGET_IOS_SIMULATOR (1) + #endif + #endif + #import +#elif defined(SOKOL_WGPU) + #if defined(__EMSCRIPTEN__) + #include + #else + #include + #endif +#elif defined(SOKOL_GLCORE33) || defined(SOKOL_GLES2) || defined(SOKOL_GLES3) + #define _SOKOL_ANY_GL (1) + + // include platform specific GL headers (or on Win32: use an embedded GL loader) + #if !defined(SOKOL_EXTERNAL_GL_LOADER) + #if defined(_WIN32) + #if defined(SOKOL_GLCORE33) && !defined(SOKOL_EXTERNAL_GL_LOADER) + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #ifndef NOMINMAX + #define NOMINMAX + #endif + #include + #define _SOKOL_USE_WIN32_GL_LOADER (1) + #pragma comment (lib, "kernel32") // GetProcAddress() + #endif + #elif defined(__APPLE__) + #include + #ifndef GL_SILENCE_DEPRECATION + #define GL_SILENCE_DEPRECATION + #endif + #if defined(TARGET_OS_IPHONE) && !TARGET_OS_IPHONE + #include + #else + #include + #include + #endif + #elif defined(__EMSCRIPTEN__) || defined(__ANDROID__) + #if defined(SOKOL_GLES3) + #include + #elif defined(SOKOL_GLES2) + #ifndef GL_EXT_PROTOTYPES + #define GL_GLEXT_PROTOTYPES + #endif + #include + #include + #endif + #elif defined(__linux__) || defined(__unix__) + #define GL_GLEXT_PROTOTYPES + #include + #endif + #endif + + // optional GL loader definitions (only on Win32) + #if defined(_SOKOL_USE_WIN32_GL_LOADER) + #define __gl_h_ 1 + #define __gl32_h_ 1 + #define __gl31_h_ 1 + #define __GL_H__ 1 + #define __glext_h_ 1 + #define __GLEXT_H_ 1 + #define __gltypes_h_ 1 + #define __glcorearb_h_ 1 + #define __gl_glcorearb_h_ 1 + #define GL_APIENTRY APIENTRY + + typedef unsigned int GLenum; + typedef unsigned int GLuint; + typedef int GLsizei; + typedef char GLchar; + typedef ptrdiff_t GLintptr; + typedef ptrdiff_t GLsizeiptr; + typedef double GLclampd; + typedef unsigned short GLushort; + typedef unsigned char GLubyte; + typedef unsigned char GLboolean; + typedef uint64_t GLuint64; + typedef double GLdouble; + typedef unsigned short GLhalf; + typedef float GLclampf; + typedef unsigned int GLbitfield; + typedef signed char GLbyte; + typedef short GLshort; + typedef void GLvoid; + typedef int64_t GLint64; + typedef float GLfloat; + typedef struct __GLsync * GLsync; + typedef int GLint; + #define GL_INT_2_10_10_10_REV 0x8D9F + #define GL_R32F 0x822E + #define GL_PROGRAM_POINT_SIZE 0x8642 + #define GL_STENCIL_ATTACHMENT 0x8D20 + #define GL_DEPTH_ATTACHMENT 0x8D00 + #define GL_COLOR_ATTACHMENT2 0x8CE2 + #define GL_COLOR_ATTACHMENT0 0x8CE0 + #define GL_R16F 0x822D + #define GL_COLOR_ATTACHMENT22 0x8CF6 + #define GL_DRAW_FRAMEBUFFER 0x8CA9 + #define GL_FRAMEBUFFER_COMPLETE 0x8CD5 + #define GL_NUM_EXTENSIONS 0x821D + #define GL_INFO_LOG_LENGTH 0x8B84 + #define GL_VERTEX_SHADER 0x8B31 + #define GL_INCR 0x1E02 + #define GL_DYNAMIC_DRAW 0x88E8 + #define GL_STATIC_DRAW 0x88E4 + #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 + #define GL_TEXTURE_CUBE_MAP 0x8513 + #define GL_FUNC_SUBTRACT 0x800A + #define GL_FUNC_REVERSE_SUBTRACT 0x800B + #define GL_CONSTANT_COLOR 0x8001 + #define GL_DECR_WRAP 0x8508 + #define GL_R8 0x8229 + #define GL_LINEAR_MIPMAP_LINEAR 0x2703 + #define GL_ELEMENT_ARRAY_BUFFER 0x8893 + #define GL_SHORT 0x1402 + #define GL_DEPTH_TEST 0x0B71 + #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 + #define GL_LINK_STATUS 0x8B82 + #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 + #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E + #define GL_RGBA16F 0x881A + #define GL_CONSTANT_ALPHA 0x8003 + #define GL_READ_FRAMEBUFFER 0x8CA8 + #define GL_TEXTURE0 0x84C0 + #define GL_TEXTURE_MIN_LOD 0x813A + #define GL_CLAMP_TO_EDGE 0x812F + #define GL_UNSIGNED_SHORT_5_6_5 0x8363 + #define GL_TEXTURE_WRAP_R 0x8072 + #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 + #define GL_NEAREST_MIPMAP_NEAREST 0x2700 + #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 + #define GL_SRC_ALPHA_SATURATE 0x0308 + #define GL_STREAM_DRAW 0x88E0 + #define GL_ONE 1 + #define GL_NEAREST_MIPMAP_LINEAR 0x2702 + #define GL_RGB10_A2 0x8059 + #define GL_RGBA8 0x8058 + #define GL_COLOR_ATTACHMENT1 0x8CE1 + #define GL_RGBA4 0x8056 + #define GL_RGB8 0x8051 + #define GL_ARRAY_BUFFER 0x8892 + #define GL_STENCIL 0x1802 + #define GL_TEXTURE_2D 0x0DE1 + #define GL_DEPTH 0x1801 + #define GL_FRONT 0x0404 + #define GL_STENCIL_BUFFER_BIT 0x00000400 + #define GL_REPEAT 0x2901 + #define GL_RGBA 0x1908 + #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 + #define GL_DECR 0x1E03 + #define GL_FRAGMENT_SHADER 0x8B30 + #define GL_FLOAT 0x1406 + #define GL_TEXTURE_MAX_LOD 0x813B + #define GL_DEPTH_COMPONENT 0x1902 + #define GL_ONE_MINUS_DST_ALPHA 0x0305 + #define GL_COLOR 0x1800 + #define GL_TEXTURE_2D_ARRAY 0x8C1A + #define GL_TRIANGLES 0x0004 + #define GL_UNSIGNED_BYTE 0x1401 + #define GL_TEXTURE_MAG_FILTER 0x2800 + #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 + #define GL_NONE 0 + #define GL_SRC_COLOR 0x0300 + #define GL_BYTE 0x1400 + #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A + #define GL_LINE_STRIP 0x0003 + #define GL_TEXTURE_3D 0x806F + #define GL_CW 0x0900 + #define GL_LINEAR 0x2601 + #define GL_RENDERBUFFER 0x8D41 + #define GL_GEQUAL 0x0206 + #define GL_COLOR_BUFFER_BIT 0x00004000 + #define GL_RGBA32F 0x8814 + #define GL_BLEND 0x0BE2 + #define GL_ONE_MINUS_SRC_ALPHA 0x0303 + #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 + #define GL_TEXTURE_WRAP_T 0x2803 + #define GL_TEXTURE_WRAP_S 0x2802 + #define GL_TEXTURE_MIN_FILTER 0x2801 + #define GL_LINEAR_MIPMAP_NEAREST 0x2701 + #define GL_EXTENSIONS 0x1F03 + #define GL_NO_ERROR 0 + #define GL_REPLACE 0x1E01 + #define GL_KEEP 0x1E00 + #define GL_CCW 0x0901 + #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 + #define GL_RGB 0x1907 + #define GL_TRIANGLE_STRIP 0x0005 + #define GL_FALSE 0 + #define GL_ZERO 0 + #define GL_CULL_FACE 0x0B44 + #define GL_INVERT 0x150A + #define GL_INT 0x1404 + #define GL_UNSIGNED_INT 0x1405 + #define GL_UNSIGNED_SHORT 0x1403 + #define GL_NEAREST 0x2600 + #define GL_SCISSOR_TEST 0x0C11 + #define GL_LEQUAL 0x0203 + #define GL_STENCIL_TEST 0x0B90 + #define GL_DITHER 0x0BD0 + #define GL_DEPTH_COMPONENT16 0x81A5 + #define GL_EQUAL 0x0202 + #define GL_FRAMEBUFFER 0x8D40 + #define GL_RGB5 0x8050 + #define GL_LINES 0x0001 + #define GL_DEPTH_BUFFER_BIT 0x00000100 + #define GL_SRC_ALPHA 0x0302 + #define GL_INCR_WRAP 0x8507 + #define GL_LESS 0x0201 + #define GL_MULTISAMPLE 0x809D + #define GL_FRAMEBUFFER_BINDING 0x8CA6 + #define GL_BACK 0x0405 + #define GL_ALWAYS 0x0207 + #define GL_FUNC_ADD 0x8006 + #define GL_ONE_MINUS_DST_COLOR 0x0307 + #define GL_NOTEQUAL 0x0205 + #define GL_DST_COLOR 0x0306 + #define GL_COMPILE_STATUS 0x8B81 + #define GL_RED 0x1903 + #define GL_COLOR_ATTACHMENT3 0x8CE3 + #define GL_DST_ALPHA 0x0304 + #define GL_RGB5_A1 0x8057 + #define GL_GREATER 0x0204 + #define GL_POLYGON_OFFSET_FILL 0x8037 + #define GL_TRUE 1 + #define GL_NEVER 0x0200 + #define GL_POINTS 0x0000 + #define GL_ONE_MINUS_SRC_COLOR 0x0301 + #define GL_MIRRORED_REPEAT 0x8370 + #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D + #define GL_R11F_G11F_B10F 0x8C3A + #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B + #define GL_RGBA32UI 0x8D70 + #define GL_RGB32UI 0x8D71 + #define GL_RGBA16UI 0x8D76 + #define GL_RGB16UI 0x8D77 + #define GL_RGBA8UI 0x8D7C + #define GL_RGB8UI 0x8D7D + #define GL_RGBA32I 0x8D82 + #define GL_RGB32I 0x8D83 + #define GL_RGBA16I 0x8D88 + #define GL_RGB16I 0x8D89 + #define GL_RGBA8I 0x8D8E + #define GL_RGB8I 0x8D8F + #define GL_RED_INTEGER 0x8D94 + #define GL_RG 0x8227 + #define GL_RG_INTEGER 0x8228 + #define GL_R8 0x8229 + #define GL_R16 0x822A + #define GL_RG8 0x822B + #define GL_RG16 0x822C + #define GL_R16F 0x822D + #define GL_R32F 0x822E + #define GL_RG16F 0x822F + #define GL_RG32F 0x8230 + #define GL_R8I 0x8231 + #define GL_R8UI 0x8232 + #define GL_R16I 0x8233 + #define GL_R16UI 0x8234 + #define GL_R32I 0x8235 + #define GL_R32UI 0x8236 + #define GL_RG8I 0x8237 + #define GL_RG8UI 0x8238 + #define GL_RG16I 0x8239 + #define GL_RG16UI 0x823A + #define GL_RG32I 0x823B + #define GL_RG32UI 0x823C + #define GL_RGBA_INTEGER 0x8D99 + #define GL_R8_SNORM 0x8F94 + #define GL_RG8_SNORM 0x8F95 + #define GL_RGB8_SNORM 0x8F96 + #define GL_RGBA8_SNORM 0x8F97 + #define GL_R16_SNORM 0x8F98 + #define GL_RG16_SNORM 0x8F99 + #define GL_RGB16_SNORM 0x8F9A + #define GL_RGBA16_SNORM 0x8F9B + #define GL_RGBA16 0x805B + #define GL_MAX_TEXTURE_SIZE 0x0D33 + #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C + #define GL_MAX_3D_TEXTURE_SIZE 0x8073 + #define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF + #define GL_MAX_VERTEX_ATTRIBS 0x8869 + #define GL_CLAMP_TO_BORDER 0x812D + #define GL_TEXTURE_BORDER_COLOR 0x1004 + #define GL_CURRENT_PROGRAM 0x8B8D + #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB + #endif + + #ifndef GL_UNSIGNED_INT_2_10_10_10_REV + #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 + #endif + #ifndef GL_UNSIGNED_INT_24_8 + #define GL_UNSIGNED_INT_24_8 0x84FA + #endif + #ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT + #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE + #endif + #ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT + #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + #endif + #ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 + #endif + #ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 + #endif + #ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + #endif + #ifndef GL_COMPRESSED_RED_RGTC1 + #define GL_COMPRESSED_RED_RGTC1 0x8DBB + #endif + #ifndef GL_COMPRESSED_SIGNED_RED_RGTC1 + #define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC + #endif + #ifndef GL_COMPRESSED_RED_GREEN_RGTC2 + #define GL_COMPRESSED_RED_GREEN_RGTC2 0x8DBD + #endif + #ifndef GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2 + #define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2 0x8DBE + #endif + #ifndef GL_COMPRESSED_RGBA_BPTC_UNORM_ARB + #define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C + #endif + #ifndef GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB + #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D + #endif + #ifndef GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB + #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E + #endif + #ifndef GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB + #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F + #endif + #ifndef GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG + #define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 + #endif + #ifndef GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG + #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 + #endif + #ifndef GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG + #define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 + #endif + #ifndef GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG + #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 + #endif + #ifndef GL_COMPRESSED_RGB8_ETC2 + #define GL_COMPRESSED_RGB8_ETC2 0x9274 + #endif + #ifndef GL_COMPRESSED_RGBA8_ETC2_EAC + #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 + #endif + #ifndef GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 + #define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 + #endif + #ifndef GL_COMPRESSED_RG11_EAC + #define GL_COMPRESSED_RG11_EAC 0x9272 + #endif + #ifndef GL_COMPRESSED_SIGNED_RG11_EAC + #define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 + #endif + #ifndef GL_DEPTH24_STENCIL8 + #define GL_DEPTH24_STENCIL8 0x88F0 + #endif + #ifndef GL_HALF_FLOAT + #define GL_HALF_FLOAT 0x140B + #endif + #ifndef GL_DEPTH_STENCIL + #define GL_DEPTH_STENCIL 0x84F9 + #endif + #ifndef GL_LUMINANCE + #define GL_LUMINANCE 0x1909 + #endif + + #ifdef SOKOL_GLES2 + #ifdef GL_ANGLE_instanced_arrays + #define _SOKOL_GL_INSTANCING_ENABLED + #define glDrawArraysInstanced(mode, first, count, instancecount) glDrawArraysInstancedANGLE(mode, first, count, instancecount) + #define glDrawElementsInstanced(mode, count, type, indices, instancecount) glDrawElementsInstancedANGLE(mode, count, type, indices, instancecount) + #define glVertexAttribDivisor(index, divisor) glVertexAttribDivisorANGLE(index, divisor) + #elif defined(GL_EXT_draw_instanced) && defined(GL_EXT_instanced_arrays) + #define _SOKOL_GL_INSTANCING_ENABLED + #define glDrawArraysInstanced(mode, first, count, instancecount) glDrawArraysInstancedEXT(mode, first, count, instancecount) + #define glDrawElementsInstanced(mode, count, type, indices, instancecount) glDrawElementsInstancedEXT(mode, count, type, indices, instancecount) + #define glVertexAttribDivisor(index, divisor) glVertexAttribDivisorEXT(index, divisor) + #else + #define _SOKOL_GLES2_INSTANCING_ERROR "Select GL_ANGLE_instanced_arrays or (GL_EXT_draw_instanced & GL_EXT_instanced_arrays) to enable instancing in GLES2" + #define glDrawArraysInstanced(mode, first, count, instancecount) SOKOL_ASSERT(0 && _SOKOL_GLES2_INSTANCING_ERROR) + #define glDrawElementsInstanced(mode, count, type, indices, instancecount) SOKOL_ASSERT(0 && _SOKOL_GLES2_INSTANCING_ERROR) + #define glVertexAttribDivisor(index, divisor) SOKOL_ASSERT(0 && _SOKOL_GLES2_INSTANCING_ERROR) + #endif + #else + #define _SOKOL_GL_INSTANCING_ENABLED + #endif + #define _SG_GL_CHECK_ERROR() { SOKOL_ASSERT(glGetError() == GL_NO_ERROR); } +#endif + +/*=== COMMON BACKEND STUFF ===================================================*/ + +/* resource pool slots */ +typedef struct { + uint32_t id; + uint32_t ctx_id; + sg_resource_state state; +} _sg_slot_t; + +/* constants */ +enum { + _SG_STRING_SIZE = 16, + _SG_SLOT_SHIFT = 16, + _SG_SLOT_MASK = (1<<_SG_SLOT_SHIFT)-1, + _SG_MAX_POOL_SIZE = (1<<_SG_SLOT_SHIFT), + _SG_DEFAULT_BUFFER_POOL_SIZE = 128, + _SG_DEFAULT_IMAGE_POOL_SIZE = 128, + _SG_DEFAULT_SHADER_POOL_SIZE = 32, + _SG_DEFAULT_PIPELINE_POOL_SIZE = 64, + _SG_DEFAULT_PASS_POOL_SIZE = 16, + _SG_DEFAULT_CONTEXT_POOL_SIZE = 16, + _SG_DEFAULT_SAMPLER_CACHE_CAPACITY = 64, + _SG_DEFAULT_UB_SIZE = 4 * 1024 * 1024, + _SG_DEFAULT_STAGING_SIZE = 8 * 1024 * 1024, +}; + +/* fixed-size string */ +typedef struct { + char buf[_SG_STRING_SIZE]; +} _sg_str_t; + +/* helper macros */ +#define _sg_def(val, def) (((val) == 0) ? (def) : (val)) +#define _sg_def_flt(val, def) (((val) == 0.0f) ? (def) : (val)) +#define _sg_min(a,b) (((a)<(b))?(a):(b)) +#define _sg_max(a,b) (((a)>(b))?(a):(b)) +#define _sg_clamp(v,v0,v1) (((v)<(v0))?(v0):(((v)>(v1))?(v1):(v))) +#define _sg_fequal(val,cmp,delta) ((((val)-(cmp))> -(delta))&&(((val)-(cmp))<(delta))) + +typedef struct { + int size; + int append_pos; + bool append_overflow; + sg_buffer_type type; + sg_usage usage; + uint32_t update_frame_index; + uint32_t append_frame_index; + int num_slots; + int active_slot; +} _sg_buffer_common_t; + +_SOKOL_PRIVATE void _sg_buffer_common_init(_sg_buffer_common_t* cmn, const sg_buffer_desc* desc) { + cmn->size = (int)desc->size; + cmn->append_pos = 0; + cmn->append_overflow = false; + cmn->type = desc->type; + cmn->usage = desc->usage; + cmn->update_frame_index = 0; + cmn->append_frame_index = 0; + cmn->num_slots = (cmn->usage == SG_USAGE_IMMUTABLE) ? 1 : SG_NUM_INFLIGHT_FRAMES; + cmn->active_slot = 0; +} + +typedef struct { + sg_image_type type; + bool render_target; + int width; + int height; + int num_slices; + int num_mipmaps; + sg_usage usage; + sg_pixel_format pixel_format; + int sample_count; + sg_filter min_filter; + sg_filter mag_filter; + sg_wrap wrap_u; + sg_wrap wrap_v; + sg_wrap wrap_w; + sg_border_color border_color; + uint32_t max_anisotropy; + uint32_t upd_frame_index; + int num_slots; + int active_slot; +} _sg_image_common_t; + +_SOKOL_PRIVATE void _sg_image_common_init(_sg_image_common_t* cmn, const sg_image_desc* desc) { + cmn->type = desc->type; + cmn->render_target = desc->render_target; + cmn->width = desc->width; + cmn->height = desc->height; + cmn->num_slices = desc->num_slices; + cmn->num_mipmaps = desc->num_mipmaps; + cmn->usage = desc->usage; + cmn->pixel_format = desc->pixel_format; + cmn->sample_count = desc->sample_count; + cmn->min_filter = desc->min_filter; + cmn->mag_filter = desc->mag_filter; + cmn->wrap_u = desc->wrap_u; + cmn->wrap_v = desc->wrap_v; + cmn->wrap_w = desc->wrap_w; + cmn->border_color = desc->border_color; + cmn->max_anisotropy = desc->max_anisotropy; + cmn->upd_frame_index = 0; + cmn->num_slots = (cmn->usage == SG_USAGE_IMMUTABLE) ? 1 : SG_NUM_INFLIGHT_FRAMES; + cmn->active_slot = 0; +} + +typedef struct { + size_t size; +} _sg_uniform_block_t; + +typedef struct { + sg_image_type image_type; + sg_sampler_type sampler_type; +} _sg_shader_image_t; + +typedef struct { + int num_uniform_blocks; + int num_images; + _sg_uniform_block_t uniform_blocks[SG_MAX_SHADERSTAGE_UBS]; + _sg_shader_image_t images[SG_MAX_SHADERSTAGE_IMAGES]; +} _sg_shader_stage_t; + +typedef struct { + _sg_shader_stage_t stage[SG_NUM_SHADER_STAGES]; +} _sg_shader_common_t; + +_SOKOL_PRIVATE void _sg_shader_common_init(_sg_shader_common_t* cmn, const sg_shader_desc* desc) { + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + const sg_shader_stage_desc* stage_desc = (stage_index == SG_SHADERSTAGE_VS) ? &desc->vs : &desc->fs; + _sg_shader_stage_t* stage = &cmn->stage[stage_index]; + SOKOL_ASSERT(stage->num_uniform_blocks == 0); + for (int ub_index = 0; ub_index < SG_MAX_SHADERSTAGE_UBS; ub_index++) { + const sg_shader_uniform_block_desc* ub_desc = &stage_desc->uniform_blocks[ub_index]; + if (0 == ub_desc->size) { + break; + } + stage->uniform_blocks[ub_index].size = ub_desc->size; + stage->num_uniform_blocks++; + } + SOKOL_ASSERT(stage->num_images == 0); + for (int img_index = 0; img_index < SG_MAX_SHADERSTAGE_IMAGES; img_index++) { + const sg_shader_image_desc* img_desc = &stage_desc->images[img_index]; + if (img_desc->image_type == _SG_IMAGETYPE_DEFAULT) { + break; + } + stage->images[img_index].image_type = img_desc->image_type; + stage->images[img_index].sampler_type = img_desc->sampler_type; + stage->num_images++; + } + } +} + +typedef struct { + sg_shader shader_id; + sg_index_type index_type; + bool use_instanced_draw; + bool vertex_layout_valid[SG_MAX_SHADERSTAGE_BUFFERS]; + int color_attachment_count; + sg_pixel_format color_formats[SG_MAX_COLOR_ATTACHMENTS]; + sg_pixel_format depth_format; + int sample_count; + float depth_bias; + float depth_bias_slope_scale; + float depth_bias_clamp; + sg_color blend_color; +} _sg_pipeline_common_t; + +_SOKOL_PRIVATE void _sg_pipeline_common_init(_sg_pipeline_common_t* cmn, const sg_pipeline_desc* desc) { + SOKOL_ASSERT((desc->color_count >= 1) && (desc->color_count <= SG_MAX_COLOR_ATTACHMENTS)); + cmn->shader_id = desc->shader; + cmn->index_type = desc->index_type; + cmn->use_instanced_draw = false; + for (int i = 0; i < SG_MAX_SHADERSTAGE_BUFFERS; i++) { + cmn->vertex_layout_valid[i] = false; + } + cmn->color_attachment_count = desc->color_count; + for (int i = 0; i < cmn->color_attachment_count; i++) { + cmn->color_formats[i] = desc->colors[i].pixel_format; + } + cmn->depth_format = desc->depth.pixel_format; + cmn->sample_count = desc->sample_count; + cmn->depth_bias = desc->depth.bias; + cmn->depth_bias_slope_scale = desc->depth.bias_slope_scale; + cmn->depth_bias_clamp = desc->depth.bias_clamp; + cmn->blend_color = desc->blend_color; +} + +typedef struct { + sg_image image_id; + int mip_level; + int slice; +} _sg_pass_attachment_common_t; + +typedef struct { + int num_color_atts; + _sg_pass_attachment_common_t color_atts[SG_MAX_COLOR_ATTACHMENTS]; + _sg_pass_attachment_common_t ds_att; +} _sg_pass_common_t; + +_SOKOL_PRIVATE void _sg_pass_common_init(_sg_pass_common_t* cmn, const sg_pass_desc* desc) { + const sg_pass_attachment_desc* att_desc; + _sg_pass_attachment_common_t* att; + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + att_desc = &desc->color_attachments[i]; + if (att_desc->image.id != SG_INVALID_ID) { + cmn->num_color_atts++; + att = &cmn->color_atts[i]; + att->image_id = att_desc->image; + att->mip_level = att_desc->mip_level; + att->slice = att_desc->slice; + } + } + att_desc = &desc->depth_stencil_attachment; + if (att_desc->image.id != SG_INVALID_ID) { + att = &cmn->ds_att; + att->image_id = att_desc->image; + att->mip_level = att_desc->mip_level; + att->slice = att_desc->slice; + } +} + +/*=== GENERIC SAMPLER CACHE ==================================================*/ + +/* + this is used by the Metal and WGPU backends to reduce the + number of sampler state objects created through the backend API +*/ +typedef struct { + sg_filter min_filter; + sg_filter mag_filter; + sg_wrap wrap_u; + sg_wrap wrap_v; + sg_wrap wrap_w; + sg_border_color border_color; + uint32_t max_anisotropy; + int min_lod; /* orig min/max_lod is float, this is int(min/max_lod*1000.0) */ + int max_lod; + uintptr_t sampler_handle; +} _sg_sampler_cache_item_t; + +typedef struct { + int capacity; + int num_items; + _sg_sampler_cache_item_t* items; +} _sg_sampler_cache_t; + +_SOKOL_PRIVATE void _sg_smpcache_init(_sg_sampler_cache_t* cache, int capacity) { + SOKOL_ASSERT(cache && (capacity > 0)); + memset(cache, 0, sizeof(_sg_sampler_cache_t)); + cache->capacity = capacity; + const size_t size = (size_t)cache->capacity * sizeof(_sg_sampler_cache_item_t); + cache->items = (_sg_sampler_cache_item_t*) SOKOL_MALLOC(size); + SOKOL_ASSERT(cache->items); + memset(cache->items, 0, size); +} + +_SOKOL_PRIVATE void _sg_smpcache_discard(_sg_sampler_cache_t* cache) { + SOKOL_ASSERT(cache && cache->items); + SOKOL_FREE(cache->items); + cache->items = 0; + cache->num_items = 0; + cache->capacity = 0; +} + +_SOKOL_PRIVATE int _sg_smpcache_minlod_int(float min_lod) { + return (int) (min_lod * 1000.0f); +} + +_SOKOL_PRIVATE int _sg_smpcache_maxlod_int(float max_lod) { + return (int) (_sg_clamp(max_lod, 0.0f, 1000.0f) * 1000.0f); +} + +_SOKOL_PRIVATE int _sg_smpcache_find_item(const _sg_sampler_cache_t* cache, const sg_image_desc* img_desc) { + /* return matching sampler cache item index or -1 */ + SOKOL_ASSERT(cache && cache->items); + SOKOL_ASSERT(img_desc); + const int min_lod = _sg_smpcache_minlod_int(img_desc->min_lod); + const int max_lod = _sg_smpcache_maxlod_int(img_desc->max_lod); + for (int i = 0; i < cache->num_items; i++) { + const _sg_sampler_cache_item_t* item = &cache->items[i]; + if ((img_desc->min_filter == item->min_filter) && + (img_desc->mag_filter == item->mag_filter) && + (img_desc->wrap_u == item->wrap_u) && + (img_desc->wrap_v == item->wrap_v) && + (img_desc->wrap_w == item->wrap_w) && + (img_desc->max_anisotropy == item->max_anisotropy) && + (img_desc->border_color == item->border_color) && + (min_lod == item->min_lod) && + (max_lod == item->max_lod)) + { + return i; + } + } + /* fallthrough: no matching cache item found */ + return -1; +} + +_SOKOL_PRIVATE void _sg_smpcache_add_item(_sg_sampler_cache_t* cache, const sg_image_desc* img_desc, uintptr_t sampler_handle) { + SOKOL_ASSERT(cache && cache->items); + SOKOL_ASSERT(img_desc); + SOKOL_ASSERT(cache->num_items < cache->capacity); + const int item_index = cache->num_items++; + _sg_sampler_cache_item_t* item = &cache->items[item_index]; + item->min_filter = img_desc->min_filter; + item->mag_filter = img_desc->mag_filter; + item->wrap_u = img_desc->wrap_u; + item->wrap_v = img_desc->wrap_v; + item->wrap_w = img_desc->wrap_w; + item->border_color = img_desc->border_color; + item->max_anisotropy = img_desc->max_anisotropy; + item->min_lod = _sg_smpcache_minlod_int(img_desc->min_lod); + item->max_lod = _sg_smpcache_maxlod_int(img_desc->max_lod); + item->sampler_handle = sampler_handle; +} + +_SOKOL_PRIVATE uintptr_t _sg_smpcache_sampler(_sg_sampler_cache_t* cache, int item_index) { + SOKOL_ASSERT(cache && cache->items); + SOKOL_ASSERT(item_index < cache->num_items); + return cache->items[item_index].sampler_handle; +} + +/*=== DUMMY BACKEND DECLARATIONS =============================================*/ +#if defined(SOKOL_DUMMY_BACKEND) +typedef struct { + _sg_slot_t slot; + _sg_buffer_common_t cmn; +} _sg_dummy_buffer_t; +typedef _sg_dummy_buffer_t _sg_buffer_t; + +typedef struct { + _sg_slot_t slot; + _sg_image_common_t cmn; +} _sg_dummy_image_t; +typedef _sg_dummy_image_t _sg_image_t; + +typedef struct { + _sg_slot_t slot; + _sg_shader_common_t cmn; +} _sg_dummy_shader_t; +typedef _sg_dummy_shader_t _sg_shader_t; + +typedef struct { + _sg_slot_t slot; + _sg_shader_t* shader; + _sg_pipeline_common_t cmn; +} _sg_dummy_pipeline_t; +typedef _sg_dummy_pipeline_t _sg_pipeline_t; + +typedef struct { + _sg_image_t* image; +} _sg_dummy_attachment_t; + +typedef struct { + _sg_slot_t slot; + _sg_pass_common_t cmn; + struct { + _sg_dummy_attachment_t color_atts[SG_MAX_COLOR_ATTACHMENTS]; + _sg_dummy_attachment_t ds_att; + } dmy; +} _sg_dummy_pass_t; +typedef _sg_dummy_pass_t _sg_pass_t; +typedef _sg_pass_attachment_common_t _sg_pass_attachment_t; + +typedef struct { + _sg_slot_t slot; +} _sg_dummy_context_t; +typedef _sg_dummy_context_t _sg_context_t; + +/*== GL BACKEND DECLARATIONS =================================================*/ +#elif defined(_SOKOL_ANY_GL) +typedef struct { + _sg_slot_t slot; + _sg_buffer_common_t cmn; + struct { + GLuint buf[SG_NUM_INFLIGHT_FRAMES]; + bool ext_buffers; /* if true, external buffers were injected with sg_buffer_desc.gl_buffers */ + } gl; +} _sg_gl_buffer_t; +typedef _sg_gl_buffer_t _sg_buffer_t; + +typedef struct { + _sg_slot_t slot; + _sg_image_common_t cmn; + struct { + GLenum target; + GLuint depth_render_buffer; + GLuint msaa_render_buffer; + GLuint tex[SG_NUM_INFLIGHT_FRAMES]; + bool ext_textures; /* if true, external textures were injected with sg_image_desc.gl_textures */ + } gl; +} _sg_gl_image_t; +typedef _sg_gl_image_t _sg_image_t; + +typedef struct { + GLint gl_loc; + sg_uniform_type type; + uint16_t count; + uint16_t offset; +} _sg_gl_uniform_t; + +typedef struct { + int num_uniforms; + _sg_gl_uniform_t uniforms[SG_MAX_UB_MEMBERS]; +} _sg_gl_uniform_block_t; + +typedef struct { + int gl_tex_slot; +} _sg_gl_shader_image_t; + +typedef struct { + _sg_str_t name; +} _sg_gl_shader_attr_t; + +typedef struct { + _sg_gl_uniform_block_t uniform_blocks[SG_MAX_SHADERSTAGE_UBS]; + _sg_gl_shader_image_t images[SG_MAX_SHADERSTAGE_IMAGES]; +} _sg_gl_shader_stage_t; + +typedef struct { + _sg_slot_t slot; + _sg_shader_common_t cmn; + struct { + GLuint prog; + _sg_gl_shader_attr_t attrs[SG_MAX_VERTEX_ATTRIBUTES]; + _sg_gl_shader_stage_t stage[SG_NUM_SHADER_STAGES]; + } gl; +} _sg_gl_shader_t; +typedef _sg_gl_shader_t _sg_shader_t; + +typedef struct { + int8_t vb_index; /* -1 if attr is not enabled */ + int8_t divisor; /* -1 if not initialized */ + uint8_t stride; + uint8_t size; + uint8_t normalized; + int offset; + GLenum type; +} _sg_gl_attr_t; + +typedef struct { + _sg_slot_t slot; + _sg_pipeline_common_t cmn; + _sg_shader_t* shader; + struct { + _sg_gl_attr_t attrs[SG_MAX_VERTEX_ATTRIBUTES]; + sg_depth_state depth; + sg_stencil_state stencil; + sg_primitive_type primitive_type; + sg_blend_state blend; + sg_color_mask color_write_mask[SG_MAX_COLOR_ATTACHMENTS]; + sg_cull_mode cull_mode; + sg_face_winding face_winding; + int sample_count; + bool alpha_to_coverage_enabled; + } gl; +} _sg_gl_pipeline_t; +typedef _sg_gl_pipeline_t _sg_pipeline_t; + +typedef struct { + _sg_image_t* image; + GLuint gl_msaa_resolve_buffer; +} _sg_gl_attachment_t; + +typedef struct { + _sg_slot_t slot; + _sg_pass_common_t cmn; + struct { + GLuint fb; + _sg_gl_attachment_t color_atts[SG_MAX_COLOR_ATTACHMENTS]; + _sg_gl_attachment_t ds_att; + } gl; +} _sg_gl_pass_t; +typedef _sg_gl_pass_t _sg_pass_t; +typedef _sg_pass_attachment_common_t _sg_pass_attachment_t; + +typedef struct { + _sg_slot_t slot; + #if !defined(SOKOL_GLES2) + GLuint vao; + #endif + GLuint default_framebuffer; +} _sg_gl_context_t; +typedef _sg_gl_context_t _sg_context_t; + +typedef struct { + _sg_gl_attr_t gl_attr; + GLuint gl_vbuf; +} _sg_gl_cache_attr_t; + +typedef struct { + GLenum target; + GLuint texture; +} _sg_gl_texture_bind_slot; + +typedef struct { + sg_depth_state depth; + sg_stencil_state stencil; + sg_blend_state blend; + sg_color_mask color_write_mask[SG_MAX_COLOR_ATTACHMENTS]; + sg_cull_mode cull_mode; + sg_face_winding face_winding; + bool polygon_offset_enabled; + int sample_count; + sg_color blend_color; + bool alpha_to_coverage_enabled; + _sg_gl_cache_attr_t attrs[SG_MAX_VERTEX_ATTRIBUTES]; + GLuint vertex_buffer; + GLuint index_buffer; + GLuint stored_vertex_buffer; + GLuint stored_index_buffer; + GLuint prog; + _sg_gl_texture_bind_slot textures[SG_MAX_SHADERSTAGE_IMAGES]; + _sg_gl_texture_bind_slot stored_texture; + int cur_ib_offset; + GLenum cur_primitive_type; + GLenum cur_index_type; + GLenum cur_active_texture; + _sg_pipeline_t* cur_pipeline; + sg_pipeline cur_pipeline_id; +} _sg_gl_state_cache_t; + +typedef struct { + bool valid; + bool gles2; + bool in_pass; + int cur_pass_width; + int cur_pass_height; + _sg_context_t* cur_context; + _sg_pass_t* cur_pass; + sg_pass cur_pass_id; + _sg_gl_state_cache_t cache; + bool ext_anisotropic; + GLint max_anisotropy; + GLint max_combined_texture_image_units; + #if _SOKOL_USE_WIN32_GL_LOADER + HINSTANCE opengl32_dll; + #endif +} _sg_gl_backend_t; + +/*== D3D11 BACKEND DECLARATIONS ==============================================*/ +#elif defined(SOKOL_D3D11) + +typedef struct { + _sg_slot_t slot; + _sg_buffer_common_t cmn; + struct { + ID3D11Buffer* buf; + } d3d11; +} _sg_d3d11_buffer_t; +typedef _sg_d3d11_buffer_t _sg_buffer_t; + +typedef struct { + _sg_slot_t slot; + _sg_image_common_t cmn; + struct { + DXGI_FORMAT format; + ID3D11Texture2D* tex2d; + ID3D11Texture3D* tex3d; + ID3D11Texture2D* texds; + ID3D11Texture2D* texmsaa; + ID3D11ShaderResourceView* srv; + ID3D11SamplerState* smp; + } d3d11; +} _sg_d3d11_image_t; +typedef _sg_d3d11_image_t _sg_image_t; + +typedef struct { + _sg_str_t sem_name; + int sem_index; +} _sg_d3d11_shader_attr_t; + +typedef struct { + ID3D11Buffer* cbufs[SG_MAX_SHADERSTAGE_UBS]; +} _sg_d3d11_shader_stage_t; + +typedef struct { + _sg_slot_t slot; + _sg_shader_common_t cmn; + struct { + _sg_d3d11_shader_attr_t attrs[SG_MAX_VERTEX_ATTRIBUTES]; + _sg_d3d11_shader_stage_t stage[SG_NUM_SHADER_STAGES]; + ID3D11VertexShader* vs; + ID3D11PixelShader* fs; + void* vs_blob; + size_t vs_blob_length; + } d3d11; +} _sg_d3d11_shader_t; +typedef _sg_d3d11_shader_t _sg_shader_t; + +typedef struct { + _sg_slot_t slot; + _sg_pipeline_common_t cmn; + _sg_shader_t* shader; + struct { + UINT stencil_ref; + UINT vb_strides[SG_MAX_SHADERSTAGE_BUFFERS]; + D3D_PRIMITIVE_TOPOLOGY topology; + DXGI_FORMAT index_format; + ID3D11InputLayout* il; + ID3D11RasterizerState* rs; + ID3D11DepthStencilState* dss; + ID3D11BlendState* bs; + } d3d11; +} _sg_d3d11_pipeline_t; +typedef _sg_d3d11_pipeline_t _sg_pipeline_t; + +typedef struct { + _sg_image_t* image; + ID3D11RenderTargetView* rtv; +} _sg_d3d11_color_attachment_t; + +typedef struct { + _sg_image_t* image; + ID3D11DepthStencilView* dsv; +} _sg_d3d11_ds_attachment_t; + +typedef struct { + _sg_slot_t slot; + _sg_pass_common_t cmn; + struct { + _sg_d3d11_color_attachment_t color_atts[SG_MAX_COLOR_ATTACHMENTS]; + _sg_d3d11_ds_attachment_t ds_att; + } d3d11; +} _sg_d3d11_pass_t; +typedef _sg_d3d11_pass_t _sg_pass_t; +typedef _sg_pass_attachment_common_t _sg_pass_attachment_t; + +typedef struct { + _sg_slot_t slot; +} _sg_d3d11_context_t; +typedef _sg_d3d11_context_t _sg_context_t; + +typedef struct { + bool valid; + ID3D11Device* dev; + ID3D11DeviceContext* ctx; + const void* (*rtv_cb)(void); + const void* (*rtv_userdata_cb)(void*); + const void* (*dsv_cb)(void); + const void* (*dsv_userdata_cb)(void*); + void* user_data; + bool in_pass; + bool use_indexed_draw; + bool use_instanced_draw; + int cur_width; + int cur_height; + int num_rtvs; + _sg_pass_t* cur_pass; + sg_pass cur_pass_id; + _sg_pipeline_t* cur_pipeline; + sg_pipeline cur_pipeline_id; + ID3D11RenderTargetView* cur_rtvs[SG_MAX_COLOR_ATTACHMENTS]; + ID3D11DepthStencilView* cur_dsv; + /* on-demand loaded d3dcompiler_47.dll handles */ + HINSTANCE d3dcompiler_dll; + bool d3dcompiler_dll_load_failed; + pD3DCompile D3DCompile_func; + /* global subresourcedata array for texture updates */ + D3D11_SUBRESOURCE_DATA subres_data[SG_MAX_MIPMAPS * SG_MAX_TEXTUREARRAY_LAYERS]; +} _sg_d3d11_backend_t; + +/*=== METAL BACKEND DECLARATIONS =============================================*/ +#elif defined(SOKOL_METAL) + +#if defined(_SG_TARGET_MACOS) || defined(_SG_TARGET_IOS_SIMULATOR) +#define _SG_MTL_UB_ALIGN (256) +#else +#define _SG_MTL_UB_ALIGN (16) +#endif +#define _SG_MTL_INVALID_SLOT_INDEX (0) + +typedef struct { + uint32_t frame_index; /* frame index at which it is safe to release this resource */ + int slot_index; +} _sg_mtl_release_item_t; + +typedef struct { + NSMutableArray* pool; + int num_slots; + int free_queue_top; + int* free_queue; + int release_queue_front; + int release_queue_back; + _sg_mtl_release_item_t* release_queue; +} _sg_mtl_idpool_t; + +typedef struct { + _sg_slot_t slot; + _sg_buffer_common_t cmn; + struct { + int buf[SG_NUM_INFLIGHT_FRAMES]; /* index into _sg_mtl_pool */ + } mtl; +} _sg_mtl_buffer_t; +typedef _sg_mtl_buffer_t _sg_buffer_t; + +typedef struct { + _sg_slot_t slot; + _sg_image_common_t cmn; + struct { + int tex[SG_NUM_INFLIGHT_FRAMES]; + int depth_tex; + int msaa_tex; + int sampler_state; + } mtl; +} _sg_mtl_image_t; +typedef _sg_mtl_image_t _sg_image_t; + +typedef struct { + int mtl_lib; + int mtl_func; +} _sg_mtl_shader_stage_t; + +typedef struct { + _sg_slot_t slot; + _sg_shader_common_t cmn; + struct { + _sg_mtl_shader_stage_t stage[SG_NUM_SHADER_STAGES]; + } mtl; +} _sg_mtl_shader_t; +typedef _sg_mtl_shader_t _sg_shader_t; + +typedef struct { + _sg_slot_t slot; + _sg_pipeline_common_t cmn; + _sg_shader_t* shader; + struct { + MTLPrimitiveType prim_type; + int index_size; + MTLIndexType index_type; + MTLCullMode cull_mode; + MTLWinding winding; + uint32_t stencil_ref; + int rps; + int dss; + } mtl; +} _sg_mtl_pipeline_t; +typedef _sg_mtl_pipeline_t _sg_pipeline_t; + +typedef struct { + _sg_image_t* image; +} _sg_mtl_attachment_t; + +typedef struct { + _sg_slot_t slot; + _sg_pass_common_t cmn; + struct { + _sg_mtl_attachment_t color_atts[SG_MAX_COLOR_ATTACHMENTS]; + _sg_mtl_attachment_t ds_att; + } mtl; +} _sg_mtl_pass_t; +typedef _sg_mtl_pass_t _sg_pass_t; +typedef _sg_pass_attachment_common_t _sg_pass_attachment_t; + +typedef struct { + _sg_slot_t slot; +} _sg_mtl_context_t; +typedef _sg_mtl_context_t _sg_context_t; + +/* resouce binding state cache */ +typedef struct { + const _sg_pipeline_t* cur_pipeline; + sg_pipeline cur_pipeline_id; + const _sg_buffer_t* cur_indexbuffer; + int cur_indexbuffer_offset; + sg_buffer cur_indexbuffer_id; + const _sg_buffer_t* cur_vertexbuffers[SG_MAX_SHADERSTAGE_BUFFERS]; + int cur_vertexbuffer_offsets[SG_MAX_SHADERSTAGE_BUFFERS]; + sg_buffer cur_vertexbuffer_ids[SG_MAX_SHADERSTAGE_BUFFERS]; + const _sg_image_t* cur_vs_images[SG_MAX_SHADERSTAGE_IMAGES]; + sg_image cur_vs_image_ids[SG_MAX_SHADERSTAGE_IMAGES]; + const _sg_image_t* cur_fs_images[SG_MAX_SHADERSTAGE_IMAGES]; + sg_image cur_fs_image_ids[SG_MAX_SHADERSTAGE_IMAGES]; +} _sg_mtl_state_cache_t; + +typedef struct { + bool valid; + const void*(*renderpass_descriptor_cb)(void); + const void*(*renderpass_descriptor_userdata_cb)(void*); + const void*(*drawable_cb)(void); + const void*(*drawable_userdata_cb)(void*); + void* user_data; + uint32_t frame_index; + uint32_t cur_frame_rotate_index; + int ub_size; + int cur_ub_offset; + uint8_t* cur_ub_base_ptr; + bool in_pass; + bool pass_valid; + int cur_width; + int cur_height; + _sg_mtl_state_cache_t state_cache; + _sg_sampler_cache_t sampler_cache; + _sg_mtl_idpool_t idpool; + dispatch_semaphore_t sem; + id device; + id cmd_queue; + id cmd_buffer; + id cmd_encoder; + id uniform_buffers[SG_NUM_INFLIGHT_FRAMES]; +} _sg_mtl_backend_t; + +/*=== WGPU BACKEND DECLARATIONS ==============================================*/ +#elif defined(SOKOL_WGPU) + +#define _SG_WGPU_STAGING_ALIGN (256) +#define _SG_WGPU_STAGING_PIPELINE_SIZE (8) +#define _SG_WGPU_ROWPITCH_ALIGN (256) +#define _SG_WGPU_MAX_SHADERSTAGE_IMAGES (8) +#define _SG_WGPU_MAX_UNIFORM_UPDATE_SIZE (1<<16) + +typedef struct { + _sg_slot_t slot; + _sg_buffer_common_t cmn; + struct { + WGPUBuffer buf; + } wgpu; +} _sg_wgpu_buffer_t; +typedef _sg_wgpu_buffer_t _sg_buffer_t; + +typedef struct { + _sg_slot_t slot; + _sg_image_common_t cmn; + struct { + WGPUTexture tex; + WGPUTextureView tex_view; + WGPUTexture msaa_tex; + WGPUSampler sampler; + } wgpu; +} _sg_wgpu_image_t; +typedef _sg_wgpu_image_t _sg_image_t; + +typedef struct { + WGPUShaderModule module; + WGPUBindGroupLayout bind_group_layout; + _sg_str_t entry; +} _sg_wgpu_shader_stage_t; + +typedef struct { + _sg_slot_t slot; + _sg_shader_common_t cmn; + struct { + _sg_wgpu_shader_stage_t stage[SG_NUM_SHADER_STAGES]; + } wgpu; +} _sg_wgpu_shader_t; +typedef _sg_wgpu_shader_t _sg_shader_t; + +typedef struct { + _sg_slot_t slot; + _sg_pipeline_common_t cmn; + _sg_shader_t* shader; + struct { + WGPURenderPipeline pip; + uint32_t stencil_ref; + } wgpu; +} _sg_wgpu_pipeline_t; +typedef _sg_wgpu_pipeline_t _sg_pipeline_t; + +typedef struct { + _sg_image_t* image; + WGPUTextureView render_tex_view; + WGPUTextureView resolve_tex_view; +} _sg_wgpu_attachment_t; + +typedef struct { + _sg_slot_t slot; + _sg_pass_common_t cmn; + struct { + _sg_wgpu_attachment_t color_atts[SG_MAX_COLOR_ATTACHMENTS]; + _sg_wgpu_attachment_t ds_att; + } wgpu; +} _sg_wgpu_pass_t; +typedef _sg_wgpu_pass_t _sg_pass_t; +typedef _sg_pass_attachment_common_t _sg_pass_attachment_t; + +typedef struct { + _sg_slot_t slot; +} _sg_wgpu_context_t; +typedef _sg_wgpu_context_t _sg_context_t; + +/* a pool of per-frame uniform buffers */ +typedef struct { + WGPUBindGroupLayout bindgroup_layout; + uint32_t num_bytes; + uint32_t offset; /* current offset into current frame's mapped uniform buffer */ + uint32_t bind_offsets[SG_NUM_SHADER_STAGES][SG_MAX_SHADERSTAGE_UBS]; + WGPUBuffer buf; /* the GPU-side uniform buffer */ + WGPUBindGroup bindgroup; + struct { + int num; + int cur; + WGPUBuffer buf[_SG_WGPU_STAGING_PIPELINE_SIZE]; /* CPU-side staging buffers */ + uint8_t* ptr[_SG_WGPU_STAGING_PIPELINE_SIZE]; /* if != 0, staging buffer currently mapped */ + } stage; +} _sg_wgpu_ubpool_t; + +/* ...a similar pool (like uniform buffer pool) of dynamic-resource staging buffers */ +typedef struct { + uint32_t num_bytes; + uint32_t offset; /* current offset into current frame's staging buffer */ + int num; /* number of staging buffers */ + int cur; /* this frame's staging buffer */ + WGPUBuffer buf[_SG_WGPU_STAGING_PIPELINE_SIZE]; /* CPU-side staging buffers */ + uint8_t* ptr[_SG_WGPU_STAGING_PIPELINE_SIZE]; /* if != 0, staging buffer currently mapped */ +} _sg_wgpu_stagingpool_t; + +/* the WGPU backend state */ +typedef struct { + bool valid; + bool in_pass; + bool draw_indexed; + int cur_width; + int cur_height; + WGPUDevice dev; + WGPUTextureView (*render_view_cb)(void); + WGPUTextureView (*render_view_userdata_cb)(void*); + WGPUTextureView (*resolve_view_cb)(void); + WGPUTextureView (*resolve_view_userdata_cb)(void*); + WGPUTextureView (*depth_stencil_view_cb)(void); + WGPUTextureView (*depth_stencil_view_userdata_cb)(void*); + void* user_data; + WGPUQueue queue; + WGPUCommandEncoder render_cmd_enc; + WGPUCommandEncoder staging_cmd_enc; + WGPURenderPassEncoder pass_enc; + WGPUBindGroup empty_bind_group; + const _sg_pipeline_t* cur_pipeline; + sg_pipeline cur_pipeline_id; + _sg_sampler_cache_t sampler_cache; + _sg_wgpu_ubpool_t ub; + _sg_wgpu_stagingpool_t staging; +} _sg_wgpu_backend_t; +#endif + +/*=== RESOURCE POOL DECLARATIONS =============================================*/ + +/* this *MUST* remain 0 */ +#define _SG_INVALID_SLOT_INDEX (0) + +typedef struct { + int size; + int queue_top; + uint32_t* gen_ctrs; + int* free_queue; +} _sg_pool_t; + +typedef struct { + _sg_pool_t buffer_pool; + _sg_pool_t image_pool; + _sg_pool_t shader_pool; + _sg_pool_t pipeline_pool; + _sg_pool_t pass_pool; + _sg_pool_t context_pool; + _sg_buffer_t* buffers; + _sg_image_t* images; + _sg_shader_t* shaders; + _sg_pipeline_t* pipelines; + _sg_pass_t* passes; + _sg_context_t* contexts; +} _sg_pools_t; + +/*=== VALIDATION LAYER DECLARATIONS ==========================================*/ +typedef enum { + /* special case 'validation was successful' */ + _SG_VALIDATE_SUCCESS, + + /* buffer creation */ + _SG_VALIDATE_BUFFERDESC_CANARY, + _SG_VALIDATE_BUFFERDESC_SIZE, + _SG_VALIDATE_BUFFERDESC_DATA, + _SG_VALIDATE_BUFFERDESC_DATA_SIZE, + _SG_VALIDATE_BUFFERDESC_NO_DATA, + + /* image data (for image creation and updating) */ + _SG_VALIDATE_IMAGEDATA_NODATA, + _SG_VALIDATE_IMAGEDATA_DATA_SIZE, + + /* image creation */ + _SG_VALIDATE_IMAGEDESC_CANARY, + _SG_VALIDATE_IMAGEDESC_WIDTH, + _SG_VALIDATE_IMAGEDESC_HEIGHT, + _SG_VALIDATE_IMAGEDESC_RT_PIXELFORMAT, + _SG_VALIDATE_IMAGEDESC_NONRT_PIXELFORMAT, + _SG_VALIDATE_IMAGEDESC_MSAA_BUT_NO_RT, + _SG_VALIDATE_IMAGEDESC_NO_MSAA_RT_SUPPORT, + _SG_VALIDATE_IMAGEDESC_RT_IMMUTABLE, + _SG_VALIDATE_IMAGEDESC_RT_NO_DATA, + _SG_VALIDATE_IMAGEDESC_INJECTED_NO_DATA, + _SG_VALIDATE_IMAGEDESC_DYNAMIC_NO_DATA, + _SG_VALIDATE_IMAGEDESC_COMPRESSED_IMMUTABLE, + + /* shader creation */ + _SG_VALIDATE_SHADERDESC_CANARY, + _SG_VALIDATE_SHADERDESC_SOURCE, + _SG_VALIDATE_SHADERDESC_BYTECODE, + _SG_VALIDATE_SHADERDESC_SOURCE_OR_BYTECODE, + _SG_VALIDATE_SHADERDESC_NO_BYTECODE_SIZE, + _SG_VALIDATE_SHADERDESC_NO_CONT_UBS, + _SG_VALIDATE_SHADERDESC_NO_CONT_IMGS, + _SG_VALIDATE_SHADERDESC_NO_CONT_UB_MEMBERS, + _SG_VALIDATE_SHADERDESC_NO_UB_MEMBERS, + _SG_VALIDATE_SHADERDESC_UB_MEMBER_NAME, + _SG_VALIDATE_SHADERDESC_UB_SIZE_MISMATCH, + _SG_VALIDATE_SHADERDESC_UB_ARRAY_COUNT, + _SG_VALIDATE_SHADERDESC_UB_STD140_ARRAY_TYPE, + _SG_VALIDATE_SHADERDESC_IMG_NAME, + _SG_VALIDATE_SHADERDESC_ATTR_NAMES, + _SG_VALIDATE_SHADERDESC_ATTR_SEMANTICS, + _SG_VALIDATE_SHADERDESC_ATTR_STRING_TOO_LONG, + + /* pipeline creation */ + _SG_VALIDATE_PIPELINEDESC_CANARY, + _SG_VALIDATE_PIPELINEDESC_SHADER, + _SG_VALIDATE_PIPELINEDESC_NO_ATTRS, + _SG_VALIDATE_PIPELINEDESC_LAYOUT_STRIDE4, + _SG_VALIDATE_PIPELINEDESC_ATTR_NAME, + _SG_VALIDATE_PIPELINEDESC_ATTR_SEMANTICS, + + /* pass creation */ + _SG_VALIDATE_PASSDESC_CANARY, + _SG_VALIDATE_PASSDESC_NO_COLOR_ATTS, + _SG_VALIDATE_PASSDESC_NO_CONT_COLOR_ATTS, + _SG_VALIDATE_PASSDESC_IMAGE, + _SG_VALIDATE_PASSDESC_MIPLEVEL, + _SG_VALIDATE_PASSDESC_FACE, + _SG_VALIDATE_PASSDESC_LAYER, + _SG_VALIDATE_PASSDESC_SLICE, + _SG_VALIDATE_PASSDESC_IMAGE_NO_RT, + _SG_VALIDATE_PASSDESC_COLOR_INV_PIXELFORMAT, + _SG_VALIDATE_PASSDESC_DEPTH_INV_PIXELFORMAT, + _SG_VALIDATE_PASSDESC_IMAGE_SIZES, + _SG_VALIDATE_PASSDESC_IMAGE_SAMPLE_COUNTS, + + /* sg_begin_pass validation */ + _SG_VALIDATE_BEGINPASS_PASS, + _SG_VALIDATE_BEGINPASS_IMAGE, + + /* sg_apply_pipeline validation */ + _SG_VALIDATE_APIP_PIPELINE_VALID_ID, + _SG_VALIDATE_APIP_PIPELINE_EXISTS, + _SG_VALIDATE_APIP_PIPELINE_VALID, + _SG_VALIDATE_APIP_SHADER_EXISTS, + _SG_VALIDATE_APIP_SHADER_VALID, + _SG_VALIDATE_APIP_ATT_COUNT, + _SG_VALIDATE_APIP_COLOR_FORMAT, + _SG_VALIDATE_APIP_DEPTH_FORMAT, + _SG_VALIDATE_APIP_SAMPLE_COUNT, + + /* sg_apply_bindings validation */ + _SG_VALIDATE_ABND_PIPELINE, + _SG_VALIDATE_ABND_PIPELINE_EXISTS, + _SG_VALIDATE_ABND_PIPELINE_VALID, + _SG_VALIDATE_ABND_VBS, + _SG_VALIDATE_ABND_VB_EXISTS, + _SG_VALIDATE_ABND_VB_TYPE, + _SG_VALIDATE_ABND_VB_OVERFLOW, + _SG_VALIDATE_ABND_NO_IB, + _SG_VALIDATE_ABND_IB, + _SG_VALIDATE_ABND_IB_EXISTS, + _SG_VALIDATE_ABND_IB_TYPE, + _SG_VALIDATE_ABND_IB_OVERFLOW, + _SG_VALIDATE_ABND_VS_IMGS, + _SG_VALIDATE_ABND_VS_IMG_EXISTS, + _SG_VALIDATE_ABND_VS_IMG_TYPES, + _SG_VALIDATE_ABND_FS_IMGS, + _SG_VALIDATE_ABND_FS_IMG_EXISTS, + _SG_VALIDATE_ABND_FS_IMG_TYPES, + + /* sg_apply_uniforms validation */ + _SG_VALIDATE_AUB_NO_PIPELINE, + _SG_VALIDATE_AUB_NO_UB_AT_SLOT, + _SG_VALIDATE_AUB_SIZE, + + /* sg_update_buffer validation */ + _SG_VALIDATE_UPDATEBUF_USAGE, + _SG_VALIDATE_UPDATEBUF_SIZE, + _SG_VALIDATE_UPDATEBUF_ONCE, + _SG_VALIDATE_UPDATEBUF_APPEND, + + /* sg_append_buffer validation */ + _SG_VALIDATE_APPENDBUF_USAGE, + _SG_VALIDATE_APPENDBUF_SIZE, + _SG_VALIDATE_APPENDBUF_UPDATE, + + /* sg_update_image validation */ + _SG_VALIDATE_UPDIMG_USAGE, + _SG_VALIDATE_UPDIMG_NOTENOUGHDATA, + _SG_VALIDATE_UPDIMG_ONCE +} _sg_validate_error_t; + +/*=== GENERIC BACKEND STATE ==================================================*/ + +typedef struct { + bool valid; + sg_desc desc; /* original desc with default values patched in */ + uint32_t frame_index; + sg_context active_context; + sg_pass cur_pass; + sg_pipeline cur_pipeline; + bool pass_valid; + bool bindings_valid; + bool next_draw_valid; + #if defined(SOKOL_DEBUG) + _sg_validate_error_t validate_error; + #endif + _sg_pools_t pools; + sg_backend backend; + sg_features features; + sg_limits limits; + sg_pixelformat_info formats[_SG_PIXELFORMAT_NUM]; + #if defined(_SOKOL_ANY_GL) + _sg_gl_backend_t gl; + #elif defined(SOKOL_METAL) + _sg_mtl_backend_t mtl; + #elif defined(SOKOL_D3D11) + _sg_d3d11_backend_t d3d11; + #elif defined(SOKOL_WGPU) + _sg_wgpu_backend_t wgpu; + #endif + #if defined(SOKOL_TRACE_HOOKS) + sg_trace_hooks hooks; + #endif +} _sg_state_t; +static _sg_state_t _sg; + +/*-- helper functions --------------------------------------------------------*/ + +_SOKOL_PRIVATE bool _sg_strempty(const _sg_str_t* str) { + return 0 == str->buf[0]; +} + +_SOKOL_PRIVATE const char* _sg_strptr(const _sg_str_t* str) { + return &str->buf[0]; +} + +_SOKOL_PRIVATE void _sg_strcpy(_sg_str_t* dst, const char* src) { + SOKOL_ASSERT(dst); + if (src) { + #if defined(_MSC_VER) + strncpy_s(dst->buf, _SG_STRING_SIZE, src, (_SG_STRING_SIZE-1)); + #else + strncpy(dst->buf, src, _SG_STRING_SIZE); + #endif + dst->buf[_SG_STRING_SIZE-1] = 0; + } + else { + memset(dst->buf, 0, _SG_STRING_SIZE); + } +} + +_SOKOL_PRIVATE uint32_t _sg_align_u32(uint32_t val, uint32_t align) { + SOKOL_ASSERT((align > 0) && ((align & (align - 1)) == 0)); + return (val + (align - 1)) & ~(align - 1); +} + +/* return byte size of a vertex format */ +_SOKOL_PRIVATE int _sg_vertexformat_bytesize(sg_vertex_format fmt) { + switch (fmt) { + case SG_VERTEXFORMAT_FLOAT: return 4; + case SG_VERTEXFORMAT_FLOAT2: return 8; + case SG_VERTEXFORMAT_FLOAT3: return 12; + case SG_VERTEXFORMAT_FLOAT4: return 16; + case SG_VERTEXFORMAT_BYTE4: return 4; + case SG_VERTEXFORMAT_BYTE4N: return 4; + case SG_VERTEXFORMAT_UBYTE4: return 4; + case SG_VERTEXFORMAT_UBYTE4N: return 4; + case SG_VERTEXFORMAT_SHORT2: return 4; + case SG_VERTEXFORMAT_SHORT2N: return 4; + case SG_VERTEXFORMAT_USHORT2N: return 4; + case SG_VERTEXFORMAT_SHORT4: return 8; + case SG_VERTEXFORMAT_SHORT4N: return 8; + case SG_VERTEXFORMAT_USHORT4N: return 8; + case SG_VERTEXFORMAT_UINT10_N2: return 4; + case SG_VERTEXFORMAT_INVALID: return 0; + default: + SOKOL_UNREACHABLE; + return -1; + } +} + +_SOKOL_PRIVATE uint32_t _sg_uniform_alignment(sg_uniform_type type, int array_count, sg_uniform_layout ub_layout) { + if (ub_layout == SG_UNIFORMLAYOUT_NATIVE) { + return 1; + } + else { + SOKOL_ASSERT(array_count > 0); + if (array_count == 1) { + switch (type) { + case SG_UNIFORMTYPE_FLOAT: + case SG_UNIFORMTYPE_INT: + return 4; + case SG_UNIFORMTYPE_FLOAT2: + case SG_UNIFORMTYPE_INT2: + return 8; + case SG_UNIFORMTYPE_FLOAT3: + case SG_UNIFORMTYPE_FLOAT4: + case SG_UNIFORMTYPE_INT3: + case SG_UNIFORMTYPE_INT4: + return 16; + case SG_UNIFORMTYPE_MAT4: + return 16; + default: + SOKOL_UNREACHABLE; + return 1; + } + } + else { + return 16; + } + } +} + +_SOKOL_PRIVATE uint32_t _sg_uniform_size(sg_uniform_type type, int array_count, sg_uniform_layout ub_layout) { + SOKOL_ASSERT(array_count > 0); + if (array_count == 1) { + switch (type) { + case SG_UNIFORMTYPE_FLOAT: + case SG_UNIFORMTYPE_INT: + return 4; + case SG_UNIFORMTYPE_FLOAT2: + case SG_UNIFORMTYPE_INT2: + return 8; + case SG_UNIFORMTYPE_FLOAT3: + case SG_UNIFORMTYPE_INT3: + return 12; + case SG_UNIFORMTYPE_FLOAT4: + case SG_UNIFORMTYPE_INT4: + return 16; + case SG_UNIFORMTYPE_MAT4: + return 64; + default: + SOKOL_UNREACHABLE; + return 0; + } + } + else { + if (ub_layout == SG_UNIFORMLAYOUT_NATIVE) { + switch (type) { + case SG_UNIFORMTYPE_FLOAT: + case SG_UNIFORMTYPE_INT: + return 4 * (uint32_t)array_count; + case SG_UNIFORMTYPE_FLOAT2: + case SG_UNIFORMTYPE_INT2: + return 8 * (uint32_t)array_count; + case SG_UNIFORMTYPE_FLOAT3: + case SG_UNIFORMTYPE_INT3: + return 12 * (uint32_t)array_count; + case SG_UNIFORMTYPE_FLOAT4: + case SG_UNIFORMTYPE_INT4: + return 16 * (uint32_t)array_count; + case SG_UNIFORMTYPE_MAT4: + return 64 * (uint32_t)array_count; + default: + SOKOL_UNREACHABLE; + return 0; + } + } + else { + switch (type) { + case SG_UNIFORMTYPE_FLOAT: + case SG_UNIFORMTYPE_FLOAT2: + case SG_UNIFORMTYPE_FLOAT3: + case SG_UNIFORMTYPE_FLOAT4: + case SG_UNIFORMTYPE_INT: + case SG_UNIFORMTYPE_INT2: + case SG_UNIFORMTYPE_INT3: + case SG_UNIFORMTYPE_INT4: + return 16 * (uint32_t)array_count; + case SG_UNIFORMTYPE_MAT4: + return 64 * (uint32_t)array_count; + default: + SOKOL_UNREACHABLE; + return 0; + } + } + } +} + +/* return true if pixel format is a compressed format */ +_SOKOL_PRIVATE bool _sg_is_compressed_pixel_format(sg_pixel_format fmt) { + switch (fmt) { + case SG_PIXELFORMAT_BC1_RGBA: + case SG_PIXELFORMAT_BC2_RGBA: + case SG_PIXELFORMAT_BC3_RGBA: + case SG_PIXELFORMAT_BC4_R: + case SG_PIXELFORMAT_BC4_RSN: + case SG_PIXELFORMAT_BC5_RG: + case SG_PIXELFORMAT_BC5_RGSN: + case SG_PIXELFORMAT_BC6H_RGBF: + case SG_PIXELFORMAT_BC6H_RGBUF: + case SG_PIXELFORMAT_BC7_RGBA: + case SG_PIXELFORMAT_PVRTC_RGB_2BPP: + case SG_PIXELFORMAT_PVRTC_RGB_4BPP: + case SG_PIXELFORMAT_PVRTC_RGBA_2BPP: + case SG_PIXELFORMAT_PVRTC_RGBA_4BPP: + case SG_PIXELFORMAT_ETC2_RGB8: + case SG_PIXELFORMAT_ETC2_RGB8A1: + case SG_PIXELFORMAT_ETC2_RGBA8: + case SG_PIXELFORMAT_ETC2_RG11: + case SG_PIXELFORMAT_ETC2_RG11SN: + return true; + default: + return false; + } +} + +/* return true if pixel format is a valid render target format */ +_SOKOL_PRIVATE bool _sg_is_valid_rendertarget_color_format(sg_pixel_format fmt) { + const int fmt_index = (int) fmt; + SOKOL_ASSERT((fmt_index >= 0) && (fmt_index < _SG_PIXELFORMAT_NUM)); + return _sg.formats[fmt_index].render && !_sg.formats[fmt_index].depth; +} + +/* return true if pixel format is a valid depth format */ +_SOKOL_PRIVATE bool _sg_is_valid_rendertarget_depth_format(sg_pixel_format fmt) { + const int fmt_index = (int) fmt; + SOKOL_ASSERT((fmt_index >= 0) && (fmt_index < _SG_PIXELFORMAT_NUM)); + return _sg.formats[fmt_index].render && _sg.formats[fmt_index].depth; +} + +/* return true if pixel format is a depth-stencil format */ +_SOKOL_PRIVATE bool _sg_is_depth_stencil_format(sg_pixel_format fmt) { + return (SG_PIXELFORMAT_DEPTH_STENCIL == fmt); +} + +/* return the bytes-per-pixel for a pixel format */ +_SOKOL_PRIVATE int _sg_pixelformat_bytesize(sg_pixel_format fmt) { + switch (fmt) { + case SG_PIXELFORMAT_R8: + case SG_PIXELFORMAT_R8SN: + case SG_PIXELFORMAT_R8UI: + case SG_PIXELFORMAT_R8SI: + return 1; + + case SG_PIXELFORMAT_R16: + case SG_PIXELFORMAT_R16SN: + case SG_PIXELFORMAT_R16UI: + case SG_PIXELFORMAT_R16SI: + case SG_PIXELFORMAT_R16F: + case SG_PIXELFORMAT_RG8: + case SG_PIXELFORMAT_RG8SN: + case SG_PIXELFORMAT_RG8UI: + case SG_PIXELFORMAT_RG8SI: + return 2; + + case SG_PIXELFORMAT_R32UI: + case SG_PIXELFORMAT_R32SI: + case SG_PIXELFORMAT_R32F: + case SG_PIXELFORMAT_RG16: + case SG_PIXELFORMAT_RG16SN: + case SG_PIXELFORMAT_RG16UI: + case SG_PIXELFORMAT_RG16SI: + case SG_PIXELFORMAT_RG16F: + case SG_PIXELFORMAT_RGBA8: + case SG_PIXELFORMAT_RGBA8SN: + case SG_PIXELFORMAT_RGBA8UI: + case SG_PIXELFORMAT_RGBA8SI: + case SG_PIXELFORMAT_BGRA8: + case SG_PIXELFORMAT_RGB10A2: + case SG_PIXELFORMAT_RG11B10F: + return 4; + + case SG_PIXELFORMAT_RG32UI: + case SG_PIXELFORMAT_RG32SI: + case SG_PIXELFORMAT_RG32F: + case SG_PIXELFORMAT_RGBA16: + case SG_PIXELFORMAT_RGBA16SN: + case SG_PIXELFORMAT_RGBA16UI: + case SG_PIXELFORMAT_RGBA16SI: + case SG_PIXELFORMAT_RGBA16F: + return 8; + + case SG_PIXELFORMAT_RGBA32UI: + case SG_PIXELFORMAT_RGBA32SI: + case SG_PIXELFORMAT_RGBA32F: + return 16; + + default: + SOKOL_UNREACHABLE; + return 0; + } +} + +_SOKOL_PRIVATE int _sg_roundup(int val, int round_to) { + return (val+(round_to-1)) & ~(round_to-1); +} + +/* return row pitch for an image + + see ComputePitch in https://github.com/microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexUtil.cpp + + For the special PVRTC pitch computation, see: + GL extension requirement (https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt) + + Quote: + + 6) How is the imageSize argument calculated for the CompressedTexImage2D + and CompressedTexSubImage2D functions. + + Resolution: For PVRTC 4BPP formats the imageSize is calculated as: + ( max(width, 8) * max(height, 8) * 4 + 7) / 8 + For PVRTC 2BPP formats the imageSize is calculated as: + ( max(width, 16) * max(height, 8) * 2 + 7) / 8 +*/ +_SOKOL_PRIVATE int _sg_row_pitch(sg_pixel_format fmt, int width, int row_align) { + int pitch; + switch (fmt) { + case SG_PIXELFORMAT_BC1_RGBA: + case SG_PIXELFORMAT_BC4_R: + case SG_PIXELFORMAT_BC4_RSN: + case SG_PIXELFORMAT_ETC2_RGB8: + case SG_PIXELFORMAT_ETC2_RGB8A1: + pitch = ((width + 3) / 4) * 8; + pitch = pitch < 8 ? 8 : pitch; + break; + case SG_PIXELFORMAT_BC2_RGBA: + case SG_PIXELFORMAT_BC3_RGBA: + case SG_PIXELFORMAT_BC5_RG: + case SG_PIXELFORMAT_BC5_RGSN: + case SG_PIXELFORMAT_BC6H_RGBF: + case SG_PIXELFORMAT_BC6H_RGBUF: + case SG_PIXELFORMAT_BC7_RGBA: + case SG_PIXELFORMAT_ETC2_RGBA8: + case SG_PIXELFORMAT_ETC2_RG11: + case SG_PIXELFORMAT_ETC2_RG11SN: + pitch = ((width + 3) / 4) * 16; + pitch = pitch < 16 ? 16 : pitch; + break; + case SG_PIXELFORMAT_PVRTC_RGB_4BPP: + case SG_PIXELFORMAT_PVRTC_RGBA_4BPP: + pitch = (_sg_max(width, 8) * 4 + 7) / 8; + break; + case SG_PIXELFORMAT_PVRTC_RGB_2BPP: + case SG_PIXELFORMAT_PVRTC_RGBA_2BPP: + pitch = (_sg_max(width, 16) * 2 + 7) / 8; + break; + default: + pitch = width * _sg_pixelformat_bytesize(fmt); + break; + } + pitch = _sg_roundup(pitch, row_align); + return pitch; +} + +/* compute the number of rows in a surface depending on pixel format */ +_SOKOL_PRIVATE int _sg_num_rows(sg_pixel_format fmt, int height) { + int num_rows; + switch (fmt) { + case SG_PIXELFORMAT_BC1_RGBA: + case SG_PIXELFORMAT_BC4_R: + case SG_PIXELFORMAT_BC4_RSN: + case SG_PIXELFORMAT_ETC2_RGB8: + case SG_PIXELFORMAT_ETC2_RGB8A1: + case SG_PIXELFORMAT_ETC2_RGBA8: + case SG_PIXELFORMAT_ETC2_RG11: + case SG_PIXELFORMAT_ETC2_RG11SN: + case SG_PIXELFORMAT_BC2_RGBA: + case SG_PIXELFORMAT_BC3_RGBA: + case SG_PIXELFORMAT_BC5_RG: + case SG_PIXELFORMAT_BC5_RGSN: + case SG_PIXELFORMAT_BC6H_RGBF: + case SG_PIXELFORMAT_BC6H_RGBUF: + case SG_PIXELFORMAT_BC7_RGBA: + num_rows = ((height + 3) / 4); + break; + case SG_PIXELFORMAT_PVRTC_RGB_4BPP: + case SG_PIXELFORMAT_PVRTC_RGBA_4BPP: + case SG_PIXELFORMAT_PVRTC_RGB_2BPP: + case SG_PIXELFORMAT_PVRTC_RGBA_2BPP: + /* NOTE: this is most likely not correct because it ignores any + PVCRTC block size, but multiplied with _sg_row_pitch() + it gives the correct surface pitch. + + See: https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt + */ + num_rows = ((_sg_max(height, 8) + 7) / 8) * 8; + break; + default: + num_rows = height; + break; + } + if (num_rows < 1) { + num_rows = 1; + } + return num_rows; +} + +/* return pitch of a 2D subimage / texture slice + see ComputePitch in https://github.com/microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexUtil.cpp +*/ +_SOKOL_PRIVATE int _sg_surface_pitch(sg_pixel_format fmt, int width, int height, int row_align) { + int num_rows = _sg_num_rows(fmt, height); + return num_rows * _sg_row_pitch(fmt, width, row_align); +} + +/* capability table pixel format helper functions */ +_SOKOL_PRIVATE void _sg_pixelformat_all(sg_pixelformat_info* pfi) { + pfi->sample = true; + pfi->filter = true; + pfi->blend = true; + pfi->render = true; + pfi->msaa = true; +} + +_SOKOL_PRIVATE void _sg_pixelformat_s(sg_pixelformat_info* pfi) { + pfi->sample = true; +} + +_SOKOL_PRIVATE void _sg_pixelformat_sf(sg_pixelformat_info* pfi) { + pfi->sample = true; + pfi->filter = true; +} + +_SOKOL_PRIVATE void _sg_pixelformat_sr(sg_pixelformat_info* pfi) { + pfi->sample = true; + pfi->render = true; +} + +_SOKOL_PRIVATE void _sg_pixelformat_srmd(sg_pixelformat_info* pfi) { + pfi->sample = true; + pfi->render = true; + pfi->msaa = true; + pfi->depth = true; +} + +_SOKOL_PRIVATE void _sg_pixelformat_srm(sg_pixelformat_info* pfi) { + pfi->sample = true; + pfi->render = true; + pfi->msaa = true; +} + +_SOKOL_PRIVATE void _sg_pixelformat_sfrm(sg_pixelformat_info* pfi) { + pfi->sample = true; + pfi->filter = true; + pfi->render = true; + pfi->msaa = true; +} +_SOKOL_PRIVATE void _sg_pixelformat_sbrm(sg_pixelformat_info* pfi) { + pfi->sample = true; + pfi->blend = true; + pfi->render = true; + pfi->msaa = true; +} + +_SOKOL_PRIVATE void _sg_pixelformat_sbr(sg_pixelformat_info* pfi) { + pfi->sample = true; + pfi->blend = true; + pfi->render = true; +} + +_SOKOL_PRIVATE void _sg_pixelformat_sfbr(sg_pixelformat_info* pfi) { + pfi->sample = true; + pfi->filter = true; + pfi->blend = true; + pfi->render = true; +} + +/* resolve pass action defaults into a new pass action struct */ +_SOKOL_PRIVATE void _sg_resolve_default_pass_action(const sg_pass_action* from, sg_pass_action* to) { + SOKOL_ASSERT(from && to); + *to = *from; + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + if (to->colors[i].action == _SG_ACTION_DEFAULT) { + to->colors[i].action = SG_ACTION_CLEAR; + to->colors[i].value.r = SG_DEFAULT_CLEAR_RED; + to->colors[i].value.g = SG_DEFAULT_CLEAR_GREEN; + to->colors[i].value.b = SG_DEFAULT_CLEAR_BLUE; + to->colors[i].value.a = SG_DEFAULT_CLEAR_ALPHA; + } + } + if (to->depth.action == _SG_ACTION_DEFAULT) { + to->depth.action = SG_ACTION_CLEAR; + to->depth.value = SG_DEFAULT_CLEAR_DEPTH; + } + if (to->stencil.action == _SG_ACTION_DEFAULT) { + to->stencil.action = SG_ACTION_CLEAR; + to->stencil.value = SG_DEFAULT_CLEAR_STENCIL; + } +} + +/*== DUMMY BACKEND IMPL ======================================================*/ +#if defined(SOKOL_DUMMY_BACKEND) + +_SOKOL_PRIVATE void _sg_dummy_setup_backend(const sg_desc* desc) { + SOKOL_ASSERT(desc); + _SOKOL_UNUSED(desc); + _sg.backend = SG_BACKEND_DUMMY; + for (int i = SG_PIXELFORMAT_R8; i < SG_PIXELFORMAT_BC1_RGBA; i++) { + _sg.formats[i].sample = true; + _sg.formats[i].filter = true; + _sg.formats[i].render = true; + _sg.formats[i].blend = true; + _sg.formats[i].msaa = true; + } + _sg.formats[SG_PIXELFORMAT_DEPTH].depth = true; + _sg.formats[SG_PIXELFORMAT_DEPTH_STENCIL].depth = true; +} + +_SOKOL_PRIVATE void _sg_dummy_discard_backend(void) { + /* empty */ +} + +_SOKOL_PRIVATE void _sg_dummy_reset_state_cache(void) { + /* empty*/ +} + +_SOKOL_PRIVATE sg_resource_state _sg_dummy_create_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + _SOKOL_UNUSED(ctx); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_dummy_destroy_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + _SOKOL_UNUSED(ctx); +} + +_SOKOL_PRIVATE void _sg_dummy_activate_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + _SOKOL_UNUSED(ctx); +} + +_SOKOL_PRIVATE sg_resource_state _sg_dummy_create_buffer(_sg_buffer_t* buf, const sg_buffer_desc* desc) { + SOKOL_ASSERT(buf && desc); + _sg_buffer_common_init(&buf->cmn, desc); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_dummy_destroy_buffer(_sg_buffer_t* buf) { + SOKOL_ASSERT(buf); + _SOKOL_UNUSED(buf); +} + +_SOKOL_PRIVATE sg_resource_state _sg_dummy_create_image(_sg_image_t* img, const sg_image_desc* desc) { + SOKOL_ASSERT(img && desc); + _sg_image_common_init(&img->cmn, desc); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_dummy_destroy_image(_sg_image_t* img) { + SOKOL_ASSERT(img); + _SOKOL_UNUSED(img); +} + +_SOKOL_PRIVATE sg_resource_state _sg_dummy_create_shader(_sg_shader_t* shd, const sg_shader_desc* desc) { + SOKOL_ASSERT(shd && desc); + _sg_shader_common_init(&shd->cmn, desc); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_dummy_destroy_shader(_sg_shader_t* shd) { + SOKOL_ASSERT(shd); + _SOKOL_UNUSED(shd); +} + +_SOKOL_PRIVATE sg_resource_state _sg_dummy_create_pipeline(_sg_pipeline_t* pip, _sg_shader_t* shd, const sg_pipeline_desc* desc) { + SOKOL_ASSERT(pip && desc); + pip->shader = shd; + _sg_pipeline_common_init(&pip->cmn, desc); + for (int attr_index = 0; attr_index < SG_MAX_VERTEX_ATTRIBUTES; attr_index++) { + const sg_vertex_attr_desc* a_desc = &desc->layout.attrs[attr_index]; + if (a_desc->format == SG_VERTEXFORMAT_INVALID) { + break; + } + SOKOL_ASSERT(a_desc->buffer_index < SG_MAX_SHADERSTAGE_BUFFERS); + pip->cmn.vertex_layout_valid[a_desc->buffer_index] = true; + } + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_dummy_destroy_pipeline(_sg_pipeline_t* pip) { + SOKOL_ASSERT(pip); + _SOKOL_UNUSED(pip); +} + +_SOKOL_PRIVATE sg_resource_state _sg_dummy_create_pass(_sg_pass_t* pass, _sg_image_t** att_images, const sg_pass_desc* desc) { + SOKOL_ASSERT(pass && desc); + SOKOL_ASSERT(att_images && att_images[0]); + + _sg_pass_common_init(&pass->cmn, desc); + + const sg_pass_attachment_desc* att_desc; + for (int i = 0; i < pass->cmn.num_color_atts; i++) { + att_desc = &desc->color_attachments[i]; + SOKOL_ASSERT(att_desc->image.id != SG_INVALID_ID); + SOKOL_ASSERT(0 == pass->dmy.color_atts[i].image); + SOKOL_ASSERT(att_images[i] && (att_images[i]->slot.id == att_desc->image.id)); + SOKOL_ASSERT(_sg_is_valid_rendertarget_color_format(att_images[i]->cmn.pixel_format)); + pass->dmy.color_atts[i].image = att_images[i]; + } + + SOKOL_ASSERT(0 == pass->dmy.ds_att.image); + att_desc = &desc->depth_stencil_attachment; + if (att_desc->image.id != SG_INVALID_ID) { + const int ds_img_index = SG_MAX_COLOR_ATTACHMENTS; + SOKOL_ASSERT(att_images[ds_img_index] && (att_images[ds_img_index]->slot.id == att_desc->image.id)); + SOKOL_ASSERT(_sg_is_valid_rendertarget_depth_format(att_images[ds_img_index]->cmn.pixel_format)); + pass->dmy.ds_att.image = att_images[ds_img_index]; + } + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_dummy_destroy_pass(_sg_pass_t* pass) { + SOKOL_ASSERT(pass); + _SOKOL_UNUSED(pass); +} + +_SOKOL_PRIVATE _sg_image_t* _sg_dummy_pass_color_image(const _sg_pass_t* pass, int index) { + SOKOL_ASSERT(pass && (index >= 0) && (index < SG_MAX_COLOR_ATTACHMENTS)); + /* NOTE: may return null */ + return pass->dmy.color_atts[index].image; +} + +_SOKOL_PRIVATE _sg_image_t* _sg_dummy_pass_ds_image(const _sg_pass_t* pass) { + /* NOTE: may return null */ + SOKOL_ASSERT(pass); + return pass->dmy.ds_att.image; +} + +_SOKOL_PRIVATE void _sg_dummy_begin_pass(_sg_pass_t* pass, const sg_pass_action* action, int w, int h) { + SOKOL_ASSERT(action); + _SOKOL_UNUSED(pass); + _SOKOL_UNUSED(action); + _SOKOL_UNUSED(w); + _SOKOL_UNUSED(h); +} + +_SOKOL_PRIVATE void _sg_dummy_end_pass(void) { + /* empty */ +} + +_SOKOL_PRIVATE void _sg_dummy_commit(void) { + /* empty */ +} + +_SOKOL_PRIVATE void _sg_dummy_apply_viewport(int x, int y, int w, int h, bool origin_top_left) { + _SOKOL_UNUSED(x); + _SOKOL_UNUSED(y); + _SOKOL_UNUSED(w); + _SOKOL_UNUSED(h); + _SOKOL_UNUSED(origin_top_left); +} + +_SOKOL_PRIVATE void _sg_dummy_apply_scissor_rect(int x, int y, int w, int h, bool origin_top_left) { + _SOKOL_UNUSED(x); + _SOKOL_UNUSED(y); + _SOKOL_UNUSED(w); + _SOKOL_UNUSED(h); + _SOKOL_UNUSED(origin_top_left); +} + +_SOKOL_PRIVATE void _sg_dummy_apply_pipeline(_sg_pipeline_t* pip) { + SOKOL_ASSERT(pip); + _SOKOL_UNUSED(pip); +} + +_SOKOL_PRIVATE void _sg_dummy_apply_bindings( + _sg_pipeline_t* pip, + _sg_buffer_t** vbs, const int* vb_offsets, int num_vbs, + _sg_buffer_t* ib, int ib_offset, + _sg_image_t** vs_imgs, int num_vs_imgs, + _sg_image_t** fs_imgs, int num_fs_imgs) +{ + SOKOL_ASSERT(pip); + SOKOL_ASSERT(vbs && vb_offsets); + SOKOL_ASSERT(vs_imgs); + SOKOL_ASSERT(fs_imgs); + _SOKOL_UNUSED(pip); + _SOKOL_UNUSED(vbs); _SOKOL_UNUSED(vb_offsets); _SOKOL_UNUSED(num_vbs); + _SOKOL_UNUSED(ib); _SOKOL_UNUSED(ib_offset); + _SOKOL_UNUSED(vs_imgs); _SOKOL_UNUSED(num_vs_imgs); + _SOKOL_UNUSED(fs_imgs); _SOKOL_UNUSED(num_fs_imgs); +} + +_SOKOL_PRIVATE void _sg_dummy_apply_uniforms(sg_shader_stage stage_index, int ub_index, const sg_range* data) { + _SOKOL_UNUSED(stage_index); + _SOKOL_UNUSED(ub_index); + _SOKOL_UNUSED(data); +} + +_SOKOL_PRIVATE void _sg_dummy_draw(int base_element, int num_elements, int num_instances) { + _SOKOL_UNUSED(base_element); + _SOKOL_UNUSED(num_elements); + _SOKOL_UNUSED(num_instances); +} + +_SOKOL_PRIVATE void _sg_dummy_update_buffer(_sg_buffer_t* buf, const sg_range* data) { + SOKOL_ASSERT(buf && data && data->ptr && (data->size > 0)); + _SOKOL_UNUSED(data); + if (++buf->cmn.active_slot >= buf->cmn.num_slots) { + buf->cmn.active_slot = 0; + } +} + +_SOKOL_PRIVATE int _sg_dummy_append_buffer(_sg_buffer_t* buf, const sg_range* data, bool new_frame) { + SOKOL_ASSERT(buf && data && data->ptr && (data->size > 0)); + _SOKOL_UNUSED(data); + if (new_frame) { + if (++buf->cmn.active_slot >= buf->cmn.num_slots) { + buf->cmn.active_slot = 0; + } + } + /* NOTE: this is a requirement from WebGPU, but we want identical behaviour across all backend */ + return _sg_roundup((int)data->size, 4); +} + +_SOKOL_PRIVATE void _sg_dummy_update_image(_sg_image_t* img, const sg_image_data* data) { + SOKOL_ASSERT(img && data); + _SOKOL_UNUSED(data); + if (++img->cmn.active_slot >= img->cmn.num_slots) { + img->cmn.active_slot = 0; + } +} + +/*== GL BACKEND ==============================================================*/ +#elif defined(_SOKOL_ANY_GL) + +/*=== OPTIONAL GL LOADER FOR WIN32 ===========================================*/ +#if defined(_SOKOL_USE_WIN32_GL_LOADER) + +// X Macro list of GL function names and signatures +#define _SG_GL_FUNCS \ + _SG_XMACRO(glBindVertexArray, void, (GLuint array)) \ + _SG_XMACRO(glFramebufferTextureLayer, void, (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)) \ + _SG_XMACRO(glGenFramebuffers, void, (GLsizei n, GLuint * framebuffers)) \ + _SG_XMACRO(glBindFramebuffer, void, (GLenum target, GLuint framebuffer)) \ + _SG_XMACRO(glBindRenderbuffer, void, (GLenum target, GLuint renderbuffer)) \ + _SG_XMACRO(glGetStringi, const GLubyte *, (GLenum name, GLuint index)) \ + _SG_XMACRO(glClearBufferfi, void, (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)) \ + _SG_XMACRO(glClearBufferfv, void, (GLenum buffer, GLint drawbuffer, const GLfloat * value)) \ + _SG_XMACRO(glClearBufferuiv, void, (GLenum buffer, GLint drawbuffer, const GLuint * value)) \ + _SG_XMACRO(glClearBufferiv, void, (GLenum buffer, GLint drawbuffer, const GLint * value)) \ + _SG_XMACRO(glDeleteRenderbuffers, void, (GLsizei n, const GLuint * renderbuffers)) \ + _SG_XMACRO(glUniform1fv, void, (GLint location, GLsizei count, const GLfloat * value)) \ + _SG_XMACRO(glUniform2fv, void, (GLint location, GLsizei count, const GLfloat * value)) \ + _SG_XMACRO(glUniform3fv, void, (GLint location, GLsizei count, const GLfloat * value)) \ + _SG_XMACRO(glUniform4fv, void, (GLint location, GLsizei count, const GLfloat * value)) \ + _SG_XMACRO(glUniform1iv, void, (GLint location, GLsizei count, const GLint * value)) \ + _SG_XMACRO(glUniform2iv, void, (GLint location, GLsizei count, const GLint * value)) \ + _SG_XMACRO(glUniform3iv, void, (GLint location, GLsizei count, const GLint * value)) \ + _SG_XMACRO(glUniform4iv, void, (GLint location, GLsizei count, const GLint * value)) \ + _SG_XMACRO(glUniformMatrix4fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)) \ + _SG_XMACRO(glUseProgram, void, (GLuint program)) \ + _SG_XMACRO(glShaderSource, void, (GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length)) \ + _SG_XMACRO(glLinkProgram, void, (GLuint program)) \ + _SG_XMACRO(glGetUniformLocation, GLint, (GLuint program, const GLchar * name)) \ + _SG_XMACRO(glGetShaderiv, void, (GLuint shader, GLenum pname, GLint * params)) \ + _SG_XMACRO(glGetProgramInfoLog, void, (GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog)) \ + _SG_XMACRO(glGetAttribLocation, GLint, (GLuint program, const GLchar * name)) \ + _SG_XMACRO(glDisableVertexAttribArray, void, (GLuint index)) \ + _SG_XMACRO(glDeleteShader, void, (GLuint shader)) \ + _SG_XMACRO(glDeleteProgram, void, (GLuint program)) \ + _SG_XMACRO(glCompileShader, void, (GLuint shader)) \ + _SG_XMACRO(glStencilFuncSeparate, void, (GLenum face, GLenum func, GLint ref, GLuint mask)) \ + _SG_XMACRO(glStencilOpSeparate, void, (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)) \ + _SG_XMACRO(glRenderbufferStorageMultisample, void, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)) \ + _SG_XMACRO(glDrawBuffers, void, (GLsizei n, const GLenum * bufs)) \ + _SG_XMACRO(glVertexAttribDivisor, void, (GLuint index, GLuint divisor)) \ + _SG_XMACRO(glBufferSubData, void, (GLenum target, GLintptr offset, GLsizeiptr size, const void * data)) \ + _SG_XMACRO(glGenBuffers, void, (GLsizei n, GLuint * buffers)) \ + _SG_XMACRO(glCheckFramebufferStatus, GLenum, (GLenum target)) \ + _SG_XMACRO(glFramebufferRenderbuffer, void, (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)) \ + _SG_XMACRO(glCompressedTexImage2D, void, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data)) \ + _SG_XMACRO(glCompressedTexImage3D, void, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data)) \ + _SG_XMACRO(glActiveTexture, void, (GLenum texture)) \ + _SG_XMACRO(glTexSubImage3D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels)) \ + _SG_XMACRO(glRenderbufferStorage, void, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height)) \ + _SG_XMACRO(glGenTextures, void, (GLsizei n, GLuint * textures)) \ + _SG_XMACRO(glPolygonOffset, void, (GLfloat factor, GLfloat units)) \ + _SG_XMACRO(glDrawElements, void, (GLenum mode, GLsizei count, GLenum type, const void * indices)) \ + _SG_XMACRO(glDeleteFramebuffers, void, (GLsizei n, const GLuint * framebuffers)) \ + _SG_XMACRO(glBlendEquationSeparate, void, (GLenum modeRGB, GLenum modeAlpha)) \ + _SG_XMACRO(glDeleteTextures, void, (GLsizei n, const GLuint * textures)) \ + _SG_XMACRO(glGetProgramiv, void, (GLuint program, GLenum pname, GLint * params)) \ + _SG_XMACRO(glBindTexture, void, (GLenum target, GLuint texture)) \ + _SG_XMACRO(glTexImage3D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels)) \ + _SG_XMACRO(glCreateShader, GLuint, (GLenum type)) \ + _SG_XMACRO(glTexSubImage2D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels)) \ + _SG_XMACRO(glClearDepth, void, (GLdouble depth)) \ + _SG_XMACRO(glFramebufferTexture2D, void, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)) \ + _SG_XMACRO(glCreateProgram, GLuint, (void)) \ + _SG_XMACRO(glViewport, void, (GLint x, GLint y, GLsizei width, GLsizei height)) \ + _SG_XMACRO(glDeleteBuffers, void, (GLsizei n, const GLuint * buffers)) \ + _SG_XMACRO(glDrawArrays, void, (GLenum mode, GLint first, GLsizei count)) \ + _SG_XMACRO(glDrawElementsInstanced, void, (GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount)) \ + _SG_XMACRO(glVertexAttribPointer, void, (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer)) \ + _SG_XMACRO(glUniform1i, void, (GLint location, GLint v0)) \ + _SG_XMACRO(glDisable, void, (GLenum cap)) \ + _SG_XMACRO(glColorMask, void, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)) \ + _SG_XMACRO(glColorMaski, void, (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)) \ + _SG_XMACRO(glBindBuffer, void, (GLenum target, GLuint buffer)) \ + _SG_XMACRO(glDeleteVertexArrays, void, (GLsizei n, const GLuint * arrays)) \ + _SG_XMACRO(glDepthMask, void, (GLboolean flag)) \ + _SG_XMACRO(glDrawArraysInstanced, void, (GLenum mode, GLint first, GLsizei count, GLsizei instancecount)) \ + _SG_XMACRO(glClearStencil, void, (GLint s)) \ + _SG_XMACRO(glScissor, void, (GLint x, GLint y, GLsizei width, GLsizei height)) \ + _SG_XMACRO(glGenRenderbuffers, void, (GLsizei n, GLuint * renderbuffers)) \ + _SG_XMACRO(glBufferData, void, (GLenum target, GLsizeiptr size, const void * data, GLenum usage)) \ + _SG_XMACRO(glBlendFuncSeparate, void, (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)) \ + _SG_XMACRO(glTexParameteri, void, (GLenum target, GLenum pname, GLint param)) \ + _SG_XMACRO(glGetIntegerv, void, (GLenum pname, GLint * data)) \ + _SG_XMACRO(glEnable, void, (GLenum cap)) \ + _SG_XMACRO(glBlitFramebuffer, void, (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)) \ + _SG_XMACRO(glStencilMask, void, (GLuint mask)) \ + _SG_XMACRO(glAttachShader, void, (GLuint program, GLuint shader)) \ + _SG_XMACRO(glGetError, GLenum, (void)) \ + _SG_XMACRO(glClearColor, void, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) \ + _SG_XMACRO(glBlendColor, void, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) \ + _SG_XMACRO(glTexParameterf, void, (GLenum target, GLenum pname, GLfloat param)) \ + _SG_XMACRO(glTexParameterfv, void, (GLenum target, GLenum pname, GLfloat* params)) \ + _SG_XMACRO(glGetShaderInfoLog, void, (GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog)) \ + _SG_XMACRO(glDepthFunc, void, (GLenum func)) \ + _SG_XMACRO(glStencilOp , void, (GLenum fail, GLenum zfail, GLenum zpass)) \ + _SG_XMACRO(glStencilFunc, void, (GLenum func, GLint ref, GLuint mask)) \ + _SG_XMACRO(glEnableVertexAttribArray, void, (GLuint index)) \ + _SG_XMACRO(glBlendFunc, void, (GLenum sfactor, GLenum dfactor)) \ + _SG_XMACRO(glReadBuffer, void, (GLenum src)) \ + _SG_XMACRO(glReadPixels, void, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * data)) \ + _SG_XMACRO(glClear, void, (GLbitfield mask)) \ + _SG_XMACRO(glTexImage2D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels)) \ + _SG_XMACRO(glGenVertexArrays, void, (GLsizei n, GLuint * arrays)) \ + _SG_XMACRO(glFrontFace, void, (GLenum mode)) \ + _SG_XMACRO(glCullFace, void, (GLenum mode)) + +// generate GL function pointer typedefs +#define _SG_XMACRO(name, ret, args) typedef ret (GL_APIENTRY* PFN_ ## name) args; +_SG_GL_FUNCS +#undef _SG_XMACRO + +// generate GL function pointers +#define _SG_XMACRO(name, ret, args) static PFN_ ## name name; +_SG_GL_FUNCS +#undef _SG_XMACRO + +// helper function to lookup GL functions in GL DLL +typedef PROC (WINAPI * _sg_wglGetProcAddress)(LPCSTR); +_SOKOL_PRIVATE void* _sg_gl_getprocaddr(const char* name, _sg_wglGetProcAddress wgl_getprocaddress) { + void* proc_addr = (void*) wgl_getprocaddress(name); + if (0 == proc_addr) { + proc_addr = (void*) GetProcAddress(_sg.gl.opengl32_dll, name); + } + SOKOL_ASSERT(proc_addr); + return proc_addr; +} + +// populate GL function pointers +_SOKOL_PRIVATE void _sg_gl_load_opengl(void) { + SOKOL_ASSERT(0 == _sg.gl.opengl32_dll); + _sg.gl.opengl32_dll = LoadLibraryA("opengl32.dll"); + SOKOL_ASSERT(_sg.gl.opengl32_dll); + _sg_wglGetProcAddress wgl_getprocaddress = (_sg_wglGetProcAddress) GetProcAddress(_sg.gl.opengl32_dll, "wglGetProcAddress"); + SOKOL_ASSERT(wgl_getprocaddress); + #define _SG_XMACRO(name, ret, args) name = (PFN_ ## name) _sg_gl_getprocaddr(#name, wgl_getprocaddress); + _SG_GL_FUNCS + #undef _SG_XMACRO +} + +_SOKOL_PRIVATE void _sg_gl_unload_opengl(void) { + SOKOL_ASSERT(_sg.gl.opengl32_dll); + FreeLibrary(_sg.gl.opengl32_dll); + _sg.gl.opengl32_dll = 0; +} +#endif // _SOKOL_USE_WIN32_GL_LOADER + +/*-- type translation --------------------------------------------------------*/ +_SOKOL_PRIVATE GLenum _sg_gl_buffer_target(sg_buffer_type t) { + switch (t) { + case SG_BUFFERTYPE_VERTEXBUFFER: return GL_ARRAY_BUFFER; + case SG_BUFFERTYPE_INDEXBUFFER: return GL_ELEMENT_ARRAY_BUFFER; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_texture_target(sg_image_type t) { + switch (t) { + case SG_IMAGETYPE_2D: return GL_TEXTURE_2D; + case SG_IMAGETYPE_CUBE: return GL_TEXTURE_CUBE_MAP; + #if !defined(SOKOL_GLES2) + case SG_IMAGETYPE_3D: return GL_TEXTURE_3D; + case SG_IMAGETYPE_ARRAY: return GL_TEXTURE_2D_ARRAY; + #endif + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_usage(sg_usage u) { + switch (u) { + case SG_USAGE_IMMUTABLE: return GL_STATIC_DRAW; + case SG_USAGE_DYNAMIC: return GL_DYNAMIC_DRAW; + case SG_USAGE_STREAM: return GL_STREAM_DRAW; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_shader_stage(sg_shader_stage stage) { + switch (stage) { + case SG_SHADERSTAGE_VS: return GL_VERTEX_SHADER; + case SG_SHADERSTAGE_FS: return GL_FRAGMENT_SHADER; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLint _sg_gl_vertexformat_size(sg_vertex_format fmt) { + switch (fmt) { + case SG_VERTEXFORMAT_FLOAT: return 1; + case SG_VERTEXFORMAT_FLOAT2: return 2; + case SG_VERTEXFORMAT_FLOAT3: return 3; + case SG_VERTEXFORMAT_FLOAT4: return 4; + case SG_VERTEXFORMAT_BYTE4: return 4; + case SG_VERTEXFORMAT_BYTE4N: return 4; + case SG_VERTEXFORMAT_UBYTE4: return 4; + case SG_VERTEXFORMAT_UBYTE4N: return 4; + case SG_VERTEXFORMAT_SHORT2: return 2; + case SG_VERTEXFORMAT_SHORT2N: return 2; + case SG_VERTEXFORMAT_USHORT2N: return 2; + case SG_VERTEXFORMAT_SHORT4: return 4; + case SG_VERTEXFORMAT_SHORT4N: return 4; + case SG_VERTEXFORMAT_USHORT4N: return 4; + case SG_VERTEXFORMAT_UINT10_N2: return 4; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_vertexformat_type(sg_vertex_format fmt) { + switch (fmt) { + case SG_VERTEXFORMAT_FLOAT: + case SG_VERTEXFORMAT_FLOAT2: + case SG_VERTEXFORMAT_FLOAT3: + case SG_VERTEXFORMAT_FLOAT4: + return GL_FLOAT; + case SG_VERTEXFORMAT_BYTE4: + case SG_VERTEXFORMAT_BYTE4N: + return GL_BYTE; + case SG_VERTEXFORMAT_UBYTE4: + case SG_VERTEXFORMAT_UBYTE4N: + return GL_UNSIGNED_BYTE; + case SG_VERTEXFORMAT_SHORT2: + case SG_VERTEXFORMAT_SHORT2N: + case SG_VERTEXFORMAT_SHORT4: + case SG_VERTEXFORMAT_SHORT4N: + return GL_SHORT; + case SG_VERTEXFORMAT_USHORT2N: + case SG_VERTEXFORMAT_USHORT4N: + return GL_UNSIGNED_SHORT; + case SG_VERTEXFORMAT_UINT10_N2: + return GL_UNSIGNED_INT_2_10_10_10_REV; + default: + SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLboolean _sg_gl_vertexformat_normalized(sg_vertex_format fmt) { + switch (fmt) { + case SG_VERTEXFORMAT_BYTE4N: + case SG_VERTEXFORMAT_UBYTE4N: + case SG_VERTEXFORMAT_SHORT2N: + case SG_VERTEXFORMAT_USHORT2N: + case SG_VERTEXFORMAT_SHORT4N: + case SG_VERTEXFORMAT_USHORT4N: + case SG_VERTEXFORMAT_UINT10_N2: + return GL_TRUE; + default: + return GL_FALSE; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_primitive_type(sg_primitive_type t) { + switch (t) { + case SG_PRIMITIVETYPE_POINTS: return GL_POINTS; + case SG_PRIMITIVETYPE_LINES: return GL_LINES; + case SG_PRIMITIVETYPE_LINE_STRIP: return GL_LINE_STRIP; + case SG_PRIMITIVETYPE_TRIANGLES: return GL_TRIANGLES; + case SG_PRIMITIVETYPE_TRIANGLE_STRIP: return GL_TRIANGLE_STRIP; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_index_type(sg_index_type t) { + switch (t) { + case SG_INDEXTYPE_NONE: return 0; + case SG_INDEXTYPE_UINT16: return GL_UNSIGNED_SHORT; + case SG_INDEXTYPE_UINT32: return GL_UNSIGNED_INT; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_compare_func(sg_compare_func cmp) { + switch (cmp) { + case SG_COMPAREFUNC_NEVER: return GL_NEVER; + case SG_COMPAREFUNC_LESS: return GL_LESS; + case SG_COMPAREFUNC_EQUAL: return GL_EQUAL; + case SG_COMPAREFUNC_LESS_EQUAL: return GL_LEQUAL; + case SG_COMPAREFUNC_GREATER: return GL_GREATER; + case SG_COMPAREFUNC_NOT_EQUAL: return GL_NOTEQUAL; + case SG_COMPAREFUNC_GREATER_EQUAL: return GL_GEQUAL; + case SG_COMPAREFUNC_ALWAYS: return GL_ALWAYS; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_stencil_op(sg_stencil_op op) { + switch (op) { + case SG_STENCILOP_KEEP: return GL_KEEP; + case SG_STENCILOP_ZERO: return GL_ZERO; + case SG_STENCILOP_REPLACE: return GL_REPLACE; + case SG_STENCILOP_INCR_CLAMP: return GL_INCR; + case SG_STENCILOP_DECR_CLAMP: return GL_DECR; + case SG_STENCILOP_INVERT: return GL_INVERT; + case SG_STENCILOP_INCR_WRAP: return GL_INCR_WRAP; + case SG_STENCILOP_DECR_WRAP: return GL_DECR_WRAP; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_blend_factor(sg_blend_factor f) { + switch (f) { + case SG_BLENDFACTOR_ZERO: return GL_ZERO; + case SG_BLENDFACTOR_ONE: return GL_ONE; + case SG_BLENDFACTOR_SRC_COLOR: return GL_SRC_COLOR; + case SG_BLENDFACTOR_ONE_MINUS_SRC_COLOR: return GL_ONE_MINUS_SRC_COLOR; + case SG_BLENDFACTOR_SRC_ALPHA: return GL_SRC_ALPHA; + case SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA: return GL_ONE_MINUS_SRC_ALPHA; + case SG_BLENDFACTOR_DST_COLOR: return GL_DST_COLOR; + case SG_BLENDFACTOR_ONE_MINUS_DST_COLOR: return GL_ONE_MINUS_DST_COLOR; + case SG_BLENDFACTOR_DST_ALPHA: return GL_DST_ALPHA; + case SG_BLENDFACTOR_ONE_MINUS_DST_ALPHA: return GL_ONE_MINUS_DST_ALPHA; + case SG_BLENDFACTOR_SRC_ALPHA_SATURATED: return GL_SRC_ALPHA_SATURATE; + case SG_BLENDFACTOR_BLEND_COLOR: return GL_CONSTANT_COLOR; + case SG_BLENDFACTOR_ONE_MINUS_BLEND_COLOR: return GL_ONE_MINUS_CONSTANT_COLOR; + case SG_BLENDFACTOR_BLEND_ALPHA: return GL_CONSTANT_ALPHA; + case SG_BLENDFACTOR_ONE_MINUS_BLEND_ALPHA: return GL_ONE_MINUS_CONSTANT_ALPHA; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_blend_op(sg_blend_op op) { + switch (op) { + case SG_BLENDOP_ADD: return GL_FUNC_ADD; + case SG_BLENDOP_SUBTRACT: return GL_FUNC_SUBTRACT; + case SG_BLENDOP_REVERSE_SUBTRACT: return GL_FUNC_REVERSE_SUBTRACT; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_filter(sg_filter f) { + switch (f) { + case SG_FILTER_NEAREST: return GL_NEAREST; + case SG_FILTER_LINEAR: return GL_LINEAR; + case SG_FILTER_NEAREST_MIPMAP_NEAREST: return GL_NEAREST_MIPMAP_NEAREST; + case SG_FILTER_NEAREST_MIPMAP_LINEAR: return GL_NEAREST_MIPMAP_LINEAR; + case SG_FILTER_LINEAR_MIPMAP_NEAREST: return GL_LINEAR_MIPMAP_NEAREST; + case SG_FILTER_LINEAR_MIPMAP_LINEAR: return GL_LINEAR_MIPMAP_LINEAR; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_wrap(sg_wrap w) { + switch (w) { + case SG_WRAP_CLAMP_TO_EDGE: return GL_CLAMP_TO_EDGE; + #if defined(SOKOL_GLCORE33) + case SG_WRAP_CLAMP_TO_BORDER: return GL_CLAMP_TO_BORDER; + #else + case SG_WRAP_CLAMP_TO_BORDER: return GL_CLAMP_TO_EDGE; + #endif + case SG_WRAP_REPEAT: return GL_REPEAT; + case SG_WRAP_MIRRORED_REPEAT: return GL_MIRRORED_REPEAT; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_teximage_type(sg_pixel_format fmt) { + switch (fmt) { + case SG_PIXELFORMAT_R8: + case SG_PIXELFORMAT_R8UI: + case SG_PIXELFORMAT_RG8: + case SG_PIXELFORMAT_RG8UI: + case SG_PIXELFORMAT_RGBA8: + case SG_PIXELFORMAT_RGBA8UI: + case SG_PIXELFORMAT_BGRA8: + return GL_UNSIGNED_BYTE; + case SG_PIXELFORMAT_R8SN: + case SG_PIXELFORMAT_R8SI: + case SG_PIXELFORMAT_RG8SN: + case SG_PIXELFORMAT_RG8SI: + case SG_PIXELFORMAT_RGBA8SN: + case SG_PIXELFORMAT_RGBA8SI: + return GL_BYTE; + case SG_PIXELFORMAT_R16: + case SG_PIXELFORMAT_R16UI: + case SG_PIXELFORMAT_RG16: + case SG_PIXELFORMAT_RG16UI: + case SG_PIXELFORMAT_RGBA16: + case SG_PIXELFORMAT_RGBA16UI: + return GL_UNSIGNED_SHORT; + case SG_PIXELFORMAT_R16SN: + case SG_PIXELFORMAT_R16SI: + case SG_PIXELFORMAT_RG16SN: + case SG_PIXELFORMAT_RG16SI: + case SG_PIXELFORMAT_RGBA16SN: + case SG_PIXELFORMAT_RGBA16SI: + return GL_SHORT; + case SG_PIXELFORMAT_R16F: + case SG_PIXELFORMAT_RG16F: + case SG_PIXELFORMAT_RGBA16F: + return GL_HALF_FLOAT; + case SG_PIXELFORMAT_R32UI: + case SG_PIXELFORMAT_RG32UI: + case SG_PIXELFORMAT_RGBA32UI: + return GL_UNSIGNED_INT; + case SG_PIXELFORMAT_R32SI: + case SG_PIXELFORMAT_RG32SI: + case SG_PIXELFORMAT_RGBA32SI: + return GL_INT; + case SG_PIXELFORMAT_R32F: + case SG_PIXELFORMAT_RG32F: + case SG_PIXELFORMAT_RGBA32F: + return GL_FLOAT; + #if !defined(SOKOL_GLES2) + case SG_PIXELFORMAT_RGB10A2: + return GL_UNSIGNED_INT_2_10_10_10_REV; + case SG_PIXELFORMAT_RG11B10F: + return GL_UNSIGNED_INT_10F_11F_11F_REV; + #endif + case SG_PIXELFORMAT_DEPTH: + return GL_UNSIGNED_SHORT; + case SG_PIXELFORMAT_DEPTH_STENCIL: + return GL_UNSIGNED_INT_24_8; + default: + SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_teximage_format(sg_pixel_format fmt) { + switch (fmt) { + case SG_PIXELFORMAT_R8: + case SG_PIXELFORMAT_R8SN: + case SG_PIXELFORMAT_R16: + case SG_PIXELFORMAT_R16SN: + case SG_PIXELFORMAT_R16F: + case SG_PIXELFORMAT_R32F: + #if defined(SOKOL_GLES2) + return GL_LUMINANCE; + #else + if (_sg.gl.gles2) { + return GL_LUMINANCE; + } + else { + return GL_RED; + } + #endif + #if !defined(SOKOL_GLES2) + case SG_PIXELFORMAT_R8UI: + case SG_PIXELFORMAT_R8SI: + case SG_PIXELFORMAT_R16UI: + case SG_PIXELFORMAT_R16SI: + case SG_PIXELFORMAT_R32UI: + case SG_PIXELFORMAT_R32SI: + return GL_RED_INTEGER; + case SG_PIXELFORMAT_RG8: + case SG_PIXELFORMAT_RG8SN: + case SG_PIXELFORMAT_RG16: + case SG_PIXELFORMAT_RG16SN: + case SG_PIXELFORMAT_RG16F: + case SG_PIXELFORMAT_RG32F: + return GL_RG; + case SG_PIXELFORMAT_RG8UI: + case SG_PIXELFORMAT_RG8SI: + case SG_PIXELFORMAT_RG16UI: + case SG_PIXELFORMAT_RG16SI: + case SG_PIXELFORMAT_RG32UI: + case SG_PIXELFORMAT_RG32SI: + return GL_RG_INTEGER; + #endif + case SG_PIXELFORMAT_RGBA8: + case SG_PIXELFORMAT_RGBA8SN: + case SG_PIXELFORMAT_RGBA16: + case SG_PIXELFORMAT_RGBA16SN: + case SG_PIXELFORMAT_RGBA16F: + case SG_PIXELFORMAT_RGBA32F: + case SG_PIXELFORMAT_RGB10A2: + return GL_RGBA; + #if !defined(SOKOL_GLES2) + case SG_PIXELFORMAT_RGBA8UI: + case SG_PIXELFORMAT_RGBA8SI: + case SG_PIXELFORMAT_RGBA16UI: + case SG_PIXELFORMAT_RGBA16SI: + case SG_PIXELFORMAT_RGBA32UI: + case SG_PIXELFORMAT_RGBA32SI: + return GL_RGBA_INTEGER; + #endif + case SG_PIXELFORMAT_RG11B10F: + return GL_RGB; + case SG_PIXELFORMAT_DEPTH: + return GL_DEPTH_COMPONENT; + case SG_PIXELFORMAT_DEPTH_STENCIL: + return GL_DEPTH_STENCIL; + case SG_PIXELFORMAT_BC1_RGBA: + return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; + case SG_PIXELFORMAT_BC2_RGBA: + return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; + case SG_PIXELFORMAT_BC3_RGBA: + return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; + case SG_PIXELFORMAT_BC4_R: + return GL_COMPRESSED_RED_RGTC1; + case SG_PIXELFORMAT_BC4_RSN: + return GL_COMPRESSED_SIGNED_RED_RGTC1; + case SG_PIXELFORMAT_BC5_RG: + return GL_COMPRESSED_RED_GREEN_RGTC2; + case SG_PIXELFORMAT_BC5_RGSN: + return GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2; + case SG_PIXELFORMAT_BC6H_RGBF: + return GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB; + case SG_PIXELFORMAT_BC6H_RGBUF: + return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB; + case SG_PIXELFORMAT_BC7_RGBA: + return GL_COMPRESSED_RGBA_BPTC_UNORM_ARB; + case SG_PIXELFORMAT_PVRTC_RGB_2BPP: + return GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + case SG_PIXELFORMAT_PVRTC_RGB_4BPP: + return GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + case SG_PIXELFORMAT_PVRTC_RGBA_2BPP: + return GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + case SG_PIXELFORMAT_PVRTC_RGBA_4BPP: + return GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + case SG_PIXELFORMAT_ETC2_RGB8: + return GL_COMPRESSED_RGB8_ETC2; + case SG_PIXELFORMAT_ETC2_RGB8A1: + return GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2; + case SG_PIXELFORMAT_ETC2_RGBA8: + return GL_COMPRESSED_RGBA8_ETC2_EAC; + case SG_PIXELFORMAT_ETC2_RG11: + return GL_COMPRESSED_RG11_EAC; + case SG_PIXELFORMAT_ETC2_RG11SN: + return GL_COMPRESSED_SIGNED_RG11_EAC; + default: + SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_teximage_internal_format(sg_pixel_format fmt) { + #if defined(SOKOL_GLES2) + return _sg_gl_teximage_format(fmt); + #else + if (_sg.gl.gles2) { + return _sg_gl_teximage_format(fmt); + } + else { + switch (fmt) { + case SG_PIXELFORMAT_R8: return GL_R8; + case SG_PIXELFORMAT_R8SN: return GL_R8_SNORM; + case SG_PIXELFORMAT_R8UI: return GL_R8UI; + case SG_PIXELFORMAT_R8SI: return GL_R8I; + #if !defined(SOKOL_GLES3) + case SG_PIXELFORMAT_R16: return GL_R16; + case SG_PIXELFORMAT_R16SN: return GL_R16_SNORM; + #endif + case SG_PIXELFORMAT_R16UI: return GL_R16UI; + case SG_PIXELFORMAT_R16SI: return GL_R16I; + case SG_PIXELFORMAT_R16F: return GL_R16F; + case SG_PIXELFORMAT_RG8: return GL_RG8; + case SG_PIXELFORMAT_RG8SN: return GL_RG8_SNORM; + case SG_PIXELFORMAT_RG8UI: return GL_RG8UI; + case SG_PIXELFORMAT_RG8SI: return GL_RG8I; + case SG_PIXELFORMAT_R32UI: return GL_R32UI; + case SG_PIXELFORMAT_R32SI: return GL_R32I; + case SG_PIXELFORMAT_R32F: return GL_R32F; + #if !defined(SOKOL_GLES3) + case SG_PIXELFORMAT_RG16: return GL_RG16; + case SG_PIXELFORMAT_RG16SN: return GL_RG16_SNORM; + #endif + case SG_PIXELFORMAT_RG16UI: return GL_RG16UI; + case SG_PIXELFORMAT_RG16SI: return GL_RG16I; + case SG_PIXELFORMAT_RG16F: return GL_RG16F; + case SG_PIXELFORMAT_RGBA8: return GL_RGBA8; + case SG_PIXELFORMAT_RGBA8SN: return GL_RGBA8_SNORM; + case SG_PIXELFORMAT_RGBA8UI: return GL_RGBA8UI; + case SG_PIXELFORMAT_RGBA8SI: return GL_RGBA8I; + case SG_PIXELFORMAT_RGB10A2: return GL_RGB10_A2; + case SG_PIXELFORMAT_RG11B10F: return GL_R11F_G11F_B10F; + case SG_PIXELFORMAT_RG32UI: return GL_RG32UI; + case SG_PIXELFORMAT_RG32SI: return GL_RG32I; + case SG_PIXELFORMAT_RG32F: return GL_RG32F; + #if !defined(SOKOL_GLES3) + case SG_PIXELFORMAT_RGBA16: return GL_RGBA16; + case SG_PIXELFORMAT_RGBA16SN: return GL_RGBA16_SNORM; + #endif + case SG_PIXELFORMAT_RGBA16UI: return GL_RGBA16UI; + case SG_PIXELFORMAT_RGBA16SI: return GL_RGBA16I; + case SG_PIXELFORMAT_RGBA16F: return GL_RGBA16F; + case SG_PIXELFORMAT_RGBA32UI: return GL_RGBA32UI; + case SG_PIXELFORMAT_RGBA32SI: return GL_RGBA32I; + case SG_PIXELFORMAT_RGBA32F: return GL_RGBA32F; + case SG_PIXELFORMAT_DEPTH: return GL_DEPTH_COMPONENT16; + case SG_PIXELFORMAT_DEPTH_STENCIL: return GL_DEPTH24_STENCIL8; + case SG_PIXELFORMAT_BC1_RGBA: return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; + case SG_PIXELFORMAT_BC2_RGBA: return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; + case SG_PIXELFORMAT_BC3_RGBA: return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; + case SG_PIXELFORMAT_BC4_R: return GL_COMPRESSED_RED_RGTC1; + case SG_PIXELFORMAT_BC4_RSN: return GL_COMPRESSED_SIGNED_RED_RGTC1; + case SG_PIXELFORMAT_BC5_RG: return GL_COMPRESSED_RED_GREEN_RGTC2; + case SG_PIXELFORMAT_BC5_RGSN: return GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2; + case SG_PIXELFORMAT_BC6H_RGBF: return GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB; + case SG_PIXELFORMAT_BC6H_RGBUF: return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB; + case SG_PIXELFORMAT_BC7_RGBA: return GL_COMPRESSED_RGBA_BPTC_UNORM_ARB; + case SG_PIXELFORMAT_PVRTC_RGB_2BPP: return GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + case SG_PIXELFORMAT_PVRTC_RGB_4BPP: return GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + case SG_PIXELFORMAT_PVRTC_RGBA_2BPP: return GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + case SG_PIXELFORMAT_PVRTC_RGBA_4BPP: return GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + case SG_PIXELFORMAT_ETC2_RGB8: return GL_COMPRESSED_RGB8_ETC2; + case SG_PIXELFORMAT_ETC2_RGB8A1: return GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2; + case SG_PIXELFORMAT_ETC2_RGBA8: return GL_COMPRESSED_RGBA8_ETC2_EAC; + case SG_PIXELFORMAT_ETC2_RG11: return GL_COMPRESSED_RG11_EAC; + case SG_PIXELFORMAT_ETC2_RG11SN: return GL_COMPRESSED_SIGNED_RG11_EAC; + default: SOKOL_UNREACHABLE; return 0; + } + } + #endif +} + +_SOKOL_PRIVATE GLenum _sg_gl_cubeface_target(int face_index) { + switch (face_index) { + case 0: return GL_TEXTURE_CUBE_MAP_POSITIVE_X; + case 1: return GL_TEXTURE_CUBE_MAP_NEGATIVE_X; + case 2: return GL_TEXTURE_CUBE_MAP_POSITIVE_Y; + case 3: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y; + case 4: return GL_TEXTURE_CUBE_MAP_POSITIVE_Z; + case 5: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE GLenum _sg_gl_depth_attachment_format(sg_pixel_format fmt) { + switch (fmt) { + case SG_PIXELFORMAT_DEPTH: return GL_DEPTH_COMPONENT16; + case SG_PIXELFORMAT_DEPTH_STENCIL: return GL_DEPTH24_STENCIL8; + default: SOKOL_UNREACHABLE; return 0; + } +} + +/* see: https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml */ +_SOKOL_PRIVATE void _sg_gl_init_pixelformats(bool has_bgra) { + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R8]); + } + else { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_R8]); + } + #else + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_R8]); + #endif + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_R8SN]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R8UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R8SI]); + #if !defined(SOKOL_GLES3) + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R16]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R16SN]); + #endif + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R16UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R16SI]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG8]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_RG8SN]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG8UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG8SI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_R32UI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_R32SI]); + #if !defined(SOKOL_GLES3) + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG16]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG16SN]); + #endif + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG16UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG16SI]); + } + #endif + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA8]); + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_RGBA8SN]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA8UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA8SI]); + } + #endif + if (has_bgra) { + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_BGRA8]); + } + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGB10A2]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_RG11B10F]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG32UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG32SI]); + #if !defined(SOKOL_GLES3) + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA16]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA16SN]); + #endif + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA16UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA16SI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA32UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA32SI]); + } + #endif + // FIXME: WEBGL_depth_texture extension? + _sg_pixelformat_srmd(&_sg.formats[SG_PIXELFORMAT_DEPTH]); + _sg_pixelformat_srmd(&_sg.formats[SG_PIXELFORMAT_DEPTH_STENCIL]); +} + +/* FIXME: OES_half_float_blend */ +_SOKOL_PRIVATE void _sg_gl_init_pixelformats_half_float(bool has_colorbuffer_half_float, bool has_texture_half_float_linear) { + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + if (has_texture_half_float_linear) { + if (has_colorbuffer_half_float) { + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R16F]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG16F]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA16F]); + } + else { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_R16F]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_RG16F]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_RGBA16F]); + } + } + else { + if (has_colorbuffer_half_float) { + _sg_pixelformat_sbrm(&_sg.formats[SG_PIXELFORMAT_R16F]); + _sg_pixelformat_sbrm(&_sg.formats[SG_PIXELFORMAT_RG16F]); + _sg_pixelformat_sbrm(&_sg.formats[SG_PIXELFORMAT_RGBA16F]); + } + else { + _sg_pixelformat_s(&_sg.formats[SG_PIXELFORMAT_R16F]); + _sg_pixelformat_s(&_sg.formats[SG_PIXELFORMAT_RG16F]); + _sg_pixelformat_s(&_sg.formats[SG_PIXELFORMAT_RGBA16F]); + } + } + } + else { + #endif + /* GLES2 can only render to RGBA, and there's no RG format */ + if (has_texture_half_float_linear) { + if (has_colorbuffer_half_float) { + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA16F]); + } + else { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_RGBA16F]); + } + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_R16F]); + } + else { + if (has_colorbuffer_half_float) { + _sg_pixelformat_sbrm(&_sg.formats[SG_PIXELFORMAT_RGBA16F]); + } + else { + _sg_pixelformat_s(&_sg.formats[SG_PIXELFORMAT_RGBA16F]); + } + _sg_pixelformat_s(&_sg.formats[SG_PIXELFORMAT_R16F]); + } + #if !defined(SOKOL_GLES2) + } + #endif +} + +_SOKOL_PRIVATE void _sg_gl_init_pixelformats_float(bool has_colorbuffer_float, bool has_texture_float_linear, bool has_float_blend) { + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + if (has_texture_float_linear) { + if (has_colorbuffer_float) { + if (has_float_blend) { + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R32F]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG32F]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + } + else { + _sg_pixelformat_sfrm(&_sg.formats[SG_PIXELFORMAT_R32F]); + _sg_pixelformat_sfrm(&_sg.formats[SG_PIXELFORMAT_RG32F]); + _sg_pixelformat_sfrm(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + } + } + else { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_R32F]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_RG32F]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + } + } + else { + if (has_colorbuffer_float) { + _sg_pixelformat_sbrm(&_sg.formats[SG_PIXELFORMAT_R32F]); + _sg_pixelformat_sbrm(&_sg.formats[SG_PIXELFORMAT_RG32F]); + _sg_pixelformat_sbrm(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + } + else { + _sg_pixelformat_s(&_sg.formats[SG_PIXELFORMAT_R32F]); + _sg_pixelformat_s(&_sg.formats[SG_PIXELFORMAT_RG32F]); + _sg_pixelformat_s(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + } + } + } + else { + #endif + /* GLES2 can only render to RGBA, and there's no RG format */ + if (has_texture_float_linear) { + if (has_colorbuffer_float) { + if (has_float_blend) { + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + } + else { + _sg_pixelformat_sfrm(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + } + } + else { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + } + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_R32F]); + } + else { + if (has_colorbuffer_float) { + _sg_pixelformat_sbrm(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + } + else { + _sg_pixelformat_s(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + } + _sg_pixelformat_s(&_sg.formats[SG_PIXELFORMAT_R32F]); + } + #if !defined(SOKOL_GLES2) + } + #endif +} + +_SOKOL_PRIVATE void _sg_gl_init_pixelformats_s3tc(void) { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC1_RGBA]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC2_RGBA]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC3_RGBA]); +} + +_SOKOL_PRIVATE void _sg_gl_init_pixelformats_rgtc(void) { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC4_R]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC4_RSN]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC5_RG]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC5_RGSN]); +} + +_SOKOL_PRIVATE void _sg_gl_init_pixelformats_bptc(void) { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC6H_RGBF]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC6H_RGBUF]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC7_RGBA]); +} + +_SOKOL_PRIVATE void _sg_gl_init_pixelformats_pvrtc(void) { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_PVRTC_RGB_2BPP]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_PVRTC_RGB_4BPP]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_PVRTC_RGBA_2BPP]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_PVRTC_RGBA_4BPP]); +} + +_SOKOL_PRIVATE void _sg_gl_init_pixelformats_etc2(void) { + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_ETC2_RGB8]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_ETC2_RGB8A1]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_ETC2_RGBA8]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_ETC2_RG11]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_ETC2_RG11SN]); +} + +_SOKOL_PRIVATE void _sg_gl_init_limits(void) { + _SG_GL_CHECK_ERROR(); + GLint gl_int; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_int); + _SG_GL_CHECK_ERROR(); + _sg.limits.max_image_size_2d = gl_int; + _sg.limits.max_image_size_array = gl_int; + glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &gl_int); + _SG_GL_CHECK_ERROR(); + _sg.limits.max_image_size_cube = gl_int; + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &gl_int); + _SG_GL_CHECK_ERROR(); + if (gl_int > SG_MAX_VERTEX_ATTRIBUTES) { + gl_int = SG_MAX_VERTEX_ATTRIBUTES; + } + _sg.limits.max_vertex_attrs = gl_int; + glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &gl_int); + _SG_GL_CHECK_ERROR(); + _sg.limits.gl_max_vertex_uniform_vectors = gl_int; + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &gl_int); + _SG_GL_CHECK_ERROR(); + _sg.limits.max_image_size_3d = gl_int; + glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &gl_int); + _SG_GL_CHECK_ERROR(); + _sg.limits.max_image_array_layers = gl_int; + } + #endif + if (_sg.gl.ext_anisotropic) { + glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_int); + _SG_GL_CHECK_ERROR(); + _sg.gl.max_anisotropy = gl_int; + } + else { + _sg.gl.max_anisotropy = 1; + } + glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &gl_int); + _SG_GL_CHECK_ERROR(); + _sg.gl.max_combined_texture_image_units = gl_int; +} + +#if defined(SOKOL_GLCORE33) +_SOKOL_PRIVATE void _sg_gl_init_caps_glcore33(void) { + _sg.backend = SG_BACKEND_GLCORE33; + + _sg.features.origin_top_left = false; + _sg.features.instancing = true; + _sg.features.multiple_render_targets = true; + _sg.features.msaa_render_targets = true; + _sg.features.imagetype_3d = true; + _sg.features.imagetype_array = true; + _sg.features.image_clamp_to_border = true; + _sg.features.mrt_independent_blend_state = false; + _sg.features.mrt_independent_write_mask = true; + + /* scan extensions */ + bool has_s3tc = false; /* BC1..BC3 */ + bool has_rgtc = false; /* BC4 and BC5 */ + bool has_bptc = false; /* BC6H and BC7 */ + bool has_pvrtc = false; + bool has_etc2 = false; + GLint num_ext = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &num_ext); + for (int i = 0; i < num_ext; i++) { + const char* ext = (const char*) glGetStringi(GL_EXTENSIONS, (GLuint)i); + if (ext) { + if (strstr(ext, "_texture_compression_s3tc")) { + has_s3tc = true; + } + else if (strstr(ext, "_texture_compression_rgtc")) { + has_rgtc = true; + } + else if (strstr(ext, "_texture_compression_bptc")) { + has_bptc = true; + } + else if (strstr(ext, "_texture_compression_pvrtc")) { + has_pvrtc = true; + } + else if (strstr(ext, "_ES3_compatibility")) { + has_etc2 = true; + } + else if (strstr(ext, "_texture_filter_anisotropic")) { + _sg.gl.ext_anisotropic = true; + } + } + } + + /* limits */ + _sg_gl_init_limits(); + + /* pixel formats */ + const bool has_bgra = false; /* not a bug */ + const bool has_colorbuffer_float = true; + const bool has_colorbuffer_half_float = true; + const bool has_texture_float_linear = true; /* FIXME??? */ + const bool has_texture_half_float_linear = true; + const bool has_float_blend = true; + _sg_gl_init_pixelformats(has_bgra); + _sg_gl_init_pixelformats_float(has_colorbuffer_float, has_texture_float_linear, has_float_blend); + _sg_gl_init_pixelformats_half_float(has_colorbuffer_half_float, has_texture_half_float_linear); + if (has_s3tc) { + _sg_gl_init_pixelformats_s3tc(); + } + if (has_rgtc) { + _sg_gl_init_pixelformats_rgtc(); + } + if (has_bptc) { + _sg_gl_init_pixelformats_bptc(); + } + if (has_pvrtc) { + _sg_gl_init_pixelformats_pvrtc(); + } + if (has_etc2) { + _sg_gl_init_pixelformats_etc2(); + } +} +#endif + +#if defined(SOKOL_GLES3) +_SOKOL_PRIVATE void _sg_gl_init_caps_gles3(void) { + _sg.backend = SG_BACKEND_GLES3; + + _sg.features.origin_top_left = false; + _sg.features.instancing = true; + _sg.features.multiple_render_targets = true; + _sg.features.msaa_render_targets = true; + _sg.features.imagetype_3d = true; + _sg.features.imagetype_array = true; + _sg.features.image_clamp_to_border = false; + _sg.features.mrt_independent_blend_state = false; + _sg.features.mrt_independent_write_mask = false; + + bool has_s3tc = false; /* BC1..BC3 */ + bool has_rgtc = false; /* BC4 and BC5 */ + bool has_bptc = false; /* BC6H and BC7 */ + bool has_pvrtc = false; + #if defined(__EMSCRIPTEN__) + bool has_etc2 = false; + #else + bool has_etc2 = true; + #endif + bool has_colorbuffer_float = false; + bool has_colorbuffer_half_float = false; + bool has_texture_float_linear = false; + bool has_float_blend = false; + GLint num_ext = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &num_ext); + for (int i = 0; i < num_ext; i++) { + const char* ext = (const char*) glGetStringi(GL_EXTENSIONS, (GLuint)i); + if (ext) { + if (strstr(ext, "_texture_compression_s3tc")) { + has_s3tc = true; + } + else if (strstr(ext, "_compressed_texture_s3tc")) { + has_s3tc = true; + } + else if (strstr(ext, "_texture_compression_rgtc")) { + has_rgtc = true; + } + else if (strstr(ext, "_texture_compression_bptc")) { + has_bptc = true; + } + else if (strstr(ext, "_texture_compression_pvrtc")) { + has_pvrtc = true; + } + else if (strstr(ext, "_compressed_texture_pvrtc")) { + has_pvrtc = true; + } + else if (strstr(ext, "_compressed_texture_etc")) { + has_etc2 = true; + } + else if (strstr(ext, "_color_buffer_float")) { + has_colorbuffer_float = true; + } + else if (strstr(ext, "_color_buffer_half_float")) { + has_colorbuffer_half_float = true; + } + else if (strstr(ext, "_texture_float_linear")) { + has_texture_float_linear = true; + } + else if (strstr(ext, "_float_blend")) { + has_float_blend = true; + } + else if (strstr(ext, "_texture_filter_anisotropic")) { + _sg.gl.ext_anisotropic = true; + } + } + } + + /* on WebGL2, color_buffer_float also includes 16-bit formats + see: https://developer.mozilla.org/en-US/docs/Web/API/EXT_color_buffer_float + */ + #if defined(__EMSCRIPTEN__) + has_colorbuffer_half_float = has_colorbuffer_float; + #endif + + /* limits */ + _sg_gl_init_limits(); + + /* pixel formats */ + const bool has_texture_half_float_linear = true; + const bool has_bgra = false; /* not a bug */ + _sg_gl_init_pixelformats(has_bgra); + _sg_gl_init_pixelformats_float(has_colorbuffer_float, has_texture_float_linear, has_float_blend); + _sg_gl_init_pixelformats_half_float(has_colorbuffer_half_float, has_texture_half_float_linear); + if (has_s3tc) { + _sg_gl_init_pixelformats_s3tc(); + } + if (has_rgtc) { + _sg_gl_init_pixelformats_rgtc(); + } + if (has_bptc) { + _sg_gl_init_pixelformats_bptc(); + } + if (has_pvrtc) { + _sg_gl_init_pixelformats_pvrtc(); + } + if (has_etc2) { + _sg_gl_init_pixelformats_etc2(); + } +} +#endif + +#if defined(SOKOL_GLES3) || defined(SOKOL_GLES2) +_SOKOL_PRIVATE void _sg_gl_init_caps_gles2(void) { + _sg.backend = SG_BACKEND_GLES2; + + bool has_s3tc = false; /* BC1..BC3 */ + bool has_rgtc = false; /* BC4 and BC5 */ + bool has_bptc = false; /* BC6H and BC7 */ + bool has_pvrtc = false; + bool has_etc2 = false; + bool has_texture_float = false; + bool has_texture_float_linear = false; + bool has_colorbuffer_float = false; + bool has_float_blend = false; + bool has_instancing = false; + const char* ext = (const char*) glGetString(GL_EXTENSIONS); + if (ext) { + has_s3tc = strstr(ext, "_texture_compression_s3tc") || strstr(ext, "_compressed_texture_s3tc"); + has_rgtc = strstr(ext, "_texture_compression_rgtc"); + has_bptc = strstr(ext, "_texture_compression_bptc"); + has_pvrtc = strstr(ext, "_texture_compression_pvrtc") || strstr(ext, "_compressed_texture_pvrtc"); + has_etc2 = strstr(ext, "_compressed_texture_etc"); + has_texture_float = strstr(ext, "_texture_float"); + has_texture_float_linear = strstr(ext, "_texture_float_linear"); + has_colorbuffer_float = strstr(ext, "_color_buffer_float"); + has_float_blend = strstr(ext, "_float_blend"); + /* don't bother with half_float support on WebGL1 + has_texture_half_float = strstr(ext, "_texture_half_float"); + has_texture_half_float_linear = strstr(ext, "_texture_half_float_linear"); + has_colorbuffer_half_float = strstr(ext, "_color_buffer_half_float"); + */ + has_instancing = strstr(ext, "_instanced_arrays"); + _sg.gl.ext_anisotropic = strstr(ext, "ext_anisotropic"); + } + + _sg.features.origin_top_left = false; + #if defined(_SOKOL_GL_INSTANCING_ENABLED) + _sg.features.instancing = has_instancing; + #endif + _sg.features.multiple_render_targets = false; + _sg.features.msaa_render_targets = false; + _sg.features.imagetype_3d = false; + _sg.features.imagetype_array = false; + _sg.features.image_clamp_to_border = false; + _sg.features.mrt_independent_blend_state = false; + _sg.features.mrt_independent_write_mask = false; + + /* limits */ + _sg_gl_init_limits(); + + /* pixel formats */ + const bool has_bgra = false; /* not a bug */ + const bool has_texture_half_float = false; + const bool has_texture_half_float_linear = false; + const bool has_colorbuffer_half_float = false; + _sg_gl_init_pixelformats(has_bgra); + if (has_texture_float) { + _sg_gl_init_pixelformats_float(has_colorbuffer_float, has_texture_float_linear, has_float_blend); + } + if (has_texture_half_float) { + _sg_gl_init_pixelformats_half_float(has_colorbuffer_half_float, has_texture_half_float_linear); + } + if (has_s3tc) { + _sg_gl_init_pixelformats_s3tc(); + } + if (has_rgtc) { + _sg_gl_init_pixelformats_rgtc(); + } + if (has_bptc) { + _sg_gl_init_pixelformats_bptc(); + } + if (has_pvrtc) { + _sg_gl_init_pixelformats_pvrtc(); + } + if (has_etc2) { + _sg_gl_init_pixelformats_etc2(); + } + /* GLES2 doesn't allow multi-sampled render targets at all */ + for (int i = 0; i < _SG_PIXELFORMAT_NUM; i++) { + _sg.formats[i].msaa = false; + } +} +#endif + +/*-- state cache implementation ----------------------------------------------*/ +_SOKOL_PRIVATE void _sg_gl_cache_clear_buffer_bindings(bool force) { + if (force || (_sg.gl.cache.vertex_buffer != 0)) { + glBindBuffer(GL_ARRAY_BUFFER, 0); + _sg.gl.cache.vertex_buffer = 0; + } + if (force || (_sg.gl.cache.index_buffer != 0)) { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + _sg.gl.cache.index_buffer = 0; + } +} + +_SOKOL_PRIVATE void _sg_gl_cache_bind_buffer(GLenum target, GLuint buffer) { + SOKOL_ASSERT((GL_ARRAY_BUFFER == target) || (GL_ELEMENT_ARRAY_BUFFER == target)); + if (target == GL_ARRAY_BUFFER) { + if (_sg.gl.cache.vertex_buffer != buffer) { + _sg.gl.cache.vertex_buffer = buffer; + glBindBuffer(target, buffer); + } + } + else { + if (_sg.gl.cache.index_buffer != buffer) { + _sg.gl.cache.index_buffer = buffer; + glBindBuffer(target, buffer); + } + } +} + +_SOKOL_PRIVATE void _sg_gl_cache_store_buffer_binding(GLenum target) { + if (target == GL_ARRAY_BUFFER) { + _sg.gl.cache.stored_vertex_buffer = _sg.gl.cache.vertex_buffer; + } + else { + _sg.gl.cache.stored_index_buffer = _sg.gl.cache.index_buffer; + } +} + +_SOKOL_PRIVATE void _sg_gl_cache_restore_buffer_binding(GLenum target) { + if (target == GL_ARRAY_BUFFER) { + if (_sg.gl.cache.stored_vertex_buffer != 0) { + /* we only care restoring valid ids */ + _sg_gl_cache_bind_buffer(target, _sg.gl.cache.stored_vertex_buffer); + _sg.gl.cache.stored_vertex_buffer = 0; + } + } + else { + if (_sg.gl.cache.stored_index_buffer != 0) { + /* we only care restoring valid ids */ + _sg_gl_cache_bind_buffer(target, _sg.gl.cache.stored_index_buffer); + _sg.gl.cache.stored_index_buffer = 0; + } + } +} + +/* called when from _sg_gl_destroy_buffer() */ +_SOKOL_PRIVATE void _sg_gl_cache_invalidate_buffer(GLuint buf) { + if (buf == _sg.gl.cache.vertex_buffer) { + _sg.gl.cache.vertex_buffer = 0; + glBindBuffer(GL_ARRAY_BUFFER, 0); + } + if (buf == _sg.gl.cache.index_buffer) { + _sg.gl.cache.index_buffer = 0; + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + } + if (buf == _sg.gl.cache.stored_vertex_buffer) { + _sg.gl.cache.stored_vertex_buffer = 0; + } + if (buf == _sg.gl.cache.stored_index_buffer) { + _sg.gl.cache.stored_index_buffer = 0; + } + for (int i = 0; i < SG_MAX_VERTEX_ATTRIBUTES; i++) { + if (buf == _sg.gl.cache.attrs[i].gl_vbuf) { + _sg.gl.cache.attrs[i].gl_vbuf = 0; + } + } +} + +_SOKOL_PRIVATE void _sg_gl_cache_active_texture(GLenum texture) { + if (_sg.gl.cache.cur_active_texture != texture) { + _sg.gl.cache.cur_active_texture = texture; + glActiveTexture(texture); + } +} + +_SOKOL_PRIVATE void _sg_gl_cache_clear_texture_bindings(bool force) { + for (int i = 0; (i < SG_MAX_SHADERSTAGE_IMAGES) && (i < _sg.gl.max_combined_texture_image_units); i++) { + if (force || (_sg.gl.cache.textures[i].texture != 0)) { + GLenum gl_texture_slot = (GLenum) (GL_TEXTURE0 + i); + glActiveTexture(gl_texture_slot); + glBindTexture(GL_TEXTURE_2D, 0); + glBindTexture(GL_TEXTURE_CUBE_MAP, 0); + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + glBindTexture(GL_TEXTURE_3D, 0); + glBindTexture(GL_TEXTURE_2D_ARRAY, 0); + } + #endif + _sg.gl.cache.textures[i].target = 0; + _sg.gl.cache.textures[i].texture = 0; + _sg.gl.cache.cur_active_texture = gl_texture_slot; + } + } +} + +_SOKOL_PRIVATE void _sg_gl_cache_bind_texture(int slot_index, GLenum target, GLuint texture) { + /* it's valid to call this function with target=0 and/or texture=0 + target=0 will unbind the previous binding, texture=0 will clear + the new binding + */ + SOKOL_ASSERT(slot_index < SG_MAX_SHADERSTAGE_IMAGES); + if (slot_index >= _sg.gl.max_combined_texture_image_units) { + return; + } + _sg_gl_texture_bind_slot* slot = &_sg.gl.cache.textures[slot_index]; + if ((slot->target != target) || (slot->texture != texture)) { + _sg_gl_cache_active_texture((GLenum)(GL_TEXTURE0 + slot_index)); + /* if the target has changed, clear the previous binding on that target */ + if ((target != slot->target) && (slot->target != 0)) { + glBindTexture(slot->target, 0); + } + /* apply new binding (texture can be 0 to unbind) */ + if (target != 0) { + glBindTexture(target, texture); + } + slot->target = target; + slot->texture = texture; + } +} + +_SOKOL_PRIVATE void _sg_gl_cache_store_texture_binding(int slot_index) { + SOKOL_ASSERT(slot_index < SG_MAX_SHADERSTAGE_IMAGES); + _sg.gl.cache.stored_texture = _sg.gl.cache.textures[slot_index]; +} + +_SOKOL_PRIVATE void _sg_gl_cache_restore_texture_binding(int slot_index) { + SOKOL_ASSERT(slot_index < SG_MAX_SHADERSTAGE_IMAGES); + _sg_gl_texture_bind_slot* slot = &_sg.gl.cache.stored_texture; + if (slot->texture != 0) { + /* we only care restoring valid ids */ + SOKOL_ASSERT(slot->target != 0); + _sg_gl_cache_bind_texture(slot_index, slot->target, slot->texture); + slot->target = 0; + slot->texture = 0; + } +} + +/* called from _sg_gl_destroy_texture() */ +_SOKOL_PRIVATE void _sg_gl_cache_invalidate_texture(GLuint tex) { + for (int i = 0; i < SG_MAX_SHADERSTAGE_IMAGES; i++) { + _sg_gl_texture_bind_slot* slot = &_sg.gl.cache.textures[i]; + if (tex == slot->texture) { + _sg_gl_cache_active_texture((GLenum)(GL_TEXTURE0 + i)); + glBindTexture(slot->target, 0); + slot->target = 0; + slot->texture = 0; + } + } + if (tex == _sg.gl.cache.stored_texture.texture) { + _sg.gl.cache.stored_texture.target = 0; + _sg.gl.cache.stored_texture.texture = 0; + } +} + +/* called from _sg_gl_destroy_shader() */ +_SOKOL_PRIVATE void _sg_gl_cache_invalidate_program(GLuint prog) { + if (prog == _sg.gl.cache.prog) { + _sg.gl.cache.prog = 0; + glUseProgram(0); + } +} + +/* called from _sg_gl_destroy_pipeline() */ +_SOKOL_PRIVATE void _sg_gl_cache_invalidate_pipeline(_sg_pipeline_t* pip) { + if (pip == _sg.gl.cache.cur_pipeline) { + _sg.gl.cache.cur_pipeline = 0; + _sg.gl.cache.cur_pipeline_id.id = SG_INVALID_ID; + } +} + +_SOKOL_PRIVATE void _sg_gl_reset_state_cache(void) { + if (_sg.gl.cur_context) { + _SG_GL_CHECK_ERROR(); + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + glBindVertexArray(_sg.gl.cur_context->vao); + _SG_GL_CHECK_ERROR(); + } + #endif + memset(&_sg.gl.cache, 0, sizeof(_sg.gl.cache)); + _sg_gl_cache_clear_buffer_bindings(true); + _SG_GL_CHECK_ERROR(); + _sg_gl_cache_clear_texture_bindings(true); + _SG_GL_CHECK_ERROR(); + for (int i = 0; i < _sg.limits.max_vertex_attrs; i++) { + _sg_gl_attr_t* attr = &_sg.gl.cache.attrs[i].gl_attr; + attr->vb_index = -1; + attr->divisor = -1; + glDisableVertexAttribArray((GLuint)i); + _SG_GL_CHECK_ERROR(); + } + _sg.gl.cache.cur_primitive_type = GL_TRIANGLES; + + /* shader program */ + glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&_sg.gl.cache.prog); + _SG_GL_CHECK_ERROR(); + + /* depth and stencil state */ + _sg.gl.cache.depth.compare = SG_COMPAREFUNC_ALWAYS; + _sg.gl.cache.stencil.front.compare = SG_COMPAREFUNC_ALWAYS; + _sg.gl.cache.stencil.front.fail_op = SG_STENCILOP_KEEP; + _sg.gl.cache.stencil.front.depth_fail_op = SG_STENCILOP_KEEP; + _sg.gl.cache.stencil.front.pass_op = SG_STENCILOP_KEEP; + _sg.gl.cache.stencil.back.compare = SG_COMPAREFUNC_ALWAYS; + _sg.gl.cache.stencil.back.fail_op = SG_STENCILOP_KEEP; + _sg.gl.cache.stencil.back.depth_fail_op = SG_STENCILOP_KEEP; + _sg.gl.cache.stencil.back.pass_op = SG_STENCILOP_KEEP; + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_ALWAYS); + glDepthMask(GL_FALSE); + glDisable(GL_STENCIL_TEST); + glStencilFunc(GL_ALWAYS, 0, 0); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + glStencilMask(0); + + /* blend state */ + _sg.gl.cache.blend.src_factor_rgb = SG_BLENDFACTOR_ONE; + _sg.gl.cache.blend.dst_factor_rgb = SG_BLENDFACTOR_ZERO; + _sg.gl.cache.blend.op_rgb = SG_BLENDOP_ADD; + _sg.gl.cache.blend.src_factor_alpha = SG_BLENDFACTOR_ONE; + _sg.gl.cache.blend.dst_factor_alpha = SG_BLENDFACTOR_ZERO; + _sg.gl.cache.blend.op_alpha = SG_BLENDOP_ADD; + glDisable(GL_BLEND); + glBlendFuncSeparate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO); + glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD); + glBlendColor(0.0f, 0.0f, 0.0f, 0.0f); + + /* standalone state */ + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + _sg.gl.cache.color_write_mask[i] = SG_COLORMASK_RGBA; + } + _sg.gl.cache.cull_mode = SG_CULLMODE_NONE; + _sg.gl.cache.face_winding = SG_FACEWINDING_CW; + _sg.gl.cache.sample_count = 1; + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glPolygonOffset(0.0f, 0.0f); + glDisable(GL_POLYGON_OFFSET_FILL); + glDisable(GL_CULL_FACE); + glFrontFace(GL_CW); + glCullFace(GL_BACK); + glEnable(GL_SCISSOR_TEST); + glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE); + glEnable(GL_DITHER); + glDisable(GL_POLYGON_OFFSET_FILL); + #if defined(SOKOL_GLCORE33) + glEnable(GL_MULTISAMPLE); + glEnable(GL_PROGRAM_POINT_SIZE); + #endif + } +} + +_SOKOL_PRIVATE void _sg_gl_setup_backend(const sg_desc* desc) { + /* assumes that _sg.gl is already zero-initialized */ + _sg.gl.valid = true; + #if defined(SOKOL_GLES2) || defined(SOKOL_GLES3) + _sg.gl.gles2 = desc->context.gl.force_gles2; + #else + _SOKOL_UNUSED(desc); + _sg.gl.gles2 = false; + #endif + + #if defined(_SOKOL_USE_WIN32_GL_LOADER) + _sg_gl_load_opengl(); + #endif + + /* clear initial GL error state */ + #if defined(SOKOL_DEBUG) + while (glGetError() != GL_NO_ERROR); + #endif + #if defined(SOKOL_GLCORE33) + _sg_gl_init_caps_glcore33(); + #elif defined(SOKOL_GLES3) + if (_sg.gl.gles2) { + _sg_gl_init_caps_gles2(); + } + else { + _sg_gl_init_caps_gles3(); + } + #else + _sg_gl_init_caps_gles2(); + #endif +} + +_SOKOL_PRIVATE void _sg_gl_discard_backend(void) { + SOKOL_ASSERT(_sg.gl.valid); + _sg.gl.valid = false; + #if defined(_SOKOL_USE_WIN32_GL_LOADER) + _sg_gl_unload_opengl(); + #endif +} + +_SOKOL_PRIVATE void _sg_gl_activate_context(_sg_context_t* ctx) { + SOKOL_ASSERT(_sg.gl.valid); + /* NOTE: ctx can be 0 to unset the current context */ + _sg.gl.cur_context = ctx; + _sg_gl_reset_state_cache(); +} + +/*-- GL backend resource creation and destruction ----------------------------*/ +_SOKOL_PRIVATE sg_resource_state _sg_gl_create_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + SOKOL_ASSERT(0 == ctx->default_framebuffer); + _SG_GL_CHECK_ERROR(); + glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*)&ctx->default_framebuffer); + _SG_GL_CHECK_ERROR(); + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + SOKOL_ASSERT(0 == ctx->vao); + glGenVertexArrays(1, &ctx->vao); + glBindVertexArray(ctx->vao); + _SG_GL_CHECK_ERROR(); + } + #endif + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_gl_destroy_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + if (ctx->vao) { + glDeleteVertexArrays(1, &ctx->vao); + } + _SG_GL_CHECK_ERROR(); + } + #else + _SOKOL_UNUSED(ctx); + #endif +} + +_SOKOL_PRIVATE sg_resource_state _sg_gl_create_buffer(_sg_buffer_t* buf, const sg_buffer_desc* desc) { + SOKOL_ASSERT(buf && desc); + _SG_GL_CHECK_ERROR(); + _sg_buffer_common_init(&buf->cmn, desc); + buf->gl.ext_buffers = (0 != desc->gl_buffers[0]); + GLenum gl_target = _sg_gl_buffer_target(buf->cmn.type); + GLenum gl_usage = _sg_gl_usage(buf->cmn.usage); + for (int slot = 0; slot < buf->cmn.num_slots; slot++) { + GLuint gl_buf = 0; + if (buf->gl.ext_buffers) { + SOKOL_ASSERT(desc->gl_buffers[slot]); + gl_buf = desc->gl_buffers[slot]; + } + else { + glGenBuffers(1, &gl_buf); + SOKOL_ASSERT(gl_buf); + _sg_gl_cache_store_buffer_binding(gl_target); + _sg_gl_cache_bind_buffer(gl_target, gl_buf); + glBufferData(gl_target, buf->cmn.size, 0, gl_usage); + if (buf->cmn.usage == SG_USAGE_IMMUTABLE) { + SOKOL_ASSERT(desc->data.ptr); + glBufferSubData(gl_target, 0, buf->cmn.size, desc->data.ptr); + } + _sg_gl_cache_restore_buffer_binding(gl_target); + } + buf->gl.buf[slot] = gl_buf; + } + _SG_GL_CHECK_ERROR(); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_gl_destroy_buffer(_sg_buffer_t* buf) { + SOKOL_ASSERT(buf); + _SG_GL_CHECK_ERROR(); + for (int slot = 0; slot < buf->cmn.num_slots; slot++) { + if (buf->gl.buf[slot]) { + _sg_gl_cache_invalidate_buffer(buf->gl.buf[slot]); + if (!buf->gl.ext_buffers) { + glDeleteBuffers(1, &buf->gl.buf[slot]); + } + } + } + _SG_GL_CHECK_ERROR(); +} + +_SOKOL_PRIVATE bool _sg_gl_supported_texture_format(sg_pixel_format fmt) { + const int fmt_index = (int) fmt; + SOKOL_ASSERT((fmt_index > SG_PIXELFORMAT_NONE) && (fmt_index < _SG_PIXELFORMAT_NUM)); + return _sg.formats[fmt_index].sample; +} + +_SOKOL_PRIVATE sg_resource_state _sg_gl_create_image(_sg_image_t* img, const sg_image_desc* desc) { + SOKOL_ASSERT(img && desc); + _SG_GL_CHECK_ERROR(); + _sg_image_common_init(&img->cmn, desc); + img->gl.ext_textures = (0 != desc->gl_textures[0]); + + /* check if texture format is support */ + if (!_sg_gl_supported_texture_format(img->cmn.pixel_format)) { + SOKOL_LOG("texture format not supported by GL context\n"); + return SG_RESOURCESTATE_FAILED; + } + /* check for optional texture types */ + if ((img->cmn.type == SG_IMAGETYPE_3D) && !_sg.features.imagetype_3d) { + SOKOL_LOG("3D textures not supported by GL context\n"); + return SG_RESOURCESTATE_FAILED; + } + if ((img->cmn.type == SG_IMAGETYPE_ARRAY) && !_sg.features.imagetype_array) { + SOKOL_LOG("array textures not supported by GL context\n"); + return SG_RESOURCESTATE_FAILED; + } + + #if !defined(SOKOL_GLES2) + bool msaa = false; + if (!_sg.gl.gles2) { + msaa = (img->cmn.sample_count > 1) && (_sg.features.msaa_render_targets); + } + #endif + + if (_sg_is_valid_rendertarget_depth_format(img->cmn.pixel_format)) { + /* special case depth-stencil-buffer? */ + SOKOL_ASSERT((img->cmn.usage == SG_USAGE_IMMUTABLE) && (img->cmn.num_slots == 1)); + SOKOL_ASSERT(!img->gl.ext_textures); /* cannot provide external texture for depth images */ + glGenRenderbuffers(1, &img->gl.depth_render_buffer); + glBindRenderbuffer(GL_RENDERBUFFER, img->gl.depth_render_buffer); + GLenum gl_depth_format = _sg_gl_depth_attachment_format(img->cmn.pixel_format); + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2 && msaa) { + glRenderbufferStorageMultisample(GL_RENDERBUFFER, img->cmn.sample_count, gl_depth_format, img->cmn.width, img->cmn.height); + } + else + #endif + { + glRenderbufferStorage(GL_RENDERBUFFER, gl_depth_format, img->cmn.width, img->cmn.height); + } + } + else { + /* regular color texture */ + img->gl.target = _sg_gl_texture_target(img->cmn.type); + const GLenum gl_internal_format = _sg_gl_teximage_internal_format(img->cmn.pixel_format); + + /* if this is a MSAA render target, need to create a separate render buffer */ + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2 && img->cmn.render_target && msaa) { + glGenRenderbuffers(1, &img->gl.msaa_render_buffer); + glBindRenderbuffer(GL_RENDERBUFFER, img->gl.msaa_render_buffer); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, img->cmn.sample_count, gl_internal_format, img->cmn.width, img->cmn.height); + } + #endif + + if (img->gl.ext_textures) { + /* inject externally GL textures */ + for (int slot = 0; slot < img->cmn.num_slots; slot++) { + SOKOL_ASSERT(desc->gl_textures[slot]); + img->gl.tex[slot] = desc->gl_textures[slot]; + } + if (desc->gl_texture_target) { + img->gl.target = (GLenum)desc->gl_texture_target; + } + } + else { + /* create our own GL texture(s) */ + const GLenum gl_format = _sg_gl_teximage_format(img->cmn.pixel_format); + const bool is_compressed = _sg_is_compressed_pixel_format(img->cmn.pixel_format); + for (int slot = 0; slot < img->cmn.num_slots; slot++) { + glGenTextures(1, &img->gl.tex[slot]); + SOKOL_ASSERT(img->gl.tex[slot]); + _sg_gl_cache_store_texture_binding(0); + _sg_gl_cache_bind_texture(0, img->gl.target, img->gl.tex[slot]); + GLenum gl_min_filter = _sg_gl_filter(img->cmn.min_filter); + GLenum gl_mag_filter = _sg_gl_filter(img->cmn.mag_filter); + glTexParameteri(img->gl.target, GL_TEXTURE_MIN_FILTER, (GLint)gl_min_filter); + glTexParameteri(img->gl.target, GL_TEXTURE_MAG_FILTER, (GLint)gl_mag_filter); + if (_sg.gl.ext_anisotropic && (img->cmn.max_anisotropy > 1)) { + GLint max_aniso = (GLint) img->cmn.max_anisotropy; + if (max_aniso > _sg.gl.max_anisotropy) { + max_aniso = _sg.gl.max_anisotropy; + } + glTexParameteri(img->gl.target, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_aniso); + } + if (img->cmn.type == SG_IMAGETYPE_CUBE) { + glTexParameteri(img->gl.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(img->gl.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + } + else { + glTexParameteri(img->gl.target, GL_TEXTURE_WRAP_S, (GLint)_sg_gl_wrap(img->cmn.wrap_u)); + glTexParameteri(img->gl.target, GL_TEXTURE_WRAP_T, (GLint)_sg_gl_wrap(img->cmn.wrap_v)); + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2 && (img->cmn.type == SG_IMAGETYPE_3D)) { + glTexParameteri(img->gl.target, GL_TEXTURE_WRAP_R, (GLint)_sg_gl_wrap(img->cmn.wrap_w)); + } + #endif + #if defined(SOKOL_GLCORE33) + float border[4]; + switch (img->cmn.border_color) { + case SG_BORDERCOLOR_TRANSPARENT_BLACK: + border[0] = 0.0f; border[1] = 0.0f; border[2] = 0.0f; border[3] = 0.0f; + break; + case SG_BORDERCOLOR_OPAQUE_WHITE: + border[0] = 1.0f; border[1] = 1.0f; border[2] = 1.0f; border[3] = 1.0f; + break; + default: + border[0] = 0.0f; border[1] = 0.0f; border[2] = 0.0f; border[3] = 1.0f; + break; + } + glTexParameterfv(img->gl.target, GL_TEXTURE_BORDER_COLOR, border); + #endif + } + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + /* GL spec has strange defaults for mipmap min/max lod: -1000 to +1000 */ + const float min_lod = _sg_clamp(desc->min_lod, 0.0f, 1000.0f); + const float max_lod = _sg_clamp(desc->max_lod, 0.0f, 1000.0f); + glTexParameterf(img->gl.target, GL_TEXTURE_MIN_LOD, min_lod); + glTexParameterf(img->gl.target, GL_TEXTURE_MAX_LOD, max_lod); + } + #endif + const int num_faces = img->cmn.type == SG_IMAGETYPE_CUBE ? 6 : 1; + int data_index = 0; + for (int face_index = 0; face_index < num_faces; face_index++) { + for (int mip_index = 0; mip_index < img->cmn.num_mipmaps; mip_index++, data_index++) { + GLenum gl_img_target = img->gl.target; + if (SG_IMAGETYPE_CUBE == img->cmn.type) { + gl_img_target = _sg_gl_cubeface_target(face_index); + } + const GLvoid* data_ptr = desc->data.subimage[face_index][mip_index].ptr; + int mip_width = img->cmn.width >> mip_index; + if (mip_width == 0) { + mip_width = 1; + } + int mip_height = img->cmn.height >> mip_index; + if (mip_height == 0) { + mip_height = 1; + } + if ((SG_IMAGETYPE_2D == img->cmn.type) || (SG_IMAGETYPE_CUBE == img->cmn.type)) { + if (is_compressed) { + const GLsizei data_size = (GLsizei) desc->data.subimage[face_index][mip_index].size; + glCompressedTexImage2D(gl_img_target, mip_index, gl_internal_format, + mip_width, mip_height, 0, data_size, data_ptr); + } + else { + const GLenum gl_type = _sg_gl_teximage_type(img->cmn.pixel_format); + glTexImage2D(gl_img_target, mip_index, (GLint)gl_internal_format, + mip_width, mip_height, 0, gl_format, gl_type, data_ptr); + } + } + #if !defined(SOKOL_GLES2) + else if (!_sg.gl.gles2 && ((SG_IMAGETYPE_3D == img->cmn.type) || (SG_IMAGETYPE_ARRAY == img->cmn.type))) { + int mip_depth = img->cmn.num_slices; + if (SG_IMAGETYPE_3D == img->cmn.type) { + mip_depth >>= mip_index; + } + if (mip_depth == 0) { + mip_depth = 1; + } + if (is_compressed) { + const GLsizei data_size = (GLsizei) desc->data.subimage[face_index][mip_index].size; + glCompressedTexImage3D(gl_img_target, mip_index, gl_internal_format, + mip_width, mip_height, mip_depth, 0, data_size, data_ptr); + } + else { + const GLenum gl_type = _sg_gl_teximage_type(img->cmn.pixel_format); + glTexImage3D(gl_img_target, mip_index, (GLint)gl_internal_format, + mip_width, mip_height, mip_depth, 0, gl_format, gl_type, data_ptr); + } + } + #endif + } + } + _sg_gl_cache_restore_texture_binding(0); + } + } + } + _SG_GL_CHECK_ERROR(); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_gl_destroy_image(_sg_image_t* img) { + SOKOL_ASSERT(img); + _SG_GL_CHECK_ERROR(); + for (int slot = 0; slot < img->cmn.num_slots; slot++) { + if (img->gl.tex[slot]) { + _sg_gl_cache_invalidate_texture(img->gl.tex[slot]); + if (!img->gl.ext_textures) { + glDeleteTextures(1, &img->gl.tex[slot]); + } + } + } + if (img->gl.depth_render_buffer) { + glDeleteRenderbuffers(1, &img->gl.depth_render_buffer); + } + if (img->gl.msaa_render_buffer) { + glDeleteRenderbuffers(1, &img->gl.msaa_render_buffer); + } + _SG_GL_CHECK_ERROR(); +} + +_SOKOL_PRIVATE GLuint _sg_gl_compile_shader(sg_shader_stage stage, const char* src) { + SOKOL_ASSERT(src); + _SG_GL_CHECK_ERROR(); + GLuint gl_shd = glCreateShader(_sg_gl_shader_stage(stage)); + glShaderSource(gl_shd, 1, &src, 0); + glCompileShader(gl_shd); + GLint compile_status = 0; + glGetShaderiv(gl_shd, GL_COMPILE_STATUS, &compile_status); + if (!compile_status) { + /* compilation failed, log error and delete shader */ + GLint log_len = 0; + glGetShaderiv(gl_shd, GL_INFO_LOG_LENGTH, &log_len); + if (log_len > 0) { + GLchar* log_buf = (GLchar*) SOKOL_MALLOC((size_t)log_len); + glGetShaderInfoLog(gl_shd, log_len, &log_len, log_buf); + SOKOL_LOG(log_buf); + SOKOL_FREE(log_buf); + } + glDeleteShader(gl_shd); + gl_shd = 0; + } + _SG_GL_CHECK_ERROR(); + return gl_shd; +} + +_SOKOL_PRIVATE sg_resource_state _sg_gl_create_shader(_sg_shader_t* shd, const sg_shader_desc* desc) { + SOKOL_ASSERT(shd && desc); + SOKOL_ASSERT(!shd->gl.prog); + _SG_GL_CHECK_ERROR(); + + _sg_shader_common_init(&shd->cmn, desc); + + /* copy vertex attribute names over, these are required for GLES2, and optional for GLES3 and GL3.x */ + for (int i = 0; i < SG_MAX_VERTEX_ATTRIBUTES; i++) { + _sg_strcpy(&shd->gl.attrs[i].name, desc->attrs[i].name); + } + + GLuint gl_vs = _sg_gl_compile_shader(SG_SHADERSTAGE_VS, desc->vs.source); + GLuint gl_fs = _sg_gl_compile_shader(SG_SHADERSTAGE_FS, desc->fs.source); + if (!(gl_vs && gl_fs)) { + return SG_RESOURCESTATE_FAILED; + } + GLuint gl_prog = glCreateProgram(); + glAttachShader(gl_prog, gl_vs); + glAttachShader(gl_prog, gl_fs); + glLinkProgram(gl_prog); + glDeleteShader(gl_vs); + glDeleteShader(gl_fs); + _SG_GL_CHECK_ERROR(); + + GLint link_status; + glGetProgramiv(gl_prog, GL_LINK_STATUS, &link_status); + if (!link_status) { + GLint log_len = 0; + glGetProgramiv(gl_prog, GL_INFO_LOG_LENGTH, &log_len); + if (log_len > 0) { + GLchar* log_buf = (GLchar*) SOKOL_MALLOC((size_t)log_len); + glGetProgramInfoLog(gl_prog, log_len, &log_len, log_buf); + SOKOL_LOG(log_buf); + SOKOL_FREE(log_buf); + } + glDeleteProgram(gl_prog); + return SG_RESOURCESTATE_FAILED; + } + shd->gl.prog = gl_prog; + + /* resolve uniforms */ + _SG_GL_CHECK_ERROR(); + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + const sg_shader_stage_desc* stage_desc = (stage_index == SG_SHADERSTAGE_VS)? &desc->vs : &desc->fs; + _sg_gl_shader_stage_t* gl_stage = &shd->gl.stage[stage_index]; + for (int ub_index = 0; ub_index < shd->cmn.stage[stage_index].num_uniform_blocks; ub_index++) { + const sg_shader_uniform_block_desc* ub_desc = &stage_desc->uniform_blocks[ub_index]; + SOKOL_ASSERT(ub_desc->size > 0); + _sg_gl_uniform_block_t* ub = &gl_stage->uniform_blocks[ub_index]; + SOKOL_ASSERT(ub->num_uniforms == 0); + uint32_t cur_uniform_offset = 0; + for (int u_index = 0; u_index < SG_MAX_UB_MEMBERS; u_index++) { + const sg_shader_uniform_desc* u_desc = &ub_desc->uniforms[u_index]; + if (u_desc->type == SG_UNIFORMTYPE_INVALID) { + break; + } + const uint32_t u_align = _sg_uniform_alignment(u_desc->type, u_desc->array_count, ub_desc->layout); + const uint32_t u_size = _sg_uniform_size(u_desc->type, u_desc->array_count, ub_desc->layout); + cur_uniform_offset = _sg_align_u32(cur_uniform_offset, u_align); + _sg_gl_uniform_t* u = &ub->uniforms[u_index]; + u->type = u_desc->type; + u->count = (uint16_t) u_desc->array_count; + u->offset = (uint16_t) cur_uniform_offset; + cur_uniform_offset += u_size; + if (u_desc->name) { + u->gl_loc = glGetUniformLocation(gl_prog, u_desc->name); + } + else { + u->gl_loc = u_index; + } + ub->num_uniforms++; + } + if (ub_desc->layout == SG_UNIFORMLAYOUT_STD140) { + cur_uniform_offset = _sg_align_u32(cur_uniform_offset, 16); + } + SOKOL_ASSERT(ub_desc->size == (size_t)cur_uniform_offset); + _SOKOL_UNUSED(cur_uniform_offset); + } + } + + /* resolve image locations */ + _SG_GL_CHECK_ERROR(); + GLuint cur_prog = 0; + glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&cur_prog); + glUseProgram(gl_prog); + int gl_tex_slot = 0; + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + const sg_shader_stage_desc* stage_desc = (stage_index == SG_SHADERSTAGE_VS)? &desc->vs : &desc->fs; + _sg_gl_shader_stage_t* gl_stage = &shd->gl.stage[stage_index]; + for (int img_index = 0; img_index < shd->cmn.stage[stage_index].num_images; img_index++) { + const sg_shader_image_desc* img_desc = &stage_desc->images[img_index]; + SOKOL_ASSERT(img_desc->image_type != _SG_IMAGETYPE_DEFAULT); + _sg_gl_shader_image_t* gl_img = &gl_stage->images[img_index]; + GLint gl_loc = img_index; + if (img_desc->name) { + gl_loc = glGetUniformLocation(gl_prog, img_desc->name); + } + if (gl_loc != -1) { + gl_img->gl_tex_slot = gl_tex_slot++; + glUniform1i(gl_loc, gl_img->gl_tex_slot); + } + else { + gl_img->gl_tex_slot = -1; + } + } + } + /* it's legal to call glUseProgram with 0 */ + glUseProgram(cur_prog); + _SG_GL_CHECK_ERROR(); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_gl_destroy_shader(_sg_shader_t* shd) { + SOKOL_ASSERT(shd); + _SG_GL_CHECK_ERROR(); + if (shd->gl.prog) { + _sg_gl_cache_invalidate_program(shd->gl.prog); + glDeleteProgram(shd->gl.prog); + } + _SG_GL_CHECK_ERROR(); +} + +_SOKOL_PRIVATE sg_resource_state _sg_gl_create_pipeline(_sg_pipeline_t* pip, _sg_shader_t* shd, const sg_pipeline_desc* desc) { + SOKOL_ASSERT(pip && shd && desc); + SOKOL_ASSERT(!pip->shader && pip->cmn.shader_id.id == SG_INVALID_ID); + SOKOL_ASSERT(desc->shader.id == shd->slot.id); + SOKOL_ASSERT(shd->gl.prog); + pip->shader = shd; + _sg_pipeline_common_init(&pip->cmn, desc); + pip->gl.primitive_type = desc->primitive_type; + pip->gl.depth = desc->depth; + pip->gl.stencil = desc->stencil; + // FIXME: blend color and write mask per draw-buffer-attachment (requires GL4) + pip->gl.blend = desc->colors[0].blend; + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + pip->gl.color_write_mask[i] = desc->colors[i].write_mask; + } + pip->gl.cull_mode = desc->cull_mode; + pip->gl.face_winding = desc->face_winding; + pip->gl.sample_count = desc->sample_count; + pip->gl.alpha_to_coverage_enabled = desc->alpha_to_coverage_enabled; + + /* resolve vertex attributes */ + for (int attr_index = 0; attr_index < SG_MAX_VERTEX_ATTRIBUTES; attr_index++) { + pip->gl.attrs[attr_index].vb_index = -1; + } + for (int attr_index = 0; attr_index < _sg.limits.max_vertex_attrs; attr_index++) { + const sg_vertex_attr_desc* a_desc = &desc->layout.attrs[attr_index]; + if (a_desc->format == SG_VERTEXFORMAT_INVALID) { + break; + } + SOKOL_ASSERT(a_desc->buffer_index < SG_MAX_SHADERSTAGE_BUFFERS); + const sg_buffer_layout_desc* l_desc = &desc->layout.buffers[a_desc->buffer_index]; + const sg_vertex_step step_func = l_desc->step_func; + const int step_rate = l_desc->step_rate; + GLint attr_loc = attr_index; + if (!_sg_strempty(&shd->gl.attrs[attr_index].name)) { + attr_loc = glGetAttribLocation(pip->shader->gl.prog, _sg_strptr(&shd->gl.attrs[attr_index].name)); + } + SOKOL_ASSERT(attr_loc < (GLint)_sg.limits.max_vertex_attrs); + if (attr_loc != -1) { + _sg_gl_attr_t* gl_attr = &pip->gl.attrs[attr_loc]; + SOKOL_ASSERT(gl_attr->vb_index == -1); + gl_attr->vb_index = (int8_t) a_desc->buffer_index; + if (step_func == SG_VERTEXSTEP_PER_VERTEX) { + gl_attr->divisor = 0; + } + else { + gl_attr->divisor = (int8_t) step_rate; + pip->cmn.use_instanced_draw = true; + } + SOKOL_ASSERT(l_desc->stride > 0); + gl_attr->stride = (uint8_t) l_desc->stride; + gl_attr->offset = a_desc->offset; + gl_attr->size = (uint8_t) _sg_gl_vertexformat_size(a_desc->format); + gl_attr->type = _sg_gl_vertexformat_type(a_desc->format); + gl_attr->normalized = _sg_gl_vertexformat_normalized(a_desc->format); + pip->cmn.vertex_layout_valid[a_desc->buffer_index] = true; + } + else { + SOKOL_LOG("Vertex attribute not found in shader: "); + SOKOL_LOG(_sg_strptr(&shd->gl.attrs[attr_index].name)); + } + } + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_gl_destroy_pipeline(_sg_pipeline_t* pip) { + SOKOL_ASSERT(pip); + _sg_gl_cache_invalidate_pipeline(pip); +} + +/* + _sg_create_pass + + att_imgs must point to a _sg_image* att_imgs[SG_MAX_COLOR_ATTACHMENTS+1] array, + first entries are the color attachment images (or nullptr), last entry + is the depth-stencil image (or nullptr). +*/ +_SOKOL_PRIVATE sg_resource_state _sg_gl_create_pass(_sg_pass_t* pass, _sg_image_t** att_images, const sg_pass_desc* desc) { + SOKOL_ASSERT(pass && att_images && desc); + SOKOL_ASSERT(att_images && att_images[0]); + _SG_GL_CHECK_ERROR(); + + _sg_pass_common_init(&pass->cmn, desc); + + /* copy image pointers */ + const sg_pass_attachment_desc* att_desc; + for (int i = 0; i < pass->cmn.num_color_atts; i++) { + att_desc = &desc->color_attachments[i]; + SOKOL_ASSERT(att_desc->image.id != SG_INVALID_ID); + SOKOL_ASSERT(0 == pass->gl.color_atts[i].image); + SOKOL_ASSERT(att_images[i] && (att_images[i]->slot.id == att_desc->image.id)); + SOKOL_ASSERT(_sg_is_valid_rendertarget_color_format(att_images[i]->cmn.pixel_format)); + pass->gl.color_atts[i].image = att_images[i]; + } + SOKOL_ASSERT(0 == pass->gl.ds_att.image); + att_desc = &desc->depth_stencil_attachment; + if (att_desc->image.id != SG_INVALID_ID) { + const int ds_img_index = SG_MAX_COLOR_ATTACHMENTS; + SOKOL_ASSERT(att_images[ds_img_index] && (att_images[ds_img_index]->slot.id == att_desc->image.id)); + SOKOL_ASSERT(_sg_is_valid_rendertarget_depth_format(att_images[ds_img_index]->cmn.pixel_format)); + pass->gl.ds_att.image = att_images[ds_img_index]; + } + + /* store current framebuffer binding (restored at end of function) */ + GLuint gl_orig_fb; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*)&gl_orig_fb); + + /* create a framebuffer object */ + glGenFramebuffers(1, &pass->gl.fb); + glBindFramebuffer(GL_FRAMEBUFFER, pass->gl.fb); + + /* attach msaa render buffer or textures */ + const bool is_msaa = (0 != att_images[0]->gl.msaa_render_buffer); + if (is_msaa) { + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + const _sg_image_t* att_img = pass->gl.color_atts[i].image; + if (att_img) { + const GLuint gl_render_buffer = att_img->gl.msaa_render_buffer; + SOKOL_ASSERT(gl_render_buffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, (GLenum)(GL_COLOR_ATTACHMENT0+i), GL_RENDERBUFFER, gl_render_buffer); + } + } + } + else { + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + const _sg_image_t* att_img = pass->gl.color_atts[i].image; + const int mip_level = pass->cmn.color_atts[i].mip_level; + const int slice = pass->cmn.color_atts[i].slice; + if (att_img) { + const GLuint gl_tex = att_img->gl.tex[0]; + SOKOL_ASSERT(gl_tex); + const GLenum gl_att = (GLenum)(GL_COLOR_ATTACHMENT0 + i); + switch (att_img->cmn.type) { + case SG_IMAGETYPE_2D: + glFramebufferTexture2D(GL_FRAMEBUFFER, gl_att, GL_TEXTURE_2D, gl_tex, mip_level); + break; + case SG_IMAGETYPE_CUBE: + glFramebufferTexture2D(GL_FRAMEBUFFER, gl_att, _sg_gl_cubeface_target(slice), gl_tex, mip_level); + break; + default: + /* 3D- or array-texture */ + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + glFramebufferTextureLayer(GL_FRAMEBUFFER, gl_att, gl_tex, mip_level, slice); + } + #endif + break; + } + } + } + } + + /* attach depth-stencil buffer to framebuffer */ + if (pass->gl.ds_att.image) { + const GLuint gl_render_buffer = pass->gl.ds_att.image->gl.depth_render_buffer; + SOKOL_ASSERT(gl_render_buffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, gl_render_buffer); + if (_sg_is_depth_stencil_format(pass->gl.ds_att.image->cmn.pixel_format)) { + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, gl_render_buffer); + } + } + + /* check if framebuffer is complete */ + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + SOKOL_LOG("Framebuffer completeness check failed!\n"); + return SG_RESOURCESTATE_FAILED; + } + + /* setup color attachments for the framebuffer */ + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + GLenum att[SG_MAX_COLOR_ATTACHMENTS] = { + GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1, + GL_COLOR_ATTACHMENT2, + GL_COLOR_ATTACHMENT3 + }; + glDrawBuffers(pass->cmn.num_color_atts, att); + } + #endif + + /* create MSAA resolve framebuffers if necessary */ + if (is_msaa) { + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + _sg_gl_attachment_t* gl_att = &pass->gl.color_atts[i]; + _sg_pass_attachment_t* cmn_att = &pass->cmn.color_atts[i]; + if (gl_att->image) { + SOKOL_ASSERT(0 == gl_att->gl_msaa_resolve_buffer); + glGenFramebuffers(1, &gl_att->gl_msaa_resolve_buffer); + glBindFramebuffer(GL_FRAMEBUFFER, gl_att->gl_msaa_resolve_buffer); + const GLuint gl_tex = gl_att->image->gl.tex[0]; + SOKOL_ASSERT(gl_tex); + switch (gl_att->image->cmn.type) { + case SG_IMAGETYPE_2D: + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, gl_tex, cmn_att->mip_level); + break; + case SG_IMAGETYPE_CUBE: + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + _sg_gl_cubeface_target(cmn_att->slice), gl_tex, cmn_att->mip_level); + break; + default: + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, gl_tex, cmn_att->mip_level, cmn_att->slice); + } + #endif + break; + } + /* check if framebuffer is complete */ + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + SOKOL_LOG("Framebuffer completeness check failed (msaa resolve buffer)!\n"); + return SG_RESOURCESTATE_FAILED; + } + /* setup color attachments for the framebuffer */ + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2) { + const GLenum gl_draw_bufs = GL_COLOR_ATTACHMENT0; + glDrawBuffers(1, &gl_draw_bufs); + } + #endif + } + } + } + + /* restore original framebuffer binding */ + glBindFramebuffer(GL_FRAMEBUFFER, gl_orig_fb); + _SG_GL_CHECK_ERROR(); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_gl_destroy_pass(_sg_pass_t* pass) { + SOKOL_ASSERT(pass); + SOKOL_ASSERT(pass != _sg.gl.cur_pass); + _SG_GL_CHECK_ERROR(); + if (0 != pass->gl.fb) { + glDeleteFramebuffers(1, &pass->gl.fb); + } + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + if (pass->gl.color_atts[i].gl_msaa_resolve_buffer) { + glDeleteFramebuffers(1, &pass->gl.color_atts[i].gl_msaa_resolve_buffer); + } + } + if (pass->gl.ds_att.gl_msaa_resolve_buffer) { + glDeleteFramebuffers(1, &pass->gl.ds_att.gl_msaa_resolve_buffer); + } + _SG_GL_CHECK_ERROR(); +} + +_SOKOL_PRIVATE _sg_image_t* _sg_gl_pass_color_image(const _sg_pass_t* pass, int index) { + SOKOL_ASSERT(pass && (index >= 0) && (index < SG_MAX_COLOR_ATTACHMENTS)); + /* NOTE: may return null */ + return pass->gl.color_atts[index].image; +} + +_SOKOL_PRIVATE _sg_image_t* _sg_gl_pass_ds_image(const _sg_pass_t* pass) { + /* NOTE: may return null */ + SOKOL_ASSERT(pass); + return pass->gl.ds_att.image; +} + +_SOKOL_PRIVATE void _sg_gl_begin_pass(_sg_pass_t* pass, const sg_pass_action* action, int w, int h) { + /* FIXME: what if a texture used as render target is still bound, should we + unbind all currently bound textures in begin pass? */ + SOKOL_ASSERT(action); + SOKOL_ASSERT(!_sg.gl.in_pass); + _SG_GL_CHECK_ERROR(); + _sg.gl.in_pass = true; + _sg.gl.cur_pass = pass; /* can be 0 */ + if (pass) { + _sg.gl.cur_pass_id.id = pass->slot.id; + } + else { + _sg.gl.cur_pass_id.id = SG_INVALID_ID; + } + _sg.gl.cur_pass_width = w; + _sg.gl.cur_pass_height = h; + + /* number of color attachments */ + const int num_color_atts = pass ? pass->cmn.num_color_atts : 1; + + /* bind the render pass framebuffer */ + if (pass) { + /* offscreen pass */ + SOKOL_ASSERT(pass->gl.fb); + glBindFramebuffer(GL_FRAMEBUFFER, pass->gl.fb); + } + else { + /* default pass */ + SOKOL_ASSERT(_sg.gl.cur_context); + glBindFramebuffer(GL_FRAMEBUFFER, _sg.gl.cur_context->default_framebuffer); + } + glViewport(0, 0, w, h); + glScissor(0, 0, w, h); + + /* clear color and depth-stencil attachments if needed */ + bool clear_color = false; + for (int i = 0; i < num_color_atts; i++) { + if (SG_ACTION_CLEAR == action->colors[i].action) { + clear_color = true; + break; + } + } + const bool clear_depth = (action->depth.action == SG_ACTION_CLEAR); + const bool clear_stencil = (action->stencil.action == SG_ACTION_CLEAR); + + bool need_pip_cache_flush = false; + if (clear_color) { + bool need_color_mask_flush = false; + // NOTE: not a bug to iterate over all possible color attachments + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + if (SG_COLORMASK_RGBA != _sg.gl.cache.color_write_mask[i]) { + need_pip_cache_flush = true; + need_color_mask_flush = true; + _sg.gl.cache.color_write_mask[i] = SG_COLORMASK_RGBA; + } + } + if (need_color_mask_flush) { + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + } + } + if (clear_depth) { + if (!_sg.gl.cache.depth.write_enabled) { + need_pip_cache_flush = true; + _sg.gl.cache.depth.write_enabled = true; + glDepthMask(GL_TRUE); + } + if (_sg.gl.cache.depth.compare != SG_COMPAREFUNC_ALWAYS) { + need_pip_cache_flush = true; + _sg.gl.cache.depth.compare = SG_COMPAREFUNC_ALWAYS; + glDepthFunc(GL_ALWAYS); + } + } + if (clear_stencil) { + if (_sg.gl.cache.stencil.write_mask != 0xFF) { + need_pip_cache_flush = true; + _sg.gl.cache.stencil.write_mask = 0xFF; + glStencilMask(0xFF); + } + } + if (need_pip_cache_flush) { + /* we messed with the state cache directly, need to clear cached + pipeline to force re-evaluation in next sg_apply_pipeline() */ + _sg.gl.cache.cur_pipeline = 0; + _sg.gl.cache.cur_pipeline_id.id = SG_INVALID_ID; + } + bool use_mrt_clear = (0 != pass); + #if defined(SOKOL_GLES2) + use_mrt_clear = false; + #else + if (_sg.gl.gles2) { + use_mrt_clear = false; + } + #endif + if (!use_mrt_clear) { + GLbitfield clear_mask = 0; + if (clear_color) { + clear_mask |= GL_COLOR_BUFFER_BIT; + const sg_color c = action->colors[0].value; + glClearColor(c.r, c.g, c.b, c.a); + } + if (clear_depth) { + clear_mask |= GL_DEPTH_BUFFER_BIT; + #ifdef SOKOL_GLCORE33 + glClearDepth(action->depth.value); + #else + glClearDepthf(action->depth.value); + #endif + } + if (clear_stencil) { + clear_mask |= GL_STENCIL_BUFFER_BIT; + glClearStencil(action->stencil.value); + } + if (0 != clear_mask) { + glClear(clear_mask); + } + } + #if !defined SOKOL_GLES2 + else { + SOKOL_ASSERT(pass); + for (int i = 0; i < num_color_atts; i++) { + if (action->colors[i].action == SG_ACTION_CLEAR) { + glClearBufferfv(GL_COLOR, i, &action->colors[i].value.r); + } + } + if (pass->gl.ds_att.image) { + if (clear_depth && clear_stencil) { + glClearBufferfi(GL_DEPTH_STENCIL, 0, action->depth.value, action->stencil.value); + } + else if (clear_depth) { + glClearBufferfv(GL_DEPTH, 0, &action->depth.value); + } + else if (clear_stencil) { + GLint val = (GLint) action->stencil.value; + glClearBufferiv(GL_STENCIL, 0, &val); + } + } + } + #endif + _SG_GL_CHECK_ERROR(); +} + +_SOKOL_PRIVATE void _sg_gl_end_pass(void) { + SOKOL_ASSERT(_sg.gl.in_pass); + _SG_GL_CHECK_ERROR(); + + /* if this was an offscreen pass, and MSAA rendering was used, need + to resolve into the pass images */ + #if !defined(SOKOL_GLES2) + if (!_sg.gl.gles2 && _sg.gl.cur_pass) { + /* check if the pass object is still valid */ + const _sg_pass_t* pass = _sg.gl.cur_pass; + SOKOL_ASSERT(pass->slot.id == _sg.gl.cur_pass_id.id); + bool is_msaa = (0 != _sg.gl.cur_pass->gl.color_atts[0].gl_msaa_resolve_buffer); + if (is_msaa) { + SOKOL_ASSERT(pass->gl.fb); + glBindFramebuffer(GL_READ_FRAMEBUFFER, pass->gl.fb); + SOKOL_ASSERT(pass->gl.color_atts[0].image); + const int w = pass->gl.color_atts[0].image->cmn.width; + const int h = pass->gl.color_atts[0].image->cmn.height; + for (int att_index = 0; att_index < SG_MAX_COLOR_ATTACHMENTS; att_index++) { + const _sg_gl_attachment_t* gl_att = &pass->gl.color_atts[att_index]; + if (gl_att->image) { + SOKOL_ASSERT(gl_att->gl_msaa_resolve_buffer); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, gl_att->gl_msaa_resolve_buffer); + glReadBuffer((GLenum)(GL_COLOR_ATTACHMENT0 + att_index)); + glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST); + } + else { + break; + } + } + } + } + #endif + _sg.gl.cur_pass = 0; + _sg.gl.cur_pass_id.id = SG_INVALID_ID; + _sg.gl.cur_pass_width = 0; + _sg.gl.cur_pass_height = 0; + + SOKOL_ASSERT(_sg.gl.cur_context); + glBindFramebuffer(GL_FRAMEBUFFER, _sg.gl.cur_context->default_framebuffer); + _sg.gl.in_pass = false; + _SG_GL_CHECK_ERROR(); +} + +_SOKOL_PRIVATE void _sg_gl_apply_viewport(int x, int y, int w, int h, bool origin_top_left) { + SOKOL_ASSERT(_sg.gl.in_pass); + y = origin_top_left ? (_sg.gl.cur_pass_height - (y+h)) : y; + glViewport(x, y, w, h); +} + +_SOKOL_PRIVATE void _sg_gl_apply_scissor_rect(int x, int y, int w, int h, bool origin_top_left) { + SOKOL_ASSERT(_sg.gl.in_pass); + y = origin_top_left ? (_sg.gl.cur_pass_height - (y+h)) : y; + glScissor(x, y, w, h); +} + +_SOKOL_PRIVATE void _sg_gl_apply_pipeline(_sg_pipeline_t* pip) { + SOKOL_ASSERT(pip); + SOKOL_ASSERT(pip->shader && (pip->cmn.shader_id.id == pip->shader->slot.id)); + _SG_GL_CHECK_ERROR(); + if ((_sg.gl.cache.cur_pipeline != pip) || (_sg.gl.cache.cur_pipeline_id.id != pip->slot.id)) { + _sg.gl.cache.cur_pipeline = pip; + _sg.gl.cache.cur_pipeline_id.id = pip->slot.id; + _sg.gl.cache.cur_primitive_type = _sg_gl_primitive_type(pip->gl.primitive_type); + _sg.gl.cache.cur_index_type = _sg_gl_index_type(pip->cmn.index_type); + + /* update depth state */ + { + const sg_depth_state* state_ds = &pip->gl.depth; + sg_depth_state* cache_ds = &_sg.gl.cache.depth; + if (state_ds->compare != cache_ds->compare) { + cache_ds->compare = state_ds->compare; + glDepthFunc(_sg_gl_compare_func(state_ds->compare)); + } + if (state_ds->write_enabled != cache_ds->write_enabled) { + cache_ds->write_enabled = state_ds->write_enabled; + glDepthMask(state_ds->write_enabled); + } + if (!_sg_fequal(state_ds->bias, cache_ds->bias, 0.000001f) || + !_sg_fequal(state_ds->bias_slope_scale, cache_ds->bias_slope_scale, 0.000001f)) + { + /* according to ANGLE's D3D11 backend: + D3D11 SlopeScaledDepthBias ==> GL polygonOffsetFactor + D3D11 DepthBias ==> GL polygonOffsetUnits + DepthBiasClamp has no meaning on GL + */ + cache_ds->bias = state_ds->bias; + cache_ds->bias_slope_scale = state_ds->bias_slope_scale; + glPolygonOffset(state_ds->bias_slope_scale, state_ds->bias); + bool po_enabled = true; + if (_sg_fequal(state_ds->bias, 0.0f, 0.000001f) && + _sg_fequal(state_ds->bias_slope_scale, 0.0f, 0.000001f)) + { + po_enabled = false; + } + if (po_enabled != _sg.gl.cache.polygon_offset_enabled) { + _sg.gl.cache.polygon_offset_enabled = po_enabled; + if (po_enabled) { + glEnable(GL_POLYGON_OFFSET_FILL); + } + else { + glDisable(GL_POLYGON_OFFSET_FILL); + } + } + } + } + + /* update stencil state */ + { + const sg_stencil_state* state_ss = &pip->gl.stencil; + sg_stencil_state* cache_ss = &_sg.gl.cache.stencil; + if (state_ss->enabled != cache_ss->enabled) { + cache_ss->enabled = state_ss->enabled; + if (state_ss->enabled) { + glEnable(GL_STENCIL_TEST); + } + else { + glDisable(GL_STENCIL_TEST); + } + } + if (state_ss->write_mask != cache_ss->write_mask) { + cache_ss->write_mask = state_ss->write_mask; + glStencilMask(state_ss->write_mask); + } + for (int i = 0; i < 2; i++) { + const sg_stencil_face_state* state_sfs = (i==0)? &state_ss->front : &state_ss->back; + sg_stencil_face_state* cache_sfs = (i==0)? &cache_ss->front : &cache_ss->back; + GLenum gl_face = (i==0)? GL_FRONT : GL_BACK; + if ((state_sfs->compare != cache_sfs->compare) || + (state_ss->read_mask != cache_ss->read_mask) || + (state_ss->ref != cache_ss->ref)) + { + cache_sfs->compare = state_sfs->compare; + glStencilFuncSeparate(gl_face, + _sg_gl_compare_func(state_sfs->compare), + state_ss->ref, + state_ss->read_mask); + } + if ((state_sfs->fail_op != cache_sfs->fail_op) || + (state_sfs->depth_fail_op != cache_sfs->depth_fail_op) || + (state_sfs->pass_op != cache_sfs->pass_op)) + { + cache_sfs->fail_op = state_sfs->fail_op; + cache_sfs->depth_fail_op = state_sfs->depth_fail_op; + cache_sfs->pass_op = state_sfs->pass_op; + glStencilOpSeparate(gl_face, + _sg_gl_stencil_op(state_sfs->fail_op), + _sg_gl_stencil_op(state_sfs->depth_fail_op), + _sg_gl_stencil_op(state_sfs->pass_op)); + } + } + cache_ss->read_mask = state_ss->read_mask; + cache_ss->ref = state_ss->ref; + } + + /* update blend state + FIXME: separate blend state per color attachment not support, needs GL4 + */ + { + const sg_blend_state* state_bs = &pip->gl.blend; + sg_blend_state* cache_bs = &_sg.gl.cache.blend; + if (state_bs->enabled != cache_bs->enabled) { + cache_bs->enabled = state_bs->enabled; + if (state_bs->enabled) { + glEnable(GL_BLEND); + } + else { + glDisable(GL_BLEND); + } + } + if ((state_bs->src_factor_rgb != cache_bs->src_factor_rgb) || + (state_bs->dst_factor_rgb != cache_bs->dst_factor_rgb) || + (state_bs->src_factor_alpha != cache_bs->src_factor_alpha) || + (state_bs->dst_factor_alpha != cache_bs->dst_factor_alpha)) + { + cache_bs->src_factor_rgb = state_bs->src_factor_rgb; + cache_bs->dst_factor_rgb = state_bs->dst_factor_rgb; + cache_bs->src_factor_alpha = state_bs->src_factor_alpha; + cache_bs->dst_factor_alpha = state_bs->dst_factor_alpha; + glBlendFuncSeparate(_sg_gl_blend_factor(state_bs->src_factor_rgb), + _sg_gl_blend_factor(state_bs->dst_factor_rgb), + _sg_gl_blend_factor(state_bs->src_factor_alpha), + _sg_gl_blend_factor(state_bs->dst_factor_alpha)); + } + if ((state_bs->op_rgb != cache_bs->op_rgb) || (state_bs->op_alpha != cache_bs->op_alpha)) { + cache_bs->op_rgb = state_bs->op_rgb; + cache_bs->op_alpha = state_bs->op_alpha; + glBlendEquationSeparate(_sg_gl_blend_op(state_bs->op_rgb), _sg_gl_blend_op(state_bs->op_alpha)); + } + } + + /* standalone state */ + for (GLuint i = 0; i < (GLuint)pip->cmn.color_attachment_count; i++) { + if (pip->gl.color_write_mask[i] != _sg.gl.cache.color_write_mask[i]) { + const sg_color_mask cm = pip->gl.color_write_mask[i]; + _sg.gl.cache.color_write_mask[i] = cm; + #ifdef SOKOL_GLCORE33 + glColorMaski(i, + (cm & SG_COLORMASK_R) != 0, + (cm & SG_COLORMASK_G) != 0, + (cm & SG_COLORMASK_B) != 0, + (cm & SG_COLORMASK_A) != 0); + #else + if (0 == i) { + glColorMask((cm & SG_COLORMASK_R) != 0, + (cm & SG_COLORMASK_G) != 0, + (cm & SG_COLORMASK_B) != 0, + (cm & SG_COLORMASK_A) != 0); + } + #endif + } + } + + if (!_sg_fequal(pip->cmn.blend_color.r, _sg.gl.cache.blend_color.r, 0.0001f) || + !_sg_fequal(pip->cmn.blend_color.g, _sg.gl.cache.blend_color.g, 0.0001f) || + !_sg_fequal(pip->cmn.blend_color.b, _sg.gl.cache.blend_color.b, 0.0001f) || + !_sg_fequal(pip->cmn.blend_color.a, _sg.gl.cache.blend_color.a, 0.0001f)) + { + sg_color c = pip->cmn.blend_color; + _sg.gl.cache.blend_color = c; + glBlendColor(c.r, c.g, c.b, c.a); + } + if (pip->gl.cull_mode != _sg.gl.cache.cull_mode) { + _sg.gl.cache.cull_mode = pip->gl.cull_mode; + if (SG_CULLMODE_NONE == pip->gl.cull_mode) { + glDisable(GL_CULL_FACE); + } + else { + glEnable(GL_CULL_FACE); + GLenum gl_mode = (SG_CULLMODE_FRONT == pip->gl.cull_mode) ? GL_FRONT : GL_BACK; + glCullFace(gl_mode); + } + } + if (pip->gl.face_winding != _sg.gl.cache.face_winding) { + _sg.gl.cache.face_winding = pip->gl.face_winding; + GLenum gl_winding = (SG_FACEWINDING_CW == pip->gl.face_winding) ? GL_CW : GL_CCW; + glFrontFace(gl_winding); + } + if (pip->gl.alpha_to_coverage_enabled != _sg.gl.cache.alpha_to_coverage_enabled) { + _sg.gl.cache.alpha_to_coverage_enabled = pip->gl.alpha_to_coverage_enabled; + if (pip->gl.alpha_to_coverage_enabled) { + glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE); + } + else { + glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE); + } + } + #ifdef SOKOL_GLCORE33 + if (pip->gl.sample_count != _sg.gl.cache.sample_count) { + _sg.gl.cache.sample_count = pip->gl.sample_count; + if (pip->gl.sample_count > 1) { + glEnable(GL_MULTISAMPLE); + } + else { + glDisable(GL_MULTISAMPLE); + } + } + #endif + + /* bind shader program */ + if (pip->shader->gl.prog != _sg.gl.cache.prog) { + _sg.gl.cache.prog = pip->shader->gl.prog; + glUseProgram(pip->shader->gl.prog); + } + } + _SG_GL_CHECK_ERROR(); +} + +_SOKOL_PRIVATE void _sg_gl_apply_bindings( + _sg_pipeline_t* pip, + _sg_buffer_t** vbs, const int* vb_offsets, int num_vbs, + _sg_buffer_t* ib, int ib_offset, + _sg_image_t** vs_imgs, int num_vs_imgs, + _sg_image_t** fs_imgs, int num_fs_imgs) +{ + SOKOL_ASSERT(pip); + _SOKOL_UNUSED(num_fs_imgs); + _SOKOL_UNUSED(num_vs_imgs); + _SOKOL_UNUSED(num_vbs); + _SG_GL_CHECK_ERROR(); + + /* bind textures */ + _SG_GL_CHECK_ERROR(); + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + const _sg_shader_stage_t* stage = &pip->shader->cmn.stage[stage_index]; + const _sg_gl_shader_stage_t* gl_stage = &pip->shader->gl.stage[stage_index]; + _sg_image_t** imgs = (stage_index == SG_SHADERSTAGE_VS)? vs_imgs : fs_imgs; + SOKOL_ASSERT(((stage_index == SG_SHADERSTAGE_VS)? num_vs_imgs : num_fs_imgs) == stage->num_images); + for (int img_index = 0; img_index < stage->num_images; img_index++) { + const _sg_gl_shader_image_t* gl_shd_img = &gl_stage->images[img_index]; + if (gl_shd_img->gl_tex_slot != -1) { + _sg_image_t* img = imgs[img_index]; + const GLuint gl_tex = img->gl.tex[img->cmn.active_slot]; + SOKOL_ASSERT(img && img->gl.target); + SOKOL_ASSERT((gl_shd_img->gl_tex_slot != -1) && gl_tex); + _sg_gl_cache_bind_texture(gl_shd_img->gl_tex_slot, img->gl.target, gl_tex); + } + } + } + _SG_GL_CHECK_ERROR(); + + /* index buffer (can be 0) */ + const GLuint gl_ib = ib ? ib->gl.buf[ib->cmn.active_slot] : 0; + _sg_gl_cache_bind_buffer(GL_ELEMENT_ARRAY_BUFFER, gl_ib); + _sg.gl.cache.cur_ib_offset = ib_offset; + + /* vertex attributes */ + for (GLuint attr_index = 0; attr_index < (GLuint)_sg.limits.max_vertex_attrs; attr_index++) { + _sg_gl_attr_t* attr = &pip->gl.attrs[attr_index]; + _sg_gl_cache_attr_t* cache_attr = &_sg.gl.cache.attrs[attr_index]; + bool cache_attr_dirty = false; + int vb_offset = 0; + GLuint gl_vb = 0; + if (attr->vb_index >= 0) { + /* attribute is enabled */ + SOKOL_ASSERT(attr->vb_index < num_vbs); + _sg_buffer_t* vb = vbs[attr->vb_index]; + SOKOL_ASSERT(vb); + gl_vb = vb->gl.buf[vb->cmn.active_slot]; + vb_offset = vb_offsets[attr->vb_index] + attr->offset; + if ((gl_vb != cache_attr->gl_vbuf) || + (attr->size != cache_attr->gl_attr.size) || + (attr->type != cache_attr->gl_attr.type) || + (attr->normalized != cache_attr->gl_attr.normalized) || + (attr->stride != cache_attr->gl_attr.stride) || + (vb_offset != cache_attr->gl_attr.offset) || + (cache_attr->gl_attr.divisor != attr->divisor)) + { + _sg_gl_cache_bind_buffer(GL_ARRAY_BUFFER, gl_vb); + glVertexAttribPointer(attr_index, attr->size, attr->type, + attr->normalized, attr->stride, + (const GLvoid*)(GLintptr)vb_offset); + #if defined(_SOKOL_GL_INSTANCING_ENABLED) + if (_sg.features.instancing) { + glVertexAttribDivisor(attr_index, (GLuint)attr->divisor); + } + #endif + cache_attr_dirty = true; + } + if (cache_attr->gl_attr.vb_index == -1) { + glEnableVertexAttribArray(attr_index); + cache_attr_dirty = true; + } + } + else { + /* attribute is disabled */ + if (cache_attr->gl_attr.vb_index != -1) { + glDisableVertexAttribArray(attr_index); + cache_attr_dirty = true; + } + } + if (cache_attr_dirty) { + cache_attr->gl_attr = *attr; + cache_attr->gl_attr.offset = vb_offset; + cache_attr->gl_vbuf = gl_vb; + } + } + _SG_GL_CHECK_ERROR(); +} + +_SOKOL_PRIVATE void _sg_gl_apply_uniforms(sg_shader_stage stage_index, int ub_index, const sg_range* data) { + SOKOL_ASSERT(_sg.gl.cache.cur_pipeline); + SOKOL_ASSERT(_sg.gl.cache.cur_pipeline->slot.id == _sg.gl.cache.cur_pipeline_id.id); + SOKOL_ASSERT(_sg.gl.cache.cur_pipeline->shader->slot.id == _sg.gl.cache.cur_pipeline->cmn.shader_id.id); + SOKOL_ASSERT(_sg.gl.cache.cur_pipeline->shader->cmn.stage[stage_index].num_uniform_blocks > ub_index); + SOKOL_ASSERT(_sg.gl.cache.cur_pipeline->shader->cmn.stage[stage_index].uniform_blocks[ub_index].size == data->size); + const _sg_gl_shader_stage_t* gl_stage = &_sg.gl.cache.cur_pipeline->shader->gl.stage[stage_index]; + const _sg_gl_uniform_block_t* gl_ub = &gl_stage->uniform_blocks[ub_index]; + for (int u_index = 0; u_index < gl_ub->num_uniforms; u_index++) { + const _sg_gl_uniform_t* u = &gl_ub->uniforms[u_index]; + SOKOL_ASSERT(u->type != SG_UNIFORMTYPE_INVALID); + if (u->gl_loc == -1) { + continue; + } + GLfloat* fptr = (GLfloat*) (((uint8_t*)data->ptr) + u->offset); + GLint* iptr = (GLint*) (((uint8_t*)data->ptr) + u->offset); + switch (u->type) { + case SG_UNIFORMTYPE_INVALID: + break; + case SG_UNIFORMTYPE_FLOAT: + glUniform1fv(u->gl_loc, u->count, fptr); + break; + case SG_UNIFORMTYPE_FLOAT2: + glUniform2fv(u->gl_loc, u->count, fptr); + break; + case SG_UNIFORMTYPE_FLOAT3: + glUniform3fv(u->gl_loc, u->count, fptr); + break; + case SG_UNIFORMTYPE_FLOAT4: + glUniform4fv(u->gl_loc, u->count, fptr); + break; + case SG_UNIFORMTYPE_INT: + glUniform1iv(u->gl_loc, u->count, iptr); + break; + case SG_UNIFORMTYPE_INT2: + glUniform2iv(u->gl_loc, u->count, iptr); + break; + case SG_UNIFORMTYPE_INT3: + glUniform3iv(u->gl_loc, u->count, iptr); + break; + case SG_UNIFORMTYPE_INT4: + glUniform4iv(u->gl_loc, u->count, iptr); + break; + case SG_UNIFORMTYPE_MAT4: + glUniformMatrix4fv(u->gl_loc, u->count, GL_FALSE, fptr); + break; + default: + SOKOL_UNREACHABLE; + break; + } + } +} + +_SOKOL_PRIVATE void _sg_gl_draw(int base_element, int num_elements, int num_instances) { + SOKOL_ASSERT(_sg.gl.cache.cur_pipeline); + const GLenum i_type = _sg.gl.cache.cur_index_type; + const GLenum p_type = _sg.gl.cache.cur_primitive_type; + if (0 != i_type) { + /* indexed rendering */ + const int i_size = (i_type == GL_UNSIGNED_SHORT) ? 2 : 4; + const int ib_offset = _sg.gl.cache.cur_ib_offset; + const GLvoid* indices = (const GLvoid*)(GLintptr)(base_element*i_size+ib_offset); + if (_sg.gl.cache.cur_pipeline->cmn.use_instanced_draw) { + if (_sg.features.instancing) { + glDrawElementsInstanced(p_type, num_elements, i_type, indices, num_instances); + } + } + else { + glDrawElements(p_type, num_elements, i_type, indices); + } + } + else { + /* non-indexed rendering */ + if (_sg.gl.cache.cur_pipeline->cmn.use_instanced_draw) { + if (_sg.features.instancing) { + glDrawArraysInstanced(p_type, base_element, num_elements, num_instances); + } + } + else { + glDrawArrays(p_type, base_element, num_elements); + } + } +} + +_SOKOL_PRIVATE void _sg_gl_commit(void) { + SOKOL_ASSERT(!_sg.gl.in_pass); + /* "soft" clear bindings (only those that are actually bound) */ + _sg_gl_cache_clear_buffer_bindings(false); + _sg_gl_cache_clear_texture_bindings(false); +} + +_SOKOL_PRIVATE void _sg_gl_update_buffer(_sg_buffer_t* buf, const sg_range* data) { + SOKOL_ASSERT(buf && data && data->ptr && (data->size > 0)); + /* only one update per buffer per frame allowed */ + if (++buf->cmn.active_slot >= buf->cmn.num_slots) { + buf->cmn.active_slot = 0; + } + GLenum gl_tgt = _sg_gl_buffer_target(buf->cmn.type); + SOKOL_ASSERT(buf->cmn.active_slot < SG_NUM_INFLIGHT_FRAMES); + GLuint gl_buf = buf->gl.buf[buf->cmn.active_slot]; + SOKOL_ASSERT(gl_buf); + _SG_GL_CHECK_ERROR(); + _sg_gl_cache_store_buffer_binding(gl_tgt); + _sg_gl_cache_bind_buffer(gl_tgt, gl_buf); + glBufferSubData(gl_tgt, 0, (GLsizeiptr)data->size, data->ptr); + _sg_gl_cache_restore_buffer_binding(gl_tgt); + _SG_GL_CHECK_ERROR(); +} + +_SOKOL_PRIVATE int _sg_gl_append_buffer(_sg_buffer_t* buf, const sg_range* data, bool new_frame) { + SOKOL_ASSERT(buf && data && data->ptr && (data->size > 0)); + if (new_frame) { + if (++buf->cmn.active_slot >= buf->cmn.num_slots) { + buf->cmn.active_slot = 0; + } + } + GLenum gl_tgt = _sg_gl_buffer_target(buf->cmn.type); + SOKOL_ASSERT(buf->cmn.active_slot < SG_NUM_INFLIGHT_FRAMES); + GLuint gl_buf = buf->gl.buf[buf->cmn.active_slot]; + SOKOL_ASSERT(gl_buf); + _SG_GL_CHECK_ERROR(); + _sg_gl_cache_store_buffer_binding(gl_tgt); + _sg_gl_cache_bind_buffer(gl_tgt, gl_buf); + glBufferSubData(gl_tgt, buf->cmn.append_pos, (GLsizeiptr)data->size, data->ptr); + _sg_gl_cache_restore_buffer_binding(gl_tgt); + _SG_GL_CHECK_ERROR(); + /* NOTE: this is a requirement from WebGPU, but we want identical behaviour across all backend */ + return _sg_roundup((int)data->size, 4); +} + +_SOKOL_PRIVATE void _sg_gl_update_image(_sg_image_t* img, const sg_image_data* data) { + SOKOL_ASSERT(img && data); + /* only one update per image per frame allowed */ + if (++img->cmn.active_slot >= img->cmn.num_slots) { + img->cmn.active_slot = 0; + } + SOKOL_ASSERT(img->cmn.active_slot < SG_NUM_INFLIGHT_FRAMES); + SOKOL_ASSERT(0 != img->gl.tex[img->cmn.active_slot]); + _sg_gl_cache_store_texture_binding(0); + _sg_gl_cache_bind_texture(0, img->gl.target, img->gl.tex[img->cmn.active_slot]); + const GLenum gl_img_format = _sg_gl_teximage_format(img->cmn.pixel_format); + const GLenum gl_img_type = _sg_gl_teximage_type(img->cmn.pixel_format); + const int num_faces = img->cmn.type == SG_IMAGETYPE_CUBE ? 6 : 1; + const int num_mips = img->cmn.num_mipmaps; + for (int face_index = 0; face_index < num_faces; face_index++) { + for (int mip_index = 0; mip_index < num_mips; mip_index++) { + GLenum gl_img_target = img->gl.target; + if (SG_IMAGETYPE_CUBE == img->cmn.type) { + gl_img_target = _sg_gl_cubeface_target(face_index); + } + const GLvoid* data_ptr = data->subimage[face_index][mip_index].ptr; + int mip_width = img->cmn.width >> mip_index; + if (mip_width == 0) { + mip_width = 1; + } + int mip_height = img->cmn.height >> mip_index; + if (mip_height == 0) { + mip_height = 1; + } + if ((SG_IMAGETYPE_2D == img->cmn.type) || (SG_IMAGETYPE_CUBE == img->cmn.type)) { + glTexSubImage2D(gl_img_target, mip_index, + 0, 0, + mip_width, mip_height, + gl_img_format, gl_img_type, + data_ptr); + } + #if !defined(SOKOL_GLES2) + else if (!_sg.gl.gles2 && ((SG_IMAGETYPE_3D == img->cmn.type) || (SG_IMAGETYPE_ARRAY == img->cmn.type))) { + int mip_depth = img->cmn.num_slices >> mip_index; + if (mip_depth == 0) { + mip_depth = 1; + } + glTexSubImage3D(gl_img_target, mip_index, + 0, 0, 0, + mip_width, mip_height, mip_depth, + gl_img_format, gl_img_type, + data_ptr); + + } + #endif + } + } + _sg_gl_cache_restore_texture_binding(0); +} + +/*== D3D11 BACKEND IMPLEMENTATION ============================================*/ +#elif defined(SOKOL_D3D11) + +#if defined(__cplusplus) +#define _sg_d3d11_AddRef(self) (self)->AddRef() +#else +#define _sg_d3d11_AddRef(self) (self)->lpVtbl->AddRef(self) +#endif + +#if defined(__cplusplus) +#define _sg_d3d11_Release(self) (self)->Release() +#else +#define _sg_d3d11_Release(self) (self)->lpVtbl->Release(self) +#endif + +/*-- D3D11 C/C++ wrappers ----------------------------------------------------*/ +static inline HRESULT _sg_d3d11_CheckFormatSupport(ID3D11Device* self, DXGI_FORMAT Format, UINT* pFormatSupport) { + #if defined(__cplusplus) + return self->CheckFormatSupport(Format, pFormatSupport); + #else + return self->lpVtbl->CheckFormatSupport(self, Format, pFormatSupport); + #endif +} + +static inline void _sg_d3d11_OMSetRenderTargets(ID3D11DeviceContext* self, UINT NumViews, ID3D11RenderTargetView* const* ppRenderTargetViews, ID3D11DepthStencilView *pDepthStencilView) { + #if defined(__cplusplus) + self->OMSetRenderTargets(NumViews, ppRenderTargetViews, pDepthStencilView); + #else + self->lpVtbl->OMSetRenderTargets(self, NumViews, ppRenderTargetViews, pDepthStencilView); + #endif +} + +static inline void _sg_d3d11_RSSetState(ID3D11DeviceContext* self, ID3D11RasterizerState* pRasterizerState) { + #if defined(__cplusplus) + self->RSSetState(pRasterizerState); + #else + self->lpVtbl->RSSetState(self, pRasterizerState); + #endif +} + +static inline void _sg_d3d11_OMSetDepthStencilState(ID3D11DeviceContext* self, ID3D11DepthStencilState* pDepthStencilState, UINT StencilRef) { + #if defined(__cplusplus) + self->OMSetDepthStencilState(pDepthStencilState, StencilRef); + #else + self->lpVtbl->OMSetDepthStencilState(self, pDepthStencilState, StencilRef); + #endif +} + +static inline void _sg_d3d11_OMSetBlendState(ID3D11DeviceContext* self, ID3D11BlendState* pBlendState, const FLOAT BlendFactor[4], UINT SampleMask) { + #if defined(__cplusplus) + self->OMSetBlendState(pBlendState, BlendFactor, SampleMask); + #else + self->lpVtbl->OMSetBlendState(self, pBlendState, BlendFactor, SampleMask); + #endif +} + +static inline void _sg_d3d11_IASetVertexBuffers(ID3D11DeviceContext* self, UINT StartSlot, UINT NumBuffers, ID3D11Buffer* const* ppVertexBuffers, const UINT* pStrides, const UINT* pOffsets) { + #if defined(__cplusplus) + self->IASetVertexBuffers(StartSlot, NumBuffers, ppVertexBuffers, pStrides, pOffsets); + #else + self->lpVtbl->IASetVertexBuffers(self, StartSlot, NumBuffers, ppVertexBuffers, pStrides, pOffsets); + #endif +} + +static inline void _sg_d3d11_IASetIndexBuffer(ID3D11DeviceContext* self, ID3D11Buffer* pIndexBuffer, DXGI_FORMAT Format, UINT Offset) { + #if defined(__cplusplus) + self->IASetIndexBuffer(pIndexBuffer, Format, Offset); + #else + self->lpVtbl->IASetIndexBuffer(self, pIndexBuffer, Format, Offset); + #endif +} + +static inline void _sg_d3d11_IASetInputLayout(ID3D11DeviceContext* self, ID3D11InputLayout* pInputLayout) { + #if defined(__cplusplus) + self->IASetInputLayout(pInputLayout); + #else + self->lpVtbl->IASetInputLayout(self, pInputLayout); + #endif +} + +static inline void _sg_d3d11_VSSetShader(ID3D11DeviceContext* self, ID3D11VertexShader* pVertexShader, ID3D11ClassInstance* const* ppClassInstances, UINT NumClassInstances) { + #if defined(__cplusplus) + self->VSSetShader(pVertexShader, ppClassInstances, NumClassInstances); + #else + self->lpVtbl->VSSetShader(self, pVertexShader, ppClassInstances, NumClassInstances); + #endif +} + +static inline void _sg_d3d11_PSSetShader(ID3D11DeviceContext* self, ID3D11PixelShader* pPixelShader, ID3D11ClassInstance* const* ppClassInstances, UINT NumClassInstances) { + #if defined(__cplusplus) + self->PSSetShader(pPixelShader, ppClassInstances, NumClassInstances); + #else + self->lpVtbl->PSSetShader(self, pPixelShader, ppClassInstances, NumClassInstances); + #endif +} + +static inline void _sg_d3d11_VSSetConstantBuffers(ID3D11DeviceContext* self, UINT StartSlot, UINT NumBuffers, ID3D11Buffer* const* ppConstantBuffers) { + #if defined(__cplusplus) + self->VSSetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers); + #else + self->lpVtbl->VSSetConstantBuffers(self, StartSlot, NumBuffers, ppConstantBuffers); + #endif +} + +static inline void _sg_d3d11_PSSetConstantBuffers(ID3D11DeviceContext* self, UINT StartSlot, UINT NumBuffers, ID3D11Buffer* const* ppConstantBuffers) { + #if defined(__cplusplus) + self->PSSetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers); + #else + self->lpVtbl->PSSetConstantBuffers(self, StartSlot, NumBuffers, ppConstantBuffers); + #endif +} + +static inline void _sg_d3d11_VSSetShaderResources(ID3D11DeviceContext* self, UINT StartSlot, UINT NumViews, ID3D11ShaderResourceView* const* ppShaderResourceViews) { + #if defined(__cplusplus) + self->VSSetShaderResources(StartSlot, NumViews, ppShaderResourceViews); + #else + self->lpVtbl->VSSetShaderResources(self, StartSlot, NumViews, ppShaderResourceViews); + #endif +} + +static inline void _sg_d3d11_PSSetShaderResources(ID3D11DeviceContext* self, UINT StartSlot, UINT NumViews, ID3D11ShaderResourceView* const* ppShaderResourceViews) { + #if defined(__cplusplus) + self->PSSetShaderResources(StartSlot, NumViews, ppShaderResourceViews); + #else + self->lpVtbl->PSSetShaderResources(self, StartSlot, NumViews, ppShaderResourceViews); + #endif +} + +static inline void _sg_d3d11_VSSetSamplers(ID3D11DeviceContext* self, UINT StartSlot, UINT NumSamplers, ID3D11SamplerState* const* ppSamplers) { + #if defined(__cplusplus) + self->VSSetSamplers(StartSlot, NumSamplers, ppSamplers); + #else + self->lpVtbl->VSSetSamplers(self, StartSlot, NumSamplers, ppSamplers); + #endif +} + +static inline void _sg_d3d11_PSSetSamplers(ID3D11DeviceContext* self, UINT StartSlot, UINT NumSamplers, ID3D11SamplerState* const* ppSamplers) { + #if defined(__cplusplus) + self->PSSetSamplers(StartSlot, NumSamplers, ppSamplers); + #else + self->lpVtbl->PSSetSamplers(self, StartSlot, NumSamplers, ppSamplers); + #endif +} + +static inline HRESULT _sg_d3d11_CreateBuffer(ID3D11Device* self, const D3D11_BUFFER_DESC* pDesc, const D3D11_SUBRESOURCE_DATA* pInitialData, ID3D11Buffer** ppBuffer) { + #if defined(__cplusplus) + return self->CreateBuffer(pDesc, pInitialData, ppBuffer); + #else + return self->lpVtbl->CreateBuffer(self, pDesc, pInitialData, ppBuffer); + #endif +} + +static inline HRESULT _sg_d3d11_CreateTexture2D(ID3D11Device* self, const D3D11_TEXTURE2D_DESC* pDesc, const D3D11_SUBRESOURCE_DATA* pInitialData, ID3D11Texture2D** ppTexture2D) { + #if defined(__cplusplus) + return self->CreateTexture2D(pDesc, pInitialData, ppTexture2D); + #else + return self->lpVtbl->CreateTexture2D(self, pDesc, pInitialData, ppTexture2D); + #endif +} + +static inline HRESULT _sg_d3d11_CreateShaderResourceView(ID3D11Device* self, ID3D11Resource* pResource, const D3D11_SHADER_RESOURCE_VIEW_DESC* pDesc, ID3D11ShaderResourceView** ppSRView) { + #if defined(__cplusplus) + return self->CreateShaderResourceView(pResource, pDesc, ppSRView); + #else + return self->lpVtbl->CreateShaderResourceView(self, pResource, pDesc, ppSRView); + #endif +} + +static inline void _sg_d3d11_GetResource(ID3D11View* self, ID3D11Resource** ppResource) { + #if defined(__cplusplus) + self->GetResource(ppResource); + #else + self->lpVtbl->GetResource(self, ppResource); + #endif +} + +static inline HRESULT _sg_d3d11_CreateTexture3D(ID3D11Device* self, const D3D11_TEXTURE3D_DESC* pDesc, const D3D11_SUBRESOURCE_DATA* pInitialData, ID3D11Texture3D** ppTexture3D) { + #if defined(__cplusplus) + return self->CreateTexture3D(pDesc, pInitialData, ppTexture3D); + #else + return self->lpVtbl->CreateTexture3D(self, pDesc, pInitialData, ppTexture3D); + #endif +} + +static inline HRESULT _sg_d3d11_CreateSamplerState(ID3D11Device* self, const D3D11_SAMPLER_DESC* pSamplerDesc, ID3D11SamplerState** ppSamplerState) { + #if defined(__cplusplus) + return self->CreateSamplerState(pSamplerDesc, ppSamplerState); + #else + return self->lpVtbl->CreateSamplerState(self, pSamplerDesc, ppSamplerState); + #endif +} + +static inline LPVOID _sg_d3d11_GetBufferPointer(ID3D10Blob* self) { + #if defined(__cplusplus) + return self->GetBufferPointer(); + #else + return self->lpVtbl->GetBufferPointer(self); + #endif +} + +static inline SIZE_T _sg_d3d11_GetBufferSize(ID3D10Blob* self) { + #if defined(__cplusplus) + return self->GetBufferSize(); + #else + return self->lpVtbl->GetBufferSize(self); + #endif +} + +static inline HRESULT _sg_d3d11_CreateVertexShader(ID3D11Device* self, const void* pShaderBytecode, SIZE_T BytecodeLength, ID3D11ClassLinkage* pClassLinkage, ID3D11VertexShader** ppVertexShader) { + #if defined(__cplusplus) + return self->CreateVertexShader(pShaderBytecode, BytecodeLength, pClassLinkage, ppVertexShader); + #else + return self->lpVtbl->CreateVertexShader(self, pShaderBytecode, BytecodeLength, pClassLinkage, ppVertexShader); + #endif +} + +static inline HRESULT _sg_d3d11_CreatePixelShader(ID3D11Device* self, const void* pShaderBytecode, SIZE_T BytecodeLength, ID3D11ClassLinkage* pClassLinkage, ID3D11PixelShader** ppPixelShader) { + #if defined(__cplusplus) + return self->CreatePixelShader(pShaderBytecode, BytecodeLength, pClassLinkage, ppPixelShader); + #else + return self->lpVtbl->CreatePixelShader(self, pShaderBytecode, BytecodeLength, pClassLinkage, ppPixelShader); + #endif +} + +static inline HRESULT _sg_d3d11_CreateInputLayout(ID3D11Device* self, const D3D11_INPUT_ELEMENT_DESC* pInputElementDescs, UINT NumElements, const void* pShaderBytecodeWithInputSignature, SIZE_T BytecodeLength, ID3D11InputLayout **ppInputLayout) { + #if defined(__cplusplus) + return self->CreateInputLayout(pInputElementDescs, NumElements, pShaderBytecodeWithInputSignature, BytecodeLength, ppInputLayout); + #else + return self->lpVtbl->CreateInputLayout(self, pInputElementDescs, NumElements, pShaderBytecodeWithInputSignature, BytecodeLength, ppInputLayout); + #endif +} + +static inline HRESULT _sg_d3d11_CreateRasterizerState(ID3D11Device* self, const D3D11_RASTERIZER_DESC* pRasterizerDesc, ID3D11RasterizerState** ppRasterizerState) { + #if defined(__cplusplus) + return self->CreateRasterizerState(pRasterizerDesc, ppRasterizerState); + #else + return self->lpVtbl->CreateRasterizerState(self, pRasterizerDesc, ppRasterizerState); + #endif +} + +static inline HRESULT _sg_d3d11_CreateDepthStencilState(ID3D11Device* self, const D3D11_DEPTH_STENCIL_DESC* pDepthStencilDesc, ID3D11DepthStencilState** ppDepthStencilState) { + #if defined(__cplusplus) + return self->CreateDepthStencilState(pDepthStencilDesc, ppDepthStencilState); + #else + return self->lpVtbl->CreateDepthStencilState(self, pDepthStencilDesc, ppDepthStencilState); + #endif +} + +static inline HRESULT _sg_d3d11_CreateBlendState(ID3D11Device* self, const D3D11_BLEND_DESC* pBlendStateDesc, ID3D11BlendState** ppBlendState) { + #if defined(__cplusplus) + return self->CreateBlendState(pBlendStateDesc, ppBlendState); + #else + return self->lpVtbl->CreateBlendState(self, pBlendStateDesc, ppBlendState); + #endif +} + +static inline HRESULT _sg_d3d11_CreateRenderTargetView(ID3D11Device* self, ID3D11Resource *pResource, const D3D11_RENDER_TARGET_VIEW_DESC* pDesc, ID3D11RenderTargetView** ppRTView) { + #if defined(__cplusplus) + return self->CreateRenderTargetView(pResource, pDesc, ppRTView); + #else + return self->lpVtbl->CreateRenderTargetView(self, pResource, pDesc, ppRTView); + #endif +} + +static inline HRESULT _sg_d3d11_CreateDepthStencilView(ID3D11Device* self, ID3D11Resource* pResource, const D3D11_DEPTH_STENCIL_VIEW_DESC* pDesc, ID3D11DepthStencilView** ppDepthStencilView) { + #if defined(__cplusplus) + return self->CreateDepthStencilView(pResource, pDesc, ppDepthStencilView); + #else + return self->lpVtbl->CreateDepthStencilView(self, pResource, pDesc, ppDepthStencilView); + #endif +} + +static inline void _sg_d3d11_RSSetViewports(ID3D11DeviceContext* self, UINT NumViewports, const D3D11_VIEWPORT* pViewports) { + #if defined(__cplusplus) + self->RSSetViewports(NumViewports, pViewports); + #else + self->lpVtbl->RSSetViewports(self, NumViewports, pViewports); + #endif +} + +static inline void _sg_d3d11_RSSetScissorRects(ID3D11DeviceContext* self, UINT NumRects, const D3D11_RECT* pRects) { + #if defined(__cplusplus) + self->RSSetScissorRects(NumRects, pRects); + #else + self->lpVtbl->RSSetScissorRects(self, NumRects, pRects); + #endif +} + +static inline void _sg_d3d11_ClearRenderTargetView(ID3D11DeviceContext* self, ID3D11RenderTargetView* pRenderTargetView, const FLOAT ColorRGBA[4]) { + #if defined(__cplusplus) + self->ClearRenderTargetView(pRenderTargetView, ColorRGBA); + #else + self->lpVtbl->ClearRenderTargetView(self, pRenderTargetView, ColorRGBA); + #endif +} + +static inline void _sg_d3d11_ClearDepthStencilView(ID3D11DeviceContext* self, ID3D11DepthStencilView* pDepthStencilView, UINT ClearFlags, FLOAT Depth, UINT8 Stencil) { + #if defined(__cplusplus) + self->ClearDepthStencilView(pDepthStencilView, ClearFlags, Depth, Stencil); + #else + self->lpVtbl->ClearDepthStencilView(self, pDepthStencilView, ClearFlags, Depth, Stencil); + #endif +} + +static inline void _sg_d3d11_ResolveSubresource(ID3D11DeviceContext* self, ID3D11Resource* pDstResource, UINT DstSubresource, ID3D11Resource* pSrcResource, UINT SrcSubresource, DXGI_FORMAT Format) { + #if defined(__cplusplus) + self->ResolveSubresource(pDstResource, DstSubresource, pSrcResource, SrcSubresource, Format); + #else + self->lpVtbl->ResolveSubresource(self, pDstResource, DstSubresource, pSrcResource, SrcSubresource, Format); + #endif +} + +static inline void _sg_d3d11_IASetPrimitiveTopology(ID3D11DeviceContext* self, D3D11_PRIMITIVE_TOPOLOGY Topology) { + #if defined(__cplusplus) + self->IASetPrimitiveTopology(Topology); + #else + self->lpVtbl->IASetPrimitiveTopology(self, Topology); + #endif +} + +static inline void _sg_d3d11_UpdateSubresource(ID3D11DeviceContext* self, ID3D11Resource* pDstResource, UINT DstSubresource, const D3D11_BOX* pDstBox, const void* pSrcData, UINT SrcRowPitch, UINT SrcDepthPitch) { + #if defined(__cplusplus) + self->UpdateSubresource(pDstResource, DstSubresource, pDstBox, pSrcData, SrcRowPitch, SrcDepthPitch); + #else + self->lpVtbl->UpdateSubresource(self, pDstResource, DstSubresource, pDstBox, pSrcData, SrcRowPitch, SrcDepthPitch); + #endif +} + +static inline void _sg_d3d11_DrawIndexed(ID3D11DeviceContext* self, UINT IndexCount, UINT StartIndexLocation, INT BaseVertexLocation) { + #if defined(__cplusplus) + self->DrawIndexed(IndexCount, StartIndexLocation, BaseVertexLocation); + #else + self->lpVtbl->DrawIndexed(self, IndexCount, StartIndexLocation, BaseVertexLocation); + #endif +} + +static inline void _sg_d3d11_DrawIndexedInstanced(ID3D11DeviceContext* self, UINT IndexCountPerInstance, UINT InstanceCount, UINT StartIndexLocation, INT BaseVertexLocation, UINT StartInstanceLocation) { + #if defined(__cplusplus) + self->DrawIndexedInstanced(IndexCountPerInstance, InstanceCount, StartIndexLocation, BaseVertexLocation, StartInstanceLocation); + #else + self->lpVtbl->DrawIndexedInstanced(self, IndexCountPerInstance, InstanceCount, StartIndexLocation, BaseVertexLocation, StartInstanceLocation); + #endif +} + +static inline void _sg_d3d11_Draw(ID3D11DeviceContext* self, UINT VertexCount, UINT StartVertexLocation) { + #if defined(__cplusplus) + self->Draw(VertexCount, StartVertexLocation); + #else + self->lpVtbl->Draw(self, VertexCount, StartVertexLocation); + #endif +} + +static inline void _sg_d3d11_DrawInstanced(ID3D11DeviceContext* self, UINT VertexCountPerInstance, UINT InstanceCount, UINT StartVertexLocation, UINT StartInstanceLocation) { + #if defined(__cplusplus) + self->DrawInstanced(VertexCountPerInstance, InstanceCount, StartVertexLocation, StartInstanceLocation); + #else + self->lpVtbl->DrawInstanced(self, VertexCountPerInstance, InstanceCount, StartVertexLocation, StartInstanceLocation); + #endif +} + +static inline HRESULT _sg_d3d11_Map(ID3D11DeviceContext* self, ID3D11Resource* pResource, UINT Subresource, D3D11_MAP MapType, UINT MapFlags, D3D11_MAPPED_SUBRESOURCE* pMappedResource) { + #if defined(__cplusplus) + return self->Map(pResource, Subresource, MapType, MapFlags, pMappedResource); + #else + return self->lpVtbl->Map(self, pResource, Subresource, MapType, MapFlags, pMappedResource); + #endif +} + +static inline void _sg_d3d11_Unmap(ID3D11DeviceContext* self, ID3D11Resource* pResource, UINT Subresource) { + #if defined(__cplusplus) + self->Unmap(pResource, Subresource); + #else + self->lpVtbl->Unmap(self, pResource, Subresource); + #endif +} + +static inline void _sg_d3d11_ClearState(ID3D11DeviceContext* self) { + #if defined(__cplusplus) + self->ClearState(); + #else + self->lpVtbl->ClearState(self); + #endif +} + +/*-- enum translation functions ----------------------------------------------*/ +_SOKOL_PRIVATE D3D11_USAGE _sg_d3d11_usage(sg_usage usg) { + switch (usg) { + case SG_USAGE_IMMUTABLE: + return D3D11_USAGE_IMMUTABLE; + case SG_USAGE_DYNAMIC: + case SG_USAGE_STREAM: + return D3D11_USAGE_DYNAMIC; + default: + SOKOL_UNREACHABLE; + return (D3D11_USAGE) 0; + } +} + +_SOKOL_PRIVATE UINT _sg_d3d11_cpu_access_flags(sg_usage usg) { + switch (usg) { + case SG_USAGE_IMMUTABLE: + return 0; + case SG_USAGE_DYNAMIC: + case SG_USAGE_STREAM: + return D3D11_CPU_ACCESS_WRITE; + default: + SOKOL_UNREACHABLE; + return 0; + } +} + +_SOKOL_PRIVATE DXGI_FORMAT _sg_d3d11_pixel_format(sg_pixel_format fmt) { + switch (fmt) { + case SG_PIXELFORMAT_R8: return DXGI_FORMAT_R8_UNORM; + case SG_PIXELFORMAT_R8SN: return DXGI_FORMAT_R8_SNORM; + case SG_PIXELFORMAT_R8UI: return DXGI_FORMAT_R8_UINT; + case SG_PIXELFORMAT_R8SI: return DXGI_FORMAT_R8_SINT; + case SG_PIXELFORMAT_R16: return DXGI_FORMAT_R16_UNORM; + case SG_PIXELFORMAT_R16SN: return DXGI_FORMAT_R16_SNORM; + case SG_PIXELFORMAT_R16UI: return DXGI_FORMAT_R16_UINT; + case SG_PIXELFORMAT_R16SI: return DXGI_FORMAT_R16_SINT; + case SG_PIXELFORMAT_R16F: return DXGI_FORMAT_R16_FLOAT; + case SG_PIXELFORMAT_RG8: return DXGI_FORMAT_R8G8_UNORM; + case SG_PIXELFORMAT_RG8SN: return DXGI_FORMAT_R8G8_SNORM; + case SG_PIXELFORMAT_RG8UI: return DXGI_FORMAT_R8G8_UINT; + case SG_PIXELFORMAT_RG8SI: return DXGI_FORMAT_R8G8_SINT; + case SG_PIXELFORMAT_R32UI: return DXGI_FORMAT_R32_UINT; + case SG_PIXELFORMAT_R32SI: return DXGI_FORMAT_R32_SINT; + case SG_PIXELFORMAT_R32F: return DXGI_FORMAT_R32_FLOAT; + case SG_PIXELFORMAT_RG16: return DXGI_FORMAT_R16G16_UNORM; + case SG_PIXELFORMAT_RG16SN: return DXGI_FORMAT_R16G16_SNORM; + case SG_PIXELFORMAT_RG16UI: return DXGI_FORMAT_R16G16_UINT; + case SG_PIXELFORMAT_RG16SI: return DXGI_FORMAT_R16G16_SINT; + case SG_PIXELFORMAT_RG16F: return DXGI_FORMAT_R16G16_FLOAT; + case SG_PIXELFORMAT_RGBA8: return DXGI_FORMAT_R8G8B8A8_UNORM; + case SG_PIXELFORMAT_RGBA8SN: return DXGI_FORMAT_R8G8B8A8_SNORM; + case SG_PIXELFORMAT_RGBA8UI: return DXGI_FORMAT_R8G8B8A8_UINT; + case SG_PIXELFORMAT_RGBA8SI: return DXGI_FORMAT_R8G8B8A8_SINT; + case SG_PIXELFORMAT_BGRA8: return DXGI_FORMAT_B8G8R8A8_UNORM; + case SG_PIXELFORMAT_RGB10A2: return DXGI_FORMAT_R10G10B10A2_UNORM; + case SG_PIXELFORMAT_RG11B10F: return DXGI_FORMAT_R11G11B10_FLOAT; + case SG_PIXELFORMAT_RG32UI: return DXGI_FORMAT_R32G32_UINT; + case SG_PIXELFORMAT_RG32SI: return DXGI_FORMAT_R32G32_SINT; + case SG_PIXELFORMAT_RG32F: return DXGI_FORMAT_R32G32_FLOAT; + case SG_PIXELFORMAT_RGBA16: return DXGI_FORMAT_R16G16B16A16_UNORM; + case SG_PIXELFORMAT_RGBA16SN: return DXGI_FORMAT_R16G16B16A16_SNORM; + case SG_PIXELFORMAT_RGBA16UI: return DXGI_FORMAT_R16G16B16A16_UINT; + case SG_PIXELFORMAT_RGBA16SI: return DXGI_FORMAT_R16G16B16A16_SINT; + case SG_PIXELFORMAT_RGBA16F: return DXGI_FORMAT_R16G16B16A16_FLOAT; + case SG_PIXELFORMAT_RGBA32UI: return DXGI_FORMAT_R32G32B32A32_UINT; + case SG_PIXELFORMAT_RGBA32SI: return DXGI_FORMAT_R32G32B32A32_SINT; + case SG_PIXELFORMAT_RGBA32F: return DXGI_FORMAT_R32G32B32A32_FLOAT; + case SG_PIXELFORMAT_DEPTH: return DXGI_FORMAT_D32_FLOAT; + case SG_PIXELFORMAT_DEPTH_STENCIL: return DXGI_FORMAT_D24_UNORM_S8_UINT; + case SG_PIXELFORMAT_BC1_RGBA: return DXGI_FORMAT_BC1_UNORM; + case SG_PIXELFORMAT_BC2_RGBA: return DXGI_FORMAT_BC2_UNORM; + case SG_PIXELFORMAT_BC3_RGBA: return DXGI_FORMAT_BC3_UNORM; + case SG_PIXELFORMAT_BC4_R: return DXGI_FORMAT_BC4_UNORM; + case SG_PIXELFORMAT_BC4_RSN: return DXGI_FORMAT_BC4_SNORM; + case SG_PIXELFORMAT_BC5_RG: return DXGI_FORMAT_BC5_UNORM; + case SG_PIXELFORMAT_BC5_RGSN: return DXGI_FORMAT_BC5_SNORM; + case SG_PIXELFORMAT_BC6H_RGBF: return DXGI_FORMAT_BC6H_SF16; + case SG_PIXELFORMAT_BC6H_RGBUF: return DXGI_FORMAT_BC6H_UF16; + case SG_PIXELFORMAT_BC7_RGBA: return DXGI_FORMAT_BC7_UNORM; + default: return DXGI_FORMAT_UNKNOWN; + }; +} + +_SOKOL_PRIVATE D3D11_PRIMITIVE_TOPOLOGY _sg_d3d11_primitive_topology(sg_primitive_type prim_type) { + switch (prim_type) { + case SG_PRIMITIVETYPE_POINTS: return D3D11_PRIMITIVE_TOPOLOGY_POINTLIST; + case SG_PRIMITIVETYPE_LINES: return D3D11_PRIMITIVE_TOPOLOGY_LINELIST; + case SG_PRIMITIVETYPE_LINE_STRIP: return D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP; + case SG_PRIMITIVETYPE_TRIANGLES: return D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST; + case SG_PRIMITIVETYPE_TRIANGLE_STRIP: return D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP; + default: SOKOL_UNREACHABLE; return (D3D11_PRIMITIVE_TOPOLOGY) 0; + } +} + +_SOKOL_PRIVATE DXGI_FORMAT _sg_d3d11_index_format(sg_index_type index_type) { + switch (index_type) { + case SG_INDEXTYPE_NONE: return DXGI_FORMAT_UNKNOWN; + case SG_INDEXTYPE_UINT16: return DXGI_FORMAT_R16_UINT; + case SG_INDEXTYPE_UINT32: return DXGI_FORMAT_R32_UINT; + default: SOKOL_UNREACHABLE; return (DXGI_FORMAT) 0; + } +} + +_SOKOL_PRIVATE D3D11_FILTER _sg_d3d11_filter(sg_filter min_f, sg_filter mag_f, uint32_t max_anisotropy) { + if (max_anisotropy > 1) { + return D3D11_FILTER_ANISOTROPIC; + } + else if (mag_f == SG_FILTER_NEAREST) { + switch (min_f) { + case SG_FILTER_NEAREST: + case SG_FILTER_NEAREST_MIPMAP_NEAREST: + return D3D11_FILTER_MIN_MAG_MIP_POINT; + case SG_FILTER_LINEAR: + case SG_FILTER_LINEAR_MIPMAP_NEAREST: + return D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT; + case SG_FILTER_NEAREST_MIPMAP_LINEAR: + return D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR; + case SG_FILTER_LINEAR_MIPMAP_LINEAR: + return D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR; + default: + SOKOL_UNREACHABLE; break; + } + } + else if (mag_f == SG_FILTER_LINEAR) { + switch (min_f) { + case SG_FILTER_NEAREST: + case SG_FILTER_NEAREST_MIPMAP_NEAREST: + return D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT; + case SG_FILTER_LINEAR: + case SG_FILTER_LINEAR_MIPMAP_NEAREST: + return D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT; + case SG_FILTER_NEAREST_MIPMAP_LINEAR: + return D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR; + case SG_FILTER_LINEAR_MIPMAP_LINEAR: + return D3D11_FILTER_MIN_MAG_MIP_LINEAR; + default: + SOKOL_UNREACHABLE; break; + } + } + /* invalid value for mag filter */ + SOKOL_UNREACHABLE; + return D3D11_FILTER_MIN_MAG_MIP_POINT; +} + +_SOKOL_PRIVATE D3D11_TEXTURE_ADDRESS_MODE _sg_d3d11_address_mode(sg_wrap m) { + switch (m) { + case SG_WRAP_REPEAT: return D3D11_TEXTURE_ADDRESS_WRAP; + case SG_WRAP_CLAMP_TO_EDGE: return D3D11_TEXTURE_ADDRESS_CLAMP; + case SG_WRAP_CLAMP_TO_BORDER: return D3D11_TEXTURE_ADDRESS_BORDER; + case SG_WRAP_MIRRORED_REPEAT: return D3D11_TEXTURE_ADDRESS_MIRROR; + default: SOKOL_UNREACHABLE; return (D3D11_TEXTURE_ADDRESS_MODE) 0; + } +} + +_SOKOL_PRIVATE DXGI_FORMAT _sg_d3d11_vertex_format(sg_vertex_format fmt) { + switch (fmt) { + case SG_VERTEXFORMAT_FLOAT: return DXGI_FORMAT_R32_FLOAT; + case SG_VERTEXFORMAT_FLOAT2: return DXGI_FORMAT_R32G32_FLOAT; + case SG_VERTEXFORMAT_FLOAT3: return DXGI_FORMAT_R32G32B32_FLOAT; + case SG_VERTEXFORMAT_FLOAT4: return DXGI_FORMAT_R32G32B32A32_FLOAT; + case SG_VERTEXFORMAT_BYTE4: return DXGI_FORMAT_R8G8B8A8_SINT; + case SG_VERTEXFORMAT_BYTE4N: return DXGI_FORMAT_R8G8B8A8_SNORM; + case SG_VERTEXFORMAT_UBYTE4: return DXGI_FORMAT_R8G8B8A8_UINT; + case SG_VERTEXFORMAT_UBYTE4N: return DXGI_FORMAT_R8G8B8A8_UNORM; + case SG_VERTEXFORMAT_SHORT2: return DXGI_FORMAT_R16G16_SINT; + case SG_VERTEXFORMAT_SHORT2N: return DXGI_FORMAT_R16G16_SNORM; + case SG_VERTEXFORMAT_USHORT2N: return DXGI_FORMAT_R16G16_UNORM; + case SG_VERTEXFORMAT_SHORT4: return DXGI_FORMAT_R16G16B16A16_SINT; + case SG_VERTEXFORMAT_SHORT4N: return DXGI_FORMAT_R16G16B16A16_SNORM; + case SG_VERTEXFORMAT_USHORT4N: return DXGI_FORMAT_R16G16B16A16_UNORM; + case SG_VERTEXFORMAT_UINT10_N2: return DXGI_FORMAT_R10G10B10A2_UNORM; + default: SOKOL_UNREACHABLE; return (DXGI_FORMAT) 0; + } +} + +_SOKOL_PRIVATE D3D11_INPUT_CLASSIFICATION _sg_d3d11_input_classification(sg_vertex_step step) { + switch (step) { + case SG_VERTEXSTEP_PER_VERTEX: return D3D11_INPUT_PER_VERTEX_DATA; + case SG_VERTEXSTEP_PER_INSTANCE: return D3D11_INPUT_PER_INSTANCE_DATA; + default: SOKOL_UNREACHABLE; return (D3D11_INPUT_CLASSIFICATION) 0; + } +} + +_SOKOL_PRIVATE D3D11_CULL_MODE _sg_d3d11_cull_mode(sg_cull_mode m) { + switch (m) { + case SG_CULLMODE_NONE: return D3D11_CULL_NONE; + case SG_CULLMODE_FRONT: return D3D11_CULL_FRONT; + case SG_CULLMODE_BACK: return D3D11_CULL_BACK; + default: SOKOL_UNREACHABLE; return (D3D11_CULL_MODE) 0; + } +} + +_SOKOL_PRIVATE D3D11_COMPARISON_FUNC _sg_d3d11_compare_func(sg_compare_func f) { + switch (f) { + case SG_COMPAREFUNC_NEVER: return D3D11_COMPARISON_NEVER; + case SG_COMPAREFUNC_LESS: return D3D11_COMPARISON_LESS; + case SG_COMPAREFUNC_EQUAL: return D3D11_COMPARISON_EQUAL; + case SG_COMPAREFUNC_LESS_EQUAL: return D3D11_COMPARISON_LESS_EQUAL; + case SG_COMPAREFUNC_GREATER: return D3D11_COMPARISON_GREATER; + case SG_COMPAREFUNC_NOT_EQUAL: return D3D11_COMPARISON_NOT_EQUAL; + case SG_COMPAREFUNC_GREATER_EQUAL: return D3D11_COMPARISON_GREATER_EQUAL; + case SG_COMPAREFUNC_ALWAYS: return D3D11_COMPARISON_ALWAYS; + default: SOKOL_UNREACHABLE; return (D3D11_COMPARISON_FUNC) 0; + } +} + +_SOKOL_PRIVATE D3D11_STENCIL_OP _sg_d3d11_stencil_op(sg_stencil_op op) { + switch (op) { + case SG_STENCILOP_KEEP: return D3D11_STENCIL_OP_KEEP; + case SG_STENCILOP_ZERO: return D3D11_STENCIL_OP_ZERO; + case SG_STENCILOP_REPLACE: return D3D11_STENCIL_OP_REPLACE; + case SG_STENCILOP_INCR_CLAMP: return D3D11_STENCIL_OP_INCR_SAT; + case SG_STENCILOP_DECR_CLAMP: return D3D11_STENCIL_OP_DECR_SAT; + case SG_STENCILOP_INVERT: return D3D11_STENCIL_OP_INVERT; + case SG_STENCILOP_INCR_WRAP: return D3D11_STENCIL_OP_INCR; + case SG_STENCILOP_DECR_WRAP: return D3D11_STENCIL_OP_DECR; + default: SOKOL_UNREACHABLE; return (D3D11_STENCIL_OP) 0; + } +} + +_SOKOL_PRIVATE D3D11_BLEND _sg_d3d11_blend_factor(sg_blend_factor f) { + switch (f) { + case SG_BLENDFACTOR_ZERO: return D3D11_BLEND_ZERO; + case SG_BLENDFACTOR_ONE: return D3D11_BLEND_ONE; + case SG_BLENDFACTOR_SRC_COLOR: return D3D11_BLEND_SRC_COLOR; + case SG_BLENDFACTOR_ONE_MINUS_SRC_COLOR: return D3D11_BLEND_INV_SRC_COLOR; + case SG_BLENDFACTOR_SRC_ALPHA: return D3D11_BLEND_SRC_ALPHA; + case SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA: return D3D11_BLEND_INV_SRC_ALPHA; + case SG_BLENDFACTOR_DST_COLOR: return D3D11_BLEND_DEST_COLOR; + case SG_BLENDFACTOR_ONE_MINUS_DST_COLOR: return D3D11_BLEND_INV_DEST_COLOR; + case SG_BLENDFACTOR_DST_ALPHA: return D3D11_BLEND_DEST_ALPHA; + case SG_BLENDFACTOR_ONE_MINUS_DST_ALPHA: return D3D11_BLEND_INV_DEST_ALPHA; + case SG_BLENDFACTOR_SRC_ALPHA_SATURATED: return D3D11_BLEND_SRC_ALPHA_SAT; + case SG_BLENDFACTOR_BLEND_COLOR: return D3D11_BLEND_BLEND_FACTOR; + case SG_BLENDFACTOR_ONE_MINUS_BLEND_COLOR: return D3D11_BLEND_INV_BLEND_FACTOR; + case SG_BLENDFACTOR_BLEND_ALPHA: return D3D11_BLEND_BLEND_FACTOR; + case SG_BLENDFACTOR_ONE_MINUS_BLEND_ALPHA: return D3D11_BLEND_INV_BLEND_FACTOR; + default: SOKOL_UNREACHABLE; return (D3D11_BLEND) 0; + } +} + +_SOKOL_PRIVATE D3D11_BLEND_OP _sg_d3d11_blend_op(sg_blend_op op) { + switch (op) { + case SG_BLENDOP_ADD: return D3D11_BLEND_OP_ADD; + case SG_BLENDOP_SUBTRACT: return D3D11_BLEND_OP_SUBTRACT; + case SG_BLENDOP_REVERSE_SUBTRACT: return D3D11_BLEND_OP_REV_SUBTRACT; + default: SOKOL_UNREACHABLE; return (D3D11_BLEND_OP) 0; + } +} + +_SOKOL_PRIVATE UINT8 _sg_d3d11_color_write_mask(sg_color_mask m) { + UINT8 res = 0; + if (m & SG_COLORMASK_R) { + res |= D3D11_COLOR_WRITE_ENABLE_RED; + } + if (m & SG_COLORMASK_G) { + res |= D3D11_COLOR_WRITE_ENABLE_GREEN; + } + if (m & SG_COLORMASK_B) { + res |= D3D11_COLOR_WRITE_ENABLE_BLUE; + } + if (m & SG_COLORMASK_A) { + res |= D3D11_COLOR_WRITE_ENABLE_ALPHA; + } + return res; +} + +/* see: https://docs.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-limits#resource-limits-for-feature-level-11-hardware */ +_SOKOL_PRIVATE void _sg_d3d11_init_caps(void) { + _sg.backend = SG_BACKEND_D3D11; + + _sg.features.instancing = true; + _sg.features.origin_top_left = true; + _sg.features.multiple_render_targets = true; + _sg.features.msaa_render_targets = true; + _sg.features.imagetype_3d = true; + _sg.features.imagetype_array = true; + _sg.features.image_clamp_to_border = true; + _sg.features.mrt_independent_blend_state = true; + _sg.features.mrt_independent_write_mask = true; + + _sg.limits.max_image_size_2d = 16 * 1024; + _sg.limits.max_image_size_cube = 16 * 1024; + _sg.limits.max_image_size_3d = 2 * 1024; + _sg.limits.max_image_size_array = 16 * 1024; + _sg.limits.max_image_array_layers = 2 * 1024; + _sg.limits.max_vertex_attrs = SG_MAX_VERTEX_ATTRIBUTES; + + /* see: https://docs.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_format_support */ + for (int fmt = (SG_PIXELFORMAT_NONE+1); fmt < _SG_PIXELFORMAT_NUM; fmt++) { + UINT dxgi_fmt_caps = 0; + const DXGI_FORMAT dxgi_fmt = _sg_d3d11_pixel_format((sg_pixel_format)fmt); + if (dxgi_fmt != DXGI_FORMAT_UNKNOWN) { + HRESULT hr = _sg_d3d11_CheckFormatSupport(_sg.d3d11.dev, dxgi_fmt, &dxgi_fmt_caps); + SOKOL_ASSERT(SUCCEEDED(hr) || (E_FAIL == hr)); + if (!SUCCEEDED(hr)) { + dxgi_fmt_caps = 0; + } + } + sg_pixelformat_info* info = &_sg.formats[fmt]; + info->sample = 0 != (dxgi_fmt_caps & D3D11_FORMAT_SUPPORT_TEXTURE2D); + info->filter = 0 != (dxgi_fmt_caps & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE); + info->render = 0 != (dxgi_fmt_caps & D3D11_FORMAT_SUPPORT_RENDER_TARGET); + info->blend = 0 != (dxgi_fmt_caps & D3D11_FORMAT_SUPPORT_BLENDABLE); + info->msaa = 0 != (dxgi_fmt_caps & D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET); + info->depth = 0 != (dxgi_fmt_caps & D3D11_FORMAT_SUPPORT_DEPTH_STENCIL); + if (info->depth) { + info->render = true; + } + } +} + +_SOKOL_PRIVATE void _sg_d3d11_setup_backend(const sg_desc* desc) { + /* assume _sg.d3d11 already is zero-initialized */ + SOKOL_ASSERT(desc); + SOKOL_ASSERT(desc->context.d3d11.device); + SOKOL_ASSERT(desc->context.d3d11.device_context); + SOKOL_ASSERT(desc->context.d3d11.render_target_view_cb || desc->context.d3d11.render_target_view_userdata_cb); + SOKOL_ASSERT(desc->context.d3d11.depth_stencil_view_cb || desc->context.d3d11.depth_stencil_view_userdata_cb); + _sg.d3d11.valid = true; + _sg.d3d11.dev = (ID3D11Device*) desc->context.d3d11.device; + _sg.d3d11.ctx = (ID3D11DeviceContext*) desc->context.d3d11.device_context; + _sg.d3d11.rtv_cb = desc->context.d3d11.render_target_view_cb; + _sg.d3d11.rtv_userdata_cb = desc->context.d3d11.render_target_view_userdata_cb; + _sg.d3d11.dsv_cb = desc->context.d3d11.depth_stencil_view_cb; + _sg.d3d11.dsv_userdata_cb = desc->context.d3d11.depth_stencil_view_userdata_cb; + _sg.d3d11.user_data = desc->context.d3d11.user_data; + _sg_d3d11_init_caps(); +} + +_SOKOL_PRIVATE void _sg_d3d11_discard_backend(void) { + SOKOL_ASSERT(_sg.d3d11.valid); + _sg.d3d11.valid = false; +} + +_SOKOL_PRIVATE void _sg_d3d11_clear_state(void) { + /* clear all the device context state, so that resource refs don't keep stuck in the d3d device context */ + _sg_d3d11_ClearState(_sg.d3d11.ctx); +} + +_SOKOL_PRIVATE void _sg_d3d11_reset_state_cache(void) { + /* just clear the d3d11 device context state */ + _sg_d3d11_clear_state(); +} + +_SOKOL_PRIVATE void _sg_d3d11_activate_context(_sg_context_t* ctx) { + _SOKOL_UNUSED(ctx); + _sg_d3d11_clear_state(); +} + +_SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + _SOKOL_UNUSED(ctx); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_d3d11_destroy_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + _SOKOL_UNUSED(ctx); + /* empty */ +} + +_SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_buffer(_sg_buffer_t* buf, const sg_buffer_desc* desc) { + SOKOL_ASSERT(buf && desc); + SOKOL_ASSERT(!buf->d3d11.buf); + _sg_buffer_common_init(&buf->cmn, desc); + const bool injected = (0 != desc->d3d11_buffer); + if (injected) { + buf->d3d11.buf = (ID3D11Buffer*) desc->d3d11_buffer; + _sg_d3d11_AddRef(buf->d3d11.buf); + } + else { + D3D11_BUFFER_DESC d3d11_desc; + memset(&d3d11_desc, 0, sizeof(d3d11_desc)); + d3d11_desc.ByteWidth = (UINT)buf->cmn.size; + d3d11_desc.Usage = _sg_d3d11_usage(buf->cmn.usage); + d3d11_desc.BindFlags = buf->cmn.type == SG_BUFFERTYPE_VERTEXBUFFER ? D3D11_BIND_VERTEX_BUFFER : D3D11_BIND_INDEX_BUFFER; + d3d11_desc.CPUAccessFlags = _sg_d3d11_cpu_access_flags(buf->cmn.usage); + D3D11_SUBRESOURCE_DATA* init_data_ptr = 0; + D3D11_SUBRESOURCE_DATA init_data; + memset(&init_data, 0, sizeof(init_data)); + if (buf->cmn.usage == SG_USAGE_IMMUTABLE) { + SOKOL_ASSERT(desc->data.ptr); + init_data.pSysMem = desc->data.ptr; + init_data_ptr = &init_data; + } + HRESULT hr = _sg_d3d11_CreateBuffer(_sg.d3d11.dev, &d3d11_desc, init_data_ptr, &buf->d3d11.buf); + if (!(SUCCEEDED(hr) && buf->d3d11.buf)) { + SOKOL_LOG("failed to create D3D11 buffer\n"); + return SG_RESOURCESTATE_FAILED; + } + } + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_d3d11_destroy_buffer(_sg_buffer_t* buf) { + SOKOL_ASSERT(buf); + if (buf->d3d11.buf) { + _sg_d3d11_Release(buf->d3d11.buf); + } +} + +_SOKOL_PRIVATE void _sg_d3d11_fill_subres_data(const _sg_image_t* img, const sg_image_data* data) { + const int num_faces = (img->cmn.type == SG_IMAGETYPE_CUBE) ? 6:1; + const int num_slices = (img->cmn.type == SG_IMAGETYPE_ARRAY) ? img->cmn.num_slices:1; + int subres_index = 0; + for (int face_index = 0; face_index < num_faces; face_index++) { + for (int slice_index = 0; slice_index < num_slices; slice_index++) { + for (int mip_index = 0; mip_index < img->cmn.num_mipmaps; mip_index++, subres_index++) { + SOKOL_ASSERT(subres_index < (SG_MAX_MIPMAPS * SG_MAX_TEXTUREARRAY_LAYERS)); + D3D11_SUBRESOURCE_DATA* subres_data = &_sg.d3d11.subres_data[subres_index]; + const int mip_width = ((img->cmn.width>>mip_index)>0) ? img->cmn.width>>mip_index : 1; + const int mip_height = ((img->cmn.height>>mip_index)>0) ? img->cmn.height>>mip_index : 1; + const sg_range* subimg_data = &(data->subimage[face_index][mip_index]); + const size_t slice_size = subimg_data->size / (size_t)num_slices; + const size_t slice_offset = slice_size * (size_t)slice_index; + const uint8_t* ptr = (const uint8_t*) subimg_data->ptr; + subres_data->pSysMem = ptr + slice_offset; + subres_data->SysMemPitch = (UINT)_sg_row_pitch(img->cmn.pixel_format, mip_width, 1); + if (img->cmn.type == SG_IMAGETYPE_3D) { + /* FIXME? const int mip_depth = ((img->depth>>mip_index)>0) ? img->depth>>mip_index : 1; */ + subres_data->SysMemSlicePitch = (UINT)_sg_surface_pitch(img->cmn.pixel_format, mip_width, mip_height, 1); + } + else { + subres_data->SysMemSlicePitch = 0; + } + } + } + } +} + +_SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_image(_sg_image_t* img, const sg_image_desc* desc) { + SOKOL_ASSERT(img && desc); + SOKOL_ASSERT(!img->d3d11.tex2d && !img->d3d11.tex3d && !img->d3d11.texds && !img->d3d11.texmsaa); + SOKOL_ASSERT(!img->d3d11.srv && !img->d3d11.smp); + HRESULT hr; + + _sg_image_common_init(&img->cmn, desc); + const bool injected = (0 != desc->d3d11_texture) || (0 != desc->d3d11_shader_resource_view); + const bool msaa = (img->cmn.sample_count > 1); + img->d3d11.format = _sg_d3d11_pixel_format(img->cmn.pixel_format); + + /* special case depth-stencil buffer? */ + if (_sg_is_valid_rendertarget_depth_format(img->cmn.pixel_format)) { + /* create only a depth-texture */ + SOKOL_ASSERT(!injected); + if (img->d3d11.format == DXGI_FORMAT_UNKNOWN) { + SOKOL_LOG("trying to create a D3D11 depth-texture with unsupported pixel format\n"); + return SG_RESOURCESTATE_FAILED; + } + D3D11_TEXTURE2D_DESC d3d11_desc; + memset(&d3d11_desc, 0, sizeof(d3d11_desc)); + d3d11_desc.Width = (UINT)img->cmn.width; + d3d11_desc.Height = (UINT)img->cmn.height; + d3d11_desc.MipLevels = 1; + d3d11_desc.ArraySize = 1; + d3d11_desc.Format = img->d3d11.format; + d3d11_desc.Usage = D3D11_USAGE_DEFAULT; + d3d11_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL; + d3d11_desc.SampleDesc.Count = (UINT)img->cmn.sample_count; + d3d11_desc.SampleDesc.Quality = (UINT) (msaa ? D3D11_STANDARD_MULTISAMPLE_PATTERN : 0); + hr = _sg_d3d11_CreateTexture2D(_sg.d3d11.dev, &d3d11_desc, NULL, &img->d3d11.texds); + if (!(SUCCEEDED(hr) && img->d3d11.texds)) { + SOKOL_LOG("failed to create D3D11 texture 2D\n"); + return SG_RESOURCESTATE_FAILED; + } + } + else { + /* create (or inject) color texture and shader-resource-view */ + + /* prepare initial content pointers */ + D3D11_SUBRESOURCE_DATA* init_data = 0; + if (!injected && (img->cmn.usage == SG_USAGE_IMMUTABLE) && !img->cmn.render_target) { + _sg_d3d11_fill_subres_data(img, &desc->data); + init_data = _sg.d3d11.subres_data; + } + if (img->cmn.type != SG_IMAGETYPE_3D) { + /* 2D-, cube- or array-texture */ + /* if this is an MSAA render target, the following texture will be the 'resolve-texture' */ + + /* first check for injected texture and/or resource view */ + if (injected) { + img->d3d11.tex2d = (ID3D11Texture2D*) desc->d3d11_texture; + img->d3d11.srv = (ID3D11ShaderResourceView*) desc->d3d11_shader_resource_view; + if (img->d3d11.tex2d) { + _sg_d3d11_AddRef(img->d3d11.tex2d); + } + else { + /* if only a shader-resource-view was provided, but no texture, lookup + the texture from the shader-resource-view, this also bumps the refcount + */ + SOKOL_ASSERT(img->d3d11.srv); + _sg_d3d11_GetResource((ID3D11View*)img->d3d11.srv, (ID3D11Resource**)&img->d3d11.tex2d); + SOKOL_ASSERT(img->d3d11.tex2d); + } + if (img->d3d11.srv) { + _sg_d3d11_AddRef(img->d3d11.srv); + } + } + + /* if not injected, create texture */ + if (0 == img->d3d11.tex2d) { + D3D11_TEXTURE2D_DESC d3d11_tex_desc; + memset(&d3d11_tex_desc, 0, sizeof(d3d11_tex_desc)); + d3d11_tex_desc.Width = (UINT)img->cmn.width; + d3d11_tex_desc.Height = (UINT)img->cmn.height; + d3d11_tex_desc.MipLevels = (UINT)img->cmn.num_mipmaps; + switch (img->cmn.type) { + case SG_IMAGETYPE_ARRAY: d3d11_tex_desc.ArraySize = (UINT)img->cmn.num_slices; break; + case SG_IMAGETYPE_CUBE: d3d11_tex_desc.ArraySize = 6; break; + default: d3d11_tex_desc.ArraySize = 1; break; + } + d3d11_tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + d3d11_tex_desc.Format = img->d3d11.format; + if (img->cmn.render_target) { + d3d11_tex_desc.Usage = D3D11_USAGE_DEFAULT; + if (!msaa) { + d3d11_tex_desc.BindFlags |= D3D11_BIND_RENDER_TARGET; + } + d3d11_tex_desc.CPUAccessFlags = 0; + } + else { + d3d11_tex_desc.Usage = _sg_d3d11_usage(img->cmn.usage); + d3d11_tex_desc.CPUAccessFlags = _sg_d3d11_cpu_access_flags(img->cmn.usage); + } + if (img->d3d11.format == DXGI_FORMAT_UNKNOWN) { + /* trying to create a texture format that's not supported by D3D */ + SOKOL_LOG("trying to create a D3D11 texture with unsupported pixel format\n"); + return SG_RESOURCESTATE_FAILED; + } + d3d11_tex_desc.SampleDesc.Count = 1; + d3d11_tex_desc.SampleDesc.Quality = 0; + d3d11_tex_desc.MiscFlags = (img->cmn.type == SG_IMAGETYPE_CUBE) ? D3D11_RESOURCE_MISC_TEXTURECUBE : 0; + + hr = _sg_d3d11_CreateTexture2D(_sg.d3d11.dev, &d3d11_tex_desc, init_data, &img->d3d11.tex2d); + if (!(SUCCEEDED(hr) && img->d3d11.tex2d)) { + SOKOL_LOG("failed to create D3D11 texture 2D\n"); + return SG_RESOURCESTATE_FAILED; + } + } + + /* ...and similar, if not injected, create shader-resource-view */ + if (0 == img->d3d11.srv) { + D3D11_SHADER_RESOURCE_VIEW_DESC d3d11_srv_desc; + memset(&d3d11_srv_desc, 0, sizeof(d3d11_srv_desc)); + d3d11_srv_desc.Format = img->d3d11.format; + switch (img->cmn.type) { + case SG_IMAGETYPE_2D: + d3d11_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + d3d11_srv_desc.Texture2D.MipLevels = (UINT)img->cmn.num_mipmaps; + break; + case SG_IMAGETYPE_CUBE: + d3d11_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; + d3d11_srv_desc.TextureCube.MipLevels = (UINT)img->cmn.num_mipmaps; + break; + case SG_IMAGETYPE_ARRAY: + d3d11_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; + d3d11_srv_desc.Texture2DArray.MipLevels = (UINT)img->cmn.num_mipmaps; + d3d11_srv_desc.Texture2DArray.ArraySize = (UINT)img->cmn.num_slices; + break; + default: + SOKOL_UNREACHABLE; break; + } + hr = _sg_d3d11_CreateShaderResourceView(_sg.d3d11.dev, (ID3D11Resource*)img->d3d11.tex2d, &d3d11_srv_desc, &img->d3d11.srv); + if (!(SUCCEEDED(hr) && img->d3d11.srv)) { + SOKOL_LOG("failed to create D3D11 resource view\n"); + return SG_RESOURCESTATE_FAILED; + } + } + } + else { + /* 3D texture - same procedure, first check if injected, than create non-injected */ + if (injected) { + img->d3d11.tex3d = (ID3D11Texture3D*) desc->d3d11_texture; + img->d3d11.srv = (ID3D11ShaderResourceView*) desc->d3d11_shader_resource_view; + if (img->d3d11.tex3d) { + _sg_d3d11_AddRef(img->d3d11.tex3d); + } + else { + SOKOL_ASSERT(img->d3d11.srv); + _sg_d3d11_GetResource((ID3D11View*)img->d3d11.srv, (ID3D11Resource**)&img->d3d11.tex3d); + SOKOL_ASSERT(img->d3d11.tex3d); + } + if (img->d3d11.srv) { + _sg_d3d11_AddRef(img->d3d11.srv); + } + } + + if (0 == img->d3d11.tex3d) { + D3D11_TEXTURE3D_DESC d3d11_tex_desc; + memset(&d3d11_tex_desc, 0, sizeof(d3d11_tex_desc)); + d3d11_tex_desc.Width = (UINT)img->cmn.width; + d3d11_tex_desc.Height = (UINT)img->cmn.height; + d3d11_tex_desc.Depth = (UINT)img->cmn.num_slices; + d3d11_tex_desc.MipLevels = (UINT)img->cmn.num_mipmaps; + d3d11_tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + d3d11_tex_desc.Format = img->d3d11.format; + if (img->cmn.render_target) { + d3d11_tex_desc.Usage = D3D11_USAGE_DEFAULT; + if (!msaa) { + d3d11_tex_desc.BindFlags |= D3D11_BIND_RENDER_TARGET; + } + d3d11_tex_desc.CPUAccessFlags = 0; + } + else { + d3d11_tex_desc.Usage = _sg_d3d11_usage(img->cmn.usage); + d3d11_tex_desc.CPUAccessFlags = _sg_d3d11_cpu_access_flags(img->cmn.usage); + } + if (img->d3d11.format == DXGI_FORMAT_UNKNOWN) { + /* trying to create a texture format that's not supported by D3D */ + SOKOL_LOG("trying to create a D3D11 texture with unsupported pixel format\n"); + return SG_RESOURCESTATE_FAILED; + } + hr = _sg_d3d11_CreateTexture3D(_sg.d3d11.dev, &d3d11_tex_desc, init_data, &img->d3d11.tex3d); + if (!(SUCCEEDED(hr) && img->d3d11.tex3d)) { + SOKOL_LOG("failed to create D3D11 texture 3D\n"); + return SG_RESOURCESTATE_FAILED; + } + } + + if (0 == img->d3d11.srv) { + D3D11_SHADER_RESOURCE_VIEW_DESC d3d11_srv_desc; + memset(&d3d11_srv_desc, 0, sizeof(d3d11_srv_desc)); + d3d11_srv_desc.Format = img->d3d11.format; + d3d11_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + d3d11_srv_desc.Texture3D.MipLevels = (UINT)img->cmn.num_mipmaps; + hr = _sg_d3d11_CreateShaderResourceView(_sg.d3d11.dev, (ID3D11Resource*)img->d3d11.tex3d, &d3d11_srv_desc, &img->d3d11.srv); + if (!(SUCCEEDED(hr) && img->d3d11.srv)) { + SOKOL_LOG("failed to create D3D11 resource view\n"); + return SG_RESOURCESTATE_FAILED; + } + } + } + + /* also need to create a separate MSAA render target texture? */ + if (msaa) { + D3D11_TEXTURE2D_DESC d3d11_tex_desc; + memset(&d3d11_tex_desc, 0, sizeof(d3d11_tex_desc)); + d3d11_tex_desc.Width = (UINT)img->cmn.width; + d3d11_tex_desc.Height = (UINT)img->cmn.height; + d3d11_tex_desc.MipLevels = 1; + d3d11_tex_desc.ArraySize = 1; + d3d11_tex_desc.Format = img->d3d11.format; + d3d11_tex_desc.Usage = D3D11_USAGE_DEFAULT; + d3d11_tex_desc.BindFlags = D3D11_BIND_RENDER_TARGET; + d3d11_tex_desc.CPUAccessFlags = 0; + d3d11_tex_desc.SampleDesc.Count = (UINT)img->cmn.sample_count; + d3d11_tex_desc.SampleDesc.Quality = (UINT)D3D11_STANDARD_MULTISAMPLE_PATTERN; + hr = _sg_d3d11_CreateTexture2D(_sg.d3d11.dev, &d3d11_tex_desc, NULL, &img->d3d11.texmsaa); + if (!(SUCCEEDED(hr) && img->d3d11.texmsaa)) { + SOKOL_LOG("failed to create D3D11 texture 2D\n"); + return SG_RESOURCESTATE_FAILED; + } + } + + /* sampler state object, note D3D11 implements an internal shared-pool for sampler objects */ + D3D11_SAMPLER_DESC d3d11_smp_desc; + memset(&d3d11_smp_desc, 0, sizeof(d3d11_smp_desc)); + d3d11_smp_desc.Filter = _sg_d3d11_filter(img->cmn.min_filter, img->cmn.mag_filter, img->cmn.max_anisotropy); + d3d11_smp_desc.AddressU = _sg_d3d11_address_mode(img->cmn.wrap_u); + d3d11_smp_desc.AddressV = _sg_d3d11_address_mode(img->cmn.wrap_v); + d3d11_smp_desc.AddressW = _sg_d3d11_address_mode(img->cmn.wrap_w); + switch (img->cmn.border_color) { + case SG_BORDERCOLOR_TRANSPARENT_BLACK: + /* all 0.0f */ + break; + case SG_BORDERCOLOR_OPAQUE_WHITE: + for (int i = 0; i < 4; i++) { + d3d11_smp_desc.BorderColor[i] = 1.0f; + } + break; + default: + /* opaque black */ + d3d11_smp_desc.BorderColor[3] = 1.0f; + break; + } + d3d11_smp_desc.MaxAnisotropy = img->cmn.max_anisotropy; + d3d11_smp_desc.ComparisonFunc = D3D11_COMPARISON_NEVER; + d3d11_smp_desc.MinLOD = desc->min_lod; + d3d11_smp_desc.MaxLOD = desc->max_lod; + hr = _sg_d3d11_CreateSamplerState(_sg.d3d11.dev, &d3d11_smp_desc, &img->d3d11.smp); + if (!(SUCCEEDED(hr) && img->d3d11.smp)) { + SOKOL_LOG("failed to create D3D11 sampler state\n"); + return SG_RESOURCESTATE_FAILED; + } + } + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_d3d11_destroy_image(_sg_image_t* img) { + SOKOL_ASSERT(img); + if (img->d3d11.tex2d) { + _sg_d3d11_Release(img->d3d11.tex2d); + } + if (img->d3d11.tex3d) { + _sg_d3d11_Release(img->d3d11.tex3d); + } + if (img->d3d11.texds) { + _sg_d3d11_Release(img->d3d11.texds); + } + if (img->d3d11.texmsaa) { + _sg_d3d11_Release(img->d3d11.texmsaa); + } + if (img->d3d11.srv) { + _sg_d3d11_Release(img->d3d11.srv); + } + if (img->d3d11.smp) { + _sg_d3d11_Release(img->d3d11.smp); + } +} + +_SOKOL_PRIVATE bool _sg_d3d11_load_d3dcompiler_dll(void) { + /* on UWP, don't do anything (not tested) */ + #if (defined(WINAPI_FAMILY_PARTITION) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) + return true; + #else + /* load DLL on demand */ + if ((0 == _sg.d3d11.d3dcompiler_dll) && !_sg.d3d11.d3dcompiler_dll_load_failed) { + _sg.d3d11.d3dcompiler_dll = LoadLibraryA("d3dcompiler_47.dll"); + if (0 == _sg.d3d11.d3dcompiler_dll) { + /* don't attempt to load missing DLL in the future */ + SOKOL_LOG("failed to load d3dcompiler_47.dll!\n"); + _sg.d3d11.d3dcompiler_dll_load_failed = true; + return false; + } + /* look up function pointers */ + _sg.d3d11.D3DCompile_func = (pD3DCompile)(void*) GetProcAddress(_sg.d3d11.d3dcompiler_dll, "D3DCompile"); + SOKOL_ASSERT(_sg.d3d11.D3DCompile_func); + } + return 0 != _sg.d3d11.d3dcompiler_dll; + #endif +} + +#if (defined(WINAPI_FAMILY_PARTITION) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) +#define _sg_d3d11_D3DCompile D3DCompile +#else +#define _sg_d3d11_D3DCompile _sg.d3d11.D3DCompile_func +#endif + +_SOKOL_PRIVATE ID3DBlob* _sg_d3d11_compile_shader(const sg_shader_stage_desc* stage_desc) { + if (!_sg_d3d11_load_d3dcompiler_dll()) { + return NULL; + } + SOKOL_ASSERT(stage_desc->d3d11_target); + ID3DBlob* output = NULL; + ID3DBlob* errors_or_warnings = NULL; + HRESULT hr = _sg_d3d11_D3DCompile( + stage_desc->source, /* pSrcData */ + strlen(stage_desc->source), /* SrcDataSize */ + NULL, /* pSourceName */ + NULL, /* pDefines */ + NULL, /* pInclude */ + stage_desc->entry ? stage_desc->entry : "main", /* pEntryPoint */ + stage_desc->d3d11_target, /* pTarget (vs_5_0 or ps_5_0) */ + D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR | D3DCOMPILE_OPTIMIZATION_LEVEL3, /* Flags1 */ + 0, /* Flags2 */ + &output, /* ppCode */ + &errors_or_warnings); /* ppErrorMsgs */ + if (errors_or_warnings) { + SOKOL_LOG((LPCSTR)_sg_d3d11_GetBufferPointer(errors_or_warnings)); + _sg_d3d11_Release(errors_or_warnings); errors_or_warnings = NULL; + } + if (FAILED(hr)) { + /* just in case, usually output is NULL here */ + if (output) { + _sg_d3d11_Release(output); + output = NULL; + } + } + return output; +} + +_SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_shader(_sg_shader_t* shd, const sg_shader_desc* desc) { + SOKOL_ASSERT(shd && desc); + SOKOL_ASSERT(!shd->d3d11.vs && !shd->d3d11.fs && !shd->d3d11.vs_blob); + HRESULT hr; + + _sg_shader_common_init(&shd->cmn, desc); + + /* copy vertex attribute semantic names and indices */ + for (int i = 0; i < SG_MAX_VERTEX_ATTRIBUTES; i++) { + _sg_strcpy(&shd->d3d11.attrs[i].sem_name, desc->attrs[i].sem_name); + shd->d3d11.attrs[i].sem_index = desc->attrs[i].sem_index; + } + + /* shader stage uniform blocks and image slots */ + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + _sg_shader_stage_t* cmn_stage = &shd->cmn.stage[stage_index]; + _sg_d3d11_shader_stage_t* d3d11_stage = &shd->d3d11.stage[stage_index]; + for (int ub_index = 0; ub_index < cmn_stage->num_uniform_blocks; ub_index++) { + const _sg_uniform_block_t* ub = &cmn_stage->uniform_blocks[ub_index]; + + /* create a D3D constant buffer for each uniform block */ + SOKOL_ASSERT(0 == d3d11_stage->cbufs[ub_index]); + D3D11_BUFFER_DESC cb_desc; + memset(&cb_desc, 0, sizeof(cb_desc)); + cb_desc.ByteWidth = (UINT)_sg_roundup((int)ub->size, 16); + cb_desc.Usage = D3D11_USAGE_DEFAULT; + cb_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + hr = _sg_d3d11_CreateBuffer(_sg.d3d11.dev, &cb_desc, NULL, &d3d11_stage->cbufs[ub_index]); + if (!(SUCCEEDED(hr) && d3d11_stage->cbufs[ub_index])) { + SOKOL_LOG("failed to create D3D11 buffer\n"); + return SG_RESOURCESTATE_FAILED; + } + } + } + + const void* vs_ptr = 0, *fs_ptr = 0; + SIZE_T vs_length = 0, fs_length = 0; + ID3DBlob* vs_blob = 0, *fs_blob = 0; + if (desc->vs.bytecode.ptr && desc->fs.bytecode.ptr) { + /* create from shader byte code */ + vs_ptr = desc->vs.bytecode.ptr; + fs_ptr = desc->fs.bytecode.ptr; + vs_length = desc->vs.bytecode.size; + fs_length = desc->fs.bytecode.size; + } + else { + /* compile from shader source code */ + vs_blob = _sg_d3d11_compile_shader(&desc->vs); + fs_blob = _sg_d3d11_compile_shader(&desc->fs); + if (vs_blob && fs_blob) { + vs_ptr = _sg_d3d11_GetBufferPointer(vs_blob); + vs_length = _sg_d3d11_GetBufferSize(vs_blob); + fs_ptr = _sg_d3d11_GetBufferPointer(fs_blob); + fs_length = _sg_d3d11_GetBufferSize(fs_blob); + } + } + sg_resource_state result = SG_RESOURCESTATE_FAILED; + if (vs_ptr && fs_ptr && (vs_length > 0) && (fs_length > 0)) { + /* create the D3D vertex- and pixel-shader objects */ + hr = _sg_d3d11_CreateVertexShader(_sg.d3d11.dev, vs_ptr, vs_length, NULL, &shd->d3d11.vs); + bool vs_succeeded = SUCCEEDED(hr) && shd->d3d11.vs; + hr = _sg_d3d11_CreatePixelShader(_sg.d3d11.dev, fs_ptr, fs_length, NULL, &shd->d3d11.fs); + bool fs_succeeded = SUCCEEDED(hr) && shd->d3d11.fs; + + /* need to store the vertex shader byte code, this is needed later in sg_create_pipeline */ + if (vs_succeeded && fs_succeeded) { + shd->d3d11.vs_blob_length = vs_length; + shd->d3d11.vs_blob = SOKOL_MALLOC((size_t)vs_length); + SOKOL_ASSERT(shd->d3d11.vs_blob); + memcpy(shd->d3d11.vs_blob, vs_ptr, vs_length); + result = SG_RESOURCESTATE_VALID; + } + } + if (vs_blob) { + _sg_d3d11_Release(vs_blob); vs_blob = 0; + } + if (fs_blob) { + _sg_d3d11_Release(fs_blob); fs_blob = 0; + } + return result; +} + +_SOKOL_PRIVATE void _sg_d3d11_destroy_shader(_sg_shader_t* shd) { + SOKOL_ASSERT(shd); + if (shd->d3d11.vs) { + _sg_d3d11_Release(shd->d3d11.vs); + } + if (shd->d3d11.fs) { + _sg_d3d11_Release(shd->d3d11.fs); + } + if (shd->d3d11.vs_blob) { + SOKOL_FREE(shd->d3d11.vs_blob); + } + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + _sg_shader_stage_t* cmn_stage = &shd->cmn.stage[stage_index]; + _sg_d3d11_shader_stage_t* d3d11_stage = &shd->d3d11.stage[stage_index]; + for (int ub_index = 0; ub_index < cmn_stage->num_uniform_blocks; ub_index++) { + if (d3d11_stage->cbufs[ub_index]) { + _sg_d3d11_Release(d3d11_stage->cbufs[ub_index]); + } + } + } +} + +_SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_pipeline(_sg_pipeline_t* pip, _sg_shader_t* shd, const sg_pipeline_desc* desc) { + SOKOL_ASSERT(pip && shd && desc); + SOKOL_ASSERT(desc->shader.id == shd->slot.id); + SOKOL_ASSERT(shd->slot.state == SG_RESOURCESTATE_VALID); + SOKOL_ASSERT(shd->d3d11.vs_blob && shd->d3d11.vs_blob_length > 0); + SOKOL_ASSERT(!pip->d3d11.il && !pip->d3d11.rs && !pip->d3d11.dss && !pip->d3d11.bs); + + pip->shader = shd; + _sg_pipeline_common_init(&pip->cmn, desc); + pip->d3d11.index_format = _sg_d3d11_index_format(pip->cmn.index_type); + pip->d3d11.topology = _sg_d3d11_primitive_topology(desc->primitive_type); + pip->d3d11.stencil_ref = desc->stencil.ref; + + /* create input layout object */ + HRESULT hr; + D3D11_INPUT_ELEMENT_DESC d3d11_comps[SG_MAX_VERTEX_ATTRIBUTES]; + memset(d3d11_comps, 0, sizeof(d3d11_comps)); + int attr_index = 0; + for (; attr_index < SG_MAX_VERTEX_ATTRIBUTES; attr_index++) { + const sg_vertex_attr_desc* a_desc = &desc->layout.attrs[attr_index]; + if (a_desc->format == SG_VERTEXFORMAT_INVALID) { + break; + } + SOKOL_ASSERT(a_desc->buffer_index < SG_MAX_SHADERSTAGE_BUFFERS); + const sg_buffer_layout_desc* l_desc = &desc->layout.buffers[a_desc->buffer_index]; + const sg_vertex_step step_func = l_desc->step_func; + const int step_rate = l_desc->step_rate; + D3D11_INPUT_ELEMENT_DESC* d3d11_comp = &d3d11_comps[attr_index]; + d3d11_comp->SemanticName = _sg_strptr(&shd->d3d11.attrs[attr_index].sem_name); + d3d11_comp->SemanticIndex = (UINT)shd->d3d11.attrs[attr_index].sem_index; + d3d11_comp->Format = _sg_d3d11_vertex_format(a_desc->format); + d3d11_comp->InputSlot = (UINT)a_desc->buffer_index; + d3d11_comp->AlignedByteOffset = (UINT)a_desc->offset; + d3d11_comp->InputSlotClass = _sg_d3d11_input_classification(step_func); + if (SG_VERTEXSTEP_PER_INSTANCE == step_func) { + d3d11_comp->InstanceDataStepRate = (UINT)step_rate; + pip->cmn.use_instanced_draw = true; + } + pip->cmn.vertex_layout_valid[a_desc->buffer_index] = true; + } + for (int layout_index = 0; layout_index < SG_MAX_SHADERSTAGE_BUFFERS; layout_index++) { + if (pip->cmn.vertex_layout_valid[layout_index]) { + const sg_buffer_layout_desc* l_desc = &desc->layout.buffers[layout_index]; + SOKOL_ASSERT(l_desc->stride > 0); + pip->d3d11.vb_strides[layout_index] = (UINT)l_desc->stride; + } + else { + pip->d3d11.vb_strides[layout_index] = 0; + } + } + hr = _sg_d3d11_CreateInputLayout(_sg.d3d11.dev, + d3d11_comps, /* pInputElementDesc */ + (UINT)attr_index, /* NumElements */ + shd->d3d11.vs_blob, /* pShaderByteCodeWithInputSignature */ + shd->d3d11.vs_blob_length, /* BytecodeLength */ + &pip->d3d11.il); + if (!(SUCCEEDED(hr) && pip->d3d11.il)) { + SOKOL_LOG("failed to create D3D11 input layout\n"); + return SG_RESOURCESTATE_FAILED; + } + + /* create rasterizer state */ + D3D11_RASTERIZER_DESC rs_desc; + memset(&rs_desc, 0, sizeof(rs_desc)); + rs_desc.FillMode = D3D11_FILL_SOLID; + rs_desc.CullMode = _sg_d3d11_cull_mode(desc->cull_mode); + rs_desc.FrontCounterClockwise = desc->face_winding == SG_FACEWINDING_CCW; + rs_desc.DepthBias = (INT) pip->cmn.depth_bias; + rs_desc.DepthBiasClamp = pip->cmn.depth_bias_clamp; + rs_desc.SlopeScaledDepthBias = pip->cmn.depth_bias_slope_scale; + rs_desc.DepthClipEnable = TRUE; + rs_desc.ScissorEnable = TRUE; + rs_desc.MultisampleEnable = desc->sample_count > 1; + rs_desc.AntialiasedLineEnable = FALSE; + hr = _sg_d3d11_CreateRasterizerState(_sg.d3d11.dev, &rs_desc, &pip->d3d11.rs); + if (!(SUCCEEDED(hr) && pip->d3d11.rs)) { + SOKOL_LOG("failed to create D3D11 rasterizer state\n"); + return SG_RESOURCESTATE_FAILED; + } + + /* create depth-stencil state */ + D3D11_DEPTH_STENCIL_DESC dss_desc; + memset(&dss_desc, 0, sizeof(dss_desc)); + dss_desc.DepthEnable = TRUE; + dss_desc.DepthWriteMask = desc->depth.write_enabled ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO; + dss_desc.DepthFunc = _sg_d3d11_compare_func(desc->depth.compare); + dss_desc.StencilEnable = desc->stencil.enabled; + dss_desc.StencilReadMask = desc->stencil.read_mask; + dss_desc.StencilWriteMask = desc->stencil.write_mask; + const sg_stencil_face_state* sf = &desc->stencil.front; + dss_desc.FrontFace.StencilFailOp = _sg_d3d11_stencil_op(sf->fail_op); + dss_desc.FrontFace.StencilDepthFailOp = _sg_d3d11_stencil_op(sf->depth_fail_op); + dss_desc.FrontFace.StencilPassOp = _sg_d3d11_stencil_op(sf->pass_op); + dss_desc.FrontFace.StencilFunc = _sg_d3d11_compare_func(sf->compare); + const sg_stencil_face_state* sb = &desc->stencil.back; + dss_desc.BackFace.StencilFailOp = _sg_d3d11_stencil_op(sb->fail_op); + dss_desc.BackFace.StencilDepthFailOp = _sg_d3d11_stencil_op(sb->depth_fail_op); + dss_desc.BackFace.StencilPassOp = _sg_d3d11_stencil_op(sb->pass_op); + dss_desc.BackFace.StencilFunc = _sg_d3d11_compare_func(sb->compare); + hr = _sg_d3d11_CreateDepthStencilState(_sg.d3d11.dev, &dss_desc, &pip->d3d11.dss); + if (!(SUCCEEDED(hr) && pip->d3d11.dss)) { + SOKOL_LOG("failed to create D3D11 depth stencil state\n"); + return SG_RESOURCESTATE_FAILED; + } + + /* create blend state */ + D3D11_BLEND_DESC bs_desc; + memset(&bs_desc, 0, sizeof(bs_desc)); + bs_desc.AlphaToCoverageEnable = desc->alpha_to_coverage_enabled; + bs_desc.IndependentBlendEnable = TRUE; + { + int i = 0; + for (i = 0; i < desc->color_count; i++) { + const sg_blend_state* src = &desc->colors[i].blend; + D3D11_RENDER_TARGET_BLEND_DESC* dst = &bs_desc.RenderTarget[i]; + dst->BlendEnable = src->enabled; + dst->SrcBlend = _sg_d3d11_blend_factor(src->src_factor_rgb); + dst->DestBlend = _sg_d3d11_blend_factor(src->dst_factor_rgb); + dst->BlendOp = _sg_d3d11_blend_op(src->op_rgb); + dst->SrcBlendAlpha = _sg_d3d11_blend_factor(src->src_factor_alpha); + dst->DestBlendAlpha = _sg_d3d11_blend_factor(src->dst_factor_alpha); + dst->BlendOpAlpha = _sg_d3d11_blend_op(src->op_alpha); + dst->RenderTargetWriteMask = _sg_d3d11_color_write_mask(desc->colors[i].write_mask); + } + for (; i < 8; i++) { + D3D11_RENDER_TARGET_BLEND_DESC* dst = &bs_desc.RenderTarget[i]; + dst->BlendEnable = FALSE; + dst->SrcBlend = dst->SrcBlendAlpha = D3D11_BLEND_ONE; + dst->DestBlend = dst->DestBlendAlpha = D3D11_BLEND_ZERO; + dst->BlendOp = dst->BlendOpAlpha = D3D11_BLEND_OP_ADD; + dst->RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + } + } + hr = _sg_d3d11_CreateBlendState(_sg.d3d11.dev, &bs_desc, &pip->d3d11.bs); + if (!(SUCCEEDED(hr) && pip->d3d11.bs)) { + SOKOL_LOG("failed to create D3D11 blend state\n"); + return SG_RESOURCESTATE_FAILED; + } + + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_d3d11_destroy_pipeline(_sg_pipeline_t* pip) { + SOKOL_ASSERT(pip); + if (pip == _sg.d3d11.cur_pipeline) { + _sg.d3d11.cur_pipeline = 0; + _sg.d3d11.cur_pipeline_id.id = SG_INVALID_ID; + } + if (pip->d3d11.il) { + _sg_d3d11_Release(pip->d3d11.il); + } + if (pip->d3d11.rs) { + _sg_d3d11_Release(pip->d3d11.rs); + } + if (pip->d3d11.dss) { + _sg_d3d11_Release(pip->d3d11.dss); + } + if (pip->d3d11.bs) { + _sg_d3d11_Release(pip->d3d11.bs); + } +} + +_SOKOL_PRIVATE sg_resource_state _sg_d3d11_create_pass(_sg_pass_t* pass, _sg_image_t** att_images, const sg_pass_desc* desc) { + SOKOL_ASSERT(pass && desc); + SOKOL_ASSERT(att_images && att_images[0]); + SOKOL_ASSERT(_sg.d3d11.dev); + + _sg_pass_common_init(&pass->cmn, desc); + + for (int i = 0; i < pass->cmn.num_color_atts; i++) { + const sg_pass_attachment_desc* att_desc = &desc->color_attachments[i]; + _SOKOL_UNUSED(att_desc); + SOKOL_ASSERT(att_desc->image.id != SG_INVALID_ID); + _sg_image_t* att_img = att_images[i]; + SOKOL_ASSERT(att_img && (att_img->slot.id == att_desc->image.id)); + SOKOL_ASSERT(_sg_is_valid_rendertarget_color_format(att_img->cmn.pixel_format)); + SOKOL_ASSERT(0 == pass->d3d11.color_atts[i].image); + pass->d3d11.color_atts[i].image = att_img; + + /* create D3D11 render-target-view */ + const _sg_pass_attachment_t* cmn_att = &pass->cmn.color_atts[i]; + SOKOL_ASSERT(0 == pass->d3d11.color_atts[i].rtv); + ID3D11Resource* d3d11_res = 0; + const bool is_msaa = att_img->cmn.sample_count > 1; + D3D11_RENDER_TARGET_VIEW_DESC d3d11_rtv_desc; + memset(&d3d11_rtv_desc, 0, sizeof(d3d11_rtv_desc)); + d3d11_rtv_desc.Format = att_img->d3d11.format; + if ((att_img->cmn.type == SG_IMAGETYPE_2D) || is_msaa) { + if (is_msaa) { + d3d11_res = (ID3D11Resource*) att_img->d3d11.texmsaa; + d3d11_rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS; + } + else { + d3d11_res = (ID3D11Resource*) att_img->d3d11.tex2d; + d3d11_rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; + d3d11_rtv_desc.Texture2D.MipSlice = (UINT)cmn_att->mip_level; + } + } + else if ((att_img->cmn.type == SG_IMAGETYPE_CUBE) || (att_img->cmn.type == SG_IMAGETYPE_ARRAY)) { + d3d11_res = (ID3D11Resource*) att_img->d3d11.tex2d; + d3d11_rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; + d3d11_rtv_desc.Texture2DArray.MipSlice = (UINT)cmn_att->mip_level; + d3d11_rtv_desc.Texture2DArray.FirstArraySlice = (UINT)cmn_att->slice; + d3d11_rtv_desc.Texture2DArray.ArraySize = 1; + } + else { + SOKOL_ASSERT(att_img->cmn.type == SG_IMAGETYPE_3D); + d3d11_res = (ID3D11Resource*) att_img->d3d11.tex3d; + d3d11_rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; + d3d11_rtv_desc.Texture3D.MipSlice = (UINT)cmn_att->mip_level; + d3d11_rtv_desc.Texture3D.FirstWSlice = (UINT)cmn_att->slice; + d3d11_rtv_desc.Texture3D.WSize = 1; + } + SOKOL_ASSERT(d3d11_res); + HRESULT hr = _sg_d3d11_CreateRenderTargetView(_sg.d3d11.dev, d3d11_res, &d3d11_rtv_desc, &pass->d3d11.color_atts[i].rtv); + if (!(SUCCEEDED(hr) && pass->d3d11.color_atts[i].rtv)) { + SOKOL_LOG("failed to create D3D11 render target view\n"); + return SG_RESOURCESTATE_FAILED; + } + } + + /* optional depth-stencil image */ + SOKOL_ASSERT(0 == pass->d3d11.ds_att.image); + SOKOL_ASSERT(0 == pass->d3d11.ds_att.dsv); + if (desc->depth_stencil_attachment.image.id != SG_INVALID_ID) { + const int ds_img_index = SG_MAX_COLOR_ATTACHMENTS; + const sg_pass_attachment_desc* att_desc = &desc->depth_stencil_attachment; + _SOKOL_UNUSED(att_desc); + _sg_image_t* att_img = att_images[ds_img_index]; + SOKOL_ASSERT(att_img && (att_img->slot.id == att_desc->image.id)); + SOKOL_ASSERT(_sg_is_valid_rendertarget_depth_format(att_img->cmn.pixel_format)); + SOKOL_ASSERT(0 == pass->d3d11.ds_att.image); + pass->d3d11.ds_att.image = att_img; + + /* create D3D11 depth-stencil-view */ + D3D11_DEPTH_STENCIL_VIEW_DESC d3d11_dsv_desc; + memset(&d3d11_dsv_desc, 0, sizeof(d3d11_dsv_desc)); + d3d11_dsv_desc.Format = att_img->d3d11.format; + const bool is_msaa = att_img->cmn.sample_count > 1; + if (is_msaa) { + d3d11_dsv_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS; + } + else { + d3d11_dsv_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + } + ID3D11Resource* d3d11_res = (ID3D11Resource*) att_img->d3d11.texds; + SOKOL_ASSERT(d3d11_res); + HRESULT hr = _sg_d3d11_CreateDepthStencilView(_sg.d3d11.dev, d3d11_res, &d3d11_dsv_desc, &pass->d3d11.ds_att.dsv); + if (!(SUCCEEDED(hr) && pass->d3d11.ds_att.dsv)) { + SOKOL_LOG("failed to create D3D11 depth stencil view\n"); + return SG_RESOURCESTATE_FAILED; + } + } + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_d3d11_destroy_pass(_sg_pass_t* pass) { + SOKOL_ASSERT(pass); + SOKOL_ASSERT(pass != _sg.d3d11.cur_pass); + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + if (pass->d3d11.color_atts[i].rtv) { + _sg_d3d11_Release(pass->d3d11.color_atts[i].rtv); + } + } + if (pass->d3d11.ds_att.dsv) { + _sg_d3d11_Release(pass->d3d11.ds_att.dsv); + } +} + +_SOKOL_PRIVATE _sg_image_t* _sg_d3d11_pass_color_image(const _sg_pass_t* pass, int index) { + SOKOL_ASSERT(pass && (index >= 0) && (index < SG_MAX_COLOR_ATTACHMENTS)); + /* NOTE: may return null */ + return pass->d3d11.color_atts[index].image; +} + +_SOKOL_PRIVATE _sg_image_t* _sg_d3d11_pass_ds_image(const _sg_pass_t* pass) { + /* NOTE: may return null */ + SOKOL_ASSERT(pass); + return pass->d3d11.ds_att.image; +} + +_SOKOL_PRIVATE void _sg_d3d11_begin_pass(_sg_pass_t* pass, const sg_pass_action* action, int w, int h) { + SOKOL_ASSERT(action); + SOKOL_ASSERT(!_sg.d3d11.in_pass); + SOKOL_ASSERT(_sg.d3d11.rtv_cb || _sg.d3d11.rtv_userdata_cb); + SOKOL_ASSERT(_sg.d3d11.dsv_cb || _sg.d3d11.dsv_userdata_cb); + _sg.d3d11.in_pass = true; + _sg.d3d11.cur_width = w; + _sg.d3d11.cur_height = h; + if (pass) { + _sg.d3d11.cur_pass = pass; + _sg.d3d11.cur_pass_id.id = pass->slot.id; + _sg.d3d11.num_rtvs = 0; + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + _sg.d3d11.cur_rtvs[i] = pass->d3d11.color_atts[i].rtv; + if (_sg.d3d11.cur_rtvs[i]) { + _sg.d3d11.num_rtvs++; + } + } + _sg.d3d11.cur_dsv = pass->d3d11.ds_att.dsv; + } + else { + /* render to default frame buffer */ + _sg.d3d11.cur_pass = 0; + _sg.d3d11.cur_pass_id.id = SG_INVALID_ID; + _sg.d3d11.num_rtvs = 1; + if (_sg.d3d11.rtv_cb) { + _sg.d3d11.cur_rtvs[0] = (ID3D11RenderTargetView*) _sg.d3d11.rtv_cb(); + } + else { + _sg.d3d11.cur_rtvs[0] = (ID3D11RenderTargetView*) _sg.d3d11.rtv_userdata_cb(_sg.d3d11.user_data); + } + for (int i = 1; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + _sg.d3d11.cur_rtvs[i] = 0; + } + if (_sg.d3d11.dsv_cb) { + _sg.d3d11.cur_dsv = (ID3D11DepthStencilView*) _sg.d3d11.dsv_cb(); + } + else { + _sg.d3d11.cur_dsv = (ID3D11DepthStencilView*) _sg.d3d11.dsv_userdata_cb(_sg.d3d11.user_data); + } + SOKOL_ASSERT(_sg.d3d11.cur_rtvs[0] && _sg.d3d11.cur_dsv); + } + /* apply the render-target- and depth-stencil-views */ + _sg_d3d11_OMSetRenderTargets(_sg.d3d11.ctx, SG_MAX_COLOR_ATTACHMENTS, _sg.d3d11.cur_rtvs, _sg.d3d11.cur_dsv); + + /* set viewport and scissor rect to cover whole screen */ + D3D11_VIEWPORT vp; + memset(&vp, 0, sizeof(vp)); + vp.Width = (FLOAT) w; + vp.Height = (FLOAT) h; + vp.MaxDepth = 1.0f; + _sg_d3d11_RSSetViewports(_sg.d3d11.ctx, 1, &vp); + D3D11_RECT rect; + rect.left = 0; + rect.top = 0; + rect.right = w; + rect.bottom = h; + _sg_d3d11_RSSetScissorRects(_sg.d3d11.ctx, 1, &rect); + + /* perform clear action */ + for (int i = 0; i < _sg.d3d11.num_rtvs; i++) { + if (action->colors[i].action == SG_ACTION_CLEAR) { + _sg_d3d11_ClearRenderTargetView(_sg.d3d11.ctx, _sg.d3d11.cur_rtvs[i], &action->colors[i].value.r); + } + } + UINT ds_flags = 0; + if (action->depth.action == SG_ACTION_CLEAR) { + ds_flags |= D3D11_CLEAR_DEPTH; + } + if (action->stencil.action == SG_ACTION_CLEAR) { + ds_flags |= D3D11_CLEAR_STENCIL; + } + if ((0 != ds_flags) && _sg.d3d11.cur_dsv) { + _sg_d3d11_ClearDepthStencilView(_sg.d3d11.ctx, _sg.d3d11.cur_dsv, ds_flags, action->depth.value, action->stencil.value); + } +} + +/* D3D11CalcSubresource only exists for C++ */ +_SOKOL_PRIVATE UINT _sg_d3d11_calcsubresource(UINT mip_slice, UINT array_slice, UINT mip_levels) { + return mip_slice + array_slice * mip_levels; +} + +_SOKOL_PRIVATE void _sg_d3d11_end_pass(void) { + SOKOL_ASSERT(_sg.d3d11.in_pass && _sg.d3d11.ctx); + _sg.d3d11.in_pass = false; + + /* need to resolve MSAA render target into texture? */ + if (_sg.d3d11.cur_pass) { + SOKOL_ASSERT(_sg.d3d11.cur_pass->slot.id == _sg.d3d11.cur_pass_id.id); + for (int i = 0; i < _sg.d3d11.num_rtvs; i++) { + _sg_pass_attachment_t* cmn_att = &_sg.d3d11.cur_pass->cmn.color_atts[i]; + _sg_image_t* att_img = _sg.d3d11.cur_pass->d3d11.color_atts[i].image; + SOKOL_ASSERT(att_img && (att_img->slot.id == cmn_att->image_id.id)); + if (att_img->cmn.sample_count > 1) { + /* FIXME: support MSAA resolve into 3D texture */ + SOKOL_ASSERT(att_img->d3d11.tex2d && att_img->d3d11.texmsaa && !att_img->d3d11.tex3d); + SOKOL_ASSERT(DXGI_FORMAT_UNKNOWN != att_img->d3d11.format); + UINT dst_subres = _sg_d3d11_calcsubresource((UINT)cmn_att->mip_level, (UINT)cmn_att->slice, (UINT)att_img->cmn.num_mipmaps); + _sg_d3d11_ResolveSubresource(_sg.d3d11.ctx, + (ID3D11Resource*) att_img->d3d11.tex2d, /* pDstResource */ + dst_subres, /* DstSubresource */ + (ID3D11Resource*) att_img->d3d11.texmsaa, /* pSrcResource */ + 0, /* SrcSubresource */ + att_img->d3d11.format); + } + } + } + _sg.d3d11.cur_pass = 0; + _sg.d3d11.cur_pass_id.id = SG_INVALID_ID; + _sg.d3d11.cur_pipeline = 0; + _sg.d3d11.cur_pipeline_id.id = SG_INVALID_ID; + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + _sg.d3d11.cur_rtvs[i] = 0; + } + _sg.d3d11.cur_dsv = 0; + _sg_d3d11_clear_state(); +} + +_SOKOL_PRIVATE void _sg_d3d11_apply_viewport(int x, int y, int w, int h, bool origin_top_left) { + SOKOL_ASSERT(_sg.d3d11.ctx); + SOKOL_ASSERT(_sg.d3d11.in_pass); + D3D11_VIEWPORT vp; + vp.TopLeftX = (FLOAT) x; + vp.TopLeftY = (FLOAT) (origin_top_left ? y : (_sg.d3d11.cur_height - (y + h))); + vp.Width = (FLOAT) w; + vp.Height = (FLOAT) h; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + _sg_d3d11_RSSetViewports(_sg.d3d11.ctx, 1, &vp); +} + +_SOKOL_PRIVATE void _sg_d3d11_apply_scissor_rect(int x, int y, int w, int h, bool origin_top_left) { + SOKOL_ASSERT(_sg.d3d11.ctx); + SOKOL_ASSERT(_sg.d3d11.in_pass); + D3D11_RECT rect; + rect.left = x; + rect.top = (origin_top_left ? y : (_sg.d3d11.cur_height - (y + h))); + rect.right = x + w; + rect.bottom = origin_top_left ? (y + h) : (_sg.d3d11.cur_height - y); + _sg_d3d11_RSSetScissorRects(_sg.d3d11.ctx, 1, &rect); +} + +_SOKOL_PRIVATE void _sg_d3d11_apply_pipeline(_sg_pipeline_t* pip) { + SOKOL_ASSERT(pip); + SOKOL_ASSERT(pip->shader && (pip->cmn.shader_id.id == pip->shader->slot.id)); + SOKOL_ASSERT(_sg.d3d11.ctx); + SOKOL_ASSERT(_sg.d3d11.in_pass); + SOKOL_ASSERT(pip->d3d11.rs && pip->d3d11.bs && pip->d3d11.dss && pip->d3d11.il); + + _sg.d3d11.cur_pipeline = pip; + _sg.d3d11.cur_pipeline_id.id = pip->slot.id; + _sg.d3d11.use_indexed_draw = (pip->d3d11.index_format != DXGI_FORMAT_UNKNOWN); + _sg.d3d11.use_instanced_draw = pip->cmn.use_instanced_draw; + + _sg_d3d11_RSSetState(_sg.d3d11.ctx, pip->d3d11.rs); + _sg_d3d11_OMSetDepthStencilState(_sg.d3d11.ctx, pip->d3d11.dss, pip->d3d11.stencil_ref); + _sg_d3d11_OMSetBlendState(_sg.d3d11.ctx, pip->d3d11.bs, &pip->cmn.blend_color.r, 0xFFFFFFFF); + _sg_d3d11_IASetPrimitiveTopology(_sg.d3d11.ctx, pip->d3d11.topology); + _sg_d3d11_IASetInputLayout(_sg.d3d11.ctx, pip->d3d11.il); + _sg_d3d11_VSSetShader(_sg.d3d11.ctx, pip->shader->d3d11.vs, NULL, 0); + _sg_d3d11_VSSetConstantBuffers(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_UBS, pip->shader->d3d11.stage[SG_SHADERSTAGE_VS].cbufs); + _sg_d3d11_PSSetShader(_sg.d3d11.ctx, pip->shader->d3d11.fs, NULL, 0); + _sg_d3d11_PSSetConstantBuffers(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_UBS, pip->shader->d3d11.stage[SG_SHADERSTAGE_FS].cbufs); +} + +_SOKOL_PRIVATE void _sg_d3d11_apply_bindings( + _sg_pipeline_t* pip, + _sg_buffer_t** vbs, const int* vb_offsets, int num_vbs, + _sg_buffer_t* ib, int ib_offset, + _sg_image_t** vs_imgs, int num_vs_imgs, + _sg_image_t** fs_imgs, int num_fs_imgs) +{ + SOKOL_ASSERT(pip); + SOKOL_ASSERT(_sg.d3d11.ctx); + SOKOL_ASSERT(_sg.d3d11.in_pass); + + /* gather all the D3D11 resources into arrays */ + ID3D11Buffer* d3d11_ib = ib ? ib->d3d11.buf : 0; + ID3D11Buffer* d3d11_vbs[SG_MAX_SHADERSTAGE_BUFFERS]; + UINT d3d11_vb_offsets[SG_MAX_SHADERSTAGE_BUFFERS]; + ID3D11ShaderResourceView* d3d11_vs_srvs[SG_MAX_SHADERSTAGE_IMAGES]; + ID3D11SamplerState* d3d11_vs_smps[SG_MAX_SHADERSTAGE_IMAGES]; + ID3D11ShaderResourceView* d3d11_fs_srvs[SG_MAX_SHADERSTAGE_IMAGES]; + ID3D11SamplerState* d3d11_fs_smps[SG_MAX_SHADERSTAGE_IMAGES]; + int i; + for (i = 0; i < num_vbs; i++) { + SOKOL_ASSERT(vbs[i]->d3d11.buf); + d3d11_vbs[i] = vbs[i]->d3d11.buf; + d3d11_vb_offsets[i] = (UINT)vb_offsets[i]; + } + for (; i < SG_MAX_SHADERSTAGE_BUFFERS; i++) { + d3d11_vbs[i] = 0; + d3d11_vb_offsets[i] = 0; + } + for (i = 0; i < num_vs_imgs; i++) { + SOKOL_ASSERT(vs_imgs[i]->d3d11.srv); + SOKOL_ASSERT(vs_imgs[i]->d3d11.smp); + d3d11_vs_srvs[i] = vs_imgs[i]->d3d11.srv; + d3d11_vs_smps[i] = vs_imgs[i]->d3d11.smp; + } + for (; i < SG_MAX_SHADERSTAGE_IMAGES; i++) { + d3d11_vs_srvs[i] = 0; + d3d11_vs_smps[i] = 0; + } + for (i = 0; i < num_fs_imgs; i++) { + SOKOL_ASSERT(fs_imgs[i]->d3d11.srv); + SOKOL_ASSERT(fs_imgs[i]->d3d11.smp); + d3d11_fs_srvs[i] = fs_imgs[i]->d3d11.srv; + d3d11_fs_smps[i] = fs_imgs[i]->d3d11.smp; + } + for (; i < SG_MAX_SHADERSTAGE_IMAGES; i++) { + d3d11_fs_srvs[i] = 0; + d3d11_fs_smps[i] = 0; + } + + _sg_d3d11_IASetVertexBuffers(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_BUFFERS, d3d11_vbs, pip->d3d11.vb_strides, d3d11_vb_offsets); + _sg_d3d11_IASetIndexBuffer(_sg.d3d11.ctx, d3d11_ib, pip->d3d11.index_format, (UINT)ib_offset); + _sg_d3d11_VSSetShaderResources(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_IMAGES, d3d11_vs_srvs); + _sg_d3d11_VSSetSamplers(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_IMAGES, d3d11_vs_smps); + _sg_d3d11_PSSetShaderResources(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_IMAGES, d3d11_fs_srvs); + _sg_d3d11_PSSetSamplers(_sg.d3d11.ctx, 0, SG_MAX_SHADERSTAGE_IMAGES, d3d11_fs_smps); +} + +_SOKOL_PRIVATE void _sg_d3d11_apply_uniforms(sg_shader_stage stage_index, int ub_index, const sg_range* data) { + SOKOL_ASSERT(_sg.d3d11.ctx && _sg.d3d11.in_pass); + SOKOL_ASSERT(_sg.d3d11.cur_pipeline && _sg.d3d11.cur_pipeline->slot.id == _sg.d3d11.cur_pipeline_id.id); + SOKOL_ASSERT(_sg.d3d11.cur_pipeline->shader && _sg.d3d11.cur_pipeline->shader->slot.id == _sg.d3d11.cur_pipeline->cmn.shader_id.id); + SOKOL_ASSERT(ub_index < _sg.d3d11.cur_pipeline->shader->cmn.stage[stage_index].num_uniform_blocks); + SOKOL_ASSERT(data->size == _sg.d3d11.cur_pipeline->shader->cmn.stage[stage_index].uniform_blocks[ub_index].size); + ID3D11Buffer* cb = _sg.d3d11.cur_pipeline->shader->d3d11.stage[stage_index].cbufs[ub_index]; + SOKOL_ASSERT(cb); + _sg_d3d11_UpdateSubresource(_sg.d3d11.ctx, (ID3D11Resource*)cb, 0, NULL, data->ptr, 0, 0); +} + +_SOKOL_PRIVATE void _sg_d3d11_draw(int base_element, int num_elements, int num_instances) { + SOKOL_ASSERT(_sg.d3d11.in_pass); + if (_sg.d3d11.use_indexed_draw) { + if (_sg.d3d11.use_instanced_draw) { + _sg_d3d11_DrawIndexedInstanced(_sg.d3d11.ctx, (UINT)num_elements, (UINT)num_instances, (UINT)base_element, 0, 0); + } + else { + _sg_d3d11_DrawIndexed(_sg.d3d11.ctx, (UINT)num_elements, (UINT)base_element, 0); + } + } + else { + if (_sg.d3d11.use_instanced_draw) { + _sg_d3d11_DrawInstanced(_sg.d3d11.ctx, (UINT)num_elements, (UINT)num_instances, (UINT)base_element, 0); + } + else { + _sg_d3d11_Draw(_sg.d3d11.ctx, (UINT)num_elements, (UINT)base_element); + } + } +} + +_SOKOL_PRIVATE void _sg_d3d11_commit(void) { + SOKOL_ASSERT(!_sg.d3d11.in_pass); +} + +_SOKOL_PRIVATE void _sg_d3d11_update_buffer(_sg_buffer_t* buf, const sg_range* data) { + SOKOL_ASSERT(buf && data && data->ptr && (data->size > 0)); + SOKOL_ASSERT(_sg.d3d11.ctx); + SOKOL_ASSERT(buf->d3d11.buf); + D3D11_MAPPED_SUBRESOURCE d3d11_msr; + HRESULT hr = _sg_d3d11_Map(_sg.d3d11.ctx, (ID3D11Resource*)buf->d3d11.buf, 0, D3D11_MAP_WRITE_DISCARD, 0, &d3d11_msr); + if (SUCCEEDED(hr)) { + memcpy(d3d11_msr.pData, data->ptr, data->size); + _sg_d3d11_Unmap(_sg.d3d11.ctx, (ID3D11Resource*)buf->d3d11.buf, 0); + } else { + SOKOL_LOG("failed to map buffer while updating!\n"); + } +} + +_SOKOL_PRIVATE int _sg_d3d11_append_buffer(_sg_buffer_t* buf, const sg_range* data, bool new_frame) { + SOKOL_ASSERT(buf && data && data->ptr && (data->size > 0)); + SOKOL_ASSERT(_sg.d3d11.ctx); + SOKOL_ASSERT(buf->d3d11.buf); + D3D11_MAP map_type = new_frame ? D3D11_MAP_WRITE_DISCARD : D3D11_MAP_WRITE_NO_OVERWRITE; + D3D11_MAPPED_SUBRESOURCE d3d11_msr; + HRESULT hr = _sg_d3d11_Map(_sg.d3d11.ctx, (ID3D11Resource*)buf->d3d11.buf, 0, map_type, 0, &d3d11_msr); + if (SUCCEEDED(hr)) { + uint8_t* dst_ptr = (uint8_t*)d3d11_msr.pData + buf->cmn.append_pos; + memcpy(dst_ptr, data->ptr, data->size); + _sg_d3d11_Unmap(_sg.d3d11.ctx, (ID3D11Resource*)buf->d3d11.buf, 0); + } else { + SOKOL_LOG("failed to map buffer while appending!\n"); + } + /* NOTE: this alignment is a requirement from WebGPU, but we want identical behaviour across all backend */ + return _sg_roundup((int)data->size, 4); +} + +_SOKOL_PRIVATE void _sg_d3d11_update_image(_sg_image_t* img, const sg_image_data* data) { + SOKOL_ASSERT(img && data); + SOKOL_ASSERT(_sg.d3d11.ctx); + SOKOL_ASSERT(img->d3d11.tex2d || img->d3d11.tex3d); + ID3D11Resource* d3d11_res = 0; + if (img->d3d11.tex3d) { + d3d11_res = (ID3D11Resource*) img->d3d11.tex3d; + } + else { + d3d11_res = (ID3D11Resource*) img->d3d11.tex2d; + } + SOKOL_ASSERT(d3d11_res); + const int num_faces = (img->cmn.type == SG_IMAGETYPE_CUBE) ? 6:1; + const int num_slices = (img->cmn.type == SG_IMAGETYPE_ARRAY) ? img->cmn.num_slices:1; + UINT subres_index = 0; + HRESULT hr; + D3D11_MAPPED_SUBRESOURCE d3d11_msr; + for (int face_index = 0; face_index < num_faces; face_index++) { + for (int slice_index = 0; slice_index < num_slices; slice_index++) { + for (int mip_index = 0; mip_index < img->cmn.num_mipmaps; mip_index++, subres_index++) { + SOKOL_ASSERT(subres_index < (SG_MAX_MIPMAPS * SG_MAX_TEXTUREARRAY_LAYERS)); + const int mip_width = ((img->cmn.width>>mip_index)>0) ? img->cmn.width>>mip_index : 1; + const int mip_height = ((img->cmn.height>>mip_index)>0) ? img->cmn.height>>mip_index : 1; + const int src_pitch = _sg_row_pitch(img->cmn.pixel_format, mip_width, 1); + const sg_range* subimg_data = &(data->subimage[face_index][mip_index]); + const size_t slice_size = subimg_data->size / (size_t)num_slices; + const size_t slice_offset = slice_size * (size_t)slice_index; + const uint8_t* slice_ptr = ((const uint8_t*)subimg_data->ptr) + slice_offset; + hr = _sg_d3d11_Map(_sg.d3d11.ctx, d3d11_res, subres_index, D3D11_MAP_WRITE_DISCARD, 0, &d3d11_msr); + if (SUCCEEDED(hr)) { + /* FIXME: need to handle difference in depth-pitch for 3D textures as well! */ + if (src_pitch == (int)d3d11_msr.RowPitch) { + memcpy(d3d11_msr.pData, slice_ptr, slice_size); + } + else { + SOKOL_ASSERT(src_pitch < (int)d3d11_msr.RowPitch); + const uint8_t* src_ptr = slice_ptr; + uint8_t* dst_ptr = (uint8_t*) d3d11_msr.pData; + for (int row_index = 0; row_index < mip_height; row_index++) { + memcpy(dst_ptr, src_ptr, (size_t)src_pitch); + src_ptr += src_pitch; + dst_ptr += d3d11_msr.RowPitch; + } + } + _sg_d3d11_Unmap(_sg.d3d11.ctx, d3d11_res, subres_index); + } else { + SOKOL_LOG("failed to map texture!\n"); + } + } + } + } +} + +/*== METAL BACKEND IMPLEMENTATION ============================================*/ +#elif defined(SOKOL_METAL) + +#if __has_feature(objc_arc) +#define _SG_OBJC_RETAIN(obj) { } +#define _SG_OBJC_RELEASE(obj) { obj = nil; } +#define _SG_OBJC_RELEASE_WITH_NULL(obj) { obj = [NSNull null]; } +#else +#define _SG_OBJC_RETAIN(obj) { [obj retain]; } +#define _SG_OBJC_RELEASE(obj) { [obj release]; obj = nil; } +#define _SG_OBJC_RELEASE_WITH_NULL(obj) { [obj release]; obj = [NSNull null]; } +#endif + +/*-- enum translation functions ----------------------------------------------*/ +_SOKOL_PRIVATE MTLLoadAction _sg_mtl_load_action(sg_action a) { + switch (a) { + case SG_ACTION_CLEAR: return MTLLoadActionClear; + case SG_ACTION_LOAD: return MTLLoadActionLoad; + case SG_ACTION_DONTCARE: return MTLLoadActionDontCare; + default: SOKOL_UNREACHABLE; return (MTLLoadAction)0; + } +} + +_SOKOL_PRIVATE MTLResourceOptions _sg_mtl_buffer_resource_options(sg_usage usg) { + switch (usg) { + case SG_USAGE_IMMUTABLE: + #if defined(_SG_TARGET_MACOS) + return MTLResourceStorageModeManaged; + #else + return MTLResourceStorageModeShared; + #endif + case SG_USAGE_DYNAMIC: + case SG_USAGE_STREAM: + #if defined(_SG_TARGET_MACOS) + return MTLResourceCPUCacheModeWriteCombined|MTLResourceStorageModeManaged; + #else + return MTLResourceCPUCacheModeWriteCombined|MTLResourceStorageModeShared; + #endif + default: + SOKOL_UNREACHABLE; + return 0; + } +} + +_SOKOL_PRIVATE MTLVertexStepFunction _sg_mtl_step_function(sg_vertex_step step) { + switch (step) { + case SG_VERTEXSTEP_PER_VERTEX: return MTLVertexStepFunctionPerVertex; + case SG_VERTEXSTEP_PER_INSTANCE: return MTLVertexStepFunctionPerInstance; + default: SOKOL_UNREACHABLE; return (MTLVertexStepFunction)0; + } +} + +_SOKOL_PRIVATE MTLVertexFormat _sg_mtl_vertex_format(sg_vertex_format fmt) { + switch (fmt) { + case SG_VERTEXFORMAT_FLOAT: return MTLVertexFormatFloat; + case SG_VERTEXFORMAT_FLOAT2: return MTLVertexFormatFloat2; + case SG_VERTEXFORMAT_FLOAT3: return MTLVertexFormatFloat3; + case SG_VERTEXFORMAT_FLOAT4: return MTLVertexFormatFloat4; + case SG_VERTEXFORMAT_BYTE4: return MTLVertexFormatChar4; + case SG_VERTEXFORMAT_BYTE4N: return MTLVertexFormatChar4Normalized; + case SG_VERTEXFORMAT_UBYTE4: return MTLVertexFormatUChar4; + case SG_VERTEXFORMAT_UBYTE4N: return MTLVertexFormatUChar4Normalized; + case SG_VERTEXFORMAT_SHORT2: return MTLVertexFormatShort2; + case SG_VERTEXFORMAT_SHORT2N: return MTLVertexFormatShort2Normalized; + case SG_VERTEXFORMAT_USHORT2N: return MTLVertexFormatUShort2Normalized; + case SG_VERTEXFORMAT_SHORT4: return MTLVertexFormatShort4; + case SG_VERTEXFORMAT_SHORT4N: return MTLVertexFormatShort4Normalized; + case SG_VERTEXFORMAT_USHORT4N: return MTLVertexFormatUShort4Normalized; + case SG_VERTEXFORMAT_UINT10_N2: return MTLVertexFormatUInt1010102Normalized; + default: SOKOL_UNREACHABLE; return (MTLVertexFormat)0; + } +} + +_SOKOL_PRIVATE MTLPrimitiveType _sg_mtl_primitive_type(sg_primitive_type t) { + switch (t) { + case SG_PRIMITIVETYPE_POINTS: return MTLPrimitiveTypePoint; + case SG_PRIMITIVETYPE_LINES: return MTLPrimitiveTypeLine; + case SG_PRIMITIVETYPE_LINE_STRIP: return MTLPrimitiveTypeLineStrip; + case SG_PRIMITIVETYPE_TRIANGLES: return MTLPrimitiveTypeTriangle; + case SG_PRIMITIVETYPE_TRIANGLE_STRIP: return MTLPrimitiveTypeTriangleStrip; + default: SOKOL_UNREACHABLE; return (MTLPrimitiveType)0; + } +} + +_SOKOL_PRIVATE MTLPixelFormat _sg_mtl_pixel_format(sg_pixel_format fmt) { + switch (fmt) { + case SG_PIXELFORMAT_R8: return MTLPixelFormatR8Unorm; + case SG_PIXELFORMAT_R8SN: return MTLPixelFormatR8Snorm; + case SG_PIXELFORMAT_R8UI: return MTLPixelFormatR8Uint; + case SG_PIXELFORMAT_R8SI: return MTLPixelFormatR8Sint; + case SG_PIXELFORMAT_R16: return MTLPixelFormatR16Unorm; + case SG_PIXELFORMAT_R16SN: return MTLPixelFormatR16Snorm; + case SG_PIXELFORMAT_R16UI: return MTLPixelFormatR16Uint; + case SG_PIXELFORMAT_R16SI: return MTLPixelFormatR16Sint; + case SG_PIXELFORMAT_R16F: return MTLPixelFormatR16Float; + case SG_PIXELFORMAT_RG8: return MTLPixelFormatRG8Unorm; + case SG_PIXELFORMAT_RG8SN: return MTLPixelFormatRG8Snorm; + case SG_PIXELFORMAT_RG8UI: return MTLPixelFormatRG8Uint; + case SG_PIXELFORMAT_RG8SI: return MTLPixelFormatRG8Sint; + case SG_PIXELFORMAT_R32UI: return MTLPixelFormatR32Uint; + case SG_PIXELFORMAT_R32SI: return MTLPixelFormatR32Sint; + case SG_PIXELFORMAT_R32F: return MTLPixelFormatR32Float; + case SG_PIXELFORMAT_RG16: return MTLPixelFormatRG16Unorm; + case SG_PIXELFORMAT_RG16SN: return MTLPixelFormatRG16Snorm; + case SG_PIXELFORMAT_RG16UI: return MTLPixelFormatRG16Uint; + case SG_PIXELFORMAT_RG16SI: return MTLPixelFormatRG16Sint; + case SG_PIXELFORMAT_RG16F: return MTLPixelFormatRG16Float; + case SG_PIXELFORMAT_RGBA8: return MTLPixelFormatRGBA8Unorm; + case SG_PIXELFORMAT_RGBA8SN: return MTLPixelFormatRGBA8Snorm; + case SG_PIXELFORMAT_RGBA8UI: return MTLPixelFormatRGBA8Uint; + case SG_PIXELFORMAT_RGBA8SI: return MTLPixelFormatRGBA8Sint; + case SG_PIXELFORMAT_BGRA8: return MTLPixelFormatBGRA8Unorm; + case SG_PIXELFORMAT_RGB10A2: return MTLPixelFormatRGB10A2Unorm; + case SG_PIXELFORMAT_RG11B10F: return MTLPixelFormatRG11B10Float; + case SG_PIXELFORMAT_RG32UI: return MTLPixelFormatRG32Uint; + case SG_PIXELFORMAT_RG32SI: return MTLPixelFormatRG32Sint; + case SG_PIXELFORMAT_RG32F: return MTLPixelFormatRG32Float; + case SG_PIXELFORMAT_RGBA16: return MTLPixelFormatRGBA16Unorm; + case SG_PIXELFORMAT_RGBA16SN: return MTLPixelFormatRGBA16Snorm; + case SG_PIXELFORMAT_RGBA16UI: return MTLPixelFormatRGBA16Uint; + case SG_PIXELFORMAT_RGBA16SI: return MTLPixelFormatRGBA16Sint; + case SG_PIXELFORMAT_RGBA16F: return MTLPixelFormatRGBA16Float; + case SG_PIXELFORMAT_RGBA32UI: return MTLPixelFormatRGBA32Uint; + case SG_PIXELFORMAT_RGBA32SI: return MTLPixelFormatRGBA32Sint; + case SG_PIXELFORMAT_RGBA32F: return MTLPixelFormatRGBA32Float; + case SG_PIXELFORMAT_DEPTH: return MTLPixelFormatDepth32Float; + case SG_PIXELFORMAT_DEPTH_STENCIL: return MTLPixelFormatDepth32Float_Stencil8; + #if defined(_SG_TARGET_MACOS) + case SG_PIXELFORMAT_BC1_RGBA: return MTLPixelFormatBC1_RGBA; + case SG_PIXELFORMAT_BC2_RGBA: return MTLPixelFormatBC2_RGBA; + case SG_PIXELFORMAT_BC3_RGBA: return MTLPixelFormatBC3_RGBA; + case SG_PIXELFORMAT_BC4_R: return MTLPixelFormatBC4_RUnorm; + case SG_PIXELFORMAT_BC4_RSN: return MTLPixelFormatBC4_RSnorm; + case SG_PIXELFORMAT_BC5_RG: return MTLPixelFormatBC5_RGUnorm; + case SG_PIXELFORMAT_BC5_RGSN: return MTLPixelFormatBC5_RGSnorm; + case SG_PIXELFORMAT_BC6H_RGBF: return MTLPixelFormatBC6H_RGBFloat; + case SG_PIXELFORMAT_BC6H_RGBUF: return MTLPixelFormatBC6H_RGBUfloat; + case SG_PIXELFORMAT_BC7_RGBA: return MTLPixelFormatBC7_RGBAUnorm; + #else + case SG_PIXELFORMAT_PVRTC_RGB_2BPP: return MTLPixelFormatPVRTC_RGB_2BPP; + case SG_PIXELFORMAT_PVRTC_RGB_4BPP: return MTLPixelFormatPVRTC_RGB_4BPP; + case SG_PIXELFORMAT_PVRTC_RGBA_2BPP: return MTLPixelFormatPVRTC_RGBA_2BPP; + case SG_PIXELFORMAT_PVRTC_RGBA_4BPP: return MTLPixelFormatPVRTC_RGBA_4BPP; + case SG_PIXELFORMAT_ETC2_RGB8: return MTLPixelFormatETC2_RGB8; + case SG_PIXELFORMAT_ETC2_RGB8A1: return MTLPixelFormatETC2_RGB8A1; + case SG_PIXELFORMAT_ETC2_RGBA8: return MTLPixelFormatEAC_RGBA8; + case SG_PIXELFORMAT_ETC2_RG11: return MTLPixelFormatEAC_RG11Unorm; + case SG_PIXELFORMAT_ETC2_RG11SN: return MTLPixelFormatEAC_RG11Snorm; + #endif + default: return MTLPixelFormatInvalid; + } +} + +_SOKOL_PRIVATE MTLColorWriteMask _sg_mtl_color_write_mask(sg_color_mask m) { + MTLColorWriteMask mtl_mask = MTLColorWriteMaskNone; + if (m & SG_COLORMASK_R) { + mtl_mask |= MTLColorWriteMaskRed; + } + if (m & SG_COLORMASK_G) { + mtl_mask |= MTLColorWriteMaskGreen; + } + if (m & SG_COLORMASK_B) { + mtl_mask |= MTLColorWriteMaskBlue; + } + if (m & SG_COLORMASK_A) { + mtl_mask |= MTLColorWriteMaskAlpha; + } + return mtl_mask; +} + +_SOKOL_PRIVATE MTLBlendOperation _sg_mtl_blend_op(sg_blend_op op) { + switch (op) { + case SG_BLENDOP_ADD: return MTLBlendOperationAdd; + case SG_BLENDOP_SUBTRACT: return MTLBlendOperationSubtract; + case SG_BLENDOP_REVERSE_SUBTRACT: return MTLBlendOperationReverseSubtract; + default: SOKOL_UNREACHABLE; return (MTLBlendOperation)0; + } +} + +_SOKOL_PRIVATE MTLBlendFactor _sg_mtl_blend_factor(sg_blend_factor f) { + switch (f) { + case SG_BLENDFACTOR_ZERO: return MTLBlendFactorZero; + case SG_BLENDFACTOR_ONE: return MTLBlendFactorOne; + case SG_BLENDFACTOR_SRC_COLOR: return MTLBlendFactorSourceColor; + case SG_BLENDFACTOR_ONE_MINUS_SRC_COLOR: return MTLBlendFactorOneMinusSourceColor; + case SG_BLENDFACTOR_SRC_ALPHA: return MTLBlendFactorSourceAlpha; + case SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA: return MTLBlendFactorOneMinusSourceAlpha; + case SG_BLENDFACTOR_DST_COLOR: return MTLBlendFactorDestinationColor; + case SG_BLENDFACTOR_ONE_MINUS_DST_COLOR: return MTLBlendFactorOneMinusDestinationColor; + case SG_BLENDFACTOR_DST_ALPHA: return MTLBlendFactorDestinationAlpha; + case SG_BLENDFACTOR_ONE_MINUS_DST_ALPHA: return MTLBlendFactorOneMinusDestinationAlpha; + case SG_BLENDFACTOR_SRC_ALPHA_SATURATED: return MTLBlendFactorSourceAlphaSaturated; + case SG_BLENDFACTOR_BLEND_COLOR: return MTLBlendFactorBlendColor; + case SG_BLENDFACTOR_ONE_MINUS_BLEND_COLOR: return MTLBlendFactorOneMinusBlendColor; + case SG_BLENDFACTOR_BLEND_ALPHA: return MTLBlendFactorBlendAlpha; + case SG_BLENDFACTOR_ONE_MINUS_BLEND_ALPHA: return MTLBlendFactorOneMinusBlendAlpha; + default: SOKOL_UNREACHABLE; return (MTLBlendFactor)0; + } +} + +_SOKOL_PRIVATE MTLCompareFunction _sg_mtl_compare_func(sg_compare_func f) { + switch (f) { + case SG_COMPAREFUNC_NEVER: return MTLCompareFunctionNever; + case SG_COMPAREFUNC_LESS: return MTLCompareFunctionLess; + case SG_COMPAREFUNC_EQUAL: return MTLCompareFunctionEqual; + case SG_COMPAREFUNC_LESS_EQUAL: return MTLCompareFunctionLessEqual; + case SG_COMPAREFUNC_GREATER: return MTLCompareFunctionGreater; + case SG_COMPAREFUNC_NOT_EQUAL: return MTLCompareFunctionNotEqual; + case SG_COMPAREFUNC_GREATER_EQUAL: return MTLCompareFunctionGreaterEqual; + case SG_COMPAREFUNC_ALWAYS: return MTLCompareFunctionAlways; + default: SOKOL_UNREACHABLE; return (MTLCompareFunction)0; + } +} + +_SOKOL_PRIVATE MTLStencilOperation _sg_mtl_stencil_op(sg_stencil_op op) { + switch (op) { + case SG_STENCILOP_KEEP: return MTLStencilOperationKeep; + case SG_STENCILOP_ZERO: return MTLStencilOperationZero; + case SG_STENCILOP_REPLACE: return MTLStencilOperationReplace; + case SG_STENCILOP_INCR_CLAMP: return MTLStencilOperationIncrementClamp; + case SG_STENCILOP_DECR_CLAMP: return MTLStencilOperationDecrementClamp; + case SG_STENCILOP_INVERT: return MTLStencilOperationInvert; + case SG_STENCILOP_INCR_WRAP: return MTLStencilOperationIncrementWrap; + case SG_STENCILOP_DECR_WRAP: return MTLStencilOperationDecrementWrap; + default: SOKOL_UNREACHABLE; return (MTLStencilOperation)0; + } +} + +_SOKOL_PRIVATE MTLCullMode _sg_mtl_cull_mode(sg_cull_mode m) { + switch (m) { + case SG_CULLMODE_NONE: return MTLCullModeNone; + case SG_CULLMODE_FRONT: return MTLCullModeFront; + case SG_CULLMODE_BACK: return MTLCullModeBack; + default: SOKOL_UNREACHABLE; return (MTLCullMode)0; + } +} + +_SOKOL_PRIVATE MTLWinding _sg_mtl_winding(sg_face_winding w) { + switch (w) { + case SG_FACEWINDING_CW: return MTLWindingClockwise; + case SG_FACEWINDING_CCW: return MTLWindingCounterClockwise; + default: SOKOL_UNREACHABLE; return (MTLWinding)0; + } +} + +_SOKOL_PRIVATE MTLIndexType _sg_mtl_index_type(sg_index_type t) { + switch (t) { + case SG_INDEXTYPE_UINT16: return MTLIndexTypeUInt16; + case SG_INDEXTYPE_UINT32: return MTLIndexTypeUInt32; + default: SOKOL_UNREACHABLE; return (MTLIndexType)0; + } +} + +_SOKOL_PRIVATE int _sg_mtl_index_size(sg_index_type t) { + switch (t) { + case SG_INDEXTYPE_NONE: return 0; + case SG_INDEXTYPE_UINT16: return 2; + case SG_INDEXTYPE_UINT32: return 4; + default: SOKOL_UNREACHABLE; return 0; + } +} + +_SOKOL_PRIVATE MTLTextureType _sg_mtl_texture_type(sg_image_type t) { + switch (t) { + case SG_IMAGETYPE_2D: return MTLTextureType2D; + case SG_IMAGETYPE_CUBE: return MTLTextureTypeCube; + case SG_IMAGETYPE_3D: return MTLTextureType3D; + case SG_IMAGETYPE_ARRAY: return MTLTextureType2DArray; + default: SOKOL_UNREACHABLE; return (MTLTextureType)0; + } +} + +_SOKOL_PRIVATE bool _sg_mtl_is_pvrtc(sg_pixel_format fmt) { + switch (fmt) { + case SG_PIXELFORMAT_PVRTC_RGB_2BPP: + case SG_PIXELFORMAT_PVRTC_RGB_4BPP: + case SG_PIXELFORMAT_PVRTC_RGBA_2BPP: + case SG_PIXELFORMAT_PVRTC_RGBA_4BPP: + return true; + default: + return false; + } +} + +_SOKOL_PRIVATE MTLSamplerAddressMode _sg_mtl_address_mode(sg_wrap w) { + switch (w) { + case SG_WRAP_REPEAT: return MTLSamplerAddressModeRepeat; + case SG_WRAP_CLAMP_TO_EDGE: return MTLSamplerAddressModeClampToEdge; + #if defined(_SG_TARGET_MACOS) + case SG_WRAP_CLAMP_TO_BORDER: return MTLSamplerAddressModeClampToBorderColor; + #else + /* clamp-to-border not supported on iOS, fall back to clamp-to-edge */ + case SG_WRAP_CLAMP_TO_BORDER: return MTLSamplerAddressModeClampToEdge; + #endif + case SG_WRAP_MIRRORED_REPEAT: return MTLSamplerAddressModeMirrorRepeat; + default: SOKOL_UNREACHABLE; return (MTLSamplerAddressMode)0; + } +} + +#if defined(_SG_TARGET_MACOS) +_SOKOL_PRIVATE MTLSamplerBorderColor _sg_mtl_border_color(sg_border_color c) { + switch (c) { + case SG_BORDERCOLOR_TRANSPARENT_BLACK: return MTLSamplerBorderColorTransparentBlack; + case SG_BORDERCOLOR_OPAQUE_BLACK: return MTLSamplerBorderColorOpaqueBlack; + case SG_BORDERCOLOR_OPAQUE_WHITE: return MTLSamplerBorderColorOpaqueWhite; + default: SOKOL_UNREACHABLE; return (MTLSamplerBorderColor)0; + } +} +#endif + +_SOKOL_PRIVATE MTLSamplerMinMagFilter _sg_mtl_minmag_filter(sg_filter f) { + switch (f) { + case SG_FILTER_NEAREST: + case SG_FILTER_NEAREST_MIPMAP_NEAREST: + case SG_FILTER_NEAREST_MIPMAP_LINEAR: + return MTLSamplerMinMagFilterNearest; + case SG_FILTER_LINEAR: + case SG_FILTER_LINEAR_MIPMAP_NEAREST: + case SG_FILTER_LINEAR_MIPMAP_LINEAR: + return MTLSamplerMinMagFilterLinear; + default: + SOKOL_UNREACHABLE; return (MTLSamplerMinMagFilter)0; + } +} + +_SOKOL_PRIVATE MTLSamplerMipFilter _sg_mtl_mip_filter(sg_filter f) { + switch (f) { + case SG_FILTER_NEAREST: + case SG_FILTER_LINEAR: + return MTLSamplerMipFilterNotMipmapped; + case SG_FILTER_NEAREST_MIPMAP_NEAREST: + case SG_FILTER_LINEAR_MIPMAP_NEAREST: + return MTLSamplerMipFilterNearest; + case SG_FILTER_NEAREST_MIPMAP_LINEAR: + case SG_FILTER_LINEAR_MIPMAP_LINEAR: + return MTLSamplerMipFilterLinear; + default: + SOKOL_UNREACHABLE; return (MTLSamplerMipFilter)0; + } +} + +/*-- a pool for all Metal resource objects, with deferred release queue -------*/ + +_SOKOL_PRIVATE void _sg_mtl_init_pool(const sg_desc* desc) { + _sg.mtl.idpool.num_slots = 2 * + ( + 2 * desc->buffer_pool_size + + 5 * desc->image_pool_size + + 4 * desc->shader_pool_size + + 2 * desc->pipeline_pool_size + + desc->pass_pool_size + ); + _sg.mtl.idpool.pool = [NSMutableArray arrayWithCapacity:(NSUInteger)_sg.mtl.idpool.num_slots]; + _SG_OBJC_RETAIN(_sg.mtl.idpool.pool); + NSNull* null = [NSNull null]; + for (int i = 0; i < _sg.mtl.idpool.num_slots; i++) { + [_sg.mtl.idpool.pool addObject:null]; + } + SOKOL_ASSERT([_sg.mtl.idpool.pool count] == (NSUInteger)_sg.mtl.idpool.num_slots); + /* a queue of currently free slot indices */ + _sg.mtl.idpool.free_queue_top = 0; + _sg.mtl.idpool.free_queue = (int*)SOKOL_MALLOC((size_t)_sg.mtl.idpool.num_slots * sizeof(int)); + /* pool slot 0 is reserved! */ + for (int i = _sg.mtl.idpool.num_slots-1; i >= 1; i--) { + _sg.mtl.idpool.free_queue[_sg.mtl.idpool.free_queue_top++] = i; + } + /* a circular queue which holds release items (frame index + when a resource is to be released, and the resource's + pool index + */ + _sg.mtl.idpool.release_queue_front = 0; + _sg.mtl.idpool.release_queue_back = 0; + _sg.mtl.idpool.release_queue = (_sg_mtl_release_item_t*)SOKOL_MALLOC((size_t)_sg.mtl.idpool.num_slots * sizeof(_sg_mtl_release_item_t)); + for (int i = 0; i < _sg.mtl.idpool.num_slots; i++) { + _sg.mtl.idpool.release_queue[i].frame_index = 0; + _sg.mtl.idpool.release_queue[i].slot_index = _SG_MTL_INVALID_SLOT_INDEX; + } +} + +_SOKOL_PRIVATE void _sg_mtl_destroy_pool(void) { + SOKOL_FREE(_sg.mtl.idpool.release_queue); _sg.mtl.idpool.release_queue = 0; + SOKOL_FREE(_sg.mtl.idpool.free_queue); _sg.mtl.idpool.free_queue = 0; + _SG_OBJC_RELEASE(_sg.mtl.idpool.pool); +} + +/* get a new free resource pool slot */ +_SOKOL_PRIVATE int _sg_mtl_alloc_pool_slot(void) { + SOKOL_ASSERT(_sg.mtl.idpool.free_queue_top > 0); + const int slot_index = _sg.mtl.idpool.free_queue[--_sg.mtl.idpool.free_queue_top]; + SOKOL_ASSERT((slot_index > 0) && (slot_index < _sg.mtl.idpool.num_slots)); + return slot_index; +} + +/* put a free resource pool slot back into the free-queue */ +_SOKOL_PRIVATE void _sg_mtl_free_pool_slot(int slot_index) { + SOKOL_ASSERT(_sg.mtl.idpool.free_queue_top < _sg.mtl.idpool.num_slots); + SOKOL_ASSERT((slot_index > 0) && (slot_index < _sg.mtl.idpool.num_slots)); + _sg.mtl.idpool.free_queue[_sg.mtl.idpool.free_queue_top++] = slot_index; +} + +/* add an MTLResource to the pool, return pool index or 0 if input was 'nil' */ +_SOKOL_PRIVATE int _sg_mtl_add_resource(id res) { + if (nil == res) { + return _SG_MTL_INVALID_SLOT_INDEX; + } + const int slot_index = _sg_mtl_alloc_pool_slot(); + SOKOL_ASSERT([NSNull null] == _sg.mtl.idpool.pool[(NSUInteger)slot_index]); + _sg.mtl.idpool.pool[(NSUInteger)slot_index] = res; + return slot_index; +} + +/* mark an MTLResource for release, this will put the resource into the + deferred-release queue, and the resource will then be released N frames later, + the special pool index 0 will be ignored (this means that a nil + value was provided to _sg_mtl_add_resource() +*/ +_SOKOL_PRIVATE void _sg_mtl_release_resource(uint32_t frame_index, int slot_index) { + if (slot_index == _SG_MTL_INVALID_SLOT_INDEX) { + return; + } + SOKOL_ASSERT((slot_index > 0) && (slot_index < _sg.mtl.idpool.num_slots)); + SOKOL_ASSERT([NSNull null] != _sg.mtl.idpool.pool[(NSUInteger)slot_index]); + int release_index = _sg.mtl.idpool.release_queue_front++; + if (_sg.mtl.idpool.release_queue_front >= _sg.mtl.idpool.num_slots) { + /* wrap-around */ + _sg.mtl.idpool.release_queue_front = 0; + } + /* release queue full? */ + SOKOL_ASSERT(_sg.mtl.idpool.release_queue_front != _sg.mtl.idpool.release_queue_back); + SOKOL_ASSERT(0 == _sg.mtl.idpool.release_queue[release_index].frame_index); + const uint32_t safe_to_release_frame_index = frame_index + SG_NUM_INFLIGHT_FRAMES + 1; + _sg.mtl.idpool.release_queue[release_index].frame_index = safe_to_release_frame_index; + _sg.mtl.idpool.release_queue[release_index].slot_index = slot_index; +} + +/* run garbage-collection pass on all resources in the release-queue */ +_SOKOL_PRIVATE void _sg_mtl_garbage_collect(uint32_t frame_index) { + while (_sg.mtl.idpool.release_queue_back != _sg.mtl.idpool.release_queue_front) { + if (frame_index < _sg.mtl.idpool.release_queue[_sg.mtl.idpool.release_queue_back].frame_index) { + /* don't need to check further, release-items past this are too young */ + break; + } + /* safe to release this resource */ + const int slot_index = _sg.mtl.idpool.release_queue[_sg.mtl.idpool.release_queue_back].slot_index; + SOKOL_ASSERT((slot_index > 0) && (slot_index < _sg.mtl.idpool.num_slots)); + SOKOL_ASSERT(_sg.mtl.idpool.pool[(NSUInteger)slot_index] != [NSNull null]); + _SG_OBJC_RELEASE_WITH_NULL(_sg.mtl.idpool.pool[(NSUInteger)slot_index]); + /* put the now free pool index back on the free queue */ + _sg_mtl_free_pool_slot(slot_index); + /* reset the release queue slot and advance the back index */ + _sg.mtl.idpool.release_queue[_sg.mtl.idpool.release_queue_back].frame_index = 0; + _sg.mtl.idpool.release_queue[_sg.mtl.idpool.release_queue_back].slot_index = _SG_MTL_INVALID_SLOT_INDEX; + _sg.mtl.idpool.release_queue_back++; + if (_sg.mtl.idpool.release_queue_back >= _sg.mtl.idpool.num_slots) { + /* wrap-around */ + _sg.mtl.idpool.release_queue_back = 0; + } + } +} + +_SOKOL_PRIVATE id _sg_mtl_id(int slot_index) { + return _sg.mtl.idpool.pool[(NSUInteger)slot_index]; +} + +_SOKOL_PRIVATE void _sg_mtl_init_sampler_cache(const sg_desc* desc) { + SOKOL_ASSERT(desc->sampler_cache_size > 0); + _sg_smpcache_init(&_sg.mtl.sampler_cache, desc->sampler_cache_size); +} + +/* destroy the sampler cache, and release all sampler objects */ +_SOKOL_PRIVATE void _sg_mtl_destroy_sampler_cache(uint32_t frame_index) { + SOKOL_ASSERT(_sg.mtl.sampler_cache.items); + SOKOL_ASSERT(_sg.mtl.sampler_cache.num_items <= _sg.mtl.sampler_cache.capacity); + for (int i = 0; i < _sg.mtl.sampler_cache.num_items; i++) { + _sg_mtl_release_resource(frame_index, (int)_sg_smpcache_sampler(&_sg.mtl.sampler_cache, i)); + } + _sg_smpcache_discard(&_sg.mtl.sampler_cache); +} + +/* + create and add an MTLSamplerStateObject and return its resource pool index, + reuse identical sampler state if one exists +*/ +_SOKOL_PRIVATE int _sg_mtl_create_sampler(id mtl_device, const sg_image_desc* img_desc) { + SOKOL_ASSERT(img_desc); + int index = _sg_smpcache_find_item(&_sg.mtl.sampler_cache, img_desc); + if (index >= 0) { + /* reuse existing sampler */ + return (int)_sg_smpcache_sampler(&_sg.mtl.sampler_cache, index); + } + else { + /* create a new Metal sampler state object and add to sampler cache */ + MTLSamplerDescriptor* mtl_desc = [[MTLSamplerDescriptor alloc] init]; + mtl_desc.sAddressMode = _sg_mtl_address_mode(img_desc->wrap_u); + mtl_desc.tAddressMode = _sg_mtl_address_mode(img_desc->wrap_v); + if (SG_IMAGETYPE_3D == img_desc->type) { + mtl_desc.rAddressMode = _sg_mtl_address_mode(img_desc->wrap_w); + } + #if defined(_SG_TARGET_MACOS) + mtl_desc.borderColor = _sg_mtl_border_color(img_desc->border_color); + #endif + mtl_desc.minFilter = _sg_mtl_minmag_filter(img_desc->min_filter); + mtl_desc.magFilter = _sg_mtl_minmag_filter(img_desc->mag_filter); + mtl_desc.mipFilter = _sg_mtl_mip_filter(img_desc->min_filter); + mtl_desc.lodMinClamp = img_desc->min_lod; + mtl_desc.lodMaxClamp = img_desc->max_lod; + mtl_desc.maxAnisotropy = img_desc->max_anisotropy; + mtl_desc.normalizedCoordinates = YES; + id mtl_sampler = [mtl_device newSamplerStateWithDescriptor:mtl_desc]; + _SG_OBJC_RELEASE(mtl_desc); + int sampler_handle = _sg_mtl_add_resource(mtl_sampler); + _sg_smpcache_add_item(&_sg.mtl.sampler_cache, img_desc, (uintptr_t)sampler_handle); + return sampler_handle; + } +} + +_SOKOL_PRIVATE void _sg_mtl_clear_state_cache(void) { + memset(&_sg.mtl.state_cache, 0, sizeof(_sg.mtl.state_cache)); +} + +/* https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf */ +_SOKOL_PRIVATE void _sg_mtl_init_caps(void) { + #if defined(_SG_TARGET_MACOS) + _sg.backend = SG_BACKEND_METAL_MACOS; + #elif defined(_SG_TARGET_IOS) + #if defined(_SG_TARGET_IOS_SIMULATOR) + _sg.backend = SG_BACKEND_METAL_SIMULATOR; + #else + _sg.backend = SG_BACKEND_METAL_IOS; + #endif + #endif + _sg.features.instancing = true; + _sg.features.origin_top_left = true; + _sg.features.multiple_render_targets = true; + _sg.features.msaa_render_targets = true; + _sg.features.imagetype_3d = true; + _sg.features.imagetype_array = true; + #if defined(_SG_TARGET_MACOS) + _sg.features.image_clamp_to_border = true; + #else + _sg.features.image_clamp_to_border = false; + #endif + _sg.features.mrt_independent_blend_state = true; + _sg.features.mrt_independent_write_mask = true; + + #if defined(_SG_TARGET_MACOS) + _sg.limits.max_image_size_2d = 16 * 1024; + _sg.limits.max_image_size_cube = 16 * 1024; + _sg.limits.max_image_size_3d = 2 * 1024; + _sg.limits.max_image_size_array = 16 * 1024; + _sg.limits.max_image_array_layers = 2 * 1024; + #else + /* newer iOS devices support 16k textures */ + _sg.limits.max_image_size_2d = 8 * 1024; + _sg.limits.max_image_size_cube = 8 * 1024; + _sg.limits.max_image_size_3d = 2 * 1024; + _sg.limits.max_image_size_array = 8 * 1024; + _sg.limits.max_image_array_layers = 2 * 1024; + #endif + _sg.limits.max_vertex_attrs = SG_MAX_VERTEX_ATTRIBUTES; + + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R8]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R8SN]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R8UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R8SI]); + #if defined(_SG_TARGET_MACOS) + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R16]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R16SN]); + #else + _sg_pixelformat_sfbr(&_sg.formats[SG_PIXELFORMAT_R16]); + _sg_pixelformat_sfbr(&_sg.formats[SG_PIXELFORMAT_R16SN]); + #endif + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R16UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R16SI]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R16F]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG8]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG8SN]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG8UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG8SI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_R32UI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_R32SI]); + #if defined(_SG_TARGET_MACOS) + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R32F]); + #else + _sg_pixelformat_sbr(&_sg.formats[SG_PIXELFORMAT_R32F]); + #endif + #if defined(_SG_TARGET_MACOS) + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG16]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG16SN]); + #else + _sg_pixelformat_sfbr(&_sg.formats[SG_PIXELFORMAT_RG16]); + _sg_pixelformat_sfbr(&_sg.formats[SG_PIXELFORMAT_RG16SN]); + #endif + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG16UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG16SI]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG16F]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA8]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA8SN]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA8UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA8SI]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_BGRA8]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGB10A2]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG11B10F]); + #if defined(_SG_TARGET_MACOS) + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG32UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG32SI]); + #else + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_RG32UI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_RG32SI]); + #endif + #if defined(_SG_TARGET_MACOS) + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG32F]); + #else + _sg_pixelformat_sbr(&_sg.formats[SG_PIXELFORMAT_RG32F]); + #endif + #if defined(_SG_TARGET_MACOS) + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA16]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA16SN]); + #else + _sg_pixelformat_sfbr(&_sg.formats[SG_PIXELFORMAT_RGBA16]); + _sg_pixelformat_sfbr(&_sg.formats[SG_PIXELFORMAT_RGBA16SN]); + #endif + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA16UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA16SI]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA16F]); + #if defined(_SG_TARGET_MACOS) + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA32UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA32SI]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + #else + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_RGBA32UI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_RGBA32SI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + #endif + _sg_pixelformat_srmd(&_sg.formats[SG_PIXELFORMAT_DEPTH]); + _sg_pixelformat_srmd(&_sg.formats[SG_PIXELFORMAT_DEPTH_STENCIL]); + #if defined(_SG_TARGET_MACOS) + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC1_RGBA]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC2_RGBA]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC3_RGBA]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC4_R]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC4_RSN]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC5_RG]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC5_RGSN]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC6H_RGBF]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC6H_RGBUF]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC7_RGBA]); + #else + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_PVRTC_RGB_2BPP]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_PVRTC_RGB_4BPP]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_PVRTC_RGBA_2BPP]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_PVRTC_RGBA_4BPP]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_ETC2_RGB8]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_ETC2_RGB8A1]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_ETC2_RGBA8]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_ETC2_RG11]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_ETC2_RG11SN]); + #endif +} + +/*-- main Metal backend state and functions ----------------------------------*/ +_SOKOL_PRIVATE void _sg_mtl_setup_backend(const sg_desc* desc) { + /* assume already zero-initialized */ + SOKOL_ASSERT(desc); + SOKOL_ASSERT(desc->context.metal.device); + SOKOL_ASSERT(desc->context.metal.renderpass_descriptor_cb || desc->context.metal.renderpass_descriptor_userdata_cb); + SOKOL_ASSERT(desc->context.metal.drawable_cb || desc->context.metal.drawable_userdata_cb); + SOKOL_ASSERT(desc->uniform_buffer_size > 0); + _sg_mtl_init_pool(desc); + _sg_mtl_init_sampler_cache(desc); + _sg_mtl_clear_state_cache(); + _sg.mtl.valid = true; + _sg.mtl.renderpass_descriptor_cb = desc->context.metal.renderpass_descriptor_cb; + _sg.mtl.renderpass_descriptor_userdata_cb = desc->context.metal.renderpass_descriptor_userdata_cb; + _sg.mtl.drawable_cb = desc->context.metal.drawable_cb; + _sg.mtl.drawable_userdata_cb = desc->context.metal.drawable_userdata_cb; + _sg.mtl.user_data = desc->context.metal.user_data; + _sg.mtl.frame_index = 1; + _sg.mtl.ub_size = desc->uniform_buffer_size; + _sg.mtl.sem = dispatch_semaphore_create(SG_NUM_INFLIGHT_FRAMES); + _sg.mtl.device = (__bridge id) desc->context.metal.device; + _sg.mtl.cmd_queue = [_sg.mtl.device newCommandQueue]; + for (int i = 0; i < SG_NUM_INFLIGHT_FRAMES; i++) { + _sg.mtl.uniform_buffers[i] = [_sg.mtl.device + newBufferWithLength:(NSUInteger)_sg.mtl.ub_size + options:MTLResourceCPUCacheModeWriteCombined|MTLResourceStorageModeShared + ]; + } + _sg_mtl_init_caps(); +} + +_SOKOL_PRIVATE void _sg_mtl_discard_backend(void) { + SOKOL_ASSERT(_sg.mtl.valid); + /* wait for the last frame to finish */ + for (int i = 0; i < SG_NUM_INFLIGHT_FRAMES; i++) { + dispatch_semaphore_wait(_sg.mtl.sem, DISPATCH_TIME_FOREVER); + } + /* semaphore must be "relinquished" before destruction */ + for (int i = 0; i < SG_NUM_INFLIGHT_FRAMES; i++) { + dispatch_semaphore_signal(_sg.mtl.sem); + } + _sg_mtl_destroy_sampler_cache(_sg.mtl.frame_index); + _sg_mtl_garbage_collect(_sg.mtl.frame_index + SG_NUM_INFLIGHT_FRAMES + 2); + _sg_mtl_destroy_pool(); + _sg.mtl.valid = false; + + _SG_OBJC_RELEASE(_sg.mtl.sem); + _SG_OBJC_RELEASE(_sg.mtl.device); + _SG_OBJC_RELEASE(_sg.mtl.cmd_queue); + for (int i = 0; i < SG_NUM_INFLIGHT_FRAMES; i++) { + _SG_OBJC_RELEASE(_sg.mtl.uniform_buffers[i]); + } + /* NOTE: MTLCommandBuffer and MTLRenderCommandEncoder are auto-released */ + _sg.mtl.cmd_buffer = nil; + _sg.mtl.cmd_encoder = nil; +} + +_SOKOL_PRIVATE void _sg_mtl_bind_uniform_buffers(void) { + SOKOL_ASSERT(nil != _sg.mtl.cmd_encoder); + for (int slot = 0; slot < SG_MAX_SHADERSTAGE_UBS; slot++) { + [_sg.mtl.cmd_encoder + setVertexBuffer:_sg.mtl.uniform_buffers[_sg.mtl.cur_frame_rotate_index] + offset:0 + atIndex:(NSUInteger)slot]; + [_sg.mtl.cmd_encoder + setFragmentBuffer:_sg.mtl.uniform_buffers[_sg.mtl.cur_frame_rotate_index] + offset:0 + atIndex:(NSUInteger)slot]; + } +} + +_SOKOL_PRIVATE void _sg_mtl_reset_state_cache(void) { + _sg_mtl_clear_state_cache(); + + /* need to restore the uniform buffer binding (normally happens in + _sg_mtl_begin_pass() + */ + if (nil != _sg.mtl.cmd_encoder) { + _sg_mtl_bind_uniform_buffers(); + } +} + +_SOKOL_PRIVATE sg_resource_state _sg_mtl_create_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + _SOKOL_UNUSED(ctx); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_mtl_destroy_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + _SOKOL_UNUSED(ctx); + /* empty */ +} + +_SOKOL_PRIVATE void _sg_mtl_activate_context(_sg_context_t* ctx) { + _SOKOL_UNUSED(ctx); + _sg_mtl_clear_state_cache(); +} + +_SOKOL_PRIVATE sg_resource_state _sg_mtl_create_buffer(_sg_buffer_t* buf, const sg_buffer_desc* desc) { + SOKOL_ASSERT(buf && desc); + _sg_buffer_common_init(&buf->cmn, desc); + const bool injected = (0 != desc->mtl_buffers[0]); + MTLResourceOptions mtl_options = _sg_mtl_buffer_resource_options(buf->cmn.usage); + for (int slot = 0; slot < buf->cmn.num_slots; slot++) { + id mtl_buf; + if (injected) { + SOKOL_ASSERT(desc->mtl_buffers[slot]); + mtl_buf = (__bridge id) desc->mtl_buffers[slot]; + } + else { + if (buf->cmn.usage == SG_USAGE_IMMUTABLE) { + SOKOL_ASSERT(desc->data.ptr); + mtl_buf = [_sg.mtl.device newBufferWithBytes:desc->data.ptr length:(NSUInteger)buf->cmn.size options:mtl_options]; + } + else { + mtl_buf = [_sg.mtl.device newBufferWithLength:(NSUInteger)buf->cmn.size options:mtl_options]; + } + } + buf->mtl.buf[slot] = _sg_mtl_add_resource(mtl_buf); + } + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_mtl_destroy_buffer(_sg_buffer_t* buf) { + SOKOL_ASSERT(buf); + for (int slot = 0; slot < buf->cmn.num_slots; slot++) { + /* it's valid to call release resource with '0' */ + _sg_mtl_release_resource(_sg.mtl.frame_index, buf->mtl.buf[slot]); + } +} + +_SOKOL_PRIVATE void _sg_mtl_copy_image_data(const _sg_image_t* img, __unsafe_unretained id mtl_tex, const sg_image_data* data) { + const int num_faces = (img->cmn.type == SG_IMAGETYPE_CUBE) ? 6:1; + const int num_slices = (img->cmn.type == SG_IMAGETYPE_ARRAY) ? img->cmn.num_slices : 1; + for (int face_index = 0; face_index < num_faces; face_index++) { + for (int mip_index = 0; mip_index < img->cmn.num_mipmaps; mip_index++) { + SOKOL_ASSERT(data->subimage[face_index][mip_index].ptr); + SOKOL_ASSERT(data->subimage[face_index][mip_index].size > 0); + const uint8_t* data_ptr = (const uint8_t*)data->subimage[face_index][mip_index].ptr; + const int mip_width = _sg_max(img->cmn.width >> mip_index, 1); + const int mip_height = _sg_max(img->cmn.height >> mip_index, 1); + /* special case PVRTC formats: bytePerRow and bytesPerImage must be 0 */ + int bytes_per_row = 0; + int bytes_per_slice = 0; + if (!_sg_mtl_is_pvrtc(img->cmn.pixel_format)) { + bytes_per_row = _sg_row_pitch(img->cmn.pixel_format, mip_width, 1); + bytes_per_slice = _sg_surface_pitch(img->cmn.pixel_format, mip_width, mip_height, 1); + } + /* bytesPerImage special case: https://developer.apple.com/documentation/metal/mtltexture/1515679-replaceregion + + "Supply a nonzero value only when you copy data to a MTLTextureType3D type texture" + */ + MTLRegion region; + int bytes_per_image; + if (img->cmn.type == SG_IMAGETYPE_3D) { + const int mip_depth = _sg_max(img->cmn.num_slices >> mip_index, 1); + region = MTLRegionMake3D(0, 0, 0, (NSUInteger)mip_width, (NSUInteger)mip_height, (NSUInteger)mip_depth); + bytes_per_image = bytes_per_slice; + /* FIXME: apparently the minimal bytes_per_image size for 3D texture + is 4 KByte... somehow need to handle this */ + } + else { + region = MTLRegionMake2D(0, 0, (NSUInteger)mip_width, (NSUInteger)mip_height); + bytes_per_image = 0; + } + + for (int slice_index = 0; slice_index < num_slices; slice_index++) { + const int mtl_slice_index = (img->cmn.type == SG_IMAGETYPE_CUBE) ? face_index : slice_index; + const int slice_offset = slice_index * bytes_per_slice; + SOKOL_ASSERT((slice_offset + bytes_per_slice) <= (int)data->subimage[face_index][mip_index].size); + [mtl_tex replaceRegion:region + mipmapLevel:(NSUInteger)mip_index + slice:(NSUInteger)mtl_slice_index + withBytes:data_ptr + slice_offset + bytesPerRow:(NSUInteger)bytes_per_row + bytesPerImage:(NSUInteger)bytes_per_image]; + } + } + } +} + +/* + FIXME: METAL RESOURCE STORAGE MODE FOR macOS AND iOS + + For immutable textures on macOS, the recommended procedure is to create + a MTLStorageModeManaged texture with the immutable content first, + and then use the GPU to blit the content into a MTLStorageModePrivate + texture before the first use. + + On iOS use the same one-time-blit procedure, but from a + MTLStorageModeShared to a MTLStorageModePrivate texture. + + It probably makes sense to handle this in a separate 'resource manager' + with a recycable pool of blit-source-textures? +*/ + +/* initialize MTLTextureDescritor with common attributes */ +_SOKOL_PRIVATE bool _sg_mtl_init_texdesc_common(MTLTextureDescriptor* mtl_desc, _sg_image_t* img) { + mtl_desc.textureType = _sg_mtl_texture_type(img->cmn.type); + mtl_desc.pixelFormat = _sg_mtl_pixel_format(img->cmn.pixel_format); + if (MTLPixelFormatInvalid == mtl_desc.pixelFormat) { + SOKOL_LOG("Unsupported texture pixel format!\n"); + return false; + } + mtl_desc.width = (NSUInteger)img->cmn.width; + mtl_desc.height = (NSUInteger)img->cmn.height; + if (SG_IMAGETYPE_3D == img->cmn.type) { + mtl_desc.depth = (NSUInteger)img->cmn.num_slices; + } + else { + mtl_desc.depth = 1; + } + mtl_desc.mipmapLevelCount = (NSUInteger)img->cmn.num_mipmaps; + if (SG_IMAGETYPE_ARRAY == img->cmn.type) { + mtl_desc.arrayLength = (NSUInteger)img->cmn.num_slices; + } + else { + mtl_desc.arrayLength = 1; + } + mtl_desc.usage = MTLTextureUsageShaderRead; + MTLResourceOptions res_options = 0; + if (img->cmn.usage != SG_USAGE_IMMUTABLE) { + res_options |= MTLResourceCPUCacheModeWriteCombined; + } + #if defined(_SG_TARGET_MACOS) + /* macOS: use managed textures */ + res_options |= MTLResourceStorageModeManaged; + #else + /* iOS: use CPU/GPU shared memory */ + res_options |= MTLResourceStorageModeShared; + #endif + mtl_desc.resourceOptions = res_options; + return true; +} + +/* initialize MTLTextureDescritor with rendertarget attributes */ +_SOKOL_PRIVATE void _sg_mtl_init_texdesc_rt(MTLTextureDescriptor* mtl_desc, _sg_image_t* img) { + SOKOL_ASSERT(img->cmn.render_target); + _SOKOL_UNUSED(img); + /* render targets are only visible to the GPU */ + mtl_desc.resourceOptions = MTLResourceStorageModePrivate; + /* non-MSAA render targets are shader-readable */ + mtl_desc.usage = MTLTextureUsageShaderRead | MTLTextureUsageRenderTarget; +} + +/* initialize MTLTextureDescritor with MSAA attributes */ +_SOKOL_PRIVATE void _sg_mtl_init_texdesc_rt_msaa(MTLTextureDescriptor* mtl_desc, _sg_image_t* img) { + SOKOL_ASSERT(img->cmn.sample_count > 1); + /* render targets are only visible to the GPU */ + mtl_desc.resourceOptions = MTLResourceStorageModePrivate; + /* MSAA render targets are not shader-readable (instead they are resolved) */ + mtl_desc.usage = MTLTextureUsageRenderTarget; + mtl_desc.textureType = MTLTextureType2DMultisample; + mtl_desc.depth = 1; + mtl_desc.arrayLength = 1; + mtl_desc.mipmapLevelCount = 1; + mtl_desc.sampleCount = (NSUInteger)img->cmn.sample_count; +} + +_SOKOL_PRIVATE sg_resource_state _sg_mtl_create_image(_sg_image_t* img, const sg_image_desc* desc) { + SOKOL_ASSERT(img && desc); + _sg_image_common_init(&img->cmn, desc); + const bool injected = (0 != desc->mtl_textures[0]); + const bool msaa = (img->cmn.sample_count > 1); + + /* first initialize all Metal resource pool slots to 'empty' */ + for (int i = 0; i < SG_NUM_INFLIGHT_FRAMES; i++) { + img->mtl.tex[i] = _sg_mtl_add_resource(nil); + } + img->mtl.sampler_state = _sg_mtl_add_resource(nil); + img->mtl.depth_tex = _sg_mtl_add_resource(nil); + img->mtl.msaa_tex = _sg_mtl_add_resource(nil); + + /* initialize a Metal texture descriptor with common attributes */ + MTLTextureDescriptor* mtl_desc = [[MTLTextureDescriptor alloc] init]; + if (!_sg_mtl_init_texdesc_common(mtl_desc, img)) { + _SG_OBJC_RELEASE(mtl_desc); + return SG_RESOURCESTATE_FAILED; + } + + /* special case depth-stencil-buffer? */ + if (_sg_is_valid_rendertarget_depth_format(img->cmn.pixel_format)) { + /* depth-stencil buffer texture must always be a render target */ + SOKOL_ASSERT(img->cmn.render_target); + SOKOL_ASSERT(img->cmn.type == SG_IMAGETYPE_2D); + SOKOL_ASSERT(img->cmn.num_mipmaps == 1); + SOKOL_ASSERT(!injected); + if (msaa) { + _sg_mtl_init_texdesc_rt_msaa(mtl_desc, img); + } + else { + _sg_mtl_init_texdesc_rt(mtl_desc, img); + } + id tex = [_sg.mtl.device newTextureWithDescriptor:mtl_desc]; + SOKOL_ASSERT(nil != tex); + img->mtl.depth_tex = _sg_mtl_add_resource(tex); + } + else { + /* create the color texture + In case this is a render target without MSAA, add the relevant + render-target descriptor attributes. + In case this is a render target *with* MSAA, the color texture + will serve as MSAA-resolve target (not as render target), and rendering + will go into a separate render target texture of type + MTLTextureType2DMultisample. + */ + if (img->cmn.render_target && !msaa) { + _sg_mtl_init_texdesc_rt(mtl_desc, img); + } + for (int slot = 0; slot < img->cmn.num_slots; slot++) { + id tex; + if (injected) { + SOKOL_ASSERT(desc->mtl_textures[slot]); + tex = (__bridge id) desc->mtl_textures[slot]; + } + else { + tex = [_sg.mtl.device newTextureWithDescriptor:mtl_desc]; + if ((img->cmn.usage == SG_USAGE_IMMUTABLE) && !img->cmn.render_target) { + _sg_mtl_copy_image_data(img, tex, &desc->data); + } + } + img->mtl.tex[slot] = _sg_mtl_add_resource(tex); + } + + /* if MSAA color render target, create an additional MSAA render-surface texture */ + if (img->cmn.render_target && msaa) { + _sg_mtl_init_texdesc_rt_msaa(mtl_desc, img); + id tex = [_sg.mtl.device newTextureWithDescriptor:mtl_desc]; + img->mtl.msaa_tex = _sg_mtl_add_resource(tex); + } + + /* create (possibly shared) sampler state */ + img->mtl.sampler_state = _sg_mtl_create_sampler(_sg.mtl.device, desc); + } + _SG_OBJC_RELEASE(mtl_desc); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_mtl_destroy_image(_sg_image_t* img) { + SOKOL_ASSERT(img); + /* it's valid to call release resource with a 'null resource' */ + for (int slot = 0; slot < img->cmn.num_slots; slot++) { + _sg_mtl_release_resource(_sg.mtl.frame_index, img->mtl.tex[slot]); + } + _sg_mtl_release_resource(_sg.mtl.frame_index, img->mtl.depth_tex); + _sg_mtl_release_resource(_sg.mtl.frame_index, img->mtl.msaa_tex); + /* NOTE: sampler state objects are shared and not released until shutdown */ +} + +_SOKOL_PRIVATE id _sg_mtl_compile_library(const char* src) { + NSError* err = NULL; + id lib = [_sg.mtl.device + newLibraryWithSource:[NSString stringWithUTF8String:src] + options:nil + error:&err + ]; + if (err) { + SOKOL_LOG([err.localizedDescription UTF8String]); + } + return lib; +} + +_SOKOL_PRIVATE id _sg_mtl_library_from_bytecode(const void* ptr, size_t num_bytes) { + NSError* err = NULL; + dispatch_data_t lib_data = dispatch_data_create(ptr, num_bytes, NULL, DISPATCH_DATA_DESTRUCTOR_DEFAULT); + id lib = [_sg.mtl.device newLibraryWithData:lib_data error:&err]; + if (err) { + SOKOL_LOG([err.localizedDescription UTF8String]); + } + _SG_OBJC_RELEASE(lib_data); + return lib; +} + +_SOKOL_PRIVATE sg_resource_state _sg_mtl_create_shader(_sg_shader_t* shd, const sg_shader_desc* desc) { + SOKOL_ASSERT(shd && desc); + + _sg_shader_common_init(&shd->cmn, desc); + + /* create metal libray objects and lookup entry functions */ + id vs_lib; + id fs_lib; + id vs_func; + id fs_func; + const char* vs_entry = desc->vs.entry; + const char* fs_entry = desc->fs.entry; + if (desc->vs.bytecode.ptr && desc->fs.bytecode.ptr) { + /* separate byte code provided */ + vs_lib = _sg_mtl_library_from_bytecode(desc->vs.bytecode.ptr, desc->vs.bytecode.size); + fs_lib = _sg_mtl_library_from_bytecode(desc->fs.bytecode.ptr, desc->fs.bytecode.size); + if (nil == vs_lib || nil == fs_lib) { + return SG_RESOURCESTATE_FAILED; + } + vs_func = [vs_lib newFunctionWithName:[NSString stringWithUTF8String:vs_entry]]; + fs_func = [fs_lib newFunctionWithName:[NSString stringWithUTF8String:fs_entry]]; + } + else if (desc->vs.source && desc->fs.source) { + /* separate sources provided */ + vs_lib = _sg_mtl_compile_library(desc->vs.source); + fs_lib = _sg_mtl_compile_library(desc->fs.source); + if (nil == vs_lib || nil == fs_lib) { + return SG_RESOURCESTATE_FAILED; + } + vs_func = [vs_lib newFunctionWithName:[NSString stringWithUTF8String:vs_entry]]; + fs_func = [fs_lib newFunctionWithName:[NSString stringWithUTF8String:fs_entry]]; + } + else { + return SG_RESOURCESTATE_FAILED; + } + if (nil == vs_func) { + SOKOL_LOG("vertex shader entry function not found\n"); + return SG_RESOURCESTATE_FAILED; + } + if (nil == fs_func) { + SOKOL_LOG("fragment shader entry function not found\n"); + return SG_RESOURCESTATE_FAILED; + } + /* it is legal to call _sg_mtl_add_resource with a nil value, this will return a special 0xFFFFFFFF index */ + shd->mtl.stage[SG_SHADERSTAGE_VS].mtl_lib = _sg_mtl_add_resource(vs_lib); + shd->mtl.stage[SG_SHADERSTAGE_FS].mtl_lib = _sg_mtl_add_resource(fs_lib); + shd->mtl.stage[SG_SHADERSTAGE_VS].mtl_func = _sg_mtl_add_resource(vs_func); + shd->mtl.stage[SG_SHADERSTAGE_FS].mtl_func = _sg_mtl_add_resource(fs_func); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_mtl_destroy_shader(_sg_shader_t* shd) { + SOKOL_ASSERT(shd); + /* it is valid to call _sg_mtl_release_resource with a 'null resource' */ + _sg_mtl_release_resource(_sg.mtl.frame_index, shd->mtl.stage[SG_SHADERSTAGE_VS].mtl_func); + _sg_mtl_release_resource(_sg.mtl.frame_index, shd->mtl.stage[SG_SHADERSTAGE_VS].mtl_lib); + _sg_mtl_release_resource(_sg.mtl.frame_index, shd->mtl.stage[SG_SHADERSTAGE_FS].mtl_func); + _sg_mtl_release_resource(_sg.mtl.frame_index, shd->mtl.stage[SG_SHADERSTAGE_FS].mtl_lib); +} + +_SOKOL_PRIVATE sg_resource_state _sg_mtl_create_pipeline(_sg_pipeline_t* pip, _sg_shader_t* shd, const sg_pipeline_desc* desc) { + SOKOL_ASSERT(pip && shd && desc); + SOKOL_ASSERT(desc->shader.id == shd->slot.id); + + pip->shader = shd; + _sg_pipeline_common_init(&pip->cmn, desc); + + sg_primitive_type prim_type = desc->primitive_type; + pip->mtl.prim_type = _sg_mtl_primitive_type(prim_type); + pip->mtl.index_size = _sg_mtl_index_size(pip->cmn.index_type); + if (SG_INDEXTYPE_NONE != pip->cmn.index_type) { + pip->mtl.index_type = _sg_mtl_index_type(pip->cmn.index_type); + } + pip->mtl.cull_mode = _sg_mtl_cull_mode(desc->cull_mode); + pip->mtl.winding = _sg_mtl_winding(desc->face_winding); + pip->mtl.stencil_ref = desc->stencil.ref; + + /* create vertex-descriptor */ + MTLVertexDescriptor* vtx_desc = [MTLVertexDescriptor vertexDescriptor]; + for (NSUInteger attr_index = 0; attr_index < SG_MAX_VERTEX_ATTRIBUTES; attr_index++) { + const sg_vertex_attr_desc* a_desc = &desc->layout.attrs[attr_index]; + if (a_desc->format == SG_VERTEXFORMAT_INVALID) { + break; + } + SOKOL_ASSERT(a_desc->buffer_index < SG_MAX_SHADERSTAGE_BUFFERS); + vtx_desc.attributes[attr_index].format = _sg_mtl_vertex_format(a_desc->format); + vtx_desc.attributes[attr_index].offset = (NSUInteger)a_desc->offset; + vtx_desc.attributes[attr_index].bufferIndex = (NSUInteger)(a_desc->buffer_index + SG_MAX_SHADERSTAGE_UBS); + pip->cmn.vertex_layout_valid[a_desc->buffer_index] = true; + } + for (NSUInteger layout_index = 0; layout_index < SG_MAX_SHADERSTAGE_BUFFERS; layout_index++) { + if (pip->cmn.vertex_layout_valid[layout_index]) { + const sg_buffer_layout_desc* l_desc = &desc->layout.buffers[layout_index]; + const NSUInteger mtl_vb_slot = layout_index + SG_MAX_SHADERSTAGE_UBS; + SOKOL_ASSERT(l_desc->stride > 0); + vtx_desc.layouts[mtl_vb_slot].stride = (NSUInteger)l_desc->stride; + vtx_desc.layouts[mtl_vb_slot].stepFunction = _sg_mtl_step_function(l_desc->step_func); + vtx_desc.layouts[mtl_vb_slot].stepRate = (NSUInteger)l_desc->step_rate; + if (SG_VERTEXSTEP_PER_INSTANCE == l_desc->step_func) { + // NOTE: not actually used in _sg_mtl_draw() + pip->cmn.use_instanced_draw = true; + } + } + } + + /* render-pipeline descriptor */ + MTLRenderPipelineDescriptor* rp_desc = [[MTLRenderPipelineDescriptor alloc] init]; + rp_desc.vertexDescriptor = vtx_desc; + SOKOL_ASSERT(shd->mtl.stage[SG_SHADERSTAGE_VS].mtl_func != _SG_MTL_INVALID_SLOT_INDEX); + rp_desc.vertexFunction = _sg_mtl_id(shd->mtl.stage[SG_SHADERSTAGE_VS].mtl_func); + SOKOL_ASSERT(shd->mtl.stage[SG_SHADERSTAGE_FS].mtl_func != _SG_MTL_INVALID_SLOT_INDEX); + rp_desc.fragmentFunction = _sg_mtl_id(shd->mtl.stage[SG_SHADERSTAGE_FS].mtl_func); + rp_desc.sampleCount = (NSUInteger)desc->sample_count; + rp_desc.alphaToCoverageEnabled = desc->alpha_to_coverage_enabled; + rp_desc.alphaToOneEnabled = NO; + rp_desc.rasterizationEnabled = YES; + rp_desc.depthAttachmentPixelFormat = _sg_mtl_pixel_format(desc->depth.pixel_format); + if (desc->depth.pixel_format == SG_PIXELFORMAT_DEPTH_STENCIL) { + rp_desc.stencilAttachmentPixelFormat = _sg_mtl_pixel_format(desc->depth.pixel_format); + } + /* FIXME: this only works on macOS 10.13! + for (int i = 0; i < (SG_MAX_SHADERSTAGE_UBS+SG_MAX_SHADERSTAGE_BUFFERS); i++) { + rp_desc.vertexBuffers[i].mutability = MTLMutabilityImmutable; + } + for (int i = 0; i < SG_MAX_SHADERSTAGE_UBS; i++) { + rp_desc.fragmentBuffers[i].mutability = MTLMutabilityImmutable; + } + */ + for (NSUInteger i = 0; i < (NSUInteger)desc->color_count; i++) { + SOKOL_ASSERT(i < SG_MAX_COLOR_ATTACHMENTS); + const sg_color_state* cs = &desc->colors[i]; + rp_desc.colorAttachments[i].pixelFormat = _sg_mtl_pixel_format(cs->pixel_format); + rp_desc.colorAttachments[i].writeMask = _sg_mtl_color_write_mask(cs->write_mask); + rp_desc.colorAttachments[i].blendingEnabled = cs->blend.enabled; + rp_desc.colorAttachments[i].alphaBlendOperation = _sg_mtl_blend_op(cs->blend.op_alpha); + rp_desc.colorAttachments[i].rgbBlendOperation = _sg_mtl_blend_op(cs->blend.op_rgb); + rp_desc.colorAttachments[i].destinationAlphaBlendFactor = _sg_mtl_blend_factor(cs->blend.dst_factor_alpha); + rp_desc.colorAttachments[i].destinationRGBBlendFactor = _sg_mtl_blend_factor(cs->blend.dst_factor_rgb); + rp_desc.colorAttachments[i].sourceAlphaBlendFactor = _sg_mtl_blend_factor(cs->blend.src_factor_alpha); + rp_desc.colorAttachments[i].sourceRGBBlendFactor = _sg_mtl_blend_factor(cs->blend.src_factor_rgb); + } + NSError* err = NULL; + id mtl_rps = [_sg.mtl.device newRenderPipelineStateWithDescriptor:rp_desc error:&err]; + _SG_OBJC_RELEASE(rp_desc); + if (nil == mtl_rps) { + SOKOL_ASSERT(err); + SOKOL_LOG([err.localizedDescription UTF8String]); + return SG_RESOURCESTATE_FAILED; + } + + /* depth-stencil-state */ + MTLDepthStencilDescriptor* ds_desc = [[MTLDepthStencilDescriptor alloc] init]; + ds_desc.depthCompareFunction = _sg_mtl_compare_func(desc->depth.compare); + ds_desc.depthWriteEnabled = desc->depth.write_enabled; + if (desc->stencil.enabled) { + const sg_stencil_face_state* sb = &desc->stencil.back; + ds_desc.backFaceStencil = [[MTLStencilDescriptor alloc] init]; + ds_desc.backFaceStencil.stencilFailureOperation = _sg_mtl_stencil_op(sb->fail_op); + ds_desc.backFaceStencil.depthFailureOperation = _sg_mtl_stencil_op(sb->depth_fail_op); + ds_desc.backFaceStencil.depthStencilPassOperation = _sg_mtl_stencil_op(sb->pass_op); + ds_desc.backFaceStencil.stencilCompareFunction = _sg_mtl_compare_func(sb->compare); + ds_desc.backFaceStencil.readMask = desc->stencil.read_mask; + ds_desc.backFaceStencil.writeMask = desc->stencil.write_mask; + const sg_stencil_face_state* sf = &desc->stencil.front; + ds_desc.frontFaceStencil = [[MTLStencilDescriptor alloc] init]; + ds_desc.frontFaceStencil.stencilFailureOperation = _sg_mtl_stencil_op(sf->fail_op); + ds_desc.frontFaceStencil.depthFailureOperation = _sg_mtl_stencil_op(sf->depth_fail_op); + ds_desc.frontFaceStencil.depthStencilPassOperation = _sg_mtl_stencil_op(sf->pass_op); + ds_desc.frontFaceStencil.stencilCompareFunction = _sg_mtl_compare_func(sf->compare); + ds_desc.frontFaceStencil.readMask = desc->stencil.read_mask; + ds_desc.frontFaceStencil.writeMask = desc->stencil.write_mask; + } + id mtl_dss = [_sg.mtl.device newDepthStencilStateWithDescriptor:ds_desc]; + _SG_OBJC_RELEASE(ds_desc); + pip->mtl.rps = _sg_mtl_add_resource(mtl_rps); + pip->mtl.dss = _sg_mtl_add_resource(mtl_dss); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_mtl_destroy_pipeline(_sg_pipeline_t* pip) { + SOKOL_ASSERT(pip); + /* it's valid to call release resource with a 'null resource' */ + _sg_mtl_release_resource(_sg.mtl.frame_index, pip->mtl.rps); + _sg_mtl_release_resource(_sg.mtl.frame_index, pip->mtl.dss); +} + +_SOKOL_PRIVATE sg_resource_state _sg_mtl_create_pass(_sg_pass_t* pass, _sg_image_t** att_images, const sg_pass_desc* desc) { + SOKOL_ASSERT(pass && desc); + SOKOL_ASSERT(att_images && att_images[0]); + + _sg_pass_common_init(&pass->cmn, desc); + + /* copy image pointers */ + const sg_pass_attachment_desc* att_desc; + for (int i = 0; i < pass->cmn.num_color_atts; i++) { + att_desc = &desc->color_attachments[i]; + if (att_desc->image.id != SG_INVALID_ID) { + SOKOL_ASSERT(att_desc->image.id != SG_INVALID_ID); + SOKOL_ASSERT(0 == pass->mtl.color_atts[i].image); + SOKOL_ASSERT(att_images[i] && (att_images[i]->slot.id == att_desc->image.id)); + SOKOL_ASSERT(_sg_is_valid_rendertarget_color_format(att_images[i]->cmn.pixel_format)); + pass->mtl.color_atts[i].image = att_images[i]; + } + } + SOKOL_ASSERT(0 == pass->mtl.ds_att.image); + att_desc = &desc->depth_stencil_attachment; + if (att_desc->image.id != SG_INVALID_ID) { + const int ds_img_index = SG_MAX_COLOR_ATTACHMENTS; + SOKOL_ASSERT(att_images[ds_img_index] && (att_images[ds_img_index]->slot.id == att_desc->image.id)); + SOKOL_ASSERT(_sg_is_valid_rendertarget_depth_format(att_images[ds_img_index]->cmn.pixel_format)); + pass->mtl.ds_att.image = att_images[ds_img_index]; + } + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_mtl_destroy_pass(_sg_pass_t* pass) { + SOKOL_ASSERT(pass); + _SOKOL_UNUSED(pass); +} + +_SOKOL_PRIVATE _sg_image_t* _sg_mtl_pass_color_image(const _sg_pass_t* pass, int index) { + SOKOL_ASSERT(pass && (index >= 0) && (index < SG_MAX_COLOR_ATTACHMENTS)); + /* NOTE: may return null */ + return pass->mtl.color_atts[index].image; +} + +_SOKOL_PRIVATE _sg_image_t* _sg_mtl_pass_ds_image(const _sg_pass_t* pass) { + /* NOTE: may return null */ + SOKOL_ASSERT(pass); + return pass->mtl.ds_att.image; +} + +_SOKOL_PRIVATE void _sg_mtl_begin_pass(_sg_pass_t* pass, const sg_pass_action* action, int w, int h) { + SOKOL_ASSERT(action); + SOKOL_ASSERT(!_sg.mtl.in_pass); + SOKOL_ASSERT(_sg.mtl.cmd_queue); + SOKOL_ASSERT(nil == _sg.mtl.cmd_encoder); + SOKOL_ASSERT(_sg.mtl.renderpass_descriptor_cb || _sg.mtl.renderpass_descriptor_userdata_cb); + _sg.mtl.in_pass = true; + _sg.mtl.cur_width = w; + _sg.mtl.cur_height = h; + _sg_mtl_clear_state_cache(); + + /* if this is the first pass in the frame, create a command buffer */ + if (nil == _sg.mtl.cmd_buffer) { + /* block until the oldest frame in flight has finished */ + dispatch_semaphore_wait(_sg.mtl.sem, DISPATCH_TIME_FOREVER); + _sg.mtl.cmd_buffer = [_sg.mtl.cmd_queue commandBufferWithUnretainedReferences]; + [_sg.mtl.cmd_buffer addCompletedHandler:^(id cmd_buffer) { + // NOTE: this code is called on a different thread! + _SOKOL_UNUSED(cmd_buffer); + dispatch_semaphore_signal(_sg.mtl.sem); + }]; + } + + /* if this is first pass in frame, get uniform buffer base pointer */ + if (0 == _sg.mtl.cur_ub_base_ptr) { + _sg.mtl.cur_ub_base_ptr = (uint8_t*)[_sg.mtl.uniform_buffers[_sg.mtl.cur_frame_rotate_index] contents]; + } + + /* initialize a render pass descriptor */ + MTLRenderPassDescriptor* pass_desc = nil; + if (pass) { + /* offscreen render pass */ + pass_desc = [MTLRenderPassDescriptor renderPassDescriptor]; + } + else { + /* default render pass, call user-provided callback to provide render pass descriptor */ + if (_sg.mtl.renderpass_descriptor_cb) { + pass_desc = (__bridge MTLRenderPassDescriptor*) _sg.mtl.renderpass_descriptor_cb(); + } + else { + pass_desc = (__bridge MTLRenderPassDescriptor*) _sg.mtl.renderpass_descriptor_userdata_cb(_sg.mtl.user_data); + } + + } + if (pass_desc) { + _sg.mtl.pass_valid = true; + } + else { + /* default pass descriptor will not be valid if window is minimized, + don't do any rendering in this case */ + _sg.mtl.pass_valid = false; + return; + } + if (pass) { + /* setup pass descriptor for offscreen rendering */ + SOKOL_ASSERT(pass->slot.state == SG_RESOURCESTATE_VALID); + for (NSUInteger i = 0; i < (NSUInteger)pass->cmn.num_color_atts; i++) { + const _sg_pass_attachment_t* cmn_att = &pass->cmn.color_atts[i]; + const _sg_mtl_attachment_t* mtl_att = &pass->mtl.color_atts[i]; + const _sg_image_t* att_img = mtl_att->image; + SOKOL_ASSERT(att_img->slot.state == SG_RESOURCESTATE_VALID); + SOKOL_ASSERT(att_img->slot.id == cmn_att->image_id.id); + const bool is_msaa = (att_img->cmn.sample_count > 1); + pass_desc.colorAttachments[i].loadAction = _sg_mtl_load_action(action->colors[i].action); + pass_desc.colorAttachments[i].storeAction = is_msaa ? MTLStoreActionMultisampleResolve : MTLStoreActionStore; + sg_color c = action->colors[i].value; + pass_desc.colorAttachments[i].clearColor = MTLClearColorMake(c.r, c.g, c.b, c.a); + if (is_msaa) { + SOKOL_ASSERT(att_img->mtl.msaa_tex != _SG_MTL_INVALID_SLOT_INDEX); + SOKOL_ASSERT(att_img->mtl.tex[mtl_att->image->cmn.active_slot] != _SG_MTL_INVALID_SLOT_INDEX); + pass_desc.colorAttachments[i].texture = _sg_mtl_id(att_img->mtl.msaa_tex); + pass_desc.colorAttachments[i].resolveTexture = _sg_mtl_id(att_img->mtl.tex[att_img->cmn.active_slot]); + pass_desc.colorAttachments[i].resolveLevel = (NSUInteger)cmn_att->mip_level; + switch (att_img->cmn.type) { + case SG_IMAGETYPE_CUBE: + case SG_IMAGETYPE_ARRAY: + pass_desc.colorAttachments[i].resolveSlice = (NSUInteger)cmn_att->slice; + break; + case SG_IMAGETYPE_3D: + pass_desc.colorAttachments[i].resolveDepthPlane = (NSUInteger)cmn_att->slice; + break; + default: break; + } + } + else { + SOKOL_ASSERT(att_img->mtl.tex[att_img->cmn.active_slot] != _SG_MTL_INVALID_SLOT_INDEX); + pass_desc.colorAttachments[i].texture = _sg_mtl_id(att_img->mtl.tex[att_img->cmn.active_slot]); + pass_desc.colorAttachments[i].level = (NSUInteger)cmn_att->mip_level; + switch (att_img->cmn.type) { + case SG_IMAGETYPE_CUBE: + case SG_IMAGETYPE_ARRAY: + pass_desc.colorAttachments[i].slice = (NSUInteger)cmn_att->slice; + break; + case SG_IMAGETYPE_3D: + pass_desc.colorAttachments[i].depthPlane = (NSUInteger)cmn_att->slice; + break; + default: break; + } + } + } + const _sg_image_t* ds_att_img = pass->mtl.ds_att.image; + if (0 != ds_att_img) { + SOKOL_ASSERT(ds_att_img->slot.state == SG_RESOURCESTATE_VALID); + SOKOL_ASSERT(ds_att_img->slot.id == pass->cmn.ds_att.image_id.id); + SOKOL_ASSERT(ds_att_img->mtl.depth_tex != _SG_MTL_INVALID_SLOT_INDEX); + pass_desc.depthAttachment.texture = _sg_mtl_id(ds_att_img->mtl.depth_tex); + pass_desc.depthAttachment.loadAction = _sg_mtl_load_action(action->depth.action); + pass_desc.depthAttachment.clearDepth = action->depth.value; + if (_sg_is_depth_stencil_format(ds_att_img->cmn.pixel_format)) { + pass_desc.stencilAttachment.texture = _sg_mtl_id(ds_att_img->mtl.depth_tex); + pass_desc.stencilAttachment.loadAction = _sg_mtl_load_action(action->stencil.action); + pass_desc.stencilAttachment.clearStencil = action->stencil.value; + } + } + } + else { + /* setup pass descriptor for default rendering */ + pass_desc.colorAttachments[0].loadAction = _sg_mtl_load_action(action->colors[0].action); + sg_color c = action->colors[0].value; + pass_desc.colorAttachments[0].clearColor = MTLClearColorMake(c.r, c.g, c.b, c.a); + pass_desc.depthAttachment.loadAction = _sg_mtl_load_action(action->depth.action); + pass_desc.depthAttachment.clearDepth = action->depth.value; + pass_desc.stencilAttachment.loadAction = _sg_mtl_load_action(action->stencil.action); + pass_desc.stencilAttachment.clearStencil = action->stencil.value; + } + + /* create a render command encoder, this might return nil if window is minimized */ + _sg.mtl.cmd_encoder = [_sg.mtl.cmd_buffer renderCommandEncoderWithDescriptor:pass_desc]; + if (nil == _sg.mtl.cmd_encoder) { + _sg.mtl.pass_valid = false; + return; + } + + /* bind the global uniform buffer, this only happens once per pass */ + _sg_mtl_bind_uniform_buffers(); +} + +_SOKOL_PRIVATE void _sg_mtl_end_pass(void) { + SOKOL_ASSERT(_sg.mtl.in_pass); + _sg.mtl.in_pass = false; + _sg.mtl.pass_valid = false; + if (nil != _sg.mtl.cmd_encoder) { + [_sg.mtl.cmd_encoder endEncoding]; + /* NOTE: MTLRenderCommandEncoder is autoreleased */ + _sg.mtl.cmd_encoder = nil; + } +} + +_SOKOL_PRIVATE void _sg_mtl_commit(void) { + SOKOL_ASSERT(!_sg.mtl.in_pass); + SOKOL_ASSERT(!_sg.mtl.pass_valid); + SOKOL_ASSERT(_sg.mtl.drawable_cb || _sg.mtl.drawable_userdata_cb); + SOKOL_ASSERT(nil == _sg.mtl.cmd_encoder); + SOKOL_ASSERT(nil != _sg.mtl.cmd_buffer); + + /* present, commit and signal semaphore when done */ + id cur_drawable = nil; + if (_sg.mtl.drawable_cb) { + cur_drawable = (__bridge id) _sg.mtl.drawable_cb(); + } + else { + cur_drawable = (__bridge id) _sg.mtl.drawable_userdata_cb(_sg.mtl.user_data); + } + if (nil != cur_drawable) { + [_sg.mtl.cmd_buffer presentDrawable:cur_drawable]; + } + [_sg.mtl.cmd_buffer commit]; + + /* garbage-collect resources pending for release */ + _sg_mtl_garbage_collect(_sg.mtl.frame_index); + + /* rotate uniform buffer slot */ + if (++_sg.mtl.cur_frame_rotate_index >= SG_NUM_INFLIGHT_FRAMES) { + _sg.mtl.cur_frame_rotate_index = 0; + } + _sg.mtl.frame_index++; + _sg.mtl.cur_ub_offset = 0; + _sg.mtl.cur_ub_base_ptr = 0; + /* NOTE: MTLCommandBuffer is autoreleased */ + _sg.mtl.cmd_buffer = nil; +} + +_SOKOL_PRIVATE void _sg_mtl_apply_viewport(int x, int y, int w, int h, bool origin_top_left) { + SOKOL_ASSERT(_sg.mtl.in_pass); + if (!_sg.mtl.pass_valid) { + return; + } + SOKOL_ASSERT(nil != _sg.mtl.cmd_encoder); + MTLViewport vp; + vp.originX = (double) x; + vp.originY = (double) (origin_top_left ? y : (_sg.mtl.cur_height - (y + h))); + vp.width = (double) w; + vp.height = (double) h; + vp.znear = 0.0; + vp.zfar = 1.0; + [_sg.mtl.cmd_encoder setViewport:vp]; +} + +_SOKOL_PRIVATE void _sg_mtl_apply_scissor_rect(int x, int y, int w, int h, bool origin_top_left) { + SOKOL_ASSERT(_sg.mtl.in_pass); + if (!_sg.mtl.pass_valid) { + return; + } + SOKOL_ASSERT(nil != _sg.mtl.cmd_encoder); + /* clip against framebuffer rect */ + x = _sg_min(_sg_max(0, x), _sg.mtl.cur_width-1); + y = _sg_min(_sg_max(0, y), _sg.mtl.cur_height-1); + if ((x + w) > _sg.mtl.cur_width) { + w = _sg.mtl.cur_width - x; + } + if ((y + h) > _sg.mtl.cur_height) { + h = _sg.mtl.cur_height - y; + } + w = _sg_max(w, 1); + h = _sg_max(h, 1); + + MTLScissorRect r; + r.x = (NSUInteger)x; + r.y = (NSUInteger) (origin_top_left ? y : (_sg.mtl.cur_height - (y + h))); + r.width = (NSUInteger)w; + r.height = (NSUInteger)h; + [_sg.mtl.cmd_encoder setScissorRect:r]; +} + +_SOKOL_PRIVATE void _sg_mtl_apply_pipeline(_sg_pipeline_t* pip) { + SOKOL_ASSERT(pip); + SOKOL_ASSERT(pip->shader && (pip->cmn.shader_id.id == pip->shader->slot.id)); + SOKOL_ASSERT(_sg.mtl.in_pass); + if (!_sg.mtl.pass_valid) { + return; + } + SOKOL_ASSERT(nil != _sg.mtl.cmd_encoder); + + if ((_sg.mtl.state_cache.cur_pipeline != pip) || (_sg.mtl.state_cache.cur_pipeline_id.id != pip->slot.id)) { + _sg.mtl.state_cache.cur_pipeline = pip; + _sg.mtl.state_cache.cur_pipeline_id.id = pip->slot.id; + sg_color c = pip->cmn.blend_color; + [_sg.mtl.cmd_encoder setBlendColorRed:c.r green:c.g blue:c.b alpha:c.a]; + [_sg.mtl.cmd_encoder setCullMode:pip->mtl.cull_mode]; + [_sg.mtl.cmd_encoder setFrontFacingWinding:pip->mtl.winding]; + [_sg.mtl.cmd_encoder setStencilReferenceValue:pip->mtl.stencil_ref]; + [_sg.mtl.cmd_encoder setDepthBias:pip->cmn.depth_bias slopeScale:pip->cmn.depth_bias_slope_scale clamp:pip->cmn.depth_bias_clamp]; + SOKOL_ASSERT(pip->mtl.rps != _SG_MTL_INVALID_SLOT_INDEX); + [_sg.mtl.cmd_encoder setRenderPipelineState:_sg_mtl_id(pip->mtl.rps)]; + SOKOL_ASSERT(pip->mtl.dss != _SG_MTL_INVALID_SLOT_INDEX); + [_sg.mtl.cmd_encoder setDepthStencilState:_sg_mtl_id(pip->mtl.dss)]; + } +} + +_SOKOL_PRIVATE void _sg_mtl_apply_bindings( + _sg_pipeline_t* pip, + _sg_buffer_t** vbs, const int* vb_offsets, int num_vbs, + _sg_buffer_t* ib, int ib_offset, + _sg_image_t** vs_imgs, int num_vs_imgs, + _sg_image_t** fs_imgs, int num_fs_imgs) +{ + _SOKOL_UNUSED(pip); + SOKOL_ASSERT(_sg.mtl.in_pass); + if (!_sg.mtl.pass_valid) { + return; + } + SOKOL_ASSERT(nil != _sg.mtl.cmd_encoder); + + /* store index buffer binding, this will be needed later in sg_draw() */ + _sg.mtl.state_cache.cur_indexbuffer = ib; + _sg.mtl.state_cache.cur_indexbuffer_offset = ib_offset; + if (ib) { + SOKOL_ASSERT(pip->cmn.index_type != SG_INDEXTYPE_NONE); + _sg.mtl.state_cache.cur_indexbuffer_id.id = ib->slot.id; + } + else { + SOKOL_ASSERT(pip->cmn.index_type == SG_INDEXTYPE_NONE); + _sg.mtl.state_cache.cur_indexbuffer_id.id = SG_INVALID_ID; + } + + /* apply vertex buffers */ + NSUInteger slot; + for (slot = 0; slot < (NSUInteger)num_vbs; slot++) { + const _sg_buffer_t* vb = vbs[slot]; + if ((_sg.mtl.state_cache.cur_vertexbuffers[slot] != vb) || + (_sg.mtl.state_cache.cur_vertexbuffer_offsets[slot] != vb_offsets[slot]) || + (_sg.mtl.state_cache.cur_vertexbuffer_ids[slot].id != vb->slot.id)) + { + _sg.mtl.state_cache.cur_vertexbuffers[slot] = vb; + _sg.mtl.state_cache.cur_vertexbuffer_offsets[slot] = vb_offsets[slot]; + _sg.mtl.state_cache.cur_vertexbuffer_ids[slot].id = vb->slot.id; + const NSUInteger mtl_slot = SG_MAX_SHADERSTAGE_UBS + slot; + SOKOL_ASSERT(vb->mtl.buf[vb->cmn.active_slot] != _SG_MTL_INVALID_SLOT_INDEX); + [_sg.mtl.cmd_encoder setVertexBuffer:_sg_mtl_id(vb->mtl.buf[vb->cmn.active_slot]) + offset:(NSUInteger)vb_offsets[slot] + atIndex:mtl_slot]; + } + } + + /* apply vertex shader images */ + for (slot = 0; slot < (NSUInteger)num_vs_imgs; slot++) { + const _sg_image_t* img = vs_imgs[slot]; + if ((_sg.mtl.state_cache.cur_vs_images[slot] != img) || (_sg.mtl.state_cache.cur_vs_image_ids[slot].id != img->slot.id)) { + _sg.mtl.state_cache.cur_vs_images[slot] = img; + _sg.mtl.state_cache.cur_vs_image_ids[slot].id = img->slot.id; + SOKOL_ASSERT(img->mtl.tex[img->cmn.active_slot] != _SG_MTL_INVALID_SLOT_INDEX); + [_sg.mtl.cmd_encoder setVertexTexture:_sg_mtl_id(img->mtl.tex[img->cmn.active_slot]) atIndex:slot]; + SOKOL_ASSERT(img->mtl.sampler_state != _SG_MTL_INVALID_SLOT_INDEX); + [_sg.mtl.cmd_encoder setVertexSamplerState:_sg_mtl_id(img->mtl.sampler_state) atIndex:slot]; + } + } + + /* apply fragment shader images */ + for (slot = 0; slot < (NSUInteger)num_fs_imgs; slot++) { + const _sg_image_t* img = fs_imgs[slot]; + if ((_sg.mtl.state_cache.cur_fs_images[slot] != img) || (_sg.mtl.state_cache.cur_fs_image_ids[slot].id != img->slot.id)) { + _sg.mtl.state_cache.cur_fs_images[slot] = img; + _sg.mtl.state_cache.cur_fs_image_ids[slot].id = img->slot.id; + SOKOL_ASSERT(img->mtl.tex[img->cmn.active_slot] != _SG_MTL_INVALID_SLOT_INDEX); + [_sg.mtl.cmd_encoder setFragmentTexture:_sg_mtl_id(img->mtl.tex[img->cmn.active_slot]) atIndex:slot]; + SOKOL_ASSERT(img->mtl.sampler_state != _SG_MTL_INVALID_SLOT_INDEX); + [_sg.mtl.cmd_encoder setFragmentSamplerState:_sg_mtl_id(img->mtl.sampler_state) atIndex:slot]; + } + } +} + +_SOKOL_PRIVATE void _sg_mtl_apply_uniforms(sg_shader_stage stage_index, int ub_index, const sg_range* data) { + SOKOL_ASSERT(_sg.mtl.in_pass); + if (!_sg.mtl.pass_valid) { + return; + } + SOKOL_ASSERT(nil != _sg.mtl.cmd_encoder); + SOKOL_ASSERT(((size_t)_sg.mtl.cur_ub_offset + data->size) <= (size_t)_sg.mtl.ub_size); + SOKOL_ASSERT((_sg.mtl.cur_ub_offset & (_SG_MTL_UB_ALIGN-1)) == 0); + SOKOL_ASSERT(_sg.mtl.state_cache.cur_pipeline && _sg.mtl.state_cache.cur_pipeline->shader); + SOKOL_ASSERT(_sg.mtl.state_cache.cur_pipeline->slot.id == _sg.mtl.state_cache.cur_pipeline_id.id); + SOKOL_ASSERT(_sg.mtl.state_cache.cur_pipeline->shader->slot.id == _sg.mtl.state_cache.cur_pipeline->cmn.shader_id.id); + SOKOL_ASSERT(ub_index < _sg.mtl.state_cache.cur_pipeline->shader->cmn.stage[stage_index].num_uniform_blocks); + SOKOL_ASSERT(data->size <= _sg.mtl.state_cache.cur_pipeline->shader->cmn.stage[stage_index].uniform_blocks[ub_index].size); + + /* copy to global uniform buffer, record offset into cmd encoder, and advance offset */ + uint8_t* dst = &_sg.mtl.cur_ub_base_ptr[_sg.mtl.cur_ub_offset]; + memcpy(dst, data->ptr, data->size); + if (stage_index == SG_SHADERSTAGE_VS) { + [_sg.mtl.cmd_encoder setVertexBufferOffset:(NSUInteger)_sg.mtl.cur_ub_offset atIndex:(NSUInteger)ub_index]; + } + else { + [_sg.mtl.cmd_encoder setFragmentBufferOffset:(NSUInteger)_sg.mtl.cur_ub_offset atIndex:(NSUInteger)ub_index]; + } + _sg.mtl.cur_ub_offset = _sg_roundup(_sg.mtl.cur_ub_offset + (int)data->size, _SG_MTL_UB_ALIGN); +} + +_SOKOL_PRIVATE void _sg_mtl_draw(int base_element, int num_elements, int num_instances) { + SOKOL_ASSERT(_sg.mtl.in_pass); + if (!_sg.mtl.pass_valid) { + return; + } + SOKOL_ASSERT(nil != _sg.mtl.cmd_encoder); + SOKOL_ASSERT(_sg.mtl.state_cache.cur_pipeline && (_sg.mtl.state_cache.cur_pipeline->slot.id == _sg.mtl.state_cache.cur_pipeline_id.id)); + if (SG_INDEXTYPE_NONE != _sg.mtl.state_cache.cur_pipeline->cmn.index_type) { + /* indexed rendering */ + SOKOL_ASSERT(_sg.mtl.state_cache.cur_indexbuffer && (_sg.mtl.state_cache.cur_indexbuffer->slot.id == _sg.mtl.state_cache.cur_indexbuffer_id.id)); + const _sg_buffer_t* ib = _sg.mtl.state_cache.cur_indexbuffer; + SOKOL_ASSERT(ib->mtl.buf[ib->cmn.active_slot] != _SG_MTL_INVALID_SLOT_INDEX); + const NSUInteger index_buffer_offset = (NSUInteger) (_sg.mtl.state_cache.cur_indexbuffer_offset + base_element * _sg.mtl.state_cache.cur_pipeline->mtl.index_size); + [_sg.mtl.cmd_encoder drawIndexedPrimitives:_sg.mtl.state_cache.cur_pipeline->mtl.prim_type + indexCount:(NSUInteger)num_elements + indexType:_sg.mtl.state_cache.cur_pipeline->mtl.index_type + indexBuffer:_sg_mtl_id(ib->mtl.buf[ib->cmn.active_slot]) + indexBufferOffset:index_buffer_offset + instanceCount:(NSUInteger)num_instances]; + } + else { + /* non-indexed rendering */ + [_sg.mtl.cmd_encoder drawPrimitives:_sg.mtl.state_cache.cur_pipeline->mtl.prim_type + vertexStart:(NSUInteger)base_element + vertexCount:(NSUInteger)num_elements + instanceCount:(NSUInteger)num_instances]; + } +} + +_SOKOL_PRIVATE void _sg_mtl_update_buffer(_sg_buffer_t* buf, const sg_range* data) { + SOKOL_ASSERT(buf && data && data->ptr && (data->size > 0)); + if (++buf->cmn.active_slot >= buf->cmn.num_slots) { + buf->cmn.active_slot = 0; + } + __unsafe_unretained id mtl_buf = _sg_mtl_id(buf->mtl.buf[buf->cmn.active_slot]); + void* dst_ptr = [mtl_buf contents]; + memcpy(dst_ptr, data->ptr, data->size); + #if defined(_SG_TARGET_MACOS) + [mtl_buf didModifyRange:NSMakeRange(0, data->size)]; + #endif +} + +_SOKOL_PRIVATE int _sg_mtl_append_buffer(_sg_buffer_t* buf, const sg_range* data, bool new_frame) { + SOKOL_ASSERT(buf && data && data->ptr && (data->size > 0)); + if (new_frame) { + if (++buf->cmn.active_slot >= buf->cmn.num_slots) { + buf->cmn.active_slot = 0; + } + } + __unsafe_unretained id mtl_buf = _sg_mtl_id(buf->mtl.buf[buf->cmn.active_slot]); + uint8_t* dst_ptr = (uint8_t*) [mtl_buf contents]; + dst_ptr += buf->cmn.append_pos; + memcpy(dst_ptr, data->ptr, data->size); + #if defined(_SG_TARGET_MACOS) + [mtl_buf didModifyRange:NSMakeRange((NSUInteger)buf->cmn.append_pos, (NSUInteger)data->size)]; + #endif + /* NOTE: this is a requirement from WebGPU, but we want identical behaviour across all backends */ + return _sg_roundup((int)data->size, 4); +} + +_SOKOL_PRIVATE void _sg_mtl_update_image(_sg_image_t* img, const sg_image_data* data) { + SOKOL_ASSERT(img && data); + if (++img->cmn.active_slot >= img->cmn.num_slots) { + img->cmn.active_slot = 0; + } + __unsafe_unretained id mtl_tex = _sg_mtl_id(img->mtl.tex[img->cmn.active_slot]); + _sg_mtl_copy_image_data(img, mtl_tex, data); +} + +/*== WEBGPU BACKEND IMPLEMENTATION ===========================================*/ +#elif defined(SOKOL_WGPU) + +_SOKOL_PRIVATE WGPUBufferUsageFlags _sg_wgpu_buffer_usage(sg_buffer_type t, sg_usage u) { + WGPUBufferUsageFlags res = 0; + if (SG_BUFFERTYPE_VERTEXBUFFER == t) { + res |= WGPUBufferUsage_Vertex; + } + else { + res |= WGPUBufferUsage_Index; + } + if (SG_USAGE_IMMUTABLE != u) { + res |= WGPUBufferUsage_CopyDst; + } + return res; +} + +_SOKOL_PRIVATE WGPULoadOp _sg_wgpu_load_op(sg_action a) { + switch (a) { + case SG_ACTION_CLEAR: + case SG_ACTION_DONTCARE: + return WGPULoadOp_Clear; + case SG_ACTION_LOAD: + return WGPULoadOp_Load; + default: + SOKOL_UNREACHABLE; + return (WGPULoadOp)0; + } +} + +_SOKOL_PRIVATE WGPUTextureViewDimension _sg_wgpu_tex_viewdim(sg_image_type t) { + switch (t) { + case SG_IMAGETYPE_2D: return WGPUTextureViewDimension_2D; + case SG_IMAGETYPE_CUBE: return WGPUTextureViewDimension_Cube; + case SG_IMAGETYPE_3D: return WGPUTextureViewDimension_3D; + case SG_IMAGETYPE_ARRAY: return WGPUTextureViewDimension_2DArray; + default: SOKOL_UNREACHABLE; return WGPUTextureViewDimension_Force32; + } +} + +_SOKOL_PRIVATE WGPUTextureComponentType _sg_wgpu_tex_comptype(sg_sampler_type t) { + switch (t) { + case SG_SAMPLERTYPE_FLOAT: return WGPUTextureComponentType_Float; + case SG_SAMPLERTYPE_SINT: return WGPUTextureComponentType_Sint; + case SG_SAMPLERTYPE_UINT: return WGPUTextureComponentType_Uint; + default: SOKOL_UNREACHABLE; return WGPUTextureComponentType_Force32; + } +} + +_SOKOL_PRIVATE WGPUTextureDimension _sg_wgpu_tex_dim(sg_image_type t) { + if (SG_IMAGETYPE_3D == t) { + return WGPUTextureDimension_3D; + } + else { + return WGPUTextureDimension_2D; + } +} + +_SOKOL_PRIVATE WGPUAddressMode _sg_wgpu_sampler_addrmode(sg_wrap m) { + switch (m) { + case SG_WRAP_REPEAT: + return WGPUAddressMode_Repeat; + case SG_WRAP_CLAMP_TO_EDGE: + case SG_WRAP_CLAMP_TO_BORDER: + return WGPUAddressMode_ClampToEdge; + case SG_WRAP_MIRRORED_REPEAT: + return WGPUAddressMode_MirrorRepeat; + default: + SOKOL_UNREACHABLE; + return WGPUAddressMode_Force32; + } +} + +_SOKOL_PRIVATE WGPUFilterMode _sg_wgpu_sampler_minmagfilter(sg_filter f) { + switch (f) { + case SG_FILTER_NEAREST: + case SG_FILTER_NEAREST_MIPMAP_NEAREST: + case SG_FILTER_NEAREST_MIPMAP_LINEAR: + return WGPUFilterMode_Nearest; + case SG_FILTER_LINEAR: + case SG_FILTER_LINEAR_MIPMAP_NEAREST: + case SG_FILTER_LINEAR_MIPMAP_LINEAR: + return WGPUFilterMode_Linear; + default: + SOKOL_UNREACHABLE; + return WGPUFilterMode_Force32; + } +} + +_SOKOL_PRIVATE WGPUFilterMode _sg_wgpu_sampler_mipfilter(sg_filter f) { + switch (f) { + case SG_FILTER_NEAREST: + case SG_FILTER_LINEAR: + case SG_FILTER_NEAREST_MIPMAP_NEAREST: + case SG_FILTER_LINEAR_MIPMAP_NEAREST: + return WGPUFilterMode_Nearest; + case SG_FILTER_NEAREST_MIPMAP_LINEAR: + case SG_FILTER_LINEAR_MIPMAP_LINEAR: + return WGPUFilterMode_Linear; + default: + SOKOL_UNREACHABLE; + return WGPUFilterMode_Force32; + } +} + +_SOKOL_PRIVATE WGPUIndexFormat _sg_wgpu_indexformat(sg_index_type t) { + /* NOTE: there's no WGPUIndexFormat_None */ + return (t == SG_INDEXTYPE_UINT16) ? WGPUIndexFormat_Uint16 : WGPUIndexFormat_Uint32; +} + +_SOKOL_PRIVATE WGPUInputStepMode _sg_wgpu_stepmode(sg_vertex_step s) { + return (s == SG_VERTEXSTEP_PER_VERTEX) ? WGPUInputStepMode_Vertex : WGPUInputStepMode_Instance; +} + +_SOKOL_PRIVATE WGPUVertexFormat _sg_wgpu_vertexformat(sg_vertex_format f) { + switch (f) { + case SG_VERTEXFORMAT_FLOAT: return WGPUVertexFormat_Float; + case SG_VERTEXFORMAT_FLOAT2: return WGPUVertexFormat_Float2; + case SG_VERTEXFORMAT_FLOAT3: return WGPUVertexFormat_Float3; + case SG_VERTEXFORMAT_FLOAT4: return WGPUVertexFormat_Float4; + case SG_VERTEXFORMAT_BYTE4: return WGPUVertexFormat_Char4; + case SG_VERTEXFORMAT_BYTE4N: return WGPUVertexFormat_Char4Norm; + case SG_VERTEXFORMAT_UBYTE4: return WGPUVertexFormat_UChar4; + case SG_VERTEXFORMAT_UBYTE4N: return WGPUVertexFormat_UChar4Norm; + case SG_VERTEXFORMAT_SHORT2: return WGPUVertexFormat_Short2; + case SG_VERTEXFORMAT_SHORT2N: return WGPUVertexFormat_Short2Norm; + case SG_VERTEXFORMAT_USHORT2N: return WGPUVertexFormat_UShort2Norm; + case SG_VERTEXFORMAT_SHORT4: return WGPUVertexFormat_Short4; + case SG_VERTEXFORMAT_SHORT4N: return WGPUVertexFormat_Short4Norm; + case SG_VERTEXFORMAT_USHORT4N: return WGPUVertexFormat_UShort4Norm; + /* FIXME! UINT10_N2 */ + case SG_VERTEXFORMAT_UINT10_N2: + default: + SOKOL_UNREACHABLE; + return WGPUVertexFormat_Force32; + } +} + +_SOKOL_PRIVATE WGPUPrimitiveTopology _sg_wgpu_topology(sg_primitive_type t) { + switch (t) { + case SG_PRIMITIVETYPE_POINTS: return WGPUPrimitiveTopology_PointList; + case SG_PRIMITIVETYPE_LINES: return WGPUPrimitiveTopology_LineList; + case SG_PRIMITIVETYPE_LINE_STRIP: return WGPUPrimitiveTopology_LineStrip; + case SG_PRIMITIVETYPE_TRIANGLES: return WGPUPrimitiveTopology_TriangleList; + case SG_PRIMITIVETYPE_TRIANGLE_STRIP: return WGPUPrimitiveTopology_TriangleStrip; + default: SOKOL_UNREACHABLE; return WGPUPrimitiveTopology_Force32; + } +} + +_SOKOL_PRIVATE WGPUFrontFace _sg_wgpu_frontface(sg_face_winding fw) { + return (fw == SG_FACEWINDING_CCW) ? WGPUFrontFace_CCW : WGPUFrontFace_CW; +} + +_SOKOL_PRIVATE WGPUCullMode _sg_wgpu_cullmode(sg_cull_mode cm) { + switch (cm) { + case SG_CULLMODE_NONE: return WGPUCullMode_None; + case SG_CULLMODE_FRONT: return WGPUCullMode_Front; + case SG_CULLMODE_BACK: return WGPUCullMode_Back; + default: SOKOL_UNREACHABLE; return WGPUCullMode_Force32; + } +} + +_SOKOL_PRIVATE WGPUTextureFormat _sg_wgpu_textureformat(sg_pixel_format p) { + switch (p) { + case SG_PIXELFORMAT_NONE: return WGPUTextureFormat_Undefined; + case SG_PIXELFORMAT_R8: return WGPUTextureFormat_R8Unorm; + case SG_PIXELFORMAT_R8SN: return WGPUTextureFormat_R8Snorm; + case SG_PIXELFORMAT_R8UI: return WGPUTextureFormat_R8Uint; + case SG_PIXELFORMAT_R8SI: return WGPUTextureFormat_R8Sint; + case SG_PIXELFORMAT_R16UI: return WGPUTextureFormat_R16Uint; + case SG_PIXELFORMAT_R16SI: return WGPUTextureFormat_R16Sint; + case SG_PIXELFORMAT_R16F: return WGPUTextureFormat_R16Float; + case SG_PIXELFORMAT_RG8: return WGPUTextureFormat_RG8Unorm; + case SG_PIXELFORMAT_RG8SN: return WGPUTextureFormat_RG8Snorm; + case SG_PIXELFORMAT_RG8UI: return WGPUTextureFormat_RG8Uint; + case SG_PIXELFORMAT_RG8SI: return WGPUTextureFormat_RG8Sint; + case SG_PIXELFORMAT_R32UI: return WGPUTextureFormat_R32Uint; + case SG_PIXELFORMAT_R32SI: return WGPUTextureFormat_R32Sint; + case SG_PIXELFORMAT_R32F: return WGPUTextureFormat_R32Float; + case SG_PIXELFORMAT_RG16UI: return WGPUTextureFormat_RG16Uint; + case SG_PIXELFORMAT_RG16SI: return WGPUTextureFormat_RG16Sint; + case SG_PIXELFORMAT_RG16F: return WGPUTextureFormat_RG16Float; + case SG_PIXELFORMAT_RGBA8: return WGPUTextureFormat_RGBA8Unorm; + case SG_PIXELFORMAT_RGBA8SN: return WGPUTextureFormat_RGBA8Snorm; + case SG_PIXELFORMAT_RGBA8UI: return WGPUTextureFormat_RGBA8Uint; + case SG_PIXELFORMAT_RGBA8SI: return WGPUTextureFormat_RGBA8Sint; + case SG_PIXELFORMAT_BGRA8: return WGPUTextureFormat_BGRA8Unorm; + case SG_PIXELFORMAT_RGB10A2: return WGPUTextureFormat_RGB10A2Unorm; + case SG_PIXELFORMAT_RG11B10F: return WGPUTextureFormat_RG11B10Float; + case SG_PIXELFORMAT_RG32UI: return WGPUTextureFormat_RG32Uint; + case SG_PIXELFORMAT_RG32SI: return WGPUTextureFormat_RG32Sint; + case SG_PIXELFORMAT_RG32F: return WGPUTextureFormat_RG32Float; + case SG_PIXELFORMAT_RGBA16UI: return WGPUTextureFormat_RGBA16Uint; + case SG_PIXELFORMAT_RGBA16SI: return WGPUTextureFormat_RGBA16Sint; + case SG_PIXELFORMAT_RGBA16F: return WGPUTextureFormat_RGBA16Float; + case SG_PIXELFORMAT_RGBA32UI: return WGPUTextureFormat_RGBA32Uint; + case SG_PIXELFORMAT_RGBA32SI: return WGPUTextureFormat_RGBA32Sint; + case SG_PIXELFORMAT_RGBA32F: return WGPUTextureFormat_RGBA32Float; + case SG_PIXELFORMAT_DEPTH: return WGPUTextureFormat_Depth24Plus; + case SG_PIXELFORMAT_DEPTH_STENCIL: return WGPUTextureFormat_Depth24PlusStencil8; + case SG_PIXELFORMAT_BC1_RGBA: return WGPUTextureFormat_BC1RGBAUnorm; + case SG_PIXELFORMAT_BC2_RGBA: return WGPUTextureFormat_BC2RGBAUnorm; + case SG_PIXELFORMAT_BC3_RGBA: return WGPUTextureFormat_BC3RGBAUnorm; + case SG_PIXELFORMAT_BC4_R: return WGPUTextureFormat_BC4RUnorm; + case SG_PIXELFORMAT_BC4_RSN: return WGPUTextureFormat_BC4RSnorm; + case SG_PIXELFORMAT_BC5_RG: return WGPUTextureFormat_BC5RGUnorm; + case SG_PIXELFORMAT_BC5_RGSN: return WGPUTextureFormat_BC5RGSnorm; + case SG_PIXELFORMAT_BC6H_RGBF: return WGPUTextureFormat_BC6HRGBSfloat; + case SG_PIXELFORMAT_BC6H_RGBUF: return WGPUTextureFormat_BC6HRGBUfloat; + case SG_PIXELFORMAT_BC7_RGBA: return WGPUTextureFormat_BC7RGBAUnorm; + + /* NOT SUPPORTED */ + case SG_PIXELFORMAT_R16: + case SG_PIXELFORMAT_R16SN: + case SG_PIXELFORMAT_RG16: + case SG_PIXELFORMAT_RG16SN: + case SG_PIXELFORMAT_RGBA16: + case SG_PIXELFORMAT_RGBA16SN: + case SG_PIXELFORMAT_PVRTC_RGB_2BPP: + case SG_PIXELFORMAT_PVRTC_RGB_4BPP: + case SG_PIXELFORMAT_PVRTC_RGBA_2BPP: + case SG_PIXELFORMAT_PVRTC_RGBA_4BPP: + case SG_PIXELFORMAT_ETC2_RGB8: + case SG_PIXELFORMAT_ETC2_RGB8A1: + case SG_PIXELFORMAT_ETC2_RGBA8: + case SG_PIXELFORMAT_ETC2_RG11: + case SG_PIXELFORMAT_ETC2_RG11SN: + default: + SOKOL_UNREACHABLE; + return WGPUTextureFormat_Force32; + } +} + +/* +FIXME ??? this isn't needed anywhere? +_SOKOL_PRIVATE WGPUTextureAspect _sg_wgpu_texture_aspect(sg_pixel_format fmt) { + if (_sg_is_valid_rendertarget_depth_format(fmt)) { + if (!_sg_is_depth_stencil_format(fmt)) { + return WGPUTextureAspect_DepthOnly; + } + } + return WGPUTextureAspect_All; +} +*/ + +_SOKOL_PRIVATE WGPUCompareFunction _sg_wgpu_comparefunc(sg_compare_func f) { + switch (f) { + case SG_COMPAREFUNC_NEVER: return WGPUCompareFunction_Never; + case SG_COMPAREFUNC_LESS: return WGPUCompareFunction_Less; + case SG_COMPAREFUNC_EQUAL: return WGPUCompareFunction_Equal; + case SG_COMPAREFUNC_LESS_EQUAL: return WGPUCompareFunction_LessEqual; + case SG_COMPAREFUNC_GREATER: return WGPUCompareFunction_Greater; + case SG_COMPAREFUNC_NOT_EQUAL: return WGPUCompareFunction_NotEqual; + case SG_COMPAREFUNC_GREATER_EQUAL: return WGPUCompareFunction_GreaterEqual; + case SG_COMPAREFUNC_ALWAYS: return WGPUCompareFunction_Always; + default: SOKOL_UNREACHABLE; return WGPUCompareFunction_Force32; + } +} + +_SOKOL_PRIVATE WGPUStencilOperation _sg_wgpu_stencilop(sg_stencil_op op) { + switch (op) { + case SG_STENCILOP_KEEP: return WGPUStencilOperation_Keep; + case SG_STENCILOP_ZERO: return WGPUStencilOperation_Zero; + case SG_STENCILOP_REPLACE: return WGPUStencilOperation_Replace; + case SG_STENCILOP_INCR_CLAMP: return WGPUStencilOperation_IncrementClamp; + case SG_STENCILOP_DECR_CLAMP: return WGPUStencilOperation_DecrementClamp; + case SG_STENCILOP_INVERT: return WGPUStencilOperation_Invert; + case SG_STENCILOP_INCR_WRAP: return WGPUStencilOperation_IncrementWrap; + case SG_STENCILOP_DECR_WRAP: return WGPUStencilOperation_DecrementWrap; + default: SOKOL_UNREACHABLE; return WGPUStencilOperation_Force32; + } +} + +_SOKOL_PRIVATE WGPUBlendOperation _sg_wgpu_blendop(sg_blend_op op) { + switch (op) { + case SG_BLENDOP_ADD: return WGPUBlendOperation_Add; + case SG_BLENDOP_SUBTRACT: return WGPUBlendOperation_Subtract; + case SG_BLENDOP_REVERSE_SUBTRACT: return WGPUBlendOperation_ReverseSubtract; + default: SOKOL_UNREACHABLE; return WGPUBlendOperation_Force32; + } +} + +_SOKOL_PRIVATE WGPUBlendFactor _sg_wgpu_blendfactor(sg_blend_factor f) { + switch (f) { + case SG_BLENDFACTOR_ZERO: return WGPUBlendFactor_Zero; + case SG_BLENDFACTOR_ONE: return WGPUBlendFactor_One; + case SG_BLENDFACTOR_SRC_COLOR: return WGPUBlendFactor_SrcColor; + case SG_BLENDFACTOR_ONE_MINUS_SRC_COLOR: return WGPUBlendFactor_OneMinusSrcColor; + case SG_BLENDFACTOR_SRC_ALPHA: return WGPUBlendFactor_SrcAlpha; + case SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA: return WGPUBlendFactor_OneMinusSrcAlpha; + case SG_BLENDFACTOR_DST_COLOR: return WGPUBlendFactor_DstColor; + case SG_BLENDFACTOR_ONE_MINUS_DST_COLOR: return WGPUBlendFactor_OneMinusDstColor; + case SG_BLENDFACTOR_DST_ALPHA: return WGPUBlendFactor_DstAlpha; + case SG_BLENDFACTOR_ONE_MINUS_DST_ALPHA: return WGPUBlendFactor_OneMinusDstAlpha; + case SG_BLENDFACTOR_SRC_ALPHA_SATURATED: return WGPUBlendFactor_SrcAlphaSaturated; + case SG_BLENDFACTOR_BLEND_COLOR: return WGPUBlendFactor_BlendColor; + case SG_BLENDFACTOR_ONE_MINUS_BLEND_COLOR: return WGPUBlendFactor_OneMinusBlendColor; + /* FIXME: separate blend alpha value not supported? */ + case SG_BLENDFACTOR_BLEND_ALPHA: return WGPUBlendFactor_BlendColor; + case SG_BLENDFACTOR_ONE_MINUS_BLEND_ALPHA: return WGPUBlendFactor_OneMinusBlendColor; + default: + SOKOL_UNREACHABLE; return WGPUBlendFactor_Force32; + } +} + +_SOKOL_PRIVATE WGPUColorWriteMaskFlags _sg_wgpu_colorwritemask(uint8_t m) { + WGPUColorWriteMaskFlags res = 0; + if (0 != (m & SG_COLORMASK_R)) { + res |= WGPUColorWriteMask_Red; + } + if (0 != (m & SG_COLORMASK_G)) { + res |= WGPUColorWriteMask_Green; + } + if (0 != (m & SG_COLORMASK_B)) { + res |= WGPUColorWriteMask_Blue; + } + if (0 != (m & SG_COLORMASK_A)) { + res |= WGPUColorWriteMask_Alpha; + } + return res; +} + +_SOKOL_PRIVATE void _sg_wgpu_init_caps(void) { + _sg.backend = SG_BACKEND_WGPU; + _sg.features.instancing = true; + _sg.features.origin_top_left = true; + _sg.features.multiple_render_targets = true; + _sg.features.msaa_render_targets = true; + _sg.features.imagetype_3d = true; + _sg.features.imagetype_array = true; + _sg.features.image_clamp_to_border = false; + _sg.features.mrt_independent_blend_state = true; + _sg.features.mrt_independent_write_mask = true; + + /* FIXME: max images size??? */ + _sg.limits.max_image_size_2d = 8 * 1024; + _sg.limits.max_image_size_cube = 8 * 1024; + _sg.limits.max_image_size_3d = 2 * 1024; + _sg.limits.max_image_size_array = 8 * 1024; + _sg.limits.max_image_array_layers = 2 * 1024; + _sg.limits.max_vertex_attrs = SG_MAX_VERTEX_ATTRIBUTES; + + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R8]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_R8SN]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R8UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R8SI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R16UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_R16SI]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_R16F]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG8]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_RG8SN]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG8UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG8SI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_R32UI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_R32SI]); + _sg_pixelformat_sbr(&_sg.formats[SG_PIXELFORMAT_R32F]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG16UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RG16SI]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RG16F]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA8]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_RGBA8SN]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA8UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA8SI]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_BGRA8]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGB10A2]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_RG32UI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_RG32SI]); + _sg_pixelformat_sbr(&_sg.formats[SG_PIXELFORMAT_RG32F]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA16UI]); + _sg_pixelformat_srm(&_sg.formats[SG_PIXELFORMAT_RGBA16SI]); + _sg_pixelformat_all(&_sg.formats[SG_PIXELFORMAT_RGBA16F]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_RGBA32UI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_RGBA32SI]); + _sg_pixelformat_sr(&_sg.formats[SG_PIXELFORMAT_RGBA32F]); + _sg_pixelformat_srmd(&_sg.formats[SG_PIXELFORMAT_DEPTH]); + _sg_pixelformat_srmd(&_sg.formats[SG_PIXELFORMAT_DEPTH_STENCIL]); + + /* FIXME FIXME FIXME: need to check if BC texture compression is + actually supported, currently the WebGPU C-API doesn't allow this + */ + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC1_RGBA]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC2_RGBA]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC3_RGBA]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC4_R]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC4_RSN]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC5_RG]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC5_RGSN]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC6H_RGBF]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC6H_RGBUF]); + _sg_pixelformat_sf(&_sg.formats[SG_PIXELFORMAT_BC7_RGBA]); +} + +/* + WGPU uniform buffer pool implementation: + + At start of frame, a mapped buffer is grabbed from the pool, + or a new buffer is created if there is no mapped buffer available. + + At end of frame, the current buffer is unmapped before queue submit, + and async-mapped immediately again. + + UNIFORM BUFFER FIXME: + + - As per WebGPU spec, it should be possible to create a Uniform|MapWrite + buffer, but this isn't currently allowed in Dawn. +*/ +_SOKOL_PRIVATE void _sg_wgpu_ubpool_init(const sg_desc* desc) { + + /* Add the max-uniform-update size (64 KB) to the requested buffer size, + this is to prevent validation errors in the WebGPU implementation + if the entire buffer size is used per frame. 64 KB is the allowed + max uniform update size on NVIDIA + */ + _sg.wgpu.ub.num_bytes = desc->uniform_buffer_size + _SG_WGPU_MAX_UNIFORM_UPDATE_SIZE; + + WGPUBufferDescriptor ub_desc; + memset(&ub_desc, 0, sizeof(ub_desc)); + ub_desc.size = _sg.wgpu.ub.num_bytes; + ub_desc.usage = WGPUBufferUsage_Uniform|WGPUBufferUsage_CopyDst; + _sg.wgpu.ub.buf = wgpuDeviceCreateBuffer(_sg.wgpu.dev, &ub_desc); + SOKOL_ASSERT(_sg.wgpu.ub.buf); + + WGPUBindGroupLayoutBinding ub_bglb_desc[SG_NUM_SHADER_STAGES][SG_MAX_SHADERSTAGE_UBS]; + memset(ub_bglb_desc, 0, sizeof(ub_bglb_desc)); + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + WGPUShaderStage vis = (stage_index == SG_SHADERSTAGE_VS) ? WGPUShaderStage_Vertex : WGPUShaderStage_Fragment; + for (int ub_index = 0; ub_index < SG_MAX_SHADERSTAGE_UBS; ub_index++) { + int bind_index = stage_index * SG_MAX_SHADERSTAGE_UBS + ub_index; + ub_bglb_desc[stage_index][ub_index].binding = bind_index; + ub_bglb_desc[stage_index][ub_index].visibility = vis; + ub_bglb_desc[stage_index][ub_index].type = WGPUBindingType_UniformBuffer; + ub_bglb_desc[stage_index][ub_index].hasDynamicOffset = true; + } + } + + WGPUBindGroupLayoutDescriptor ub_bgl_desc; + memset(&ub_bgl_desc, 0, sizeof(ub_bgl_desc)); + ub_bgl_desc.bindingCount = SG_NUM_SHADER_STAGES * SG_MAX_SHADERSTAGE_UBS; + ub_bgl_desc.bindings = &ub_bglb_desc[0][0]; + _sg.wgpu.ub.bindgroup_layout = wgpuDeviceCreateBindGroupLayout(_sg.wgpu.dev, &ub_bgl_desc); + SOKOL_ASSERT(_sg.wgpu.ub.bindgroup_layout); + + WGPUBindGroupBinding ub_bgb[SG_NUM_SHADER_STAGES][SG_MAX_SHADERSTAGE_UBS]; + memset(ub_bgb, 0, sizeof(ub_bgb)); + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + for (int ub_index = 0; ub_index < SG_MAX_SHADERSTAGE_UBS; ub_index++) { + int bind_index = stage_index * SG_MAX_SHADERSTAGE_UBS + ub_index; + ub_bgb[stage_index][ub_index].binding = bind_index; + ub_bgb[stage_index][ub_index].buffer = _sg.wgpu.ub.buf; + // FIXME FIXME FIXME FIXME: HACK FOR VALIDATION BUG IN DAWN + ub_bgb[stage_index][ub_index].size = (1<<16); + } + } + WGPUBindGroupDescriptor bg_desc; + memset(&bg_desc, 0, sizeof(bg_desc)); + bg_desc.layout = _sg.wgpu.ub.bindgroup_layout; + bg_desc.bindingCount = SG_NUM_SHADER_STAGES * SG_MAX_SHADERSTAGE_UBS; + bg_desc.bindings = &ub_bgb[0][0]; + _sg.wgpu.ub.bindgroup = wgpuDeviceCreateBindGroup(_sg.wgpu.dev, &bg_desc); + SOKOL_ASSERT(_sg.wgpu.ub.bindgroup); +} + +_SOKOL_PRIVATE void _sg_wgpu_ubpool_discard(void) { + if (_sg.wgpu.ub.buf) { + wgpuBufferRelease(_sg.wgpu.ub.buf); + _sg.wgpu.ub.buf = 0; + } + if (_sg.wgpu.ub.bindgroup) { + wgpuBindGroupRelease(_sg.wgpu.ub.bindgroup); + _sg.wgpu.ub.bindgroup = 0; + } + if (_sg.wgpu.ub.bindgroup_layout) { + wgpuBindGroupLayoutRelease(_sg.wgpu.ub.bindgroup_layout); + _sg.wgpu.ub.bindgroup_layout = 0; + } + for (int i = 0; i < _sg.wgpu.ub.stage.num; i++) { + if (_sg.wgpu.ub.stage.buf[i]) { + wgpuBufferRelease(_sg.wgpu.ub.stage.buf[i]); + _sg.wgpu.ub.stage.buf[i] = 0; + _sg.wgpu.ub.stage.ptr[i] = 0; + } + } +} + +_SOKOL_PRIVATE void _sg_wgpu_ubpool_mapped_callback(WGPUBufferMapAsyncStatus status, void* data, uint64_t data_len, void* user_data) { + if (!_sg.wgpu.valid) { + return; + } + /* FIXME: better handling for this */ + if (WGPUBufferMapAsyncStatus_Success != status) { + SOKOL_LOG("Mapping uniform buffer failed!\n"); + SOKOL_ASSERT(false); + } + SOKOL_ASSERT(data && (data_len == _sg.wgpu.ub.num_bytes)); + int index = (int)(intptr_t) user_data; + SOKOL_ASSERT(index < _sg.wgpu.ub.stage.num); + SOKOL_ASSERT(0 == _sg.wgpu.ub.stage.ptr[index]); + _sg.wgpu.ub.stage.ptr[index] = (uint8_t*) data; +} + +_SOKOL_PRIVATE void _sg_wgpu_ubpool_next_frame(bool first_frame) { + + /* immediately request a new mapping for the last frame's current staging buffer */ + if (!first_frame) { + WGPUBuffer ub_src = _sg.wgpu.ub.stage.buf[_sg.wgpu.ub.stage.cur]; + wgpuBufferMapWriteAsync(ub_src, _sg_wgpu_ubpool_mapped_callback, (void*)(intptr_t)_sg.wgpu.ub.stage.cur); + } + + /* rewind per-frame offsets */ + _sg.wgpu.ub.offset = 0; + memset(&_sg.wgpu.ub.bind_offsets, 0, sizeof(_sg.wgpu.ub.bind_offsets)); + + /* check if a mapped staging buffer is available, otherwise create one */ + for (int i = 0; i < _sg.wgpu.ub.stage.num; i++) { + if (_sg.wgpu.ub.stage.ptr[i]) { + _sg.wgpu.ub.stage.cur = i; + return; + } + } + + /* no mapped uniform buffer available, create one */ + SOKOL_ASSERT(_sg.wgpu.ub.stage.num < _SG_WGPU_STAGING_PIPELINE_SIZE); + _sg.wgpu.ub.stage.cur = _sg.wgpu.ub.stage.num++; + const int cur = _sg.wgpu.ub.stage.cur; + + WGPUBufferDescriptor desc; + memset(&desc, 0, sizeof(desc)); + desc.size = _sg.wgpu.ub.num_bytes; + desc.usage = WGPUBufferUsage_CopySrc|WGPUBufferUsage_MapWrite; + WGPUCreateBufferMappedResult res = wgpuDeviceCreateBufferMapped(_sg.wgpu.dev, &desc); + _sg.wgpu.ub.stage.buf[cur] = res.buffer; + _sg.wgpu.ub.stage.ptr[cur] = (uint8_t*) res.data; + SOKOL_ASSERT(_sg.wgpu.ub.stage.buf[cur]); + SOKOL_ASSERT(_sg.wgpu.ub.stage.ptr[cur]); + SOKOL_ASSERT(res.dataLength == _sg.wgpu.ub.num_bytes); +} + +_SOKOL_PRIVATE void _sg_wgpu_ubpool_flush(void) { + /* unmap staging buffer and copy to uniform buffer */ + const int cur = _sg.wgpu.ub.stage.cur; + SOKOL_ASSERT(_sg.wgpu.ub.stage.ptr[cur]); + _sg.wgpu.ub.stage.ptr[cur] = 0; + WGPUBuffer src_buf = _sg.wgpu.ub.stage.buf[cur]; + wgpuBufferUnmap(src_buf); + if (_sg.wgpu.ub.offset > 0) { + WGPUBuffer dst_buf = _sg.wgpu.ub.buf; + wgpuCommandEncoderCopyBufferToBuffer(_sg.wgpu.render_cmd_enc, src_buf, 0, dst_buf, 0, _sg.wgpu.ub.offset); + } +} + +/* helper function to compute number of bytes needed in staging buffer to copy image data */ +_SOKOL_PRIVATE uint32_t _sg_wgpu_image_data_buffer_size(const _sg_image_t* img) { + uint32_t num_bytes = 0; + const uint32_t num_faces = (img->cmn.type == SG_IMAGETYPE_CUBE) ? 6:1; + const uint32_t num_slices = (img->cmn.type == SG_IMAGETYPE_ARRAY) ? img->cmn.num_slices : 1; + for (int mip_index = 0; mip_index < img->cmn.num_mipmaps; mip_index++) { + const uint32_t mip_width = _sg_max(img->cmn.width >> mip_index, 1); + const uint32_t mip_height = _sg_max(img->cmn.height >> mip_index, 1); + /* row-pitch must be 256-aligend */ + const uint32_t bytes_per_slice = _sg_surface_pitch(img->cmn.pixel_format, mip_width, mip_height, _SG_WGPU_ROWPITCH_ALIGN); + num_bytes += bytes_per_slice * num_slices * num_faces; + } + return num_bytes; +} + +/* helper function to copy image data into a texture via a staging buffer, returns number of + bytes copied +*/ +_SOKOL_PRIVATE uint32_t _sg_wgpu_copy_image_data(WGPUBuffer stg_buf, uint8_t* stg_base_ptr, uint32_t stg_base_offset, _sg_image_t* img, const sg_image_data* data) { + SOKOL_ASSERT(_sg.wgpu.staging_cmd_enc); + SOKOL_ASSERT(stg_buf && stg_base_ptr); + SOKOL_ASSERT(img); + SOKOL_ASSERT(data); + uint32_t stg_offset = stg_base_offset; + const uint32_t num_faces = (img->cmn.type == SG_IMAGETYPE_CUBE) ? 6:1; + const uint32_t num_slices = (img->cmn.type == SG_IMAGETYPE_ARRAY) ? img->cmn.num_slices : 1; + const sg_pixel_format fmt = img->cmn.pixel_format; + WGPUBufferCopyView src_view; + memset(&src_view, 0, sizeof(src_view)); + src_view.buffer = stg_buf; + WGPUTextureCopyView dst_view; + memset(&dst_view, 0, sizeof(dst_view)); + dst_view.texture = img->wgpu.tex; + WGPUExtent3D extent; + memset(&extent, 0, sizeof(extent)); + + for (uint32_t face_index = 0; face_index < num_faces; face_index++) { + for (uint32_t mip_index = 0; mip_index < (uint32_t)img->cmn.num_mipmaps; mip_index++) { + SOKOL_ASSERT(data->subimage[face_index][mip_index].ptr); + SOKOL_ASSERT(data->subimage[face_index][mip_index].size > 0); + const uint8_t* src_base_ptr = (const uint8_t*)data->subimage[face_index][mip_index].ptr; + SOKOL_ASSERT(src_base_ptr); + uint8_t* dst_base_ptr = stg_base_ptr + stg_offset; + + const uint32_t mip_width = _sg_max(img->cmn.width >> mip_index, 1); + const uint32_t mip_height = _sg_max(img->cmn.height >> mip_index, 1); + const uint32_t mip_depth = (img->cmn.type == SG_IMAGETYPE_3D) ? _sg_max(img->cmn.num_slices >> mip_index, 1) : 1; + const uint32_t num_rows = _sg_num_rows(fmt, mip_height); + const uint32_t src_bytes_per_row = _sg_row_pitch(fmt, mip_width, 1); + const uint32_t dst_bytes_per_row = _sg_row_pitch(fmt, mip_width, _SG_WGPU_ROWPITCH_ALIGN); + const uint32_t src_bytes_per_slice = _sg_surface_pitch(fmt, mip_width, mip_height, 1); + const uint32_t dst_bytes_per_slice = _sg_surface_pitch(fmt, mip_width, mip_height, _SG_WGPU_ROWPITCH_ALIGN); + SOKOL_ASSERT((uint32_t)data->subimage[face_index][mip_index].size == (src_bytes_per_slice * num_slices)); + SOKOL_ASSERT(src_bytes_per_row <= dst_bytes_per_row); + SOKOL_ASSERT(src_bytes_per_slice == (src_bytes_per_row * num_rows)); + SOKOL_ASSERT(dst_bytes_per_slice == (dst_bytes_per_row * num_rows)); + _SOKOL_UNUSED(src_bytes_per_slice); + + /* copy data into mapped staging buffer */ + if (src_bytes_per_row == dst_bytes_per_row) { + /* can do a single memcpy */ + uint32_t num_bytes = data->subimage[face_index][mip_index].size; + memcpy(dst_base_ptr, src_base_ptr, num_bytes); + } + else { + /* src/dst pitch doesn't match, need to copy row by row */ + uint8_t* dst_ptr = dst_base_ptr; + const uint8_t* src_ptr = src_base_ptr; + for (uint32_t slice_index = 0; slice_index < num_slices; slice_index++) { + SOKOL_ASSERT(dst_ptr == dst_base_ptr + slice_index * dst_bytes_per_slice); + for (uint32_t row_index = 0; row_index < num_rows; row_index++) { + memcpy(dst_ptr, src_ptr, src_bytes_per_row); + src_ptr += src_bytes_per_row; + dst_ptr += dst_bytes_per_row; + } + } + } + + /* record the staging copy operation into command encoder */ + src_view.imageHeight = mip_height; + src_view.rowPitch = dst_bytes_per_row; + dst_view.mipLevel = mip_index; + extent.width = mip_width; + extent.height = mip_height; + extent.depth = mip_depth; + SOKOL_ASSERT((img->cmn.type != SG_IMAGETYPE_CUBE) || (num_slices == 1)); + for (uint32_t slice_index = 0; slice_index < num_slices; slice_index++) { + const uint32_t layer_index = (img->cmn.type == SG_IMAGETYPE_ARRAY) ? slice_index : face_index; + src_view.offset = stg_offset; + dst_view.arrayLayer = layer_index; + wgpuCommandEncoderCopyBufferToTexture(_sg.wgpu.staging_cmd_enc, &src_view, &dst_view, &extent); + stg_offset += dst_bytes_per_slice; + SOKOL_ASSERT(stg_offset <= _sg.wgpu.staging.num_bytes); + } + } + } + SOKOL_ASSERT(stg_offset >= stg_base_offset); + return (stg_offset - stg_base_offset); +} + +/* + The WGPU staging buffer implementation: + + Very similar to the uniform buffer pool, there's a pool of big + per-frame staging buffers, each must be big enough to hold + all data uploaded to dynamic resources for one frame. + + Staging buffers are created on demand and reused, because the + 'frame pipeline depth' of WGPU isn't predictable. + + The difference to the uniform buffer system is that there isn't + a 1:1 relationship for source- and destination for the + data-copy operation. There's always one staging buffer as copy-source + per frame, but many copy-destinations (regular vertex/index buffers + or images). Instead of one big copy-operation at the end of the frame, + multiple copy-operations will be written throughout the frame. +*/ +_SOKOL_PRIVATE void _sg_wgpu_staging_init(const sg_desc* desc) { + SOKOL_ASSERT(desc && (desc->staging_buffer_size > 0)); + _sg.wgpu.staging.num_bytes = desc->staging_buffer_size; + /* there's actually nothing more to do here */ +} + +_SOKOL_PRIVATE void _sg_wgpu_staging_discard(void) { + for (int i = 0; i < _sg.wgpu.staging.num; i++) { + if (_sg.wgpu.staging.buf[i]) { + wgpuBufferRelease(_sg.wgpu.staging.buf[i]); + _sg.wgpu.staging.buf[i] = 0; + _sg.wgpu.staging.ptr[i] = 0; + } + } +} + +_SOKOL_PRIVATE void _sg_wgpu_staging_mapped_callback(WGPUBufferMapAsyncStatus status, void* data, uint64_t data_len, void* user_data) { + if (!_sg.wgpu.valid) { + return; + } + /* FIXME: better handling for this */ + if (WGPUBufferMapAsyncStatus_Success != status) { + SOKOL_ASSERT("Mapping staging buffer failed!\n"); + SOKOL_ASSERT(false); + } + SOKOL_ASSERT(data && (data_len == _sg.wgpu.staging.num_bytes)); + int index = (int)(intptr_t) user_data; + SOKOL_ASSERT(index < _sg.wgpu.staging.num); + SOKOL_ASSERT(0 == _sg.wgpu.staging.ptr[index]); + _sg.wgpu.staging.ptr[index] = (uint8_t*) data; +} + +_SOKOL_PRIVATE void _sg_wgpu_staging_next_frame(bool first_frame) { + + /* immediately request a new mapping for the last frame's current staging buffer */ + if (!first_frame) { + WGPUBuffer cur_buf = _sg.wgpu.staging.buf[_sg.wgpu.staging.cur]; + wgpuBufferMapWriteAsync(cur_buf, _sg_wgpu_staging_mapped_callback, (void*)(intptr_t)_sg.wgpu.staging.cur); + } + + /* rewind staging-buffer offset */ + _sg.wgpu.staging.offset = 0; + + /* check if mapped staging buffer is available, otherwise create one */ + for (int i = 0; i < _sg.wgpu.staging.num; i++) { + if (_sg.wgpu.staging.ptr[i]) { + _sg.wgpu.staging.cur = i; + return; + } + } + + /* no mapped buffer available, create one */ + SOKOL_ASSERT(_sg.wgpu.staging.num < _SG_WGPU_STAGING_PIPELINE_SIZE); + _sg.wgpu.staging.cur = _sg.wgpu.staging.num++; + const int cur = _sg.wgpu.staging.cur; + + WGPUBufferDescriptor desc; + memset(&desc, 0, sizeof(desc)); + desc.size = _sg.wgpu.staging.num_bytes; + desc.usage = WGPUBufferUsage_CopySrc|WGPUBufferUsage_MapWrite; + WGPUCreateBufferMappedResult res = wgpuDeviceCreateBufferMapped(_sg.wgpu.dev, &desc); + _sg.wgpu.staging.buf[cur] = res.buffer; + _sg.wgpu.staging.ptr[cur] = (uint8_t*) res.data; + SOKOL_ASSERT(_sg.wgpu.staging.buf[cur]); + SOKOL_ASSERT(_sg.wgpu.staging.ptr[cur]); + SOKOL_ASSERT(res.dataLength == _sg.wgpu.staging.num_bytes); +} + +_SOKOL_PRIVATE uint32_t _sg_wgpu_staging_copy_to_buffer(WGPUBuffer dst_buf, uint32_t dst_buf_offset, const void* data, uint32_t data_num_bytes) { + /* Copy a chunk of data into the staging buffer, and record a blit-operation into + the command encoder, bump the offset for the next data chunk, return 0 if there + was not enough room in the staging buffer, return the number of actually + copied bytes on success. + + NOTE: that the number of staging bytes to be copied must be a multiple of 4. + + */ + SOKOL_ASSERT(_sg.wgpu.staging_cmd_enc); + SOKOL_ASSERT((dst_buf_offset & 3) == 0); + SOKOL_ASSERT(data_num_bytes > 0); + uint32_t copy_num_bytes = _sg_roundup(data_num_bytes, 4); + if ((_sg.wgpu.staging.offset + copy_num_bytes) >= _sg.wgpu.staging.num_bytes) { + SOKOL_LOG("WGPU: Per frame staging buffer full (in _sg_wgpu_staging_copy_to_buffer())!\n"); + return false; + } + const int cur = _sg.wgpu.staging.cur; + SOKOL_ASSERT(_sg.wgpu.staging.ptr[cur]); + uint32_t stg_buf_offset = _sg.wgpu.staging.offset; + uint8_t* stg_ptr = _sg.wgpu.staging.ptr[cur] + stg_buf_offset; + memcpy(stg_ptr, data, data_num_bytes); + WGPUBuffer stg_buf = _sg.wgpu.staging.buf[cur]; + wgpuCommandEncoderCopyBufferToBuffer(_sg.wgpu.staging_cmd_enc, stg_buf, stg_buf_offset, dst_buf, dst_buf_offset, copy_num_bytes); + _sg.wgpu.staging.offset = stg_buf_offset + copy_num_bytes; + return copy_num_bytes; +} + +_SOKOL_PRIVATE bool _sg_wgpu_staging_copy_to_texture(_sg_image_t* img, const sg_image_data* data) { + /* similar to _sg_wgpu_staging_copy_to_buffer(), but with image data instead */ + SOKOL_ASSERT(_sg.wgpu.staging_cmd_enc); + uint32_t num_bytes = _sg_wgpu_image_data_buffer_size(img); + if ((_sg.wgpu.staging.offset + num_bytes) >= _sg.wgpu.staging.num_bytes) { + SOKOL_LOG("WGPU: Per frame staging buffer full (in _sg_wgpu_staging_copy_to_texture)!\n"); + return false; + } + const int cur = _sg.wgpu.staging.cur; + SOKOL_ASSERT(_sg.wgpu.staging.ptr[cur]); + uint32_t stg_offset = _sg.wgpu.staging.offset; + uint8_t* stg_ptr = _sg.wgpu.staging.ptr[cur]; + WGPUBuffer stg_buf = _sg.wgpu.staging.buf[cur]; + uint32_t bytes_copied = _sg_wgpu_copy_image_data(stg_buf, stg_ptr, stg_offset, img, data); + _SOKOL_UNUSED(bytes_copied); + SOKOL_ASSERT(bytes_copied == num_bytes); + _sg.wgpu.staging.offset = _sg_roundup(stg_offset + num_bytes, _SG_WGPU_STAGING_ALIGN); + return true; +} + +_SOKOL_PRIVATE void _sg_wgpu_staging_unmap(void) { + /* called at end of frame before queue-submit */ + const int cur = _sg.wgpu.staging.cur; + SOKOL_ASSERT(_sg.wgpu.staging.ptr[cur]); + _sg.wgpu.staging.ptr[cur] = 0; + wgpuBufferUnmap(_sg.wgpu.staging.buf[cur]); +} + +/*--- WGPU sampler cache functions ---*/ +_SOKOL_PRIVATE void _sg_wgpu_init_sampler_cache(const sg_desc* desc) { + SOKOL_ASSERT(desc->sampler_cache_size > 0); + _sg_smpcache_init(&_sg.wgpu.sampler_cache, desc->sampler_cache_size); +} + +_SOKOL_PRIVATE void _sg_wgpu_destroy_sampler_cache(void) { + SOKOL_ASSERT(_sg.wgpu.sampler_cache.items); + SOKOL_ASSERT(_sg.wgpu.sampler_cache.num_items <= _sg.wgpu.sampler_cache.capacity); + for (int i = 0; i < _sg.wgpu.sampler_cache.num_items; i++) { + wgpuSamplerRelease((WGPUSampler)_sg_smpcache_sampler(&_sg.wgpu.sampler_cache, i)); + } + _sg_smpcache_discard(&_sg.wgpu.sampler_cache); +} + +_SOKOL_PRIVATE WGPUSampler _sg_wgpu_create_sampler(const sg_image_desc* img_desc) { + SOKOL_ASSERT(img_desc); + int index = _sg_smpcache_find_item(&_sg.wgpu.sampler_cache, img_desc); + if (index >= 0) { + /* reuse existing sampler */ + return (WGPUSampler) _sg_smpcache_sampler(&_sg.wgpu.sampler_cache, index); + } + else { + /* create a new WGPU sampler and add to sampler cache */ + /* FIXME: anisotropic filtering not supported? */ + WGPUSamplerDescriptor smp_desc; + memset(&smp_desc, 0, sizeof(smp_desc)); + smp_desc.addressModeU = _sg_wgpu_sampler_addrmode(img_desc->wrap_u); + smp_desc.addressModeV = _sg_wgpu_sampler_addrmode(img_desc->wrap_v); + smp_desc.addressModeW = _sg_wgpu_sampler_addrmode(img_desc->wrap_w); + smp_desc.magFilter = _sg_wgpu_sampler_minmagfilter(img_desc->mag_filter); + smp_desc.minFilter = _sg_wgpu_sampler_minmagfilter(img_desc->min_filter); + smp_desc.mipmapFilter = _sg_wgpu_sampler_mipfilter(img_desc->min_filter); + smp_desc.lodMinClamp = img_desc->min_lod; + smp_desc.lodMaxClamp = img_desc->max_lod; + WGPUSampler smp = wgpuDeviceCreateSampler(_sg.wgpu.dev, &smp_desc); + SOKOL_ASSERT(smp); + _sg_smpcache_add_item(&_sg.wgpu.sampler_cache, img_desc, (uintptr_t)smp); + return smp; + } +} + +/*--- WGPU backend API functions ---*/ +_SOKOL_PRIVATE void _sg_wgpu_setup_backend(const sg_desc* desc) { + SOKOL_ASSERT(desc); + SOKOL_ASSERT(desc->context.wgpu.device); + SOKOL_ASSERT(desc->context.wgpu.render_view_cb || desc->context.wgpu.render_view_userdata_cb); + SOKOL_ASSERT(desc->context.wgpu.resolve_view_cb || desc->context.wgpu.resolve_view_userdata_cb); + SOKOL_ASSERT(desc->context.wgpu.depth_stencil_view_cb || desc->context.wgpu.depth_stencil_view_userdata_cb); + SOKOL_ASSERT(desc->uniform_buffer_size > 0); + SOKOL_ASSERT(desc->staging_buffer_size > 0); + _sg.backend = SG_BACKEND_WGPU; + _sg.wgpu.valid = true; + _sg.wgpu.dev = (WGPUDevice) desc->context.wgpu.device; + _sg.wgpu.render_view_cb = (WGPUTextureView(*)(void)) desc->context.wgpu.render_view_cb; + _sg.wgpu.render_view_userdata_cb = (WGPUTextureView(*)(void*)) desc->context.wgpu.render_view_userdata_cb; + _sg.wgpu.resolve_view_cb = (WGPUTextureView(*)(void)) desc->context.wgpu.resolve_view_cb; + _sg.wgpu.resolve_view_userdata_cb = (WGPUTextureView(*)(void*)) desc->context.wgpu.resolve_view_userdata_cb; + _sg.wgpu.depth_stencil_view_cb = (WGPUTextureView(*)(void)) desc->context.wgpu.depth_stencil_view_cb; + _sg.wgpu.depth_stencil_view_userdata_cb = (WGPUTextureView(*)(void*)) desc->context.wgpu.depth_stencil_view_userdata_cb; + _sg.wgpu.user_data = desc->context.wgpu.user_data; + _sg.wgpu.queue = wgpuDeviceCreateQueue(_sg.wgpu.dev); + SOKOL_ASSERT(_sg.wgpu.queue); + + /* setup WebGPU features and limits */ + _sg_wgpu_init_caps(); + + /* setup the sampler cache, uniform and staging buffer pools */ + _sg_wgpu_init_sampler_cache(&_sg.desc); + _sg_wgpu_ubpool_init(desc); + _sg_wgpu_ubpool_next_frame(true); + _sg_wgpu_staging_init(desc); + _sg_wgpu_staging_next_frame(true); + + /* create an empty bind group for shader stages without bound images */ + WGPUBindGroupLayoutDescriptor bgl_desc; + memset(&bgl_desc, 0, sizeof(bgl_desc)); + WGPUBindGroupLayout empty_bgl = wgpuDeviceCreateBindGroupLayout(_sg.wgpu.dev, &bgl_desc); + SOKOL_ASSERT(empty_bgl); + WGPUBindGroupDescriptor bg_desc; + memset(&bg_desc, 0, sizeof(bg_desc)); + bg_desc.layout = empty_bgl; + _sg.wgpu.empty_bind_group = wgpuDeviceCreateBindGroup(_sg.wgpu.dev, &bg_desc); + SOKOL_ASSERT(_sg.wgpu.empty_bind_group); + wgpuBindGroupLayoutRelease(empty_bgl); + + /* create initial per-frame command encoders */ + WGPUCommandEncoderDescriptor cmd_enc_desc; + memset(&cmd_enc_desc, 0, sizeof(cmd_enc_desc)); + _sg.wgpu.render_cmd_enc = wgpuDeviceCreateCommandEncoder(_sg.wgpu.dev, &cmd_enc_desc); + SOKOL_ASSERT(_sg.wgpu.render_cmd_enc); + _sg.wgpu.staging_cmd_enc = wgpuDeviceCreateCommandEncoder(_sg.wgpu.dev, &cmd_enc_desc); + SOKOL_ASSERT(_sg.wgpu.staging_cmd_enc); +} + +_SOKOL_PRIVATE void _sg_wgpu_discard_backend(void) { + SOKOL_ASSERT(_sg.wgpu.valid); + SOKOL_ASSERT(_sg.wgpu.render_cmd_enc); + SOKOL_ASSERT(_sg.wgpu.staging_cmd_enc); + _sg.wgpu.valid = false; + _sg_wgpu_ubpool_discard(); + _sg_wgpu_staging_discard(); + _sg_wgpu_destroy_sampler_cache(); + wgpuBindGroupRelease(_sg.wgpu.empty_bind_group); + wgpuCommandEncoderRelease(_sg.wgpu.render_cmd_enc); + _sg.wgpu.render_cmd_enc = 0; + wgpuCommandEncoderRelease(_sg.wgpu.staging_cmd_enc); + _sg.wgpu.staging_cmd_enc = 0; + if (_sg.wgpu.queue) { + wgpuQueueRelease(_sg.wgpu.queue); + _sg.wgpu.queue = 0; + } +} + +_SOKOL_PRIVATE void _sg_wgpu_reset_state_cache(void) { + SOKOL_LOG("_sg_wgpu_reset_state_cache: FIXME\n"); +} + +_SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + _SOKOL_UNUSED(ctx); + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_wgpu_destroy_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + _SOKOL_UNUSED(ctx); +} + +_SOKOL_PRIVATE void _sg_wgpu_activate_context(_sg_context_t* ctx) { + (void)ctx; + SOKOL_LOG("_sg_wgpu_activate_context: FIXME\n"); +} + +_SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_buffer(_sg_buffer_t* buf, const sg_buffer_desc* desc) { + SOKOL_ASSERT(buf && desc); + const bool injected = (0 != desc->wgpu_buffer); + _sg_buffer_common_init(&buf->cmn, desc); + if (injected) { + buf->wgpu.buf = (WGPUBuffer) desc->wgpu_buffer; + wgpuBufferReference(buf->wgpu.buf); + } + else { + WGPUBufferDescriptor wgpu_buf_desc; + memset(&wgpu_buf_desc, 0, sizeof(wgpu_buf_desc)); + wgpu_buf_desc.usage = _sg_wgpu_buffer_usage(buf->cmn.type, buf->cmn.usage); + wgpu_buf_desc.size = buf->cmn.size; + if (SG_USAGE_IMMUTABLE == buf->cmn.usage) { + SOKOL_ASSERT(desc->data.ptr); + WGPUCreateBufferMappedResult res = wgpuDeviceCreateBufferMapped(_sg.wgpu.dev, &wgpu_buf_desc); + buf->wgpu.buf = res.buffer; + SOKOL_ASSERT(res.data && (res.dataLength == buf->cmn.size)); + memcpy(res.data, desc->data.ptr, buf->cmn.size); + wgpuBufferUnmap(res.buffer); + } + else { + buf->wgpu.buf = wgpuDeviceCreateBuffer(_sg.wgpu.dev, &wgpu_buf_desc); + } + } + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_wgpu_destroy_buffer(_sg_buffer_t* buf) { + SOKOL_ASSERT(buf); + WGPUBuffer wgpu_buf = buf->wgpu.buf; + if (0 != wgpu_buf) { + wgpuBufferRelease(wgpu_buf); + } +} + +_SOKOL_PRIVATE void _sg_wgpu_init_texdesc_common(WGPUTextureDescriptor* wgpu_tex_desc, const sg_image_desc* desc) { + wgpu_tex_desc->usage = WGPUTextureUsage_Sampled|WGPUTextureUsage_CopyDst; + wgpu_tex_desc->dimension = _sg_wgpu_tex_dim(desc->type); + wgpu_tex_desc->size.width = desc->width; + wgpu_tex_desc->size.height = desc->height; + if (desc->type == SG_IMAGETYPE_3D) { + wgpu_tex_desc->size.depth = desc->num_slices; + wgpu_tex_desc->arrayLayerCount = 1; + } + else if (desc->type == SG_IMAGETYPE_CUBE) { + wgpu_tex_desc->size.depth = 1; + wgpu_tex_desc->arrayLayerCount = 6; + } + else { + wgpu_tex_desc->size.depth = 1; + wgpu_tex_desc->arrayLayerCount = desc->num_slices; + } + wgpu_tex_desc->format = _sg_wgpu_textureformat(desc->pixel_format); + wgpu_tex_desc->mipLevelCount = desc->num_mipmaps; + wgpu_tex_desc->sampleCount = 1; +} + +_SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_image(_sg_image_t* img, const sg_image_desc* desc) { + SOKOL_ASSERT(img && desc); + SOKOL_ASSERT(_sg.wgpu.dev); + SOKOL_ASSERT(_sg.wgpu.staging_cmd_enc); + + _sg_image_common_init(&img->cmn, desc); + + const bool injected = (0 != desc->wgpu_texture); + const bool is_msaa = desc->sample_count > 1; + WGPUTextureDescriptor wgpu_tex_desc; + memset(&wgpu_tex_desc, 0, sizeof(wgpu_tex_desc)); + _sg_wgpu_init_texdesc_common(&wgpu_tex_desc, desc); + if (_sg_is_valid_rendertarget_depth_format(img->cmn.pixel_format)) { + SOKOL_ASSERT(img->cmn.render_target); + SOKOL_ASSERT(img->cmn.type == SG_IMAGETYPE_2D); + SOKOL_ASSERT(img->cmn.num_mipmaps == 1); + SOKOL_ASSERT(!injected); + /* NOTE: a depth-stencil texture will never be MSAA-resolved, so there + won't be a separate MSAA- and resolve-texture + */ + wgpu_tex_desc.usage = WGPUTextureUsage_OutputAttachment; + wgpu_tex_desc.sampleCount = desc->sample_count; + img->wgpu.tex = wgpuDeviceCreateTexture(_sg.wgpu.dev, &wgpu_tex_desc); + SOKOL_ASSERT(img->wgpu.tex); + } + else { + if (injected) { + img->wgpu.tex = (WGPUTexture) desc->wgpu_texture; + wgpuTextureReference(img->wgpu.tex); + } + else { + /* NOTE: in the MSAA-rendertarget case, both the MSAA texture *and* + the resolve texture need OutputAttachment usage + */ + if (img->cmn.render_target) { + wgpu_tex_desc.usage = WGPUTextureUsage_Sampled|WGPUTextureUsage_OutputAttachment; + } + img->wgpu.tex = wgpuDeviceCreateTexture(_sg.wgpu.dev, &wgpu_tex_desc); + SOKOL_ASSERT(img->wgpu.tex); + + /* copy content into texture via a throw-away staging buffer */ + if (desc->usage == SG_USAGE_IMMUTABLE && !desc->render_target) { + WGPUBufferDescriptor wgpu_buf_desc; + memset(&wgpu_buf_desc, 0, sizeof(wgpu_buf_desc)); + wgpu_buf_desc.size = _sg_wgpu_image_data_buffer_size(img); + wgpu_buf_desc.usage = WGPUBufferUsage_CopySrc|WGPUBufferUsage_CopyDst; + WGPUCreateBufferMappedResult map = wgpuDeviceCreateBufferMapped(_sg.wgpu.dev, &wgpu_buf_desc); + SOKOL_ASSERT(map.buffer && map.data); + uint32_t num_bytes = _sg_wgpu_copy_image_data(map.buffer, (uint8_t*)map.data, 0, img, &desc->data); + _SOKOL_UNUSED(num_bytes); + SOKOL_ASSERT(num_bytes == wgpu_buf_desc.size); + wgpuBufferUnmap(map.buffer); + wgpuBufferRelease(map.buffer); + } + } + + /* create texture view object */ + WGPUTextureViewDescriptor wgpu_view_desc; + memset(&wgpu_view_desc, 0, sizeof(wgpu_view_desc)); + wgpu_view_desc.dimension = _sg_wgpu_tex_viewdim(desc->type); + img->wgpu.tex_view = wgpuTextureCreateView(img->wgpu.tex, &wgpu_view_desc); + + /* if render target and MSAA, then a separate texture in MSAA format is needed + which will be resolved into the regular texture at the end of the + offscreen-render pass + */ + if (desc->render_target && is_msaa) { + wgpu_tex_desc.dimension = WGPUTextureDimension_2D; + wgpu_tex_desc.size.depth = 1; + wgpu_tex_desc.arrayLayerCount = 1; + wgpu_tex_desc.mipLevelCount = 1; + wgpu_tex_desc.usage = WGPUTextureUsage_OutputAttachment; + wgpu_tex_desc.sampleCount = desc->sample_count; + img->wgpu.msaa_tex = wgpuDeviceCreateTexture(_sg.wgpu.dev, &wgpu_tex_desc); + SOKOL_ASSERT(img->wgpu.msaa_tex); + } + + /* create sampler via shared-sampler-cache */ + img->wgpu.sampler = _sg_wgpu_create_sampler(desc); + SOKOL_ASSERT(img->wgpu.sampler); + } + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_wgpu_destroy_image(_sg_image_t* img) { + SOKOL_ASSERT(img); + if (img->wgpu.tex) { + wgpuTextureRelease(img->wgpu.tex); + img->wgpu.tex = 0; + } + if (img->wgpu.tex_view) { + wgpuTextureViewRelease(img->wgpu.tex_view); + img->wgpu.tex_view = 0; + } + if (img->wgpu.msaa_tex) { + wgpuTextureRelease(img->wgpu.msaa_tex); + img->wgpu.msaa_tex = 0; + } + /* NOTE: do *not* destroy the sampler from the shared-sampler-cache */ + img->wgpu.sampler = 0; +} + +/* + How BindGroups work in WebGPU: + + - up to 4 bind groups can be bound simultaneously + - up to 16 bindings per bind group + - 'binding' slots are local per bind group + - in the shader: + layout(set=0, binding=1) corresponds to bind group 0, binding 1 + + Now how to map this to sokol-gfx's bind model: + + Reduce SG_MAX_SHADERSTAGE_IMAGES to 8, then: + + 1 bind group for all 8 uniform buffers + 1 bind group for vertex shader textures + samplers + 1 bind group for fragment shader textures + samples + + Alternatively: + + 1 bind group for 8 uniform buffer slots + 1 bind group for 8 vs images + 8 vs samplers + 1 bind group for 12 fs images + 1 bind group for 12 fs samplers + + I guess this means that we need to create BindGroups on the + fly during sg_apply_bindings() :/ +*/ +_SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_shader(_sg_shader_t* shd, const sg_shader_desc* desc) { + SOKOL_ASSERT(shd && desc); + SOKOL_ASSERT(desc->vs.bytecode.ptr && desc->fs.bytecode.ptr); + _sg_shader_common_init(&shd->cmn, desc); + + bool success = true; + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + const sg_shader_stage_desc* stage_desc = (stage_index == SG_SHADERSTAGE_VS) ? &desc->vs : &desc->fs; + SOKOL_ASSERT((stage_desc->bytecode.size & 3) == 0); + + _sg_shader_stage_t* cmn_stage = &shd->cmn.stage[stage_index]; + _sg_wgpu_shader_stage_t* wgpu_stage = &shd->wgpu.stage[stage_index]; + + _sg_strcpy(&wgpu_stage->entry, stage_desc->entry); + WGPUShaderModuleDescriptor wgpu_shdmod_desc; + memset(&wgpu_shdmod_desc, 0, sizeof(wgpu_shdmod_desc)); + wgpu_shdmod_desc.codeSize = stage_desc->bytecode.size >> 2; + wgpu_shdmod_desc.code = (const uint32_t*) stage_desc->bytecode.ptr; + wgpu_stage->module = wgpuDeviceCreateShaderModule(_sg.wgpu.dev, &wgpu_shdmod_desc); + if (0 == wgpu_stage->module) { + success = false; + } + + /* create image/sampler bind group for the shader stage */ + WGPUShaderStage vis = (stage_index == SG_SHADERSTAGE_VS) ? WGPUShaderStage_Vertex : WGPUShaderStage_Fragment; + int num_imgs = cmn_stage->num_images; + if (num_imgs > _SG_WGPU_MAX_SHADERSTAGE_IMAGES) { + num_imgs = _SG_WGPU_MAX_SHADERSTAGE_IMAGES; + } + WGPUBindGroupLayoutBinding bglb_desc[_SG_WGPU_MAX_SHADERSTAGE_IMAGES * 2]; + memset(bglb_desc, 0, sizeof(bglb_desc)); + for (int img_index = 0; img_index < num_imgs; img_index++) { + /* texture- and sampler-bindings */ + WGPUBindGroupLayoutBinding* tex_desc = &bglb_desc[img_index*2 + 0]; + WGPUBindGroupLayoutBinding* smp_desc = &bglb_desc[img_index*2 + 1]; + + tex_desc->binding = img_index; + tex_desc->visibility = vis; + tex_desc->type = WGPUBindingType_SampledTexture; + tex_desc->textureDimension = _sg_wgpu_tex_viewdim(cmn_stage->images[img_index].image_type); + tex_desc->textureComponentType = _sg_wgpu_tex_comptype(cmn_stage->images[img_index].sampler_type); + + smp_desc->binding = img_index + _SG_WGPU_MAX_SHADERSTAGE_IMAGES; + smp_desc->visibility = vis; + smp_desc->type = WGPUBindingType_Sampler; + } + WGPUBindGroupLayoutDescriptor img_bgl_desc; + memset(&img_bgl_desc, 0, sizeof(img_bgl_desc)); + img_bgl_desc.bindingCount = num_imgs * 2; + img_bgl_desc.bindings = &bglb_desc[0]; + wgpu_stage->bind_group_layout = wgpuDeviceCreateBindGroupLayout(_sg.wgpu.dev, &img_bgl_desc); + SOKOL_ASSERT(wgpu_stage->bind_group_layout); + } + return success ? SG_RESOURCESTATE_VALID : SG_RESOURCESTATE_FAILED; +} + +_SOKOL_PRIVATE void _sg_wgpu_destroy_shader(_sg_shader_t* shd) { + SOKOL_ASSERT(shd); + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + _sg_wgpu_shader_stage_t* wgpu_stage = &shd->wgpu.stage[stage_index]; + if (wgpu_stage->module) { + wgpuShaderModuleRelease(wgpu_stage->module); + wgpu_stage->module = 0; + } + if (wgpu_stage->bind_group_layout) { + wgpuBindGroupLayoutRelease(wgpu_stage->bind_group_layout); + wgpu_stage->bind_group_layout = 0; + } + } +} + +_SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_pipeline(_sg_pipeline_t* pip, _sg_shader_t* shd, const sg_pipeline_desc* desc) { + SOKOL_ASSERT(pip && shd && desc); + SOKOL_ASSERT(desc->shader.id == shd->slot.id); + SOKOL_ASSERT(shd->wgpu.stage[SG_SHADERSTAGE_VS].bind_group_layout); + SOKOL_ASSERT(shd->wgpu.stage[SG_SHADERSTAGE_FS].bind_group_layout); + pip->shader = shd; + _sg_pipeline_common_init(&pip->cmn, desc); + pip->wgpu.stencil_ref = (uint32_t) desc->stencil.ref; + + WGPUBindGroupLayout pip_bgl[3] = { + _sg.wgpu.ub.bindgroup_layout, + shd->wgpu.stage[SG_SHADERSTAGE_VS].bind_group_layout, + shd->wgpu.stage[SG_SHADERSTAGE_FS].bind_group_layout + }; + WGPUPipelineLayoutDescriptor pl_desc; + memset(&pl_desc, 0, sizeof(pl_desc)); + pl_desc.bindGroupLayoutCount = 3; + pl_desc.bindGroupLayouts = &pip_bgl[0]; + WGPUPipelineLayout pip_layout = wgpuDeviceCreatePipelineLayout(_sg.wgpu.dev, &pl_desc); + + WGPUVertexBufferLayoutDescriptor vb_desc[SG_MAX_SHADERSTAGE_BUFFERS]; + memset(&vb_desc, 0, sizeof(vb_desc)); + WGPUVertexAttributeDescriptor va_desc[SG_MAX_SHADERSTAGE_BUFFERS][SG_MAX_VERTEX_ATTRIBUTES]; + memset(&va_desc, 0, sizeof(va_desc)); + int vb_idx = 0; + for (; vb_idx < SG_MAX_SHADERSTAGE_BUFFERS; vb_idx++) { + const sg_buffer_layout_desc* src_vb_desc = &desc->layout.buffers[vb_idx]; + if (0 == src_vb_desc->stride) { + break; + } + vb_desc[vb_idx].arrayStride = src_vb_desc->stride; + vb_desc[vb_idx].stepMode = _sg_wgpu_stepmode(src_vb_desc->step_func); + /* NOTE: WebGPU has no support for vertex step rate (because that's + not supported by Core Vulkan + */ + int va_idx = 0; + for (int va_loc = 0; va_loc < SG_MAX_VERTEX_ATTRIBUTES; va_loc++) { + const sg_vertex_attr_desc* src_va_desc = &desc->layout.attrs[va_loc]; + if (SG_VERTEXFORMAT_INVALID == src_va_desc->format) { + break; + } + pip->cmn.vertex_layout_valid[src_va_desc->buffer_index] = true; + if (vb_idx == src_va_desc->buffer_index) { + va_desc[vb_idx][va_idx].format = _sg_wgpu_vertexformat(src_va_desc->format); + va_desc[vb_idx][va_idx].offset = src_va_desc->offset; + va_desc[vb_idx][va_idx].shaderLocation = va_loc; + va_idx++; + } + } + vb_desc[vb_idx].attributeCount = va_idx; + vb_desc[vb_idx].attributes = &va_desc[vb_idx][0]; + } + WGPUVertexStateDescriptor vx_state_desc; + memset(&vx_state_desc, 0, sizeof(vx_state_desc)); + vx_state_desc.indexFormat = _sg_wgpu_indexformat(desc->index_type); + vx_state_desc.vertexBufferCount = vb_idx; + vx_state_desc.vertexBuffers = vb_desc; + + WGPURasterizationStateDescriptor rs_desc; + memset(&rs_desc, 0, sizeof(rs_desc)); + rs_desc.frontFace = _sg_wgpu_frontface(desc->face_winding); + rs_desc.cullMode = _sg_wgpu_cullmode(desc->cull_mode); + rs_desc.depthBias = (int32_t) desc->depth.bias; + rs_desc.depthBiasClamp = desc->depth.bias_clamp; + rs_desc.depthBiasSlopeScale = desc->depth.bias_slope_scale; + + WGPUDepthStencilStateDescriptor ds_desc; + memset(&ds_desc, 0, sizeof(ds_desc)); + ds_desc.format = _sg_wgpu_textureformat(desc->depth.pixel_format); + ds_desc.depthWriteEnabled = desc->depth.write_enabled; + ds_desc.depthCompare = _sg_wgpu_comparefunc(desc->depth.compare); + ds_desc.stencilReadMask = desc->stencil.read_mask; + ds_desc.stencilWriteMask = desc->stencil.write_mask; + ds_desc.stencilFront.compare = _sg_wgpu_comparefunc(desc->stencil.front.compare); + ds_desc.stencilFront.failOp = _sg_wgpu_stencilop(desc->stencil.front.fail_op); + ds_desc.stencilFront.depthFailOp = _sg_wgpu_stencilop(desc->stencil.front.depth_fail_op); + ds_desc.stencilFront.passOp = _sg_wgpu_stencilop(desc->stencil.front.pass_op); + ds_desc.stencilBack.compare = _sg_wgpu_comparefunc(desc->stencil.back.compare); + ds_desc.stencilBack.failOp = _sg_wgpu_stencilop(desc->stencil.back.fail_op); + ds_desc.stencilBack.depthFailOp = _sg_wgpu_stencilop(desc->stencil.back.depth_fail_op); + ds_desc.stencilBack.passOp = _sg_wgpu_stencilop(desc->stencil.back.pass_op); + + WGPUProgrammableStageDescriptor fs_desc; + memset(&fs_desc, 0, sizeof(fs_desc)); + fs_desc.module = shd->wgpu.stage[SG_SHADERSTAGE_FS].module; + fs_desc.entryPoint = shd->wgpu.stage[SG_SHADERSTAGE_VS].entry.buf; + + WGPUColorStateDescriptor cs_desc[SG_MAX_COLOR_ATTACHMENTS]; + memset(cs_desc, 0, sizeof(cs_desc)); + for (uint32_t i = 0; i < desc->color_count; i++) { + SOKOL_ASSERT(i < SG_MAX_COLOR_ATTACHMENTS); + cs_desc[i].format = _sg_wgpu_textureformat(desc->colors[i].pixel_format); + cs_desc[i].colorBlend.operation = _sg_wgpu_blendop(desc->colors[i].blend.op_rgb); + cs_desc[i].colorBlend.srcFactor = _sg_wgpu_blendfactor(desc->colors[i].blend.src_factor_rgb); + cs_desc[i].colorBlend.dstFactor = _sg_wgpu_blendfactor(desc->colors[i].blend.dst_factor_rgb); + cs_desc[i].alphaBlend.operation = _sg_wgpu_blendop(desc->colors[i].blend.op_alpha); + cs_desc[i].alphaBlend.srcFactor = _sg_wgpu_blendfactor(desc->colors[i].blend.src_factor_alpha); + cs_desc[i].alphaBlend.dstFactor = _sg_wgpu_blendfactor(desc->colors[i].blend.dst_factor_alpha); + cs_desc[i].writeMask = _sg_wgpu_colorwritemask(desc->colors[i].write_mask); + } + + WGPURenderPipelineDescriptor pip_desc; + memset(&pip_desc, 0, sizeof(pip_desc)); + pip_desc.layout = pip_layout; + pip_desc.vertexStage.module = shd->wgpu.stage[SG_SHADERSTAGE_VS].module; + pip_desc.vertexStage.entryPoint = shd->wgpu.stage[SG_SHADERSTAGE_VS].entry.buf; + pip_desc.fragmentStage = &fs_desc; + pip_desc.vertexState = &vx_state_desc; + pip_desc.primitiveTopology = _sg_wgpu_topology(desc->primitive_type); + pip_desc.rasterizationState = &rs_desc; + pip_desc.sampleCount = desc->sample_count; + if (SG_PIXELFORMAT_NONE != desc->depth.pixel_format) { + pip_desc.depthStencilState = &ds_desc; + } + pip_desc.colorStateCount = desc->color_count; + pip_desc.colorStates = cs_desc; + pip_desc.sampleMask = 0xFFFFFFFF; /* FIXME: ??? */ + pip->wgpu.pip = wgpuDeviceCreateRenderPipeline(_sg.wgpu.dev, &pip_desc); + SOKOL_ASSERT(0 != pip->wgpu.pip); + wgpuPipelineLayoutRelease(pip_layout); + + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_wgpu_destroy_pipeline(_sg_pipeline_t* pip) { + SOKOL_ASSERT(pip); + if (pip == _sg.wgpu.cur_pipeline) { + _sg.wgpu.cur_pipeline = 0; + _Sg.wgpu.cur_pipeline_id.id = SG_INVALID_ID; + } + if (pip->wgpu.pip) { + wgpuRenderPipelineRelease(pip->wgpu.pip); + pip->wgpu.pip = 0; + } +} + +_SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_pass(_sg_pass_t* pass, _sg_image_t** att_images, const sg_pass_desc* desc) { + SOKOL_ASSERT(pass && desc); + SOKOL_ASSERT(att_images && att_images[0]); + _sg_pass_common_init(&pass->cmn, desc); + + /* copy image pointers and create render-texture views */ + const sg_pass_attachment_desc* att_desc; + for (uint32_t i = 0; i < pass->cmn.num_color_atts; i++) { + att_desc = &desc->color_attachments[i]; + if (att_desc->image.id != SG_INVALID_ID) { + SOKOL_ASSERT(att_desc->image.id != SG_INVALID_ID); + SOKOL_ASSERT(0 == pass->wgpu.color_atts[i].image); + _sg_image_t* img = att_images[i]; + SOKOL_ASSERT(img && (img->slot.id == att_desc->image.id)); + SOKOL_ASSERT(_sg_is_valid_rendertarget_color_format(img->cmn.pixel_format)); + pass->wgpu.color_atts[i].image = img; + /* create a render-texture-view to render into the right sub-surface */ + const bool is_msaa = img->cmn.sample_count > 1; + WGPUTextureViewDescriptor view_desc; + memset(&view_desc, 0, sizeof(view_desc)); + view_desc.baseMipLevel = is_msaa ? 0 : att_desc->mip_level; + view_desc.mipLevelCount = 1; + view_desc.baseArrayLayer = is_msaa ? 0 : att_desc->slice; + view_desc.arrayLayerCount = 1; + WGPUTexture wgpu_tex = is_msaa ? img->wgpu.msaa_tex : img->wgpu.tex; + SOKOL_ASSERT(wgpu_tex); + pass->wgpu.color_atts[i].render_tex_view = wgpuTextureCreateView(wgpu_tex, &view_desc); + SOKOL_ASSERT(pass->wgpu.color_atts[i].render_tex_view); + /* ... and if needed a separate resolve texture view */ + if (is_msaa) { + view_desc.baseMipLevel = att_desc->mip_level; + view_desc.baseArrayLayer = att_desc->slice; + WGPUTexture wgpu_tex = img->wgpu.tex; + pass->wgpu.color_atts[i].resolve_tex_view = wgpuTextureCreateView(wgpu_tex, &view_desc); + SOKOL_ASSERT(pass->wgpu.color_atts[i].resolve_tex_view); + } + } + } + SOKOL_ASSERT(0 == pass->wgpu.ds_att.image); + att_desc = &desc->depth_stencil_attachment; + if (att_desc->image.id != SG_INVALID_ID) { + const int ds_img_index = SG_MAX_COLOR_ATTACHMENTS; + SOKOL_ASSERT(att_images[ds_img_index] && (att_images[ds_img_index]->slot.id == att_desc->image.id)); + SOKOL_ASSERT(_sg_is_valid_rendertarget_depth_format(att_images[ds_img_index]->cmn.pixel_format)); + _sg_image_t* ds_img = att_images[ds_img_index]; + pass->wgpu.ds_att.image = ds_img; + /* create a render-texture view */ + SOKOL_ASSERT(0 == att_desc->mip_level); + SOKOL_ASSERT(0 == att_desc->slice); + WGPUTextureViewDescriptor view_desc; + memset(&view_desc, 0, sizeof(view_desc)); + WGPUTexture wgpu_tex = ds_img->wgpu.tex; + SOKOL_ASSERT(wgpu_tex); + pass->wgpu.ds_att.render_tex_view = wgpuTextureCreateView(wgpu_tex, &view_desc); + SOKOL_ASSERT(pass->wgpu.ds_att.render_tex_view); + } + return SG_RESOURCESTATE_VALID; +} + +_SOKOL_PRIVATE void _sg_wgpu_destroy_pass(_sg_pass_t* pass) { + SOKOL_ASSERT(pass); + for (uint32_t i = 0; i < pass->cmn.num_color_atts; i++) { + if (pass->wgpu.color_atts[i].render_tex_view) { + wgpuTextureViewRelease(pass->wgpu.color_atts[i].render_tex_view); + pass->wgpu.color_atts[i].render_tex_view = 0; + } + if (pass->wgpu.color_atts[i].resolve_tex_view) { + wgpuTextureViewRelease(pass->wgpu.color_atts[i].resolve_tex_view); + pass->wgpu.color_atts[i].resolve_tex_view = 0; + } + } + if (pass->wgpu.ds_att.render_tex_view) { + wgpuTextureViewRelease(pass->wgpu.ds_att.render_tex_view); + pass->wgpu.ds_att.render_tex_view = 0; + } +} + +_SOKOL_PRIVATE _sg_image_t* _sg_wgpu_pass_color_image(const _sg_pass_t* pass, int index) { + SOKOL_ASSERT(pass && (index >= 0) && (index < SG_MAX_COLOR_ATTACHMENTS)); + /* NOTE: may return null */ + return pass->wgpu.color_atts[index].image; +} + +_SOKOL_PRIVATE _sg_image_t* _sg_wgpu_pass_ds_image(const _sg_pass_t* pass) { + /* NOTE: may return null */ + SOKOL_ASSERT(pass); + return pass->wgpu.ds_att.image; +} + +_SOKOL_PRIVATE void _sg_wgpu_begin_pass(_sg_pass_t* pass, const sg_pass_action* action, int w, int h) { + SOKOL_ASSERT(action); + SOKOL_ASSERT(!_sg.wgpu.in_pass); + SOKOL_ASSERT(_sg.wgpu.render_cmd_enc); + SOKOL_ASSERT(_sg.wgpu.dev); + SOKOL_ASSERT(_sg.wgpu.render_view_cb || _sg.wgpu.render_view_userdata_cb); + SOKOL_ASSERT(_sg.wgpu.resolve_view_cb || _sg.wgpu.resolve_view_userdata_cb); + SOKOL_ASSERT(_sg.wgpu.depth_stencil_view_cb || _sg.wgpu.depth_stencil_view_userdata_cb); + _sg.wgpu.in_pass = true; + _sg.wgpu.cur_width = w; + _sg.wgpu.cur_height = h; + _sg.wgpu.cur_pipeline = 0; + _sg.wgpu.cur_pipeline_id.id = SG_INVALID_ID; + + SOKOL_ASSERT(_sg.wgpu.render_cmd_enc); + if (pass) { + WGPURenderPassDescriptor wgpu_pass_desc; + memset(&wgpu_pass_desc, 0, sizeof(wgpu_pass_desc)); + WGPURenderPassColorAttachmentDescriptor wgpu_color_att_desc[SG_MAX_COLOR_ATTACHMENTS]; + memset(&wgpu_color_att_desc, 0, sizeof(wgpu_color_att_desc)); + SOKOL_ASSERT(pass->slot.state == SG_RESOURCESTATE_VALID); + for (uint32_t i = 0; i < pass->cmn.num_color_atts; i++) { + const _sg_wgpu_attachment_t* wgpu_att = &pass->wgpu.color_atts[i]; + wgpu_color_att_desc[i].loadOp = _sg_wgpu_load_op(action->colors[i].action); + wgpu_color_att_desc[i].storeOp = WGPUStoreOp_Store; + wgpu_color_att_desc[i].clearColor.r = action->colors[i].value.r; + wgpu_color_att_desc[i].clearColor.g = action->colors[i].value.g; + wgpu_color_att_desc[i].clearColor.b = action->colors[i].value.b; + wgpu_color_att_desc[i].clearColor.a = action->colors[i].value.a; + wgpu_color_att_desc[i].attachment = wgpu_att->render_tex_view; + if (wgpu_att->image->cmn.sample_count > 1) { + wgpu_color_att_desc[i].resolveTarget = wgpu_att->resolve_tex_view; + } + } + wgpu_pass_desc.colorAttachmentCount = pass->cmn.num_color_atts; + wgpu_pass_desc.colorAttachments = &wgpu_color_att_desc[0]; + if (pass->wgpu.ds_att.image) { + WGPURenderPassDepthStencilAttachmentDescriptor wgpu_ds_att_desc; + memset(&wgpu_ds_att_desc, 0, sizeof(wgpu_ds_att_desc)); + wgpu_ds_att_desc.depthLoadOp = _sg_wgpu_load_op(action->depth.action); + wgpu_ds_att_desc.clearDepth = action->depth.value; + wgpu_ds_att_desc.stencilLoadOp = _sg_wgpu_load_op(action->stencil.action); + wgpu_ds_att_desc.clearStencil = action->stencil.value; + wgpu_ds_att_desc.attachment = pass->wgpu.ds_att.render_tex_view; + wgpu_pass_desc.depthStencilAttachment = &wgpu_ds_att_desc; + _sg.wgpu.pass_enc = wgpuCommandEncoderBeginRenderPass(_sg.wgpu.render_cmd_enc, &wgpu_pass_desc); + } + } + else { + /* default render pass */ + WGPUTextureView wgpu_render_view = _sg.wgpu.render_view_cb ? _sg.wgpu.render_view_cb() : _sg.wgpu.render_view_userdata_cb(_sg.wgpu.user_data); + WGPUTextureView wgpu_resolve_view = _sg.wgpu.resolve_view_cb ? _sg.wgpu.resolve_view_cb() : _sg.wgpu.resolve_view_userdata_cb(_sg.wgpu.user_data); + WGPUTextureView wgpu_depth_stencil_view = _sg.wgpu.depth_stencil_view_cb ? _sg.wgpu.depth_stencil_view_cb() : _sg.wgpu.depth_stencil_view_userdata_cb(_sg.wgpu.user_data); + + WGPURenderPassDescriptor pass_desc; + memset(&pass_desc, 0, sizeof(pass_desc)); + WGPURenderPassColorAttachmentDescriptor color_att_desc; + memset(&color_att_desc, 0, sizeof(color_att_desc)); + color_att_desc.loadOp = _sg_wgpu_load_op(action->colors[0].action); + color_att_desc.clearColor.r = action->colors[0].value.r; + color_att_desc.clearColor.g = action->colors[0].value.g; + color_att_desc.clearColor.b = action->colors[0].value.b; + color_att_desc.clearColor.a = action->colors[0].value.a; + color_att_desc.attachment = wgpu_render_view; + color_att_desc.resolveTarget = wgpu_resolve_view; /* null if no MSAA rendering */ + pass_desc.colorAttachmentCount = 1; + pass_desc.colorAttachments = &color_att_desc; + WGPURenderPassDepthStencilAttachmentDescriptor ds_att_desc; + memset(&ds_att_desc, 0, sizeof(ds_att_desc)); + ds_att_desc.attachment = wgpu_depth_stencil_view; + SOKOL_ASSERT(0 != ds_att_desc.attachment); + ds_att_desc.depthLoadOp = _sg_wgpu_load_op(action->depth.action); + ds_att_desc.clearDepth = action->depth.value; + ds_att_desc.stencilLoadOp = _sg_wgpu_load_op(action->stencil.action); + ds_att_desc.clearStencil = action->stencil.value; + pass_desc.depthStencilAttachment = &ds_att_desc; + _sg.wgpu.pass_enc = wgpuCommandEncoderBeginRenderPass(_sg.wgpu.render_cmd_enc, &pass_desc); + } + SOKOL_ASSERT(_sg.wgpu.pass_enc); + + /* initial uniform buffer binding (required even if no uniforms are set in the frame) */ + wgpuRenderPassEncoderSetBindGroup(_sg.wgpu.pass_enc, + 0, /* groupIndex 0 is reserved for uniform buffers */ + _sg.wgpu.ub.bindgroup, + SG_NUM_SHADER_STAGES * SG_MAX_SHADERSTAGE_UBS, + &_sg.wgpu.ub.bind_offsets[0][0]); +} + +_SOKOL_PRIVATE void _sg_wgpu_end_pass(void) { + SOKOL_ASSERT(_sg.wgpu.in_pass); + SOKOL_ASSERT(_sg.wgpu.pass_enc); + _sg.wgpu.in_pass = false; + wgpuRenderPassEncoderEndPass(_sg.wgpu.pass_enc); + wgpuRenderPassEncoderRelease(_sg.wgpu.pass_enc); + _sg.wgpu.pass_enc = 0; +} + +_SOKOL_PRIVATE void _sg_wgpu_commit(void) { + SOKOL_ASSERT(!_sg.wgpu.in_pass); + SOKOL_ASSERT(_sg.wgpu.queue); + SOKOL_ASSERT(_sg.wgpu.render_cmd_enc); + SOKOL_ASSERT(_sg.wgpu.staging_cmd_enc); + + /* finish and submit this frame's work */ + _sg_wgpu_ubpool_flush(); + _sg_wgpu_staging_unmap(); + + WGPUCommandBuffer cmd_bufs[2]; + + WGPUCommandBufferDescriptor cmd_buf_desc; + memset(&cmd_buf_desc, 0, sizeof(cmd_buf_desc)); + cmd_bufs[0] = wgpuCommandEncoderFinish(_sg.wgpu.staging_cmd_enc, &cmd_buf_desc); + SOKOL_ASSERT(cmd_bufs[0]); + wgpuCommandEncoderRelease(_sg.wgpu.staging_cmd_enc); + _sg.wgpu.staging_cmd_enc = 0; + + cmd_bufs[1] = wgpuCommandEncoderFinish(_sg.wgpu.render_cmd_enc, &cmd_buf_desc); + SOKOL_ASSERT(cmd_bufs[1]); + wgpuCommandEncoderRelease(_sg.wgpu.render_cmd_enc); + _sg.wgpu.render_cmd_enc = 0; + + wgpuQueueSubmit(_sg.wgpu.queue, 2, &cmd_bufs[0]); + + wgpuCommandBufferRelease(cmd_bufs[0]); + wgpuCommandBufferRelease(cmd_bufs[1]); + + /* create a new render- and staging-command-encoders for next frame */ + WGPUCommandEncoderDescriptor cmd_enc_desc; + memset(&cmd_enc_desc, 0, sizeof(cmd_enc_desc)); + _sg.wgpu.staging_cmd_enc = wgpuDeviceCreateCommandEncoder(_sg.wgpu.dev, &cmd_enc_desc); + _sg.wgpu.render_cmd_enc = wgpuDeviceCreateCommandEncoder(_sg.wgpu.dev, &cmd_enc_desc); + + /* grab new staging buffers for uniform- and vertex/image-updates */ + _sg_wgpu_ubpool_next_frame(false); + _sg_wgpu_staging_next_frame(false); +} + +_SOKOL_PRIVATE void _sg_wgpu_apply_viewport(int x, int y, int w, int h, bool origin_top_left) { + SOKOL_ASSERT(_sg.wgpu.in_pass); + SOKOL_ASSERT(_sg.wgpu.pass_enc); + float xf = (float) x; + float yf = (float) (origin_top_left ? y : (_sg.wgpu.cur_height - (y + h))); + float wf = (float) w; + float hf = (float) h; + wgpuRenderPassEncoderSetViewport(_sg.wgpu.pass_enc, xf, yf, wf, hf, 0.0f, 1.0f); +} + +_SOKOL_PRIVATE void _sg_wgpu_apply_scissor_rect(int x, int y, int w, int h, bool origin_top_left) { + SOKOL_ASSERT(_sg.wgpu.in_pass); + SOKOL_ASSERT(_sg.wgpu.pass_enc); + SOKOL_ASSERT(_sg.wgpu.in_pass); + SOKOL_ASSERT(_sg.wgpu.pass_enc); + + /* clip against framebuffer rect */ + x = _sg_min(_sg_max(0, x), _sg.wgpu.cur_width-1); + y = _sg_min(_sg_max(0, y), _sg.wgpu.cur_height-1); + if ((x + w) > _sg.wgpu.cur_width) { + w = _sg.wgpu.cur_width - x; + } + if ((y + h) > _sg.wgpu.cur_height) { + h = _sg.wgpu.cur_height - y; + } + w = _sg_max(w, 1); + h = _sg_max(h, 1); + + uint32_t sx = (uint32_t) x; + uint32_t sy = origin_top_left ? y : (_sg.wgpu.cur_height - (y + h)); + uint32_t sw = w; + uint32_t sh = h; + wgpuRenderPassEncoderSetScissorRect(_sg.wgpu.pass_enc, sx, sy, sw, sh); +} + +_SOKOL_PRIVATE void _sg_wgpu_apply_pipeline(_sg_pipeline_t* pip) { + SOKOL_ASSERT(pip); + SOKOL_ASSERT(pip->wgpu.pip); + SOKOL_ASSERT(_sg.wgpu.in_pass); + SOKOL_ASSERT(_sg.wgpu.pass_enc); + _sg.wgpu.draw_indexed = (pip->cmn.index_type != SG_INDEXTYPE_NONE); + _sg.wgpu.cur_pipeline = pip; + _sg.wgpu.cur_pipeline_id.id = pip->slot.id; + wgpuRenderPassEncoderSetPipeline(_sg.wgpu.pass_enc, pip->wgpu.pip); + wgpuRenderPassEncoderSetBlendColor(_sg.wgpu.pass_enc, (WGPUColor*)&pip->cmn.blend_color); + wgpuRenderPassEncoderSetStencilReference(_sg.wgpu.pass_enc, pip->wgpu.stencil_ref); +} + +_SOKOL_PRIVATE WGPUBindGroup _sg_wgpu_create_images_bindgroup(WGPUBindGroupLayout bgl, _sg_image_t** imgs, int num_imgs) { + SOKOL_ASSERT(_sg.wgpu.dev); + SOKOL_ASSERT(num_imgs <= _SG_WGPU_MAX_SHADERSTAGE_IMAGES); + WGPUBindGroupBinding img_bgb[_SG_WGPU_MAX_SHADERSTAGE_IMAGES * 2]; + memset(&img_bgb, 0, sizeof(img_bgb)); + for (int img_index = 0; img_index < num_imgs; img_index++) { + WGPUBindGroupBinding* tex_bdg = &img_bgb[img_index*2 + 0]; + WGPUBindGroupBinding* smp_bdg = &img_bgb[img_index*2 + 1]; + tex_bdg->binding = img_index; + tex_bdg->textureView = imgs[img_index]->wgpu.tex_view; + smp_bdg->binding = img_index + _SG_WGPU_MAX_SHADERSTAGE_IMAGES; + smp_bdg->sampler = imgs[img_index]->wgpu.sampler; + } + WGPUBindGroupDescriptor bg_desc; + memset(&bg_desc, 0, sizeof(bg_desc)); + bg_desc.layout = bgl; + bg_desc.bindingCount = 2 * num_imgs; + bg_desc.bindings = &img_bgb[0]; + WGPUBindGroup bg = wgpuDeviceCreateBindGroup(_sg.wgpu.dev, &bg_desc); + SOKOL_ASSERT(bg); + return bg; +} + +_SOKOL_PRIVATE void _sg_wgpu_apply_bindings( + _sg_pipeline_t* pip, + _sg_buffer_t** vbs, const int* vb_offsets, int num_vbs, + _sg_buffer_t* ib, int ib_offset, + _sg_image_t** vs_imgs, int num_vs_imgs, + _sg_image_t** fs_imgs, int num_fs_imgs) +{ + SOKOL_ASSERT(_sg.wgpu.in_pass); + SOKOL_ASSERT(_sg.wgpu.pass_enc); + SOKOL_ASSERT(pip->shader && (pip->cmn.shader_id.id == pip->shader->slot.id)); + + /* index buffer */ + if (ib) { + wgpuRenderPassEncoderSetIndexBuffer(_sg.wgpu.pass_enc, ib->wgpu.buf, ib_offset); + } + + /* vertex buffers */ + for (uint32_t slot = 0; slot < (uint32_t)num_vbs; slot++) { + wgpuRenderPassEncoderSetVertexBuffer(_sg.wgpu.pass_enc, slot, vbs[slot]->wgpu.buf, (uint64_t)vb_offsets[slot]); + } + + /* need to create throw-away bind groups for images */ + if (num_vs_imgs > 0) { + if (num_vs_imgs > _SG_WGPU_MAX_SHADERSTAGE_IMAGES) { + num_vs_imgs = _SG_WGPU_MAX_SHADERSTAGE_IMAGES; + } + WGPUBindGroupLayout vs_bgl = pip->shader->wgpu.stage[SG_SHADERSTAGE_VS].bind_group_layout; + SOKOL_ASSERT(vs_bgl); + WGPUBindGroup vs_img_bg = _sg_wgpu_create_images_bindgroup(vs_bgl, vs_imgs, num_vs_imgs); + wgpuRenderPassEncoderSetBindGroup(_sg.wgpu.pass_enc, 1, vs_img_bg, 0, 0); + wgpuBindGroupRelease(vs_img_bg); + } + else { + wgpuRenderPassEncoderSetBindGroup(_sg.wgpu.pass_enc, 1, _sg.wgpu.empty_bind_group, 0, 0); + } + if (num_fs_imgs > 0) { + if (num_fs_imgs > _SG_WGPU_MAX_SHADERSTAGE_IMAGES) { + num_fs_imgs = _SG_WGPU_MAX_SHADERSTAGE_IMAGES; + } + WGPUBindGroupLayout fs_bgl = pip->shader->wgpu.stage[SG_SHADERSTAGE_FS].bind_group_layout; + SOKOL_ASSERT(fs_bgl); + WGPUBindGroup fs_img_bg = _sg_wgpu_create_images_bindgroup(fs_bgl, fs_imgs, num_fs_imgs); + wgpuRenderPassEncoderSetBindGroup(_sg.wgpu.pass_enc, 2, fs_img_bg, 0, 0); + wgpuBindGroupRelease(fs_img_bg); + } + else { + wgpuRenderPassEncoderSetBindGroup(_sg.wgpu.pass_enc, 2, _sg.wgpu.empty_bind_group, 0, 0); + } +} + +_SOKOL_PRIVATE void _sg_wgpu_apply_uniforms(sg_shader_stage stage_index, int ub_index, const sg_range* data) { + SOKOL_ASSERT(_sg.wgpu.in_pass); + SOKOL_ASSERT(_sg.wgpu.pass_enc); + SOKOL_ASSERT((_sg.wgpu.ub.offset + data->size) <= _sg.wgpu.ub.num_bytes); + SOKOL_ASSERT((_sg.wgpu.ub.offset & (_SG_WGPU_STAGING_ALIGN-1)) == 0); + SOKOL_ASSERT(_sg.wgpu.cur_pipeline && _sg.wgpu.cur_pipeline->shader); + SOKOL_ASSERT(_sg.wgpu.cur_pipeline->slot.id == _sg.wgpu.cur_pipeline_id.id); + SOKOL_ASSERT(_sg.wgpu.cur_pipeline->shader->slot.id == _sg.wgpu.cur_pipeline->cmn.shader_id.id); + SOKOL_ASSERT(ub_index < _sg.wgpu.cur_pipeline->shader->cmn.stage[stage_index].num_uniform_blocks); + SOKOL_ASSERT(data->size <= _sg.wgpu.cur_pipeline->shader->cmn.stage[stage_index].uniform_blocks[ub_index].size); + SOKOL_ASSERT(data->size <= _SG_WGPU_MAX_UNIFORM_UPDATE_SIZE); + SOKOL_ASSERT(0 != _sg.wgpu.ub.stage.ptr[_sg.wgpu.ub.stage.cur]); + + uint8_t* dst_ptr = _sg.wgpu.ub.stage.ptr[_sg.wgpu.ub.stage.cur] + _sg.wgpu.ub.offset; + memcpy(dst_ptr, data->ptr, data->size); + _sg.wgpu.ub.bind_offsets[stage_index][ub_index] = _sg.wgpu.ub.offset; + wgpuRenderPassEncoderSetBindGroup(_sg.wgpu.pass_enc, + 0, /* groupIndex 0 is reserved for uniform buffers */ + _sg.wgpu.ub.bindgroup, + SG_NUM_SHADER_STAGES * SG_MAX_SHADERSTAGE_UBS, + &_sg.wgpu.ub.bind_offsets[0][0]); + _sg.wgpu.ub.offset = _sg_roundup(_sg.wgpu.ub.offset + data->size, _SG_WGPU_STAGING_ALIGN); +} + +_SOKOL_PRIVATE void _sg_wgpu_draw(int base_element, int num_elements, int num_instances) { + SOKOL_ASSERT(_sg.wgpu.in_pass); + SOKOL_ASSERT(_sg.wgpu.pass_enc); + if (_sg.wgpu.draw_indexed) { + wgpuRenderPassEncoderDrawIndexed(_sg.wgpu.pass_enc, num_elements, num_instances, base_element, 0, 0); + } + else { + wgpuRenderPassEncoderDraw(_sg.wgpu.pass_enc, num_elements, num_instances, base_element, 0); + } +} + +_SOKOL_PRIVATE void _sg_wgpu_update_buffer(_sg_buffer_t* buf, const sg_range* data) { + SOKOL_ASSERT(buf && data && data->ptr && (data->size > 0)); + uint32_t copied_num_bytes = _sg_wgpu_staging_copy_to_buffer(buf->wgpu.buf, 0, data->ptr, data->size); + SOKOL_ASSERT(copied_num_bytes > 0); _SOKOL_UNUSED(copied_num_bytes); +} + +_SOKOL_PRIVATE int _sg_wgpu_append_buffer(_sg_buffer_t* buf, const sg_range* data, bool new_frame) { + SOKOL_ASSERT(buf && data && data->ptr && (data->size > 0)); + _SOKOL_UNUSED(new_frame); + uint32_t copied_num_bytes = _sg_wgpu_staging_copy_to_buffer(buf->wgpu.buf, buf->cmn.append_pos, data->ptr, data->size); + SOKOL_ASSERT(copied_num_bytes > 0); _SOKOL_UNUSED(copied_num_bytes); + return (int)copied_num_bytes; +} + +_SOKOL_PRIVATE void _sg_wgpu_update_image(_sg_image_t* img, const sg_image_data* data) { + SOKOL_ASSERT(img && data); + bool success = _sg_wgpu_staging_copy_to_texture(img, data); + SOKOL_ASSERT(success); + _SOKOL_UNUSED(success); +} +#endif + +/*== BACKEND API WRAPPERS ====================================================*/ +static inline void _sg_setup_backend(const sg_desc* desc) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_setup_backend(desc); + #elif defined(SOKOL_METAL) + _sg_mtl_setup_backend(desc); + #elif defined(SOKOL_D3D11) + _sg_d3d11_setup_backend(desc); + #elif defined(SOKOL_WGPU) + _sg_wgpu_setup_backend(desc); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_setup_backend(desc); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_discard_backend(void) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_discard_backend(); + #elif defined(SOKOL_METAL) + _sg_mtl_discard_backend(); + #elif defined(SOKOL_D3D11) + _sg_d3d11_discard_backend(); + #elif defined(SOKOL_WGPU) + _sg_wgpu_discard_backend(); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_discard_backend(); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_reset_state_cache(void) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_reset_state_cache(); + #elif defined(SOKOL_METAL) + _sg_mtl_reset_state_cache(); + #elif defined(SOKOL_D3D11) + _sg_d3d11_reset_state_cache(); + #elif defined(SOKOL_WGPU) + _sg_wgpu_reset_state_cache(); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_reset_state_cache(); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_activate_context(_sg_context_t* ctx) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_activate_context(ctx); + #elif defined(SOKOL_METAL) + _sg_mtl_activate_context(ctx); + #elif defined(SOKOL_D3D11) + _sg_d3d11_activate_context(ctx); + #elif defined(SOKOL_WGPU) + _sg_wgpu_activate_context(ctx); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_activate_context(ctx); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline sg_resource_state _sg_create_context(_sg_context_t* ctx) { + #if defined(_SOKOL_ANY_GL) + return _sg_gl_create_context(ctx); + #elif defined(SOKOL_METAL) + return _sg_mtl_create_context(ctx); + #elif defined(SOKOL_D3D11) + return _sg_d3d11_create_context(ctx); + #elif defined(SOKOL_WGPU) + return _sg_wgpu_create_context(ctx); + #elif defined(SOKOL_DUMMY_BACKEND) + return _sg_dummy_create_context(ctx); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_destroy_context(_sg_context_t* ctx) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_destroy_context(ctx); + #elif defined(SOKOL_METAL) + _sg_mtl_destroy_context(ctx); + #elif defined(SOKOL_D3D11) + _sg_d3d11_destroy_context(ctx); + #elif defined(SOKOL_WGPU) + _sg_wgpu_destroy_context(ctx); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_destroy_context(ctx); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline sg_resource_state _sg_create_buffer(_sg_buffer_t* buf, const sg_buffer_desc* desc) { + #if defined(_SOKOL_ANY_GL) + return _sg_gl_create_buffer(buf, desc); + #elif defined(SOKOL_METAL) + return _sg_mtl_create_buffer(buf, desc); + #elif defined(SOKOL_D3D11) + return _sg_d3d11_create_buffer(buf, desc); + #elif defined(SOKOL_WGPU) + return _sg_wgpu_create_buffer(buf, desc); + #elif defined(SOKOL_DUMMY_BACKEND) + return _sg_dummy_create_buffer(buf, desc); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_destroy_buffer(_sg_buffer_t* buf) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_destroy_buffer(buf); + #elif defined(SOKOL_METAL) + _sg_mtl_destroy_buffer(buf); + #elif defined(SOKOL_D3D11) + _sg_d3d11_destroy_buffer(buf); + #elif defined(SOKOL_WGPU) + _sg_wgpu_destroy_buffer(buf); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_destroy_buffer(buf); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline sg_resource_state _sg_create_image(_sg_image_t* img, const sg_image_desc* desc) { + #if defined(_SOKOL_ANY_GL) + return _sg_gl_create_image(img, desc); + #elif defined(SOKOL_METAL) + return _sg_mtl_create_image(img, desc); + #elif defined(SOKOL_D3D11) + return _sg_d3d11_create_image(img, desc); + #elif defined(SOKOL_WGPU) + return _sg_wgpu_create_image(img, desc); + #elif defined(SOKOL_DUMMY_BACKEND) + return _sg_dummy_create_image(img, desc); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_destroy_image(_sg_image_t* img) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_destroy_image(img); + #elif defined(SOKOL_METAL) + _sg_mtl_destroy_image(img); + #elif defined(SOKOL_D3D11) + _sg_d3d11_destroy_image(img); + #elif defined(SOKOL_WGPU) + _sg_wgpu_destroy_image(img); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_destroy_image(img); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline sg_resource_state _sg_create_shader(_sg_shader_t* shd, const sg_shader_desc* desc) { + #if defined(_SOKOL_ANY_GL) + return _sg_gl_create_shader(shd, desc); + #elif defined(SOKOL_METAL) + return _sg_mtl_create_shader(shd, desc); + #elif defined(SOKOL_D3D11) + return _sg_d3d11_create_shader(shd, desc); + #elif defined(SOKOL_WGPU) + return _sg_wgpu_create_shader(shd, desc); + #elif defined(SOKOL_DUMMY_BACKEND) + return _sg_dummy_create_shader(shd, desc); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_destroy_shader(_sg_shader_t* shd) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_destroy_shader(shd); + #elif defined(SOKOL_METAL) + _sg_mtl_destroy_shader(shd); + #elif defined(SOKOL_D3D11) + _sg_d3d11_destroy_shader(shd); + #elif defined(SOKOL_WGPU) + _sg_wgpu_destroy_shader(shd); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_destroy_shader(shd); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline sg_resource_state _sg_create_pipeline(_sg_pipeline_t* pip, _sg_shader_t* shd, const sg_pipeline_desc* desc) { + #if defined(_SOKOL_ANY_GL) + return _sg_gl_create_pipeline(pip, shd, desc); + #elif defined(SOKOL_METAL) + return _sg_mtl_create_pipeline(pip, shd, desc); + #elif defined(SOKOL_D3D11) + return _sg_d3d11_create_pipeline(pip, shd, desc); + #elif defined(SOKOL_WGPU) + return _sg_wgpu_create_pipeline(pip, shd, desc); + #elif defined(SOKOL_DUMMY_BACKEND) + return _sg_dummy_create_pipeline(pip, shd, desc); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_destroy_pipeline(_sg_pipeline_t* pip) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_destroy_pipeline(pip); + #elif defined(SOKOL_METAL) + _sg_mtl_destroy_pipeline(pip); + #elif defined(SOKOL_D3D11) + _sg_d3d11_destroy_pipeline(pip); + #elif defined(SOKOL_WGPU) + _sg_wgpu_destroy_pipeline(pip); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_destroy_pipeline(pip); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline sg_resource_state _sg_create_pass(_sg_pass_t* pass, _sg_image_t** att_images, const sg_pass_desc* desc) { + #if defined(_SOKOL_ANY_GL) + return _sg_gl_create_pass(pass, att_images, desc); + #elif defined(SOKOL_METAL) + return _sg_mtl_create_pass(pass, att_images, desc); + #elif defined(SOKOL_D3D11) + return _sg_d3d11_create_pass(pass, att_images, desc); + #elif defined(SOKOL_WGPU) + return _sg_wgpu_create_pass(pass, att_images, desc); + #elif defined(SOKOL_DUMMY_BACKEND) + return _sg_dummy_create_pass(pass, att_images, desc); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_destroy_pass(_sg_pass_t* pass) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_destroy_pass(pass); + #elif defined(SOKOL_METAL) + _sg_mtl_destroy_pass(pass); + #elif defined(SOKOL_D3D11) + _sg_d3d11_destroy_pass(pass); + #elif defined(SOKOL_WGPU) + return _sg_wgpu_destroy_pass(pass); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_destroy_pass(pass); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline _sg_image_t* _sg_pass_color_image(const _sg_pass_t* pass, int index) { + #if defined(_SOKOL_ANY_GL) + return _sg_gl_pass_color_image(pass, index); + #elif defined(SOKOL_METAL) + return _sg_mtl_pass_color_image(pass, index); + #elif defined(SOKOL_D3D11) + return _sg_d3d11_pass_color_image(pass, index); + #elif defined(SOKOL_WGPU) + return _sg_wgpu_pass_color_image(pass, index); + #elif defined(SOKOL_DUMMY_BACKEND) + return _sg_dummy_pass_color_image(pass, index); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline _sg_image_t* _sg_pass_ds_image(const _sg_pass_t* pass) { + #if defined(_SOKOL_ANY_GL) + return _sg_gl_pass_ds_image(pass); + #elif defined(SOKOL_METAL) + return _sg_mtl_pass_ds_image(pass); + #elif defined(SOKOL_D3D11) + return _sg_d3d11_pass_ds_image(pass); + #elif defined(SOKOL_WGPU) + return _sg_wgpu_pass_ds_image(pass); + #elif defined(SOKOL_DUMMY_BACKEND) + return _sg_dummy_pass_ds_image(pass); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_begin_pass(_sg_pass_t* pass, const sg_pass_action* action, int w, int h) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_begin_pass(pass, action, w, h); + #elif defined(SOKOL_METAL) + _sg_mtl_begin_pass(pass, action, w, h); + #elif defined(SOKOL_D3D11) + _sg_d3d11_begin_pass(pass, action, w, h); + #elif defined(SOKOL_WGPU) + _sg_wgpu_begin_pass(pass, action, w, h); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_begin_pass(pass, action, w, h); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_end_pass(void) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_end_pass(); + #elif defined(SOKOL_METAL) + _sg_mtl_end_pass(); + #elif defined(SOKOL_D3D11) + _sg_d3d11_end_pass(); + #elif defined(SOKOL_WGPU) + _sg_wgpu_end_pass(); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_end_pass(); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_apply_viewport(int x, int y, int w, int h, bool origin_top_left) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_apply_viewport(x, y, w, h, origin_top_left); + #elif defined(SOKOL_METAL) + _sg_mtl_apply_viewport(x, y, w, h, origin_top_left); + #elif defined(SOKOL_D3D11) + _sg_d3d11_apply_viewport(x, y, w, h, origin_top_left); + #elif defined(SOKOL_WGPU) + _sg_wgpu_apply_viewport(x, y, w, h, origin_top_left); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_apply_viewport(x, y, w, h, origin_top_left); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_apply_scissor_rect(int x, int y, int w, int h, bool origin_top_left) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_apply_scissor_rect(x, y, w, h, origin_top_left); + #elif defined(SOKOL_METAL) + _sg_mtl_apply_scissor_rect(x, y, w, h, origin_top_left); + #elif defined(SOKOL_D3D11) + _sg_d3d11_apply_scissor_rect(x, y, w, h, origin_top_left); + #elif defined(SOKOL_WGPU) + _sg_wgpu_apply_scissor_rect(x, y, w, h, origin_top_left); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_apply_scissor_rect(x, y, w, h, origin_top_left); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_apply_pipeline(_sg_pipeline_t* pip) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_apply_pipeline(pip); + #elif defined(SOKOL_METAL) + _sg_mtl_apply_pipeline(pip); + #elif defined(SOKOL_D3D11) + _sg_d3d11_apply_pipeline(pip); + #elif defined(SOKOL_WGPU) + _sg_wgpu_apply_pipeline(pip); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_apply_pipeline(pip); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_apply_bindings( + _sg_pipeline_t* pip, + _sg_buffer_t** vbs, const int* vb_offsets, int num_vbs, + _sg_buffer_t* ib, int ib_offset, + _sg_image_t** vs_imgs, int num_vs_imgs, + _sg_image_t** fs_imgs, int num_fs_imgs) +{ + #if defined(_SOKOL_ANY_GL) + _sg_gl_apply_bindings(pip, vbs, vb_offsets, num_vbs, ib, ib_offset, vs_imgs, num_vs_imgs, fs_imgs, num_fs_imgs); + #elif defined(SOKOL_METAL) + _sg_mtl_apply_bindings(pip, vbs, vb_offsets, num_vbs, ib, ib_offset, vs_imgs, num_vs_imgs, fs_imgs, num_fs_imgs); + #elif defined(SOKOL_D3D11) + _sg_d3d11_apply_bindings(pip, vbs, vb_offsets, num_vbs, ib, ib_offset, vs_imgs, num_vs_imgs, fs_imgs, num_fs_imgs); + #elif defined(SOKOL_WGPU) + _sg_wgpu_apply_bindings(pip, vbs, vb_offsets, num_vbs, ib, ib_offset, vs_imgs, num_vs_imgs, fs_imgs, num_fs_imgs); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_apply_bindings(pip, vbs, vb_offsets, num_vbs, ib, ib_offset, vs_imgs, num_vs_imgs, fs_imgs, num_fs_imgs); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_apply_uniforms(sg_shader_stage stage_index, int ub_index, const sg_range* data) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_apply_uniforms(stage_index, ub_index, data); + #elif defined(SOKOL_METAL) + _sg_mtl_apply_uniforms(stage_index, ub_index, data); + #elif defined(SOKOL_D3D11) + _sg_d3d11_apply_uniforms(stage_index, ub_index, data); + #elif defined(SOKOL_WGPU) + _sg_wgpu_apply_uniforms(stage_index, ub_index, data); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_apply_uniforms(stage_index, ub_index, data); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_draw(int base_element, int num_elements, int num_instances) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_draw(base_element, num_elements, num_instances); + #elif defined(SOKOL_METAL) + _sg_mtl_draw(base_element, num_elements, num_instances); + #elif defined(SOKOL_D3D11) + _sg_d3d11_draw(base_element, num_elements, num_instances); + #elif defined(SOKOL_WGPU) + _sg_wgpu_draw(base_element, num_elements, num_instances); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_draw(base_element, num_elements, num_instances); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_commit(void) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_commit(); + #elif defined(SOKOL_METAL) + _sg_mtl_commit(); + #elif defined(SOKOL_D3D11) + _sg_d3d11_commit(); + #elif defined(SOKOL_WGPU) + _sg_wgpu_commit(); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_commit(); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_update_buffer(_sg_buffer_t* buf, const sg_range* data) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_update_buffer(buf, data); + #elif defined(SOKOL_METAL) + _sg_mtl_update_buffer(buf, data); + #elif defined(SOKOL_D3D11) + _sg_d3d11_update_buffer(buf, data); + #elif defined(SOKOL_WGPU) + _sg_wgpu_update_buffer(buf, data); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_update_buffer(buf, data); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline int _sg_append_buffer(_sg_buffer_t* buf, const sg_range* data, bool new_frame) { + #if defined(_SOKOL_ANY_GL) + return _sg_gl_append_buffer(buf, data, new_frame); + #elif defined(SOKOL_METAL) + return _sg_mtl_append_buffer(buf, data, new_frame); + #elif defined(SOKOL_D3D11) + return _sg_d3d11_append_buffer(buf, data, new_frame); + #elif defined(SOKOL_WGPU) + return _sg_wgpu_append_buffer(buf, data, new_frame); + #elif defined(SOKOL_DUMMY_BACKEND) + return _sg_dummy_append_buffer(buf, data, new_frame); + #else + #error("INVALID BACKEND"); + #endif +} + +static inline void _sg_update_image(_sg_image_t* img, const sg_image_data* data) { + #if defined(_SOKOL_ANY_GL) + _sg_gl_update_image(img, data); + #elif defined(SOKOL_METAL) + _sg_mtl_update_image(img, data); + #elif defined(SOKOL_D3D11) + _sg_d3d11_update_image(img, data); + #elif defined(SOKOL_WGPU) + _sg_wgpu_update_image(img, data); + #elif defined(SOKOL_DUMMY_BACKEND) + _sg_dummy_update_image(img, data); + #else + #error("INVALID BACKEND"); + #endif +} + +/*== RESOURCE POOLS ==========================================================*/ + +_SOKOL_PRIVATE void _sg_init_pool(_sg_pool_t* pool, int num) { + SOKOL_ASSERT(pool && (num >= 1)); + /* slot 0 is reserved for the 'invalid id', so bump the pool size by 1 */ + pool->size = num + 1; + pool->queue_top = 0; + /* generation counters indexable by pool slot index, slot 0 is reserved */ + size_t gen_ctrs_size = sizeof(uint32_t) * (size_t)pool->size; + pool->gen_ctrs = (uint32_t*) SOKOL_MALLOC(gen_ctrs_size); + SOKOL_ASSERT(pool->gen_ctrs); + memset(pool->gen_ctrs, 0, gen_ctrs_size); + /* it's not a bug to only reserve 'num' here */ + pool->free_queue = (int*) SOKOL_MALLOC(sizeof(int) * (size_t)num); + SOKOL_ASSERT(pool->free_queue); + /* never allocate the zero-th pool item since the invalid id is 0 */ + for (int i = pool->size-1; i >= 1; i--) { + pool->free_queue[pool->queue_top++] = i; + } +} + +_SOKOL_PRIVATE void _sg_discard_pool(_sg_pool_t* pool) { + SOKOL_ASSERT(pool); + SOKOL_ASSERT(pool->free_queue); + SOKOL_FREE(pool->free_queue); + pool->free_queue = 0; + SOKOL_ASSERT(pool->gen_ctrs); + SOKOL_FREE(pool->gen_ctrs); + pool->gen_ctrs = 0; + pool->size = 0; + pool->queue_top = 0; +} + +_SOKOL_PRIVATE int _sg_pool_alloc_index(_sg_pool_t* pool) { + SOKOL_ASSERT(pool); + SOKOL_ASSERT(pool->free_queue); + if (pool->queue_top > 0) { + int slot_index = pool->free_queue[--pool->queue_top]; + SOKOL_ASSERT((slot_index > 0) && (slot_index < pool->size)); + return slot_index; + } + else { + /* pool exhausted */ + return _SG_INVALID_SLOT_INDEX; + } +} + +_SOKOL_PRIVATE void _sg_pool_free_index(_sg_pool_t* pool, int slot_index) { + SOKOL_ASSERT((slot_index > _SG_INVALID_SLOT_INDEX) && (slot_index < pool->size)); + SOKOL_ASSERT(pool); + SOKOL_ASSERT(pool->free_queue); + SOKOL_ASSERT(pool->queue_top < pool->size); + #ifdef SOKOL_DEBUG + /* debug check against double-free */ + for (int i = 0; i < pool->queue_top; i++) { + SOKOL_ASSERT(pool->free_queue[i] != slot_index); + } + #endif + pool->free_queue[pool->queue_top++] = slot_index; + SOKOL_ASSERT(pool->queue_top <= (pool->size-1)); +} + +_SOKOL_PRIVATE void _sg_reset_slot(_sg_slot_t* slot) { + SOKOL_ASSERT(slot); + memset(slot, 0, sizeof(_sg_slot_t)); +} + +_SOKOL_PRIVATE void _sg_reset_buffer(_sg_buffer_t* buf) { + SOKOL_ASSERT(buf); + _sg_slot_t slot = buf->slot; + memset(buf, 0, sizeof(_sg_buffer_t)); + buf->slot = slot; + buf->slot.state = SG_RESOURCESTATE_ALLOC; +} + +_SOKOL_PRIVATE void _sg_reset_image(_sg_image_t* img) { + SOKOL_ASSERT(img); + _sg_slot_t slot = img->slot; + memset(img, 0, sizeof(_sg_image_t)); + img->slot = slot; + img->slot.state = SG_RESOURCESTATE_ALLOC; +} + +_SOKOL_PRIVATE void _sg_reset_shader(_sg_shader_t* shd) { + SOKOL_ASSERT(shd); + _sg_slot_t slot = shd->slot; + memset(shd, 0, sizeof(_sg_shader_t)); + shd->slot = slot; + shd->slot.state = SG_RESOURCESTATE_ALLOC; +} + +_SOKOL_PRIVATE void _sg_reset_pipeline(_sg_pipeline_t* pip) { + SOKOL_ASSERT(pip); + _sg_slot_t slot = pip->slot; + memset(pip, 0, sizeof(_sg_pipeline_t)); + pip->slot = slot; + pip->slot.state = SG_RESOURCESTATE_ALLOC; +} + +_SOKOL_PRIVATE void _sg_reset_pass(_sg_pass_t* pass) { + SOKOL_ASSERT(pass); + _sg_slot_t slot = pass->slot; + memset(pass, 0, sizeof(_sg_pass_t)); + pass->slot = slot; + pass->slot.state = SG_RESOURCESTATE_ALLOC; +} + +_SOKOL_PRIVATE void _sg_reset_context(_sg_context_t* ctx) { + SOKOL_ASSERT(ctx); + _sg_slot_t slot = ctx->slot; + memset(ctx, 0, sizeof(_sg_context_t)); + ctx->slot = slot; + ctx->slot.state = SG_RESOURCESTATE_ALLOC; +} + +_SOKOL_PRIVATE void _sg_setup_pools(_sg_pools_t* p, const sg_desc* desc) { + SOKOL_ASSERT(p); + SOKOL_ASSERT(desc); + /* note: the pools here will have an additional item, since slot 0 is reserved */ + SOKOL_ASSERT((desc->buffer_pool_size > 0) && (desc->buffer_pool_size < _SG_MAX_POOL_SIZE)); + _sg_init_pool(&p->buffer_pool, desc->buffer_pool_size); + size_t buffer_pool_byte_size = sizeof(_sg_buffer_t) * (size_t)p->buffer_pool.size; + p->buffers = (_sg_buffer_t*) SOKOL_MALLOC(buffer_pool_byte_size); + SOKOL_ASSERT(p->buffers); + memset(p->buffers, 0, buffer_pool_byte_size); + + SOKOL_ASSERT((desc->image_pool_size > 0) && (desc->image_pool_size < _SG_MAX_POOL_SIZE)); + _sg_init_pool(&p->image_pool, desc->image_pool_size); + size_t image_pool_byte_size = sizeof(_sg_image_t) * (size_t)p->image_pool.size; + p->images = (_sg_image_t*) SOKOL_MALLOC(image_pool_byte_size); + SOKOL_ASSERT(p->images); + memset(p->images, 0, image_pool_byte_size); + + SOKOL_ASSERT((desc->shader_pool_size > 0) && (desc->shader_pool_size < _SG_MAX_POOL_SIZE)); + _sg_init_pool(&p->shader_pool, desc->shader_pool_size); + size_t shader_pool_byte_size = sizeof(_sg_shader_t) * (size_t)p->shader_pool.size; + p->shaders = (_sg_shader_t*) SOKOL_MALLOC(shader_pool_byte_size); + SOKOL_ASSERT(p->shaders); + memset(p->shaders, 0, shader_pool_byte_size); + + SOKOL_ASSERT((desc->pipeline_pool_size > 0) && (desc->pipeline_pool_size < _SG_MAX_POOL_SIZE)); + _sg_init_pool(&p->pipeline_pool, desc->pipeline_pool_size); + size_t pipeline_pool_byte_size = sizeof(_sg_pipeline_t) * (size_t)p->pipeline_pool.size; + p->pipelines = (_sg_pipeline_t*) SOKOL_MALLOC(pipeline_pool_byte_size); + SOKOL_ASSERT(p->pipelines); + memset(p->pipelines, 0, pipeline_pool_byte_size); + + SOKOL_ASSERT((desc->pass_pool_size > 0) && (desc->pass_pool_size < _SG_MAX_POOL_SIZE)); + _sg_init_pool(&p->pass_pool, desc->pass_pool_size); + size_t pass_pool_byte_size = sizeof(_sg_pass_t) * (size_t)p->pass_pool.size; + p->passes = (_sg_pass_t*) SOKOL_MALLOC(pass_pool_byte_size); + SOKOL_ASSERT(p->passes); + memset(p->passes, 0, pass_pool_byte_size); + + SOKOL_ASSERT((desc->context_pool_size > 0) && (desc->context_pool_size < _SG_MAX_POOL_SIZE)); + _sg_init_pool(&p->context_pool, desc->context_pool_size); + size_t context_pool_byte_size = sizeof(_sg_context_t) * (size_t)p->context_pool.size; + p->contexts = (_sg_context_t*) SOKOL_MALLOC(context_pool_byte_size); + SOKOL_ASSERT(p->contexts); + memset(p->contexts, 0, context_pool_byte_size); +} + +_SOKOL_PRIVATE void _sg_discard_pools(_sg_pools_t* p) { + SOKOL_ASSERT(p); + SOKOL_FREE(p->contexts); p->contexts = 0; + SOKOL_FREE(p->passes); p->passes = 0; + SOKOL_FREE(p->pipelines); p->pipelines = 0; + SOKOL_FREE(p->shaders); p->shaders = 0; + SOKOL_FREE(p->images); p->images = 0; + SOKOL_FREE(p->buffers); p->buffers = 0; + _sg_discard_pool(&p->context_pool); + _sg_discard_pool(&p->pass_pool); + _sg_discard_pool(&p->pipeline_pool); + _sg_discard_pool(&p->shader_pool); + _sg_discard_pool(&p->image_pool); + _sg_discard_pool(&p->buffer_pool); +} + +/* allocate the slot at slot_index: + - bump the slot's generation counter + - create a resource id from the generation counter and slot index + - set the slot's id to this id + - set the slot's state to ALLOC + - return the resource id +*/ +_SOKOL_PRIVATE uint32_t _sg_slot_alloc(_sg_pool_t* pool, _sg_slot_t* slot, int slot_index) { + /* FIXME: add handling for an overflowing generation counter, + for now, just overflow (another option is to disable + the slot) + */ + SOKOL_ASSERT(pool && pool->gen_ctrs); + SOKOL_ASSERT((slot_index > _SG_INVALID_SLOT_INDEX) && (slot_index < pool->size)); + SOKOL_ASSERT((slot->state == SG_RESOURCESTATE_INITIAL) && (slot->id == SG_INVALID_ID)); + uint32_t ctr = ++pool->gen_ctrs[slot_index]; + slot->id = (ctr<<_SG_SLOT_SHIFT)|(slot_index & _SG_SLOT_MASK); + slot->state = SG_RESOURCESTATE_ALLOC; + return slot->id; +} + +/* extract slot index from id */ +_SOKOL_PRIVATE int _sg_slot_index(uint32_t id) { + int slot_index = (int) (id & _SG_SLOT_MASK); + SOKOL_ASSERT(_SG_INVALID_SLOT_INDEX != slot_index); + return slot_index; +} + +/* returns pointer to resource by id without matching id check */ +_SOKOL_PRIVATE _sg_buffer_t* _sg_buffer_at(const _sg_pools_t* p, uint32_t buf_id) { + SOKOL_ASSERT(p && (SG_INVALID_ID != buf_id)); + int slot_index = _sg_slot_index(buf_id); + SOKOL_ASSERT((slot_index > _SG_INVALID_SLOT_INDEX) && (slot_index < p->buffer_pool.size)); + return &p->buffers[slot_index]; +} + +_SOKOL_PRIVATE _sg_image_t* _sg_image_at(const _sg_pools_t* p, uint32_t img_id) { + SOKOL_ASSERT(p && (SG_INVALID_ID != img_id)); + int slot_index = _sg_slot_index(img_id); + SOKOL_ASSERT((slot_index > _SG_INVALID_SLOT_INDEX) && (slot_index < p->image_pool.size)); + return &p->images[slot_index]; +} + +_SOKOL_PRIVATE _sg_shader_t* _sg_shader_at(const _sg_pools_t* p, uint32_t shd_id) { + SOKOL_ASSERT(p && (SG_INVALID_ID != shd_id)); + int slot_index = _sg_slot_index(shd_id); + SOKOL_ASSERT((slot_index > _SG_INVALID_SLOT_INDEX) && (slot_index < p->shader_pool.size)); + return &p->shaders[slot_index]; +} + +_SOKOL_PRIVATE _sg_pipeline_t* _sg_pipeline_at(const _sg_pools_t* p, uint32_t pip_id) { + SOKOL_ASSERT(p && (SG_INVALID_ID != pip_id)); + int slot_index = _sg_slot_index(pip_id); + SOKOL_ASSERT((slot_index > _SG_INVALID_SLOT_INDEX) && (slot_index < p->pipeline_pool.size)); + return &p->pipelines[slot_index]; +} + +_SOKOL_PRIVATE _sg_pass_t* _sg_pass_at(const _sg_pools_t* p, uint32_t pass_id) { + SOKOL_ASSERT(p && (SG_INVALID_ID != pass_id)); + int slot_index = _sg_slot_index(pass_id); + SOKOL_ASSERT((slot_index > _SG_INVALID_SLOT_INDEX) && (slot_index < p->pass_pool.size)); + return &p->passes[slot_index]; +} + +_SOKOL_PRIVATE _sg_context_t* _sg_context_at(const _sg_pools_t* p, uint32_t context_id) { + SOKOL_ASSERT(p && (SG_INVALID_ID != context_id)); + int slot_index = _sg_slot_index(context_id); + SOKOL_ASSERT((slot_index > _SG_INVALID_SLOT_INDEX) && (slot_index < p->context_pool.size)); + return &p->contexts[slot_index]; +} + +/* returns pointer to resource with matching id check, may return 0 */ +_SOKOL_PRIVATE _sg_buffer_t* _sg_lookup_buffer(const _sg_pools_t* p, uint32_t buf_id) { + if (SG_INVALID_ID != buf_id) { + _sg_buffer_t* buf = _sg_buffer_at(p, buf_id); + if (buf->slot.id == buf_id) { + return buf; + } + } + return 0; +} + +_SOKOL_PRIVATE _sg_image_t* _sg_lookup_image(const _sg_pools_t* p, uint32_t img_id) { + if (SG_INVALID_ID != img_id) { + _sg_image_t* img = _sg_image_at(p, img_id); + if (img->slot.id == img_id) { + return img; + } + } + return 0; +} + +_SOKOL_PRIVATE _sg_shader_t* _sg_lookup_shader(const _sg_pools_t* p, uint32_t shd_id) { + SOKOL_ASSERT(p); + if (SG_INVALID_ID != shd_id) { + _sg_shader_t* shd = _sg_shader_at(p, shd_id); + if (shd->slot.id == shd_id) { + return shd; + } + } + return 0; +} + +_SOKOL_PRIVATE _sg_pipeline_t* _sg_lookup_pipeline(const _sg_pools_t* p, uint32_t pip_id) { + SOKOL_ASSERT(p); + if (SG_INVALID_ID != pip_id) { + _sg_pipeline_t* pip = _sg_pipeline_at(p, pip_id); + if (pip->slot.id == pip_id) { + return pip; + } + } + return 0; +} + +_SOKOL_PRIVATE _sg_pass_t* _sg_lookup_pass(const _sg_pools_t* p, uint32_t pass_id) { + SOKOL_ASSERT(p); + if (SG_INVALID_ID != pass_id) { + _sg_pass_t* pass = _sg_pass_at(p, pass_id); + if (pass->slot.id == pass_id) { + return pass; + } + } + return 0; +} + +_SOKOL_PRIVATE _sg_context_t* _sg_lookup_context(const _sg_pools_t* p, uint32_t ctx_id) { + SOKOL_ASSERT(p); + if (SG_INVALID_ID != ctx_id) { + _sg_context_t* ctx = _sg_context_at(p, ctx_id); + if (ctx->slot.id == ctx_id) { + return ctx; + } + } + return 0; +} + +_SOKOL_PRIVATE void _sg_destroy_all_resources(_sg_pools_t* p, uint32_t ctx_id) { + /* this is a bit dumb since it loops over all pool slots to + find the occupied slots, on the other hand it is only ever + executed at shutdown + NOTE: ONLY EXECUTE THIS AT SHUTDOWN + ...because the free queues will not be reset + and the resource slots not be cleared! + */ + for (int i = 1; i < p->buffer_pool.size; i++) { + if (p->buffers[i].slot.ctx_id == ctx_id) { + sg_resource_state state = p->buffers[i].slot.state; + if ((state == SG_RESOURCESTATE_VALID) || (state == SG_RESOURCESTATE_FAILED)) { + _sg_destroy_buffer(&p->buffers[i]); + } + } + } + for (int i = 1; i < p->image_pool.size; i++) { + if (p->images[i].slot.ctx_id == ctx_id) { + sg_resource_state state = p->images[i].slot.state; + if ((state == SG_RESOURCESTATE_VALID) || (state == SG_RESOURCESTATE_FAILED)) { + _sg_destroy_image(&p->images[i]); + } + } + } + for (int i = 1; i < p->shader_pool.size; i++) { + if (p->shaders[i].slot.ctx_id == ctx_id) { + sg_resource_state state = p->shaders[i].slot.state; + if ((state == SG_RESOURCESTATE_VALID) || (state == SG_RESOURCESTATE_FAILED)) { + _sg_destroy_shader(&p->shaders[i]); + } + } + } + for (int i = 1; i < p->pipeline_pool.size; i++) { + if (p->pipelines[i].slot.ctx_id == ctx_id) { + sg_resource_state state = p->pipelines[i].slot.state; + if ((state == SG_RESOURCESTATE_VALID) || (state == SG_RESOURCESTATE_FAILED)) { + _sg_destroy_pipeline(&p->pipelines[i]); + } + } + } + for (int i = 1; i < p->pass_pool.size; i++) { + if (p->passes[i].slot.ctx_id == ctx_id) { + sg_resource_state state = p->passes[i].slot.state; + if ((state == SG_RESOURCESTATE_VALID) || (state == SG_RESOURCESTATE_FAILED)) { + _sg_destroy_pass(&p->passes[i]); + } + } + } +} + +/*== VALIDATION LAYER ========================================================*/ +#if defined(SOKOL_DEBUG) +/* return a human readable string for an _sg_validate_error */ +_SOKOL_PRIVATE const char* _sg_validate_string(_sg_validate_error_t err) { + switch (err) { + /* buffer creation validation errors */ + case _SG_VALIDATE_BUFFERDESC_CANARY: return "sg_buffer_desc not initialized"; + case _SG_VALIDATE_BUFFERDESC_SIZE: return "sg_buffer_desc.size cannot be 0"; + case _SG_VALIDATE_BUFFERDESC_DATA: return "immutable buffers must be initialized with data (sg_buffer_desc.data.ptr and sg_buffer_desc.data.size)"; + case _SG_VALIDATE_BUFFERDESC_DATA_SIZE: return "immutable buffer data size differs from buffer size"; + case _SG_VALIDATE_BUFFERDESC_NO_DATA: return "dynamic/stream usage buffers cannot be initialized with data"; + + /* image data (in image creation and updating) */ + case _SG_VALIDATE_IMAGEDATA_NODATA: return "sg_image_data: no data (.ptr and/or .size is zero)"; + case _SG_VALIDATE_IMAGEDATA_DATA_SIZE: return "sg_image_data: data size doesn't match expected surface size"; + + /* image creation validation errros */ + case _SG_VALIDATE_IMAGEDESC_CANARY: return "sg_image_desc not initialized"; + case _SG_VALIDATE_IMAGEDESC_WIDTH: return "sg_image_desc.width must be > 0"; + case _SG_VALIDATE_IMAGEDESC_HEIGHT: return "sg_image_desc.height must be > 0"; + case _SG_VALIDATE_IMAGEDESC_RT_PIXELFORMAT: return "invalid pixel format for render-target image"; + case _SG_VALIDATE_IMAGEDESC_NONRT_PIXELFORMAT: return "invalid pixel format for non-render-target image"; + case _SG_VALIDATE_IMAGEDESC_MSAA_BUT_NO_RT: return "non-render-target images cannot be multisampled"; + case _SG_VALIDATE_IMAGEDESC_NO_MSAA_RT_SUPPORT: return "MSAA not supported for this pixel format"; + case _SG_VALIDATE_IMAGEDESC_RT_IMMUTABLE: return "render target images must be SG_USAGE_IMMUTABLE"; + case _SG_VALIDATE_IMAGEDESC_RT_NO_DATA: return "render target images cannot be initialized with data"; + case _SG_VALIDATE_IMAGEDESC_INJECTED_NO_DATA: return "images with injected textures cannot be initialized with data"; + case _SG_VALIDATE_IMAGEDESC_DYNAMIC_NO_DATA: return "dynamic/stream images cannot be initialized with data"; + case _SG_VALIDATE_IMAGEDESC_COMPRESSED_IMMUTABLE: return "compressed images must be immutable"; + + /* shader creation */ + case _SG_VALIDATE_SHADERDESC_CANARY: return "sg_shader_desc not initialized"; + case _SG_VALIDATE_SHADERDESC_SOURCE: return "shader source code required"; + case _SG_VALIDATE_SHADERDESC_BYTECODE: return "shader byte code required"; + case _SG_VALIDATE_SHADERDESC_SOURCE_OR_BYTECODE: return "shader source or byte code required"; + case _SG_VALIDATE_SHADERDESC_NO_BYTECODE_SIZE: return "shader byte code length (in bytes) required"; + case _SG_VALIDATE_SHADERDESC_NO_CONT_UBS: return "shader uniform blocks must occupy continuous slots"; + case _SG_VALIDATE_SHADERDESC_NO_CONT_UB_MEMBERS: return "uniform block members must occupy continuous slots"; + case _SG_VALIDATE_SHADERDESC_NO_UB_MEMBERS: return "GL backend requires uniform block member declarations"; + case _SG_VALIDATE_SHADERDESC_UB_MEMBER_NAME: return "uniform block member name missing"; + case _SG_VALIDATE_SHADERDESC_UB_SIZE_MISMATCH: return "size of uniform block members doesn't match uniform block size"; + case _SG_VALIDATE_SHADERDESC_UB_ARRAY_COUNT: return "uniform array count must be >= 1"; + case _SG_VALIDATE_SHADERDESC_UB_STD140_ARRAY_TYPE: return "uniform arrays only allowed for FLOAT4, INT4, MAT4 in std140 layout"; + + case _SG_VALIDATE_SHADERDESC_NO_CONT_IMGS: return "shader images must occupy continuous slots"; + case _SG_VALIDATE_SHADERDESC_IMG_NAME: return "GL backend requires uniform block member names"; + case _SG_VALIDATE_SHADERDESC_ATTR_NAMES: return "GLES2 backend requires vertex attribute names"; + case _SG_VALIDATE_SHADERDESC_ATTR_SEMANTICS: return "D3D11 backend requires vertex attribute semantics"; + case _SG_VALIDATE_SHADERDESC_ATTR_STRING_TOO_LONG: return "vertex attribute name/semantic string too long (max len 16)"; + + /* pipeline creation */ + case _SG_VALIDATE_PIPELINEDESC_CANARY: return "sg_pipeline_desc not initialized"; + case _SG_VALIDATE_PIPELINEDESC_SHADER: return "sg_pipeline_desc.shader missing or invalid"; + case _SG_VALIDATE_PIPELINEDESC_NO_ATTRS: return "sg_pipeline_desc.layout.attrs is empty or not continuous"; + case _SG_VALIDATE_PIPELINEDESC_LAYOUT_STRIDE4: return "sg_pipeline_desc.layout.buffers[].stride must be multiple of 4"; + case _SG_VALIDATE_PIPELINEDESC_ATTR_NAME: return "GLES2/WebGL missing vertex attribute name in shader"; + case _SG_VALIDATE_PIPELINEDESC_ATTR_SEMANTICS: return "D3D11 missing vertex attribute semantics in shader"; + + /* pass creation */ + case _SG_VALIDATE_PASSDESC_CANARY: return "sg_pass_desc not initialized"; + case _SG_VALIDATE_PASSDESC_NO_COLOR_ATTS: return "sg_pass_desc.color_attachments[0] must be valid"; + case _SG_VALIDATE_PASSDESC_NO_CONT_COLOR_ATTS: return "color attachments must occupy continuous slots"; + case _SG_VALIDATE_PASSDESC_IMAGE: return "pass attachment image is not valid"; + case _SG_VALIDATE_PASSDESC_MIPLEVEL: return "pass attachment mip level is bigger than image has mipmaps"; + case _SG_VALIDATE_PASSDESC_FACE: return "pass attachment image is cubemap, but face index is too big"; + case _SG_VALIDATE_PASSDESC_LAYER: return "pass attachment image is array texture, but layer index is too big"; + case _SG_VALIDATE_PASSDESC_SLICE: return "pass attachment image is 3d texture, but slice value is too big"; + case _SG_VALIDATE_PASSDESC_IMAGE_NO_RT: return "pass attachment image must be render targets"; + case _SG_VALIDATE_PASSDESC_COLOR_INV_PIXELFORMAT: return "pass color-attachment images must have a renderable pixel format"; + case _SG_VALIDATE_PASSDESC_DEPTH_INV_PIXELFORMAT: return "pass depth-attachment image must have depth pixel format"; + case _SG_VALIDATE_PASSDESC_IMAGE_SIZES: return "all pass attachments must have the same size"; + case _SG_VALIDATE_PASSDESC_IMAGE_SAMPLE_COUNTS: return "all pass attachments must have the same sample count"; + + /* sg_begin_pass */ + case _SG_VALIDATE_BEGINPASS_PASS: return "sg_begin_pass: pass must be valid"; + case _SG_VALIDATE_BEGINPASS_IMAGE: return "sg_begin_pass: one or more attachment images are not valid"; + + /* sg_apply_pipeline */ + case _SG_VALIDATE_APIP_PIPELINE_VALID_ID: return "sg_apply_pipeline: invalid pipeline id provided"; + case _SG_VALIDATE_APIP_PIPELINE_EXISTS: return "sg_apply_pipeline: pipeline object no longer alive"; + case _SG_VALIDATE_APIP_PIPELINE_VALID: return "sg_apply_pipeline: pipeline object not in valid state"; + case _SG_VALIDATE_APIP_SHADER_EXISTS: return "sg_apply_pipeline: shader object no longer alive"; + case _SG_VALIDATE_APIP_SHADER_VALID: return "sg_apply_pipeline: shader object not in valid state"; + case _SG_VALIDATE_APIP_ATT_COUNT: return "sg_apply_pipeline: number of pipeline color attachments doesn't match number of pass color attachments"; + case _SG_VALIDATE_APIP_COLOR_FORMAT: return "sg_apply_pipeline: pipeline color attachment pixel format doesn't match pass color attachment pixel format"; + case _SG_VALIDATE_APIP_DEPTH_FORMAT: return "sg_apply_pipeline: pipeline depth pixel_format doesn't match pass depth attachment pixel format"; + case _SG_VALIDATE_APIP_SAMPLE_COUNT: return "sg_apply_pipeline: pipeline MSAA sample count doesn't match render pass attachment sample count"; + + /* sg_apply_bindings */ + case _SG_VALIDATE_ABND_PIPELINE: return "sg_apply_bindings: must be called after sg_apply_pipeline"; + case _SG_VALIDATE_ABND_PIPELINE_EXISTS: return "sg_apply_bindings: currently applied pipeline object no longer alive"; + case _SG_VALIDATE_ABND_PIPELINE_VALID: return "sg_apply_bindings: currently applied pipeline object not in valid state"; + case _SG_VALIDATE_ABND_VBS: return "sg_apply_bindings: number of vertex buffers doesn't match number of pipeline vertex layouts"; + case _SG_VALIDATE_ABND_VB_EXISTS: return "sg_apply_bindings: vertex buffer no longer alive"; + case _SG_VALIDATE_ABND_VB_TYPE: return "sg_apply_bindings: buffer in vertex buffer slot is not a SG_BUFFERTYPE_VERTEXBUFFER"; + case _SG_VALIDATE_ABND_VB_OVERFLOW: return "sg_apply_bindings: buffer in vertex buffer slot is overflown"; + case _SG_VALIDATE_ABND_NO_IB: return "sg_apply_bindings: pipeline object defines indexed rendering, but no index buffer provided"; + case _SG_VALIDATE_ABND_IB: return "sg_apply_bindings: pipeline object defines non-indexed rendering, but index buffer provided"; + case _SG_VALIDATE_ABND_IB_EXISTS: return "sg_apply_bindings: index buffer no longer alive"; + case _SG_VALIDATE_ABND_IB_TYPE: return "sg_apply_bindings: buffer in index buffer slot is not a SG_BUFFERTYPE_INDEXBUFFER"; + case _SG_VALIDATE_ABND_IB_OVERFLOW: return "sg_apply_bindings: buffer in index buffer slot is overflown"; + case _SG_VALIDATE_ABND_VS_IMGS: return "sg_apply_bindings: vertex shader image count doesn't match sg_shader_desc"; + case _SG_VALIDATE_ABND_VS_IMG_EXISTS: return "sg_apply_bindings: vertex shader image no longer alive"; + case _SG_VALIDATE_ABND_VS_IMG_TYPES: return "sg_apply_bindings: one or more vertex shader image types don't match sg_shader_desc"; + case _SG_VALIDATE_ABND_FS_IMGS: return "sg_apply_bindings: fragment shader image count doesn't match sg_shader_desc"; + case _SG_VALIDATE_ABND_FS_IMG_EXISTS: return "sg_apply_bindings: fragment shader image no longer alive"; + case _SG_VALIDATE_ABND_FS_IMG_TYPES: return "sg_apply_bindings: one or more fragment shader image types don't match sg_shader_desc"; + + /* sg_apply_uniforms */ + case _SG_VALIDATE_AUB_NO_PIPELINE: return "sg_apply_uniforms: must be called after sg_apply_pipeline()"; + case _SG_VALIDATE_AUB_NO_UB_AT_SLOT: return "sg_apply_uniforms: no uniform block declaration at this shader stage UB slot"; + case _SG_VALIDATE_AUB_SIZE: return "sg_apply_uniforms: data size exceeds declared uniform block size"; + + /* sg_update_buffer */ + case _SG_VALIDATE_UPDATEBUF_USAGE: return "sg_update_buffer: cannot update immutable buffer"; + case _SG_VALIDATE_UPDATEBUF_SIZE: return "sg_update_buffer: update size is bigger than buffer size"; + case _SG_VALIDATE_UPDATEBUF_ONCE: return "sg_update_buffer: only one update allowed per buffer and frame"; + case _SG_VALIDATE_UPDATEBUF_APPEND: return "sg_update_buffer: cannot call sg_update_buffer and sg_append_buffer in same frame"; + + /* sg_append_buffer */ + case _SG_VALIDATE_APPENDBUF_USAGE: return "sg_append_buffer: cannot append to immutable buffer"; + case _SG_VALIDATE_APPENDBUF_SIZE: return "sg_append_buffer: overall appended size is bigger than buffer size"; + case _SG_VALIDATE_APPENDBUF_UPDATE: return "sg_append_buffer: cannot call sg_append_buffer and sg_update_buffer in same frame"; + + /* sg_update_image */ + case _SG_VALIDATE_UPDIMG_USAGE: return "sg_update_image: cannot update immutable image"; + case _SG_VALIDATE_UPDIMG_ONCE: return "sg_update_image: only one update allowed per image and frame"; + + default: return "unknown validation error"; + } +} +#endif /* defined(SOKOL_DEBUG) */ + +/*-- validation checks -------------------------------------------------------*/ +#if defined(SOKOL_DEBUG) +_SOKOL_PRIVATE void _sg_validate_begin(void) { + _sg.validate_error = _SG_VALIDATE_SUCCESS; +} + +_SOKOL_PRIVATE void _sg_validate(bool cond, _sg_validate_error_t err) { + if (!cond) { + _sg.validate_error = err; + SOKOL_LOG(_sg_validate_string(err)); + } +} + +_SOKOL_PRIVATE bool _sg_validate_end(void) { + if (_sg.validate_error != _SG_VALIDATE_SUCCESS) { + #if !defined(SOKOL_VALIDATE_NON_FATAL) + SOKOL_LOG("^^^^ SOKOL-GFX VALIDATION FAILED, TERMINATING ^^^^"); + SOKOL_ASSERT(false); + #endif + return false; + } + else { + return true; + } +} +#endif + +_SOKOL_PRIVATE bool _sg_validate_buffer_desc(const sg_buffer_desc* desc) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(desc); + return true; + #else + SOKOL_ASSERT(desc); + SOKOL_VALIDATE_BEGIN(); + SOKOL_VALIDATE(desc->_start_canary == 0, _SG_VALIDATE_BUFFERDESC_CANARY); + SOKOL_VALIDATE(desc->_end_canary == 0, _SG_VALIDATE_BUFFERDESC_CANARY); + SOKOL_VALIDATE(desc->size > 0, _SG_VALIDATE_BUFFERDESC_SIZE); + bool injected = (0 != desc->gl_buffers[0]) || + (0 != desc->mtl_buffers[0]) || + (0 != desc->d3d11_buffer) || + (0 != desc->wgpu_buffer); + if (!injected && (desc->usage == SG_USAGE_IMMUTABLE)) { + SOKOL_VALIDATE((0 != desc->data.ptr) && (desc->data.size > 0), _SG_VALIDATE_BUFFERDESC_DATA); + SOKOL_VALIDATE(desc->size == desc->data.size, _SG_VALIDATE_BUFFERDESC_DATA_SIZE); + } + else { + SOKOL_VALIDATE(0 == desc->data.ptr, _SG_VALIDATE_BUFFERDESC_NO_DATA); + } + return SOKOL_VALIDATE_END(); + #endif +} + +_SOKOL_PRIVATE void _sg_validate_image_data(const sg_image_data* data, sg_pixel_format fmt, int width, int height, int num_faces, int num_mips, int num_slices) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(data); + _SOKOL_UNUSED(fmt); + _SOKOL_UNUSED(width); + _SOKOL_UNUSED(height); + _SOKOL_UNUSED(num_faces); + _SOKOL_UNUSED(num_mips); + _SOKOL_UNUSED(num_slices); + #else + for (int face_index = 0; face_index < num_faces; face_index++) { + for (int mip_index = 0; mip_index < num_mips; mip_index++) { + const bool has_data = data->subimage[face_index][mip_index].ptr != 0; + const bool has_size = data->subimage[face_index][mip_index].size > 0; + SOKOL_VALIDATE(has_data && has_size, _SG_VALIDATE_IMAGEDATA_NODATA); + const int mip_width = _sg_max(width >> mip_index, 1); + const int mip_height = _sg_max(height >> mip_index, 1); + const int bytes_per_slice = _sg_surface_pitch(fmt, mip_width, mip_height, 1); + const int expected_size = bytes_per_slice * num_slices; + SOKOL_VALIDATE(expected_size == (int)data->subimage[face_index][mip_index].size, _SG_VALIDATE_IMAGEDATA_DATA_SIZE); + } + } + #endif +} + +_SOKOL_PRIVATE bool _sg_validate_image_desc(const sg_image_desc* desc) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(desc); + return true; + #else + SOKOL_ASSERT(desc); + SOKOL_VALIDATE_BEGIN(); + SOKOL_VALIDATE(desc->_start_canary == 0, _SG_VALIDATE_IMAGEDESC_CANARY); + SOKOL_VALIDATE(desc->_end_canary == 0, _SG_VALIDATE_IMAGEDESC_CANARY); + SOKOL_VALIDATE(desc->width > 0, _SG_VALIDATE_IMAGEDESC_WIDTH); + SOKOL_VALIDATE(desc->height > 0, _SG_VALIDATE_IMAGEDESC_HEIGHT); + const sg_pixel_format fmt = desc->pixel_format; + const sg_usage usage = desc->usage; + const bool injected = (0 != desc->gl_textures[0]) || + (0 != desc->mtl_textures[0]) || + (0 != desc->d3d11_texture) || + (0 != desc->wgpu_texture); + if (desc->render_target) { + SOKOL_ASSERT(((int)fmt >= 0) && ((int)fmt < _SG_PIXELFORMAT_NUM)); + SOKOL_VALIDATE(_sg.formats[fmt].render, _SG_VALIDATE_IMAGEDESC_RT_PIXELFORMAT); + /* on GLES2, sample count for render targets is completely ignored */ + #if defined(SOKOL_GLES2) || defined(SOKOL_GLES3) + if (!_sg.gl.gles2) { + #endif + if (desc->sample_count > 1) { + SOKOL_VALIDATE(_sg.features.msaa_render_targets && _sg.formats[fmt].msaa, _SG_VALIDATE_IMAGEDESC_NO_MSAA_RT_SUPPORT); + } + #if defined(SOKOL_GLES2) || defined(SOKOL_GLES3) + } + #endif + SOKOL_VALIDATE(usage == SG_USAGE_IMMUTABLE, _SG_VALIDATE_IMAGEDESC_RT_IMMUTABLE); + SOKOL_VALIDATE(desc->data.subimage[0][0].ptr==0, _SG_VALIDATE_IMAGEDESC_RT_NO_DATA); + } + else { + SOKOL_VALIDATE(desc->sample_count <= 1, _SG_VALIDATE_IMAGEDESC_MSAA_BUT_NO_RT); + const bool valid_nonrt_fmt = !_sg_is_valid_rendertarget_depth_format(fmt); + SOKOL_VALIDATE(valid_nonrt_fmt, _SG_VALIDATE_IMAGEDESC_NONRT_PIXELFORMAT); + const bool is_compressed = _sg_is_compressed_pixel_format(desc->pixel_format); + const bool is_immutable = (usage == SG_USAGE_IMMUTABLE); + if (is_compressed) { + SOKOL_VALIDATE(is_immutable, _SG_VALIDATE_IMAGEDESC_COMPRESSED_IMMUTABLE); + } + if (!injected && is_immutable) { + // image desc must have valid data + _sg_validate_image_data(&desc->data, + desc->pixel_format, + desc->width, + desc->height, + (desc->type == SG_IMAGETYPE_CUBE) ? 6 : 1, + desc->num_mipmaps, + desc->num_slices); + } + else { + // image desc must not have data + for (int face_index = 0; face_index < SG_CUBEFACE_NUM; face_index++) { + for (int mip_index = 0; mip_index < SG_MAX_MIPMAPS; mip_index++) { + const bool no_data = 0 == desc->data.subimage[face_index][mip_index].ptr; + const bool no_size = 0 == desc->data.subimage[face_index][mip_index].size; + if (injected) { + SOKOL_VALIDATE(no_data && no_size, _SG_VALIDATE_IMAGEDESC_INJECTED_NO_DATA); + } + if (!is_immutable) { + SOKOL_VALIDATE(no_data && no_size, _SG_VALIDATE_IMAGEDESC_DYNAMIC_NO_DATA); + } + } + } + } + } + return SOKOL_VALIDATE_END(); + #endif +} + +_SOKOL_PRIVATE bool _sg_validate_shader_desc(const sg_shader_desc* desc) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(desc); + return true; + #else + SOKOL_ASSERT(desc); + SOKOL_VALIDATE_BEGIN(); + SOKOL_VALIDATE(desc->_start_canary == 0, _SG_VALIDATE_SHADERDESC_CANARY); + SOKOL_VALIDATE(desc->_end_canary == 0, _SG_VALIDATE_SHADERDESC_CANARY); + #if defined(SOKOL_GLES2) + SOKOL_VALIDATE(0 != desc->attrs[0].name, _SG_VALIDATE_SHADERDESC_ATTR_NAMES); + #elif defined(SOKOL_D3D11) + SOKOL_VALIDATE(0 != desc->attrs[0].sem_name, _SG_VALIDATE_SHADERDESC_ATTR_SEMANTICS); + #endif + #if defined(SOKOL_GLCORE33) || defined(SOKOL_GLES2) || defined(SOKOL_GLES3) + /* on GL, must provide shader source code */ + SOKOL_VALIDATE(0 != desc->vs.source, _SG_VALIDATE_SHADERDESC_SOURCE); + SOKOL_VALIDATE(0 != desc->fs.source, _SG_VALIDATE_SHADERDESC_SOURCE); + #elif defined(SOKOL_METAL) || defined(SOKOL_D3D11) + /* on Metal or D3D11, must provide shader source code or byte code */ + SOKOL_VALIDATE((0 != desc->vs.source)||(0 != desc->vs.bytecode.ptr), _SG_VALIDATE_SHADERDESC_SOURCE_OR_BYTECODE); + SOKOL_VALIDATE((0 != desc->fs.source)||(0 != desc->fs.bytecode.ptr), _SG_VALIDATE_SHADERDESC_SOURCE_OR_BYTECODE); + #elif defined(SOKOL_WGPU) + /* on WGPU byte code must be provided */ + SOKOL_VALIDATE((0 != desc->vs.bytecode.ptr), _SG_VALIDATE_SHADERDESC_BYTECODE); + SOKOL_VALIDATE((0 != desc->fs.bytecode.ptr), _SG_VALIDATE_SHADERDESC_BYTECODE); + #else + /* Dummy Backend, don't require source or bytecode */ + #endif + for (int i = 0; i < SG_MAX_VERTEX_ATTRIBUTES; i++) { + if (desc->attrs[i].name) { + SOKOL_VALIDATE(strlen(desc->attrs[i].name) < _SG_STRING_SIZE, _SG_VALIDATE_SHADERDESC_ATTR_STRING_TOO_LONG); + } + if (desc->attrs[i].sem_name) { + SOKOL_VALIDATE(strlen(desc->attrs[i].sem_name) < _SG_STRING_SIZE, _SG_VALIDATE_SHADERDESC_ATTR_STRING_TOO_LONG); + } + } + /* if shader byte code, the size must also be provided */ + if (0 != desc->vs.bytecode.ptr) { + SOKOL_VALIDATE(desc->vs.bytecode.size > 0, _SG_VALIDATE_SHADERDESC_NO_BYTECODE_SIZE); + } + if (0 != desc->fs.bytecode.ptr) { + SOKOL_VALIDATE(desc->fs.bytecode.size > 0, _SG_VALIDATE_SHADERDESC_NO_BYTECODE_SIZE); + } + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + const sg_shader_stage_desc* stage_desc = (stage_index == 0)? &desc->vs : &desc->fs; + bool uniform_blocks_continuous = true; + for (int ub_index = 0; ub_index < SG_MAX_SHADERSTAGE_UBS; ub_index++) { + const sg_shader_uniform_block_desc* ub_desc = &stage_desc->uniform_blocks[ub_index]; + if (ub_desc->size > 0) { + SOKOL_VALIDATE(uniform_blocks_continuous, _SG_VALIDATE_SHADERDESC_NO_CONT_UBS); + #if defined(_SOKOL_ANY_GL) + bool uniforms_continuous = true; + uint32_t uniform_offset = 0; + int num_uniforms = 0; + for (int u_index = 0; u_index < SG_MAX_UB_MEMBERS; u_index++) { + const sg_shader_uniform_desc* u_desc = &ub_desc->uniforms[u_index]; + if (u_desc->type != SG_UNIFORMTYPE_INVALID) { + SOKOL_VALIDATE(uniforms_continuous, _SG_VALIDATE_SHADERDESC_NO_CONT_UB_MEMBERS); + #if defined(SOKOL_GLES2) || defined(SOKOL_GLES3) + SOKOL_VALIDATE(0 != u_desc->name, _SG_VALIDATE_SHADERDESC_UB_MEMBER_NAME); + #endif + const int array_count = u_desc->array_count; + SOKOL_VALIDATE(array_count > 0, _SG_VALIDATE_SHADERDESC_UB_ARRAY_COUNT); + const uint32_t u_align = _sg_uniform_alignment(u_desc->type, array_count, ub_desc->layout); + const uint32_t u_size = _sg_uniform_size(u_desc->type, array_count, ub_desc->layout); + uniform_offset = _sg_align_u32(uniform_offset, u_align); + uniform_offset += u_size; + num_uniforms++; + // with std140, arrays are only allowed for FLOAT4, INT4, MAT4 + if (ub_desc->layout == SG_UNIFORMLAYOUT_STD140) { + if (array_count > 1) { + SOKOL_VALIDATE((u_desc->type == SG_UNIFORMTYPE_FLOAT4) || (u_desc->type == SG_UNIFORMTYPE_INT4) || (u_desc->type == SG_UNIFORMTYPE_MAT4), _SG_VALIDATE_SHADERDESC_UB_STD140_ARRAY_TYPE); + } + } + } + else { + uniforms_continuous = false; + } + } + if (ub_desc->layout == SG_UNIFORMLAYOUT_STD140) { + uniform_offset = _sg_align_u32(uniform_offset, 16); + } + SOKOL_VALIDATE((size_t)uniform_offset == ub_desc->size, _SG_VALIDATE_SHADERDESC_UB_SIZE_MISMATCH); + SOKOL_VALIDATE(num_uniforms > 0, _SG_VALIDATE_SHADERDESC_NO_UB_MEMBERS); + #endif + } + else { + uniform_blocks_continuous = false; + } + } + bool images_continuous = true; + for (int img_index = 0; img_index < SG_MAX_SHADERSTAGE_IMAGES; img_index++) { + const sg_shader_image_desc* img_desc = &stage_desc->images[img_index]; + if (img_desc->image_type != _SG_IMAGETYPE_DEFAULT) { + SOKOL_VALIDATE(images_continuous, _SG_VALIDATE_SHADERDESC_NO_CONT_IMGS); + #if defined(SOKOL_GLES2) + SOKOL_VALIDATE(0 != img_desc->name, _SG_VALIDATE_SHADERDESC_IMG_NAME); + #endif + } + else { + images_continuous = false; + } + } + } + return SOKOL_VALIDATE_END(); + #endif +} + +_SOKOL_PRIVATE bool _sg_validate_pipeline_desc(const sg_pipeline_desc* desc) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(desc); + return true; + #else + SOKOL_ASSERT(desc); + SOKOL_VALIDATE_BEGIN(); + SOKOL_VALIDATE(desc->_start_canary == 0, _SG_VALIDATE_PIPELINEDESC_CANARY); + SOKOL_VALIDATE(desc->_end_canary == 0, _SG_VALIDATE_PIPELINEDESC_CANARY); + SOKOL_VALIDATE(desc->shader.id != SG_INVALID_ID, _SG_VALIDATE_PIPELINEDESC_SHADER); + for (int buf_index = 0; buf_index < SG_MAX_SHADERSTAGE_BUFFERS; buf_index++) { + const sg_buffer_layout_desc* l_desc = &desc->layout.buffers[buf_index]; + if (l_desc->stride == 0) { + continue; + } + SOKOL_VALIDATE((l_desc->stride & 3) == 0, _SG_VALIDATE_PIPELINEDESC_LAYOUT_STRIDE4); + } + SOKOL_VALIDATE(desc->layout.attrs[0].format != SG_VERTEXFORMAT_INVALID, _SG_VALIDATE_PIPELINEDESC_NO_ATTRS); + const _sg_shader_t* shd = _sg_lookup_shader(&_sg.pools, desc->shader.id); + SOKOL_VALIDATE(0 != shd, _SG_VALIDATE_PIPELINEDESC_SHADER); + if (shd) { + SOKOL_VALIDATE(shd->slot.state == SG_RESOURCESTATE_VALID, _SG_VALIDATE_PIPELINEDESC_SHADER); + bool attrs_cont = true; + for (int attr_index = 0; attr_index < SG_MAX_VERTEX_ATTRIBUTES; attr_index++) { + const sg_vertex_attr_desc* a_desc = &desc->layout.attrs[attr_index]; + if (a_desc->format == SG_VERTEXFORMAT_INVALID) { + attrs_cont = false; + continue; + } + SOKOL_VALIDATE(attrs_cont, _SG_VALIDATE_PIPELINEDESC_NO_ATTRS); + SOKOL_ASSERT(a_desc->buffer_index < SG_MAX_SHADERSTAGE_BUFFERS); + #if defined(SOKOL_GLES2) + /* on GLES2, vertex attribute names must be provided */ + SOKOL_VALIDATE(!_sg_strempty(&shd->gl.attrs[attr_index].name), _SG_VALIDATE_PIPELINEDESC_ATTR_NAME); + #elif defined(SOKOL_D3D11) + /* on D3D11, semantic names (and semantic indices) must be provided */ + SOKOL_VALIDATE(!_sg_strempty(&shd->d3d11.attrs[attr_index].sem_name), _SG_VALIDATE_PIPELINEDESC_ATTR_SEMANTICS); + #endif + } + } + return SOKOL_VALIDATE_END(); + #endif +} + +_SOKOL_PRIVATE bool _sg_validate_pass_desc(const sg_pass_desc* desc) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(desc); + return true; + #else + SOKOL_ASSERT(desc); + SOKOL_VALIDATE_BEGIN(); + SOKOL_VALIDATE(desc->_start_canary == 0, _SG_VALIDATE_PASSDESC_CANARY); + SOKOL_VALIDATE(desc->_end_canary == 0, _SG_VALIDATE_PASSDESC_CANARY); + bool atts_cont = true; + int width = -1, height = -1, sample_count = -1; + for (int att_index = 0; att_index < SG_MAX_COLOR_ATTACHMENTS; att_index++) { + const sg_pass_attachment_desc* att = &desc->color_attachments[att_index]; + if (att->image.id == SG_INVALID_ID) { + SOKOL_VALIDATE(att_index > 0, _SG_VALIDATE_PASSDESC_NO_COLOR_ATTS); + atts_cont = false; + continue; + } + SOKOL_VALIDATE(atts_cont, _SG_VALIDATE_PASSDESC_NO_CONT_COLOR_ATTS); + const _sg_image_t* img = _sg_lookup_image(&_sg.pools, att->image.id); + SOKOL_ASSERT(img); + SOKOL_VALIDATE(img->slot.state == SG_RESOURCESTATE_VALID, _SG_VALIDATE_PASSDESC_IMAGE); + SOKOL_VALIDATE(att->mip_level < img->cmn.num_mipmaps, _SG_VALIDATE_PASSDESC_MIPLEVEL); + if (img->cmn.type == SG_IMAGETYPE_CUBE) { + SOKOL_VALIDATE(att->slice < 6, _SG_VALIDATE_PASSDESC_FACE); + } + else if (img->cmn.type == SG_IMAGETYPE_ARRAY) { + SOKOL_VALIDATE(att->slice < img->cmn.num_slices, _SG_VALIDATE_PASSDESC_LAYER); + } + else if (img->cmn.type == SG_IMAGETYPE_3D) { + SOKOL_VALIDATE(att->slice < img->cmn.num_slices, _SG_VALIDATE_PASSDESC_SLICE); + } + SOKOL_VALIDATE(img->cmn.render_target, _SG_VALIDATE_PASSDESC_IMAGE_NO_RT); + if (att_index == 0) { + width = img->cmn.width >> att->mip_level; + height = img->cmn.height >> att->mip_level; + sample_count = img->cmn.sample_count; + } + else { + SOKOL_VALIDATE(width == img->cmn.width >> att->mip_level, _SG_VALIDATE_PASSDESC_IMAGE_SIZES); + SOKOL_VALIDATE(height == img->cmn.height >> att->mip_level, _SG_VALIDATE_PASSDESC_IMAGE_SIZES); + SOKOL_VALIDATE(sample_count == img->cmn.sample_count, _SG_VALIDATE_PASSDESC_IMAGE_SAMPLE_COUNTS); + } + SOKOL_VALIDATE(_sg_is_valid_rendertarget_color_format(img->cmn.pixel_format), _SG_VALIDATE_PASSDESC_COLOR_INV_PIXELFORMAT); + } + if (desc->depth_stencil_attachment.image.id != SG_INVALID_ID) { + const sg_pass_attachment_desc* att = &desc->depth_stencil_attachment; + const _sg_image_t* img = _sg_lookup_image(&_sg.pools, att->image.id); + SOKOL_ASSERT(img); + SOKOL_VALIDATE(img->slot.state == SG_RESOURCESTATE_VALID, _SG_VALIDATE_PASSDESC_IMAGE); + SOKOL_VALIDATE(att->mip_level < img->cmn.num_mipmaps, _SG_VALIDATE_PASSDESC_MIPLEVEL); + if (img->cmn.type == SG_IMAGETYPE_CUBE) { + SOKOL_VALIDATE(att->slice < 6, _SG_VALIDATE_PASSDESC_FACE); + } + else if (img->cmn.type == SG_IMAGETYPE_ARRAY) { + SOKOL_VALIDATE(att->slice < img->cmn.num_slices, _SG_VALIDATE_PASSDESC_LAYER); + } + else if (img->cmn.type == SG_IMAGETYPE_3D) { + SOKOL_VALIDATE(att->slice < img->cmn.num_slices, _SG_VALIDATE_PASSDESC_SLICE); + } + SOKOL_VALIDATE(img->cmn.render_target, _SG_VALIDATE_PASSDESC_IMAGE_NO_RT); + SOKOL_VALIDATE(width == img->cmn.width >> att->mip_level, _SG_VALIDATE_PASSDESC_IMAGE_SIZES); + SOKOL_VALIDATE(height == img->cmn.height >> att->mip_level, _SG_VALIDATE_PASSDESC_IMAGE_SIZES); + SOKOL_VALIDATE(sample_count == img->cmn.sample_count, _SG_VALIDATE_PASSDESC_IMAGE_SAMPLE_COUNTS); + SOKOL_VALIDATE(_sg_is_valid_rendertarget_depth_format(img->cmn.pixel_format), _SG_VALIDATE_PASSDESC_DEPTH_INV_PIXELFORMAT); + } + return SOKOL_VALIDATE_END(); + #endif +} + +_SOKOL_PRIVATE bool _sg_validate_begin_pass(_sg_pass_t* pass) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(pass); + return true; + #else + SOKOL_VALIDATE_BEGIN(); + SOKOL_VALIDATE(pass->slot.state == SG_RESOURCESTATE_VALID, _SG_VALIDATE_BEGINPASS_PASS); + + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + const _sg_pass_attachment_t* att = &pass->cmn.color_atts[i]; + const _sg_image_t* img = _sg_pass_color_image(pass, i); + if (img) { + SOKOL_VALIDATE(img->slot.state == SG_RESOURCESTATE_VALID, _SG_VALIDATE_BEGINPASS_IMAGE); + SOKOL_VALIDATE(img->slot.id == att->image_id.id, _SG_VALIDATE_BEGINPASS_IMAGE); + } + } + const _sg_image_t* ds_img = _sg_pass_ds_image(pass); + if (ds_img) { + const _sg_pass_attachment_t* att = &pass->cmn.ds_att; + SOKOL_VALIDATE(ds_img->slot.state == SG_RESOURCESTATE_VALID, _SG_VALIDATE_BEGINPASS_IMAGE); + SOKOL_VALIDATE(ds_img->slot.id == att->image_id.id, _SG_VALIDATE_BEGINPASS_IMAGE); + } + return SOKOL_VALIDATE_END(); + #endif +} + +_SOKOL_PRIVATE bool _sg_validate_apply_pipeline(sg_pipeline pip_id) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(pip_id); + return true; + #else + SOKOL_VALIDATE_BEGIN(); + /* the pipeline object must be alive and valid */ + SOKOL_VALIDATE(pip_id.id != SG_INVALID_ID, _SG_VALIDATE_APIP_PIPELINE_VALID_ID); + const _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, pip_id.id); + SOKOL_VALIDATE(pip != 0, _SG_VALIDATE_APIP_PIPELINE_EXISTS); + if (!pip) { + return SOKOL_VALIDATE_END(); + } + SOKOL_VALIDATE(pip->slot.state == SG_RESOURCESTATE_VALID, _SG_VALIDATE_APIP_PIPELINE_VALID); + /* the pipeline's shader must be alive and valid */ + SOKOL_ASSERT(pip->shader); + SOKOL_VALIDATE(pip->shader->slot.id == pip->cmn.shader_id.id, _SG_VALIDATE_APIP_SHADER_EXISTS); + SOKOL_VALIDATE(pip->shader->slot.state == SG_RESOURCESTATE_VALID, _SG_VALIDATE_APIP_SHADER_VALID); + /* check that pipeline attributes match current pass attributes */ + const _sg_pass_t* pass = _sg_lookup_pass(&_sg.pools, _sg.cur_pass.id); + if (pass) { + /* an offscreen pass */ + SOKOL_VALIDATE(pip->cmn.color_attachment_count == pass->cmn.num_color_atts, _SG_VALIDATE_APIP_ATT_COUNT); + for (int i = 0; i < pip->cmn.color_attachment_count; i++) { + const _sg_image_t* att_img = _sg_pass_color_image(pass, i); + SOKOL_VALIDATE(pip->cmn.color_formats[i] == att_img->cmn.pixel_format, _SG_VALIDATE_APIP_COLOR_FORMAT); + SOKOL_VALIDATE(pip->cmn.sample_count == att_img->cmn.sample_count, _SG_VALIDATE_APIP_SAMPLE_COUNT); + } + const _sg_image_t* att_dsimg = _sg_pass_ds_image(pass); + if (att_dsimg) { + SOKOL_VALIDATE(pip->cmn.depth_format == att_dsimg->cmn.pixel_format, _SG_VALIDATE_APIP_DEPTH_FORMAT); + } + else { + SOKOL_VALIDATE(pip->cmn.depth_format == SG_PIXELFORMAT_NONE, _SG_VALIDATE_APIP_DEPTH_FORMAT); + } + } + else { + /* default pass */ + SOKOL_VALIDATE(pip->cmn.color_attachment_count == 1, _SG_VALIDATE_APIP_ATT_COUNT); + SOKOL_VALIDATE(pip->cmn.color_formats[0] == _sg.desc.context.color_format, _SG_VALIDATE_APIP_COLOR_FORMAT); + SOKOL_VALIDATE(pip->cmn.depth_format == _sg.desc.context.depth_format, _SG_VALIDATE_APIP_DEPTH_FORMAT); + SOKOL_VALIDATE(pip->cmn.sample_count == _sg.desc.context.sample_count, _SG_VALIDATE_APIP_SAMPLE_COUNT); + } + return SOKOL_VALIDATE_END(); + #endif +} + +_SOKOL_PRIVATE bool _sg_validate_apply_bindings(const sg_bindings* bindings) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(bindings); + return true; + #else + SOKOL_VALIDATE_BEGIN(); + + /* a pipeline object must have been applied */ + SOKOL_VALIDATE(_sg.cur_pipeline.id != SG_INVALID_ID, _SG_VALIDATE_ABND_PIPELINE); + const _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, _sg.cur_pipeline.id); + SOKOL_VALIDATE(pip != 0, _SG_VALIDATE_ABND_PIPELINE_EXISTS); + if (!pip) { + return SOKOL_VALIDATE_END(); + } + SOKOL_VALIDATE(pip->slot.state == SG_RESOURCESTATE_VALID, _SG_VALIDATE_ABND_PIPELINE_VALID); + SOKOL_ASSERT(pip->shader && (pip->cmn.shader_id.id == pip->shader->slot.id)); + + /* has expected vertex buffers, and vertex buffers still exist */ + for (int i = 0; i < SG_MAX_SHADERSTAGE_BUFFERS; i++) { + if (bindings->vertex_buffers[i].id != SG_INVALID_ID) { + SOKOL_VALIDATE(pip->cmn.vertex_layout_valid[i], _SG_VALIDATE_ABND_VBS); + /* buffers in vertex-buffer-slots must be of type SG_BUFFERTYPE_VERTEXBUFFER */ + const _sg_buffer_t* buf = _sg_lookup_buffer(&_sg.pools, bindings->vertex_buffers[i].id); + SOKOL_VALIDATE(buf != 0, _SG_VALIDATE_ABND_VB_EXISTS); + if (buf && buf->slot.state == SG_RESOURCESTATE_VALID) { + SOKOL_VALIDATE(SG_BUFFERTYPE_VERTEXBUFFER == buf->cmn.type, _SG_VALIDATE_ABND_VB_TYPE); + SOKOL_VALIDATE(!buf->cmn.append_overflow, _SG_VALIDATE_ABND_VB_OVERFLOW); + } + } + else { + /* vertex buffer provided in a slot which has no vertex layout in pipeline */ + SOKOL_VALIDATE(!pip->cmn.vertex_layout_valid[i], _SG_VALIDATE_ABND_VBS); + } + } + + /* index buffer expected or not, and index buffer still exists */ + if (pip->cmn.index_type == SG_INDEXTYPE_NONE) { + /* pipeline defines non-indexed rendering, but index buffer provided */ + SOKOL_VALIDATE(bindings->index_buffer.id == SG_INVALID_ID, _SG_VALIDATE_ABND_IB); + } + else { + /* pipeline defines indexed rendering, but no index buffer provided */ + SOKOL_VALIDATE(bindings->index_buffer.id != SG_INVALID_ID, _SG_VALIDATE_ABND_NO_IB); + } + if (bindings->index_buffer.id != SG_INVALID_ID) { + /* buffer in index-buffer-slot must be of type SG_BUFFERTYPE_INDEXBUFFER */ + const _sg_buffer_t* buf = _sg_lookup_buffer(&_sg.pools, bindings->index_buffer.id); + SOKOL_VALIDATE(buf != 0, _SG_VALIDATE_ABND_IB_EXISTS); + if (buf && buf->slot.state == SG_RESOURCESTATE_VALID) { + SOKOL_VALIDATE(SG_BUFFERTYPE_INDEXBUFFER == buf->cmn.type, _SG_VALIDATE_ABND_IB_TYPE); + SOKOL_VALIDATE(!buf->cmn.append_overflow, _SG_VALIDATE_ABND_IB_OVERFLOW); + } + } + + /* has expected vertex shader images */ + for (int i = 0; i < SG_MAX_SHADERSTAGE_IMAGES; i++) { + _sg_shader_stage_t* stage = &pip->shader->cmn.stage[SG_SHADERSTAGE_VS]; + if (bindings->vs_images[i].id != SG_INVALID_ID) { + SOKOL_VALIDATE(i < stage->num_images, _SG_VALIDATE_ABND_VS_IMGS); + const _sg_image_t* img = _sg_lookup_image(&_sg.pools, bindings->vs_images[i].id); + SOKOL_VALIDATE(img != 0, _SG_VALIDATE_ABND_VS_IMG_EXISTS); + if (img && img->slot.state == SG_RESOURCESTATE_VALID) { + SOKOL_VALIDATE(img->cmn.type == stage->images[i].image_type, _SG_VALIDATE_ABND_VS_IMG_TYPES); + } + } + else { + SOKOL_VALIDATE(i >= stage->num_images, _SG_VALIDATE_ABND_VS_IMGS); + } + } + + /* has expected fragment shader images */ + for (int i = 0; i < SG_MAX_SHADERSTAGE_IMAGES; i++) { + _sg_shader_stage_t* stage = &pip->shader->cmn.stage[SG_SHADERSTAGE_FS]; + if (bindings->fs_images[i].id != SG_INVALID_ID) { + SOKOL_VALIDATE(i < stage->num_images, _SG_VALIDATE_ABND_FS_IMGS); + const _sg_image_t* img = _sg_lookup_image(&_sg.pools, bindings->fs_images[i].id); + SOKOL_VALIDATE(img != 0, _SG_VALIDATE_ABND_FS_IMG_EXISTS); + if (img && img->slot.state == SG_RESOURCESTATE_VALID) { + SOKOL_VALIDATE(img->cmn.type == stage->images[i].image_type, _SG_VALIDATE_ABND_FS_IMG_TYPES); + } + } + else { + SOKOL_VALIDATE(i >= stage->num_images, _SG_VALIDATE_ABND_FS_IMGS); + } + } + return SOKOL_VALIDATE_END(); + #endif +} + +_SOKOL_PRIVATE bool _sg_validate_apply_uniforms(sg_shader_stage stage_index, int ub_index, const sg_range* data) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(stage_index); + _SOKOL_UNUSED(ub_index); + _SOKOL_UNUSED(data); + return true; + #else + SOKOL_ASSERT((stage_index == SG_SHADERSTAGE_VS) || (stage_index == SG_SHADERSTAGE_FS)); + SOKOL_ASSERT((ub_index >= 0) && (ub_index < SG_MAX_SHADERSTAGE_UBS)); + SOKOL_VALIDATE_BEGIN(); + SOKOL_VALIDATE(_sg.cur_pipeline.id != SG_INVALID_ID, _SG_VALIDATE_AUB_NO_PIPELINE); + const _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, _sg.cur_pipeline.id); + SOKOL_ASSERT(pip && (pip->slot.id == _sg.cur_pipeline.id)); + SOKOL_ASSERT(pip->shader && (pip->shader->slot.id == pip->cmn.shader_id.id)); + + /* check that there is a uniform block at 'stage' and 'ub_index' */ + const _sg_shader_stage_t* stage = &pip->shader->cmn.stage[stage_index]; + SOKOL_VALIDATE(ub_index < stage->num_uniform_blocks, _SG_VALIDATE_AUB_NO_UB_AT_SLOT); + + /* check that the provided data size doesn't exceed the uniform block size */ + SOKOL_VALIDATE(data->size <= stage->uniform_blocks[ub_index].size, _SG_VALIDATE_AUB_SIZE); + + return SOKOL_VALIDATE_END(); + #endif +} + +_SOKOL_PRIVATE bool _sg_validate_update_buffer(const _sg_buffer_t* buf, const sg_range* data) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(buf); + _SOKOL_UNUSED(data); + return true; + #else + SOKOL_ASSERT(buf && data && data->ptr); + SOKOL_VALIDATE_BEGIN(); + SOKOL_VALIDATE(buf->cmn.usage != SG_USAGE_IMMUTABLE, _SG_VALIDATE_UPDATEBUF_USAGE); + SOKOL_VALIDATE(buf->cmn.size >= (int)data->size, _SG_VALIDATE_UPDATEBUF_SIZE); + SOKOL_VALIDATE(buf->cmn.update_frame_index != _sg.frame_index, _SG_VALIDATE_UPDATEBUF_ONCE); + SOKOL_VALIDATE(buf->cmn.append_frame_index != _sg.frame_index, _SG_VALIDATE_UPDATEBUF_APPEND); + return SOKOL_VALIDATE_END(); + #endif +} + +_SOKOL_PRIVATE bool _sg_validate_append_buffer(const _sg_buffer_t* buf, const sg_range* data) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(buf); + _SOKOL_UNUSED(data); + return true; + #else + SOKOL_ASSERT(buf && data && data->ptr); + SOKOL_VALIDATE_BEGIN(); + SOKOL_VALIDATE(buf->cmn.usage != SG_USAGE_IMMUTABLE, _SG_VALIDATE_APPENDBUF_USAGE); + SOKOL_VALIDATE(buf->cmn.size >= (buf->cmn.append_pos + (int)data->size), _SG_VALIDATE_APPENDBUF_SIZE); + SOKOL_VALIDATE(buf->cmn.update_frame_index != _sg.frame_index, _SG_VALIDATE_APPENDBUF_UPDATE); + return SOKOL_VALIDATE_END(); + #endif +} + +_SOKOL_PRIVATE bool _sg_validate_update_image(const _sg_image_t* img, const sg_image_data* data) { + #if !defined(SOKOL_DEBUG) + _SOKOL_UNUSED(img); + _SOKOL_UNUSED(data); + return true; + #else + SOKOL_ASSERT(img && data); + SOKOL_VALIDATE_BEGIN(); + SOKOL_VALIDATE(img->cmn.usage != SG_USAGE_IMMUTABLE, _SG_VALIDATE_UPDIMG_USAGE); + SOKOL_VALIDATE(img->cmn.upd_frame_index != _sg.frame_index, _SG_VALIDATE_UPDIMG_ONCE); + _sg_validate_image_data(data, + img->cmn.pixel_format, + img->cmn.width, + img->cmn.height, + (img->cmn.type == SG_IMAGETYPE_CUBE) ? 6 : 1, + img->cmn.num_mipmaps, + img->cmn.num_slices); + return SOKOL_VALIDATE_END(); + #endif +} + +/*== fill in desc default values =============================================*/ +_SOKOL_PRIVATE sg_buffer_desc _sg_buffer_desc_defaults(const sg_buffer_desc* desc) { + sg_buffer_desc def = *desc; + def.type = _sg_def(def.type, SG_BUFFERTYPE_VERTEXBUFFER); + def.usage = _sg_def(def.usage, SG_USAGE_IMMUTABLE); + if (def.size == 0) { + def.size = def.data.size; + } + else if (def.data.size == 0) { + def.data.size = def.size; + } + return def; +} + +_SOKOL_PRIVATE sg_image_desc _sg_image_desc_defaults(const sg_image_desc* desc) { + sg_image_desc def = *desc; + def.type = _sg_def(def.type, SG_IMAGETYPE_2D); + def.num_slices = _sg_def(def.num_slices, 1); + def.num_mipmaps = _sg_def(def.num_mipmaps, 1); + def.usage = _sg_def(def.usage, SG_USAGE_IMMUTABLE); + if (desc->render_target) { + def.pixel_format = _sg_def(def.pixel_format, _sg.desc.context.color_format); + def.sample_count = _sg_def(def.sample_count, _sg.desc.context.sample_count); + } + else { + def.pixel_format = _sg_def(def.pixel_format, SG_PIXELFORMAT_RGBA8); + def.sample_count = _sg_def(def.sample_count, 1); + } + def.min_filter = _sg_def(def.min_filter, SG_FILTER_NEAREST); + def.mag_filter = _sg_def(def.mag_filter, SG_FILTER_NEAREST); + def.wrap_u = _sg_def(def.wrap_u, SG_WRAP_REPEAT); + def.wrap_v = _sg_def(def.wrap_v, SG_WRAP_REPEAT); + def.wrap_w = _sg_def(def.wrap_w, SG_WRAP_REPEAT); + def.border_color = _sg_def(def.border_color, SG_BORDERCOLOR_OPAQUE_BLACK); + def.max_anisotropy = _sg_def(def.max_anisotropy, 1); + def.max_lod = _sg_def_flt(def.max_lod, FLT_MAX); + return def; +} + +_SOKOL_PRIVATE sg_shader_desc _sg_shader_desc_defaults(const sg_shader_desc* desc) { + sg_shader_desc def = *desc; + #if defined(SOKOL_METAL) + def.vs.entry = _sg_def(def.vs.entry, "_main"); + def.fs.entry = _sg_def(def.fs.entry, "_main"); + #else + def.vs.entry = _sg_def(def.vs.entry, "main"); + def.fs.entry = _sg_def(def.fs.entry, "main"); + #endif + #if defined(SOKOL_D3D11) + if (def.vs.source) { + def.vs.d3d11_target = _sg_def(def.vs.d3d11_target, "vs_4_0"); + } + if (def.fs.source) { + def.fs.d3d11_target = _sg_def(def.fs.d3d11_target, "ps_4_0"); + } + #endif + for (int stage_index = 0; stage_index < SG_NUM_SHADER_STAGES; stage_index++) { + sg_shader_stage_desc* stage_desc = (stage_index == SG_SHADERSTAGE_VS)? &def.vs : &def.fs; + for (int ub_index = 0; ub_index < SG_MAX_SHADERSTAGE_UBS; ub_index++) { + sg_shader_uniform_block_desc* ub_desc = &stage_desc->uniform_blocks[ub_index]; + if (0 == ub_desc->size) { + break; + } + ub_desc->layout = _sg_def(ub_desc->layout, SG_UNIFORMLAYOUT_NATIVE); + for (int u_index = 0; u_index < SG_MAX_UB_MEMBERS; u_index++) { + sg_shader_uniform_desc* u_desc = &ub_desc->uniforms[u_index]; + if (u_desc->type == SG_UNIFORMTYPE_INVALID) { + break; + } + u_desc->array_count = _sg_def(u_desc->array_count, 1); + } + } + for (int img_index = 0; img_index < SG_MAX_SHADERSTAGE_IMAGES; img_index++) { + sg_shader_image_desc* img_desc = &stage_desc->images[img_index]; + if (img_desc->image_type == _SG_IMAGETYPE_DEFAULT) { + break; + } + img_desc->sampler_type = _sg_def(img_desc->sampler_type, SG_SAMPLERTYPE_FLOAT); + } + } + return def; +} + +_SOKOL_PRIVATE sg_pipeline_desc _sg_pipeline_desc_defaults(const sg_pipeline_desc* desc) { + sg_pipeline_desc def = *desc; + + def.primitive_type = _sg_def(def.primitive_type, SG_PRIMITIVETYPE_TRIANGLES); + def.index_type = _sg_def(def.index_type, SG_INDEXTYPE_NONE); + def.cull_mode = _sg_def(def.cull_mode, SG_CULLMODE_NONE); + def.face_winding = _sg_def(def.face_winding, SG_FACEWINDING_CW); + def.sample_count = _sg_def(def.sample_count, _sg.desc.context.sample_count); + + def.stencil.front.compare = _sg_def(def.stencil.front.compare, SG_COMPAREFUNC_ALWAYS); + def.stencil.front.fail_op = _sg_def(def.stencil.front.fail_op, SG_STENCILOP_KEEP); + def.stencil.front.depth_fail_op = _sg_def(def.stencil.front.depth_fail_op, SG_STENCILOP_KEEP); + def.stencil.front.pass_op = _sg_def(def.stencil.front.pass_op, SG_STENCILOP_KEEP); + def.stencil.back.compare = _sg_def(def.stencil.back.compare, SG_COMPAREFUNC_ALWAYS); + def.stencil.back.fail_op = _sg_def(def.stencil.back.fail_op, SG_STENCILOP_KEEP); + def.stencil.back.depth_fail_op = _sg_def(def.stencil.back.depth_fail_op, SG_STENCILOP_KEEP); + def.stencil.back.pass_op = _sg_def(def.stencil.back.pass_op, SG_STENCILOP_KEEP); + + def.depth.compare = _sg_def(def.depth.compare, SG_COMPAREFUNC_ALWAYS); + def.depth.pixel_format = _sg_def(def.depth.pixel_format, _sg.desc.context.depth_format); + def.color_count = _sg_def(def.color_count, 1); + if (def.color_count > SG_MAX_COLOR_ATTACHMENTS) { + def.color_count = SG_MAX_COLOR_ATTACHMENTS; + } + for (int i = 0; i < def.color_count; i++) { + sg_color_state* cs = &def.colors[i]; + cs->pixel_format = _sg_def(cs->pixel_format, _sg.desc.context.color_format); + cs->write_mask = _sg_def(cs->write_mask, SG_COLORMASK_RGBA); + sg_blend_state* bs = &def.colors[i].blend; + bs->src_factor_rgb = _sg_def(bs->src_factor_rgb, SG_BLENDFACTOR_ONE); + bs->dst_factor_rgb = _sg_def(bs->dst_factor_rgb, SG_BLENDFACTOR_ZERO); + bs->op_rgb = _sg_def(bs->op_rgb, SG_BLENDOP_ADD); + bs->src_factor_alpha = _sg_def(bs->src_factor_alpha, SG_BLENDFACTOR_ONE); + bs->dst_factor_alpha = _sg_def(bs->dst_factor_alpha, SG_BLENDFACTOR_ZERO); + bs->op_alpha = _sg_def(bs->op_alpha, SG_BLENDOP_ADD); + } + + for (int attr_index = 0; attr_index < SG_MAX_VERTEX_ATTRIBUTES; attr_index++) { + sg_vertex_attr_desc* a_desc = &def.layout.attrs[attr_index]; + if (a_desc->format == SG_VERTEXFORMAT_INVALID) { + break; + } + SOKOL_ASSERT(a_desc->buffer_index < SG_MAX_SHADERSTAGE_BUFFERS); + sg_buffer_layout_desc* b_desc = &def.layout.buffers[a_desc->buffer_index]; + b_desc->step_func = _sg_def(b_desc->step_func, SG_VERTEXSTEP_PER_VERTEX); + b_desc->step_rate = _sg_def(b_desc->step_rate, 1); + } + + /* resolve vertex layout strides and offsets */ + int auto_offset[SG_MAX_SHADERSTAGE_BUFFERS]; + memset(auto_offset, 0, sizeof(auto_offset)); + bool use_auto_offset = true; + for (int attr_index = 0; attr_index < SG_MAX_VERTEX_ATTRIBUTES; attr_index++) { + /* to use computed offsets, *all* attr offsets must be 0 */ + if (def.layout.attrs[attr_index].offset != 0) { + use_auto_offset = false; + } + } + for (int attr_index = 0; attr_index < SG_MAX_VERTEX_ATTRIBUTES; attr_index++) { + sg_vertex_attr_desc* a_desc = &def.layout.attrs[attr_index]; + if (a_desc->format == SG_VERTEXFORMAT_INVALID) { + break; + } + SOKOL_ASSERT(a_desc->buffer_index < SG_MAX_SHADERSTAGE_BUFFERS); + if (use_auto_offset) { + a_desc->offset = auto_offset[a_desc->buffer_index]; + } + auto_offset[a_desc->buffer_index] += _sg_vertexformat_bytesize(a_desc->format); + } + /* compute vertex strides if needed */ + for (int buf_index = 0; buf_index < SG_MAX_SHADERSTAGE_BUFFERS; buf_index++) { + sg_buffer_layout_desc* l_desc = &def.layout.buffers[buf_index]; + if (l_desc->stride == 0) { + l_desc->stride = auto_offset[buf_index]; + } + } + + return def; +} + +_SOKOL_PRIVATE sg_pass_desc _sg_pass_desc_defaults(const sg_pass_desc* desc) { + /* FIXME: no values to replace in sg_pass_desc? */ + sg_pass_desc def = *desc; + return def; +} + +/*== allocate/initialize resource private functions ==========================*/ +_SOKOL_PRIVATE sg_buffer _sg_alloc_buffer(void) { + sg_buffer res; + int slot_index = _sg_pool_alloc_index(&_sg.pools.buffer_pool); + if (_SG_INVALID_SLOT_INDEX != slot_index) { + res.id = _sg_slot_alloc(&_sg.pools.buffer_pool, &_sg.pools.buffers[slot_index].slot, slot_index); + } + else { + /* pool is exhausted */ + res.id = SG_INVALID_ID; + } + return res; +} + +_SOKOL_PRIVATE sg_image _sg_alloc_image(void) { + sg_image res; + int slot_index = _sg_pool_alloc_index(&_sg.pools.image_pool); + if (_SG_INVALID_SLOT_INDEX != slot_index) { + res.id = _sg_slot_alloc(&_sg.pools.image_pool, &_sg.pools.images[slot_index].slot, slot_index); + } + else { + /* pool is exhausted */ + res.id = SG_INVALID_ID; + } + return res; +} + +_SOKOL_PRIVATE sg_shader _sg_alloc_shader(void) { + sg_shader res; + int slot_index = _sg_pool_alloc_index(&_sg.pools.shader_pool); + if (_SG_INVALID_SLOT_INDEX != slot_index) { + res.id = _sg_slot_alloc(&_sg.pools.shader_pool, &_sg.pools.shaders[slot_index].slot, slot_index); + } + else { + /* pool is exhausted */ + res.id = SG_INVALID_ID; + } + return res; +} + +_SOKOL_PRIVATE sg_pipeline _sg_alloc_pipeline(void) { + sg_pipeline res; + int slot_index = _sg_pool_alloc_index(&_sg.pools.pipeline_pool); + if (_SG_INVALID_SLOT_INDEX != slot_index) { + res.id =_sg_slot_alloc(&_sg.pools.pipeline_pool, &_sg.pools.pipelines[slot_index].slot, slot_index); + } + else { + /* pool is exhausted */ + res.id = SG_INVALID_ID; + } + return res; +} + +_SOKOL_PRIVATE sg_pass _sg_alloc_pass(void) { + sg_pass res; + int slot_index = _sg_pool_alloc_index(&_sg.pools.pass_pool); + if (_SG_INVALID_SLOT_INDEX != slot_index) { + res.id = _sg_slot_alloc(&_sg.pools.pass_pool, &_sg.pools.passes[slot_index].slot, slot_index); + } + else { + /* pool is exhausted */ + res.id = SG_INVALID_ID; + } + return res; +} + +_SOKOL_PRIVATE void _sg_dealloc_buffer(sg_buffer buf_id) { + SOKOL_ASSERT(buf_id.id != SG_INVALID_ID); + _sg_buffer_t* buf = _sg_lookup_buffer(&_sg.pools, buf_id.id); + SOKOL_ASSERT(buf && buf->slot.state == SG_RESOURCESTATE_ALLOC); + _sg_reset_slot(&buf->slot); + _sg_pool_free_index(&_sg.pools.buffer_pool, _sg_slot_index(buf_id.id)); +} + +_SOKOL_PRIVATE void _sg_dealloc_image(sg_image img_id) { + SOKOL_ASSERT(img_id.id != SG_INVALID_ID); + _sg_image_t* img = _sg_lookup_image(&_sg.pools, img_id.id); + SOKOL_ASSERT(img && img->slot.state == SG_RESOURCESTATE_ALLOC); + _sg_reset_slot(&img->slot); + _sg_pool_free_index(&_sg.pools.image_pool, _sg_slot_index(img_id.id)); +} + +_SOKOL_PRIVATE void _sg_dealloc_shader(sg_shader shd_id) { + SOKOL_ASSERT(shd_id.id != SG_INVALID_ID); + _sg_shader_t* shd = _sg_lookup_shader(&_sg.pools, shd_id.id); + SOKOL_ASSERT(shd && shd->slot.state == SG_RESOURCESTATE_ALLOC); + _sg_reset_slot(&shd->slot); + _sg_pool_free_index(&_sg.pools.shader_pool, _sg_slot_index(shd_id.id)); +} + +_SOKOL_PRIVATE void _sg_dealloc_pipeline(sg_pipeline pip_id) { + SOKOL_ASSERT(pip_id.id != SG_INVALID_ID); + _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, pip_id.id); + SOKOL_ASSERT(pip && pip->slot.state == SG_RESOURCESTATE_ALLOC); + _sg_reset_slot(&pip->slot); + _sg_pool_free_index(&_sg.pools.pipeline_pool, _sg_slot_index(pip_id.id)); +} + +_SOKOL_PRIVATE void _sg_dealloc_pass(sg_pass pass_id) { + SOKOL_ASSERT(pass_id.id != SG_INVALID_ID); + _sg_pass_t* pass = _sg_lookup_pass(&_sg.pools, pass_id.id); + SOKOL_ASSERT(pass && pass->slot.state == SG_RESOURCESTATE_ALLOC); + _sg_reset_slot(&pass->slot); + _sg_pool_free_index(&_sg.pools.pass_pool, _sg_slot_index(pass_id.id)); +} + +_SOKOL_PRIVATE void _sg_init_buffer(sg_buffer buf_id, const sg_buffer_desc* desc) { + SOKOL_ASSERT(buf_id.id != SG_INVALID_ID && desc); + _sg_buffer_t* buf = _sg_lookup_buffer(&_sg.pools, buf_id.id); + SOKOL_ASSERT(buf && buf->slot.state == SG_RESOURCESTATE_ALLOC); + buf->slot.ctx_id = _sg.active_context.id; + if (_sg_validate_buffer_desc(desc)) { + buf->slot.state = _sg_create_buffer(buf, desc); + } + else { + buf->slot.state = SG_RESOURCESTATE_FAILED; + } + SOKOL_ASSERT((buf->slot.state == SG_RESOURCESTATE_VALID)||(buf->slot.state == SG_RESOURCESTATE_FAILED)); +} + +_SOKOL_PRIVATE void _sg_init_image(sg_image img_id, const sg_image_desc* desc) { + SOKOL_ASSERT(img_id.id != SG_INVALID_ID && desc); + _sg_image_t* img = _sg_lookup_image(&_sg.pools, img_id.id); + SOKOL_ASSERT(img && img->slot.state == SG_RESOURCESTATE_ALLOC); + img->slot.ctx_id = _sg.active_context.id; + if (_sg_validate_image_desc(desc)) { + img->slot.state = _sg_create_image(img, desc); + } + else { + img->slot.state = SG_RESOURCESTATE_FAILED; + } + SOKOL_ASSERT((img->slot.state == SG_RESOURCESTATE_VALID)||(img->slot.state == SG_RESOURCESTATE_FAILED)); +} + +_SOKOL_PRIVATE void _sg_init_shader(sg_shader shd_id, const sg_shader_desc* desc) { + SOKOL_ASSERT(shd_id.id != SG_INVALID_ID && desc); + _sg_shader_t* shd = _sg_lookup_shader(&_sg.pools, shd_id.id); + SOKOL_ASSERT(shd && shd->slot.state == SG_RESOURCESTATE_ALLOC); + shd->slot.ctx_id = _sg.active_context.id; + if (_sg_validate_shader_desc(desc)) { + shd->slot.state = _sg_create_shader(shd, desc); + } + else { + shd->slot.state = SG_RESOURCESTATE_FAILED; + } + SOKOL_ASSERT((shd->slot.state == SG_RESOURCESTATE_VALID)||(shd->slot.state == SG_RESOURCESTATE_FAILED)); +} + +_SOKOL_PRIVATE void _sg_init_pipeline(sg_pipeline pip_id, const sg_pipeline_desc* desc) { + SOKOL_ASSERT(pip_id.id != SG_INVALID_ID && desc); + _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, pip_id.id); + SOKOL_ASSERT(pip && pip->slot.state == SG_RESOURCESTATE_ALLOC); + pip->slot.ctx_id = _sg.active_context.id; + if (_sg_validate_pipeline_desc(desc)) { + _sg_shader_t* shd = _sg_lookup_shader(&_sg.pools, desc->shader.id); + if (shd && (shd->slot.state == SG_RESOURCESTATE_VALID)) { + pip->slot.state = _sg_create_pipeline(pip, shd, desc); + } + else { + pip->slot.state = SG_RESOURCESTATE_FAILED; + } + } + else { + pip->slot.state = SG_RESOURCESTATE_FAILED; + } + SOKOL_ASSERT((pip->slot.state == SG_RESOURCESTATE_VALID)||(pip->slot.state == SG_RESOURCESTATE_FAILED)); +} + +_SOKOL_PRIVATE void _sg_init_pass(sg_pass pass_id, const sg_pass_desc* desc) { + SOKOL_ASSERT(pass_id.id != SG_INVALID_ID && desc); + _sg_pass_t* pass = _sg_lookup_pass(&_sg.pools, pass_id.id); + SOKOL_ASSERT(pass && pass->slot.state == SG_RESOURCESTATE_ALLOC); + pass->slot.ctx_id = _sg.active_context.id; + if (_sg_validate_pass_desc(desc)) { + /* lookup pass attachment image pointers */ + _sg_image_t* att_imgs[SG_MAX_COLOR_ATTACHMENTS + 1]; + for (int i = 0; i < SG_MAX_COLOR_ATTACHMENTS; i++) { + if (desc->color_attachments[i].image.id) { + att_imgs[i] = _sg_lookup_image(&_sg.pools, desc->color_attachments[i].image.id); + /* FIXME: this shouldn't be an assertion, but result in a SG_RESOURCESTATE_FAILED pass */ + SOKOL_ASSERT(att_imgs[i] && att_imgs[i]->slot.state == SG_RESOURCESTATE_VALID); + } + else { + att_imgs[i] = 0; + } + } + const int ds_att_index = SG_MAX_COLOR_ATTACHMENTS; + if (desc->depth_stencil_attachment.image.id) { + att_imgs[ds_att_index] = _sg_lookup_image(&_sg.pools, desc->depth_stencil_attachment.image.id); + /* FIXME: this shouldn't be an assertion, but result in a SG_RESOURCESTATE_FAILED pass */ + SOKOL_ASSERT(att_imgs[ds_att_index] && att_imgs[ds_att_index]->slot.state == SG_RESOURCESTATE_VALID); + } + else { + att_imgs[ds_att_index] = 0; + } + pass->slot.state = _sg_create_pass(pass, att_imgs, desc); + } + else { + pass->slot.state = SG_RESOURCESTATE_FAILED; + } + SOKOL_ASSERT((pass->slot.state == SG_RESOURCESTATE_VALID)||(pass->slot.state == SG_RESOURCESTATE_FAILED)); +} + +_SOKOL_PRIVATE bool _sg_uninit_buffer(sg_buffer buf_id) { + _sg_buffer_t* buf = _sg_lookup_buffer(&_sg.pools, buf_id.id); + if (buf) { + if (buf->slot.ctx_id == _sg.active_context.id) { + _sg_destroy_buffer(buf); + _sg_reset_buffer(buf); + return true; + } + else { + SOKOL_LOG("_sg_uninit_buffer: active context mismatch (must be same as for creation)"); + _SG_TRACE_NOARGS(err_context_mismatch); + } + } + return false; +} + +_SOKOL_PRIVATE bool _sg_uninit_image(sg_image img_id) { + _sg_image_t* img = _sg_lookup_image(&_sg.pools, img_id.id); + if (img) { + if (img->slot.ctx_id == _sg.active_context.id) { + _sg_destroy_image(img); + _sg_reset_image(img); + return true; + } + else { + SOKOL_LOG("_sg_uninit_image: active context mismatch (must be same as for creation)"); + _SG_TRACE_NOARGS(err_context_mismatch); + } + } + return false; +} + +_SOKOL_PRIVATE bool _sg_uninit_shader(sg_shader shd_id) { + _sg_shader_t* shd = _sg_lookup_shader(&_sg.pools, shd_id.id); + if (shd) { + if (shd->slot.ctx_id == _sg.active_context.id) { + _sg_destroy_shader(shd); + _sg_reset_shader(shd); + return true; + } + else { + SOKOL_LOG("_sg_uninit_shader: active context mismatch (must be same as for creation)"); + _SG_TRACE_NOARGS(err_context_mismatch); + } + } + return false; +} + +_SOKOL_PRIVATE bool _sg_uninit_pipeline(sg_pipeline pip_id) { + _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, pip_id.id); + if (pip) { + if (pip->slot.ctx_id == _sg.active_context.id) { + _sg_destroy_pipeline(pip); + _sg_reset_pipeline(pip); + return true; + } + else { + SOKOL_LOG("_sg_uninit_pipeline: active context mismatch (must be same as for creation)"); + _SG_TRACE_NOARGS(err_context_mismatch); + } + } + return false; +} + +_SOKOL_PRIVATE bool _sg_uninit_pass(sg_pass pass_id) { + _sg_pass_t* pass = _sg_lookup_pass(&_sg.pools, pass_id.id); + if (pass) { + if (pass->slot.ctx_id == _sg.active_context.id) { + _sg_destroy_pass(pass); + _sg_reset_pass(pass); + return true; + } + else { + SOKOL_LOG("_sg_uninit_pass: active context mismatch (must be same as for creation)"); + _SG_TRACE_NOARGS(err_context_mismatch); + } + } + return false; +} + +/*== PUBLIC API FUNCTIONS ====================================================*/ + +#if defined(SOKOL_METAL) + // this is ARC compatible + #if defined(__cplusplus) + #define _SG_CLEAR(type, item) { item = (type) { }; } + #else + #define _SG_CLEAR(type, item) { item = (type) { 0 }; } + #endif +#else + #define _SG_CLEAR(type, item) { memset(&item, 0, sizeof(item)); } +#endif + +SOKOL_API_IMPL void sg_setup(const sg_desc* desc) { + SOKOL_ASSERT(desc); + SOKOL_ASSERT((desc->_start_canary == 0) && (desc->_end_canary == 0)); + _SG_CLEAR(_sg_state_t, _sg); + _sg.desc = *desc; + + /* replace zero-init items with their default values + NOTE: on WebGPU, the default color pixel format MUST be provided, + cannot be a default compile-time constant. + */ + #if defined(SOKOL_WGPU) + SOKOL_ASSERT(SG_PIXELFORMAT_NONE != _sg.desc.context.color_format); + #elif defined(SOKOL_METAL) || defined(SOKOL_D3D11) + _sg.desc.context.color_format = _sg_def(_sg.desc.context.color_format, SG_PIXELFORMAT_BGRA8); + #else + _sg.desc.context.color_format = _sg_def(_sg.desc.context.color_format, SG_PIXELFORMAT_RGBA8); + #endif + _sg.desc.context.depth_format = _sg_def(_sg.desc.context.depth_format, SG_PIXELFORMAT_DEPTH_STENCIL); + _sg.desc.context.sample_count = _sg_def(_sg.desc.context.sample_count, 1); + _sg.desc.buffer_pool_size = _sg_def(_sg.desc.buffer_pool_size, _SG_DEFAULT_BUFFER_POOL_SIZE); + _sg.desc.image_pool_size = _sg_def(_sg.desc.image_pool_size, _SG_DEFAULT_IMAGE_POOL_SIZE); + _sg.desc.shader_pool_size = _sg_def(_sg.desc.shader_pool_size, _SG_DEFAULT_SHADER_POOL_SIZE); + _sg.desc.pipeline_pool_size = _sg_def(_sg.desc.pipeline_pool_size, _SG_DEFAULT_PIPELINE_POOL_SIZE); + _sg.desc.pass_pool_size = _sg_def(_sg.desc.pass_pool_size, _SG_DEFAULT_PASS_POOL_SIZE); + _sg.desc.context_pool_size = _sg_def(_sg.desc.context_pool_size, _SG_DEFAULT_CONTEXT_POOL_SIZE); + _sg.desc.uniform_buffer_size = _sg_def(_sg.desc.uniform_buffer_size, _SG_DEFAULT_UB_SIZE); + _sg.desc.staging_buffer_size = _sg_def(_sg.desc.staging_buffer_size, _SG_DEFAULT_STAGING_SIZE); + _sg.desc.sampler_cache_size = _sg_def(_sg.desc.sampler_cache_size, _SG_DEFAULT_SAMPLER_CACHE_CAPACITY); + + _sg_setup_pools(&_sg.pools, &_sg.desc); + _sg.frame_index = 1; + _sg_setup_backend(&_sg.desc); + _sg.valid = true; + sg_setup_context(); +} + +SOKOL_API_IMPL void sg_shutdown(void) { + /* can only delete resources for the currently set context here, if multiple + contexts are used, the app code must take care of properly releasing them + (since only the app code can switch between 3D-API contexts) + */ + if (_sg.active_context.id != SG_INVALID_ID) { + _sg_context_t* ctx = _sg_lookup_context(&_sg.pools, _sg.active_context.id); + if (ctx) { + _sg_destroy_all_resources(&_sg.pools, _sg.active_context.id); + _sg_destroy_context(ctx); + } + } + _sg_discard_backend(); + _sg_discard_pools(&_sg.pools); + _sg.valid = false; +} + +SOKOL_API_IMPL bool sg_isvalid(void) { + return _sg.valid; +} + +SOKOL_API_IMPL sg_desc sg_query_desc(void) { + SOKOL_ASSERT(_sg.valid); + return _sg.desc; +} + +SOKOL_API_IMPL sg_backend sg_query_backend(void) { + SOKOL_ASSERT(_sg.valid); + return _sg.backend; +} + +SOKOL_API_IMPL sg_features sg_query_features(void) { + SOKOL_ASSERT(_sg.valid); + return _sg.features; +} + +SOKOL_API_IMPL sg_limits sg_query_limits(void) { + SOKOL_ASSERT(_sg.valid); + return _sg.limits; +} + +SOKOL_API_IMPL sg_pixelformat_info sg_query_pixelformat(sg_pixel_format fmt) { + SOKOL_ASSERT(_sg.valid); + int fmt_index = (int) fmt; + SOKOL_ASSERT((fmt_index > SG_PIXELFORMAT_NONE) && (fmt_index < _SG_PIXELFORMAT_NUM)); + return _sg.formats[fmt_index]; +} + +SOKOL_API_IMPL sg_context sg_setup_context(void) { + SOKOL_ASSERT(_sg.valid); + sg_context res; + int slot_index = _sg_pool_alloc_index(&_sg.pools.context_pool); + if (_SG_INVALID_SLOT_INDEX != slot_index) { + res.id = _sg_slot_alloc(&_sg.pools.context_pool, &_sg.pools.contexts[slot_index].slot, slot_index); + _sg_context_t* ctx = _sg_context_at(&_sg.pools, res.id); + ctx->slot.state = _sg_create_context(ctx); + SOKOL_ASSERT(ctx->slot.state == SG_RESOURCESTATE_VALID); + _sg_activate_context(ctx); + } + else { + /* pool is exhausted */ + res.id = SG_INVALID_ID; + } + _sg.active_context = res; + return res; +} + +SOKOL_API_IMPL void sg_discard_context(sg_context ctx_id) { + SOKOL_ASSERT(_sg.valid); + _sg_destroy_all_resources(&_sg.pools, ctx_id.id); + _sg_context_t* ctx = _sg_lookup_context(&_sg.pools, ctx_id.id); + if (ctx) { + _sg_destroy_context(ctx); + _sg_reset_context(ctx); + _sg_reset_slot(&ctx->slot); + _sg_pool_free_index(&_sg.pools.context_pool, _sg_slot_index(ctx_id.id)); + } + _sg.active_context.id = SG_INVALID_ID; + _sg_activate_context(0); +} + +SOKOL_API_IMPL void sg_activate_context(sg_context ctx_id) { + SOKOL_ASSERT(_sg.valid); + _sg.active_context = ctx_id; + _sg_context_t* ctx = _sg_lookup_context(&_sg.pools, ctx_id.id); + /* NOTE: ctx can be 0 here if the context is no longer valid */ + _sg_activate_context(ctx); +} + +SOKOL_API_IMPL sg_trace_hooks sg_install_trace_hooks(const sg_trace_hooks* trace_hooks) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(trace_hooks); + _SOKOL_UNUSED(trace_hooks); + #if defined(SOKOL_TRACE_HOOKS) + sg_trace_hooks old_hooks = _sg.hooks; + _sg.hooks = *trace_hooks; + #else + static sg_trace_hooks old_hooks; + SOKOL_LOG("sg_install_trace_hooks() called, but SG_TRACE_HOOKS is not defined!"); + #endif + return old_hooks; +} + +SOKOL_API_IMPL sg_buffer sg_alloc_buffer(void) { + SOKOL_ASSERT(_sg.valid); + sg_buffer res = _sg_alloc_buffer(); + _SG_TRACE_ARGS(alloc_buffer, res); + return res; +} + +SOKOL_API_IMPL sg_image sg_alloc_image(void) { + SOKOL_ASSERT(_sg.valid); + sg_image res = _sg_alloc_image(); + _SG_TRACE_ARGS(alloc_image, res); + return res; +} + +SOKOL_API_IMPL sg_shader sg_alloc_shader(void) { + SOKOL_ASSERT(_sg.valid); + sg_shader res = _sg_alloc_shader(); + _SG_TRACE_ARGS(alloc_shader, res); + return res; +} + +SOKOL_API_IMPL sg_pipeline sg_alloc_pipeline(void) { + SOKOL_ASSERT(_sg.valid); + sg_pipeline res = _sg_alloc_pipeline(); + _SG_TRACE_ARGS(alloc_pipeline, res); + return res; +} + +SOKOL_API_IMPL sg_pass sg_alloc_pass(void) { + SOKOL_ASSERT(_sg.valid); + sg_pass res = _sg_alloc_pass(); + _SG_TRACE_ARGS(alloc_pass, res); + return res; +} + +SOKOL_API_IMPL void sg_dealloc_buffer(sg_buffer buf_id) { + SOKOL_ASSERT(_sg.valid); + _sg_dealloc_buffer(buf_id); + _SG_TRACE_ARGS(dealloc_buffer, buf_id); +} + +SOKOL_API_IMPL void sg_dealloc_image(sg_image img_id) { + SOKOL_ASSERT(_sg.valid); + _sg_dealloc_image(img_id); + _SG_TRACE_ARGS(dealloc_image, img_id); +} + +SOKOL_API_IMPL void sg_dealloc_shader(sg_shader shd_id) { + SOKOL_ASSERT(_sg.valid); + _sg_dealloc_shader(shd_id); + _SG_TRACE_ARGS(dealloc_shader, shd_id); +} + +SOKOL_API_IMPL void sg_dealloc_pipeline(sg_pipeline pip_id) { + SOKOL_ASSERT(_sg.valid); + _sg_dealloc_pipeline(pip_id); + _SG_TRACE_ARGS(dealloc_pipeline, pip_id); +} + +SOKOL_API_IMPL void sg_dealloc_pass(sg_pass pass_id) { + SOKOL_ASSERT(_sg.valid); + _sg_dealloc_pass(pass_id); + _SG_TRACE_ARGS(dealloc_pass, pass_id); +} + +SOKOL_API_IMPL void sg_init_buffer(sg_buffer buf_id, const sg_buffer_desc* desc) { + SOKOL_ASSERT(_sg.valid); + sg_buffer_desc desc_def = _sg_buffer_desc_defaults(desc); + _sg_init_buffer(buf_id, &desc_def); + _SG_TRACE_ARGS(init_buffer, buf_id, &desc_def); +} + +SOKOL_API_IMPL void sg_init_image(sg_image img_id, const sg_image_desc* desc) { + SOKOL_ASSERT(_sg.valid); + sg_image_desc desc_def = _sg_image_desc_defaults(desc); + _sg_init_image(img_id, &desc_def); + _SG_TRACE_ARGS(init_image, img_id, &desc_def); +} + +SOKOL_API_IMPL void sg_init_shader(sg_shader shd_id, const sg_shader_desc* desc) { + SOKOL_ASSERT(_sg.valid); + sg_shader_desc desc_def = _sg_shader_desc_defaults(desc); + _sg_init_shader(shd_id, &desc_def); + _SG_TRACE_ARGS(init_shader, shd_id, &desc_def); +} + +SOKOL_API_IMPL void sg_init_pipeline(sg_pipeline pip_id, const sg_pipeline_desc* desc) { + SOKOL_ASSERT(_sg.valid); + sg_pipeline_desc desc_def = _sg_pipeline_desc_defaults(desc); + _sg_init_pipeline(pip_id, &desc_def); + _SG_TRACE_ARGS(init_pipeline, pip_id, &desc_def); +} + +SOKOL_API_IMPL void sg_init_pass(sg_pass pass_id, const sg_pass_desc* desc) { + SOKOL_ASSERT(_sg.valid); + sg_pass_desc desc_def = _sg_pass_desc_defaults(desc); + _sg_init_pass(pass_id, &desc_def); + _SG_TRACE_ARGS(init_pass, pass_id, &desc_def); +} + +SOKOL_API_IMPL bool sg_uninit_buffer(sg_buffer buf_id) { + SOKOL_ASSERT(_sg.valid); + bool res = _sg_uninit_buffer(buf_id); + _SG_TRACE_ARGS(uninit_buffer, buf_id); + return res; +} + +SOKOL_API_IMPL bool sg_uninit_image(sg_image img_id) { + SOKOL_ASSERT(_sg.valid); + bool res = _sg_uninit_image(img_id); + _SG_TRACE_ARGS(uninit_image, img_id); + return res; +} + +SOKOL_API_IMPL bool sg_uninit_shader(sg_shader shd_id) { + SOKOL_ASSERT(_sg.valid); + bool res = _sg_uninit_shader(shd_id); + _SG_TRACE_ARGS(uninit_shader, shd_id); + return res; +} + +SOKOL_API_IMPL bool sg_uninit_pipeline(sg_pipeline pip_id) { + SOKOL_ASSERT(_sg.valid); + bool res = _sg_uninit_pipeline(pip_id); + _SG_TRACE_ARGS(uninit_pipeline, pip_id); + return res; +} + +SOKOL_API_IMPL bool sg_uninit_pass(sg_pass pass_id) { + SOKOL_ASSERT(_sg.valid); + bool res = _sg_uninit_pass(pass_id); + _SG_TRACE_ARGS(uninit_pass, pass_id); + return res; +} + +/*-- set allocated resource to failed state ----------------------------------*/ +SOKOL_API_IMPL void sg_fail_buffer(sg_buffer buf_id) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(buf_id.id != SG_INVALID_ID); + _sg_buffer_t* buf = _sg_lookup_buffer(&_sg.pools, buf_id.id); + SOKOL_ASSERT(buf && buf->slot.state == SG_RESOURCESTATE_ALLOC); + buf->slot.ctx_id = _sg.active_context.id; + buf->slot.state = SG_RESOURCESTATE_FAILED; + _SG_TRACE_ARGS(fail_buffer, buf_id); +} + +SOKOL_API_IMPL void sg_fail_image(sg_image img_id) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(img_id.id != SG_INVALID_ID); + _sg_image_t* img = _sg_lookup_image(&_sg.pools, img_id.id); + SOKOL_ASSERT(img && img->slot.state == SG_RESOURCESTATE_ALLOC); + img->slot.ctx_id = _sg.active_context.id; + img->slot.state = SG_RESOURCESTATE_FAILED; + _SG_TRACE_ARGS(fail_image, img_id); +} + +SOKOL_API_IMPL void sg_fail_shader(sg_shader shd_id) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(shd_id.id != SG_INVALID_ID); + _sg_shader_t* shd = _sg_lookup_shader(&_sg.pools, shd_id.id); + SOKOL_ASSERT(shd && shd->slot.state == SG_RESOURCESTATE_ALLOC); + shd->slot.ctx_id = _sg.active_context.id; + shd->slot.state = SG_RESOURCESTATE_FAILED; + _SG_TRACE_ARGS(fail_shader, shd_id); +} + +SOKOL_API_IMPL void sg_fail_pipeline(sg_pipeline pip_id) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(pip_id.id != SG_INVALID_ID); + _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, pip_id.id); + SOKOL_ASSERT(pip && pip->slot.state == SG_RESOURCESTATE_ALLOC); + pip->slot.ctx_id = _sg.active_context.id; + pip->slot.state = SG_RESOURCESTATE_FAILED; + _SG_TRACE_ARGS(fail_pipeline, pip_id); +} + +SOKOL_API_IMPL void sg_fail_pass(sg_pass pass_id) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(pass_id.id != SG_INVALID_ID); + _sg_pass_t* pass = _sg_lookup_pass(&_sg.pools, pass_id.id); + SOKOL_ASSERT(pass && pass->slot.state == SG_RESOURCESTATE_ALLOC); + pass->slot.ctx_id = _sg.active_context.id; + pass->slot.state = SG_RESOURCESTATE_FAILED; + _SG_TRACE_ARGS(fail_pass, pass_id); +} + +/*-- get resource state */ +SOKOL_API_IMPL sg_resource_state sg_query_buffer_state(sg_buffer buf_id) { + SOKOL_ASSERT(_sg.valid); + _sg_buffer_t* buf = _sg_lookup_buffer(&_sg.pools, buf_id.id); + sg_resource_state res = buf ? buf->slot.state : SG_RESOURCESTATE_INVALID; + return res; +} + +SOKOL_API_IMPL sg_resource_state sg_query_image_state(sg_image img_id) { + SOKOL_ASSERT(_sg.valid); + _sg_image_t* img = _sg_lookup_image(&_sg.pools, img_id.id); + sg_resource_state res = img ? img->slot.state : SG_RESOURCESTATE_INVALID; + return res; +} + +SOKOL_API_IMPL sg_resource_state sg_query_shader_state(sg_shader shd_id) { + SOKOL_ASSERT(_sg.valid); + _sg_shader_t* shd = _sg_lookup_shader(&_sg.pools, shd_id.id); + sg_resource_state res = shd ? shd->slot.state : SG_RESOURCESTATE_INVALID; + return res; +} + +SOKOL_API_IMPL sg_resource_state sg_query_pipeline_state(sg_pipeline pip_id) { + SOKOL_ASSERT(_sg.valid); + _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, pip_id.id); + sg_resource_state res = pip ? pip->slot.state : SG_RESOURCESTATE_INVALID; + return res; +} + +SOKOL_API_IMPL sg_resource_state sg_query_pass_state(sg_pass pass_id) { + SOKOL_ASSERT(_sg.valid); + _sg_pass_t* pass = _sg_lookup_pass(&_sg.pools, pass_id.id); + sg_resource_state res = pass ? pass->slot.state : SG_RESOURCESTATE_INVALID; + return res; +} + +/*-- allocate and initialize resource ----------------------------------------*/ +SOKOL_API_IMPL sg_buffer sg_make_buffer(const sg_buffer_desc* desc) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(desc); + sg_buffer_desc desc_def = _sg_buffer_desc_defaults(desc); + sg_buffer buf_id = _sg_alloc_buffer(); + if (buf_id.id != SG_INVALID_ID) { + _sg_init_buffer(buf_id, &desc_def); + } + else { + SOKOL_LOG("buffer pool exhausted!"); + _SG_TRACE_NOARGS(err_buffer_pool_exhausted); + } + _SG_TRACE_ARGS(make_buffer, &desc_def, buf_id); + return buf_id; +} + +SOKOL_API_IMPL sg_image sg_make_image(const sg_image_desc* desc) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(desc); + sg_image_desc desc_def = _sg_image_desc_defaults(desc); + sg_image img_id = _sg_alloc_image(); + if (img_id.id != SG_INVALID_ID) { + _sg_init_image(img_id, &desc_def); + } + else { + SOKOL_LOG("image pool exhausted!"); + _SG_TRACE_NOARGS(err_image_pool_exhausted); + } + _SG_TRACE_ARGS(make_image, &desc_def, img_id); + return img_id; +} + +SOKOL_API_IMPL sg_shader sg_make_shader(const sg_shader_desc* desc) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(desc); + sg_shader_desc desc_def = _sg_shader_desc_defaults(desc); + sg_shader shd_id = _sg_alloc_shader(); + if (shd_id.id != SG_INVALID_ID) { + _sg_init_shader(shd_id, &desc_def); + } + else { + SOKOL_LOG("shader pool exhausted!"); + _SG_TRACE_NOARGS(err_shader_pool_exhausted); + } + _SG_TRACE_ARGS(make_shader, &desc_def, shd_id); + return shd_id; +} + +SOKOL_API_IMPL sg_pipeline sg_make_pipeline(const sg_pipeline_desc* desc) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(desc); + sg_pipeline_desc desc_def = _sg_pipeline_desc_defaults(desc); + sg_pipeline pip_id = _sg_alloc_pipeline(); + if (pip_id.id != SG_INVALID_ID) { + _sg_init_pipeline(pip_id, &desc_def); + } + else { + SOKOL_LOG("pipeline pool exhausted!"); + _SG_TRACE_NOARGS(err_pipeline_pool_exhausted); + } + _SG_TRACE_ARGS(make_pipeline, &desc_def, pip_id); + return pip_id; +} + +SOKOL_API_IMPL sg_pass sg_make_pass(const sg_pass_desc* desc) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(desc); + sg_pass_desc desc_def = _sg_pass_desc_defaults(desc); + sg_pass pass_id = _sg_alloc_pass(); + if (pass_id.id != SG_INVALID_ID) { + _sg_init_pass(pass_id, &desc_def); + } + else { + SOKOL_LOG("pass pool exhausted!"); + _SG_TRACE_NOARGS(err_pass_pool_exhausted); + } + _SG_TRACE_ARGS(make_pass, &desc_def, pass_id); + return pass_id; +} + +/*-- destroy resource --------------------------------------------------------*/ +SOKOL_API_IMPL void sg_destroy_buffer(sg_buffer buf_id) { + SOKOL_ASSERT(_sg.valid); + _SG_TRACE_ARGS(destroy_buffer, buf_id); + if (_sg_uninit_buffer(buf_id)) { + _sg_dealloc_buffer(buf_id); + } +} + +SOKOL_API_IMPL void sg_destroy_image(sg_image img_id) { + SOKOL_ASSERT(_sg.valid); + _SG_TRACE_ARGS(destroy_image, img_id); + if (_sg_uninit_image(img_id)) { + _sg_dealloc_image(img_id); + } +} + +SOKOL_API_IMPL void sg_destroy_shader(sg_shader shd_id) { + SOKOL_ASSERT(_sg.valid); + _SG_TRACE_ARGS(destroy_shader, shd_id); + if (_sg_uninit_shader(shd_id)) { + _sg_dealloc_shader(shd_id); + } +} + +SOKOL_API_IMPL void sg_destroy_pipeline(sg_pipeline pip_id) { + SOKOL_ASSERT(_sg.valid); + _SG_TRACE_ARGS(destroy_pipeline, pip_id); + if (_sg_uninit_pipeline(pip_id)) { + _sg_dealloc_pipeline(pip_id); + } +} + +SOKOL_API_IMPL void sg_destroy_pass(sg_pass pass_id) { + SOKOL_ASSERT(_sg.valid); + _SG_TRACE_ARGS(destroy_pass, pass_id); + if (_sg_uninit_pass(pass_id)) { + _sg_dealloc_pass(pass_id); + } +} + +SOKOL_API_IMPL void sg_begin_default_pass(const sg_pass_action* pass_action, int width, int height) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(pass_action); + SOKOL_ASSERT((pass_action->_start_canary == 0) && (pass_action->_end_canary == 0)); + sg_pass_action pa; + _sg_resolve_default_pass_action(pass_action, &pa); + _sg.cur_pass.id = SG_INVALID_ID; + _sg.pass_valid = true; + _sg_begin_pass(0, &pa, width, height); + _SG_TRACE_ARGS(begin_default_pass, pass_action, width, height); +} + +SOKOL_API_IMPL void sg_begin_default_passf(const sg_pass_action* pass_action, float width, float height) { + sg_begin_default_pass(pass_action, (int)width, (int)height); +} + +SOKOL_API_IMPL void sg_begin_pass(sg_pass pass_id, const sg_pass_action* pass_action) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(pass_action); + SOKOL_ASSERT((pass_action->_start_canary == 0) && (pass_action->_end_canary == 0)); + _sg.cur_pass = pass_id; + _sg_pass_t* pass = _sg_lookup_pass(&_sg.pools, pass_id.id); + if (pass && _sg_validate_begin_pass(pass)) { + _sg.pass_valid = true; + sg_pass_action pa; + _sg_resolve_default_pass_action(pass_action, &pa); + const _sg_image_t* img = _sg_pass_color_image(pass, 0); + SOKOL_ASSERT(img); + const int w = img->cmn.width; + const int h = img->cmn.height; + _sg_begin_pass(pass, &pa, w, h); + _SG_TRACE_ARGS(begin_pass, pass_id, pass_action); + } + else { + _sg.pass_valid = false; + _SG_TRACE_NOARGS(err_pass_invalid); + } +} + +SOKOL_API_IMPL void sg_apply_viewport(int x, int y, int width, int height, bool origin_top_left) { + SOKOL_ASSERT(_sg.valid); + if (!_sg.pass_valid) { + _SG_TRACE_NOARGS(err_pass_invalid); + return; + } + _sg_apply_viewport(x, y, width, height, origin_top_left); + _SG_TRACE_ARGS(apply_viewport, x, y, width, height, origin_top_left); +} + +SOKOL_API_IMPL void sg_apply_viewportf(float x, float y, float width, float height, bool origin_top_left) { + sg_apply_viewport((int)x, (int)y, (int)width, (int)height, origin_top_left); +} + +SOKOL_API_IMPL void sg_apply_scissor_rect(int x, int y, int width, int height, bool origin_top_left) { + SOKOL_ASSERT(_sg.valid); + if (!_sg.pass_valid) { + _SG_TRACE_NOARGS(err_pass_invalid); + return; + } + _sg_apply_scissor_rect(x, y, width, height, origin_top_left); + _SG_TRACE_ARGS(apply_scissor_rect, x, y, width, height, origin_top_left); +} + +SOKOL_API_IMPL void sg_apply_scissor_rectf(float x, float y, float width, float height, bool origin_top_left) { + sg_apply_scissor_rect((int)x, (int)y, (int)width, (int)height, origin_top_left); +} + +SOKOL_API_IMPL void sg_apply_pipeline(sg_pipeline pip_id) { + SOKOL_ASSERT(_sg.valid); + _sg.bindings_valid = false; + if (!_sg_validate_apply_pipeline(pip_id)) { + _sg.next_draw_valid = false; + _SG_TRACE_NOARGS(err_draw_invalid); + return; + } + if (!_sg.pass_valid) { + _SG_TRACE_NOARGS(err_pass_invalid); + return; + } + _sg.cur_pipeline = pip_id; + _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, pip_id.id); + SOKOL_ASSERT(pip); + _sg.next_draw_valid = (SG_RESOURCESTATE_VALID == pip->slot.state); + SOKOL_ASSERT(pip->shader && (pip->shader->slot.id == pip->cmn.shader_id.id)); + _sg_apply_pipeline(pip); + _SG_TRACE_ARGS(apply_pipeline, pip_id); +} + +SOKOL_API_IMPL void sg_apply_bindings(const sg_bindings* bindings) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(bindings); + SOKOL_ASSERT((bindings->_start_canary == 0) && (bindings->_end_canary==0)); + if (!_sg_validate_apply_bindings(bindings)) { + _sg.next_draw_valid = false; + _SG_TRACE_NOARGS(err_draw_invalid); + return; + } + _sg.bindings_valid = true; + + _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, _sg.cur_pipeline.id); + SOKOL_ASSERT(pip); + + _sg_buffer_t* vbs[SG_MAX_SHADERSTAGE_BUFFERS] = { 0 }; + int num_vbs = 0; + for (int i = 0; i < SG_MAX_SHADERSTAGE_BUFFERS; i++, num_vbs++) { + if (bindings->vertex_buffers[i].id) { + vbs[i] = _sg_lookup_buffer(&_sg.pools, bindings->vertex_buffers[i].id); + SOKOL_ASSERT(vbs[i]); + _sg.next_draw_valid &= (SG_RESOURCESTATE_VALID == vbs[i]->slot.state); + _sg.next_draw_valid &= !vbs[i]->cmn.append_overflow; + } + else { + break; + } + } + + _sg_buffer_t* ib = 0; + if (bindings->index_buffer.id) { + ib = _sg_lookup_buffer(&_sg.pools, bindings->index_buffer.id); + SOKOL_ASSERT(ib); + _sg.next_draw_valid &= (SG_RESOURCESTATE_VALID == ib->slot.state); + _sg.next_draw_valid &= !ib->cmn.append_overflow; + } + + _sg_image_t* vs_imgs[SG_MAX_SHADERSTAGE_IMAGES] = { 0 }; + int num_vs_imgs = 0; + for (int i = 0; i < SG_MAX_SHADERSTAGE_IMAGES; i++, num_vs_imgs++) { + if (bindings->vs_images[i].id) { + vs_imgs[i] = _sg_lookup_image(&_sg.pools, bindings->vs_images[i].id); + SOKOL_ASSERT(vs_imgs[i]); + _sg.next_draw_valid &= (SG_RESOURCESTATE_VALID == vs_imgs[i]->slot.state); + } + else { + break; + } + } + + _sg_image_t* fs_imgs[SG_MAX_SHADERSTAGE_IMAGES] = { 0 }; + int num_fs_imgs = 0; + for (int i = 0; i < SG_MAX_SHADERSTAGE_IMAGES; i++, num_fs_imgs++) { + if (bindings->fs_images[i].id) { + fs_imgs[i] = _sg_lookup_image(&_sg.pools, bindings->fs_images[i].id); + SOKOL_ASSERT(fs_imgs[i]); + _sg.next_draw_valid &= (SG_RESOURCESTATE_VALID == fs_imgs[i]->slot.state); + } + else { + break; + } + } + if (_sg.next_draw_valid) { + const int* vb_offsets = bindings->vertex_buffer_offsets; + int ib_offset = bindings->index_buffer_offset; + _sg_apply_bindings(pip, vbs, vb_offsets, num_vbs, ib, ib_offset, vs_imgs, num_vs_imgs, fs_imgs, num_fs_imgs); + _SG_TRACE_ARGS(apply_bindings, bindings); + } + else { + _SG_TRACE_NOARGS(err_draw_invalid); + } +} + +SOKOL_API_IMPL void sg_apply_uniforms(sg_shader_stage stage, int ub_index, const sg_range* data) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT((stage == SG_SHADERSTAGE_VS) || (stage == SG_SHADERSTAGE_FS)); + SOKOL_ASSERT((ub_index >= 0) && (ub_index < SG_MAX_SHADERSTAGE_UBS)); + SOKOL_ASSERT(data && data->ptr && (data->size > 0)); + if (!_sg_validate_apply_uniforms(stage, ub_index, data)) { + _sg.next_draw_valid = false; + _SG_TRACE_NOARGS(err_draw_invalid); + return; + } + if (!_sg.pass_valid) { + _SG_TRACE_NOARGS(err_pass_invalid); + return; + } + if (!_sg.next_draw_valid) { + _SG_TRACE_NOARGS(err_draw_invalid); + return; + } + _sg_apply_uniforms(stage, ub_index, data); + _SG_TRACE_ARGS(apply_uniforms, stage, ub_index, data); +} + +SOKOL_API_IMPL void sg_draw(int base_element, int num_elements, int num_instances) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(base_element >= 0); + SOKOL_ASSERT(num_elements >= 0); + SOKOL_ASSERT(num_instances >= 0); + #if defined(SOKOL_DEBUG) + if (!_sg.bindings_valid) { + SOKOL_LOG("attempting to draw without resource bindings"); + } + #endif + if (!_sg.pass_valid) { + _SG_TRACE_NOARGS(err_pass_invalid); + return; + } + if (!_sg.next_draw_valid) { + _SG_TRACE_NOARGS(err_draw_invalid); + return; + } + if (!_sg.bindings_valid) { + _SG_TRACE_NOARGS(err_bindings_invalid); + return; + } + /* attempting to draw with zero elements or instances is not technically an + error, but might be handled as an error in the backend API (e.g. on Metal) + */ + if ((0 == num_elements) || (0 == num_instances)) { + _SG_TRACE_NOARGS(err_draw_invalid); + return; + } + _sg_draw(base_element, num_elements, num_instances); + _SG_TRACE_ARGS(draw, base_element, num_elements, num_instances); +} + +SOKOL_API_IMPL void sg_end_pass(void) { + SOKOL_ASSERT(_sg.valid); + if (!_sg.pass_valid) { + _SG_TRACE_NOARGS(err_pass_invalid); + return; + } + _sg_end_pass(); + _sg.cur_pass.id = SG_INVALID_ID; + _sg.cur_pipeline.id = SG_INVALID_ID; + _sg.pass_valid = false; + _SG_TRACE_NOARGS(end_pass); +} + +SOKOL_API_IMPL void sg_commit(void) { + SOKOL_ASSERT(_sg.valid); + _sg_commit(); + _SG_TRACE_NOARGS(commit); + _sg.frame_index++; +} + +SOKOL_API_IMPL void sg_reset_state_cache(void) { + SOKOL_ASSERT(_sg.valid); + _sg_reset_state_cache(); + _SG_TRACE_NOARGS(reset_state_cache); +} + +SOKOL_API_IMPL void sg_update_buffer(sg_buffer buf_id, const sg_range* data) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(data && data->ptr && (data->size > 0)); + _sg_buffer_t* buf = _sg_lookup_buffer(&_sg.pools, buf_id.id); + if ((data->size > 0) && buf && (buf->slot.state == SG_RESOURCESTATE_VALID)) { + if (_sg_validate_update_buffer(buf, data)) { + SOKOL_ASSERT(data->size <= (size_t)buf->cmn.size); + /* only one update allowed per buffer and frame */ + SOKOL_ASSERT(buf->cmn.update_frame_index != _sg.frame_index); + /* update and append on same buffer in same frame not allowed */ + SOKOL_ASSERT(buf->cmn.append_frame_index != _sg.frame_index); + _sg_update_buffer(buf, data); + buf->cmn.update_frame_index = _sg.frame_index; + } + } + _SG_TRACE_ARGS(update_buffer, buf_id, data); +} + +SOKOL_API_IMPL int sg_append_buffer(sg_buffer buf_id, const sg_range* data) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(data && data->ptr); + _sg_buffer_t* buf = _sg_lookup_buffer(&_sg.pools, buf_id.id); + int result; + if (buf) { + /* rewind append cursor in a new frame */ + if (buf->cmn.append_frame_index != _sg.frame_index) { + buf->cmn.append_pos = 0; + buf->cmn.append_overflow = false; + } + if ((buf->cmn.append_pos + _sg_roundup((int)data->size, 4)) > buf->cmn.size) { + buf->cmn.append_overflow = true; + } + const int start_pos = buf->cmn.append_pos; + if (buf->slot.state == SG_RESOURCESTATE_VALID) { + if (_sg_validate_append_buffer(buf, data)) { + if (!buf->cmn.append_overflow && (data->size > 0)) { + /* update and append on same buffer in same frame not allowed */ + SOKOL_ASSERT(buf->cmn.update_frame_index != _sg.frame_index); + int copied_num_bytes = _sg_append_buffer(buf, data, buf->cmn.append_frame_index != _sg.frame_index); + buf->cmn.append_pos += copied_num_bytes; + buf->cmn.append_frame_index = _sg.frame_index; + } + } + } + result = start_pos; + } + else { + /* FIXME: should we return -1 here? */ + result = 0; + } + _SG_TRACE_ARGS(append_buffer, buf_id, data, result); + return result; +} + +SOKOL_API_IMPL bool sg_query_buffer_overflow(sg_buffer buf_id) { + SOKOL_ASSERT(_sg.valid); + _sg_buffer_t* buf = _sg_lookup_buffer(&_sg.pools, buf_id.id); + bool result = buf ? buf->cmn.append_overflow : false; + return result; +} + +SOKOL_API_IMPL void sg_update_image(sg_image img_id, const sg_image_data* data) { + SOKOL_ASSERT(_sg.valid); + _sg_image_t* img = _sg_lookup_image(&_sg.pools, img_id.id); + if (img && img->slot.state == SG_RESOURCESTATE_VALID) { + if (_sg_validate_update_image(img, data)) { + SOKOL_ASSERT(img->cmn.upd_frame_index != _sg.frame_index); + _sg_update_image(img, data); + img->cmn.upd_frame_index = _sg.frame_index; + } + } + _SG_TRACE_ARGS(update_image, img_id, data); +} + +SOKOL_API_IMPL void sg_push_debug_group(const char* name) { + SOKOL_ASSERT(_sg.valid); + SOKOL_ASSERT(name); + _SOKOL_UNUSED(name); + _SG_TRACE_ARGS(push_debug_group, name); +} + +SOKOL_API_IMPL void sg_pop_debug_group(void) { + SOKOL_ASSERT(_sg.valid); + _SG_TRACE_NOARGS(pop_debug_group); +} + +SOKOL_API_IMPL sg_buffer_info sg_query_buffer_info(sg_buffer buf_id) { + SOKOL_ASSERT(_sg.valid); + sg_buffer_info info; + memset(&info, 0, sizeof(info)); + const _sg_buffer_t* buf = _sg_lookup_buffer(&_sg.pools, buf_id.id); + if (buf) { + info.slot.state = buf->slot.state; + info.slot.res_id = buf->slot.id; + info.slot.ctx_id = buf->slot.ctx_id; + info.update_frame_index = buf->cmn.update_frame_index; + info.append_frame_index = buf->cmn.append_frame_index; + info.append_pos = buf->cmn.append_pos; + info.append_overflow = buf->cmn.append_overflow; + #if defined(SOKOL_D3D11) + info.num_slots = 1; + info.active_slot = 0; + #else + info.num_slots = buf->cmn.num_slots; + info.active_slot = buf->cmn.active_slot; + #endif + } + return info; +} + +SOKOL_API_IMPL sg_image_info sg_query_image_info(sg_image img_id) { + SOKOL_ASSERT(_sg.valid); + sg_image_info info; + memset(&info, 0, sizeof(info)); + const _sg_image_t* img = _sg_lookup_image(&_sg.pools, img_id.id); + if (img) { + info.slot.state = img->slot.state; + info.slot.res_id = img->slot.id; + info.slot.ctx_id = img->slot.ctx_id; + info.upd_frame_index = img->cmn.upd_frame_index; + #if defined(SOKOL_D3D11) + info.num_slots = 1; + info.active_slot = 0; + #else + info.num_slots = img->cmn.num_slots; + info.active_slot = img->cmn.active_slot; + #endif + info.width = img->cmn.width; + info.height = img->cmn.height; + } + return info; +} + +SOKOL_API_IMPL sg_shader_info sg_query_shader_info(sg_shader shd_id) { + SOKOL_ASSERT(_sg.valid); + sg_shader_info info; + memset(&info, 0, sizeof(info)); + const _sg_shader_t* shd = _sg_lookup_shader(&_sg.pools, shd_id.id); + if (shd) { + info.slot.state = shd->slot.state; + info.slot.res_id = shd->slot.id; + info.slot.ctx_id = shd->slot.ctx_id; + } + return info; +} + +SOKOL_API_IMPL sg_pipeline_info sg_query_pipeline_info(sg_pipeline pip_id) { + SOKOL_ASSERT(_sg.valid); + sg_pipeline_info info; + memset(&info, 0, sizeof(info)); + const _sg_pipeline_t* pip = _sg_lookup_pipeline(&_sg.pools, pip_id.id); + if (pip) { + info.slot.state = pip->slot.state; + info.slot.res_id = pip->slot.id; + info.slot.ctx_id = pip->slot.ctx_id; + } + return info; +} + +SOKOL_API_IMPL sg_pass_info sg_query_pass_info(sg_pass pass_id) { + SOKOL_ASSERT(_sg.valid); + sg_pass_info info; + memset(&info, 0, sizeof(info)); + const _sg_pass_t* pass = _sg_lookup_pass(&_sg.pools, pass_id.id); + if (pass) { + info.slot.state = pass->slot.state; + info.slot.res_id = pass->slot.id; + info.slot.ctx_id = pass->slot.ctx_id; + } + return info; +} + +SOKOL_API_IMPL sg_buffer_desc sg_query_buffer_defaults(const sg_buffer_desc* desc) { + SOKOL_ASSERT(_sg.valid && desc); + return _sg_buffer_desc_defaults(desc); +} + +SOKOL_API_IMPL sg_image_desc sg_query_image_defaults(const sg_image_desc* desc) { + SOKOL_ASSERT(_sg.valid && desc); + return _sg_image_desc_defaults(desc); +} + +SOKOL_API_IMPL sg_shader_desc sg_query_shader_defaults(const sg_shader_desc* desc) { + SOKOL_ASSERT(_sg.valid && desc); + return _sg_shader_desc_defaults(desc); +} + +SOKOL_API_IMPL sg_pipeline_desc sg_query_pipeline_defaults(const sg_pipeline_desc* desc) { + SOKOL_ASSERT(_sg.valid && desc); + return _sg_pipeline_desc_defaults(desc); +} + +SOKOL_API_IMPL sg_pass_desc sg_query_pass_defaults(const sg_pass_desc* desc) { + SOKOL_ASSERT(_sg.valid && desc); + return _sg_pass_desc_defaults(desc); +} + +SOKOL_API_IMPL const void* sg_d3d11_device(void) { +#if defined(SOKOL_D3D11) + return (const void*) _sg.d3d11.dev; +#else + return 0; +#endif +} + +SOKOL_API_IMPL const void* sg_mtl_device(void) { +#if defined(SOKOL_METAL) + if (nil != _sg.mtl.device) { + return (__bridge const void*) _sg.mtl.device; + } + else { + return 0; + } +#else + return 0; +#endif +} + +SOKOL_API_IMPL const void* sg_mtl_render_command_encoder(void) { + #if defined(SOKOL_METAL) + if (nil != _sg.mtl.cmd_encoder) { + return (__bridge const void*) _sg.mtl.cmd_encoder; + } + else { + return 0; + } + #else + return 0; + #endif +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#endif /* SOKOL_GFX_IMPL */ diff --git a/modules/ufbx/examples/viewer/external/sokol_glue.h b/modules/ufbx/examples/viewer/external/sokol_glue.h new file mode 100644 index 0000000..74ecb7c --- /dev/null +++ b/modules/ufbx/examples/viewer/external/sokol_glue.h @@ -0,0 +1,137 @@ +#if defined(SOKOL_IMPL) && !defined(SOKOL_GLUE_IMPL) +#define SOKOL_GLUE_IMPL +#endif +#ifndef SOKOL_GLUE_INCLUDED +/* + sokol_glue.h -- glue helper functions for sokol headers + + Project URL: https://github.com/floooh/sokol + + Do this: + #define SOKOL_IMPL or + #define SOKOL_GLUE_IMPL + before you include this file in *one* C or C++ file to create the + implementation. + + ...optionally provide the following macros to override defaults: + + SOKOL_ASSERT(c) - your own assert macro (default: assert(c)) + SOKOL_GLUE_API_DECL - public function declaration prefix (default: extern) + SOKOL_API_DECL - same as SOKOL_GLUE_API_DECL + SOKOL_API_IMPL - public function implementation prefix (default: -) + + If sokol_glue.h is compiled as a DLL, define the following before + including the declaration or implementation: + + SOKOL_DLL + + On Windows, SOKOL_DLL will define SOKOL_GLUE_API_DECL as __declspec(dllexport) + or __declspec(dllimport) as needed. + + OVERVIEW + ======== + The sokol core headers should not depend on each other, but sometimes + it's useful to have a set of helper functions as "glue" between + two or more sokol headers. + + This is what sokol_glue.h is for. Simply include the header after other + sokol headers (both for the implementation and declaration), and + depending on what headers have been included before, sokol_glue.h + will make available "glue functions". + + PROVIDED FUNCTIONS + ================== + + - if sokol_app.h and sokol_gfx.h is included: + + sg_context_desc sapp_sgcontext(void): + + Returns an initialized sg_context_desc function initialized + by calling sokol_app.h functions. + + LICENSE + ======= + zlib/libpng license + + Copyright (c) 2018 Andre Weissflog + + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the + use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ +#define SOKOL_GLUE_INCLUDED + +#if defined(SOKOL_API_DECL) && !defined(SOKOL_GLUE_API_DECL) +#define SOKOL_GLUE_API_DECL SOKOL_API_DECL +#endif +#ifndef SOKOL_GLUE_API_DECL +#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_GLUE_IMPL) +#define SOKOL_GLUE_API_DECL __declspec(dllexport) +#elif defined(_WIN32) && defined(SOKOL_DLL) +#define SOKOL_GLUE_API_DECL __declspec(dllimport) +#else +#define SOKOL_GLUE_API_DECL extern +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(SOKOL_GFX_INCLUDED) && defined(SOKOL_APP_INCLUDED) +SOKOL_GLUE_API_DECL sg_context_desc sapp_sgcontext(void); +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif +#endif /* SOKOL_GLUE_INCLUDED */ + +/*-- IMPLEMENTATION ----------------------------------------------------------*/ +#ifdef SOKOL_GLUE_IMPL +#define SOKOL_GLUE_IMPL_INCLUDED (1) +#include /* memset */ + +#ifndef SOKOL_API_IMPL + #define SOKOL_API_IMPL +#endif + +#if defined(SOKOL_GFX_INCLUDED) && defined(SOKOL_APP_INCLUDED) +SOKOL_API_IMPL sg_context_desc sapp_sgcontext(void) { + sg_context_desc desc; + memset(&desc, 0, sizeof(desc)); + desc.color_format = (sg_pixel_format) sapp_color_format(); + desc.depth_format = (sg_pixel_format) sapp_depth_format(); + desc.sample_count = sapp_sample_count(); + desc.gl.force_gles2 = sapp_gles2(); + desc.metal.device = sapp_metal_get_device(); + desc.metal.renderpass_descriptor_cb = sapp_metal_get_renderpass_descriptor; + desc.metal.drawable_cb = sapp_metal_get_drawable; + desc.d3d11.device = sapp_d3d11_get_device(); + desc.d3d11.device_context = sapp_d3d11_get_device_context(); + desc.d3d11.render_target_view_cb = sapp_d3d11_get_render_target_view; + desc.d3d11.depth_stencil_view_cb = sapp_d3d11_get_depth_stencil_view; + desc.wgpu.device = sapp_wgpu_get_device(); + desc.wgpu.render_view_cb = sapp_wgpu_get_render_view; + desc.wgpu.resolve_view_cb = sapp_wgpu_get_resolve_view; + desc.wgpu.depth_stencil_view_cb = sapp_wgpu_get_depth_stencil_view; + return desc; +} +#endif + +#endif /* SOKOL_GLUE_IMPL */ diff --git a/modules/ufbx/examples/viewer/external/sokol_time.h b/modules/ufbx/examples/viewer/external/sokol_time.h new file mode 100644 index 0000000..ba4651a --- /dev/null +++ b/modules/ufbx/examples/viewer/external/sokol_time.h @@ -0,0 +1,323 @@ +#if defined(SOKOL_IMPL) && !defined(SOKOL_TIME_IMPL) +#define SOKOL_TIME_IMPL +#endif +#ifndef SOKOL_TIME_INCLUDED +/* + sokol_time.h -- simple cross-platform time measurement + + Project URL: https://github.com/floooh/sokol + + Do this: + #define SOKOL_IMPL or + #define SOKOL_TIME_IMPL + before you include this file in *one* C or C++ file to create the + implementation. + + Optionally provide the following defines with your own implementations: + SOKOL_ASSERT(c) - your own assert macro (default: assert(c)) + SOKOL_TIME_API_DECL - public function declaration prefix (default: extern) + SOKOL_API_DECL - same as SOKOL_TIME_API_DECL + SOKOL_API_IMPL - public function implementation prefix (default: -) + + If sokol_time.h is compiled as a DLL, define the following before + including the declaration or implementation: + + SOKOL_DLL + + On Windows, SOKOL_DLL will define SOKOL_TIME_API_DECL as __declspec(dllexport) + or __declspec(dllimport) as needed. + + void stm_setup(); + Call once before any other functions to initialize sokol_time + (this calls for instance QueryPerformanceFrequency on Windows) + + uint64_t stm_now(); + Get current point in time in unspecified 'ticks'. The value that + is returned has no relation to the 'wall-clock' time and is + not in a specific time unit, it is only useful to compute + time differences. + + uint64_t stm_diff(uint64_t new, uint64_t old); + Computes the time difference between new and old. This will always + return a positive, non-zero value. + + uint64_t stm_since(uint64_t start); + Takes the current time, and returns the elapsed time since start + (this is a shortcut for "stm_diff(stm_now(), start)") + + uint64_t stm_laptime(uint64_t* last_time); + This is useful for measuring frame time and other recurring + events. It takes the current time, returns the time difference + to the value in last_time, and stores the current time in + last_time for the next call. If the value in last_time is 0, + the return value will be zero (this usually happens on the + very first call). + + uint64_t stm_round_to_common_refresh_rate(uint64_t duration) + This oddly named function takes a measured frame time and + returns the closest "nearby" common display refresh rate frame duration + in ticks. If the input duration isn't close to any common display + refresh rate, the input duration will be returned unchanged as a fallback. + The main purpose of this function is to remove jitter/inaccuracies from + measured frame times, and instead use the display refresh rate as + frame duration. + + Use the following functions to convert a duration in ticks into + useful time units: + + double stm_sec(uint64_t ticks); + double stm_ms(uint64_t ticks); + double stm_us(uint64_t ticks); + double stm_ns(uint64_t ticks); + Converts a tick value into seconds, milliseconds, microseconds + or nanoseconds. Note that not all platforms will have nanosecond + or even microsecond precision. + + Uses the following time measurement functions under the hood: + + Windows: QueryPerformanceFrequency() / QueryPerformanceCounter() + MacOS/iOS: mach_absolute_time() + emscripten: performance.now() + Linux+others: clock_gettime(CLOCK_MONOTONIC) + + zlib/libpng license + + Copyright (c) 2018 Andre Weissflog + + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the + use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ +#define SOKOL_TIME_INCLUDED (1) +#include + +#if defined(SOKOL_API_DECL) && !defined(SOKOL_TIME_API_DECL) +#define SOKOL_TIME_API_DECL SOKOL_API_DECL +#endif +#ifndef SOKOL_TIME_API_DECL +#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_TIME_IMPL) +#define SOKOL_TIME_API_DECL __declspec(dllexport) +#elif defined(_WIN32) && defined(SOKOL_DLL) +#define SOKOL_TIME_API_DECL __declspec(dllimport) +#else +#define SOKOL_TIME_API_DECL extern +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +SOKOL_TIME_API_DECL void stm_setup(void); +SOKOL_TIME_API_DECL uint64_t stm_now(void); +SOKOL_TIME_API_DECL uint64_t stm_diff(uint64_t new_ticks, uint64_t old_ticks); +SOKOL_TIME_API_DECL uint64_t stm_since(uint64_t start_ticks); +SOKOL_TIME_API_DECL uint64_t stm_laptime(uint64_t* last_time); +SOKOL_TIME_API_DECL uint64_t stm_round_to_common_refresh_rate(uint64_t frame_ticks); +SOKOL_TIME_API_DECL double stm_sec(uint64_t ticks); +SOKOL_TIME_API_DECL double stm_ms(uint64_t ticks); +SOKOL_TIME_API_DECL double stm_us(uint64_t ticks); +SOKOL_TIME_API_DECL double stm_ns(uint64_t ticks); + +#ifdef __cplusplus +} /* extern "C" */ +#endif +#endif // SOKOL_TIME_INCLUDED + +/*-- IMPLEMENTATION ----------------------------------------------------------*/ +#ifdef SOKOL_TIME_IMPL +#define SOKOL_TIME_IMPL_INCLUDED (1) +#include /* memset */ + +#ifndef SOKOL_API_IMPL + #define SOKOL_API_IMPL +#endif +#ifndef SOKOL_ASSERT + #include + #define SOKOL_ASSERT(c) assert(c) +#endif +#ifndef _SOKOL_PRIVATE + #if defined(__GNUC__) || defined(__clang__) + #define _SOKOL_PRIVATE __attribute__((unused)) static + #else + #define _SOKOL_PRIVATE static + #endif +#endif + +#if defined(_WIN32) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +typedef struct { + uint32_t initialized; + LARGE_INTEGER freq; + LARGE_INTEGER start; +} _stm_state_t; +#elif defined(__APPLE__) && defined(__MACH__) +#include +typedef struct { + uint32_t initialized; + mach_timebase_info_data_t timebase; + uint64_t start; +} _stm_state_t; +#elif defined(__EMSCRIPTEN__) +#include +typedef struct { + uint32_t initialized; + double start; +} _stm_state_t; +#else /* anything else, this will need more care for non-Linux platforms */ +#ifdef ESP8266 +// On the ESP8266, clock_gettime ignores the first argument and CLOCK_MONOTONIC isn't defined +#define CLOCK_MONOTONIC 0 +#endif +#include +typedef struct { + uint32_t initialized; + uint64_t start; +} _stm_state_t; +#endif +static _stm_state_t _stm; + +/* prevent 64-bit overflow when computing relative timestamp + see https://gist.github.com/jspohr/3dc4f00033d79ec5bdaf67bc46c813e3 +*/ +#if defined(_WIN32) || (defined(__APPLE__) && defined(__MACH__)) +_SOKOL_PRIVATE int64_t int64_muldiv(int64_t value, int64_t numer, int64_t denom) { + int64_t q = value / denom; + int64_t r = value % denom; + return q * numer + r * numer / denom; +} +#endif + +#if defined(__EMSCRIPTEN__) +EM_JS(double, stm_js_perfnow, (void), { + return performance.now(); +}); +#endif + +SOKOL_API_IMPL void stm_setup(void) { + memset(&_stm, 0, sizeof(_stm)); + _stm.initialized = 0xABCDABCD; + #if defined(_WIN32) + QueryPerformanceFrequency(&_stm.freq); + QueryPerformanceCounter(&_stm.start); + #elif defined(__APPLE__) && defined(__MACH__) + mach_timebase_info(&_stm.timebase); + _stm.start = mach_absolute_time(); + #elif defined(__EMSCRIPTEN__) + _stm.start = stm_js_perfnow(); + #else + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + _stm.start = (uint64_t)ts.tv_sec*1000000000 + (uint64_t)ts.tv_nsec; + #endif +} + +SOKOL_API_IMPL uint64_t stm_now(void) { + SOKOL_ASSERT(_stm.initialized == 0xABCDABCD); + uint64_t now; + #if defined(_WIN32) + LARGE_INTEGER qpc_t; + QueryPerformanceCounter(&qpc_t); + now = (uint64_t) int64_muldiv(qpc_t.QuadPart - _stm.start.QuadPart, 1000000000, _stm.freq.QuadPart); + #elif defined(__APPLE__) && defined(__MACH__) + const uint64_t mach_now = mach_absolute_time() - _stm.start; + now = (uint64_t) int64_muldiv((int64_t)mach_now, (int64_t)_stm.timebase.numer, (int64_t)_stm.timebase.denom); + #elif defined(__EMSCRIPTEN__) + double js_now = stm_js_perfnow() - _stm.start; + SOKOL_ASSERT(js_now >= 0.0); + now = (uint64_t) (js_now * 1000000.0); + #else + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + now = ((uint64_t)ts.tv_sec*1000000000 + (uint64_t)ts.tv_nsec) - _stm.start; + #endif + return now; +} + +SOKOL_API_IMPL uint64_t stm_diff(uint64_t new_ticks, uint64_t old_ticks) { + if (new_ticks > old_ticks) { + return new_ticks - old_ticks; + } + else { + return 1; + } +} + +SOKOL_API_IMPL uint64_t stm_since(uint64_t start_ticks) { + return stm_diff(stm_now(), start_ticks); +} + +SOKOL_API_IMPL uint64_t stm_laptime(uint64_t* last_time) { + SOKOL_ASSERT(last_time); + uint64_t dt = 0; + uint64_t now = stm_now(); + if (0 != *last_time) { + dt = stm_diff(now, *last_time); + } + *last_time = now; + return dt; +} + +// first number is frame duration in ns, second number is tolerance in ns, +// the resulting min/max values must not overlap! +static const uint64_t _stm_refresh_rates[][2] = { + { 16666667, 1000000 }, // 60 Hz: 16.6667 +- 1ms + { 13888889, 250000 }, // 72 Hz: 13.8889 +- 0.25ms + { 13333333, 250000 }, // 75 Hz: 13.3333 +- 0.25ms + { 11764706, 250000 }, // 85 Hz: 11.7647 +- 0.25 + { 11111111, 250000 }, // 90 Hz: 11.1111 +- 0.25ms + { 10000000, 500000 }, // 100 Hz: 10.0000 +- 0.5ms + { 8333333, 500000 }, // 120 Hz: 8.3333 +- 0.5ms + { 6944445, 500000 }, // 144 Hz: 6.9445 +- 0.5ms + { 4166667, 1000000 }, // 240 Hz: 4.1666 +- 1ms + { 0, 0 }, // keep the last element always at zero +}; + +SOKOL_API_IMPL uint64_t stm_round_to_common_refresh_rate(uint64_t ticks) { + uint64_t ns; + int i = 0; + while (0 != (ns = _stm_refresh_rates[i][0])) { + uint64_t tol = _stm_refresh_rates[i][1]; + if ((ticks > (ns - tol)) && (ticks < (ns + tol))) { + return ns; + } + i++; + } + // fallthough: didn't fit into any buckets + return ticks; +} + +SOKOL_API_IMPL double stm_sec(uint64_t ticks) { + return (double)ticks / 1000000000.0; +} + +SOKOL_API_IMPL double stm_ms(uint64_t ticks) { + return (double)ticks / 1000000.0; +} + +SOKOL_API_IMPL double stm_us(uint64_t ticks) { + return (double)ticks / 1000.0; +} + +SOKOL_API_IMPL double stm_ns(uint64_t ticks) { + return (double)ticks; +} +#endif /* SOKOL_TIME_IMPL */ diff --git a/modules/ufbx/examples/viewer/external/umath.h b/modules/ufbx/examples/viewer/external/umath.h new file mode 100644 index 0000000..dba47d7 --- /dev/null +++ b/modules/ufbx/examples/viewer/external/umath.h @@ -0,0 +1,658 @@ +#ifndef UMATH_H_INCLUDED +#define UMATH_H_INCLUDED + +#include +#include +#include + +#if defined(_MSC_VER) + #pragma warning(push) + #pragma warning(disable: 4201) +#endif + +#define um_inline static inline + +#if defined(__cplusplus) + #define um_abi extern "C" +#else + #define um_abi +#endif + +typedef struct um_vec2 { + union { + struct { float x, y; }; + struct { float v[2]; }; + }; +} um_vec2; + +typedef struct um_vec3 { + union { + struct { float x, y, z; }; + struct { um_vec2 xy; }; + struct { float v[3]; }; + }; +} um_vec3; + +typedef struct um_vec4 { + union { + struct { float x, y, z, w; }; + struct { um_vec3 xyz; }; + struct { um_vec2 xy; }; + struct { float v[4]; }; + }; +} um_vec4; + +typedef struct um_quat { + union { + struct { float x, y, z, w; }; + struct { um_vec4 xyzw; }; + struct { um_vec3 xyz; }; + struct { float v[4]; }; + }; +} um_quat; + +typedef struct um_mat { + union { + struct { float m[16]; }; + struct { um_vec4 cols[4]; }; + struct { float m11, m21, m31, m41, m12, m22, m32, m42, m13, m23, m33, m43, m14, m24, m34, m44; }; + }; +} um_mat; + +#define UM_PI (3.14159265358979323846f) +#define UM_2PI (6.28318530717958647692f) +#define UM_RCP_PI (1.0f / 3.14159265358979323846f) +#define UM_RCP_2PI (1.0f / 6.28318530717958647692f) +#define UM_RAD_TO_DEG (180.0f / UM_PI) +#define UM_DEG_TO_RAD (UM_PI / 180.0f) + +#if defined(__cplusplus__) + #define um_new(type) type +#else + #define um_new(type) (type) +#endif + +#define um_v2(x, y) (um_new(um_vec2){{{ (x), (y) }}}) +#define um_v3(x, y, z) (um_new(um_vec3){{{ (x), (y), (z) }}}) +#define um_v4(x, y, z, w) (um_new(um_vec4){{{ (x), (y), (z), (w) }}}) + +#define um_quat_xyzw(x, y, z, w) (um_new(um_quat){{{ (x), (y), (z), (w) }}}) + +#define um_mat_rows(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44, ...) \ + (um_new(um_mat){{{ \ + (m11), (m21), (m31), (m41), \ + (m12), (m22), (m32), (m42), \ + (m13), (m23), (m33), (m43), \ + (m14), (m24), (m34), (m44), }} __VA_ARGS__ }) + +#define um_mat_cols(m11, m21, m31, m41, m12, m22, m32, m42, m13, m23, m33, m43, m14, m24, m34, m44, ...) \ + (um_new(um_mat){{{ \ + (m11), (m21), (m31), (m41), \ + (m12), (m22), (m32), (m42), \ + (m13), (m23), (m33), (m43), \ + (m14), (m24), (m34), (m44), }} __VA_ARGS__ }) + +#define um_zero2 (um_v2(0, 0)) +#define um_zero3 (um_v3(0, 0, 0)) +#define um_zero4 (um_v4(0, 0, 0, 0)) + +#define um_one2 (um_v2(1, 1)) +#define um_one3 (um_v3(1, 1, 1)) +#define um_one4 (um_v4(1, 1, 1, 1)) + +#define um_quat_identity um_quat_xyzw(0, 0, 0, 1) + +extern const um_mat um_mat_identity; + +um_inline float um_sqrt(float a) { return sqrtf(a); } +um_inline float um_abs(float a) { return fabsf(a); } +um_inline float um_min(float a, float b) { return a < b ? a : b; } +um_inline float um_max(float a, float b) { return b < a ? a : b; } +um_inline float um_clamp(float a, float minv, float maxv) { return um_min(um_max(a, minv), maxv); } +um_inline float um_lerp(float a, float b, float t) { return a*(1.0f-t) + b*t; } + +um_inline float um_smoothstep(float a) { return a * a * (3.0f - 2.0f * a); } + +um_inline um_vec2 um_dup2(float a) { return um_v2(a, a); } +um_inline um_vec2 um_add2(um_vec2 a, um_vec2 b) { return um_v2(a.x + b.x, a.y + b.y); } +um_inline um_vec2 um_sub2(um_vec2 a, um_vec2 b) { return um_v2(a.x - b.x, a.y - b.y); } +um_inline um_vec2 um_mul2(um_vec2 a, float b) { return um_v2(a.x * b, a.y * b); } +um_inline um_vec2 um_div2(um_vec2 a, float b) { float v = 1.0f / b; return um_v2(a.x * v, a.y * v); } +um_inline um_vec2 um_mad2(um_vec2 a, um_vec2 b, float c) { return um_v2(a.x + b.x*c, a.y + b.y*c); } +um_inline um_vec2 um_neg2(um_vec2 a) { return um_v2(-a.x, -a.y); } +um_inline um_vec2 um_rcp2(um_vec2 a) { return um_v2(1.0f / a.x, 1.0f / a.y); } +um_inline um_vec2 um_mulv2(um_vec2 a, um_vec2 b) { return um_v2(a.x * b.x, a.y * b.y); } +um_inline um_vec2 um_divv2(um_vec2 a, um_vec2 b) { return um_v2(a.x / b.x, a.y / b.y); } +um_inline float um_dot2(um_vec2 a, um_vec2 b) { return a.x*b.x + a.y*b.y; } +um_inline float um_length2(um_vec2 a) { return um_sqrt(a.x*a.x + a.y*a.y); } +um_inline um_vec2 um_min2(um_vec2 a, um_vec2 b) { return um_v2(um_min(a.x, b.x), um_min(a.y, b.y)); } +um_inline um_vec2 um_max2(um_vec2 a, um_vec2 b) { return um_v2(um_max(a.x, b.x), um_max(a.y, b.y)); } +um_inline um_vec2 um_clamp2(um_vec2 a, um_vec2 minv, um_vec2 maxv) { return um_v2(um_clamp(a.x, minv.x, maxv.x), um_clamp(a.y, minv.y, maxv.y)); } +um_inline um_vec2 um_lerp2(um_vec2 a, um_vec2 b, float t) { return um_v2(um_lerp(a.x, b.x, t), um_lerp(a.y, b.y, t)); } +um_inline um_vec2 um_normalize2(um_vec2 a) { float v = um_length2(a); v = v >= FLT_MIN ? 1.0f / v : 0.0f; return um_v2(a.x * v, a.y * v); } +um_inline bool um_equal2(um_vec2 a, um_vec2 b) { return (a.x == b.x) & (a.y == b.y); } + +um_inline um_vec3 um_dup3(float a) { return um_v3(a, a, a); } +um_inline um_vec3 um_add3(um_vec3 a, um_vec3 b) { return um_v3(a.x + b.x, a.y + b.y, a.z + b.z); } +um_inline um_vec3 um_sub3(um_vec3 a, um_vec3 b) { return um_v3(a.x - b.x, a.y - b.y, a.z - b.z); } +um_inline um_vec3 um_mul3(um_vec3 a, float b) { return um_v3(a.x * b, a.y * b, a.z * b); } +um_inline um_vec3 um_div3(um_vec3 a, float b) { float v = 1.0f / b; return um_v3(a.x * v, a.y * v, a.z * v); } +um_inline um_vec3 um_mad3(um_vec3 a, um_vec3 b, float c) { return um_v3(a.x + b.x*c, a.y + b.y*c, a.z + b.z*c); } +um_inline um_vec3 um_neg3(um_vec3 a) { return um_v3(-a.x, -a.y, -a.z); } +um_inline um_vec3 um_rcp3(um_vec3 a) { return um_v3(1.0f / a.x, 1.0f / a.y, 1.0f / a.z); } +um_inline um_vec3 um_mulv3(um_vec3 a, um_vec3 b) { return um_v3(a.x * b.x, a.y * b.y, a.z * b.z); } +um_inline um_vec3 um_divv3(um_vec3 a, um_vec3 b) { return um_v3(a.x / b.x, a.y / b.y, a.z / b.z); } +um_inline float um_dot3(um_vec3 a, um_vec3 b) { return a.x*b.x + a.y*b.y + a.z*b.z; } +um_inline float um_length3(um_vec3 a) { return um_sqrt(a.x*a.x + a.y*a.y + a.z*a.z); } +um_inline um_vec3 um_min3(um_vec3 a, um_vec3 b) { return um_v3(um_min(a.x, b.x), um_min(a.y, b.y), um_min(a.z, b.z)); } +um_inline um_vec3 um_max3(um_vec3 a, um_vec3 b) { return um_v3(um_max(a.x, b.x), um_max(a.y, b.y), um_max(a.z, b.z)); } +um_inline um_vec3 um_clamp3(um_vec3 a, um_vec3 minv, um_vec3 maxv) { return um_v3(um_clamp(a.x, minv.x, maxv.x), um_clamp(a.y, minv.y, maxv.y), um_clamp(a.z, minv.z, maxv.z)); } +um_inline um_vec3 um_lerp3(um_vec3 a, um_vec3 b, float t) { return um_v3(um_lerp(a.x, b.x, t), um_lerp(a.y, b.y, t), um_lerp(a.z, b.z, t)); } +um_inline um_vec3 um_normalize3(um_vec3 a) { float v = um_length3(a); v = v >= FLT_MIN ? 1.0f / v : 0.0f; return um_v3(a.x * v, a.y * v, a.z * v); } +um_inline um_vec3 um_cross3(um_vec3 a, um_vec3 b) { return um_v3(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x); } +um_inline bool um_equal3(um_vec3 a, um_vec3 b) { return (a.x == b.x) & (a.y == b.y) & (a.z == b.z); } + +um_inline um_vec4 um_dup4(float a) { return um_v4(a, a, a, a); } +um_inline um_vec4 um_add4(um_vec4 a, um_vec4 b) { return um_v4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); } +um_inline um_vec4 um_sub4(um_vec4 a, um_vec4 b) { return um_v4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); } +um_inline um_vec4 um_mul4(um_vec4 a, float b) { return um_v4(a.x * b, a.y * b, a.z * b, a.w * b); } +um_inline um_vec4 um_div4(um_vec4 a, float b) { float v = 1.0f / b; return um_v4(a.x * v, a.y * v, a.z * v, a.w * v); } +um_inline um_vec4 um_mad4(um_vec4 a, um_vec4 b, float c) { return um_v4(a.x + b.x*c, a.y + b.y*c, a.z + b.z*c, a.w + b.w*c); } +um_inline um_vec4 um_neg4(um_vec4 a) { return um_v4(-a.x, -a.y, -a.z, -a.w); } +um_inline um_vec4 um_rcp4(um_vec4 a) { return um_v4(1.0f / a.x, 1.0f / a.y, 1.0f / a.z, 1.0f / a.w); } +um_inline um_vec4 um_mulv4(um_vec4 a, um_vec4 b) { return um_v4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w); } +um_inline um_vec4 um_divv4(um_vec4 a, um_vec4 b) { return um_v4(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); } +um_inline float um_dot4(um_vec4 a, um_vec4 b) { return a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; } +um_inline float um_length4(um_vec4 a) { return um_sqrt(a.x*a.x + a.y*a.y + a.z*a.z + a.w*a.w); } +um_inline um_vec4 um_min4(um_vec4 a, um_vec4 b) { return um_v4(um_min(a.x, b.x), um_min(a.y, b.y), um_min(a.z, b.z), um_min(a.w, b.w)); } +um_inline um_vec4 um_max4(um_vec4 a, um_vec4 b) { return um_v4(um_max(a.x, b.x), um_max(a.y, b.y), um_max(a.z, b.z), um_max(a.w, b.w)); } +um_inline um_vec4 um_clamp4(um_vec4 a, um_vec4 minv, um_vec4 maxv) { return um_v4(um_clamp(a.x, minv.x, maxv.x), um_clamp(a.y, minv.y, maxv.y), um_clamp(a.z, minv.z, maxv.z), um_clamp(a.w, minv.w, maxv.w)); } +um_inline um_vec4 um_lerp4(um_vec4 a, um_vec4 b, float t) { return um_v4(um_lerp(a.x, b.x, t), um_lerp(a.y, b.y, t), um_lerp(a.z, b.z, t), um_lerp(a.w, b.w, t)); } +um_inline um_vec4 um_normalize4(um_vec4 a) { float v = um_length4(a); v = v >= FLT_MIN ? 1.0f / v : 0.0f; return um_v4(a.x * v, a.y * v, a.z * v, a.w * v); } +um_inline bool um_equal4(um_vec4 a, um_vec4 b) { return (a.x == b.x) & (a.y == b.y) & (a.z == b.z) & (a.w == b.w); } + +um_inline um_quat um_quat_add(um_quat a, um_quat b) { return um_quat_xyzw(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); } +um_inline um_quat um_quat_sub(um_quat a, um_quat b) { return um_quat_xyzw(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); } +um_inline um_quat um_quat_mad(um_quat a, um_quat b, float c) { return um_quat_xyzw(a.x + b.x * c, a.y + b.y * c, a.z + b.z * c, a.w + b.w * c); } +um_inline um_quat um_quat_div(um_quat a, float b) { float v = 1.0f / b; return um_quat_xyzw(a.x * v, a.y * v, a.z * v, a.w * v); } +um_inline um_quat um_quat_neg(um_quat a) { return um_quat_xyzw(-a.x, -a.y, -a.z, -a.w); } +um_inline um_quat um_quat_inverse(um_quat a) { return um_quat_div(um_quat_xyzw(-a.x, -a.y, -a.z, a.w), (a.x*a.x + a.y*a.y + a.z*a.z + a.w*a.w)); } +um_inline um_quat um_quat_inverse_normalized(um_quat a) { return um_quat_xyzw(-a.x, -a.y, -a.z, a.w); } +um_inline float um_quat_dot(um_quat a, um_quat b) { return a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; } +um_inline float um_quat_length(um_quat a) { return um_sqrt(a.x*a.x + a.y*a.y + a.z*a.z + a.w*a.w); } +um_inline um_quat um_quat_normalize(um_quat a) { float v = um_quat_length(a); v = v >= FLT_MIN ? 1.0f / v : 0.0f; return um_quat_xyzw(a.x * v, a.y * v, a.z * v, a.w * v); } +um_inline bool um_quat_equal(um_quat a, um_quat b) { return (a.x == b.x) & (a.y == b.y) & (a.z == b.z) & (a.w == b.w); } + +um_abi um_quat um_quat_mul(um_quat a, um_quat b); +um_abi um_vec3 um_quat_rotate(um_quat a, um_vec3 b); +#define um_quat_mulrev(a, b) um_quat_mul((b), (a)) + +um_abi um_quat um_quat_lerp(um_quat a, um_quat b, float t); +um_abi um_quat um_quat_slerp(um_quat a, um_quat b, float t); + +um_abi um_quat um_quat_axis_angle(um_vec3 axis, float radians); + +#define um_mat_is_affine(a) um_equal4((a).cols[3], um_v4(0, 0, 0, 1)) + +um_abi um_mat um_mat_basis(um_vec3 x, um_vec3 y, um_vec3 z, um_vec3 origin); +um_abi um_mat um_mat_inverse_basis(um_vec3 x, um_vec3 y, um_vec3 z, um_vec3 origin); +um_abi um_mat um_mat_translate(um_vec3 offset); +um_abi um_mat um_mat_scale(um_vec3 scale); +um_abi um_mat um_mat_rotate(um_quat rotation); +um_abi um_mat um_mat_trs(um_vec3 translation, um_quat rotation, um_vec3 scale); +um_abi um_mat um_mat_rotate_x(float radians); +um_abi um_mat um_mat_rotate_y(float radians); +um_abi um_mat um_mat_rotate_z(float radians); +um_abi um_mat um_mat_look_at(um_vec3 eye, um_vec3 target, um_vec3 up_hint); +um_abi um_mat um_mat_perspective_gl(float fov, float aspect, float near_plane, float far_plane); +um_abi um_mat um_mat_perspective_d3d(float fov, float aspect, float near_plane, float far_plane); + +um_abi float um_mat_determinant(um_mat a); +um_abi um_mat um_mat_inverse(um_mat a); +um_abi um_mat um_mat_transpose(um_mat a); + +um_abi um_mat um_mat_mul(um_mat a, um_mat b); +um_abi um_vec4 um_mat_mull(um_vec4 a, um_mat b); +um_abi um_vec4 um_mat_mulr(um_mat a, um_vec4 b); +#define um_mat_mulrev(a, b) um_mat_mul((b), (a)) + +um_abi um_mat um_mat_add(um_mat a, um_mat b); +um_abi um_mat um_mat_sub(um_mat a, um_mat b); +um_abi um_mat um_mat_mad(um_mat a, um_mat b, float c); +um_abi um_mat um_mat_muls(um_mat a, float b); + +um_abi um_vec3 um_transform_point(const um_mat *a, um_vec3 b); +um_abi um_vec3 um_transform_direction(const um_mat *a, um_vec3 b); +um_abi um_vec3 um_transform_extent(const um_mat *a, um_vec3 b); + +#if defined(__cplusplus) +um_inline um_vec2 operator+(const um_vec2 &a, const um_vec2 &b) { return um_add2(a, b); } +um_inline um_vec2 operator-(const um_vec2 &a, const um_vec2 &b) { return um_sub2(a, b); } +um_inline um_vec2 operator*(const um_vec2 &a, const um_vec2 &b) { return um_mulv2(a, b); } +um_inline um_vec2 operator/(const um_vec2 &a, const um_vec2 &b) { return um_divv2(a, b); } +um_inline um_vec2 operator*(const um_vec2 &a, float b) { return um_mul2(a, b); } +um_inline um_vec2 operator/(const um_vec2 &a, float b) { return um_div2(a, b); } +um_inline um_vec2 operator-(const um_vec2 &a) { return um_neg2(a); } + +um_inline um_vec3 operator+(const um_vec3 &a, const um_vec3 &b) { return um_add3(a, b); } +um_inline um_vec3 operator-(const um_vec3 &a, const um_vec3 &b) { return um_sub3(a, b); } +um_inline um_vec3 operator*(const um_vec3 &a, const um_vec3 &b) { return um_mulv3(a, b); } +um_inline um_vec3 operator/(const um_vec3 &a, const um_vec3 &b) { return um_divv3(a, b); } +um_inline um_vec3 operator*(const um_vec3 &a, float b) { return um_mul3(a, b); } +um_inline um_vec3 operator/(const um_vec3 &a, float b) { return um_div3(a, b); } +um_inline um_vec3 operator-(const um_vec3 &a) { return um_neg3(a); } + +um_inline um_vec4 operator+(const um_vec4 &a, const um_vec4 &b) { return um_add4(a, b); } +um_inline um_vec4 operator-(const um_vec4 &a, const um_vec4 &b) { return um_sub4(a, b); } +um_inline um_vec4 operator*(const um_vec4 &a, const um_vec4 &b) { return um_mulv4(a, b); } +um_inline um_vec4 operator/(const um_vec4 &a, const um_vec4 &b) { return um_divv4(a, b); } +um_inline um_vec4 operator*(const um_vec4 &a, float b) { return um_mul4(a, b); } +um_inline um_vec4 operator/(const um_vec4 &a, float b) { return um_div4(a, b); } +um_inline um_vec4 operator-(const um_vec4 &a) { return um_neg4(a); } + +um_inline um_quat operator+(const um_quat &a, const um_quat &b) { return um_quat_add(a, b); } +um_inline um_quat operator-(const um_quat &a, const um_quat &b) { return um_quat_sub(a, b); } +um_inline um_quat operator*(const um_quat &a, const um_quat &b) { return um_quat_mul(a, b); } + +um_inline um_mat operator+(const um_mat &a, const um_mat &b) { return um_mat_add(a, b); } +um_inline um_mat operator-(const um_mat &a, const um_mat &b) { return um_mat_sub(a, b); } +um_inline um_mat operator*(const um_mat &a, const um_mat &b) { return um_mat_mul(a, b); } +#endif + +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + +#endif + +#if defined(UMATH_IMPLEMENTATION) || defined(__INTELLISENSE__) +#ifndef UMATH_H_IMPLEMENTED +#define UMATH_H_IMPLEMENTED + +const um_mat um_mat_identity = {{{ + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f, +}}}; + +um_abi um_quat um_quat_mul(um_quat a, um_quat b) +{ + return um_quat_xyzw( + a.w*b.x + a.x*b.w + a.y*b.z - a.z*b.y, + a.w*b.y - a.x*b.z + a.y*b.w + a.z*b.x, + a.w*b.z + a.x*b.y - a.y*b.x + a.z*b.w, + a.w*b.w - a.x*b.x - a.y*b.y - a.z*b.z); +} + +um_abi um_vec3 um_quat_rotate(um_quat a, um_vec3 b) +{ + float xy = a.x*b.y - a.y*b.x; + float xz = a.x*b.z - a.z*b.x; + float yz = a.y*b.z - a.z*b.y; + return um_v3( + 2.0f * (+ a.w*yz + a.y*xy + a.z*xz) + b.x, + 2.0f * (- a.x*xy - a.w*xz + a.z*yz) + b.y, + 2.0f * (- a.x*xz - a.y*yz + a.w*xy) + b.z); +} + +um_abi um_quat um_quat_lerp(um_quat a, um_quat b, float t) +{ + float af = 1.0f - t, bf = t; + float x = af*a.x + bf*b.x; + float y = af*a.y + bf*b.y; + float z = af*a.z + bf*b.z; + float w = af*a.w + bf*b.w; + return um_quat_xyzw(x, y, z, w); +} + +um_abi um_quat um_quat_slerp(um_quat a, um_quat b, float t) +{ + float dot = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; + if (dot < 0.0f) { + dot = -dot; + b.x = -b.x; b.y = -b.y; b.z = -b.z; b.w = -b.w; + } + float omega = acosf(um_min(um_max(dot, 0.0f), 1.0f)); + if (omega <= FLT_MIN) return a; + + float rcp_so = 1.0f / sinf(omega); + float af = sinf((1.0f - t) * omega) * rcp_so; + float bf = sinf(t * omega) * rcp_so; + + float x = af*a.x + bf*b.x; + float y = af*a.y + bf*b.y; + float z = af*a.z + bf*b.z; + float w = af*a.w + bf*b.w; + return um_quat_normalize(um_quat_xyzw(x, y, z, w)); +} + +um_abi um_quat um_quat_axis_angle(um_vec3 axis, float radians) +{ + axis = um_normalize3(axis); + float c = cosf(radians * 0.5f), s = sinf(radians * 0.5f); + return um_quat_xyzw(axis.x * s, axis.y * s, axis.z * s, c); +} + +um_abi um_mat um_mat_basis(um_vec3 x, um_vec3 y, um_vec3 z, um_vec3 origin) +{ + return um_mat_rows( + x.x, y.x, z.x, origin.x, + x.y, y.y, z.y, origin.y, + x.z, y.z, z.z, origin.z, + 0, 0, 0, 1, + ); +} + +um_abi um_mat um_mat_inverse_basis(um_vec3 x, um_vec3 y, um_vec3 z, um_vec3 origin) +{ + return um_mat_rows( + x.x, x.y, x.z, -um_dot3(origin, x), + y.x, y.y, y.z, -um_dot3(origin, y), + z.x, z.y, z.z, -um_dot3(origin, z), + 0, 0, 0, 1); +} + +um_abi um_mat um_mat_translate(um_vec3 offset) +{ + return um_mat_rows( + 1, 0, 0, offset.x, + 0, 1, 0, offset.y, + 0, 0, 1, offset.z, + 0, 0, 0, 1); +} + +um_abi um_mat um_mat_scale(um_vec3 scale) +{ + return um_mat_rows( + scale.x, 0, 0, 0, + 0, scale.y, 0, 0, + 0, 0, scale.z, 0, + 0, 0, 0, 1); +} + +um_abi um_mat um_mat_rotate(um_quat rotation) +{ + um_quat q = rotation; + float xx = q.x*q.x, xy = q.x*q.y, xz = q.x*q.z, xw = q.x*q.w; + float yy = q.y*q.y, yz = q.y*q.z, yw = q.y*q.w; + float zz = q.z*q.z, zw = q.z*q.w; + return um_mat_rows( + 2.0f * (- yy - zz + 0.5f), 2.0f * (- zw + xy), 2.0f * (+ xz + yw), 0, + 2.0f * (+ xy + zw), 2.0f * (- xx - zz + 0.5f), 2.0f * (- xw + yz), 0, + 2.0f * (- yw + xz), 2.0f * (+ xw + yz), 2.0f * (- xx - yy + 0.5f), 0, + 0, 0, 0, 1, + ); +} + +um_abi um_mat um_mat_trs(um_vec3 translation, um_quat rotation, um_vec3 scale) +{ + um_quat q = rotation; + float xx = q.x*q.x, xy = q.x*q.y, xz = q.x*q.z, xw = q.x*q.w; + float yy = q.y*q.y, yz = q.y*q.z, yw = q.y*q.w; + float zz = q.z*q.z, zw = q.z*q.w; + float sx = 2.0f * scale.x, sy = 2.0f * scale.y, sz = 2.0f * scale.z; + return um_mat_rows( + sx * (- yy - zz + 0.5f), sy * (- zw + xy), sz * (+ xz + yw), translation.x, + sx * (+ xy + zw), sy * (- xx - zz + 0.5f), sz * (- xw + yz), translation.y, + sx * (- yw + xz), sy * (+ xw + yz), sz * (- xx - yy + 0.5f), translation.z, + 0, 0, 0, 1, + ); +} + +um_abi um_mat um_mat_rotate_x(float radians) +{ + float c = cosf(radians), s = sinf(radians); + return um_mat_rows( + 1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1, + ); +} + +um_abi um_mat um_mat_rotate_y(float radians) +{ + float c = cosf(radians), s = sinf(radians); + return um_mat_rows( + c, 0, s, 0, + 0, 1, 0, 0, + -s, 0, c, 0, + 0, 0, 0, 1, + ); +} + +um_abi um_mat um_mat_rotate_z(float radians) +{ + float c = cosf(radians), s = sinf(radians); + return um_mat_rows( + c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1, + ); +} + +um_abi um_mat um_mat_look_at(um_vec3 eye, um_vec3 target, um_vec3 up_hint) +{ + um_vec3 dir = um_normalize3(um_sub3(target, eye)); + um_vec3 right = um_normalize3(um_cross3(dir, up_hint)); + um_vec3 up = um_normalize3(um_cross3(right, dir)); + return um_mat_inverse_basis(right, up, dir, eye); +} + +um_abi um_mat um_mat_perspective_d3d(float fov, float aspect, float near_plane, float far_plane) +{ + float tan_fov = 1.0f / tanf(fov / 2.0f); + float n = near_plane, f = far_plane; + return um_mat_rows( + tan_fov / aspect, 0, 0, 0, + 0, tan_fov, 0, 0, + 0, 0, f / (f-n), -(f*n)/(f-n), + 0, 0, 1, 0); +} + +um_abi um_mat um_mat_perspective_gl(float fov, float aspect, float near_plane, float far_plane) +{ + float tan_fov = 1.0f / tanf(fov / 2.0f); + float n = near_plane, f = far_plane; + return um_mat_rows( + tan_fov / aspect, 0, 0, 0, + 0, tan_fov, 0, 0, + 0, 0, (f+n) / (f-n), -2.0f * (f*n)/(f-n), + 0, 0, 1, 0); +} + +um_abi float um_mat_determinant(um_mat a) +{ + if (um_mat_is_affine(a)) { + return + - a.m14*a.m22*a.m41 + a.m12*a.m24*a.m41 + a.m14*a.m21*a.m42 + - a.m11*a.m24*a.m42 - a.m12*a.m21*a.m44 + a.m11*a.m22*a.m44; + } else { + return + + a.m14*a.m23*a.m32*a.m41 - a.m13*a.m24*a.m32*a.m41 - a.m14*a.m22*a.m33*a.m41 + a.m12*a.m24*a.m33*a.m41 + + a.m13*a.m22*a.m34*a.m41 - a.m12*a.m23*a.m34*a.m41 - a.m14*a.m23*a.m31*a.m42 + a.m13*a.m24*a.m31*a.m42 + + a.m14*a.m21*a.m33*a.m42 - a.m11*a.m24*a.m33*a.m42 - a.m13*a.m21*a.m34*a.m42 + a.m11*a.m23*a.m34*a.m42 + + a.m14*a.m22*a.m31*a.m43 - a.m12*a.m24*a.m31*a.m43 - a.m14*a.m21*a.m32*a.m43 + a.m11*a.m24*a.m32*a.m43 + + a.m12*a.m21*a.m34*a.m43 - a.m11*a.m22*a.m34*a.m43 - a.m13*a.m22*a.m31*a.m44 + a.m12*a.m23*a.m31*a.m44 + + a.m13*a.m21*a.m32*a.m44 - a.m11*a.m23*a.m32*a.m44 - a.m12*a.m21*a.m33*a.m44 + a.m11*a.m22*a.m33*a.m44; + } +} + +um_abi um_mat um_mat_inverse(um_mat a) +{ + if (um_mat_is_affine(a)) { + float det = + - a.m13*a.m22*a.m31 + a.m12*a.m23*a.m31 + a.m13*a.m21*a.m32 + - a.m11*a.m23*a.m32 - a.m12*a.m21*a.m33 + a.m11*a.m22*a.m33; + float rcp_det = 1.0f / det; + + return um_mat_rows( + ( - a.m23*a.m32 + a.m22*a.m33) * rcp_det, + ( + a.m13*a.m32 - a.m12*a.m33) * rcp_det, + ( - a.m13*a.m22 + a.m12*a.m23) * rcp_det, + (a.m14*a.m23*a.m32 - a.m13*a.m24*a.m32 - a.m14*a.m22*a.m33 + a.m12*a.m24*a.m33 + a.m13*a.m22*a.m34 - a.m12*a.m23*a.m34) * rcp_det, + + ( + a.m23*a.m31 - a.m21*a.m33) * rcp_det, + ( - a.m13*a.m31 + a.m11*a.m33) * rcp_det, + ( + a.m13*a.m21 - a.m11*a.m23) * rcp_det, + (a.m13*a.m24*a.m31 - a.m14*a.m23*a.m31 + a.m14*a.m21*a.m33 - a.m11*a.m24*a.m33 - a.m13*a.m21*a.m34 + a.m11*a.m23*a.m34) * rcp_det, + + ( - a.m22*a.m31 + a.m21*a.m32) * rcp_det, + ( + a.m12*a.m31 - a.m11*a.m32) * rcp_det, + ( - a.m12*a.m21 + a.m11*a.m22) * rcp_det, + (a.m14*a.m22*a.m31 - a.m12*a.m24*a.m31 - a.m14*a.m21*a.m32 + a.m11*a.m24*a.m32 + a.m12*a.m21*a.m34 - a.m11*a.m22*a.m34) * rcp_det, + + 0, 0, 0, 1 + ); + } else { + float det = + + a.m14*a.m23*a.m32*a.m41 - a.m13*a.m24*a.m32*a.m41 - a.m14*a.m22*a.m33*a.m41 + a.m12*a.m24*a.m33*a.m41 + + a.m13*a.m22*a.m34*a.m41 - a.m12*a.m23*a.m34*a.m41 - a.m14*a.m23*a.m31*a.m42 + a.m13*a.m24*a.m31*a.m42 + + a.m14*a.m21*a.m33*a.m42 - a.m11*a.m24*a.m33*a.m42 - a.m13*a.m21*a.m34*a.m42 + a.m11*a.m23*a.m34*a.m42 + + a.m14*a.m22*a.m31*a.m43 - a.m12*a.m24*a.m31*a.m43 - a.m14*a.m21*a.m32*a.m43 + a.m11*a.m24*a.m32*a.m43 + + a.m12*a.m21*a.m34*a.m43 - a.m11*a.m22*a.m34*a.m43 - a.m13*a.m22*a.m31*a.m44 + a.m12*a.m23*a.m31*a.m44 + + a.m13*a.m21*a.m32*a.m44 - a.m11*a.m23*a.m32*a.m44 - a.m12*a.m21*a.m33*a.m44 + a.m11*a.m22*a.m33*a.m44; + float rcp_det = 1.0f / det; + + return um_mat_rows( + (a.m23*a.m34*a.m42 - a.m24*a.m33*a.m42 + a.m24*a.m32*a.m43 - a.m22*a.m34*a.m43 - a.m23*a.m32*a.m44 + a.m22*a.m33*a.m44) * rcp_det, + (a.m14*a.m33*a.m42 - a.m13*a.m34*a.m42 - a.m14*a.m32*a.m43 + a.m12*a.m34*a.m43 + a.m13*a.m32*a.m44 - a.m12*a.m33*a.m44) * rcp_det, + (a.m13*a.m24*a.m42 - a.m14*a.m23*a.m42 + a.m14*a.m22*a.m43 - a.m12*a.m24*a.m43 - a.m13*a.m22*a.m44 + a.m12*a.m23*a.m44) * rcp_det, + (a.m14*a.m23*a.m32 - a.m13*a.m24*a.m32 - a.m14*a.m22*a.m33 + a.m12*a.m24*a.m33 + a.m13*a.m22*a.m34 - a.m12*a.m23*a.m34) * rcp_det, + + (a.m24*a.m33*a.m41 - a.m23*a.m34*a.m41 - a.m24*a.m31*a.m43 + a.m21*a.m34*a.m43 + a.m23*a.m31*a.m44 - a.m21*a.m33*a.m44) * rcp_det, + (a.m13*a.m34*a.m41 - a.m14*a.m33*a.m41 + a.m14*a.m31*a.m43 - a.m11*a.m34*a.m43 - a.m13*a.m31*a.m44 + a.m11*a.m33*a.m44) * rcp_det, + (a.m14*a.m23*a.m41 - a.m13*a.m24*a.m41 - a.m14*a.m21*a.m43 + a.m11*a.m24*a.m43 + a.m13*a.m21*a.m44 - a.m11*a.m23*a.m44) * rcp_det, + (a.m13*a.m24*a.m31 - a.m14*a.m23*a.m31 + a.m14*a.m21*a.m33 - a.m11*a.m24*a.m33 - a.m13*a.m21*a.m34 + a.m11*a.m23*a.m34) * rcp_det, + + (a.m22*a.m34*a.m41 - a.m24*a.m32*a.m41 + a.m24*a.m31*a.m42 - a.m21*a.m34*a.m42 - a.m22*a.m31*a.m44 + a.m21*a.m32*a.m44) * rcp_det, + (a.m14*a.m32*a.m41 - a.m12*a.m34*a.m41 - a.m14*a.m31*a.m42 + a.m11*a.m34*a.m42 + a.m12*a.m31*a.m44 - a.m11*a.m32*a.m44) * rcp_det, + (a.m12*a.m24*a.m41 - a.m14*a.m22*a.m41 + a.m14*a.m21*a.m42 - a.m11*a.m24*a.m42 - a.m12*a.m21*a.m44 + a.m11*a.m22*a.m44) * rcp_det, + (a.m14*a.m22*a.m31 - a.m12*a.m24*a.m31 - a.m14*a.m21*a.m32 + a.m11*a.m24*a.m32 + a.m12*a.m21*a.m34 - a.m11*a.m22*a.m34) * rcp_det, + + (a.m23*a.m32*a.m41 - a.m22*a.m33*a.m41 - a.m23*a.m31*a.m42 + a.m21*a.m33*a.m42 + a.m22*a.m31*a.m43 - a.m21*a.m32*a.m43) * rcp_det, + (a.m12*a.m33*a.m41 - a.m13*a.m32*a.m41 + a.m13*a.m31*a.m42 - a.m11*a.m33*a.m42 - a.m12*a.m31*a.m43 + a.m11*a.m32*a.m43) * rcp_det, + (a.m13*a.m22*a.m41 - a.m12*a.m23*a.m41 - a.m13*a.m21*a.m42 + a.m11*a.m23*a.m42 + a.m12*a.m21*a.m43 - a.m11*a.m22*a.m43) * rcp_det, + (a.m12*a.m23*a.m31 - a.m13*a.m22*a.m31 + a.m13*a.m21*a.m32 - a.m11*a.m23*a.m32 - a.m12*a.m21*a.m33 + a.m11*a.m22*a.m33) * rcp_det, + ); + } +} + +um_abi um_mat um_mat_transpose(um_mat a) +{ + return um_mat_rows( + a.m11, a.m21, a.m31, a.m41, + a.m12, a.m22, a.m32, a.m42, + a.m13, a.m23, a.m33, a.m43, + a.m14, a.m24, a.m34, a.m44, + ); +} + +um_abi um_mat um_mat_mul(um_mat a, um_mat b) +{ + return um_mat_rows( + a.m11*b.m11 + a.m12*b.m21 + a.m13*b.m31 + a.m14*b.m41, + a.m11*b.m12 + a.m12*b.m22 + a.m13*b.m32 + a.m14*b.m42, + a.m11*b.m13 + a.m12*b.m23 + a.m13*b.m33 + a.m14*b.m43, + a.m11*b.m14 + a.m12*b.m24 + a.m13*b.m34 + a.m14*b.m44, + a.m21*b.m11 + a.m22*b.m21 + a.m23*b.m31 + a.m24*b.m41, + a.m21*b.m12 + a.m22*b.m22 + a.m23*b.m32 + a.m24*b.m42, + a.m21*b.m13 + a.m22*b.m23 + a.m23*b.m33 + a.m24*b.m43, + a.m21*b.m14 + a.m22*b.m24 + a.m23*b.m34 + a.m24*b.m44, + a.m31*b.m11 + a.m32*b.m21 + a.m33*b.m31 + a.m34*b.m41, + a.m31*b.m12 + a.m32*b.m22 + a.m33*b.m32 + a.m34*b.m42, + a.m31*b.m13 + a.m32*b.m23 + a.m33*b.m33 + a.m34*b.m43, + a.m31*b.m14 + a.m32*b.m24 + a.m33*b.m34 + a.m34*b.m44, + a.m41*b.m11 + a.m42*b.m21 + a.m43*b.m31 + a.m44*b.m41, + a.m41*b.m12 + a.m42*b.m22 + a.m43*b.m32 + a.m44*b.m42, + a.m41*b.m13 + a.m42*b.m23 + a.m43*b.m33 + a.m44*b.m43, + a.m41*b.m14 + a.m42*b.m24 + a.m43*b.m34 + a.m44*b.m44, + ); +} + +um_abi um_mat um_mat_add(um_mat a, um_mat b) +{ + return um_mat_rows( + a.m11 + b.m11, a.m12 + b.m12, a.m13 + b.m13, a.m14 + b.m14, + a.m21 + b.m21, a.m22 + b.m22, a.m23 + b.m23, a.m24 + b.m24, + a.m31 + b.m31, a.m32 + b.m32, a.m33 + b.m33, a.m34 + b.m34, + a.m41 + b.m41, a.m42 + b.m42, a.m43 + b.m43, a.m44 + b.m44, + ); +} + +um_abi um_mat um_mat_sub(um_mat a, um_mat b) +{ + return um_mat_rows( + a.m11 - b.m11, a.m12 - b.m12, a.m13 - b.m13, a.m14 - b.m14, + a.m21 - b.m21, a.m22 - b.m22, a.m23 - b.m23, a.m24 - b.m24, + a.m31 - b.m31, a.m32 - b.m32, a.m33 - b.m33, a.m34 - b.m34, + a.m41 - b.m41, a.m42 - b.m42, a.m43 - b.m43, a.m44 - b.m44, + ); +} + +um_abi um_mat um_mat_mad(um_mat a, um_mat b, float c) +{ + return um_mat_rows( + a.m11 + b.m11 * c, a.m12 + b.m12 * c, a.m13 + b.m13 * c, a.m14 + b.m14 * c, + a.m21 + b.m21 * c, a.m22 + b.m22 * c, a.m23 + b.m23 * c, a.m24 + b.m24 * c, + a.m31 + b.m31 * c, a.m32 + b.m32 * c, a.m33 + b.m33 * c, a.m34 + b.m34 * c, + a.m41 + b.m41 * c, a.m42 + b.m42 * c, a.m43 + b.m43 * c, a.m44 + b.m44 * c, + ); +} + +um_abi um_mat um_mat_muls(um_mat a, float b) +{ + return um_mat_rows( + a.m11 * b, a.m12 * b, a.m13 * b, a.m14 * b, + a.m21 * b, a.m22 * b, a.m23 * b, a.m24 * b, + a.m31 * b, a.m32 * b, a.m33 * b, a.m34 * b, + a.m41 * b, a.m42 * b, a.m43 * b, a.m44 * b, + ); +} + +um_abi um_vec4 um_mat_mull(um_vec4 a, um_mat b) +{ + return um_v4( + a.x*b.m11 + a.y*b.m21 + a.z*b.m31 + a.w*b.m41, + a.x*b.m12 + a.y*b.m22 + a.z*b.m32 + a.w*b.m42, + a.x*b.m13 + a.y*b.m23 + a.z*b.m33 + a.w*b.m43, + a.x*b.m14 + a.y*b.m24 + a.z*b.m34 + a.w*b.m44); +} + +um_abi um_vec4 um_mat_mulr(um_mat a, um_vec4 b) +{ + return um_v4( + a.m11*b.x + a.m12*b.y + a.m13*b.z + a.m14*b.w, + a.m21*b.x + a.m22*b.y + a.m23*b.z + a.m24*b.w, + a.m31*b.x + a.m32*b.y + a.m33*b.z + a.m34*b.w, + a.m41*b.x + a.m42*b.y + a.m43*b.z + a.m44*b.w); +} + +um_abi um_vec3 um_transform_point(const um_mat *a, um_vec3 b) +{ + return um_v3( + a->m11*b.x + a->m12*b.y + a->m13*b.z + a->m14, + a->m21*b.x + a->m22*b.y + a->m23*b.z + a->m24, + a->m31*b.x + a->m32*b.y + a->m33*b.z + a->m34); +} + +um_abi um_vec3 um_transform_direction(const um_mat *a, um_vec3 b) +{ + return um_v3( + a->m11*b.x + a->m12*b.y + a->m13*b.z, + a->m21*b.x + a->m22*b.y + a->m23*b.z, + a->m31*b.x + a->m32*b.y + a->m33*b.z); +} + +um_abi um_vec3 um_transform_extent(const um_mat *a, um_vec3 b) +{ + return um_v3( + um_abs(a->m11)*b.x + um_abs(a->m12)*b.y + um_abs(a->m13)*b.z, + um_abs(a->m21)*b.x + um_abs(a->m22)*b.y + um_abs(a->m23)*b.z, + um_abs(a->m31)*b.x + um_abs(a->m32)*b.y + um_abs(a->m23)*b.z); +} + +#endif +#endif diff --git a/modules/ufbx/examples/viewer/shaders/mesh.glsl b/modules/ufbx/examples/viewer/shaders/mesh.glsl new file mode 100644 index 0000000..fdca3c0 --- /dev/null +++ b/modules/ufbx/examples/viewer/shaders/mesh.glsl @@ -0,0 +1,120 @@ +@ctype vec3 um_vec3 +@ctype vec4 um_vec4 +@ctype mat4 um_mat + +@block vertex_shared + +layout(binding=0) uniform mesh_vertex_ubo { + mat4 geometry_to_world; + mat4 normal_to_world; + mat4 world_to_clip; + vec4 blend_weights[16]; + float f_num_blend_shapes; +}; + +layout(binding=0) uniform sampler2DArray blend_shapes; + +vec3 evaluate_blend_shape(int vertex_index) +{ + ivec2 coord = ivec2(vertex_index & (2048 - 1), vertex_index >> 11); + int num_blend_shapes = int(f_num_blend_shapes); + vec3 offset = vec3(0.0); + for (int i = 0; i < num_blend_shapes; i++) { + vec4 packed = blend_weights[i >> 2]; + float weight = packed[i & 3]; + offset += weight * texelFetch(blend_shapes, ivec3(coord, i), 0).xyz; + } + return offset; +} + +@end + +@vs static_vertex + +@include_block vertex_shared + +layout(location=0) in vec3 a_position; +layout(location=1) in vec3 a_normal; +layout(location=2) in vec2 a_uv; +layout(location=3) in float a_vertex_index; + +out vec3 v_normal; +out vec2 v_uv; + +void main() +{ + vec3 local_pos = a_position; + local_pos += evaluate_blend_shape(int(a_vertex_index)); + + vec3 world_pos = (geometry_to_world * vec4(local_pos, 1.0)).xyz; + gl_Position = world_to_clip * vec4(world_pos, 1.0); + v_normal = normalize((normal_to_world * vec4(a_normal, 0.0)).xyz); + v_uv = a_uv; +} + +@end + +@vs skinned_vertex + +@include_block vertex_shared + +layout(binding=1) uniform skin_vertex_ubo { + mat4 bones[64]; +}; + +layout(location=0) in vec3 a_position; +layout(location=1) in vec3 a_normal; +layout(location=2) in vec2 a_uv; +layout(location=3) in float a_vertex_index; +#if SOKOL_GLSL + layout(location=4) in vec4 a_bone_indices; +#else + layout(location=4) in ivec4 a_bone_indices; +#endif +layout(location=5) in vec4 a_bone_weights; + +out vec3 v_normal; +out vec2 v_uv; + +void main() +{ + mat4 bind_to_world + = bones[int(a_bone_indices.x)] * a_bone_weights.x + + bones[int(a_bone_indices.y)] * a_bone_weights.y + + bones[int(a_bone_indices.z)] * a_bone_weights.z + + bones[int(a_bone_indices.w)] * a_bone_weights.w; + + vec3 local_pos = a_position; + local_pos += evaluate_blend_shape(int(a_vertex_index)); + vec3 world_pos = (bind_to_world * vec4(local_pos, 1.0)).xyz; + vec3 world_normal = (bind_to_world * vec4(a_normal, 0.0)).xyz; + + gl_Position = world_to_clip * vec4(world_pos, 1.0); + v_normal = normalize(world_normal); + v_uv = a_uv; +} + +@end + +@fs lit_pixel + +in vec3 v_normal; +in vec2 v_uv; + +out vec4 o_color; + +void main() +{ + float l = dot(v_normal, normalize(vec3(1.0, 1.0, 1.0))); + + // HACK: We need to use UV here somehow so it doesn't get stripped.. + // TODO: Implement textures + l += v_uv.x * 0.0001; + + l = l * 0.5 + 0.5; + o_color = vec4(l, l, l, 1.0); +} +@end + +@program static_lit static_vertex lit_pixel +@program skinned_lit skinned_vertex lit_pixel diff --git a/modules/ufbx/examples/viewer/shaders/mesh.h b/modules/ufbx/examples/viewer/shaders/mesh.h new file mode 100644 index 0000000..b0f7ea7 --- /dev/null +++ b/modules/ufbx/examples/viewer/shaders/mesh.h @@ -0,0 +1,1893 @@ +#pragma once +/* + #version:1# (machine generated, don't edit!) + + Generated by sokol-shdc (https://github.com/floooh/sokol-tools) + + Cmdline: sokol-shdc --input mesh.glsl --output mesh.h --slang glsl330:hlsl5:metal_macos -b + + Overview: + + Shader program 'skinned_lit': + Get shader desc: skinned_lit_shader_desc(sg_query_backend()); + Vertex shader: skinned_vertex + Attribute slots: + ATTR_skinned_vertex_a_position = 0 + ATTR_skinned_vertex_a_normal = 1 + ATTR_skinned_vertex_a_uv = 2 + ATTR_skinned_vertex_a_vertex_index = 3 + ATTR_skinned_vertex_a_bone_indices = 4 + ATTR_skinned_vertex_a_bone_weights = 5 + Uniform block 'mesh_vertex_ubo': + C struct: mesh_vertex_ubo_t + Bind slot: SLOT_mesh_vertex_ubo = 0 + Uniform block 'skin_vertex_ubo': + C struct: skin_vertex_ubo_t + Bind slot: SLOT_skin_vertex_ubo = 1 + Image 'blend_shapes': + Type: SG_IMAGETYPE_ARRAY + Component Type: SG_SAMPLERTYPE_FLOAT + Bind slot: SLOT_blend_shapes = 0 + Fragment shader: lit_pixel + + Shader program 'static_lit': + Get shader desc: static_lit_shader_desc(sg_query_backend()); + Vertex shader: static_vertex + Attribute slots: + ATTR_static_vertex_a_position = 0 + ATTR_static_vertex_a_normal = 1 + ATTR_static_vertex_a_uv = 2 + ATTR_static_vertex_a_vertex_index = 3 + Uniform block 'mesh_vertex_ubo': + C struct: mesh_vertex_ubo_t + Bind slot: SLOT_mesh_vertex_ubo = 0 + Image 'blend_shapes': + Type: SG_IMAGETYPE_ARRAY + Component Type: SG_SAMPLERTYPE_FLOAT + Bind slot: SLOT_blend_shapes = 0 + Fragment shader: lit_pixel + + + Shader descriptor structs: + + sg_shader skinned_lit = sg_make_shader(skinned_lit_shader_desc(sg_query_backend())); + sg_shader static_lit = sg_make_shader(static_lit_shader_desc(sg_query_backend())); + + Vertex attribute locations for vertex shader 'static_vertex': + + sg_pipeline pip = sg_make_pipeline(&(sg_pipeline_desc){ + .layout = { + .attrs = { + [ATTR_static_vertex_a_position] = { ... }, + [ATTR_static_vertex_a_normal] = { ... }, + [ATTR_static_vertex_a_uv] = { ... }, + [ATTR_static_vertex_a_vertex_index] = { ... }, + }, + }, + ...}); + + Vertex attribute locations for vertex shader 'skinned_vertex': + + sg_pipeline pip = sg_make_pipeline(&(sg_pipeline_desc){ + .layout = { + .attrs = { + [ATTR_skinned_vertex_a_position] = { ... }, + [ATTR_skinned_vertex_a_normal] = { ... }, + [ATTR_skinned_vertex_a_uv] = { ... }, + [ATTR_skinned_vertex_a_vertex_index] = { ... }, + [ATTR_skinned_vertex_a_bone_indices] = { ... }, + [ATTR_skinned_vertex_a_bone_weights] = { ... }, + }, + }, + ...}); + + Image bind slots, use as index in sg_bindings.vs_images[] or .fs_images[] + + SLOT_blend_shapes = 0; + + Bind slot and C-struct for uniform block 'mesh_vertex_ubo': + + mesh_vertex_ubo_t mesh_vertex_ubo = { + .geometry_to_world = ...; + .normal_to_world = ...; + .world_to_clip = ...; + .blend_weights = ...; + .f_num_blend_shapes = ...; + }; + sg_apply_uniforms(SG_SHADERSTAGE_[VS|FS], SLOT_mesh_vertex_ubo, &SG_RANGE(mesh_vertex_ubo)); + + Bind slot and C-struct for uniform block 'skin_vertex_ubo': + + skin_vertex_ubo_t skin_vertex_ubo = { + .bones = ...; + }; + sg_apply_uniforms(SG_SHADERSTAGE_[VS|FS], SLOT_skin_vertex_ubo, &SG_RANGE(skin_vertex_ubo)); + +*/ +#include +#include +#include +#include +#if !defined(SOKOL_SHDC_ALIGN) + #if defined(_MSC_VER) + #define SOKOL_SHDC_ALIGN(a) __declspec(align(a)) + #else + #define SOKOL_SHDC_ALIGN(a) __attribute__((aligned(a))) + #endif +#endif +#define ATTR_static_vertex_a_position (0) +#define ATTR_static_vertex_a_normal (1) +#define ATTR_static_vertex_a_uv (2) +#define ATTR_static_vertex_a_vertex_index (3) +#define ATTR_skinned_vertex_a_position (0) +#define ATTR_skinned_vertex_a_normal (1) +#define ATTR_skinned_vertex_a_uv (2) +#define ATTR_skinned_vertex_a_vertex_index (3) +#define ATTR_skinned_vertex_a_bone_indices (4) +#define ATTR_skinned_vertex_a_bone_weights (5) +#define SLOT_blend_shapes (0) +#define SLOT_mesh_vertex_ubo (0) +#pragma pack(push,1) +SOKOL_SHDC_ALIGN(16) typedef struct mesh_vertex_ubo_t { + um_mat geometry_to_world; + um_mat normal_to_world; + um_mat world_to_clip; + um_vec4 blend_weights[16]; + float f_num_blend_shapes; + uint8_t _pad_452[12]; +} mesh_vertex_ubo_t; +#pragma pack(pop) +#define SLOT_skin_vertex_ubo (1) +#pragma pack(push,1) +SOKOL_SHDC_ALIGN(16) typedef struct skin_vertex_ubo_t { + um_mat bones[64]; +} skin_vertex_ubo_t; +#pragma pack(pop) +/* + #version 330 + + uniform vec4 mesh_vertex_ubo[29]; + uniform sampler2DArray blend_shapes; + + layout(location = 0) in vec3 a_position; + layout(location = 3) in float a_vertex_index; + out vec3 v_normal; + layout(location = 1) in vec3 a_normal; + out vec2 v_uv; + layout(location = 2) in vec2 a_uv; + + vec3 evaluate_blend_shape(int vertex_index) + { + int _21 = vertex_index & 2047; + int _24 = vertex_index >> 11; + int _39 = int(mesh_vertex_ubo[28].x); + vec3 offset = vec3(0.0); + for (int i = 0; i < _39; i++) + { + vec4 _packed = mesh_vertex_ubo[(i >> 2) * 1 + 12]; + offset += (texelFetch(blend_shapes, ivec3(_21, _24, i), 0).xyz * _packed[i & 3]); + } + return offset; + } + + void main() + { + vec3 local_pos = a_position; + int param = int(a_vertex_index); + vec3 _104 = local_pos; + vec3 _105 = _104 + evaluate_blend_shape(param); + local_pos = _105; + gl_Position = mat4(mesh_vertex_ubo[8], mesh_vertex_ubo[9], mesh_vertex_ubo[10], mesh_vertex_ubo[11]) * vec4((mat4(mesh_vertex_ubo[0], mesh_vertex_ubo[1], mesh_vertex_ubo[2], mesh_vertex_ubo[3]) * vec4(_105, 1.0)).xyz, 1.0); + v_normal = normalize((mat4(mesh_vertex_ubo[4], mesh_vertex_ubo[5], mesh_vertex_ubo[6], mesh_vertex_ubo[7]) * vec4(a_normal, 0.0)).xyz); + v_uv = a_uv; + } + +*/ +static const char static_vertex_source_glsl330[1259] = { + 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e, + 0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x6d,0x65,0x73,0x68,0x5f, + 0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x32,0x39,0x5d,0x3b,0x0a, + 0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32, + 0x44,0x41,0x72,0x72,0x61,0x79,0x20,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61, + 0x70,0x65,0x73,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63, + 0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65, + 0x63,0x33,0x20,0x61,0x5f,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x6c, + 0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d, + 0x20,0x33,0x29,0x20,0x69,0x6e,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x5f,0x76, + 0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64,0x65,0x78,0x3b,0x0a,0x6f,0x75,0x74, + 0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a, + 0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20, + 0x3d,0x20,0x31,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x33,0x20,0x61,0x5f,0x6e, + 0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x32,0x20, + 0x76,0x5f,0x75,0x76,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63, + 0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65, + 0x63,0x32,0x20,0x61,0x5f,0x75,0x76,0x3b,0x0a,0x0a,0x76,0x65,0x63,0x33,0x20,0x65, + 0x76,0x61,0x6c,0x75,0x61,0x74,0x65,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68, + 0x61,0x70,0x65,0x28,0x69,0x6e,0x74,0x20,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69, + 0x6e,0x64,0x65,0x78,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20, + 0x5f,0x32,0x31,0x20,0x3d,0x20,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64, + 0x65,0x78,0x20,0x26,0x20,0x32,0x30,0x34,0x37,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69, + 0x6e,0x74,0x20,0x5f,0x32,0x34,0x20,0x3d,0x20,0x76,0x65,0x72,0x74,0x65,0x78,0x5f, + 0x69,0x6e,0x64,0x65,0x78,0x20,0x3e,0x3e,0x20,0x31,0x31,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x69,0x6e,0x74,0x20,0x5f,0x33,0x39,0x20,0x3d,0x20,0x69,0x6e,0x74,0x28,0x6d, + 0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x32, + 0x38,0x5d,0x2e,0x78,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20, + 0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e, + 0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74, + 0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x5f,0x33,0x39,0x3b, + 0x20,0x69,0x2b,0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x70,0x61,0x63,0x6b,0x65,0x64, + 0x20,0x3d,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75, + 0x62,0x6f,0x5b,0x28,0x69,0x20,0x3e,0x3e,0x20,0x32,0x29,0x20,0x2a,0x20,0x31,0x20, + 0x2b,0x20,0x31,0x32,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f, + 0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x74,0x65,0x78,0x65,0x6c,0x46, + 0x65,0x74,0x63,0x68,0x28,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65, + 0x73,0x2c,0x20,0x69,0x76,0x65,0x63,0x33,0x28,0x5f,0x32,0x31,0x2c,0x20,0x5f,0x32, + 0x34,0x2c,0x20,0x69,0x29,0x2c,0x20,0x30,0x29,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20, + 0x5f,0x70,0x61,0x63,0x6b,0x65,0x64,0x5b,0x69,0x20,0x26,0x20,0x33,0x5d,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72, + 0x6e,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x76,0x6f,0x69, + 0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x76, + 0x65,0x63,0x33,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x70,0x6f,0x73,0x20,0x3d,0x20, + 0x61,0x5f,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x69,0x6e,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x69,0x6e,0x74,0x28, + 0x61,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64,0x65,0x78,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x31,0x30,0x34,0x20,0x3d, + 0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x70,0x6f,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x76,0x65,0x63,0x33,0x20,0x5f,0x31,0x30,0x35,0x20,0x3d,0x20,0x5f,0x31,0x30,0x34, + 0x20,0x2b,0x20,0x65,0x76,0x61,0x6c,0x75,0x61,0x74,0x65,0x5f,0x62,0x6c,0x65,0x6e, + 0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x70,0x6f,0x73,0x20,0x3d,0x20, + 0x5f,0x31,0x30,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73, + 0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x6d,0x65,0x73, + 0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x38,0x5d,0x2c, + 0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f, + 0x5b,0x39,0x5d,0x2c,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78, + 0x5f,0x75,0x62,0x6f,0x5b,0x31,0x30,0x5d,0x2c,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76, + 0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x31,0x31,0x5d,0x29,0x20,0x2a, + 0x20,0x76,0x65,0x63,0x34,0x28,0x28,0x6d,0x61,0x74,0x34,0x28,0x6d,0x65,0x73,0x68, + 0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x30,0x5d,0x2c,0x20, + 0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b, + 0x31,0x5d,0x2c,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f, + 0x75,0x62,0x6f,0x5b,0x32,0x5d,0x2c,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72, + 0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x33,0x5d,0x29,0x20,0x2a,0x20,0x76,0x65, + 0x63,0x34,0x28,0x5f,0x31,0x30,0x35,0x2c,0x20,0x31,0x2e,0x30,0x29,0x29,0x2e,0x78, + 0x79,0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x5f, + 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69, + 0x7a,0x65,0x28,0x28,0x6d,0x61,0x74,0x34,0x28,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65, + 0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x34,0x5d,0x2c,0x20,0x6d,0x65,0x73, + 0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x35,0x5d,0x2c, + 0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f, + 0x5b,0x36,0x5d,0x2c,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78, + 0x5f,0x75,0x62,0x6f,0x5b,0x37,0x5d,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x34,0x28, + 0x61,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2c,0x20,0x30,0x2e,0x30,0x29,0x29,0x2e, + 0x78,0x79,0x7a,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x5f,0x75,0x76,0x20,0x3d, + 0x20,0x61,0x5f,0x75,0x76,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, +}; +/* + #version 330 + + uniform vec4 mesh_vertex_ubo[29]; + uniform vec4 skin_vertex_ubo[256]; + uniform sampler2DArray blend_shapes; + + layout(location = 4) in vec4 a_bone_indices; + layout(location = 5) in vec4 a_bone_weights; + layout(location = 0) in vec3 a_position; + layout(location = 3) in float a_vertex_index; + layout(location = 1) in vec3 a_normal; + out vec3 v_normal; + out vec2 v_uv; + layout(location = 2) in vec2 a_uv; + + vec3 evaluate_blend_shape(int vertex_index) + { + int _21 = vertex_index & 2047; + int _24 = vertex_index >> 11; + int _39 = int(mesh_vertex_ubo[28].x); + vec3 offset = vec3(0.0); + for (int i = 0; i < _39; i++) + { + vec4 _packed = mesh_vertex_ubo[(i >> 2) * 1 + 12]; + offset += (texelFetch(blend_shapes, ivec3(_21, _24, i), 0).xyz * _packed[i & 3]); + } + return offset; + } + + void main() + { + mat4 _114 = mat4(skin_vertex_ubo[int(a_bone_indices.x) * 4 + 0], skin_vertex_ubo[int(a_bone_indices.x) * 4 + 1], skin_vertex_ubo[int(a_bone_indices.x) * 4 + 2], skin_vertex_ubo[int(a_bone_indices.x) * 4 + 3]) * a_bone_weights.x; + mat4 _123 = mat4(skin_vertex_ubo[int(a_bone_indices.y) * 4 + 0], skin_vertex_ubo[int(a_bone_indices.y) * 4 + 1], skin_vertex_ubo[int(a_bone_indices.y) * 4 + 2], skin_vertex_ubo[int(a_bone_indices.y) * 4 + 3]) * a_bone_weights.y; + mat4 _145 = mat4(skin_vertex_ubo[int(a_bone_indices.z) * 4 + 0], skin_vertex_ubo[int(a_bone_indices.z) * 4 + 1], skin_vertex_ubo[int(a_bone_indices.z) * 4 + 2], skin_vertex_ubo[int(a_bone_indices.z) * 4 + 3]) * a_bone_weights.z; + mat4 _167 = mat4(skin_vertex_ubo[int(a_bone_indices.w) * 4 + 0], skin_vertex_ubo[int(a_bone_indices.w) * 4 + 1], skin_vertex_ubo[int(a_bone_indices.w) * 4 + 2], skin_vertex_ubo[int(a_bone_indices.w) * 4 + 3]) * a_bone_weights.w; + mat4 _180 = mat4(((_114[0] + _123[0]) + _145[0]) + _167[0], ((_114[1] + _123[1]) + _145[1]) + _167[1], ((_114[2] + _123[2]) + _145[2]) + _167[2], ((_114[3] + _123[3]) + _145[3]) + _167[3]); + vec3 local_pos = a_position; + int param = int(a_vertex_index); + vec3 _190 = local_pos; + vec3 _191 = _190 + evaluate_blend_shape(param); + local_pos = _191; + gl_Position = mat4(mesh_vertex_ubo[8], mesh_vertex_ubo[9], mesh_vertex_ubo[10], mesh_vertex_ubo[11]) * vec4((_180 * vec4(_191, 1.0)).xyz, 1.0); + v_normal = normalize((_180 * vec4(a_normal, 0.0)).xyz); + v_uv = a_uv; + } + +*/ +static const char skinned_vertex_source_glsl330[2350] = { + 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x75,0x6e, + 0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x6d,0x65,0x73,0x68,0x5f, + 0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x32,0x39,0x5d,0x3b,0x0a, + 0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x76,0x65,0x63,0x34,0x20,0x73,0x6b,0x69, + 0x6e,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x32,0x35,0x36, + 0x5d,0x3b,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c, + 0x65,0x72,0x32,0x44,0x41,0x72,0x72,0x61,0x79,0x20,0x62,0x6c,0x65,0x6e,0x64,0x5f, + 0x73,0x68,0x61,0x70,0x65,0x73,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28, + 0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x34,0x29,0x20,0x69,0x6e, + 0x20,0x76,0x65,0x63,0x34,0x20,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64, + 0x69,0x63,0x65,0x73,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63, + 0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x35,0x29,0x20,0x69,0x6e,0x20,0x76,0x65, + 0x63,0x34,0x20,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74, + 0x73,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69, + 0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x33,0x20, + 0x61,0x5f,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x6c,0x61,0x79,0x6f, + 0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x33,0x29, + 0x20,0x69,0x6e,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x5f,0x76,0x65,0x72,0x74, + 0x65,0x78,0x5f,0x69,0x6e,0x64,0x65,0x78,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74, + 0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x69, + 0x6e,0x20,0x76,0x65,0x63,0x33,0x20,0x61,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b, + 0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x5f,0x6e,0x6f,0x72,0x6d, + 0x61,0x6c,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x32,0x20,0x76,0x5f,0x75, + 0x76,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69, + 0x6f,0x6e,0x20,0x3d,0x20,0x32,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20, + 0x61,0x5f,0x75,0x76,0x3b,0x0a,0x0a,0x76,0x65,0x63,0x33,0x20,0x65,0x76,0x61,0x6c, + 0x75,0x61,0x74,0x65,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65, + 0x28,0x69,0x6e,0x74,0x20,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64,0x65, + 0x78,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x32,0x31, + 0x20,0x3d,0x20,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20, + 0x26,0x20,0x32,0x30,0x34,0x37,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20, + 0x5f,0x32,0x34,0x20,0x3d,0x20,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64, + 0x65,0x78,0x20,0x3e,0x3e,0x20,0x31,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e, + 0x74,0x20,0x5f,0x33,0x39,0x20,0x3d,0x20,0x69,0x6e,0x74,0x28,0x6d,0x65,0x73,0x68, + 0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x32,0x38,0x5d,0x2e, + 0x78,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x6f,0x66,0x66, + 0x73,0x65,0x74,0x20,0x3d,0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e,0x30,0x29,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20, + 0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x5f,0x33,0x39,0x3b,0x20,0x69,0x2b, + 0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x70,0x61,0x63,0x6b,0x65,0x64,0x20,0x3d,0x20, + 0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b, + 0x28,0x69,0x20,0x3e,0x3e,0x20,0x32,0x29,0x20,0x2a,0x20,0x31,0x20,0x2b,0x20,0x31, + 0x32,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73, + 0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x74,0x65,0x78,0x65,0x6c,0x46,0x65,0x74,0x63, + 0x68,0x28,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x2c,0x20, + 0x69,0x76,0x65,0x63,0x33,0x28,0x5f,0x32,0x31,0x2c,0x20,0x5f,0x32,0x34,0x2c,0x20, + 0x69,0x29,0x2c,0x20,0x30,0x29,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x5f,0x70,0x61, + 0x63,0x6b,0x65,0x64,0x5b,0x69,0x20,0x26,0x20,0x33,0x5d,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f, + 0x66,0x66,0x73,0x65,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d, + 0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x74,0x34, + 0x20,0x5f,0x31,0x31,0x34,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x73,0x6b,0x69, + 0x6e,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74, + 0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e, + 0x78,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x30,0x5d,0x2c,0x20,0x73,0x6b,0x69, + 0x6e,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74, + 0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e, + 0x78,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x31,0x5d,0x2c,0x20,0x73,0x6b,0x69, + 0x6e,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74, + 0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e, + 0x78,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x32,0x5d,0x2c,0x20,0x73,0x6b,0x69, + 0x6e,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74, + 0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e, + 0x78,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x33,0x5d,0x29,0x20,0x2a,0x20,0x61, + 0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x78,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x74,0x34,0x20,0x5f,0x31,0x32,0x33,0x20,0x3d, + 0x20,0x6d,0x61,0x74,0x34,0x28,0x73,0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72,0x74,0x65, + 0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65, + 0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x79,0x29,0x20,0x2a,0x20,0x34,0x20, + 0x2b,0x20,0x30,0x5d,0x2c,0x20,0x73,0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72,0x74,0x65, + 0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65, + 0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x79,0x29,0x20,0x2a,0x20,0x34,0x20, + 0x2b,0x20,0x31,0x5d,0x2c,0x20,0x73,0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72,0x74,0x65, + 0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65, + 0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x79,0x29,0x20,0x2a,0x20,0x34,0x20, + 0x2b,0x20,0x32,0x5d,0x2c,0x20,0x73,0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72,0x74,0x65, + 0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65, + 0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x79,0x29,0x20,0x2a,0x20,0x34,0x20, + 0x2b,0x20,0x33,0x5d,0x29,0x20,0x2a,0x20,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x77, + 0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61, + 0x74,0x34,0x20,0x5f,0x31,0x34,0x35,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x73, + 0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69, + 0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65, + 0x73,0x2e,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x30,0x5d,0x2c,0x20,0x73, + 0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69, + 0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65, + 0x73,0x2e,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x31,0x5d,0x2c,0x20,0x73, + 0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69, + 0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65, + 0x73,0x2e,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x32,0x5d,0x2c,0x20,0x73, + 0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69, + 0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65, + 0x73,0x2e,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x33,0x5d,0x29,0x20,0x2a, + 0x20,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e, + 0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x74,0x34,0x20,0x5f,0x31,0x36,0x37, + 0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x73,0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72, + 0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f, + 0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x77,0x29,0x20,0x2a,0x20, + 0x34,0x20,0x2b,0x20,0x30,0x5d,0x2c,0x20,0x73,0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72, + 0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f, + 0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x77,0x29,0x20,0x2a,0x20, + 0x34,0x20,0x2b,0x20,0x31,0x5d,0x2c,0x20,0x73,0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72, + 0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f, + 0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x77,0x29,0x20,0x2a,0x20, + 0x34,0x20,0x2b,0x20,0x32,0x5d,0x2c,0x20,0x73,0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72, + 0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x69,0x6e,0x74,0x28,0x61,0x5f,0x62,0x6f, + 0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x77,0x29,0x20,0x2a,0x20, + 0x34,0x20,0x2b,0x20,0x33,0x5d,0x29,0x20,0x2a,0x20,0x61,0x5f,0x62,0x6f,0x6e,0x65, + 0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x6d,0x61,0x74,0x34,0x20,0x5f,0x31,0x38,0x30,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34, + 0x28,0x28,0x28,0x5f,0x31,0x31,0x34,0x5b,0x30,0x5d,0x20,0x2b,0x20,0x5f,0x31,0x32, + 0x33,0x5b,0x30,0x5d,0x29,0x20,0x2b,0x20,0x5f,0x31,0x34,0x35,0x5b,0x30,0x5d,0x29, + 0x20,0x2b,0x20,0x5f,0x31,0x36,0x37,0x5b,0x30,0x5d,0x2c,0x20,0x28,0x28,0x5f,0x31, + 0x31,0x34,0x5b,0x31,0x5d,0x20,0x2b,0x20,0x5f,0x31,0x32,0x33,0x5b,0x31,0x5d,0x29, + 0x20,0x2b,0x20,0x5f,0x31,0x34,0x35,0x5b,0x31,0x5d,0x29,0x20,0x2b,0x20,0x5f,0x31, + 0x36,0x37,0x5b,0x31,0x5d,0x2c,0x20,0x28,0x28,0x5f,0x31,0x31,0x34,0x5b,0x32,0x5d, + 0x20,0x2b,0x20,0x5f,0x31,0x32,0x33,0x5b,0x32,0x5d,0x29,0x20,0x2b,0x20,0x5f,0x31, + 0x34,0x35,0x5b,0x32,0x5d,0x29,0x20,0x2b,0x20,0x5f,0x31,0x36,0x37,0x5b,0x32,0x5d, + 0x2c,0x20,0x28,0x28,0x5f,0x31,0x31,0x34,0x5b,0x33,0x5d,0x20,0x2b,0x20,0x5f,0x31, + 0x32,0x33,0x5b,0x33,0x5d,0x29,0x20,0x2b,0x20,0x5f,0x31,0x34,0x35,0x5b,0x33,0x5d, + 0x29,0x20,0x2b,0x20,0x5f,0x31,0x36,0x37,0x5b,0x33,0x5d,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x70,0x6f,0x73, + 0x20,0x3d,0x20,0x61,0x5f,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x69, + 0x6e,0x74,0x28,0x61,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64,0x65, + 0x78,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x31,0x39, + 0x30,0x20,0x3d,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x70,0x6f,0x73,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x31,0x39,0x31,0x20,0x3d,0x20,0x5f, + 0x31,0x39,0x30,0x20,0x2b,0x20,0x65,0x76,0x61,0x6c,0x75,0x61,0x74,0x65,0x5f,0x62, + 0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x28,0x70,0x61,0x72,0x61,0x6d, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x70,0x6f,0x73, + 0x20,0x3d,0x20,0x5f,0x31,0x39,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f, + 0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28, + 0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b, + 0x38,0x5d,0x2c,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f, + 0x75,0x62,0x6f,0x5b,0x39,0x5d,0x2c,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72, + 0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x31,0x30,0x5d,0x2c,0x20,0x6d,0x65,0x73, + 0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x5b,0x31,0x31,0x5d, + 0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x34,0x28,0x28,0x5f,0x31,0x38,0x30,0x20,0x2a, + 0x20,0x76,0x65,0x63,0x34,0x28,0x5f,0x31,0x39,0x31,0x2c,0x20,0x31,0x2e,0x30,0x29, + 0x29,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d, + 0x61,0x6c,0x69,0x7a,0x65,0x28,0x28,0x5f,0x31,0x38,0x30,0x20,0x2a,0x20,0x76,0x65, + 0x63,0x34,0x28,0x61,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2c,0x20,0x30,0x2e,0x30, + 0x29,0x29,0x2e,0x78,0x79,0x7a,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x5f,0x75, + 0x76,0x20,0x3d,0x20,0x61,0x5f,0x75,0x76,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, +}; +/* + #version 330 + + in vec3 v_normal; + in vec2 v_uv; + layout(location = 0) out vec4 o_color; + + void main() + { + float _33 = ((dot(v_normal, vec3(0.57735025882720947265625)) + (v_uv.x * 9.9999997473787516355514526367188e-05)) * 0.5) + 0.5; + o_color = vec4(_33, _33, _33, 1.0); + } + +*/ +static const char lit_pixel_source_glsl330[275] = { + 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x33,0x30,0x0a,0x0a,0x69,0x6e, + 0x20,0x76,0x65,0x63,0x33,0x20,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0a, + 0x69,0x6e,0x20,0x76,0x65,0x63,0x32,0x20,0x76,0x5f,0x75,0x76,0x3b,0x0a,0x6c,0x61, + 0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20, + 0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x34,0x20,0x6f,0x5f,0x63,0x6f, + 0x6c,0x6f,0x72,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28, + 0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33, + 0x33,0x20,0x3d,0x20,0x28,0x28,0x64,0x6f,0x74,0x28,0x76,0x5f,0x6e,0x6f,0x72,0x6d, + 0x61,0x6c,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e,0x35,0x37,0x37,0x33,0x35, + 0x30,0x32,0x35,0x38,0x38,0x32,0x37,0x32,0x30,0x39,0x34,0x37,0x32,0x36,0x35,0x36, + 0x32,0x35,0x29,0x29,0x20,0x2b,0x20,0x28,0x76,0x5f,0x75,0x76,0x2e,0x78,0x20,0x2a, + 0x20,0x39,0x2e,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x34,0x37,0x33,0x37,0x38,0x37, + 0x35,0x31,0x36,0x33,0x35,0x35,0x35,0x31,0x34,0x35,0x32,0x36,0x33,0x36,0x37,0x31, + 0x38,0x38,0x65,0x2d,0x30,0x35,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x20, + 0x2b,0x20,0x30,0x2e,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x5f,0x63,0x6f,0x6c, + 0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x5f,0x33,0x33,0x2c,0x20,0x5f, + 0x33,0x33,0x2c,0x20,0x5f,0x33,0x33,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x7d, + 0x0a,0x0a,0x00, +}; +/* + cbuffer mesh_vertex_ubo : register(b0) + { + row_major float4x4 _34_geometry_to_world : packoffset(c0); + row_major float4x4 _34_normal_to_world : packoffset(c4); + row_major float4x4 _34_world_to_clip : packoffset(c8); + float4 _34_blend_weights[16] : packoffset(c12); + float _34_f_num_blend_shapes : packoffset(c28); + }; + + Texture2DArray blend_shapes : register(t0); + SamplerState _blend_shapes_sampler : register(s0); + + static float4 gl_Position; + static float3 a_position; + static float a_vertex_index; + static float3 v_normal; + static float3 a_normal; + static float2 v_uv; + static float2 a_uv; + + struct SPIRV_Cross_Input + { + float3 a_position : TEXCOORD0; + float3 a_normal : TEXCOORD1; + float2 a_uv : TEXCOORD2; + float a_vertex_index : TEXCOORD3; + }; + + struct SPIRV_Cross_Output + { + float3 v_normal : TEXCOORD0; + float2 v_uv : TEXCOORD1; + float4 gl_Position : SV_Position; + }; + + #line 20 "mesh.glsl" + float3 evaluate_blend_shape(int vertex_index) + { + #line 20 "mesh.glsl" + int _21 = vertex_index & 2047; + int _24 = vertex_index >> 11; + #line 21 "mesh.glsl" + int _39 = int(_34_f_num_blend_shapes); + #line 22 "mesh.glsl" + float3 offset = 0.0f.xxx; + #line 23 "mesh.glsl" + for (int i = 0; i < _39; i++) + { + #line 24 "mesh.glsl" + float4 _packed = _34_blend_weights[i >> 2]; + #line 25 "mesh.glsl" + #line 26 "mesh.glsl" + offset += (blend_shapes.Load(int4(int3(_21, _24, i), 0)).xyz * _packed[i & 3]); + } + #line 28 "mesh.glsl" + return offset; + } + + #line 42 "mesh.glsl" + void vert_main() + { + #line 42 "mesh.glsl" + float3 local_pos = a_position; + #line 43 "mesh.glsl" + int param = int(a_vertex_index); + float3 _104 = local_pos; + float3 _105 = _104 + evaluate_blend_shape(param); + local_pos = _105; + #line 45 "mesh.glsl" + #line 46 "mesh.glsl" + gl_Position = mul(float4(mul(float4(_105, 1.0f), _34_geometry_to_world).xyz, 1.0f), _34_world_to_clip); + #line 47 "mesh.glsl" + v_normal = normalize(mul(float4(a_normal, 0.0f), _34_normal_to_world).xyz); + #line 48 "mesh.glsl" + v_uv = a_uv; + } + + SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) + { + a_position = stage_input.a_position; + a_vertex_index = stage_input.a_vertex_index; + a_normal = stage_input.a_normal; + a_uv = stage_input.a_uv; + vert_main(); + SPIRV_Cross_Output stage_output; + stage_output.gl_Position = gl_Position; + stage_output.v_normal = v_normal; + stage_output.v_uv = v_uv; + return stage_output; + } +*/ +static const uint8_t static_vertex_bytecode_hlsl5[2276] = { + 0x44,0x58,0x42,0x43,0x6c,0xed,0xd7,0x37,0xf7,0x0a,0xfa,0x2c,0xe9,0x2d,0x2c,0x39, + 0x0f,0x86,0xc9,0xbd,0x01,0x00,0x00,0x00,0xe4,0x08,0x00,0x00,0x05,0x00,0x00,0x00, + 0x34,0x00,0x00,0x00,0xcc,0x02,0x00,0x00,0x48,0x03,0x00,0x00,0xb8,0x03,0x00,0x00, + 0x48,0x08,0x00,0x00,0x52,0x44,0x45,0x46,0x90,0x02,0x00,0x00,0x01,0x00,0x00,0x00, + 0x9c,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x05,0xfe,0xff, + 0x10,0x81,0x00,0x00,0x68,0x02,0x00,0x00,0x52,0x44,0x31,0x31,0x3c,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x24,0x00,0x00,0x00, + 0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68, + 0x61,0x70,0x65,0x73,0x00,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78, + 0x5f,0x75,0x62,0x6f,0x00,0xab,0xab,0xab,0x89,0x00,0x00,0x00,0x05,0x00,0x00,0x00, + 0xb4,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x40,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0xd4,0x01,0x00,0x00,0x80,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x9c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xe6,0x01,0x00,0x00,0xc0,0x00,0x00,0x00, + 0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0x24,0x02,0x00,0x00,0xc0,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x5f,0x33,0x34,0x5f,0x67,0x65,0x6f,0x6d, + 0x65,0x74,0x72,0x79,0x5f,0x74,0x6f,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x00,0x66,0x6c, + 0x6f,0x61,0x74,0x34,0x78,0x34,0x00,0xab,0x02,0x00,0x03,0x00,0x04,0x00,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x01,0x00,0x00,0x5f,0x33,0x34,0x5f, + 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x5f,0x74,0x6f,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x00, + 0x5f,0x33,0x34,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x74,0x6f,0x5f,0x63,0x6c,0x69, + 0x70,0x00,0x5f,0x33,0x34,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x77,0x65,0x69,0x67, + 0x68,0x74,0x73,0x00,0x66,0x6c,0x6f,0x61,0x74,0x34,0x00,0xab,0x01,0x00,0x03,0x00, + 0x01,0x00,0x04,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00, + 0x5f,0x33,0x34,0x5f,0x66,0x5f,0x6e,0x75,0x6d,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f, + 0x73,0x68,0x61,0x70,0x65,0x73,0x00,0x66,0x6c,0x6f,0x61,0x74,0x00,0xab,0xab,0xab, + 0x00,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x3b,0x02,0x00,0x00,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x28,0x52, + 0x29,0x20,0x48,0x4c,0x53,0x4c,0x20,0x53,0x68,0x61,0x64,0x65,0x72,0x20,0x43,0x6f, + 0x6d,0x70,0x69,0x6c,0x65,0x72,0x20,0x31,0x30,0x2e,0x31,0x00,0x49,0x53,0x47,0x4e, + 0x74,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x68,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x07,0x07,0x00,0x00,0x68,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x07,0x00,0x00,0x68,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x03,0x03,0x00,0x00,0x68,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x54,0x45,0x58,0x43, + 0x4f,0x4f,0x52,0x44,0x00,0xab,0xab,0xab,0x4f,0x53,0x47,0x4e,0x68,0x00,0x00,0x00, + 0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x00,0x00, + 0x50,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, + 0x54,0x45,0x58,0x43,0x4f,0x4f,0x52,0x44,0x00,0x53,0x56,0x5f,0x50,0x6f,0x73,0x69, + 0x74,0x69,0x6f,0x6e,0x00,0xab,0xab,0xab,0x53,0x48,0x45,0x58,0x88,0x04,0x00,0x00, + 0x50,0x00,0x01,0x00,0x22,0x01,0x00,0x00,0x6a,0x08,0x00,0x01,0x35,0x18,0x00,0x00, + 0x12,0x00,0x00,0x00,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x80,0x3f,0x59,0x08,0x00,0x04,0x46,0x8e,0x20,0x00,0x00,0x00,0x00,0x00, + 0x1d,0x00,0x00,0x00,0x58,0x40,0x00,0x04,0x00,0x70,0x10,0x00,0x00,0x00,0x00,0x00, + 0x55,0x55,0x00,0x00,0x5f,0x00,0x00,0x03,0x72,0x10,0x10,0x00,0x00,0x00,0x00,0x00, + 0x5f,0x00,0x00,0x03,0x72,0x10,0x10,0x00,0x01,0x00,0x00,0x00,0x5f,0x00,0x00,0x03, + 0x32,0x10,0x10,0x00,0x02,0x00,0x00,0x00,0x5f,0x00,0x00,0x03,0x12,0x10,0x10,0x00, + 0x03,0x00,0x00,0x00,0x65,0x00,0x00,0x03,0x72,0x20,0x10,0x00,0x00,0x00,0x00,0x00, + 0x65,0x00,0x00,0x03,0x32,0x20,0x10,0x00,0x01,0x00,0x00,0x00,0x67,0x00,0x00,0x04, + 0xf2,0x20,0x10,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x00,0x02, + 0x04,0x00,0x00,0x00,0x1b,0x00,0x00,0x05,0x12,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x0a,0x10,0x10,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x07,0x12,0x00,0x10,0x00, + 0x01,0x00,0x00,0x00,0x0a,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00, + 0xff,0x07,0x00,0x00,0x2a,0x00,0x00,0x07,0x22,0x00,0x10,0x00,0x01,0x00,0x00,0x00, + 0x0a,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x0b,0x00,0x00,0x00, + 0x1b,0x00,0x00,0x06,0x12,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0a,0x80,0x20,0x00, + 0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x36,0x00,0x00,0x05,0x82,0x00,0x10,0x00, + 0x01,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x08, + 0xe2,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x05, + 0x42,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 0x30,0x00,0x00,0x01,0x21,0x00,0x00,0x07,0x12,0x00,0x10,0x00,0x02,0x00,0x00,0x00, + 0x2a,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x03,0x00,0x04,0x03,0x0a,0x00,0x10,0x00,0x02,0x00,0x00,0x00,0x2a,0x00,0x00,0x07, + 0x12,0x00,0x10,0x00,0x02,0x00,0x00,0x00,0x2a,0x00,0x10,0x00,0x01,0x00,0x00,0x00, + 0x01,0x40,0x00,0x00,0x02,0x00,0x00,0x00,0x2d,0x00,0x00,0x89,0x02,0x02,0x00,0x80, + 0x43,0x55,0x15,0x00,0xe2,0x00,0x10,0x00,0x02,0x00,0x00,0x00,0x46,0x0e,0x10,0x00, + 0x01,0x00,0x00,0x00,0x36,0x79,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x07, + 0x12,0x00,0x10,0x00,0x03,0x00,0x00,0x00,0x2a,0x00,0x10,0x00,0x01,0x00,0x00,0x00, + 0x01,0x40,0x00,0x00,0x03,0x00,0x00,0x00,0x11,0x00,0x00,0x0b,0x12,0x00,0x10,0x00, + 0x02,0x00,0x00,0x00,0x46,0x8e,0x20,0x06,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, + 0x0a,0x00,0x10,0x00,0x02,0x00,0x00,0x00,0x46,0x9e,0x90,0x00,0x0a,0x00,0x10,0x00, + 0x03,0x00,0x00,0x00,0x32,0x00,0x00,0x09,0xe2,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x56,0x0e,0x10,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x10,0x00,0x02,0x00,0x00,0x00, + 0x56,0x0e,0x10,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x07,0x42,0x00,0x10,0x00, + 0x01,0x00,0x00,0x00,0x2a,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x01,0x40,0x00,0x00, + 0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x72,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x96,0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x12,0x10,0x00, + 0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x08,0x72,0x00,0x10,0x00,0x01,0x00,0x00,0x00, + 0x56,0x05,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x82,0x20,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x32,0x00,0x00,0x0a,0xb2,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x06,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x88,0x20,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x46,0x08,0x10,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x00,0x0a, + 0x72,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0xa6,0x0a,0x10,0x00,0x00,0x00,0x00,0x00, + 0x46,0x82,0x20,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x46,0x03,0x10,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x72,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x46,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x82,0x20,0x00,0x00,0x00,0x00,0x00, + 0x03,0x00,0x00,0x00,0x38,0x00,0x00,0x08,0xf2,0x00,0x10,0x00,0x01,0x00,0x00,0x00, + 0x56,0x05,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x8e,0x20,0x00,0x00,0x00,0x00,0x00, + 0x09,0x00,0x00,0x00,0x32,0x00,0x00,0x0a,0xf2,0x00,0x10,0x00,0x01,0x00,0x00,0x00, + 0x06,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x8e,0x20,0x00,0x00,0x00,0x00,0x00, + 0x08,0x00,0x00,0x00,0x46,0x0e,0x10,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x00,0x0a, + 0xf2,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0xa6,0x0a,0x10,0x00,0x00,0x00,0x00,0x00, + 0x46,0x8e,0x20,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x46,0x0e,0x10,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xf2,0x20,0x10,0x00,0x02,0x00,0x00,0x00, + 0x46,0x0e,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x8e,0x20,0x00,0x00,0x00,0x00,0x00, + 0x0b,0x00,0x00,0x00,0x38,0x00,0x00,0x08,0x72,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x56,0x15,0x10,0x00,0x01,0x00,0x00,0x00,0x46,0x82,0x20,0x00,0x00,0x00,0x00,0x00, + 0x05,0x00,0x00,0x00,0x32,0x00,0x00,0x0a,0x72,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x06,0x10,0x10,0x00,0x01,0x00,0x00,0x00,0x46,0x82,0x20,0x00,0x00,0x00,0x00,0x00, + 0x04,0x00,0x00,0x00,0x46,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x0a, + 0x72,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0xa6,0x1a,0x10,0x00,0x01,0x00,0x00,0x00, + 0x46,0x82,0x20,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x07,0x82,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x46,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x00,0x00,0x00,0x00,0x00, + 0x44,0x00,0x00,0x05,0x82,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x07,0x72,0x20,0x10,0x00,0x00,0x00,0x00,0x00, + 0xf6,0x0f,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x00,0x00,0x00,0x00,0x00, + 0x36,0x00,0x00,0x05,0x32,0x20,0x10,0x00,0x01,0x00,0x00,0x00,0x46,0x10,0x10,0x00, + 0x02,0x00,0x00,0x00,0x3e,0x00,0x00,0x01,0x53,0x54,0x41,0x54,0x94,0x00,0x00,0x00, + 0x22,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00, + 0x11,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, +}; +/* + cbuffer mesh_vertex_ubo : register(b0) + { + row_major float4x4 _34_geometry_to_world : packoffset(c0); + row_major float4x4 _34_normal_to_world : packoffset(c4); + row_major float4x4 _34_world_to_clip : packoffset(c8); + float4 _34_blend_weights[16] : packoffset(c12); + float _34_f_num_blend_shapes : packoffset(c28); + }; + + cbuffer skin_vertex_ubo : register(b1) + { + row_major float4x4 _100_bones[64] : packoffset(c0); + }; + + Texture2DArray blend_shapes : register(t0); + SamplerState _blend_shapes_sampler : register(s0); + + static float4 gl_Position; + static int4 a_bone_indices; + static float4 a_bone_weights; + static float3 a_position; + static float a_vertex_index; + static float3 a_normal; + static float3 v_normal; + static float2 v_uv; + static float2 a_uv; + + struct SPIRV_Cross_Input + { + float3 a_position : TEXCOORD0; + float3 a_normal : TEXCOORD1; + float2 a_uv : TEXCOORD2; + float a_vertex_index : TEXCOORD3; + int4 a_bone_indices : TEXCOORD4; + float4 a_bone_weights : TEXCOORD5; + }; + + struct SPIRV_Cross_Output + { + float3 v_normal : TEXCOORD0; + float2 v_uv : TEXCOORD1; + float4 gl_Position : SV_Position; + }; + + #line 20 "mesh.glsl" + float3 evaluate_blend_shape(int vertex_index) + { + #line 20 "mesh.glsl" + int _21 = vertex_index & 2047; + int _24 = vertex_index >> 11; + #line 21 "mesh.glsl" + int _39 = int(_34_f_num_blend_shapes); + #line 22 "mesh.glsl" + float3 offset = 0.0f.xxx; + #line 23 "mesh.glsl" + for (int i = 0; i < _39; i++) + { + #line 24 "mesh.glsl" + float4 _packed = _34_blend_weights[i >> 2]; + #line 25 "mesh.glsl" + #line 26 "mesh.glsl" + offset += (blend_shapes.Load(int4(int3(_21, _24, i), 0)).xyz * _packed[i & 3]); + } + #line 28 "mesh.glsl" + return offset; + } + + #line 52 "mesh.glsl" + void vert_main() + { + #line 52 "mesh.glsl" + #line 56 "mesh.glsl" + #line 55 "mesh.glsl" + #line 54 "mesh.glsl" + #line 53 "mesh.glsl" + float4x4 _116 = _100_bones[a_bone_indices.x] * a_bone_weights.x; + #line 54 "mesh.glsl" + float4x4 _124 = _100_bones[a_bone_indices.y] * a_bone_weights.y; + #line 55 "mesh.glsl" + float4x4 _145 = _100_bones[a_bone_indices.z] * a_bone_weights.z; + #line 56 "mesh.glsl" + float4x4 _166 = _100_bones[a_bone_indices.w] * a_bone_weights.w; + float4x4 _179 = float4x4(((_116[0] + _124[0]) + _145[0]) + _166[0], ((_116[1] + _124[1]) + _145[1]) + _166[1], ((_116[2] + _124[2]) + _145[2]) + _166[2], ((_116[3] + _124[3]) + _145[3]) + _166[3]); + #line 58 "mesh.glsl" + float3 local_pos = a_position; + #line 59 "mesh.glsl" + int param = int(a_vertex_index); + float3 _189 = local_pos; + float3 _190 = _189 + evaluate_blend_shape(param); + local_pos = _190; + #line 60 "mesh.glsl" + #line 61 "mesh.glsl" + #line 63 "mesh.glsl" + gl_Position = mul(float4(mul(float4(_190, 1.0f), _179).xyz, 1.0f), _34_world_to_clip); + #line 64 "mesh.glsl" + v_normal = normalize(mul(float4(a_normal, 0.0f), _179).xyz); + #line 65 "mesh.glsl" + v_uv = a_uv; + } + + SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) + { + a_bone_indices = stage_input.a_bone_indices; + a_bone_weights = stage_input.a_bone_weights; + a_position = stage_input.a_position; + a_vertex_index = stage_input.a_vertex_index; + a_normal = stage_input.a_normal; + a_uv = stage_input.a_uv; + vert_main(); + SPIRV_Cross_Output stage_output; + stage_output.gl_Position = gl_Position; + stage_output.v_normal = v_normal; + stage_output.v_uv = v_uv; + return stage_output; + } +*/ +static const uint8_t skinned_vertex_bytecode_hlsl5[3256] = { + 0x44,0x58,0x42,0x43,0x5a,0x40,0xb2,0x39,0x29,0x69,0xf1,0xab,0x52,0xfb,0x80,0xe4, + 0xe1,0xd6,0xbd,0x80,0x01,0x00,0x00,0x00,0xb8,0x0c,0x00,0x00,0x05,0x00,0x00,0x00, + 0x34,0x00,0x00,0x00,0x6c,0x03,0x00,0x00,0x18,0x04,0x00,0x00,0x88,0x04,0x00,0x00, + 0x1c,0x0c,0x00,0x00,0x52,0x44,0x45,0x46,0x30,0x03,0x00,0x00,0x02,0x00,0x00,0x00, + 0xcc,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x05,0xfe,0xff, + 0x10,0x81,0x00,0x00,0x08,0x03,0x00,0x00,0x52,0x44,0x31,0x31,0x3c,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x24,0x00,0x00,0x00, + 0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68, + 0x61,0x70,0x65,0x73,0x00,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78, + 0x5f,0x75,0x62,0x6f,0x00,0x73,0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72,0x74,0x65,0x78, + 0x5f,0x75,0x62,0x6f,0x00,0xab,0xab,0xab,0xa9,0x00,0x00,0x00,0x05,0x00,0x00,0x00, + 0xfc,0x00,0x00,0x00,0xd0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xb9,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb0,0x02,0x00,0x00,0x00,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0x08,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x80,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xe4,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0x2e,0x02,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x00, + 0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x6c,0x02,0x00,0x00,0xc0,0x01,0x00,0x00, + 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x8c,0x02,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0x5f,0x33,0x34,0x5f,0x67,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x5f,0x74,0x6f,0x5f, + 0x77,0x6f,0x72,0x6c,0x64,0x00,0x66,0x6c,0x6f,0x61,0x74,0x34,0x78,0x34,0x00,0xab, + 0x02,0x00,0x03,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xda,0x01,0x00,0x00,0x5f,0x33,0x34,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x5f,0x74, + 0x6f,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x00,0x5f,0x33,0x34,0x5f,0x77,0x6f,0x72,0x6c, + 0x64,0x5f,0x74,0x6f,0x5f,0x63,0x6c,0x69,0x70,0x00,0x5f,0x33,0x34,0x5f,0x62,0x6c, + 0x65,0x6e,0x64,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x00,0x66,0x6c,0x6f,0x61, + 0x74,0x34,0x00,0xab,0x01,0x00,0x03,0x00,0x01,0x00,0x04,0x00,0x10,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x5f,0x33,0x34,0x5f,0x66,0x5f,0x6e,0x75, + 0x6d,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x00,0x66, + 0x6c,0x6f,0x61,0x74,0x00,0xab,0xab,0xab,0x00,0x00,0x03,0x00,0x01,0x00,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x02,0x00,0x00,0xd8,0x02,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x02,0x00,0x00,0x00,0xe4,0x02,0x00,0x00, + 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, + 0x00,0x00,0x00,0x00,0x5f,0x31,0x30,0x30,0x5f,0x62,0x6f,0x6e,0x65,0x73,0x00,0xab, + 0x02,0x00,0x03,0x00,0x04,0x00,0x04,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xda,0x01,0x00,0x00,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x28,0x52, + 0x29,0x20,0x48,0x4c,0x53,0x4c,0x20,0x53,0x68,0x61,0x64,0x65,0x72,0x20,0x43,0x6f, + 0x6d,0x70,0x69,0x6c,0x65,0x72,0x20,0x31,0x30,0x2e,0x31,0x00,0x49,0x53,0x47,0x4e, + 0xa4,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x98,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x07,0x07,0x00,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x07,0x00,0x00,0x98,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x03,0x03,0x00,0x00,0x98,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x98,0x00,0x00,0x00, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x0f,0x0f,0x00,0x00,0x98,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0f,0x0f,0x00,0x00,0x54,0x45,0x58,0x43, + 0x4f,0x4f,0x52,0x44,0x00,0xab,0xab,0xab,0x4f,0x53,0x47,0x4e,0x68,0x00,0x00,0x00, + 0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x00,0x00, + 0x50,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x03,0x0c,0x00,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, + 0x54,0x45,0x58,0x43,0x4f,0x4f,0x52,0x44,0x00,0x53,0x56,0x5f,0x50,0x6f,0x73,0x69, + 0x74,0x69,0x6f,0x6e,0x00,0xab,0xab,0xab,0x53,0x48,0x45,0x58,0x8c,0x07,0x00,0x00, + 0x50,0x00,0x01,0x00,0xe3,0x01,0x00,0x00,0x6a,0x08,0x00,0x01,0x35,0x18,0x00,0x00, + 0x12,0x00,0x00,0x00,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x80,0x3f,0x59,0x08,0x00,0x04,0x46,0x8e,0x20,0x00,0x00,0x00,0x00,0x00, + 0x1d,0x00,0x00,0x00,0x59,0x08,0x00,0x04,0x46,0x8e,0x20,0x00,0x01,0x00,0x00,0x00, + 0x00,0x01,0x00,0x00,0x58,0x40,0x00,0x04,0x00,0x70,0x10,0x00,0x00,0x00,0x00,0x00, + 0x55,0x55,0x00,0x00,0x5f,0x00,0x00,0x03,0x72,0x10,0x10,0x00,0x00,0x00,0x00,0x00, + 0x5f,0x00,0x00,0x03,0x72,0x10,0x10,0x00,0x01,0x00,0x00,0x00,0x5f,0x00,0x00,0x03, + 0x32,0x10,0x10,0x00,0x02,0x00,0x00,0x00,0x5f,0x00,0x00,0x03,0x12,0x10,0x10,0x00, + 0x03,0x00,0x00,0x00,0x5f,0x00,0x00,0x03,0xf2,0x10,0x10,0x00,0x04,0x00,0x00,0x00, + 0x5f,0x00,0x00,0x03,0xf2,0x10,0x10,0x00,0x05,0x00,0x00,0x00,0x65,0x00,0x00,0x03, + 0x72,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x00,0x03,0x32,0x20,0x10,0x00, + 0x01,0x00,0x00,0x00,0x67,0x00,0x00,0x04,0xf2,0x20,0x10,0x00,0x02,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x68,0x00,0x00,0x02,0x07,0x00,0x00,0x00,0x29,0x00,0x00,0x0a, + 0xf2,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x1e,0x10,0x00,0x04,0x00,0x00,0x00, + 0x02,0x40,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0x38,0x00,0x00,0x09,0x72,0x00,0x10,0x00,0x01,0x00,0x00,0x00, + 0x56,0x15,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x82,0x20,0x04,0x01,0x00,0x00,0x00, + 0x1a,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x0a,0x72,0x00,0x10,0x00, + 0x02,0x00,0x00,0x00,0x56,0x15,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x82,0x20,0x06, + 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1a,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x38,0x00,0x00,0x0a,0x72,0x00,0x10,0x00,0x03,0x00,0x00,0x00,0x56,0x15,0x10,0x00, + 0x05,0x00,0x00,0x00,0x46,0x82,0x20,0x06,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x1a,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x0a,0x72,0x00,0x10,0x00, + 0x04,0x00,0x00,0x00,0x56,0x15,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x82,0x20,0x06, + 0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1a,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x32,0x00,0x00,0x0b,0x72,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x46,0x82,0x20,0x04, + 0x01,0x00,0x00,0x00,0x0a,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x06,0x10,0x10,0x00, + 0x05,0x00,0x00,0x00,0x46,0x02,0x10,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x00,0x0b, + 0x72,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x46,0x82,0x20,0x04,0x01,0x00,0x00,0x00, + 0x2a,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0xa6,0x1a,0x10,0x00,0x05,0x00,0x00,0x00, + 0x46,0x02,0x10,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x00,0x0b,0x72,0x00,0x10,0x00, + 0x01,0x00,0x00,0x00,0x46,0x82,0x20,0x04,0x01,0x00,0x00,0x00,0x3a,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0xf6,0x1f,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x01,0x00,0x00,0x00,0x32,0x00,0x00,0x0c,0x72,0x00,0x10,0x00,0x02,0x00,0x00,0x00, + 0x46,0x82,0x20,0x06,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x06,0x10,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x02,0x00,0x00,0x00,0x32,0x00,0x00,0x0c,0x72,0x00,0x10,0x00,0x02,0x00,0x00,0x00, + 0x46,0x82,0x20,0x06,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x2a,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0xa6,0x1a,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x02,0x00,0x00,0x00,0x32,0x00,0x00,0x0c,0x72,0x00,0x10,0x00,0x02,0x00,0x00,0x00, + 0x46,0x82,0x20,0x06,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3a,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0xf6,0x1f,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x02,0x00,0x00,0x00,0x32,0x00,0x00,0x0c,0x72,0x00,0x10,0x00,0x03,0x00,0x00,0x00, + 0x46,0x82,0x20,0x06,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0a,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x06,0x10,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x03,0x00,0x00,0x00,0x32,0x00,0x00,0x0c,0x72,0x00,0x10,0x00,0x03,0x00,0x00,0x00, + 0x46,0x82,0x20,0x06,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x2a,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0xa6,0x1a,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x03,0x00,0x00,0x00,0x32,0x00,0x00,0x0c,0x72,0x00,0x10,0x00,0x03,0x00,0x00,0x00, + 0x46,0x82,0x20,0x06,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x3a,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0xf6,0x1f,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x03,0x00,0x00,0x00,0x32,0x00,0x00,0x0c,0x72,0x00,0x10,0x00,0x04,0x00,0x00,0x00, + 0x46,0x82,0x20,0x06,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x06,0x10,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x04,0x00,0x00,0x00,0x32,0x00,0x00,0x0c,0x72,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x46,0x82,0x20,0x06,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x2a,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0xa6,0x1a,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x04,0x00,0x00,0x00,0x32,0x00,0x00,0x0c,0x72,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x46,0x82,0x20,0x06,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x3a,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0xf6,0x1f,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x05,0x82,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x0a,0x10,0x10,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x07,0x12,0x00,0x10,0x00, + 0x04,0x00,0x00,0x00,0x3a,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00, + 0xff,0x07,0x00,0x00,0x2a,0x00,0x00,0x07,0x22,0x00,0x10,0x00,0x04,0x00,0x00,0x00, + 0x3a,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x0b,0x00,0x00,0x00, + 0x1b,0x00,0x00,0x06,0x82,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0a,0x80,0x20,0x00, + 0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x36,0x00,0x00,0x05,0x82,0x00,0x10,0x00, + 0x04,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x08, + 0x72,0x00,0x10,0x00,0x05,0x00,0x00,0x00,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x05, + 0x42,0x00,0x10,0x00,0x04,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 0x30,0x00,0x00,0x01,0x21,0x00,0x00,0x07,0x82,0x00,0x10,0x00,0x01,0x00,0x00,0x00, + 0x2a,0x00,0x10,0x00,0x04,0x00,0x00,0x00,0x3a,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x03,0x00,0x04,0x03,0x3a,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x2a,0x00,0x00,0x07, + 0x82,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x2a,0x00,0x10,0x00,0x04,0x00,0x00,0x00, + 0x01,0x40,0x00,0x00,0x02,0x00,0x00,0x00,0x2d,0x00,0x00,0x89,0x02,0x02,0x00,0x80, + 0x43,0x55,0x15,0x00,0x72,0x00,0x10,0x00,0x06,0x00,0x00,0x00,0x46,0x0e,0x10,0x00, + 0x04,0x00,0x00,0x00,0x46,0x7e,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x07, + 0x82,0x00,0x10,0x00,0x02,0x00,0x00,0x00,0x2a,0x00,0x10,0x00,0x04,0x00,0x00,0x00, + 0x01,0x40,0x00,0x00,0x03,0x00,0x00,0x00,0x11,0x00,0x00,0x0b,0x82,0x00,0x10,0x00, + 0x01,0x00,0x00,0x00,0x46,0x8e,0x20,0x06,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, + 0x3a,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x46,0x9e,0x90,0x00,0x3a,0x00,0x10,0x00, + 0x02,0x00,0x00,0x00,0x32,0x00,0x00,0x09,0x72,0x00,0x10,0x00,0x05,0x00,0x00,0x00, + 0x46,0x02,0x10,0x00,0x06,0x00,0x00,0x00,0xf6,0x0f,0x10,0x00,0x01,0x00,0x00,0x00, + 0x46,0x02,0x10,0x00,0x05,0x00,0x00,0x00,0x1e,0x00,0x00,0x07,0x42,0x00,0x10,0x00, + 0x04,0x00,0x00,0x00,0x2a,0x00,0x10,0x00,0x04,0x00,0x00,0x00,0x01,0x40,0x00,0x00, + 0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x72,0x00,0x10,0x00, + 0x04,0x00,0x00,0x00,0x46,0x02,0x10,0x00,0x05,0x00,0x00,0x00,0x46,0x12,0x10,0x00, + 0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x07,0x72,0x00,0x10,0x00,0x05,0x00,0x00,0x00, + 0x46,0x02,0x10,0x00,0x02,0x00,0x00,0x00,0x56,0x05,0x10,0x00,0x04,0x00,0x00,0x00, + 0x32,0x00,0x00,0x09,0xb2,0x00,0x10,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x10,0x00, + 0x04,0x00,0x00,0x00,0x46,0x08,0x10,0x00,0x01,0x00,0x00,0x00,0x46,0x08,0x10,0x00, + 0x05,0x00,0x00,0x00,0x32,0x00,0x00,0x09,0x72,0x00,0x10,0x00,0x04,0x00,0x00,0x00, + 0xa6,0x0a,0x10,0x00,0x04,0x00,0x00,0x00,0x46,0x02,0x10,0x00,0x03,0x00,0x00,0x00, + 0x46,0x03,0x10,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x72,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x08,0xf2,0x00,0x10,0x00,0x04,0x00,0x00,0x00, + 0x56,0x05,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x8e,0x20,0x00,0x00,0x00,0x00,0x00, + 0x09,0x00,0x00,0x00,0x32,0x00,0x00,0x0a,0xf2,0x00,0x10,0x00,0x04,0x00,0x00,0x00, + 0x06,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x8e,0x20,0x00,0x00,0x00,0x00,0x00, + 0x08,0x00,0x00,0x00,0x46,0x0e,0x10,0x00,0x04,0x00,0x00,0x00,0x32,0x00,0x00,0x0a, + 0xf2,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0xa6,0x0a,0x10,0x00,0x00,0x00,0x00,0x00, + 0x46,0x8e,0x20,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x46,0x0e,0x10,0x00, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xf2,0x20,0x10,0x00,0x02,0x00,0x00,0x00, + 0x46,0x0e,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x8e,0x20,0x00,0x00,0x00,0x00,0x00, + 0x0b,0x00,0x00,0x00,0x38,0x00,0x00,0x07,0x72,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x46,0x02,0x10,0x00,0x02,0x00,0x00,0x00,0x56,0x15,0x10,0x00,0x01,0x00,0x00,0x00, + 0x32,0x00,0x00,0x09,0x72,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x06,0x10,0x10,0x00, + 0x01,0x00,0x00,0x00,0x46,0x02,0x10,0x00,0x01,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x09,0x72,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0xa6,0x1a,0x10,0x00,0x01,0x00,0x00,0x00,0x46,0x02,0x10,0x00,0x03,0x00,0x00,0x00, + 0x46,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x07,0x82,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x05,0x82,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x3a,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x07,0x72,0x20,0x10,0x00, + 0x00,0x00,0x00,0x00,0xf6,0x0f,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x02,0x10,0x00, + 0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x05,0x32,0x20,0x10,0x00,0x01,0x00,0x00,0x00, + 0x46,0x10,0x10,0x00,0x02,0x00,0x00,0x00,0x3e,0x00,0x00,0x01,0x53,0x54,0x41,0x54, + 0x94,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x09,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; +/* + static float3 v_normal; + static float2 v_uv; + static float4 o_color; + + struct SPIRV_Cross_Input + { + float3 v_normal : TEXCOORD0; + float2 v_uv : TEXCOORD1; + }; + + struct SPIRV_Cross_Output + { + float4 o_color : SV_Target0; + }; + + #line 14 "mesh.glsl" + void frag_main() + { + #line 14 "mesh.glsl" + #line 15 "mesh.glsl" + #line 16 "mesh.glsl" + float _33 = ((dot(v_normal, 0.57735025882720947265625f.xxx) + (v_uv.x * 9.9999997473787516355514526367188e-05f)) * 0.5f) + 0.5f; + #line 17 "mesh.glsl" + o_color = float4(_33, _33, _33, 1.0f); + } + + SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) + { + v_normal = stage_input.v_normal; + v_uv = stage_input.v_uv; + frag_main(); + SPIRV_Cross_Output stage_output; + stage_output.o_color = o_color; + return stage_output; + } +*/ +static const uint8_t lit_pixel_bytecode_hlsl5[668] = { + 0x44,0x58,0x42,0x43,0x50,0xf7,0x82,0xcc,0x02,0xd4,0xfd,0xd7,0x10,0x5d,0x90,0x3b, + 0x73,0xee,0x77,0x0c,0x01,0x00,0x00,0x00,0x9c,0x02,0x00,0x00,0x05,0x00,0x00,0x00, + 0x34,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x20,0x01,0x00,0x00, + 0x00,0x02,0x00,0x00,0x52,0x44,0x45,0x46,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x05,0xff,0xff, + 0x10,0x81,0x00,0x00,0x3c,0x00,0x00,0x00,0x52,0x44,0x31,0x31,0x3c,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x24,0x00,0x00,0x00, + 0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66, + 0x74,0x20,0x28,0x52,0x29,0x20,0x48,0x4c,0x53,0x4c,0x20,0x53,0x68,0x61,0x64,0x65, + 0x72,0x20,0x43,0x6f,0x6d,0x70,0x69,0x6c,0x65,0x72,0x20,0x31,0x30,0x2e,0x31,0x00, + 0x49,0x53,0x47,0x4e,0x44,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00, + 0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x07,0x07,0x00,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x00, + 0x54,0x45,0x58,0x43,0x4f,0x4f,0x52,0x44,0x00,0xab,0xab,0xab,0x4f,0x53,0x47,0x4e, + 0x2c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x20,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0f,0x00,0x00,0x00,0x53,0x56,0x5f,0x54,0x61,0x72,0x67,0x65,0x74,0x00,0xab,0xab, + 0x53,0x48,0x45,0x58,0xd8,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x36,0x00,0x00,0x00, + 0x6a,0x08,0x00,0x01,0x62,0x10,0x00,0x03,0x72,0x10,0x10,0x00,0x00,0x00,0x00,0x00, + 0x62,0x10,0x00,0x03,0x12,0x10,0x10,0x00,0x01,0x00,0x00,0x00,0x65,0x00,0x00,0x03, + 0xf2,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x02,0x01,0x00,0x00,0x00, + 0x10,0x00,0x00,0x0a,0x12,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x12,0x10,0x00, + 0x00,0x00,0x00,0x00,0x02,0x40,0x00,0x00,0x3a,0xcd,0x13,0x3f,0x3a,0xcd,0x13,0x3f, + 0x3a,0xcd,0x13,0x3f,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x09,0x12,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x0a,0x10,0x10,0x00,0x01,0x00,0x00,0x00,0x01,0x40,0x00,0x00, + 0x17,0xb7,0xd1,0x38,0x0a,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x0f, + 0x72,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f, + 0x00,0x00,0x00,0x00,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f, + 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x05,0x82,0x20,0x10,0x00, + 0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x80,0x3f,0x3e,0x00,0x00,0x01, + 0x53,0x54,0x41,0x54,0x94,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; +/* + #pragma clang diagnostic ignored "-Wmissing-prototypes" + + #include + #include + + using namespace metal; + + struct mesh_vertex_ubo + { + float4x4 geometry_to_world; + float4x4 normal_to_world; + float4x4 world_to_clip; + float4 blend_weights[16]; + float f_num_blend_shapes; + }; + + struct main0_out + { + float3 v_normal [[user(locn0)]]; + float2 v_uv [[user(locn1)]]; + float4 gl_Position [[position]]; + }; + + struct main0_in + { + float3 a_position [[attribute(0)]]; + float3 a_normal [[attribute(1)]]; + float2 a_uv [[attribute(2)]]; + float a_vertex_index [[attribute(3)]]; + }; + + #line 20 "mesh.glsl" + static inline __attribute__((always_inline)) + float3 evaluate_blend_shape(thread const int& vertex_index, constant mesh_vertex_ubo& v_34, thread texture2d_array blend_shapes, thread const sampler blend_shapesSmplr) + { + #line 20 "mesh.glsl" + int _21 = vertex_index & 2047; + int _24 = vertex_index >> 11; + #line 21 "mesh.glsl" + int _39 = int(v_34.f_num_blend_shapes); + #line 22 "mesh.glsl" + float3 offset = float3(0.0); + #line 23 "mesh.glsl" + for (int i = 0; i < _39; i++) + { + #line 24 "mesh.glsl" + float4 _packed = v_34.blend_weights[i >> 2]; + #line 25 "mesh.glsl" + #line 26 "mesh.glsl" + int3 _81 = int3(_21, _24, i); + offset += (blend_shapes.read(uint2(_81.xy), uint(_81.z), 0).xyz * _packed[i & 3]); + } + #line 28 "mesh.glsl" + return offset; + } + + #line 42 "mesh.glsl" + vertex main0_out main0(main0_in in [[stage_in]], constant mesh_vertex_ubo& v_34 [[buffer(0)]], texture2d_array blend_shapes [[texture(0)]], sampler blend_shapesSmplr [[sampler(0)]]) + { + main0_out out = {}; + #line 42 "mesh.glsl" + float3 local_pos = in.a_position; + #line 43 "mesh.glsl" + int param = int(in.a_vertex_index); + float3 _104 = local_pos; + float3 _105 = _104 + evaluate_blend_shape(param, v_34, blend_shapes, blend_shapesSmplr); + local_pos = _105; + #line 45 "mesh.glsl" + #line 46 "mesh.glsl" + out.gl_Position = v_34.world_to_clip * float4((v_34.geometry_to_world * float4(_105, 1.0)).xyz, 1.0); + #line 47 "mesh.glsl" + out.v_normal = fast::normalize((v_34.normal_to_world * float4(in.a_normal, 0.0)).xyz); + #line 48 "mesh.glsl" + out.v_uv = in.a_uv; + return out; + } + +*/ +static const char static_vertex_source_metal_macos[2248] = { + 0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x63,0x6c,0x61,0x6e,0x67,0x20,0x64,0x69, + 0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x20,0x69,0x67,0x6e,0x6f,0x72,0x65,0x64, + 0x20,0x22,0x2d,0x57,0x6d,0x69,0x73,0x73,0x69,0x6e,0x67,0x2d,0x70,0x72,0x6f,0x74, + 0x6f,0x74,0x79,0x70,0x65,0x73,0x22,0x0a,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64, + 0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,0x73,0x74,0x64,0x6c,0x69,0x62,0x3e, + 0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f, + 0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,0x75,0x73,0x69,0x6e,0x67,0x20,0x6e, + 0x61,0x6d,0x65,0x73,0x70,0x61,0x63,0x65,0x20,0x6d,0x65,0x74,0x61,0x6c,0x3b,0x0a, + 0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72, + 0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x67,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x5f, + 0x74,0x6f,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x5f,0x74,0x6f, + 0x5f,0x77,0x6f,0x72,0x6c,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x34,0x78,0x34,0x20,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x74,0x6f,0x5f,0x63,0x6c, + 0x69,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x62, + 0x6c,0x65,0x6e,0x64,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5b,0x31,0x36,0x5d, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x66,0x5f,0x6e,0x75, + 0x6d,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x3b,0x0a, + 0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30, + 0x5f,0x6f,0x75,0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x33,0x20,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x5b,0x5b,0x75,0x73,0x65, + 0x72,0x28,0x6c,0x6f,0x63,0x6e,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x76,0x5f,0x75,0x76,0x20,0x5b,0x5b,0x75,0x73, + 0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x31,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74, + 0x69,0x6f,0x6e,0x20,0x5b,0x5b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x5d,0x5d, + 0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x61,0x69, + 0x6e,0x30,0x5f,0x69,0x6e,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x33,0x20,0x61,0x5f,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x5b,0x5b, + 0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x30,0x29,0x5d,0x5d,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x61,0x5f,0x6e,0x6f,0x72, + 0x6d,0x61,0x6c,0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28, + 0x31,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32, + 0x20,0x61,0x5f,0x75,0x76,0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74, + 0x65,0x28,0x32,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x20,0x61,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64,0x65,0x78, + 0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x33,0x29,0x5d, + 0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x30,0x20, + 0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x73,0x74,0x61,0x74, + 0x69,0x63,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72, + 0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79,0x73,0x5f, + 0x69,0x6e,0x6c,0x69,0x6e,0x65,0x29,0x29,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20, + 0x65,0x76,0x61,0x6c,0x75,0x61,0x74,0x65,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73, + 0x68,0x61,0x70,0x65,0x28,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73, + 0x74,0x20,0x69,0x6e,0x74,0x26,0x20,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e, + 0x64,0x65,0x78,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x6d,0x65, + 0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x26,0x20,0x76, + 0x5f,0x33,0x34,0x2c,0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x74,0x65,0x78,0x74, + 0x75,0x72,0x65,0x32,0x64,0x5f,0x61,0x72,0x72,0x61,0x79,0x3c,0x66,0x6c,0x6f,0x61, + 0x74,0x3e,0x20,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x2c, + 0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x73,0x61, + 0x6d,0x70,0x6c,0x65,0x72,0x20,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70, + 0x65,0x73,0x53,0x6d,0x70,0x6c,0x72,0x29,0x0a,0x7b,0x0a,0x23,0x6c,0x69,0x6e,0x65, + 0x20,0x32,0x30,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a, + 0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x32,0x31,0x20,0x3d,0x20,0x76,0x65, + 0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x26,0x20,0x32,0x30,0x34, + 0x37,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x32,0x34,0x20,0x3d, + 0x20,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x3e,0x3e, + 0x20,0x31,0x31,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x31,0x20,0x22,0x6d, + 0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e, + 0x74,0x20,0x5f,0x33,0x39,0x20,0x3d,0x20,0x69,0x6e,0x74,0x28,0x76,0x5f,0x33,0x34, + 0x2e,0x66,0x5f,0x6e,0x75,0x6d,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61, + 0x70,0x65,0x73,0x29,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x32,0x20,0x22, + 0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x33,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x33,0x28,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x23,0x6c,0x69,0x6e, + 0x65,0x20,0x32,0x33,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20, + 0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x5f,0x33,0x39,0x3b,0x20,0x69,0x2b, + 0x2b,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32, + 0x34,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x70,0x61, + 0x63,0x6b,0x65,0x64,0x20,0x3d,0x20,0x76,0x5f,0x33,0x34,0x2e,0x62,0x6c,0x65,0x6e, + 0x64,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5b,0x69,0x20,0x3e,0x3e,0x20,0x32, + 0x5d,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x35,0x20,0x22,0x6d,0x65,0x73, + 0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x36, + 0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x33,0x20,0x5f,0x38,0x31,0x20,0x3d,0x20, + 0x69,0x6e,0x74,0x33,0x28,0x5f,0x32,0x31,0x2c,0x20,0x5f,0x32,0x34,0x2c,0x20,0x69, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65, + 0x74,0x20,0x2b,0x3d,0x20,0x28,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70, + 0x65,0x73,0x2e,0x72,0x65,0x61,0x64,0x28,0x75,0x69,0x6e,0x74,0x32,0x28,0x5f,0x38, + 0x31,0x2e,0x78,0x79,0x29,0x2c,0x20,0x75,0x69,0x6e,0x74,0x28,0x5f,0x38,0x31,0x2e, + 0x7a,0x29,0x2c,0x20,0x30,0x29,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x5f,0x70,0x61, + 0x63,0x6b,0x65,0x64,0x5b,0x69,0x20,0x26,0x20,0x33,0x5d,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x7d,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x38,0x20,0x22,0x6d,0x65, + 0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74, + 0x75,0x72,0x6e,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x23, + 0x6c,0x69,0x6e,0x65,0x20,0x34,0x32,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c, + 0x73,0x6c,0x22,0x0a,0x76,0x65,0x72,0x74,0x65,0x78,0x20,0x6d,0x61,0x69,0x6e,0x30, + 0x5f,0x6f,0x75,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x28,0x6d,0x61,0x69,0x6e,0x30, + 0x5f,0x69,0x6e,0x20,0x69,0x6e,0x20,0x5b,0x5b,0x73,0x74,0x61,0x67,0x65,0x5f,0x69, + 0x6e,0x5d,0x5d,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x6d,0x65, + 0x73,0x68,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x26,0x20,0x76, + 0x5f,0x33,0x34,0x20,0x5b,0x5b,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x30,0x29,0x5d, + 0x5d,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x32,0x64,0x5f,0x61,0x72,0x72, + 0x61,0x79,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x3e,0x20,0x62,0x6c,0x65,0x6e,0x64,0x5f, + 0x73,0x68,0x61,0x70,0x65,0x73,0x20,0x5b,0x5b,0x74,0x65,0x78,0x74,0x75,0x72,0x65, + 0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x20,0x62, + 0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x53,0x6d,0x70,0x6c,0x72, + 0x20,0x5b,0x5b,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x28,0x30,0x29,0x5d,0x5d,0x29, + 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74, + 0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x7b,0x7d,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65, + 0x20,0x34,0x32,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x6c,0x6f,0x63,0x61,0x6c, + 0x5f,0x70,0x6f,0x73,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x61,0x5f,0x70,0x6f,0x73,0x69, + 0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x34,0x33,0x20,0x22, + 0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x69, + 0x6e,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x69,0x6e,0x74,0x28,0x69, + 0x6e,0x2e,0x61,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64,0x65,0x78, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f,0x31, + 0x30,0x34,0x20,0x3d,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x70,0x6f,0x73,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f,0x31,0x30,0x35,0x20, + 0x3d,0x20,0x5f,0x31,0x30,0x34,0x20,0x2b,0x20,0x65,0x76,0x61,0x6c,0x75,0x61,0x74, + 0x65,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x28,0x70,0x61, + 0x72,0x61,0x6d,0x2c,0x20,0x76,0x5f,0x33,0x34,0x2c,0x20,0x62,0x6c,0x65,0x6e,0x64, + 0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x2c,0x20,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73, + 0x68,0x61,0x70,0x65,0x73,0x53,0x6d,0x70,0x6c,0x72,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x70,0x6f,0x73,0x20,0x3d,0x20,0x5f,0x31,0x30, + 0x35,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x34,0x35,0x20,0x22,0x6d,0x65,0x73, + 0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x34,0x36, + 0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20, + 0x20,0x6f,0x75,0x74,0x2e,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e, + 0x20,0x3d,0x20,0x76,0x5f,0x33,0x34,0x2e,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x74,0x6f, + 0x5f,0x63,0x6c,0x69,0x70,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28, + 0x76,0x5f,0x33,0x34,0x2e,0x67,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x5f,0x74,0x6f, + 0x5f,0x77,0x6f,0x72,0x6c,0x64,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28, + 0x5f,0x31,0x30,0x35,0x2c,0x20,0x31,0x2e,0x30,0x29,0x29,0x2e,0x78,0x79,0x7a,0x2c, + 0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x34,0x37,0x20, + 0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20, + 0x6f,0x75,0x74,0x2e,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20,0x66, + 0x61,0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x28, + 0x76,0x5f,0x33,0x34,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x5f,0x74,0x6f,0x5f,0x77, + 0x6f,0x72,0x6c,0x64,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e, + 0x2e,0x61,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2c,0x20,0x30,0x2e,0x30,0x29,0x29, + 0x2e,0x78,0x79,0x7a,0x29,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x34,0x38,0x20, + 0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20, + 0x6f,0x75,0x74,0x2e,0x76,0x5f,0x75,0x76,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x61,0x5f, + 0x75,0x76,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f, + 0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, +}; +/* + #pragma clang diagnostic ignored "-Wmissing-prototypes" + + #include + #include + + using namespace metal; + + struct mesh_vertex_ubo + { + float4x4 geometry_to_world; + float4x4 normal_to_world; + float4x4 world_to_clip; + float4 blend_weights[16]; + float f_num_blend_shapes; + }; + + struct skin_vertex_ubo + { + float4x4 bones[64]; + }; + + struct main0_out + { + float3 v_normal [[user(locn0)]]; + float2 v_uv [[user(locn1)]]; + float4 gl_Position [[position]]; + }; + + struct main0_in + { + float3 a_position [[attribute(0)]]; + float3 a_normal [[attribute(1)]]; + float2 a_uv [[attribute(2)]]; + float a_vertex_index [[attribute(3)]]; + int4 a_bone_indices [[attribute(4)]]; + float4 a_bone_weights [[attribute(5)]]; + }; + + #line 20 "mesh.glsl" + static inline __attribute__((always_inline)) + float3 evaluate_blend_shape(thread const int& vertex_index, constant mesh_vertex_ubo& v_34, thread texture2d_array blend_shapes, thread const sampler blend_shapesSmplr) + { + #line 20 "mesh.glsl" + int _21 = vertex_index & 2047; + int _24 = vertex_index >> 11; + #line 21 "mesh.glsl" + int _39 = int(v_34.f_num_blend_shapes); + #line 22 "mesh.glsl" + float3 offset = float3(0.0); + #line 23 "mesh.glsl" + for (int i = 0; i < _39; i++) + { + #line 24 "mesh.glsl" + float4 _packed = v_34.blend_weights[i >> 2]; + #line 25 "mesh.glsl" + #line 26 "mesh.glsl" + int3 _81 = int3(_21, _24, i); + offset += (blend_shapes.read(uint2(_81.xy), uint(_81.z), 0).xyz * _packed[i & 3]); + } + #line 28 "mesh.glsl" + return offset; + } + + #line 52 "mesh.glsl" + vertex main0_out main0(main0_in in [[stage_in]], constant mesh_vertex_ubo& v_34 [[buffer(0)]], constant skin_vertex_ubo& _100 [[buffer(1)]], texture2d_array blend_shapes [[texture(0)]], sampler blend_shapesSmplr [[sampler(0)]]) + { + main0_out out = {}; + #line 52 "mesh.glsl" + #line 56 "mesh.glsl" + #line 55 "mesh.glsl" + #line 54 "mesh.glsl" + #line 53 "mesh.glsl" + float4x4 _116 = _100.bones[in.a_bone_indices.x] * in.a_bone_weights.x; + #line 54 "mesh.glsl" + float4x4 _124 = _100.bones[in.a_bone_indices.y] * in.a_bone_weights.y; + #line 55 "mesh.glsl" + float4x4 _145 = _100.bones[in.a_bone_indices.z] * in.a_bone_weights.z; + #line 56 "mesh.glsl" + float4x4 _166 = _100.bones[in.a_bone_indices.w] * in.a_bone_weights.w; + float4x4 _179 = float4x4(((_116[0] + _124[0]) + _145[0]) + _166[0], ((_116[1] + _124[1]) + _145[1]) + _166[1], ((_116[2] + _124[2]) + _145[2]) + _166[2], ((_116[3] + _124[3]) + _145[3]) + _166[3]); + #line 58 "mesh.glsl" + float3 local_pos = in.a_position; + #line 59 "mesh.glsl" + int param = int(in.a_vertex_index); + float3 _189 = local_pos; + float3 _190 = _189 + evaluate_blend_shape(param, v_34, blend_shapes, blend_shapesSmplr); + local_pos = _190; + #line 60 "mesh.glsl" + #line 61 "mesh.glsl" + #line 63 "mesh.glsl" + out.gl_Position = v_34.world_to_clip * float4((_179 * float4(_190, 1.0)).xyz, 1.0); + #line 64 "mesh.glsl" + out.v_normal = fast::normalize((_179 * float4(in.a_normal, 0.0)).xyz); + #line 65 "mesh.glsl" + out.v_uv = in.a_uv; + return out; + } + +*/ +static const char skinned_vertex_source_metal_macos[3090] = { + 0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x63,0x6c,0x61,0x6e,0x67,0x20,0x64,0x69, + 0x61,0x67,0x6e,0x6f,0x73,0x74,0x69,0x63,0x20,0x69,0x67,0x6e,0x6f,0x72,0x65,0x64, + 0x20,0x22,0x2d,0x57,0x6d,0x69,0x73,0x73,0x69,0x6e,0x67,0x2d,0x70,0x72,0x6f,0x74, + 0x6f,0x74,0x79,0x70,0x65,0x73,0x22,0x0a,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64, + 0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f,0x73,0x74,0x64,0x6c,0x69,0x62,0x3e, + 0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f, + 0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,0x75,0x73,0x69,0x6e,0x67,0x20,0x6e, + 0x61,0x6d,0x65,0x73,0x70,0x61,0x63,0x65,0x20,0x6d,0x65,0x74,0x61,0x6c,0x3b,0x0a, + 0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65,0x72, + 0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x67,0x65,0x6f,0x6d,0x65,0x74,0x72,0x79,0x5f, + 0x74,0x6f,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x5f,0x74,0x6f, + 0x5f,0x77,0x6f,0x72,0x6c,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x34,0x78,0x34,0x20,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x74,0x6f,0x5f,0x63,0x6c, + 0x69,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x62, + 0x6c,0x65,0x6e,0x64,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5b,0x31,0x36,0x5d, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x66,0x5f,0x6e,0x75, + 0x6d,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x3b,0x0a, + 0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x73,0x6b,0x69,0x6e,0x5f, + 0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x0a,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x62,0x6f,0x6e,0x65,0x73,0x5b, + 0x36,0x34,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20, + 0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20, + 0x5b,0x5b,0x75,0x73,0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x30,0x29,0x5d,0x5d,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x76,0x5f,0x75,0x76, + 0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x31,0x29,0x5d,0x5d, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x67,0x6c,0x5f, + 0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x5b,0x5b,0x70,0x6f,0x73,0x69,0x74, + 0x69,0x6f,0x6e,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63, + 0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x0a,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x61,0x5f,0x70,0x6f,0x73,0x69,0x74,0x69, + 0x6f,0x6e,0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x30, + 0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20, + 0x61,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69, + 0x62,0x75,0x74,0x65,0x28,0x31,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x32,0x20,0x61,0x5f,0x75,0x76,0x20,0x5b,0x5b,0x61,0x74,0x74, + 0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x32,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x5f,0x76,0x65,0x72,0x74,0x65,0x78,0x5f, + 0x69,0x6e,0x64,0x65,0x78,0x20,0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74, + 0x65,0x28,0x33,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34, + 0x20,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x20, + 0x5b,0x5b,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x34,0x29,0x5d,0x5d, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x61,0x5f,0x62, + 0x6f,0x6e,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x5b,0x5b,0x61,0x74, + 0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x28,0x35,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b, + 0x0a,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x30,0x20,0x22,0x6d,0x65,0x73,0x68, + 0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e, + 0x6c,0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65, + 0x5f,0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79,0x73,0x5f,0x69,0x6e,0x6c,0x69,0x6e, + 0x65,0x29,0x29,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x65,0x76,0x61,0x6c,0x75, + 0x61,0x74,0x65,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x28, + 0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74, + 0x26,0x20,0x76,0x65,0x72,0x74,0x65,0x78,0x5f,0x69,0x6e,0x64,0x65,0x78,0x2c,0x20, + 0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65, + 0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x26,0x20,0x76,0x5f,0x33,0x34,0x2c,0x20, + 0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x32,0x64, + 0x5f,0x61,0x72,0x72,0x61,0x79,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x3e,0x20,0x62,0x6c, + 0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x2c,0x20,0x74,0x68,0x72,0x65, + 0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72, + 0x20,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x53,0x6d,0x70, + 0x6c,0x72,0x29,0x0a,0x7b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x30,0x20,0x22, + 0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x69, + 0x6e,0x74,0x20,0x5f,0x32,0x31,0x20,0x3d,0x20,0x76,0x65,0x72,0x74,0x65,0x78,0x5f, + 0x69,0x6e,0x64,0x65,0x78,0x20,0x26,0x20,0x32,0x30,0x34,0x37,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x32,0x34,0x20,0x3d,0x20,0x76,0x65,0x72,0x74, + 0x65,0x78,0x5f,0x69,0x6e,0x64,0x65,0x78,0x20,0x3e,0x3e,0x20,0x31,0x31,0x3b,0x0a, + 0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x31,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67, + 0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x5f,0x33,0x39, + 0x20,0x3d,0x20,0x69,0x6e,0x74,0x28,0x76,0x5f,0x33,0x34,0x2e,0x66,0x5f,0x6e,0x75, + 0x6d,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x29,0x3b, + 0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x32,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e, + 0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33, + 0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33, + 0x28,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x33,0x20, + 0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20, + 0x69,0x20,0x3c,0x20,0x5f,0x33,0x39,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x20,0x20, + 0x20,0x20,0x7b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x34,0x20,0x22,0x6d,0x65, + 0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x70,0x61,0x63,0x6b,0x65,0x64,0x20, + 0x3d,0x20,0x76,0x5f,0x33,0x34,0x2e,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x77,0x65,0x69, + 0x67,0x68,0x74,0x73,0x5b,0x69,0x20,0x3e,0x3e,0x20,0x32,0x5d,0x3b,0x0a,0x23,0x6c, + 0x69,0x6e,0x65,0x20,0x32,0x35,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73, + 0x6c,0x22,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x32,0x36,0x20,0x22,0x6d,0x65,0x73, + 0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x69,0x6e,0x74,0x33,0x20,0x5f,0x38,0x31,0x20,0x3d,0x20,0x69,0x6e,0x74,0x33,0x28, + 0x5f,0x32,0x31,0x2c,0x20,0x5f,0x32,0x34,0x2c,0x20,0x69,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20, + 0x28,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x2e,0x72,0x65, + 0x61,0x64,0x28,0x75,0x69,0x6e,0x74,0x32,0x28,0x5f,0x38,0x31,0x2e,0x78,0x79,0x29, + 0x2c,0x20,0x75,0x69,0x6e,0x74,0x28,0x5f,0x38,0x31,0x2e,0x7a,0x29,0x2c,0x20,0x30, + 0x29,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x5f,0x70,0x61,0x63,0x6b,0x65,0x64,0x5b, + 0x69,0x20,0x26,0x20,0x33,0x5d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x23, + 0x6c,0x69,0x6e,0x65,0x20,0x32,0x38,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c, + 0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f, + 0x66,0x66,0x73,0x65,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20, + 0x35,0x32,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x76, + 0x65,0x72,0x74,0x65,0x78,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20, + 0x6d,0x61,0x69,0x6e,0x30,0x28,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x20,0x69, + 0x6e,0x20,0x5b,0x5b,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x5d,0x5d,0x2c,0x20, + 0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x6d,0x65,0x73,0x68,0x5f,0x76,0x65, + 0x72,0x74,0x65,0x78,0x5f,0x75,0x62,0x6f,0x26,0x20,0x76,0x5f,0x33,0x34,0x20,0x5b, + 0x5b,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20,0x63,0x6f, + 0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x6b,0x69,0x6e,0x5f,0x76,0x65,0x72,0x74, + 0x65,0x78,0x5f,0x75,0x62,0x6f,0x26,0x20,0x5f,0x31,0x30,0x30,0x20,0x5b,0x5b,0x62, + 0x75,0x66,0x66,0x65,0x72,0x28,0x31,0x29,0x5d,0x5d,0x2c,0x20,0x74,0x65,0x78,0x74, + 0x75,0x72,0x65,0x32,0x64,0x5f,0x61,0x72,0x72,0x61,0x79,0x3c,0x66,0x6c,0x6f,0x61, + 0x74,0x3e,0x20,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x20, + 0x5b,0x5b,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20, + 0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x20,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68, + 0x61,0x70,0x65,0x73,0x53,0x6d,0x70,0x6c,0x72,0x20,0x5b,0x5b,0x73,0x61,0x6d,0x70, + 0x6c,0x65,0x72,0x28,0x30,0x29,0x5d,0x5d,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20, + 0x7b,0x7d,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x35,0x32,0x20,0x22,0x6d,0x65, + 0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x35, + 0x36,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x23,0x6c, + 0x69,0x6e,0x65,0x20,0x35,0x35,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73, + 0x6c,0x22,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x35,0x34,0x20,0x22,0x6d,0x65,0x73, + 0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x35,0x33, + 0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x5f,0x31,0x31,0x36,0x20,0x3d, + 0x20,0x5f,0x31,0x30,0x30,0x2e,0x62,0x6f,0x6e,0x65,0x73,0x5b,0x69,0x6e,0x2e,0x61, + 0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x78,0x5d, + 0x20,0x2a,0x20,0x69,0x6e,0x2e,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x77,0x65,0x69, + 0x67,0x68,0x74,0x73,0x2e,0x78,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x35,0x34, + 0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x5f,0x31,0x32,0x34,0x20,0x3d, + 0x20,0x5f,0x31,0x30,0x30,0x2e,0x62,0x6f,0x6e,0x65,0x73,0x5b,0x69,0x6e,0x2e,0x61, + 0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x79,0x5d, + 0x20,0x2a,0x20,0x69,0x6e,0x2e,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x77,0x65,0x69, + 0x67,0x68,0x74,0x73,0x2e,0x79,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x35,0x35, + 0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x5f,0x31,0x34,0x35,0x20,0x3d, + 0x20,0x5f,0x31,0x30,0x30,0x2e,0x62,0x6f,0x6e,0x65,0x73,0x5b,0x69,0x6e,0x2e,0x61, + 0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x7a,0x5d, + 0x20,0x2a,0x20,0x69,0x6e,0x2e,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x77,0x65,0x69, + 0x67,0x68,0x74,0x73,0x2e,0x7a,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x35,0x36, + 0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x78,0x34,0x20,0x5f,0x31,0x36,0x36,0x20,0x3d, + 0x20,0x5f,0x31,0x30,0x30,0x2e,0x62,0x6f,0x6e,0x65,0x73,0x5b,0x69,0x6e,0x2e,0x61, + 0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x69,0x6e,0x64,0x69,0x63,0x65,0x73,0x2e,0x77,0x5d, + 0x20,0x2a,0x20,0x69,0x6e,0x2e,0x61,0x5f,0x62,0x6f,0x6e,0x65,0x5f,0x77,0x65,0x69, + 0x67,0x68,0x74,0x73,0x2e,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x34,0x78,0x34,0x20,0x5f,0x31,0x37,0x39,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x34,0x78,0x34,0x28,0x28,0x28,0x5f,0x31,0x31,0x36,0x5b,0x30,0x5d,0x20,0x2b, + 0x20,0x5f,0x31,0x32,0x34,0x5b,0x30,0x5d,0x29,0x20,0x2b,0x20,0x5f,0x31,0x34,0x35, + 0x5b,0x30,0x5d,0x29,0x20,0x2b,0x20,0x5f,0x31,0x36,0x36,0x5b,0x30,0x5d,0x2c,0x20, + 0x28,0x28,0x5f,0x31,0x31,0x36,0x5b,0x31,0x5d,0x20,0x2b,0x20,0x5f,0x31,0x32,0x34, + 0x5b,0x31,0x5d,0x29,0x20,0x2b,0x20,0x5f,0x31,0x34,0x35,0x5b,0x31,0x5d,0x29,0x20, + 0x2b,0x20,0x5f,0x31,0x36,0x36,0x5b,0x31,0x5d,0x2c,0x20,0x28,0x28,0x5f,0x31,0x31, + 0x36,0x5b,0x32,0x5d,0x20,0x2b,0x20,0x5f,0x31,0x32,0x34,0x5b,0x32,0x5d,0x29,0x20, + 0x2b,0x20,0x5f,0x31,0x34,0x35,0x5b,0x32,0x5d,0x29,0x20,0x2b,0x20,0x5f,0x31,0x36, + 0x36,0x5b,0x32,0x5d,0x2c,0x20,0x28,0x28,0x5f,0x31,0x31,0x36,0x5b,0x33,0x5d,0x20, + 0x2b,0x20,0x5f,0x31,0x32,0x34,0x5b,0x33,0x5d,0x29,0x20,0x2b,0x20,0x5f,0x31,0x34, + 0x35,0x5b,0x33,0x5d,0x29,0x20,0x2b,0x20,0x5f,0x31,0x36,0x36,0x5b,0x33,0x5d,0x29, + 0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x35,0x38,0x20,0x22,0x6d,0x65,0x73,0x68, + 0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x33,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x70,0x6f,0x73,0x20,0x3d,0x20,0x69,0x6e, + 0x2e,0x61,0x5f,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x23,0x6c,0x69, + 0x6e,0x65,0x20,0x35,0x39,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c, + 0x22,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x20, + 0x3d,0x20,0x69,0x6e,0x74,0x28,0x69,0x6e,0x2e,0x61,0x5f,0x76,0x65,0x72,0x74,0x65, + 0x78,0x5f,0x69,0x6e,0x64,0x65,0x78,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x33,0x20,0x5f,0x31,0x38,0x39,0x20,0x3d,0x20,0x6c,0x6f,0x63,0x61, + 0x6c,0x5f,0x70,0x6f,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x33,0x20,0x5f,0x31,0x39,0x30,0x20,0x3d,0x20,0x5f,0x31,0x38,0x39,0x20,0x2b,0x20, + 0x65,0x76,0x61,0x6c,0x75,0x61,0x74,0x65,0x5f,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73, + 0x68,0x61,0x70,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x2c,0x20,0x76,0x5f,0x33,0x34, + 0x2c,0x20,0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x2c,0x20, + 0x62,0x6c,0x65,0x6e,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x73,0x53,0x6d,0x70,0x6c, + 0x72,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x70,0x6f, + 0x73,0x20,0x3d,0x20,0x5f,0x31,0x39,0x30,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20, + 0x36,0x30,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x23, + 0x6c,0x69,0x6e,0x65,0x20,0x36,0x31,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c, + 0x73,0x6c,0x22,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x36,0x33,0x20,0x22,0x6d,0x65, + 0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74, + 0x2e,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x76, + 0x5f,0x33,0x34,0x2e,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x74,0x6f,0x5f,0x63,0x6c,0x69, + 0x70,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x5f,0x31,0x37,0x39, + 0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x5f,0x31,0x39,0x30,0x2c,0x20, + 0x31,0x2e,0x30,0x29,0x29,0x2e,0x78,0x79,0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b, + 0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x36,0x34,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e, + 0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x76,0x5f, + 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x3d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6e, + 0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x28,0x5f,0x31,0x37,0x39,0x20,0x2a, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x2e,0x61,0x5f,0x6e,0x6f,0x72, + 0x6d,0x61,0x6c,0x2c,0x20,0x30,0x2e,0x30,0x29,0x29,0x2e,0x78,0x79,0x7a,0x29,0x3b, + 0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x36,0x35,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e, + 0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x76,0x5f, + 0x75,0x76,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x61,0x5f,0x75,0x76,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a, + 0x0a,0x00, +}; +/* + #include + #include + + using namespace metal; + + struct main0_out + { + float4 o_color [[color(0)]]; + }; + + struct main0_in + { + float3 v_normal [[user(locn0)]]; + float2 v_uv [[user(locn1)]]; + }; + + #line 14 "mesh.glsl" + fragment main0_out main0(main0_in in [[stage_in]]) + { + main0_out out = {}; + #line 14 "mesh.glsl" + #line 15 "mesh.glsl" + #line 16 "mesh.glsl" + float _33 = ((dot(in.v_normal, float3(0.57735025882720947265625)) + (in.v_uv.x * 9.9999997473787516355514526367188e-05)) * 0.5) + 0.5; + #line 17 "mesh.glsl" + out.o_color = float4(_33, _33, _33, 1.0); + return out; + } + +*/ +static const char lit_pixel_source_metal_macos[607] = { + 0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x6d,0x65,0x74,0x61,0x6c,0x5f, + 0x73,0x74,0x64,0x6c,0x69,0x62,0x3e,0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65, + 0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f,0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a, + 0x75,0x73,0x69,0x6e,0x67,0x20,0x6e,0x61,0x6d,0x65,0x73,0x70,0x61,0x63,0x65,0x20, + 0x6d,0x65,0x74,0x61,0x6c,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d, + 0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x5b,0x5b, + 0x63,0x6f,0x6c,0x6f,0x72,0x28,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a, + 0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x0a, + 0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x76,0x5f,0x6e, + 0x6f,0x72,0x6d,0x61,0x6c,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28,0x6c,0x6f,0x63, + 0x6e,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x32,0x20,0x76,0x5f,0x75,0x76,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28,0x6c,0x6f, + 0x63,0x6e,0x31,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x23,0x6c,0x69,0x6e, + 0x65,0x20,0x31,0x34,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22, + 0x0a,0x66,0x72,0x61,0x67,0x6d,0x65,0x6e,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f, + 0x6f,0x75,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x28,0x6d,0x61,0x69,0x6e,0x30,0x5f, + 0x69,0x6e,0x20,0x69,0x6e,0x20,0x5b,0x5b,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e, + 0x5d,0x5d,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f, + 0x6f,0x75,0x74,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x7b,0x7d,0x3b,0x0a,0x23,0x6c, + 0x69,0x6e,0x65,0x20,0x31,0x34,0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73, + 0x6c,0x22,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x31,0x35,0x20,0x22,0x6d,0x65,0x73, + 0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x31,0x36, + 0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x33,0x20,0x3d,0x20,0x28,0x28,0x64, + 0x6f,0x74,0x28,0x69,0x6e,0x2e,0x76,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2c,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x30,0x2e,0x35,0x37,0x37,0x33,0x35,0x30,0x32, + 0x35,0x38,0x38,0x32,0x37,0x32,0x30,0x39,0x34,0x37,0x32,0x36,0x35,0x36,0x32,0x35, + 0x29,0x29,0x20,0x2b,0x20,0x28,0x69,0x6e,0x2e,0x76,0x5f,0x75,0x76,0x2e,0x78,0x20, + 0x2a,0x20,0x39,0x2e,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x34,0x37,0x33,0x37,0x38, + 0x37,0x35,0x31,0x36,0x33,0x35,0x35,0x35,0x31,0x34,0x35,0x32,0x36,0x33,0x36,0x37, + 0x31,0x38,0x38,0x65,0x2d,0x30,0x35,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29, + 0x20,0x2b,0x20,0x30,0x2e,0x35,0x3b,0x0a,0x23,0x6c,0x69,0x6e,0x65,0x20,0x31,0x37, + 0x20,0x22,0x6d,0x65,0x73,0x68,0x2e,0x67,0x6c,0x73,0x6c,0x22,0x0a,0x20,0x20,0x20, + 0x20,0x6f,0x75,0x74,0x2e,0x6f,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x34,0x28,0x5f,0x33,0x33,0x2c,0x20,0x5f,0x33,0x33,0x2c,0x20, + 0x5f,0x33,0x33,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72, + 0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, +}; +#if !defined(SOKOL_GFX_INCLUDED) + #error "Please include sokol_gfx.h before mesh.h" +#endif +static inline const sg_shader_desc* skinned_lit_shader_desc(sg_backend backend) { + if (backend == SG_BACKEND_GLCORE33) { + static sg_shader_desc desc; + static bool valid; + if (!valid) { + valid = true; + desc.attrs[0].name = "a_position"; + desc.attrs[1].name = "a_normal"; + desc.attrs[2].name = "a_uv"; + desc.attrs[3].name = "a_vertex_index"; + desc.attrs[4].name = "a_bone_indices"; + desc.attrs[5].name = "a_bone_weights"; + desc.vs.source = skinned_vertex_source_glsl330; + desc.vs.entry = "main"; + desc.vs.uniform_blocks[0].size = 464; + desc.vs.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140; + desc.vs.uniform_blocks[0].uniforms[0].name = "mesh_vertex_ubo"; + desc.vs.uniform_blocks[0].uniforms[0].type = SG_UNIFORMTYPE_FLOAT4; + desc.vs.uniform_blocks[0].uniforms[0].array_count = 29; + desc.vs.uniform_blocks[1].size = 4096; + desc.vs.uniform_blocks[1].layout = SG_UNIFORMLAYOUT_STD140; + desc.vs.uniform_blocks[1].uniforms[0].name = "skin_vertex_ubo"; + desc.vs.uniform_blocks[1].uniforms[0].type = SG_UNIFORMTYPE_FLOAT4; + desc.vs.uniform_blocks[1].uniforms[0].array_count = 256; + desc.vs.images[0].name = "blend_shapes"; + desc.vs.images[0].image_type = SG_IMAGETYPE_ARRAY; + desc.vs.images[0].sampler_type = SG_SAMPLERTYPE_FLOAT; + desc.fs.source = lit_pixel_source_glsl330; + desc.fs.entry = "main"; + desc.label = "skinned_lit_shader"; + } + return &desc; + } + if (backend == SG_BACKEND_D3D11) { + static sg_shader_desc desc; + static bool valid; + if (!valid) { + valid = true; + desc.attrs[0].sem_name = "TEXCOORD"; + desc.attrs[0].sem_index = 0; + desc.attrs[1].sem_name = "TEXCOORD"; + desc.attrs[1].sem_index = 1; + desc.attrs[2].sem_name = "TEXCOORD"; + desc.attrs[2].sem_index = 2; + desc.attrs[3].sem_name = "TEXCOORD"; + desc.attrs[3].sem_index = 3; + desc.attrs[4].sem_name = "TEXCOORD"; + desc.attrs[4].sem_index = 4; + desc.attrs[5].sem_name = "TEXCOORD"; + desc.attrs[5].sem_index = 5; + desc.vs.bytecode.ptr = skinned_vertex_bytecode_hlsl5; + desc.vs.bytecode.size = 3256; + desc.vs.entry = "main"; + desc.vs.uniform_blocks[0].size = 464; + desc.vs.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140; + desc.vs.uniform_blocks[1].size = 4096; + desc.vs.uniform_blocks[1].layout = SG_UNIFORMLAYOUT_STD140; + desc.vs.images[0].name = "blend_shapes"; + desc.vs.images[0].image_type = SG_IMAGETYPE_ARRAY; + desc.vs.images[0].sampler_type = SG_SAMPLERTYPE_FLOAT; + desc.fs.bytecode.ptr = lit_pixel_bytecode_hlsl5; + desc.fs.bytecode.size = 668; + desc.fs.entry = "main"; + desc.label = "skinned_lit_shader"; + } + return &desc; + } + if (backend == SG_BACKEND_METAL_MACOS) { + static sg_shader_desc desc; + static bool valid; + if (!valid) { + valid = true; + desc.vs.source = skinned_vertex_source_metal_macos; + desc.vs.entry = "main0"; + desc.vs.uniform_blocks[0].size = 464; + desc.vs.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140; + desc.vs.uniform_blocks[1].size = 4096; + desc.vs.uniform_blocks[1].layout = SG_UNIFORMLAYOUT_STD140; + desc.vs.images[0].name = "blend_shapes"; + desc.vs.images[0].image_type = SG_IMAGETYPE_ARRAY; + desc.vs.images[0].sampler_type = SG_SAMPLERTYPE_FLOAT; + desc.fs.source = lit_pixel_source_metal_macos; + desc.fs.entry = "main0"; + desc.label = "skinned_lit_shader"; + } + return &desc; + } + return 0; +} +static inline const sg_shader_desc* static_lit_shader_desc(sg_backend backend) { + if (backend == SG_BACKEND_GLCORE33) { + static sg_shader_desc desc; + static bool valid; + if (!valid) { + valid = true; + desc.attrs[0].name = "a_position"; + desc.attrs[1].name = "a_normal"; + desc.attrs[2].name = "a_uv"; + desc.attrs[3].name = "a_vertex_index"; + desc.vs.source = static_vertex_source_glsl330; + desc.vs.entry = "main"; + desc.vs.uniform_blocks[0].size = 464; + desc.vs.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140; + desc.vs.uniform_blocks[0].uniforms[0].name = "mesh_vertex_ubo"; + desc.vs.uniform_blocks[0].uniforms[0].type = SG_UNIFORMTYPE_FLOAT4; + desc.vs.uniform_blocks[0].uniforms[0].array_count = 29; + desc.vs.images[0].name = "blend_shapes"; + desc.vs.images[0].image_type = SG_IMAGETYPE_ARRAY; + desc.vs.images[0].sampler_type = SG_SAMPLERTYPE_FLOAT; + desc.fs.source = lit_pixel_source_glsl330; + desc.fs.entry = "main"; + desc.label = "static_lit_shader"; + } + return &desc; + } + if (backend == SG_BACKEND_D3D11) { + static sg_shader_desc desc; + static bool valid; + if (!valid) { + valid = true; + desc.attrs[0].sem_name = "TEXCOORD"; + desc.attrs[0].sem_index = 0; + desc.attrs[1].sem_name = "TEXCOORD"; + desc.attrs[1].sem_index = 1; + desc.attrs[2].sem_name = "TEXCOORD"; + desc.attrs[2].sem_index = 2; + desc.attrs[3].sem_name = "TEXCOORD"; + desc.attrs[3].sem_index = 3; + desc.vs.bytecode.ptr = static_vertex_bytecode_hlsl5; + desc.vs.bytecode.size = 2276; + desc.vs.entry = "main"; + desc.vs.uniform_blocks[0].size = 464; + desc.vs.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140; + desc.vs.images[0].name = "blend_shapes"; + desc.vs.images[0].image_type = SG_IMAGETYPE_ARRAY; + desc.vs.images[0].sampler_type = SG_SAMPLERTYPE_FLOAT; + desc.fs.bytecode.ptr = lit_pixel_bytecode_hlsl5; + desc.fs.bytecode.size = 668; + desc.fs.entry = "main"; + desc.label = "static_lit_shader"; + } + return &desc; + } + if (backend == SG_BACKEND_METAL_MACOS) { + static sg_shader_desc desc; + static bool valid; + if (!valid) { + valid = true; + desc.vs.source = static_vertex_source_metal_macos; + desc.vs.entry = "main0"; + desc.vs.uniform_blocks[0].size = 464; + desc.vs.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140; + desc.vs.images[0].name = "blend_shapes"; + desc.vs.images[0].image_type = SG_IMAGETYPE_ARRAY; + desc.vs.images[0].sampler_type = SG_SAMPLERTYPE_FLOAT; + desc.fs.source = lit_pixel_source_metal_macos; + desc.fs.entry = "main0"; + desc.label = "static_lit_shader"; + } + return &desc; + } + return 0; +} diff --git a/modules/ufbx/examples/viewer/viewer.c b/modules/ufbx/examples/viewer/viewer.c new file mode 100644 index 0000000..b392397 --- /dev/null +++ b/modules/ufbx/examples/viewer/viewer.c @@ -0,0 +1,981 @@ +#include "external/sokol_app.h" +#include "external/sokol_gfx.h" +#include "external/sokol_time.h" +#include "external/sokol_glue.h" +#include "external/umath.h" +#include "../../ufbx.h" + +#include "shaders/mesh.h" + +#include +#include +#include + +#define MAX_BONES 64 +#define MAX_BLEND_SHAPES 64 + +um_vec2 ufbx_to_um_vec2(ufbx_vec2 v) { return um_v2((float)v.x, (float)v.y); } +um_vec3 ufbx_to_um_vec3(ufbx_vec3 v) { return um_v3((float)v.x, (float)v.y, (float)v.z); } +um_quat ufbx_to_um_quat(ufbx_quat v) { return um_quat_xyzw((float)v.x, (float)v.y, (float)v.z, (float)v.w); } +um_mat ufbx_to_um_mat(ufbx_matrix m) { + return um_mat_rows( + (float)m.m00, (float)m.m01, (float)m.m02, (float)m.m03, + (float)m.m10, (float)m.m11, (float)m.m12, (float)m.m13, + (float)m.m20, (float)m.m21, (float)m.m22, (float)m.m23, + 0, 0, 0, 1, + ); +} + +typedef struct mesh_vertex { + um_vec3 position; + um_vec3 normal; + um_vec2 uv; + float f_vertex_index; +} mesh_vertex; + +typedef struct skin_vertex { + uint8_t bone_index[4]; + uint8_t bone_weight[4]; +} skin_vertex; + +static const sg_layout_desc mesh_vertex_layout = { + .attrs = { + { .buffer_index = 0, .format = SG_VERTEXFORMAT_FLOAT3 }, + { .buffer_index = 0, .format = SG_VERTEXFORMAT_FLOAT3 }, + { .buffer_index = 0, .format = SG_VERTEXFORMAT_FLOAT2 }, + { .buffer_index = 0, .format = SG_VERTEXFORMAT_FLOAT }, + }, +}; + +static const sg_layout_desc skinned_mesh_vertex_layout = { + .attrs = { + { .buffer_index = 0, .format = SG_VERTEXFORMAT_FLOAT3 }, + { .buffer_index = 0, .format = SG_VERTEXFORMAT_FLOAT3 }, + { .buffer_index = 0, .format = SG_VERTEXFORMAT_FLOAT2 }, + { .buffer_index = 0, .format = SG_VERTEXFORMAT_FLOAT }, + { .buffer_index = 1, .format = SG_VERTEXFORMAT_BYTE4 }, + { .buffer_index = 1, .format = SG_VERTEXFORMAT_UBYTE4N }, + }, +}; + +void print_error(const ufbx_error *error, const char *description) +{ + char buffer[1024]; + ufbx_format_error(buffer, sizeof(buffer), error); + fprintf(stderr, "%s\n%s\n", description, buffer); +} + +void *alloc_imp(size_t type_size, size_t count) +{ + void *ptr = malloc(type_size * count); + if (!ptr) { + fprintf(stderr, "Out of memory\n"); + exit(1); + } + memset(ptr, 0, type_size * count); + return ptr; +} + +void *alloc_dup_imp(size_t type_size, size_t count, const void *data) +{ + void *ptr = malloc(type_size * count); + if (!ptr) { + fprintf(stderr, "Out of memory\n"); + exit(1); + } + memcpy(ptr, data, type_size * count); + return ptr; +} + +#define alloc(m_type, m_count) (m_type*)alloc_imp(sizeof(m_type), (m_count)) +#define alloc_dup(m_type, m_count, m_data) (m_type*)alloc_dup_imp(sizeof(m_type), (m_count), (m_data)) + +size_t min_sz(size_t a, size_t b) { return a < b ? a : b; } +size_t max_sz(size_t a, size_t b) { return b < a ? a : b; } +size_t clamp_sz(size_t a, size_t min_a, size_t max_a) { return min_sz(max_sz(a, min_a), max_a); } + +typedef struct viewer_node_anim { + float time_begin; + float framerate; + size_t num_frames; + um_quat const_rot; + um_vec3 const_pos; + um_vec3 const_scale; + um_quat *rot; + um_vec3 *pos; + um_vec3 *scale; +} viewer_node_anim; + +typedef struct viewer_blend_channel_anim { + float const_weight; + float *weight; +} viewer_blend_channel_anim; + +typedef struct viewer_anim { + const char *name; + float time_begin; + float time_end; + float framerate; + size_t num_frames; + + viewer_node_anim *nodes; + viewer_blend_channel_anim *blend_channels; +} viewer_anim; + +typedef struct viewer_node { + int32_t parent_index; + + um_mat geometry_to_node; + um_mat node_to_parent; + um_mat node_to_world; + um_mat geometry_to_world; + um_mat normal_to_world; +} viewer_node; + +typedef struct viewer_blend_channel { + float weight; +} viewer_blend_channel; + +typedef struct viewer_mesh_part { + sg_buffer vertex_buffer; + sg_buffer index_buffer; + sg_buffer skin_buffer; // Optional + + size_t num_indices; + int32_t material_index; +} viewer_mesh_part; + +typedef struct viewer_mesh { + + int32_t *instance_node_indices; + size_t num_instances; + + viewer_mesh_part *parts; + size_t num_parts; + + bool aabb_is_local; + um_vec3 aabb_min; + um_vec3 aabb_max; + + // Skinning (optional) + bool skinned; + size_t num_bones; + int32_t bone_indices[MAX_BONES]; + um_mat bone_matrices[MAX_BONES]; + + // Blend shapes (optional) + size_t num_blend_shapes; + sg_image blend_shape_image; + int32_t blend_channel_indices[MAX_BLEND_SHAPES]; + +} viewer_mesh; + +typedef struct viewer_scene { + + viewer_node *nodes; + size_t num_nodes; + + viewer_mesh *meshes; + size_t num_meshes; + + viewer_blend_channel *blend_channels; + size_t num_blend_channels; + + viewer_anim *animations; + size_t num_animations; + + um_vec3 aabb_min; + um_vec3 aabb_max; + +} viewer_scene; + +typedef struct viewer { + + viewer_scene scene; + float anim_time; + + sg_shader shader_mesh_lit_static; + sg_shader shader_mesh_lit_skinned; + sg_pipeline pipe_mesh_lit_static; + sg_pipeline pipe_mesh_lit_skinned; + sg_image empty_blend_shape_image; + + um_mat world_to_view; + um_mat view_to_clip; + um_mat world_to_clip; + + float camera_yaw; + float camera_pitch; + float camera_distance; + uint32_t mouse_buttons; +} viewer; + +void read_node(viewer_node *vnode, ufbx_node *node) +{ + vnode->parent_index = node->parent ? node->parent->typed_id : -1; + vnode->node_to_parent = ufbx_to_um_mat(node->node_to_parent); + vnode->node_to_world = ufbx_to_um_mat(node->node_to_world); + vnode->geometry_to_node = ufbx_to_um_mat(node->geometry_to_node); + vnode->geometry_to_world = ufbx_to_um_mat(node->geometry_to_world); + vnode->normal_to_world = ufbx_to_um_mat(ufbx_matrix_for_normals(&node->geometry_to_world)); +} + +sg_image pack_blend_channels_to_image(ufbx_mesh *mesh, ufbx_blend_channel **channels, size_t num_channels) +{ + // We pack the blend shape data into a 1024xNxM texture array where each texel + // contains the vertex `Y*1024 + X` for blend shape `Z`. + uint32_t tex_width = 1024; + uint32_t tex_height_min = ((uint32_t)mesh->num_vertices + tex_width - 1) / tex_width; + uint32_t tex_slices = (uint32_t)num_channels; + + // Let's make the texture size a power of two just to be sure... + uint32_t tex_height = 1; + while (tex_height < tex_height_min) { + tex_height *= 2; + } + + // NOTE: A proper implementation would probably compress the shape offsets to FP16 + // or some other quantization to save space, we use full FP32 here for simplicity. + size_t tex_texels = tex_width * tex_height * tex_slices; + um_vec4 *tex_data = alloc(um_vec4, tex_texels); + + // Copy the vertex offsets from each blend shape + for (uint32_t ci = 0; ci < num_channels; ci++) { + ufbx_blend_channel *chan = channels[ci]; + um_vec4 *slice_data = tex_data + tex_width * tex_height * ci; + + // Let's use the last blend shape if there's multiple blend phases as we don't + // support it. Fortunately this feature is quite rarely used in practice. + ufbx_blend_shape *shape = chan->keyframes.data[chan->keyframes.count - 1].shape; + + for (size_t oi = 0; oi < shape->num_offsets; oi++) { + uint32_t ix = (uint32_t)shape->offset_vertices.data[oi]; + if (ix < mesh->num_vertices) { + // We don't need to do any indexing to X/Y here as the memory layout of + // `slice_data` pixels is the same as the linear buffer would be. + slice_data[ix].xyz = ufbx_to_um_vec3(shape->position_offsets.data[oi]); + } + } + } + + // Upload the combined blend offset image to the GPU + sg_image image = sg_make_image(&(sg_image_desc){ + .type = SG_IMAGETYPE_ARRAY, + .width = (int)tex_width, + .height = (int)tex_height, + .num_slices = tex_slices, + .pixel_format = SG_PIXELFORMAT_RGBA32F, + .data.subimage[0][0] = { tex_data, tex_texels * sizeof(um_vec4) }, + }); + + free(tex_data); + + return image; +} + +void read_mesh(viewer_mesh *vmesh, ufbx_mesh *mesh) +{ + // Count the number of needed parts and temporary buffers + size_t max_parts = 0; + size_t max_triangles = 0; + + // We need to render each material of the mesh in a separate part, so let's + // count the number of parts and maximum number of triangles needed. + for (size_t pi = 0; pi < mesh->materials.count; pi++) { + ufbx_mesh_material *mesh_mat = &mesh->materials.data[pi]; + if (mesh_mat->num_triangles == 0) continue; + max_parts += 1; + max_triangles = max_sz(max_triangles, mesh_mat->num_triangles); + } + + // Temporary buffers + size_t num_tri_indices = mesh->max_face_triangles * 3; + uint32_t *tri_indices = alloc(uint32_t, num_tri_indices); + mesh_vertex *vertices = alloc(mesh_vertex, max_triangles * 3); + skin_vertex *skin_vertices = alloc(skin_vertex, max_triangles * 3); + skin_vertex *mesh_skin_vertices = alloc(skin_vertex, mesh->num_vertices); + uint32_t *indices = alloc(uint32_t, max_triangles * 3); + + // Result buffers + viewer_mesh_part *parts = alloc(viewer_mesh_part, max_parts); + size_t num_parts = 0; + + // In FBX files a single mesh can be instanced by multiple nodes. ufbx handles the connection + // in two ways: (1) `ufbx_node.mesh/light/camera/etc` contains pointer to the data "attribute" + // that node uses and (2) each element that can be connected to a node contains a list of + // `ufbx_node*` instances eg. `ufbx_mesh.instances`. + vmesh->num_instances = mesh->instances.count; + vmesh->instance_node_indices = alloc(int32_t, mesh->instances.count); + for (size_t i = 0; i < mesh->instances.count; i++) { + vmesh->instance_node_indices[i] = (int32_t)mesh->instances.data[i]->typed_id; + } + + // Create the vertex buffers + size_t num_blend_shapes = 0; + ufbx_blend_channel *blend_channels[MAX_BLEND_SHAPES]; + size_t num_bones = 0; + ufbx_skin_deformer *skin = NULL; + + if (mesh->skin_deformers.count > 0) { + vmesh->skinned = true; + + // Having multiple skin deformers attached at once is exceedingly rare so we can just + // pick the first one without having to worry too much about it. + skin = mesh->skin_deformers.data[0]; + + // NOTE: A proper implementation would split meshes with too many bones to chunks but + // for simplicity we're going to just pick the first `MAX_BONES` ones. + for (size_t ci = 0; ci < skin->clusters.count; ci++) { + ufbx_skin_cluster *cluster = skin->clusters.data[ci]; + if (num_bones < MAX_BONES) { + vmesh->bone_indices[num_bones] = (int32_t)cluster->bone_node->typed_id; + vmesh->bone_matrices[num_bones] = ufbx_to_um_mat(cluster->geometry_to_bone); + num_bones++; + } + } + vmesh->num_bones = num_bones; + + // Pre-calculate the skinned vertex bones/weights for each vertex as they will probably + // be shared by multiple indices. + for (size_t vi = 0; vi < mesh->num_vertices; vi++) { + size_t num_weights = 0; + float total_weight = 0.0f; + float weights[4] = { 0.0f }; + uint8_t clusters[4] = { 0 }; + + // `ufbx_skin_vertex` contains the offset and number of weights that deform the vertex + // in a descending weight order so we can pick the first N weights to use and get a + // reasonable approximation of the skinning. + ufbx_skin_vertex vertex_weights = skin->vertices.data[vi]; + for (size_t wi = 0; wi < vertex_weights.num_weights; wi++) { + if (num_weights >= 4) break; + ufbx_skin_weight weight = skin->weights.data[vertex_weights.weight_begin + wi]; + + // Since we only support a fixed amount of bones up to `MAX_BONES` and we take the + // first N ones we need to ignore weights with too high `cluster_index`. + if (weight.cluster_index < MAX_BONES) { + total_weight += (float)weight.weight; + clusters[num_weights] = (uint8_t)weight.cluster_index; + weights[num_weights] = (float)weight.weight; + num_weights++; + } + } + + // Normalize and quantize the weights to 8 bits. We need to be a bit careful to make + // sure the _quantized_ sum is normalized ie. all 8-bit values sum to 255. + if (total_weight > 0.0f) { + skin_vertex *skin_vert = &mesh_skin_vertices[vi]; + uint32_t quantized_sum = 0; + for (size_t i = 0; i < 4; i++) { + uint8_t quantized_weight = (uint8_t)((float)weights[i] / total_weight * 255.0f); + quantized_sum += quantized_weight; + skin_vert->bone_index[i] = clusters[i]; + skin_vert->bone_weight[i] = quantized_weight; + } + skin_vert->bone_weight[0] += 255 - quantized_sum; + } + } + } + + // Fetch blend channels from all attached blend deformers. + for (size_t di = 0; di < mesh->blend_deformers.count; di++) { + ufbx_blend_deformer *deformer = mesh->blend_deformers.data[di]; + for (size_t ci = 0; ci < deformer->channels.count; ci++) { + ufbx_blend_channel *chan = deformer->channels.data[ci]; + if (chan->keyframes.count == 0) continue; + if (num_blend_shapes < MAX_BLEND_SHAPES) { + blend_channels[num_blend_shapes] = chan; + vmesh->blend_channel_indices[num_blend_shapes] = (int32_t)chan->typed_id; + num_blend_shapes++; + } + } + } + if (num_blend_shapes > 0) { + vmesh->blend_shape_image = pack_blend_channels_to_image(mesh, blend_channels, num_blend_shapes); + vmesh->num_blend_shapes = num_blend_shapes; + } + + // Our shader supports only a single material per draw call so we need to split the mesh + // into parts by material. `ufbx_mesh_material` contains a handy compact list of faces + // that use the material which we use here. + for (size_t pi = 0; pi < mesh->materials.count; pi++) { + ufbx_mesh_material *mesh_mat = &mesh->materials.data[pi]; + if (mesh_mat->num_triangles == 0) continue; + + viewer_mesh_part *part = &parts[num_parts++]; + size_t num_indices = 0; + + // First fetch all vertices into a flat non-indexed buffer, we also need to + // triangulate the faces + for (size_t fi = 0; fi < mesh_mat->num_faces; fi++) { + ufbx_face face = mesh->faces.data[mesh_mat->face_indices.data[fi]]; + size_t num_tris = ufbx_triangulate_face(tri_indices, num_tri_indices, mesh, face); + + ufbx_vec2 default_uv = { 0 }; + + // Iterate through every vertex of every triangle in the triangulated result + for (size_t vi = 0; vi < num_tris * 3; vi++) { + uint32_t ix = tri_indices[vi]; + mesh_vertex *vert = &vertices[num_indices]; + + ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, ix); + ufbx_vec3 normal = ufbx_get_vertex_vec3(&mesh->vertex_normal, ix); + ufbx_vec2 uv = mesh->vertex_uv.exists ? ufbx_get_vertex_vec2(&mesh->vertex_uv, ix) : default_uv; + + vert->position = ufbx_to_um_vec3(pos); + vert->normal = um_normalize3(ufbx_to_um_vec3(normal)); + vert->uv = ufbx_to_um_vec2(uv); + vert->f_vertex_index = (float)mesh->vertex_indices.data[ix]; + + // The skinning vertex stream is pre-calculated above so we just need to + // copy the right one by the vertex index. + if (skin) { + skin_vertices[num_indices] = mesh_skin_vertices[mesh->vertex_indices.data[ix]]; + } + + num_indices++; + } + } + + ufbx_vertex_stream streams[2]; + size_t num_streams = 1; + + streams[0].data = vertices; + streams[0].vertex_size = sizeof(mesh_vertex); + + if (skin) { + streams[1].data = skin_vertices; + streams[1].vertex_size = sizeof(skin_vertex); + num_streams = 2; + } + + // Optimize the flat vertex buffer into an indexed one. `ufbx_generate_indices()` + // compacts the vertex buffer and returns the number of used vertices. + ufbx_error error; + size_t num_vertices = ufbx_generate_indices(streams, num_streams, indices, num_indices, NULL, &error); + if (error.type != UFBX_ERROR_NONE) { + print_error(&error, "Failed to generate index buffer"); + exit(1); + } + + // To unify code we use `ufbx_load_opts.allow_null_material` to make ufbx create a + // `ufbx_mesh_material` even if there are no materials, so it might be `NULL` here. + part->num_indices = num_indices; + if (mesh_mat->material) { + part->material_index = (int32_t)mesh_mat->material->typed_id; + } else { + part->material_index = -1; + } + + // Create the GPU buffers from the temporary `vertices` and `indices` arrays + part->index_buffer = sg_make_buffer(&(sg_buffer_desc){ + .size = num_indices * sizeof(uint32_t), + .type = SG_BUFFERTYPE_INDEXBUFFER, + .data = { indices, num_indices * sizeof(uint32_t) }, + }); + part->vertex_buffer = sg_make_buffer(&(sg_buffer_desc){ + .size = num_vertices * sizeof(mesh_vertex), + .type = SG_BUFFERTYPE_VERTEXBUFFER, + .data = { vertices, num_vertices * sizeof(mesh_vertex) }, + }); + + if (vmesh->skinned) { + part->skin_buffer = sg_make_buffer(&(sg_buffer_desc){ + .size = num_vertices * sizeof(skin_vertex), + .type = SG_BUFFERTYPE_VERTEXBUFFER, + .data = { skin_vertices, num_vertices * sizeof(skin_vertex) }, + }); + } + } + + // Free the temporary buffers + free(tri_indices); + free(vertices); + free(skin_vertices); + free(mesh_skin_vertices); + free(indices); + + // Compute bounds from the vertices + vmesh->aabb_is_local = mesh->skinned_is_local; + vmesh->aabb_min = um_dup3(+INFINITY); + vmesh->aabb_max = um_dup3(-INFINITY); + for (size_t i = 0; i < mesh->num_vertices; i++) { + um_vec3 pos = ufbx_to_um_vec3(mesh->skinned_position.values.data[i]); + vmesh->aabb_min = um_min3(vmesh->aabb_min, pos); + vmesh->aabb_max = um_max3(vmesh->aabb_max, pos); + } + + vmesh->parts = parts; + vmesh->num_parts = num_parts; +} + +void read_blend_channel(viewer_blend_channel *vchan, ufbx_blend_channel *chan) +{ + vchan->weight = (float)chan->weight; +} + +void read_node_anim(viewer_anim *va, viewer_node_anim *vna, ufbx_anim_stack *stack, ufbx_node *node) +{ + vna->rot = alloc(um_quat, va->num_frames); + vna->pos = alloc(um_vec3, va->num_frames); + vna->scale = alloc(um_vec3, va->num_frames); + + bool const_rot = true, const_pos = true, const_scale = true; + + // Sample the node's transform evenly for the whole animation stack duration + for (size_t i = 0; i < va->num_frames; i++) { + double time = stack->time_begin + (double)i / va->framerate; + + ufbx_transform transform = ufbx_evaluate_transform(&stack->anim, node, time); + vna->rot[i] = ufbx_to_um_quat(transform.rotation); + vna->pos[i] = ufbx_to_um_vec3(transform.translation); + vna->scale[i] = ufbx_to_um_vec3(transform.scale); + + if (i > 0) { + // Negated quaternions are equivalent, but interpolating between ones of different + // polarity takes a the longer path, so flip the quaternion if necessary. + if (um_quat_dot(vna->rot[i], vna->rot[i - 1]) < 0.0f) { + vna->rot[i] = um_quat_neg(vna->rot[i]); + } + + // Keep track of which channels are constant for the whole animation as an optimization + if (!um_quat_equal(vna->rot[i - 1], vna->rot[i])) const_rot = false; + if (!um_equal3(vna->pos[i - 1], vna->pos[i])) const_pos = false; + if (!um_equal3(vna->scale[i - 1], vna->scale[i])) const_scale = false; + } + } + + if (const_rot) { vna->const_rot = vna->rot[0]; free(vna->rot); vna->rot = NULL; } + if (const_pos) { vna->const_pos = vna->pos[0]; free(vna->pos); vna->pos = NULL; } + if (const_scale) { vna->const_scale = vna->scale[0]; free(vna->scale); vna->scale = NULL; } +} + +void read_blend_channel_anim(viewer_anim *va, viewer_blend_channel_anim *vbca, ufbx_anim_stack *stack, ufbx_blend_channel *chan) +{ + vbca->weight = alloc(float, va->num_frames); + + bool const_weight = true; + + // Sample the blend weight evenly for the whole animation stack duration + for (size_t i = 0; i < va->num_frames; i++) { + double time = stack->time_begin + (double)i / va->framerate; + + ufbx_real weight = ufbx_evaluate_blend_weight(&stack->anim, chan, time); + vbca->weight[i] = (float)weight; + + // Keep track of which channels are constant for the whole animation as an optimization + if (i > 0) { + if (vbca->weight[i - 1] != vbca->weight[i]) const_weight = false; + } + } + + if (const_weight) { vbca->const_weight = vbca->weight[0]; free(vbca->weight); vbca->weight = NULL; } +} + +void read_anim_stack(viewer_anim *va, ufbx_anim_stack *stack, ufbx_scene *scene) +{ + const float target_framerate = 30.0f; + const size_t max_frames = 4096; + + // Sample the animation evenly at `target_framerate` if possible while limiting the maximum + // number of frames to `max_frames` by potentially dropping FPS. + float duration = (float)stack->time_end - (float)stack->time_begin; + size_t num_frames = clamp_sz((size_t)(duration * target_framerate), 2, max_frames); + float framerate = (float)(num_frames - 1) / duration; + + va->name = alloc_dup(char, stack->name.length + 1, stack->name.data); + va->time_begin = (float)stack->time_begin; + va->time_end = (float)stack->time_end; + va->framerate = framerate; + va->num_frames = num_frames; + + // Sample the animations of all nodes and blend channels in the stack + va->nodes = alloc(viewer_node_anim, scene->nodes.count); + for (size_t i = 0; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + read_node_anim(va, &va->nodes[i], stack, node); + } + + va->blend_channels = alloc(viewer_blend_channel_anim, scene->blend_channels.count); + for (size_t i = 0; i < scene->blend_channels.count; i++) { + ufbx_blend_channel *chan = scene->blend_channels.data[i]; + read_blend_channel_anim(va, &va->blend_channels[i], stack, chan); + } +} + +void read_scene(viewer_scene *vs, ufbx_scene *scene) +{ + vs->num_nodes = scene->nodes.count; + vs->nodes = alloc(viewer_node, vs->num_nodes); + for (size_t i = 0; i < vs->num_nodes; i++) { + read_node(&vs->nodes[i], scene->nodes.data[i]); + } + + vs->num_meshes = scene->meshes.count; + vs->meshes = alloc(viewer_mesh, vs->num_meshes); + for (size_t i = 0; i < vs->num_meshes; i++) { + read_mesh(&vs->meshes[i], scene->meshes.data[i]); + } + + vs->num_blend_channels = scene->blend_channels.count; + vs->blend_channels = alloc(viewer_blend_channel, vs->num_blend_channels); + for (size_t i = 0; i < vs->num_blend_channels; i++) { + read_blend_channel(&vs->blend_channels[i], scene->blend_channels.data[i]); + } + + vs->num_animations = scene->anim_stacks.count; + vs->animations = alloc(viewer_anim, vs->num_animations); + for (size_t i = 0; i < vs->num_animations; i++) { + read_anim_stack(&vs->animations[i], scene->anim_stacks.data[i], scene); + } +} + +void update_animation(viewer_scene *vs, viewer_anim *va, float time) +{ + float frame_time = (time - va->time_begin) * va->framerate; + size_t f0 = min_sz((size_t)frame_time + 0, va->num_frames - 1); + size_t f1 = min_sz((size_t)frame_time + 1, va->num_frames - 1); + float t = um_min(frame_time - (float)f0, 1.0f); + + for (size_t i = 0; i < vs->num_nodes; i++) { + viewer_node *vn = &vs->nodes[i]; + viewer_node_anim *vna = &va->nodes[i]; + + um_quat rot = vna->rot ? um_quat_lerp(vna->rot[f0], vna->rot[f1], t) : vna->const_rot; + um_vec3 pos = vna->pos ? um_lerp3(vna->pos[f0], vna->pos[f1], t) : vna->const_pos; + um_vec3 scale = vna->scale ? um_lerp3(vna->scale[f0], vna->scale[f1], t) : vna->const_scale; + + vn->node_to_parent = um_mat_trs(pos, rot, scale); + } + + for (size_t i = 0; i < vs->num_blend_channels; i++) { + viewer_blend_channel *vbc = &vs->blend_channels[i]; + viewer_blend_channel_anim *vbca = &va->blend_channels[i]; + + vbc->weight = vbca->weight ? um_lerp(vbca->weight[f0], vbca->weight[f1], t) : vbca->const_weight; + } +} + +void update_hierarchy(viewer_scene *vs) +{ + for (size_t i = 0; i < vs->num_nodes; i++) { + viewer_node *vn = &vs->nodes[i]; + + // ufbx stores nodes in order where parent nodes always precede child nodes so we can + // evaluate the transform hierarchy with a flat loop. + if (vn->parent_index >= 0) { + vn->node_to_world = um_mat_mul(vs->nodes[vn->parent_index].node_to_world, vn->node_to_parent); + } else { + vn->node_to_world = vn->node_to_parent; + } + vn->geometry_to_world = um_mat_mul(vn->node_to_world, vn->geometry_to_node); + vn->normal_to_world = um_mat_transpose(um_mat_inverse(vn->geometry_to_world)); + } +} + +void init_pipelines(viewer *view) +{ + sg_backend backend = sg_query_backend(); + + view->shader_mesh_lit_static = sg_make_shader(static_lit_shader_desc(backend)); + view->pipe_mesh_lit_static = sg_make_pipeline(&(sg_pipeline_desc){ + .shader = view->shader_mesh_lit_static, + .layout = mesh_vertex_layout, + .index_type = SG_INDEXTYPE_UINT32, + .face_winding = SG_FACEWINDING_CCW, + .cull_mode = SG_CULLMODE_BACK, + .depth = { + .compare = SG_COMPAREFUNC_LESS_EQUAL, + .write_enabled = true, + }, + }); + + view->shader_mesh_lit_skinned = sg_make_shader(skinned_lit_shader_desc(backend)); + view->pipe_mesh_lit_skinned = sg_make_pipeline(&(sg_pipeline_desc){ + .shader = view->shader_mesh_lit_skinned, + .layout = skinned_mesh_vertex_layout, + .index_type = SG_INDEXTYPE_UINT32, + .face_winding = SG_FACEWINDING_CCW, + .cull_mode = SG_CULLMODE_BACK, + .depth = { + .compare = SG_COMPAREFUNC_LESS_EQUAL, + .write_enabled = true, + }, + }); + + um_vec4 empty_blend_shape_data = { 0 }; + view->empty_blend_shape_image = sg_make_image(&(sg_image_desc){ + .type = SG_IMAGETYPE_ARRAY, + .width = 1, + .height = 1, + .num_slices = 1, + .pixel_format = SG_PIXELFORMAT_RGBA32F, + .data.subimage[0][0] = SG_RANGE(empty_blend_shape_data), + }); +} + +void load_scene(viewer_scene *vs, const char *filename) +{ + ufbx_load_opts opts = { + .load_external_files = true, + .allow_null_material = true, + .generate_missing_normals = true, + + // NOTE: We use this _only_ for computing the bounds of the scene! + // The viewer contains a proper implementation of skinning as well. + // You probably don't need this. + .evaluate_skinning = true, + + .target_axes = { + .right = UFBX_COORDINATE_AXIS_POSITIVE_X, + .up = UFBX_COORDINATE_AXIS_POSITIVE_Y, + .front = UFBX_COORDINATE_AXIS_POSITIVE_Z, + }, + .target_unit_meters = 1.0f, + }; + ufbx_error error; + ufbx_scene *scene = ufbx_load_file(filename, &opts, &error); + if (!scene) { + print_error(&error, "Failed to load scene"); + exit(1); + } + + read_scene(vs, scene); + + // Compute the world-space bounding box + vs->aabb_min = um_dup3(+INFINITY); + vs->aabb_max = um_dup3(-INFINITY); + for (size_t mesh_ix = 0; mesh_ix < vs->num_meshes; mesh_ix++) { + viewer_mesh *mesh = &vs->meshes[mesh_ix]; + um_vec3 aabb_origin = um_mul3(um_add3(mesh->aabb_max, mesh->aabb_min), 0.5f); + um_vec3 aabb_extent = um_mul3(um_sub3(mesh->aabb_max, mesh->aabb_min), 0.5f); + if (mesh->aabb_is_local) { + for (size_t inst_ix = 0; inst_ix < mesh->num_instances; inst_ix++) { + viewer_node *node = &vs->nodes[mesh->instance_node_indices[inst_ix]]; + um_vec3 world_origin = um_transform_point(&node->geometry_to_world, aabb_origin); + um_vec3 world_extent = um_transform_extent(&node->geometry_to_world, aabb_extent); + vs->aabb_min = um_min3(vs->aabb_min, um_sub3(world_origin, world_extent)); + vs->aabb_max = um_max3(vs->aabb_max, um_add3(world_origin, world_extent)); + } + } else { + vs->aabb_min = um_min3(vs->aabb_min, mesh->aabb_min); + vs->aabb_max = um_max3(vs->aabb_max, mesh->aabb_max); + } + } + + ufbx_free_scene(scene); +} + +bool backend_uses_d3d_perspective(sg_backend backend) +{ + switch (backend) { + case SG_BACKEND_GLCORE33: return false; + case SG_BACKEND_GLES2: return false; + case SG_BACKEND_GLES3: return false; + case SG_BACKEND_D3D11: return true; + case SG_BACKEND_METAL_IOS: return true; + case SG_BACKEND_METAL_MACOS: return true; + case SG_BACKEND_METAL_SIMULATOR: return true; + case SG_BACKEND_WGPU: return true; + case SG_BACKEND_DUMMY: return false; + default: assert(0 && "Unhandled backend"); return false; + } +} + +void update_camera(viewer *view) +{ + viewer_scene *vs = &view->scene; + + um_vec3 aabb_origin = um_mul3(um_add3(vs->aabb_max, vs->aabb_min), 0.5f); + um_vec3 aabb_extent = um_mul3(um_sub3(vs->aabb_max, vs->aabb_min), 0.5f); + float distance = 2.5f * powf(2.0f, view->camera_distance) * um_max(um_max(aabb_extent.x, aabb_extent.y), aabb_extent.z); + + um_quat camera_rot = um_quat_mul( + um_quat_axis_angle(um_v3(0,1,0), view->camera_yaw * UM_DEG_TO_RAD), + um_quat_axis_angle(um_v3(1,0,0), view->camera_pitch * UM_DEG_TO_RAD)); + + um_vec3 camera_target = aabb_origin; + um_vec3 camera_direction = um_quat_rotate(camera_rot, um_v3(0,0,1)); + um_vec3 camera_pos = um_add3(camera_target, um_mul3(camera_direction, distance)); + + view->world_to_view = um_mat_look_at(camera_pos, camera_target, um_v3(0,1,0)); + + float fov = 50.0f * UM_DEG_TO_RAD; + float aspect = (float)sapp_width() / (float)sapp_height(); + float near_plane = um_min(distance * 0.001f, 0.1f); + float far_plane = um_max(distance * 2.0f, 100.0f); + + if (backend_uses_d3d_perspective(sg_query_backend())) { + view->view_to_clip = um_mat_perspective_d3d(fov, aspect, near_plane, far_plane); + } else { + view->view_to_clip = um_mat_perspective_gl(fov, aspect, near_plane, far_plane); + } + view->world_to_clip = um_mat_mul(view->view_to_clip, view->world_to_view); +} + +void draw_mesh(viewer *view, viewer_node *node, viewer_mesh *mesh) +{ + sg_image blend_shapes = mesh->num_blend_shapes > 0 ? mesh->blend_shape_image : view->empty_blend_shape_image; + + if (mesh->skinned) { + sg_apply_pipeline(view->pipe_mesh_lit_skinned); + + skin_vertex_ubo_t skin_ubo = { 0 }; + for (size_t i = 0; i < mesh->num_bones; i++) { + viewer_node *bone = &view->scene.nodes[mesh->bone_indices[i]]; + skin_ubo.bones[i] = um_mat_mul(bone->node_to_world, mesh->bone_matrices[i]); + } + sg_apply_uniforms(SG_SHADERSTAGE_VS, SLOT_skin_vertex_ubo, SG_RANGE_REF(skin_ubo)); + + } else { + sg_apply_pipeline(view->pipe_mesh_lit_static); + + } + + mesh_vertex_ubo_t mesh_ubo = { + .geometry_to_world = node->geometry_to_world, + .normal_to_world = node->normal_to_world, + .world_to_clip = view->world_to_clip, + .f_num_blend_shapes = (float)mesh->num_blend_shapes, + }; + + // sokol-shdc only supports vec4 arrays so reinterpret this `um_vec4` array as `float` + float *blend_weights = (float*)mesh_ubo.blend_weights; + for (size_t i = 0; i < mesh->num_blend_shapes; i++) { + blend_weights[i] = view->scene.blend_channels[mesh->blend_channel_indices[i]].weight; + } + + sg_apply_uniforms(SG_SHADERSTAGE_VS, SLOT_mesh_vertex_ubo, SG_RANGE_REF(mesh_ubo)); + + for (size_t pi = 0; pi < mesh->num_parts; pi++) { + viewer_mesh_part *part = &mesh->parts[pi]; + + sg_bindings binds = { + .vertex_buffers[0] = part->vertex_buffer, + .vertex_buffers[1] = part->skin_buffer, + .index_buffer = part->index_buffer, + .vs_images[SLOT_blend_shapes] = blend_shapes, + }; + sg_apply_bindings(&binds); + + sg_draw(0, (int)part->num_indices, 1); + } +} + +void draw_scene(viewer *view) +{ + for (size_t mi = 0; mi < view->scene.num_meshes; mi++) { + viewer_mesh *mesh = &view->scene.meshes[mi]; + for (size_t ni = 0; ni < mesh->num_instances; ni++) { + viewer_node *node = &view->scene.nodes[mesh->instance_node_indices[ni]]; + draw_mesh(view, node, mesh); + } + } +} + +viewer g_viewer; +const char *g_filename; + +void init(void) +{ + sg_setup(&(sg_desc){ + .context = sapp_sgcontext(), + .buffer_pool_size = 4096, + .image_pool_size = 4096, + }); + + stm_setup(); + + init_pipelines(&g_viewer); + load_scene(&g_viewer.scene, g_filename); +} + +void onevent(const sapp_event *e) +{ + viewer *view = &g_viewer; + + switch (e->type) { + case SAPP_EVENTTYPE_MOUSE_DOWN: + view->mouse_buttons |= 1u << (uint32_t)e->mouse_button; + break; + case SAPP_EVENTTYPE_MOUSE_UP: + view->mouse_buttons &= ~(1u << (uint32_t)e->mouse_button); + break; + case SAPP_EVENTTYPE_UNFOCUSED: + view->mouse_buttons = 0; + break; + case SAPP_EVENTTYPE_MOUSE_MOVE: + if (view->mouse_buttons & 1) { + float scale = um_min((float)sapp_width(), (float)sapp_height()); + view->camera_yaw -= e->mouse_dx / scale * 180.0f; + view->camera_pitch -= e->mouse_dy / scale * 180.0f; + view->camera_pitch = um_clamp(view->camera_pitch, -89.0f, 89.0f); + } + break; + case SAPP_EVENTTYPE_MOUSE_SCROLL: + view->camera_distance += e->scroll_y * -0.02f; + view->camera_distance = um_clamp(view->camera_distance, -5.0f, 5.0f); + break; + default: + break; + } +} + +void frame(void) +{ + static uint64_t last_time; + float dt = (float)stm_sec(stm_laptime(&last_time)); + dt = um_min(dt, 0.1f); + + viewer_anim *anim = g_viewer.scene.num_animations > 0 ? &g_viewer.scene.animations[0] : NULL; + + if (anim) { + g_viewer.anim_time += dt; + if (g_viewer.anim_time >= anim->time_end) { + g_viewer.anim_time -= anim->time_end - anim->time_begin; + } + update_animation(&g_viewer.scene, anim, g_viewer.anim_time); + } + + update_camera(&g_viewer); + update_hierarchy(&g_viewer.scene); + + sg_pass_action action = { + .colors[0] = { + .action = SG_ACTION_CLEAR, + .value = { 0.1f, 0.1f, 0.2f }, + }, + }; + sg_begin_default_pass(&action, sapp_width(), sapp_height()); + + draw_scene(&g_viewer); + + sg_end_pass(); + sg_commit(); +} + +void cleanup(void) +{ + sg_shutdown(); +} + +sapp_desc sokol_main(int argc, char* argv[]) { + + if (argc <= 1) { + fprintf(stderr, "Usage: viewer file.fbx\n"); + exit(1); + } + + g_filename = argv[1]; + + return (sapp_desc){ + .init_cb = &init, + .event_cb = &onevent, + .frame_cb = &frame, + .cleanup_cb = &cleanup, + .width = 800, + .height = 600, + .sample_count = 4, + .window_title = "ufbx viewer", + }; +} diff --git a/modules/ufbx/first.jai b/modules/ufbx/first.jai new file mode 100644 index 0000000..73456ec --- /dev/null +++ b/modules/ufbx/first.jai @@ -0,0 +1,34 @@ +#import "Basic"; +#import "Compiler"; +#import "BuildCpp"; +#import "Check"; +#import "Bindings_Generator"; +#import "File"; + +#run { + set_build_options_dc(.{do_output=false}); + if !generate_bindings() { + compiler_set_workspace_status(.FAILED); + } +} + +generate_bindings :: () -> bool { + output_filename: string; + opts: Generate_Bindings_Options; + { + using opts; + + output_filename = "module.jai"; + + array_add(*libpaths, "."); + array_add(*libnames, "ufbx"); + array_add(*system_include_paths, GENERATOR_DEFAULT_SYSTEM_INCLUDE_PATH); + array_add(*source_files, "ufbx.h"); + array_add(*extra_clang_arguments, "-x", "c", "-DWIN32_LEAN_AND_MEAN"); + //strip_flags = 0; + generate_compile_time_struct_checks = false; + //strip_flags &= ~(Strip_Flags.CONSTRUCTORS | .DESTRUCTORS); + } + + return generate_bindings(opts, output_filename); +} diff --git a/modules/ufbx/misc/add_fuzz_cases.py b/modules/ufbx/misc/add_fuzz_cases.py new file mode 100644 index 0000000..652dbe8 --- /dev/null +++ b/modules/ufbx/misc/add_fuzz_cases.py @@ -0,0 +1,40 @@ +import os +import re +import argparse + +self_path = os.path.dirname(os.path.abspath(__file__)) +fuzz_path = os.path.join(self_path, "..", "data", "fuzz") + +p = argparse.ArgumentParser(prog="add_fuzz_cases.py") +p.add_argument("path", default=fuzz_path, help="Path where to rename files in") +p.add_argument("--ext", default="fbx", help="File extension") +argv = p.parse_args() + +fuzz_path = argv.path + +fuzz_files = { } +file_queue = [] + +RE_FUZZ = re.compile(f"fuzz_(\\d+).{re.escape(argv.ext)}") + +for name in os.listdir(fuzz_path): + path = os.path.join(fuzz_path, name) + with open(path, 'rb') as f: + content = f.read() + m = RE_FUZZ.match(name) + if m: + fuzz_files[content] = name + else: + file_queue.append((name, content)) + +for name, content in file_queue: + existing = fuzz_files.get(content) + if existing: + print("{}: Exists as {}".format(name, existing)) + else: + new_name = "fuzz_{:04}.{}".format(len(fuzz_files), argv.ext) + print("{}: Renaming to {}".format(name, new_name)) + fuzz_files[content] = new_name + path = os.path.join(fuzz_path, name) + new_path = os.path.join(fuzz_path, new_name) + os.rename(path, new_path) diff --git a/modules/ufbx/misc/analyze_stack.py b/modules/ufbx/misc/analyze_stack.py new file mode 100644 index 0000000..f66c3a0 --- /dev/null +++ b/modules/ufbx/misc/analyze_stack.py @@ -0,0 +1,414 @@ +from typing import NamedTuple, List, Mapping, Optional, Tuple, Set, DefaultDict +from collections import defaultdict +import pickle +import argparse + +import os +import io +import re + +import pcpp +from pycparser import c_ast, CParser + +g_failed = False + +def verbose(msg): + print(msg, flush=True) + +def error(msg): + global g_failed + print(f"\n{msg}", flush=True) + g_failed = True + +fake_includes = { } + +fake_includes["stdint.h"] = """ +#pragma once +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long uint64_t; +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef signed long int64_t; +""" + +fake_includes["stdbool.h"] = """ +#pragma once +#define bool _Bool +#define true 1 +#define false 0 +""" + +fake_includes["stddef.h"] = """ +typedef unsigned long size_t; +typedef unsigned long uintptr_t; +typedef long ptrdiff_t; +""" + +fake_includes["stdarg.h"] = """ +typedef int va_list; +""" + +fake_includes["stdio.h"] = """ +typedef int FILE; +typedef unsigned long fpos_t; +""" + +fake_includes["string.h"] = "" +fake_includes["stdlib.h"] = "" +fake_includes["locale.h"] = "" +fake_includes["math.h"] = "" +fake_includes["assert.h"] = "" + +class Preprocessor(pcpp.Preprocessor): + def __init__(self): + super().__init__() + + def on_file_open(self, is_system_include, includepath): + if is_system_include and os.path.basename(includepath) in fake_includes: + return io.StringIO(fake_includes[os.path.basename(includepath)]) + return super().on_file_open(is_system_include, includepath) + +class ValuePreprocessor(pcpp.Preprocessor): + def __init__(self, func: str, expr: str): + super().__init__() + self.func = func + self.expr = expr + + def on_unknown_macro_in_expr(self,tok): + raise RuntimeError(f"Bad recursion bound on function {self.func}: '{self.expr}'") + +class FuncInfo: + stack_usage: int + max_recursion: Optional[int] + calls: Set[str] + defined: bool + recursion_stack: List[str] + + def __init__(self): + self.stack_usage = 0 + self.max_recursion = None + self.calls = set() + self.defined = False + self.recursion_stack = [] + self.largest_call = "" + +class StackUsage(NamedTuple): + usage: int + largest_call: str + +class File: + functions: DefaultDict[str, FuncInfo] + stack_usage: Mapping[str, StackUsage] + addresses: Set[str] + max_dynamic_usage: int + recursion_errors: Mapping[str, List[str]] + + def __init__(self): + self.functions = defaultdict(FuncInfo) + self.stack_usage = {} + self.addresses = set() + self.max_dynamic_usage = 0 + self.recursion_errors = {} + +class AstVisitor(c_ast.NodeVisitor): + file: File + current_func: str + + def __init__(self, file: File): + self.file = file + self.current_func = None + + def visit_FuncDef(self, node: c_ast.FuncDecl): + if node.body: + func = node.decl.name + if not (func.startswith("ufbx_") or func.startswith("ufbxi_")): + error(f"Bad function definition: {func}") + self.file.functions[func].defined = True + + self.current_func = node.decl.name + self.visit(node.body) + self.current_func = None + + def visit_UnaryOp(self, node: c_ast.UnaryOp): + if node.op == "&" and isinstance(node.expr, c_ast.ID): + self.file.addresses.add(node.expr.name) + self.visit(node.expr) + + def visit_FuncCall(self, node: c_ast.FuncCall): + src = self.current_func + if src: + dst = node.name.name + if (isinstance(dst, str) and (dst.startswith("ufbxi_") or dst.startswith("ufbx_"))): + self.file.functions[src].calls.add(dst) + if node.args: + self.visit(node.args) + +def get_stack_usage_to(file: File, func: str, target: str, seen: Set[str] = set()) -> Optional[Tuple[int, List[str]]]: + if func in seen: + return (0, []) if func == target else None + info = file.functions.get(func) + if not info: + raise RuntimeError(f"Function not found: {func}") + + seen = seen | { func } + + max_path = None + for call in info.calls: + path = get_stack_usage_to(file, call, target, seen) + if path is not None: + if max_path: + max_path = max(max_path, path) + else: + max_path = path + + if max_path: + max_usage, stack = max_path + usage = info.stack_usage + max_usage + return (usage, [func] + stack) + else: + return None + +def add_ignore(ignores: str, ignore: str) -> str: + if not ignores: ignores = "/" + parts = ignores[1:].split(",") + [ignore] + return "/" + ",".join(sorted(p for p in parts if p)) + +def is_ignored(ignores: str, func: str) -> bool: + return ignores and func in ignores[1:].split(",") + +def get_stack_usage(file: File, func: str, ignores: str = "", stack: List[str] = []) -> StackUsage: + if is_ignored(ignores, func): + return StackUsage(-1, "") + + key = f"{func}{ignores}" if ignores else func + existing = file.stack_usage.get(key) + if existing is not None: return existing + + info = file.functions.get(func) + if not info: + raise RuntimeError(f"Function not found: {func}") + + if info.max_recursion: + rec_path = get_stack_usage_to(file, func, func) + if rec_path is None: + error(f"Unnecessary recursion tag in {func}()\nContains ufbxi_assert_max_recursion() but could not find recursive path to itself") + rec_path = (0, []) + + rec_usage, rec_stack = rec_path + info.recursion_stack = rec_stack + self_usage = rec_usage * (info.max_recursion - 1) + info.stack_usage + child_ignores = add_ignore(ignores, func) + stack = [] + else: + self_usage = info.stack_usage + child_ignores = ignores + + if func in stack: + pos = stack.index(func) + error_stack = stack[pos:] + [func] + prev_error = file.recursion_errors.get(func) + if not prev_error or len(prev_error) > len(error_stack): + file.recursion_errors[func] = error_stack + return StackUsage(0, "") + + stack = stack + [func] + + max_usage = StackUsage(0, "") + for call in info.calls: + usage = get_stack_usage(file, call, child_ignores, stack).usage + max_usage = max(max_usage, StackUsage(usage, f"{call}{child_ignores}")) + + usage = StackUsage(self_usage + max_usage.usage, max_usage.largest_call) + file.stack_usage[key] = usage + return usage + +def parse_file(c_path: str, su_path: str, cache_path: Optional[str]) -> File: + pp = Preprocessor() + pp.define("UFBX_STANDARD_C") + pp.define("UFBXI_ANALYSIS_PARSER") + pp.define("UFBXI_ANALYSIS_RECURSIVE") + + if cache_path and os.path.exists(cache_path) and os.path.getmtime(cache_path) > os.path.getmtime(c_path): + verbose(f"Loading AST cache: {cache_path}") + with open(cache_path, "rb") as f: + ast, max_recursions = pickle.load(f) + else: + max_recursions = { } + + verbose(f"Preprocessing C file: {c_path}") + pp_stream = io.StringIO() + with open(c_path) as f: + pp.parse(f.read(), "ufbx.c") + pp.write(pp_stream) + pp_source = pp_stream.getvalue() + + re_recursive_function = re.compile(r"UFBXI_RECURSIVE_FUNCTION\s*\(\s*(\w+),\s*(.+)\s*\);") + for line in pp_source.splitlines(): + m = re_recursive_function.search(line) + if m: + name, rec_expr = m.groups() + lit_pp = ValuePreprocessor(name, rec_expr) + toks = lit_pp.tokenize(rec_expr) + rec_value, _ = lit_pp.evalexpr(toks) + if not rec_value: + raise RuntimeError(f"Bad recursion bound on function {name}: '{rec_expr}'") + max_recursions[name] = rec_value + + pp_source = re_recursive_function.sub("", pp_source) + + verbose("Parsing C file") + parser = CParser() + ast = parser.parse(pp_source) + + if cache_path: + verbose(f"Writing AST cache: {cache_path}") + with open(cache_path, "wb") as f: + pickle.dump((ast, max_recursions), f) + + verbose("Visiting AST") + file = File() + visitor = AstVisitor(file) + visitor.visit(ast) + + # Gather maximum recursion from file + for func, rec in max_recursions.items(): + file.functions[func].max_recursion = rec + + if su_path: + verbose(f"Reading stack usage file: {su_path}") + with open(su_path) as f: + for line in f: + line = line.strip() + if not line: continue + m = re.match(r".*:\d+:(?:\d+:)?(\w+)(?:\.[a-z0-9\.]+)?\s+(\d+)\s+([a-z,]+)", line) + if not m: + raise RuntimeError(f"Bad .su line: {line}") + func, stack, usage = m.groups() + assert usage in ("static", "dynamic,bounded") + file.functions[func].stack_usage = int(stack) + + return file + +def get_max_dynamic_usage(file: File) -> Tuple[int, str]: + max_dynamic_usage = (0, "") + + addr_funcs = file.addresses & set(file.functions.keys()) + for func in addr_funcs: + usage = get_stack_usage(file, func).usage + max_dynamic_usage = max(max_dynamic_usage, (usage, func)) + + return max_dynamic_usage + +def dump_largest_stack(file: File, func: str) -> List[str]: + usage = file.stack_usage[func] + print(f"{func}() {usage.usage} bytes") + index = 0 + while True: + if "/" in func: + raw_func, _ = func.split("/") + else: + raw_func = func + info = file.functions.get(raw_func) + stack_usage = file.stack_usage.get(func) + if not info: break + + if info.recursion_stack: + rec_usage = 0 + for ix, frame in enumerate(info.recursion_stack): + rec_info = file.functions[frame] + ch = "|" if ix > 0 else ">" + fn = f"{frame}()" + usage = f"+{rec_info.stack_usage} bytes" + rec_usage += rec_info.stack_usage + print(f"{ch}{index:3} {fn:<40}{usage:>14}") + index += 1 + + rec_extra = info.max_recursion - 1 + usage = f"(+{rec_usage * rec_extra} bytes)" + prefix = f"(recursion {info.max_recursion} times)" + index += rec_extra * len(info.recursion_stack) + dots = "." * len(str(index - 1)) + print(f"|{dots:>3} {prefix:<39}{usage:>16}") + + fn = f"{raw_func}()" + usage = f"+{info.stack_usage} bytes" + print(f"{index:4} {fn:<40}{usage:>14}") + func = stack_usage.largest_call + index += 1 + +if __name__ == "__main__": + parser = argparse.ArgumentParser("analyze_stack.py") + parser.add_argument("su", nargs="?", help="Stack usage .su file") + parser.add_argument("--source", help="Path to ufbx.c") + parser.add_argument("--cache", help="Cache file to use") + parser.add_argument("--limit", help="Maximum stack usage in bytes") + parser.add_argument("--no-su", action="store_true", help="Allow running with no .su file") + argv = parser.parse_args() + + if argv.su: + su_path = argv.su + elif not argv.no_su: + raise RuntimeError("Expected an .su file as a positional argument") + else: + su_path = "" + + if argv.source: + c_path = argv.source + else: + c_path = os.path.relpath(os.path.join(os.path.dirname(__file__), "..", "ufbx.c")) + + file = parse_file(c_path, su_path, argv.cache) + + if su_path: + file.max_dynamic_usage = get_max_dynamic_usage(file) + + max_usage = (0, "") + for func in file.functions: + usage = get_stack_usage(file, func) + max_usage = max(max_usage, (usage.usage, func)) + + if argv.limit: + limit = int(argv.limit, base=0) + total = max_usage[0] + file.max_dynamic_usage[0] + if total >= limit: + error(f"Stack overflow in {max_usage[1]}: {max_usage[0]} bytes + {file.max_dynamic_usage[0]} dynamic\noverflows limit of {limit} bytes") + print("\nLargest stack:") + dump_largest_stack(file, max_usage[1]) + print("\nLargest dynamic stack:") + dump_largest_stack(file, file.max_dynamic_usage[1]) + + for func, stack in file.recursion_errors.items(): + stack_str = "\n".join(f"{ix:3}: {s}()" for ix, s in enumerate(stack)) + error(f"Unbounded recursion in {func}()\nStack trace:\n{stack_str}") + + if not g_failed: + interesting_functions = [ + "ufbx_load_file", + "ufbx_evaluate_scene", + "ufbx_subdivide_mesh", + "ufbx_tessellate_nurbs_surface", + "ufbx_tessellate_nurbs_curve", + "ufbx_evaluate_transform", + "ufbx_generate_indices", + "ufbx_inflate", + "ufbx_triangulate_face", + ] + + for func in interesting_functions: + print() + dump_largest_stack(file, func) + + print() + print("Largest potentially dynamically called stack:") + dump_largest_stack(file, file.max_dynamic_usage[1]) + else: + print("Skipping further tests due to no .su file specified") + + if g_failed: + exit(1) + else: + print() + print("Success!") diff --git a/modules/ufbx/misc/check_dataset.py b/modules/ufbx/misc/check_dataset.py new file mode 100644 index 0000000..67b23d3 --- /dev/null +++ b/modules/ufbx/misc/check_dataset.py @@ -0,0 +1,226 @@ +import os +import json +from typing import NamedTuple, Optional, List +import subprocess +import glob +import re +import urllib.parse + +class TestModel(NamedTuple): + fbx_path: str + obj_path: Optional[str] + mtl_path: Optional[str] + mat_path: Optional[str] + frame: Optional[int] + +class TestCase(NamedTuple): + root: str + json_path: str + title: str + author: str + license: str + url: str + extra_files: List[str] + models: List[TestModel] + +def log(message=""): + print(message, flush=True) + +def single_file(path): + if os.path.exists(path): + return [path] + else: + return [] + +def strip_ext(path): + if path.endswith(".gz"): + path = path[:-3] + base, _ = os.path.splitext(path) + return base + +def get_fbx_files(json_path): + base_path = strip_ext(json_path) + yield from single_file(f"{base_path}.fbx") + yield from single_file(f"{base_path}.ufbx.obj") + yield from glob.glob(f"{glob.escape(base_path)}/*.fbx") + +def get_obj_files(fbx_path): + base_path = strip_ext(fbx_path) + yield from single_file(f"{base_path}.obj.gz") + yield from single_file(f"{base_path}.obj") + yield from glob.glob(f"{glob.escape(base_path)}_*.obj.gz") + yield from glob.glob(f"{glob.escape(base_path)}_*.obj") + +def get_mtl_files(obj_path): + base_path = strip_ext(obj_path) + yield from single_file(f"{base_path}.mtl") + +def get_mat_files(obj_path): + base_path = strip_ext(obj_path) + yield from single_file(f"{base_path}.mat") + +def remove_duplicate_files(paths): + seen = set() + for path in paths: + base = strip_ext(path) + if base in seen: continue + seen.add(base) + yield path + +def gather_case_models(json_path): + for fbx_path in get_fbx_files(json_path): + for obj_path in remove_duplicate_files(get_obj_files(fbx_path)): + mtl_path = next(get_mtl_files(obj_path), None) + mat_path = next(get_mat_files(fbx_path), None) + + fbx_base = strip_ext(fbx_path) + obj_base = strip_ext(obj_path) + + flags = obj_base[len(fbx_base):].split("_") + + # Parse flags + frame = None + for flag in flags: + m = re.match(r"frame(\d+)", flag) + if m: + frame = int(m.group(1)) + + yield TestModel( + fbx_path=fbx_path, + obj_path=obj_path, + mtl_path=mtl_path, + mat_path=mat_path, + frame=frame) + + else: + # TODO: Handle objless fbx + pass + +def gather_dataset_tasks(root_dir): + for root, _, files in os.walk(root_dir): + for filename in files: + if not filename.endswith(".json"): + continue + + path = os.path.join(root, filename) + with open(path, "rt", encoding="utf-8") as f: + desc = json.load(f) + + models = list(gather_case_models(path)) + if not models: + raise RuntimeError(f"No models found for {path}") + + extra_files = [os.path.join(root, ex) for ex in desc.get("extra-files", [])] + + yield TestCase( + root=root_dir, + json_path=path, + title=desc["title"], + author=desc["author"], + license=desc["license"], + url=desc["url"], + extra_files=extra_files, + models=models, + ) + +if __name__ == "__main__": + from argparse import ArgumentParser + + parser = ArgumentParser("check_dataset.py --root ") + parser.add_argument("--root", help="Root directory to search for .json files") + parser.add_argument("--host-url", help="URL where the files are hosted") + parser.add_argument("--exe", help="check_fbx.c executable") + parser.add_argument("--verbose", action="store_true", help="Print verbose information") + argv = parser.parse_args() + + cases = list(gather_dataset_tasks(root_dir=argv.root)) + + def fmt_url(path, root=""): + if root: + path = os.path.relpath(path, root) + path = path.replace("\\", "/") + safe_path = urllib.parse.quote(path) + return f"{argv.host_url}/{safe_path}" + + def fmt_rel(path, root=""): + if root: + path = os.path.relpath(path, root) + path = path.replace("\\", "/") + return f"{path}" + + ok_count = 0 + test_count = 0 + + case_ok_count = 0 + + for case in cases: + + log(f"== '{case.title}' by '{case.author}' ({case.license}) ==") + log() + + if case.url: + log(f" source url: {case.url}") + log(f" .json url: {fmt_url(case.json_path, case.root)}") + for extra in case.extra_files: + log(f" extra url: {fmt_url(extra, case.root)}") + log() + + case_ok = True + + for model in case.models: + test_count += 1 + + args = [argv.exe] + args.append(model.fbx_path) + + extra = [] + + if model.obj_path: + args += ["--obj", model.obj_path] + + if model.mat_path: + args += ["--mat", model.mat_path] + + if model.frame is not None: + extra.append(f"frame {model.frame}") + args += ["--frame", str(model.frame)] + + name = fmt_rel(model.fbx_path, case.root) + + extra_str = "" + if extra: + extra_str = " [" + ", ".join(extra) + "]" + + log(f"-- {name}{extra_str} --") + log() + if argv.host_url: + log(f" .fbx url: {fmt_url(model.fbx_path, case.root)}") + if model.obj_path: + log(f" .obj url: {fmt_url(model.obj_path, case.root)}") + if model.mtl_path: + log(f" .mtl url: {fmt_url(model.mtl_path, case.root)}") + if model.mat_path: + log(f" .mat url: {fmt_url(model.mat_path, case.root)}") + + log() + log("$ " + " ".join(args)) + log() + + try: + subprocess.check_call(args) + log() + log("-- PASS --") + ok_count += 1 + except subprocess.CalledProcessError: + log() + log("-- FAIL --") + case_ok = False + log() + + if case_ok: + case_ok_count += 1 + + log(f"{ok_count}/{test_count} files passed ({case_ok_count}/{len(cases)} test cases)") + + if ok_count < test_count: + exit(1) diff --git a/modules/ufbx/misc/check_formatting.py b/modules/ufbx/misc/check_formatting.py new file mode 100644 index 0000000..f24edbe --- /dev/null +++ b/modules/ufbx/misc/check_formatting.py @@ -0,0 +1,87 @@ +import argparse +import re +import sys + +def strip_comments(line): + if "//" in line: + return line[:line.index("//")] + else: + return line + +def forbid(r, line, err): + m = re.search(r, line) + if m: + return (err, m.start(1), m.end(1)) + else: + return None + +def no_trailing_whitespace(line): + return forbid(r"(\s+)$", line, "trailing whitespace is forbidden") + +def indent_tabs(line): + return forbid(r"^\s*?( +)\s*", line, "tabs should be used for indentation") + +def no_trailing_tabs(line): + return forbid(r"\S.*(\t+)", line, "tabs should only appear in the beginning of a line") + +def keyword_spacing(line): + line = strip_comments(line) + return forbid(r"\b(?:for|if|while)(\()", line, "expected space after keyword") + +def pointer_alignment(line): + line = strip_comments(line) + return forbid(r"\w(\* )\w", line, "pointers should be aligned to the right") + +checks = [ + no_trailing_whitespace, + indent_tabs, + no_trailing_tabs, + keyword_spacing, + pointer_alignment, +] + +def check_file(path, colors): + failed = False + if colors: + c_gray = "\033[1;30m" + c_green = "\033[1;32m" + c_red = "\033[1;31m" + c_white = "\033[1;97m" + c_def = "\033[0m" + else: + c_gray = "" + c_green = "" + c_red = "" + c_white = "" + c_def = "" + with open(path, "rt") as f: + for ix, line in enumerate(f): + line = line.rstrip("\r\n") + for check in checks: + err = check(line) + if err: + err_desc, err_begin, err_end = err + l = f"{c_white}{path}:{ix + 1}:{err_begin + 1}: {c_red}error:{c_white} {err_desc} [{check.__name__}]{c_def}" + s = line + s = s.replace("\t", f"{c_gray}\u2192{c_def}") + s = s.replace(" ", f"{c_gray}\u00B7{c_def}") + e = " " * err_begin + c_green + "^" * (err_end - err_begin) + c_def + print(f"{l}\n {s}\n {e}") + failed = True + return failed + + +if __name__ == "__main__": + p = argparse.ArgumentParser("check_formatting.py") + p.add_argument("files", nargs="*") + p.add_argument("--no-color", action="store_true") + argv = p.parse_args() + + failed = False + colors = not argv.no_color and sys.stdout.isatty() + for f in argv.files: + if check_file(f, colors): + failed = True + + if failed: + sys.exit(1) diff --git a/modules/ufbx/misc/compiler_test.c b/modules/ufbx/misc/compiler_test.c new file mode 100644 index 0000000..dbd7f55 --- /dev/null +++ b/modules/ufbx/misc/compiler_test.c @@ -0,0 +1,12 @@ +#include +#include +#include + +int main(int argc, char **argv) +{ + if (argc > 1) { + float val = (float)atof(argv[1]); + printf("sin(%.2f) = %.2f\n", val, sinf(val)); + } + return 0; +} diff --git a/modules/ufbx/misc/compiler_test.cpp b/modules/ufbx/misc/compiler_test.cpp new file mode 100644 index 0000000..73fe2ce --- /dev/null +++ b/modules/ufbx/misc/compiler_test.cpp @@ -0,0 +1,12 @@ +#include +#include +#include + +int main(int argc, char **argv) +{ + if (argc > 1) { + float val = (float)atof(argv[1]); + printf("sin(%.2f) = %.2f\n", val, std::sin(val)); + } + return 0; +} diff --git a/modules/ufbx/misc/deflate_benchmark/deflate_benchmark.cpp b/modules/ufbx/misc/deflate_benchmark/deflate_benchmark.cpp new file mode 100644 index 0000000..1a2b140 --- /dev/null +++ b/modules/ufbx/misc/deflate_benchmark/deflate_benchmark.cpp @@ -0,0 +1,169 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include + +#define CPUTIME_IMPLEMENTATION +#include "../../test/cputime.h" +#include "../../ufbx.h" + +#include +#include +#include +#include + +#define UFBX_RETAIN 1 + +int inflate_memory(const void *src, int srcLen, void *dst, int dstLen) { + z_stream strm = {0}; + strm.total_in = strm.avail_in = srcLen; + strm.total_out = strm.avail_out = dstLen; + strm.next_in = (Bytef *) src; + strm.next_out = (Bytef *) dst; + + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + + int err = -1; + int ret = -1; + + err = inflateInit2(&strm, 15); + if (err == Z_OK) { + err = inflate(&strm, Z_FINISH); + if (err == Z_STREAM_END) { + ret = strm.total_out; + } + else { + inflateEnd(&strm); + return err; + } + } + else { + inflateEnd(&strm); + return err; + } + + inflateEnd(&strm); + return ret; +} + +std::vector read_file(const char *path) +{ + FILE *f = fopen(path, "rb"); + fseek(f, 0, SEEK_END); + std::vector data; + data.resize(ftell(f)); + fseek(f, 0, SEEK_SET); + fread(data.data(), 1, data.size(), f); + fclose(f); + return data; +} + +struct deflate_stream +{ + const void *data; + size_t compressed_size; + size_t decompressed_size; + + uint64_t zlib_time = UINT64_MAX; + uint64_t ufbx_time = UINT64_MAX; +}; + +int main(int argc, char **argv) +{ + std::vector data = read_file(argv[1]); + std::vector streams; + std::vector dst_buf; + + cputime_begin_init(); + + size_t max_decompressed_size = 0; + + for (size_t offset = 0; offset < data.size(); ) { + deflate_stream stream; + stream.compressed_size = *(uint32_t*)(data.data() + offset + 0); + stream.decompressed_size = *(uint32_t*)(data.data() + offset + 4); + stream.data = data.data() + offset + 8; + offset += 8 + stream.compressed_size; + if (stream.decompressed_size > max_decompressed_size) { + max_decompressed_size = stream.decompressed_size; + } + streams.push_back(stream); + } + + if (argc > 2) { + deflate_stream single = streams[atoi(argv[2])]; + streams.clear(); + streams.push_back(single); + } + + size_t runs = 3; + if (argc > 3) { + runs = (size_t)atoi(argv[3]); + } + + dst_buf.resize(max_decompressed_size); + + for (size_t i = 0; i < runs; i++) { + for (deflate_stream &stream : streams) { + uint64_t begin = cputime_cpu_tick(); + + int ret = inflate_memory(stream.data, (int)stream.compressed_size, + dst_buf.data(), (int)stream.decompressed_size); + assert(ret == stream.decompressed_size); + + uint64_t end = cputime_cpu_tick(); + + if (argc > 20) { + fwrite(dst_buf.data(), 1, stream.decompressed_size, stdout); + } + + stream.zlib_time = std::min(stream.zlib_time, end - begin); + } + +#if UFBX_RETAIN + ufbx_inflate_retain retain; + retain.initialized = false; +#endif + + for (deflate_stream &stream : streams) { + uint64_t begin = cputime_cpu_tick(); + +#if !UFBX_RETAIN + ufbx_inflate_retain retain; + retain.initialized = false; +#endif + + ufbx_inflate_input input = { }; + input.data_size = input.total_size = stream.compressed_size; + input.data = stream.data; + ptrdiff_t ret = ufbx_inflate(dst_buf.data(), stream.decompressed_size, &input, &retain); + assert(ret == stream.decompressed_size); + + if (argc > 20) { + fwrite(dst_buf.data(), 1, stream.decompressed_size, stdout); + } + + uint64_t end = cputime_cpu_tick(); + stream.ufbx_time = std::min(stream.ufbx_time, end - begin); + } + } + + cputime_end_init(); + + uint32_t index = 0; + for (deflate_stream &stream : streams) { + double ufbx_sec = cputime_cpu_delta_to_sec(NULL, stream.ufbx_time); + double zlib_sec = cputime_cpu_delta_to_sec(NULL, stream.zlib_time); + double ufbx_cbp = (double)stream.ufbx_time / (double)stream.decompressed_size; + double zlib_cbp = (double)stream.zlib_time / (double)stream.decompressed_size; + + printf("[%6.2f] %3u: %10zu -> %10zu bytes: %8.4fms (%6.2fcy/b) vs %8.4fms (%6.2fcy/b)\n", + ufbx_sec / zlib_sec * 100.0, index, + stream.compressed_size, stream.decompressed_size, + ufbx_sec*1e3, ufbx_cbp, zlib_sec*1e3, zlib_cbp); + index++; + } + + return 0; +} diff --git a/modules/ufbx/misc/deflate_benchmark/gather_deflate.py b/modules/ufbx/misc/deflate_benchmark/gather_deflate.py new file mode 100644 index 0000000..deb1fcf --- /dev/null +++ b/modules/ufbx/misc/deflate_benchmark/gather_deflate.py @@ -0,0 +1,21 @@ +import argparse +import os +import subprocess + +parser = argparse.ArgumentParser(description="Gather DEFLATE compressed streams from .fbx files") +parser.add_argument("--exe", help="Executable path for per-file gathering, see `gather_deflate_main.cpp`") +parser.add_argument("-o", help="Output file") +parser.add_argument("--root", help="Root path to look for .fbx files") +argv = parser.parse_args() + +data = bytearray() + +for root,_,files in os.walk(argv.root): + for file in files: + if not file.endswith(".fbx"): continue + path = os.path.join(root, file) + print(path) + data += subprocess.check_output([argv.exe, path]) + +with open(argv.o, "wb") as f: + f.write(data) diff --git a/modules/ufbx/misc/deflate_benchmark/gather_deflate_main.cpp b/modules/ufbx/misc/deflate_benchmark/gather_deflate_main.cpp new file mode 100644 index 0000000..76b53bb --- /dev/null +++ b/modules/ufbx/misc/deflate_benchmark/gather_deflate_main.cpp @@ -0,0 +1,61 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include "../../test/domfuzz/fbxdom.h" +#include +#include +#include + +#ifdef _WIN32 + #include + #include +#endif + +std::vector read_file(const char *path) +{ + FILE *f = fopen(path, "rb"); + fseek(f, 0, SEEK_END); + std::vector data; + data.resize(ftell(f)); + fseek(f, 0, SEEK_SET); + fread(data.data(), 1, data.size(), f); + fclose(f); + return data; +} + +void dump_deflate_arrays(fbxdom::node_ptr node) +{ + for (fbxdom::value &value : node->values) { + if (value.data_array.encoding == 1) { + uint32_t decompressed_size = 0; + switch (value.type) { + case 'c': case 'b': decompressed_size = value.data_array.length * 1; break; + case 'i': case 'f': decompressed_size = value.data_array.length * 4; break; + case 'l': case 'd': decompressed_size = value.data_array.length * 8; break; + } + + fwrite(&value.data_array.compressed_length, 4, 1, stdout); + fwrite(&decompressed_size, 4, 1, stdout); + + fwrite(value.data.data(), 1, value.data.size(), stdout); + } + } + + for (fbxdom::node_ptr &child : node->children) { + dump_deflate_arrays(child); + } +} + +int main(int argc, char **argv) +{ + std::vector data = read_file(argv[1]); + fbxdom::node_ptr root = fbxdom::parse(data.data(), data.size()); + if (!root) return 0; + +#ifdef _WIN32 + _setmode(_fileno(stdout), O_BINARY); +#endif + + dump_deflate_arrays(root); + + return 0; +} diff --git a/modules/ufbx/misc/deflate_lut.py b/modules/ufbx/misc/deflate_lut.py new file mode 100644 index 0000000..7a78829 --- /dev/null +++ b/modules/ufbx/misc/deflate_lut.py @@ -0,0 +1,39 @@ + +# Generate lookup table for `base + read(bits)` Deflate operands +def deflate_lookup_table(pairs): + for (base, bits, flags) in pairs: + assert bits < (1 << 4) + assert (flags & 0xe0) == flags + assert base < (1 << 16) + yield bits | flags | base << 16 + +def format_table(data, cols): + data = list(data) + for base in range(0, len(data), cols): + yield ''.join('0x{:08x}, '.format(x) for x in data[base:base+cols]) + +# Deflate RFC 1951 3.2.5. tables +length_operands = [ + (0,0,0x20),(3,0,0x40),(4,0,0x40),(5,0,0x40),(6,0,0x40),(7,0,0x40),(8,0,0x40),(9,0,0x40),(10,0,0x40),(11,1,0x40), + (13,1,0x40),(15,1,0x40),(17,1,0x40),(19,2,0x40),(23,2,0x40),(27,2,0x40),(31,2,0x40),(35,3,0x40), + (43,3,0x40),(51,3,0x40),(59,3,0x40),(67,4,0x40),(83,4,0x40),(99,4,0x40),(115,4,0x40),(131,5,0x40), + (163,5,0x40),(195,5,0x40),(227,5,0x40),(258,0,0x40), + (1,0,0x20),(1,0,0x20), +] +dist_operands = [ + (1,0,0),(2,0,0),(3,0,0),(4,0,0),(5,1,0),(7,1,0),(9,2,0),(13,2,0),(17,3,0), + (25,3,0),(33,4,0),(49,4,0),(65,5,0),(97,5,0),(129,6,0),(193,6,0),(257,7,0), + (385,7,0),(513,8,0),(769,8,0),(1025,9,0),(1537,9,0),(2049,10,0),(3073,10,0), + (4097,11,0),(6145,11,0),(8193,12,0),(12289,12,0),(16385,13,0),(24577,13,0), + (1,0,0x20),(1,0,0x20), +] + +print('static const uint32_t ufbxi_deflate_length_lut[] = {') +table = deflate_lookup_table(length_operands) +print('\n'.join('\t' + t for t in format_table(table, 8))) +print('};') + +print('static const uint32_t ufbxi_deflate_dist_lut[] = {') +table = deflate_lookup_table(dist_operands) +print('\n'.join('\t' + t for t in format_table(table, 8))) +print('};') diff --git a/modules/ufbx/misc/deflate_testcases/multi_part_matches.zlib b/modules/ufbx/misc/deflate_testcases/multi_part_matches.zlib new file mode 100644 index 0000000..bc846ee Binary files /dev/null and b/modules/ufbx/misc/deflate_testcases/multi_part_matches.zlib differ diff --git a/modules/ufbx/misc/downgrade_header.sh b/modules/ufbx/misc/downgrade_header.sh new file mode 100644 index 0000000..7ec5e47 --- /dev/null +++ b/modules/ufbx/misc/downgrade_header.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +TAG=$( set -x; python3 misc/get_header_tag.py ) + +echo "Header version tag: $TAG" +if [[ "$TAG" == v*.*.0 ]]; then + echo "No older header available" +elif [[ "$TAG" == v*.*.* ]]; then + OLD_TAG="${TAG%.*}".0 + OLD_COMMIT=$( set -x; git rev-list -n 1 "$OLD_TAG" ) + echo "Downgrading ufbx.h to tag $OLD_TAG, commit $OLD_COMMIT" + ( set -x; git checkout "$OLD_TAG" -- ufbx.h ) +else + echo "Error: Malformed tag \"$TAG\"" + exit 1 +fi diff --git a/modules/ufbx/misc/enum_type_perfect_hash.py b/modules/ufbx/misc/enum_type_perfect_hash.py new file mode 100644 index 0000000..22bd44b --- /dev/null +++ b/modules/ufbx/misc/enum_type_perfect_hash.py @@ -0,0 +1,127 @@ +from collections import namedtuple + +NameEnum = namedtuple("NameEnum", "name hash enum") + +def str_hash(s): + h = 0x811c9dc5 + for c in s: + h = ((h ^ ord(c)) * 0x01000193) & 0xffffffff + if h == 0: h = 1 + return h + +def nameEnum(name, enum): + return NameEnum(name, str_hash(name), enum) + +prop_types = [ + nameEnum("Boolean", "BOOLEAN"), + nameEnum("bool", "BOOLEAN"), + nameEnum("Integer", "INTEGER"), + nameEnum("int", "INTEGER"), + nameEnum("enum", "INTEGER"), + nameEnum("Number", "NUMBER"), + nameEnum("double", "NUMBER"), + nameEnum("Vector", "VECTOR"), + nameEnum("Vector3D", "VECTOR"), + nameEnum("Color", "COLOR"), + nameEnum("ColorRGB", "COLOR"), + nameEnum("String", "STRING"), + nameEnum("KString", "STRING"), + nameEnum("DateTime", "DATE_TIME"), + nameEnum("Lcl Translation", "TRANSLATION"), + nameEnum("Lcl Rotation", "ROTATION"), + nameEnum("Lcl Scaling", "SCALING"), +] + +node_types = [ + nameEnum("Model", "MODEL"), + nameEnum("Geometry", "MESH"), + nameEnum("Material", "MATERIAL"), + nameEnum("Texture", "TEXTURE"), + nameEnum("AnimationCurveNode", "ANIMATION"), + nameEnum("AnimationCurve", "ANIMATION_CURVE"), + nameEnum("AnimationLayer", "ANIMATION_LAYER"), + nameEnum("NodeAttribute", "ATTRIBUTE"), +] + +element_mapping_types = [ + nameEnum("ByVertex", "VERTEX"), + nameEnum("ByVertice", "VERTEX"), + nameEnum("ByPolygon", "POLYGON"), + nameEnum("ByPolygonVertex", "POLYGON_VERTEX"), + nameEnum("ByEdge", "EDGE"), + nameEnum("AllSame", "ALL_SAME"), +] + +element_types = [ + nameEnum("Normal", "NORMAL"), + nameEnum("Binormal", "BINORMAL"), + nameEnum("Tangent", "TANGENT"), + nameEnum("Color", "VERTEX_COLOR"), + nameEnum("UV", "UV"), + nameEnum("EdgeCrease", "EDGE_CREASE"), + nameEnum("Material", "FACE_MATERIAL"), +] + +def find_params(names, map_size, max_k, max_s): + arr = [None] * map_size + for k in range(max_k): + for s in range(0, max_s): + for i in range(map_size): + arr[i] = None + for n in names: + ix = (n.hash * k >> s) % map_size + if arr[ix]: + break + else: + arr[ix] = n + else: + return k, s, arr + raise ValueError("Could not find params") + +decl = [] +test = [] + +def gen_table(names, type_name, enum_name, test_extra=""): + global decl + global test + + map_size = 1 + while map_size < len(names): + map_size *= 2 + + while True: + try: + k, s, arr = find_params(names, map_size, 10000, 24) + break + except: + map_size *= 2 + + decl.append("#define ufbxi_{0}_permute_hash(h) ((((h) * {1}) >> {2}) % {3})".format(type_name, k, s, map_size)) + decl.append("static const ufbxi_{0}_map_entry ufbxi_{0}_map[{1}] = {{".format(type_name, map_size)) + for n in arr: + if not n: + decl.append("\t{{ 0u, {{ 0,0 }}, {0}_UNKNOWN }},".format(enum_name)) + else: + decl.append("\t{{ 0x{0:08x}u, {{ \"{1}\", {2} }}, {3}_{4} }},".format(n.hash, n.name, len(n.name), enum_name, n.enum)) + decl.append("};") + + test.append("") + test.append("UFBXT_TEST(table_{0}_map_values)".format(type_name)) + test.append("#if UFBXT_IMPL") + test.append("{") + for n in names: + test.append("\tufbxt_assert(ufbxi_get_{0}(make_str(\"{1}\"){2}) == {3}_{4});".format(type_name, n.name, test_extra, enum_name, n.enum)) + test.append("}") + test.append("#endif") + + +gen_table(prop_types, "prop_type", "UFBX_PROP", "") +gen_table(node_types, "node_type", "UFBX_NODE", ", ufbx_empty_string") +gen_table(element_mapping_types, "element_mapping", "UFBXI_ELEMENT_BY", "") +gen_table(element_types, "element_type", "UFBXI_ELEMENT", ", UFBXI_ELEMENT_BY_UNKNOWN") + +print("\n".join(decl)) +print() +print() +print("\n".join(test)) +print() diff --git a/modules/ufbx/misc/execute_per_fbx.py b/modules/ufbx/misc/execute_per_fbx.py new file mode 100644 index 0000000..42011ee --- /dev/null +++ b/modules/ufbx/misc/execute_per_fbx.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +import argparse +import os +import time +import subprocess + +parser = argparse.ArgumentParser(usage="execute_per_fbx.py --exe loader --root .") +parser.add_argument("--exe", help="Executable to run") +parser.add_argument("--root", default=".", help="Root path to search from") +parser.add_argument("--start", default="", help="Top-level file to start from") +parser.add_argument("--verbose", action="store_true", help="Verbose information") +parser.add_argument('remainder', nargs="...") +argv = parser.parse_args() + +begin = time.time() + +num_tested = 0 +num_fail = 0 +total_size = 0 + +for root, dirs, files in os.walk(argv.root): + for file in files: + if not file.lower().endswith(".fbx"): continue + if file.lower().endswith(".ufbx-fail.fbx"): + num_fail += 1 + continue + path = os.path.join(root, file) + size = os.stat(path).st_size + display = os.path.relpath(path, argv.root) + + if argv.start and display < argv.start: + continue + + print(f"-- {display}", flush=True) + + total_size += size + if argv.exe: + args = [argv.exe, path.encode("utf-8")] + argv.remainder[1:] + + if argv.verbose: + cmdline = subprocess.list2cmdline(args) + print(f"$ {cmdline}") + + subprocess.check_call(args) + num_tested += 1 + +end = time.time() +dur = end - begin +print() +print("Success!") +print(f"Loaded {num_tested} files in {int(dur//60)}min {int(dur%60)}s.") +print(f"Processed {total_size/1e9:.2f}GB at {total_size/1e6/dur:.2f}MB/s.") +print(f"Ignored {num_fail} invalid files.") diff --git a/modules/ufbx/misc/fdlibm.c b/modules/ufbx/misc/fdlibm.c new file mode 100644 index 0000000..1a176c1 --- /dev/null +++ b/modules/ufbx/misc/fdlibm.c @@ -0,0 +1,1344 @@ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +/* Sometimes it's necessary to define __LITTLE_ENDIAN explicitly + but these catch some common cases. */ + +#if defined(_M_IX86) || defined(__i386__) || defined(_M_X64) || defined(__x86_64__) || defined(_M_ARM64) || defined(__aarch64__) || defined(_M_ARM) || defined(__arm__) || defined(__wasm__) || defined(__EMSCRIPTEN__) + #define __LITTLE_ENDIAN +#endif + +typedef union { + double d; + int i[2]; +} fdlibm_bits; + +#ifdef __LITTLE_ENDIAN + #define __HI(x) (((fdlibm_bits*)&(x))->i[1]) + #define __LO(x) (((fdlibm_bits*)&(x))->i[0]) +#else + #define __HI(x) (((fdlibm_bits*)&(x))->i[0]) + #define __LO(x) (((fdlibm_bits*)&(x))->i[1]) +#endif + +/* + * set X_TLOSS = pi*2**52, which is possibly defined in + * (one may replace the following line by "#include ") + */ + +double fdlibm_copysign(double x, double y) +{ + __HI(x) = (__HI(x)&0x7fffffff)|(__HI(y)&0x80000000); + return x; +} + +double fdlibm_fabs(double x) +{ + __HI(x) &= 0x7fffffff; + return x; +} + +double fdlibm_scalbn(double x, int n) +{ + static const double + two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ + twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */ + huge = 1.0e+300, + tiny = 1.0e-300; + + int k,hx,lx; + hx = __HI(x); + lx = __LO(x); + k = (hx&0x7ff00000)>>20; /* extract exponent */ + if (k==0) { /* 0 or subnormal x */ + if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */ + x *= two54; + hx = __HI(x); + k = ((hx&0x7ff00000)>>20) - 54; + if (n< -50000) return tiny*x; /*underflow*/ + } + if (k==0x7ff) return x+x; /* NaN or Inf */ + k = k+n; + if (k > 0x7fe) return huge*fdlibm_copysign(huge,x); /* overflow */ + if (k > 0) /* normal result */ + {__HI(x) = (hx&0x800fffff)|(k<<20); return x;} + if (k <= -54) { + if (n > 50000) /* in case integer overflow in n+k */ + return huge*fdlibm_copysign(huge,x); /*overflow*/ + else return tiny*fdlibm_copysign(tiny,x); /*underflow*/ + } + k += 54; /* subnormal result */ + __HI(x) = (hx&0x800fffff)|(k<<20); + return x*twom54; +} + +double fdlibm_floor(double x) +{ + static const double huge = 1.0e300; + + int i0,i1,j0; + unsigned i,j; + i0 = __HI(x); + i1 = __LO(x); + j0 = ((i0>>20)&0x7ff)-0x3ff; + if(j0<20) { + if(j0<0) { /* raise inexact if x != 0 */ + if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */ + if(i0>=0) {i0=i1=0;} + else if(((i0&0x7fffffff)|i1)!=0) + { i0=0xbff00000;i1=0;} + } + } else { + i = (0x000fffff)>>j0; + if(((i0&i)|i1)==0) return x; /* x is integral */ + if(huge+x>0.0) { /* raise inexact flag */ + if(i0<0) i0 += (0x00100000)>>j0; + i0 &= (~i); i1=0; + } + } + } else if (j0>51) { + if(j0==0x400) return x+x; /* inf or NaN */ + else return x; /* x is integral */ + } else { + i = ((unsigned)(0xffffffff))>>(j0-20); + if((i1&i)==0) return x; /* x is integral */ + if(huge+x>0.0) { /* raise inexact flag */ + if(i0<0) { + if(j0==20) i0+=1; + else { + j = i1+(1<<(52-j0)); + if(j<(unsigned)i1) i0 +=1 ; /* got a carry */ + i1=j; + } + } + i1 &= (~i); + } + } + __HI(x) = i0; + __LO(x) = i1; + return x; +} + +double fdlibm_frexp(double x, int *eptr) +{ + static const double + two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */ + + int hx, ix, lx; + hx = __HI(x); + ix = 0x7fffffff&hx; + lx = __LO(x); + *eptr = 0; + if(ix>=0x7ff00000||((ix|lx)==0)) return x; /* 0,inf,nan */ + if (ix<0x00100000) { /* subnormal */ + x *= two54; + hx = __HI(x); + ix = hx&0x7fffffff; + *eptr = -54; + } + *eptr += (ix>>20)-1022; + hx = (hx&0x800fffff)|0x3fe00000; + __HI(x) = hx; + return x; +} + +double fdlibm_atan(double x) +{ + + static const double atanhi[] = { + 4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */ + 7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */ + 9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */ + 1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */ + }; + + static const double atanlo[] = { + 2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */ + 3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */ + 1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */ + 6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */ + }; + + static const double aT[] = { + 3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */ + -1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */ + 1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */ + -1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */ + 9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */ + -7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */ + 6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */ + -5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */ + 4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */ + -3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */ + 1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */ + }; + + static const double + one = 1.0, + huge = 1.0e300; + + double w,s1,s2,z; + int ix,hx,id; + + hx = __HI(x); + ix = hx&0x7fffffff; + if(ix>=0x44100000) { /* if |x| >= 2^66 */ + if(ix>0x7ff00000|| + (ix==0x7ff00000&&(__LO(x)!=0))) + return x+x; /* NaN */ + if(hx>0) return atanhi[3]+atanlo[3]; + else return -atanhi[3]-atanlo[3]; + } if (ix < 0x3fdc0000) { /* |x| < 0.4375 */ + if (ix < 0x3e200000) { /* |x| < 2^-29 */ + if(huge+x>one) return x; /* raise inexact */ + } + id = -1; + } else { + x = fdlibm_fabs(x); + if (ix < 0x3ff30000) { /* |x| < 1.1875 */ + if (ix < 0x3fe60000) { /* 7/16 <=|x|<11/16 */ + id = 0; x = (2.0*x-one)/(2.0+x); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; x = (x-one)/(x+one); + } + } else { + if (ix < 0x40038000) { /* |x| < 2.4375 */ + id = 2; x = (x-1.5)/(one+1.5*x); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; x = -1.0/x; + } + }} + /* end of argument reduction */ + z = x*x; + w = z*z; + /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */ + s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10]))))); + s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9])))); + if (id<0) return x - x*(s1+s2); + else { + z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x); + return (hx<0)? -z:z; + } +} + +static double __ieee754_sqrt(double x) +{ + static const double one = 1.0, tiny=1.0e-300; + + double z; + int sign = (int)0x80000000; + unsigned r,t1,s1,ix1,q1; + int ix0,s0,q,m,t,i; + + ix0 = __HI(x); /* high word of x */ + ix1 = __LO(x); /* low word of x */ + + /* take care of Inf and NaN */ + if((ix0&0x7ff00000)==0x7ff00000) { + return x*x+x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if(ix0<=0) { + if(((ix0&(~sign))|ix1)==0) return x;/* sqrt(+-0) = +-0 */ + else if(ix0<0) + return (x-x)/(x-x); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = (ix0>>20); + if(m==0) { /* subnormal x */ + while(ix0==0) { + m -= 21; + ix0 |= (ix1>>11); ix1 <<= 21; + } + for(i=0;(ix0&0x00100000)==0;i++) ix0<<=1; + m -= i-1; + ix0 |= (ix1>>(32-i)); + ix1 <<= i; + } + m -= 1023; /* unbias exponent */ + ix0 = (ix0&0x000fffff)|0x00100000; + if(m&1){ /* odd m, double x to make it even */ + ix0 += ix0 + ((ix1&sign)>>31); + ix1 += ix1; + } + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix0 += ix0 + ((ix1&sign)>>31); + ix1 += ix1; + q = q1 = s0 = s1 = 0; /* [q,q1] = sqrt(x) */ + r = 0x00200000; /* r = moving bit from right to left */ + + while(r!=0) { + t = s0+r; + if(t<=ix0) { + s0 = t+r; + ix0 -= t; + q += r; + } + ix0 += ix0 + ((ix1&sign)>>31); + ix1 += ix1; + r>>=1; + } + + r = sign; + while(r!=0) { + t1 = s1+r; + t = s0; + if((t>31); + ix1 += ix1; + r>>=1; + } + + /* use floating add to find out rounding direction */ + if((ix0|ix1)!=0) { + z = one-tiny; /* trigger inexact flag */ + if (z>=one) { + z = one+tiny; + if (q1==(unsigned)0xffffffff) { q1=0; q += 1;} + else if (z>one) { + if (q1==(unsigned)0xfffffffe) q+=1; + q1+=2; + } else + q1 += (q1&1); + } + } + ix0 = (q>>1)+0x3fe00000; + ix1 = q1>>1; + if ((q&1)==1) ix1 |= sign; + ix0 += (m <<20); + __HI(z) = ix0; + __LO(z) = ix1; + return z; +} + +double fdlibm_sqrt(double x) /* wrapper sqrt */ +{ + return __ieee754_sqrt(x); +} + +static double __ieee754_pow(double x, double y) +{ + static const double + bp[] = {1.0, 1.5,}, + dp_h[] = { 0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */ + dp_l[] = { 0.0, 1.35003920212974897128e-08,}, /* 0x3E4CFDEB, 0x43CFD006 */ + zero = 0.0, + one = 1.0, + two = 2.0, + two53 = 9007199254740992.0, /* 0x43400000, 0x00000000 */ + huge = 1.0e300, + tiny = 1.0e-300, + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ + L1 = 5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */ + L2 = 4.28571428578550184252e-01, /* 0x3FDB6DB6, 0xDB6FABFF */ + L3 = 3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */ + L4 = 2.72728123808534006489e-01, /* 0x3FD17460, 0xA91D4101 */ + L5 = 2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */ + L6 = 2.06975017800338417784e-01, /* 0x3FCA7E28, 0x4A454EEF */ + P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */ + P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */ + P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */ + P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */ + P5 = 4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */ + lg2 = 6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */ + lg2_h = 6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */ + lg2_l = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */ + ovt = 8.0085662595372944372e-0017, /* -(1024-log2(ovfl+.5ulp)) */ + cp = 9.61796693925975554329e-01, /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */ + cp_h = 9.61796700954437255859e-01, /* 0x3FEEC709, 0xE0000000 =(float)cp */ + cp_l = -7.02846165095275826516e-09, /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/ + ivln2 = 1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */ + ivln2_h = 1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/ + ivln2_l = 1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/ + + double z,ax,z_h,z_l,p_h,p_l; + double y1,t1,t2,r,s,t,u,v,w; + int i0,i1,i,j,k,yisint,n; + int hx,hy,ix,iy; + unsigned lx,ly; + + i0 = ((*(int*)&one)>>29)^1; i1=1-i0; + hx = __HI(x); lx = __LO(x); + hy = __HI(y); ly = __LO(y); + ix = hx&0x7fffffff; iy = hy&0x7fffffff; + + /* y==zero: x**0 = 1 */ + if((iy|ly)==0) return one; + + /* +-NaN return x+y */ + if(ix > 0x7ff00000 || ((ix==0x7ff00000)&&(lx!=0)) || + iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0))) + return x+y; + + /* determine if y is an odd int when x < 0 + * yisint = 0 ... y is not an integer + * yisint = 1 ... y is an odd int + * yisint = 2 ... y is an even int + */ + yisint = 0; + if(hx<0) { + if(iy>=0x43400000) yisint = 2; /* even integer y */ + else if(iy>=0x3ff00000) { + k = (iy>>20)-0x3ff; /* exponent */ + if(k>20) { + j = ly>>(52-k); + if((j<<(52-k))==ly) yisint = 2-(j&1); + } else if(ly==0) { + j = iy>>(20-k); + if((j<<(20-k))==iy) yisint = 2-(j&1); + } + } + } + + /* special value of y */ + if(ly==0) { + if (iy==0x7ff00000) { /* y is +-inf */ + if(((ix-0x3ff00000)|lx)==0) + return y - y; /* inf**+-1 is NaN */ + else if (ix >= 0x3ff00000)/* (|x|>1)**+-inf = inf,0 */ + return (hy>=0)? y: zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return (hy<0)?-y: zero; + } + if(iy==0x3ff00000) { /* y is +-1 */ + if(hy<0) return one/x; else return x; + } + if(hy==0x40000000) return x*x; /* y is 2 */ + if(hy==0x3fe00000) { /* y is 0.5 */ + if(hx>=0) /* x >= +0 */ + return fdlibm_sqrt(x); + } + } + + ax = fdlibm_fabs(x); + /* special value of x */ + if(lx==0) { + if(ix==0x7ff00000||ix==0||ix==0x3ff00000){ + z = ax; /*x is +-0,+-inf,+-1*/ + if(hy<0) z = one/z; /* z = (1/|x|) */ + if(hx<0) { + if(((ix-0x3ff00000)|yisint)==0) { + z = (z-z)/(z-z); /* (-1)**non-int is NaN */ + } else if(yisint==1) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + } + + n = (hx>>31)+1; + + /* (x<0)**(non-int) is NaN */ + if((n|yisint)==0) return (x-x)/(x-x); + + s = one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if((n|(yisint-1))==0) s = -one;/* (-ve)**(odd int) */ + + /* |y| is huge */ + if(iy>0x41e00000) { /* if |y| > 2**31 */ + if(iy>0x43f00000){ /* if |y| > 2**64, must o/uflow */ + if(ix<=0x3fefffff) return (hy<0)? huge*huge:tiny*tiny; + if(ix>=0x3ff00000) return (hy>0)? huge*huge:tiny*tiny; + } + /* over/underflow if x is not close to one */ + if(ix<0x3fefffff) return (hy<0)? s*huge*huge:s*tiny*tiny; + if(ix>0x3ff00000) return (hy>0)? s*huge*huge:s*tiny*tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = ax-one; /* t has 20 trailing zeros */ + w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25)); + u = ivln2_h*t; /* ivln2_h has 21 sig. bits */ + v = t*ivln2_l-w*ivln2; + t1 = u+v; + __LO(t1) = 0; + t2 = v-(t1-u); + } else { + double ss,s2,s_h,s_l,t_h,t_l; + n = 0; + /* take care subnormal number */ + if(ix<0x00100000) + {ax *= two53; n -= 53; ix = __HI(ax); } + n += ((ix)>>20)-0x3ff; + j = ix&0x000fffff; + /* determine interval */ + ix = j|0x3ff00000; /* normalize ix */ + if(j<=0x3988E) k=0; /* |x|>1)|0x20000000)+0x00080000+(k<<18); + t_l = ax - (t_h-bp[k]); + s_l = v*((u-s_h*t_h)-s_h*t_l); + /* compute log(ax) */ + s2 = ss*ss; + r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6))))); + r += s_l*(s_h+ss); + s2 = s_h*s_h; + t_h = 3.0+s2+r; + __LO(t_h) = 0; + t_l = r-((t_h-3.0)-s2); + /* u+v = ss*(1+...) */ + u = s_h*t_h; + v = s_l*t_h+t_l*ss; + /* 2/(3log2)*(ss+...) */ + p_h = u+v; + __LO(p_h) = 0; + p_l = v-(p_h-u); + z_h = cp_h*p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = cp_l*p_h+p_l*cp+dp_l[k]; + /* log2(ax) = (ss+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = (double)n; + t1 = (((z_h+z_l)+dp_h[k])+t); + __LO(t1) = 0; + t2 = z_l-(((t1-t)-dp_h[k])-z_h); + } + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + y1 = y; + __LO(y1) = 0; + p_l = (y-y1)*t1+y*t2; + p_h = y1*t1; + z = p_l+p_h; + j = __HI(z); + i = __LO(z); + if (j>=0x40900000) { /* z >= 1024 */ + if(((j-0x40900000)|i)!=0) /* if z > 1024 */ + return s*huge*huge; /* overflow */ + else { + if(p_l+ovt>z-p_h) return s*huge*huge; /* overflow */ + } + } else if((j&0x7fffffff)>=0x4090cc00 ) { /* z <= -1075 */ + if(((j-0xc090cc00)|i)!=0) /* z < -1075 */ + return s*tiny*tiny; /* underflow */ + else { + if(p_l<=z-p_h) return s*tiny*tiny; /* underflow */ + } + } + /* + * compute 2**(p_h+p_l) + */ + i = j&0x7fffffff; + k = (i>>20)-0x3ff; + n = 0; + if(i>0x3fe00000) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j+(0x00100000>>(k+1)); + k = ((n&0x7fffffff)>>20)-0x3ff; /* new k for n */ + t = zero; + __HI(t) = (n&~(0x000fffff>>k)); + n = ((n&0x000fffff)|0x00100000)>>(20-k); + if(j<0) n = -n; + p_h -= t; + } + t = p_l+p_h; + __LO(t) = 0; + u = t*lg2_h; + v = (p_l-(t-p_h))*lg2+t*lg2_l; + z = u+v; + w = v-(z-u); + t = z*z; + t1 = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); + r = (z*t1)/(t1-two)-(w+z*w); + z = one-(r-z); + j = __HI(z); + j += (n<<20); + if((j>>20)<=0) z = fdlibm_scalbn(z,n); /* subnormal output */ + else __HI(z) += (n<<20); + return s*z; +} + +static double __ieee754_atan2(double y, double x) +{ + static const double + tiny = 1.0e-300, + zero = 0.0, + pi_o_4 = 7.8539816339744827900E-01, /* 0x3FE921FB, 0x54442D18 */ + pi_o_2 = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */ + pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */ + pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */ + + double z; + int k,m,hx,hy,ix,iy; + unsigned lx,ly; + + hx = __HI(x); ix = hx&0x7fffffff; + lx = __LO(x); + hy = __HI(y); iy = hy&0x7fffffff; + ly = __LO(y); + if(((ix|((lx|(unsigned)-(int)lx)>>31))>0x7ff00000)|| + ((iy|((ly|(unsigned)-(int)ly)>>31))>0x7ff00000)) /* x or y is NaN */ + return x+y; + if((hx-0x3ff00000|lx)==0) return fdlibm_atan(y); /* x=1.0 */ + m = ((hy>>31)&1)|((hx>>30)&2); /* 2*sign(x)+sign(y) */ + + /* when y = 0 */ + if((iy|ly)==0) { + switch(m) { + case 0: + case 1: return y; /* atan(+-0,+anything)=+-0 */ + case 2: return pi+tiny;/* atan(+0,-anything) = pi */ + case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */ + } + } + /* when x = 0 */ + if((ix|lx)==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; + + /* when x is INF */ + if(ix==0x7ff00000) { + if(iy==0x7ff00000) { + switch(m) { + case 0: return pi_o_4+tiny;/* atan(+INF,+INF) */ + case 1: return -pi_o_4-tiny;/* atan(-INF,+INF) */ + case 2: return 3.0*pi_o_4+tiny;/*atan(+INF,-INF)*/ + case 3: return -3.0*pi_o_4-tiny;/*atan(-INF,-INF)*/ + } + } else { + switch(m) { + case 0: return zero ; /* atan(+...,+INF) */ + case 1: return -zero ; /* atan(-...,+INF) */ + case 2: return pi+tiny ; /* atan(+...,-INF) */ + case 3: return -pi-tiny ; /* atan(-...,-INF) */ + } + } + } + /* when y is INF */ + if(iy==0x7ff00000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; + + /* compute y/x */ + k = (iy-ix)>>20; + if(k > 60) z=pi_o_2+0.5*pi_lo; /* |y/x| > 2**60 */ + else if(hx<0&&k<-60) z=0.0; /* |y|/x < -2**60 */ + else z=fdlibm_atan(fdlibm_fabs(y/x)); /* safe to do y/x */ + switch (m) { + case 0: return z ; /* atan(+,+) */ + case 1: __HI(z) ^= 0x80000000; + return z ; /* atan(-,+) */ + case 2: return pi-(z-pi_lo);/* atan(+,-) */ + default: /* case 3 */ + return (z-pi_lo)-pi;/* atan(-,-) */ + } +} + +static double __ieee754_asin(double x) +{ + static const double + one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ + huge = 1.000e+300, + pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */ + pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */ + pio4_hi = 7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */ + /* coefficient for R(x^2) */ + pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */ + pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */ + pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */ + pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */ + pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */ + pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */ + qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ + qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */ + qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */ + qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ + + double t,w,p,q,c,r,s; + int hx,ix; + hx = __HI(x); + ix = hx&0x7fffffff; + if(ix>= 0x3ff00000) { /* |x|>= 1 */ + if(((ix-0x3ff00000)|__LO(x))==0) + /* asin(1)=+-pi/2 with inexact */ + return x*pio2_hi+x*pio2_lo; + return (x-x)/(x-x); /* asin(|x|>1) is NaN */ + } else if (ix<0x3fe00000) { /* |x|<0.5 */ + if(ix<0x3e400000) { /* if |x| < 2**-27 */ + if(huge+x>one) return x;/* return x with inexact if x!=0*/ + } else + t = x*x; + p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5))))); + q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4))); + w = p/q; + return x+x*w; + } + /* 1> |x|>= 0.5 */ + w = one-fdlibm_fabs(x); + t = w*0.5; + p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5))))); + q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4))); + s = fdlibm_sqrt(t); + if(ix>=0x3FEF3333) { /* if |x| > 0.975 */ + w = p/q; + t = pio2_hi-(2.0*(s+s*w)-pio2_lo); + } else { + w = s; + __LO(w) = 0; + c = (t-w*w)/(s+w); + r = p/q; + p = 2.0*s*r-(pio2_lo-2.0*c); + q = pio4_hi-2.0*w; + t = pio4_hi-(p-q); + } + if(hx>0) return t; else return -t; +} + +static double __ieee754_acos(double x) +{ + static const double + one= 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ + pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */ + pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */ + pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */ + pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */ + pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */ + pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */ + pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */ + pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */ + pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */ + qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ + qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */ + qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */ + qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ + + double z,p,q,r,w,s,c,df; + int hx,ix; + hx = __HI(x); + ix = hx&0x7fffffff; + if(ix>=0x3ff00000) { /* |x| >= 1 */ + if(((ix-0x3ff00000)|__LO(x))==0) { /* |x|==1 */ + if(hx>0) return 0.0; /* acos(1) = 0 */ + else return pi+2.0*pio2_lo; /* acos(-1)= pi */ + } + return (x-x)/(x-x); /* acos(|x|>1) is NaN */ + } + if(ix<0x3fe00000) { /* |x| < 0.5 */ + if(ix<=0x3c600000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/ + z = x*x; + p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); + q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); + r = p/q; + return pio2_hi - (x - (pio2_lo-x*r)); + } else if (hx<0) { /* x < -0.5 */ + z = (one+x)*0.5; + p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); + q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); + s = fdlibm_sqrt(z); + r = p/q; + w = r*s-pio2_lo; + return pi - 2.0*(s+w); + } else { /* x > 0.5 */ + z = (one-x)*0.5; + s = fdlibm_sqrt(z); + df = s; + __LO(df) = 0; + c = (z-df*df)/(s+df); + p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); + q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); + r = p/q; + w = r*s+c; + return 2.0*(df+w); + } +} + +/* + * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi + */ +static const int two_over_pi[] = { +0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62, +0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A, +0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129, +0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41, +0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8, +0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF, +0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5, +0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08, +0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3, +0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880, +0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B, +}; + +static const int npio2_hw[] = { +0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C, +0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C, +0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A, +0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C, +0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB, +0x404858EB, 0x404921FB, +}; + +static int __kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const int *ipio2) +{ + static const int init_jk[] = {2,3,4,6}; /* initial value for jk */ + + static const double PIo2[] = { + 1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */ + 7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */ + 5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */ + 3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */ + 1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */ + 1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */ + 2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */ + 2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */ + }; + + static const double + zero = 0.0, + one = 1.0, + two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */ + twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */ + + int jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih; + double z,fw,f[20],fq[20],q[20]; + + /* initialize jk*/ + jk = init_jk[prec]; + jp = jk; + + /* determine jx,jv,q0, note that 3>q0 */ + jx = nx-1; + jv = (e0-3)/24; if(jv<0) jv=0; + q0 = e0-24*(jv+1); + + /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */ + j = jv-jx; m = jx+jk; + for(i=0;i<=m;i++,j++) f[i] = (j<0)? zero : (double) ipio2[j]; + + /* compute q[0],q[1],...q[jk] */ + for (i=0;i<=jk;i++) { + for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; q[i] = fw; + } + + jz = jk; +recompute: + /* distill q[] into iq[] reversingly */ + for(i=0,j=jz,z=q[jz];j>0;i++,j--) { + fw = (double)((int)(twon24* z)); + iq[i] = (int)(z-two24*fw); + z = q[j-1]+fw; + } + + /* compute n */ + z = fdlibm_scalbn(z,q0); /* actual value of z */ + z -= 8.0*fdlibm_floor(z*0.125); /* trim off integer >= 8 */ + n = (int) z; + z -= (double)n; + ih = 0; + if(q0>0) { /* need iq[jz-1] to determine n */ + i = (iq[jz-1]>>(24-q0)); n += i; + iq[jz-1] -= i<<(24-q0); + ih = iq[jz-1]>>(23-q0); + } + else if(q0==0) ih = iq[jz-1]>>23; + else if(z>=0.5) ih=2; + + if(ih>0) { /* q > 0.5 */ + n += 1; carry = 0; + for(i=0;i0) { /* rare case: chance is 1 in 12 */ + switch(q0) { + case 1: + iq[jz-1] &= 0x7fffff; break; + case 2: + iq[jz-1] &= 0x3fffff; break; + } + } + if(ih==2) { + z = one - z; + if(carry!=0) z -= fdlibm_scalbn(one,q0); + } + } + + /* check if recomputation is needed */ + if(z==zero) { + j = 0; + for (i=jz-1;i>=jk;i--) j |= iq[i]; + if(j==0) { /* need recomputation */ + for(k=1;iq[jk-k]==0;k++); /* k = no. of terms needed */ + + for(i=jz+1;i<=jz+k;i++) { /* add q[jz+1] to q[jz+k] */ + f[jx+i] = (double) ipio2[jv+i]; + for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; + q[i] = fw; + } + jz += k; + goto recompute; + } + } + + /* chop off zero terms */ + if(z==0.0) { + jz -= 1; q0 -= 24; + while(iq[jz]==0) { jz--; q0-=24;} + } else { /* break z into 24-bit if necessary */ + z = fdlibm_scalbn(z,-q0); + if(z>=two24) { + fw = (double)((int)(twon24*z)); + iq[jz] = (int)(z-two24*fw); + jz += 1; q0 += 24; + iq[jz] = (int) fw; + } else iq[jz] = (int) z ; + } + + /* convert integer "bit" chunk to floating-point value */ + fw = fdlibm_scalbn(one,q0); + for(i=jz;i>=0;i--) { + q[i] = fw*(double)iq[i]; fw*=twon24; + } + + /* compute PIo2[0,...,jp]*q[jz,...,0] */ + for(i=jz;i>=0;i--) { + for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k]; + fq[jz-i] = fw; + } + + /* compress fq[] into y[] */ + switch(prec) { + case 0: + fw = 0.0; + for (i=jz;i>=0;i--) fw += fq[i]; + y[0] = (ih==0)? fw: -fw; + break; + case 1: + case 2: + fw = 0.0; + for (i=jz;i>=0;i--) fw += fq[i]; + y[0] = (ih==0)? fw: -fw; + fw = fq[0]-fw; + for (i=1;i<=jz;i++) fw += fq[i]; + y[1] = (ih==0)? fw: -fw; + break; + case 3: /* painful */ + for (i=jz;i>0;i--) { + fw = fq[i-1]+fq[i]; + fq[i] += fq[i-1]-fw; + fq[i-1] = fw; + } + for (i=jz;i>1;i--) { + fw = fq[i-1]+fq[i]; + fq[i] += fq[i-1]-fw; + fq[i-1] = fw; + } + for (fw=0.0,i=jz;i>=2;i--) fw += fq[i]; + if(ih==0) { + y[0] = fq[0]; y[1] = fq[1]; y[2] = fw; + } else { + y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw; + } + } + return n&7; +} + + +/* + * invpio2: 53 bits of 2/pi + * pio2_1: first 33 bit of pi/2 + * pio2_1t: pi/2 - pio2_1 + * pio2_2: second 33 bit of pi/2 + * pio2_2t: pi/2 - (pio2_1+pio2_2) + * pio2_3: third 33 bit of pi/2 + * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) + */ + +int __ieee754_rem_pio2(double x, double *y) +{ + static const double + zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ + half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ + two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */ + invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */ + pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */ + pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */ + pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */ + pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */ + pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */ + pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */ + + double z,w,t,r,fn; + double tx[3]; + int e0,i,j,nx,n,ix,hx; + + hx = __HI(x); /* high word of x */ + ix = hx&0x7fffffff; + if(ix<=0x3fe921fb) /* |x| ~<= pi/4 , no need for reduction */ + {y[0] = x; y[1] = 0; return 0;} + if(ix<0x4002d97c) { /* |x| < 3pi/4, special case with n=+-1 */ + if(hx>0) { + z = x - pio2_1; + if(ix!=0x3ff921fb) { /* 33+53 bit pi is good enough */ + y[0] = z - pio2_1t; + y[1] = (z-y[0])-pio2_1t; + } else { /* near pi/2, use 33+33+53 bit pi */ + z -= pio2_2; + y[0] = z - pio2_2t; + y[1] = (z-y[0])-pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + pio2_1; + if(ix!=0x3ff921fb) { /* 33+53 bit pi is good enough */ + y[0] = z + pio2_1t; + y[1] = (z-y[0])+pio2_1t; + } else { /* near pi/2, use 33+33+53 bit pi */ + z += pio2_2; + y[0] = z + pio2_2t; + y[1] = (z-y[0])+pio2_2t; + } + return -1; + } + } + if(ix<=0x413921fb) { /* |x| ~<= 2^19*(pi/2), medium size */ + t = fdlibm_fabs(x); + n = (int) (t*invpio2+half); + fn = (double)n; + r = t-fn*pio2_1; + w = fn*pio2_1t; /* 1st round good to 85 bit */ + if(n<32&&ix!=npio2_hw[n-1]) { + y[0] = r-w; /* quick check no cancellation */ + } else { + j = ix>>20; + y[0] = r-w; + i = j-(((__HI(y[0]))>>20)&0x7ff); + if(i>16) { /* 2nd iteration needed, good to 118 */ + t = r; + w = fn*pio2_2; + r = t-w; + w = fn*pio2_2t-((t-r)-w); + y[0] = r-w; + i = j-(((__HI(y[0]))>>20)&0x7ff); + if(i>49) { /* 3rd iteration need, 151 bits acc */ + t = r; /* will cover all possible cases */ + w = fn*pio2_3; + r = t-w; + w = fn*pio2_3t-((t-r)-w); + y[0] = r-w; + } + } + } + y[1] = (r-y[0])-w; + if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;} + else return n; + } + /* + * all other (large) arguments + */ + if(ix>=0x7ff00000) { /* x is inf or NaN */ + y[0]=y[1]=x-x; return 0; + } + /* set z = scalbn(|x|,ilogb(x)-23) */ + __LO(z) = __LO(x); + e0 = (ix>>20)-1046; /* e0 = ilogb(z)-23; */ + __HI(z) = ix - (e0<<20); + for(i=0;i<2;i++) { + tx[i] = (double)((int)(z)); + z = (z-tx[i])*two24; + } + tx[2] = z; + nx = 3; + while(tx[nx-1]==zero) nx--; /* skip zero term */ + n = __kernel_rem_pio2(tx,y,e0,nx,2,two_over_pi); + if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;} + return n; +} + +double __kernel_sin(double x, double y, int iy) +{ + + static const double + half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ + S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */ + S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */ + S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */ + S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */ + S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */ + S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */ + + double z,r,v; + int ix; + ix = __HI(x)&0x7fffffff; /* high word of x */ + if(ix<0x3e400000) /* |x| < 2**-27 */ + {if((int)x==0) return x;} /* generate inexact */ + z = x*x; + v = z*x; + r = S2+z*(S3+z*(S4+z*(S5+z*S6))); + if(iy==0) return x+v*(S1+z*r); + else return x-((z*(half*y-v*r)-y)-v*S1); +} + +double __kernel_cos(double x, double y) +{ + static const double + one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ + C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */ + C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */ + C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */ + C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */ + C5 = 2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */ + C6 = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */ + + double a,hz,z,r,qx; + int ix; + ix = __HI(x)&0x7fffffff; /* ix = |x|'s high word*/ + if(ix<0x3e400000) { /* if x < 2**27 */ + if(((int)x)==0) return one; /* generate inexact */ + } + z = x*x; + r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6))))); + if(ix < 0x3FD33333) /* if |x| < 0.3 */ + return one - (0.5*z - (z*r - x*y)); + else { + if(ix > 0x3fe90000) { /* x > 0.78125 */ + qx = 0.28125; + } else { + __HI(qx) = ix-0x00200000; /* x/4 */ + __LO(qx) = 0; + } + hz = 0.5*z-qx; + a = one-qx; + return a - (hz - (z*r-x*y)); + } +} + +double +__kernel_tan(double x, double y, int iy) { + double z, r, v, w, s; + int ix, hx; + + static const double xxx[] = { + 3.33333333333334091986e-01, /* 3FD55555, 55555563 */ + 1.33333333333201242699e-01, /* 3FC11111, 1110FE7A */ + 5.39682539762260521377e-02, /* 3FABA1BA, 1BB341FE */ + 2.18694882948595424599e-02, /* 3F9664F4, 8406D637 */ + 8.86323982359930005737e-03, /* 3F8226E3, E96E8493 */ + 3.59207910759131235356e-03, /* 3F6D6D22, C9560328 */ + 1.45620945432529025516e-03, /* 3F57DBC8, FEE08315 */ + 5.88041240820264096874e-04, /* 3F4344D8, F2F26501 */ + 2.46463134818469906812e-04, /* 3F3026F7, 1A8D1068 */ + 7.81794442939557092300e-05, /* 3F147E88, A03792A6 */ + 7.14072491382608190305e-05, /* 3F12B80F, 32F0A7E9 */ + -1.85586374855275456654e-05, /* BEF375CB, DB605373 */ + 2.59073051863633712884e-05, /* 3EFB2A70, 74BF7AD4 */ + /* one */ 1.00000000000000000000e+00, /* 3FF00000, 00000000 */ + /* pio4 */ 7.85398163397448278999e-01, /* 3FE921FB, 54442D18 */ + /* pio4lo */ 3.06161699786838301793e-17 /* 3C81A626, 33145C07 */ + }; + #define one xxx[13] + #define pio4 xxx[14] + #define pio4lo xxx[15] + #define T xxx + /* INDENT ON */ + + hx = __HI(x); /* high word of x */ + ix = hx & 0x7fffffff; /* high word of |x| */ + if (ix < 0x3e300000) { /* x < 2**-28 */ + if ((int) x == 0) { /* generate inexact */ + if (((ix | __LO(x)) | (iy + 1)) == 0) + return one / fdlibm_fabs(x); + else { + if (iy == 1) + return x; + else { /* compute -1 / (x+y) carefully */ + double a, t; + + z = w = x + y; + __LO(z) = 0; + v = y - (z - x); + t = a = -one / w; + __LO(t) = 0; + s = one + t * z; + return t + a * (s + t * v); + } + } + } + } + if (ix >= 0x3FE59428) { /* |x| >= 0.6744 */ + if (hx < 0) { + x = -x; + y = -y; + } + z = pio4 - x; + w = pio4lo - y; + x = z + w; + y = 0.0; + } + z = x * x; + w = z * z; + /* + * Break x^5*(T[1]+x^2*T[2]+...) into + * x^5(T[1]+x^4*T[3]+...+x^20*T[11]) + + * x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12])) + */ + r = T[1] + w * (T[3] + w * (T[5] + w * (T[7] + w * (T[9] + + w * T[11])))); + v = z * (T[2] + w * (T[4] + w * (T[6] + w * (T[8] + w * (T[10] + + w * T[12]))))); + s = z * x; + r = y + z * (s * (r + v) + y); + r += T[0] * s; + w = x + r; + if (ix >= 0x3FE59428) { + v = (double) iy; + return (double) (1 - ((hx >> 30) & 2)) * + (v - 2.0 * (x - (w * w / (w + v) - r))); + } + if (iy == 1) + return w; + else { + /* + * if allow error up to 2 ulp, simply return + * -1.0 / (x+r) here + */ + /* compute -1.0 / (x+r) accurately */ + double a, t; + z = w; + __LO(z) = 0; + v = r - (z - x); /* z+v = r+x */ + t = a = -1.0 / w; /* a = -1.0/w */ + __LO(t) = 0; + s = 1.0 + t * z; + return t + a * (s + t * v); + } + + #undef one + #undef pio4 + #undef pio4lo + #undef T +} + +double fdlibm_sin(double x) +{ + double y[2],z=0.0; + int n, ix; + + /* High word of x. */ + ix = __HI(x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0); + + /* sin(Inf or NaN) is NaN */ + else if (ix>=0x7ff00000) return x-x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2(x,y); + switch(n&3) { + case 0: return __kernel_sin(y[0],y[1],1); + case 1: return __kernel_cos(y[0],y[1]); + case 2: return -__kernel_sin(y[0],y[1],1); + default: + return -__kernel_cos(y[0],y[1]); + } + } +} + +double fdlibm_cos(double x) +{ + double y[2],z=0.0; + int n, ix; + + /* High word of x. */ + ix = __HI(x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if(ix <= 0x3fe921fb) return __kernel_cos(x,z); + + /* cos(Inf or NaN) is NaN */ + else if (ix>=0x7ff00000) return x-x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2(x,y); + switch(n&3) { + case 0: return __kernel_cos(y[0],y[1]); + case 1: return -__kernel_sin(y[0],y[1],1); + case 2: return -__kernel_cos(y[0],y[1]); + default: + return __kernel_sin(y[0],y[1],1); + } + } +} + +double fdlibm_tan(double x) +{ + double y[2],z=0.0; + int n, ix; + + /* High word of x. */ + ix = __HI(x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if(ix <= 0x3fe921fb) return __kernel_tan(x,z,1); + + /* tan(Inf or NaN) is NaN */ + else if (ix>=0x7ff00000) return x-x; /* NaN */ + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2(x,y); + return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /* 1 -- n even + -1 -- n odd */ + } +} + +double fdlibm_asin(double x) /* wrapper asin */ +{ + return __ieee754_asin(x); +} + +double fdlibm_acos(double x) /* wrapper acos */ +{ + return __ieee754_acos(x); +} + +double fdlibm_atan2(double y, double x) /* wrapper atan2 */ +{ + return __ieee754_atan2(y,x); +} + +double fdlibm_pow(double x, double y) /* wrapper pow */ +{ + return __ieee754_pow(x,y); +} + +double fdlibm_fmin(double a, double b) +{ + return a < b ? a : b; +} + +double fdlibm_fmax(double a, double b) +{ + return a < b ? b : a; +} diff --git a/modules/ufbx/misc/fuzz.sh b/modules/ufbx/misc/fuzz.sh new file mode 100644 index 0000000..2b37cc2 --- /dev/null +++ b/modules/ufbx/misc/fuzz.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +cmd="$1" +shift 1 + +if [ $cmd == "build-ufbx" ]; then + afl-clang-fast -static ../../misc/fuzz_ufbx_persist.c -lm -o fuzz_ufbx +elif [ $cmd == "build-ufbx-32" ]; then + afl-clang-fast -static ../../misc/fuzz_ufbx_persist.c -lm -o fuzz_ufbx_32 +elif [ $cmd == "build-ufbx-asan" ]; then + AFL_USE_ASAN=1 afl-clang-fast -DDISCRETE_ALLOCATIONS ../../misc/fuzz_ufbx_persist.c -lm -o fuzz_ufbx_asan +elif [ $cmd == "build-ufbx-asan-32" ]; then + AFL_USE_ASAN=1 afl-clang-fast -DDISCRETE_ALLOCATIONS ../../misc/fuzz_ufbx_persist.c -lm -o fuzz_ufbx_asan_32 +elif [ $cmd == "build-cache" ]; then + afl-clang-fast -static ../../misc/fuzz_cache_persist.c -lm -o fuzz_cache +elif [ $cmd == "build-cache-32" ]; then + afl-clang-fast -static ../../misc/fuzz_cache_persist.c -lm -o fuzz_cache_32 +elif [ $cmd == "build-cache-asan" ]; then + AFL_USE_ASAN=1 afl-clang-fast -DDISCRETE_ALLOCATIONS ../../misc/fuzz_cache_persist.c -lm -o fuzz_cache_asan +elif [ $cmd == "build-cache-asan-32" ]; then + AFL_USE_ASAN=1 afl-clang-fast -DDISCRETE_ALLOCATIONS ../../misc/fuzz_cache_persist.c -lm -o fuzz_cache_asan_32 +elif [ $cmd == "build-obj" ]; then + afl-clang-fast -DLOAD_OBJ -static ../../misc/fuzz_ufbx_persist.c -lm -o fuzz_obj +elif [ $cmd == "build-obj-asan" ]; then + AFL_USE_ASAN=1 afl-clang-fast -DLOAD_OBJ -DDISCRETE_ALLOCATIONS ../../misc/fuzz_ufbx_persist.c -lm -o fuzz_obj_asan +elif [ $cmd == "build-mtl" ]; then + afl-clang-fast -DLOAD_MTL -static ../../misc/fuzz_ufbx_persist.c -lm -o fuzz_mtl +elif [ $cmd == "build-mtl-asan" ]; then + AFL_USE_ASAN=1 afl-clang-fast -DLOAD_MTL -DDISCRETE_ALLOCATIONS ../../misc/fuzz_ufbx_persist.c -lm -o fuzz_mtl_asan +fi + +name=$1 +shift 1 + +if [ $cmd == "fuzz" ]; then + cp -r cases "cases_$name" + afl-fuzz "$@" -i "cases_$name" -o "findings_$name" -t 1000 -m 2000 "./$name" +fi diff --git a/modules/ufbx/misc/fuzz_cache_persist.c b/modules/ufbx/misc/fuzz_cache_persist.c new file mode 100644 index 0000000..69c7d15 --- /dev/null +++ b/modules/ufbx/misc/fuzz_cache_persist.c @@ -0,0 +1,68 @@ +#define _CRT_SECURE_NO_WARNINGS + +#if defined(_WIN32) +#define ufbx_assert(cond) do { \ + if (!(cond)) __debugbreak(); \ + } while (0) +#else +#define ufbx_assert(cond) do { \ + if (!(cond)) __builtin_trap(); \ + } while (0) +#endif + +#include "../ufbx.c" + +#include +#include +#include +#include + +char g_buffer[1024*1024]; +size_t g_pos = 0; +size_t g_size = 0; + +static size_t read_file(void *user, void *data, size_t size) +{ + size_t to_read = g_size - g_pos; + if (to_read > size) to_read = size; + memcpy(data, g_buffer + g_pos, to_read); + g_pos += to_read; + return to_read; +} + +static bool open_file(void *user, ufbx_stream *stream, const char *path, size_t path_len) +{ + if (!strcmp(path, "memory-cache")) { + assert(g_pos == 0); + stream->read_fn = &read_file; + return true; + } else { + return false; + } +} + +int main(int argc, char **argv) +{ + ufbx_geometry_cache_opts opts = { 0 }; + opts.open_file_fn = &open_file; + + opts.temp_allocator.memory_limit = 0x4000000; // 64MB + opts.result_allocator.memory_limit = 0x4000000; // 64MB + +#if defined(DISCRETE_ALLOCATIONS) + opts.temp_allocator.huge_threshold = 1; + opts.result_allocator.huge_threshold = 1; +#endif + + while (__AFL_LOOP(10000)) { + size_t size = (size_t)read(0, g_buffer, sizeof(g_buffer)); + g_size = size; + g_pos = 0; + + ufbx_geometry_cache *cache = ufbx_load_geometry_cache("memory-cache", &opts, NULL); + ufbx_free_geometry_cache(cache); + } + + return 0; +} + diff --git a/modules/ufbx/misc/fuzz_deflate.c b/modules/ufbx/misc/fuzz_deflate.c new file mode 100644 index 0000000..d2dd67c --- /dev/null +++ b/modules/ufbx/misc/fuzz_deflate.c @@ -0,0 +1,61 @@ +#define _CRT_SECURE_NO_WARNINGS + +#if defined(_WIN32) +#define ufbx_assert(cond) do { \ + if (!(cond)) __debugbreak(); \ + } while (0) +#else +#define ufbx_assert(cond) do { \ + if (!(cond)) __builtin_trap(); \ + } while (0) +#endif + +#include "../ufbx.c" + +#include +#include + +int main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "Usage: fuzz_deflate \n"); + return 1; + } + FILE *f = fopen(argv[1], "rb"); + if (!f) { + fprintf(stderr, "Failed to open file\n"); + return 1; + } + fseek(f, 0, SEEK_END); + size_t src_size = ftell(f); + fseek(f, 0, SEEK_SET); + char *src = malloc(src_size); + size_t num_read = fread(src, 1, src_size, f); + if (num_read != src_size) { + fprintf(stderr, "Failed to read file\n"); + return 1; + } + fclose(f); + + size_t dst_size = 1024*src_size; + if (argc >= 3) { + dst_size = (size_t)atoi(argv[2]); + } + + char *dst = malloc(dst_size); + + ufbx_inflate_retain retain; + retain.initialized = false; + ufbx_inflate_input input = { 0 }; + input.data = src; + input.data_size = src_size; + input.total_size = src_size; + ptrdiff_t result = ufbx_inflate(dst, dst_size, &input, &retain); + + free(src); + free(dst); + + printf("%td\n", result); + return 0; +} + diff --git a/modules/ufbx/misc/fuzz_ufbx.c b/modules/ufbx/misc/fuzz_ufbx.c new file mode 100644 index 0000000..f04d6b0 --- /dev/null +++ b/modules/ufbx/misc/fuzz_ufbx.c @@ -0,0 +1,39 @@ +#define _CRT_SECURE_NO_WARNINGS + +#if defined(_WIN32) +#define ufbx_assert(cond) do { \ + if (!(cond)) __debugbreak(); \ + } while (0) +#else +#define ufbx_assert(cond) do { \ + if (!(cond)) __builtin_trap(); \ + } while (0) +#endif + +#include "../ufbx.c" + +#include +#include + +int main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "Usage: fuzz_ufbx \n"); + return 1; + } + + ufbx_load_opts opts = { 0 }; + + for (int i = 2; i < argc; i++) { + if (!strcmp(argv[i], "-d")) { + opts.temp_huge_size = 1; + opts.result_huge_size = 1; + } + } + + ufbx_scene *scene = ufbx_load_file(argv[1], &opts, NULL); + ufbx_free_scene(scene); + + return 0; +} + diff --git a/modules/ufbx/misc/fuzz_ufbx_persist.c b/modules/ufbx/misc/fuzz_ufbx_persist.c new file mode 100644 index 0000000..9923114 --- /dev/null +++ b/modules/ufbx/misc/fuzz_ufbx_persist.c @@ -0,0 +1,60 @@ +#define _CRT_SECURE_NO_WARNINGS + +#if defined(_WIN32) +#define ufbx_assert(cond) do { \ + if (!(cond)) __debugbreak(); \ + } while (0) +#else +#define ufbx_assert(cond) do { \ + if (!(cond)) __builtin_trap(); \ + } while (0) +#endif + +#define ufbxt_assert_fail(file, line, msg) ufbx_assert(false) +#define ufbxt_assert(m_cond) ufbx_assert(m_cond) + +#include "../ufbx.c" +#include "../test/check_scene.h" + +#include +#include +#include + +char g_buffer[1024*1024]; + +int main(int argc, char **argv) +{ + ufbx_load_opts opts = { 0 }; + +#if defined(DISCRETE_ALLOCATIONS) + opts.temp_allocator.huge_threshold = 1; + opts.result_allocator.huge_threshold = 1; +#endif + +#if defined(LOAD_OBJ) + opts.file_format = UFBX_FILE_FORMAT_OBJ; +#elif defined(LOAD_MTL) + opts.file_format = UFBX_FILE_FORMAT_MTL; +#elif defined(LOAD_GUESS) +#else + opts.file_format = UFBX_FILE_FORMAT_FBX; +#endif + +#if defined(NO_AFL) + size_t size = (size_t)read(0, g_buffer, sizeof(g_buffer)); + for (size_t i = 0; i < 10000; i++) { +#else + while (__AFL_LOOP(10000)) { + size_t size = (size_t)read(0, g_buffer, sizeof(g_buffer)); +#endif + + ufbx_scene *scene = ufbx_load_memory(g_buffer, size, &opts, NULL); + if (scene) { + ufbxt_check_scene(scene); + } + ufbx_free_scene(scene); + } + + return 0; +} + diff --git a/modules/ufbx/misc/gen_default_props.py b/modules/ufbx/misc/gen_default_props.py new file mode 100644 index 0000000..d087e79 --- /dev/null +++ b/modules/ufbx/misc/gen_default_props.py @@ -0,0 +1,175 @@ +props_str = """ +P: "QuaternionInterpolate", "enum", "", "",0 +P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 +P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 +P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 +P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 +P: "TranslationActive", "bool", "", "",0 +P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 +P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 +P: "TranslationMinX", "bool", "", "",0 +P: "TranslationMinY", "bool", "", "",0 +P: "TranslationMinZ", "bool", "", "",0 +P: "TranslationMaxX", "bool", "", "",0 +P: "TranslationMaxY", "bool", "", "",0 +P: "TranslationMaxZ", "bool", "", "",0 +P: "RotationOrder", "enum", "", "",0 +P: "RotationSpaceForLimitOnly", "bool", "", "",0 +P: "RotationStiffnessX", "double", "Number", "",0 +P: "RotationStiffnessY", "double", "Number", "",0 +P: "RotationStiffnessZ", "double", "Number", "",0 +P: "AxisLen", "double", "Number", "",10 +P: "PreRotation", "Vector3D", "Vector", "",0,0,0 +P: "PostRotation", "Vector3D", "Vector", "",0,0,0 +P: "RotationActive", "bool", "", "",0 +P: "RotationMin", "Vector3D", "Vector", "",0,0,0 +P: "RotationMax", "Vector3D", "Vector", "",0,0,0 +P: "RotationMinX", "bool", "", "",0 +P: "RotationMinY", "bool", "", "",0 +P: "RotationMinZ", "bool", "", "",0 +P: "RotationMaxX", "bool", "", "",0 +P: "RotationMaxY", "bool", "", "",0 +P: "RotationMaxZ", "bool", "", "",0 +P: "InheritType", "enum", "", "",0 +P: "ScalingActive", "bool", "", "",0 +P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 +P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 +P: "ScalingMinX", "bool", "", "",0 +P: "ScalingMinY", "bool", "", "",0 +P: "ScalingMinZ", "bool", "", "",0 +P: "ScalingMaxX", "bool", "", "",0 +P: "ScalingMaxY", "bool", "", "",0 +P: "ScalingMaxZ", "bool", "", "",0 +P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 +P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 +P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 +P: "MinDampRangeX", "double", "Number", "",0 +P: "MinDampRangeY", "double", "Number", "",0 +P: "MinDampRangeZ", "double", "Number", "",0 +P: "MaxDampRangeX", "double", "Number", "",0 +P: "MaxDampRangeY", "double", "Number", "",0 +P: "MaxDampRangeZ", "double", "Number", "",0 +P: "MinDampStrengthX", "double", "Number", "",0 +P: "MinDampStrengthY", "double", "Number", "",0 +P: "MinDampStrengthZ", "double", "Number", "",0 +P: "MaxDampStrengthX", "double", "Number", "",0 +P: "MaxDampStrengthY", "double", "Number", "",0 +P: "MaxDampStrengthZ", "double", "Number", "",0 +P: "PreferedAngleX", "double", "Number", "",0 +P: "PreferedAngleY", "double", "Number", "",0 +P: "PreferedAngleZ", "double", "Number", "",0 +P: "LookAtProperty", "object", "", "" +P: "UpVectorProperty", "object", "", "" +P: "Show", "bool", "", "",1 +P: "NegativePercentShapeSupport", "bool", "", "",1 +P: "DefaultAttributeIndex", "int", "Integer", "",-1 +P: "Freeze", "bool", "", "",0 +P: "LODBox", "bool", "", "",0 +P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 +P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 +P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 +P: "Visibility", "Visibility", "", "A",1 +P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + +P: "ShadingModel", "KString", "", "", "Lambert" +P: "MultiLayer", "bool", "", "",0 +P: "EmissiveColor", "Color", "", "A",0,0,0 +P: "EmissiveFactor", "Number", "", "A",1 +P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 +P: "AmbientFactor", "Number", "", "A",1 +P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 +P: "DiffuseFactor", "Number", "", "A",1 +P: "Bump", "Vector3D", "Vector", "",0,0,0 +P: "NormalMap", "Vector3D", "Vector", "",0,0,0 +P: "BumpFactor", "double", "Number", "",1 +P: "TransparentColor", "Color", "", "A",0,0,0 +P: "TransparencyFactor", "Number", "", "A",0 +P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 +P: "DisplacementFactor", "double", "Number", "",1 +P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 +P: "VectorDisplacementFactor", "double", "Number", "",1 + +P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 +P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 +P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 +P: "Primary Visibility", "bool", "", "",1 +P: "Casts Shadows", "bool", "", "",1 +P: "Receive Shadows", "bool", "", "",1 + +P: "CastLightOnObject", "bool", "", "",1 +P: "DrawVolumetricLight", "bool", "", "",1 +P: "DrawGroundProjection", "bool", "", "",1 +P: "DrawFrontFacingVolumetricLight", "bool", "", "",0 +P: "Intensity", "Number", "", "A",100 +P: "InnerAngle", "Number", "", "A",0 +P: "OuterAngle", "Number", "", "A",45 +P: "Fog", "Number", "", "A",50 +P: "DecayType", "enum", "", "",0 +P: "DecayStart", "Number", "", "A",0 +P: "FileName", "KString", "", "", "" +P: "EnableNearAttenuation", "bool", "", "",0 +P: "NearAttenuationStart", "Number", "", "A",0 +P: "NearAttenuationEnd", "Number", "", "A",0 +P: "EnableFarAttenuation", "bool", "", "",0 +P: "FarAttenuationStart", "Number", "", "A",0 +P: "FarAttenuationEnd", "Number", "", "A",0 +P: "CastShadows", "bool", "", "",0 +P: "ShadowColor", "Color", "", "A",0,0,0 +P: "AreaLightShape", "enum", "", "",0 +P: "LeftBarnDoor", "Float", "", "A",20 +P: "RightBarnDoor", "Float", "", "A",20 +P: "TopBarnDoor", "Float", "", "A",20 +P: "BottomBarnDoor", "Float", "", "A",20 +P: "EnableBarnDoor", "Bool", "", "A",0 +""" + +props = [tuple(p.strip("\" ") for p in l.lstrip("P: ").split(",")) for l in props_str.splitlines()] +props = sorted(props, key=lambda l: l[0]) + +type_map = { + "Boolean": "UFBX_PROP_BOOLEAN", + "bool": "UFBX_PROP_BOOLEAN", + "Bool": "UFBX_PROP_BOOLEAN", + "Integer": "UFBX_PROP_INTEGER", + "int": "UFBX_PROP_INTEGER", + "enum": "UFBX_PROP_INTEGER", + "Visibility": "UFBX_PROP_INTEGER", + "Visibility Inheritance": "UFBX_PROP_INTEGER", + "Number": "UFBX_PROP_NUMBER", + "double": "UFBX_PROP_NUMBER", + "Real": "UFBX_PROP_NUMBER", + "Float": "UFBX_PROP_NUMBER", + "Intensity": "UFBX_PROP_NUMBER", + "Vector": "UFBX_PROP_VECTOR", + "Vector3D": "UFBX_PROP_VECTOR", + "Color": "UFBX_PROP_COLOR", + "ColorRGB": "UFBX_PROP_COLOR", + "String": "UFBX_PROP_STRING", + "KString": "UFBX_PROP_STRING", + "object": "UFBX_PROP_STRING", + "DateTime": "UFBX_PROP_DATE_TIME", + "Lcl Translation": "UFBX_PROP_TRANSLATION", + "Lcl Rotation": "UFBX_PROP_ROTATION", + "Lcl Scaling": "UFBX_PROP_SCALING", +} + +print("static const ufbx_prop ufbxi_default_props[] = {") + +for p in props: + if len(p) < 2: continue + name = p[0] + prop_type = type_map[p[1]] + v = p[4:] + if prop_type == "UFBX_PROP_STRING" or prop_type == "UFBX_PROP_DATE_TIME": + if v: + value = "\"{}\"".format(v[0], len(v[0])) + else: + value = "0" + elif prop_type == "UFBX_PROP_BOOLEAN" or prop_type == "UFBX_PROP_INTEGER" or prop_type == "UFBX_PROP_NUMBER": + value = "0, {}".format(float(v[0])) + else: + value = "0, {}, {}, {}".format(float(v[0]), float(v[1]), float(v[2])) + + print("\t{{ \"{}\", {}, {}, {} }},".format(name, len(name), prop_type, value)) + +print("};") diff --git a/modules/ufbx/misc/gen_quat_ops.py b/modules/ufbx/misc/gen_quat_ops.py new file mode 100644 index 0000000..83714f5 --- /dev/null +++ b/modules/ufbx/misc/gen_quat_ops.py @@ -0,0 +1,105 @@ +from sympy import * +from sympy.matrices import * +from sympy.algebras.quaternion import Quaternion + +qx, qy, qz = symbols("q.x q.y q.z", real=True) +vx, vy, vz = symbols("v.x v.y v.z", real=True) +qw = symbols("q.w", real=True) + +qv = Matrix([qx, qy, qz]) +v = Matrix([vx, vy, vz]) + +# https://fgiesen.wordpress.com/2019/02/09/rotating-a-single-vector-using-a-quaternion/ +t = (2.0*qv).cross(v) +r = v + qw*t + qv.cross(t) + +r = simplify(r) + +for a in range(3): + for b in range(a+1, 3): + an = "xyz"[a] + bn = "xyz"[b] + e = qv[a]*v[b] - qv[b]*v[a] + s = symbols(an + bn) + print("ufbx_real {} = {};".format(s, e)) + r = r.subs(e, s) + +print("ufbx_vec3 r;") + +def sgns(s): + return "+" if s >= 0 else "-" + +for a in range(3): + an = "xyz"[a] + ex, ey, ez = qx, qy, qz + if a == 0: ex = qw + if a == 1: ey = qw + if a == 2: ez = qw + sx, x = simplify(ex*r[a].coeff(ex) / 2).as_coeff_Mul() + sy, y = simplify(ey*r[a].coeff(ey) / 2).as_coeff_Mul() + sz, z = simplify(ez*r[a].coeff(ez) / 2).as_coeff_Mul() + assert abs(sx) == 1 and abs(sy) == 1 and abs(sz) == 1 + w = simplify(r[a] - 2*(sx*x+sy*y+sz*z)) + print("r.{} = 2.0 * ({} {} {} {} {} {}) + {};".format(an, sgns(sx), x, sgns(sy), y, sgns(sz), z, w)) + +print() + +ax, ay, az, aw = symbols("a.x a.y a.z a.w", real=True) +bx, by, bz, bw = symbols("b.x b.y b.z b.w", real=True) +qa = Quaternion(aw, ax, ay, az) +qb = Quaternion(bw, bx, by, bz) + +qr = qa*qb +print("ufbx_vec4 r;") +print("r.x = {};".format(qr.b)) +print("r.y = {};".format(qr.c)) +print("r.z = {};".format(qr.d)) +print("r.w = {};".format(qr.a)) + +print() + +# Unit quaternion +qx, qy, qz, qw = symbols("q.x q.y q.z q.w", real=True) +qq = Quaternion(qw, qx, qy, qz) +ma = qq.to_rotation_matrix() +ma = ma.subs(qw**2 + qx**2 + qy**2 + qz**2, 1) + +qc = (qx, qy, qz, qw) + +print("ufbx_vec4 q = t->rotation;") +print("ufbx_real ", end="") +for a in range(3): + if a != 0: print(", ", end="") + an = "xyz"[a] + print("s{0} = 2.0 * t->scale.{0}".format(an), end="") +print(";") + +for a in range(4): + print("ufbx_real ", end="") + for b in range(a, 4): + an = "xyzw"[a] + bn = "xyzw"[b] + e = qc[a]*qc[b] + s = an + bn + if b != a: print(", ", end="") + print("{} = {}*{}".format(s, qc[a], qc[b]), end="") + + ma = ma.subs(e, s) + print(";") + +print("ufbx_matrix m;") +for c in range(3): + for r in range(3): + e = ma[r,c] + t, t12 = e.as_coeff_Add() + s1, e1 = t12.args[0].as_coeff_Mul() + s2, e2 = t12.args[1].as_coeff_Mul() + assert abs(s1) == 2 and abs(s2) == 2 + assert t == 0 or t == 1 + ts = " + 0.5" if t else "" + sx = "s" + "xyz"[c] + print("m.m{}{} = {} * ({} {} {} {}{});".format(r, c, sx, sgns(s1), e1, sgns(s2), e2, ts)) +for r in range(3): + rn = "xyz"[r] + print("m.m{}3 = t->translation.{};".format(r, rn)) +print("return m;") diff --git a/modules/ufbx/misc/gen_quat_to_euler.py b/modules/ufbx/misc/gen_quat_to_euler.py new file mode 100644 index 0000000..29f0be4 --- /dev/null +++ b/modules/ufbx/misc/gen_quat_to_euler.py @@ -0,0 +1,147 @@ +import sympy +from sympy.matrices import Matrix +from sympy.algebras.quaternion import Quaternion + +orders = "XYZ XZY YZX YXZ ZXY ZYX".split() + +unit_vectors = [ + (1,0,0), + (0,1,0), + (0,0,1), +] + +def rotate_point(q, v): + qv = Matrix([q.b, q.c, q.d]) + qw = q.a + vv = Matrix(v) + + # https://fgiesen.wordpress.com/2019/02/09/rotating-a-single-vector-using-a-quaternion/ + t = (2.0*qv).cross(vv) + r = vv + qw*t + qv.cross(t) + return (r[0], r[1], r[2]) + +# "Quaternion to Euler Angle Conversion for Arbitrary Rotation Sequence Using Geometric Methods" +# http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/nhughes/quat_2_euler_for_MB.pdf +def solve_euler_t01(quat, order): + i0,i1,i2 = order + i0n = (i0+1)%3 + i0nn = (i0+2)%3 + v2 = unit_vectors[i2] + + l = quat.a*quat.a + quat.b*quat.b + quat.c*quat.c + quat.d*quat.d + + v2r = tuple(c.subs(l, 1) for c in Quaternion.rotate_point(v2, quat)) + + if (i0+1) % 3 == i1: + t0 = sympy.atan2(-v2r[i0n].factor(), (v2r[i0nn] + l).factor().subs(l, 1) - 1) + t1 = v2r[i0].factor() + else: + t0 = sympy.atan2(v2r[i0nn].factor(), (v2r[i0n] + l).factor().subs(l, 1) - 1) + t1 = -v2r[i0].factor() + + return (t0, t1) + +def solve_euler_t2_fallback(quat, order, t): + i0,i1,i2 = order + i0n = (i0+1)%3 + i0nn = (i0+2)%3 + v0 = unit_vectors[i0] + + l = quat.a*quat.a + quat.b*quat.b + quat.c*quat.c + quat.d*quat.d + + v0r = tuple(c.subs(l, 1) for c in Quaternion.rotate_point(v0, quat)) + + if (i0+1) % 3 == i1: + t2 = sympy.atan2(t*v0r[i0n].factor(), -t*((v0r[i0nn] + l).factor().subs(l, 1) - 1)) + else: + t2 = sympy.atan2(t*v0r[i0nn].factor(), t*((v0r[i0n] + l).factor().subs(l, 1) - 1)) + + return t2 + +qx,qy,qz,qw = sympy.symbols("qx qy qz qw") +quat = Quaternion(qw,qx,qy,qz) + +def format_c(expr, prec=0): + if expr.is_Add: + terms = sorted((format_c(a, 1) for a in expr.args), + key=lambda s: s.startswith("-")) + args = [] + for term in terms: + if len(args) > 0: + if term.startswith("-"): + args.append("-") + term = term[1:] + else: + args.append("+") + args.append(term) + args = " ".join(args) + return f"({args})" if prec > 1 else args + elif expr.is_Mul: + if expr.args[0] == -1: + args = "*".join(format_c(a, 2) for a in expr.args[1:]) + return f"-({args})" if prec > 2 else f"-{args}" + else: + args = "*".join(format_c(a, 2) for a in expr.args) + return f"({args})" if prec > 2 else args + elif expr.is_Function: + args = ", ".join(format_c(a, 0) for a in expr.args) + name = expr.func.__name__ + if name == "asin": + name = "ufbxi_asin" + return f"{name}({args})" + elif expr.is_Pow: + base, exp = expr.args + if base.is_Symbol and exp == 2: + b = format_c(base, 2) + return f"({b}*{b})" if prec > 2 else f"{b}*{b}" + else: + return f"pow({format_c(base, 0)}, {format_c(exp, 0)})" + elif expr.is_Integer: + return f"{int(expr.evalf())}.0f" + elif expr.is_Symbol: + return expr.name + else: + raise TypeError(f"Unhandled type {type(expr)}") + +def format_code(expr): + return format_c(expr) + # return sympy.ccode(expr).replace("asin", "ufbxi_asin") + +print("\tswitch (order) {") +for order_s in orders: + order = tuple(reversed(tuple("XYZ".index(o) for o in order_s))) + t0, t1 = solve_euler_t01(quat, order) + + rev_order = tuple(reversed(order)) + rev_quat = Quaternion.conjugate(quat) + t2n, _ = solve_euler_t01(rev_quat, rev_order) + + t2f = solve_euler_t2_fallback(quat, order, sympy.Symbol("t")) + + ts = (t0, t1, -t2n) + + print("\tcase UFBX_ROTATION_{}:".format(order_s)) + c0 = "xyz"[order[0]] + c1 = "xyz"[order[1]] + c2 = "xyz"[order[2]] + e0 = format_code(t0) + e1 = format_code(t1) + e2 = format_code(-t2n) + f2 = format_code(t2f) + + print(f"\t\tt = {e1};") + print(f"\t\tif (fabs(t) < eps) {{") + print(f"\t\t\tv.{c1} = (ufbx_real)asin(t);") + print(f"\t\t\tv.{c0} = (ufbx_real){e0};") + print(f"\t\t\tv.{c2} = (ufbx_real){e2};") + print("\t\t} else {") + print(f"\t\t\tv.{c1} = (ufbx_real)copysign(UFBXI_DPI*0.5, t);") + print(f"\t\t\tv.{c0} = (ufbx_real)({f2});") + print(f"\t\t\tv.{c2} = 0.0f;") + print("\t\t}") + + print("\t\tbreak;") +print("\tdefault:") +print("\t\tv.x = v.y = v.z = 0.0;") +print("\t\tbreak;") +print("\t}") diff --git a/modules/ufbx/misc/gen_rotation_order.py b/modules/ufbx/misc/gen_rotation_order.py new file mode 100644 index 0000000..39f9f7f --- /dev/null +++ b/modules/ufbx/misc/gen_rotation_order.py @@ -0,0 +1,25 @@ +import sympy +from sympy.algebras.quaternion import Quaternion + +cx,sx,cy,sy,cz,sz = sympy.symbols("cx sx cy sy cz sz") + +qx = Quaternion(cx, sx, 0, 0) +qy = Quaternion(cy, 0, sy, 0) +qz = Quaternion(cz, 0, 0, sz) +qs = { "X": qx, "Y": qy, "Z": qz } + +orders = "XYZ XZY YZX YXZ ZXY ZYX".split() + +print("\tswitch (order) {") +for order in orders: + q = qs[order[2]] * qs[order[1]] * qs[order[0]] + print("\tcase UFBX_ROTATION_{}:".format(order)) + print("\t\tq.x = {};".format(q.b)) + print("\t\tq.y = {};".format(q.c)) + print("\t\tq.z = {};".format(q.d)) + print("\t\tq.w = {};".format(q.a)) + print("\t\tbreak;") +print("\tdefault:") +print("\t\tq.x = q.y = q.z = 0.0; q.w = 1.0;") +print("\t\tbreak;") +print("\t}") diff --git a/modules/ufbx/misc/gen_xml_ctype.py b/modules/ufbx/misc/gen_xml_ctype.py new file mode 100644 index 0000000..b1aa6e6 --- /dev/null +++ b/modules/ufbx/misc/gen_xml_ctype.py @@ -0,0 +1,29 @@ + +categories = [ + " \r\n\t", # UFBXI_XML_CTYPE_WHITESPACE + "\'", # UFBXI_XML_CTYPE_SINGLE_QUOTE + "\"", # UFBXI_XML_CTYPE_DOUBLE_QUOTE + " \r\n\t?/>\'\"=", # UFBXI_XML_CTYPE_NAME_END + "<", # UFBXI_XML_CTYPE_TAG_START + "\0", # UFBXI_XML_CTYPE_END_OF_FILE +] + +def generate_bits(categories): + for ix in range(256): + ch = chr(ix) + bits = 0 + for bit, cat in enumerate(categories): + if ch in cat: + bits |= 1 << bit + yield bits + +bits = list(generate_bits(categories)) + +# Truncate down to what's needed +num_bits = 64 +assert all(b == 0 for b in bits[num_bits:]) +bits = bits[:num_bits] + +chunk = 32 +for base in range(0, len(bits), chunk): + print("".join("{},".format(b) for b in bits[base:base+chunk])) diff --git a/modules/ufbx/misc/generate_coverage.sh b/modules/ufbx/misc/generate_coverage.sh new file mode 100644 index 0000000..e749993 --- /dev/null +++ b/modules/ufbx/misc/generate_coverage.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -x +set -e + +LLVM_COV="${LLVM_COV:-llvm-cov}" +LLVM_GCOV=$(realpath misc/llvm_gcov.sh) +chmod +x misc/llvm_gcov.sh + +clang -lm -coverage -g -std=gnu99 -DNDEBUG -DUFBX_NO_ASSERT -DUFBX_DEV=1 -DUFBX_REGRESSION=1 ufbx.c test/runner.c -o build/cov-runner +build/cov-runner -d data +$LLVM_COV gcov ufbx runner -b +lcov --directory . --base-directory . --gcov-tool $LLVM_GCOV --rc lcov_branch_coverage=1 --capture -o coverage.lcov diff --git a/modules/ufbx/misc/generate_hashses.py b/modules/ufbx/misc/generate_hashses.py new file mode 100644 index 0000000..34c5779 --- /dev/null +++ b/modules/ufbx/misc/generate_hashses.py @@ -0,0 +1,59 @@ +import subprocess +import os + +def is_ascii(s): + try: + _ = s.encode("ascii") + return True + except UnicodeEncodeError: + return False + +if __name__ == "__main__": + from argparse import ArgumentParser + + parser = ArgumentParser("generate_hashes.py --exe -o hashes.txt") + parser.add_argument("--verbose", action="store_true", help="Show output") + parser.add_argument("--exe", required=True, help="hash_scene.c executable") + parser.add_argument("-o", required=True, help="Output file path") + argv = parser.parse_args() + + with open(argv.o, "wt") as f: + for root, dirs, files in os.walk("data"): + for file in files: + path = os.path.join(root, file).replace("\\", "/") + if not is_ascii(path): continue + if "_fail_" in path: continue + if "/fuzz/" in path: continue + if "/obj_fuzz/" in path: continue + if "/mtl_fuzz/" in path: continue + if " " in path: continue + + if file.endswith(".fbx"): + prev_output = None + for frame in range(0, 10): + args = [argv.exe, path] + + if frame >= 0: + frame = frame * frame + args += ["--frame", str(frame)] + + output = subprocess.check_output(args) + output = output.decode("utf-8").strip() + if output == prev_output: + break + line = f"{output} {frame:3} {path}" + if argv.verbose: + print(line) + print(line, file=f) + prev_output = output + elif file.endswith(".obj") or file.endswith(".mtl"): + args = [argv.exe, path] + + frame = 0 + output = subprocess.check_output(args) + output = output.decode("utf-8").strip() + line = f"{output} {frame:3} {path}" + if argv.verbose: + print(line) + print(line, file=f) + prev_output = output diff --git a/modules/ufbx/misc/get_header_tag.py b/modules/ufbx/misc/get_header_tag.py new file mode 100644 index 0000000..5f252a7 --- /dev/null +++ b/modules/ufbx/misc/get_header_tag.py @@ -0,0 +1,20 @@ +import os +import re + +self_path = os.path.dirname(__file__) +ufbx_path = os.path.join(self_path, "..", "ufbx.h") + +if __name__ == "__main__": + version = None + with open(ufbx_path, "rt") as f: + for line in f: + m = re.match(r"#define\s+UFBX_HEADER_VERSION\s+ufbx_pack_version\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*", line) + if m: + version = (int(m.group(1)), int(m.group(2)), int(m.group(3))) + break + + if not version: + raise RuntimeError("Could not find version from header") + + major, minor, patch = version + print(f"v{major}.{minor}.{patch}") diff --git a/modules/ufbx/misc/hash_collider.c b/modules/ufbx/misc/hash_collider.c new file mode 100644 index 0000000..d6da0db --- /dev/null +++ b/modules/ufbx/misc/hash_collider.c @@ -0,0 +1,229 @@ +#include "../ufbx.c" +#include + +typedef struct { + uint32_t begin; + uint32_t increment; + uint64_t attempts; + uint32_t *slots; + size_t num_slots; + size_t target_slot; +} hash_info; + +typedef void hash_fn(hash_info info); + +typedef struct { + char str[256]; + uint32_t *slots; + size_t mask; + size_t max_length; + int64_t attempts_left; + size_t target_slot; +} str_state; + +ufbxi_noinline void print_string(str_state *state, size_t length) +{ +#if _OPENMP + #pragma omp critical +#endif + { + state->str[length] = '\0'; + puts(state->str); + } +} + +ufbxi_noinline void hash_string_imp(str_state *state, size_t length) +{ + if (state->attempts_left < 0) return; + state->attempts_left -= ('Z' - 'A' + 1) * 2; + + uint32_t *slots = state->slots; + size_t mask = state->mask; + size_t target_slot = state->target_slot; + + char *p = state->str + length - 1; + for (uint32_t c = 'A'; c <= 'Z'; c++) { + *p = c; + uint32_t hash = ufbxi_hash_string(state->str, length); + if ((hash & mask) == target_slot) print_string(state, length); + slots[hash & mask]++; + *p = c | 0x20; + hash = ufbxi_hash_string(state->str, length); + if ((hash & mask) == target_slot) print_string(state, length); + slots[hash & mask]++; + } + + if (length < state->max_length) { + for (uint32_t c = 'A'; c <= 'Z'; c++) { + *p = c; + hash_string_imp(state, length + 1); + *p = c | 0x20; + hash_string_imp(state, length + 1); + } + } +} + +ufbxi_noinline void hash_string(hash_info info) +{ + size_t mask = info.num_slots - 1; + str_state state; + state.attempts_left = (int64_t)info.attempts; + state.mask = mask; + state.slots = info.slots; + state.target_slot = info.target_slot; + + size_t max_len = 0; + uint64_t len_attempts = 1; + while (len_attempts < info.attempts) { + len_attempts *= ('Z' - 'A' + 1) * 2; + max_len += 1; + } + state.max_length = max_len; + + for (uint32_t c = 'A' + info.begin; c <= 'Z'; c += info.increment) { + state.str[0] = c; + uint32_t hash = ufbxi_hash_string(state.str, 1); + if ((hash & mask) == info.target_slot) print_string(&state, 1); + info.slots[hash & mask]++; + if (max_len > 1) { + hash_string_imp(&state, 2); + } + + state.str[0] = c | 0x20; + hash = ufbxi_hash_string(state.str, 1); + if ((hash & mask) == info.target_slot) print_string(&state, 1); + info.slots[hash & mask]++; + if (max_len > 1) { + hash_string_imp(&state, 2); + } + } +} + +ufbxi_noinline void print_uint64(uint64_t v) +{ +#if _OPENMP + #pragma omp critical +#endif + { + printf("%" PRIu64 "\n", v); + } +} + + +ufbxi_noinline void hash_uint64(hash_info info) +{ + size_t mask = info.num_slots - 1; + uint64_t increment = info.increment; + uint64_t end = info.attempts; + for (uint64_t i = info.begin; i < end; i += increment) { + uint32_t hash = ufbxi_hash64(i); + if ((hash & mask) == info.target_slot) print_uint64(i); + info.slots[hash & mask]++; + } +} + +ufbxi_noinline void run_test(hash_info info, hash_fn *fn, uint32_t *accumulator) +{ + info.slots = malloc(sizeof(uint32_t) * info.num_slots); + memset(info.slots, 0, sizeof(uint32_t) * info.num_slots); + fn(info); + +#if _OPENMP + #pragma omp critical +#endif + { + for (size_t i = 0; i < info.num_slots; i++) { + accumulator[i] += info.slots[i]; + } + } +} + +typedef struct { + const char *name; + hash_fn *fn; +} hash_test; + +hash_test tests[] = { + "string", &hash_string, + "uint64", &hash_uint64, +}; + +int main(int argc, char **argv) +{ + const char *func = ""; + size_t num_slots = 0; + size_t target_slot = SIZE_MAX; + uint64_t attempts = 0; + + for (int i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-f")) { + if (++i < argc) func = argv[i]; + } else if (!strcmp(argv[i], "--slots")) { + if (++i < argc) num_slots = (size_t)strtoull(argv[i], NULL, 10); + } else if (!strcmp(argv[i], "--attempts")) { + if (++i < argc) attempts = (uint64_t)strtoull(argv[i], NULL, 10); + } else if (!strcmp(argv[i], "--target")) { + if (++i < argc) target_slot = (size_t)strtoull(argv[i], NULL, 10); + } else if (!strcmp(argv[i], "--threads")) { + #if _OPENMP + if (++i < argc) omp_set_num_threads(atoi(argv[i])); + #endif + } + } + + hash_fn *hash_fn = NULL; + for (size_t i = 0; i < ufbxi_arraycount(tests); i++) { + if (!strcmp(tests[i].name, func)) { + hash_fn = tests[i].fn; + break; + } + } + + if (!hash_fn) { + fprintf(stderr, "Unkonwn hash function '%s'\n", func); + return 1; + } + + if ((num_slots & (num_slots - 1)) != 0) { + fprintf(stderr, "Slot amount must be a power of two, got %zu\n", num_slots); + return 1; + } + + uint32_t *slots = malloc(num_slots * sizeof(uint32_t)); + memset(slots, 0, sizeof(uint32_t) * num_slots); + + hash_info info; + info.attempts = (int64_t)attempts; + info.increment = 1; + info.num_slots = num_slots; + info.target_slot = target_slot; + +#if _OPENMP + #pragma omp parallel + { + info.begin = (uint64_t)omp_get_thread_num(); + info.increment = (uint64_t)omp_get_num_threads(); + run_test(info, hash_fn, slots); + } +#else + { + info.begin = 0; + info.increment = 1; + run_test(info, hash_fn, slots); + } +#endif + + uint32_t max_collisions = 0; + size_t worst_slot = 0; + for (size_t i = 0; i < num_slots; i++) { + if (slots[i] > max_collisions) { + max_collisions = slots[i]; + worst_slot = i; + } + } + + if (target_slot == SIZE_MAX) { + printf("Worst slot: %zu (%u collisions)\n", worst_slot, max_collisions); + } + return 0; +} diff --git a/modules/ufbx/misc/hash_diff.py b/modules/ufbx/misc/hash_diff.py new file mode 100644 index 0000000..d4078c2 --- /dev/null +++ b/modules/ufbx/misc/hash_diff.py @@ -0,0 +1,150 @@ +import gzip +import os +import re +import sys + +def fetch_dumps(file): + files = { } + cur_file = None + cur_dump = None + for line in file: + line = line.rstrip() + if line.startswith("=="): + name = line[2:].strip() + cur_file = { } + files[name] = cur_file + elif line.startswith("--"): + name = line[2:].strip() + cur_dump = [] + cur_file[name] = cur_dump + elif cur_dump is not None: + cur_dump.append(line) + return files + +def diff_dump(dump, ref, file, runner, ref_runner): + num_lines = max(len(dump), len(ref)) + stack = [] + has_diff = False + + for ix in range(num_lines): + dline = dump[ix] if ix < len(dump) else "" + rline = ref[ix] if ix < len(ref) else "" + + if dline == rline: + if "{" in dline: + stack.append(dline) + elif "}" in dline: + stack.pop() + else: + span = 2 + start = max(0, ix - span) + stop = ix + span + 1 + + has_diff = True + + print(f"== {file}") + print() + print(" ".join(s.strip().rstrip("{ ") for s in stack)) + + print() + print(f"-- {runner}") + print() + for lix in range(start, stop): + dl = dump[lix] if lix < len(dump) else "" + rl = ref[lix] if lix < len(ref) else "" + prefix = "> " if dl != rl else " " + print(prefix + dl) + + print() + print(f"-- {ref_runner}") + print() + for lix in range(start, stop): + dl = dump[lix] if lix < len(dump) else "" + rl = ref[lix] if lix < len(ref) else "" + prefix = "> " if dl != rl else " " + print(prefix + rl) + + print() + break + return has_diff + +def do_compress(argv): + with gzip.open(argv.o, "wt", compresslevel=8) as outf: + for file in os.listdir(argv.directory): + name = file[:-4] if file.endswith(".txt") else file + path = os.path.join(argv.directory, file) + print(f"== {name}", file=outf) + with open(path, "rt") as inf: + outf.writelines(inf) + +def do_list(argv): + entries = set() + for file in os.listdir(argv.directory): + path = os.path.join(argv.directory, file) + with gzip.open(path, "rt") as inf: + for line in inf: + line = line.strip() + if not line: + continue + m = re.match(r"--\s*(\d+)\s+(.+)", line) + if m: + frame = m.group(1) + path = m.group(2) + entries.add((frame, path)) + with open(argv.o, "wt") as outf: + for frame, path in entries: + print(f"0000000000000000 {frame} {path}", file=outf) + +def do_diff(argv): + with gzip.open(argv.ref, "rt") as inf: + ref_dumps = fetch_dumps(inf) + + ref_tuple = next(iter(ref_dumps.items()), None) + if not ref_tuple: + return + + has_diff = False + + ref_runner, ref_file = ref_tuple + for file in os.listdir(argv.directory): + path = os.path.join(argv.directory, file) + with gzip.open(path, "rt") as inf: + dumps = fetch_dumps(inf) + for runner, files in dumps.items(): + for file, dump in files.items(): + ref = ref_file[file] + if diff_dump(dump, ref, file, runner, ref_runner): + has_diff = True + + if has_diff: + sys.exit(1) + +if __name__ == "__main__": + from argparse import ArgumentParser + + parser = ArgumentParser(prog="hash_diff.py") + parser.add_argument("--verbose", action="store_true", help="Show extra information") + + subparsers = parser.add_subparsers(metavar="cmd") + + parser_compress = subparsers.add_parser("compress", help="Compress files") + parser_compress.add_argument("directory", help="Directory of hash files to compress") + parser_compress.add_argument("-o", metavar="output.gz", required=True, help="Output .gz filename") + parser_compress.set_defaults(func=do_compress) + + parser_dump = subparsers.add_parser("list", help="List all files from other dumps in hash check compatible format") + parser_dump.add_argument("directory", help="Directory of .gz dump files generated by 'compress'") + parser_dump.add_argument("-o", metavar="output.txt", required=True, help="Output .txt filename") + parser_dump.set_defaults(func=do_list) + + parser_diff = subparsers.add_parser("diff", help="Compare dumps") + parser_diff.add_argument("directory", help="Directory of .gz dump files generated by 'compress'") + parser_diff.add_argument("--ref", metavar="ref.gz", required=True, help="Reference hash dump .gz") + parser_diff.set_defaults(func=do_diff) + + argv = parser.parse_args() + if "func" not in argv: + parser.print_help() + else: + argv.func(argv) + diff --git a/modules/ufbx/misc/llvm_gcov.sh b/modules/ufbx/misc/llvm_gcov.sh new file mode 100644 index 0000000..66b42c5 --- /dev/null +++ b/modules/ufbx/misc/llvm_gcov.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +exec $LLVM_COV gcov "$@" \ No newline at end of file diff --git a/modules/ufbx/misc/macro_expander.py b/modules/ufbx/misc/macro_expander.py new file mode 100644 index 0000000..be60f94 --- /dev/null +++ b/modules/ufbx/misc/macro_expander.py @@ -0,0 +1,75 @@ +import argparse +import re + +parser = argparse.ArgumentParser(usage="macro_expander.py macro files") +parser.add_argument("macro") +parser.add_argument("files", nargs="*") +argv = parser.parse_args() + +macro_lines = [] +macro_params = [] + +RE_NEWLINE = re.compile(r"\n") +RE_DEF = re.compile(f"\n\s*#define\\s+{re.escape(argv.macro)}\s*\\(([^)]*)\\)\s*(.*)\\\\\s*\r?\n", re.M) +RE_LINE = re.compile(r"\t?(.*?)\s*(\\?)\r?\n", re.M) +RE_USE = re.compile(f"{re.escape(argv.macro)}\s*\\(", re.M) + +for path in argv.files: + with open(path, "rt") as f: + text = f.read() + + lineno = 1 + linestart = 0 + pos = 0 + while True: + if not macro_lines: + m = RE_DEF.search(text, pos) + if m: + macro_params = [a.strip() for a in m.group(1).split(",")] + first_line = m.group(2).strip() + if first_line: + macro_lines.append(first_line) + + pos = m.end() + while True: + m = RE_LINE.match(text, pos) + if not m: break + pos = m.end() + macro_lines.append(m.group(1)) + if not m.group(2): break + else: + m = RE_USE.search(text, pos) + if not m: break + + lineno += sum(1 for _ in RE_NEWLINE.finditer(text, linestart, m.start())) + linestart = m.start() + + tlen = len(text) + args = [[]] + level = 0 + pos = m.end() + while pos < tlen: + c = text[pos] + if c == "(": + level += 1 + args[-1].append(c) + elif c == ")": + level -= 1 + if level < 0: break + args[-1].append(c) + elif c == "," and level == 0: + args.append([]) + else: + args[-1].append(c) + pos += 1 + args = ["".join(a).strip() for a in args] + + print() + print(f"-- {path}:{lineno}") + for param, arg in zip(macro_params, args): + print(f"#define {param} {arg}") + for line in macro_lines: + print(line) + for param in macro_params: + print(f"#undef {param}") + diff --git a/modules/ufbx/misc/run_tests.py b/modules/ufbx/misc/run_tests.py new file mode 100644 index 0000000..8b0fa42 --- /dev/null +++ b/modules/ufbx/misc/run_tests.py @@ -0,0 +1,1421 @@ +#!/usr/bin/env python3 + +import asyncio +import itertools +import subprocess +import time +import re +import os +import sys +import shutil +import functools +import argparse +import copy +from typing import NamedTuple + +parser = argparse.ArgumentParser(description="Run ufbx tests") +parser.add_argument("tests", type=str, nargs="*", help="Names of tests to run") +parser.add_argument("--additional-compiler", default=[], action="append", help="Additional compiler(s) to use") +parser.add_argument("--remove-compiler", default=[], action="append", help="Remove a compiler from being used") +parser.add_argument("--remove-arch", default=[], action="append", help="Remove an architecture") +parser.add_argument("--compiler", default=[], action="append", help="Specify exact compiler(s) to use") +parser.add_argument("--define", default=[], action="append", help="Define preprocessor symbols") +parser.add_argument("--no-sse", action="store_true", help="Don't make SSE builds when possible") +parser.add_argument("--wasi-sdk", default=[], action="append", help="WASI SDK path") +parser.add_argument("--wasm-runtime", default="wasmtime", type=str, help="WASM runtime command") +parser.add_argument("--no-sanitize", action="store_true", help="Don't compile builds with ASAN/UBSAN") +parser.add_argument("--no-sanitize-arch", default=[], action="append", help="Disable sanitization on specific architectures") +parser.add_argument("--threads", type=int, default=0, help="Number of threads to use (0 to autodetect)") +parser.add_argument("--verbose", action="store_true", help="Verbose output") +parser.add_argument("--hash-file", help="Hash test input file") +parser.add_argument("--runner", help="Descriptive name for the runner") +parser.add_argument("--fail-on-pre-test", action="store_true", help="Indicate failure if pre-test checks fail") +argv = parser.parse_args() + +color_out = sys.stdout + +has_color = False +if sys.platform == "win32": + try: + import colorama + colorama.init(wrap=False) + color_out = colorama.AnsiToWin32(color_out).stream + has_color = True + except ImportError: + print("# Run 'pip install colorama' for colorful output") +else: + has_color = sys.stdout.isatty() + +STYLE_FAIL = "\x1b[31m" +STYLE_WARN = "\x1b[33m" +STYLE_CMD = "\x1b[36m" + +def log(line, *, style=""): + if style and has_color: + line = style + line + "\x1b[39m" + print(line, file=color_out, flush=True) + +def log_cmd(line): + log(line, style=STYLE_CMD) + +def log_mkdir(path): + log_cmd("mkdir " + path) + +def log_comment(line, fail=False, warn=False): + style = "" + if fail: style = STYLE_FAIL + if warn: style = STYLE_WARN + if sys.platform == "win32": + log("rem " + line, style=style) + else: + log("# " + line, style=style) + +def flatten_str_list(str_list): + """Flatten arbitrarily nested str list `item` to `dst`""" + def inner(result, str_list): + if isinstance(str_list, str): + result.append(str_list) + else: + for s in str_list: + inner(result, s) + result = [] + inner(result, str_list) + return result + +if argv.threads > 0: + num_threads = argv.threads +else: + num_threads = os.cpu_count() + +g_cmd_sema = None +def get_cmd_sema(): + global g_cmd_sema + if not g_cmd_sema: + g_cmd_sema = asyncio.Semaphore(num_threads) + return g_cmd_sema + +async def run_cmd(*args, realtime_output=False, env=None, cwd=None): + """Asynchronously run a command""" + + cmd_sema = get_cmd_sema() + await cmd_sema.acquire() + + cmd_args = flatten_str_list(args) + cmd = cmd_args[0] + cmd_args = cmd_args[1:] + + exec_cmd = cmd + if cwd: + line_cmd = os.path.relpath(cmd, cwd) + exec_cmd = os.path.abspath(cmd) + + cmdline = subprocess.list2cmdline([line_cmd] + cmd_args) + if sys.platform == "win32": + cmdline = f"pushd {cwd} & {cmdline} & popd" + else: + cmdline = f"pushd {cwd} ; {cmdline} ; popd" + else: + cmdline = subprocess.list2cmdline([cmd] + cmd_args) + + pipe = None if realtime_output else asyncio.subprocess.PIPE + + out = err = "" + ok = False + + log_cmd(cmdline) + + begin = time.time() + + try: + proc = await asyncio.create_subprocess_exec(exec_cmd, *cmd_args, + stdout=pipe, stderr=pipe, env=env, cwd=cwd) + + if not realtime_output: + out, err = await proc.communicate() + out = out.decode("utf-8", errors="ignore").strip() + err = err.decode("utf-8", errors="ignore").strip() + + ok = proc.returncode == 0 + except FileNotFoundError: + err = f"{cmd} not found" + except OSError as e: + err = str(e) + + end = time.time() + + cmd_sema.release() + + return ok, out, err, cmdline, end - begin + +def config_fmt_arch(config): + arch = config["arch"] + if config.get("san"): + arch += "-san" + return arch + +async def run_fail(message): + return False, "", "CL: asan not supported", "", 0.0 + +class Compiler: + def __init__(self, name, exe): + self.name = name + self.exe = exe + self.env = None + self.compile_archs = set() + self.run_archs = set() + + def run(self, *args, **kwargs): + return run_cmd(self.exe, args, env=self.env, **kwargs) + +class CLCompiler(Compiler): + def __init__(self, name, exe): + super().__init__(name, exe) + self.has_c = True + self.has_cpp = True + + async def check_version(self): + _, out, err, _, _ = await self.run() + m = re.search(r"Version ([.0-9]+) for (\w+)", out + err, re.M) + if not m: return False + self.arch = m.group(2).lower() + self.version = m.group(1) + return True + + def supported_archs(self): + if self.arch == "x86": + return ["x86"] + if self.arch == "x64": + return ["x64"] + return [] + + def compile(self, config): + if config.get("asan"): + return run_fail("CL: asan not supported") + if config.get("ubsan"): + return run_fail("CL: ubsan not supported") + + sources = config["sources"] + output = config["output"] + + args = [] + args += sources + args += ["/MT", "/nologo"] + + if not config.get("compile_only"): + obj_dir = os.path.dirname(output) + args.append(f"/Fo{obj_dir}\\") + + if config.get("warnings", False): + args.append("/W4") + args.append("/WX") + else: + args.append("/W3") + + if config.get("compile_only"): + args.append("/c") + + if config.get("dev", True): + args.append("/DUFBX_DEV") + + if config.get("optimize", False): + args.append("/Ox") + else: + args.append("/DDEBUG=1") + + if config.get("regression", False): + args.append("/DUFBX_REGRESSION=1") + + for key, val in config.get("defines", {}).items(): + if not val: + args.append(f"/D{key}") + else: + args.append(f"/D{key}={val}") + + if config.get("openmp", False): + args.append("/openmp") + + if config.get("cpp", False): + args.append("/EHsc") + + if config.get("sse", False): + args.append("/DSSE=1") + + if config.get("compile_only"): + args.append(f"/Fo\"{output}\"") + else: + args.append("/link") + args += ["/opt:ref"] + args.append(f"-out:{output}") + + return self.run(args) + +class GCCCompiler(Compiler): + def __init__(self, name, exe, cpp, has_m32=True): + super().__init__(name, exe) + self.has_c = not cpp + self.has_cpp = cpp + self.has_m32 = has_m32 + self.sysroot = "" + + async def check_version(self): + _, vout, _, _, _ = await self.run("-dumpversion") + _, mout, _, _, _ = await self.run("-dumpmachine") + if not (vout and mout): return False + self.version = vout + self.arch = mout.lower() + return True + + def supported_archs_raw(self): + if "x86_64" in self.arch: + return ["x86", "x64"] if self.has_m32 else ["x64"] + if "i686" in self.arch: + return ["x86"] + if "arm-" in self.arch or "armv7l-" in self.arch or "armv7b-" in self.arch: + return ["arm32"] + if "aarch64" in self.arch: + return ["arm64"] + if "wasm32" in self.arch: + return ["wasm32"] + return [] + + def supported_archs(self): + raw_archs = self.supported_archs_raw() + archs = [*raw_archs] + archs += (a + "-san" for a in raw_archs if a != "wasm32") + return archs + + def modify_compile_args(self, config, args): + pass + + def compile(self, config): + sources = config["sources"] + output = config["output"] + + args = [] + + if self.sysroot: + args += ["--sysroot", self.sysroot] + + if config.get("warnings", False): + args += ["-Wall", "-Wextra", "-Wsign-conversion", "-Wmissing-prototypes"] + if self.has_cpp: + args += ["-Wconversion-null"] + args += ["-Werror"] + + args.append("-g") + + if config.get("optimize", False): + if config.get("san", False): + args.append("-O0") + else: + args.append("-O2") + args.append("-DNDEBUG=1") + + if config.get("regression", False): + args.append("-DUFBX_REGRESSION=1") + + if config.get("openmp", False): + args.append("-openmp") + + if self.has_m32 and config.get("arch", "") == "x86": + args.append("-m32") + + if config.get("compile_only"): + args.append("-c") + + if self.has_cpp: + std = "c++11" + else: + std = "gnu99" + std = config.get("std", std) + args.append(f"-std={std}") + + if config.get("dev", True): + args.append("-DUFBX_DEV") + + use_sse = False + if config.get("sse", False): + args.append("-DSSE=1") + args += ["-mbmi", "-msse3", "-msse4.1", "-msse4.2"] + if config.get("arch", "") == "x86": + use_sse = True + + if config.get("arch", "") == "x86" and config.get("ieee754", False): + use_sse = True + args += ["-mfpmath=sse"] + + if config.get("ieee754", False): + args += ["-ffp-contract=off"] + + if use_sse: + args += ["-msse", "-msse2"] + + if config.get("threads", False): + args.append("-pthread") + + if config.get("stack_protector", False): + args.append("-fstack-protector") + + if config.get("san"): + args.append("-fsanitize=address") + if sys.platform != "darwin": + args.append("-fsanitize=leak") + args.append("-fsanitize=undefined") + args.append("-fno-sanitize=float-cast-overflow") + args.append("-fno-sanitize-recover=undefined") + args.append("-DUFBX_UBSAN") + + if "mingw" in self.arch: + args.append("-D__USE_MINGW_ANSI_STDIO=1") + + for key, val in config.get("defines", {}).items(): + if not val: + args.append(f"-D{key}") + else: + args.append(f"-D{key}={val}") + + args += sources + + if "msvc" not in self.arch and not config.get("compile_only"): + args.append("-lm") + + args += ["-o", output] + + self.modify_compile_args(config, args) + + return self.run(args) + +class ClangCompiler(GCCCompiler): + def __init__(self, name, exe, cpp, **kwargs): + super().__init__(name, exe, cpp, **kwargs) + +class TCCCompiler(GCCCompiler): + def __init__(self, name, exe): + super().__init__(name, exe, False) + self.has_c = True + self.has_cpp = False + self.has_m32 = True + self.sysroot = "" + + async def check_version(self): + _, out, err, _, _ = await self.run("-v") + print(out + err) + m = re.search(r"tcc version ([.0-9]+) \((\w+).*\)", out + err, re.M) + if not m: return False + self.arch = m.group(2).lower() + self.version = m.group(1) + return True + + def supported_archs(self): + if "x86_64" in self.arch: + return ["x86", "x64"] if self.has_m32 else ["x64"] + if "i686" in self.arch: + return ["x86"] + return [] + +class EmscriptenCompiler(ClangCompiler): + def __init__(self, name, exe, cpp): + super().__init__(name, exe, cpp) + +class WasiCompiler(ClangCompiler): + def __init__(self, name, exe, cpp, sysroot): + super().__init__(name, exe, cpp) + self.sysroot = sysroot + + def modify_compile_args(self, config, args): + args.append("-Wl,--stack-first") + +class ZigCompiler(ClangCompiler): + def __init__(self, name, exe, cpp): + super().__init__(name, exe, cpp) + +@functools.lru_cache(8) +def get_vcvars(bat_name): + vswhere_path = r"%ProgramFiles(x86)%/Microsoft Visual Studio/Installer/vswhere.exe" + vswhere_path = os.path.expandvars(vswhere_path) + if not os.path.exists(vswhere_path): + raise EnvironmentError("vswhere.exe not found at: %s", vswhere_path) + + vs_path = os.popen('"{}" -latest -property installationPath'.format(vswhere_path)).read().rstrip() + vsvars_path = os.path.join(vs_path, f"VC\\Auxiliary\\Build\\{bat_name}") + + output = os.popen('"{}" && set'.format(vsvars_path)).read() + env = { } + for line in output.splitlines(): + items = tuple(line.split("=", 1)) + if len(items) == 2: + env[items[0]] = items[1] + return env + +class VsCompiler(Compiler): + def __init__(self, name, bat, inner): + super().__init__(name, inner.exe) + self.bat = bat + self.inner = inner + + async def check_version(self): + try: + env = get_vcvars(self.bat) + self.inner.env = env + for key, value in env.items(): + if key.upper() != "PATH": continue + for path in value.split(";"): + cl_path = os.path.join(path, self.exe) + if os.path.exists(cl_path): + self.inner.exe = cl_path + if await self.inner.check_version(): + self.exe = self.inner.exe + self.arch = self.inner.arch + self.version = self.inner.version + self.has_c = self.inner.has_c + self.has_cpp = self.inner.has_cpp + return True + return False + except: + return False + + def supported_archs(self): + return self.inner.supported_archs() + + def supports_config(self, config): + return self.inner.supports_config(config) + + def compile(self, config): + return self.inner.compile(config) + +def supported_archs(compiler): + archs = compiler.supported_archs() + if argv.no_sanitize: + archs = [a for a in archs if not a.endswith("-san")] + if argv.no_sanitize_arch: + archs = [a for a in archs if not a.endswith("-san") or a[:-4] not in argv.no_sanitize_arch] + return archs + +all_compilers = [ + CLCompiler("cl", "cl.exe"), + GCCCompiler("gcc", "gcc", False), + GCCCompiler("gcc", "g++", True), + ClangCompiler("clang", "clang", False), + ClangCompiler("clang", "clang++", True), + VsCompiler("vs_cl64", "vcvars64.bat", CLCompiler("cl", "cl.exe")), + VsCompiler("vs_cl32", "vcvars32.bat", CLCompiler("cl", "cl.exe")), + # VsCompiler("vs_clang64", "vcvars64.bat", ClangCompiler("clang", "clang.exe", False, has_m32=False)), + # VsCompiler("vs_clang64", "vcvars64.bat", ClangCompiler("clang", "clang++.exe", True, has_m32=False)), + # VsCompiler("vs_clang32", "vcvars32.bat", ClangCompiler("clang", "clang.exe", False, has_m32=False)), + # VsCompiler("vs_clang32", "vcvars32.bat", ClangCompiler("clang", "clang++.exe", True, has_m32=False)), + # EmscriptenCompiler("emcc", emcc", False), + # EmscriptenCompiler("emcc", emcc++", True), +] + +ichain = itertools.chain.from_iterable + +for sdk in argv.wasi_sdk: + path = os.path.join(sdk, "bin", "clang") + cpp_path = os.path.join(sdk, "bin", "clang++") + sysroot = os.path.join(sdk, "share", "wasi-sysroot") + all_compilers += [ + WasiCompiler("wasi_clang", path, False, sysroot), + WasiCompiler("wasi_clang", cpp_path, True, sysroot), + ] + +for desc in argv.additional_compiler: + name = re.sub(r"[^A-Za-z0-9\-]", "", desc) + if "clang" in desc: + cpp = re.sub(r"clang", "clang++", desc, 1) + all_compilers += [ + ClangCompiler(name, desc, False), + ClangCompiler(name, cpp, True), + ] + elif "gcc" in desc: + cpp = re.sub(r"gcc", "g++", desc, 1) + all_compilers += [ + GCCCompiler(name, desc, False), + GCCCompiler(name, cpp, True), + ] + elif "tcc" in desc: + all_compilers += [ + TCCCompiler(name, desc), + ] + else: + raise RuntimeError(f"Could not parse compiler for {desc}") + +if argv.remove_compiler: + all_compilers = [c for c in all_compilers if c.name not in argv.remove_compiler] + +if argv.compiler: + compilers = set(argv.compiler) + all_compilers = [c for c in all_compilers if c.name in compilers] + +def gather(aws): + return asyncio.gather(*aws) + +async def check_compiler(compiler): + if await compiler.check_version(): + return [compiler] + else: + return [] + +async def find_compilers(): + return list(ichain(await gather(check_compiler(c) for c in all_compilers))) + +class Target: + def __init__(self, name, suffix, compiler, config): + self.name = name + self.suffix = suffix + self.compiler = compiler + self.config = config + self.skipped = False + self.compiled = False + self.ran = False + self.ok = True + self.log = [] + +async def compile_target(t): + arch_test = t.config.get("arch_test", False) + if config_fmt_arch(t.config) not in t.compiler.compile_archs and not arch_test: + t.skipped = True + return + + path = os.path.dirname(t.config["output"]) + if not os.path.exists(path): + os.makedirs(path, exist_ok=True) + log_mkdir(path) + + ok, out, err, cmdline, time = await t.compiler.compile(t.config) + + t.log.append("$ " + cmdline) + t.log.append(out) + t.log.append(err) + + if argv.verbose: + log("\n".join(["$ " + cmdline, out, err])) + + if ok: + t.compiled = True + else: + t.ok = False + + head = f"Compile {t.name}" + tail = f"[{time:.1f}s OK]" if ok else ("[WARN]" if arch_test else "[FAIL]") + log_comment(f"{tail} {head}", + fail=not ok and not arch_test, + warn=not ok and arch_test) + return t + +class RunOpts(NamedTuple): + rerunnable: bool = False + info: str = "" + +async def run_target(t, args, opts=RunOpts()): + if not t.compiled: return + + arch_test = t.config.get("arch_test", False) + if config_fmt_arch(t.config) not in t.compiler.run_archs and not arch_test: + return + + args = args[:] + if t.config.get("dedicated-allocs", False): + args += ["--dedicated-allocs"] + args = [a.replace("%TARGET_SUFFIX%", t.suffix) for a in args] + + cwd = t.config.get("cwd") + + if opts.rerunnable and not t.ok: + return + + if t.config.get("arch") == "wasm32": + wasm_args = [argv.wasm_runtime, "run", "--dir", ".", t.config["output"], "--"] + wasm_args += args + ok, out, err, cmdline, time = await run_cmd(wasm_args, cwd=cwd) + else: + ok, out, err, cmdline, time = await run_cmd(t.config["output"], args, cwd=cwd) + + + if opts.rerunnable: + if not t.ok: return + + t.log.clear() + t.ran = False + + t.log.append("$ " + cmdline) + t.log.append(out) + t.log.append(err) + + if argv.verbose: + log("\n".join(["$ " + cmdline, out, err])) + + if ok: + t.ran = True + else: + t.ok = False + + head = f"Run {t.name}" + if opts.info: + head = f"{head} {opts.info}" + + tail = f"[{time:.1f}s OK]" if ok else ("[WARN]" if arch_test else "[FAIL]") + log_comment(f"{tail} {head}", + fail=not ok and not arch_test, + warn=not ok and arch_test) + return t + +async def compile_and_run_target(t, args): + await compile_target(t) + if args is not None: + await run_target(t, args) + return t + +async def run_viewer_target(target): + log_comment(f"-- Running viewer with {target.name} --") + + for root, _, files in os.walk("data"): + for file in files: + if "_fail_" in file: continue + if "\U0001F602" in file: continue + path = os.path.join(root, file) + if "fuzz" in path: continue + if path.endswith(".fbx") or path.endswith(".obj"): + target.log.clear() + target.ran = False + await run_target(target, [path]) + if not target.ran: + return + +def copy_file(src, dst): + shutil.copy(src, dst) + if sys.platform == "win32": + log_cmd(f"copy {src} {dst}") + else: + log_cmd(f"cp {src} {dst}") + +exit_code = 0 + +def decorate_arch(compiler, arch): + if arch not in compiler.compile_archs: + return arch + " (FAIL)" + if arch not in compiler.run_archs: + return arch + " (compile only)" + return arch + +tests = set(argv.tests) +impicit_tests = False +if not tests: + tests = ["tests", "stack", "picort", "viewer", "domfuzz", "objfuzz", "readme", "threadcheck", "hashes"] + implicit_tests = True + +async def main(): + global exit_code + + log_comment(f"-- Running CI tests, using {num_threads} threads --") + log_comment("-- Searching for compilers --") + compilers = await find_compilers() + + all_configs = { + "optimize": { + "debug": { "optimize": False, "regression": True }, + "release": { "optimize": True }, + }, + "arch": { + "x86": { "arch": "x86" }, + "x64": { "arch": "x64" }, + "arm32": { "arch": "arm32" }, + "arm64": { "arch": "arm64" }, + "wasm32": { "arch": "wasm32" }, + }, + "sanitize": { + "": { }, + "sanitize": { "san": True, "dedicated-allocs": True }, + }, + } + + for arch in argv.remove_arch: + del all_configs["arch"][arch] + + arch_configs = { + "arch": all_configs["arch"], + } + + arch_test_configs = { + "arch": all_configs["arch"], + "sanitize": all_configs["sanitize"], + } + + build_path = "build" + if not os.path.exists(build_path): + os.makedirs(build_path, exist_ok=True) + log_mkdir(build_path) + + def compile_permutations(prefix, config, config_options, run_args): + opt_combos = [[(name, opt) for opt in opts] for name, opts in config_options.items()] + opt_combos = list(itertools.product(*opt_combos)) + + is_cpp = config.get("cpp", False) + is_c = not is_cpp + + for compiler in compilers: + archs = set(supported_archs(compiler)) + + if is_c and not compiler.has_c: continue + if is_cpp and not compiler.has_cpp: continue + + for opts in opt_combos: + optstring = "_".join(opt for _,opt in opts if opt) + + suffix = f"{compiler.name}_{optstring}" + name = f"{prefix}_{suffix}" + + path = os.path.join(build_path, name) + + conf = copy.deepcopy(config) + conf["output"] = os.path.join(path, config.get("output", "a.exe")) + + if "defines" not in conf: + conf["defines"] = { } + + if not conf.get("ignore_user_defines", False): + for k in argv.define: + v = "1" + if "=" in k: + k, v = k.split("=", 1) + conf["defines"][k] = v + + for opt_name, opt in opts: + conf.update(config_options[opt_name][opt]) + + overrides = conf.get("overrides") + if overrides: + overrides(conf, compiler) + + if conf.get("skip", False): + continue + + if config_fmt_arch(conf) not in archs: + continue + + target = Target(name, suffix, compiler, conf) + yield compile_and_run_target(target, run_args) + + exe_suffix = "" + obj_suffix = ".o" + if sys.platform == "win32": + exe_suffix = ".exe" + obj_suffix = ".obj" + + ctest_tasks = [] + + ctest_config = { + "sources": ["misc/compiler_test.c"], + "output": "ctest" + exe_suffix, + "arch_test": True, + "ignore_user_defines": True, + } + ctest_tasks += compile_permutations("ctest", ctest_config, arch_test_configs, ["1.5"]) + + cpptest_config = { + "sources": ["misc/compiler_test.cpp"], + "output": "cpptest" + exe_suffix, + "cpp": True, + "arch_test": True, + "ignore_user_defines": True, + } + ctest_tasks += compile_permutations("cpptest", cpptest_config, arch_test_configs, ["1.5"]) + + bad_compiles = 0 + bad_runs = 0 + + compiler_test_tasks = await gather(ctest_tasks) + for target in compiler_test_tasks: + arch = config_fmt_arch(target.config) + if target.compiled: + target.compiler.compile_archs.add(arch) + else: + bad_compiles += 1 + if target.ran and "sin(1.50) = 1.00" in target.log: + target.compiler.run_archs.add(arch) + elif target.compiled: + bad_runs += 1 + + log_comment("-- Detected the following compilers --") + + removed_archs = set(argv.remove_arch) + removed_archs.update(f"{arch}-san" for arch in argv.remove_arch) + + for compiler in compilers: + archs = ", ".join(decorate_arch(compiler, arch) for arch in supported_archs(compiler) if arch not in removed_archs) + log_comment(f" {compiler.exe}: {compiler.arch} {compiler.version} [{archs}]") + + num_fail = 0 + all_targets = [] + + if "tests" in tests: + log_comment("-- Compiling and running tests --") + + target_tasks = [] + + runner_config = { + "sources": ["test/runner.c", "ufbx.c"], + "output": "runner" + exe_suffix, + } + target_tasks += compile_permutations("runner", runner_config, all_configs, ["-d", "data"]) + + cpp_config = { + "sources": ["misc/test_build.cpp"], + "output": "cpp" + exe_suffix, + "cpp": True, + "warnings": True, + } + target_tasks += compile_permutations("cpp", cpp_config, arch_configs, []) + + cpp_no_dev_config = { + "sources": ["misc/test_build.cpp"], + "output": "cpp" + exe_suffix, + "cpp": True, + "warnings": True, + "optimize": True, + "dev": False, + } + target_tasks += compile_permutations("cpp_no_dev", cpp_no_dev_config, arch_configs, []) + + targets = await gather(target_tasks) + all_targets += targets + + if "stack" in tests: + log_comment("-- Compiling and running stack limited tests --") + + target_tasks = [] + + def debug_overrides(config, compiler): + stack_limit = 128*1024 + if sys.platform == "win32" and compiler.name in ["gcc"]: + # GCC can't handle CreateThread on CI.. + config["skip"] = True + elif sys.platform == "win32" and compiler.name in ["clang"]: + # TODO: Check what causes this stack usage + stack_limit = 256*1024 + config["defines"]["UFBXT_STACK_LIMIT"] = stack_limit + + debug_stack_config = { + "sources": ["test/runner.c", "ufbx.c"], + "output": "runner" + exe_suffix, + "optimize": False, + "threads": True, + "stack_protector": True, + "defines": { }, + "overrides": debug_overrides, + } + + target_tasks += compile_permutations("runner_debug_stack", debug_stack_config, arch_configs, ["-d", "data"]) + + def release_overrides(config, compiler): + stack_limit = 64*1024 + if sys.platform == "win32" and compiler.name in ["gcc"]: + # GCC can't handle CreateThread on CI.. + config["skip"] = True + elif sys.platform == "win32" and compiler.name in ["clang", "vs_cl64"]: + # TODO: Check what causes this stack usage + stack_limit = 128*1024 + elif config["arch"] == "arm64": + # Fails with 'Failed to run thread with stack size of 65536 bytes' + # with 64kiB stack.. + stack_limit = 128*1024 + config["defines"]["UFBXT_STACK_LIMIT"] = stack_limit + + release_stack_config = { + "sources": ["test/runner.c", "ufbx.c"], + "output": "runner" + exe_suffix, + "optimize": True, + "threads": True, + "stack_protector": True, + "defines": { }, + "overrides": release_overrides, + } + + target_tasks += compile_permutations("runner_release_stack", release_stack_config, arch_configs, ["-d", "data"]) + + targets = await gather(target_tasks) + all_targets += targets + + if "features" in tests: + log_comment("-- Compiling and running partial features --") + + feature_defines = [ + "UFBX_NO_SUBDIVISION", + "UFBX_NO_TESSELLATION", + "UFBX_NO_GEOMETRY_CACHE", + "UFBX_NO_SCENE_EVALUATION", + "UFBX_NO_TRIANGULATION", + "UFBX_NO_ERROR_STACK", + ] + + target_tasks = [] + + for bits in range(1, 1 << len(feature_defines)): + defines = { name: 1 for ix, name in enumerate(feature_defines) if (1 << ix) & bits } + + feature_config = { + "sources": ["ufbx.c"], + "output": f"features_{bits}" + obj_suffix, + "warnings": True, + "compile_only": True, + "defines": defines, + } + target_tasks += compile_permutations("features", feature_config, arch_configs, None) + + targets = await gather(target_tasks) + all_targets += targets + + if "picort" in tests: + log_comment("-- Compiling and running picort --") + + target_tasks = [] + + picort_configs = { + "arch": arch_configs["arch"], + "sse": { + "scalar": { "sse": False }, + "sse": { "sse": True }, + }, + } + + picort_config = { + "sources": ["ufbx.c", "examples/picort/picort.cpp"], + "output": "picort" + exe_suffix, + "cpp": True, + "optimize": True, + "std": "c++14", + "threads": True, + } + target_tasks += compile_permutations("picort", picort_config, picort_configs, None) + + targets = await gather(target_tasks) + all_targets += targets + + def target_score(target, want_sse): + compiler = target.compiler + config = target.config + if not target.compiled: + return (0, 0) + score = 1 + if config.get("sse", False) == want_sse: + score += 100 + if config["arch"] == "x64": + score += 10 + if "clang" in compiler.name: + score += 10 + if "msvc" in compiler.name: + score += 5 + version = re.search(r"\d+", compiler.version) + version = int(version.group(0)) if version else 0 + return (score, version) + + image_path = os.path.join("build", "images") + if not os.path.exists(image_path): + os.makedirs(image_path, exist_ok=True) + log_mkdir(image_path) + + scalar_target = max(targets, key=lambda t: target_score(t, False)) + sse_target = max(targets, key=lambda t: target_score(t, True)) + + if scalar_target.compiled and scalar_target != sse_target: + log_comment(f"-- Rendering scenes with {scalar_target.name} --") + + scalar_target.log.clear() + scalar_target.ran = False + args = [ + "data/picort/barbarian.picort.txt", + "-o", "build/images/barbarian-scalar.png", + "--samples", "64", + "--error-threshold", "0.02", + ] + await run_target(scalar_target, args) + if scalar_target.ran: + for line in scalar_target.log[1].splitlines(keepends=False): + log_comment(line) + + if sse_target.compiled: + log_comment(f"-- Rendering scenes with {sse_target.name} --") + + scenes = [ + "data/picort/barbarian.picort.txt", + "data/picort/barbarian-big.picort.txt", + "data/picort/slime-binary.picort.txt", + "data/picort/slime-ascii.picort.txt", + "data/picort/slime-big.picort.txt", + ] + + for scene in scenes: + sse_target.log.clear() + sse_target.ran = False + await run_target(sse_target, [scene]) + if not sse_target.ran: + break + for line in sse_target.log[1].splitlines(keepends=False): + log_comment(line) + + if "viewer" in tests: + log_comment("-- Compiling and running viewer --") + + target_tasks = [] + + viewer_configs = { + "arch": arch_configs["arch"], + "sanitize": { + "": { }, + "sanitize": { "san": True }, + } + } + + viewer_config = { + "sources": ["ufbx.c", "examples/viewer/viewer.c", "examples/viewer/external.c"], + "output": "viewer" + exe_suffix, + "optimize": True, + "defines": { + "TEST_VIEWER": "", + }, + } + target_tasks += compile_permutations("viewer", viewer_config, viewer_configs, None) + + targets = await gather(target_tasks) + all_targets += targets + + running_viewers = [] + for target in targets: + if target.compiled: + running_viewers.append(run_viewer_target(target)) + await gather(running_viewers) + + if "domfuzz" in tests: + log_comment("-- Compiling and running domfuzz --") + + target_tasks = [] + + domfuzz_configs = { + "arch": arch_configs["arch"], + } + + domfuzz_config = { + "sources": ["ufbx.c", "test/domfuzz/fbxdom.cpp", "test/domfuzz/domfuzz_main.cpp"], + "output": "domfuzz" + exe_suffix, + "cpp": True, + "optimize": True, + "std": "c++14", + } + target_tasks += compile_permutations("domfuzz", domfuzz_config, domfuzz_configs, None) + + targets = await gather(target_tasks) + all_targets += targets + + def target_score(target): + compiler = target.compiler + config = target.config + if not target.compiled: + return (0, 0) + score = 1 + if config["arch"] == "x64": + score += 10 + if "clang" in compiler.name: + score += 10 + if "msvc" in compiler.name: + score += 5 + version = re.search(r"\d+", compiler.version) + version = int(version.group(0)) if version else 0 + return (score, version) + + target = max(targets, key=target_score) + + if target.compiled: + log_comment(f"-- Running domfuzz with {target.name} --") + + too_heavy_files = [ + "blender_293_barbarian_7400_binary", + "maya_slime_7500_binary", + "maya_character_6100_binary", + "maya_character_7500_binary", + "maya_human_ik_6100_binary", + "maya_human_ik_7400_binary", + "max2009_blob_6100_binary", + "synthetic_unicode_7500_binary", + "maya_lod_group_6100_binary", + "maya_dq_weights_7500_binary", + "maya_triangulate_triangulated_7500_binary", + "maya_kenney_character_7700_binary", + "maya_node_attribute_zoo_6100_binary", + "max_physical_material_textures_6100_binary", + ] + + run_tasks = [] + for root, _, files in os.walk("data"): + for file in files: + if "_ascii" in file: continue + if any(f in file for f in too_heavy_files): continue + path = os.path.join(root, file) + if "fuzz" in path: continue + if path.endswith(".fbx"): + target.log.clear() + target.ran = False + run_tasks.append(run_target(target, [path], + RunOpts( + rerunnable=True, + info=path, + ) + )) + + targets = await gather(run_tasks) + + if "objfuzz" in tests: + log_comment("-- Compiling and running objfuzz --") + + target_tasks = [] + + objfuzz_configs = { + "arch": arch_configs["arch"], + } + + objfuzz_config = { + "sources": ["ufbx.c", "test/objfuzz.cpp"], + "output": "objfuzz" + exe_suffix, + "cpp": True, + "optimize": True, + "std": "c++14", + } + target_tasks += compile_permutations("objfuzz", objfuzz_config, objfuzz_configs, None) + + targets = await gather(target_tasks) + all_targets += targets + + def target_score(target): + compiler = target.compiler + config = target.config + if not target.compiled: + return (0, 0) + score = 1 + if config["arch"] == "x64": + score += 10 + if "clang" in compiler.name: + score += 10 + if "msvc" in compiler.name: + score += 5 + version = re.search(r"\d+", compiler.version) + version = int(version.group(0)) if version else 0 + return (score, version) + + target = max(targets, key=target_score) + + if target.compiled: + log_comment(f"-- Running objfuzz with {target.name} --") + + too_heavy_files = [ + "synthetic_color_suzanne_0_obj.obj", + "synthetic_color_suzanne_1_obj.obj", + "zbrush_polygroup_mess_0_obj.obj", + ] + + run_tasks = [] + for root, _, files in os.walk("data"): + for file in files: + path = os.path.join(root, file) + if any(f in file for f in too_heavy_files): continue + if re.match(r"^.*_\d+_obj.obj$", file): + target.log.clear() + target.ran = False + run_tasks.append(run_target(target, [path], + RunOpts( + rerunnable=True, + info=path, + ) + )) + elif re.match(r"^.*_\d+_mtl.mtl$", file): + target.log.clear() + target.ran = False + run_tasks.append(run_target(target, ["--mtl", path], + RunOpts( + rerunnable=True, + info=path, + ) + )) + + targets = await gather(run_tasks) + + if "readme" in tests: + log_comment("-- Compiling and running README.md --") + + prologue = """ + #include + #include + #include "../ufbx.h" + + void push_vertex(const ufbx_vec3 *position, const ufbx_vec3 *normal) { } + void push_pose(const ufbx_matrix *matrix) { } + + int main(int argc, char **argv) { + """ + + epilogue = """ + return 0; + } + """ + + readme_dst = os.path.join(build_path, "readme.c") + with open(readme_dst, "wt") as outf: + for line in prologue.strip().splitlines(): + print(line.strip(), file=outf) + + in_c = False + with open("README.md", "rt") as inf: + for line in inf: + if line.strip() == "```c": + in_c = True + elif line.strip() == "```": + in_c = False + elif in_c: + print(line.rstrip(), file=outf) + + for line in epilogue.strip().splitlines(): + print(line.strip(), file=outf) + + readme_cpp_dst = os.path.join(build_path, "readme.cpp") + shutil.copyfile(readme_dst, readme_cpp_dst) + + copy_file( + os.path.join("data" ,"blender_279_default_7400_binary.fbx"), + os.path.join(build_path, "thing.fbx")) + + target_tasks = [] + + readme_config = { + "sources": ["build/readme.c", "ufbx.c"], + "output": "readme" + exe_suffix, + "cwd": "build", + } + target_tasks += compile_permutations("readme", readme_config, arch_configs, []) + + readme_cpp_config = { + "sources": ["build/readme.cpp", "ufbx.c"], + "output": "readme_cpp" + exe_suffix, + "cpp": True, + "cwd": "build", + } + target_tasks += compile_permutations("readme_cpp", readme_cpp_config, arch_configs, []) + + targets = await gather(target_tasks) + all_targets += targets + + if "threadcheck" in tests: + log_comment("-- Compiling and running threadcheck --") + + target_tasks = [] + + threadcheck_config = { + "sources": ["ufbx.c", "test/threadcheck.cpp"], + "output": "threadcheck" + exe_suffix, + "cpp": True, + "optimize": False, + "std": "c++14", + "threads": True, + } + target_tasks += compile_permutations("threadcheck", threadcheck_config, arch_configs, None) + + targets = await gather(target_tasks) + all_targets += targets + + def target_score(target): + compiler = target.compiler + config = target.config + if not target.compiled: + return (0, 0) + score = 1 + if config["arch"] == "x64": + score += 10 + if "clang" in compiler.name: + score += 10 + if "msvc" in compiler.name: + score += 5 + version = re.search(r"\d+", compiler.version) + version = int(version.group(0)) if version else 0 + return (score, version) + + best_target = max(targets, key=target_score) + if best_target.compiled: + log_comment(f"-- Running {best_target.name} --") + + best_target.log.clear() + best_target.ran = False + await run_target(best_target, ["data/maya_cube_7500_binary.fbx", "2"]) + for line in best_target.log[1].splitlines(keepends=False): + log_comment(line) + + if "hashes" in tests: + + hash_file = argv.hash_file + if not hash_file: + hash_file = os.path.join(build_path, "hashes.txt") + if hash_file and os.path.exists(hash_file): + log_comment("-- Compiling and running hash_scene --") + target_tasks = [] + + hash_scene_configs = { + "arch": all_configs["arch"], + "optimize": all_configs["optimize"], + } + + hash_scene_config = { + "sources": ["test/hash_scene.c", "misc/fdlibm.c"], + "output": "hash_scene" + exe_suffix, + "ieee754": True, + } + + dump_path = os.path.join(build_path, "hashdumps") + if not os.path.exists(dump_path): + os.makedirs(dump_path, exist_ok=True) + log_mkdir(dump_path) + else: + for dump_file in os.listdir(dump_path): + assert dump_file.endswith(".txt") + os.remove(os.path.join(dump_path, dump_file)) + + if argv.runner: + dump_file = os.path.join(dump_path, f"{argv.runner}_%TARGET_SUFFIX%.txt") + else: + dump_file = os.path.join(dump_path, "%TARGET_SUFFIX%.txt") + + args = ["--check", hash_file, "--dump", dump_file, "--max-dump-errors", "3"] + target_tasks += compile_permutations("hash_scene", hash_scene_config, hash_scene_configs, args) + + targets = await gather(target_tasks) + all_targets += targets + else: + print("No hash file found, skipping hashes", file=sys.stderr) + if not implicit_tests: + exit_code = 2 + + + for target in all_targets: + if target.ok: continue + print() + log(f"-- FAIL: {target.name}", style=STYLE_FAIL) + print("\n".join(target.log)) + num_fail += 1 + + print() + severity = "ERROR" if argv.fail_on_pre_test else "WARNING" + if bad_compiles > 0: + print(f"{severity}: {bad_compiles} pre-test configurations failed to compile") + if argv.fail_on_pre_test: + exit_code = 2 + if bad_runs > 0: + print(f"{severity}: {bad_runs} pre-test configurations failed to run") + if argv.fail_on_pre_test: + exit_code = 2 + print(f"{len(all_targets) - num_fail}/{len(all_targets)} targets succeeded") + if num_fail > 0: + exit_code = 1 + +if __name__ == "__main__": + if sys.platform == "win32": + loop = asyncio.ProactorEventLoop() + else: + loop = asyncio.get_event_loop() + + loop.run_until_complete(main()) + loop.close() + sys.exit(exit_code) diff --git a/modules/ufbx/misc/split_content_test_gen.py b/modules/ufbx/misc/split_content_test_gen.py new file mode 100644 index 0000000..edd8c43 --- /dev/null +++ b/modules/ufbx/misc/split_content_test_gen.py @@ -0,0 +1,37 @@ +import transmute_fbx as tfbx +from dataclasses import replace + +Node = tfbx.Node +Value = tfbx.Value + +divisor = 1 + +def replace_content(node: Node) -> Node: + global divisor + if node.name == b"Content": + value = node.values[0] + values = [] + data = value.value + size = len(data) + step = max(1, size // divisor) + for base in range(0, size, step): + values.append(Value(b"R", data[base:base+step])) + divisor *= 4 + return replace(node, values=values) + return replace(node, children=[replace_content(n) for n in node.children]) + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(usage="transmute_fbx.py src -o dst -v 7400 -f binary-be") + parser.add_argument("src", help="Source file to read") + parser.add_argument("dst", help="Output filename") + argv = parser.parse_args() + + with open(argv.src, "rb") as f: + fbx = tfbx.parse_fbx(f) + + fbx = replace(fbx, root=replace_content(fbx.root)) + + with open(argv.dst, "wb") as f: + bf = tfbx.BinaryFormat(fbx.version, False, 1) + tfbx.binary_dump_root(f, fbx.root, bf, fbx.footer) \ No newline at end of file diff --git a/modules/ufbx/misc/test_build.cpp b/modules/ufbx/misc/test_build.cpp new file mode 100644 index 0000000..ed80770 --- /dev/null +++ b/modules/ufbx/misc/test_build.cpp @@ -0,0 +1,6 @@ +#include "../ufbx.c" + +int main() +{ + return 0; +} diff --git a/modules/ufbx/misc/test_deflate.c b/modules/ufbx/misc/test_deflate.c new file mode 100644 index 0000000..17a2cc0 --- /dev/null +++ b/modules/ufbx/misc/test_deflate.c @@ -0,0 +1,58 @@ +#define ufbx_assert(cond) do { \ + if (!(cond)) exit(1); \ + } while (0) +#include "../ufbx.c" + +#include +#include + +#ifdef _WIN32 + #include + #include +#endif + +int main(int argc, char **argv) +{ + if (argc < 3) { + fprintf(stderr, "Usage: fuzz_test \n"); + return 1; + } + + #ifdef _WIN32 + _setmode(_fileno(stdin), _O_BINARY); + _setmode(_fileno(stdout), _O_BINARY); + #endif + + size_t src_size = atoi(argv[1]); + size_t dst_size = atoi(argv[2]); + + char *src = malloc(src_size); + char *dst = malloc(dst_size); + + size_t num_read = fread(src, 1, src_size, stdin); + if (num_read != src_size) { + fprintf(stderr, "Failed to read input\n"); + return 1; + } + + ufbx_inflate_retain retain; + retain.initialized = false; + ufbx_inflate_input input = { 0 }; + input.data = src; + input.data_size = src_size; + input.total_size = src_size; + + ptrdiff_t result = ufbx_inflate(dst, dst_size, &input, &retain); + if (result != dst_size) { + fprintf(stderr, "Failed to decompress: %d\n", (int)result); + return 1; + } + + fwrite(dst, 1, dst_size, stdout); + + free(src); + free(dst); + + return 0; +} + diff --git a/modules/ufbx/misc/test_deflate.py b/modules/ufbx/misc/test_deflate.py new file mode 100644 index 0000000..cc35a57 --- /dev/null +++ b/modules/ufbx/misc/test_deflate.py @@ -0,0 +1,58 @@ +import os +import sys +import zlib +import subprocess + +if len(sys.argv) < 2: + filepath = os.path.dirname(sys.argv[0]) + if os.name == 'nt': + exe = os.path.join(filepath, "../build/test_deflate.exe") + else: + exe = os.path.join(filepath, "../build/test_deflate") + exe = os.path.relpath(exe) +else: + exe = sys.argv[1] + +path = "." +if len(sys.argv) >= 3: + path = sys.argv[2] + +def test(data): + for level in range(1, 10): + if level < 9: + print("{},".format(level), end="") + else: + print("{}".format(level), end="") + compressed = zlib.compress(data, level) + args = [exe, str(len(compressed)), str(len(data))] + result = subprocess.check_output(args, input=compressed) + if result != data: + raise ValueError("Decompression mismatch") + +for r,dirs,files in os.walk(path): + # HACK: Ignore .git directories + if ".git" in r: + continue + + for file in files: + sys.stdout.flush() + path = os.path.join(r, file) + try: + print(path, end=': ') + except: + # Print fails sometimes with weird filenames (?) + continue + try: + f = open(path, "rb") + except: + print("SKIP") + continue + b = f.read() + try: + test(b) + print() + except Exception as e: + print() + print("FAIL ({})".format(e)) + sys.exit(1) + f.close() diff --git a/modules/ufbx/misc/test_zlib_debug_compressor.py b/modules/ufbx/misc/test_zlib_debug_compressor.py new file mode 100644 index 0000000..4ae6623 --- /dev/null +++ b/modules/ufbx/misc/test_zlib_debug_compressor.py @@ -0,0 +1,433 @@ +import zlib_debug_compressor as zz +import zlib +import sys +import itertools +import random + +def test_dynamic(): + """Simple dynamic Huffman tree compressed block""" + opts = zz.Options(force_block_types=[2]) + data = b"Hello Hello!" + return data, zz.deflate(data, opts) + +def test_dynamic_no_match(): + """Simple dynamic Huffman tree without matches""" + opts = zz.Options(force_block_types=[2]) + data = b"Hello World!" + return data, zz.deflate(data, opts) + +def test_dynamic_empty(): + """Dynamic Huffman block with a single symbol (end)""" + opts = zz.Options(force_block_types=[2]) + data = b"" + return data, zz.deflate(data, opts) + +def test_dynamic_rle(): + """Simple dynamic Huffman with a single repeating match""" + opts = zz.Options(force_block_types=[2]) + data = b"AAAAAAAAAAAAAAAAA" + message = [zz.Literal(b"A"), zz.Match(16, 1)] + return data, zz.compress_message(message, opts) + +def test_dynamic_rle_boundary(): + """Simple dynamic Huffman with a single repeating match, adjusted to cross a 16 byte boundary""" + opts = zz.Options(force_block_types=[2]) + data = b"AAAAAAAAAAAAAAAAAAAAAAAAA" + message = [zz.Literal(b"A"), zz.Match(24, 1)] + return data, zz.compress_message(message, opts) + +def test_repeat_length(): + """Dynamic Huffman compressed block with repeat lengths""" + data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZZYXWVUTSRQPONMLKJIHGFEDCBA" + return data, zz.deflate(data) + +def test_huff_lengths(): + """Test all possible lit/len code lengths""" + data = b"0123456789ABCDE" + freq = 1 + probs = { } + for c in data: + probs[c] = freq + freq *= 2 + opts = zz.Options(force_block_types=[2], override_litlen_counts=probs) + return data, zz.deflate(data, opts) + +def test_multi_part_matches(): + """Matches that refer to earlier compression blocks""" + data = b"Test Part Data Data Test Data Part New Test Data" + opts = zz.Options(block_size=4, force_block_types=[0,1,2,0,1,2]) + return data, zz.deflate(data, opts) + +def create_match_distances_and_lengths_message(): + lens = [3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, + 23,24,25,26,27,28,29,30,31,32,33,34,35,39,42,43,48,50,51, + 55,58,59,63,66,67,70,82,83,90,98,99,105,114,115,120,130, + 131,140,150,162,163,170,180,194,195,200,210,226,227,230, + 240,250,257,258] + dists = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20,24,25,28, + 32,33,40,48,49,50,64,65,75,96,97,110,128,129,160,192, + 193,230,256,257,330,384,385,400,512,513,600,768,769, + 900,1024,1025,1250,1536,1537,1800,2048,2049,2500,3072, + 3073,3500,4096,4097,5000,6144,6145,7000,8192,8193,10000, + 12288,12289,14000,16384,16385,20000,24576,24577,25000, + 26000, 27000, 28000, 29000, 30000, 31000, 32768, 32768+300] + + message = [] + + l_iter = itertools.chain(lens, itertools.repeat(lens[-1])) + lit_iter = itertools.cycle(range(0,256)) + pos = 0 + prev_d = 1 + for d in dists: + while pos < d: + l = next(l_iter) + pos += l + message.append(zz.Literal(bytes([next(lit_iter), next(lit_iter)]))) + message.append(zz.Match(l, prev_d)) + prev_d = d + return message + +def test_static_distances_and_lengths(): + """Test all possible match length and distance buckets (Static)""" + message = create_match_distances_and_lengths_message() + opts = zz.Options(block_size=4294967296, force_block_types=[1]) + data = zz.decode(message) + return data, zz.compress_message(message, opts) + +def test_dynamic_distances_and_lengths(): + """Test all possible match length and distance buckets (Dynamic)""" + message = create_match_distances_and_lengths_message() + opts = zz.Options(block_size=4294967296, force_block_types=[2]) + data = zz.decode(message) + return data, zz.compress_message(message, opts) + +def test_long_codes(): + """Test longest possible bit-codes for symbols""" + message = [zz.Literal(b"test")] + pos = 0 + matches = [(140,10000),(180,14000),(210,20000),(230,30000)] + while pos < 30000: + message.append(zz.Match(258, 4)) + next_pos = pos + 258 + for l,o in matches: + if pos < o and next_pos >= o: + for n in range(5): + for m in range(n - 1): + message.append(zz.Literal(bytes([ord("A") + m]))) + message.append(zz.Match(l, o)) + next_pos += l + l += 1 + pos = next_pos + + ll_override = { } + count = 1000000000 + for ll in itertools.chain([285], b"Test", range(260,284)): + ll_override[ll] = count + count /= 2 + + dist_override = { } + count = 1000000000 + for dist in itertools.chain([3], range(10,28)): + dist_override[dist] = count + count /= 2 + + opts = zz.Options(block_size=4294967296, force_block_types=[2], + override_litlen_counts=ll_override, + override_dist_counts=dist_override) + data = zz.decode(message) + return data, zz.compress_message(message, opts) + +def test_long_code_sequences(): + """Test sequences of long codes with N bit symbols""" + messages = [] + + # Generate random prefix + random.seed(1) + + total_message = [] + + message = [] + + data = bytes(random.choices(range(ord("0"), ord("4")), k=300)) + message.append(zz.Literal(data)) + message_len = 300 + + while message_len <= 24000: + dist = min(random.randrange(256, 1024), message_len - 200) + message.append(zz.Match(200, dist)) + + data = bytes(random.choices(range(ord("0"), ord("4")), k=10)) + message.append(zz.Literal(data)) + + message_len += 210 + + opts = zz.Options(force_block_types=[2]) + messages += [message, opts] + total_message += message + + # Generate matches with increasing bit counts + for ll_bits in range(2, 15+1): + for dist_bits in [ll_bits, 15]: + message = [] + + ll_override = { } + dist_override = { } + for n in range(ll_bits - 3): + ll_override[n] = 2**(32-n) + for n in range(dist_bits - 1): + dist_override[n] = 2**(32-n) + + for ll in [256, 284, ord("A"), ord("B"), ord("C"), ord("D"), ord("E"), ord("F")]: + ll_override[ll] = 2**8 + dist_override[29] = 2**8 + + match_len = random.randrange(230, 250) + match_dist = random.randrange(17000, 24000) + message.append(zz.Match(match_len, match_dist)) + + for lits in range(0, 8): + if lits: + message.append(zz.Literal(bytes(random.choices(b"ABCDEF", k=lits)))) + match_len = random.randrange(230, 250) + match_dist = random.randrange(17000, 24000) + message.append(zz.Match(match_len, match_dist)) + + opts = zz.Options(force_block_types=[2], + override_litlen_counts=ll_override, + override_dist_counts=dist_override) + messages += [message, opts] + total_message += message + + + data = zz.decode(total_message) + return data, zz.compress_message(*messages) + +def test_two_symbol_bits(): + """Test some combinations of bit lengths for two symbols""" + messages = [] + data = b"" + + for lo in range(2, 16): + for hi in range(lo, min(lo + 6, 16)): + delta = hi - lo + + ll_override = { } + ll_override[256] = 64**16 + + for n in range(lo): + ll_override[96 + n] = 8**(16-n) + ll_override[ord("A")] = 8**(16-lo) + + for n in range(2**delta): + assert n < 64 + ll_override[n] = 8**(16-hi) + ll_override[ord("B")] = 8**(16-hi) + + message = [zz.Literal(b"AB")] + data += b"AB" + opts = zz.Options(force_block_types=[2], + override_litlen_counts=ll_override) + messages += [message, opts] + + return data, zz.compress_message(*messages) + +def test_fail_codelen_16_overflow(): + """Test oveflow of codelen symbol 16""" + data = b"\xfd\xfe\xff" + opts = zz.Options(force_block_types=[2]) + buf = zz.deflate(data, opts) + + # Patch Litlen 254-256 repeat extra N to 4 + buf.patch(0x66, 1, 2) + + return data, buf + +def test_fail_codelen_17_overflow(): + """Test oveflow of codelen symbol 17""" + data = b"\xfc" + opts = zz.Options(force_block_types=[2]) + buf = zz.deflate(data, opts) + + # Patch Litlen 254-256 zero extra N to 5 + buf.patch(0x6c, 2, 3) + + return data, buf + +def test_fail_codelen_18_overflow(): + """Test oveflow of codelen symbol 18""" + data = b"\xf4" + opts = zz.Options(force_block_types=[2]) + buf = zz.deflate(data, opts) + + # Patch Litlen 254-256 extra N to 13 + buf.patch(0x6a, 2, 7) + + return data, buf + +def test_fail_codelen_overfull(): + """Test bad codelen Huffman tree with too many symbols""" + data = b"Codelen" + opts = zz.Options(force_block_types=[2]) + buf = zz.deflate(data, opts) + + # Over-filled Huffman tree + buf.patch(0x30, 1, 3) + + return data, buf + +def test_fail_codelen_underfull(): + """Test bad codelen Huffman tree too few symbols""" + data = b"Codelen" + opts = zz.Options(force_block_types=[2]) + buf = zz.deflate(data, opts) + + # Under-filled Huffman tree + buf.patch(0x4e, 5, 3) + + return data, buf + +def test_fail_litlen_bad_huffman(): + """Test bad lit/len Huffman tree""" + data = b"Literal/Length codes" + opts = zz.Options(force_block_types=[2]) + buf = zz.deflate(data, opts) + + # Under-filled Huffman tree + buf.patch(0x6d, 1, 2) + + return data, buf + +def test_fail_distance_bad_huffman(): + """Test bad distance Huffman tree""" + data = b"Dist Dist .. Dist" + opts = zz.Options(force_block_types=[2]) + buf = zz.deflate(data, opts) + + # Under-filled Huffman tree + buf.patch(0xb1, 0b1111, 4) + + return data, buf + +def test_fail_bad_distance(): + """Test bad distance symbol (30..31)""" + data = b"Dist Dist" + opts = zz.Options(force_block_types=[1]) + buf = zz.deflate(data, opts) + + # Distance symbol 30 + buf.patch(0x42, 0b01111, 5) + + return data, buf + +def test_fail_bad_static_litlen(): + """Test bad static lit/length (286..287)""" + data = b"A" + opts = zz.Options(force_block_types=[1]) + buf = zz.deflate(data, opts) + buf.patch(19, 0b01100011, 8, "Invalid symbol 285") + + return data, buf + +def test_fail_distance_too_far(): + """Test with distance too far to the output""" + opts = zz.Options(force_block_types=[1], no_decode=True) + message = [zz.Literal(b"A"), zz.Match(4, 2)] + buf = zz.compress_message(message, opts) + + return b"", buf + +def test_fail_bad_distance_bit(): + """Test bad distance symbol in one symbol alphabet""" + data = b"asd asd" + opts = zz.Options(force_block_types=[2]) + buf = zz.deflate(data, opts) + + # Distance code 1 + buf.patch(0xaa, 0b1, 1) + + return data, buf + +def test_fail_bad_distance_empty(): + """Test using distance code from an empty tree""" + data = b"asd asd" + opts = zz.Options(force_block_types=[2]) + buf = zz.deflate(data, opts) + + # Add another distance code and replace distance 3 code for 1 (0111) + # with the code for 0 (00) for distances 3 and 4 + buf.patch(0x18, 4, 5) + buf.patch(0x98, 0b0000, 4) + + return data, buf + +def test_fail_bad_lit_length(): + """Test bad lit/length symbol""" + data = b"" + opts = zz.Options(force_block_types=[2]) + buf = zz.deflate(data, opts) + + # Patch end-of-block 0 to 1 + buf.patch(0x6b, 0b1, 1) + + return data, buf + +def test_fail_no_litlen_codes(): + """Test lit/len table with no codes""" + data = b"" + probs = { n: 0 for n in range(286) } + opts = zz.Options(force_block_types=[2], override_litlen_counts=probs, invalid_sym=zz.Code(0, 1)) + buf = zz.deflate(data, opts) + + return data, buf + +def test_fail_no_dist_codes(): + """Test distance table with no codes""" + probs = { n: 0 for n in range(30) } + opts = zz.Options(force_block_types=[2], override_dist_counts=probs, invalid_sym=zz.Code(0, 1)) + message = [zz.Literal(b"A"), zz.Match(4, 1)] + buf = zz.compress_message(message, opts) + + return data, buf + +def fmt_bytes(data, cols=20): + lines = [] + for begin in range(0, len(data), cols): + chunk = data[begin:begin+cols] + lines.append("\"" + "".join("\\x%02x" % c for c in chunk) + "\"") + return "\n".join(lines) + +def fnv1a(data): + h = 0x811c9dc5 + for d in data: + h = ((h ^ (d&0xff)) * 0x01000193) & 0xffffffff + return h + +test_cases = [ + test_dynamic, + test_dynamic_no_match, + test_dynamic_empty, + test_dynamic_rle, + test_dynamic_rle, + test_repeat_length, + test_huff_lengths, + test_multi_part_matches, + test_static_distances_and_lengths, + test_dynamic_distances_and_lengths, + test_long_codes, + test_long_code_sequences, + test_two_symbol_bits, +] + +good = True +for case in test_cases: + try: + data, buf = case() + result = zlib.decompress(buf.to_bytes()) + if data != result: + raise ValueError("Round trip failed") + print("{}: OK".format(case.__name__)) + except Exception as e: + print("{}: FAIL ({})".format(case.__name__, e)) + good = False + +sys.exit(0 if good else 1) diff --git a/modules/ufbx/misc/transmute_fbx.py b/modules/ufbx/misc/transmute_fbx.py new file mode 100644 index 0000000..5104e04 --- /dev/null +++ b/modules/ufbx/misc/transmute_fbx.py @@ -0,0 +1,268 @@ +#!/usr/bin/env python3 +from dataclasses import dataclass +import struct +from typing import Any, Tuple +import zlib +import sys +import io +import argparse + +@dataclass +class BinaryFormat: + version: int + big_endian: bool + array_encoding: int = 1 + array_original: bool = False + +@dataclass +class Value: + type: str + value: Any + original_data: Tuple[int, bytes] = (0, b"") + +@dataclass +class Node: + name: bytes + values: list[Value] + children: list["Node"] + +@dataclass +class FbxFile: + root: Node + version: int + format: str + footer: bytes = b"" + +def pack(stream, fmt, *args): + stream.write(struct.pack(fmt, *args)) + +def unpack(stream, fmt): + size = struct.calcsize(fmt) + data = stream.read(size) + return struct.unpack(fmt, data) + +primitive_fmt = { + b"C": "b", b"B": "b", + b"Y": "h", + b"I": "l", b"F": "f", + b"L": "q", b"D": "d", +} + +def binary_parse_value(stream, bf): + endian = "<>"[bf.big_endian] + type = stream.read(1) + fmt = primitive_fmt.get(type) + if fmt: + value, = unpack(stream, endian + fmt) + return Value(type, value) + if type in b"cbilfd": + arr_fmt = endian + "L" * 3 + fmt = primitive_fmt[type.upper()] + count, encoding, encoded_size = unpack(stream, arr_fmt) + original_data = arr_data = stream.read(encoded_size) + if encoding == 0: pass # Nop + elif encoding == 1: + arr_data = zlib.decompress(arr_data) + else: + raise ValueError(f"Unknown encoding: {encoding}") + values = list(v[0] for v in struct.iter_unpack(endian + fmt, arr_data)) + assert len(values) == count + return Value(type, values, original_data=(encoding, original_data)) + elif type in b"SR": + length, = unpack(stream, endian + "L") + return Value(type, stream.read(length)) + else: + raise ValueError(f"Bad type: '{type}'") + +def binary_parse_node(stream, bf): + pos = stream.tell() + endian = "<>"[bf.big_endian] + head_fmt = endian + "LQ"[bf.version >= 7500] * 3 + "B" + end_offset, num_values, values_len, name_len = unpack(stream, head_fmt) + if end_offset == 0 and name_len == 0: return None + name = stream.read(name_len) + values_end = stream.tell() + values_len + values = [binary_parse_value(stream, bf) for _ in range(num_values)] + children = [] + if stream.tell() != values_end: + assert stream.tell() < values_end + stream.seek(pos + values_end) + while stream.tell() < end_offset: + node = binary_parse_node(stream, bf) + if not node: break + children.append(node) + return Node(name, values, children) + +def parse_fbx(stream): + magic = stream.read(22) + if magic == b"Kaydara FBX Binary \x00\x1a": + big_endian = stream.read(1) != b"\x00" + endian = "<>"[big_endian] + version, = unpack(stream, endian + "L") + bf = BinaryFormat(version, big_endian) + children = [] + while True: + node = binary_parse_node(stream, bf) + if not node: break + children.append(node) + footer = stream.read(16) + root = Node("", [], children) + format = "binary-be" if big_endian else "binary" + return FbxFile(root, version, format, footer) + else: + # TODO + raise NotImplementedError() + +def binary_dump_value(stream, value: Value, bf: BinaryFormat): + endian = "<>"[bf.big_endian] + fmt = primitive_fmt.get(value.type) + stream.write(value.type) + if fmt: + pack(stream, endian + fmt, value.value) + elif value.type in b"cbilfd": + fmt = endian + primitive_fmt[value.type.upper()] + + arr_fmt = endian + "L" * 3 + if bf.array_original: + encoding, arr_data = value.original_data + pack(stream, arr_fmt, len(value.value), encoding, len(arr_data)) + stream.write(arr_data) + else: + with io.BytesIO() as ds: + for v in value.value: + pack(ds, fmt, v) + arr_data = ds.getvalue() + + count = len(value.value) + encoding = bf.array_encoding + if encoding == 1: + arr_data = zlib.compress(arr_data) + encoded_size = len(arr_data) + + pack(stream, arr_fmt, count, encoding, encoded_size) + stream.write(arr_data) + + elif value.type in b"SR": + pack(stream, endian + "L", len(value.value)) + stream.write(value.value) + else: + raise ValueError(f"Bad type: '{value.type}'") + +def binary_dump_node(stream, node: Node, bf: BinaryFormat): + endian = "<>"[bf.big_endian] + head_size = 25 if bf.version >= 7500 else 13 + head_null = b"\x00" * head_size + off_start = stream.tell() + stream.write(head_null) + stream.write(node.name) + off_value_start = stream.tell() + for value in node.values: + binary_dump_value(stream, value, bf) + values_size = stream.tell() - off_value_start + for child in node.children: + binary_dump_node(stream, child, bf) + if node.children or node.name in { b"References", b"AnimationStack", b"AnimationLayer" }: + stream.write(head_null) + off_end = stream.tell() + head_fmt = endian + "LQ"[bf.version >= 7500] * 3 + "B" + stream.seek(off_start) + pack(stream, head_fmt, off_end, len(node.values), values_size, len(node.name)) + stream.seek(off_end) + +def binary_dump_root(stream, root: Node, bf: BinaryFormat, footer: bytes): + head_size = 25 if bf.version >= 7500 else 13 + head_null = b"\x00" * head_size + endian = "<>"[bf.big_endian] + + stream.write(b"Kaydara FBX Binary \x00\x1a") + pack(stream, "B", bf.big_endian) + pack(stream, endian + "L", bf.version) + + for node in root.children: + binary_dump_node(stream, node, bf) + stream.write(head_null) + + stream.write(footer) + stream.write(b"\x00" * 4) + + ofs = stream.tell() + pad = ((ofs + 15) & ~15) - ofs + if pad == 0: + pad = 16 + + stream.write(b"\0" * pad) + pack(stream, endian + "I", bf.version) + stream.write(b"\0" * 120) + stream.write(b"\xf8\x5a\x8c\x6a\xde\xf5\xd9\x7e\xec\xe9\x0c\xe3\x75\x8f\x29\x0b") + +def ascii_dump_value(stream, value: Value, indent: str): + if value.type in b"CBYILFD": + stream.write(str(value.value)) + elif value.type in b"SR": + s = str(value.value)[2:-1] + stream.write(f"\"{s}\"") + elif value.type in b"cbilfd": + stream.write(f"* {len(value.value)} {{") + first = True + for v in value.value: + stream.write(" " if first else ", ") + stream.write(str(v)) + first = False + stream.write(" }") + else: + raise ValueError(f"Bad value type: '{value.type}'") + +def ascii_dump_node(stream, node: Node, indent: str): + name = node.name.decode("utf-8") + stream.write(f"{indent}{name}:") + first = True + for value in node.values: + stream.write(" " if first else ", ") + first = False + ascii_dump_value(stream, value, indent + " ") + if node.children: + stream.write(" {\n") + for node in node.children: + ascii_dump_node(stream, node, indent + " ") + stream.write(indent + "}\n") + else: + stream.write("\n") + +def ascii_dump_root(stream, root: Node, version: int): + v0 = version // 1000 % 10 + v1 = version // 100 % 10 + v2 = version // 10 % 10 + stream.write(f"; FBX {v0}.{v1}.{v2} project file\n") + stream.write("----------------------------------------------------\n") + for child in root.children: + ascii_dump_node(stream, child, "") + +if __name__ == "__main__": + parser = argparse.ArgumentParser(usage="transmute_fbx.py src -o dst -v 7400 -f binary-be") + parser.add_argument("src", help="Source file to read") + parser.add_argument("--output", "-o", required=True, help="Output filename") + parser.add_argument("--version", "-v", help="File version") + parser.add_argument("--format", "-f", help="File format") + argv = parser.parse_args() + + with open(argv.src, "rb") as f: + fbx = parse_fbx(f) + + format = argv.format + if not format: + format = fbx.format + version = argv.version + if not version: + version = fbx.version + + with open(argv.output, "wt" if format == "ascii" else "wb") as f: + if format == "ascii": + ascii_dump_root(f, fbx.root, version) + else: + if format == "binary-be": + bf = BinaryFormat(version, True, 0) + elif format == "binary": + bf = BinaryFormat(version, False, 1) + else: + raise ValueError(f"Unknown format: {format}") + binary_dump_root(f, fbx.root, bf, fbx.footer) diff --git a/modules/ufbx/misc/typos.toml b/modules/ufbx/misc/typos.toml new file mode 100644 index 0000000..86d7f07 --- /dev/null +++ b/modules/ufbx/misc/typos.toml @@ -0,0 +1,14 @@ +[default.extend-identifiers] + +# Offset Translation +OT = "OT" + +# Typos in the FBX fileformat +PreferedAngleX = "PreferedAngleX" +PreferedAngleY = "PreferedAngleY" +PreferedAngleZ = "PreferedAngleZ" + +[default.extend-words] + +# Level of Detail +lod = "lod" diff --git a/modules/ufbx/misc/ufbx.natvis b/modules/ufbx/misc/ufbx.natvis new file mode 100644 index 0000000..662ee58 --- /dev/null +++ b/modules/ufbx/misc/ufbx.natvis @@ -0,0 +1,96 @@ + + + + + {data,[length]s} + + + {{ x={x} y={y} }} + {{ x={x} y={y} z={z} }} + {{ x={x} y={y} z={z} w={w} }} + {{ x={x} y={y} z={z} w={w} }} + + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + {{ count={count} }}countdata + + diff --git a/modules/ufbx/misc/ufbx_testcases/blender_279_color_sets_7400_binary.fbx b/modules/ufbx/misc/ufbx_testcases/blender_279_color_sets_7400_binary.fbx new file mode 100644 index 0000000..7a9d1c4 Binary files /dev/null and b/modules/ufbx/misc/ufbx_testcases/blender_279_color_sets_7400_binary.fbx differ diff --git a/modules/ufbx/misc/ufbx_testcases/maya_anim_light_6100_ascii.fbx b/modules/ufbx/misc/ufbx_testcases/maya_anim_light_6100_ascii.fbx new file mode 100644 index 0000000..7c973f9 --- /dev/null +++ b/modules/ufbx/misc/ufbx_testcases/maya_anim_light_6100_ascii.fbx @@ -0,0 +1,363 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 22 + Hour: 13 + Minute: 20 + Second: 20 + Millisecond: 453 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 3 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pointLight1", "Light" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "Color", "Color", "A+N",0.148112133145332,0.0950400084257126,0.439999997615814 + Property: "LightType", "enum", "N",0 + Property: "CastLightOnObject", "bool", "N",1 + Property: "DrawVolumetricLight", "bool", "N",1 + Property: "DrawGroundProjection", "bool", "N",1 + Property: "DrawFrontFacingVolumetricLight", "bool", "N",0 + Property: "Intensity", "Number", "A+N",307.228912353516 + Property: "Fog", "Number", "AN",50 + Property: "DecayType", "enum", "N",0 + Property: "DecayStart", "Number", "AN",0 + Property: "FileName", "KString", "N", "" + Property: "EnableNearAttenuation", "bool", "N",0 + Property: "NearAttenuationStart", "Number", "AN",0 + Property: "NearAttenuationEnd", "Number", "AN",0 + Property: "EnableFarAttenuation", "bool", "N",0 + Property: "FarAttenuationStart", "Number", "AN",0 + Property: "FarAttenuationEnd", "Number", "AN",0 + Property: "CastShadows", "bool", "N",1 + Property: "ShadowColor", "Color", "AN",0,0,0 + Property: "HotSpot", "Number", "AN",0 + Property: "Cone angle", "Number", "AN",45 + } + MultiLayer: 0 + MultiTake: 0 + Shading: Y + Culling: "CullingOff" + TypeFlags: "Light" + GeometryVersion: 124 + NodeAttributeName: "NodeAttribute::pointLight1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_anim_light_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_anim_light_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "201900" + Property: "Original|DateTime_GMT", "DateTime", "", "22/03/2020 11:20:20.452" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_anim_light_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "201900" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "22/03/2020 11:20:20.452" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + Property: "Original|ApplicationNativeFile", "KString", "", "W:\Temp\ufbx_test_source\maya_anim_light.mb" + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",115465395000 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pointLight1", "Model::Scene" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,115465395000 + ReferenceTime: 1924423250,115465395000 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::pointLight1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + Channel: "Color" { + Channel: "X" { + Default: 0.148112133145332 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0.148112133145332,U,s,0,0,n,57732697500,0.00430000014603138,U,s,0,0,n,115465395000 + ,0.44200000166893,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0.0950400084257126 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0.0950400084257126,U,s,0,0,n,57732697500,0.221799999475479,U,s,0,0,n,115465395000 + ,0.118897996842861,U,s,0,0,n + Color: 1,1,1 + } + Channel: "Z" { + Default: 0.439999997615814 + KeyVer: 4005 + KeyCount: 3 + Key: 1924423250,0.439999997615814,U,s,0,0,n,57732697500,0.112999998033047,U,s,0,0,n,115465395000,0.118897996842861 + ,U,s,0,0,n + Color: 1,1,1 + } + } + Channel: "Intensity" { + Default: 307.228912353516 + KeyVer: 4005 + KeyCount: 4 + Key: 1924423250,307.228912353516,U,s,0,0,n,32715195250,120.48193359375,U,s,0,0,n,78901353250,481.927734375 + ,U,s,0,0,n,115465395000,114.457832336426,U,s,0,0,n + Color: 1,1,1 + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 1924423250 + TimeLineStopTime: 115465395000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/misc/ufbx_testcases/maya_auto_clamp_6100_ascii.fbx b/modules/ufbx/misc/ufbx_testcases/maya_auto_clamp_6100_ascii.fbx new file mode 100644 index 0000000..3fde3fd --- /dev/null +++ b/modules/ufbx/misc/ufbx_testcases/maya_auto_clamp_6100_ascii.fbx @@ -0,0 +1,393 @@ +; FBX 6.1.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 6100 + CurrentCameraResolution: { + CameraName: "Producer Perspective" + CameraResolutionMode: "Fixed Resolution" + CameraResolutionW: 960 + CameraResolutionH: 540 + } + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 22 + Hour: 0 + Minute: 0 + Second: 25 + Millisecond: 548 + } + Creator: "FBX SDK/FBX Plugins version 2020.0" +} + +; Document Description +;------------------------------------------------------------------ + +Document: { + Name: "" +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 4 + ObjectType: "Model" { + Count: 1 + } + ObjectType: "Material" { + Count: 1 + } + ObjectType: "SceneInfo" { + Count: 1 + } + ObjectType: "GlobalSettings" { + Count: 1 + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Model: "Model::pCube1", "Mesh" { + Version: 232 + Properties60: { + Property: "QuaternionInterpolate", "enum", "",0 + Property: "RotationOffset", "Vector3D", "",0,0,0 + Property: "RotationPivot", "Vector3D", "",0,0,0 + Property: "ScalingOffset", "Vector3D", "",0,0,0 + Property: "ScalingPivot", "Vector3D", "",0,0,0 + Property: "TranslationActive", "bool", "",0 + Property: "TranslationMin", "Vector3D", "",0,0,0 + Property: "TranslationMax", "Vector3D", "",0,0,0 + Property: "TranslationMinX", "bool", "",0 + Property: "TranslationMinY", "bool", "",0 + Property: "TranslationMinZ", "bool", "",0 + Property: "TranslationMaxX", "bool", "",0 + Property: "TranslationMaxY", "bool", "",0 + Property: "TranslationMaxZ", "bool", "",0 + Property: "RotationOrder", "enum", "",0 + Property: "RotationSpaceForLimitOnly", "bool", "",0 + Property: "RotationStiffnessX", "double", "",0 + Property: "RotationStiffnessY", "double", "",0 + Property: "RotationStiffnessZ", "double", "",0 + Property: "AxisLen", "double", "",10 + Property: "PreRotation", "Vector3D", "",0,0,0 + Property: "PostRotation", "Vector3D", "",0,0,0 + Property: "RotationActive", "bool", "",1 + Property: "RotationMin", "Vector3D", "",0,0,0 + Property: "RotationMax", "Vector3D", "",0,0,0 + Property: "RotationMinX", "bool", "",0 + Property: "RotationMinY", "bool", "",0 + Property: "RotationMinZ", "bool", "",0 + Property: "RotationMaxX", "bool", "",0 + Property: "RotationMaxY", "bool", "",0 + Property: "RotationMaxZ", "bool", "",0 + Property: "InheritType", "enum", "",1 + Property: "ScalingActive", "bool", "",0 + Property: "ScalingMin", "Vector3D", "",0,0,0 + Property: "ScalingMax", "Vector3D", "",0,0,0 + Property: "ScalingMinX", "bool", "",0 + Property: "ScalingMinY", "bool", "",0 + Property: "ScalingMinZ", "bool", "",0 + Property: "ScalingMaxX", "bool", "",0 + Property: "ScalingMaxY", "bool", "",0 + Property: "ScalingMaxZ", "bool", "",0 + Property: "GeometricTranslation", "Vector3D", "",0,0,0 + Property: "GeometricRotation", "Vector3D", "",0,0,0 + Property: "GeometricScaling", "Vector3D", "",1,1,1 + Property: "MinDampRangeX", "double", "",0 + Property: "MinDampRangeY", "double", "",0 + Property: "MinDampRangeZ", "double", "",0 + Property: "MaxDampRangeX", "double", "",0 + Property: "MaxDampRangeY", "double", "",0 + Property: "MaxDampRangeZ", "double", "",0 + Property: "MinDampStrengthX", "double", "",0 + Property: "MinDampStrengthY", "double", "",0 + Property: "MinDampStrengthZ", "double", "",0 + Property: "MaxDampStrengthX", "double", "",0 + Property: "MaxDampStrengthY", "double", "",0 + Property: "MaxDampStrengthZ", "double", "",0 + Property: "PreferedAngleX", "double", "",0 + Property: "PreferedAngleY", "double", "",0 + Property: "PreferedAngleZ", "double", "",0 + Property: "LookAtProperty", "object", "" + Property: "UpVectorProperty", "object", "" + Property: "Show", "bool", "",1 + Property: "NegativePercentShapeSupport", "bool", "",1 + Property: "DefaultAttributeIndex", "int", "",0 + Property: "Freeze", "bool", "",0 + Property: "LODBox", "bool", "",0 + Property: "Lcl Translation", "Lcl Translation", "A+",0,0,0 + Property: "Lcl Rotation", "Lcl Rotation", "A+",0,0,0 + Property: "Lcl Scaling", "Lcl Scaling", "A+",1,1,1 + Property: "Visibility", "Visibility", "A",1 + Property: "currentUVSet", "KString", "U", "map1" + Property: "Color", "ColorRGB", "N",0.8,0.8,0.8 + Property: "BBoxMin", "Vector3D", "N",0,0,0 + Property: "BBoxMax", "Vector3D", "N",0,0,0 + Property: "Primary Visibility", "bool", "N",1 + Property: "Casts Shadows", "bool", "N",1 + Property: "Receive Shadows", "bool", "N",1 + } + MultiLayer: 0 + MultiTake: 0 + Shading: T + Culling: "CullingOff" + Vertices: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + PolygonVertexIndex: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + Edges: 0,2,6,10,3,1,7,5,11,9,15,13 + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 101 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0 + ,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875 + ,0.25,0.125,0,0.125,0.25 + UVIndex: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: 0 + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + NodeAttributeName: "Geometry::pCube1_ncl1_1" + } + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties60: { + Property: "DocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_auto_clamp_6100_ascii.fbx" + Property: "SrcDocumentUrl", "KString", "", "D:\Dev\ufbx\data\maya_auto_clamp_6100_ascii.fbx" + Property: "Original", "Compound", "" + Property: "Original|ApplicationVendor", "KString", "", "Autodesk" + Property: "Original|ApplicationName", "KString", "", "Maya" + Property: "Original|ApplicationVersion", "KString", "", "202000" + Property: "Original|DateTime_GMT", "DateTime", "", "21/03/2020 22:00:25.546" + Property: "Original|FileName", "KString", "", "D:\Dev\ufbx\data\maya_auto_clamp_6100_ascii.fbx" + Property: "LastSaved", "Compound", "" + Property: "LastSaved|ApplicationVendor", "KString", "", "Autodesk" + Property: "LastSaved|ApplicationName", "KString", "", "Maya" + Property: "LastSaved|ApplicationVersion", "KString", "", "202000" + Property: "LastSaved|DateTime_GMT", "DateTime", "", "21/03/2020 22:00:25.546" + Property: "Original|ApplicationActiveProject", "KString", "", "D:\Dev\ufbx\data" + } + } + Material: "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties60: { + Property: "ShadingModel", "KString", "", "Lambert" + Property: "MultiLayer", "bool", "",0 + Property: "EmissiveColor", "Color", "A",0,0,0 + Property: "EmissiveFactor", "Number", "A",1 + Property: "AmbientColor", "Color", "A",0,0,0 + Property: "AmbientFactor", "Number", "A",1 + Property: "DiffuseColor", "Color", "A",0.5,0.5,0.5 + Property: "DiffuseFactor", "Number", "A",0.800000011920929 + Property: "Bump", "Vector3D", "",0,0,0 + Property: "NormalMap", "Vector3D", "",0,0,0 + Property: "BumpFactor", "double", "",1 + Property: "TransparentColor", "Color", "A",0,0,0 + Property: "TransparencyFactor", "Number", "A",1 + Property: "DisplacementColor", "ColorRGB", "",0,0,0 + Property: "DisplacementFactor", "double", "",1 + Property: "VectorDisplacementColor", "ColorRGB", "",0,0,0 + Property: "VectorDisplacementFactor", "double", "",1 + Property: "Emissive", "Vector3D", "",0,0,0 + Property: "Ambient", "Vector3D", "",0,0,0 + Property: "Diffuse", "Vector3D", "",0.400000005960464,0.400000005960464,0.400000005960464 + Property: "Opacity", "double", "",1 + } + } + GlobalSettings: { + Version: 1000 + Properties60: { + Property: "UpAxis", "int", "",1 + Property: "UpAxisSign", "int", "",1 + Property: "FrontAxis", "int", "",2 + Property: "FrontAxisSign", "int", "",1 + Property: "CoordAxis", "int", "",0 + Property: "CoordAxisSign", "int", "",1 + Property: "OriginalUpAxis", "int", "",1 + Property: "OriginalUpAxisSign", "int", "",1 + Property: "UnitScaleFactor", "double", "",1 + Property: "OriginalUnitScaleFactor", "double", "",1 + Property: "AmbientColor", "ColorRGB", "",0,0,0 + Property: "DefaultCamera", "KString", "", "Producer Perspective" + Property: "TimeMode", "enum", "",11 + Property: "TimeProtocol", "enum", "",2 + Property: "SnapOnFrameMode", "enum", "",0 + Property: "TimeSpanStart", "KTime", "",1924423250 + Property: "TimeSpanStop", "KTime", "",57732697500 + Property: "CustomFrameRate", "double", "",-1 + } + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + Connect: "OO", "Model::pCube1", "Model::Scene" + Connect: "OO", "Material::lambert1", "Model::pCube1" +} +;Takes and animation section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,57732697500 + ReferenceTime: 1924423250,57732697500 + + ;Models animation + ;---------------------------------------------------- + Model: "Model::pCube1" { + Version: 1.1 + Channel: "Transform" { + Channel: "T" { + Channel: "X" { + Default: 0 + KeyVer: 4005 + KeyCount: 4 + Key: 1924423250,0,U,s,6.86190509796143,5.37557697296143,a,0.722972273826599,0.333333343267441 + ,21168655750,0.746607899665833,U,s,5.37557697296143,3.9690523147583,a,0.333333343267441 + ,0.333333343267441,38488465000,9.44874286651611,U,s,3.9690523147583,-6.61502313613892 + ,a,0.333333343267441,0.773677349090576,57732697500,10,U,s,-6.61502504348755,0,n + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 1 + } + Channel: "R" { + Channel: "X" { + Default: 0 + Color: 1,1,1 + } + Channel: "Y" { + Default: 0 + Color: 1,1,1 + } + Channel: "Z" { + Default: 0 + Color: 1,1,1 + } + LayerType: 2 + } + Channel: "S" { + Channel: "X" { + Default: 1 + Color: 1,1,1 + } + Channel: "Y" { + Default: 1 + Color: 1,1,1 + } + Channel: "Z" { + Default: 1 + Color: 1,1,1 + } + LayerType: 3 + } + } + } + + ;Generic nodes animation + ;---------------------------------------------------- + + ;Textures animation + ;---------------------------------------------------- + + ;Materials animation + ;---------------------------------------------------- + + + ;Constraints animation + ;---------------------------------------------------- + } +} +;Version 5 settings +;------------------------------------------------------------------ + +Version5: { + AmbientRenderSettings: { + Version: 101 + AmbientLightColor: 0,0,0,1 + } + FogOptions: { + FlogEnable: 0 + FogMode: 0 + FogDensity: 0.002 + FogStart: 0.3 + FogEnd: 1000 + FogColor: 1,1,1,1 + } + Settings: { + FrameRate: "24" + TimeFormat: 1 + SnapOnFrames: 0 + ReferenceTimeIndex: -1 + TimeLineStartTime: 5880000 + TimeLineStopTime: 176400000 + } + RendererSetting: { + DefaultCamera: "Producer Perspective" + DefaultViewingMode: 0 + } +} diff --git a/modules/ufbx/misc/ufbx_testcases/maya_auto_clamp_7100_binary.fbx b/modules/ufbx/misc/ufbx_testcases/maya_auto_clamp_7100_binary.fbx new file mode 100644 index 0000000..2e24da1 Binary files /dev/null and b/modules/ufbx/misc/ufbx_testcases/maya_auto_clamp_7100_binary.fbx differ diff --git a/modules/ufbx/misc/ufbx_testcases/maya_cube_6100_binary.fbx b/modules/ufbx/misc/ufbx_testcases/maya_cube_6100_binary.fbx new file mode 100644 index 0000000..685daab Binary files /dev/null and b/modules/ufbx/misc/ufbx_testcases/maya_cube_6100_binary.fbx differ diff --git a/modules/ufbx/misc/ufbx_testcases/maya_cube_7100_binary.fbx b/modules/ufbx/misc/ufbx_testcases/maya_cube_7100_binary.fbx new file mode 100644 index 0000000..b035a6c Binary files /dev/null and b/modules/ufbx/misc/ufbx_testcases/maya_cube_7100_binary.fbx differ diff --git a/modules/ufbx/misc/ufbx_testcases/maya_pivots_7500_ascii.fbx b/modules/ufbx/misc/ufbx_testcases/maya_pivots_7500_ascii.fbx new file mode 100644 index 0000000..4432e2c --- /dev/null +++ b/modules/ufbx/misc/ufbx_testcases/maya_pivots_7500_ascii.fbx @@ -0,0 +1,429 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2020 + Month: 3 + Day: 26 + Hour: 13 + Minute: 36 + Second: 45 + Millisecond: 788 + } + Creator: "FBX SDK/FBX Plugins version 2019.2" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_pivots_7500_ascii.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "D:\Dev\ufbx\data\maya_pivots_7500_ascii.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201900" + P: "Original|DateTime_GMT", "DateTime", "", "", "26/03/2020 11:36:45.786" + P: "Original|FileName", "KString", "", "", "D:\Dev\ufbx\data\maya_pivots_7500_ascii.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201900" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "26/03/2020 11:36:45.786" + P: "Original|ApplicationActiveProject", "KString", "", "", "D:\Dev\ufbx\data" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",1 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 2459250420992, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 6 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 1 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 1 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 1 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 2459249891472, "Geometry::", "Mesh" { + Vertices: *24 { + a: -0.5,-0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,0.5,0.5,0.5,-0.5,0.5,-0.5,0.5,0.5,-0.5,-0.5,-0.5,-0.5,0.5,-0.5,-0.5 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,2,6,10,3,1,7,5,11,9,15,13 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,-0,1,0,-0,1,0,0,1,-0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 1,-0,-0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0,-0,1,0,-0,1,0,-0,1,0,-0,1 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 2461087530672, "Model::pCube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationPivot", "Vector3D", "Vector", "",1,2,3 + P: "ScalingPivot", "Vector3D", "Vector", "",4,5,6 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-1,-2,-3 + P: "Lcl Rotation", "Lcl Rotation", "", "A",20,30,40 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.3,0.4,0.5 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 2460372910976, "Material::lambert1", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0.5,0.5,0.5 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.400000005960464,0.400000005960464,0.400000005960464 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 2461089285728, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 2460354443744, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::pCube1, Model::RootNode + C: "OO",2461087530672,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",2460354443744,2461089285728 + + ;Geometry::, Model::pCube1 + C: "OO",2459249891472,2461087530672 + + ;Material::lambert1, Model::pCube1 + C: "OO",2460372910976,2461087530672 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/modules/ufbx/misc/ufbxi.natvis b/modules/ufbx/misc/ufbxi.natvis new file mode 100644 index 0000000..322cf1f --- /dev/null +++ b/modules/ufbx/misc/ufbxi.natvis @@ -0,0 +1,118 @@ + + + + + + {{ name={name,s} }} + + + + name,s + + + {{ num_values = 0 }} + {{ num_values = 1 }} + {{ num_values = 2 }} + {{ num_values = 3 }} + {{ num_values = 4 }} + {{ num_values = 5 }} + {{ num_values = 6 }} + {{ num_values = 7 }} + + + + + + + (int64_t)vals[ix].f + vals[ix].f + vals[ix].s + mask = mask >> 2 + ix = ix + 1 + + + + + + array + + + {{ num_children={num_children} }} + + + num_children + children + + + + + + + + + {{ size={size} }} + + + + size + (bool*)data + + + + size + (int32_t*)data + + + + size + (int64_t*)data + + + + size + (float*)data + + + + size + (double*)data + + + + + + + + <{name.data,sb}> + {text.data,s} + (XML root) + + + + name,s + text,s + + + {{ count={num_attribs} }} + + + num_attribs + attribs + + + + + + {{ count={num_children} }} + + + num_children + children + + + + + + + + diff --git a/modules/ufbx/misc/unicode_test_gen.py b/modules/ufbx/misc/unicode_test_gen.py new file mode 100644 index 0000000..0040265 --- /dev/null +++ b/modules/ufbx/misc/unicode_test_gen.py @@ -0,0 +1,169 @@ +import math +import random +import argparse +import transmute_fbx as tfbx + +Node = tfbx.Node +Value = tfbx.Value + +def max_codepoint(width): + if width == 0: + return -1 + elif width == 1: + return 0x7f + elif width == 2: + return 0x7ff + elif width == 3: + return 0xffff + elif width == 4: + return 0x10_ffff + else: + raise ValueError(f"Unsupported width: {width}") + +def codepoint_to_utf8(codepoint, width, *, allow_overflow=False): + """Unrestricted codepoint to UTF-8""" + + if not allow_overflow: + assert codepoint <= max_codepoint(width) + + c = codepoint + if width == 1: + return bytes([c]) + elif width == 2: + return bytes([ + 0b1100_0000 | ((c >> 6) & 0b0001_1111), + 0b1000_0000 | ((c >> 0) & 0b0011_1111), + ]) + elif width == 3: + return bytes([ + 0b1110_0000 | ((c >> 12) & 0b0000_1111), + 0b1000_0000 | ((c >> 6) & 0b0011_1111), + 0b1000_0000 | ((c >> 0) & 0b0011_1111), + ]) + elif width == 4: + return bytes([ + 0b1111_0000 | ((c >> 18) & 0b0000_0111), + 0b1000_0000 | ((c >> 12) & 0b0011_1111), + 0b1000_0000 | ((c >> 6) & 0b0011_1111), + 0b1000_0000 | ((c >> 0) & 0b0011_1111), + ]) + else: + raise ValueError(f"Unsupported width: {width}") + +def int_to_bytes(value): + num_bytes = int(math.ceil(math.log2(value + 1) / 8)) + return value.to_bytes(num_bytes, "big", signed=False) + +def valid_utf8(utf8): + try: + utf8.decode("utf-8") + return True + except UnicodeDecodeError: + return False + +fuzz_encodings = { + b"", + b"\x00", + b"\xff", + b"\xff\xff", + b"\xff\xff\xff", + b"\xff\xff\xff\xff", + b"Hello world", + b"Hello\xffworld", +} + +for width in range(1, 4+1): + for codepoint in range(max_codepoint(width) - 1): + prev = codepoint_to_utf8(codepoint, width) + next = codepoint_to_utf8(codepoint + 1, width) + if valid_utf8(prev) != valid_utf8(next): + fuzz_encodings.add(prev) + fuzz_encodings.add(next) + +for width in range(1, 4+1): + fuzz_encodings.add(codepoint_to_utf8(max_codepoint(width - 1) + 1, width)) + fuzz_encodings.add(codepoint_to_utf8(max_codepoint(width), width)) + +for width in range(1, 4+1): + for n in range(0x10ffff): + codepoint = (n*n)//7 + n + if codepoint > max_codepoint(width): + break + fuzz_encodings.add(codepoint_to_utf8(codepoint, width)) + +for n in range(0x400): + fuzz_encodings.add(int_to_bytes(n)) + +for n in range(0, 0x1_00_00, 64): + fuzz_encodings.add(int_to_bytes(n)) + +fuzz_encodings.add(codepoint_to_utf8(max_codepoint(4) + 1, 4, allow_overflow=True)) +for n in range(32): + codepoint = 0x10FFFF + n**4 + assert codepoint <= 0x1FFFFF + fuzz_encodings.add(codepoint_to_utf8(codepoint, 4, allow_overflow=True)) +fuzz_encodings.add(codepoint_to_utf8(0x1FFFFF, 4, allow_overflow=True)) + +random.seed(1) +for n in range(200): + for k in range(1, 4+1): + fuzz_encodings.add(bytes(random.choices(range(256), k=k))) + +good = [] +bad = [] +for enc in sorted(fuzz_encodings, key=lambda e: (len(e), e)): + if valid_utf8(enc): + good.append(enc) + else: + bad.append(enc) + +def fmt_fbx_props(encodings, ascii): + for enc in encodings: + hex = b"".join(f"{x:02x}".encode("ascii") for x in enc) + if ascii: + string = enc.replace(b"\"", b""") + else: + string = enc + yield Node(b"P", [Value(b"S", hex), Value(b"S", b""), Value(b"S", b""), Value(b"S", b""), Value(b"S", string)], []) + +def fmt_fbx_model_name(name, ascii): + if ascii: + return Value(b"S", f"Model::{name}".encode("utf-8")) + else: + return Value(b"S", f"{name}\x00\x01Model".encode("utf-8")) + +def fmt_fbx_root(ascii): + fbx_root = Node(b"", [], []) + + fbx_objects = Node(b"Objects", [], []) + fbx_root.children.append(fbx_objects) + + fbx_good = Node(b"Model", [Value(b"L", 1), fmt_fbx_model_name("Good", ascii), Value(b"S", b"Mesh")], []) + fbx_objects.children.append(fbx_good) + + fbx_good_props = Node(b"Properties70", [], list(fmt_fbx_props(good, ascii))) + fbx_good.children.append(fbx_good_props) + + fbx_bad = Node(b"Model", [Value(b"L", 2), fmt_fbx_model_name("Bad", ascii), Value(b"S", b"Mesh")], []) + fbx_objects.children.append(fbx_bad) + + fbx_bad_props = Node(b"Properties70", [], list(fmt_fbx_props(bad, ascii))) + fbx_bad.children.append(fbx_bad_props) + + ok = [b"\xff" + enc for enc in good] + + fbx_ok = Node(b"Model", [Value(b"L", 3), fmt_fbx_model_name("Ok", ascii), Value(b"S", b"Mesh")], []) + fbx_objects.children.append(fbx_ok) + + fbx_ok_props = Node(b"Properties70", [], list(fmt_fbx_props(ok, ascii))) + fbx_ok.children.append(fbx_ok_props) + + return fbx_root + +parser = argparse.ArgumentParser("unicode_test_gen.py") +parser.add_argument("outfile", help="Output filename") +argv = parser.parse_args() + +root = fmt_fbx_root(ascii=False) +with open(argv.outfile, "wb") as f: + tfbx.binary_dump_root(f, root, tfbx.BinaryFormat(7500, False), b"") diff --git a/modules/ufbx/misc/zlib_debug_compressor.py b/modules/ufbx/misc/zlib_debug_compressor.py new file mode 100644 index 0000000..b8d93b6 --- /dev/null +++ b/modules/ufbx/misc/zlib_debug_compressor.py @@ -0,0 +1,553 @@ +from collections import namedtuple, defaultdict +import itertools + +class Options: + def __init__(self, **kwargs): + self.override_litlen_counts = kwargs.get("override_litlen_counts", { }) + self.override_dist_counts = kwargs.get("override_dist_counts", { }) + self.max_uncompressed_length = kwargs.get("max_uncompressed_length", 0xffff) + self.prune_interval = kwargs.get("prune_interval", 65536) + self.max_match_distance = kwargs.get("max_match_distance", 32768) + self.search_budget = kwargs.get("search_budget", 4096) + self.force_block_types = kwargs.get("force_block_types", []) + self.block_size = kwargs.get("block_size", 32768) + self.invalid_sym = kwargs.get("invalid_sym", None) + self.no_decode = kwargs.get("no_decode", False) + +Code = namedtuple("Code", "code bits") +IntCoding = namedtuple("IntCoding", "symbol base bits") +BinDesc = namedtuple("BinDesc", "offset value bits desc") +SymExtra = namedtuple("Code", "symbol extra bits") + +null_code = Code(0,0) + +def make_int_coding(first_symbol, first_value, bit_sizes): + symbol = first_symbol + value = first_value + codings = [] + for bits in bit_sizes: + codings.append(IntCoding(symbol, value, bits)) + value += 1 << bits + symbol += 1 + return codings + +length_coding = make_int_coding(257, 3, [ + 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5, +]) + +distance_coding = make_int_coding(0, 1, [ + 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13, +]) + +def find_int_coding(codes, value): + for coding in codes: + if value < coding.base + (1 << coding.bits): + return coding + +class BitBuf: + def __init__(self): + self.pos = 0 + self.data = 0 + self.desc = [] + + def push(self, val, bits, desc=""): + if bits == 0: return + assert val < 1 << bits + val = int(val) + self.desc.append(BinDesc(self.pos, val, bits, desc)) + self.data |= val << self.pos + self.pos += bits + + def push_rev(self, val, bits, desc=""): + if bits == 0: return + assert val < 1 << bits + rev = 0 + for n in range(bits): + rev |= ((val >> n) & 1) << bits-n-1 + self.push(rev, bits, desc) + + def push_code(self, code, desc=""): + self.push(code.code, code.bits, desc) + def push_rev_code(self, code, desc=""): + if code is None: + raise RuntimeError("Empty code") + self.push_rev(code.code, code.bits, desc) + + def append(self, buf): + for desc in buf.desc: + self.desc.append(desc._replace(offset = desc.offset + self.pos)) + self.data |= buf.data << self.pos + self.pos += buf.pos + + def patch(self, offset, value, bits, desc=""): + self.data = self.data & ~(((1 << bits) - 1) << offset) | (value << offset) + + def to_bytes(self): + return bytes((self.data>>p&0xff) for p in range(0, self.pos, 8)) + +class Literal: + def __init__(self, data): + self.data = data + self.length = len(data) + + def count_codes(self, litlen_count, dist_count): + for c in self.data: + litlen_count[c] += 1 + + def encode(self, buf, litlen_syms, dist_syms, opts): + for c in self.data: + sym = litlen_syms.get(c, opts.invalid_sym) + if c >= 32 and c <= 128: + buf.push_rev_code(sym, "Literal '{}' (0x{:02x})".format(chr(c), c)) + else: + buf.push_rev_code(sym, "Literal {:3d} (0x{:02x})".format(c, c)) + + def decode(self, result): + result += self.data + + def split(self, pos): + assert pos >= 0 + return Literal(self.data[:pos]), Literal(self.data[pos:]) + + def __repr__(self): + return "Literal({!r})".format(self.data) + +class Match: + def __init__(self, length, distance): + self.length = length + self.distance = distance + if length < 258: + self.lcode = find_int_coding(length_coding, length) + else: + assert length == 258 + self.lcode = IntCoding(285, 0, 0) + self.dcode = find_int_coding(distance_coding, distance) + + def count_codes(self, litlen_count, dist_count): + litlen_count[self.lcode.symbol] += 1 + dist_count[self.dcode.symbol] += 1 + + def encode(self, buf, litlen_syms, dist_syms, opts): + lsym = litlen_syms.get(self.lcode.symbol, opts.invalid_sym) + dsym = dist_syms.get(self.dcode.symbol, opts.invalid_sym) + buf.push_rev_code(lsym, "Length: {}".format(self.length)) + if self.lcode.bits > 0: + buf.push(self.length - self.lcode.base, self.lcode.bits, "Length extra") + buf.push_rev_code(dsym, "Distance: {}".format(self.distance)) + if self.dcode.bits > 0: + buf.push(self.distance - self.dcode.base, self.dcode.bits, "Distance extra") + + def decode(self, result): + begin = len(result) - self.distance + assert begin >= 0 + for n in range(begin, begin + self.length): + result.append(result[n]) + + def split(self, pos): + return self, Literal(b"") + + def __repr__(self): + return "Match({}, {})".format(self.length, self.distance) + +def make_huffman_bits(syms, max_code_length): + if len(syms) == 0: + return { } + if len(syms) == 1: + return { next(iter(syms)): 1 } + + sym_groups = ((prob, (sym,)) for sym,prob in syms.items()) + initial_groups = list(sorted(sym_groups)) + groups = initial_groups + + for n in range(max_code_length-1): + packaged = [(a[0]+b[0], a[1]+b[1]) for a,b in zip(groups[0::2], groups[1::2])] + groups = list(sorted(packaged + initial_groups)) + + sym_bits = { } + for g in groups[:(len(syms) - 1) * 2]: + for sym in g[1]: + sym_bits[sym] = sym_bits.get(sym, 0) + 1 + return sym_bits + +def make_huffman_codes(sym_bits, max_code_length): + if len(sym_bits) == 0: + return { } + + bl_count = [0] * (max_code_length + 1) + next_code = [0] * (max_code_length + 1) + for bits in sym_bits.values(): + bl_count[bits] += 1 + code = 0 + for n in range(1, max_code_length + 1): + code = (code + bl_count[n - 1]) << 1 + next_code[n] = code + + codes = { } + for sym,bits in sorted(sym_bits.items()): + codes[sym] = Code(next_code[bits], bits) + next_code[bits] += 1 + + return codes + +def make_huffman(syms, max_code_length): + sym_bits = make_huffman_bits(syms, max_code_length) + return make_huffman_codes(sym_bits, max_code_length) + +def decode(message): + result = [] + for m in message: + m.decode(result) + return bytes(result) + +def encode_huff_bits(bits): + encoded = [] + for value,copies in itertools.groupby(bits): + num = len(list(copies)) + assert value < 16 + if value == 0: + while num >= 11: + amount = min(num, 138) + encoded.append(SymExtra(18, amount-11, 7)) + num -= amount + while num >= 3: + amount = min(num, 10) + encoded.append(SymExtra(17, amount-3, 3)) + num -= amount + while num >= 1: + encoded.append(SymExtra(0, 0, 0)) + num -= 1 + else: + encoded.append(SymExtra(value, 0, 0)) + num -= 1 + while num >= 3: + amount = min(num, 6) + encoded.append(SymExtra(16, amount-3, 2)) + num -= amount + while num >= 1: + encoded.append(SymExtra(value, 0, 0)) + num -= 1 + return encoded + +def write_encoded_huff_bits(buf, codes, syms, desc): + value = 0 + prev = 0 + for code in codes: + sym = code.symbol + num = 1 + if sym <= 15: + buf.push_rev_code(syms[sym], "{} {} bits: {}".format(desc, value, sym)) + prev = sym + elif sym == 16: + num = code.extra + 3 + buf.push_rev_code(syms[sym], "{} {}-{} bits: {}".format(desc, value, value+num-1, prev)) + elif sym == 17: + num = code.extra + 3 + buf.push_rev_code(syms[sym], "{} {}-{} bits: {}".format(desc, value, value+num-1, 0)) + elif sym == 18: + num = code.extra + 11 + buf.push_rev_code(syms[sym], "{} {}-{} bits: {}".format(desc, value, value+num-1, 0)) + value += num + if code.bits > 0: + buf.push(code.extra, code.bits, "{} N={}".format(desc, num)) + +def prune_matches(matches, offset, opts): + new_matches = defaultdict(list) + begin = offset - opts.max_match_distance + for trigraph,chain in matches.items(): + new_chain = [o for o in chain if o >= begin] + if new_chain: + new_matches[trigraph] = new_chain + return new_matches + +def match_block(data, opts=Options()): + message = [] + matches = defaultdict(list) + literal = [] + offset = 0 + size = len(data) + prune_interval = 0 + while offset + 3 <= size: + trigraph = data[offset:offset+3] + advance = 1 + match_begin, match_length = 0, 0 + search_steps = 0 + + for m in reversed(matches[trigraph]): + length = 3 + while offset + length < size and length < 258: + if data[offset + length] != data[m + length]: break + length += 1 + search_steps += 1 + if length > match_length and m - offset <= 32768: + match_begin, match_length = m, length + if search_steps >= opts.search_budget: + break + + if match_length > 0: + if literal: + message.append(Literal(bytes(literal))) + literal.clear() + message.append(Match(match_length, offset - match_begin)) + advance = match_length + else: + literal.append(data[offset]) + + for n in range(advance): + if offset >= 3: + trigraph = data[offset - 3:offset] + matches[trigraph].append(offset - 3) + offset += 1 + + prune_interval += advance + if prune_interval >= opts.prune_interval: + matches = prune_matches(matches, offset, opts) + prune_interval = 0 + + while offset < size: + literal.append(data[offset]) + offset += 1 + + if literal: + message.append(Literal(bytes(literal))) + + return message + +def compress_block_uncompressed(buf, data, align, final, opts): + size = len(data) + begin = 0 + while begin < size: + amount = min(size - begin, opts.max_uncompressed_length) + end = begin + amount + real_final = final and end == size + buf.push(real_final, 1, "BFINAL Final chunk: {}".format(real_final)) + buf.push(0b00, 2, "BTYPE Chunk type: Uncompressed") + + buf.push(0, -(buf.pos + align) & 7, "Pad to byte") + + buf.push(amount, 16, "LEN: {}".format(amount)) + buf.push(~amount&0xffff, 16, "NLEN: ~{}".format(amount)) + for byte in data[begin:end]: + buf.push(byte, 8, "Byte '{}' ({:02x})".format(chr(byte), byte)) + begin = end + +def compress_block_static(buf, message, final, opts): + litlen_bits = [8]*(144-0) + [9]*(256-144) + [7]*(280-256) + [8]*(288-280) + distance_bits = [5] * 32 + + litlen_syms = make_huffman_codes(dict(enumerate(litlen_bits)), 16) + distance_syms = make_huffman_codes(dict(enumerate(distance_bits)), 16) + + buf.push(final, 1, "BFINAL Final chunk: {}".format(final)) + buf.push(0b01, 2, "BTYPE Chunk type: Static Huffman") + + for m in message: + m.encode(buf, litlen_syms, distance_syms, opts) + + # End-of-block + buf.push_rev_code(litlen_syms.get(256, opts.invalid_sym), "End-of-block") + +def compress_block_dynamic(buf, message, final, opts): + litlen_count = [0] * 286 + distance_count = [0] * 30 + + # There's always one end-of-block + litlen_count[256] = 1 + + for m in message: + m.count_codes(litlen_count, distance_count) + + for sym,count in opts.override_litlen_counts.items(): + litlen_count[sym] = count + for sym,count in opts.override_dist_counts.items(): + distance_count[sym] = count + + litlen_map = { sym: count for sym,count in enumerate(litlen_count) if count > 0 } + distance_map = { sym: count for sym,count in enumerate(distance_count) if count > 0 } + + litlen_syms = make_huffman(litlen_map, 15) + distance_syms = make_huffman(distance_map, 15) + + num_litlens = max(itertools.chain((k for k in litlen_map.keys()), (256,))) + 1 + num_distances = max(itertools.chain((k for k in distance_map.keys()), (0,))) + 1 + + litlen_bits = [litlen_syms.get(s, null_code).bits for s in range(num_litlens)] + distance_bits = [distance_syms.get(s, null_code).bits for s in range(num_distances)] + + litlen_bit_codes = encode_huff_bits(litlen_bits) + distance_bit_codes = encode_huff_bits(distance_bits) + + codelen_count = [0] * 20 + for code in itertools.chain(litlen_bit_codes, distance_bit_codes): + codelen_count[code.symbol] += 1 + + codelen_map = { sym: count for sym,count in enumerate(codelen_count) if count > 0 } + codelen_syms = make_huffman(codelen_map, 8) + + codelen_permutation = [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15] + + num_codelens = 0 + for i, p in enumerate(codelen_permutation): + if codelen_count[p] > 0: + num_codelens = i + 1 + num_codelens = max(num_codelens, 4) + + buf.push(final, 1, "BFINAL Final chunk: {}".format(final)) + buf.push(0b10, 2, "BTYPE Chunk type: Dynamic Huffman") + + buf.push(num_litlens - 257, 5, "HLIT Number of Litlen codes: {} (257 + {})".format(num_litlens, num_litlens - 257)) + buf.push(num_distances - 1, 5, "HDIST Number of Distance codes: {} (1 + {})".format(num_distances, num_distances - 1)) + buf.push(num_codelens - 4, 4, "HCLEN Number of Codelen codes: {} (4 + {})".format(num_codelens, num_codelens - 4)) + + for p in codelen_permutation[:num_codelens]: + bits = 0 + if p in codelen_syms: + bits = codelen_syms[p].bits + buf.push(bits, 3, "Codelen {} bits: {}".format(p, bits)) + + write_encoded_huff_bits(buf, litlen_bit_codes, codelen_syms, "Litlen") + write_encoded_huff_bits(buf, distance_bit_codes, codelen_syms, "Distance") + + for m in message: + m.encode(buf, litlen_syms, distance_syms, opts) + + # End-of-block + buf.push_rev_code(litlen_syms.get(256, opts.invalid_sym), "End-of-block") + +def adler32(data): + a, b = 1, 0 + for d in data: + a = (a + d) % 65521 + b = (b + a) % 65521 + return b << 16 | a + +def compress_message(message, opts=Options(), *args): + buf = BitBuf() + + # ZLIB CFM byte + buf.push(8, 4, "CM=8 Compression method: DEFLATE") + buf.push(7, 4, "CINFO=7 Compression info: 32kB window size") + + # ZLIB FLG byte + buf.push(28, 5, "FCHECK (CMF*256+FLG) % 31 == 0") + buf.push(0, 1, "FDICT=0 Preset dictionary: No") + buf.push(2, 2, "FLEVEL=2 Compression level: Default") + + multi_part = False + multi_messages = [] + multi_opts = [] + if args: + multi_part = True + multi_messages = [message] + multi_opts = [opts] + args_it = iter(args) + message = message[:] + for msg, opt in zip(args_it, args_it): + message += msg + multi_messages.append(msg) + multi_opts.append(opt) + + byte_offset = 0 + part_pos = 0 + num_parts = len(message) + overflow_part = Literal(b"") + block_message = [] + block_opts = opts + + message_bytes = b"" if opts.no_decode else decode(message) + + last_part = False + multi_index = 0 + while not last_part: + if multi_part: + block_message = multi_messages[multi_index] + block_opts = multi_opts[multi_index] + size = sum(m.length for m in block_message) + block_index = 0 + + multi_index += 1 + last_part = multi_index == len(multi_messages) + else: + block_message.clear() + + part, overflow_part = overflow_part.split(opts.block_size) + if part.length > 0: + block_message.append(part) + size = part.length + + # Append parts until desired block size is reached + if size < opts.block_size: + while part_pos < num_parts: + part = message[part_pos] + part_pos += 1 + if size + part.length >= opts.block_size: + last_part, overflow_part = part.split(opts.block_size - size) + if last_part.length > 0: + block_message.append(last_part) + size += last_part.length + break + else: + block_message.append(part) + size += part.length + + last_part = part_pos >= num_parts and overflow_part.length == 0 + + # Compress the block + best_buf = None + block_index = 0 + for block_type in range(3): + if block_index < len(block_opts.force_block_types): + if block_type != block_opts.force_block_types[block_index]: + continue + + block_buf = BitBuf() + + if block_type == 0: + compress_block_uncompressed(block_buf, message_bytes[byte_offset:byte_offset + size], buf.pos, last_part, block_opts) + elif block_type == 1: + compress_block_static(block_buf, block_message, last_part, block_opts) + elif block_type == 2: + compress_block_dynamic(block_buf, block_message, last_part, block_opts) + + if not best_buf or block_buf.pos < best_buf.pos: + best_buf = block_buf + + buf.append(best_buf) + byte_offset += size + block_index += 1 + + buf.push(0, -buf.pos & 7, "Pad to byte") + + adler_hash = adler32(message_bytes) + + buf.push((adler_hash >> 24) & 0xff, 8, "Adler[24:32]") + buf.push((adler_hash >> 16) & 0xff, 8, "Adler[16:24]") + buf.push((adler_hash >> 8) & 0xff, 8, "Adler[8:16]") + buf.push((adler_hash >> 0) & 0xff, 8, "Adler[0:8]") + + return buf + +def deflate(data, opts=Options()): + message = match_block(data, opts) + encoded = compress_message(message, opts) + return encoded + +def print_huffman(tree): + width = max(len(str(s)) for s in tree.keys()) + for sym,code in tree.items(): + print("".format(sym, width, code.code, code.bits)) + +def print_buf(buf): + for d in buf.desc: + val = " {0:0{1}b}".format(d.value, d.bits) + if len(val) > 10: + val = "0x{0:x}".format(d.value) + desc = d.desc + patched_value = (buf.data >> d.offset) & ((1 << d.bits) - 1) + spacer = "|" + if patched_value != d.value: + desc += " >>> Patched to: {0:0{1}b} ({0})".format(patched_value, d.bits) + spacer = ">" + print("{0:>4} {0:>4x} {5}{1:>2} {5} {2:>10} {5} {3:>4} {5} {4}".format(d.offset, d.bits, val, d.value, desc, spacer)) + +def print_bytes(data): + print(''.join('\\x%02x' % b for b in data)) diff --git a/modules/ufbx/module.jai b/modules/ufbx/module.jai new file mode 100644 index 0000000..f92feb5 --- /dev/null +++ b/modules/ufbx/module.jai @@ -0,0 +1,5196 @@ +// +// This file was auto-generated using the following command: +// +// jai first.jai +// + +#import "Windows"; + +UFBX_CPP :: 0; + +UFBX_PLATFORM_GNUC :: 0; + +UFBX_CPP11 :: 0; + +UFBX_ERROR_STACK_MAX_DEPTH :: 8; +UFBX_PANIC_MESSAGE_LENGTH :: 128; +UFBX_ERROR_INFO_LENGTH :: 256; + +UFBX_NO_INDEX :: cast,trunc(u32)~0; + +// TODO: Support overriding `ufbx_real` with `float` or anything else. +ufbx_real :: float64; + +// Null-terminated UTF-8 encoded string within an FBX file +ufbx_string :: struct { + data: *u8; + length: size_t; +} + +// Opaque byte buffer blob +ufbx_blob :: struct { + data: *void; + size: size_t; +} + +// 2D vector +ufbx_vec2 :: struct { + union { + struct { + x: ufbx_real; + y: ufbx_real; + } + v: [2] ufbx_real; + } +} + +// 3D vector +ufbx_vec3 :: struct { + union { + struct { + x: ufbx_real; + y: ufbx_real; + z: ufbx_real; + } + v: [3] ufbx_real; + } +} + +// 4D vector +ufbx_vec4 :: struct { + union { + struct { + x: ufbx_real; + y: ufbx_real; + z: ufbx_real; + w: ufbx_real; + } + v: [4] ufbx_real; + } +} + +// Quaternion +ufbx_quat :: struct { + union { + struct { + x: ufbx_real; + y: ufbx_real; + z: ufbx_real; + w: ufbx_real; + } + v: [4] ufbx_real; + } +} + +// Order in which Euler-angle rotation axes are applied for a transform +// NOTE: The order in the name refers to the order of axes *applied*, +// not the multiplication order: eg. `UFBX_ROTATION_XYZ` is `Z*Y*X` +// [TODO: Figure out what the spheric rotation order is...] +ufbx_rotation_order :: enum s32 { + XYZ :: 0; + XZY :: 1; + YZX :: 2; + YXZ :: 3; + ZXY :: 4; + ZYX :: 5; + SPHERIC :: 6; + + FORCE_32BIT :: 2147483647; + + UFBX_ROTATION_ORDER_XYZ :: XYZ; + UFBX_ROTATION_ORDER_XZY :: XZY; + UFBX_ROTATION_ORDER_YZX :: YZX; + UFBX_ROTATION_ORDER_YXZ :: YXZ; + UFBX_ROTATION_ORDER_ZXY :: ZXY; + UFBX_ROTATION_ORDER_ZYX :: ZYX; + UFBX_ROTATION_ORDER_SPHERIC :: SPHERIC; + + UFBX_ROTATION_ORDER_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum :: enum s32 { + UFBX_ROTATION_ORDER_COUNT :: 7; +} + +// Explicit translation+rotation+scale transformation. +// NOTE: Rotation is a quaternion, not Euler angles! +ufbx_transform :: struct { + translation: ufbx_vec3; + rotation: ufbx_quat; + scale: ufbx_vec3; +} + +// 4x3 matrix encoding an affine transformation. +// `cols[0..2]` are the X/Y/Z basis vectors, `cols[3]` is the translation +ufbx_matrix :: struct { + union { + struct { + m00: ufbx_real; + m10: ufbx_real; + m20: ufbx_real; + m01: ufbx_real; + m11: ufbx_real; + m21: ufbx_real; + m02: ufbx_real; + m12: ufbx_real; + m22: ufbx_real; + m03: ufbx_real; + m13: ufbx_real; + m23: ufbx_real; + } + + cols: [4] ufbx_vec3; + v: [12] ufbx_real; + } +} + +ufbx_void_list :: struct { + data: *void; + count: size_t; +} + +ufbx_bool_list :: struct { + data: *bool; + count: size_t; +} +ufbx_uint32_list :: struct { + data: *u32; + count: size_t; +} +ufbx_real_list :: struct { + data: *ufbx_real; + count: size_t; +} +ufbx_vec2_list :: struct { + data: *ufbx_vec2; + count: size_t; +} +ufbx_vec3_list :: struct { + data: *ufbx_vec3; + count: size_t; +} +ufbx_vec4_list :: struct { + data: *ufbx_vec4; + count: size_t; +} +ufbx_string_list :: struct { + data: *ufbx_string; + count: size_t; +} + +// -- Document object model +ufbx_dom_value_type :: enum s32 { + NUMBER :: 0; + STRING :: 1; + ARRAY_I8 :: 2; + ARRAY_I32 :: 3; + ARRAY_I64 :: 4; + ARRAY_F32 :: 5; + ARRAY_F64 :: 6; + ARRAY_RAW_STRING :: 7; + ARRAY_IGNORED :: 8; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_DOM_VALUE_NUMBER :: NUMBER; + UFBX_DOM_VALUE_STRING :: STRING; + UFBX_DOM_VALUE_ARRAY_I8 :: ARRAY_I8; + UFBX_DOM_VALUE_ARRAY_I32 :: ARRAY_I32; + UFBX_DOM_VALUE_ARRAY_I64 :: ARRAY_I64; + UFBX_DOM_VALUE_ARRAY_F32 :: ARRAY_F32; + UFBX_DOM_VALUE_ARRAY_F64 :: ARRAY_F64; + UFBX_DOM_VALUE_ARRAY_RAW_STRING :: ARRAY_RAW_STRING; + UFBX_DOM_VALUE_ARRAY_IGNORED :: ARRAY_IGNORED; + + UFBX_DOM_VALUE_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_1 :: enum s32 { + UFBX_DOM_VALUE_TYPE_COUNT :: 9; +} + +ufbx_dom_value :: struct { + type: ufbx_dom_value_type; + value_str: ufbx_string; + value_blob: ufbx_blob; + value_int: s64; + value_float: float64; +} + +ufbx_dom_node_list :: struct { + data: **ufbx_dom_node; + count: size_t; +} +ufbx_dom_value_list :: struct { + data: *ufbx_dom_value; + count: size_t; +} + +ufbx_dom_node :: struct { + name: ufbx_string; + children: ufbx_dom_node_list; + values: ufbx_dom_value_list; +} + +// Data type contained within the property. All the data fields are always +// populated regardless of type, so there's no need to switch by type usually +// eg. `prop->value_real` and `prop->value_int` have the same value (well, close) +// if `prop->type == UFBX_PROP_INTEGER`. String values are not converted from/to. +ufbx_prop_type :: enum s32 { + UNKNOWN :: 0; + BOOLEAN :: 1; + INTEGER :: 2; + NUMBER :: 3; + VECTOR :: 4; + COLOR :: 5; + COLOR_WITH_ALPHA :: 6; + STRING :: 7; + DATE_TIME :: 8; + TRANSLATION :: 9; + ROTATION :: 10; + SCALING :: 11; + DISTANCE :: 12; + COMPOUND :: 13; + BLOB :: 14; + REFERENCE :: 15; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_PROP_UNKNOWN :: UNKNOWN; + UFBX_PROP_BOOLEAN :: BOOLEAN; + UFBX_PROP_INTEGER :: INTEGER; + UFBX_PROP_NUMBER :: NUMBER; + UFBX_PROP_VECTOR :: VECTOR; + UFBX_PROP_COLOR :: COLOR; + UFBX_PROP_COLOR_WITH_ALPHA :: COLOR_WITH_ALPHA; + UFBX_PROP_STRING :: STRING; + UFBX_PROP_DATE_TIME :: DATE_TIME; + UFBX_PROP_TRANSLATION :: TRANSLATION; + UFBX_PROP_ROTATION :: ROTATION; + UFBX_PROP_SCALING :: SCALING; + UFBX_PROP_DISTANCE :: DISTANCE; + UFBX_PROP_COMPOUND :: COMPOUND; + UFBX_PROP_BLOB :: BLOB; + UFBX_PROP_REFERENCE :: REFERENCE; + + UFBX_PROP_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_2 :: enum s32 { + UFBX_PROP_TYPE_COUNT :: 16; +} + +// Property flags: Advanced information about properties, not usually needed. +ufbx_prop_flags :: enum s32 { + FLAG_ANIMATABLE :: 1; + + FLAG_USER_DEFINED :: 2; + + FLAG_HIDDEN :: 4; + + FLAG_LOCK_X :: 16; + FLAG_LOCK_Y :: 32; + FLAG_LOCK_Z :: 64; + FLAG_LOCK_W :: 128; + + FLAG_MUTE_X :: 256; + FLAG_MUTE_Y :: 512; + FLAG_MUTE_Z :: 1024; + FLAG_MUTE_W :: 2048; + + FLAG_SYNTHETIC :: 4096; + + FLAG_ANIMATED :: 8192; + + FLAG_NOT_FOUND :: 16384; + + FLAG_CONNECTED :: 32768; + + FLAG_NO_VALUE :: 65536; + + FLAG_OVERRIDDEN :: 131072; + + FLAG_VALUE_REAL :: 1048576; + FLAG_VALUE_VEC2 :: 2097152; + FLAG_VALUE_VEC3 :: 4194304; + FLAG_VALUE_VEC4 :: 8388608; + FLAG_VALUE_INT :: 16777216; + FLAG_VALUE_STR :: 33554432; + FLAG_VALUE_BLOB :: 67108864; + + FLAGS_FORCE_32BIT :: 2147483647; + + UFBX_PROP_FLAG_ANIMATABLE :: FLAG_ANIMATABLE; + + UFBX_PROP_FLAG_USER_DEFINED :: FLAG_USER_DEFINED; + + UFBX_PROP_FLAG_HIDDEN :: FLAG_HIDDEN; + + UFBX_PROP_FLAG_LOCK_X :: FLAG_LOCK_X; + UFBX_PROP_FLAG_LOCK_Y :: FLAG_LOCK_Y; + UFBX_PROP_FLAG_LOCK_Z :: FLAG_LOCK_Z; + UFBX_PROP_FLAG_LOCK_W :: FLAG_LOCK_W; + + UFBX_PROP_FLAG_MUTE_X :: FLAG_MUTE_X; + UFBX_PROP_FLAG_MUTE_Y :: FLAG_MUTE_Y; + UFBX_PROP_FLAG_MUTE_Z :: FLAG_MUTE_Z; + UFBX_PROP_FLAG_MUTE_W :: FLAG_MUTE_W; + + UFBX_PROP_FLAG_SYNTHETIC :: FLAG_SYNTHETIC; + + UFBX_PROP_FLAG_ANIMATED :: FLAG_ANIMATED; + + UFBX_PROP_FLAG_NOT_FOUND :: FLAG_NOT_FOUND; + + UFBX_PROP_FLAG_CONNECTED :: FLAG_CONNECTED; + + UFBX_PROP_FLAG_NO_VALUE :: FLAG_NO_VALUE; + + UFBX_PROP_FLAG_OVERRIDDEN :: FLAG_OVERRIDDEN; + + UFBX_PROP_FLAG_VALUE_REAL :: FLAG_VALUE_REAL; + UFBX_PROP_FLAG_VALUE_VEC2 :: FLAG_VALUE_VEC2; + UFBX_PROP_FLAG_VALUE_VEC3 :: FLAG_VALUE_VEC3; + UFBX_PROP_FLAG_VALUE_VEC4 :: FLAG_VALUE_VEC4; + UFBX_PROP_FLAG_VALUE_INT :: FLAG_VALUE_INT; + UFBX_PROP_FLAG_VALUE_STR :: FLAG_VALUE_STR; + UFBX_PROP_FLAG_VALUE_BLOB :: FLAG_VALUE_BLOB; + + UFBX_PROP_FLAGS_FORCE_32BIT :: FLAGS_FORCE_32BIT; +} + +// Single property with name/type/value. +ufbx_prop :: struct { + name: ufbx_string; + _internal_key: u32; + type: ufbx_prop_type; + flags: ufbx_prop_flags; + + value_str: ufbx_string; + value_blob: ufbx_blob; + value_int: s64; + union { + value_real_arr: [4] ufbx_real; + value_real: ufbx_real; + value_vec2: ufbx_vec2; + value_vec3: ufbx_vec3; + value_vec4: ufbx_vec4; + } +} + +ufbx_prop_list :: struct { + data: *ufbx_prop; + count: size_t; +} + +// List of alphabetically sorted properties with potential defaults. +// For animated objects in as scene from `ufbx_evaluate_scene()` this list +// only has the animated properties, the originals are stored under `defaults`. +ufbx_props :: struct { + props: ufbx_prop_list; + num_animated: size_t; + + defaults: *ufbx_props; +} + +ufbx_element_list :: struct { + data: **ufbx_element; + count: size_t; +} +ufbx_unknown_list :: struct { + data: **ufbx_unknown; + count: size_t; +} +ufbx_node_list :: struct { + data: **ufbx_node; + count: size_t; +} +ufbx_mesh_list :: struct { + data: **ufbx_mesh; + count: size_t; +} +ufbx_light_list :: struct { + data: **ufbx_light; + count: size_t; +} +ufbx_camera_list :: struct { + data: **ufbx_camera; + count: size_t; +} +ufbx_bone_list :: struct { + data: **ufbx_bone; + count: size_t; +} +ufbx_empty_list :: struct { + data: **ufbx_empty; + count: size_t; +} +ufbx_line_curve_list :: struct { + data: **ufbx_line_curve; + count: size_t; +} +ufbx_nurbs_curve_list :: struct { + data: **ufbx_nurbs_curve; + count: size_t; +} +ufbx_nurbs_surface_list :: struct { + data: **ufbx_nurbs_surface; + count: size_t; +} +ufbx_nurbs_trim_surface_list :: struct { + data: **ufbx_nurbs_trim_surface; + count: size_t; +} +ufbx_nurbs_trim_boundary_list :: struct { + data: **ufbx_nurbs_trim_boundary; + count: size_t; +} +ufbx_procedural_geometry_list :: struct { + data: **ufbx_procedural_geometry; + count: size_t; +} +ufbx_stereo_camera_list :: struct { + data: **ufbx_stereo_camera; + count: size_t; +} +ufbx_camera_switcher_list :: struct { + data: **ufbx_camera_switcher; + count: size_t; +} +ufbx_marker_list :: struct { + data: **ufbx_marker; + count: size_t; +} +ufbx_lod_group_list :: struct { + data: **ufbx_lod_group; + count: size_t; +} +ufbx_skin_deformer_list :: struct { + data: **ufbx_skin_deformer; + count: size_t; +} +ufbx_skin_cluster_list :: struct { + data: **ufbx_skin_cluster; + count: size_t; +} +ufbx_blend_deformer_list :: struct { + data: **ufbx_blend_deformer; + count: size_t; +} +ufbx_blend_channel_list :: struct { + data: **ufbx_blend_channel; + count: size_t; +} +ufbx_blend_shape_list :: struct { + data: **ufbx_blend_shape; + count: size_t; +} +ufbx_cache_deformer_list :: struct { + data: **ufbx_cache_deformer; + count: size_t; +} +ufbx_cache_file_list :: struct { + data: **ufbx_cache_file; + count: size_t; +} +ufbx_material_list :: struct { + data: **ufbx_material; + count: size_t; +} +ufbx_texture_list :: struct { + data: **ufbx_texture; + count: size_t; +} +ufbx_video_list :: struct { + data: **ufbx_video; + count: size_t; +} +ufbx_shader_list :: struct { + data: **ufbx_shader; + count: size_t; +} +ufbx_shader_binding_list :: struct { + data: **ufbx_shader_binding; + count: size_t; +} +ufbx_anim_stack_list :: struct { + data: **ufbx_anim_stack; + count: size_t; +} +ufbx_anim_layer_list :: struct { + data: **ufbx_anim_layer; + count: size_t; +} +ufbx_anim_value_list :: struct { + data: **ufbx_anim_value; + count: size_t; +} +ufbx_anim_curve_list :: struct { + data: **ufbx_anim_curve; + count: size_t; +} +ufbx_display_layer_list :: struct { + data: **ufbx_display_layer; + count: size_t; +} +ufbx_selection_set_list :: struct { + data: **ufbx_selection_set; + count: size_t; +} +ufbx_selection_node_list :: struct { + data: **ufbx_selection_node; + count: size_t; +} +ufbx_character_list :: struct { + data: **ufbx_character; + count: size_t; +} +ufbx_constraint_list :: struct { + data: **ufbx_constraint; + count: size_t; +} +ufbx_pose_list :: struct { + data: **ufbx_pose; + count: size_t; +} +ufbx_metadata_object_list :: struct { + data: **ufbx_metadata_object; + count: size_t; +} + +ufbx_element_type :: enum s32 { + UNKNOWN :: 0; + NODE :: 1; + MESH :: 2; + LIGHT :: 3; + CAMERA :: 4; + BONE :: 5; + EMPTY :: 6; + LINE_CURVE :: 7; + NURBS_CURVE :: 8; + NURBS_SURFACE :: 9; + NURBS_TRIM_SURFACE :: 10; + NURBS_TRIM_BOUNDARY :: 11; + PROCEDURAL_GEOMETRY :: 12; + STEREO_CAMERA :: 13; + CAMERA_SWITCHER :: 14; + MARKER :: 15; + LOD_GROUP :: 16; + SKIN_DEFORMER :: 17; + SKIN_CLUSTER :: 18; + BLEND_DEFORMER :: 19; + BLEND_CHANNEL :: 20; + BLEND_SHAPE :: 21; + CACHE_DEFORMER :: 22; + CACHE_FILE :: 23; + MATERIAL :: 24; + TEXTURE :: 25; + VIDEO :: 26; + SHADER :: 27; + SHADER_BINDING :: 28; + ANIM_STACK :: 29; + ANIM_LAYER :: 30; + ANIM_VALUE :: 31; + ANIM_CURVE :: 32; + DISPLAY_LAYER :: 33; + SELECTION_SET :: 34; + SELECTION_NODE :: 35; + CHARACTER :: 36; + CONSTRAINT :: 37; + POSE :: 38; + METADATA_OBJECT :: 39; + + TYPE_FIRST_ATTRIB :: 2; + TYPE_LAST_ATTRIB :: 16; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_ELEMENT_UNKNOWN :: UNKNOWN; + UFBX_ELEMENT_NODE :: NODE; + UFBX_ELEMENT_MESH :: MESH; + UFBX_ELEMENT_LIGHT :: LIGHT; + UFBX_ELEMENT_CAMERA :: CAMERA; + UFBX_ELEMENT_BONE :: BONE; + UFBX_ELEMENT_EMPTY :: EMPTY; + UFBX_ELEMENT_LINE_CURVE :: LINE_CURVE; + UFBX_ELEMENT_NURBS_CURVE :: NURBS_CURVE; + UFBX_ELEMENT_NURBS_SURFACE :: NURBS_SURFACE; + UFBX_ELEMENT_NURBS_TRIM_SURFACE :: NURBS_TRIM_SURFACE; + UFBX_ELEMENT_NURBS_TRIM_BOUNDARY :: NURBS_TRIM_BOUNDARY; + UFBX_ELEMENT_PROCEDURAL_GEOMETRY :: PROCEDURAL_GEOMETRY; + UFBX_ELEMENT_STEREO_CAMERA :: STEREO_CAMERA; + UFBX_ELEMENT_CAMERA_SWITCHER :: CAMERA_SWITCHER; + UFBX_ELEMENT_MARKER :: MARKER; + UFBX_ELEMENT_LOD_GROUP :: LOD_GROUP; + UFBX_ELEMENT_SKIN_DEFORMER :: SKIN_DEFORMER; + UFBX_ELEMENT_SKIN_CLUSTER :: SKIN_CLUSTER; + UFBX_ELEMENT_BLEND_DEFORMER :: BLEND_DEFORMER; + UFBX_ELEMENT_BLEND_CHANNEL :: BLEND_CHANNEL; + UFBX_ELEMENT_BLEND_SHAPE :: BLEND_SHAPE; + UFBX_ELEMENT_CACHE_DEFORMER :: CACHE_DEFORMER; + UFBX_ELEMENT_CACHE_FILE :: CACHE_FILE; + UFBX_ELEMENT_MATERIAL :: MATERIAL; + UFBX_ELEMENT_TEXTURE :: TEXTURE; + UFBX_ELEMENT_VIDEO :: VIDEO; + UFBX_ELEMENT_SHADER :: SHADER; + UFBX_ELEMENT_SHADER_BINDING :: SHADER_BINDING; + UFBX_ELEMENT_ANIM_STACK :: ANIM_STACK; + UFBX_ELEMENT_ANIM_LAYER :: ANIM_LAYER; + UFBX_ELEMENT_ANIM_VALUE :: ANIM_VALUE; + UFBX_ELEMENT_ANIM_CURVE :: ANIM_CURVE; + UFBX_ELEMENT_DISPLAY_LAYER :: DISPLAY_LAYER; + UFBX_ELEMENT_SELECTION_SET :: SELECTION_SET; + UFBX_ELEMENT_SELECTION_NODE :: SELECTION_NODE; + UFBX_ELEMENT_CHARACTER :: CHARACTER; + UFBX_ELEMENT_CONSTRAINT :: CONSTRAINT; + UFBX_ELEMENT_POSE :: POSE; + UFBX_ELEMENT_METADATA_OBJECT :: METADATA_OBJECT; + + UFBX_ELEMENT_TYPE_FIRST_ATTRIB :: TYPE_FIRST_ATTRIB; + UFBX_ELEMENT_TYPE_LAST_ATTRIB :: TYPE_LAST_ATTRIB; + + UFBX_ELEMENT_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_3 :: enum s32 { + UFBX_ELEMENT_TYPE_COUNT :: 40; +} + +// Connection between two elements. +// Source and destination are somewhat arbitrary but the destination is +// often the "container" like a parent node or mesh containing a deformer. +ufbx_connection :: struct { + src: *ufbx_element; + dst: *ufbx_element; + src_prop: ufbx_string; + dst_prop: ufbx_string; +} + +ufbx_connection_list :: struct { + data: *ufbx_connection; + count: size_t; +} + +// Element "base-class" common to each element. +// Some fields (like `connections_src`) are advanced and not visible +// in the specialized element structs. +// NOTE: The `element_id` value is consistent when loading the +// _same_ file, but re-exporting the file will invalidate them. (TOMOVE) +ufbx_element :: struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + type: ufbx_element_type; + connections_src: ufbx_connection_list; + connections_dst: ufbx_connection_list; + dom_node: *ufbx_dom_node; + scene: *ufbx_scene; +} + +// -- Unknown +ufbx_unknown :: struct { + // Shared "base-class" header, see `ufbx_element`. + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // FBX format specific type information. + // In ASCII FBX format: + // super_type: ID, "type::name", "sub_type" { ... } + type: ufbx_string; + super_type: ufbx_string; + sub_type: ufbx_string; +} + +// Inherit type specifies how hierarchial node transforms are combined. +// `UFBX_INHERIT_NORMAL` is combined using the "proper" multiplication +// `UFBX_INHERIT_NO_SHEAR` does component-wise { pos+pos, rot*rot, scale*scale } +// `UFBX_INHERIT_NO_SCALE` ignores the parent scale { pos+pos, rot*rot, scale } +ufbx_inherit_type :: enum s32 { + NO_SHEAR :: 0; + NORMAL :: 1; + NO_SCALE :: 2; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_INHERIT_NO_SHEAR :: NO_SHEAR; + UFBX_INHERIT_NORMAL :: NORMAL; + UFBX_INHERIT_NO_SCALE :: NO_SCALE; + + UFBX_INHERIT_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_4 :: enum s32 { + UFBX_INHERIT_TYPE_COUNT :: 3; +} + +// Nodes form the scene transformation hierarchy and can contain attached +// elements such as meshes or lights. In normal cases a single `ufbx_node` +// contains only a single attached element, so using `type/mesh/...` is safe. +ufbx_node :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // Parent node containing this one if not root. + // + // Always non-`NULL` for non-root nodes unless + // `ufbx_load_opts.allow_nodes_out_of_root` is enabled. + parent: *ufbx_node; + + // List of child nodes parented to this node. + children: ufbx_node_list; + + // Attached element type and typed pointers. + // + // Set to `NULL` if not in use, so checking `attrib_type` is not required. + mesh: *ufbx_mesh; + light: *ufbx_light; + camera: *ufbx_camera; + bone: *ufbx_bone; + + // Less common attributes use these fields. + // + // Defined even if it is one of the above, eg. `ufbx_mesh`. In case there + // is multiple attributes this will be the first one. + attrib: *ufbx_element; + + // Geometry transform helper if one exists. + // See `UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES`. + geometry_transform_helper: *ufbx_node; + + // `attrib->type` if `attrib` is defined, otherwise `UFBX_ELEMENT_UNKNOWN`. + attrib_type: ufbx_element_type; + + // List of _all_ attached attribute elements. + // + // In most cases there is only zero or one attributes per node, but if you + // have a very exotic FBX file nodes may have multiple attributes. + all_attribs: ufbx_element_list; + + // Local transform in parent, geometry transform is a non-inherited + // transform applied only to attachments like meshes + inherit_type: ufbx_inherit_type; + local_transform: ufbx_transform #align 4; + geometry_transform: ufbx_transform; + + // Specifies the axis order `euler_rotation` is applied in. + rotation_order: ufbx_rotation_order; + + // Rotation around the local X/Y/Z axes in `rotation_order`. + // The angles are specified in degrees. + euler_rotation: ufbx_vec3 #align 4; + + // Transform to the global "world" space, may be incorrect if the node + // uses `UFBX_INHERIT_NORMAL`, prefer using the `node_to_world` matrix. + world_transform: ufbx_transform; + + // Transform from this node to `parent` space. + // Equivalent to `ufbx_transform_to_matrix(&local_transform)`. + node_to_parent: ufbx_matrix; + + // Transform from this node to the world space, ie. multiplying all the + // `node_to_parent` matrices of the parent chain together. + // NOTE: Not the same as `ufbx_transform_to_matrix(&world_transform)` + // as this matrix will account for potential shear (if `inherit_type == UFBX_INHERIT_NORMAL`). + node_to_world: ufbx_matrix; + + // Transform from the attribute to this node. Does not affect the transforms + // of `children`! + // Equivalent to `ufbx_transform_to_matrix(&geometry_transform)`. + geometry_to_node: ufbx_matrix; + + // Transform from attribute space to world space. + // Equivalent to `ufbx_matrix_mul(&node_to_world, &geometry_to_node)`. + geometry_to_world: ufbx_matrix; + + adjust_pre_rotation: ufbx_quat; // < Rotation applied between parent and self + adjust_pre_scale: ufbx_vec3; // < Scaling applied between parent and self + adjust_post_rotation: ufbx_quat; // < Rotation applied in local space at the end + + // Materials used by `mesh` or other `attrib`. + // There may be multiple copies of a single `ufbx_mesh` with different materials + // in the `ufbx_node` instances. + materials: ufbx_material_list; + + // Visibility state. + visible: bool; + + // True if this node is the implicit root node of the scene. + is_root: bool; + + // True if the node has a non-identity `geometry_transform`. + has_geometry_transform: bool; + + // If `true` the transform is adjusted by ufbx, not enabled by default. + // See `adjust_pre_rotation`, `adjust_pre_scale`, `adjust_post_rotation`. + has_adjust_transform: bool; + + // True if this node is node is a synthetic geometry transform helper. + // See `UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES`. + is_geometry_transform_helper: bool; + + // How deep is this node in the parent hierarchy. Root node is at depth `0` + // and the immediate children of root at `1`. + node_depth: u32; +} + +// Vertex attribute: All attributes are stored in a consistent indexed format +// regardless of how it's actually stored in the file. +// +// `values` is a contiguous array of attribute values. +// `indices` maps each mesh index into a value in the `values` array. +// +// If `unique_per_vertex` is set then the attribute is guaranteed to have a +// single defined value per vertex accessible via: +// attrib.values.data[attrib.indices.data[mesh->vertex_first_index[vertex_ix]] +ufbx_vertex_attrib :: struct { + exists: bool; + values: ufbx_void_list; + indices: ufbx_uint32_list; + value_reals: size_t; + unique_per_vertex: bool; +} + +// 1D vertex attribute, see `ufbx_vertex_attrib` for information +ufbx_vertex_real :: struct { + exists: bool; + values: ufbx_real_list; + indices: ufbx_uint32_list; + value_reals: size_t; + unique_per_vertex: bool; +} + +// 2D vertex attribute, see `ufbx_vertex_attrib` for information +ufbx_vertex_vec2 :: struct { + exists: bool; + values: ufbx_vec2_list; + indices: ufbx_uint32_list; + value_reals: size_t; + unique_per_vertex: bool; +} + +// 3D vertex attribute, see `ufbx_vertex_attrib` for information +ufbx_vertex_vec3 :: struct { + exists: bool; + values: ufbx_vec3_list; + indices: ufbx_uint32_list; + value_reals: size_t; + unique_per_vertex: bool; +} + +// 4D vertex attribute, see `ufbx_vertex_attrib` for information +ufbx_vertex_vec4 :: struct { + exists: bool; + values: ufbx_vec4_list; + indices: ufbx_uint32_list; + value_reals: size_t; + unique_per_vertex: bool; +} + +// Vertex UV set/layer +ufbx_uv_set :: struct { + name: ufbx_string; + index: u32; + + vertex_uv: ufbx_vertex_vec2; // < UV / texture coordinates + vertex_tangent: ufbx_vertex_vec3; // < (optional) Tangent vector in UV.x direction + vertex_bitangent: ufbx_vertex_vec3; // < (optional) Tangent vector in UV.y direction +} + +// Vertex color set/layer +ufbx_color_set :: struct { + name: ufbx_string; + index: u32; + + vertex_color: ufbx_vertex_vec4; // < Per-vertex RGBA color +} + +ufbx_uv_set_list :: struct { + data: *ufbx_uv_set; + count: size_t; +} +ufbx_color_set_list :: struct { + data: *ufbx_color_set; + count: size_t; +} + +// Edge between two _indices_ in a mesh +ufbx_edge :: struct { + union { + struct { + a: u32; + b: u32; + } + indices: [2] u32; + } +} + +ufbx_edge_list :: struct { + data: *ufbx_edge; + count: size_t; +} + +// Polygonal face with arbitrary number vertices, a single face contains a +// contiguous range of mesh indices, eg. `{5,3}` would have indices 5, 6, 7 +// +// NOTE: `num_indices` maybe less than 3 in which case the face is invalid! +// [TODO #23: should probably remove the bad faces at load time] +ufbx_face :: struct { + index_begin: u32; + num_indices: u32; +} + +ufbx_face_list :: struct { + data: *ufbx_face; + count: size_t; +} + +ufbx_mesh_material :: struct { + material: *ufbx_material; + + num_faces: size_t; // < Number of faces (polygons) using this material + num_triangles: size_t; // < Number of triangles using this material if triangulated + + num_empty_faces: size_t; // < Number of faces with zero vertices + num_point_faces: size_t; // < Number of faces with a single vertex + num_line_faces: size_t; // < Number of faces with two vertices + + // Indices to `ufbx_mesh.faces[]` that use this material. + // Always contains `num_faces` elements. + face_indices: ufbx_uint32_list; +} + +ufbx_mesh_material_list :: struct { + data: *ufbx_mesh_material; + count: size_t; +} + +ufbx_face_group :: struct { + id: s32; // < Numerical ID for this group. + name: ufbx_string; // < Name for the face group. + + num_faces: size_t; // < Number of faces (polygons) using this material + num_triangles: size_t; // < Number of triangles using this material if triangulated + + // Indices to `ufbx_mesh.faces[]` that use this material. + // Always contains `num_faces` elements. + face_indices: ufbx_uint32_list; +} + +ufbx_face_group_list :: struct { + data: *ufbx_face_group; + count: size_t; +} + +ufbx_subdivision_weight_range :: struct { + weight_begin: u32; + num_weights: u32; +} + +ufbx_subdivision_weight_range_list :: struct { + data: *ufbx_subdivision_weight_range; + count: size_t; +} + +ufbx_subdivision_weight :: struct { + weight: ufbx_real; + index: u32; +} + +ufbx_subdivision_weight_list :: struct { + data: *ufbx_subdivision_weight; + count: size_t; +} + +ufbx_subdivision_result :: struct { + result_memory_used: size_t; + temp_memory_used: size_t; + result_allocs: size_t; + temp_allocs: size_t; + + // Weights of vertices in the source model. + // Defined if `ufbx_subdivide_opts.evaluate_source_vertices` is set. + source_vertex_ranges: ufbx_subdivision_weight_range_list; + source_vertex_weights: ufbx_subdivision_weight_list; + + // Weights of skin clusters in the source model. + // Defined if `ufbx_subdivide_opts.evaluate_skin_weights` is set. + skin_cluster_ranges: ufbx_subdivision_weight_range_list; + skin_cluster_weights: ufbx_subdivision_weight_list; +} + +ufbx_subdivision_display_mode :: enum s32 { + DISABLED :: 0; + HULL :: 1; + HULL_AND_SMOOTH :: 2; + SMOOTH :: 3; + + MODE_FORCE_32BIT :: 2147483647; + + UFBX_SUBDIVISION_DISPLAY_DISABLED :: DISABLED; + UFBX_SUBDIVISION_DISPLAY_HULL :: HULL; + UFBX_SUBDIVISION_DISPLAY_HULL_AND_SMOOTH :: HULL_AND_SMOOTH; + UFBX_SUBDIVISION_DISPLAY_SMOOTH :: SMOOTH; + + UFBX_SUBDIVISION_DISPLAY_MODE_FORCE_32BIT :: MODE_FORCE_32BIT; +} + +anon_enum_5 :: enum s32 { + UFBX_SUBDIVISION_DISPLAY_MODE_COUNT :: 4; +} + +ufbx_subdivision_boundary :: enum s32 { + DEFAULT :: 0; + LEGACY :: 1; + + SHARP_CORNERS :: 2; + + SHARP_NONE :: 3; + + SHARP_BOUNDARY :: 4; + + SHARP_INTERIOR :: 5; + + FORCE_32BIT :: 2147483647; + + UFBX_SUBDIVISION_BOUNDARY_DEFAULT :: DEFAULT; + UFBX_SUBDIVISION_BOUNDARY_LEGACY :: LEGACY; + + UFBX_SUBDIVISION_BOUNDARY_SHARP_CORNERS :: SHARP_CORNERS; + + UFBX_SUBDIVISION_BOUNDARY_SHARP_NONE :: SHARP_NONE; + + UFBX_SUBDIVISION_BOUNDARY_SHARP_BOUNDARY :: SHARP_BOUNDARY; + + UFBX_SUBDIVISION_BOUNDARY_SHARP_INTERIOR :: SHARP_INTERIOR; + + UFBX_SUBDIVISION_BOUNDARY_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_6 :: enum s32 { + UFBX_SUBDIVISION_BOUNDARY_COUNT :: 6; +} + +// Polygonal mesh geometry. +// +// Example mesh with two triangles (x, z) and a quad (y). +// The faces have a constant UV coordinate x/y/z. +// The vertices have _per vertex_ normals that point up/down. +// +// ^ ^ ^ +// A---B-----C +// |x / /| +// | / y / | +// |/ / z| +// D-----E---F +// v v v +// +// Attributes may have multiple values within a single vertex, for example a +// UV seam vertex has two UV coordinates. Thus polygons are defined using +// an index that counts each corner of each face polygon. If an attribute is +// defined (even per-vertex) it will always have a valid `indices` array. +// +// {0,3} {3,4} {7,3} faces ({ index_begin, num_indices }) +// 0 1 2 3 4 5 6 7 8 9 index +// +// 0 1 3 1 2 4 3 2 4 5 vertex_indices[index] +// A B D B C E D C E F vertices[vertex_indices[index]] +// +// 0 0 1 0 0 1 1 0 1 1 vertex_normal.indices[index] +// ^ ^ v ^ ^ v v ^ v v vertex_normal.data[vertex_normal.indices[index]] +// +// 0 0 0 1 1 1 1 2 2 2 vertex_uv.indices[index] +// x x x y y y y z z z vertex_uv.data[vertex_uv.indices[index]] +// +// Vertex position can also be accessed uniformly through an accessor: +// 0 1 3 1 2 4 3 2 4 5 vertex_position.indices[index] +// A B D B C E D C E F vertex_position.data[vertex_position.indices[index]] +// +// Some geometry data is specified per logical vertex. Vertex positions are +// the only attribute that is guaranteed to be defined _uniquely_ per vertex. +// Vertex attributes _may_ be defined per vertex if `unique_per_vertex == true`. +// You can access the per-vertex values by first finding the first index that +// refers to the given vertex. +// +// 0 1 2 3 4 5 vertex +// A B C D E F vertices[vertex] +// +// 0 1 4 2 5 9 vertex_first_index[vertex] +// 0 0 0 1 1 1 vertex_normal.indices[vertex_first_index[vertex]] +// ^ ^ ^ v v v vertex_normal.data[vertex_normal.indices[vertex_first_index[vertex]]] +// +ufbx_mesh :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } + + num_vertices: size_t; // < Number of logical "vertex" points + num_indices: size_t; // < Number of combiend vertex/attribute tuples + num_faces: size_t; // < Number of faces (polygons) in the mesh + num_triangles: size_t; // < Number of triangles if triangulated + + // Number of edges in the mesh. + // NOTE: May be zero in valid meshes if the file doesn't contain edge adjacency data! + num_edges: size_t; + + max_face_triangles: size_t; // < Maximum number of triangles in a face in this mesh + + num_empty_faces: size_t; // < Number of faces with zero vertices + num_point_faces: size_t; // < Number of faces with a single vertex + num_line_faces: size_t; // < Number of faces with two vertices + + faces: ufbx_face_list; // < Face index range + face_smoothing: ufbx_bool_list; // < Should the face have soft normals + face_material: ufbx_uint32_list; // < Indices to `ufbx_mesh.materials[]` and `ufbx_node.materials[]` + face_group: ufbx_uint32_list; // < Face polygon group index, indices to `ufbx_mesh.face_groups[]` + face_hole: ufbx_bool_list; // < Should the face be hidden as a "hole" + + edges: ufbx_edge_list; // < Edge index range + edge_smoothing: ufbx_bool_list; // < Should the edge have soft normals + edge_crease: ufbx_real_list; // < Crease value for subdivision surfaces + edge_visibility: ufbx_bool_list; // < Should the edge be visible + + // Logical vertices and positions, alternatively you can use + // `vertex_position` for consistent interface with other attributes. + vertex_indices: ufbx_uint32_list; + vertices: ufbx_vec3_list; + + // First index referring to a given vertex, `UFBX_NO_INDEX` if the vertex is unused. + vertex_first_index: ufbx_uint32_list; + + vertex_position: ufbx_vertex_vec3; // < Vertex positions + vertex_normal: ufbx_vertex_vec3; // < (optional) Normal vectors (TODO: Generate?) + vertex_uv: ufbx_vertex_vec2; // < (optional) UV / texture coordinates + vertex_tangent: ufbx_vertex_vec3; // < (optional) Tangent vector in UV.x direction + vertex_bitangent: ufbx_vertex_vec3; // < (optional) Tangent vector in UV.y direction + vertex_color: ufbx_vertex_vec4; // < (optional) Per-vertex RGBA color + vertex_crease: ufbx_vertex_real; // < (optional) Crease value for subdivision surfaces + + // Multiple named UV/color sets + // NOTE: The first set contains the same data as `vertex_uv/color`! + uv_sets: ufbx_uv_set_list; + color_sets: ufbx_color_set_list; + + // List of materials used by the mesh. This is a list of structures that contains + // compact lists of face indices that use a specific material which can be more + // useful convenient `face_material`. Use `materials[index].material` for the + // actual material pointers. + // NOTE: These can be wrong if you want to support per-instance materials! + // Use `ufbx_node.materials[]` to get the per-instance materials at the same indices. + // HINT: If this mesh has no material then `materials[]` will be empty, but if + // you enable `ufbx_load_opts.allow_null_material` there will be a single + // `ufbx_mesh_material` with `material == NULL` with all the faces in it. + materials: ufbx_mesh_material_list; + + // Face groups for this mesh. + face_groups: ufbx_face_group_list; + + // Skinned vertex positions, for efficiency the skinned positions are the + // same as the static ones for non-skinned meshes and `skinned_is_local` + // is set to true meaning you need to transform them manually using + // `ufbx_transform_position(&node->geometry_to_world, skinned_pos)`! + skinned_is_local: bool; + skinned_position: ufbx_vertex_vec3; + skinned_normal: ufbx_vertex_vec3; + + // Deformers + skin_deformers: ufbx_skin_deformer_list; + blend_deformers: ufbx_blend_deformer_list; + cache_deformers: ufbx_cache_deformer_list; + all_deformers: ufbx_element_list; + + // Subdivision + subdivision_preview_levels: u32; + subdivision_render_levels: u32; + subdivision_display_mode: ufbx_subdivision_display_mode; + subdivision_boundary: ufbx_subdivision_boundary; + subdivision_uv_boundary: ufbx_subdivision_boundary; + + // Normals have been generated instead of evalauted. + // Either from missing normals (via `ufbx_load_opts.generate_missing_normals`), skinning, + // tessellation, or subdivision. + generated_normals: bool; + + // Subdivision (result) + subdivision_evaluated: bool; + subdivision_result: *ufbx_subdivision_result; + + // Tessellation (result) + from_tessellated_nurbs: bool; +} + +// The kind of light source +ufbx_light_type :: enum s32 { + POINT :: 0; + + DIRECTIONAL :: 1; + + SPOT :: 2; + + AREA :: 3; + + VOLUME :: 4; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_LIGHT_POINT :: POINT; + + UFBX_LIGHT_DIRECTIONAL :: DIRECTIONAL; + + UFBX_LIGHT_SPOT :: SPOT; + + UFBX_LIGHT_AREA :: AREA; + + UFBX_LIGHT_VOLUME :: VOLUME; + + UFBX_LIGHT_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_7 :: enum s32 { + UFBX_LIGHT_TYPE_COUNT :: 5; +} + +// How fast does the light intensity decay at a distance +ufbx_light_decay :: enum s32 { + NONE :: 0; + LINEAR :: 1; + QUADRATIC :: 2; + CUBIC :: 3; + + FORCE_32BIT :: 2147483647; + + UFBX_LIGHT_DECAY_NONE :: NONE; + UFBX_LIGHT_DECAY_LINEAR :: LINEAR; + UFBX_LIGHT_DECAY_QUADRATIC :: QUADRATIC; + UFBX_LIGHT_DECAY_CUBIC :: CUBIC; + + UFBX_LIGHT_DECAY_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_8 :: enum s32 { + UFBX_LIGHT_DECAY_COUNT :: 4; +} + +ufbx_light_area_shape :: enum s32 { + RECTANGLE :: 0; + SPHERE :: 1; + + FORCE_32BIT :: 2147483647; + + UFBX_LIGHT_AREA_SHAPE_RECTANGLE :: RECTANGLE; + UFBX_LIGHT_AREA_SHAPE_SPHERE :: SPHERE; + + UFBX_LIGHT_AREA_SHAPE_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_9 :: enum s32 { + UFBX_LIGHT_AREA_SHAPE_COUNT :: 2; +} + +// Light source attached to a `ufbx_node` +ufbx_light :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } + + // Color and intensity of the light, usually you want to use `color * intensity` + // NOTE: `intensity` is 0.01x of the property `"Intensity"` as that matches + // matches values in DCC programs before exporting. + color: ufbx_vec3; + intensity: ufbx_real; + + // Direction the light is aimed at in node's local space, usually -Y + local_direction: ufbx_vec3; + + // Type of the light and shape parameters + type: ufbx_light_type; + decay: ufbx_light_decay; + area_shape: ufbx_light_area_shape; + inner_angle: ufbx_real; + outer_angle: ufbx_real; + + cast_light: bool; + cast_shadows: bool; +} + +ufbx_projection_mode :: enum s32 { + PERSPECTIVE :: 0; + + ORTHOGRAPHIC :: 1; + + FORCE_32BIT :: 2147483647; + + UFBX_PROJECTION_MODE_PERSPECTIVE :: PERSPECTIVE; + + UFBX_PROJECTION_MODE_ORTHOGRAPHIC :: ORTHOGRAPHIC; + + UFBX_PROJECTION_MODE_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_10 :: enum s32 { + UFBX_PROJECTION_MODE_COUNT :: 2; +} + +// Method of specifying the rendering resolution from properties +// NOTE: Handled internally by ufbx, ignore unless you interpret `ufbx_props` directly! +ufbx_aspect_mode :: enum s32 { + WINDOW_SIZE :: 0; + + FIXED_RATIO :: 1; + + FIXED_RESOLUTION :: 2; + + FIXED_WIDTH :: 3; + + FIXED_HEIGHT :: 4; + + FORCE_32BIT :: 2147483647; + + UFBX_ASPECT_MODE_WINDOW_SIZE :: WINDOW_SIZE; + + UFBX_ASPECT_MODE_FIXED_RATIO :: FIXED_RATIO; + + UFBX_ASPECT_MODE_FIXED_RESOLUTION :: FIXED_RESOLUTION; + + UFBX_ASPECT_MODE_FIXED_WIDTH :: FIXED_WIDTH; + + UFBX_ASPECT_MODE_FIXED_HEIGHT :: FIXED_HEIGHT; + + UFBX_ASPECT_MODE_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_11 :: enum s32 { + UFBX_ASPECT_MODE_COUNT :: 5; +} + +// Method of specifying the field of view from properties +// NOTE: Handled internally by ufbx, ignore unless you interpret `ufbx_props` directly! +ufbx_aperture_mode :: enum s32 { + HORIZONTAL_AND_VERTICAL :: 0; + + HORIZONTAL :: 1; + + VERTICAL :: 2; + + FOCAL_LENGTH :: 3; + + FORCE_32BIT :: 2147483647; + + UFBX_APERTURE_MODE_HORIZONTAL_AND_VERTICAL :: HORIZONTAL_AND_VERTICAL; + + UFBX_APERTURE_MODE_HORIZONTAL :: HORIZONTAL; + + UFBX_APERTURE_MODE_VERTICAL :: VERTICAL; + + UFBX_APERTURE_MODE_FOCAL_LENGTH :: FOCAL_LENGTH; + + UFBX_APERTURE_MODE_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_12 :: enum s32 { + UFBX_APERTURE_MODE_COUNT :: 4; +} + +// Method of specifying the render gate size from properties +// NOTE: Handled internally by ufbx, ignore unless you interpret `ufbx_props` directly! +ufbx_gate_fit :: enum s32 { + NONE :: 0; + + VERTICAL :: 1; + + HORIZONTAL :: 2; + + FILL :: 3; + + OVERSCAN :: 4; + + STRETCH :: 5; + + FORCE_32BIT :: 2147483647; + + UFBX_GATE_FIT_NONE :: NONE; + + UFBX_GATE_FIT_VERTICAL :: VERTICAL; + + UFBX_GATE_FIT_HORIZONTAL :: HORIZONTAL; + + UFBX_GATE_FIT_FILL :: FILL; + + UFBX_GATE_FIT_OVERSCAN :: OVERSCAN; + + UFBX_GATE_FIT_STRETCH :: STRETCH; + + UFBX_GATE_FIT_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_13 :: enum s32 { + UFBX_GATE_FIT_COUNT :: 6; +} + +// Camera film/aperture size defaults +// NOTE: Handled internally by ufbx, ignore unless you interpret `ufbx_props` directly! +ufbx_aperture_format :: enum s32 { + CUSTOM :: 0; + _16MM_THEATRICAL :: 1; + SUPER_16MM :: 2; + _35MM_ACADEMY :: 3; + _35MM_TV_PROJECTION :: 4; + _35MM_FULL_APERTURE :: 5; + _35MM_185_PROJECTION :: 6; + _35MM_ANAMORPHIC :: 7; + _70MM_PROJECTION :: 8; + VISTAVISION :: 9; + DYNAVISION :: 10; + IMAX :: 11; + + FORCE_32BIT :: 2147483647; + + UFBX_APERTURE_FORMAT_CUSTOM :: CUSTOM; + UFBX_APERTURE_FORMAT_16MM_THEATRICAL :: _16MM_THEATRICAL; + UFBX_APERTURE_FORMAT_SUPER_16MM :: SUPER_16MM; + UFBX_APERTURE_FORMAT_35MM_ACADEMY :: _35MM_ACADEMY; + UFBX_APERTURE_FORMAT_35MM_TV_PROJECTION :: _35MM_TV_PROJECTION; + UFBX_APERTURE_FORMAT_35MM_FULL_APERTURE :: _35MM_FULL_APERTURE; + UFBX_APERTURE_FORMAT_35MM_185_PROJECTION :: _35MM_185_PROJECTION; + UFBX_APERTURE_FORMAT_35MM_ANAMORPHIC :: _35MM_ANAMORPHIC; + UFBX_APERTURE_FORMAT_70MM_PROJECTION :: _70MM_PROJECTION; + UFBX_APERTURE_FORMAT_VISTAVISION :: VISTAVISION; + UFBX_APERTURE_FORMAT_DYNAVISION :: DYNAVISION; + UFBX_APERTURE_FORMAT_IMAX :: IMAX; + + UFBX_APERTURE_FORMAT_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_14 :: enum s32 { + UFBX_APERTURE_FORMAT_COUNT :: 12; +} + +ufbx_coordinate_axis :: enum s32 { + POSITIVE_X :: 0; + NEGATIVE_X :: 1; + POSITIVE_Y :: 2; + NEGATIVE_Y :: 3; + POSITIVE_Z :: 4; + NEGATIVE_Z :: 5; + UNKNOWN :: 6; + + FORCE_32BIT :: 2147483647; + + UFBX_COORDINATE_AXIS_POSITIVE_X :: POSITIVE_X; + UFBX_COORDINATE_AXIS_NEGATIVE_X :: NEGATIVE_X; + UFBX_COORDINATE_AXIS_POSITIVE_Y :: POSITIVE_Y; + UFBX_COORDINATE_AXIS_NEGATIVE_Y :: NEGATIVE_Y; + UFBX_COORDINATE_AXIS_POSITIVE_Z :: POSITIVE_Z; + UFBX_COORDINATE_AXIS_NEGATIVE_Z :: NEGATIVE_Z; + UFBX_COORDINATE_AXIS_UNKNOWN :: UNKNOWN; + + UFBX_COORDINATE_AXIS_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_15 :: enum s32 { + UFBX_COORDINATE_AXIS_COUNT :: 7; +} + +// Coordinate axes the scene is represented in. +// NOTE: `front` is the _opposite_ from forward! +ufbx_coordinate_axes :: struct { + right: ufbx_coordinate_axis; + up: ufbx_coordinate_axis; + front: ufbx_coordinate_axis; +} + +// Camera attached to a `ufbx_node` +ufbx_camera :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } + + // Projection mode (perspective/orthographic). + projection_mode: ufbx_projection_mode; + + // If set to `true`, `resolution` reprensents actual pixel values, otherwise + // it's only useful for its aspect ratio. + resolution_is_pixels: bool; + + // Render resolution, either in pixels or arbitrary units, depending on above + resolution: ufbx_vec2 #align 3; + + // Horizontal/vertical field of view in degrees + // Valid if `projection_mode == UFBX_PROJECTION_MODE_PERSPECTIVE`. + field_of_view_deg: ufbx_vec2; + + // Component-wise `tan(field_of_view_deg)`, also represents the size of the + // proection frustum slice at distance of 1. + // Valid if `projection_mode == UFBX_PROJECTION_MODE_PERSPECTIVE`. + field_of_view_tan: ufbx_vec2; + + // Orthographic camera extents. + // Valid if `projection_mode == UFBX_PROJECTION_MODE_ORTHOGRAPHIC`. + orthographic_extent: ufbx_real; + + // Orthographic camera size. + // Valid if `projection_mode == UFBX_PROJECTION_MODE_ORTHOGRAPHIC`. + orthographic_size: ufbx_vec2; + + // Size of the projection plane at distance 1. + // Equal to `field_of_view_tan` if perspective, `orthographic_size` if orthographic. + projection_plane: ufbx_vec2; + + // Aspect ratio of the camera. + aspect_ratio: ufbx_real; + + // Near plane of the frustum in units from the camera. + near_plane: ufbx_real; + + // Far plane of the frustum in units from the camera. + far_plane: ufbx_real; + + // Coordinate system that the projection uses. + // FBX saves cameras with +X forward and +Y up, but you can override this using + // `ufbx_load_opts.target_camera_axes` and it will be reflected here. + projection_axes: ufbx_coordinate_axes; + + // Advanced properties used to compute the above + aspect_mode: ufbx_aspect_mode; + aperture_mode: ufbx_aperture_mode; + gate_fit: ufbx_gate_fit; + aperture_format: ufbx_aperture_format; + focal_length_mm: ufbx_real; // < Focal length in millimeters + film_size_inch: ufbx_vec2; // < Film size in inches + aperture_size_inch: ufbx_vec2; // < Aperture/film gate size in inches + squeeze_ratio: ufbx_real; // < Anamoprhic stretch ratio +} + +// Bone attached to a `ufbx_node`, provides the logical length of the bone +// but most interesting information is directly in `ufbx_node`. +ufbx_bone :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } + + // Visual radius of the bone + radius: ufbx_real; + + // Length of the bone relative to the distance between two nodes + relative_length: ufbx_real; + + // Is the bone a root bone + is_root: bool; +} + +// Empty/NULL/locator connected to a node, actual details in `ufbx_node` +ufbx_empty :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } +} + +// Segment of a `ufbx_line_curve`, indices refer to `ufbx_line_curve.point_indces[]` +ufbx_line_segment :: struct { + index_begin: u32; + num_indices: u32; +} + +ufbx_line_segment_list :: struct { + data: *ufbx_line_segment; + count: size_t; +} + +ufbx_line_curve :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } + + color: ufbx_vec3; + + control_points: ufbx_vec3_list; // < List of possible values the line passes through + point_indices: ufbx_uint32_list; // < Indices to `control_points[]` the line goes through + + segments: ufbx_line_segment_list; + + // Tessellation (result) + from_tessellated_nurbs: bool; +} + +ufbx_nurbs_topology :: enum s32 { + OPEN :: 0; + + PERIODIC :: 1; + + CLOSED :: 2; + + FORCE_32BIT :: 2147483647; + + UFBX_NURBS_TOPOLOGY_OPEN :: OPEN; + + UFBX_NURBS_TOPOLOGY_PERIODIC :: PERIODIC; + + UFBX_NURBS_TOPOLOGY_CLOSED :: CLOSED; + + UFBX_NURBS_TOPOLOGY_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_16 :: enum s32 { + UFBX_NURBS_TOPOLOGY_COUNT :: 3; +} + +// NURBS basis functions for an axis +ufbx_nurbs_basis :: struct { + // Number of control points influencing a point on the curve/surface. + // Equal to the degree plus one. + order: u32; + + // Topology (periodicity) of the dimension. + topology: ufbx_nurbs_topology; + + // Subdivision of the parameter range to control points. + knot_vector: ufbx_real_list; + + // Range for the parameter value. + t_min: ufbx_real; + t_max: ufbx_real; + + // Parameter values of control points. + spans: ufbx_real_list; + + // `true` if this axis is two-dimensional. + is_2d: bool; + + // Number of control points that need to be copied to the end. + // This is just for convenience as it could be derived from `topology` and + // `order`. If for example `num_wrap_control_points == 3` you should repeat + // the first 3 control points after the end. + // HINT: You don't need to worry about this if you use ufbx functions + // like `ufbx_evaluate_nurbs_curve_point()` as they handle this internally. + num_wrap_control_points: size_t; + + // `true` if the parametrization is well defined. + valid: bool; +} + +ufbx_nurbs_curve :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } + + // Basis in the U axis + basis: ufbx_nurbs_basis; + + // Linear array of control points + // NOTE: The control points are _not_ homogeneous, meaning you have to multiply + // them by `w` before evaluating the surface. + control_points: ufbx_vec4_list; +} + +ufbx_nurbs_surface :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } + + // Basis in the U/V axes + basis_u: ufbx_nurbs_basis; + basis_v: ufbx_nurbs_basis; + + // Number of control points for the U/V axes + num_control_points_u: size_t; + num_control_points_v: size_t; + + // 2D array of control points. + // Memory layout: `V * num_control_points_u + U` + // NOTE: The control points are _not_ homogeneous, meaning you have to multiply + // them by `w` before evaluating the surface. + control_points: ufbx_vec4_list; + + // How many segments tessellate each step in `ufbx_nurbs_basis.steps`. + span_subdivision_u: u32; + span_subdivision_v: u32; + + // If `true` the resulting normals should be flipped when evaluated. + flip_normals: bool; + + // Material for the whole surface. + // NOTE: May be `NULL`! + material: *ufbx_material; +} + +ufbx_nurbs_trim_surface :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } +} + +ufbx_nurbs_trim_boundary :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } +} + +// -- Node attributes (advanced) +ufbx_procedural_geometry :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } +} + +ufbx_stereo_camera :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } + + left: *ufbx_camera; + right: *ufbx_camera; +} + +ufbx_camera_switcher :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } +} + +ufbx_marker_type :: enum s32 { + UNKNOWN :: 0; + FK_EFFECTOR :: 1; + IK_EFFECTOR :: 2; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_MARKER_UNKNOWN :: UNKNOWN; + UFBX_MARKER_FK_EFFECTOR :: FK_EFFECTOR; + UFBX_MARKER_IK_EFFECTOR :: IK_EFFECTOR; + + UFBX_MARKER_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_17 :: enum s32 { + UFBX_MARKER_TYPE_COUNT :: 3; +} + +// Tracking marker for effectors +ufbx_marker :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } + + // Type of the marker + type: ufbx_marker_type; +} + +// LOD level display mode. +ufbx_lod_display :: enum s32 { + USE_LOD :: 0; + SHOW :: 1; + HIDE :: 2; + + FORCE_32BIT :: 2147483647; + + UFBX_LOD_DISPLAY_USE_LOD :: USE_LOD; + UFBX_LOD_DISPLAY_SHOW :: SHOW; + UFBX_LOD_DISPLAY_HIDE :: HIDE; + + UFBX_LOD_DISPLAY_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_18 :: enum s32 { + UFBX_LOD_DISPLAY_COUNT :: 3; +} + +// Single LOD level within an LOD group. +// Specifies properties of the Nth child of the _node_ containing the LOD group. +ufbx_lod_level :: struct { + // Minimum distance to show this LOD level. + // NOTE: In world units by default, or in screen percentage if + // `ufbx_lod_group.relative_thresholds` is set. + distance: ufbx_real; + + // LOD display mode. + // NOTE: Mostly for editing, you should probably ignore this + // unless making a modeling program. + display: ufbx_lod_display; +} + +ufbx_lod_level_list :: struct { + data: *ufbx_lod_level; + count: size_t; +} + +// Group of LOD (Level of Detail) levels for an object. +// The actual LOD models are defined in the parent `ufbx_node.children`. +ufbx_lod_group :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + instances: ufbx_node_list; + } + } + + // If set to `true`, `ufbx_lod_level.distance` represents a screen size percentage. + relative_distances: bool; + + // LOD levels matching in order to `ufbx_node.children`. + lod_levels: ufbx_lod_level_list; + + // If set to `true` don't account for parent transform when computing the distance. + ignore_parent_transform: bool; + + // If `use_distance_limit` is enabled hide the group if the distance is not between + // `distance_limit_min` and `distance_limit_max`. + use_distance_limit: bool; + distance_limit_min: ufbx_real; + distance_limit_max: ufbx_real; +} + +// Method to evaluate the skinning on a per-vertex level +ufbx_skinning_method :: enum s32 { + LINEAR :: 0; + + RIGID :: 1; + + DUAL_QUATERNION :: 2; + + BLENDED_DQ_LINEAR :: 3; + + FORCE_32BIT :: 2147483647; + + UFBX_SKINNING_METHOD_LINEAR :: LINEAR; + + UFBX_SKINNING_METHOD_RIGID :: RIGID; + + UFBX_SKINNING_METHOD_DUAL_QUATERNION :: DUAL_QUATERNION; + + UFBX_SKINNING_METHOD_BLENDED_DQ_LINEAR :: BLENDED_DQ_LINEAR; + + UFBX_SKINNING_METHOD_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_19 :: enum s32 { + UFBX_SKINNING_METHOD_COUNT :: 4; +} + +// Skin weight information for a single mesh vertex +ufbx_skin_vertex :: struct { + weight_begin: u32; // < Index to start from in the `weights[]` array + num_weights: u32; // < Number of weights influencing the vertex + + // Blend weight between Linear Blend Skinning (0.0) and Dual Quaternion (1.0). + // Should be used if `skinning_method == UFBX_SKINNING_METHOD_BLENDED_DQ_LINEAR` + dq_weight: ufbx_real; +} + +ufbx_skin_vertex_list :: struct { + data: *ufbx_skin_vertex; + count: size_t; +} + +// Single per-vertex per-cluster weight, see `ufbx_skin_vertex` +ufbx_skin_weight :: struct { + cluster_index: u32; // < Index into `ufbx_skin_deformer.clusters[]` + weight: ufbx_real; // < Amount this bone influence the vertex +} + +ufbx_skin_weight_list :: struct { + data: *ufbx_skin_weight; + count: size_t; +} + +// Skin deformer specifies a binding between a logical set of bones (a skeleton) +// and a mesh. Each bone is represented by a `ufbx_skin_cluster` that contains +// the binding matrix and a `ufbx_node *bone` that has the current transformation. +ufbx_skin_deformer :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + skinning_method: ufbx_skinning_method; + + // Clusters (bones) in the skin + clusters: ufbx_skin_cluster_list; + + // Per-vertex weight information + vertices: ufbx_skin_vertex_list; + weights: ufbx_skin_weight_list; + + // Largest amount of weights a single vertex can have + max_weights_per_vertex: size_t; + + // Blend weights between Linear Blend Skinning (0.0) and Dual Quaternion (1.0). + // HINT: You probably want to use `vertices` and `ufbx_skin_vertex.dq_weight` instead! + // NOTE: These may be out-of-bounds for a given mesh, `vertices` is always safe. + num_dq_weights: size_t; + dq_vertices: ufbx_uint32_list; + dq_weights: ufbx_real_list; +} + +// Cluster of vertices bound to a single bone. +ufbx_skin_cluster :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // The bone node the cluster is attached to + // NOTE: Always valid if found from `ufbx_skin_deformer.clusters[]` unless + // `ufbx_load_opts.connect_broken_elements` is `true`. + bone_node: *ufbx_node; + + // Binding matrix from local mesh vertices to the bone + geometry_to_bone: ufbx_matrix; + + // Binding matrix from local mesh _node_ to the bone. + // NOTE: Prefer `geometry_to_bone` in most use cases! + mesh_node_to_bone: ufbx_matrix; + + // Matrix that specifies the rest/bind pose transform of the node, + // not generally needed for skinning, use `geometry_to_bone` instead. + bind_to_world: ufbx_matrix; + + // Precomputed matrix/transform that accounts for the current bone transform + // ie. `ufbx_matrix_mul(&cluster->bone->node_to_world, &cluster->geometry_to_bone)` + geometry_to_world: ufbx_matrix; + geometry_to_world_transform: ufbx_transform; + + num_weights: size_t; // < Number of vertices in the cluster + vertices: ufbx_uint32_list; // < Vertex indices in `ufbx_mesh.vertices[]` + weights: ufbx_real_list; // < Per-vertex weight values +} + +// Blend shape deformer can contain multiple channels (think of sliders between morphs) +// that may optionally have in-between keyframes. +ufbx_blend_deformer :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // Independent morph targets of the deformer. + channels: ufbx_blend_channel_list; +} + +// Blend shape associated with a target weight in a series of morphs +ufbx_blend_keyframe :: struct { + // The target blend shape offsets. + shape: *ufbx_blend_shape; + + // Weight value at which to apply the keyframe at full strength + target_weight: ufbx_real; + + // The weight the shape should be currently applied with + effective_weight: ufbx_real; +} + +ufbx_blend_keyframe_list :: struct { + data: *ufbx_blend_keyframe; + count: size_t; +} + +// Blend channel consists of multiple morph-key targets that are interpolated. +// In simple cases there will be only one keyframe that is the target shape. +ufbx_blend_channel :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // Current weight of the channel + weight: ufbx_real; + + // Key morph targets to blend between depending on `weight` + // In usual cases there's only one target per channel + keyframes: ufbx_blend_keyframe_list; +} + +// Blend shape target containing the actual vertex offsets +ufbx_blend_shape :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + num_offsets: size_t; // < Number of vertex offsets in the following arrays + offset_vertices: ufbx_uint32_list; // < Indices to `ufbx_mesh.vertices[]` + position_offsets: ufbx_vec3_list; // < Always specified per-vertex offsets + normal_offsets: ufbx_vec3_list; // < Empty if not specified +} + +ufbx_cache_file_format :: enum s32 { + UNKNOWN :: 0; + PC2 :: 1; + MC :: 2; + + FORCE_32BIT :: 2147483647; + + UFBX_CACHE_FILE_FORMAT_UNKNOWN :: UNKNOWN; + UFBX_CACHE_FILE_FORMAT_PC2 :: PC2; + UFBX_CACHE_FILE_FORMAT_MC :: MC; + + UFBX_CACHE_FILE_FORMAT_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_20 :: enum s32 { + UFBX_CACHE_FILE_FORMAT_COUNT :: 3; +} + +ufbx_cache_data_format :: enum s32 { + UNKNOWN :: 0; + REAL_FLOAT :: 1; + VEC3_FLOAT :: 2; + REAL_DOUBLE :: 3; + VEC3_DOUBLE :: 4; + + FORCE_32BIT :: 2147483647; + + UFBX_CACHE_DATA_FORMAT_UNKNOWN :: UNKNOWN; + UFBX_CACHE_DATA_FORMAT_REAL_FLOAT :: REAL_FLOAT; + UFBX_CACHE_DATA_FORMAT_VEC3_FLOAT :: VEC3_FLOAT; + UFBX_CACHE_DATA_FORMAT_REAL_DOUBLE :: REAL_DOUBLE; + UFBX_CACHE_DATA_FORMAT_VEC3_DOUBLE :: VEC3_DOUBLE; + + UFBX_CACHE_DATA_FORMAT_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_21 :: enum s32 { + UFBX_CACHE_DATA_FORMAT_COUNT :: 5; +} + +ufbx_cache_data_encoding :: enum s32 { + UNKNOWN :: 0; + LITTLE_ENDIAN :: 1; + BIG_ENDIAN :: 2; + + FORCE_32BIT :: 2147483647; + + UFBX_CACHE_DATA_ENCODING_UNKNOWN :: UNKNOWN; + UFBX_CACHE_DATA_ENCODING_LITTLE_ENDIAN :: LITTLE_ENDIAN; + UFBX_CACHE_DATA_ENCODING_BIG_ENDIAN :: BIG_ENDIAN; + + UFBX_CACHE_DATA_ENCODING_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_22 :: enum s32 { + UFBX_CACHE_DATA_ENCODING_COUNT :: 3; +} + +// Known interpretations of geometry cache data. +ufbx_cache_interpretation :: enum s32 { + UNKNOWN :: 0; + + POINTS :: 1; + + VERTEX_POSITION :: 2; + + VERTEX_NORMAL :: 3; + + FORCE_32BIT :: 2147483647; + + UFBX_CACHE_INTERPRETATION_UNKNOWN :: UNKNOWN; + + UFBX_CACHE_INTERPRETATION_POINTS :: POINTS; + + UFBX_CACHE_INTERPRETATION_VERTEX_POSITION :: VERTEX_POSITION; + + UFBX_CACHE_INTERPRETATION_VERTEX_NORMAL :: VERTEX_NORMAL; + + UFBX_CACHE_INTERPRETATION_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_23 :: enum s32 { + UFBX_CACHE_INTERPRETATION_COUNT :: 4; +} + +ufbx_cache_frame :: struct { + // Name of the channel this frame belongs to. + channel: ufbx_string; + + // Time of this frame in seconds. + time: float64; + + // Name of the file containing the data. + // The specified file may contain multiple frames, use `data_offset` etc. to + // read at the right position. + filename: ufbx_string; + + // Format of the wrapper file. + file_format: ufbx_cache_file_format; + + data_format: ufbx_cache_data_format; // < Format of the data in the file + data_encoding: ufbx_cache_data_encoding; // < Binary encoding of the data + data_offset: u64; // < Byte offset into the file + data_count: u32; // < Number of data elements + data_element_bytes: u32; // < Size of a single data element in bytes + data_total_bytes: u64; // < Size of the whole data blob in bytes +} + +ufbx_cache_frame_list :: struct { + data: *ufbx_cache_frame; + count: size_t; +} + +ufbx_cache_channel :: struct { + // Name of the geometry cache channel. + name: ufbx_string; + + // What does the data in this channel represent. + interpretation: ufbx_cache_interpretation; + + // Source name for `interpretation`, especially useful if `interpretation` is + // `UFBX_CACHE_INTERPRETATION_UNKNOWN`. + interpretation_name: ufbx_string; + + // List of frames belonging to this channel. + // Sorted by time (`ufbx_cache_frame.time`). + frames: ufbx_cache_frame_list; +} + +ufbx_cache_channel_list :: struct { + data: *ufbx_cache_channel; + count: size_t; +} + +ufbx_geometry_cache :: struct { + root_filename: ufbx_string; + channels: ufbx_cache_channel_list; + frames: ufbx_cache_frame_list; + extra_info: ufbx_string_list; +} + +ufbx_cache_deformer :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + channel: ufbx_string; + file: *ufbx_cache_file; + + // Only valid if `ufbx_load_opts.load_external_files` is set! + external_cache: *ufbx_geometry_cache; + external_channel: *ufbx_cache_channel; +} + +ufbx_cache_file :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + filename: ufbx_string; + absolute_filename: ufbx_string; + relative_filename: ufbx_string; + raw_filename: ufbx_blob; + raw_absolute_filename: ufbx_blob; + raw_relative_filename: ufbx_blob; + + format: ufbx_cache_file_format; + + // Only valid if `ufbx_load_opts.load_external_files` is set! + external_cache: *ufbx_geometry_cache; +} + +// Material property, either specified with a constant value or a mapped texture +ufbx_material_map :: struct { + // Constant value or factor for the map. + // May be specified simultaneously with a texture, in this case most shading models + // use multiplicative tinting of the texture values. + union { + value_real: ufbx_real; + value_vec2: ufbx_vec2; + value_vec3: ufbx_vec3; + value_vec4: ufbx_vec4; + } + + value_int: s64; + + // Texture if connected, otherwise `NULL`. + // May be valid but "disabled" (application specific) if `texture_enabled == false`. + texture: *ufbx_texture; + + // `true` if the file has specified any of the values above. + // NOTE: The value may be set to a non-zero default even if `has_value == false`, + // for example missing factors are set to `1.0` if a color is defined. + has_value: bool; + + // Controls whether shading should use `texture`. + // NOTE: Some shading models allow this to be `true` even if `texture == NULL`. + texture_enabled: bool; + + // Set to `true` if this feature should be disabled (specific to shader type). + feature_disabled: bool; + + // Number of components in the value from 1 to 4 if defined, 0 if not. + value_components: u8; +} + +// Material feature +ufbx_material_feature_info :: struct { + // Whether the material model uses this feature or not. + // NOTE: The feature can be enabled but still not used if eg. the corresponding factor is at zero! + enabled: bool; + + // Explicitly enabled/disabled by the material. + is_explicit: bool; +} + +// Texture attached to an FBX property +ufbx_material_texture :: struct { + material_prop: ufbx_string; // < Name of the property in `ufbx_material.props` + shader_prop: ufbx_string; // < Shader-specific property mapping name + + // Texture attached to the property. + texture: *ufbx_texture; +} + +ufbx_material_texture_list :: struct { + data: *ufbx_material_texture; + count: size_t; +} + +// Shading model type +ufbx_shader_type :: enum s32 { + UNKNOWN :: 0; + + FBX_LAMBERT :: 1; + + FBX_PHONG :: 2; + + OSL_STANDARD_SURFACE :: 3; + + ARNOLD_STANDARD_SURFACE :: 4; + + _3DS_MAX_PHYSICAL_MATERIAL :: 5; + + _3DS_MAX_PBR_METAL_ROUGH :: 6; + + _3DS_MAX_PBR_SPEC_GLOSS :: 7; + + GLTF_MATERIAL :: 8; + + SHADERFX_GRAPH :: 9; + + BLENDER_PHONG :: 10; + + WAVEFRONT_MTL :: 11; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_SHADER_UNKNOWN :: UNKNOWN; + + UFBX_SHADER_FBX_LAMBERT :: FBX_LAMBERT; + + UFBX_SHADER_FBX_PHONG :: FBX_PHONG; + + UFBX_SHADER_OSL_STANDARD_SURFACE :: OSL_STANDARD_SURFACE; + + UFBX_SHADER_ARNOLD_STANDARD_SURFACE :: ARNOLD_STANDARD_SURFACE; + + UFBX_SHADER_3DS_MAX_PHYSICAL_MATERIAL :: _3DS_MAX_PHYSICAL_MATERIAL; + + UFBX_SHADER_3DS_MAX_PBR_METAL_ROUGH :: _3DS_MAX_PBR_METAL_ROUGH; + + UFBX_SHADER_3DS_MAX_PBR_SPEC_GLOSS :: _3DS_MAX_PBR_SPEC_GLOSS; + + UFBX_SHADER_GLTF_MATERIAL :: GLTF_MATERIAL; + + UFBX_SHADER_SHADERFX_GRAPH :: SHADERFX_GRAPH; + + UFBX_SHADER_BLENDER_PHONG :: BLENDER_PHONG; + + UFBX_SHADER_WAVEFRONT_MTL :: WAVEFRONT_MTL; + + UFBX_SHADER_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_24 :: enum s32 { + UFBX_SHADER_TYPE_COUNT :: 12; +} + +// FBX builtin material properties, matches maps in `ufbx_material_fbx_maps` +ufbx_material_fbx_map :: enum s32 { + DIFFUSE_FACTOR :: 0; + DIFFUSE_COLOR :: 1; + SPECULAR_FACTOR :: 2; + SPECULAR_COLOR :: 3; + SPECULAR_EXPONENT :: 4; + REFLECTION_FACTOR :: 5; + REFLECTION_COLOR :: 6; + TRANSPARENCY_FACTOR :: 7; + TRANSPARENCY_COLOR :: 8; + EMISSION_FACTOR :: 9; + EMISSION_COLOR :: 10; + AMBIENT_FACTOR :: 11; + AMBIENT_COLOR :: 12; + NORMAL_MAP :: 13; + BUMP :: 14; + BUMP_FACTOR :: 15; + DISPLACEMENT_FACTOR :: 16; + DISPLACEMENT :: 17; + VECTOR_DISPLACEMENT_FACTOR :: 18; + VECTOR_DISPLACEMENT :: 19; + + MAP_FORCE_32BIT :: 2147483647; + + UFBX_MATERIAL_FBX_DIFFUSE_FACTOR :: DIFFUSE_FACTOR; + UFBX_MATERIAL_FBX_DIFFUSE_COLOR :: DIFFUSE_COLOR; + UFBX_MATERIAL_FBX_SPECULAR_FACTOR :: SPECULAR_FACTOR; + UFBX_MATERIAL_FBX_SPECULAR_COLOR :: SPECULAR_COLOR; + UFBX_MATERIAL_FBX_SPECULAR_EXPONENT :: SPECULAR_EXPONENT; + UFBX_MATERIAL_FBX_REFLECTION_FACTOR :: REFLECTION_FACTOR; + UFBX_MATERIAL_FBX_REFLECTION_COLOR :: REFLECTION_COLOR; + UFBX_MATERIAL_FBX_TRANSPARENCY_FACTOR :: TRANSPARENCY_FACTOR; + UFBX_MATERIAL_FBX_TRANSPARENCY_COLOR :: TRANSPARENCY_COLOR; + UFBX_MATERIAL_FBX_EMISSION_FACTOR :: EMISSION_FACTOR; + UFBX_MATERIAL_FBX_EMISSION_COLOR :: EMISSION_COLOR; + UFBX_MATERIAL_FBX_AMBIENT_FACTOR :: AMBIENT_FACTOR; + UFBX_MATERIAL_FBX_AMBIENT_COLOR :: AMBIENT_COLOR; + UFBX_MATERIAL_FBX_NORMAL_MAP :: NORMAL_MAP; + UFBX_MATERIAL_FBX_BUMP :: BUMP; + UFBX_MATERIAL_FBX_BUMP_FACTOR :: BUMP_FACTOR; + UFBX_MATERIAL_FBX_DISPLACEMENT_FACTOR :: DISPLACEMENT_FACTOR; + UFBX_MATERIAL_FBX_DISPLACEMENT :: DISPLACEMENT; + UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT_FACTOR :: VECTOR_DISPLACEMENT_FACTOR; + UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT :: VECTOR_DISPLACEMENT; + + UFBX_MATERIAL_FBX_MAP_FORCE_32BIT :: MAP_FORCE_32BIT; +} + +anon_enum_25 :: enum s32 { + UFBX_MATERIAL_FBX_MAP_COUNT :: 20; +} + +// Known PBR material properties, matches maps in `ufbx_material_pbr_maps` +ufbx_material_pbr_map :: enum s32 { + BASE_FACTOR :: 0; + BASE_COLOR :: 1; + ROUGHNESS :: 2; + METALNESS :: 3; + DIFFUSE_ROUGHNESS :: 4; + SPECULAR_FACTOR :: 5; + SPECULAR_COLOR :: 6; + SPECULAR_IOR :: 7; + SPECULAR_ANISOTROPY :: 8; + SPECULAR_ROTATION :: 9; + TRANSMISSION_FACTOR :: 10; + TRANSMISSION_COLOR :: 11; + TRANSMISSION_DEPTH :: 12; + TRANSMISSION_SCATTER :: 13; + TRANSMISSION_SCATTER_ANISOTROPY :: 14; + TRANSMISSION_DISPERSION :: 15; + TRANSMISSION_ROUGHNESS :: 16; + TRANSMISSION_EXTRA_ROUGHNESS :: 17; + TRANSMISSION_PRIORITY :: 18; + TRANSMISSION_ENABLE_IN_AOV :: 19; + SUBSURFACE_FACTOR :: 20; + SUBSURFACE_COLOR :: 21; + SUBSURFACE_RADIUS :: 22; + SUBSURFACE_SCALE :: 23; + SUBSURFACE_ANISOTROPY :: 24; + SUBSURFACE_TINT_COLOR :: 25; + SUBSURFACE_TYPE :: 26; + SHEEN_FACTOR :: 27; + SHEEN_COLOR :: 28; + SHEEN_ROUGHNESS :: 29; + COAT_FACTOR :: 30; + COAT_COLOR :: 31; + COAT_ROUGHNESS :: 32; + COAT_IOR :: 33; + COAT_ANISOTROPY :: 34; + COAT_ROTATION :: 35; + COAT_NORMAL :: 36; + COAT_AFFECT_BASE_COLOR :: 37; + COAT_AFFECT_BASE_ROUGHNESS :: 38; + THIN_FILM_THICKNESS :: 39; + THIN_FILM_IOR :: 40; + EMISSION_FACTOR :: 41; + EMISSION_COLOR :: 42; + OPACITY :: 43; + INDIRECT_DIFFUSE :: 44; + INDIRECT_SPECULAR :: 45; + NORMAL_MAP :: 46; + TANGENT_MAP :: 47; + DISPLACEMENT_MAP :: 48; + MATTE_FACTOR :: 49; + MATTE_COLOR :: 50; + AMBIENT_OCCLUSION :: 51; + GLOSSINESS :: 52; + COAT_GLOSSINESS :: 53; + TRANSMISSION_GLOSSINESS :: 54; + + MAP_FORCE_32BIT :: 2147483647; + + UFBX_MATERIAL_PBR_BASE_FACTOR :: BASE_FACTOR; + UFBX_MATERIAL_PBR_BASE_COLOR :: BASE_COLOR; + UFBX_MATERIAL_PBR_ROUGHNESS :: ROUGHNESS; + UFBX_MATERIAL_PBR_METALNESS :: METALNESS; + UFBX_MATERIAL_PBR_DIFFUSE_ROUGHNESS :: DIFFUSE_ROUGHNESS; + UFBX_MATERIAL_PBR_SPECULAR_FACTOR :: SPECULAR_FACTOR; + UFBX_MATERIAL_PBR_SPECULAR_COLOR :: SPECULAR_COLOR; + UFBX_MATERIAL_PBR_SPECULAR_IOR :: SPECULAR_IOR; + UFBX_MATERIAL_PBR_SPECULAR_ANISOTROPY :: SPECULAR_ANISOTROPY; + UFBX_MATERIAL_PBR_SPECULAR_ROTATION :: SPECULAR_ROTATION; + UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR :: TRANSMISSION_FACTOR; + UFBX_MATERIAL_PBR_TRANSMISSION_COLOR :: TRANSMISSION_COLOR; + UFBX_MATERIAL_PBR_TRANSMISSION_DEPTH :: TRANSMISSION_DEPTH; + UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER :: TRANSMISSION_SCATTER; + UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER_ANISOTROPY :: TRANSMISSION_SCATTER_ANISOTROPY; + UFBX_MATERIAL_PBR_TRANSMISSION_DISPERSION :: TRANSMISSION_DISPERSION; + UFBX_MATERIAL_PBR_TRANSMISSION_ROUGHNESS :: TRANSMISSION_ROUGHNESS; + UFBX_MATERIAL_PBR_TRANSMISSION_EXTRA_ROUGHNESS :: TRANSMISSION_EXTRA_ROUGHNESS; + UFBX_MATERIAL_PBR_TRANSMISSION_PRIORITY :: TRANSMISSION_PRIORITY; + UFBX_MATERIAL_PBR_TRANSMISSION_ENABLE_IN_AOV :: TRANSMISSION_ENABLE_IN_AOV; + UFBX_MATERIAL_PBR_SUBSURFACE_FACTOR :: SUBSURFACE_FACTOR; + UFBX_MATERIAL_PBR_SUBSURFACE_COLOR :: SUBSURFACE_COLOR; + UFBX_MATERIAL_PBR_SUBSURFACE_RADIUS :: SUBSURFACE_RADIUS; + UFBX_MATERIAL_PBR_SUBSURFACE_SCALE :: SUBSURFACE_SCALE; + UFBX_MATERIAL_PBR_SUBSURFACE_ANISOTROPY :: SUBSURFACE_ANISOTROPY; + UFBX_MATERIAL_PBR_SUBSURFACE_TINT_COLOR :: SUBSURFACE_TINT_COLOR; + UFBX_MATERIAL_PBR_SUBSURFACE_TYPE :: SUBSURFACE_TYPE; + UFBX_MATERIAL_PBR_SHEEN_FACTOR :: SHEEN_FACTOR; + UFBX_MATERIAL_PBR_SHEEN_COLOR :: SHEEN_COLOR; + UFBX_MATERIAL_PBR_SHEEN_ROUGHNESS :: SHEEN_ROUGHNESS; + UFBX_MATERIAL_PBR_COAT_FACTOR :: COAT_FACTOR; + UFBX_MATERIAL_PBR_COAT_COLOR :: COAT_COLOR; + UFBX_MATERIAL_PBR_COAT_ROUGHNESS :: COAT_ROUGHNESS; + UFBX_MATERIAL_PBR_COAT_IOR :: COAT_IOR; + UFBX_MATERIAL_PBR_COAT_ANISOTROPY :: COAT_ANISOTROPY; + UFBX_MATERIAL_PBR_COAT_ROTATION :: COAT_ROTATION; + UFBX_MATERIAL_PBR_COAT_NORMAL :: COAT_NORMAL; + UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_COLOR :: COAT_AFFECT_BASE_COLOR; + UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_ROUGHNESS :: COAT_AFFECT_BASE_ROUGHNESS; + UFBX_MATERIAL_PBR_THIN_FILM_THICKNESS :: THIN_FILM_THICKNESS; + UFBX_MATERIAL_PBR_THIN_FILM_IOR :: THIN_FILM_IOR; + UFBX_MATERIAL_PBR_EMISSION_FACTOR :: EMISSION_FACTOR; + UFBX_MATERIAL_PBR_EMISSION_COLOR :: EMISSION_COLOR; + UFBX_MATERIAL_PBR_OPACITY :: OPACITY; + UFBX_MATERIAL_PBR_INDIRECT_DIFFUSE :: INDIRECT_DIFFUSE; + UFBX_MATERIAL_PBR_INDIRECT_SPECULAR :: INDIRECT_SPECULAR; + UFBX_MATERIAL_PBR_NORMAL_MAP :: NORMAL_MAP; + UFBX_MATERIAL_PBR_TANGENT_MAP :: TANGENT_MAP; + UFBX_MATERIAL_PBR_DISPLACEMENT_MAP :: DISPLACEMENT_MAP; + UFBX_MATERIAL_PBR_MATTE_FACTOR :: MATTE_FACTOR; + UFBX_MATERIAL_PBR_MATTE_COLOR :: MATTE_COLOR; + UFBX_MATERIAL_PBR_AMBIENT_OCCLUSION :: AMBIENT_OCCLUSION; + UFBX_MATERIAL_PBR_GLOSSINESS :: GLOSSINESS; + UFBX_MATERIAL_PBR_COAT_GLOSSINESS :: COAT_GLOSSINESS; + UFBX_MATERIAL_PBR_TRANSMISSION_GLOSSINESS :: TRANSMISSION_GLOSSINESS; + + UFBX_MATERIAL_PBR_MAP_FORCE_32BIT :: MAP_FORCE_32BIT; +} + +anon_enum_26 :: enum s32 { + UFBX_MATERIAL_PBR_MAP_COUNT :: 55; +} + +// Known material features +ufbx_material_feature :: enum s32 { + PBR :: 0; + METALNESS :: 1; + DIFFUSE :: 2; + SPECULAR :: 3; + EMISSION :: 4; + TRANSMISSION :: 5; + COAT :: 6; + SHEEN :: 7; + OPACITY :: 8; + AMBIENT_OCCLUSION :: 9; + MATTE :: 10; + UNLIT :: 11; + IOR :: 12; + DIFFUSE_ROUGHNESS :: 13; + TRANSMISSION_ROUGHNESS :: 14; + THIN_WALLED :: 15; + CAUSTICS :: 16; + EXIT_TO_BACKGROUND :: 17; + INTERNAL_REFLECTIONS :: 18; + DOUBLE_SIDED :: 19; + ROUGHNESS_AS_GLOSSINESS :: 20; + COAT_ROUGHNESS_AS_GLOSSINESS :: 21; + TRANSMISSION_ROUGHNESS_AS_GLOSSINESS :: 22; + + FORCE_32BIT :: 2147483647; + + UFBX_MATERIAL_FEATURE_PBR :: PBR; + UFBX_MATERIAL_FEATURE_METALNESS :: METALNESS; + UFBX_MATERIAL_FEATURE_DIFFUSE :: DIFFUSE; + UFBX_MATERIAL_FEATURE_SPECULAR :: SPECULAR; + UFBX_MATERIAL_FEATURE_EMISSION :: EMISSION; + UFBX_MATERIAL_FEATURE_TRANSMISSION :: TRANSMISSION; + UFBX_MATERIAL_FEATURE_COAT :: COAT; + UFBX_MATERIAL_FEATURE_SHEEN :: SHEEN; + UFBX_MATERIAL_FEATURE_OPACITY :: OPACITY; + UFBX_MATERIAL_FEATURE_AMBIENT_OCCLUSION :: AMBIENT_OCCLUSION; + UFBX_MATERIAL_FEATURE_MATTE :: MATTE; + UFBX_MATERIAL_FEATURE_UNLIT :: UNLIT; + UFBX_MATERIAL_FEATURE_IOR :: IOR; + UFBX_MATERIAL_FEATURE_DIFFUSE_ROUGHNESS :: DIFFUSE_ROUGHNESS; + UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS :: TRANSMISSION_ROUGHNESS; + UFBX_MATERIAL_FEATURE_THIN_WALLED :: THIN_WALLED; + UFBX_MATERIAL_FEATURE_CAUSTICS :: CAUSTICS; + UFBX_MATERIAL_FEATURE_EXIT_TO_BACKGROUND :: EXIT_TO_BACKGROUND; + UFBX_MATERIAL_FEATURE_INTERNAL_REFLECTIONS :: INTERNAL_REFLECTIONS; + UFBX_MATERIAL_FEATURE_DOUBLE_SIDED :: DOUBLE_SIDED; + UFBX_MATERIAL_FEATURE_ROUGHNESS_AS_GLOSSINESS :: ROUGHNESS_AS_GLOSSINESS; + UFBX_MATERIAL_FEATURE_COAT_ROUGHNESS_AS_GLOSSINESS :: COAT_ROUGHNESS_AS_GLOSSINESS; + UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS_AS_GLOSSINESS :: TRANSMISSION_ROUGHNESS_AS_GLOSSINESS; + + UFBX_MATERIAL_FEATURE_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_27 :: enum s32 { + UFBX_MATERIAL_FEATURE_COUNT :: 23; +} + +ufbx_material_fbx_maps :: struct { + union { + maps: [20] ufbx_material_map; + struct { + diffuse_factor: ufbx_material_map; + diffuse_color: ufbx_material_map; + specular_factor: ufbx_material_map; + specular_color: ufbx_material_map; + specular_exponent: ufbx_material_map; + reflection_factor: ufbx_material_map; + reflection_color: ufbx_material_map; + transparency_factor: ufbx_material_map; + transparency_color: ufbx_material_map; + emission_factor: ufbx_material_map; + emission_color: ufbx_material_map; + ambient_factor: ufbx_material_map; + ambient_color: ufbx_material_map; + normal_map: ufbx_material_map; + bump: ufbx_material_map; + bump_factor: ufbx_material_map; + displacement_factor: ufbx_material_map; + displacement: ufbx_material_map; + vector_displacement_factor: ufbx_material_map; + vector_displacement: ufbx_material_map; + } + } +} + +ufbx_material_pbr_maps :: struct { + union { + maps: [55] ufbx_material_map; + struct { + base_factor: ufbx_material_map; + base_color: ufbx_material_map; + roughness: ufbx_material_map; + metalness: ufbx_material_map; + diffuse_roughness: ufbx_material_map; + specular_factor: ufbx_material_map; + specular_color: ufbx_material_map; + specular_ior: ufbx_material_map; + specular_anisotropy: ufbx_material_map; + specular_rotation: ufbx_material_map; + transmission_factor: ufbx_material_map; + transmission_color: ufbx_material_map; + transmission_depth: ufbx_material_map; + transmission_scatter: ufbx_material_map; + transmission_scatter_anisotropy: ufbx_material_map; + transmission_dispersion: ufbx_material_map; + transmission_roughness: ufbx_material_map; + transmission_extra_roughness: ufbx_material_map; + transmission_priority: ufbx_material_map; + transmission_enable_in_aov: ufbx_material_map; + subsurface_factor: ufbx_material_map; + subsurface_color: ufbx_material_map; + subsurface_radius: ufbx_material_map; + subsurface_scale: ufbx_material_map; + subsurface_anisotropy: ufbx_material_map; + subsurface_tint_color: ufbx_material_map; + subsurface_type: ufbx_material_map; + sheen_factor: ufbx_material_map; + sheen_color: ufbx_material_map; + sheen_roughness: ufbx_material_map; + coat_factor: ufbx_material_map; + coat_color: ufbx_material_map; + coat_roughness: ufbx_material_map; + coat_ior: ufbx_material_map; + coat_anisotropy: ufbx_material_map; + coat_rotation: ufbx_material_map; + coat_normal: ufbx_material_map; + coat_affect_base_color: ufbx_material_map; + coat_affect_base_roughness: ufbx_material_map; + thin_film_thickness: ufbx_material_map; + thin_film_ior: ufbx_material_map; + emission_factor: ufbx_material_map; + emission_color: ufbx_material_map; + opacity: ufbx_material_map; + indirect_diffuse: ufbx_material_map; + indirect_specular: ufbx_material_map; + normal_map: ufbx_material_map; + tangent_map: ufbx_material_map; + displacement_map: ufbx_material_map; + matte_factor: ufbx_material_map; + matte_color: ufbx_material_map; + ambient_occlusion: ufbx_material_map; + glossiness: ufbx_material_map; + coat_glossiness: ufbx_material_map; + transmission_glossiness: ufbx_material_map; + } + } +} + +ufbx_material_features :: struct { + union { + features: [23] ufbx_material_feature_info; + struct { + pbr: ufbx_material_feature_info; + metalness: ufbx_material_feature_info; + diffuse: ufbx_material_feature_info; + specular: ufbx_material_feature_info; + emission: ufbx_material_feature_info; + transmission: ufbx_material_feature_info; + coat: ufbx_material_feature_info; + sheen: ufbx_material_feature_info; + opacity: ufbx_material_feature_info; + ambient_occlusion: ufbx_material_feature_info; + matte: ufbx_material_feature_info; + unlit: ufbx_material_feature_info; + ior: ufbx_material_feature_info; + diffuse_roughness: ufbx_material_feature_info; + transmission_roughness: ufbx_material_feature_info; + thin_walled: ufbx_material_feature_info; + caustics: ufbx_material_feature_info; + exit_to_background: ufbx_material_feature_info; + internal_reflections: ufbx_material_feature_info; + double_sided: ufbx_material_feature_info; + roughness_as_glossiness: ufbx_material_feature_info; + coat_roughness_as_glossiness: ufbx_material_feature_info; + transmission_roughness_as_glossiness: ufbx_material_feature_info; + } + } +} + +// Surface material properties such as color, roughness, etc. Each property may +// be optionally bound to an `ufbx_texture`. +ufbx_material :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // FBX builtin properties + // NOTE: These may be empty if the material is using a custom shader + fbx: ufbx_material_fbx_maps; + + // PBR material properties, defined for all shading models but may be + // somewhat approximate if `shader == NULL`. + pbr: ufbx_material_pbr_maps; + + // Material features, primarily applies to `pbr`. + features: ufbx_material_features; + + shader_type: ufbx_shader_type; // < Always defined + shader: *ufbx_shader; // < Optional extended shader information + shading_model_name: ufbx_string; // < Often one of `{ "lambert", "phong", "unknown" }` + + // Prefix before shader property names with trailing `|`. + // For example `"3dsMax|Parameters|"` where properties would have names like + // `"3dsMax|Parameters|base_color"`. You can ignore this if you use the built-in + // `ufbx_material_fbx_maps fbx` and `ufbx_material_pbr_maps pbr` structures. + shader_prop_prefix: ufbx_string; + + textures: ufbx_material_texture_list; // < Sorted by `material_prop` +} + +ufbx_texture_type :: enum s32 { + FILE :: 0; + + LAYERED :: 1; + + PROCEDURAL :: 2; + + SHADER :: 3; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_TEXTURE_FILE :: FILE; + + UFBX_TEXTURE_LAYERED :: LAYERED; + + UFBX_TEXTURE_PROCEDURAL :: PROCEDURAL; + + UFBX_TEXTURE_SHADER :: SHADER; + + UFBX_TEXTURE_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_28 :: enum s32 { + UFBX_TEXTURE_TYPE_COUNT :: 4; +} + +// Blend modes to combine layered textures with, compatible with common blend +// mode definitions in many art programs. Simpler blend modes have equations +// specified below where `src` is the layer to compososite over `dst`. +// See eg. https://www.w3.org/TR/2013/WD-compositing-1-20131010/#blendingseparable +ufbx_blend_mode :: enum s32 { + TRANSLUCENT :: 0; + ADDITIVE :: 1; + MULTIPLY :: 2; + MULTIPLY_2X :: 3; + OVER :: 4; + REPLACE :: 5; + DISSOLVE :: 6; + DARKEN :: 7; + COLOR_BURN :: 8; + LINEAR_BURN :: 9; + DARKER_COLOR :: 10; + LIGHTEN :: 11; + SCREEN :: 12; + COLOR_DODGE :: 13; + LINEAR_DODGE :: 14; + LIGHTER_COLOR :: 15; + SOFT_LIGHT :: 16; + HARD_LIGHT :: 17; + VIVID_LIGHT :: 18; + LINEAR_LIGHT :: 19; + PIN_LIGHT :: 20; + HARD_MIX :: 21; + DIFFERENCE :: 22; + EXCLUSION :: 23; + SUBTRACT :: 24; + DIVIDE :: 25; + HUE :: 26; + SATURATION :: 27; + COLOR :: 28; + LUMINOSITY :: 29; + OVERLAY :: 30; + + MODE_FORCE_32BIT :: 2147483647; + + UFBX_BLEND_TRANSLUCENT :: TRANSLUCENT; + UFBX_BLEND_ADDITIVE :: ADDITIVE; + UFBX_BLEND_MULTIPLY :: MULTIPLY; + UFBX_BLEND_MULTIPLY_2X :: MULTIPLY_2X; + UFBX_BLEND_OVER :: OVER; + UFBX_BLEND_REPLACE :: REPLACE; + UFBX_BLEND_DISSOLVE :: DISSOLVE; + UFBX_BLEND_DARKEN :: DARKEN; + UFBX_BLEND_COLOR_BURN :: COLOR_BURN; + UFBX_BLEND_LINEAR_BURN :: LINEAR_BURN; + UFBX_BLEND_DARKER_COLOR :: DARKER_COLOR; + UFBX_BLEND_LIGHTEN :: LIGHTEN; + UFBX_BLEND_SCREEN :: SCREEN; + UFBX_BLEND_COLOR_DODGE :: COLOR_DODGE; + UFBX_BLEND_LINEAR_DODGE :: LINEAR_DODGE; + UFBX_BLEND_LIGHTER_COLOR :: LIGHTER_COLOR; + UFBX_BLEND_SOFT_LIGHT :: SOFT_LIGHT; + UFBX_BLEND_HARD_LIGHT :: HARD_LIGHT; + UFBX_BLEND_VIVID_LIGHT :: VIVID_LIGHT; + UFBX_BLEND_LINEAR_LIGHT :: LINEAR_LIGHT; + UFBX_BLEND_PIN_LIGHT :: PIN_LIGHT; + UFBX_BLEND_HARD_MIX :: HARD_MIX; + UFBX_BLEND_DIFFERENCE :: DIFFERENCE; + UFBX_BLEND_EXCLUSION :: EXCLUSION; + UFBX_BLEND_SUBTRACT :: SUBTRACT; + UFBX_BLEND_DIVIDE :: DIVIDE; + UFBX_BLEND_HUE :: HUE; + UFBX_BLEND_SATURATION :: SATURATION; + UFBX_BLEND_COLOR :: COLOR; + UFBX_BLEND_LUMINOSITY :: LUMINOSITY; + UFBX_BLEND_OVERLAY :: OVERLAY; + + UFBX_BLEND_MODE_FORCE_32BIT :: MODE_FORCE_32BIT; +} + +anon_enum_29 :: enum s32 { + UFBX_BLEND_MODE_COUNT :: 31; +} + +// Blend modes to combine layered textures with, compatible with common blend +ufbx_wrap_mode :: enum s32 { + REPEAT :: 0; + CLAMP :: 1; + + MODE_FORCE_32BIT :: 2147483647; + + UFBX_WRAP_REPEAT :: REPEAT; + UFBX_WRAP_CLAMP :: CLAMP; + + UFBX_WRAP_MODE_FORCE_32BIT :: MODE_FORCE_32BIT; +} + +anon_enum_30 :: enum s32 { + UFBX_WRAP_MODE_COUNT :: 2; +} + +// Single layer in a layered texture +ufbx_texture_layer :: struct { + texture: *ufbx_texture; // < The inner texture to evaluate, never `NULL` + blend_mode: ufbx_blend_mode; // < Equation to combine the layer to the background + alpha: ufbx_real; // < Blend weight of this layer +} + +ufbx_texture_layer_list :: struct { + data: *ufbx_texture_layer; + count: size_t; +} + +ufbx_shader_texture_type :: enum s32 { + UNKNOWN :: 0; + + SELECT_OUTPUT :: 1; + + OSL :: 2; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_SHADER_TEXTURE_UNKNOWN :: UNKNOWN; + + UFBX_SHADER_TEXTURE_SELECT_OUTPUT :: SELECT_OUTPUT; + + UFBX_SHADER_TEXTURE_OSL :: OSL; + + UFBX_SHADER_TEXTURE_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_31 :: enum s32 { + UFBX_SHADER_TEXTURE_TYPE_COUNT :: 3; +} + +ufbx_shader_texture_input :: struct { + // Name of the input. + name: ufbx_string; + + // Constant value of the input. + union { + value_real: ufbx_real; + value_vec2: ufbx_vec2; + value_vec3: ufbx_vec3; + value_vec4: ufbx_vec4; + } + + value_int: s64; + value_str: ufbx_string; + value_blob: ufbx_blob; + + // Texture connected to this input. + texture: *ufbx_texture; + + // Index of the output to use if `texture` is a multi-output shader node. + texture_output_index: s64; + + // Controls whether shading should use `texture`. + // NOTE: Some shading models allow this to be `true` even if `texture == NULL`. + texture_enabled: bool; + + // Property representing this input. + prop: *ufbx_prop; + + // Property representing `texture`. + texture_prop: *ufbx_prop; + + // Property representing `texture_enabled`. + texture_enabled_prop: *ufbx_prop; +} + +ufbx_shader_texture_input_list :: struct { + data: *ufbx_shader_texture_input; + count: size_t; +} + +ufbx_shader_texture :: struct { + // Type of this shader node. + type: ufbx_shader_texture_type; + + // Name of the shader to use. + shader_name: ufbx_string; + + // 64-bit opaque identifier for the shader type. + shader_type_id: u64; + + // Input values/textures (possibly further shader textures) to the shader. + // Sorted by `ufbx_shader_texture_input.name`. + inputs: ufbx_shader_texture_input_list; + + // Shader source code if found. + shader_source: ufbx_string; + raw_shader_source: ufbx_blob; + + // Representative texture for this shader. + // Only specified if `main_texture.outputs[main_texture_output_index]` is semantically + // equivalent to this texture. + main_texture: *ufbx_texture; + + // Output index of `main_texture` if it is a multi-output shader. + main_texture_output_index: s64; + + // Prefix for properties related to this shader in `ufbx_texture`. + // NOTE: Contains the trailing '|' if not empty. + prop_prefix: ufbx_string; +} + +// Unique texture within the file. +ufbx_texture_file :: struct { + // Index in `ufbx_scene.texture_files[]`. + index: u32; + + // Paths to the resource. + filename: ufbx_string; + absolute_filename: ufbx_string; + relative_filename: ufbx_string; + raw_filename: ufbx_blob; + raw_absolute_filename: ufbx_blob; + raw_relative_filename: ufbx_blob; + + // Optional embedded content blob, eg. raw .png format data + content: ufbx_blob; +} + +ufbx_texture_file_list :: struct { + data: *ufbx_texture_file; + count: size_t; +} + +// Texture that controls material appearance +ufbx_texture :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // Texture type (file / layered / procedural / shader) + type: ufbx_texture_type; + + // FILE: Paths to the resource + filename: ufbx_string; + absolute_filename: ufbx_string; + relative_filename: ufbx_string; + raw_filename: ufbx_blob; + raw_absolute_filename: ufbx_blob; + raw_relative_filename: ufbx_blob; + + // FILE: Optional embedded content blob, eg. raw .png format data + content: ufbx_blob; + + // FILE: Optional video texture + video: *ufbx_video; + + // FILE: Index into `ufbx_scene.texture_files[]` or `UFBX_NO_INDEX`. + file_index: u32; + + // FILE: True if `file_index` has a valid value. + has_file: bool; + + // LAYERED: Inner texture layers, ordered from _bottom_ to _top_ + layers: ufbx_texture_layer_list; + + // SHADER: Shader information + // NOTE: May be specified even if `type == UFBX_TEXTURE_FILE` if `ufbx_load_opts.disable_quirks` + // is _not_ specified. Some known shaders that represent files are interpreted as `UFBX_TEXTURE_FILE`. + shader: *ufbx_shader_texture; + + // List of file textures representing this texture. + // Defined even if `type == UFBX_TEXTURE_FILE` in which case the array contains only itself. + file_textures: ufbx_texture_list; + + // Name of the UV set to use + uv_set: ufbx_string; + + // Wrapping mode + wrap_u: ufbx_wrap_mode; + wrap_v: ufbx_wrap_mode; + + has_uv_transform: bool; // < Has a non-identity `transform` and derived matrices. + uv_transform: ufbx_transform #align 7; // < Texture transformation in UV space + texture_to_uv: ufbx_matrix; // < Matrix representation of `transform` + uv_to_texture: ufbx_matrix; // < UV coordinate to normalized texture coordinate matrix +} + +// TODO: Video textures +ufbx_video :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // Paths to the resource + filename: ufbx_string; + absolute_filename: ufbx_string; + relative_filename: ufbx_string; + raw_filename: ufbx_blob; + raw_absolute_filename: ufbx_blob; + raw_relative_filename: ufbx_blob; + + // Optional embedded content blob + content: ufbx_blob; +} + +// Shader specifies a shading model and contains `ufbx_shader_binding` elements +// that define how to interpret FBX properties in the shader. +ufbx_shader :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // Known shading model + type: ufbx_shader_type; + + // Bindings from FBX properties to the shader + // HINT: `ufbx_find_shader_prop()` translates shader properties to FBX properties + bindings: ufbx_shader_binding_list; +} + +// Binding from a material property to shader implementation +ufbx_shader_prop_binding :: struct { + shader_prop: ufbx_string; // < Property name used by the shader implementation + material_prop: ufbx_string; // < Property name inside `ufbx_material.props` +} + +ufbx_shader_prop_binding_list :: struct { + data: *ufbx_shader_prop_binding; + count: size_t; +} + +// Shader binding table +ufbx_shader_binding :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + prop_bindings: ufbx_shader_prop_binding_list; // < Sorted by `shader_prop` +} + +// -- Animation +ufbx_anim_layer_desc :: struct { + layer: *ufbx_anim_layer; + weight: ufbx_real; +} + +ufbx_const_anim_layer_desc_list :: struct { + data: *ufbx_anim_layer_desc; + count: size_t; +} + +ufbx_prop_override :: struct { + // Element (`ufbx_element.id`) to override the property from + // NOTE: You can get this from typed structs eg. `my_node->element.id` + element_id: u32; + + // Property name to override. + prop_name: *u8; + + // Override value, use `value.x` for scalars. `value_int` is initialized + // from `value.x` if zero so keep `value` zeroed even if you don't need it! + value: ufbx_vec3; + value_str: *u8; + value_int: s64; + + // Internal: Gets filled automatically by `ufbx_prepare_prop_overrides()` + _internal_key: u32; +} + +ufbx_const_prop_override_list :: struct { + data: *ufbx_prop_override; + count: size_t; +} + +ufbx_anim :: struct { + layers: ufbx_const_anim_layer_desc_list; + + // Override individual `ufbx_prop` values from elements + // NOTE: Call `ufbx_prepare_prop_overrides()` to obtain this! + prop_overrides: ufbx_const_prop_override_list; + + ignore_connections: bool; + + // Not used by evaluation + time_begin: float64; + time_end: float64; +} + +ufbx_anim_stack :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + time_begin: float64; + time_end: float64; + + layers: ufbx_anim_layer_list; + anim: ufbx_anim; +} + +ufbx_anim_prop :: struct { + element: *ufbx_element; + _internal_key: u32; + prop_name: ufbx_string; + anim_value: *ufbx_anim_value; +} + +ufbx_anim_prop_list :: struct { + data: *ufbx_anim_prop; + count: size_t; +} + +ufbx_anim_layer :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + weight: ufbx_real; + weight_is_animated: bool; + blended: bool; + additive: bool; + compose_rotation: bool; + compose_scale: bool; + + anim_values: ufbx_anim_value_list; + anim_props: ufbx_anim_prop_list; // < Sorted by `element,prop_name` + + anim: ufbx_anim; + + _min_element_id: u32; + _max_element_id: u32; + _element_id_bitmask: [4] u32; +} + +ufbx_anim_value :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + } + } + + default_value: ufbx_vec3; + curves: [3] *ufbx_anim_curve; +} + +// Animation curve segment interpolation mode between two keyframes +ufbx_interpolation :: enum s32 { + CONSTANT_PREV :: 0; + CONSTANT_NEXT :: 1; + LINEAR :: 2; + CUBIC :: 3; + + FORCE_32BIT :: 2147483647; + + UFBX_INTERPOLATION_CONSTANT_PREV :: CONSTANT_PREV; + UFBX_INTERPOLATION_CONSTANT_NEXT :: CONSTANT_NEXT; + UFBX_INTERPOLATION_LINEAR :: LINEAR; + UFBX_INTERPOLATION_CUBIC :: CUBIC; + + UFBX_INTERPOLATION_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_32 :: enum s32 { + UFBX_INTERPOLATION_COUNT :: 4; +} + +// Tangent vector at a keyframe, may be split into left/right +ufbx_tangent :: struct { + dx: float; // < Derivative in the time axis + dy: float; // < Derivative in the (curve specific) value axis +} + +// Single real `value` at a specified `time`, interpolation between two keyframes +// is determined by the `interpolation` field of the _previous_ key. +// If `interpolation == UFBX_INTERPOLATION_CUBIC` the span is evaluated as a +// cubic bezier curve through the following points: +// +// (prev->time, prev->value) +// (prev->time + prev->right.dx, prev->value + prev->right.dy) +// (next->time - next->left.dx, next->value - next->left.dy) +// (next->time, next->value) +// +// HINT: You can use `ufbx_evaluate_curve(ufbx_anim_curve *curve, double time)` +// rather than trying to manually handle all the interpolation modes. +ufbx_keyframe :: struct { + time: float64; + value: ufbx_real; + interpolation: ufbx_interpolation; + left: ufbx_tangent; + right: ufbx_tangent; +} + +ufbx_keyframe_list :: struct { + data: *ufbx_keyframe; + count: size_t; +} + +ufbx_anim_curve :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + keyframes: ufbx_keyframe_list; +} + +// Collection of nodes to hide/freeze +ufbx_display_layer :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // Nodes included in the layer (exclusively at most one layer per node) + nodes: ufbx_node_list; + + visible: bool; // < Contained nodes are visible + frozen: bool; // < Contained nodes cannot be edited + + ui_color: ufbx_vec3 #align 6; // < Visual color for UI +} + +// Named set of nodes/geometry features to select. +ufbx_selection_set :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // Included nodes and geometry features + nodes: ufbx_selection_node_list; +} + +// Selection state of a node, potentially contains vertex/edge/face selection as well. +ufbx_selection_node :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // Selection targets, possibly `NULL` + target_node: *ufbx_node; + target_mesh: *ufbx_mesh; + include_node: bool; // < Is `target_node` included in the selection + + vertices: ufbx_uint32_list; // < Indices to `ufbx_mesh.vertices` + edges: ufbx_uint32_list; // < Indices to `ufbx_mesh.edges` + faces: ufbx_uint32_list; // < Indices to `ufbx_mesh.faces` +} + +// -- Constraints +ufbx_character :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } +} + +// Type of property constrain eg. position or look-at +ufbx_constraint_type :: enum s32 { + UNKNOWN :: 0; + AIM :: 1; + PARENT :: 2; + POSITION :: 3; + ROTATION :: 4; + SCALE :: 5; + + SINGLE_CHAIN_IK :: 6; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_CONSTRAINT_UNKNOWN :: UNKNOWN; + UFBX_CONSTRAINT_AIM :: AIM; + UFBX_CONSTRAINT_PARENT :: PARENT; + UFBX_CONSTRAINT_POSITION :: POSITION; + UFBX_CONSTRAINT_ROTATION :: ROTATION; + UFBX_CONSTRAINT_SCALE :: SCALE; + + UFBX_CONSTRAINT_SINGLE_CHAIN_IK :: SINGLE_CHAIN_IK; + + UFBX_CONSTRAINT_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_33 :: enum s32 { + UFBX_CONSTRAINT_TYPE_COUNT :: 7; +} + +// Target to follow with a constraint +ufbx_constraint_target :: struct { + node: *ufbx_node; // < Target node reference + weight: ufbx_real; // < Relative weight to other targets (does not always sum to 1) + transform: ufbx_transform; // < Offset from the actual target +} + +ufbx_constraint_target_list :: struct { + data: *ufbx_constraint_target; + count: size_t; +} + +// Method to determine the up vector in aim constraints +ufbx_constraint_aim_up_type :: enum s32 { + SCENE :: 0; + TO_NODE :: 1; + ALIGN_NODE :: 2; + VECTOR :: 3; + NONE :: 4; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_CONSTRAINT_AIM_UP_SCENE :: SCENE; + UFBX_CONSTRAINT_AIM_UP_TO_NODE :: TO_NODE; + UFBX_CONSTRAINT_AIM_UP_ALIGN_NODE :: ALIGN_NODE; + UFBX_CONSTRAINT_AIM_UP_VECTOR :: VECTOR; + UFBX_CONSTRAINT_AIM_UP_NONE :: NONE; + + UFBX_CONSTRAINT_AIM_UP_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_34 :: enum s32 { + UFBX_CONSTRAINT_AIM_UP_TYPE_COUNT :: 5; +} + +// Method to determine the up vector in aim constraints +ufbx_constraint_ik_pole_type :: enum s32 { + VECTOR :: 0; + NODE :: 1; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_CONSTRAINT_IK_POLE_VECTOR :: VECTOR; + UFBX_CONSTRAINT_IK_POLE_NODE :: NODE; + + UFBX_CONSTRAINT_IK_POLE_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_35 :: enum s32 { + UFBX_CONSTRAINT_IK_POLE_TYPE_COUNT :: 2; +} + +ufbx_constraint :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + // Type of constraint to use + type: ufbx_constraint_type; + type_name: ufbx_string; + + // Node to be constrained + node: *ufbx_node; + + // List of weighted targets for the constraint (pole vectors for IK) + targets: ufbx_constraint_target_list; + + // State of the constraint + weight: ufbx_real; + active: bool; + + // Translation/rotation/scale axes the constraint is applied to + constrain_translation: [3] bool; + constrain_rotation: [3] bool; + constrain_scale: [3] bool; + + // Offset from the constrained position + transform_offset: ufbx_transform #align 6; + + // AIM: Target and up vectors + aim_vector: ufbx_vec3; + aim_up_type: ufbx_constraint_aim_up_type; + aim_up_node: *ufbx_node; + aim_up_vector: ufbx_vec3; + + // SINGLE_CHAIN_IK: Target for the IK, `targets` contains pole vectors! + ik_effector: *ufbx_node; + ik_end_node: *ufbx_node; + ik_pole_vector: ufbx_vec3; +} + +// -- Miscellaneous +ufbx_bone_pose :: struct { + bone_node: *ufbx_node; + bone_to_world: ufbx_matrix; +} + +ufbx_bone_pose_list :: struct { + data: *ufbx_bone_pose; + count: size_t; +} + +ufbx_pose :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } + + bind_pose: bool; + bone_poses: ufbx_bone_pose_list; +} + +ufbx_metadata_object :: struct { + union { + element: ufbx_element; + struct { + name: ufbx_string; + props: ufbx_props; + element_id: u32; + typed_id: u32; + } + } +} + +// -- Named elements +ufbx_name_element :: struct { + name: ufbx_string; + type: ufbx_element_type; + _internal_key: u32; + element: *ufbx_element; +} + +ufbx_name_element_list :: struct { + data: *ufbx_name_element; + count: size_t; +} + +// Scene is the root object loaded by ufbx that everything is accessed from. +ufbx_exporter :: enum s32 { + UNKNOWN :: 0; + FBX_SDK :: 1; + BLENDER_BINARY :: 2; + BLENDER_ASCII :: 3; + MOTION_BUILDER :: 4; + BC_UNITY_EXPORTER :: 5; + + FORCE_32BIT :: 2147483647; + + UFBX_EXPORTER_UNKNOWN :: UNKNOWN; + UFBX_EXPORTER_FBX_SDK :: FBX_SDK; + UFBX_EXPORTER_BLENDER_BINARY :: BLENDER_BINARY; + UFBX_EXPORTER_BLENDER_ASCII :: BLENDER_ASCII; + UFBX_EXPORTER_MOTION_BUILDER :: MOTION_BUILDER; + UFBX_EXPORTER_BC_UNITY_EXPORTER :: BC_UNITY_EXPORTER; + + UFBX_EXPORTER_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_36 :: enum s32 { + UFBX_EXPORTER_COUNT :: 6; +} + +ufbx_application :: struct { + vendor: ufbx_string; + name: ufbx_string; + version: ufbx_string; +} + +ufbx_file_format :: enum s32 { + UNKNOWN :: 0; + FBX :: 1; + OBJ :: 2; + MTL :: 3; + + FORCE_32BIT :: 2147483647; + + UFBX_FILE_FORMAT_UNKNOWN :: UNKNOWN; + UFBX_FILE_FORMAT_FBX :: FBX; + UFBX_FILE_FORMAT_OBJ :: OBJ; + UFBX_FILE_FORMAT_MTL :: MTL; + + UFBX_FILE_FORMAT_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_37 :: enum s32 { + UFBX_FILE_FORMAT_COUNT :: 4; +} + +ufbx_warning_type :: enum s32 { + MISSING_EXTERNAL_FILE :: 0; + + IMPLICIT_MTL :: 1; + + TRUNCATED_ARRAY :: 2; + + INDEX_CLAMPED :: 3; + + BAD_UNICODE :: 4; + + BAD_ELEMENT_CONNECTED_TO_ROOT :: 5; + + DUPLICATE_OBJECT_ID :: 6; + + EMPTY_FACE_REMOVED :: 7; + + UNKNOWN_OBJ_DIRECTIVE :: 8; + + TYPE_FIRST_DEDUPLICATED :: 3; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_WARNING_MISSING_EXTERNAL_FILE :: MISSING_EXTERNAL_FILE; + + UFBX_WARNING_IMPLICIT_MTL :: IMPLICIT_MTL; + + UFBX_WARNING_TRUNCATED_ARRAY :: TRUNCATED_ARRAY; + + UFBX_WARNING_INDEX_CLAMPED :: INDEX_CLAMPED; + + UFBX_WARNING_BAD_UNICODE :: BAD_UNICODE; + + UFBX_WARNING_BAD_ELEMENT_CONNECTED_TO_ROOT :: BAD_ELEMENT_CONNECTED_TO_ROOT; + + UFBX_WARNING_DUPLICATE_OBJECT_ID :: DUPLICATE_OBJECT_ID; + + UFBX_WARNING_EMPTY_FACE_REMOVED :: EMPTY_FACE_REMOVED; + + UFBX_WARNING_UNKNOWN_OBJ_DIRECTIVE :: UNKNOWN_OBJ_DIRECTIVE; + + UFBX_WARNING_TYPE_FIRST_DEDUPLICATED :: TYPE_FIRST_DEDUPLICATED; + + UFBX_WARNING_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_38 :: enum s32 { + UFBX_WARNING_TYPE_COUNT :: 9; +} + +// Warning about a non-fatal issue in the file. +// Often contains information about issues that ufbx has corrected about the +// file but it might indicate something is not working properly. +ufbx_warning :: struct { + // Type of the warning. + type: ufbx_warning_type; + + // Description of the warning. + description: ufbx_string; + + // Number of times this warning was encountered. + count: size_t; +} + +ufbx_warning_list :: struct { + data: *ufbx_warning; + count: size_t; +} + +// Miscellaneous data related to the loaded file +ufbx_metadata :: struct { + // List of non-fatal warnings about the file. + // If you need to only check whether a specific warning was triggered you + // can use `ufbx_metadata.has_warning[]`. + warnings: ufbx_warning_list; + + // FBX ASCII file format. + ascii: bool; + + // FBX version in integer format, eg. 7400 for 7.4. + version: u32; + + // File format of the source file. + file_format: ufbx_file_format; + + // Index arrays may contain `UFBX_NO_INDEX` instead of a valid index + // to indicate gaps. + may_contain_no_index: bool; + + // May contain `ufbx_mesh_material` entries where `ufbx_mesh_material.material == NULL`. + // NOTE: The corresponding `ufbx_node.material[]` will be empty in this case. + may_contain_null_materials: bool; + + // May contain meshes with no defined vertex position. + // NOTE: `ufbx_mesh.vertex_position.exists` may be `false`! + may_contain_missing_vertex_position: bool; + + // Arrays may contain items with `NULL` element references. + // See `ufbx_load_opts.connect_broken_elements`. + may_contain_broken_elements: bool; + + // Some API guarantees do not apply (depending on unsafe options used). + // Loaded with `ufbx_load_opts.allow_unsafe` enabled. + is_unsafe: bool; + + // Flag for each possible warning type. + // See `ufbx_metadata.warnings[]` for detailed warning information. + has_warning: [9] bool; + + creator: ufbx_string; + big_endian: bool; + + filename: ufbx_string; + relative_root: ufbx_string; + + raw_filename: ufbx_blob; + raw_relative_root: ufbx_blob; + + exporter: ufbx_exporter; + exporter_version: u32; + + scene_props: ufbx_props; + + original_application: ufbx_application; + latest_application: ufbx_application; + + geometry_ignored: bool; + animation_ignored: bool; + embedded_ignored: bool; + + max_face_triangles: size_t; + + result_memory_used: size_t; + temp_memory_used: size_t; + result_allocs: size_t; + temp_allocs: size_t; + + element_buffer_size: size_t; + num_shader_textures: size_t; + + bone_prop_size_unit: ufbx_real; + bone_prop_limb_length_relative: bool; + ktime_to_sec: float64; + + original_file_path: ufbx_string; + raw_original_file_path: ufbx_blob; +} + +ufbx_time_mode :: enum s32 { + DEFAULT :: 0; + _120_FPS :: 1; + _100_FPS :: 2; + _60_FPS :: 3; + _50_FPS :: 4; + _48_FPS :: 5; + _30_FPS :: 6; + _30_FPS_DROP :: 7; + NTSC_DROP_FRAME :: 8; + NTSC_FULL_FRAME :: 9; + PAL :: 10; + _24_FPS :: 11; + _1000_FPS :: 12; + FILM_FULL_FRAME :: 13; + CUSTOM :: 14; + _96_FPS :: 15; + _72_FPS :: 16; + _59_94_FPS :: 17; + + FORCE_32BIT :: 2147483647; + + UFBX_TIME_MODE_DEFAULT :: DEFAULT; + UFBX_TIME_MODE_120_FPS :: _120_FPS; + UFBX_TIME_MODE_100_FPS :: _100_FPS; + UFBX_TIME_MODE_60_FPS :: _60_FPS; + UFBX_TIME_MODE_50_FPS :: _50_FPS; + UFBX_TIME_MODE_48_FPS :: _48_FPS; + UFBX_TIME_MODE_30_FPS :: _30_FPS; + UFBX_TIME_MODE_30_FPS_DROP :: _30_FPS_DROP; + UFBX_TIME_MODE_NTSC_DROP_FRAME :: NTSC_DROP_FRAME; + UFBX_TIME_MODE_NTSC_FULL_FRAME :: NTSC_FULL_FRAME; + UFBX_TIME_MODE_PAL :: PAL; + UFBX_TIME_MODE_24_FPS :: _24_FPS; + UFBX_TIME_MODE_1000_FPS :: _1000_FPS; + UFBX_TIME_MODE_FILM_FULL_FRAME :: FILM_FULL_FRAME; + UFBX_TIME_MODE_CUSTOM :: CUSTOM; + UFBX_TIME_MODE_96_FPS :: _96_FPS; + UFBX_TIME_MODE_72_FPS :: _72_FPS; + UFBX_TIME_MODE_59_94_FPS :: _59_94_FPS; + + UFBX_TIME_MODE_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_39 :: enum s32 { + UFBX_TIME_MODE_COUNT :: 18; +} + +ufbx_time_protocol :: enum s32 { + SMPTE :: 0; + FRAME_COUNT :: 1; + DEFAULT :: 2; + + FORCE_32BIT :: 2147483647; + + UFBX_TIME_PROTOCOL_SMPTE :: SMPTE; + UFBX_TIME_PROTOCOL_FRAME_COUNT :: FRAME_COUNT; + UFBX_TIME_PROTOCOL_DEFAULT :: DEFAULT; + + UFBX_TIME_PROTOCOL_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_40 :: enum s32 { + UFBX_TIME_PROTOCOL_COUNT :: 3; +} + +ufbx_snap_mode :: enum s32 { + NONE :: 0; + SNAP :: 1; + PLAY :: 2; + SNAP_AND_PLAY :: 3; + + FORCE_32BIT :: 2147483647; + + UFBX_SNAP_MODE_NONE :: NONE; + UFBX_SNAP_MODE_SNAP :: SNAP; + UFBX_SNAP_MODE_PLAY :: PLAY; + UFBX_SNAP_MODE_SNAP_AND_PLAY :: SNAP_AND_PLAY; + + UFBX_SNAP_MODE_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_41 :: enum s32 { + UFBX_SNAP_MODE_COUNT :: 4; +} + +// Global settings: Axes and time/unit scales +ufbx_scene_settings :: struct { + props: ufbx_props; + + // Mapping of X/Y/Z axes to world-space directions. + // HINT: Use `ufbx_load_opts.target_axes` to normalize this. + // NOTE: This contains the _original_ axes even if you supply `ufbx_load_opts.target_axes`. + axes: ufbx_coordinate_axes; + + // How many meters does a single world-space unit represent. + // FBX files usually default to centimeters, reported as `0.01` here. + // HINT: Use `ufbx_load_opts.target_unit_meters` to normalize this. + unit_meters: ufbx_real; + + frames_per_second: float64; + + ambient_color: ufbx_vec3; + default_camera: ufbx_string; + + time_mode: ufbx_time_mode; + time_protocol: ufbx_time_protocol; + snap_mode: ufbx_snap_mode; + + // Original settings (?) + original_axis_up: ufbx_coordinate_axis; + original_unit_meters: ufbx_real; +} + +ufbx_scene :: struct { + metadata: ufbx_metadata; + + // Global settings + settings: ufbx_scene_settings; + + // Node instances in the scene + root_node: *ufbx_node; + + // Default animation descriptor + anim: ufbx_anim; + + // All animation stacks combined + combined_anim: ufbx_anim; + + union { + struct { + unknowns: ufbx_unknown_list; + + // Nodes + nodes: ufbx_node_list; + + // Node attributes (common) + meshes: ufbx_mesh_list; + lights: ufbx_light_list; + cameras: ufbx_camera_list; + bones: ufbx_bone_list; + empties: ufbx_empty_list; + + // Node attributes (curves/surfaces) + line_curves: ufbx_line_curve_list; + nurbs_curves: ufbx_nurbs_curve_list; + nurbs_surfaces: ufbx_nurbs_surface_list; + nurbs_trim_surfaces: ufbx_nurbs_trim_surface_list; + nurbs_trim_boundaries: ufbx_nurbs_trim_boundary_list; + + // Node attributes (advanced) + procedural_geometries: ufbx_procedural_geometry_list; + stereo_cameras: ufbx_stereo_camera_list; + camera_switchers: ufbx_camera_switcher_list; + markers: ufbx_marker_list; + lod_groups: ufbx_lod_group_list; + + // Deformers + skin_deformers: ufbx_skin_deformer_list; + skin_clusters: ufbx_skin_cluster_list; + blend_deformers: ufbx_blend_deformer_list; + blend_channels: ufbx_blend_channel_list; + blend_shapes: ufbx_blend_shape_list; + cache_deformers: ufbx_cache_deformer_list; + cache_files: ufbx_cache_file_list; + + // Materials + materials: ufbx_material_list; + textures: ufbx_texture_list; + videos: ufbx_video_list; + shaders: ufbx_shader_list; + shader_bindings: ufbx_shader_binding_list; + + // Animation + anim_stacks: ufbx_anim_stack_list; + anim_layers: ufbx_anim_layer_list; + anim_values: ufbx_anim_value_list; + anim_curves: ufbx_anim_curve_list; + + // Collections + display_layers: ufbx_display_layer_list; + selection_sets: ufbx_selection_set_list; + selection_nodes: ufbx_selection_node_list; + + // Constraints + characters: ufbx_character_list; + constraints: ufbx_constraint_list; + + // Miscellaneous + poses: ufbx_pose_list; + metadata_objects: ufbx_metadata_object_list; + } + + elements_by_type: [40] ufbx_element_list; + } + + // Unique texture files referenced by the scene. + texture_files: ufbx_texture_file_list; + + elements: ufbx_element_list; // < Sorted by `id` + connections_src: ufbx_connection_list; // < Sorted by `src,src_prop` + connections_dst: ufbx_connection_list; // < Sorted by `dst,dst_prop` + + // Elements sorted by name, type + elements_by_name: ufbx_name_element_list; + + // Enabled if `ufbx_load_opts.retain_dom == true`. + dom_root: *ufbx_dom_node; +} + +// -- Curves +ufbx_curve_point :: struct { + valid: bool; + position: ufbx_vec3 #align 7; + derivative: ufbx_vec3; +} + +ufbx_surface_point :: struct { + valid: bool; + position: ufbx_vec3 #align 7; + derivative_u: ufbx_vec3; + derivative_v: ufbx_vec3; +} + +// -- Mesh topology +ufbx_topo_flags :: enum s32 { + NON_MANIFOLD :: 1; + + FLAGS_FORCE_32BIT :: 2147483647; + + UFBX_TOPO_NON_MANIFOLD :: NON_MANIFOLD; + + UFBX_TOPO_FLAGS_FORCE_32BIT :: FLAGS_FORCE_32BIT; +} + +ufbx_topo_edge :: struct { + index: u32; // < Starting index of the edge, always defined + next: u32; // < Ending index of the edge / next per-face `ufbx_topo_edge`, always defined + prev: u32; // < Previous per-face `ufbx_topo_edge`, always defined + twin: u32; // < `ufbx_topo_edge` on the opposite side, `UFBX_NO_INDEX` if not found + face: u32; // < Index into `mesh->faces[]`, always defined + edge: u32; // < Index into `mesh->edges[]`, `UFBX_NO_INDEX` if not found + + flags: ufbx_topo_flags; +} + +ufbx_vertex_stream :: struct { + data: *void; + vertex_size: size_t; +} + +// Allocate `size` bytes, must be at least 8 byte aligned +ufbx_alloc_fn :: #type (user: *void, size: size_t) -> *void #c_call; + +// Reallocate `old_ptr` from `old_size` to `new_size` +// NOTE: If omit `alloc_fn` and `free_fn` they will be translated to: +// `alloc(size)` -> `realloc_fn(user, NULL, 0, size)` +// `free_fn(ptr, size)` -> `realloc_fn(user, ptr, size, 0)` +ufbx_realloc_fn :: #type (user: *void, old_ptr: *void, old_size: size_t, new_size: size_t) -> *void #c_call; + +// Free pointer `ptr` (of `size` bytes) returned by `alloc_fn` or `realloc_fn` +ufbx_free_fn :: #type (user: *void, ptr: *void, size: size_t) -> void #c_call; + +// Free the allocator itself +ufbx_free_allocator_fn :: #type (user: *void) -> void #c_call; + +// Allocator callbacks and user context +// NOTE: The allocator will be stored to the loaded scene and will be called +// again from `ufbx_free_scene()` so make sure `user` outlives that! +// You can use `free_allocator_fn()` to free the allocator yourself. +ufbx_allocator :: struct { + // Callback functions, see `typedef`s above for information + alloc_fn: ufbx_alloc_fn; + realloc_fn: ufbx_realloc_fn; + free_fn: ufbx_free_fn; + free_allocator_fn: ufbx_free_allocator_fn; + user: *void; +} + +ufbx_allocator_opts :: struct { + // Allocator callbacks + allocator: ufbx_allocator; + + // Maximum number of bytes to allocate before failing + memory_limit: size_t; + + // Maximum number of allocations to attempt before failing + allocation_limit: size_t; + + // Threshold to swap from batched allocations to individual ones + // Defaults to 1MB if set to zero + // NOTE: If set to `1` ufbx will allocate everything in the smallest + // possible chunks which may be useful for debugging (eg. ASAN) + huge_threshold: size_t; + + // Maximum size of a single allocation containing sub-allocations. + // Defaults to 16MB if set to zero + // The maximum amount of wasted memory depends on `max_chunk_size` and + // `huge_threshold`: each chunk can waste up to `huge_threshold` bytes + // internally and the last chunk might be incomplete. So for example + // with the defaults we can waste around 1MB/16MB = 6.25% overall plus + // up to 32MB due to the two incomplete blocks. The actual amounts differ + // slightly as the chunks start out at 4kB and double in size each time, + // meaning that the maximum fixed overhead (up to 32MB with defaults) is + // at most ~30% of the total allocation size. + max_chunk_size: size_t; +} + +// Try to read up to `size` bytes to `data`, return the amount of read bytes. +// Return `SIZE_MAX` to indicate an IO error. +ufbx_read_fn :: #type (user: *void, data: *void, size: size_t) -> size_t #c_call; + +// Skip `size` bytes in the file. +ufbx_skip_fn :: #type (user: *void, size: size_t) -> bool #c_call; + +// Close the file +ufbx_close_fn :: #type (user: *void) -> void #c_call; + +ufbx_stream :: struct { + read_fn: ufbx_read_fn; // < Required + skip_fn: ufbx_skip_fn; // < Optional: Will use `read_fn()` if missing + close_fn: ufbx_close_fn; // < Optional + + // Context passed to other functions + user: *void; +} + +ufbx_open_file_type :: enum s32 { + MAIN_MODEL :: 0; + GEOMETRY_CACHE :: 1; + OBJ_MTL :: 2; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_OPEN_FILE_MAIN_MODEL :: MAIN_MODEL; + UFBX_OPEN_FILE_GEOMETRY_CACHE :: GEOMETRY_CACHE; + UFBX_OPEN_FILE_OBJ_MTL :: OBJ_MTL; + + UFBX_OPEN_FILE_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_42 :: enum s32 { + UFBX_OPEN_FILE_TYPE_COUNT :: 3; +} + +ufbx_open_file_info :: struct { + // Kind of file to load. + type: ufbx_open_file_type; + + // Temporary allocator to use. + temp_allocator: ufbx_allocator; + + // Original filename in the file, not resolved or UTF-8 encoded. + // NOTE: Not necessarily NULL-terminated! + original_filename: ufbx_blob; +} + +// Callback for opening an external file from the filesystem +ufbx_open_file_fn :: #type (user: *void, stream: *ufbx_stream, path: *u8, path_len: size_t, info: *ufbx_open_file_info) -> bool #c_call; + +ufbx_open_file_cb :: struct { + fn: ufbx_open_file_fn; + user: *void; +} + +// Memory stream options +ufbx_close_memory_fn :: #type (user: *void, data: *void, data_size: size_t) -> void #c_call; + +ufbx_close_memory_cb :: struct { + fn: ufbx_close_memory_fn; + user: *void; +} + +// Options for `ufbx_open_memory()`. +ufbx_open_memory_opts :: struct { + _begin_zero: u32; + + // Allocator to allocate the memory with. + // NOTE: Used even if no copy is made to allocate a small metadata block. + allocator: ufbx_allocator_opts; + + // Do not copy the memory. + // You can use `close_cb` to free the memory when the stream is closed. + // NOTE: This means the provided data pointer is referenced after creating + // the memory stream, make sure the data stays valid until the stream is closed! + no_copy: bool; + + // Callback to free the memory blob. + close_cb: ufbx_close_memory_cb; + + _end_zero: u32; +} + +// Detailed error stack frame +ufbx_error_frame :: struct { + source_line: u32; + function: ufbx_string; + description: ufbx_string; +} + +// Error causes (and `UFBX_ERROR_NONE` for no error). +ufbx_error_type :: enum s32 { + NONE :: 0; + + UNKNOWN :: 1; + + FILE_NOT_FOUND :: 2; + + OUT_OF_MEMORY :: 3; + + MEMORY_LIMIT :: 4; + + ALLOCATION_LIMIT :: 5; + + TRUNCATED_FILE :: 6; + + IO :: 7; + + CANCELLED :: 8; + + UNRECOGNIZED_FILE_FORMAT :: 9; + + UNINITIALIZED_OPTIONS :: 10; + + ZERO_VERTEX_SIZE :: 11; + + INVALID_UTF8 :: 12; + + FEATURE_DISABLED :: 13; + + BAD_NURBS :: 14; + + BAD_INDEX :: 15; + + UNSAFE_OPTIONS :: 16; + + TYPE_FORCE_32BIT :: 2147483647; + + UFBX_ERROR_NONE :: NONE; + + UFBX_ERROR_UNKNOWN :: UNKNOWN; + + UFBX_ERROR_FILE_NOT_FOUND :: FILE_NOT_FOUND; + + UFBX_ERROR_OUT_OF_MEMORY :: OUT_OF_MEMORY; + + UFBX_ERROR_MEMORY_LIMIT :: MEMORY_LIMIT; + + UFBX_ERROR_ALLOCATION_LIMIT :: ALLOCATION_LIMIT; + + UFBX_ERROR_TRUNCATED_FILE :: TRUNCATED_FILE; + + UFBX_ERROR_IO :: IO; + + UFBX_ERROR_CANCELLED :: CANCELLED; + + UFBX_ERROR_UNRECOGNIZED_FILE_FORMAT :: UNRECOGNIZED_FILE_FORMAT; + + UFBX_ERROR_UNINITIALIZED_OPTIONS :: UNINITIALIZED_OPTIONS; + + UFBX_ERROR_ZERO_VERTEX_SIZE :: ZERO_VERTEX_SIZE; + + UFBX_ERROR_INVALID_UTF8 :: INVALID_UTF8; + + UFBX_ERROR_FEATURE_DISABLED :: FEATURE_DISABLED; + + UFBX_ERROR_BAD_NURBS :: BAD_NURBS; + + UFBX_ERROR_BAD_INDEX :: BAD_INDEX; + + UFBX_ERROR_UNSAFE_OPTIONS :: UNSAFE_OPTIONS; + + UFBX_ERROR_TYPE_FORCE_32BIT :: TYPE_FORCE_32BIT; +} + +anon_enum_43 :: enum s32 { + UFBX_ERROR_TYPE_COUNT :: 17; +} + +// Error description with detailed stack trace +// HINT: You can use `ufbx_format_error()` for formatting the error +ufbx_error :: struct { + type: ufbx_error_type; + description: ufbx_string; + stack_size: u32; + stack: [8] ufbx_error_frame; + info_length: size_t; + info: [256] u8; +} + +// -- Progress callbacks +ufbx_progress :: struct { + bytes_read: u64; + bytes_total: u64; +} + +ufbx_progress_result :: enum s32 { + CONTINUE :: 256; + CANCEL :: 512; + + RESULT_FORCE_32BIT :: 2147483647; + + UFBX_PROGRESS_CONTINUE :: CONTINUE; + UFBX_PROGRESS_CANCEL :: CANCEL; + + UFBX_PROGRESS_RESULT_FORCE_32BIT :: RESULT_FORCE_32BIT; +} + +// Called periodically with the current progress +// Return `false` to cancel further processing +ufbx_progress_fn :: #type (user: *void, progress: *ufbx_progress) -> ufbx_progress_result #c_call; + +ufbx_progress_cb :: struct { + fn: ufbx_progress_fn; + user: *void; +} + +// Source data/stream to decompress with `ufbx_inflate()` +ufbx_inflate_input :: struct { + // Total size of the data in bytes + total_size: size_t; + + // (optional) Initial or complete data chunk + data: *void; + data_size: size_t; + + // (optional) Temporary buffer, defaults to 256b stack buffer + buffer: *void; + buffer_size: size_t; + + // (optional) Streaming read function, concatenated after `data` + read_fn: ufbx_read_fn; + read_user: *void; + + // (optional) Progress reporting + progress_cb: ufbx_progress_cb; + progress_interval_hint: u64; // < Bytes between progress report calls + + // (optional) Change the progress scope + progress_size_before: u64; + progress_size_after: u64; + + // (optional) No the DEFLATE header + no_header: bool; + + // (optional) No the Adler32 checksum + no_checksum: bool; + + // (optional) Force internal fast lookup bit amount + internal_fast_bits: size_t; +} + +// Persistent data between `ufbx_inflate()` calls +// NOTE: You must set `initialized` to `false`, but `data` may be uninitialized +ufbx_inflate_retain :: struct { + initialized: bool; + data: [1024] u64; +} + +ufbx_index_error_handling :: enum s32 { + CLAMP :: 0; + + NO_INDEX :: 1; + + ABORT_LOADING :: 2; + + UNSAFE_IGNORE :: 3; + + FORCE_32BIT :: 2147483647; + + UFBX_INDEX_ERROR_HANDLING_CLAMP :: CLAMP; + + UFBX_INDEX_ERROR_HANDLING_NO_INDEX :: NO_INDEX; + + UFBX_INDEX_ERROR_HANDLING_ABORT_LOADING :: ABORT_LOADING; + + UFBX_INDEX_ERROR_HANDLING_UNSAFE_IGNORE :: UNSAFE_IGNORE; + + UFBX_INDEX_ERROR_HANDLING_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_44 :: enum s32 { + UFBX_INDEX_ERROR_HANDLING_COUNT :: 4; +} + +ufbx_unicode_error_handling :: enum s32 { + REPLACEMENT_CHARACTER :: 0; + + UNDERSCORE :: 1; + + QUESTION_MARK :: 2; + + REMOVE :: 3; + + ABORT_LOADING :: 4; + + UNSAFE_IGNORE :: 5; + + FORCE_32BIT :: 2147483647; + + UFBX_UNICODE_ERROR_HANDLING_REPLACEMENT_CHARACTER :: REPLACEMENT_CHARACTER; + + UFBX_UNICODE_ERROR_HANDLING_UNDERSCORE :: UNDERSCORE; + + UFBX_UNICODE_ERROR_HANDLING_QUESTION_MARK :: QUESTION_MARK; + + UFBX_UNICODE_ERROR_HANDLING_REMOVE :: REMOVE; + + UFBX_UNICODE_ERROR_HANDLING_ABORT_LOADING :: ABORT_LOADING; + + UFBX_UNICODE_ERROR_HANDLING_UNSAFE_IGNORE :: UNSAFE_IGNORE; + + UFBX_UNICODE_ERROR_HANDLING_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_45 :: enum s32 { + UFBX_UNICODE_ERROR_HANDLING_COUNT :: 6; +} + +// How to handle FBX node geometry transforms. +// FBX nodes can have "geometry transforms" that affect only the attached meshes, +// but not the children. This is not allowed in many scene representations so +// ufbx provides some ways to simplify them. +// Geometry transforms can also be used to transform any other attributes such +// as lights or cameras. +ufbx_geometry_transform_handling :: enum s32 { + PRESERVE :: 0; + + HELPER_NODES :: 1; + + MODIFY_GEOMETRY :: 2; + + MODIFY_GEOMETRY_NO_FALLBACK :: 3; + + FORCE_32BIT :: 2147483647; + + UFBX_GEOMETRY_TRANSFORM_HANDLING_PRESERVE :: PRESERVE; + + UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES :: HELPER_NODES; + + UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY :: MODIFY_GEOMETRY; + + UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY_NO_FALLBACK :: MODIFY_GEOMETRY_NO_FALLBACK; + + UFBX_GEOMETRY_TRANSFORM_HANDLING_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_46 :: enum s32 { + UFBX_GEOMETRY_TRANSFORM_HANDLING_COUNT :: 4; +} + +// Specify how unit / coordinate system conversion should be performed. +// Affects how `ufbx_load_opts.target_axes` and `ufbx_load_opts.target_unit_meters` work, +// has no effect if neither is specified. +ufbx_space_conversion :: enum s32 { + TRANSFORM_ROOT :: 0; + + ADJUST_TRANSFORMS :: 1; + + FORCE_32BIT :: 2147483647; + + UFBX_SPACE_CONVERSION_TRANSFORM_ROOT :: TRANSFORM_ROOT; + + UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS :: ADJUST_TRANSFORMS; + + UFBX_SPACE_CONVERSION_FORCE_32BIT :: FORCE_32BIT; +} + +anon_enum_47 :: enum s32 { + UFBX_SPACE_CONVERSION_COUNT :: 2; +} + +// Options for `ufbx_load_file/memory/stream/stdio()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +ufbx_load_opts :: struct { + _begin_zero: u32; + + temp_allocator: ufbx_allocator_opts; // < Allocator used during loading + result_allocator: ufbx_allocator_opts; // < Allocator used for the final scene + + ignore_geometry: bool; // < Do not load geometry datsa (vertices, indices, etc) + ignore_animation: bool; // < Do not load animation curves + ignore_embedded: bool; // < Do not load embedded content + ignore_all_content: bool; // < Do not load any content (geometry, animation, embedded) + + evaluate_skinning: bool; // < Evaluate skinning (see ufbx_mesh.skinned_vertices) + evaluate_caches: bool; // < Evaluate vertex caches (see ufbx_mesh.skinned_vertices) + + // Try to open external files referenced by the main file automatically. + // Applies to geometry caches and .mtl files for OBJ. + // NOTE: This may be risky for untrusted data as the input files may contain + // references to arbitrary paths in the filesystem. + // NOTE: This only applies to files *implicitly* referenced by the scene, if + // you request additional files via eg. `ufbx_load_opts.obj_mtl_path` they + // are still loaded. + load_external_files: bool; + + // Don't fail loading if external files are not found. + ignore_missing_external_files: bool; + + // Don't compute `ufbx_skin_deformer` `vertices` and `weights` arrays saving + // a bit of memory and time if not needed + skip_skin_vertices: bool; + + // Don't adjust reading the FBX file depending on the detected exporter + disable_quirks: bool; + + // Don't allow partially broken FBX files to load + strict: bool; + + // UNSAFE: If enabled allows using unsafe options that may fundamentally + // break the API guarantees. + allow_unsafe: bool; + + // Specify how to handle broken indices. + index_error_handling: ufbx_index_error_handling; + + // Connect related elements even if they are broken. If `false` (default) + // `ufbx_skin_cluster` with a missing `bone` field are _not_ included in + // the `ufbx_skin_deformer.clusters[]` array for example. + connect_broken_elements: bool; + + // Allow nodes that are not connected in any way to the root. Conversely if + // disabled, all lone nodes will be parented under `ufbx_scene.root_node`. + allow_nodes_out_of_root: bool; + + // If a mesh does not have a material create a `ufbx_mesh_material` part + // with a `NULL` material pointer. This can be more convenient if you need + // to split models into parts per material. + allow_null_material: bool; + + // Allow meshes with no vertex position attribute. + // NOTE: If this is set `ufbx_mesh.vertex_position.exists` may be `false`. + allow_missing_vertex_position: bool; + + // Allow faces with zero indices. + allow_empty_faces: bool; + + // Generate vertex normals for a meshes that are missing normals. + // You can see if the normals have been generated from `ufbx_mesh.generated_normals`. + generate_missing_normals: bool; + + // Ignore `open_file_cb` when loading the main file. + open_main_file_with_default: bool; + + // Path separator character, defaults to '\' on Windows and '/' otherwise. + path_separator: u8; + + // Estimated file size for progress reporting + file_size_estimate: u64; + + // Buffer size in bytes to use for reading from files or IO callbacks + read_buffer_size: size_t; + + // Filename to use as a base for relative file paths if not specified using + // `ufbx_load_file()`. Use `length = SIZE_MAX` for NULL-terminated strings. + // `raw_filename` will be derived from this if empty. + filename: ufbx_string; + + // Raw non-UTF8 filename. Does not support NULL termination. + // `filename` will be derived from this if empty. + raw_filename: ufbx_blob; + + // Progress reporting + progress_cb: ufbx_progress_cb; + progress_interval_hint: u64; // < Bytes between progress report calls + + // External file callbacks (defaults to stdio.h) + open_file_cb: ufbx_open_file_cb; + + // How to handle geometry transforms in the nodes. + // See `ufbx_geometry_transform_handling` for an explanation. + geometry_transform_handling: ufbx_geometry_transform_handling; + + // How to perform space conversion by `target_axes` and `target_unit_meters`. + // See `ufbx_space_conversion` for an explanation. + space_conversion: ufbx_space_conversion; + + // Apply an implicit root transformation to match axes. + // Used if `ufbx_coordinate_axes_valid(target_axes)`. + target_axes: ufbx_coordinate_axes; + + // Scale the scene so that one world-space unit is `target_unit_meters` meters. + // By default units are not scaled. + target_unit_meters: ufbx_real; + + // Target space for camera. + // By default FBX cameras point towards the positive X axis. + // Used if `ufbx_coordinate_axes_valid(target_camera_axes)`. + target_camera_axes: ufbx_coordinate_axes; + + // Target space for directed lights. + // By default FBX lights point towards the negative Y axis. + // Used if `ufbx_coordinate_axes_valid(target_light_axes)`. + target_light_axes: ufbx_coordinate_axes; + + // Name for dummy geometry transform helper nodes. + // See `UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES`. + geometry_transform_helper_name: ufbx_string; + + // Do not scale necessary properties curves with `target_unit_meters`. + // Used only if `space_conversion == UFBX_SPACE_CONVERSION_TRANSFORM_ROOT`. + no_prop_unit_scaling: bool; + + // Do not scale necessary animation curves with `target_unit_meters`. + // Used only if `space_conversion == UFBX_SPACE_CONVERSION_TRANSFORM_ROOT`. + no_anim_curve_unit_scaling: bool; + + // Normalize vertex normals. + normalize_normals: bool; + + // Normalize tangents and bitangents. + normalize_tangents: bool; + + // Override for the root transform + use_root_transform: bool; + root_transform: ufbx_transform #align 3; + + // Specify how to handle Unicode errors in strings. + unicode_error_handling: ufbx_unicode_error_handling; + + // Retain the raw document structure using `ufbx_dom_node`. + retain_dom: bool; + + // Force a specific file format instead of detecting it. + file_format: ufbx_file_format; + + // How far to read into the file to determine the file format. + // Default: 16kB + file_format_lookahead: size_t; + + // Do not attempt to detect file format from file content. + no_format_from_content: bool; + + // Do not attempt to detect file format from filename extension. + // ufbx primarily detects file format from the file header, + // this is just used as a fallback. + no_format_from_extension: bool; + + // (.obj) Try to find .mtl file with matching filename as the .obj file. + // Used if the file specified `mtllib` line is not found, eg. for a file called + // `model.obj` that contains the line `usemtl materials.mtl`, ufbx would first + // try to open `materials.mtl` and if that fails it tries to open `model.mtl`. + obj_search_mtl_by_filename: bool; + + // (.obj) Don't split geometry into meshes by object. + obj_merge_objects: bool; + + // (.obj) Don't split geometry into meshes by groups. + obj_merge_groups: bool; + + // (.obj) Force splitting groups even on object boundaries. + obj_split_groups: bool; + + // (.obj) Path to the .mtl file. + // Use `length = SIZE_MAX` for NULL-terminated strings. + // NOTE: This is used _instead_ of the one in the file even if not found + // and sidesteps `load_external_files` as it's _explicitly_ requested. + obj_mtl_path: ufbx_string; + + // (.obj) Data for the .mtl file. + obj_mtl_data: ufbx_blob; + + _end_zero: u32; +} + +// Options for `ufbx_evaluate_scene()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +ufbx_evaluate_opts :: struct { + _begin_zero: u32; + + temp_allocator: ufbx_allocator_opts; // < Allocator used during evaluation + result_allocator: ufbx_allocator_opts; // < Allocator used for the final scene + + evaluate_skinning: bool; // < Evaluate skinning (see ufbx_mesh.skinned_vertices) + evaluate_caches: bool; // < Evaluate vertex caches (see ufbx_mesh.skinned_vertices) + + // WARNING: Potentially unsafe! Try to open external files such as geometry caches + load_external_files: bool; + + // External file callbacks (defaults to stdio.h) + open_file_cb: ufbx_open_file_cb; + + _end_zero: u32; +} + +// Options for `ufbx_tessellate_nurbs_curve()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +ufbx_tessellate_curve_opts :: struct { + _begin_zero: u32; + + temp_allocator: ufbx_allocator_opts; // < Allocator used during tessellation + result_allocator: ufbx_allocator_opts; // < Allocator used for the final line curve + + // How many segments tessellate each step in `ufbx_nurbs_basis.steps`. + span_subdivision: u32; + + _end_zero: u32; +} + +// Options for `ufbx_tessellate_nurbs_surface()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +ufbx_tessellate_surface_opts :: struct { + _begin_zero: u32; + + temp_allocator: ufbx_allocator_opts; // < Allocator used during tessellation + result_allocator: ufbx_allocator_opts; // < Allocator used for the final mesh + + // How many segments tessellate each step in `ufbx_nurbs_basis.steps`. + // NOTE: Default is `4`, _not_ `ufbx_nurbs_surface.span_subdivision_u/v` as that + // would make it easy to create an FBX file with an absurdly high subdivision + // rate (similar to mesh subdivision). Please enforce copy the value yourself + // enforcing whatever limits you deem reasonable. + span_subdivision_u: u32; + span_subdivision_v: u32; + + _end_zero: u32; +} + +// Options for `ufbx_subdivide_mesh()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +ufbx_subdivide_opts :: struct { + _begin_zero: u32; + + temp_allocator: ufbx_allocator_opts; // < Allocator used during subdivision + result_allocator: ufbx_allocator_opts; // < Allocator used for the final mesh + + boundary: ufbx_subdivision_boundary; + uv_boundary: ufbx_subdivision_boundary; + + // Do not generate normals + ignore_normals: bool; + + // Interpolate existing normals using the subdivision rules + // instead of generating new normals + interpolate_normals: bool; + + // Subdivide also tangent attributes + interpolate_tangents: bool; + + // Map subdivided vertices into weighted original vertices. + // NOTE: May be O(n^2) if `max_source_vertices` is not specified! + evaluate_source_vertices: bool; + + // Limit source vertices per subdivided vertex. + max_source_vertices: size_t; + + // Calculate bone influences over subdivided vertices (if applicable). + // NOTE: May be O(n^2) if `max_skin_weights` is not specified! + evaluate_skin_weights: bool; + + // Limit bone influences per subdivided vertex. + max_skin_weights: size_t; + + // Index of the skin deformer to use for `evaluate_skin_weights`. + skin_deformer_index: size_t; + + _end_zero: u32; +} + +// Options for `ufbx_load_geometry_cache()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +ufbx_geometry_cache_opts :: struct { + _begin_zero: u32; + + temp_allocator: ufbx_allocator_opts; // < Allocator used during loading + result_allocator: ufbx_allocator_opts; // < Allocator used for the final scene + + // External file callbacks (defaults to stdio.h) + open_file_cb: ufbx_open_file_cb; + + // FPS value for converting frame times to seconds + frames_per_second: float64; + + _end_zero: u32; +} + +// Options for `ufbx_read_geometry_cache_*()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +ufbx_geometry_cache_data_opts :: struct { + _begin_zero: u32; + + // External file callbacks (defaults to stdio.h) + open_file_cb: ufbx_open_file_cb; + + additive: bool; + use_weight: bool; + weight: ufbx_real; + + _end_zero: u32; +} + +ufbx_panic :: struct { + did_panic: bool; + message_length: size_t; + message: [128] u8; +} + +// Practically always `true` (see below), if not you need to be careful with threads. +// +// Guaranteed to be `true` in _any_ of the following conditions: +// - ufbx.c has been compiled using: GCC / Clang / MSVC / ICC / EMCC / TCC +// - ufbx.c has been compiled as C++11 or later +// - ufbx.c has been compiled as C11 or later with `` support +// +// If `false` you can't call the following functions concurrently: +// ufbx_evaluate_scene() +// ufbx_free_scene() +// ufbx_subdivide_mesh() +// ufbx_tessellate_nurbs_surface() +// ufbx_free_mesh() +ufbx_is_thread_safe :: () -> bool #foreign ufbx; + +// Load a scene from a `size` byte memory buffer at `data` +ufbx_load_memory :: (data: *void, data_size: size_t, opts: *ufbx_load_opts, error: *ufbx_error) -> *ufbx_scene #foreign ufbx; + +// Load a scene by opening a file named `filename` +ufbx_load_file :: (filename: *u8, opts: *ufbx_load_opts, error: *ufbx_error) -> *ufbx_scene #foreign ufbx; + +ufbx_load_file_len :: (filename: *u8, filename_len: size_t, opts: *ufbx_load_opts, error: *ufbx_error) -> *ufbx_scene #foreign ufbx; + +// Load a scene by reading from an `FILE *file` stream +// NOTE: `file` is passed as a `void` pointer to avoid including +ufbx_load_stdio :: (file: *void, opts: *ufbx_load_opts, error: *ufbx_error) -> *ufbx_scene #foreign ufbx; + +// Load a scene by reading from an `FILE *file` stream with a prefix +// NOTE: `file` is passed as a `void` pointer to avoid including +ufbx_load_stdio_prefix :: (file: *void, prefix: *void, prefix_size: size_t, opts: *ufbx_load_opts, error: *ufbx_error) -> *ufbx_scene #foreign ufbx; + +// Load a scene from a user-specified stream +ufbx_load_stream :: (stream: *ufbx_stream, opts: *ufbx_load_opts, error: *ufbx_error) -> *ufbx_scene #foreign ufbx; + +// Load a scene from a user-specified stream with a prefix +ufbx_load_stream_prefix :: (stream: *ufbx_stream, prefix: *void, prefix_size: size_t, opts: *ufbx_load_opts, error: *ufbx_error) -> *ufbx_scene #foreign ufbx; + +// Free a previously loaded or evaluated scene +ufbx_free_scene :: (scene: *ufbx_scene) -> void #foreign ufbx; + +// Increment `scene` refcount +ufbx_retain_scene :: (scene: *ufbx_scene) -> void #foreign ufbx; + +// Format a textual description of `error`. +// Always produces a NULL-terminated string to `char dst[dst_size]`, truncating if +// necessary. Returns the number of characters written not including the NULL terminator. +ufbx_format_error :: (dst: *u8, dst_size: size_t, error: *ufbx_error) -> size_t #foreign ufbx; + +// Find a property `name` from `props`, returns `NULL` if not found. +// Searches through `ufbx_props.defaults` as well. +ufbx_find_prop_len :: (props: *ufbx_props, name: *u8, name_len: size_t) -> *ufbx_prop #foreign ufbx; + +// Utility functions for finding the value of a property, returns `def` if not found. +// NOTE: For `ufbx_string` you need to ensure the lifetime of the default is +// sufficient as no copy is made. +ufbx_find_real_len :: (props: *ufbx_props, name: *u8, name_len: size_t, def: ufbx_real) -> ufbx_real #foreign ufbx; + +ufbx_find_vec3_len :: (props: *ufbx_props, name: *u8, name_len: size_t, def: ufbx_vec3) -> ufbx_vec3 #foreign ufbx; + +ufbx_find_int_len :: (props: *ufbx_props, name: *u8, name_len: size_t, def: s64) -> s64 #foreign ufbx; + +ufbx_find_bool_len :: (props: *ufbx_props, name: *u8, name_len: size_t, def: bool) -> bool #foreign ufbx; + +ufbx_find_string_len :: (props: *ufbx_props, name: *u8, name_len: size_t, def: ufbx_string) -> ufbx_string #foreign ufbx; + +ufbx_find_blob_len :: (props: *ufbx_props, name: *u8, name_len: size_t, def: ufbx_blob) -> ufbx_blob #foreign ufbx; + +// Find property in `props` with concatendated `parts[num_parts]`. +ufbx_find_prop_concat :: (props: *ufbx_props, parts: *ufbx_string, num_parts: size_t) -> *ufbx_prop #foreign ufbx; + +// Get an element connected to a property. +ufbx_get_prop_element :: (element: *ufbx_element, prop: *ufbx_prop, type: ufbx_element_type) -> *ufbx_element #foreign ufbx; + +// Find any element of type `type` in `scene` by `name`. +// For example if you want to find `ufbx_material` named `Mat`: +// (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Mat"); +ufbx_find_element_len :: (scene: *ufbx_scene, type: ufbx_element_type, name: *u8, name_len: size_t) -> *ufbx_element #foreign ufbx; + +// Find node in `scene` by `name` (shorthand for `ufbx_find_element(UFBX_ELEMENT_NODE)`). +ufbx_find_node_len :: (scene: *ufbx_scene, name: *u8, name_len: size_t) -> *ufbx_node #foreign ufbx; + +// Find an animation stack in `scene` by `name` (shorthand for `ufbx_find_element(UFBX_ELEMENT_ANIM_STACK)`) +ufbx_find_anim_stack_len :: (scene: *ufbx_scene, name: *u8, name_len: size_t) -> *ufbx_anim_stack #foreign ufbx; + +// Find a material in `scene` by `name` (shorthand for `ufbx_find_element(UFBX_ELEMENT_MATERIAL)`). +ufbx_find_material_len :: (scene: *ufbx_scene, name: *u8, name_len: size_t) -> *ufbx_material #foreign ufbx; + +// Find a single animated property `prop` of `element` in `layer`. +// Returns `NULL` if not found. +ufbx_find_anim_prop_len :: (layer: *ufbx_anim_layer, element: *ufbx_element, prop: *u8, prop_len: size_t) -> *ufbx_anim_prop #foreign ufbx; + +// Find all animated properties of `element` in `layer`. +ufbx_find_anim_props :: (layer: *ufbx_anim_layer, element: *ufbx_element) -> ufbx_anim_prop_list #foreign ufbx; + +// Get a matrix that transforms normals in the same way as Autodesk software. +// NOTE: The resulting normals are slightly incorrect as this function deliberately +// inverts geometric transformation wrong. For better results use +// `ufbx_matrix_for_normals(&node->geometry_to_world)`. +ufbx_get_compatible_matrix_for_normals :: (node: *ufbx_node) -> ufbx_matrix #foreign ufbx; + +// Decompress a DEFLATE compressed buffer. +// Returns the decompressed size or a negative error code (see source for details). +// NOTE: You must supply a valid `retain` with `ufbx_inflate_retain.initialized == false` +// but the rest can be uninitialized. +ufbx_inflate :: (dst: *void, dst_size: size_t, input: *ufbx_inflate_input, retain: *ufbx_inflate_retain) -> s64 #foreign ufbx; + +// Open a `ufbx_stream` from a file. +// Use `path_len == SIZE_MAX` for NULL terminated string. +ufbx_open_file :: (stream: *ufbx_stream, path: *u8, path_len: size_t) -> bool #foreign ufbx; + +// Same as `ufbx_open_file()` but compatible with the callback in `ufbx_open_file_fn`. +// The `user` parameter is actually not used here. +ufbx_default_open_file :: (user: *void, stream: *ufbx_stream, path: *u8, path_len: size_t, info: *ufbx_open_file_info) -> bool #foreign ufbx; + +// NOTE: Uses the default ufbx allocator! +ufbx_open_memory :: (stream: *ufbx_stream, data: *void, data_size: size_t, opts: *ufbx_open_memory_opts, error: *ufbx_error) -> bool #foreign ufbx; + +// Evaluate a single animation `curve` at a `time`. +// Returns `default_value` only if `curve == NULL` or it has no keyframes. +ufbx_evaluate_curve :: (curve: *ufbx_anim_curve, time: float64, default_value: ufbx_real) -> ufbx_real #foreign ufbx; + +// Evaluate a value from bundled animation curves. +ufbx_evaluate_anim_value_real :: (anim_value: *ufbx_anim_value, time: float64) -> ufbx_real #foreign ufbx; +ufbx_evaluate_anim_value_vec2 :: (anim_value: *ufbx_anim_value, time: float64) -> ufbx_vec2 #foreign ufbx; +ufbx_evaluate_anim_value_vec3 :: (anim_value: *ufbx_anim_value, time: float64) -> ufbx_vec3 #foreign ufbx; + +// Evaluate an animated property `name` from `element` at `time`. +// NOTE: If the property is not found it will have the flag `UFBX_PROP_FLAG_NOT_FOUND`. +ufbx_evaluate_prop_len :: (anim: *ufbx_anim, element: *ufbx_element, name: *u8, name_len: size_t, time: float64) -> ufbx_prop #foreign ufbx; + +// Evaluate all _animated_ properties of `element`. +// HINT: This function returns an `ufbx_props` structure with the original properties as +// `ufbx_props.defaults`. This lets you use `ufbx_find_prop/value()` for the results. +ufbx_evaluate_props :: (anim: *ufbx_anim, element: *ufbx_element, time: float64, buffer: *ufbx_prop, buffer_size: size_t) -> ufbx_props #foreign ufbx; + +ufbx_evaluate_transform :: (anim: *ufbx_anim, node: *ufbx_node, time: float64) -> ufbx_transform #foreign ufbx; +ufbx_evaluate_blend_weight :: (anim: *ufbx_anim, channel: *ufbx_blend_channel, time: float64) -> ufbx_real #foreign ufbx; + +ufbx_prepare_prop_overrides :: (overrides: *ufbx_prop_override, num_overrides: size_t) -> ufbx_const_prop_override_list #foreign ufbx; + +// Evaluate the whole `scene` at a specific `time` in the animation `anim`. +// The returned scene behaves as if it had been exported at a specific time +// in the specified animation, except that animated elements' properties contain +// only the animated values, the original ones are in `props->defaults`. +// +// NOTE: The returned scene refers to the original `scene` so the original +// scene cannot be freed until all evaluated scenes are freed. +ufbx_evaluate_scene :: (scene: *ufbx_scene, anim: *ufbx_anim, time: float64, opts: *ufbx_evaluate_opts, error: *ufbx_error) -> *ufbx_scene #foreign ufbx; + +// Materials +ufbx_find_prop_texture_len :: (material: *ufbx_material, name: *u8, name_len: size_t) -> *ufbx_texture #foreign ufbx; + +ufbx_find_shader_prop_len :: (shader: *ufbx_shader, name: *u8, name_len: size_t) -> ufbx_string #foreign ufbx; + +ufbx_find_shader_prop_bindings_len :: (shader: *ufbx_shader, name: *u8, name_len: size_t) -> ufbx_shader_prop_binding_list #foreign ufbx; + +ufbx_find_shader_texture_input_len :: (shader: *ufbx_shader_texture, name: *u8, name_len: size_t) -> *ufbx_shader_texture_input #foreign ufbx; + +// Math +ufbx_coordinate_axes_valid :: (axes: ufbx_coordinate_axes) -> bool #foreign ufbx; + +ufbx_quat_dot :: (a: ufbx_quat, b: ufbx_quat) -> ufbx_real #foreign ufbx; +ufbx_quat_mul :: (a: ufbx_quat, b: ufbx_quat) -> ufbx_quat #foreign ufbx; +ufbx_quat_normalize :: (q: ufbx_quat) -> ufbx_quat #foreign ufbx; +ufbx_quat_fix_antipodal :: (q: ufbx_quat, reference: ufbx_quat) -> ufbx_quat #foreign ufbx; +ufbx_quat_slerp :: (a: ufbx_quat, b: ufbx_quat, t: ufbx_real) -> ufbx_quat #foreign ufbx; +ufbx_quat_rotate_vec3 :: (q: ufbx_quat, v: ufbx_vec3) -> ufbx_vec3 #foreign ufbx; +ufbx_quat_to_euler :: (q: ufbx_quat, order: ufbx_rotation_order) -> ufbx_vec3 #foreign ufbx; +ufbx_euler_to_quat :: (v: ufbx_vec3, order: ufbx_rotation_order) -> ufbx_quat #foreign ufbx; + +ufbx_matrix_mul :: (a: *ufbx_matrix, b: *ufbx_matrix) -> ufbx_matrix #foreign ufbx; +ufbx_matrix_determinant :: (m: *ufbx_matrix) -> ufbx_real #foreign ufbx; +ufbx_matrix_invert :: (m: *ufbx_matrix) -> ufbx_matrix #foreign ufbx; +ufbx_matrix_for_normals :: (m: *ufbx_matrix) -> ufbx_matrix #foreign ufbx; +ufbx_transform_position :: (m: *ufbx_matrix, v: ufbx_vec3) -> ufbx_vec3 #foreign ufbx; +ufbx_transform_direction :: (m: *ufbx_matrix, v: ufbx_vec3) -> ufbx_vec3 #foreign ufbx; +ufbx_transform_to_matrix :: (t: *ufbx_transform) -> ufbx_matrix #foreign ufbx; +ufbx_matrix_to_transform :: (m: *ufbx_matrix) -> ufbx_transform #foreign ufbx; + +// Skinning +ufbx_catch_get_skin_vertex_matrix :: (panic: *ufbx_panic, skin: *ufbx_skin_deformer, vertex: size_t, fallback: *ufbx_matrix) -> ufbx_matrix #foreign ufbx; + +ufbx_get_blend_shape_vertex_offset :: (shape: *ufbx_blend_shape, vertex: size_t) -> ufbx_vec3 #foreign ufbx; +ufbx_get_blend_vertex_offset :: (blend: *ufbx_blend_deformer, vertex: size_t) -> ufbx_vec3 #foreign ufbx; + +ufbx_add_blend_shape_vertex_offsets :: (shape: *ufbx_blend_shape, vertices: *ufbx_vec3, num_vertices: size_t, weight: ufbx_real) -> void #foreign ufbx; +ufbx_add_blend_vertex_offsets :: (blend: *ufbx_blend_deformer, vertices: *ufbx_vec3, num_vertices: size_t, weight: ufbx_real) -> void #foreign ufbx; + +// Curves/surfaces +ufbx_evaluate_nurbs_basis :: (basis: *ufbx_nurbs_basis, u: ufbx_real, weights: *ufbx_real, num_weights: size_t, derivatives: *ufbx_real, num_derivatives: size_t) -> size_t #foreign ufbx; + +ufbx_evaluate_nurbs_curve :: (curve: *ufbx_nurbs_curve, u: ufbx_real) -> ufbx_curve_point #foreign ufbx; +ufbx_evaluate_nurbs_surface :: (surface: *ufbx_nurbs_surface, u: ufbx_real, v: ufbx_real) -> ufbx_surface_point #foreign ufbx; + +ufbx_tessellate_nurbs_curve :: (curve: *ufbx_nurbs_curve, opts: *ufbx_tessellate_curve_opts, error: *ufbx_error) -> *ufbx_line_curve #foreign ufbx; +ufbx_tessellate_nurbs_surface :: (surface: *ufbx_nurbs_surface, opts: *ufbx_tessellate_surface_opts, error: *ufbx_error) -> *ufbx_mesh #foreign ufbx; + +ufbx_free_line_curve :: (curve: *ufbx_line_curve) -> void #foreign ufbx; +ufbx_retain_line_curve :: (curve: *ufbx_line_curve) -> void #foreign ufbx; + +// Mesh Topology +ufbx_catch_triangulate_face :: (panic: *ufbx_panic, indices: *u32, num_indices: size_t, mesh: *ufbx_mesh, face: ufbx_face) -> u32 #foreign ufbx; + +// Generate the half-edge representation of `mesh` to `topo[mesh->num_indices]` +ufbx_catch_compute_topology :: (panic: *ufbx_panic, mesh: *ufbx_mesh, topo: *ufbx_topo_edge, num_topo: size_t) -> void #foreign ufbx; + +// Get the next/previous edge around a vertex +// NOTE: Does not return the half-edge on the opposite side (ie. `topo[index].twin`) +ufbx_catch_topo_next_vertex_edge :: (panic: *ufbx_panic, topo: *ufbx_topo_edge, num_topo: size_t, index: u32) -> u32 #foreign ufbx; + +ufbx_catch_topo_prev_vertex_edge :: (panic: *ufbx_panic, topo: *ufbx_topo_edge, num_topo: size_t, index: u32) -> u32 #foreign ufbx; + +ufbx_catch_get_weighted_face_normal :: (panic: *ufbx_panic, positions: *ufbx_vertex_vec3, face: ufbx_face) -> ufbx_vec3 #foreign ufbx; + +ufbx_catch_generate_normal_mapping :: (panic: *ufbx_panic, mesh: *ufbx_mesh, topo: *ufbx_topo_edge, num_topo: size_t, normal_indices: *u32, num_normal_indices: size_t, assume_smooth: bool) -> size_t #foreign ufbx; + +ufbx_generate_normal_mapping :: (mesh: *ufbx_mesh, topo: *ufbx_topo_edge, num_topo: size_t, normal_indices: *u32, num_normal_indices: size_t, assume_smooth: bool) -> size_t #foreign ufbx; + +ufbx_catch_compute_normals :: (panic: *ufbx_panic, mesh: *ufbx_mesh, positions: *ufbx_vertex_vec3, normal_indices: *u32, num_normal_indices: size_t, normals: *ufbx_vec3, num_normals: size_t) -> void #foreign ufbx; + +ufbx_compute_normals :: (mesh: *ufbx_mesh, positions: *ufbx_vertex_vec3, normal_indices: *u32, num_normal_indices: size_t, normals: *ufbx_vec3, num_normals: size_t) -> void #foreign ufbx; + +ufbx_subdivide_mesh :: (mesh: *ufbx_mesh, level: size_t, opts: *ufbx_subdivide_opts, error: *ufbx_error) -> *ufbx_mesh #foreign ufbx; + +ufbx_free_mesh :: (mesh: *ufbx_mesh) -> void #foreign ufbx; +ufbx_retain_mesh :: (mesh: *ufbx_mesh) -> void #foreign ufbx; + +// Geometry caches +ufbx_load_geometry_cache :: (filename: *u8, opts: *ufbx_geometry_cache_opts, error: *ufbx_error) -> *ufbx_geometry_cache #foreign ufbx; + +ufbx_load_geometry_cache_len :: (filename: *u8, filename_len: size_t, opts: *ufbx_geometry_cache_opts, error: *ufbx_error) -> *ufbx_geometry_cache #foreign ufbx; + +ufbx_free_geometry_cache :: (cache: *ufbx_geometry_cache) -> void #foreign ufbx; +ufbx_retain_geometry_cache :: (cache: *ufbx_geometry_cache) -> void #foreign ufbx; + +ufbx_read_geometry_cache_real :: (frame: *ufbx_cache_frame, data: *ufbx_real, num_data: size_t, opts: *ufbx_geometry_cache_data_opts) -> size_t #foreign ufbx; +ufbx_sample_geometry_cache_real :: (channel: *ufbx_cache_channel, time: float64, data: *ufbx_real, num_data: size_t, opts: *ufbx_geometry_cache_data_opts) -> size_t #foreign ufbx; +ufbx_read_geometry_cache_vec3 :: (frame: *ufbx_cache_frame, data: *ufbx_vec3, num_data: size_t, opts: *ufbx_geometry_cache_data_opts) -> size_t #foreign ufbx; +ufbx_sample_geometry_cache_vec3 :: (channel: *ufbx_cache_channel, time: float64, data: *ufbx_vec3, num_data: size_t, opts: *ufbx_geometry_cache_data_opts) -> size_t #foreign ufbx; + +// DOM +ufbx_dom_find_len :: (parent: *ufbx_dom_node, name: *u8, name_len: size_t) -> *ufbx_dom_node #foreign ufbx; + +// Utility +ufbx_generate_indices :: (streams: *ufbx_vertex_stream, num_streams: size_t, indices: *u32, num_indices: size_t, allocator: *ufbx_allocator_opts, error: *ufbx_error) -> size_t #foreign ufbx; + +// -- Inline API +ufbx_catch_get_vertex_real :: (panic: *ufbx_panic, v: *ufbx_vertex_real, index: size_t) -> ufbx_real #foreign ufbx; +ufbx_catch_get_vertex_vec2 :: (panic: *ufbx_panic, v: *ufbx_vertex_vec2, index: size_t) -> ufbx_vec2 #foreign ufbx; +ufbx_catch_get_vertex_vec3 :: (panic: *ufbx_panic, v: *ufbx_vertex_vec3, index: size_t) -> ufbx_vec3 #foreign ufbx; +ufbx_catch_get_vertex_vec4 :: (panic: *ufbx_panic, v: *ufbx_vertex_vec4, index: size_t) -> ufbx_vec4 #foreign ufbx; + +ufbx_get_triangulate_face_num_indices :: (face: ufbx_face) -> size_t #foreign ufbx; + +ufbx_as_unknown :: (element: *ufbx_element) -> *ufbx_unknown #foreign ufbx; +ufbx_as_node :: (element: *ufbx_element) -> *ufbx_node #foreign ufbx; +ufbx_as_mesh :: (element: *ufbx_element) -> *ufbx_mesh #foreign ufbx; +ufbx_as_light :: (element: *ufbx_element) -> *ufbx_light #foreign ufbx; +ufbx_as_camera :: (element: *ufbx_element) -> *ufbx_camera #foreign ufbx; +ufbx_as_bone :: (element: *ufbx_element) -> *ufbx_bone #foreign ufbx; +ufbx_as_empty :: (element: *ufbx_element) -> *ufbx_empty #foreign ufbx; +ufbx_as_line_curve :: (element: *ufbx_element) -> *ufbx_line_curve #foreign ufbx; +ufbx_as_nurbs_curve :: (element: *ufbx_element) -> *ufbx_nurbs_curve #foreign ufbx; +ufbx_as_nurbs_surface :: (element: *ufbx_element) -> *ufbx_nurbs_surface #foreign ufbx; +ufbx_as_nurbs_trim_surface :: (element: *ufbx_element) -> *ufbx_nurbs_trim_surface #foreign ufbx; +ufbx_as_nurbs_trim_boundary :: (element: *ufbx_element) -> *ufbx_nurbs_trim_boundary #foreign ufbx; +ufbx_as_procedural_geometry :: (element: *ufbx_element) -> *ufbx_procedural_geometry #foreign ufbx; +ufbx_as_stereo_camera :: (element: *ufbx_element) -> *ufbx_stereo_camera #foreign ufbx; +ufbx_as_camera_switcher :: (element: *ufbx_element) -> *ufbx_camera_switcher #foreign ufbx; +ufbx_as_marker :: (element: *ufbx_element) -> *ufbx_marker #foreign ufbx; +ufbx_as_lod_group :: (element: *ufbx_element) -> *ufbx_lod_group #foreign ufbx; +ufbx_as_skin_deformer :: (element: *ufbx_element) -> *ufbx_skin_deformer #foreign ufbx; +ufbx_as_skin_cluster :: (element: *ufbx_element) -> *ufbx_skin_cluster #foreign ufbx; +ufbx_as_blend_deformer :: (element: *ufbx_element) -> *ufbx_blend_deformer #foreign ufbx; +ufbx_as_blend_channel :: (element: *ufbx_element) -> *ufbx_blend_channel #foreign ufbx; +ufbx_as_blend_shape :: (element: *ufbx_element) -> *ufbx_blend_shape #foreign ufbx; +ufbx_as_cache_deformer :: (element: *ufbx_element) -> *ufbx_cache_deformer #foreign ufbx; +ufbx_as_cache_file :: (element: *ufbx_element) -> *ufbx_cache_file #foreign ufbx; +ufbx_as_material :: (element: *ufbx_element) -> *ufbx_material #foreign ufbx; +ufbx_as_texture :: (element: *ufbx_element) -> *ufbx_texture #foreign ufbx; +ufbx_as_video :: (element: *ufbx_element) -> *ufbx_video #foreign ufbx; +ufbx_as_shader :: (element: *ufbx_element) -> *ufbx_shader #foreign ufbx; +ufbx_as_shader_binding :: (element: *ufbx_element) -> *ufbx_shader_binding #foreign ufbx; +ufbx_as_anim_stack :: (element: *ufbx_element) -> *ufbx_anim_stack #foreign ufbx; +ufbx_as_anim_layer :: (element: *ufbx_element) -> *ufbx_anim_layer #foreign ufbx; +ufbx_as_anim_value :: (element: *ufbx_element) -> *ufbx_anim_value #foreign ufbx; +ufbx_as_anim_curve :: (element: *ufbx_element) -> *ufbx_anim_curve #foreign ufbx; +ufbx_as_display_layer :: (element: *ufbx_element) -> *ufbx_display_layer #foreign ufbx; +ufbx_as_selection_set :: (element: *ufbx_element) -> *ufbx_selection_set #foreign ufbx; +ufbx_as_selection_node :: (element: *ufbx_element) -> *ufbx_selection_node #foreign ufbx; +ufbx_as_character :: (element: *ufbx_element) -> *ufbx_character #foreign ufbx; +ufbx_as_constraint :: (element: *ufbx_element) -> *ufbx_constraint #foreign ufbx; +ufbx_as_pose :: (element: *ufbx_element) -> *ufbx_pose #foreign ufbx; +ufbx_as_metadata_object :: (element: *ufbx_element) -> *ufbx_metadata_object #foreign ufbx; + +// -- FFI API +ufbx_ffi_find_int_len :: (retval: *s64, props: *ufbx_props, name: *u8, name_len: size_t, def: *s64) -> void #foreign ufbx; +ufbx_ffi_find_vec3_len :: (retval: *ufbx_vec3, props: *ufbx_props, name: *u8, name_len: size_t, def: *ufbx_vec3) -> void #foreign ufbx; +ufbx_ffi_find_string_len :: (retval: *ufbx_string, props: *ufbx_props, name: *u8, name_len: size_t, def: *ufbx_string) -> void #foreign ufbx; +ufbx_ffi_find_anim_props :: (retval: *ufbx_anim_prop_list, layer: *ufbx_anim_layer, element: *ufbx_element) -> void #foreign ufbx; +ufbx_ffi_get_compatible_matrix_for_normals :: (retval: *ufbx_matrix, node: *ufbx_node) -> void #foreign ufbx; +ufbx_ffi_evaluate_anim_value_vec2 :: (retval: *ufbx_vec2, anim_value: *ufbx_anim_value, time: float64) -> void #foreign ufbx; +ufbx_ffi_evaluate_anim_value_vec3 :: (retval: *ufbx_vec3, anim_value: *ufbx_anim_value, time: float64) -> void #foreign ufbx; +ufbx_ffi_evaluate_prop_len :: (retval: *ufbx_prop, anim: *ufbx_anim, element: *ufbx_element, name: *u8, name_len: size_t, time: float64) -> void #foreign ufbx; +ufbx_ffi_evaluate_props :: (retval: *ufbx_props, anim: *ufbx_anim, element: *ufbx_element, time: float64, buffer: *ufbx_prop, buffer_size: size_t) -> void #foreign ufbx; +ufbx_ffi_evaluate_transform :: (retval: *ufbx_transform, anim: *ufbx_anim, node: *ufbx_node, time: float64) -> void #foreign ufbx; +ufbx_ffi_evaluate_blend_weight :: (anim: *ufbx_anim, channel: *ufbx_blend_channel, time: float64) -> ufbx_real #foreign ufbx; +ufbx_ffi_prepare_prop_overrides :: (retval: *ufbx_const_prop_override_list, overrides: *ufbx_prop_override, num_overrides: size_t) -> void #foreign ufbx; +ufbx_ffi_quat_mul :: (retval: *ufbx_quat, a: *ufbx_quat, b: *ufbx_quat) -> void #foreign ufbx; +ufbx_ffi_quat_normalize :: (retval: *ufbx_quat, q: *ufbx_quat) -> void #foreign ufbx; +ufbx_ffi_quat_fix_antipodal :: (retval: *ufbx_quat, q: *ufbx_quat, reference: *ufbx_quat) -> void #foreign ufbx; +ufbx_ffi_quat_slerp :: (retval: *ufbx_quat, a: *ufbx_quat, b: *ufbx_quat, t: ufbx_real) -> void #foreign ufbx; +ufbx_ffi_quat_rotate_vec3 :: (retval: *ufbx_vec3, q: *ufbx_quat, v: *ufbx_vec3) -> void #foreign ufbx; +ufbx_ffi_quat_to_euler :: (retval: *ufbx_vec3, q: *ufbx_quat, order: ufbx_rotation_order) -> void #foreign ufbx; +ufbx_ffi_euler_to_quat :: (retval: *ufbx_quat, v: *ufbx_vec3, order: ufbx_rotation_order) -> void #foreign ufbx; +ufbx_ffi_matrix_mul :: (retval: *ufbx_matrix, a: *ufbx_matrix, b: *ufbx_matrix) -> void #foreign ufbx; +ufbx_ffi_matrix_invert :: (retval: *ufbx_matrix, m: *ufbx_matrix) -> void #foreign ufbx; +ufbx_ffi_matrix_for_normals :: (retval: *ufbx_matrix, m: *ufbx_matrix) -> void #foreign ufbx; +ufbx_ffi_transform_position :: (retval: *ufbx_vec3, m: *ufbx_matrix, v: *ufbx_vec3) -> void #foreign ufbx; +ufbx_ffi_transform_direction :: (retval: *ufbx_vec3, m: *ufbx_matrix, v: *ufbx_vec3) -> void #foreign ufbx; +ufbx_ffi_transform_to_matrix :: (retval: *ufbx_matrix, t: *ufbx_transform) -> void #foreign ufbx; +ufbx_ffi_matrix_to_transform :: (retval: *ufbx_transform, m: *ufbx_matrix) -> void #foreign ufbx; +ufbx_ffi_get_skin_vertex_matrix :: (retval: *ufbx_matrix, skin: *ufbx_skin_deformer, vertex: size_t, fallback: *ufbx_matrix) -> void #foreign ufbx; +ufbx_ffi_get_blend_shape_vertex_offset :: (retval: *ufbx_vec3, shape: *ufbx_blend_shape, vertex: size_t) -> void #foreign ufbx; +ufbx_ffi_get_blend_vertex_offset :: (retval: *ufbx_vec3, blend: *ufbx_blend_deformer, vertex: size_t) -> void #foreign ufbx; +ufbx_ffi_evaluate_nurbs_curve :: (retval: *ufbx_curve_point, curve: *ufbx_nurbs_curve, u: ufbx_real) -> void #foreign ufbx; +ufbx_ffi_evaluate_nurbs_surface :: (retval: *ufbx_surface_point, surface: *ufbx_nurbs_surface, u: ufbx_real, v: ufbx_real) -> void #foreign ufbx; +ufbx_ffi_get_weighted_face_normal :: (retval: *ufbx_vec3, positions: *ufbx_vertex_vec3, face: *ufbx_face) -> void #foreign ufbx; +ufbx_ffi_get_triangulate_face_num_indices :: (face: *ufbx_face) -> size_t #foreign ufbx; +ufbx_ffi_triangulate_face :: (indices: *u32, num_indices: size_t, mesh: *ufbx_mesh, face: *ufbx_face) -> u32 #foreign ufbx; + +#scope_file + +ufbx :: #library,no_dll "./ufbx"; diff --git a/modules/ufbx/test/all_tests.h b/modules/ufbx/test/all_tests.h new file mode 100644 index 0000000..42d86b5 --- /dev/null +++ b/modules/ufbx/test/all_tests.h @@ -0,0 +1,27 @@ + +#define UFBXT_TEST_GROUP "" + +#include "test_deflate.h" +#include "test_math.h" +#include "test_parse.h" +#include "test_mesh.h" +#include "test_transform.h" +#include "test_animation.h" +#include "test_skin.h" +#include "test_material.h" +#include "test_camera.h" +#include "test_triangulate.h" +#include "test_topology.h" +#include "test_legacy.h" +#include "test_collections.h" +#include "test_constraints.h" +#include "test_curves.h" +#include "test_cache.h" +#include "test_nurbs.h" +#include "test_obj.h" +#include "test_convert.h" +#include "test_api.h" +#include "test_scenes.h" +#include "test_fuzz.h" + +#undef UFBXT_TEST_GROUP diff --git a/modules/ufbx/test/check_fbx.c b/modules/ufbx/test/check_fbx.c new file mode 100644 index 0000000..e490be4 --- /dev/null +++ b/modules/ufbx/test/check_fbx.c @@ -0,0 +1,345 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include +#include + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include +#endif + +static void ufbxt_assert_fail_imp(const char *func, const char *file, size_t line, const char *msg) +{ + fprintf(stderr, "%s:%zu: %s(%s) failed\n", file, line, func, msg); + exit(2); +} + +#define ufbxt_assert_fail(file, line, msg) ufbxt_assert_fail_imp("ufbxt_assert_fail", file, line, msg) +#define ufbxt_assert(m_cond) do { if (!(m_cond)) ufbxt_assert_fail_imp("ufbxt_assert", __FILE__, __LINE__, #m_cond); } while (0) +#define ufbx_assert(m_cond) do { if (!(m_cond)) ufbxt_assert_fail_imp("ufbx_assert", __FILE__, __LINE__, #m_cond); } while (0) + +bool g_verbose = false; + +#include "../ufbx.h" +#include "check_scene.h" +#include "check_material.h" +#include "testing_utils.h" +#include "cputime.h" + +#ifdef _WIN32 +int wmain(int argc, wchar_t **wide_argv) +#else +int main(int argc, char **argv) +#endif +{ +#ifdef _WIN32 + char **argv = (char**)malloc(sizeof(char*) * argc); + ufbxt_assert(argv); + for (int i = 0; i < argc; i++) { + int res = WideCharToMultiByte(CP_UTF8, 0, wide_argv[i], -1, NULL, 0, NULL, NULL); + ufbxt_assert(res > 0); + size_t dst_size = (size_t)res + 1; + char *dst = (char*)malloc(dst_size); + ufbxt_assert(dst); + res = WideCharToMultiByte(CP_UTF8, 0, wide_argv[i], -1, dst, (int)dst_size, NULL, NULL); + ufbxt_assert(res > 0 && (size_t)res < dst_size); + argv[i] = dst; + } +#endif + + cputime_begin_init(); + + const char *path = NULL; + const char *obj_path = NULL; + const char *mat_path = NULL; + const char *dump_obj_path = NULL; + int profile_runs = 0; + int frame = INT_MIN; + bool allow_bad_unicode = false; + bool sink = false; + bool ignore_missing_external = false; + bool dedicated_allocs = false; + + for (int i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-v")) { + g_verbose = true; + } else if (!strcmp(argv[i], "--obj")) { + if (++i < argc) obj_path = argv[i]; + } else if (!strcmp(argv[i], "--mat")) { + if (++i < argc) mat_path = argv[i]; + } else if (!strcmp(argv[i], "--dump-obj")) { + if (++i < argc) dump_obj_path = argv[i]; + } else if (!strcmp(argv[i], "--profile-runs")) { + if (++i < argc) profile_runs = atoi(argv[i]); + } else if (!strcmp(argv[i], "--frame")) { + if (++i < argc) frame = atoi(argv[i]); + } else if (!strcmp(argv[i], "--allow-bad-unicode")) { + allow_bad_unicode = true; + } else if (!strcmp(argv[i], "--dedicated-allocs")) { + dedicated_allocs = true; + } else if (!strcmp(argv[i], "--sink")) { + sink = true; + } else if (!strcmp(argv[i], "--ignore-missing-external")) { + ignore_missing_external = true; + } else if (argv[i][0] == '-') { + fprintf(stderr, "Unrecognized flag: %s\n", argv[i]); + exit(1); + } else { + path = argv[i]; + } + } + + if (!path) { + fprintf(stderr, "Usage: check_fbx \n"); + return 1; + } + + if (strstr(path, "ufbx-bad-unicode")) { + allow_bad_unicode = true; + } + + ufbx_load_opts opts = { 0 }; + opts.evaluate_skinning = true; + opts.evaluate_caches = true; + opts.load_external_files = true; + opts.generate_missing_normals = true; + opts.ignore_missing_external_files = ignore_missing_external; + opts.target_axes = ufbx_axes_right_handed_y_up; + opts.target_unit_meters = 0.01; + opts.obj_search_mtl_by_filename = true; + + if (dedicated_allocs) { + opts.temp_allocator.huge_threshold = 1; + opts.result_allocator.huge_threshold = 1; + } + + if (!allow_bad_unicode) { + opts.unicode_error_handling = UFBX_UNICODE_ERROR_HANDLING_ABORT_LOADING; + } + + ufbx_error error; + ufbx_scene *scene; + + uint64_t load_delta = 0; + { + uint64_t load_begin = cputime_cpu_tick(); + scene = ufbx_load_file(path, &opts, &error); + uint64_t load_end = cputime_cpu_tick(); + load_delta = load_end - load_begin; + } + + if (!scene) { + char buf[1024]; + ufbx_format_error(buf, sizeof(buf), &error); + fprintf(stderr, "%s\n", buf); + return 1; + } + + cputime_end_init(); + + { + size_t fbx_size = ufbxt_file_size(path); + printf("Loaded in %.2fms: File %.1fkB, temp %.1fkB (%zu allocs), result %.1fkB (%zu allocs)\n", + cputime_cpu_delta_to_sec(NULL, load_delta) * 1e3, + (double)fbx_size * 1e-3, + (double)scene->metadata.temp_memory_used * 1e-3, + scene->metadata.temp_allocs, + (double)scene->metadata.result_memory_used * 1e-3, + scene->metadata.result_allocs + ); + } + + const char *exporters[] = { + "Unknown", + "FBX SDK", + "Blender Binary", + "Blender ASCII", + "MotionBuilder", + "Unity Exporter (from Building Crafter)", + }; + + const char *formats[2][2] = { + { "binary", "binary (big-endian)" }, + { "ascii", "!?!?ascii (big-endian)!?!?" }, + }; + + const char *application = scene->metadata.latest_application.name.data; + if (!application[0]) application = "unknown"; + + printf("FBX %u %s via %s %u.%u.%u (%s)\n", + scene->metadata.version, + formats[scene->metadata.ascii][scene->metadata.big_endian], + exporters[scene->metadata.exporter], + ufbx_version_major(scene->metadata.exporter_version), + ufbx_version_minor(scene->metadata.exporter_version), + ufbx_version_patch(scene->metadata.exporter_version), + application); + + { + size_t fbx_size = 0; + void *fbx_data = ufbxt_read_file(path, &fbx_size); + if (fbx_data) { + + for (int i = 0; i < profile_runs; i++) { + uint64_t load_begin = cputime_cpu_tick(); + ufbx_scene *memory_scene = ufbx_load_memory(fbx_data, fbx_size, NULL, NULL); + uint64_t load_end = cputime_cpu_tick(); + + printf("Loaded in %.2fms: File %.1fkB, temp %.1fkB (%zu allocs), result %.1fkB (%zu allocs)\n", + cputime_cpu_delta_to_sec(NULL, load_end - load_begin) * 1e3, + (double)fbx_size * 1e-3, + (double)scene->metadata.temp_memory_used * 1e-3, + scene->metadata.temp_allocs, + (double)scene->metadata.result_memory_used * 1e-3, + scene->metadata.result_allocs + ); + + ufbxt_assert(memory_scene); + ufbx_free_scene(memory_scene); + } + + free(fbx_data); + } + } + + int result = 0; + + if (!strstr(path, "ufbx-unknown")) { + bool ignore_unknowns = false; + bool has_unknowns = false; + + for (size_t i = 0; i < scene->unknowns.count; i++) { + ufbx_unknown *unknown = scene->unknowns.data[i]; + if (strstr(unknown->super_type.data, "MotionBuilder")) continue; + if (strstr(unknown->type.data, "Container")) continue; + if (!strcmp(unknown->super_type.data, "Object") && unknown->type.length == 0 && unknown->sub_type.length == 0) continue; + if (!strcmp(unknown->super_type.data, "PluginParameters")) continue; + if (!strcmp(unknown->super_type.data, "TimelineXTrack")) continue; + if (!strcmp(unknown->super_type.data, "GlobalShading")) continue; + if (!strcmp(unknown->super_type.data, "ControlSetPlug")) continue; + if (!strcmp(unknown->sub_type.data, "NodeAttribute")) continue; + if (!strcmp(unknown->type.data, "GroupSelection")) continue; + if (!strcmp(unknown->name.data, "ADSKAssetReferencesVersion3.0")) { + ignore_unknowns = true; + } + + has_unknowns = true; + fprintf(stderr, "Unknown element: %s/%s/%s : %s\n", unknown->super_type.data, unknown->type.data, unknown->sub_type.data, unknown->name.data); + } + + if (has_unknowns && !ignore_unknowns) { + result = 3; + } + } + + bool known_unknown = false; + if (strstr(scene->metadata.creator.data, "kenney")) known_unknown = true; + if (strstr(scene->metadata.creator.data, "assetforge")) known_unknown = true; + if (scene->metadata.version < 5800) known_unknown = true; + ufbxt_assert(scene->metadata.exporter != UFBX_EXPORTER_UNKNOWN || known_unknown); + + ufbxt_check_scene(scene); + + if (obj_path) { + size_t obj_size; + void *obj_data = ufbxt_read_file_ex(obj_path, &obj_size); + if (!obj_data) { + fprintf(stderr, "Failed to read .obj file: %s\n", obj_path); + return 1; + } + + ufbxt_load_obj_opts obj_opts = { 0 }; + + ufbxt_obj_file *obj_file = ufbxt_load_obj(obj_data, obj_size, &obj_opts); + + obj_file->normalize_units = true; + + ufbx_scene *state; + if (obj_file->animation_frame >= 0 || frame != INT_MIN) { + ufbx_anim anim = scene->anim; + + if (obj_file->animation_name[0]) { + ufbx_anim_stack *stack = ufbx_find_anim_stack(scene, obj_file->animation_name); + ufbxt_assert(stack); + anim = stack->anim; + } + + double time = anim.time_begin + (double)obj_file->animation_frame / (double)scene->settings.frames_per_second; + + if (frame != INT_MIN) { + time = (double)frame / (double)scene->settings.frames_per_second; + } + + ufbx_evaluate_opts eval_opts = { 0 }; + eval_opts.evaluate_skinning = true; + eval_opts.evaluate_caches = true; + eval_opts.load_external_files = true; + state = ufbx_evaluate_scene(scene, &anim, time, &eval_opts, NULL); + ufbxt_assert(state); + } else { + state = scene; + ufbx_retain_scene(state); + } + + if (dump_obj_path) { + ufbxt_debug_dump_obj_scene(dump_obj_path, state); + printf("Dumped .obj to %s\n", dump_obj_path); + } + + ufbxt_diff_error err = { 0 }; + ufbxt_diff_to_obj(state, obj_file, &err, 0); + + if (err.num > 0) { + ufbx_real avg = err.sum / (ufbx_real)err.num; + printf("Absolute diff: avg %.3g, max %.3g (%zu tests)\n", avg, err.max, err.num); + } + + ufbx_free_scene(state); + free(obj_file); + free(obj_data); + } else { + if (dump_obj_path) { + ufbxt_debug_dump_obj_scene(dump_obj_path, scene); + printf("Dumped .obj to %s\n", dump_obj_path); + } + } + + if (mat_path) { + size_t mat_size; + void *mat_data = ufbxt_read_file_ex(mat_path, &mat_size); + if (!mat_data) { + fprintf(stderr, "Failed to read .mat file: %s\n", mat_path); + return 1; + } + + const char *mat_filename = mat_path + strlen(mat_path); + while (mat_filename > mat_path && (mat_filename[-1] != '\\' && mat_filename[-1] != '/')) { + mat_filename--; + } + bool ok = ufbxt_check_materials(scene, (const char*)mat_data, mat_filename); + if (!ok && !result) { + result = 4; + } + + free(mat_data); + } + + ufbx_free_scene(scene); + + if (sink) { + printf("%u\n", ufbxt_sink); + } + + return result; +} + +#define CPUTIME_IMPLEMENTATION +#ifndef UFBX_DEV + #define UFBX_DEV +#endif + +#include "cputime.h" +#include "../ufbx.c" diff --git a/modules/ufbx/test/check_material.h b/modules/ufbx/test/check_material.h new file mode 100644 index 0000000..872ee58 --- /dev/null +++ b/modules/ufbx/test/check_material.h @@ -0,0 +1,557 @@ +#ifndef UFBXT_CHECK_MATERIAL_H_INCLUDED +#define UFBXT_CHECK_MATERIAL_H_INCLUDED + +#include "../ufbx.h" +#include + +static const char *ufbxt_fbx_map_name(ufbx_material_fbx_map map) +{ + switch (map) { + case UFBX_MATERIAL_FBX_DIFFUSE_FACTOR: return "diffuse_factor"; + case UFBX_MATERIAL_FBX_DIFFUSE_COLOR: return "diffuse_color"; + case UFBX_MATERIAL_FBX_SPECULAR_FACTOR: return "specular_factor"; + case UFBX_MATERIAL_FBX_SPECULAR_COLOR: return "specular_color"; + case UFBX_MATERIAL_FBX_SPECULAR_EXPONENT: return "specular_exponent"; + case UFBX_MATERIAL_FBX_REFLECTION_FACTOR: return "reflection_factor"; + case UFBX_MATERIAL_FBX_REFLECTION_COLOR: return "reflection_color"; + case UFBX_MATERIAL_FBX_TRANSPARENCY_FACTOR: return "transparency_factor"; + case UFBX_MATERIAL_FBX_TRANSPARENCY_COLOR: return "transparency_color"; + case UFBX_MATERIAL_FBX_EMISSION_FACTOR: return "emission_factor"; + case UFBX_MATERIAL_FBX_EMISSION_COLOR: return "emission_color"; + case UFBX_MATERIAL_FBX_AMBIENT_FACTOR: return "ambient_factor"; + case UFBX_MATERIAL_FBX_AMBIENT_COLOR: return "ambient_color"; + case UFBX_MATERIAL_FBX_NORMAL_MAP: return "normal_map"; + case UFBX_MATERIAL_FBX_BUMP: return "bump"; + case UFBX_MATERIAL_FBX_BUMP_FACTOR: return "bump_factor"; + case UFBX_MATERIAL_FBX_DISPLACEMENT_FACTOR: return "displacement_factor"; + case UFBX_MATERIAL_FBX_DISPLACEMENT: return "displacement"; + case UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT_FACTOR: return "vector_displacement_factor"; + case UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT: return "vector_displacement"; + } + + ufbxt_assert(0 && "Unhandled PBR map name"); + return NULL; +} + +static const char *ufbxt_pbr_map_name(ufbx_material_pbr_map map) +{ + switch (map) { + case UFBX_MATERIAL_PBR_BASE_FACTOR: return "base_factor"; + case UFBX_MATERIAL_PBR_BASE_COLOR: return "base_color"; + case UFBX_MATERIAL_PBR_ROUGHNESS: return "roughness"; + case UFBX_MATERIAL_PBR_METALNESS: return "metalness"; + case UFBX_MATERIAL_PBR_DIFFUSE_ROUGHNESS: return "diffuse_roughness"; + case UFBX_MATERIAL_PBR_SPECULAR_FACTOR: return "specular_factor"; + case UFBX_MATERIAL_PBR_SPECULAR_COLOR: return "specular_color"; + case UFBX_MATERIAL_PBR_SPECULAR_IOR: return "specular_ior"; + case UFBX_MATERIAL_PBR_SPECULAR_ANISOTROPY: return "specular_anisotropy"; + case UFBX_MATERIAL_PBR_SPECULAR_ROTATION: return "specular_rotation"; + case UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR: return "transmission_factor"; + case UFBX_MATERIAL_PBR_TRANSMISSION_COLOR: return "transmission_color"; + case UFBX_MATERIAL_PBR_TRANSMISSION_DEPTH: return "transmission_depth"; + case UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER: return "transmission_scatter"; + case UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER_ANISOTROPY: return "transmission_scatter_anisotropy"; + case UFBX_MATERIAL_PBR_TRANSMISSION_DISPERSION: return "transmission_dispersion"; + case UFBX_MATERIAL_PBR_TRANSMISSION_ROUGHNESS: return "transmission_roughness"; + case UFBX_MATERIAL_PBR_TRANSMISSION_EXTRA_ROUGHNESS: return "transmission_extra_roughness"; + case UFBX_MATERIAL_PBR_TRANSMISSION_PRIORITY: return "transmission_priority"; + case UFBX_MATERIAL_PBR_TRANSMISSION_ENABLE_IN_AOV: return "transmission_enable_in_aov"; + case UFBX_MATERIAL_PBR_SUBSURFACE_FACTOR: return "subsurface_factor"; + case UFBX_MATERIAL_PBR_SUBSURFACE_COLOR: return "subsurface_color"; + case UFBX_MATERIAL_PBR_SUBSURFACE_RADIUS: return "subsurface_radius"; + case UFBX_MATERIAL_PBR_SUBSURFACE_SCALE: return "subsurface_scale"; + case UFBX_MATERIAL_PBR_SUBSURFACE_ANISOTROPY: return "subsurface_anisotropy"; + case UFBX_MATERIAL_PBR_SUBSURFACE_TINT_COLOR: return "subsurface_tint_color"; + case UFBX_MATERIAL_PBR_SUBSURFACE_TYPE: return "subsurface_type"; + case UFBX_MATERIAL_PBR_SHEEN_FACTOR: return "sheen_factor"; + case UFBX_MATERIAL_PBR_SHEEN_COLOR: return "sheen_color"; + case UFBX_MATERIAL_PBR_SHEEN_ROUGHNESS: return "sheen_roughness"; + case UFBX_MATERIAL_PBR_COAT_FACTOR: return "coat_factor"; + case UFBX_MATERIAL_PBR_COAT_COLOR: return "coat_color"; + case UFBX_MATERIAL_PBR_COAT_ROUGHNESS: return "coat_roughness"; + case UFBX_MATERIAL_PBR_COAT_IOR: return "coat_ior"; + case UFBX_MATERIAL_PBR_COAT_ANISOTROPY: return "coat_anisotropy"; + case UFBX_MATERIAL_PBR_COAT_ROTATION: return "coat_rotation"; + case UFBX_MATERIAL_PBR_COAT_NORMAL: return "coat_normal"; + case UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_COLOR: return "coat_affect_base_color"; + case UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_ROUGHNESS: return "coat_affect_base_roughness"; + case UFBX_MATERIAL_PBR_THIN_FILM_THICKNESS: return "thin_film_thickness"; + case UFBX_MATERIAL_PBR_THIN_FILM_IOR: return "thin_film_ior"; + case UFBX_MATERIAL_PBR_EMISSION_FACTOR: return "emission_factor"; + case UFBX_MATERIAL_PBR_EMISSION_COLOR: return "emission_color"; + case UFBX_MATERIAL_PBR_OPACITY: return "opacity"; + case UFBX_MATERIAL_PBR_INDIRECT_DIFFUSE: return "indirect_diffuse"; + case UFBX_MATERIAL_PBR_INDIRECT_SPECULAR: return "indirect_specular"; + case UFBX_MATERIAL_PBR_NORMAL_MAP: return "normal_map"; + case UFBX_MATERIAL_PBR_TANGENT_MAP: return "tangent_map"; + case UFBX_MATERIAL_PBR_DISPLACEMENT_MAP: return "displacement_map"; + case UFBX_MATERIAL_PBR_MATTE_FACTOR: return "matte_factor"; + case UFBX_MATERIAL_PBR_MATTE_COLOR: return "matte_color"; + case UFBX_MATERIAL_PBR_AMBIENT_OCCLUSION: return "ambient_occlusion"; + case UFBX_MATERIAL_PBR_GLOSSINESS: return "glossiness"; + case UFBX_MATERIAL_PBR_COAT_GLOSSINESS: return "coat_glossiness"; + case UFBX_MATERIAL_PBR_TRANSMISSION_GLOSSINESS: return "transmission_glossiness"; + } + + ufbxt_assert(0 && "Unhandled PBR map name"); + return 0; +} + +static const char *ufbxt_material_feature_name(ufbx_material_pbr_map map) +{ + switch (map) { + case UFBX_MATERIAL_FEATURE_PBR: return "pbr"; + case UFBX_MATERIAL_FEATURE_METALNESS: return "metalness"; + case UFBX_MATERIAL_FEATURE_DIFFUSE: return "diffuse"; + case UFBX_MATERIAL_FEATURE_SPECULAR: return "specular"; + case UFBX_MATERIAL_FEATURE_EMISSION: return "emission"; + case UFBX_MATERIAL_FEATURE_TRANSMISSION: return "transmission"; + case UFBX_MATERIAL_FEATURE_COAT: return "coat"; + case UFBX_MATERIAL_FEATURE_SHEEN: return "sheen"; + case UFBX_MATERIAL_FEATURE_OPACITY: return "opacity"; + case UFBX_MATERIAL_FEATURE_AMBIENT_OCCLUSION: return "ambient_occlusion"; + case UFBX_MATERIAL_FEATURE_MATTE: return "matte"; + case UFBX_MATERIAL_FEATURE_UNLIT: return "unlit"; + case UFBX_MATERIAL_FEATURE_IOR: return "ior"; + case UFBX_MATERIAL_FEATURE_DIFFUSE_ROUGHNESS: return "diffuse_roughness"; + case UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS: return "transmission_roughness"; + case UFBX_MATERIAL_FEATURE_THIN_WALLED: return "thin_walled"; + case UFBX_MATERIAL_FEATURE_CAUSTICS: return "caustics"; + case UFBX_MATERIAL_FEATURE_EXIT_TO_BACKGROUND: return "exit_to_background"; + case UFBX_MATERIAL_FEATURE_INTERNAL_REFLECTIONS: return "internal_reflections"; + case UFBX_MATERIAL_FEATURE_DOUBLE_SIDED: return "double_sided"; + case UFBX_MATERIAL_FEATURE_ROUGHNESS_AS_GLOSSINESS: return "roughness_as_glossiness"; + case UFBX_MATERIAL_FEATURE_COAT_ROUGHNESS_AS_GLOSSINESS: return "coat_roughness_as_glossiness"; + case UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS_AS_GLOSSINESS: return "transmission_roughness_as_glossiness"; + } + + ufbxt_assert(0 && "Unhandled material feature name"); + return 0; +} + +static const char *ufbxt_shader_type_name(ufbx_shader_type map) +{ + switch (map) { + case UFBX_SHADER_UNKNOWN: return "unknown"; + case UFBX_SHADER_FBX_LAMBERT: return "fbx_lambert"; + case UFBX_SHADER_FBX_PHONG: return "fbx_phong"; + case UFBX_SHADER_OSL_STANDARD_SURFACE: return "osl_standard_surface"; + case UFBX_SHADER_ARNOLD_STANDARD_SURFACE: return "arnold_standard_surface"; + case UFBX_SHADER_3DS_MAX_PHYSICAL_MATERIAL: return "3ds_max_physical_material"; + case UFBX_SHADER_3DS_MAX_PBR_METAL_ROUGH: return "3ds_max_pbr_metal_rough"; + case UFBX_SHADER_3DS_MAX_PBR_SPEC_GLOSS: return "3ds_max_pbr_spec_gloss"; + case UFBX_SHADER_GLTF_MATERIAL: return "gltf_material"; + case UFBX_SHADER_SHADERFX_GRAPH: return "shaderfx_graph"; + case UFBX_SHADER_BLENDER_PHONG: return "blender_phong"; + case UFBX_SHADER_WAVEFRONT_MTL: return "wavefront_mtl"; + } + + ufbxt_assert(0 && "Unhandled material feature name"); + return 0; +} + +static size_t ufbxt_tokenize_line(char *buf, size_t buf_len, const char **tokens, size_t max_tokens, const char **p_line, const char *sep_chars) +{ + bool prev_sep = true; + + size_t num_tokens = 0; + size_t buf_pos = 0; + + const char *p = *p_line; + for (;;) { + char c = *p; + if (c == '\0' || c == '\n') break; + + bool sep = false; + for (const char *s = sep_chars; *s; s++) { + if (*s == c) { + sep = true; + break; + } + } + + if (!sep) { + if (prev_sep) { + ufbxt_assert(buf_pos < buf_len); + buf[buf_pos++] = '\0'; + + ufbxt_assert(num_tokens < max_tokens); + tokens[num_tokens++] = buf + buf_pos; + } + + if (c == '"') { + p++; + while (*p != '"') { + c = *p; + if (c == '\\') { + p++; + switch (*p) { + case 'n': c = '\n'; break; + case 'r': c = '\r'; break; + case 't': c = '\t'; break; + case '\\': c = '\\'; break; + case '"': c = '"'; break; + default: + fprintf(stderr, "Bad escape '\\%c'\n", *p); + ufbxt_assert(0 && "Bad escape"); + return 0; + } + } + ufbxt_assert(buf_pos < buf_len); + buf[buf_pos++] = c; + p++; + } + } else { + ufbxt_assert(buf_pos < buf_len); + buf[buf_pos++] = c; + } + } + prev_sep = sep; + p++; + } + + ufbxt_assert(buf_pos < buf_len); + buf[buf_pos++] = '\0'; + + for (size_t i = num_tokens; i < max_tokens; i++) { + tokens[i] = ""; + } + + if (*p == '\n') p += 1; + *p_line = p; + + return num_tokens; +} + +static bool ufbxt_check_materials(ufbx_scene *scene, const char *spec, const char *filename) +{ + bool ok = true; + + char line_buf[512]; + const char *tokens[8]; + + char dot_buf[512]; + const char *dots[8]; + + bool seen_materials[256]; + + ufbx_material *material = NULL; + size_t num_materials = 0; + size_t num_props = 0; + + double err_sum = 0.0; + double err_max = 0.0; + size_t err_num = 0; + + bool material_error = false; + bool require_all = false; + + long version = 0; + + int line = 0; + while (*spec != '\0') { + size_t num_tokens = ufbxt_tokenize_line(line_buf, sizeof(line_buf), tokens, ufbxt_arraycount(tokens), &spec, " \t\r"); + line++; + + if (num_tokens == 0) continue; + + const char *first_token = tokens[0]; + size_t num_dots = ufbxt_tokenize_line(dot_buf, sizeof(dot_buf), dots, ufbxt_arraycount(dots), &first_token, "."); + + if (!strcmp(dots[0], "version")) { + char *end = NULL; + version = strtol(tokens[1], &end, 10); + if (!end || *end != '\0') { + fprintf(stderr, "%s:%d: Bad value in '%s': '%s'\n", filename, line, tokens[0], tokens[1]); + ok = false; + continue; + } + + continue; + } else if (!strcmp(dots[0], "require")) { + if (!strcmp(tokens[1], "all")) { + if (scene->materials.count > ufbxt_arraycount(seen_materials)) { + fprintf(stderr, "%s:%d: Too many materials in file for 'reqiure all': %zu (max %zu)\n", filename, line, + scene->materials.count, (size_t)ufbxt_arraycount(seen_materials)); + ok = false; + continue; + } + require_all = true; + memset(seen_materials, 0, scene->materials.count * sizeof(bool)); + } else { + fprintf(stderr, "%s:%d: Bad require directive: '%s'\n", filename, line, tokens[1]); + ok = false; + continue; + } + continue; + } else if (!strcmp(dots[0], "material")) { + if (*tokens[1] == '\0') { + fprintf(stderr, "%s:%d: Expected material name for 'material'\n", filename, line); + ok = false; + } + + material = ufbx_find_material(scene, tokens[1]); + if (!material) { + fprintf(stderr, "%s:%d: Material not found: '%s'\n", filename, line, tokens[1]); + ok = false; + } + material_error = !material; + + if (material) { + seen_materials[material->typed_id] = true; + } + + num_materials++; + continue; + } + + if (!material) { + if (!material_error) { + fprintf(stderr, "%s:%d: Statement '%s' needs to have a material defined\n", filename, line, tokens[0]); + } + ok = false; + continue; + } + + num_props++; + + if (!strcmp(dots[0], "fbx") || !strcmp(dots[0], "pbr")) { + ufbx_material_map *map = NULL; + if (!strcmp(dots[0], "fbx")) { + ufbx_material_fbx_map name = (ufbx_material_fbx_map)UFBX_MATERIAL_FBX_MAP_COUNT; + for (size_t i = 0; i < UFBX_MATERIAL_FBX_MAP_COUNT; i++) { + const char *str = ufbxt_fbx_map_name((ufbx_material_fbx_map)i); + if (!strcmp(dots[1], str)) { + name = (ufbx_material_fbx_map)i; + break; + } + } + if (name == (ufbx_material_fbx_map)UFBX_MATERIAL_FBX_MAP_COUNT) { + fprintf(stderr, "%s:%d: Unknown FBX material map '%s' in '%s'\n", filename, line, dots[1], tokens[0]); + ok = false; + } else { + map = &material->fbx.maps[name]; + } + } else if (!strcmp(dots[0], "pbr")) { + ufbx_material_pbr_map name = (ufbx_material_pbr_map)UFBX_MATERIAL_PBR_MAP_COUNT; + for (size_t i = 0; i < UFBX_MATERIAL_PBR_MAP_COUNT; i++) { + const char *str = ufbxt_pbr_map_name((ufbx_material_pbr_map)i); + if (!strcmp(dots[1], str)) { + name = (ufbx_material_pbr_map)i; + break; + } + } + if (name == (ufbx_material_pbr_map)UFBX_MATERIAL_PBR_MAP_COUNT) { + fprintf(stderr, "%s:%d: Unknown PBR material map '%s' in '%s'\n", filename, line, dots[1], tokens[0]); + ok = false; + } else { + map = &material->pbr.maps[name]; + } + } else { + ufbxt_assert(0 && "Unhandled branch"); + } + + // Errors reported above, but set ok to false just to be sure.. + if (!map) { + ok = false; + continue; + } + + if (!strcmp(dots[2], "texture")) { + size_t tok_start = 1; + bool content = false; + for (;;) { + const char *tok = tokens[tok_start]; + if (!strcmp(tok, "content")) { + content = true; + } else { + break; + } + tok_start++; + } + + const char *tex_name = tokens[tok_start]; + if (map->texture) { + if (strcmp(map->texture->relative_filename.data, tex_name) != 0) { + fprintf(stderr, "%s:%d: Material '%s' %s.%s is different: got '%s', expected '%s'\n", filename, line, + material->name.data, dots[0], dots[1], map->texture->relative_filename.data, tex_name); + ok = false; + } + if (content && map->texture->content.size == 0) { + fprintf(stderr, "%s:%d: Material '%s' %s.%s expected content for the texture %s\n", filename, line, + material->name.data, dots[0], dots[1], map->texture->relative_filename.data); + ok = false; + } + } else { + fprintf(stderr, "%s:%d: Material '%s' %s.%s missing texture, expected '%s'\n", filename, line, + material->name.data, dots[0], dots[1], tex_name); + ok = false; + } + } else { + size_t tok_start = 1; + bool implicit = false; + bool widen = false; + for (;;) { + const char *tok = tokens[tok_start]; + if (!strcmp(tok, "implicit")) { + implicit = true; + } else if (!strcmp(tok, "widen")) { + widen = true; + } else { + break; + } + tok_start++; + } + + double ref[4]; + size_t num_ref = 0; + for (; num_ref < 4; num_ref++) { + const char *tok = tokens[tok_start + num_ref]; + if (!*tok) break; + + char *end = NULL; + ref[num_ref] = strtod(tok, &end); + if (!end || *end != '\0') { + fprintf(stderr, "%s:%d: Bad number in '%s': '%s'\n", filename, line, tokens[0], tok); + ok = false; + num_ref = 0; + break; + } + } + + if (num_ref == 0) continue; + + if (!implicit && !map->has_value) { + fprintf(stderr, "%s:%d: Material '%s' %s.%s not defined in material\n", filename, line, + material->name.data, dots[0], dots[1]); + ok = false; + continue; + } else if (implicit && map->has_value) { + fprintf(stderr, "%s:%d: Material '%s' %s.%s defined in material, expected implicit\n", filename, line, + material->name.data, dots[0], dots[1]); + ok = false; + continue; + } + + if (!implicit && !widen && (size_t)map->value_components != num_ref) { + fprintf(stderr, "%s:%d: Material '%s' %s.%s has wrong number of components: got %zu, expected %zu\n", filename, line, + material->name.data, dots[0], dots[1], (size_t)map->value_components, num_ref); + ok = false; + continue; + } + + if (widen && map->value_components >= num_ref) { + fprintf(stderr, "%s:%d: Material '%s' %s.%s exected to be widened got %zu components, expected %zu\n", filename, line, + material->name.data, dots[0], dots[1], (size_t)map->value_components, num_ref); + ok = false; + continue; + } + + char mat_str[128]; + char ref_str[128]; + size_t mat_pos = 0; + size_t ref_pos = 0; + + bool equal = true; + for (size_t i = 0; i < num_ref; i++) { + double mat_value = map->value_vec4.v[i]; + double ref_value = ref[i]; + double err = fabs(mat_value - ref_value); + if (err > 0.002) { + equal = false; + } + + err_sum += err; + if (err > err_max) err_max = err; + err_num += 1; + + if (i > 0) { + mat_pos += (size_t)snprintf(mat_str + mat_pos, sizeof(mat_str) - mat_pos, ", "); + ref_pos += (size_t)snprintf(ref_str + ref_pos, sizeof(ref_str) - ref_pos, ", "); + } + + mat_pos += (size_t)snprintf(mat_str + mat_pos, sizeof(mat_str) - mat_pos, "%.3f", mat_value); + ref_pos += (size_t)snprintf(ref_str + ref_pos, sizeof(ref_str) - ref_pos, "%.3f", ref_value); + } + + if (!equal) { + fprintf(stderr, "%s:%d: Material '%s' %s.%s has wrong value: got (%s), expected (%s)\n", filename, line, + material->name.data, dots[0], dots[1], mat_str, ref_str); + ok = false; + } + } + + } else if (!strcmp(dots[0], "features")) { + ufbx_material_feature name = (ufbx_material_feature)UFBX_MATERIAL_FEATURE_COUNT; + for (size_t i = 0; i < UFBX_MATERIAL_FEATURE_COUNT; i++) { + const char *str = ufbxt_material_feature_name((ufbx_material_feature)i); + if (!strcmp(dots[1], str)) { + name = (ufbx_material_feature)i; + break; + } + } + if (name == (ufbx_material_feature)UFBX_MATERIAL_FEATURE_COUNT) { + fprintf(stderr, "%s:%d: Unknown material feature '%s' in '%s'\n", filename, line, dots[1], tokens[0]); + ok = false; + } + + ufbx_material_feature_info *feature = &material->features.features[name]; + + char *end = NULL; + long enabled = strtol(tokens[1], &end, 10); + if (!end || *end != '\0') { + fprintf(stderr, "%s:%d: Bad value in '%s': '%s'\n", filename, line, tokens[0], tokens[1]); + ok = false; + continue; + } + + if (enabled != (long)feature->enabled) { + fprintf(stderr, "%s:%d: Material '%s' features.%s mismatch: got %ld, expected %ld\n", filename, line, + material->name.data, dots[1], (long)feature->enabled, enabled); + ok = false; + continue; + } + } else if (!strcmp(dots[0], "shader_type")) { + ufbx_shader_type name = (ufbx_shader_type)UFBX_SHADER_TYPE_COUNT; + for (size_t i = 0; i < UFBX_SHADER_TYPE_COUNT; i++) { + const char *str = ufbxt_shader_type_name((ufbx_shader_type)i); + if (!strcmp(tokens[1], str)) { + name = (ufbx_shader_type)i; + break; + } + } + if (name == (ufbx_shader_type)UFBX_SHADER_TYPE_COUNT) { + fprintf(stderr, "%s:%d: Unknown shader type '%s' in '%s'\n", filename, line, tokens[1], tokens[0]); + ok = false; + } + + if (material->shader_type != name) { + const char *mat_name = ufbxt_shader_type_name(material->shader_type); + fprintf(stderr, "%s:%d: Material '%s' shader type mismatch: got '%s', expected '%s'\n", filename, line, + material->name.data, mat_name, tokens[1]); + } + } else { + fprintf(stderr, "%s:%d: Invalid token '%s'\n", filename, line, tokens[0]); + ok = false; + } + } + + if (require_all) { + for (size_t i = 0; i < scene->materials.count; i++) { + if (!seen_materials[i]) { + fprintf(stderr, "%s: 'require all': Material in FBX not described: '%s'\n", filename, + scene->materials.data[i]->name.data); + ok = false; + } + } + } + + if (ok) { + double avg = err_num > 0 ? err_sum / (double)err_num : 0.0; + printf("Checked %zu materials, %zu properties (error avg %.3g, max %.3g, %zu tests)\n", num_materials, num_props, avg, err_max, err_num); + } + + return ok; +} + +#endif diff --git a/modules/ufbx/test/check_scene.h b/modules/ufbx/test/check_scene.h new file mode 100644 index 0000000..c240910 --- /dev/null +++ b/modules/ufbx/test/check_scene.h @@ -0,0 +1,1364 @@ +#ifndef UFBXT_CHECK_SCENE_H_INCLUDED +#define UFBXT_CHECK_SCENE_H_INCLUDED + +#ifndef ufbxt_assert +#include +#define ufbxt_assert(cond) assert(cond) +#endif + +#ifndef ufbxt_arraycount +#define ufbxt_arraycount(arr) (sizeof(arr) / sizeof(*(arr))) +#endif + +static uint32_t ufbxt_sink = 0; + +#include +#include +#include "../ufbx.h" + +static int ufbxt_is_utf8(const char *str, size_t length) +{ + // Table of valid UTF-8 byte sequences: {min,max} (inclusive) + // Adapted from https://www.w3.org/International/questions/qa-forms-utf-8 + static const unsigned char utf8_forms[8][4][2] = { + { {0xc2,0xdf}, {0x80,0xbf}, }, // Non-overlong 2-byte + { {0xe0,0xe0}, {0xa0,0xbf}, {0x80,0xbf}, }, // Excluding overlongs + { {0xe1,0xec}, {0x80,0xbf}, {0x80,0xbf}, }, // Straight 3-byte + { {0xee,0xef}, {0x80,0xbf}, {0x80,0xbf}, }, // Straight 3-byte + { {0xed,0xed}, {0x80,0x9f}, {0x80,0xbf}, }, // Excluding surrogates + { {0xf0,0xf0}, {0x90,0xbf}, {0x80,0xbf}, {0x80,0xbf}, }, // Planes 1-3 + { {0xf1,0xf3}, {0x80,0xbf}, {0x80,0xbf}, {0x80,0xbf}, }, // Planes 4-15 + { {0xf4,0xf4}, {0x80,0x8f}, {0x80,0xbf}, {0x80,0xbf}, }, // Plane 16 + }; + + size_t pos = 0, form, len; + while (pos < length) { + unsigned char c = (unsigned char)str[pos]; + + // Fast path for ASCII (U+0000 excluded in ufbx) + if (c >= 0x01 && c <= 0x7f) { + pos += 1; + continue; + } + + // All forms can be distinguished from the leading byte + for (form = 0; form < 8; form++) { + const unsigned char *range = utf8_forms[form][0]; + // Check that the first byte is within range + if (c >= range[0] && c <= range[1]) break; + } + + // Invalid starting byte + if (form == 8) return 0; + + // Validate the following 1-3 bytes + for (len = 1; len < 4; len++) { + const unsigned char *range = utf8_forms[form][len]; + // Forms end with max=0 (zero initialized) + if (range[1] == 0) break; + // Out of bounds + if (pos + len >= length) return 0; + // Check that the next byte is within range + c = (unsigned char)str[pos + len]; + if (c < utf8_forms[form][len][0] || c > utf8_forms[form][len][1]) return 0; + } + + // Advance to the next codepoint + pos += len; + } + + return 1; +} + +static bool ufbxt_float_equal(double a, double b) +{ + if (isnan(a)) { + return isnan(b); + } else { + return a == b; + } +} + +static void ufbxt_check_string(ufbx_string str) +{ + // Data may never be NULL, empty strings should have data = "" + ufbxt_assert(str.data != NULL); + ufbxt_assert(strlen(str.data) == str.length); + + // `ufbx_string` is always UTF-8 + ufbxt_assert(ufbxt_is_utf8(str.data, str.length)); +} + +static void ufbxt_check_memory(const void *data, size_t size) +{ + const uint8_t *d = (const uint8_t*)data; + for (size_t i = 0; i < size; i++) { + ufbxt_sink += (uint32_t)d[i]; + } +} + +static void ufbxt_check_blob(ufbx_blob blob) +{ + ufbxt_check_memory(blob.data, blob.size); +} + +#define ufbxt_check_list(list) ufbxt_check_memory((list).data, (list).count * sizeof(*(list).data)) + +static void ufbxt_check_element_ptr_any(ufbx_scene *scene, ufbx_element *element) +{ + if (!element) return; + ufbxt_assert(scene->elements.data[element->element_id] == element); + ufbxt_assert(scene->elements_by_type[element->type].data[element->typed_id] == element); +} + +static void ufbxt_check_element_ptr(ufbx_scene *scene, void *v_element, ufbx_element_type type) +{ + if (!v_element) return; + ufbx_element *element = (ufbx_element*)v_element; + ufbxt_assert(element->type == type); + ufbxt_assert(scene->elements.data[element->element_id] == element); + ufbxt_assert(scene->elements_by_type[element->type].data[element->typed_id] == element); +} + +static void ufbxt_check_vertex_element(ufbx_scene *scene, ufbx_mesh *mesh, void *void_elem, size_t elem_size) +{ + ufbx_vertex_attrib *elem = (ufbx_vertex_attrib*)void_elem; + if (!elem->exists) { + ufbxt_assert(elem->values.data == NULL); + ufbxt_assert(elem->values.count == 0); + ufbxt_assert(elem->indices.data == NULL); + ufbxt_assert(elem->indices.count == 0); + return; + } + + ufbxt_assert(elem->values.count >= 0); + ufbxt_assert(elem->values.count <= INT32_MAX); + ufbxt_assert(elem->indices.count == mesh->num_indices); + if (mesh->num_indices > 0) { + ufbxt_assert(elem->indices.data != NULL); + } + + // Check that the indices are in range + for (size_t i = 0; i < mesh->num_indices; i++) { + uint32_t ix = elem->indices.data[i]; + ufbxt_assert(ix < elem->values.count || (ix == UFBX_NO_INDEX && scene->metadata.may_contain_no_index)); + } + + // Check that the data at invalid index is valid and zero + if (elem->indices.count > 0) { + char zero[32] = { 0 }; + ufbxt_assert(elem_size <= 32); + ufbxt_assert(!memcmp((char*)elem->values.data - elem_size, zero, elem_size)); + } +} + +static void ufbxt_check_mesh_list_count(ufbx_scene *scene, ufbx_mesh *mesh, size_t count, size_t required_count, bool optional) +{ + if (count > 0 || !optional) { + ufbxt_assert(count == required_count); + } +} + +#define ufbxt_check_mesh_list(scene, mesh, list, required_count, optional) do { \ + ufbxt_check_list(list); \ + ufbxt_check_mesh_list_count((scene), (mesh), (list).count, (required_count), (optional)); \ + } while (0) + +static void ufbxt_check_props(ufbx_scene *scene, const ufbx_props *props, bool top) +{ + ufbx_prop *prev = NULL; + for (size_t i = 0; i < props->props.count; i++) { + ufbx_prop *prop = &props->props.data[i]; + + ufbxt_assert(prop->type < UFBX_PROP_TYPE_COUNT); + ufbxt_check_string(prop->name); + ufbxt_check_string(prop->value_str); + ufbxt_check_blob(prop->value_blob); + + // Properties should be sorted by name + if (prev) { + ufbxt_assert(prop->_internal_key >= prev->_internal_key); + ufbxt_assert(strcmp(prop->name.data, prev->name.data) >= 0); + } + + ufbx_prop *ref = ufbx_find_prop(props, prop->name.data); + if (top) { + ufbxt_assert(ref == prop); + } else { + ufbxt_assert(ref != NULL); + } + + // `REAL/VEC2/VEC3/VEC4` are mutually exclusive + uint32_t vec_flag = (uint32_t)prop->flags & (UFBX_PROP_FLAG_VALUE_REAL|UFBX_PROP_FLAG_VALUE_VEC2|UFBX_PROP_FLAG_VALUE_VEC3|UFBX_PROP_FLAG_VALUE_VEC4); + ufbxt_assert((vec_flag & (vec_flag - 1)) == 0); + + prev = prop; + } + + if (props->defaults) { + ufbxt_check_props(scene, props->defaults, false); + } +} + +static void ufbxt_check_element(ufbx_scene *scene, ufbx_element *element) +{ + if (scene->dom_root && scene->metadata.file_format == UFBX_FILE_FORMAT_FBX) { + bool requires_dom = true; + uint32_t version = scene->metadata.version; + + if (element->type == UFBX_ELEMENT_NODE && ((ufbx_node*)element)->is_root) { + requires_dom = false; + } else if (version < 6000 && element->type == UFBX_ELEMENT_ANIM_STACK) { + requires_dom = false; + } else if (version < 6000 && element->type == UFBX_ELEMENT_ANIM_LAYER) { + requires_dom = false; + } else if (version < 6000 && element->type == UFBX_ELEMENT_SKIN_DEFORMER) { + requires_dom = false; + } + + if (requires_dom) { + ufbxt_assert(element->dom_node); + } + } + + ufbxt_check_props(scene, &element->props, true); + ufbxt_check_string(element->name); + ufbxt_assert(scene->elements.data[element->element_id] == element); + + ufbxt_assert(scene->elements.data[element->element_id] == element); + ufbxt_assert(scene->elements_by_type[element->type].data[element->typed_id] == element); + + for (size_t i = 0; i < element->connections_src.count; i++) { + ufbx_connection *c = &element->connections_src.data[i]; + ufbxt_check_string(c->src_prop); + ufbxt_check_string(c->dst_prop); + ufbxt_assert(c->src == element); + ufbxt_check_element_ptr_any(scene, c->dst); + if (i > 0) { + int cmp = strcmp(c[-1].src_prop.data, c[0].src_prop.data); + ufbxt_assert(cmp <= 0); + if (cmp == 0) { + ufbxt_assert(strcmp(c[-1].dst_prop.data, c[0].dst_prop.data) <= 0); + } + } + } + + for (size_t i = 0; i < element->connections_dst.count; i++) { + ufbx_connection *c = &element->connections_dst.data[i]; + ufbxt_check_string(c->src_prop); + ufbxt_check_string(c->dst_prop); + ufbxt_assert(c->dst == element); + ufbxt_check_element_ptr_any(scene, c->src); + if (i > 0) { + int cmp = strcmp(c[-1].dst_prop.data, c[0].dst_prop.data); + ufbxt_assert(cmp <= 0); + if (cmp == 0) { + ufbxt_assert(strcmp(c[-1].src_prop.data, c[0].src_prop.data) <= 0); + } + } + } + + ufbxt_assert(element->type >= 0); + ufbxt_assert(element->type < UFBX_ELEMENT_TYPE_COUNT); + if (element->type >= UFBX_ELEMENT_TYPE_FIRST_ATTRIB && element->type <= UFBX_ELEMENT_TYPE_LAST_ATTRIB) { + for (size_t i = 0; i < element->instances.count; i++) { + ufbx_node *node = element->instances.data[i]; + ufbxt_check_element_ptr(scene, node, UFBX_ELEMENT_NODE); + bool found = false; + for (size_t j = 0; j < node->all_attribs.count; j++) { + if (node->all_attribs.data[j] == element) { + found = true; + break; + } + } + ufbxt_assert(found); + } + } else { + ufbxt_assert(element->instances.count == 0); + } +} + +static void ufbxt_check_unknown(ufbx_scene *scene, ufbx_unknown *unknown) +{ + ufbxt_check_string(unknown->type); + ufbxt_check_string(unknown->sub_type); + ufbxt_check_string(unknown->super_type); +} + +static void ufbxt_check_node(ufbx_scene *scene, ufbx_node *node) +{ + ufbxt_check_element_ptr(scene, node->parent, UFBX_ELEMENT_NODE); + if (node->parent) { + bool found = false; + for (size_t i = 0; i < node->parent->children.count; i++) { + if (node->parent->children.data[i] == node) { + found = true; + break; + } + } + ufbxt_assert(found); + } + + for (size_t i = 0; i < node->children.count; i++) { + ufbxt_assert(node->children.data[i]->parent == node); + } + + for (size_t i = 0; i < node->all_attribs.count; i++) { + ufbx_element *attrib = node->all_attribs.data[i]; + ufbxt_check_element_ptr_any(scene, attrib); + bool found = false; + for (size_t j = 0; j < attrib->instances.count; j++) { + if (attrib->instances.data[j] == node) { + found = true; + break; + } + } + ufbxt_assert(found); + } + + if (node->all_attribs.count > 0) { + ufbxt_assert(node->attrib == node->all_attribs.data[0]); + if (node->all_attribs.count == 1) { + ufbxt_assert(node->attrib_type == node->attrib->type); + } + } + + switch (node->attrib_type) { + case UFBX_ELEMENT_MESH: ufbxt_assert(node->mesh); break; + case UFBX_ELEMENT_LIGHT: ufbxt_assert(node->light); break; + case UFBX_ELEMENT_CAMERA: ufbxt_assert(node->camera); break; + case UFBX_ELEMENT_BONE: ufbxt_assert(node->bone); break; + default: /* No shorthand */ break; + } + + for (size_t i = 0; i < node->materials.count; i++) { + ufbxt_assert(node->materials.data[i]); + ufbxt_check_element_ptr(scene, node->materials.data[i], UFBX_ELEMENT_MATERIAL); + } + + ufbxt_assert((uint32_t)node->attrib_type < (uint32_t)UFBX_ELEMENT_TYPE_COUNT); + ufbxt_assert((uint32_t)node->inherit_type < (uint32_t)UFBX_INHERIT_TYPE_COUNT); + + if (node->is_root) { + ufbxt_assert(!node->has_geometry_transform); + } + + ufbxt_check_element_ptr(scene, node->geometry_transform_helper, UFBX_ELEMENT_NODE); + if (node->geometry_transform_helper) { + ufbxt_assert(node->geometry_transform_helper->is_geometry_transform_helper); + + if (scene->metadata.has_warning[UFBX_WARNING_DUPLICATE_OBJECT_ID]) { + // In broken cases we may have multiple geometry transform helpers + ufbxt_assert(node->children.count > 0); + ufbxt_assert(node->children.data[0]->is_geometry_transform_helper); + } else { + // Geometry transform helper must always be the first child if the scene + ufbxt_assert(node->geometry_transform_helper == node->children.data[0]); + } + } + + if (node->is_geometry_transform_helper) { + ufbxt_assert(node->parent); + if (scene->metadata.has_warning[UFBX_WARNING_DUPLICATE_OBJECT_ID]) { + // In broken cases we may have multiple geometry transform helpers + ufbxt_assert(node->parent->geometry_transform_helper); + } else { + ufbxt_assert(node->parent->geometry_transform_helper == node); + } + } +} + +static void ufbxt_check_mesh(ufbx_scene *scene, ufbx_mesh *mesh) +{ + // ufbx_mesh *found = ufbx_find_mesh(scene, mesh->node.name.data); + // ufbxt_assert(found && !strcmp(found->node.name.data, mesh->node.name.data)); + + ufbxt_assert(mesh->vertices.data == mesh->vertex_position.values.data); + ufbxt_assert(mesh->vertices.count == mesh->num_vertices); + ufbxt_assert(mesh->vertex_indices.data == mesh->vertex_position.indices.data); + ufbxt_assert(mesh->vertex_indices.count == mesh->num_indices); + ufbxt_assert(mesh->vertex_first_index.count == mesh->num_vertices); + + for (size_t ii = 0; ii < mesh->num_indices; ii++) { + uint32_t vi = mesh->vertex_indices.data[ii]; + if (vi != UFBX_NO_INDEX) { + ufbxt_assert(vi < mesh->num_vertices); + ufbxt_assert(mesh->vertex_first_index.data[vi] <= ii); + } + } + + for (size_t vi = 0; vi < mesh->num_vertices; vi++) { + int32_t ii = (int32_t)mesh->vertex_first_index.data[vi]; + if (ii >= 0) { + ufbxt_assert(mesh->vertex_indices.data[ii] == vi); + } else { + ufbxt_assert((uint32_t)ii == UFBX_NO_INDEX); + } + } + + ufbxt_check_vertex_element(scene, mesh, &mesh->vertex_position, sizeof(ufbx_vec3)); + ufbxt_check_vertex_element(scene, mesh, &mesh->vertex_normal, sizeof(ufbx_vec3)); + ufbxt_check_vertex_element(scene, mesh, &mesh->vertex_tangent, sizeof(ufbx_vec3)); + ufbxt_check_vertex_element(scene, mesh, &mesh->vertex_bitangent, sizeof(ufbx_vec3)); + ufbxt_check_vertex_element(scene, mesh, &mesh->vertex_uv, sizeof(ufbx_vec2)); + ufbxt_check_vertex_element(scene, mesh, &mesh->vertex_color, sizeof(ufbx_vec4)); + ufbxt_check_vertex_element(scene, mesh, &mesh->skinned_position, sizeof(ufbx_vec3)); + ufbxt_check_vertex_element(scene, mesh, &mesh->skinned_normal, sizeof(ufbx_vec3)); + + ufbxt_assert(mesh->num_vertices == mesh->vertex_position.values.count); + ufbxt_assert(mesh->num_triangles <= mesh->num_indices); + + ufbxt_assert(mesh->vertex_position.value_reals == 3); + ufbxt_assert(mesh->vertex_normal.value_reals == 3); + ufbxt_assert(mesh->vertex_tangent.value_reals == 3); + ufbxt_assert(mesh->vertex_bitangent.value_reals == 3); + ufbxt_assert(mesh->vertex_uv.value_reals == 2); + ufbxt_assert(mesh->vertex_color.value_reals == 4); + ufbxt_assert(mesh->vertex_crease.value_reals == 1); + + if (!scene->metadata.may_contain_missing_vertex_position) { + ufbxt_assert(mesh->vertex_position.exists); + } + + if (mesh->vertex_position.exists) { + ufbxt_assert(mesh->vertex_position.unique_per_vertex); + } + + ufbxt_check_mesh_list(scene, mesh, mesh->edges, mesh->num_edges, false); + ufbxt_check_mesh_list(scene, mesh, mesh->edge_crease, mesh->num_edges, true); + ufbxt_check_mesh_list(scene, mesh, mesh->edge_smoothing, mesh->num_edges, true); + ufbxt_check_mesh_list(scene, mesh, mesh->edge_visibility, mesh->num_edges, true); + + ufbxt_check_mesh_list(scene, mesh, mesh->face_material, mesh->num_faces, true); + ufbxt_check_mesh_list(scene, mesh, mesh->face_smoothing, mesh->num_faces, true); + ufbxt_check_mesh_list(scene, mesh, mesh->face_group, mesh->num_faces, true); + ufbxt_check_mesh_list(scene, mesh, mesh->face_hole, mesh->num_faces, true); + + size_t num_triangles = 0; + size_t max_face_triangles = 0; + size_t num_bad_faces[3] = { 0 }; + + uint32_t prev_end = 0; + ufbxt_assert(mesh->faces.count == mesh->num_faces); + for (size_t i = 0; i < mesh->num_faces; i++) { + ufbx_face face = mesh->faces.data[i]; + ufbxt_assert(face.index_begin == prev_end); + prev_end = face.index_begin + face.num_indices; + ufbxt_assert(prev_end <= mesh->num_indices); + + if (face.num_indices >= 3) { + size_t tris = face.num_indices - 2; + num_triangles += tris; + if (tris > max_face_triangles) { + max_face_triangles = tris; + } + } else { + num_bad_faces[face.num_indices]++; + } + } + + ufbxt_assert(mesh->num_triangles == num_triangles); + ufbxt_assert(mesh->max_face_triangles == max_face_triangles); + ufbxt_assert(mesh->num_empty_faces == num_bad_faces[0]); + ufbxt_assert(mesh->num_point_faces == num_bad_faces[1]); + ufbxt_assert(mesh->num_line_faces == num_bad_faces[2]); + + if (!mesh->from_tessellated_nurbs && !mesh->subdivision_evaluated) { + ufbxt_assert(scene->metadata.max_face_triangles >= max_face_triangles); + } + + ufbxt_assert(mesh->edges.count == mesh->num_edges); + for (size_t i = 0; i < mesh->num_edges; i++) { + ufbx_edge edge = mesh->edges.data[i]; + ufbxt_assert(edge.a < mesh->num_indices); + ufbxt_assert(edge.b < mesh->num_indices); + } + + for (size_t i = 0; i < mesh->uv_sets.count; i++) { + ufbx_uv_set *set = &mesh->uv_sets.data[i]; + ufbxt_assert(set->vertex_uv.value_reals == 2); + ufbxt_assert(set->vertex_tangent.value_reals == 3); + ufbxt_assert(set->vertex_bitangent.value_reals == 3); + + if (i == 0) { + ufbxt_assert(mesh->vertex_uv.values.data == set->vertex_uv.values.data); + ufbxt_assert(mesh->vertex_uv.values.count == set->vertex_uv.values.count); + ufbxt_assert(mesh->vertex_uv.indices.data == set->vertex_uv.indices.data); + ufbxt_assert(mesh->vertex_uv.indices.count == set->vertex_uv.indices.count); + } + ufbxt_check_string(set->name); + ufbxt_check_vertex_element(scene, mesh, &set->vertex_uv, sizeof(ufbx_vec2)); + ufbxt_check_vertex_element(scene, mesh, &set->vertex_tangent, sizeof(ufbx_vec3)); + ufbxt_check_vertex_element(scene, mesh, &set->vertex_bitangent, sizeof(ufbx_vec3)); + } + + for (size_t i = 0; i < mesh->color_sets.count; i++) { + ufbx_color_set *set = &mesh->color_sets.data[i]; + ufbxt_assert(set->vertex_color.value_reals == 4); + + if (i == 0) { + ufbxt_assert(mesh->vertex_color.values.data == set->vertex_color.values.data); + ufbxt_assert(mesh->vertex_color.values.count == set->vertex_color.values.count); + ufbxt_assert(mesh->vertex_color.indices.data == set->vertex_color.indices.data); + ufbxt_assert(mesh->vertex_color.indices.count == set->vertex_color.indices.count); + } + ufbxt_check_string(set->name); + ufbxt_check_vertex_element(scene, mesh, &set->vertex_color, sizeof(ufbx_vec4)); + } + + for (size_t i = 0; i < mesh->num_edges; i++) { + ufbx_edge edge = mesh->edges.data[i]; + ufbxt_assert(edge.a < mesh->num_indices); + ufbxt_assert(edge.b < mesh->num_indices); + } + + if (mesh->face_material.count) { + ufbxt_assert(mesh->face_material.count == mesh->num_faces); + for (size_t i = 0; i < mesh->num_faces; i++) { + int32_t material = mesh->face_material.data[i]; + ufbxt_assert(material >= 0 && (size_t)material < mesh->materials.count); + } + } else { + ufbxt_assert(mesh->face_material.count == 0); + } + + for (size_t i = 0; i < mesh->materials.count; i++) { + ufbx_mesh_material *mat = &mesh->materials.data[i]; + ufbxt_check_element_ptr(scene, mat->material, UFBX_ELEMENT_MATERIAL); + + if (!scene->metadata.may_contain_null_materials) { + ufbxt_assert(mat->material); + } + + ufbxt_assert(mat->face_indices.count == mat->num_faces); + + size_t mat_bad_faces[3] = { 0 }; + size_t mat_tris = 0; + for (size_t j = 0; j < mat->num_faces; j++) { + uint32_t ix = mat->face_indices.data[j]; + ufbx_face face = mesh->faces.data[ix]; + if (face.num_indices >= 3) { + mat_tris += face.num_indices - 2; + } else { + mat_bad_faces[face.num_indices]++; + } + ufbxt_assert(mesh->face_material.data[ix] == (int32_t)i); + } + + ufbxt_assert(mat->num_triangles == mat_tris); + ufbxt_assert(mat->num_empty_faces == mat_bad_faces[0]); + ufbxt_assert(mat->num_point_faces == mat_bad_faces[1]); + ufbxt_assert(mat->num_line_faces == mat_bad_faces[2]); + } + + if (mesh->face_group.count) { + ufbxt_assert(mesh->face_group.count == mesh->num_faces); + for (size_t i = 0; i < mesh->num_faces; i++) { + uint32_t group = mesh->face_group.data[i]; + ufbxt_assert((size_t)group < mesh->face_groups.count); + } + } else { + ufbxt_assert(mesh->face_groups.count == 0); + } + + if (mesh->face_groups.count > 0) { + size_t total_group_faces = 0; + size_t total_group_tris = 0; + for (size_t i = 0; i < mesh->face_groups.count; i++) { + ufbx_face_group *group = &mesh->face_groups.data[i]; + + if (i > 0) { + ufbxt_assert(group->id >= mesh->face_groups.data[i - 1].id); + } + + ufbxt_check_string(group->name); + ufbxt_assert(group->face_indices.count == group->num_faces); + + size_t group_tris = 0; + for (size_t j = 0; j < group->num_faces; j++) { + uint32_t ix = group->face_indices.data[j]; + ufbx_face face = mesh->faces.data[ix]; + if (face.num_indices >= 3) { + group_tris += face.num_indices - 2; + } + ufbxt_assert(mesh->face_group.data[ix] == (uint32_t)i); + } + ufbxt_assert(group->num_triangles == group_tris); + + total_group_faces += group->num_faces; + total_group_tris += group->num_triangles; + } + ufbxt_assert(total_group_faces == mesh->num_faces); + ufbxt_assert(total_group_tris == mesh->num_triangles); + } + + for (size_t i = 0; i < mesh->skin_deformers.count; i++) { + ufbxt_assert(mesh->skin_deformers.data[i]->vertices.count >= mesh->num_vertices); + ufbxt_check_element_ptr(scene, mesh->skin_deformers.data[i], UFBX_ELEMENT_SKIN_DEFORMER); + } + for (size_t i = 0; i < mesh->blend_deformers.count; i++) { + ufbxt_check_element_ptr(scene, mesh->blend_deformers.data[i], UFBX_ELEMENT_BLEND_DEFORMER); + } + for (size_t i = 0; i < mesh->cache_deformers.count; i++) { + ufbxt_check_element_ptr(scene, mesh->cache_deformers.data[i], UFBX_ELEMENT_CACHE_DEFORMER); + } + for (size_t i = 0; i < mesh->all_deformers.count; i++) { + ufbxt_check_element_ptr_any(scene, mesh->all_deformers.data[i]); + } + + if (!scene->metadata.may_contain_null_materials) { + for (size_t i = 0; i < mesh->instances.count; i++) { + ufbxt_assert(mesh->instances.data[i]->materials.count >= mesh->materials.count); + } + } + + // No loose UV or color + if (mesh->vertex_uv.exists) { + ufbxt_assert(mesh->uv_sets.count > 0); + } + if (mesh->vertex_color.exists) { + ufbxt_assert(mesh->color_sets.count > 0); + } +} + +static void ufbxt_check_light(ufbx_scene *scene, ufbx_light *light) +{ + ufbxt_assert((uint32_t)light->type < (uint32_t)UFBX_LIGHT_TYPE_COUNT); + ufbxt_assert((uint32_t)light->decay < (uint32_t)UFBX_LIGHT_DECAY_COUNT); + ufbxt_assert((uint32_t)light->area_shape < (uint32_t)UFBX_LIGHT_AREA_SHAPE_COUNT); +} + +static void ufbxt_check_camera(ufbx_scene *scene, ufbx_camera *camera) +{ + ufbxt_assert((uint32_t)camera->projection_mode < (uint32_t)UFBX_PROJECTION_MODE_COUNT); + ufbxt_assert((uint32_t)camera->aspect_mode < (uint32_t)UFBX_ASPECT_MODE_COUNT); + ufbxt_assert((uint32_t)camera->aperture_mode < (uint32_t)UFBX_APERTURE_MODE_COUNT); + ufbxt_assert((uint32_t)camera->gate_fit < (uint32_t)UFBX_GATE_FIT_COUNT); + ufbxt_assert((uint32_t)camera->aperture_format < (uint32_t)UFBX_APERTURE_FORMAT_COUNT); + + if (camera->projection_mode == UFBX_PROJECTION_MODE_PERSPECTIVE) { + ufbxt_assert(ufbxt_float_equal(camera->projection_plane.x, camera->field_of_view_tan.x)); + ufbxt_assert(ufbxt_float_equal(camera->projection_plane.y, camera->field_of_view_tan.y)); + } else if (camera->projection_mode == UFBX_PROJECTION_MODE_ORTHOGRAPHIC) { + ufbxt_assert(ufbxt_float_equal(camera->projection_plane.x, camera->orthographic_size.x)); + ufbxt_assert(ufbxt_float_equal(camera->projection_plane.y, camera->orthographic_size.y)); + } else { + ufbxt_assert(false && "Unhandled projection_mode"); + } +} + +static void ufbxt_check_bone(ufbx_scene *scene, ufbx_bone *bone) +{ +} + +static void ufbxt_check_empty(ufbx_scene *scene, ufbx_empty *empty) +{ +} + +static void ufbxt_check_line_curve(ufbx_scene *scene, ufbx_line_curve *line) +{ + for (size_t i = 0; i < line->point_indices.count; i++) { + int32_t ix = line->point_indices.data[i]; + ufbxt_assert(ix >= 0 && (uint32_t)ix < line->control_points.count); + } + + for (size_t i = 0; i < line->segments.count; i++) { + ufbx_line_segment seg = line->segments.data[i]; + ufbxt_assert(seg.num_indices <= line->point_indices.count); + ufbxt_assert(seg.index_begin <= line->point_indices.count - seg.num_indices); + } + + ufbxt_check_list(line->control_points); +} + +static void ufbxt_check_nurbs_basis(ufbx_scene *scene, ufbx_nurbs_basis *basis) +{ + ufbxt_assert((uint32_t)basis->topology < (uint32_t)UFBX_NURBS_TOPOLOGY_COUNT); + ufbxt_check_list(basis->knot_vector); + ufbxt_check_list(basis->spans); + if (basis->valid) { + ufbxt_assert(basis->order > 1); + ufbxt_assert(basis->knot_vector.count >= 2*(basis->order-1) + 1); + } +} + +static void ufbxt_check_nurbs_curve(ufbx_scene *scene, ufbx_nurbs_curve *curve) +{ + ufbxt_check_nurbs_basis(scene, &curve->basis); + ufbxt_check_list(curve->control_points); +} + +static void ufbxt_check_nurbs_surface(ufbx_scene *scene, ufbx_nurbs_surface *surface) +{ + ufbxt_check_nurbs_basis(scene, &surface->basis_u); + ufbxt_check_nurbs_basis(scene, &surface->basis_v); + ufbxt_check_list(surface->control_points); +} + +static void ufbxt_check_nurbs_trim_surface(ufbx_scene *scene, ufbx_nurbs_trim_surface *surface) +{ +} + +static void ufbxt_check_nurbs_trim_boundary(ufbx_scene *scene, ufbx_nurbs_trim_boundary *boundary) +{ +} + +static void ufbxt_check_procedural_geometry(ufbx_scene *scene, ufbx_procedural_geometry *geometry) +{ +} + +static void ufbxt_check_stereo_camera(ufbx_scene *scene, ufbx_stereo_camera *camera) +{ + ufbxt_check_element_ptr(scene, camera->left, UFBX_ELEMENT_CAMERA); + ufbxt_check_element_ptr(scene, camera->right, UFBX_ELEMENT_CAMERA); +} + +static void ufbxt_check_camera_switcher(ufbx_scene *scene, ufbx_camera_switcher *switcher) +{ +} + +static void ufbxt_check_marker(ufbx_scene *scene, ufbx_marker *marker) +{ + ufbxt_assert((uint32_t)marker->type < (uint32_t)UFBX_MARKER_TYPE_COUNT); +} + +static void ufbxt_check_lod_level(ufbx_scene *scene, ufbx_lod_group *lod_group, ufbx_lod_level *level) +{ + ufbxt_assert((uint32_t)level->display < (uint32_t)UFBX_LOD_DISPLAY_COUNT); +} + +static void ufbxt_check_lod_group(ufbx_scene *scene, ufbx_lod_group *lod_group) +{ + for (size_t i = 0; i < lod_group->lod_levels.count; i++) { + ufbxt_check_lod_level(scene, lod_group, &lod_group->lod_levels.data[i]); + } +} + +static void ufbxt_check_skin_deformer(ufbx_scene *scene, ufbx_skin_deformer *deformer) +{ + for (size_t i = 0; i < deformer->clusters.count; i++) { + ufbxt_check_element_ptr(scene, deformer->clusters.data[i], UFBX_ELEMENT_SKIN_CLUSTER); + if (!scene->metadata.may_contain_broken_elements) { + ufbxt_assert(deformer->clusters.data[i]->bone_node); + } + } + for (size_t i = 0; i < deformer->vertices.count; i++) { + ufbx_skin_vertex vertex = deformer->vertices.data[i]; + ufbxt_assert(vertex.weight_begin <= deformer->weights.count); + ufbxt_assert(deformer->weights.count - vertex.weight_begin >= vertex.num_weights); + + for (size_t i = 1; i < vertex.num_weights; i++) { + size_t ix = vertex.weight_begin + i; + ufbxt_assert(deformer->weights.data[ix - 1].weight >= deformer->weights.data[ix].weight); + } + } + for (size_t i = 0; i < deformer->weights.count; i++) { + ufbxt_assert(deformer->weights.data[i].cluster_index < deformer->clusters.count); + } +} + +static void ufbxt_check_skin_cluster(ufbx_scene *scene, ufbx_skin_cluster *cluster) +{ + ufbxt_check_element_ptr(scene, cluster->bone_node, UFBX_ELEMENT_NODE); + ufbxt_check_list(cluster->vertices); + ufbxt_check_list(cluster->weights); +} + +static void ufbxt_check_blend_deformer(ufbx_scene *scene, ufbx_blend_deformer *deformer) +{ + for (size_t i = 0; i < deformer->channels.count; i++) { + ufbxt_check_element_ptr(scene, deformer->channels.data[i], UFBX_ELEMENT_BLEND_CHANNEL); + } +} + +static void ufbxt_check_blend_channel(ufbx_scene *scene, ufbx_blend_channel *channel) +{ + for (size_t i = 0; i < channel->keyframes.count; i++) { + if (i > 0) { + ufbxt_assert(channel->keyframes.data[i - 1].target_weight <= channel->keyframes.data[i].target_weight); + } + ufbxt_check_element_ptr(scene, channel->keyframes.data[i].shape, UFBX_ELEMENT_BLEND_SHAPE); + } +} + +static void ufbxt_check_blend_shape(ufbx_scene *scene, ufbx_blend_shape *shape) +{ + ufbxt_check_list(shape->offset_vertices); + ufbxt_check_list(shape->position_offsets); + ufbxt_check_list(shape->normal_offsets); + ufbxt_assert(shape->offset_vertices.count == shape->position_offsets.count); + if (shape->normal_offsets.count > 0) { + ufbxt_assert(shape->normal_offsets.count == shape->offset_vertices.count); + } +} + +static void ufbxt_check_cache_deformer(ufbx_scene *scene, ufbx_cache_deformer *deformer) +{ + ufbxt_check_string(deformer->channel); + ufbxt_check_element_ptr(scene, deformer->file, UFBX_ELEMENT_CACHE_FILE); +} + +static void ufbxt_check_cache_file(ufbx_scene *scene, ufbx_cache_file *file) +{ + ufbxt_check_string(file->filename); + ufbxt_check_string(file->absolute_filename); + ufbxt_check_string(file->relative_filename); +} + +static void ufbxt_check_material_map(ufbx_scene *scene, ufbx_material *material, ufbx_material_map *map) +{ + ufbxt_check_element_ptr(scene, map->texture, UFBX_ELEMENT_TEXTURE); + ufbxt_assert(map->value_components <= 4); +} + +static void ufbxt_check_material(ufbx_scene *scene, ufbx_material *material) +{ + for (size_t i = 0; i < material->textures.count; i++) { + ufbxt_check_string(material->textures.data[i].material_prop); + ufbxt_check_string(material->textures.data[i].shader_prop); + ufbxt_check_element_ptr(scene, material->textures.data[i].texture, UFBX_ELEMENT_TEXTURE); + } + + for (size_t i = 0; i < UFBX_MATERIAL_FBX_MAP_COUNT; i++) { + ufbxt_check_material_map(scene, material, &material->fbx.maps[i]); + } + + for (size_t i = 0; i < UFBX_MATERIAL_PBR_MAP_COUNT; i++) { + ufbxt_check_material_map(scene, material, &material->pbr.maps[i]); + } + + ufbxt_check_string(material->shader_prop_prefix); + ufbxt_check_element_ptr(scene, material->shader, UFBX_ELEMENT_SHADER); +} + +static void ufbxt_check_shader_texture_input(ufbx_scene *scene, ufbx_texture *texture, ufbx_shader_texture *shader, ufbx_shader_texture_input *input) +{ + ufbxt_check_string(input->name); + ufbxt_assert(input->prop); + + ufbxt_check_string(input->value_str); + + if (input->prop) { + ufbx_prop *prop = input->prop; + ufbxt_assert(prop == ufbx_find_prop(&texture->props, prop->name.data)); + } + + if (input->texture_prop) { + ufbx_prop *prop = input->texture_prop; + ufbxt_assert(prop == ufbx_find_prop(&texture->props, prop->name.data)); + } + + if (input->texture_enabled_prop) { + ufbx_prop *prop = input->texture_enabled_prop; + ufbxt_assert(prop == ufbx_find_prop(&texture->props, prop->name.data)); + } + + ufbxt_check_element_ptr(scene, input->texture, UFBX_ELEMENT_TEXTURE); +} + +static void ufbxt_check_shader_texture(ufbx_scene *scene, ufbx_texture *texture, ufbx_shader_texture *shader) +{ + ufbxt_check_string(shader->shader_name); + ufbxt_check_string(shader->shader_source); + + ufbxt_check_element_ptr(scene, shader->main_texture, UFBX_ELEMENT_TEXTURE); + + for (size_t i = 0; i < shader->inputs.count; i++) { + ufbxt_check_shader_texture_input(scene, texture, shader, &shader->inputs.data[i]); + } +} + +static void ufbxt_check_texture(ufbx_scene *scene, ufbx_texture *texture) +{ + ufbxt_check_string(texture->filename); + ufbxt_check_string(texture->relative_filename); + ufbxt_check_string(texture->absolute_filename); + + ufbxt_check_blob(texture->raw_filename); + ufbxt_check_blob(texture->raw_relative_filename); + ufbxt_check_blob(texture->raw_absolute_filename); + + ufbxt_check_element_ptr(scene, texture->video, UFBX_ELEMENT_VIDEO); + for (size_t i = 0; i < texture->layers.count; i++) { + ufbxt_assert(texture->layers.data[i].texture); + ufbxt_check_element_ptr(scene, texture->layers.data[i].texture, UFBX_ELEMENT_TEXTURE); + } + + if (texture->shader) { + ufbxt_check_shader_texture(scene, texture, texture->shader); + } + + for (size_t i = 0; i < texture->file_textures.count; i++) { + ufbx_texture *file = texture->file_textures.data[i]; + ufbxt_check_element_ptr(scene, file, UFBX_ELEMENT_TEXTURE); + ufbxt_assert(file->type == UFBX_TEXTURE_FILE); + } + + if (texture->type == UFBX_TEXTURE_FILE) { + ufbxt_assert(texture->file_textures.count >= 1); + ufbxt_assert(texture->file_textures.data[0] == texture); + } else if (texture->type == UFBX_TEXTURE_SHADER) { + ufbxt_assert(texture->shader); + } + + if (texture->raw_absolute_filename.size > 0 || texture->raw_relative_filename.size > 0) { + ufbxt_assert(texture->has_file); + } + + ufbxt_assert(texture->file_index < scene->texture_files.count || texture->file_index == UFBX_NO_INDEX); + if (texture->has_file) { + ufbxt_assert(texture->file_index < scene->texture_files.count); + ufbx_texture_file *file = &scene->texture_files.data[texture->file_index]; + ufbxt_assert(!strcmp(file->absolute_filename.data, texture->absolute_filename.data) + || !strcmp(file->relative_filename.data, texture->relative_filename.data)); + } else { + ufbxt_assert(texture->file_index == UFBX_NO_INDEX); + } +} + +static void ufbxt_check_video(ufbx_scene *scene, ufbx_video *video) +{ + ufbxt_check_string(video->filename); + ufbxt_check_string(video->relative_filename); + ufbxt_check_string(video->absolute_filename); + + ufbxt_check_blob(video->raw_filename); + ufbxt_check_blob(video->raw_relative_filename); + ufbxt_check_blob(video->raw_absolute_filename); +} + +static void ufbxt_check_shader(ufbx_scene *scene, ufbx_shader *shader) +{ + ufbxt_assert((uint32_t)shader->type < (uint32_t)UFBX_SHADER_TYPE_COUNT); + for (size_t i = 0; i < shader->bindings.count; i++) { + ufbxt_check_element_ptr(scene, shader->bindings.data[i], UFBX_ELEMENT_SHADER_BINDING); + } +} + +static void ufbxt_check_shader_binding(ufbx_scene *scene, ufbx_shader_binding *binding) +{ + for (size_t i = 0; i < binding->prop_bindings.count; i++) { + ufbx_shader_prop_binding prop = binding->prop_bindings.data[i]; + ufbxt_check_string(prop.material_prop); + ufbxt_check_string(prop.shader_prop); + } +} + +static void ufbxt_check_anim(ufbx_scene *scene, ufbx_anim *anim) +{ + for (size_t i = 0; i < anim->layers.count; i++) { + ufbxt_check_element_ptr(scene, anim->layers.data[i].layer, UFBX_ELEMENT_ANIM_LAYER); + } + ufbxt_assert(anim->prop_overrides.count == 0); +} + +static void ufbxt_check_anim_stack(ufbx_scene *scene, ufbx_anim_stack *anim_stack) +{ + for (size_t i = 0; i < anim_stack->layers.count; i++) { + ufbxt_check_element_ptr(scene, anim_stack->layers.data[i], UFBX_ELEMENT_ANIM_LAYER); + } +} + +static void ufbxt_check_anim_layer(ufbx_scene *scene, ufbx_anim_layer *anim_layer) +{ + ufbxt_check_string(anim_layer->name); + + for (size_t i = 0; i < anim_layer->anim_values.count; i++) { + ufbxt_check_element_ptr(scene, anim_layer->anim_values.data[i], UFBX_ELEMENT_ANIM_VALUE); + } + + size_t props_left = 0; + ufbx_element *prev_element = NULL; + + for (size_t i = 0; i < anim_layer->anim_props.count; i++) { + ufbx_anim_prop *anim_prop = &anim_layer->anim_props.data[i]; + + ufbxt_check_string(anim_prop->prop_name); + ufbxt_check_element_ptr_any(scene, anim_prop->element); + ufbxt_check_element_ptr(scene, anim_prop->anim_value, UFBX_ELEMENT_ANIM_VALUE); + + ufbx_anim_prop *ref = ufbx_find_anim_prop(anim_layer, anim_prop->element, anim_prop->prop_name.data); + ufbxt_assert(ref); + ufbxt_assert(!strcmp(ref->prop_name.data, anim_prop->prop_name.data)); + + if (props_left > 0) { + ufbxt_assert(anim_prop->element == prev_element); + props_left--; + } else { + ufbx_anim_prop_list list = ufbx_find_anim_props(anim_layer, anim_prop->element); + ufbxt_assert(list.count > 0); + prev_element = anim_prop->element; + props_left = list.count - 1; + } + } + + ufbxt_assert(props_left == 0); +} + +static void ufbxt_check_anim_value(ufbx_scene *scene, ufbx_anim_value *anim_value) +{ + ufbxt_check_element_ptr(scene, anim_value->curves[0], UFBX_ELEMENT_ANIM_CURVE); + ufbxt_check_element_ptr(scene, anim_value->curves[1], UFBX_ELEMENT_ANIM_CURVE); + ufbxt_check_element_ptr(scene, anim_value->curves[2], UFBX_ELEMENT_ANIM_CURVE); +} + +static void ufbxt_check_anim_curve(ufbx_scene *scene, ufbx_anim_curve *anim_curve) +{ + for (size_t i = 0; i < anim_curve->keyframes.count; i++) { + ufbx_keyframe key = anim_curve->keyframes.data[i]; + ufbxt_assert((uint32_t)key.interpolation < (uint32_t)UFBX_INTERPOLATION_COUNT); + } +} + +static void ufbxt_check_display_layer(ufbx_scene *scene, ufbx_display_layer *layer) +{ + for (size_t i = 0; i < layer->nodes.count; i++) { + ufbxt_assert(layer->nodes.data[i]); + ufbxt_check_element_ptr(scene, layer->nodes.data[i], UFBX_ELEMENT_NODE); + } +} + +static void ufbxt_check_selection_set(ufbx_scene *scene, ufbx_selection_set *set) +{ + for (size_t i = 0; i < set->nodes.count; i++) { + ufbxt_assert(set->nodes.data[i]); + ufbxt_check_element_ptr(scene, set->nodes.data[i], UFBX_ELEMENT_SELECTION_NODE); + } +} + +static void ufbxt_check_selection_node(ufbx_scene *scene, ufbx_selection_node *node) +{ + ufbxt_check_element_ptr(scene, node->target_node, UFBX_ELEMENT_NODE); + ufbxt_check_element_ptr(scene, node->target_mesh, UFBX_ELEMENT_MESH); +} + +static void ufbxt_check_character(ufbx_scene *scene, ufbx_character *character) +{ +} + +static void ufbxt_check_constraint(ufbx_scene *scene, ufbx_constraint *constraint) +{ + ufbxt_check_element_ptr(scene, constraint->node, UFBX_ELEMENT_NODE); + ufbxt_check_element_ptr(scene, constraint->aim_up_node, UFBX_ELEMENT_NODE); + ufbxt_check_element_ptr(scene, constraint->ik_effector, UFBX_ELEMENT_NODE); + ufbxt_check_element_ptr(scene, constraint->ik_end_node, UFBX_ELEMENT_NODE); + for (size_t i = 0; i < constraint->targets.count; i++) { + ufbxt_assert(constraint->targets.data[i].node); + ufbxt_check_element_ptr(scene, constraint->targets.data[i].node, UFBX_ELEMENT_NODE); + } +} + +static void ufbxt_check_pose(ufbx_scene *scene, ufbx_pose *pose) +{ + for (size_t i = 0; i < pose->bone_poses.count; i++) { + ufbx_bone_pose bone_pose = pose->bone_poses.data[i]; + ufbxt_assert(bone_pose.bone_node); + ufbxt_check_element_ptr(scene, bone_pose.bone_node, UFBX_ELEMENT_NODE); + } +} + +static void ufbxt_check_metadata_object(ufbx_scene *scene, ufbx_metadata_object *metadata_object) +{ +} + +static void ufbxt_check_texture_file(ufbx_scene *scene, ufbx_texture_file *texture_file) +{ + ufbxt_check_string(texture_file->filename); + ufbxt_check_string(texture_file->absolute_filename); + ufbxt_check_string(texture_file->relative_filename); + ufbxt_check_blob(texture_file->raw_filename); + ufbxt_check_blob(texture_file->raw_absolute_filename); + ufbxt_check_blob(texture_file->raw_relative_filename); + ufbxt_check_blob(texture_file->content); +} + +static void ufbxt_check_application(ufbx_scene *scene, ufbx_application *application) +{ + ufbxt_check_string(application->name); + ufbxt_check_string(application->vendor); + ufbxt_check_string(application->version); +} + +static void ufbxt_check_metadata(ufbx_scene *scene, ufbx_metadata *metadata) +{ + ufbxt_check_string(metadata->creator); + ufbxt_check_string(metadata->filename); + ufbxt_check_string(metadata->relative_root); + ufbxt_check_blob(metadata->raw_filename); + ufbxt_check_blob(metadata->raw_relative_root); + ufbxt_check_application(scene, &metadata->latest_application); + ufbxt_check_application(scene, &metadata->original_application); + + if (metadata->file_format == UFBX_FILE_FORMAT_FBX) { + } else if (metadata->file_format == UFBX_FILE_FORMAT_OBJ) { + ufbxt_assert(metadata->ascii); + } else if (metadata->file_format == UFBX_FILE_FORMAT_MTL) { + ufbxt_assert(metadata->ascii); + } else { + ufbxt_assert(0 && "Invalid file format"); + } + + for (size_t i = 0; i < metadata->warnings.count; i++) { + ufbx_warning *warning = &metadata->warnings.data[i]; + ufbxt_check_string(warning->description); + ufbxt_assert(metadata->has_warning[warning->type]); + } +} + +static void ufbxt_check_dom_value(ufbx_scene *scene, ufbx_dom_value *value) +{ + ufbxt_check_string(value->value_str); + ufbxt_check_blob(value->value_blob); + size_t array_stride = 0; + switch (value->type) { + case UFBX_DOM_VALUE_NUMBER: + break; + case UFBX_DOM_VALUE_STRING: + break; + case UFBX_DOM_VALUE_ARRAY_I8: + array_stride = 1; + break; + case UFBX_DOM_VALUE_ARRAY_I32: + array_stride = 4; + break; + case UFBX_DOM_VALUE_ARRAY_I64: + array_stride = 8; + break; + case UFBX_DOM_VALUE_ARRAY_F32: + array_stride = 4; + break; + case UFBX_DOM_VALUE_ARRAY_F64: + array_stride = 8; + break; + case UFBX_DOM_VALUE_ARRAY_RAW_STRING: + array_stride = sizeof(ufbx_blob); + break; + case UFBX_DOM_VALUE_ARRAY_IGNORED: + array_stride = 0; + break; + default: + ufbxt_assert(0 && "Unhandled type"); + break; + } + + if (array_stride) { + ufbxt_assert(value->value_blob.size == (size_t)value->value_int * array_stride); + } + + if (value->type == UFBX_DOM_VALUE_ARRAY_RAW_STRING) { + const ufbx_blob *blobs = (const ufbx_blob*)value->value_blob.data; + for (size_t i = 0; i < (size_t)value->value_int; i++) { + ufbxt_check_blob(blobs[i]); + } + } +} + +static void ufbxt_check_dom_node(ufbx_scene *scene, ufbx_dom_node *node) +{ + ufbxt_assert(node); + ufbxt_check_string(node->name); + for (size_t i = 0; i < node->children.count; i++) { + ufbxt_check_dom_node(scene, node->children.data[i]); + } + for (size_t i = 0; i < node->values.count; i++) { + ufbxt_check_dom_value(scene, &node->values.data[i]); + } +} + +static void ufbxt_check_scene(ufbx_scene *scene) +{ + // TODO: Partial safety validation? + if (scene->metadata.is_unsafe) return; + + ufbxt_check_metadata(scene, &scene->metadata); + + for (size_t i = 0; i < scene->elements.count; i++) { + ufbxt_assert(scene->elements.data[i]->element_id == (uint32_t)i); + ufbxt_check_element(scene, scene->elements.data[i]); + } + + for (size_t i = 0; i < scene->unknowns.count; i++) { + ufbxt_check_unknown(scene, scene->unknowns.data[i]); + } + + for (size_t i = 0; i < scene->nodes.count; i++) { + ufbxt_check_node(scene, scene->nodes.data[i]); + } + + for (size_t i = 0; i < scene->meshes.count; i++) { + ufbxt_check_mesh(scene, scene->meshes.data[i]); + } + + for (size_t i = 0; i < scene->lights.count; i++) { + ufbxt_check_light(scene, scene->lights.data[i]); + } + + for (size_t i = 0; i < scene->cameras.count; i++) { + ufbxt_check_camera(scene, scene->cameras.data[i]); + } + + for (size_t i = 0; i < scene->bones.count; i++) { + ufbxt_check_bone(scene, scene->bones.data[i]); + } + + for (size_t i = 0; i < scene->empties.count; i++) { + ufbxt_check_empty(scene, scene->empties.data[i]); + } + + for (size_t i = 0; i < scene->line_curves.count; i++) { + ufbxt_check_line_curve(scene, scene->line_curves.data[i]); + } + + for (size_t i = 0; i < scene->nurbs_curves.count; i++) { + ufbxt_check_nurbs_curve(scene, scene->nurbs_curves.data[i]); + } + + for (size_t i = 0; i < scene->nurbs_surfaces.count; i++) { + ufbxt_check_nurbs_surface(scene, scene->nurbs_surfaces.data[i]); + } + + for (size_t i = 0; i < scene->nurbs_trim_surfaces.count; i++) { + ufbxt_check_nurbs_trim_surface(scene, scene->nurbs_trim_surfaces.data[i]); + } + + for (size_t i = 0; i < scene->nurbs_trim_boundaries.count; i++) { + ufbxt_check_nurbs_trim_boundary(scene, scene->nurbs_trim_boundaries.data[i]); + } + + for (size_t i = 0; i < scene->procedural_geometries.count; i++) { + ufbxt_check_procedural_geometry(scene, scene->procedural_geometries.data[i]); + } + + for (size_t i = 0; i < scene->stereo_cameras.count; i++) { + ufbxt_check_stereo_camera(scene, scene->stereo_cameras.data[i]); + } + + for (size_t i = 0; i < scene->camera_switchers.count; i++) { + ufbxt_check_camera_switcher(scene, scene->camera_switchers.data[i]); + } + + for (size_t i = 0; i < scene->markers.count; i++) { + ufbxt_check_marker(scene, scene->markers.data[i]); + } + + for (size_t i = 0; i < scene->lod_groups.count; i++) { + ufbxt_check_lod_group(scene, scene->lod_groups.data[i]); + } + + for (size_t i = 0; i < scene->skin_deformers.count; i++) { + ufbxt_check_skin_deformer(scene, scene->skin_deformers.data[i]); + } + + for (size_t i = 0; i < scene->skin_clusters.count; i++) { + ufbxt_check_skin_cluster(scene, scene->skin_clusters.data[i]); + } + + for (size_t i = 0; i < scene->blend_deformers.count; i++) { + ufbxt_check_blend_deformer(scene, scene->blend_deformers.data[i]); + } + + for (size_t i = 0; i < scene->blend_channels.count; i++) { + ufbxt_check_blend_channel(scene, scene->blend_channels.data[i]); + } + + for (size_t i = 0; i < scene->blend_shapes.count; i++) { + ufbxt_check_blend_shape(scene, scene->blend_shapes.data[i]); + } + + for (size_t i = 0; i < scene->cache_deformers.count; i++) { + ufbxt_check_cache_deformer(scene, scene->cache_deformers.data[i]); + } + + for (size_t i = 0; i < scene->cache_files.count; i++) { + ufbxt_check_cache_file(scene, scene->cache_files.data[i]); + } + + for (size_t i = 0; i < scene->materials.count; i++) { + ufbxt_check_material(scene, scene->materials.data[i]); + } + + for (size_t i = 0; i < scene->textures.count; i++) { + ufbxt_check_texture(scene, scene->textures.data[i]); + } + + for (size_t i = 0; i < scene->videos.count; i++) { + ufbxt_check_video(scene, scene->videos.data[i]); + } + + for (size_t i = 0; i < scene->shaders.count; i++) { + ufbxt_check_shader(scene, scene->shaders.data[i]); + } + + for (size_t i = 0; i < scene->shader_bindings.count; i++) { + ufbxt_check_shader_binding(scene, scene->shader_bindings.data[i]); + } + + for (size_t i = 0; i < scene->anim_stacks.count; i++) { + ufbxt_check_anim_stack(scene, scene->anim_stacks.data[i]); + } + + for (size_t i = 0; i < scene->anim_layers.count; i++) { + ufbxt_check_anim_layer(scene, scene->anim_layers.data[i]); + } + + for (size_t i = 0; i < scene->anim_values.count; i++) { + ufbxt_check_anim_value(scene, scene->anim_values.data[i]); + } + + for (size_t i = 0; i < scene->anim_curves.count; i++) { + ufbxt_check_anim_curve(scene, scene->anim_curves.data[i]); + } + + for (size_t i = 0; i < scene->display_layers.count; i++) { + ufbxt_check_display_layer(scene, scene->display_layers.data[i]); + } + + for (size_t i = 0; i < scene->selection_sets.count; i++) { + ufbxt_check_selection_set(scene, scene->selection_sets.data[i]); + } + + for (size_t i = 0; i < scene->selection_nodes.count; i++) { + ufbxt_check_selection_node(scene, scene->selection_nodes.data[i]); + } + + for (size_t i = 0; i < scene->characters.count; i++) { + ufbxt_check_character(scene, scene->characters.data[i]); + } + + for (size_t i = 0; i < scene->constraints.count; i++) { + ufbxt_check_constraint(scene, scene->constraints.data[i]); + } + + for (size_t i = 0; i < scene->poses.count; i++) { + ufbxt_check_pose(scene, scene->poses.data[i]); + } + + for (size_t i = 0; i < scene->metadata_objects.count; i++) { + ufbxt_check_metadata_object(scene, scene->metadata_objects.data[i]); + } + + for (size_t i = 0; i < scene->texture_files.count; i++) { + ufbxt_assert(scene->texture_files.data[i].index == i); + ufbxt_check_texture_file(scene, &scene->texture_files.data[i]); + } + + if (scene->dom_root) { + ufbxt_check_dom_node(scene, scene->dom_root); + } + + for (size_t type_ix = 0; type_ix < UFBX_ELEMENT_TYPE_COUNT; type_ix++) { + size_t num_elements = scene->elements_by_type[type_ix].count; + for (size_t i = 0; i < num_elements; i++) { + ufbx_element *element = scene->elements_by_type[type_ix].data[i]; + ufbxt_assert(element->type == (ufbx_element_type)type_ix); + ufbxt_assert(element->typed_id == (uint32_t)i); + } + } + + + ufbxt_assert(scene->root_node); + ufbxt_check_element_ptr(scene, scene->root_node, UFBX_ELEMENT_NODE); + ufbxt_assert(scene->root_node->is_root); +} + +#endif diff --git a/modules/ufbx/test/cputime.h b/modules/ufbx/test/cputime.h new file mode 100644 index 0000000..95f6a8f --- /dev/null +++ b/modules/ufbx/test/cputime.h @@ -0,0 +1,292 @@ +#ifndef UFBXT_CPUTIME_H_INCLUDED +#define UFBXT_CPUTIME_H_INCLUDED + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + uint64_t os_tick; + uint64_t cpu_tick; +} cputime_sync_point; + +typedef struct { + cputime_sync_point begin, end; + uint64_t os_freq; + uint64_t cpu_freq; + double rcp_os_freq; + double rcp_cpu_freq; +} cputime_sync_span; + +extern const cputime_sync_span *cputime_default_sync; + +void cputime_begin_init(); +void cputime_end_init(); +void cputime_init(); + +void cputime_begin_sync(cputime_sync_span *span); +void cputime_end_sync(cputime_sync_span *span); + +uint64_t cputime_cpu_tick(); +uint64_t cputime_os_tick(); + +double cputime_cpu_delta_to_sec(const cputime_sync_span *span, uint64_t cpu_delta); +double cputime_os_delta_to_sec(const cputime_sync_span *span, uint64_t os_delta); +double cputime_cpu_tick_to_sec(const cputime_sync_span *span, uint64_t cpu_tick); +double cputime_os_tick_to_sec(const cputime_sync_span *span, uint64_t os_tick); + +#ifdef __cplusplus +} +#endif + +#endif + +#if defined(CPUTIME_IMPLEMENTATION) +#ifndef CPUTIME_IMEPLEMENTED +#define CPUTIME_IMEPLEMENTED + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(CPUTIME_STANDARD_C) || defined(UFBX_STANDARD_C) + +#include + +void cputime_sync_now(cputime_sync_point *sync, int accuracy) +{ + uint64_t tick = (uint64_t)clock(); + sync->cpu_tick = tick; + sync->os_tick = tick; +} + +uint64_t cputime_cpu_tick() +{ + return (uint64_t)clock(); +} + +uint64_t cputime_os_tick() +{ + return (uint64_t)clock(); +} + +static uint64_t cputime_os_freq() +{ + return (uint64_t)CLOCKS_PER_SEC; +} + +static void cputime_os_wait() +{ +} + +#elif defined(_WIN32) + +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include + +#if defined(_MSC_VER) + #include +#else + #include +#endif + +void cputime_sync_now(cputime_sync_point *sync, int accuracy) +{ + uint64_t best_delta = UINT64_MAX; + uint64_t os_tick = 0, cpu_tick = 0; + + int runs = accuracy ? accuracy : 100; + for (int i = 0; i < runs; i++) { + LARGE_INTEGER begin, end; + QueryPerformanceCounter(&begin); + uint64_t cycle = __rdtsc(); + QueryPerformanceCounter(&end); + + uint64_t delta = end.QuadPart - begin.QuadPart; + if (delta < best_delta) { + os_tick = (begin.QuadPart + end.QuadPart) / 2; + cpu_tick = cycle; + } + + if (delta == 0) break; + } + + sync->cpu_tick = cpu_tick; + sync->os_tick = os_tick; +} + +uint64_t cputime_cpu_tick() +{ + return __rdtsc(); +} + +uint64_t cputime_os_tick() +{ + LARGE_INTEGER res; + QueryPerformanceCounter(&res); + return res.QuadPart; +} + +static uint64_t cputime_os_freq() +{ + LARGE_INTEGER res; + QueryPerformanceFrequency(&res); + return res.QuadPart; +} + +static void cputime_os_wait() +{ + Sleep(1); +} + +#else + +#include + +#if (defined(__i386__) || defined(__x86_64__)) && (defined(__GNUC__) || defined(__clang__)) + #include + #define cputime_imp_timestamp() (uint64_t)(__rdtsc()) +#else + static uint64_t cputime_imp_timestamp() + { + struct timespec time; + clock_gettime(CLOCK_MONOTONIC, &time); + return (uint64_t)time.tv_sec*UINT64_C(1000000000) + (uint64_t)time.tv_nsec; + } +#endif + +void cputime_sync_now(cputime_sync_point *sync, int accuracy) +{ + uint64_t best_delta = UINT64_MAX; + uint64_t os_tick, cpu_tick; + + struct timespec begin, end; + + int runs = accuracy ? accuracy : 100; + for (int i = 0; i < runs; i++) { + clock_gettime(CLOCK_REALTIME, &begin); + uint64_t cycle = cputime_imp_timestamp(); + clock_gettime(CLOCK_REALTIME, &end); + + uint64_t begin_ns = (uint64_t)begin.tv_sec*UINT64_C(1000000000) + (uint64_t)begin.tv_nsec; + uint64_t end_ns = (uint64_t)end.tv_sec*UINT64_C(1000000000) + (uint64_t)end.tv_nsec; + + uint64_t delta = end_ns - begin_ns; + if (delta < best_delta) { + os_tick = (begin_ns + end_ns) / 2; + cpu_tick = cycle; + } + + if (delta == 0) break; + } + + sync->cpu_tick = cpu_tick; + sync->os_tick = os_tick; +} + +uint64_t cputime_cpu_tick() +{ + return cputime_imp_timestamp(); +} + +uint64_t cputime_os_tick() +{ + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + return ts.tv_sec*UINT64_C(1000000000) + (uint64_t)ts.tv_nsec; +} + +static uint64_t cputime_os_freq() +{ + return UINT64_C(1000000000); +} + +static void cputime_os_wait() +{ + struct timespec duration; + duration.tv_sec = 0; + duration.tv_nsec = 1000000000l; + nanosleep(&duration, NULL); +} + +#endif + +static cputime_sync_span g_cputime_sync; +const cputime_sync_span *cputime_default_sync = &g_cputime_sync; + +void cputime_begin_init() +{ + cputime_begin_sync(&g_cputime_sync); +} + +void cputime_end_init() +{ + cputime_end_sync(&g_cputime_sync); +} + +void cputime_init() +{ + cputime_begin_init(); + cputime_end_init(); +} + +void cputime_begin_sync(cputime_sync_span *span) +{ + cputime_sync_now(&span->begin, 0); +} + +void cputime_end_sync(cputime_sync_span *span) +{ + uint64_t os_freq = cputime_os_freq(); + + uint64_t min_span = os_freq / 1000; + uint64_t os_tick = cputime_os_tick(); + while (os_tick - span->begin.os_tick <= min_span) { + cputime_os_wait(); + os_tick = cputime_os_tick(); + } + + cputime_sync_now(&span->end, 0); + uint64_t len_os = span->end.os_tick - span->begin.os_tick; + uint64_t len_cpu = span->end.cpu_tick - span->begin.cpu_tick; + double cpu_freq = (double)len_cpu / (double)len_os * (double)os_freq; + + span->os_freq = os_freq; + span->cpu_freq = (uint64_t)cpu_freq; + span->rcp_os_freq = 1.0 / (double)os_freq; + span->rcp_cpu_freq = 1.0 / cpu_freq; +} + +double cputime_cpu_delta_to_sec(const cputime_sync_span *span, uint64_t cpu_delta) +{ + if (!span) span = &g_cputime_sync; + return (double)cpu_delta * span->rcp_cpu_freq; +} + +double cputime_os_delta_to_sec(const cputime_sync_span *span, uint64_t os_delta) +{ + if (!span) span = &g_cputime_sync; + return (double)os_delta * span->rcp_os_freq; +} + +double cputime_cpu_tick_to_sec(const cputime_sync_span *span, uint64_t cpu_tick) +{ + if (!span) span = &g_cputime_sync; + return (double)(cpu_tick - span->begin.cpu_tick) * span->rcp_cpu_freq; +} + +double cputime_os_tick_to_sec(const cputime_sync_span *span, uint64_t os_tick) +{ + if (!span) span = &g_cputime_sync; + return (double)(os_tick - span->begin.os_tick) * span->rcp_os_freq; +} + +#ifdef __cplusplus +} +#endif + +#endif +#endif diff --git a/modules/ufbx/test/domfuzz/domfuzz_main.cpp b/modules/ufbx/test/domfuzz/domfuzz_main.cpp new file mode 100644 index 0000000..cff35c9 --- /dev/null +++ b/modules/ufbx/test/domfuzz/domfuzz_main.cpp @@ -0,0 +1,430 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include + +static void ufbxt_assert_fail_imp(const char *func, const char *file, size_t line, const char *msg) +{ + fprintf(stderr, "%s:%zu: %s(%s) failed\n", file, line, func, msg); + exit(2); +} + +#define ufbxt_assert_fail(file, line, msg) ufbxt_assert_fail_imp("ufbxt_assert_fail", file, line, msg) +#define ufbxt_assert(m_cond) do { if (!(m_cond)) ufbxt_assert_fail_imp("ufbxt_assert", __FILE__, __LINE__, #m_cond); } while (0) + +#include "fbxdom.h" +#include +#include +#include +#include "../../ufbx.h" +#include "../check_scene.h" + +bool g_verbose = false; + +std::vector read_file(const char *path) +{ + FILE *f = fopen(path, "rb"); + fseek(f, 0, SEEK_END); + std::vector data; + data.resize(ftell(f)); + fseek(f, 0, SEEK_SET); + fread(data.data(), 1, data.size(), f); + fclose(f); + return data; +} + +using mutate_simple_fn = bool(fbxdom::node_ptr node, uint32_t index); + +bool mutate_remove_child(fbxdom::node_ptr node, uint32_t index) +{ + if (index >= node->children.size()) return false; + node->children.erase(node->children.begin() + index); + return true; +} + +bool mutate_duplicate_child(fbxdom::node_ptr node, uint32_t index) +{ + if (index >= node->children.size()) return false; + fbxdom::node_ptr child = node->children[index]; + node->children.insert(node->children.begin() + index, std::move(child)); + return true; +} + +bool mutate_reverse_children(fbxdom::node_ptr node, uint32_t index) +{ + if (index > 0) return false; + std::reverse(node->children.begin(), node->children.end()); + return true; +} + +bool mutate_remove_value(fbxdom::node_ptr node, uint32_t index) +{ + if (node->values.size() > 10) return false; + if (index >= node->values.size()) return false; + node->values.erase(node->values.begin() + index); + return true; +} + +bool mutate_duplicate_value(fbxdom::node_ptr node, uint32_t index) +{ + if (node->values.size() > 10) return false; + if (index >= node->values.size()) return false; + fbxdom::value value = node->values[index]; + node->values.insert(node->values.begin() + index, std::move(value)); + return true; +} + +bool mutate_clear_value(fbxdom::node_ptr node, uint32_t index) +{ + if (node->values.size() > 10) return false; + if (index >= node->values.size()) return false; + fbxdom::value &value = node->values[index]; + value.data_int = 0; + value.data_float = 0.0f; + value.data_array.length = 0; + value.data_array.compressed_length = 0; + value.data_array.encoding = 0; + return true; +} + +bool mutate_shrink_value(fbxdom::node_ptr node, uint32_t index) +{ + if (node->values.size() > 10) return false; + if (index >= node->values.size()) return false; + fbxdom::value &value = node->values[index]; + if (value.type == 'L') { + value.type = 'I'; + } else if (value.type == 'D') { + value.type = 'F'; + } else if (value.type == 'I') { + value.type = 'Y'; + } else if (value.type == 'Y') { + value.type = 'C'; + } else if (value.type == 'S') { + value.type = 'L'; + } else { + value.type = 'I'; + } + return true; +} + +bool mutate_reverse_values(fbxdom::node_ptr node, uint32_t index) +{ + if (index > 0) return false; + std::reverse(node->values.begin(), node->values.end()); + return true; +} + +struct mutator +{ + const char *name; + mutate_simple_fn *simple_fn; +}; + +static const mutator mutators[] = { + { "remove child", &mutate_remove_child }, + { "duplicate child", &mutate_duplicate_child }, + { "reverse children", &mutate_reverse_children }, + { "remove value", &mutate_remove_value }, + { "duplicate value", &mutate_duplicate_value }, + { "clear value", &mutate_clear_value }, + { "shrink value", &mutate_shrink_value }, + { "reverse values", &mutate_reverse_values }, +}; + +static const size_t num_mutators = sizeof(mutators) / sizeof(*mutators); + +struct mutable_result +{ + fbxdom::node_ptr self; + fbxdom::node_ptr target; +}; + +fbxdom::node_ptr find_path(fbxdom::node_ptr root, const std::vector &path) +{ + fbxdom::node_ptr node = root; + for (uint32_t ix : path) { + node = node->children[ix]; + } + return node; +} + +void format_path(char *buf, size_t buf_size, fbxdom::node_ptr root, const std::vector &path) +{ + int res = snprintf(buf, buf_size, "Root"); + if (res < 0 || res >= buf_size) return; + size_t pos = (size_t)res; + + fbxdom::node_ptr node = root; + for (uint32_t ix : path) { + node = node->children[ix]; + int res = snprintf(buf + pos, buf_size - pos, "/%u/%.*s", ix, (int)node->name.size(), node->name.data()); + pos += res; + if (res < 0 || pos >= buf_size) break; + } +} + +fbxdom::node_ptr mutate_path(fbxdom::node_ptr &node, const std::vector &path, uint32_t depth=0) +{ + fbxdom::node_ptr copy = node->copy(); + if (depth < path.size()) { + fbxdom::node_ptr &child_ref = copy->children[path[depth]]; + fbxdom::node_ptr child = mutate_path(child_ref, path, depth + 1); + node = copy; + return child; + } else { + node = copy; + return copy; + } +} + +bool increment_path(fbxdom::node_ptr root, std::vector &path) +{ + { + fbxdom::node_ptr node = find_path(root, path); + if (!node->children.empty()) { + path.push_back(0); + return true; + } + } + + while (!path.empty()) { + uint32_t index = path.back(); + path.pop_back(); + fbxdom::node_ptr current = find_path(root, path); + if (index + 1 < current->children.size()) { + path.push_back(index + 1); + return true; + } + } + + return false; +} + +struct mutation_iterator +{ + std::vector path = { }; + uint32_t mutator_index = 0; + uint32_t mutator_internal_index = 0; +}; + +fbxdom::node_ptr next_mutation(fbxdom::node_ptr root, mutation_iterator &iter) +{ + for (;;) { + fbxdom::node_ptr new_root = root; + fbxdom::node_ptr new_node = mutate_path(new_root, iter.path); + + if (mutators[iter.mutator_index].simple_fn(new_node, iter.mutator_internal_index)) { + iter.mutator_internal_index++; + return new_root; + } + + iter.mutator_internal_index = 0; + if (iter.mutator_index + 1 < num_mutators) { + iter.mutator_index++; + continue; + } + + iter.mutator_index = 0; + if (increment_path(root, iter.path)) { + continue; + } + + return { }; + } +} + +static char dump_buffer[16*1024*1024]; + +size_t g_coverage_counter = 0; + +#if defined(DOMFUZZ_COVERAGE) + +extern "C" void __sanitizer_cov_trace_pc_guard_init(uint32_t *start, uint32_t *stop) +{ + std::fill(start, stop, 1u); +} + +extern "C" void __sanitizer_cov_trace_pc_guard(uint32_t *guard) +{ + if (!*guard) return; + g_coverage_counter++; + *guard = 0; +} + +#endif + +int selected_step = -1; +int start_step = -1; +size_t coverage_output_count = 0; + +bool process_fbx_file(const char *input_file, const char *coverage_path, bool dry_run) +{ + std::vector data = read_file(input_file); + + { + ufbx_scene *scene = ufbx_load_memory(data.data(), data.size(), NULL, NULL); + if (!scene) return 0; + if (scene->metadata.ascii || scene->metadata.big_endian) { + ufbx_free_scene(scene); + return false; + } + ufbx_free_scene(scene); + } + + fbxdom::node_ptr root = fbxdom::parse(data.data(), data.size()); + ufbx_error error = { }; + + { + size_t dump_size = fbxdom::dump(dump_buffer, sizeof(dump_buffer), root); + ufbx_scene *scene = ufbx_load_memory(data.data(), data.size(), NULL, &error); + + ufbxt_assert(scene); + ufbxt_check_scene(scene); + + ufbx_free_scene(scene); + } + + char path_str[512]; + + mutation_iterator iter; + fbxdom::node_ptr mut_root; + int current_step = 0; + while ((mut_root = next_mutation(root, iter)) != nullptr) { + if (selected_step >= 0) { + if (current_step != selected_step) { + current_step++; + continue; + } + } + if (start_step >= 0) { + if (current_step < start_step) { + current_step++; + continue; + } + } + + format_path(path_str, sizeof(path_str), root, iter.path); + if (g_verbose) { + printf("%d: %s/ %s %u: ", current_step, path_str, mutators[iter.mutator_index].name, iter.mutator_internal_index); + } + + size_t dump_size = fbxdom::dump(dump_buffer, sizeof(dump_buffer), mut_root); + if (dry_run) { + if (g_verbose) { + printf("SKIP (dry run)\n"); + } + continue; + } + + size_t pre_cov = g_coverage_counter; + ufbx_scene *scene = ufbx_load_memory(dump_buffer, dump_size, NULL, &error); + size_t post_cov = g_coverage_counter; + + if (scene) { + ufbxt_check_scene(scene); + if (g_verbose) { + printf("OK!\n"); + } + } else { + if (g_verbose) { + printf("%s\n", error.description.data); + } + } + + if (coverage_path && pre_cov != post_cov) { + size_t index = ++coverage_output_count; + char dst_path[1024]; + if (!g_verbose) { + printf("%d: %s/ %s %u: ", current_step, path_str, mutators[iter.mutator_index].name, iter.mutator_internal_index); + } + snprintf(dst_path, sizeof(dst_path), "%s%06zu.fbx", coverage_path, coverage_output_count); + printf("%zu new edges! Writing to: %s\n", post_cov - pre_cov, dst_path); + FILE *f = fopen(dst_path, "wb"); + ufbxt_assert(f); + ufbxt_assert(fwrite(dump_buffer, 1, dump_size, f) == dump_size); + ufbxt_assert(fclose(f) == 0); + } + + ufbx_free_scene(scene); + current_step++; + } + + return true; +} + +void process_coverage(const char *input_file, const char *output) +{ + FILE *f = fopen(input_file, "r"); + ufbxt_assert(f); + + std::vector files; + + printf("== DRY RUN ==\n"); + + char line_buf[1024]; + while (fgets(line_buf, sizeof(line_buf), f)) { + std::string line { line_buf }; + while (!line.empty() && std::isspace(line.back())) { + line.pop_back(); + } + if (line.empty()) continue; + + printf("-- %s --\n", line.c_str()); + if (!process_fbx_file(line.c_str(), NULL, true)) { + fprintf(stderr, "Failed to load test case\n"); + exit(3); + } + + files.push_back(std::move(line)); + } + + fclose(f); + + if (g_coverage_counter == 0) { + fprintf(stderr, "No coverage detected.. make sure to compile with DOMFUZZ_COVERAGE"); + exit(3); + } + + printf("Found %zu initial edges\n", g_coverage_counter); + printf("== REAL RUN ==\n"); + + for (const std::string &file : files) { + printf("-- %s --\n", file.c_str()); + if (!process_fbx_file(file.c_str(), output, false)) { + fprintf(stderr, "Failed to load test case\n"); + exit(3); + } + } +} + +int main(int argc, char **argv) +{ + const char *input_file = NULL; + const char *coverage_output = NULL; + + for (int i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-v")) { + g_verbose = 1; + } else if (!strcmp(argv[i], "--step")) { + if (++i < argc) selected_step = atoi(argv[i]); + } else if (!strcmp(argv[i], "--start")) { + if (++i < argc) start_step = atoi(argv[i]); + } else if (!strcmp(argv[i], "--coverage")) { + if (++i < argc) coverage_output = argv[i]; + } else { + input_file = argv[i]; + } + } + + if (coverage_output) { + process_coverage(input_file, coverage_output); + } else if (input_file) { + process_fbx_file(input_file, NULL, false); + } else { + fprintf(stderr, "Usage: domfuzz \n"); + } + + return 0; +} diff --git a/modules/ufbx/test/domfuzz/fbxdom.cpp b/modules/ufbx/test/domfuzz/fbxdom.cpp new file mode 100644 index 0000000..56c7f3d --- /dev/null +++ b/modules/ufbx/test/domfuzz/fbxdom.cpp @@ -0,0 +1,331 @@ +#include "fbxdom.h" +#include +#include + +#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) + #define FBXDOM_NATIVE_WRITE 1 +#else + #define FBXDOM_NATIVE_WRITE 0 +#endif + +namespace fbxdom { + +struct binary_reader +{ + const char *ptr; + const char *start; + const char *end; + + binary_reader(const void *data, size_t size) + : ptr((const char*)data), start((const char*)data) + , end((const char*)data + size) { } + + size_t offset() const { return ptr - start; } + + void skip(size_t size) { + assert((size_t)(end - ptr) >= size); + ptr += size; + } + + template + T peek() { + assert((size_t)(end - ptr) >= sizeof(T)); + uint64_t value = 0; + for (size_t i = 0; i < sizeof(T); i++) { + value |= (uint64_t)(uint8_t)ptr[i] << i * 8; + } + T result; + memcpy(&result, &value, sizeof(T)); + return result; + } + + template + T read() { + T result = peek(); + ptr += sizeof(T); + return result; + } + + std::vector read_vector(size_t size) + { + std::vector result; + assert((size_t)(end - ptr) >= size); + result.insert(result.begin(), ptr, ptr + size); + ptr += size; + return result; + } +}; + +struct binary_writer +{ + char *ptr; + char *start; + char *end; + + binary_writer(const void *data, size_t size) + : ptr((char*)data), start((char*)data) + , end((char*)data + size) { } + + + size_t offset() { return ptr - start; } + + void skip(size_t size) + { + assert((size_t)(end - ptr) >= size); + for (size_t i = 0; i < size; i++) { + *ptr++ = 0; + } + } + + template + void write(U value, size_t offset) { +#if FBXDOM_NATIVE_WRITE + *(T*)(start + offset) = (T)value; +#else + T tvalue = (T)value; + uint64_t uint = 0; + memcpy(&uint, &tvalue, sizeof(T)); + for (size_t i = 0; i < sizeof(T); i++) { + start[offset + i] = (uint >> (i*8)) & 0xff; + } +#endif + } + + template + void write(U value) { +#if FBXDOM_NATIVE_WRITE + *(T*)ptr = (T)value; + ptr += sizeof(T); +#else + T tvalue = (T)value; + uint64_t uint = 0; + memcpy(&uint, &tvalue, sizeof(T)); + for (size_t i = 0; i < sizeof(T); i++) { + ptr[i] = (uint >> (i*8)) & 0xff; + } + ptr += sizeof(T); +#endif + } + + void write(const char *data, size_t size) + { + memcpy(ptr, data, size); + ptr += size; + } + + void write(const std::vector &data) + { + write(data.data(), data.size()); + } +}; + +struct binary_parser +{ + binary_reader reader; + uint32_t version = 0; + + binary_parser(const void *data, size_t size) + : reader(data, size) { } + + void parse_array(value &v, size_t elem_size) + { + v.data_array.length = reader.read(); + v.data_array.encoding = reader.read(); + v.data_array.compressed_length = reader.read(); + v.data = reader.read_vector(v.data_array.compressed_length); + } + + value parse_value() + { + value v; + + char type = reader.read(); + v.type = type; + switch (type) { + case 'B': case 'C': v.data_float = (double)(v.data_int = reader.read()); break; + case 'Y': v.data_float = (double)(v.data_int = reader.read()); break; + case 'I': v.data_float = (double)(v.data_int = reader.read()); break; + case 'L': v.data_float = (double)(v.data_int = reader.read()); break; + case 'F': v.data_int = (int64_t)(v.data_float = reader.read()); break; + case 'D': v.data_int = (int64_t)(v.data_float = reader.read()); break; + case 'b': case 'c': parse_array(v, 1); break; + case 'i': case 'f': parse_array(v, 4); break; + case 'l': case 'd': parse_array(v, 8); break; + case 'S': case 'R': v.data = reader.read_vector(reader.read()); break; + } + + return v; + } + + node_ptr parse_node() + { + size_t num_properties; + size_t end_offset; + + if (version >= 7500) { + end_offset = (size_t)reader.read(); + num_properties = (size_t)reader.read(); + reader.skip(8); + } else { + end_offset = (size_t)reader.read(); + num_properties = (size_t)reader.read(); + reader.skip(4); + } + + size_t name_len = reader.read(); + if (end_offset == 0 && name_len == 0) return { }; + + node_ptr n = std::make_shared(); + + n->name = reader.read_vector(name_len); + n->values.reserve(num_properties); + for (size_t i = 0; i < num_properties; i++) { + n->values.push_back(parse_value()); + } + + while (reader.offset() < end_offset || end_offset == 0) { + node_ptr child = parse_node(); + if (!child) break; + n->children.push_back(std::move(child)); + } + + return n; + } + + node_ptr parse_root() + { + std::vector magic = reader.read_vector(21); + if (memcmp(magic.data(), "Kaydara FBX Binary \x00", 21) != 0) return { }; + reader.skip(2); + version = reader.read(); + + node_ptr root = std::make_shared(); + + { + value v; + v.data_int = version; + root->values.push_back(v); + } + + for (;;) { + node_ptr child = parse_node(); + if (!child) break; + root->children.push_back(std::move(child)); + } + + return root; + } +}; + +struct binary_dumper +{ + binary_writer writer; + uint32_t version = 0; + + binary_dumper(void *data, size_t size) + : writer(data, size) { } + + void dump_array(const value &v) + { + writer.write(v.data_array.length); + writer.write(v.data_array.encoding); + writer.write(v.data_array.compressed_length); + writer.write(v.data); + } + + void dump_value(const value &v) + { + writer.write(v.type); + switch (v.type) { + case 'B': case 'C': writer.write(v.data_int); break; + case 'Y': writer.write(v.data_int); break; + case 'I': writer.write(v.data_int); break; + case 'L': writer.write(v.data_int); break; + case 'F': writer.write(v.data_float); break; + case 'D': writer.write(v.data_float); break; + case 'b': case 'c': dump_array(v); break; + case 'i': case 'f': dump_array(v); break; + case 'l': case 'd': dump_array(v); break; + case 'S': case 'R': + writer.write(v.data.size()); + writer.write(v.data); + break; + } + } + + void dump_node(node_ptr node) + { + size_t node_start = writer.offset(); + if (version >= 7500) { + writer.skip(8); + writer.write(node->values.size()); + writer.skip(8); + } else { + writer.skip(4); + writer.write(node->values.size()); + writer.skip(4); + } + + writer.write(node->name.size()); + writer.write(node->name); + + size_t value_start = writer.offset(); + for (const value &v : node->values) { + dump_value(v); + } + size_t value_end = writer.offset(); + + if (!node->children.empty()) { + for (const node_ptr child : node->children) { + dump_node(child); + } + writer.skip(version >= 7500 ? 25 : 13); + } + + size_t node_end = writer.offset(); + + if (version >= 7500) { + writer.write(node_end, node_start + 0); + writer.write(value_end - value_start, node_start + 16); + } else { + writer.write(node_end, node_start + 0); + writer.write(value_end - value_start, node_start + 8); + } + } + + void dump_root(node_ptr root) + { + if (root->values.size() > 0) { + version = (uint32_t)root->values[0].data_int; + } else { + version = 7500; + } + + writer.write("Kaydara FBX Binary \x00\x1a\x00", 23); + writer.write(version); + + for (const node_ptr child : root->children) { + dump_node(child); + } + writer.skip(version >= 7500 ? 25 : 13); + } +}; + +node_ptr node::copy() const +{ + return std::make_shared(*this); +} + +node_ptr parse(const void *data, size_t size) +{ + return binary_parser(data, size).parse_root(); +} + +size_t dump(void *dst, size_t size, node_ptr root) +{ + binary_dumper d { dst, size }; + d.dump_root(root); + return d.writer.offset(); +} + +} diff --git a/modules/ufbx/test/domfuzz/fbxdom.h b/modules/ufbx/test/domfuzz/fbxdom.h new file mode 100644 index 0000000..76b26f4 --- /dev/null +++ b/modules/ufbx/test/domfuzz/fbxdom.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace fbxdom { + +struct node; +using node_ptr = std::shared_ptr; + +struct array_info +{ + uint32_t length = 0; + uint32_t encoding = 0; + uint32_t compressed_length = 0; +}; + +struct value +{ + char type = 0; + array_info data_array; + int64_t data_int = 0; + double data_float = 0.0; + std::vector data; +}; + +struct node +{ + std::vector name; + std::vector values; + std::vector children; + + node_ptr copy() const; +}; + +node_ptr parse(const void *data, size_t size); +size_t dump(void *dst, size_t size, node_ptr root); + +} diff --git a/modules/ufbx/test/hash_scene.c b/modules/ufbx/test/hash_scene.c new file mode 100644 index 0000000..174df87 --- /dev/null +++ b/modules/ufbx/test/hash_scene.c @@ -0,0 +1,252 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include "../ufbx.h" +#include "hash_scene.h" +#include +#include +#include +#include + +typedef struct { + size_t pos; + size_t size; + union { + size_t size_and_align[2]; + bool reverse; + }; + char data[]; +} ufbxt_linear_alloactor; + +static void *linear_alloc_fn(void *user, size_t size) +{ + ufbxt_linear_alloactor *ator = (ufbxt_linear_alloactor*)user; + size = (size + 7u) & ~(size_t)7; + + size_t pos = ator->pos; + if (ator->reverse) { + assert(pos >= size); + ator->pos = pos - size; + return ator->data + (pos - size); + } else { + assert(ator->size - pos >= size); + ator->pos = pos + size; + return ator->data + pos; + } +} + +static void linear_free_allocator_fn(void *user) +{ + ufbxt_linear_alloactor *ator = (ufbxt_linear_alloactor*)user; + free(ator); +} + +static void linear_allocator_init(ufbx_allocator *allocator, size_t size, bool reverse) +{ + ufbxt_linear_alloactor *ator = (ufbxt_linear_alloactor*)malloc(sizeof(ufbxt_linear_alloactor) + size); + assert(ator); + ator->size = size; + ator->reverse = reverse; + if (reverse) { + ator->pos = ator->size; + } else { + ator->pos = 0; + } + + allocator->alloc_fn = &linear_alloc_fn; + allocator->free_allocator_fn = &linear_free_allocator_fn; + allocator->user = ator; +} + +typedef struct { + bool dedicated_allocs; + bool no_read_buffer; + const char *allocator; + size_t linear_allocator_size; +} ufbxt_hasher_opts; + +static void setup_allocator(ufbx_allocator_opts *ator_opts, ufbxt_hasher_opts *opts) +{ + if (opts->dedicated_allocs) { + ator_opts->huge_threshold = 1; + } + + size_t linear_size = opts->linear_allocator_size ? opts->linear_allocator_size : 128u*1024u*1024u; + if (opts->allocator) { + if (!strcmp(opts->allocator, "linear")) { + linear_allocator_init(&ator_opts->allocator, linear_size, false); + } else if (!strcmp(opts->allocator, "linear-reverse")) { + linear_allocator_init(&ator_opts->allocator, linear_size, true); + } else { + fprintf(stderr, "Unknown allocator: %s\n", opts->allocator); + exit(1); + } + } +} + +static ufbx_scene *load_scene(const char *filename, int frame, ufbxt_hasher_opts *hasher_opts) +{ + ufbx_load_opts opts = { 0 }; + opts.load_external_files = true; + opts.evaluate_caches = true; + opts.evaluate_skinning = true; + opts.target_axes = ufbx_axes_right_handed_y_up; + opts.target_unit_meters = 1.0f; + + if (hasher_opts->no_read_buffer) { + opts.read_buffer_size = 1; + } + + setup_allocator(&opts.temp_allocator, hasher_opts); + setup_allocator(&opts.result_allocator, hasher_opts); + + ufbx_error error; + ufbx_scene *scene = ufbx_load_file(filename, &opts, &error); + if (!scene) { + fprintf(stderr, "Failed to load scene: %s\n", error.description.data); + exit(2); + } + + if (frame > 0) { + ufbx_evaluate_opts eval_opts = { 0 }; + eval_opts.evaluate_caches = true; + eval_opts.evaluate_skinning = true; + eval_opts.load_external_files = true; + + double time = scene->anim.time_begin + frame / scene->settings.frames_per_second; + ufbx_scene *state = ufbx_evaluate_scene(scene, NULL, time, NULL, &error); + if (!state) { + fprintf(stderr, "Failed to evaluate scene: %s\n", error.description.data); + exit(2); + } + ufbx_free_scene(scene); + scene = state; + } + + return scene; +} + +int main(int argc, char **argv) +{ + const char *filename = NULL; + const char *dump_filename = NULL; + int max_dump_errors = -1; + bool do_check = false; + bool dump_all = false; + bool verbose = false; + ufbxt_hasher_opts hasher_opts = { 0 }; + + int frame = -1; + for (int i = 1; i < argc; i++) { + if (!strcmp(argv[i], "--frame")) { + if (++i < argc) frame = atoi(argv[i]); + } else if (!strcmp(argv[i], "--verbose")) { + verbose = true; + } else if (!strcmp(argv[i], "--check")) { + do_check = true; + } else if (!strcmp(argv[i], "--dump")) { + if (++i < argc) dump_filename = argv[i]; + } else if (!strcmp(argv[i], "--dump-all")) { + dump_all = true; + } else if (!strcmp(argv[i], "--dedicated-allocs")) { + hasher_opts.dedicated_allocs = true; + } else if (!strcmp(argv[i], "--no-read-buffer")) { + hasher_opts.no_read_buffer = true; + } else if (!strcmp(argv[i], "--allocator")) { + if (++i < argc) hasher_opts.allocator = argv[i]; + } else if (!strcmp(argv[i], "--max-dump-errors")) { + if (++i < argc) max_dump_errors = atoi(argv[i]); + } else { + if (filename) { + if (argv[i][0] == '-') { + fprintf(stderr, "Unknown flag: %s\n", argv[i]); + exit(1); + } else { + fprintf(stderr, "Error: Multiple input files\n"); + exit(1); + } + } + filename = argv[i]; + } + } + + if (!filename) { + fprintf(stderr, "Usage: hash_scene \n"); + fprintf(stderr, " hash_scene --check \n"); + return 1; + } + + int num_fail = 0; + int num_total = 0; + + FILE *dump_file = NULL; + + if (do_check) { + FILE *f = fopen(filename, "r"); + if (!f) { + fprintf(stderr, "Failed to open hash file\n"); + return 1; + } + + uint64_t fbx_hash = 0; + char fbx_file[1024]; + while (fscanf(f, "%" SCNx64 " %d %s", &fbx_hash, &frame, fbx_file) == 3) { + ufbx_scene *scene = load_scene(fbx_file, frame, &hasher_opts); + + uint64_t hash = ufbxt_hash_scene(scene, NULL); + if (hash != fbx_hash || dump_all) { + if (num_fail < max_dump_errors || dump_all) { + if (!dump_file) { + dump_file = fopen(dump_filename, "wb"); + assert(dump_file); + } + + fprintf(dump_file, "\n-- %d %s\n\n", frame, fbx_file); + ufbxt_hash_scene(scene, dump_file); + } + + if (!dump_all) { + printf("%s: FAIL %" PRIx64 " (local) vs %" PRIx64 " (reference)\n", + fbx_file, hash, fbx_hash); + num_fail++; + } + } else { + if (verbose) { + printf("%s: OK\n", fbx_file); + } + } + num_total++; + } + + fclose(f); + + if (!dump_all) { + if (verbose || num_fail > 0) { + printf("\n"); + } + printf("%d/%d hashes match\n", num_total - num_fail, num_total); + } + } else { + ufbx_scene *scene = load_scene(filename, frame, &hasher_opts); + + if (dump_filename) { + dump_file = fopen(dump_filename, "wb"); + assert(dump_file); + } + + uint64_t hash = ufbxt_hash_scene(scene, dump_file); + + printf("%016" PRIx64 "\n", hash); + } + + if (dump_file) { + fclose(dump_file); + } + + return num_fail > 0 ? 3 : 0; +} + +#define UFBX_NO_MATH_H +#define UFBX_MATH_PREFIX fdlibm_ + +#include "../ufbx.c" + diff --git a/modules/ufbx/test/hash_scene.h b/modules/ufbx/test/hash_scene.h new file mode 100644 index 0000000..4639e40 --- /dev/null +++ b/modules/ufbx/test/hash_scene.h @@ -0,0 +1,1318 @@ +#ifndef UFBXT_HASH_SCENE_H_INCLUDED +#define UFBXT_HASH_SCENE_H_INCLUDED + +#include "testing_basics.h" + +#include +#include + +typedef struct ufbxt_hash { + uint64_t state; + bool dumping; + FILE *dump_file; + size_t indent; + bool at_tag; + bool at_value; + bool big_endian; +} ufbxt_hash; + +ufbxt_noinline static void ufbxt_hash_init(ufbxt_hash *h, FILE *dump_file) +{ + memset(h, 0, sizeof(ufbxt_hash)); + h->state = UINT64_C(0xcbf29ce484222325); + { + uint8_t buf[2]; + uint16_t val = 0xbbaa; + memcpy(buf, &val, 2); + h->big_endian = buf[0] == 0xbb; + } + + if (dump_file) { + h->dumping = true; + h->dump_file = dump_file; + } +} + +ufbxt_noinline static uint64_t ufbxt_hash_finish(ufbxt_hash *h) +{ + if (h->dump_file) { + fflush(h->dump_file); + } + return h->state; +} + +ufbxt_noinline static void ufbxt_push_tag(ufbxt_hash *h, const char *tag) +{ + if (!h->dumping) return; + if (tag[0] == '&') { + tag++; + } + if (!strncmp(tag, "v->", 3)) { + tag += 3; + } else if (!strncmp(tag, "v.", 2)) { + tag += 2; + } + + if (h->at_tag) { + fprintf(h->dump_file, "{\n"); + h->indent += 1; + } + for (size_t i = 0; i < h->indent; i++) { + fprintf(h->dump_file, " "); + } + fprintf(h->dump_file, "%s: ", tag); + h->at_tag = true; +} + +ufbxt_noinline static void ufbxt_push_tag_index(ufbxt_hash *h, size_t index) +{ + if (!h->dumping) return; + char buf[128]; + snprintf(buf, sizeof(buf), "[%zu]", index); + ufbxt_push_tag(h, buf); +} + +ufbxt_noinline static void ufbxt_pop_tag(ufbxt_hash *h) +{ + if (!h->dumping) return; + if (h->at_value || h->at_tag) { + fprintf(h->dump_file, "\n"); + h->at_value = false; + h->at_tag = false; + } else { + h->indent -= 1; + for (size_t i = 0; i < h->indent; i++) { + fprintf(h->dump_file, " "); + } + fprintf(h->dump_file, "}\n"); + } +} + +ufbxt_noinline static void ufbxt_dump_data(ufbxt_hash *h, const void *data, size_t size, bool reverse) +{ + assert(h->at_tag && !h->at_value); + h->at_tag = false; + h->at_value = true; + + const char *d = (const char*)data; + if (reverse) { + for (size_t i = size; i > 0; i--) { + uint32_t b = (uint32_t)(uint8_t)d[i - 1]; + fprintf(h->dump_file, "%02x", b); + } + } else { + for (size_t i = 0; i < size; i++) { + uint32_t b = (uint32_t)(uint8_t)d[i]; + fprintf(h->dump_file, "%02x", b); + } + } +} + +ufbxt_noinline static void ufbxt_hash_data(ufbxt_hash *h, const void *data, size_t size) +{ + const char *d = (const char*)data; + uint64_t state = h->state; + for (size_t i = 0; i < size; i++) { + state = (state ^ (uint8_t)d[i]) * UINT64_C(0x00000100000001B3); + } + h->state = state; + + if (h->dumping) { + ufbxt_dump_data(h, data, size, false); + } +} + +ufbxt_noinline static void ufbxt_hash_endian_data(ufbxt_hash *h, const void *data, size_t size) +{ + bool reverse = !h->big_endian; + assert(size == 1 || size == 2 || size == 4 || size == 8); + + const char *d = (const char*)data; + uint64_t state = h->state; + if (reverse) { + for (size_t i = size; i > 0; i--) { + state = (state ^ (uint8_t)d[i - 1]) * UINT64_C(0x00000100000001B3); + } + } else { + for (size_t i = 0; i < size; i++) { + state = (state ^ (uint8_t)d[i]) * UINT64_C(0x00000100000001B3); + } + } + h->state = state; + + if (h->dumping) { + ufbxt_dump_data(h, data, size, true); + } +} + +#define ufbxt_hash_pod_imp(h, v) ufbxt_hash_endian_data((h), &(v), sizeof((v))) +#define ufbxt_hash_pod(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_pod_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_float_imp(ufbxt_hash *h, float v) +{ + if (v == v) { + ufbxt_hash_pod_imp(h, v); + } else { + uint32_t u = UINT32_MAX; + ufbxt_hash_pod_imp(h, u); + } +} + +ufbxt_noinline static void ufbxt_hash_double_imp(ufbxt_hash *h, double v) +{ + if (v == v) { + ufbxt_hash_pod_imp(h, v); + } else { + uint64_t u = UINT64_MAX; + ufbxt_hash_pod_imp(h, u); + } +} + +ufbxt_noinline static void ufbxt_hash_real_imp(ufbxt_hash *h, ufbx_real v) +{ + if (v == v) { + ufbxt_hash_pod_imp(h, v); + } else { + uint64_t u = UINT64_MAX; + ufbxt_hash_pod_imp(h, u); + } +} + +ufbxt_noinline static void ufbxt_hash_size_t_imp(ufbxt_hash *h, size_t v) +{ + uint64_t u = v; + ufbxt_hash_pod_imp(h, u); +} + +#define ufbxt_hash_float(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_float_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_double(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_double_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_real(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_real_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_size_t(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_size_t_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_vec2_imp(ufbxt_hash *h, ufbx_vec2 v) +{ + ufbxt_hash_real(h, v.x); + ufbxt_hash_real(h, v.y); +} + +ufbxt_noinline static void ufbxt_hash_vec3_imp(ufbxt_hash *h, ufbx_vec3 v) +{ + ufbxt_hash_real(h, v.x); + ufbxt_hash_real(h, v.y); + ufbxt_hash_real(h, v.z); +} + +ufbxt_noinline static void ufbxt_hash_vec4_imp(ufbxt_hash *h, ufbx_vec4 v) +{ + ufbxt_hash_real(h, v.x); + ufbxt_hash_real(h, v.y); + ufbxt_hash_real(h, v.z); + ufbxt_hash_real(h, v.w); +} + +ufbxt_noinline static void ufbxt_hash_quat_imp(ufbxt_hash *h, ufbx_quat v) +{ + ufbxt_hash_real(h, v.x); + ufbxt_hash_real(h, v.y); + ufbxt_hash_real(h, v.z); + ufbxt_hash_real(h, v.w); +} + +#define ufbxt_hash_vec2(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_vec2_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_vec3(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_vec3_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_vec4(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_vec4_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_quat(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_quat_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_transform_imp(ufbxt_hash *h, ufbx_transform v) +{ + ufbxt_hash_vec3(h, v.translation); + ufbxt_hash_quat(h, v.rotation); + ufbxt_hash_vec3(h, v.scale); +} + +ufbxt_noinline static void ufbxt_hash_matrix_imp(ufbxt_hash *h, ufbx_matrix v) +{ + ufbxt_hash_vec3(h, v.cols[0]); + ufbxt_hash_vec3(h, v.cols[1]); + ufbxt_hash_vec3(h, v.cols[2]); + ufbxt_hash_vec3(h, v.cols[3]); +} + +ufbxt_noinline static void ufbxt_hash_string_imp(ufbxt_hash *h, ufbx_string v) +{ + ufbxt_hash_size_t(h, v.length); + ufbxt_push_tag(h, "v.data"); + ufbxt_hash_data(h, v.data, v.length + 1); + ufbxt_pop_tag(h); +} + +ufbxt_noinline static void ufbxt_hash_blob_imp(ufbxt_hash *h, ufbx_blob v) +{ + ufbxt_hash_size_t(h, v.size); + ufbxt_push_tag(h, "v.data"); + ufbxt_hash_data(h, v.data, v.size); + ufbxt_pop_tag(h); +} + +#define ufbxt_hash_transform(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_transform_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_matrix(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_matrix_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_string(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_string_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_blob(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_blob_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_element_ref_imp(ufbxt_hash *h, const void *v) +{ + const ufbx_element *elem = (const ufbx_element*)v; + uint32_t id = elem ? elem->element_id : UINT32_MAX; + ufbxt_hash_pod(h, id); +} + +ufbxt_noinline static void ufbxt_hash_prop_ref_imp(ufbxt_hash *h, const ufbx_prop *prop) +{ + if (!prop) { + uint32_t zero = UINT32_MAX; + ufbxt_hash_pod(h, zero); + } else { + ufbxt_hash_string(h, prop->name); + } +} + +#define ufbxt_hash_prop_ref(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_prop_ref_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_element_ref(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_element_ref_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_connection_imp(ufbxt_hash *h, ufbx_connection v) +{ + ufbxt_hash_element_ref(h, v.src); + ufbxt_hash_element_ref(h, v.dst); + ufbxt_hash_string(h, v.src_prop); + ufbxt_hash_string(h, v.dst_prop); +} + +#define ufbxt_hash_connection(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_connection_imp(h, v), ufbxt_pop_tag(h)) + +#define ufbxt_hash_array(h, v, func) do { \ + ufbxt_push_tag(h, #v); \ + for (size_t i = 0; i < sizeof(v) / sizeof(*(v)); i++) { \ + ufbxt_push_tag_index(h, i); \ + func((h), (v)[i]); \ + ufbxt_pop_tag(h); \ + } \ + ufbxt_pop_tag(h); \ + } while (0) + +#define ufbxt_hash_list(h, v, func) do { \ + ufbxt_push_tag(h, #v); \ + size_t count = (v).count; \ + ufbxt_hash_size_t((h), count); \ + ufbxt_push_tag(h, "data"); \ + for (size_t i = 0; i < count; i++) { \ + ufbxt_push_tag_index(h, i); \ + func((h), (v).data[i]); \ + ufbxt_pop_tag(h); \ + } \ + ufbxt_pop_tag(h); \ + ufbxt_pop_tag(h); \ + } while (0) + +#define ufbxt_hash_list_ptr(h, v, func) do { \ + ufbxt_push_tag(h, #v); \ + size_t count = (v).count; \ + ufbxt_hash_size_t((h), count); \ + ufbxt_push_tag(h, "data"); \ + for (size_t i = 0; i < count; i++) { \ + ufbxt_push_tag_index(h, i); \ + func((h), &(v).data[i]); \ + ufbxt_pop_tag(h); \ + } \ + ufbxt_pop_tag(h); \ + ufbxt_pop_tag(h); \ + } while (0) + +ufbxt_noinline static void ufbxt_hash_prop_imp(ufbxt_hash *h, const ufbx_prop *v) +{ + ufbxt_hash_string(h, v->name); + ufbxt_hash_pod(h, v->_internal_key); + ufbxt_hash_pod(h, v->type); + ufbxt_hash_pod(h, v->flags); + ufbxt_hash_string(h, v->value_str); + ufbxt_hash_blob(h, v->value_blob); + ufbxt_hash_pod(h, v->value_int); + ufbxt_hash_vec4(h, v->value_vec4); +} + +#define ufbxt_hash_prop(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_prop_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_dom_value_imp(ufbxt_hash *h, const ufbx_dom_value *v) +{ + ufbxt_hash_pod(h, v->type); + ufbxt_hash_string(h, v->value_str); + size_t count = (size_t)v->value_int; + if (v->type == UFBX_DOM_VALUE_ARRAY_RAW_STRING) { + const ufbx_string *vs = (const ufbx_string*)v->value_blob.data; + for (size_t i = 0; i < count; i++) { + ufbxt_hash_string(h, vs[i]); + } + } else if (v->type == UFBX_DOM_VALUE_ARRAY_F32) { + const float *vs = (const float*)v->value_blob.data; + for (size_t i = 0; i < count; i++) { + ufbxt_hash_float(h, vs[i]); + } + } else if (v->type == UFBX_DOM_VALUE_ARRAY_F64) { + const double *vs = (const double*)v->value_blob.data; + for (size_t i = 0; i < count; i++) { + ufbxt_hash_double(h, vs[i]); + } + } else { + ufbxt_hash_blob(h, v->value_blob); + } + ufbxt_hash_pod(h, v->value_int); + ufbxt_hash_double(h, v->value_float); +} + +#define ufbxt_hash_dom_value(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_dom_value_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_dom_node_imp(ufbxt_hash *h, const ufbx_dom_node *v) +{ + ufbxt_hash_string(h, v->name); + ufbxt_hash_list(h, v->children, ufbxt_hash_dom_node_imp); + ufbxt_hash_list_ptr(h, v->values, ufbxt_hash_dom_value_imp); +} + +#define ufbxt_hash_dom_node(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_dom_node_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_props_imp(ufbxt_hash *h, const ufbx_props *v) +{ + ufbxt_hash_list_ptr(h, v->props, ufbxt_hash_prop_imp); + ufbxt_hash_size_t(h, v->num_animated); + if (v->defaults) { + ufbxt_push_tag(h, "defaults"); + ufbxt_hash_props_imp(h, v->defaults); + ufbxt_pop_tag(h); + } +} + +#define ufbxt_hash_props(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_props_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_element_imp(ufbxt_hash *h, const ufbx_element *v) +{ + ufbxt_hash_string(h, v->name); + ufbxt_hash_props(h, &v->props); + ufbxt_hash_pod(h, v->element_id); + ufbxt_hash_pod(h, v->typed_id); + ufbxt_hash_list(h, v->instances, ufbxt_hash_element_ref_imp); + ufbxt_hash_pod(h, v->type); + ufbxt_hash_list(h, v->connections_src, ufbxt_hash_connection_imp); + ufbxt_hash_list(h, v->connections_dst, ufbxt_hash_connection_imp); +} + +ufbxt_noinline static void ufbxt_hash_unknown_imp(ufbxt_hash *h, const ufbx_unknown *v) +{ + ufbxt_hash_string(h, v->type); + ufbxt_hash_string(h, v->super_type); + ufbxt_hash_string(h, v->sub_type); +} + +ufbxt_noinline static void ufbxt_hash_node_imp(ufbxt_hash *h, const ufbx_node *v) +{ + ufbxt_hash_element_ref(h, v->parent); + ufbxt_hash_list(h, v->children, ufbxt_hash_element_ref_imp); + ufbxt_hash_element_ref(h, v->mesh); + ufbxt_hash_element_ref(h, v->light); + ufbxt_hash_element_ref(h, v->camera); + ufbxt_hash_element_ref(h, v->bone); + ufbxt_hash_element_ref(h, v->attrib); + ufbxt_hash_element_ref(h, v->geometry_transform_helper); + ufbxt_hash_pod(h, v->attrib_type); + ufbxt_hash_list(h, v->all_attribs, ufbxt_hash_element_ref_imp); + ufbxt_hash_pod(h, v->inherit_type); + ufbxt_hash_transform(h, v->local_transform); + ufbxt_hash_transform(h, v->geometry_transform); + ufbxt_hash_pod(h, v->rotation_order); + ufbxt_hash_vec3(h, v->euler_rotation); + ufbxt_hash_transform(h, v->world_transform); + ufbxt_hash_matrix(h, v->node_to_parent); + ufbxt_hash_matrix(h, v->node_to_world); + ufbxt_hash_matrix(h, v->geometry_to_node); + ufbxt_hash_matrix(h, v->geometry_to_world); + ufbxt_hash_quat(h, v->adjust_pre_rotation); + ufbxt_hash_vec3(h, v->adjust_pre_scale); + ufbxt_hash_quat(h, v->adjust_post_rotation); + ufbxt_hash_pod(h, v->visible); + ufbxt_hash_pod(h, v->is_root); + ufbxt_hash_pod(h, v->has_geometry_transform); + ufbxt_hash_pod(h, v->has_adjust_transform); + ufbxt_hash_pod(h, v->is_geometry_transform_helper); + ufbxt_hash_pod(h, v->node_depth); + ufbxt_hash_list(h, v->materials, ufbxt_hash_element_ref_imp); +} + +ufbxt_noinline static void ufbxt_hash_vertex_real_imp(ufbxt_hash *h, const ufbx_vertex_real *v) +{ + ufbxt_hash_pod(h, v->exists); + ufbxt_hash_list(h, v->values, ufbxt_hash_real_imp); + ufbxt_hash_list(h, v->indices, ufbxt_hash_pod_imp); + ufbxt_hash_size_t(h, v->value_reals); + ufbxt_hash_pod(h, v->unique_per_vertex); +} + +ufbxt_noinline static void ufbxt_hash_vertex_vec2_imp(ufbxt_hash *h, const ufbx_vertex_vec2 *v) +{ + ufbxt_hash_pod(h, v->exists); + ufbxt_hash_list(h, v->values, ufbxt_hash_vec2_imp); + ufbxt_hash_list(h, v->indices, ufbxt_hash_pod_imp); + ufbxt_hash_size_t(h, v->value_reals); + ufbxt_hash_pod(h, v->unique_per_vertex); +} + +ufbxt_noinline static void ufbxt_hash_vertex_vec3_imp(ufbxt_hash *h, const ufbx_vertex_vec3 *v) +{ + ufbxt_hash_pod(h, v->exists); + ufbxt_hash_list(h, v->values, ufbxt_hash_vec3_imp); + ufbxt_hash_list(h, v->indices, ufbxt_hash_pod_imp); + ufbxt_hash_size_t(h, v->value_reals); + ufbxt_hash_pod(h, v->unique_per_vertex); +} + +ufbxt_noinline static void ufbxt_hash_vertex_vec4_imp(ufbxt_hash *h, const ufbx_vertex_vec4 *v) +{ + ufbxt_hash_pod(h, v->exists); + ufbxt_hash_list(h, v->values, ufbxt_hash_vec4); + ufbxt_hash_list(h, v->indices, ufbxt_hash_pod); + ufbxt_hash_size_t(h, v->value_reals); + ufbxt_hash_pod(h, v->unique_per_vertex); +} + +#define ufbxt_hash_vertex_real(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_vertex_real_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_vertex_vec2(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_vertex_vec2_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_vertex_vec3(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_vertex_vec3_imp(h, v), ufbxt_pop_tag(h)) +#define ufbxt_hash_vertex_vec4(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_vertex_vec4_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_uv_set_imp(ufbxt_hash *h, const ufbx_uv_set *v) +{ + ufbxt_hash_string(h, v->name); + ufbxt_hash_pod(h, v->index); + ufbxt_hash_vertex_vec2(h, &v->vertex_uv); + ufbxt_hash_vertex_vec3(h, &v->vertex_tangent); + ufbxt_hash_vertex_vec3(h, &v->vertex_bitangent); +} + +ufbxt_noinline static void ufbxt_hash_color_set_imp(ufbxt_hash *h, const ufbx_color_set *v) +{ + ufbxt_hash_string(h, v->name); + ufbxt_hash_pod(h, v->index); + ufbxt_hash_vertex_vec4(h, &v->vertex_color); +} + +ufbxt_noinline static void ufbxt_hash_mesh_material_imp(ufbxt_hash *h, const ufbx_mesh_material *v) +{ + ufbxt_hash_element_ref(h, v->material); + ufbxt_hash_size_t(h, v->num_faces); + ufbxt_hash_size_t(h, v->num_triangles); + ufbxt_hash_size_t(h, v->num_empty_faces); + ufbxt_hash_size_t(h, v->num_point_faces); + ufbxt_hash_size_t(h, v->num_line_faces); + ufbxt_hash_list(h, v->face_indices, ufbxt_hash_pod_imp); +} + +ufbxt_noinline static void ufbxt_hash_face_group_imp(ufbxt_hash *h, const ufbx_face_group *v) +{ + ufbxt_hash_pod(h, v->id); + ufbxt_hash_string(h, v->name); + ufbxt_hash_size_t(h, v->num_faces); + ufbxt_hash_size_t(h, v->num_triangles); + ufbxt_hash_list(h, v->face_indices, ufbxt_hash_pod_imp); +} + +ufbxt_noinline static void ufbxt_hash_subdivision_weight_range_imp(ufbxt_hash *h, ufbx_subdivision_weight_range v) +{ + ufbxt_hash_pod(h, v.weight_begin); + ufbxt_hash_pod(h, v.num_weights); +} + +ufbxt_noinline static void ufbxt_hash_subdivision_weight_imp(ufbxt_hash *h, ufbx_subdivision_weight v) +{ + ufbxt_hash_real(h, v.weight); + ufbxt_hash_pod(h, v.index); +} + +ufbxt_noinline static void ufbxt_hash_subdivision_result_imp(ufbxt_hash *h, const ufbx_subdivision_result *v) +{ + ufbxt_hash_list(h, v->source_vertex_ranges, ufbxt_hash_subdivision_weight_range_imp); + ufbxt_hash_list(h, v->source_vertex_weights, ufbxt_hash_subdivision_weight_imp); + ufbxt_hash_list(h, v->skin_cluster_ranges, ufbxt_hash_subdivision_weight_range_imp); + ufbxt_hash_list(h, v->skin_cluster_weights, ufbxt_hash_subdivision_weight_imp); +} + +ufbxt_noinline static void ufbxt_hash_face_imp(ufbxt_hash *h, ufbx_face v) +{ + ufbxt_hash_pod(h, v.index_begin); + ufbxt_hash_pod(h, v.num_indices); +} + +ufbxt_noinline static void ufbxt_hash_edge_imp(ufbxt_hash *h, ufbx_edge v) +{ + ufbxt_hash_pod(h, v.a); + ufbxt_hash_pod(h, v.b); +} + +#define ufbxt_hash_subdivision_result(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_subdivision_result_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_mesh_imp(ufbxt_hash *h, const ufbx_mesh *v) +{ + ufbxt_hash_size_t(h, v->num_vertices); + ufbxt_hash_size_t(h, v->num_indices); + ufbxt_hash_size_t(h, v->num_faces); + ufbxt_hash_size_t(h, v->num_triangles); + ufbxt_hash_size_t(h, v->num_edges); + + ufbxt_hash_list(h, v->faces, ufbxt_hash_face_imp); + ufbxt_hash_list(h, v->face_smoothing, ufbxt_hash_pod_imp); + ufbxt_hash_list(h, v->face_material, ufbxt_hash_pod_imp); + ufbxt_hash_list(h, v->face_group, ufbxt_hash_pod_imp); + ufbxt_hash_list(h, v->face_hole, ufbxt_hash_pod_imp); + ufbxt_hash_size_t(h, v->max_face_triangles); + ufbxt_hash_size_t(h, v->num_empty_faces); + ufbxt_hash_size_t(h, v->num_point_faces); + ufbxt_hash_size_t(h, v->num_line_faces); + + ufbxt_hash_list(h, v->edges, ufbxt_hash_edge_imp); + ufbxt_hash_list(h, v->edge_smoothing, ufbxt_hash_pod_imp); + ufbxt_hash_list(h, v->edge_crease, ufbxt_hash_real_imp); + ufbxt_hash_list(h, v->edge_visibility, ufbxt_hash_pod_imp); + + ufbxt_hash_list(h, v->vertex_indices, ufbxt_hash_pod_imp); + ufbxt_hash_list(h, v->vertices, ufbxt_hash_vec3_imp); + ufbxt_hash_list(h, v->vertex_first_index, ufbxt_hash_pod_imp); + + ufbxt_hash_vertex_vec3(h, &v->vertex_position); + ufbxt_hash_vertex_vec3(h, &v->vertex_normal); + ufbxt_hash_vertex_vec2(h, &v->vertex_uv); + ufbxt_hash_vertex_vec3(h, &v->vertex_tangent); + ufbxt_hash_vertex_vec3(h, &v->vertex_bitangent); + ufbxt_hash_vertex_vec4(h, &v->vertex_color); + ufbxt_hash_vertex_real(h, &v->vertex_crease); + + ufbxt_hash_list_ptr(h, v->uv_sets, ufbxt_hash_uv_set_imp); + ufbxt_hash_list_ptr(h, v->color_sets, ufbxt_hash_color_set_imp); + + ufbxt_hash_list_ptr(h, v->materials, ufbxt_hash_mesh_material_imp); + ufbxt_hash_list_ptr(h, v->face_groups, ufbxt_hash_face_group_imp); + + ufbxt_hash_pod(h, v->skinned_is_local); + ufbxt_hash_vertex_vec3(h, &v->skinned_position); + ufbxt_hash_vertex_vec3(h, &v->skinned_normal); + + ufbxt_hash_list(h, v->skin_deformers, ufbxt_hash_element_ref_imp); + ufbxt_hash_list(h, v->blend_deformers, ufbxt_hash_element_ref_imp); + ufbxt_hash_list(h, v->cache_deformers, ufbxt_hash_element_ref_imp); + ufbxt_hash_list(h, v->all_deformers, ufbxt_hash_element_ref_imp); + + ufbxt_hash_pod(h, v->subdivision_preview_levels); + ufbxt_hash_pod(h, v->subdivision_render_levels); + ufbxt_hash_pod(h, v->subdivision_display_mode); + ufbxt_hash_pod(h, v->subdivision_boundary); + ufbxt_hash_pod(h, v->subdivision_uv_boundary); + + ufbxt_hash_pod(h, v->subdivision_evaluated); + if (v->subdivision_result) ufbxt_hash_subdivision_result(h, v->subdivision_result); + ufbxt_hash_pod(h, v->from_tessellated_nurbs); +} + +ufbxt_noinline static void ufbxt_hash_light_imp(ufbxt_hash *h, const ufbx_light *v) +{ + ufbxt_hash_vec3(h, v->color); + ufbxt_hash_real(h, v->intensity); + ufbxt_hash_vec3(h, v->local_direction); + ufbxt_hash_pod(h, v->type); + ufbxt_hash_pod(h, v->decay); + ufbxt_hash_pod(h, v->area_shape); + ufbxt_hash_real(h, v->inner_angle); + ufbxt_hash_real(h, v->outer_angle); + ufbxt_hash_pod(h, v->cast_light); + ufbxt_hash_pod(h, v->cast_shadows); +} + +ufbxt_noinline static void ufbxt_hash_camera_imp(ufbxt_hash *h, const ufbx_camera *v) +{ + ufbxt_hash_pod(h, v->resolution_is_pixels); + ufbxt_hash_vec2(h, v->resolution); + ufbxt_hash_vec2(h, v->field_of_view_deg); + ufbxt_hash_vec2(h, v->field_of_view_tan); + ufbxt_hash_pod(h, v->aspect_mode); + ufbxt_hash_pod(h, v->aperture_mode); + ufbxt_hash_pod(h, v->gate_fit); + ufbxt_hash_pod(h, v->aperture_format); + ufbxt_hash_real(h, v->focal_length_mm); + ufbxt_hash_vec2(h, v->film_size_inch); + ufbxt_hash_vec2(h, v->aperture_size_inch); + ufbxt_hash_real(h, v->squeeze_ratio); +} + +ufbxt_noinline static void ufbxt_hash_bone_imp(ufbxt_hash *h, const ufbx_bone *v) +{ + ufbxt_hash_real(h, v->radius); + ufbxt_hash_real(h, v->relative_length); + ufbxt_hash_pod(h, v->is_root); +} + +ufbxt_noinline static void ufbxt_hash_empty_imp(ufbxt_hash *h, const ufbx_empty *v) +{ +} + +ufbxt_noinline static void ufbxt_hash_nurbs_basis_imp(ufbxt_hash *h, const ufbx_nurbs_basis *v) +{ + ufbxt_hash_pod(h, v->order); + ufbxt_hash_pod(h, v->topology); + ufbxt_hash_list(h, v->knot_vector, ufbxt_hash_real_imp); + ufbxt_hash_real(h, v->t_min); + ufbxt_hash_real(h, v->t_max); + ufbxt_hash_list(h, v->spans, ufbxt_hash_real_imp); + ufbxt_hash_pod(h, v->is_2d); + ufbxt_hash_size_t(h, v->num_wrap_control_points); + ufbxt_hash_pod(h, v->valid); +} + +#define ufbxt_hash_nurbs_basis(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_nurbs_basis_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_line_segment_imp(ufbxt_hash *h, ufbx_line_segment v) +{ + ufbxt_hash_pod(h, v.index_begin); + ufbxt_hash_pod(h, v.num_indices); +} + +ufbxt_noinline static void ufbxt_hash_line_curve_imp(ufbxt_hash *h, const ufbx_line_curve *v) +{ + ufbxt_hash_vec3(h, v->color); + ufbxt_hash_list(h, v->control_points, ufbxt_hash_vec3_imp); + ufbxt_hash_list(h, v->point_indices, ufbxt_hash_pod_imp); + ufbxt_hash_list(h, v->segments, ufbxt_hash_line_segment_imp); + ufbxt_hash_pod(h, v->from_tessellated_nurbs); +} + +ufbxt_noinline static void ufbxt_hash_nurbs_curve_imp(ufbxt_hash *h, const ufbx_nurbs_curve *v) +{ + ufbxt_hash_nurbs_basis(h, &v->basis); + ufbxt_hash_list(h, v->control_points, ufbxt_hash_vec4_imp); +} + +ufbxt_noinline static void ufbxt_hash_nurbs_surface_imp(ufbxt_hash *h, const ufbx_nurbs_surface *v) +{ + ufbxt_hash_nurbs_basis(h, &v->basis_u); + ufbxt_hash_nurbs_basis(h, &v->basis_v); + ufbxt_hash_size_t(h, v->num_control_points_u); + ufbxt_hash_size_t(h, v->num_control_points_v); + ufbxt_hash_list(h, v->control_points, ufbxt_hash_vec4_imp); + ufbxt_hash_pod(h, v->span_subdivision_u); + ufbxt_hash_pod(h, v->span_subdivision_v); + ufbxt_hash_pod(h, v->flip_normals); + ufbxt_hash_element_ref(h, v->material); +} + +ufbxt_noinline static void ufbxt_hash_nurbs_trim_surface_imp(ufbxt_hash *h, const ufbx_nurbs_trim_surface *v) +{ +} + +ufbxt_noinline static void ufbxt_hash_nurbs_trim_boundary_imp(ufbxt_hash *h, const ufbx_nurbs_trim_boundary *v) +{ +} + +ufbxt_noinline static void ufbxt_hash_procedural_geometry_imp(ufbxt_hash *h, const ufbx_procedural_geometry *v) +{ +} + +ufbxt_noinline static void ufbxt_hash_stereo_camera_imp(ufbxt_hash *h, const ufbx_stereo_camera *v) +{ + ufbxt_hash_element_ref(h, v->left); + ufbxt_hash_element_ref(h, v->right); +} + +ufbxt_noinline static void ufbxt_hash_camera_switcher_imp(ufbxt_hash *h, const ufbx_camera_switcher *v) +{ +} + +ufbxt_noinline static void ufbxt_hash_marker_imp(ufbxt_hash *h, const ufbx_marker *v) +{ + ufbxt_hash_pod(h, v->type); +} + +ufbxt_noinline static void ufbxt_hash_lod_level_imp(ufbxt_hash *h, ufbx_lod_level v) +{ + ufbxt_hash_real(h, v.distance); + ufbxt_hash_pod(h, v.display); +} + +ufbxt_noinline static void ufbxt_hash_lod_group_imp(ufbxt_hash *h, const ufbx_lod_group *v) +{ + ufbxt_hash_pod(h, v->relative_distances); + ufbxt_hash_list(h, v->lod_levels, ufbxt_hash_lod_level_imp); + ufbxt_hash_pod(h, v->ignore_parent_transform); + ufbxt_hash_pod(h, v->use_distance_limit); + ufbxt_hash_real(h, v->distance_limit_min); + ufbxt_hash_real(h, v->distance_limit_max); +} + +ufbxt_noinline static void ufbxt_hash_skin_vertex_imp(ufbxt_hash *h, ufbx_skin_vertex v) +{ + ufbxt_hash_pod(h, v.weight_begin); + ufbxt_hash_pod(h, v.num_weights); + ufbxt_hash_real(h, v.dq_weight); +} + +ufbxt_noinline static void ufbxt_hash_skin_weight_imp(ufbxt_hash *h, ufbx_skin_weight v) +{ + ufbxt_hash_pod(h, v.cluster_index); + ufbxt_hash_real(h, v.weight); +} + +ufbxt_noinline static void ufbxt_hash_skin_deformer_imp(ufbxt_hash *h, const ufbx_skin_deformer *v) +{ + ufbxt_hash_pod(h, v->skinning_method); + ufbxt_hash_list(h, v->clusters, ufbxt_hash_element_ref_imp); + ufbxt_hash_list(h, v->vertices, ufbxt_hash_skin_vertex_imp); + ufbxt_hash_list(h, v->weights, ufbxt_hash_skin_weight_imp); + ufbxt_hash_size_t(h, v->max_weights_per_vertex); + ufbxt_hash_size_t(h, v->num_dq_weights); + ufbxt_hash_list(h, v->dq_vertices, ufbxt_hash_pod_imp); + ufbxt_hash_list(h, v->dq_weights, ufbxt_hash_real_imp); +} + +ufbxt_noinline static void ufbxt_hash_skin_cluster_imp(ufbxt_hash *h, const ufbx_skin_cluster *v) +{ + ufbxt_hash_element_ref(h, v->bone_node); + ufbxt_hash_matrix(h, v->geometry_to_bone); + ufbxt_hash_matrix(h, v->mesh_node_to_bone); + ufbxt_hash_matrix(h, v->bind_to_world); + ufbxt_hash_matrix(h, v->geometry_to_world); + ufbxt_hash_transform(h, v->geometry_to_world_transform); + ufbxt_hash_size_t(h, v->num_weights); + ufbxt_hash_list(h, v->vertices, ufbxt_hash_pod_imp); + ufbxt_hash_list(h, v->weights, ufbxt_hash_real_imp); +} + +ufbxt_noinline static void ufbxt_hash_blend_deformer_imp(ufbxt_hash *h, const ufbx_blend_deformer *v) +{ + ufbxt_hash_list(h, v->channels, ufbxt_hash_element_ref_imp); +} + +ufbxt_noinline static void ufbxt_hash_blend_keyframe_imp(ufbxt_hash *h, const ufbx_blend_keyframe *v) +{ + ufbxt_hash_element_ref(h, v->shape); + ufbxt_hash_real(h, v->target_weight); + ufbxt_hash_real(h, v->effective_weight); +} + +ufbxt_noinline static void ufbxt_hash_blend_channel_imp(ufbxt_hash *h, const ufbx_blend_channel *v) +{ + ufbxt_hash_real(h, v->weight); + ufbxt_hash_list_ptr(h, v->keyframes, ufbxt_hash_blend_keyframe_imp); +} + +ufbxt_noinline static void ufbxt_hash_blend_shape_imp(ufbxt_hash *h, const ufbx_blend_shape *v) +{ + ufbxt_hash_size_t(h, v->num_offsets); + ufbxt_hash_list(h, v->offset_vertices, ufbxt_hash_pod_imp); + ufbxt_hash_list(h, v->position_offsets, ufbxt_hash_vec3_imp); + ufbxt_hash_list(h, v->normal_offsets, ufbxt_hash_vec3_imp); +} + +ufbxt_noinline static void ufbxt_hash_cache_frame_imp(ufbxt_hash *h, const ufbx_cache_frame *v) +{ + ufbxt_hash_string(h, v->channel); + ufbxt_hash_double(h, v->time); + ufbxt_hash_pod(h, v->file_format); + ufbxt_hash_pod(h, v->data_format); + ufbxt_hash_pod(h, v->data_encoding); + ufbxt_hash_pod(h, v->data_offset); + ufbxt_hash_pod(h, v->data_count); + ufbxt_hash_pod(h, v->data_element_bytes); + ufbxt_hash_pod(h, v->data_total_bytes); +} + +ufbxt_noinline static void ufbxt_hash_cache_channel_imp(ufbxt_hash *h, const ufbx_cache_channel *v) +{ + ufbxt_hash_string(h, v->name); + ufbxt_hash_pod(h, v->interpretation); + ufbxt_hash_string(h, v->interpretation_name); + ufbxt_hash_list_ptr(h, v->frames, ufbxt_hash_cache_frame_imp); +} + +ufbxt_noinline static void ufbxt_hash_geometry_cache_imp(ufbxt_hash *h, const ufbx_geometry_cache *v) +{ + ufbxt_hash_list_ptr(h, v->channels, ufbxt_hash_cache_channel_imp); + ufbxt_hash_list_ptr(h, v->frames, ufbxt_hash_cache_frame_imp); + ufbxt_hash_list(h, v->extra_info, ufbxt_hash_string_imp); +} + +#define ufbxt_hash_geometry_cache(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_geometry_cache_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_cache_deformer_imp(ufbxt_hash *h, const ufbx_cache_deformer *v) +{ + ufbxt_hash_string(h, v->channel); + ufbxt_hash_element_ref(h, v->file); +} + +ufbxt_noinline static void ufbxt_hash_cache_file_imp(ufbxt_hash *h, const ufbx_cache_file *v) +{ + ufbxt_hash_string(h, v->absolute_filename); + ufbxt_hash_string(h, v->relative_filename); + ufbxt_hash_blob(h, v->raw_absolute_filename); + ufbxt_hash_blob(h, v->raw_relative_filename); + + if (v->external_cache) ufbxt_hash_geometry_cache(h, v->external_cache); +} + +ufbxt_noinline static void ufbxt_hash_material_map_imp(ufbxt_hash *h, const ufbx_material_map *v) +{ + ufbxt_hash_vec4(h, v->value_vec4); + ufbxt_hash_pod(h, v->value_int); + ufbxt_hash_element_ref(h, v->texture); + ufbxt_hash_pod(h, v->has_value); + ufbxt_hash_pod(h, v->texture_enabled); + ufbxt_hash_pod(h, v->value_components); +} + +ufbxt_noinline static void ufbxt_hash_material_feature_imp(ufbxt_hash *h, const ufbx_material_feature_info *v) +{ + ufbxt_hash_pod(h, v->enabled); + ufbxt_hash_pod(h, v->is_explicit); +} + +ufbxt_noinline static void ufbxt_hash_material_texture_imp(ufbxt_hash *h, const ufbx_material_texture *v) +{ + ufbxt_hash_string(h, v->material_prop); + ufbxt_hash_string(h, v->shader_prop); + ufbxt_hash_element_ref(h, v->texture); +} + +ufbxt_noinline static void ufbxt_hash_material_imp(ufbxt_hash *h, const ufbx_material *v) +{ + ufbxt_push_tag(h, "fbx"); + for (size_t i = 0; i < UFBX_MATERIAL_FBX_MAP_COUNT; i++) { + ufbxt_push_tag_index(h, i); + ufbxt_hash_material_map_imp(h, &v->fbx.maps[i]); + ufbxt_pop_tag(h); + } + ufbxt_pop_tag(h); + + ufbxt_push_tag(h, "pbr"); + for (size_t i = 0; i < UFBX_MATERIAL_PBR_MAP_COUNT; i++) { + ufbxt_push_tag_index(h, i); + ufbxt_hash_material_map_imp(h, &v->pbr.maps[i]); + ufbxt_pop_tag(h); + } + ufbxt_pop_tag(h); + + ufbxt_push_tag(h, "features"); + for (size_t i = 0; i < UFBX_MATERIAL_FEATURE_COUNT; i++) { + ufbxt_push_tag_index(h, i); + ufbxt_hash_material_feature_imp(h, &v->features.features[i]); + ufbxt_pop_tag(h); + } + ufbxt_pop_tag(h); + + ufbxt_hash_pod(h, v->shader_type); + ufbxt_hash_element_ref(h, v->shader); + ufbxt_hash_string(h, v->shading_model_name); + + ufbxt_hash_string(h, v->shader_prop_prefix); + ufbxt_hash_list_ptr(h, v->textures, ufbxt_hash_material_texture_imp); +} + +ufbxt_noinline static void ufbxt_hash_texture_layer_imp(ufbxt_hash *h, const ufbx_texture_layer v) +{ + ufbxt_hash_element_ref(h, v.texture); + ufbxt_hash_pod(h, v.blend_mode); + ufbxt_hash_real(h, v.alpha); +} + +ufbxt_noinline static void ufbxt_hash_shader_texture_input_imp(ufbxt_hash *h, const ufbx_shader_texture_input *v) +{ + ufbxt_hash_string(h, v->name); + ufbxt_hash_vec4(h, v->value_vec4); + ufbxt_hash_pod(h, v->value_int); + ufbxt_hash_string(h, v->value_str); + ufbxt_hash_blob(h, v->value_blob); + ufbxt_hash_element_ref(h, v->texture); + ufbxt_hash_pod(h, v->texture_enabled); + ufbxt_hash_prop_ref(h, v->prop); + ufbxt_hash_prop_ref(h, v->texture_prop); + ufbxt_hash_prop_ref(h, v->texture_enabled_prop); +} + +ufbxt_noinline static void ufbxt_hash_shader_texture_imp(ufbxt_hash *h, const ufbx_shader_texture *v) +{ + ufbxt_hash_pod(h, v->type); + ufbxt_hash_string(h, v->shader_name); + ufbxt_hash_pod(h, v->shader_type_id); + ufbxt_hash_list_ptr(h, v->inputs, ufbxt_hash_shader_texture_input_imp); + ufbxt_hash_string(h, v->shader_source); + ufbxt_hash_blob(h, v->raw_shader_source); + ufbxt_hash_element_ref(h, v->main_texture); + ufbxt_hash_pod(h, v->main_texture_output_index); + ufbxt_hash_string(h, v->prop_prefix); +} + +#define ufbxt_hash_shader_texture(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_shader_texture_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_texture_imp(ufbxt_hash *h, const ufbx_texture *v) +{ + ufbxt_hash_pod(h, v->type); + + ufbxt_hash_string(h, v->absolute_filename); + ufbxt_hash_string(h, v->relative_filename); + ufbxt_hash_blob(h, v->raw_absolute_filename); + ufbxt_hash_blob(h, v->raw_relative_filename); + + ufbxt_hash_blob(h, v->content); + ufbxt_hash_element_ref(h, v->video); + + ufbxt_hash_pod(h, v->file_index); + ufbxt_hash_pod(h, v->has_file); + + ufbxt_hash_list(h, v->layers, ufbxt_hash_texture_layer_imp); + + ufbxt_hash_string(h, v->uv_set); + ufbxt_hash_pod(h, v->wrap_u); + ufbxt_hash_pod(h, v->wrap_v); + ufbxt_hash_pod(h, v->has_uv_transform); + ufbxt_hash_transform(h, v->uv_transform); + ufbxt_hash_matrix(h, v->texture_to_uv); + ufbxt_hash_matrix(h, v->uv_to_texture); + + ufbxt_hash_list(h, v->file_textures, ufbxt_hash_element_ref_imp); + + if (v->shader) { + ufbxt_hash_shader_texture(h, v->shader); + } +} + +ufbxt_noinline static void ufbxt_hash_video_imp(ufbxt_hash *h, const ufbx_video *v) +{ + ufbxt_hash_string(h, v->absolute_filename); + ufbxt_hash_string(h, v->relative_filename); + ufbxt_hash_blob(h, v->raw_absolute_filename); + ufbxt_hash_blob(h, v->raw_relative_filename); + + ufbxt_hash_blob(h, v->content); +} + +ufbxt_noinline static void ufbxt_hash_shader_imp(ufbxt_hash *h, const ufbx_shader *v) +{ + ufbxt_hash_pod(h, v->type); + ufbxt_hash_list(h, v->bindings, ufbxt_hash_element_ref_imp); +} + +ufbxt_noinline static void ufbxt_hash_shader_prop_binding_imp(ufbxt_hash *h, ufbx_shader_prop_binding v) +{ + ufbxt_hash_string(h, v.shader_prop); + ufbxt_hash_string(h, v.material_prop); +} + +ufbxt_noinline static void ufbxt_hash_shader_binding_imp(ufbxt_hash *h, const ufbx_shader_binding *v) +{ + ufbxt_hash_list(h, v->prop_bindings, ufbxt_hash_shader_prop_binding_imp); +} + +ufbxt_noinline static void ufbxt_hash_anim_layer_desc_imp(ufbxt_hash *h, ufbx_anim_layer_desc v) +{ + ufbxt_hash_element_ref(h, v.layer); + ufbxt_hash_real(h, v.weight); +} + +ufbxt_noinline static void ufbxt_hash_anim_imp(ufbxt_hash *h, const ufbx_anim *v) +{ + ufbxt_hash_list(h, v->layers, ufbxt_hash_anim_layer_desc_imp); + ufbxt_hash_pod(h, v->ignore_connections); + ufbxt_hash_double(h, v->time_begin); + ufbxt_hash_double(h, v->time_end); +} + +#define ufbxt_hash_anim(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_anim_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_anim_stack_imp(ufbxt_hash *h, const ufbx_anim_stack *v) +{ + ufbxt_hash_double(h, v->time_begin); + ufbxt_hash_double(h, v->time_end); + + ufbxt_hash_list(h, v->layers, ufbxt_hash_element_ref_imp); + ufbxt_hash_anim(h, &v->anim); +} + +ufbxt_noinline static void ufbxt_hash_anim_prop_imp(ufbxt_hash *h, const ufbx_anim_prop *v) +{ + ufbxt_hash_element_ref(h, v->element); + ufbxt_hash_pod(h, v->_internal_key); + ufbxt_hash_string(h, v->prop_name); + ufbxt_hash_element_ref(h, v->anim_value); +} + +ufbxt_noinline static void ufbxt_hash_anim_layer_imp(ufbxt_hash *h, const ufbx_anim_layer *v) +{ + ufbxt_hash_real(h, v->weight); + ufbxt_hash_pod(h, v->weight_is_animated); + ufbxt_hash_pod(h, v->blended); + ufbxt_hash_pod(h, v->additive); + ufbxt_hash_pod(h, v->compose_rotation); + ufbxt_hash_pod(h, v->compose_scale); + + ufbxt_hash_list(h, v->anim_values, ufbxt_hash_element_ref_imp); + ufbxt_hash_list_ptr(h, v->anim_props, ufbxt_hash_anim_prop_imp); + + ufbxt_hash_anim(h, &v->anim); + + ufbxt_hash_pod(h, v->_min_element_id); + ufbxt_hash_pod(h, v->_max_element_id); + ufbxt_hash_pod(h, v->_element_id_bitmask[0]); + ufbxt_hash_pod(h, v->_element_id_bitmask[1]); + ufbxt_hash_pod(h, v->_element_id_bitmask[2]); + ufbxt_hash_pod(h, v->_element_id_bitmask[3]); +} + +ufbxt_noinline static void ufbxt_hash_anim_value_imp(ufbxt_hash *h, const ufbx_anim_value *v) +{ + ufbxt_hash_vec3(h, v->default_value); + ufbxt_hash_array(h, v->curves, ufbxt_hash_element_ref_imp); +} + +ufbxt_noinline static void ufbxt_hash_tangent_imp(ufbxt_hash *h, ufbx_tangent v) +{ + ufbxt_hash_float(h, v.dx); + ufbxt_hash_float(h, v.dy); +} + +#define ufbxt_hash_tangent(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_tangent_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_keyframe_imp(ufbxt_hash *h, const ufbx_keyframe *v) +{ + ufbxt_hash_double(h, v->time); + ufbxt_hash_real(h, v->value); + ufbxt_hash_pod(h, v->interpolation); + ufbxt_hash_tangent(h, v->left); + ufbxt_hash_tangent(h, v->right); +} + +ufbxt_noinline static void ufbxt_hash_anim_curve_imp(ufbxt_hash *h, const ufbx_anim_curve *v) +{ + ufbxt_hash_list_ptr(h, v->keyframes, ufbxt_hash_keyframe_imp); +} + +ufbxt_noinline static void ufbxt_hash_display_layer_imp(ufbxt_hash *h, const ufbx_display_layer *v) +{ + ufbxt_hash_list(h, v->nodes, ufbxt_hash_element_ref_imp); + ufbxt_hash_pod(h, v->visible); + ufbxt_hash_pod(h, v->frozen); + ufbxt_hash_vec3(h, v->ui_color); +} + +ufbxt_noinline static void ufbxt_hash_selection_set_imp(ufbxt_hash *h, const ufbx_selection_set *v) +{ + ufbxt_hash_list(h, v->nodes, ufbxt_hash_element_ref_imp); +} + +ufbxt_noinline static void ufbxt_hash_selection_node_imp(ufbxt_hash *h, const ufbx_selection_node *v) +{ + ufbxt_hash_element_ref(h, v->target_node); + ufbxt_hash_element_ref(h, v->target_mesh); + ufbxt_hash_pod(h, v->include_node); + + ufbxt_hash_list(h, v->vertices, ufbxt_hash_pod_imp); + ufbxt_hash_list(h, v->edges, ufbxt_hash_pod_imp); + ufbxt_hash_list(h, v->faces, ufbxt_hash_pod_imp); +} + +ufbxt_noinline static void ufbxt_hash_character_imp(ufbxt_hash *h, const ufbx_character *v) +{ +} + +ufbxt_noinline static void ufbxt_hash_constraint_target_imp(ufbxt_hash *h, const ufbx_constraint_target *v) +{ + ufbxt_hash_element_ref(h, v->node); + ufbxt_hash_real(h, v->weight); + ufbxt_hash_transform(h, v->transform); +} + +ufbxt_noinline static void ufbxt_hash_constraint_imp(ufbxt_hash *h, const ufbx_constraint *v) +{ + ufbxt_hash_pod(h, v->type); + ufbxt_hash_string(h, v->type_name); + ufbxt_hash_element_ref(h, v->node); + ufbxt_hash_list_ptr(h, v->targets, ufbxt_hash_constraint_target_imp); + ufbxt_hash_real(h, v->weight); + ufbxt_hash_pod(h, v->active); + + ufbxt_hash_array(h, v->constrain_translation, ufbxt_hash_pod_imp); + ufbxt_hash_array(h, v->constrain_rotation, ufbxt_hash_pod_imp); + ufbxt_hash_array(h, v->constrain_scale, ufbxt_hash_pod_imp); + + ufbxt_hash_transform(h, v->transform_offset); + + ufbxt_hash_vec3(h, v->aim_vector); + ufbxt_hash_pod(h, v->aim_up_type); + ufbxt_hash_element_ref(h, v->aim_up_node); + ufbxt_hash_vec3(h, v->aim_up_vector); + + ufbxt_hash_element_ref(h, v->ik_effector); + ufbxt_hash_element_ref(h, v->ik_end_node); + ufbxt_hash_vec3(h, v->ik_pole_vector); +} + +ufbxt_noinline static void ufbxt_hash_bone_pose_imp(ufbxt_hash *h, const ufbx_bone_pose *v) +{ + ufbxt_hash_element_ref(h, v->bone_node); + ufbxt_hash_matrix(h, v->bone_to_world); +} + +ufbxt_noinline static void ufbxt_hash_pose_imp(ufbxt_hash *h, const ufbx_pose *v) +{ + ufbxt_hash_pod(h, v->bind_pose); + ufbxt_hash_list_ptr(h, v->bone_poses, ufbxt_hash_bone_pose_imp); +} + +ufbxt_noinline static void ufbxt_hash_metadata_object_imp(ufbxt_hash *h, const ufbx_metadata_object *v) +{ +} + +ufbxt_noinline static void ufbxt_hash_texture_file_imp(ufbxt_hash *h, const ufbx_texture_file *v) +{ + ufbxt_hash_pod(h, v->index); + ufbxt_hash_string(h, v->absolute_filename); + ufbxt_hash_string(h, v->relative_filename); + ufbxt_hash_blob(h, v->raw_absolute_filename); + ufbxt_hash_blob(h, v->raw_relative_filename); + ufbxt_hash_blob(h, v->content); +} + +ufbxt_noinline static void ufbxt_hash_name_element_imp(ufbxt_hash *h, const ufbx_name_element *v) +{ + ufbxt_hash_string(h, v->name); + ufbxt_hash_pod(h, v->type); + ufbxt_hash_pod(h, v->_internal_key); + ufbxt_hash_element_ref(h, v->element); +} + +ufbxt_noinline static void ufbxt_hash_application_imp(ufbxt_hash *h, const ufbx_application *v) +{ + ufbxt_hash_string(h, v->vendor); + ufbxt_hash_string(h, v->name); + ufbxt_hash_string(h, v->version); +} + +#define ufbxt_hash_application(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_application_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_warning_imp(ufbxt_hash *h, const ufbx_warning *v) +{ + ufbxt_hash_pod(h, v->type); + ufbxt_hash_size_t(h, v->count); + // `v->description` omitted as it contains path-specific string +} + +ufbxt_noinline static void ufbxt_hash_metadata_imp(ufbxt_hash *h, const ufbx_metadata *v) +{ + ufbxt_hash_pod(h, v->ascii); + ufbxt_hash_pod(h, v->version); + ufbxt_hash_string(h, v->creator); + ufbxt_hash_pod(h, v->is_unsafe); + ufbxt_hash_pod(h, v->big_endian); + ufbxt_hash_pod(h, v->exporter); + ufbxt_hash_pod(h, v->exporter_version); + ufbxt_hash_props(h, &v->scene_props); + ufbxt_hash_application(h, &v->original_application); + ufbxt_hash_application(h, &v->latest_application); + ufbxt_hash_list_ptr(h, v->warnings, ufbxt_hash_warning_imp); +} + +#define ufbxt_hash_metadata(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_metadata_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_coordinate_axes_imp(ufbxt_hash *h, ufbx_coordinate_axes v) +{ + ufbxt_hash_pod(h, v.right); + ufbxt_hash_pod(h, v.up); + ufbxt_hash_pod(h, v.front); +} + +#define ufbxt_hash_coordinate_axes(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_coordinate_axes_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_scene_settings_imp(ufbxt_hash *h, const ufbx_scene_settings *v) +{ + ufbxt_hash_props(h, &v->props); + ufbxt_hash_coordinate_axes(h, v->axes); + ufbxt_hash_real(h, v->unit_meters); + ufbxt_hash_double(h, v->frames_per_second); + ufbxt_hash_vec3(h, v->ambient_color); + ufbxt_hash_pod(h, v->time_mode); + ufbxt_hash_pod(h, v->time_protocol); + ufbxt_hash_pod(h, v->snap_mode); + ufbxt_hash_pod(h, v->original_axis_up); + ufbxt_hash_pod(h, v->original_unit_meters); +} + +#define ufbxt_hash_scene_settings(h, v) (ufbxt_push_tag(h, #v), ufbxt_hash_scene_settings_imp(h, v), ufbxt_pop_tag(h)) + +ufbxt_noinline static void ufbxt_hash_scene_imp(ufbxt_hash *h, const ufbx_scene *v) +{ + ufbxt_hash_metadata(h, &v->metadata); + ufbxt_hash_scene_settings(h, &v->settings); + ufbxt_hash_element_ref(h, v->root_node); + ufbxt_hash_anim(h, &v->anim); + ufbxt_hash_anim(h, &v->combined_anim); + + ufbxt_hash_list(h, v->elements, ufbxt_hash_element_imp); + + ufbxt_hash_list(h, v->unknowns, ufbxt_hash_unknown_imp); + ufbxt_hash_list(h, v->nodes, ufbxt_hash_node_imp); + ufbxt_hash_list(h, v->meshes, ufbxt_hash_mesh_imp); + ufbxt_hash_list(h, v->lights, ufbxt_hash_light_imp); + ufbxt_hash_list(h, v->cameras, ufbxt_hash_camera_imp); + ufbxt_hash_list(h, v->bones, ufbxt_hash_bone_imp); + ufbxt_hash_list(h, v->empties, ufbxt_hash_empty_imp); + ufbxt_hash_list(h, v->line_curves, ufbxt_hash_line_curve_imp); + ufbxt_hash_list(h, v->nurbs_curves, ufbxt_hash_nurbs_curve_imp); + ufbxt_hash_list(h, v->nurbs_surfaces, ufbxt_hash_nurbs_surface_imp); + ufbxt_hash_list(h, v->nurbs_trim_surfaces, ufbxt_hash_nurbs_trim_surface_imp); + ufbxt_hash_list(h, v->nurbs_trim_boundaries, ufbxt_hash_nurbs_trim_boundary_imp); + ufbxt_hash_list(h, v->procedural_geometries, ufbxt_hash_procedural_geometry_imp); + ufbxt_hash_list(h, v->stereo_cameras, ufbxt_hash_stereo_camera_imp); + ufbxt_hash_list(h, v->camera_switchers, ufbxt_hash_camera_switcher_imp); + ufbxt_hash_list(h, v->markers, ufbxt_hash_marker_imp); + ufbxt_hash_list(h, v->lod_groups, ufbxt_hash_lod_group_imp); + ufbxt_hash_list(h, v->skin_deformers, ufbxt_hash_skin_deformer_imp); + ufbxt_hash_list(h, v->skin_clusters, ufbxt_hash_skin_cluster_imp); + ufbxt_hash_list(h, v->blend_deformers, ufbxt_hash_blend_deformer_imp); + ufbxt_hash_list(h, v->blend_channels, ufbxt_hash_blend_channel_imp); + ufbxt_hash_list(h, v->blend_shapes, ufbxt_hash_blend_shape_imp); + ufbxt_hash_list(h, v->cache_deformers, ufbxt_hash_cache_deformer_imp); + ufbxt_hash_list(h, v->cache_files, ufbxt_hash_cache_file_imp); + ufbxt_hash_list(h, v->materials, ufbxt_hash_material_imp); + ufbxt_hash_list(h, v->textures, ufbxt_hash_texture_imp); + ufbxt_hash_list(h, v->videos, ufbxt_hash_video_imp); + ufbxt_hash_list(h, v->shaders, ufbxt_hash_shader_imp); + ufbxt_hash_list(h, v->shader_bindings, ufbxt_hash_shader_binding_imp); + ufbxt_hash_list(h, v->anim_stacks, ufbxt_hash_anim_stack_imp); + ufbxt_hash_list(h, v->anim_layers, ufbxt_hash_anim_layer_imp); + ufbxt_hash_list(h, v->anim_values, ufbxt_hash_anim_value_imp); + ufbxt_hash_list(h, v->anim_curves, ufbxt_hash_anim_curve_imp); + ufbxt_hash_list(h, v->display_layers, ufbxt_hash_display_layer_imp); + ufbxt_hash_list(h, v->selection_sets, ufbxt_hash_selection_set_imp); + ufbxt_hash_list(h, v->selection_nodes, ufbxt_hash_selection_node_imp); + ufbxt_hash_list(h, v->characters, ufbxt_hash_character_imp); + ufbxt_hash_list(h, v->constraints, ufbxt_hash_constraint_imp); + ufbxt_hash_list(h, v->poses, ufbxt_hash_pose_imp); + ufbxt_hash_list(h, v->metadata_objects, ufbxt_hash_metadata_object_imp); + + ufbxt_hash_list_ptr(h, v->texture_files, ufbxt_hash_texture_file_imp); + + ufbxt_hash_list(h, v->connections_src, ufbxt_hash_connection_imp); + ufbxt_hash_list(h, v->connections_dst, ufbxt_hash_connection_imp); + ufbxt_hash_list_ptr(h, v->elements_by_name, ufbxt_hash_name_element_imp); + + if (v->dom_root) ufbxt_hash_dom_node(h, v->dom_root); +} + +ufbxt_noinline static uint64_t ufbxt_hash_scene(const ufbx_scene *v, FILE *dump_file) +{ + ufbxt_hash h; + ufbxt_hash_init(&h, dump_file); + ufbxt_hash_scene_imp(&h, v); + return ufbxt_hash_finish(&h); +} + +#endif diff --git a/modules/ufbx/test/objfuzz.cpp b/modules/ufbx/test/objfuzz.cpp new file mode 100644 index 0000000..7dfee15 --- /dev/null +++ b/modules/ufbx/test/objfuzz.cpp @@ -0,0 +1,349 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include + +bool g_verbose = false; + +static void ufbxt_assert_fail_imp(const char *func, const char *file, size_t line, const char *msg) +{ + fprintf(stderr, "%s:%zu: %s(%s) failed\n", file, line, func, msg); + exit(2); +} + +#define ufbxt_assert_fail(file, line, msg) ufbxt_assert_fail_imp("ufbxt_assert_fail", file, line, msg) +#define ufbxt_assert(m_cond) do { if (!(m_cond)) ufbxt_assert_fail_imp("ufbxt_assert", __FILE__, __LINE__, #m_cond); } while (0) + +#include +#include +#include + +#include "../ufbx.h" +#include "check_scene.h" + +#define arraycount(arr) ((sizeof(arr))/(sizeof(*(arr)))) + +const char *interesting_tokens[] = { + "", + " ", + "/", + "0", + "1.0", + ".0", + ".", + "1e64", + "-1", + "-1000", + "1000", + "#", + "-", + "-x", + "\n", + "\\", + "\\\n", +}; + +// No need to duplicate `interesting_tokens[]` +const char *interesting_leading_tokens[] = { + "v", + "vn", + "vt", + "f", + "l", + "p", + "g", + "o", + "usemtl", + "newmtl", + "mtllib", + "Kd", + "map_Kd", +}; + +const char *interesting_lines[] = { + "g Objfuzz", + "usemtl Objfuzz", + "newmtl Objfuzz", + "mttlib objfuzz.mtl", + "v 1 2 3", + "vt 1 2", + "vn 1 2 3", + "f 1 2 3", + "f 1/1 2/2 3/3", + "f 1//1 2//2 3//3", + "f 1/1/1 2/2/2 3/3/3", + "map_Kd base.png", +}; + + +bool mutate_insert_token(std::vector &tokens, uint32_t token, uint32_t index) +{ + if (index >= arraycount(interesting_tokens)) return false; + tokens.insert(tokens.begin() + token, interesting_tokens[index]); + return true; +} + +bool mutate_replace_token(std::vector &tokens, uint32_t token, uint32_t index) +{ + if (index >= arraycount(interesting_tokens)) return false; + tokens[token] = interesting_tokens[index]; + return true; +} + +bool mutate_duplicate_token(std::vector &tokens, uint32_t token, uint32_t index) +{ + if (index > 0) return false; + std::string tok = tokens[token]; + tokens.insert(tokens.begin() + token, tok); + return true; +} + +bool mutate_remove_token(std::vector &tokens, uint32_t token, uint32_t index) +{ + if (index > 0) return false; + tokens.erase(tokens.begin() + token); + return true; +} + +bool mutate_replace_first_token(std::vector &tokens, uint32_t token, uint32_t index) +{ + if (token > 0) return false; + if (index >= arraycount(interesting_leading_tokens)) return false; + tokens[0] = interesting_leading_tokens[index]; + return true; +} + +bool mutate_insert_first_token(std::vector &tokens, uint32_t token, uint32_t index) +{ + if (token > 0) return false; + if (index >= arraycount(interesting_leading_tokens)) return false; + tokens.insert(tokens.begin(), interesting_leading_tokens[index]); + return true; +} + +bool mutate_remove_line(std::vector &tokens, uint32_t token, uint32_t index) +{ + if (token > 0 || index > 0) return false; + tokens.clear(); + return true; +} + +bool mutate_insert_line(std::vector &tokens, uint32_t token, uint32_t index) +{ + if (token > 0) return false; + if (index >= arraycount(interesting_lines)) return false; + tokens.push_back(interesting_lines[index]); + return true; +} + +bool mutate_replace_line(std::vector &tokens, uint32_t token, uint32_t index) +{ + if (token > 0) return false; + if (index >= arraycount(interesting_lines)) return false; + tokens.clear(); + tokens.push_back(interesting_lines[index]); + return true; +} + +bool mutate_duplicate_line(std::vector &tokens, uint32_t token, uint32_t index) +{ + if (token > 0 || index > 0) return false; + auto copy = tokens; + tokens.insert(tokens.end(), copy.begin(), copy.end()); + return true; +} + +enum class token_category { + initial, + slash, + comment, + whitespace, + newline, + other, + end, +}; + +token_category categorize_char(char c) +{ + switch (c) { + case '/': + return token_category::slash; + case '#': + return token_category::comment; + case ' ': + case '\t': + return token_category::whitespace; + case '\r': + case '\n': + return token_category::newline; + default: + return token_category::other; + } +} + +std::vector tokenize_line(const std::string &line) +{ + std::vector result; + + size_t len = line.length(); + + size_t prev_begin = 0; + token_category prev_cat = token_category::initial; + + for (size_t i = 0; i <= len; i++) { + token_category cat = i < len ? categorize_char(line[i]) : token_category::end; + if (cat != prev_cat) { + if (prev_begin < i) { + result.push_back(line.substr(prev_begin, i - prev_begin)); + } + + prev_begin = i; + prev_cat = cat; + } + } + + return result; +} + +using mutate_fn = bool(std::vector &tokens, uint32_t token, uint32_t index); + +struct mutator +{ + const char *name; + mutate_fn *fn; +}; + +static const mutator mutators[] = { + { "insert token", &mutate_insert_token }, + { "replace token", &mutate_replace_token }, + { "duplicate token", &mutate_duplicate_token }, + { "remove token", &mutate_remove_token }, + { "replace first token", &mutate_replace_first_token }, + { "insert first token", &mutate_insert_first_token }, + { "remove line", &mutate_remove_line }, + { "insert line", &mutate_insert_line }, + { "replace line", &mutate_replace_line }, + { "duplicate line", &mutate_duplicate_line }, +}; + +std::vector read_file(const char *path) +{ + FILE *f = fopen(path, "rb"); + fseek(f, 0, SEEK_END); + std::vector data; + data.resize(ftell(f)); + fseek(f, 0, SEEK_SET); + fread(data.data(), 1, data.size(), f); + fclose(f); + return data; +} + +std::vector split_lines(const char *data, size_t length) +{ + std::vector lines; + size_t line_begin = 0; + for (size_t i = 0; i <= length; i++) { + char c = i < length ? data[i] : '\0'; + if (c == '\n' || c == '\0') { + size_t inclusive = c == '\n' ? 1 : 0; + lines.emplace_back(data + line_begin, i - line_begin + inclusive); + line_begin = i + 1; + } + } + return lines; +} + +std::string concatenate(const std::string *parts, size_t count) +{ + std::string result; + for (size_t i = 0; i < count; i++) { + result += parts[i]; + } + return result; +} + +void process_file(const char *input_file, ufbx_file_format file_format) +{ + std::vector data = read_file(input_file); + std::vector lines = split_lines(data.data(), data.size()); + int current_step = 0; + + // Add dummy line to end for mutators + lines.emplace_back(); + + for (uint32_t line = 0; line < lines.size(); line++) { + std::vector tokens = tokenize_line(lines[line]); + + // Add dummy token to end for mutators + tokens.emplace_back(); + + for (uint32_t mut = 0; mut < arraycount(mutators); mut++) { + bool done = false; + for (uint32_t token = 0; !done && token < tokens.size(); token++) { + for (uint32_t index = 0; index < tokens.size(); index++) { + std::vector copy = tokens; + bool ok = mutators[mut].fn(copy, token, index); + if (!ok) { + done = index == 0; + break; + } + + std::string parts[] = { + concatenate(lines.data(), line), + concatenate(copy.data(), copy.size()), + concatenate(lines.data() + line + 1, lines.size() - (line + 1)), + }; + std::string file = concatenate(parts, arraycount(parts)); + + if (g_verbose) { + printf("%d: line %u token %u: %s %u: ", current_step, line, token, mutators[mut].name, index); + } + + ufbx_load_opts opts = { }; + opts.file_format = file_format; + + ufbx_error error; + ufbx_scene *scene = ufbx_load_memory(file.data(), file.length(), &opts, &error); + if (scene) { + if (g_verbose) { + printf("OK!\n"); + } + ufbxt_check_scene(scene); + ufbx_free_scene(scene); + } else { + if (g_verbose) { + printf("%s\n", error.description.data); + } + } + + current_step++; + } + } + } + } +} + +int main(int argc, char **argv) +{ + const char *input_file = NULL; + ufbx_file_format file_format = UFBX_FILE_FORMAT_OBJ; + + for (int i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-v")) { + g_verbose = true; + } else if (!strcmp(argv[i], "--mtl")) { + file_format = UFBX_FILE_FORMAT_MTL; + } else { + input_file = argv[i]; + } + } + + if (input_file) { + process_file(input_file, file_format); + } else { + fprintf(stderr, "Usage: objfuzz \n"); + } + + return 0; +} diff --git a/modules/ufbx/test/runner.c b/modules/ufbx/test/runner.c new file mode 100644 index 0000000..cf2412f --- /dev/null +++ b/modules/ufbx/test/runner.c @@ -0,0 +1,3399 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +void ufbxt_assert_fail_imp(const char *file, uint32_t line, const char *expr, bool fatal); +static void ufbxt_assert_fail(const char *file, uint32_t line, const char *expr) { + ufbxt_assert_fail_imp(file, line, expr, true); +} + +#include "../ufbx.h" + +#include +#include +#include +#include +#include + +#if defined(UFBXT_STACK_LIMIT) + static int ufbxt_main_argc; + static char **ufbxt_main_argv; + static int ufbxt_main_return; + #if defined(_WIN32) + #define NOMINMAX + #define WIN32_LEAN_AND_MEAN + #include + + #define UFBXT_THREAD_ENTRYPOINT DWORD WINAPI ufbxt_win32_entry(LPVOID _param) + #define ufbxt_thread_return() return 0 + + UFBXT_THREAD_ENTRYPOINT; + static bool ufbxt_run_thread() { + HANDLE handle = CreateThread(NULL, (SIZE_T)(UFBXT_STACK_LIMIT), &ufbxt_win32_entry, NULL, STACK_SIZE_PARAM_IS_A_RESERVATION , NULL); + if (handle == NULL) return false; + WaitForSingleObject(handle, INFINITE); + CloseHandle(handle); + return true; + } + #else + #include + + #define UFBXT_THREAD_ENTRYPOINT void *ufbxt_pthread_entry(void *param) + #define ufbxt_thread_return() return 0 + + UFBXT_THREAD_ENTRYPOINT; + static bool ufbxt_run_thread() { + pthread_attr_t attr; + pthread_t thread; + if (pthread_attr_init(&attr)) return false; + if (pthread_attr_setstacksize(&attr, (size_t)(UFBXT_STACK_LIMIT))) return false; + if (pthread_create(&thread, &attr, ufbxt_pthread_entry, NULL)) return false; + if (pthread_join(thread, NULL)) return false; + return true; + } + #endif +#endif + +// -- Thread local + +#define UFBXT_HAS_THREADLOCAL 1 + +#if defined(_MSC_VER) + #define ufbxt_threadlocal __declspec(thread) +#elif defined(__GNUC__) || defined(__clang__) + #define ufbxt_threadlocal __thread +#else + #define ufbxt_threadlocal + #undef UFBXT_HAS_THREADLOCAL + #define UFBXT_HAS_THREADLOCAL 0 +#endif + +#ifndef USE_SETJMP +#if !defined(__wasm__) && UFBXT_HAS_THREADLOCAL + #define USE_SETJMP 1 +#else + #define USE_SETJMP 0 +#endif +#endif + +#if USE_SETJMP + +#include + +#define ufbxt_jmp_buf jmp_buf +#define ufbxt_setjmp(env) setjmp(env) +#define ufbxt_longjmp(env, status, file, line, expr) longjmp(env, status) + +#else + +#define ufbxt_jmp_buf int +#define ufbxt_setjmp(env) (0) + +static void ufbxt_longjmp(int env, int value, const char *file, uint32_t line, const char *expr) +{ + fprintf(stderr, "\nAssertion failed: %s:%u: %s\n", file, line, expr); + exit(1); +} + +#endif + +#define CPUTIME_IMPLEMENTATION +#include "cputime.h" + +#if defined(_OPENMP) + #include +#else + static int omp_get_thread_num() { return 0; } + static int omp_get_num_threads() { return 1; } +#endif + +// -- Test framework + +#define ufbxt_memory_context(data) \ + ufbxt_make_memory_context(data, (uint32_t)sizeof(data) - 1) +#define ufbxt_memory_context_values(data) \ + ufbxt_make_memory_context_values(data, (uint32_t)sizeof(data) - 1) + +#define ufbxt_assert(cond) do { \ + if (!(cond)) ufbxt_assert_fail_imp(__FILE__, __LINE__, #cond, true); \ + } while (0) + +#define ufbxt_soft_assert(cond) do { \ + if (!(cond)) ufbxt_assert_fail_imp(__FILE__, __LINE__, #cond, false); \ + } while (0) + +#define ufbxt_assert_eq(a, b, size) do { \ + ufbxt_assert_eq_test(a, b, size, __FILE__, __LINE__, \ + "ufbxt_assert_eq(" #a ", " #b ", " #size ")"); \ + } while (0) + +#include "check_scene.h" +#include "testing_utils.h" + +typedef struct { + int failed; + const char *file; + uint32_t line; + const char *expr; +} ufbxt_fail; + +typedef struct { + const char *group; + const char *name; + void (*func)(void); + + ufbxt_fail fail; +} ufbxt_test; + +ufbxt_test *g_current_test; +uint64_t g_bechmark_begin_tick; + +ufbx_error g_error; +ufbxt_jmp_buf g_test_jmp; +int g_verbose; + +char g_log_buf[16*1024]; +uint32_t g_log_pos; + +char g_hint[8*1024]; + +bool g_skip_print_ok = false; +int g_skip_obj_test = false; + +bool g_no_fuzz = false; + +typedef struct { + size_t step; + char *test_name; + uint8_t patch_value; + uint32_t patch_offset; + uint32_t temp_limit; + uint32_t result_limit; + uint32_t truncate_length; + uint32_t cancel_step; + const char *description; +} ufbxt_check_line; + +static ufbxt_check_line g_checks[32768]; + +bool g_expect_fail = false; +size_t g_expect_fail_count = 0; + +ufbxt_threadlocal ufbxt_jmp_buf *t_jmp_buf; + +void ufbxt_assert_fail_imp(const char *file, uint32_t line, const char *expr, bool fatal) +{ + if (!fatal && g_expect_fail) { + g_expect_fail_count++; + return; + } + + if (t_jmp_buf) { + ufbxt_longjmp(*t_jmp_buf, 1, file, line, expr); + } + + printf("FAIL\n"); + fflush(stdout); + + g_current_test->fail.failed = 1; + g_current_test->fail.file = file; + g_current_test->fail.line = line; + g_current_test->fail.expr = expr; + + ufbxt_longjmp(g_test_jmp, 1, file, line, expr); +} + +void ufbxt_logf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + if (g_log_pos < sizeof(g_log_buf)) { + g_log_pos += vsnprintf(g_log_buf + g_log_pos, + sizeof(g_log_buf) - g_log_pos, fmt, args); + if (g_log_pos < sizeof(g_log_buf)) { + g_log_buf[g_log_pos] = '\n'; + g_log_pos++; + } + } + va_end(args); +} + +void ufbxt_hintf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vsnprintf(g_hint, sizeof(g_hint), fmt, args); + va_end(args); +} + +void ufbxt_assert_eq_test(const void *a, const void *b, size_t size, const char *file, uint32_t line, const char *expr) +{ + const char *ac = (const char *)a; + const char *bc = (const char *)b; + for (size_t i = 0; i < size; i++) { + if (ac[i] == bc[i]) continue; + + ufbxt_logf("Byte offset %u: 0x%02x != 0x%02x\n", (uint32_t)i, (uint8_t)ac[i], (uint8_t)bc[i]); + ufbxt_assert_fail(file, line, expr); + } +} + +void ufbxt_log_flush(bool print_always) +{ + if ((g_verbose || print_always) && g_log_pos > 0) { + int prev_newline = 1; + for (uint32_t i = 0; i < g_log_pos; i++) { + if (i >= sizeof(g_log_buf)) break; + char ch = g_log_buf[i]; + if (ch == '\n') { + putchar('\n'); + prev_newline = 1; + } else { + if (prev_newline) { + putchar(' '); + putchar(' '); + } + prev_newline = 0; + putchar(ch); + } + } + } + g_log_pos = 0; +} + +void ufbxt_log_error(ufbx_error *err) +{ + if (!err) return; + ufbxt_logf("Error: %s", err->description.data); + for (size_t i = 0; i < err->stack_size; i++) { + ufbx_error_frame *f = &err->stack[i]; + ufbxt_logf("Line %u %s: %s", f->source_line, f->function.data, f->description.data); + } +} + +void ufbxt_bechmark_begin() +{ + g_bechmark_begin_tick = cputime_cpu_tick(); +} + +double ufbxt_bechmark_end() +{ + uint64_t end_tick = cputime_cpu_tick(); + uint64_t delta = end_tick - g_bechmark_begin_tick; + double sec = cputime_cpu_delta_to_sec(NULL, delta); + double ghz = (double)cputime_default_sync->cpu_freq / 1e9; + ufbxt_logf("%.3fms / %ukcy at %.2fGHz", sec * 1e3, (uint32_t)(delta / 1000), ghz); + return sec; +} + +// -- Test allocator + +typedef struct { + size_t offset; + size_t bytes_allocated; + union { + bool *freed_ptr; + size_t size_and_align[2]; + }; + + char data[1024 * 1024]; +} ufbxt_allocator; + +static void *ufbxt_alloc(void *user, size_t size) +{ + ufbxt_allocator *ator = (ufbxt_allocator*)user; + ator->bytes_allocated += size; + if (size < 1024 && sizeof(ator->data) - ator->offset >= size) { + void *ptr = ator->data + ator->offset; + ator->offset = (ator->offset + size + 7) & ~(size_t)0x7; + return ptr; + } else { + return malloc(size); + } +} + +static void ufbxt_free(void *user, void *ptr, size_t size) +{ + ufbxt_allocator *ator = (ufbxt_allocator*)user; + ator->bytes_allocated -= size; + if ((uintptr_t)ptr >= (uintptr_t)ator->data + && (uintptr_t)ptr < (uintptr_t)(ator->data + sizeof(ator->data))) { + // Nop + } else { + free(ptr); + } +} + +static void ufbxt_free_allocator(void *user) +{ + ufbxt_allocator *ator = (ufbxt_allocator*)user; + ufbxt_assert(ator->bytes_allocated == 0); + *ator->freed_ptr = true; + free(ator); +} + +char data_root[256]; + +static uint32_t g_file_version = 0; +static const char *g_file_type = NULL; +static bool g_fuzz = false; +static bool g_sink = false; +static bool g_allow_non_thread_safe = false; +static bool g_all_byte_values = false; +static bool g_dedicated_allocs = false; +static bool g_fuzz_no_patch = false; +static bool g_fuzz_no_truncate = false; +static bool g_fuzz_no_cancel = false; +static bool g_fuzz_no_buffer = false; +static int g_patch_start = 0; +static int g_fuzz_quality = 16; +static int g_heavy_fuzz_quality = -1; +static size_t g_fuzz_step = SIZE_MAX; +static size_t g_fuzz_file = SIZE_MAX; +static size_t g_deflate_opt = SIZE_MAX; + +const char *g_fuzz_test_name = NULL; + +void ufbxt_init_allocator(ufbx_allocator_opts *ator, bool *freed_ptr) +{ + ator->memory_limit = 0x4000000; // 64MB + + if (g_dedicated_allocs) { + *freed_ptr = true; + return; + } + + ufbxt_allocator *at = (ufbxt_allocator*)malloc(sizeof(ufbxt_allocator)); + ufbxt_assert(at); + at->offset = 0; + at->bytes_allocated = 0; + at->freed_ptr = freed_ptr; + *freed_ptr = false; + + ator->allocator.user = at; + ator->allocator.alloc_fn = &ufbxt_alloc; + ator->allocator.free_fn = &ufbxt_free; + ator->allocator.free_allocator_fn = &ufbxt_free_allocator; +} + +static bool ufbxt_begin_fuzz() +{ + if (g_fuzz) { + if (!g_skip_print_ok) { + printf("FUZZ\n"); + g_skip_print_ok = true; + } + return true; + } else { + return false; + } +} + +static void ufbxt_begin_expect_fail() +{ + ufbxt_assert(!g_expect_fail); + g_expect_fail = true; + g_expect_fail_count = 0; +} + +static size_t ufbxt_end_expect_fail() +{ + ufbxt_assert(g_expect_fail); + ufbxt_assert(g_expect_fail_count > 0); + g_expect_fail = false; + return g_expect_fail_count; +} + +typedef struct { + size_t calls_left; +} ufbxt_cancel_ctx; + +ufbx_progress_result ufbxt_cancel_progress(void *user, const ufbx_progress *progress) +{ + ufbxt_cancel_ctx *ctx = (ufbxt_cancel_ctx*)user; + return --ctx->calls_left > 0 ? UFBX_PROGRESS_CONTINUE : UFBX_PROGRESS_CANCEL; +} + +int ufbxt_test_fuzz(const char *filename, void *data, size_t size, const ufbx_load_opts *default_opts, size_t step, int offset, size_t temp_limit, size_t result_limit, size_t truncate_length, size_t cancel_step) +{ + if (g_fuzz_step < SIZE_MAX && step != g_fuzz_step) return 1; + + #if UFBXT_HAS_THREADLOCAL + t_jmp_buf = (ufbxt_jmp_buf*)calloc(1, sizeof(ufbxt_jmp_buf)); + #endif + + int ret = 1; + if (!ufbxt_setjmp(*t_jmp_buf)) { + + ufbx_load_opts opts = { 0 }; + ufbxt_cancel_ctx cancel_ctx = { 0 }; + + if (default_opts) { + opts = *default_opts; + } + + opts.load_external_files = true; + opts.filename.data = filename; + opts.filename.length = SIZE_MAX; + + bool temp_freed = false, result_freed = false; + ufbxt_init_allocator(&opts.temp_allocator, &temp_freed); + ufbxt_init_allocator(&opts.result_allocator, &result_freed); + + opts.temp_allocator.allocation_limit = temp_limit; + opts.result_allocator.allocation_limit = result_limit; + + if (temp_limit > 0) { + opts.temp_allocator.huge_threshold = 1; + } + + if (result_limit > 0) { + opts.result_allocator.huge_threshold = 1; + } + + if (cancel_step > 0) { + cancel_ctx.calls_left = cancel_step; + opts.progress_cb.fn = &ufbxt_cancel_progress; + opts.progress_cb.user = &cancel_ctx; + opts.progress_interval_hint = 1; + } + + if (g_dedicated_allocs) { + opts.temp_allocator.huge_threshold = 1; + opts.result_allocator.huge_threshold = 1; + } + + if (truncate_length > 0) size = truncate_length; + + ufbx_error error; + ufbx_scene *scene = ufbx_load_memory(data, size, &opts, &error); + if (scene) { + ufbxt_check_scene(scene); + ufbx_free_scene(scene); + } else { + + // Collect hit checks + for (size_t i = 0; i < error.stack_size; i++) { + ufbx_error_frame frame = error.stack[i]; + ufbxt_check_line *check = &g_checks[frame.source_line]; + if (check->test_name && strcmp(g_fuzz_test_name, check->test_name) != 0) continue; + if (check->step && check->step < step) continue; + + #pragma omp critical(check) + { + bool ok = check->step == 0 || check->step > step; + if (check->test_name && strcmp(g_fuzz_test_name, check->test_name) != 0) ok = false; + + if (ok) { + if (!check->test_name) { + size_t name_len = strlen(g_fuzz_test_name) + 1; + check->test_name = (char*)malloc(name_len); + if (check->test_name) { + memcpy(check->test_name, g_fuzz_test_name, name_len); + } + } + if (offset < 0) { + check->patch_offset = UINT32_MAX; + check->patch_value = 0; + } else { + check->patch_offset = offset + 1; + check->patch_value = ((uint8_t*)data)[offset]; + } + check->step = step; + check->temp_limit = (uint32_t)temp_limit; + check->result_limit = (uint32_t)result_limit; + check->truncate_length = (uint32_t)truncate_length; + check->cancel_step = (uint32_t)cancel_step; + check->description = frame.description.data; + } + } + } + } + + ufbxt_assert(temp_freed); + ufbxt_assert(result_freed); + + } else { + ret = 0; + } + + #if UFBXT_HAS_THREADLOCAL + free(t_jmp_buf); + t_jmp_buf = NULL; + #endif + + return ret; + +} + +typedef struct { + const char *name; + uint32_t line; + int32_t patch_offset; + uint8_t patch_value; + uint32_t temp_limit; + uint32_t result_limit; + uint32_t truncate_length; + uint32_t cancel_step; + const char *description; +} ufbxt_fuzz_check; + +// Generated by running `runner --fuzz` +// Take both normal and `UFBX_REGRESSION` builds, combine results and use `sort -u` to remove duplciates. +// From commit 77496e0 +static const ufbxt_fuzz_check g_fuzz_checks[] = { + { "blender_279_ball_0_obj", 14058, -1, 0, 0, 31, 0, 0, "props.data" }, + { "blender_279_ball_0_obj", 14058, -1, 0, 0, 62, 0, 0, "props.data" }, + { "blender_279_ball_0_obj", 14075, -1, 0, 2261, 0, 0, 0, "ufbxi_sort_properties(uc, props.data, props.count)" }, + { "blender_279_ball_0_obj", 14075, -1, 0, 246, 0, 0, 0, "ufbxi_sort_properties(uc, props.data, props.count)" }, + { "blender_279_ball_0_obj", 14221, -1, 0, 2166, 0, 0, 0, "ufbxi_refill(uc, new_cap, 0)" }, + { "blender_279_ball_0_obj", 14221, -1, 0, 237, 0, 0, 0, "ufbxi_refill(uc, new_cap, 0)" }, + { "blender_279_ball_0_obj", 14476, -1, 0, 134, 0, 0, 0, "ufbxi_connect_oo(uc, uc->obj.usemtl_fbx_id, mesh->fbx_n..." }, + { "blender_279_ball_0_obj", 14476, -1, 0, 1389, 0, 0, 0, "ufbxi_connect_oo(uc, uc->obj.usemtl_fbx_id, mesh->fbx_n..." }, + { "blender_279_ball_0_obj", 14646, -1, 0, 0, 0, 3099, 0, "uc->obj.num_tokens >= 2" }, + { "blender_279_ball_0_obj", 14649, -1, 0, 0, 1, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &name, 0)" }, + { "blender_279_ball_0_obj", 14649, -1, 0, 1350, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &name, 0)" }, + { "blender_279_ball_0_obj", 14664, -1, 0, 123, 0, 0, 0, "material" }, + { "blender_279_ball_0_obj", 14664, -1, 0, 1352, 0, 0, 0, "material" }, + { "blender_279_ball_0_obj", 14671, -1, 0, 125, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->o..." }, + { "blender_279_ball_0_obj", 14671, -1, 0, 1359, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->o..." }, + { "blender_279_ball_0_obj", 14986, -1, 0, 692, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &uc->obj...." }, + { "blender_279_ball_0_obj", 15001, -1, 0, 0, 0, 54, 0, "uc->obj.num_tokens >= 2" }, + { "blender_279_ball_0_obj", 15004, -1, 0, 13, 0, 0, 0, "lib.data" }, + { "blender_279_ball_0_obj", 15004, -1, 0, 688, 0, 0, 0, "lib.data" }, + { "blender_279_ball_0_obj", 15008, -1, 0, 123, 0, 0, 0, "ufbxi_obj_parse_material(uc)" }, + { "blender_279_ball_0_obj", 15008, -1, 0, 1350, 0, 0, 0, "ufbxi_obj_parse_material(uc)" }, + { "blender_279_ball_0_obj", 15029, -1, 0, 2261, 0, 0, 0, "ufbxi_obj_pop_props(uc, &material->props.props, num_pro..." }, + { "blender_279_ball_0_obj", 15029, -1, 0, 246, 0, 0, 0, "ufbxi_obj_pop_props(uc, &material->props.props, num_pro..." }, + { "blender_279_ball_0_obj", 15044, -1, 0, 2181, 0, 0, 0, "prop" }, + { "blender_279_ball_0_obj", 15044, -1, 0, 238, 0, 0, 0, "prop" }, + { "blender_279_ball_0_obj", 15047, -1, 0, 0, 15, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &prop->na..." }, + { "blender_279_ball_0_obj", 15047, -1, 0, 2183, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &prop->na..." }, + { "blender_279_ball_0_obj", 15080, -1, 0, 0, 16, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &prop->va..." }, + { "blender_279_ball_0_obj", 15080, -1, 0, 2185, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &prop->va..." }, + { "blender_279_ball_0_obj", 15081, -1, 0, 2187, 0, 0, 0, "ufbxi_push_string_place_blob(&uc->string_pool, &prop->v..." }, + { "blender_279_ball_0_obj", 15167, -1, 0, 2166, 0, 0, 0, "ufbxi_obj_tokenize_line(uc)" }, + { "blender_279_ball_0_obj", 15167, -1, 0, 237, 0, 0, 0, "ufbxi_obj_tokenize_line(uc)" }, + { "blender_279_ball_0_obj", 15174, -1, 0, 2261, 0, 0, 0, "ufbxi_obj_flush_material(uc)" }, + { "blender_279_ball_0_obj", 15174, -1, 0, 246, 0, 0, 0, "ufbxi_obj_flush_material(uc)" }, + { "blender_279_ball_0_obj", 15175, -1, 0, 2178, 0, 0, 0, "ufbxi_obj_parse_material(uc)" }, + { "blender_279_ball_0_obj", 15183, -1, 0, 2181, 0, 0, 0, "ufbxi_obj_parse_prop(uc, uc->obj.tokens[0], 1, 1, ((voi..." }, + { "blender_279_ball_0_obj", 15183, -1, 0, 238, 0, 0, 0, "ufbxi_obj_parse_prop(uc, uc->obj.tokens[0], 1, 1, ((voi..." }, + { "blender_279_ball_0_obj", 15187, -1, 0, 0, 33, 0, 0, "ufbxi_obj_flush_material(uc)" }, + { "blender_279_ball_0_obj", 15187, -1, 0, 2331, 0, 0, 0, "ufbxi_obj_flush_material(uc)" }, + { "blender_279_ball_0_obj", 15229, -1, 0, 2162, 0, 0, 0, "ufbxi_resolve_relative_filename(uc, (ufbxi_strblob*)&ds..." }, + { "blender_279_ball_0_obj", 15229, -1, 0, 236, 0, 0, 0, "ufbxi_resolve_relative_filename(uc, (ufbxi_strblob*)&ds..." }, + { "blender_279_ball_0_obj", 15268, -1, 0, 2166, 0, 0, 0, "ok" }, + { "blender_279_ball_0_obj", 15268, -1, 0, 237, 0, 0, 0, "ok" }, + { "blender_279_ball_0_obj", 15279, -1, 0, 2162, 0, 0, 0, "ufbxi_obj_load_mtl(uc)" }, + { "blender_279_ball_0_obj", 15279, -1, 0, 236, 0, 0, 0, "ufbxi_obj_load_mtl(uc)" }, + { "blender_279_ball_0_obj", 5627, -1, 0, 2166, 0, 0, 0, "new_buffer" }, + { "blender_279_ball_0_obj", 5627, -1, 0, 237, 0, 0, 0, "new_buffer" }, + { "blender_279_ball_7400_binary", 11533, 12516, 255, 0, 0, 0, 0, "ufbxi_read_truncated_array(uc, &mesh->face_smoothing.da..." }, + { "blender_279_default_obj", 14687, 481, 48, 0, 0, 0, 0, "min_index < uc->obj.tmp_vertices[attrib].num_items / st..." }, + { "blender_279_sausage_7400_binary", 11902, -1, 0, 3089, 0, 0, 0, "skin" }, + { "blender_279_sausage_7400_binary", 11902, -1, 0, 712, 0, 0, 0, "skin" }, + { "blender_279_sausage_7400_binary", 11934, -1, 0, 3150, 0, 0, 0, "cluster" }, + { "blender_279_sausage_7400_binary", 11934, -1, 0, 735, 0, 0, 0, "cluster" }, + { "blender_279_sausage_7400_binary", 11940, 23076, 0, 0, 0, 0, 0, "indices->size == weights->size" }, + { "blender_279_sausage_7400_binary", 11951, 23900, 0, 0, 0, 0, 0, "transform->size >= 16" }, + { "blender_279_sausage_7400_binary", 11952, 24063, 0, 0, 0, 0, 0, "transform_link->size >= 16" }, + { "blender_279_sausage_7400_binary", 12310, 21748, 0, 0, 0, 0, 0, "matrix->size >= 16" }, + { "blender_279_sausage_7400_binary", 12652, -1, 0, 3089, 0, 0, 0, "ufbxi_read_skin(uc, node, &info)" }, + { "blender_279_sausage_7400_binary", 12652, -1, 0, 712, 0, 0, 0, "ufbxi_read_skin(uc, node, &info)" }, + { "blender_279_sausage_7400_binary", 12654, 23076, 0, 0, 0, 0, 0, "ufbxi_read_skin_cluster(uc, node, &info)" }, + { "blender_279_sausage_7400_binary", 16140, -1, 0, 13665, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "blender_279_sausage_7400_binary", 18203, -1, 0, 13660, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &skin->clusters, &skin->el..." }, + { "blender_279_sausage_7400_binary", 18203, -1, 0, 4415, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &skin->clusters, &skin->el..." }, + { "blender_279_sausage_7400_binary", 18248, -1, 0, 0, 382, 0, 0, "skin->vertices.data" }, + { "blender_279_sausage_7400_binary", 18248, -1, 0, 0, 764, 0, 0, "skin->vertices.data" }, + { "blender_279_sausage_7400_binary", 18252, -1, 0, 0, 383, 0, 0, "skin->weights.data" }, + { "blender_279_sausage_7400_binary", 18252, -1, 0, 0, 766, 0, 0, "skin->weights.data" }, + { "blender_279_sausage_7400_binary", 18307, -1, 0, 13665, 0, 0, 0, "ufbxi_sort_skin_weights(uc, skin)" }, + { "blender_279_sausage_7400_binary", 18469, -1, 0, 13666, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &mesh->skin_deformers, &me..." }, + { "blender_279_sausage_7400_binary", 18469, -1, 0, 4417, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &mesh->skin_deformers, &me..." }, + { "blender_279_unicode_6100_ascii", 13159, 432, 11, 0, 0, 0, 0, "ufbxi_parse_toplevel(uc, ufbxi_Creator)" }, + { "blender_279_uv_sets_6100_ascii", 11597, -1, 0, 0, 63, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &prop_nam..." }, + { "blender_279_uv_sets_6100_ascii", 11597, -1, 0, 3149, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &prop_nam..." }, + { "blender_279_uv_sets_6100_ascii", 11603, -1, 0, 3151, 0, 0, 0, "tex" }, + { "blender_279_uv_sets_6100_ascii", 11603, -1, 0, 728, 0, 0, 0, "tex" }, + { "blender_279_uv_sets_6100_ascii", 11694, -1, 0, 3155, 0, 0, 0, "extra" }, + { "blender_279_uv_sets_6100_ascii", 11694, -1, 0, 729, 0, 0, 0, "extra" }, + { "blender_279_uv_sets_6100_ascii", 11697, -1, 0, 3159, 0, 0, 0, "extra->texture_arr" }, + { "blender_279_uv_sets_6100_ascii", 11697, -1, 0, 731, 0, 0, 0, "extra->texture_arr" }, + { "blender_279_uv_sets_6100_ascii", 15501, -1, 0, 13061, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "blender_279_uv_sets_6100_ascii", 18754, -1, 0, 13057, 0, 0, 0, "mat_tex" }, + { "blender_279_uv_sets_6100_ascii", 18754, -1, 0, 3845, 0, 0, 0, "mat_tex" }, + { "blender_279_uv_sets_6100_ascii", 18761, -1, 0, 13059, 0, 0, 0, "mat_texs" }, + { "blender_279_uv_sets_6100_ascii", 18761, -1, 0, 3846, 0, 0, 0, "mat_texs" }, + { "blender_279_uv_sets_6100_ascii", 18762, -1, 0, 13061, 0, 0, 0, "ufbxi_sort_tmp_material_textures(uc, mat_texs, num_mate..." }, + { "blender_279_uv_sets_6100_ascii", 6634, -1, 0, 3155, 0, 0, 0, "extra" }, + { "blender_279_uv_sets_6100_ascii", 6634, -1, 0, 729, 0, 0, 0, "extra" }, + { "blender_279_uv_sets_6100_ascii", 6638, -1, 0, 3157, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->e..." }, + { "blender_279_uv_sets_6100_ascii", 6638, -1, 0, 730, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->e..." }, + { "blender_282_suzanne_and_transform_obj", 14466, -1, 0, 0, 2, 0, 0, "ufbxi_obj_flush_mesh(uc)" }, + { "blender_282_suzanne_and_transform_obj", 14466, -1, 0, 0, 4, 0, 0, "ufbxi_obj_flush_mesh(uc)" }, + { "blender_293_instancing_obj", 14108, -1, 0, 8037, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "blender_293_instancing_obj", 15232, -1, 0, 112260, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_MISSING_EXT..." }, + { "blender_293_instancing_obj", 15232, -1, 0, 17219, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_MISSING_EXT..." }, + { "blender_293x_nonmanifold_subsurf_obj", 14578, -1, 0, 1135, 0, 0, 0, "ufbxi_obj_parse_indices(uc, begin, window)" }, + { "blender_293x_nonmanifold_subsurf_obj", 14578, -1, 0, 91, 0, 0, 0, "ufbxi_obj_parse_indices(uc, begin, window)" }, + { "blender_293x_nonmanifold_subsurf_obj", 14748, -1, 0, 1155, 0, 0, 0, "ufbxi_fix_index(uc, &dst_indices[i], (uint32_t)ix, num_..." }, + { "blender_293x_nonmanifold_subsurf_obj", 14748, -1, 0, 97, 0, 0, 0, "ufbxi_fix_index(uc, &dst_indices[i], (uint32_t)ix, num_..." }, + { "blender_293x_nonmanifold_subsurf_obj", 14972, -1, 0, 1135, 0, 0, 0, "ufbxi_obj_parse_multi_indices(uc, 2)" }, + { "blender_293x_nonmanifold_subsurf_obj", 14972, -1, 0, 91, 0, 0, 0, "ufbxi_obj_parse_multi_indices(uc, 2)" }, + { "fuzz_0018", 13719, 810, 0, 0, 0, 0, 0, "ufbxi_read_header_extension(uc)" }, + { "fuzz_0070", 4280, -1, 0, 33, 0, 0, 0, "ufbxi_grow_array_size((pool->map.ator), sizeof(**(&pool..." }, + { "fuzz_0070", 4280, -1, 0, 748, 0, 0, 0, "ufbxi_grow_array_size((pool->map.ator), sizeof(**(&pool..." }, + { "fuzz_0272", 10678, -1, 0, 2224, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &unknown-..." }, + { "fuzz_0272", 10679, -1, 0, 452, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &unknown-..." }, + { "fuzz_0393", 10854, -1, 0, 0, 137, 0, 0, "index_data" }, + { "fuzz_0393", 10854, -1, 0, 0, 274, 0, 0, "index_data" }, + { "fuzz_0393", 10858, -1, 0, 2226, 0, 0, 0, "ufbxi_check_indices(uc, &attrib->indices.data, index_da..." }, + { "fuzz_0393", 10858, -1, 0, 454, 0, 0, 0, "ufbxi_check_indices(uc, &attrib->indices.data, index_da..." }, + { "fuzz_0561", 12648, -1, 0, 2216, 0, 0, 0, "ufbxi_read_unknown(uc, node, &info, type_str, sub_type_..." }, + { "fuzz_0561", 12648, -1, 0, 451, 0, 0, 0, "ufbxi_read_unknown(uc, node, &info, type_str, sub_type_..." }, + { "marvelous_quad_7200_binary", 20464, -1, 0, 0, 273, 0, 0, "ufbxi_push_string_place_str(&cc->string_pool, &channel-..." }, + { "max2009_blob_5800_ascii", 12887, 164150, 114, 0, 0, 0, 0, "Unknown slope mode" }, + { "max2009_blob_5800_ascii", 12917, 164903, 98, 0, 0, 0, 0, "Unknown weight mode" }, + { "max2009_blob_5800_ascii", 12930, 164150, 116, 0, 0, 0, 0, "Unknown key mode" }, + { "max2009_blob_5800_ascii", 8682, -1, 0, 15579, 0, 0, 0, "v" }, + { "max2009_blob_5800_ascii", 8682, -1, 0, 4417, 0, 0, 0, "v" }, + { "max2009_blob_5800_ascii", 8690, -1, 0, 0, 116, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, v, raw)" }, + { "max2009_blob_5800_ascii", 8690, -1, 0, 15581, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, v, raw)" }, + { "max2009_blob_5800_ascii", 8752, 131240, 45, 0, 0, 0, 0, "Bad array dst type" }, + { "max2009_blob_5800_ascii", 8808, -1, 0, 23172, 0, 0, 0, "v" }, + { "max2009_blob_5800_ascii", 8808, -1, 0, 6973, 0, 0, 0, "v" }, + { "max2009_blob_5800_ascii", 9576, 12, 0, 0, 0, 0, 0, "ufbxi_ascii_parse_node(uc, 0, UFBXI_PARSE_ROOT, &end, &..." }, + { "max2009_blob_5800_binary", 10536, -1, 0, 8, 0, 0, 0, "ufbxi_insert_fbx_id(uc, fbx_id, element_id)" }, + { "max2009_blob_5800_binary", 10557, -1, 0, 3336, 0, 0, 0, "conn" }, + { "max2009_blob_5800_binary", 10557, -1, 0, 9841, 0, 0, 0, "conn" }, + { "max2009_blob_5800_binary", 12800, -1, 0, 3391, 0, 0, 0, "curve" }, + { "max2009_blob_5800_binary", 12800, -1, 0, 9981, 0, 0, 0, "curve" }, + { "max2009_blob_5800_binary", 12802, -1, 0, 3393, 0, 0, 0, "ufbxi_connect_op(uc, curve_fbx_id, value_fbx_id, curve-..." }, + { "max2009_blob_5800_binary", 12802, -1, 0, 9988, 0, 0, 0, "ufbxi_connect_op(uc, curve_fbx_id, value_fbx_id, curve-..." }, + { "max2009_blob_5800_binary", 12807, 119084, 0, 0, 0, 0, 0, "ufbxi_find_val1(node, ufbxi_KeyCount, \"Z\", &num_keys)" }, + { "max2009_blob_5800_binary", 12810, 119104, 255, 0, 0, 0, 0, "curve->keyframes.data" }, + { "max2009_blob_5800_binary", 12824, 119110, 0, 0, 0, 0, 0, "data_end - data >= 2" }, + { "max2009_blob_5800_binary", 12910, 119110, 16, 0, 0, 0, 0, "data_end - data >= 1" }, + { "max2009_blob_5800_binary", 12935, 119102, 3, 0, 0, 0, 0, "data_end - data >= 2" }, + { "max2009_blob_5800_binary", 12984, 119102, 1, 0, 0, 0, 0, "data == data_end" }, + { "max2009_blob_5800_binary", 13005, 114022, 0, 0, 0, 0, 0, "ufbxi_get_val1(child, \"C\", (char**)&old_name)" }, + { "max2009_blob_5800_binary", 13016, 119084, 0, 0, 0, 0, 0, "ufbxi_read_take_prop_channel(uc, child, target_fbx_id, ..." }, + { "max2009_blob_5800_binary", 13059, -1, 0, 3331, 0, 0, 0, "ufbxi_connect_oo(uc, value_fbx_id, layer_fbx_id)" }, + { "max2009_blob_5800_binary", 13059, -1, 0, 9830, 0, 0, 0, "ufbxi_connect_oo(uc, value_fbx_id, layer_fbx_id)" }, + { "max2009_blob_5800_binary", 13060, -1, 0, 3336, 0, 0, 0, "ufbxi_connect_op(uc, value_fbx_id, target_fbx_id, name)" }, + { "max2009_blob_5800_binary", 13060, -1, 0, 9841, 0, 0, 0, "ufbxi_connect_op(uc, value_fbx_id, target_fbx_id, name)" }, + { "max2009_blob_5800_binary", 13063, 119084, 0, 0, 0, 0, 0, "ufbxi_read_take_anim_channel(uc, channel_nodes[i], valu..." }, + { "max2009_blob_5800_binary", 13076, 114858, 0, 0, 0, 0, 0, "ufbxi_get_val1(node, \"c\", (char**)&type_and_name)" }, + { "max2009_blob_5800_binary", 13085, 114022, 0, 0, 0, 0, 0, "ufbxi_read_take_prop_channel(uc, child, target_fbx_id, ..." }, + { "max2009_blob_5800_binary", 13118, 114022, 0, 0, 0, 0, 0, "ufbxi_read_take_object(uc, child, layer_fbx_id)" }, + { "max2009_blob_5800_binary", 13372, -1, 0, 2522, 0, 0, 0, "material" }, + { "max2009_blob_5800_binary", 13372, -1, 0, 576, 0, 0, 0, "material" }, + { "max2009_blob_5800_binary", 13380, -1, 0, 0, 140, 0, 0, "material->props.props.data" }, + { "max2009_blob_5800_binary", 13380, -1, 0, 0, 280, 0, 0, "material->props.props.data" }, + { "max2009_blob_5800_binary", 13421, -1, 0, 107, 0, 0, 0, "light" }, + { "max2009_blob_5800_binary", 13421, -1, 0, 1181, 0, 0, 0, "light" }, + { "max2009_blob_5800_binary", 13428, -1, 0, 0, 44, 0, 0, "light->props.props.data" }, + { "max2009_blob_5800_binary", 13428, -1, 0, 0, 88, 0, 0, "light->props.props.data" }, + { "max2009_blob_5800_binary", 13436, -1, 0, 1768, 0, 0, 0, "camera" }, + { "max2009_blob_5800_binary", 13436, -1, 0, 310, 0, 0, 0, "camera" }, + { "max2009_blob_5800_binary", 13443, -1, 0, 0, 188, 0, 0, "camera->props.props.data" }, + { "max2009_blob_5800_binary", 13443, -1, 0, 0, 94, 0, 0, "camera->props.props.data" }, + { "max2009_blob_5800_binary", 13476, -1, 0, 2510, 0, 0, 0, "mesh" }, + { "max2009_blob_5800_binary", 13476, -1, 0, 572, 0, 0, 0, "mesh" }, + { "max2009_blob_5800_binary", 13487, 9030, 37, 0, 0, 0, 0, "vertices->size % 3 == 0" }, + { "max2009_blob_5800_binary", 13497, -1, 0, 0, 1328, 0, 0, "index_data" }, + { "max2009_blob_5800_binary", 13497, -1, 0, 0, 664, 0, 0, "index_data" }, + { "max2009_blob_5800_binary", 13520, 58502, 255, 0, 0, 0, 0, "ufbxi_process_indices(uc, mesh, index_data)" }, + { "max2009_blob_5800_binary", 13551, -1, 0, 0, 138, 0, 0, "set" }, + { "max2009_blob_5800_binary", 13551, -1, 0, 0, 276, 0, 0, "set" }, + { "max2009_blob_5800_binary", 13555, 65596, 0, 0, 0, 0, 0, "ufbxi_read_vertex_element(uc, mesh, uv_info, (ufbx_vert..." }, + { "max2009_blob_5800_binary", 13565, 56645, 0, 0, 0, 0, 0, "ufbxi_find_val1(node, ufbxi_MaterialAssignation, \"C\",..." }, + { "max2009_blob_5800_binary", 13567, 56700, 78, 0, 0, 0, 0, "ufbxi_read_truncated_array(uc, &mesh->face_material.dat..." }, + { "max2009_blob_5800_binary", 13596, 6207, 0, 0, 0, 0, 0, "ufbxi_get_val1(child, \"s\", &type_and_name)" }, + { "max2009_blob_5800_binary", 13597, -1, 0, 0, 139, 0, 0, "ufbxi_split_type_and_name(uc, type_and_name, &type, &na..." }, + { "max2009_blob_5800_binary", 13597, -1, 0, 2519, 0, 0, 0, "ufbxi_split_type_and_name(uc, type_and_name, &type, &na..." }, + { "max2009_blob_5800_binary", 13598, -1, 0, 2522, 0, 0, 0, "ufbxi_read_legacy_material(uc, child, &fbx_id, name.dat..." }, + { "max2009_blob_5800_binary", 13598, -1, 0, 576, 0, 0, 0, "ufbxi_read_legacy_material(uc, child, &fbx_id, name.dat..." }, + { "max2009_blob_5800_binary", 13599, -1, 0, 2529, 0, 0, 0, "ufbxi_connect_oo(uc, fbx_id, info->fbx_id)" }, + { "max2009_blob_5800_binary", 13599, -1, 0, 578, 0, 0, 0, "ufbxi_connect_oo(uc, fbx_id, info->fbx_id)" }, + { "max2009_blob_5800_binary", 13630, 818, 0, 0, 0, 0, 0, "ufbxi_get_val1(node, \"s\", &type_and_name)" }, + { "max2009_blob_5800_binary", 13631, -1, 0, 0, 43, 0, 0, "ufbxi_split_type_and_name(uc, type_and_name, &type, &na..." }, + { "max2009_blob_5800_binary", 13631, -1, 0, 1167, 0, 0, 0, "ufbxi_split_type_and_name(uc, type_and_name, &type, &na..." }, + { "max2009_blob_5800_binary", 13639, -1, 0, 104, 0, 0, 0, "elem_node" }, + { "max2009_blob_5800_binary", 13639, -1, 0, 1170, 0, 0, 0, "elem_node" }, + { "max2009_blob_5800_binary", 13640, -1, 0, 1176, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "max2009_blob_5800_binary", 13640, -1, 0, 365, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "max2009_blob_5800_binary", 13643, -1, 0, 105, 0, 0, 0, "ufbxi_push_synthetic_id(uc, &attrib_info.fbx_id)" }, + { "max2009_blob_5800_binary", 13643, -1, 0, 1177, 0, 0, 0, "ufbxi_push_synthetic_id(uc, &attrib_info.fbx_id)" }, + { "max2009_blob_5800_binary", 13648, -1, 0, 106, 0, 0, 0, "ufbxi_connect_oo(uc, attrib_info.fbx_id, info.fbx_id)" }, + { "max2009_blob_5800_binary", 13648, -1, 0, 1179, 0, 0, 0, "ufbxi_connect_oo(uc, attrib_info.fbx_id, info.fbx_id)" }, + { "max2009_blob_5800_binary", 13655, -1, 0, 107, 0, 0, 0, "ufbxi_read_legacy_light(uc, node, &attrib_info)" }, + { "max2009_blob_5800_binary", 13655, -1, 0, 1181, 0, 0, 0, "ufbxi_read_legacy_light(uc, node, &attrib_info)" }, + { "max2009_blob_5800_binary", 13657, -1, 0, 1768, 0, 0, 0, "ufbxi_read_legacy_camera(uc, node, &attrib_info)" }, + { "max2009_blob_5800_binary", 13657, -1, 0, 310, 0, 0, 0, "ufbxi_read_legacy_camera(uc, node, &attrib_info)" }, + { "max2009_blob_5800_binary", 13661, 6207, 0, 0, 0, 0, 0, "ufbxi_read_legacy_mesh(uc, node, &attrib_info)" }, + { "max2009_blob_5800_binary", 13668, -1, 0, 111, 0, 0, 0, "ufbxi_insert_fbx_attr(uc, info.fbx_id, attrib_info.fbx_..." }, + { "max2009_blob_5800_binary", 13668, -1, 0, 1190, 0, 0, 0, "ufbxi_insert_fbx_attr(uc, info.fbx_id, attrib_info.fbx_..." }, + { "max2009_blob_5800_binary", 13677, -1, 0, 2607, 0, 0, 0, "ufbxi_connect_oo(uc, child_fbx_id, info.fbx_id)" }, + { "max2009_blob_5800_binary", 13677, -1, 0, 600, 0, 0, 0, "ufbxi_connect_oo(uc, child_fbx_id, info.fbx_id)" }, + { "max2009_blob_5800_binary", 13701, -1, 0, 3, 0, 0, 0, "ufbxi_init_node_prop_names(uc)" }, + { "max2009_blob_5800_binary", 13701, -1, 0, 662, 0, 0, 0, "ufbxi_init_node_prop_names(uc)" }, + { "max2009_blob_5800_binary", 13708, -1, 0, 4, 0, 0, 0, "root" }, + { "max2009_blob_5800_binary", 13708, -1, 0, 862, 0, 0, 0, "root" }, + { "max2009_blob_5800_binary", 13710, -1, 0, 872, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "max2009_blob_5800_binary", 13710, -1, 0, 9, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "max2009_blob_5800_binary", 13721, 113392, 1, 0, 0, 0, 0, "ufbxi_read_takes(uc)" }, + { "max2009_blob_5800_binary", 13725, 818, 0, 0, 0, 0, 0, "ufbxi_read_legacy_model(uc, node)" }, + { "max2009_blob_5800_binary", 13730, -1, 0, 0, 3550, 0, 0, "ufbxi_retain_toplevel(uc, ((void *)0))" }, + { "max2009_blob_5800_binary", 13730, -1, 0, 0, 7100, 0, 0, "ufbxi_retain_toplevel(uc, ((void *)0))" }, + { "max2009_blob_5800_binary", 15522, -1, 0, 3693, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "max2009_blob_5800_binary", 15608, -1, 0, 3693, 0, 0, 0, "ufbxi_sort_connections(uc, uc->scene.connections_src.da..." }, + { "max2009_blob_5800_binary", 15713, -1, 0, 10801, 0, 0, 0, "new_prop" }, + { "max2009_blob_5800_binary", 15713, -1, 0, 3694, 0, 0, 0, "new_prop" }, + { "max2009_blob_5800_binary", 15730, -1, 0, 0, 355, 0, 0, "elem->props.props.data" }, + { "max2009_blob_5800_binary", 15730, -1, 0, 0, 710, 0, 0, "elem->props.props.data" }, + { "max2009_blob_5800_binary", 18018, -1, 0, 0, 411, 0, 0, "mat->face_indices.data" }, + { "max2009_blob_5800_binary", 18018, -1, 0, 0, 822, 0, 0, "mat->face_indices.data" }, + { "max2009_blob_5800_binary", 18061, -1, 0, 10801, 0, 0, 0, "ufbxi_add_connections_to_elements(uc)" }, + { "max2009_blob_5800_binary", 18061, -1, 0, 3694, 0, 0, 0, "ufbxi_add_connections_to_elements(uc)" }, + { "max2009_blob_5800_binary", 18428, -1, 0, 0, 410, 0, 0, "materials" }, + { "max2009_blob_5800_binary", 18428, -1, 0, 0, 820, 0, 0, "materials" }, + { "max2009_blob_5800_binary", 18462, -1, 0, 0, 411, 0, 0, "ufbxi_finalize_mesh_material(&uc->result, &uc->error, m..." }, + { "max2009_blob_5800_binary", 18462, -1, 0, 0, 822, 0, 0, "ufbxi_finalize_mesh_material(&uc->result, &uc->error, m..." }, + { "max2009_blob_5800_binary", 18526, -1, 0, 11044, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &layer->anim_values, &laye..." }, + { "max2009_blob_5800_binary", 18526, -1, 0, 3809, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &layer->anim_values, &laye..." }, + { "max2009_blob_5800_binary", 18550, -1, 0, 11139, 0, 0, 0, "aprop" }, + { "max2009_blob_5800_binary", 18550, -1, 0, 3841, 0, 0, 0, "aprop" }, + { "max2009_blob_5800_binary", 7513, -1, 0, 0, 0, 80100, 0, "val" }, + { "max2009_blob_5800_binary", 7515, 80062, 17, 0, 0, 0, 0, "type == 'S' || type == 'R'" }, + { "max2009_blob_5800_binary", 7524, 80082, 1, 0, 0, 0, 0, "d->data" }, + { "max2009_blob_5800_binary", 7530, -1, 0, 0, 119, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, d, raw)" }, + { "max2009_blob_5800_binary", 7530, -1, 0, 2462, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, d, raw)" }, + { "max2009_blob_5800_binary", 9594, -1, 0, 42, 0, 0, 0, "ufbxi_retain_toplevel(uc, &uc->legacy_node)" }, + { "max2009_blob_5800_binary", 9594, -1, 0, 969, 0, 0, 0, "ufbxi_retain_toplevel(uc, &uc->legacy_node)" }, + { "max2009_blob_6100_binary", 10649, -1, 0, 1357, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "max2009_blob_6100_binary", 11547, 149477, 3, 0, 0, 0, 0, "ufbxi_read_truncated_array(uc, &mesh->face_material.dat..." }, + { "max2009_blob_6100_binary", 12513, -1, 0, 2110, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "max2009_blob_6100_binary", 12513, -1, 0, 372, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "max2009_blob_6100_binary", 12515, -1, 0, 1060, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "max2009_blob_6100_binary", 12515, -1, 0, 4496, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "max7_blend_cube_5000_binary", 11068, -1, 0, 1718, 0, 0, 0, "ufbxi_connect_pp(uc, info->fbx_id, channel_fbx_id, name..." }, + { "max7_blend_cube_5000_binary", 11068, -1, 0, 317, 0, 0, 0, "ufbxi_connect_pp(uc, info->fbx_id, channel_fbx_id, name..." }, + { "max7_blend_cube_5000_binary", 13027, -1, 0, 1807, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &name, 0)" }, + { "max7_blend_cube_5000_binary", 13478, 2350, 0, 0, 0, 0, 0, "ufbxi_read_synthetic_blend_shapes(uc, node, info)" }, + { "max7_cube_5000_binary", 13688, -1, 0, 1242, 0, 0, 0, "ufbxi_push_synthetic_id(uc, &uc->legacy_implicit_anim_l..." }, + { "max7_cube_5000_binary", 13688, -1, 0, 137, 0, 0, 0, "ufbxi_push_synthetic_id(uc, &uc->legacy_implicit_anim_l..." }, + { "max7_cube_5000_binary", 13690, 942, 0, 0, 0, 0, 0, "ufbxi_read_take_prop_channel(uc, child, info.fbx_id, uc..." }, + { "max7_cube_5000_binary", 13739, -1, 0, 0, 106, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &layer_in..." }, + { "max7_cube_5000_binary", 13739, -1, 0, 4125, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &layer_in..." }, + { "max7_cube_5000_binary", 13741, -1, 0, 1218, 0, 0, 0, "layer" }, + { "max7_cube_5000_binary", 13741, -1, 0, 4127, 0, 0, 0, "layer" }, + { "max7_cube_5000_binary", 13744, -1, 0, 1222, 0, 0, 0, "ufbxi_push_synthetic_id(uc, &stack_info.fbx_id)" }, + { "max7_cube_5000_binary", 13744, -1, 0, 4136, 0, 0, 0, "ufbxi_push_synthetic_id(uc, &stack_info.fbx_id)" }, + { "max7_cube_5000_binary", 13746, -1, 0, 1223, 0, 0, 0, "stack" }, + { "max7_cube_5000_binary", 13746, -1, 0, 4138, 0, 0, 0, "stack" }, + { "max7_cube_5000_binary", 13748, -1, 0, 1225, 0, 0, 0, "ufbxi_connect_oo(uc, layer_info.fbx_id, stack_info.fbx_..." }, + { "max7_cube_5000_binary", 13748, -1, 0, 4145, 0, 0, 0, "ufbxi_connect_oo(uc, layer_info.fbx_id, stack_info.fbx_..." }, + { "max7_skin_5000_binary", 13390, -1, 0, 1779, 0, 0, 0, "cluster" }, + { "max7_skin_5000_binary", 13390, -1, 0, 342, 0, 0, 0, "cluster" }, + { "max7_skin_5000_binary", 13397, 2420, 136, 0, 0, 0, 0, "indices->size == weights->size" }, + { "max7_skin_5000_binary", 13408, 4378, 15, 0, 0, 0, 0, "transform->size >= 16" }, + { "max7_skin_5000_binary", 13409, 4544, 15, 0, 0, 0, 0, "transform_link->size >= 16" }, + { "max7_skin_5000_binary", 13451, -1, 0, 2192, 0, 0, 0, "bone" }, + { "max7_skin_5000_binary", 13451, -1, 0, 497, 0, 0, 0, "bone" }, + { "max7_skin_5000_binary", 13463, -1, 0, 0, 102, 0, 0, "bone->props.props.data" }, + { "max7_skin_5000_binary", 13463, -1, 0, 0, 51, 0, 0, "bone->props.props.data" }, + { "max7_skin_5000_binary", 13603, 2361, 0, 0, 0, 0, 0, "ufbxi_get_val1(child, \"s\", &type_and_name)" }, + { "max7_skin_5000_binary", 13604, -1, 0, 1778, 0, 0, 0, "ufbxi_split_type_and_name(uc, type_and_name, &type, &na..." }, + { "max7_skin_5000_binary", 13605, 2420, 136, 0, 0, 0, 0, "ufbxi_read_legacy_link(uc, child, &fbx_id, name.data)" }, + { "max7_skin_5000_binary", 13608, -1, 0, 1788, 0, 0, 0, "ufbxi_connect_oo(uc, node_fbx_id, fbx_id)" }, + { "max7_skin_5000_binary", 13608, -1, 0, 346, 0, 0, 0, "ufbxi_connect_oo(uc, node_fbx_id, fbx_id)" }, + { "max7_skin_5000_binary", 13611, -1, 0, 1790, 0, 0, 0, "skin" }, + { "max7_skin_5000_binary", 13611, -1, 0, 347, 0, 0, 0, "skin" }, + { "max7_skin_5000_binary", 13612, -1, 0, 1797, 0, 0, 0, "ufbxi_connect_oo(uc, skin_fbx_id, info->fbx_id)" }, + { "max7_skin_5000_binary", 13612, -1, 0, 349, 0, 0, 0, "ufbxi_connect_oo(uc, skin_fbx_id, info->fbx_id)" }, + { "max7_skin_5000_binary", 13614, -1, 0, 1799, 0, 0, 0, "ufbxi_connect_oo(uc, fbx_id, skin_fbx_id)" }, + { "max7_skin_5000_binary", 13614, -1, 0, 350, 0, 0, 0, "ufbxi_connect_oo(uc, fbx_id, skin_fbx_id)" }, + { "max7_skin_5000_binary", 13659, -1, 0, 2192, 0, 0, 0, "ufbxi_read_legacy_limb_node(uc, node, &attrib_info)" }, + { "max7_skin_5000_binary", 13659, -1, 0, 497, 0, 0, 0, "ufbxi_read_legacy_limb_node(uc, node, &attrib_info)" }, + { "max_cache_box_7500_binary", 20348, -1, 0, 2956, 0, 0, 0, "frames" }, + { "max_cache_box_7500_binary", 20348, -1, 0, 663, 0, 0, 0, "frames" }, + { "max_cache_box_7500_binary", 20518, -1, 0, 2956, 0, 0, 0, "ufbxi_cache_load_pc2(cc)" }, + { "max_cache_box_7500_binary", 20518, -1, 0, 663, 0, 0, 0, "ufbxi_cache_load_pc2(cc)" }, + { "max_curve_line_7500_ascii", 11813, 8302, 43, 0, 0, 0, 0, "points->size % 3 == 0" }, + { "max_curve_line_7500_binary", 11806, -1, 0, 2214, 0, 0, 0, "line" }, + { "max_curve_line_7500_binary", 11806, -1, 0, 426, 0, 0, 0, "line" }, + { "max_curve_line_7500_binary", 11811, 13861, 255, 0, 0, 0, 0, "points" }, + { "max_curve_line_7500_binary", 11812, 13985, 56, 0, 0, 0, 0, "points_index" }, + { "max_curve_line_7500_binary", 11834, -1, 0, 0, 140, 0, 0, "line->segments.data" }, + { "max_curve_line_7500_binary", 11834, -1, 0, 0, 280, 0, 0, "line->segments.data" }, + { "max_curve_line_7500_binary", 12642, 13861, 255, 0, 0, 0, 0, "ufbxi_read_line(uc, node, &info)" }, + { "max_geometry_transform_6100_binary", 10617, -1, 0, 1871, 0, 0, 0, "geo_node" }, + { "max_geometry_transform_6100_binary", 10617, -1, 0, 317, 0, 0, 0, "geo_node" }, + { "max_geometry_transform_6100_binary", 10618, -1, 0, 1878, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "max_geometry_transform_6100_binary", 10618, -1, 0, 564, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "max_geometry_transform_6100_binary", 10622, -1, 0, 0, 108, 0, 0, "props" }, + { "max_geometry_transform_6100_binary", 10622, -1, 0, 0, 54, 0, 0, "props" }, + { "max_geometry_transform_6100_binary", 10633, -1, 0, 1879, 0, 0, 0, "ufbxi_connect_oo(uc, geo_fbx_id, node_fbx_id)" }, + { "max_geometry_transform_6100_binary", 10633, -1, 0, 319, 0, 0, 0, "ufbxi_connect_oo(uc, geo_fbx_id, node_fbx_id)" }, + { "max_geometry_transform_6100_binary", 10637, -1, 0, 1881, 0, 0, 0, "extra" }, + { "max_geometry_transform_6100_binary", 10637, -1, 0, 320, 0, 0, 0, "extra" }, + { "max_geometry_transform_6100_binary", 10652, -1, 0, 1871, 0, 0, 0, "ufbxi_setup_geometry_transform_helper(uc, elem_node, in..." }, + { "max_geometry_transform_6100_binary", 10652, -1, 0, 317, 0, 0, 0, "ufbxi_setup_geometry_transform_helper(uc, elem_node, in..." }, + { "max_geometry_transform_6100_binary", 15331, -1, 0, 722, 0, 0, 0, "elements" }, + { "max_geometry_transform_6100_binary", 15335, -1, 0, 723, 0, 0, 0, "tmp_connections" }, + { "max_geometry_transform_6100_binary", 15338, -1, 0, 724, 0, 0, 0, "pre_connections" }, + { "max_geometry_transform_6100_binary", 15341, -1, 0, 725, 0, 0, 0, "instance_counts" }, + { "max_geometry_transform_6100_binary", 15347, -1, 0, 726, 0, 0, 0, "fbx_ids" }, + { "max_geometry_transform_6100_binary", 21335, -1, 0, 1, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, str, 0)" }, + { "max_geometry_transform_6100_binary", 21353, -1, 0, 1, 0, 0, 0, "ufbxi_fixup_opts_string(uc, &uc->opts.geometry_transfor..." }, + { "max_geometry_transform_6100_binary", 21405, -1, 0, 722, 0, 0, 0, "ufbxi_pre_finalize_scene(uc)" }, + { "max_geometry_transform_instances_7700_binary", 15412, -1, 0, 2927, 0, 0, 0, "ufbxi_setup_geometry_transform_helper(uc, node, fbx_id)" }, + { "max_geometry_transform_instances_7700_binary", 15412, -1, 0, 642, 0, 0, 0, "ufbxi_setup_geometry_transform_helper(uc, node, fbx_id)" }, + { "max_geometry_transform_types_obj", 15462, -1, 0, 30, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "max_geometry_transform_types_obj", 15486, -1, 0, 27, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "max_geometry_transform_types_obj", 15803, -1, 0, 27, 0, 0, 0, "ufbxi_sort_node_ptrs(uc, node_ptrs, num_nodes)" }, + { "max_geometry_transform_types_obj", 18098, -1, 0, 30, 0, 0, 0, "ufbxi_sort_name_elements(uc, uc->scene.elements_by_name..." }, + { "max_quote_6100_ascii", 10449, -1, 0, 1137, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_DUPLICATE_O..." }, + { "max_quote_6100_ascii", 10449, -1, 0, 4521, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_DUPLICATE_O..." }, + { "max_quote_6100_ascii", 18127, -1, 0, 1393, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "max_quote_6100_ascii", 18127, -1, 0, 5445, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "max_quote_6100_ascii", 18129, -1, 0, 5447, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "max_quote_6100_ascii", 18143, -1, 0, 0, 176, 0, 0, "node->all_attribs.data" }, + { "max_quote_6100_ascii", 18143, -1, 0, 0, 352, 0, 0, "node->all_attribs.data" }, + { "max_quote_6100_ascii", 21442, -1, 0, 0, 188, 0, 0, "ufbxi_pop_warnings(&uc->warnings, &uc->scene.metadata.w..." }, + { "max_quote_6100_ascii", 4071, -1, 0, 0, 188, 0, 0, "warnings->data" }, + { "max_quote_6100_binary", 11537, 8983, 36, 0, 0, 0, 0, "ufbxi_find_val1(n, ufbxi_MappingInformationType, \"c\",..." }, + { "max_quote_6100_binary", 11540, 9030, 36, 0, 0, 0, 0, "ufbxi_read_truncated_array(uc, &mesh->edge_visibility.d..." }, + { "max_shadergraph_7700_ascii", 8391, -1, 0, 1096, 0, 0, 0, "ufbxi_ascii_push_token_char(uc, token, replacement)" }, + { "max_shadergraph_7700_ascii", 8391, -1, 0, 4772, 0, 0, 0, "ufbxi_ascii_push_token_char(uc, token, replacement)" }, + { "max_texture_mapping_6100_binary", 17134, -1, 0, 10761, 0, 0, 0, "copy" }, + { "max_texture_mapping_6100_binary", 17134, -1, 0, 2715, 0, 0, 0, "copy" }, + { "max_texture_mapping_6100_binary", 17142, -1, 0, 0, 660, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &prefix, ..." }, + { "max_texture_mapping_6100_binary", 17142, -1, 0, 10763, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &prefix, ..." }, + { "max_texture_mapping_6100_binary", 17194, -1, 0, 10761, 0, 0, 0, "ufbxi_push_prop_prefix(uc, &shader->prop_prefix, name)" }, + { "max_texture_mapping_6100_binary", 17194, -1, 0, 2715, 0, 0, 0, "ufbxi_push_prop_prefix(uc, &shader->prop_prefix, name)" }, + { "max_texture_mapping_6100_binary", 17281, -1, 0, 0, 1318, 0, 0, "shader" }, + { "max_texture_mapping_6100_binary", 17281, -1, 0, 0, 659, 0, 0, "shader" }, + { "max_texture_mapping_6100_binary", 17313, -1, 0, 10761, 0, 0, 0, "ufbxi_shader_texture_find_prefix(uc, texture, shader)" }, + { "max_texture_mapping_6100_binary", 17313, -1, 0, 2715, 0, 0, 0, "ufbxi_shader_texture_find_prefix(uc, texture, shader)" }, + { "max_texture_mapping_6100_binary", 17325, -1, 0, 0, 677, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &shader->..." }, + { "max_texture_mapping_6100_binary", 17325, -1, 0, 10865, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &shader->..." }, + { "max_texture_mapping_6100_binary", 17368, -1, 0, 10765, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "max_texture_mapping_6100_binary", 17385, -1, 0, 0, 1322, 0, 0, "shader->inputs.data" }, + { "max_texture_mapping_6100_binary", 17385, -1, 0, 0, 661, 0, 0, "shader->inputs.data" }, + { "max_texture_mapping_6100_binary", 17630, -1, 0, 10971, 0, 0, 0, "dst" }, + { "max_texture_mapping_6100_binary", 17630, -1, 0, 2745, 0, 0, 0, "dst" }, + { "max_texture_mapping_6100_binary", 17650, -1, 0, 10983, 0, 0, 0, "dst" }, + { "max_texture_mapping_6100_binary", 17709, -1, 0, 2753, 0, 0, 0, "((ufbx_texture**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "max_texture_mapping_6100_binary", 17720, -1, 0, 10982, 0, 0, 0, "((ufbx_texture**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "max_texture_mapping_6100_binary", 18853, -1, 0, 10761, 0, 0, 0, "ufbxi_finalize_shader_texture(uc, texture)" }, + { "max_texture_mapping_6100_binary", 18853, -1, 0, 2715, 0, 0, 0, "ufbxi_finalize_shader_texture(uc, texture)" }, + { "max_texture_mapping_7700_binary", 17171, -1, 0, 2340, 0, 0, 0, "ufbxi_push_prop_prefix(uc, &shader->prop_prefix, prop->..." }, + { "max_texture_mapping_7700_binary", 17171, -1, 0, 9444, 0, 0, 0, "ufbxi_push_prop_prefix(uc, &shader->prop_prefix, prop->..." }, + { "max_transformed_skin_6100_binary", 12858, 63310, 98, 0, 0, 0, 0, "data_end - data >= 2" }, + { "max_transformed_skin_6100_binary", 15344, -1, 0, 2030, 0, 0, 0, "modify_not_supported" }, + { "maya_arnold_textures_6100_binary", 12330, -1, 0, 6389, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_arnold_textures_6100_binary", 12340, -1, 0, 1514, 0, 0, 0, "bindings" }, + { "maya_arnold_textures_6100_binary", 12340, -1, 0, 6246, 0, 0, 0, "bindings" }, + { "maya_arnold_textures_6100_binary", 12354, -1, 0, 1516, 0, 0, 0, "bind" }, + { "maya_arnold_textures_6100_binary", 12354, -1, 0, 6253, 0, 0, 0, "bind" }, + { "maya_arnold_textures_6100_binary", 12369, -1, 0, 0, 343, 0, 0, "bindings->prop_bindings.data" }, + { "maya_arnold_textures_6100_binary", 12369, -1, 0, 0, 686, 0, 0, "bindings->prop_bindings.data" }, + { "maya_arnold_textures_6100_binary", 12371, -1, 0, 6389, 0, 0, 0, "ufbxi_sort_shader_prop_bindings(uc, bindings->prop_bind..." }, + { "maya_arnold_textures_6100_binary", 12683, -1, 0, 1349, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_shader)..." }, + { "maya_arnold_textures_6100_binary", 12683, -1, 0, 5460, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_shader)..." }, + { "maya_arnold_textures_6100_binary", 12685, -1, 0, 1514, 0, 0, 0, "ufbxi_read_binding_table(uc, node, &info)" }, + { "maya_arnold_textures_6100_binary", 12685, -1, 0, 6246, 0, 0, 0, "ufbxi_read_binding_table(uc, node, &info)" }, + { "maya_arnold_textures_6100_binary", 18641, -1, 0, 1754, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &shader->bindings, &shader..." }, + { "maya_arnold_textures_6100_binary", 18641, -1, 0, 6945, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &shader->bindings, &shader..." }, + { "maya_auto_clamp_7100_ascii", 8534, -1, 0, 3181, 0, 0, 0, "v" }, + { "maya_auto_clamp_7100_ascii", 8534, -1, 0, 724, 0, 0, 0, "v" }, + { "maya_auto_clamp_7100_ascii", 8747, -1, 0, 3200, 0, 0, 0, "v" }, + { "maya_cache_sine_6100_binary", 12660, -1, 0, 1216, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_cache_d..." }, + { "maya_cache_sine_6100_binary", 12660, -1, 0, 4854, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_cache_d..." }, + { "maya_cache_sine_6100_binary", 12705, -1, 0, 1284, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_cache_f..." }, + { "maya_cache_sine_6100_binary", 12705, -1, 0, 5100, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_cache_f..." }, + { "maya_cache_sine_6100_binary", 18336, -1, 0, 1471, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&cache->fil..." }, + { "maya_cache_sine_6100_binary", 18336, -1, 0, 5703, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&cache->fil..." }, + { "maya_cache_sine_6100_binary", 18337, -1, 0, 1472, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&cache->raw..." }, + { "maya_cache_sine_6100_binary", 18337, -1, 0, 5707, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&cache->raw..." }, + { "maya_cache_sine_6100_binary", 18471, -1, 0, 1476, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &mesh->cache_deformers, &m..." }, + { "maya_cache_sine_6100_binary", 18471, -1, 0, 5719, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &mesh->cache_deformers, &m..." }, + { "maya_cache_sine_6100_binary", 20290, -1, 0, 1627, 0, 0, 0, "ufbxi_grow_array_size((cc->ator_tmp), sizeof(**(&cc->na..." }, + { "maya_cache_sine_6100_binary", 20290, -1, 0, 6710, 0, 0, 0, "ufbxi_grow_array_size((cc->ator_tmp), sizeof(**(&cc->na..." }, + { "maya_cache_sine_6100_binary", 20294, -1, 0, 6712, 0, 0, 0, "ufbxi_push_string_place_str(&cc->string_pool, &cc->chan..." }, + { "maya_cache_sine_6100_binary", 20307, -1, 0, 1628, 0, 0, 0, "frame" }, + { "maya_cache_sine_6100_binary", 20307, -1, 0, 6713, 0, 0, 0, "frame" }, + { "maya_cache_sine_6100_binary", 20392, -1, 0, 1625, 0, 0, 0, "ufbxi_grow_array_size((cc->ator_tmp), sizeof(**(&cc->tm..." }, + { "maya_cache_sine_6100_binary", 20392, -1, 0, 6704, 0, 0, 0, "ufbxi_grow_array_size((cc->ator_tmp), sizeof(**(&cc->tm..." }, + { "maya_cache_sine_6100_binary", 20413, -1, 0, 1621, 0, 0, 0, "extra" }, + { "maya_cache_sine_6100_binary", 20413, -1, 0, 6684, 0, 0, 0, "extra" }, + { "maya_cache_sine_6100_binary", 20415, -1, 0, 0, 247, 0, 0, "ufbxi_push_string_place_str(&cc->string_pool, extra, 0)" }, + { "maya_cache_sine_6100_binary", 20415, -1, 0, 6686, 0, 0, 0, "ufbxi_push_string_place_str(&cc->string_pool, extra, 0)" }, + { "maya_cache_sine_6100_binary", 20420, -1, 0, 0, 250, 0, 0, "cc->cache.extra_info.data" }, + { "maya_cache_sine_6100_binary", 20420, -1, 0, 0, 500, 0, 0, "cc->cache.extra_info.data" }, + { "maya_cache_sine_6100_binary", 20453, -1, 0, 1624, 0, 0, 0, "cc->channels" }, + { "maya_cache_sine_6100_binary", 20453, -1, 0, 6696, 0, 0, 0, "cc->channels" }, + { "maya_cache_sine_6100_binary", 20464, -1, 0, 6698, 0, 0, 0, "ufbxi_push_string_place_str(&cc->string_pool, &channel-..." }, + { "maya_cache_sine_6100_binary", 20465, -1, 0, 0, 251, 0, 0, "ufbxi_push_string_place_str(&cc->string_pool, &channel-..." }, + { "maya_cache_sine_6100_binary", 20465, -1, 0, 6699, 0, 0, 0, "ufbxi_push_string_place_str(&cc->string_pool, &channel-..." }, + { "maya_cache_sine_6100_binary", 20481, -1, 0, 1625, 0, 0, 0, "ufbxi_cache_sort_tmp_channels(cc, cc->channels, cc->num..." }, + { "maya_cache_sine_6100_binary", 20481, -1, 0, 6704, 0, 0, 0, "ufbxi_cache_sort_tmp_channels(cc, cc->channels, cc->num..." }, + { "maya_cache_sine_6100_binary", 20494, -1, 0, 1487, 0, 0, 0, "doc" }, + { "maya_cache_sine_6100_binary", 20494, -1, 0, 5748, 0, 0, 0, "doc" }, + { "maya_cache_sine_6100_binary", 20498, -1, 0, 1621, 0, 0, 0, "xml_ok" }, + { "maya_cache_sine_6100_binary", 20498, -1, 0, 6684, 0, 0, 0, "xml_ok" }, + { "maya_cache_sine_6100_binary", 20506, -1, 0, 0, 253, 0, 0, "ufbxi_push_string_place_str(&cc->string_pool, &cc->stre..." }, + { "maya_cache_sine_6100_binary", 20506, -1, 0, 5747, 0, 0, 0, "ufbxi_push_string_place_str(&cc->string_pool, &cc->stre..." }, + { "maya_cache_sine_6100_binary", 20520, -1, 0, 1627, 0, 0, 0, "ufbxi_cache_load_mc(cc)" }, + { "maya_cache_sine_6100_binary", 20520, -1, 0, 6710, 0, 0, 0, "ufbxi_cache_load_mc(cc)" }, + { "maya_cache_sine_6100_binary", 20522, -1, 0, 1487, 0, 0, 0, "ufbxi_cache_load_xml(cc)" }, + { "maya_cache_sine_6100_binary", 20522, -1, 0, 5748, 0, 0, 0, "ufbxi_cache_load_xml(cc)" }, + { "maya_cache_sine_6100_binary", 20560, -1, 0, 1626, 0, 0, 0, "name_buf" }, + { "maya_cache_sine_6100_binary", 20560, -1, 0, 6706, 0, 0, 0, "name_buf" }, + { "maya_cache_sine_6100_binary", 20581, -1, 0, 1627, 0, 0, 0, "ufbxi_cache_try_open_file(cc, filename, ((void *)0), &f..." }, + { "maya_cache_sine_6100_binary", 20581, -1, 0, 6708, 0, 0, 0, "ufbxi_cache_try_open_file(cc, filename, ((void *)0), &f..." }, + { "maya_cache_sine_6100_binary", 20645, -1, 0, 1689, 0, 0, 0, "ufbxi_grow_array_size((cc->ator_tmp), sizeof(**(&cc->tm..." }, + { "maya_cache_sine_6100_binary", 20645, -1, 0, 6952, 0, 0, 0, "ufbxi_grow_array_size((cc->ator_tmp), sizeof(**(&cc->tm..." }, + { "maya_cache_sine_6100_binary", 20674, -1, 0, 1690, 0, 0, 0, "chan" }, + { "maya_cache_sine_6100_binary", 20674, -1, 0, 6954, 0, 0, 0, "chan" }, + { "maya_cache_sine_6100_binary", 20704, -1, 0, 0, 255, 0, 0, "cc->cache.channels.data" }, + { "maya_cache_sine_6100_binary", 20704, -1, 0, 0, 510, 0, 0, "cc->cache.channels.data" }, + { "maya_cache_sine_6100_binary", 20728, -1, 0, 1486, 0, 0, 0, "filename_data" }, + { "maya_cache_sine_6100_binary", 20728, -1, 0, 5745, 0, 0, 0, "filename_data" }, + { "maya_cache_sine_6100_binary", 20735, -1, 0, 1487, 0, 0, 0, "ufbxi_cache_try_open_file(cc, filename_copy, ((void *)0..." }, + { "maya_cache_sine_6100_binary", 20735, -1, 0, 5747, 0, 0, 0, "ufbxi_cache_try_open_file(cc, filename_copy, ((void *)0..." }, + { "maya_cache_sine_6100_binary", 20743, -1, 0, 1626, 0, 0, 0, "ufbxi_cache_load_frame_files(cc)" }, + { "maya_cache_sine_6100_binary", 20743, -1, 0, 6706, 0, 0, 0, "ufbxi_cache_load_frame_files(cc)" }, + { "maya_cache_sine_6100_binary", 20748, -1, 0, 0, 254, 0, 0, "cc->cache.frames.data" }, + { "maya_cache_sine_6100_binary", 20748, -1, 0, 0, 508, 0, 0, "cc->cache.frames.data" }, + { "maya_cache_sine_6100_binary", 20750, -1, 0, 1689, 0, 0, 0, "ufbxi_cache_sort_frames(cc, cc->cache.frames.data, cc->..." }, + { "maya_cache_sine_6100_binary", 20750, -1, 0, 6952, 0, 0, 0, "ufbxi_cache_sort_frames(cc, cc->cache.frames.data, cc->..." }, + { "maya_cache_sine_6100_binary", 20751, -1, 0, 1690, 0, 0, 0, "ufbxi_cache_setup_channels(cc)" }, + { "maya_cache_sine_6100_binary", 20751, -1, 0, 6954, 0, 0, 0, "ufbxi_cache_setup_channels(cc)" }, + { "maya_cache_sine_6100_binary", 20755, -1, 0, 0, 256, 0, 0, "cc->imp" }, + { "maya_cache_sine_6100_binary", 20755, -1, 0, 0, 512, 0, 0, "cc->imp" }, + { "maya_cache_sine_6100_binary", 20967, -1, 0, 1483, 0, 0, 0, "file" }, + { "maya_cache_sine_6100_binary", 20967, -1, 0, 5739, 0, 0, 0, "file" }, + { "maya_cache_sine_6100_binary", 20977, -1, 0, 1485, 0, 0, 0, "files" }, + { "maya_cache_sine_6100_binary", 20977, -1, 0, 5743, 0, 0, 0, "files" }, + { "maya_cache_sine_6100_binary", 20985, -1, 0, 1486, 0, 0, 0, "ufbxi_load_external_cache(uc, file)" }, + { "maya_cache_sine_6100_binary", 20985, -1, 0, 5745, 0, 0, 0, "ufbxi_load_external_cache(uc, file)" }, + { "maya_cache_sine_6100_binary", 21430, -1, 0, 1483, 0, 0, 0, "ufbxi_load_external_files(uc)" }, + { "maya_cache_sine_6100_binary", 21430, -1, 0, 5739, 0, 0, 0, "ufbxi_load_external_files(uc)" }, + { "maya_cache_sine_6100_binary", 6086, -1, 0, 1488, 0, 0, 0, "ufbxi_grow_array_size((xc->ator), sizeof(**(&xc->tok)),..." }, + { "maya_cache_sine_6100_binary", 6086, -1, 0, 5750, 0, 0, 0, "ufbxi_grow_array_size((xc->ator), sizeof(**(&xc->tok)),..." }, + { "maya_cache_sine_6100_binary", 6121, -1, 0, 1488, 0, 0, 0, "ufbxi_xml_push_token_char(xc, buf[(ix - suffix_len) & w..." }, + { "maya_cache_sine_6100_binary", 6121, -1, 0, 5750, 0, 0, 0, "ufbxi_xml_push_token_char(xc, buf[(ix - suffix_len) & w..." }, + { "maya_cache_sine_6100_binary", 6133, -1, 0, 5773, 0, 0, 0, "ufbxi_xml_push_token_char(xc, '\\0')" }, + { "maya_cache_sine_6100_binary", 6205, -1, 0, 1537, 0, 0, 0, "ufbxi_xml_push_token_char(xc, c)" }, + { "maya_cache_sine_6100_binary", 6205, -1, 0, 5774, 0, 0, 0, "ufbxi_xml_push_token_char(xc, c)" }, + { "maya_cache_sine_6100_binary", 6210, -1, 0, 5776, 0, 0, 0, "ufbxi_xml_push_token_char(xc, '\\0')" }, + { "maya_cache_sine_6100_binary", 6214, -1, 0, 1497, 0, 0, 0, "dst->data" }, + { "maya_cache_sine_6100_binary", 6214, -1, 0, 5803, 0, 0, 0, "dst->data" }, + { "maya_cache_sine_6100_binary", 6231, -1, 0, 1537, 0, 0, 0, "ufbxi_xml_read_until(xc, ((void *)0), UFBXI_XML_CTYPE_T..." }, + { "maya_cache_sine_6100_binary", 6231, -1, 0, 5774, 0, 0, 0, "ufbxi_xml_read_until(xc, ((void *)0), UFBXI_XML_CTYPE_T..." }, + { "maya_cache_sine_6100_binary", 6242, -1, 0, 1494, 0, 0, 0, "tag" }, + { "maya_cache_sine_6100_binary", 6242, -1, 0, 5777, 0, 0, 0, "tag" }, + { "maya_cache_sine_6100_binary", 6247, -1, 0, 1495, 0, 0, 0, "tag->text.data" }, + { "maya_cache_sine_6100_binary", 6247, -1, 0, 5779, 0, 0, 0, "tag->text.data" }, + { "maya_cache_sine_6100_binary", 6254, -1, 0, 6071, 0, 0, 0, "ufbxi_xml_read_until(xc, ((void *)0), UFBXI_XML_CTYPE_N..." }, + { "maya_cache_sine_6100_binary", 6280, -1, 0, 1488, 0, 0, 0, "ufbxi_xml_skip_until_string(xc, ((void *)0), \"?>\")" }, + { "maya_cache_sine_6100_binary", 6280, -1, 0, 5750, 0, 0, 0, "ufbxi_xml_skip_until_string(xc, ((void *)0), \"?>\")" }, + { "maya_cache_sine_6100_binary", 6285, -1, 0, 1496, 0, 0, 0, "tag" }, + { "maya_cache_sine_6100_binary", 6285, -1, 0, 5781, 0, 0, 0, "tag" }, + { "maya_cache_sine_6100_binary", 6286, -1, 0, 1497, 0, 0, 0, "ufbxi_xml_read_until(xc, &tag->name, UFBXI_XML_CTYPE_NA..." }, + { "maya_cache_sine_6100_binary", 6286, -1, 0, 5783, 0, 0, 0, "ufbxi_xml_read_until(xc, &tag->name, UFBXI_XML_CTYPE_NA..." }, + { "maya_cache_sine_6100_binary", 6302, -1, 0, 1502, 0, 0, 0, "attrib" }, + { "maya_cache_sine_6100_binary", 6302, -1, 0, 5828, 0, 0, 0, "attrib" }, + { "maya_cache_sine_6100_binary", 6303, -1, 0, 1503, 0, 0, 0, "ufbxi_xml_read_until(xc, &attrib->name, UFBXI_XML_CTYPE..." }, + { "maya_cache_sine_6100_binary", 6303, -1, 0, 5830, 0, 0, 0, "ufbxi_xml_read_until(xc, &attrib->name, UFBXI_XML_CTYPE..." }, + { "maya_cache_sine_6100_binary", 6315, -1, 0, 1504, 0, 0, 0, "ufbxi_xml_read_until(xc, &attrib->value, quote_ctype)" }, + { "maya_cache_sine_6100_binary", 6315, -1, 0, 5837, 0, 0, 0, "ufbxi_xml_read_until(xc, &attrib->value, quote_ctype)" }, + { "maya_cache_sine_6100_binary", 6323, -1, 0, 1508, 0, 0, 0, "tag->attribs" }, + { "maya_cache_sine_6100_binary", 6323, -1, 0, 5864, 0, 0, 0, "tag->attribs" }, + { "maya_cache_sine_6100_binary", 6329, -1, 0, 1498, 0, 0, 0, "ufbxi_xml_parse_tag(xc, depth + 1, &closing, tag->name...." }, + { "maya_cache_sine_6100_binary", 6329, -1, 0, 5805, 0, 0, 0, "ufbxi_xml_parse_tag(xc, depth + 1, &closing, tag->name...." }, + { "maya_cache_sine_6100_binary", 6335, -1, 0, 1540, 0, 0, 0, "tag->children" }, + { "maya_cache_sine_6100_binary", 6335, -1, 0, 6077, 0, 0, 0, "tag->children" }, + { "maya_cache_sine_6100_binary", 6344, -1, 0, 1487, 0, 0, 0, "tag" }, + { "maya_cache_sine_6100_binary", 6344, -1, 0, 5748, 0, 0, 0, "tag" }, + { "maya_cache_sine_6100_binary", 6350, -1, 0, 1488, 0, 0, 0, "ufbxi_xml_parse_tag(xc, 0, &closing, ((void *)0))" }, + { "maya_cache_sine_6100_binary", 6350, -1, 0, 5750, 0, 0, 0, "ufbxi_xml_parse_tag(xc, 0, &closing, ((void *)0))" }, + { "maya_cache_sine_6100_binary", 6356, -1, 0, 1619, 0, 0, 0, "tag->children" }, + { "maya_cache_sine_6100_binary", 6356, -1, 0, 6680, 0, 0, 0, "tag->children" }, + { "maya_cache_sine_6100_binary", 6359, -1, 0, 1620, 0, 0, 0, "xc->doc" }, + { "maya_cache_sine_6100_binary", 6359, -1, 0, 6682, 0, 0, 0, "xc->doc" }, + { "maya_character_6100_binary", 12417, -1, 0, 47240, 0, 0, 0, "character" }, + { "maya_character_6100_binary", 12698, -1, 0, 47240, 0, 0, 0, "ufbxi_read_character(uc, node, &info)" }, + { "maya_character_7500_binary", 12417, -1, 0, 6220, 0, 0, 0, "character" }, + { "maya_character_7500_binary", 12698, -1, 0, 6220, 0, 0, 0, "ufbxi_read_character(uc, node, &info)" }, + { "maya_color_sets_6100_binary", 11465, -1, 0, 0, 154, 0, 0, "mesh->color_sets.data" }, + { "maya_color_sets_6100_binary", 11465, -1, 0, 0, 77, 0, 0, "mesh->color_sets.data" }, + { "maya_color_sets_6100_binary", 11512, 9966, 0, 0, 0, 0, 0, "ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_att..." }, + { "maya_cone_6100_binary", 11517, 16081, 0, 0, 0, 0, 0, "ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_att..." }, + { "maya_cone_6100_binary", 11520, 15524, 255, 0, 0, 0, 0, "ufbxi_find_val1(n, ufbxi_MappingInformationType, \"c\",..." }, + { "maya_cone_6100_binary", 11523, 15571, 255, 0, 0, 0, 0, "ufbxi_read_truncated_array(uc, &mesh->edge_crease.data,..." }, + { "maya_constraint_zoo_6100_binary", 12443, -1, 0, 12979, 0, 0, 0, "constraint" }, + { "maya_constraint_zoo_6100_binary", 12443, -1, 0, 3507, 0, 0, 0, "constraint" }, + { "maya_constraint_zoo_6100_binary", 12700, -1, 0, 12979, 0, 0, 0, "ufbxi_read_constraint(uc, node, &info)" }, + { "maya_constraint_zoo_6100_binary", 12700, -1, 0, 3507, 0, 0, 0, "ufbxi_read_constraint(uc, node, &info)" }, + { "maya_constraint_zoo_6100_binary", 16980, -1, 0, 14700, 0, 0, 0, "target" }, + { "maya_constraint_zoo_6100_binary", 16980, -1, 0, 4000, 0, 0, 0, "target" }, + { "maya_constraint_zoo_6100_binary", 18947, -1, 0, 14700, 0, 0, 0, "ufbxi_add_constraint_prop(uc, constraint, (ufbx_node*)c..." }, + { "maya_constraint_zoo_6100_binary", 18947, -1, 0, 4000, 0, 0, 0, "ufbxi_add_constraint_prop(uc, constraint, (ufbx_node*)c..." }, + { "maya_constraint_zoo_6100_binary", 18953, -1, 0, 0, 315, 0, 0, "constraint->targets.data" }, + { "maya_constraint_zoo_6100_binary", 18953, -1, 0, 0, 630, 0, 0, "constraint->targets.data" }, + { "maya_cube_6100_ascii", 3276, -1, 0, 1703, 0, 0, 0, "ator->num_allocs < ator->max_allocs" }, + { "maya_cube_6100_ascii", 8070, -1, 0, 0, 0, 0, 57, "ufbxi_report_progress(uc)" }, + { "maya_cube_6100_ascii", 8210, -1, 0, 3, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&token..." }, + { "maya_cube_6100_ascii", 8210, -1, 0, 662, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&token..." }, + { "maya_cube_6100_ascii", 8287, -1, 0, 3, 0, 0, 0, "ufbxi_ascii_push_token_char(uc, token, c)" }, + { "maya_cube_6100_ascii", 8287, -1, 0, 662, 0, 0, 0, "ufbxi_ascii_push_token_char(uc, token, c)" }, + { "maya_cube_6100_ascii", 8306, -1, 0, 6, 0, 0, 0, "ufbxi_ascii_push_token_char(uc, token, c)" }, + { "maya_cube_6100_ascii", 8306, -1, 0, 669, 0, 0, 0, "ufbxi_ascii_push_token_char(uc, token, c)" }, + { "maya_cube_6100_ascii", 8335, 514, 0, 0, 0, 0, 0, "end == token->str_data + token->str_len - 1" }, + { "maya_cube_6100_ascii", 8342, 4541, 45, 0, 0, 0, 0, "end == token->str_data + token->str_len - 1" }, + { "maya_cube_6100_ascii", 8401, 190, 0, 0, 0, 0, 0, "c != '\\0'" }, + { "maya_cube_6100_ascii", 8421, 190, 0, 0, 0, 0, 0, "ufbxi_ascii_next_token(uc, &ua->token)" }, + { "maya_cube_6100_ascii", 8458, -1, 0, 1746, 0, 0, 0, "v" }, + { "maya_cube_6100_ascii", 8458, -1, 0, 273, 0, 0, 0, "v" }, + { "maya_cube_6100_ascii", 8490, 4998, 45, 0, 0, 0, 0, "ufbxi_ascii_next_token(uc, &ua->token)" }, + { "maya_cube_6100_ascii", 8530, -1, 0, 1703, 0, 0, 0, "v" }, + { "maya_cube_6100_ascii", 8530, -1, 0, 258, 0, 0, 0, "v" }, + { "maya_cube_6100_ascii", 8553, 4870, 46, 0, 0, 0, 0, "ufbxi_ascii_next_token(uc, &ua->token)" }, + { "maya_cube_6100_ascii", 8568, 514, 0, 0, 0, 0, 0, "ufbxi_ascii_next_token(uc, &ua->token)" }, + { "maya_cube_6100_ascii", 8574, 174, 0, 0, 0, 0, 0, "depth == 0" }, + { "maya_cube_6100_ascii", 8584, 12, 0, 0, 0, 0, 0, "ufbxi_ascii_accept(uc, 'N')" }, + { "maya_cube_6100_ascii", 8588, -1, 0, 0, 1, 0, 0, "name" }, + { "maya_cube_6100_ascii", 8588, -1, 0, 664, 0, 0, 0, "name" }, + { "maya_cube_6100_ascii", 8593, -1, 0, 4, 0, 0, 0, "node" }, + { "maya_cube_6100_ascii", 8593, -1, 0, 665, 0, 0, 0, "node" }, + { "maya_cube_6100_ascii", 8617, -1, 0, 1697, 0, 0, 0, "arr" }, + { "maya_cube_6100_ascii", 8617, -1, 0, 255, 0, 0, 0, "arr" }, + { "maya_cube_6100_ascii", 8634, -1, 0, 1699, 0, 0, 0, "ufbxi_push_size_zero(&uc->tmp_stack, 8, 1)" }, + { "maya_cube_6100_ascii", 8634, -1, 0, 256, 0, 0, 0, "ufbxi_push_size_zero(&uc->tmp_stack, 8, 1)" }, + { "maya_cube_6100_ascii", 8638, -1, 0, 1701, 0, 0, 0, "ufbxi_push_size_zero(&uc->tmp_stack, arr_elem_size, 4)" }, + { "maya_cube_6100_ascii", 8638, -1, 0, 257, 0, 0, 0, "ufbxi_push_size_zero(&uc->tmp_stack, arr_elem_size, 4)" }, + { "maya_cube_6100_ascii", 8667, 4870, 46, 0, 0, 0, 0, "ufbxi_ascii_read_float_array(uc, (char)arr_type, &num_r..." }, + { "maya_cube_6100_ascii", 8669, 4998, 45, 0, 0, 0, 0, "ufbxi_ascii_read_int_array(uc, (char)arr_type, &num_rea..." }, + { "maya_cube_6100_ascii", 8714, -1, 0, 0, 3, 0, 0, "ufbxi_push_sanitized_string(&uc->string_pool, &v->s, st..." }, + { "maya_cube_6100_ascii", 8714, -1, 0, 690, 0, 0, 0, "ufbxi_push_sanitized_string(&uc->string_pool, &v->s, st..." }, + { "maya_cube_6100_ascii", 8744, -1, 0, 2401, 0, 0, 0, "v" }, + { "maya_cube_6100_ascii", 8744, -1, 0, 492, 0, 0, 0, "v" }, + { "maya_cube_6100_ascii", 8745, -1, 0, 1775, 0, 0, 0, "v" }, + { "maya_cube_6100_ascii", 8748, -1, 0, 1951, 0, 0, 0, "v" }, + { "maya_cube_6100_ascii", 8776, -1, 0, 1738, 0, 0, 0, "v" }, + { "maya_cube_6100_ascii", 8855, -1, 0, 1798, 0, 0, 0, "arr_data" }, + { "maya_cube_6100_ascii", 8855, -1, 0, 285, 0, 0, 0, "arr_data" }, + { "maya_cube_6100_ascii", 8871, -1, 0, 675, 0, 0, 0, "node->vals" }, + { "maya_cube_6100_ascii", 8871, -1, 0, 8, 0, 0, 0, "node->vals" }, + { "maya_cube_6100_ascii", 8881, 174, 11, 0, 0, 0, 0, "ufbxi_ascii_parse_node(uc, depth + 1, parse_state, &end..." }, + { "maya_cube_6100_ascii", 8888, -1, 0, 20, 0, 0, 0, "node->children" }, + { "maya_cube_6100_ascii", 8888, -1, 0, 714, 0, 0, 0, "node->children" }, + { "maya_cube_6100_ascii", 9428, -1, 0, 3, 0, 0, 0, "ufbxi_ascii_next_token(uc, &uc->ascii.token)" }, + { "maya_cube_6100_ascii", 9428, -1, 0, 662, 0, 0, 0, "ufbxi_ascii_next_token(uc, &uc->ascii.token)" }, + { "maya_cube_6100_ascii", 9445, 100, 33, 0, 0, 0, 0, "ufbxi_ascii_parse_node(uc, 0, state, p_end, buf, 1)" }, + { "maya_cube_6100_binary", 10018, 1442, 0, 0, 0, 0, 0, "ufbxi_get_val2(node, \"SC\", &prop->name, (char**)&type..." }, + { "maya_cube_6100_binary", 10093, -1, 0, 2080, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_6100_binary", 10093, -1, 0, 393, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_6100_binary", 10135, -1, 0, 0, 116, 0, 0, "props->props.data" }, + { "maya_cube_6100_binary", 10135, -1, 0, 0, 58, 0, 0, "props->props.data" }, + { "maya_cube_6100_binary", 10138, 1442, 0, 0, 0, 0, 0, "ufbxi_read_property(uc, &node->children[i], &props->pro..." }, + { "maya_cube_6100_binary", 10141, -1, 0, 2080, 0, 0, 0, "ufbxi_sort_properties(uc, props->props.data, props->pro..." }, + { "maya_cube_6100_binary", 10141, -1, 0, 393, 0, 0, 0, "ufbxi_sort_properties(uc, props->props.data, props->pro..." }, + { "maya_cube_6100_binary", 10149, -1, 0, 0, 96, 0, 0, "ufbxi_read_properties(uc, node, &uc->scene.metadata.sce..." }, + { "maya_cube_6100_binary", 10149, -1, 0, 2335, 0, 0, 0, "ufbxi_read_properties(uc, node, &uc->scene.metadata.sce..." }, + { "maya_cube_6100_binary", 10161, 35, 1, 0, 0, 0, 0, "ufbxi_parse_toplevel_child(uc, &child)" }, + { "maya_cube_6100_binary", 10309, 954, 1, 0, 0, 0, 0, "ufbxi_parse_toplevel_child(uc, &object)" }, + { "maya_cube_6100_binary", 10316, -1, 0, 1065, 0, 0, 0, "tmpl" }, + { "maya_cube_6100_binary", 10316, -1, 0, 72, 0, 0, 0, "tmpl" }, + { "maya_cube_6100_binary", 10317, 1022, 0, 0, 0, 0, 0, "ufbxi_get_val1(object, \"C\", (char**)&tmpl->type)" }, + { "maya_cube_6100_binary", 10344, -1, 0, 0, 25, 0, 0, "uc->templates" }, + { "maya_cube_6100_binary", 10344, -1, 0, 0, 50, 0, 0, "uc->templates" }, + { "maya_cube_6100_binary", 10396, -1, 0, 2082, 0, 0, 0, "ptr" }, + { "maya_cube_6100_binary", 10396, -1, 0, 394, 0, 0, 0, "ptr" }, + { "maya_cube_6100_binary", 10431, -1, 0, 2077, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, type, 0)" }, + { "maya_cube_6100_binary", 10432, -1, 0, 0, 57, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, name, 0)" }, + { "maya_cube_6100_binary", 10432, -1, 0, 2078, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, name, 0)" }, + { "maya_cube_6100_binary", 10444, -1, 0, 46, 0, 0, 0, "entry" }, + { "maya_cube_6100_binary", 10444, -1, 0, 989, 0, 0, 0, "entry" }, + { "maya_cube_6100_binary", 10474, -1, 0, 2087, 0, 0, 0, "entry" }, + { "maya_cube_6100_binary", 10474, -1, 0, 395, 0, 0, 0, "entry" }, + { "maya_cube_6100_binary", 10489, -1, 0, 42, 0, 0, 0, "((size_t*)ufbxi_push_size_copy((&uc->tmp_typed_element_..." }, + { "maya_cube_6100_binary", 10489, -1, 0, 981, 0, 0, 0, "((size_t*)ufbxi_push_size_copy((&uc->tmp_typed_element_..." }, + { "maya_cube_6100_binary", 10490, -1, 0, 43, 0, 0, 0, "((size_t*)ufbxi_push_size_copy((&uc->tmp_element_offset..." }, + { "maya_cube_6100_binary", 10490, -1, 0, 983, 0, 0, 0, "((size_t*)ufbxi_push_size_copy((&uc->tmp_element_offset..." }, + { "maya_cube_6100_binary", 10494, -1, 0, 44, 0, 0, 0, "elem" }, + { "maya_cube_6100_binary", 10494, -1, 0, 985, 0, 0, 0, "elem" }, + { "maya_cube_6100_binary", 10502, -1, 0, 45, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_element..." }, + { "maya_cube_6100_binary", 10502, -1, 0, 987, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_element..." }, + { "maya_cube_6100_binary", 10504, -1, 0, 46, 0, 0, 0, "ufbxi_insert_fbx_id(uc, info->fbx_id, element_id)" }, + { "maya_cube_6100_binary", 10504, -1, 0, 989, 0, 0, 0, "ufbxi_insert_fbx_id(uc, info->fbx_id, element_id)" }, + { "maya_cube_6100_binary", 10516, -1, 0, 2757, 0, 0, 0, "((size_t*)ufbxi_push_size_copy((&uc->tmp_typed_element_..." }, + { "maya_cube_6100_binary", 10516, -1, 0, 581, 0, 0, 0, "((size_t*)ufbxi_push_size_copy((&uc->tmp_typed_element_..." }, + { "maya_cube_6100_binary", 10517, -1, 0, 2759, 0, 0, 0, "((size_t*)ufbxi_push_size_copy((&uc->tmp_element_offset..." }, + { "maya_cube_6100_binary", 10517, -1, 0, 582, 0, 0, 0, "((size_t*)ufbxi_push_size_copy((&uc->tmp_element_offset..." }, + { "maya_cube_6100_binary", 10521, -1, 0, 2761, 0, 0, 0, "elem" }, + { "maya_cube_6100_binary", 10521, -1, 0, 583, 0, 0, 0, "elem" }, + { "maya_cube_6100_binary", 10531, -1, 0, 2763, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_element..." }, + { "maya_cube_6100_binary", 10531, -1, 0, 584, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_element..." }, + { "maya_cube_6100_binary", 10536, -1, 0, 2765, 0, 0, 0, "ufbxi_insert_fbx_id(uc, fbx_id, element_id)" }, + { "maya_cube_6100_binary", 10547, -1, 0, 2116, 0, 0, 0, "conn" }, + { "maya_cube_6100_binary", 10547, -1, 0, 407, 0, 0, 0, "conn" }, + { "maya_cube_6100_binary", 10648, -1, 0, 2118, 0, 0, 0, "elem_node" }, + { "maya_cube_6100_binary", 10648, -1, 0, 408, 0, 0, 0, "elem_node" }, + { "maya_cube_6100_binary", 10649, -1, 0, 2126, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "maya_cube_6100_binary", 10772, 7295, 255, 0, 0, 0, 0, "data" }, + { "maya_cube_6100_binary", 10773, 7448, 71, 0, 0, 0, 0, "data->size % num_components == 0" }, + { "maya_cube_6100_binary", 10789, 7345, 0, 0, 0, 0, 0, "ufbxi_find_val1(node, ufbxi_MappingInformationType, \"C..." }, + { "maya_cube_6100_binary", 10840, 9992, 14, 0, 0, 0, 0, "Invalid mapping" }, + { "maya_cube_6100_binary", 10875, 7377, 14, 0, 0, 0, 0, "Invalid mapping" }, + { "maya_cube_6100_binary", 10885, 10572, 255, 0, 0, 0, 0, "arr" }, + { "maya_cube_6100_binary", 10929, -1, 0, 2114, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_6100_binary", 10936, -1, 0, 2115, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_6100_binary", 11099, -1, 0, 0, 124, 0, 0, "mesh->faces.data" }, + { "maya_cube_6100_binary", 11099, -1, 0, 0, 62, 0, 0, "mesh->faces.data" }, + { "maya_cube_6100_binary", 11125, 6763, 0, 0, 0, 0, 0, "(size_t)ix < mesh->num_vertices" }, + { "maya_cube_6100_binary", 11139, -1, 0, 0, 126, 0, 0, "mesh->vertex_first_index.data" }, + { "maya_cube_6100_binary", 11139, -1, 0, 0, 63, 0, 0, "mesh->vertex_first_index.data" }, + { "maya_cube_6100_binary", 11353, -1, 0, 2103, 0, 0, 0, "mesh" }, + { "maya_cube_6100_binary", 11353, -1, 0, 403, 0, 0, 0, "mesh" }, + { "maya_cube_6100_binary", 11374, 6763, 23, 0, 0, 0, 0, "vertices->size % 3 == 0" }, + { "maya_cube_6100_binary", 11384, -1, 0, 0, 438, 0, 0, "index_data" }, + { "maya_cube_6100_binary", 11384, -1, 0, 0, 876, 0, 0, "index_data" }, + { "maya_cube_6100_binary", 11402, 7000, 23, 0, 0, 0, 0, "Non-negated last index" }, + { "maya_cube_6100_binary", 11411, -1, 0, 0, 122, 0, 0, "edges" }, + { "maya_cube_6100_binary", 11411, -1, 0, 0, 61, 0, 0, "edges" }, + { "maya_cube_6100_binary", 11421, 7000, 0, 0, 0, 0, 0, "Edge index out of bounds" }, + { "maya_cube_6100_binary", 11444, 6763, 0, 0, 0, 0, 0, "ufbxi_process_indices(uc, mesh, index_data)" }, + { "maya_cube_6100_binary", 11459, -1, 0, 2110, 0, 0, 0, "bitangents" }, + { "maya_cube_6100_binary", 11459, -1, 0, 405, 0, 0, 0, "bitangents" }, + { "maya_cube_6100_binary", 11460, -1, 0, 2112, 0, 0, 0, "tangents" }, + { "maya_cube_6100_binary", 11460, -1, 0, 406, 0, 0, 0, "tangents" }, + { "maya_cube_6100_binary", 11464, -1, 0, 0, 128, 0, 0, "mesh->uv_sets.data" }, + { "maya_cube_6100_binary", 11464, -1, 0, 0, 64, 0, 0, "mesh->uv_sets.data" }, + { "maya_cube_6100_binary", 11474, 7295, 255, 0, 0, 0, 0, "ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_att..." }, + { "maya_cube_6100_binary", 11480, 8164, 255, 0, 0, 0, 0, "ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_att..." }, + { "maya_cube_6100_binary", 11488, 9038, 255, 0, 0, 0, 0, "ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_att..." }, + { "maya_cube_6100_binary", 11500, 9906, 255, 0, 0, 0, 0, "ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_att..." }, + { "maya_cube_6100_binary", 11527, 10525, 255, 0, 0, 0, 0, "ufbxi_find_val1(n, ufbxi_MappingInformationType, \"c\",..." }, + { "maya_cube_6100_binary", 11530, 10572, 255, 0, 0, 0, 0, "ufbxi_read_truncated_array(uc, &mesh->edge_smoothing.da..." }, + { "maya_cube_6100_binary", 11545, 10799, 255, 0, 0, 0, 0, "ufbxi_find_val1(n, ufbxi_MappingInformationType, \"c\",..." }, + { "maya_cube_6100_binary", 11550, 10846, 255, 0, 0, 0, 0, "arr && arr->size >= 1" }, + { "maya_cube_6100_binary", 11580, 7283, 0, 0, 0, 0, 0, "!memchr(n->name, '\\0', n->name_len)" }, + { "maya_cube_6100_binary", 11624, 10070, 0, 0, 0, 0, 0, "mesh->uv_sets.count == num_uv" }, + { "maya_cube_6100_binary", 11626, 8321, 0, 0, 0, 0, 0, "num_bitangents_read == num_bitangents" }, + { "maya_cube_6100_binary", 11627, 9195, 0, 0, 0, 0, 0, "num_tangents_read == num_tangents" }, + { "maya_cube_6100_binary", 11689, -1, 0, 2114, 0, 0, 0, "ufbxi_sort_uv_sets(uc, mesh->uv_sets.data, mesh->uv_set..." }, + { "maya_cube_6100_binary", 11690, -1, 0, 2115, 0, 0, 0, "ufbxi_sort_color_sets(uc, mesh->color_sets.data, mesh->..." }, + { "maya_cube_6100_binary", 12197, -1, 0, 2544, 0, 0, 0, "material" }, + { "maya_cube_6100_binary", 12197, -1, 0, 517, 0, 0, 0, "material" }, + { "maya_cube_6100_binary", 12470, -1, 0, 2082, 0, 0, 0, "ufbxi_push_synthetic_id(uc, &attrib_info.fbx_id)" }, + { "maya_cube_6100_binary", 12470, -1, 0, 394, 0, 0, 0, "ufbxi_push_synthetic_id(uc, &attrib_info.fbx_id)" }, + { "maya_cube_6100_binary", 12476, -1, 0, 0, 59, 0, 0, "ufbxi_split_type_and_name(uc, type_and_name, &attrib_ty..." }, + { "maya_cube_6100_binary", 12476, -1, 0, 2084, 0, 0, 0, "ufbxi_split_type_and_name(uc, type_and_name, &attrib_ty..." }, + { "maya_cube_6100_binary", 12489, -1, 0, 2087, 0, 0, 0, "ufbxi_insert_fbx_attr(uc, info->fbx_id, attrib_info.fbx..." }, + { "maya_cube_6100_binary", 12489, -1, 0, 395, 0, 0, 0, "ufbxi_insert_fbx_attr(uc, info->fbx_id, attrib_info.fbx..." }, + { "maya_cube_6100_binary", 12496, -1, 0, 2089, 0, 0, 0, "((ufbx_prop*)ufbxi_push_size_copy((&uc->tmp_stack), siz..." }, + { "maya_cube_6100_binary", 12496, -1, 0, 396, 0, 0, 0, "((ufbx_prop*)ufbxi_push_size_copy((&uc->tmp_stack), siz..." }, + { "maya_cube_6100_binary", 12506, -1, 0, 0, 120, 0, 0, "attrib_info.props.props.data" }, + { "maya_cube_6100_binary", 12506, -1, 0, 0, 60, 0, 0, "attrib_info.props.props.data" }, + { "maya_cube_6100_binary", 12511, 6763, 23, 0, 0, 0, 0, "ufbxi_read_mesh(uc, node, &attrib_info)" }, + { "maya_cube_6100_binary", 12551, -1, 0, 2116, 0, 0, 0, "ufbxi_connect_oo(uc, attrib_info.fbx_id, info->fbx_id)" }, + { "maya_cube_6100_binary", 12551, -1, 0, 407, 0, 0, 0, "ufbxi_connect_oo(uc, attrib_info.fbx_id, info->fbx_id)" }, + { "maya_cube_6100_binary", 12557, 15140, 0, 0, 0, 0, 0, "ufbxi_read_properties(uc, node, &uc->scene.settings.pro..." }, + { "maya_cube_6100_binary", 12566, 1331, 1, 0, 0, 0, 0, "ufbxi_parse_toplevel_child(uc, &node)" }, + { "maya_cube_6100_binary", 12572, 15140, 0, 0, 0, 0, 0, "ufbxi_read_global_settings(uc, node)" }, + { "maya_cube_6100_binary", 12599, -1, 0, 0, 57, 0, 0, "ufbxi_split_type_and_name(uc, type_and_name, &type_str,..." }, + { "maya_cube_6100_binary", 12599, -1, 0, 2077, 0, 0, 0, "ufbxi_split_type_and_name(uc, type_and_name, &type_str,..." }, + { "maya_cube_6100_binary", 12602, 1442, 0, 0, 0, 0, 0, "ufbxi_read_properties(uc, node, &info.props)" }, + { "maya_cube_6100_binary", 12607, 6763, 23, 0, 0, 0, 0, "ufbxi_read_synthetic_attribute(uc, node, &info, type_st..." }, + { "maya_cube_6100_binary", 12609, -1, 0, 2118, 0, 0, 0, "ufbxi_read_model(uc, node, &info)" }, + { "maya_cube_6100_binary", 12609, -1, 0, 408, 0, 0, 0, "ufbxi_read_model(uc, node, &info)" }, + { "maya_cube_6100_binary", 12665, -1, 0, 2544, 0, 0, 0, "ufbxi_read_material(uc, node, &info)" }, + { "maya_cube_6100_binary", 12665, -1, 0, 517, 0, 0, 0, "ufbxi_read_material(uc, node, &info)" }, + { "maya_cube_6100_binary", 12703, -1, 0, 0, 96, 0, 0, "ufbxi_read_scene_info(uc, node)" }, + { "maya_cube_6100_binary", 12703, -1, 0, 2335, 0, 0, 0, "ufbxi_read_scene_info(uc, node)" }, + { "maya_cube_6100_binary", 12721, 16292, 1, 0, 0, 0, 0, "ufbxi_parse_toplevel_child(uc, &node)" }, + { "maya_cube_6100_binary", 12778, -1, 0, 2708, 0, 0, 0, "conn" }, + { "maya_cube_6100_binary", 12778, -1, 0, 565, 0, 0, 0, "conn" }, + { "maya_cube_6100_binary", 13097, -1, 0, 2757, 0, 0, 0, "stack" }, + { "maya_cube_6100_binary", 13097, -1, 0, 581, 0, 0, 0, "stack" }, + { "maya_cube_6100_binary", 13098, 16506, 0, 0, 0, 0, 0, "ufbxi_get_val1(node, \"S\", &stack->name)" }, + { "maya_cube_6100_binary", 13101, -1, 0, 2766, 0, 0, 0, "layer" }, + { "maya_cube_6100_binary", 13101, -1, 0, 585, 0, 0, 0, "layer" }, + { "maya_cube_6100_binary", 13103, -1, 0, 2773, 0, 0, 0, "ufbxi_connect_oo(uc, layer_fbx_id, stack_fbx_id)" }, + { "maya_cube_6100_binary", 13103, -1, 0, 587, 0, 0, 0, "ufbxi_connect_oo(uc, layer_fbx_id, stack_fbx_id)" }, + { "maya_cube_6100_binary", 13108, 16533, 65, 0, 0, 0, 0, "ufbxi_find_val2(node, ufbxi_ReferenceTime, \"LL\", &beg..." }, + { "maya_cube_6100_binary", 13128, 16459, 1, 0, 0, 0, 0, "ufbxi_parse_toplevel_child(uc, &node)" }, + { "maya_cube_6100_binary", 13132, 16506, 0, 0, 0, 0, 0, "ufbxi_read_take(uc, node)" }, + { "maya_cube_6100_binary", 13154, 0, 76, 0, 0, 0, 0, "ufbxi_parse_toplevel(uc, ufbxi_FBXHeaderExtension)" }, + { "maya_cube_6100_binary", 13155, 35, 1, 0, 0, 0, 0, "ufbxi_read_header_extension(uc)" }, + { "maya_cube_6100_binary", 13168, -1, 0, 41, 0, 0, 0, "ufbxi_init_node_prop_names(uc)" }, + { "maya_cube_6100_binary", 13168, -1, 0, 779, 0, 0, 0, "ufbxi_init_node_prop_names(uc)" }, + { "maya_cube_6100_binary", 13180, -1, 0, 979, 0, 0, 0, "root_name" }, + { "maya_cube_6100_binary", 13189, -1, 0, 42, 0, 0, 0, "root" }, + { "maya_cube_6100_binary", 13189, -1, 0, 981, 0, 0, 0, "root" }, + { "maya_cube_6100_binary", 13191, -1, 0, 47, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "maya_cube_6100_binary", 13191, -1, 0, 991, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "maya_cube_6100_binary", 13195, 59, 255, 0, 0, 0, 0, "ufbxi_parse_toplevel(uc, ufbxi_Definitions)" }, + { "maya_cube_6100_binary", 13196, 954, 1, 0, 0, 0, 0, "ufbxi_read_definitions(uc)" }, + { "maya_cube_6100_binary", 13199, 954, 255, 0, 0, 0, 0, "ufbxi_parse_toplevel(uc, ufbxi_Objects)" }, + { "maya_cube_6100_binary", 13203, 0, 0, 0, 0, 0, 0, "uc->top_node" }, + { "maya_cube_6100_binary", 13205, 1331, 1, 0, 0, 0, 0, "ufbxi_read_objects(uc)" }, + { "maya_cube_6100_binary", 13208, 16288, 1, 0, 0, 0, 0, "ufbxi_parse_toplevel(uc, ufbxi_Connections)" }, + { "maya_cube_6100_binary", 13209, 16292, 1, 0, 0, 0, 0, "ufbxi_read_connections(uc)" }, + { "maya_cube_6100_binary", 13214, 16309, 64, 0, 0, 0, 0, "ufbxi_parse_toplevel(uc, ufbxi_Takes)" }, + { "maya_cube_6100_binary", 13215, 16459, 1, 0, 0, 0, 0, "ufbxi_read_takes(uc)" }, + { "maya_cube_6100_binary", 13219, 16470, 65, 0, 0, 0, 0, "ufbxi_parse_toplevel(uc, ufbxi_GlobalSettings)" }, + { "maya_cube_6100_binary", 13785, -1, 0, 0, 143, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &uc->scen..." }, + { "maya_cube_6100_binary", 13785, -1, 0, 2903, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &uc->scen..." }, + { "maya_cube_6100_binary", 13786, -1, 0, 2905, 0, 0, 0, "ufbxi_push_string_place_blob(&uc->string_pool, &uc->sce..." }, + { "maya_cube_6100_binary", 13794, -1, 0, 0, 144, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &uc->scen..." }, + { "maya_cube_6100_binary", 13794, -1, 0, 2906, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &uc->scen..." }, + { "maya_cube_6100_binary", 13795, -1, 0, 2908, 0, 0, 0, "ufbxi_push_string_place_blob(&uc->string_pool, &uc->sce..." }, + { "maya_cube_6100_binary", 15331, -1, 0, 2909, 0, 0, 0, "elements" }, + { "maya_cube_6100_binary", 15335, -1, 0, 2911, 0, 0, 0, "tmp_connections" }, + { "maya_cube_6100_binary", 15338, -1, 0, 2913, 0, 0, 0, "pre_connections" }, + { "maya_cube_6100_binary", 15341, -1, 0, 2915, 0, 0, 0, "instance_counts" }, + { "maya_cube_6100_binary", 15344, -1, 0, 2917, 0, 0, 0, "modify_not_supported" }, + { "maya_cube_6100_binary", 15347, -1, 0, 2918, 0, 0, 0, "fbx_ids" }, + { "maya_cube_6100_binary", 15462, -1, 0, 2946, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_6100_binary", 15486, -1, 0, 2932, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_6100_binary", 15522, -1, 0, 2924, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_6100_binary", 15542, -1, 0, 2922, 0, 0, 0, "tmp_connections" }, + { "maya_cube_6100_binary", 15542, -1, 0, 631, 0, 0, 0, "tmp_connections" }, + { "maya_cube_6100_binary", 15546, -1, 0, 0, 147, 0, 0, "uc->scene.connections_src.data" }, + { "maya_cube_6100_binary", 15546, -1, 0, 0, 294, 0, 0, "uc->scene.connections_src.data" }, + { "maya_cube_6100_binary", 15606, -1, 0, 0, 148, 0, 0, "uc->scene.connections_dst.data" }, + { "maya_cube_6100_binary", 15606, -1, 0, 0, 296, 0, 0, "uc->scene.connections_dst.data" }, + { "maya_cube_6100_binary", 15608, -1, 0, 2924, 0, 0, 0, "ufbxi_sort_connections(uc, uc->scene.connections_src.da..." }, + { "maya_cube_6100_binary", 15609, -1, 0, 2925, 0, 0, 0, "ufbxi_sort_connections(uc, uc->scene.connections_dst.da..." }, + { "maya_cube_6100_binary", 15748, -1, 0, 2926, 0, 0, 0, "node_ids" }, + { "maya_cube_6100_binary", 15748, -1, 0, 632, 0, 0, 0, "node_ids" }, + { "maya_cube_6100_binary", 15751, -1, 0, 2928, 0, 0, 0, "node_ptrs" }, + { "maya_cube_6100_binary", 15751, -1, 0, 633, 0, 0, 0, "node_ptrs" }, + { "maya_cube_6100_binary", 15762, -1, 0, 2930, 0, 0, 0, "node_offsets" }, + { "maya_cube_6100_binary", 15762, -1, 0, 634, 0, 0, 0, "node_offsets" }, + { "maya_cube_6100_binary", 15803, -1, 0, 2932, 0, 0, 0, "ufbxi_sort_node_ptrs(uc, node_ptrs, num_nodes)" }, + { "maya_cube_6100_binary", 15807, -1, 0, 2933, 0, 0, 0, "p_offset" }, + { "maya_cube_6100_binary", 15807, -1, 0, 635, 0, 0, 0, "p_offset" }, + { "maya_cube_6100_binary", 15881, -1, 0, 2947, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "maya_cube_6100_binary", 15881, -1, 0, 641, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "maya_cube_6100_binary", 15890, -1, 0, 0, 155, 0, 0, "list->data" }, + { "maya_cube_6100_binary", 15890, -1, 0, 0, 310, 0, 0, "list->data" }, + { "maya_cube_6100_binary", 15903, -1, 0, 2949, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "maya_cube_6100_binary", 15903, -1, 0, 642, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "maya_cube_6100_binary", 15912, -1, 0, 0, 156, 0, 0, "list->data" }, + { "maya_cube_6100_binary", 15912, -1, 0, 0, 312, 0, 0, "list->data" }, + { "maya_cube_6100_binary", 15978, -1, 0, 2951, 0, 0, 0, "((ufbx_mesh_material*)ufbxi_push_size_copy((&uc->tmp_st..." }, + { "maya_cube_6100_binary", 15978, -1, 0, 643, 0, 0, 0, "((ufbx_mesh_material*)ufbxi_push_size_copy((&uc->tmp_st..." }, + { "maya_cube_6100_binary", 15988, -1, 0, 0, 159, 0, 0, "list->data" }, + { "maya_cube_6100_binary", 15988, -1, 0, 0, 318, 0, 0, "list->data" }, + { "maya_cube_6100_binary", 16097, -1, 0, 2957, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_6100_binary", 16111, -1, 0, 2958, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_6100_binary", 18040, -1, 0, 0, 145, 0, 0, "uc->scene.elements.data" }, + { "maya_cube_6100_binary", 18040, -1, 0, 0, 290, 0, 0, "uc->scene.elements.data" }, + { "maya_cube_6100_binary", 18045, -1, 0, 0, 146, 0, 0, "element_data" }, + { "maya_cube_6100_binary", 18045, -1, 0, 0, 292, 0, 0, "element_data" }, + { "maya_cube_6100_binary", 18049, -1, 0, 2920, 0, 0, 0, "element_offsets" }, + { "maya_cube_6100_binary", 18049, -1, 0, 630, 0, 0, 0, "element_offsets" }, + { "maya_cube_6100_binary", 18060, -1, 0, 2922, 0, 0, 0, "ufbxi_resolve_connections(uc)" }, + { "maya_cube_6100_binary", 18060, -1, 0, 631, 0, 0, 0, "ufbxi_resolve_connections(uc)" }, + { "maya_cube_6100_binary", 18062, -1, 0, 2926, 0, 0, 0, "ufbxi_linearize_nodes(uc)" }, + { "maya_cube_6100_binary", 18062, -1, 0, 632, 0, 0, 0, "ufbxi_linearize_nodes(uc)" }, + { "maya_cube_6100_binary", 18068, -1, 0, 2936, 0, 0, 0, "typed_offsets" }, + { "maya_cube_6100_binary", 18068, -1, 0, 636, 0, 0, 0, "typed_offsets" }, + { "maya_cube_6100_binary", 18073, -1, 0, 0, 149, 0, 0, "typed_elems->data" }, + { "maya_cube_6100_binary", 18073, -1, 0, 0, 298, 0, 0, "typed_elems->data" }, + { "maya_cube_6100_binary", 18085, -1, 0, 0, 154, 0, 0, "uc->scene.elements_by_name.data" }, + { "maya_cube_6100_binary", 18085, -1, 0, 0, 308, 0, 0, "uc->scene.elements_by_name.data" }, + { "maya_cube_6100_binary", 18098, -1, 0, 2946, 0, 0, 0, "ufbxi_sort_name_elements(uc, uc->scene.elements_by_name..." }, + { "maya_cube_6100_binary", 18148, -1, 0, 2947, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &node->materials, &node->e..." }, + { "maya_cube_6100_binary", 18148, -1, 0, 641, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &node->materials, &node->e..." }, + { "maya_cube_6100_binary", 18190, -1, 0, 2949, 0, 0, 0, "ufbxi_fetch_src_elements(uc, &elem->instances, elem, 0,..." }, + { "maya_cube_6100_binary", 18190, -1, 0, 642, 0, 0, 0, "ufbxi_fetch_src_elements(uc, &elem->instances, elem, 0,..." }, + { "maya_cube_6100_binary", 18368, -1, 0, 0, 157, 0, 0, "zero_indices && consecutive_indices" }, + { "maya_cube_6100_binary", 18368, -1, 0, 0, 314, 0, 0, "zero_indices && consecutive_indices" }, + { "maya_cube_6100_binary", 18420, -1, 0, 2951, 0, 0, 0, "ufbxi_fetch_mesh_materials(uc, &mesh->materials, &mesh-..." }, + { "maya_cube_6100_binary", 18420, -1, 0, 643, 0, 0, 0, "ufbxi_fetch_mesh_materials(uc, &mesh->materials, &mesh-..." }, + { "maya_cube_6100_binary", 18511, -1, 0, 2953, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &stack->layers, &stack->el..." }, + { "maya_cube_6100_binary", 18511, -1, 0, 644, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &stack->layers, &stack->el..." }, + { "maya_cube_6100_binary", 18515, -1, 0, 0, 161, 0, 0, "stack->anim.layers.data" }, + { "maya_cube_6100_binary", 18515, -1, 0, 0, 322, 0, 0, "stack->anim.layers.data" }, + { "maya_cube_6100_binary", 18529, -1, 0, 0, 162, 0, 0, "layer_desc" }, + { "maya_cube_6100_binary", 18529, -1, 0, 0, 324, 0, 0, "layer_desc" }, + { "maya_cube_6100_binary", 18601, -1, 0, 2955, 0, 0, 0, "aprop" }, + { "maya_cube_6100_binary", 18601, -1, 0, 645, 0, 0, 0, "aprop" }, + { "maya_cube_6100_binary", 18605, -1, 0, 0, 163, 0, 0, "layer->anim_props.data" }, + { "maya_cube_6100_binary", 18605, -1, 0, 0, 326, 0, 0, "layer->anim_props.data" }, + { "maya_cube_6100_binary", 18607, -1, 0, 2957, 0, 0, 0, "ufbxi_sort_anim_props(uc, layer->anim_props.data, layer..." }, + { "maya_cube_6100_binary", 18884, -1, 0, 2958, 0, 0, 0, "ufbxi_sort_material_textures(uc, material->textures.dat..." }, + { "maya_cube_6100_binary", 18964, -1, 0, 0, 164, 0, 0, "descs" }, + { "maya_cube_6100_binary", 18964, -1, 0, 0, 328, 0, 0, "descs" }, + { "maya_cube_6100_binary", 21374, -1, 0, 1, 0, 0, 0, "ufbxi_load_strings(uc)" }, + { "maya_cube_6100_binary", 21375, -1, 0, 1, 0, 0, 0, "ufbxi_load_maps(uc)" }, + { "maya_cube_6100_binary", 21375, -1, 0, 575, 0, 0, 0, "ufbxi_load_maps(uc)" }, + { "maya_cube_6100_binary", 21381, 0, 76, 0, 0, 0, 0, "ufbxi_begin_parse(uc)" }, + { "maya_cube_6100_binary", 21385, 0, 76, 0, 0, 0, 0, "ufbxi_read_root(uc)" }, + { "maya_cube_6100_binary", 21388, -1, 0, 0, 143, 0, 0, "ufbxi_init_file_paths(uc)" }, + { "maya_cube_6100_binary", 21388, -1, 0, 2903, 0, 0, 0, "ufbxi_init_file_paths(uc)" }, + { "maya_cube_6100_binary", 21405, -1, 0, 2909, 0, 0, 0, "ufbxi_pre_finalize_scene(uc)" }, + { "maya_cube_6100_binary", 21410, -1, 0, 2920, 0, 0, 0, "ufbxi_finalize_scene(uc)" }, + { "maya_cube_6100_binary", 21410, -1, 0, 630, 0, 0, 0, "ufbxi_finalize_scene(uc)" }, + { "maya_cube_6100_binary", 21455, -1, 0, 0, 165, 0, 0, "imp" }, + { "maya_cube_6100_binary", 21455, -1, 0, 0, 330, 0, 0, "imp" }, + { "maya_cube_6100_binary", 2863, 6765, 255, 0, 0, 0, 0, "total <= ator->max_size - ator->current_size" }, + { "maya_cube_6100_binary", 2868, -1, 0, 1, 0, 0, 0, "ator->num_allocs < ator->max_allocs" }, + { "maya_cube_6100_binary", 2913, -1, 0, 1002, 0, 0, 0, "ator->num_allocs < ator->max_allocs" }, + { "maya_cube_6100_binary", 2913, -1, 0, 50, 0, 0, 0, "ator->num_allocs < ator->max_allocs" }, + { "maya_cube_6100_binary", 2969, -1, 0, 665, 0, 0, 0, "ator->num_allocs < ator->max_allocs" }, + { "maya_cube_6100_binary", 3224, -1, 0, 662, 0, 0, 0, "ator->num_allocs < ator->max_allocs" }, + { "maya_cube_6100_binary", 3699, -1, 0, 1, 0, 0, 0, "data" }, + { "maya_cube_6100_binary", 3757, -1, 0, 2, 0, 0, 0, "ator->num_allocs < ator->max_allocs" }, + { "maya_cube_6100_binary", 4356, -1, 0, 694, 0, 0, 0, "ufbxi_map_grow_size((&pool->map), sizeof(ufbx_string), ..." }, + { "maya_cube_6100_binary", 4381, -1, 0, 695, 0, 0, 0, "entry" }, + { "maya_cube_6100_binary", 4384, -1, 0, 0, 4, 0, 0, "dst" }, + { "maya_cube_6100_binary", 4384, -1, 0, 0, 8, 0, 0, "dst" }, + { "maya_cube_6100_binary", 4398, -1, 0, 1, 0, 0, 0, "ufbxi_map_grow_size((&pool->map), sizeof(ufbx_string), ..." }, + { "maya_cube_6100_binary", 4424, -1, 0, 2, 0, 0, 0, "entry" }, + { "maya_cube_6100_binary", 4428, -1, 0, 0, 1, 0, 0, "dst" }, + { "maya_cube_6100_binary", 4449, -1, 0, 0, 57, 0, 0, "str" }, + { "maya_cube_6100_binary", 4449, -1, 0, 671, 0, 0, 0, "str" }, + { "maya_cube_6100_binary", 4467, -1, 0, 2905, 0, 0, 0, "p_blob->data" }, + { "maya_cube_6100_binary", 5589, -1, 0, 0, 0, 0, 1, "result != UFBX_PROGRESS_CANCEL" }, + { "maya_cube_6100_binary", 5608, -1, 0, 0, 0, 1, 0, "!uc->eof" }, + { "maya_cube_6100_binary", 5610, 36, 255, 0, 0, 0, 0, "uc->read_fn" }, + { "maya_cube_6100_binary", 5694, -1, 0, 0, 0, 0, 1, "ufbxi_report_progress(uc)" }, + { "maya_cube_6100_binary", 5771, 36, 255, 0, 0, 0, 0, "ufbxi_read_bytes(uc, (size_t)to_skip)" }, + { "maya_cube_6100_binary", 7541, -1, 0, 0, 0, 7040, 0, "val" }, + { "maya_cube_6100_binary", 7544, -1, 0, 0, 0, 6793, 0, "val" }, + { "maya_cube_6100_binary", 7581, 10670, 13, 0, 0, 0, 0, "Bad multivalue array type" }, + { "maya_cube_6100_binary", 7582, 7000, 25, 0, 0, 0, 0, "Bad multivalue array type" }, + { "maya_cube_6100_binary", 7585, 6763, 25, 0, 0, 0, 0, "Bad multivalue array type" }, + { "maya_cube_6100_binary", 7607, 6765, 255, 0, 0, 0, 0, "data" }, + { "maya_cube_6100_binary", 7632, -1, 0, 0, 0, 27, 0, "header" }, + { "maya_cube_6100_binary", 7653, 24, 255, 0, 0, 0, 0, "num_values64 <= 0xffffffffui32" }, + { "maya_cube_6100_binary", 7671, -1, 0, 3, 0, 0, 0, "node" }, + { "maya_cube_6100_binary", 7671, -1, 0, 662, 0, 0, 0, "node" }, + { "maya_cube_6100_binary", 7675, -1, 0, 0, 0, 40, 0, "name" }, + { "maya_cube_6100_binary", 7677, -1, 0, 0, 1, 0, 0, "name" }, + { "maya_cube_6100_binary", 7677, -1, 0, 664, 0, 0, 0, "name" }, + { "maya_cube_6100_binary", 7693, -1, 0, 1725, 0, 0, 0, "arr" }, + { "maya_cube_6100_binary", 7693, -1, 0, 261, 0, 0, 0, "arr" }, + { "maya_cube_6100_binary", 7702, -1, 0, 0, 0, 6780, 0, "data" }, + { "maya_cube_6100_binary", 7852, 6765, 255, 0, 0, 0, 0, "arr_data" }, + { "maya_cube_6100_binary", 7853, 6763, 25, 0, 0, 0, 0, "ufbxi_binary_parse_multivalue_array(uc, dst_type, arr_d..." }, + { "maya_cube_6100_binary", 7869, -1, 0, 6, 0, 0, 0, "vals" }, + { "maya_cube_6100_binary", 7869, -1, 0, 671, 0, 0, 0, "vals" }, + { "maya_cube_6100_binary", 7877, -1, 0, 0, 0, 87, 0, "data" }, + { "maya_cube_6100_binary", 7930, 213, 255, 0, 0, 0, 0, "str" }, + { "maya_cube_6100_binary", 7940, -1, 0, 0, 4, 0, 0, "ufbxi_push_sanitized_string(&uc->string_pool, &vals[i]...." }, + { "maya_cube_6100_binary", 7940, -1, 0, 694, 0, 0, 0, "ufbxi_push_sanitized_string(&uc->string_pool, &vals[i]...." }, + { "maya_cube_6100_binary", 7955, 164, 0, 0, 0, 0, 0, "ufbxi_skip_bytes(uc, encoded_size)" }, + { "maya_cube_6100_binary", 7960, 22, 1, 0, 0, 0, 0, "Bad value type" }, + { "maya_cube_6100_binary", 7971, 66, 4, 0, 0, 0, 0, "offset <= values_end_offset" }, + { "maya_cube_6100_binary", 7973, 36, 255, 0, 0, 0, 0, "ufbxi_skip_bytes(uc, values_end_offset - offset)" }, + { "maya_cube_6100_binary", 7985, 58, 93, 0, 0, 0, 0, "current_offset == end_offset || end_offset == 0" }, + { "maya_cube_6100_binary", 7990, 70, 0, 0, 0, 0, 0, "ufbxi_binary_parse_node(uc, depth + 1, parse_state, &en..." }, + { "maya_cube_6100_binary", 7999, -1, 0, 20, 0, 0, 0, "node->children" }, + { "maya_cube_6100_binary", 7999, -1, 0, 716, 0, 0, 0, "node->children" }, + { "maya_cube_6100_binary", 8582, 0, 76, 0, 0, 0, 0, "Expected a 'Name:' token" }, + { "maya_cube_6100_binary", 8928, -1, 0, 0, 1, 0, 0, "dst" }, + { "maya_cube_6100_binary", 8928, -1, 0, 0, 2, 0, 0, "dst" }, + { "maya_cube_6100_binary", 8929, -1, 0, 5, 0, 0, 0, "((ufbx_dom_node**)ufbxi_push_size_copy((&uc->tmp_dom_no..." }, + { "maya_cube_6100_binary", 8929, -1, 0, 667, 0, 0, 0, "((ufbx_dom_node**)ufbxi_push_size_copy((&uc->tmp_dom_no..." }, + { "maya_cube_6100_binary", 8944, -1, 0, 6, 0, 0, 0, "result" }, + { "maya_cube_6100_binary", 8944, -1, 0, 669, 0, 0, 0, "result" }, + { "maya_cube_6100_binary", 8950, -1, 0, 671, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &dst->nam..." }, + { "maya_cube_6100_binary", 8955, -1, 0, 0, 303, 0, 0, "val" }, + { "maya_cube_6100_binary", 8955, -1, 0, 0, 606, 0, 0, "val" }, + { "maya_cube_6100_binary", 8983, -1, 0, 681, 0, 0, 0, "val" }, + { "maya_cube_6100_binary", 8983, -1, 0, 9, 0, 0, 0, "val" }, + { "maya_cube_6100_binary", 9000, -1, 0, 0, 3, 0, 0, "dst->values.data" }, + { "maya_cube_6100_binary", 9000, -1, 0, 0, 6, 0, 0, "dst->values.data" }, + { "maya_cube_6100_binary", 9005, -1, 0, 28, 0, 0, 0, "ufbxi_retain_dom_node(uc, child, ((void *)0))" }, + { "maya_cube_6100_binary", 9005, -1, 0, 740, 0, 0, 0, "ufbxi_retain_dom_node(uc, child, ((void *)0))" }, + { "maya_cube_6100_binary", 9010, -1, 0, 0, 25, 0, 0, "dst->children.data" }, + { "maya_cube_6100_binary", 9010, -1, 0, 0, 50, 0, 0, "dst->children.data" }, + { "maya_cube_6100_binary", 9020, -1, 0, 0, 116, 0, 0, "children" }, + { "maya_cube_6100_binary", 9020, -1, 0, 0, 58, 0, 0, "children" }, + { "maya_cube_6100_binary", 9027, -1, 0, 5, 0, 0, 0, "ufbxi_retain_dom_node(uc, node, &uc->dom_parse_toplevel..." }, + { "maya_cube_6100_binary", 9027, -1, 0, 667, 0, 0, 0, "ufbxi_retain_dom_node(uc, node, &uc->dom_parse_toplevel..." }, + { "maya_cube_6100_binary", 9034, -1, 0, 0, 1462, 0, 0, "nodes" }, + { "maya_cube_6100_binary", 9034, -1, 0, 0, 731, 0, 0, "nodes" }, + { "maya_cube_6100_binary", 9037, -1, 0, 0, 1464, 0, 0, "dom_root" }, + { "maya_cube_6100_binary", 9037, -1, 0, 0, 732, 0, 0, "dom_root" }, + { "maya_cube_6100_binary", 9052, -1, 0, 678, 0, 0, 0, "ufbxi_retain_dom_node(uc, child, ((void *)0))" }, + { "maya_cube_6100_binary", 9052, -1, 0, 9, 0, 0, 0, "ufbxi_retain_dom_node(uc, child, ((void *)0))" }, + { "maya_cube_6100_binary", 9396, -1, 0, 0, 0, 1, 0, "header" }, + { "maya_cube_6100_binary", 9435, 0, 76, 0, 0, 0, 0, "uc->version > 0" }, + { "maya_cube_6100_binary", 9447, 35, 1, 0, 0, 0, 0, "ufbxi_binary_parse_node(uc, 0, state, p_end, buf, 1)" }, + { "maya_cube_6100_binary", 9474, 0, 76, 0, 0, 0, 0, "ufbxi_ascii_parse_node(uc, 0, UFBXI_PARSE_ROOT, &end, &..." }, + { "maya_cube_6100_binary", 9476, 22, 1, 0, 0, 0, 0, "ufbxi_binary_parse_node(uc, 0, UFBXI_PARSE_ROOT, &end, ..." }, + { "maya_cube_6100_binary", 9485, -1, 0, 0, 1460, 0, 0, "ufbxi_retain_toplevel(uc, ((void *)0))" }, + { "maya_cube_6100_binary", 9485, -1, 0, 0, 730, 0, 0, "ufbxi_retain_toplevel(uc, ((void *)0))" }, + { "maya_cube_6100_binary", 9495, -1, 0, 4, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_6100_binary", 9495, -1, 0, 665, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_6100_binary", 9499, -1, 0, 5, 0, 0, 0, "ufbxi_retain_toplevel(uc, node)" }, + { "maya_cube_6100_binary", 9499, -1, 0, 667, 0, 0, 0, "ufbxi_retain_toplevel(uc, node)" }, + { "maya_cube_6100_binary", 9514, 39, 19, 0, 0, 0, 0, "ufbxi_parse_toplevel_child_imp(uc, state, &uc->tmp, &en..." }, + { "maya_cube_6100_binary", 9522, -1, 0, 1031, 0, 0, 0, "node->children" }, + { "maya_cube_6100_binary", 9522, -1, 0, 60, 0, 0, 0, "node->children" }, + { "maya_cube_6100_binary", 9526, -1, 0, 1148, 0, 0, 0, "ufbxi_retain_toplevel_child(uc, &node->children[i])" }, + { "maya_cube_6100_binary", 9526, -1, 0, 93, 0, 0, 0, "ufbxi_retain_toplevel_child(uc, &node->children[i])" }, + { "maya_cube_6100_binary", 9545, 35, 1, 0, 0, 0, 0, "ufbxi_parse_toplevel_child_imp(uc, state, &uc->tmp_pars..." }, + { "maya_cube_6100_binary", 9553, -1, 0, 678, 0, 0, 0, "ufbxi_retain_toplevel_child(uc, &uc->top_child)" }, + { "maya_cube_6100_binary", 9553, -1, 0, 9, 0, 0, 0, "ufbxi_retain_toplevel_child(uc, &uc->top_child)" }, + { "maya_cube_6100_binary", 9616, -1, 0, 1, 0, 0, 0, "ufbxi_push_string_imp(&uc->string_pool, str->data, str-..." }, + { "maya_cube_6100_binary", 9902, -1, 0, 41, 0, 0, 0, "ufbxi_map_grow_size((&uc->node_prop_set), sizeof(const ..." }, + { "maya_cube_6100_binary", 9902, -1, 0, 779, 0, 0, 0, "ufbxi_map_grow_size((&uc->node_prop_set), sizeof(const ..." }, + { "maya_cube_6100_binary", 9906, -1, 0, 781, 0, 0, 0, "pooled" }, + { "maya_cube_6100_binary", 9909, -1, 0, 783, 0, 0, 0, "entry" }, + { "maya_cube_6100_binary", 9928, -1, 0, 1, 0, 0, 0, "ufbxi_map_grow_size((&uc->prop_type_map), sizeof(ufbxi_..." }, + { "maya_cube_6100_binary", 9928, -1, 0, 575, 0, 0, 0, "ufbxi_map_grow_size((&uc->prop_type_map), sizeof(ufbxi_..." }, + { "maya_cube_6100_binary", 9931, -1, 0, 577, 0, 0, 0, "pooled" }, + { "maya_cube_6100_binary", 9934, -1, 0, 2, 0, 0, 0, "entry" }, + { "maya_cube_6100_binary", 9934, -1, 0, 579, 0, 0, 0, "entry" }, + { "maya_cube_7100_ascii", 8816, 8925, 0, 0, 0, 0, 0, "ufbxi_ascii_accept(uc, 'I')" }, + { "maya_cube_7100_ascii", 8819, 8929, 11, 0, 0, 0, 0, "ufbxi_ascii_accept(uc, 'N')" }, + { "maya_cube_7100_ascii", 8844, 8935, 33, 0, 0, 0, 0, "ufbxi_ascii_accept(uc, '}')" }, + { "maya_cube_7100_binary", 10021, 6091, 0, 0, 0, 0, 0, "ufbxi_get_val_at(node, val_ix++, 'C', (char**)&subtype_..." }, + { "maya_cube_7100_binary", 10178, 797, 0, 0, 0, 0, 0, "ufbxi_read_scene_info(uc, child)" }, + { "maya_cube_7100_binary", 10290, 3549, 1, 0, 0, 0, 0, "ufbxi_parse_toplevel_child(uc, &child)" }, + { "maya_cube_7100_binary", 10323, 4105, 0, 0, 0, 0, 0, "ufbxi_get_val1(props, \"S\", &tmpl->sub_type)" }, + { "maya_cube_7100_binary", 10335, -1, 0, 0, 58, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &tmpl->su..." }, + { "maya_cube_7100_binary", 10335, -1, 0, 1319, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &tmpl->su..." }, + { "maya_cube_7100_binary", 10338, 4176, 0, 0, 0, 0, 0, "ufbxi_read_properties(uc, props, &tmpl->props)" }, + { "maya_cube_7100_binary", 10662, -1, 0, 2933, 0, 0, 0, "elem" }, + { "maya_cube_7100_binary", 10662, -1, 0, 650, 0, 0, 0, "elem" }, + { "maya_cube_7100_binary", 12585, 12333, 255, 0, 0, 0, 0, "(info.fbx_id & (0x8000000000000000ULL)) == 0" }, + { "maya_cube_7100_binary", 12634, 12362, 0, 0, 0, 0, 0, "ufbxi_read_mesh(uc, node, &info)" }, + { "maya_cube_7100_binary", 12673, -1, 0, 2933, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_anim_st..." }, + { "maya_cube_7100_binary", 12673, -1, 0, 650, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_anim_st..." }, + { "maya_cube_7100_binary", 12675, -1, 0, 2951, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_anim_la..." }, + { "maya_cube_7100_binary", 12675, -1, 0, 656, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_anim_la..." }, + { "maya_cube_7100_binary", 13173, 59, 255, 0, 0, 0, 0, "ufbxi_parse_toplevel(uc, ufbxi_Documents)" }, + { "maya_cube_7100_binary", 13174, 3549, 1, 0, 0, 0, 0, "ufbxi_read_document(uc)" }, + { "maya_cube_7100_binary", 13221, 2241, 0, 0, 0, 0, 0, "ufbxi_read_global_settings(uc, uc->top_node)" }, + { "maya_cube_7100_binary", 13226, 18890, 74, 0, 0, 0, 0, "ufbxi_parse_toplevel(uc, ((void *)0))" }, + { "maya_cube_7100_binary", 2912, 16067, 1, 0, 0, 0, 0, "total <= ator->max_size - ator->current_size" }, + { "maya_cube_7100_binary", 5676, -1, 0, 0, 0, 0, 1434, "ufbxi_report_progress(uc)" }, + { "maya_cube_7100_binary", 5799, -1, 0, 0, 0, 12392, 0, "uc->read_fn" }, + { "maya_cube_7100_binary", 5807, -1, 0, 0, 0, 0, 1434, "ufbxi_resume_progress(uc)" }, + { "maya_cube_7100_binary", 7737, 12382, 255, 0, 0, 0, 0, "arr_data" }, + { "maya_cube_7100_binary", 7744, 16067, 1, 0, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_cube_7100_binary", 7757, 12379, 99, 0, 0, 0, 0, "encoded_size == decoded_data_size" }, + { "maya_cube_7100_binary", 7773, -1, 0, 0, 0, 12392, 0, "ufbxi_read_to(uc, decoded_data, encoded_size)" }, + { "maya_cube_7100_binary", 7830, 12384, 1, 0, 0, 0, 0, "res == (ptrdiff_t)decoded_data_size" }, + { "maya_cube_7100_binary", 7833, 12384, 255, 0, 0, 0, 0, "Bad array encoding" }, + { "maya_cube_7400_ascii", 8233, -1, 0, 0, 0, 9568, 0, "c != '\\0'" }, + { "maya_cube_7400_ascii", 8827, -1, 0, 0, 0, 9568, 0, "ufbxi_ascii_skip_until(uc, '}')" }, + { "maya_cube_7500_binary", 13714, 24, 0, 0, 0, 0, 0, "ufbxi_parse_legacy_toplevel(uc)" }, + { "maya_cube_7500_binary", 21383, 24, 0, 0, 0, 0, 0, "ufbxi_read_legacy_root(uc)" }, + { "maya_cube_7500_binary", 9578, 24, 0, 0, 0, 0, 0, "ufbxi_binary_parse_node(uc, 0, UFBXI_PARSE_ROOT, &end, ..." }, + { "maya_cube_big_endian_6100_binary", 7332, -1, 0, 3, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->s..." }, + { "maya_cube_big_endian_6100_binary", 7332, -1, 0, 662, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->s..." }, + { "maya_cube_big_endian_6100_binary", 7645, -1, 0, 4, 0, 0, 0, "header_words" }, + { "maya_cube_big_endian_6100_binary", 7645, -1, 0, 664, 0, 0, 0, "header_words" }, + { "maya_cube_big_endian_6100_binary", 9410, -1, 0, 3, 0, 0, 0, "version_word" }, + { "maya_cube_big_endian_6100_binary", 9410, -1, 0, 662, 0, 0, 0, "version_word" }, + { "maya_cube_big_endian_7100_binary", 7401, -1, 0, 2332, 0, 0, 0, "src" }, + { "maya_cube_big_endian_7100_binary", 7401, -1, 0, 453, 0, 0, 0, "src" }, + { "maya_cube_big_endian_7100_binary", 7838, -1, 0, 2332, 0, 0, 0, "ufbxi_binary_convert_array(uc, src_type, dst_type, deco..." }, + { "maya_cube_big_endian_7100_binary", 7838, -1, 0, 453, 0, 0, 0, "ufbxi_binary_convert_array(uc, src_type, dst_type, deco..." }, + { "maya_cube_big_endian_7500_binary", 7636, -1, 0, 4, 0, 0, 0, "header_words" }, + { "maya_cube_big_endian_7500_binary", 7636, -1, 0, 664, 0, 0, 0, "header_words" }, + { "maya_cube_big_endian_obj", 14005, -1, 0, 0, 12, 0, 0, "mesh->vertex_first_index.data" }, + { "maya_cube_big_endian_obj", 14005, -1, 0, 0, 24, 0, 0, "mesh->vertex_first_index.data" }, + { "maya_cube_big_endian_obj", 14022, -1, 0, 0, 13, 0, 0, "uv_set" }, + { "maya_cube_big_endian_obj", 14022, -1, 0, 0, 26, 0, 0, "uv_set" }, + { "maya_cube_big_endian_obj", 14086, -1, 0, 60, 0, 0, 0, "mesh" }, + { "maya_cube_big_endian_obj", 14086, -1, 0, 966, 0, 0, 0, "mesh" }, + { "maya_cube_big_endian_obj", 14104, -1, 0, 61, 0, 0, 0, "mesh->fbx_node && mesh->fbx_mesh" }, + { "maya_cube_big_endian_obj", 14104, -1, 0, 968, 0, 0, 0, "mesh->fbx_node && mesh->fbx_mesh" }, + { "maya_cube_big_endian_obj", 14108, -1, 0, 983, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "maya_cube_big_endian_obj", 14115, -1, 0, 66, 0, 0, 0, "ufbxi_connect_oo(uc, mesh->fbx_mesh_id, mesh->fbx_node_..." }, + { "maya_cube_big_endian_obj", 14115, -1, 0, 984, 0, 0, 0, "ufbxi_connect_oo(uc, mesh->fbx_mesh_id, mesh->fbx_node_..." }, + { "maya_cube_big_endian_obj", 14116, -1, 0, 67, 0, 0, 0, "ufbxi_connect_oo(uc, mesh->fbx_node_id, 0)" }, + { "maya_cube_big_endian_obj", 14116, -1, 0, 986, 0, 0, 0, "ufbxi_connect_oo(uc, mesh->fbx_node_id, 0)" }, + { "maya_cube_big_endian_obj", 14130, -1, 0, 0, 2, 0, 0, "groups" }, + { "maya_cube_big_endian_obj", 14130, -1, 0, 0, 4, 0, 0, "groups" }, + { "maya_cube_big_endian_obj", 14170, -1, 0, 3, 0, 0, 0, "root" }, + { "maya_cube_big_endian_obj", 14170, -1, 0, 662, 0, 0, 0, "root" }, + { "maya_cube_big_endian_obj", 14172, -1, 0, 672, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "maya_cube_big_endian_obj", 14172, -1, 0, 8, 0, 0, 0, "((uint32_t*)ufbxi_push_size_copy((&uc->tmp_node_ids), s..." }, + { "maya_cube_big_endian_obj", 14247, -1, 0, 0, 0, 0, 1, "ufbxi_report_progress(uc)" }, + { "maya_cube_big_endian_obj", 14253, -1, 0, 1055, 0, 0, 0, "new_data" }, + { "maya_cube_big_endian_obj", 14253, -1, 0, 81, 0, 0, 0, "new_data" }, + { "maya_cube_big_endian_obj", 14313, -1, 0, 674, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->o..." }, + { "maya_cube_big_endian_obj", 14313, -1, 0, 9, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->o..." }, + { "maya_cube_big_endian_obj", 14349, -1, 0, 1055, 0, 0, 0, "ufbxi_obj_read_line(uc)" }, + { "maya_cube_big_endian_obj", 14349, -1, 0, 81, 0, 0, 0, "ufbxi_obj_read_line(uc)" }, + { "maya_cube_big_endian_obj", 14350, -1, 0, 674, 0, 0, 0, "ufbxi_obj_tokenize(uc)" }, + { "maya_cube_big_endian_obj", 14350, -1, 0, 9, 0, 0, 0, "ufbxi_obj_tokenize(uc)" }, + { "maya_cube_big_endian_obj", 14368, 92, 33, 0, 0, 0, 0, "offset + read_values <= uc->obj.num_tokens" }, + { "maya_cube_big_endian_obj", 14371, -1, 0, 14, 0, 0, 0, "vals" }, + { "maya_cube_big_endian_obj", 14371, -1, 0, 697, 0, 0, 0, "vals" }, + { "maya_cube_big_endian_obj", 14376, 83, 46, 0, 0, 0, 0, "end == str.data + str.length" }, + { "maya_cube_big_endian_obj", 14425, -1, 0, 1000, 0, 0, 0, "dst" }, + { "maya_cube_big_endian_obj", 14425, -1, 0, 74, 0, 0, 0, "dst" }, + { "maya_cube_big_endian_obj", 14467, -1, 0, 60, 0, 0, 0, "ufbxi_obj_push_mesh(uc)" }, + { "maya_cube_big_endian_obj", 14467, -1, 0, 966, 0, 0, 0, "ufbxi_obj_push_mesh(uc)" }, + { "maya_cube_big_endian_obj", 14509, -1, 0, 68, 0, 0, 0, "entry" }, + { "maya_cube_big_endian_obj", 14509, -1, 0, 988, 0, 0, 0, "entry" }, + { "maya_cube_big_endian_obj", 14522, -1, 0, 69, 0, 0, 0, "group" }, + { "maya_cube_big_endian_obj", 14522, -1, 0, 990, 0, 0, 0, "group" }, + { "maya_cube_big_endian_obj", 14541, -1, 0, 70, 0, 0, 0, "face" }, + { "maya_cube_big_endian_obj", 14541, -1, 0, 992, 0, 0, 0, "face" }, + { "maya_cube_big_endian_obj", 14550, -1, 0, 71, 0, 0, 0, "p_face_mat" }, + { "maya_cube_big_endian_obj", 14550, -1, 0, 994, 0, 0, 0, "p_face_mat" }, + { "maya_cube_big_endian_obj", 14555, -1, 0, 72, 0, 0, 0, "p_face_smooth" }, + { "maya_cube_big_endian_obj", 14555, -1, 0, 996, 0, 0, 0, "p_face_smooth" }, + { "maya_cube_big_endian_obj", 14561, -1, 0, 73, 0, 0, 0, "p_face_group" }, + { "maya_cube_big_endian_obj", 14561, -1, 0, 998, 0, 0, 0, "p_face_group" }, + { "maya_cube_big_endian_obj", 14568, -1, 0, 1000, 0, 0, 0, "ufbxi_obj_parse_index(uc, &tok, attrib)" }, + { "maya_cube_big_endian_obj", 14568, -1, 0, 74, 0, 0, 0, "ufbxi_obj_parse_index(uc, &tok, attrib)" }, + { "maya_cube_big_endian_obj", 14691, -1, 0, 0, 3, 0, 0, "data" }, + { "maya_cube_big_endian_obj", 14691, -1, 0, 0, 6, 0, 0, "data" }, + { "maya_cube_big_endian_obj", 14717, 71, 102, 0, 0, 0, 0, "num_indices == 0 || !required" }, + { "maya_cube_big_endian_obj", 14729, -1, 0, 0, 18, 0, 0, "dst_indices" }, + { "maya_cube_big_endian_obj", 14729, -1, 0, 0, 9, 0, 0, "dst_indices" }, + { "maya_cube_big_endian_obj", 14774, -1, 0, 1057, 0, 0, 0, "meshes" }, + { "maya_cube_big_endian_obj", 14774, -1, 0, 82, 0, 0, 0, "meshes" }, + { "maya_cube_big_endian_obj", 14807, -1, 0, 1059, 0, 0, 0, "tmp_indices" }, + { "maya_cube_big_endian_obj", 14807, -1, 0, 83, 0, 0, 0, "tmp_indices" }, + { "maya_cube_big_endian_obj", 14831, -1, 0, 0, 3, 0, 0, "ufbxi_obj_pop_vertices(uc, &vertices[attrib], attrib, m..." }, + { "maya_cube_big_endian_obj", 14831, -1, 0, 0, 6, 0, 0, "ufbxi_obj_pop_vertices(uc, &vertices[attrib], attrib, m..." }, + { "maya_cube_big_endian_obj", 14848, -1, 0, 0, 12, 0, 0, "fbx_mesh->faces.data" }, + { "maya_cube_big_endian_obj", 14848, -1, 0, 0, 6, 0, 0, "fbx_mesh->faces.data" }, + { "maya_cube_big_endian_obj", 14849, -1, 0, 0, 14, 0, 0, "fbx_mesh->face_material.data" }, + { "maya_cube_big_endian_obj", 14849, -1, 0, 0, 7, 0, 0, "fbx_mesh->face_material.data" }, + { "maya_cube_big_endian_obj", 14854, -1, 0, 0, 16, 0, 0, "fbx_mesh->face_smoothing.data" }, + { "maya_cube_big_endian_obj", 14854, -1, 0, 0, 8, 0, 0, "fbx_mesh->face_smoothing.data" }, + { "maya_cube_big_endian_obj", 14868, 71, 102, 0, 0, 0, 0, "ufbxi_obj_setup_attrib(uc, mesh, tmp_indices, (ufbx_ver..." }, + { "maya_cube_big_endian_obj", 14871, -1, 0, 0, 10, 0, 0, "ufbxi_obj_setup_attrib(uc, mesh, tmp_indices, (ufbx_ver..." }, + { "maya_cube_big_endian_obj", 14871, -1, 0, 0, 20, 0, 0, "ufbxi_obj_setup_attrib(uc, mesh, tmp_indices, (ufbx_ver..." }, + { "maya_cube_big_endian_obj", 14874, -1, 0, 0, 11, 0, 0, "ufbxi_obj_setup_attrib(uc, mesh, tmp_indices, (ufbx_ver..." }, + { "maya_cube_big_endian_obj", 14874, -1, 0, 0, 22, 0, 0, "ufbxi_obj_setup_attrib(uc, mesh, tmp_indices, (ufbx_ver..." }, + { "maya_cube_big_endian_obj", 14916, -1, 0, 0, 12, 0, 0, "ufbxi_finalize_mesh(&uc->result, &uc->error, fbx_mesh)" }, + { "maya_cube_big_endian_obj", 14916, -1, 0, 0, 24, 0, 0, "ufbxi_finalize_mesh(&uc->result, &uc->error, fbx_mesh)" }, + { "maya_cube_big_endian_obj", 14943, -1, 0, 674, 0, 0, 0, "ufbxi_obj_tokenize_line(uc)" }, + { "maya_cube_big_endian_obj", 14943, -1, 0, 9, 0, 0, 0, "ufbxi_obj_tokenize_line(uc)" }, + { "maya_cube_big_endian_obj", 14950, 83, 46, 0, 0, 0, 0, "ufbxi_obj_parse_vertex(uc, UFBXI_OBJ_ATTRIB_POSITION, 1..." }, + { "maya_cube_big_endian_obj", 14957, 111, 9, 0, 0, 0, 0, "ufbxi_obj_parse_vertex(uc, UFBXI_OBJ_ATTRIB_COLOR, 4)" }, + { "maya_cube_big_endian_obj", 14964, 328, 47, 0, 0, 0, 0, "ufbxi_obj_parse_vertex(uc, UFBXI_OBJ_ATTRIB_UV, 1)" }, + { "maya_cube_big_endian_obj", 14966, 622, 47, 0, 0, 0, 0, "ufbxi_obj_parse_vertex(uc, UFBXI_OBJ_ATTRIB_NORMAL, 1)" }, + { "maya_cube_big_endian_obj", 14968, -1, 0, 60, 0, 0, 0, "ufbxi_obj_parse_indices(uc, 1, uc->obj.num_tokens - 1)" }, + { "maya_cube_big_endian_obj", 14968, -1, 0, 966, 0, 0, 0, "ufbxi_obj_parse_indices(uc, 1, uc->obj.num_tokens - 1)" }, + { "maya_cube_big_endian_obj", 14992, -1, 0, 0, 1, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &uc->obj...." }, + { "maya_cube_big_endian_obj", 14992, -1, 0, 691, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &uc->obj...." }, + { "maya_cube_big_endian_obj", 15014, -1, 0, 0, 2, 0, 0, "ufbxi_obj_flush_mesh(uc)" }, + { "maya_cube_big_endian_obj", 15014, -1, 0, 0, 4, 0, 0, "ufbxi_obj_flush_mesh(uc)" }, + { "maya_cube_big_endian_obj", 15015, 71, 102, 0, 0, 0, 0, "ufbxi_obj_pop_meshes(uc)" }, + { "maya_cube_big_endian_obj", 15276, -1, 0, 3, 0, 0, 0, "ufbxi_obj_init(uc)" }, + { "maya_cube_big_endian_obj", 15276, -1, 0, 662, 0, 0, 0, "ufbxi_obj_init(uc)" }, + { "maya_cube_big_endian_obj", 15277, 71, 102, 0, 0, 0, 0, "ufbxi_obj_parse_file(uc)" }, + { "maya_cube_big_endian_obj", 15278, -1, 0, 0, 14, 0, 0, "ufbxi_init_file_paths(uc)" }, + { "maya_cube_big_endian_obj", 15278, -1, 0, 1061, 0, 0, 0, "ufbxi_init_file_paths(uc)" }, + { "maya_cube_big_endian_obj", 21390, 71, 102, 0, 0, 0, 0, "ufbxi_obj_load(uc)" }, + { "maya_display_layers_6100_binary", 12692, -1, 0, 1534, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_display..." }, + { "maya_display_layers_6100_binary", 12692, -1, 0, 5734, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_display..." }, + { "maya_display_layers_6100_binary", 18908, -1, 0, 1693, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &layer->nodes, &layer->ele..." }, + { "maya_display_layers_6100_binary", 18908, -1, 0, 6233, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &layer->nodes, &layer->ele..." }, + { "maya_human_ik_6100_binary", 11892, -1, 0, 11927, 0, 0, 0, "marker" }, + { "maya_human_ik_6100_binary", 11892, -1, 0, 40654, 0, 0, 0, "marker" }, + { "maya_human_ik_6100_binary", 12541, -1, 0, 17429, 0, 0, 0, "ufbxi_read_marker(uc, node, &attrib_info, sub_type, UFB..." }, + { "maya_human_ik_6100_binary", 12541, -1, 0, 60359, 0, 0, 0, "ufbxi_read_marker(uc, node, &attrib_info, sub_type, UFB..." }, + { "maya_human_ik_6100_binary", 12543, -1, 0, 11927, 0, 0, 0, "ufbxi_read_marker(uc, node, &attrib_info, sub_type, UFB..." }, + { "maya_human_ik_6100_binary", 12543, -1, 0, 40654, 0, 0, 0, "ufbxi_read_marker(uc, node, &attrib_info, sub_type, UFB..." }, + { "maya_human_ik_7400_binary", 12624, -1, 0, 10199, 0, 0, 0, "ufbxi_read_marker(uc, node, &info, sub_type, UFBX_MARKE..." }, + { "maya_human_ik_7400_binary", 12624, -1, 0, 2591, 0, 0, 0, "ufbxi_read_marker(uc, node, &info, sub_type, UFBX_MARKE..." }, + { "maya_human_ik_7400_binary", 12626, -1, 0, 1832, 0, 0, 0, "ufbxi_read_marker(uc, node, &info, sub_type, UFBX_MARKE..." }, + { "maya_human_ik_7400_binary", 12626, -1, 0, 7486, 0, 0, 0, "ufbxi_read_marker(uc, node, &info, sub_type, UFBX_MARKE..." }, + { "maya_interpolation_modes_6100_binary", 12891, 16936, 73, 0, 0, 0, 0, "data_end - data >= 1" }, + { "maya_interpolation_modes_7500_ascii", 8462, -1, 0, 848, 0, 0, 0, "v" }, + { "maya_leading_comma_7500_ascii", 8653, 291, 0, 0, 0, 0, 0, "ufbxi_ascii_next_token(uc, &ua->token)" }, + { "maya_node_attribute_zoo_6100_ascii", 8748, -1, 0, 5492, 0, 0, 0, "v" }, + { "maya_node_attribute_zoo_6100_ascii", 8776, -1, 0, 5921, 0, 0, 0, "v" }, + { "maya_node_attribute_zoo_6100_binary", 11735, -1, 0, 15035, 0, 0, 0, "nurbs" }, + { "maya_node_attribute_zoo_6100_binary", 11735, -1, 0, 4140, 0, 0, 0, "nurbs" }, + { "maya_node_attribute_zoo_6100_binary", 11740, 138209, 3, 0, 0, 0, 0, "ufbxi_find_val1(node, ufbxi_Order, \"I\", &nurbs->basis..." }, + { "maya_node_attribute_zoo_6100_binary", 11742, 138308, 255, 0, 0, 0, 0, "ufbxi_find_val1(node, ufbxi_Form, \"C\", (char**)&form)" }, + { "maya_node_attribute_zoo_6100_binary", 11749, 138359, 3, 0, 0, 0, 0, "points" }, + { "maya_node_attribute_zoo_6100_binary", 11750, 138416, 1, 0, 0, 0, 0, "knot" }, + { "maya_node_attribute_zoo_6100_binary", 11751, 143462, 27, 0, 0, 0, 0, "points->size % 4 == 0" }, + { "maya_node_attribute_zoo_6100_binary", 11765, -1, 0, 15237, 0, 0, 0, "nurbs" }, + { "maya_node_attribute_zoo_6100_binary", 11765, -1, 0, 4209, 0, 0, 0, "nurbs" }, + { "maya_node_attribute_zoo_6100_binary", 11770, 139478, 3, 0, 0, 0, 0, "ufbxi_find_val2(node, ufbxi_NurbsSurfaceOrder, \"II\", ..." }, + { "maya_node_attribute_zoo_6100_binary", 11771, 139592, 1, 0, 0, 0, 0, "ufbxi_find_val2(node, ufbxi_Dimensions, \"ZZ\", &dimens..." }, + { "maya_node_attribute_zoo_6100_binary", 11772, 139631, 3, 0, 0, 0, 0, "ufbxi_find_val2(node, ufbxi_Step, \"II\", &step_u, &ste..." }, + { "maya_node_attribute_zoo_6100_binary", 11773, 139664, 3, 0, 0, 0, 0, "ufbxi_find_val2(node, ufbxi_Form, \"CC\", (char**)&form..." }, + { "maya_node_attribute_zoo_6100_binary", 11786, 139691, 3, 0, 0, 0, 0, "points" }, + { "maya_node_attribute_zoo_6100_binary", 11787, 139727, 1, 0, 0, 0, 0, "knot_u" }, + { "maya_node_attribute_zoo_6100_binary", 11788, 140321, 3, 0, 0, 0, 0, "knot_v" }, + { "maya_node_attribute_zoo_6100_binary", 11789, 141818, 63, 0, 0, 0, 0, "points->size % 4 == 0" }, + { "maya_node_attribute_zoo_6100_binary", 11790, 139655, 1, 0, 0, 0, 0, "points->size / 4 == (size_t)dimension_u * (size_t)dimen..." }, + { "maya_node_attribute_zoo_6100_binary", 11877, -1, 0, 3199, 0, 0, 0, "bone" }, + { "maya_node_attribute_zoo_6100_binary", 11877, -1, 0, 710, 0, 0, 0, "bone" }, + { "maya_node_attribute_zoo_6100_binary", 12517, -1, 0, 3199, 0, 0, 0, "ufbxi_read_bone(uc, node, &attrib_info, sub_type)" }, + { "maya_node_attribute_zoo_6100_binary", 12517, -1, 0, 710, 0, 0, 0, "ufbxi_read_bone(uc, node, &attrib_info, sub_type)" }, + { "maya_node_attribute_zoo_6100_binary", 12519, -1, 0, 1745, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "maya_node_attribute_zoo_6100_binary", 12519, -1, 0, 275, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "maya_node_attribute_zoo_6100_binary", 12537, -1, 0, 1963, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "maya_node_attribute_zoo_6100_binary", 12537, -1, 0, 7535, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "maya_node_attribute_zoo_6100_binary", 12545, -1, 0, 10393, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "maya_node_attribute_zoo_6100_binary", 12545, -1, 0, 2787, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "maya_node_attribute_zoo_6100_binary", 12614, -1, 0, 14097, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_camera)..." }, + { "maya_node_attribute_zoo_6100_binary", 12614, -1, 0, 3879, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_camera)..." }, + { "maya_node_attribute_zoo_6100_binary", 12638, 138209, 3, 0, 0, 0, 0, "ufbxi_read_nurbs_curve(uc, node, &info)" }, + { "maya_node_attribute_zoo_6100_binary", 12640, 139478, 3, 0, 0, 0, 0, "ufbxi_read_nurbs_surface(uc, node, &info)" }, + { "maya_node_attribute_zoo_6100_binary", 12644, -1, 0, 15655, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_nurbs_t..." }, + { "maya_node_attribute_zoo_6100_binary", 12644, -1, 0, 4348, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_nurbs_t..." }, + { "maya_node_attribute_zoo_6100_binary", 12646, -1, 0, 15808, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_nurbs_t..." }, + { "maya_node_attribute_zoo_6100_binary", 12646, -1, 0, 4393, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_nurbs_t..." }, + { "maya_node_attribute_zoo_6100_binary", 12749, -1, 0, 17396, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &src_prop..." }, + { "maya_node_attribute_zoo_6100_binary", 12752, -1, 0, 17371, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &dst_prop..." }, + { "maya_node_attribute_zoo_6100_binary", 17010, -1, 0, 0, 486, 0, 0, "spans" }, + { "maya_node_attribute_zoo_6100_binary", 17010, -1, 0, 0, 972, 0, 0, "spans" }, + { "maya_node_attribute_zoo_6100_binary", 17053, -1, 0, 0, 1010, 0, 0, "levels" }, + { "maya_node_attribute_zoo_6100_binary", 17053, -1, 0, 0, 505, 0, 0, "levels" }, + { "maya_node_attribute_zoo_6100_binary", 18498, -1, 0, 0, 486, 0, 0, "ufbxi_finalize_nurbs_basis(uc, &curve->basis)" }, + { "maya_node_attribute_zoo_6100_binary", 18498, -1, 0, 0, 972, 0, 0, "ufbxi_finalize_nurbs_basis(uc, &curve->basis)" }, + { "maya_node_attribute_zoo_6100_binary", 18503, -1, 0, 0, 495, 0, 0, "ufbxi_finalize_nurbs_basis(uc, &surface->basis_u)" }, + { "maya_node_attribute_zoo_6100_binary", 18503, -1, 0, 0, 990, 0, 0, "ufbxi_finalize_nurbs_basis(uc, &surface->basis_u)" }, + { "maya_node_attribute_zoo_6100_binary", 18504, -1, 0, 0, 496, 0, 0, "ufbxi_finalize_nurbs_basis(uc, &surface->basis_v)" }, + { "maya_node_attribute_zoo_6100_binary", 18504, -1, 0, 0, 992, 0, 0, "ufbxi_finalize_nurbs_basis(uc, &surface->basis_v)" }, + { "maya_node_attribute_zoo_6100_binary", 18981, -1, 0, 0, 1010, 0, 0, "ufbxi_finalize_lod_group(uc, *p_lod)" }, + { "maya_node_attribute_zoo_6100_binary", 18981, -1, 0, 0, 505, 0, 0, "ufbxi_finalize_lod_group(uc, *p_lod)" }, + { "maya_node_attribute_zoo_7500_ascii", 8462, -1, 0, 11662, 0, 0, 0, "v" }, + { "maya_node_attribute_zoo_7500_ascii", 8745, -1, 0, 3339, 0, 0, 0, "v" }, + { "maya_node_attribute_zoo_7500_ascii", 8746, -1, 0, 11663, 0, 0, 0, "v" }, + { "maya_node_attribute_zoo_7500_ascii", 8746, -1, 0, 3326, 0, 0, 0, "v" }, + { "maya_node_attribute_zoo_7500_binary", 10431, -1, 0, 0, 325, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, type, 0)" }, + { "maya_node_attribute_zoo_7500_binary", 12008, -1, 0, 1749, 0, 0, 0, "curve" }, + { "maya_node_attribute_zoo_7500_binary", 12008, -1, 0, 6405, 0, 0, 0, "curve" }, + { "maya_node_attribute_zoo_7500_binary", 12013, 61038, 255, 0, 0, 0, 0, "times = ufbxi_find_array(node, ufbxi_KeyTime, 'l')" }, + { "maya_node_attribute_zoo_7500_binary", 12014, 61115, 255, 0, 0, 0, 0, "values = ufbxi_find_array(node, ufbxi_KeyValueFloat, 'r..." }, + { "maya_node_attribute_zoo_7500_binary", 12015, 61175, 255, 0, 0, 0, 0, "attr_flags = ufbxi_find_array(node, ufbxi_KeyAttrFlags,..." }, + { "maya_node_attribute_zoo_7500_binary", 12016, 61234, 255, 0, 0, 0, 0, "attrs = ufbxi_find_array(node, ufbxi_KeyAttrDataFloat, ..." }, + { "maya_node_attribute_zoo_7500_binary", 12017, 61292, 255, 0, 0, 0, 0, "refs = ufbxi_find_array(node, ufbxi_KeyAttrRefCount, 'i..." }, + { "maya_node_attribute_zoo_7500_binary", 12020, 61122, 0, 0, 0, 0, 0, "times->size == values->size" }, + { "maya_node_attribute_zoo_7500_binary", 12025, 61242, 0, 0, 0, 0, 0, "attr_flags->size == refs->size" }, + { "maya_node_attribute_zoo_7500_binary", 12026, 61300, 0, 0, 0, 0, 0, "attrs->size == refs->size * 4u" }, + { "maya_node_attribute_zoo_7500_binary", 12030, -1, 0, 0, 326, 0, 0, "keys" }, + { "maya_node_attribute_zoo_7500_binary", 12030, -1, 0, 0, 652, 0, 0, "keys" }, + { "maya_node_attribute_zoo_7500_binary", 12181, 61431, 0, 0, 0, 0, 0, "refs_left >= 0" }, + { "maya_node_attribute_zoo_7500_binary", 12612, -1, 0, 2954, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_light),..." }, + { "maya_node_attribute_zoo_7500_binary", 12612, -1, 0, 652, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_light),..." }, + { "maya_node_attribute_zoo_7500_binary", 12616, -1, 0, 2711, 0, 0, 0, "ufbxi_read_bone(uc, node, &info, sub_type)" }, + { "maya_node_attribute_zoo_7500_binary", 12616, -1, 0, 582, 0, 0, 0, "ufbxi_read_bone(uc, node, &info, sub_type)" }, + { "maya_node_attribute_zoo_7500_binary", 12618, -1, 0, 2451, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_empty),..." }, + { "maya_node_attribute_zoo_7500_binary", 12618, -1, 0, 489, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_empty),..." }, + { "maya_node_attribute_zoo_7500_binary", 12620, -1, 0, 3149, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_stereo_..." }, + { "maya_node_attribute_zoo_7500_binary", 12620, -1, 0, 703, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_stereo_..." }, + { "maya_node_attribute_zoo_7500_binary", 12628, -1, 0, 1145, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_lod_gro..." }, + { "maya_node_attribute_zoo_7500_binary", 12628, -1, 0, 4460, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_lod_gro..." }, + { "maya_node_attribute_zoo_7500_binary", 12677, -1, 0, 1760, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_anim_va..." }, + { "maya_node_attribute_zoo_7500_binary", 12677, -1, 0, 6440, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_anim_va..." }, + { "maya_node_attribute_zoo_7500_binary", 12679, 61038, 255, 0, 0, 0, 0, "ufbxi_read_animation_curve(uc, node, &info)" }, + { "maya_node_attribute_zoo_7500_binary", 15687, -1, 0, 2112, 0, 0, 0, "((ufbx_prop*)ufbxi_push_size_copy((&uc->tmp_stack), siz..." }, + { "maya_node_attribute_zoo_7500_binary", 15687, -1, 0, 7512, 0, 0, 0, "((ufbx_prop*)ufbxi_push_size_copy((&uc->tmp_stack), siz..." }, + { "maya_node_attribute_zoo_7500_binary", 15728, -1, 0, 2114, 0, 0, 0, "((ufbx_prop*)ufbxi_push_size_copy((&uc->tmp_stack), siz..." }, + { "maya_node_attribute_zoo_7500_binary", 15728, -1, 0, 7516, 0, 0, 0, "((ufbx_prop*)ufbxi_push_size_copy((&uc->tmp_stack), siz..." }, + { "maya_node_attribute_zoo_7500_binary", 7583, 61146, 109, 0, 0, 0, 0, "Bad multivalue array type" }, + { "maya_node_attribute_zoo_7500_binary", 7584, 61333, 103, 0, 0, 0, 0, "Bad multivalue array type" }, + { "maya_node_attribute_zoo_7500_binary", 7825, -1, 0, 0, 0, 0, 2942, "ufbxi_resume_progress(uc)" }, + { "maya_node_attribute_zoo_7500_binary", 7829, -1, 0, 0, 0, 0, 2943, "res != -28" }, + { "maya_notes_6100_ascii", 8402, -1, 0, 1618, 0, 0, 0, "ufbxi_ascii_push_token_char(uc, token, c)" }, + { "maya_notes_6100_ascii", 8402, -1, 0, 234, 0, 0, 0, "ufbxi_ascii_push_token_char(uc, token, c)" }, + { "maya_polygon_hole_6100_binary", 11573, 9377, 37, 0, 0, 0, 0, "ufbxi_find_val1(n, ufbxi_MappingInformationType, \"c\",..." }, + { "maya_polygon_hole_6100_binary", 11575, 9342, 0, 0, 0, 0, 0, "ufbxi_read_truncated_array(uc, &mesh->face_hole.data, &..." }, + { "maya_resampled_7500_binary", 12054, 24917, 23, 0, 0, 0, 0, "p_ref < p_ref_end" }, + { "maya_shaderfx_pbs_material_7700_ascii", 10075, -1, 0, 1352, 0, 0, 0, "ufbxi_read_embedded_blob(uc, &prop->value_blob, binary)" }, + { "maya_shaderfx_pbs_material_7700_ascii", 10075, -1, 0, 5212, 0, 0, 0, "ufbxi_read_embedded_blob(uc, &prop->value_blob, binary)" }, + { "maya_texture_layers_6100_binary", 12235, -1, 0, 1451, 0, 0, 0, "texture" }, + { "maya_texture_layers_6100_binary", 12235, -1, 0, 5530, 0, 0, 0, "texture" }, + { "maya_texture_layers_6100_binary", 12244, -1, 0, 1454, 0, 0, 0, "extra" }, + { "maya_texture_layers_6100_binary", 12244, -1, 0, 5538, 0, 0, 0, "extra" }, + { "maya_texture_layers_6100_binary", 12669, -1, 0, 1451, 0, 0, 0, "ufbxi_read_layered_texture(uc, node, &info)" }, + { "maya_texture_layers_6100_binary", 12669, -1, 0, 5530, 0, 0, 0, "ufbxi_read_layered_texture(uc, node, &info)" }, + { "maya_texture_layers_6100_binary", 16046, -1, 0, 1666, 0, 0, 0, "((ufbx_texture_layer*)ufbxi_push_size_copy((&uc->tmp_st..." }, + { "maya_texture_layers_6100_binary", 16046, -1, 0, 6199, 0, 0, 0, "((ufbx_texture_layer*)ufbxi_push_size_copy((&uc->tmp_st..." }, + { "maya_texture_layers_6100_binary", 16053, -1, 0, 0, 267, 0, 0, "list->data" }, + { "maya_texture_layers_6100_binary", 16053, -1, 0, 0, 534, 0, 0, "list->data" }, + { "maya_texture_layers_6100_binary", 17563, -1, 0, 1676, 0, 0, 0, "textures" }, + { "maya_texture_layers_6100_binary", 17563, -1, 0, 6222, 0, 0, 0, "textures" }, + { "maya_texture_layers_6100_binary", 17565, -1, 0, 6224, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "maya_texture_layers_6100_binary", 17639, -1, 0, 1673, 0, 0, 0, "dst" }, + { "maya_texture_layers_6100_binary", 17639, -1, 0, 6216, 0, 0, 0, "dst" }, + { "maya_texture_layers_6100_binary", 17659, -1, 0, 1676, 0, 0, 0, "ufbxi_deduplicate_textures(uc, &uc->tmp_parse, &deps, &..." }, + { "maya_texture_layers_6100_binary", 17659, -1, 0, 6222, 0, 0, 0, "ufbxi_deduplicate_textures(uc, &uc->tmp_parse, &deps, &..." }, + { "maya_texture_layers_6100_binary", 17670, -1, 0, 1677, 0, 0, 0, "dst" }, + { "maya_texture_layers_6100_binary", 17670, -1, 0, 6225, 0, 0, 0, "dst" }, + { "maya_texture_layers_6100_binary", 17678, -1, 0, 1680, 0, 0, 0, "ufbxi_deduplicate_textures(uc, &uc->tmp_parse, &files, ..." }, + { "maya_texture_layers_6100_binary", 17678, -1, 0, 6231, 0, 0, 0, "ufbxi_deduplicate_textures(uc, &uc->tmp_parse, &files, ..." }, + { "maya_texture_layers_6100_binary", 17682, -1, 0, 0, 273, 0, 0, "texture->file_textures.data" }, + { "maya_texture_layers_6100_binary", 17682, -1, 0, 0, 546, 0, 0, "texture->file_textures.data" }, + { "maya_texture_layers_6100_binary", 17709, -1, 0, 6210, 0, 0, 0, "((ufbx_texture**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "maya_texture_layers_6100_binary", 17713, -1, 0, 1671, 0, 0, 0, "((ufbx_texture**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "maya_texture_layers_6100_binary", 17713, -1, 0, 6211, 0, 0, 0, "((ufbx_texture**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "maya_texture_layers_6100_binary", 18860, -1, 0, 1666, 0, 0, 0, "ufbxi_fetch_texture_layers(uc, &texture->layers, &textu..." }, + { "maya_texture_layers_6100_binary", 18860, -1, 0, 6199, 0, 0, 0, "ufbxi_fetch_texture_layers(uc, &texture->layers, &textu..." }, + { "maya_textured_cube_6100_binary", 18719, -1, 0, 1658, 0, 0, 0, "mat_texs" }, + { "maya_textured_cube_6100_binary", 18719, -1, 0, 6248, 0, 0, 0, "mat_texs" }, + { "maya_transform_animation_6100_binary", 12926, 17549, 11, 0, 0, 0, 0, "data_end - data >= 1" }, + { "mtl_fuzz_0000", 15081, -1, 0, 0, 5, 0, 0, "ufbxi_push_string_place_blob(&uc->string_pool, &prop->v..." }, + { "mtl_fuzz_0000", 4467, -1, 0, 0, 5, 0, 0, "p_blob->data" }, + { "obj_fuzz_0030", 14980, -1, 0, 29, 0, 0, 0, "((_Bool*)ufbxi_push_size_zero((&uc->obj.tmp_face_smooth..." }, + { "obj_fuzz_0030", 14980, -1, 0, 742, 0, 0, 0, "((_Bool*)ufbxi_push_size_zero((&uc->obj.tmp_face_smooth..." }, + { "obj_fuzz_0072", 14743, 301, 46, 0, 0, 0, 0, "ix < 0xffffffffui32" }, + { "obj_fuzz_0089", 14405, 219, 112, 0, 0, 0, 0, "index < 0xffffffffffffffffui64 / 10 - 10" }, + { "revit_empty_7400_binary", 10702, -1, 0, 3503, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_INDEX_CLAMP..." }, + { "revit_empty_7400_binary", 10702, -1, 0, 787, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_INDEX_CLAMP..." }, + { "revit_empty_7400_binary", 10728, -1, 0, 0, 258, 0, 0, "new_indices" }, + { "revit_empty_7400_binary", 10728, -1, 0, 0, 516, 0, 0, "new_indices" }, + { "revit_empty_7400_binary", 10751, -1, 0, 3503, 0, 0, 0, "ufbxi_fix_index(uc, &indices[i], ix, num_elems)" }, + { "revit_empty_7400_binary", 10751, -1, 0, 787, 0, 0, 0, "ufbxi_fix_index(uc, &indices[i], ix, num_elems)" }, + { "revit_empty_7400_binary", 10809, -1, 0, 3503, 0, 0, 0, "ufbxi_check_indices(uc, &attrib->indices.data, index_da..." }, + { "revit_empty_7400_binary", 10809, -1, 0, 787, 0, 0, 0, "ufbxi_check_indices(uc, &attrib->indices.data, index_da..." }, + { "revit_empty_7400_binary", 12707, -1, 0, 3936, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_metadat..." }, + { "revit_empty_7400_binary", 12707, -1, 0, 899, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_metadat..." }, + { "revit_empty_7400_binary", 7528, -1, 0, 0, 302, 0, 0, "d->data" }, + { "revit_empty_7400_binary", 7528, -1, 0, 0, 604, 0, 0, "d->data" }, + { "synthetic_binary_props_7500_ascii", 10670, -1, 0, 3793, 0, 0, 0, "unknown" }, + { "synthetic_binary_props_7500_ascii", 10670, -1, 0, 946, 0, 0, 0, "unknown" }, + { "synthetic_binary_props_7500_ascii", 10677, -1, 0, 3802, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &unknown-..." }, + { "synthetic_binary_props_7500_ascii", 10679, -1, 0, 3803, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &unknown-..." }, + { "synthetic_binary_props_7500_ascii", 12709, -1, 0, 3793, 0, 0, 0, "ufbxi_read_unknown(uc, node, &info, type_str, sub_type_..." }, + { "synthetic_binary_props_7500_ascii", 12709, -1, 0, 946, 0, 0, 0, "ufbxi_read_unknown(uc, node, &info, type_str, sub_type_..." }, + { "synthetic_binary_props_7500_ascii", 8688, -1, 0, 104, 0, 0, 0, "v->data" }, + { "synthetic_binary_props_7500_ascii", 8688, -1, 0, 831, 0, 0, 0, "v->data" }, + { "synthetic_bind_to_root_7700_ascii", 15569, -1, 0, 1984, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_BAD_ELEMENT..." }, + { "synthetic_bind_to_root_7700_ascii", 15569, -1, 0, 7190, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_BAD_ELEMENT..." }, + { "synthetic_blend_shape_order_7500_ascii", 10956, -1, 0, 3274, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "synthetic_blend_shape_order_7500_ascii", 11007, -1, 0, 3272, 0, 0, 0, "offsets" }, + { "synthetic_blend_shape_order_7500_ascii", 11007, -1, 0, 755, 0, 0, 0, "offsets" }, + { "synthetic_blend_shape_order_7500_ascii", 11015, -1, 0, 3274, 0, 0, 0, "ufbxi_sort_blend_offsets(uc, offsets, num_offsets)" }, + { "synthetic_broken_filename_7500_ascii", 12211, -1, 0, 3632, 0, 0, 0, "texture" }, + { "synthetic_broken_filename_7500_ascii", 12211, -1, 0, 832, 0, 0, 0, "texture" }, + { "synthetic_broken_filename_7500_ascii", 12264, -1, 0, 3518, 0, 0, 0, "video" }, + { "synthetic_broken_filename_7500_ascii", 12264, -1, 0, 797, 0, 0, 0, "video" }, + { "synthetic_broken_filename_7500_ascii", 12667, -1, 0, 3632, 0, 0, 0, "ufbxi_read_texture(uc, node, &info)" }, + { "synthetic_broken_filename_7500_ascii", 12667, -1, 0, 832, 0, 0, 0, "ufbxi_read_texture(uc, node, &info)" }, + { "synthetic_broken_filename_7500_ascii", 12671, -1, 0, 3518, 0, 0, 0, "ufbxi_read_video(uc, node, &info)" }, + { "synthetic_broken_filename_7500_ascii", 12671, -1, 0, 797, 0, 0, 0, "ufbxi_read_video(uc, node, &info)" }, + { "synthetic_broken_filename_7500_ascii", 13878, -1, 0, 3917, 0, 0, 0, "result" }, + { "synthetic_broken_filename_7500_ascii", 13878, -1, 0, 924, 0, 0, 0, "result" }, + { "synthetic_broken_filename_7500_ascii", 13898, -1, 0, 0, 257, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &dst, raw..." }, + { "synthetic_broken_filename_7500_ascii", 13898, -1, 0, 3919, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &dst, raw..." }, + { "synthetic_broken_filename_7500_ascii", 15954, -1, 0, 3913, 0, 0, 0, "tex" }, + { "synthetic_broken_filename_7500_ascii", 15954, -1, 0, 922, 0, 0, 0, "tex" }, + { "synthetic_broken_filename_7500_ascii", 15964, -1, 0, 0, 256, 0, 0, "list->data" }, + { "synthetic_broken_filename_7500_ascii", 15964, -1, 0, 0, 512, 0, 0, "list->data" }, + { "synthetic_broken_filename_7500_ascii", 17499, -1, 0, 3931, 0, 0, 0, "entry" }, + { "synthetic_broken_filename_7500_ascii", 17499, -1, 0, 928, 0, 0, 0, "entry" }, + { "synthetic_broken_filename_7500_ascii", 17502, -1, 0, 3933, 0, 0, 0, "file" }, + { "synthetic_broken_filename_7500_ascii", 17502, -1, 0, 929, 0, 0, 0, "file" }, + { "synthetic_broken_filename_7500_ascii", 17528, -1, 0, 0, 259, 0, 0, "files" }, + { "synthetic_broken_filename_7500_ascii", 17528, -1, 0, 0, 518, 0, 0, "files" }, + { "synthetic_broken_filename_7500_ascii", 17605, -1, 0, 3936, 0, 0, 0, "((ufbx_texture**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "synthetic_broken_filename_7500_ascii", 17605, -1, 0, 930, 0, 0, 0, "((ufbx_texture**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "synthetic_broken_filename_7500_ascii", 17609, -1, 0, 3938, 0, 0, 0, "states" }, + { "synthetic_broken_filename_7500_ascii", 17609, -1, 0, 931, 0, 0, 0, "states" }, + { "synthetic_broken_filename_7500_ascii", 17694, -1, 0, 0, 261, 0, 0, "texture->file_textures.data" }, + { "synthetic_broken_filename_7500_ascii", 17694, -1, 0, 0, 522, 0, 0, "texture->file_textures.data" }, + { "synthetic_broken_filename_7500_ascii", 17962, -1, 0, 3917, 0, 0, 0, "ufbxi_resolve_relative_filename(uc, filename, relative_..." }, + { "synthetic_broken_filename_7500_ascii", 17962, -1, 0, 924, 0, 0, 0, "ufbxi_resolve_relative_filename(uc, filename, relative_..." }, + { "synthetic_broken_filename_7500_ascii", 18696, -1, 0, 3913, 0, 0, 0, "ufbxi_fetch_textures(uc, &material->textures, &material..." }, + { "synthetic_broken_filename_7500_ascii", 18696, -1, 0, 922, 0, 0, 0, "ufbxi_fetch_textures(uc, &material->textures, &material..." }, + { "synthetic_broken_filename_7500_ascii", 18808, -1, 0, 3915, 0, 0, 0, "content_videos" }, + { "synthetic_broken_filename_7500_ascii", 18808, -1, 0, 923, 0, 0, 0, "content_videos" }, + { "synthetic_broken_filename_7500_ascii", 18813, -1, 0, 3917, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&video->fil..." }, + { "synthetic_broken_filename_7500_ascii", 18813, -1, 0, 924, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&video->fil..." }, + { "synthetic_broken_filename_7500_ascii", 18814, -1, 0, 3921, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&video->raw..." }, + { "synthetic_broken_filename_7500_ascii", 18814, -1, 0, 925, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&video->raw..." }, + { "synthetic_broken_filename_7500_ascii", 18855, -1, 0, 3925, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&texture->f..." }, + { "synthetic_broken_filename_7500_ascii", 18855, -1, 0, 926, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&texture->f..." }, + { "synthetic_broken_filename_7500_ascii", 18856, -1, 0, 3928, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&texture->r..." }, + { "synthetic_broken_filename_7500_ascii", 18856, -1, 0, 927, 0, 0, 0, "ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&texture->r..." }, + { "synthetic_broken_filename_7500_ascii", 18874, -1, 0, 3931, 0, 0, 0, "ufbxi_insert_texture_file(uc, texture)" }, + { "synthetic_broken_filename_7500_ascii", 18874, -1, 0, 928, 0, 0, 0, "ufbxi_insert_texture_file(uc, texture)" }, + { "synthetic_broken_filename_7500_ascii", 18878, -1, 0, 0, 259, 0, 0, "ufbxi_pop_texture_files(uc)" }, + { "synthetic_broken_filename_7500_ascii", 18878, -1, 0, 0, 518, 0, 0, "ufbxi_pop_texture_files(uc)" }, + { "synthetic_broken_filename_7500_ascii", 18984, -1, 0, 3936, 0, 0, 0, "ufbxi_fetch_file_textures(uc)" }, + { "synthetic_broken_filename_7500_ascii", 18984, -1, 0, 930, 0, 0, 0, "ufbxi_fetch_file_textures(uc)" }, + { "synthetic_by_vertex_bad_index_7500_ascii", 10827, -1, 0, 2697, 0, 0, 0, "ufbxi_check_indices(uc, &attrib->indices.data, new_inde..." }, + { "synthetic_by_vertex_bad_index_7500_ascii", 10827, -1, 0, 577, 0, 0, 0, "ufbxi_check_indices(uc, &attrib->indices.data, new_inde..." }, + { "synthetic_by_vertex_overflow_7500_ascii", 10748, -1, 0, 0, 159, 0, 0, "indices" }, + { "synthetic_by_vertex_overflow_7500_ascii", 10748, -1, 0, 0, 318, 0, 0, "indices" }, + { "synthetic_by_vertex_overflow_7500_ascii", 10864, -1, 0, 2690, 0, 0, 0, "ufbxi_check_indices(uc, &attrib->indices.data, mesh->ve..." }, + { "synthetic_by_vertex_overflow_7500_ascii", 10864, -1, 0, 575, 0, 0, 0, "ufbxi_check_indices(uc, &attrib->indices.data, mesh->ve..." }, + { "synthetic_color_suzanne_0_obj", 14959, -1, 0, 15, 0, 0, 0, "valid" }, + { "synthetic_color_suzanne_0_obj", 14959, -1, 0, 697, 0, 0, 0, "valid" }, + { "synthetic_color_suzanne_1_obj", 14763, -1, 0, 2185, 0, 0, 0, "((_Bool*)ufbxi_push_size_zero((&uc->obj.tmp_color_valid..." }, + { "synthetic_cube_nan_6100_ascii", 8311, 4866, 45, 0, 0, 0, 0, "token->type == 'F'" }, + { "synthetic_empty_elements_7500_ascii", 15791, 2800, 49, 0, 0, 0, 0, "depth <= num_nodes" }, + { "synthetic_empty_face_0_obj", 14495, -1, 0, 19, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_EMPTY_FACE_..." }, + { "synthetic_empty_face_0_obj", 14495, -1, 0, 703, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_EMPTY_FACE_..." }, + { "synthetic_face_groups_0_obj", 14986, -1, 0, 0, 1, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &uc->obj...." }, + { "synthetic_indexed_by_vertex_7500_ascii", 10815, -1, 0, 0, 159, 0, 0, "new_index_data" }, + { "synthetic_indexed_by_vertex_7500_ascii", 10815, -1, 0, 0, 318, 0, 0, "new_index_data" }, + { "synthetic_legacy_nonzero_material_5800_ascii", 13580, -1, 0, 0, 114, 0, 0, "mesh->face_material.data" }, + { "synthetic_legacy_nonzero_material_5800_ascii", 13580, -1, 0, 0, 228, 0, 0, "mesh->face_material.data" }, + { "synthetic_missing_version_6100_ascii", 12289, -1, 0, 13463, 0, 0, 0, "pose" }, + { "synthetic_missing_version_6100_ascii", 12289, -1, 0, 3892, 0, 0, 0, "pose" }, + { "synthetic_missing_version_6100_ascii", 12313, -1, 0, 13472, 0, 0, 0, "tmp_pose" }, + { "synthetic_missing_version_6100_ascii", 12313, -1, 0, 3896, 0, 0, 0, "tmp_pose" }, + { "synthetic_missing_version_6100_ascii", 12323, -1, 0, 13474, 0, 0, 0, "pose->bone_poses.data" }, + { "synthetic_missing_version_6100_ascii", 12323, -1, 0, 3897, 0, 0, 0, "pose->bone_poses.data" }, + { "synthetic_missing_version_6100_ascii", 12539, -1, 0, 1658, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "synthetic_missing_version_6100_ascii", 12539, -1, 0, 251, 0, 0, 0, "ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_..." }, + { "synthetic_missing_version_6100_ascii", 12681, -1, 0, 13463, 0, 0, 0, "ufbxi_read_pose(uc, node, &info, sub_type)" }, + { "synthetic_missing_version_6100_ascii", 12681, -1, 0, 3892, 0, 0, 0, "ufbxi_read_pose(uc, node, &info, sub_type)" }, + { "synthetic_missing_version_6100_ascii", 18159, -1, 0, 0, 252, 0, 0, "pose->bone_poses.data" }, + { "synthetic_missing_version_6100_ascii", 18159, -1, 0, 0, 504, 0, 0, "pose->bone_poses.data" }, + { "synthetic_mixed_attribs_0_obj", 14954, -1, 0, 83, 0, 0, 0, "ufbxi_obj_pad_colors(uc, num_vertices - 1)" }, + { "synthetic_mixed_attribs_0_obj", 14954, -1, 0, 998, 0, 0, 0, "ufbxi_obj_pad_colors(uc, num_vertices - 1)" }, + { "synthetic_mixed_attribs_reuse_0_obj", 14811, -1, 0, 0, 16, 0, 0, "ufbxi_obj_pop_vertices(uc, &vertices[attrib], attrib, 0..." }, + { "synthetic_mixed_attribs_reuse_0_obj", 14811, -1, 0, 0, 32, 0, 0, "ufbxi_obj_pop_vertices(uc, &vertices[attrib], attrib, 0..." }, + { "synthetic_mixed_attribs_reuse_0_obj", 14814, -1, 0, 0, 19, 0, 0, "ufbxi_obj_pop_vertices(uc, &vertices[UFBXI_OBJ_ATTRIB_C..." }, + { "synthetic_mixed_attribs_reuse_0_obj", 14814, -1, 0, 0, 38, 0, 0, "ufbxi_obj_pop_vertices(uc, &vertices[UFBXI_OBJ_ATTRIB_C..." }, + { "synthetic_mixed_attribs_reuse_0_obj", 14816, -1, 0, 1113, 0, 0, 0, "color_valid" }, + { "synthetic_mixed_attribs_reuse_0_obj", 14816, -1, 0, 119, 0, 0, 0, "color_valid" }, + { "synthetic_node_depth_fail_7400_binary", 7624, 23, 233, 0, 0, 0, 0, "depth < 32" }, + { "synthetic_node_depth_fail_7500_ascii", 8580, 1, 33, 0, 0, 0, 0, "depth < 32" }, + { "synthetic_obj_zoo_0_obj", 14970, -1, 0, 38, 0, 0, 0, "ufbxi_obj_parse_multi_indices(uc, 1)" }, + { "synthetic_obj_zoo_0_obj", 14970, -1, 0, 788, 0, 0, 0, "ufbxi_obj_parse_multi_indices(uc, 1)" }, + { "synthetic_parent_directory_7700_ascii", 17905, -1, 0, 3916, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "synthetic_parent_directory_7700_ascii", 17945, -1, 0, 0, 261, 0, 0, "dst" }, + { "synthetic_parent_directory_7700_ascii", 17945, -1, 0, 3917, 0, 0, 0, "dst" }, + { "synthetic_parent_directory_7700_ascii", 17959, -1, 0, 0, 261, 0, 0, "ufbxi_absolute_to_relative_path(uc, relative_filename, ..." }, + { "synthetic_parent_directory_7700_ascii", 17959, -1, 0, 3916, 0, 0, 0, "ufbxi_absolute_to_relative_path(uc, relative_filename, ..." }, + { "synthetic_partial_attrib_0_obj", 14901, -1, 0, 0, 11, 0, 0, "indices" }, + { "synthetic_partial_attrib_0_obj", 14901, -1, 0, 0, 22, 0, 0, "indices" }, + { "synthetic_simple_materials_0_mtl", 15175, -1, 0, 13, 0, 0, 0, "ufbxi_obj_parse_material(uc)" }, + { "synthetic_simple_materials_0_mtl", 15286, -1, 0, 3, 0, 0, 0, "ufbxi_obj_init(uc)" }, + { "synthetic_simple_materials_0_mtl", 15286, -1, 0, 662, 0, 0, 0, "ufbxi_obj_init(uc)" }, + { "synthetic_simple_materials_0_mtl", 15287, -1, 0, 0, 1, 0, 0, "ufbxi_init_file_paths(uc)" }, + { "synthetic_simple_materials_0_mtl", 15287, -1, 0, 674, 0, 0, 0, "ufbxi_init_file_paths(uc)" }, + { "synthetic_simple_materials_0_mtl", 15288, -1, 0, 680, 0, 0, 0, "ufbxi_obj_parse_mtl(uc)" }, + { "synthetic_simple_materials_0_mtl", 15288, -1, 0, 9, 0, 0, 0, "ufbxi_obj_parse_mtl(uc)" }, + { "synthetic_simple_materials_0_mtl", 21393, -1, 0, 3, 0, 0, 0, "ufbxi_mtl_load(uc)" }, + { "synthetic_simple_materials_0_mtl", 21393, -1, 0, 662, 0, 0, 0, "ufbxi_mtl_load(uc)" }, + { "synthetic_simple_textures_0_mtl", 15179, -1, 0, 101, 0, 0, 0, "ufbxi_obj_parse_mtl_map(uc, 0)" }, + { "synthetic_simple_textures_0_mtl", 15179, -1, 0, 1100, 0, 0, 0, "ufbxi_obj_parse_mtl_map(uc, 0)" }, + { "synthetic_string_collision_7500_ascii", 4398, -1, 0, 2213, 0, 0, 0, "ufbxi_map_grow_size((&pool->map), sizeof(ufbx_string), ..." }, + { "synthetic_texture_opts_0_mtl", 15122, -1, 0, 19, 0, 0, 0, "ufbxi_obj_parse_prop(uc, tok, start + 1, 0, &start)" }, + { "synthetic_texture_opts_0_mtl", 15122, -1, 0, 733, 0, 0, 0, "ufbxi_obj_parse_prop(uc, tok, start + 1, 0, &start)" }, + { "synthetic_texture_opts_0_mtl", 15132, -1, 0, 0, 22, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &tex_str,..." }, + { "synthetic_texture_split_7500_ascii", 8780, 28571, 35, 0, 0, 0, 0, "Bad array dst type" }, + { "synthetic_texture_split_7500_binary", 9984, -1, 0, 0, 229, 0, 0, "dst" }, + { "synthetic_texture_split_7500_binary", 9984, -1, 0, 0, 458, 0, 0, "dst" }, + { "synthetic_truncated_crease_partial_7700_ascii", 10891, -1, 0, 2858, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_TRUNCATED_A..." }, + { "synthetic_truncated_crease_partial_7700_ascii", 10891, -1, 0, 650, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_TRUNCATED_A..." }, + { "synthetic_truncated_crease_partial_7700_ascii", 10895, -1, 0, 0, 169, 0, 0, "new_data" }, + { "synthetic_truncated_crease_partial_7700_ascii", 10895, -1, 0, 0, 338, 0, 0, "new_data" }, + { "synthetic_unicode_7500_binary", 21442, -1, 0, 0, 39604, 0, 0, "ufbxi_pop_warnings(&uc->warnings, &uc->scene.metadata.w..." }, + { "synthetic_unicode_7500_binary", 4043, -1, 0, 0, 3, 0, 0, "desc_copy" }, + { "synthetic_unicode_7500_binary", 4043, -1, 0, 0, 6, 0, 0, "desc_copy" }, + { "synthetic_unicode_7500_binary", 4046, -1, 0, 12, 0, 0, 0, "warning" }, + { "synthetic_unicode_7500_binary", 4046, -1, 0, 692, 0, 0, 0, "warning" }, + { "synthetic_unicode_7500_binary", 4071, -1, 0, 0, 39604, 0, 0, "warnings->data" }, + { "synthetic_unicode_7500_binary", 4253, -1, 0, 12, 0, 0, 0, "ufbxi_warnf_imp(pool->warnings, UFBX_WARNING_BAD_UNICOD..." }, + { "synthetic_unicode_7500_binary", 4253, -1, 0, 692, 0, 0, 0, "ufbxi_warnf_imp(pool->warnings, UFBX_WARNING_BAD_UNICOD..." }, + { "synthetic_unicode_7500_binary", 4260, -1, 0, 13, 0, 0, 0, "ufbxi_grow_array_size((pool->map.ator), sizeof(**(&pool..." }, + { "synthetic_unicode_7500_binary", 4260, -1, 0, 694, 0, 0, 0, "ufbxi_grow_array_size((pool->map.ator), sizeof(**(&pool..." }, + { "synthetic_unicode_7500_binary", 4356, -1, 0, 1141, 0, 0, 0, "ufbxi_map_grow_size((&pool->map), sizeof(ufbx_string), ..." }, + { "synthetic_unicode_7500_binary", 4367, -1, 0, 12, 0, 0, 0, "ufbxi_sanitize_string(pool, sanitized, str, length, val..." }, + { "synthetic_unicode_7500_binary", 4367, -1, 0, 692, 0, 0, 0, "ufbxi_sanitize_string(pool, sanitized, str, length, val..." }, + { "synthetic_unicode_error_identity_6100_binary", 4269, -1, 0, 3072, 0, 0, 0, "ufbxi_grow_array_size((pool->map.ator), sizeof(**(&pool..." }, + { "synthetic_unicode_error_identity_6100_binary", 4269, -1, 0, 713, 0, 0, 0, "ufbxi_grow_array_size((pool->map.ator), sizeof(**(&pool..." }, + { "synthetic_unicode_error_identity_6100_binary", 4410, -1, 0, 3070, 0, 0, 0, "ufbxi_sanitize_string(pool, &sanitized, str, length, va..." }, + { "synthetic_unicode_error_identity_6100_binary", 4410, -1, 0, 712, 0, 0, 0, "ufbxi_sanitize_string(pool, &sanitized, str, length, va..." }, + { "zbrush_d20_6100_binary", 10568, -1, 0, 3525, 0, 0, 0, "conn" }, + { "zbrush_d20_6100_binary", 10568, -1, 0, 888, 0, 0, 0, "conn" }, + { "zbrush_d20_6100_binary", 10969, -1, 0, 3529, 0, 0, 0, "shape" }, + { "zbrush_d20_6100_binary", 10969, -1, 0, 890, 0, 0, 0, "shape" }, + { "zbrush_d20_6100_binary", 10977, 25242, 2, 0, 0, 0, 0, "vertices->size % 3 == 0" }, + { "zbrush_d20_6100_binary", 10978, 25217, 0, 0, 0, 0, 0, "indices->size == vertices->size / 3" }, + { "zbrush_d20_6100_binary", 10991, 25290, 2, 0, 0, 0, 0, "normals && normals->size == vertices->size" }, + { "zbrush_d20_6100_binary", 11037, 25189, 0, 0, 0, 0, 0, "ufbxi_get_val1(n, \"S\", &name)" }, + { "zbrush_d20_6100_binary", 11041, -1, 0, 3505, 0, 0, 0, "deformer" }, + { "zbrush_d20_6100_binary", 11041, -1, 0, 880, 0, 0, 0, "deformer" }, + { "zbrush_d20_6100_binary", 11042, -1, 0, 3514, 0, 0, 0, "ufbxi_connect_oo(uc, deformer_fbx_id, info->fbx_id)" }, + { "zbrush_d20_6100_binary", 11042, -1, 0, 884, 0, 0, 0, "ufbxi_connect_oo(uc, deformer_fbx_id, info->fbx_id)" }, + { "zbrush_d20_6100_binary", 11047, -1, 0, 3516, 0, 0, 0, "channel" }, + { "zbrush_d20_6100_binary", 11047, -1, 0, 885, 0, 0, 0, "channel" }, + { "zbrush_d20_6100_binary", 11050, -1, 0, 3523, 0, 0, 0, "((ufbx_real_list*)ufbxi_push_size_copy((&uc->tmp_full_w..." }, + { "zbrush_d20_6100_binary", 11050, -1, 0, 887, 0, 0, 0, "((ufbx_real_list*)ufbxi_push_size_copy((&uc->tmp_full_w..." }, + { "zbrush_d20_6100_binary", 11054, -1, 0, 0, 101, 0, 0, "shape_props" }, + { "zbrush_d20_6100_binary", 11054, -1, 0, 0, 202, 0, 0, "shape_props" }, + { "zbrush_d20_6100_binary", 11066, -1, 0, 3525, 0, 0, 0, "ufbxi_connect_pp(uc, info->fbx_id, channel_fbx_id, name..." }, + { "zbrush_d20_6100_binary", 11066, -1, 0, 888, 0, 0, 0, "ufbxi_connect_pp(uc, info->fbx_id, channel_fbx_id, name..." }, + { "zbrush_d20_6100_binary", 11077, -1, 0, 3527, 0, 0, 0, "ufbxi_push_synthetic_id(uc, &shape_info.fbx_id)" }, + { "zbrush_d20_6100_binary", 11077, -1, 0, 889, 0, 0, 0, "ufbxi_push_synthetic_id(uc, &shape_info.fbx_id)" }, + { "zbrush_d20_6100_binary", 11081, 25217, 0, 0, 0, 0, 0, "ufbxi_read_shape(uc, n, &shape_info)" }, + { "zbrush_d20_6100_binary", 11083, -1, 0, 3538, 0, 0, 0, "ufbxi_connect_oo(uc, channel_fbx_id, deformer_fbx_id)" }, + { "zbrush_d20_6100_binary", 11083, -1, 0, 894, 0, 0, 0, "ufbxi_connect_oo(uc, channel_fbx_id, deformer_fbx_id)" }, + { "zbrush_d20_6100_binary", 11084, -1, 0, 3540, 0, 0, 0, "ufbxi_connect_oo(uc, shape_info.fbx_id, channel_fbx_id)" }, + { "zbrush_d20_6100_binary", 11084, -1, 0, 895, 0, 0, 0, "ufbxi_connect_oo(uc, shape_info.fbx_id, channel_fbx_id)" }, + { "zbrush_d20_6100_binary", 11206, -1, 0, 0, 136, 0, 0, "ids" }, + { "zbrush_d20_6100_binary", 11206, -1, 0, 0, 68, 0, 0, "ids" }, + { "zbrush_d20_6100_binary", 11242, -1, 0, 0, 138, 0, 0, "groups" }, + { "zbrush_d20_6100_binary", 11242, -1, 0, 0, 69, 0, 0, "groups" }, + { "zbrush_d20_6100_binary", 11357, 25189, 0, 0, 0, 0, 0, "ufbxi_read_synthetic_blend_shapes(uc, node, info)" }, + { "zbrush_d20_6100_binary", 11566, 8305, 32, 0, 0, 0, 0, "ufbxi_find_val1(n, ufbxi_MappingInformationType, \"c\",..." }, + { "zbrush_d20_6100_binary", 11568, 8394, 33, 0, 0, 0, 0, "ufbxi_read_truncated_array(uc, &mesh->face_group.data, ..." }, + { "zbrush_d20_6100_binary", 11685, -1, 0, 0, 136, 0, 0, "ufbxi_assign_face_groups(&uc->result, &uc->error, mesh,..." }, + { "zbrush_d20_6100_binary", 11685, -1, 0, 0, 68, 0, 0, "ufbxi_assign_face_groups(&uc->result, &uc->error, mesh,..." }, + { "zbrush_d20_6100_binary", 16002, -1, 0, 1405, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "zbrush_d20_6100_binary", 16002, -1, 0, 5296, 0, 0, 0, "((ufbx_element**)ufbxi_push_size_copy((&uc->tmp_stack),..." }, + { "zbrush_d20_6100_binary", 16010, -1, 0, 0, 267, 0, 0, "list->data" }, + { "zbrush_d20_6100_binary", 16010, -1, 0, 0, 534, 0, 0, "list->data" }, + { "zbrush_d20_6100_binary", 16023, -1, 0, 1398, 0, 0, 0, "((ufbx_blend_keyframe*)ufbxi_push_size_copy((&uc->tmp_s..." }, + { "zbrush_d20_6100_binary", 16023, -1, 0, 5278, 0, 0, 0, "((ufbx_blend_keyframe*)ufbxi_push_size_copy((&uc->tmp_s..." }, + { "zbrush_d20_6100_binary", 16030, -1, 0, 0, 258, 0, 0, "list->data" }, + { "zbrush_d20_6100_binary", 16030, -1, 0, 0, 516, 0, 0, "list->data" }, + { "zbrush_d20_6100_binary", 16125, -1, 0, 5328, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "zbrush_d20_6100_binary", 16160, -1, 0, 5280, 0, 0, 0, "ufbxi_grow_array_size((&uc->ator_tmp), sizeof(**(&uc->t..." }, + { "zbrush_d20_6100_binary", 18313, -1, 0, 1395, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &blend->channels, &blend->..." }, + { "zbrush_d20_6100_binary", 18313, -1, 0, 5270, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &blend->channels, &blend->..." }, + { "zbrush_d20_6100_binary", 18343, -1, 0, 1397, 0, 0, 0, "full_weights" }, + { "zbrush_d20_6100_binary", 18343, -1, 0, 5276, 0, 0, 0, "full_weights" }, + { "zbrush_d20_6100_binary", 18348, -1, 0, 1398, 0, 0, 0, "ufbxi_fetch_blend_keyframes(uc, &channel->keyframes, &c..." }, + { "zbrush_d20_6100_binary", 18348, -1, 0, 5278, 0, 0, 0, "ufbxi_fetch_blend_keyframes(uc, &channel->keyframes, &c..." }, + { "zbrush_d20_6100_binary", 18359, -1, 0, 5280, 0, 0, 0, "ufbxi_sort_blend_keyframes(uc, channel->keyframes.data,..." }, + { "zbrush_d20_6100_binary", 18470, -1, 0, 1404, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &mesh->blend_deformers, &m..." }, + { "zbrush_d20_6100_binary", 18470, -1, 0, 5294, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &mesh->blend_deformers, &m..." }, + { "zbrush_d20_6100_binary", 18472, -1, 0, 1405, 0, 0, 0, "ufbxi_fetch_deformers(uc, &mesh->all_deformers, &mesh->..." }, + { "zbrush_d20_6100_binary", 18472, -1, 0, 5296, 0, 0, 0, "ufbxi_fetch_deformers(uc, &mesh->all_deformers, &mesh->..." }, + { "zbrush_d20_6100_binary", 18711, -1, 0, 1410, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &textures, &mesh->element,..." }, + { "zbrush_d20_6100_binary", 18711, -1, 0, 5308, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &textures, &mesh->element,..." }, + { "zbrush_d20_6100_binary", 18741, -1, 0, 1411, 0, 0, 0, "mat_tex" }, + { "zbrush_d20_6100_binary", 18741, -1, 0, 5310, 0, 0, 0, "mat_tex" }, + { "zbrush_d20_6100_binary", 18775, -1, 0, 0, 273, 0, 0, "texs" }, + { "zbrush_d20_6100_binary", 18775, -1, 0, 0, 546, 0, 0, "texs" }, + { "zbrush_d20_6100_binary", 18794, -1, 0, 1414, 0, 0, 0, "tex" }, + { "zbrush_d20_6100_binary", 18794, -1, 0, 5317, 0, 0, 0, "tex" }, + { "zbrush_d20_6100_binary", 18821, -1, 0, 5328, 0, 0, 0, "ufbxi_sort_videos_by_filename(uc, content_videos, num_c..." }, + { "zbrush_d20_7500_ascii", 10002, -1, 0, 0, 256, 0, 0, "dst_blob->data" }, + { "zbrush_d20_7500_ascii", 10002, -1, 0, 0, 512, 0, 0, "dst_blob->data" }, + { "zbrush_d20_7500_ascii", 12281, -1, 0, 0, 256, 0, 0, "ufbxi_read_embedded_blob(uc, &video->content, content_n..." }, + { "zbrush_d20_7500_ascii", 12281, -1, 0, 0, 512, 0, 0, "ufbxi_read_embedded_blob(uc, &video->content, content_n..." }, + { "zbrush_d20_7500_binary", 11964, -1, 0, 1059, 0, 0, 0, "channel" }, + { "zbrush_d20_7500_binary", 11964, -1, 0, 4179, 0, 0, 0, "channel" }, + { "zbrush_d20_7500_binary", 11972, -1, 0, 1063, 0, 0, 0, "((ufbx_real_list*)ufbxi_push_size_copy((&uc->tmp_full_w..." }, + { "zbrush_d20_7500_binary", 11972, -1, 0, 4188, 0, 0, 0, "((ufbx_real_list*)ufbxi_push_size_copy((&uc->tmp_full_w..." }, + { "zbrush_d20_7500_binary", 12636, 32981, 0, 0, 0, 0, 0, "ufbxi_read_shape(uc, node, &info)" }, + { "zbrush_d20_7500_binary", 12656, -1, 0, 1047, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_blend_d..." }, + { "zbrush_d20_7500_binary", 12656, -1, 0, 4144, 0, 0, 0, "ufbxi_read_element(uc, node, &info, sizeof(ufbx_blend_d..." }, + { "zbrush_d20_7500_binary", 12658, -1, 0, 1059, 0, 0, 0, "ufbxi_read_blend_channel(uc, node, &info)" }, + { "zbrush_d20_7500_binary", 12658, -1, 0, 4179, 0, 0, 0, "ufbxi_read_blend_channel(uc, node, &info)" }, + { "zbrush_d20_selection_set_6100_binary", 12381, -1, 0, 1289, 0, 0, 0, "set" }, + { "zbrush_d20_selection_set_6100_binary", 12381, -1, 0, 4776, 0, 0, 0, "set" }, + { "zbrush_d20_selection_set_6100_binary", 12398, -1, 0, 3789, 0, 0, 0, "sel" }, + { "zbrush_d20_selection_set_6100_binary", 12398, -1, 0, 969, 0, 0, 0, "sel" }, + { "zbrush_d20_selection_set_6100_binary", 12688, -1, 0, 1289, 0, 0, 0, "ufbxi_read_selection_set(uc, node, &info)" }, + { "zbrush_d20_selection_set_6100_binary", 12688, -1, 0, 4776, 0, 0, 0, "ufbxi_read_selection_set(uc, node, &info)" }, + { "zbrush_d20_selection_set_6100_binary", 12695, -1, 0, 3789, 0, 0, 0, "ufbxi_read_selection_node(uc, node, &info)" }, + { "zbrush_d20_selection_set_6100_binary", 12695, -1, 0, 969, 0, 0, 0, "ufbxi_read_selection_node(uc, node, &info)" }, + { "zbrush_d20_selection_set_6100_binary", 18913, -1, 0, 2190, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &set->nodes, &set->element..." }, + { "zbrush_d20_selection_set_6100_binary", 18913, -1, 0, 7785, 0, 0, 0, "ufbxi_fetch_dst_elements(uc, &set->nodes, &set->element..." }, + { "zbrush_polygroup_mess_0_obj", 11322, -1, 0, 0, 2037, 0, 0, "face_indices" }, + { "zbrush_polygroup_mess_0_obj", 11322, -1, 0, 0, 4074, 0, 0, "face_indices" }, + { "zbrush_polygroup_mess_0_obj", 14861, -1, 0, 0, 2034, 0, 0, "fbx_mesh->face_group.data" }, + { "zbrush_polygroup_mess_0_obj", 14861, -1, 0, 0, 4068, 0, 0, "fbx_mesh->face_group.data" }, + { "zbrush_polygroup_mess_0_obj", 14919, -1, 0, 0, 2037, 0, 0, "ufbxi_update_face_groups(&uc->result, &uc->error, fbx_m..." }, + { "zbrush_polygroup_mess_0_obj", 14919, -1, 0, 0, 4074, 0, 0, "ufbxi_update_face_groups(&uc->result, &uc->error, fbx_m..." }, + { "zbrush_polygroup_mess_0_obj", 15010, -1, 0, 158786, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_UNKNOWN_OBJ..." }, + { "zbrush_polygroup_mess_0_obj", 15010, -1, 0, 19661, 0, 0, 0, "ufbxi_warnf_imp(&uc->warnings, UFBX_WARNING_UNKNOWN_OBJ..." }, + { "zbrush_vertex_color_obj", 14035, -1, 0, 0, 12, 0, 0, "color_set" }, + { "zbrush_vertex_color_obj", 14035, -1, 0, 0, 24, 0, 0, "color_set" }, + { "zbrush_vertex_color_obj", 14620, -1, 0, 26, 0, 0, 0, "p_rgba && p_valid" }, + { "zbrush_vertex_color_obj", 14620, -1, 0, 810, 0, 0, 0, "p_rgba && p_valid" }, + { "zbrush_vertex_color_obj", 14762, -1, 0, 1004, 0, 0, 0, "((ufbx_real*)ufbxi_push_size_zero((&uc->obj.tmp_vertice..." }, + { "zbrush_vertex_color_obj", 14762, -1, 0, 71, 0, 0, 0, "((ufbx_real*)ufbxi_push_size_zero((&uc->obj.tmp_vertice..." }, + { "zbrush_vertex_color_obj", 14763, -1, 0, 1006, 0, 0, 0, "((_Bool*)ufbxi_push_size_zero((&uc->obj.tmp_color_valid..." }, + { "zbrush_vertex_color_obj", 14777, -1, 0, 1004, 0, 0, 0, "ufbxi_obj_pad_colors(uc, uc->obj.vertex_count[UFBXI_OBJ..." }, + { "zbrush_vertex_color_obj", 14777, -1, 0, 71, 0, 0, 0, "ufbxi_obj_pad_colors(uc, uc->obj.vertex_count[UFBXI_OBJ..." }, + { "zbrush_vertex_color_obj", 14836, -1, 0, 0, 0, 880, 0, "min_ix < 0xffffffffffffffffui64" }, + { "zbrush_vertex_color_obj", 14837, -1, 0, 0, 10, 0, 0, "ufbxi_obj_pop_vertices(uc, &vertices[UFBXI_OBJ_ATTRIB_C..." }, + { "zbrush_vertex_color_obj", 14837, -1, 0, 0, 5, 0, 0, "ufbxi_obj_pop_vertices(uc, &vertices[UFBXI_OBJ_ATTRIB_C..." }, + { "zbrush_vertex_color_obj", 14839, -1, 0, 1009, 0, 0, 0, "color_valid" }, + { "zbrush_vertex_color_obj", 14839, -1, 0, 73, 0, 0, 0, "color_valid" }, + { "zbrush_vertex_color_obj", 14999, -1, 0, 26, 0, 0, 0, "ufbxi_obj_parse_comment(uc)" }, + { "zbrush_vertex_color_obj", 14999, -1, 0, 810, 0, 0, 0, "ufbxi_obj_parse_comment(uc)" }, + { "zbrush_vertex_color_obj", 15114, -1, 0, 1037, 0, 0, 0, "ufbxi_obj_parse_prop(uc, ufbxi_str_c(\"obj|args\"), 1, ..." }, + { "zbrush_vertex_color_obj", 15114, -1, 0, 76, 0, 0, 0, "ufbxi_obj_parse_prop(uc, ufbxi_str_c(\"obj|args\"), 1, ..." }, + { "zbrush_vertex_color_obj", 15132, -1, 0, 1044, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &tex_str,..." }, + { "zbrush_vertex_color_obj", 15133, -1, 0, 1045, 0, 0, 0, "ufbxi_push_string_place_blob(&uc->string_pool, &tex_raw..." }, + { "zbrush_vertex_color_obj", 15137, -1, 0, 1046, 0, 0, 0, "texture" }, + { "zbrush_vertex_color_obj", 15137, -1, 0, 77, 0, 0, 0, "texture" }, + { "zbrush_vertex_color_obj", 15146, -1, 0, 0, 18, 0, 0, "ufbxi_obj_pop_props(uc, &texture->props.props, num_prop..." }, + { "zbrush_vertex_color_obj", 15146, -1, 0, 0, 36, 0, 0, "ufbxi_obj_pop_props(uc, &texture->props.props, num_prop..." }, + { "zbrush_vertex_color_obj", 15152, -1, 0, 0, 19, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &prop, 0)" }, + { "zbrush_vertex_color_obj", 15152, -1, 0, 1055, 0, 0, 0, "ufbxi_push_string_place_str(&uc->string_pool, &prop, 0)" }, + { "zbrush_vertex_color_obj", 15155, -1, 0, 1057, 0, 0, 0, "ufbxi_connect_op(uc, fbx_id, uc->obj.usemtl_fbx_id, pro..." }, + { "zbrush_vertex_color_obj", 15155, -1, 0, 81, 0, 0, 0, "ufbxi_connect_op(uc, fbx_id, uc->obj.usemtl_fbx_id, pro..." }, + { "zbrush_vertex_color_obj", 15177, -1, 0, 1037, 0, 0, 0, "ufbxi_obj_parse_mtl_map(uc, 4)" }, + { "zbrush_vertex_color_obj", 15177, -1, 0, 76, 0, 0, 0, "ufbxi_obj_parse_mtl_map(uc, 4)" }, +}; + +typedef struct { + const char *name; + size_t read_buffer_size; +} ufbxt_buffer_check; + +static const ufbxt_buffer_check g_buffer_checks[] = { + { "blender_272_cube_7400_binary", 9484 }, + { "blender_279_color_sets_7400_binary", 10255 }, + { "blender_279_ball_7400_binary", 14303 }, + { "blender_279_internal_textures_7400_binary", 13711 }, + { "blender_293_textures_7400_binary", 13695 }, + { "blender_293_embedded_textures_7400_binary", 13695 }, + { "blender_293_material_mapping_7400_binary", 11388 }, + { "blender_293x_nonmanifold_subsurf_7400_binary", 10447 }, + { "blender_293_ngon_subsurf_7400_binary", 10223 }, +}; + +static bool ufbxt_fuzz_should_skip(int iter) +{ + if ((iter >> g_fuzz_quality >> g_fuzz_quality) != 0) { + return (iter & (iter - 1)) != 0; + } else { + return (iter & ((1 << g_fuzz_quality) - 1)) % ((iter >> g_fuzz_quality) + 1) != 0; + } +} + +typedef struct { + uint64_t calls; +} ufbxt_progress_ctx; + +ufbx_progress_result ufbxt_measure_progress(void *user, const ufbx_progress *progress) +{ + ufbxt_progress_ctx *ctx = (ufbxt_progress_ctx*)user; + ctx->calls++; + return UFBX_PROGRESS_CONTINUE; +} + +void ufbxt_do_fuzz(const char *base_name, void *data, size_t size, const char *filename, bool allow_error, ufbx_file_format file_format, const ufbx_load_opts *default_opts) +{ + if (g_no_fuzz) return; + + size_t temp_allocs = 1000; + size_t result_allocs = 500; + size_t progress_calls = 100; + + { + ufbxt_progress_ctx progress_ctx = { 0 }; + + bool temp_freed = false, result_freed = false; + + ufbx_load_opts prog_opts = { 0 }; + if (default_opts) { + prog_opts = *default_opts; + } + + ufbxt_init_allocator(&prog_opts.temp_allocator, &temp_freed); + ufbxt_init_allocator(&prog_opts.result_allocator, &result_freed); + prog_opts.load_external_files = true; + prog_opts.filename.data = filename; + prog_opts.filename.length = SIZE_MAX; + prog_opts.file_format = file_format; + prog_opts.read_buffer_size = 1; + prog_opts.temp_allocator.huge_threshold = 1; + prog_opts.result_allocator.huge_threshold = 1; + prog_opts.progress_cb.fn = &ufbxt_measure_progress; + prog_opts.progress_cb.user = &progress_ctx; + prog_opts.progress_interval_hint = 1; + + ufbx_error prog_error; + ufbx_scene *prog_scene = ufbx_load_memory(data, size, &prog_opts, &prog_error); + if (!allow_error) { + if (!prog_scene) { + ufbxt_log_error(&prog_error); + } + ufbxt_assert(prog_scene); + } + + if (prog_scene) { + progress_calls = (size_t)progress_ctx.calls; + temp_allocs = prog_scene->metadata.temp_allocs + 10; + result_allocs = prog_scene->metadata.result_allocs + 10; + + ufbx_free_scene(prog_scene); + } + + ufbxt_assert(temp_freed); + ufbxt_assert(result_freed); + } + + if (g_fuzz) { + uint64_t begin = cputime_os_tick(); + + size_t fail_step = 0; + int i; + + g_fuzz_test_name = base_name; + + #pragma omp parallel for schedule(dynamic, 4) + for (i = 0; i < (int)temp_allocs; i++) { + if (ufbxt_fuzz_should_skip(i)) continue; + if (omp_get_thread_num() == 0) { + if (i % 16 == 0) { + fprintf(stderr, "\rFuzzing temp limit %s: %d/%d", base_name, i, (int)temp_allocs); + fflush(stderr); + } + } + + size_t step = 10000000 + (size_t)i; + + if (!ufbxt_test_fuzz(filename, data, size, default_opts, step, -1, (size_t)i, 0, 0, 0)) fail_step = step; + } + + fprintf(stderr, "\rFuzzing temp limit %s: %d/%d\n", base_name, (int)temp_allocs, (int)temp_allocs); + + #pragma omp parallel for schedule(dynamic, 4) + for (i = 0; i < (int)result_allocs; i++) { + if (ufbxt_fuzz_should_skip(i)) continue; + if (omp_get_thread_num() == 0) { + if (i % 16 == 0) { + fprintf(stderr, "\rFuzzing result limit %s: %d/%d", base_name, i, (int)result_allocs); + fflush(stderr); + } + } + + size_t step = 20000000 + (size_t)i; + + if (!ufbxt_test_fuzz(filename, data, size, default_opts, step, -1, 0, (size_t)i, 0, 0)) fail_step = step; + } + + fprintf(stderr, "\rFuzzing result limit %s: %d/%d\n", base_name, (int)result_allocs, (int)result_allocs); + + if (!g_fuzz_no_truncate) { + #pragma omp parallel for schedule(dynamic, 4) + for (i = 1; i < (int)size; i++) { + if (ufbxt_fuzz_should_skip(i)) continue; + if (omp_get_thread_num() == 0) { + if (i % 16 == 0) { + fprintf(stderr, "\rFuzzing truncate %s: %d/%d", base_name, i, (int)size); + fflush(stderr); + } + } + + size_t step = 30000000 + (size_t)i; + + if (!ufbxt_test_fuzz(filename, data, size, default_opts, step, -1, 0, 0, (size_t)i, 0)) fail_step = step; + } + + fprintf(stderr, "\rFuzzing truncate %s: %d/%d\n", base_name, (int)size, (int)size); + } + + if (!g_fuzz_no_cancel) { + #pragma omp parallel for schedule(dynamic, 4) + for (i = 0; i < (int)progress_calls; i++) { + if (ufbxt_fuzz_should_skip(i)) continue; + if (omp_get_thread_num() == 0) { + if (i % 16 == 0) { + fprintf(stderr, "\rFuzzing cancel %s: %d/%d", base_name, i, (int)size); + fflush(stderr); + } + } + + size_t step = 40000000 + (size_t)i; + + if (!ufbxt_test_fuzz(filename, data, size, default_opts, step, -1, 0, 0, 0, (size_t)i+1)) fail_step = step; + } + + fprintf(stderr, "\rFuzzing cancel %s: %d/%d\n", base_name, (int)size, (int)size); + } + + if (!g_fuzz_no_patch) { + + uint8_t *data_copy[256] = { 0 }; + + int patch_start = g_patch_start - omp_get_num_threads() * 16; + if (patch_start < 0) { + patch_start = 0; + } + + #pragma omp parallel for schedule(dynamic, 4) + for (i = patch_start; i < (int)size; i++) { + if (ufbxt_fuzz_should_skip(i)) continue; + + if (omp_get_thread_num() == 0) { + if (i % 16 == 0) { + fprintf(stderr, "\rFuzzing patch %s: %d/%d", base_name, i, (int)size); + fflush(stderr); + } + } + + uint8_t **p_data_copy = &data_copy[omp_get_thread_num()]; + if (*p_data_copy == NULL) { + *p_data_copy = malloc(size); + memcpy(*p_data_copy, data, size); + } + uint8_t *data_u8 = *p_data_copy; + + size_t step = i * 10; + + uint8_t original = data_u8[i]; + + if (g_all_byte_values) { + for (uint32_t v = 0; v < 256; v++) { + data_u8[i] = (uint8_t)v; + if (!ufbxt_test_fuzz(filename, data_u8, size, default_opts, step + v, i, 0, 0, 0, 0)) fail_step = step + v; + } + } else { + data_u8[i] = original + 1; + if (!ufbxt_test_fuzz(filename, data_u8, size, default_opts, step + 1, i, 0, 0, 0, 0)) fail_step = step + 1; + + data_u8[i] = original - 1; + if (!ufbxt_test_fuzz(filename, data_u8, size, default_opts, step + 2, i, 0, 0, 0, 0)) fail_step = step + 2; + + if (original != 0) { + data_u8[i] = 0; + if (!ufbxt_test_fuzz(filename, data_u8, size, default_opts, step + 3, i, 0, 0, 0, 0)) fail_step = step + 3; + } + + if (original != 0xff) { + data_u8[i] = 0xff; + if (!ufbxt_test_fuzz(filename, data_u8, size, default_opts, step + 4, i, 0, 0, 0, 0)) fail_step = step + 4; + } + } + + + data_u8[i] = original; + } + + fprintf(stderr, "\rFuzzing patch %s: %d/%d\n", base_name, (int)size, (int)size); + + for (size_t i = 0; i < ufbxt_arraycount(data_copy); i++) { + free(data_copy[i]); + } + + } + + ufbxt_hintf("Fuzz failed on step: %zu", fail_step); + ufbxt_assert(fail_step == 0); + + uint64_t end = cputime_os_tick(); + fprintf(stderr, ".. fuzzing done in %.2fs (quality=%d)\n", cputime_os_delta_to_sec(NULL, end - begin), g_fuzz_quality); + + } else { + uint8_t *data_u8 = (uint8_t*)data; + + // Run a couple of known fuzz checks + for (size_t i = 0; i < ufbxt_arraycount(g_fuzz_checks); i++) { + const ufbxt_fuzz_check *check = &g_fuzz_checks[i]; + if (strcmp(check->name, base_name)) continue; + + uint8_t original; + if (check->patch_offset >= 0) { + original = data_u8[check->patch_offset]; + ufbxt_logf(".. Patch byte %u from 0x%02x to 0x%02x: %s", check->patch_offset, original, check->patch_value, check->description); + ufbxt_assert((size_t)check->patch_offset < size); + data_u8[check->patch_offset] = check->patch_value; + } + + ufbx_load_opts opts = { 0 }; + ufbxt_cancel_ctx cancel_ctx = { 0 }; + + if (default_opts) { + opts = *default_opts; + } + + opts.load_external_files = true; + opts.filename.data = filename; + opts.filename.length = SIZE_MAX; + + bool temp_freed = false, result_freed = false; + ufbxt_init_allocator(&opts.temp_allocator, &temp_freed); + ufbxt_init_allocator(&opts.result_allocator, &result_freed); + + if (check->temp_limit > 0) { + ufbxt_logf(".. Temp limit %u: %s", check->temp_limit, check->description); + opts.temp_allocator.allocation_limit = check->temp_limit; + opts.temp_allocator.huge_threshold = 1; + } + + if (check->result_limit > 0) { + ufbxt_logf(".. Result limit %u: %s", check->result_limit, check->description); + opts.result_allocator.allocation_limit = check->result_limit; + opts.result_allocator.huge_threshold = 1; + } + + size_t truncated_size = size; + if (check->truncate_length > 0) { + ufbxt_logf(".. Truncated length %u: %s", check->truncate_length, check->description); + truncated_size = check->truncate_length; + } + + if (check->cancel_step > 0) { + cancel_ctx.calls_left = check->cancel_step; + opts.progress_cb.fn = &ufbxt_cancel_progress; + opts.progress_cb.user = &cancel_ctx; + opts.progress_interval_hint = 1; + } + + ufbx_error error; + ufbx_scene *scene = ufbx_load_memory(data, truncated_size, &opts, &error); + if (scene) { + ufbxt_check_scene(scene); + ufbx_free_scene(scene); + } + + ufbxt_assert(temp_freed); + ufbxt_assert(result_freed); + + if (check->patch_offset >= 0) { + data_u8[check->patch_offset] = original; + } + } + } +} + +const uint32_t ufbxt_file_versions[] = { 0, 1, 2, 3, 3000, 5000, 5800, 6100, 7100, 7200, 7300, 7400, 7500, 7700 }; + +typedef struct ufbxt_file_iterator { + // Input + const char *path; + const char *root; + bool allow_not_found; + + // State (clear to zero) + uint32_t version_ix; + uint32_t format_ix; + uint32_t num_found; +} ufbxt_file_iterator; + +bool ufbxt_next_file(ufbxt_file_iterator *iter, char *buffer, size_t buffer_size) +{ + for (;;) { + if (iter->version_ix >= ufbxt_arraycount(ufbxt_file_versions)) { + ufbxt_assert(iter->num_found > 0 || iter->allow_not_found); + return false; + } + + uint32_t version = ufbxt_file_versions[iter->version_ix]; + const char *format = ""; + const char *ext = "fbx"; + switch (iter->format_ix) { + case 0: format = "binary"; break; + case 1: format = "ascii"; break; + case 2: format = "mtl"; ext = "mtl"; break; + case 3: format = "obj"; ext = "obj"; break; + } + snprintf(buffer, buffer_size, "%s%s_%u_%s.%s", iter->root ? iter->root : data_root, iter->path, version, format, ext); + + iter->format_ix++; + if (iter->format_ix >= 4) { + iter->format_ix = 0; + iter->version_ix++; + } + + ufbx_stream stream = { 0 }; + if (ufbx_open_file(&stream, buffer, SIZE_MAX)) { + ufbxt_logf("%s", buffer); + if (stream.close_fn) { + stream.close_fn(stream.user); + } + iter->num_found++; + return true; + } + } +} + +typedef enum ufbxt_file_test_flags { + // Alternative test for a given file, does not execute fuzz tests again. + UFBXT_FILE_TEST_FLAG_ALTERNATIVE = 0x1, + + // Allow scene loading to fail. + // Calls test function with `scene == NULL && load_error != NULL` on failure. + UFBXT_FILE_TEST_FLAG_ALLOW_ERROR = 0x2, + + // Allow invalid Unicode in the file. + UFBXT_FILE_TEST_FLAG_ALLOW_INVALID_UNICODE = 0x4, + + // This test is heavy to fuzz and is fuzzed with lower quality, use `--heavy-fuzz-quality` to control it. + UFBXT_FILE_TEST_FLAG_HEAVY_TO_FUZZ = 0x8, + + // Allow scene loading to fail if `ufbx_load_opts.strict` is specified. + UFBXT_FILE_TEST_FLAG_ALLOW_STRICT_ERROR = 0x10, + + // Skip tests with various `ufbx_load_opts`. + // Useful if the file isn't particularly interesting but has a lot of content. + UFBXT_FILE_TEST_FLAG_SKIP_LOAD_OPTS_CHECKS = 0x20, + + // Fuzz even if being an alternative test + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS = 0x40, + + // Pass user_opts to the fuzzer + UFBXT_FILE_TEST_FLAG_FUZZ_OPTS = 0x80, + + // Diff even if being an alternative test + UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS = 0x100, + + // Expect the diff to fail + UFBXT_FILE_TEST_FLAG_DIFF_EXPECT_FAIL = 0x200, + + // Expect the diff to fail for version >= 7000 files + UFBXT_FILE_TEST_FLAG_DIFF_EXPECT_FAIL_POST_7000 = 0x400, + + // Ignore normals when doing diff to .obj when testing with various + // `ufbx_load_opts.geometry_transform_handling` values. + UFBXT_FILE_TEST_FLAG_OPT_HANDLING_IGNORE_NORMALS_IN_DIFF = 0x800, +} ufbxt_file_test_flags; + +void ufbxt_do_file_test(const char *name, void (*test_fn)(ufbx_scene *s, ufbxt_diff_error *err, ufbx_error *load_error), const char *suffix, ufbx_load_opts user_opts, ufbxt_file_test_flags flags) +{ + char buf[512]; + snprintf(buf, sizeof(buf), "%s%s.obj", data_root, name); + size_t obj_size = 0; + void *obj_data = ufbxt_read_file(buf, &obj_size); + ufbxt_obj_file *obj_file = obj_data ? ufbxt_load_obj(obj_data, obj_size, NULL) : NULL; + free(obj_data); + + // Override g_fuzz_quality if necessary + int prev_fuzz_quality = -1; + if (flags & UFBXT_FILE_TEST_FLAG_HEAVY_TO_FUZZ) { + prev_fuzz_quality = g_fuzz_quality; + g_fuzz_quality = g_heavy_fuzz_quality; + } + + char base_name[512]; + + bool allow_error = (flags & UFBXT_FILE_TEST_FLAG_ALLOW_ERROR) != 0; + bool alternative = (flags & UFBXT_FILE_TEST_FLAG_ALTERNATIVE) != 0; + bool allow_strict_error = (flags & UFBXT_FILE_TEST_FLAG_ALLOW_STRICT_ERROR) != 0; + bool skip_opts_checks = (flags & UFBXT_FILE_TEST_FLAG_SKIP_LOAD_OPTS_CHECKS) != 0; + bool fuzz_always = (flags & UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS) != 0; + bool diff_always = (flags & UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) != 0; + + const ufbx_load_opts *fuzz_opts = NULL; + if ((flags & UFBXT_FILE_TEST_FLAG_FUZZ_OPTS) != 0) { + fuzz_opts = &user_opts; + } + + ufbx_scene *obj_scene = NULL; + if (obj_file) { + ufbxt_logf("%s [diff target found]", buf); + } + + ufbxt_begin_fuzz(); + + if (obj_file && !g_skip_obj_test && !alternative) { + ufbx_load_opts obj_opts = { 0 }; + obj_opts.load_external_files = true; + + ufbx_error obj_error; + obj_scene = ufbx_load_file(buf, &obj_opts, &obj_error); + if (!obj_scene) { + ufbxt_log_error(&obj_error); + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to parse .obj file"); + } + ufbxt_assert(obj_scene->metadata.file_format == UFBX_FILE_FORMAT_OBJ); + ufbxt_check_scene(obj_scene); + + ufbxt_diff_error err = { 0 }; + ufbxt_diff_to_obj(obj_scene, obj_file, &err, 0); + if (err.num > 0) { + ufbx_real avg = err.sum / (ufbx_real)err.num; + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", avg, err.max, err.num); + } + + size_t size = 0; + void *data = ufbxt_read_file(buf, &size); + ufbxt_assert(data); + + snprintf(base_name, sizeof(base_name), "%s_obj", name); + if (!alternative || fuzz_always) { + ufbxt_do_fuzz(base_name, data, size, buf, allow_error, UFBX_FILE_FORMAT_UNKNOWN, fuzz_opts); + } + + free(data); + } + + uint32_t num_opened = 0; + + for (uint32_t fi = 0; fi < 4; fi++) { + for (uint32_t vi = 0; vi < ufbxt_arraycount(ufbxt_file_versions); vi++) { + uint32_t version = ufbxt_file_versions[vi]; + const char *format = NULL; + const char *ext = "fbx"; + switch (fi) { + case 0: format = "binary"; break; + case 1: format = "ascii"; break; + case 2: format = "mtl"; ext = "mtl"; break; + case 3: format = "obj"; ext = "obj"; break; + } + ufbxt_assert(format); + + if (suffix) { + snprintf(buf, sizeof(buf), "%s%s_%u_%s_%s.%s", data_root, name, version, format, suffix, ext); + snprintf(base_name, sizeof(base_name), "%s_%u_%s_%s", name, version, format, suffix); + } else { + snprintf(buf, sizeof(buf), "%s%s_%u_%s.%s", data_root, name, version, format, ext); + snprintf(base_name, sizeof(base_name), "%s_%u_%s", name, version, format); + } + + if (g_file_version && version != g_file_version) continue; + if (g_file_type && strcmp(format, g_file_type)) continue; + + size_t size = 0; + void *data = ufbxt_read_file(buf, &size); + if (!data) continue; + + bool expect_diff_fail = (flags & UFBXT_FILE_TEST_FLAG_DIFF_EXPECT_FAIL) != 0; + if ((flags & UFBXT_FILE_TEST_FLAG_DIFF_EXPECT_FAIL_POST_7000) != 0 && version >= 7000) { + expect_diff_fail = true; + } + + num_opened++; + ufbxt_logf("%s", buf); + + ufbx_error error; + + ufbx_load_opts load_opts = user_opts; + if (g_dedicated_allocs) { + load_opts.temp_allocator.huge_threshold = 1; + load_opts.result_allocator.huge_threshold = 1; + } + + load_opts.evaluate_skinning = true; + load_opts.load_external_files = true; + + if (!load_opts.filename.length) { + load_opts.filename.data = buf; + load_opts.filename.length = SIZE_MAX; + } + + if (fi < 2) { + load_opts.file_format = UFBX_FILE_FORMAT_FBX; + } else if (fi == 2) { + load_opts.file_format = UFBX_FILE_FORMAT_MTL; + } else if (fi == 3) { + load_opts.file_format = UFBX_FILE_FORMAT_OBJ; + } + + ufbxt_progress_ctx progress_ctx = { 0 }; + + ufbx_load_opts memory_opts = load_opts; + memory_opts.progress_cb.fn = &ufbxt_measure_progress; + memory_opts.progress_cb.user = &progress_ctx; + + uint64_t load_begin = cputime_cpu_tick(); + ufbx_scene *scene = ufbx_load_memory(data, size, &memory_opts, &error); + uint64_t load_end = cputime_cpu_tick(); + + if (scene) { + ufbxt_check_scene(scene); + ufbxt_assert(progress_ctx.calls >= size / 0x4000 / 2); + } else if (!allow_error) { + ufbxt_log_error(&error); + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to parse file"); + } + + ufbxt_progress_ctx stream_progress_ctx = { 0 }; + + bool temp_freed = false, result_freed = false; + + ufbx_load_opts stream_opts = load_opts; + ufbxt_init_allocator(&stream_opts.temp_allocator, &temp_freed); + ufbxt_init_allocator(&stream_opts.result_allocator, &result_freed); + stream_opts.file_format = UFBX_FILE_FORMAT_UNKNOWN; + stream_opts.read_buffer_size = 1; + stream_opts.temp_allocator.huge_threshold = 2; + stream_opts.result_allocator.huge_threshold = 2; + stream_opts.filename.data = NULL; + stream_opts.filename.length = 0; + stream_opts.progress_cb.fn = &ufbxt_measure_progress; + stream_opts.progress_cb.user = &stream_progress_ctx; + stream_opts.progress_interval_hint = 1; + stream_opts.retain_dom = true; + + if ((flags & UFBXT_FILE_TEST_FLAG_ALLOW_INVALID_UNICODE) == 0) { + stream_opts.unicode_error_handling = UFBX_UNICODE_ERROR_HANDLING_ABORT_LOADING; + } + + ufbx_scene *streamed_scene = ufbx_load_file(buf, &stream_opts, &error); + if (streamed_scene) { + ufbxt_check_scene(streamed_scene); + ufbxt_assert(streamed_scene->dom_root); + ufbxt_assert(streamed_scene->metadata.file_format == load_opts.file_format); + } else if (!allow_error) { + ufbxt_log_error(&error); + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to parse streamed file"); + } + + // Try a couple of read buffer sizes + if (g_fuzz && !g_fuzz_no_buffer && g_fuzz_step == SIZE_MAX && (!alternative || fuzz_always)) { + ufbxt_begin_fuzz(); + + int fail_sz = -1; + + int buf_sz = 0; + #pragma omp parallel for schedule(dynamic, 4) + for (buf_sz = 0; buf_sz < (int)size; buf_sz++) { + if (ufbxt_fuzz_should_skip(buf_sz)) continue; + + if (omp_get_thread_num() == 0) { + if (buf_sz % 16 == 0) { + fprintf(stderr, "\rFuzzing read buffer size %s: %d/%d", base_name, buf_sz, (int)size); + fflush(stderr); + } + } + #if UFBXT_HAS_THREADLOCAL + t_jmp_buf = (ufbxt_jmp_buf*)calloc(1, sizeof(ufbxt_jmp_buf)); + #endif + if (!ufbxt_setjmp(*t_jmp_buf)) { + ufbx_load_opts load_opts = { 0 }; + load_opts.read_buffer_size = (size_t)buf_sz; + ufbx_scene *buf_scene = ufbx_load_file(buf, &load_opts, NULL); + ufbxt_assert(buf_scene); + ufbxt_check_scene(buf_scene); + ufbx_free_scene(buf_scene); + } else { + #pragma omp critical(fail_sz) + { + fail_sz = buf_sz; + } + } + #if UFBXT_HAS_THREADLOCAL + free(t_jmp_buf); + t_jmp_buf = NULL; + #endif + } + + if (fail_sz >= 0 && !allow_error) { + size_t error_size = 256; + char *error = (char*)malloc(error_size); + ufbxt_assert(error); + snprintf(error, error_size, "Failed to parse with: read_buffer_size = %d", fail_sz); + printf("%s: %s\n", base_name, error); + ufbxt_assert_fail(__FILE__, __LINE__, error); + } else { + fprintf(stderr, "\rFuzzing read buffer size %s: %d/%d\n", base_name, (int)size, (int)size); + } + } + + // Ignore geometry, animations, and both + + if (!skip_opts_checks) { + { + ufbx_error ignore_error; + ufbx_load_opts opts = load_opts; + opts.ignore_geometry = true; + ufbx_scene *ignore_scene = ufbx_load_memory(data, size, &opts, &ignore_error); + if (ignore_scene) { + ufbxt_check_scene(ignore_scene); + ufbx_free_scene(ignore_scene); + } else if (!allow_error) { + ufbxt_log_error(&ignore_error); + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to parse file ignoring geometry"); + } + } + + { + ufbx_error ignore_error; + ufbx_load_opts opts = load_opts; + opts.ignore_animation = true; + ufbx_scene *ignore_scene = ufbx_load_memory(data, size, &opts, &ignore_error); + if (ignore_scene) { + ufbxt_check_scene(ignore_scene); + ufbx_free_scene(ignore_scene); + } else if (!allow_error) { + ufbxt_log_error(&ignore_error); + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to parse file ignoring animation"); + } + } + + { + ufbx_error ignore_error; + ufbx_load_opts opts = load_opts; + opts.ignore_embedded = true; + ufbx_scene *ignore_scene = ufbx_load_memory(data, size, &opts, &ignore_error); + if (ignore_scene) { + ufbxt_check_scene(ignore_scene); + ufbx_free_scene(ignore_scene); + } else if (!allow_error) { + ufbxt_log_error(&ignore_error); + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to parse file ignoring embedded files"); + } + } + + { + ufbx_error ignore_error; + ufbx_load_opts opts = load_opts; + opts.ignore_geometry = true; + opts.ignore_animation = true; + opts.ignore_embedded = true; + ufbx_scene *ignore_scene = ufbx_load_memory(data, size, &opts, &ignore_error); + if (ignore_scene) { + ufbxt_check_scene(ignore_scene); + ufbx_free_scene(ignore_scene); + } else if (!allow_error) { + ufbxt_log_error(&ignore_error); + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to parse file ignoring everything"); + } + } + + // Strict mode + { + ufbx_load_opts strict_opts = load_opts; + strict_opts.disable_quirks = true; + strict_opts.strict = true; + strict_opts.no_format_from_content = true; + strict_opts.no_format_from_extension = true; + + ufbx_error strict_error; + ufbx_scene *strict_scene = ufbx_load_file(buf, &strict_opts, &strict_error); + if (strict_scene) { + ufbxt_check_scene(strict_scene); + ufbxt_assert(strict_scene->metadata.file_format == load_opts.file_format); + ufbx_free_scene(strict_scene); + } else if (!allow_error && !allow_strict_error) { + ufbxt_log_error(&strict_error); + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to parse file with strict options"); + } + } + + // Loose mode + { + ufbx_load_opts loose_opts = load_opts; + loose_opts.allow_missing_vertex_position = true; + loose_opts.allow_nodes_out_of_root = true; + loose_opts.allow_null_material = true; + loose_opts.connect_broken_elements = true; + loose_opts.generate_missing_normals = true; + loose_opts.ignore_missing_external_files = true; + + ufbx_error loose_error; + ufbx_scene *loose_scene = ufbx_load_file(buf, &loose_opts, &loose_error); + if (loose_scene) { + ufbxt_check_scene(loose_scene); + ufbxt_assert(loose_scene->metadata.file_format == load_opts.file_format); + ufbx_free_scene(loose_scene); + } else if (!allow_error) { + ufbxt_log_error(&loose_error); + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to parse file with loose options"); + } + } + } + + if (scene) { + ufbxt_logf(".. Loaded in %.2fms: File %.1fkB, temp %.1fkB (%zu allocs), result %.1fkB (%zu allocs)", + cputime_cpu_delta_to_sec(NULL, load_end - load_begin) * 1e3, + (double)size * 1e-3, + (double)scene->metadata.temp_memory_used * 1e-3, + scene->metadata.temp_allocs, + (double)scene->metadata.result_memory_used * 1e-3, + scene->metadata.result_allocs + ); + + if (fi <= 1) { + ufbxt_assert(scene->metadata.file_format == UFBX_FILE_FORMAT_FBX); + ufbxt_assert(scene->metadata.ascii == ((fi == 1) ? 1 : 0)); + ufbxt_assert(scene->metadata.version == version); + } else if (fi == 2) { + ufbxt_assert(scene->metadata.file_format == UFBX_FILE_FORMAT_MTL); + } else if (fi == 3) { + ufbxt_assert(scene->metadata.file_format == UFBX_FILE_FORMAT_OBJ); + } + + ufbxt_check_scene(scene); + } + + // Evaluate all the default animation and all stacks + + if (scene) { + uint64_t eval_begin = cputime_cpu_tick(); + ufbx_scene *state = ufbx_evaluate_scene(scene, &scene->anim, 1.0, NULL, NULL); + uint64_t eval_end = cputime_cpu_tick(); + + ufbxt_assert(state); + ufbxt_check_scene(state); + + ufbxt_logf(".. Evaluated in %.2fms: File %.1fkB, temp %.1fkB (%zu allocs), result %.1fkB (%zu allocs)", + cputime_cpu_delta_to_sec(NULL, eval_end - eval_begin) * 1e3, + (double)size * 1e-3, + (double)state->metadata.temp_memory_used * 1e-3, + state->metadata.temp_allocs, + (double)state->metadata.result_memory_used * 1e-3, + state->metadata.result_allocs + ); + + ufbx_free_scene(state); + } + + if (scene) { + for (size_t i = 1; i < scene->anim_stacks.count; i++) { + ufbx_scene *state = ufbx_evaluate_scene(scene, &scene->anim_stacks.data[i]->anim, 1.0, NULL, NULL); + ufbxt_assert(state); + ufbxt_check_scene(state); + ufbx_free_scene(state); + } + } + + ufbxt_diff_error err = { 0 }; + + size_t num_failing_diff_checks = 0; + if (scene && obj_file && (!alternative || diff_always)) { + if (expect_diff_fail) { + ufbxt_begin_expect_fail(); + ufbxt_diff_to_obj(scene, obj_file, &err, 0); + num_failing_diff_checks = ufbxt_end_expect_fail(); + } else { + ufbxt_diff_to_obj(scene, obj_file, &err, 0); + } + } + + if (!skip_opts_checks) { + { + ufbx_error opt_error; + ufbx_load_opts opts = load_opts; + opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES; + ufbx_scene *opt_scene = ufbx_load_memory(data, size, &opts, &opt_error); + if (opt_scene) { + ufbxt_check_scene(opt_scene); + + if (scene && obj_file && (!alternative || diff_always) && !expect_diff_fail) { + uint32_t diff_flags = 0; + if ((flags & UFBXT_FILE_TEST_FLAG_OPT_HANDLING_IGNORE_NORMALS_IN_DIFF) != 0) { + diff_flags |= UFBXT_OBJ_DIFF_FLAG_IGNORE_NORMALS; + } + ufbxt_diff_to_obj(opt_scene, obj_file, &err, diff_flags); + } + + ufbx_free_scene(opt_scene); + } else if (!allow_error) { + ufbxt_log_error(&opt_error); + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to parse file with helper nodes"); + } + } + + { + ufbx_error opt_error; + ufbx_load_opts opts = load_opts; + opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY; + ufbx_scene *opt_scene = ufbx_load_memory(data, size, &opts, &opt_error); + if (opt_scene) { + ufbxt_check_scene(opt_scene); + + if (scene && obj_file && (!alternative || diff_always) && !expect_diff_fail) { + uint32_t diff_flags = 0; + if ((flags & UFBXT_FILE_TEST_FLAG_OPT_HANDLING_IGNORE_NORMALS_IN_DIFF) != 0) { + diff_flags |= UFBXT_OBJ_DIFF_FLAG_IGNORE_NORMALS; + } + ufbxt_diff_to_obj(opt_scene, obj_file, &err, diff_flags); + } + + ufbx_free_scene(opt_scene); + } else if (!allow_error) { + ufbxt_log_error(&opt_error); + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to parse file with modifying geometry"); + } + } + } + + test_fn(scene, &err, &error); + + if (err.num > 0) { + ufbx_real avg = err.sum / (ufbx_real)err.num; + if (expect_diff_fail) { + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests, %zu failing as expected)", avg, err.max, err.num, num_failing_diff_checks); + } else { + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", avg, err.max, err.num); + } + } + + if (!alternative || fuzz_always) { + ufbxt_do_fuzz(base_name, data, size, buf, allow_error, UFBX_FILE_FORMAT_UNKNOWN, fuzz_opts); + } + + if ((!alternative || fuzz_always) && scene && !g_no_fuzz) { + // Run known buffer size checks + for (size_t i = 0; i < ufbxt_arraycount(g_buffer_checks); i++) { + const ufbxt_buffer_check *check = &g_buffer_checks[i]; + if (strcmp(check->name, base_name)) continue; + + ufbxt_logf(".. Read buffer limit %zu"); + + ufbx_load_opts load_opts = { 0 }; + load_opts.read_buffer_size = check->read_buffer_size; + ufbx_scene *buf_scene = ufbx_load_file(buf, &load_opts, &error); + if (!buf_scene) { + ufbxt_log_error(&error); + } + ufbxt_assert(buf_scene); + ufbxt_check_scene(buf_scene); + ufbx_free_scene(buf_scene); + } + } + + ufbx_free_scene(scene); + ufbx_free_scene(streamed_scene); + + free(data); + + ufbxt_assert(temp_freed); + ufbxt_assert(result_freed); + + } + } + + if (num_opened == 0) { + ufbxt_assert_fail(__FILE__, __LINE__, "File not found"); + } + + if (obj_scene) { + ufbx_free_scene(obj_scene); + } + + free(obj_file); + + if (prev_fuzz_quality > 0) { + g_fuzz_quality = prev_fuzz_quality; + } +} + +typedef struct ufbxt_inflate_opts { + size_t fast_bits; + bool force_fast; + bool primary; +} ufbxt_inflate_opts; + +void ufbxt_do_deflate_test(const char *name, void (*test_fn)(const ufbxt_inflate_opts *opts)) +{ + size_t opt = 0; + + { + ufbxt_inflate_opts opts = { 0 }; + opts.primary = true; + if (g_deflate_opt == SIZE_MAX || opt == g_deflate_opt) { + ufbxt_logf("(opt %u) default", opt, opts.fast_bits); + test_fn(&opts); + } + opt++; + } + + for (uint32_t fast_bits = 1; fast_bits <= 8; fast_bits++) { + ufbxt_inflate_opts opts = { 0 }; + opts.fast_bits = fast_bits; + if (g_deflate_opt == SIZE_MAX || opt == g_deflate_opt) { + ufbxt_logf("(opt %u) fast_bits = %u", opt, fast_bits); + test_fn(&opts); + } + opt++; + } + + { + ufbxt_inflate_opts opts = { 0 }; + opts.force_fast = true; + if (g_deflate_opt == SIZE_MAX || opt == g_deflate_opt) { + ufbxt_logf("(opt %u) force_fast = true", opt); + test_fn(&opts); + } + opt++; + } +} + +#define UFBXT_IMPL 1 +#define UFBXT_TEST(name) void ufbxt_test_fn_##name(void) +#define UFBXT_FILE_TEST_FLAGS(name, flags) void ufbxt_test_fn_imp_file_##name(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error); \ + void ufbxt_test_fn_file_##name(void) { \ + ufbx_load_opts user_opts = { 0 }; \ + ufbxt_do_file_test(#name, &ufbxt_test_fn_imp_file_##name, NULL, user_opts, flags); } \ + void ufbxt_test_fn_imp_file_##name(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error) +#define UFBXT_FILE_TEST_PATH_FLAGS(name, path, flags) void ufbxt_test_fn_imp_file_##name(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error); \ + void ufbxt_test_fn_file_##name(void) { \ + ufbx_load_opts user_opts = { 0 }; \ + ufbxt_do_file_test(path, &ufbxt_test_fn_imp_file_##name, NULL, user_opts, flags); } \ + void ufbxt_test_fn_imp_file_##name(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error) +#define UFBXT_FILE_TEST_OPTS_FLAGS(name, get_opts, flags) void ufbxt_test_fn_imp_file_##name(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error); \ + void ufbxt_test_fn_file_##name(void) { \ + ufbxt_do_file_test(#name, &ufbxt_test_fn_imp_file_##name, NULL, get_opts(), flags); } \ + void ufbxt_test_fn_imp_file_##name(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error) +#define UFBXT_FILE_TEST_SUFFIX_FLAGS(name, suffix, flags) void ufbxt_test_fn_imp_file_##name##_##suffix(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error); \ + void ufbxt_test_fn_file_##name##_##suffix(void) { \ + ufbx_load_opts user_opts = { 0 }; \ + ufbxt_do_file_test(#name, &ufbxt_test_fn_imp_file_##name##_##suffix, #suffix, user_opts, flags | UFBXT_FILE_TEST_FLAG_ALTERNATIVE); } \ + void ufbxt_test_fn_imp_file_##name##_##suffix(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error) +#define UFBXT_FILE_TEST_SUFFIX_OPTS_FLAGS(name, suffix, get_opts, flags) void ufbxt_test_fn_imp_file_##name##_##suffix(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error); \ + void ufbxt_test_fn_file_##name##_##suffix(void) { \ + ufbxt_do_file_test(#name, &ufbxt_test_fn_imp_file_##name##_##suffix, #suffix, get_opts(), flags | UFBXT_FILE_TEST_FLAG_ALTERNATIVE); } \ + void ufbxt_test_fn_imp_file_##name##_##suffix(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error) +#define UFBXT_FILE_TEST_ALT_FLAGS(name, file, flags) void ufbxt_test_fn_imp_file_##name(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error); \ + void ufbxt_test_fn_file_##name(void) { \ + ufbx_load_opts user_opts = { 0 }; \ + ufbxt_do_file_test(#file, &ufbxt_test_fn_imp_file_##name, NULL, user_opts, flags | UFBXT_FILE_TEST_FLAG_ALTERNATIVE); } \ + void ufbxt_test_fn_imp_file_##name(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error) +#define UFBXT_FILE_TEST_OPTS_ALT_FLAGS(name, file, get_opts, flags) void ufbxt_test_fn_imp_file_##name(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error); \ + void ufbxt_test_fn_file_##name(void) { \ + ufbxt_do_file_test(#file, &ufbxt_test_fn_imp_file_##name, NULL, get_opts(), flags | UFBXT_FILE_TEST_FLAG_ALTERNATIVE); } \ + void ufbxt_test_fn_imp_file_##name(ufbx_scene *scene, ufbxt_diff_error *err, ufbx_error *load_error) +#define UFBXT_DEFLATE_TEST(name) void ufbxt_test_fn_imp_deflate_##name(const ufbxt_inflate_opts *opts); \ + void ufbxt_test_fn_deflate_##name(void) { \ + ufbxt_do_deflate_test(#name, &ufbxt_test_fn_imp_deflate_##name); } \ + void ufbxt_test_fn_imp_deflate_##name(const ufbxt_inflate_opts *opts) + +#define UFBXT_FILE_TEST(name) UFBXT_FILE_TEST_FLAGS(name, 0) +#define UFBXT_FILE_TEST_PATH(name, path) UFBXT_FILE_TEST_PATH_FLAGS(name, path, 0) +#define UFBXT_FILE_TEST_OPTS(name, get_opts) UFBXT_FILE_TEST_OPTS_FLAGS(name, get_opts, 0) +#define UFBXT_FILE_TEST_SUFFIX(name, suffix) UFBXT_FILE_TEST_SUFFIX_FLAGS(name, suffix, 0) +#define UFBXT_FILE_TEST_SUFFIX_OPTS(name, suffix, get_opts) UFBXT_FILE_TEST_SUFFIX_OPTS_FLAGS(name, suffix, get_opts, 0) +#define UFBXT_FILE_TEST_ALT(name, file) UFBXT_FILE_TEST_ALT_FLAGS(name, file, 0) +#define UFBXT_FILE_TEST_OPTS_ALT(name, file, get_opts) UFBXT_FILE_TEST_OPTS_ALT_FLAGS(name, file, get_opts, 0) + +#include "all_tests.h" + +#undef UFBXT_IMPL +#undef UFBXT_TEST +#undef UFBXT_FILE_TEST_FLAGS +#undef UFBXT_FILE_TEST_PATH_FLAGS +#undef UFBXT_FILE_TEST_OPTS_FLAGS +#undef UFBXT_FILE_TEST_SUFFIX_FLAGS +#undef UFBXT_FILE_TEST_SUFFIX_OPTS_FLAGS +#undef UFBXT_FILE_TEST_ALT_FLAGS +#undef UFBXT_FILE_TEST_OPTS_ALT_FLAGS +#undef UFBXT_DEFLATE_TEST +#define UFBXT_IMPL 0 +#define UFBXT_TEST(name) { UFBXT_TEST_GROUP, #name, &ufbxt_test_fn_##name }, +#define UFBXT_FILE_TEST_FLAGS(name, flags) { UFBXT_TEST_GROUP, #name, &ufbxt_test_fn_file_##name }, +#define UFBXT_FILE_TEST_PATH_FLAGS(name, path, flags) { UFBXT_TEST_GROUP, #name, &ufbxt_test_fn_file_##name }, +#define UFBXT_FILE_TEST_OPTS_FLAGS(name, get_opts, flags) { UFBXT_TEST_GROUP, #name, &ufbxt_test_fn_file_##name }, +#define UFBXT_FILE_TEST_SUFFIX_FLAGS(name, suffix, flags) { UFBXT_TEST_GROUP, #name "_" #suffix, &ufbxt_test_fn_file_##name##_##suffix }, +#define UFBXT_FILE_TEST_SUFFIX_OPTS_FLAGS(name, suffix, get_opts, flags) { UFBXT_TEST_GROUP, #name "_" #suffix, &ufbxt_test_fn_file_##name##_##suffix }, +#define UFBXT_FILE_TEST_ALT_FLAGS(name, file, flags) { UFBXT_TEST_GROUP, #name, &ufbxt_test_fn_file_##name }, +#define UFBXT_FILE_TEST_OPTS_ALT_FLAGS(name, file, get_opts, flags) { UFBXT_TEST_GROUP, #name, &ufbxt_test_fn_file_##name }, +#define UFBXT_DEFLATE_TEST(name) { UFBXT_TEST_GROUP, #name, &ufbxt_test_fn_deflate_##name }, + +ufbxt_test g_tests[] = { + #include "all_tests.h" +}; + +typedef struct { + const char *name; + uint32_t num_total; + uint32_t num_ran; + uint32_t num_ok; +} ufbxt_test_stats; + +ufbxt_test_stats g_test_groups[ufbxt_arraycount(g_tests)]; +size_t g_num_groups = 0; + +ufbxt_test_stats *ufbxt_get_test_group(const char *name) +{ + for (size_t i = g_num_groups; i > 0; --i) { + ufbxt_test_stats *group = &g_test_groups[i - 1]; + if (!strcmp(group->name, name)) return group; + } + + ufbxt_test_stats *group = &g_test_groups[g_num_groups++]; + group->name = name; + return group; +} + +int ufbxt_run_test(ufbxt_test *test) +{ + printf("%s: ", test->name); + fflush(stdout); + + g_error.stack_size = 0; + g_hint[0] = '\0'; + + g_expect_fail = false; + + g_current_test = test; + if (!ufbxt_setjmp(g_test_jmp)) { + g_skip_print_ok = false; + test->func(); + ufbxt_assert(!g_expect_fail); + if (!g_skip_print_ok) { + printf("OK\n"); + fflush(stdout); + } + return 1; + } else { + if (g_hint[0]) { + printf("Hint: %s\n", g_hint); + } + if (g_error.stack_size) { + ufbxt_log_error(&g_error); + } + + return 0; + } +} + +#if defined(UFBXT_STACK_LIMIT) +int ufbxt_thread_main(int argc, char **argv) +#else +int main(int argc, char **argv) +#endif +{ + uint32_t num_tests = ufbxt_arraycount(g_tests); + uint32_t num_ok = 0; + const char *test_filter = NULL; + const char *test_group = NULL; + + cputime_init(); + + for (int i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")) { + g_verbose = 1; + } + if (!strcmp(argv[i], "-t") || !strcmp(argv[i], "--test")) { + if (++i < argc) { + test_filter = argv[i]; + } + } + if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--data")) { + if (++i < argc) { + size_t len = strlen(argv[i]); + if (len + 2 > sizeof(data_root)) { + fprintf(stderr, "-d: Data root too long"); + return 1; + } + memcpy(data_root, argv[i], len); + char end = argv[i][len - 1]; + if (end != '/' && end != '\\') { + data_root[len] = '/'; + data_root[len + 1] = '\0'; + } + } + } + if (!strcmp(argv[i], "-f") || !strcmp(argv[i], "--format")) { + if (++i < argc) g_file_version = (uint32_t)atoi(argv[i]); + if (++i < argc) g_file_type = argv[i]; + } + if (!strcmp(argv[i], "-g") || !strcmp(argv[i], "--group")) { + if (++i < argc) { + test_group = argv[i]; + } + } + + if (!strcmp(argv[i], "--deflate-opt")) { + if (++i < argc) g_deflate_opt = (size_t)atoi(argv[i]); + } + + if (!strcmp(argv[i], "--allow-non-thread-safe")) { + g_allow_non_thread_safe = true; + } + + if (!strcmp(argv[i], "--fuzz")) { + g_fuzz = true; + } + + if (!strcmp(argv[i], "--sink")) { + g_sink = true; + } + + if (!strcmp(argv[i], "--patch-all-byte-values")) { + g_all_byte_values = true; + } + + if (!strcmp(argv[i], "--patch-start")) { + if (++i < argc) g_patch_start = atoi(argv[i]); + } + + if (!strcmp(argv[i], "--dedicated-allocs")) { + g_dedicated_allocs = true; + } + + if (!strcmp(argv[i], "--skip-obj-test")) { + g_skip_obj_test = true; + } + + if (!strcmp(argv[i], "--fuzz-no-patch")) { + g_fuzz_no_patch = true; + } + + if (!strcmp(argv[i], "--fuzz-no-truncate")) { + g_fuzz_no_truncate = true; + } + + if (!strcmp(argv[i], "--fuzz-no-cancel")) { + g_fuzz_no_cancel = true; + } + + if (!strcmp(argv[i], "--fuzz-no-buffer")) { + g_fuzz_no_buffer = true; + } + + if (!strcmp(argv[i], "--fuzz-quality")) { + if (++i < argc) g_fuzz_quality = atoi(argv[i]); + if (g_fuzz_quality < 1) g_fuzz_quality = 1; + if (g_fuzz_quality > 31) g_fuzz_quality = 31; + } + + if (!strcmp(argv[i], "--heavy-fuzz-quality")) { + if (++i < argc) g_heavy_fuzz_quality = atoi(argv[i]); + if (g_heavy_fuzz_quality < 1) g_heavy_fuzz_quality = 1; + if (g_heavy_fuzz_quality > 31) g_heavy_fuzz_quality = 31; + } + + if (!strcmp(argv[i], "--threads")) { + #if _OPENMP + if (++i < argc) omp_set_num_threads(atoi(argv[i])); + #endif + } + + if (!strcmp(argv[i], "--fuzz-step")) { + if (++i < argc) g_fuzz_step = (size_t)atoi(argv[i]); + } + + if (!strcmp(argv[i], "--fuzz-file")) { + if (++i < argc) g_fuzz_file = (size_t)atoi(argv[i]); + } + + if (!strcmp(argv[i], "--no-fuzz")) { + g_no_fuzz = true; + } + } + + // Autofill heavy fuzz quality if necessary + if (g_heavy_fuzz_quality < 0) { + g_heavy_fuzz_quality = g_fuzz_quality - 4; + if (g_heavy_fuzz_quality < 1) { + g_heavy_fuzz_quality = 1; + } + } + + #ifdef _OPENMP + if (omp_get_num_threads() > 256) { + omp_set_num_threads(256); + } + #else + if (g_fuzz) { + fprintf(stderr, "Fuzzing without threads, compile with OpenMP for better performance!\n"); + } + #endif + + uint32_t num_ran = 0; + for (uint32_t i = 0; i < num_tests; i++) { + ufbxt_test *test = &g_tests[i]; + ufbxt_test_stats *group_stats = ufbxt_get_test_group(test->group); + group_stats->num_total++; + + if (test_filter && strcmp(test->name, test_filter)) { + continue; + } + if (test_group && strcmp(test->group, test_group)) { + continue; + } + + group_stats->num_ran++; + num_ran++; + bool print_always = false; + if (ufbxt_run_test(test)) { + num_ok++; + group_stats->num_ok++; + } else { + print_always = true; + } + + ufbxt_log_flush(print_always); + } + + if (num_ok < num_tests) { + printf("\n"); + for (uint32_t i = 0; i < num_tests; i++) { + ufbxt_test *test = &g_tests[i]; + if (test->fail.failed) { + ufbxt_fail *fail = &test->fail; + const char *file = fail->file, *find; + find = strrchr(file, '/'); + file = find ? find + 1 : file; + find = strrchr(file, '\\'); + file = find ? find + 1 : file; + printf("(%s) %s:%u: %s\n", test->name, + file, fail->line, fail->expr); + } + } + } + + printf("\nTests passed: %u/%u\n", num_ok, num_ran); + + if (g_verbose) { + size_t num_skipped = 0; + for (size_t i = 0; i < g_num_groups; i++) { + ufbxt_test_stats *group = &g_test_groups[i]; + if (group->num_ran == 0) { + num_skipped++; + continue; + } + printf(" %s: %u/%u\n", group->name, group->num_ok, group->num_ran); + } + if (num_skipped > 0) { + printf(" .. skipped %zu groups\n", num_skipped); + } + } + + if (g_fuzz) { + printf("Fuzz checks:\n\nstatic const ufbxt_fuzz_check g_fuzz_checks[] = {\n"); + for (size_t i = 0; i < ufbxt_arraycount(g_checks); i++) { + ufbxt_check_line *check = &g_checks[i]; + if (check->step == 0) continue; + + char safe_desc[60]; + size_t safe_desc_len = 0; + for (const char *c = check->description; *c; c++) { + if (sizeof(safe_desc) - safe_desc_len < 6) { + safe_desc[safe_desc_len++] = '.'; + safe_desc[safe_desc_len++] = '.'; + safe_desc[safe_desc_len++] = '.'; + break; + } + if (*c == '"' || *c == '\\') { + safe_desc[safe_desc_len++] = '\\'; + } + safe_desc[safe_desc_len++] = *c; + } + safe_desc[safe_desc_len] = '\0'; + + int32_t patch_offset = check->patch_offset != UINT32_MAX ? (int32_t)(check->patch_offset - 1) : -1; + + printf("\t{ \"%s\", %u, %d, %u, %u, %u, %u, %u, \"%s\" },\n", check->test_name, + (uint32_t)i, patch_offset, (uint32_t)check->patch_value, (uint32_t)check->temp_limit, (uint32_t)check->result_limit, (uint32_t)check->truncate_length, + (uint32_t)check->cancel_step, safe_desc); + + free(check->test_name); + } + printf("};\n"); + } + + if (g_sink) { + printf("%u\n", ufbxt_sink); + } + + return num_ok == num_ran ? 0 : 1; +} + +#if defined(UFBXT_STACK_LIMIT) + +UFBXT_THREAD_ENTRYPOINT +{ + ufbxt_main_return = ufbxt_thread_main(ufbxt_main_argc, ufbxt_main_argv); + ufbxt_thread_return(); +} + +int main(int argc, char **argv) +{ + ufbxt_main_argc = argc; + ufbxt_main_argv = argv; + bool ok = ufbxt_run_thread(); + if (!ok) { + fprintf(stderr, "Failed to run thread with stack size of %zu bytes\n", (size_t)(UFBXT_STACK_LIMIT)); + return 1; + } + return ufbxt_main_return; +} + +#endif + diff --git a/modules/ufbx/test/test_animation.h b/modules/ufbx/test/test_animation.h new file mode 100644 index 0000000..7f5ba11 --- /dev/null +++ b/modules/ufbx/test/test_animation.h @@ -0,0 +1,570 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "animation" + +#if UFBXT_IMPL +typedef struct { + int frame; + double value; +} ufbxt_key_ref; +#endif + +UFBXT_FILE_TEST(maya_interpolation_modes) +#if UFBXT_IMPL +{ + // Curve evaluated values at 24fps + static const ufbx_real values[] = { + -8.653366, // Start from zero time + -8.653366,-8.602998,-8.464664,-8.257528,-8.00075,-7.713489,-7.414906,-7.124163,-6.86042, + -6.642837,-6.490576,-6.388305,-6.306414,-6.242637,-6.19471,-6.160368,-6.137348,-6.123385, + -6.116215,-6.113573,-6.113196,-5.969524,-5.825851,-5.682179,-5.538507,-5.394835,-5.251163, + -5.107491,-4.963819,-4.820146,-4.676474,-4.532802,-4.38913,-4.245458,-4.101785,-3.958113,-4.1529, + -4.347686,-4.542472,-4.737258,-4.932045,-5.126832,-5.321618,-5.516404,-5.71119,-5.905977,-5.767788, + -5.315578,-4.954943,-4.83559,-4.856855,-4.960766,-5.118543,-4.976541,-4.885909,-4.865979,-4.93845, + -5.099224,-5.270246,-5.359269,-5.349404,-5.261964,-5.118543,-5.264501,-5.33535,-5.285445,-5.058857, + -4.69383,-4.357775,-4.124978,-3.981697,-3.904232,-3.875225,-3.875225,-3.875225,-3.875225,-3.875225, + -3.875225,-3.875225,-2.942738,-2.942738,-2.942738,-2.942738,-2.942738,-2.942738,-2.942738,-2.942738, + -2.942738,-1.243537,-1.243537,-1.243537,-1.243537,-1.243537,-1.243537,-1.243537,5.603338,5.603338, + 5.603338,5.603338,5.603338,5.603338,5.603338,5.603338,5.603338,5.603338,5.603338,5.603338,5.603338, + 5.603338,5.603338,5.603338,5.603338,5.603338,5.603338,5.603338,5.603338,5.603338,5.603338,5.603338,5.603338 + }; + + ufbxt_assert(scene->anim_layers.count == 1); + ufbx_anim_layer *layer = scene->anim_layers.data[0]; + for (size_t i = 0; i < layer->anim_values.count; i++) { + ufbx_anim_value *value = layer->anim_values.data[i]; + if (strcmp(value->name.data, "Lcl Translation")) continue; + ufbx_anim_curve *curve = value->curves[0]; + + size_t num_keys = 12; + ufbxt_assert(curve->keyframes.count == num_keys); + ufbx_keyframe *keys = curve->keyframes.data; + + static const ufbxt_key_ref key_ref[] = { + { 1, -8.653366 }, + { 11, -6.490576 }, + { 21, -6.113196 }, + { 36, -3.958113 }, + { 46, -5.905977 }, + { 53, -5.118543 }, + { 63, -5.118543 }, + { 73, -3.875225 }, + { 80, -2.942738 }, + { 89, -1.927362 }, + { 96, -1.243537 }, + { 120, 5.603338 }, + }; + ufbxt_assert(ufbxt_arraycount(key_ref) == num_keys); + + for (size_t i = 0; i < num_keys; i++) { + ufbxt_assert_close_real(err, keys[i].time, (double)key_ref[i].frame / 24.0); + ufbxt_assert_close_real(err, keys[i].value, key_ref[i].value); + if (i > 0) ufbxt_assert(keys[i].left.dx > 0.0f); + if (i + 1 < num_keys) ufbxt_assert(keys[i].right.dx > 0.0f); + } + + ufbxt_assert(keys[0].interpolation == UFBX_INTERPOLATION_CUBIC); + ufbxt_assert(keys[0].right.dy == 0.0f); + ufbxt_assert(keys[1].interpolation == UFBX_INTERPOLATION_CUBIC); + ufbxt_assert_close_real(err, keys[1].left.dy/keys[1].left.dx, keys[1].right.dy/keys[1].left.dx); + ufbxt_assert(keys[2].interpolation == UFBX_INTERPOLATION_LINEAR); + ufbxt_assert_close_real(err, keys[3].left.dy/keys[3].left.dx, keys[2].right.dy/keys[2].right.dx); + ufbxt_assert(keys[3].interpolation == UFBX_INTERPOLATION_LINEAR); + ufbxt_assert_close_real(err, keys[4].left.dy/keys[4].left.dx, keys[3].right.dy/keys[3].right.dx); + ufbxt_assert(keys[4].interpolation == UFBX_INTERPOLATION_CUBIC); + ufbxt_assert(keys[4].right.dy == 0.0f); + ufbxt_assert(keys[5].interpolation == UFBX_INTERPOLATION_CUBIC); + ufbxt_assert(keys[5].left.dy < 0.0f); + ufbxt_assert(keys[5].right.dy > 0.0f); + ufbxt_assert(keys[6].interpolation == UFBX_INTERPOLATION_CUBIC); + ufbxt_assert(keys[6].left.dy > 0.0f); + ufbxt_assert(keys[6].right.dy < 0.0f); + ufbxt_assert(keys[7].interpolation == UFBX_INTERPOLATION_CONSTANT_PREV); + ufbxt_assert(keys[8].interpolation == UFBX_INTERPOLATION_CONSTANT_PREV); + ufbxt_assert(keys[9].interpolation == UFBX_INTERPOLATION_CONSTANT_NEXT); + ufbxt_assert(keys[10].interpolation == UFBX_INTERPOLATION_CONSTANT_NEXT); + + for (size_t i = 0; i < ufbxt_arraycount(values); i++) { + // Round up to the next frame to make stepped tangents consistent + double time = (double)i * (1.0/24.0) + 0.000001; + ufbx_real value = ufbx_evaluate_curve(curve, time, 0.0); + ufbxt_assert_close_real(err, value, values[i]); + } + + size_t num_samples = 64 * 1024; + for (size_t i = 0; i < num_samples; i++) { + double time = (double)i * (5.0 / (double)num_samples); + ufbx_real value = ufbx_evaluate_curve(curve, time, 0.0); + ufbxt_assert(value >= -16.0f && value <= 16.0f); + } + } +} +#endif + +UFBXT_FILE_TEST(maya_auto_clamp) +#if UFBXT_IMPL +{ + // Curve evaluated values at 24fps + static const ufbx_real values[] = { + 0.000, 0.000, 0.273, 0.515, 0.718, 0.868, 0.945, 0.920, 0.779, 0.611, + 0.591, 0.747, 1.206, 2.059, 3.191, 4.489, 5.837, 7.121, 8.228, 9.042, + 9.449, 9.694, 10.128, 10.610, 10.873, 10.927, 10.854, 10.704, 10.502, + 10.264, 10.000, + }; + + ufbxt_assert(scene->anim_layers.count == 1); + ufbx_anim_layer *layer = scene->anim_layers.data[0]; + for (size_t i = 0; i < layer->anim_values.count; i++) { + ufbx_anim_value *value = layer->anim_values.data[i]; + if (strcmp(value->name.data, "Lcl Translation")) continue; + ufbx_anim_curve *curve = value->curves[0]; + ufbxt_assert(curve->keyframes.count == 4); + + for (size_t i = 0; i < ufbxt_arraycount(values); i++) { + double time = (double)i * (1.0/24.0); + ufbx_real value = ufbx_evaluate_curve(curve, time, 0.0); + ufbxt_assert_close_real(err, value, values[i]); + } + } +} +#endif + +UFBXT_FILE_TEST(maya_resampled) +#if UFBXT_IMPL +{ + static const ufbx_real values6[] = { + 0,0,0,0,0,0,0,0,0, + -0.004, -0.022, -0.056, -0.104, -0.166, -0.241, -0.328, -0.427, -0.536, -0.654, -0.783, + -0.919, -1.063, -1.214, -1.371, -1.533, -1.700, -1.871, -2.044, -2.220, -2.398, -2.577, + -2.755, -2.933, -3.109, -3.283, -3.454, -3.621, -3.784, -3.941, -4.093, -4.237, -4.374, + -4.503, -4.623, -4.733, -4.832, -4.920, -4.996, -5.059, -5.108, -5.143, -5.168, -5.186, + -5.200, -5.209, -5.215, -5.218, -5.220, -5.220, -5.216, -5.192, -5.151, -5.091, -5.013, + -4.919, -4.810, -4.686, + }; + + static const ufbx_real values7[] = { + 0,0,0,0,0,0,0,0, + 0.000, -0.004, -0.025, -0.061, -0.112, -0.176, -0.252, -0.337, -0.431, -0.533, -0.648, + -0.776, -0.915, -1.064, -1.219, -1.378, -1.539, -1.700, -1.865, -2.037, -2.216, -2.397, -2.580, + -2.761, -2.939, -3.111, -3.278, -3.447, -3.615, -3.782, -3.943, -4.098, -4.244, -4.379, + -4.500, -4.614, -4.722, -4.821, -4.911, -4.990, -5.056, -5.107, -5.143, -5.168, -5.186, -5.200, + -5.209, -5.215, -5.218, -5.220, -5.220, -5.215, -5.190, -5.145, -5.082, -5.002, -4.908, + -4.800, -4.680, -4.550, -4.403, -4.239, + }; + + const ufbx_real *values = scene->metadata.version >= 7000 ? values7 : values6; + size_t num_values = scene->metadata.version >= 7000 ? ufbxt_arraycount(values7) : ufbxt_arraycount(values6); + + ufbxt_assert(scene->anim_layers.count == 1); + ufbx_anim_layer *layer = scene->anim_layers.data[0]; + for (size_t i = 0; i < layer->anim_values.count; i++) { + ufbx_anim_value *value = layer->anim_values.data[i]; + if (strcmp(value->name.data, "Lcl Translation")) continue; + ufbx_anim_curve *curve = value->curves[0]; + + for (size_t i = 0; i < num_values; i++) { + double time = (double)i * (1.0/200.0); + ufbx_real value = ufbx_evaluate_curve(curve, time, 0.0); + ufbxt_assert_close_real(err, value, values[i]); + } + } +} +#endif + +#if UFBXT_IMPL + +typedef struct { + int frame; + ufbx_real intensity; + ufbx_vec3 color; +} ufbxt_anim_light_ref; + +typedef struct { + int frame; + ufbx_vec3 translation; + ufbx_vec3 rotation_euler; + ufbx_vec3 scale; +} ufbxt_anim_transform_ref; + +#endif + +UFBXT_FILE_TEST(maya_anim_light) +#if UFBXT_IMPL +{ + static const ufbxt_anim_light_ref refs[] = { + { 0, 3.072, { 0.148, 0.095, 0.440 } }, + { 12, 1.638, { 0.102, 0.136, 0.335 } }, + { 24, 1.948, { 0.020, 0.208, 0.149 } }, + { 32, 3.676, { 0.010, 0.220, 0.113 } }, + { 40, 4.801, { 0.118, 0.195, 0.115 } }, + { 48, 3.690, { 0.288, 0.155, 0.117 } }, + { 56, 1.565, { 0.421, 0.124, 0.119 } }, + { 60, 1.145, { 0.442, 0.119, 0.119 } }, + }; + + for (size_t i = 0; i < ufbxt_arraycount(refs); i++) { + const ufbxt_anim_light_ref *ref = &refs[i]; + + double time = ref->frame * (1.0/24.0); + ufbx_scene *state = ufbx_evaluate_scene(scene, &scene->anim, time, NULL, NULL); + ufbxt_assert(state); + + ufbxt_check_scene(state); + + ufbx_node *light_node = ufbx_find_node(state, "pointLight1"); + ufbxt_assert(light_node); + ufbx_light *light = light_node->light; + ufbxt_assert(light); + + ufbxt_assert_close_real(err, light->intensity, ref->intensity); + ufbxt_assert_close_vec3(err, light->color, ref->color); + + ufbx_free_scene(state); + } + + { + ufbx_node *node = ufbx_find_node(scene, "pointLight1"); + ufbxt_assert(node && node->light); + uint32_t element_id = node->light->element.element_id; + + ufbx_prop_override overrides[] = { + { element_id, "Intensity", { (ufbx_real)10.0 } }, + { element_id, "Color", { (ufbx_real)0.3, (ufbx_real)0.6, (ufbx_real)0.9 } }, + { element_id, "|NewProp", { 10, 20, 30 }, "Test" }, + { element_id, "IntProp", { 0, 0, 0 }, "", 15 }, + }; + + ufbx_anim anim = scene->anim; + anim.prop_overrides = ufbx_prepare_prop_overrides(overrides, ufbxt_arraycount(overrides)); + + ufbx_scene *state = ufbx_evaluate_scene(scene, &anim, 1.0f, NULL, NULL); + ufbxt_assert(state); + + ufbxt_check_scene(state); + + ufbx_node *light_node = ufbx_find_node(state, "pointLight1"); + ufbxt_assert(light_node); + ufbx_light *light = light_node->light; + ufbxt_assert(light); + + ufbx_vec3 ref_color = { (ufbx_real)0.3, (ufbx_real)0.6, (ufbx_real)0.9 }; + ufbxt_assert_close_real(err, light->intensity, 0.1f); + ufbxt_assert_close_vec3(err, light->color, ref_color); + + { + ufbx_vec3 ref_new = { 10, 20, 30 }; + ufbx_prop *new_prop = ufbx_find_prop(&light->props, "|NewProp"); + ufbxt_assert(new_prop); + ufbxt_assert((new_prop->flags & UFBX_PROP_FLAG_OVERRIDDEN) != 0); + ufbxt_assert(!strcmp(new_prop->value_str.data, "Test")); + ufbxt_assert(new_prop->value_int == 10); + ufbxt_assert_close_vec3(err, new_prop->value_vec3, ref_new); + + ufbx_prop *int_prop = ufbx_find_prop(&light->props, "IntProp"); + ufbxt_assert(int_prop); + ufbxt_assert((int_prop->flags & UFBX_PROP_FLAG_OVERRIDDEN) != 0); + ufbxt_assert_close_real(err, int_prop->value_real, 15.0f); + ufbxt_assert(int_prop->value_int == 15); + } + + { + ufbx_element *original_light = &node->light->element; + + ufbx_prop color = ufbx_evaluate_prop(&anim, original_light, "Color", 1.0); + ufbxt_assert((color.flags & UFBX_PROP_FLAG_OVERRIDDEN) != 0); + ufbxt_assert_close_vec3(err, color.value_vec3, ref_color); + + ufbx_prop intensity = ufbx_evaluate_prop(&anim, original_light, "Intensity", 1.0); + ufbxt_assert((intensity.flags & UFBX_PROP_FLAG_OVERRIDDEN) != 0); + ufbxt_assert_close_real(err, intensity.value_real, 10.0f); + + ufbx_vec3 ref_new = { 10, 20, 30 }; + ufbx_prop new_prop = ufbx_evaluate_prop(&anim, original_light, "|NewProp", 1.0); + ufbxt_assert((new_prop.flags & UFBX_PROP_FLAG_OVERRIDDEN) != 0); + ufbxt_assert(!strcmp(new_prop.value_str.data, "Test")); + ufbxt_assert(new_prop.value_int == 10); + ufbxt_assert_close_vec3(err, new_prop.value_vec3, ref_new); + + ufbx_prop int_prop = ufbx_evaluate_prop(&anim, original_light, "IntProp", 1.0); + ufbxt_assert((int_prop.flags & UFBX_PROP_FLAG_OVERRIDDEN) != 0); + ufbxt_assert_close_real(err, int_prop.value_real, 15.0f); + ufbxt_assert(int_prop.value_int == 15); + } + + ufbx_free_scene(state); + } + + { + ufbx_anim_layer *layer = scene->anim_layers.data[0]; + ufbx_node *node = ufbx_find_node(scene, "pointLight1"); + ufbxt_assert(node && node->light); + ufbx_light *light = node->light; + + { + ufbx_anim_prop_list props = ufbx_find_anim_props(layer, &node->element); + ufbxt_assert(props.count == 3); + ufbxt_assert(!strcmp(props.data[0].prop_name.data, "Lcl Rotation")); + ufbxt_assert(!strcmp(props.data[1].prop_name.data, "Lcl Scaling")); + ufbxt_assert(!strcmp(props.data[2].prop_name.data, "Lcl Translation")); + + ufbx_anim_prop *prop; + prop = ufbx_find_anim_prop(layer, &node->element, "Lcl Rotation"); + ufbxt_assert(prop && !strcmp(prop->prop_name.data, "Lcl Rotation")); + prop = ufbx_find_anim_prop(layer, &node->element, "Lcl Scaling"); + ufbxt_assert(prop && !strcmp(prop->prop_name.data, "Lcl Scaling")); + prop = ufbx_find_anim_prop(layer, &node->element, "Lcl Translation"); + ufbxt_assert(prop && !strcmp(prop->prop_name.data, "Lcl Translation")); + } + + { + ufbx_anim_prop_list props = ufbx_find_anim_props(layer, &light->element); + ufbxt_assert(props.count == 2); + ufbxt_assert(!strcmp(props.data[0].prop_name.data, "Color")); + ufbxt_assert(!strcmp(props.data[1].prop_name.data, "Intensity")); + + ufbx_anim_prop *prop; + prop = ufbx_find_anim_prop(layer, &light->element, "Color"); + ufbxt_assert(prop && !strcmp(prop->prop_name.data, "Color")); + prop = ufbx_find_anim_prop(layer, &light->element, "Intensity"); + ufbxt_assert(prop && !strcmp(prop->prop_name.data, "Intensity")); + + prop = ufbx_find_anim_prop(layer, &light->element, "Nonexistent"); + ufbxt_assert(prop == NULL); + } + + { + ufbx_anim_prop_list props = ufbx_find_anim_props(layer, &layer->element); + ufbxt_assert(props.count == 0); + + ufbx_anim_prop *prop = ufbx_find_anim_prop(layer, &layer->element, "Weight"); + ufbxt_assert(prop == NULL); + } + } +} +#endif + +UFBXT_FILE_TEST(maya_transform_animation) +#if UFBXT_IMPL +{ + static const ufbxt_anim_transform_ref refs[] = { + { 1, { 0.000f, 0.000f, 0.000f }, { 0.000f, 0.000f, 0.000f }, { 1.000f, 1.000f, 1.000f } }, + { 5, { 0.226f, 0.452f, 0.677f }, { 2.258f, 4.515f, 6.773f }, { 1.023f, 1.045f, 1.068f } }, + { 14, { 1.000f, 2.000f, 3.000f }, { 10.000f, 20.000f, 30.000f }, { 1.100f, 1.200f, 1.300f } }, + { 20, { -0.296f, -0.592f, -0.888f }, { -2.960f, -5.920f, -8.880f }, { 0.970f, 0.941f, 0.911f } }, + { 24, { -1.000f, -2.000f, -3.000f }, { -10.000f, -20.000f, -30.000f }, { 0.900f, 0.800f, 0.700f } }, + }; + + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + + for (size_t i = 0; i < ufbxt_arraycount(refs); i++) { + const ufbxt_anim_transform_ref *ref = &refs[i]; + double time = ref->frame * (1.0/24.0); + + ufbx_scene *state = ufbx_evaluate_scene(scene, &scene->anim, time, NULL, NULL); + ufbxt_assert(state); + ufbxt_check_scene(state); + + ufbx_transform t1 = state->nodes.data[node->element.typed_id]->local_transform; + ufbx_transform t2 = ufbx_evaluate_transform(&scene->anim, node, time); + + ufbx_vec3 t1_euler = ufbx_quat_to_euler(t1.rotation, UFBX_ROTATION_ORDER_XYZ); + ufbx_vec3 t2_euler = ufbx_quat_to_euler(t2.rotation, UFBX_ROTATION_ORDER_XYZ); + + ufbxt_assert_close_vec3(err, ref->translation, t1.translation); + ufbxt_assert_close_vec3(err, ref->translation, t2.translation); + ufbxt_assert_close_vec3(err, ref->rotation_euler, t1_euler); + ufbxt_assert_close_vec3(err, ref->rotation_euler, t2_euler); + ufbxt_assert_close_vec3(err, ref->scale, t1.scale); + ufbxt_assert_close_vec3(err, ref->scale, t2.scale); + + ufbx_free_scene(state); + } + + { + uint32_t element_id = node->element.element_id; + ufbxt_anim_transform_ref ref = refs[2]; + ref.translation.x -= 0.1f; + ref.translation.y -= 0.2f; + ref.translation.z -= 0.3f; + ref.scale.x = 2.0f; + ref.scale.y = 3.0f; + ref.scale.z = 4.0f; + + ufbx_prop_override overrides[] = { + { element_id, "Color", { (ufbx_real)0.3, (ufbx_real)0.6, (ufbx_real)0.9 } }, + { element_id, "|NewProp", { 10, 20, 30 }, "Test", }, + { element_id, "Lcl Scaling", { 2.0f, 3.0f, 4.0f } }, + { element_id, "RotationOffset", { -0.1f, -0.2f, -0.3f } }, + }; + + double time = 14.0/24.0; + ufbx_anim anim = scene->anim; + anim.prop_overrides = ufbx_prepare_prop_overrides(overrides, ufbxt_arraycount(overrides)); + ufbx_scene *state = ufbx_evaluate_scene(scene, &anim, time, NULL, NULL); + ufbxt_assert(state); + ufbxt_check_scene(state); + + ufbx_transform t1 = state->nodes.data[node->element.typed_id]->local_transform; + ufbx_transform t2 = ufbx_evaluate_transform(&anim, node, time); + + ufbx_vec3 t1_euler = ufbx_quat_to_euler(t1.rotation, UFBX_ROTATION_ORDER_XYZ); + ufbx_vec3 t2_euler = ufbx_quat_to_euler(t2.rotation, UFBX_ROTATION_ORDER_XYZ); + + ufbxt_assert_close_vec3(err, ref.translation, t1.translation); + ufbxt_assert_close_vec3(err, ref.translation, t2.translation); + ufbxt_assert_close_vec3(err, ref.rotation_euler, t1_euler); + ufbxt_assert_close_vec3(err, ref.rotation_euler, t2_euler); + ufbxt_assert_close_vec3(err, ref.scale, t1.scale); + ufbxt_assert_close_vec3(err, ref.scale, t2.scale); + + ufbx_free_scene(state); + } +} +#endif + + +UFBXT_FILE_TEST(maya_anim_layers) +#if UFBXT_IMPL +{ + ufbx_anim_layer *x = (ufbx_anim_layer*)ufbx_find_element(scene, UFBX_ELEMENT_ANIM_LAYER, "X"); + ufbx_anim_layer *y = (ufbx_anim_layer*)ufbx_find_element(scene, UFBX_ELEMENT_ANIM_LAYER, "Y"); + ufbxt_assert(x && y); + ufbxt_assert(y->compose_rotation == false); + ufbxt_assert(y->compose_scale == false); +} +#endif + +UFBXT_FILE_TEST(maya_anim_layers_acc) +#if UFBXT_IMPL +{ + ufbx_anim_layer *x = (ufbx_anim_layer*)ufbx_find_element(scene, UFBX_ELEMENT_ANIM_LAYER, "X"); + ufbx_anim_layer *y = (ufbx_anim_layer*)ufbx_find_element(scene, UFBX_ELEMENT_ANIM_LAYER, "Y"); + ufbxt_assert(x && y); + ufbxt_assert(y->compose_rotation == true); + ufbxt_assert(y->compose_scale == true); +} +#endif + +UFBXT_FILE_TEST(maya_anim_layers_over) +#if UFBXT_IMPL +{ + ufbx_anim_layer *x = (ufbx_anim_layer*)ufbx_find_element(scene, UFBX_ELEMENT_ANIM_LAYER, "X"); + ufbx_anim_layer *y = (ufbx_anim_layer*)ufbx_find_element(scene, UFBX_ELEMENT_ANIM_LAYER, "Y"); + ufbxt_assert(x && y); + ufbxt_assert(y->compose_rotation == false); + ufbxt_assert(y->compose_scale == false); +} +#endif + +UFBXT_FILE_TEST(maya_anim_layers_over_acc) +#if UFBXT_IMPL +{ + ufbx_anim_layer *x = (ufbx_anim_layer*)ufbx_find_element(scene, UFBX_ELEMENT_ANIM_LAYER, "X"); + ufbx_anim_layer *y = (ufbx_anim_layer*)ufbx_find_element(scene, UFBX_ELEMENT_ANIM_LAYER, "Y"); + ufbxt_assert(x && y); + ufbxt_assert(y->compose_rotation == true); + ufbxt_assert(y->compose_scale == true); +} +#endif + +#if UFBXT_IMPL +typedef struct { + double time; + bool visible; +} ufbxt_visibility_ref; +#endif + +UFBXT_FILE_TEST(maya_cube_blinky) +#if UFBXT_IMPL +{ + ufbxt_visibility_ref refs[] = { + { 1.0, false }, + { 9.5, false }, + { 10.5, true }, + { 11.5, false }, + { 15.0, false }, + { 19.5, false }, + { 20.5, false }, + { 25.0, false }, + { 29.5, false }, + { 30.5, true }, + { 40.0, true }, + { 50.0, true }, + }; + + for (size_t i = 0; i < ufbxt_arraycount(refs); i++) { + double time = refs[i].time / 24.0; + ufbx_scene *state = ufbx_evaluate_scene(scene, &scene->anim, time, NULL, NULL); + ufbxt_assert(state); + + ufbxt_check_scene(state); + + ufbx_node *node = ufbx_find_node(state, "pCube1"); + ufbxt_assert(node); + ufbxt_assert(node->visible == refs[i].visible); + + ufbx_free_scene(state); + } +} +#endif + +#if UFBXT_IMPL +typedef struct { + double time; + ufbx_real value; +} ufbxt_anim_ref; +#endif + +UFBXT_FILE_TEST(maya_anim_interpolation) +#if UFBXT_IMPL +{ + ufbxt_anim_ref anim_ref[] = { + // Cubic + { 0.0 / 30.0, 0.0 }, + { 1.0 / 30.0, -0.855245 }, + { 2.0 / 30.0, -1.13344 }, + { 3.0 / 30.0, -1.17802 }, + { 4.0 / 30.0, -1.10882 }, + { 5.0 / 30.0, -0.991537 }, + { 6.0 / 30.0, -0.875223 }, + { 7.0 / 30.0, -0.808958 }, + { 8.0 / 30.0, -0.858419 }, + { 9.0 / 30.0, -1.14293 }, + // Linear + { 10.0 / 30.0, -2.0 }, + // Constant previous + { 20.0 / 30.0, -4.0 }, + { 25.0 / 30.0 - 0.001, -4.0 }, + // Constant next + { 25.0 / 30.0, -6.0 }, + { 25.0 / 30.0 + 0.001, -8.0 }, + // Constant previous + { 30.0 / 30.0, -8.0 }, + { 35.0 / 30.0 - 0.001, -8.0 }, + // Linear + { 35.0 / 30.0, -10.0 }, + // Constant next + { 40.0 / 30.0, -12.0 }, + { 40.0 / 30.0 + 0.001, -14.0 }, + // Constant previous + { 45.0 / 30.0, -14.0 }, + { 50.0 / 30.0 - 0.001, -14.0 }, + // Constant next + { 50.0 / 30.0, -16.0 }, + { 50.0 / 30.0 + 0.001, -14.0 }, + // inal + { 55.0 / 30.0, -14.0, }, + }; + + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node); + + for (size_t i = 0; i < ufbxt_arraycount(anim_ref); i++) { + ufbxt_anim_ref ref = anim_ref[i]; + ufbxt_hintf("%zu: %f (frame %.2f)", i, ref.time, ref.time * 30.0f); + + ufbx_prop p = ufbx_evaluate_prop(&scene->anim, &node->element, "Lcl Translation", ref.time); + ufbxt_assert_close_real(err, p.value_vec3.x, ref.value); + } +} +#endif + diff --git a/modules/ufbx/test/test_api.h b/modules/ufbx/test/test_api.h new file mode 100644 index 0000000..f9cfe9b --- /dev/null +++ b/modules/ufbx/test/test_api.h @@ -0,0 +1,134 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "api" + +#if UFBXT_IMPL + +static void ufbxt_close_memory(void *user, void *data, size_t data_size) +{ + free(data); +} + +static bool ufbxt_open_file_memory_default(void *user, ufbx_stream *stream, const char *path, size_t path_len, const ufbx_open_file_info *info) +{ + ++*(size_t*)user; + + size_t size; + void *data = ufbxt_read_file(path, &size); + if (!data) return false; + + bool ok = ufbx_open_memory(stream, data, size, NULL, NULL); + free(data); + return ok; +} + +static bool ufbxt_open_file_memory_temp(void *user, ufbx_stream *stream, const char *path, size_t path_len, const ufbx_open_file_info *info) +{ + ++*(size_t*)user; + + size_t size; + void *data = ufbxt_read_file(path, &size); + if (!data) return false; + + ufbx_open_memory_opts opts = { 0 }; + opts.allocator.allocator = info->temp_allocator; + + bool ok = ufbx_open_memory(stream, data, size, &opts, NULL); + free(data); + return ok; +} + +static bool ufbxt_open_file_memory_ref(void *user, ufbx_stream *stream, const char *path, size_t path_len, const ufbx_open_file_info *info) +{ + ++*(size_t*)user; + + size_t size; + void *data = ufbxt_read_file(path, &size); + if (!data) return false; + + ufbx_open_memory_opts opts = { 0 }; + opts.no_copy = true; + opts.close_cb.fn = &ufbxt_close_memory; + return ufbx_open_memory(stream, data, size, &opts, NULL); +} + +#endif + +#if UFBXT_IMPL +static void ufbxt_do_open_memory_test(const char *filename, size_t expected_calls_fbx, size_t expected_calls_obj, ufbx_open_file_fn *open_file_fn) +{ + char path[512]; + ufbxt_file_iterator iter = { filename }; + while (ufbxt_next_file(&iter, path, sizeof(path))) { + for (size_t i = 0; i < 2; i++) { + ufbx_load_opts opts = { 0 }; + size_t num_calls = 0; + + opts.open_file_cb.fn = open_file_fn; + opts.open_file_cb.user = &num_calls; + opts.load_external_files = true; + if (i == 1) { + opts.read_buffer_size = 1; + } + + ufbx_error error; + ufbx_scene *scene = ufbx_load_file(path, &opts, &error); + if (!scene) ufbxt_log_error(&error); + ufbxt_assert(scene); + + ufbxt_check_scene(scene); + + if (scene->metadata.file_format == UFBX_FILE_FORMAT_FBX) { + ufbxt_assert(num_calls == expected_calls_fbx); + } else if (scene->metadata.file_format == UFBX_FILE_FORMAT_OBJ) { + ufbxt_assert(num_calls == expected_calls_obj); + } else { + ufbxt_assert(false); + } + + ufbx_free_scene(scene); + } + } +} +#endif + +UFBXT_TEST(open_memory_default) +#if UFBXT_IMPL +{ + ufbxt_do_open_memory_test("maya_cache_sine", 5, 0, ufbxt_open_file_memory_default); +} +#endif + +UFBXT_TEST(open_memory_temp) +#if UFBXT_IMPL +{ + ufbxt_do_open_memory_test("maya_cache_sine", 5, 0, ufbxt_open_file_memory_temp); +} +#endif + +UFBXT_TEST(open_memory_ref) +#if UFBXT_IMPL +{ + ufbxt_do_open_memory_test("maya_cache_sine", 5, 0, ufbxt_open_file_memory_ref); +} +#endif + +UFBXT_TEST(obj_open_memory_default) +#if UFBXT_IMPL +{ + ufbxt_do_open_memory_test("blender_279_ball", 1, 2, ufbxt_open_file_memory_default); +} +#endif + +UFBXT_TEST(obj_open_memory_temp) +#if UFBXT_IMPL +{ + ufbxt_do_open_memory_test("blender_279_ball", 1, 2, ufbxt_open_file_memory_temp); +} +#endif + +UFBXT_TEST(obj_open_memory_ref) +#if UFBXT_IMPL +{ + ufbxt_do_open_memory_test("blender_279_ball", 1, 2, ufbxt_open_file_memory_ref); +} +#endif diff --git a/modules/ufbx/test/test_cache.h b/modules/ufbx/test/test_cache.h new file mode 100644 index 0000000..2310704 --- /dev/null +++ b/modules/ufbx/test/test_cache.h @@ -0,0 +1,178 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "cache" + +#if UFBXT_IMPL +static void ufbxt_test_sine_cache(ufbxt_diff_error *err, const char *path, double begin, double end, double err_threshold) +{ + char buf[512]; + snprintf(buf, sizeof(buf), "%s%s", data_root, path); + + ufbx_geometry_cache *cache = ufbx_load_geometry_cache(buf, NULL, NULL); + ufbxt_assert(cache); + ufbxt_assert(cache->channels.count == 2); + + bool found_cube1 = false; + for (size_t i = 0; i < cache->channels.count; i++) { + ufbx_cache_channel *channel = &cache->channels.data[i]; + ufbxt_assert(channel->interpretation == UFBX_CACHE_INTERPRETATION_VERTEX_POSITION); + + if (!strcmp(channel->name.data, "pCubeShape1")) { + found_cube1 = true; + + ufbx_vec3 pos[64]; + for (double time = begin; time <= end + 0.0001; time += 0.1/24.0) { + size_t num_verts = ufbx_sample_geometry_cache_vec3(channel, time, pos, ufbxt_arraycount(pos), NULL); + ufbxt_assert(num_verts == 36); + + size_t dry_verts = ufbx_sample_geometry_cache_vec3(channel, time, pos, SIZE_MAX, NULL); + ufbxt_assert(num_verts == dry_verts); + + double t = (time - 1.0/24.0) / (29.0/24.0) * 4.0; + double pi2 = 3.141592653589793*2.0; + double err_scale = 0.001 / err_threshold; + + for (size_t i = 0; i < num_verts; i++) { + ufbx_vec3 v = pos[i]; + double sx = sin((v.y + t * 0.5f)*pi2) * 0.25; + double vx = v.x; + vx += vx > 0.0 ? -0.5 : 0.5; + ufbxt_assert_close_real(err, vx*err_scale, sx*err_scale); + } + } + } + } + + ufbxt_assert(found_cube1); + + ufbx_free_geometry_cache(cache); +} +#endif + +UFBXT_FILE_TEST(maya_cache_sine) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->cache_deformers.count == 2); + for (size_t i = 0; i < 2; i++) { + ufbx_cache_deformer *deformer = mesh->cache_deformers.data[i]; + ufbxt_assert(deformer->file); + ufbxt_assert(deformer->file->format == UFBX_CACHE_FILE_FORMAT_MC); + } + + ufbxt_check_frame(scene, err, false, "maya_cache_sine_12", NULL, 12.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_cache_sine_18", NULL, 18.0/24.0); +} +#endif + +UFBXT_TEST(maya_cache_sine_caches) +#if UFBXT_IMPL +{ + ufbxt_diff_error err = { 0 }; + + ufbxt_test_sine_cache(&err, "caches/sine_mcmf_undersample/cache.xml", 1.0/24.0, 29.0/24.0, 0.04); + ufbxt_test_sine_cache(&err, "caches/sine_mcsd_oversample/cache.xml", 1.0/24.0, 29.0/24.0, 0.003); + ufbxt_test_sine_cache(&err, "caches/sine_mxmd_oversample/cache.xml", 11.0/24.0, 19.0/24.0, 0.003); + ufbxt_test_sine_cache(&err, "caches/sine_mxsf_regular/cache.xml", 1.0/24.0, 29.0/24.0, 0.008); + + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", err.sum / (ufbx_real)err.num, err.max, err.num); +} +#endif + +UFBXT_FILE_TEST(max_cache_box) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Box001"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->cache_deformers.count == 1); + ufbx_cache_deformer *deformer = mesh->cache_deformers.data[0]; + ufbxt_assert(deformer->file); + ufbxt_assert(deformer->file->format == UFBX_CACHE_FILE_FORMAT_PC2); + ufbxt_assert(deformer->external_cache); + ufbxt_assert(deformer->external_channel); + ufbxt_assert(deformer->external_channel->frames.count == 11); + for (size_t i = 0; i < deformer->external_channel->frames.count; i++) { + ufbx_cache_frame *frame = &deformer->external_channel->frames.data[i]; + ufbxt_assert(frame->file_format == UFBX_CACHE_FILE_FORMAT_PC2); + } + + ufbxt_check_frame(scene, err, false, "max_cache_box_44", NULL, 44.0/30.0); + ufbxt_check_frame(scene, err, false, "max_cache_box_48", NULL, 48.0/30.0); +} +#endif + +UFBXT_TEST(cache_xml_parse) +#if UFBXT_IMPL +{ + char buf[512]; + snprintf(buf, sizeof(buf), "%s%s", data_root, "caches/sine_xml_parse/cache.xml"); + + ufbx_geometry_cache *cache = ufbx_load_geometry_cache(buf, NULL, NULL); + ufbxt_assert(cache); + + ufbxt_assert(cache->extra_info.count == 2); + ufbxt_check_string(cache->extra_info.data[0]); + ufbxt_check_string(cache->extra_info.data[1]); + + const char *ex0 = "cdata! \"'&<><--<a-->!CDATA[]>\x61\xce\xb2\xe3\x82\xab\xf0\x9f\x98\x82]]"; + ufbxt_assert(!strcmp(cache->extra_info.data[0].data, ex0)); + + const char *ex1 = "\"'&<>\x61\x61\x61\xce\xb2\xce\xb2\xce\xb2\xe3\x82\xab\xe3\x82\xab\xe3\x82\xab\xf0\x9f\x98\x82\xf0\x9f\x98\x82\xf0\x9f\x98\x82"; + ufbxt_assert(!strcmp(cache->extra_info.data[1].data, ex1)); + + ufbxt_assert(cache->channels.count == 2); + ufbxt_check_string(cache->channels.data[0].name); + ufbxt_check_string(cache->channels.data[1].name); + ufbxt_check_string(cache->channels.data[0].interpretation_name); + ufbxt_check_string(cache->channels.data[1].interpretation_name); + ufbxt_assert(cache->channels.data[0].interpretation == UFBX_CACHE_INTERPRETATION_UNKNOWN); + ufbxt_assert(cache->channels.data[1].interpretation == UFBX_CACHE_INTERPRETATION_UNKNOWN); + + ufbxt_assert(!strcmp(cache->channels.data[0].interpretation_name.data, "")); + ufbxt_assert(!strcmp(cache->channels.data[1].interpretation_name.data, "]]>")); + + ufbx_free_geometry_cache(cache); +} +#endif + +UFBXT_TEST(cache_xml_depth) +#if UFBXT_IMPL +{ + char buf[512]; + snprintf(buf, sizeof(buf), "%s%s", data_root, "cache_xml_depth.xml"); + + ufbx_error error; + ufbx_geometry_cache *cache = ufbx_load_geometry_cache(buf, NULL, &error); + ufbxt_assert(!cache); + ufbxt_assert(error.type == UFBX_ERROR_UNKNOWN); +} +#endif + +UFBXT_FILE_TEST_OPTS(marvelous_quad, ufbxt_scale_to_cm_opts) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "marvelous_quad"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->materials.count == 1); + ufbx_material *material = mesh->materials.data[0].material; + + // What? Marvelous writes relative filenames as absolute. + // TODO: Quirk mode to fix this? + const char *prefix = "D:\\Dev\\clean\\ufbx\\data\\"; + + ufbxt_check_material_texture_ex(scene, material->fbx.ambient_color.texture, prefix, "marvelous_quad_diffuse_100-1.png", true); + ufbxt_check_material_texture_ex(scene, material->fbx.diffuse_color.texture, prefix, "marvelous_quad_diffuse_100-1.png", true); + ufbxt_check_material_texture_ex(scene, material->fbx.normal_map.texture, prefix, "marvelous_quad_normal_100-1.png", true); + ufbxt_check_material_texture_ex(scene, material->pbr.base_color.texture, prefix, "marvelous_quad_diffuse_100-1.png", true); + ufbxt_check_material_texture_ex(scene, material->pbr.normal_map.texture, prefix, "marvelous_quad_normal_100-1.png", true); + } + + ufbxt_check_frame(scene, err, false, "marvelous_quad_12", NULL, 12.0/24.0); + ufbxt_check_frame(scene, err, false, "marvelous_quad_22", NULL, 22.0/24.0); +} +#endif + diff --git a/modules/ufbx/test/test_camera.h b/modules/ufbx/test/test_camera.h new file mode 100644 index 0000000..9f16861 --- /dev/null +++ b/modules/ufbx/test/test_camera.h @@ -0,0 +1,51 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "camera" + +#if UFBXT_IMPL + +static void ufbxt_check_ortho_camera(ufbxt_diff_error *err, ufbx_scene *scene, const char *name, ufbx_gate_fit gate_fit, ufbx_real extent, ufbx_real width, ufbx_real height) +{ + ufbxt_hintf("Cameara %s", name); + ufbx_node *node = ufbx_find_node(scene, name); + ufbxt_assert(node && node->camera); + ufbx_camera *camera = node->camera; + + ufbxt_assert(camera->projection_mode == UFBX_PROJECTION_MODE_ORTHOGRAPHIC); + ufbxt_assert(camera->gate_fit == gate_fit); + ufbxt_assert_close_real(err, camera->orthographic_extent, extent); + ufbxt_assert_close_real(err, camera->orthographic_size.x, width); + ufbxt_assert_close_real(err, camera->orthographic_size.y, height); +} + +#endif + +UFBXT_FILE_TEST(maya_ortho_camera_400x200) +#if UFBXT_IMPL +{ + ufbxt_check_ortho_camera(err, scene, "Fill", UFBX_GATE_FIT_FILL, 30.0f, 30.0f, 15.0f); + ufbxt_check_ortho_camera(err, scene, "Horizontal", UFBX_GATE_FIT_HORIZONTAL, 30.0f, 30.0f, 15.0f); + ufbxt_check_ortho_camera(err, scene, "Vertical", UFBX_GATE_FIT_VERTICAL, 30.0f, 60.0f, 30.0f); + ufbxt_check_ortho_camera(err, scene, "Overscan", UFBX_GATE_FIT_OVERSCAN, 30.0f, 60.0f, 30.0f); +} +#endif + +UFBXT_FILE_TEST(maya_ortho_camera_200x300) +#if UFBXT_IMPL +{ + ufbxt_check_ortho_camera(err, scene, "Fill", UFBX_GATE_FIT_FILL, 30.0f, 20.0f, 30.0f); + ufbxt_check_ortho_camera(err, scene, "Horizontal", UFBX_GATE_FIT_HORIZONTAL, 30.0f, 30.0f, 45.0f); + ufbxt_check_ortho_camera(err, scene, "Vertical", UFBX_GATE_FIT_VERTICAL, 30.0f, 20.0f, 30.0f); + ufbxt_check_ortho_camera(err, scene, "Overscan", UFBX_GATE_FIT_OVERSCAN, 30.0f, 30.0f, 45.0f); +} +#endif + +UFBXT_FILE_TEST(maya_ortho_camera_size) +#if UFBXT_IMPL +{ + ufbxt_check_ortho_camera(err, scene, "Ortho_10", UFBX_GATE_FIT_FILL, 10.0f, 10.0f, 10.0f); + ufbxt_check_ortho_camera(err, scene, "Ortho_30", UFBX_GATE_FIT_FILL, 30.0f, 30.0f, 30.0f); + ufbxt_check_ortho_camera(err, scene, "Ortho_35", UFBX_GATE_FIT_FILL, 35.0f, 35.0f, 35.0f); + ufbxt_check_ortho_camera(err, scene, "Ortho_100", UFBX_GATE_FIT_FILL, 100.0f, 100.0f, 100.0f); +} +#endif + diff --git a/modules/ufbx/test/test_collections.h b/modules/ufbx/test/test_collections.h new file mode 100644 index 0000000..d469979 --- /dev/null +++ b/modules/ufbx/test/test_collections.h @@ -0,0 +1,192 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "collections" + +UFBXT_FILE_TEST(max_selection_sets) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Box001"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + { + ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "ObjectCube"); + ufbxt_assert(set && set->nodes.count == 1); + ufbx_selection_node *sel = set->nodes.data[0]; + ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh); + ufbxt_assert(sel->include_node); + ufbxt_assert(sel->vertices.count == 0); + ufbxt_assert(sel->edges.count == 0); + ufbxt_assert(sel->faces.count == 0); + } + + { + ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_TopFace_Face"); + ufbxt_assert(set && set->nodes.count == 1); + ufbx_selection_node *sel = set->nodes.data[0]; + ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh); + ufbxt_assert(!sel->include_node); + ufbxt_assert(sel->vertices.count == 0); + ufbxt_assert(sel->edges.count == 0); + ufbxt_assert(sel->faces.count == 2); + + for (size_t i = 0; i < sel->faces.count; i++) { + ufbx_face face = mesh->faces.data[sel->faces.data[i]]; + for (size_t j = 0; j < face.num_indices; j++) { + ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + j); + pos = ufbx_transform_position(&node->geometry_to_world, pos); + ufbxt_assert_close_real(err, pos.y / 10.0f, 2.0f); + } + } + } + + { + ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_BottomFace_Face"); + ufbxt_assert(set && set->nodes.count == 1); + ufbx_selection_node *sel = set->nodes.data[0]; + ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh); + ufbxt_assert(!sel->include_node); + ufbxt_assert(sel->vertices.count == 0); + ufbxt_assert(sel->edges.count == 0); + ufbxt_assert(sel->faces.count == 2); + + for (size_t i = 0; i < sel->faces.count; i++) { + ufbx_face face = mesh->faces.data[sel->faces.data[i]]; + for (size_t j = 0; j < face.num_indices; j++) { + ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + j); + pos = ufbx_transform_position(&node->geometry_to_world, pos); + ufbxt_assert_close_real(err, pos.y / 10.0f, 0.0f); + } + } + } + + { + ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_SideFaces_Face"); + ufbxt_assert(set && set->nodes.count == 1); + ufbx_selection_node *sel = set->nodes.data[0]; + ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh); + ufbxt_assert(!sel->include_node); + ufbxt_assert(sel->vertices.count == 0); + ufbxt_assert(sel->edges.count == 0); + ufbxt_assert(sel->faces.count == 8); + + for (size_t i = 0; i < sel->faces.count; i++) { + ufbx_face face = mesh->faces.data[sel->faces.data[i]]; + ufbx_real avg = 0.0f; + for (size_t j = 0; j < face.num_indices; j++) { + ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + j); + pos = ufbx_transform_position(&node->geometry_to_world, pos); + avg += pos.y; + } + avg /= (ufbx_real)face.num_indices * 10.0f; + ufbxt_assert(avg > 0.5f && avg < 1.5f); + } + } + + { + ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_TopEdges_Edge"); + ufbxt_assert(set && set->nodes.count == 1); + ufbx_selection_node *sel = set->nodes.data[0]; + ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh); + ufbxt_assert(!sel->include_node); + ufbxt_assert(sel->vertices.count == 0); + ufbxt_assert(sel->edges.count == 4); + ufbxt_assert(sel->faces.count == 0); + + for (size_t i = 0; i < sel->edges.count; i++) { + ufbx_edge edge = mesh->edges.data[sel->edges.data[i]]; + for (size_t j = 0; j < 2; j++) { + ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, edge.indices[j]); + pos = ufbx_transform_position(&node->geometry_to_world, pos); + ufbxt_assert_close_real(err, pos.y / 10.0f, 2.0f); + } + } + } + + { + ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_BottomEdges_Edge"); + ufbxt_assert(set && set->nodes.count == 1); + ufbx_selection_node *sel = set->nodes.data[0]; + ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh); + ufbxt_assert(!sel->include_node); + ufbxt_assert(sel->vertices.count == 0); + ufbxt_assert(sel->edges.count == 4); + ufbxt_assert(sel->faces.count == 0); + + ufbx_mesh *mesh = sel->target_mesh; + for (size_t i = 0; i < sel->edges.count; i++) { + ufbx_edge edge = mesh->edges.data[sel->edges.data[i]]; + for (size_t j = 0; j < 2; j++) { + ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, edge.indices[j]); + pos = ufbx_transform_position(&node->geometry_to_world, pos); + ufbxt_assert_close_real(err, pos.y / 10.0f, 0.0f); + } + } + } + + { + ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_TopVerts_Vertex"); + ufbxt_assert(set && set->nodes.count == 1); + ufbx_selection_node *sel = set->nodes.data[0]; + ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh); + ufbxt_assert(!sel->include_node); + ufbxt_assert(sel->vertices.count == 4); + ufbxt_assert(sel->edges.count == 0); + ufbxt_assert(sel->faces.count == 0); + + for (size_t i = 0; i < sel->vertices.count; i++) { + ufbx_vec3 pos = mesh->vertices.data[sel->vertices.data[i]]; + pos = ufbx_transform_position(&sel->target_node->geometry_to_world, pos); + ufbxt_assert_close_real(err, pos.y / 10.0f, 2.0f); + } + } + + { + ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_BottomVerts_Vertex"); + ufbxt_assert(set && set->nodes.count == 1); + ufbx_selection_node *sel = set->nodes.data[0]; + ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh); + ufbxt_assert(!sel->include_node); + ufbxt_assert(sel->vertices.count == 4); + ufbxt_assert(sel->edges.count == 0); + ufbxt_assert(sel->faces.count == 0); + + for (size_t i = 0; i < sel->vertices.count; i++) { + ufbx_vec3 pos = mesh->vertices.data[sel->vertices.data[i]]; + pos = ufbx_transform_position(&sel->target_node->geometry_to_world, pos); + ufbxt_assert_close_real(err, pos.y / 10.0f, 0.0f); + } + } +} +#endif + +UFBXT_FILE_TEST(maya_display_layers) +#if UFBXT_IMPL +{ + ufbx_vec3 colors[] = { { 1,0,0 }, { 0,1,0 }, { 0,0,1 } }; + + ufbxt_assert(scene->display_layers.count == 3); + ufbxt_assert(scene->nodes.count == 5); + + { + ufbx_display_layer *layer = (ufbx_display_layer*)ufbx_find_element(scene, UFBX_ELEMENT_DISPLAY_LAYER, "LayerA"); + ufbxt_assert(layer && layer->nodes.count == 1 && !strcmp(layer->nodes.data[0]->name.data, "NodeA")); + ufbxt_assert(layer->visible && !layer->frozen); + ufbxt_assert_close_vec3(err, layer->ui_color, colors[0]); + } + + { + ufbx_display_layer *layer = (ufbx_display_layer*)ufbx_find_element(scene, UFBX_ELEMENT_DISPLAY_LAYER, "LayerB"); + ufbxt_assert(layer && layer->nodes.count == 1 && !strcmp(layer->nodes.data[0]->name.data, "NodeB")); + ufbxt_assert(layer->visible && layer->frozen); + ufbxt_assert_close_vec3(err, layer->ui_color, colors[1]); + } + + { + ufbx_display_layer *layer = (ufbx_display_layer*)ufbx_find_element(scene, UFBX_ELEMENT_DISPLAY_LAYER, "LayerC"); + ufbxt_assert(layer && layer->nodes.count == 1 && !strcmp(layer->nodes.data[0]->name.data, "NodeC")); + ufbxt_assert(!layer->visible && !layer->frozen); + ufbxt_assert_close_vec3(err, layer->ui_color, colors[2]); + } + +} +#endif diff --git a/modules/ufbx/test/test_constraints.h b/modules/ufbx/test/test_constraints.h new file mode 100644 index 0000000..c63e2cc --- /dev/null +++ b/modules/ufbx/test/test_constraints.h @@ -0,0 +1,151 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "constraints" + +UFBXT_FILE_TEST(maya_constraint_zoo) +#if UFBXT_IMPL +{ + bool found_parent = false; + bool found_aim = false; + bool found_rotation = false; + bool found_scale = false; + bool found_position = false; + bool found_ik = false; + for (size_t i = 0; i < scene->constraints.count; i++) { + ufbx_constraint *constraint = scene->constraints.data[i]; + + const char *name = constraint->node->name.data; + + if (!strcmp(name, "joint1") && constraint->type == UFBX_CONSTRAINT_PARENT) { + found_parent = true; + ufbxt_assert(constraint->targets.count == 1); + ufbxt_assert(constraint->constrain_translation[0] && constraint->constrain_translation[1] && constraint->constrain_translation[2]); + ufbxt_assert(constraint->constrain_rotation[0] && constraint->constrain_rotation[1] && constraint->constrain_rotation[2]); + ufbxt_assert(!constraint->constrain_scale[0] && !constraint->constrain_scale[1] && !constraint->constrain_scale[2]); + ufbxt_assert_close_real(err, constraint->targets.data[0].weight, 1.0f); + ufbxt_assert(!strcmp(constraint->targets.data[0].node->name.data, "Parent")); + } else if (!strcmp(name, "joint2") && constraint->type == UFBX_CONSTRAINT_AIM) { + found_aim = true; + ufbxt_assert(constraint->targets.count == 1); + ufbxt_assert(!constraint->constrain_translation[0] && !constraint->constrain_translation[1] && !constraint->constrain_translation[2]); + ufbxt_assert(constraint->constrain_rotation[0] && constraint->constrain_rotation[1] && constraint->constrain_rotation[2]); + ufbxt_assert(!constraint->constrain_scale[0] && !constraint->constrain_scale[1] && !constraint->constrain_scale[2]); + ufbxt_assert(constraint->aim_up_node); + ufbxt_assert(constraint->aim_up_type == UFBX_CONSTRAINT_AIM_UP_TO_NODE); + ufbxt_assert(!strcmp(constraint->aim_up_node->name.data, "Up")); + ufbxt_assert_close_real(err, constraint->targets.data[0].weight, 1.0f); + ufbxt_assert(!strcmp(constraint->targets.data[0].node->name.data, "Aim")); + } else if (!strcmp(name, "joint3") && constraint->type == UFBX_CONSTRAINT_ROTATION) { + found_rotation = true; + ufbxt_assert(constraint->targets.count == 1); + ufbxt_assert(!constraint->constrain_translation[0] && !constraint->constrain_translation[1] && !constraint->constrain_translation[2]); + ufbxt_assert(constraint->constrain_rotation[0] && constraint->constrain_rotation[1] && constraint->constrain_rotation[2]); + ufbxt_assert(!constraint->constrain_scale[0] && !constraint->constrain_scale[1] && !constraint->constrain_scale[2]); + ufbxt_assert_close_real(err, constraint->targets.data[0].weight, 1.0f); + ufbxt_assert(!strcmp(constraint->targets.data[0].node->name.data, "joint1")); + } else if (!strcmp(name, "joint4") && constraint->type == UFBX_CONSTRAINT_SCALE) { + found_scale = true; + ufbxt_assert(constraint->targets.count == 1); + ufbxt_assert(!constraint->constrain_translation[0] && !constraint->constrain_translation[1] && !constraint->constrain_translation[2]); + ufbxt_assert(!constraint->constrain_rotation[0] && !constraint->constrain_rotation[1] && !constraint->constrain_rotation[2]); + ufbxt_assert(constraint->constrain_scale[0] && constraint->constrain_scale[1] && constraint->constrain_scale[2]); + ufbxt_assert_close_real(err, constraint->targets.data[0].weight, 1.0f); + ufbxt_assert(!strcmp(constraint->targets.data[0].node->name.data, "Scale")); + } else if (!strcmp(name, "joint5") && constraint->type == UFBX_CONSTRAINT_POSITION) { + found_position = true; + ufbxt_assert(constraint->targets.count == 1); + ufbxt_assert(constraint->constrain_translation[0] && constraint->constrain_translation[1] && constraint->constrain_translation[2]); + ufbxt_assert(!constraint->constrain_rotation[0] && !constraint->constrain_rotation[1] && !constraint->constrain_rotation[2]); + ufbxt_assert(!constraint->constrain_scale[0] && !constraint->constrain_scale[1] && !constraint->constrain_scale[2]); + ufbxt_assert_close_real(err, constraint->targets.data[0].weight, 1.0f); + ufbxt_assert(!strcmp(constraint->targets.data[0].node->name.data, "Position")); + } else if (!strcmp(name, "joint7") && constraint->type == UFBX_CONSTRAINT_SINGLE_CHAIN_IK) { + found_ik = true; + ufbxt_assert(constraint->targets.count == 1); + ufbxt_assert(!constraint->constrain_translation[0] && !constraint->constrain_translation[1] && !constraint->constrain_translation[2]); + ufbxt_assert(constraint->constrain_rotation[0] && constraint->constrain_rotation[1] && constraint->constrain_rotation[2]); + ufbxt_assert(!constraint->constrain_scale[0] && !constraint->constrain_scale[1] && !constraint->constrain_scale[2]); + ufbxt_assert_close_real(err, constraint->targets.data[0].weight, 1.0f); + ufbxt_assert(!strcmp(constraint->targets.data[0].node->name.data, "Pole")); + ufbxt_assert(constraint->ik_effector && !strcmp(constraint->ik_effector->name.data, "IKHandle")); + ufbxt_assert(constraint->ik_end_node && !strcmp(constraint->ik_end_node->name.data, "joint10")); + } + + } + + ufbxt_assert(found_parent); + ufbxt_assert(found_aim); + ufbxt_assert(found_rotation); + ufbxt_assert(found_scale); + ufbxt_assert(found_position); + ufbxt_assert(found_ik); +} +#endif + +UFBXT_FILE_TEST_FLAGS(maya_character, UFBXT_FILE_TEST_FLAG_HEAVY_TO_FUZZ) +#if UFBXT_IMPL +{ + // TODO: Test things +} +#endif + +UFBXT_FILE_TEST(maya_constraint_multi) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->constraints.count == 1); + ufbx_constraint *constraint = scene->constraints.data[0]; + ufbxt_assert(constraint->type == UFBX_CONSTRAINT_POSITION); + ufbxt_assert(constraint->constrain_translation[0] && constraint->constrain_translation[1] && constraint->constrain_translation[2]); + ufbxt_assert(!constraint->constrain_rotation[0] && !constraint->constrain_rotation[1] && !constraint->constrain_rotation[2]); + ufbxt_assert(!constraint->constrain_scale[0] && !constraint->constrain_scale[1] && !constraint->constrain_scale[2]); + ufbxt_assert(constraint->targets.count == 2); + for (size_t i = 0; i < constraint->targets.count; i++) { + const ufbx_constraint_target *target = &constraint->targets.data[i]; + if (!strcmp(target->node->name.data, "TargetA")) { + ufbxt_assert_close_real(err, target->weight, 1.0f); + } else if (!strcmp(target->node->name.data, "TargetB")) { + ufbxt_assert_close_real(err, target->weight, 2.0f); + } else { + ufbxt_assert(false && "Unexpected target"); + } + } +} +#endif + +UFBXT_FILE_TEST_FLAGS(maya_human_ik, UFBXT_FILE_TEST_FLAG_HEAVY_TO_FUZZ) +#if UFBXT_IMPL +{ + uint32_t ik_count = 0; + uint32_t fk_count = 0; + uint32_t unknown_count = 0; + for (size_t i = 0; i < scene->markers.count; i++) { + ufbx_marker *marker = scene->markers.data[i]; + if (marker->type == UFBX_MARKER_IK_EFFECTOR) { + ik_count++; + } else if (marker->type == UFBX_MARKER_FK_EFFECTOR) { + fk_count++; + } else { + unknown_count++; + } + } + + ufbxt_assert(ik_count == 28); + ufbxt_assert(fk_count == 62); + ufbxt_assert(unknown_count == 0); + + { + ufbx_node *node = ufbx_find_node(scene, "Character1_Ctrl_HipsEffector"); + ufbxt_assert(node); + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_MARKER); + ufbx_marker *marker = (ufbx_marker*)node->attrib; + ufbxt_assert(marker->type == UFBX_MARKER_IK_EFFECTOR); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Character1_Ctrl_RightFoot"); + ufbxt_assert(node); + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_MARKER); + ufbx_marker *marker = (ufbx_marker*)node->attrib; + ufbxt_assert(marker->type == UFBX_MARKER_FK_EFFECTOR); + } +} +#endif diff --git a/modules/ufbx/test/test_convert.h b/modules/ufbx/test/test_convert.h new file mode 100644 index 0000000..0ddb6f3 --- /dev/null +++ b/modules/ufbx/test/test_convert.h @@ -0,0 +1,1128 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "convert" + +#if UFBXT_IMPL +ufbx_load_opts ufbxt_geometry_transform_helper_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES; + return opts; +} + +ufbx_load_opts ufbxt_geometry_transform_modify_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY; + return opts; +} + +ufbx_load_opts ufbxt_geometry_transform_modify_no_fallback_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY_NO_FALLBACK; + return opts; +} + +ufbx_load_opts ufbxt_geometry_transform_helper_name_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES; + opts.geometry_transform_helper_name.data = "(ufbxt helper)"; + opts.geometry_transform_helper_name.length = SIZE_MAX; + return opts; +} + +ufbx_load_opts ufbxt_y_up_meters_root_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.target_axes = ufbx_axes_right_handed_y_up; + opts.target_unit_meters = 1.0f; + opts.space_conversion = UFBX_SPACE_CONVERSION_TRANSFORM_ROOT; + return opts; +} + +ufbx_load_opts ufbxt_y_up_meters_adjust_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.target_axes = ufbx_axes_right_handed_y_up; + opts.target_unit_meters = 1.0f; + opts.space_conversion = UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS; + return opts; +} + +ufbx_load_opts ufbxt_z_up_meters_root_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.target_axes = ufbx_axes_right_handed_z_up; + opts.target_unit_meters = 1.0f; + opts.space_conversion = UFBX_SPACE_CONVERSION_TRANSFORM_ROOT; + return opts; +} + +ufbx_load_opts ufbxt_z_up_meters_adjust_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.target_axes = ufbx_axes_right_handed_z_up; + opts.target_unit_meters = 1.0f; + opts.space_conversion = UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS; + return opts; +} + +ufbx_load_opts ufbxt_rh_y_camera_light_axes_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.target_camera_axes = ufbx_axes_right_handed_y_up; + opts.target_light_axes = ufbx_axes_right_handed_y_up; + return opts; +} + +ufbx_load_opts ufbxt_blender_space_adjust_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.target_axes = ufbx_axes_right_handed_z_up; + opts.target_unit_meters = 1.0f; + opts.target_camera_axes = ufbx_axes_right_handed_y_up; + opts.target_light_axes = ufbx_axes_right_handed_y_up; + opts.space_conversion = UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS; + return opts; +} + +#endif + +#if UFBXT_IMPL +typedef struct { + ufbx_vec3 translation; + ufbx_vec3 rotation_euler; + ufbx_vec3 scale; +} ufbxt_ref_transform; + +static void ufbxt_check_transform(ufbxt_diff_error *err, const char *name, ufbx_transform transform, ufbxt_ref_transform ref) +{ + ufbx_vec3 rotation_euler = ufbx_quat_to_euler(transform.rotation, UFBX_ROTATION_ORDER_XYZ); + ufbxt_hintf("%s { { %.2f, %.2f, %.2f }, { %.2f, %.2f, %.2f }, { %.2f, %.2f, %.2f } }", name, + transform.translation.x, transform.translation.y, transform.translation.z, + rotation_euler.x, rotation_euler.y, rotation_euler.z, + transform.scale.x, transform.scale.y, transform.scale.z); + + ufbxt_assert_close_vec3(err, transform.translation, ref.translation); + ufbxt_assert_close_vec3(err, rotation_euler, ref.rotation_euler); + ufbxt_assert_close_vec3(err, transform.scale, ref.scale); + + ufbxt_hintf(""); +} + +static const ufbxt_ref_transform ufbxt_ref_transform_identity = { + { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }, +}; +#endif + + +UFBXT_FILE_TEST(max_geometry_transform) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 3); + + { + ufbx_node *node = ufbx_find_node(scene, "Box001"); + ufbxt_assert(node); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper == NULL); + ufbxt_assert(node->mesh); + + ufbxt_ref_transform local_transform = { + { 0.0f, -10.0f, 0.0f }, { 0.0f, 0.0f, -90.0f }, { 1.0f, 2.0f, 1.0f }, + }; + ufbxt_ref_transform geometry_transform = { + { 0.0f, 0.0f, 10.0f }, { 0.0f, 90.0f, 0.0f }, { 1.0f, 1.0f, 2.0f }, + }; + + ufbxt_check_transform(err, "Box001 local", node->local_transform, local_transform); + ufbxt_check_transform(err, "Box001 geometry", node->geometry_transform, geometry_transform); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Box002"); + ufbxt_assert(node); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper == NULL); + ufbxt_assert(node->mesh); + + ufbxt_ref_transform local_transform = { + { 0.0f, 0.0f, 20.0f }, { 0.0f, 0.0f, -180.0f }, { 1.0f, 0.5f, 1.0f }, + }; + ufbxt_ref_transform geometry_transform = { + { 10.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }, + }; + + ufbxt_check_transform(err, "Box002 local", node->local_transform, local_transform); + ufbxt_check_transform(err, "Box002 geometry", node->geometry_transform, geometry_transform); + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_helper, max_geometry_transform, ufbxt_geometry_transform_helper_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 5); + + { + ufbx_node *node = ufbx_find_node(scene, "Box001"); + ufbxt_assert(node); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper != NULL); + ufbxt_assert(!node->mesh); + + ufbxt_ref_transform local_transform = { + { 0.0f, -10.0f, 0.0f }, { 0.0f, 0.0f, -90.0f }, { 1.0f, 2.0f, 1.0f }, + }; + ufbxt_ref_transform geometry_transform = { + { 0.0f, 0.0f, 10.0f }, { 0.0f, 90.0f, 0.0f }, { 1.0f, 1.0f, 2.0f }, + }; + + ufbxt_check_transform(err, "Box001 local", node->local_transform, local_transform); + ufbxt_check_transform(err, "Box001 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + + node = node->geometry_transform_helper; + ufbxt_assert(node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper == NULL); + ufbxt_assert(node->mesh); + + ufbxt_check_transform(err, "Box001 helper local", node->local_transform, geometry_transform); + ufbxt_check_transform(err, "Box001 helper geometry", node->geometry_transform, ufbxt_ref_transform_identity); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Box002"); + ufbxt_assert(node); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper != NULL); + ufbxt_assert(!node->mesh); + + ufbxt_ref_transform local_transform = { + { 0.0f, 0.0f, 20.0f }, { 0.0f, 0.0f, -180.0f }, { 1.0f, 0.5f, 1.0f }, + }; + ufbxt_ref_transform geometry_transform = { + { 10.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }, + }; + + ufbxt_check_transform(err, "Box002 local", node->local_transform, local_transform); + ufbxt_check_transform(err, "Box002 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + + node = node->geometry_transform_helper; + ufbxt_assert(node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper == NULL); + ufbxt_assert(node->mesh); + + ufbxt_check_transform(err, "Box002 helper local", node->local_transform, geometry_transform); + ufbxt_check_transform(err, "Box002 helper geometry", node->geometry_transform, ufbxt_ref_transform_identity); + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_modify, max_geometry_transform, ufbxt_geometry_transform_modify_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 3); + + { + ufbx_node *node = ufbx_find_node(scene, "Box001"); + ufbxt_assert(node); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper == NULL); + ufbxt_assert(node->mesh); + + ufbxt_ref_transform local_transform = { + { 0.0f, -10.0f, 0.0f }, { 0.0f, 0.0f, -90.0f }, { 1.0f, 2.0f, 1.0f }, + }; + + ufbxt_check_transform(err, "Box001 local", node->local_transform, local_transform); + ufbxt_check_transform(err, "Box001 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Box002"); + ufbxt_assert(node); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper == NULL); + ufbxt_assert(node->mesh); + + ufbxt_ref_transform local_transform = { + { 0.0f, 0.0f, 20.0f }, { 0.0f, 0.0f, -180.0f }, { 1.0f, 0.5f, 1.0f }, + }; + + ufbxt_check_transform(err, "Box002 local", node->local_transform, local_transform); + ufbxt_check_transform(err, "Box002 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT(no_unnecessary_geometry_helpers, maya_cube, ufbxt_geometry_transform_helper_opts) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 2); + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper == NULL); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_transformed_skin_helpers, max_transformed_skin, ufbxt_geometry_transform_helper_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Box001"); + ufbxt_assert(node); + ufbxt_assert(!node->mesh); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper); + ufbxt_assert(!node->has_geometry_transform); + ufbx_node *geo_node = node->geometry_transform_helper; + ufbxt_assert(geo_node->mesh); + ufbxt_assert(geo_node->is_geometry_transform_helper); + ufbxt_assert(!geo_node->geometry_transform_helper); + ufbxt_assert(!geo_node->has_geometry_transform); + + ufbxt_check_frame(scene, err, false, "max_transformed_skin_5", NULL, 5.0/30.0); + ufbxt_check_frame(scene, err, false, "max_transformed_skin_15", NULL, 15.0/30.0); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_transformed_skin_modify, max_transformed_skin, ufbxt_geometry_transform_modify_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Box001"); + ufbxt_assert(node); + ufbxt_assert(node->mesh); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(!node->geometry_transform_helper); + ufbxt_assert(!node->has_geometry_transform); + + ufbxt_check_frame(scene, err, false, "max_transformed_skin_5", NULL, 5.0/30.0); + ufbxt_check_frame(scene, err, false, "max_transformed_skin_15", NULL, 15.0/30.0); +} +#endif + +UFBXT_FILE_TEST(max_geometry_transform_instances) +#if UFBXT_IMPL +{ + if (scene->metadata.version >= 7000) { + ufbxt_assert(scene->meshes.count == 1); + } else { + ufbxt_assert(scene->meshes.count == 4); + } + + ufbxt_assert(scene->nodes.count == 5); + for (size_t i = 1; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + ufbxt_assert(node->has_geometry_transform); + ufbxt_assert(node->mesh); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(!node->geometry_transform_helper); + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_instances_helper, max_geometry_transform_instances, ufbxt_geometry_transform_helper_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + if (scene->metadata.version >= 7000) { + ufbxt_assert(scene->meshes.count == 1); + } else { + ufbxt_assert(scene->meshes.count == 4); + } + + ufbxt_assert(scene->nodes.count == 9); + for (size_t i = 1; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + ufbxt_assert(!node->has_geometry_transform); + if (node->name.length > 0) { + ufbxt_assert(!node->mesh); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper); + } else { + ufbxt_assert(node->mesh); + ufbxt_assert(node->is_geometry_transform_helper); + ufbxt_assert(!node->geometry_transform_helper); + } + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_instances_modify, max_geometry_transform_instances, ufbxt_geometry_transform_modify_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + if (scene->metadata.version >= 7000) { + ufbxt_assert(scene->meshes.count == 1); + } else { + ufbxt_assert(scene->meshes.count == 4); + } + + if (scene->metadata.version >= 7000) { + ufbxt_assert(scene->nodes.count == 9); + for (size_t i = 1; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + ufbxt_assert(!node->has_geometry_transform); + if (node->name.length > 0) { + ufbxt_assert(!node->mesh); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(node->geometry_transform_helper); + } else { + ufbxt_assert(node->mesh); + ufbxt_assert(node->is_geometry_transform_helper); + ufbxt_assert(!node->geometry_transform_helper); + } + } + } else { + ufbxt_assert(scene->nodes.count == 5); + for (size_t i = 1; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + ufbxt_assert(!node->has_geometry_transform); + ufbxt_assert(node->mesh); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(!node->geometry_transform_helper); + } + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_instances_modify_no_fallback, max_geometry_transform_instances, ufbxt_geometry_transform_modify_no_fallback_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS|UFBXT_FILE_TEST_FLAG_DIFF_EXPECT_FAIL_POST_7000) +#if UFBXT_IMPL +{ + if (scene->metadata.version >= 7000) { + ufbxt_assert(scene->meshes.count == 1); + } else { + ufbxt_assert(scene->meshes.count == 4); + } + + ufbxt_assert(scene->nodes.count == 5); + for (size_t i = 1; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + ufbxt_assert(!node->has_geometry_transform); + ufbxt_assert(node->mesh); + ufbxt_assert(!node->is_geometry_transform_helper); + ufbxt_assert(!node->geometry_transform_helper); + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_helper_names, max_geometry_transform, ufbxt_geometry_transform_helper_name_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 5); + + { + ufbx_node *node = ufbx_find_node(scene, "Box001"); + ufbxt_assert(node->geometry_transform_helper != NULL); + node = node->geometry_transform_helper; + ufbxt_assert(!strcmp(node->name.data, "(ufbxt helper)")); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Box002"); + ufbxt_assert(node->geometry_transform_helper != NULL); + node = node->geometry_transform_helper; + ufbxt_assert(!strcmp(node->name.data, "(ufbxt helper)")); + } +} +#endif + +UFBXT_FILE_TEST(max_geometry_transform_types) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "Plane001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Plane001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_assert(node->has_geometry_transform); + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_MESH); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Line001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Line001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_assert(node->has_geometry_transform); + if (scene->metadata.version >= 7000) { + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_LINE_CURVE); + } else { + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_EMPTY); + } + } + + { + ufbx_node *node = ufbx_find_node(scene, "Curve001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Curve001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_assert(node->has_geometry_transform); + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_NURBS_CURVE); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Surface001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Surface001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_assert(node->has_geometry_transform); + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_NURBS_SURFACE); + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_types_helper, max_geometry_transform_types, ufbxt_geometry_transform_helper_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "Plane001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Plane001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_check_transform(err, "Plane001 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + ufbxt_assert(!node->has_geometry_transform); + ufbxt_assert(!node->attrib); + ufbxt_assert(node->geometry_transform_helper); + node = node->geometry_transform_helper; + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_MESH); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Line001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Line001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_check_transform(err, "Line001 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + ufbxt_assert(!node->has_geometry_transform); + ufbxt_assert(!node->attrib); + ufbxt_assert(node->geometry_transform_helper); + node = node->geometry_transform_helper; + if (scene->metadata.version >= 7000) { + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_LINE_CURVE); + } else { + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_EMPTY); + } + } + + { + ufbx_node *node = ufbx_find_node(scene, "Curve001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Curve001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_check_transform(err, "Curve001 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + ufbxt_assert(!node->has_geometry_transform); + ufbxt_assert(!node->attrib); + ufbxt_assert(node->geometry_transform_helper); + node = node->geometry_transform_helper; + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_NURBS_CURVE); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Surface001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Surface001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_check_transform(err, "Surface001 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + ufbxt_assert(!node->has_geometry_transform); + ufbxt_assert(!node->attrib); + ufbxt_assert(node->geometry_transform_helper); + node = node->geometry_transform_helper; + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_NURBS_SURFACE); + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_types_modify, max_geometry_transform_types, ufbxt_geometry_transform_modify_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "Plane001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Plane001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_check_transform(err, "Plane001 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + ufbxt_assert(!node->has_geometry_transform); + + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh); + + ufbxt_assert(mesh->vertex_normal.exists); + ufbxt_assert(mesh->vertex_tangent.exists); + ufbxt_assert(mesh->vertex_bitangent.exists); + + ufbx_vec3 ref_positions[] = { + { 20.0f, 10.0f, 0.0f }, + { 0.0f, 10.0f, 10.0f }, + { 20.0f, -10.0f, 0.0f }, + }; + + ufbx_vec3 ref_normal = { 0.447213f, 0.0f, 0.894427f }; + ufbx_vec3 ref_tangent = { 0.0f, -1.0f, 0.0f }; + ufbx_vec3 ref_bitangent = { 0.894427f, 0.0f, -0.447213f }; + + ufbxt_assert(mesh->num_indices == 3); + for (size_t i = 0; i < 3; i++) { + ufbxt_hintf("i=%zu", i); + + ufbx_vec3 position = ufbx_get_vertex_vec3(&mesh->vertex_position, i); + ufbx_vec3 normal = ufbx_get_vertex_vec3(&mesh->vertex_normal, i); + ufbx_vec3 tangent = ufbx_get_vertex_vec3(&mesh->vertex_tangent, i); + ufbx_vec3 bitangent = ufbx_get_vertex_vec3(&mesh->vertex_bitangent, i); + + ufbxt_assert_close_vec3(err, position, ref_positions[i]); + ufbxt_assert_close_vec3(err, normal, ref_normal); + ufbxt_assert_close_vec3(err, tangent, ref_tangent); + ufbxt_assert_close_vec3(err, bitangent, ref_bitangent); + } + } + + { + ufbx_node *node = ufbx_find_node(scene, "Line001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Line001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_check_transform(err, "Line001 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + ufbxt_assert(!node->has_geometry_transform); + + ufbx_line_curve *line = ufbx_as_line_curve(node->attrib); + if (scene->metadata.version >= 7000) { + ufbxt_assert(line); + + ufbx_vec3 ref_positions[] = { + { 20.0f, -10.0f, 0.0f }, + { 20.0f, 10.0f, 0.0f }, + { 0.0f, 10.0f, 0.0f }, + }; + + ufbxt_assert(line->point_indices.count == 3); + ufbxt_assert(line->segments.count == 1); + ufbxt_assert(line->segments.data[0].index_begin == 0); + ufbxt_assert(line->segments.data[0].num_indices == 3); + for (size_t i = 0; i < 3; i++) { + ufbxt_hintf("i=%zu", i); + + ufbx_vec3 position = line->control_points.data[line->point_indices.data[i]]; + ufbxt_assert_close_vec3(err, position, ref_positions[i]); + } + } + } + + { + ufbx_node *node = ufbx_find_node(scene, "Curve001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Curve001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_check_transform(err, "Curve001 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + ufbxt_assert(!node->has_geometry_transform); + + ufbx_nurbs_curve *curve = ufbx_as_nurbs_curve(node->attrib); + ufbxt_assert(curve); + + ufbx_vec4 ref_points[] = { + { 0.0f, 10.0f, 0.0f, 1.0f }, + { 6.666666f, 3.333333f, 0.0f, 1.0f }, + { 13.333333f, -3.333333f, 0.0f, 1.0f }, + { 20.0f, -10.0f, 0.0f, 1.0f }, + }; + + ufbxt_assert(curve->control_points.count == 4); + for (size_t i = 0; i < 4; i++) { + ufbxt_hintf("i=%zu", i); + + ufbx_vec4 point = curve->control_points.data[i]; + ufbxt_assert_close_vec4(err, point, ref_points[i]); + } + } + + { + ufbx_node *node = ufbx_find_node(scene, "Surface001"); + ufbxt_assert(node); + ufbxt_check_transform(err, "Surface001 local", node->local_transform, ufbxt_ref_transform_identity); + ufbxt_check_transform(err, "Surface001 geometry", node->geometry_transform, ufbxt_ref_transform_identity); + ufbxt_assert(!node->has_geometry_transform); + + ufbx_nurbs_surface *surface = ufbx_as_nurbs_surface(node->attrib); + ufbxt_assert(surface); + + ufbxt_assert(surface->num_control_points_u == 4); + ufbxt_assert(surface->num_control_points_v == 4); + for (size_t v = 0; v < 4; v++) { + for (size_t u = 0; u < 4; u++) { + ufbxt_hintf("u=%zu, v=%zu", u, v); + + ufbx_vec4 ref_point; + ref_point.x = (ufbx_real)v * 6.666666f; + ref_point.y = 10.0f - (ufbx_real)u * 6.666666f; + ref_point.z = 0.0f; + ref_point.w = 1.0f; + + ufbx_vec4 point = surface->control_points.data[v*4 + u]; + ufbxt_assert_close_vec4(err, point, ref_point); + } + } + } +} +#endif + +UFBXT_FILE_TEST_FLAGS(blender_340_z_up, UFBXT_FILE_TEST_FLAG_DIFF_EXPECT_FAIL) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(blender_340_z_up_root, blender_340_z_up, ufbxt_y_up_meters_root_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbx_node *root = scene->root_node; + ufbxt_ref_transform root_transform = { + { 0.0f, 0.0f, 0.0f }, { -90.0f, 0.0f, 0.0f }, { 0.01f, 0.01f, 0.01f }, + }; + ufbxt_check_transform(err, "root", root->local_transform, root_transform); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(blender_340_z_up_adjust, blender_340_z_up, ufbxt_y_up_meters_adjust_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbx_node *root = scene->root_node; + ufbxt_check_transform(err, "root", root->local_transform, ufbxt_ref_transform_identity); + + size_t num_adjusted = 0; + for (size_t i = 0; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + if (node->node_depth == 1) { + ufbxt_assert(node->has_adjust_transform); + ufbx_vec3 rotation = { -90.0f, 0.0f, 0.0f }; + ufbx_vec3 scale = { 0.01f, 0.01f, 0.01f }; + ufbx_quat rotation_quat = ufbx_euler_to_quat(rotation, UFBX_ROTATION_ORDER_XYZ); + ufbxt_assert_close_quat(err, node->adjust_post_rotation, ufbx_identity_quat); + ufbxt_assert_close_quat(err, node->adjust_pre_rotation, rotation_quat); + ufbxt_assert_close_vec3(err, node->adjust_pre_scale, scale); + num_adjusted++; + } else { + ufbxt_assert(!node->has_adjust_transform); + ufbx_vec3 scale = { 1.0f, 1.0f, 1.0f }; + ufbxt_assert_close_quat(err, node->adjust_post_rotation, ufbx_identity_quat); + ufbxt_assert_close_quat(err, node->adjust_pre_rotation, ufbx_identity_quat); + ufbxt_assert_close_vec3(err, node->adjust_pre_scale, scale); + } + } + + { + ufbx_node *node = ufbx_find_node(scene, "Light"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 4.0f, 5.0f, -1.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "Light", node->local_transform, ref_transform); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Camera"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 7.0f, 5.0f, -6.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "Camera", node->local_transform, ref_transform); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Cube"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 0.0f, 1.0f, -1.0f }, { -90.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "Camera", node->local_transform, ref_transform); + } + + ufbxt_assert(scene->nodes.count == 5); + ufbxt_assert(num_adjusted == 3); +} +#endif + +UFBXT_FILE_TEST_FLAGS(blender_340_y_up, UFBXT_FILE_TEST_FLAG_DIFF_EXPECT_FAIL) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(blender_340_y_up_root, blender_340_y_up, ufbxt_z_up_meters_root_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbx_node *root = scene->root_node; + ufbxt_ref_transform root_transform = { + { 0.0f, 0.0f, 0.0f }, { 90.0f, 0.0f, 0.0f }, { 0.01f, 0.01f, 0.01f }, + }; + ufbxt_check_transform(err, "root", root->local_transform, root_transform); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(blender_340_y_up_adjust, blender_340_y_up, ufbxt_z_up_meters_adjust_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbx_node *root = scene->root_node; + ufbxt_check_transform(err, "root", root->local_transform, ufbxt_ref_transform_identity); + + size_t num_adjusted = 0; + for (size_t i = 0; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + if (node->node_depth == 1) { + ufbxt_assert(node->has_adjust_transform); + ufbx_vec3 rotation = { 90.0f, 0.0f, 0.0f }; + ufbx_vec3 scale = { 0.01f, 0.01f, 0.01f }; + ufbx_quat rotation_quat = ufbx_euler_to_quat(rotation, UFBX_ROTATION_ORDER_XYZ); + ufbxt_assert_close_quat(err, node->adjust_post_rotation, ufbx_identity_quat); + ufbxt_assert_close_quat(err, node->adjust_pre_rotation, rotation_quat); + ufbxt_assert_close_vec3(err, node->adjust_pre_scale, scale); + num_adjusted++; + } else { + ufbxt_assert(!node->has_adjust_transform); + ufbx_vec3 scale = { 1.0f, 1.0f, 1.0f }; + ufbxt_assert_close_quat(err, node->adjust_post_rotation, ufbx_identity_quat); + ufbxt_assert_close_quat(err, node->adjust_pre_rotation, ufbx_identity_quat); + ufbxt_assert_close_vec3(err, node->adjust_pre_scale, scale); + } + } + + { + ufbx_node *node = ufbx_find_node(scene, "Light"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 4.0f, 1.0f, 5.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "Light", node->local_transform, ref_transform); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Camera"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 7.0f, 6.0f, 5.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "Camera", node->local_transform, ref_transform); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Cube"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 0.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "Camera", node->local_transform, ref_transform); + } + + ufbxt_assert(scene->nodes.count == 5); + ufbxt_assert(num_adjusted == 3); +} +#endif + +UFBXT_FILE_TEST(maya_camera_light_axes_y_up) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "forwardCamera"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 0.0f, 0.0f, 0.0f }, { 0.0f, 90.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "forwardCamera", node->local_transform, ref_transform); + } + + { + ufbx_node *node = ufbx_find_node(scene, "forwardLight"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 0.0f, 0.0f, 0.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "forwardLight", node->local_transform, ref_transform); + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(maya_camera_light_axes_y_up_rh_y, maya_camera_light_axes_y_up, ufbxt_rh_y_camera_light_axes_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "forwardCamera"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "forwardCamera", node->local_transform, ref_transform); + } + + { + ufbx_node *node = ufbx_find_node(scene, "forwardLight"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "forwardLight", node->local_transform, ref_transform); + } +} +#endif + +UFBXT_FILE_TEST_OPTS(blender_340_default_unscaled, ufbxt_blender_space_adjust_opts) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "Cube"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "Cube", node->local_transform, ref_transform); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Camera"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 7.3589f, -6.9258f, 4.9583f }, { 63.5593f, 0.0f, 46.6919f }, { 1.0f, 1.0f, 1.0f } + }; + ufbxt_check_transform(err, "Camera", node->local_transform, ref_transform); + + ufbx_camera *camera = node->camera; + ufbxt_assert(camera); + ufbxt_assert(camera->projection_axes.right == UFBX_COORDINATE_AXIS_POSITIVE_X); + ufbxt_assert(camera->projection_axes.up == UFBX_COORDINATE_AXIS_POSITIVE_Y); + ufbxt_assert(camera->projection_axes.front == UFBX_COORDINATE_AXIS_POSITIVE_Z); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Light"); + ufbxt_assert(node); + ufbxt_ref_transform ref_transform = { + { 4.0762f, 1.0055f, 5.9039f }, { 37.261f, 3.16371f, 106.936f }, { 1.0f, 1.0f, 1.0f }, + }; + ufbxt_check_transform(err, "Light", node->local_transform, ref_transform); + + ufbx_light *light = node->light; + ufbxt_assert(light); + + ufbx_vec3 ref_dir = { 0.0f, 0.0f, -1.0f }; + ufbxt_assert_close_vec3(err, light->local_direction, ref_dir); + } +} +#endif + +UFBXT_FILE_TEST(max_geometry_transform_order) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 3); + ufbx_node **nodes = scene->nodes.data; + + ufbxt_assert(!strcmp(nodes[0]->name.data, "")); + ufbxt_assert(nodes[0]->is_root); + ufbxt_assert(nodes[0]->node_depth == 0); + ufbxt_assert(nodes[0]->parent == NULL); + + ufbxt_assert(!strcmp(nodes[1]->name.data, "Box001")); + ufbxt_assert(nodes[1]->has_geometry_transform); + ufbxt_assert(nodes[1]->node_depth == 1); + ufbxt_assert(nodes[1]->parent == nodes[0]); + + ufbxt_assert(!strcmp(nodes[2]->name.data, "Box002")); + ufbxt_assert(nodes[2]->has_geometry_transform); + ufbxt_assert(nodes[2]->node_depth == 2); + ufbxt_assert(nodes[2]->parent == nodes[1]); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_order_helper, max_geometry_transform_order, ufbxt_geometry_transform_helper_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 5); + ufbx_node **nodes = scene->nodes.data; + + ufbxt_assert(!strcmp(nodes[0]->name.data, "")); + ufbxt_assert(nodes[0]->is_root); + ufbxt_assert(nodes[0]->node_depth == 0); + ufbxt_assert(nodes[0]->parent == NULL); + + ufbxt_assert(!strcmp(nodes[1]->name.data, "Box001")); + ufbxt_assert(nodes[1]->geometry_transform_helper); + ufbxt_assert(nodes[1]->node_depth == 1); + ufbxt_assert(nodes[1]->parent == nodes[0]); + + ufbxt_assert(!strcmp(nodes[2]->name.data, "")); + ufbxt_assert(nodes[2]->is_geometry_transform_helper); + ufbxt_assert(nodes[2]->node_depth == 2); + ufbxt_assert(nodes[2]->parent == nodes[1]); + + ufbxt_assert(!strcmp(nodes[3]->name.data, "Box002")); + ufbxt_assert(nodes[3]->geometry_transform_helper); + ufbxt_assert(nodes[3]->node_depth == 2); + ufbxt_assert(nodes[3]->parent == nodes[1]); + + ufbxt_assert(!strcmp(nodes[4]->name.data, "")); + ufbxt_assert(nodes[4]->is_geometry_transform_helper); + ufbxt_assert(nodes[4]->node_depth == 3); + ufbxt_assert(nodes[4]->parent == nodes[3]); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_order_modify, max_geometry_transform_order, ufbxt_geometry_transform_modify_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 5); + ufbx_node **nodes = scene->nodes.data; + + ufbxt_assert(!strcmp(nodes[0]->name.data, "")); + ufbxt_assert(nodes[0]->is_root); + ufbxt_assert(nodes[0]->node_depth == 0); + ufbxt_assert(nodes[0]->parent == NULL); + + ufbxt_assert(!strcmp(nodes[1]->name.data, "Box001")); + ufbxt_assert(nodes[1]->geometry_transform_helper); + ufbxt_assert(nodes[1]->node_depth == 1); + ufbxt_assert(nodes[1]->parent == nodes[0]); + + ufbxt_assert(!strcmp(nodes[2]->name.data, "")); + ufbxt_assert(nodes[2]->is_geometry_transform_helper); + ufbxt_assert(nodes[2]->node_depth == 2); + ufbxt_assert(nodes[2]->parent == nodes[1]); + + ufbxt_assert(!strcmp(nodes[3]->name.data, "Box002")); + ufbxt_assert(nodes[3]->geometry_transform_helper); + ufbxt_assert(nodes[3]->node_depth == 2); + ufbxt_assert(nodes[3]->parent == nodes[1]); + + ufbxt_assert(!strcmp(nodes[4]->name.data, "")); + ufbxt_assert(nodes[4]->is_geometry_transform_helper); + ufbxt_assert(nodes[4]->node_depth == 3); + ufbxt_assert(nodes[4]->parent == nodes[3]); +} +#endif + + +UFBXT_FILE_TEST(synthetic_geometry_transform_camera) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Camera001"); + ufbxt_assert(node); + + ufbxt_ref_transform geo_transform = { + { 10.0f, 20.0f, 30.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 2.0f, 3.0f }, + }; + ufbxt_check_transform(err, "Camera geometry", node->geometry_transform, geo_transform); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_geometry_transform_camera_helper, synthetic_geometry_transform_camera, ufbxt_geometry_transform_helper_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Camera001"); + ufbxt_assert(node); + ufbxt_assert(!node->has_geometry_transform); + + ufbx_node *geo_node = node->geometry_transform_helper; + ufbxt_assert(geo_node); + + ufbxt_ref_transform geo_transform = { + { 10.0f, 20.0f, 30.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 2.0f, 3.0f }, + }; + ufbxt_check_transform(err, "Camera geometry", geo_node->local_transform, geo_transform); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_geometry_transform_camera_modify, synthetic_geometry_transform_camera, ufbxt_geometry_transform_modify_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Camera001"); + ufbxt_assert(node); + ufbxt_assert(!node->has_geometry_transform); + + ufbx_node *geo_node = node->geometry_transform_helper; + ufbxt_assert(geo_node); + + ufbxt_ref_transform geo_transform = { + { 10.0f, 20.0f, 30.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 2.0f, 3.0f }, + }; + ufbxt_check_transform(err, "Camera geometry", geo_node->local_transform, geo_transform); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_geometry_transform_camera_modify_no_fallback, synthetic_geometry_transform_camera, ufbxt_geometry_transform_modify_no_fallback_opts, + UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Camera001"); + ufbxt_assert(node); + ufbxt_assert(!node->has_geometry_transform); +} +#endif + +UFBXT_TEST(synthetic_unnormalized) +#if UFBXT_IMPL +{ + char path[512]; + ufbxt_diff_error err = { 0 }; + + ufbxt_file_iterator iter = { "synthetic_unnormalized" }; + while (ufbxt_next_file(&iter, path, sizeof(path))) { + for (int normalize_normals = 0; normalize_normals <= 1; normalize_normals++) + for (int normalize_tangents = 0; normalize_tangents <= 1; normalize_tangents++) { + ufbxt_hintf("normalize_normals=%d normalize_tangets=%d", normalize_normals, normalize_tangents); + ufbx_load_opts opts = { 0 }; + opts.normalize_normals = normalize_normals != 0; + opts.normalize_tangents = normalize_tangents != 0; + ufbx_scene *scene = ufbx_load_file(path, &opts, NULL); + ufbxt_assert(scene); + ufbxt_check_scene(scene); + + ufbx_node *node = ufbx_find_node(scene, "pPlane1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->vertex_normal.values.count == 4); + for (size_t i = 0; i < 4; i++) { + ufbx_vec3 ref = ufbx_zero_vec3; + if (normalize_normals) { + ref.y = i > 0 ? 1.0f : 0.0f; + } else { + ref.y = (ufbx_real)i; + } + ufbxt_assert_close_vec3(&err, mesh->vertex_normal.values.data[i], ref); + } + + ufbxt_assert(mesh->vertex_tangent.values.count == 4); + for (size_t i = 0; i < 4; i++) { + ufbx_vec3 ref = ufbx_zero_vec3; + if (normalize_tangents) { + ref.x = i > 0 ? 1.0f : 0.0f; + } else { + ref.x = (ufbx_real)i; + } + ufbxt_assert_close_vec3(&err, mesh->vertex_tangent.values.data[i], ref); + } + + ufbxt_assert(mesh->vertex_bitangent.values.count == 4); + for (size_t i = 0; i < 4; i++) { + ufbx_vec3 ref = ufbx_zero_vec3; + if (normalize_tangents) { + ref.z = i > 0 ? -1.0f : 0.0f; + } else { + ref.z = -(ufbx_real)i; + } + ufbxt_assert_close_vec3(&err, mesh->vertex_bitangent.values.data[i], ref); + } + + ufbx_free_scene(scene); + } + } + + if (err.num > 0) { + ufbx_real avg = err.sum / (ufbx_real)err.num; + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", avg, err.max, err.num); + } +} +#endif diff --git a/modules/ufbx/test/test_curves.h b/modules/ufbx/test/test_curves.h new file mode 100644 index 0000000..68e57b0 --- /dev/null +++ b/modules/ufbx/test/test_curves.h @@ -0,0 +1,61 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "curves" + +UFBXT_FILE_TEST(max_curve_line) +#if UFBXT_IMPL +{ + ufbx_node *polyline_node = ufbx_find_node(scene, "Polyline"); + ufbx_node *bezier_node = ufbx_find_node(scene, "Bezier"); + ufbxt_assert(polyline_node); + ufbxt_assert(bezier_node); + ufbxt_assert(polyline_node->attrib_type == UFBX_ELEMENT_LINE_CURVE); + ufbxt_assert(bezier_node->attrib_type == UFBX_ELEMENT_LINE_CURVE); + ufbxt_assert(polyline_node->attrib); + ufbxt_assert(bezier_node->attrib); + + static const ufbx_vec3 ref_points[] = { + { -1.0f, 0.0f, -1.0f }, + { 1.0f, 1.0f, -1.0f }, + { 1.0f, 0.0f, 1.0f }, + { 0.0f, -1.0f, 2.0f }, + { -2.0f, 0.0f, 2.0f }, + { -1.0f, 0.0f, 1.0f }, + { -1.0f, 0.0f, -1.0f }, + }; + + ufbx_line_curve *polyline = (ufbx_line_curve*)polyline_node->attrib; + ufbxt_assert(polyline->point_indices.count == 7); + ufbxt_assert(polyline->segments.count == 1); + ufbxt_assert(polyline->segments.data[0].index_begin == 0); + ufbxt_assert(polyline->segments.data[0].num_indices == 7); + for (size_t i = 0; i < polyline->point_indices.count; i++) { + ufbx_vec3 p = polyline->control_points.data[polyline->point_indices.data[i]]; + p = ufbx_transform_position(&polyline_node->geometry_to_world, p); + p.x *= 0.1f; + p.y *= 0.1f; + p.z *= 0.1f; + ufbxt_assert_close_vec3(err, p, ref_points[i]); + } + + ufbx_vec3 polyline_color = { 0.223529411764706f ,0.0313725490196078f, 0.533333333333333f }; + ufbxt_assert_close_vec3(err, polyline->color, polyline_color); + + ufbx_line_curve *bezier = (ufbx_line_curve*)bezier_node->attrib; + ufbxt_assert(bezier->point_indices.count == 15); + ufbxt_assert(bezier->segments.count == 1); + ufbxt_assert(bezier->segments.data[0].index_begin == 0); + ufbxt_assert(bezier->segments.data[0].num_indices == 15); + for (size_t i = 0; i < bezier->point_indices.count; i++) { + ufbx_vec3 p = bezier->control_points.data[bezier->point_indices.data[i]]; + p = ufbx_transform_position(&bezier_node->geometry_to_world, p); + p.x *= 0.1f; + p.y *= 0.1f; + p.z *= 0.1f; + ufbxt_assert(p.y >= -0.0001f); + ufbxt_assert_close_real(err, p.z, 0.0f); + } + + ufbx_vec3 bezier_color = { 0.603921568627451f ,0.725490196078431f, 0.898039215686275f }; + ufbxt_assert_close_vec3(err, bezier->color, bezier_color); +} +#endif diff --git a/modules/ufbx/test/test_deflate.h b/modules/ufbx/test/test_deflate.h new file mode 100644 index 0000000..80cedb5 --- /dev/null +++ b/modules/ufbx/test/test_deflate.h @@ -0,0 +1,1944 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "deflate" + +#if UFBXT_IMPL + +static ptrdiff_t ufbxt_inflate_no_fuzz(void *dst, size_t dst_size, const void *src, size_t src_size, const ufbxt_inflate_opts *opts) +{ + ufbx_inflate_retain retain; + retain.initialized = false; + + ufbx_inflate_input input = { 0 }; + input.data = src; + input.data_size = src_size; + input.total_size = src_size; + input.internal_fast_bits = opts->fast_bits; + + if (opts->force_fast) { + size_t padding = 512; + char *large_src = (char*)malloc(src_size + padding); + char *large_dst = (char*)malloc(dst_size + padding); + ufbxt_assert(large_src); + ufbxt_assert(large_dst); + + memcpy(large_src, src, src_size); + memset(large_src + src_size, 0, padding); + + input.data = large_src; + input.data_size += padding; + input.total_size += padding; + input.internal_fast_bits = 10; + ptrdiff_t result = ufbx_inflate(large_dst, dst_size + padding, &input, &retain); + + if (result >= 0) { + memcpy(dst, large_dst, (size_t)result); + } + + free(large_src); + free(large_dst); + + return result; + } else { + return ufbx_inflate(dst, dst_size, &input, &retain); + } +} + +static ptrdiff_t ufbxt_inflate(void *dst, size_t dst_size, const void *src, size_t src_size, const ufbxt_inflate_opts *opts) +{ + if (opts->primary && ufbxt_begin_fuzz()) { + ufbx_inflate_input input = { 0 }; + input.data = src; + input.data_size = src_size; + input.total_size = src_size; + + int i; + + uint8_t *data_copy[256] = { 0 }; + + #pragma omp parallel for schedule(static, 16) + for (i = 0; i < (int)src_size; i++) { + ufbx_inflate_retain retain; + retain.initialized = false; + + if (omp_get_thread_num() == 0) { + if (i % 16 == 0) { + fprintf(stderr, "\rFuzzing %d/%d", i, (int)src_size); + fflush(stderr); + } + } + + uint8_t **p_data_copy = &data_copy[omp_get_thread_num()]; + if (*p_data_copy == NULL) { + *p_data_copy = malloc(src_size); + ufbxt_assert(*p_data_copy); + memcpy(*p_data_copy, src, src_size); + } + uint8_t *data_u8 = *p_data_copy; + + size_t step = i * 10; + + uint8_t original = data_u8[i]; + + if (src_size < 256) { + // Small input: Try all possible byte values + + for (uint32_t byte = 0; byte < 0x100; byte++) { + data_u8[i] = (uint8_t)byte; + ufbx_inflate(dst, dst_size, &input, &retain); + } + + } else { + // Large input: Try +1, -1, 0, 0xff + + data_u8[i] = original + 1; + ufbx_inflate(dst, dst_size, &input, &retain); + + data_u8[i] = original - 1; + ufbx_inflate(dst, dst_size, &input, &retain); + + if (original != 0) { + data_u8[i] = 0; + ufbx_inflate(dst, dst_size, &input, &retain); + } + + if (original != 0xff) { + data_u8[i] = 0xff; + ufbx_inflate(dst, dst_size, &input, &retain); + } + } + + data_u8[i] = original; + } + + for (size_t i = 0; i < ufbxt_arraycount(data_copy); i++) { + free(data_copy[i]); + } + + fprintf(stderr, "\rFuzzing %d/%d\n", (int)src_size, (int)src_size); + } + + return ufbxt_inflate_no_fuzz(dst, dst_size, src, src_size, opts); +} + +#endif + +UFBXT_DEFLATE_TEST(deflate_empty) +#if UFBXT_IMPL +{ + char src[1], dst[1]; + ptrdiff_t res = ufbxt_inflate(dst, 1, src, 0, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res != 0); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_simple) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x01\x06\x00\xf9\xffHello!\x07\xa2\x02\x16"; + char dst[6]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 6); + ufbxt_assert(!memcmp(dst, "Hello!", 6)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_simple_chunks) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x00\x06\x00\xf9\xffHello \x01\x06\x00\xf9\xffworld!\x1d\x09\x04\x5e"; + char dst[12]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 12); + ufbxt_assert(!memcmp(dst, "Hello world!", 12)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_static) +#if UFBXT_IMPL +{ + char src[] = "x\xda\xf3H\xcd\xc9\xc9W(\xcf/\xcaIQ\x04\x00\x1d\t\x04^"; + char dst[12]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 12); + ufbxt_assert(!memcmp(dst, "Hello world!", 12)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_static_match) +#if UFBXT_IMPL +{ + char src[] = "x\xda\xf3H\xcd\xc9\xc9W\xf0\x00\x91\x8a\x00\x1b\xbb\x04*"; + char dst[12]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 12); + ufbxt_assert(!memcmp(dst, "Hello Hello!", 12)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_static_rle) +#if UFBXT_IMPL +{ + char src[] = "x\xdastD\x00\x00\x13\xda\x03\r"; + char dst[12]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 12); + ufbxt_assert(!memcmp(dst, "AAAAAAAAAAAA", 12)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_dynamic) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x1d\xc4\x31\x0d\x00\x00\x0c\x02\x41\x2b\xad" + "\x1b\x8c\xb0\x7d\x82\xff\x8d\x84\xe5\x64\xc8\xcd\x2f\x1b\xbb\x04\x2a"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 12); + ufbxt_assert(!memcmp(dst, "Hello Hello!", 12)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_dynamic_no_match) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x05\x80\x41\x09\x00\x00\x08\x03\xab\x68\x1b\x1b\x58\x40\x7f\x07\x83\xf5" + "\x7f\x8c\x79\x50\xad\xcc\x75\x00\x1c\x49\x04\x3e"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 12); + ufbxt_assert(!memcmp(dst, "Hello World!", 12)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_dynamic_empty) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x05\xc0\x81\x08\x00\x00\x00\x00\x20\x7f\xeb\x03\x00\x00\x00\x01"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 0); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_dynamic_rle) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x5d\xc0\xb1\x00\x00\x00\x00\x80\x30\xb6\xfc\xa5\xfa\xb7\x34\x26\xea\x04\x52"; + char dst[17]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 17); + ufbxt_assert(!memcmp(dst, "AAAAAAAAAAAAAAAAA", 17)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_dynamic_rle_boundary) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x75\xc0\x81\x00\x00\x00\x00\x80\x20\xb6\xfd\xa5\x26\xa8\x64\x52\x9e\x06\x5a"; + char dst[25]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 25); + ufbxt_assert(!memcmp(dst, "AAAAAAAAAAAAAAAAAAAAAAAAA", 25)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_repeat_length) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x05\x00\x05\x0d\x00\x20\x2c\x1b\xee\x0e\xb7" + "\xfe\x41\x98\xd2\xc6\x3a\x1f\x62\xca\xa5\xb6\x3e\xe6\xda\xe7\x3e\x40" + "\x62\x11\x26\x84\x77\xcf\x5e\x73\xf4\x56\x4b\x4e\x31\x78\x67\x8d\x56\x1f\xa1\x6e\x0f\xbf"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 52); + ufbxt_assert(!memcmp(dst, "ABCDEFGHIJKLMNOPQRSTUVWXYZZYXWVUTSRQPONMLKJIHGFEDCBA", 52)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_huff_lengths) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x05\xe0\xc1\x95\x65\x59\x96\x65\xd9\xb1\x84" + "\xca\x70\x53\xf9\xaf\x79\xcf\x5e\x93\x7f\x96\x30\xfe\x7f\xff\xdf\xff" + "\xfb\xbf\xff\xfd\xf7\xef\xef\xf7\xbd\x5b\xfe\xff\x19\x28\x03\x5d"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 15); + ufbxt_assert(!memcmp(dst, "0123456789ABCDE", 15)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_multi_part_matches) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x00\x04\x00\xfb\xff\x54\x65\x73\x74\x52\x08" + "\x48\x2c\x02\x10\x00\x06\x32\x00\x00\x00\x0c\x52\x39\xcc\x45\x72\xc8" + "\x7f\xcd\x9d\x00\x08\x00\xf7\xff\x74\x61\x20\x44\x61\x74\x61\x20\x02" + "\x8b\x01\x38\x8c\x43\x12\x00\x00\x00\x00\x40\xff\x5f\x0b\x36\x8b\xc0" + "\x12\x80\xf9\xa5\x96\x23\x84\x00\x8e\x36\x10\x41"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 48); + ufbxt_assert(!memcmp(dst, "Test Part Data Data Test Data Part New Test Data", 48)); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_uncompressed_bounds) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x01\x06\x00\xf9\xffHello!"; + + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -9); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_cfm) +#if UFBXT_IMPL +{ + char src[] = "\x79\x9c"; + char dst[4]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -1); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_fdict) +#if UFBXT_IMPL +{ + char src[] = "\x78\xbc"; + char dst[4]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -2); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_fcheck) +#if UFBXT_IMPL +{ + char src[] = "\x78\0x9d"; + char dst[4]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -3); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_nlen) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x01\x06\x00\xf8\xffHello!\x07\xa2\x02\x16"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -4); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_dst_overflow) +#if UFBXT_IMPL +{ + if (opts->force_fast) return; + + char src[] = "\x78\x9c\x01\x06\x00\xf9\xffHello!\x07\xa2\x02\x16"; + char dst[5]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -6); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_src_overflow) +#if UFBXT_IMPL +{ + if (opts->force_fast) return; + + char src[] = "\x78\x9c\x01\x06\x00\xf9\xffHello"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res < 0); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_bad_block) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x07\x08\x00\xf8\xff"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -7); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_bad_truncated_checksum) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x01\x06\x00\xf9\xffHello!\x07\xa2\x02"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -9); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_bad_checksum) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x01\x06\x00\xf9\xffHello!\x07\xa2\x02\xff"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -9); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_codelen_16_overflow) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x05\x80\x85\x0c\x00\x00\x00\xc0\xfc\xa1\x5f\xc3\x06\x05\xf5\x02\xfb"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -18); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_codelen_17_overflow) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x05\xc0\xb1\x0c\x00\x00\x00\x00\x20\x7f\xe7\xae\x26\x00\xfd\x00\xfd"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -19); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_codelen_18_overflow) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x05\xc0\x81\x08\x00\x00\x00\x00\x20\x7f\xdf\x09\x4e\x00\xf5\x00\xf5"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -20); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_codelen_overfull) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x05\x80\x31\x11\x01\x00\x00\x01\xc3\xa9\xe2\x37\x47\xff\xcd\x69\x26\xf4\x0a\x7a\x02\xbb"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -14); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_codelen_underfull) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x05\x80\x31\x11\x00\x00\x00\x41\xc3\xa9\xe2\x37\x47\xff\xcd\x69\x26\xf4\x0a\x7a\x02\xbb"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -15); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_litlen_bad_huffman) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x05\x40\x81\x09\x00\x20\x08\x7b\xa5\x0f\x7a\xa4\x27\xa2" + "\x46\x0a\xa2\xa0\xfb\x1f\x11\x23\xea\xf8\x16\xc4\xa7\xae\x9b\x0f\x3d\x4e\xe4\x07\x8d"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -17); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_distance_bad_huffman) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x1d\xc5\x31\x0d\x00\x00\x0c\x02\x41\x2b\x55\x80\x8a\x9a" + "\x61\x06\xff\x21\xf9\xe5\xfe\x9d\x1e\x48\x3c\x31\xba\x05\x79"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -23); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_bad_distance) +#if UFBXT_IMPL +{ + { + char src[] = "\x78\x9c\x73\xc9\x2c\x2e\x51\x00\x3d\x00\x0f\xd7\x03\x49"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -11); + } + + { + char src[] = "\x78\x9c\x73\xc9\x2c\x2e\x51\x00\x7d\x00\x0f\xd7\x03\x49"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -11); + } +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_bad_litlen) +#if UFBXT_IMPL +{ + { + char src[] = "\x78\x9c\x1b\x03\x00\x00\x42\x00\x42"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -13); + } + + { + char src[] = "\x78\x9c\x1b\x07\x00\x00\x42\x00\x42"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -13); + } +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_distance_too_far) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x73\x04\x41\x00\x00\x00\x00\x01"; + char dst[64]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -12); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_literal_overflow) +#if UFBXT_IMPL +{ + if (opts->force_fast) return; + + char src[] = "x\xda\xf3H\xcd\xc9\xc9W(\xcf/\xcaIQ\x04\x00\x1d\t\x04^"; + char dst[8]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -10); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_match_overflow) +#if UFBXT_IMPL +{ + if (opts->force_fast) return; + + char src[] = "x\xda\xf3H\xcd\xc9\xc9W\xf0\x00\x91\x8a\x00\x1b\xbb\x04*"; + char dst[8]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -12); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_bad_distance_bit) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x0d\xc3\x41\x09\x00\x00\x00\xc2\xc0\x2a\x56\x13" + "\x6c\x60\x7f\xd8\x1e\xd7\x2f\x06\x0a\x41\x02\x91"; + char dst[8]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -11); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_bad_distance_empty) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x0d\xc4\x41\x09\x00\x00\x00\xc2\xc0\x2a\x56\x13\x6c\x60\x7f\xd8\x1e\xd0" + "\x2f\x02\x0a\x41\x02\x91"; + char dst[8]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -11); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_bad_lit_length) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x05\xc0\x81\x08\x00\x00\x00\x00\x20\x7f\xeb\x0b\x00\x00\x00\x01"; + char dst[8]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -13); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_no_litlen_codes) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x05\x00\x80\xe4\x3f\x1b\x00\x00\x00\x01"; + char dst[8]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -13); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fail_no_dist_codes) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x15\xc0\x81\x0c\x00\x00\x00\x80\x30\xb6\xfc\xa5\xda\x17" + "\x03\x03\xd4\x01\x46"; + char dst[8]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == -11); +} +#endif + +#if UFBXT_IMPL +static uint32_t fnv1a(const void *data, size_t size) +{ + const char *ptr = data, *end = ptr + size; + uint32_t h = 0x811c9dc5u; + for (; ptr != end; ptr++) { + h = (h ^ (uint8_t)*ptr) * 0x01000193; + } + return h; +} +#endif + +UFBXT_DEFLATE_TEST(deflate_bit_flip) +#if UFBXT_IMPL +{ + char src[] = "\x78\x9c\x00\x04\x00\xfb\xff\x54\x65\x73\x74\x52\x08" + "\x48\x2c\x02\x10\x00\x06\x32\x00\x00\x00\x0c\x52\x39\xcc\x45\x72\xc8" + "\x7f\xcd\x9d\x00\x08\x00\xf7\xff\x74\x61\x20\x44\x61\x74\x61\x20\x02" + "\x8b\x01\x38\x8c\x43\x12\x00\x00\x00\x00\x40\xff\x5f\x0b\x36\x8b\xc0" + "\x12\x80\xf9\xa5\x96\x23\x84\x00\x8e\x36\x10\x41"; + + char dst[64]; + int num_res[64] = { 0 }; + + for (size_t byte_ix = 0; byte_ix < sizeof(src) - 1; byte_ix++) { + for (size_t bit_ix = 0; bit_ix < 8; bit_ix++) { + size_t bit = (size_t)1 << bit_ix; + + ufbxt_hintf("byte_ix==%u && bit_ix==%u", (unsigned)byte_ix, (unsigned)bit_ix); + + src[byte_ix] ^= bit; + ptrdiff_t res = ufbxt_inflate_no_fuzz(dst, sizeof(dst), src, sizeof(src) - 1, opts); + src[byte_ix] ^= bit; + + res = -res; + if (res < 0) res = 0; + if (res > ufbxt_arraycount(num_res)) res = ufbxt_arraycount(num_res); + num_res[res]++; + } + } + + char line[128], *ptr = line, *end = line + sizeof(line); + for (size_t i = 0; i < ufbxt_arraycount(num_res); i++) { + if (num_res[i] > 0) { + ptr += snprintf(ptr, end - ptr, "%3d:%3d ", -(int)i, num_res[i]); + if (ptr - line > 70) { + ufbxt_logf("%s", line); + ptr = line; + } + } + } +} +#endif + +UFBXT_DEFLATE_TEST(deflate_static_distances_and_lengths) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x63\x60\x04\x02\x26\x66\x10\x62\x61\x05\x53\x6c\xec\x10\x36\x07\x27\x54" + "\x80\x8b\x1b\x26\xc1\xc3\x0b\x57\xc0\xc7\x8f\x50\x27\x20\x88\xa4\x43\x48\x18\x59" + "\x87\x88\x28\x8a\x51\x62\xe2\xa8\x46\x49\x48\xa2\x59\x20\x25\x8d\x6e\x9b\x8c\x2c" + "\x86\x03\xe4\xe4\x31\x1d\xa0\xa0\x88\xc5\x7d\x4a\xca\xd8\xdc\xa7\xa2\x8a\xd5\x03" + "\x6a\xea\xd8\x3d\xa0\xa1\x89\xc3\x97\x5a\xda\xb8\x02\x40\x47\x17\x67\x00\xe8\xe9" + "\xe3\x0e\x00\x03\x43\x3c\x21\x69\x64\x8c\x2f\x24\x4d\x4c\xf1\xc6\x87\x99\x39\xfe" + "\xf8\xb0\xb0\x24\x10\x1f\x56\xd6\x84\xe2\xc3\xc6\x96\x60\x02\xb0\xb3\x27\x9c\x00" + "\x1c\x1c\x89\x48\x00\x4e\xce\x44\xa6\x2b\x17\x57\xe2\xd3\x95\x9b\x3b\x09\xe9\xca" + "\xc3\x93\xd4\x74\xe5\xe5\x4d\x7a\x06\xf0\xf1\x25\x23\x03\xf8\xf9\x93\x99\x07\x03" + "\x02\xc9\xcf\x83\x41\xc1\x14\xe4\xc1\x90\x50\x0a\x0b\x80\xb0\x70\xca\x0b\x80\x88" + "\x48\x2a\x14\x00\x51\xd1\xd4\x29\xe1\x62\x62\xa9\x5f\xc2\xc5\xc5\xd3\xa0\x84\x4b" + "\x48\xa4\x5d\x09\x97\x94\x4c\xfb\x0a\x20\x25\x95\x0e\x15\x40\x5a\x3a\xdd\x2a\x80" + "\x8c\x4c\xfa\xd7\x83\x59\xd9\x03\x50\x0f\xe6\xe4\x0e\x54\x03\x20\x2f\x7f\xe0\x1b" + "\x00\x05\x85\x83\xa0\x01\x50\x54\x3c\x98\xda\x70\x25\xa5\x83\xb3\x0d\x57\x56\x3e" + "\xf8\xdb\x70\x15\x95\x43\xa0\x0d\x57\x55\x3d\x74\x3a\x00\x35\xb5\x43\xb1\x03\x50" + "\x57\x3f\xf4\x3b\x00\x0d\x8d\xc3\xa0\xaf\xd6\xd4\x3c\x5c\xfa\x6a\x2d\xad\xc3\xaf" + "\xaf\xd6\xd6\x3e\xfc\x07\x00\x3a\x3a\x47\xc0\x00\x40\x57\xf7\xc8\x18\x00\xe8\xe9" + "\x1d\x69\x03\x00\x7d\xfd\x23\x77\x1c\x6e\xc2\xc4\x11\x3f\x0e\x37\x69\xf2\xe8\x38" + "\xdc\x94\xa9\xa3\xe3\x70\xd3\xa6\x8f\x4e\x00\xcc\x98\x39\x3a\x01\x30\x6b\xf6\xe8" + "\x04\xc0\x9c\xb9\xa3\x13\x00\xf3\xe6\x8f\xce\xab\x2d\x58\x38\x3a\xaf\xb6\x68\xf1" + "\xe8\xbc\xda\x92\xa5\xa3\xf3\x6a\xcb\x96\x8f\x2e\x00\x58\xb1\x72\x74\x01\xc0\xaa" + "\xd5\xa3\x0b\x00\xd6\xac\x1d\x5d\x00\xb0\x6e\xfd\xe8\x02\x80\x0d\x1b\x47\x17\x00" + "\x6c\xda\x3c\xba\x00\x60\xcb\xd6\xd1\xf5\x70\xdb\xb6\x8f\xae\x87\xdb\xb1\x73\x74" + "\x3d\xdc\xae\xdd\xa3\xeb\xe1\xf6\xec\x1d\x5d\x0f\xb7\x6f\xff\xe8\x7a\xb8\x03\x07" + "\x47\xd7\xc3\x1d\x3a\x3c\xba\x1e\xee\xc8\xd1\xd1\xf5\x70\xc7\x8e\x8f\x6e\x00\x38" + "\x71\x72\x74\x03\xc0\xa9\xd3\xa3\x1b\x00\xce\x9c\x1d\xdd\x00\x70\xee\xfc\xe8\x06" + "\x80\x0b\x17\x47\x37\x00\x5c\xba\x3c\xba\x01\xe0\xca\xd5\xd1\xfd\x6a\xd7\xae\x8f" + "\xee\x57\xbb\x71\x73\x74\xbf\xda\xad\xdb\xa3\xfb\xd5\xee\xdc\x1d\xdd\xaf\x76\xef" + "\xfe\xe8\x7e\xb5\x07\x0f\x47\xf7\xab\x3d\x7a\x3c\xba\x5f\xed\xc9\xd3\xd1\xfd\x6a" + "\xcf\x9e\x8f\x1e\x00\xf0\xe2\xe5\xe8\x01\x00\xaf\x5e\x8f\x1e\x00\xf0\xe6\xed\xe8" + "\x01\x00\xef\xde\x8f\x1e\x00\xf0\xe1\xe3\xe8\x01\x00\x9f\x3e\x8f\x1e\x00\xf0\xe5" + "\xeb\xe8\x01\x00\xdf\xbe\x8f\x1e\x00\xf0\xe3\xe7\xe8\x01\x00\xbf\x7e\x8f\x1e\x00" + "\xf0\xe7\xef\xe8\x01\x00\xff\xfe\x8f\x1e\x00\xc0\xc0\x38\x7a\x00\x00\x13\xf3\xe8" + "\xf9\x70\x2c\xac\xa3\xe7\xc3\xb1\xb1\x8f\x9e\x0f\xc7\xc1\x39\x7a\x3e\x1c\x17\xf7" + "\xe8\xf9\x70\x3c\xbc\xa3\xe7\xc3\xf1\xf1\x8f\x9e\x0f\x27\x20\x38\x7a\x3e\x9c\x90" + "\xf0\xe8\xf9\x70\x22\xa2\xa3\xe7\xc3\x89\x89\x8f\x9e\x0f\x27\x21\x39\x7a\x3e\x9c" + "\x94\xf4\xe8\xf9\x70\x32\xb2\xa3\xe7\xc3\xc9\xc9\x8f\x9e\x0f\xa7\xa0\x38\x7a\x3e" + "\x9c\x92\xf2\xe8\xf9\x70\x2a\xaa\xa3\xe7\xc3\xa9\xa9\x8f\x5e\x00\xa0\xa1\x39\x7a" + "\x4f\x83\x96\xf6\xe8\x3d\x0d\x3a\xba\xa3\xf7\x34\xe8\xe9\x8f\xde\xd3\x60\x60\x38" + "\x7a\x1f\x8b\x91\xf1\xe8\x7d\x2c\x26\xa6\xa3\xf7\xb1\x98\x99\x8f\xde\xc7\x62\x61" + "\x39\x7a\xef\x92\x95\xf5\xe8\xbd\x4b\x36\xb6\xa3\xf7\x2e\xd9\xd9\x8f\xde\xbb\xe4" + "\xe0\x38\x7a\xbf\x9a\x93\xf3\xe8\xfd\x6a\x2e\xae\xa3\xf7\xab\xb9\xb9\x8f\xde\xaf" + "\xe6\xe1\x39\x7a\x8f\xa2\x97\xf7\xe8\x3d\x8a\x3e\xbe\xa3\xf7\x28\xfa\xf9\x8f\xde" + "\xa3\x18\x10\x38\x7a\x5f\x6a\x50\xf0\xe8\x7d\xa9\x21\xa1\xa3\xf7\xa5\x86\x85\x8f" + "\xde\x97\x1a\x11\x39\x7a\x2f\x72\x54\xf4\xe8\xbd\xc8\x31\xb1\xa3\xf7\x22\xc7\xc5" + "\x8f\xde\x8b\x9c\x90\x38\x7a\x2f\x72\x52\xf2\xe8\xbd\xc8\x29\xa9\xa3\xf7\xff\xa7" + "\xa5\x8f\xde\xff\x0f\x00\x5e\x3b\xcf\x7c"; + + size_t dst_size = 33665; + char *dst = malloc(dst_size); + ptrdiff_t res = ufbxt_inflate(dst, dst_size, src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == dst_size); + ufbxt_assert(fnv1a(dst, dst_size) == 0x88398917); + free(dst); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_dynamic_distances_and_lengths) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\xed\x9d\x03\x70\x34\x41\x14\x84\x63\xdb\xb6\x6d\xdb\xb6\xed\xfc\xb6\x6d" + "\xdb\xb6\x6d\xdb\xb6\x6d\xdb\x36\x82\xb3\xb1\x9d\x4a\x55\x52\xc9\xdd\xed\xee\x78" + "\xe6\xbd\xee\x4f\x44\xf4\xe7\x97\x98\xf8\xaf\x6f\x09\xc9\xdf\x3f\xa4\xa4\xff\xfc" + "\x2e\x23\xfb\xf7\x0f\x72\xf2\xff\xfe\xa1\xa0\xf8\xff\x05\x4a\xca\x35\xaf\x53\x51" + "\xad\xf5\x0e\x35\xf5\xda\xef\xd0\xd0\xac\xf3\x51\x5a\xda\x75\x3f\x4a\x47\xb7\xde" + "\x05\xf4\xf4\xeb\x5f\xcd\xc0\x90\xe4\x06\x8c\x8c\x49\x6f\xc0\xc4\x94\xcc\xfd\x99" + "\x99\x93\xbb\x3f\x0b\x4b\xb2\x0f\x60\x65\x4d\xfe\x01\x6c\x6c\x29\x3c\xa5\x9d\x3d" + "\xa5\x02\x70\x70\xa4\x58\x00\x4e\xce\x94\x0b\xc0\xc5\x95\x4a\x49\xba\xb9\x53\x2b" + "\x49\x0f\x4f\xaa\xf5\xe1\xe5\x4d\xbd\x3e\x7c\x7c\x69\xd4\x87\x9f\x3f\xad\xfa\x08" + "\x08\xa4\xd9\x00\x82\x82\x69\x37\x80\x90\x50\x3a\x1a\x40\x58\x38\x9d\xed\x2a\x22" + "\x92\xfe\x76\x15\x15\xcd\x40\xbb\x8a\x89\x65\xb4\x5d\xc5\xc5\x33\xde\x01\x12\x12" + "\x99\xe8\x00\x49\xc9\x4c\xf6\xc1\x94\x54\xe6\xfb\x60\x5a\x3a\x0b\x7d\x30\x23\x93" + "\xc5\x01\x20\x2b\x9b\xf5\x01\x20\x27\x97\x0d\x03\x40\x5e\x3e\x7b\x46\xb8\x82\x42" + "\xf6\x8f\x70\x45\xc5\x1c\x18\xe1\x4a\x4a\x39\x37\xc2\x95\x95\x73\x7e\x02\xa8\xa8" + "\xe4\xc2\x04\x50\x55\xcd\xb5\x09\xa0\x41\x43\xee\xcf\x83\x8d\x1a\xf3\x60\x1e\x6c" + "\xd2\x94\x57\x0b\x80\x66\xcd\x79\xbf\x00\x68\xd1\x92\x0f\x16\x00\xad\x5a\xf3\xd3" + "\x1a\xae\x4d\x5b\xfe\x5c\xc3\xb5\x6b\xcf\xff\x6b\xb8\x0e\x1d\x05\x60\x0d\xd7\xa9" + "\xb3\xe0\x6c\x00\xba\x74\x15\xc4\x0d\x40\xb7\xee\x82\xbf\x01\xe8\xd1\x53\x08\xf6" + "\x6a\xbd\x7a\x0b\xcb\x5e\xad\x4f\x5f\xe1\xdb\xab\xf5\xeb\x2f\xfc\x07\x00\x03\x06" + "\x12\xe0\x00\x60\xd0\x60\x62\x1c\x00\x0c\x19\x4a\xb4\x03\x80\x61\xc3\x89\x7b\x0e" + "\x37\x62\x24\xe1\xcf\xe1\x46\x8d\xc6\x39\xdc\x98\xb1\x38\x87\x1b\x37\x1e\x01\x80" + "\x09\x13\x11\x00\x98\x34\x19\x01\x80\x29\x53\x11\x00\x98\x36\x1d\x71\xb5\x19\x33" + "\x11\x57\x9b\x35\x1b\x71\xb5\x39\x73\x11\x57\x9b\x37\x1f\x09\x00\x0b\x16\x22\x01" + "\x60\xd1\x62\x24\x00\x2c\x59\x8a\x04\x80\x65\xcb\x91\x00\xb0\x62\x25\x12\x00\x56" + "\xad\x46\x02\xc0\x9a\xb5\xc8\x87\x5b\xb7\x1e\xf9\x70\x1b\x36\x22\x1f\x6e\xd3\x66" + "\xe4\xc3\x6d\xd9\x8a\x7c\xb8\x6d\xdb\x91\x0f\xb7\x63\x27\xf2\xe1\x76\xed\x46\x3e" + "\xdc\x9e\xbd\xc8\x87\xdb\xb7\x1f\x02\x80\x03\x07\x21\x00\x38\x74\x18\x02\x80\x23" + "\x47\x21\x00\x38\x76\x1c\x02\x80\x13\x27\x21\x00\x38\x75\x1a\x02\x80\x33\x67\xa1" + "\x57\x3b\x77\x1e\x7a\xb5\x0b\x17\xa1\x57\xbb\x74\x19\x7a\xb5\x2b\x57\xa1\x57\xbb" + "\x76\x1d\x7a\xb5\x1b\x37\xa1\x57\xbb\x75\x1b\x7a\xb5\x3b\x77\xa1\x57\xbb\x77\x1f" + "\x06\x00\x0f\x1e\xc2\x00\xe0\xd1\x63\x18\x00\x3c\x79\x0a\x03\x80\x67\xcf\x61\x00" + "\xf0\xe2\x25\x0c\x00\x5e\xbd\x86\x01\xc0\x9b\xb7\x30\x00\x78\xf7\x1e\x06\x00\x1f" + "\x3e\xc2\x00\xe0\xd3\x67\x18\x00\x7c\xf9\x0a\x03\x80\x6f\xdf\x61\x00\x20\x22\x0a" + "\x03\x00\x31\x71\xf8\xc3\x49\x48\xc2\x1f\x4e\x4a\x1a\xfe\x70\x32\xb2\xf0\x87\x93" + "\x93\x87\x3f\x9c\x82\x22\xfc\xe1\x94\x94\xe1\x0f\xa7\xa2\x0a\x7f\x38\x35\x75\xf8" + "\xc3\x69\x68\xc2\x1f\x4e\x4b\x1b\xfe\x70\x3a\xba\xf0\x87\xd3\xd3\x87\x3f\x9c\x81" + "\x21\xfc\xe1\x8c\x8c\xe1\x0f\x67\x62\x0a\x7f\x38\x33\x73\xf8\xc3\x59\x58\xc2\x1f" + "\xce\xca\x1a\x00\x00\x1b\x5b\x70\x1a\xec\xec\xc1\x69\x70\x70\x04\xa7\xc1\xc9\x19" + "\x9c\x06\x17\x57\xf0\x58\xdc\xdc\xc1\x63\xf1\xf0\x04\x8f\xc5\xcb\x1b\x3c\x16\x1f" + "\x5f\x70\x97\xfc\xfc\xc1\x5d\x0a\x08\x04\x77\x29\x28\x18\xdc\xa5\x90\x50\xf0\xd5" + "\xc2\xc2\xc1\x57\x8b\x88\x04\x5f\x2d\x2a\x1a\x7c\xb5\x98\x58\x70\x14\xe3\xe2\xc1" + "\x51\x4c\x48\x04\x47\x31\x29\x19\x1c\xc5\x94\x54\xf0\x52\xd3\xd2\xc1\x4b\xcd\xc8" + "\x04\x2f\x35\x2b\x1b\xbc\xd4\x9c\x5c\x70\x91\xf3\xf2\xc1\x45\x2e\x28\x04\x17\xb9" + "\xa8\x18\x5c\xe4\x92\x52\x70\x91\xcb\xca\xc1\x45\xae\xa8\x04\xff\xbf\xaa\x1a\xfc" + "\xff\x1f\x5e\x3b\xcf\x7c"; + + size_t dst_size = 33665; + char *dst = malloc(dst_size); + ptrdiff_t res = ufbxt_inflate(dst, dst_size, src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == dst_size); + ufbxt_assert(fnv1a(dst, dst_size) == 0x88398917); + free(dst); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_long_codes) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\xed\xfd\xc7\xb9\x65\x5d\xb6\x65\xd9\xc9\x06\x40\x85\xae\xc2\x90\x60\x2e" + "\xfd\x3f\x14\xf6\xb9\xe6\xfe\x32\xc1\x39\x69\x85\x56\xeb\x63\xae\x7d\xae\xfd\x1e" + "\x01\x8e\xb7\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xff\x27\xfd\x7f\x1e\xee" + "\xff\xa3\xfe\x3f\x0f\xf7\xbf\xf9\xff\xac\xff\xcf\xc3\xfd\x6f\xfe\xb7\xff\x1f\xf6" + "\xff\x79\xb8\xff\xcd\xff\xf6\x7f\xf7\xff\x69\xff\x9f\x87\x03\x00\x00\xe0\xff\x1b" + "\xff\xbf\xaf\xf6\xff\x95\xff\xdf\x57\xfb\xdf\xfc\x7f\xe7\xff\xf7\xd5\xfe\x37\xff" + "\xdb\xff\x2f\xfd\xff\xbe\xda\xff\xe6\x7f\xfb\xbf\xfb\xff\xd6\xff\xef\xab\x01\x00" + "\x00\x00\x00\xfc\xff\xde\xff\xef\xc3\xfd\xff\xe0\xff\xef\xc3\xfd\x6f\xfe\x7f\xf1" + "\xff\xf7\xe1\xfe\x37\xff\xdb\xff\x9f\xfc\xff\x7d\xb8\xff\xcd\xff\xf6\x7f\xf7\xff" + "\x9b\xff\xbf\x0f\x07\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xf1\xff\x7f\xa9\xff" + "\x7f\xf2\xff\x7f\xa9\xff\x9b\xff\x7f\xf9\xff\xbf\xd4\xff\xcd\xff\xf6\xff\x6f\xfe" + "\xff\x2f\xf5\x7f\xf3\xbf\xfd\xdf\xfd\xff\xcf\xff\xff\xa5\xfe\xef\x01\x7e\xa8\x57" + "\xe0"; + + size_t dst_size = 31216; + char *dst = malloc(dst_size); + ptrdiff_t res = ufbxt_inflate(dst, dst_size, src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == dst_size); + ufbxt_assert(fnv1a(dst, dst_size) == 0x9e9ed1e5); + free(dst); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_long_code_sequences) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\xdc\x93\x01\x0d\x00\x00\x0c\x82\x2a\x09\xf4\xef\xf6\x1e\x4f\xe0\x86\xb0" + "\x02\x6c\x8b\x86\xab\xcd\x18\x1b\x6c\x83\xa5\xab\xa1\x91\x58\xba\xc5\x54\x30\x61" + "\x33\x99\x65\x33\xc1\x56\x99\xb2\x9c\x80\xca\x36\xab\xc8\x6d\x6d\xb2\x39\x04\x06" + "\x5b\xce\xb6\x39\x75\xe5\x44\x1c\x45\x24\xac\x95\x2b\x85\xc9\x26\x50\x1b\xc5\x2c" + "\x92\xe6\xd6\x32\x20\x6b\x6e\xab\x30\xdc\xc8\xa0\xe6\xd6\x16\xdb\x5c\x14\x30\xb7" + "\x10\x56\x6d\xa6\xe2\x97\x8d\xd1\x9a\xac\x2f\xa4\xa0\x40\xdd\x17\x26\x41\x6e\xc1" + "\x97\x73\x16\xba\x2d\xbe\xb4\x6a\xb4\x46\x7d\xa9\x26\x1d\x53\xf6\x45\xe4\x34\x80" + "\xf9\xc5\xd4\xa6\x2e\xdc\x17\xb4\x9b\x8a\x8e\x2f\xa6\x27\x6a\xab\x2f\x4d\xb6\xc2" + "\xd0\x2f\x7d\x6d\xca\xc8\xbe\x98\xaf\x38\x57\x7e\x11\xc2\x95\xb9\xf6\x45\xc3\x22" + "\x64\xf8\x85\xbb\x60\xba\xf6\xc5\x84\x21\x62\xf5\xa5\x16\xd8\x5a\xcd\x2f\x30\xac" + "\xa6\xc8\x97\x38\x98\x88\xae\x2f\x1a\x6e\x58\x46\x5f\x0c\xcd\xc4\xa9\x5f\xec\xc4" + "\x6c\x2d\xbe\x40\x41\xab\x92\x2f\x36\x84\xc0\x64\x5f\xda\x02\x67\xa2\x5f\x4e\x75" + "\xcc\xc4\x7d\xf1\x45\xc3\xb9\xfa\x22\x94\x38\x8b\xfa\xf2\x7e\x73\x91\xf2\x25\x8d" + "\x15\xb0\xb9\x2f\x47\xc3\x36\xdb\xfc\x12\x79\xd2\x1c\xf0\xe5\xab\x86\x00\xdb\x17" + "\x9e\x2b\x30\xea\xcb\x35\x8d\x94\xc9\x17\x1a\x5b\x63\x9b\x7e\xc9\xb7\x01\x38\xfb" + "\x72\x19\xea\x60\xf1\xa5\xd2\x61\xdb\x36\xbe\xc0\xda\x82\x26\xfb\xe2\x64\x21\x40" + "\xfb\xa2\x02\xab\x60\xf2\xc5\x2c\x89\xa5\xf9\xa5\x09\x8b\xe1\xf0\x0b\x2b\x12\xd0" + "\xed\x8b\x43\xc1\xa2\xea\x0b\xcf\x9a\x96\xf2\xa5\x48\x10\xc7\xb6\x2f\x8e\x66\xe9" + "\xa6\x5f\x48\xb6\xc4\x68\x5f\xce\xb4\xd0\xb2\x2f\x16\x30\x69\x2a\x5f\x3c\x8b\xe1" + "\x46\x7e\x69\xc5\xa0\x54\xbe\xbc\xa0\x36\x53\xbe\xa8\x89\x6d\x1b\xf4\x25\x45\x81" + "\xc1\xc6\x97\x07\x24\x54\xe2\x4b\xdb\x05\xdb\xdc\xbe\x40\xc6\x66\x4a\x5f\x40\x6b" + "\xe6\x72\x5f\xae\x75\x88\xad\x7d\x51\x51\x87\x99\x7d\xb9\x36\x5b\x92\xfb\xd2\x1f" + "\x35\x64\xf3\x4b\x63\x2d\x03\xe0\x4b\x64\xe0\xd2\xe1\x97\x26\x6b\xb2\x9c\x5f\x72" + "\xde\xa6\x42\x7d\xa9\x6e\x62\xc8\xf8\xc2\x9c\xdc\x1c\xec\x0b\x9e\x85\x8e\xd5\x17" + "\xe2\x64\x86\xfa\x25\x20\x62\xcc\xad\x2f\x62\x08\xc2\xd0\x2f\xb1\x98\xca\xa6\x5f" + "\xce\xa5\x60\x45\x5f\x3e\xc1\x5c\x89\x5f\x30\x93\x84\x63\x5f\x82\xb6\x34\xb3\x2f" + "\xae\xd5\x9a\xac\xbe\x08\x84\x58\x42\x5f\xe4\x42\x9d\x4d\xbe\xc8\xd5\x64\xc6\xf6" + "\xc5\x27\x03\x72\xf8\x25\x24\xd8\xc8\xe0\x4b\x01\xb1\x6a\xe8\x97\xa3\x65\x95\xac" + "\x2f\xe9\x34\xa5\xd4\x2f\x71\x36\x70\x5b\xfb\x52\xc4\x16\x60\xf2\x25\x11\x4b\x0d" + "\xfa\x22\x82\xa5\x0c\xf8\x62\xf7\x6a\x53\xdd\x97\x37\x64\xae\x89\x5f\xe2\x52\x6b" + "\x13\xbf\xbc\x36\x71\x0d\xfa\x52\xd7\xc0\xb5\xd5\x17\xe4\xb9\xb9\x8c\x2f\x41\x4c" + "\xb6\x05\x7e\x31\x62\xd3\x81\xf0\x25\xd6\x26\x5b\xd6\x17\xbe\xb3\x36\x83\x2f\x6f" + "\x53\x2d\xda\xbe\x38\x82\xcb\xa1\x7c\x31\x22\x32\x90\x7d\x49\xcb\x66\xe0\xfc\x02" + "\xc9\x05\x2a\x7e\xe9\x04\xdb\x58\xdb\x17\x87\x02\xc0\xd6\x17\x2b\xd5\x2d\x86\x5f" + "\x64\xd8\x9c\x35\x3d\xf2\xee\x44\x00\x00\x00\x00\x61\x20\x5b\xaf\x3f\x52\x20\x1d" + "\xc8\xf6\x16\xf8\xfa\x4c\xd5\xe0\x2e\xfc\x1d\xbc\x35\xfc\x52\xbc\xe6\x8d\x5d\xf5" + "\x29\xed\x04\x18\x7c\x0a\x6d\xa3\x6a\xf8\x51\xb6\x28\x68\x04\x47\x19\x8e\x91\xf7" + "\x27\x84\xb6\x6d\xdb\xae\x65\x87\x4d\x29\x7f\x48\x02\xa2\x52\xd5\xfa\x98\x6b\x9f" + "\xfb\x7e\x30\xb0\x3f\xff\x7f\xcf\xe8\xe9\xff\x37\x09\x79\xf9\xff\xbb\x94\xd2\xcb" + "\xff\xcf\x14\x99\x7e\xfd\xff\x29\x40\x4b\x7d\xfd\xff\xa9\x5e\x37\xd6\xe1\xff\xcf" + "\x14\x25\x8d\xfd\xf9\xff\x7b\x8d\x4e\x63\xf0\xf3\xff\xd7\xc0\x46\xde\x7d\x08\x00" + "\x00\x00\x20\x10\x64\x6b\xfa\x23\x05\xd2\xbd\x47\xbd\x2e\x5c\xff\xcd\xba\xfa\x6b" + "\x54\x0c\x79\xdc\x42\x2c\x75\x39\x92\x16\x4b\x37\x6b\x6e\x2d\x8d\xbf\x85\x0b\xb2" + "\x41\xde\xd6\x63\x12\x84\xd2\xc7\x06\xee\xc8\xfb\x13\x42\xdb\xb6\x6d\xd7\xb2\xc3" + "\xa6\x94\x3f\x24\x01\x51\xa9\x6a\x7d\xcc\xb5\xcf\x7d\x3f\x18\xd8\x47\xff\x3f\x4a" + "\xfd\xf9\xff\x2b\xd3\xbe\xfb\xff\x55\x30\xea\xf3\xff\xb7\x12\xd3\x1e\xfe\xff\xa0" + "\x93\x6d\xfe\xfd\xff\x14\x1d\xd1\xf4\xe3\xff\x57\x93\x43\x05\x3a\xfd\xff\x5d\xb5" + "\x9a\x36\xfd\xf5\xff\x2b\x81\x23\xef\x4e\x04\x00\x00\x40\x20\x08\x8e\x5a\xaf\x3f" + "\x52\x20\xcd\x1e\x47\xfd\x38\xac\xfe\xec\xf2\x74\xbc\x3c\x0a\xd3\xfb\xeb\xc2\x60" + "\x65\xfc\xbc\x6d\xd9\xb1\xfb\xe5\xc4\x52\xc4\x6c\xfc\x38\xc2\xd1\x19\x91\xf9\xec" + "\x08\x6a\x67\xe6\x66\x7f\x3c\xc4\x71\xe4\xfd\x09\xa1\x6d\xdb\xae\x6d\xcb\x05\x35" + "\xa5\xfc\x21\x09\x88\xa2\x54\xb5\x3e\xe6\xda\xe7\xbe\xcf\xc0\xfe\xf6\xff\xdb\x66" + "\x0f\xff\x7f\x3b\x26\x1e\xfd\xff\x28\x65\xcf\xa7\xff\x5f\x66\xca\x8d\x6f\xff\x3f" + "\xd3\x1c\x13\xf1\xec\xff\xb7\xd6\x22\x32\xf3\xc9\xff\x0f\x1c\xc5\xc4\xcc\xfe\xfa" + "\xff\x15\xcd\xca\xc8\xac\x7a\xfb\xff\x23\x75\x47\xde\x7d\x10\x00\x00\x02\x41\x0c" + "\x4b\xa5\x31\xfd\x4b\x42\x08\xe9\xbd\x0d\xf8\xef\x0d\x95\x0f\x5f\x8e\x3a\x5f\x3e" + "\xb3\x76\xf7\x37\x4f\x42\x8d\x73\x3f\x7d\x1f\xec\xde\xb3\x7e\x7c\x0f\x6e\xad\x35" + "\xc6\x47\x4f\x82\xed\x7b\xc6\xda\xff\x3c\xc7\x33\xf6\xdc\xf3\xce\x0f\x1f\xd5\x79" + "\xe4\xfd\x0b\xa1\x6d\xbb\xb6\x2d\xcb\x45\x42\xd3\x97\x3f\x24\x01\x51\x64\xa9\x6a" + "\x7d\xcc\xb5\xcf\x7d\x0c\xec\x4f\xff\x7f\xb4\xed\xc7\xff\xdf\x75\xb9\xbf\xfd\xff" + "\x3a\xc9\x59\x9f\xfc\xff\xcc\xc7\x99\xeb\xbb\xff\x9f\xa9\xbc\xeb\xee\xef\xfe\x7f" + "\x59\x6d\xcf\x75\xef\x4f\xff\x3f\x33\x32\xef\x5c\x6b\x7c\xf6\xff\xd3\xc5\x7b\xde" + "\xb9\xe7\xf8\xe5\xff\xe7\xc5\x1e\x79\x77\x42\x00\x20\x10\xc4\x30\x70\x52\x67\xbc" + "\xfe\x25\x21\x84\x49\xf7\x64\xc0\x5f\x3f\x5f\xf9\xcf\x4f\x75\xde\x3f\xfd\x50\xf7" + "\xf5\xfe\xf5\x3b\x96\xd7\x7d\xfd\xf0\x2b\xe1\xc7\xf9\x1c\x7f\xfa\x28\xc6\x71\x1d" + "\xd7\xfd\xa7\x0f\xa6\x5c\xf7\x7d\x3c\xef\x3f\xbe\xae\x74\x5e\xc7\x71\xdd\xc7\x5f" + "\x3e\x61\xf9\x91\xf7\x27\x84\xb6\x6b\xdb\xb2\x2c\x69\x1e\xcc\x54\xf2\x87\x24\x20" + "\x32\x8f\xd6\x35\xe6\xda\xe7\xbe\xcf\x20\xf3\x6f\xff\x3f\xd4\xfb\xd7\xff\x5f\xf5" + "\x7d\x7f\xfb\xff\x93\x64\xef\xfd\xcb\xff\xdf\x4d\xbb\x8e\xe3\x6f\xff\xbf\x81\xf1" + "\xbe\xe7\xf9\xaf\xff\xdf\x0c\x7b\xaf\xe3\x38\x7f\xf3\xff\xab\x81\xd7\x7d\x3e\xcf" + "\xf5\xb3\xff\x1f\x78\x3d\xcf\xe3\xb8\x9e\xe7\x4f\xff\xbf\x88\xf7\x91\x77\x27\x04" + "\x08\x04\x31\x10\x04\xab\x27\xca\x78\xfd\x4b\x42\x08\xd5\x93\x3d\x17\xf0\x8f\x3f" + "\x9a\xf3\x97\xbf\x5d\xfc\xfc\xab\x9f\x3b\xf9\x3c\xfe\xf3\xe7\x17\xdf\x9f\xef\x1f" + "\xfd\xd6\xe8\xe7\xf5\xfa\xfc\xe3\x2f\xf6\xbc\x5f\xdf\xd7\xeb\xaf\x7e\x68\xf8\xfd" + "\xfe\xbe\xbe\xcf\xff\xf9\x35\xc2\xef\xe3\xf5\xfa\xbc\x5f\xff\xfa\x1b\x4f\x3f\xf2" + "\xfe\x85\xd0\xb5\x6d\x59\x96\x25\xcd\x23\x91\xe9\xcb\x1f\x92\x80\xc8\x3c\xb2\x75" + "\x8d\xb9\xf6\xb9\x8f\x41\xd5\xdf\xfe\xff\x9a\xc8\x3f\xfe\xff\xb0\xee\xe3\x9f\xfe" + "\x7f\x36\xef\xfb\xf8\xaf\xff\x1f\xb5\xf9\x3e\x9f\x7f\xfb\xff\xf3\x9a\xcf\xf7\xeb" + "\xf5\xa7\xff\xbf\x2d\xf6\x7c\x7f\xdf\x9f\x3f\xfb\xff\xd1\xdf\xc7\xe3\xfb\x78\xbd" + "\xff\xe8\xff\xe7\x62\xbf\xaf\xf7\xeb\xf9\x78\xfc\xe9\xff\xaf\xd9\xfd\xc8\xbb\x13" + "\x82\x08\x82\x20\x08\x82\x91\xd5\x63\x8c\xd7\xbf\x24\x84\x10\x59\x3d\x7b\x2a\xe0" + "\xff\xfc\x5d\xc2\xff\xf7\x97\x83\xbe\xfe\xe7\x5f\x6c\xff\xfe\xfe\xaf\x7f\xcd\xf0" + "\xeb\xf3\xeb\x1f\xfd\x5d\xf5\xef\xcf\x9f\xef\xff\xf2\x17\x40\x3f\x7f\xbf\x7e\x3f" + "\xfe\xc9\xdf\x93\xfe\xfa\xfd\xfa\xfe\xf8\xfe\x87\x7f\x09\xf6\xe7\xeb\xe3\xe3\xf7" + "\xfb\xf3\x3f\xfd\xb9\xc3\x3f\xf2\xfe\x85\xb0\xb6\x65\x59\x96\x2d\x9b\x79\x24\x31" + "\x7d\xf9\x43\x12\x10\x35\xf3\xc8\x3e\x34\xd7\x3e\xf7\x31\xa8\xfa\x3f\xff\x3f\xdb" + "\xf2\x6f\xfe\x7f\x02\xf0\xe3\xff\xfc\xff\xc6\xdc\xf7\xef\xff\xfb\xff\x6d\x8b\xaf" + "\x9f\xcf\x7f\xf6\xff\xfb\xb7\xdf\x9f\x3f\x9f\xff\xf2\xff\x77\x82\xbe\xbe\xbe\xbf" + "\x3f\xff\xe5\xff\xef\x01\x7f\x7f\xff\x7c\x7e\x7f\xfd\xcb\xff\xdf\x20\xfe\xfa\xfe" + "\xfc\xfc\xfc\xfe\xfc\x6f\xff\xbf\x1d\xfb\x47\xde\x9d\x10\x5a\x11\x04\x41\x10\x8c" + "\xac\x9e\x15\xc6\xe9\x5f\x12\x42\x88\xac\x9e\x7d\xdf\x04\xfc\x27\xff\xd0\xd9\x7f" + "\xf8\x4f\x6b\xfc\xfa\xef\xfe\x71\xd6\xdf\xbf\xff\xc3\x7f\x18\xe9\xcf\xdf\x9f\xff" + "\xd5\xbf\x37\xf6\xeb\xcf\x9f\x9f\xff\xdf\x3f\x9f\xfb\xf7\xef\xef\x3f\x7f\xff\xab" + "\x7f\xe3\xe9\xc7\xef\x5f\x7f\x7e\xfe\xfa\xef\xfe\x89\x95\x3f\x7f\x7f\xfc\xf9\xf3" + "\xf3\xd7\xff\xf7\x4f\x0c\xfe\x23\xef\x5f\x0c\xed\x58\x96\x65\x59\xce\x3c\xb2\x5a" + "\x30\x7c\xf5\x17\x09\x82\xc0\x3c\xb2\x7a\x4c\xac\x7d\xee\xd3\x80\xfc\xdf\xfe\x7f" + "\xc0\xf3\xff\xfc\xff\x15\xad\xbf\xff\xd3\xff\x6f\x13\xfd\xf8\xfb\x1f\xfd\xff\x30" + "\xce\x8f\xdf\x3f\xfe\x9f\xff\xdf\x65\xff\xf5\xe7\xcf\xcf\xff\xe7\xff\x07\x31\x7e" + "\xfd\xfc\xf9\xeb\xd7\xff\xf2\xff\x6b\x35\xbf\x7f\xff\xf8\xf5\xe3\xef\x7f\xf7\xff" + "\xd3\x23\xbf\x7e\xfc\xfa\xf9\xf3\xcf\x9f\xff\xec\xff\x07\x3c\xfe\x91\x77\x2f\x84" + "\xb2\x14\x41\x10\x44\x4f\x64\xf5\xac\x2f\xbe\xfe\x25\x21\x84\x13\x59\x3d\x7b\x9f" + "\x08\xf8\x7f\xfd\x17\xca\xff\x9f\xff\xd9\xa1\x3f\xfe\x37\xff\xb9\xf1\x7f\xfe\xfd" + "\xff\xfd\x57\xd0\xfe\xf8\xe7\xdf\xff\xe7\x7f\x1f\xf9\xef\x7f\xfe\xf8\xeb\x7f\xf7" + "\x1f\x9b\xfe\xeb\xaf\x7f\xff\xfd\xf3\xff\xf3\x1f\x81\xfa\xf3\xcf\xbf\xfe\xf9\xeb" + "\x8f\xff\xd1\x7f\x7c\xfc\x9f\xbf\xff\xf8\xf7\xcf\x3f\xfe\xfc\xdf\xfd\xc7\xfa\xfe" + "\x23\xef\x4f\x0c\x65\x39\x96\x65\x59\x52\xd4\x3c\xb2\xf8\xc2\xc8\x3f\x49\x20\x04" + "\xa2\xe6\x91\xb5\x36\xce\x7d\x9f\x83\xee\xff\xdb\xff\xef\xa3\xfe\x4f\xfe\x7f\x9a" + "\xf2\xaf\xff\xe7\xff\xaf\xc1\xfd\xfd\xd7\xff\xea\xff\xe7\x6b\xff\xfe\xeb\x8f\xff" + "\xc7\xff\x0f\xc3\xfd\xf1\xe7\x5f\x7f\xfc\x5f\xfe\x7f\x68\xfa\x9f\x7f\xff\xfa\xeb" + "\xef\xff\xcd\xff\xaf\xd0\xfc\xfd\xcf\xbf\x7f\xff\xfd\xd7\xff\xf3\xff\xe7\xe8\xfe" + "\xfa\xe7\xaf\x3f\xfe\xfe\xf7\xaf\xff\xcd\xff\x4f\xb8\xfd\x47\xde\x9d\x10\xc8\xb2" + "\x1c\x41\x10\x34\x8f\xac\x9e\xc5\xa5\x93\x3f\x24\x01\x91\x79\x64\xf5\xec\xfb\x1c" + "\xa4\xff\x9b\xff\xad\xa2\xff\x9b\xff\xe1\xe1\x7f\xff\xbf\xfc\x8f\x50\xfc\xfb\xbf" + "\xff\x57\xff\xa3\x2a\xff\xfc\xf7\xbf\xff\x4f\xff\x27\xbf\xfe\xf5\x8f\x7f\xff\xf3" + "\xff\xf6\x7f\xb5\xf1\x5f\xff\xfc\xef\x3f\xff\xfb\x7f\xf9\x3f\x44\xf8\xef\x7f\xfe" + "\xf3\x3f\xff\xfa\xf7\xff\xd1\xff\x58\xd9\xbf\xff\xfd\x9f\x7f\xff\xeb\x3f\xff\xfe" + "\xbf\xfc\xdf\x9d\xfe\x1f\x79\xff\x62\x20\xcb\x72\x2c\xcb\x92\xa2\xe6\x91\xd5\x74" + "\xe1\xcb\x3f\x49\x20\x04\xa2\xe6\x91\xd5\x6b\xe3\xdc\xc7\xc1\xcc\xff\xd5\xff\x8f" + "\x86\xfd\x7f\xfc\xff\xd8\xc8\x7f\xff\x2f\xff\x7f\xaf\xfc\xbf\xff\xf9\xff\xfa\xff" + "\xd1\xf5\xff\xfe\xe7\xdf\xff\x67\xff\xbf\x6a\xf3\x8f\xff\xfe\xf7\xbf\xff\x8f\xff" + "\x3f\xb7\xf8\x9f\xff\xfe\xfb\x1f\xff\xfd\x3f\xfd\xff\x65\xa3\xff\xfc\xfb\x1f\xff" + "\xfa\xc7\x3f\xff\x3f\xff\x7f\x87\xf8\x1f\xff\xfa\xc7\x3f\xff\xfd\x9f\x7f\xff\x3f" + "\xfe\xff\xa8\xca\xff\xc8\xbb\x17\x02\x49\x96\xe5\x08\xa2\xc7\x3c\xb2\x7a\x96\x96" + "\xbe\xfc\x21\x09\x88\x8e\x79\x64\xf5\xec\x7d\x18\xa4\xff\xb7\xff\x97\x25\xff\x7f" + "\xfe\x9f\x59\xfb\xef\xff\x27\xff\xa7\x86\xfe\xf3\xbf\xff\x9f\xfc\xdf\x89\xf9\xef" + "\xff\xfc\x9f\xff\x47\xff\x77\x37\xff\xe3\x7f\xff\xe3\xbf\xfe\xbf\xfe\x5f\x15\xfc" + "\xcf\xff\xf8\xef\xff\xfc\xdf\xff\x5f\xff\x87\x43\xfe\xf7\x3f\xfe\xfb\x3f\xff\xeb" + "\xbf\xfe\xbf\xfc\x1f\x15\xfa\xcf\xff\xf9\xdf\xff\xfd\x9f\xff\xfd\xaf\xff\x77\xff" + "\x67\x2c\xff\x8f\xbc\x7f\x31\x90\x64\x59\x8e\x65\xcb\x25\x6a\x1e\x59\xcd\x16\xbe" + "\xfc\x93\x04\x42\xb0\x44\xcd\x23\xab\xf7\xc1\x7d\x1c\xcc\xfc\xff\xf9\xff\x81\xa0" + "\xff\x57\xff\x3f\xdf\xf4\x3f\xff\x4f\xfe\x7f\x19\xee\x3f\xfe\xeb\xff\xd3\xff\x2f" + "\x2d\xfd\xe7\xff\xfc\xef\xff\xcf\xff\xdf\xa6\xfb\x8f\xff\xf9\xdf\xff\xf9\xff\xf1" + "\xff\x13\x8c\xff\xf9\x3f\xff\xf3\xbf\xff\xfb\xff\xe7\xff\x77\x87\xff\xfb\xbf\xff" + "\xe7\xbf\xfe\xfb\x3f\xfe\x5f\xfd\xff\x5e\xe4\x7f\xff\xef\xff\xfc\xd7\x7f\xff\xc7" + "\x7f\xfe\x7f\xfd\xff\x71\x98\xff\x23\xef\x4e\x0c\x24\x49\x96\xe5\x08\x8a\x9a\x47" + "\x56\xcf\x92\x85\x93\x7f\x92\x40\x08\x44\xcd\x23\xab\x67\xdf\x67\x01\xf8\xff\xe8" + "\xff\x29\xc9\xff\xef\xfe\x5f\x41\xfe\xdf\xff\xdf\xfe\x3f\x5a\xfb\x7f\xff\xd7\xff" + "\xa7\xff\xcf\xfc\xfd\xdf\xff\xf1\xbf\xfe\xff\xf9\x7f\x06\xf0\x7f\xfc\xcf\xff\xfd" + "\xbf\xff\x7f\xfa\x7f\x8b\xf5\x7f\xfe\xef\xff\xf9\x7f\xfe\xc7\xff\x3f\xff\x8f\x8b" + "\xfe\x9f\xff\xf3\x7f\xff\xef\xff\xf8\xdf\xff\xdf\xfc\xbf\x86\xfd\xbf\xfe\xe7\xff" + "\xf8\x1f\xff\xe3\xff\xfc\xaf\xff\x2f\xff\x1f\x43\xfd\x7f\xe4\xfd\x8b\x81\x24\xc9" + "\xb2\x5c\x5b\xae\x2d\x6a\x1e\x59\x4d\x16\xbe\xfc\x93\x04\x42\xb0\xb6\xa8\x79\x64" + "\xf5\xb9\x78\x1c\xcc\xfc\xff\xf3\xff\xa3\xd9\xff\x9f\xfe\xff\xda\xdd\xff\xfa\xff" + "\xea\xff\x37\x2b\xff\xc7\xff\xf9\xff\xf0\xff\x07\x5a\xff\xc7\xff\xf9\xbf\xff\xbf" + "\xfc\xff\x98\xd7\xff\xfe\x5f\xff\xe3\x7f\xfc\x7f\xf2\xff\xe3\xa8\xff\xf3\x7f\xfe" + "\xef\xff\xfd\x7f\xff\x3f\xfa\xff\xf1\xd9\xff\xf5\xbf\xff\xe7\xff\xfc\x9f\xff\xe7" + "\xff\xa7\xff\x1f\x16\xfb\xbf\xff\xf3\x7f\xff\x9f\xff\xfd\xbf\xff\xe7\xff\x57\xff" + "\xbf\x8f\xf3\xff\xc8\xbb\x17\x03\x49\x92\x64\x59\xae\x47\xd4\x3c\xb2\x7a\x96\x2b" + "\x7c\xf9\x27\x09\x84\xe0\x88\x9a\x47\x56\xcf\xde\x47\x02\xf0\xff\xab\xff\xef\xf1" + "\xfc\xff\xe5\xff\xab\x55\xff\xd7\xff\x7f\xfe\x3f\xd7\xf3\xff\xfc\xbf\xff\xbf\xfd" + "\xff\x8a\xc9\xff\xf9\xff\xfe\x9f\xff\x3f\xf9\xff\x54\xe1\xff\xf9\xff\xfc\x3f\xff" + "\xe7\xff\xaf\xfe\x3f\xbe\xfc\x7f\xff\xdf\xff\xcf\xff\xf5\x7f\xfc\xff\xe5\xff\xfb" + "\xe5\xff\xe7\xff\xfd\xff\xfc\xdf\xff\xc7\xff\xfb\xff\xc7\xff\xef\x07\xfe\xdf\xff" + "\xe7\xff\xf9\x7f\xfe\xdf\xff\xef\xff\xf9\xff\xbb\xff\xef\x5c\xfd\x7f\xe4\xfd\x8b" + "\x81\x24\x49\xb2\x6d\x57\xae\x7d\x44\xcd\x23\xab\xb9\xc2\x97\x7f\x92\x40\x08\xd6" + "\x3e\xa2\xe6\x91\xd5\xf7\x81\x83\x99\xff\x9f\xfd\xff\xd8\xc7\xff\x3f\xfe\x7f\xbd" + "\xe2\xff\xfe\xff\xe3\xff\x4f\x78\xfc\x9f\xff\xe7\xff\xcf\xfe\x7f\x0f\xe6\xff\xfc" + "\x7f\xff\xcf\xff\x3f\xfd\xff\x88\xed\xff\xfb\x7f\xff\x3f\xff\xcf\xff\x3f\xfe\x7f" + "\x7d\xf0\xff\xfd\x3f\xfe\xcf\xff\xeb\xff\xfd\xff\xc7\xff\x2f\x32\xfd\x1f\xff\xc7" + "\xff\xf1\xff\xfe\x1f\xff\xf7\xff\x9f\xfe\x7f\x26\xef\xff\xf8\x3f\xff\xcf\xff\xfb" + "\xff\xfd\xbf\xff\xef\xff\x7f\xfd\xff\x78\xca\xff\x47\xde\xbf\x18\x48\x92\x24\xd9" + "\xb6\xdd\xda\x47\xd4\x3c\xb2\x7a\xa8\xc2\x97\x7f\x92\x40\x08\xd6\x3e\xa2\xe6\x91" + "\xd5\x73\x1f\x07\xc0\xff\x1f\xfd\xff\x6c\xf5\xff\x5f\xfe\xff\xd2\xe8\xff\xeb\xff" + "\x6f\xff\x7f\x11\xe9\xff\xfd\xff\xfe\xff\xb7\xff\x1f\xc2\xf9\x7f\xfe\xbf\xfe\xbf" + "\xff\xff\xfa\xff\xc3\x8c\xff\x9f\xff\xef\xff\xe3\xff\xf3\xff\x3f\xff\x3f\x16\xfa" + "\xff\xfa\x7f\xfd\x3f\xff\x1f\xff\xcf\xff\xff\xfb\xff\xf5\xaf\xff\xef\xff\xe3\xff" + "\xfd\xff\xfc\x7f\xff\xbf\xff\xff\xe8\xff\x27\x9c\xfe\x1f\xff\xaf\xff\xc7\xff\xf7" + "\xff\xfb\xff\xf8\xff\xfc\xff\xc9\xff\xef\x21\xff\xff\xca\xfb\x17\x03\x49\x92\x24" + "\xdb\xb6\x5b\xfb\x88\x9a\x47\x56\x0f\x55\xf8\xf2\x4f\x12\x08\xc1\xda\x47\xd4\x3c" + "\xb2\x7a\xee\xe3\x00\xf8\xff\xd7\xff\x9f\x0a\xfc\xff\xcb\xff\x9f\x00\xfa\xff\xfe" + "\xff\xd3\xff\xcf\x90\xfe\xbf\xfe\xdf\xff\x7f\xf3\xff\xdb\xbc\xff\xaf\xff\xe7\xff" + "\xe3\xff\x3f\xff\x7f\x98\xf1\xff\xf5\xff\xfe\x7f\xfd\x7f\xff\xff\xea\xff\xe7\xd7" + "\xff\xbf\xff\xcf\xff\xd7\xff\xeb\xff\xf3\xff\x57\xff\xbf\x3c\xf7\xff\xfd\xff\xfe" + "\x3f\xff\xbf\xff\xef\xff\xd7\xff\x7f\xfc\xff\xa6\xdf\xff\xf7\xff\xf5\xff\xfd\x7f" + "\xfd\x3f\xfe\xdf\xff\xdf\xff\xbf\xfa\xff\xcd\xc3\xff\x1f\x77\x74\xe4\x9b"; + + size_t dst_size = 85130; + char *dst = malloc(dst_size); + ptrdiff_t res = ufbxt_inflate(dst, dst_size, src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == dst_size); + ufbxt_assert(fnv1a(dst, dst_size) == 0x138da12f); + free(dst); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_two_symbol_bits) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x04\xc0\x81\x10\x00\x30\x0c\x04\xc1\xaa\x35\x24\xf7\xfe\x12\x3b\xff\x10" + "\x00\x07\x42\x00\x03\x41\x10\x04\x13\xb4\x7b\x92\x59\x7f\x89\xae\x7b\x08\x80\x03" + "\x22\x06\x01\x18\x08\x82\x2d\x28\x0b\x4a\xee\xfd\x9b\xd8\xb9\x0f\x01\x70\x42\xd4" + "\x00\x00\x04\x41\x10\xf2\xea\xba\x28\x99\xf5\x6f\xa2\xeb\x7e\x08\x80\x0f\xaa\x30" + "\x00\x20\x08\xa2\x09\xbd\xa3\xe9\x50\x32\xeb\xdf\xc4\x7f\xf7\x87\x00\xb8\xa0\x02" + "\xc3\x00\x82\x20\xda\x86\x99\x19\xb5\x5c\x94\xcc\xfa\x37\xf1\xdf\xfd\x43\x00\x1c" + "\x08\x01\x0c\x04\x41\x10\x8c\x5a\x9e\x64\xf6\xfc\x21\xba\xfe\x87\x00\x38\x20\x42" + "\x18\x08\x82\x20\x08\xd2\x3e\x4a\x66\xcf\xbf\x88\xae\xf7\x21\x00\x0e\x88\x13\x00" + "\x82\x20\x08\x26\xa0\xec\x51\x32\x7b\xfe\x45\x74\xbd\x1f\x02\xe0\x83\x38\x0c\x20" + "\x08\x82\xa0\xad\x88\xeb\x85\x64\xf6\xf8\x83\xe8\x7a\x7f\x08\x80\x0f\x22\x30\x8c" + "\x20\x08\x82\xb6\x72\x16\xa6\x17\x92\xd9\xe3\x0f\xa2\xeb\xfd\x43\x00\x5c\x50\x01" + "\x60\x1c\x51\x14\x6d\xc3\xcc\x8c\x5a\x36\x4a\xde\x1f\xff\x22\xee\x79\xff\x21\x00" + "\x0e\x88\x10\x06\x82\x20\x08\x62\x8d\x28\x99\xbd\xf7\xef\xa1\xeb\xff\x21\x00\x0e" + "\x88\x22\x08\x82\x20\x08\x82\xb4\x7b\x25\xd5\xb3\xfe\x3d\x64\x7c\x3f\x04\xc0\x01" + "\x55\x18\x41\x10\x04\xd1\x04\x94\x1d\x4a\xaa\x67\xfd\x7b\xf8\xef\xfb\x43\x00\x9c" + "\x10\x81\x71\x04\x41\x10\xb4\xf5\xe2\x3a\x21\xa9\x9e\xe5\xcf\x21\xe3\xfb\x87\x00" + "\xf8\xa0\x02\xe0\x38\x82\x20\x6a\x2b\x67\x61\x3a\x21\xa9\x9e\xe5\xcf\xe1\xbf\xef" + "\x3f\x04\xc0\x05\x15\x00\xd1\x75\x45\xd1\x36\xcc\xcc\xa8\x65\xa2\xe4\xdc\xf7\xfd" + "\x7b\xd8\xeb\xfb\x1f\x02\xe0\x80\x28\x82\x20\x08\x82\x20\xd6\x78\x25\xd5\xb3\xe7" + "\x5f\x43\xc6\xff\x0f\x01\x70\x40\x1c\x47\x10\x04\x41\xd0\x86\xf6\x42\x52\x3d\x7b" + "\xfc\x31\x64\xfc\xfe\x10\x00\x07\x44\x70\x1c\x41\x10\x04\x6d\x09\xd9\x0b\x49\xf5" + "\xec\xf1\xc7\x90\xf1\xfb\x87\x00\x38\xa1\x82\xe0\x38\x82\x20\x6a\xeb\xc4\xb5\x42" + "\x12\x59\x3d\xfc\x31\xfc\xf7\xfb\x0f\x01\xf0\x41\x05\x41\x70\x5c\x51\xd4\x56\xce" + "\xc2\xb4\x42\xf2\x7e\xf5\xf0\xc7\x70\xcf\xef\x7f\x08\x80\x0b\x2a\x8a\xa2\xe8\xba" + "\xa2\x6d\x98\x99\x51\xcb\x8f\x92\xb5\xcf\x7d\xfe\x35\xcc\xf1\xfb\x3f\x04\xc0\x01" + "\x71\x1c\x41\x10\x04\x41\x53\xb3\x90\x54\xcf\xde\xf3\xa7\x90\xf1\xff\x0f\x01\x70" + "\x40\x24\xc9\x11\x04\x41\x50\x82\x76\x8f\x24\xb2\x7a\x96\x3f\x05\xb7\xbf\x7f\x08" + "\x80\x03\x2a\x09\x8e\x23\x08\xa2\xb6\x84\xec\x84\x24\xb2\x7a\x96\x3f\x85\xff\xfe" + "\xfe\x43\x00\x9c\x50\x49\x10\x1c\x57\x14\xb5\xb5\xe2\x1a\x21\x79\x3f\xb2\x9a\x3f" + "\x85\x7b\xfe\xfe\x87\x00\xf8\xa0\x92\x20\x8a\xae\x2b\x6a\x2b\x67\x61\x1a\x21\x39" + "\xf7\xfd\x6a\xfe\x14\xf6\xfa\xfb\x3f\x04\xc0\x05\x95\x45\x51\x14\x65\xd7\xa4\x99" + "\x99\x51\x4b\xb5\x92\xb5\xcf\x7d\xdf\xbf\x85\x39\xfe\xfe\x1f\x02\xe0\x80\x48\x92" + "\x23\x08\x82\xa0\xa8\xe9\x91\x44\x56\xcf\x1e\x7f\x08\x6e\xff\xff\x43\x00\x1c\x50" + "\x49\x92\x1c\x41\x10\x95\xa0\xed\x21\x31\x8f\xac\x1e\xfe\x10\xfe\xfb\xf7\x1f\x02" + "\xe0\x80\x4a\x92\xe0\xb8\xa2\xa8\x2d\x21\x5b\x21\x79\x3f\xb2\x7a\xf8\x43\xb8\xe7" + "\xdf\xff\x10\x00\x27\x54\x92\x44\xd1\x75\x45\x6d\x8d\xb8\x5a\x48\xce\x7d\x3f\xb2" + "\xf8\x43\xd8\xeb\xdf\xff\x21\x00\x3e\xa8\x2c\x8b\xa2\xe8\xba\xda\xca\x59\x98\x5a" + "\x48\xd6\x3e\xf7\xfd\xe2\x0f\x61\x8e\x7f\xff\x0f\x01\x78\x41\x6d\x5b\x14\x45\x51" + "\x76\x49\x31\x33\xa3\x96\x5f\x4a\xc6\x5c\xfb\xdc\xe7\x5f\x42\x6f\xff\xfe\x3f\x04" + "\xc0\x01\x95\x24\xc9\x11\x04\x51\x51\xd3\x21\x31\x8f\xac\x9e\xe5\xcf\xe0\xbf\xff" + "\xff\x87\x00\x38\xa0\x92\x24\x49\xae\x28\x2a\x41\x9b\x45\xf2\xbe\x79\x64\x35\x7f" + "\x06\xf7\xfc\xf7\x3f\x04\xc0\x01\x95\x24\x59\x74\x5d\x51\x5b\x42\x36\x42\x72\xee" + "\xfb\x91\xd5\xfc\x19\xec\xf5\xdf\xff\x21\x00\x4e\xa8\x2c\xcb\xa2\xe8\xba\xda\x6a" + "\x71\x95\x90\xac\x7d\xee\xfb\x91\xfc\x19\xcc\xf1\xdf\xff\x43\x00\x7e\x50\xdb\x96" + "\x45\x51\x74\x9d\xad\x9c\x85\xa9\x84\x64\xcc\xb5\xcf\x7d\x9f\x3f\x83\xde\xfe\xfb" + "\xff\x10\x80\x17\xd4\xb6\x45\x5b\x14\x5d\xfb\x99\x31\xcc\xd1\xf2\xa2\xa4\xf5\x31" + "\xd7\x3e\xd7\xbf\x83\x5a\xfe\xf3\xbf\x21\x00\x0e\xa8\x24\x49\x92\x2b\x8a\x8a\x9a" + "\x16\xc9\xfb\xe6\x91\xd5\xc3\x1f\xc1\x3d\xff\xff\x3f\x04\xc0\x01\x95\x24\x59\x96" + "\x5d\x51\x09\x5a\x0f\x92\x73\xdf\x37\x8f\x2c\xfe\x08\xf6\xfa\xdf\xff\x21\x00\x0e" + "\xa8\x2c\xcb\xb2\xe8\xba\xda\x12\xb2\x16\x92\xb5\xcf\x7d\x3f\xb2\xf8\x23\x98\xe3" + "\x7f\xff\x0f\x01\x78\x42\x6d\x5b\x96\x45\xd1\x75\xb6\x4a\x5c\x29\x24\x63\xae\x7d" + "\xee\xfb\xc1\x1f\x41\x6f\xff\xfb\xff\x10\x80\x1f\xd4\xb6\x65\x51\x16\x5d\x59\xde" + "\xc8\x62\x4a\x21\x19\x73\xed\x73\xdf\x0f\xfe\x08\x7a\xfb\x9f\xff\x0b\x01\x78\x41" + "\x6d\x5b\xb4\x6d\x51\x96\xc9\xcc\x9c\x81\x5a\x7e\x28\x69\x7d\xcc\xb5\xcf\x7d\xfe" + "\x15\xd4\xf2\x5f\xff\x13\x02\xe0\x80\x4a\x92\x2c\xcb\xae\xa8\xa8\x69\x90\x9c\xfb" + "\xbe\x79\x64\x35\x7f\x02\x7b\xfd\xff\xff\x43\x00\x1c\x50\x59\x96\x65\x59\x76\x95" + "\xa0\x55\x23\x59\xfb\xdc\xf7\xcd\x23\xf9\x13\x98\xe3\xff\xfe\x1f\x02\xf0\x80\xda" + "\xb6\x2c\xcb\xa2\xeb\x6c\x09\x59\x09\xc9\x98\x6b\x9f\xfb\x7e\x24\x7f\x02\xbd\xfd" + "\xdf\xff\x87\x00\x3c\xa1\xb6\x2d\xcb\xa2\xec\xca\x2c\x25\x5c\x21\x24\x63\xae\x7d" + "\xee\xfb\xe6\xfc\x09\xf4\xf6\x7f\xfe\x1f\x04\xe0\x07\xb5\x6d\x5b\xb4\x65\x57\xa6" + "\xf7\x29\x61\x0a\x21\x69\x7d\xcc\xb5\xcf\x7d\x9f\x3f\x81\x5a\xfe\xd7\xff\x81\x00" + "\xbc\xb0\xb6\x2d\xda\xb6\xec\xca\x64\x66\x46\xc9\x96\x90\x25\xad\x8f\xb9\xf6\xb9" + "\xef\xfb\xef\x40\x2d\xff\xed\x7f\x40\x00\x1c\x50\x59\x96\x65\x59\x76\x15\x35\x35" + "\x92\xb5\xcf\x7d\xdf\x3c\xb2\xf8\x03\x98\xe3\xff\xff\x7f\x08\xc0\x03\x6a\xdb\xb2" + "\x2c\xcb\xb2\x93\xa0\x65\x21\x19\x73\xed\x73\xdf\x37\x0f\xfe\x00\x7a\xfb\x7f\xff" + "\x1f\x02\xf0\x84\xda\xb6\x2c\xcb\xa2\x2b\xb3\x40\x26\x21\x19\x73\xed\x73\xdf\x37" + "\x0f\xfe\x00\x7a\xfb\x7f\xfe\x5f\x04\xe0\x09\xb5\x6d\xdb\x16\x65\xd7\x39\x37\x2e" + "\x09\x49\xeb\x63\xae\x7d\xee\xfb\xc1\x1f\x40\x2d\xff\xd7\xff\x8d\x00\xfc\xa0\xb6" + "\x6d\x8b\xb6\xec\xca\xf4\xde\x60\x92\x90\xb4\x3e\xe6\xda\xe7\xbe\x1f\xfc\x01\xd4" + "\xf2\xbf\xfd\xef\x08\xc0\x83\x2b\xcb\xb2\x2c\xcb\xb2\x03\x6b\x28\x4a\xd6\x3e\xf7" + "\x7d\x51\xf3\x48\xfe\xfb\x73\xfc\xff\xff\x3f\x04\xe0\xc1\xb5\x6d\x59\x96\x65\x51" + "\x81\x68\x20\xc9\x98\x6b\x9f\xfb\xbe\x79\xa4\xfe\xf5\xde\xfe\x7f\xff\x7f\x04\xe0" + "\xc9\x95\x65\x59\x96\x45\xd9\xa1\xa0\x0c\xa0\x64\xed\x73\xdf\x17\x35\x8f\xe4\xbf" + "\x3f\xc7\xff\xef\xff\x8f\x00\x3c\xb9\xb6\x6d\xdb\xa2\x2c\x2b\x62\xe4\x02\x49\x5a" + "\x1f\x73\xed\x73\xdf\x37\xd7\x3f\x5f\xcb\xff\xef\xff\x8f\x00\x3c\xb8\xb6\x2d\xcb" + "\xb2\x2c\x2a\x54\x03\x49\xc6\x5c\xfb\xdc\xf7\xcd\x23\xd1\xbf\xdc\xdb\xff\xf7\xff" + "\x87\x00\x3c\xb8\xb6\x6d\xdb\xb2\xe8\x2a\x30\x0d\x2c\x69\x7d\xcc\xb5\xcf\x7d\x3f" + "\x24\xff\xd3\xb5\xfc\xff\xfe\xff\x08\xc0\x93\x6b\xdb\xb2\x2c\x8b\xa2\x22\x91\x0c" + "\x24\x19\x73\xed\x73\xdf\x37\x0f\xd0\xbf\xdc\xdb\xff\xe7\xff\x8b\x00\x3c\xb8\xb6" + "\x6d\xdb\xb2\xe8\x2a\x5c\x03\x4b\x5a\x1f\x73\xed\x73\xdf\x0f\x09\xff\xb3\xb5\xfc" + "\x7f\xff\x7f\x08\xc0\x83\x6b\xdb\xb2\x2c\x8b\xb2\x02\xd1\x40\x92\x31\xd7\x3e\xf7" + "\x7d\xf3\x48\xd0\xbf\xda\xdb\xff\xe7\xff\xab\x00\x3c\xb8\xb6\x2d\xcb\xb2\x28\x2b" + "\x54\x03\x49\xc6\x5c\xfb\xdc\xf7\xcd\x23\x01\xfd\x8b\xbd\xfd\xbf\xff\x3f\x00\x96" + "\xe1\x23\x50"; + + char dst[256]; + ptrdiff_t res = ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == 138); + for (size_t i = 0; i < 138; i += 2) { + ufbxt_assert(dst[i + 0] == 'A'); + ufbxt_assert(dst[i + 1] == 'B'); + } +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fuzz_1) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x30\x04\x00\xfb\xff\x30\x30\x30\x30\x52\x30\x30\x30\x02\x10\x00\x06\x32" + "\x00\x00\x00\x0c\x52\x39\xcc\x45\x72\xc8\x7f\xcd\x9d\x30\x08\x00\xf7\xff\x30\x30" + "\x30\x30\x30\x30\x30\x30\x02\x8b\x01\x38\x8c\x43\x12\x00\x00\x00\x00\x40\xff\x5f" + "\x0b"; + + char dst[4096]; + ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_fuzz_2) +#if UFBXT_IMPL +{ + char src[] = + "\x78\x9c\x00\x04\x00\xfb\xff\x54\x65\x73\x74\x52\x08\x48\x2c\x02\x10\x00\x06\x32" + "\x00\x00\x00\x0c\x52\x39\xcc\x45\x72\xc8\x7f\xcd\x9d\x00\x08\x00\xf7\xff\x74\x61" + "\x20\x44\x61\x74\x61\x20\x02\x8b\x01\x38\x8c\x43\x12\x00\x00\x00\x00\x40\xff\x5f" + "\x0b\x36\x8b\xc0\x12\x80\xf9\xa5\x92\x23\x84\x00\x8e\x36\x10\x41"; + + char dst[4096]; + ufbxt_inflate(dst, sizeof(dst), src, sizeof(src) - 1, opts); +} +#endif + +UFBXT_DEFLATE_TEST(deflate_benchmark) +#if UFBXT_IMPL +{ + if (opts->force_fast) return; + + char src[] = + "\x78\x9c\x4d\x9c\x79\x7c\x56\xc5\xd5\xc7\x6f\xf6\xa0\x40\x40\xa5\x40\x15\x12\xc1" + "\x95\x2a\x22\x6e\x08\x79\x66\xa2\xa0\xe0\x4a\x44\xa2\x68\xb5\xc4\x56\x6d\x4b\x6b" + "\xc5\xb6\x56\x5f\xdf\xb6\xcf\xd3\xba\xd6\x0d\xd4\x52\xf7\x26\xd6\x05\x4d\x5d\xb0" + "\xe2\xce\x9d\x93\x2e\x16\xb5\x8a\x68\xeb\x52\x6d\x25\x6a\x95\xaa\xaf\x06\x44\x21" + "\xfb\x7d\x7f\xbf\x79\xf8\x05\xff\xf0\xe3\xd7\xeb\xef\xcc\x33\x77\x96\x33\x67\x66" + "\xce\xcd\xc8\xa4\xcf\x0d\xe4\xa7\x59\x75\xe2\xdc\xc8\xa4\x2f\x88\xcb\x93\x1a\x9f" + "\x24\x75\xd6\x95\xed\x4a\x36\x71\x92\x74\xb8\xca\xc2\x1e\x76\x51\x56\x9b\x03\x07" + "\x71\x57\xf6\xb2\xeb\xcb\xea\x6d\x42\xf2\x06\x39\x88\xcb\x93\x1b\xa1\x3f\x5c\x1c" + "\xc4\x49\x72\x05\x9e\x4f\xde\x5a\xce\x15\x41\xdc\x99\xed\x88\xe7\x53\xe3\x6f\x81" + "\x83\x78\x64\x72\x1a\xca\x9f\xb5\xb5\x9e\xa7\x85\x2f\x71\x7c\xde\x95\xdd\x3c\xf8" + "\x9c\xac\x72\x92\xe4\xde\xc1\x72\xc8\xfa\xdd\xea\xe4\x03\xa7\xdf\x25\xab\x9e\x9d" + "\xd9\x9f\x9d\xea\x49\xd6\x7b\x6d\xe5\x20\x56\x3b\x14\xcb\x29\xb6\x43\xb1\x9c\x62" + "\xbb\xf1\xb7\xd4\x6e\xe4\x91\x5b\xdb\xb9\x58\xcf\x62\x3b\x93\xbb\xb2\x0f\x63\xfd" + "\x37\x65\xd7\x93\x83\x78\x53\xf6\x3c\xf4\x73\xc0\x7f\x20\x07\x71\x79\xd2\x02\xfd" + "\xb1\xe2\x20\xee\xcb\x0a\xf8\xef\xb9\xd1\x16\x1c\xbe\xc4\xf1\x79\x75\x72\xfc\xe0" + "\x73\xb2\xca\xe9\xca\x46\x0e\x96\x43\xd6\xef\x6e\xe5\x20\x56\x3d\x69\xab\x7a\x92" + "\x1b\x9b\xfe\xe9\x16\x34\x1d\x63\x7f\x6c\x3b\x95\x1c\xc4\x6c\x23\xfc\x7f\xbc\xfb" + "\x14\x72\x10\x9f\xd1\x74\x37\x74\x27\x88\x83\x38\x49\x96\xba\x15\x6d\xf3\xa2\x2d" + "\x38\x7c\x89\xe3\xf3\x91\xc9\xd5\x83\xcf\xc9\x2a\xa7\xa5\xed\x77\x83\xe5\x90\xf5" + "\xbb\x5b\x39\x88\x55\x4f\xda\xaa\x9e\xe4\x99\xc9\x0a\x8c\xd7\xb1\xd6\x97\xfd\xd8" + "\xc0\xa9\xf8\xed\xec\xdb\x28\xe7\x2b\x36\x90\x5f\x4c\x0e\xe2\xbe\xec\x26\xf4\x3b" + "\xf9\x4c\x72\x10\x57\x27\xbf\x45\xfb\xec\x62\xe5\xc9\x6c\x72\x10\xb3\xfe\x95\x85" + "\x09\x6c\x43\x72\x10\x0f\x4b\x96\x41\xbf\x9b\x4d\x4d\x3e\x4f\xc1\x41\xdc\x93\xaf" + "\xf0\xa5\x85\xd1\xa8\xcb\x14\xb2\x89\x4b\x0b\x07\xf8\x9e\xfc\x30\xd4\x79\x55\x0e" + "\x6c\xe2\xae\xec\x28\x5f\x9e\xec\x88\x31\x79\x03\xfa\xe5\x28\x13\x27\x49\x83\xe7" + "\x98\xec\xca\xfe\x49\x36\x71\x5f\xb6\x13\xca\x39\x08\xba\x32\x0f\x36\x71\x92\x3c" + "\xeb\x4a\x0b\x33\xc1\x13\xc9\x41\x5c\x9d\xfc\x1c\xcf\x8f\x01\xef\x47\x0e\xe2\xf5" + "\x59\x45\x1c\x3f\x03\xf9\x11\xe4\x20\x3e\x2b\xd9\x8b\x75\x8a\xbf\x05\x4e\xc5\x13" + "\x92\x69\x68\x87\xe3\x61\xbb\x85\x1c\xc4\xc5\x7e\x3d\x16\x6d\x39\xd4\x83\x83\xb8" + "\x2f\x6b\x47\xfb\x1f\x89\x7a\x57\x92\x83\xb8\x2b\x1b\x82\x7f\x0e\xc5\xd8\x7e\x17" + "\xef\x3b\xc4\xc4\xe5\xc9\xd7\xfc\x40\x7e\x1f\xf0\x53\x64\xdb\xc6\xfb\xa1\x3d\x27" + "\x1a\xe7\x3d\xd8\xc4\x3d\xf9\x71\x68\xb7\x89\xb0\x2f\x21\x9b\xb8\x2f\xdb\x10\xed" + "\x0f\xc9\x1e\xaa\x07\x07\xf1\xb0\xe4\x1a\xb4\xc3\x0c\xbb\xa1\xa4\x6e\x15\x38\x88" + "\x31\x97\xf1\xbe\x87\xc1\xa7\x4d\xcb\x81\x53\xf1\xdb\xd9\xea\x1c\xdb\x24\x49\xda" + "\x1d\x38\x15\x77\x66\x17\xe7\x38\x2e\xba\xb2\x5f\x91\x53\xf1\x84\xe4\xa6\x1c\xfb" + "\x69\x64\xb2\x0b\x39\x15\x9f\x95\x7c\x07\xe5\xef\x8d\x7e\xfa\xae\x81\x53\x31\xfd" + "\x1b\xeb\x96\x24\x67\x92\x83\x78\x6c\x32\x1d\xf5\xdc\x0f\x6d\x35\x8f\x1c\xc4\x6f" + "\x67\x7b\x6e\xf5\x3f\x23\xc9\x41\x4c\x1f\x3a\x90\x3f\xd0\xf8\x3e\xe0\x20\x66\x3f" + "\x96\x27\xde\xd8\xf6\xec\x47\xf1\xdb\xd9\xec\x1c\x74\xec\x6b\x94\x33\x3b\x15\xb3" + "\x9e\x49\x52\x8f\xdf\x3a\x38\xd6\x53\x0c\xdf\x98\x1b\xc8\xd3\x27\xff\x02\x7d\xdb" + "\x91\x8a\x67\x26\x1b\xe2\xf3\x91\x49\x3d\x39\x15\x27\x49\x01\xbf\x3b\x13\x3c\x94" + "\x9c\x8a\xd1\xd6\xf5\xd4\xac\xcf\x76\x27\xaf\x12\xb3\xad\xa9\xd9\x94\xdd\x42\x4e" + "\xc5\x98\x33\x78\x7e\x0c\xea\xbc\x94\x9c\x8a\xd9\x97\xf4\x09\x63\x93\x49\xe4\x55" + "\xe2\xa9\xc9\xaf\x73\x1c\x7b\x49\x32\x82\x9c\x8a\x3b\xb3\xf7\x72\xd4\xb0\x6d\xc0" + "\xa9\x78\x6a\xf2\x8f\x5c\x4f\xfe\x38\xd8\x5e\x44\x4e\xc5\xac\x7f\x57\x76\x82\xde" + "\x25\xdd\xc6\x0d\x18\x0f\x8d\x18\x1b\x17\x92\x53\x31\xdb\xad\x27\x7f\x58\xf4\x3d" + "\x6c\x37\x71\x67\x56\x86\xb1\xd8\xc0\xb1\x84\xdf\x2d\x0b\xe2\xea\x64\x38\xe6\xd1" + "\x74\xbc\xcb\x15\xe4\xf0\x25\x8e\xcf\xcb\x13\x1b\x7c\x4e\x5e\x9f\x9d\xef\x38\xb6" + "\xd9\x77\xe0\xb0\x8d\x9b\x30\x7f\x76\x85\x66\x09\x39\x88\x39\x7e\xfa\xb2\xbd\xd8" + "\xb7\xe4\x20\x4e\xb3\xb9\x39\x96\xc9\x71\x09\x4e\xc5\x6c\x07\x8e\xa5\xd2\xc2\x6c" + "\x72\x2a\xee\xcc\xee\x8c\x7e\xaa\x2b\x3b\x85\x9c\x8a\x2f\x4b\x3a\xd0\x8f\x53\x50" + "\x87\x66\xf2\x2a\xf1\xd0\x92\xf6\x7a\xfe\x56\x5f\x76\x1a\x79\x95\x38\xcd\x96\xe4" + "\x38\xb6\x2b\x0b\x27\x91\x53\x31\xe6\x52\x8e\x63\x3b\x49\xe6\x90\xd3\x6d\xcc\x76" + "\x9e\x62\x1c\x07\xc5\x76\x2e\x72\x9a\xd5\xa0\x9d\x77\x47\xdd\xe6\x92\x53\x71\x92" + "\xb4\xe6\x1a\x9b\x76\xb7\xe2\xfa\xd4\x9a\x8a\x39\x5f\x92\x64\x56\x9c\x4f\x9c\x2f" + "\x62\xce\xc9\x9e\xfc\x11\x78\xa7\x8b\xc9\x41\x5c\x9d\x4c\x46\xfb\x1f\x89\x77\x7c" + "\x98\x1c\xc4\x68\x3b\x57\xac\x4b\x42\x0e\x62\xc6\x1b\x9c\x3b\xc5\xf7\xbb\x31\x88" + "\x47\x26\xff\x72\xf4\xc9\x18\x1b\xe4\x20\x2e\x4f\xb6\x87\xff\x9d\xcc\xb9\x00\xdb" + "\xed\x4d\x5c\x5a\xd8\x19\x7e\x7e\x12\x35\x64\x13\xf7\x65\x63\xa2\x3f\x64\xec\x01" + "\xb6\x6d\x9c\xf8\xe2\xbc\x7c\x96\x6c\xe2\xae\xec\x8f\xb0\xf7\x68\xab\x75\xe4\x20" + "\x4e\x92\x9b\x1c\x7d\x5a\x31\xce\xb9\x29\x88\xd7\x67\x67\xc5\x76\x28\x4f\x5e\x27" + "\x07\x31\xc6\x7c\x8c\x13\xca\x93\xd5\xe4\x20\x1e\x96\xdc\x1e\xdb\xa1\x33\xfb\x3b" + "\x39\x88\xe9\xe7\x59\x66\x92\xac\x25\x07\x31\xd7\x86\x9e\xfc\xa1\x58\x27\x53\x72" + "\xd8\xc6\x35\x9e\x7e\xbc\x2f\x6b\x8d\xf1\x95\xb8\x2f\x1b\x81\x75\x6d\x5f\xce\x41" + "\xb2\x89\x93\xa4\x1c\xcf\xf7\x67\x1c\x46\xb6\x6d\xfc\x06\x74\xd3\xe2\x1a\x0a\x0e" + "\xe2\x91\xc9\x6d\xf0\x87\x0d\x8c\xf1\xc8\x61\x1b\x9f\x16\xc7\x03\x7c\x42\x8c\x33" + "\xc5\x98\xdf\x5b\xe3\xcf\xfb\xc8\x41\x5c\xf4\xab\xb3\x50\xe7\x4b\x5d\xd1\xaf\x16" + "\x19\xef\x17\xd7\xd9\xf5\xd9\x11\xe4\x20\xa6\xbf\xea\xcb\xf6\x81\xe6\x7d\x72\x2a" + "\xe6\x3a\xcb\x77\xec\xc9\x8f\x8a\xeb\xac\x98\x71\x1d\x35\x7d\xd9\x81\xe4\xb0\x8d" + "\xd7\xe2\x77\x77\xe3\x7a\x4f\x0e\x62\xc4\x11\x68\xb7\xd1\xe8\xbb\xca\x18\x5f\x88" + "\xd1\x0f\x9e\xe3\xa9\xb8\x86\x72\xcd\x2f\xf2\x40\xbe\x11\x71\xc0\x86\xc0\x18\x12" + "\x6c\x62\x8c\x47\x8f\xff\x1f\xd6\x64\x57\xe5\x38\x36\xc5\xe5\x49\x15\xd6\xe5\x6e" + "\x32\xe6\x68\x95\x89\xd1\x86\x5b\xdb\x31\x41\xfb\xde\x96\x8a\xdf\xce\x2e\x87\x9f" + "\x7c\x38\xae\x5b\xe0\x54\x4c\x7d\x75\xb2\x06\xbc\x30\xea\xc5\xc5\x38\xad\x04\xf5" + "\xb8\x70\x6b\x9c\x56\x64\x8e\xb7\x61\xc9\x17\x18\x1f\xe7\x91\xc3\x36\xbe\x17\xf1" + "\xeb\x47\xe0\xd3\xc9\x41\xcc\xb1\xc2\x77\x29\x4f\x0e\x20\x07\x31\x63\x59\xf8\x11" + "\xd4\xad\x8e\x1c\xc4\x23\x93\xef\xc7\x38\xb8\x2f\x9b\x4f\x0e\xe2\xb1\xc9\xd1\xf8" + "\xdd\x47\x61\xbb\x1e\x7e\xf2\xe8\x20\x66\x1b\x25\x49\x17\xe6\xf3\x00\x39\x88\x59" + "\x0e\xdf\x9b\xbe\x9a\xe5\x88\x37\x65\xbf\x44\xf9\x3d\x28\x73\x05\x39\x88\xc7\x26" + "\xa7\x3a\xc6\x7f\xf4\xcd\xe0\x20\x86\x2f\x8d\xe3\x78\x42\x32\x86\x1c\xc4\xf4\x3f" + "\x18\x03\xfe\xb2\xa4\x39\xa5\xff\x11\x77\x66\x13\x63\xec\x8e\xb1\x07\xfd\xc4\x20" + "\x66\xac\xc3\x3e\xa8\x4e\xfe\x4a\x0e\x62\xc6\x2d\x9d\xd9\xb7\xb8\x56\x93\x53\xf1" + "\x84\x64\x81\x2b\xb6\xd7\x13\xe4\x20\xee\xc9\xe7\xfc\xd8\x64\x11\xd6\xc0\x95\x18" + "\x0f\x39\x13\x8f\x4c\x8e\xe5\x78\xf2\x8c\x7f\xc1\x41\xcc\xb8\x9a\xfe\xba\xb2\xb0" + "\xc8\x33\xae\xfe\x12\x3b\xc6\x41\xa5\x85\xef\xc5\xe7\x62\x94\x87\x72\x6a\x31\x96" + "\xa7\xc4\xdf\x11\x73\x1c\xf6\x65\xcf\x06\xf9\x4b\x31\xfa\xd2\xf3\xf7\x92\xa4\xda" + "\xb3\x5f\xc5\x49\x32\x0d\xe5\x56\x61\xad\xda\x8b\x6c\x5f\x62\xe8\x96\xa0\x8c\xdd" + "\xe3\x73\x31\xe7\x12\xdb\x2a\x49\xfe\x8b\xf7\x3e\xd0\xc4\xf4\xc3\xa5\x85\x2a\x68" + "\x77\x8a\xf3\x46\x9c\x24\x31\x7e\x65\x8c\x4b\xb6\x2f\xb1\x7f\xab\xcf\x9e\xc6\xbe" + "\x2b\x3e\xff\x12\x7b\x8e\x57\xac\xbb\xf1\xb9\x98\x31\x74\x5f\xd6\xc1\x31\xe3\x18" + "\x57\x89\xd9\x0e\x9b\xb2\x3f\x81\x0f\x8e\xed\x20\x66\x9b\x26\xc9\x18\xee\x13\xc8" + "\x41\x5c\x9e\x5c\x8e\xdf\xdf\xce\x38\x2f\xc1\x41\xdc\x37\x7f\x54\x8e\x9a\x33\x9a" + "\xbe\x70\xe0\x54\xdc\x93\x3f\xca\xd3\x2f\x23\x76\x22\x9b\x98\x75\x65\x7c\x86\xdf" + "\x8b\xfb\x48\x71\x4f\xfe\x04\xcf\x75\x89\xed\x02\x36\x31\xe2\xa6\xd8\x9e\xdc\x1f" + "\x33\x86\x12\x8f\x4c\xee\xe7\x7e\x20\x57\x1c\xff\xf7\x07\x31\xea\xe5\xb9\xef\x1f" + "\x9b\x6c\x17\xeb\x28\x2e\x2d\x6c\xef\x19\x67\x73\x4d\x06\x9b\x78\x53\xf6\xbb\xb8" + "\x3e\xc1\x67\xa2\x7e\xbf\x0b\xe2\x15\x6d\xd7\x62\x1f\xf8\xb3\x50\xdc\x23\x5e\x1b" + "\xc4\x8d\x4d\xd7\xe1\xf9\x17\x81\x6b\x38\x38\x88\xfb\xb2\x3a\xb4\x57\xe2\xb9\x9e" + "\x83\x4d\xbc\x29\xfb\x0c\xf5\xad\xf3\x1c\xef\xe0\x20\xee\xc9\x0f\x41\x7d\x1e\x70" + "\xf4\x49\x60\x13\x17\xd7\x39\xae\x9f\xbb\x62\x6c\xae\x0e\xe2\x15\x6d\x7f\xc5\x3e" + "\x73\x94\x67\x2c\x03\x0e\xe2\xca\xc2\x4f\x62\xdf\x70\xed\x03\x9b\xb8\xdf\xae\x45" + "\xf9\x8f\xd2\x67\x91\x4d\x5c\xd6\x70\x87\xe7\x19\x04\x7f\x07\x6c\xe2\xd2\xc2\x9d" + "\xd0\xbf\x1a\xd7\x19\xb0\x89\x93\xe4\x7a\xbc\xc7\x2a\xb7\xa6\x37\x7b\x0a\x6c\xe2" + "\xf2\xe4\x7b\x1e\x73\xd9\x61\x6e\xa2\xce\xdf\x33\x71\x57\x76\x1e\xca\xff\x05\xe6" + "\x65\x15\xd9\xc4\xe8\x37\xcf\x7e\xe6\x3c\x01\x9b\xb8\xdf\x6e\xf3\xdc\xcf\xad\xcf" + "\x0e\x42\x3d\x6f\x33\x71\x69\xe1\x56\xcf\xf5\x7f\x53\xd6\x46\x36\x71\xbf\x5d\xed" + "\x8b\xeb\xf6\x6a\xb2\x89\xbb\xb2\xff\xf1\xdc\xa7\x56\x27\x8f\x91\x4d\x8c\xf5\xd9" + "\xaf\xc9\x7e\x9f\xe3\xde\x82\x6b\xb5\x18\xf1\x26\xfa\x61\x0c\xf6\x46\x4f\xc4\xd8" + "\x53\x8c\xb8\xde\xf3\xfd\xe8\xcf\x18\xe3\x8b\x2b\x0b\xdf\x40\xbc\xf4\x0d\xf4\xed" + "\x0a\xb2\x89\x11\xf3\x79\xfa\x6e\xbe\x23\xe3\x3f\x31\xf6\x97\xd1\x07\xad\xe9\xcd" + "\xcf\xe0\x5e\x53\xdc\x97\xcd\x89\x6b\xed\xcc\x64\x31\xc6\xeb\x1c\x13\x63\xdf\x86" + "\x76\x38\xcf\x15\x7f\x97\x7b\xb8\x22\x97\x16\x4e\xf6\x8c\xb9\x69\x0f\x36\x71\x65" + "\xe1\x6c\xf4\xcb\x4f\x5d\xf1\xfc\xe0\x6c\x13\x0f\xe4\xe7\xe3\xf9\x3e\xb0\xbd\x8e" + "\x6c\x62\xc4\x8f\x9e\x7b\x00\xc6\x18\x8c\x25\xc5\xf7\xb6\x4d\xf3\x2d\x6d\x3b\xb8" + "\x75\xcb\xdb\x66\x80\x4d\x4c\x5f\xc9\xd8\x05\x73\x8a\x7e\xd3\xc4\x58\xf3\x3c\x63" + "\x4d\xc6\x29\x5c\xff\xc4\xd8\x8f\x7a\xc6\x76\x78\x77\x57\xdc\x9b\x16\x99\xed\x49" + "\xa6\x0f\x67\x7b\x8a\xab\x93\x93\xb6\xea\xb9\xff\x3b\xc9\xc4\xac\x3f\x19\xf3\x27" + "\x61\xfd\xc5\x7d\xd9\x02\xcf\xdf\x47\x4c\x8b\x58\x7e\x81\x89\x7b\xf2\x3f\xc3\x7b" + "\x3d\x82\x3a\xdc\x81\xfa\xfc\xcc\xc4\xa5\x85\x6b\xa0\x7f\x03\xb6\xec\xa3\x6b\x4c" + "\x5c\xd6\x70\x2b\xfa\xf1\xd3\xd8\x56\x60\x13\x0f\xe4\x6f\xc3\x7b\x75\x3a\xb6\x17" + "\xd8\xc4\xa5\x85\x25\x9e\xeb\x00\xf7\x85\x60\x13\x73\xde\xf1\x77\xb8\x77\xe4\xbc" + "\x13\x0f\xe4\x9b\x51\xce\xf2\xb8\x16\x82\x4d\x5c\x59\xf8\xa1\xe7\x78\xe1\x3e\x15" + "\x6c\x62\xf4\x7f\x1c\xcf\x3c\xcf\x00\x9b\x78\x20\x7f\x05\x9e\x3f\x13\xfb\x1a\x6c" + "\xe2\xf2\xe4\xe2\x38\x8f\xe8\xa7\xc1\x26\x1e\xc8\xff\xd8\x17\xf7\x0a\x3f\x20\x9b" + "\xb8\x27\x7f\x16\x7e\x97\xe7\x94\x53\xc8\x26\x46\xcc\x81\xf2\xef\x46\x99\xeb\x73" + "\x8c\x3f\xc4\x88\x8d\x3c\xcf\xf2\x86\x96\x34\xd4\x33\x4e\x12\x97\x16\x2e\x88\xe5" + "\x33\xae\x04\x9b\x38\x49\xae\xf4\xf4\x37\x6b\xb2\xbf\x91\x4d\x9c\xf9\x5f\x7b\xfa" + "\x69\xee\x71\xc0\x26\x1e\xc8\xff\x9a\xeb\x51\x1c\x4b\x60\x13\x2f\x68\xba\x26\xb6" + "\x73\x63\xd3\x1d\x64\x13\xf7\x65\xdf\xf1\xf4\xd1\xa8\x1b\x62\xd8\xef\x98\xb8\xb4" + "\xb0\x0c\xbf\xfb\x9e\xbb\x28\x6b\x59\x05\x36\x71\x92\xb4\x79\x9e\xb9\xf0\xb7\xc0" + "\x26\x1e\xc8\xdf\x83\xfa\x6f\x44\x9f\xbe\x40\x36\x31\xf6\xf0\x78\xfe\x8e\xe3\x7f" + "\x83\x4d\x5c\x9e\xfc\x28\xfa\x4f\xfa\x23\xb0\x89\x7b\xf2\xe7\x78\xc6\xfa\xc5\x7d" + "\xdb\x39\x26\x4e\x92\x5f\x63\x1d\xe7\xb9\x57\x33\xd9\xc4\xf7\xb7\x2d\xf7\x2b\xda" + "\x2a\xe3\x5a\x0e\x36\x31\xc7\x7f\x71\x9f\xb1\x82\x6c\x62\xec\x03\x50\x9f\xe7\x5c" + "\x71\x7e\x32\xf6\x2f\x32\xe3\x90\xea\xe4\x32\xb6\x6d\x5a\x8c\x2f\x8b\xcc\xfd\x57" + "\xb7\x1d\x62\x35\x85\x0b\x51\x9f\x4f\x5c\x49\x47\x03\xda\xe8\x68\x8c\xdb\x8f\x5d" + "\xcf\xc2\xe9\xd8\xa7\x0d\x75\xbd\xbe\xca\x57\xd7\xed\xcb\x3d\x1e\xd9\xc4\xd0\x04" + "\x69\x60\x1b\x64\xcb\x7d\x9c\xca\x2c\x2d\xec\x88\xf1\x50\x1b\xb9\xdf\x4a\x7d\x69" + "\xeb\x04\x1b\x97\x3c\x8c\x39\xfb\x15\xcf\xf3\x1e\xfa\x4d\x9e\x65\x8a\xa1\x31\x69" + "\x60\x6b\xb2\xdd\xae\xf0\x4f\xd7\xb5\x6e\x2a\xfc\xe3\x95\x39\xce\xd1\x7e\x9b\x64" + "\xc5\xb3\x93\x0f\xe2\x7e\x12\xf1\x0a\x39\x88\xa1\x09\xd2\xc0\x36\xc8\xb6\xaa\xe1" + "\x05\x57\xd6\x3c\xcb\xde\xc9\x6f\xef\xaa\x1a\x56\xba\x8a\x0e\x1f\xf7\xee\xe0\xb0" + "\x8d\x5f\x08\xd2\xf4\xe4\x6f\x47\x9b\xcc\x89\x3c\x90\xff\x69\xb4\xe5\xfb\x0e\x6f" + "\xbf\xd6\x95\xb4\x1f\x1a\xcb\x04\x07\x31\x34\x41\x1a\xd8\x06\xd9\x0e\x4b\x8e\x80" + "\xbf\xd8\x3f\xbe\x17\xd7\x34\x9e\x6f\xb0\x9e\x3c\x7b\x12\x43\x13\xa4\xe9\xcc\x0e" + "\xc0\xef\xd6\xc7\x76\xa6\x1f\xef\xb7\xa9\xb1\x1d\x38\xe7\xcb\x93\x3d\x63\x5b\x31" + "\xf6\x11\x33\x66\x96\x06\xb6\x41\xb6\xef\xe4\xff\x37\xae\x43\xec\x97\x24\x69\x8c" + "\x7b\x43\x6a\xc0\x41\x0c\x4d\x90\x46\xfa\xaa\x86\x5f\x0f\xbe\x6f\x69\xe1\x11\xa7" + "\xfa\x6c\x57\xb8\x63\xb0\x7c\xb2\xde\x97\x1a\x95\x43\x5b\xbd\x6f\x4f\xfe\xc5\xc1" + "\x3a\x57\x27\x0f\x0e\xd6\x99\xac\xf7\xa5\x46\xed\xb9\x39\xff\x9a\x53\xff\xd2\x87" + "\xaa\xad\x3a\xb3\x4d\x4e\x6d\x45\x56\xff\x52\xa3\xf6\xa7\xad\xfa\x6b\x83\x3d\x3a" + "\xd8\xbf\x9c\x03\xea\x5f\xb2\xfa\xa5\xa8\x29\x8e\x07\xb2\xc6\x3c\xdf\x45\xe3\x8d" + "\x65\x6a\xfc\x90\x35\xe6\xa9\xd1\x38\xa1\xad\xc6\x36\xdf\x45\x63\x92\xf5\xd4\x98" + "\x24\x6b\x6c\x53\xa3\x39\xc5\x36\xd4\x5c\x60\x9b\x68\x2e\x90\x35\xd7\xa8\xd1\xdc" + "\x64\xdb\x6a\xae\x91\xb9\xfe\x70\x2f\xdf\x97\x5d\x08\x3f\xf9\x36\xea\x7f\x24\xea" + "\x79\x8f\x3b\xea\xd5\x0f\xdc\xdc\x65\xb3\xad\xa4\xfd\x3a\x72\x10\x43\x13\xa4\x81" + "\x6d\x90\xed\x40\x7e\x25\xde\xf7\x68\xdb\x98\x7f\x1c\xfd\xf0\x9c\xcb\x6a\x8f\xb1" + "\x87\x17\xad\x20\x07\x31\x34\x41\x1a\x9e\x3f\xf3\xcc\x9c\xe5\x9c\x3e\xaa\x15\xbf" + "\x35\x37\x6a\xc0\x41\xcc\x18\x59\x1a\xfe\x06\xe3\x75\xfe\x7b\x68\xc3\xc5\xee\x81" + "\x45\x27\xc4\xfa\x80\x83\x18\xff\x2f\x48\xa3\xf2\xc7\x26\x93\x06\xf5\x4f\x4f\x6a" + "\x1c\xd4\x93\x55\x3e\x35\xaa\x7f\x5f\x56\x3d\x58\x9f\xd1\x85\xaf\x0c\xd6\x87\xac" + "\xfa\x53\xa3\xb6\xa2\xad\xde\x97\x1a\xbd\x2f\x59\x6d\x45\x8d\xda\x93\xbf\xab\xf6" + "\x24\xaf\x68\x7b\xcd\xb5\x4d\x3a\xd6\x9e\x6b\xbb\x10\x71\xfd\x8b\x58\x73\x8e\x03" + "\xcf\xe1\xf3\xf0\xa5\xe7\x41\xcf\xcf\x6a\x5a\xe9\xe6\x37\x35\x1a\xe7\x13\x38\x6c" + "\xe3\xdb\x1c\xcf\xc5\x8b\x9a\xdb\x82\x98\xb1\xd7\xa9\xaf\xce\x8b\xe5\x80\x83\x58" + "\xfa\x95\x6d\xcb\x06\xf5\x45\x2e\x96\x3f\xbf\xa9\x75\xb0\x7c\xb2\xea\x46\x8d\xea" + "\x43\x66\x2c\x55\x5a\xa8\xc1\x58\xba\x70\xeb\x19\xe3\x18\xeb\x5a\xf7\x43\xfb\x38" + "\xbb\x2d\xc7\xbb\xa1\xfe\x96\x73\xb9\x17\x49\xca\x93\x9d\x31\x26\x7f\xc2\xe7\xa9" + "\x9e\x17\xcf\x21\x8b\x7a\xc6\xee\x2a\x87\xb1\x64\x75\xdd\x10\xe3\xba\x37\xb4\xe1" + "\x2a\xf0\x28\x3c\xff\xbe\x15\x7d\xc2\xae\x96\xd5\x7e\xcf\x8a\x73\xbf\xc8\xd0\x04" + "\x69\x60\x1b\x64\xfb\x99\xbf\x0f\xef\x58\x89\xdf\x3d\xdb\x86\xb7\xff\xd6\x0d\x2c" + "\x1c\x6b\x65\xcd\x0b\xe0\xa7\x2e\x8a\x67\x4a\x15\xed\xa7\x91\x83\x18\x9a\x20\x0d" + "\x6c\x83\x6c\xbb\xed\xf7\xae\xdb\xb6\x37\xae\x87\x35\x05\xc4\x6d\xcd\x75\x78\xb6" + "\x1f\x34\xf0\x2d\xeb\xe0\x43\xea\x0e\x27\x07\x31\x34\x41\x1a\xd8\x06\xd9\x6e\xb0" + "\xdb\x5d\x77\xcb\x08\xfc\xd6\x50\xf0\xa5\xae\xaa\x79\xa2\x8d\x68\xf8\x28\x30\xae" + "\xaa\x6a\x98\x62\x95\x85\x1d\xe2\xdd\x9c\x18\x9a\x20\x0d\x6c\x83\x6c\x3f\xce\x8e" + "\x85\x1f\xe1\xb9\xf1\x57\xc3\x16\xdf\x0a\xdb\x11\xf8\xcd\x31\xd8\x3f\xbe\xe2\x7a" + "\x6b\x77\xb1\x57\xb2\x3f\xa0\x2d\xaf\xc2\x98\x3c\x04\xf5\xbf\x96\x1c\xc4\xd0\x04" + "\x69\x60\x1b\x64\x8b\x32\x83\xca\xec\x6f\xa9\xf2\x95\xad\xdc\x13\x2e\x4b\x33\x3f" + "\x1e\xeb\xfb\x8e\xf6\xdd\xec\xe2\xfa\x81\x7c\xe2\xfb\x5b\x26\xda\x65\x49\xf3\xd3" + "\x3c\xef\x11\x43\x63\xd2\xc0\xd6\x64\x8b\x35\xdc\xf7\xe4\xfb\x03\xd7\xb5\xae\x75" + "\x87\xfb\xac\x76\x7b\xac\x65\x33\x30\x2f\x26\xc1\xd7\x7d\x95\xf7\x83\x88\xd3\x26" + "\x99\x18\x1a\x93\x86\xeb\xbf\x6c\x4b\x5b\xe7\xf9\xb2\x86\x0a\xfc\xc6\x0d\x8e\xfb" + "\x97\x9e\x85\xe3\x51\xcf\x3f\xe1\xbd\xeb\x7d\x79\xdd\x78\xde\x83\x90\x4d\xcc\x7d" + "\x8d\x34\xb0\x35\xd9\x96\x35\x1c\x01\xdb\xaf\x62\x9c\xfc\x07\xbe\x74\x72\x3c\x5f" + "\xe5\x9e\x34\xf3\x07\xa3\xfc\x7d\xd1\xce\xcf\x93\x4d\x0c\x8d\x49\x03\x5b\x93\x6d" + "\x6f\xed\x18\xbc\xcb\x9e\x28\xb3\x0a\x31\xd7\x26\xfc\xbf\x1c\xef\x29\xd1\x4e\x35" + "\x7e\x60\x61\x0e\xf6\x5f\xa0\xfe\x35\x26\x86\x26\x48\x03\x5b\x93\x6d\xe6\xd7\xc4" + "\xb3\x98\x81\x85\x7b\xfb\x7e\xfb\x1d\xde\x61\x0e\xd7\x5c\x3f\xa2\xe1\x4f\xd1\x17" + "\xf5\x2c\xfc\x0a\x39\x88\xa1\x09\xd2\xc0\x36\xc8\x96\xe7\xc2\x95\xad\x39\xac\x29" + "\x87\xf8\x8f\xb3\x7a\xcc\x97\xe3\xf0\x7c\x77\xff\xb9\x5d\xe2\xfa\xd6\x9d\x80\xe7" + "\xb5\xe4\x20\x86\x26\x48\xc3\x3b\x1e\xd9\xae\xcf\xbe\xc8\x15\xcf\xc9\x47\xc7\x3d" + "\x6b\xb7\x1d\x63\x9f\xdb\xe7\x6e\xe7\xc2\x38\x8c\xd5\x13\xe3\xf9\x2a\x38\x88\xa1" + "\x49\xa5\x81\x6d\x2a\xdb\xf5\xd9\xa8\x1c\xdf\x77\x83\xbd\xbf\x75\xef\xc4\x7d\xe6" + "\x5a\x77\x4e\xf2\x13\xc4\x46\x8d\xe8\x97\xe7\xc9\xa9\x18\xfa\x54\xfa\x4d\xd9\x76" + "\xf0\xab\xc7\xc3\x9f\xff\x13\xeb\xe6\x09\x71\x2f\x3a\x90\xff\x4f\x71\xcf\xd9\x7a" + "\x9c\x71\x6c\x72\x8e\x88\xa1\x09\xd2\xc0\x36\xc8\x96\xe7\x96\x3c\x8b\xee\xcb\xba" + "\xd0\x3f\x77\xc7\x33\xa0\xb2\xe6\xa1\xe8\xe7\xbb\x83\x98\xe7\x99\xd2\x94\xb4\xff" + "\x11\x6d\xee\x78\x2e\xec\xd8\xc7\xbc\x9f\xea\xca\xba\xc9\x41\x0c\x4d\x90\xa6\xa2" + "\xbd\xdc\x77\xb7\x1c\x68\xfd\xf6\x0a\xfa\xba\x16\xe3\x79\x2a\xea\xf0\x02\xd9\xc4" + "\xd0\x98\x34\x03\xf9\x3a\xcf\xb1\x3e\xbc\xfd\xc1\xad\x77\xb8\x7b\x82\xef\xd9\x7a" + "\x87\x5b\x64\x9e\xcf\x4a\x83\xb9\xe5\x8b\x39\x18\x3f\xc7\x7b\xef\x8d\xf9\xb8\x2b" + "\xe6\xe9\x1c\xb2\x89\x39\xff\xb6\x69\x46\xfa\x8a\xf6\xbd\x18\xf7\xa3\x9c\xa1\xd1" + "\xb6\xb8\x07\x1c\x6a\x62\x68\x4c\x9a\x11\x0d\xef\x62\x1c\x4f\xc1\xda\x31\x31\xc7" + "\x79\x52\xd9\xba\xbf\xdd\x50\xd2\xfa\x34\x38\x88\xa1\x09\xd2\xc4\x7c\x8e\x75\xd3" + "\xed\x97\xd9\xbe\x39\xee\x67\x38\x57\x2f\x4b\x3a\x66\xf0\x4e\x4d\xcc\xf6\x94\x66" + "\xc7\xc2\x7e\x78\xff\x06\x7b\x2f\x5b\x83\xfd\xdd\x13\xf1\xee\xf5\xb9\xec\x2f\x3c" + "\x3b\xcf\x55\x35\xcf\xb4\xf3\x93\xbf\xac\xe2\x79\x93\x18\x9a\x54\x1a\xd8\x06\xd9" + "\x6e\xce\x0f\xc7\xd8\x9b\x8d\xf7\x7d\xc2\xbd\x92\x5d\x8f\xba\x1e\x1d\xe3\x01\x70" + "\x2a\x86\x26\x6c\xd3\x7c\x96\xeb\x6e\x99\x85\x79\x7b\xe9\xe0\xd8\x63\x2c\xb0\x29" + "\xbb\x32\xd7\xeb\x67\x5a\xf1\x1c\xec\xca\x54\x0c\x7d\xfa\x65\x3d\xc7\x30\xcf\x25" + "\xb8\xc6\xf3\xee\x92\xef\x01\x0e\xe2\x43\x92\xb7\xa2\xcf\xaa\x6a\xfe\xb6\x71\x9c" + "\x67\xb5\xfb\x59\x6f\xed\x99\x71\x8d\xe3\x5d\x76\xe6\x17\xf1\x79\xaa\xe7\xd0\xa7" + "\xd2\xef\x5c\xd8\x17\xfe\x7f\x1f\xf4\xdf\xe9\xf1\xdd\xd8\xce\x3c\xc3\x00\xa7\x62" + "\x68\x82\x34\x3c\xff\x62\x9e\x0f\xcf\x6f\x46\x25\x65\x8e\x77\x5b\xcc\x3f\x00\x07" + "\x31\xef\x62\xa4\xd9\x98\x1f\x0d\xff\x35\x1d\xe3\xed\xa3\x30\x2e\x79\x19\xed\x80" + "\x18\xbe\x6e\x24\x9e\x1f\x52\xf4\x6b\xcd\xfb\x90\x83\x18\x9a\x74\x9b\x66\x74\x90" + "\x6d\x8c\xb7\xeb\xa6\xc7\xbb\xb4\x18\x6f\x0f\xf2\x8a\x5c\xdf\xba\x1c\x7e\x2b\x84" + "\xe2\x3e\xdc\x83\xef\x09\xc5\xf5\xdd\x63\x5c\xfd\x39\xac\xc9\xbe\x86\x76\xf6\xd0" + "\x7f\x44\x4e\xc5\xc5\x9c\x8f\xa2\x9e\xf7\x1d\x2a\xa7\x33\xfb\x16\xc6\x68\x3d\xfc" + "\xe4\xde\xb1\x0d\x79\x6f\xc8\x35\x09\xcf\xd3\x2f\x3f\xe7\xfd\x3b\xd7\x84\x67\xb2" + "\xd3\x73\xfd\x2d\x33\x8c\xf5\x06\xa7\x62\xf8\xe8\xf8\xbb\xf4\x73\x13\x92\xae\x1c" + "\xfd\x35\xcf\xfa\xdf\xcc\x3a\x72\x9c\xef\x3b\x16\xf2\x58\x1f\xdb\xe2\xd8\xeb\xf5" + "\x4b\xc8\xa9\x18\x9a\x54\x1a\xd8\xa6\xb2\x45\x99\xa9\xca\xc4\x9e\x3c\xc7\x98\x99" + "\xbe\x93\x77\x0a\xb4\x1d\x9b\x7c\x15\xed\xbc\x11\xfd\x78\x14\xde\x71\x3a\x39\x15" + "\xf3\xae\x41\x1a\xd8\xa6\xb2\x9d\x91\x7c\x33\xd7\x5b\xdb\x10\xfb\xb0\x33\x7b\xaf" + "\x9e\x9a\x4f\xf2\x23\x60\x7b\x1d\xfc\xed\x6c\xc6\x96\xe4\x54\x0c\xcd\x2a\x69\x60" + "\x9b\xca\x96\x2d\x52\xd2\x7e\x18\x34\x7b\x45\x66\x9d\x87\x25\x07\x85\x34\x5b\x52" + "\xcf\x3a\xf0\x6e\x84\xe7\x53\xe2\x62\x1f\xcd\xc4\x1c\x69\x0d\xaf\x65\x87\xe6\x78" + "\xa7\xcd\x7b\x5a\x70\x2a\x2e\x6a\x8e\xc1\x9c\xfa\x4d\x18\x95\xdc\x89\x76\x26\x5f" + "\x16\xfb\x94\x77\xc8\x5b\xfc\x15\xb1\x4f\xc5\xd0\xa4\xd2\x14\x6d\x19\x7b\x4f\x0b" + "\x93\x92\xca\x98\x1b\x50\x5a\x38\x20\xe6\x33\x0c\xe4\x8f\xb5\xda\xc2\x4e\x31\x9f" + "\x41\x0c\x4d\x2a\xcd\xe4\xe4\x9a\x1c\xcf\x2e\xc7\x25\xbb\xe2\xf9\x5f\xa3\x9e\xeb" + "\x0c\x38\x15\x43\x93\x4a\xf3\x66\xd6\x1e\xcb\xff\x24\xdf\x80\xf8\xe0\x23\xc4\x0d" + "\xc7\x63\x2e\x9c\x41\x4e\xc5\xd0\xa4\xd2\x4c\x4e\x1e\x40\x9b\x37\x22\x26\xff\x09" + "\x39\x15\x23\x76\xc9\xf5\xdb\x3c\x8c\x9d\x53\xc9\xa9\xb8\xe8\x37\x1a\xb7\xe6\x3f" + "\x24\x49\xbf\xb9\x78\xa7\xf7\x4a\xf6\x0a\xca\x99\xc5\xb3\xcb\x00\x4e\xc5\xf4\x51" + "\x65\xcd\xcc\x0f\x59\x14\x3e\xcc\x8f\x75\x1c\xab\xcc\x6d\x00\x07\x31\x7d\x94\x34" + "\x5c\xe3\x38\xd7\x98\xa7\x36\x2e\xd9\xdf\x95\xd7\x4d\x8d\xf7\x01\xe0\x20\xe6\x5a" + "\x26\x0d\xe3\xde\x9e\x85\x53\x63\x9e\x03\xe3\x5e\x71\x4d\xe1\x0a\xf8\xf0\x11\x58" + "\x6b\x56\xa1\x2f\xbe\x85\x32\x27\x30\x37\x81\x1c\xc4\xd0\x04\x69\x36\xe7\x7f\x80" + "\x35\xa3\x86\x71\x20\xef\xf8\xb0\x56\x4d\xc4\xbc\xbf\x20\xde\xf7\x89\xa1\x09\xd2" + "\x0c\x4b\x9a\x10\x43\xee\x88\xe7\x27\x93\x83\xf8\x8f\xd9\x63\x39\xd6\xad\xaa\xd9" + "\xc7\xb9\x49\x66\x7e\xe1\xf9\xc9\x2c\xcc\x8b\x43\x8c\xe3\x12\x9c\x8a\xa1\x4f\xa5" + "\x1f\x9b\x3c\x8f\xb1\x74\x30\xe2\x99\x79\xd1\xd7\x93\x2b\x3a\x66\x93\x53\x31\x34" + "\xa9\x34\x9c\xef\x3c\x37\xef\xb7\x6f\x30\xa6\xcc\x55\xd7\xed\x0f\xbf\xba\x20\xc6" + "\x97\x62\xfa\x01\x69\x58\x1f\xc6\xcf\x3d\xf9\x33\xd0\x67\xab\xeb\x7b\x16\x4e\x36" + "\x9e\x23\x82\x57\x89\x8b\xfd\xbb\x97\x15\xef\x52\x1b\x50\xfe\xde\xd8\x83\x9c\x6a" + "\xb7\x66\xaf\xd7\x77\xb7\xec\x06\x7f\xb2\x80\xbc\x4a\xcc\xbc\x0b\x69\xe2\xd9\x31" + "\xf6\xd4\x1c\x43\xcc\xb1\x39\x79\xd9\xee\x88\x43\x4e\x24\xa7\xdb\x78\x65\x2a\xcd" + "\xdb\xd9\xf2\x58\xe7\xcc\x33\x4f\xf4\x89\xdc\xc9\x8f\xf2\x77\x8f\x22\xa7\x62\x68" + "\x52\x69\x8a\xe7\xce\xcc\x21\x99\x65\xf7\x67\x07\xc0\x0f\x33\x3e\x3e\x92\x9c\x8a" + "\x8b\xf3\x7d\x77\xac\xe5\x8d\x36\x23\xf9\x65\x6e\xde\xa3\xbb\x5b\xdf\xba\xe3\xc8" + "\xa9\xf8\xbd\x6c\x3c\xf6\xfb\xb3\x30\x37\xbf\x11\xef\x33\xb8\xde\x21\xb6\x77\xa3" + "\x0b\x07\x63\x1f\x74\x04\xdf\x89\x1c\xc4\xd0\x04\x69\x60\x1b\x64\xfb\x49\xbe\x6e" + "\x6b\xde\xda\x2d\xe0\x29\xf1\xec\xbe\xaa\xe1\x12\x72\xd8\xc6\x75\x41\x1a\x8e\x55" + "\x3e\xef\xf5\xab\x5d\x67\x36\x13\x71\xc2\x91\xf1\x6e\x09\x1c\xc4\x1c\xc3\xd2\xbc" + "\x93\xff\x9e\xe3\x18\xe1\x99\xed\xa8\xe4\xc4\x18\x67\xf3\xdc\x1e\x1c\xc4\xd0\x04" + "\x69\x3e\xb7\x55\xa8\xff\xa1\xbc\x3b\xce\x95\xb4\xdf\x8c\x58\xf7\x30\xe3\xfc\x06" + "\x07\x31\x34\x41\x9a\x9a\x42\x17\x62\xe0\xfd\x8d\x31\x08\xcf\x4f\xab\xeb\x0e\x45" + "\x3b\xfd\x8e\x1c\xc4\xd0\x04\x69\x4a\x5b\xbf\x82\xd8\xfe\x6b\xf0\xb1\x33\xe3\x19" + "\xcb\xc0\xc2\xfd\x19\xd3\xc6\xb3\x14\x31\x34\x26\x4d\x7f\xcb\xce\xbe\xd7\x7f\x2d" + "\xde\xf7\x54\xb6\x8e\x8a\x7b\x0a\x9e\x89\x81\x4d\x0c\x8d\x49\xc3\xbc\x0e\xee\x0b" + "\xf1\x5b\xf1\x6c\xb3\xaa\x79\x3f\xb4\xe1\x5d\x64\x13\x33\xdf\x43\x9a\xea\xe4\xed" + "\x98\xaf\xfb\xb9\xfd\x03\xb1\x68\x9f\x63\x7e\xe0\x67\xfe\x8f\xe4\x20\x86\x26\x48" + "\x53\x5a\xf8\x3d\x7c\x51\x03\xd6\xcd\xf7\x63\x4c\xdb\xb3\xf0\x70\xc4\xd5\xaf\xc6" + "\xd8\x55\x0c\x4d\x90\x86\xfb\xd0\x8a\x8e\x99\x28\xe7\x1d\x37\xb4\xe1\xd6\x38\x4e" + "\x4a\x0b\x6f\x91\x83\x98\xfb\x50\x69\x7a\xf2\xe7\xc3\x5f\x1d\x19\xcf\xa0\xc0\x41" + "\x9c\xf9\x6b\xe3\x39\xd2\x90\xf6\x97\x30\xae\xce\x8e\xe7\x84\x23\x1a\x9e\x62\x4e" + "\x60\xcc\xc3\x60\x3e\x0e\x38\x88\xa1\x09\xd2\xc0\x36\xc8\xb6\x27\xff\x40\x1c\x0f" + "\x3c\xc7\x67\x0e\x6a\x31\x3f\x67\x0d\x39\x88\xa1\x09\xd2\xf0\x5e\x85\xef\xb2\xc5" + "\x3f\xcb\x7b\x78\x57\xcc\x33\x7c\x21\xe6\x3e\x88\xa1\x09\xd2\x74\xb7\x54\x7b\xfa" + "\xd8\x8d\xf9\x87\xb6\x9e\xb3\x1f\x82\xfa\x3c\x49\x0e\x62\x68\x4c\x1a\xf6\x57\x79" + "\xdd\x64\xf4\xe3\xd2\x78\x57\xce\xbc\x14\xd6\x8b\x77\xe5\x62\xf6\x97\x34\x65\x0d" + "\xc3\x10\xe7\x4f\xc6\xdc\x61\x7e\x32\xef\xc4\xf7\xd9\x7a\x37\xc6\x3b\xf1\x22\x43" + "\x63\xd2\x70\x2f\x51\xd9\x7a\x10\xe6\xeb\xa7\x39\x9e\xa5\x27\xc9\x94\x78\x8e\xc2" + "\x33\x70\x31\x73\x3a\xa4\xe1\xfd\x0c\xd7\x11\xee\xcf\xaa\x93\xd7\x62\xfd\xd3\xec" + "\x25\x72\x10\x43\x13\xa4\xf9\x38\xfb\x29\xc6\xdf\x4c\x63\x9c\xc2\xba\x32\xbe\x62" + "\xbe\x3a\xdb\x53\x0c\x4d\x90\xe6\x9d\xfc\x31\x8e\xf1\xc6\x87\xf9\xbd\x1d\xef\x54" + "\x8b\x79\x7a\x63\xc8\x41\x0c\x4d\xd8\xa6\x99\x19\xfd\xcc\x90\xf6\x1b\x63\xee\x7a" + "\x31\xdf\xe9\xde\x98\x53\x24\xe6\xdc\x97\xa6\x78\xa7\xcb\x5c\xc7\xb3\x62\x2e\x19" + "\xcb\xe4\x5d\x02\x73\xc9\xc4\x8c\x69\xa5\x61\xde\x45\xb1\x1f\x8f\x75\xc5\xdc\x87" + "\x22\x17\xfd\xe4\x3e\x18\x7b\xff\x76\xc5\xfb\x00\xe6\xbd\x0f\xb8\xd7\x9a\x0e\xc3" + "\x9a\x3e\xde\x4e\x5e\xf6\x3e\x39\x15\x43\x93\x4a\x33\x32\xa9\x8f\xfb\x2e\xcc\x61" + "\xcf\xd8\xb8\xaa\xa1\x0e\xf3\x73\x47\x72\x10\x33\xc7\x51\x9a\x9a\xc2\xbd\xf0\x39" + "\x7b\x63\x7e\x1e\xe0\x11\xf7\x38\x96\xc9\x3d\x19\x63\x20\x31\x34\x41\x9a\x61\x49" + "\xbf\xe3\xf9\x43\x75\xdd\x28\xcf\xf9\xd9\xdd\x32\x86\xf7\x10\xe4\x20\x86\x26\x48" + "\xd3\xdf\xb2\x1f\xfa\x9d\x73\x7e\x13\xe6\xd0\x4e\xbe\xa4\xa3\x1c\xeb\x66\x89\x07" + "\x9b\x18\x1a\x93\x06\x31\x8e\xaf\x6a\x28\xc7\x78\xe3\x78\xae\xf7\x25\xed\x1b\xc3" + "\x06\xfb\x37\xd9\xc4\x8c\x83\xa4\x49\x92\x39\x1e\xcf\x10\x53\x4c\x8a\xf7\xa1\x3c" + "\x3b\x18\xc8\xff\x3a\x9e\xd3\x8b\x99\x6b\x38\xa8\xa9\x1b\x8f\xba\x6e\x8c\x79\xa9" + "\x15\xed\x07\x62\x9f\xfc\x14\x73\x73\x72\x60\x13\xf3\xac\x45\x9a\x81\xfc\xbf\xd0" + "\x86\x09\xde\x6b\x3d\xf6\x3d\x55\x1e\xfb\xdd\xc0\xfd\x3d\xd8\xc4\xd0\x04\x69\x7c" + "\xf2\x2b\xec\xe3\xda\xe0\x73\x47\xc6\xb5\x8c\xf9\xad\xdd\x56\xc6\x3b\xae\x1c\xe3" + "\x95\xa1\x0d\x1f\x07\xe6\x03\x0f\x6d\xb8\x13\xff\xde\x44\x0e\x62\x68\x52\x69\x50" + "\x4e\xaa\x72\x18\x3f\xb3\x6e\x5c\x57\x8a\xfb\x88\x07\x43\xd1\xff\x56\xbb\xed\x0a" + "\x4f\x42\xb3\x3b\x39\x88\x19\x63\x4b\x5f\x9e\x2c\xcf\x6d\xcc\xaf\xc7\x9e\x73\xf1" + "\x56\xdb\x35\x81\xf1\xc3\x40\x7e\x17\xcc\xd5\x17\x03\xf3\x3c\xc1\x41\x0c\x7d\x2a" + "\x3d\xef\x48\xca\x1a\xfa\x31\xbe\x7f\x6c\xc5\xfd\x63\x19\xc6\xe4\xff\xf0\x79\xd0" + "\xf3\xe2\xbc\xfb\x14\x63\x65\x51\x3c\x9b\xde\x94\xbd\x89\x71\xf0\x1d\x72\x10\x17" + "\xe7\x63\x51\x93\xf9\x7b\x10\x9b\x7d\x1c\x4a\x5b\xb9\xbf\xfd\x0d\xea\xff\x32\x34" + "\xf3\x63\x5c\x2e\x86\x26\x48\xc3\xef\x2e\x98\x27\xc6\x7b\x02\xe6\x5f\x94\x27\x2f" + "\x61\x6c\x4d\x20\x07\x31\x34\x41\x9a\x81\xfc\x69\x18\xc3\x7f\xc2\x1c\x9e\x11\x73" + "\xf5\xca\x1a\xd2\x50\x5a\xa8\x22\x07\x31\x34\x41\x9a\xf7\xf3\xf3\x1c\xdb\x99\x67" + "\xdb\xcc\xc5\xfc\xcc\xbf\x8c\xf8\xf2\x03\x72\x10\x43\x13\xa4\xe1\xd9\x63\x49\x7b" + "\x37\xda\x67\x2d\x39\x88\x11\x73\x3b\x8e\x7b\xc4\x09\xf8\xe7\x22\xbc\xe3\x7b\xb1" + "\x8c\xd2\xc2\xb7\x50\xe7\x32\xf8\xf3\x1f\x91\x83\x18\x9a\x20\x0d\xe3\x75\xd9\x32" + "\x66\xe0\xb7\x2b\x43\x1b\x7e\x4f\x0e\xe2\x4f\xf2\x8b\x31\xef\x2a\xe3\x1e\xf7\xf1" + "\x49\xdf\x75\xc7\x8d\xea\x63\x1e\x27\x39\x88\xa1\x09\xd2\x2c\x68\x6a\x71\xb3\x9b" + "\x7a\xe3\xf8\x02\x07\x31\xfb\x11\xfb\x5d\x3f\x33\x59\x9c\xd6\x16\x0e\x64\x9e\xbc" + "\x67\xdc\xf7\xd4\xa2\xdf\xba\x93\x97\x8d\xf3\xdc\xcb\xc2\xf7\xc4\x7b\x97\x9a\xc2" + "\x5e\x98\x3f\xfb\x04\x31\x34\x41\x1a\xd8\x06\xd9\x16\xf7\xb0\x5d\x98\xdf\x57\x87" + "\x2d\xfe\x26\x94\xf9\x77\xf8\xa4\x33\x50\xa7\x51\xf1\x8c\x9e\xe7\xc4\xe0\x20\x86" + "\x26\x48\x43\x4b\xe6\xd3\xb3\x2f\x19\x4f\x30\xae\xd9\x60\x0f\x84\x3d\x92\x75\xcc" + "\x21\x44\xcc\xfe\x1a\x39\x15\x43\x13\xa4\xa1\x2d\xf3\xab\xfa\xb2\xff\x62\x5f\x70" + "\x40\x5c\xb3\x87\x25\x2f\x92\x83\xf8\xbb\x4d\xdf\x73\x8f\x7c\x74\x43\x60\x5e\x21" + "\x38\x88\x4b\xda\xf9\x2d\xc6\x05\x5b\xf7\x0a\x7b\x7a\xae\x13\x4b\x06\x46\xaf\xea" + "\x6f\x99\xed\xd7\x67\x8f\x32\x97\x11\x7b\xc4\xd9\x26\x86\xc6\xa4\x81\xad\xc9\xb6" + "\x18\x6f\x1f\xeb\x99\xe7\xc0\xbe\xc6\x9e\x08\xbe\xad\x0f\x3e\x63\x15\xcf\xbd\x63" + "\x1e\x09\x38\x88\x39\x06\xa4\xa1\x2d\xef\x99\x4b\xda\xcf\x41\xfb\x7e\xc7\x71\x8f" + "\x8e\x98\x3f\xe6\xe6\x60\x7c\xa7\x65\xcd\xcd\x31\xcf\x65\x52\x72\x0f\xda\x78\x71" + "\x3c\x1b\x14\x43\x13\xa4\x81\x6d\x90\x2d\xcb\xe4\xf7\x2a\x99\xff\x41\x2c\xe7\xbd" + "\xec\xe7\x68\x97\x33\x62\xf9\x68\x27\x47\x0d\xf5\x62\x96\x23\xcd\xd6\xbd\x83\x67" + "\xae\xda\x90\xf6\xd7\xb1\x3f\xaa\xf1\x15\xed\xbb\x91\x83\x98\xf9\x76\x88\x89\x30" + "\x56\x79\x6e\x7c\x18\xd6\x15\x83\x4f\x7e\x06\xb1\xe7\xfe\xf0\x8d\xb7\xc4\x72\x19" + "\xef\x8b\xa1\x31\x69\x98\xc7\xbd\xcd\x76\x57\xb4\xd9\x9c\xc0\x35\x01\x6b\x29\xea" + "\x31\x1b\xf3\x68\x03\xe6\xee\xc1\x3e\xae\x67\x75\xe3\x50\xde\xc1\x26\xe6\x7a\x2b" + "\x0d\xef\x46\x64\xcb\xef\x5e\xb8\x87\xef\x5a\x37\xdd\x97\x35\xcf\xf1\xbc\xd3\xee" + "\x5a\xb7\x43\xcc\x15\x64\xee\x30\xbf\x35\x61\xae\xa0\x18\x1a\x93\x86\xf9\xf5\xb2" + "\x65\x39\x15\xed\xcc\x55\x61\x8e\xe1\x6c\xf4\xcf\x25\x88\x15\x6a\x10\xff\x1e\xe2" + "\xcb\x1a\x9e\x41\x5c\xb2\x13\xd9\xc4\xc5\x73\xd9\xa2\x86\xe5\xc8\xb6\xa2\x7d\x16" + "\xd6\xaf\xbf\xc4\xd8\xad\xb2\xc0\x73\xf8\x7e\xf8\xb8\x9b\xe3\x19\x69\x75\x5d\x89" + "\xaf\x2c\x94\xfa\x98\xb7\xba\x95\xf9\x4d\x9b\x34\xb0\x35\xd9\x96\xd7\x55\xa2\xae" + "\xbb\x78\xe6\x5f\x75\xdb\xf6\x28\x77\x2d\x62\x9d\x19\x9e\xf7\x2d\x62\x68\x4c\x1a" + "\xe6\x28\x72\x3d\xe8\x5a\x37\x2f\xe6\x28\x7e\x89\xfd\x3b\xf9\xed\xe1\x6b\x7c\x7c" + "\x2e\xde\xe2\xdf\x40\xec\x7b\x37\x73\x51\x51\xaf\x61\x7e\x68\x03\xef\x8c\x2b\xc9" + "\x26\x86\x26\x48\xc3\x3c\xe3\xd2\x42\x2f\xef\x8d\x62\x4e\xb1\x98\x63\x66\x63\xfe" + "\x25\xe6\x64\x7b\xf8\x35\xf8\x8d\xcd\xf0\xb3\xa3\xc8\x41\x1c\xef\x56\xb1\xbf\x66" + "\x7c\x0a\x0e\xe2\x5f\xb6\xbd\x9c\xeb\xad\xdd\xc9\xee\x5b\x54\x4a\x4e\xc5\xc5\xf3" + "\x96\xd1\x76\x7f\xdb\x16\xde\x3d\xfa\x4f\xf2\x8d\x58\x1b\xee\x8b\xf7\x90\xe2\x24" + "\x99\xef\x1f\xcd\x4a\xd2\xf8\xad\x50\xdd\x3c\x7f\x43\x36\x24\xad\x6a\xf8\x17\xd9" + "\xc4\xd0\x98\x34\xc5\x9c\x9c\x2f\x98\xc7\x1c\x63\x0c\x8c\xf3\x78\xa7\xcd\x58\x42" + "\x5c\xcc\xd5\x29\x6a\x98\x0f\xca\xb5\x6d\x8b\x5f\x11\xef\x5a\xc5\x2b\xdb\x6e\x77" + "\xf3\x5e\x2d\x0f\x8c\xeb\x4b\xda\x9f\x74\x9c\x57\xef\x65\x3f\x80\x8f\x7e\xcb\xfd" + "\x3c\xd9\x21\xc7\xfd\x1f\x38\x88\xa1\x09\xd2\xc0\x36\xc8\x36\x49\x76\xf3\xdc\xff" + "\xd3\xbf\x54\x16\x86\xa3\x73\x3e\x4c\x3f\xce\xfe\x95\xb2\x4d\x3f\xc9\x37\x30\xbf" + "\x2b\xde\xd1\x6d\xe3\xe1\x26\x0d\x6c\x6d\x9b\xed\x9b\x8e\x77\x27\x1f\xe6\x87\x40" + "\xf3\x66\x10\xf3\x9e\xf7\xf8\x57\xdf\x0f\x3c\x73\xbd\x63\xd1\x6d\xee\x0f\x93\x6e" + "\x01\x9f\x43\x0e\x62\xde\xff\x4a\xd3\x6d\x07\xf8\xed\x0a\xef\xb8\xb1\xc9\x76\xd8" + "\x03\xee\x80\xbe\xff\xaf\xbb\x2a\x7b\xba\x9e\x63\x83\x79\xae\x88\xbf\x1d\xc7\x86" + "\x18\x1a\x93\x06\xb6\x26\xdb\xc7\x16\xbd\xee\x4e\x7d\xf5\xab\x9e\x67\xf2\xe0\x20" + "\x66\xdc\xc5\x39\xf2\x4c\x76\x7b\xca\xb6\xce\x7c\x70\x88\xe7\xc9\x41\xcc\xb8\x4b" + "\x9a\xdb\x16\xbd\xe8\x4e\x7a\xb5\xcc\xf3\x4e\x15\x1c\xc4\x25\xed\x17\xc7\xdc\xb9" + "\x92\xf6\x77\x10\x9b\xff\xd8\xd3\xd7\x31\x46\x2b\x6b\xf8\xae\x47\x1b\x23\xae\xfa" + "\x33\xfc\xda\x85\xf0\x59\x97\xc3\xdf\x3c\x43\x36\x31\x34\x26\x0d\x63\x17\xd9\xa2" + "\x4c\x1b\x2c\x73\xca\x52\xcc\xb1\x3f\x3b\xde\x6d\x0d\x2c\xbc\xc6\x2b\xdf\xa1\xb4" + "\x70\xb3\xe7\x5d\x78\x4f\xfe\x7d\xb2\x89\xa1\x19\xcc\x89\x80\xad\xc9\x36\x7b\xe8" + "\x2e\xd4\xed\xdf\x6e\x78\xfb\x1a\x57\xb6\xe2\x76\xb4\xe7\x5a\xc6\x6a\x6e\xa0\xf3" + "\x2e\x94\xff\x77\xb7\x31\x7f\x23\xd9\xc4\xd0\x98\x34\xb0\x35\xd9\xf6\xb7\x2c\xf7" + "\x9b\xf3\x6f\xc7\xbd\x45\x49\x63\x4b\xb4\xdd\x94\x4d\xc7\x5c\xb8\x1d\xfe\xe8\x25" + "\xc7\x3d\x3e\xd8\xc4\xd0\x98\x34\xb0\x35\xd9\x96\xd7\x31\x37\xec\x59\x37\x3f\xb9" + "\x7a\x55\x92\x2c\x85\x6f\x7d\x8a\x39\x7e\xf5\xe5\x75\x97\xa0\x7f\x6f\x73\x6b\xb2" + "\xef\xa1\xfd\x2f\x31\x31\x34\xb6\x4d\xc3\x5c\xb2\xa2\x2d\x73\xc6\x36\xe7\x7f\xee" + "\x46\x25\xef\xa5\x5c\x63\x98\xeb\x4c\x7d\x45\xc7\x5c\xf8\x6d\x7e\x7f\xbc\x9a\x6c" + "\x62\x68\x4c\x1a\xe6\x98\x6d\xb3\xbd\x04\xf5\x5f\x1e\xf3\xfa\xaa\xeb\xce\xe7\x7d" + "\x95\xfb\x38\xb9\x62\x55\xdf\xba\xd3\x3d\xf7\x69\x9d\xd9\xc4\x14\x6c\x62\x68\x4c" + "\x1a\xd8\x9a\x6c\xcb\x56\xdc\x08\x7f\xfb\x0f\x7e\x3f\x9a\x2b\xe9\xb8\xd6\x73\x9f" + "\xcd\xf3\x7b\xb0\x89\xa1\x31\x69\x06\x6a\x7e\x8b\xf8\xff\x9f\x6e\x73\xfe\x32\x97" + "\xbd\x74\xab\xe7\x7d\x18\xcf\x7e\xc0\x26\x86\xc6\xa4\x49\x96\x2e\xc3\x78\x7f\xc9" + "\xf1\x1e\x29\x7b\xe8\x16\xcf\xbb\x25\xe6\xed\x81\x4d\x0c\x8d\x49\x53\xb6\xe2\xe2" + "\xf8\x5e\x5b\x7c\xbb\x2b\x5b\x7b\x35\xc6\xcf\xdf\xdc\x90\xf6\xc7\xc9\x36\xc8\x2b" + "\x2e\x36\x69\xfa\x5b\xce\xf5\xbc\x9f\xa9\x68\xbf\xd7\x55\x74\xfc\x6f\xcc\x1b\x64" + "\x1e\x21\xd8\xc4\xcc\x27\x90\x86\x7b\xa2\xb3\x92\x7b\xeb\xd7\xf4\x66\x33\x78\xd7" + "\xb6\x5d\x61\x64\xbc\x2f\x7a\x64\xbb\x43\xfc\xd4\xa6\x0d\xb9\x7b\xe7\xff\x6a\x15" + "\xd8\xc4\xdc\xe7\x49\xc3\x3d\x94\x6c\xbb\xd6\x4d\xf5\x8c\x99\xe8\x53\x10\x3b\xfa" + "\xd1\x85\x3d\x5c\xf1\xac\xf1\x08\x13\x33\xaf\x47\x9a\xbe\x75\x47\xf9\xd7\xb2\xff" + "\xc9\x31\xf7\x03\x6c\xe2\xd2\xd6\x53\x99\x5b\x8e\xb6\x7a\xcc\xf5\xfa\x93\x31\x96" + "\x8e\xc5\x3b\xa2\x7d\xfc\x37\x7d\x6d\xe1\x4c\xcc\x91\xbb\xc9\x26\x86\xc6\xa4\x81" + "\xad\xc9\xb6\xb4\xf5\x24\xd4\xe7\x47\xcc\x13\x5e\x55\xd5\x3c\xdb\xf3\x7c\x8e\xe3" + "\x8d\x77\x5f\x62\x68\x4c\x9a\xee\x96\xc6\x98\xb3\xfa\xe0\xf0\xc2\xf4\x6e\x9b\xed" + "\x19\x1f\xcf\x4c\x36\xd4\xdf\xdf\x36\xc3\xff\xb1\x6d\xba\xbb\xf2\xf7\xcf\xcf\x00" + "\x9b\x98\x77\x0e\xd2\xc0\xd6\x64\xcb\x6f\x72\xab\x1a\xae\x76\xdc\x27\x55\x16\x0e" + "\x8f\x75\xe0\xfd\x40\xe6\xe7\xc5\xe7\x8c\x35\xc1\x26\xe6\x59\xb0\x34\xbc\xa3\x92" + "\x2d\xf7\x9e\x23\x1a\xae\x74\xa3\x0b\x95\xf0\x39\x8d\x31\xaf\xb8\xb2\x30\x9d\xf9" + "\x53\x18\x03\x33\xdd\xfb\xf9\xd2\xad\xf9\x62\x45\xe6\xf9\xa9\x34\xdc\xab\xca\x96" + "\xb9\xd0\xdc\x4b\xf4\xfa\xcb\xe3\x1a\x57\x5b\x98\x8f\x35\xa6\x80\x18\xe0\xeb\xe8" + "\xeb\x5f\x81\x17\x90\x4d\xcc\x35\x4e\x1a\xe6\x4e\xcb\xb6\x2b\xfb\x2e\xc6\xd5\x35" + "\x68\xdb\x6b\xc9\x26\xae\x68\x6f\xf4\xfc\xfe\x90\xef\xc0\x33\x56\xf1\xdd\x47\xd7" + "\xfb\xfb\xdb\xaa\xdc\x19\x4d\xb9\x1c\xd8\xc4\xdd\xf6\xa3\x38\x26\x87\xb7\xff\x06" + "\x71\xec\x99\x9e\xe7\x1c\xd4\x57\x27\x3f\x88\x67\x07\xfc\x26\x06\x6c\x62\x68\x4c" + "\x1a\xd8\x9a\x6c\xcb\xeb\x4e\x8a\xb6\x9b\xf3\x93\xf1\x7c\x61\xcc\xef\xe5\x3d\x2f" + "\xd8\xc4\xd0\x98\x34\xa5\x85\xd9\x31\x57\x99\x77\x7d\xcc\x03\xff\xcc\xdf\xe1\x78" + "\x4f\xc8\x7b\x92\x6d\x3c\xdb\xa4\x29\x69\x3f\x21\xea\x5f\xcb\x6e\xe6\x7d\x4e\xd4" + "\xef\x91\x58\xbc\xdb\x11\x43\x63\xd2\x64\xb5\x27\x47\x7d\x5f\x72\x17\xd6\xb8\x53" + "\xe0\xdb\xef\x88\xfd\x0b\x36\x31\x34\x26\x4d\x55\xf3\x89\x9e\x39\x65\x6f\x67\xb3" + "\x31\x26\x4f\xf6\x1c\xbf\xae\xa2\x61\x06\xd8\xb6\xf1\x89\x26\x4d\x49\xc7\x99\x71" + "\x0d\xa2\xbf\xaa\x2c\x9c\x1a\xd7\x29\xee\x1d\xc0\x26\x86\xc6\xa4\x29\x1d\x71\xa9" + "\xcf\xfc\x5f\xb9\x17\xc5\x3a\x52\xf0\xc3\xdb\x03\x73\xf3\xc9\x26\x86\xc6\xa4\x29" + "\x5b\xb1\x0c\xe5\xaf\x47\x7b\xdf\xef\x4e\xfd\xe2\x1a\xac\x2f\x1d\xee\xd8\xa6\x36" + "\xb2\x89\xa1\x31\x69\xb8\x06\xf5\xfa\xce\x78\xc6\x59\x32\xe5\x16\xcf\x38\xba\xb4" + "\x70\x03\xd9\xc4\x5c\x83\x06\x35\xed\x37\xa2\x4d\x3e\xc4\xdc\x7f\x2e\xd7\xbf\xdf" + "\xad\x51\xcf\x3b\x5e\xb0\x89\xa1\x31\x69\xfa\xce\xbd\x14\x73\xff\x2f\x58\x2f\x6a" + "\xea\x4b\x5b\xaf\x8d\xf9\xc9\xf0\xf9\x39\xb0\x89\xa1\x31\x69\xb0\x7f\x8a\xdf\x68" + "\x74\x96\x2d\x85\x1f\xbb\xc0\xc4\x55\xcd\x5f\xc7\xf8\xbc\xc7\xf1\xfb\xbe\x9e\x85" + "\xdf\xf4\xf4\x19\xfc\xce\xa4\xa4\xfd\xbb\x9e\xdf\x28\x20\xe6\x21\x9b\x18\x1a\x93" + "\x06\xb6\x26\xdb\x81\xfc\xf7\x3d\xcf\x5b\xf9\xf7\x10\x98\x4f\xde\x6f\x7f\x00\x3f" + "\x8c\xfa\x5c\xe4\x99\xa3\xc7\xb3\x3e\xb0\x89\x99\x67\x2e\x0d\x6c\x4d\xb6\xbd\xb5" + "\x3f\xc5\xbb\x3f\x11\xf3\x35\x10\xef\xc7\xd8\x9e\x77\xd1\xa5\xad\x97\x60\x3e\xf2" + "\xdc\xf7\x44\xb2\x89\xa1\x31\x69\x60\x6b\xb2\x2d\xaf\xbb\xcc\x17\xff\x2e\xc5\x2f" + "\x5c\xb2\xf8\x6a\xcf\xdc\x4a\x9e\x91\x32\x97\x9e\x67\xcc\x3c\x33\x60\x2e\xbd\x18" + "\x1a\x93\x06\xb6\x26\xdb\xa6\x51\x57\x78\xc6\x05\x8d\x4d\x37\x63\x2d\xf8\x29\xc6" + "\xf9\x93\x8e\xb9\x30\x60\x13\x43\x63\xd2\xf4\x65\xdf\xf7\x9f\xdb\xfd\xd8\x5b\xce" + "\x25\x9b\xb8\xb2\xf5\x74\xcf\xfc\x82\x71\xc9\x48\xb2\x89\xcb\xeb\x16\xc5\xb9\xf3" + "\x5c\xb2\x16\xeb\xfe\x22\x13\x0f\x74\xfe\x12\xfa\xbf\x3a\x9e\x6f\x81\x6d\x90\x6b" + "\x96\xc6\xdc\x72\xfa\x11\xb0\x89\x4b\x37\x2c\xf3\x3c\x53\x2f\x4f\xbe\x4d\x36\xf1" + "\xfc\x83\xae\xc3\x38\x5c\xe7\x8e\x5c\x76\x33\xd9\xc4\x7d\xd9\x25\xe8\xa3\xe7\x1d" + "\xbf\x3f\xa6\x2f\xe5\xdd\x0b\x62\xf1\xb4\xb4\x75\x11\xc6\xf9\xea\xf8\x9d\x25\xd8" + "\xc4\xc5\x5c\xda\xa2\x06\xb6\x26\xdb\x92\x8e\xdf\x61\x2e\x6c\x88\x39\x11\xfd\x2d" + "\xcb\xfc\x06\xeb\x77\xdc\xe3\x81\x4d\x0c\x8d\x49\x93\xd5\xfe\x1e\xed\xf9\xa9\xfb" + "\xcc\xdf\xec\xda\x26\xb5\xf9\x15\xcf\x97\x78\xb6\x39\xd8\xc4\xd0\x98\x34\x03\x0b" + "\x6f\x8f\x39\xf0\x03\xf9\xff\x73\xf7\x1d\xbd\xdc\x2f\xff\x88\xfb\x95\x27\xc8\x26" + "\x86\xc6\xa4\x61\x7c\xd5\x6d\x7f\x8b\xdf\xa3\xf1\x7b\x9f\xcc\xf3\x5b\x31\x9e\xe1" + "\x5f\x6f\x62\xc6\x5d\xd2\x70\xdd\x1c\xc8\xdf\xe5\xf8\x9e\xdd\x2d\x8b\xb1\xa6\xbc" + "\xe2\xf8\x37\x43\xc0\x26\xe6\x7a\x2a\x4d\xf6\xd0\x25\x9e\x39\x4a\xd8\x7f\x61\x5d" + "\x6e\xc2\x5a\xf3\xe7\x18\x87\x83\x4d\x0c\x8d\x49\xb3\xfc\xa3\x56\xff\xf0\x95\x55" + "\xf1\x3b\x22\xb0\x89\xf9\xed\x18\x63\xd7\x21\xed\x4b\x62\x2e\xaa\xb8\xac\xe1\xd0" + "\x98\xab\x3f\x35\xf9\xc7\x2a\xb0\x89\xab\x57\x74\xb8\xfe\xb9\x87\xdb\xce\xad\xbb" + "\x39\x70\x10\x6f\x57\xe8\x8e\x7f\xd3\xe0\x8d\xfc\xbf\x73\xe0\x20\xae\x6a\xa8\xc6" + "\x3c\xda\xc9\xf8\xfd\x29\xd8\xc4\xcc\x67\x2e\x69\x1f\x67\x6b\x7a\xf3\x4f\x33\x6f" + "\x59\x3c\x7c\xc4\x4a\x57\x71\xc5\xc1\xf1\x9e\x0b\x1c\xc4\xc9\xe2\x95\x78\x9f\x23" + "\xed\x53\x5f\x8a\x39\xb2\x32\x88\x87\x35\x5e\xe9\xaa\x2e\x3c\x3a\xd6\x01\x1c\x06" + "\xb9\xe3\x74\x97\x55\xd5\xc7\x3a\x80\x83\xf8\xbd\x8c\x67\x9b\xbb\xc7\x3a\x80\x83" + "\x98\xf9\x0f\xcc\x59\xe2\x59\x26\xf3\x1c\xc4\xb5\x85\xdd\x10\xaf\xd7\xdb\x98\x86" + "\xc8\x41\xfc\xa9\xff\x61\x5c\xbf\x4b\x3a\x22\x07\xb1\xea\xc3\x98\x4d\xf5\x89\xbc" + "\xb5\x3e\xf4\x17\xaa\x0f\x59\xf5\xa9\x29\xbc\xe1\x54\x1f\xb2\xda\x87\x67\xfb\x6a" + "\x1f\xb2\xda\x87\xb9\xba\x6a\x1f\xb2\xda\x67\xfb\xe6\xa7\x06\xdb\x87\xac\xfe\x62" + "\x1d\xd4\x5f\x64\xf5\x17\xeb\xa0\xfe\x22\xab\xbf\x58\x07\xf5\x17\xb9\x3c\xd9\xd9" + "\xf3\x4e\xa8\x98\xb3\xbc\xb3\x89\xb3\xda\xed\x7d\xf7\x7e\xfb\xc4\x36\x61\x9e\xa3" + "\x98\xf7\x50\x15\x8d\x0d\xb1\x4d\x78\x0f\x25\x7e\x7c\xd2\x87\xee\xee\x45\xb3\xad" + "\xfd\xa3\xc8\x41\xbc\xe0\xfd\x37\xdd\x49\xfb\x1e\x65\xf7\x1d\x7d\x27\x39\x88\x9b" + "\xcf\x5f\xe9\xe6\x3f\x70\x9c\x9d\x79\xfe\x23\xe4\x20\x3e\xe2\xd5\x25\x8e\xf9\x0c" + "\xd4\x80\x83\xb8\xb7\xb6\xe0\x4e\x3b\xff\x84\x58\x26\x38\x88\xa5\xbf\xaa\x6d\xbf" + "\x41\x3d\x79\xce\x41\x2b\xdd\x5d\x57\xce\xb3\xed\x5a\x2f\x24\x07\xb1\x7e\x77\x8b" + "\x1f\x31\xf8\xbb\x64\xd5\x93\xb6\xaa\x27\x99\x67\x17\x8c\xb3\xbf\x68\xf9\x77\xe4" + "\xda\xd9\x73\xed\xb5\xf3\x56\x6e\xbd\xd3\xd9\x96\xf3\xc3\xd8\xe5\x73\xbb\xad\x98" + "\x5b\xb2\xf4\xe8\x98\x2b\x12\xef\xf7\x37\x30\x4f\x60\x66\x31\xaf\x18\xfb\xe1\x3b" + "\x9f\xef\x70\xc5\xf3\xd5\xa1\xf6\xb3\x21\x23\xe3\xd9\xc8\xd0\x86\x5e\xc4\x02\x5f" + "\xf7\xc5\x3c\x99\x23\x7c\x77\x4b\x79\xe4\xca\xd6\x23\x3c\xe3\x1c\x32\xf7\xb3\x65" + "\xcd\x2b\xc3\x8e\xcd\xdf\x71\x95\x6f\xec\xc8\xbf\x1d\x43\x0e\xe2\xcd\x2f\x61\xbd" + "\x5f\x3b\x22\x7e\x13\x0e\x0e\xe2\x61\x1d\x77\xbb\x92\x31\x35\x56\x32\x65\x92\x81" + "\x83\x98\xeb\x61\x45\x63\x35\xfc\xce\x02\x72\x18\xe4\x97\x6e\x71\xc9\xbd\x95\xc6" + "\x7d\x1e\x38\x88\x99\x4f\xd6\x7f\xf9\x50\xcb\x5e\x3a\x9f\x1c\xc4\xb1\xce\x1d\x23" + "\x6c\x60\xe1\xff\x58\x69\xeb\x9b\xae\xe7\xf1\xed\x6d\x6d\xbe\x13\xbe\xfd\xcd\x20" + "\xee\x1b\x5d\xe7\xab\x2e\xac\xb4\xbe\x81\xe3\x56\x81\x4d\x5c\x31\xe6\x68\xf8\xea" + "\xcd\xa1\xb6\xf5\x6b\x0e\x6c\xe2\xae\xd1\x27\xf8\xbe\xd5\x3b\x60\xdc\x3e\x47\x36" + "\x71\xef\x05\xfb\xfb\x8a\x8e\x5a\xdb\xf4\xd0\x17\x64\x13\xf7\xb7\xf4\xa2\xce\x93" + "\xad\x6f\xf9\x68\x0f\x0e\xe2\xed\x46\xdc\xed\xaa\xaa\xa7\x5b\x32\xed\x60\x72\x10" + "\x8f\x6f\x9f\xea\x4a\xae\xf0\xfc\xde\x80\x1c\xc4\xfb\x36\xdc\x9a\xeb\x3a\xd7\x59" + "\xe9\x86\xcc\x81\x53\x31\xef\x99\x2a\xdf\x60\xce\xde\x5a\x72\x10\x1f\x92\xf4\xe6" + "\x78\xa7\xcc\x7c\x6d\x70\x2a\x1e\xdf\x71\x8a\xeb\x5b\xee\xed\xfd\xfc\xf5\x39\x70" + "\x10\x57\x8e\x08\xae\xa4\xe3\x40\x6b\x4e\xde\xa9\x07\x07\x71\xdf\xb9\x25\xbe\xeb" + "\x90\x7d\xec\x45\x7f\x0b\x62\xaa\x12\x13\x97\x4c\x19\xef\xcb\x97\xee\x61\x7d\xeb" + "\x0e\x43\x5c\x37\xde\xc4\xd5\xcf\x4e\xf4\xa5\x1b\xf6\xb4\xb2\x15\x37\x93\x4d\x5c" + "\x3a\x62\xb4\x4f\xa6\x4d\xc6\x7c\x6c\x27\x9b\xb8\x6c\x6d\x07\xe6\xf6\x0c\xdb\xdc" + "\xf9\x2e\x39\x0c\x72\xf3\x4f\x63\x7e\x45\x69\xeb\x67\xe4\x20\x8e\xc3\x73\xe9\x0c" + "\x2b\x1d\xe1\xed\xec\xb3\x3f\xc8\x85\x2f\x0e\xb5\x53\x9f\xa8\x27\xa7\xe2\xcf\x7c" + "\x77\xae\xfa\xd9\x03\x8c\xeb\x12\x38\x15\x6f\x57\xb8\x0e\x31\xc4\x14\xeb\x5d\x7f" + "\x06\x39\x15\xb3\xc8\x9e\x97\x26\x5b\xf5\x8a\x62\xfe\x21\xcf\x46\xcb\x93\x3d\xe3" + "\x1c\x59\xd0\xe4\xed\xae\xb6\x21\xe1\xef\xf6\x97\xdc\xd6\x7b\x5b\x72\x2a\x7e\xd7" + "\xf7\xe7\x7a\xf6\x6c\xb0\x1d\x5a\xcf\x26\xa7\xe2\xaa\xd3\x1e\xcf\xad\x3a\xdf\xd9" + "\x9e\x97\xde\x4c\x4e\xc5\x95\xad\xcf\xb9\xaa\x0d\x93\xd0\xe6\x53\x53\x70\x10\x97" + "\x6e\x18\xed\xab\x36\x8c\xb7\xb6\x7c\x63\x0e\x6c\x83\xdc\x7a\xb0\xef\x3b\x77\xac" + "\x55\x16\x8e\x46\xec\x77\xb0\x89\x2b\x3a\x66\xf8\xd2\x27\x76\xb7\xca\x11\x8f\x91" + "\x4d\xcc\x6f\xd7\x7b\xab\x0e\xb2\xae\x75\x6f\x92\x4d\xdc\xd3\xf9\xa1\xeb\xae\x39" + "\x02\x73\x61\x88\x07\x07\x71\x65\xe1\x77\xe8\x8f\xb9\x36\xf0\xf8\x78\x72\x10\x63" + "\xff\xe2\xba\xe6\x9e\x68\xfd\x2d\xa3\xc9\x41\x0c\xbf\x9c\x1b\x98\x3d\x0f\x63\xf2" + "\x7d\xec\xa3\xde\x48\xc5\xb9\x57\x47\xba\x53\x5f\x3d\xd2\x3a\xa7\x3d\x93\x82\x83" + "\xb8\xac\xa1\x09\xe3\x7c\xaa\xf1\x9e\x11\x1c\xc4\xf4\x77\x15\xf7\xee\x8b\xf9\x33" + "\x99\xbe\x2f\x88\x7b\x3a\x7f\x81\xf1\xbc\x27\xc6\x59\x23\x39\x88\x99\x0b\xd1\xd3" + "\xb9\x2b\xc6\xcd\xd9\xe4\x20\xae\x6a\xde\x11\x7b\x89\x5d\xad\x7a\xe9\x39\xe4\x20" + "\x2e\x9e\xeb\x4e\xb4\xbe\x25\xc5\xbb\xc8\xeb\x27\xe6\xec\xc9\x69\x93\xa2\xbf\xa2" + "\xcf\x1b\x5d\x38\x09\x6b\xec\xbd\x2e\x59\xc0\xbb\xf5\x2e\x72\x10\x6f\xa9\x1d\xeb" + "\xfa\x96\x34\x60\x1d\xaa\x26\x07\x31\xfb\xba\xac\x7a\xa6\x75\xd6\x7e\x9d\x9c\x8a" + "\x47\x34\x7c\x94\xab\xda\x30\xdd\xaa\xaa\x27\xf1\x1b\x83\x54\xec\x1a\x1e\x8f\x7f" + "\x13\xe9\x8b\x9a\x8f\x02\x38\x15\xb3\x0e\xcc\x87\xe4\xdf\x9e\x50\xae\x2c\xef\xfc" + "\x0e\x2b\xdc\x9f\xe3\xfd\x71\xf9\xe2\xab\xc8\xa9\xb8\xa6\xd0\x95\xab\xb8\xe2\x68" + "\x8c\x93\x6f\x92\x53\xf1\xce\x85\x17\x73\x5d\x87\xcc\xb1\xcd\x0b\x47\x93\x53\xf1" + "\x5e\x85\x09\xf1\xf9\x0e\xed\xc3\xc8\xa9\x38\xde\x7f\xad\x9e\x67\xcf\x4c\x9b\x1b" + "\x26\x5d\x3b\x33\xf7\x93\x5d\xe6\xda\xd4\x6b\x77\x25\xa7\xe2\xae\xf3\x56\xc6\xe7" + "\x4b\x76\xd9\x9b\x9c\x8a\x3f\xc9\xb7\xe7\x92\x67\x4f\xc0\x7a\xd4\x4c\x4e\xc5\x5d" + "\xd7\x2c\xc9\xad\xdd\x78\x9c\xcd\x6e\xba\x98\x9c\x8a\x8b\xf7\xbf\xc7\x5b\x59\xf3" + "\xd5\x81\x73\xb9\x7c\x71\x8d\x55\xb6\xde\x41\x0e\xe2\xed\x5a\xf7\x72\x5d\xcb\x0f" + "\x44\x9b\x2f\x26\x07\x71\x4d\x61\x5a\xcc\xe5\xe3\xf9\x32\x38\x88\xbf\xda\xf1\xcd" + "\xb8\x8e\x74\xad\xbb\x88\x1c\xc4\x31\xb7\x70\xee\x64\xac\x6b\x0b\xb1\xc7\x9a\x1d" + "\x73\x89\xcb\x9f\x3d\x8d\x9c\x8a\x3f\xcc\x3f\x99\xeb\x5b\x7e\x00\xc6\xea\x09\xe4" + "\x54\xfc\xba\xfd\x3e\x57\x76\xe1\x21\x56\xb5\xd7\x61\xe4\x54\x1c\x73\xc3\x56\x60" + "\xfd\x5c\x3c\xc7\x0e\x2d\xfc\x36\xd7\x78\xd0\x24\xeb\xbe\xfc\x08\x72\x2a\xbe\xe1" + "\xbc\xfb\x73\x1b\xee\xde\xcb\x1e\x9c\x34\x97\x9c\x8a\x6f\xcc\x1a\x73\xc7\x7f\xb2" + "\x9b\x65\x0f\x9d\x44\x4e\xc5\xf1\xce\x6b\xc9\x6e\x56\xd2\x78\x8a\xfd\xc7\xa6\x60" + "\x5d\x39\xd2\x36\xd5\x7e\xd3\x81\x83\x98\x3e\x34\x5b\x3f\x2b\xfe\x6d\x43\x70\x10" + "\x73\xcf\x5a\x55\x7d\xb8\x6d\xac\x79\x8b\x1c\xc4\xd8\x57\xb8\xfe\x2d\xb3\xb6\x7e" + "\x57\x7f\x65\x10\x33\xdf\xa8\xf4\x8d\x06\xac\xfb\x2f\x90\x83\x18\x6b\xa3\x2f\xbb" + "\x09\xed\xd9\xf2\x48\x5c\x33\xc5\x15\xf7\x8e\xf2\xbd\x27\x4f\x46\x1d\xae\x27\x9b" + "\xb8\xf7\x82\x91\xbe\x62\xcc\x64\xdb\xb1\x79\x0e\xd9\xc4\x43\xeb\x3e\x8f\xf9\x36" + "\x7d\xd9\x1b\x39\x70\x10\xd7\x6c\x58\x85\x98\xaf\xde\xf6\x6c\x5f\x4a\x0e\xe2\xea" + "\xba\xf3\x5d\xcf\x8d\xb3\x6c\x97\x86\x75\xe4\x20\xde\xa1\xf5\x60\x37\xf0\xf8\x91" + "\x36\x74\xe9\x4d\x0e\x1c\xc4\x25\x1d\x0b\x5c\xbf\x1d\x89\xf1\x6c\xe4\x20\x1e\x97" + "\x9c\xe7\x98\xdf\xc7\x73\x3c\x70\x10\xf3\x5b\x1e\xe6\x32\xf1\x7c\x9b\xdf\xe0\x88" + "\xb9\xdf\x60\x0e\xfc\xb8\xa4\x24\x7e\xb7\x28\x66\xfe\x0f\x73\x29\x67\x24\x7f\x8a" + "\x79\x3e\xe2\x91\xc9\xff\x39\xde\x31\xa0\xab\xb0\xb7\xff\xbf\x20\xe6\xdf\x79\x28" + "\xfe\xed\x9d\x26\xb2\x89\x99\x9b\x54\xd5\xb0\x4f\xfc\x7b\x16\xcc\x4d\xda\xc6\xe5" + "\x31\x07\x89\x7f\xdf\x02\x6c\x62\x7e\xbb\x58\xd2\x9e\x33\xde\x11\xf0\x8e\x59\xcc" + "\x9c\x27\xe6\x89\xf1\xbb\x48\x70\x10\x33\x16\xe2\xdf\x1a\xda\x9c\x2f\xe6\x6b\x89" + "\xb9\xff\xaf\x6a\xe0\xbb\xec\x4f\x0e\xe2\xbe\x6c\x4e\x7c\xce\x73\x70\xde\x5b\x8a" + "\x7f\x7d\x45\xe2\xce\xf9\x60\x17\x9b\xf7\xf3\x1e\x72\x10\xb7\xb4\xcd\x73\xbc\xe3" + "\x59\xd0\x34\xd1\x83\x83\x78\xdc\xea\xe5\xae\x76\x76\xad\x9d\xd6\x34\x89\x1c\xc4" + "\xa7\x2d\xf9\xc8\x9d\x9b\x0e\xb7\x71\x0f\x0e\x23\x07\x71\x59\xf5\xd7\xfc\xf6\xcd" + "\x3d\xa1\xa4\xf1\x13\x07\x36\x71\xf5\xb3\xb3\x3d\xf3\x1a\x4a\x1a\x9f\x21\x9b\x18" + "\xeb\x8f\x1f\xd6\xf8\x54\xd8\xb5\xe1\xe0\xb8\x2e\x89\xcb\x6e\x1a\xef\xbb\xce\xfd" + "\x6b\x58\xf1\x9e\x3d\x09\x36\xf1\x19\x4d\xaf\xba\xf3\xca\x3e\x08\x7b\xbc\xf3\x6e" + "\x0a\x0e\xe2\x98\x37\x5b\x7b\x79\xe8\xdf\xaf\x18\xa3\x32\xb7\xbe\xd7\xff\x28\x72" + "\xcf\xc2\xf1\x7e\x68\x43\x31\xd6\xad\x2d\x94\x87\x8d\xf9\x75\x5b\xf3\xbd\x3f\xc4" + "\x78\xfa\x61\x9c\x8f\x35\x85\x27\xb0\x2e\x1d\x15\x79\x78\xfb\x3d\x88\x35\x77\xb2" + "\x62\xde\x02\xe6\x52\xcb\x26\xf8\xfe\x46\x3f\xb1\xfd\xc3\x74\x63\xfe\xdb\x58\x13" + "\x1a\x4d\x7c\xd3\xd8\x93\xfc\xa1\x7b\x1f\x9b\xbb\x7a\xa7\x5b\xc8\x26\x7e\x6c\xf6" + "\x4c\x7f\xf6\xd9\xaf\xb9\xd1\xaf\x2f\x25\x9b\xf8\x33\xff\xb2\xeb\x3d\x79\x12\xda" + "\xe8\xdd\x98\xf7\x21\xbe\x67\xf6\x01\xfe\xfc\xf1\xcb\xd2\x27\xc6\x57\xa4\x60\x13" + "\x9f\xf4\xc4\xb8\xf8\xf7\x1f\x9e\x3f\xa1\x83\x6c\xe2\xde\x93\xf7\x40\xbc\xf8\xa2" + "\x3b\x2b\xb9\x77\x06\xd8\xc4\x2b\xda\xee\x71\xf3\x0f\xda\xdb\x3f\x93\xdd\x9e\x03" + "\x07\xf1\x87\x0b\x7f\xe8\x36\xcc\x7d\x39\x8c\xa8\xfb\x73\x00\x07\xf1\x06\xdb\xdd" + "\xf1\xef\xba\xf1\x1e\x0f\x1c\xc4\x59\xed\x12\xd7\xb3\x70\x4d\xcc\x7b\x03\x07\x31" + "\xff\x9e\x52\xd9\xda\xb5\xf1\x9b\x40\xfe\x4d\x1a\x71\x7a\xde\xf5\xee\xac\xa6\x7f" + "\x85\x9f\xec\xf2\x2d\x72\x10\x97\xb4\x8f\x74\x9f\x9f\x6b\xf0\x47\x0d\xe4\x20\xce" + "\x6a\xab\xdc\xe6\xce\x3f\xc0\x1f\x0d\x25\x07\xf1\x0e\xad\x7b\xb8\x4d\xb5\xef\x86" + "\xca\x27\xbe\x4f\x0e\xe2\x83\x7e\x7e\x9e\x3b\x7e\xd6\x4b\xe1\x9f\x2f\x5c\x17\xc0" + "\x41\x7c\xed\x47\x3f\x76\x0b\x1f\xfd\x0c\x75\x3b\x8d\x1c\xc4\x7f\xb9\xf1\x17\xee" + "\xda\x9f\x24\x36\x6e\xf5\x7e\xe4\x20\x7e\xf0\xe9\x53\xdc\x8a\xeb\x6b\x43\x7e\xa7" + "\x94\x1c\xc4\x9f\xaf\xbb\xca\x0d\x5d\x5a\x70\x95\x23\x7e\x43\x0e\xe2\xdb\x27\xb5" + "\xb8\x53\x46\x0d\xf1\xbd\xbe\x8a\x1c\xc4\xfd\xfb\xbd\x0e\xff\xb6\x16\x9a\xe3\x3d" + "\x38\x88\xe9\x73\xff\x66\x8f\xe5\x7a\x2f\x38\x2b\xe6\x39\x88\xbb\xe6\xbe\x0e\x7f" + "\x72\x62\xa8\xe8\x3a\x9e\x1c\xc4\xc9\xd2\xb7\x60\xf7\x5a\xe0\xb7\x6e\xe0\x20\xee" + "\x9f\xeb\xf8\xf7\x4f\xe0\x4f\x5f\xc6\x1e\xda\x99\xb8\xef\xdc\x5d\x3d\xf3\xbb\x2a" + "\x5b\xbb\xc9\x26\x2e\x5f\x3a\x81\x7f\xa7\x22\xed\xde\xb2\x2f\xe2\xf1\x09\x26\x2e" + "\x19\x33\xdb\x73\x9d\xab\x9c\x32\x84\x6c\xe2\x9e\xc7\x39\x1f\x87\x63\xce\x8d\x22" + "\x9b\x98\x39\x09\xe5\x75\x93\x5d\xd5\x4d\xb9\x98\x63\x20\xee\x59\x38\xc1\x17\xff" + "\x26\xcd\x1e\x64\x13\x5f\xb4\xcb\xe1\x9e\x7f\x87\xe3\x0f\x93\x2a\xc9\x26\xee\xfe" + "\xf6\x57\x7d\xf5\x7f\x87\xfb\x2f\x5a\x1e\x70\x60\x13\x9f\xf6\xdc\x66\x77\xfc\xab" + "\x15\xfe\xa2\xac\xa5\x1e\x1c\xc4\xff\x9e\x78\xa2\x9f\x9b\x9b\xc7\xb3\x50\x07\x36" + "\x71\xad\xbd\xe4\x06\x6e\x9b\x10\xff\xd6\x20\x38\x88\x79\xb6\xf0\x95\xf6\xf9\xee" + "\x53\x3f\x95\x1c\xc4\x7d\xeb\xce\x8a\x79\x14\xfc\x0e\x0e\x6c\xe2\x92\x31\xc7\xf8" + "\xf1\x1d\x87\x3a\x7e\x8f\x02\x36\x71\xd9\x4d\x97\xa0\xbd\xda\xdc\x8e\x85\x16\xb2" + "\x89\x4b\x5b\x5b\x31\x2f\xdf\x74\x3b\x35\x5c\x87\xd8\xbb\xd5\xc4\xe5\xe5\xf7\xf9" + "\x0d\xeb\xfe\xe5\x7a\x1f\xba\xd5\x81\x4d\x5c\xd2\x75\x2b\xc7\x81\xdb\x98\xef\x24" + "\x9b\xb8\x6f\xf4\x25\x7e\x73\x67\x9b\x1b\x3e\xe5\x63\xb2\x89\xcb\x7e\x7a\xb1\xdf" + "\xfc\xd2\xad\xcc\x45\x23\x9b\xb8\xbc\xfc\x46\xff\xf9\xb9\xab\xe1\xeb\xff\x41\x36" + "\x71\xf6\x50\x2b\xf3\x00\x51\xe6\x12\xb2\x89\xcb\x56\xde\x8c\x76\x65\xee\xf0\xa3" + "\x39\xb0\x89\xcb\xff\x7b\xb1\xdf\xf2\xd0\x6d\xee\x98\x64\x60\x15\xd8\xc4\x55\x1b" + "\x4e\xc2\xde\x7d\x1f\xf7\x81\xbf\x04\xf1\xe9\x49\x26\xce\x2e\xf8\xbe\x7f\x3f\xff" + "\xc3\x78\x2f\x06\x36\x71\x32\xed\x87\x18\x0f\xbf\x71\xd5\x75\xb7\x93\x4d\x5c\x3a" + "\xe2\x5b\xfe\x3f\xb6\xd8\xf1\x5b\x33\xb0\x89\x4b\xfe\x75\x09\xfc\xf6\x63\xee\xc9" + "\xbe\xcb\x67\x80\x4d\x5c\x3a\xf4\x46\xcf\xbf\x17\xf8\x91\xff\x5b\x0e\x6c\x83\x3c" + "\xe2\x76\xff\xf9\xba\xf7\xdc\xe8\xd6\x9f\xa1\xcc\xdb\x4d\x9c\xd5\x2e\xf3\xe5\x8b" + "\xdf\x42\xdb\x3e\x42\xb6\x41\xf6\x97\xf8\xe1\xad\x8f\x63\x0f\xf0\x30\xd9\xc4\x3d" + "\x9d\xa7\xf8\x77\xfd\xe9\x6e\x68\xc3\x0d\x64\x13\x77\xef\x37\xdf\x0f\x59\x7c\x25" + "\xd6\xda\xfd\xc9\x26\xe6\x19\xc6\xf6\xcd\x57\x3a\x7e\x1f\x03\x36\xf1\xb8\xd5\x73" + "\xfd\x79\xbb\x2c\x75\x0b\x56\x5f\x47\x36\x71\xf7\xeb\xf3\xfc\x17\x35\x57\x62\x2d" + "\x7d\xa2\x1e\x6c\xe2\x8a\xc6\x46\x8c\x87\x4b\xdc\x65\x49\xf3\x2a\xb0\x89\xef\x9c" + "\x9e\xf3\xe7\x37\xb5\xe6\xae\x6c\x2a\xcb\x81\x4d\xbc\xbb\x9f\xee\x0f\x9d\xb5\x8f" + "\xbb\xe3\xcd\x8e\x55\x60\x13\xaf\x28\xc9\xf9\xdd\x7f\x33\xcb\xdd\x7e\xf4\x91\x39" + "\xb0\x89\x4b\x9f\x38\x2e\xde\x4d\xf7\x2c\x3c\xde\x81\x4d\x9c\x3d\xf4\x4d\xec\xc7" + "\x7e\xe5\x46\x75\xfc\x2f\xd9\xc4\xe5\x4b\xcf\x46\x7b\xde\xe9\xc6\xd5\x7d\x87\x6c" + "\xe2\xdd\x66\x9f\xe4\x79\x36\x7f\xd1\xba\xae\xa7\xc1\x26\xee\x59\x78\xaa\xaf\x69" + "\xbe\xc3\x3d\x99\x3d\x5b\x0f\x36\x71\xd7\xf2\xf9\x9e\x7f\xe7\x00\x73\x21\x07\x36" + "\xf1\x73\xe7\x1d\xe3\x27\xac\xfe\xad\xeb\x9b\xf6\x26\xd9\xc4\xc9\xe2\x05\xbe\x7a" + "\xe9\x1d\x6e\x48\xc7\x1e\x0e\x6c\xe2\x93\x8e\xba\x2c\xe6\x0c\xcc\x39\xe8\x2e\xb2" + "\x89\x4f\x19\xbb\xcc\x77\xdb\xc7\x6e\xde\xa3\x77\x93\x4d\x9c\x5d\x70\x9b\xaf\x6c" + "\xdd\xe8\x86\xb7\x9e\x4b\x36\x71\xff\xc5\xbf\xf1\xbd\x0f\x7d\xec\x5e\xf4\x6f\xe6" + "\xc0\x26\x2e\x19\x73\x69\x3c\xeb\x1e\x9b\x85\x7a\xb0\x89\x33\x7f\x76\xbc\xff\xfa" + "\x63\xe9\x4d\x4f\x83\x4d\x5c\x75\xe1\x4f\x7c\x77\xcd\xc3\xee\xb3\x85\x4b\x1d\xd8" + "\xc4\x25\x5d\xdf\xf2\x25\x1d\xf7\x3a\x7e\xff\x04\x36\x71\xcf\x8d\xdf\xc7\x7b\xdd" + "\xc7\xbf\x85\x40\x36\x31\xd6\x3e\x5f\x8c\x1d\x3f\x25\x9b\xb8\x6b\xf9\x8f\xfd\xc6" + "\x9a\x47\xf8\x8d\x04\xf6\x34\x3f\x36\x71\xff\x5b\xbf\xc0\xbc\x08\x6e\x58\xc7\x39" + "\x64\x13\x27\xf7\x5f\xe1\xb7\xd4\x3e\x17\xbf\x29\x01\x9b\x78\xfa\x9a\x25\x3e\x3d" + "\xef\x15\x77\xd1\x7b\x67\x92\x4d\x7c\xf2\xee\x57\xf9\x2d\x4b\x5e\x74\xa7\xdc\x7d" + "\x35\xd9\xc4\x25\x07\x62\xde\xad\xfb\x08\xef\xd2\x4e\x36\xf1\x43\x7f\xf8\xad\xbf" + "\xe7\xf0\x72\x5f\x5d\xf7\x22\xd9\xc4\xed\xe5\x6d\xfe\xeb\x87\x0f\xb8\xd7\xa6\xdd" + "\x40\x36\xf1\x03\x53\xef\xf4\xf7\x3f\x5f\xca\x58\x27\x07\x36\x71\xb2\xcb\xa5\xbe" + "\x6f\xdd\x87\xee\xce\x92\xfa\x55\x60\x13\x77\xbf\x8e\xf5\xec\xdc\x07\xdd\x0b\xf9" + "\x39\x29\xd8\xc4\xa5\x73\x4e\x8f\x7f\xa3\x79\xf8\x94\x3b\x1d\xd8\xc4\xff\x0f\x0d" + "\xa9\x7f\xa1"; + + size_t dst_size = 24144; + char *dst = malloc(dst_size); + + ufbxt_bechmark_begin(); + ptrdiff_t res = ufbxt_inflate(dst, dst_size, src, sizeof(src) - 1, opts); + double sec = ufbxt_bechmark_end(); + ufbxt_logf("-> %.2f MB/s", (double)dst_size / sec * 1e-6); + + ufbxt_hintf("res = %d", (int)res); + ufbxt_assert(res == dst_size); + ufbxt_assert(fnv1a(dst, dst_size) == 0xbaccc7ea); + + free(dst); +} +#endif + +#if UFBXT_IMPL +typedef struct { + const char *prefix; + size_t prefix_end; + + size_t content_end; + + const char *suffix; + size_t suffix_end; + + size_t total_size; + + size_t position; +} ufbxt_deflate_byte_stream; + +static void ufbxt_deflate_byte_stream_init(ufbxt_deflate_byte_stream *s, + const char *prefix, size_t prefix_len, + size_t content_len, + const char *suffix, size_t suffix_len) +{ + s->position = 0; + s->prefix = prefix; + s->prefix_end = prefix_len; + + s->content_end = s->prefix_end + content_len; + + s->suffix = suffix; + s->suffix_end = s->content_end + suffix_len; + + s->total_size = s->suffix_end; +} + +static size_t ufbxt_deflate_byte_stream_read(void *user, void *data, size_t size) +{ + ufbxt_deflate_byte_stream *s = (ufbxt_deflate_byte_stream*)user; + char *dst = (char*)data; + + for (size_t len = 0; len < size; len++) { + if (s->position < s->prefix_end) { + size_t pos = s->position; + dst[len] = s->prefix[pos]; + } else if (s->position < s->content_end) { + size_t pos = s->position - s->prefix_end; + dst[len] = (char)(unsigned char)pos; + } else if (s->position < s->suffix_end) { + size_t pos = s->position - s->content_end; + dst[len] = s->suffix[pos]; + } else { + return len; + } + + s->position++; + } + + return size; +} + +static void ufbxt_check_deflate_byte_result(const char *data, size_t length) +{ + for (size_t i = 0; i < length; i++) { + ufbxt_assert(data[i] == (char)(unsigned char)i); + } +} + +#endif + +UFBXT_TEST(deflate_byte_stream) +#if UFBXT_IMPL +{ + const char prefix[] = "\x78\x01\x01\x00\x80\xff\x7f"; + const char suffix[] = "\x3f\xdc\xc3\xb2"; + ufbxt_deflate_byte_stream stream; + ufbxt_deflate_byte_stream_init(&stream, prefix, sizeof(prefix) - 1, 0x8000, suffix, sizeof(suffix) - 1); + + ufbx_inflate_input input = { 0 }; + input.total_size = stream.total_size; + input.read_fn = &ufbxt_deflate_byte_stream_read; + input.read_user = &stream; + + ufbx_inflate_retain retain; + retain.initialized = false; + + size_t result_len = 0x8000; + char *result = (char*)malloc(0x8000); + ufbxt_assert(result); + ptrdiff_t ret = ufbx_inflate(result, result_len, &input, &retain); + ufbxt_assert(ret >= 0); + ufbxt_assert(ret == result_len); + ufbxt_check_deflate_byte_result(result, result_len); + free(result); +} +#endif + +UFBXT_TEST(deflate_byte_stream_prefix) +#if UFBXT_IMPL +{ + const char prefix[] = "\x78\x01\x01\x00\x80\xff\x7f"; + const char suffix[] = "\x3f\xdc\xc3\xb2"; + ufbxt_deflate_byte_stream stream; + ufbxt_deflate_byte_stream_init(&stream, NULL, 0, 0x8000, suffix, sizeof(suffix) - 1); + + ufbx_inflate_input input = { 0 }; + input.total_size = stream.total_size + (sizeof(prefix) - 1); + input.data = prefix; + input.data_size = sizeof(prefix) - 1; + input.read_fn = &ufbxt_deflate_byte_stream_read; + input.read_user = &stream; + + ufbx_inflate_retain retain; + retain.initialized = false; + + size_t result_len = 0x8000; + char *result = (char*)malloc(0x8000); + ufbxt_assert(result); + ptrdiff_t ret = ufbx_inflate(result, result_len, &input, &retain); + ufbxt_assert(ret >= 0); + ufbxt_assert(ret == result_len); + ufbxt_check_deflate_byte_result(result, result_len); + free(result); +} +#endif + +UFBXT_TEST(deflate_byte_stream_truncated) +#if UFBXT_IMPL +{ + const char prefix[] = "\x78\x01\x01\x00\x80\xff\x7f"; + const char suffix[] = "\x3f\xdc\xc3\xb2"; + ufbxt_deflate_byte_stream stream; + ufbxt_deflate_byte_stream_init(&stream, prefix, sizeof(prefix) - 1, 0x4000, suffix, sizeof(suffix) - 1); + + ufbx_inflate_input input = { 0 }; + input.total_size = stream.total_size; + input.read_fn = &ufbxt_deflate_byte_stream_read; + input.read_user = &stream; + + ufbx_inflate_retain retain; + retain.initialized = false; + + size_t result_len = 0x8000; + char *result = (char*)malloc(0x8000); + ufbxt_assert(result); + ptrdiff_t ret = ufbx_inflate(result, result_len, &input, &retain); + ufbxt_assert(ret == -5); + free(result); +} +#endif + +UFBXT_TEST(deflate_byte_stream_no_adler) +#if UFBXT_IMPL +{ + const char prefix[] = "\x78\x01\x01\x00\x80\xff\x7f"; + ufbxt_deflate_byte_stream stream; + ufbxt_deflate_byte_stream_init(&stream, prefix, sizeof(prefix) - 1, 0x8000, NULL, 0); + + ufbx_inflate_input input = { 0 }; + input.total_size = stream.total_size; + input.read_fn = &ufbxt_deflate_byte_stream_read; + input.read_user = &stream; + + ufbx_inflate_retain retain; + retain.initialized = false; + + size_t result_len = 0x8000; + char *result = (char*)malloc(0x8000); + ufbxt_assert(result); + ptrdiff_t ret = ufbx_inflate(result, result_len, &input, &retain); + ufbxt_assert(ret == -9); + free(result); +} +#endif + diff --git a/modules/ufbx/test/test_fuzz.h b/modules/ufbx/test/test_fuzz.h new file mode 100644 index 0000000..7d9205a --- /dev/null +++ b/modules/ufbx/test/test_fuzz.h @@ -0,0 +1,291 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "fuzz" + +UFBXT_TEST(fuzz_files) +#if UFBXT_IMPL +{ + size_t ok = 0; + size_t i = g_fuzz_step < SIZE_MAX ? g_fuzz_step : 0; + for (; i < 10000; i++) { + if (g_fuzz_file != SIZE_MAX && i != g_fuzz_file) continue; + + char name[512]; + char buf[512]; + snprintf(name, sizeof(name), "fuzz_%04zu", i); + snprintf(buf, sizeof(buf), "%sfuzz/fuzz_%04zu.fbx", data_root, i); + + size_t size; + void *data = ufbxt_read_file(buf, &size); + if (!data) break; + + ufbx_error error; + + ufbx_load_opts load_opts = { 0 }; + load_opts.temp_allocator.memory_limit = 0x4000000; // 64MB + load_opts.result_allocator.memory_limit = 0x4000000; // 64MB + load_opts.file_format = UFBX_FILE_FORMAT_FBX; + + ufbx_scene *scene = ufbx_load_memory(data, size, &load_opts, &error); + if (scene) { + ufbxt_check_scene(scene); + ok++; + } + bool allow_error = scene == NULL; + + ufbx_free_scene(scene); + + ufbxt_progress_ctx stream_progress_ctx = { 0 }; + + bool temp_freed = false, result_freed = false; + + ufbx_load_opts stream_opts = load_opts; + ufbxt_init_allocator(&stream_opts.temp_allocator, &temp_freed); + ufbxt_init_allocator(&stream_opts.result_allocator, &result_freed); + stream_opts.read_buffer_size = 1; + stream_opts.temp_allocator.huge_threshold = 1; + stream_opts.result_allocator.huge_threshold = 1; + stream_opts.progress_cb.fn = &ufbxt_measure_progress; + stream_opts.progress_cb.user = &stream_progress_ctx; + stream_opts.progress_interval_hint = 1; + ufbx_scene *streamed_scene = ufbx_load_file(buf, &stream_opts, &error); + if (streamed_scene) { + ufbxt_check_scene(streamed_scene); + ufbxt_assert(scene); + } else { + ufbxt_assert(!scene); + } + ufbx_free_scene(streamed_scene); + + ufbxt_assert(temp_freed); + ufbxt_assert(result_freed); + + int prev_fuzz_quality = g_fuzz_quality; + g_fuzz_quality = g_heavy_fuzz_quality; + ufbxt_do_fuzz(name, data, size, buf, allow_error, UFBX_FILE_FORMAT_FBX, NULL); + g_fuzz_quality = prev_fuzz_quality; + + free(data); + } + + ufbxt_logf(".. Loaded fuzz files: %zu (%zu non-errors)", i, ok); +} +#endif + +UFBXT_TEST(fuzz_cache_xml) +#if UFBXT_IMPL +{ + size_t ok = 0; + size_t i = g_fuzz_step < SIZE_MAX ? g_fuzz_step : 0; + for (; i < 10000; i++) { + if (g_fuzz_file != SIZE_MAX && i != g_fuzz_file) continue; + + char buf[512]; + snprintf(buf, sizeof(buf), "%scache_fuzz/xml/fuzz_%04zu.xml", data_root, i); + + ufbx_geometry_cache_opts cache_opts = { 0 }; + cache_opts.temp_allocator.memory_limit = 0x4000000; // 64MB + cache_opts.result_allocator.memory_limit = 0x4000000; // 64MB + + if (g_dedicated_allocs) { + cache_opts.temp_allocator.huge_threshold = 1; + cache_opts.result_allocator.huge_threshold = 1; + } + + size_t size; + void *data = ufbxt_read_file(buf, &size); + if (!data) break; + + // TODO: Read memory? + + ufbx_error error; + ufbx_geometry_cache *cache = ufbx_load_geometry_cache(buf, &cache_opts, &error); + if (cache) { + ufbxt_check_string(cache->root_filename); + ok++; + } + ufbx_free_geometry_cache(cache); + + free(data); + } + + ufbxt_logf(".. Loaded fuzz files: %zu (%zu non-errors)", i, ok); +} +#endif + +UFBXT_TEST(fuzz_cache_mcx) +#if UFBXT_IMPL +{ + size_t ok = 0; + size_t i = g_fuzz_step < SIZE_MAX ? g_fuzz_step : 0; + for (; i < 10000; i++) { + if (g_fuzz_file != SIZE_MAX && i != g_fuzz_file) continue; + + char buf[512]; + snprintf(buf, sizeof(buf), "%scache_fuzz/mcx/fuzz_%04zu.mcx", data_root, i); + + ufbx_geometry_cache_opts cache_opts = { 0 }; + cache_opts.temp_allocator.memory_limit = 0x4000000; // 64MB + cache_opts.result_allocator.memory_limit = 0x4000000; // 64MB + + if (g_dedicated_allocs) { + cache_opts.temp_allocator.huge_threshold = 1; + cache_opts.result_allocator.huge_threshold = 1; + } + + size_t size; + void *data = ufbxt_read_file(buf, &size); + if (!data) break; + + // TODO: Read memory? + + ufbx_error error; + ufbx_geometry_cache *cache = ufbx_load_geometry_cache(buf, &cache_opts, &error); + if (cache) { + ufbxt_check_string(cache->root_filename); + ok++; + } + ufbx_free_geometry_cache(cache); + + free(data); + } + + ufbxt_logf(".. Loaded fuzz files: %zu (%zu non-errors)", i, ok); +} +#endif + +UFBXT_TEST(fuzz_obj_files) +#if UFBXT_IMPL +{ + size_t ok = 0; + size_t i = g_fuzz_step < SIZE_MAX ? g_fuzz_step : 0; + for (; i < 10000; i++) { + if (g_fuzz_file != SIZE_MAX && i != g_fuzz_file) continue; + + char name[512]; + char buf[512]; + snprintf(name, sizeof(name), "obj_fuzz_%04zu", i); + snprintf(buf, sizeof(buf), "%sobj_fuzz/fuzz_%04zu.obj", data_root, i); + + size_t size; + void *data = ufbxt_read_file(buf, &size); + if (!data) break; + + ufbx_error error; + + ufbx_load_opts load_opts = { 0 }; + load_opts.temp_allocator.memory_limit = 0x4000000; // 64MB + load_opts.result_allocator.memory_limit = 0x4000000; // 64MB + load_opts.file_format = UFBX_FILE_FORMAT_OBJ; + + ufbx_scene *scene = ufbx_load_memory(data, size, &load_opts, &error); + if (scene) { + ufbxt_check_scene(scene); + ok++; + } + + bool allow_error = scene == NULL; + + ufbx_free_scene(scene); + + ufbxt_progress_ctx stream_progress_ctx = { 0 }; + + bool temp_freed = false, result_freed = false; + + ufbx_load_opts stream_opts = load_opts; + ufbxt_init_allocator(&stream_opts.temp_allocator, &temp_freed); + ufbxt_init_allocator(&stream_opts.result_allocator, &result_freed); + stream_opts.read_buffer_size = 1; + stream_opts.temp_allocator.huge_threshold = 1; + stream_opts.result_allocator.huge_threshold = 1; + stream_opts.progress_cb.fn = &ufbxt_measure_progress; + stream_opts.progress_cb.user = &stream_progress_ctx; + stream_opts.progress_interval_hint = 1; + ufbx_scene *streamed_scene = ufbx_load_file(buf, &stream_opts, &error); + if (streamed_scene) { + ufbxt_check_scene(streamed_scene); + ufbxt_assert(scene); + } else { + ufbxt_assert(!scene); + } + ufbx_free_scene(streamed_scene); + + ufbxt_assert(temp_freed); + ufbxt_assert(result_freed); + + ufbxt_do_fuzz(name, data, size, buf, allow_error, UFBX_FILE_FORMAT_OBJ, NULL); + + free(data); + } + + ufbxt_logf(".. Loaded fuzz files: %zu (%zu non-errors)", i, ok); +} +#endif + +UFBXT_TEST(fuzz_mtl_files) +#if UFBXT_IMPL +{ + size_t ok = 0; + size_t i = g_fuzz_step < SIZE_MAX ? g_fuzz_step : 0; + for (; i < 10000; i++) { + if (g_fuzz_file != SIZE_MAX && i != g_fuzz_file) continue; + + char name[512]; + char buf[512]; + snprintf(name, sizeof(name), "mtl_fuzz_%04zu", i); + snprintf(buf, sizeof(buf), "%smtl_fuzz/fuzz_%04zu.mtl", data_root, i); + + size_t size; + void *data = ufbxt_read_file(buf, &size); + if (!data) break; + + ufbx_error error; + + ufbx_load_opts load_opts = { 0 }; + load_opts.temp_allocator.memory_limit = 0x4000000; // 64MB + load_opts.result_allocator.memory_limit = 0x4000000; // 64MB + load_opts.file_format = UFBX_FILE_FORMAT_MTL; + + ufbx_scene *scene = ufbx_load_memory(data, size, &load_opts, &error); + if (scene) { + ufbxt_check_scene(scene); + ok++; + } + + bool allow_error = scene == NULL; + + ufbx_free_scene(scene); + + ufbxt_progress_ctx stream_progress_ctx = { 0 }; + + bool temp_freed = false, result_freed = false; + + ufbx_load_opts stream_opts = load_opts; + ufbxt_init_allocator(&stream_opts.temp_allocator, &temp_freed); + ufbxt_init_allocator(&stream_opts.result_allocator, &result_freed); + stream_opts.read_buffer_size = 1; + stream_opts.temp_allocator.huge_threshold = 1; + stream_opts.result_allocator.huge_threshold = 1; + stream_opts.progress_cb.fn = &ufbxt_measure_progress; + stream_opts.progress_cb.user = &stream_progress_ctx; + stream_opts.progress_interval_hint = 1; + ufbx_scene *streamed_scene = ufbx_load_file(buf, &stream_opts, &error); + if (streamed_scene) { + ufbxt_check_scene(streamed_scene); + ufbxt_assert(scene); + } else { + ufbxt_assert(!scene); + } + ufbx_free_scene(streamed_scene); + + ufbxt_assert(temp_freed); + ufbxt_assert(result_freed); + + ufbxt_do_fuzz(name, data, size, buf, allow_error, UFBX_FILE_FORMAT_MTL, NULL); + + free(data); + } + + ufbxt_logf(".. Loaded fuzz files: %zu (%zu non-errors)", i, ok); +} +#endif + diff --git a/modules/ufbx/test/test_legacy.h b/modules/ufbx/test/test_legacy.h new file mode 100644 index 0000000..19a0961 --- /dev/null +++ b/modules/ufbx/test/test_legacy.h @@ -0,0 +1,253 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "legacy" + +#if UFBXT_IMPL +static void ufbxt_diff_material_value(ufbxt_diff_error *err, const ufbx_material_map *color, const ufbx_material_map *factor, ufbx_vec3 value) +{ + ufbxt_assert_close_real(err, color->value_vec3.x * factor->value_vec3.x, value.x); + ufbxt_assert_close_real(err, color->value_vec3.y * factor->value_vec3.x, value.y); + ufbxt_assert_close_real(err, color->value_vec3.z * factor->value_vec3.x, value.z); +} +#endif + +UFBXT_FILE_TEST(max7_cube) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(max7_cube_normals) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(max2009_blob) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->lights.count == 3); + ufbxt_assert(scene->cameras.count == 1); + + { + ufbx_node *node = ufbx_find_node(scene, "Box01"); + ufbxt_assert(node); + ufbxt_assert(node->mesh); + ufbxt_assert(node->children.count == 16); + ufbx_mesh *mesh = node->mesh; + + size_t num_top = 0; + size_t num_left = 0; + size_t num_right = 0; + size_t num_front = 0; + + for (size_t fi = 0; fi < mesh->num_faces; fi++) { + ufbx_face face = mesh->faces.data[fi]; + ufbx_vec3 center = ufbx_zero_vec3; + for (size_t i = 0; i < face.num_indices; i++) { + ufbx_vec3 v = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + i); + center.x += v.x; + center.y += v.y; + center.z += v.z; + } + center.x /= (ufbx_real)face.num_indices; + center.y /= (ufbx_real)face.num_indices; + center.z /= (ufbx_real)face.num_indices; + + if (center.z >= 14.0f) { + ufbx_mesh_material *mat = &mesh->materials.data[mesh->face_material.data[fi]]; + ufbxt_assert(!strcmp(mat->material->name.data, "Top")); + num_top++; + } + if (center.y <= -10.0f) { + ufbx_mesh_material *mat = &mesh->materials.data[mesh->face_material.data[fi]]; + ufbxt_assert(!strcmp(mat->material->name.data, "Right")); + num_right++; + } + if (center.y >= 10.0f) { + ufbx_mesh_material *mat = &mesh->materials.data[mesh->face_material.data[fi]]; + ufbxt_assert(!strcmp(mat->material->name.data, "Left")); + num_left++; + } + if (center.x >= 9.0f) { + ufbx_mesh_material *mat = &mesh->materials.data[mesh->face_material.data[fi]]; + ufbxt_assert(!strcmp(mat->material->name.data, "Front")); + num_front++; + } + } + + ufbxt_assert(num_top >= 80); + ufbxt_assert(num_left >= 80); + ufbxt_assert(num_right >= 80); + ufbxt_assert(num_front >= 80); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Omni01"); + ufbxt_assert(node && node->light); + ufbx_light *light = node->light; + ufbxt_assert(light->type == UFBX_LIGHT_POINT); + if (scene->metadata.version < 6000) { + ufbxt_assert(light->decay == UFBX_LIGHT_DECAY_QUADRATIC); + } + ufbx_vec3 color = { 0.172549024224281f, 0.364705890417099f, 1.0f }; + ufbxt_assert_close_vec3(err, light->color, color); + ufbxt_assert_close_real(err, light->intensity, 1.0f); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Fspot01"); + ufbxt_assert(node && node->light); + ufbx_light *light = node->light; + ufbxt_assert(light->type == UFBX_LIGHT_SPOT); + if (scene->metadata.version < 6000) { + ufbxt_assert(light->decay == UFBX_LIGHT_DECAY_QUADRATIC); + } + ufbx_vec3 color = { 0.972549080848694f ,0.0705882385373116f, 0.0705882385373116f }; + ufbxt_assert_close_vec3(err, light->color, color); + ufbxt_assert_close_real(err, light->intensity, 1.0f); + ufbxt_assert_close_real(err, light->outer_angle, 45.0f); + } + + { + ufbx_node *node = ufbx_find_node(scene, "FDirect02"); + ufbxt_assert(node && node->light); + ufbx_light *light = node->light; + ufbxt_assert(light->type == UFBX_LIGHT_DIRECTIONAL); + if (scene->metadata.version < 6000) { + ufbxt_assert(light->decay == UFBX_LIGHT_DECAY_NONE); + } + ufbx_vec3 color = { 0.533333361148834f ,0.858823597431183f, 0.647058844566345f }; + ufbxt_assert_close_vec3(err, light->color, color); + ufbxt_assert_close_real(err, light->intensity, 1.0f); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Camera01"); + ufbxt_assert(node && node->camera); + ufbx_camera *camera = node->camera; + ufbxt_assert(camera->aspect_mode == UFBX_ASPECT_MODE_WINDOW_SIZE); + ufbxt_assert(camera->aperture_mode == UFBX_APERTURE_MODE_HORIZONTAL); + ufbx_vec2 aperture = { 1.41732287406921f ,1.06299209594727f }; + ufbxt_assert_close_real(err, camera->focal_length_mm, 43.4558439883016f); + ufbxt_assert_close_vec2(err, camera->film_size_inch, aperture); + ufbxt_assert_close_vec2(err, camera->aperture_size_inch, aperture); + } + + { + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Left"); + ufbxt_assert(material); + ufbx_vec3 ambient = { 0.588235318660736f, 0.588235318660736f, 0.588235318660736f }; + ufbx_vec3 diffuse = { 0.588235318660736f, 0.588235318660736f, 0.588235318660736f }; + ufbx_vec3 specular = { 0.179999984502793f, 0.179999984502793f, 0.179999984502793f }; + ufbx_vec3 emission = { 0.823529481887817f, 0.0f, 0.0f }; + ufbx_real shininess = 1.99999991737042f; + ufbxt_diff_material_value(err, &material->fbx.ambient_color, &material->fbx.ambient_factor, ambient); + ufbxt_diff_material_value(err, &material->fbx.diffuse_color, &material->fbx.diffuse_factor, diffuse); + ufbxt_diff_material_value(err, &material->fbx.specular_color, &material->fbx.specular_factor, specular); + ufbxt_diff_material_value(err, &material->fbx.emission_color, &material->fbx.emission_factor, emission); + ufbxt_assert_close_real(err, material->fbx.specular_exponent.value_vec3.x, shininess); + } + + { + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Front"); + ufbxt_assert(material); + ufbx_vec3 ambient = { 0.588235318660736f, 0.921568691730499f, 0.925490260124207f }; + ufbx_vec3 diffuse = { 0.588235318660736f, 0.921568691730499f, 0.925490260124207f }; + ufbx_vec3 specular = { 0.0f, 0.0f, 0.0f }; + ufbx_vec3 emission = { 0.0f, 0.0f, 0.0f }; + ufbx_real shininess = 1.99999991737042f; + ufbxt_diff_material_value(err, &material->fbx.ambient_color, &material->fbx.ambient_factor, ambient); + ufbxt_diff_material_value(err, &material->fbx.diffuse_color, &material->fbx.diffuse_factor, diffuse); + ufbxt_diff_material_value(err, &material->fbx.specular_color, &material->fbx.specular_factor, specular); + ufbxt_diff_material_value(err, &material->fbx.emission_color, &material->fbx.emission_factor, emission); + ufbxt_assert_close_real(err, material->fbx.specular_exponent.value_vec3.x, shininess); + } + + { + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Right"); + ufbxt_assert(material); + ufbx_vec3 ambient = { 0.588235318660736f, 0.588235318660736f, 0.588235318660736f }; + ufbx_vec3 diffuse = { 0.588235318660736f, 0.588235318660736f, 0.588235318660736f }; + ufbx_vec3 specular = { 0.0f, 0.0f, 0.0f }; + ufbx_vec3 emission = { 0.0f, 0.803921639919281f, 0.0f }; + ufbx_real shininess = 7.99999900844507f; + ufbxt_diff_material_value(err, &material->fbx.ambient_color, &material->fbx.ambient_factor, ambient); + ufbxt_diff_material_value(err, &material->fbx.diffuse_color, &material->fbx.diffuse_factor, diffuse); + ufbxt_diff_material_value(err, &material->fbx.specular_color, &material->fbx.specular_factor, specular); + ufbxt_diff_material_value(err, &material->fbx.emission_color, &material->fbx.emission_factor, emission); + ufbxt_assert_close_real(err, material->fbx.specular_exponent.value_vec3.x, shininess); + } + + { + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Top"); + ufbxt_assert(material); + ufbx_vec3 ambient = { 0.564705908298492f, 0.603921592235565f, 0.890196144580841f }; + ufbx_vec3 diffuse = { 0.564705908298492f, 0.603921592235565f, 0.890196144580841f }; + ufbx_vec3 specular = { 0.0f, 0.0f, 0.0f }; + ufbx_vec3 emission = { 0.0f, 0.0f, 0.0f }; + ufbx_real shininess = 1.99999991737042f; + ufbxt_diff_material_value(err, &material->fbx.ambient_color, &material->fbx.ambient_factor, ambient); + ufbxt_diff_material_value(err, &material->fbx.diffuse_color, &material->fbx.diffuse_factor, diffuse); + ufbxt_diff_material_value(err, &material->fbx.specular_color, &material->fbx.specular_factor, specular); + ufbxt_diff_material_value(err, &material->fbx.emission_color, &material->fbx.emission_factor, emission); + ufbxt_assert_close_real(err, material->fbx.specular_exponent.value_vec3.x, shininess); + } + + ufbxt_check_frame(scene, err, false, "max2009_blob_8", NULL, 8.0/30.0); + ufbxt_check_frame(scene, err, false, "max2009_blob_18", NULL, 18.0/30.0); +} +#endif + +UFBXT_FILE_TEST(max7_skin) +#if UFBXT_IMPL +{ + ufbxt_check_frame(scene, err, false, "max7_skin_5", NULL, 5.0/30.0); + ufbxt_check_frame(scene, err, false, "max7_skin_15", NULL, 15.0/30.0); +} +#endif + +UFBXT_FILE_TEST(max7_blend_cube) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Box01"); + ufbxt_assert(node); + ufbxt_assert(node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->blend_deformers.count == 1); + ufbx_blend_deformer *blend = mesh->blend_deformers.data[0]; + ufbxt_assert(blend->channels.count == 2); + + ufbxt_check_frame(scene, err, false, "max7_blend_cube_8", NULL, 8.0/30.0); + ufbxt_check_frame(scene, err, false, "max7_blend_cube_24", NULL, 24.0/30.0); +} +#endif + +UFBXT_FILE_TEST(max6_teapot) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Teapot01"); + ufbxt_assert(node); + ufbxt_assert(node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->vertex_normal.exists); + ufbxt_assert(mesh->vertex_uv.exists); +} +#endif + +UFBXT_FILE_TEST(synthetic_legacy_nonzero_material) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Box01"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->faces.count == 1); + ufbxt_assert(mesh->num_indices == 3); + ufbxt_assert(mesh->materials.count == 2); + ufbxt_assert(!strcmp(mesh->materials.data[0].material->name.data, "Right")); + ufbxt_assert(mesh->materials.data[0].num_faces == 0); + ufbxt_assert(!strcmp(mesh->materials.data[1].material->name.data, "Left")); + ufbxt_assert(mesh->materials.data[1].num_faces == 1); + ufbxt_assert(mesh->face_material.count == 1); + ufbxt_assert(mesh->face_material.data[0] == 1); +} +#endif diff --git a/modules/ufbx/test/test_material.h b/modules/ufbx/test/test_material.h new file mode 100644 index 0000000..081a352 --- /dev/null +++ b/modules/ufbx/test/test_material.h @@ -0,0 +1,1635 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "material" + +#if UFBXT_IMPL + +void ufbxt_check_texture_content(ufbx_scene *scene, ufbx_texture *texture, const char *filename) +{ + char buf[512]; + + ufbxt_assert(texture->content.size > 0); + ufbxt_assert(texture->content.data); + + snprintf(buf, sizeof(buf), "%stextures/%s", data_root, filename); + void *ref = malloc(texture->content.size); + ufbxt_assert(ref); + + FILE *f = fopen(buf, "rb"); + ufbxt_assert(f); + size_t num_read = fread(ref, 1, texture->content.size, f); + fclose(f); + + ufbxt_assert(num_read == texture->content.size); + ufbxt_assert(!memcmp(ref, texture->content.data, texture->content.size)); + + free(ref); +} + +void ufbxt_check_material_texture_ex(ufbx_scene *scene, ufbx_texture *texture, const char *directory, const char *filename, bool require_content) +{ + char buf[512]; + + snprintf(buf, sizeof(buf), "%s%s", directory, filename); + ufbxt_assert(!strcmp(texture->relative_filename.data, buf)); + + if (require_content && (scene->metadata.version >= 7000 || !scene->metadata.ascii)) { + ufbxt_assert(texture->content.size); + } + + if (texture->content.size) { + ufbxt_check_texture_content(scene, texture, filename); + } +} + +void ufbxt_check_material_texture(ufbx_scene *scene, ufbx_texture *texture, const char *filename, bool require_content) +{ + ufbxt_check_material_texture_ex(scene, texture, "textures\\", filename, require_content); +} + +#endif + +UFBXT_FILE_TEST(maya_textured_cube) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "phong1"); + ufbxt_assert(material); + ufbxt_assert(material->textures.count == 6); + + ufbxt_check_material_texture(scene, material->fbx.diffuse_color.texture, "checkerboard_diffuse.png", true); + ufbxt_check_material_texture(scene, material->fbx.specular_color.texture, "checkerboard_specular.png", true); + ufbxt_check_material_texture(scene, material->fbx.reflection_color.texture, "checkerboard_reflection.png", true); + ufbxt_check_material_texture(scene, material->fbx.transparency_color.texture, "checkerboard_transparency.png", true); + ufbxt_check_material_texture(scene, material->fbx.emission_color.texture, "checkerboard_emissive.png", true); + ufbxt_check_material_texture(scene, material->fbx.ambient_color.texture, "checkerboard_ambient.png", true); +} +#endif + +UFBXT_FILE_TEST(synthetic_texture_split) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "phong1"); + ufbxt_assert(material); + ufbxt_assert(material->textures.count == 6); + + ufbxt_check_material_texture(scene, material->fbx.diffuse_color.texture, "checkerboard_diffuse.png", true); + ufbxt_check_material_texture(scene, material->fbx.specular_color.texture, "checkerboard_specular.png", true); + ufbxt_check_material_texture(scene, material->fbx.reflection_color.texture, "checkerboard_reflection.png", true); + ufbxt_check_material_texture(scene, material->fbx.transparency_color.texture, "checkerboard_transparency.png", true); + ufbxt_check_material_texture(scene, material->fbx.emission_color.texture, "checkerboard_emissive.png", true); + ufbxt_check_material_texture(scene, material->fbx.ambient_color.texture, "checkerboard_ambient.png", true); +} +#endif + +UFBXT_TEST(ignore_embedded) +#if UFBXT_IMPL +{ + char path[512]; + + ufbxt_file_iterator iter = { "maya_textured_cube" }; + while (ufbxt_next_file(&iter, path, sizeof(path))) { + ufbx_load_opts opts = { 0 }; + opts.ignore_embedded = true; + + ufbx_scene *scene = ufbx_load_file(path, &opts, NULL); + ufbxt_assert(scene); + ufbxt_check_scene(scene); + + for (size_t i = 0; i < scene->videos.count; i++) { + ufbxt_assert(scene->videos.data[i]->content.data == NULL); + ufbxt_assert(scene->videos.data[i]->content.size == 0); + } + + for (size_t i = 0; i < scene->textures.count; i++) { + ufbxt_assert(scene->textures.data[i]->content.data == NULL); + ufbxt_assert(scene->textures.data[i]->content.size == 0); + } + + ufbx_free_scene(scene); + } +} +#endif + +UFBXT_FILE_TEST(maya_shared_textures) +#if UFBXT_IMPL +{ + ufbx_material *material; + + material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Shared"); + ufbxt_assert(material); + ufbxt_assert(material->textures.count == 6); + + ufbxt_assert(material->shader_type == UFBX_SHADER_FBX_LAMBERT); + ufbxt_check_material_texture(scene, material->fbx.diffuse_color.texture, "checkerboard_ambient.png", true); // sic: test has wrong texture + ufbxt_check_material_texture(scene, material->fbx.diffuse_factor.texture, "checkerboard_diffuse.png", true); + ufbxt_check_material_texture(scene, material->fbx.emission_color.texture, "checkerboard_emissive.png", true); + ufbxt_check_material_texture(scene, material->fbx.ambient_color.texture, "checkerboard_ambient.png", true); + ufbxt_check_material_texture(scene, material->fbx.transparency_color.texture, "checkerboard_transparency.png", true); + ufbxt_check_material_texture(scene, material->fbx.bump.texture, "checkerboard_bump.png", true); + + material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Special"); + ufbxt_assert(material->shader_type == UFBX_SHADER_FBX_PHONG); + ufbxt_assert(material); + ufbxt_assert(material->textures.count == 1); + + ufbxt_assert(!strcmp(material->fbx.diffuse_color.texture->relative_filename.data, "textures\\tiny_clouds.png")); +} +#endif + +UFBXT_FILE_TEST(maya_arnold_textures) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "aiStandardSurface1"); + ufbxt_assert(material); + ufbxt_assert(material->textures.count == 5); + + ufbxt_assert(material->shader_type == UFBX_SHADER_ARNOLD_STANDARD_SURFACE); + ufbxt_check_material_texture(scene, material->pbr.base_color.texture, "checkerboard_diffuse.png", true); + ufbxt_check_material_texture(scene, material->pbr.specular_color.texture, "checkerboard_specular.png", true); + ufbxt_check_material_texture(scene, material->pbr.roughness.texture, "checkerboard_roughness.png", true); + ufbxt_check_material_texture(scene, material->pbr.metalness.texture, "checkerboard_metallic.png", true); + ufbxt_check_material_texture(scene, material->pbr.diffuse_roughness.texture, "checkerboard_roughness.png", true); +} +#endif + +UFBXT_FILE_TEST(max_physical_material_properties) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "PhysicalMaterial"); + ufbxt_assert(material); + + ufbxt_assert(material->shader_type == UFBX_SHADER_3DS_MAX_PHYSICAL_MATERIAL); + + ufbxt_assert( 1 == (int)round(100.0f * material->pbr.base_factor.value_real)); + ufbxt_assert( 2 == (int)round(100.0f * material->pbr.base_color.value_vec4.x)); + ufbxt_assert( 3 == (int)round(100.0f * material->pbr.base_color.value_vec4.y)); + ufbxt_assert( 4 == (int)round(100.0f * material->pbr.base_color.value_vec4.z)); + ufbxt_assert( 5 == (int)round(100.0f * material->pbr.base_color.value_vec4.w)); + ufbxt_assert( 6 == (int)round(100.0f * material->pbr.roughness.value_real)); + ufbxt_assert( 7 == (int)round(100.0f * material->pbr.metalness.value_real)); + ufbxt_assert(80 == (int)round(100.0f * material->pbr.specular_ior.value_real)); // 3ds Max doesn't allow lower than 0.1 IOR + ufbxt_assert( 9 == (int)round(100.0f * material->pbr.transmission_factor.value_real)); + ufbxt_assert(10 == (int)round(100.0f * material->pbr.transmission_color.value_vec4.x)); + ufbxt_assert(11 == (int)round(100.0f * material->pbr.transmission_color.value_vec4.y)); + ufbxt_assert(12 == (int)round(100.0f * material->pbr.transmission_color.value_vec4.z)); + ufbxt_assert(13 == (int)round(100.0f * material->pbr.transmission_color.value_vec4.w)); + ufbxt_assert(14 == (int)round(100.0f * material->pbr.transmission_roughness.value_real)); + ufbxt_assert( 6 == (int)round(100.0f * material->pbr.transmission_depth.value_real)); // ??? Unit conversion probably + ufbxt_assert(16 == (int)round(100.0f * material->pbr.subsurface_factor.value_real)); + ufbxt_assert(17 == (int)round(100.0f * material->pbr.subsurface_tint_color.value_vec4.x)); + ufbxt_assert(18 == (int)round(100.0f * material->pbr.subsurface_tint_color.value_vec4.y)); + ufbxt_assert(19 == (int)round(100.0f * material->pbr.subsurface_tint_color.value_vec4.z)); + ufbxt_assert(20 == (int)round(100.0f * material->pbr.subsurface_tint_color.value_vec4.w)); + ufbxt_assert(21 == (int)round(100.0f * material->pbr.subsurface_color.value_vec4.x)); + ufbxt_assert(22 == (int)round(100.0f * material->pbr.subsurface_color.value_vec4.y)); + ufbxt_assert(23 == (int)round(100.0f * material->pbr.subsurface_color.value_vec4.z)); + ufbxt_assert(24 == (int)round(100.0f * material->pbr.subsurface_color.value_vec4.w)); + ufbxt_assert(10 == (int)round(100.0f * material->pbr.subsurface_radius.value_real)); // ??? Unit conversion probably + ufbxt_assert(26 == (int)round(100.0f * material->pbr.subsurface_scale.value_real)); + ufbxt_assert(27 == (int)round(100.0f * material->pbr.emission_factor.value_real)); + ufbxt_assert(28 == (int)round(100.0f * material->pbr.emission_color.value_vec4.x)); + ufbxt_assert(29 == (int)round(100.0f * material->pbr.emission_color.value_vec4.y)); + ufbxt_assert(30 == (int)round(100.0f * material->pbr.emission_color.value_vec4.z)); + ufbxt_assert(31 == (int)round(100.0f * material->pbr.emission_color.value_vec4.w)); + ufbxt_assert(32 == (int)round(100.0f * material->pbr.specular_anisotropy.value_real)); + ufbxt_assert(33 == (int)round(100.0f * material->pbr.specular_rotation.value_real)); + ufbxt_assert(34 == (int)round(100.0f * material->pbr.normal_map.value_real)); + ufbxt_assert(35 == (int)round(100.0f * material->pbr.coat_normal.value_real)); + ufbxt_assert(36 == (int)round(100.0f * material->pbr.displacement_map.value_real)); + ufbxt_assert(37 == (int)round(100.0f * material->pbr.diffuse_roughness.value_real)); + ufbxt_assert(38 == (int)round(100.0f * material->pbr.coat_factor.value_real)); + ufbxt_assert(39 == (int)round(100.0f * material->pbr.coat_color.value_vec4.x)); + ufbxt_assert(40 == (int)round(100.0f * material->pbr.coat_color.value_vec4.y)); + ufbxt_assert(41 == (int)round(100.0f * material->pbr.coat_color.value_vec4.z)); + ufbxt_assert(42 == (int)round(100.0f * material->pbr.coat_color.value_vec4.w)); + ufbxt_assert(43 == (int)round(100.0f * material->pbr.coat_roughness.value_real)); + ufbxt_assert(44 == (int)round(100.0f * material->pbr.coat_ior.value_real)); + ufbxt_assert(45 == (int)round(100.0f * material->pbr.coat_affect_base_color.value_real)); + ufbxt_assert(46 == (int)round(100.0f * material->pbr.coat_affect_base_roughness.value_real)); + + ufbxt_assert(material->pbr.base_factor.texture_enabled); + ufbxt_assert(material->pbr.base_color.texture_enabled); + ufbxt_assert(material->pbr.specular_factor.texture_enabled); + ufbxt_assert(material->pbr.specular_color.texture_enabled); + ufbxt_assert(material->pbr.roughness.texture_enabled); + ufbxt_assert(material->pbr.metalness.texture_enabled); + ufbxt_assert(material->pbr.diffuse_roughness.texture_enabled); + ufbxt_assert(material->pbr.specular_anisotropy.texture_enabled); + ufbxt_assert(material->pbr.specular_rotation.texture_enabled); + ufbxt_assert(material->pbr.transmission_factor.texture_enabled); + ufbxt_assert(material->pbr.transmission_color.texture_enabled); + ufbxt_assert(material->pbr.transmission_roughness.texture_enabled); + ufbxt_assert(material->pbr.specular_ior.texture_enabled); + ufbxt_assert(material->pbr.subsurface_factor.texture_enabled); + ufbxt_assert(material->pbr.subsurface_tint_color.texture_enabled); + ufbxt_assert(material->pbr.subsurface_scale.texture_enabled); + ufbxt_assert(material->pbr.emission_factor.texture_enabled); + ufbxt_assert(material->pbr.emission_color.texture_enabled); + ufbxt_assert(material->pbr.coat_factor.texture_enabled); + ufbxt_assert(material->pbr.coat_color.texture_enabled); + ufbxt_assert(material->pbr.coat_roughness.texture_enabled); + ufbxt_assert(material->pbr.normal_map.texture_enabled); + ufbxt_assert(material->pbr.coat_normal.texture_enabled); + ufbxt_assert(material->pbr.displacement_map.texture_enabled); + ufbxt_assert(material->pbr.opacity.texture_enabled); + + ufbxt_assert(material->pbr.base_factor.value_components == 1); + ufbxt_assert(material->pbr.base_color.value_components == 4); + ufbxt_assert(material->pbr.specular_factor.value_components == 1); + ufbxt_assert(material->pbr.specular_color.value_components == 4); + ufbxt_assert(material->pbr.roughness.value_components == 1); + ufbxt_assert(material->pbr.metalness.value_components == 1); + ufbxt_assert(material->pbr.diffuse_roughness.value_components == 1); + ufbxt_assert(material->pbr.specular_anisotropy.value_components == 1); + ufbxt_assert(material->pbr.specular_rotation.value_components == 1); + ufbxt_assert(material->pbr.transmission_factor.value_components == 1); + ufbxt_assert(material->pbr.transmission_color.value_components == 4); + ufbxt_assert(material->pbr.transmission_roughness.value_components == 1); + ufbxt_assert(material->pbr.transmission_extra_roughness.value_components == 0); + ufbxt_assert(material->pbr.specular_ior.value_components == 1); + ufbxt_assert(material->pbr.subsurface_factor.value_components == 1); + ufbxt_assert(material->pbr.subsurface_tint_color.value_components == 4); + ufbxt_assert(material->pbr.subsurface_color.value_components == 4); + ufbxt_assert(material->pbr.subsurface_radius.value_components == 1); + ufbxt_assert(material->pbr.subsurface_scale.value_components == 1); + ufbxt_assert(material->pbr.emission_factor.value_components == 1); + ufbxt_assert(material->pbr.emission_color.value_components == 4); + ufbxt_assert(material->pbr.coat_factor.value_components == 1); + ufbxt_assert(material->pbr.coat_color.value_components == 4); + ufbxt_assert(material->pbr.coat_roughness.value_components == 1); + ufbxt_assert(material->pbr.normal_map.value_components == 1); + ufbxt_assert(material->pbr.coat_normal.value_components == 1); + ufbxt_assert(material->pbr.displacement_map.value_components == 1); + ufbxt_assert(material->pbr.opacity.value_components == 0); +} +#endif + +UFBXT_FILE_TEST(max_physical_material_inverted) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "InvertedMaterial"); + ufbxt_assert(material); + + ufbxt_assert(material->shader_type == UFBX_SHADER_3DS_MAX_PHYSICAL_MATERIAL); + + ufbxt_assert_close_real(err, material->pbr.roughness.value_real, 0.9f); + ufbxt_assert_close_real(err, material->pbr.transmission_roughness.value_real, 0.8f); + ufbxt_assert_close_real(err, material->pbr.coat_roughness.value_real, 0.7f); +} +#endif + +UFBXT_FILE_TEST(max_physical_material_textures) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "PhysicalMaterial"); + ufbxt_assert(material); + + ufbxt_assert(material->shader_type == UFBX_SHADER_3DS_MAX_PHYSICAL_MATERIAL); + ufbxt_check_material_texture(scene, material->pbr.base_factor.texture, "checkerboard_weight.png", true); + ufbxt_check_material_texture(scene, material->pbr.base_color.texture, "checkerboard_diffuse.png", true); + ufbxt_check_material_texture(scene, material->pbr.specular_factor.texture, "checkerboard_reflection.png", true); + ufbxt_check_material_texture(scene, material->pbr.specular_color.texture, "checkerboard_reflection.png", true); + ufbxt_check_material_texture(scene, material->pbr.roughness.texture, "checkerboard_roughness.png", true); + ufbxt_check_material_texture(scene, material->pbr.metalness.texture, "checkerboard_metallic.png", true); + ufbxt_check_material_texture(scene, material->pbr.diffuse_roughness.texture, "checkerboard_roughness.png", true); + ufbxt_check_material_texture(scene, material->pbr.specular_anisotropy.texture, "checkerboard_weight.png", true); + ufbxt_check_material_texture(scene, material->pbr.specular_rotation.texture, "checkerboard_weight.png", true); + ufbxt_check_material_texture(scene, material->pbr.transmission_factor.texture, "checkerboard_transparency.png", true); + ufbxt_check_material_texture(scene, material->pbr.transmission_color.texture, "checkerboard_transparency.png", true); + ufbxt_check_material_texture(scene, material->pbr.transmission_roughness.texture, "checkerboard_roughness.png", true); + ufbxt_check_material_texture(scene, material->pbr.specular_ior.texture, "checkerboard_weight.png", true); + ufbxt_check_material_texture(scene, material->pbr.subsurface_factor.texture, "checkerboard_weight.png", true); + ufbxt_check_material_texture(scene, material->pbr.subsurface_tint_color.texture, "checkerboard_weight.png", true); + ufbxt_check_material_texture(scene, material->pbr.subsurface_scale.texture, "checkerboard_weight.png", true); + ufbxt_check_material_texture(scene, material->pbr.emission_factor.texture, "checkerboard_emissive.png", true); + ufbxt_check_material_texture(scene, material->pbr.emission_color.texture, "checkerboard_emissive.png", true); + ufbxt_check_material_texture(scene, material->pbr.coat_factor.texture, "checkerboard_specular.png", true); + ufbxt_check_material_texture(scene, material->pbr.coat_color.texture, "checkerboard_specular.png", true); + ufbxt_check_material_texture(scene, material->pbr.coat_roughness.texture, "checkerboard_specular.png", true); + ufbxt_check_material_texture(scene, material->pbr.normal_map.texture, "checkerboard_bump.png", true); + ufbxt_check_material_texture(scene, material->pbr.coat_normal.texture, "checkerboard_bump.png", true); + ufbxt_check_material_texture(scene, material->pbr.displacement_map.texture, "checkerboard_displacement.png", true); + ufbxt_check_material_texture(scene, material->pbr.opacity.texture, "checkerboard_transparency.png", true); + +} +#endif + +UFBXT_FILE_TEST(max_pbr_metal_rough_material) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "01 - Default"); + ufbxt_assert(material); + + ufbxt_assert(material->shader_type == UFBX_SHADER_3DS_MAX_PBR_METAL_ROUGH); + + ufbxt_assert( 1 == (int)round(100.0f * material->pbr.base_color.value_vec4.x)); + ufbxt_assert( 2 == (int)round(100.0f * material->pbr.base_color.value_vec4.y)); + ufbxt_assert( 3 == (int)round(100.0f * material->pbr.base_color.value_vec4.z)); + ufbxt_assert( 4 == (int)round(100.0f * material->pbr.base_color.value_vec4.w)); + ufbxt_assert( 5 == (int)round(100.0f * material->pbr.metalness.value_real)); + ufbxt_assert( 6 == (int)round(100.0f * material->pbr.roughness.value_real)); + // ufbxt_assert( 7 == (int)round(100.0f * material->pbr.normal_map.value_real)); (not in file?!) + ufbxt_assert( 8 == (int)round(100.0f * material->pbr.emission_color.value_vec4.x)); + ufbxt_assert( 9 == (int)round(100.0f * material->pbr.emission_color.value_vec4.y)); + ufbxt_assert(10 == (int)round(100.0f * material->pbr.emission_color.value_vec4.z)); + ufbxt_assert(11 == (int)round(100.0f * material->pbr.emission_color.value_vec4.w)); + ufbxt_assert(12 == (int)round(100.0f * material->pbr.displacement_map.value_real)); + + ufbxt_assert_close_real(err, material->pbr.base_factor.value_real, 1.0f); + ufbxt_assert_close_real(err, material->pbr.emission_factor.value_real, 1.0f); + + ufbxt_check_material_texture(scene, material->pbr.base_color.texture, "checkerboard_diffuse.png", false); + ufbxt_check_material_texture(scene, material->pbr.metalness.texture, "checkerboard_metallic.png", false); + ufbxt_check_material_texture(scene, material->pbr.roughness.texture, "checkerboard_roughness.png", false); + ufbxt_check_material_texture(scene, material->pbr.ambient_occlusion.texture, "checkerboard_ambient.png", false); + ufbxt_check_material_texture(scene, material->pbr.normal_map.texture, "checkerboard_normal.png", false); + ufbxt_check_material_texture(scene, material->pbr.emission_color.texture, "checkerboard_emissive.png", false); + ufbxt_check_material_texture(scene, material->pbr.displacement_map.texture, "checkerboard_displacement.png", false); + ufbxt_check_material_texture(scene, material->pbr.opacity.texture, "checkerboard_transparency.png", false); + + ufbxt_assert(material->features.metalness.enabled); + ufbxt_assert(!material->features.specular.enabled); +} +#endif + +UFBXT_FILE_TEST(max_pbr_metal_gloss_material) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "01 - Default"); + ufbxt_assert(material); + + ufbxt_assert(material->shader_type == UFBX_SHADER_3DS_MAX_PBR_METAL_ROUGH); + + ufbxt_assert( 1 == (int)round(100.0f * material->pbr.base_color.value_vec4.x)); + ufbxt_assert( 2 == (int)round(100.0f * material->pbr.base_color.value_vec4.y)); + ufbxt_assert( 3 == (int)round(100.0f * material->pbr.base_color.value_vec4.z)); + ufbxt_assert( 4 == (int)round(100.0f * material->pbr.base_color.value_vec4.w)); + ufbxt_assert( 5 == (int)round(100.0f * material->pbr.metalness.value_real)); + ufbxt_assert( 6 == (int)round(100.0f * material->pbr.glossiness.value_real)); + // ufbxt_assert( 7 == (int)round(100.0f * material->pbr.normal_map.value_real)); (not in file?!) + ufbxt_assert( 8 == (int)round(100.0f * material->pbr.emission_color.value_vec4.x)); + ufbxt_assert( 9 == (int)round(100.0f * material->pbr.emission_color.value_vec4.y)); + ufbxt_assert(10 == (int)round(100.0f * material->pbr.emission_color.value_vec4.z)); + ufbxt_assert(11 == (int)round(100.0f * material->pbr.emission_color.value_vec4.w)); + ufbxt_assert(12 == (int)round(100.0f * material->pbr.displacement_map.value_real)); + + ufbxt_assert(100 - 6 == (int)round(100.0f * material->pbr.roughness.value_real)); + + ufbxt_assert_close_real(err, material->pbr.base_factor.value_real, 1.0f); + ufbxt_assert_close_real(err, material->pbr.emission_factor.value_real, 1.0f); + + ufbxt_check_material_texture(scene, material->pbr.base_color.texture, "checkerboard_diffuse.png", false); + ufbxt_check_material_texture(scene, material->pbr.metalness.texture, "checkerboard_metallic.png", false); + ufbxt_check_material_texture(scene, material->pbr.glossiness.texture, "checkerboard_roughness.png", false); + ufbxt_check_material_texture(scene, material->pbr.ambient_occlusion.texture, "checkerboard_ambient.png", false); + ufbxt_check_material_texture(scene, material->pbr.normal_map.texture, "checkerboard_normal.png", false); + ufbxt_check_material_texture(scene, material->pbr.emission_color.texture, "checkerboard_emissive.png", false); + ufbxt_check_material_texture(scene, material->pbr.displacement_map.texture, "checkerboard_displacement.png", false); + ufbxt_check_material_texture(scene, material->pbr.opacity.texture, "checkerboard_transparency.png", false); + + ufbxt_assert(material->pbr.roughness.texture == NULL); + + ufbxt_assert(material->features.metalness.enabled); + ufbxt_assert(!material->features.specular.enabled); +} +#endif + +UFBXT_FILE_TEST(max_pbr_spec_rough_material) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "02 - Default"); + ufbxt_assert(material); + + ufbxt_assert(material->shader_type == UFBX_SHADER_3DS_MAX_PBR_SPEC_GLOSS); + + ufbxt_assert( 1 == (int)round(100.0f * material->pbr.base_color.value_vec4.x)); + ufbxt_assert( 2 == (int)round(100.0f * material->pbr.base_color.value_vec4.y)); + ufbxt_assert( 3 == (int)round(100.0f * material->pbr.base_color.value_vec4.z)); + ufbxt_assert( 4 == (int)round(100.0f * material->pbr.base_color.value_vec4.w)); + ufbxt_assert( 5 == (int)round(100.0f * material->pbr.specular_color.value_vec4.x)); + ufbxt_assert( 6 == (int)round(100.0f * material->pbr.specular_color.value_vec4.y)); + ufbxt_assert( 7 == (int)round(100.0f * material->pbr.specular_color.value_vec4.z)); + ufbxt_assert( 8 == (int)round(100.0f * material->pbr.specular_color.value_vec4.w)); + ufbxt_assert( 9 == (int)round(100.0f * material->pbr.roughness.value_real)); + // ufbxt_assert(10 == (int)round(100.0f * material->pbr.normal_map.value_real)); (not in file?!) + ufbxt_assert(12 == (int)round(100.0f * material->pbr.emission_color.value_vec4.x)); + ufbxt_assert(13 == (int)round(100.0f * material->pbr.emission_color.value_vec4.y)); + ufbxt_assert(14 == (int)round(100.0f * material->pbr.emission_color.value_vec4.z)); + ufbxt_assert(15 == (int)round(100.0f * material->pbr.emission_color.value_vec4.w)); + ufbxt_assert(16 == (int)round(100.0f * material->pbr.displacement_map.value_real)); + + ufbxt_assert_close_real(err, material->pbr.base_factor.value_real, 1.0f); + ufbxt_assert_close_real(err, material->pbr.emission_factor.value_real, 1.0f); + + ufbxt_check_material_texture(scene, material->pbr.base_color.texture, "checkerboard_diffuse.png", false); + ufbxt_check_material_texture(scene, material->pbr.specular_color.texture, "checkerboard_specular.png", false); + ufbxt_check_material_texture(scene, material->pbr.roughness.texture, "checkerboard_weight.png", false); + ufbxt_check_material_texture(scene, material->pbr.ambient_occlusion.texture, "checkerboard_ambient.png", false); + ufbxt_check_material_texture(scene, material->pbr.normal_map.texture, "checkerboard_normal.png", false); + ufbxt_check_material_texture(scene, material->pbr.emission_color.texture, "checkerboard_emissive.png", false); + ufbxt_check_material_texture(scene, material->pbr.displacement_map.texture, "checkerboard_displacement.png", false); + ufbxt_check_material_texture(scene, material->pbr.opacity.texture, "checkerboard_transparency.png", false); + + ufbxt_assert(!material->features.metalness.enabled); + ufbxt_assert(material->features.specular.enabled); +} +#endif + +UFBXT_FILE_TEST(max_pbr_spec_gloss_material) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "02 - Default"); + ufbxt_assert(material); + + ufbxt_assert(material->shader_type == UFBX_SHADER_3DS_MAX_PBR_SPEC_GLOSS); + + ufbxt_assert( 1 == (int)round(100.0f * material->pbr.base_color.value_vec4.x)); + ufbxt_assert( 2 == (int)round(100.0f * material->pbr.base_color.value_vec4.y)); + ufbxt_assert( 3 == (int)round(100.0f * material->pbr.base_color.value_vec4.z)); + ufbxt_assert( 4 == (int)round(100.0f * material->pbr.base_color.value_vec4.w)); + ufbxt_assert( 5 == (int)round(100.0f * material->pbr.specular_color.value_vec4.x)); + ufbxt_assert( 6 == (int)round(100.0f * material->pbr.specular_color.value_vec4.y)); + ufbxt_assert( 7 == (int)round(100.0f * material->pbr.specular_color.value_vec4.z)); + ufbxt_assert( 8 == (int)round(100.0f * material->pbr.specular_color.value_vec4.w)); + ufbxt_assert( 9 == (int)round(100.0f * material->pbr.glossiness.value_real)); + // ufbxt_assert(10 == (int)round(100.0f * material->pbr.normal_map.value_real)); (not in file?!) + ufbxt_assert(12 == (int)round(100.0f * material->pbr.emission_color.value_vec4.x)); + ufbxt_assert(13 == (int)round(100.0f * material->pbr.emission_color.value_vec4.y)); + ufbxt_assert(14 == (int)round(100.0f * material->pbr.emission_color.value_vec4.z)); + ufbxt_assert(15 == (int)round(100.0f * material->pbr.emission_color.value_vec4.w)); + ufbxt_assert(16 == (int)round(100.0f * material->pbr.displacement_map.value_real)); + + ufbxt_assert(100 - 9 == (int)round(100.0f * material->pbr.roughness.value_real)); + + ufbxt_assert_close_real(err, material->pbr.base_factor.value_real, 1.0f); + ufbxt_assert_close_real(err, material->pbr.emission_factor.value_real, 1.0f); + + ufbxt_check_material_texture(scene, material->pbr.base_color.texture, "checkerboard_diffuse.png", false); + ufbxt_check_material_texture(scene, material->pbr.specular_color.texture, "checkerboard_specular.png", false); + ufbxt_check_material_texture(scene, material->pbr.glossiness.texture, "checkerboard_weight.png", false); + ufbxt_check_material_texture(scene, material->pbr.ambient_occlusion.texture, "checkerboard_ambient.png", false); + ufbxt_check_material_texture(scene, material->pbr.normal_map.texture, "checkerboard_normal.png", false); + ufbxt_check_material_texture(scene, material->pbr.emission_color.texture, "checkerboard_emissive.png", false); + ufbxt_check_material_texture(scene, material->pbr.displacement_map.texture, "checkerboard_displacement.png", false); + ufbxt_check_material_texture(scene, material->pbr.opacity.texture, "checkerboard_transparency.png", false); + + ufbxt_assert(material->pbr.roughness.texture == NULL); + + ufbxt_assert(!material->features.metalness.enabled); + ufbxt_assert(material->features.specular.enabled); +} +#endif + +UFBXT_FILE_TEST(max_gltf_material) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "01 - Default"); + ufbxt_assert(material); + + ufbxt_assert(material->shader_type == UFBX_SHADER_GLTF_MATERIAL); + + ufbxt_assert( 1 == (int)round(100.0f * material->pbr.base_color.value_vec4.x)); + ufbxt_assert( 2 == (int)round(100.0f * material->pbr.base_color.value_vec4.y)); + ufbxt_assert( 3 == (int)round(100.0f * material->pbr.base_color.value_vec4.z)); + ufbxt_assert( 4 == (int)round(100.0f * material->pbr.base_color.value_vec4.w)); + ufbxt_assert( 5 == (int)round(100.0f * material->pbr.metalness.value_real)); + ufbxt_assert( 6 == (int)round(100.0f * material->pbr.roughness.value_real)); + ufbxt_assert( 7 == (int)round(100.0f * material->pbr.normal_map.value_real)); + ufbxt_assert( 8 == (int)round(100.0f * material->pbr.ambient_occlusion.value_real)); + ufbxt_assert( 9 == (int)round(100.0f * material->pbr.emission_color.value_vec4.x)); + ufbxt_assert(10 == (int)round(100.0f * material->pbr.emission_color.value_vec4.y)); + ufbxt_assert(11 == (int)round(100.0f * material->pbr.emission_color.value_vec4.z)); + ufbxt_assert(12 == (int)round(100.0f * material->pbr.emission_color.value_vec4.w)); + ufbxt_assert(13 == (int)round(100.0f * material->pbr.coat_factor.value_real)); + ufbxt_assert(14 == (int)round(100.0f * material->pbr.coat_roughness.value_real)); + ufbxt_assert(15 == (int)round(100.0f * material->pbr.coat_normal.value_real)); + ufbxt_assert(16 == (int)round(100.0f * material->pbr.sheen_color.value_vec4.x)); + ufbxt_assert(17 == (int)round(100.0f * material->pbr.sheen_color.value_vec4.y)); + ufbxt_assert(18 == (int)round(100.0f * material->pbr.sheen_color.value_vec4.z)); + ufbxt_assert(19 == (int)round(100.0f * material->pbr.sheen_color.value_vec4.w)); + ufbxt_assert(20 == (int)round(100.0f * material->pbr.sheen_roughness.value_real)); + ufbxt_assert(21 == (int)round(100.0f * material->pbr.specular_factor.value_real)); + ufbxt_assert(22 == (int)round(100.0f * material->pbr.specular_color.value_vec4.x)); + ufbxt_assert(23 == (int)round(100.0f * material->pbr.specular_color.value_vec4.y)); + ufbxt_assert(24 == (int)round(100.0f * material->pbr.specular_color.value_vec4.z)); + ufbxt_assert(25 == (int)round(100.0f * material->pbr.specular_color.value_vec4.w)); + ufbxt_assert(26 == (int)round(100.0f * material->pbr.transmission_factor.value_real)); + // TODO? Volume + ufbxt_assert(133 == (int)round(100.0f * material->pbr.specular_ior.value_real)); + + ufbxt_assert_close_real(err, material->pbr.base_factor.value_real, 1.0f); + ufbxt_assert_close_real(err, material->pbr.emission_factor.value_real, 1.0f); + + ufbxt_check_material_texture(scene, material->pbr.base_color.texture, "checkerboard_diffuse.png", true); + ufbxt_check_material_texture(scene, material->pbr.opacity.texture, "checkerboard_transparency.png", true); + ufbxt_check_material_texture(scene, material->pbr.metalness.texture, "checkerboard_metallic.png", true); + ufbxt_check_material_texture(scene, material->pbr.roughness.texture, "checkerboard_roughness.png", true); + ufbxt_check_material_texture(scene, material->pbr.normal_map.texture, "checkerboard_normal.png", true); + ufbxt_check_material_texture(scene, material->pbr.ambient_occlusion.texture, "checkerboard_weight.png", true); + ufbxt_check_material_texture(scene, material->pbr.emission_color.texture, "checkerboard_emissive.png", true); + ufbxt_check_material_texture(scene, material->pbr.coat_factor.texture, "checkerboard_weight.png", true); + ufbxt_check_material_texture(scene, material->pbr.coat_roughness.texture, "checkerboard_roughness.png", true); + ufbxt_check_material_texture(scene, material->pbr.coat_normal.texture, "checkerboard_normal.png", true); + ufbxt_check_material_texture(scene, material->pbr.sheen_color.texture, "checkerboard_ambient.png", true); + ufbxt_check_material_texture(scene, material->pbr.sheen_roughness.texture, "checkerboard_roughness.png", true); + ufbxt_check_material_texture(scene, material->pbr.specular_factor.texture, "checkerboard_weight.png", true); + ufbxt_check_material_texture(scene, material->pbr.specular_color.texture, "checkerboard_specular.png", true); + ufbxt_check_material_texture(scene, material->pbr.transmission_factor.texture, "checkerboard_transparency.png", true); + + ufbxt_assert(material->features.metalness.enabled); + ufbxt_assert(!material->features.metalness.is_explicit); + ufbxt_assert(material->features.double_sided.enabled); + ufbxt_assert(material->features.double_sided.is_explicit); + ufbxt_assert(material->features.coat.enabled); + ufbxt_assert(material->features.coat.is_explicit); + ufbxt_assert(material->features.sheen.enabled); + ufbxt_assert(material->features.sheen.is_explicit); + ufbxt_assert(material->features.specular.enabled); + ufbxt_assert(material->features.specular.is_explicit); + ufbxt_assert(material->features.transmission.enabled); + ufbxt_assert(material->features.transmission.is_explicit); + ufbxt_assert(material->features.ior.enabled); + ufbxt_assert(material->features.ior.is_explicit); +} +#endif + +UFBXT_FILE_TEST(maya_shaderfx_pbs_material) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "StingrayPBS1"); + ufbxt_assert(material); + + ufbxt_assert(material->shader_type == UFBX_SHADER_SHADERFX_GRAPH); + + ufbxt_assert( 1 == (int)round(100.0f * material->pbr.base_color.value_vec3.x)); + ufbxt_assert( 2 == (int)round(100.0f * material->pbr.base_color.value_vec3.y)); + ufbxt_assert( 3 == (int)round(100.0f * material->pbr.base_color.value_vec3.z)); + ufbxt_assert( 4 == (int)round(100.0f * material->pbr.metalness.value_vec3.x)); + ufbxt_assert( 5 == (int)round(100.0f * material->pbr.roughness.value_vec3.x)); + ufbxt_assert( 6 == (int)round(100.0f * material->pbr.emission_color.value_vec3.x)); + ufbxt_assert( 7 == (int)round(100.0f * material->pbr.emission_color.value_vec3.y)); + ufbxt_assert( 8 == (int)round(100.0f * material->pbr.emission_color.value_vec3.z)); + ufbxt_assert( 9 == (int)round(100.0f * material->pbr.emission_factor.value_real)); + ufbxt_assert_close_real(err, material->pbr.base_factor.value_real, 1.0f); + + ufbxt_check_material_texture(scene, material->pbr.base_color.texture, "checkerboard_diffuse.png", true); + ufbxt_check_material_texture(scene, material->pbr.normal_map.texture, "checkerboard_normal.png", true); + ufbxt_check_material_texture(scene, material->pbr.metalness.texture, "checkerboard_metallic.png", true); + ufbxt_check_material_texture(scene, material->pbr.roughness.texture, "checkerboard_roughness.png", true); + ufbxt_check_material_texture(scene, material->pbr.emission_color.texture, "checkerboard_emissive.png", true); + ufbxt_check_material_texture(scene, material->pbr.ambient_occlusion.texture, "checkerboard_weight.png", true); + + ufbxt_assert(material->pbr.base_color.texture_enabled == true); + ufbxt_assert(material->pbr.normal_map.texture_enabled == false); + ufbxt_assert(material->pbr.metalness.texture_enabled == true); + ufbxt_assert(material->pbr.roughness.texture_enabled == false); + ufbxt_assert(material->pbr.emission_color.texture_enabled == true); + ufbxt_assert(material->pbr.ambient_occlusion.texture_enabled == false); + + ufbx_shader *shader = material->shader; + ufbxt_assert(shader); + + if (scene->metadata.version >= 7000) { + ufbx_blob blob = ufbx_find_blob(&shader->props, "ShaderGraph", ufbx_empty_blob); + ufbxt_assert(blob.size == 32918); + uint32_t hash_ref = ufbxt_fnv1a(blob.data, blob.size); + ufbxt_assert(hash_ref == 0x7be121c5u); + } +} +#endif + +UFBXT_FILE_TEST(blender_279_internal_textures) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Material.001"); + ufbxt_assert(material); + ufbxt_assert(material->textures.count == 5); + + ufbxt_assert(material->shader_type == UFBX_SHADER_FBX_PHONG); + ufbxt_assert(!strcmp(material->fbx.diffuse_color.texture->relative_filename.data, "textures\\checkerboard_diffuse.png")); + ufbxt_assert(!strcmp(material->fbx.specular_color.texture->relative_filename.data, "textures\\checkerboard_specular.png")); + ufbxt_assert(!strcmp(material->fbx.specular_factor.texture->relative_filename.data, "textures\\checkerboard_weight.png")); + ufbxt_assert(!strcmp(material->fbx.ambient_factor.texture->relative_filename.data, "textures\\checkerboard_ambient.png")); + ufbxt_assert(!strcmp(material->fbx.emission_factor.texture->relative_filename.data, "textures\\checkerboard_emissive.png")); +} +#endif + +UFBXT_FILE_TEST(blender_293_textures) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Material.001"); + ufbxt_assert(material); + ufbxt_assert(material->textures.count == 5); + + ufbxt_assert(material->shader_type == UFBX_SHADER_BLENDER_PHONG); + ufbxt_assert(!strcmp(material->pbr.base_color.texture->relative_filename.data, "textures\\checkerboard_diffuse.png")); + ufbxt_assert(!strcmp(material->pbr.roughness.texture->relative_filename.data, "textures\\checkerboard_roughness.png")); + ufbxt_assert(!strcmp(material->pbr.metalness.texture->relative_filename.data, "textures\\checkerboard_metallic.png")); + ufbxt_assert(!strcmp(material->pbr.emission_color.texture->relative_filename.data, "textures\\checkerboard_emissive.png")); + ufbxt_assert(!strcmp(material->pbr.opacity.texture->relative_filename.data, "textures\\checkerboard_weight.png")); +} +#endif + +UFBXT_FILE_TEST(blender_293_embedded_textures) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Material.001"); + ufbxt_assert(material); + ufbxt_assert(material->textures.count == 5); + + ufbxt_assert(material->shader_type == UFBX_SHADER_BLENDER_PHONG); + ufbxt_check_texture_content(scene, material->pbr.base_color.texture, "checkerboard_diffuse.png"); + ufbxt_check_texture_content(scene, material->pbr.roughness.texture, "checkerboard_roughness.png"); + ufbxt_check_texture_content(scene, material->pbr.metalness.texture, "checkerboard_metallic.png"); + ufbxt_check_texture_content(scene, material->pbr.emission_color.texture, "checkerboard_emissive.png"); + ufbxt_check_texture_content(scene, material->pbr.opacity.texture, "checkerboard_weight.png"); +} +#endif + +UFBXT_FILE_TEST(blender_293_material_mapping) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Material.001"); + ufbxt_assert(material); + + ufbxt_assert(material->shader_type == UFBX_SHADER_BLENDER_PHONG); + ufbxt_assert_close_real(err, material->fbx.specular_exponent.value_vec3.x, 76.913f); + ufbxt_assert_close_real(err, material->fbx.transparency_factor.value_vec3.x, 0.544f); + ufbxt_assert_close_real(err, material->pbr.opacity.value_vec3.x, 0.456f); + ufbxt_assert_close_real(err, material->pbr.roughness.value_vec3.x, 0.123f); +} +#endif + +UFBXT_FILE_TEST(maya_different_shaders) +#if UFBXT_IMPL +{ + ufbx_material *lambert1 = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "lambert1"); + ufbx_material *phong1 = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "phong1"); + ufbx_material *arnold = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "aiStandardSurface1"); + ufbxt_assert(lambert1 && phong1 && arnold); + + ufbx_vec3 r = { 1.0f, 0.0f, 0.0f }; + ufbx_vec3 g = { 0.0f, 1.0f, 0.0f }; + ufbx_vec3 b = { 0.0f, 0.0f, 1.0f }; + + ufbxt_assert(lambert1->shader_type == UFBX_SHADER_FBX_LAMBERT); + ufbxt_assert(!strcmp(lambert1->shading_model_name.data, "lambert")); + ufbxt_assert_close_vec3(err, lambert1->fbx.diffuse_color.value_vec3, g); + ufbxt_assert_close_vec3(err, lambert1->pbr.base_color.value_vec3, g); + ufbxt_assert_close_real(err, lambert1->pbr.specular_factor.value_vec3.x, 0.0f); + + ufbxt_assert(phong1->shader_type == UFBX_SHADER_FBX_PHONG); + ufbxt_assert(!strcmp(phong1->shading_model_name.data, "phong")); + ufbxt_assert_close_vec3(err, phong1->fbx.diffuse_color.value_vec3, b); + ufbxt_assert_close_vec3(err, phong1->pbr.base_color.value_vec3, b); + ufbxt_assert_close_real(err, phong1->pbr.specular_factor.value_vec3.x, 1.0f); + + ufbxt_assert(arnold->shader_type == UFBX_SHADER_ARNOLD_STANDARD_SURFACE); + ufbxt_assert(!strcmp(arnold->shading_model_name.data, "unknown")); + ufbxt_assert_close_vec3(err, arnold->pbr.base_color.value_vec3, r); +} +#endif + +UFBXT_TEST(blender_phong_quirks) +#if UFBXT_IMPL +{ + for (int quirks = 0; quirks <= 1; quirks++) { + ufbx_load_opts opts = { 0 }; + opts.disable_quirks = (quirks == 0); + + char buf[512]; + snprintf(buf, sizeof(buf), "%s%s", data_root, "blender_293_textures_7400_binary.fbx"); + + ufbx_scene *scene = ufbx_load_file(buf, &opts, NULL); + ufbxt_assert(scene); + + // Exporter should be detected even with quirks off + ufbxt_assert(scene->metadata.exporter == UFBX_EXPORTER_BLENDER_BINARY); + ufbxt_assert(scene->metadata.exporter_version == ufbx_pack_version(4, 22, 0)); + + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Material.001"); + ufbxt_assert(material); + if (quirks) { + ufbxt_assert(material->shader_type == UFBX_SHADER_BLENDER_PHONG); + } else { + ufbxt_assert(material->shader_type == UFBX_SHADER_FBX_PHONG); + } + + ufbx_free_scene(scene); + } +} +#endif + +UFBXT_FILE_TEST(maya_phong_properties) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "phong1"); + ufbxt_assert(material); + ufbxt_assert(material->shader_type == UFBX_SHADER_FBX_PHONG); + + ufbxt_assert( 1 == (int)round(100.0f * material->fbx.diffuse_color.value_vec3.x)); + ufbxt_assert( 2 == (int)round(100.0f * material->fbx.diffuse_color.value_vec3.y)); + ufbxt_assert( 3 == (int)round(100.0f * material->fbx.diffuse_color.value_vec3.z)); + ufbxt_assert( 4 == (int)round(100.0f * material->fbx.transparency_color.value_vec3.x)); + ufbxt_assert( 5 == (int)round(100.0f * material->fbx.transparency_color.value_vec3.y)); + ufbxt_assert( 6 == (int)round(100.0f * material->fbx.transparency_color.value_vec3.z)); + ufbxt_assert( 7 == (int)round(100.0f * material->fbx.ambient_color.value_vec3.x)); + ufbxt_assert( 8 == (int)round(100.0f * material->fbx.ambient_color.value_vec3.y)); + ufbxt_assert( 9 == (int)round(100.0f * material->fbx.ambient_color.value_vec3.z)); + ufbxt_assert(10 == (int)round(100.0f * material->fbx.emission_color.value_vec3.x)); + ufbxt_assert(11 == (int)round(100.0f * material->fbx.emission_color.value_vec3.y)); + ufbxt_assert(12 == (int)round(100.0f * material->fbx.emission_color.value_vec3.z)); + ufbxt_assert(13 == (int)round(100.0f * material->fbx.diffuse_factor.value_vec3.x)); + ufbxt_assert(17 == (int)round( 1.0f * material->fbx.specular_exponent.value_vec3.x)); + ufbxt_assert(18 == (int)round(100.0f * material->fbx.specular_color.value_vec3.x)); + ufbxt_assert(19 == (int)round(100.0f * material->fbx.specular_color.value_vec3.y)); + ufbxt_assert(20 == (int)round(100.0f * material->fbx.specular_color.value_vec3.z)); + ufbxt_assert(21 == (int)round(100.0f * material->fbx.reflection_factor.value_vec3.x)); + ufbxt_assert(22 == (int)round(100.0f * material->fbx.reflection_color.value_vec3.x)); + ufbxt_assert(23 == (int)round(100.0f * material->fbx.reflection_color.value_vec3.y)); + ufbxt_assert(24 == (int)round(100.0f * material->fbx.reflection_color.value_vec3.z)); + + ufbxt_assert( 1 == (int)round(100.0f * material->pbr.base_color.value_vec3.x)); + ufbxt_assert( 2 == (int)round(100.0f * material->pbr.base_color.value_vec3.y)); + ufbxt_assert( 3 == (int)round(100.0f * material->pbr.base_color.value_vec3.z)); + ufbxt_assert(13 == (int)round(100.0f * material->pbr.base_factor.value_vec3.x)); + ufbxt_assert_close_real(err, material->pbr.metalness.value_real, 0.0f); + ufbxt_assert_close_real(err, material->pbr.roughness.value_real, 0.587689f); +} +#endif + +UFBXT_FILE_TEST(maya_arnold_properties) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "aiStandardSurface1"); + ufbxt_assert(material); + ufbxt_assert(material->shader_type == UFBX_SHADER_ARNOLD_STANDARD_SURFACE); + + ufbxt_assert( 1 == (int)round(100.0f * material->pbr.base_factor.value_vec3.x)); + ufbxt_assert( 2 == (int)round(100.0f * material->pbr.base_color.value_vec3.x)); + ufbxt_assert( 3 == (int)round(100.0f * material->pbr.base_color.value_vec3.y)); + ufbxt_assert( 4 == (int)round(100.0f * material->pbr.base_color.value_vec3.z)); + ufbxt_assert( 5 == (int)round(100.0f * material->pbr.diffuse_roughness.value_vec3.x)); + ufbxt_assert( 6 == (int)round(100.0f * material->pbr.metalness.value_vec3.x)); + ufbxt_assert( 7 == (int)round(100.0f * material->pbr.specular_factor.value_vec3.x)); + ufbxt_assert( 8 == (int)round(100.0f * material->pbr.specular_color.value_vec3.x)); + ufbxt_assert( 9 == (int)round(100.0f * material->pbr.specular_color.value_vec3.y)); + ufbxt_assert(10 == (int)round(100.0f * material->pbr.specular_color.value_vec3.z)); + ufbxt_assert(11 == (int)round(100.0f * material->pbr.roughness.value_vec3.x)); + ufbxt_assert(12 == (int)round(100.0f * material->pbr.specular_ior.value_vec3.x)); + ufbxt_assert(13 == (int)round(100.0f * material->pbr.specular_anisotropy.value_vec3.x)); + ufbxt_assert(14 == (int)round(100.0f * material->pbr.specular_rotation.value_vec3.x)); + ufbxt_assert(15 == (int)round(100.0f * material->pbr.transmission_factor.value_vec3.x)); + ufbxt_assert(16 == (int)round(100.0f * material->pbr.transmission_color.value_vec3.x)); + ufbxt_assert(17 == (int)round(100.0f * material->pbr.transmission_color.value_vec3.y)); + ufbxt_assert(18 == (int)round(100.0f * material->pbr.transmission_color.value_vec3.z)); + ufbxt_assert(19 == (int)round(100.0f * material->pbr.transmission_depth.value_vec3.x)); + ufbxt_assert(20 == (int)round(100.0f * material->pbr.transmission_scatter.value_vec3.x)); + ufbxt_assert(21 == (int)round(100.0f * material->pbr.transmission_scatter.value_vec3.y)); + ufbxt_assert(22 == (int)round(100.0f * material->pbr.transmission_scatter.value_vec3.z)); + ufbxt_assert(23 == (int)round(100.0f * material->pbr.transmission_scatter_anisotropy.value_vec3.x)); + ufbxt_assert(24 == (int)round(100.0f * material->pbr.transmission_dispersion.value_vec3.x)); + ufbxt_assert(25 == (int)round(100.0f * material->pbr.transmission_extra_roughness.value_vec3.x)); + ufbxt_assert(26 == (int)round(100.0f * material->pbr.subsurface_factor.value_vec3.x)); + ufbxt_assert(27 == (int)round(100.0f * material->pbr.subsurface_color.value_vec3.x)); + ufbxt_assert(28 == (int)round(100.0f * material->pbr.subsurface_color.value_vec3.y)); + ufbxt_assert(29 == (int)round(100.0f * material->pbr.subsurface_color.value_vec3.z)); + ufbxt_assert(30 == (int)round(100.0f * material->pbr.subsurface_radius.value_vec3.x)); + ufbxt_assert(31 == (int)round(100.0f * material->pbr.subsurface_radius.value_vec3.y)); + ufbxt_assert(32 == (int)round(100.0f * material->pbr.subsurface_radius.value_vec3.z)); + ufbxt_assert(33 == (int)round(100.0f * material->pbr.subsurface_scale.value_vec3.x)); + ufbxt_assert(34 == (int)round(100.0f * material->pbr.subsurface_anisotropy.value_vec3.x)); + ufbxt_assert(35 == (int)round(100.0f * material->pbr.coat_factor.value_vec3.x)); + ufbxt_assert(36 == (int)round(100.0f * material->pbr.coat_color.value_vec3.x)); + ufbxt_assert(37 == (int)round(100.0f * material->pbr.coat_color.value_vec3.y)); + ufbxt_assert(38 == (int)round(100.0f * material->pbr.coat_color.value_vec3.z)); + ufbxt_assert(39 == (int)round(100.0f * material->pbr.coat_roughness.value_vec3.x)); + ufbxt_assert(40 == (int)round(100.0f * material->pbr.coat_ior.value_vec3.x)); + ufbxt_assert(41 == (int)round(100.0f * material->pbr.coat_anisotropy.value_vec3.x)); + ufbxt_assert(42 == (int)round(100.0f * material->pbr.coat_rotation.value_vec3.x)); + ufbxt_assert(43 == (int)round(100.0f * material->pbr.coat_normal.value_vec3.x)); + ufbxt_assert(44 == (int)round(100.0f * material->pbr.coat_normal.value_vec3.y)); + ufbxt_assert(45 == (int)round(100.0f * material->pbr.coat_normal.value_vec3.z)); + ufbxt_assert(46 == (int)round(100.0f * material->pbr.sheen_factor.value_vec3.x)); + ufbxt_assert(47 == (int)round(100.0f * material->pbr.sheen_color.value_vec3.x)); + ufbxt_assert(48 == (int)round(100.0f * material->pbr.sheen_color.value_vec3.y)); + ufbxt_assert(49 == (int)round(100.0f * material->pbr.sheen_color.value_vec3.z)); + ufbxt_assert(50 == (int)round(100.0f * material->pbr.sheen_roughness.value_vec3.x)); + ufbxt_assert(51 == (int)round(100.0f * material->pbr.emission_factor.value_vec3.x)); + ufbxt_assert(52 == (int)round(100.0f * material->pbr.emission_color.value_vec3.x)); + ufbxt_assert(53 == (int)round(100.0f * material->pbr.emission_color.value_vec3.y)); + ufbxt_assert(54 == (int)round(100.0f * material->pbr.emission_color.value_vec3.z)); + ufbxt_assert(55 == (int)round(100.0f * material->pbr.thin_film_thickness.value_vec3.x)); + ufbxt_assert(56 == (int)round(100.0f * material->pbr.thin_film_ior.value_vec3.x)); + ufbxt_assert(57 == (int)round(100.0f * material->pbr.opacity.value_vec3.x)); + ufbxt_assert(58 == (int)round(100.0f * material->pbr.opacity.value_vec3.y)); + ufbxt_assert(59 == (int)round(100.0f * material->pbr.opacity.value_vec3.z)); + ufbxt_assert(60 == (int)round(100.0f * material->pbr.tangent_map.value_vec3.x)); + ufbxt_assert(61 == (int)round(100.0f * material->pbr.tangent_map.value_vec3.y)); + ufbxt_assert(62 == (int)round(100.0f * material->pbr.tangent_map.value_vec3.z)); + ufbxt_assert(63 == (int)round(100.0f * material->pbr.indirect_diffuse.value_vec3.x)); + ufbxt_assert(64 == (int)round(100.0f * material->pbr.indirect_specular.value_vec3.x)); + ufbxt_assert(65 == (int)round(100.0f * material->pbr.matte_color.value_vec3.x)); + ufbxt_assert(66 == (int)round(100.0f * material->pbr.matte_color.value_vec3.y)); + ufbxt_assert(67 == (int)round(100.0f * material->pbr.matte_color.value_vec3.z)); + ufbxt_assert(68 == (int)round(100.0f * material->pbr.matte_factor.value_vec3.x)); + ufbxt_assert(69 == material->pbr.transmission_priority.value_int); + + // Computed + ufbxt_assert_close_real(err, material->pbr.transmission_roughness.value_real, 0.36f); // 11+25 + + ufbxt_assert(material->pbr.base_factor.value_components == 1); + ufbxt_assert(material->pbr.base_color.value_components == 3); + ufbxt_assert(material->pbr.specular_factor.value_components == 1); + ufbxt_assert(material->pbr.specular_color.value_components == 3); + ufbxt_assert(material->pbr.roughness.value_components == 1); + ufbxt_assert(material->pbr.metalness.value_components == 1); + ufbxt_assert(material->pbr.diffuse_roughness.value_components == 1); + ufbxt_assert(material->pbr.specular_anisotropy.value_components == 1); + ufbxt_assert(material->pbr.specular_rotation.value_components == 1); + ufbxt_assert(material->pbr.transmission_factor.value_components == 1); + ufbxt_assert(material->pbr.transmission_color.value_components == 3); + ufbxt_assert(material->pbr.transmission_roughness.value_components == 0); + ufbxt_assert(material->pbr.specular_ior.value_components == 1); + ufbxt_assert(material->pbr.subsurface_factor.value_components == 1); + ufbxt_assert(material->pbr.subsurface_tint_color.value_components == 0); + ufbxt_assert(material->pbr.subsurface_color.value_components == 3); + ufbxt_assert(material->pbr.subsurface_radius.value_components == 3); + ufbxt_assert(material->pbr.subsurface_scale.value_components == 1); + ufbxt_assert(material->pbr.emission_factor.value_components == 1); + ufbxt_assert(material->pbr.emission_color.value_components == 3); + ufbxt_assert(material->pbr.coat_factor.value_components == 1); + ufbxt_assert(material->pbr.coat_color.value_components == 3); + ufbxt_assert(material->pbr.coat_roughness.value_components == 1); + ufbxt_assert(material->pbr.normal_map.value_components == 3); + ufbxt_assert(material->pbr.coat_normal.value_components == 3); + ufbxt_assert(material->pbr.displacement_map.value_components == 0); + ufbxt_assert(material->pbr.opacity.value_components == 3); + + ufbxt_assert(material->pbr.subsurface_type.value_int == 1); + ufbxt_assert(material->pbr.transmission_enable_in_aov.value_int != 0); + ufbxt_assert(material->features.thin_walled.enabled); + ufbxt_assert(material->features.thin_walled.is_explicit); + ufbxt_assert(material->features.matte.enabled); + ufbxt_assert(material->features.matte.is_explicit); + ufbxt_assert(material->features.caustics.enabled); + ufbxt_assert(material->features.caustics.is_explicit); + ufbxt_assert(material->features.internal_reflections.enabled); + ufbxt_assert(material->features.internal_reflections.is_explicit); + ufbxt_assert(material->features.exit_to_background.enabled); + ufbxt_assert(material->features.exit_to_background.is_explicit); +} +#endif + +UFBXT_FILE_TEST(maya_osl_properties) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "standardSurface2"); + ufbxt_assert(material); + ufbxt_assert(material->shader_type == UFBX_SHADER_OSL_STANDARD_SURFACE); + + ufbxt_assert( 1 == (int)round(100.0f * material->pbr.base_factor.value_vec3.x)); + ufbxt_assert( 2 == (int)round(100.0f * material->pbr.base_color.value_vec3.x)); + ufbxt_assert( 3 == (int)round(100.0f * material->pbr.base_color.value_vec3.y)); + ufbxt_assert( 4 == (int)round(100.0f * material->pbr.base_color.value_vec3.z)); + ufbxt_assert( 5 == (int)round(100.0f * material->pbr.diffuse_roughness.value_vec3.x)); + ufbxt_assert( 6 == (int)round(100.0f * material->pbr.metalness.value_vec3.x)); + ufbxt_assert( 7 == (int)round(100.0f * material->pbr.specular_factor.value_vec3.x)); + ufbxt_assert( 8 == (int)round(100.0f * material->pbr.specular_color.value_vec3.x)); + ufbxt_assert( 9 == (int)round(100.0f * material->pbr.specular_color.value_vec3.y)); + ufbxt_assert(10 == (int)round(100.0f * material->pbr.specular_color.value_vec3.z)); + ufbxt_assert(11 == (int)round(100.0f * material->pbr.roughness.value_vec3.x)); + ufbxt_assert(12 == (int)round(100.0f * material->pbr.specular_ior.value_vec3.x)); + ufbxt_assert(13 == (int)round(100.0f * material->pbr.specular_anisotropy.value_vec3.x)); + ufbxt_assert(14 == (int)round(100.0f * material->pbr.specular_rotation.value_vec3.x)); + ufbxt_assert(15 == (int)round(100.0f * material->pbr.transmission_factor.value_vec3.x)); + ufbxt_assert(16 == (int)round(100.0f * material->pbr.transmission_color.value_vec3.x)); + ufbxt_assert(17 == (int)round(100.0f * material->pbr.transmission_color.value_vec3.y)); + ufbxt_assert(18 == (int)round(100.0f * material->pbr.transmission_color.value_vec3.z)); + ufbxt_assert(19 == (int)round(100.0f * material->pbr.transmission_depth.value_vec3.x)); + ufbxt_assert(20 == (int)round(100.0f * material->pbr.transmission_scatter.value_vec3.x)); + ufbxt_assert(21 == (int)round(100.0f * material->pbr.transmission_scatter.value_vec3.y)); + ufbxt_assert(22 == (int)round(100.0f * material->pbr.transmission_scatter.value_vec3.z)); + ufbxt_assert(23 == (int)round(100.0f * material->pbr.transmission_scatter_anisotropy.value_vec3.x)); + ufbxt_assert(24 == (int)round(100.0f * material->pbr.transmission_dispersion.value_vec3.x)); + ufbxt_assert(25 == (int)round(100.0f * material->pbr.transmission_extra_roughness.value_vec3.x)); + ufbxt_assert(26 == (int)round(100.0f * material->pbr.subsurface_factor.value_vec3.x)); + ufbxt_assert(27 == (int)round(100.0f * material->pbr.subsurface_color.value_vec3.x)); + ufbxt_assert(28 == (int)round(100.0f * material->pbr.subsurface_color.value_vec3.y)); + ufbxt_assert(29 == (int)round(100.0f * material->pbr.subsurface_color.value_vec3.z)); + ufbxt_assert(30 == (int)round(100.0f * material->pbr.subsurface_radius.value_vec3.x)); + ufbxt_assert(31 == (int)round(100.0f * material->pbr.subsurface_radius.value_vec3.y)); + ufbxt_assert(32 == (int)round(100.0f * material->pbr.subsurface_radius.value_vec3.z)); + ufbxt_assert(33 == (int)round(100.0f * material->pbr.subsurface_scale.value_vec3.x)); + ufbxt_assert(34 == (int)round(100.0f * material->pbr.subsurface_anisotropy.value_vec3.x)); + ufbxt_assert(35 == (int)round(100.0f * material->pbr.coat_factor.value_vec3.x)); + ufbxt_assert(36 == (int)round(100.0f * material->pbr.coat_color.value_vec3.x)); + ufbxt_assert(37 == (int)round(100.0f * material->pbr.coat_color.value_vec3.y)); + ufbxt_assert(38 == (int)round(100.0f * material->pbr.coat_color.value_vec3.z)); + ufbxt_assert(39 == (int)round(100.0f * material->pbr.coat_roughness.value_vec3.x)); + ufbxt_assert(40 == (int)round(100.0f * material->pbr.coat_ior.value_vec3.x)); + ufbxt_assert(41 == (int)round(100.0f * material->pbr.coat_anisotropy.value_vec3.x)); + ufbxt_assert(42 == (int)round(100.0f * material->pbr.coat_rotation.value_vec3.x)); + // Not used: ufbxt_assert(43 == (int)round(100.0f * material->pbr.coat_normal.value_vec3.x)); + // Not used: ufbxt_assert(44 == (int)round(100.0f * material->pbr.coat_normal.value_vec3.y)); + // Not used: ufbxt_assert(45 == (int)round(100.0f * material->pbr.coat_normal.value_vec3.z)); + ufbxt_assert(46 == (int)round(100.0f * material->pbr.sheen_factor.value_vec3.x)); + ufbxt_assert(47 == (int)round(100.0f * material->pbr.sheen_color.value_vec3.x)); + ufbxt_assert(48 == (int)round(100.0f * material->pbr.sheen_color.value_vec3.y)); + ufbxt_assert(49 == (int)round(100.0f * material->pbr.sheen_color.value_vec3.z)); + ufbxt_assert(50 == (int)round(100.0f * material->pbr.sheen_roughness.value_vec3.x)); + ufbxt_assert(51 == (int)round(100.0f * material->pbr.emission_factor.value_vec3.x)); + ufbxt_assert(52 == (int)round(100.0f * material->pbr.emission_color.value_vec3.x)); + ufbxt_assert(53 == (int)round(100.0f * material->pbr.emission_color.value_vec3.y)); + ufbxt_assert(54 == (int)round(100.0f * material->pbr.emission_color.value_vec3.z)); + ufbxt_assert(55 == (int)round(100.0f * material->pbr.thin_film_thickness.value_vec3.x)); + ufbxt_assert(56 == (int)round(100.0f * material->pbr.thin_film_ior.value_vec3.x)); + ufbxt_assert(57 == (int)round(100.0f * material->pbr.opacity.value_vec3.x)); + ufbxt_assert(58 == (int)round(100.0f * material->pbr.opacity.value_vec3.y)); + ufbxt_assert(59 == (int)round(100.0f * material->pbr.opacity.value_vec3.z)); + + // Computed + ufbxt_assert_close_real(err, material->pbr.transmission_roughness.value_real, 0.36f); // 11+25 + + ufbxt_assert(material->features.thin_walled.enabled); + ufbxt_assert(material->features.thin_walled.is_explicit); +} +#endif + +UFBXT_FILE_TEST(maya_texture_layers) +#if UFBXT_IMPL +{ + // TODO: Recover layered textures from <7000..... + if (scene->metadata.version < 7000) return; + + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh && node->mesh->materials.count == 1); + ufbx_material *material = node->mesh->materials.data[0].material; + + ufbx_texture *layered = material->fbx.diffuse_color.texture; + ufbxt_assert(layered); + ufbxt_assert(layered->type == UFBX_TEXTURE_LAYERED); + ufbxt_assert(layered->layers.count == 3); + ufbxt_assert(layered->layers.data[0].blend_mode == UFBX_BLEND_MULTIPLY); + ufbxt_assert_close_real(err, layered->layers.data[0].alpha, 0.75f); + ufbxt_assert(!strcmp(layered->layers.data[0].texture->relative_filename.data, "textures\\checkerboard_weight.png")); + ufbxt_assert(layered->layers.data[1].blend_mode == UFBX_BLEND_OVER); + ufbxt_assert_close_real(err, layered->layers.data[1].alpha, 0.5f); + ufbxt_assert(!strcmp(layered->layers.data[1].texture->relative_filename.data, "textures\\checkerboard_diffuse.png")); + ufbxt_assert(layered->layers.data[2].blend_mode == UFBX_BLEND_ADDITIVE); + ufbxt_assert_close_real(err, layered->layers.data[2].alpha, 1.0f); + ufbxt_assert(!strcmp(layered->layers.data[2].texture->relative_filename.data, "textures\\checkerboard_ambient.png")); + + ufbxt_assert(layered->file_textures.count == 3); + for (size_t i = 0; i < 3; i++) { + ufbxt_assert(layered->file_textures.data[i] == layered->layers.data[i].texture); + } + + { + ufbx_texture *texture = material->fbx.emission_color.texture; + ufbxt_assert(texture); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_emissive.png")); + ufbxt_assert_close_real(err, texture->uv_transform.translation.x, 1.0f); + ufbxt_assert_close_real(err, texture->uv_transform.translation.y, 2.0f); + ufbxt_assert_close_real(err, texture->uv_transform.translation.z, 0.0f); + + ufbx_vec3 uv = { 0.5f, 0.5f, 0.0f }; + uv = ufbx_transform_position(&texture->uv_to_texture, uv); + ufbxt_assert_close_real(err, uv.x, -0.5f); + ufbxt_assert_close_real(err, uv.y, -1.5f); + ufbxt_assert_close_real(err, uv.z, 0.0f); + } + + { + ufbx_texture *texture = material->fbx.transparency_color.texture; + ufbxt_assert(texture); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_transparency.png")); + ufbxt_assert_close_real(err, texture->uv_transform.translation.x, 0.5f); + ufbxt_assert_close_real(err, texture->uv_transform.translation.y, -0.20710678f); + ufbxt_assert_close_real(err, texture->uv_transform.translation.z, 0.0f); + ufbx_vec3 euler = ufbx_quat_to_euler(texture->uv_transform.rotation, UFBX_ROTATION_ORDER_XYZ); + ufbxt_assert_close_real(err, euler.x, 0.0f); + ufbxt_assert_close_real(err, euler.y, 0.0f); + ufbxt_assert_close_real(err, euler.z, 45.0f); + + { + ufbx_vec3 uv = { 0.5f, 0.5f, 0.0f }; + uv = ufbx_transform_position(&texture->uv_to_texture, uv); + ufbxt_assert_close_real(err, uv.x, 0.5f); + ufbxt_assert_close_real(err, uv.y, 0.5f); + ufbxt_assert_close_real(err, uv.z, 0.0f); + } + + { + ufbx_vec3 uv = { 1.0f, 0.5f, 0.0f }; + uv = ufbx_transform_position(&texture->uv_to_texture, uv); + ufbxt_assert_close_real(err, uv.x, 0.853553f); + ufbxt_assert_close_real(err, uv.y, 0.146447f); + ufbxt_assert_close_real(err, uv.z, 0.0f); + } + } +} +#endif + +UFBXT_FILE_TEST(maya_texture_blend_modes) +#if UFBXT_IMPL +{ + // TODO: Recover layered textures from <7000..... + if (scene->metadata.version < 7000) return; + + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh && node->mesh->materials.count == 1); + ufbx_material *material = node->mesh->materials.data[0].material; + + ufbx_texture *layered = material->fbx.diffuse_color.texture; + ufbxt_assert(layered); + ufbxt_assert(layered->type == UFBX_TEXTURE_LAYERED); + ufbxt_assert(layered->layers.count == 14); + + for (size_t i = 0; i < layered->layers.count; i++) { + ufbx_real alpha = i < 10 ? (ufbx_real)(i + 1) * 0.1f : 1.0f; + size_t ix = layered->layers.count - i - 1; + ufbxt_assert_close_real(err, layered->layers.data[ix].alpha, alpha); + } + + // All point to the same texture and should be deduplicated + ufbxt_assert(layered->file_textures.count == 1); + for (size_t i = 0; i < 14; i++) { + ufbxt_assert(layered->layers.data[i].texture == layered->file_textures.data[0]); + } + + ufbxt_assert(layered->layers.data[ 0].blend_mode == UFBX_BLEND_REPLACE); // "CPV Modulate" (unsupported) + ufbxt_assert(layered->layers.data[ 1].blend_mode == UFBX_BLEND_LUMINOSITY); // "Illuminate" + ufbxt_assert(layered->layers.data[ 2].blend_mode == UFBX_BLEND_REPLACE); // "Desaturate" (unsupported) + ufbxt_assert(layered->layers.data[ 3].blend_mode == UFBX_BLEND_SATURATION); // "Saturate" + ufbxt_assert(layered->layers.data[ 4].blend_mode == UFBX_BLEND_DARKEN); // "Darken" + ufbxt_assert(layered->layers.data[ 5].blend_mode == UFBX_BLEND_LIGHTEN); // "Lighten" + ufbxt_assert(layered->layers.data[ 6].blend_mode == UFBX_BLEND_DIFFERENCE); // "Difference" + ufbxt_assert(layered->layers.data[ 7].blend_mode == UFBX_BLEND_MULTIPLY); // "Multiply" + ufbxt_assert(layered->layers.data[ 8].blend_mode == UFBX_BLEND_SUBTRACT); // "Subtract" + ufbxt_assert(layered->layers.data[ 9].blend_mode == UFBX_BLEND_ADDITIVE); // "Add" + ufbxt_assert(layered->layers.data[10].blend_mode == UFBX_BLEND_REPLACE); // "Out" (unsupported) + ufbxt_assert(layered->layers.data[11].blend_mode == UFBX_BLEND_REPLACE); // "In" (unsupported) + ufbxt_assert(layered->layers.data[12].blend_mode == UFBX_BLEND_OVER); // "Over" + ufbxt_assert(layered->layers.data[13].blend_mode == UFBX_BLEND_REPLACE); // "None" +} +#endif + +UFBXT_FILE_TEST(max_texture_mapping) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "01 - Default"); + ufbxt_assert(material); + + { + ufbx_texture *texture = material->pbr.base_factor.texture; + ufbxt_assert(texture && texture->shader); + ufbx_shader_texture *shader = texture->shader; + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_weight.png")); + ufbxt_assert(shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(shader->shader_name.data, "OSLBitmap2")); + + uint32_t source_hash = ufbxt_fnv1a(shader->shader_source.data, shader->shader_source.length); + ufbxt_assert(source_hash == 0x599994a9u); + + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(texture->file_textures.data[0] == texture); + } + + { + ufbx_texture *texture = material->pbr.base_color.texture; + ufbxt_assert(texture && texture->shader); + ufbx_shader_texture *shader = texture->shader; + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(shader->shader_name.data, "RandomTilingBitmap")); + uint32_t source_hash = ufbxt_fnv1a(shader->shader_source.data, shader->shader_source.length); + ufbxt_assert(source_hash == 0x60186ba7u); + + { + ufbx_shader_texture_input *input = ufbx_find_shader_texture_input(shader, "Filename"); + ufbxt_assert(input); + ufbxt_assert(!strcmp(input->value_str.data, "D:\\Dev\\clean\\ufbx\\data\\textures\\checkerboard_diffuse.png")); + } + + { + ufbx_shader_texture_input *input = ufbx_find_shader_texture_input(shader, "Scale"); + ufbxt_assert(input); + ufbxt_assert_close_real(err, input->value_real, 0.25f); + } + + ufbxt_assert(texture->file_textures.count == 0); + } + + { + ufbx_texture *texture = material->pbr.roughness.texture; + ufbxt_assert(texture && texture->shader); + ufbx_shader_texture *shader = texture->shader; + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_roughness.png")); + ufbxt_assert(shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(shader->shader_name.data, "UberBitmap2")); + + uint32_t source_hash = ufbxt_fnv1a(shader->shader_source.data, shader->shader_source.length); + ufbxt_assert(source_hash == 0x19833d47); + + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(texture->file_textures.data[0] == texture); + } + + { + ufbx_texture *texture = material->pbr.metalness.texture; + ufbxt_assert(texture && !texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_metallic.png")); + + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(texture->file_textures.data[0] == texture); + } + + { + ufbx_texture *texture = material->pbr.transmission_color.texture; + ufbxt_assert(texture && texture->shader); + ufbx_shader_texture *shader = texture->shader; + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_transparency.png")); + ufbxt_assert(shader->type == UFBX_SHADER_TEXTURE_UNKNOWN); + ufbxt_assert(!strcmp(shader->shader_name.data, "ai_image")); + ufbxt_assert(shader->shader_source.length == 0); + + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(texture->file_textures.data[0] == texture); + } + + { + ufbx_texture *texture = material->pbr.transmission_color.texture; + ufbxt_assert(texture && texture->shader); + ufbx_shader_texture *shader = texture->shader; + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_transparency.png")); + ufbxt_assert(shader->type == UFBX_SHADER_TEXTURE_UNKNOWN); + ufbxt_assert(shader->shader_source.length == 0); + + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(texture->file_textures.data[0] == texture); + } + + { + ufbx_texture *texture = material->pbr.emission_color.texture; + ufbxt_assert(texture && texture->shader); + ufbx_shader_texture *shader = texture->shader; + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(shader->shader_name.data, "ColorTweak")); + + uint32_t source_hash = ufbxt_fnv1a(shader->shader_source.data, shader->shader_source.length); + ufbxt_assert(source_hash == 0xd2f4f86f); + + ufbx_shader_texture_input *input = ufbx_find_shader_texture_input(shader, "Input"); + ufbxt_assert(input); + ufbx_texture *input_texture = input->texture; + ufbxt_assert(input_texture); + ufbxt_assert(input_texture->type == UFBX_TEXTURE_FILE); + + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(texture->file_textures.data[0] == input_texture); + } + + { + ufbx_texture *texture = material->pbr.normal_map.texture; + ufbxt_assert(texture && texture->shader); + ufbx_shader_texture *shader = texture->shader; + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(shader->type == UFBX_SHADER_TEXTURE_UNKNOWN); + ufbxt_assert(!strcmp(shader->shader_name.data, "ai_bump2d")); + ufbxt_assert(shader->shader_source.length == 0); + + ufbx_shader_texture_input *bump_map = ufbx_find_shader_texture_input(shader, "bump_map"); + ufbxt_assert(bump_map); + ufbx_texture *bump_texture = bump_map->texture; + ufbxt_assert(bump_texture); + ufbxt_assert(bump_texture->type == UFBX_TEXTURE_FILE); + + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(texture->file_textures.data[0] == bump_texture); + } + +} +#endif + +UFBXT_FILE_TEST(synthetic_missing_material_factor) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "phong1"); + ufbxt_assert(material); + + ufbxt_assert(material->shader_type == UFBX_SHADER_FBX_PHONG); + + ufbxt_assert_close_real(err, material->fbx.diffuse_factor.value_vec3.x, 1.0f); + ufbxt_assert_close_real(err, material->fbx.specular_factor.value_vec3.x, 1.0f); + ufbxt_assert_close_real(err, material->fbx.reflection_factor.value_vec3.x, 1.0f); + ufbxt_assert_close_real(err, material->fbx.transparency_factor.value_vec3.x, 1.0f); + ufbxt_assert_close_real(err, material->fbx.emission_factor.value_vec3.x, 1.0f); + ufbxt_assert_close_real(err, material->fbx.ambient_factor.value_vec3.x, 1.0f); + + // TODO: Figure out how to map transmission/opacity + ufbxt_assert_close_real(err, material->pbr.base_factor.value_vec3.x, 1.0f); + ufbxt_assert_close_real(err, material->pbr.specular_factor.value_vec3.x, 1.0f); + ufbxt_assert_close_real(err, material->pbr.emission_factor.value_vec3.x, 1.0f); +} +#endif + +UFBXT_FILE_TEST(max_instanced_material) +#if UFBXT_IMPL +{ + ufbx_node *red_node = ufbx_find_node(scene, "Red"); + ufbx_node *green_node = ufbx_find_node(scene, "Green"); + ufbx_node *blue_node = ufbx_find_node(scene, "Blue"); + ufbxt_assert(red_node && red_node->mesh); + ufbxt_assert(green_node && green_node->mesh); + ufbxt_assert(blue_node && blue_node->mesh); + ufbx_mesh *red_mesh = red_node->mesh; + ufbx_mesh *green_mesh = green_node->mesh; + ufbx_mesh *blue_mesh = blue_node->mesh; + + ufbx_material *red_mat = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "RedMat"); + ufbx_material *green_mat = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "GreenMat"); + ufbx_material *blue_mat = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "BlueMat"); + + if (scene->metadata.version < 7000) { + ufbxt_assert(red_mesh != green_mesh); + ufbxt_assert(red_mesh != blue_mesh); + ufbxt_assert(green_mesh != blue_mesh); + + // 6100 is a bit broken with materials? + + ufbxt_assert(green_node->materials.count == 3); + ufbxt_assert(red_node->materials.count == 2); + ufbxt_assert(blue_node->materials.count == 1); + + ufbxt_assert(green_mesh->materials.count == 3); + ufbxt_assert(red_mesh->materials.count == 2); + ufbxt_assert(blue_mesh->materials.count == 1); + + } else { + ufbxt_assert(red_mesh == green_mesh); + ufbxt_assert(red_mesh == blue_mesh); + ufbxt_assert(green_mesh == blue_mesh); + + ufbxt_assert(green_node->materials.count == 1); + ufbxt_assert(red_node->materials.count == 1); + ufbxt_assert(blue_node->materials.count == 1); + + ufbxt_assert(green_node->materials.data[0] == green_mat); + ufbxt_assert(red_node->materials.data[0] == red_mat); + ufbxt_assert(blue_node->materials.data[0] == blue_mat); + + ufbxt_assert(red_mesh->materials.data[0].material == green_mat); + } +} +#endif + +#if UFBXT_IMPL + +static bool ufbxt_has_texture(ufbx_texture_list list, const char *name) +{ + for (size_t i = 0; i < list.count; i++) { + if (!strcmp(list.data[i]->relative_filename.data, name)) return true; + } + return false; +} + +static void ufbxt_check_shader_input_map(ufbx_texture *texture, const char *name, const char *map, int64_t output_index) +{ + ufbxt_assert(texture->shader); + ufbx_shader_texture_input *input = ufbx_find_shader_texture_input(texture->shader, name); + ufbxt_assert(input); + ufbxt_assert(input->texture); + ufbxt_assert(!strcmp(input->texture->name.data, map)); + ufbxt_assert(input->texture_output_index == output_index); +} + +#endif + +UFBXT_FILE_TEST(max_shadergraph) +#if UFBXT_IMPL +{ + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #1"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_UNKNOWN); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "ai_checkerboard")); + ufbxt_assert(texture->file_textures.count == 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #2"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_UNKNOWN); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "ai_add")); + ufbxt_assert(texture->file_textures.count == 0); + ufbxt_check_shader_input_map(texture, "input1", "Map #1", 0); + ufbxt_check_shader_input_map(texture, "input2", "Map #3", 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #3"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "Checker")); + ufbxt_assert(texture->file_textures.count == 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #6"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "ColorMul")); + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_diffuse.png")); + ufbxt_check_shader_input_map(texture, "A", "Map #2", 0); + ufbxt_check_shader_input_map(texture, "B", "Map #7", 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #7"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_diffuse.png")); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "OSLBitmap2")); + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_diffuse.png")); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #11"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_metallic.png")); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_UNKNOWN); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "ai_image")); + ufbxt_assert(texture->file_textures.count == 2); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_diffuse.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_metallic.png")); + ufbxt_check_shader_input_map(texture, "offset", "Map #7", 2); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #13"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "ColorMax")); + ufbxt_assert(texture->file_textures.count == 2); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_diffuse.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_weight.png")); + ufbxt_check_shader_input_map(texture, "A", "Map #15", 0); + ufbxt_check_shader_input_map(texture, "B", "Map #6", 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #14"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_weight.png")); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "UberBitmap2")); + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_weight.png")); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #15"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "TriTone")); + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_weight.png")); + ufbxt_check_shader_input_map(texture, "Input_map", "Map #14", 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #16"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_UNKNOWN); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "ai_mix_rgba")); + ufbxt_assert(texture->file_textures.count == 3); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_diffuse.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_metallic.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_weight.png")); + ufbxt_check_shader_input_map(texture, "input1", "Map #13", 0); + ufbxt_check_shader_input_map(texture, "input2", "Map #11", 0); + ufbxt_check_shader_input_map(texture, "mix", "Map #7", 1); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #17"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_UNKNOWN); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "ai_dot")); + ufbxt_assert(texture->file_textures.count == 3); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_diffuse.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_metallic.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_weight.png")); + ufbxt_check_shader_input_map(texture, "input1", "Map #16", 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #19"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "ColorAdd")); + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_emissive.png")); + ufbxt_check_shader_input_map(texture, "A", "Map #20", 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #20"); + ufbxt_assert(texture && !texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_emissive.png")); + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_emissive.png")); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #21"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_UNKNOWN); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "ai_add")); + ufbxt_assert(texture->file_textures.count == 2); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_emissive.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_specular.png")); + ufbxt_check_shader_input_map(texture, "input1", "Map #22", 0); + ufbxt_check_shader_input_map(texture, "input2", "Map #19", 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #22"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_specular.png")); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_UNKNOWN); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "ai_image")); + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_specular.png")); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #26"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "VectorAdd")); + ufbxt_assert(texture->file_textures.count == 3); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_emissive.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_specular.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_transparency.png")); + ufbxt_check_shader_input_map(texture, "A", "Map #28", 0); + ufbxt_check_shader_input_map(texture, "B", "Map #21", 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #28"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_transparency.png")); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "OSLBitmap2")); + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_transparency.png")); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #29"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "ColorAdd")); + ufbxt_assert(texture->file_textures.count == 4); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_emissive.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_specular.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_transparency.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_ambient.png")); + ufbxt_check_shader_input_map(texture, "A", "Map #30", 0); + ufbxt_check_shader_input_map(texture, "B", "Map #26", 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #30"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_ambient.png")); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_OSL); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "UberBitmap2")); + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_ambient.png")); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #31"); + ufbxt_assert(texture && texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_SHADER); + ufbxt_assert(texture->shader->type == UFBX_SHADER_TEXTURE_UNKNOWN); + ufbxt_assert(!strcmp(texture->shader->shader_name.data, "")); + ufbxt_assert(texture->shader->shader_type_id == UINT64_C(0x0000023000000000)); + ufbxt_assert(texture->file_textures.count == 5); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_emissive.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_specular.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_transparency.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_ambient.png")); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_displacement.png")); + ufbxt_check_shader_input_map(texture, "map1", "Map #29", 0); + ufbxt_check_shader_input_map(texture, "map2", "Map #32", 0); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "Map #32"); + ufbxt_assert(texture && !texture->shader); + ufbxt_assert(texture->type == UFBX_TEXTURE_FILE); + ufbxt_assert(!strcmp(texture->relative_filename.data, "textures\\checkerboard_displacement.png")); + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_displacement.png")); + } + + { + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Material #25"); + ufbxt_assert(material); + ufbxt_assert(material->shader_type == UFBX_SHADER_OSL_STANDARD_SURFACE); + + ufbxt_assert(material->pbr.base_factor.texture); + ufbxt_assert(!strcmp(material->pbr.base_factor.texture->name.data, "Map #17")); + + ufbxt_assert(material->pbr.base_color.texture); + ufbxt_assert(!strcmp(material->pbr.base_color.texture->name.data, "Map #13")); + + ufbxt_assert(material->pbr.emission_factor.texture); + ufbxt_assert(!strcmp(material->pbr.emission_factor.texture->name.data, "Map #31")); + + { + ufbx_texture *texture = material->pbr.roughness.texture; + ufbxt_assert(texture); + ufbxt_assert(texture->shader); + ufbxt_assert(texture->file_textures.count == 1); + ufbxt_assert(ufbxt_has_texture(texture->file_textures, "textures\\checkerboard_ambient.png")); + ufbxt_assert(texture->shader->main_texture); + ufbxt_assert(texture->shader->main_texture_output_index == 6); + ufbxt_assert(!strcmp(texture->shader->main_texture->name.data, "Map #30")); + ufbxt_check_shader_input_map(texture, "sourceMap", "Map #30", 6); + } + } +} +#endif + +UFBXT_FILE_TEST(maya_duplicated_texture) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->texture_files.count == 1); + ufbxt_assert(scene->textures.count == 4); + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "file1"); + ufbxt_assert(texture->has_file); + ufbxt_assert(texture->file_index == 0); + ufbxt_assert(!strcmp(texture->uv_set.data, "map1")); + ufbxt_assert(!texture->has_uv_transform); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "file2"); + ufbxt_assert(texture->has_file); + ufbxt_assert(texture->file_index == 0); + ufbxt_assert(!strcmp(texture->uv_set.data, "map1")); + ufbxt_assert(!texture->has_uv_transform); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "file3"); + ufbxt_assert(texture->has_file); + ufbxt_assert(texture->file_index == 0); + ufbxt_assert(!strcmp(texture->uv_set.data, "map1")); + ufbxt_assert(texture->has_uv_transform); + ufbxt_assert_close_real(err, texture->uv_transform.scale.x, 2.0f); + ufbxt_assert_close_real(err, texture->uv_transform.scale.y, 2.0f); + } + + { + ufbx_texture *texture = (ufbx_texture*)ufbx_find_element(scene, UFBX_ELEMENT_TEXTURE, "file4"); + ufbxt_assert(texture->has_file); + ufbxt_assert(texture->file_index == 0); + ufbxt_assert(!strcmp(texture->uv_set.data, "second")); + ufbxt_assert(!texture->has_uv_transform); + } +} +#endif diff --git a/modules/ufbx/test/test_math.h b/modules/ufbx/test/test_math.h new file mode 100644 index 0000000..2daf5d5 --- /dev/null +++ b/modules/ufbx/test/test_math.h @@ -0,0 +1,319 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "math" + +#if UFBXT_IMPL + +static ufbx_real ufbxt_quat_error(ufbx_quat a, ufbx_quat b) +{ + double pos = fabs(a.x-b.x) + fabs(a.y-b.y) + fabs(a.z-b.z) + fabs(a.w-b.w); + double neg = fabs(a.x+b.x) + fabs(a.y+b.y) + fabs(a.z+b.z) + fabs(a.w+b.w); + return pos < neg ? pos : neg; +} + +static uint32_t ufbxt_xorshift32(uint32_t *state) +{ + /* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */ + uint32_t x = *state; + x ^= x << 13; + x ^= x >> 17; + x ^= x << 5; + return *state = x; +} + +static ufbx_real ufbxt_xorshift32_real(uint32_t *state) +{ + uint32_t u = ufbxt_xorshift32(state); + return (ufbx_real)u * (ufbx_real)2.3283064365386962890625e-10; +} + +#endif + +UFBXT_TEST(quat_to_euler_structured) +#if UFBXT_IMPL +{ + ufbxt_diff_error err = { 0 }; + + for (int iorder = 0; iorder < 6; iorder++) { + ufbx_rotation_order order = (ufbx_rotation_order)iorder; + + for (int x = -360; x <= 360; x += 45) + for (int y = -360; y <= 360; y += 45) + for (int z = -360; z <= 360; z += 45) { + ufbx_vec3 v = { (ufbx_real)x, (ufbx_real)y, (ufbx_real)z }; + + ufbx_quat q = ufbx_euler_to_quat(v, order); + ufbx_vec3 v2 = ufbx_quat_to_euler(q, order); + ufbx_quat q2 = ufbx_euler_to_quat(v2, order); + + ufbxt_assert_close_real(&err, ufbxt_quat_error(q, q2), 0.0f); + ufbxt_assert_close_real(&err, ufbxt_quat_error(q, q2), 0.0f); + } + } + + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", err.sum / (ufbx_real)err.num, err.max, err.num); +} +#endif + +UFBXT_TEST(quat_to_euler_random) +#if UFBXT_IMPL +{ + size_t steps = ufbxt_begin_fuzz() ? 10000000 : 100000; + ufbxt_diff_error err = { 0 }; + + for (int iorder = 0; iorder < 6; iorder++) { + ufbx_rotation_order order = (ufbx_rotation_order)iorder; + + uint32_t state = 1; + + for (size_t i = 0; i < steps; i++) { + if (g_fuzz && ufbxt_fuzz_should_skip((int)i >> 8)) continue; + + ufbx_quat q; + q.x = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + q.y = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + q.z = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + q.w = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + ufbx_real qm = (ufbx_real)sqrt(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + q.x /= qm; + q.y /= qm; + q.z /= qm; + q.w /= qm; + + ufbx_vec3 v = ufbx_quat_to_euler(q, order); + ufbx_quat q2 = ufbx_euler_to_quat(v, order); + + ufbxt_assert_close_real(&err, ufbxt_quat_error(q, q2), 0.0f); + } + } + + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", err.sum / (ufbx_real)err.num, err.max, err.num); +} +#endif + +UFBXT_TEST(matrix_to_transform_structured) +#if UFBXT_IMPL +{ + ufbxt_diff_error err = { 0 }; + + for (int sx = -2; sx <= 2; sx++) + for (int sy = -2; sy <= 2; sy++) + for (int sz = -2; sz <= 2; sz++) + for (int rx = -2; rx <= 2; rx++) + for (int ry = -2; ry <= 2; ry++) + for (int rz = -2; rz <= 2; rz++) + for (int rw = -2; rw <= 2; rw++) + { + // TODO: Support single axis squish? + if (sx == 0 || sy == 0 || sz == 0) continue; + if (rx == 0 && ry == 0 && rz == 0 && rw == 0) continue; + + ufbx_transform t; + + ufbx_quat q = { (ufbx_real)rx / 3.0f, (ufbx_real)ry / 3.0f, (ufbx_real)rz / 3.0f, (ufbx_real)rw / 3.0f }; + ufbx_real qm = (ufbx_real)sqrt(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + t.rotation.x = q.x / qm; + t.rotation.y = q.y / qm; + t.rotation.z = q.z / qm; + t.rotation.w = q.w / qm; + + t.translation.x = 1.0f; + t.translation.y = 2.0f; + t.translation.z = 3.0f; + t.scale.x = (ufbx_real)sx / 2.0f; + t.scale.y = (ufbx_real)sy / 2.0f; + t.scale.z = (ufbx_real)sz / 2.0f; + + ufbx_matrix m = ufbx_transform_to_matrix(&t); + ufbx_transform t2 = ufbx_matrix_to_transform(&m); + + if (sx < 0 || sy < 0 || sz < 0) { + // Flipped signs cannot be uniquely recovered, check that the transforms are identical + ufbx_matrix m2 = ufbx_transform_to_matrix(&t2); + ufbxt_assert_close_matrix(&err, m, m2); + } else { + ufbxt_assert_close_vec3(&err, t.translation, t2.translation); + ufbxt_assert_close_vec3(&err, t.scale, t2.scale); + ufbxt_assert_close_real(&err, ufbxt_quat_error(t.rotation, t2.rotation), 0.0f); + } + } + + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", err.sum / (ufbx_real)err.num, err.max, err.num); +} +#endif + +UFBXT_TEST(matrix_to_transform_random) +#if UFBXT_IMPL +{ + ufbxt_diff_error err = { 0 }; + + uint32_t state = 1; + size_t steps = ufbxt_begin_fuzz() ? 1000000 : 100000; + + for (size_t i = 0; i < steps; i++) { + if (g_fuzz && ufbxt_fuzz_should_skip((int)i >> 4)) continue; + + ufbx_transform t; + + ufbx_quat q; + q.x = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + q.y = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + q.z = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + q.w = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + ufbx_real qm = (ufbx_real)sqrt(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + t.rotation.x = q.x / qm; + t.rotation.y = q.y / qm; + t.rotation.z = q.z / qm; + t.rotation.w = q.w / qm; + + t.translation.x = ufbxt_xorshift32_real(&state) * 20.0f - 10.0f; + t.translation.y = ufbxt_xorshift32_real(&state) * 20.0f - 10.0f; + t.translation.z = ufbxt_xorshift32_real(&state) * 20.0f - 10.0f; + t.scale.x = ufbxt_xorshift32_real(&state) * 10.0f + 0.01f; + t.scale.y = ufbxt_xorshift32_real(&state) * 10.0f + 0.01f; + t.scale.z = ufbxt_xorshift32_real(&state) * 10.0f + 0.01f; + + uint32_t flip = ufbxt_xorshift32(&state); + + // Prevent most of the inputs being flips + if (flip & 8) flip = 0; + + if (flip & 1) t.scale.x *= -1.0f; + if (flip & 2) t.scale.y *= -1.0f; + if (flip & 4) t.scale.z *= -1.0f; + + ufbx_matrix m = ufbx_transform_to_matrix(&t); + ufbx_transform t2 = ufbx_matrix_to_transform(&m); + + if (flip) { + // Flipped signs cannot be uniquely recovered, check that the transforms are identical + ufbx_matrix m2 = ufbx_transform_to_matrix(&t2); + ufbxt_assert_close_matrix(&err, m, m2); + } else { + ufbxt_assert_close_vec3(&err, t.translation, t2.translation); + ufbxt_assert_close_vec3(&err, t.scale, t2.scale); + ufbxt_assert_close_real(&err, ufbxt_quat_error(t.rotation, t2.rotation), 0.0f); + } + } + + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", err.sum / (ufbx_real)err.num, err.max, err.num); +} +#endif + +UFBXT_TEST(matrix_inverse_simple) +#if UFBXT_IMPL +{ + ufbxt_diff_error err = { 0 }; + + { + ufbx_matrix m = { 0 }; + m.m00 = 2.0f; + m.m11 = 0.5f; + m.m22 = 0.25f; + m.m03 = 1.0f; + m.m13 = 2.0f; + m.m23 = 3.0f; + + ufbx_matrix im = ufbx_matrix_invert(&m); + ufbxt_assert_close_real(&err, im.m00, 0.5f); + ufbxt_assert_close_real(&err, im.m10, 0.0f); + ufbxt_assert_close_real(&err, im.m20, 0.0f); + ufbxt_assert_close_real(&err, im.m01, 0.0f); + ufbxt_assert_close_real(&err, im.m11, 2.0f); + ufbxt_assert_close_real(&err, im.m21, 0.0f); + ufbxt_assert_close_real(&err, im.m02, 0.0f); + ufbxt_assert_close_real(&err, im.m12, 0.0f); + ufbxt_assert_close_real(&err, im.m22, 4.0f); + ufbxt_assert_close_real(&err, im.m03, -0.5f); + ufbxt_assert_close_real(&err, im.m13, -4.0f); + ufbxt_assert_close_real(&err, im.m23, -12.0f); + } + + { + ufbx_matrix m = { 0 }; + m.m00 = 1.0f; + m.m12 = -1.0f; + m.m21 = 1.0f; + m.m13 = 1.0f; + m.m23 = 2.0f; + + ufbx_matrix im = ufbx_matrix_invert(&m); + ufbxt_assert_close_real(&err, im.m00, 1.0f); + ufbxt_assert_close_real(&err, im.m10, 0.0f); + ufbxt_assert_close_real(&err, im.m20, 0.0f); + ufbxt_assert_close_real(&err, im.m01, 0.0f); + ufbxt_assert_close_real(&err, im.m11, 0.0f); + ufbxt_assert_close_real(&err, im.m21, -1.0f); + ufbxt_assert_close_real(&err, im.m02, 0.0f); + ufbxt_assert_close_real(&err, im.m12, 1.0f); + ufbxt_assert_close_real(&err, im.m22, 0.0f); + ufbxt_assert_close_real(&err, im.m03, 0.0f); + ufbxt_assert_close_real(&err, im.m13, -2.0f); + ufbxt_assert_close_real(&err, im.m23, 1.0f); + } + + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", err.sum / (ufbx_real)err.num, err.max, err.num); +} +#endif + +UFBXT_TEST(matrix_inverse_random) +#if UFBXT_IMPL +{ + ufbxt_diff_error err = { 0 }; + + size_t steps = ufbxt_begin_fuzz() ? 1000000 : 10000; + + uint32_t state = 1; + + for (size_t i = 0; i < steps; i++) { + if (g_fuzz && ufbxt_fuzz_should_skip((int)i >> 4)) continue; + + ufbx_transform t; + + ufbx_quat q; + q.x = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + q.y = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + q.z = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + q.w = ufbxt_xorshift32_real(&state) * 2.0f - 1.0f; + ufbx_real qm = (ufbx_real)sqrt(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + t.rotation.x = q.x / qm; + t.rotation.y = q.y / qm; + t.rotation.z = q.z / qm; + t.rotation.w = q.w / qm; + + t.translation.x = ufbxt_xorshift32_real(&state) * 20.0f - 10.0f; + t.translation.y = ufbxt_xorshift32_real(&state) * 20.0f - 10.0f; + t.translation.z = ufbxt_xorshift32_real(&state) * 20.0f - 10.0f; + t.scale.x = ufbxt_xorshift32_real(&state) * 10.0f + 0.1f; + t.scale.y = ufbxt_xorshift32_real(&state) * 10.0f + 0.1f; + t.scale.z = ufbxt_xorshift32_real(&state) * 10.0f + 0.1f; + + uint32_t flip = ufbxt_xorshift32(&state); + + // Prevent most of the inputs being flips + if (flip & 8) flip = 0; + + if (flip & 1) t.scale.x *= -1.0f; + if (flip & 2) t.scale.y *= -1.0f; + if (flip & 4) t.scale.z *= -1.0f; + + ufbx_matrix m = ufbx_transform_to_matrix(&t); + ufbx_matrix im = ufbx_matrix_invert(&m); + ufbx_matrix identity = ufbx_matrix_mul(&m, &im); + + ufbxt_assert_close_real(&err, identity.m00, 1.0f); + ufbxt_assert_close_real(&err, identity.m10, 0.0f); + ufbxt_assert_close_real(&err, identity.m20, 0.0f); + ufbxt_assert_close_real(&err, identity.m01, 0.0f); + ufbxt_assert_close_real(&err, identity.m11, 1.0f); + ufbxt_assert_close_real(&err, identity.m21, 0.0f); + ufbxt_assert_close_real(&err, identity.m02, 0.0f); + ufbxt_assert_close_real(&err, identity.m12, 0.0f); + ufbxt_assert_close_real(&err, identity.m22, 1.0f); + ufbxt_assert_close_real(&err, identity.m03, 0.0f); + ufbxt_assert_close_real(&err, identity.m13, 0.0f); + ufbxt_assert_close_real(&err, identity.m23, 0.0f); + } + + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", err.sum / (ufbx_real)err.num, err.max, err.num); +} +#endif diff --git a/modules/ufbx/test/test_mesh.h b/modules/ufbx/test/test_mesh.h new file mode 100644 index 0000000..4f0d8c2 --- /dev/null +++ b/modules/ufbx/test/test_mesh.h @@ -0,0 +1,1192 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "mesh" + +UFBXT_FILE_TEST(blender_279_default) +#if UFBXT_IMPL +{ + if (scene->metadata.ascii) { + ufbxt_assert(scene->metadata.exporter == UFBX_EXPORTER_BLENDER_ASCII); + ufbxt_assert(scene->metadata.exporter_version == ufbx_pack_version(2, 79, 0)); + } else { + ufbxt_assert(scene->metadata.exporter == UFBX_EXPORTER_BLENDER_BINARY); + ufbxt_assert(scene->metadata.exporter_version == ufbx_pack_version(3, 7, 13)); + } + + ufbx_node *node = ufbx_find_node(scene, "Lamp"); + ufbxt_assert(node); + ufbx_light *light = node->light; + ufbxt_assert(light); + + // Light attribute properties + ufbx_vec3 color_ref = { 1.0, 1.0, 1.0 }; + ufbx_prop *color = ufbx_find_prop(&light->props, "Color"); + ufbxt_assert(color && color->type == UFBX_PROP_COLOR); + ufbxt_assert_close_vec3(err, color->value_vec3, color_ref); + + ufbx_prop *intensity = ufbx_find_prop(&light->props, "Intensity"); + ufbxt_assert(intensity && intensity->type == UFBX_PROP_NUMBER); + ufbxt_assert_close_real(err, intensity->value_real, 100.0); + + // Model properties + ufbx_vec3 translation_ref = { 4.076245307922363, 5.903861999511719, -1.0054539442062378 }; + ufbx_prop *translation = ufbx_find_prop(&node->props, "Lcl Translation"); + ufbxt_assert(translation && translation->type == UFBX_PROP_TRANSLATION); + ufbxt_assert_close_vec3(err, translation->value_vec3, translation_ref); + + // Model defaults + ufbx_vec3 scaling_ref = { 1.0, 1.0, 1.0 }; + ufbx_prop *scaling = ufbx_find_prop(&node->props, "GeometricScaling"); + ufbxt_assert(scaling && scaling->type == UFBX_PROP_VECTOR); + ufbxt_assert_close_vec3(err, scaling->value_vec3, scaling_ref); +} +#endif + +UFBXT_FILE_TEST(blender_282_suzanne) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(blender_282_suzanne_and_transform) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(maya_cube) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->metadata.exporter == UFBX_EXPORTER_FBX_SDK); + ufbxt_assert(scene->metadata.exporter_version == ufbx_pack_version(2019, 2, 0)); + + ufbxt_assert(!strcmp(scene->metadata.original_application.vendor.data, "Autodesk")); + ufbxt_assert(!strcmp(scene->metadata.original_application.name.data, "Maya")); + ufbxt_assert(!strcmp(scene->metadata.original_application.version.data, "201900")); + ufbxt_assert(!strcmp(scene->metadata.latest_application.vendor.data, "Autodesk")); + ufbxt_assert(!strcmp(scene->metadata.latest_application.name.data, "Maya")); + ufbxt_assert(!strcmp(scene->metadata.latest_application.version.data, "201900")); + + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(!mesh->generated_normals); + + for (size_t face_i = 0; face_i < mesh->num_faces; face_i++) { + ufbx_face face = mesh->faces.data[face_i]; + for (size_t i = face.index_begin; i < face.index_begin + face.num_indices; i++) { + ufbx_vec3 n = ufbx_get_vertex_vec3(&mesh->vertex_normal, i); + ufbx_vec3 b = ufbx_get_vertex_vec3(&mesh->vertex_bitangent, i); + ufbx_vec3 t = ufbx_get_vertex_vec3(&mesh->vertex_tangent, i); + ufbxt_assert_close_real(err, ufbxt_dot3(n, n), 1.0); + ufbxt_assert_close_real(err, ufbxt_dot3(b, b), 1.0); + ufbxt_assert_close_real(err, ufbxt_dot3(t, t), 1.0); + ufbxt_assert_close_real(err, ufbxt_dot3(n, b), 0.0); + ufbxt_assert_close_real(err, ufbxt_dot3(n, t), 0.0); + ufbxt_assert_close_real(err, ufbxt_dot3(b, t), 0.0); + + for (size_t j = 0; j < face.num_indices; j++) { + ufbx_vec3 p0 = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + j); + ufbx_vec3 p1 = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + (j + 1) % face.num_indices); + ufbx_vec3 edge; + edge.x = p1.x - p0.x; + edge.y = p1.y - p0.y; + edge.z = p1.z - p0.z; + ufbxt_assert_close_real(err, ufbxt_dot3(edge, edge), 1.0); + ufbxt_assert_close_real(err, ufbxt_dot3(n, edge), 0.0); + } + + } + } +} +#endif + +UFBXT_FILE_TEST(maya_color_sets) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->color_sets.count == 4); + ufbxt_assert(!strcmp(mesh->color_sets.data[0].name.data, "RGBCube")); + ufbxt_assert(!strcmp(mesh->color_sets.data[1].name.data, "White")); + ufbxt_assert(!strcmp(mesh->color_sets.data[2].name.data, "Black")); + ufbxt_assert(!strcmp(mesh->color_sets.data[3].name.data, "Alpha")); + + for (size_t i = 0; i < mesh->num_indices; i++) { + ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, i); + ufbx_vec4 refs[4] = { + { 0.0, 0.0, 0.0, 1.0 }, + { 1.0, 1.0, 1.0, 1.0 }, + { 0.0, 0.0, 0.0, 1.0 }, + { 1.0, 1.0, 1.0, 0.0 }, + }; + + refs[0].x = pos.x + 0.5; + refs[0].y = pos.y + 0.5; + refs[0].z = pos.z + 0.5; + refs[3].w = (pos.x + 0.5) * 0.1 + (pos.y + 0.5) * 0.2 + (pos.z + 0.5) * 0.4; + + for (size_t set_i = 0; set_i < 4; set_i++) { + ufbx_vec4 color = ufbx_get_vertex_vec4(&mesh->color_sets.data[set_i].vertex_color, i); + ufbxt_assert_close_vec4(err, color, refs[set_i]); + } + } +} +#endif + +UFBXT_FILE_TEST(maya_uv_sets) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->uv_sets.count == 3); + ufbxt_assert(!strcmp(mesh->uv_sets.data[0].name.data, "Default")); + ufbxt_assert(!strcmp(mesh->uv_sets.data[1].name.data, "PerFace")); + ufbxt_assert(!strcmp(mesh->uv_sets.data[2].name.data, "Row")); + + size_t counts1[2][2] = { 0 }; + size_t counts2[7][2] = { 0 }; + + for (size_t i = 0; i < mesh->num_indices; i++) { + ufbx_vec2 uv0 = ufbx_get_vertex_vec2(&mesh->uv_sets.data[0].vertex_uv, i); + ufbx_vec2 uv1 = ufbx_get_vertex_vec2(&mesh->uv_sets.data[1].vertex_uv, i); + ufbx_vec2 uv2 = ufbx_get_vertex_vec2(&mesh->uv_sets.data[2].vertex_uv, i); + + ufbxt_assert(uv0.x > 0.05f && uv0.y > 0.05f && uv0.x < 0.95f && uv0.y < 0.95f); + int x1 = (int)(uv1.x + 0.5f), y1 = (int)(uv1.y + 0.5f); + int x2 = (int)(uv2.x + 0.5f), y2 = (int)(uv2.y + 0.5f); + ufbxt_assert_close_real(err, uv1.x - (ufbx_real)x1, 0.0); + ufbxt_assert_close_real(err, uv1.y - (ufbx_real)y1, 0.0); + ufbxt_assert_close_real(err, uv2.x - (ufbx_real)x2, 0.0); + ufbxt_assert_close_real(err, uv2.y - (ufbx_real)y2, 0.0); + ufbxt_assert(x1 >= 0 && x1 <= 1 && y1 >= 0 && y1 <= 1); + ufbxt_assert(x2 >= 0 && x2 <= 6 && y2 >= 0 && y2 <= 1); + counts1[x1][y1]++; + counts2[x2][y2]++; + } + + ufbxt_assert(counts1[0][0] == 6); + ufbxt_assert(counts1[0][1] == 6); + ufbxt_assert(counts1[1][0] == 6); + ufbxt_assert(counts1[1][1] == 6); + + for (size_t i = 0; i < 7; i++) { + size_t n = (i == 0 || i == 6) ? 1 : 2; + ufbxt_assert(counts2[i][0] == n); + ufbxt_assert(counts2[i][1] == n); + } +} +#endif + +UFBXT_FILE_TEST(blender_279_color_sets) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Cube"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->color_sets.count == 3); + ufbxt_assert(!strcmp(mesh->color_sets.data[0].name.data, "RGBCube")); + ufbxt_assert(!strcmp(mesh->color_sets.data[1].name.data, "White")); + ufbxt_assert(!strcmp(mesh->color_sets.data[2].name.data, "Black")); + + for (size_t i = 0; i < mesh->num_indices; i++) { + ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, i); + ufbx_vec4 refs[3] = { + { 0.0, 0.0, 0.0, 1.0 }, + { 1.0, 1.0, 1.0, 1.0 }, + { 0.0, 0.0, 0.0, 1.0 }, + }; + + refs[0].x = pos.x + 0.5; + refs[0].y = pos.y + 0.5; + refs[0].z = pos.z + 0.5; + + for (size_t set_i = 0; set_i < 3; set_i++) { + ufbx_vec4 color = ufbx_get_vertex_vec4(&mesh->color_sets.data[set_i].vertex_color, i); + ufbxt_assert_close_vec4(err, color, refs[set_i]); + } + } +} +#endif + +UFBXT_FILE_TEST(blender_279_uv_sets) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Cube"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->uv_sets.count == 3); + ufbxt_assert(!strcmp(mesh->uv_sets.data[0].name.data, "Default")); + ufbxt_assert(!strcmp(mesh->uv_sets.data[1].name.data, "PerFace")); + ufbxt_assert(!strcmp(mesh->uv_sets.data[2].name.data, "Row")); + + size_t counts1[2][2] = { 0 }; + size_t counts2[7][2] = { 0 }; + + for (size_t i = 0; i < mesh->num_indices; i++) { + ufbx_vec2 uv0 = ufbx_get_vertex_vec2(&mesh->uv_sets.data[0].vertex_uv, i); + ufbx_vec2 uv1 = ufbx_get_vertex_vec2(&mesh->uv_sets.data[1].vertex_uv, i); + ufbx_vec2 uv2 = ufbx_get_vertex_vec2(&mesh->uv_sets.data[2].vertex_uv, i); + + ufbxt_assert(uv0.x > 0.05f && uv0.y > 0.05f && uv0.x < 0.95f && uv0.y < 0.95f); + int x1 = (int)(uv1.x + 0.5f), y1 = (int)(uv1.y + 0.5f); + int x2 = (int)(uv2.x + 0.5f), y2 = (int)(uv2.y + 0.5f); + ufbxt_assert_close_real(err, uv1.x - (ufbx_real)x1, 0.0); + ufbxt_assert_close_real(err, uv1.y - (ufbx_real)y1, 0.0); + ufbxt_assert_close_real(err, uv2.x - (ufbx_real)x2, 0.0); + ufbxt_assert_close_real(err, uv2.y - (ufbx_real)y2, 0.0); + ufbxt_assert(x1 >= 0 && x1 <= 1 && y1 >= 0 && y1 <= 1); + ufbxt_assert(x2 >= 0 && x2 <= 6 && y2 >= 0 && y2 <= 1); + counts1[x1][y1]++; + counts2[x2][y2]++; + } + + ufbxt_assert(counts1[0][0] == 6); + ufbxt_assert(counts1[0][1] == 6); + ufbxt_assert(counts1[1][0] == 6); + ufbxt_assert(counts1[1][1] == 6); + + for (size_t i = 0; i < 7; i++) { + size_t n = (i == 0 || i == 6) ? 1 : 2; + ufbxt_assert(counts2[i][0] == n); + ufbxt_assert(counts2[i][1] == n); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_sets_reorder) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->color_sets.count == 4); + ufbxt_assert(!strcmp(mesh->color_sets.data[0].name.data, "RGBCube")); + ufbxt_assert(!strcmp(mesh->color_sets.data[1].name.data, "White")); + ufbxt_assert(!strcmp(mesh->color_sets.data[2].name.data, "Black")); + ufbxt_assert(!strcmp(mesh->color_sets.data[3].name.data, "Alpha")); + ufbxt_assert(!strcmp(mesh->uv_sets.data[0].name.data, "Default")); + ufbxt_assert(!strcmp(mesh->uv_sets.data[1].name.data, "PerFace")); + ufbxt_assert(!strcmp(mesh->uv_sets.data[2].name.data, "Row")); +} +#endif + +UFBXT_FILE_TEST(maya_cone) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCone1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->vertex_crease.exists); + ufbxt_assert(mesh->edges.count); + ufbxt_assert(mesh->edge_crease.count); + ufbxt_assert(mesh->edge_smoothing.count); + + ufbxt_assert(mesh->faces.data[0].num_indices == 16); + + for (size_t i = 0; i < mesh->num_indices; i++) { + ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, i); + ufbx_real crease = ufbx_get_vertex_real(&mesh->vertex_crease, i); + + ufbxt_assert_close_real(err, crease, pos.y > 0.0 ? 0.998 : 0.0); + } + + for (size_t i = 0; i < mesh->num_edges; i++) { + ufbx_edge edge = mesh->edges.data[i]; + ufbx_real crease = mesh->edge_crease.data[i]; + bool smoothing = mesh->edge_smoothing.data[i]; + ufbx_vec3 a = ufbx_get_vertex_vec3(&mesh->vertex_position, edge.a); + ufbx_vec3 b = ufbx_get_vertex_vec3(&mesh->vertex_position, edge.b); + + if (a.y < 0.0 && b.y < 0.0) { + ufbxt_assert_close_real(err, crease, 0.583); + ufbxt_assert(!smoothing); + } else { + ufbxt_assert(a.y > 0.0 || b.y > 0.0); + ufbxt_assert_close_real(err, crease, 0.0); + ufbxt_assert(smoothing); + } + } +} +#endif + +#if UFBXT_IMPL +static void ufbxt_check_tangent_space(ufbxt_diff_error *err, ufbx_mesh *mesh) +{ + for (size_t set_i = 0; set_i < mesh->uv_sets.count; set_i++) { + ufbx_uv_set set = mesh->uv_sets.data[set_i]; + ufbxt_assert(set.vertex_uv.exists); + ufbxt_assert(set.vertex_bitangent.exists); + ufbxt_assert(set.vertex_tangent.exists); + + for (size_t face_i = 0; face_i < mesh->num_faces; face_i++) { + ufbx_face face = mesh->faces.data[face_i]; + + for (size_t i = 0; i < face.num_indices; i++) { + size_t a = face.index_begin + i; + size_t b = face.index_begin + (i + 1) % face.num_indices; + + ufbx_vec3 pa = ufbx_get_vertex_vec3(&mesh->vertex_position, a); + ufbx_vec3 pb = ufbx_get_vertex_vec3(&mesh->vertex_position, b); + ufbx_vec3 ba = ufbx_get_vertex_vec3(&set.vertex_bitangent, a); + ufbx_vec3 bb = ufbx_get_vertex_vec3(&set.vertex_bitangent, b); + ufbx_vec3 ta = ufbx_get_vertex_vec3(&set.vertex_tangent, a); + ufbx_vec3 tb = ufbx_get_vertex_vec3(&set.vertex_tangent, b); + ufbx_vec2 ua = ufbx_get_vertex_vec2(&set.vertex_uv, a); + ufbx_vec2 ub = ufbx_get_vertex_vec2(&set.vertex_uv, b); + + ufbx_vec3 dp = ufbxt_sub3(pb, pa); + ufbx_vec2 du = ufbxt_sub2(ua, ub); + + ufbx_real dp_len = sqrt(ufbxt_dot3(dp, dp)); + dp.x /= dp_len; + dp.y /= dp_len; + dp.z /= dp_len; + + ufbx_real du_len = sqrt(ufbxt_dot2(du, du)); + du.x /= du_len; + du.y /= du_len; + + ufbx_real dba = ufbxt_dot3(dp, ba); + ufbx_real dbb = ufbxt_dot3(dp, bb); + ufbx_real dta = ufbxt_dot3(dp, ta); + ufbx_real dtb = ufbxt_dot3(dp, tb); + ufbxt_assert_close_real(err, dba, dbb); + ufbxt_assert_close_real(err, dta, dtb); + + ufbxt_assert_close_real(err, ub.x - ua.x, dta); + ufbxt_assert_close_real(err, ub.y - ua.y, dba); + } + } + } +} +#endif + +UFBXT_FILE_TEST(maya_uv_set_tangents) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pPlane1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_check_tangent_space(err, mesh); +} +#endif + +UFBXT_FILE_TEST(blender_279_uv_set_tangents) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Plane"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_check_tangent_space(err, mesh); +} +#endif + +UFBXT_FILE_TEST(synthetic_tangents_reorder) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pPlane1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_check_tangent_space(err, mesh); +} +#endif + +UFBXT_FILE_TEST(blender_279_ball) +#if UFBXT_IMPL +{ + ufbx_material *red = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Red"); + ufbx_material *white = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "White"); + ufbxt_assert(red && !strcmp(red->name.data, "Red")); + ufbxt_assert(white && !strcmp(white->name.data, "White")); + + ufbx_vec3 red_ref = { 0.8, 0.0, 0.0 }; + ufbx_vec3 white_ref = { 0.8, 0.8, 0.8 }; + ufbxt_assert_close_vec3(err, red->fbx.diffuse_color.value_vec3, red_ref); + ufbxt_assert_close_vec3(err, white->fbx.diffuse_color.value_vec3, white_ref); + + ufbx_node *node = ufbx_find_node(scene, "Icosphere"); + ufbxt_assert(node); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh); + ufbxt_assert(mesh->face_material.count); + ufbxt_assert(mesh->face_smoothing.count); + + ufbxt_assert(mesh->materials.count == 2); + ufbxt_assert(mesh->materials.data[0].material == red); + ufbxt_assert(mesh->materials.data[1].material == white); + + for (size_t face_i = 0; face_i < mesh->num_faces; face_i++) { + ufbx_face face = mesh->faces.data[face_i]; + ufbx_vec3 mid = { 0 }; + for (size_t i = 0; i < face.num_indices; i++) { + mid = ufbxt_add3(mid, ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + i)); + } + mid.x /= (ufbx_real)face.num_indices; + mid.y /= (ufbx_real)face.num_indices; + mid.z /= (ufbx_real)face.num_indices; + + bool smoothing = mesh->face_smoothing.data[face_i]; + int32_t material = mesh->face_material.data[face_i]; + ufbxt_assert(smoothing == (mid.x > 0.0)); + ufbxt_assert(material == (mid.z < 0.0 ? 1 : 0)); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_broken_material) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->materials.count == 0); + ufbxt_assert(mesh->face_material.data == NULL); +} +#endif + +UFBXT_FILE_TEST(maya_uv_and_color_sets) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->uv_sets.count == 2); + ufbxt_assert(mesh->color_sets.count == 2); + ufbxt_assert(!strcmp(mesh->uv_sets.data[0].name.data, "UVA")); + ufbxt_assert(!strcmp(mesh->uv_sets.data[1].name.data, "UVB")); + ufbxt_assert(!strcmp(mesh->color_sets.data[0].name.data, "ColorA")); + ufbxt_assert(!strcmp(mesh->color_sets.data[1].name.data, "ColorB")); +} +#endif + +UFBXT_FILE_TEST(maya_bad_face) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_empty_faces == 0); + ufbxt_assert(mesh->num_point_faces == 1); + ufbxt_assert(mesh->num_line_faces == 1); + ufbxt_assert(mesh->num_triangles == 7); + ufbxt_assert(mesh->num_faces == 6); + + ufbxt_assert(mesh->faces.data[0].num_indices == 1); + ufbxt_assert(mesh->faces.data[1].num_indices == 2); + ufbxt_assert(mesh->faces.data[2].num_indices == 3); + ufbxt_assert(mesh->faces.data[3].num_indices == 4); + + ufbxt_assert(mesh->faces.data[0].index_begin == 0); + ufbxt_assert(mesh->faces.data[1].index_begin == 1); + ufbxt_assert(mesh->faces.data[2].index_begin == 3); + ufbxt_assert(mesh->faces.data[3].index_begin == 6); + + // ??? Maya exports an edge for the single point + ufbxt_assert(mesh->num_edges == 12); + ufbxt_assert(mesh->edges.data[0].a == 0); + ufbxt_assert(mesh->edges.data[0].b == 0); + ufbxt_assert(mesh->edges.data[1].a == 2); + ufbxt_assert(mesh->edges.data[1].b == 1); +} +#endif + +UFBXT_FILE_TEST(blender_279_edge_vertex) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Plane"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_empty_faces == 0); + ufbxt_assert(mesh->num_point_faces == 0); + ufbxt_assert(mesh->num_line_faces == 1); + ufbxt_assert(mesh->num_triangles == 0); + ufbxt_assert(mesh->num_faces == 1); + + ufbxt_assert(mesh->faces.data[0].index_begin == 0); + ufbxt_assert(mesh->faces.data[0].num_indices == 2); + + // ??? Maya exports an edge for the single point + if (scene->metadata.version == 7400) { + ufbxt_assert(mesh->num_edges == 1); + ufbxt_assert(mesh->edges.data[0].a == 0); + ufbxt_assert(mesh->edges.data[0].b == 1); + } else { + // 6100 has an edge for both directions + ufbxt_assert(mesh->num_edges == 2); + ufbxt_assert(mesh->edges.data[0].a == 0); + ufbxt_assert(mesh->edges.data[0].b == 1); + ufbxt_assert(mesh->edges.data[1].a == 1); + ufbxt_assert(mesh->edges.data[1].b == 0); + } +} +#endif + +UFBXT_FILE_TEST(blender_279_edge_circle) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Circle"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_indices == 512); + + // ??? The 7400_binary export starts off with individual edges but has a + // massive N-gon for the rest of it. + if (scene->metadata.version == 7400) { + ufbxt_assert(mesh->num_line_faces == 127); + ufbxt_assert(mesh->num_faces == 128); + + for (size_t i = 0; i < 127; i++) { + ufbxt_assert(mesh->faces.data[i].num_indices == 2); + } + ufbxt_assert(mesh->faces.data[127].num_indices == 258); + + ufbxt_assert(mesh->num_edges == 256); + } else { + ufbxt_assert(mesh->num_line_faces == 256); + ufbxt_assert(mesh->num_faces == 256); + + for (size_t i = 0; i < 256; i++) { + ufbxt_assert(mesh->faces.data[i].num_indices == 2); + } + + // 6100 has an edge for both directions + ufbxt_assert(mesh->num_edges == 512); + } +} +#endif + +UFBXT_FILE_TEST(blender_293_instancing) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->meshes.count == 1); + ufbx_mesh *mesh = scene->meshes.data[0]; + ufbxt_assert(mesh->instances.count == 8); +} +#endif + +UFBXT_FILE_TEST(synthetic_indexed_by_vertex) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->meshes.count == 1); + ufbx_mesh *mesh = scene->meshes.data[0]; + + for (size_t vi = 0; vi < mesh->num_vertices; vi++) { + int32_t ii = mesh->vertex_first_index.data[vi]; + ufbx_vec3 pos = mesh->vertex_position.values.data[mesh->vertex_position.indices.data[ii]]; + ufbx_vec3 normal = mesh->vertex_normal.values.data[mesh->vertex_normal.indices.data[ii]]; + ufbx_vec3 ref_normal = { 0.0f, pos.y > 0.0f ? 1.0f : -1.0f, 0.0f }; + ufbxt_assert_close_vec3(err, normal, ref_normal); + } + + for (size_t ii = 0; ii < mesh->num_indices; ii++) { + ufbx_vec3 pos = mesh->vertex_position.values.data[mesh->vertex_position.indices.data[ii]]; + ufbx_vec3 normal = mesh->vertex_normal.values.data[mesh->vertex_normal.indices.data[ii]]; + ufbx_vec3 ref_normal = { 0.0f, pos.y > 0.0f ? 1.0f : -1.0f, 0.0f }; + ufbxt_assert_close_vec3(err, normal, ref_normal); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_by_vertex_bad_index) +#if UFBXT_IMPL +{ + ufbxt_check_warning(scene, UFBX_WARNING_INDEX_CLAMPED, 9, NULL); + + ufbxt_assert(scene->meshes.count == 1); + ufbx_mesh *mesh = scene->meshes.data[0]; + + for (size_t vi = 0; vi < mesh->num_vertices; vi++) { + int32_t ii = mesh->vertex_first_index.data[vi]; + ufbx_vec3 pos = mesh->vertex_position.values.data[mesh->vertex_position.indices.data[ii]]; + ufbx_vec3 normal = mesh->vertex_normal.values.data[mesh->vertex_normal.indices.data[ii]]; + ufbx_vec3 ref_normal = { 0.0f, pos.y > 0.0f ? 1.0f : -1.0f, 0.0f }; + ufbxt_assert_close_vec3(err, normal, ref_normal); + } + + for (size_t ii = 0; ii < mesh->num_indices; ii++) { + ufbx_vec3 pos = mesh->vertex_position.values.data[mesh->vertex_position.indices.data[ii]]; + ufbx_vec3 normal = mesh->vertex_normal.values.data[mesh->vertex_normal.indices.data[ii]]; + ufbx_vec3 ref_normal = { 0.0f, pos.y > 0.0f ? 1.0f : -1.0f, 0.0f }; + ufbxt_assert_close_vec3(err, normal, ref_normal); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_by_vertex_overflow) +#if UFBXT_IMPL +{ + ufbxt_check_warning(scene, UFBX_WARNING_INDEX_CLAMPED, 12, NULL); + + ufbxt_assert(scene->meshes.count == 1); + ufbx_mesh *mesh = scene->meshes.data[0]; + + ufbxt_assert(mesh->vertex_normal.values.count == 4); + for (size_t ii = 0; ii < mesh->num_indices; ii++) { + uint32_t vertex_ix = mesh->vertex_position.indices.data[ii]; + uint32_t normal_ix = mesh->vertex_normal.indices.data[ii]; + if (vertex_ix < mesh->vertex_normal.values.count) { + ufbxt_assert(normal_ix == vertex_ix); + } else { + ufbxt_assert(normal_ix == (uint32_t)mesh->vertex_normal.values.count - 1); + } + } +} +#endif + +UFBXT_FILE_TEST(maya_lod_group) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "LOD_Group_1"); + ufbxt_assert(node); + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_LOD_GROUP); + ufbx_lod_group *lod_group = (ufbx_lod_group*)node->attrib; + ufbxt_assert(lod_group->element.type == UFBX_ELEMENT_LOD_GROUP); + + ufbxt_assert(node->children.count == 3); + ufbxt_assert(lod_group->lod_levels.count == 3); + + ufbxt_assert(lod_group->relative_distances); + ufbxt_assert(!lod_group->use_distance_limit); + ufbxt_assert(!lod_group->ignore_parent_transform); + + ufbxt_assert(lod_group->lod_levels.data[0].display == UFBX_LOD_DISPLAY_USE_LOD); + ufbxt_assert(lod_group->lod_levels.data[1].display == UFBX_LOD_DISPLAY_USE_LOD); + ufbxt_assert(lod_group->lod_levels.data[2].display == UFBX_LOD_DISPLAY_USE_LOD); + + if (scene->metadata.version >= 7000) { + ufbxt_assert_close_real(err, lod_group->lod_levels.data[0].distance, 100.0f); + ufbxt_assert_close_real(err, lod_group->lod_levels.data[1].distance, 64.0f); + ufbxt_assert_close_real(err, lod_group->lod_levels.data[2].distance, 32.0f); + } + } + + { + ufbx_node *node = ufbx_find_node(scene, "LOD_Group_2"); + ufbxt_assert(node); + ufbxt_assert(node->attrib_type == UFBX_ELEMENT_LOD_GROUP); + ufbx_lod_group *lod_group = (ufbx_lod_group*)node->attrib; + ufbxt_assert(lod_group->element.type == UFBX_ELEMENT_LOD_GROUP); + + ufbxt_assert(node->children.count == 3); + ufbxt_assert(lod_group->lod_levels.count == 3); + + ufbxt_assert(!lod_group->relative_distances); + ufbxt_assert(!lod_group->use_distance_limit); + ufbxt_assert(lod_group->ignore_parent_transform); + + ufbxt_assert(lod_group->lod_levels.data[0].display == UFBX_LOD_DISPLAY_USE_LOD); + ufbxt_assert(lod_group->lod_levels.data[1].display == UFBX_LOD_DISPLAY_SHOW); + ufbxt_assert(lod_group->lod_levels.data[2].display == UFBX_LOD_DISPLAY_HIDE); + + if (scene->metadata.version >= 7000) { + ufbxt_assert_close_real(err, lod_group->lod_levels.data[0].distance, 0.0f); + ufbxt_assert_close_real(err, lod_group->lod_levels.data[1].distance, 4.520276f); + ufbxt_assert_close_real(err, lod_group->lod_levels.data[2].distance, 18.081102f); + } + } +} +#endif + +UFBXT_FILE_TEST(synthetic_missing_normals) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(!mesh->vertex_normal.exists); + ufbxt_assert(!mesh->skinned_normal.exists); +} +#endif + +#if UFBXT_IMPL +static ufbx_load_opts ufbxt_generate_normals_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.generate_missing_normals = true; + return opts; +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT(synthetic_missing_normals_generated, synthetic_missing_normals, ufbxt_generate_normals_opts) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->vertex_normal.exists); + ufbxt_assert(mesh->skinned_normal.exists); + ufbxt_assert(mesh->generated_normals); + + for (size_t face_ix = 0; face_ix < mesh->faces.count; face_ix++) { + ufbx_face face = mesh->faces.data[face_ix]; + ufbx_vec3 normal = ufbx_get_weighted_face_normal(&mesh->vertex_position, face); + normal = ufbxt_normalize(normal); + for (size_t i = 0; i < face.num_indices; i++) { + ufbx_vec3 mesh_normal = ufbx_get_vertex_vec3(&mesh->vertex_normal, face.index_begin + i); + ufbx_vec3 skinned_normal = ufbx_get_vertex_vec3(&mesh->skinned_normal, face.index_begin + i); + ufbxt_assert_close_vec3(err, normal, mesh_normal); + ufbxt_assert_close_vec3(err, normal, skinned_normal); + } + } +} +#endif + +UFBXT_FILE_TEST(blender_279_nested_meshes) +#if UFBXT_IMPL +{ + // Diff to .obj file with nested objects and FBXASC escaped names +} +#endif + +UFBXT_FILE_TEST(max_edge_visibility) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "Box001"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->edge_visibility.count > 0); + + { + size_t num_visible = 0; + + // Diagonal edges should be hidden + for (size_t i = 0; i < mesh->num_edges; i++) { + ufbx_edge edge = mesh->edges.data[i]; + ufbx_vec3 a = ufbx_get_vertex_vec3(&mesh->vertex_position, edge.a); + ufbx_vec3 b = ufbx_get_vertex_vec3(&mesh->vertex_position, edge.b); + ufbx_real len = ufbxt_length3(ufbxt_sub3(a, b)); + bool expected = len < 21.0f; + bool visible = mesh->edge_visibility.data[i]; + ufbxt_assert(visible == expected); + num_visible += visible ? 1u : 0u; + } + + ufbxt_assert(mesh->num_edges == 18); + ufbxt_assert(num_visible == 12); + } + + ufbx_mesh *sub_mesh = ufbx_subdivide_mesh(mesh, 2, NULL, NULL); + ufbxt_assert(sub_mesh); + ufbxt_check_mesh(scene, sub_mesh); + + { + size_t num_visible = 0; + for (size_t i = 0; i < sub_mesh->num_edges; i++) { + if (sub_mesh->edge_visibility.data[i]) { + num_visible++; + } + } + ufbxt_assert(num_visible == 12 * 4); + } + + ufbx_free_mesh(sub_mesh); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Cylinder001"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->edge_visibility.count > 0); + size_t num_visible = 0; + + // Diagonal and edges to the center should be hidden + for (size_t i = 0; i < mesh->num_edges; i++) { + ufbx_edge edge = mesh->edges.data[i]; + ufbx_vec3 a = ufbx_get_vertex_vec3(&mesh->vertex_position, edge.a); + ufbx_vec3 b = ufbx_get_vertex_vec3(&mesh->vertex_position, edge.b); + ufbx_vec2 a2 = { a.x, a.y }; + ufbx_vec2 b2 = { b.x, b.y }; + ufbx_real len = ufbxt_length3(ufbxt_sub3(a, b)); + ufbx_real len_a2 = ufbxt_length2(a2); + ufbx_real len_b2 = ufbxt_length2(b2); + bool expected = len < 20.7f && len_a2 > 0.1f && len_b2 > 0.1f; + bool visible = mesh->edge_visibility.data[i]; + ufbxt_assert(visible == expected); + num_visible += visible ? 1u : 0u; + } + + ufbxt_assert(mesh->num_edges == 54); + ufbxt_assert(num_visible == 27); + } +} +#endif + +UFBXT_FILE_TEST(zbrush_d20) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 3); + + { + ufbx_node *node = ufbx_find_node(scene, "20 Sided"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->num_faces == 20); + ufbxt_assert(mesh->face_group.count == 20); + for (int32_t i = 0; i < 20; i++) { + uint32_t group_ix = mesh->face_group.data[i]; + ufbx_face_group *group = &mesh->face_groups.data[group_ix]; + ufbxt_assert(group->id == 10 + i * 5); + } + } + + { + ufbx_node *node = ufbx_find_node(scene, "PolyMesh3D1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->num_faces == 24); + ufbxt_assert(mesh->face_group.count == 24); + + { + uint32_t num_front = 0; + for (size_t i = 0; i < 24; i++) { + ufbx_face face = mesh->faces.data[i]; + ufbx_vec3 normal = ufbx_get_weighted_face_normal(&mesh->vertex_position, face); + int32_t group = normal.z < 0.0f ? 9598 : 15349; + num_front += normal.z < 0.0f ? 1 : 0; + uint32_t group_ix = mesh->face_group.data[i]; + ufbxt_assert(mesh->face_groups.data[group_ix].id == group); + } + ufbxt_assert(num_front == mesh->num_faces / 2); + } + + ufbxt_assert(mesh->blend_deformers.count > 0); + ufbx_blend_deformer *blend = mesh->blend_deformers.data[0]; + + // WHAT? The 6100 version has duplicated blend shapes + // and 7500 has duplicated blend deformers... + if (scene->metadata.version == 6100) { + ufbxt_assert(mesh->blend_deformers.count == 1); + ufbxt_assert(blend->channels.count == 4); + } else { + ufbxt_assert(mesh->blend_deformers.count == 2); + ufbxt_assert(blend->channels.count == 2); + } + + // Check that poly groups work in subdivision + ufbx_mesh *sub_mesh = ufbx_subdivide_mesh(mesh, 2, NULL, NULL); + ufbxt_assert(sub_mesh); + ufbxt_check_mesh(scene, sub_mesh); + + // Check that we didn't break the original mesh + ufbxt_check_mesh(scene, mesh); + + { + uint32_t num_front = 0; + ufbxt_assert(sub_mesh->face_group.count == sub_mesh->num_faces); + for (size_t i = 0; i < sub_mesh->num_faces; i++) { + ufbx_face face = sub_mesh->faces.data[i]; + ufbx_vec3 normal = ufbx_get_weighted_face_normal(&sub_mesh->vertex_position, face); + int32_t group = normal.z < 0.0f ? 9598 : 15349; + num_front += normal.z < 0.0f ? 1 : 0; + uint32_t group_ix = sub_mesh->face_group.data[i]; + ufbxt_assert(sub_mesh->face_groups.data[group_ix].id == group); + } + ufbxt_assert(num_front == sub_mesh->num_faces / 2); + } + + ufbx_free_mesh(sub_mesh); + } +} +#endif + +UFBXT_FILE_TEST(zbrush_d20_selection_set) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "PolyMesh3D1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + for (size_t i = 0; i < 2; i++) + { + bool front = i == 0; + const char *name = front ? "PolyMesh3D1_9598" : "PolyMesh3D1_15349"; + ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, name); + ufbxt_assert(set); + ufbxt_assert(set->nodes.count == 1); + ufbx_selection_node *sel_node = set->nodes.data[0]; + + ufbxt_assert(sel_node->target_node == node); + ufbxt_assert(sel_node->target_mesh == mesh); + ufbxt_assert(sel_node->faces.count == 12); + + for (size_t i = 0; i < sel_node->faces.count; i++) { + uint32_t index = sel_node->faces.data[i]; + ufbxt_assert(index < mesh->faces.count); + ufbx_face face = mesh->faces.data[index]; + ufbx_vec3 normal = ufbx_get_weighted_face_normal(&mesh->vertex_position, face); + ufbxt_assert((normal.z < 0.0f) == front); + } + } + } +} +#endif + +UFBXT_FILE_TEST(maya_polygon_hole) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 6); + + { + size_t num_holes = 0; + ufbxt_assert(mesh->face_hole.count == mesh->num_faces); + for (size_t i = 0; i < mesh->num_faces; i++) { + ufbx_face face = mesh->faces.data[i]; + ufbx_vec3 avg_pos = ufbx_zero_vec3; + for (size_t j = 0; j < face.num_indices; j++) { + ufbx_vec3 p = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + j); + avg_pos = ufbxt_add3(avg_pos, p); + } + avg_pos = ufbxt_mul3(avg_pos, 1.0f / (ufbx_real)face.num_indices); + + bool hole = fabs(avg_pos.y) > 0.49f; + num_holes += hole ? 1 : 0; + ufbxt_assert(mesh->face_hole.data[i] == hole); + } + ufbxt_assert(num_holes == 2); + } + + ufbx_mesh *sub_mesh = ufbx_subdivide_mesh(mesh, 2, NULL, NULL); + ufbxt_assert(sub_mesh); + ufbxt_check_mesh(scene, sub_mesh); + + { + size_t num_holes = 0; + ufbxt_assert(sub_mesh->face_hole.count == sub_mesh->num_faces); + for (size_t i = 0; i < sub_mesh->num_faces; i++) { + ufbx_face face = sub_mesh->faces.data[i]; + ufbx_vec3 avg_pos = ufbx_zero_vec3; + for (size_t j = 0; j < face.num_indices; j++) { + ufbx_vec3 p = ufbx_get_vertex_vec3(&sub_mesh->vertex_position, face.index_begin + j); + avg_pos = ufbxt_add3(avg_pos, p); + } + avg_pos = ufbxt_mul3(avg_pos, 1.0f / (ufbx_real)face.num_indices); + + bool hole = fabs(avg_pos.y) > 0.49f; + num_holes += hole ? 1 : 0; + ufbxt_assert(sub_mesh->face_hole.data[i] == hole); + } + ufbxt_assert(num_holes == 32); + } + + ufbx_free_mesh(sub_mesh); +} +#endif + +UFBXT_FILE_TEST_OPTS(synthetic_cursed_geometry, ufbxt_generate_normals_opts) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pDisc1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + uint32_t indices[64]; + + for (size_t i = 0; i < mesh->num_faces; i++) { + ufbx_face face = mesh->faces.data[i]; + size_t num_tris = ufbx_triangulate_face(indices, ufbxt_arraycount(indices), mesh, face); + ufbxt_assert(num_tris == 0 || num_tris == face.num_indices - 2); + } + + ufbx_mesh *sub_mesh = ufbx_subdivide_mesh(mesh, 2, NULL, NULL); + ufbx_free_mesh(sub_mesh); +} +#endif + +UFBXT_FILE_TEST(synthetic_vertex_gaps) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pPlane1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->vertices.count == 7); + + ufbx_vec3 gap_values[] = { + { -1.0f, -1.1f, -1.2f }, + { -2.0f, -2.1f, -2.2f }, + { -3.0f, -3.1f, -3.2f }, + { -4.0f, -4.1f, -4.2f }, + }; + + ufbxt_assert_close_vec3(err, mesh->vertices.data[0], gap_values[0]); + ufbxt_assert_close_vec3(err, mesh->vertices.data[3], gap_values[1]); + ufbxt_assert_close_vec3(err, mesh->vertices.data[6], gap_values[2]); + + ufbxt_assert(mesh->vertex_normal.values.count == 8); + ufbxt_assert_close_vec3(err, mesh->vertex_normal.values.data[0], gap_values[0]); + ufbxt_assert_close_vec3(err, mesh->vertex_normal.values.data[3], gap_values[1]); + ufbxt_assert_close_vec3(err, mesh->vertex_normal.values.data[6], gap_values[2]); + ufbxt_assert_close_vec3(err, mesh->vertex_normal.values.data[7], gap_values[3]); + + ufbx_vec2 gap_uvs[] = { + { -1.3f, -1.4f }, + { -2.3f, -2.4f }, + { -3.3f, -3.4f }, + { -4.3f, -4.4f }, + }; + + ufbxt_assert(mesh->vertex_uv.values.count == 8); + ufbxt_assert_close_vec2(err, mesh->vertex_uv.values.data[0], gap_uvs[0]); + ufbxt_assert_close_vec2(err, mesh->vertex_uv.values.data[2], gap_uvs[1]); + ufbxt_assert_close_vec2(err, mesh->vertex_uv.values.data[5], gap_uvs[2]); + ufbxt_assert_close_vec2(err, mesh->vertex_uv.values.data[7], gap_uvs[3]); +} +#endif + +#if UFBXT_IMPL + +typedef struct { + size_t num_faces; + size_t num_groups; +} ufbxt_groups_per_face_count; + +#endif + +UFBXT_FILE_TEST(zbrush_polygroup_mess) +#if UFBXT_IMPL +{ + + ufbxt_assert(scene->meshes.count == 1); + ufbx_mesh *mesh = scene->meshes.data[0]; + + ufbxt_groups_per_face_count groups_per_face_count_ref[] = { + { 1, 2 }, { 2, 1164 }, { 3, 1 }, { 4, 482 }, { 6, 181 }, { 8, 90 }, { 10, 26 }, { 12, 21 }, + { 14, 8 }, { 16, 10 }, { 18, 5 }, { 20, 6 }, { 22, 4 }, { 24, 7 }, { 26, 1 }, { 28, 1 }, + { 30, 1 }, { 32, 5 }, { 34, 2 }, { 40, 1 }, { 48, 3 }, { 50, 1 }, { 60, 1 }, { 64, 2 }, + { 72, 1 }, { 104, 1 }, { 128, 1 }, { 328, 1 }, + }; + + uint32_t groups_per_face_count[512] = { 0 }; + + ufbxt_assert(mesh->face_groups.count == 2029); + for (size_t i = 0; i < mesh->face_groups.count; i++) { + ufbx_face_group *group = &mesh->face_groups.data[i]; + ufbxt_assert(group->num_faces < ufbxt_arraycount(groups_per_face_count)); + groups_per_face_count[group->num_faces]++; + } + + for (size_t i = 0; i < ufbxt_arraycount(groups_per_face_count_ref); i++) { + ufbxt_groups_per_face_count ref = groups_per_face_count_ref[i]; + ufbxt_assert(groups_per_face_count[ref.num_faces] == ref.num_groups); + } +} +#endif + +UFBXT_FILE_TEST(zbrush_cut_sphere) +#if UFBXT_IMPL +{ +} +#endif + +#if UFBXT_IMPL +typedef struct { + int32_t id; + uint32_t face_count; +} ufbxt_face_group_ref; +#endif + +UFBXT_FILE_TEST(synthetic_face_group_id) +#if UFBXT_IMPL +{ + const ufbxt_face_group_ref ref_groups[] = { + { -2147483647 - 1, 1 }, + { -2000, 2 }, + { -2, 1 }, + { -1, 1 }, + { 0, 3 }, + { 1, 2 }, + { 2, 2 }, + { 10, 1 }, + { 20, 1 }, + { 30, 1 }, + { 40, 1 }, + { 50, 1 }, + { 3000, 2 }, + { 2147483647, 1 }, + }; + + ufbx_node *node = ufbx_find_node(scene, "20 Sided"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + for (size_t i = 0; i < ufbxt_arraycount(ref_groups); i++) { + ufbxt_hintf("i = %zu", i); + ufbxt_assert(i < mesh->face_groups.count); + ufbx_face_group *group = &mesh->face_groups.data[i]; + ufbxt_assert(group->id == ref_groups[i].id); + ufbxt_assert(group->num_faces == ref_groups[i].face_count); + } +} +#endif + +UFBXT_FILE_TEST(blender_279_empty_cube) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Cube"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 0); + ufbxt_assert(mesh->num_indices == 0); + ufbxt_assert(mesh->num_vertices == 0); + + ufbxt_assert(mesh->materials.count == 1); + ufbxt_assert(mesh->materials.data[0].material); + ufbxt_assert(mesh->materials.data[0].num_faces == 0); +} +#endif + +UFBXT_FILE_TEST(synthetic_truncated_crease_partial) +#if UFBXT_IMPL +{ + ufbxt_check_warning(scene, UFBX_WARNING_TRUNCATED_ARRAY, 1, "Truncated array: EdgeCrease"); + + ufbx_node *node = ufbx_find_node(scene, "pPlane1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->edge_crease.count == 4); + ufbxt_assert_close_real(err, mesh->edge_crease.data[0], 0.25f); + ufbxt_assert_close_real(err, mesh->edge_crease.data[1], 0.5f); + ufbxt_assert_close_real(err, mesh->edge_crease.data[2], 0.5f); + ufbxt_assert_close_real(err, mesh->edge_crease.data[3], 0.5f); +} +#endif + +UFBXT_FILE_TEST(synthetic_truncated_crease_full) +#if UFBXT_IMPL +{ + ufbxt_check_warning(scene, UFBX_WARNING_TRUNCATED_ARRAY, 1, "Truncated array: EdgeCrease"); + + ufbx_node *node = ufbx_find_node(scene, "pPlane1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->edge_crease.count == 4); + ufbxt_assert_close_real(err, mesh->edge_crease.data[0], 0.0f); + ufbxt_assert_close_real(err, mesh->edge_crease.data[1], 0.0f); + ufbxt_assert_close_real(err, mesh->edge_crease.data[2], 0.0f); + ufbxt_assert_close_real(err, mesh->edge_crease.data[3], 0.0f); +} +#endif diff --git a/modules/ufbx/test/test_nurbs.h b/modules/ufbx/test/test_nurbs.h new file mode 100644 index 0000000..122e965 --- /dev/null +++ b/modules/ufbx/test/test_nurbs.h @@ -0,0 +1,637 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "nurbs" + +#if UFBXT_IMPL + +typedef struct { + ufbx_real u; + ufbx_vec3 position; + ufbx_vec3 derivative; +} ufbxt_curve_sample; + +typedef struct { + ufbx_real u, v; + ufbx_vec3 position; + ufbx_vec3 derivative_u; + ufbx_vec3 derivative_v; +} ufbxt_surface_sample; + +#endif + +UFBXT_FILE_TEST(maya_nurbs_curve_form) +#if UFBXT_IMPL +{ + ufbx_node *node_open = ufbx_find_node(scene, "circleOpen"); + ufbx_node *node_closed = ufbx_find_node(scene, "circleClosed"); + ufbx_node *node_periodic = ufbx_find_node(scene, "circlePeriodic"); + + ufbxt_assert(node_open && node_open->attrib_type == UFBX_ELEMENT_NURBS_CURVE); + ufbxt_assert(node_closed && node_closed->attrib_type == UFBX_ELEMENT_NURBS_CURVE); + ufbxt_assert(node_periodic && node_periodic->attrib_type == UFBX_ELEMENT_NURBS_CURVE); + + ufbx_nurbs_curve *open = (ufbx_nurbs_curve*)node_open->attrib; + ufbx_nurbs_curve *closed = (ufbx_nurbs_curve*)node_closed->attrib; + ufbx_nurbs_curve *periodic = (ufbx_nurbs_curve*)node_periodic->attrib; + + ufbxt_assert(open->basis.valid); + ufbxt_assert(closed->basis.valid); + ufbxt_assert(periodic->basis.valid); + + ufbxt_assert(open->basis.topology == UFBX_NURBS_TOPOLOGY_OPEN); + ufbxt_assert(closed->basis.topology == UFBX_NURBS_TOPOLOGY_CLOSED); + ufbxt_assert(periodic->basis.topology == UFBX_NURBS_TOPOLOGY_PERIODIC); + + ufbxt_assert(open->basis.order == 4); + ufbxt_assert(closed->basis.order == 4); + ufbxt_assert(periodic->basis.order == 4); + + ufbxt_assert(!open->basis.is_2d); + ufbxt_assert(!closed->basis.is_2d); + ufbxt_assert(!periodic->basis.is_2d); + + { + ufbxt_assert_close_real(err, open->basis.t_min, 0.0f); + ufbxt_assert_close_real(err, open->basis.t_max, 1.0f); + ufbxt_assert(open->basis.knot_vector.count == 8); + ufbxt_assert(open->basis.spans.count == 2); + ufbxt_assert(open->control_points.count == 4); + + { + ufbx_real weights[16]; + size_t knot = ufbx_evaluate_nurbs_basis(&open->basis, 0.0f, weights, 16, NULL, 0); + ufbxt_assert(knot == 0); + ufbxt_assert_close_real(err, weights[0], 1.0f); + ufbxt_assert_close_real(err, weights[1], 0.0f); + ufbxt_assert_close_real(err, weights[2], 0.0f); + ufbxt_assert_close_real(err, weights[3], 0.0f); + } + + { + ufbx_real weights[16]; + size_t knot = ufbx_evaluate_nurbs_basis(&open->basis, 0.5f, weights, 16, NULL, 0); + ufbxt_assert(knot == 0); + ufbxt_assert_close_real(err, weights[0], 0.125f); + ufbxt_assert_close_real(err, weights[1], 0.375f); + ufbxt_assert_close_real(err, weights[2], 0.375f); + ufbxt_assert_close_real(err, weights[3], 0.125f); + } + + { + ufbx_real weights[16]; + size_t knot = ufbx_evaluate_nurbs_basis(&open->basis, 1.0f, weights, 16, NULL, 0); + ufbxt_assert(knot == 0); + ufbxt_assert_close_real(err, weights[0], 0.0f); + ufbxt_assert_close_real(err, weights[1], 0.0f); + ufbxt_assert_close_real(err, weights[2], 0.0f); + ufbxt_assert_close_real(err, weights[3], 1.0f); + } + + { + ufbxt_curve_sample samples[] = { + { 0.00f, { 0.000000f, 0.0f, -1.000000f }, { -1.500000f, 0.0f, 0.000000f } }, + { 0.10f, { -0.149500f, 0.0f, -0.985500f }, { -1.485000f, 0.0f, 0.285000f } }, + { 0.20f, { -0.296000f, 0.0f, -0.944000f }, { -1.440000f, 0.0f, 0.540000f } }, + { 0.30f, { -0.436500f, 0.0f, -0.878500f }, { -1.365000f, 0.0f, 0.765000f } }, + { 0.40f, { -0.568000f, 0.0f, -0.792000f }, { -1.260000f, 0.0f, 0.960000f } }, + { 0.50f, { -0.687500f, 0.0f, -0.687500f }, { -1.125000f, 0.0f, 1.125000f } }, + { 0.60f, { -0.792000f, 0.0f, -0.568000f }, { -0.960000f, 0.0f, 1.260000f } }, + { 0.70f, { -0.878500f, 0.0f, -0.436500f }, { -0.765000f, 0.0f, 1.365000f } }, + { 0.80f, { -0.944000f, 0.0f, -0.296000f }, { -0.540000f, 0.0f, 1.440000f } }, + { 0.90f, { -0.985500f, 0.0f, -0.149500f }, { -0.285000f, 0.0f, 1.485000f } }, + { 1.00f, { -1.000000f, 0.0f, -0.000000f }, { 0.000000f, 0.0f, 1.500000f } }, + }; + + for (size_t i = 0; i < ufbxt_arraycount(samples); i++) { + ufbxt_hintf("i: %zu", i); + const ufbxt_curve_sample *sample = &samples[i]; + ufbx_curve_point p = ufbx_evaluate_nurbs_curve(open, sample->u); + ufbxt_assert_close_vec3(err, p.position, sample->position); + ufbxt_assert_close_vec3(err, p.derivative, sample->derivative); + } + } + } + + { + ufbxt_assert_close_real(err, closed->basis.t_min, 1.0f); + ufbxt_assert_close_real(err, closed->basis.t_max, 5.0f); + ufbxt_assert(closed->basis.knot_vector.count == 11); + ufbxt_assert(closed->basis.spans.count == 5); + ufbxt_assert(closed->control_points.count == 6); + + { + ufbx_real weights[16]; + size_t knot = ufbx_evaluate_nurbs_basis(&closed->basis, 3.14f, weights, 16, NULL, 0); + ufbxt_assert(knot == 2); + ufbxt_assert_close_real(err, weights[0], 0.106009f); + ufbxt_assert_close_real(err, weights[1], 0.648438f); + ufbxt_assert_close_real(err, weights[2], 0.244866f); + ufbxt_assert_close_real(err, weights[3], 0.000686f); + } + + { + ufbxt_curve_sample samples[] = { + { 1.00f, { -1.000000f, 0.0f, 0.000000f }, { 0.000000f, 0.0f, 1.500000f } }, + { 1.30f, { -0.878500f, 0.0f, 0.436500f }, { 0.765000f, 0.0f, 1.365000f } }, + { 1.60f, { -0.568000f, 0.0f, 0.792000f }, { 1.260000f, 0.0f, 0.960000f } }, + { 1.90f, { -0.149500f, 0.0f, 0.985500f }, { 1.485000f, 0.0f, 0.285000f } }, + { 2.20f, { 0.296000f, 0.0f, 0.944000f }, { 1.440000f, 0.0f, -0.540000f } }, + { 2.50f, { 0.687500f, 0.0f, 0.687500f }, { 1.125000f, 0.0f, -1.125000f } }, + { 2.80f, { 0.944000f, 0.0f, 0.296000f }, { 0.540000f, 0.0f, -1.440000f } }, + { 3.10f, { 0.985500f, 0.0f, -0.149500f }, { -0.285000f, 0.0f, -1.485000f } }, + { 3.40f, { 0.792000f, 0.0f, -0.568000f }, { -0.960000f, 0.0f, -1.260000f } }, + { 3.70f, { 0.436500f, 0.0f, -0.878500f }, { -1.365000f, 0.0f, -0.765000f } }, + { 4.00f, { 0.000000f, 0.0f, -1.000000f }, { -1.500000f, 0.0f, -0.000000f } }, + { 4.30f, { -0.436500f, 0.0f, -0.878500f }, { -1.365000f, 0.0f, 0.765000f } }, + { 4.60f, { -0.792000f, 0.0f, -0.568000f }, { -0.960000f, 0.0f, 1.260000f } }, + { 4.90f, { -0.985500f, 0.0f, -0.149500f }, { -0.285000f, 0.0f, 1.485000f } }, + }; + + for (size_t i = 0; i < ufbxt_arraycount(samples); i++) { + ufbxt_hintf("i: %zu", i); + const ufbxt_curve_sample *sample = &samples[i]; + ufbx_curve_point p = ufbx_evaluate_nurbs_curve(closed, sample->u); + ufbxt_assert_close_vec3(err, p.position, sample->position); + ufbxt_assert_close_vec3(err, p.derivative, sample->derivative); + } + } + } + + { + ufbxt_assert_close_real(err, periodic->basis.t_min, 0.0f); + ufbxt_assert_close_real(err, periodic->basis.t_max, 4.0f); + ufbxt_assert(periodic->basis.knot_vector.count == 11); + ufbxt_assert(periodic->basis.spans.count == 5); + ufbxt_assert(periodic->control_points.count == 4); + + { + ufbxt_curve_sample samples[] = { + { 0.00f, { 0.000000f, 0.0f, -1.000000f }, { -1.500000f, 0.0f, 0.000000f } }, + { 0.20f, { -0.296000f, 0.0f, -0.944000f }, { -1.440000f, 0.0f, 0.540000f } }, + { 0.40f, { -0.568000f, 0.0f, -0.792000f }, { -1.260000f, 0.0f, 0.960000f } }, + { 0.60f, { -0.792000f, 0.0f, -0.568000f }, { -0.960000f, 0.0f, 1.260000f } }, + { 0.80f, { -0.944000f, 0.0f, -0.296000f }, { -0.540000f, 0.0f, 1.440000f } }, + { 1.00f, { -1.000000f, 0.0f, 0.000000f }, { 0.000000f, 0.0f, 1.500000f } }, + { 1.20f, { -0.944000f, 0.0f, 0.296000f }, { 0.540000f, 0.0f, 1.440000f } }, + { 1.40f, { -0.792000f, 0.0f, 0.568000f }, { 0.960000f, 0.0f, 1.260000f } }, + { 1.60f, { -0.568000f, 0.0f, 0.792000f }, { 1.260000f, 0.0f, 0.960000f } }, + { 1.80f, { -0.296000f, 0.0f, 0.944000f }, { 1.440000f, 0.0f, 0.540000f } }, + { 2.00f, { -0.000000f, 0.0f, 1.000000f }, { 1.500000f, 0.0f, 0.000000f } }, + { 2.20f, { 0.296000f, 0.0f, 0.944000f }, { 1.440000f, 0.0f, -0.540000f } }, + { 2.40f, { 0.568000f, 0.0f, 0.792000f }, { 1.260000f, 0.0f, -0.960000f } }, + { 2.60f, { 0.792000f, 0.0f, 0.568000f }, { 0.960000f, 0.0f, -1.260000f } }, + { 2.80f, { 0.944000f, 0.0f, 0.296000f }, { 0.540000f, 0.0f, -1.440000f } }, + { 3.00f, { 1.000000f, 0.0f, -0.000000f }, { -0.000000f, 0.0f, -1.500000f } }, + { 3.20f, { 0.944000f, 0.0f, -0.296000f }, { -0.540000f, 0.0f, -1.440000f } }, + { 3.40f, { 0.792000f, 0.0f, -0.568000f }, { -0.960000f, 0.0f, -1.260000f } }, + { 3.60f, { 0.568000f, 0.0f, -0.792000f }, { -1.260000f, 0.0f, -0.960000f } }, + { 3.80f, { 0.296000f, 0.0f, -0.944000f }, { -1.440000f, 0.0f, -0.540000f } }, + { 4.00f, { -0.000000f, 0.0f, -1.000000f }, { -1.500000f, 0.0f, 0.000000f } }, + }; + + for (size_t i = 0; i < ufbxt_arraycount(samples); i++) { + ufbxt_hintf("i: %zu", i); + const ufbxt_curve_sample *sample = &samples[i]; + ufbx_curve_point p = ufbx_evaluate_nurbs_curve(periodic, sample->u); + ufbxt_assert_close_vec3(err, p.position, sample->position); + ufbxt_assert_close_vec3(err, p.derivative, sample->derivative); + } + } + } +} +#endif + +UFBXT_FILE_TEST(max_nurbs_curve_rational) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Curve001"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_NURBS_CURVE); + ufbx_nurbs_curve *curve = (ufbx_nurbs_curve*)node->attrib; + + ufbxt_curve_sample samples[] = { + { 0.000000f, { 0.000000f, -40.000000f, 0.000000f }, { -24.322954f, 0.000000f, 6.080737f } }, + { 0.974593f, { -17.005555f, -37.570554f, 4.572092f }, { -12.337594f, 4.358807f, 3.678146f } }, + { 1.949186f, { -26.036811f, -32.223433f, 7.596081f }, { -6.784099f, 6.393973f, 2.654863f } }, + { 2.923779f, { -30.970646f, -25.399582f, 9.909292f }, { -3.585288f, 7.504839f, 2.146619f } }, + { 3.898372f, { -33.353768f, -17.752430f, 11.854892f }, { -1.420225f, 8.123470f, 1.872876f } }, + { 4.872965f, { -33.899033f, -9.674799f, 13.598350f }, { 0.243486f, 8.402346f, 1.719326f } }, + { 5.847558f, { -32.960866f, -1.468619f, 15.227145f }, { 1.651919f, 8.390724f, 1.631066f } }, + { 6.822152f, { -30.721680f, 6.587631f, 16.788850f }, { 2.927439f, 8.093263f, 1.577779f } }, + { 7.796745f, { -27.278008f, 14.208835f, 18.307632f }, { 4.130179f, 7.494472f, 1.540372f } }, + { 8.771338f, { -22.686868f, 21.090577f, 19.792049f }, { 5.283867f, 6.572031f, 1.505301f } }, + { 9.745931f, { -16.994772f, 26.907367f, 21.239065f }, { 6.387689f, 5.306512f, 1.462049f } }, + { 10.720524f, { -10.270443f, 31.351748f, 22.650823f }, { 7.377118f, 3.800029f, 1.451715f } }, + { 11.695117f, { -2.706724f, 34.283196f, 24.096090f }, { 8.085573f, 2.198608f, 1.524685f } }, + { 12.669710f, { 5.351791f, 35.610305f, 25.636226f }, { 8.370286f, 0.517035f, 1.639198f } }, + { 13.644303f, { 13.435696f, 35.294565f, 27.290675f }, { 8.125935f, -1.151753f, 1.752252f } }, + { 14.618896f, { 21.010971f, 33.416195f, 29.038561f }, { 7.331955f, -2.663870f, 1.825309f } }, + { 15.593489f, { 27.575750f, 30.201053f, 30.826822f }, { 6.075349f, -3.873362f, 1.832138f } }, + { 16.568082f, { 32.759100f, 25.997218f, 32.585338f }, { 4.530977f, -4.682518f, 1.764466f } }, + { 17.542675f, { 36.382081f, 21.211799f, 34.244771f }, { 2.907510f, -5.069834f, 1.631536f } }, + { 18.517268f, { 38.464958f, 16.297312f, 35.744787f }, { 1.405886f, -4.869993f, 1.433972f } }, + { 19.491861f, { 39.216555f, 11.905556f, 37.036473f }, { 0.183372f, -4.095993f, 1.223988f } }, + { 20.466455f, { 38.892809f, 8.347449f, 38.154114f }, { -0.825634f, -3.206871f, 1.084857f } }, + { 21.441048f, { 37.616454f, 5.638129f, 39.185141f }, { -1.808639f, -2.363861f, 1.050754f } }, + { 22.415641f, { 35.306462f, 3.716150f, 40.244592f }, { -2.930163f, -1.617486f, 1.138404f } }, + { 23.390234f, { 31.980875f, 2.380957f, 41.416165f }, { -3.862865f, -1.167548f, 1.271465f } }, + { 24.364827f, { 27.819473f, 1.365943f, 42.736393f }, { -4.662313f, -0.950026f, 1.446458f } }, + { 25.339420f, { 22.913277f, 0.459596f, 44.257763f }, { -5.398160f, -0.950224f, 1.690832f } }, + { 26.314013f, { 17.312988f, -0.588856f, 46.074971f }, { -6.083534f, -1.274792f, 2.070482f } }, + { 27.288606f, { 11.096546f, -2.257805f, 48.396616f }, { -6.632300f, -2.349350f, 2.781984f } }, + { 28.263199f, { 4.579470f, -5.973973f, 51.849971f }, { -6.516068f, -6.140789f, 4.679450f } }, + { 29.237792f, { -0.000000f, -20.000002f, 60.000000f }, { -0.000000f, -32.801115f, 16.400558f } }, + }; + + for (size_t i = 0; i < ufbxt_arraycount(samples); i++) { + ufbxt_hintf("i: %zu", i); + const ufbxt_curve_sample *sample = &samples[i]; + ufbx_curve_point p = ufbx_evaluate_nurbs_curve(curve, sample->u); + ufbxt_assert_close_vec3(err, p.position, sample->position); + ufbxt_assert_close_vec3(err, p.derivative, sample->derivative); + } +} +#endif + +UFBXT_FILE_TEST(maya_nurbs_curve_multiplicity) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "curve1"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_NURBS_CURVE); + ufbx_nurbs_curve *curve = (ufbx_nurbs_curve*)node->attrib; + + ufbxt_assert(curve->basis.order == 6); + + ufbxt_assert_close_real(err, curve->basis.t_min, 0.0f); + ufbxt_assert_close_real(err, curve->basis.t_max, 43.257f); + + for (size_t i = 1; i < curve->basis.spans.count; i++) { + ufbxt_assert(curve->basis.spans.data[i - 1] < curve->basis.spans.data[i]); + } + + ufbxt_curve_sample samples[] = { + { 0.000000f, { 0.908068f, 0.000000f, -0.405819f }, { 0.253319f, 0.000000f, -0.445464f } }, + { 1.081421f, { 1.119511f, 0.000000f, -0.868651f }, { 0.205140f, 0.000000f, -0.285504f } }, + { 2.162843f, { 1.387340f, 0.000000f, -0.963056f }, { 0.256681f, 0.000000f, 0.053404f } }, + { 3.244264f, { 1.633207f, 0.000000f, -0.849916f }, { 0.200801f, 0.000000f, 0.139006f } }, + { 4.325685f, { 1.835297f, 0.000000f, -0.683140f }, { 0.178149f, 0.000000f, 0.161468f } }, + { 5.407107f, { 2.026478f, 0.000000f, -0.516048f }, { 0.177779f, 0.000000f, 0.141353f } }, + { 6.488528f, { 2.222653f, 0.000000f, -0.388757f }, { 0.185504f, 0.000000f, 0.089817f } }, + { 7.569949f, { 2.427523f, 0.000000f, -0.328685f }, { 0.192948f, 0.000000f, 0.019186f } }, + { 8.651371f, { 2.638875f, 0.000000f, -0.349293f }, { 0.197550f, 0.000000f, -0.057045f } }, + { 9.732792f, { 2.854870f, 0.000000f, -0.448812f }, { 0.202560f, 0.000000f, -0.124212f } }, + { 10.814214f, { 3.080323f, 0.000000f, -0.608983f }, { 0.217038f, 0.000000f, -0.166482f } }, + { 11.895635f, { 3.332994f, 0.000000f, -0.793795f }, { 0.255859f, 0.000000f, -0.166851f } }, + { 12.977056f, { 3.649869f, 0.000000f, -0.948214f }, { 0.339710f, 0.000000f, -0.107146f } }, + { 14.058478f, { 3.985671f, 0.000000f, 0.194786f }, { -0.143623f, 0.000000f, 5.538350f } }, + { 15.139899f, { 3.504179f, 0.000000f, 3.786682f }, { -0.683192f, 0.000000f, 1.734052f } }, + { 16.221320f, { 2.613011f, 0.000000f, 4.871228f }, { -0.929318f, 0.000000f, 0.531104f } }, + { 17.302742f, { 1.550585f, 0.000000f, 5.237214f }, { -1.016831f, 0.000000f, 0.198109f } }, + { 18.384163f, { 0.445465f, 0.000000f, 5.328320f }, { -1.014626f, 0.000000f, -0.029385f } }, + { 19.465584f, { -0.620174f, 0.000000f, 5.174213f }, { -0.946609f, 0.000000f, -0.255004f } }, + { 20.547006f, { -1.584181f, 0.000000f, 4.779433f }, { -0.829428f, 0.000000f, -0.473124f } }, + { 21.628427f, { -2.402332f, 0.000000f, 4.157381f }, { -0.679606f, 0.000000f, -0.673164f } }, + { 22.709848f, { -3.048214f, 0.000000f, 3.335470f }, { -0.513558f, 0.000000f, -0.839798f } }, + { 23.791270f, { -3.513108f, 0.000000f, 2.360250f }, { -0.347591f, 0.000000f, -0.952957f } }, + { 24.872691f, { -3.805868f, 0.000000f, 1.302539f }, { -0.197901f, 0.000000f, -0.987827f } }, + { 25.954113f, { -3.952805f, 0.000000f, 0.262553f }, { -0.080577f, 0.000000f, -0.914853f } }, + { 27.035534f, { -3.997572f, 0.000000f, -0.624962f }, { -0.011599f, 0.000000f, -0.699733f } }, + { 28.116955f, { -2.943720f, 0.000000f, -0.502852f }, { 0.978119f, 0.000000f, 1.270640f } }, + { 29.198377f, { -2.049079f, 0.000000f, -0.429651f }, { 0.608714f, 0.000000f, -0.657963f } }, + { 30.279798f, { -1.426889f, 0.000000f, -0.907600f }, { 0.591440f, 0.000000f, -0.061570f } }, + { 31.361219f, { -1.030212f, 0.000000f, -0.664031f }, { 0.116667f, 0.000000f, 0.406368f } }, + { 32.442641f, { -0.988133f, 0.000000f, -0.182528f }, { 0.031241f, 0.000000f, 0.447589f } }, + { 33.524062f, { -0.910710f, 0.000000f, 0.269968f }, { 0.117183f, 0.000000f, 0.384560f } }, + { 34.605483f, { -0.736010f, 0.000000f, 0.651700f }, { 0.200556f, 0.000000f, 0.327364f } }, + { 35.686905f, { -0.495401f, 0.000000f, 0.997855f }, { 0.233755f, 0.000000f, 0.324195f } }, + { 36.768326f, { -0.254763f, 0.000000f, 1.378865f }, { 0.200505f, 0.000000f, 0.392064f } }, + { 37.849747f, { -0.080667f, 0.000000f, 1.866711f }, { 0.115792f, 0.000000f, 0.516827f } }, + { 38.931169f, { -0.006578f, 0.000000f, 2.501231f }, { 0.025863f, 0.000000f, 0.653179f } }, + { 40.012590f, { 1.291208f, 0.000000f, 3.143478f }, { 1.958604f, 0.000000f, 0.677384f } }, + { 41.094012f, { 0.552930f, 0.000000f, 3.783813f }, { -1.959784f, 0.000000f, 0.211471f } }, + { 42.175433f, { -1.250738f, 0.000000f, 3.642614f }, { -1.058494f, 0.000000f, -0.348306f } }, + { 43.256854f, { -1.669232f, 0.000000f, 3.251459f }, { 0.154248f, 0.000000f, -0.305748f } }, + }; + + for (size_t i = 0; i < ufbxt_arraycount(samples); i++) { + ufbxt_hintf("i: %zu", i); + const ufbxt_curve_sample *sample = &samples[i]; + ufbx_curve_point p = ufbx_evaluate_nurbs_curve(curve, sample->u); + ufbxt_assert_close_vec3(err, p.position, sample->position); + ufbxt_assert_close_vec3(err, p.derivative, sample->derivative); + } +} +#endif + +UFBXT_FILE_TEST(maya_nurbs_curve_linear) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "curve1"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_NURBS_CURVE); + ufbx_nurbs_curve *curve = (ufbx_nurbs_curve*)node->attrib; + + ufbxt_assert(curve->basis.order == 2); + + ufbxt_curve_sample samples[] = { + { 0.000000f, { 0.000000f, 0.000000f, -1.000000f }, { 1.000000f, 0.000000f, 0.000000f } }, + { 1.400000f, { 1.000000f, 0.000000f, -1.400000f }, { 0.000000f, 0.000000f, -1.000000f } }, + { 2.800000f, { 1.800000f, 0.000000f, -2.000000f }, { 1.000000f, 0.000000f, 0.000000f } }, + { 4.200000f, { 1.800000f, 0.000000f, 1.000000f }, { -1.000000f, 0.000000f, 0.000000f } }, + { 5.600000f, { 1.000000f, 0.000000f, 1.600000f }, { 0.000000f, 0.000000f, 1.000000f } }, + { 7.000000f, { -1.000000f, 0.000000f, 2.000000f }, { 0.000000f, 0.000000f, -1.000000f } }, + { 8.400000f, { -1.400000f, 0.000000f, 1.000000f }, { -1.000000f, 0.000000f, 0.000000f } }, + { 9.800000f, { -2.000000f, 0.000000f, -1.400000f }, { 0.000000f, 0.000000f, -3.000000f } }, + { 11.200000f, { -1.000000f, 0.000000f, -1.800000f }, { 0.000000f, 0.000000f, 1.000000f } }, + { 12.600000f, { -0.400000f, 0.000000f, -1.000000f }, { 1.000000f, 0.000000f, 0.000000f } }, + }; + + for (size_t i = 0; i < ufbxt_arraycount(samples); i++) { + ufbxt_hintf("i: %zu", i); + const ufbxt_curve_sample *sample = &samples[i]; + ufbx_curve_point p = ufbx_evaluate_nurbs_curve(curve, sample->u); + ufbxt_assert_close_vec3(err, p.position, sample->position); + ufbxt_assert_close_vec3(err, p.derivative, sample->derivative); + } +} +#endif + +UFBXT_FILE_TEST(maya_nurbs_surface_plane) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "nurbsPlane1"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_NURBS_SURFACE); + ufbx_nurbs_surface *surface = (ufbx_nurbs_surface*)node->attrib; + + ufbxt_assert(surface->span_subdivision_u == 4); + ufbxt_assert(surface->span_subdivision_v == 4); + + ufbxt_assert(surface->material); + ufbxt_assert(!strcmp(surface->material->name.data, "lambert1")); + + ufbxt_assert(surface->num_control_points_u == 5); + ufbxt_assert(surface->num_control_points_v == 6); + ufbxt_assert(!surface->flip_normals); + + ufbxt_surface_sample samples[] = { + { 0.000000f, 0.000000f, { -0.500000f, -0.550589f, 0.500000f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.000000f, 4.955298f, -1.000000f } }, + { 0.000000f, 0.200000f, { -0.500000f, 0.113108f, 0.300000f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.000000f, 1.958420f, -1.000000f } }, + { 0.000000f, 0.400000f, { -0.500000f, 0.342215f, 0.100000f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.000000f, 0.565126f, -1.000000f } }, + { 0.000000f, 0.600000f, { -0.500000f, 0.391664f, -0.100000f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.000000f, 0.035320f, -1.000000f } }, + { 0.000000f, 0.800000f, { -0.500000f, 0.392449f, -0.300000f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.000000f, -0.000000f, -1.000000f } }, + { 0.000000f, 1.000000f, { -0.500000f, 0.392449f, -0.500000f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.000000f, 0.000000f, -1.000000f } }, + { 0.200000f, 0.000000f, { -0.300000f, -0.550589f, 0.500000f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.000000f, 4.955298f, -1.000000f } }, + { 0.200000f, 0.200000f, { -0.300000f, 0.084626f, 0.300000f }, { 1.000000f, -0.249221f, -0.000000f }, { -0.000000f, 1.734630f, -1.000000f } }, + { 0.200000f, 0.400000f, { -0.300007f, 0.276510f, 0.100005f }, { 0.999902f, -0.574922f, 0.000072f }, { -0.000294f, 0.456622f, -0.999783f } }, + { 0.200000f, 0.600000f, { -0.300418f, 0.316464f, -0.099691f }, { 0.993731f, -0.657995f, 0.004628f }, { -0.004701f, 0.028539f, -0.996529f } }, + { 0.200000f, 0.800000f, { -0.302031f, 0.317098f, -0.298501f }, { 0.969539f, -0.659314f, 0.022489f }, { -0.009697f, -0.000000f, -0.992841f } }, + { 0.200000f, 1.000000f, { -0.303265f, 0.317098f, -0.497590f }, { 0.951027f, -0.659314f, 0.036156f }, { 0.000000f, 0.000000f, -1.000000f } }, + { 0.400000f, 0.000000f, { -0.100000f, -0.550589f, 0.500000f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.000000f, 4.955298f, -1.000000f } }, + { 0.400000f, 0.200000f, { -0.100000f, 0.027661f, 0.300000f }, { 1.000000f, -0.284823f, -0.000000f }, { -0.000000f, 1.287050f, -1.000000f } }, + { 0.400000f, 0.400000f, { -0.100052f, 0.145099f, 0.100039f }, { 0.999608f, -0.657053f, 0.000289f }, { -0.002351f, 0.239613f, -0.998265f } }, + { 0.400000f, 0.600000f, { -0.103343f, 0.166065f, -0.097532f }, { 0.974926f, -0.751994f, 0.018512f }, { -0.037611f, 0.014976f, -0.972232f } }, + { 0.400000f, 0.800000f, { -0.116246f, 0.166398f, -0.288006f }, { 0.878155f, -0.753501f, 0.089956f }, { -0.077574f, 0.000000f, -0.942729f } }, + { 0.400000f, 1.000000f, { -0.126119f, 0.166398f, -0.480717f }, { 0.804107f, -0.753501f, 0.144624f }, { 0.000000f, 0.000000f, -1.000000f } }, + { 0.600000f, 0.000000f, { 0.100000f, -0.550589f, 0.500000f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.000000f, 4.955298f, -1.000000f } }, + { 0.600000f, 0.200000f, { 0.100000f, -0.016249f, 0.300000f }, { 1.000000f, -0.142412f, -0.000000f }, { 0.000000f, 0.942041f, -1.000000f } }, + { 0.600000f, 0.400000f, { 0.099827f, 0.043804f, 0.100128f }, { 0.999216f, -0.328527f, 0.000578f }, { -0.007787f, 0.072336f, -0.994251f } }, + { 0.600000f, 0.600000f, { 0.088926f, 0.050133f, -0.091824f }, { 0.949851f, -0.375997f, 0.037024f }, { -0.124588f, 0.004521f, -0.908019f } }, + { 0.600000f, 0.800000f, { 0.046185f, 0.050233f, -0.260269f }, { 0.756309f, -0.376751f, 0.179913f }, { -0.256963f, 0.000000f, -0.810289f } }, + { 0.600000f, 1.000000f, { 0.013481f, 0.050233f, -0.436124f }, { 0.608214f, -0.376751f, 0.289249f }, { 0.000000f, 0.000000f, -1.000000f } }, + { 0.800000f, 0.000000f, { 0.300000f, -0.550589f, 0.500000f }, { 1.000000f, -0.000000f, 0.000000f }, { 0.000000f, 4.955298f, -1.000000f } }, + { 0.800000f, 0.200000f, { 0.300000f, -0.032864f, 0.300000f }, { 1.000000f, -0.035603f, 0.000000f }, { 0.000000f, 0.811497f, -1.000000f } }, + { 0.800000f, 0.400000f, { 0.299670f, 0.005475f, 0.100243f }, { 0.999314f, -0.082132f, 0.000506f }, { -0.014839f, 0.009042f, -0.989045f } }, + { 0.800000f, 0.600000f, { 0.278896f, 0.006267f, -0.084419f }, { 0.956120f, -0.093999f, 0.032396f }, { -0.237422f, 0.000565f, -0.824715f } }, + { 0.800000f, 0.800000f, { 0.197447f, 0.006279f, -0.224287f }, { 0.786770f, -0.094188f, 0.157424f }, { -0.489684f, 0.000000f, -0.638475f } }, + { 0.800000f, 1.000000f, { 0.135123f, 0.006279f, -0.378275f }, { 0.657187f, -0.094188f, 0.253093f }, { 0.000000f, 0.000000f, -1.000000f } }, + { 1.000000f, 0.000000f, { 0.500000f, -0.550589f, 0.500000f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.000000f, 4.955298f, -1.000000f } }, + { 1.000000f, 0.200000f, { 0.500000f, -0.035238f, 0.300000f }, { 1.000000f, -0.000000f, 0.000000f }, { 0.000000f, 0.792848f, -1.000000f } }, + { 1.000000f, 0.400000f, { 0.499592f, -0.000000f, 0.100301f }, { 1.000000f, -0.000000f, 0.000000f }, { -0.018365f, 0.000000f, -0.986441f } }, + { 1.000000f, 0.600000f, { 0.473881f, 0.000000f, -0.080717f }, { 1.000000f, -0.000000f, 0.000000f }, { -0.293840f, 0.000000f, -0.783063f } }, + { 1.000000f, 0.800000f, { 0.373078f, 0.000000f, -0.206295f }, { 1.000000f, 0.000000f, 0.000000f }, { -0.606044f, 0.000000f, -0.552568f } }, + { 1.000000f, 1.000000f, { 0.295945f, 0.000000f, -0.349350f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.000000f, 0.000000f, -1.000000f } }, + }; + + for (size_t i = 0; i < ufbxt_arraycount(samples); i++) { + ufbxt_hintf("i: %zu", i); + const ufbxt_surface_sample *sample = &samples[i]; + ufbx_surface_point p = ufbx_evaluate_nurbs_surface(surface, sample->u, sample->v); + ufbxt_assert_close_vec3(err, p.position, sample->position); + ufbxt_assert_close_vec3(err, p.derivative_u, sample->derivative_u); + ufbxt_assert_close_vec3(err, p.derivative_v, sample->derivative_v); + } +} +#endif + +UFBXT_FILE_TEST(maya_nurbs_surface_sphere) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "nurbsSphere1"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_NURBS_SURFACE); + ufbx_nurbs_surface *surface = (ufbx_nurbs_surface*)node->attrib; + + ufbxt_assert(surface->material); + ufbxt_assert(!strcmp(surface->material->name.data, "lambert1")); + + ufbxt_assert_close_real(err, surface->basis_u.t_min, 0.0f); + ufbxt_assert_close_real(err, surface->basis_u.t_max, 8.0f); + ufbxt_assert_close_real(err, surface->basis_v.t_min, 0.0f); + ufbxt_assert_close_real(err, surface->basis_v.t_max, 10.0f); + + for (ufbx_real u = 0.1f; u <= 7.9f; u += 0.05f) { + for (ufbx_real v = 0.0f; v <= 10.0f; v += 0.05f) { + ufbx_surface_point point = ufbx_evaluate_nurbs_surface(surface, u, v); + ufbx_vec3 normal = ufbxt_normalize(ufbxt_cross3(point.derivative_u, point.derivative_v)); + ufbxt_assert_close_vec3(err, ufbxt_mul3(point.position, 0.1f), ufbxt_mul3(normal, 0.1f)); + } + } +} +#endif + +UFBXT_FILE_TEST(maya_nurbs_low_sphere) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST_ALT(nurbs_alloc_fail, maya_nurbs_surface_plane) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "nurbsPlane1"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_NURBS_SURFACE); + ufbx_nurbs_surface *surface = (ufbx_nurbs_surface*)node->attrib; + + for (size_t max_temp = 1; max_temp < 10000; max_temp++) { + ufbx_tessellate_surface_opts opts = { 0 }; + opts.temp_allocator.huge_threshold = 1; + opts.temp_allocator.allocation_limit = max_temp; + + ufbxt_hintf("Temp limit: %zu", max_temp); + + ufbx_error error; + ufbx_mesh *tess_mesh = ufbx_tessellate_nurbs_surface(surface, &opts, &error); + if (tess_mesh) { + ufbxt_logf(".. Tested up to %zu temporary allocations", max_temp); + ufbx_free_mesh(tess_mesh); + break; + } + ufbxt_assert(error.type == UFBX_ERROR_ALLOCATION_LIMIT); + } + + for (size_t max_result = 1; max_result < 10000; max_result++) { + ufbx_tessellate_surface_opts opts = { 0 }; + opts.result_allocator.huge_threshold = 1; + opts.result_allocator.allocation_limit = max_result; + + ufbxt_hintf("Result limit: %zu", max_result); + + ufbx_error error; + ufbx_mesh *tess_mesh = ufbx_tessellate_nurbs_surface(surface, &opts, &error); + if (tess_mesh) { + ufbxt_logf(".. Tested up to %zu result allocations", max_result); + ufbx_free_mesh(tess_mesh); + break; + } + ufbxt_assert(error.type == UFBX_ERROR_ALLOCATION_LIMIT); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_nurbs_invalid) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "curve1"); + ufbxt_assert(node); + ufbx_nurbs_curve *curve = ufbx_as_nurbs_curve(node->attrib); + ufbxt_assert(!curve->basis.valid); + + ufbx_error error; + ufbx_line_curve *line = ufbx_tessellate_nurbs_curve(curve, NULL, &error); + ufbxt_assert(!line); + ufbxt_assert(error.type == UFBX_ERROR_BAD_NURBS); + } + + { + ufbx_node *node = ufbx_find_node(scene, "nurbsPlane1"); + ufbxt_assert(node); + ufbx_nurbs_surface *surface = ufbx_as_nurbs_surface(node->attrib); + ufbxt_assert(!surface->basis_u.valid); + ufbxt_assert(!surface->basis_v.valid); + + ufbx_error error; + ufbx_mesh *mesh = ufbx_tessellate_nurbs_surface(surface, NULL, &error); + ufbxt_assert(!mesh); + ufbxt_assert(error.type == UFBX_ERROR_BAD_NURBS); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_nurbs_truncated) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "curve1"); + ufbxt_assert(node); + ufbx_nurbs_curve *curve = ufbx_as_nurbs_curve(node->attrib); + ufbxt_assert(curve->basis.valid); + + ufbx_line_curve *line = ufbx_tessellate_nurbs_curve(curve, NULL, NULL); + ufbxt_assert(line); + ufbx_free_line_curve(line); + } + + { + ufbx_node *node = ufbx_find_node(scene, "nurbsPlane1"); + ufbxt_assert(node); + ufbx_nurbs_surface *surface = ufbx_as_nurbs_surface(node->attrib); + ufbxt_assert(surface->basis_u.valid); + ufbxt_assert(surface->basis_v.valid); + + ufbx_error error; + ufbx_mesh *mesh = ufbx_tessellate_nurbs_surface(surface, NULL, &error); + ufbxt_assert(mesh); + ufbx_free_mesh(mesh); + } +} +#endif + +UFBXT_FILE_TEST(max_nurbs_to_line) +#if UFBXT_IMPL +{ + ufbx_node *line_node = ufbx_find_node(scene, "Line"); + ufbx_node *nurbs_node = ufbx_find_node(scene, "Nurbs"); + ufbxt_assert(line_node); + ufbxt_assert(nurbs_node); + ufbx_line_curve *line = ufbx_as_line_curve(line_node->attrib); + ufbx_nurbs_curve *nurbs = ufbx_as_nurbs_curve(nurbs_node->attrib); + ufbxt_assert(line); + ufbxt_assert(nurbs); + + ufbx_tessellate_curve_opts opts = { 0 }; + opts.span_subdivision = 5; + ufbx_line_curve *tess_line = ufbx_tessellate_nurbs_curve(nurbs, &opts, NULL); + ufbxt_assert(tess_line); + + size_t num_indices = line->point_indices.count; + ufbxt_assert(line->segments.count == 1); + ufbxt_assert(tess_line->segments.count == 1); + ufbxt_assert(tess_line->point_indices.count == num_indices); + + ufbxt_assert(line->segments.data[0].index_begin == 0); + ufbxt_assert(tess_line->segments.data[0].index_begin == 0); + ufbxt_assert(line->segments.data[0].num_indices == num_indices); + ufbxt_assert(tess_line->segments.data[0].num_indices == num_indices); + + for (size_t i = 0; i < num_indices; i++) { + ufbx_vec3 point = line->control_points.data[line->point_indices.data[i]]; + ufbx_vec3 tess_point = tess_line->control_points.data[tess_line->point_indices.data[i]]; + ufbxt_assert_close_vec3(err, point, tess_point); + } + + ufbx_retain_line_curve(tess_line); + ufbx_free_line_curve(tess_line); + + ufbx_free_line_curve(tess_line); +} +#endif + +UFBXT_FILE_TEST_ALT(tessellate_line_alloc_fail, max_nurbs_to_line) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Nurbs"); + ufbx_nurbs_curve *nurbs = ufbx_as_nurbs_curve(node->attrib); + ufbxt_assert(nurbs); + + for (size_t max_temp = 1; max_temp < 10000; max_temp++) { + ufbx_tessellate_curve_opts opts = { 0 }; + opts.temp_allocator.huge_threshold = 1; + opts.temp_allocator.allocation_limit = max_temp; + + ufbxt_hintf("Temp limit: %zu", max_temp); + + ufbx_error error; + ufbx_line_curve *line = ufbx_tessellate_nurbs_curve(nurbs, &opts, &error); + if (line) { + ufbxt_logf(".. Tested up to %zu temporary allocations", max_temp); + ufbx_free_line_curve(line); + break; + } + ufbxt_assert(error.type == UFBX_ERROR_ALLOCATION_LIMIT); + } + + for (size_t max_result = 1; max_result < 10000; max_result++) { + ufbx_tessellate_curve_opts opts = { 0 }; + opts.result_allocator.huge_threshold = 1; + opts.result_allocator.allocation_limit = max_result; + + ufbxt_hintf("Result limit: %zu", max_result); + + ufbx_error error; + ufbx_line_curve *line = ufbx_tessellate_nurbs_curve(nurbs, &opts, &error); + if (line) { + ufbxt_logf(".. Tested up to %zu result allocations", max_result); + ufbx_free_line_curve(line); + break; + } + ufbxt_assert(error.type == UFBX_ERROR_ALLOCATION_LIMIT); + } +} +#endif diff --git a/modules/ufbx/test/test_obj.h b/modules/ufbx/test/test_obj.h new file mode 100644 index 0000000..74df78f --- /dev/null +++ b/modules/ufbx/test/test_obj.h @@ -0,0 +1,1531 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "obj" + +UFBXT_FILE_TEST(zbrush_vertex_color) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 2); + ufbx_node *node = scene->nodes.data[1]; + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->vertex_color.exists); + ufbxt_assert(mesh->vertex_color.unique_per_vertex); + + ufbxt_assert(mesh->num_vertices == 6); + for (size_t i = 0; i < mesh->num_vertices; i++) { + ufbx_vec3 pos = mesh->vertex_position.values.data[i]; + ufbx_vec4 color = ufbx_get_vertex_vec4(&mesh->vertex_color, mesh->vertex_first_index.data[i]); + ufbx_vec4 ref = { 0.0f, 0.0f, 0.0f, 1.0f }; + + pos.y -= 1.0f; + + if (pos.x < -0.5f) { + ref.x = 1.0f; + } else if (pos.x > 0.5f) { + ref.y = ref.z = 1.0f; + } else if (pos.y > 0.5f) { + ref.y = 1.0f; + } else if (pos.y < -0.5f) { + ref.x = ref.z = 1.0f; + } else if (pos.z > 0.5f) { + ref.z = 1.0f; + } else if (pos.z < -0.5f) { + ref.x = ref.y = 1.0f; + } + + ufbxt_assert_close_vec4(err, color, ref); + ufbxt_assert_close_vec4(err, color, ref); + } + +} +#endif + +UFBXT_FILE_TEST(synthetic_color_suzanne) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 2); + ufbx_node *node = scene->nodes.data[1]; + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->vertex_color.exists); + ufbxt_assert(mesh->vertex_color.unique_per_vertex); + + ufbxt_assert(mesh->num_faces == 500); + ufbxt_assert(mesh->num_triangles == 968); + + for (size_t i = 0; i < mesh->num_indices; i++) { + ufbx_vec3 position = ufbx_get_vertex_vec3(&mesh->vertex_position, i); + ufbx_vec4 color = ufbx_get_vertex_vec4(&mesh->vertex_color, i); + + ufbx_vec3 col = { color.x, color.y, color.z }; + + ufbx_vec3 ref; + ref.x = ufbxt_clamp(position.x * 0.5f + 0.5f, 0.0f, 1.0f); + ref.y = ufbxt_clamp(position.y * 0.5f + 0.5f, 0.0f, 1.0f); + ref.z = ufbxt_clamp(position.z * 0.5f + 0.5f, 0.0f, 1.0f); + + ufbxt_assert_close_vec3_threshold(err, col, ref, (ufbx_real)(1.0/256.0)); + } +} +#endif + +#if UFBXT_IMPL +static void ufbxt_check_obj_elements(ufbxt_diff_error *err, ufbx_scene *scene, int32_t v, int32_t vt, int32_t vn, int32_t vc, const char *name) +{ + ufbxt_hintf("name = \"%s\"", name); + + ufbx_node *node = ufbx_find_node(scene, name); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(!strcmp(mesh->name.data, name)); + + ufbxt_assert(mesh->num_faces == 1); + ufbxt_assert(mesh->num_triangles == 1); + + ufbx_face face = mesh->faces.data[0]; + ufbxt_assert(face.index_begin == 0); + ufbxt_assert(face.num_indices == 3); + + if (v > 0) { + ufbxt_assert(mesh->vertex_position.exists); + ufbxt_assert(mesh->vertex_position.indices.count == 3); + const ufbx_vec3 refs[] = { + { (ufbx_real)-v, 0.0f, (ufbx_real)(v - 1) }, + { (ufbx_real)+v, 0.0f, (ufbx_real)(v - 1) }, + { 0.0f, (ufbx_real)+v, (ufbx_real)(v - 1) }, + }; + for (size_t ix = 0; ix < 3; ix++) { + ufbx_vec3 val = ufbx_get_vertex_vec3(&mesh->vertex_position, ix); + ufbxt_assert_close_vec3(err, val, refs[ix]); + } + } else { + ufbxt_assert(!mesh->vertex_position.exists); + } + + if (vt > 0) { + ufbxt_assert(mesh->vertex_uv.exists); + ufbxt_assert(mesh->vertex_uv.indices.count == 3); + const ufbx_vec2 refs[] = { + { 0.0f, 0.0f }, + { (ufbx_real)vt, 0.0f }, + { 0.0f, (ufbx_real)vt }, + }; + for (size_t ix = 0; ix < 3; ix++) { + ufbx_vec2 val = ufbx_get_vertex_vec2(&mesh->vertex_uv, ix); + ufbxt_assert_close_vec2(err, val, refs[ix]); + } + } else { + ufbxt_assert(!mesh->vertex_uv.exists); + } + + if (vn > 0) { + ufbxt_assert(mesh->vertex_normal.exists); + ufbxt_assert(mesh->vertex_normal.indices.count == 3); + const ufbx_vec3 refs[] = { + { 0.0f, (ufbx_real)-vn, 0.0f }, + { 0.0f, (ufbx_real)-vn, 0.0f }, + { 0.0f, (ufbx_real)+vn, 0.0f }, + }; + for (size_t ix = 0; ix < 3; ix++) { + ufbx_vec3 val = ufbx_get_vertex_vec3(&mesh->vertex_normal, ix); + ufbxt_assert_close_vec3(err, val, refs[ix]); + } + } else { + ufbxt_assert(!mesh->vertex_normal.exists); + } + + if (vc > 0) { + ufbxt_assert(mesh->vertex_color.exists); + ufbxt_assert(mesh->vertex_color.indices.count == 3); + const ufbx_vec4 refs[] = { + { (ufbx_real)vc, 0.0f, 0.0f, 1.0f }, + { 0.0f, (ufbx_real)vc, 0.0f, 1.0f }, + { 0.0f, 0.0f, (ufbx_real)vc, 1.0f }, + }; + for (size_t ix = 0; ix < 3; ix++) { + ufbx_vec4 val = ufbx_get_vertex_vec4(&mesh->vertex_color, ix); + ufbxt_assert_close_vec4(err, val, refs[ix]); + } + } else { + ufbxt_assert(!mesh->vertex_color.exists); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_mixed_attribs) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 9); + ufbxt_assert(scene->meshes.count == 8); + ufbxt_check_obj_elements(err, scene, 1, 0, 0, 0, "V"); + ufbxt_check_obj_elements(err, scene, 2, 1, 0, 0, "VT"); + ufbxt_check_obj_elements(err, scene, 3, 0, 1, 0, "VN"); + ufbxt_check_obj_elements(err, scene, 4, 2, 2, 0, "VTN"); + ufbxt_check_obj_elements(err, scene, 5, 0, 0, 1, "VC"); + ufbxt_check_obj_elements(err, scene, 6, 3, 0, 2, "VTC"); + ufbxt_check_obj_elements(err, scene, 7, 0, 3, 3, "VNC"); + ufbxt_check_obj_elements(err, scene, 8, 4, 4, 4, "VTNC"); +} +#endif + +UFBXT_FILE_TEST(synthetic_mixed_attribs_reverse) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 9); + ufbxt_assert(scene->meshes.count == 8); + ufbxt_check_obj_elements(err, scene, 1, 0, 0, 0, "V"); + ufbxt_check_obj_elements(err, scene, 2, 1, 0, 0, "VT"); + ufbxt_check_obj_elements(err, scene, 3, 0, 1, 0, "VN"); + ufbxt_check_obj_elements(err, scene, 4, 2, 2, 0, "VTN"); + ufbxt_check_obj_elements(err, scene, 5, 0, 0, 1, "VC"); + ufbxt_check_obj_elements(err, scene, 6, 3, 0, 2, "VTC"); + ufbxt_check_obj_elements(err, scene, 7, 0, 3, 3, "VNC"); + ufbxt_check_obj_elements(err, scene, 8, 4, 4, 4, "VTNC"); +} +#endif + +UFBXT_FILE_TEST(synthetic_mixed_attribs_reuse) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 9); + ufbxt_assert(scene->meshes.count == 8); + ufbxt_check_obj_elements(err, scene, 1, 0, 0, 0, "V"); + ufbxt_check_obj_elements(err, scene, 1, 1, 0, 0, "VT"); + ufbxt_check_obj_elements(err, scene, 1, 0, 1, 0, "VN"); + ufbxt_check_obj_elements(err, scene, 1, 1, 1, 0, "VTN"); + ufbxt_check_obj_elements(err, scene, 2, 0, 0, 1, "VC"); + ufbxt_check_obj_elements(err, scene, 2, 1, 0, 1, "VTC"); + ufbxt_check_obj_elements(err, scene, 2, 0, 1, 1, "VNC"); + ufbxt_check_obj_elements(err, scene, 2, 1, 1, 1, "VTNC"); +} +#endif + +#if UFBXT_IMPL +static ufbx_load_opts ufbxt_no_index_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.index_error_handling = UFBX_INDEX_ERROR_HANDLING_NO_INDEX; + return opts; +} + +static ufbx_load_opts ufbxt_abort_index_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.index_error_handling = UFBX_INDEX_ERROR_HANDLING_ABORT_LOADING; + return opts; +} + +static void ufbxt_check_obj_face(ufbx_mesh *mesh, size_t face_ix, int32_t v, int32_t vt, int32_t vn, int32_t vc, bool no_index) +{ + ufbxt_hintf("face_ix = %zu", face_ix); + + ufbxt_assert(face_ix < mesh->faces.count); + ufbx_face face = mesh->faces.data[face_ix]; + uint32_t a = face.index_begin + 0; + uint32_t b = face.index_begin + 1; + uint32_t c = face.index_begin + 2; + + if (v) { + ufbxt_assert(mesh->vertex_position.indices.data[a] == v - 1 + 0); + ufbxt_assert(mesh->vertex_position.indices.data[b] == v - 1 + 1); + ufbxt_assert(mesh->vertex_position.indices.data[c] == v - 1 + 2); + } else { + uint32_t sentinel = no_index ? UFBX_NO_INDEX : (uint32_t)mesh->vertex_position.values.count - 1; + ufbxt_assert(mesh->vertex_position.indices.data[a] == sentinel); + ufbxt_assert(mesh->vertex_position.indices.data[b] == sentinel); + ufbxt_assert(mesh->vertex_position.indices.data[c] == sentinel); + } + + if (vt) { + ufbxt_assert(mesh->vertex_uv.indices.data[a] == vt - 1 + 0); + ufbxt_assert(mesh->vertex_uv.indices.data[b] == vt - 1 + 1); + ufbxt_assert(mesh->vertex_uv.indices.data[c] == vt - 1 + 2); + } else { + uint32_t sentinel = no_index ? UFBX_NO_INDEX : (uint32_t)mesh->vertex_uv.values.count - 1; + ufbxt_assert(mesh->vertex_uv.indices.data[a] == sentinel); + ufbxt_assert(mesh->vertex_uv.indices.data[b] == sentinel); + ufbxt_assert(mesh->vertex_uv.indices.data[c] == sentinel); + } + + if (vn) { + ufbxt_assert(mesh->vertex_normal.indices.data[a] == vn - 1 + 0); + ufbxt_assert(mesh->vertex_normal.indices.data[b] == vn - 1 + 1); + ufbxt_assert(mesh->vertex_normal.indices.data[c] == vn - 1 + 2); + } else { + uint32_t sentinel = no_index ? UFBX_NO_INDEX : (uint32_t)mesh->vertex_normal.values.count - 1; + ufbxt_assert(mesh->vertex_normal.indices.data[a] == sentinel); + ufbxt_assert(mesh->vertex_normal.indices.data[b] == sentinel); + ufbxt_assert(mesh->vertex_normal.indices.data[c] == sentinel); + } + + if (vc) { + ufbxt_assert(mesh->vertex_color.indices.data[a] == vc - 1 + 0); + ufbxt_assert(mesh->vertex_color.indices.data[b] == vc - 1 + 1); + ufbxt_assert(mesh->vertex_color.indices.data[c] == vc - 1 + 2); + } else { + uint32_t sentinel = no_index ? UFBX_NO_INDEX : (uint32_t)mesh->vertex_color.values.count - 1; + ufbxt_assert(mesh->vertex_color.indices.data[a] == sentinel); + ufbxt_assert(mesh->vertex_color.indices.data[b] == sentinel); + ufbxt_assert(mesh->vertex_color.indices.data[c] == sentinel); + } +} + +static void ufbxt_check_obj_index(ufbx_mesh *mesh, size_t index, int32_t v, int32_t vt, int32_t vn, int32_t vc, bool no_index) +{ + ufbxt_hintf("index = %zu", index); + ufbxt_assert(index < mesh->num_indices); + + if (v) { + ufbxt_assert(mesh->vertex_position.indices.data[index] == v - 1); + } else { + uint32_t sentinel = no_index ? UFBX_NO_INDEX : (uint32_t)mesh->vertex_position.values.count - 1; + ufbxt_assert(mesh->vertex_position.indices.data[index] == sentinel); + } + + if (vt) { + ufbxt_assert(mesh->vertex_uv.indices.data[index] == vt - 1); + } else { + uint32_t sentinel = no_index ? UFBX_NO_INDEX : (uint32_t)mesh->vertex_uv.values.count - 1; + ufbxt_assert(mesh->vertex_uv.indices.data[index] == sentinel); + } + + if (vn) { + ufbxt_assert(mesh->vertex_normal.indices.data[index] == vn - 1); + } else { + uint32_t sentinel = no_index ? UFBX_NO_INDEX : (uint32_t)mesh->vertex_normal.values.count - 1; + ufbxt_assert(mesh->vertex_normal.indices.data[index] == sentinel); + } + + if (vc) { + ufbxt_assert(mesh->vertex_color.indices.data[index] == vc - 1); + } else { + uint32_t sentinel = no_index ? UFBX_NO_INDEX : (uint32_t)mesh->vertex_color.values.count - 1; + ufbxt_assert(mesh->vertex_color.indices.data[index] == sentinel); + } +} + +#endif + +UFBXT_FILE_TEST(synthetic_partial_attrib) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Mesh"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 12); + ufbxt_assert(mesh->num_triangles == 12); + ufbxt_assert(mesh->vertex_position.exists); + ufbxt_assert(mesh->vertex_uv.exists); + ufbxt_assert(mesh->vertex_normal.exists); + ufbxt_assert(mesh->vertex_color.exists); + + ufbxt_check_obj_face(mesh, 0, 1, 0, 0, 0, false); + ufbxt_check_obj_face(mesh, 1, 1, 1, 0, 0, false); + ufbxt_check_obj_face(mesh, 2, 1, 0, 1, 0, false); + ufbxt_check_obj_face(mesh, 3, 1, 1, 1, 0, false); + ufbxt_check_obj_face(mesh, 4, 4, 0, 0, 4, false); + ufbxt_check_obj_face(mesh, 5, 4, 1, 0, 4, false); + ufbxt_check_obj_face(mesh, 6, 4, 0, 1, 4, false); + ufbxt_check_obj_face(mesh, 7, 4, 1, 1, 4, false); + ufbxt_check_obj_face(mesh, 8, 0, 0, 0, 0, false); + ufbxt_check_obj_face(mesh, 9, 0, 1, 0, 0, false); + ufbxt_check_obj_face(mesh, 10, 0, 0, 1, 0, false); + ufbxt_check_obj_face(mesh, 11, 0, 1, 1, 0, false); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT(synthetic_partial_attrib_no_index, synthetic_partial_attrib, ufbxt_no_index_opts) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Mesh"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 12); + ufbxt_assert(mesh->num_triangles == 12); + ufbxt_assert(mesh->vertex_position.exists); + ufbxt_assert(mesh->vertex_uv.exists); + ufbxt_assert(mesh->vertex_normal.exists); + ufbxt_assert(mesh->vertex_color.exists); + + ufbxt_check_obj_face(mesh, 0, 1, 0, 0, 0, true); + ufbxt_check_obj_face(mesh, 1, 1, 1, 0, 0, true); + ufbxt_check_obj_face(mesh, 2, 1, 0, 1, 0, true); + ufbxt_check_obj_face(mesh, 3, 1, 1, 1, 0, true); + ufbxt_check_obj_face(mesh, 4, 4, 0, 0, 4, true); + ufbxt_check_obj_face(mesh, 5, 4, 1, 0, 4, true); + ufbxt_check_obj_face(mesh, 6, 4, 0, 1, 4, true); + ufbxt_check_obj_face(mesh, 7, 4, 1, 1, 4, true); + ufbxt_check_obj_face(mesh, 8, 0, 0, 0, 0, true); + ufbxt_check_obj_face(mesh, 9, 0, 1, 0, 0, true); + ufbxt_check_obj_face(mesh, 10, 0, 0, 1, 0, true); + ufbxt_check_obj_face(mesh, 11, 0, 1, 1, 0, true); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_partial_attrib_strict, synthetic_partial_attrib, ufbxt_abort_index_opts, UFBXT_FILE_TEST_FLAG_ALLOW_ERROR) +#if UFBXT_IMPL +{ + ufbxt_assert(!scene); + ufbxt_assert(load_error); + ufbxt_assert(load_error->type == UFBX_ERROR_BAD_INDEX); +} +#endif + +UFBXT_FILE_TEST(synthetic_partial_attrib_face) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Mesh"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 1); + ufbxt_assert(mesh->num_triangles == 10); + ufbxt_assert(mesh->num_indices == 12); + ufbxt_assert(mesh->vertex_position.exists); + ufbxt_assert(mesh->vertex_uv.exists); + ufbxt_assert(mesh->vertex_normal.exists); + ufbxt_assert(mesh->vertex_color.exists); + + ufbx_face face = mesh->faces.data[0]; + ufbxt_assert(face.index_begin == 0); + ufbxt_assert(face.num_indices == 12); + + ufbxt_check_obj_index(mesh, 0, 1, 0, 0, 0, false); + ufbxt_check_obj_index(mesh, 1, 2, 1, 0, 0, false); + ufbxt_check_obj_index(mesh, 2, 3, 0, 1, 0, false); + ufbxt_check_obj_index(mesh, 3, 4, 2, 2, 0, false); + ufbxt_check_obj_index(mesh, 4, 5, 0, 0, 5, false); + ufbxt_check_obj_index(mesh, 5, 6, 3, 0, 6, false); + ufbxt_check_obj_index(mesh, 6, 7, 0, 3, 7, false); + ufbxt_check_obj_index(mesh, 7, 8, 4, 4, 8, false); + ufbxt_check_obj_index(mesh, 8, 0, 0, 0, 0, false); + ufbxt_check_obj_index(mesh, 9, 0, 5, 0, 0, false); + ufbxt_check_obj_index(mesh, 10, 0, 0, 5, 0, false); + ufbxt_check_obj_index(mesh, 11, 0, 6, 6, 0, false); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT(synthetic_partial_attrib_face_no_index, synthetic_partial_attrib_face, ufbxt_no_index_opts) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Mesh"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 1); + ufbxt_assert(mesh->num_triangles == 10); + ufbxt_assert(mesh->num_indices == 12); + ufbxt_assert(mesh->vertex_position.exists); + ufbxt_assert(mesh->vertex_uv.exists); + ufbxt_assert(mesh->vertex_normal.exists); + ufbxt_assert(mesh->vertex_color.exists); + + ufbx_face face = mesh->faces.data[0]; + ufbxt_assert(face.index_begin == 0); + ufbxt_assert(face.num_indices == 12); + + ufbxt_check_obj_index(mesh, 0, 1, 0, 0, 0, true); + ufbxt_check_obj_index(mesh, 1, 2, 1, 0, 0, true); + ufbxt_check_obj_index(mesh, 2, 3, 0, 1, 0, true); + ufbxt_check_obj_index(mesh, 3, 4, 2, 2, 0, true); + ufbxt_check_obj_index(mesh, 4, 5, 0, 0, 5, true); + ufbxt_check_obj_index(mesh, 5, 6, 3, 0, 6, true); + ufbxt_check_obj_index(mesh, 6, 7, 0, 3, 7, true); + ufbxt_check_obj_index(mesh, 7, 8, 4, 4, 8, true); + ufbxt_check_obj_index(mesh, 8, 0, 0, 0, 0, true); + ufbxt_check_obj_index(mesh, 9, 0, 5, 0, 0, true); + ufbxt_check_obj_index(mesh, 10, 0, 0, 5, 0, true); + ufbxt_check_obj_index(mesh, 11, 0, 6, 6, 0, true); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_partial_attrib_face_strict, synthetic_partial_attrib_face, ufbxt_abort_index_opts, UFBXT_FILE_TEST_FLAG_ALLOW_ERROR) +#if UFBXT_IMPL +{ + ufbxt_assert(!scene); + ufbxt_assert(load_error); + ufbxt_assert(load_error->type == UFBX_ERROR_BAD_INDEX); +} +#endif + +UFBXT_FILE_TEST(synthetic_simple_materials) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->materials.count == 3); + + { + ufbx_material *mat = ufbx_find_material(scene, "RGB"); + ufbxt_assert(mat); + ufbxt_assert(mat->shader_type == UFBX_SHADER_WAVEFRONT_MTL); + + ufbx_vec3 ka = { 1.0f, 0.0f, 0.0f }; + ufbx_vec3 kd = { 0.0f, 1.0f, 0.0f }; + ufbx_vec3 ks = { 0.0f, 0.0f, 1.0f }; + ufbx_vec3 ke = { 1.0f, 0.0f, 1.0f }; + ufbx_real ns = 99.0f; + ufbx_real d = 0.25f; + + ufbxt_assert_close_vec3(err, mat->fbx.ambient_color.value_vec3, ka); + ufbxt_assert_close_vec3(err, mat->fbx.diffuse_color.value_vec3, kd); + ufbxt_assert_close_vec3(err, mat->fbx.specular_color.value_vec3, ks); + ufbxt_assert_close_vec3(err, mat->fbx.emission_color.value_vec3, ke); + ufbxt_assert_close_real(err, mat->fbx.specular_exponent.value_real, ns); + ufbxt_assert_close_real(err, mat->fbx.transparency_factor.value_real, 1.0f - d); + ufbxt_assert(mat->fbx.ambient_factor.value_real == 1.0f); + ufbxt_assert(mat->fbx.diffuse_factor.value_real == 1.0f); + ufbxt_assert(mat->fbx.specular_factor.value_real == 1.0f); + ufbxt_assert(mat->fbx.emission_factor.value_real == 1.0f); + + ufbxt_assert_close_vec3(err, mat->pbr.base_color.value_vec3, kd); + ufbxt_assert_close_vec3(err, mat->pbr.specular_color.value_vec3, ks); + ufbxt_assert_close_vec3(err, mat->pbr.emission_color.value_vec3, ke); + ufbxt_assert_close_real(err, mat->pbr.roughness.value_real, 0.00501256289f); + ufbxt_assert_close_real(err, mat->pbr.opacity.value_real, d); + ufbxt_assert(mat->pbr.base_factor.value_real == 1.0f); + ufbxt_assert(mat->pbr.specular_factor.value_real == 1.0f); + ufbxt_assert(mat->pbr.emission_factor.value_real == 1.0f); + + ufbxt_assert(mat->features.diffuse.enabled); + ufbxt_assert(mat->features.specular.enabled); + ufbxt_assert(mat->features.opacity.enabled); + ufbxt_assert(!mat->features.pbr.enabled); + ufbxt_assert(!mat->features.metalness.enabled); + ufbxt_assert(!mat->features.sheen.enabled); + ufbxt_assert(!mat->features.coat.enabled); + ufbxt_assert(!mat->features.transmission.enabled); + } + + { + ufbx_material *mat = ufbx_find_material(scene, "PBR"); + ufbxt_assert(mat); + ufbxt_assert(mat->shader_type == UFBX_SHADER_WAVEFRONT_MTL); + + ufbx_real pr = 0.1f; + ufbx_real pm = 0.2f; + ufbx_vec3 ps = { 0.3f, 0.4f, 0.5f }; + ufbx_real pc = 0.6f; + ufbx_real pcr = 0.7f; + ufbx_real ni = 1.33f; + ufbx_vec3 tf = { 0.8f, 0.9f, 1.0f }; + ufbx_real d = 0.75f; + + ufbxt_assert_close_real(err, mat->pbr.roughness.value_real, pr); + ufbxt_assert_close_real(err, mat->pbr.metalness.value_real, pm); + ufbxt_assert_close_vec3(err, mat->pbr.sheen_color.value_vec3, ps); + ufbxt_assert_close_real(err, mat->pbr.coat_factor.value_real, pc); + ufbxt_assert_close_real(err, mat->pbr.coat_roughness.value_real, pcr); + ufbxt_assert_close_real(err, mat->pbr.specular_ior.value_real, ni); + ufbxt_assert_close_vec3(err, mat->pbr.transmission_color.value_vec3, tf); + ufbxt_assert_close_real(err, mat->pbr.opacity.value_real, d); + + ufbxt_assert(mat->pbr.sheen_factor.value_real == 1.0f); + ufbxt_assert(mat->pbr.transmission_factor.value_real == 1.0f); + + ufbxt_assert(mat->features.pbr.enabled); + ufbxt_assert(mat->features.metalness.enabled); + ufbxt_assert(mat->features.diffuse.enabled); + ufbxt_assert(mat->features.specular.enabled); + ufbxt_assert(mat->features.sheen.enabled); + ufbxt_assert(mat->features.coat.enabled); + ufbxt_assert(mat->features.transmission.enabled); + ufbxt_assert(mat->features.opacity.enabled); + } + + { + ufbx_material *mat = ufbx_find_material(scene, "Wide"); + ufbxt_assert(mat); + ufbxt_assert(mat->shader_type == UFBX_SHADER_WAVEFRONT_MTL); + + ufbx_vec3 ka = { 0.1f, 0.1f, 0.1f }; + ufbx_vec3 kd = { 0.2f, 0.2f, 0.2f }; + ufbx_vec3 ks = { 0.3f, 0.3f, 0.3f }; + ufbx_vec3 ke = { 0.4f, 0.4f, 0.4f }; + ufbx_vec3 ps = { 0.5f, 0.5f, 0.5f }; + ufbx_vec3 tf = { 0.6f, 0.6f, 0.6f }; + + ufbxt_assert_close_vec3(err, mat->fbx.ambient_color.value_vec3, ka); + ufbxt_assert_close_vec3(err, mat->fbx.diffuse_color.value_vec3, kd); + ufbxt_assert_close_vec3(err, mat->fbx.specular_color.value_vec3, ks); + ufbxt_assert_close_vec3(err, mat->fbx.emission_color.value_vec3, ke); + + ufbxt_assert_close_vec3(err, mat->pbr.base_color.value_vec3, kd); + ufbxt_assert_close_vec3(err, mat->pbr.specular_color.value_vec3, ks); + ufbxt_assert_close_vec3(err, mat->pbr.emission_color.value_vec3, ke); + ufbxt_assert_close_vec3(err, mat->pbr.sheen_color.value_vec3, ps); + ufbxt_assert_close_vec3(err, mat->pbr.transmission_color.value_vec3, tf); + + } +} +#endif + +#if UFBXT_IMPL +void ufbxt_check_obj_texture(ufbx_scene *scene, ufbx_texture *texture, const char *filename) +{ + char rel_path[256]; + snprintf(rel_path, sizeof(rel_path), "textures/%s", filename); + + ufbxt_assert(texture); + ufbxt_assert(!strcmp(texture->relative_filename.data, rel_path)); +} +#endif + +UFBXT_FILE_TEST(synthetic_simple_textures) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->materials.count == 3); + + { + ufbx_material *mat = ufbx_find_material(scene, "RGB"); + ufbxt_assert(mat); + ufbxt_assert(mat->shader_type == UFBX_SHADER_WAVEFRONT_MTL); + + ufbxt_check_obj_texture(scene, mat->fbx.ambient_color.texture, "checkerboard_ambient.png"); + ufbxt_check_obj_texture(scene, mat->fbx.diffuse_color.texture, "checkerboard_diffuse.png"); + ufbxt_check_obj_texture(scene, mat->fbx.specular_color.texture, "checkerboard_specular.png"); + ufbxt_check_obj_texture(scene, mat->fbx.emission_color.texture, "checkerboard_emissive.png"); + ufbxt_check_obj_texture(scene, mat->fbx.specular_exponent.texture, "checkerboard_roughness.png"); + ufbxt_check_obj_texture(scene, mat->fbx.transparency_factor.texture, "checkerboard_transparency.png"); + ufbxt_check_obj_texture(scene, mat->fbx.bump.texture, "checkerboard_bump.png"); + + ufbxt_check_obj_texture(scene, mat->pbr.base_color.texture, "checkerboard_diffuse.png"); + ufbxt_check_obj_texture(scene, mat->pbr.specular_color.texture, "checkerboard_specular.png"); + ufbxt_check_obj_texture(scene, mat->pbr.emission_color.texture, "checkerboard_emissive.png"); + ufbxt_check_obj_texture(scene, mat->pbr.roughness.texture, "checkerboard_roughness.png"); + ufbxt_check_obj_texture(scene, mat->pbr.normal_map.texture, "checkerboard_bump.png"); + } + + { + ufbx_material *mat = ufbx_find_material(scene, "PBR"); + ufbxt_assert(mat); + ufbxt_assert(mat->shader_type == UFBX_SHADER_WAVEFRONT_MTL); + + ufbxt_check_obj_texture(scene, mat->pbr.roughness.texture, "checkerboard_roughness.png"); + ufbxt_check_obj_texture(scene, mat->pbr.metalness.texture, "checkerboard_metallic.png"); + ufbxt_check_obj_texture(scene, mat->pbr.sheen_color.texture, "checkerboard_reflection.png"); + ufbxt_check_obj_texture(scene, mat->pbr.coat_factor.texture, "checkerboard_specular.png"); + ufbxt_check_obj_texture(scene, mat->pbr.coat_roughness.texture, "checkerboard_weight.png"); + ufbxt_check_obj_texture(scene, mat->pbr.transmission_color.texture, "checkerboard_transparency.png"); + ufbxt_check_obj_texture(scene, mat->pbr.opacity.texture, "checkerboard_weight.png"); + ufbxt_check_obj_texture(scene, mat->pbr.specular_ior.texture, "checkerboard_specular.png"); + ufbxt_check_obj_texture(scene, mat->pbr.normal_map.texture, "checkerboard_normal.png"); + ufbxt_check_obj_texture(scene, mat->pbr.displacement_map.texture, "checkerboard_displacement.png"); + + ufbxt_check_obj_texture(scene, mat->fbx.transparency_factor.texture, "checkerboard_weight.png"); + ufbxt_check_obj_texture(scene, mat->fbx.normal_map.texture, "checkerboard_normal.png"); + ufbxt_check_obj_texture(scene, mat->fbx.displacement.texture, "checkerboard_displacement.png"); + } + + { + ufbx_material *mat = ufbx_find_material(scene, "NonMap"); + ufbxt_assert(mat); + ufbxt_assert(mat->shader_type == UFBX_SHADER_WAVEFRONT_MTL); + + ufbxt_assert(mat->textures.count == 3); + + ufbxt_check_obj_texture(scene, mat->pbr.normal_map.texture, "checkerboard_normal.png"); + ufbxt_check_obj_texture(scene, mat->pbr.displacement_map.texture, "checkerboard_displacement.png"); + + ufbxt_check_obj_texture(scene, mat->fbx.normal_map.texture, "checkerboard_normal.png"); + ufbxt_check_obj_texture(scene, mat->fbx.displacement.texture, "checkerboard_displacement.png"); + + ufbxt_check_obj_texture(scene, ufbx_find_prop_texture(mat, "norm"), "checkerboard_normal.png"); + ufbxt_check_obj_texture(scene, ufbx_find_prop_texture(mat, "disp"), "checkerboard_displacement.png"); + ufbxt_check_obj_texture(scene, ufbx_find_prop_texture(mat, "bump"), "checkerboard_bump.png"); + } +} +#endif + +#if UFBXT_IMPL +void ufbxt_check_obj_prop(ufbxt_diff_error *err, ufbx_props *props, const char *name, const char *str, int64_t i, ufbx_real x, ufbx_real y, ufbx_real z) +{ + ufbxt_hintf("name = \"%s\"", name); + + ufbx_prop *prop = ufbx_find_prop(props, name); + ufbxt_assert(prop); + if (str) { + ufbxt_assert(!strcmp(prop->value_str.data, str)); + } + + ufbxt_assert(prop->value_int == i); + + ufbxt_assert_close_real(err, prop->value_vec3.x, x); + ufbxt_assert_close_real(err, prop->value_vec3.y, y); + ufbxt_assert_close_real(err, prop->value_vec3.z, z); +} +#endif + +UFBXT_FILE_TEST(synthetic_texture_opts) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->materials.count == 1); + + ufbx_material *mat = ufbx_find_material(scene, "Opts"); + ufbxt_assert(mat); + ufbxt_assert(mat->shader_type == UFBX_SHADER_WAVEFRONT_MTL); + + { + ufbx_texture *tex = mat->fbx.diffuse_color.texture; + ufbxt_assert(tex); + ufbxt_assert(!strcmp(tex->relative_filename.data, "textures/checkerboard_diffuse.png")); + + ufbxt_check_obj_prop(err, &tex->props, "blendu", "off", 0, 0.0f, 0.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "blendv", "on", 1, 1.0f, 0.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "clamp", "off", 0, 0.0f, 0.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "imfchan", "r", 0, 0.0f, 0.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "mm", "1 2", 1, 1.0f, 2.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "o", "0.1 0.2 0.3", 0, 0.1f, 0.2f, 0.3f); + ufbxt_check_obj_prop(err, &tex->props, "s", "0.4 0.5 0.6", 0, 0.4f, 0.5f, 0.6f); + ufbxt_check_obj_prop(err, &tex->props, "t", "0.7 0.8 0.9", 0, 0.7f, 0.8f, 0.9f); + ufbxt_check_obj_prop(err, &tex->props, "texres", "512", 512, 512.0f, 0.0f, 0.0f); + } + + { + ufbx_texture *tex = mat->fbx.specular_color.texture; + ufbxt_assert(tex); + ufbxt_assert(!strcmp(tex->relative_filename.data, "textures/checkerboard_specular.png")); + + ufbxt_check_obj_prop(err, &tex->props, "blendu", "on", 1, 1.0f, 0.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "blendv", "off", 0, 0.0f, 0.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "clamp", "on", 1, 1.0f, 0.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "imfchan", "g", 0, 0.0f, 0.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "mm", "3 4", 3, 3.0f, 4.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "o", "-0.1 -.2 1.3", 0, -0.1f, -0.2f, 1.3f); + ufbxt_check_obj_prop(err, &tex->props, "s", NULL, 1, 1.4f, 1.5f, 1.6f); + ufbxt_check_obj_prop(err, &tex->props, "t", "1.7 1.8 1.9", 1, 1.7f, 1.8f, 1.9f); + ufbxt_check_obj_prop(err, &tex->props, "texres", "1024", 1024, 1024.0f, 0.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "unknown", "hello world", 0, 0.0f, 0.0f, 0.0f); + ufbxt_check_obj_prop(err, &tex->props, "single-unknown", "", 0, 0.0f, 0.0f, 0.0f); + } + +} +#endif + +UFBXT_FILE_TEST_PATH(blender_331_space_texture, "blender_331_space texture") +#if UFBXT_IMPL +{ + ufbxt_assert(scene->materials.count == 1); + ufbx_material *material = ufbx_find_material(scene, "Material"); + ufbxt_assert(material); + + ufbx_texture *texture = material->fbx.diffuse_color.texture; + ufbxt_assert(texture); + ufbxt_assert(!strcmp(texture->relative_filename.data, "space dir/space tex.png")); + + if (scene->metadata.file_format == UFBX_FILE_FORMAT_OBJ) { + ufbx_node *node = ufbx_find_node(scene, "Cube"); + ufbxt_assert(node && node->mesh); + ufbxt_assert(node->materials.count == 1); + ufbxt_assert(node->materials.data[0] == material); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_obj_zoo) +#if UFBXT_IMPL +{ + ufbxt_check_warning(scene, UFBX_WARNING_UNKNOWN_OBJ_DIRECTIVE, 24, "Unknown .obj directive, skipped line"); + + ufbx_node *node = ufbx_find_node(scene, "Object"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 7); + ufbxt_assert(mesh->num_line_faces == 2); + ufbxt_assert(mesh->num_point_faces == 4); +} +#endif + +#if UFBXT_IMPL + +static ufbx_mesh_material *ufbxt_find_mesh_material(ufbx_mesh *mesh, const char *name) +{ + for (size_t i = 0; i < mesh->materials.count; i++) { + if (!strcmp(mesh->materials.data[i].material->name.data, name)) { + return &mesh->materials.data[i]; + } + } + return NULL; +} + +static ufbx_face_group *ufbxt_find_face_group(ufbx_mesh *mesh, const char *name) +{ + for (size_t i = 0; i < mesh->face_groups.count; i++) { + if (!strcmp(mesh->face_groups.data[i].name.data, name)) { + return &mesh->face_groups.data[i]; + } + } + return NULL; +} + +static void ufbxt_check_planar_face(ufbxt_diff_error *err, ufbx_mesh *mesh, ufbx_face face, ufbx_vec3 normal, ufbx_real w) +{ + for (size_t i = 0; i < face.num_indices; i++) { + ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + i); + ufbx_real ref = ufbxt_dot3(normal, pos); + ufbxt_assert_close_real(err, ref, w); + } +} + +static void ufbxt_check_planar_face_ix(ufbxt_diff_error *err, ufbx_mesh *mesh, size_t face_ix, ufbx_vec3 normal, ufbx_real w) +{ + ufbxt_assert(face_ix < mesh->faces.count); + ufbxt_check_planar_face(err, mesh, mesh->faces.data[face_ix], normal, w); +} + +#endif + +UFBXT_FILE_TEST(synthetic_face_groups) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Cube"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbx_vec3 pos_x = { +1.0f, 0.0f, 0.0f }; + ufbx_vec3 neg_x = { -1.0f, 0.0f, 0.0f }; + ufbx_vec3 pos_y = { 0.0f, +1.0f, 0.0f }; + ufbx_vec3 neg_y = { 0.0f, -1.0f, 0.0f }; + ufbx_vec3 pos_z = { 0.0f, 0.0f, +1.0f }; + ufbx_vec3 neg_z = { 0.0f, 0.0f, -1.0f }; + + { + ufbx_face_group *group = ufbxt_find_face_group(mesh, ""); + ufbxt_assert(group); + ufbxt_assert(group->num_faces == 2); + ufbxt_assert(group->face_indices.data[0] == 0); + ufbxt_assert(group->face_indices.data[1] == 5); + ufbxt_check_planar_face_ix(err, mesh, group->face_indices.data[0], pos_y, 1.0f); + ufbxt_check_planar_face_ix(err, mesh, group->face_indices.data[1], neg_y, 1.0f); + } + + { + ufbx_face_group *group = ufbxt_find_face_group(mesh, "Front"); + ufbxt_assert(group); + ufbxt_assert(group->num_faces == 1); + ufbxt_assert(group->face_indices.data[0] == 1); + ufbxt_check_planar_face_ix(err, mesh, group->face_indices.data[0], neg_z, 1.0f); + } + + { + ufbx_face_group *group = ufbxt_find_face_group(mesh, "Sides"); + ufbxt_assert(group); + ufbxt_assert(group->num_faces == 2); + ufbxt_assert(group->face_indices.data[0] == 2); + ufbxt_assert(group->face_indices.data[1] == 4); + ufbxt_check_planar_face_ix(err, mesh, group->face_indices.data[0], neg_x, 1.0f); + ufbxt_check_planar_face_ix(err, mesh, group->face_indices.data[1], pos_x, 1.0f); + } + + { + ufbx_face_group *group = ufbxt_find_face_group(mesh, "Back"); + ufbxt_assert(group); + ufbxt_assert(group->num_faces == 1); + ufbxt_assert(group->face_indices.data[0] == 3); + ufbxt_check_planar_face_ix(err, mesh, group->face_indices.data[0], pos_z, 1.0f); + } + + { + ufbx_mesh_material *mat = ufbxt_find_mesh_material(mesh, "A"); + ufbxt_assert(mat); + ufbxt_assert(mat->num_faces == 3); + ufbxt_assert(mat->face_indices.data[0] == 0); + ufbxt_assert(mat->face_indices.data[1] == 1); + ufbxt_assert(mat->face_indices.data[2] == 2); + } + + { + ufbx_mesh_material *mat = ufbxt_find_mesh_material(mesh, "B"); + ufbxt_assert(mat); + ufbxt_assert(mat->num_faces == 3); + ufbxt_assert(mat->face_indices.data[0] == 3); + ufbxt_assert(mat->face_indices.data[1] == 4); + ufbxt_assert(mat->face_indices.data[2] == 5); + } +} +#endif + +#if UFBXT_IMPL + +static ufbx_load_opts ufbxt_split_groups_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.obj_split_groups = true; + return opts; +} + +static ufbx_load_opts ufbxt_merge_objects_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.obj_merge_objects = true; + return opts; +} + +static ufbx_load_opts ufbxt_allow_null_material_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.allow_null_material = true; + return opts; +} + + +#endif + +UFBXT_FILE_TEST_OPTS_ALT(synthetic_face_groups_split, synthetic_face_groups, ufbxt_split_groups_opts) +#if UFBXT_IMPL +{ + ufbx_vec3 pos_x = { +1.0f, 0.0f, 0.0f }; + ufbx_vec3 neg_x = { -1.0f, 0.0f, 0.0f }; + ufbx_vec3 pos_y = { 0.0f, +1.0f, 0.0f }; + ufbx_vec3 neg_y = { 0.0f, -1.0f, 0.0f }; + ufbx_vec3 pos_z = { 0.0f, 0.0f, +1.0f }; + ufbx_vec3 neg_z = { 0.0f, 0.0f, -1.0f }; + + ufbx_material *mat_a = ufbx_find_material(scene, "A"); + ufbx_material *mat_b = ufbx_find_material(scene, "B"); + + size_t num_a_found = 0; + size_t num_b_found = 0; + for (size_t i = 0; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + if (strcmp(node->name.data, "Cube") != 0) continue; + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh); + + ufbxt_assert(mesh->materials.count == 1); + ufbxt_assert(mesh->num_faces == 1); + + ufbx_material *material = mesh->materials.data[0].material; + if (material == mat_a) { + ufbxt_check_planar_face_ix(err, mesh, 0, pos_y, 1.0f); + num_a_found++; + } else { + ufbxt_assert(material == mat_b); + ufbxt_check_planar_face_ix(err, mesh, 0, neg_y, 1.0f); + num_b_found++; + } + } + + ufbxt_assert(num_a_found == 1); + ufbxt_assert(num_b_found == 1); + + { + ufbx_node *node = ufbx_find_node(scene, "Front"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 1); + ufbxt_check_planar_face_ix(err, mesh, 0, neg_z, 1.0f); + + ufbxt_assert(mesh->materials.count == 1); + ufbxt_assert(mesh->materials.data[0].material == mat_a); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Back"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 1); + ufbxt_check_planar_face_ix(err, mesh, 0, pos_z, 1.0f); + + ufbxt_assert(mesh->materials.count == 1); + ufbxt_assert(mesh->materials.data[0].material == mat_b); + } + + num_a_found = 0; + num_b_found = 0; + for (size_t i = 0; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + if (strcmp(node->name.data, "Sides") != 0) continue; + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh); + + ufbxt_assert(mesh->materials.count == 1); + ufbxt_assert(mesh->num_faces == 1); + + ufbx_material *material = mesh->materials.data[0].material; + if (material == mat_a) { + ufbxt_check_planar_face_ix(err, mesh, 0, neg_x, 1.0f); + num_a_found++; + } else { + ufbxt_assert(material == mat_b); + ufbxt_check_planar_face_ix(err, mesh, 0, pos_x, 1.0f); + num_b_found++; + } + } + + ufbxt_assert(num_a_found == 1); + ufbxt_assert(num_b_found == 1); + +} +#endif + +UFBXT_FILE_TEST(synthetic_partial_material) +#if UFBXT_IMPL +{ + ufbxt_assert(!scene->metadata.may_contain_null_materials); + + ufbxt_assert(scene->materials.count == 8); + ufbxt_assert(ufbx_find_material(scene, "A")); + ufbxt_assert(ufbx_find_material(scene, "B")); + ufbxt_assert(ufbx_find_material(scene, "C")); + ufbxt_assert(ufbx_find_material(scene, "D")); + ufbxt_assert(ufbx_find_material(scene, "E")); + ufbxt_assert(ufbx_find_material(scene, "F")); + ufbxt_assert(ufbx_find_material(scene, "G")); + ufbxt_assert(ufbx_find_material(scene, "H")); + + { + ufbx_node *node = ufbx_find_node(scene, "First"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->materials.count == 0); + ufbxt_assert(mesh->face_material.count == 0); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Second"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->materials.count == 3); + ufbxt_assert(!strcmp(mesh->materials.data[0].material->name.data, "A")); + ufbxt_assert(!strcmp(mesh->materials.data[1].material->name.data, "B")); + ufbxt_assert(!strcmp(mesh->materials.data[2].material->name.data, "D")); + + ufbxt_assert(mesh->face_material.count == 5); + ufbxt_assert(mesh->face_material.data[0] == 0); + ufbxt_assert(mesh->face_material.data[1] == 0); + ufbxt_assert(mesh->face_material.data[2] == 1); + ufbxt_assert(mesh->face_material.data[3] == 2); + ufbxt_assert(mesh->face_material.data[4] == 0); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Third"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->materials.count == 2); + ufbxt_assert(!strcmp(mesh->materials.data[0].material->name.data, "F")); + ufbxt_assert(!strcmp(mesh->materials.data[1].material->name.data, "A")); + + ufbxt_assert(mesh->face_material.count == 2); + ufbxt_assert(mesh->face_material.data[0] == 0); + ufbxt_assert(mesh->face_material.data[1] == 1); + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT(synthetic_partial_material_allow_null, synthetic_partial_material, ufbxt_allow_null_material_opts) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->metadata.may_contain_null_materials); + + ufbxt_assert(scene->materials.count == 8); + ufbxt_assert(ufbx_find_material(scene, "A")); + ufbxt_assert(ufbx_find_material(scene, "B")); + ufbxt_assert(ufbx_find_material(scene, "C")); + ufbxt_assert(ufbx_find_material(scene, "D")); + ufbxt_assert(ufbx_find_material(scene, "E")); + ufbxt_assert(ufbx_find_material(scene, "F")); + ufbxt_assert(ufbx_find_material(scene, "G")); + ufbxt_assert(ufbx_find_material(scene, "H")); + + { + ufbx_node *node = ufbx_find_node(scene, "First"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->face_material.count == 1); + ufbxt_assert(mesh->materials.count == 1); + ufbxt_assert(mesh->materials.data[0].material == NULL); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Second"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->materials.count == 3); + ufbxt_assert(!strcmp(mesh->materials.data[0].material->name.data, "A")); + ufbxt_assert(!strcmp(mesh->materials.data[1].material->name.data, "B")); + ufbxt_assert(!strcmp(mesh->materials.data[2].material->name.data, "D")); + + ufbxt_assert(mesh->face_material.count == 5); + ufbxt_assert(mesh->face_material.data[0] == 0); + ufbxt_assert(mesh->face_material.data[1] == 0); + ufbxt_assert(mesh->face_material.data[2] == 1); + ufbxt_assert(mesh->face_material.data[3] == 2); + ufbxt_assert(mesh->face_material.data[4] == 0); + } + + { + ufbx_node *node = ufbx_find_node(scene, "Third"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->materials.count == 2); + ufbxt_assert(!strcmp(mesh->materials.data[0].material->name.data, "F")); + ufbxt_assert(!strcmp(mesh->materials.data[1].material->name.data, "A")); + + ufbxt_assert(mesh->face_material.count == 2); + ufbxt_assert(mesh->face_material.data[0] == 0); + ufbxt_assert(mesh->face_material.data[1] == 1); + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT(synthetic_partial_material_merged, synthetic_partial_material, ufbxt_merge_objects_opts) +#if UFBXT_IMPL +{ + ufbxt_assert(!scene->metadata.may_contain_null_materials); + + ufbxt_assert(scene->materials.count == 8); + ufbxt_assert(ufbx_find_material(scene, "A")); + ufbxt_assert(ufbx_find_material(scene, "B")); + ufbxt_assert(ufbx_find_material(scene, "C")); + ufbxt_assert(ufbx_find_material(scene, "D")); + ufbxt_assert(ufbx_find_material(scene, "E")); + ufbxt_assert(ufbx_find_material(scene, "F")); + ufbxt_assert(ufbx_find_material(scene, "G")); + ufbxt_assert(ufbx_find_material(scene, "H")); + + ufbxt_assert(scene->nodes.count == 2); + ufbx_node *node = scene->nodes.data[1]; + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->materials.count == 4); + ufbxt_assert(!strcmp(mesh->materials.data[0].material->name.data, "A")); + ufbxt_assert(!strcmp(mesh->materials.data[1].material->name.data, "B")); + ufbxt_assert(!strcmp(mesh->materials.data[2].material->name.data, "D")); + ufbxt_assert(!strcmp(mesh->materials.data[3].material->name.data, "F")); + + ufbxt_assert(mesh->face_material.count == 8); + ufbxt_assert(mesh->face_material.data[0] == 0); + ufbxt_assert(mesh->face_material.data[1] == 0); + ufbxt_assert(mesh->face_material.data[2] == 0); + ufbxt_assert(mesh->face_material.data[3] == 1); + ufbxt_assert(mesh->face_material.data[4] == 2); + ufbxt_assert(mesh->face_material.data[5] == 0); + ufbxt_assert(mesh->face_material.data[6] == 3); + ufbxt_assert(mesh->face_material.data[7] == 0); +} +#endif + +#if UFBXT_IMPL +static ufbx_load_opts ufbxt_search_mtl_by_filename_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.obj_search_mtl_by_filename = true; + return opts; +} +#endif + +UFBXT_FILE_TEST_OPTS(synthetic_filename_mtl, ufbxt_search_mtl_by_filename_opts) +#if UFBXT_IMPL +{ + ufbxt_check_warning(scene, UFBX_WARNING_MISSING_EXTERNAL_FILE, 1, "materials.mtl"); + ufbxt_check_warning(scene, UFBX_WARNING_IMPLICIT_MTL, 1, "synthetic_filename_mtl_0_obj.mtl"); + + { + ufbx_vec3 ka = { 1.0f, 0.0f, 0.0f }; + ufbx_vec3 kd = { 0.0f, 1.0f, 0.0f }; + ufbx_vec3 ks = { 0.0f, 0.0f, 1.0f }; + + ufbx_material *material = ufbx_find_material(scene, "Material"); + ufbxt_assert(material); + ufbxt_assert_close_vec3(err, material->fbx.ambient_color.value_vec3, ka); + ufbxt_assert_close_vec3(err, material->fbx.diffuse_color.value_vec3, kd); + ufbxt_assert_close_vec3(err, material->fbx.specular_color.value_vec3, ks); + } + + { + ufbx_material *material = ufbx_find_material(scene, "Other"); + ufbxt_assert(material); + } +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_missing_position_fail, UFBXT_FILE_TEST_FLAG_ALLOW_ERROR) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_TEST(obj_opts_mtl_data) +#if UFBXT_IMPL +{ + const char obj[] = + "v 0 0 0\n" + "v 1 0 0\n" + "v 0 1 0\n" + "usemtl Material\n" + "f 0 1 2\n"; + + const char mtl[] = + "newmtl Material\n" + "Ka 1 0 0\n" + "Kd 0 1 0\n" + "Ks 0 0 1\n"; + + ufbx_load_opts opts = { 0 }; + opts.obj_mtl_data.data = mtl; + opts.obj_mtl_data.size = sizeof(mtl) - 1; + ufbx_scene *scene = ufbx_load_memory(obj, sizeof(obj) - 1, &opts, NULL); + ufbxt_assert(scene); + ufbxt_assert(scene->meshes.count == 1); + ufbx_mesh *mesh = scene->meshes.data[0]; + ufbxt_assert(mesh->faces.count == 1); + ufbxt_assert(mesh->materials.count == 1); + ufbx_material *material = mesh->materials.data[0].material; + ufbxt_assert(!strcmp(material->name.data, "Material")); + + ufbx_vec3 ka = { 1.0f, 0.0f, 0.0f }; + ufbx_vec3 kd = { 0.0f, 1.0f, 0.0f }; + ufbx_vec3 ks = { 0.0f, 0.0f, 1.0f }; + + ufbxt_diff_error err = { 0 }; + ufbxt_assert_close_vec3(&err, material->fbx.ambient_color.value_vec3, ka); + ufbxt_assert_close_vec3(&err, material->fbx.diffuse_color.value_vec3, kd); + ufbxt_assert_close_vec3(&err, material->fbx.specular_color.value_vec3, ks); + if (err.num > 0) { + ufbx_real avg = err.sum / (ufbx_real)err.num; + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", avg, err.max, err.num); + } + + ufbx_free_scene(scene); +} +#endif + +UFBXT_TEST(obj_opts_mtl_path) +#if UFBXT_IMPL +{ + const char obj[] = + "v 0 0 0\n" + "v 1 0 0\n" + "v 0 1 0\n" + "usemtl RGB\n" + "f 0 1 2\n"; + + char buf[512]; + snprintf(buf, sizeof(buf), "%ssynthetic_simple_materials_0_mtl.mtl", data_root); + + ufbx_load_opts opts = { 0 }; + opts.obj_mtl_path.data = buf; + opts.obj_mtl_path.length = SIZE_MAX; + ufbx_scene *scene = ufbx_load_memory(obj, sizeof(obj) - 1, &opts, NULL); + ufbxt_assert(scene); + ufbxt_assert(scene->meshes.count == 1); + ufbx_mesh *mesh = scene->meshes.data[0]; + ufbxt_assert(mesh->faces.count == 1); + ufbxt_assert(mesh->materials.count == 1); + ufbx_material *material = mesh->materials.data[0].material; + ufbxt_assert(!strcmp(material->name.data, "RGB")); + + ufbx_vec3 ka = { 1.0f, 0.0f, 0.0f }; + ufbx_vec3 kd = { 0.0f, 1.0f, 0.0f }; + ufbx_vec3 ks = { 0.0f, 0.0f, 1.0f }; + + ufbxt_diff_error err = { 0 }; + ufbxt_assert_close_vec3(&err, material->fbx.ambient_color.value_vec3, ka); + ufbxt_assert_close_vec3(&err, material->fbx.diffuse_color.value_vec3, kd); + ufbxt_assert_close_vec3(&err, material->fbx.specular_color.value_vec3, ks); + if (err.num > 0) { + ufbx_real avg = err.sum / (ufbx_real)err.num; + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", avg, err.max, err.num); + } + + ufbx_free_scene(scene); +} +#endif + +UFBXT_TEST(obj_opts_no_extrnal_files) +#if UFBXT_IMPL +{ + char path[512]; + + ufbxt_diff_error err = { 0 }; + + ufbxt_file_iterator iter = { "blender_279_ball" }; + while (ufbxt_next_file(&iter, path, sizeof(path))) { + for (int load_external = 0; load_external <= 1; load_external++) { + ufbx_load_opts opts = { 0 }; + opts.load_external_files = load_external != 0; + ufbx_scene *scene = ufbx_load_file(path, &opts, NULL); + ufbxt_assert(scene); + ufbxt_check_scene(scene); + + if (scene->metadata.file_format == UFBX_FILE_FORMAT_OBJ) { + ufbx_material *red = ufbx_find_material(scene, "Red"); + ufbx_material *white = ufbx_find_material(scene, "White"); + ufbxt_assert(red); + ufbxt_assert(white); + + if (load_external) { + ufbx_vec3 ref_red = { 0.8f, 0.0f, 0.0f }; + ufbx_vec3 ref_white = { 0.8f, 0.8f, 0.8f }; + ufbxt_assert_close_vec3(&err, red->fbx.diffuse_color.value_vec3, ref_red); + ufbxt_assert_close_vec3(&err, white->fbx.diffuse_color.value_vec3, ref_white); + } else { + ufbxt_assert(red->props.props.count == 0); + ufbxt_assert(white->props.props.count == 0); + } + } + + ufbx_free_scene(scene); + } + } + + if (err.num > 0) { + ufbx_real avg = err.sum / (ufbx_real)err.num; + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", avg, err.max, err.num); + } +} +#endif + +UFBXT_TEST(obj_opts_no_extrnal_files_by_filename) +#if UFBXT_IMPL +{ + char path[512]; + ufbxt_diff_error err = { 0 }; + + ufbxt_file_iterator iter = { "synthetic_filename_mtl" }; + while (ufbxt_next_file(&iter, path, sizeof(path))) { + for (int load_by_filename = 0; load_by_filename <= 1; load_by_filename++) + for (int load_external = 0; load_external <= 1; load_external++) { + ufbx_load_opts opts = { 0 }; + opts.load_external_files = load_external != 0; + opts.obj_search_mtl_by_filename = load_by_filename != 0; + ufbx_scene *scene = ufbx_load_file(path, &opts, NULL); + ufbxt_assert(scene); + ufbxt_check_scene(scene); + + if (scene->metadata.file_format == UFBX_FILE_FORMAT_OBJ) { + ufbx_material *material = ufbx_find_material(scene, "Material"); + ufbxt_assert(material); + + if (load_external && load_by_filename) { + ufbxt_check_warning(scene, UFBX_WARNING_IMPLICIT_MTL, 1, "synthetic_filename_mtl_0_obj.mtl"); + ufbx_vec3 ka = { 1.0f, 0.0f, 0.0f }; + ufbx_vec3 kd = { 0.0f, 1.0f, 0.0f }; + ufbx_vec3 ks = { 0.0f, 0.0f, 1.0f }; + ufbxt_assert_close_vec3(&err, material->fbx.ambient_color.value_vec3, ka); + ufbxt_assert_close_vec3(&err, material->fbx.diffuse_color.value_vec3, kd); + ufbxt_assert_close_vec3(&err, material->fbx.specular_color.value_vec3, ks); + } else { + ufbxt_assert(material->props.props.count == 0); + } + } + + ufbx_free_scene(scene); + } + } + + if (err.num > 0) { + ufbx_real avg = err.sum / (ufbx_real)err.num; + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", avg, err.max, err.num); + } +} +#endif + +#if UFBXT_IMPL +static void ufbxt_check_only_texture(ufbx_material_map *map, const char *filename) +{ + ufbxt_assert(!map->has_value); + ufbxt_assert(map->texture); + ufbxt_assert(!strcmp(map->texture->relative_filename.data, filename)); +} +#endif + +UFBXT_FILE_TEST(synthetic_map_feature) +#if UFBXT_IMPL +{ + { + ufbx_material *material = ufbx_find_material(scene, "Phong"); + ufbxt_assert(material->shader_type == UFBX_SHADER_WAVEFRONT_MTL); + + ufbxt_check_only_texture(&material->fbx.diffuse_color, "diffuse.png"); + ufbxt_check_only_texture(&material->fbx.specular_color, "specular.png"); + + ufbxt_assert(!material->features.pbr.enabled); + ufbxt_assert(!material->features.sheen.enabled); + ufbxt_assert(!material->features.coat.enabled); + ufbxt_assert(!material->features.metalness.enabled); + ufbxt_assert(!material->features.ior.enabled); + ufbxt_assert(!material->features.opacity.enabled); + ufbxt_assert(!material->features.transmission.enabled); + ufbxt_assert(!material->features.emission.enabled); + } + + { + ufbx_material *material = ufbx_find_material(scene, "PBR"); + ufbxt_assert(material->shader_type == UFBX_SHADER_WAVEFRONT_MTL); + + ufbxt_check_only_texture(&material->pbr.roughness, "roughness.png"); + ufbxt_check_only_texture(&material->pbr.metalness, "metalness.png"); + + ufbxt_assert(material->features.pbr.enabled); + ufbxt_assert(!material->features.sheen.enabled); + ufbxt_assert(!material->features.coat.enabled); + ufbxt_assert(material->features.metalness.enabled); + ufbxt_assert(!material->features.ior.enabled); + ufbxt_assert(!material->features.opacity.enabled); + ufbxt_assert(!material->features.transmission.enabled); + ufbxt_assert(!material->features.emission.enabled); + } + + { + ufbx_material *material = ufbx_find_material(scene, "Extended"); + ufbxt_assert(material->shader_type == UFBX_SHADER_WAVEFRONT_MTL); + + ufbxt_check_only_texture(&material->pbr.sheen_color, "sheen.png"); + ufbxt_check_only_texture(&material->pbr.coat_factor, "coat.png"); + ufbxt_check_only_texture(&material->pbr.metalness, "metalness.png"); + ufbxt_check_only_texture(&material->pbr.specular_ior, "ior.png"); + ufbxt_check_only_texture(&material->pbr.opacity, "opacity.png"); + ufbxt_check_only_texture(&material->pbr.transmission_color, "transmission.png"); + ufbxt_check_only_texture(&material->pbr.emission_color, "emission.png"); + + ufbxt_assert(material->features.pbr.enabled); + ufbxt_assert(material->features.sheen.enabled); + ufbxt_assert(material->features.coat.enabled); + ufbxt_assert(material->features.metalness.enabled); + ufbxt_assert(material->features.ior.enabled); + ufbxt_assert(material->features.opacity.enabled); + ufbxt_assert(material->features.transmission.enabled); + ufbxt_assert(material->features.emission.enabled); + } +} +#endif + +UFBXT_FILE_TEST(blender_340_line_point) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Cube"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 6); + ufbxt_assert(mesh->num_empty_faces == 0); + ufbxt_assert(mesh->num_point_faces == 0); + ufbxt_assert(mesh->num_line_faces == 5); +} +#endif + +UFBXT_FILE_TEST(synthetic_extended_line) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Line"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 4); + ufbxt_assert(mesh->num_empty_faces == 0); + ufbxt_assert(mesh->num_point_faces == 0); + ufbxt_assert(mesh->num_line_faces == 4); + ufbxt_assert(mesh->num_indices == 8); + + ufbx_vec3 pos_ref[] = { + { 0.0f, 0.0f, 0.0f }, { 1.0f, 0.0f, 0.0f }, + { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f }, { 1.0f, 1.0f, 0.0f }, + { 1.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, + }; + + ufbx_vec2 uv_ref[] = { + { 0.0f, 0.0f }, { 2.0f, 0.0f }, + { 2.0f, 0.0f }, { 0.0f, 2.0f }, + { 0.0f, 2.0f }, { 2.0f, 2.0f }, + { 2.0f, 2.0f }, { 0.0f, 0.0f }, + }; + + ufbx_vec4 col_ref[] = { + { 1.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f }, + { 0.0f, 1.0f, 0.0f, 1.0f }, { 0.0f, 0.0f, 1.0f, 1.0f }, + { 0.0f, 0.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, + { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f }, + }; + + for (size_t i = 0; i < mesh->num_indices; i++) { + ufbxt_hintf("i=%zu", i); + ufbxt_assert_close_vec3(err, pos_ref[i], ufbx_get_vertex_vec3(&mesh->vertex_position, i)); + ufbxt_assert_close_vec2(err, uv_ref[i], ufbx_get_vertex_vec2(&mesh->vertex_uv, i)); + ufbxt_assert_close_vec4(err, col_ref[i], ufbx_get_vertex_vec4(&mesh->vertex_color, i)); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_extended_points) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Points"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 3); + ufbxt_assert(mesh->num_empty_faces == 0); + ufbxt_assert(mesh->num_point_faces == 3); + ufbxt_assert(mesh->num_line_faces == 0); + ufbxt_assert(mesh->num_indices == 3); + + ufbx_vec3 pos_ref[] = { + { 0.0f, 0.0f, 0.0f }, + { 1.0f, 0.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f }, + }; + + ufbx_vec4 col_ref[] = { + { 1.0f, 0.0f, 0.0f, 1.0f }, + { 0.0f, 1.0f, 0.0f, 1.0f }, + { 0.0f, 0.0f, 1.0f, 1.0f }, + }; + + for (size_t i = 0; i < mesh->num_indices; i++) { + ufbxt_hintf("i=%zu", i); + ufbxt_assert_close_vec3(err, pos_ref[i], ufbx_get_vertex_vec3(&mesh->vertex_position, i)); + ufbxt_assert_close_vec4(err, col_ref[i], ufbx_get_vertex_vec4(&mesh->vertex_color, i)); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_empty_face) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Object"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 0); + ufbxt_assert(mesh->num_empty_faces == 0); +} +#endif + +#if UFBXT_IMPL +static ufbx_load_opts ufbxt_allow_empty_faces_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.allow_empty_faces = true; + return opts; +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT(synthetic_empty_face_allow, synthetic_empty_face, ufbxt_allow_empty_faces_opts) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Object"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 1); + ufbxt_assert(mesh->num_empty_faces == 1); + + ufbxt_assert(mesh->faces.data[0].index_begin == 0); + ufbxt_assert(mesh->faces.data[0].num_indices == 0); +} +#endif + diff --git a/modules/ufbx/test/test_parse.h b/modules/ufbx/test/test_parse.h new file mode 100644 index 0000000..222c092 --- /dev/null +++ b/modules/ufbx/test/test_parse.h @@ -0,0 +1,1462 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "parse" + +#if UFBXT_IMPL +static void ufbxt_check_warning(ufbx_scene *scene, ufbx_warning_type type, size_t count, const char *substring) +{ + bool found = false; + for (size_t i = 0; i < scene->metadata.warnings.count; i++) { + ufbx_warning *warning = &scene->metadata.warnings.data[i]; + if (warning->type == type) { + if (substring) { + ufbxt_assert(strstr(warning->description.data, substring)); + } + if (count == SIZE_MAX) { + ufbxt_assert(warning->count > 0); + } else { + ufbxt_assert(warning->count == count); + } + found = true; + break; + } + } + + ufbxt_logf("Warning not found: %d", (int)type); + ufbxt_assert(found); +} +#endif + +UFBXT_TEST(thread_safety) +#if UFBXT_IMPL +{ + if (!g_allow_non_thread_safe) { + ufbxt_assert(ufbx_is_thread_safe()); + } +} +#endif + +#if UFBXT_IMPL +static ufbx_load_opts ufbxt_retain_dom_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.retain_dom = true; + return opts; +} +static ufbx_load_opts ufbxt_strict_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.strict = true; + return opts; +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(maya_cube_dom, maya_cube, ufbxt_retain_dom_opts, UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->dom_root); + + ufbx_dom_node *objects = ufbx_dom_find(scene->dom_root, "Objects"); + ufbxt_assert(objects); + + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node); + bool found = false; + for (size_t i = 0; i < objects->children.count; i++) { + if (node->element.dom_node == objects->children.data[i]) { + found = true; + break; + } + } + ufbxt_assert(found); + + ufbx_mesh *mesh = ufbx_as_mesh(node->attrib); + ufbxt_assert(mesh); + + ufbx_dom_node *dom_mesh = mesh->element.dom_node; + ufbxt_assert(dom_mesh); + + ufbx_dom_node *dom_indices = ufbx_dom_find(dom_mesh, "PolygonVertexIndex"); + ufbxt_assert(dom_indices); + ufbxt_assert(dom_indices->values.count == 1); + + ufbx_dom_value *dom_indices_value = &dom_indices->values.data[0]; + ufbxt_assert(dom_indices_value->type == UFBX_DOM_VALUE_ARRAY_I32); + ufbxt_assert(dom_indices_value->value_int == 24); + + size_t count = (size_t)dom_indices_value->value_int; + int32_t *data = (int32_t*)dom_indices_value->value_blob.data; + + size_t num_negative = 0; + for (size_t i = 0; i < count; i++) { + if (data[i] < 0) { + num_negative++; + } + } + ufbxt_assert(num_negative == 6); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(maya_cube_strict, maya_cube, ufbxt_strict_opts, UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max2009_blob_dom, max2009_blob, ufbxt_retain_dom_opts, UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->dom_root); +} +#endif + +UFBXT_FILE_TEST(maya_leading_comma) +#if UFBXT_IMPL +{ + ufbxt_assert(!strcmp(scene->metadata.creator.data, "FBX SDK/FBX Plugins version 2019.2")); +} +#endif + +UFBXT_FILE_TEST(maya_zero_end) +#if UFBXT_IMPL +{ + ufbxt_assert(!strcmp(scene->metadata.creator.data, "FBX SDK/FBX Plugins version 2019.2")); +} +#endif + +UFBXT_TEST(error_format_long) +#if UFBXT_IMPL +{ + char data[] = "Bad FBX"; + ufbx_error error; + ufbx_scene *scene = ufbx_load_memory(data, sizeof(data), NULL, &error); + ufbxt_assert(!scene); + + char error_buf[512]; + size_t length = ufbx_format_error(error_buf, sizeof(error_buf), &error); + ufbxt_assert(strlen(error_buf) == length); + + #if defined(UFBX_DEV) + ufbxt_assert(error.stack_size >= 2); + #endif + + char func[64] = { 0 }, desc[64] = { 0 }; + size_t line_begin = 0; + size_t num_lines = 0; + for (size_t i = 0; i < length; i++) { + if (error_buf[i] == '\n') { + if (num_lines == 0) { + ufbxt_check_string(error.description); + + unsigned major = 0, minor = 0, patch = 0; + int num_scanned = sscanf(error_buf + line_begin, "ufbx v%u.%u.%u error: %63[^\n]\n", + &major, &minor, &patch, desc); + + ufbxt_assert(num_scanned == 4); + ufbxt_assert(major == ufbx_version_major(ufbx_source_version)); + ufbxt_assert(minor == ufbx_version_minor(ufbx_source_version)); + ufbxt_assert(patch == ufbx_version_patch(ufbx_source_version)); + ufbxt_assert(!strcmp(desc, error.description.data)); + } else { + size_t stack_ix = num_lines - 1; + ufbxt_check_string(error.stack[stack_ix].function); + ufbxt_check_string(error.stack[stack_ix].description); + + unsigned line = 0; + int num_scanned = sscanf(error_buf + line_begin, "%u:%63[^:]: %63[^\n]\n", &line, func, desc); + ufbxt_assert(num_scanned == 3); + ufbxt_assert(stack_ix < error.stack_size); + ufbxt_assert(line == error.stack[stack_ix].source_line); + ufbxt_assert(!strcmp(func, error.stack[stack_ix].function.data)); + ufbxt_assert(!strcmp(desc, error.stack[stack_ix].description.data)); + } + + line_begin = i + 1; + num_lines++; + } + } + ufbxt_assert(num_lines == error.stack_size + 1); +} +#endif + +UFBXT_TEST(error_format_short) +#if UFBXT_IMPL +{ + char data[] = "Bad FBX"; + ufbx_error error; + ufbx_scene *scene = ufbx_load_memory(data, sizeof(data), NULL, &error); + ufbxt_assert(!scene); + + char error_buf[512]; + for (size_t buf_len = 0; buf_len <= ufbxt_arraycount(error_buf); buf_len++) { + size_t ret_len = ufbx_format_error(error_buf, buf_len, &error); + if (buf_len == 0) { + ufbxt_assert(ret_len == 0); + continue; + } + + size_t str_len = strlen(error_buf); + ufbxt_hintf("buf_len = %zu, ret_len = %zu, str_len = %zu", buf_len, ret_len, str_len); + ufbxt_assert(ret_len == str_len); + if (buf_len < 16) { + ufbxt_assert(ret_len == buf_len - 1); + } + } +} +#endif + +UFBXT_FILE_TEST(maya_node_attribute_zoo) +#if UFBXT_IMPL +{ + ufbx_node *node; + + ufbxt_assert(scene->settings.axes.right == UFBX_COORDINATE_AXIS_POSITIVE_X); + ufbxt_assert(scene->settings.axes.up == UFBX_COORDINATE_AXIS_POSITIVE_Y); + ufbxt_assert(scene->settings.axes.front == UFBX_COORDINATE_AXIS_POSITIVE_Z); + ufbxt_assert(scene->settings.time_mode == UFBX_TIME_MODE_24_FPS); + ufbxt_assert_close_real(err, scene->settings.unit_meters, 0.01f); + ufbxt_assert_close_real(err, scene->settings.frames_per_second, 24.0f); + + node = ufbx_find_node(scene, "Null"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_EMPTY); + ufbxt_assert(node->attrib && node->attrib->type == UFBX_ELEMENT_EMPTY); + + node = ufbx_find_node(scene, "Mesh"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_MESH); + ufbxt_assert(node->attrib && node->attrib->type == UFBX_ELEMENT_MESH); + ufbxt_assert(&node->mesh->element == node->attrib); + + node = ufbx_find_node(scene, "Bone"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_BONE); + ufbxt_assert(node->attrib && node->attrib->type == UFBX_ELEMENT_BONE); + ufbxt_assert(&node->bone->element == node->attrib); + ufbxt_assert_close_real(err, node->bone->radius, 0.5f); + ufbxt_assert_close_real(err, node->bone->relative_length, 1.0f); + + node = ufbx_find_node(scene, "Camera"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_CAMERA); + ufbxt_assert(node->attrib && node->attrib->type == UFBX_ELEMENT_CAMERA); + ufbxt_assert(&node->camera->element == node->attrib); + ufbxt_assert(node->camera->gate_fit == UFBX_GATE_FIT_FILL); + ufbxt_assert_close_real(err, node->camera->field_of_view_deg.x / 10.0f, 54.43f / 10.0f); + ufbxt_assert_close_real(err, node->camera->focal_length_mm, 35.0f); + + node = ufbx_find_node(scene, "Light"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_LIGHT); + ufbxt_assert(node->attrib && node->attrib->type == UFBX_ELEMENT_LIGHT); + ufbxt_assert(&node->light->element == node->attrib); + ufbxt_assert_close_real(err, node->light->intensity, 1.0f); + ufbxt_assert_close_real(err, node->light->color.x, 1.0f); + ufbxt_assert_close_real(err, node->light->color.y, 1.0f); + ufbxt_assert_close_real(err, node->light->color.z, 1.0f); + + node = ufbx_find_node(scene, "StereoCamera"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_STEREO_CAMERA); + ufbxt_assert(node->attrib && node->attrib->type == UFBX_ELEMENT_STEREO_CAMERA); + ufbx_stereo_camera *stereo = (ufbx_stereo_camera*)node->attrib; + ufbxt_assert(stereo->left && stereo->left->element.type == UFBX_ELEMENT_CAMERA); + ufbxt_assert(stereo->right && stereo->right->element.type == UFBX_ELEMENT_CAMERA); + ufbx_prop left_focal_prop = ufbx_evaluate_prop(&scene->anim, &stereo->left->element, "FocalLength", 0.5); + ufbx_prop right_focal_prop = ufbx_evaluate_prop(&scene->anim, &stereo->right->element, "FocalLength", 0.5); + ufbxt_assert_close_real(err, left_focal_prop.value_real, 42.011f); + ufbxt_assert_close_real(err, right_focal_prop.value_real, 42.011f); + + node = ufbx_find_node(scene, "NurbsCurve"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_NURBS_CURVE); + ufbxt_assert(node->attrib && node->attrib->type == UFBX_ELEMENT_NURBS_CURVE); + + node = ufbx_find_node(scene, "NurbsSurface"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_NURBS_SURFACE); + ufbxt_assert(node->attrib && node->attrib->type == UFBX_ELEMENT_NURBS_SURFACE); + + node = ufbx_find_node(scene, "NurbsTrim"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_NURBS_TRIM_SURFACE); + ufbxt_assert(node->attrib && node->attrib->type == UFBX_ELEMENT_NURBS_TRIM_SURFACE); + + node = ufbx_find_node(scene, "LodGroup"); + ufbxt_assert(node && node->attrib_type == UFBX_ELEMENT_LOD_GROUP); + ufbxt_assert(node->attrib && node->attrib->type == UFBX_ELEMENT_LOD_GROUP); +} +#endif + +UFBXT_FILE_TEST(synthetic_duplicate_prop) +#if UFBXT_IMPL +{ + ufbx_prop *prop; + ufbx_node *cube = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(cube); + + prop = ufbx_find_prop(&cube->props, "Lcl Translation"); + ufbxt_assert(prop); + ufbxt_assert_close_real(err, prop->value_vec3.x, -1.0f); + + prop = ufbx_find_prop(&cube->props, "Lcl Scaling"); + ufbxt_assert(prop); + ufbxt_assert_close_real(err, prop->value_vec3.x, 2.0f); +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_missing_version, UFBXT_FILE_TEST_FLAG_ALLOW_STRICT_ERROR) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->metadata.version == 6100); + ufbxt_assert(scene->metadata.exporter == UFBX_EXPORTER_FBX_SDK); + ufbxt_assert(scene->metadata.exporter_version == ufbx_pack_version(2007, 2, 28)); +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_missing_exporter, UFBXT_FILE_TEST_FLAG_ALLOW_STRICT_ERROR) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->metadata.version == 6100); + ufbxt_assert(scene->metadata.exporter == UFBX_EXPORTER_UNKNOWN); + ufbxt_assert(scene->metadata.exporter_version == 0); +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_blender_old_exporter, UFBXT_FILE_TEST_FLAG_ALLOW_STRICT_ERROR) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->metadata.version == 6100); + ufbxt_assert(scene->metadata.exporter == UFBX_EXPORTER_UNKNOWN); + ufbxt_assert(scene->metadata.exporter_version == 0); +} +#endif + +UFBXT_FILE_TEST(blender_272_cube) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->metadata.version == 7400); + ufbxt_assert(scene->metadata.exporter == UFBX_EXPORTER_BLENDER_BINARY); + ufbxt_assert(scene->metadata.exporter_version == ufbx_pack_version(2, 72, 0)); + + ufbxt_assert(!strcmp(scene->metadata.original_application.vendor.data, "Blender Foundation")); + ufbxt_assert(!strcmp(scene->metadata.original_application.name.data, "Blender (stable FBX IO)")); + ufbxt_assert(!strcmp(scene->metadata.original_application.version.data, "2.72 (sub 0)")); + ufbxt_assert(!strcmp(scene->metadata.latest_application.vendor.data, "Blender Foundation")); + ufbxt_assert(!strcmp(scene->metadata.latest_application.name.data, "Blender (stable FBX IO)")); + ufbxt_assert(!strcmp(scene->metadata.latest_application.version.data, "2.72 (sub 0)")); +} +#endif + +UFBXT_TEST(unicode_filename) +#if UFBXT_IMPL +{ + char buf[1024]; + int len = snprintf(buf, sizeof(buf), "%ssynthetic_\x61\xce\xb2\xe3\x82\xab\xf0\x9f\x98\x82_7500_ascii.fbx", data_root); + ufbxt_assert(len > 0 && len < sizeof(buf)); + + { + ufbx_load_opts opts = { 0 }; + opts.ignore_geometry = true; + + ufbx_scene *scene = ufbx_load_file(buf, &opts, NULL); + ufbxt_assert(scene); + ufbxt_assert(ufbx_find_node(scene, "pCube1")); + ufbxt_check_scene(scene); + ufbx_free_scene(scene); + } + + // Remove terminating \0 for explicit length test + buf[len] = 'x'; + + { + ufbx_scene *scene = ufbx_load_file_len(buf, (size_t)len, NULL, NULL); + ufbxt_assert(scene); + ufbxt_assert(ufbx_find_node(scene, "pCube1")); + ufbxt_check_scene(scene); + ufbx_free_scene(scene); + } +} +#endif + +UFBXT_FILE_TEST(maya_cube_big_endian) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->metadata.big_endian); +} +#endif + +UFBXT_FILE_TEST(synthetic_cube_nan) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->num_vertices >= 2); + ufbxt_assert(isnan(mesh->vertices.data[0].x)); + ufbxt_assert(isinf(mesh->vertices.data[0].y) && mesh->vertices.data[0].y < 0.0f); + ufbxt_assert(isinf(mesh->vertices.data[0].z) && mesh->vertices.data[0].z > 0.0f); + ufbxt_assert_close_real(err, mesh->vertices.data[1].x, 0.5f); + ufbxt_assert_close_real(err, mesh->vertices.data[1].y, -0.5f); + ufbxt_assert_close_real(err, mesh->vertices.data[1].z, 0.5f); +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_string_collision, UFBXT_FILE_TEST_FLAG_HEAVY_TO_FUZZ|UFBXT_FILE_TEST_FLAG_SKIP_LOAD_OPTS_CHECKS) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node); + ufbx_prop *prop; + + prop = ufbx_find_prop(&node->props, "BIiMTNT"); + ufbxt_assert(prop); + ufbxt_assert(!strcmp(prop->value_str.data, "BJKKUfZ")); + + prop = ufbx_find_prop(&node->props, "BbAJerP"); + ufbxt_assert(prop); + ufbxt_assert(!strcmp(prop->value_str.data, "AAAJKop")); + + prop = ufbx_find_prop(&node->props, "BpgrcZR"); + ufbxt_assert(prop); + ufbxt_assert(!strcmp(prop->value_str.data, "APGAmLj")); +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_id_collision, UFBXT_FILE_TEST_FLAG_HEAVY_TO_FUZZ|UFBXT_FILE_TEST_FLAG_SKIP_LOAD_OPTS_CHECKS) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->nodes.count == 10002); + ufbx_node *node = ufbx_find_node(scene, "First"); + for (int32_t depth = 10000; depth >= 0; depth--) { + ufbxt_assert(node); + ufbxt_assert(node->node_depth == depth); + node = node->parent; + } + ufbxt_assert(!node); +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_node_depth_fail, UFBXT_FILE_TEST_FLAG_ALLOW_ERROR) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_TEST(open_file) +#if UFBXT_IMPL +{ + const char *name = "maya_cube_7500_ascii.fbx"; + + char buf[512]; + snprintf(buf, sizeof(buf), "%s%s", data_root, name); + + for (size_t i = 0; i < 2; i++) { + ufbx_stream stream = { 0 }; + bool ok = ufbx_open_file(&stream, buf, i == 0 ? SIZE_MAX : strlen(buf)); + ufbxt_assert(ok); + ufbxt_assert(stream.skip_fn); + ufbxt_assert(stream.read_fn); + ufbxt_assert(stream.close_fn); + + ufbxt_assert(stream.skip_fn(stream.user, 2)); + + char result[3]; + size_t num_read = stream.read_fn(stream.user, result, 3); + ufbxt_assert(num_read == 3); + + ufbxt_assert(!memcmp(result, "FBX", 3)); + + stream.close_fn(stream.user); + } + +} +#endif + +UFBXT_TEST(file_not_found) +#if UFBXT_IMPL +{ + const char *name = "maya_cube_9999_emoji.fbx"; + + char buf[512]; + snprintf(buf, sizeof(buf), "%s%s", data_root, name); + + ufbx_error error; + ufbx_scene *scene = ufbx_load_file(buf, NULL, &error); + ufbxt_assert(!scene); + ufbxt_assert(error.type == UFBX_ERROR_FILE_NOT_FOUND); + ufbxt_assert(error.info_length == strlen(error.info)); + ufbxt_assert(!strcmp(error.info, buf)); +} +#endif + +UFBXT_TEST(retain_scene) +#if UFBXT_IMPL +{ + char path[512]; + ufbxt_file_iterator iter = { "maya_cube" }; + while (ufbxt_next_file(&iter, path, sizeof(path))) { + ufbx_load_opts opts = { 0 }; + + ufbx_scene *scene = ufbx_load_file(path, &opts, NULL); + ufbxt_assert(scene); + + ufbxt_check_scene(scene); + + ufbx_scene *eval_scene = ufbx_evaluate_scene(scene, NULL, 0.1, NULL, NULL); + ufbx_free_scene(scene); + + // eval_scene should retain references + ufbx_node *node = ufbx_find_node(eval_scene, "pCube1"); + ufbxt_assert(node); + ufbxt_assert(!strcmp(node->name.data, "pCube1")); + + // No-op retain and release + ufbx_retain_scene(eval_scene); + ufbx_free_scene(eval_scene); + + ufbx_free_scene(eval_scene); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_empty_elements) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); +} +#endif + +#if UFBXT_IMPL +static void ufbxt_check_binary_prop(const ufbx_props *props) +{ + ufbx_prop *prop = ufbx_find_prop(props, "Binary"); + ufbxt_assert(prop); + ufbxt_assert(prop->type == UFBX_PROP_BLOB); + // TODO: Assert value +} +#endif + +UFBXT_FILE_TEST(synthetic_binary_props) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbxt_check_binary_prop(&node->props); + ufbxt_check_binary_prop(&node->mesh->props); + ufbxt_check_binary_prop(&scene->settings.props); +} +#endif + +UFBXT_FILE_TEST(maya_unicode) +#if UFBXT_IMPL +{ + // WHAT? Maya turns U+03B2 (Greek Small Letter Beta) into U+00DF (Latin Small Letter Sharp S) + // The larger codepoints just get turned into one or two underscores which makes a bit more sense... + ufbx_node *node = ufbx_find_node(scene, "\x61\xc3\x9f___"); + ufbxt_assert(node); +} +#endif + +UFBXT_FILE_TEST(max_unicode) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "\x61\xce\xb2\xe3\x82\xab\xf0\x9f\x98\x82"); + ufbxt_assert(node); +} +#endif + +UFBXT_FILE_TEST(blender_279_unicode) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "\x61\xce\xb2\xe3\x82\xab\xf0\x9f\x98\x82"); + ufbxt_assert(node); +} +#endif + +#if UFBXT_IMPL +static uint32_t ufbxt_decode_hex_char(char c) +{ + if (c >= '0' && c <= '9') { + return (uint32_t)c - '0'; + } else if (c >= 'a' && c <= 'f') { + return (uint32_t)c - 'a' + 10; + } else if (c >= 'A' && c <= 'F') { + return (uint32_t)c - 'A' + 10; + } else { + ufbxt_assert(false && "Bad hex character"); + return 0; + } +} + +static size_t ufbxt_decode_hex(uint8_t *dst, size_t dst_len, ufbx_string src) +{ + ufbxt_assert(src.length % 2 == 0); + + size_t num = src.length / 2; + ufbxt_assert(num <= dst_len); + + for (size_t i = 0; i < num; i++) { + dst[i] = (uint8_t)( + ufbxt_decode_hex_char(src.data[i * 2 + 0]) << 4u | + ufbxt_decode_hex_char(src.data[i * 2 + 1]) << 0u ); + } + + return num; +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_unicode, UFBXT_FILE_TEST_FLAG_ALLOW_INVALID_UNICODE|UFBXT_FILE_TEST_FLAG_HEAVY_TO_FUZZ|UFBXT_FILE_TEST_FLAG_SKIP_LOAD_OPTS_CHECKS) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->metadata.warnings.count == 1); + ufbxt_assert(scene->metadata.warnings.data[0].type == UFBX_WARNING_BAD_UNICODE); + ufbxt_assert(scene->metadata.warnings.data[0].count >= 6000); + + uint8_t ref[128]; + + { + ufbx_node *node = ufbx_find_node(scene, "Good"); + ufbxt_assert(node); + + for (size_t prop_ix = 0; prop_ix < node->props.props.count; prop_ix++) { + ufbx_prop *prop = &node->props.props.data[prop_ix]; + size_t ref_len = ufbxt_decode_hex(ref, ufbxt_arraycount(ref), prop->name); + + ufbx_string src = prop->value_str; + + size_t src_ix = 0; + for (size_t ref_ix = 0; ref_ix < ref_len; ref_ix++) { + uint8_t rc = ref[ref_ix]; + if (rc == 0) { + ufbxt_assert(src_ix + 3 <= src.length); + ufbxt_assert((uint8_t)src.data[src_ix + 0] == 0xef); + ufbxt_assert((uint8_t)src.data[src_ix + 1] == 0xbf); + ufbxt_assert((uint8_t)src.data[src_ix + 2] == 0xbd); + src_ix += 3; + } else { + ufbxt_assert(src_ix < src.length); + ufbxt_assert((uint8_t)src.data[src_ix] == rc); + src_ix += 1; + } + } + ufbxt_assert(src_ix == src.length); + } + } + + { + ufbx_node *node = ufbx_find_node(scene, "Ok"); + ufbxt_assert(node); + + for (size_t prop_ix = 0; prop_ix < node->props.props.count; prop_ix++) { + ufbx_prop *prop = &node->props.props.data[prop_ix]; + size_t ref_len = ufbxt_decode_hex(ref, ufbxt_arraycount(ref), prop->name); + + ufbx_string src = prop->value_str; + + ufbxt_assert(ref_len >= 1); + ufbxt_assert((uint8_t)ref[0] == 0xff); + + size_t src_ix = 0; + ufbxt_assert((uint8_t)src.data[src_ix + 0] == 0xef); + ufbxt_assert((uint8_t)src.data[src_ix + 1] == 0xbf); + ufbxt_assert((uint8_t)src.data[src_ix + 2] == 0xbd); + src_ix += 3; + + for (size_t ref_ix = 1; ref_ix < ref_len; ref_ix++) { + uint8_t rc = ref[ref_ix]; + if (rc == 0) { + ufbxt_assert(src_ix + 3 <= src.length); + ufbxt_assert((uint8_t)src.data[src_ix + 0] == 0xef); + ufbxt_assert((uint8_t)src.data[src_ix + 1] == 0xbf); + ufbxt_assert((uint8_t)src.data[src_ix + 2] == 0xbd); + src_ix += 3; + } else { + ufbxt_assert(src_ix < src.length); + ufbxt_assert((uint8_t)src.data[src_ix] == rc); + src_ix += 1; + } + } + ufbxt_assert(src_ix == src.length); + } + } + + { + ufbx_node *node = ufbx_find_node(scene, "Bad"); + ufbxt_assert(node); + + for (size_t prop_ix = 0; prop_ix < node->props.props.count; prop_ix++) { + ufbx_prop *prop = &node->props.props.data[prop_ix]; + size_t ref_len = ufbxt_decode_hex(ref, ufbxt_arraycount(ref), prop->name); + + ufbx_string src = prop->value_str; + const char *replacement = strstr(src.data, "\xef\xbf\xbd"); + ufbxt_assert(replacement); + } + } +} +#endif + +UFBXT_FILE_TEST(max_quote) +#if UFBXT_IMPL +{ + if (scene->metadata.ascii && scene->metadata.version == 6100) { + ufbxt_check_warning(scene, UFBX_WARNING_DUPLICATE_OBJECT_ID, 1, NULL); + } + + { + ufbx_node *node = ufbx_find_node(scene, "\"'&\""); + ufbxt_assert(node); + ufbxt_assert(node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->materials.count == 1); + ufbx_material *material = mesh->materials.data[0].material; + if (scene->metadata.ascii) { + ufbxt_assert(!strcmp(material->name.data, "&&q&qu&quo"\"\"")); + } else { + ufbxt_assert(!strcmp(material->name.data, "&&q&qu&quo""\"")); + } + + } + + { + ufbx_node *node = ufbx_find_node(scene, "\""); + ufbxt_assert(node); + } + + { + ufbx_node *node = ufbx_find_node(scene, """); + if (scene->metadata.ascii) { + ufbxt_assert(!node); + } else { + ufbxt_assert(node); + } + } +} +#endif + +UFBXT_FILE_TEST(max_colon_name) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Cube::Model"); + ufbxt_assert(node); + ufbxt_assert(node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->materials.count == 1); + ufbx_material *material = mesh->materials.data[0].material; + ufbxt_assert(!strcmp(material->name.data, "Material::Pink")); +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_truncated_quot_fail, UFBXT_FILE_TEST_FLAG_ALLOW_ERROR) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_unicode_error_identity, UFBXT_FILE_TEST_FLAG_ALLOW_INVALID_UNICODE) +#if UFBXT_IMPL +{ + ufbx_node *parent = ufbx_find_node(scene, "Parent"); + ufbxt_assert(parent); + ufbxt_assert(parent->children.count == 2); + + ufbxt_assert(!strcmp(parent->children.data[0]->name.data, parent->children.data[1]->name.data)); + ufbxt_assert(parent->children.data[0]->name.data == parent->children.data[1]->name.data); + + for (size_t i = 0; i < parent->children.count; i++) { + ufbx_node *child = parent->children.data[i]; + bool left = child->world_transform.translation.x < 0.0f; + + ufbxt_assert(!strcmp(child->name.data, "Child_\xef\xbf\xbd")); + + ufbx_mesh *mesh = child->mesh; + ufbxt_assert(mesh); + ufbxt_assert(mesh->materials.count == 1); + + ufbx_material *material = mesh->materials.data[0].material; + ufbxt_assert(!strcmp(material->name.data, "Material_\xef\xbf\xbd")); + + if (left) { + ufbx_vec3 ref = { 1.0f, 0.0f, 0.0f }; + ufbxt_assert_close_vec3(err, material->fbx.diffuse_color.value_vec3, ref); + } else { + ufbx_vec3 ref = { 0.0f, 1.0f, 0.0f }; + ufbxt_assert_close_vec3(err, material->fbx.diffuse_color.value_vec3, ref); + } + } +} +#endif + +#if UFBXT_IMPL +ufbx_load_opts ufbxt_unicode_error_question_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.unicode_error_handling = UFBX_UNICODE_ERROR_HANDLING_QUESTION_MARK; + return opts; +} +#endif + +UFBXT_FILE_TEST_OPTS_FLAGS(synthetic_broken_filename, ufbxt_unicode_error_question_opts, UFBXT_FILE_TEST_FLAG_ALLOW_INVALID_UNICODE) +#if UFBXT_IMPL +{ + ufbxt_assert(scene->textures.count == 1); + + const char *abs_path_safe = "D:/Dev/clean/ufbx/data/textures/??????_diffuse.png"; + const char *rel_path_safe = "textures\\??????_diffuse.png"; + const char *abs_path_raw = "D:/Dev/clean/ufbx/data/textures/\xaa\xbb\xcc\xdd\xee\xff_diffuse.png"; + const char *rel_path_raw = "textures\\\xaa\xbb\xcc\xdd\xee\xff_diffuse.png"; + const char *name_path_raw = "\xaa\xbb\xcc\xdd\xee\xff_diffuse.png"; + + ufbx_texture *texture = scene->textures.data[0]; + + ufbxt_assert(texture->absolute_filename.length == strlen(abs_path_safe)); + ufbxt_assert(texture->relative_filename.length == strlen(rel_path_safe)); + ufbxt_assert(!strcmp(texture->absolute_filename.data, abs_path_safe)); + ufbxt_assert(!strcmp(texture->relative_filename.data, rel_path_safe)); + + ufbxt_assert(texture->raw_absolute_filename.size == strlen(abs_path_raw)); + ufbxt_assert(texture->raw_relative_filename.size == strlen(rel_path_raw)); + ufbxt_assert(!memcmp(texture->raw_absolute_filename.data, abs_path_raw, texture->raw_absolute_filename.size)); + ufbxt_assert(!memcmp(texture->raw_relative_filename.data, rel_path_raw, texture->raw_relative_filename.size)); + + { + ufbxt_assert(strstr(texture->filename.data, "??????_diffuse.png")); + const char *begin = memchr((const char*)texture->raw_filename.data, '\xaa', texture->raw_filename.size); + ufbxt_assert(begin); + size_t offset = begin - (const char*)texture->raw_filename.data; + size_t left = texture->raw_filename.size - offset; + ufbxt_assert(left == strlen(name_path_raw)); + ufbxt_assert(!memcmp(begin, name_path_raw, left)); + } + + ufbx_video *video = scene->videos.data[0]; + + ufbxt_assert(video->absolute_filename.length == strlen(abs_path_safe)); + ufbxt_assert(video->relative_filename.length == strlen(rel_path_safe)); + ufbxt_assert(!strcmp(video->absolute_filename.data, abs_path_safe)); + ufbxt_assert(!strcmp(video->relative_filename.data, rel_path_safe)); + + ufbxt_assert(video->raw_absolute_filename.size == strlen(abs_path_raw)); + ufbxt_assert(video->raw_relative_filename.size == strlen(rel_path_raw)); + ufbxt_assert(!memcmp(video->raw_absolute_filename.data, abs_path_raw, video->raw_absolute_filename.size)); + ufbxt_assert(!memcmp(video->raw_relative_filename.data, rel_path_raw, video->raw_relative_filename.size)); + + { + ufbxt_assert(strstr(video->filename.data, "??????_diffuse.png")); + const char *begin = memchr((const char*)video->raw_filename.data, '\xaa', video->raw_filename.size); + ufbxt_assert(begin); + size_t offset = begin - (const char*)video->raw_filename.data; + size_t left = video->raw_filename.size - offset; + ufbxt_assert(left == strlen(name_path_raw)); + ufbxt_assert(!memcmp(begin, name_path_raw, left)); + } + + { + ufbx_string abs_path = ufbx_find_string(&video->props, "Path", ufbx_empty_string); + ufbx_string rel_path = ufbx_find_string(&video->props, "RelPath", ufbx_empty_string); + ufbxt_assert(abs_path.length == strlen(abs_path_safe)); + ufbxt_assert(rel_path.length == strlen(rel_path_safe)); + ufbxt_assert(!strcmp(abs_path.data, abs_path_safe)); + ufbxt_assert(!strcmp(rel_path.data, rel_path_safe)); + } + + { + ufbx_blob abs_path = ufbx_find_blob(&video->props, "Path", ufbx_empty_blob); + ufbx_blob rel_path = ufbx_find_blob(&video->props, "RelPath", ufbx_empty_blob); + ufbxt_assert(abs_path.size == strlen(abs_path_raw)); + ufbxt_assert(rel_path.size == strlen(rel_path_raw)); + ufbxt_assert(!memcmp(abs_path.data, abs_path_raw, abs_path.size)); + ufbxt_assert(!memcmp(rel_path.data, rel_path_raw, rel_path.size)); + } +} +#endif + +#if UFBXT_IMPL +static uint32_t ufbxt_fnv1a(const void *data, size_t size) +{ + const char *src = (const char*)data; + uint32_t hash = 0x811c9dc5u; + for (size_t i = 0; i < size; i++) { + hash = (hash ^ (uint32_t)(uint8_t)src[i]) * 0x01000193u; + } + return hash; +} +#endif + +UFBXT_FILE_TEST(revit_empty) +#if UFBXT_IMPL +{ + bool found_refs3 = false; + bool found_refs = false; + for (size_t i = 0; i < scene->unknowns.count; i++) { + ufbx_unknown *unknown = scene->unknowns.data[i]; + if (!strcmp(unknown->name.data, "ADSKAssetReferencesVersion3.0")) { + ufbx_prop *prop = ufbx_find_prop(&unknown->props, "ADSKAssetReferencesBlobVersion3.0"); + uint32_t size = scene->metadata.version == 7700 ? 11228u : 11305u; + uint32_t hash = scene->metadata.version == 7700 ? 0x5eee86b6u : 0x7f39429du; + + ufbxt_assert(prop); + ufbxt_assert(prop->type == UFBX_PROP_BLOB); + ufbxt_assert(prop->value_real == (ufbx_real)size); + ufbxt_assert(prop->value_int == size); + ufbxt_assert(prop->value_blob.size == size); + + ufbx_blob blob = ufbx_find_blob(&unknown->props, "ADSKAssetReferencesBlobVersion3.0", ufbx_empty_blob); + ufbxt_assert(blob.data == prop->value_blob.data); + ufbxt_assert(blob.size == prop->value_blob.size); + + uint32_t hash_ref = ufbxt_fnv1a(blob.data, blob.size); + ufbxt_assert(hash_ref == hash); + + ufbxt_assert(!found_refs3); + found_refs3 = true; + } else if (!strcmp(unknown->name.data, "ADSKAssetReferences")) { + ufbx_prop *prop = ufbx_find_prop(&unknown->props, "ADSKAssetReferencesBlob"); + uint32_t size = scene->metadata.version == 7700 ? 7910u : 7885u; + uint32_t hash = scene->metadata.version == 7700 ? 0xa081f491u : 0x5aaeae9au; + + ufbxt_assert(prop); + ufbxt_assert(prop->type == UFBX_PROP_BLOB); + ufbxt_assert(prop->value_real == size); + ufbxt_assert(prop->value_int == size); + ufbxt_assert(prop->value_blob.size == size); + + ufbx_blob blob = ufbx_find_blob(&unknown->props, "ADSKAssetReferencesBlob", ufbx_empty_blob); + ufbxt_assert(blob.data == prop->value_blob.data); + ufbxt_assert(blob.size == prop->value_blob.size); + + uint32_t hash_ref = ufbxt_fnv1a(blob.data, blob.size); + ufbxt_assert(hash_ref == hash); + + ufbxt_assert(!found_refs); + found_refs = true; + } + } + + ufbxt_assert(found_refs); + ufbxt_assert(found_refs3); +} +#endif + +UFBXT_FILE_TEST(maya_lock_mute) +#if UFBXT_IMPL +{ + uint32_t any_lock = UFBX_PROP_FLAG_LOCK_X | UFBX_PROP_FLAG_LOCK_Y | UFBX_PROP_FLAG_LOCK_Z | UFBX_PROP_FLAG_LOCK_W; + uint32_t any_mute = UFBX_PROP_FLAG_MUTE_X | UFBX_PROP_FLAG_MUTE_Y | UFBX_PROP_FLAG_MUTE_Z | UFBX_PROP_FLAG_MUTE_W; + uint32_t any_lock_mute = any_lock | any_mute; + + { + ufbx_prop *prop; + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node); + prop = ufbx_find_prop(&node->props, "Lcl Translation"); + ufbxt_assert(prop && (prop->flags & any_lock_mute) == (UFBX_PROP_FLAG_MUTE_X | UFBX_PROP_FLAG_LOCK_Z)); + prop = ufbx_find_prop(&node->props, "Lcl Rotation"); + ufbxt_assert(prop && (prop->flags & any_lock_mute) == (UFBX_PROP_FLAG_MUTE_Y | UFBX_PROP_FLAG_LOCK_Y)); + prop = ufbx_find_prop(&node->props, "Lcl Scaling"); + ufbxt_assert(prop && (prop->flags & any_lock_mute) == (UFBX_PROP_FLAG_MUTE_Z | UFBX_PROP_FLAG_LOCK_X)); + } + + { + ufbx_prop *prop; + ufbx_node *node = ufbx_find_node(scene, "pPlane1"); + ufbxt_assert(node); + prop = ufbx_find_prop(&node->props, "Lcl Translation"); + ufbxt_assert(prop && (prop->flags & any_lock_mute) == (UFBX_PROP_FLAG_MUTE_X | UFBX_PROP_FLAG_MUTE_Y | UFBX_PROP_FLAG_MUTE_Z)); + prop = ufbx_find_prop(&node->props, "Lcl Rotation"); + ufbxt_assert(prop && (prop->flags & any_lock_mute) == (UFBX_PROP_FLAG_LOCK_X | UFBX_PROP_FLAG_LOCK_Y | UFBX_PROP_FLAG_LOCK_Z)); + prop = ufbx_find_prop(&node->props, "Lcl Scaling"); + ufbxt_assert(prop && (prop->flags & any_lock_mute) == (UFBX_PROP_FLAG_MUTE_X | UFBX_PROP_FLAG_MUTE_Y | UFBX_PROP_FLAG_MUTE_Z | UFBX_PROP_FLAG_LOCK_X | UFBX_PROP_FLAG_LOCK_Y | UFBX_PROP_FLAG_LOCK_Z)); + } +} +#endif + +#if UFBXT_IMPL +static ufbx_load_opts ufbxt_filename_load_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.filename.data = "fake/path/to/file.fbx"; + opts.filename.length = SIZE_MAX; + opts.path_separator = '/'; + return opts; +} +#endif + +UFBXT_FILE_TEST_OPTS(synthetic_parent_directory, ufbxt_filename_load_opts) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "lambert1"); + ufbxt_assert(material); + + ufbx_texture *temporary = material->fbx.diffuse_color.texture; + ufbxt_assert(temporary && temporary->video); + ufbx_video *temporary_video = temporary->video; + + ufbx_texture *inner = material->fbx.transparency_color.texture; + ufbxt_assert(inner && inner->video); + ufbx_video *inner_video = inner->video; + + ufbxt_assert(!strcmp(temporary->filename.data, "temporary.png")); + ufbxt_assert(!strcmp(temporary_video->filename.data, "fake/path/temporary.png")); + ufbxt_assert(!strcmp(inner->filename.data, "../directory/inner.png")); + ufbxt_assert(!strcmp(inner_video->filename.data, "fake/path/directory/inner.png")); +} +#endif + +#if UFBXT_IMPL +static ufbx_load_opts ufbxt_parent_dir_filename_load_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.filename.data = "fake/../path/./file.fbx"; + opts.filename.length = SIZE_MAX; + opts.path_separator = '/'; + return opts; +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT(synthetic_parent_directory_parent, synthetic_parent_directory, ufbxt_parent_dir_filename_load_opts) +#if UFBXT_IMPL +{ + ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "lambert1"); + ufbxt_assert(material); + + ufbx_texture *temporary = material->fbx.diffuse_color.texture; + ufbxt_assert(temporary && temporary->video); + ufbx_video *temporary_video = temporary->video; + + ufbx_texture *inner = material->fbx.transparency_color.texture; + ufbxt_assert(inner && inner->video); + ufbx_video *inner_video = inner->video; + + ufbxt_assert(!strcmp(temporary->filename.data, "fake/../../../temporary.png")); + ufbxt_assert(!strcmp(temporary_video->filename.data, "fake/../temporary.png")); + ufbxt_assert(!strcmp(inner->filename.data, "fake/../../../../directory/inner.png")); + ufbxt_assert(!strcmp(inner_video->filename.data, "fake/../directory/inner.png")); +} +#endif + +UFBXT_TEST(unsafe_options) +#if UFBXT_IMPL +{ + char path[512]; + ufbxt_file_iterator iter = { "maya_cube" }; + while (ufbxt_next_file(&iter, path, sizeof(path))) { + for (uint32_t mask = 0; mask < 0x8; mask++) { + bool allow_unsafe = (mask & 0x1) != 0; + uint32_t unsafe_mask = mask >> 1; + + ufbx_load_opts opts = { 0 }; + opts.allow_unsafe = allow_unsafe; + if ((unsafe_mask & 0x1) != 0) { + opts.index_error_handling = UFBX_INDEX_ERROR_HANDLING_UNSAFE_IGNORE; + } + if ((unsafe_mask & 0x2) != 0) { + opts.unicode_error_handling = UFBX_UNICODE_ERROR_HANDLING_UNSAFE_IGNORE; + } + ufbx_error error; + ufbx_scene *scene = ufbx_load_file(path, &opts, &error); + if (allow_unsafe || unsafe_mask == 0) { + ufbxt_assert(scene); + ufbx_free_scene(scene); + } else { + ufbxt_assert(!scene); + ufbxt_assert(error.type == UFBX_ERROR_UNSAFE_OPTIONS); + } + } + } +} +#endif + +#if UFBXT_IMPL +static ufbx_load_opts ufbxt_underscore_no_index_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.index_error_handling = UFBX_INDEX_ERROR_HANDLING_NO_INDEX; + opts.unicode_error_handling = UFBX_UNICODE_ERROR_HANDLING_UNDERSCORE; + return opts; +} +static ufbx_load_opts ufbxt_all_unsafe_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.allow_unsafe = true; + opts.index_error_handling = UFBX_INDEX_ERROR_HANDLING_UNSAFE_IGNORE; + opts.unicode_error_handling = UFBX_UNICODE_ERROR_HANDLING_UNSAFE_IGNORE; + return opts; +} +static ufbx_load_opts ufbxt_fail_index_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.index_error_handling = UFBX_INDEX_ERROR_HANDLING_ABORT_LOADING; + return opts; +} +static ufbx_load_opts ufbxt_fail_unicode_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.unicode_error_handling = UFBX_UNICODE_ERROR_HANDLING_ABORT_LOADING; + return opts; +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_unsafe_cube, UFBXT_FILE_TEST_FLAG_ALLOW_INVALID_UNICODE) +#if UFBXT_IMPL +{ + ufbxt_check_warning(scene, UFBX_WARNING_INDEX_CLAMPED, 4, NULL); + ufbxt_check_warning(scene, UFBX_WARNING_BAD_UNICODE, 1, NULL); + + ufbx_node *node = ufbx_find_node(scene, "pC" "\xef\xbf\xbd" "\xef\xbf\xbd" "e1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->vertex_uv.indices.data[0] == 0); + ufbxt_assert(mesh->vertex_uv.indices.data[1] == 1); + ufbxt_assert(mesh->vertex_uv.indices.data[2] == 3); + ufbxt_assert(mesh->vertex_uv.indices.data[3] == 13); + ufbxt_assert(mesh->vertex_uv.indices.data[4] == 13); + ufbxt_assert(mesh->vertex_uv.indices.data[5] == 13); + ufbxt_assert(mesh->vertex_uv.indices.data[6] == 13); + ufbxt_assert(mesh->vertex_uv.indices.data[7] == 4); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_unsafe_cube_underscore_no_index, synthetic_unsafe_cube, ufbxt_underscore_no_index_opts, UFBXT_FILE_TEST_FLAG_ALLOW_INVALID_UNICODE) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pC__e1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->vertex_uv.indices.data[0] == 0); + ufbxt_assert(mesh->vertex_uv.indices.data[1] == 1); + ufbxt_assert(mesh->vertex_uv.indices.data[2] == 3); + ufbxt_assert(mesh->vertex_uv.indices.data[3] == UFBX_NO_INDEX); + ufbxt_assert(mesh->vertex_uv.indices.data[4] == UFBX_NO_INDEX); + ufbxt_assert(mesh->vertex_uv.indices.data[5] == UFBX_NO_INDEX); + ufbxt_assert(mesh->vertex_uv.indices.data[6] == UFBX_NO_INDEX); + ufbxt_assert(mesh->vertex_uv.indices.data[7] == 4); + + for (size_t i = 3; i <= 6; i++) { + ufbx_vec2 v = ufbx_get_vertex_vec2(&mesh->vertex_uv, i); + ufbxt_assert_close_vec2(err, v, ufbx_zero_vec2); + } +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_unsafe_cube_unsafe, synthetic_unsafe_cube, ufbxt_all_unsafe_opts, UFBXT_FILE_TEST_FLAG_ALLOW_INVALID_UNICODE) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node_len(scene, "pC" "\xff" "\x00" "e1", 6); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->vertex_uv.indices.data[0] == 0); + ufbxt_assert(mesh->vertex_uv.indices.data[1] == 1); + ufbxt_assert(mesh->vertex_uv.indices.data[2] == 3); + ufbxt_assert(mesh->vertex_uv.indices.data[3] == 0xffu); + ufbxt_assert(mesh->vertex_uv.indices.data[4] == 0xffffu); + ufbxt_assert(mesh->vertex_uv.indices.data[5] == 0xffffffu); + ufbxt_assert(mesh->vertex_uv.indices.data[6] == 0xffffffffu); + ufbxt_assert(mesh->vertex_uv.indices.data[7] == 4); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_unsafe_cube_fail_index, synthetic_unsafe_cube, ufbxt_fail_index_opts, UFBXT_FILE_TEST_FLAG_ALLOW_INVALID_UNICODE | UFBXT_FILE_TEST_FLAG_ALLOW_ERROR) +#if UFBXT_IMPL +{ + ufbxt_assert(!scene); + ufbxt_assert(load_error->type == UFBX_ERROR_BAD_INDEX); +} +#endif + +UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_unsafe_cube_fail_unicode, synthetic_unsafe_cube, ufbxt_fail_unicode_opts, UFBXT_FILE_TEST_FLAG_ALLOW_INVALID_UNICODE | UFBXT_FILE_TEST_FLAG_ALLOW_ERROR) +#if UFBXT_IMPL +{ + ufbxt_assert(!scene); + ufbxt_assert(load_error->type == UFBX_ERROR_INVALID_UTF8); +} +#endif + +UFBXT_FILE_TEST_ALT(find_prop_concat, maya_node_attribute_zoo) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "Null"); + ufbxt_assert(node); + + { + ufbx_string parts[] = { + { "Geometric", 9 }, + { "Rotation", 8 }, + }; + + ufbx_prop *prop = ufbx_find_prop_concat(&node->props, parts, 2); + ufbxt_assert(prop); + ufbxt_assert(!strcmp(prop->name.data, "GeometricRotation")); + } + + { + ufbx_string parts[] = { + { "Geometric", SIZE_MAX }, + { "Translation", SIZE_MAX }, + }; + + ufbx_prop *prop = ufbx_find_prop_concat(&node->props, parts, 2); + ufbxt_assert(prop); + ufbxt_assert(!strcmp(prop->name.data, "GeometricTranslation")); + } + } + + char chars[1024]; + ufbx_string parts[512]; + size_t num_parts = 0; + + for (size_t elem_ix = 0; elem_ix < scene->elements.count; elem_ix++) { + ufbx_element *element = scene->elements.data[elem_ix]; + ufbx_props *props = &element->props; + + while (props) { + for (size_t prop_ix = 0; prop_ix < props->props.count; prop_ix++) { + ufbx_prop *prop = &props->props.data[prop_ix]; + ufbx_string name = prop->name; + ufbxt_assert(name.length * 2 < ufbxt_arraycount(parts)); + + // One single part + num_parts = 0; + parts[num_parts] = name; + num_parts++; + ufbxt_assert(ufbx_find_prop_concat(props, parts, num_parts) == prop); + + // One single part (NULL terminated) + num_parts = 0; + parts[num_parts].data = name.data; + parts[num_parts].length = SIZE_MAX; + num_parts++; + ufbxt_assert(ufbx_find_prop_concat(props, parts, num_parts) == prop); + + // Single characters + num_parts = 0; + for (size_t i = 0; i < name.length; i++) { + parts[num_parts].data = &name.data[i]; + parts[num_parts].length = 1; + num_parts++; + } + ufbxt_assert(ufbx_find_prop_concat(props, parts, num_parts) == prop); + + // Single characters (NULL terminated) + num_parts = 0; + for (size_t i = 0; i < name.length; i++) { + char *part = chars + num_parts*2; + part[0] = name.data[i]; + part[1] = '\0'; + parts[num_parts].data = part; + parts[num_parts].length = SIZE_MAX; + num_parts++; + } + ufbxt_assert(ufbx_find_prop_concat(props, parts, num_parts) == prop); + + // Single characters with empty in between + num_parts = 0; + for (size_t i = 0; i < name.length; i++) { + parts[num_parts].data = &name.data[i]; + parts[num_parts].length = 1; + num_parts++; + parts[num_parts].data = NULL; + parts[num_parts].length = 0; + num_parts++; + } + ufbxt_assert(ufbx_find_prop_concat(props, parts, num_parts) == prop); + + // Even parts + for (size_t step = 1; step < name.length; step++) { + num_parts = 0; + for (size_t i = 0; i < name.length; i += step) { + parts[num_parts].data = name.data + i; + parts[num_parts].length = step; + if (i + step > name.length) { + parts[num_parts].length = SIZE_MAX; + } + num_parts++; + } + ufbxt_assert(ufbx_find_prop_concat(props, parts, num_parts) == prop); + } + + } + + props = props->defaults; + } + } +} +#endif + +UFBXT_FILE_TEST(synthetic_duplicate_id) +#if UFBXT_IMPL +{ + if (scene->metadata.version >= 7000) { + ufbxt_check_warning(scene, UFBX_WARNING_DUPLICATE_OBJECT_ID, 5, NULL); + } else { + ufbxt_check_warning(scene, UFBX_WARNING_DUPLICATE_OBJECT_ID, 3, NULL); + } + + // Don't make any assumptions about the scene, ufbxt_check_scene() makes sure + // that it doesn't break any of the API guarantees. +} +#endif + +UFBXT_FILE_TEST_OPTS(synthetic_recursive_transform, ufbxt_retain_dom_opts) +#if UFBXT_IMPL +{ + ufbx_dom_node *takes = ufbx_dom_find(scene->dom_root, "Takes"); + ufbxt_assert(takes); + ufbx_dom_node *take = ufbx_dom_find(takes, "Take"); + ufbxt_assert(take); + ufbx_dom_node *model = ufbx_dom_find(take, "Model"); + ufbxt_assert(model); + ufbx_dom_node *channel = ufbx_dom_find(model, "Channel"); + ufbxt_assert(channel); + + ufbxt_assert(channel->values.count == 1); + ufbxt_assert(channel->values.data[0].type == UFBX_DOM_VALUE_STRING); + ufbxt_assert(!strcmp(channel->values.data[0].value_str.data, "Transform")); + + ufbx_dom_node *rec_channel = ufbx_dom_find(channel, "Channel"); + ufbxt_assert(rec_channel); + + size_t count = 1; + for (;;) { + ufbxt_hintf("count=%zu", count); + count += 1; + ufbxt_assert(rec_channel->values.count == 1); + ufbxt_assert(rec_channel->values.data[0].type == UFBX_DOM_VALUE_STRING); + ufbxt_assert(!strcmp(rec_channel->values.data[0].value_str.data, "Transform")); + + if (rec_channel->children.count == 0) break; + ufbxt_assert(rec_channel->children.count == 1); + rec_channel = rec_channel->children.data[0]; + } + + ufbxt_assert(count == 29); +} +#endif + +UFBXT_FILE_TEST(synthetic_recursive_connections) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node); + + ufbx_prop *prop = ufbx_find_prop(&node->props, "Lcl Translation"); + ufbxt_assert(prop); + ufbxt_assert((prop->flags & UFBX_PROP_FLAG_CONNECTED) != 0); + + ufbx_vec3 ref = { 1.0f, 0.0f, 0.0f }; + ufbx_prop value = ufbx_evaluate_prop(&scene->anim, &node->element, "Lcl Translation", 0.5); + ufbxt_assert_close_vec3(err, value.value_vec3, ref); + } + + { + ufbx_node *node = ufbx_find_node(scene, "pCube3"); + ufbxt_assert(node); + + ufbx_prop *prop = ufbx_find_prop(&node->props, "Lcl Translation"); + ufbxt_assert(prop); + ufbxt_assert((prop->flags & UFBX_PROP_FLAG_CONNECTED) != 0); + + ufbx_vec3 ref = { 0.0f, 0.0f, 1.0f }; + ufbx_prop value = ufbx_evaluate_prop(&scene->anim, &node->element, "Lcl Translation", 0.5); + ufbxt_assert_close_vec3(err, value.value_vec3, ref); + } +} +#endif + +UFBXT_FILE_TEST(synthetic_rotation_order_layers) +#if UFBXT_IMPL +{ + ufbx_anim_layer *layer_base_layer = ufbx_as_anim_layer(ufbx_find_element(scene, UFBX_ELEMENT_ANIM_LAYER, "BaseLayer")); + ufbx_anim_layer *layer_base = ufbx_as_anim_layer(ufbx_find_element(scene, UFBX_ELEMENT_ANIM_LAYER, "Base")); + ufbx_anim_layer *layer_rotation = ufbx_as_anim_layer(ufbx_find_element(scene, UFBX_ELEMENT_ANIM_LAYER, "Rotation")); + + ufbx_anim_layer_desc layers[] = { + { layer_base_layer, 1.0f }, + { layer_base, 0.5f }, + { layer_rotation, 0.25f }, + }; + + ufbx_anim anim = { 0 }; + anim.layers.data = layers; + anim.layers.count = ufbxt_arraycount(layers); + + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node); + + // We don't really care about the result here as runtime rotation order is not really supported, + // just want to make sure we don't hit any infinite recursion with rotation order layers + (void)ufbx_evaluate_prop(&anim, &node->element, "Lcl Rotation", 0.2f); +} +#endif + +UFBXT_FILE_TEST(maya_notes) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node); + ufbx_prop *notes = ufbx_find_prop(&node->props, "notes"); + ufbxt_assert(notes); + + const char *lines[] = { + "pCube1 notes:\n", + }; + + const char *str = notes->value_str.data; + for (size_t i = 0; i < ufbxt_arraycount(lines); i++) { + ufbxt_hintf("i=%zu", i); + const char *end = strchr(str, '\n'); + if (!end) { + end = str + strlen(str); + } else { + end += 1; + } + + size_t len = (size_t)(end - str); + ufbxt_assert(!strncmp(str, lines[i], len)); + ufbxt_assert(len == strlen(lines[i])); + str = end; + } + + for (size_t i = 0; i < 4096; i++) { + const char *end; + unsigned long l = strtoul(str, &end, 10); + ufbxt_assert(l == i); + if (i + 1 < 16384) { + ufbxt_assert(*end == ' '); + str = end + 1; + } + } + } + + { + ufbx_material *material = ufbx_find_material(scene, "lambert1"); + ufbxt_assert(material); + ufbx_prop *notes = ufbx_find_prop(&material->props, "notes"); + ufbxt_assert(notes); + + const char *lines[] = { + "lambert1 notes:\n", + "\n", + "- material\n", + "- \"lambertian\"\n", + "- unicode: \x61\xc3\x9f???\n", + "- tab\t\n", + "- cr \n", + }; + + const char *str = notes->value_str.data; + for (size_t i = 0; i < ufbxt_arraycount(lines); i++) { + ufbxt_hintf("i=%zu", i); + const char *end = strchr(str, '\n'); + if (!end) { + end = str + strlen(str); + } else { + end += 1; + } + + size_t len = (size_t)(end - str); + ufbxt_assert(!strncmp(str, lines[i], len)); + ufbxt_assert(len == strlen(lines[i])); + str = end; + } + + ufbxt_assert(*str == '\0'); + } +} +#endif + diff --git a/modules/ufbx/test/test_scenes.h b/modules/ufbx/test/test_scenes.h new file mode 100644 index 0000000..f791ed9 --- /dev/null +++ b/modules/ufbx/test/test_scenes.h @@ -0,0 +1,148 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "scenes" + +UFBXT_FILE_TEST_FLAGS(maya_slime, UFBXT_FILE_TEST_FLAG_HEAVY_TO_FUZZ) +#if UFBXT_IMPL +{ + ufbx_node *node_high = ufbx_find_node(scene, "Slime_002:Slime_Body_high"); + ufbxt_assert(node_high); + ufbxt_assert(!node_high->visible); +} +#endif + +UFBXT_FILE_TEST(blender_293_barbarian) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST_ALT(evaluate_alloc_fail, blender_293_barbarian) +#if UFBXT_IMPL +{ + for (size_t max_temp = 1; max_temp < 10000; max_temp++) { + ufbx_evaluate_opts opts = { 0 }; + opts.temp_allocator.huge_threshold = 1; + opts.temp_allocator.allocation_limit = max_temp; + opts.evaluate_skinning = true; + + ufbxt_hintf("Temp limit: %zu", max_temp); + + ufbx_error error; + ufbx_scene *eval_scene = ufbx_evaluate_scene(scene, NULL, 0.2, &opts, &error); + if (eval_scene) { + ufbxt_logf(".. Tested up to %zu temporary allocations", max_temp); + ufbx_free_scene(eval_scene); + break; + } + ufbxt_assert(error.type == UFBX_ERROR_ALLOCATION_LIMIT); + } + + for (size_t max_result = 1; max_result < 10000; max_result++) { + ufbx_evaluate_opts opts = { 0 }; + opts.result_allocator.huge_threshold = 1; + opts.result_allocator.allocation_limit = max_result; + opts.evaluate_skinning = true; + + ufbxt_hintf("Result limit: %zu", max_result); + + ufbx_error error; + ufbx_scene *eval_scene = ufbx_evaluate_scene(scene, NULL, 0.2, &opts, &error); + if (eval_scene) { + ufbxt_logf(".. Tested up to %zu result allocations", max_result); + ufbx_free_scene(eval_scene); + break; + } + ufbxt_assert(error.type == UFBX_ERROR_ALLOCATION_LIMIT); + } +} +#endif + +UFBXT_FILE_TEST(maya_kenney_character) +#if UFBXT_IMPL +{ + ufbxt_check_frame(scene, err, false, "maya_kenney_character_4", NULL, 4.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_kenney_character_9", NULL, 9.0/24.0); + + { + ufbx_node *node = ufbx_find_node(scene, "characterMedium"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->skin_deformers.count == 1); + } + + for (int frame = 3; frame <= 15; frame += 10) { + double time = (double)frame / scene->settings.frames_per_second; + + ufbx_scene *state = ufbx_evaluate_scene(scene, NULL, time, NULL, NULL); + ufbxt_assert(state); + + ufbx_node *node = ufbx_find_node(scene, "characterMedium"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->skin_deformers.count == 1); + + for (size_t level = 0; level <= 2; level++) { + ufbx_mesh *sub_mesh = mesh; + if (level > 0) { + ufbx_subdivide_opts opts = { 0 }; + opts.evaluate_source_vertices = true; + opts.evaluate_skin_weights = true; + sub_mesh = ufbx_subdivide_mesh(mesh, level, &opts, NULL); + ufbxt_assert(sub_mesh); + + ufbxt_check_source_vertices(sub_mesh, mesh, err); + } else { + ufbx_retain_mesh(sub_mesh); + } + + ufbx_skin_deformer *skin = mesh->skin_deformers.data[0]; + + for (size_t vi = 0; vi < sub_mesh->num_vertices; vi++) { + ufbx_vec3 skin_pos = sub_mesh->skinned_position.values.data[vi]; + + if (level == 0) { + ufbx_matrix mat = ufbx_get_skin_vertex_matrix(skin, vi, NULL); + ufbx_vec3 local_pos = sub_mesh->vertices.data[vi]; + ufbx_vec3 world_pos = ufbx_transform_position(&mat, local_pos); + ufbxt_assert_close_vec3(err, world_pos, skin_pos); + + ufbx_skin_vertex skin_vertex = skin->vertices.data[vi]; + ufbx_matrix sum = { 0 }; + for (size_t wi = 0; wi < skin_vertex.num_weights; wi++) { + ufbx_skin_weight weight = skin->weights.data[skin_vertex.weight_begin + wi]; + ufbx_skin_cluster *cluster = skin->clusters.data[weight.cluster_index]; + for (size_t i = 0; i < 12; i++) { + sum.v[i] += cluster->geometry_to_world.v[i] * weight.weight; + } + } + + ufbx_vec3 manual_pos = ufbx_transform_position(&sum, local_pos); + ufbxt_assert_close_vec3(err, manual_pos, skin_pos); + } else { + ufbx_subdivision_result *sub_res = sub_mesh->subdivision_result; + ufbxt_assert(sub_res); + + ufbx_subdivision_weight_range range = sub_res->skin_cluster_ranges.data[vi]; + ufbx_matrix sum = { 0 }; + for (size_t wi = 0; wi < range.num_weights; wi++) { + ufbx_subdivision_weight weight = sub_res->skin_cluster_weights.data[range.weight_begin + wi]; + ufbx_skin_cluster *cluster = skin->clusters.data[weight.index]; + for (size_t i = 0; i < 12; i++) { + sum.v[i] += cluster->geometry_to_world.v[i] * weight.weight; + } + } + + ufbx_vec3 local_pos = sub_mesh->vertices.data[vi]; + ufbx_vec3 manual_pos = ufbx_transform_position(&sum, local_pos); + ufbxt_assert_close_vec3_threshold(err, manual_pos, skin_pos, 10.0f); + manual_pos = manual_pos; + } + } + + ufbx_free_mesh(sub_mesh); + } + + ufbx_free_scene(state); + } +} +#endif diff --git a/modules/ufbx/test/test_skin.h b/modules/ufbx/test/test_skin.h new file mode 100644 index 0000000..ca8b572 --- /dev/null +++ b/modules/ufbx/test/test_skin.h @@ -0,0 +1,519 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "skin" + +#if UFBXT_IMPL +void ufbxt_check_stack_times(ufbx_scene *scene, ufbxt_diff_error *err, const char *stack_name, double begin, double end) +{ + ufbx_anim_stack *stack = (ufbx_anim_stack*)ufbx_find_element(scene, UFBX_ELEMENT_ANIM_STACK, stack_name); + ufbxt_assert(stack); + ufbxt_assert(!strcmp(stack->name.data, stack_name)); + ufbxt_assert_close_real(err, (ufbx_real)stack->time_begin, (ufbx_real)begin); + ufbxt_assert_close_real(err, (ufbx_real)stack->time_end, (ufbx_real)end); +} + +void ufbxt_check_frame(ufbx_scene *scene, ufbxt_diff_error *err, bool check_normals, const char *file_name, const char *anim_name, double time) +{ + char buf[512]; + snprintf(buf, sizeof(buf), "%s%s.obj", data_root, file_name); + + ufbxt_hintf("Frame from '%s' %s time %.2fs", + anim_name ? anim_name : "(implicit animation)", + buf, time); + + size_t obj_size = 0; + void *obj_data = ufbxt_read_file(buf, &obj_size); + ufbxt_obj_file *obj_file = obj_data ? ufbxt_load_obj(obj_data, obj_size, NULL) : NULL; + ufbxt_assert(obj_file); + free(obj_data); + + ufbx_evaluate_opts opts = { 0 }; + opts.evaluate_skinning = true; + opts.evaluate_caches = true; + opts.load_external_files = true; + + ufbx_anim anim = scene->anim; + + if (anim_name) { + for (size_t i = 0; i < scene->anim_stacks.count; i++) { + ufbx_anim_stack *stack = scene->anim_stacks.data[i]; + if (strstr(stack->name.data, anim_name)) { + ufbxt_assert(stack->layers.count > 0); + anim = stack->anim; + break; + } + } + } + + ufbx_scene *eval = ufbx_evaluate_scene(scene, &anim, time, &opts, NULL); + ufbxt_assert(eval); + + ufbxt_check_scene(eval); + + uint32_t diff_flags = 0; + if (check_normals) diff_flags |= UFBXT_OBJ_DIFF_FLAG_CHECK_DEFORMED_NORMALS; + ufbxt_diff_to_obj(eval, obj_file, err, diff_flags); + + ufbx_free_scene(eval); + free(obj_file); +} +#endif + +UFBXT_FILE_TEST(blender_279_sausage) +#if UFBXT_IMPL +{ + if (scene->metadata.ascii) { + // ???: In the 6100 ASCII file Spin Take starts from -1 frames + ufbxt_check_stack_times(scene, err, "Base", 0.0, 1.0/24.0); + ufbxt_check_stack_times(scene, err, "Spin", -1.0/24.0, 18.0/24.0); + ufbxt_check_stack_times(scene, err, "Wiggle", 0.0, 19.0/24.0); + } else { + ufbxt_check_stack_times(scene, err, "Skeleton|Base", 0.0, 1.0/24.0); + ufbxt_check_stack_times(scene, err, "Skeleton|Spin", 0.0, 19.0/24.0); + ufbxt_check_stack_times(scene, err, "Skeleton|Wiggle", 0.0, 19.0/24.0); + } + + const char *cluster_names[][2] = { + { "Bottom", "Cluster Skin Bottom" }, + { "Middle", "Cluster Skin Middle" }, + { "Top", "Cluster Skin Top" }, + }; + const ufbx_matrix cluster_bind_ref[][2] = { + { + { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }, + { 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, + }, + { + { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.9f, 0.0f }, + { 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, 0.0f, -1.9f, 0.0f, 0.0f }, + }, + { + { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, -3.8f, 0.0f }, + { 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, 0.0f, -3.8f, 0.0f, 0.0f }, + }, + }; + + for (size_t i = 0; i < 3; i++) { + ufbx_skin_cluster *cluster = (ufbx_skin_cluster*)ufbx_find_element(scene, UFBX_ELEMENT_SKIN_CLUSTER, cluster_names[i][scene->metadata.ascii]); + ufbxt_assert(cluster); + ufbxt_assert_close_vec3(err, cluster->geometry_to_bone.cols[0], cluster_bind_ref[i][scene->metadata.ascii].cols[0]); + ufbxt_assert_close_vec3(err, cluster->geometry_to_bone.cols[1], cluster_bind_ref[i][scene->metadata.ascii].cols[1]); + ufbxt_assert_close_vec3(err, cluster->geometry_to_bone.cols[2], cluster_bind_ref[i][scene->metadata.ascii].cols[2]); + ufbxt_assert_close_vec3(err, cluster->geometry_to_bone.cols[3], cluster_bind_ref[i][scene->metadata.ascii].cols[3]); + } + + ufbxt_check_frame(scene, err, true, "blender_279_sausage_base_0", "Base", 0.0); + ufbxt_check_frame(scene, err, false, "blender_279_sausage_spin_15", "Spin", 15.0/24.0); + ufbxt_check_frame(scene, err, false, "blender_279_sausage_wiggle_20", "Wiggle", 20.0/24.0); +} +#endif + +UFBXT_FILE_TEST(maya_game_sausage) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST_SUFFIX(maya_game_sausage, wiggle) +#if UFBXT_IMPL +{ + ufbxt_check_frame(scene, err, true, "maya_game_sausage_wiggle_10", NULL, 10.0/24.0); + ufbxt_check_frame(scene, err, true, "maya_game_sausage_wiggle_18", NULL, 18.0/24.0); +} +#endif + +UFBXT_FILE_TEST_SUFFIX(maya_game_sausage, spin) +#if UFBXT_IMPL +{ + ufbxt_check_frame(scene, err, false, "maya_game_sausage_spin_7", NULL, 27.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_game_sausage_spin_15", NULL, 35.0/24.0); +} +#endif + +UFBXT_FILE_TEST_SUFFIX(maya_game_sausage, deform) +#if UFBXT_IMPL +{ + ufbxt_check_frame(scene, err, false, "maya_game_sausage_deform_8", NULL, 48.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_game_sausage_deform_15", NULL, 55.0/24.0); +} +#endif + +UFBXT_FILE_TEST_SUFFIX(maya_game_sausage, combined) +#if UFBXT_IMPL +{ + ufbxt_check_stack_times(scene, err, "wiggle", 1.0/24.0, 20.0/24.0); + ufbxt_check_stack_times(scene, err, "spin", 20.0/24.0, 40.0/24.0); + ufbxt_check_stack_times(scene, err, "deform", 40.0/24.0, 60.0/24.0); + + ufbxt_check_frame(scene, err, true, "maya_game_sausage_wiggle_10", "wiggle", 10.0/24.0); + ufbxt_check_frame(scene, err, true, "maya_game_sausage_wiggle_18", "wiggle", 18.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_game_sausage_spin_7", "spin", 27.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_game_sausage_spin_15", "spin", 35.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_game_sausage_deform_8", "deform", 48.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_game_sausage_deform_15", "deform", 55.0/24.0); +} +#endif + +UFBXT_FILE_TEST(synthetic_sausage_wiggle_no_link) +#if UFBXT_IMPL +{ + ufbxt_check_frame(scene, err, true, "maya_game_sausage_wiggle_10", NULL, 10.0/24.0); + ufbxt_check_frame(scene, err, true, "maya_game_sausage_wiggle_18", NULL, 18.0/24.0); +} +#endif + +UFBXT_FILE_TEST(synthetic_sausage_wiggle_no_bind) +#if UFBXT_IMPL +{ + ufbxt_check_frame(scene, err, true, "maya_game_sausage_wiggle_10", NULL, 10.0/24.0); + ufbxt_check_frame(scene, err, true, "maya_game_sausage_wiggle_18", NULL, 18.0/24.0); +} +#endif + +UFBXT_FILE_TEST(maya_blend_shape_cube) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->blend_deformers.count == 1); + ufbx_blend_deformer *deformer = mesh->blend_deformers.data[0]; + ufbxt_assert(deformer); + + ufbx_blend_channel *top[2] = { NULL, NULL }; + for (size_t i = 0; i < deformer->channels.count; i++) { + ufbx_blend_channel *chan = deformer->channels.data[i]; + if (strstr(chan->name.data, "TopH")) top[0] = chan; + if (strstr(chan->name.data, "TopV")) top[1] = chan; + } + ufbxt_assert(top[0] && top[1]); + + ufbxt_assert_close_real(err, top[0]->weight, 1.0); + ufbxt_assert_close_real(err, top[1]->weight, 1.0); + + double keyframes[][3] = { + { 1.0/24.0, 1.0, 1.0 }, + { 16.0/24.0, 0.279, 0.670 }, + { 53.0/24.0, 0.901, 0.168 }, + { 120.0/24.0, 1.0, 1.0 }, + }; + ufbx_vec3 ref_offsets[2][8] = { + { {0,0,0},{0,0,0},{0.317,0,0},{-0.317,0,0},{0.317,0,0},{-0.317,0,0},{0,0,0},{0,0,0}, }, + { {0,0,0},{0,0,0},{0,0,-0.284},{0,0,-0.284},{0,0,0.284},{0,0,0.284},{0,0,0},{0,0,0}, }, + }; + + for (size_t chan_ix = 0; chan_ix < 2; chan_ix++) { + ufbx_blend_channel *chan = top[chan_ix]; + ufbxt_assert(chan->keyframes.count == 1); + + ufbxt_assert_close_real(err, chan->keyframes.data[0].target_weight, 1.0); + ufbx_blend_shape *shape = chan->keyframes.data[0].shape; + + ufbx_vec3 offsets[8] = { 0 }; + ufbx_add_blend_shape_vertex_offsets(shape, offsets, 8, 1.0f); + for (size_t i = 0; i < 8; i++) { + ufbx_vec3 ref = ref_offsets[chan_ix][i]; + ufbx_vec3 off_a = offsets[i]; + ufbx_vec3 off_b = ufbx_get_blend_shape_vertex_offset(shape, i); + ufbxt_assert_close_vec3(err, ref, off_a); + ufbxt_assert_close_vec3(err, ref, off_b); + } + + for (size_t key_ix = 0; key_ix < ufbxt_arraycount(keyframes); key_ix++) { + double *frame = keyframes[key_ix]; + double time = frame[0]; + ufbx_real ref = (ufbx_real)frame[1 + chan_ix]; + + ufbx_real weight = ufbx_evaluate_blend_weight(&scene->anim, chan, time); + ufbxt_assert_close_real(err, weight, ref); + + ufbx_prop prop = ufbx_evaluate_prop(&scene->anim, &chan->element, "DeformPercent", time); + ufbxt_assert_close_real(err, prop.value_real / 100.0f, ref); + } + } + + { + ufbx_vec3 offsets[8] = { 0 }; + ufbx_add_blend_vertex_offsets(deformer, offsets, 8, 1.0f); + for (size_t i = 0; i < 8; i++) { + ufbx_vec3 ref = ufbxt_add3(ref_offsets[0][i], ref_offsets[1][i]); + ufbxt_assert_close_vec3(err, ref, offsets[i]); + } + } + + for (int eval_skin = 0; eval_skin <= 1; eval_skin++) { + for (size_t key_ix = 0; key_ix < ufbxt_arraycount(keyframes); key_ix++) { + double *frame = keyframes[key_ix]; + double time = frame[0]; + + ufbx_evaluate_opts opts = { 0 }; + + opts.evaluate_skinning = eval_skin != 0; + + ufbx_scene *state = ufbx_evaluate_scene(scene, &scene->anim, time, &opts, NULL); + ufbxt_assert(state); + + ufbx_real weights[2]; + for (size_t chan_ix = 0; chan_ix < 2; chan_ix++) { + ufbx_real ref = (ufbx_real)frame[1 + chan_ix]; + + ufbx_blend_channel *chan = state->blend_channels.data[top[chan_ix]->typed_id]; + ufbxt_assert(chan); + + ufbx_prop prop = ufbx_evaluate_prop(&scene->anim, &chan->element, "DeformPercent", time); + + ufbxt_assert_close_real(err, prop.value_real / 100.0, ref); + ufbxt_assert_close_real(err, chan->weight, ref); + weights[chan_ix] = chan->weight; + } + + if (eval_skin) { + ufbx_blend_deformer *eval_deformer = state->blend_deformers.data[deformer->typed_id]; + ufbx_mesh *eval_mesh = state->meshes.data[mesh->typed_id]; + for (size_t i = 0; i < 8; i++) { + ufbx_vec3 original_pos = eval_mesh->vertex_position.values.data[i]; + ufbx_vec3 skinned_pos = eval_mesh->skinned_position.values.data[i]; + ufbx_vec3 ref = original_pos; + ufbx_vec3 blend_pos = ufbx_get_blend_vertex_offset(eval_deformer, i); + ref = ufbxt_add3(ref, ufbxt_mul3(ref_offsets[0][i], weights[0])); + ref = ufbxt_add3(ref, ufbxt_mul3(ref_offsets[1][i], weights[1])); + blend_pos = ufbxt_add3(original_pos, blend_pos); + ufbxt_assert_close_vec3(err, ref, skinned_pos); + ufbxt_assert_close_vec3(err, ref, blend_pos); + } + } + + ufbxt_check_scene(state); + + ufbx_free_scene(state); + } + } +} +#endif + +UFBXT_FILE_TEST(maya_blend_inbetween) +#if UFBXT_IMPL +{ + ufbxt_check_frame(scene, err, false, "maya_blend_inbetween_1", NULL, 1.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_blend_inbetween_30", NULL, 30.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_blend_inbetween_60", NULL, 60.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_blend_inbetween_65", NULL, 65.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_blend_inbetween_71", NULL, 71.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_blend_inbetween_80", NULL, 80.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_blend_inbetween_89", NULL, 89.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_blend_inbetween_120", NULL, 120.0/24.0); +} +#endif + +UFBXT_FILE_TEST(synthetic_blend_shape_order) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pPlatonic1"); + ufbxt_assert(node); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh); + + static const ufbx_vec3 ref[] = { + { -0.041956f, -0.004164f, -1.064113f }, + { 0.736301f, 0.734684f, -0.451944f }, + { -0.263699f, 1.059604f, -0.451944f }, + { -0.951595f, -0.168521f, -0.372847f }, + { -0.333561f, -1.019172f, -0.372847f }, + { 1.004034f, -0.525731f, -0.447214f }, + { 1.019802f, -0.010427f, 0.466597f }, + { 0.289087f, 1.059604f, 0.442483f }, + { -0.816271f, 0.564766f, 0.459767f }, + { -0.870921f, -0.699814f, 0.400384f }, + { 0.514865f, -0.854815f, 0.383101f }, + { 0.238471f, -0.004164f, 0.935887f }, + }; + + ufbx_blend_shape *shape = (ufbx_blend_shape*)ufbx_find_element(scene, UFBX_ELEMENT_BLEND_SHAPE, "Target"); + ufbxt_assert(shape); + + ufbx_vec3 pos[12]; + memcpy(pos, mesh->vertices.data, sizeof(pos)); + ufbx_add_blend_shape_vertex_offsets(shape, pos, 12, 0.5f); + + for (size_t i = 0; i < mesh->num_vertices; i++) { + ufbx_vec3 vert = mesh->vertices.data[i]; + ufbx_vec3 off = ufbx_get_blend_shape_vertex_offset(shape, i); + ufbx_vec3 res = { vert.x+off.x*0.5f, vert.y+off.y*0.5f, vert.z+off.z*0.5f }; + ufbxt_assert_close_vec3(err, res, ref[i]); + ufbxt_assert_close_vec3(err, pos[i], ref[i]); + } +} +#endif + +UFBXT_FILE_TEST(blender_293_half_skinned) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Plane"); + ufbxt_assert(node); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh); + ufbxt_assert(mesh->num_vertices == 4); + ufbxt_assert(mesh->skin_deformers.count == 1); + ufbx_skin_deformer *skin = mesh->skin_deformers.data[0]; + ufbxt_assert(skin->vertices.count == 4); + ufbxt_assert(skin->vertices.data[0].num_weights == 1); + ufbxt_assert(skin->vertices.data[0].weight_begin == 0); + ufbxt_assert(skin->vertices.data[1].num_weights == 1); + ufbxt_assert(skin->vertices.data[1].weight_begin == 1); + ufbxt_assert(skin->vertices.data[2].num_weights == 0); + ufbxt_assert(skin->vertices.data[3].num_weights == 0); +} +#endif + +UFBXT_FILE_TEST(maya_dual_quaternion) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->skin_deformers.count == 1); + ufbx_skin_deformer *skin = mesh->skin_deformers.data[0]; + ufbxt_assert(skin->skinning_method == UFBX_SKINNING_METHOD_DUAL_QUATERNION); +} +#endif + +UFBXT_FILE_TEST(maya_dual_quaternion_scale) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->skin_deformers.count == 1); + ufbx_skin_deformer *skin = mesh->skin_deformers.data[0]; + ufbxt_assert(skin->skinning_method == UFBX_SKINNING_METHOD_DUAL_QUATERNION); +} +#endif + +UFBXT_FILE_TEST(maya_dq_weights) +#if UFBXT_IMPL +{ + ufbxt_check_frame(scene, err, false, "maya_dq_weights_10", NULL, 10.0/24.0); + ufbxt_check_frame(scene, err, false, "maya_dq_weights_18", NULL, 18.0/24.0); +} +#endif + +UFBXT_FILE_TEST(maya_bone_radius) +#if UFBXT_IMPL +{ + for (size_t i = 1; i < scene->nodes.count; i++) { + ufbx_node *node = scene->nodes.data[i]; + ufbxt_assert(strstr(node->name.data, "joint")); + ufbxt_assert(node->bone); + ufbxt_assert_close_real(err, node->bone->radius, (ufbx_real)i * 0.2f); + ufbxt_assert_close_real(err, node->bone->relative_length, 1.0f); + } +} +#endif + +UFBXT_FILE_TEST(blender_279_bone_radius) +#if UFBXT_IMPL +{ + ufbx_node *armature = ufbx_find_node(scene, "Armature"); + ufbx_node *node = armature; + + for (size_t i = 0; node->children.count > 0; i++) { + node = node->children.data[0]; + + ufbxt_assert(strstr(node->name.data, "Bone")); + ufbxt_assert(node->bone); + + // Blender end bones have some weird scaling factor + // TODO: Add quirks mode for this? + if (strstr(node->name.data, "end")) continue; + + if (scene->metadata.ascii) { + ufbxt_assert_close_real(err, node->bone->radius, 1.0f); + } else { + ufbxt_assert_close_real(err, node->bone->radius, (ufbx_real)(i + 1) * 0.1f); + } + ufbxt_assert_close_real(err, node->bone->relative_length, 1.0f); + } +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_broken_cluster, UFBXT_FILE_TEST_FLAG_ALLOW_STRICT_ERROR) +#if UFBXT_IMPL +{ + ufbx_node *cube = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(cube && cube->mesh); + ufbx_mesh *mesh = cube->mesh; + ufbxt_assert(mesh->skin_deformers.count == 1); + ufbx_skin_deformer *skin = mesh->skin_deformers.data[0]; + ufbxt_assert(skin->clusters.count == 2); + ufbxt_assert(!strcmp(skin->clusters.data[0]->bone_node->name.data, "joint3")); + ufbxt_assert(!strcmp(skin->clusters.data[1]->bone_node->name.data, "joint1")); +} +#endif + +UFBXT_TEST(synthetic_broken_cluster_connect) +#if UFBXT_IMPL +{ + char path[512]; + + ufbxt_file_iterator iter = { "synthetic_broken_cluster" }; + while (ufbxt_next_file(&iter, path, sizeof(path))) { + ufbx_load_opts opts = { 0 }; + opts.connect_broken_elements = true; + ufbx_scene *scene = ufbx_load_file(path, &opts, NULL); + ufbxt_assert(scene); + + ufbx_node *cube = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(cube && cube->mesh); + ufbx_mesh *mesh = cube->mesh; + ufbxt_assert(mesh->skin_deformers.count == 1); + ufbx_skin_deformer *skin = mesh->skin_deformers.data[0]; + ufbxt_assert(skin->clusters.count == 3); + ufbxt_assert(!strcmp(skin->clusters.data[0]->bone_node->name.data, "joint3")); + ufbxt_assert(skin->clusters.data[1]->bone_node == NULL); + ufbxt_assert(!strcmp(skin->clusters.data[2]->bone_node->name.data, "joint1")); + + // HACK: Patch the bone of `clusters.data[1]` to be valid for `ufbxt_check_scene()`... + skin->clusters.data[1]->bone_node = skin->clusters.data[0]->bone_node; + + ufbxt_check_scene(scene); + + ufbx_free_scene(scene); + } +} +#endif + +UFBXT_TEST(synthetic_broken_cluster_safe) +#if UFBXT_IMPL +{ + char path[512]; + + // Same test as above but check that the scene is valid if we don't + // pass `connect_broken_elements`. + ufbxt_file_iterator iter = { "synthetic_broken_cluster" }; + while (ufbxt_next_file(&iter, path, sizeof(path))) { + ufbx_load_opts opts = { 0 }; + ufbx_scene *scene = ufbx_load_file(path, &opts, NULL); + ufbxt_assert(scene); + ufbxt_check_scene(scene); + + ufbx_free_scene(scene); + } +} +#endif + +UFBXT_FILE_TEST(max_transformed_skin) +#if UFBXT_IMPL +{ + ufbxt_check_frame(scene, err, false, "max_transformed_skin_5", NULL, 5.0/30.0); + ufbxt_check_frame(scene, err, false, "max_transformed_skin_15", NULL, 15.0/30.0); +} +#endif + +UFBXT_FILE_TEST(synthetic_bind_to_root) +#if UFBXT_IMPL +{ + ufbxt_check_warning(scene, UFBX_WARNING_BAD_ELEMENT_CONNECTED_TO_ROOT, SIZE_MAX, NULL); + // Some unknown exporter is exporting skin deformers being parented to root + // This test exists to check that it is handled gracefully if quirks are enabled +} +#endif diff --git a/modules/ufbx/test/test_topology.h b/modules/ufbx/test/test_topology.h new file mode 100644 index 0000000..aa1aff5 --- /dev/null +++ b/modules/ufbx/test/test_topology.h @@ -0,0 +1,302 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "topology" + +#if UFBXT_IMPL +void ufbxt_check_generated_normals(ufbx_mesh *mesh, ufbxt_diff_error *err, size_t expected_normals) +{ + ufbx_topo_edge *topo = calloc(mesh->num_indices, sizeof(ufbx_topo_edge)); + ufbxt_assert(topo); + + ufbx_compute_topology(mesh, topo, mesh->num_indices); + + uint32_t *normal_indices = calloc(mesh->num_indices, sizeof(uint32_t)); + size_t num_normals = ufbx_generate_normal_mapping(mesh, topo, mesh->num_indices, normal_indices, mesh->num_indices, false); + + if (expected_normals > 0) { + ufbxt_assert(num_normals == expected_normals); + } + + ufbx_vec3 *normals = calloc(num_normals, sizeof(ufbx_vec3)); + ufbx_compute_normals(mesh, &mesh->vertex_position, normal_indices, mesh->num_indices, normals, num_normals); + + ufbx_vertex_vec3 new_normals = { 0 }; + new_normals.exists = true; + new_normals.values.data = normals; + new_normals.values.count = num_normals; + new_normals.indices.data = normal_indices; + new_normals.indices.count = mesh->num_indices; + + for (size_t i = 0; i < mesh->num_indices; i++) { + ufbx_vec3 fn = ufbx_get_vertex_vec3(&mesh->vertex_normal, i); + ufbx_vec3 rn = ufbx_get_vertex_vec3(&new_normals, i); + + ufbxt_assert_close_vec3(err, fn, rn); + } + + free(normals); + free(normal_indices); + free(topo); +} +#endif + +UFBXT_FILE_TEST(maya_edge_smoothing) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_check_generated_normals(mesh, err, 16); +} +#endif + +UFBXT_FILE_TEST(maya_no_smoothing) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_check_generated_normals(mesh, err, 16); +} +#endif + +UFBXT_FILE_TEST(maya_planar_ngon) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pDisc1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_check_generated_normals(mesh, err, 0); +} +#endif + +UFBXT_FILE_TEST(maya_subsurf_cube) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(maya_subsurf_plane) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(maya_subsurf_cube_crease) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(blender_293_suzanne_subsurf) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST_ALT(subsurf_alloc_fail, maya_subsurf_cube) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + for (size_t max_temp = 1; max_temp < 10000; max_temp++) { + ufbx_subdivide_opts opts = { 0 }; + opts.temp_allocator.huge_threshold = 1; + opts.temp_allocator.allocation_limit = max_temp; + + ufbxt_hintf("Temp limit: %zu", max_temp); + + ufbx_error error; + ufbx_mesh *sub_mesh = ufbx_subdivide_mesh(mesh, 2, &opts, &error); + if (sub_mesh) { + ufbxt_logf(".. Tested up to %zu temporary allocations", max_temp); + ufbx_free_mesh(sub_mesh); + break; + } + ufbxt_assert(error.type == UFBX_ERROR_ALLOCATION_LIMIT); + } + + for (size_t max_result = 1; max_result < 10000; max_result++) { + ufbx_subdivide_opts opts = { 0 }; + opts.result_allocator.huge_threshold = 1; + opts.result_allocator.allocation_limit = max_result; + + ufbxt_hintf("Result limit: %zu", max_result); + + ufbx_error error; + ufbx_mesh *sub_mesh = ufbx_subdivide_mesh(mesh, 2, &opts, &error); + if (sub_mesh) { + ufbxt_logf(".. Tested up to %zu result allocations", max_result); + ufbx_free_mesh(sub_mesh); + break; + } + ufbxt_assert(error.type == UFBX_ERROR_ALLOCATION_LIMIT); + } +} +#endif + +UFBXT_FILE_TEST(blender_293_suzanne_subsurf_uv) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(blender_293x_nonmanifold_subsurf) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(blender_293_ngon_subsurf) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(blender_293x_subsurf_boundary) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(blender_293x_subsurf_max_crease) +#if UFBXT_IMPL +{ + ufbx_mesh *mesh = (ufbx_mesh*)ufbx_find_element(scene, UFBX_ELEMENT_MESH, "Plane"); + ufbx_mesh *subdivided = ufbx_subdivide_mesh(mesh, 1, NULL, NULL); + + for (size_t i = 0; i < mesh->num_edges; i++) { + ufbxt_assert_close_real(err, mesh->edge_crease.data[i], 1.0f); + } + + size_t num_edge = 0; + size_t num_center = 0; + for (size_t i = 0; i < subdivided->num_edges; i++) { + ufbx_edge edge = subdivided->edges.data[i]; + ufbx_vec3 a = ufbx_get_vertex_vec3(&subdivided->vertex_position, edge.a); + ufbx_vec3 b = ufbx_get_vertex_vec3(&subdivided->vertex_position, edge.b); + ufbx_real a_len = a.x*a.x + a.y*a.y + a.z*a.z; + ufbx_real b_len = b.x*b.x + b.y*b.y + b.z*b.z; + + if (a_len < 0.01f || b_len < 0.01f) { + ufbxt_assert_close_real(err, subdivided->edge_crease.data[i], 0.0f); + num_center++; + } else { + ufbxt_assert_close_real(err, subdivided->edge_crease.data[i], 1.0f); + num_edge++; + } + } + + ufbxt_assert(num_edge == 8); + ufbxt_assert(num_center == 4); + + ufbx_free_mesh(subdivided); +} +#endif + +UFBXT_FILE_TEST(maya_subsurf_max_crease) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *subdivided = ufbx_subdivide_mesh(node->mesh, 1, NULL, NULL); + ufbxt_assert(subdivided); + + size_t num_top = 0; + size_t num_bottom = 0; + for (size_t i = 0; i < subdivided->num_edges; i++) { + ufbx_edge edge = subdivided->edges.data[i]; + ufbx_vec3 a = ufbx_get_vertex_vec3(&subdivided->vertex_position, edge.a); + ufbx_vec3 b = ufbx_get_vertex_vec3(&subdivided->vertex_position, edge.b); + ufbx_real a_len = a.x*a.x + a.z*a.z; + ufbx_real b_len = b.x*b.x + b.z*b.z; + + if (a.y < -0.49f && b.y < -0.49f && a_len > 0.01f && b_len > 0.01f) { + ufbxt_assert_close_real(err, subdivided->edge_crease.data[i], 0.8f); + num_bottom++; + } else if (a.y > +0.49f && b.y > +0.49f && a_len > 0.01f && b_len > 0.01f) { + ufbxt_assert_close_real(err, subdivided->edge_crease.data[i], 1.0f); + num_top++; + } else { + ufbxt_assert_close_real(err, subdivided->edge_crease.data[i], 0.0f); + } + a = a; + } + + ufbxt_assert(num_top == 8); + ufbxt_assert(num_bottom == 8); + + ufbx_free_mesh(subdivided); +} +#endif + +UFBXT_FILE_TEST(maya_subsurf_3x_cube) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(maya_subsurf_3x_cube_crease) +#if UFBXT_IMPL +{ +} +#endif + +#if UFBXT_IMPL +typedef struct { + ufbx_vec3 position; + ufbx_vec3 normal; +} ufbxt_vertex_pn; +#endif + +UFBXT_FILE_TEST(blender_293_half_smooth_cube) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Cube"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + ufbxt_assert(mesh->num_indices == 6*4); + ufbxt_assert(mesh->num_triangles == 6*2); + + ufbxt_vertex_pn vertices[36]; + uint32_t indices[36]; + size_t num_indices = 0; + + uint32_t tri[64]; + for (size_t fi = 0; fi < mesh->num_faces; fi++) { + size_t num_tris = ufbx_triangulate_face(tri, 64, mesh, mesh->faces.data[fi]); + for (size_t ti = 0; ti < num_tris * 3; ti++) { + vertices[num_indices].position = ufbx_get_vertex_vec3(&mesh->vertex_position, tri[ti]); + vertices[num_indices].normal = ufbx_get_vertex_vec3(&mesh->vertex_normal, tri[ti]); + num_indices++; + } + } + + ufbx_vertex_stream stream = { vertices, sizeof(ufbxt_vertex_pn) }; + size_t num_vertices = ufbx_generate_indices(&stream, 1, indices, num_indices, NULL, NULL); + ufbxt_assert(num_vertices == 12); + +} +#endif + +UFBXT_FILE_TEST(maya_vertex_crease_single) +#if UFBXT_IMPL +{ +} +#endif + + +UFBXT_FILE_TEST(maya_vertex_crease) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST(blender_312x_vertex_crease) +#if UFBXT_IMPL +{ +} +#endif + + diff --git a/modules/ufbx/test/test_transform.h b/modules/ufbx/test/test_transform.h new file mode 100644 index 0000000..a0ca595 --- /dev/null +++ b/modules/ufbx/test/test_transform.h @@ -0,0 +1,385 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "transform" + +UFBXT_FILE_TEST(maya_pivots) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node); + + ufbx_vec3 origin_ref = { 0.7211236250, 1.8317762500, -0.6038020000 }; + ufbxt_assert_close_vec3(err, node->local_transform.translation, origin_ref); +} +#endif + +#if UFBXT_IMPL +static void ufbxt_check_rotation_order(ufbx_scene *scene, const char *name, ufbx_rotation_order order) +{ + ufbx_node *node = ufbx_find_node(scene, name); + ufbxt_assert(node); + ufbx_prop *prop = ufbx_find_prop(&node->props, "RotationOrder"); + ufbxt_assert(prop); + ufbxt_assert((ufbx_rotation_order)prop->value_int == order); +} +#endif + +UFBXT_FILE_TEST(maya_rotation_order) +#if UFBXT_IMPL +{ + ufbxt_check_rotation_order(scene, "XYZ", UFBX_ROTATION_ORDER_XYZ); + ufbxt_check_rotation_order(scene, "XZY", UFBX_ROTATION_ORDER_XZY); + ufbxt_check_rotation_order(scene, "YZX", UFBX_ROTATION_ORDER_YZX); + ufbxt_check_rotation_order(scene, "YXZ", UFBX_ROTATION_ORDER_YXZ); + ufbxt_check_rotation_order(scene, "ZXY", UFBX_ROTATION_ORDER_ZXY); + ufbxt_check_rotation_order(scene, "ZYX", UFBX_ROTATION_ORDER_ZYX); +} +#endif + +UFBXT_FILE_TEST(maya_post_rotate_order) +#if UFBXT_IMPL +{ + ufbxt_check_rotation_order(scene, "pCube1", UFBX_ROTATION_ORDER_XYZ); + ufbxt_check_rotation_order(scene, "pCube2", UFBX_ROTATION_ORDER_ZYX); +} +#endif + +UFBXT_FILE_TEST(synthetic_pre_post_rotate) +#if UFBXT_IMPL +{ + ufbxt_check_rotation_order(scene, "pCube1", UFBX_ROTATION_ORDER_XYZ); + ufbxt_check_rotation_order(scene, "pCube2", UFBX_ROTATION_ORDER_ZYX); +} +#endif + +UFBXT_FILE_TEST(maya_parented_cubes) +#if UFBXT_IMPL +{ +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_geometric_squish, UFBXT_FILE_TEST_FLAG_OPT_HANDLING_IGNORE_NORMALS_IN_DIFF) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pSphere1"); + ufbxt_assert(node); + ufbxt_assert_close_real(err, node->geometry_transform.scale.y, 0.01f); +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_geometric_transform, UFBXT_FILE_TEST_FLAG_OPT_HANDLING_IGNORE_NORMALS_IN_DIFF) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Parent"); + ufbxt_assert(node); + ufbx_vec3 euler = ufbx_quat_to_euler(node->geometry_transform.rotation, UFBX_ROTATION_ORDER_XYZ); + ufbxt_assert_close_real(err, node->geometry_transform.translation.x, -0.5f); + ufbxt_assert_close_real(err, node->geometry_transform.translation.y, -1.0f); + ufbxt_assert_close_real(err, node->geometry_transform.translation.z, -1.5f); + ufbxt_assert_close_real(err, euler.x, 20.0f); + ufbxt_assert_close_real(err, euler.y, 40.0f); + ufbxt_assert_close_real(err, euler.z, 60.0f); + ufbxt_assert_close_real(err, node->geometry_transform.scale.x, 2.0f); + ufbxt_assert_close_real(err, node->geometry_transform.scale.y, 3.0f); + ufbxt_assert_close_real(err, node->geometry_transform.scale.z, 4.0f); +} +#endif + +UFBXT_FILE_TEST(maya_cube_hidden) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCube1"); + ufbxt_assert(node); + ufbxt_assert(!node->visible); +} +#endif + +UFBXT_TEST(root_transform) +#if UFBXT_IMPL +{ + + ufbxt_diff_error err = { 0 }; + + char path[512]; + ufbxt_file_iterator iter = { "maya_cube" }; + while (ufbxt_next_file(&iter, path, sizeof(path))) { + ufbx_load_opts opts = { 0 }; + + ufbx_vec3 euler = { { 90.0f, 0.0f, 0.0f } }; + + opts.use_root_transform = true; + opts.root_transform.translation.x = -1.0f; + opts.root_transform.translation.y = -2.0f; + opts.root_transform.translation.z = -3.0f; + opts.root_transform.rotation = ufbx_euler_to_quat(euler, UFBX_ROTATION_ORDER_XYZ); + opts.root_transform.scale.x = 2.0f; + opts.root_transform.scale.y = 3.0f; + opts.root_transform.scale.z = 4.0f; + + ufbx_scene *scene = ufbx_load_file(path, &opts, NULL); + ufbxt_assert(scene); + + ufbxt_check_scene(scene); + + ufbxt_assert_close_vec3(&err, scene->root_node->local_transform.translation, opts.root_transform.translation); + ufbxt_assert_close_quat(&err, scene->root_node->local_transform.rotation, opts.root_transform.rotation); + ufbxt_assert_close_vec3(&err, scene->root_node->local_transform.scale, opts.root_transform.scale); + + ufbx_transform eval = ufbx_evaluate_transform(&scene->anim, scene->root_node, 0.1); + ufbxt_assert_close_vec3(&err, eval.translation, opts.root_transform.translation); + ufbxt_assert_close_quat(&err, eval.rotation, opts.root_transform.rotation); + ufbxt_assert_close_vec3(&err, eval.scale, opts.root_transform.scale); + + ufbx_scene *state = ufbx_evaluate_scene(scene, &scene->anim, 0.1, NULL, NULL); + ufbxt_assert(state); + + ufbxt_assert_close_vec3(&err, state->root_node->local_transform.translation, opts.root_transform.translation); + ufbxt_assert_close_quat(&err, state->root_node->local_transform.rotation, opts.root_transform.rotation); + ufbxt_assert_close_vec3(&err, state->root_node->local_transform.scale, opts.root_transform.scale); + + ufbx_free_scene(state); + ufbx_free_scene(scene); + } + + ufbxt_assert(iter.num_found >= 8); + + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", err.sum / (ufbx_real)err.num, err.max, err.num); +} +#endif + +UFBXT_TEST(blender_axes) +#if UFBXT_IMPL +{ + char path[512], name[512]; + + static const char *axis_names[] = { + "px", "nx", "py", "ny", "pz", "nz", + }; + + for (uint32_t fwd_ix = 0; fwd_ix < 6; fwd_ix++) { + for (uint32_t up_ix = 0; up_ix < 6; up_ix++) { + + // Don't allow collinear axes + if ((fwd_ix >> 1) == (up_ix >> 1)) continue; + + ufbx_coordinate_axis axis_fwd = (ufbx_coordinate_axis)fwd_ix; + ufbx_coordinate_axis axis_up = (ufbx_coordinate_axis)up_ix; + + snprintf(name, sizeof(name), "blender_axes/axes_%s%s", axis_names[fwd_ix], axis_names[up_ix]); + + ufbxt_file_iterator iter = { name }; + while (ufbxt_next_file(&iter, path, sizeof(path))) { + ufbxt_diff_error err = { 0 }; + + // Load normally and check axes + { + ufbx_scene *scene = ufbx_load_file(path, NULL, NULL); + ufbxt_assert(scene); + ufbxt_check_scene(scene); + + ufbx_coordinate_axis axis_front = axis_fwd ^ 1; + + ufbxt_assert(scene->settings.axes.front == axis_front); + ufbxt_assert(scene->settings.axes.up == axis_up); + + ufbx_free_scene(scene); + } + + // Axis conversion + for (int mode = 0; mode < 4; mode++) { + ufbxt_hintf("mode = %d", mode); + ufbx_load_opts opts = { 0 }; + + bool transform_root = (mode % 2) != 0; + bool use_adjust = (mode / 2) != 0; + + opts.target_axes = ufbx_axes_right_handed_z_up; + opts.target_unit_meters = 1.0f; + + if (transform_root) { + opts.use_root_transform = true; + opts.root_transform = ufbx_identity_transform; + opts.root_transform.translation.z = 1.0f; + } + + if (use_adjust) { + opts.space_conversion = UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS; + } else { + opts.space_conversion = UFBX_SPACE_CONVERSION_TRANSFORM_ROOT; + } + + ufbx_scene *scene = ufbx_load_file(path, &opts, NULL); + ufbxt_assert(scene); + ufbxt_check_scene(scene); + + ufbx_node *plane = ufbx_find_node(scene, "Plane"); + ufbxt_assert(plane && plane->mesh); + ufbx_mesh *mesh = plane->mesh; + + ufbxt_assert(mesh->num_faces == 1); + ufbx_face face = mesh->faces.data[0]; + ufbxt_assert(face.num_indices == 3); + + if (use_adjust && !transform_root) { + ufbx_node *root = scene->root_node; + + ufbx_vec3 identity_scale = { 1.0f, 1.0f, 1.0f }; + ufbxt_assert_close_quat(&err, root->local_transform.rotation, ufbx_identity_quat); + ufbxt_assert_close_vec3(&err, root->local_transform.scale, identity_scale); + } + + for (uint32_t i = 0; i < face.num_indices; i++) { + ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + i); + ufbx_vec2 uv = ufbx_get_vertex_vec2(&mesh->vertex_uv, face.index_begin + i); + + pos = ufbx_transform_position(&plane->geometry_to_world, pos); + + ufbx_vec3 ref; + if (uv.x < 0.5f && uv.y < 0.5f) { + ref.x = 1.0f; + ref.y = 1.0f; + ref.z = 3.0f; + } else if (uv.x > 0.5f && uv.y < 0.5f) { + ref.x = 2.0f; + ref.y = 2.0f; + ref.z = 3.0f; + } else if (uv.x < 0.5f && uv.y > 0.5f) { + ref.x = 1.0f; + ref.y = 2.0f; + ref.z = 4.0f; + } else { + ufbxt_assert(0 && "Shouldn't exist"); + } + + if (transform_root) { + ref.z += 1.0f; + } + + ufbxt_assert_close_vec3(&err, pos, ref); + } + + ufbx_free_scene(scene); + } + + ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", err.sum / (ufbx_real)err.num, err.max, err.num); + } + } + } +} +#endif + +#if UFBXT_IMPL +static ufbx_load_opts ufbxt_scale_to_cm_opts() +{ + ufbx_load_opts opts = { 0 }; + opts.target_unit_meters = 0.01f; + return opts; +} +#endif + +UFBXT_FILE_TEST_OPTS(maya_scale_no_inherit, ufbxt_scale_to_cm_opts) +#if UFBXT_IMPL +{ + { + ufbx_node *node = ufbx_find_node(scene, "joint1"); + ufbxt_assert(node); + ufbxt_assert(node->inherit_type == UFBX_INHERIT_NORMAL); + ufbxt_assert_close_real(err, node->local_transform.scale.x, 0.02f); + ufbxt_assert_close_real(err, node->local_transform.scale.y, 0.03f); + ufbxt_assert_close_real(err, node->local_transform.scale.z, 0.04f); + ufbxt_assert_close_real(err, node->world_transform.scale.x, 2.0f); + ufbxt_assert_close_real(err, node->world_transform.scale.y, 3.0f); + ufbxt_assert_close_real(err, node->world_transform.scale.z, 4.0f); + } + + { + ufbx_node *node = ufbx_find_node(scene, "joint2"); + ufbxt_assert(node); + ufbxt_assert(node->inherit_type == UFBX_INHERIT_NO_SCALE); + ufbxt_assert_close_real(err, node->local_transform.scale.x, 100.0f); + ufbxt_assert_close_real(err, node->local_transform.scale.y, 100.0f); + ufbxt_assert_close_real(err, node->local_transform.scale.z, 100.0f); + ufbxt_assert_close_real(err, node->world_transform.scale.x, 100.0f); + ufbxt_assert_close_real(err, node->world_transform.scale.y, 100.0f); + ufbxt_assert_close_real(err, node->world_transform.scale.z, 100.0f); + } + + { + ufbx_node *node = ufbx_find_node(scene, "joint3"); + ufbxt_assert(node); + ufbxt_assert(node->inherit_type == UFBX_INHERIT_NO_SCALE); + ufbxt_assert_close_real(err, node->local_transform.scale.x, 1.0f); + ufbxt_assert_close_real(err, node->local_transform.scale.y, 1.0f); + ufbxt_assert_close_real(err, node->local_transform.scale.z, 1.0f); + ufbxt_assert_close_real(err, node->world_transform.scale.x, 1.0f); + ufbxt_assert_close_real(err, node->world_transform.scale.y, 1.0f); + ufbxt_assert_close_real(err, node->world_transform.scale.z, 1.0f); + } + + { + ufbx_node *node = ufbx_find_node(scene, "joint4"); + ufbxt_assert(node); + ufbxt_assert(node->inherit_type == UFBX_INHERIT_NO_SCALE); + ufbxt_assert_close_real(err, node->local_transform.scale.x, 1.5f); + ufbxt_assert_close_real(err, node->local_transform.scale.y, 2.5f); + ufbxt_assert_close_real(err, node->local_transform.scale.z, 3.5f); + ufbxt_assert_close_real(err, node->world_transform.scale.x, 1.5f); + ufbxt_assert_close_real(err, node->world_transform.scale.y, 2.5f); + ufbxt_assert_close_real(err, node->world_transform.scale.z, 3.5f); + } + + { + ufbx_node *node = ufbx_find_node(scene, "joint3"); + + { + ufbx_transform transform = ufbx_evaluate_transform(&scene->anim, node, 1.0); + ufbxt_assert_close_real(err, transform.scale.x, 0.3f); + ufbxt_assert_close_real(err, transform.scale.y, 0.6f); + ufbxt_assert_close_real(err, transform.scale.z, 0.9f); + } + + { + ufbx_transform transform = ufbx_evaluate_transform(&scene->anim, node, 0.5); + ufbxt_assert_close_real(err, transform.scale.x, 0.67281f); + ufbxt_assert_close_real(err, transform.scale.y, 0.81304f); + ufbxt_assert_close_real(err, transform.scale.z, 0.95326f); + } + } +} +#endif + +UFBXT_FILE_TEST(synthetic_node_dag) +#if UFBXT_IMPL +{ + ufbx_node *root = scene->root_node; + ufbx_node *a = ufbx_find_node(scene, "A"); + ufbx_node *b = ufbx_find_node(scene, "B"); + ufbx_node *c = ufbx_find_node(scene, "C"); + ufbx_node *d = ufbx_find_node(scene, "D"); + + ufbxt_assert(root && a && b && c && d); + ufbxt_assert(root->children.count == 1); + ufbxt_assert(root->children.data[0] == a); + + ufbxt_assert(a->parent == root); + ufbxt_assert(a->children.count == 1); + ufbxt_assert(a->children.data[0] == b); + + ufbxt_assert(b->parent == a); + ufbxt_assert(b->children.count == 1); + ufbxt_assert(b->children.data[0] == c); + + ufbxt_assert(c->parent == b); + ufbxt_assert(c->children.count == 1); + ufbxt_assert(c->children.data[0] == d); + + ufbxt_assert(d->parent == c); + ufbxt_assert(d->children.count == 0); +} +#endif + +UFBXT_FILE_TEST_FLAGS(synthetic_node_cycle_fail, UFBXT_FILE_TEST_FLAG_ALLOW_ERROR) +#if UFBXT_IMPL +{ + ufbxt_assert(!scene); +} +#endif diff --git a/modules/ufbx/test/test_triangulate.h b/modules/ufbx/test/test_triangulate.h new file mode 100644 index 0000000..90b5a5a --- /dev/null +++ b/modules/ufbx/test/test_triangulate.h @@ -0,0 +1,263 @@ +#undef UFBXT_TEST_GROUP +#define UFBXT_TEST_GROUP "triangulate" + +#if UFBXT_IMPL +size_t do_triangulate_test(ufbx_scene *scene) +{ + size_t num_fail = 0; + + for (size_t mesh_ix = 0; mesh_ix < scene->meshes.count; mesh_ix++) { + ufbx_mesh *mesh = scene->meshes.data[mesh_ix]; + ufbxt_assert(mesh->instances.count == 1); + bool should_be_top_left = mesh->instances.data[0]->name.data[0] == 'A'; + ufbxt_assert(mesh->num_faces == 1); + ufbx_face face = mesh->faces.data[0]; + ufbxt_assert(face.index_begin == 0); + ufbxt_assert(face.num_indices == 4); + uint32_t tris[6]; + bool ok = ufbx_triangulate_face(tris, 6, mesh, face); + ufbxt_assert(ok); + + size_t top_left_ix = 0; + ufbx_real best_dot = HUGE_VALF; + for (size_t ix = 0; ix < 4; ix++) { + ufbx_vec3 v = ufbx_get_vertex_vec3(&mesh->vertex_position, ix); + ufbx_real dot = v.x + v.z; + if (dot < best_dot) { + top_left_ix = ix; + best_dot = dot; + } + } + + uint32_t top_left_count = 0; + for (size_t i = 0; i < 6; i++) { + if (tris[i] == top_left_ix) top_left_count++; + } + + if (should_be_top_left != (top_left_count == 2)) { + ufbxt_logf("Fail: %s", mesh->instances.data[0]->name.data); + num_fail++; + } + } + + ufbxt_logf("Triangulations OK: %zu/%zu", scene->meshes.count - num_fail, scene->meshes.count); + return num_fail; +} +#endif + +UFBXT_FILE_TEST(maya_triangulate) +#if UFBXT_IMPL +{ + size_t num_fail = do_triangulate_test(scene); + ufbxt_assert(num_fail <= 4); +} +#endif + +UFBXT_FILE_TEST(maya_triangulate_down) +#if UFBXT_IMPL +{ + size_t num_fail = do_triangulate_test(scene); + ufbxt_assert(num_fail <= 1); +} +#endif + +UFBXT_FILE_TEST(maya_tri_cone) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "pCone1"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + for (size_t i = 0; i < mesh->num_faces; i++) { + ufbx_face face = mesh->faces.data[i]; + ufbxt_assert(face.num_indices >= 3 && face.num_indices <= 32); + + uint32_t tris[32]; + + size_t num_tris = face.num_indices - 2; + for (size_t i = 0; i < 32; i++) { + ufbx_panic panic; + panic.did_panic = false; + size_t num_tris_returned = ufbx_catch_triangulate_face(&panic, tris, i, mesh, face); + if (i >= num_tris * 3) { + ufbxt_assert(!panic.did_panic); + ufbxt_assert(num_tris_returned == num_tris); + } else { + ufbxt_assert(panic.did_panic); + ufbxt_assert(num_tris_returned == 0); + } + } + + ufbxt_assert(ufbx_triangulate_face(tris, ufbxt_arraycount(tris), mesh, face)); + } +} +#endif + +#if UFBXT_IMPL + +static void ufbxt_ngon_write_obj(const char *path, ufbx_mesh *mesh, const uint32_t *indices, size_t num_triangles) +{ + FILE *f = fopen(path, "w"); + + for (size_t i = 0; i < mesh->num_vertices; i++) { + ufbx_vec3 v = mesh->vertices.data[i]; + fprintf(f, "v %f %f %f\n", v.x, v.y, v.z); + } + + fprintf(f, "\n"); + for (size_t i = 0; i < num_triangles; i++) { + const uint32_t *tri = indices + i * 3; + fprintf(f, "f %u %u %u\n", + mesh->vertex_indices.data[tri[0]] + 1, + mesh->vertex_indices.data[tri[1]] + 1, + mesh->vertex_indices.data[tri[2]] + 1); + } + + fclose(f); +} + +static ufbx_vec2 ufbxt_ngon_3d_to_2d(const ufbx_vec3 basis[2], ufbx_vec3 pos) +{ + ufbx_vec2 uv; + uv.x = ufbxt_dot3(basis[0], pos); + uv.y = ufbxt_dot3(basis[1], pos); + return uv; +} + +static void ufbxt_check_ngon_triangulation(ufbxt_diff_error *err, ufbx_mesh *mesh, ufbx_face face, uint32_t *indices, size_t num_triangles, const ufbx_vec3 basis[2]) +{ + // Check that the area matches for now + // TODO: More rigorous tests + + ufbx_real poly_area = 0.0f; + for (size_t i = 0; i < face.num_indices; i++) { + ufbx_vec2 a = ufbxt_ngon_3d_to_2d(basis, ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + i + 0)); + ufbx_vec2 b = ufbxt_ngon_3d_to_2d(basis, ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + (i + 1) % face.num_indices)); + poly_area += 0.5f * (a.x*b.y - a.y*b.x); + } + + ufbx_real tri_area = 0.0f; + for (size_t i = 0; i < num_triangles; i++) { + ufbx_vec2 a = ufbxt_ngon_3d_to_2d(basis, ufbx_get_vertex_vec3(&mesh->vertex_position, indices[i*3 + 0])); + ufbx_vec2 b = ufbxt_ngon_3d_to_2d(basis, ufbx_get_vertex_vec3(&mesh->vertex_position, indices[i*3 + 1])); + ufbx_vec2 c = ufbxt_ngon_3d_to_2d(basis, ufbx_get_vertex_vec3(&mesh->vertex_position, indices[i*3 + 2])); + ufbx_real area = 0.5f * (a.x*(b.y-c.y) + b.x*(c.y-a.y) + c.x*(a.y-b.y)); + ufbxt_assert(area >= -0.01f); + tri_area += area; + } + + ufbxt_assert_close_real(err, poly_area, tri_area); +} + +#endif + +UFBXT_FILE_TEST(blender_300_ngon_intersection) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Plane"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 1); + ufbx_face face = mesh->faces.data[0]; + + uint32_t indices[3*3]; + size_t num_tris = ufbx_triangulate_face(indices, ufbxt_arraycount(indices), mesh, face); + ufbxt_assert(num_tris == 3); + + const ufbx_vec3 basis[2] = { + { { 1.0f, 0.0f, 0.0f } }, + { { 0.0f, 1.0f, 0.0f } }, + }; + ufbxt_check_ngon_triangulation(err, mesh, face, indices, num_tris, basis); +} +#endif + +UFBXT_FILE_TEST(blender_300_ngon_e) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Plane"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 1); + ufbx_face face = mesh->faces.data[0]; + + uint32_t indices[10*3]; + size_t num_tris = ufbx_triangulate_face(indices, ufbxt_arraycount(indices), mesh, face); + ufbxt_assert(num_tris == 10); + + const ufbx_vec3 basis[2] = { + { { 1.0f, 0.0f, 0.0f } }, + { { 0.0f, 1.0f, 0.0f } }, + }; + ufbxt_check_ngon_triangulation(err, mesh, face, indices, num_tris, basis); +} +#endif + +UFBXT_FILE_TEST(blender_300_ngon_abstract) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Plane"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 1); + ufbx_face face = mesh->faces.data[0]; + + uint32_t indices[144*3]; + size_t num_tris = ufbx_triangulate_face(indices, ufbxt_arraycount(indices), mesh, face); + ufbxt_assert(num_tris == 144); + + const ufbx_vec3 basis[2] = { + { { 1.0f, 0.0f, 0.0f } }, + { { 0.0f, 1.0f, 0.0f } }, + }; + ufbxt_check_ngon_triangulation(err, mesh, face, indices, num_tris, basis); +} +#endif + +UFBXT_FILE_TEST(blender_300_ngon_big) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Plane"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + ufbxt_assert(mesh->num_faces == 1); + ufbx_face face = mesh->faces.data[0]; + + uint32_t expected_tris = 8028; + uint32_t *indices = malloc(expected_tris * 3 * sizeof(uint32_t)); + ufbxt_assert(indices); + + size_t num_tris = ufbx_triangulate_face(indices, expected_tris * 3, mesh, face); + ufbxt_assert(num_tris == expected_tris); + + const ufbx_vec3 basis[2] = { + { { 1.0f, 0.0f, 0.0f } }, + { { 0.0f, 1.0f, 0.0f } }, + }; + ufbxt_check_ngon_triangulation(err, mesh, face, indices, num_tris, basis); + + free(indices); +} +#endif + +UFBXT_FILE_TEST(blender_300_ngon_irregular) +#if UFBXT_IMPL +{ + ufbx_node *node = ufbx_find_node(scene, "Plane"); + ufbxt_assert(node && node->mesh); + ufbx_mesh *mesh = node->mesh; + + uint32_t indices[256]; + + for (size_t i = 0; i < mesh->num_faces; i++) { + ufbx_face face = mesh->faces.data[i]; + + size_t num_tris = ufbx_triangulate_face(indices, ufbxt_arraycount(indices), mesh, face); + ufbxt_assert(num_tris == face.num_indices - 2); + } +} +#endif diff --git a/modules/ufbx/test/testing_basics.h b/modules/ufbx/test/testing_basics.h new file mode 100644 index 0000000..e846c52 --- /dev/null +++ b/modules/ufbx/test/testing_basics.h @@ -0,0 +1,14 @@ +#ifndef UFBXT_TESTING_BASICS_INCLUDED +#define UFBXT_TESTING_BASICS_INCLUDED + +#define ufbxt_arraycount(arr) (sizeof(arr) / sizeof(*(arr))) + +#if defined(_MSC_VER) + #define ufbxt_noinline __declspec(noinline) +#elif defined(__clang__) || defined(__GNUC__) + #define ufbxt_noinline __attribute__((noinline)) +#else + #define ufbxt_noinline +#endif + +#endif diff --git a/modules/ufbx/test/testing_utils.h b/modules/ufbx/test/testing_utils.h new file mode 100644 index 0000000..fddcc1b --- /dev/null +++ b/modules/ufbx/test/testing_utils.h @@ -0,0 +1,1521 @@ +#ifndef UFBXT_TESTING_UTILS_INCLUDED +#define UFBXT_TESTING_UTILS_INCLUDED + +#include +#include +#include +#include +#include + +#include "testing_basics.h" + +#ifndef ufbxt_soft_assert +#define ufbxt_soft_assert(cond) ufbxt_assert(cond) +#endif + +// -- Vector helpers + +static ufbx_real ufbxt_dot2(ufbx_vec2 a, ufbx_vec2 b) +{ + return a.x*b.x + a.y*b.y; +} + +static ufbx_real ufbxt_dot3(ufbx_vec3 a, ufbx_vec3 b) +{ + return a.x*b.x + a.y*b.y + a.z*b.z; +} + +static ufbx_real ufbxt_length2(ufbx_vec2 a) +{ + return (ufbx_real)sqrt(ufbxt_dot2(a, a)); +} + +static ufbx_real ufbxt_length3(ufbx_vec3 a) +{ + return (ufbx_real)sqrt(ufbxt_dot3(a, a)); +} + +static ufbx_vec2 ufbxt_add2(ufbx_vec2 a, ufbx_vec2 b) +{ + ufbx_vec2 v; + v.x = a.x + b.x; + v.y = a.y + b.y; + return v; +} + +static ufbx_vec3 ufbxt_add3(ufbx_vec3 a, ufbx_vec3 b) +{ + ufbx_vec3 v; + v.x = a.x + b.x; + v.y = a.y + b.y; + v.z = a.z + b.z; + return v; +} + +static ufbx_vec2 ufbxt_sub2(ufbx_vec2 a, ufbx_vec2 b) +{ + ufbx_vec2 v; + v.x = a.x - b.x; + v.y = a.y - b.y; + return v; +} + +static ufbx_vec3 ufbxt_sub3(ufbx_vec3 a, ufbx_vec3 b) +{ + ufbx_vec3 v; + v.x = a.x - b.x; + v.y = a.y - b.y; + v.z = a.z - b.z; + return v; +} + +static ufbx_vec2 ufbxt_mul2(ufbx_vec2 a, ufbx_real b) +{ + ufbx_vec2 v; + v.x = a.x * b; + v.y = a.y * b; + return v; +} + +static ufbx_vec3 ufbxt_mul3(ufbx_vec3 a, ufbx_real b) +{ + ufbx_vec3 v; + v.x = a.x * b; + v.y = a.y * b; + v.z = a.z * b; + return v; +} + +static ufbx_vec3 ufbxt_cross3(ufbx_vec3 a, ufbx_vec3 b) +{ + ufbx_vec3 v = { a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x }; + return v; +} + +static ufbx_vec3 ufbxt_normalize(ufbx_vec3 a) { + ufbx_real len = (ufbx_real)sqrt(ufbxt_dot3(a, a)); + if (len != 0.0) { + return ufbxt_mul3(a, (ufbx_real)1.0 / len); + } else { + ufbx_vec3 zero = { (ufbx_real)0 }; + return zero; + } +} + +static ufbx_real ufbxt_min(ufbx_real a, ufbx_real b) { return a < b ? a : b; } +static ufbx_real ufbxt_max(ufbx_real a, ufbx_real b) { return a < b ? b : a; } +static ufbx_real ufbxt_clamp(ufbx_real v, ufbx_real min_v, ufbx_real max_v) { return ufbxt_min(ufbxt_max(v, min_v), max_v); } + + +// -- obj load and diff + +typedef struct { + const char **groups; + const char *original_group; + size_t num_groups; + + size_t num_faces; + size_t num_indices; + + ufbx_face *faces; + + ufbx_vertex_vec3 vertex_position; + ufbx_vertex_vec3 vertex_normal; + ufbx_vertex_vec2 vertex_uv; + +} ufbxt_obj_mesh; + +typedef enum { + UFBXT_OBJ_EXPORTER_UNKNOWN, + UFBXT_OBJ_EXPORTER_BLENDER, +} ufbxt_obj_exporter; + +typedef struct { + + ufbxt_obj_mesh *meshes; + size_t num_meshes; + + bool bad_normals; + bool bad_order; + bool bad_uvs; + bool bad_faces; + bool line_faces; + bool point_faces; + bool no_subdivision; + bool root_groups_at_bone; + bool remove_namespaces; + bool match_by_order; + ufbx_real tolerance; + int32_t animation_frame; + + bool normalize_units; + bool ignore_duplicates; + + ufbxt_obj_exporter exporter; + + double position_scale; + + char animation_name[128]; + +} ufbxt_obj_file; + +typedef struct { + + const char *name_end_chars; + +} ufbxt_load_obj_opts; + +static int ufbxt_cmp_obj_mesh(const void *va, const void *vb) +{ + const ufbxt_obj_mesh *a = (const ufbxt_obj_mesh*)va, *b = (const ufbxt_obj_mesh*)vb; + if (a->num_groups < b->num_groups) return -1; + if (a->num_groups > b->num_groups) return +1; + return 0; +} + +static uint16_t ufbxt_read_u16(const void *ptr) { + const char *p = (const char*)ptr; + return (uint16_t)( + (unsigned)(uint8_t)p[0] << 0u | + (unsigned)(uint8_t)p[1] << 8u ); +} + +static uint32_t ufbxt_read_u32(const void *ptr) { + const char *p = (const char*)ptr; + return (uint32_t)( + (unsigned)(uint8_t)p[0] << 0u | + (unsigned)(uint8_t)p[1] << 8u | + (unsigned)(uint8_t)p[2] << 16u | + (unsigned)(uint8_t)p[3] << 24u ); +} + +static ufbxt_noinline void *ufbxt_decompress_gzip(const void *gz_data, size_t gz_size, size_t *p_size) +{ + const uint8_t *gz = (const uint8_t*)gz_data; + if (gz_size < 10) return NULL; + if (gz[0] != 0x1f || gz[1] != 0x8b || gz[2] != 0x08) return NULL; + uint8_t flags = gz[3]; + + size_t offset = 10; + + if (flags & 0x4) { + // FEXTRA + if (gz_size - offset < 2) return NULL; + uint16_t xlen = ufbxt_read_u16(gz + offset); + offset += 2; + if (gz_size - offset < xlen) return NULL; + offset += xlen; + } + + if (flags & 0x8) { + // FNAME + const uint8_t *end = (const uint8_t*)memchr(gz + offset, 0, gz_size - offset); + if (!end) return NULL; + offset = (size_t)(end - gz) + 1; + } + + if (flags & 0x10) { + // FCOMMENT + const uint8_t *end = (const uint8_t*)memchr(gz + offset, 0, gz_size - offset); + if (!end) return NULL; + offset = (size_t)(end - gz) + 1; + } + + if (flags & 0x2) { + // FHCRC + if (gz_size - offset < 2) return NULL; + offset += 2; + } + + uint32_t isize = ufbxt_read_u32(gz + gz_size - 4); + + void *dst = malloc(isize + 1); + if (!dst) return NULL; + + ufbx_inflate_retain retain; + retain.initialized = false; + + ufbx_inflate_input input = { 0 }; + + input.data = gz + offset; + input.data_size = gz_size - offset; + + input.total_size = input.data_size; + + input.no_header = true; + input.no_checksum = true; + + ptrdiff_t result = ufbx_inflate(dst, isize, &input, &retain); + if (result != isize) { + free(dst); + return NULL; + } + + ((char*)dst)[isize] = '\0'; + + *p_size = isize; + return dst; +} + +#define UFBXT_MAX_PARSED_INT +#define UFBXT_MAX_EXPONENT 325 + +static double ufbxt_pow10_table[UFBXT_MAX_EXPONENT*2 + 1]; +static volatile bool ufbxt_parsing_init_done = false; + +static void ufbxt_init_parsing() +{ + if (ufbxt_parsing_init_done) return; + + for (int32_t i = 0; i <= UFBXT_MAX_EXPONENT*2; i++) { + ufbxt_pow10_table[i] = pow(10.0, (double)(i - UFBXT_MAX_EXPONENT)); + } + + ufbxt_parsing_init_done = true; +} + +static size_t ufbxt_parse_ints(int32_t *p_result, size_t max_count, const char **str) +{ + const char *c = *str; + + size_t num; + for (num = 0; num < max_count; num++) { + if (*c == '/') { + c++; + p_result[num] = 0; + continue; + } + + int32_t sign = 1; + if (*c == '+') { + c++; + } else if (*c == '-') { + sign = -1; + c++; + } + + if (!(*c >= '0' && *c <= '9')) return num; + + const uint32_t max_value = UINT64_C(100000000); + uint32_t value = 0; + + do { + if (value < max_value) { + value = value * 10 + (uint64_t)(*c++ - '0'); + } else { + return num; + } + } while (*c >= '0' && *c <= '9'); + + p_result[num] = (int32_t)value * sign; + + if (*c != '/') return num; + c++; + } + + *str = c; + return num; +} + +static bool ufbxt_parse_reals(ufbx_real *p_result, size_t count, const char *str) +{ + const char *c = str; + + for (size_t i = 0; i < count; i++) { + // Skip separator + while (*c == ' ') c++; + + const uint64_t max_value = UINT64_C(1000000000000000000); + uint64_t value = 0; + + double sign = 1.0; + if (*c == '-') { + sign = -1.0; + c++; + } else if (*c == '+') { + c++; + } + + int32_t exponent = 0; + + if (!(*c >= '0' && *c <= '9')) return false; + + do { + if (value < max_value) { + value = value * 10 + (uint64_t)(*c - '0'); + } else { + exponent--; + } + c++; + } while (*c >= '0' && *c <= '9'); + + if (*c == '.') { + c++; + + while (*c >= '0' && *c <= '9') { + if (value < max_value) { + value = value * 10 + (uint64_t)(*c - '0'); + exponent--; + } + c++; + } + + if ((*c | 0x20) == 'e') { + c++; + int32_t expsign = 1; + if (*c == '+') { + c++; + } else if (*c == '-') { + expsign = -1; + c++; + } + + int32_t exp = 0; + while (*c >= '0' && *c <= '9') { + if (exp < 4096) { + exp = exp * 10 + (int32_t)(*c - '0'); + } + c++; + } + + exponent += expsign * exp; + } + } + + if (exponent >= -UFBXT_MAX_EXPONENT && exponent <= UFBXT_MAX_EXPONENT) { + p_result[i] = (ufbx_real)(sign * ufbxt_pow10_table[exponent + UFBXT_MAX_EXPONENT] * (double)value); + } else if (exponent < 0) { + p_result[i] = 0.0f; + } else { + p_result[i] = (ufbx_real)INFINITY; + } + } + + return true; +} + +static char *ufbxt_find_newline(char *src) +{ + for (;;) { + char c = *src; + if (c == '\0') return NULL; + if (c == '\r' || c == '\n') return src; + src++; + } +} + +static bool ufbxt_is_space(char c) +{ + return c == ' ' || c == '\t' || c == '\r' || c == '\n'; +} + +static ufbxt_noinline ufbxt_obj_file *ufbxt_load_obj(void *obj_data, size_t obj_size, const ufbxt_load_obj_opts *opts) +{ + ufbxt_load_obj_opts zero_opts; + if (!opts) { + memset(&zero_opts, 0, sizeof(zero_opts)); + opts = &zero_opts; + } + + ufbxt_init_parsing(); + + size_t num_positions = 0; + size_t num_normals = 0; + size_t num_uvs = 0; + size_t num_faces = 0; + size_t num_meshes = 0; + size_t num_indices = 0; + size_t num_groups = 0; + size_t total_name_length = 0; + + bool merge_groups = false; + + char *line = (char*)obj_data; + for (;;) { + char *end = ufbxt_find_newline(line); + char prev = '\0'; + if (end) { + prev = *end; + *end = '\0'; + } + + if (!strncmp(line, "v ", 2)) num_positions++; + else if (!strncmp(line, "vt ", 3)) num_uvs++; + else if (!strncmp(line, "vn ", 3)) num_normals++; + else if (!strncmp(line, "f ", 2)) { + num_faces++; + bool prev_space = false; + for (char *c = line; *c; c++) { + bool space = *c == ' ' || *c == '\t'; + if (space && !prev_space) num_indices++; + prev_space = space; + } + } + else if (!strncmp(line, "g default", 7)) { /* ignore default group */ } + else if ((!strncmp(line, "g ", 2) && !merge_groups) || !strncmp(line, "o ", 2)) { + bool prev_space = false; + num_groups++; + for (char *c = line; *c; c++) { + bool space = *c == ' ' || *c == '\t'; + if (space && !prev_space) num_groups++; + if (!space) total_name_length++; + total_name_length++; + prev_space = space; + } + total_name_length++; + num_meshes++; + } else if (strstr(line, "ufbx:merge_groups")) { + merge_groups = true; + } + + if (end) { + *end = prev; + line = end + 1; + } else { + break; + } + } + + bool implicit_mesh = false; + if (num_meshes == 0) { + num_meshes = 1; + implicit_mesh = true; + } + + total_name_length += num_groups; + + size_t alloc_size = 0; + alloc_size += sizeof(ufbxt_obj_file); + alloc_size += num_meshes * sizeof(ufbxt_obj_mesh); + alloc_size += num_groups * sizeof(const char*); + alloc_size += num_positions * sizeof(ufbx_vec3); + alloc_size += num_normals * sizeof(ufbx_vec3); + alloc_size += num_uvs * sizeof(ufbx_vec2); + alloc_size += num_faces * sizeof(ufbx_face); + alloc_size += num_indices * 3 * sizeof(int32_t); + alloc_size += total_name_length * sizeof(char); + + void *data = malloc(alloc_size); + ufbxt_assert(data); + + ufbxt_obj_file *obj = (ufbxt_obj_file*)data; + const char **group_ptrs = (const char**)(obj + 1); + ufbxt_obj_mesh *meshes = (ufbxt_obj_mesh*)(group_ptrs + num_groups); + ufbx_vec3 *positions = (ufbx_vec3*)(meshes + num_meshes); + ufbx_vec3 *normals = (ufbx_vec3*)(positions + num_positions); + ufbx_vec2 *uvs = (ufbx_vec2*)(normals + num_normals); + ufbx_face *faces = (ufbx_face*)(uvs + num_uvs); + int32_t *position_indices = (int32_t*)(faces + num_faces); + int32_t *normal_indices = (int32_t*)(position_indices + num_indices); + int32_t *uv_indices = (int32_t*)(normal_indices + num_indices); + char *name_data = (char*)(uv_indices + num_indices); + void *data_end = name_data + total_name_length; + ufbxt_assert((char*)data_end - (char*)data == alloc_size); + + memset(obj, 0, sizeof(ufbxt_obj_file)); + + ufbx_vec3 *dp = positions; + ufbx_vec3 *dn = normals; + ufbx_vec2 *du = uvs; + ufbxt_obj_mesh *mesh = NULL; + + int32_t *dpi = position_indices; + int32_t *dni = normal_indices; + int32_t *dui = uv_indices; + + ufbx_face *df = faces; + + obj->meshes = meshes; + obj->num_meshes = num_meshes; + obj->tolerance = 0.001f; + obj->normalize_units = false; + obj->animation_frame = -1; + obj->exporter = UFBXT_OBJ_EXPORTER_UNKNOWN; + obj->position_scale = 1.0; + + if (implicit_mesh) { + mesh = meshes; + memset(mesh, 0, sizeof(ufbxt_obj_mesh)); + + mesh->faces = df; + mesh->vertex_position.values.data = positions; + mesh->vertex_normal.values.data = normals; + mesh->vertex_uv.values.data = uvs; + mesh->vertex_position.indices.data = (uint32_t*)dpi; + mesh->vertex_normal.indices.data = (uint32_t*)dni; + mesh->vertex_uv.indices.data = (uint32_t*)dui; + } + + line = (char*)obj_data; + for (;;) { + char *line_end = ufbxt_find_newline(line); + char prev = '\0'; + if (line_end) { + prev = *line_end; + *line_end = '\0'; + } + + if (!strncmp(line, "v ", 2)) { + line += 2; + ufbxt_assert(ufbxt_parse_reals(dp->v, 3, line)); + dp++; + } else if (!strncmp(line, "vt ", 3)) { + line += 3; + ufbxt_assert(ufbxt_parse_reals(du->v, 2, line)); + du++; + } else if (!strncmp(line, "vn ", 3)) { + line += 3; + ufbxt_assert(ufbxt_parse_reals(dn->v, 3, line)); + dn++; + } else if (!strncmp(line, "f ", 2)) { + ufbxt_assert(mesh); + + df->index_begin = (uint32_t)mesh->num_indices; + df->num_indices = 0; + + char *begin = line + 2; + do { + char *end = strchr(begin, ' '); + if (end) *end++ = '\0'; + + while (ufbxt_is_space(*begin)) { + begin++; + } + if (*begin == '\0') { + begin = end; + continue; + } + + int32_t indices[3] = { 0, 0, 0 }; + ufbxt_parse_ints(indices, 3, (const char**)&begin); + + mesh->vertex_position.indices.count++; + mesh->vertex_normal.indices.count++; + mesh->vertex_uv.indices.count++; + + mesh->vertex_position.values.count = (size_t)(dp - positions); + mesh->vertex_normal.values.count = (size_t)(dn - normals); + mesh->vertex_uv.values.count = (size_t)(du - uvs); + + *dpi++ = indices[0] - 1; + *dni++ = indices[2] - 1; + *dui++ = indices[1] - 1; + mesh->num_indices++; + df->num_indices++; + + begin = end; + } while (begin); + + mesh->num_faces++; + df++; + } else if (!strncmp(line, "g default", 7)) { + /* ignore default group */ + } else if ((!strncmp(line, "g ", 2) && !merge_groups) || !strncmp(line, "o ", 2)) { + mesh = mesh ? mesh + 1 : meshes; + memset(mesh, 0, sizeof(ufbxt_obj_mesh)); + + size_t groups_len = strlen(line + 2); + memcpy(name_data, line + 2, groups_len + 1); + mesh->original_group = name_data; + name_data += groups_len + 1; + + mesh->groups = group_ptrs; + + const char *c = line + 2; + for (;;) { + while (*c == ' ' || *c == '\t' || *c == '\r') { + c++; + } + + if (*c == '\n' || *c == '\0') break; + + const char *group_begin = c; + char *group_copy = name_data; + char *dst = group_copy; + + while (*c != ' ' && *c != '\t' && *c != '\r' && *c != '\n' && *c != '\0') { + if (!strncmp(c, "FBXASC", 6)) { + c += 6; + char num[4] = { 0 }; + if (*c != '\0') num[0] = *c++; + if (*c != '\0') num[1] = *c++; + if (*c != '\0') num[2] = *c++; + *dst++ = (char)atoi(num); + } else { + *dst++ = *c++; + } + } + *dst++ = '\0'; + name_data = dst; + + *group_ptrs++ = group_copy; + } + + mesh->num_groups = group_ptrs - mesh->groups; + + mesh->faces = df; + mesh->vertex_position.values.data = positions; + mesh->vertex_normal.values.data = normals; + mesh->vertex_uv.values.data = uvs; + mesh->vertex_position.indices.data = (uint32_t*)dpi; + mesh->vertex_normal.indices.data = (uint32_t*)dni; + mesh->vertex_uv.indices.data = (uint32_t*)dui; + } + + if (line[0] == '#') { + line += 1; + char *end = line_end; + while (line < end && (line[0] == ' ' || line[0] == '\t')) { + line++; + } + while (end > line && (end[-1] == ' ' || end[-1] == '\t')) { + *--end = '\0'; + } + if (!strcmp(line, "ufbx:bad_normals")) { + obj->bad_normals = true; + } + if (!strcmp(line, "ufbx:bad_order")) { + obj->bad_order = true; + } + if (!strcmp(line, "ufbx:bad_uvs")) { + obj->bad_uvs = true; + } + if (!strcmp(line, "ufbx:bad_faces")) { + obj->bad_faces = true; + } + if (!strcmp(line, "ufbx:line_faces")) { + obj->line_faces = true; + } + if (!strcmp(line, "ufbx:point_faces")) { + obj->point_faces = true; + } + if (!strcmp(line, "ufbx:no_subdivision")) { + obj->no_subdivision = true; + } + if (!strcmp(line, "ufbx:ignore_duplicates")) { + obj->ignore_duplicates = true; + } + if (!strcmp(line, "ufbx:root_groups_at_bone")) { + obj->root_groups_at_bone = true; + } + if (!strcmp(line, "ufbx:remove_namespaces")) { + obj->remove_namespaces = true; + } + if (!strcmp(line, "ufbx:match_by_order")) { + obj->match_by_order = true; + } + if (!strcmp(line, "www.blender.org")) { + obj->exporter = UFBXT_OBJ_EXPORTER_BLENDER; + } + if (!strncmp(line, "ufbx:animation=", 15)) { + line += 15; + size_t len = strcspn(line, "\r\n"); + ufbxt_assert(len + 1 < sizeof(obj->animation_name)); + memcpy(obj->animation_name, line, len); + } + double tolerance = 0.0; + if (sscanf(line, "ufbx:tolerance=%lf", &tolerance) == 1) { + obj->tolerance = (ufbx_real)tolerance; + } + double position_scale = 0.0; + if (sscanf(line, "ufbx:position_scale=%lf", &position_scale) == 1) { + obj->position_scale = (ufbx_real)position_scale; + } + int frame = 0; + if (sscanf(line, "ufbx:frame=%d", &frame) == 1) { + obj->animation_frame = (int32_t)frame; + } + } + + if (line_end) { + *line_end = prev; + line = line_end + 1; + } else { + break; + } + } + + qsort(obj->meshes, obj->num_meshes, sizeof(ufbxt_obj_mesh), ufbxt_cmp_obj_mesh); + + return obj; +} + +static ufbxt_noinline void ufbxt_debug_dump_obj_mesh(const char *file, ufbx_node *node, ufbx_mesh *mesh) +{ + FILE *f = fopen(file, "wb"); + ufbxt_assert(f); + + fprintf(f, "s 1\n"); + + for (size_t i = 0; i < mesh->vertex_position.values.count; i++) { + ufbx_vec3 v = mesh->vertex_position.values.data[i]; + v = ufbx_transform_position(&node->geometry_to_world, v); + fprintf(f, "v %f %f %f\n", v.x, v.y, v.z); + } + for (size_t i = 0; i < mesh->vertex_uv.values.count; i++) { + ufbx_vec2 v = mesh->vertex_uv.values.data[i]; + fprintf(f, "vt %f %f\n", v.x, v.y); + } + + ufbx_matrix mat = ufbx_matrix_for_normals(&node->geometry_to_world); + for (size_t i = 0; i < mesh->vertex_normal.values.count; i++) { + ufbx_vec3 v = mesh->vertex_normal.values.data[i]; + v = ufbx_transform_direction(&mat, v); + fprintf(f, "vn %f %f %f\n", v.x, v.y, v.z); + } + + + for (size_t fi = 0; fi < mesh->num_faces; fi++) { + ufbx_face face = mesh->faces.data[fi]; + fprintf(f, "f"); + for (size_t ci = 0; ci < face.num_indices; ci++) { + int32_t vi = mesh->vertex_position.indices.data[face.index_begin + ci]; + int32_t ti = mesh->vertex_uv.indices.data[face.index_begin + ci]; + int32_t ni = mesh->vertex_normal.indices.data[face.index_begin + ci]; + fprintf(f, " %d/%d/%d", vi + 1, ti + 1, ni + 1); + } + fprintf(f, "\n"); + } + + fclose(f); +} + +static ufbxt_noinline void ufbxt_debug_dump_obj_scene(const char *file, ufbx_scene *scene) +{ + FILE *f = fopen(file, "wb"); + ufbxt_assert(f); + + for (size_t mi = 0; mi < scene->meshes.count; mi++) { + ufbx_mesh *mesh = scene->meshes.data[mi]; + for (size_t ni = 0; ni < mesh->instances.count; ni++) { + ufbx_node *node = mesh->instances.data[ni]; + + for (size_t i = 0; i < mesh->vertex_position.values.count; i++) { + ufbx_vec3 v = mesh->skinned_position.values.data[i]; + if (mesh->skinned_is_local) { + v = ufbx_transform_position(&node->geometry_to_world, v); + } + fprintf(f, "v %f %f %f\n", v.x, v.y, v.z); + } + + for (size_t i = 0; i < mesh->vertex_uv.values.count; i++) { + ufbx_vec2 v = mesh->vertex_uv.values.data[i]; + fprintf(f, "vt %f %f\n", v.x, v.y); + } + + ufbx_matrix mat = ufbx_matrix_for_normals(&node->geometry_to_world); + for (size_t i = 0; i < mesh->skinned_normal.values.count; i++) { + ufbx_vec3 v = mesh->skinned_normal.values.data[i]; + if (mesh->skinned_is_local) { + v = ufbx_transform_direction(&mat, v); + } + fprintf(f, "vn %f %f %f\n", v.x, v.y, v.z); + } + + fprintf(f, "\n"); + } + } + + int32_t v_off = 0, t_off = 0, n_off = 0; + for (size_t mi = 0; mi < scene->meshes.count; mi++) { + ufbx_mesh *mesh = scene->meshes.data[mi]; + for (size_t ni = 0; ni < mesh->instances.count; ni++) { + ufbx_node *node = mesh->instances.data[ni]; + fprintf(f, "g %s\n", node->name.data); + + for (size_t fi = 0; fi < mesh->num_faces; fi++) { + ufbx_face face = mesh->faces.data[fi]; + fprintf(f, "f"); + for (size_t ci = 0; ci < face.num_indices; ci++) { + int32_t vi = v_off + mesh->skinned_position.indices.data[face.index_begin + ci]; + int32_t ni = n_off + mesh->skinned_normal.indices.data[face.index_begin + ci]; + if (mesh->vertex_uv.exists) { + int32_t ti = t_off + mesh->vertex_uv.indices.data[face.index_begin + ci]; + fprintf(f, " %d/%d/%d", vi + 1, ti + 1, ni + 1); + } else { + fprintf(f, " %d//%d", vi + 1, ni + 1); + } + } + fprintf(f, "\n"); + } + + fprintf(f, "\n"); + + v_off += (int32_t)mesh->skinned_position.values.count; + t_off += (int32_t)mesh->vertex_uv.values.count; + n_off += (int32_t)mesh->skinned_normal.values.count; + } + } + + fclose(f); +} + +typedef struct { + size_t num; + ufbx_real sum; + ufbx_real max; +} ufbxt_diff_error; + +static void ufbxt_assert_close_real(ufbxt_diff_error *p_err, ufbx_real a, ufbx_real b) +{ + ufbx_real err = fabs(a - b); + ufbxt_soft_assert(err < 0.001); + p_err->num++; + p_err->sum += err; + if (err > p_err->max) p_err->max = err; +} + +static void ufbxt_assert_close_vec2(ufbxt_diff_error *p_err, ufbx_vec2 a, ufbx_vec2 b) +{ + ufbxt_assert_close_real(p_err, a.x, b.x); + ufbxt_assert_close_real(p_err, a.y, b.y); +} + +static void ufbxt_assert_close_vec3(ufbxt_diff_error *p_err, ufbx_vec3 a, ufbx_vec3 b) +{ + ufbxt_assert_close_real(p_err, a.x, b.x); + ufbxt_assert_close_real(p_err, a.y, b.y); + ufbxt_assert_close_real(p_err, a.z, b.z); +} + +static void ufbxt_assert_close_vec4(ufbxt_diff_error *p_err, ufbx_vec4 a, ufbx_vec4 b) +{ + ufbxt_assert_close_real(p_err, a.x, b.x); + ufbxt_assert_close_real(p_err, a.y, b.y); + ufbxt_assert_close_real(p_err, a.z, b.z); + ufbxt_assert_close_real(p_err, a.w, b.w); +} + +static void ufbxt_assert_close_quat(ufbxt_diff_error *p_err, ufbx_quat a, ufbx_quat b) +{ + ufbxt_assert_close_real(p_err, a.x, b.x); + ufbxt_assert_close_real(p_err, a.y, b.y); + ufbxt_assert_close_real(p_err, a.z, b.z); + ufbxt_assert_close_real(p_err, a.w, b.w); +} + +static void ufbxt_assert_close_matrix(ufbxt_diff_error *p_err, ufbx_matrix a, ufbx_matrix b) +{ + ufbxt_assert_close_vec3(p_err, a.cols[0], b.cols[0]); + ufbxt_assert_close_vec3(p_err, a.cols[1], b.cols[1]); + ufbxt_assert_close_vec3(p_err, a.cols[2], b.cols[2]); + ufbxt_assert_close_vec3(p_err, a.cols[3], b.cols[3]); +} + +static void ufbxt_assert_close_real_threshold(ufbxt_diff_error *p_err, ufbx_real a, ufbx_real b, ufbx_real threshold) +{ + ufbx_real err = fabs(a - b); + ufbxt_assert(err < threshold); + p_err->num++; + p_err->sum += err; + if (err > p_err->max) p_err->max = err; +} + +static void ufbxt_assert_close_vec2_threshold(ufbxt_diff_error *p_err, ufbx_vec2 a, ufbx_vec2 b, ufbx_real threshold) +{ + ufbxt_assert_close_real_threshold(p_err, a.x, b.x, threshold); + ufbxt_assert_close_real_threshold(p_err, a.y, b.y, threshold); +} + +static void ufbxt_assert_close_vec3_threshold(ufbxt_diff_error *p_err, ufbx_vec3 a, ufbx_vec3 b, ufbx_real threshold) +{ + ufbxt_assert_close_real_threshold(p_err, a.x, b.x, threshold); + ufbxt_assert_close_real_threshold(p_err, a.y, b.y, threshold); + ufbxt_assert_close_real_threshold(p_err, a.z, b.z, threshold); +} + +static void ufbxt_assert_close_vec4_threshold(ufbxt_diff_error *p_err, ufbx_vec4 a, ufbx_vec4 b, ufbx_real threshold) +{ + ufbxt_assert_close_real_threshold(p_err, a.x, b.x, threshold); + ufbxt_assert_close_real_threshold(p_err, a.y, b.y, threshold); + ufbxt_assert_close_real_threshold(p_err, a.z, b.z, threshold); + ufbxt_assert_close_real_threshold(p_err, a.w, b.w, threshold); +} + +static void ufbxt_assert_close_quat_threshold(ufbxt_diff_error *p_err, ufbx_quat a, ufbx_quat b, ufbx_real threshold) +{ + ufbxt_assert_close_real_threshold(p_err, a.x, b.x, threshold); + ufbxt_assert_close_real_threshold(p_err, a.y, b.y, threshold); + ufbxt_assert_close_real_threshold(p_err, a.z, b.z, threshold); + ufbxt_assert_close_real_threshold(p_err, a.w, b.w, threshold); +} + +static ufbxt_noinline void ufbxt_check_source_vertices(ufbx_mesh *mesh, ufbx_mesh *src_mesh, ufbxt_diff_error *p_err) +{ + ufbx_subdivision_result *sub = mesh->subdivision_result; + ufbxt_assert(sub); + + size_t num_vertices = mesh->num_vertices; + ufbxt_assert(sub->source_vertex_ranges.count == num_vertices); + for (size_t vi = 0; vi < num_vertices; vi++) { + ufbx_subdivision_weight_range range = sub->source_vertex_ranges.data[vi]; + + ufbx_vec3 sum = ufbx_zero_vec3; + for (size_t i = 0; i < range.num_weights; i++) { + ufbx_subdivision_weight weight = sub->source_vertex_weights.data[range.weight_begin + i]; + ufbx_vec3 v = src_mesh->vertices.data[weight.index]; + sum.x += v.x * weight.weight; + sum.y += v.y * weight.weight; + sum.z += v.z * weight.weight; + } + + ufbx_vec3 ref = mesh->vertices.data[vi]; + ufbxt_assert_close_vec3(p_err, ref, sum); + ref = ref; + } +} + +typedef struct { + ufbx_vec3 pos; + ufbx_vec3 normal; + ufbx_vec2 uv; +} ufbxt_match_vertex; + +static int ufbxt_cmp_sub_vertex(const void *va, const void *vb) +{ + const ufbxt_match_vertex *a = (const ufbxt_match_vertex*)va, *b = (const ufbxt_match_vertex*)vb; + if (a->pos.x != b->pos.x) return a->pos.x < b->pos.x ? -1 : +1; + if (a->pos.y != b->pos.y) return a->pos.y < b->pos.y ? -1 : +1; + if (a->pos.z != b->pos.z) return a->pos.z < b->pos.z ? -1 : +1; + if (a->normal.x != b->normal.x) return a->normal.x < b->normal.x ? -1 : +1; + if (a->normal.y != b->normal.y) return a->normal.y < b->normal.y ? -1 : +1; + if (a->normal.z != b->normal.z) return a->normal.z < b->normal.z ? -1 : +1; + if (a->uv.x != b->uv.x) return a->uv.x < b->uv.x ? -1 : +1; + if (a->uv.y != b->uv.y) return a->uv.y < b->uv.y ? -1 : +1; + return 0; +} + +static ufbxt_noinline void ufbxt_match_obj_mesh(ufbxt_obj_file *obj, ufbx_node *fbx_node, ufbx_mesh *fbx_mesh, ufbxt_obj_mesh *obj_mesh, ufbxt_diff_error *p_err, double scale) +{ + ufbx_real tolerance = obj->tolerance; + + ufbxt_assert(fbx_mesh->num_faces == obj_mesh->num_faces); + ufbxt_assert(fbx_mesh->num_indices == obj_mesh->num_indices); + + // Check that all vertices exist, anything more doesn't really make sense + ufbxt_match_vertex *obj_verts = (ufbxt_match_vertex*)calloc(obj_mesh->num_indices, sizeof(ufbxt_match_vertex)); + ufbxt_match_vertex *fbx_verts = (ufbxt_match_vertex*)calloc(fbx_mesh->num_indices, sizeof(ufbxt_match_vertex)); + ufbxt_assert(obj_verts && fbx_verts); + + ufbx_matrix norm_mat = ufbx_get_compatible_matrix_for_normals(fbx_node); + + for (size_t i = 0; i < obj_mesh->num_indices; i++) { + obj_verts[i].pos = ufbx_get_vertex_vec3(&obj_mesh->vertex_position, i); + obj_verts[i].normal = ufbx_get_vertex_vec3(&obj_mesh->vertex_normal, i); + if (obj_mesh->vertex_uv.exists) { + obj_verts[i].uv = ufbx_get_vertex_vec2(&obj_mesh->vertex_uv, i); + } + + if (scale != 1.0) { + obj_verts[i].pos.x *= scale; + obj_verts[i].pos.y *= scale; + obj_verts[i].pos.x *= scale; + } + } + for (size_t i = 0; i < fbx_mesh->num_indices; i++) { + ufbx_vec3 fp = ufbx_get_vertex_vec3(&fbx_mesh->skinned_position, i); + ufbx_vec3 fn = fbx_mesh->skinned_normal.exists ? ufbx_get_vertex_vec3(&fbx_mesh->skinned_normal, i) : ufbx_zero_vec3; + if (fbx_mesh->skinned_is_local) { + fp = ufbx_transform_position(&fbx_node->geometry_to_world, fp); + fn = ufbx_transform_direction(&norm_mat, fn); + fn = ufbxt_normalize(fn); + } + fbx_verts[i].pos = fp; + fbx_verts[i].normal = fn; + if (obj_mesh->vertex_uv.exists) { + ufbxt_assert(fbx_mesh->vertex_uv.exists); + fbx_verts[i].uv = ufbx_get_vertex_vec2(&fbx_mesh->vertex_uv, i); + } + + if (scale != 1.0) { + fbx_verts[i].pos.x *= scale; + fbx_verts[i].pos.y *= scale; + fbx_verts[i].pos.x *= scale; + } + } + + qsort(obj_verts, obj_mesh->num_indices, sizeof(ufbxt_match_vertex), &ufbxt_cmp_sub_vertex); + qsort(fbx_verts, fbx_mesh->num_indices, sizeof(ufbxt_match_vertex), &ufbxt_cmp_sub_vertex); + + for (int32_t i = (int32_t)fbx_mesh->num_indices - 1; i >= 0; i--) { + ufbxt_match_vertex v = fbx_verts[i]; + + bool found = false; + for (int32_t j = i; j >= 0 && obj_verts[j].pos.x >= v.pos.x - tolerance; j--) { + ufbx_real dx = obj_verts[j].pos.x - v.pos.x; + ufbx_real dy = obj_verts[j].pos.y - v.pos.y; + ufbx_real dz = obj_verts[j].pos.z - v.pos.z; + ufbx_real dnx = obj_verts[j].normal.x - v.normal.x; + ufbx_real dny = obj_verts[j].normal.y - v.normal.y; + ufbx_real dnz = obj_verts[j].normal.z - v.normal.z; + ufbx_real du = obj_verts[j].uv.x - v.uv.x; + ufbx_real dv = obj_verts[j].uv.y - v.uv.y; + + if (obj->bad_normals) { + dnx = 0.0f; + dny = 0.0f; + dnz = 0.0f; + } + + if (obj->bad_uvs) { + du = 0.0f; + dv = 0.0f; + } + + ufbxt_assert(dx <= tolerance); + ufbx_real err = (ufbx_real)sqrt(dx*dx + dy*dy + dz*dz + dnx*dnx + dny*dny + dnz*dnz + du*du + dv*dv); + if (err < tolerance) { + if (err > p_err->max) p_err->max = err; + p_err->sum += err; + p_err->num++; + + obj_verts[j] = obj_verts[i]; + found = true; + break; + } + } + + ufbxt_assert(found); + } + + free(obj_verts); + free(fbx_verts); + +} + +typedef struct { + const char *cat_name; + ufbx_node *node; +} ufbxt_obj_node; + +static int ufbxt_cmp_string(const void *va, const void *vb) +{ + const char **a = (const char**)va, **b = (const char**)vb; + return strcmp(*a, *b); +} + +static int ufbxt_cmp_obj_node(const void *va, const void *vb) +{ + const ufbxt_obj_node *a = (const ufbxt_obj_node*)va, *b = (const ufbxt_obj_node*)vb; + return strcmp(a->cat_name, b->cat_name); +} + +static ufbxt_noinline size_t ufbxt_obj_group_key(char *cat_buf, size_t cat_cap, const char **groups, size_t num_groups, bool remove_namespaces) +{ + ufbxt_assert(num_groups > 0); + qsort((void*)groups, num_groups, sizeof(const char*), &ufbxt_cmp_string); + + char *cat_ptr = cat_buf, *cat_end = cat_buf + cat_cap; + for (size_t i = 0; i < num_groups; i++) { + const char *group = groups[i]; + + if (remove_namespaces) { + for (;;) { + const char *next = strchr(group, ':'); + if (!next) break; + group = next + 1; + } + } + + size_t space = (size_t)(cat_end - cat_ptr); + int res = snprintf(cat_ptr, space, "%s\n", group); + ufbxt_assert(res >= 0 && (size_t)res < space); + cat_ptr += res; + } + + *--cat_ptr = '\0'; + return cat_ptr - cat_buf; +} + +static ufbxt_noinline bool ufbxt_face_has_duplicate_vertex(ufbx_mesh *mesh, ufbx_face face) +{ + for (size_t i = 0; i < face.num_indices; i++) { + uint32_t ix = mesh->vertex_indices.data[face.index_begin + i]; + for (size_t j = 0; j < i; j++) { + uint32_t jx = mesh->vertex_indices.data[face.index_begin + j]; + if (ix == jx) { + return true; + } + } + } + return false; +} + +enum { + UFBXT_OBJ_DIFF_FLAG_CHECK_DEFORMED_NORMALS = 0x1, + UFBXT_OBJ_DIFF_FLAG_IGNORE_NORMALS = 0x2, +}; + +static ufbxt_noinline void ufbxt_diff_to_obj(ufbx_scene *scene, ufbxt_obj_file *obj, ufbxt_diff_error *p_err, uint32_t flags) +{ + ufbx_node **used_nodes = (ufbx_node**)malloc(obj->num_meshes * sizeof(ufbx_node*)); + ufbxt_assert(used_nodes); + + size_t num_used_nodes = 0; + + char cat_name[4096]; + const char *groups[64]; + + char *cat_name_data = NULL; + size_t cat_name_offset = 0; + + ufbxt_obj_node *obj_nodes = (ufbxt_obj_node*)calloc(scene->nodes.count, sizeof(ufbxt_obj_node)); + ufbxt_assert(obj_nodes); + + size_t num_obj_nodes = 0; + + for (int step = 0; step < 2; step++) { + for (size_t node_i = 0; node_i < scene->nodes.count; node_i++) { + ufbx_node *node = scene->nodes.data[node_i]; + if (!node->name.length) continue; + + size_t num_groups = 0; + ufbx_node *parent = node; + while (parent && !parent->is_root) { + if (obj->root_groups_at_bone && parent->attrib_type == UFBX_ELEMENT_BONE) break; + + ufbxt_assert(num_groups < ufbxt_arraycount(groups)); + groups[num_groups++] = parent->name.data; + parent = parent->parent; + } + + if (num_groups == 0) continue; + + size_t cat_len = ufbxt_obj_group_key(cat_name, sizeof(cat_name), groups, num_groups, obj->remove_namespaces); + if (cat_name_data) { + char *dst = cat_name_data + cat_name_offset; + memcpy(dst, cat_name, cat_len + 1); + + ufbxt_obj_node *obj_node = &obj_nodes[num_obj_nodes++]; + obj_node->cat_name = dst; + obj_node->node = node; + } + cat_name_offset += cat_len + 1; + } + + if (cat_name_data) break; + + cat_name_data = (char*)malloc(cat_name_offset); + ufbxt_assert(cat_name_data); + cat_name_offset = 0; + } + + qsort(obj_nodes, num_obj_nodes, sizeof(ufbxt_obj_node), &ufbxt_cmp_obj_node); + + for (size_t mesh_i = 0; mesh_i < obj->num_meshes; mesh_i++) { + ufbxt_obj_mesh *obj_mesh = &obj->meshes[mesh_i]; + if (obj_mesh->num_indices == 0) continue; + + ufbx_node *node = NULL; + + if (obj->match_by_order) { + ufbxt_assert(mesh_i + 1 < scene->nodes.count); + node = scene->nodes.data[mesh_i + 1]; + } + + // Search for a node containing all the groups + if (!node && obj_mesh->num_groups > 0) { + ufbxt_obj_group_key(cat_name, sizeof(cat_name), obj_mesh->groups, obj_mesh->num_groups, obj->remove_namespaces); + ufbxt_obj_node key = { cat_name }; + ufbxt_obj_node *found = (ufbxt_obj_node*)bsearch(&key, obj_nodes, num_obj_nodes, + sizeof(ufbxt_obj_node), &ufbxt_cmp_obj_node); + + if (found) { + if (found->node && found->node->mesh) { + bool seen = false; + for (size_t i = 0; i < num_used_nodes; i++) { + if (used_nodes[i] == found->node) { + seen = true; + break; + } + } + if (!seen) { + node = found->node; + } + } + } + } + + if (!node && obj_mesh->original_group && *obj_mesh->original_group) { + node = ufbx_find_node(scene, obj_mesh->original_group); + } + + if (!node) { + for (size_t group_i = 0; group_i < obj_mesh->num_groups; group_i++) { + const char *name = obj_mesh->groups[group_i]; + + node = ufbx_find_node(scene, name); + if (!node && obj->exporter == UFBXT_OBJ_EXPORTER_BLENDER) { + // Blender concatenates _Material to names + size_t name_len = strcspn(name, "_"); + node = ufbx_find_node_len(scene, name, name_len); + } + + if (node && node->mesh) { + bool seen = false; + for (size_t i = 0; i < num_used_nodes; i++) { + if (used_nodes[i] == node) { + seen = true; + break; + } + } + if (!seen) break; + } + } + } + + if (obj->ignore_duplicates) { + if (!node) { + bool is_ncl = false; + for (size_t i = 0; i < obj_mesh->num_groups; i++) { + if (strstr(obj_mesh->groups[i], "_ncl1_")) { + is_ncl = true; + break; + } + } + if (is_ncl) continue; + } + + if (node && node->parent) { + bool duplicate_name = false; + ufbx_node *parent = node->parent; + for (size_t i = 0; i < parent->children.count; i++) { + ufbx_node *child = parent->children.data[i]; + if (child == node) continue; + if (!strcmp(child->name.data, node->name.data)) { + duplicate_name = true; + break; + } + } + if (duplicate_name) continue; + } + } + + if (!node) { + ufbxt_assert(scene->meshes.count == 1); + ufbxt_assert(scene->meshes.data[0]->instances.count == 1); + node = scene->meshes.data[0]->instances.data[0]; + } + + ufbxt_assert(node); + if (node->geometry_transform_helper) { + node = node->geometry_transform_helper; + } + + ufbx_mesh *mesh = node->mesh; + + double scale = 1.0; + + if (obj->normalize_units && scene->settings.unit_meters != 1.0) { + scale *= scene->settings.unit_meters; + } + + if (obj->position_scale != 1.0) { + scale *= obj->position_scale; + } + + used_nodes[num_used_nodes++] = node; + + if (!mesh && node->attrib_type == UFBX_ELEMENT_NURBS_SURFACE) { + ufbx_nurbs_surface *surface = (ufbx_nurbs_surface*)node->attrib; + ufbx_tessellate_surface_opts opts = { 0 }; + opts.span_subdivision_u = surface->span_subdivision_u; + opts.span_subdivision_v = surface->span_subdivision_v; + ufbx_mesh *tess_mesh = ufbx_tessellate_nurbs_surface(surface, &opts, NULL); + ufbxt_assert(tess_mesh); + + // ufbxt_debug_dump_obj_mesh("test.obj", node, tess_mesh); + + ufbxt_check_mesh(scene, tess_mesh); + ufbxt_match_obj_mesh(obj, node, tess_mesh, obj_mesh, p_err, scale); + ufbx_free_mesh(tess_mesh); + + continue; + } + + ufbxt_assert(mesh); + + // Multiple skin deformers are not supported + if (mesh->skin_deformers.count > 1) continue; + + ufbx_matrix *mat = &node->geometry_to_world; + ufbx_matrix norm_mat = ufbx_get_compatible_matrix_for_normals(node); + + if (!obj->no_subdivision && (mesh->subdivision_display_mode == UFBX_SUBDIVISION_DISPLAY_SMOOTH || mesh->subdivision_display_mode == UFBX_SUBDIVISION_DISPLAY_HULL_AND_SMOOTH)) { + ufbx_subdivide_opts opts = { 0 }; + opts.evaluate_source_vertices = true; + opts.evaluate_skin_weights = true; + + ufbx_mesh *sub_mesh = ufbx_subdivide_mesh(mesh, mesh->subdivision_preview_levels, &opts, NULL); + ufbxt_assert(sub_mesh); + + // Check that we didn't break the original mesh + ufbxt_check_mesh(scene, mesh); + + ufbxt_check_source_vertices(sub_mesh, mesh, p_err); + + ufbxt_check_mesh(scene, sub_mesh); + ufbxt_match_obj_mesh(obj, node, sub_mesh, obj_mesh, p_err, scale); + ufbx_free_mesh(sub_mesh); + + continue; + } + + if (!(obj->bad_faces || obj->line_faces || obj->point_faces)) { + ufbxt_assert(obj_mesh->num_faces == mesh->num_faces); + ufbxt_assert(obj_mesh->num_indices == mesh->num_indices); + } + + bool check_normals = true; + if (obj->bad_normals) check_normals = false; + if ((flags & UFBXT_OBJ_DIFF_FLAG_CHECK_DEFORMED_NORMALS) == 0 && mesh->all_deformers.count > 0) check_normals = false; + if ((flags & UFBXT_OBJ_DIFF_FLAG_IGNORE_NORMALS) != 0) check_normals = false; + + if (obj->bad_order) { + ufbxt_match_obj_mesh(obj, node, mesh, obj_mesh, p_err, scale); + } else { + size_t obj_face_ix = 0; + + // Assume that the indices are in the same order! + for (size_t face_ix = 0; face_ix < mesh->num_faces; face_ix++) { + ufbx_face obj_face = obj_mesh->faces[obj_face_ix]; + ufbx_face face = mesh->faces.data[face_ix]; + + if (obj->bad_faces && ufbxt_face_has_duplicate_vertex(mesh, face)) { + continue; + } else if (obj->line_faces && face.num_indices == 2) { + continue; + } else if (obj->point_faces && face.num_indices == 1) { + continue; + } else if (!obj->bad_faces) { + ufbxt_assert(obj_face.index_begin == face.index_begin); + } + + ufbxt_assert(obj_face.num_indices == face.num_indices); + obj_face_ix++; + + for (size_t i = 0; i < face.num_indices; i++) { + size_t oix = obj_face.index_begin + i; + size_t fix = face.index_begin + i; + + ufbx_vec3 op = ufbx_get_vertex_vec3(&obj_mesh->vertex_position, oix); + ufbx_vec3 fp = ufbx_get_vertex_vec3(&mesh->skinned_position, fix); + ufbx_vec3 on = check_normals ? ufbx_get_vertex_vec3(&obj_mesh->vertex_normal, oix) : ufbx_zero_vec3; + ufbx_vec3 fn = check_normals ? ufbx_get_vertex_vec3(&mesh->skinned_normal, fix) : ufbx_zero_vec3; + + if (mesh->skinned_is_local) { + fp = ufbx_transform_position(mat, fp); + fn = ufbx_transform_direction(&norm_mat, fn); + + ufbx_real fn_len = (ufbx_real)sqrt(fn.x*fn.x + fn.y*fn.y + fn.z*fn.z); + if (fn_len > 0.00001f) { + fn.x /= fn_len; + fn.y /= fn_len; + fn.z /= fn_len; + } + + ufbx_real on_len = (ufbx_real)sqrt(on.x*on.x + on.y*on.y + on.z*on.z); + if (on_len > 0.00001f) { + on.x /= on_len; + on.y /= on_len; + on.z /= on_len; + } + } + + if (scale != 1.0) { + fp.x *= (ufbx_real)scale; + fp.y *= (ufbx_real)scale; + fp.z *= (ufbx_real)scale; + op.x *= (ufbx_real)scale; + op.y *= (ufbx_real)scale; + op.z *= (ufbx_real)scale; + } + + ufbxt_assert_close_vec3(p_err, op, fp); + + if (check_normals && !mesh->generated_normals) { + ufbx_real on2 = on.x*on.x + on.y*on.y + on.z*on.z; + ufbx_real fn2 = fn.x*fn.x + fn.y*fn.y + fn.z*fn.z; + if (on2 > 0.01f && fn2 > 0.01f) { + ufbxt_assert_close_vec3(p_err, on, fn); + } + } + + if (obj_mesh->vertex_uv.exists && !obj->bad_uvs) { + ufbxt_assert(mesh->vertex_uv.exists); + ufbx_vec2 ou = ufbx_get_vertex_vec2(&obj_mesh->vertex_uv, oix); + ufbx_vec2 fu = ufbx_get_vertex_vec2(&mesh->vertex_uv, fix); + ufbxt_assert_close_vec2(p_err, ou, fu); + } + } + } + } + } + + free(obj_nodes); + free(cat_name_data); + free(used_nodes); +} + +// -- IO + +static ufbxt_noinline size_t ufbxt_file_size(const char *name) +{ + FILE *file = fopen(name, "rb"); + if (!file) return 0; + fseek(file, 0, SEEK_END); +#if defined(_WIN32) + size_t size = (size_t)_ftelli64(file); +#else + size_t size = (size_t)ftell(file); +#endif + fclose(file); + return size; +} + +static ufbxt_noinline void *ufbxt_read_file(const char *name, size_t *p_size) +{ + FILE *file = fopen(name, "rb"); + if (!file) return NULL; + + fseek(file, 0, SEEK_END); +#if defined(_WIN32) + size_t size = (size_t)_ftelli64(file); +#else + size_t size = (size_t)ftell(file); +#endif + fseek(file, 0, SEEK_SET); + + char *data = malloc(size + 1); + ufbxt_assert(data != NULL); + size_t num_read = fread(data, 1, size, file); + fclose(file); + + data[size] = '\0'; + + if (num_read != size) { + ufbxt_assert_fail(__FILE__, __LINE__, "Failed to load file"); + } + + *p_size = size; + return data; +} + +static ufbxt_noinline void *ufbxt_read_file_ex(const char *name, size_t *p_size) +{ + size_t name_len = strlen(name); + if (name_len >= 3 && !memcmp(name + name_len - 3, ".gz", 3)) { + size_t gz_size = 0; + void *gz_data = ufbxt_read_file(name, &gz_size); + if (!gz_data) return NULL; + + void *result = ufbxt_decompress_gzip(gz_data, gz_size, p_size); + free(gz_data); + + return result; + } else { + return ufbxt_read_file(name, p_size); + } +} + +#endif diff --git a/modules/ufbx/test/threadcheck.cpp b/modules/ufbx/test/threadcheck.cpp new file mode 100644 index 0000000..9a5a8e1 --- /dev/null +++ b/modules/ufbx/test/threadcheck.cpp @@ -0,0 +1,80 @@ +#include "../ufbx.h" +#include +#include +#include +#include +#include +#include + +std::atomic_int32_t atomic_count { 0 }; +int32_t race_count = 0; +bool allocator_freed = false; + +void free_allocator(void*) +{ + allocator_freed = true; +} + +void worker(ufbx_scene *scene) +{ + std::this_thread::sleep_for(std::chrono::milliseconds{100}); + for (uint32_t i = 0; i < 0x1000000; i++) { + ufbx_retain_scene(scene); + ufbx_free_scene(scene); + atomic_count.fetch_add(1, std::memory_order_relaxed); + race_count++; + } +} + +int main(int argc, char **argv) +{ + if (argc < 3) { + fprintf(stderr, "Usage: check_threads \n"); + return 1; + } + + if (!ufbx_is_thread_safe()) { + fprintf(stderr, "WARNING: Not thread safe, expect failure!\n"); + } + + size_t num_threads = (size_t)atoi(argv[2]); + + ufbx_load_opts opts = { }; + opts.result_allocator.allocator.free_allocator_fn = &free_allocator; + + ufbx_error error; + ufbx_scene *scene = ufbx_load_file(argv[1], &opts, &error); + if (!scene) { + fprintf(stderr, "Failed to load scene: %s\n", error.description.data); + return 1; + } + + if (allocator_freed) { + fprintf(stderr, "Allocator prematurely freed\n"); + return 1; + } + + for (uint32_t run = 0; run < 8; run++) { + std::vector threads; + for (size_t i = 0; i < num_threads; i++) { + threads.push_back(std::thread(worker, scene)); + } + + for (std::thread &thread : threads) { + thread.join(); + } + + int32_t delta = std::abs(atomic_count.load(std::memory_order_relaxed) - race_count); + printf("Race delta: %d\n", delta); + if (delta >= 1000) break; + } + + ufbx_free_scene(scene); + + if (!allocator_freed) { + fprintf(stderr, "Scene not freed\n"); + return 1; + } + + return 0; +} diff --git a/modules/ufbx/test/unit_tests.c b/modules/ufbx/test/unit_tests.c new file mode 100644 index 0000000..e57ae47 --- /dev/null +++ b/modules/ufbx/test/unit_tests.c @@ -0,0 +1,304 @@ +#include "../ufbx.c" +#include "../ufbx.h" + +#include +#include + +void test_assert(bool cond) +{ + if (!cond) { + exit(1); + } +} + +typedef struct { + uint32_t a, b; +} uint_pair; + +static size_t g_linear_size = 2; + +void sort_uints(uint32_t *test_data, uint32_t *test_tmp, size_t test_size) +{ + ufbxi_macro_stable_sort(uint32_t, g_linear_size, test_data, test_tmp, test_size, (*a < *b)); +} + +void sort_pairs_by_a(uint_pair *data, uint_pair *tmp, size_t size) +{ + ufbxi_macro_stable_sort(uint_pair, g_linear_size, data, tmp, size, (a->a < b->a)); +} + +void sort_pairs_by_b(uint_pair *data, uint_pair *tmp, size_t size) +{ + ufbxi_macro_stable_sort(uint_pair, g_linear_size, data, tmp, size, (a->b < b->b)); +} + +size_t find_uint(uint32_t *test_data, size_t test_size, uint32_t value) +{ + size_t index = SIZE_MAX; + + ufbxi_macro_lower_bound_eq(uint32_t, g_linear_size, &index, test_data, 0, test_size, + (*a < value), + (*a == value)); + + return index; +} + +size_t find_uint_end(uint32_t *test_data, size_t test_size, size_t test_begin, uint32_t value) +{ + size_t index = SIZE_MAX; + ufbxi_macro_upper_bound_eq(uint32_t, g_linear_size, &index, test_data, test_begin, test_size, (*a == value)); + return index; +} + +size_t find_pair_by_a(uint_pair *data, size_t size, uint32_t value) +{ + size_t pair_ix = SIZE_MAX; + ufbxi_macro_lower_bound_eq(uint_pair, g_linear_size, &pair_ix, data, 0, size, + (a->a < value), + (a->a == value)); + return pair_ix; +} + +void sort_strings(const char **data, const void *tmp, size_t size) +{ + ufbxi_macro_stable_sort(const char*, g_linear_size, data, tmp, size, (strcmp(*a, *b) < 0)); +} + +size_t find_first_string(const char **data, size_t size, const char *str) +{ + size_t str_index; + + ufbxi_macro_lower_bound_eq(const char*, g_linear_size, &str_index, data, 0, size, + (strcmp(*a, str) < 0), + (strcmp(*a, str) == 0)); + + return str_index; +} + +static uint32_t xorshift32(uint32_t *state) +{ + /* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */ + uint32_t x = *state; + x ^= x << 13; + x ^= x >> 17; + x ^= x << 5; + return *state = x; +} + +static ufbx_real xorshift32_real(uint32_t *state) +{ + uint32_t u = xorshift32(state); + return (ufbx_real)u * (ufbx_real)2.3283064365386962890625e-10; +} + +void generate_linear(uint32_t *dst, size_t size, uint32_t start, uint32_t delta) +{ + for (size_t i = 0; i < size; i++) { + dst[i] = start; + start += delta; + } +} + +void generate_random(uint32_t *dst, size_t size, uint32_t seed, uint32_t mod) +{ + uint32_t state = seed | 1; + for (size_t i = 0; i < size; i++) { + dst[i] = xorshift32(&state) % mod; + } +} + +#define MAX_SORT_SIZE 2048 + +ufbx_real quat_error(ufbx_quat a, ufbx_quat b) +{ + double pos = fabs(a.x-b.x) + fabs(a.y-b.y) + fabs(a.z-b.z) + fabs(a.w-b.w); + double neg = fabs(a.x+b.x) + fabs(a.y+b.y) + fabs(a.z+b.z) + fabs(a.w+b.w); + return pos < neg ? pos : neg; +} + +void test_quats() +{ + uint32_t state = 1; + + for (int iorder = 0; iorder < 6; iorder++) { + ufbx_rotation_order order = (ufbx_rotation_order)iorder; + + printf("quat_to_euler %d/6\n", iorder+1); + + for (int axis = 0; axis < 3; axis++) { + for (size_t i = 1; i <= 360; i++) { + ufbx_vec3 v = { 0.0f, 0.0f, 0.0f }; + v.v[axis] = (ufbx_real)i; + + ufbx_quat q = ufbx_euler_to_quat(v, order); + ufbx_vec3 v2 = ufbx_quat_to_euler(q, order); + ufbx_quat q2 = ufbx_euler_to_quat(v2, order); + + test_assert(quat_error(q, q2) < 0.001f); + test_assert(quat_error(q, q2) < 0.001f); + } + } + + for (int x = -360; x <= 360; x += 10) + for (int y = -360; y <= 360; y += 10) + for (int z = -360; z <= 360; z += 10) { + ufbx_vec3 v = { (ufbx_real)x, (ufbx_real)y, (ufbx_real)z }; + + ufbx_quat q = ufbx_euler_to_quat(v, order); + ufbx_vec3 v2 = ufbx_quat_to_euler(q, order); + ufbx_quat q2 = ufbx_euler_to_quat(v2, order); + + test_assert(quat_error(q, q2) < 0.1f); + test_assert(quat_error(q, q2) < 0.1f); + } + + for (size_t i = 0; i < 1000000; i++) { + ufbx_quat q; + q.x = xorshift32_real(&state) * 2.0f - 1.0f; + q.y = xorshift32_real(&state) * 2.0f - 1.0f; + q.z = xorshift32_real(&state) * 2.0f - 1.0f; + q.w = xorshift32_real(&state) * 2.0f - 1.0f; + ufbx_real qm = (ufbx_real)sqrt(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + q.x /= qm; + q.y /= qm; + q.z /= qm; + q.w /= qm; + + ufbx_vec3 v = ufbx_quat_to_euler(q, order); + ufbx_quat q2 = ufbx_euler_to_quat(v, order); + + test_assert( + fabs(q.x-q2.x) + fabs(q.y-q2.y) + fabs(q.z-q2.z) + fabs(q.w-q2.w) < 0.001f || + fabs(q.x+q2.x) + fabs(q.y+q2.y) + fabs(q.z+q2.z) + fabs(q.w+q2.w) < 0.001f ); + test_assert(true); + } + } +} + +void test_sort(uint32_t *data, size_t size) +{ + assert(size <= MAX_SORT_SIZE); + static size_t call_count = 0; + static uint32_t uint_tmp_buffer[MAX_SORT_SIZE]; + static uint_pair pair_buffer[MAX_SORT_SIZE]; + static uint_pair pair_tmp_buffer[MAX_SORT_SIZE]; + call_count++; + + for (size_t i = 0; i < size; i++) { + pair_buffer[i].a = data[i]; + pair_buffer[i].b = (uint32_t)i; + } + + sort_uints(data, uint_tmp_buffer, size); + sort_pairs_by_a(pair_buffer, pair_tmp_buffer, size); + + for (size_t i = 1; i < size; i++) { + test_assert(data[i - 1] <= data[i]); + test_assert(pair_buffer[i - 1].a <= pair_buffer[i].a); + if (pair_buffer[i - 1].a == pair_buffer[i].a) { + test_assert(pair_buffer[i - 1].b < pair_buffer[i].b); + } + } + + for (size_t i = 0; i < size; i++) { + uint32_t value = data[i]; + + size_t index = find_uint(data, size, value); + test_assert(index <= i); + test_assert(data[index] == value); + test_assert(index == find_pair_by_a(pair_buffer, size, value)); + if (index > 0) { + test_assert(data[index - 1] < value); + } + + size_t end = find_uint_end(data, size, index, value); + test_assert(end > i); + test_assert(data[end - 1] == value); + if (end < size) { + test_assert(data[end] > value); + } + } + test_assert(find_uint(data, size, UINT32_MAX) == SIZE_MAX); + + sort_pairs_by_b(pair_buffer, pair_tmp_buffer, size); + for (size_t i = 0; i < size; i++) { + test_assert(pair_buffer[i].b == (uint32_t)i); + } +} + +void test_sort_strings(uint32_t *data, size_t size) +{ + assert(size <= MAX_SORT_SIZE); + static size_t call_count = 0; + static const char *str_buffer[MAX_SORT_SIZE]; + static const char *str_tmp_buffer[MAX_SORT_SIZE]; + static char str_data_buffer[MAX_SORT_SIZE * 32]; + + char *data_ptr = str_data_buffer, *data_end = data_ptr + sizeof(str_data_buffer); + for (size_t i = 0; i < size; i++) { + int len = snprintf(data_ptr, data_end - data_ptr, "%u", data[i]); + test_assert(len > 0); + str_buffer[i] = data_ptr; + data_ptr += len + 1; + } + + sort_strings(str_buffer, str_tmp_buffer, size); + + for (size_t i = 1; i < size; i++) { + test_assert(strcmp(str_buffer[i - 1], str_buffer[i]) <= 0); + } + + char find_str[128]; + for (size_t i = 0; i < size; i++) { + int len = snprintf(find_str, sizeof(find_str), "%u", data[i]); + test_assert(len > 0); + + size_t index = find_first_string(str_buffer, size, find_str); + test_assert(index < size); + test_assert(strcmp(str_buffer[index], find_str) == 0); + if (index > 0) { + test_assert(strcmp(str_buffer[index - 1], find_str) < 0); + } + } +} + +void test_sorts() +{ + static uint32_t sort_buffer[MAX_SORT_SIZE]; + + while (g_linear_size <= 64) { + printf("%zu\n", g_linear_size); + for (size_t size = 0; size < MAX_SORT_SIZE; size += 1+ size/128 + size/512*32) { + generate_linear(sort_buffer, size, 0, +1); + test_sort(sort_buffer, size); + generate_linear(sort_buffer, size, (uint32_t)size, -1); + test_sort(sort_buffer, size); + generate_random(sort_buffer, size, (uint32_t)size, 1+size%10); + test_sort(sort_buffer, size); + generate_random(sort_buffer, size, (uint32_t)size, UINT32_MAX); + test_sort(sort_buffer, size); + } + + { + size_t size = MAX_SORT_SIZE; + generate_linear(sort_buffer, size, 0, +1); + test_sort_strings(sort_buffer, size); + generate_linear(sort_buffer, size, (uint32_t)size, -1); + test_sort_strings(sort_buffer, size); + generate_random(sort_buffer, size, (uint32_t)size, 1+size%10); + test_sort_strings(sort_buffer, size); + generate_random(sort_buffer, size, (uint32_t)size, UINT32_MAX); + test_sort_strings(sort_buffer, size); + } + + g_linear_size += 1+g_linear_size/8; + } +} + +int main(int argc, char **argv) +{ + test_sorts(); + test_quats(); + + return 0; +} diff --git a/modules/ufbx/ufbx.c b/modules/ufbx/ufbx.c new file mode 100644 index 0000000..25d4f21 --- /dev/null +++ b/modules/ufbx/ufbx.c @@ -0,0 +1,27776 @@ +#ifndef UFBX_UFBX_C_INCLUDED +#define UFBX_UFBX_C_INCLUDED + +#if defined(UFBX_HEADER_PATH) + #include UFBX_HEADER_PATH +#else + #include "ufbx.h" +#endif + +// -- User configuration + +#if defined(UFBX_CONFIG_SOURCE) + #include UFBX_CONFIG_SOURCE +#endif + +// -- Configuration + +#define UFBXI_MAX_NON_ARRAY_VALUES 8 +#define UFBXI_MAX_NODE_DEPTH 32 +#define UFBXI_MAX_XML_DEPTH 32 +#define UFBXI_MAX_SKIP_SIZE 0x40000000 +#define UFBXI_MAP_MAX_SCAN 32 +#define UFBXI_KD_FAST_DEPTH 6 +#define UFBXI_HUGE_MAX_SCAN 16 +#define UFBXI_MIN_FILE_FORMAT_LOOKAHEAD 32 +#define UFBXI_FACE_GROUP_HASH_BITS 8 + +#ifndef UFBXI_MAX_NURBS_ORDER +#define UFBXI_MAX_NURBS_ORDER 128 +#endif + +// -- Feature exclusion + +#if !defined(UFBX_MINIMAL) + #if !defined(UFBX_NO_SUBDIVISION) + #define UFBXI_FEATURE_SUBDIVISION 1 + #endif + #if !defined(UFBX_NO_TESSELLATION) + #define UFBXI_FEATURE_TESSELLATION 1 + #endif + #if !defined(UFBX_NO_GEOMETRY_CACHE) + #define UFBXI_FEATURE_GEOMETRY_CACHE 1 + #endif + #if !defined(UFBX_NO_SCENE_EVALUATION) + #define UFBXI_FEATURE_SCENE_EVALUATION 1 + #endif + #if !defined(UFBX_NO_SKINNING_EVALUATION) + #define UFBXI_FEATURE_SKINNING_EVALUATION 1 + #endif + #if !defined(UFBX_NO_TRIANGULATION) + #define UFBXI_FEATURE_TRIANGULATION 1 + #endif + #if !defined(UFBX_NO_INDEX_GENERATION) + #define UFBXI_FEATURE_INDEX_GENERATION 1 + #endif + #if !defined(UFBX_NO_FORMAT_OBJ) + #define UFBXI_FEATURE_FORMAT_OBJ 1 + #endif +#endif + +#if defined(UFBX_DEV) + #if !defined(UFBX_NO_ERROR_STACK) + #define UFBXI_FEATURE_ERROR_STACK 1 + #endif +#endif + +#if !defined(UFBXI_FEATURE_SUBDIVISION) && defined(UFBX_ENABLE_SUBDIVISION) + #define UFBXI_FEATURE_SUBDIVISION 1 +#endif +#if !defined(UFBXI_FEATURE_TESSELLATION) && defined(UFBX_ENABLE_TESSELLATION) + #define UFBXI_FEATURE_TESSELLATION 1 +#endif +#if !defined(UFBXI_FEATURE_GEOMETRY_CACHE) && defined(UFBX_ENABLE_GEOMETRY_CACHE) + #define UFBXI_FEATURE_GEOMETRY_CACHE 1 +#endif +#if !defined(UFBXI_FEATURE_SCENE_EVALUATION) && defined(UFBX_ENABLE_SCENE_EVALUATION) + #define UFBXI_FEATURE_SCENE_EVALUATION 1 +#endif +#if !defined(UFBXI_FEATURE_SKINNING_EVALUATION) && defined(UFBX_ENABLE_SKINNING_EVALUATION) + #define UFBXI_FEATURE_SKINNING_EVALUATION 1 +#endif +#if !defined(UFBXI_FEATURE_TRIANGULATION) && defined(UFBX_ENABLE_TRIANGULATION) + #define UFBXI_FEATURE_TRIANGULATION 1 +#endif +#if !defined(UFBXI_FEATURE_INDEX_GENERATION) && defined(UFBX_ENABLE_INDEX_GENERATION) + #define UFBXI_FEATURE_INDEX_GENERATION 1 +#endif +#if !defined(UFBXI_FEATURE_FORMAT_OBJ) && defined(UFBX_ENABLE_FORMAT_OBJ) + #define UFBXI_FEATURE_FORMAT_OBJ 1 +#endif +#if !defined(UFBXI_FEATURE_ERROR_STACK) && defined(UFBX_ENABLE_ERROR_STACK) + #define UFBXI_FEATURE_ERROR_STACK 1 +#endif + +#if !defined(UFBXI_FEATURE_SUBDIVISION) + #define UFBXI_FEATURE_SUBDIVISION 0 +#endif +#if !defined(UFBXI_FEATURE_TESSELLATION) + #define UFBXI_FEATURE_TESSELLATION 0 +#endif +#if !defined(UFBXI_FEATURE_GEOMETRY_CACHE) + #define UFBXI_FEATURE_GEOMETRY_CACHE 0 +#endif +#if !defined(UFBXI_FEATURE_SCENE_EVALUATION) + #define UFBXI_FEATURE_SCENE_EVALUATION 0 +#endif +#if !defined(UFBXI_FEATURE_SKINNING_EVALUATION) + #define UFBXI_FEATURE_SKINNING_EVALUATION 0 +#endif +#if !defined(UFBXI_FEATURE_TRIANGULATION) + #define UFBXI_FEATURE_TRIANGULATION 0 +#endif +#if !defined(UFBXI_FEATURE_INDEX_GENERATION) + #define UFBXI_FEATURE_INDEX_GENERATION 0 +#endif +#if !defined(UFBXI_FEATURE_FORMAT_OBJ) + #define UFBXI_FEATURE_FORMAT_OBJ 0 +#endif +#if !defined(UFBXI_FEATURE_ERROR_STACK) + #define UFBXI_FEATURE_ERROR_STACK 0 +#endif + +// Derived features + +#if UFBXI_FEATURE_GEOMETRY_CACHE + #define UFBXI_FEATURE_XML 1 +#else + #define UFBXI_FEATURE_XML 0 +#endif + +#if UFBXI_FEATURE_TESSELLATION + #define UFBXI_FEATURE_SPATIAL 1 +#else + #define UFBXI_FEATURE_SPATIAL 0 +#endif + +#if UFBXI_FEATURE_TRIANGULATION + #define UFBXI_FEATURE_KD 1 +#else + #define UFBXI_FEATURE_KD 0 +#endif + +#if !UFBXI_FEATURE_SUBDIVISION || !UFBXI_FEATURE_TESSELLATION || !UFBXI_FEATURE_GEOMETRY_CACHE || !UFBXI_FEATURE_SCENE_EVALUATION || !UFBXI_FEATURE_SKINNING_EVALUATION || !UFBXI_FEATURE_TRIANGULATION || !UFBXI_FEATURE_INDEX_GENERATION || !UFBXI_FEATURE_XML || !UFBXI_FEATURE_SPATIAL || !UFBXI_FEATURE_KD + #define UFBXI_PARTIAL_FEATURES 1 +#endif + +// -- Headers + +#include +#include +#include +#include +#include + +#if !defined(UFBX_NO_MATH_H) + #include + #define UFBX_INFINITY INFINITY + #define UFBX_NAN NAN +#endif + +#if !defined(UFBX_MATH_PREFIX) + #define UFBX_MATH_PREFIX +#endif + +#define ufbxi_math_cat2(a, b) a##b +#define ufbxi_math_cat(a, b) ufbxi_math_cat2(a, b) +#define ufbxi_math_fn(name) ufbxi_math_cat(UFBX_MATH_PREFIX, name) + +#if !defined(UFBX_NO_MATH_DEFINES) + #define ufbx_sqrt ufbxi_math_fn(sqrt) + #define ufbx_fabs ufbxi_math_fn(fabs) + #define ufbx_pow ufbxi_math_fn(pow) + #define ufbx_sin ufbxi_math_fn(sin) + #define ufbx_cos ufbxi_math_fn(cos) + #define ufbx_tan ufbxi_math_fn(tan) + #define ufbx_asin ufbxi_math_fn(asin) + #define ufbx_acos ufbxi_math_fn(acos) + #define ufbx_atan ufbxi_math_fn(atan) + #define ufbx_atan2 ufbxi_math_fn(atan2) + #define ufbx_copysign ufbxi_math_fn(copysign) + #define ufbx_fmin ufbxi_math_fn(fmin) + #define ufbx_fmax ufbxi_math_fn(fmax) + #define ufbx_frexp ufbxi_math_fn(frexp) +#endif + +#if defined(UFBX_NO_MATH_H) && !defined(UFBX_NO_MATH_DECLARATIONS) + double ufbx_sqrt(double x); + double ufbx_sin(double x); + double ufbx_cos(double x); + double ufbx_tan(double x); + double ufbx_asin(double x); + double ufbx_acos(double x); + double ufbx_atan(double x); + double ufbx_atan2(double y, double x); + double ufbx_pow(double x, double y); + double ufbx_fmin(double a, double b); + double ufbx_fmax(double a, double b); + double ufbx_fabs(double x); + double ufbx_frexp(double x, int *eptr); + double ufbx_copysign(double x, double y); +#endif + +#if !defined(UFBX_INFINITY) + #define UFBX_INFINITY (1e+300 * 1e+300) +#endif +#if !defined(UFBX_NAN) + #define UFBX_NAN (UFBX_INFINITY * 0.0f) +#endif + +// -- Platform + +#if defined(_MSC_VER) + #define UFBXI_MSC_VER _MSC_VER +#else + #define UFBXI_MSC_VER 0 +#endif + +#if defined(__GNUC__) + #define UFBXI_GNUC __GNUC__ +#else + #define UFBXI_GNUC 0 +#endif + +#if !defined(UFBX_STANDARD_C) && defined(_MSC_VER) + #define ufbxi_noinline __declspec(noinline) + #define ufbxi_forceinline __forceinline + #define ufbxi_restrict __restrict + #if defined(__cplusplus) && _MSC_VER >= 1900 && defined(_MSVC_LANG) && _MSVC_LANG >= 201703L + #define ufbxi_nodiscard [[nodiscard]] + #elif defined(_Check_return_) + #define ufbxi_nodiscard _Check_return_ + #else + #define ufbxi_nodiscard + #endif + #define ufbxi_unused + #define ufbxi_unlikely(cond) (cond) +#elif !defined(UFBX_STANDARD_C) && (defined(__GNUC__) || defined(__clang__)) + #define ufbxi_noinline __attribute__((noinline)) + #define ufbxi_forceinline inline __attribute__((always_inline)) + #define ufbxi_restrict __restrict + #define ufbxi_nodiscard __attribute__((warn_unused_result)) + #define ufbxi_unused __attribute__((unused)) + #define ufbxi_unlikely(cond) __builtin_expect((cond), 0) +#else + #define ufbxi_noinline + #define ufbxi_forceinline + #define ufbxi_nodiscard + #define ufbxi_restrict + #define ufbxi_unused + #define ufbxi_unlikely(cond) (cond) +#endif + +#if !defined(UFBX_STANDARD_C) && defined(__clang__) + #define ufbxi_nounroll _Pragma("clang loop unroll(disable)") _Pragma("clang loop vectorize(disable)") +#elif !defined(UFBX_STANDARD_C) && UFBXI_GNUC >= 8 + #define ufbxi_nounroll _Pragma("GCC unroll 0") +#elif !defined(UFBX_STANDARD_C) && defined(_MSC_VER) + #define ufbxi_nounroll __pragma(loop(no_vector)) +#else + #define ufbxi_nounroll +#endif + +#if defined(__GNUC__) && !defined(__clang__) + #define ufbxi_ignore(cond) (void)!(cond) +#else + #define ufbxi_ignore(cond) (void)(cond) +#endif + +#if defined(_MSC_VER) + #pragma warning(push) + #pragma warning(disable: 4200) // nonstandard extension used: zero-sized array in struct/union + #pragma warning(disable: 4201) // nonstandard extension used: nameless struct/union + #pragma warning(disable: 4127) // conditional expression is constant + #pragma warning(disable: 4706) // assignment within conditional expression + #pragma warning(disable: 4789) // buffer 'type_and_name' of size 8 bytes will be overrun; 16 bytes will be written starting at offset 0 + #if defined(UFBX_STANDARD_C) + #pragma warning(disable: 4996) // 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. + #endif + #if defined(UFBXI_PARTIAL_FEATURES) + #pragma warning(disable: 4100) // 'name': unreferenced formal parameter + #pragma warning(disable: 4505) // 'func': unreferenced function with internal linkage has been removed + #endif +#endif + +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wmissing-field-initializers" + #pragma clang diagnostic ignored "-Wmissing-braces" + #pragma clang diagnostic ignored "-Wdouble-promotion" + #pragma clang diagnostic ignored "-Wpedantic" + #if defined(UFBX_STANDARD_C) + #pragma clang diagnostic ignored "-Wunused-function" + #endif + #if defined(UFBXI_PARTIAL_FEATURES) + #pragma clang diagnostic ignored "-Wunused-function" + #pragma clang diagnostic ignored "-Wunused-parameter" + #endif + #if defined(__cplusplus) + #pragma clang diagnostic ignored "-Wold-style-cast" + #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" + #endif +#endif + +#if defined(__GNUC__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wmissing-field-initializers" + #pragma GCC diagnostic ignored "-Wmissing-braces" + #pragma GCC diagnostic ignored "-Wdouble-promotion" + #pragma GCC diagnostic ignored "-Wpedantic" + #if defined(UFBX_STANDARD_C) + #pragma GCC diagnostic ignored "-Wunused-function" + #endif + #if defined(UFBXI_PARTIAL_FEATURES) + #pragma GCC diagnostic ignored "-Wunused-function" + #pragma GCC diagnostic ignored "-Wunused-parameter" + #endif + #if defined(__cplusplus) + #pragma GCC diagnostic ignored "-Wold-style-cast" + #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" + #endif +#endif + +#if !defined(ufbx_static_assert) + #if defined(__cplusplus) && __cplusplus >= 201103 + #define ufbx_static_assert(desc, cond) static_assert(cond, #desc ": " #cond) + #else + #define ufbx_static_assert(desc, cond) typedef char ufbxi_static_assert_##desc[(cond)?1:-1] + #endif +#endif + +#if defined(__has_feature) + #if __has_feature(undefined_behavior_sanitizer) && !defined(UFBX_UBSAN) + #define UFBX_UBSAN 1 + #endif +#endif + +#if defined(__SANITIZE_UNDEFINED__) && !defined(UFBX_UBSAN) + #define UFBX_UBSAN 1 +#endif + +// Don't use unaligned loads with UB-sanitizer +#if defined(UFBX_UBSAN) && !defined(UFBX_NO_UNALIGNED_LOADS) + #define UFBX_NO_UNALIGNED_LOADS +#endif + +#if defined(__clang_analyzer__) && !defined(UFBX_STATIC_ANALYSIS) + #define UFBX_STATIC_ANALYSIS 1 +#endif + +#if defined(UFBX_STATIC_ANALYSIS) + bool g_analysis_opaque; + #define ufbxi_maybe_null(ptr) (g_analysis_opaque ? (ptr) : NULL) +#else + #define ufbxi_maybe_null(ptr) (ptr) +#endif + +#if !defined(ufbxi_trace) + #if defined(UFBX_TRACE) + #define ufbxi_trace(desc) (fprintf(stderr, "ufbx trace: %s:%d: %s\n", __FILE__, __LINE__, #desc), fflush(stderr), desc) + #else + #define ufbxi_trace(desc) (desc) + #endif +#endif + +#ifndef UFBX_PATH_SEPARATOR + #if defined(_WIN32) + #define UFBX_PATH_SEPARATOR '\\' + #else + #define UFBX_PATH_SEPARATOR '/' + #endif +#endif + +#if !defined(UFBX_STANDARD_C) && defined(_POSIX_C_SOURCE) + #if _POSIX_C_SOURCE >= 200112l + #ifndef UFBX_HAS_FTELLO + #define UFBX_HAS_FTELLO + #endif + #endif +#endif + +// Unaligned little-endian load functions +// On platforms that support unaligned access natively (x86, x64, ARM64) just use normal loads, +// with unaligned attributes, otherwise do manual byte-wise load. + +#define ufbxi_read_u8(ptr) (*(const uint8_t*)(ptr)) + +// Detect support for `__attribute__((aligned(1)))` +#if !defined(UFBX_STANDARD_C) && (defined(__clang__) && defined(__APPLE__)) + // Apple overrides Clang versioning, 5.0 here maps to 3.3 + #if __clang_major__ >= 5 + #define UFBXI_HAS_ATTRIBUTE_ALIGNED 1 + #endif +#elif !defined(UFBX_STANDARD_C) && defined(__clang__) + #if (__clang_major__ >= 4) || (__clang_major__ == 3 && __clang_minor__ >= 3) + #define UFBXI_HAS_ATTRIBUTE_ALIGNED 1 + #endif +#elif !defined(UFBX_STANDARD_C) && defined(__GNUC__) + #if __GNUC__ >= 5 + #define UFBXI_HAS_ATTRIBUTE_ALIGNED 1 + #endif +#endif + +#if defined(UFBXI_HAS_ATTRIBUTE_ALIGNED) + #define UFBXI_HAS_UNALIGNED 1 + #define ufbxi_unaligned + typedef uint16_t __attribute__((aligned(1))) ufbxi_unaligned_u16; + typedef uint32_t __attribute__((aligned(1))) ufbxi_unaligned_u32; + typedef uint64_t __attribute__((aligned(1))) ufbxi_unaligned_u64; + typedef float __attribute__((aligned(1))) ufbxi_unaligned_f32; + typedef double __attribute__((aligned(1))) ufbxi_unaligned_f64; +#elif !defined(UFBX_STANDARD_C) && defined(_MSC_VER) + #define UFBXI_HAS_UNALIGNED 1 + #if defined(_M_IX86) + // MSVC seems to assume all pointers are unaligned for x86 + #define ufbxi_unaligned + #else + #define ufbxi_unaligned __unaligned + #endif + typedef uint16_t ufbxi_unaligned_u16; + typedef uint32_t ufbxi_unaligned_u32; + typedef uint64_t ufbxi_unaligned_u64; + typedef float ufbxi_unaligned_f32; + typedef double ufbxi_unaligned_f64; +#endif + +#if defined(UFBXI_HAS_UNALIGNED) && ((defined(_M_IX86) || defined(__i386__) || defined(_M_X64) || defined(__x86_64__) || defined(_M_ARM64) || defined(__aarch64__) || defined(__wasm__) || defined(__EMSCRIPTEN__)) && !defined(UFBX_NO_UNALIGNED_LOADS) || defined(UFBX_USE_UNALIGNED_LOADS)) + #define ufbxi_read_u16(ptr) (*(const ufbxi_unaligned ufbxi_unaligned_u16*)(ptr)) + #define ufbxi_read_u32(ptr) (*(const ufbxi_unaligned ufbxi_unaligned_u32*)(ptr)) + #define ufbxi_read_u64(ptr) (*(const ufbxi_unaligned ufbxi_unaligned_u64*)(ptr)) + #define ufbxi_read_f32(ptr) (*(const ufbxi_unaligned ufbxi_unaligned_f32*)(ptr)) + #define ufbxi_read_f64(ptr) (*(const ufbxi_unaligned ufbxi_unaligned_f64*)(ptr)) +#else + static ufbxi_forceinline uint16_t ufbxi_read_u16(const void *ptr) { + const char *p = (const char*)ptr; + return (uint16_t)( + (unsigned)(uint8_t)p[0] << 0u | + (unsigned)(uint8_t)p[1] << 8u ); + } + static ufbxi_forceinline uint32_t ufbxi_read_u32(const void *ptr) { + const char *p = (const char*)ptr; + return (uint32_t)( + (unsigned)(uint8_t)p[0] << 0u | + (unsigned)(uint8_t)p[1] << 8u | + (unsigned)(uint8_t)p[2] << 16u | + (unsigned)(uint8_t)p[3] << 24u ); + } + static ufbxi_forceinline uint64_t ufbxi_read_u64(const void *ptr) { + const char *p = (const char*)ptr; + return (uint64_t)( + (uint64_t)(uint8_t)p[0] << 0u | + (uint64_t)(uint8_t)p[1] << 8u | + (uint64_t)(uint8_t)p[2] << 16u | + (uint64_t)(uint8_t)p[3] << 24u | + (uint64_t)(uint8_t)p[4] << 32u | + (uint64_t)(uint8_t)p[5] << 40u | + (uint64_t)(uint8_t)p[6] << 48u | + (uint64_t)(uint8_t)p[7] << 56u ); + } + static ufbxi_forceinline float ufbxi_read_f32(const void *ptr) { + uint32_t u = ufbxi_read_u32(ptr); + float f; + memcpy(&f, &u, 4); + return f; + } + static ufbxi_forceinline double ufbxi_read_f64(const void *ptr) { + uint64_t u = ufbxi_read_u64(ptr); + double f; + memcpy(&f, &u, 8); + return f; + } +#endif + +#define ufbxi_read_i8(ptr) (int8_t)(ufbxi_read_u8(ptr)) +#define ufbxi_read_i16(ptr) (int16_t)(ufbxi_read_u16(ptr)) +#define ufbxi_read_i32(ptr) (int32_t)(ufbxi_read_u32(ptr)) +#define ufbxi_read_i64(ptr) (int64_t)(ufbxi_read_u64(ptr)) + +ufbx_static_assert(sizeof_bool, sizeof(bool) == 1); +ufbx_static_assert(sizeof_char, sizeof(char) == 1); +ufbx_static_assert(sizeof_i8, sizeof(int8_t) == 1); +ufbx_static_assert(sizeof_i16, sizeof(int16_t) == 2); +ufbx_static_assert(sizeof_i32, sizeof(int32_t) == 4); +ufbx_static_assert(sizeof_i64, sizeof(int64_t) == 8); +ufbx_static_assert(sizeof_u8, sizeof(uint8_t) == 1); +ufbx_static_assert(sizeof_u16, sizeof(uint16_t) == 2); +ufbx_static_assert(sizeof_u32, sizeof(uint32_t) == 4); +ufbx_static_assert(sizeof_u64, sizeof(uint64_t) == 8); +ufbx_static_assert(sizeof_f32, sizeof(float) == 4); +ufbx_static_assert(sizeof_f64, sizeof(double) == 8); + +// -- Architecture + +#if !defined(UFBX_STANDARD_C) && (defined(_MSC_VER) && defined(_M_X64)) || ((defined(__GNUC__) || defined(__clang__)) && defined(__x86_64__)) || defined(UFBX_USE_SSE) + #define UFBXI_HAS_SSE 1 + #include + #include +#else + #define UFBXI_HAS_SSE 0 +#endif + +#if !defined(UFBX_LITTLE_ENDIAN) + #if !defined(UFBX_STANDARD_C) && (defined(_M_IX86) || defined(__i386__) || defined(_M_X64) || defined(__x86_64__) || defined(_M_ARM64) || defined(__aarch64__) || defined(__wasm__) || defined(__EMSCRIPTEN__)) + #define UFBX_LITTLE_ENDIAN 1 + #else + #define UFBX_LITTLE_ENDIAN 0 + #endif +#endif + +// -- Fast copy + +#if UFBXI_HAS_SSE + #define ufbxi_copy_16_bytes(dst, src) _mm_storeu_si128((__m128i*)(dst), _mm_loadu_si128((const __m128i*)(src))) +#elif defined(UFBXI_HAS_UNALIGNED) + #define ufbxi_copy_16_bytes(dst, src) do { \ + ufbxi_unaligned ufbxi_unaligned_u64 *mi_dst = (ufbxi_unaligned ufbxi_unaligned_u64 *)(dst); \ + const ufbxi_unaligned ufbxi_unaligned_u64 *mi_src = (const ufbxi_unaligned ufbxi_unaligned_u64 *)src; \ + mi_dst[0] = mi_src[0]; \ + mi_dst[1] = mi_src[1]; \ + } while (0) +#else + #define ufbxi_copy_16_bytes(dst, src) memcpy((dst), (src), 16) +#endif + + +// -- Large fast integer + +#if !defined(UFBX_STANDARD_C) && (defined(__wasm__) || defined(__EMSCRIPTEN__)) && !defined(UFBX_WASM_32BIT) + typedef uint64_t ufbxi_fast_uint; +#else + typedef size_t ufbxi_fast_uint; +#endif + +// -- Wrapping right shift + +#if !defined(UFBX_STANDARD_C) && defined(_MSC_VER) && defined(_M_X64) + #define ufbxi_wrap_shr64(a, b) ((a) >> (b)) +#else + #define ufbxi_wrap_shr64(a, b) ((a) >> ((b) & 63)) +#endif + +// -- Atomic counter + +#define UFBXI_THREAD_SAFE 1 + +#if defined(__cplusplus) + #define ufbxi_extern_c extern "C" +#else + #define ufbxi_extern_c +#endif + +#if !defined(UFBX_STANDARD_C) && (defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER)) + typedef size_t ufbxi_atomic_counter; + #define ufbxi_atomic_counter_init(ptr) (*(ptr) = 0) + #define ufbxi_atomic_counter_free(ptr) (*(ptr) = 0) + #define ufbxi_atomic_counter_inc(ptr) __sync_fetch_and_add((ptr), 1) + #define ufbxi_atomic_counter_dec(ptr) __sync_fetch_and_sub((ptr), 1) +#elif !defined(UFBX_STANDARD_C) && defined(_MSC_VER) + #if defined(_M_X64) || defined(_M_ARM64) + ufbxi_extern_c __int64 _InterlockedIncrement64(__int64 volatile * lpAddend); + ufbxi_extern_c __int64 _InterlockedDecrement64(__int64 volatile * lpAddend); + typedef volatile __int64 ufbxi_atomic_counter; + #define ufbxi_atomic_counter_init(ptr) (*(ptr) = 0) + #define ufbxi_atomic_counter_free(ptr) (*(ptr) = 0) + #define ufbxi_atomic_counter_inc(ptr) ((size_t)_InterlockedIncrement64(ptr) - 1) + #define ufbxi_atomic_counter_dec(ptr) ((size_t)_InterlockedDecrement64(ptr) + 1) + #else + ufbxi_extern_c long _InterlockedIncrement(long volatile * lpAddend); + ufbxi_extern_c long _InterlockedDecrement(long volatile * lpAddend); + typedef volatile long ufbxi_atomic_counter; + #define ufbxi_atomic_counter_init(ptr) (*(ptr) = 0) + #define ufbxi_atomic_counter_free(ptr) (*(ptr) = 0) + #define ufbxi_atomic_counter_inc(ptr) ((size_t)_InterlockedIncrement(ptr) - 1) + #define ufbxi_atomic_counter_dec(ptr) ((size_t)_InterlockedDecrement(ptr) + 1) + #endif +#elif !defined(UFBX_STANDARD_C) && defined(__TINYC__) + #if defined(__x86_64__) || defined(_AMD64_) + static size_t ufbxi_tcc_atomic_add(volatile size_t *dst, size_t value) { + __asm__ __volatile__("lock; xaddq %0, %1;" : "+r" (value), "=m" (*dst) : "m" (dst)); + return value; + } + #elif defined(__i386__) || defined(_X86_) + static size_t ufbxi_tcc_atomic_add(volatile size_t *dst, size_t value) { + __asm__ __volatile__("lock; xaddl %0, %1;" : "+r" (value), "=m" (*dst) : "m" (dst)); + return value; + } + #else + #error Unexpected TCC architecture + #endif + typedef volatile size_t ufbxi_atomic_counter; + #define ufbxi_atomic_counter_init(ptr) (*(ptr) = 0) + #define ufbxi_atomic_counter_free(ptr) (*(ptr) = 0) + #define ufbxi_atomic_counter_inc(ptr) ufbxi_tcc_atomic_add((ptr), 1) + #define ufbxi_atomic_counter_dec(ptr) ufbxi_tcc_atomic_add((ptr), SIZE_MAX) +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #include + #include + typedef struct { alignas(std::atomic_size_t) char data[sizeof(std::atomic_size_t)]; } ufbxi_atomic_counter; + #define ufbxi_atomic_counter_init(ptr) (new (&(ptr)->data) std::atomic_size_t(0)) + #define ufbxi_atomic_counter_free(ptr) (((std::atomic_size_t*)(ptr)->data)->~atomic_size_t()) + #define ufbxi_atomic_counter_inc(ptr) ((std::atomic_size_t*)(ptr)->data)->fetch_add(1) + #define ufbxi_atomic_counter_dec(ptr) ((std::atomic_size_t*)(ptr)->data)->fetch_sub(1) +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_ATOMICS__) + #include + typedef volatile atomic_size_t ufbxi_atomic_counter; + #define ufbxi_atomic_counter_init(ptr) atomic_init(ptr, 0) + #define ufbxi_atomic_counter_free(ptr) (void)0 + #define ufbxi_atomic_counter_inc(ptr) atomic_fetch_add((ptr), 1) + #define ufbxi_atomic_counter_dec(ptr) atomic_fetch_sub((ptr), 1) +#else + typedef volatile size_t ufbxi_atomic_counter; + #define ufbxi_atomic_counter_init(ptr) (*(ptr) = 0) + #define ufbxi_atomic_counter_free(ptr) (*(ptr) = 0) + #define ufbxi_atomic_counter_inc(ptr) ((*(ptr))++) + #define ufbxi_atomic_counter_dec(ptr) ((*(ptr))--) + #undef UFBXI_THREAD_SAFE + #define UFBXI_THREAD_SAFE 0 +#endif + +// -- Bit manipulation + +#if !defined(UFBX_STANDARD_C) && defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) + ufbxi_extern_c unsigned char _BitScanReverse(unsigned long * _Index, unsigned long _Mask); + ufbxi_extern_c unsigned char _BitScanReverse64(unsigned long * _Index, unsigned __int64 _Mask); + static ufbxi_forceinline ufbxi_unused uint32_t ufbxi_lzcnt64(uint64_t v) { + unsigned long index; + #if defined(_M_X64) + _BitScanReverse64(&index, (unsigned __int64)v); + #else + uint32_t hi = (uint32_t)(v >> 32u); + uint32_t hi_nonzero = hi != 0 ? 1 : 0; + uint32_t part = hi_nonzero ? hi : (uint32_t)v; + _BitScanReverse(&index, (unsigned long)part); + index += hi_nonzero * 32u; + #endif + return 63 - (uint32_t)index; + } +#elif !defined(UFBX_STANDARD_C) && (defined(__GNUC__) || defined(__clang__)) + #define ufbxi_lzcnt64(v) ((uint32_t)__builtin_clzll((unsigned long long)(v))) +#else + // DeBrujin table lookup + static const uint8_t ufbxi_lzcnt_table[] = { + 63, 16, 62, 7, 15, 36, 61, 3, 6, 14, 22, 26, 35, 47, 60, 2, 9, 5, 28, 11, 13, 21, 42, + 19, 25, 31, 34, 40, 46, 52, 59, 1, 17, 8, 37, 4, 23, 27, 48, 10, 29, 12, 43, 20, 32, 41, + 53, 18, 38, 24, 49, 30, 44, 33, 54, 39, 50, 45, 55, 51, 56, 57, 58, 0, + }; + static ufbxi_noinline ufbxi_unused uint32_t ufbxi_lzcnt64(uint64_t v) { + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v |= v >> 32; + return ufbxi_lzcnt_table[(v * UINT64_C(0x03f79d71b4cb0a89)) >> 58]; + } +#endif + +// By default enough to have squares be non-denormal +#ifndef UFBX_EPSILON +#define UFBX_EPSILON (sizeof(ufbx_real) == sizeof(float) ? \ + (ufbx_real)1.0842021795674597e-19f : (ufbx_real)1.4916681462400413e-154) +#endif + +// -- Version + +#define UFBX_SOURCE_VERSION ufbx_pack_version(0, 3, 1) +const uint32_t ufbx_source_version = UFBX_SOURCE_VERSION; + +ufbx_static_assert(source_header_version, UFBX_SOURCE_VERSION/1000u == UFBX_HEADER_VERSION/1000u); + +// -- Debug + +#if defined(UFBX_DEBUG_BINARY_SEARCH) || defined(UFBX_REGRESSION) + #define ufbxi_clamp_linear_threshold(v) (2) +#else + #define ufbxi_clamp_linear_threshold(v) (v) +#endif + +#if defined(UFBX_REGRESSION) + #undef UFBXI_MAX_SKIP_SIZE + #define UFBXI_MAX_SKIP_SIZE 128 + + #undef UFBXI_MAP_MAX_SCAN + #define UFBXI_MAP_MAX_SCAN 2 + + #undef UFBXI_KD_FAST_DEPTH + #define UFBXI_KD_FAST_DEPTH 2 + + #undef UFBXI_FACE_GROUP_HASH_BITS + #define UFBXI_FACE_GROUP_HASH_BITS 2 +#endif + +#if defined(UFBX_REGRESSION) + #define ufbxi_regression_assert(cond) ufbx_assert(cond) +#else + #define ufbxi_regression_assert(cond) (void)0 +#endif + +#if defined(UFBX_REGRESSION) || defined(UFBX_DEV) + #define ufbxi_dev_assert(cond) ufbx_assert(cond) +#else + #define ufbxi_dev_assert(cond) (void)0 +#endif + +#if defined(UFBX_REGRESSION) + #define UFBXI_IS_REGRESSION 1 +#else + #define UFBXI_IS_REGRESSION 0 +#endif + +#if defined(_MSC_VER) + #define ufbxi_thread_local __declspec(thread) +#elif defined(__GNUC__) || defined(__clang__) + #define ufbxi_thread_local __thread +#elif UFBXI_HAS_CPP11 + #define ufbxi_thread_local thread_local +#elif UFBX_STDC >= 201112L + #define ufbxi_thread_local _Thread_local +#endif + +#if defined(UFBXI_ANALYSIS_RECURSIVE) + #define ufbxi_recursive_function(m_ret, m_name, m_args, m_max_depth, m_params) UFBXI_RECURSIVE_FUNCTION(m_name, m_max_depth); + #define ufbxi_recursive_function_void(m_name, m_args, m_max_depth, m_params) UFBXI_RECURSIVE_FUNCTION(m_name, m_max_depth); +#elif UFBXI_IS_REGRESSION && defined(ufbxi_thread_local) + #define ufbxi_recursive_function(m_ret, m_name, m_args, m_max_depth, m_params) \ + { \ + m_ret m_name##_rec m_params; \ + static ufbxi_thread_local unsigned ufbxi_recursion_depth; \ + ufbx_assert(ufbxi_recursion_depth < m_max_depth); \ + ++ufbxi_recursion_depth; \ + m_ret ret = m_name##_rec m_args; \ + --ufbxi_recursion_depth; \ + return ret; \ + } \ + m_ret m_name##_rec m_params + #define ufbxi_recursive_function_void(m_name, m_args, m_max_depth, m_params) \ + { \ + void m_name##_rec m_params; \ + static ufbxi_thread_local unsigned ufbxi_recursion_depth; \ + ufbx_assert(ufbxi_recursion_depth < m_max_depth); \ + ++ufbxi_recursion_depth; \ + m_name##_rec m_args; \ + --ufbxi_recursion_depth; \ + } \ + void m_name##_rec m_params +#else + #define ufbxi_recursive_function(m_ret, m_name, m_args, m_max_depth, m_params) + #define ufbxi_recursive_function_void(m_name, m_args, m_max_depth, m_params) +#endif + +// -- Utility + +#if defined(UFBX_UBSAN) + static void ufbxi_assert_zero(size_t offset) { ufbx_assert(offset == 0); } + #define ufbxi_add_ptr(ptr, offset) ((ptr) ? (ptr) + (offset) : (ufbxi_assert_zero((size_t)(offset)), (ptr))) +#else + #define ufbxi_add_ptr(ptr, offset) ((ptr) + (offset)) +#endif + +#define ufbxi_arraycount(arr) (sizeof(arr) / sizeof(*(arr))) +#define ufbxi_for(m_type, m_name, m_begin, m_num) for (m_type *m_name = m_begin, *m_name##_end = ufbxi_add_ptr(m_name, m_num); m_name != m_name##_end; m_name++) +#define ufbxi_for_ptr(m_type, m_name, m_begin, m_num) for (m_type **m_name = m_begin, **m_name##_end = ufbxi_add_ptr(m_name, m_num); m_name != m_name##_end; m_name++) + +// WARNING: Evaluates `m_list` twice! +#define ufbxi_for_list(m_type, m_name, m_list) for (m_type *m_name = (m_list).data, *m_name##_end = ufbxi_add_ptr(m_name, (m_list).count); m_name != m_name##_end; m_name++) +#define ufbxi_for_ptr_list(m_type, m_name, m_list) for (m_type **m_name = (m_list).data, **m_name##_end = ufbxi_add_ptr(m_name, (m_list).count); m_name != m_name##_end; m_name++) + +#define ufbxi_string_literal(str) { str, sizeof(str) - 1 } + +static ufbxi_forceinline uint32_t ufbxi_min32(uint32_t a, uint32_t b) { return a < b ? a : b; } +static ufbxi_forceinline uint32_t ufbxi_max32(uint32_t a, uint32_t b) { return a < b ? b : a; } +static ufbxi_forceinline uint64_t ufbxi_min64(uint64_t a, uint64_t b) { return a < b ? a : b; } +static ufbxi_forceinline uint64_t ufbxi_max64(uint64_t a, uint64_t b) { return a < b ? b : a; } +static ufbxi_forceinline size_t ufbxi_min_sz(size_t a, size_t b) { return a < b ? a : b; } +static ufbxi_forceinline size_t ufbxi_max_sz(size_t a, size_t b) { return a < b ? b : a; } +static ufbxi_forceinline ufbx_real ufbxi_min_real(ufbx_real a, ufbx_real b) { return a < b ? a : b; } +static ufbxi_forceinline ufbx_real ufbxi_max_real(ufbx_real a, ufbx_real b) { return a < b ? b : a; } + +static ufbxi_forceinline int32_t ufbxi_f64_to_i32(double value) +{ + if (ufbx_fabs(value) <= (double)INT32_MAX) { + return (int32_t)value; + } else { + return value >= 0.0 ? INT32_MAX : INT32_MIN; + } +} + +static ufbxi_forceinline int64_t ufbxi_f64_to_i64(double value) +{ + if (ufbx_fabs(value) <= (double)INT64_MAX) { + return (int64_t)value; + } else { + return value >= 0.0 ? INT64_MAX : INT64_MIN; + } +} + +#if defined(UFBX_REGRESSION) + static size_t ufbxi_to_size(ptrdiff_t delta) { + ufbx_assert(delta >= 0); + return (size_t)delta; + } +#else + #define ufbxi_to_size(delta) ((size_t)(delta)) +#endif + +// Stable sort array `m_type m_data[m_size]` using the predicate `m_cmp_lambda(a, b)` +// `m_linear_size` is a hint for how large blocks handle initially do with insertion sort +// `m_tmp` must be a memory buffer with at least the same size and alignment as `m_data` +#define ufbxi_macro_stable_sort(m_type, m_linear_size, m_data, m_tmp, m_size, m_cmp_lambda) do { \ + typedef m_type mi_type; \ + mi_type *mi_src = (mi_type*)(m_tmp); \ + mi_type *mi_data = m_data, *mi_dst = mi_data; \ + size_t mi_block_size = ufbxi_clamp_linear_threshold(m_linear_size), mi_size = m_size; \ + /* Insertion sort in `m_linear_size` blocks */ \ + for (size_t mi_base = 0; mi_base < mi_size; mi_base += mi_block_size) { \ + size_t mi_i_end = mi_base + mi_block_size; \ + if (mi_i_end > mi_size) mi_i_end = mi_size; \ + for (size_t mi_i = mi_base + 1; mi_i < mi_i_end; mi_i++) { \ + size_t mi_j = mi_i; \ + mi_src[0] = mi_dst[mi_i]; \ + for (; mi_j != mi_base; --mi_j) { \ + mi_type *a = &mi_src[0], *b = &mi_dst[mi_j - 1]; \ + if (!( m_cmp_lambda )) break; \ + mi_dst[mi_j] = mi_dst[mi_j - 1]; \ + } \ + mi_dst[mi_j] = mi_src[0]; \ + } \ + } \ + /* Merge sort ping-ponging between `m_data` and `m_tmp` */ \ + for (; mi_block_size < mi_size; mi_block_size *= 2) { \ + mi_type *mi_swap = mi_dst; mi_dst = mi_src; mi_src = mi_swap; \ + for (size_t mi_base = 0; mi_base < mi_size; mi_base += mi_block_size * 2) { \ + size_t mi_i = mi_base, mi_i_end = mi_base + mi_block_size; \ + size_t mi_j = mi_i_end, mi_j_end = mi_j + mi_block_size; \ + size_t mi_k = mi_base; \ + if (mi_i_end > mi_size) mi_i_end = mi_size; \ + if (mi_j_end > mi_size) mi_j_end = mi_size; \ + while ((mi_i < mi_i_end) & (mi_j < mi_j_end)) { \ + mi_type *a = &mi_src[mi_j], *b = &mi_src[mi_i]; \ + if ( m_cmp_lambda ) { \ + mi_dst[mi_k] = *a; mi_j++; \ + } else { \ + mi_dst[mi_k] = *b; mi_i++; \ + } \ + mi_k++; \ + } \ + while (mi_i < mi_i_end) mi_dst[mi_k++] = mi_src[mi_i++]; \ + while (mi_j < mi_j_end) mi_dst[mi_k++] = mi_src[mi_j++]; \ + } \ + } \ + /* Copy the result to `m_data` if we ended up in `m_tmp` */ \ + if (mi_dst != mi_data) memcpy((void*)mi_data, mi_dst, sizeof(mi_type) * mi_size); \ + } while (0) + +#define ufbxi_macro_lower_bound_eq(m_type, m_linear_size, m_result_ptr, m_data, m_begin, m_size, m_cmp_lambda, m_eq_lambda) do { \ + typedef m_type mi_type; \ + const mi_type *mi_data = (m_data); \ + size_t mi_lo = m_begin, mi_hi = m_size, mi_linear_size = ufbxi_clamp_linear_threshold(m_linear_size); \ + ufbx_assert(mi_linear_size > 1); \ + /* Binary search until we get down to `m_linear_size` elements */ \ + while (mi_hi - mi_lo > mi_linear_size) { \ + size_t mi_mid = mi_lo + (mi_hi - mi_lo) / 2; \ + const mi_type *a = &mi_data[mi_mid]; \ + if ( m_cmp_lambda ) { mi_lo = mi_mid + 1; } else { mi_hi = mi_mid + 1; } \ + } \ + /* Linearly scan until we find the edge */ \ + for (; mi_lo < mi_hi; mi_lo++) { \ + const mi_type *a = &mi_data[mi_lo]; \ + if ( m_eq_lambda ) { *(m_result_ptr) = mi_lo; break; } \ + } \ + } while (0) + +#define ufbxi_macro_upper_bound_eq(m_type, m_linear_size, m_result_ptr, m_data, m_begin, m_size, m_eq_lambda) do { \ + typedef m_type mi_type; \ + const mi_type *mi_data = (m_data); \ + size_t mi_lo = m_begin, mi_hi = m_size, mi_linear_size = ufbxi_clamp_linear_threshold(m_linear_size); \ + ufbx_assert(mi_linear_size > 1); \ + /* Linearly scan with galloping */ \ + for (size_t mi_step = 1; mi_step < 100 && mi_hi - mi_lo > mi_step; mi_step *= 2) { \ + const mi_type *a = &mi_data[mi_lo + mi_step]; \ + if (!( m_eq_lambda )) { mi_hi = mi_lo + mi_step; break; } \ + mi_lo += mi_step; \ + } \ + /* Binary search until we get down to `m_linear_size` elements */ \ + while (mi_hi - mi_lo > mi_linear_size) { \ + size_t mi_mid = mi_lo + (mi_hi - mi_lo) / 2; \ + const mi_type *a = &mi_data[mi_mid]; \ + if ( m_eq_lambda ) { mi_lo = mi_mid + 1; } else { mi_hi = mi_mid + 1; } \ + } \ + /* Linearly scan until we find the edge */ \ + for (; mi_lo < mi_hi; mi_lo++) { \ + const mi_type *a = &mi_data[mi_lo]; \ + if (!( m_eq_lambda )) break; \ + } \ + *(m_result_ptr) = mi_lo; \ + } while (0) + +typedef bool ufbxi_less_fn(void *user, const void *a, const void *b); + +static ufbxi_noinline void ufbxi_stable_sort(size_t stride, size_t linear_size, void *in_data, void *in_tmp, size_t size, ufbxi_less_fn *less_fn, void *less_user) +{ + (void)linear_size; + + char *src = (char*)in_tmp; + char *data = (char*)in_data, *dst = (char*)data; + size_t block_size = ufbxi_clamp_linear_threshold(linear_size); + /* Insertion sort in `linear_size` blocks */ + for (size_t base = 0; base < size; base += block_size) { + size_t i_end = base + block_size; + if (i_end > size) i_end = size; + for (size_t i = base + 1; i < i_end; i++) { + + { + char *a = dst + i * stride, *b = dst + (i - 1) * stride; + if (!less_fn(less_user, a, b)) continue; + } + + size_t j = i - 1; + memcpy(src, dst + i * stride, stride); + memcpy(dst + i * stride, dst + j * stride, stride); + for (; j != base; --j) { + char *a = src, *b = dst + (j - 1) * stride; + if (!less_fn(less_user, a, b)) break; + memcpy(dst + j * stride, dst + (j - 1) * stride, stride); + } + memcpy(dst + j * stride, src, stride); + } + } + /* Merge sort ping-ponging between `data` and `tmp` */ + for (; block_size < size; block_size *= 2) { + char *swap = dst; dst = src; src = swap; + for (size_t base = 0; base < size; base += block_size * 2) { + size_t i = base, i_end = base + block_size; + size_t j = i_end, j_end = j + block_size; + size_t k = base; + if (i_end > size) i_end = size; + if (j_end > size) j_end = size; + while ((i < i_end) & (j < j_end)) { + char *a = src + j * stride, *b = src + i * stride; + if (less_fn(less_user, a, b)) { + memcpy(dst + k * stride, a, stride); + j++; + } else { + memcpy(dst + k * stride, b, stride); + i++; + } + k++; + } + + memcpy(dst + k * stride, src + i * stride, (i_end - i) * stride); + if (j < j_end) { + memcpy(dst + (k + (i_end - i)) * stride, src + j * stride, (j_end - j) * stride); + } + } + } + /* Copy the result to `data` if we ended up in `tmp` */ + if (dst != data) memcpy((void*)data, dst, size * stride); +} + +// -- Float parsing +// +// Custom float parsing that handles floats up to (-)ddddddddddddddddddd.ddddddddddddddddddd +// If larger or scientific notation is used then it defers to `strtod()`. +// For the algorithm we need 128-bit division that is either provided by hardware on x64 or +// a custom implementation below. + +#if !defined(UFBX_STANDARD_C) && UFBXI_MSC_VER >= 1920 && defined(_M_X64) && !defined(__clang__) + ufbxi_extern_c extern unsigned __int64 __cdecl _udiv128(unsigned __int64 highdividend, + unsigned __int64 lowdividend, unsigned __int64 divisor, unsigned __int64 *remainder); + #define ufbxi_div128(a_hi, a_lo, b, p_rem) (_udiv128((a_hi), (a_lo), (b), (p_rem))) +#elif !defined(UFBX_STANDARD_C) && (defined(__GNUC__) || defined(__clang__)) && (defined(__x86_64__) || defined(_M_X64)) + static ufbxi_forceinline uint64_t ufbxi_div128(uint64_t a_hi, uint64_t a_lo, uint64_t b, uint64_t *p_rem) { + uint64_t quot, rem; + __asm__("divq %[v]" : "=a"(quot), "=d"(rem) : [v] "r"(b), "a"(a_lo), "d"(a_hi)); + *p_rem = rem; + return quot; + } +#else + static ufbxi_forceinline uint64_t ufbxi_div128(uint64_t a_hi, uint64_t a_lo, uint64_t b, uint64_t *p_rem) { + // Divide `(a_hi << 64 | a_lo)` by `b`, returns quotinent and stores reminder in `p_rem`. + // Based on TAOCP 2.4 multi-word division single algorithm digit step. + // + // Notation: + // b is the base (2^32) in this case + // aN is the Nth digit (base b) of a from the least significant digit + // { x y z } is a multi-digit number b^2*x + b*y + z + // ie. for a 64-bit number a = { a1 a0 } = b*a1 + a0 + // + // We do the division in two steps by dividing three digits in each iteration: + // + // q1, r = { a3 a2 a1 } / { b1 b0 } + // q0, r = { r1 r0 a0 } / { b1 b0 } + // + // In each step we want to compute the expression: + // + // q, r = { u2 u1 u0 } / { v1 v0 } + // + // However we cannot rely on being able to do `u96 / u64` division we estimate + // the result by considering only the leading digits: + // + // q^ = { u2 u1 } / v1 [A] + // r^ = { u2 u1 } % v1 = { u2 u1 } - v1 * q^ [B] + // + // As long as `v1 >= b/2` the estimate `q^` is at most two larger than the actual `q` + // (proof in TAOCP 2.4) so we can compute the correction amount `c`: + // + // q <= q^ <= q + 2 + // q = q^ - c [C] + // + // We can compute the final remainder (that must be non-negative) as follows: + // + // r = { u2 u1 u0 } - v*q + // r = { u2 u1 u0 } - v*(q^ - c) + // r = { u2 u1 u0 } - v*q^ + v*c + // r = { u2 u1 u0 } - { v1 v0 } * q^ + v*c + // r = b^2*u2 + b*u1 + u0 - b*v1*q^ - v0*q^ + v*c + // r = b*(b*u2 + u1 - v1*q^) + u0 - v0*q^ + v*c + // r = b*({ u2 u1 } - v1*q^) + u0 - v0*q^ + v*c + // r = b*r^ + u0 - v0*q^ + v*c + // r = { r^ u0 } - v0*q^ + v*c [D] + // + // As we know `0 <= c <= 2` we can first check if `r < 0` requiring `c >= 1`: + // + // { r^ u0 } - v0*q^ < 0 + // { r^ u0 } < v0*q^ [E] + // + // If we know that `r < 0` we can check if `r < -v` requiring `c = 2`: + // + // { r^ u0 } - v0*q^ < -v + // v0*q^ - { r^ u0 } > v [F] + // + + // First we need to make sure `v1 >= b/2`, we can do this by multiplying the whole + // expression by `2^shift` so that the high bit of `v` is set. + uint32_t shift = ufbxi_lzcnt64(b); + a_hi = (a_hi << shift) | (shift ? a_lo >> (64 - shift) : 0); + a_lo <<= shift; + b <<= shift; + + uint64_t v = b; + uint32_t v1 = (uint32_t)(v >> 32); + uint32_t v0 = (uint32_t)(v); + uint64_t q1, q0, r; + + // q1, r = { a3 a2 a1 } / { b1 b0 } + { + uint64_t u2_u1 = a_hi; + uint32_t u0 = (uint32_t)(a_lo >> 32u); + + uint64_t qh = u2_u1 / v1; // q^ = { u2 u1 } / v1 [A] + uint64_t rh = u2_u1 % v1; // r^ = { u2 u1 } % v1 [B] + uint64_t rh_u0 = rh << 32u | u0; // { r^ u0 } + uint64_t v0qh = v0 * qh; // v0*q^ + uint32_t c = rh_u0 < v0qh ? 1 : 0; // { r^ u0 } < v0*q^ [E] + c += c & (v0qh - rh_u0 > v ? 1 : 0); // v0*q^ - { r^ u0 } > v [F] + q1 = qh - c; // q1 = q^ - c [C] + r = rh_u0 - v0qh + v*c; // r = { r^ u0 } - v0*q^ + v*c [D] + } + + // q0, r = { r1 r0 a0 } / { b1 b0 } + { + uint64_t u2_u1 = r; + uint32_t u0 = (uint32_t)a_lo; + + uint64_t qh = u2_u1 / v1; // q^ = { u2 u1 } / v1 [A] + uint64_t rh = u2_u1 % v1; // r^ = { u2 u1 } % v1 [B] + uint64_t rh_u0 = rh << 32u | u0; // { r^ u0 } + uint64_t v0qh = v0 * qh; // v0*q^ + uint32_t c = rh_u0 < v0qh ? 1 : 0; // { r^ u0 } < v0*q^ [E] + c += c & (v0qh - rh_u0 > v ? 1 : 0); // v0*q^ - { r^ u0 } > v [F] + q0 = qh - c; // q0 = q^ - c [C] + r = rh_u0 - v0qh + v*c; // r = { r^ u0 } - v0*q^ + v*c [D] + } + + // Un-normalize the remainder and return the quotinent + *p_rem = r >> shift; + return q1 << 32u | q0; + } +#endif + +static const uint64_t ufbxi_pow10_tab[] = { + UINT64_C(1), + UINT64_C(10), + UINT64_C(100), + UINT64_C(1000), + UINT64_C(10000), + UINT64_C(100000), + UINT64_C(1000000), + UINT64_C(10000000), + UINT64_C(100000000), + UINT64_C(1000000000), + UINT64_C(10000000000), + UINT64_C(100000000000), + UINT64_C(1000000000000), + UINT64_C(10000000000000), + UINT64_C(100000000000000), + UINT64_C(1000000000000000), + UINT64_C(10000000000000000), + UINT64_C(100000000000000000), + UINT64_C(1000000000000000000), +}; + +static ufbxi_noinline double ufbxi_parse_double(const char *str, size_t max_length, char **end, bool verify_length) +{ + // TODO: Use this for optimizing digit parsing + (void)max_length; + + uint64_t integer = 0; + uint32_t n_integer = 0; + uint64_t decimals = 0; + uint32_t n_decimals = 0; + bool negative = false; + + const char *p = str; + if (*p == '-') { + negative = true; + p++; + } else if (*p == '+') { + p++; + } + while (((uint32_t)*p - '0') < 10) { + integer = integer * 10 + (uint64_t)(*p++ - '0'); + n_integer++; + } + if (*p == '.') { + p++; + while (((uint32_t)*p - '0') < 10) { + decimals = decimals * 10 + (uint64_t)(*p++ - '0'); + n_decimals++; + } + } + + if (((*p | 0x20) == 'e') || n_decimals >= 19 || n_integer >= 19) { + if (verify_length) { + size_t len; + for (len = 0; len < max_length; len++) { + char c = str[len]; + if (!((c >= '0' && c <= '9') || (c|0x20) == 'e' || c == '-' || c == '+')) { + break; + } + } + if (len == max_length) { + *end = NULL; + return 0.0; + } + } + + return strtod(str, end); + } + *end = (char*)p; + + if (!decimals) { + return (negative ? -1.0 : 1.0) * (double)integer; + } + + uint64_t divisor = ufbxi_pow10_tab[n_decimals]; + + uint64_t b_int = integer; + uint32_t n_int = b_int ? 64 - ufbxi_lzcnt64(b_int) : 0; + + uint64_t rem_hi, rem_lo; + uint64_t b_hi = ufbxi_div128(decimals, 0, divisor, &rem_hi); + ufbxi_regression_assert(b_hi > 0); // 1 * 2^64 / 10^18 >= 1 + uint32_t n_hi = 64 - ufbxi_lzcnt64(b_hi); + + int32_t exponent; + uint64_t mantissa; + bool nonzero_tail; + if (b_int) { + mantissa = b_int << (64u - n_int) | (b_hi >> n_int); + nonzero_tail = (b_hi << (64u - n_int) | rem_hi) != 0; + exponent = (int32_t)n_int - 1; + } else if (n_hi >= 54) { + mantissa = b_hi << (64u - n_hi); + nonzero_tail = rem_hi != 0; + exponent = (int32_t)n_hi - 65; + } else { + uint64_t b_lo = ufbxi_div128(rem_hi, 0, divisor, &rem_lo); + mantissa = b_hi << (64u - n_hi) | (b_lo >> n_hi); + nonzero_tail = (b_lo << (64u - n_hi) | rem_lo) != 0; + exponent = (int32_t)n_hi - 65; + } + + bool r_odd = mantissa & (1 << 11u); + bool r_round = mantissa & (1 << 10u); + bool r_tail = (mantissa & ((1 << 10u) - 1)) != 0 || nonzero_tail; + + uint64_t round = (r_round && (r_odd || r_tail)) ? 1u : 0u; + + uint64_t bits + = (uint64_t)negative << 63u + | (uint64_t)(exponent + 1023) << 52u + | ((mantissa >> 11u) & ~(UINT64_C(1) << 52u)); + bits += round; + + // Type punning via unions is safe in C but in C++ the only safe way + // (pre std::bit_cast) is to use `memcpy()` and hope it gets optimized out. +#if defined(__cplusplus) + double result; + memcpy(&result, &bits, 8); + return result; +#else + union { uint64_t u; double d; } u_to_d; + u_to_d.u = bits; + return u_to_d.d; +#endif +} + +// -- DEFLATE implementation + +#if !defined(ufbx_inflate) + +// Lookup data: [0:5] extra bits [5:8] flags [16:32] base value +// Generated by `misc/deflate_lut.py` +static const uint32_t ufbxi_deflate_length_lut[] = { + 0x00000020, 0x00030040, 0x00040040, 0x00050040, 0x00060040, 0x00070040, 0x00080040, 0x00090040, + 0x000a0040, 0x000b0041, 0x000d0041, 0x000f0041, 0x00110041, 0x00130042, 0x00170042, 0x001b0042, + 0x001f0042, 0x00230043, 0x002b0043, 0x00330043, 0x003b0043, 0x00430044, 0x00530044, 0x00630044, + 0x00730044, 0x00830045, 0x00a30045, 0x00c30045, 0x00e30045, 0x01020040, 0x00010020, 0x00010020, +}; +static const uint32_t ufbxi_deflate_dist_lut[] = { + 0x00010000, 0x00020000, 0x00030000, 0x00040000, 0x00050001, 0x00070001, 0x00090002, 0x000d0002, + 0x00110003, 0x00190003, 0x00210004, 0x00310004, 0x00410005, 0x00610005, 0x00810006, 0x00c10006, + 0x01010007, 0x01810007, 0x02010008, 0x03010008, 0x04010009, 0x06010009, 0x0801000a, 0x0c01000a, + 0x1001000b, 0x1801000b, 0x2001000c, 0x3001000c, 0x4001000d, 0x6001000d, 0x00010020, 0x00010020, +}; + +static const uint8_t ufbxi_deflate_code_length_permutation[] = { + 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15, +}; + +#define UFBXI_INFLATE_FAST_MIN_IN 8 +#define UFBXI_INFLATE_FAST_MIN_OUT 2 + +#define UFBXI_HUFF_MAX_BITS 16 +#define UFBXI_HUFF_MAX_VALUE 288 +#define UFBXI_HUFF_FAST_BITS 10 +#define UFBXI_HUFF_FAST_SIZE (1 << UFBXI_HUFF_FAST_BITS) +#define UFBXI_HUFF_FAST_MASK (UFBXI_HUFF_FAST_SIZE - 1) +#define UFBXI_HUFF_MAX_LONG_BITS 5 +#define UFBXI_HUFF_MAX_LONG_SYMS 380 + +#define UFBXI_HUFF_CODELEN_FAST_BITS 8 +#define UFBXI_HUFF_CODELEN_FAST_MASK ((1<0] Base offset (halved) to `long_sym[]` +// [8:16] code_prefix // [fast_sym, fast=0, extra_mask=0] First 8-bits of the code (reverse of the lookup) +// +// (*1) Not allowing `end` if `fast` serves a dual purpose: It allows us to omit a check for the end symbol in the +// fast path and allows using the symbol as a 64-bit shift amount (x64/ARM64/WASM have native modulo 64 shifts). +// +// Valid bit patterns, all other patterns are forbidden (`sorted_to_sym[]` contains same patterns as `long_sym[]`): +// +// tree b e m f v +// +// lit_length.fast_sym[] N 0 0 1 L // Short N bit code (no extra allowed) for literal byte L +// lit_length.fast_sym[] N 0 1 1 I // Short N bit code (huff+extra bits) for length index I +// lit_length.fast_sym[] M 0 0 0 X // Long code at `lit_length.long_sym[X*2 + ((bits>>FAST_BITS) & M)]` +// lit_length.fast_sym[] 0 0 0 0 R // Extra long code with prefix R, use `lit_length.sorted_to_sym[]` to resolve (*1) +// lit_length.fast_sym[] N 1 0 0 0 // Short N bit code for end-of-block (256) symbol +// lit_length.fast_sym[] 0 1 0 0 1 // Invalid lit_length code +// +// lit_length.long_sym[] N 0 0 0 L // Long N bit code (no extra allowed) for literal byte L +// lit_length.long_sym[] N 0 1 0 I // Long N bit code (huff+extra bits) for length index I +// lit_length.long_sym[] N 1 0 0 0 // Long N bit code for end-of-block (256) symbol +// lit_length.long_sym[] 0 1 0 0 1 // Invalid lit_length code +// +// dist.fast_sym[] N 0 0 1 L // Short N bit code (huff+extra bits) for distance index I +// dist.fast_sym[] M 0 0 0 X // Long code at `dist.long_sym[X*2 + ((bits>>FAST_BITS) & M)]` +// dist.fast_sym[] 0 0 0 0 R // Extra long code with prefix R, use `dist.sorted_to_sym[]` to resolve (*1) +// dist.fast_sym[] N 1 0 0 1 // Unused symbol 30-31 or invalid distance code +// +// dist.long_sym[] N 0 0 0 I // Long N bit code (huff+extra bits) for distance index I +// dist.long_sym[] N 1 0 0 1 // Unused symbol 30-31 or invalid distance code +// +// code_length.fast_sym[] N 0 0 1 B // Short N bit code (huff only, extra handled explicitly) for symbol bit count B +// code_length.fast_sym[] M 0 0 0 X // Long code at `dist.long_sym[X*2 + ((bits>>FAST_BITS) & M)]` +// code_length.fast_sym[] 0 0 0 0 R // Extra long code with prefix R, use `code_length.sorted_to_sym[]` to resolve (*1) +// +// code_length.long_sym[] N 0 0 0 B // Long N bit code (huff only, extra handled explicitly) for symbol bit count B +// +// (*1) Never necessary if `fast_bits >= 10` due to `long_sym[]` covering all possible codes, +// +typedef uint16_t ufbxi_huff_sym; + +#define ufbxi_huff_sym_total_bits(sym) ((uint32_t)(sym) & 0x1f) +#define ufbxi_huff_sym_long_mask(sym) ((uint32_t)(sym) & 0x1f) +#define ufbxi_huff_sym_long_offset(sym) ((uint32_t)(sym) >> 7u) +#define ufbxi_huff_sym_value(sym) ((uint32_t)(sym) >> 8u) + +enum { + UFBXI_HUFF_SYM_END = 0x20, + UFBXI_HUFF_SYM_MATCH = 0x40, + UFBXI_HUFF_SYM_FAST = 0x80, +}; + +#define UFBXI_HUFF_ERROR_SYM ((ufbxi_huff_sym)0x0120) // Error symbol, END (value 1) +#define UFBXI_HUFF_UNINITIALIZED_SYM ((ufbxi_huff_sym)0x0220) // Uninitialized symbol for regression, END (value 2) + +typedef struct { + ufbxi_huff_sym fast_sym[UFBXI_HUFF_FAST_SIZE]; // < Lookup from N bytes to symbol information + ufbxi_huff_sym long_sym[UFBXI_HUFF_MAX_LONG_SYMS]; // < Fast long symbol lookup + ufbxi_huff_sym sorted_to_sym[UFBXI_HUFF_MAX_VALUE]; // < Symbol information per sorted index + + uint32_t extra_shift_base[UFBXI_HUFF_MAX_EXTRA_SYMS]; // < [0:6] shift [16:32] base value + uint16_t extra_mask[UFBXI_HUFF_MAX_EXTRA_SYMS]; // < Mask for extra bits + + uint16_t past_max_code[UFBXI_HUFF_MAX_BITS]; // < One past maximum code value per bit length + int16_t code_to_sorted[UFBXI_HUFF_MAX_BITS]; // < Code to sorted symbol index per bit length + uint32_t num_symbols; + + uint32_t end_of_block_bits; +} ufbxi_huff_tree; + +typedef struct { + union { + struct { + ufbxi_huff_tree lit_length; + ufbxi_huff_tree dist; + }; + ufbxi_huff_tree trees[2]; + }; + uint32_t fast_bits; +} ufbxi_trees; + +typedef struct { + bool initialized; + ufbxi_trees static_trees; +} ufbxi_inflate_retain_imp; + +ufbx_static_assert(inflate_retain_size, sizeof(ufbxi_inflate_retain_imp) <= sizeof(ufbx_inflate_retain)); + +typedef struct { + ufbxi_bit_stream stream; + uint32_t fast_bits; + + char *out_begin; + char *out_ptr; + char *out_end; +} ufbxi_deflate_context; + +static ufbxi_forceinline uint32_t +ufbxi_bit_reverse(uint32_t mask, uint32_t num_bits) +{ + ufbxi_dev_assert(num_bits <= 16); + uint32_t x = mask; + x = (((x & 0xaaaa) >> 1) | ((x & 0x5555) << 1)); + x = (((x & 0xcccc) >> 2) | ((x & 0x3333) << 2)); + x = (((x & 0xf0f0) >> 4) | ((x & 0x0f0f) << 4)); + x = (((x & 0xff00) >> 8) | ((x & 0x00ff) << 8)); + return x >> (16 - num_bits); +} + +static ufbxi_noinline const char * +ufbxi_bit_chunk_refill(ufbxi_bit_stream *s, const char *ptr) +{ + // Copy any left-over data to the beginning of `buffer` + size_t left = ufbxi_to_size(s->chunk_real_end - ptr); + ufbxi_dev_assert(left < 64); + if (left > 0) memmove(s->buffer, ptr, left); + + s->num_read_before_chunk += ufbxi_to_size(ptr - s->chunk_begin); + + // Read more user data if the user supplied a `read_fn()`, otherwise + // we assume the initial data chunk is the whole input buffer. + if (s->read_fn && !s->cancelled) { + size_t to_read = ufbxi_min_sz(s->input_left, s->buffer_size - left); + if (to_read > 0) { + size_t num_read = s->read_fn(s->read_user, s->buffer + left, to_read); + // TODO: IO error, should unify with (currently broken) cancel logic + if (num_read > to_read) num_read = 0; + ufbxi_dev_assert(s->input_left >= num_read); + s->input_left -= num_read; + left += num_read; + } + } + + // Pad the rest with zeros + if (left < 64) { + memset(s->buffer + left, 0, 64 - left); + left = 64; + } + + s->chunk_begin = s->buffer; + s->chunk_ptr = s->buffer; + s->chunk_end = s->buffer + left - 8; + s->chunk_real_end = s->buffer + left; + return s->buffer; +} + +static ufbxi_noinline void ufbxi_bit_stream_init(ufbxi_bit_stream *s, const ufbx_inflate_input *input) +{ + size_t data_size = input->data_size; + if (data_size > input->total_size) { + data_size = input->total_size; + } + + s->read_fn = input->read_fn; + s->read_user = input->read_user; + s->progress_cb = input->progress_cb; + s->chunk_begin = (const char*)input->data; + s->chunk_ptr = (const char*)input->data; + s->chunk_end = ufbxi_add_ptr((const char*)input->data, ufbxi_max_sz(8, data_size) - 8); + s->chunk_real_end = ufbxi_add_ptr((const char*)input->data, data_size); + s->input_left = input->total_size - data_size; + + // Use the user buffer if it's large enough, otherwise `local_buffer` + if (input->buffer_size > sizeof(s->local_buffer)) { + s->buffer = (char*)input->buffer; + s->buffer_size = input->buffer_size; + } else { + s->buffer = s->local_buffer; + s->buffer_size = sizeof(s->local_buffer); + } + s->num_read_before_chunk = 0; + s->progress_bias = input->progress_size_before; + s->progress_total = input->total_size + input->progress_size_before + input->progress_size_after; + if (!s->progress_cb.fn || input->progress_interval_hint >= SIZE_MAX) { + s->progress_interval = SIZE_MAX; + } else if (input->progress_interval_hint > 0) { + s->progress_interval = (size_t)input->progress_interval_hint; + } else { + s->progress_interval = 0x4000; + } + s->cancelled = false; + + // Clear the initial bit buffer + s->bits = 0; + s->left = 0; + + // If the initial data buffer is not large enough to be read directly + // from refill the chunk once. + if (data_size < 64) { + ufbxi_bit_chunk_refill(s, s->chunk_begin); + } + + if (s->progress_cb.fn && ufbxi_to_size(s->chunk_end - s->chunk_ptr) > s->progress_interval + 8) { + s->chunk_yield = s->chunk_ptr + s->progress_interval; + } else { + s->chunk_yield = s->chunk_end; + } +} + +static ufbxi_noinline const char * +ufbxi_bit_yield(ufbxi_bit_stream *s, const char *ptr) +{ + if (ptr > s->chunk_end) { + ptr = ufbxi_bit_chunk_refill(s, ptr); + } + + if (s->progress_cb.fn) { + size_t num_read = s->num_read_before_chunk + ufbxi_to_size(ptr - s->chunk_begin); + + ufbx_progress progress = { s->progress_bias + num_read, s->progress_total }; + uint32_t result = (uint32_t)s->progress_cb.fn(s->progress_cb.user, &progress); + ufbx_assert(result == UFBX_PROGRESS_CONTINUE || result == UFBX_PROGRESS_CANCEL); + if (result == UFBX_PROGRESS_CANCEL) { + s->cancelled = true; + ptr = s->local_buffer; + s->buffer = s->local_buffer; + s->buffer_size = sizeof(s->local_buffer); + s->chunk_begin = ptr; + s->chunk_ptr = ptr; + s->chunk_end = ptr + sizeof(s->local_buffer) - 8; + s->chunk_real_end = ptr + sizeof(s->local_buffer); + memset(s->local_buffer, 0, sizeof(s->local_buffer)); + } + } + + if (s->progress_cb.fn && ufbxi_to_size(s->chunk_end - ptr) > s->progress_interval + 8) { + s->chunk_yield = ptr + s->progress_interval; + } else { + s->chunk_yield = s->chunk_end; + } + + return ptr; +} + +static ufbxi_forceinline void +ufbxi_bit_refill(uint64_t *p_bits, size_t *p_left, const char **p_data, ufbxi_bit_stream *s) +{ + if (*p_data > s->chunk_yield) { + *p_data = ufbxi_bit_yield(s, *p_data); + if (s->cancelled) { + // Force an end-of-block symbol when cancelled so we don't need an + // extra branch in the chunk decoding loop. + *p_bits = s->cancel_bits; + } + } + + // See https://fgiesen.wordpress.com/2018/02/20/reading-bits-in-far-too-many-ways-part-2/ + // variant 4. This branchless refill guarantees [56,63] bits to be valid in `*p_bits`. + ufbxi_regression_assert(*p_left <= 64); \ + *p_bits |= ufbxi_read_u64(*p_data) << *p_left; + *p_data += (63 - *p_left) >> 3; + *p_left |= 56; +} + +// See `ufbxi_bit_refill()` +#define ufbxi_macro_bit_refill_fast(m_bits, m_left, m_data, m_refill_bits) do { \ + ufbxi_regression_assert(m_left <= 64); \ + m_bits |= m_refill_bits << m_left; \ + m_data += (63 - m_left) >> 3; \ + m_left |= 56; \ + } while (0) + +static ufbxi_noinline int +ufbxi_bit_copy_bytes(void *dst, ufbxi_bit_stream *s, size_t len) +{ + ufbx_assert(s->left % 8 == 0); + char *ptr = (char*)dst; + + // Copy the buffered bits first + while (len > 0 && s->left > 0) { + *ptr++ = (char)(uint8_t)s->bits; + len -= 1; + s->bits >>= 8; + s->left -= 8; + } + + // We need to clear the top bits as there may be data + // read ahead past `s->left` in some cases + s->bits = 0; + + // Copy the current chunk + size_t chunk_left = ufbxi_to_size(s->chunk_real_end - s->chunk_ptr); + if (chunk_left >= len) { + memcpy(ptr, s->chunk_ptr, len); + s->chunk_ptr += len; + return 1; + } else { + memcpy(ptr, s->chunk_ptr, chunk_left); + s->chunk_ptr += chunk_left; + ptr += chunk_left; + len -= chunk_left; + } + + // Read extra bytes from user + if (len > s->input_left) return 0; + size_t num_read = 0; + if (s->read_fn) { + num_read = s->read_fn(s->read_user, ptr, len); + s->input_left -= num_read; + } + return num_read == len; +} + +// 0: Success +// -1: Overfull +// -2: Underfull +static ufbxi_noinline ptrdiff_t +ufbxi_huff_build_imp(ufbxi_huff_tree *tree, uint8_t *sym_bits, uint32_t sym_count, const uint32_t *sym_extra, uint32_t sym_extra_offset, uint32_t fast_bits, uint32_t *bits_counts) +{ + uint32_t fast_mask = (1u << fast_bits) - 1; + + ufbx_assert(sym_count <= UFBXI_HUFF_MAX_VALUE); + tree->num_symbols = sym_count; + + uint32_t nonzero_sym_count = sym_count - bits_counts[0]; + + uint32_t total_syms[UFBXI_HUFF_MAX_BITS]; + uint32_t first_code[UFBXI_HUFF_MAX_BITS]; + + tree->code_to_sorted[0] = INT16_MAX; + tree->past_max_code[0] = 0; + total_syms[0] = 0; + + // Clear to uninitialized symbols + #if defined(UFBX_REGRESSION) + { + for (size_t i = 0; i < UFBXI_HUFF_FAST_SIZE; i++) { + tree->fast_sym[i] = UFBXI_HUFF_UNINITIALIZED_SYM; + } + for (size_t i = 0; i < UFBXI_HUFF_MAX_VALUE; i++) { + tree->sorted_to_sym[i] = UFBXI_HUFF_UNINITIALIZED_SYM; + } + for (size_t i = 0; i < UFBXI_HUFF_MAX_LONG_SYMS; i++) { + tree->long_sym[i] = UFBXI_HUFF_UNINITIALIZED_SYM; + } + } + #endif + + uint32_t last_valid_prefix = 0; + + // Resolve the maximum code per bit length and ensure that the tree is not + // overfull or underfull. + { + int num_codes_left = 1; + uint32_t code = 0; + uint32_t prev_count = 0; + uint32_t long_offset = 0; + for (uint32_t bits = 1; bits < UFBXI_HUFF_MAX_BITS; bits++) { + uint32_t count = bits_counts[bits]; + code = (code + prev_count) << 1; + first_code[bits] = code; + tree->past_max_code[bits] = (uint16_t)(code + count); + + uint32_t prev_syms = total_syms[bits - 1]; + total_syms[bits] = prev_syms + count; + + // Each bit level doubles the amount of codes and potentially removes some + num_codes_left = (num_codes_left << 1) - (int32_t)count; + if (num_codes_left < 0) { + return -1; + } + + if (count > 0 && bits > fast_bits && bits - fast_bits <= UFBXI_HUFF_MAX_LONG_BITS) { + uint32_t shift = bits - fast_bits; + uint32_t last_inclusive = num_codes_left == 0 ? (1u<> shift; + uint32_t last_prefix = (code + count + last_inclusive) >> shift; + uint32_t mask = (1u << shift) - 1u; + uint32_t half_step = 1u << (shift - 1u); + for (uint32_t prefix = first_prefix; prefix < last_prefix; prefix++) { + uint32_t rev_prefix = ufbxi_bit_reverse(prefix, fast_bits); + tree->fast_sym[rev_prefix] = (ufbxi_huff_sym)(mask | (long_offset << 8)); + long_offset += half_step; + } + + last_valid_prefix = last_prefix; + } + + if (count > 0) { + tree->code_to_sorted[bits] = (int16_t)((int)prev_syms - (int)code); + } else { + tree->code_to_sorted[bits] = INT16_MAX; + } + prev_count = count; + } + + // All codes should be used if there's more than one symbol, if there's only one symbol there should be + // only a single 1-bit code. + if (nonzero_sym_count > 1 && num_codes_left != 0) { + return -2; + } else if (nonzero_sym_count == 1 && total_syms[1] != 1) { + return -2; + } + + // We should always have enough space for long symbols as we support up to 5 (UFBXI_HUFF_MAX_LONG_BITS) + // bits and the largest tree has 286 symbols. For each bit we may waste at most 2^bits slots (conservative) + // and in the end we may waste 2^5 slots giving us `286+2+4+8+16+32+32 = 380` (UFBXI_HUFF_MAX_LONG_SYMS) + ufbx_assert(long_offset <= UFBXI_HUFF_MAX_LONG_SYMS); + } + + tree->end_of_block_bits = 0; + uint32_t num_extra = 0; + tree->extra_shift_base[0] = 0; + tree->extra_mask[0] = 0; + + // Fill `fast_sym[]` with error symbols if necessary, we don't need to do this if we have two or more symbols + // as the tree is guaranteed to be full, which means we will populate the whole `fast_sym[]` + if (nonzero_sym_count <= 1) { + for (uint32_t i = 0; i <= fast_mask; i++) { + tree->fast_sym[i] = UFBXI_HUFF_ERROR_SYM; + } + } + + // Generate per-length sorted-to-symbol and fast lookup tables + uint32_t bits_index[UFBXI_HUFF_MAX_BITS] = { 0 }; + for (uint32_t i = 0; i < sym_count; i++) { + uint32_t bits = sym_bits[i]; + if (bits == 0) continue; + + uint32_t sym = i << 8 | bits; + if (i >= sym_extra_offset) { + uint32_t extra = sym_extra[i - sym_extra_offset]; + sym += extra; + + // Store length/distance codes with extra values in a table. + // TODO: This is unnecessary for small values + if ((extra & 0xffff001f) != 0 && (extra & 0x20) == 0) { + uint32_t ix = ++num_extra; + tree->extra_shift_base[ix] = (extra & 0xffff0000) | bits; + tree->extra_mask[ix] = (1u << (extra & 0x1f)) - 1; + sym = (sym & 0xff) | ix << 8; + } + + } + + uint32_t index = bits_index[bits]++; + uint32_t sorted = total_syms[bits - 1] + index; + tree->sorted_to_sym[sorted] = (ufbxi_huff_sym)sym; + + // Reverse the code and fill all fast lookups with the reversed prefix + uint32_t code = first_code[bits] + index; + uint32_t rev_code = ufbxi_bit_reverse(code, bits); + + if (bits <= fast_bits) { + uint32_t fast_sym = sym; + // The `end` and `fast` flags are mutually exclusive + if ((fast_sym & UFBXI_HUFF_SYM_END) == 0) { + fast_sym |= UFBXI_HUFF_SYM_FAST; + } + uint32_t hi_max = 1u << (fast_bits - bits); + for (uint32_t hi = 0; hi < hi_max; hi++) { + ufbxi_regression_assert(nonzero_sym_count <= 1 || tree->fast_sym[rev_code | hi << bits] == UFBXI_HUFF_UNINITIALIZED_SYM); + tree->fast_sym[rev_code | hi << bits] = (ufbxi_huff_sym)fast_sym; + } + } else if (bits <= fast_bits + UFBXI_HUFF_MAX_LONG_BITS && (code >> (bits - fast_bits)) < last_valid_prefix) { + uint32_t fast_sym = tree->fast_sym[rev_code & fast_mask]; + ufbxi_regression_assert(fast_sym != UFBXI_HUFF_UNINITIALIZED_SYM); + uint32_t long_bits = 0; + + uint32_t long_mask = fast_sym; + while (long_bits < UFBXI_HUFF_MAX_LONG_BITS && (long_mask & 1) != 0) { + long_mask >>= 1; + long_bits += 1; + } + ufbxi_dev_assert(long_bits >= 1); + + uint32_t long_base = fast_sym >> 7u; // aka (fast_sym >> 8) * 2 + uint32_t lo_bits = bits - fast_bits; + uint32_t hi_max = 1u << (long_bits - lo_bits); + uint32_t rev_suffix = rev_code >> fast_bits; + for (uint32_t hi = 0; hi < hi_max; hi++) { + ufbxi_regression_assert(tree->long_sym[long_base + (rev_suffix | hi << lo_bits)] == UFBXI_HUFF_UNINITIALIZED_SYM); + tree->long_sym[long_base + (rev_suffix | hi << lo_bits)] = (ufbxi_huff_sym)sym; + } + } else { + uint32_t fast_sym = (code >> (bits - fast_bits)) << 8; + ufbxi_regression_assert( + tree->fast_sym[rev_code & fast_mask] == UFBXI_HUFF_UNINITIALIZED_SYM || + tree->fast_sym[rev_code & fast_mask] == (ufbxi_huff_sym)fast_sym); + tree->fast_sym[rev_code & fast_mask] = (ufbxi_huff_sym)fast_sym; + } + + // Make sure the end-of-block symbol goes through the slow path + // Also store the end-of-block code so we can interrupt decoding + if (i == 256) { + tree->end_of_block_bits = rev_code; + } + } + + // Make sure all `fast_sym[]` are filled with an initialized value. + #if defined(UFBX_REGRESSION) + { + for (size_t i = 0; i < UFBXI_HUFF_FAST_SIZE; i++) { + if (i <= fast_mask) { + ufbx_assert(tree->fast_sym[i] != UFBXI_HUFF_UNINITIALIZED_SYM); + } else { + ufbx_assert(tree->fast_sym[i] == UFBXI_HUFF_UNINITIALIZED_SYM); + } + } + for (size_t i = 0; i < nonzero_sym_count; i++) { + ufbx_assert(tree->sorted_to_sym[i] != UFBXI_HUFF_UNINITIALIZED_SYM); + } + } + #endif + + return 0; +} + +// 0: Success +// -1: Overfull +// -2: Underfull +static ufbxi_noinline ptrdiff_t +ufbxi_huff_build(ufbxi_huff_tree *tree, uint8_t *sym_bits, uint32_t sym_count, const uint32_t *sym_extra, uint32_t sym_extra_offset, uint32_t fast_bits) +{ + // Count the number of codes per bit length + // `bits_counts[0]` contains the number of non-used symbols + uint32_t bits_counts[UFBXI_HUFF_MAX_BITS]; + memset(bits_counts, 0, sizeof(bits_counts)); + for (uint32_t i = 0; i < sym_count; i++) { + uint32_t bits = sym_bits[i]; + ufbx_assert(bits < UFBXI_HUFF_MAX_BITS); + bits_counts[bits]++; + } + + return ufbxi_huff_build_imp(tree, sym_bits, sym_count, sym_extra, sym_extra_offset, fast_bits, bits_counts); +} + +static ufbxi_forceinline ufbxi_huff_sym +ufbxi_huff_decode_bits(const ufbxi_huff_tree *tree, uint64_t bits, uint32_t fast_bits, uint32_t fast_mask) +{ + ufbxi_huff_sym sym = tree->fast_sym[bits & fast_mask]; + ufbxi_regression_assert(sym != UFBXI_HUFF_UNINITIALIZED_SYM); + + if ((sym & (UFBXI_HUFF_SYM_FAST|UFBXI_HUFF_SYM_END)) != 0) { + return sym; + } + + uint32_t tail = (uint32_t)(bits >> fast_bits); + uint32_t long_mask = ufbxi_huff_sym_long_mask(sym); + if (long_mask) { + sym = tree->long_sym[ufbxi_huff_sym_long_offset(sym) + (tail & long_mask)]; + ufbxi_regression_assert(sym != UFBXI_HUFF_UNINITIALIZED_SYM); + return sym; + } + + ufbxi_dev_assert(fast_bits <= 8); + + uint32_t code = ufbxi_huff_sym_value(sym); + uint32_t num_bits = fast_bits; + for (;;) { + code = code << 1 | (tail & 1); + tail >>= 1; + num_bits++; + + ufbxi_regression_assert(num_bits < UFBXI_HUFF_MAX_BITS); + if (code < tree->past_max_code[num_bits]) { + sym = tree->sorted_to_sym[(int32_t)code + (int32_t)tree->code_to_sorted[num_bits]]; + ufbxi_regression_assert(sym != UFBXI_HUFF_UNINITIALIZED_SYM); + return sym; + } + } +} + +static ufbxi_noinline void ufbxi_init_static_huff(ufbxi_trees *trees, const ufbx_inflate_input *input) +{ + ptrdiff_t err = 0; + + // Override `fast_bits` if necessary, this must always be valid as it's checked in the beginning of `ufbx_inflate()`. + if (input->internal_fast_bits != 0) { + trees->fast_bits = (uint32_t)input->internal_fast_bits; + ufbx_assert(!(trees->fast_bits < 1 || trees->fast_bits == 9 || trees->fast_bits > 10)); + } else { + trees->fast_bits = UFBXI_HUFF_FAST_BITS; + } + + // 0-143: 8 bits, 144-255: 9 bits, 256-279: 7 bits, 280-287: 8 bits + uint8_t lit_length_bits[288]; + memset(lit_length_bits + 0, 8, 144 - 0); + memset(lit_length_bits + 144, 9, 256 - 144); + memset(lit_length_bits + 256, 7, 280 - 256); + memset(lit_length_bits + 280, 8, 288 - 280); + err |= ufbxi_huff_build(&trees->lit_length, lit_length_bits, sizeof(lit_length_bits), ufbxi_deflate_length_lut, 256, trees->fast_bits); + + // "Distance codes 0-31 are represented by (fixed-length) 5-bit codes" + uint8_t dist_bits[32]; + memset(dist_bits + 0, 5, 32 - 0); + err |= ufbxi_huff_build(&trees->dist, dist_bits, sizeof(dist_bits), ufbxi_deflate_dist_lut, 0, trees->fast_bits); + + // Building the static trees cannot fail as we use pre-defined code lengths. + ufbxi_ignore(err); + ufbx_assert(err == 0); +} + +// 0: Success +// -1: Huffman Overfull +// -2: Huffman Underfull +// -3: Code 16 repeat overflow +// -4: Code 17 repeat overflow +// -5: Code 18 repeat overflow +// -6: Bad length code +// -7: Cancelled +static ufbxi_noinline ptrdiff_t ufbxi_init_dynamic_huff_tree(ufbxi_deflate_context *dc, const ufbxi_huff_tree *huff_code_length, ufbxi_huff_tree *tree, + uint32_t num_symbols, const uint32_t *sym_extra, uint32_t sym_extra_offset, uint32_t fast_bits) +{ + uint8_t code_lengths[UFBXI_HUFF_MAX_VALUE]; + ufbx_assert(num_symbols <= UFBXI_HUFF_MAX_VALUE); + + uint64_t bits = dc->stream.bits; + size_t left = dc->stream.left; + const char *data = dc->stream.chunk_ptr; + uint32_t bits_counts[UFBXI_HUFF_MAX_BITS]; + memset(bits_counts, 0, sizeof(bits_counts)); + + uint32_t symbol_index = 0; + uint8_t prev = 0; + while (symbol_index < num_symbols) { + ufbxi_bit_refill(&bits, &left, &data, &dc->stream); + if (dc->stream.cancelled) return -7; + + ufbxi_huff_sym sym = ufbxi_huff_decode_bits(huff_code_length, bits, UFBXI_HUFF_CODELEN_FAST_BITS, UFBXI_HUFF_CODELEN_FAST_MASK); + ufbxi_regression_assert(sym != UFBXI_HUFF_UNINITIALIZED_SYM); + + uint32_t inst = ufbxi_huff_sym_value(sym); + uint32_t sym_len = ufbxi_huff_sym_total_bits(sym); + + bits >>= sym_len; + left -= sym_len; + + if (inst <= 15) { + // "0 - 15: Represent code lengths of 0 - 15" + prev = (uint8_t)inst; + code_lengths[symbol_index++] = (uint8_t)inst; + bits_counts[(int32_t)inst]++; + } else if (inst == 16) { + // "16: Copy the previous code length 3 - 6 times. The next 2 bits indicate repeat length." + uint32_t num = 3 + ((uint32_t)bits & 0x3); + bits >>= 2; + left -= 2; + if (symbol_index + num > num_symbols) return -3; + memset(code_lengths + symbol_index, prev, num); + symbol_index += num; + bits_counts[(int32_t)prev] += num; + } else if (inst == 17) { + // "17: Repeat a code length of 0 for 3 - 10 times. (3 bits of length)" + uint32_t num = 3 + ((uint32_t)bits & 0x7); + bits >>= 3; + left -= 3; + if (symbol_index + num > num_symbols) return -4; + memset(code_lengths + symbol_index, 0, num); + symbol_index += num; + prev = 0; + bits_counts[0] += num; + } else if (inst == 18) { + // "18: Repeat a code length of 0 for 11 - 138 times (7 bits of length)" + uint32_t num = 11 + ((uint32_t)bits & 0x7f); + bits >>= 7; + left -= 7; + if (symbol_index + num > num_symbols) return -5; + memset(code_lengths + symbol_index, 0, num); + symbol_index += num; + prev = 0; + bits_counts[0] += num; + } else { + return -6; + } + } + + ptrdiff_t err = ufbxi_huff_build_imp(tree, code_lengths, num_symbols, sym_extra, sym_extra_offset, fast_bits, bits_counts); + if (err != 0) return err; + + dc->stream.bits = bits; + dc->stream.left = left; + dc->stream.chunk_ptr = data; + + return 0; +} + +static ufbxi_noinline ptrdiff_t +ufbxi_init_dynamic_huff(ufbxi_deflate_context *dc, ufbxi_trees *trees) +{ + uint64_t bits = dc->stream.bits; + size_t left = dc->stream.left; + const char *data = dc->stream.chunk_ptr; + ufbxi_bit_refill(&bits, &left, &data, &dc->stream); + if (dc->stream.cancelled) return -28; + + trees->fast_bits = dc->fast_bits; + + // The header contains the number of Huffman codes in each of the three trees. + uint32_t num_lit_lengths = 257 + (bits & 0x1f); + uint32_t num_dists = 1 + (bits >> 5 & 0x1f); + uint32_t num_code_lengths = 4 + (bits >> 10 & 0xf); + bits >>= 14; + left -= 14; + + // Code lengths for the "code length" Huffman tree are represented literally + // 3 bits in order of: 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 up to + // `num_code_lengths`, rest of the code lengths are 0 (unused) + uint8_t code_lengths[19]; + memset(code_lengths, 0, sizeof(code_lengths)); + for (size_t len_i = 0; len_i < num_code_lengths; len_i++) { + if (len_i == 14) { + ufbxi_bit_refill(&bits, &left, &data, &dc->stream); + if (dc->stream.cancelled) return -28; + } + code_lengths[ufbxi_deflate_code_length_permutation[len_i]] = (uint32_t)bits & 0x7; + bits >>= 3; + left -= 3; + } + + dc->stream.bits = bits; + dc->stream.left = left; + dc->stream.chunk_ptr = data; + + ufbxi_huff_tree huff_code_length; + ptrdiff_t err; + + // Build the temporary "code length" Huffman tree used to encode the actual + // trees used to compress the data. Use that to build the literal/length and + // distance trees. + err = ufbxi_huff_build(&huff_code_length, code_lengths, ufbxi_arraycount(code_lengths), NULL, INT32_MAX, UFBXI_HUFF_CODELEN_FAST_BITS); + if (err) return -14 + 1 + err; + err = ufbxi_init_dynamic_huff_tree(dc, &huff_code_length, &trees->lit_length, num_lit_lengths, ufbxi_deflate_length_lut, 256, dc->fast_bits); + if (err) return err == -7 ? -28 : -16 + 1 + err; + err = ufbxi_init_dynamic_huff_tree(dc, &huff_code_length, &trees->dist, num_dists, ufbxi_deflate_dist_lut, 0, dc->fast_bits); + if (err) return err == -7 ? -28 : -22 + 1 + err; + + return 0; +} + +static ufbxi_noinline uint32_t ufbxi_adler32(const void *data, size_t size) +{ + ufbxi_fast_uint a = 1, b = 0; + const char *p = (const char*)data; + + // Adler-32 consists of two running sums modulo 65521. As an optimization + // we can accumulate N sums before applying the modulo, where N depends on + // the size of the type holding the sum. + const ufbxi_fast_uint num_before_wrap = sizeof(ufbxi_fast_uint) == 8 ? 380368439u : 5552u; + + ufbxi_fast_uint size_left = size; + while (size_left > 0) { + ufbxi_fast_uint num = size_left <= num_before_wrap ? size_left : num_before_wrap; + size_left -= num; + const char *end = p + num; + + // Align to 16 bytes + while (p != end && ((uintptr_t)p & 0xf) != 0) { + a += (ufbxi_fast_uint)(uint8_t)p[0]; b += a; + p++; + } + +#if UFBXI_HAS_SSE + static const uint16_t factors[2][8] = { + { 16, 15, 14, 13, 12, 11, 10, 9, }, + { 8, 7, 6, 5, 4, 3, 2, 1, }, + }; + + const __m128i zero = _mm_setzero_si128(); + const __m128i factor_1 = _mm_set1_epi16(1); + const __m128i factor_16 = _mm_set1_epi16(16); + const __m128i factor_lo = _mm_loadu_si128((const __m128i*)factors[0]); + const __m128i factor_hi = _mm_loadu_si128((const __m128i*)factors[1]); + + for (;;) { + size_t chunk_size = ufbxi_min_sz(ufbxi_to_size(end - p), 5803) & ~(size_t)0xff; + if (chunk_size == 0) break; + const char *chunk_end = p + chunk_size; + + __m128i s1 = zero; + __m128i s2 = zero; + + while (p != chunk_end) { + __m128i s1_lo = zero, s1_hi = zero; + __m128i tmp_lo = zero, tmp_hi = zero; + + ufbxi_nounroll for (size_t i = 0; i < 256; i += 32) { + __m128i d0 = _mm_load_si128((const __m128i*)(p + i + 0)); + __m128i d1 = _mm_load_si128((const __m128i*)(p + i + 16)); + + tmp_lo = _mm_add_epi16(tmp_lo, s1_lo); + tmp_hi = _mm_add_epi16(tmp_hi, s1_hi); + s1_lo = _mm_add_epi16(s1_lo, _mm_unpacklo_epi8(d0, zero)); + s1_hi = _mm_add_epi16(s1_hi, _mm_unpackhi_epi8(d0, zero)); + + tmp_lo = _mm_add_epi16(tmp_lo, s1_lo); + tmp_hi = _mm_add_epi16(tmp_hi, s1_hi); + s1_lo = _mm_add_epi16(s1_lo, _mm_unpacklo_epi8(d1, zero)); + s1_hi = _mm_add_epi16(s1_hi, _mm_unpackhi_epi8(d1, zero)); + } + + s2 = _mm_add_epi32(s2, _mm_slli_epi32(s1, 8)); + s1 = _mm_add_epi32(s1, _mm_madd_epi16(s1_lo, factor_1)); + s1 = _mm_add_epi32(s1, _mm_madd_epi16(s1_hi, factor_1)); + + s2 = _mm_add_epi32(s2, _mm_madd_epi16(tmp_lo, factor_16)); + s2 = _mm_add_epi32(s2, _mm_madd_epi16(tmp_hi, factor_16)); + s2 = _mm_add_epi32(s2, _mm_madd_epi16(s1_lo, factor_lo)); + s2 = _mm_add_epi32(s2, _mm_madd_epi16(s1_hi, factor_hi)); + + p += 256; + } + + s1 = _mm_add_epi32(s1, _mm_shuffle_epi32(s1, _MM_SHUFFLE(2,3,0,1))); + s2 = _mm_add_epi32(s2, _mm_shuffle_epi32(s2, _MM_SHUFFLE(2,3,0,1))); + s1 = _mm_add_epi32(s1, _mm_shuffle_epi32(s1, _MM_SHUFFLE(1,0,3,2))); + s2 = _mm_add_epi32(s2, _mm_shuffle_epi32(s2, _MM_SHUFFLE(1,0,3,2))); + + b += chunk_size * a; + a += (uint32_t)_mm_cvtsi128_si32(s1); + b += (uint32_t)_mm_cvtsi128_si32(s2); + } +#elif UFBX_LITTLE_ENDIAN + for (;;) { + size_t chunk_size = ufbxi_min_sz(ufbxi_to_size(end - p), 256*8/4) & ~(size_t)0xf; + if (chunk_size == 0) break; + const char *chunk_end = p + chunk_size; + + uint64_t s1_lo = 0, s1_hi = 0; + uint64_t tmp, s2 = 0; + uint64_t mask8 = UINT64_C(0x00ff00ff00ff00ff); + uint64_t mask16 = UINT64_C(0x0000ffff0000ffff); + + while (p != chunk_end) { + uint64_t d0 = *(const uint64_t*)p; + uint64_t d1 = *(const uint64_t*)(p + 8); + + tmp = s1_lo + s1_hi; + s1_lo += d0 & mask8; + s1_hi += (d0 >> 8) & mask8; + + tmp += s1_lo + s1_hi; + s1_lo += d1 & mask8; + s1_hi += (d1 >> 8) & mask8; + + s2 += (tmp & mask16) + ((tmp >> 16) & mask16); + p += 16; + } + + uint64_t s1 = s1_lo + s1_hi; + s1 = (s1 & mask16) + ((s1 >> 16u) & mask16); + ufbxi_fast_uint s1_sum = (ufbxi_fast_uint)(s1 + (s1 >> 32u)); + + ufbxi_fast_uint s2_sum = (ufbxi_fast_uint)(s2 + (s2 >> 32u)) * 8; + s2_sum += ((ufbxi_fast_uint)(s1_lo >> 0) & 0xffff) * 8; + s2_sum += ((ufbxi_fast_uint)(s1_hi >> 0) & 0xffff) * 7; + s2_sum += ((ufbxi_fast_uint)(s1_lo >> 16) & 0xffff) * 6; + s2_sum += ((ufbxi_fast_uint)(s1_hi >> 16) & 0xffff) * 5; + s2_sum += ((ufbxi_fast_uint)(s1_lo >> 32) & 0xffff) * 4; + s2_sum += ((ufbxi_fast_uint)(s1_hi >> 32) & 0xffff) * 3; + s2_sum += ((ufbxi_fast_uint)(s1_lo >> 48) & 0xffff) * 2; + s2_sum += ((ufbxi_fast_uint)(s1_hi >> 48) & 0xffff) * 1; + + b += chunk_size * a; + a += s1_sum & 0xffffffffu; + b += s2_sum & 0xffffffffu; + } +#endif + + while (p != end) { + a += (size_t)(uint8_t)p[0]; b += a; + p++; + } + + a %= 65521u; + b %= 65521u; + } + + return (uint32_t)((b << 16) | (a & 0xffff)); +} + +static ufbxi_noinline int +ufbxi_inflate_block_slow(ufbxi_deflate_context *dc, ufbxi_trees *trees, size_t max_symbols) +{ + char *out_ptr = dc->out_ptr; + char *const out_begin = dc->out_begin; + char *const out_end = dc->out_end; + + uint32_t fast_bits = trees->fast_bits; + uint32_t fast_mask = (1u << fast_bits) - 1; + + uint64_t bits = dc->stream.bits; + size_t left = dc->stream.left; + const char *data = dc->stream.chunk_ptr; + + for (;;) { + if (max_symbols-- == 0) break; + + ufbxi_bit_refill(&bits, &left, &data, &dc->stream); + uint64_t sym_bits = bits; + + ufbxi_huff_sym sym0 = ufbxi_huff_decode_bits(&trees->lit_length, bits, fast_bits, fast_mask); + ufbxi_regression_assert(sym0 != UFBXI_HUFF_UNINITIALIZED_SYM); + + uint32_t sym0_bits = ufbxi_huff_sym_total_bits(sym0); + + bits >>= sym0_bits; + left -= sym0_bits; + if (sym0 & UFBXI_HUFF_SYM_END) { + if (ufbxi_huff_sym_value(sym0) != 0) return -13; + + dc->out_ptr = out_ptr; + dc->stream.bits = bits; + dc->stream.left = left; + dc->stream.chunk_ptr = data; + return 0; + } else if ((sym0 & UFBXI_HUFF_SYM_MATCH) == 0) { + if (out_ptr == out_end) return -10; + *out_ptr++ = (char)ufbxi_huff_sym_value(sym0); + continue; + } + + uint32_t sym0_value = ufbxi_huff_sym_value(sym0); + uint32_t len_shift_base = trees->lit_length.extra_shift_base[sym0_value]; + uint16_t len_mask = trees->lit_length.extra_mask[sym0_value]; + uint32_t length = (len_shift_base >> 16) + (ufbxi_wrap_shr64(sym_bits, len_shift_base) & len_mask); + + ufbxi_huff_sym sym1 = ufbxi_huff_decode_bits(&trees->dist, bits, fast_bits, fast_mask); + ufbxi_regression_assert(sym1 != UFBXI_HUFF_UNINITIALIZED_SYM); + if (sym1 & UFBXI_HUFF_SYM_END) return -11; + + uint32_t sym1_bits = ufbxi_huff_sym_total_bits(sym1); + + bits >>= sym1_bits; + left -= sym1_bits; + + uint32_t sym1_value = ufbxi_huff_sym_value(sym1); + uint32_t dist_shift_base = trees->dist.extra_shift_base[sym1_value]; + uint16_t dist_mask = trees->dist.extra_mask[sym1_value]; + uint32_t distance = (dist_shift_base >> 16) + (ufbxi_wrap_shr64(sym_bits, dist_shift_base + sym0) & dist_mask); + + // Bounds checking + size_t out_space = ufbxi_to_size(out_end - out_ptr); + if ((ptrdiff_t)distance > out_ptr - out_begin || length > out_space) { + return -12; + } + + // Copy the match + const char *src = out_ptr - distance; + char *dst = out_ptr; + char *end = dst + length; + out_ptr += length; + + if (out_space >= length + 16) { + uint32_t min_dist = length < 16 ? length : 16; + if (distance >= min_dist) { + ufbxi_copy_16_bytes(dst, src); + while (length > 16) { + src += 16; + dst += 16; + length -= 16; + ufbxi_copy_16_bytes(dst, src); + } + } else { + while (dst != end) { + *dst++ = *src++; + } + } + } else { + while (dst != end) { + *dst++ = *src++; + } + } + } + + dc->out_ptr = out_ptr; + dc->stream.bits = bits; + dc->stream.left = left; + dc->stream.chunk_ptr = data; + return 1; +} + +ufbx_static_assert(inflate_huff_fast_bits, UFBXI_HUFF_FAST_BITS <= 11); // `fast lit, fast len, slow dist` in 56 bits +ufbx_static_assert(inflate_huff_long_bits, UFBXI_HUFF_FAST_BITS + UFBXI_HUFF_MAX_LONG_BITS >= 15); // Largest code fits in a single long lookup + +// Optimized version of `ufbxi_inflate_block_slow()`. +// Has a lot of assumptions (see asserts) and does not call _any_ (even forceinlined) functions. +static ufbxi_noinline int +ufbxi_inflate_block_fast(ufbxi_deflate_context *dc, ufbxi_trees *trees) +{ + ufbxi_dev_assert(!dc->stream.cancelled); + ufbxi_dev_assert(trees->fast_bits == UFBXI_HUFF_FAST_BITS); + ufbxi_dev_assert(dc->stream.chunk_yield - dc->stream.chunk_ptr >= UFBXI_INFLATE_FAST_MIN_IN); + ufbxi_dev_assert(dc->out_end - dc->out_ptr >= UFBXI_INFLATE_FAST_MIN_OUT); + + char *out_ptr = dc->out_ptr; + char *const out_begin = dc->out_begin; + char *const out_end = dc->out_end - UFBXI_INFLATE_FAST_MIN_OUT; + + const ufbxi_huff_tree *tree_lit_length = &trees->lit_length; + const ufbxi_huff_tree *tree_dist = &trees->dist; + + uint64_t bits = dc->stream.bits; + size_t left = dc->stream.left; + const char *data = dc->stream.chunk_ptr; + const char *data_end = dc->stream.chunk_yield - UFBXI_INFLATE_FAST_MIN_IN; + + uint64_t sym01_bits; + ufbxi_huff_sym sym0, sym1; + uint64_t refill_bits = ufbxi_read_u64(data); + + #define ufbxi_fast_inflate_refill_and_decode() do { \ + ufbxi_macro_bit_refill_fast(bits, left, data, refill_bits); \ + sym01_bits = bits; \ + sym0 = tree_lit_length->fast_sym[sym01_bits & UFBXI_HUFF_FAST_MASK]; \ + sym1 = ((sym0 & UFBXI_HUFF_SYM_MATCH) ? tree_dist : tree_lit_length)->fast_sym[ufbxi_wrap_shr64(sym01_bits, sym0) & UFBXI_HUFF_FAST_MASK]; \ + refill_bits = ufbxi_read_u64(data); \ + } while (0) + + #define ufbxi_fast_inflate_should_continue() \ + (((data_end - data) | (out_end - out_ptr)) >= 0) + + ufbxi_fast_inflate_refill_and_decode(); + + for (;;) { + if ((sym0 & sym1) & UFBXI_HUFF_SYM_FAST) { + bits = ufbxi_wrap_shr64(sym01_bits, sym0 + sym1); + left -= (sym0 + sym1) & 0x3f; + + if (((sym0 | sym1) & UFBXI_HUFF_SYM_MATCH) == 0) { + // Literal, Literal + // -> Output the two literals and loop back to start. + + out_ptr[0] = (char)ufbxi_huff_sym_value(sym0); + out_ptr[1] = (char)ufbxi_huff_sym_value(sym1); + out_ptr += 2; + + ufbxi_fast_inflate_refill_and_decode(); + if (ufbxi_fast_inflate_should_continue()) continue; + break; + + } else if ((sym0 & UFBXI_HUFF_SYM_MATCH) == 0) { + // Literal, Match, (Distance) + // -> Output a single literal, decode the missing distance and fall through to match. + + out_ptr[0] = (char)ufbxi_huff_sym_value(sym0); + out_ptr += 1; + + sym01_bits = ufbxi_wrap_shr64(sym01_bits, sym0); + + // This must fit as literals never have extra bits and the match length is fast so: + // 10 (lit) + 10 (len code) + 5 (len extra) + 15 (dist code) + 13 (dist extra) = 53 <= 56 + sym0 = sym1; + sym1 = tree_dist->fast_sym[bits & UFBXI_HUFF_FAST_MASK]; + + if ((sym1 & UFBXI_HUFF_SYM_FAST) == 0) { + // Slow sym1 + if (sym1 & UFBXI_HUFF_SYM_END) return -11; + uint32_t tail = (uint32_t)(bits >> UFBXI_HUFF_FAST_BITS); + uint32_t long_mask = ufbxi_huff_sym_long_mask(sym1); + sym1 = tree_dist->long_sym[ufbxi_huff_sym_long_offset(sym1) + (tail & long_mask)]; + if (sym1 & UFBXI_HUFF_SYM_END) return -11; + } + + bits = ufbxi_wrap_shr64(bits, sym1); + left -= sym1 & 0x3f; + } else { + // Match, Distance + // -> Fall through to match copy. + } + + } else { + if ((sym0 & (UFBXI_HUFF_SYM_FAST|UFBXI_HUFF_SYM_END)) == 0) { + // Slow sym0 + uint32_t tail = (uint32_t)(sym01_bits >> UFBXI_HUFF_FAST_BITS); + uint32_t long_mask = ufbxi_huff_sym_long_mask(sym0); + sym0 = tree_lit_length->long_sym[ufbxi_huff_sym_long_offset(sym0) + (tail & long_mask)]; + } + + uint32_t sym0_bits = ufbxi_huff_sym_total_bits(sym0); + bits >>= sym0_bits; + left -= sym0_bits; + + if (sym0 & UFBXI_HUFF_SYM_END) { + if (ufbxi_huff_sym_value(sym0) != 0) return -13; + dc->out_ptr = out_ptr; + dc->stream.bits = bits; + dc->stream.left = left; + dc->stream.chunk_ptr = data; + return 0; + } + + if (sym0 & UFBXI_HUFF_SYM_MATCH) { + sym1 = tree_dist->fast_sym[bits & UFBXI_HUFF_FAST_MASK]; + + if ((sym1 & UFBXI_HUFF_SYM_FAST) == 0) { + // Slow sym1 + if (sym1 & UFBXI_HUFF_SYM_END) return -11; + uint32_t tail = (uint32_t)(bits >> UFBXI_HUFF_FAST_BITS); + uint32_t long_mask = ufbxi_huff_sym_long_mask(sym1); + sym1 = tree_dist->long_sym[ufbxi_huff_sym_long_offset(sym1) + (tail & long_mask)]; + if (sym1 & UFBXI_HUFF_SYM_END) return -11; + } + + bits = ufbxi_wrap_shr64(bits, sym1); + left -= sym1 & 0x3f; + } else { + *out_ptr++ = (char)ufbxi_huff_sym_value(sym0); + + ufbxi_fast_inflate_refill_and_decode(); + if (ufbxi_fast_inflate_should_continue()) continue; + break; + } + } + + uint32_t sym0_value = ufbxi_huff_sym_value(sym0); + uint32_t len_shift_base = trees->lit_length.extra_shift_base[sym0_value]; + uint16_t len_mask = trees->lit_length.extra_mask[sym0_value]; + uint32_t length = (len_shift_base >> 16) + (ufbxi_wrap_shr64(sym01_bits, len_shift_base) & len_mask); + + uint32_t sym1_value = ufbxi_huff_sym_value(sym1); + uint32_t dist_shift_base = trees->dist.extra_shift_base[sym1_value]; + uint16_t dist_mask = trees->dist.extra_mask[sym1_value]; + uint32_t distance = (dist_shift_base >> 16) + (ufbxi_wrap_shr64(sym01_bits, dist_shift_base + sym0) & dist_mask); + + ufbxi_fast_inflate_refill_and_decode(); + + // Bounds checking: We don't actually handle the error here, just bail out to the slow implementation + ptrdiff_t dst_space = out_end - out_ptr - (ptrdiff_t)length + UFBXI_INFLATE_FAST_MIN_OUT; + ptrdiff_t src_space = out_ptr - out_begin - (ptrdiff_t)distance; + if ((dst_space | src_space) < 0) { + return -12; + } + + const char *src = out_ptr - distance; + char *dst = out_ptr; + char *end = dst + length; + out_ptr += length; + + // Copy the match + + uint32_t min_dist = length < 16 ? length : 16; + if (distance >= min_dist && dst_space >= 16) { + ufbxi_copy_16_bytes(dst, src); + while (length > 16) { + src += 16; + dst += 16; + length -= 16; + ufbxi_copy_16_bytes(dst, src); + } + } else { + while (dst != end) { + *dst++ = *src++; + } + } + + if (ufbxi_fast_inflate_should_continue()) continue; + break; + } + + dc->out_ptr = out_ptr; + dc->stream.bits = bits; + dc->stream.left = left; + dc->stream.chunk_ptr = data; + return 1; + + #undef ufbxi_fast_inflate_refill_and_decode + #undef ufbxi_fast_inflate_should_continue +} + +// TODO: Error codes should have a quick test if the destination buffer overflowed +// Returns actual number of decompressed bytes or negative error: +// -1: Bad compression method (ZLIB header) +// -2: Requires dictionary (ZLIB header) +// -3: Bad FCHECK (ZLIB header) +// -4: Bad NLEN (Uncompressed LEN != ~NLEN) +// -5: Uncompressed source overflow +// -6: Uncompressed destination overflow +// -7: Bad block type +// -8: Truncated checksum (deprecated, reported as -9) +// -9: Checksum mismatch +// -10: Literal destination overflow +// -11: Bad distance code or distance of (30..31) +// -12: Match out of bounds +// -13: Bad lit/length code +// -14: Codelen Huffman Overfull +// -15: Codelen Huffman Underfull +// -16 - -21: Litlen Huffman: Overfull / Underfull / Repeat 16/17/18 overflow / Bad length code +// -22 - -27: Distance Huffman: Overfull / Underfull / Repeat 16/17/18 overflow / Bad length code +// -28: Cancelled +// -29: Invalid ufbx_inflate_input.internal_fast_bits value +ufbxi_extern_c ptrdiff_t ufbx_inflate(void *dst, size_t dst_size, const ufbx_inflate_input *input, ufbx_inflate_retain *retain) +{ + ufbxi_inflate_retain_imp *ret_imp = (ufbxi_inflate_retain_imp*)retain; + + ptrdiff_t err; + ufbxi_deflate_context dc; + ufbxi_bit_stream_init(&dc.stream, input); + dc.out_begin = (char*)dst; + dc.out_ptr = (char*)dst; + dc.out_end = (char*)dst + dst_size; + if (input->internal_fast_bits != 0) { + dc.fast_bits = (uint32_t)input->internal_fast_bits; + if (dc.fast_bits < 1 || dc.fast_bits == 9 || dc.fast_bits > 10) return -29; + } else { + // TODO: Profile this + dc.fast_bits = input->total_size > 2048 ? 10 : 8; + } + + uint64_t bits = dc.stream.bits; + size_t left = dc.stream.left; + const char *data = dc.stream.chunk_ptr; + + ufbxi_bit_refill(&bits, &left, &data, &dc.stream); + if (dc.stream.cancelled) return -28; + + // Zlib header + if (!input->no_header) { + size_t cmf = (size_t)(bits & 0xff); + size_t flg = (size_t)(bits >> 8) & 0xff; + bits >>= 16; + left -= 16; + + if ((cmf & 0xf) != 0x8) return -1; + if ((flg & 0x20) != 0) return -2; + if ((cmf << 8 | flg) % 31u != 0) return -3; + } + + for (;;) { + ufbxi_bit_refill(&bits, &left, &data, &dc.stream); + if (dc.stream.cancelled) return -28; + + // Block header: [0:1] BFINAL [1:3] BTYPE + size_t header = (size_t)bits & 0x7; + bits >>= 3; + left -= 3; + + size_t type = header >> 1; + if (type == 0) { + + // Round up to the next byte + size_t align_bits = left & 0x7; + bits >>= align_bits; + left -= align_bits; + + size_t len = (size_t)(bits & 0xffff); + size_t nlen = (size_t)((bits >> 16) & 0xffff); + if ((len ^ nlen) != 0xffff) return -4; + if (dc.out_end - dc.out_ptr < (ptrdiff_t)len) return -6; + bits >>= 32; + left -= 32; + + dc.stream.bits = bits; + dc.stream.left = left; + dc.stream.chunk_ptr = data; + + // Copy `len` bytes of literal data + if (!ufbxi_bit_copy_bytes(dc.out_ptr, &dc.stream, len)) return -5; + + dc.out_ptr += len; + + } else if (type <= 2) { + + dc.stream.bits = bits; + dc.stream.left = left; + dc.stream.chunk_ptr = data; + + ufbxi_trees tree_data; + ufbxi_trees *trees; + if (type == 1) { + // Static Huffman: Initialize the trees once and cache them in `retain`. + if (!ret_imp->initialized) { + ufbxi_init_static_huff(&ret_imp->static_trees, input); + ret_imp->initialized = true; + } + trees = &ret_imp->static_trees; + } else { + // Dynamic Huffman + err = ufbxi_init_dynamic_huff(&dc, &tree_data); + if (err) return err; + trees = &tree_data; + } + + for (;;) { + bool fast_viable = trees->fast_bits == UFBXI_HUFF_FAST_BITS && dc.out_end - dc.out_ptr >= UFBXI_INFLATE_FAST_MIN_OUT; + + // `ufbxi_inflate_block_fast()` needs a bit more upfront setup, see asserts on top of the function + if (fast_viable && dc.stream.chunk_yield - dc.stream.chunk_ptr >= UFBXI_INFLATE_FAST_MIN_IN) { + err = ufbxi_inflate_block_fast(&dc, trees); + } else { + err = ufbxi_inflate_block_slow(&dc, trees, fast_viable ? 32 : SIZE_MAX); + } + + if (err < 0) return err; + + // `ufbxi_inflate_block()` returns normally on cancel so check it here + if (dc.stream.cancelled) return -28; + + if (err == 0) break; + } + + } else { + // 0b11 - reserved (error) + return -7; + } + + bits = dc.stream.bits; + left = dc.stream.left; + data = dc.stream.chunk_ptr; + + // BFINAL: End of stream + if (header & 1) break; + } + + // Check Adler-32 + { + // Round up to the next byte + size_t align_bits = left & 0x7; + bits >>= align_bits; + left -= align_bits; + ufbxi_bit_refill(&bits, &left, &data, &dc.stream); + if (dc.stream.cancelled) return -28; + + if (!input->no_checksum) { + uint32_t ref = (uint32_t)bits; + ref = (ref>>24) | ((ref>>8)&0xff00) | ((ref<<8)&0xff0000) | (ref<<24); + + uint32_t checksum = ufbxi_adler32(dc.out_begin, ufbxi_to_size(dc.out_ptr - dc.out_begin)); + if (ref != checksum) { + return -9; + } + } + } + + return dc.out_ptr - dc.out_begin; +} + +#endif // !defined(ufbx_inflate) + +// -- Errors + +static const char ufbxi_empty_char[1] = { '\0' }; + +static ufbxi_noinline int ufbxi_vsnprintf(char *buf, size_t buf_size, const char *fmt, va_list args) +{ + int result = vsnprintf(buf, buf_size, fmt, args); + + if (result < 0) result = 0; + if ((size_t)result >= buf_size - 1) result = (int)buf_size - 1; + + // HACK: On some MSYS/MinGW implementations `vsnprintf` is broken and does + // not write the null terminator on truncation, it's always safe to do so + // let's just do it unconditionally here... + buf[result] = '\0'; + + return result; +} + +static ufbxi_noinline int ufbxi_snprintf(char *buf, size_t buf_size, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + int result = ufbxi_vsnprintf(buf, buf_size, fmt, args); + va_end(args); + return result; +} + +static ufbxi_noinline void ufbxi_panicf_imp(ufbx_panic *panic, const char *fmt, ...) +{ + if (panic && panic->did_panic) return; + + va_list args; + va_start(args, fmt); + + if (panic) { + panic->did_panic = true; + panic->message_length = (size_t)ufbxi_vsnprintf(panic->message, sizeof(panic->message), fmt, args); + } else { + fprintf(stderr, "ufbx panic: "); + vfprintf(stderr, fmt, args); + fprintf(stderr, "\n"); + } + + va_end(args); + + if (!panic) { + ufbx_assert(false && "ufbx panic: See stderr for more information"); + } +} + +#define ufbxi_panicf(panic, cond, ...) \ + ((cond) ? false : (ufbxi_panicf_imp((panic), __VA_ARGS__), true)) + +// Prefix the error condition with $Description\0 for a human readable description +#define ufbxi_error_msg(cond, msg) "$" msg "\0" cond + +static ufbxi_noinline int ufbxi_fail_imp_err(ufbx_error *err, const char *cond, const char *func, uint32_t line) +{ + if (cond[0] == '$') { + if (!err->description.data) { + err->description.data = cond + 1; + err->description.length = strlen(err->description.data); + } + +#if UFBXI_FEATURE_ERROR_STACK + // Skip the description part if adding to a stack + cond = cond + strlen(cond) + 1; +#endif + } + + // NOTE: This is the base function all fails boil down to, place a breakpoint here to + // break at the first error +#if UFBXI_FEATURE_ERROR_STACK + if (err->stack_size < UFBX_ERROR_STACK_MAX_DEPTH) { + ufbx_error_frame *frame = &err->stack[err->stack_size++]; + frame->description.data = cond; + frame->description.length = strlen(cond); + frame->function.data = func; + frame->function.length = strlen(func); + frame->source_line = line; + } +#else + ufbxi_ignore(func); + ufbxi_ignore(line); +#endif + + return 0; +} + +static ufbxi_noinline void ufbxi_set_err_info(ufbx_error *err, const char *data, size_t length) +{ + if (!err) return; + + if (length == SIZE_MAX) length = strlen(data); + size_t to_copy = ufbxi_min_sz(sizeof(err->info) - 1, length); + memcpy(err->info, data, to_copy); + err->info[to_copy] = '\0'; + err->info_length = to_copy; +} + +static ufbxi_noinline void ufbxi_fmt_err_info(ufbx_error *err, const char *fmt, ...) +{ + if (!err) return; + + va_list args; + va_start(args, fmt); + err->info_length = (size_t)ufbxi_vsnprintf(err->info, sizeof(err->info), fmt, args); + va_end(args); +} + +static ufbxi_noinline void ufbxi_clear_error(ufbx_error *err) +{ + if (!err) return; + + err->type = UFBX_ERROR_NONE; + err->description.data = ufbxi_empty_char; + err->description.length = 0; + err->stack_size = 0; + err->info[0] = '\0'; + err->info_length = 0; +} + +#if UFBXI_FEATURE_ERROR_STACK + #define ufbxi_function __FUNCTION__ + #define ufbxi_line __LINE__ + #define ufbxi_cond_str(cond) #cond +#else + #define ufbxi_function "" + #define ufbxi_line 0 + #define ufbxi_cond_str(cond) "" +#endif + +#define ufbxi_check_err(err, cond) do { if (ufbxi_unlikely(!ufbxi_trace(cond))) { ufbxi_fail_imp_err((err), ufbxi_cond_str(cond), ufbxi_function, ufbxi_line); return 0; } } while (0) +#define ufbxi_check_return_err(err, cond, ret) do { if (ufbxi_unlikely(!ufbxi_trace(cond))) { ufbxi_fail_imp_err((err), ufbxi_cond_str(cond), ufbxi_function, ufbxi_line); return ret; } } while (0) +#define ufbxi_fail_err(err, desc) return ufbxi_fail_imp_err(err, desc, ufbxi_function, ufbxi_line) + +#define ufbxi_check_err_msg(err, cond, msg) do { if (ufbxi_unlikely(!ufbxi_trace(cond))) { ufbxi_fail_imp_err((err), ufbxi_error_msg(ufbxi_cond_str(cond), msg), ufbxi_function, ufbxi_line); return 0; } } while (0) +#define ufbxi_check_return_err_msg(err, cond, ret, msg) do { if (ufbxi_unlikely(!ufbxi_trace(cond))) { ufbxi_fail_imp_err((err), ufbxi_error_msg(ufbxi_cond_str(cond), msg), ufbxi_function, ufbxi_line); return ret; } } while (0) +#define ufbxi_fail_err_msg(err, desc, msg) return ufbxi_fail_imp_err(err, ufbxi_error_msg(desc, msg), ufbxi_function, ufbxi_line) +#define ufbxi_report_err_msg(err, desc, msg) (void)ufbxi_fail_imp_err(err, ufbxi_error_msg(desc, msg), ufbxi_function, ufbxi_line) + +static ufbxi_noinline void ufbxi_fix_error_type(ufbx_error *error, const char *default_desc) +{ + const char *desc = error->description.data; + if (!desc) desc = default_desc; + error->type = UFBX_ERROR_UNKNOWN; + if (!strcmp(desc, "Out of memory")) { + error->type = UFBX_ERROR_OUT_OF_MEMORY; + } else if (!strcmp(desc, "Memory limit exceeded")) { + error->type = UFBX_ERROR_MEMORY_LIMIT; + } else if (!strcmp(desc, "Allocation limit exceeded")) { + error->type = UFBX_ERROR_ALLOCATION_LIMIT; + } else if (!strcmp(desc, "Truncated file")) { + error->type = UFBX_ERROR_TRUNCATED_FILE; + } else if (!strcmp(desc, "IO error")) { + error->type = UFBX_ERROR_IO; + } else if (!strcmp(desc, "Cancelled")) { + error->type = UFBX_ERROR_CANCELLED; + } else if (!strcmp(desc, "Unrecognized file format")) { + error->type = UFBX_ERROR_UNRECOGNIZED_FILE_FORMAT; + } else if (!strcmp(desc, "File not found")) { + error->type = UFBX_ERROR_FILE_NOT_FOUND; + } else if (!strcmp(desc, "Uninitialized options")) { + error->type = UFBX_ERROR_UNINITIALIZED_OPTIONS; + } else if (!strcmp(desc, "Zero vertex size")) { + error->type = UFBX_ERROR_ZERO_VERTEX_SIZE; + } else if (!strcmp(desc, "Invalid UTF-8")) { + error->type = UFBX_ERROR_INVALID_UTF8; + } else if (!strcmp(desc, "Feature disabled")) { + error->type = UFBX_ERROR_FEATURE_DISABLED; + } else if (!strcmp(desc, "Bad NURBS geometry")) { + error->type = UFBX_ERROR_BAD_NURBS; + } else if (!strcmp(desc, "Bad index")) { + error->type = UFBX_ERROR_BAD_INDEX; + } else if (!strcmp(desc, "Unsafe options")) { + error->type = UFBX_ERROR_UNSAFE_OPTIONS; + } + error->description.data = desc; + error->description.length = strlen(desc); +} + +// -- Allocator + +// Returned for zero size allocations, place in the constant data +// to catch writes to bad allocations. +#if defined(UFBX_REGRESSION) +static const char ufbxi_zero_size_buffer[4096] = { 0 }; +#else +static const char ufbxi_zero_size_buffer[64] = { 0 }; +#endif + +static ufbxi_forceinline size_t ufbxi_align_to_mask(size_t value, size_t align_mask) +{ + return value + (((size_t)0 - value) & align_mask); +} + +static ufbxi_forceinline size_t ufbxi_size_align_mask(size_t size) +{ + // Align to the all bits below the lowest set one in `size` + // up to a maximum of 0x7 (align to 8 bytes). + return ((size ^ (size - 1)) >> 1) & 0x7; +} + +typedef struct { + ufbx_error *error; + size_t current_size; + size_t max_size; + size_t num_allocs; + size_t max_allocs; + size_t huge_size; + size_t chunk_max; + ufbx_allocator_opts ator; + const char *name; +} ufbxi_allocator; + +static ufbxi_forceinline bool ufbxi_does_overflow(size_t total, size_t a, size_t b) +{ + // If `a` and `b` have at most 4 bits per `size_t` byte, the product can't overflow. + if (((a | b) >> sizeof(size_t)*4) != 0) { + if (a != 0 && total / a != b) return true; + } + return false; +} + +static ufbxi_noinline void *ufbxi_alloc_size(ufbxi_allocator *ator, size_t size, size_t n) +{ + // Always succeed with an empty non-NULL buffer for empty allocations + ufbx_assert(size > 0); + if (n == 0) return (void*)ufbxi_zero_size_buffer; + + size_t total = size * n; + ufbxi_check_return_err(ator->error, !ufbxi_does_overflow(total, size, n), NULL); + ufbxi_check_return_err(ator->error, total <= SIZE_MAX / 2, NULL); // Make sure it's always safe to double allocations + if (!(total < ator->max_size - ator->current_size)) { + ufbxi_report_err_msg(ator->error, "total <= ator->max_size - ator->current_size", "Memory limit exceeded"); + ufbxi_fmt_err_info(ator->error, "%s", ator->name); + return NULL; + } + if (!(ator->num_allocs < ator->max_allocs)) { + ufbxi_report_err_msg(ator->error, "ator->num_allocs < ator->max_allocs", "Allocation limit exceeded"); + ufbxi_fmt_err_info(ator->error, "%s", ator->name); + return NULL; + } + ator->num_allocs++; + + ator->current_size += total; + + void *ptr; + if (ator->ator.allocator.alloc_fn) { + ptr = ator->ator.allocator.alloc_fn(ator->ator.allocator.user, total); + } else if (ator->ator.allocator.realloc_fn) { + ptr = ator->ator.allocator.realloc_fn(ator->ator.allocator.user, NULL, 0, total); + } else { + ptr = malloc(total); + } + + if (!ptr) { + ufbxi_report_err_msg(ator->error, "ptr", "Out of memory"); + ufbxi_fmt_err_info(ator->error, "%s", ator->name); + return NULL; + } + ufbx_assert(((uintptr_t)ptr & ufbxi_size_align_mask(total)) == 0); + + return ptr; +} + +static void ufbxi_free_size(ufbxi_allocator *ator, size_t size, void *ptr, size_t n); +static ufbxi_noinline void *ufbxi_realloc_size(ufbxi_allocator *ator, size_t size, void *old_ptr, size_t old_n, size_t n) +{ + ufbx_assert(size > 0); + // realloc() with zero old/new size is equivalent to alloc()/free() + if (old_n == 0) return ufbxi_alloc_size(ator, size, n); + if (n == 0) { ufbxi_free_size(ator, size, old_ptr, old_n); return NULL; } + + size_t old_total = size * old_n; + size_t total = size * n; + + // The old values have been checked by a previous allocate call + ufbx_assert(!ufbxi_does_overflow(old_total, size, old_n)); + ufbx_assert(old_total <= ator->current_size); + + ufbxi_check_return_err(ator->error, !ufbxi_does_overflow(total, size, n), NULL); + ufbxi_check_return_err(ator->error, total <= SIZE_MAX / 2, NULL); // Make sure it's always safe to double allocations + ufbxi_check_return_err_msg(ator->error, total <= ator->max_size - ator->current_size, NULL, "Memory limit exceeded"); + ufbxi_check_return_err_msg(ator->error, ator->num_allocs < ator->max_allocs, NULL, "Allocation limit exceeded"); + ator->num_allocs++; + + ator->current_size += total; + ator->current_size -= old_total; + + void *ptr; + if (ator->ator.allocator.realloc_fn) { + ptr = ator->ator.allocator.realloc_fn(ator->ator.allocator.user, old_ptr, old_total, total); + } else if (ator->ator.allocator.alloc_fn) { + // Use user-provided alloc_fn() and free_fn() + ptr = ator->ator.allocator.alloc_fn(ator->ator.allocator.user, total); + if (ptr) memcpy(ptr, old_ptr, old_total); + if (ator->ator.allocator.free_fn) { + ator->ator.allocator.free_fn(ator->ator.allocator.user, old_ptr, old_total); + } + } else { + ptr = realloc(old_ptr, total); + } + + ufbxi_check_return_err_msg(ator->error, ptr, NULL, "Out of memory"); + ufbx_assert(((uintptr_t)ptr & ufbxi_size_align_mask(total)) == 0); + + return ptr; +} + +static ufbxi_noinline void ufbxi_free_size(ufbxi_allocator *ator, size_t size, void *ptr, size_t n) +{ + ufbx_assert(size > 0); + if (n == 0) return; + ufbx_assert(ptr); + + size_t total = size * n; + + // The old values have been checked by a previous allocate call + ufbx_assert(!ufbxi_does_overflow(total, size, n)); + ufbx_assert(total <= ator->current_size); + + ator->current_size -= total; + + if (ator->ator.allocator.alloc_fn || ator->ator.allocator.realloc_fn) { + // Don't call default free() if there is an user-provided `alloc_fn()` + if (ator->ator.allocator.free_fn) { + ator->ator.allocator.free_fn(ator->ator.allocator.user, ptr, total); + } else if (ator->ator.allocator.realloc_fn) { + ator->ator.allocator.realloc_fn(ator->ator.allocator.user, ptr, total, 0); + } + } else { + free(ptr); + } +} + +ufbxi_noinline ufbxi_nodiscard static bool ufbxi_grow_array_size(ufbxi_allocator *ator, size_t size, void *p_ptr, size_t *p_cap, size_t n) +{ + #if defined(UFBX_REGRESSION) + { + ufbxi_check_return_err_msg(ator->error, ator->num_allocs < ator->max_allocs, false, "Allocation limit exceeded"); + ator->num_allocs++; + } + #endif + + if (n <= *p_cap) return true; + void *ptr = *(void**)p_ptr; + size_t old_n = *p_cap; + if (old_n >= n) return true; + size_t new_n = ufbxi_max_sz(old_n * 2, n); + void *new_ptr = ufbxi_realloc_size(ator, size, ptr, old_n, new_n); + if (!new_ptr) return false; + *(void**)p_ptr = new_ptr; + *p_cap = new_n; + return true; +} + +static ufbxi_noinline void ufbxi_free_ator(ufbxi_allocator *ator) +{ + ufbx_assert(ator->current_size == 0); + + ufbx_free_allocator_fn *free_fn = ator->ator.allocator.free_allocator_fn; + if (free_fn) { + void *user = ator->ator.allocator.user; + free_fn(user); + } +} + +#define ufbxi_alloc(ator, type, n) ufbxi_maybe_null((type*)ufbxi_alloc_size((ator), sizeof(type), (n))) +#define ufbxi_alloc_zero(ator, type, n) ufbxi_maybe_null((type*)ufbxi_alloc_zero_size((ator), sizeof(type), (n))) +#define ufbxi_realloc(ator, type, old_ptr, old_n, n) ufbxi_maybe_null((type*)ufbxi_realloc_size((ator), sizeof(type), (old_ptr), (old_n), (n))) +#define ufbxi_realloc_zero(ator, type, old_ptr, old_n, n) ufbxi_maybe_null((type*)ufbxi_realloc_zero_size((ator), sizeof(type), (old_ptr), (old_n), (n))) +#define ufbxi_free(ator, type, ptr, n) ufbxi_free_size((ator), sizeof(type), (ptr), (n)) + +#define ufbxi_grow_array(ator, p_ptr, p_cap, n) ufbxi_grow_array_size((ator), sizeof(**(p_ptr)), (p_ptr), (p_cap), (n)) + +#define UFBXI_SCENE_IMP_MAGIC 0x58424655 +#define UFBXI_MESH_IMP_MAGIC 0x48534d55 +#define UFBXI_LINE_CURVE_IMP_MAGIC 0x55434c55 +#define UFBXI_CACHE_IMP_MAGIC 0x48434355 +#define UFBXI_REFCOUNT_IMP_MAGIC 0x46455255 +#define UFBXI_BUF_CHUNK_IMP_MAGIC 0x46554255 + +// -- Memory buffer +// +// General purpose memory buffer that can be used either as a chunked linear memory +// allocator or a non-contiguous stack. You can convert the contents of `ufbxi_buf` +// to a contiguous range of memory by calling `ufbxi_make_array[_all]()` + +typedef struct ufbxi_buf_padding ufbxi_buf_padding; +typedef struct ufbxi_buf_chunk ufbxi_buf_chunk; + +struct ufbxi_buf_padding { + size_t original_pos; // < Original position before aligning + size_t prev_padding; // < Starting offset of the previous `ufbxi_buf_padding` +}; + +struct ufbxi_buf_chunk { + + // Linked list of nodes + ufbxi_buf_chunk *root; + ufbxi_buf_chunk *prev; + ufbxi_buf_chunk *next; + + union { + size_t magic; // < Magic for debugging + void *align_0; // < Align to 4x pointer size (16/32 bytes) + }; + + size_t size; // < Size of the chunk `data`, excluding this header + size_t pushed_pos; // < Size of valid data when pushed to the list + size_t next_size; // < Next geometrically growing chunk size to allocate + size_t padding_pos; // < One past the offset of the most recent `ufbxi_buf_padding` + + char data[]; // < Must be aligned to 8 bytes +}; + +ufbx_static_assert(buf_chunk_align, offsetof(ufbxi_buf_chunk, data) % 8 == 0); + +typedef struct { + ufbxi_allocator *ator; + + // Current chunks for normal and huge allocations. + // Ordered buffers (`!ufbx_buf.unordered`) never use `chunks[1]` + ufbxi_buf_chunk *chunks[2]; + + // Inline state for non-huge chunks + size_t pos; // < Next offset to allocate from + size_t size; // < Size of the current chunk ie. `chunks[0]->size` (or 0 if `chunks[0] == NULL`) + + size_t num_items; // < Number of individual items pushed to the buffer + + bool unordered; // < Does not support popping from the buffer + bool clearable; // < Supports clearing the whole buffer even if `unordered` +} ufbxi_buf; + +typedef struct { + ufbxi_buf_chunk *chunk; + size_t pos; + size_t num_items; +} ufbxi_buf_state; + +static ufbxi_noinline void *ufbxi_push_size_new_block(ufbxi_buf *b, size_t size) +{ + bool huge = size >= b->ator->huge_size; + + // Use the second chunk "list" for huge unordered chunks. + // The state of these chunks is not tracked by `ufbxi_buf.pos/size`. + uint32_t list_ix = ((uint32_t)b->unordered & (uint32_t)huge); + + ufbxi_buf_chunk *chunk = b->chunks[list_ix]; + if (chunk) { + if (list_ix == 0) { + // Store the final position for the retired chunk and scan free + // chunks in case we find one the allocation fits in. + chunk->pushed_pos = b->pos; + ufbxi_buf_chunk *next = chunk->next; + while (next != NULL) { + ufbx_assert(next->magic == UFBXI_BUF_CHUNK_IMP_MAGIC); + chunk = next; + ufbx_assert(b->unordered || chunk->pushed_pos == 0); + chunk->pushed_pos = 0; + if (size <= chunk->size) { + b->chunks[0] = chunk; + b->pos = (uint32_t)size; + b->size = chunk->size; + return chunk->data; + } + next = chunk->next; + } + } else if (b->clearable) { + // Keep track of the `UFBXI_HUGE_MAX_SCAN` largest chunks and + // retain them. Overflowing chunks are freed in `ufbxi_buf_clear()` + size_t align_mask = ufbxi_size_align_mask(size); + ufbxi_buf_chunk *next = chunk; + + ufbxi_buf_chunk *best_chunk = NULL; + size_t best_space = SIZE_MAX; + + // Clearable huge chunks are sorted by descending size. Check the first N + // chunks for reuse and find the place a new block should be inserted if + // no suitable space is found. Chunk ordering in the tail doesn't matter + // as those chunks are never reused. + // Unreachable chunks in the tail are freed in `ufbxi_buf_clear()`. + for (size_t i = 0; next && i < UFBXI_HUGE_MAX_SCAN; i++) { + ufbx_assert(next->magic == UFBXI_BUF_CHUNK_IMP_MAGIC); + if (next->size < size) break; + chunk = next; + + // Try to reuse chunks using a best-fit strategy. + size_t pos = ufbxi_align_to_mask(chunk->pushed_pos, align_mask); + size_t space = chunk->size - pos; + if (size <= space) { + if (space < best_space) { + best_chunk = chunk; + best_space = space; + } + } + + next = chunk->next; + } + + // Early return if we found a slot. + if (best_chunk) { + size_t pos = ufbxi_align_to_mask(best_chunk->pushed_pos, align_mask); + best_chunk->pushed_pos = pos + size; + return best_chunk->data + pos; + } + } + } + + // Allocate a new chunk, grow `next_size` geometrically but don't double + // the current or previous user sizes if they are larger. + size_t chunk_size, next_size; + + // If `size` is larger than `huge_size` don't grow `next_size` geometrically, + // but use a dedicated allocation. + if (huge) { + next_size = chunk ? chunk->next_size : 4096; + if (next_size > b->ator->chunk_max) next_size = b->ator->chunk_max; + chunk_size = size; + } else { + next_size = chunk ? chunk->next_size * 2 : 4096; + if (next_size > b->ator->chunk_max) next_size = b->ator->chunk_max; + chunk_size = next_size - sizeof(ufbxi_buf_chunk); + if (chunk_size < size) chunk_size = size; + } + + // Align chunk sizes to 16 bytes + chunk_size = ufbxi_align_to_mask(chunk_size, 0xf); + + ufbxi_buf_chunk *new_chunk = (ufbxi_buf_chunk*)ufbxi_alloc_size(b->ator, 1, sizeof(ufbxi_buf_chunk) + chunk_size); + if (!new_chunk) return NULL; + + new_chunk->prev = chunk; + new_chunk->size = chunk_size; + new_chunk->next_size = next_size; + new_chunk->magic = UFBXI_BUF_CHUNK_IMP_MAGIC; + new_chunk->padding_pos = 0; + new_chunk->pushed_pos = 0; + + // Link the chunk to the list and set it as the active one + if (chunk) { + ufbxi_buf_chunk *next = chunk->next; + if (next) next->prev = new_chunk; + new_chunk->next = next; + chunk->next = new_chunk; + new_chunk->root = chunk->root; + } else { + new_chunk->next = NULL; + new_chunk->root = new_chunk; + } + + if (list_ix == 0) { + b->chunks[0] = new_chunk; + b->pos = size; + b->size = chunk_size; + } else { + ufbxi_buf_chunk *root = b->chunks[1]; + if (!root) { + b->chunks[1] = new_chunk; + } else if (root->size < chunk_size) { + // Swap root and self if necessary, we should have bailed out + // in the search loop in the first iteration so `new_chunk` should + // directly follow `root`. + // HACK: This ends up with `chunks[1]` entries having inconsistent + // `ufbxi_buf_chunk.root` pointers but other code only reads `chunks[1].root` + // TODO: Move roots out of the chunks? + ufbx_assert(root->next == new_chunk); + ufbx_assert(new_chunk->prev == root); + if (new_chunk->next) new_chunk->next->prev = root; + root->next = new_chunk->next; + new_chunk->next = root; + new_chunk->prev = NULL; + new_chunk->root = new_chunk; + b->chunks[1] = new_chunk; + } + new_chunk->pushed_pos = size; + } + + return new_chunk->data; +} + +static ufbxi_noinline void *ufbxi_push_size(ufbxi_buf *b, size_t size, size_t n) +{ + // Always succeed with an empty non-NULL buffer for empty allocations + ufbx_assert(size > 0); + if (n == 0) return (void*)ufbxi_zero_size_buffer; + + size_t total = size * n; + if (ufbxi_does_overflow(total, size, n)) return NULL; + + #if defined(UFBX_REGRESSION) + { + ufbxi_allocator *ator = b->ator; + ufbxi_check_return_err_msg(ator->error, ator->num_allocs < ator->max_allocs, NULL, "Allocation limit exceeded"); + ator->num_allocs++; + } + #endif + + b->num_items += n; + + // Align to the natural alignment based on the size + size_t align_mask = ufbxi_size_align_mask(size); + size_t pos = ufbxi_align_to_mask(b->pos, align_mask); + + if (!b->unordered && pos != b->pos) { + // Alignment mismatch in an unordered block. Align to 16 bytes to guarantee + // sufficient alignment for anything afterwards and mark the padding. + // If we overflow the current block we don't need to care as the block + // boundaries are not contiguous. + pos = ufbxi_align_to_mask(b->pos, 0xf); + if (total < SIZE_MAX - 16 && total + 16 <= b->size - pos) { + ufbxi_buf_chunk *chunk = b->chunks[0]; + ufbxi_buf_padding *padding = (ufbxi_buf_padding*)(chunk->data + pos); + padding->original_pos = b->pos; + padding->prev_padding = chunk->padding_pos; + chunk->padding_pos = pos + 16 + 1; + b->pos = pos + 16 + total; + return (char*)padding + 16; + } else { + return ufbxi_push_size_new_block(b, total); + } + } else { + // Try to push to the current block. Allocate a new block + // if the aligned size doesn't fit. + if (total <= b->size - pos) { + b->pos = pos + total; + return b->chunks[0]->data + pos; + } else { + return ufbxi_push_size_new_block(b, total); + } + } +} + +static ufbxi_forceinline void *ufbxi_push_size_fast(ufbxi_buf *b, size_t size, size_t n) +{ + // Always succeed with an empty non-NULL buffer for empty allocations + ufbxi_regression_assert(size > 0); + ufbxi_regression_assert(n > 0); + + size_t total = size * n; + ufbxi_regression_assert(!ufbxi_does_overflow(total, size, n)); + + #if defined(UFBX_REGRESSION) + { + ufbxi_allocator *ator = b->ator; + ufbxi_check_return_err_msg(ator->error, ator->num_allocs < ator->max_allocs, NULL, "Allocation limit exceeded"); + ator->num_allocs++; + } + #endif + + b->num_items += n; + + // Homogeneous arrays should always be aligned + size_t pos = b->pos; + ufbxi_regression_assert((pos & ufbxi_size_align_mask(size)) == 0); + + // Try to push to the current block. Allocate a new block + // if the aligned size doesn't fit. + if (total <= b->size - pos) { + b->pos = pos + total; + return b->chunks[0]->data + pos; + } else { + return ufbxi_push_size_new_block(b, total); + } +} + +static ufbxi_forceinline void *ufbxi_push_size_zero(ufbxi_buf *b, size_t size, size_t n) +{ + void *ptr = ufbxi_push_size(b, size, n); + if (ptr) memset(ptr, 0, size * n); + return ptr; +} + +ufbxi_nodiscard static ufbxi_forceinline void *ufbxi_push_size_copy(ufbxi_buf *b, size_t size, size_t n, const void *data) +{ + // Always succeed with an empty non-NULL buffer for empty allocations, even if `data == NULL` + ufbx_assert(size > 0); + if (n == 0) return (void*)ufbxi_zero_size_buffer; + + ufbx_assert(data); + void *ptr = ufbxi_push_size(b, size, n); + if (ptr) memcpy(ptr, data, size * n); + return ptr; +} + +static ufbxi_noinline void ufbxi_buf_free_unused(ufbxi_buf *b) +{ + ufbx_assert(!b->unordered); + + ufbxi_buf_chunk *chunk = b->chunks[0]; + if (!chunk) return; + + ufbxi_buf_chunk *next = chunk->next; + while (next) { + ufbxi_buf_chunk *to_free = next; + next = next->next; + ufbx_assert(to_free->magic == UFBXI_BUF_CHUNK_IMP_MAGIC); + to_free->magic = 0; + ufbxi_free_size(b->ator, 1, to_free, sizeof(ufbxi_buf_chunk) + to_free->size); + } + chunk->next = NULL; + + while (b->pos == 0 && chunk) { + ufbxi_buf_chunk *prev = chunk->prev; + ufbx_assert(chunk->magic == UFBXI_BUF_CHUNK_IMP_MAGIC); + chunk->magic = 0; + ufbxi_free_size(b->ator, 1, chunk, sizeof(ufbxi_buf_chunk) + chunk->size); + chunk = prev; + b->chunks[0] = prev; + if (prev) { + prev->next = NULL; + b->pos = prev->pushed_pos; + b->size = prev->size; + } else { + b->pos = 0; + b->size = 0; + } + } +} + +static ufbxi_noinline void ufbxi_pop_size(ufbxi_buf *b, size_t size, size_t n, void *dst, bool peek) +{ + ufbx_assert(!b->unordered); + ufbx_assert(size > 0); + ufbx_assert(b->num_items >= n); + if (!peek) b->num_items -= n; + + char *ptr = (char*)dst; + size_t bytes_left = size * n; + + // We've already pushed this, it better not overflow + ufbx_assert(!ufbxi_does_overflow(bytes_left, size, n)); + + if (ptr) { + ptr += bytes_left; + size_t pos = b->pos; + ufbxi_buf_chunk *chunk = b->chunks[0]; + for (;;) { + if (bytes_left <= pos) { + // Rest of the data is in this single chunk + pos -= bytes_left; + if (!peek) b->pos = pos; + ptr -= bytes_left; + if (bytes_left > 0) { + memcpy(ptr, chunk->data + pos, bytes_left); + } + break; + } else { + // Pop the whole chunk + ptr -= pos; + bytes_left -= pos; + memcpy(ptr, chunk->data, pos); + if (!peek) { + chunk->pushed_pos = 0; + chunk = chunk->prev; + b->chunks[0] = chunk; + b->size = chunk->size; + } else { + chunk = chunk->prev; + } + pos = chunk->pushed_pos; + } + } + } else { + size_t pos = b->pos; + ufbxi_buf_chunk *chunk = b->chunks[0]; + for (;;) { + if (bytes_left <= pos) { + // Rest of the data is in this single chunk + pos -= bytes_left; + if (!peek) b->pos = pos; + break; + } else { + // Pop the whole chunk + bytes_left -= pos; + if (!peek) { + chunk->pushed_pos = 0; + chunk = chunk->prev; + b->chunks[0] = chunk; + b->size = chunk->size; + } else { + chunk = chunk->prev; + } + pos = chunk->pushed_pos; + } + } + } + + if (!peek) { + // Check if we need to rewind past some alignment padding + ufbxi_buf_chunk *chunk = b->chunks[0]; + if (chunk) { + size_t pos = b->pos, padding_pos = chunk->padding_pos; + if (pos < padding_pos) { + ufbx_assert(pos + 1 == padding_pos); + ufbxi_buf_padding *padding = (ufbxi_buf_padding*)(chunk->data + padding_pos - 1 - 16); + b->pos = padding->original_pos; + chunk->padding_pos = padding->prev_padding; + } + } + + // Immediately free popped items if all the allocations are huge + // as it means we want to have dedicated allocations for each push. + if (b->ator->huge_size <= 1) { + ufbxi_buf_free_unused(b); + } + } +} + +static ufbxi_noinline void *ufbxi_push_pop_size(ufbxi_buf *dst, ufbxi_buf *src, size_t size, size_t n) +{ + void *data = ufbxi_push_size(dst, size, n); + if (!data) return NULL; + ufbxi_pop_size(src, size, n, data, false); + return data; +} + +static ufbxi_noinline void *ufbxi_push_peek_size(ufbxi_buf *dst, ufbxi_buf *src, size_t size, size_t n) +{ + void *data = ufbxi_push_size(dst, size, n); + if (!data) return NULL; + ufbxi_pop_size(src, size, n, data, true); + return data; +} + +static ufbxi_noinline void ufbxi_buf_free(ufbxi_buf *buf) +{ + ufbxi_nounroll for (size_t i = 0; i < 2; i++) { + ufbxi_buf_chunk *chunk = buf->chunks[i]; + if (chunk) { + chunk = chunk->root; + while (chunk) { + ufbxi_buf_chunk *next = chunk->next; + ufbx_assert(chunk->magic == UFBXI_BUF_CHUNK_IMP_MAGIC); + chunk->magic = 0; + ufbxi_free_size(buf->ator, 1, chunk, sizeof(ufbxi_buf_chunk) + chunk->size); + chunk = next; + } + } + buf->chunks[i] = NULL; + } + buf->pos = 0; + buf->size = 0; + buf->num_items = 0; +} + +static ufbxi_noinline void ufbxi_buf_clear(ufbxi_buf *buf) +{ + // Only unordered or clearable buffers can be cleared + ufbx_assert(!buf->unordered || buf->clearable); + + // Free the memory if using ASAN + if (buf->ator->huge_size <= 1) { + ufbxi_buf_free(buf); + return; + } + + // Reset the non-huge chunks as `chunk->next` is always free. + ufbxi_buf_chunk *chunk = buf->chunks[0]; + if (chunk) { + ufbxi_buf_chunk *root = chunk->root; + buf->chunks[0] = root; + buf->pos = 0; + buf->size = root->size; + } + buf->num_items = 0; + + // Huge chunks are always sorted by descending size and + // `chunks[1]` points to the largest one. + ufbxi_buf_chunk *huge = buf->chunks[1]; + if (huge) { + // Reset the first N ones that are tracked. + for (size_t i = 0; huge && i < UFBXI_HUGE_MAX_SCAN; i++) { + huge->pushed_pos = 0; + huge = huge->next; + } + + // Got unreachable tail that should be freed: Unlink from the last + // tracked chunk and free the rest. + if (huge) { + huge->prev->next = NULL; + while (huge) { + ufbxi_buf_chunk *next = huge->next; + ufbx_assert(huge->magic == UFBXI_BUF_CHUNK_IMP_MAGIC); + huge->magic = 0; + ufbxi_free_size(buf->ator, 1, huge, sizeof(ufbxi_buf_chunk) + huge->size); + huge = next; + } + } + } +} + +#define ufbxi_push(b, type, n) ufbxi_maybe_null((type*)ufbxi_push_size((b), sizeof(type), (n))) +#define ufbxi_push_zero(b, type, n) ufbxi_maybe_null((type*)ufbxi_push_size_zero((b), sizeof(type), (n))) +#define ufbxi_push_copy(b, type, n, data) ufbxi_maybe_null((type*)ufbxi_push_size_copy((b), sizeof(type), (n), (data))) +#define ufbxi_push_fast(b, type, n) ufbxi_maybe_null((type*)ufbxi_push_size_fast((b), sizeof(type), (n))) +#define ufbxi_pop(b, type, n, dst) ufbxi_pop_size((b), sizeof(type), (n), (dst), false) +#define ufbxi_peek(b, type, n, dst) ufbxi_pop_size((b), sizeof(type), (n), (dst), true) +#define ufbxi_push_pop(dst, src, type, n) ufbxi_maybe_null((type*)ufbxi_push_pop_size((dst), (src), sizeof(type), (n))) +#define ufbxi_push_peek(dst, src, type, n) ufbxi_maybe_null((type*)ufbxi_push_peek_size((dst), (src), sizeof(type), (n))) + +// -- Hash map +// +// The actual element comparison is left to the user of `ufbxi_map`, see usage below. +// +// NOTES: +// ufbxi_map_insert() does not support duplicate values, use find first if duplicates are possible! +// Inserting duplicate elements fails with an assertion if `UFBX_REGRESSION` is enabled. + +typedef struct ufbxi_aa_node ufbxi_aa_node; + +typedef int ufbxi_cmp_fn(void *user, const void *a, const void *b); + +struct ufbxi_aa_node { + ufbxi_aa_node *left, *right; + uint32_t level; + uint32_t index; +}; + +typedef struct { + ufbxi_allocator *ator; + size_t data_size; + + void *items; + uint64_t *entries; + uint32_t mask; + + uint32_t capacity; + uint32_t size; + + ufbxi_cmp_fn *cmp_fn; + void *cmp_user; + + ufbxi_buf aa_buf; + ufbxi_aa_node *aa_root; + +} ufbxi_map; + +static ufbxi_noinline void ufbxi_map_init(ufbxi_map *map, ufbxi_allocator *ator, ufbxi_cmp_fn *cmp_fn, void *cmp_user) +{ + map->ator = ator; +#if defined(UFBX_REGRESSION) + // HACK: Maps contain pointers that are not stable between runs, in regression + // mode this causes instability in allocation patterns due to different AA trees + // being built, which is a problem in fuzz checks that need to have deterministic + // allocation counts. We can work around this using a local allocator that doesn't + // count the allocations. + { + ufbxi_allocator *regression_ator = (ufbxi_allocator*)malloc(sizeof(ufbxi_allocator)); + ufbx_assert(regression_ator); + memset(regression_ator, 0, sizeof(ufbxi_allocator)); + regression_ator->name = "regression"; + regression_ator->error = ator->error; + regression_ator->huge_size = ator->huge_size; + regression_ator->max_size = SIZE_MAX; + regression_ator->max_allocs = SIZE_MAX; + regression_ator->chunk_max = 0x1000000; + map->aa_buf.ator = regression_ator; + } +#else + map->aa_buf.ator = ator; +#endif + map->cmp_fn = cmp_fn; + map->cmp_user = cmp_user; +} + +static ufbxi_noinline void ufbxi_map_free(ufbxi_map *map) +{ +#if defined(UFBX_REGRESSION) + ufbxi_allocator *regression_ator = map->aa_buf.ator; +#endif + + ufbxi_buf_free(&map->aa_buf); + ufbxi_free(map->ator, char, map->entries, map->data_size); + map->entries = NULL; + map->items = NULL; + map->aa_root = NULL; + map->mask = map->capacity = map->size = 0; + +#if defined(UFBX_REGRESSION) + if (regression_ator) { + ufbxi_free_ator(regression_ator); + free(regression_ator); + } +#endif +} + +// Recursion limit: log2(2^64 / sizeof(ufbxi_aa_node)) +static ufbxi_noinline ufbxi_aa_node *ufbxi_aa_tree_insert(ufbxi_map *map, ufbxi_aa_node *node, const void *value, uint32_t index, size_t item_size) + ufbxi_recursive_function(ufbxi_aa_node *, ufbxi_aa_tree_insert, (map, node, value, index, item_size), 59, + (ufbxi_map *map, ufbxi_aa_node *node, const void *value, uint32_t index, size_t item_size)) +{ + if (!node) { + ufbxi_aa_node *new_node = ufbxi_push(&map->aa_buf, ufbxi_aa_node, 1); + if (!new_node) return NULL; + new_node->left = NULL; + new_node->right = NULL; + new_node->level = 1; + new_node->index = index; + return new_node; + } + + void *entry = (char*)map->items + node->index * item_size; + int cmp = map->cmp_fn(map->cmp_user, value, entry); + if (cmp < 0) { + node->left = ufbxi_aa_tree_insert(map, node->left, value, index, item_size); + } else if (cmp >= 0) { + node->right = ufbxi_aa_tree_insert(map, node->right, value, index, item_size); + } + + if (node->left && node->left->level == node->level) { + ufbxi_aa_node *left = node->left; + node->left = left->right; + left->right = node; + node = left; + } + + if (node->right && node->right->right && node->right->right->level == node->level) { + ufbxi_aa_node *right = node->right; + node->right = right->left; + right->left = node; + right->level += 1; + node = right; + } + + return node; +} + +static ufbxi_noinline void *ufbxi_aa_tree_find(ufbxi_map *map, const void *value, size_t item_size) +{ + ufbxi_aa_node *node = map->aa_root; + while (node) { + void *entry = (char*)map->items + node->index * item_size; + int cmp = map->cmp_fn(map->cmp_user, value, entry); + if (cmp < 0) { + node = node->left; + } else if (cmp > 0) { + node = node->right; + } else { + return entry; + } + } + return NULL; +} + +static ufbxi_noinline bool ufbxi_map_grow_size_imp(ufbxi_map *map, size_t item_size, size_t min_size) +{ + ufbx_assert(min_size > 0); + const double load_factor = 0.7; + + // Find the lowest power of two size that fits `min_size` within `load_factor` + size_t num_entries = map->mask + 1; + size_t new_size = (size_t)((double)num_entries * load_factor); + if (min_size < map->capacity + 1) min_size = map->capacity + 1; + while (new_size < min_size) { + num_entries *= 2; + new_size = (size_t)((double)num_entries * load_factor); + } + + // Check for overflow + ufbxi_check_return_err(map->ator->error, SIZE_MAX / num_entries > sizeof(uint64_t), false); + size_t alloc_size = num_entries * sizeof(uint64_t); + + // Allocate a combined entry/item memory block + ufbxi_check_return_err(map->ator->error, (SIZE_MAX - alloc_size) / new_size > item_size, false); + size_t data_size = alloc_size + new_size * item_size; + + char *data = ufbxi_alloc(map->ator, char, data_size); + ufbxi_check_return_err(map->ator->error, data, false); + + // Copy the previous user items over + uint64_t *old_entries = map->entries; + uint64_t *new_entries = (uint64_t*)data; + void *new_items = data + alloc_size; + if (map->size > 0) { + memcpy(new_items, map->items, item_size * map->size); + } + + // Re-hash the entries + uint32_t old_mask = map->mask; + uint32_t new_mask = (uint32_t)(num_entries) - 1; + memset(new_entries, 0, sizeof(uint64_t) * num_entries); + if (old_mask) { + for (uint32_t i = 0; i <= old_mask; i++) { + uint64_t entry, new_entry = old_entries[i]; + if (!new_entry) continue; + + // Reconstruct the hash of the old entry at `i` + uint32_t old_scan = (uint32_t)(new_entry & old_mask) - 1; + uint32_t hash = ((uint32_t)new_entry & ~old_mask) | ((i - old_scan) & old_mask); + uint32_t slot = hash & new_mask; + new_entry &= ~(uint64_t)new_mask; + + // Scan forward until we find an empty slot, potentially swapping + // `new_element` if it has a shorter scan distance (Robin Hood). + uint32_t scan = 1; + while ((entry = new_entries[slot]) != 0) { + uint32_t entry_scan = (entry & new_mask); + if (entry_scan < scan) { + new_entries[slot] = new_entry + scan; + new_entry = (entry & ~(uint64_t)new_mask); + scan = entry_scan; + } + scan += 1; + slot = (slot + 1) & new_mask; + } + new_entries[slot] = new_entry + scan; + } + } + + // And finally free the previous allocation + ufbxi_free(map->ator, char, (char*)old_entries, map->data_size); + map->items = new_items; + map->data_size = data_size; + map->entries = new_entries; + map->mask = new_mask; + map->capacity = (uint32_t)new_size; + + return true; +} + +static ufbxi_forceinline bool ufbxi_map_grow_size(ufbxi_map *map, size_t size, size_t min_size) +{ + #if defined(UFBX_REGRESSION) + { + ufbxi_allocator *ator = map->ator; + ufbxi_check_return_err_msg(ator->error, ator->num_allocs < ator->max_allocs, false, "Allocation limit exceeded"); + ator->num_allocs++; + } + #endif + + if (map->size < map->capacity && map->capacity >= min_size) return true; + return ufbxi_map_grow_size_imp(map, size, min_size); +} + +static ufbxi_noinline void *ufbxi_map_find_size(ufbxi_map *map, size_t size, uint32_t hash, const void *value) +{ + uint64_t *entries = map->entries; + uint32_t mask = map->mask, scan = 0; + + uint32_t ref = hash & ~mask; + if (!mask || scan == UINT32_MAX) return 0; + + // Scan entries until we find an exact match of the hash or until we hit + // an element that has lower scan distance than our search (Robin Hood). + // The encoding guarantees that zero slots also terminate with the same test. + for (;;) { + uint64_t entry = entries[(hash + scan) & mask]; + scan += 1; + if ((uint32_t)entry == ref + scan) { + uint32_t index = (uint32_t)(entry >> 32u); + void *data = (char*)map->items + size * index; + int cmp = map->cmp_fn(map->cmp_user, value, data); + if (cmp == 0) return data; + } else if ((entry & mask) < scan) { + if (map->aa_root) { + return ufbxi_aa_tree_find(map, value, size); + } else { + return NULL; + } + } + } +} + +static ufbxi_noinline void *ufbxi_map_insert_size(ufbxi_map *map, size_t size, uint32_t hash, const void *value) +{ + if (!ufbxi_map_grow_size(map, size, 64)) return NULL; + + ufbxi_regression_assert(ufbxi_map_find_size(map, size, hash, value) == NULL); + + uint32_t index = map->size++; + + uint64_t *entries = map->entries; + uint32_t mask = map->mask; + + // Scan forward until we find an empty slot, potentially swapping + // `new_element` if it has a shorter scan distance (Robin Hood). + uint32_t slot = hash & mask; + uint64_t entry, new_entry = (uint64_t)index << 32u | (hash & ~mask); + uint32_t scan = 1; + while ((entry = entries[slot]) != 0) { + uint32_t entry_scan = (entry & mask); + if (entry_scan < scan) { + entries[slot] = new_entry + scan; + new_entry = (entry & ~(uint64_t)mask); + scan = entry_scan; + } + scan += 1; + slot = (slot + 1) & mask; + + if (scan > UFBXI_MAP_MAX_SCAN) { + uint32_t new_index = (uint32_t)(new_entry >> 32u); + const void *new_value = new_index == index ? value : (const void*)((char*)map->items + size * new_index); + map->aa_root = ufbxi_aa_tree_insert(map, map->aa_root, new_value, new_index, size); + return (char*)map->items + size * index; + } + } + entries[slot] = new_entry + scan; + + return (char*)map->items + size * index; +} + +#define ufbxi_map_grow(map, type, min_size) ufbxi_map_grow_size((map), sizeof(type), (min_size)) +#define ufbxi_map_find(map, type, hash, value) ufbxi_maybe_null((type*)ufbxi_map_find_size((map), sizeof(type), (hash), (value))) +#define ufbxi_map_insert(map, type, hash, value) ufbxi_maybe_null((type*)ufbxi_map_insert_size((map), sizeof(type), (hash), (value))) + +static int ufbxi_map_cmp_uint64(void *user, const void *va, const void *vb) +{ + (void)user; + uint64_t a = *(const uint64_t*)va, b = *(const uint64_t*)vb; + if (a < b) return -1; + if (a > b) return +1; + return 0; +} + +static int ufbxi_map_cmp_const_char_ptr(void *user, const void *va, const void *vb) +{ + (void)user; + const char *a = *(const char **)va, *b = *(const char **)vb; + if (a < b) return -1; + if (a > b) return +1; + return 0; +} + +static int ufbxi_map_cmp_uintptr(void *user, const void *va, const void *vb) +{ + (void)user; + uintptr_t a = *(const uintptr_t*)va, b = *(const uintptr_t*)vb; + if (a < b) return -1; + if (a > b) return +1; + return 0; +} + +// -- Hash functions + +static ufbxi_noinline uint32_t ufbxi_hash_string(const char *str, size_t length) +{ + uint32_t hash = (uint32_t)length; + uint32_t seed = UINT32_C(0x9e3779b9); + if (length >= 4) { + do { + uint32_t word = ufbxi_read_u32(str); + hash = ((hash << 5u | hash >> 27u) ^ word) * seed; + str += 4; + length -= 4; + } while (length >= 4); + + uint32_t word = ufbxi_read_u32(str + length - 4); + hash = ((hash << 5u | hash >> 27u) ^ word) * seed; + } else { + uint32_t word = 0; + if (length >= 1) word |= (uint32_t)(uint8_t)str[0] << 0; + if (length >= 2) word |= (uint32_t)(uint8_t)str[1] << 8; + if (length >= 3) word |= (uint32_t)(uint8_t)str[2] << 16; + hash = ((hash << 5u | hash >> 27u) ^ word) * seed; + } + hash ^= hash >> 16; + hash *= UINT32_C(0x7feb352d); + hash ^= hash >> 15; + return hash; +} + +// NOTE: _Must_ match `ufbxi_hash_string()` +static ufbxi_noinline uint32_t ufbxi_hash_string_check_ascii(const char *str, size_t length, bool *p_non_ascii) +{ + uint32_t ascii_mask = 0; + uint32_t zero_mask = 0; + + ufbx_assert(length > 0); + + uint32_t hash = (uint32_t)length; + uint32_t seed = UINT32_C(0x9e3779b9); + if (length >= 4) { + do { + uint32_t word = ufbxi_read_u32(str); + ascii_mask |= word; + zero_mask |= UINT32_C(0x80808080) - word; + + hash = ((hash << 5u | hash >> 27u) ^ word) * seed; + str += 4; + length -= 4; + } while (length >= 4); + + uint32_t word = ufbxi_read_u32(str + length - 4); + ascii_mask |= word; + zero_mask |= UINT32_C(0x80808080) - word; + + hash = ((hash << 5u | hash >> 27u) ^ word) * seed; + } else { + uint32_t word = 0; + if (length >= 1) word |= (uint32_t)(uint8_t)str[0] << 0; + if (length >= 2) word |= (uint32_t)(uint8_t)str[1] << 8; + if (length >= 3) word |= (uint32_t)(uint8_t)str[2] << 16; + + ascii_mask |= word; + zero_mask |= (UINT32_C(0x80808080) >> ((4u - length) * 8u)) - word; + + hash = ((hash << 5u | hash >> 27u) ^ word) * seed; + } + + // If any character has high bit set or is zero we're not ASCII + if (((ascii_mask | zero_mask) & 0x80808080u) != 0) { + *p_non_ascii = true; + } + + hash ^= hash >> 16; + hash *= UINT32_C(0x7feb352d); + hash ^= hash >> 15; + + return hash; +} + +static ufbxi_forceinline uint32_t ufbxi_hash32(uint32_t x) +{ + x ^= x >> 16; + x *= UINT32_C(0x7feb352d); + x ^= x >> 15; + x *= UINT32_C(0x846ca68b); + x ^= x >> 16; + return x; +} + +static ufbxi_forceinline uint32_t ufbxi_hash64(uint64_t x) +{ + x ^= x >> 32; + x *= UINT64_C(0xd6e8feb86659fd93); + x ^= x >> 32; + x *= UINT64_C(0xd6e8feb86659fd93); + x ^= x >> 32; + return (uint32_t)x; +} + +static ufbxi_forceinline uint32_t ufbxi_hash_uptr(uintptr_t ptr) +{ + return sizeof(ptr) == 8 ? ufbxi_hash64((uint64_t)ptr) : ufbxi_hash32((uint32_t)ptr); +} + +#define ufbxi_hash_ptr(ptr) ufbxi_hash_uptr((uintptr_t)(ptr)) + +// -- Warnings + +ufbxi_nodiscard static ufbxi_noinline size_t ufbxi_utf8_valid_length(const char *str, size_t length) +{ + size_t index = 0; + while (index < length) { + uint8_t c = (uint8_t)str[index]; + size_t left = length - index; + + if ((c & 0x80) == 0) { + if (c != 0) { + index += 1; + continue; + } + } else if ((c & 0xe0) == 0xc0 && left >= 2) { + uint8_t t0 = (uint8_t)str[index + 1]; + uint32_t code = (uint32_t)c << 8 | (uint32_t)t0; + if ((code & 0xc0) == 0x80 && code >= 0xc280) { + index += 2; + continue; + } + } else if ((c & 0xf0) == 0xe0 && left >= 3) { + uint8_t t0 = (uint8_t)str[index + 1], t1 = (uint8_t)str[index + 2]; + uint32_t code = (uint32_t)c << 16 | (uint32_t)t0 << 8 | (uint32_t)t1; + if ((code & 0xc0c0) == 0x8080 && code >= 0xe0a080 && (code < 0xeda080 || code >= 0xee8080)) { + index += 3; + continue; + } + } else if ((c & 0xf8) == 0xf0 && left >= 4) { + uint8_t t0 = (uint8_t)str[index + 1], t1 = (uint8_t)str[index + 2], t2 = (uint8_t)str[index + 3]; + uint32_t code = (uint32_t)c << 24 | (uint32_t)t0 << 16 | (uint32_t)t1 << 8 | (uint32_t)t2; + if ((code & 0xc0c0c0) == 0x808080 && code >= 0xf0908080u && code <= 0xf48fbfbfu) { + index += 4; + continue; + } + } + + break; + } + + ufbx_assert(index <= length); + return index; +} + +typedef struct { + ufbx_error *error; + ufbxi_buf *result; + ufbxi_buf tmp_stack; + ufbx_warning *prev_warnings[UFBX_WARNING_TYPE_COUNT]; +} ufbxi_warnings; + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_vwarnf_imp(ufbxi_warnings *ws, ufbx_warning_type type, const char *fmt, va_list args) +{ + if (!ws) return 1; + if (type >= UFBX_WARNING_TYPE_FIRST_DEDUPLICATED) { + ufbx_warning *prev = ws->prev_warnings[type]; + if (prev) { + prev->count++; + return 1; + } + } + + char desc[256]; + size_t desc_len = (size_t)ufbxi_vsnprintf(desc, sizeof(desc), fmt, args); + + size_t pos = 0; + for (;;) { + pos += ufbxi_utf8_valid_length(desc + pos, desc_len - pos); + if (pos == desc_len) break; + desc[pos++] = '?'; + } + + char *desc_copy = ufbxi_push_copy(ws->result, char, desc_len + 1, desc); + ufbxi_check_err(ws->error, desc_copy); + + ufbx_warning *warning = ufbxi_push(&ws->tmp_stack, ufbx_warning, 1); + ufbxi_check_err(ws->error, warning); + + warning->type = type; + warning->description.data = desc_copy; + warning->description.length = desc_len; + warning->count = 1; + ws->prev_warnings[type] = warning; + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_warnf_imp(ufbxi_warnings *ws, ufbx_warning_type type, const char *fmt, ...) +{ + // NOTE: `ws` may be `NULL` here, handled by `ufbxi_vwarnf()` + va_list args; + va_start(args, fmt); + int ok = ufbxi_vwarnf_imp(ws, type, fmt, args); + va_end(args); + return ok; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_pop_warnings(ufbxi_warnings *ws, ufbx_warning_list *warnings, bool *p_has_warning) +{ + warnings->count = ws->tmp_stack.num_items; + warnings->data = ufbxi_push_pop(ws->result, &ws->tmp_stack, ufbx_warning, warnings->count); + ufbxi_check_err(ws->error, warnings->data); + ufbxi_for_list(ufbx_warning, warning, *warnings) { + p_has_warning[warning->type] = true; + } + return 1; +} + +// -- String pool + +// All strings found in FBX files are interned for deduplication and fast +// comparison. Our fixed internal strings (`ufbxi_String`) are considered the +// canonical pointers for said strings so we can compare them by address. + +typedef struct { + ufbx_error *error; + ufbxi_buf buf; // < Buffer for the actual string data + ufbxi_map map; // < Map of `ufbxi_string` + size_t initial_size; // < Number of initial entries + char *temp_str; // < Temporary string buffer of `temp_cap` + size_t temp_cap; // < Capacity of the temporary buffer + ufbx_unicode_error_handling error_handling; + ufbxi_warnings *warnings; +} ufbxi_string_pool; + +typedef struct { + const char *raw_data; // < UTF-8 data follows at `raw_length+1` if `utf8_length > 0` + uint32_t raw_length; // < Length of the non-sanitized original string + uint32_t utf8_length; // < Length of sanitized UTF-8 string (or zero) +} ufbxi_sanitized_string; + +static ufbxi_forceinline bool ufbxi_str_equal(ufbx_string a, ufbx_string b) +{ + return a.length == b.length && !memcmp(a.data, b.data, a.length); +} + +static ufbxi_forceinline bool ufbxi_str_less(ufbx_string a, ufbx_string b) +{ + size_t len = ufbxi_min_sz(a.length, b.length); + int cmp = memcmp(a.data, b.data, len); + if (cmp != 0) return cmp < 0; + return a.length < b.length; +} + +static ufbxi_forceinline int ufbxi_str_cmp(ufbx_string a, ufbx_string b) +{ + size_t len = ufbxi_min_sz(a.length, b.length); + int cmp = memcmp(a.data, b.data, len); + if (cmp != 0) return cmp; + if (a.length != b.length) return a.length < b.length ? -1 : 1; + return 0; +} + +static ufbxi_forceinline ufbx_string ufbxi_str_c(const char *str) +{ + ufbx_string s = { str, strlen(str) }; + return s; +} + +static ufbxi_noinline uint32_t ufbxi_get_concat_key(const ufbx_string *parts, size_t num_parts) +{ + uint32_t key = 0, shift = 32; + ufbxi_for(const ufbx_string, part, parts, num_parts) { + size_t length = part->length != SIZE_MAX ? part->length : strlen(part->data); + for (size_t i = 0; i < length; i++) { + shift -= 8; + key |= (uint32_t)(uint8_t)part->data[i] << shift; + if (shift == 0) return key; + } + } + return key; +} + +static ufbxi_noinline int ufbxi_concat_str_cmp(const ufbx_string *ref, const ufbx_string *parts, size_t num_parts) +{ + const char *ptr = ref->data, *end = ptr + ref->length; + ufbxi_for(const ufbx_string, part, parts, num_parts) { + size_t length = part->length != SIZE_MAX ? part->length : strlen(part->data); + size_t to_cmp = ufbxi_min_sz(ufbxi_to_size(end - ptr), length); + int cmp = to_cmp > 0 ? memcmp(ptr, part->data, to_cmp) : 0; + if (cmp != 0) return cmp; + if (to_cmp != length) return -1; + ptr += length; + } + return ptr == end ? 0 : +1; +} + +static ufbxi_forceinline bool ufbxi_starts_with(ufbx_string str, ufbx_string prefix) +{ + return str.length >= prefix.length && !memcmp(str.data, prefix.data, prefix.length); +} + +static ufbxi_forceinline bool ufbxi_ends_with(ufbx_string str, ufbx_string suffix) +{ + return str.length >= suffix.length && !memcmp(str.data + str.length - suffix.length, suffix.data, suffix.length); +} + +static ufbxi_noinline bool ufbxi_remove_prefix_len(ufbx_string *str, const char *prefix, size_t prefix_len) +{ + ufbx_string prefix_str = { prefix, prefix_len }; + if (ufbxi_starts_with(*str, prefix_str)) { + str->data += prefix_len; + str->length -= prefix_len; + return true; + } + return false; +} + +static ufbxi_noinline bool ufbxi_remove_suffix_len(ufbx_string *str, const char *suffix, size_t suffix_len) +{ + ufbx_string suffix_str = { suffix, suffix_len }; + if (ufbxi_ends_with(*str, suffix_str)) { + str->length -= suffix_len; + return true; + } + return false; +} + +static ufbxi_forceinline bool ufbxi_remove_prefix_str(ufbx_string *str, ufbx_string prefix) +{ + return ufbxi_remove_prefix_len(str, prefix.data, prefix.length); +} + +static ufbxi_forceinline bool ufbxi_remove_suffix_c(ufbx_string *str, const char *suffix) +{ + return ufbxi_remove_suffix_len(str, suffix, strlen(suffix)); +} + +static int ufbxi_map_cmp_string(void *user, const void *va, const void *vb) +{ + (void)user; + const ufbx_string *a = (const ufbx_string*)va, *b = (const ufbx_string*)vb; + return ufbxi_str_cmp(*a, *b); +} + +static ufbxi_forceinline ufbx_string ufbxi_safe_string(const char *data, size_t length) +{ + ufbx_string str = { length > 0 ? data : ufbxi_empty_char, length }; + return str; +} + +static void ufbxi_string_pool_temp_free(ufbxi_string_pool *pool) +{ + ufbxi_free(pool->map.ator, char, pool->temp_str, pool->temp_cap); + ufbxi_map_free(&pool->map); +} + +ufbxi_nodiscard static size_t ufbxi_add_replacement_char(ufbxi_string_pool *pool, char *dst, char c) +{ + switch (pool->error_handling) { + + case UFBX_UNICODE_ERROR_HANDLING_REPLACEMENT_CHARACTER: + dst[0] = (char)(uint8_t)0xefu; + dst[1] = (char)(uint8_t)0xbfu; + dst[2] = (char)(uint8_t)0xbdu; + return 3; + + case UFBX_UNICODE_ERROR_HANDLING_UNDERSCORE: + dst[0] = '_'; + return 1; + + case UFBX_UNICODE_ERROR_HANDLING_QUESTION_MARK: + dst[0] = '?'; + return 1; + + case UFBX_UNICODE_ERROR_HANDLING_REMOVE: + return 0; + + case UFBX_UNICODE_ERROR_HANDLING_UNSAFE_IGNORE: + dst[0] = c; + return 1; + + default: + return 0; + + } +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_sanitize_string(ufbxi_string_pool *pool, ufbxi_sanitized_string *sanitized, const char *str, size_t length, size_t valid_length, bool push_both) +{ + // Handle only invalid cases here + ufbx_assert(valid_length < length); + ufbxi_check_err_msg(pool->error, pool->error_handling != UFBX_UNICODE_ERROR_HANDLING_ABORT_LOADING, "Invalid UTF-8"); + ufbxi_check_err(pool->error, ufbxi_warnf_imp(pool->warnings, UFBX_WARNING_BAD_UNICODE, "Bad UTF-8 string")); + + size_t index = valid_length; + size_t dst_len = index; + if (push_both) { + // Copy both the full raw string and the initial valid part + ufbxi_check_err(pool->error, length <= SIZE_MAX / 2 - 64); + ufbxi_check_err(pool->error, ufbxi_grow_array(pool->map.ator, &pool->temp_str, &pool->temp_cap, length * 2 + 64)); + memcpy(pool->temp_str, str, length); + pool->temp_str[length] = '\0'; + memcpy(pool->temp_str + length + 1, str, index); + dst_len += length + 1; + } else { + + // Copy the initial valid part + ufbxi_check_err(pool->error, length <= SIZE_MAX - 64); + ufbxi_check_err(pool->error, ufbxi_grow_array(pool->map.ator, &pool->temp_str, &pool->temp_cap, length + 64)); + memcpy(pool->temp_str, str, index); + } + + char *dst = pool->temp_str; + while (index < length) { + uint8_t c = (uint8_t)str[index]; + size_t left = length - index; + + // Not optimal but not the worst thing ever + if (pool->temp_cap - dst_len < 16) { + ufbxi_check_err(pool->error, ufbxi_grow_array(pool->map.ator, &pool->temp_str, &pool->temp_cap, dst_len + 16)); + dst = pool->temp_str; + } + + if ((c & 0x80) == 0) { + if (c != 0) { + dst[dst_len] = (char)c; + dst_len += 1; + index += 1; + continue; + } + } else if ((c & 0xe0) == 0xc0 && left >= 2) { + uint8_t t0 = (uint8_t)str[index + 1]; + uint32_t code = (uint32_t)c << 8 | (uint32_t)t0 << 0; + if ((code & 0xc0) == 0x80 && code >= 0xc280) { + dst[dst_len + 0] = (char)c; + dst[dst_len + 1] = (char)t0; + dst_len += 2; + index += 2; + continue; + } + } else if ((c & 0xf0) == 0xe0 && left >= 3) { + uint8_t t0 = (uint8_t)str[index + 1], t1 = (uint8_t)str[index + 2]; + uint32_t code = (uint32_t)c << 16 | (uint32_t)t0 << 8 | (uint32_t)t1; + if ((code & 0xc0c0) == 0x8080 && code >= 0xe0a080 && (code < 0xeda080 || code >= 0xee8080)) { + dst[dst_len + 0] = (char)c; + dst[dst_len + 1] = (char)t0; + dst[dst_len + 2] = (char)t1; + dst_len += 3; + index += 3; + continue; + } + } else if ((c & 0xf8) == 0xf0 && left >= 4) { + uint8_t t0 = (uint8_t)str[index + 1], t1 = (uint8_t)str[index + 2], t2 = (uint8_t)str[index + 3]; + uint32_t code = (uint32_t)c << 24 | (uint32_t)t0 << 16 | (uint32_t)t1 << 8 | (uint32_t)t2; + if ((code & 0xc0c0c0) == 0x808080 && code >= 0xf0908080u && code <= 0xf48fbfbfu) { + dst[dst_len + 0] = (char)c; + dst[dst_len + 1] = (char)t0; + dst[dst_len + 2] = (char)t1; + dst[dst_len + 3] = (char)t2; + dst_len += 4; + index += 4; + continue; + } + } + + dst_len += ufbxi_add_replacement_char(pool, dst + dst_len, (char)c); + index++; + } + + // Sanitized strings are packed to 32-bit integers, in practice this should be fine + // as strings are limited to 32-bit length in FBX itself. + // The only problem case is a massive string that is full of unicode errors, ie. + // >1GB binary blob, but these should never be sanitized. + ufbxi_check_err(pool->error, length <= UINT32_MAX); + sanitized->raw_data = pool->temp_str; + if (push_both) { + // Reserve `UINT32_MAX` for invalid UTF-8 without sanitization + size_t utf8_length = dst_len - (length + 1); + ufbxi_check_err(pool->error, utf8_length < UINT32_MAX); + sanitized->raw_length = (uint32_t)length; + sanitized->utf8_length = (uint32_t)utf8_length; + } else { + ufbxi_check_err(pool->error, dst_len <= UINT32_MAX); + sanitized->raw_length = (uint32_t)dst_len; + sanitized->utf8_length = 0; + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_push_sanitized_string(ufbxi_string_pool *pool, ufbxi_sanitized_string *sanitized, const char *str, size_t length, uint32_t hash, bool raw) +{ + ufbxi_regression_assert(hash == ufbxi_hash_string(str, length)); + + ufbxi_check_err(pool->error, length <= UINT32_MAX); + ufbxi_check_err(pool->error, ufbxi_map_grow(&pool->map, ufbx_string, pool->initial_size)); + + const char *total_data = str; + size_t total_length = length; + + sanitized->raw_length = (uint32_t)length; + sanitized->utf8_length = 0; + + if (!raw) { + size_t valid_length = ufbxi_utf8_valid_length(str, length); + if (valid_length != length) { + ufbxi_check_err(pool->error, ufbxi_sanitize_string(pool, sanitized, str, length, valid_length, true)); + total_data = sanitized->raw_data; + total_length = sanitized->raw_length + sanitized->utf8_length + 1; + hash = ufbxi_hash_string(str, length); + } + } + + ufbx_string ref = { total_data, total_length }; + + ufbx_string *entry = ufbxi_map_find(&pool->map, ufbx_string, hash, &ref); + if (entry) { + sanitized->raw_data = entry->data; + } else { + entry = ufbxi_map_insert(&pool->map, ufbx_string, hash, &ref); + ufbxi_check_err(pool->error, entry); + entry->length = total_length; + char *dst = ufbxi_push(&pool->buf, char, total_length + 1); + ufbxi_check_err(pool->error, dst); + memcpy(dst, total_data, total_length); + dst[total_length] = '\0'; + entry->data = dst; + sanitized->raw_data = dst; + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline const char *ufbxi_push_string_imp(ufbxi_string_pool *pool, const char *str, size_t length, size_t *p_out_length, bool copy, bool raw) +{ + if (length == 0) return ufbxi_empty_char; + + ufbxi_check_return_err(pool->error, ufbxi_map_grow(&pool->map, ufbx_string, pool->initial_size), NULL); + + uint32_t hash; + if (raw) { + hash = ufbxi_hash_string(str, length); + } else { + bool non_ascii = false; + hash = ufbxi_hash_string_check_ascii(str, length, &non_ascii); + if (non_ascii) { + size_t valid_length = ufbxi_utf8_valid_length(str, length); + if (valid_length < length) { + ufbxi_sanitized_string sanitized; + ufbxi_check_return_err(pool->error, ufbxi_sanitize_string(pool, &sanitized, str, length, valid_length, false), NULL); + str = sanitized.raw_data; + length = sanitized.raw_length; + hash = ufbxi_hash_string(str, length); + *p_out_length = length; + } + } + } + + ufbx_string ref = { str, length }; + + ufbx_string *entry = ufbxi_map_find(&pool->map, ufbx_string, hash, &ref); + if (entry) return entry->data; + entry = ufbxi_map_insert(&pool->map, ufbx_string, hash, &ref); + ufbxi_check_return_err(pool->error, entry, NULL); + entry->length = length; + if (copy) { + char *dst = ufbxi_push(&pool->buf, char, length + 1); + ufbxi_check_return_err(pool->error, dst, NULL); + memcpy(dst, str, length); + dst[length] = '\0'; + entry->data = dst; + } else { + entry->data = str; + } + return entry->data; +} + +ufbxi_nodiscard static ufbxi_forceinline const char *ufbxi_push_string(ufbxi_string_pool *pool, const char *str, size_t length, size_t *p_out_length, bool raw) +{ + return ufbxi_push_string_imp(pool, str, length, p_out_length, true, raw); +} + +ufbxi_nodiscard static ufbxi_forceinline int ufbxi_push_string_place(ufbxi_string_pool *pool, const char **p_str, size_t *p_length, bool raw) +{ + const char *str = *p_str; + size_t length = *p_length; + ufbxi_check_err(pool->error, str || length == 0); + str = ufbxi_push_string(pool, str, length, p_length, raw); + ufbxi_check_err(pool->error, str); + *p_str = str; + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_push_string_place_str(ufbxi_string_pool *pool, ufbx_string *p_str, bool raw) +{ + ufbxi_check_err(pool->error, p_str); + return ufbxi_push_string_place(pool, &p_str->data, &p_str->length, raw); +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_push_string_place_blob(ufbxi_string_pool *pool, ufbx_blob *p_blob, bool raw) +{ + if (p_blob->size == 0) { + p_blob->data = NULL; + return 1; + } + p_blob->data = ufbxi_push_string(pool, (const char*)p_blob->data, p_blob->size, &p_blob->size, raw); + ufbxi_check_err(pool->error, p_blob->data); + return 1; +} + +// -- String constants +// +// All strings in FBX files are pooled so by having canonical string constant +// addresses we can compare strings to these constants by comparing pointers. +// Keep the list alphabetically sorted! + +static const char ufbxi_AllSame[] = "AllSame"; +static const char ufbxi_Alphas[] = "Alphas"; +static const char ufbxi_AmbientColor[] = "AmbientColor"; +static const char ufbxi_AnimationCurveNode[] = "AnimationCurveNode"; +static const char ufbxi_AnimationCurve[] = "AnimationCurve"; +static const char ufbxi_AnimationLayer[] = "AnimationLayer"; +static const char ufbxi_AnimationStack[] = "AnimationStack"; +static const char ufbxi_ApertureFormat[] = "ApertureFormat"; +static const char ufbxi_ApertureMode[] = "ApertureMode"; +static const char ufbxi_AreaLightShape[] = "AreaLightShape"; +static const char ufbxi_AspectH[] = "AspectH"; +static const char ufbxi_AspectHeight[] = "AspectHeight"; +static const char ufbxi_AspectRatioMode[] = "AspectRatioMode"; +static const char ufbxi_AspectW[] = "AspectW"; +static const char ufbxi_AspectWidth[] = "AspectWidth"; +static const char ufbxi_BaseLayer[] = "BaseLayer"; +static const char ufbxi_BinaryData[] = "BinaryData"; +static const char ufbxi_BindPose[] = "BindPose"; +static const char ufbxi_BindingTable[] = "BindingTable"; +static const char ufbxi_Binormals[] = "Binormals"; +static const char ufbxi_BinormalsIndex[] = "BinormalsIndex"; +static const char ufbxi_BinormalsW[] = "BinormalsW"; +static const char ufbxi_BlendMode[] = "BlendMode"; +static const char ufbxi_BlendModes[] = "BlendModes"; +static const char ufbxi_BlendShapeChannel[] = "BlendShapeChannel"; +static const char ufbxi_BlendShape[] = "BlendShape"; +static const char ufbxi_BlendWeights[] = "BlendWeights"; +static const char ufbxi_BoundaryRule[] = "BoundaryRule"; +static const char ufbxi_Boundary[] = "Boundary"; +static const char ufbxi_ByEdge[] = "ByEdge"; +static const char ufbxi_ByPolygonVertex[] = "ByPolygonVertex"; +static const char ufbxi_ByPolygon[] = "ByPolygon"; +static const char ufbxi_ByVertex[] = "ByVertex"; +static const char ufbxi_ByVertice[] = "ByVertice"; +static const char ufbxi_Cache[] = "Cache"; +static const char ufbxi_CameraProjectionType[] = "CameraProjectionType"; +static const char ufbxi_CameraStereo[] = "CameraStereo"; +static const char ufbxi_CameraSwitcher[] = "CameraSwitcher"; +static const char ufbxi_Camera[] = "Camera"; +static const char ufbxi_CastLight[] = "CastLight"; +static const char ufbxi_CastShadows[] = "CastShadows"; +static const char ufbxi_Channel[] = "Channel"; +static const char ufbxi_Character[] = "Character"; +static const char ufbxi_Children[] = "Children"; +static const char ufbxi_Cluster[] = "Cluster"; +static const char ufbxi_CollectionExclusive[] = "CollectionExclusive"; +static const char ufbxi_Collection[] = "Collection"; +static const char ufbxi_ColorIndex[] = "ColorIndex"; +static const char ufbxi_Color[] = "Color"; +static const char ufbxi_Colors[] = "Colors"; +static const char ufbxi_Cone_angle[] = "Cone angle"; +static const char ufbxi_ConeAngle[] = "ConeAngle"; +static const char ufbxi_Connections[] = "Connections"; +static const char ufbxi_Constraint[] = "Constraint"; +static const char ufbxi_Content[] = "Content"; +static const char ufbxi_CoordAxisSign[] = "CoordAxisSign"; +static const char ufbxi_CoordAxis[] = "CoordAxis"; +static const char ufbxi_Count[] = "Count"; +static const char ufbxi_Creator[] = "Creator"; +static const char ufbxi_CurrentTextureBlendMode[] = "CurrentTextureBlendMode"; +static const char ufbxi_CurrentTimeMarker[] = "CurrentTimeMarker"; +static const char ufbxi_CustomFrameRate[] = "CustomFrameRate"; +static const char ufbxi_DecayType[] = "DecayType"; +static const char ufbxi_DefaultCamera[] = "DefaultCamera"; +static const char ufbxi_Default[] = "Default"; +static const char ufbxi_Definitions[] = "Definitions"; +static const char ufbxi_DeformPercent[] = "DeformPercent"; +static const char ufbxi_Deformer[] = "Deformer"; +static const char ufbxi_DiffuseColor[] = "DiffuseColor"; +static const char ufbxi_Dimension[] = "Dimension"; +static const char ufbxi_Dimensions[] = "Dimensions"; +static const char ufbxi_DisplayLayer[] = "DisplayLayer"; +static const char ufbxi_Document[] = "Document"; +static const char ufbxi_Documents[] = "Documents"; +static const char ufbxi_EdgeCrease[] = "EdgeCrease"; +static const char ufbxi_EdgeIndexArray[] = "EdgeIndexArray"; +static const char ufbxi_Edges[] = "Edges"; +static const char ufbxi_EmissiveColor[] = "EmissiveColor"; +static const char ufbxi_Entry[] = "Entry"; +static const char ufbxi_FBXHeaderExtension[] = "FBXHeaderExtension"; +static const char ufbxi_FBXVersion[] = "FBXVersion"; +static const char ufbxi_FKEffector[] = "FKEffector"; +static const char ufbxi_FarPlane[] = "FarPlane"; +static const char ufbxi_FbxPropertyEntry[] = "FbxPropertyEntry"; +static const char ufbxi_FbxSemanticEntry[] = "FbxSemanticEntry"; +static const char ufbxi_FieldOfViewX[] = "FieldOfViewX"; +static const char ufbxi_FieldOfViewY[] = "FieldOfViewY"; +static const char ufbxi_FieldOfView[] = "FieldOfView"; +static const char ufbxi_FileName[] = "FileName"; +static const char ufbxi_Filename[] = "Filename"; +static const char ufbxi_FilmHeight[] = "FilmHeight"; +static const char ufbxi_FilmSqueezeRatio[] = "FilmSqueezeRatio"; +static const char ufbxi_FilmWidth[] = "FilmWidth"; +static const char ufbxi_FlipNormals[] = "FlipNormals"; +static const char ufbxi_FocalLength[] = "FocalLength"; +static const char ufbxi_Form[] = "Form"; +static const char ufbxi_Freeze[] = "Freeze"; +static const char ufbxi_FrontAxisSign[] = "FrontAxisSign"; +static const char ufbxi_FrontAxis[] = "FrontAxis"; +static const char ufbxi_FullWeights[] = "FullWeights"; +static const char ufbxi_GateFit[] = "GateFit"; +static const char ufbxi_GeometricRotation[] = "GeometricRotation"; +static const char ufbxi_GeometricScaling[] = "GeometricScaling"; +static const char ufbxi_GeometricTranslation[] = "GeometricTranslation"; +static const char ufbxi_GeometryUVInfo[] = "GeometryUVInfo"; +static const char ufbxi_Geometry[] = "Geometry"; +static const char ufbxi_GlobalSettings[] = "GlobalSettings"; +static const char ufbxi_Hole[] = "Hole"; +static const char ufbxi_HotSpot[] = "HotSpot"; +static const char ufbxi_IKEffector[] = "IKEffector"; +static const char ufbxi_Implementation[] = "Implementation"; +static const char ufbxi_Indexes[] = "Indexes"; +static const char ufbxi_InheritType[] = "InheritType"; +static const char ufbxi_InnerAngle[] = "InnerAngle"; +static const char ufbxi_Intensity[] = "Intensity"; +static const char ufbxi_IsTheNodeInSet[] = "IsTheNodeInSet"; +static const char ufbxi_KeyAttrDataFloat[] = "KeyAttrDataFloat"; +static const char ufbxi_KeyAttrFlags[] = "KeyAttrFlags"; +static const char ufbxi_KeyAttrRefCount[] = "KeyAttrRefCount"; +static const char ufbxi_KeyCount[] = "KeyCount"; +static const char ufbxi_KeyTime[] = "KeyTime"; +static const char ufbxi_KeyValueFloat[] = "KeyValueFloat"; +static const char ufbxi_Key[] = "Key"; +static const char ufbxi_KnotVectorU[] = "KnotVectorU"; +static const char ufbxi_KnotVectorV[] = "KnotVectorV"; +static const char ufbxi_KnotVector[] = "KnotVector"; +static const char ufbxi_LayerElementBinormal[] = "LayerElementBinormal"; +static const char ufbxi_LayerElementColor[] = "LayerElementColor"; +static const char ufbxi_LayerElementEdgeCrease[] = "LayerElementEdgeCrease"; +static const char ufbxi_LayerElementHole[] = "LayerElementHole"; +static const char ufbxi_LayerElementMaterial[] = "LayerElementMaterial"; +static const char ufbxi_LayerElementNormal[] = "LayerElementNormal"; +static const char ufbxi_LayerElementPolygonGroup[] = "LayerElementPolygonGroup"; +static const char ufbxi_LayerElementSmoothing[] = "LayerElementSmoothing"; +static const char ufbxi_LayerElementTangent[] = "LayerElementTangent"; +static const char ufbxi_LayerElementUV[] = "LayerElementUV"; +static const char ufbxi_LayerElementVertexCrease[] = "LayerElementVertexCrease"; +static const char ufbxi_LayerElementVisibility[] = "LayerElementVisibility"; +static const char ufbxi_LayerElement[] = "LayerElement"; +static const char ufbxi_Layer[] = "Layer"; +static const char ufbxi_LayeredTexture[] = "LayeredTexture"; +static const char ufbxi_Lcl_Rotation[] = "Lcl Rotation"; +static const char ufbxi_Lcl_Scaling[] = "Lcl Scaling"; +static const char ufbxi_Lcl_Translation[] = "Lcl Translation"; +static const char ufbxi_LeftCamera[] = "LeftCamera"; +static const char ufbxi_LightType[] = "LightType"; +static const char ufbxi_Light[] = "Light"; +static const char ufbxi_LimbLength[] = "LimbLength"; +static const char ufbxi_LimbNode[] = "LimbNode"; +static const char ufbxi_Limb[] = "Limb"; +static const char ufbxi_Line[] = "Line"; +static const char ufbxi_Link[] = "Link"; +static const char ufbxi_LocalStart[] = "LocalStart"; +static const char ufbxi_LocalStop[] = "LocalStop"; +static const char ufbxi_LocalTime[] = "LocalTime"; +static const char ufbxi_LodGroup[] = "LodGroup"; +static const char ufbxi_MappingInformationType[] = "MappingInformationType"; +static const char ufbxi_Marker[] = "Marker"; +static const char ufbxi_MaterialAssignation[] = "MaterialAssignation"; +static const char ufbxi_Material[] = "Material"; +static const char ufbxi_Materials[] = "Materials"; +static const char ufbxi_Matrix[] = "Matrix"; +static const char ufbxi_Mesh[] = "Mesh"; +static const char ufbxi_Model[] = "Model"; +static const char ufbxi_Name[] = "Name"; +static const char ufbxi_NearPlane[] = "NearPlane"; +static const char ufbxi_NodeAttributeName[] = "NodeAttributeName"; +static const char ufbxi_NodeAttribute[] = "NodeAttribute"; +static const char ufbxi_Node[] = "Node"; +static const char ufbxi_Normals[] = "Normals"; +static const char ufbxi_NormalsIndex[] = "NormalsIndex"; +static const char ufbxi_NormalsW[] = "NormalsW"; +static const char ufbxi_Null[] = "Null"; +static const char ufbxi_NurbsCurve[] = "NurbsCurve"; +static const char ufbxi_NurbsSurfaceOrder[] = "NurbsSurfaceOrder"; +static const char ufbxi_NurbsSurface[] = "NurbsSurface"; +static const char ufbxi_Nurbs[] = "Nurbs"; +static const char ufbxi_OO[] = "OO\0"; +static const char ufbxi_OP[] = "OP\0"; +static const char ufbxi_ObjectMetaData[] = "ObjectMetaData"; +static const char ufbxi_ObjectType[] = "ObjectType"; +static const char ufbxi_Objects[] = "Objects"; +static const char ufbxi_Order[] = "Order"; +static const char ufbxi_OriginalUnitScaleFactor[] = "OriginalUnitScaleFactor"; +static const char ufbxi_OriginalUpAxis[] = "OriginalUpAxis"; +static const char ufbxi_OriginalUpAxisSign[] = "OriginalUpAxisSign"; +static const char ufbxi_OrthoZoom[] = "OrthoZoom"; +static const char ufbxi_OuterAngle[] = "OuterAngle"; +static const char ufbxi_PO[] = "PO\0"; +static const char ufbxi_PP[] = "PP\0"; +static const char ufbxi_PointsIndex[] = "PointsIndex"; +static const char ufbxi_Points[] = "Points"; +static const char ufbxi_PolygonGroup[] = "PolygonGroup"; +static const char ufbxi_PolygonIndexArray[] = "PolygonIndexArray"; +static const char ufbxi_PolygonVertexIndex[] = "PolygonVertexIndex"; +static const char ufbxi_PoseNode[] = "PoseNode"; +static const char ufbxi_Pose[] = "Pose"; +static const char ufbxi_PostRotation[] = "PostRotation"; +static const char ufbxi_PreRotation[] = "PreRotation"; +static const char ufbxi_PreviewDivisionLevels[] = "PreviewDivisionLevels"; +static const char ufbxi_Properties60[] = "Properties60"; +static const char ufbxi_Properties70[] = "Properties70"; +static const char ufbxi_PropertyTemplate[] = "PropertyTemplate"; +static const char ufbxi_R[] = "R\0\0"; +static const char ufbxi_ReferenceStart[] = "ReferenceStart"; +static const char ufbxi_ReferenceStop[] = "ReferenceStop"; +static const char ufbxi_ReferenceTime[] = "ReferenceTime"; +static const char ufbxi_RelativeFileName[] = "RelativeFileName"; +static const char ufbxi_RelativeFilename[] = "RelativeFilename"; +static const char ufbxi_RenderDivisionLevels[] = "RenderDivisionLevels"; +static const char ufbxi_RightCamera[] = "RightCamera"; +static const char ufbxi_RootNode[] = "RootNode"; +static const char ufbxi_Root[] = "Root"; +static const char ufbxi_RotationAccumulationMode[] = "RotationAccumulationMode"; +static const char ufbxi_RotationOffset[] = "RotationOffset"; +static const char ufbxi_RotationOrder[] = "RotationOrder"; +static const char ufbxi_RotationPivot[] = "RotationPivot"; +static const char ufbxi_Rotation[] = "Rotation"; +static const char ufbxi_S[] = "S\0\0"; +static const char ufbxi_ScaleAccumulationMode[] = "ScaleAccumulationMode"; +static const char ufbxi_ScalingOffset[] = "ScalingOffset"; +static const char ufbxi_ScalingPivot[] = "ScalingPivot"; +static const char ufbxi_Scaling[] = "Scaling"; +static const char ufbxi_SceneInfo[] = "SceneInfo"; +static const char ufbxi_SelectionNode[] = "SelectionNode"; +static const char ufbxi_SelectionSet[] = "SelectionSet"; +static const char ufbxi_ShadingModel[] = "ShadingModel"; +static const char ufbxi_Shape[] = "Shape"; +static const char ufbxi_Shininess[] = "Shininess"; +static const char ufbxi_Show[] = "Show"; +static const char ufbxi_Size[] = "Size"; +static const char ufbxi_Skin[] = "Skin"; +static const char ufbxi_SkinningType[] = "SkinningType"; +static const char ufbxi_Smoothing[] = "Smoothing"; +static const char ufbxi_Smoothness[] = "Smoothness"; +static const char ufbxi_SnapOnFrameMode[] = "SnapOnFrameMode"; +static const char ufbxi_SpecularColor[] = "SpecularColor"; +static const char ufbxi_Step[] = "Step"; +static const char ufbxi_SubDeformer[] = "SubDeformer"; +static const char ufbxi_T[] = "T\0\0"; +static const char ufbxi_Take[] = "Take"; +static const char ufbxi_Takes[] = "Takes"; +static const char ufbxi_Tangents[] = "Tangents"; +static const char ufbxi_TangentsIndex[] = "TangentsIndex"; +static const char ufbxi_TangentsW[] = "TangentsW"; +static const char ufbxi_Texture[] = "Texture"; +static const char ufbxi_Texture_alpha[] = "Texture alpha"; +static const char ufbxi_TextureId[] = "TextureId"; +static const char ufbxi_TextureRotationPivot[] = "TextureRotationPivot"; +static const char ufbxi_TextureScalingPivot[] = "TextureScalingPivot"; +static const char ufbxi_TextureUV[] = "TextureUV"; +static const char ufbxi_TextureUVVerticeIndex[] = "TextureUVVerticeIndex"; +static const char ufbxi_TimeMarker[] = "TimeMarker"; +static const char ufbxi_TimeMode[] = "TimeMode"; +static const char ufbxi_TimeProtocol[] = "TimeProtocol"; +static const char ufbxi_TimeSpanStart[] = "TimeSpanStart"; +static const char ufbxi_TimeSpanStop[] = "TimeSpanStop"; +static const char ufbxi_TransformLink[] = "TransformLink"; +static const char ufbxi_Transform[] = "Transform"; +static const char ufbxi_Translation[] = "Translation"; +static const char ufbxi_TrimNurbsSurface[] = "TrimNurbsSurface"; +static const char ufbxi_Type[] = "Type"; +static const char ufbxi_TypedIndex[] = "TypedIndex"; +static const char ufbxi_UVIndex[] = "UVIndex"; +static const char ufbxi_UVSet[] = "UVSet"; +static const char ufbxi_UVSwap[] = "UVSwap"; +static const char ufbxi_UV[] = "UV\0"; +static const char ufbxi_UnitScaleFactor[] = "UnitScaleFactor"; +static const char ufbxi_UpAxisSign[] = "UpAxisSign"; +static const char ufbxi_UpAxis[] = "UpAxis"; +static const char ufbxi_VertexCacheDeformer[] = "VertexCacheDeformer"; +static const char ufbxi_VertexCrease[] = "VertexCrease"; +static const char ufbxi_VertexCreaseIndex[] = "VertexCreaseIndex"; +static const char ufbxi_VertexIndexArray[] = "VertexIndexArray"; +static const char ufbxi_Vertices[] = "Vertices"; +static const char ufbxi_Video[] = "Video"; +static const char ufbxi_Visibility[] = "Visibility"; +static const char ufbxi_Weight[] = "Weight"; +static const char ufbxi_Weights[] = "Weights"; +static const char ufbxi_WrapModeU[] = "WrapModeU"; +static const char ufbxi_WrapModeV[] = "WrapModeV"; +static const char ufbxi_X[] = "X\0\0"; +static const char ufbxi_Y[] = "Y\0\0"; +static const char ufbxi_Z[] = "Z\0\0"; +static const char ufbxi_d_X[] = "d|X"; +static const char ufbxi_d_Y[] = "d|Y"; +static const char ufbxi_d_Z[] = "d|Z"; + +static ufbx_string ufbxi_strings[] = { + { ufbxi_AllSame, 7 }, + { ufbxi_Alphas, 6 }, + { ufbxi_AmbientColor, 12 }, + { ufbxi_AnimationCurve, 14 }, + { ufbxi_AnimationCurveNode, 18 }, + { ufbxi_AnimationLayer, 14 }, + { ufbxi_AnimationStack, 14 }, + { ufbxi_ApertureFormat, 14 }, + { ufbxi_ApertureMode, 12 }, + { ufbxi_AreaLightShape, 14 }, + { ufbxi_AspectH, 7 }, + { ufbxi_AspectHeight, 12 }, + { ufbxi_AspectRatioMode, 15 }, + { ufbxi_AspectW, 7 }, + { ufbxi_AspectWidth, 11 }, + { ufbxi_BaseLayer, 9 }, + { ufbxi_BinaryData, 10 }, + { ufbxi_BindPose, 8 }, + { ufbxi_BindingTable, 12 }, + { ufbxi_Binormals, 9 }, + { ufbxi_BinormalsIndex, 14 }, + { ufbxi_BinormalsW, 10 }, + { ufbxi_BlendMode, 9 }, + { ufbxi_BlendModes, 10 }, + { ufbxi_BlendShape, 10 }, + { ufbxi_BlendShapeChannel, 17 }, + { ufbxi_BlendWeights, 12 }, + { ufbxi_Boundary, 8 }, + { ufbxi_BoundaryRule, 12 }, + { ufbxi_ByEdge, 6 }, + { ufbxi_ByPolygon, 9 }, + { ufbxi_ByPolygonVertex, 15 }, + { ufbxi_ByVertex, 8 }, + { ufbxi_ByVertice, 9 }, + { ufbxi_Cache, 5 }, + { ufbxi_Camera, 6 }, + { ufbxi_CameraProjectionType, 20 }, + { ufbxi_CameraStereo, 12 }, + { ufbxi_CameraSwitcher, 14 }, + { ufbxi_CastLight, 9 }, + { ufbxi_CastShadows, 11 }, + { ufbxi_Channel, 7 }, + { ufbxi_Character, sizeof(ufbxi_Character) - 1 }, + { ufbxi_Children, 8 }, + { ufbxi_Cluster, 7 }, + { ufbxi_Collection, 10 }, + { ufbxi_CollectionExclusive, 19 }, + { ufbxi_Color, 5 }, + { ufbxi_ColorIndex, 10 }, + { ufbxi_Colors, 6 }, + { ufbxi_Cone_angle, 10 }, + { ufbxi_ConeAngle, 9 }, + { ufbxi_Connections, 11 }, + { ufbxi_Constraint, sizeof(ufbxi_Constraint) - 1 }, + { ufbxi_Content, 7 }, + { ufbxi_CoordAxis, 9 }, + { ufbxi_CoordAxisSign, 13 }, + { ufbxi_Count, 5 }, + { ufbxi_Creator, 7 }, + { ufbxi_CurrentTextureBlendMode, 23 }, + { ufbxi_CurrentTimeMarker, 17 }, + { ufbxi_CustomFrameRate, 15 }, + { ufbxi_DecayType, 9 }, + { ufbxi_Default, 7 }, + { ufbxi_DefaultCamera, 13 }, + { ufbxi_Definitions, 11 }, + { ufbxi_DeformPercent, 13 }, + { ufbxi_Deformer, 8 }, + { ufbxi_DiffuseColor, 12 }, + { ufbxi_Dimension, 9 }, + { ufbxi_Dimensions, 10 }, + { ufbxi_DisplayLayer, 12 }, + { ufbxi_Document, 8 }, + { ufbxi_Documents, 9 }, + { ufbxi_EdgeCrease, 10 }, + { ufbxi_EdgeIndexArray, 14 }, + { ufbxi_Edges, 5 }, + { ufbxi_EmissiveColor, 13 }, + { ufbxi_Entry, 5 }, + { ufbxi_FBXHeaderExtension, 18 }, + { ufbxi_FBXVersion, 10 }, + { ufbxi_FKEffector, 10 }, + { ufbxi_FarPlane, 8 }, + { ufbxi_FbxPropertyEntry, 16 }, + { ufbxi_FbxSemanticEntry, 16 }, + { ufbxi_FieldOfView, 11 }, + { ufbxi_FieldOfViewX, 12 }, + { ufbxi_FieldOfViewY, 12 }, + { ufbxi_FileName, 8 }, + { ufbxi_Filename, 8 }, + { ufbxi_FilmHeight, 10 }, + { ufbxi_FilmSqueezeRatio, 16 }, + { ufbxi_FilmWidth, 9 }, + { ufbxi_FlipNormals, 11 }, + { ufbxi_FocalLength, 11 }, + { ufbxi_Form, 4 }, + { ufbxi_Freeze, 6 }, + { ufbxi_FrontAxis, 9 }, + { ufbxi_FrontAxisSign, 13 }, + { ufbxi_FullWeights, 11 }, + { ufbxi_GateFit, 7 }, + { ufbxi_GeometricRotation, 17 }, + { ufbxi_GeometricScaling, 16 }, + { ufbxi_GeometricTranslation, 20 }, + { ufbxi_Geometry, 8 }, + { ufbxi_GeometryUVInfo, 14 }, + { ufbxi_GlobalSettings, 14 }, + { ufbxi_Hole, 4 }, + { ufbxi_HotSpot, 7 }, + { ufbxi_IKEffector, 10 }, + { ufbxi_Implementation, 14 }, + { ufbxi_Indexes, 7 }, + { ufbxi_InheritType, 11 }, + { ufbxi_InnerAngle, 10 }, + { ufbxi_Intensity, 9 }, + { ufbxi_IsTheNodeInSet, 14 }, + { ufbxi_Key, 3 }, + { ufbxi_KeyAttrDataFloat, 16 }, + { ufbxi_KeyAttrFlags, 12 }, + { ufbxi_KeyAttrRefCount, 15 }, + { ufbxi_KeyCount, 8 }, + { ufbxi_KeyTime, 7 }, + { ufbxi_KeyValueFloat, 13 }, + { ufbxi_KnotVector, 10 }, + { ufbxi_KnotVectorU, 11 }, + { ufbxi_KnotVectorV, 11 }, + { ufbxi_Layer, 5 }, + { ufbxi_LayerElement, 12 }, + { ufbxi_LayerElementBinormal, 20 }, + { ufbxi_LayerElementColor, 17 }, + { ufbxi_LayerElementEdgeCrease, 22 }, + { ufbxi_LayerElementHole, 16 }, + { ufbxi_LayerElementMaterial, 20 }, + { ufbxi_LayerElementNormal, 18 }, + { ufbxi_LayerElementPolygonGroup, 24 }, + { ufbxi_LayerElementSmoothing, 21 }, + { ufbxi_LayerElementTangent, 19 }, + { ufbxi_LayerElementUV, 14 }, + { ufbxi_LayerElementVertexCrease, 24 }, + { ufbxi_LayerElementVisibility, 22 }, + { ufbxi_LayeredTexture, 14 }, + { ufbxi_Lcl_Rotation, 12 }, + { ufbxi_Lcl_Scaling, 11 }, + { ufbxi_Lcl_Translation, 15 }, + { ufbxi_LeftCamera, 10 }, + { ufbxi_Light, 5 }, + { ufbxi_LightType, 9 }, + { ufbxi_Limb, 4 }, + { ufbxi_LimbLength, 10 }, + { ufbxi_LimbNode, 8 }, + { ufbxi_Line, 4 }, + { ufbxi_Link, 4 }, + { ufbxi_LocalStart, 10 }, + { ufbxi_LocalStop, 9 }, + { ufbxi_LocalTime, 9 }, + { ufbxi_LodGroup, 8 }, + { ufbxi_MappingInformationType, 22 }, + { ufbxi_Marker, 6 }, + { ufbxi_Material, 8 }, + { ufbxi_MaterialAssignation, 19 }, + { ufbxi_Materials, 9 }, + { ufbxi_Matrix, 6 }, + { ufbxi_Mesh, 4 }, + { ufbxi_Model, 5 }, + { ufbxi_Name, 4 }, + { ufbxi_NearPlane, 9 }, + { ufbxi_Node, 4 }, + { ufbxi_NodeAttribute, 13 }, + { ufbxi_NodeAttributeName, 17 }, + { ufbxi_Normals, 7 }, + { ufbxi_NormalsIndex, 12 }, + { ufbxi_NormalsW, 8 }, + { ufbxi_Null, 4 }, + { ufbxi_Nurbs, 5 }, + { ufbxi_NurbsCurve, 10 }, + { ufbxi_NurbsSurface, 12 }, + { ufbxi_NurbsSurfaceOrder, 17 }, + { ufbxi_OO, 2 }, + { ufbxi_OP, 2 }, + { ufbxi_ObjectMetaData, 14 }, + { ufbxi_ObjectType, 10 }, + { ufbxi_Objects, 7 }, + { ufbxi_Order, 5 }, + { ufbxi_OriginalUnitScaleFactor, 23 }, + { ufbxi_OriginalUpAxis, 14 }, + { ufbxi_OriginalUpAxisSign, 18 }, + { ufbxi_OrthoZoom, 9 }, + { ufbxi_OuterAngle, 10 }, + { ufbxi_PO, 2 }, + { ufbxi_PP, 2 }, + { ufbxi_Points, 6 }, + { ufbxi_PointsIndex, 11 }, + { ufbxi_PolygonGroup, 12 }, + { ufbxi_PolygonIndexArray, 17 }, + { ufbxi_PolygonVertexIndex, 18 }, + { ufbxi_Pose, 4 }, + { ufbxi_PoseNode, 8 }, + { ufbxi_PostRotation, 12 }, + { ufbxi_PreRotation, 11 }, + { ufbxi_PreviewDivisionLevels, 21 }, + { ufbxi_Properties60, 12 }, + { ufbxi_Properties70, 12 }, + { ufbxi_PropertyTemplate, 16 }, + { ufbxi_R, 1 }, + { ufbxi_ReferenceStart, 14 }, + { ufbxi_ReferenceStop, 13 }, + { ufbxi_ReferenceTime, 13 }, + { ufbxi_RelativeFileName, 16 }, + { ufbxi_RelativeFilename, 16 }, + { ufbxi_RenderDivisionLevels, 20 }, + { ufbxi_RightCamera, 11 }, + { ufbxi_Root, 4 }, + { ufbxi_RootNode, 8 }, + { ufbxi_Rotation, 8 }, + { ufbxi_RotationAccumulationMode, 24 }, + { ufbxi_RotationOffset, 14 }, + { ufbxi_RotationOrder, 13 }, + { ufbxi_RotationPivot, 13 }, + { ufbxi_S, 1 }, + { ufbxi_ScaleAccumulationMode, 21 }, + { ufbxi_Scaling, 7 }, + { ufbxi_ScalingOffset, 13 }, + { ufbxi_ScalingPivot, 12 }, + { ufbxi_SceneInfo, 9 }, + { ufbxi_SelectionNode, 13 }, + { ufbxi_SelectionSet, 12 }, + { ufbxi_ShadingModel, 12 }, + { ufbxi_Shape, 5 }, + { ufbxi_Shininess, 9 }, + { ufbxi_Show, 4 }, + { ufbxi_Size, 4 }, + { ufbxi_Skin, 4 }, + { ufbxi_SkinningType, 12 }, + { ufbxi_Smoothing, 9 }, + { ufbxi_Smoothness, 10 }, + { ufbxi_SnapOnFrameMode, 15 }, + { ufbxi_SpecularColor, 13 }, + { ufbxi_Step, 4 }, + { ufbxi_SubDeformer, 11 }, + { ufbxi_T, 1 }, + { ufbxi_Take, 4 }, + { ufbxi_Takes, 5 }, + { ufbxi_Tangents, 8 }, + { ufbxi_TangentsIndex, 13 }, + { ufbxi_TangentsW, 9 }, + { ufbxi_Texture, 7 }, + { ufbxi_Texture_alpha, 13 }, + { ufbxi_TextureId, 9 }, + { ufbxi_TextureRotationPivot, 20 }, + { ufbxi_TextureScalingPivot, 19 }, + { ufbxi_TextureUV, 9 }, + { ufbxi_TextureUVVerticeIndex, 21 }, + { ufbxi_TimeMarker, 10 }, + { ufbxi_TimeMode, 8 }, + { ufbxi_TimeProtocol, 12 }, + { ufbxi_TimeSpanStart, 13 }, + { ufbxi_TimeSpanStop, 12 }, + { ufbxi_Transform, 9 }, + { ufbxi_TransformLink, 13 }, + { ufbxi_Translation, 11 }, + { ufbxi_TrimNurbsSurface, 16 }, + { ufbxi_Type, 4 }, + { ufbxi_TypedIndex, 10 }, + { ufbxi_UV, 2 }, + { ufbxi_UVIndex, 7 }, + { ufbxi_UVSet, 5 }, + { ufbxi_UVSwap, 6 }, + { ufbxi_UnitScaleFactor, 15 }, + { ufbxi_UpAxis, 6 }, + { ufbxi_UpAxisSign, 10 }, + { ufbxi_VertexCacheDeformer, 19 }, + { ufbxi_VertexCrease, 12 }, + { ufbxi_VertexCreaseIndex, 17 }, + { ufbxi_VertexIndexArray, 16 }, + { ufbxi_Vertices, 8 }, + { ufbxi_Video, 5 }, + { ufbxi_Visibility, 10 }, + { ufbxi_Weight, 6 }, + { ufbxi_Weights, 7 }, + { ufbxi_WrapModeU, 9 }, + { ufbxi_WrapModeV, 9 }, + { ufbxi_X, 1 }, + { ufbxi_Y, 1 }, + { ufbxi_Z, 1 }, + { ufbxi_d_X, 3 }, + { ufbxi_d_Y, 3 }, + { ufbxi_d_Z, 3 }, +}; + +static ufbxi_noinline const char *ufbxi_find_canonical_string(const char *data, size_t length) +{ + ufbx_string str = { data, length }; + + size_t ix = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_string, 8, &ix, ufbxi_strings, 0, ufbxi_arraycount(ufbxi_strings), + ( ufbxi_str_less(*a, str) ), ( ufbxi_str_equal(*a, str) )); + + if (ix < SIZE_MAX) { + return ufbxi_strings[ix].data; + } else { + return data; + } +} + +static const ufbx_vec3 ufbxi_one_vec3 = { 1.0f, 1.0f, 1.0f }; + +#define UFBXI_PI ((ufbx_real)3.14159265358979323846) +#define UFBXI_DPI (3.14159265358979323846) +#define UFBXI_DEG_TO_RAD ((ufbx_real)(UFBXI_PI / 180.0)) +#define UFBXI_RAD_TO_DEG ((ufbx_real)(180.0 / UFBXI_PI)) +#define UFBXI_MM_TO_INCH ((ufbx_real)0.0393700787) + +ufbx_inline ufbx_vec3 ufbxi_add3(ufbx_vec3 a, ufbx_vec3 b) { + ufbx_vec3 v = { a.x + b.x, a.y + b.y, a.z + b.z }; + return v; +} + +ufbx_inline ufbx_vec3 ufbxi_sub3(ufbx_vec3 a, ufbx_vec3 b) { + ufbx_vec3 v = { a.x - b.x, a.y - b.y, a.z - b.z }; + return v; +} + +ufbx_inline ufbx_vec3 ufbxi_mul3(ufbx_vec3 a, ufbx_real b) { + ufbx_vec3 v = { a.x * b, a.y * b, a.z * b }; + return v; +} + +ufbx_inline ufbx_real ufbxi_dot3(ufbx_vec3 a, ufbx_vec3 b) { + return a.x*b.x + a.y*b.y + a.z*b.z; +} + +ufbx_inline ufbx_real ufbxi_length3(ufbx_vec3 v) +{ + return (ufbx_real)ufbx_sqrt(v.x*v.x + v.y*v.y + v.z*v.z); +} + +ufbx_inline ufbx_vec3 ufbxi_cross3(ufbx_vec3 a, ufbx_vec3 b) { + ufbx_vec3 v = { a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x }; + return v; +} + +ufbx_inline ufbx_vec3 ufbxi_normalize3(ufbx_vec3 a) { + ufbx_real len = (ufbx_real)ufbx_sqrt(ufbxi_dot3(a, a)); + if (len > UFBX_EPSILON) { + return ufbxi_mul3(a, (ufbx_real)1.0 / len); + } else { + ufbx_vec3 zero = { (ufbx_real)0 }; + return zero; + } +} + +static ufbxi_noinline ufbx_vec3 ufbxi_slow_normalize3(const ufbx_vec3 *a) { + return ufbxi_normalize3(*a); +} + +static ufbxi_noinline ufbx_vec3 ufbxi_slow_normalized_cross3(const ufbx_vec3 *a, const ufbx_vec3 *b) { + return ufbxi_normalize3(ufbxi_cross3(*a, *b)); +} + +// -- Type definitions + +typedef struct ufbxi_node ufbxi_node; + +typedef enum { + UFBXI_VALUE_NONE, + UFBXI_VALUE_NUMBER, + UFBXI_VALUE_STRING, + UFBXI_VALUE_ARRAY, +} ufbxi_value_type; + +typedef union { + struct { double f; int64_t i; }; // < if `UFBXI_PROP_NUMBER` + ufbxi_sanitized_string s; // < if `UFBXI_PROP_STRING` +} ufbxi_value; + +typedef struct { + void *data; // < Pointer to `size` bool/int32_t/int64_t/float/double elements + size_t size; // < Number of elements + char type; // < FBX type code: b/i/l/f/d +} ufbxi_value_array; + +struct ufbxi_node { + const char *name; // < Name of the node (pooled, compare with == to ufbxi_* strings) + uint32_t num_children; // < Number of child nodes + uint8_t name_len; // < Length of `name` in bytes + + // If `value_type_mask == UFBXI_PROP_ARRAY` then the node is an array + // (`array` field is valid) otherwise the node has N values in `vals` + // where the type of each value is stored in 2 bits per value from LSB. + // ie. `vals[ix]` type is `(value_type_mask >> (ix*2)) & 0x3` + uint16_t value_type_mask; + + ufbxi_node *children; + union { + ufbxi_value_array *array; // if `prop_type_mask == UFBXI_PROP_ARRAY` + ufbxi_value *vals; // otherwise + }; +}; + +typedef struct ufbxi_refcount ufbxi_refcount; + +struct ufbxi_refcount { + ufbxi_refcount *parent; + void *align_0; + uint32_t self_magic; + uint32_t type_magic; + uint64_t zero_pad_pre[8]; + ufbxi_atomic_counter refcount; + uint64_t zero_pad_post[8]; +}; + +static ufbxi_noinline void ufbxi_init_ref(ufbxi_refcount *refcount, uint32_t magic, ufbxi_refcount *parent); +static ufbxi_noinline void ufbxi_retain_ref(ufbxi_refcount *refcount); + +#define ufbxi_get_imp(type, ptr) ((type*)((char*)ptr - sizeof(ufbxi_refcount))) + +typedef struct { + ufbxi_refcount refcount; + ufbx_scene scene; + uint32_t magic; + + ufbxi_allocator ator; + ufbxi_buf result_buf; + ufbxi_buf string_buf; +} ufbxi_scene_imp; + +ufbx_static_assert(scene_imp_offset, offsetof(ufbxi_scene_imp, scene) == sizeof(ufbxi_refcount)); + +typedef struct { + ufbxi_refcount refcount; + ufbx_mesh mesh; + uint32_t magic; + + ufbxi_allocator ator; + ufbxi_buf result_buf; +} ufbxi_mesh_imp; + +ufbx_static_assert(mesh_imp_offset, offsetof(ufbxi_mesh_imp, mesh) == sizeof(ufbxi_refcount)); + +typedef struct { + // Semantic string data and length eg. for a string token + // this string doesn't include the quotes. + char *str_data; + size_t str_len; + size_t str_cap; + + // Type of the token, either single character such as '{' or ':' + // or one of UFBXI_ASCII_* defines. + char type; + + // Sign for integer if negative. + bool negative; + + // Parsed semantic value + union { + double f64; + int64_t i64; + size_t name_len; + } value; +} ufbxi_ascii_token; + +typedef struct { + size_t max_token_length; + + const char *src; + const char *src_yield; + const char *src_end; + + bool read_first_comment; + bool found_version; + bool parse_as_f32; + + ufbxi_ascii_token prev_token; + ufbxi_ascii_token token; +} ufbxi_ascii; + +typedef struct { + const char *type; + ufbx_string sub_type; + ufbx_props props; +} ufbxi_template; + +typedef struct { + uint64_t fbx_id; + uint32_t element_id; + uint32_t user_id; +} ufbxi_fbx_id_entry; + +typedef struct { + uint64_t node_fbx_id; + uint64_t attr_fbx_id; +} ufbxi_fbx_attr_entry; + +// Temporary connection before we resolve the element pointers +typedef struct { + uint64_t src, dst; + ufbx_string src_prop; + ufbx_string dst_prop; +} ufbxi_tmp_connection; + +typedef struct { + uint64_t fbx_id; + ufbx_string name; + ufbx_props props; + ufbx_dom_node *dom_node; +} ufbxi_element_info; + +typedef struct { + uint64_t bone_fbx_id; + ufbx_matrix bone_to_world; +} ufbxi_tmp_bone_pose; + +typedef struct { + ufbx_string prop_name; + uint32_t *face_texture; + size_t num_faces; + bool all_same; +} ufbxi_tmp_mesh_texture; + +typedef struct { + ufbxi_tmp_mesh_texture *texture_arr; + size_t texture_count; +} ufbxi_mesh_extra; + +typedef struct { + int32_t material_id; + int32_t texture_id; + ufbx_string prop_name; +} ufbxi_tmp_material_texture; + +typedef struct { + int32_t *blend_modes; + size_t num_blend_modes; + + ufbx_real *alphas; + size_t num_alphas; +} ufbxi_texture_extra; + +typedef enum { + UFBXI_OBJ_ATTRIB_POSITION, + UFBXI_OBJ_ATTRIB_UV, + UFBXI_OBJ_ATTRIB_NORMAL, + UFBXI_OBJ_ATTRIB_COLOR, +} ufbxi_obj_attrib; + +#define UFBXI_OBJ_NUM_ATTRIBS 3 +#define UFBXI_OBJ_NUM_ATTRIBS_EXT 4 + +typedef struct { + uint64_t min_ix, max_ix; +} ufbxi_obj_index_range; + +typedef struct { + size_t num_faces; + size_t num_indices; + ufbxi_obj_index_range vertex_range[UFBXI_OBJ_NUM_ATTRIBS]; + + ufbx_node *fbx_node; + ufbx_mesh *fbx_mesh; + + uint64_t fbx_node_id; + uint64_t fbx_mesh_id; + + uint32_t usemtl_base; + + uint32_t num_groups; +} ufbxi_obj_mesh; + +static const uint8_t ufbxi_obj_attrib_stride[] = { + 3, 2, 3, 4, +}; + +ufbx_static_assert(obj_attrib_strides, ufbxi_arraycount(ufbxi_obj_attrib_stride) == UFBXI_OBJ_NUM_ATTRIBS_EXT); + +typedef struct { + const char *name; + uint32_t local_id; + uint32_t mesh_id; +} ufbxi_obj_group_entry; + +typedef struct { + uint64_t *indices; + size_t num_left; +} ufbxi_obj_fast_indices; + +typedef struct { + + // Current line and tokens. + // NOTE: `line` and `tokens` are not NULL-terminated nor UTF-8! + // `line` is guaranteed to be terminated by a `\n` + ufbx_string line; + ufbx_string *tokens; + size_t tokens_cap; + size_t num_tokens; + + ufbxi_obj_fast_indices fast_indices[UFBXI_OBJ_NUM_ATTRIBS]; + + size_t vertex_count[UFBXI_OBJ_NUM_ATTRIBS_EXT]; + ufbxi_buf tmp_vertices[UFBXI_OBJ_NUM_ATTRIBS_EXT]; + ufbxi_buf tmp_indices[UFBXI_OBJ_NUM_ATTRIBS_EXT]; + ufbxi_buf tmp_color_valid; + ufbxi_buf tmp_faces; + ufbxi_buf tmp_face_smoothing; + ufbxi_buf tmp_face_group; + ufbxi_buf tmp_face_group_infos; + ufbxi_buf tmp_face_material; + ufbxi_buf tmp_meshes; + ufbxi_buf tmp_props; + + ufbxi_map group_map; + + size_t read_progress; + + ufbxi_obj_mesh *mesh; + + uint64_t usemtl_fbx_id; + uint32_t usemtl_index; + ufbx_string usemtl_name; + + uint32_t face_material; + + uint32_t face_group; + bool has_face_group; + + bool face_smoothing; + bool has_face_smoothing; + + bool has_vertex_color; + size_t mrgb_vertex_count; + + bool eof; + bool initialized; + + ufbx_blob mtllib_relative_path; + + ufbx_material **tmp_materials; + size_t tmp_materials_cap; + + ufbx_string object; + ufbx_string group; + bool material_dirty; + bool object_dirty; + bool group_dirty; + bool face_group_dirty; + +} ufbxi_obj_context; + +typedef struct { + + ufbx_error error; + uint32_t version; + ufbx_exporter exporter; + uint32_t exporter_version; + bool from_ascii; + bool local_big_endian; + bool file_big_endian; + bool sure_fbx; + + ufbx_load_opts opts; + + // IO + uint64_t data_offset; + + ufbx_read_fn *read_fn; + ufbx_skip_fn *skip_fn; + ufbx_close_fn *close_fn; + void *read_user; + + char *read_buffer; + size_t read_buffer_size; + + const char *data_begin; + const char *data; + size_t yield_size; + size_t data_size; + + // Allocators + ufbxi_allocator ator_result; + ufbxi_allocator ator_tmp; + + // Temporary maps + ufbxi_map prop_type_map; // < `ufbxi_prop_type_name` Property type to enum + ufbxi_map fbx_id_map; // < `ufbxi_fbx_id_entry` FBX ID to local ID + ufbxi_map texture_file_map; // < `ufbxi_texture_file_entry` absolute raw filename to element ID + + // 6x00 specific maps + ufbxi_map fbx_attr_map; // < `ufbxi_fbx_attr_entry` Node ID to attrib ID + ufbxi_map node_prop_set; // < `const char*` Node property names + + // DOM nodes + ufbxi_map dom_node_map; // < `const char*` Node property names + + // Temporary array + char *tmp_arr; + size_t tmp_arr_size; + char *swap_arr; + size_t swap_arr_size; + + // Generated index buffers + size_t max_zero_indices; + size_t max_consecutive_indices; + + // Temporary buffers + ufbxi_buf tmp; + ufbxi_buf tmp_parse; + ufbxi_buf tmp_stack; + ufbxi_buf tmp_connections; + ufbxi_buf tmp_node_ids; + ufbxi_buf tmp_elements; + ufbxi_buf tmp_element_offsets; + ufbxi_buf tmp_element_ptrs; + ufbxi_buf tmp_typed_element_offsets[UFBX_ELEMENT_TYPE_COUNT]; + ufbxi_buf tmp_mesh_textures; + ufbxi_buf tmp_full_weights; + ufbxi_buf tmp_dom_nodes; + size_t tmp_element_byte_offset; + + ufbxi_template *templates; + size_t num_templates; + + ufbx_dom_node *dom_parse_toplevel; + size_t dom_parse_num_children; + + // String pool + ufbxi_string_pool string_pool; + + // Result buffers, these are retained in `ufbx_scene` returned to user. + ufbxi_buf result; + + // Top-level state + ufbxi_node *top_nodes; + size_t top_nodes_len, top_nodes_cap; + bool parsed_to_end; + + // "Focused" top-level node and child index, if `top_child_index == SIZE_MAX` + // the children are parsed on demand. + ufbxi_node *top_node; + size_t top_child_index; + ufbxi_node top_child; + bool has_next_child; + + // Shared consecutive and all-zero index buffers + uint32_t *zero_indices; + uint32_t *consecutive_indices; + + // Call progress function periodically + ptrdiff_t progress_timer; + uint64_t progress_bytes_total; + uint64_t latest_progress_bytes; + size_t progress_interval; + + // Extra data on the side of elements + void **element_extra_arr; + size_t element_extra_cap; + + ufbxi_ascii ascii; + + bool has_geometry_transform_nodes; + + ufbxi_node root; + + ufbx_scene scene; + ufbxi_scene_imp *scene_imp; + + ufbx_inflate_retain *inflate_retain; + + uint64_t root_id; + uint32_t num_elements; + + ufbxi_node legacy_node; + uint64_t legacy_implicit_anim_layer_id; + + double ktime_to_sec; + + bool eof; + ufbxi_obj_context obj; + + ufbx_matrix axis_matrix; + ufbx_real unit_scale; + + ufbxi_warnings warnings; +} ufbxi_context; + +static ufbxi_noinline int ufbxi_fail_imp(ufbxi_context *uc, const char *cond, const char *func, uint32_t line) +{ + return ufbxi_fail_imp_err(&uc->error, cond, func, line); +} + +#define ufbxi_check(cond) if (ufbxi_unlikely(!ufbxi_trace(cond))) return ufbxi_fail_imp(uc, ufbxi_cond_str(cond), ufbxi_function, ufbxi_line) +#define ufbxi_check_return(cond, ret) do { if (ufbxi_unlikely(!ufbxi_trace(cond))) { ufbxi_fail_imp(uc, ufbxi_cond_str(cond), ufbxi_function, ufbxi_line); return ret; } } while (0) +#define ufbxi_fail(desc) return ufbxi_fail_imp(uc, desc, ufbxi_function, ufbxi_line) +#define ufbxi_fail_return(desc, ret) do { ufbxi_fail_imp(uc, desc, ufbxi_function, ufbxi_line); return ret; } while (0) + +#define ufbxi_check_msg(cond, msg) if (ufbxi_unlikely(!ufbxi_trace(cond))) return ufbxi_fail_imp(uc, ufbxi_error_msg(ufbxi_cond_str(cond), msg), ufbxi_function, ufbxi_line) +#define ufbxi_check_return_msg(cond, ret, msg) do { if (ufbxi_unlikely(!ufbxi_trace(cond))) { ufbxi_fail_imp(uc, ufbxi_error_msg(ufbxi_cond_str(cond), msg), ufbxi_function, ufbxi_line); return ret; } } while (0) +#define ufbxi_fail_msg(desc, msg) return ufbxi_fail_imp(uc, ufbxi_error_msg(desc, msg), ufbxi_function, ufbxi_line) + +#define ufbxi_warnf(type, ...) ufbxi_warnf_imp(&uc->warnings, type, __VA_ARGS__) + +// -- Progress + +static ufbxi_forceinline uint64_t ufbxi_get_read_offset(ufbxi_context *uc) +{ + return uc->data_offset + ufbxi_to_size(uc->data - uc->data_begin); +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_report_progress(ufbxi_context *uc) +{ + if (!uc->opts.progress_cb.fn) return 1; + + uint64_t read_offset = ufbxi_get_read_offset(uc); + uc->latest_progress_bytes = read_offset; + + ufbx_progress progress; + progress.bytes_read = read_offset; + progress.bytes_total = uc->progress_bytes_total; + if (progress.bytes_total < progress.bytes_read) { + progress.bytes_total = progress.bytes_read; + } + + uc->progress_timer = 1024; + uint32_t result = (uint32_t)uc->opts.progress_cb.fn(uc->opts.progress_cb.user, &progress); + ufbx_assert(result == UFBX_PROGRESS_CONTINUE || result == UFBX_PROGRESS_CANCEL); + ufbxi_check_msg(result != UFBX_PROGRESS_CANCEL, "Cancelled"); + return 1; +} + +// TODO: Remove `ufbxi_unused` when it's not needed anymore +ufbxi_unused ufbxi_nodiscard static ufbxi_forceinline int ufbxi_progress(ufbxi_context *uc, size_t work_units) +{ + if (!uc->opts.progress_cb.fn) return 1; + ptrdiff_t left = uc->progress_timer - (ptrdiff_t)work_units; + uc->progress_timer = left; + if (left > 0) return 1; + return ufbxi_report_progress(uc); +} + +// -- IO + +static ufbxi_noinline const char *ufbxi_refill(ufbxi_context *uc, size_t size, bool require_size) +{ + ufbx_assert(uc->data_size < size); + ufbxi_check_return(!uc->eof, NULL); + if (require_size) { + ufbxi_check_return_msg(uc->read_fn, NULL, "Truncated file"); + } else if (!uc->read_fn) { + uc->eof = true; + return uc->data; + } + + void *data_to_free = NULL; + size_t size_to_free = 0; + + // Grow the read buffer if necessary, data is copied over below with the + // usual path so the free is deferred (`size_to_free`, `data_to_free`) + if (size > uc->read_buffer_size) { + size_t new_size = ufbxi_max_sz(size, uc->opts.read_buffer_size); + new_size = ufbxi_max_sz(new_size, uc->read_buffer_size * 2); + size_to_free = uc->read_buffer_size; + data_to_free = uc->read_buffer; + char *new_buffer = ufbxi_alloc(&uc->ator_tmp, char, new_size); + ufbxi_check_return(new_buffer, NULL); + uc->read_buffer = new_buffer; + uc->read_buffer_size = new_size; + } + + // Copy the remains of the previous buffer to the beginning of the new one + size_t num_read = uc->data_size; + if (num_read > 0) { + ufbx_assert(uc->read_buffer != NULL && uc->data != NULL); + memmove(uc->read_buffer, uc->data, num_read); + } + + if (size_to_free) { + ufbxi_free(&uc->ator_tmp, char, data_to_free, size_to_free); + } + + // Fill the rest of the buffer with user data + size_t to_read = uc->read_buffer_size - num_read; + size_t read_result = uc->read_fn(uc->read_user, uc->read_buffer + num_read, to_read); + ufbxi_check_return_msg(read_result != SIZE_MAX, NULL, "IO error"); + ufbxi_check_return(read_result <= to_read, NULL); + if (read_result < to_read) { + uc->eof = true; + } + + num_read += read_result; + if (require_size) { + ufbxi_check_return_msg(num_read >= size, NULL, "Truncated file"); + } + + uc->data_offset += ufbxi_to_size(uc->data - uc->data_begin); + uc->data_begin = uc->data = uc->read_buffer; + uc->data_size = num_read; + + return uc->read_buffer; +} + +static ufbxi_forceinline void ufbxi_pause_progress(ufbxi_context *uc) +{ + uc->data_size += uc->yield_size; + uc->yield_size = 0; +} + +static ufbxi_noinline int ufbxi_resume_progress(ufbxi_context *uc) +{ + uc->yield_size = ufbxi_min_sz(uc->data_size, uc->progress_interval); + uc->data_size -= uc->yield_size; + + if (ufbxi_get_read_offset(uc) - uc->latest_progress_bytes >= uc->progress_interval) { + ufbxi_check(ufbxi_report_progress(uc)); + } + + return 1; +} + +static ufbxi_noinline const char *ufbxi_yield(ufbxi_context *uc, size_t size) +{ + const char *ret; + uc->data_size += uc->yield_size; + if (uc->data_size >= size) { + ret = uc->data; + } else { + ret = ufbxi_refill(uc, size, true); + } + uc->yield_size = ufbxi_min_sz(uc->data_size, ufbxi_max_sz(size, uc->progress_interval)); + uc->data_size -= uc->yield_size; + + ufbxi_check_return(ufbxi_report_progress(uc), NULL); + return ret; +} + +static ufbxi_forceinline const char *ufbxi_peek_bytes(ufbxi_context *uc, size_t size) +{ + if (uc->yield_size >= size) { + return uc->data; + } else { + return ufbxi_yield(uc, size); + } +} + +static ufbxi_forceinline const char *ufbxi_read_bytes(ufbxi_context *uc, size_t size) +{ + // Refill the current buffer if necessary + const char *ret; + if (uc->yield_size >= size) { + ret = uc->data; + } else { + ret = ufbxi_yield(uc, size); + if (!ret) return NULL; + } + + // Advance the read position inside the current buffer + uc->yield_size -= size; + uc->data = ret + size; + return ret; +} + +static ufbxi_forceinline void ufbxi_consume_bytes(ufbxi_context *uc, size_t size) +{ + // Bytes must have been checked first with `ufbxi_peek_bytes()` + ufbx_assert(size <= uc->yield_size); + uc->yield_size -= size; + uc->data += size; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_skip_bytes(ufbxi_context *uc, uint64_t size) +{ + if (uc->skip_fn) { + ufbxi_pause_progress(uc); + + if (size > uc->data_size) { + size -= uc->data_size; + uc->data += uc->data_size; + uc->data_size = 0; + + uc->data_offset += size; + while (size >= UFBXI_MAX_SKIP_SIZE) { + size -= UFBXI_MAX_SKIP_SIZE; + ufbxi_check_msg(uc->skip_fn(uc->read_user, UFBXI_MAX_SKIP_SIZE - 1), "Truncated file"); + + // Check that we can read at least one byte in case the file is broken + // and causes us to seek indefinitely forwards as `fseek()` does not + // report if we hit EOF... + char single_byte[1]; + size_t num_read = uc->read_fn(uc->read_user, single_byte, 1); + ufbxi_check_msg(num_read <= 1, "IO error"); + ufbxi_check_msg(num_read == 1, "Truncated file"); + } + + if (size > 0) { + ufbxi_check_msg(uc->skip_fn(uc->read_user, (size_t)size), "Truncated file"); + } + + } else { + uc->data += (size_t)size; + uc->data_size -= (size_t)size; + } + + ufbxi_check(ufbxi_resume_progress(uc)); + } else { + // Read and discard bytes in reasonable chunks + uint64_t skip_size = ufbxi_max64(uc->read_buffer_size, uc->opts.read_buffer_size); + while (size > 0) { + uint64_t to_skip = ufbxi_min64(size, skip_size); + ufbxi_check(ufbxi_read_bytes(uc, (size_t)to_skip)); + size -= to_skip; + } + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_read_to(ufbxi_context *uc, void *dst, size_t size) +{ + char *ptr = (char*)dst; + + ufbxi_pause_progress(uc); + + // Copy data from the current buffer first + size_t len = ufbxi_min_sz(uc->data_size, size); + memcpy(ptr, uc->data, len); + uc->data += len; + uc->data_size -= len; + ptr += len; + size -= len; + + // If there's data left to copy try to read from user IO + if (size > 0) { + uc->data_offset += ufbxi_to_size(uc->data - uc->data_begin); + + uc->data_begin = uc->data = NULL; + uc->data_size = 0; + ufbxi_check(uc->read_fn); + len = uc->read_fn(uc->read_user, ptr, size); + ufbxi_check_msg(len != SIZE_MAX, "IO error"); + ufbxi_check(len == size); + + uc->data_offset += size; + } + + ufbxi_check(ufbxi_resume_progress(uc)); + + return 1; +} + +// -- File IO + +static ufbxi_noinline void ufbxi_init_ator(ufbx_error *error, ufbxi_allocator *ator, const ufbx_allocator_opts *opts, const char *name) +{ + ufbx_allocator_opts zero_opts; + if (!opts) { + memset(&zero_opts, 0, sizeof(zero_opts)); + opts = &zero_opts; + } + + // `opts` is either passed in or `zero_opts`. + // cppcheck-suppress uninitvar + ator->ator = *opts; + ator->error = error; + ator->max_size = opts->memory_limit ? opts->memory_limit : SIZE_MAX; + ator->max_allocs = opts->allocation_limit ? opts->allocation_limit : SIZE_MAX; + ator->huge_size = opts->huge_threshold ? opts->huge_threshold : 0x100000; + ator->chunk_max = opts->max_chunk_size ? opts->max_chunk_size : 0x1000000; + ator->name = name; +} + +static ufbxi_noinline FILE *ufbxi_fopen(const char *path, size_t path_len, ufbxi_allocator *tmp_ator) +{ +#if !defined(UFBX_STANDARD_C) && defined(_WIN32) + wchar_t wpath_buf[256]; + wchar_t *wpath = NULL; + + if (path_len == SIZE_MAX) { + path_len = strlen(path); + } + if (path_len < ufbxi_arraycount(wpath_buf) - 1) { + wpath = wpath_buf; + } else { + wpath = ufbxi_alloc(tmp_ator, wchar_t, path_len + 1); + if (!wpath) return NULL; + } + + // Convert UTF-8 to UTF-16 but allow stray surrogate pairs as the Windows + // file system encoding allows them as well.. + size_t wlen = 0; + for (size_t i = 0; i < path_len; ) { + uint32_t code = UINT32_MAX; + char c = path[i++]; + if ((c & 0x80) == 0) { + code = (uint32_t)c; + } else if ((c & 0xe0) == 0xc0) { + code = (uint32_t)(c & 0x1f); + if (i < path_len) code = code << 6 | (uint32_t)(path[i++] & 0x3f); + } else if ((c & 0xf0) == 0xe0) { + code = (uint32_t)(c & 0x0f); + if (i < path_len) code = code << 6 | (uint32_t)(path[i++] & 0x3f); + if (i < path_len) code = code << 6 | (uint32_t)(path[i++] & 0x3f); + } else if ((c & 0xf8) == 0xf0) { + code = (uint32_t)(c & 0x07); + if (i < path_len) code = code << 6 | (uint32_t)(path[i++] & 0x3f); + if (i < path_len) code = code << 6 | (uint32_t)(path[i++] & 0x3f); + if (i < path_len) code = code << 6 | (uint32_t)(path[i++] & 0x3f); + } + if (code < 0x10000) { + wpath[wlen++] = (wchar_t)code; + } else { + code -= 0x10000; + wpath[wlen++] = (wchar_t)(0xd800 + (code >> 10)); + wpath[wlen++] = (wchar_t)(0xdc00 + (code & 0x3ff)); + } + } + wpath[wlen] = 0; + + FILE *file = NULL; +#if UFBXI_MSC_VER >= 1400 + if (_wfopen_s(&file, wpath, L"rb") != 0) { + file = NULL; + } +#else + file = _wfopen(wpath, L"rb"); +#endif + + if (wpath != wpath_buf) { + ufbxi_free(tmp_ator, wchar_t, wpath, path_len + 1); + } + + return file; +#else + if (path_len == SIZE_MAX) { + return fopen(path, "rb"); + } + + char copy_buf[256]; + char *copy = NULL; + + if (path_len < ufbxi_arraycount(copy_buf) - 1) { + copy = copy_buf; + } else { + copy = ufbxi_alloc(tmp_ator, char, path_len + 1); + if (!copy) return NULL; + } + memcpy(copy, path, path_len); + copy[path_len] = '\0'; + + FILE *file = fopen(copy, "rb"); + + if (copy != copy_buf) { + ufbxi_free(tmp_ator, char, copy, path_len + 1); + } + + return file; +#endif +} + +static uint64_t ufbxi_ftell(FILE *file) +{ +#if !defined(UFBX_STANDARD_C) && defined(UFBX_HAS_FTELLO) + off_t result = ftello(file); + if (result >= 0) return (uint64_t)result; +#elif !defined(UFBX_STANDARD_C) && defined(_MSC_VER) + int64_t result = _ftelli64(file); + if (result >= 0) return (uint64_t)result; +#else + long result = ftell(file); + if (result >= 0) return (uint64_t)result; +#endif + return UINT64_MAX; +} + +static size_t ufbxi_file_read(void *user, void *data, size_t max_size) +{ + FILE *file = (FILE*)user; + if (ferror(file)) return SIZE_MAX; + return fread(data, 1, max_size, file); +} + +static bool ufbxi_file_skip(void *user, size_t size) +{ + FILE *file = (FILE*)user; + ufbx_assert(size <= UFBXI_MAX_SKIP_SIZE); + if (fseek(file, (long)size, SEEK_CUR) != 0) return false; + if (ferror(file)) return false; + return true; +} + +static void ufbxi_file_close(void *user) +{ + FILE *file = (FILE*)user; + fclose(file); +} + +typedef struct { + const void *data; + size_t size; + size_t position; + ufbx_close_memory_cb close_cb; + + // Own allocation information + size_t self_size; + ufbxi_allocator ator; + ufbx_error error; + char data_copy[]; +} ufbxi_memory_stream; + +static size_t ufbxi_memory_read(void *user, void *data, size_t max_size) +{ + ufbxi_memory_stream *stream = (ufbxi_memory_stream*)user; + size_t to_read = ufbxi_min_sz(stream->size - stream->position, max_size); + memcpy(data, (const char*)stream->data + stream->position, to_read); + stream->position += to_read; + return to_read; +} + +static bool ufbxi_memory_skip(void *user, size_t size) +{ + ufbxi_memory_stream *stream = (ufbxi_memory_stream*)user; + if (stream->size - stream->position < size) return false; + stream->position += size; + return true; +} + +static void ufbxi_memory_close(void *user) +{ + ufbxi_memory_stream *stream = (ufbxi_memory_stream*)user; + if (stream->close_cb.fn) { + stream->close_cb.fn(stream->close_cb.user, (void*)stream->data, stream->size); + } + + ufbxi_allocator ator = stream->ator; + ufbxi_free(&ator, char, stream, stream->self_size); + ufbxi_free_ator(&ator); +} + +// -- XML + +#if UFBXI_FEATURE_XML + +typedef struct ufbxi_xml_tag ufbxi_xml_tag; +typedef struct ufbxi_xml_attrib ufbxi_xml_attrib; +typedef struct ufbxi_xml_document ufbxi_xml_document; + +struct ufbxi_xml_attrib { + ufbx_string name; + ufbx_string value; +}; + +struct ufbxi_xml_tag { + ufbx_string name; + ufbx_string text; + + ufbxi_xml_attrib *attribs; + size_t num_attribs; + + ufbxi_xml_tag *children; + size_t num_children; +}; + +struct ufbxi_xml_document { + ufbxi_xml_tag *root; + ufbxi_buf buf; +}; + +typedef struct { + ufbx_error error; + + ufbxi_allocator *ator; + + ufbxi_buf tmp_stack; + ufbxi_buf result; + + ufbxi_xml_document *doc; + + ufbx_read_fn *read_fn; + void *read_user; + + char *tok; + size_t tok_cap; + size_t tok_len; + + const char *pos, *pos_end; + char data[4096]; + + bool io_error; +} ufbxi_xml_context; + +enum { + UFBXI_XML_CTYPE_WHITESPACE = 0x1, + UFBXI_XML_CTYPE_SINGLE_QUOTE = 0x2, + UFBXI_XML_CTYPE_DOUBLE_QUOTE = 0x4, + UFBXI_XML_CTYPE_NAME_END = 0x8, + UFBXI_XML_CTYPE_TAG_START = 0x10, + UFBXI_XML_CTYPE_END_OF_FILE = 0x20, +}; + +// Generated by `misc/gen_xml_ctype.py` +static const uint8_t ufbxi_xml_ctype[256] = { + 32,0,0,0,0,0,0,0,0,9,9,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 9,0,12,0,0,0,0,10,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,16,8,8,8, +}; + +static ufbxi_noinline void ufbxi_xml_refill(ufbxi_xml_context *xc) +{ + size_t num = xc->read_fn(xc->read_user, xc->data, sizeof(xc->data)); + if (num == SIZE_MAX || num < sizeof(xc->data)) xc->io_error = true; + if (num < sizeof(xc->data)) { + xc->data[num++] = '\0'; + } + xc->pos = xc->data; + xc->pos_end = xc->data + num; +} + +static ufbxi_forceinline void ufbxi_xml_advance(ufbxi_xml_context *xc) +{ + if (++xc->pos == xc->pos_end) ufbxi_xml_refill(xc); +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_xml_push_token_char(ufbxi_xml_context *xc, char c) +{ + if (xc->tok_len == xc->tok_cap || UFBXI_IS_REGRESSION) { + ufbxi_check_err(&xc->error, ufbxi_grow_array(xc->ator, &xc->tok, &xc->tok_cap, xc->tok_len + 1)); + } + xc->tok[xc->tok_len++] = c; + return 1; +} + +static ufbxi_noinline int ufbxi_xml_accept(ufbxi_xml_context *xc, char ch) +{ + if (*xc->pos == ch) { + ufbxi_xml_advance(xc); + return 1; + } else { + return 0; + } +} + +static ufbxi_noinline void ufbxi_xml_skip_while(ufbxi_xml_context *xc, uint32_t ctypes) +{ + while (ufbxi_xml_ctype[(uint8_t)*xc->pos] & ctypes) { + ufbxi_xml_advance(xc); + } +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_xml_skip_until_string(ufbxi_xml_context *xc, ufbx_string *dst, const char *suffix) +{ + xc->tok_len = 0; + size_t match_len = 0, ix = 0, suffix_len = strlen(suffix); + char buf[16] = { 0 }; + size_t wrap_mask = sizeof(buf) - 1; + ufbx_assert(suffix_len < sizeof(buf)); + for (;;) { + char c = *xc->pos; + ufbxi_check_err_msg(&xc->error, c != 0, "Truncated file"); + ufbxi_xml_advance(xc); + if (ix >= suffix_len) { + ufbxi_check_err(&xc->error, ufbxi_xml_push_token_char(xc, buf[(ix - suffix_len) & wrap_mask])); + } + + buf[ix++ & wrap_mask] = c; + for (match_len = 0; match_len < suffix_len; match_len++) { + if (buf[(ix - suffix_len + match_len) & wrap_mask] != suffix[match_len]) { + break; + } + } + if (match_len == suffix_len) break; + } + + ufbxi_check_err(&xc->error, ufbxi_xml_push_token_char(xc, '\0')); + if (dst) { + dst->length = xc->tok_len - 1; + dst->data = ufbxi_push_copy(&xc->result, char, xc->tok_len, xc->tok); + ufbxi_check_err(&xc->error, dst->data); + } + + return 1; +} + +static ufbxi_noinline int ufbxi_xml_read_until(ufbxi_xml_context *xc, ufbx_string *dst, uint32_t ctypes) +{ + xc->tok_len = 0; + for (;;) { + char c = *xc->pos; + + if (c == '&') { + size_t entity_begin = xc->tok_len; + for (;;) { + ufbxi_xml_advance(xc); + c = *xc->pos; + ufbxi_check_err(&xc->error, c != '\0'); + if (c == ';') break; + ufbxi_check_err(&xc->error, ufbxi_xml_push_token_char(xc, c)); + } + ufbxi_xml_advance(xc); + ufbxi_check_err(&xc->error, ufbxi_xml_push_token_char(xc, '\0')); + + char *entity = xc->tok + entity_begin; + xc->tok_len = entity_begin; + + if (entity[0] == '#') { + unsigned long code = 0; + if (entity[1] == 'x') { + code = strtoul(entity + 2, NULL, 16); + } else { + code = strtoul(entity + 1, NULL, 10); + } + + char bytes[5] = { 0 }; + if (code < 0x80) { + bytes[0] = (char)code; + } else if (code < 0x800) { + bytes[0] = (char)(0xc0 | (code>>6)); + bytes[1] = (char)(0x80 | (code & 0x3f)); + } else if (code < 0x10000) { + bytes[0] = (char)(0xe0 | (code>>12)); + bytes[1] = (char)(0x80 | ((code>>6) & 0x3f)); + bytes[2] = (char)(0x80 | (code & 0x3f)); + } else { + bytes[0] = (char)(0xf0 | (code>>18)); + bytes[1] = (char)(0x80 | ((code>>12) & 0x3f)); + bytes[2] = (char)(0x80 | ((code>>6) & 0x3f)); + bytes[3] = (char)(0x80 | (code & 0x3f)); + } + for (char *b = bytes; *b; b++) { + ufbxi_check_err(&xc->error, ufbxi_xml_push_token_char(xc, *b)); + } + } else { + char ch = '\0'; + if (!strcmp(entity, "lt")) ch = '<'; + else if (!strcmp(entity, "quot")) ch = '"'; + else if (!strcmp(entity, "amp")) ch = '&'; + else if (!strcmp(entity, "apos")) ch = '\''; + else if (!strcmp(entity, "gt")) ch = '>'; + if (ch) { + ufbxi_check_err(&xc->error, ufbxi_xml_push_token_char(xc, ch)); + } + } + } else { + if ((ufbxi_xml_ctype[(uint8_t)c] & ctypes) != 0) break; + ufbxi_check_err_msg(&xc->error, c != 0, "Truncated file"); + ufbxi_check_err(&xc->error, ufbxi_xml_push_token_char(xc, c)); + ufbxi_xml_advance(xc); + } + } + + ufbxi_check_err(&xc->error, ufbxi_xml_push_token_char(xc, '\0')); + if (dst) { + dst->length = xc->tok_len - 1; + dst->data = ufbxi_push_copy(&xc->result, char, xc->tok_len, xc->tok); + ufbxi_check_err(&xc->error, dst->data); + } + + return 1; +} + +// Recursion limited by check at the start +static ufbxi_noinline int ufbxi_xml_parse_tag(ufbxi_xml_context *xc, size_t depth, bool *p_closing, const char *opening) + ufbxi_recursive_function(int, ufbxi_xml_parse_tag, (xc, depth, p_closing, opening), UFBXI_MAX_XML_DEPTH + 1, + (ufbxi_xml_context *xc, size_t depth, bool *p_closing, const char *opening)) +{ + ufbxi_check_err(&xc->error, depth < UFBXI_MAX_XML_DEPTH); + + if (!ufbxi_xml_accept(xc, '<')) { + if (*xc->pos == '\0') { + *p_closing = true; + } else { + ufbxi_check_err(&xc->error, ufbxi_xml_read_until(xc, NULL, UFBXI_XML_CTYPE_TAG_START | UFBXI_XML_CTYPE_END_OF_FILE)); + bool has_text = false; + for (size_t i = 0; i < xc->tok_len; i++) { + if ((ufbxi_xml_ctype[(uint8_t)xc->tok[i]] & UFBXI_XML_CTYPE_WHITESPACE) == 0) { + has_text = true; + break; + } + } + + if (has_text) { + ufbxi_xml_tag *tag = ufbxi_push_zero(&xc->tmp_stack, ufbxi_xml_tag, 1); + ufbxi_check_err(&xc->error, tag); + tag->name.data = ufbxi_empty_char; + + tag->text.length = xc->tok_len - 1; + tag->text.data = ufbxi_push_copy(&xc->result, char, xc->tok_len, xc->tok); + ufbxi_check_err(&xc->error, tag->text.data); + } + } + return 1; + } + + if (ufbxi_xml_accept(xc, '/')) { + ufbxi_check_err(&xc->error, ufbxi_xml_read_until(xc, NULL, UFBXI_XML_CTYPE_NAME_END)); + ufbxi_check_err(&xc->error, opening && !strcmp(xc->tok, opening)); + ufbxi_xml_skip_while(xc, UFBXI_XML_CTYPE_WHITESPACE); + if (!ufbxi_xml_accept(xc, '>')) return 0; + *p_closing = true; + return 1; + } else if (ufbxi_xml_accept(xc, '!')) { + if (ufbxi_xml_accept(xc, '[')) { + for (const char *ch = "CDATA["; *ch; ch++) { + if (!ufbxi_xml_accept(xc, *ch)) return 0; + } + + ufbxi_xml_tag *tag = ufbxi_push_zero(&xc->tmp_stack, ufbxi_xml_tag, 1); + ufbxi_check_err(&xc->error, tag); + ufbxi_check_err(&xc->error, ufbxi_xml_skip_until_string(xc, &tag->text, "]]>")); + tag->name.data = ufbxi_empty_char; + + } else if (ufbxi_xml_accept(xc, '-')) { + if (!ufbxi_xml_accept(xc, '-')) return 0; + ufbxi_check_err(&xc->error, ufbxi_xml_skip_until_string(xc, NULL, "-->")); + } else { + // TODO: !DOCTYPE + ufbxi_check_err(&xc->error, ufbxi_xml_skip_until_string(xc, NULL, ">")); + } + return 1; + } else if (ufbxi_xml_accept(xc, '?')) { + ufbxi_check_err(&xc->error, ufbxi_xml_skip_until_string(xc, NULL, "?>")); + return 1; + } + + ufbxi_xml_tag *tag = ufbxi_push_zero(&xc->tmp_stack, ufbxi_xml_tag, 1); + ufbxi_check_err(&xc->error, tag); + ufbxi_check_err(&xc->error, ufbxi_xml_read_until(xc, &tag->name, UFBXI_XML_CTYPE_NAME_END)); + tag->text.data = ufbxi_empty_char; + + bool has_children = false; + + size_t num_attribs = 0; + for (;;) { + ufbxi_xml_skip_while(xc, UFBXI_XML_CTYPE_WHITESPACE); + if (ufbxi_xml_accept(xc, '/')) { + if (!ufbxi_xml_accept(xc, '>')) return 0; + break; + } else if (ufbxi_xml_accept(xc, '>')) { + has_children = true; + break; + } else { + ufbxi_xml_attrib *attrib = ufbxi_push_zero(&xc->tmp_stack, ufbxi_xml_attrib, 1); + ufbxi_check_err(&xc->error, attrib); + ufbxi_check_err(&xc->error, ufbxi_xml_read_until(xc, &attrib->name, UFBXI_XML_CTYPE_NAME_END)); + ufbxi_xml_skip_while(xc, UFBXI_XML_CTYPE_WHITESPACE); + if (!ufbxi_xml_accept(xc, '=')) return 0; + ufbxi_xml_skip_while(xc, UFBXI_XML_CTYPE_WHITESPACE); + uint32_t quote_ctype = 0; + if (ufbxi_xml_accept(xc, '"')) { + quote_ctype = UFBXI_XML_CTYPE_DOUBLE_QUOTE; + } else if (ufbxi_xml_accept(xc, '\'')) { + quote_ctype = UFBXI_XML_CTYPE_SINGLE_QUOTE; + } else { + ufbxi_fail_err(&xc->error, "Bad attrib value"); + } + ufbxi_check_err(&xc->error, ufbxi_xml_read_until(xc, &attrib->value, quote_ctype)); + ufbxi_xml_advance(xc); + num_attribs++; + } + } + + tag->num_attribs = num_attribs; + tag->attribs = ufbxi_push_pop(&xc->result, &xc->tmp_stack, ufbxi_xml_attrib, num_attribs); + ufbxi_check_err(&xc->error, tag->attribs); + + if (has_children) { + size_t children_begin = xc->tmp_stack.num_items; + for (;;) { + bool closing = false; + ufbxi_check_err(&xc->error, ufbxi_xml_parse_tag(xc, depth + 1, &closing, tag->name.data)); + if (closing) break; + } + + tag->num_children = xc->tmp_stack.num_items - children_begin; + tag->children = ufbxi_push_pop(&xc->result, &xc->tmp_stack, ufbxi_xml_tag, tag->num_children); + ufbxi_check_err(&xc->error, tag->children); + } + + return 1; +} + +static ufbxi_noinline int ufbxi_xml_parse_root(ufbxi_xml_context *xc) +{ + ufbxi_xml_tag *tag = ufbxi_push_zero(&xc->result, ufbxi_xml_tag, 1); + ufbxi_check_err(&xc->error, tag); + tag->name.data = ufbxi_empty_char; + tag->text.data = ufbxi_empty_char; + + for (;;) { + bool closing = false; + ufbxi_check_err(&xc->error, ufbxi_xml_parse_tag(xc, 0, &closing, NULL)); + if (closing) break; + } + + tag->num_children = xc->tmp_stack.num_items; + tag->children = ufbxi_push_pop(&xc->result, &xc->tmp_stack, ufbxi_xml_tag, tag->num_children); + ufbxi_check_err(&xc->error, tag->children); + + xc->doc = ufbxi_push(&xc->result, ufbxi_xml_document, 1); + ufbxi_check_err(&xc->error, xc->doc); + + xc->doc->root = tag; + xc->doc->buf = xc->result; + + return 1; +} + +typedef struct { + ufbxi_allocator *ator; + ufbx_read_fn *read_fn; + void *read_user; + const char *prefix; + size_t prefix_length; +} ufbxi_xml_load_opts; + +static ufbxi_noinline ufbxi_xml_document *ufbxi_load_xml(ufbxi_xml_load_opts *opts, ufbx_error *error) +{ + ufbxi_xml_context xc = { UFBX_ERROR_NONE }; + xc.ator = opts->ator; + xc.read_fn = opts->read_fn; + xc.read_user = opts->read_user; + + xc.tmp_stack.ator = xc.ator; + xc.result.ator = xc.ator; + + xc.result.unordered = true; + + if (opts->prefix_length > 0) { + xc.pos = opts->prefix; + xc.pos_end = opts->prefix + opts->prefix_length; + } else { + ufbxi_xml_refill(&xc); + } + + int ok = ufbxi_xml_parse_root(&xc); + + ufbxi_buf_free(&xc.tmp_stack); + ufbxi_free(xc.ator, char, xc.tok, xc.tok_cap); + + if (ok) { + return xc.doc; + } else { + ufbxi_buf_free(&xc.result); + if (error) { + *error = xc.error; + } + + return NULL; + } +} + +static ufbxi_noinline void ufbxi_free_xml(ufbxi_xml_document *doc) +{ + ufbxi_buf buf = doc->buf; + ufbxi_buf_free(&buf); +} + +static ufbxi_noinline ufbxi_xml_tag *ufbxi_xml_find_child(ufbxi_xml_tag *tag, const char *name) +{ + ufbxi_for(ufbxi_xml_tag, child, tag->children, tag->num_children) { + if (!strcmp(child->name.data, name)) { + return child; + } + } + return NULL; +} + +static ufbxi_noinline ufbxi_xml_attrib *ufbxi_xml_find_attrib(ufbxi_xml_tag *tag, const char *name) +{ + ufbxi_for(ufbxi_xml_attrib, attrib, tag->attribs, tag->num_attribs) { + if (!strcmp(attrib->name.data, name)) { + return attrib; + } + } + return NULL; +} + +#endif + +// -- FBX value type information + +static char ufbxi_normalize_array_type(char type) { + switch (type) { + case 'r': return sizeof(ufbx_real) == sizeof(float) ? 'f' : 'd'; + case 'b': return 'c'; + default: return type; + } +} + +static ufbxi_noinline size_t ufbxi_array_type_size(char type) +{ + switch (type) { + case 'r': return sizeof(ufbx_real); + case 'b': return sizeof(bool); + case 'c': return sizeof(uint8_t); + case 'i': return sizeof(int32_t); + case 'l': return sizeof(int64_t); + case 'f': return sizeof(float); + case 'd': return sizeof(double); + case 's': return sizeof(ufbx_string); + case 'S': return sizeof(ufbx_string); + case 'C': return sizeof(ufbx_string); + default: return 1; + } +} + +// -- Node operations + +static ufbxi_noinline ufbxi_node *ufbxi_find_child(ufbxi_node *node, const char *name) +{ + ufbxi_for(ufbxi_node, c, node->children, node->num_children) { + if (c->name == name) return c; + } + return NULL; +} + +// Retrieve values from nodes with type codes: +// Any: '_' (ignore) +// NUMBER: 'I' int32_t 'L' int64_t 'F' float 'D' double 'R' ufbxi_real 'B' bool 'Z' size_t +// STRING: 'S' ufbx_string 'C' const char* (checked) 's' ufbx_string 'c' const char * (unchecked) 'b' ufbx_blob + +ufbxi_nodiscard ufbxi_forceinline static int ufbxi_get_val_at(ufbxi_node *node, size_t ix, char fmt, void *v) +{ + ufbxi_dev_assert(ix < UFBXI_MAX_NON_ARRAY_VALUES); + ufbxi_value_type type = (ufbxi_value_type)((node->value_type_mask >> (ix*2)) & 0x3); + switch (fmt) { + case '_': return 1; + case 'I': if (type == UFBXI_VALUE_NUMBER) { *(int32_t*)v = (int32_t)node->vals[ix].i; return 1; } else return 0; + case 'L': if (type == UFBXI_VALUE_NUMBER) { *(int64_t*)v = (int64_t)node->vals[ix].i; return 1; } else return 0; + case 'F': if (type == UFBXI_VALUE_NUMBER) { *(float*)v = (float)node->vals[ix].f; return 1; } else return 0; + case 'D': if (type == UFBXI_VALUE_NUMBER) { *(double*)v = (double)node->vals[ix].f; return 1; } else return 0; + case 'R': if (type == UFBXI_VALUE_NUMBER) { *(ufbx_real*)v = (ufbx_real)node->vals[ix].f; return 1; } else return 0; + case 'B': if (type == UFBXI_VALUE_NUMBER) { *(bool*)v = node->vals[ix].i != 0; return 1; } else return 0; + case 'Z': if (type == UFBXI_VALUE_NUMBER) { if (node->vals[ix].i < 0) return 0; *(size_t*)v = (size_t)node->vals[ix].i; return 1; } else return 0; + case 'S': if (type == UFBXI_VALUE_STRING) { + ufbxi_sanitized_string src = node->vals[ix].s; + ufbx_string *dst = (ufbx_string*)v; + if (src.utf8_length > 0) { + if (src.utf8_length == UINT32_MAX) return 0; + dst->data = src.raw_data + src.raw_length + 1; + dst->length = src.utf8_length; + } else { + dst->data = src.raw_data; + dst->length = src.raw_length; + } + return 1; + } else return 0; + case 's': if (type == UFBXI_VALUE_STRING) { + ufbxi_sanitized_string src = node->vals[ix].s; + ufbx_string *dst = (ufbx_string*)v; + dst->data = src.raw_data; + dst->length = src.raw_length; + return 1; + } else return 0; + case 'C': if (type == UFBXI_VALUE_STRING) { + ufbxi_sanitized_string src = node->vals[ix].s; + const char **dst = (const char **)v; + if (src.utf8_length > 0) { + if (src.utf8_length == UINT32_MAX) return 0; + *dst = src.raw_data + src.raw_length + 1; + } else { + *dst = src.raw_data; + } + return 1; + } else return 0; + case 'c': if (type == UFBXI_VALUE_STRING) { + ufbxi_sanitized_string src = node->vals[ix].s; + const char **dst = (const char **)v; + *dst = src.raw_data; + return 1; + } else return 0; + case 'b': if (type == UFBXI_VALUE_STRING) { + ufbxi_sanitized_string src = node->vals[ix].s; + ufbx_blob *dst = (ufbx_blob*)v; + dst->data = src.raw_data; + dst->size = src.raw_length; + return 1; + } else return 0; + default: + ufbx_assert(0 && "Bad format char"); + return 0; + } +} + +ufbxi_nodiscard ufbxi_noinline static ufbxi_value_array *ufbxi_get_array(ufbxi_node *node, char fmt) +{ + if (node->value_type_mask != UFBXI_VALUE_ARRAY) return NULL; + ufbxi_value_array *array = node->array; + if (fmt != '?') { + fmt = ufbxi_normalize_array_type(fmt); + if (array->type != fmt) return NULL; + } + return array; +} + +ufbxi_nodiscard static ufbxi_forceinline int ufbxi_get_val1(ufbxi_node *node, const char *fmt, void *v0) +{ + if (!ufbxi_get_val_at(node, 0, fmt[0], v0)) return 0; + return 1; +} + +ufbxi_nodiscard static ufbxi_forceinline int ufbxi_get_val2(ufbxi_node *node, const char *fmt, void *v0, void *v1) +{ + if (!ufbxi_get_val_at(node, 0, fmt[0], v0)) return 0; + if (!ufbxi_get_val_at(node, 1, fmt[1], v1)) return 0; + return 1; +} + +ufbxi_nodiscard static ufbxi_forceinline int ufbxi_get_val3(ufbxi_node *node, const char *fmt, void *v0, void *v1, void *v2) +{ + if (!ufbxi_get_val_at(node, 0, fmt[0], v0)) return 0; + if (!ufbxi_get_val_at(node, 1, fmt[1], v1)) return 0; + if (!ufbxi_get_val_at(node, 2, fmt[2], v2)) return 0; + return 1; +} + +ufbxi_nodiscard static ufbxi_forceinline int ufbxi_get_val4(ufbxi_node *node, const char *fmt, void *v0, void *v1, void *v2, void *v3) +{ + if (!ufbxi_get_val_at(node, 0, fmt[0], v0)) return 0; + if (!ufbxi_get_val_at(node, 1, fmt[1], v1)) return 0; + if (!ufbxi_get_val_at(node, 2, fmt[2], v2)) return 0; + if (!ufbxi_get_val_at(node, 3, fmt[3], v3)) return 0; + return 1; +} + +ufbxi_nodiscard static ufbxi_forceinline int ufbxi_get_val5(ufbxi_node *node, const char *fmt, void *v0, void *v1, void *v2, void *v3, void *v4) +{ + if (!ufbxi_get_val_at(node, 0, fmt[0], v0)) return 0; + if (!ufbxi_get_val_at(node, 1, fmt[1], v1)) return 0; + if (!ufbxi_get_val_at(node, 2, fmt[2], v2)) return 0; + if (!ufbxi_get_val_at(node, 3, fmt[3], v3)) return 0; + if (!ufbxi_get_val_at(node, 4, fmt[4], v4)) return 0; + return 1; +} + +ufbxi_nodiscard static ufbxi_forceinline int ufbxi_find_val1(ufbxi_node *node, const char *name, const char *fmt, void *v0) +{ + ufbxi_node *child = ufbxi_find_child(node, name); + if (!child) return 0; + if (!ufbxi_get_val_at(child, 0, fmt[0], v0)) return 0; + return 1; +} + +ufbxi_nodiscard static ufbxi_forceinline int ufbxi_find_val2(ufbxi_node *node, const char *name, const char *fmt, void *v0, void *v1) +{ + ufbxi_node *child = ufbxi_find_child(node, name); + if (!child) return 0; + if (!ufbxi_get_val_at(child, 0, fmt[0], v0)) return 0; + if (!ufbxi_get_val_at(child, 1, fmt[1], v1)) return 0; + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline ufbxi_value_array *ufbxi_find_array(ufbxi_node *node, const char *name, char fmt) +{ + ufbxi_node *child = ufbxi_find_child(node, name); + if (!child) return NULL; + return ufbxi_get_array(child, fmt); +} + +static ufbxi_node *ufbxi_find_child_strcmp(ufbxi_node *node, const char *name) +{ + char leading = name[0]; + ufbxi_for(ufbxi_node, c, node->children, node->num_children) { + if (c->name[0] != leading) continue; + if (!strcmp(c->name, name)) return c; + } + return NULL; +} + +// -- Element extra data allocation + +ufbxi_nodiscard static ufbxi_noinline void *ufbxi_push_element_extra_size(ufbxi_context *uc, uint32_t id, size_t size) +{ + void *extra = ufbxi_push_size_zero(&uc->tmp, size, 1); + ufbxi_check_return(extra, NULL); + + if (uc->element_extra_cap <= id) { + size_t old_cap = uc->element_extra_cap; + ufbxi_check_return(ufbxi_grow_array(&uc->ator_tmp, &uc->element_extra_arr, &uc->element_extra_cap, id + 1), NULL); + memset(uc->element_extra_arr + old_cap, 0, (uc->element_extra_cap - old_cap) * sizeof(void*)); + } + // TODO: Return existing if ever needed + ufbx_assert(uc->element_extra_arr[id] == NULL); + uc->element_extra_arr[id] = extra; + + return extra; +} + +static ufbxi_noinline void *ufbxi_get_element_extra(ufbxi_context *uc, uint32_t id) +{ + if (id < uc->element_extra_cap) { + return uc->element_extra_arr[id]; + } else { + return NULL; + } +} + +#define ufbxi_push_element_extra(uc, id, type) (type*)ufbxi_push_element_extra_size((uc), (id), sizeof(type)) + +// -- Parsing state machine +// +// When reading the file we maintain a coarse representation of the structure so +// that we can resolve array info (type, included in result, etc). Using this info +// we can often read/decompress the contents directly into the right memory area. + +typedef enum { + UFBXI_PARSE_ROOT, + UFBXI_PARSE_FBX_HEADER_EXTENSION, + UFBXI_PARSE_DEFINITIONS, + UFBXI_PARSE_OBJECTS, + UFBXI_PARSE_CONNECTIONS, + UFBXI_PARSE_RELATIONS, + UFBXI_PARSE_TAKES, + UFBXI_PARSE_FBX_VERSION, + UFBXI_PARSE_MODEL, + UFBXI_PARSE_GEOMETRY, + UFBXI_PARSE_NODE_ATTRIBUTE, + UFBXI_PARSE_LEGACY_MODEL, + UFBXI_PARSE_LEGACY_SWITCHER, + UFBXI_PARSE_LEGACY_SCENE_PERSISTENCE, + UFBXI_PARSE_REFERENCES, + UFBXI_PARSE_REFERENCE, + UFBXI_PARSE_ANIMATION_CURVE, + UFBXI_PARSE_DEFORMER, + UFBXI_PARSE_ASSOCIATE_MODEL, + UFBXI_PARSE_LEGACY_LINK, + UFBXI_PARSE_POSE, + UFBXI_PARSE_POSE_NODE, + UFBXI_PARSE_TEXTURE, + UFBXI_PARSE_VIDEO, + UFBXI_PARSE_LAYERED_TEXTURE, + UFBXI_PARSE_SELECTION_NODE, + UFBXI_PARSE_COLLECTION, + UFBXI_PARSE_UNKNOWN_OBJECT, + UFBXI_PARSE_LAYER_ELEMENT_NORMAL, + UFBXI_PARSE_LAYER_ELEMENT_BINORMAL, + UFBXI_PARSE_LAYER_ELEMENT_TANGENT, + UFBXI_PARSE_LAYER_ELEMENT_UV, + UFBXI_PARSE_LAYER_ELEMENT_COLOR, + UFBXI_PARSE_LAYER_ELEMENT_VERTEX_CREASE, + UFBXI_PARSE_LAYER_ELEMENT_EDGE_CREASE, + UFBXI_PARSE_LAYER_ELEMENT_SMOOTHING, + UFBXI_PARSE_LAYER_ELEMENT_VISIBILITY, + UFBXI_PARSE_LAYER_ELEMENT_POLYGON_GROUP, + UFBXI_PARSE_LAYER_ELEMENT_HOLE, + UFBXI_PARSE_LAYER_ELEMENT_MATERIAL, + UFBXI_PARSE_LAYER_ELEMENT_OTHER, + UFBXI_PARSE_GEOMETRY_UV_INFO, + UFBXI_PARSE_SHAPE, + UFBXI_PARSE_TAKE, + UFBXI_PARSE_TAKE_OBJECT, + UFBXI_PARSE_CHANNEL, + UFBXI_PARSE_UNKNOWN, +} ufbxi_parse_state; + +typedef enum { + UFBXI_ARRAY_FLAG_RESULT = 0x1, // < Alloacte the array from the result buffer + UFBXI_ARRAY_FLAG_TMP_BUF = 0x2, // < Alloacte the array from the result buffer + UFBXI_ARRAY_FLAG_PAD_BEGIN = 0x4, // < Pad the begin of the array with 4 zero elements to guard from invalid -1 index accesses + UFBXI_ARRAY_FLAG_ACCURATE_F32 = 0x8, // < Must be parsed as bit-accurate 32-bit floats +} ufbxi_array_flags; + +typedef struct { + char type; // < FBX type code of the array: b,i,l,f,d (or 'r' meaning ufbx_real '-' ignore, 's'/'S' for strings, 'C' for content) + uint8_t flags; // < Combination of `ufbxi_array_flags` +} ufbxi_array_info; + +static ufbxi_noinline ufbxi_parse_state ufbxi_update_parse_state(ufbxi_parse_state parent, const char *name) +{ + switch (parent) { + + case UFBXI_PARSE_ROOT: + if (name == ufbxi_FBXHeaderExtension) return UFBXI_PARSE_FBX_HEADER_EXTENSION; + if (name == ufbxi_Definitions) return UFBXI_PARSE_DEFINITIONS; + if (name == ufbxi_Objects) return UFBXI_PARSE_OBJECTS; + if (name == ufbxi_Connections) return UFBXI_PARSE_CONNECTIONS; + if (name == ufbxi_Takes) return UFBXI_PARSE_TAKES; + if (name == ufbxi_Model) return UFBXI_PARSE_LEGACY_MODEL; + if (!strcmp(name, "References")) return UFBXI_PARSE_REFERENCES; + if (!strcmp(name, "Relations")) return UFBXI_PARSE_RELATIONS; + if (!strcmp(name, "Switcher")) return UFBXI_PARSE_LEGACY_SWITCHER; + if (!strcmp(name, "SceneGenericPersistence")) return UFBXI_PARSE_LEGACY_SCENE_PERSISTENCE; + break; + + case UFBXI_PARSE_FBX_HEADER_EXTENSION: + if (name == ufbxi_FBXVersion) return UFBXI_PARSE_FBX_VERSION; + break; + + case UFBXI_PARSE_OBJECTS: + if (name == ufbxi_Model) return UFBXI_PARSE_MODEL; + if (name == ufbxi_Geometry) return UFBXI_PARSE_GEOMETRY; + if (name == ufbxi_NodeAttribute) return UFBXI_PARSE_NODE_ATTRIBUTE; + if (name == ufbxi_AnimationCurve) return UFBXI_PARSE_ANIMATION_CURVE; + if (name == ufbxi_Deformer) return UFBXI_PARSE_DEFORMER; + if (name == ufbxi_Pose) return UFBXI_PARSE_POSE; + if (name == ufbxi_Texture) return UFBXI_PARSE_TEXTURE; + if (name == ufbxi_Video) return UFBXI_PARSE_VIDEO; + if (name == ufbxi_LayeredTexture) return UFBXI_PARSE_LAYERED_TEXTURE; + if (name == ufbxi_SelectionNode) return UFBXI_PARSE_SELECTION_NODE; + if (name == ufbxi_Collection) return UFBXI_PARSE_COLLECTION; + return UFBXI_PARSE_UNKNOWN_OBJECT; + + case UFBXI_PARSE_MODEL: + case UFBXI_PARSE_GEOMETRY: + if (name[0] == 'L') { + if (name == ufbxi_LayerElementNormal) return UFBXI_PARSE_LAYER_ELEMENT_NORMAL; + if (name == ufbxi_LayerElementBinormal) return UFBXI_PARSE_LAYER_ELEMENT_BINORMAL; + if (name == ufbxi_LayerElementTangent) return UFBXI_PARSE_LAYER_ELEMENT_TANGENT; + if (name == ufbxi_LayerElementUV) return UFBXI_PARSE_LAYER_ELEMENT_UV; + if (name == ufbxi_LayerElementColor) return UFBXI_PARSE_LAYER_ELEMENT_COLOR; + if (name == ufbxi_LayerElementVertexCrease) return UFBXI_PARSE_LAYER_ELEMENT_VERTEX_CREASE; + if (name == ufbxi_LayerElementEdgeCrease) return UFBXI_PARSE_LAYER_ELEMENT_EDGE_CREASE; + if (name == ufbxi_LayerElementSmoothing) return UFBXI_PARSE_LAYER_ELEMENT_SMOOTHING; + if (name == ufbxi_LayerElementVisibility) return UFBXI_PARSE_LAYER_ELEMENT_VISIBILITY; + if (name == ufbxi_LayerElementPolygonGroup) return UFBXI_PARSE_LAYER_ELEMENT_POLYGON_GROUP; + if (name == ufbxi_LayerElementHole) return UFBXI_PARSE_LAYER_ELEMENT_HOLE; + if (name == ufbxi_LayerElementMaterial) return UFBXI_PARSE_LAYER_ELEMENT_MATERIAL; + if (!strncmp(name, "LayerElement", 12)) return UFBXI_PARSE_LAYER_ELEMENT_OTHER; + } + if (name == ufbxi_Shape) return UFBXI_PARSE_SHAPE; + break; + + case UFBXI_PARSE_DEFORMER: + if (!strcmp(name, "AssociateModel")) return UFBXI_PARSE_ASSOCIATE_MODEL; + break; + + case UFBXI_PARSE_LEGACY_MODEL: + if (name == ufbxi_GeometryUVInfo) return UFBXI_PARSE_GEOMETRY_UV_INFO; + if (name == ufbxi_Link) return UFBXI_PARSE_LEGACY_LINK; + if (name == ufbxi_Channel) return UFBXI_PARSE_CHANNEL; + if (name == ufbxi_Shape) return UFBXI_PARSE_SHAPE; + break; + + case UFBXI_PARSE_POSE: + if (name == ufbxi_PoseNode) return UFBXI_PARSE_POSE_NODE; + break; + + case UFBXI_PARSE_TAKES: + if (name == ufbxi_Take) return UFBXI_PARSE_TAKE; + break; + + case UFBXI_PARSE_TAKE: + return UFBXI_PARSE_TAKE_OBJECT; + + case UFBXI_PARSE_TAKE_OBJECT: + if (name == ufbxi_Channel) return UFBXI_PARSE_CHANNEL; + break; + + case UFBXI_PARSE_CHANNEL: + if (name == ufbxi_Channel) return UFBXI_PARSE_CHANNEL; + break; + + case UFBXI_PARSE_REFERENCES: + return UFBXI_PARSE_REFERENCE; + + default: + break; + + } + + return UFBXI_PARSE_UNKNOWN; +} + +static bool ufbxi_is_array_node(ufbxi_context *uc, ufbxi_parse_state parent, const char *name, ufbxi_array_info *info) +{ + info->flags = 0; + + // Retain all arrays if user wants the DOM representation + if (uc->opts.retain_dom) { + info->flags |= UFBXI_ARRAY_FLAG_RESULT; + } + + switch (parent) { + + case UFBXI_PARSE_GEOMETRY: + case UFBXI_PARSE_MODEL: + if (name == ufbxi_Vertices) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } else if (name == ufbxi_PolygonVertexIndex) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_Edges) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + return true; + } else if (name == ufbxi_Indexes) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_Points) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_KnotVector) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_KnotVectorU) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_KnotVectorV) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_PointsIndex) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_Normals) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } + break; + + case UFBXI_PARSE_LEGACY_MODEL: + if (name == ufbxi_Vertices) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } else if (name == ufbxi_Normals) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } else if (name == ufbxi_Materials) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_PolygonVertexIndex) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_Children) { + info->type = 's'; + return true; + } + break; + + case UFBXI_PARSE_ANIMATION_CURVE: + if (name == ufbxi_KeyTime) { + info->type = uc->opts.ignore_animation ? '-' : 'l'; + return true; + } else if (name == ufbxi_KeyValueFloat) { + info->type = uc->opts.ignore_animation ? '-' : 'r'; + return true; + } else if (name == ufbxi_KeyAttrFlags) { + info->type = uc->opts.ignore_animation ? '-' : 'i'; + return true; + } else if (name == ufbxi_KeyAttrDataFloat) { + // The float data in a keyframe attribute array is represented as integers + // in versions >= 7200 as some of the elements aren't actually floats (!) + info->type = uc->from_ascii && uc->version >= 7200 ? 'i' : 'f'; + if (uc->opts.ignore_animation) info->type = '-'; + if (uc->from_ascii && uc->version >= 7200) { + info->flags |= UFBXI_ARRAY_FLAG_ACCURATE_F32; + } + return true; + } else if (name == ufbxi_KeyAttrRefCount) { + info->type = uc->opts.ignore_animation ? '-' : 'i'; + return true; + } + break; + + case UFBXI_PARSE_TEXTURE: + if (!strcmp(name, "ModelUVTranslation") || !strcmp(name, "ModelUVScaling") || !strcmp(name, "Cropping")) { + info->type = uc->opts.retain_dom ? 'r' : '-'; + return true; + } + break; + + case UFBXI_PARSE_VIDEO: + if (name == ufbxi_Content) { + info->type = uc->opts.ignore_embedded ? '-' : 'C'; + return true; + } + break; + + case UFBXI_PARSE_LAYERED_TEXTURE: + if (name == ufbxi_BlendModes) { + info->type = 'i'; + info->flags |= UFBXI_ARRAY_FLAG_TMP_BUF; + return true; + } else if (name == ufbxi_Alphas) { + info->type = 'r'; + info->flags |= UFBXI_ARRAY_FLAG_TMP_BUF; + return true; + } + break; + + case UFBXI_PARSE_SELECTION_NODE: + if (name == ufbxi_VertexIndexArray) { + info->type = 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_EdgeIndexArray) { + info->type = 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_PolygonIndexArray) { + info->type = 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_NORMAL: + if (name == ufbxi_Normals) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } else if (name == ufbxi_NormalsIndex) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_NormalsW) { + info->type = uc->opts.retain_dom ? 'r' : '-'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_BINORMAL: + if (name == ufbxi_Binormals) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } else if (name == ufbxi_BinormalsIndex) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_BinormalsW) { + info->type = uc->opts.retain_dom ? 'r' : '-'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_TANGENT: + if (name == ufbxi_Tangents) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } else if (name == ufbxi_TangentsIndex) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_TangentsW) { + info->type = uc->opts.retain_dom ? 'r' : '-'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_UV: + if (name == ufbxi_UV) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } else if (name == ufbxi_UVIndex) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_COLOR: + if (name == ufbxi_Colors) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } else if (name == ufbxi_ColorIndex) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_VERTEX_CREASE: + if (name == ufbxi_VertexCrease) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } else if (name == ufbxi_VertexCreaseIndex) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_EDGE_CREASE: + if (name == ufbxi_EdgeCrease) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_SMOOTHING: + if (name == ufbxi_Smoothing) { + info->type = uc->opts.ignore_geometry ? '-' : 'b'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_VISIBILITY: + if (name == ufbxi_Visibility) { + info->type = uc->opts.ignore_geometry ? '-' : 'b'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_POLYGON_GROUP: + if (name == ufbxi_PolygonGroup) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_HOLE: + if (name == ufbxi_Hole) { + info->type = uc->opts.ignore_geometry ? '-' : 'b'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_MATERIAL: + if (name == ufbxi_Materials) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + break; + + case UFBXI_PARSE_LAYER_ELEMENT_OTHER: + if (name == ufbxi_TextureId) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags |= UFBXI_ARRAY_FLAG_TMP_BUF; + return true; + } else if (name == ufbxi_UV) { + info->type = uc->opts.retain_dom ? 'r' : '-'; + return true; + } else if (name == ufbxi_UVIndex) { + info->type = uc->opts.retain_dom ? 'i' : '-'; + return true; + } + break; + + case UFBXI_PARSE_GEOMETRY_UV_INFO: + if (name == ufbxi_TextureUV) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } else if (name == ufbxi_TextureUVVerticeIndex) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } + break; + + case UFBXI_PARSE_SHAPE: + if (name == ufbxi_Indexes) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + if (name == ufbxi_Vertices) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } + if (name == ufbxi_Normals) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT | UFBXI_ARRAY_FLAG_PAD_BEGIN; + return true; + } + break; + + case UFBXI_PARSE_DEFORMER: + if (name == ufbxi_Transform) { + info->type = 'r'; + return true; + } else if (name == ufbxi_TransformLink) { + info->type = 'r'; + return true; + } else if (name == ufbxi_Indexes) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_Weights) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_BlendWeights) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_FullWeights) { + // Ignore blend shape FullWeights as it's used in Blender for vertex groups + // which we don't currently handle. https://developer.blender.org/T90382 + // TODO: Should we present this to users anyway somehow? + info->type = 'd'; + if (!uc->opts.disable_quirks && uc->exporter == UFBX_EXPORTER_BLENDER_BINARY) { + info->type = '-'; + } + info->flags |= UFBXI_ARRAY_FLAG_TMP_BUF; + return true; + } else if (!strcmp(name, "TransformAssociateModel")) { + info->type = uc->opts.retain_dom ? 'r' : '-'; + return true; + } + break; + + case UFBXI_PARSE_ASSOCIATE_MODEL: + if (name == ufbxi_Transform) { + info->type = uc->opts.retain_dom ? 'r' : '-'; + return true; + } + break; + + case UFBXI_PARSE_LEGACY_LINK: + if (name == ufbxi_Transform) { + info->type = 'r'; + return true; + } else if (name == ufbxi_TransformLink) { + info->type = 'r'; + return true; + } else if (name == ufbxi_Indexes) { + info->type = uc->opts.ignore_geometry ? '-' : 'i'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } else if (name == ufbxi_Weights) { + info->type = uc->opts.ignore_geometry ? '-' : 'r'; + info->flags = UFBXI_ARRAY_FLAG_RESULT; + return true; + } + break; + + case UFBXI_PARSE_POSE_NODE: + if (name == ufbxi_Matrix) { + info->type = 'r'; + return true; + } + break; + + case UFBXI_PARSE_CHANNEL: + if (name == ufbxi_Key) { + info->type = uc->opts.ignore_animation ? '-' : 'd'; + return true; + } + break; + + default: + if (name == ufbxi_BinaryData) { + info->type = uc->opts.ignore_embedded ? '-' : 'C'; + return true; + } + break; + + } + + return false; +} + +static ufbxi_noinline bool ufbxi_is_raw_string(ufbxi_context *uc, ufbxi_parse_state parent, const char *name, size_t index) +{ + (void)index; + + switch (parent) { + + case UFBXI_PARSE_ROOT: + if (name == ufbxi_Model) return true; + if (!strcmp(name, "FileId")) return true; + break; + + case UFBXI_PARSE_FBX_HEADER_EXTENSION: + if (name == ufbxi_SceneInfo) return true; + break; + + case UFBXI_PARSE_OBJECTS: + return true; + + case UFBXI_PARSE_CONNECTIONS: + case UFBXI_PARSE_RELATIONS: + // Pre-7000 needs raw strings for "Name\x00\x01Type" pairs, post-7000 uses it only + // for properties that are non-raw by default. + return uc->version < 7000; + + case UFBXI_PARSE_MODEL: + if (name == ufbxi_NodeAttributeName) return true; + if (name == ufbxi_Name) return true; + break; + + case UFBXI_PARSE_VIDEO: + if (name == ufbxi_Content) return true; + break; + + case UFBXI_PARSE_TEXTURE: + if (!strcmp(name, "TextureName")) return true; + if (!strcmp(name, "Media")) return true; + break; + + case UFBXI_PARSE_GEOMETRY: + if (name == ufbxi_NodeAttributeName) return true; + if (name == ufbxi_Name) return true; + break; + + case UFBXI_PARSE_NODE_ATTRIBUTE: + if (name == ufbxi_NodeAttributeName) return true; + if (name == ufbxi_Name) return true; + break; + + case UFBXI_PARSE_POSE_NODE: + if (name == ufbxi_Node) return true; + break; + + case UFBXI_PARSE_SELECTION_NODE: + if (name == ufbxi_Node) return true; + break; + + case UFBXI_PARSE_UNKNOWN_OBJECT: + if (name == ufbxi_NodeAttributeName) return true; + if (name == ufbxi_Name) return true; + break; + + case UFBXI_PARSE_COLLECTION: + if (!strcmp(name, "Member")) return true; + break; + + case UFBXI_PARSE_LEGACY_MODEL: + if (name == ufbxi_Material) return true; + if (name == ufbxi_Link) return true; + if (name == ufbxi_Name) return true; + break; + + case UFBXI_PARSE_LEGACY_SWITCHER: + if (!strcmp(name, "CameraIndexName")) return true; + break; + + case UFBXI_PARSE_LEGACY_SCENE_PERSISTENCE: + if (name == ufbxi_SceneInfo) return true; + break; + + case UFBXI_PARSE_REFERENCE: + if (!strcmp(name, "Object")) return true; + break; + + case UFBXI_PARSE_TAKE: + if (name == ufbxi_Model) return true; + break; + + default: + break; + + } + + return false; +} + +// -- Binary parsing + +ufbxi_nodiscard static ufbxi_noinline char *ufbxi_swap_endian(ufbxi_context *uc, const void *src, size_t count, size_t elem_size) +{ + size_t total_size = count * elem_size; + ufbxi_check_return(!ufbxi_does_overflow(total_size, count, elem_size), NULL); + if (uc->swap_arr_size < total_size) { + ufbxi_check_return(ufbxi_grow_array(&uc->ator_tmp, &uc->swap_arr, &uc->swap_arr_size, total_size), NULL); + } + char *dst = uc->swap_arr, *d = dst; + + const char *s = (const char*)src; + switch (elem_size) { + case 1: + for (size_t i = 0; i < count; i++) { + d[0] = s[0]; + d += 1; s += 1; + } + break; + case 2: + for (size_t i = 0; i < count; i++) { + d[0] = s[1]; d[1] = s[0]; + d += 2; s += 2; + } + break; + case 4: + for (size_t i = 0; i < count; i++) { + d[0] = s[3]; d[1] = s[2]; d[2] = s[1]; d[3] = s[0]; + d += 4; s += 4; + } + break; + case 8: + for (size_t i = 0; i < count; i++) { + d[0] = s[7]; d[1] = s[6]; d[2] = s[5]; d[3] = s[4]; + d[4] = s[3]; d[5] = s[2]; d[6] = s[1]; d[7] = s[0]; + d += 8; s += 8; + } + break; + default: + ufbx_assert(0 && "Bad endian swap size"); + } + + return dst; +} + +// Swap the endianness of an array typed with a lowercase letter +ufbxi_nodiscard static ufbxi_noinline const char *ufbxi_swap_endian_array(ufbxi_context *uc, const void *src, size_t count, char type) +{ + switch (type) { + case 'i': case 'f': return ufbxi_swap_endian(uc, src, count, 4); break; + case 'l': case 'd': return ufbxi_swap_endian(uc, src, count, 8); break; + default: return (const char*)src; + } +} + +// Swap the endianness of a single value (shallow, swaps string/array header words) +ufbxi_nodiscard static ufbxi_noinline const char *ufbxi_swap_endian_value(ufbxi_context *uc, const void *src, char type) +{ + switch (type) { + case 'Y': return ufbxi_swap_endian(uc, src, 1, 2); break; + case 'I': case 'F': return ufbxi_swap_endian(uc, src, 1, 4); break; + case 'L': case 'D': return ufbxi_swap_endian(uc, src, 1, 8); break; + case 'S': case 'R': return ufbxi_swap_endian(uc, src, 1, 4); break; + case 'i': case 'l': case 'f': case 'd': case 'b': return ufbxi_swap_endian(uc, src, 3, 4); break; + default: return (const char*)src; + } +} + +// Read and convert a post-7000 FBX data array into a different format. `src_type` may be equal to `dst_type` +// if the platform is not binary compatible with the FBX data representation. +ufbxi_nodiscard static ufbxi_noinline int ufbxi_binary_convert_array(ufbxi_context *uc, char src_type, char dst_type, const void *src, void *dst, size_t size) +{ + // TODO: We might want to use the slow path if the machine float/double doesn't match IEEE 754! + // Convert commented out lines under some `#if UFBX_NON_IEE754` define or something. + if (src_type == dst_type) { + src = ufbxi_swap_endian_array(uc, src, size, src_type); + ufbxi_check(src); + memcpy(dst, src, size * ufbxi_array_type_size(dst_type)); + return 1; + } + + if (uc->file_big_endian) { + src = ufbxi_swap_endian_array(uc, src, size, src_type); + ufbxi_check(src); + } + + switch (dst_type) + { + + #define ufbxi_convert_loop_fast(m_dst, m_cast, m_size, m_expr) { \ + const char *val = (const char*)src, *val_end = val + size*m_size; \ + m_dst *d = (m_dst*)dst; \ + while (val != val_end) { *d++ = m_cast(m_expr); val += m_size; } } + + #define ufbxi_convert_loop_slow(m_dst, m_cast, m_size, m_expr) { \ + const char *val = (const char*)src, *val_end = val + size*m_size; \ + m_dst *d = (m_dst*)dst; \ + ufbxi_nounroll while (val != val_end) { *d++ = m_cast(m_expr); val += m_size; } } + + case 'c': + switch (src_type) { + // case 'c': ufbxi_convert_loop_fast(char, (char), 1, *val != 0); break; + case 'i': ufbxi_convert_loop_slow(uint8_t, (uint8_t), 4, (uint8_t)ufbxi_read_i32(val)); break; + case 'l': ufbxi_convert_loop_slow(uint8_t, (uint8_t), 8, (uint8_t)ufbxi_read_i64(val)); break; + case 'f': ufbxi_convert_loop_slow(uint8_t, (uint8_t), 4, (uint8_t)ufbxi_read_f32(val)); break; + case 'd': ufbxi_convert_loop_slow(uint8_t, (uint8_t), 8, (uint8_t)ufbxi_read_f64(val)); break; + default: ufbxi_fail("Bad array source type"); + } + break; + + case 'i': + switch (src_type) { + case 'c': ufbxi_convert_loop_slow(int32_t, (int32_t), 1, *val); break; + // case 'i': ufbxi_convert_loop_slow(int32_t, (int32_t), 4, ufbxi_read_i32(val)); break; + case 'l': ufbxi_convert_loop_slow(int32_t, (int32_t), 8, ufbxi_read_i64(val)); break; + case 'f': ufbxi_convert_loop_slow(int32_t, ufbxi_f64_to_i32, 4, ufbxi_read_f32(val)); break; + case 'd': ufbxi_convert_loop_slow(int32_t, ufbxi_f64_to_i32, 8, ufbxi_read_f64(val)); break; + default: ufbxi_fail("Bad array source type"); + } + break; + + case 'l': + switch (src_type) { + case 'c': ufbxi_convert_loop_slow(int64_t, (int64_t), 1, *val); break; + case 'i': ufbxi_convert_loop_slow(int64_t, (int64_t), 4, ufbxi_read_i32(val)); break; + // case 'l': ufbxi_convert_loop_slow(int64_t, (int64_t), 8, ufbxi_read_i64(val)); break; + case 'f': ufbxi_convert_loop_slow(int64_t, ufbxi_f64_to_i64, 4, ufbxi_read_f32(val)); break; + case 'd': ufbxi_convert_loop_slow(int64_t, ufbxi_f64_to_i64, 8, ufbxi_read_f64(val)); break; + default: ufbxi_fail("Bad array source type"); + } + break; + + case 'f': + switch (src_type) { + case 'c': ufbxi_convert_loop_slow(float, (float), 1, *val); break; + case 'i': ufbxi_convert_loop_slow(float, (float), 4, ufbxi_read_i32(val)); break; + case 'l': ufbxi_convert_loop_slow(float, (float), 8, ufbxi_read_i64(val)); break; + // case 'f': ufbxi_convert_loop_slow(float, (float), 4, ufbxi_read_f32(val)); break; + case 'd': ufbxi_convert_loop_fast(float, (float), 8, ufbxi_read_f64(val)); break; + default: ufbxi_fail("Bad array source type"); + } + break; + + case 'd': + switch (src_type) { + case 'c': ufbxi_convert_loop_slow(double, (double), 1, *val); break; + case 'i': ufbxi_convert_loop_slow(double, (double), 4, ufbxi_read_i32(val)); break; + case 'l': ufbxi_convert_loop_slow(double, (double), 8, ufbxi_read_i64(val)); break; + case 'f': ufbxi_convert_loop_fast(double, (double), 4, ufbxi_read_f32(val)); break; + // case 'd': ufbxi_convert_loop_slow(double, (double), 8, ufbxi_read_f64(val)); break; + default: ufbxi_fail("Bad array source type"); + } + break; + + default: return 0; + + } + + return 1; +} + +// Read pre-7000 separate properties as an array. +ufbxi_nodiscard static ufbxi_noinline int ufbxi_binary_parse_multivalue_array(ufbxi_context *uc, char dst_type, void *dst, size_t size, ufbxi_buf *tmp_buf) +{ + if (size == 0) return 1; + const char *val; + size_t val_size; + + bool file_big_endian = uc->file_big_endian; + + #define ufbxi_convert_parse_fast(m_dst, m_type, m_expr) { \ + m_dst *d = (m_dst*)dst; \ + for (; base < size; base++) { \ + val = ufbxi_peek_bytes(uc, 13); \ + ufbxi_check(val); \ + if (*val != m_type) break; \ + val++; \ + *d++ = (m_dst)(m_expr); \ + ufbxi_consume_bytes(uc, 1 + sizeof(m_dst)); \ + } \ + } + + // String array special case + if (dst_type == 's' || dst_type == 'S' || dst_type == 'C') { + bool raw = dst_type == 's'; + ufbx_string *d = (ufbx_string*)dst; + for (size_t i = 0; i < size; i++) { + val = ufbxi_peek_bytes(uc, 13); + ufbxi_check(val); + char type = *val++; + ufbxi_check(type == 'S' || type == 'R'); + if (file_big_endian) { + val = ufbxi_swap_endian_value(uc, val, type); + ufbxi_check(val); + } + size_t len = ufbxi_read_u32(val); + ufbxi_consume_bytes(uc, 5); + d->data = ufbxi_read_bytes(uc, len); + d->length = len; + ufbxi_check(d->data); + if (dst_type == 'C') { + ufbxi_buf *buf = size == 1 || uc->opts.retain_dom ? &uc->result : tmp_buf; + d->data = ufbxi_push_copy(buf, char, len, d->data); + ufbxi_check(d->data); + } else { + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, d, raw)); + } + d++; + } + return 1; + } + + // Optimize a couple of common cases + size_t base = 0; + if (!file_big_endian) { + switch (dst_type) { + case 'i': ufbxi_convert_parse_fast(int32_t, 'I', ufbxi_read_i32(val)); break; + case 'l': ufbxi_convert_parse_fast(int64_t, 'L', ufbxi_read_i64(val)); break; + case 'f': ufbxi_convert_parse_fast(float, 'F', ufbxi_read_f32(val)); break; + case 'd': ufbxi_convert_parse_fast(double, 'D', ufbxi_read_f64(val)); break; + } + + // Early return if we handled everything + if (base == size) return 1; + } + + switch (dst_type) + { + + #define ufbxi_convert_parse(m_cast, m_size, m_expr) \ + *d++ = m_cast(m_expr); val_size = m_size + 1; \ + + #define ufbxi_convert_parse_switch(m_dst, m_cast_int, m_cast_float) { \ + m_dst *d = (m_dst*)dst + base; \ + for (size_t i = base; i < size; i++) { \ + val = ufbxi_peek_bytes(uc, 13); \ + ufbxi_check(val); \ + char type = *val++; \ + if (file_big_endian) { \ + val = ufbxi_swap_endian_value(uc, val, type); \ + ufbxi_check(val); \ + } \ + switch (type) { \ + case 'C': \ + case 'B': ufbxi_convert_parse(m_cast_int, 1, *val); break; \ + case 'Y': ufbxi_convert_parse(m_cast_int, 2, ufbxi_read_i16(val)); break; \ + case 'I': ufbxi_convert_parse(m_cast_int, 4, ufbxi_read_i32(val)); break; \ + case 'L': ufbxi_convert_parse(m_cast_int, 8, ufbxi_read_i64(val)); break; \ + case 'F': ufbxi_convert_parse(m_cast_float, 4, ufbxi_read_f32(val)); break; \ + case 'D': ufbxi_convert_parse(m_cast_float, 8, ufbxi_read_f64(val)); break; \ + default: ufbxi_fail("Bad multivalue array type"); \ + } \ + ufbxi_consume_bytes(uc, val_size); \ + } \ + } \ + + case 'c': ufbxi_convert_parse_switch(uint8_t, (uint8_t), (uint8_t)); break; + case 'i': ufbxi_convert_parse_switch(int32_t, (int32_t), ufbxi_f64_to_i32); break; + case 'l': ufbxi_convert_parse_switch(int64_t, (int64_t), ufbxi_f64_to_i64); break; + case 'f': ufbxi_convert_parse_switch(float, (float), (float)); break; + case 'd': ufbxi_convert_parse_switch(double, (double), (double)); break; + + default: return 0; + + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static void *ufbxi_push_array_data(ufbxi_context *uc, const ufbxi_array_info *info, size_t size, ufbxi_buf *tmp_buf) +{ + char type = ufbxi_normalize_array_type(info->type); + size_t elem_size = ufbxi_array_type_size(type); + uint32_t flags = info->flags; + if (flags & UFBXI_ARRAY_FLAG_PAD_BEGIN) size += 4; + + // The array may be pushed either to the result or temporary buffer depending + // if it's already in the right format + ufbxi_buf *arr_buf = tmp_buf; + if (flags & UFBXI_ARRAY_FLAG_RESULT) arr_buf = &uc->result; + else if (flags & UFBXI_ARRAY_FLAG_TMP_BUF) arr_buf = &uc->tmp; + char *data = (char*)ufbxi_push_size(arr_buf, elem_size, size); + ufbxi_check_return(data, NULL); + + if (flags & UFBXI_ARRAY_FLAG_PAD_BEGIN) { + memset(data, 0, elem_size * 4); + data += elem_size * 4; + } + + return data; +} + +// Recursion limited by check at the start +ufbxi_nodiscard ufbxi_noinline static int ufbxi_binary_parse_node(ufbxi_context *uc, uint32_t depth, ufbxi_parse_state parent_state, bool *p_end, ufbxi_buf *tmp_buf, bool recursive) + ufbxi_recursive_function(int, ufbxi_binary_parse_node, (uc, depth, parent_state, p_end, tmp_buf, recursive), UFBXI_MAX_NODE_DEPTH + 1, + (ufbxi_context *uc, uint32_t depth, ufbxi_parse_state parent_state, bool *p_end, ufbxi_buf *tmp_buf, bool recursive)) +{ + // https://code.blender.org/2013/08/fbx-binary-file-format-specification + // Parse an FBX document node in the binary format + ufbxi_check(depth < UFBXI_MAX_NODE_DEPTH); + + // Parse the node header, post-7500 versions use 64-bit values for most + // header fields. + uint64_t end_offset, num_values64, values_len; + uint8_t name_len; + size_t header_size = (uc->version >= 7500) ? 25 : 13; + const char *header = ufbxi_read_bytes(uc, header_size), *header_words = header; + ufbxi_check(header); + if (uc->version >= 7500) { + if (uc->file_big_endian) { + header_words = ufbxi_swap_endian(uc, header_words, 3, 8); + ufbxi_check(header_words); + } + end_offset = ufbxi_read_u64(header_words + 0); + num_values64 = ufbxi_read_u64(header_words + 8); + values_len = ufbxi_read_u64(header_words + 16); + name_len = ufbxi_read_u8(header + 24); + } else { + if (uc->file_big_endian) { + header_words = ufbxi_swap_endian(uc, header_words, 3, 4); + ufbxi_check(header_words); + } + end_offset = ufbxi_read_u32(header_words + 0); + num_values64 = ufbxi_read_u32(header_words + 4); + values_len = ufbxi_read_u32(header_words + 8); + name_len = ufbxi_read_u8(header + 12); + } + + ufbxi_check(num_values64 <= UINT32_MAX); + uint32_t num_values = (uint32_t)num_values64; + + // If `end_offset` and `name_len` is zero we treat as the node as a NULL-sentinel + // that terminates a node list. + if (end_offset == 0 && name_len == 0) { + *p_end = true; + return 1; + } + + // Update estimated end offset if possible + if (end_offset > uc->progress_bytes_total) { + uc->progress_bytes_total = end_offset; + } + + // Push the parsed node into the `tmp_stack` buffer, the nodes will be popped by + // calling code after its done parsing all of it's children. + ufbxi_node *node = ufbxi_push_zero(&uc->tmp_stack, ufbxi_node, 1); + ufbxi_check(node); + + // Parse and intern the name to the string pool. + const char *name = ufbxi_read_bytes(uc, name_len); + ufbxi_check(name); + name = ufbxi_push_string(&uc->string_pool, name, name_len, NULL, true); + ufbxi_check(name); + node->name_len = name_len; + node->name = name; + + uint64_t values_end_offset = ufbxi_get_read_offset(uc) + values_len; + + // Check if the values of the node we're parsing currently should be + // treated as an array. + ufbxi_array_info arr_info; + if (ufbxi_is_array_node(uc, parent_state, name, &arr_info)) { + + // Normalize the array type (eg. 'r' to 'f'/'d' depending on the build) + // and get the per-element size of the array. + char dst_type = ufbxi_normalize_array_type(arr_info.type); + + ufbxi_value_array *arr = ufbxi_push(tmp_buf, ufbxi_value_array, 1); + ufbxi_check(arr); + + node->value_type_mask = UFBXI_VALUE_ARRAY; + node->array = arr; + arr->type = dst_type; + + // Peek the first bytes of the array. We can always look at least 13 bytes + // ahead safely as valid FBX files must end in a 13/25 byte NULL record. + const char *data = ufbxi_peek_bytes(uc, 13); + ufbxi_check(data); + + // Check if the data type is one of the explicit array types (post-7000). + // Otherwise we form the array by concatenating all the normal values of the + // node (pre-7000) + char c = data[0]; + + // HACK: Override the "type" if either the array is empty or we want to + // specifically ignore the contents. + if (num_values == 0) c = '0'; + if (dst_type == '-') c = '-'; + + if (c=='c' || c=='b' || c=='i' || c=='l' || c =='f' || c=='d') { + + const char *arr_words = data + 1; + if (uc->file_big_endian) { + arr_words = ufbxi_swap_endian(uc, arr_words, 3, 4); + ufbxi_check(arr_words); + } + + // Parse the array header from the prefix we already peeked above. + char src_type = data[0]; + uint32_t size = ufbxi_read_u32(arr_words + 0); + uint32_t encoding = ufbxi_read_u32(arr_words + 4); + uint32_t encoded_size = ufbxi_read_u32(arr_words + 8); + ufbxi_consume_bytes(uc, 13); + + // Normalize the source type as well, but don't convert UFBX-specific + // 'r' to 'f'/'d', but fail later instead. + if (src_type != 'r') src_type = ufbxi_normalize_array_type(src_type); + size_t src_elem_size = ufbxi_array_type_size(src_type); + size_t decoded_data_size = src_elem_size * size; + + // Allocate `size` elements for the array. + char *arr_data = (char*)ufbxi_push_array_data(uc, &arr_info, size, tmp_buf); + ufbxi_check(arr_data); + + // If the source and destination types are equal and our build is binary-compatible + // with the FBX format we can read the decoded data directly into the array buffer. + // Otherwise we need a temporary buffer to decode the array into before conversion. + void *decoded_data = arr_data; + if (src_type != dst_type || uc->local_big_endian != uc->file_big_endian) { + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, decoded_data_size)); + decoded_data = uc->tmp_arr; + } + + uint64_t arr_begin = ufbxi_get_read_offset(uc); + ufbxi_check(UINT64_MAX - encoded_size > arr_begin); + uint64_t arr_end = arr_begin + encoded_size; + if (arr_end > uc->progress_bytes_total) { + uc->progress_bytes_total = arr_end; + } + + if (encoding == 0) { + // Encoding 0: Plain binary data. + ufbxi_check(encoded_size == decoded_data_size); + + // If the array is contained in the current read buffer and we need to convert + // the data anyway we can use the read buffer as the decoded array source, otherwise + // do a plain byte copy to the array/conversion buffer. + if (uc->yield_size + uc->data_size >= encoded_size && decoded_data != arr_data) { + // Yield right after this if we crossed the yield threshold + if (encoded_size > uc->yield_size) { + uc->data_size += uc->yield_size; + uc->yield_size = encoded_size; + uc->data_size -= uc->yield_size; + } + + decoded_data = (void*)uc->data; + ufbxi_consume_bytes(uc, encoded_size); + } else { + ufbxi_check(ufbxi_read_to(uc, decoded_data, encoded_size)); + } + } else if (encoding == 1) { + // Encoding 1: DEFLATE + + ufbxi_pause_progress(uc); + + // Inflate the data from the user-provided IO buffer / read callbacks + ufbx_inflate_input input; + input.total_size = encoded_size; + input.data = uc->data; + input.data_size = uc->data_size; + input.no_header = false; + input.no_checksum = false; + input.internal_fast_bits = 0; + + if (uc->opts.progress_cb.fn) { + input.progress_cb = uc->opts.progress_cb; + input.progress_size_before = arr_begin; + input.progress_size_after = uc->progress_bytes_total - arr_end; + input.progress_interval_hint = uc->progress_interval; + } else { + input.progress_cb.fn = NULL; + input.progress_cb.user = NULL; + input.progress_size_before = 0; + input.progress_size_after = 0; + input.progress_interval_hint = 0; + } + + // If the encoded array is larger than the data we have currently buffered + // we need to allow `ufbx_inflate()` to read from the IO callback. We can + // let `ufbx_inflate()` freely clobber our `read_buffer` as all the data + // in the buffer will be consumed. `ufbx_inflate()` always reads exactly + // the amount of bytes needed so we can continue reading from `read_fn` as + // usual (given that we clear the `uc->data/_size` buffer below). + // NOTE: We _cannot_ share `read_buffer` if we plan to read later from it + // as `ufbx_inflate()` overwrites parts of it with zeroes. + if (encoded_size > input.data_size) { + input.buffer = uc->read_buffer; + input.buffer_size = uc->read_buffer_size; + input.read_fn = uc->read_fn; + input.read_user = uc->read_user; + uc->data_offset += encoded_size - input.data_size; + uc->data += input.data_size; + uc->data_size = 0; + } else { + input.buffer = NULL; + input.buffer_size = 0; + input.read_fn = NULL; + input.read_user = 0; + uc->data += encoded_size; + uc->data_size -= encoded_size; + ufbxi_check(ufbxi_resume_progress(uc)); + } + + ptrdiff_t res = ufbx_inflate(decoded_data, decoded_data_size, &input, uc->inflate_retain); + ufbxi_check_msg(res != -28, "Cancelled"); + ufbxi_check_msg(res == (ptrdiff_t)decoded_data_size, "Bad DEFLATE data"); + + } else { + ufbxi_fail("Bad array encoding"); + } + + // Convert the decoded array if necessary. + if (decoded_data != arr_data) { + ufbxi_check(ufbxi_binary_convert_array(uc, src_type, dst_type, decoded_data, arr_data, size)); + } + + arr->data = arr_data; + arr->size = size; + + } else if (c == '0' || c == '-') { + // Ignore the array + arr->type = c == '-' ? '-' : dst_type; + arr->data = (char*)ufbxi_zero_size_buffer + 32; + arr->size = 0; + } else { + // Allocate `num_values` elements for the array and parse single values into it. + char *arr_data = (char*)ufbxi_push_array_data(uc, &arr_info, num_values, tmp_buf); + ufbxi_check(arr_data); + ufbxi_check(ufbxi_binary_parse_multivalue_array(uc, dst_type, arr_data, num_values, tmp_buf)); + arr->data = arr_data; + arr->size = num_values; + } + + // Post-process boolean arrays + if (arr_info.type == 'b') { + ufbxi_for(char, b, (char*)arr->data, arr->size) { + *b = (char)(*b != 0); + } + } + + } else { + // Parse up to UFBXI_MAX_NON_ARRAY_VALUES as plain values + num_values = ufbxi_min32(num_values, UFBXI_MAX_NON_ARRAY_VALUES); + ufbxi_value *vals = ufbxi_push(tmp_buf, ufbxi_value, num_values); + ufbxi_check(vals); + node->vals = vals; + + uint32_t type_mask = 0; + for (size_t i = 0; i < (size_t)num_values; i++) { + // The file must end in a 13/25 byte NULL record, so we can peek + // up to 13 bytes safely here. + const char *data = ufbxi_peek_bytes(uc, 13); + ufbxi_check(data); + + const char *value = data + 1; + + char type = data[0]; + if (uc->file_big_endian) { + value = ufbxi_swap_endian_value(uc, value, type); + ufbxi_check(value); + } + + switch (type) { + + case 'C': case 'B': + type_mask |= (uint32_t)UFBXI_VALUE_NUMBER << (i*2); + vals[i].f = (double)(vals[i].i = (int64_t)value[0]); + ufbxi_consume_bytes(uc, 2); + break; + + case 'Y': + type_mask |= (uint32_t)UFBXI_VALUE_NUMBER << (i*2); + vals[i].f = (double)(vals[i].i = ufbxi_read_i16(value)); + ufbxi_consume_bytes(uc, 3); + break; + + case 'I': + type_mask |= (uint32_t)UFBXI_VALUE_NUMBER << (i*2); + vals[i].f = (double)(vals[i].i = ufbxi_read_i32(value)); + ufbxi_consume_bytes(uc, 5); + break; + + case 'L': + type_mask |= (uint32_t)UFBXI_VALUE_NUMBER << (i*2); + vals[i].f = (double)(vals[i].i = ufbxi_read_i64(value)); + ufbxi_consume_bytes(uc, 9); + break; + + case 'F': + type_mask |= (uint32_t)UFBXI_VALUE_NUMBER << (i*2); + vals[i].i = ufbxi_f64_to_i64(vals[i].f = ufbxi_read_f32(value)); + ufbxi_consume_bytes(uc, 5); + break; + + case 'D': + type_mask |= (uint32_t)UFBXI_VALUE_NUMBER << (i*2); + vals[i].i = ufbxi_f64_to_i64(vals[i].f = ufbxi_read_f64(value)); + ufbxi_consume_bytes(uc, 9); + break; + + case 'S': case 'R': + { + uint32_t length = ufbxi_read_u32(value); + ufbxi_consume_bytes(uc, 5); + const char *str = ufbxi_read_bytes(uc, length); + ufbxi_check(str); + + if (length == 0) { + vals[i].s.raw_data = ufbxi_empty_char; + vals[i].s.raw_length = 0; + vals[i].s.utf8_length = 0; + } else { + bool non_ascii = false; + uint32_t hash = ufbxi_hash_string_check_ascii(str, length, &non_ascii); + bool raw = !non_ascii || ufbxi_is_raw_string(uc, parent_state, name, i); + ufbxi_check(ufbxi_push_sanitized_string(&uc->string_pool, &vals[i].s, str, length, hash, raw)); + + // Mark the data as invalid UTF-8 + if (non_ascii && raw) vals[i].s.utf8_length = UINT32_MAX; + } + + type_mask |= (uint32_t)UFBXI_VALUE_STRING << (i*2); + } + break; + + // Treat arrays as non-values and skip them + case 'c': case 'b': case 'i': case 'l': case 'f': case 'd': + { + uint32_t encoded_size = ufbxi_read_u32(value + 8); + ufbxi_consume_bytes(uc, 13); + ufbxi_check(ufbxi_skip_bytes(uc, encoded_size)); + } + break; + + default: + ufbxi_fail("Bad value type"); + + } + } + + node->value_type_mask = (uint16_t)type_mask; + } + + // Skip over remaining values if necessary if we for example truncated + // the list of values or if there are values after an array + uint64_t offset = ufbxi_get_read_offset(uc); + ufbxi_check(offset <= values_end_offset); + if (offset < values_end_offset) { + ufbxi_check(ufbxi_skip_bytes(uc, values_end_offset - offset)); + } + + if (recursive) { + // Recursively parse the children of this node. Update the parse state + // to provide context for child node parsing. + ufbxi_parse_state parse_state = ufbxi_update_parse_state(parent_state, node->name); + uint32_t num_children = 0; + for (;;) { + // Stop at end offset + uint64_t current_offset = ufbxi_get_read_offset(uc); + if (current_offset >= end_offset) { + ufbxi_check(current_offset == end_offset || end_offset == 0); + break; + } + + bool end = false; + ufbxi_check(ufbxi_binary_parse_node(uc, depth + 1, parse_state, &end, tmp_buf, true)); + if (end) break; + num_children++; + } + + // Pop children from `tmp_stack` to a contiguous array + node->num_children = num_children; + if (num_children > 0) { + node->children = ufbxi_push_pop(tmp_buf, &uc->tmp_stack, ufbxi_node, num_children); + ufbxi_check(node->children); + } + } else { + uint64_t current_offset = ufbxi_get_read_offset(uc); + uc->has_next_child = (current_offset < end_offset); + } + + return 1; +} + +#define UFBXI_BINARY_MAGIC_SIZE 22 +#define UFBXI_BINARY_HEADER_SIZE 27 +static const char ufbxi_binary_magic[] = "Kaydara FBX Binary \x00\x1a"; + +// -- ASCII parsing + +#define UFBXI_ASCII_END '\0' +#define UFBXI_ASCII_NAME 'N' +#define UFBXI_ASCII_BARE_WORD 'B' +#define UFBXI_ASCII_INT 'I' +#define UFBXI_ASCII_FLOAT 'F' +#define UFBXI_ASCII_STRING 'S' + +static ufbxi_noinline char ufbxi_ascii_refill(ufbxi_context *uc) +{ + ufbxi_ascii *ua = &uc->ascii; + uc->data_offset += ufbxi_to_size(ua->src - uc->data_begin); + if (uc->read_fn) { + // Grow the read buffer if necessary + if (uc->read_buffer_size < uc->opts.read_buffer_size) { + size_t new_size = uc->opts.read_buffer_size; + ufbxi_check_return(ufbxi_grow_array(&uc->ator_tmp, &uc->read_buffer, &uc->read_buffer_size, new_size), '\0'); + } + + // Read user data, return '\0' on EOF + size_t num_read = uc->read_fn(uc->read_user, uc->read_buffer, uc->read_buffer_size); + ufbxi_check_return_msg(num_read != SIZE_MAX, '\0', "IO error"); + ufbxi_check_return(num_read <= uc->read_buffer_size, '\0'); + if (num_read == 0) return '\0'; + + uc->data = uc->data_begin = ua->src = uc->read_buffer; + ua->src_end = uc->read_buffer + num_read; + return *ua->src; + } else { + // If the user didn't specify a `read_fn()` treat anything + // past the initial data buffer as EOF. + uc->data = uc->data_begin = ua->src = ""; + ua->src_end = ua->src + 1; + return '\0'; + } +} + +static ufbxi_noinline char ufbxi_ascii_yield(ufbxi_context *uc) +{ + ufbxi_ascii *ua = &uc->ascii; + + char ret; + if (ua->src == ua->src_end) { + ret = ufbxi_ascii_refill(uc); + } else { + ret = *ua->src; + } + + if (ufbxi_to_size(ua->src_end - ua->src) < uc->progress_interval) { + ua->src_yield = ua->src_end; + } else { + ua->src_yield = ua->src + uc->progress_interval; + } + + // TODO: Unify these properly + uc->data = ua->src; + ufbxi_check_return(ufbxi_report_progress(uc), '\0'); + return ret; +} + +static ufbxi_forceinline char ufbxi_ascii_peek(ufbxi_context *uc) +{ + ufbxi_ascii *ua = &uc->ascii; + if (ua->src == ua->src_yield) return ufbxi_ascii_yield(uc); + return *ua->src; +} + +static ufbxi_forceinline char ufbxi_ascii_next(ufbxi_context *uc) +{ + ufbxi_ascii *ua = &uc->ascii; + if (ua->src == ua->src_yield) return ufbxi_ascii_yield(uc); + ua->src++; + if (ua->src == ua->src_yield) return ufbxi_ascii_yield(uc); + return *ua->src; +} + +static ufbxi_noinline uint32_t ufbxi_ascii_parse_version(ufbxi_context *uc) +{ + uint8_t digits[3]; + uint32_t num_digits = 0; + + char c = ufbxi_ascii_next(uc); + + const char fmt[] = " FBX ?.?.?"; + uint32_t ix = 0; + while (num_digits < 3) { + char ref = fmt[ix++]; + switch (ref) { + + // Digit + case '?': + if (c < '0' || c > '9') return 0; + digits[num_digits++] = (uint8_t)(c - '0'); + c = ufbxi_ascii_next(uc); + break; + + // Whitespace + case ' ': + while (c == ' ' || c == '\t') { + c = ufbxi_ascii_next(uc); + } + break; + + // Literal character + default: + if (c != ref) return 0; + c = ufbxi_ascii_next(uc); + break; + } + } + + if (num_digits != 3) return 0; + return 1000u*(uint32_t)digits[0] + 100u*(uint32_t)digits[1] + 10u*(uint32_t)digits[2]; +} + +static const uint32_t ufbxi_space_mask = + (1u << ((uint32_t)' ' - 1)) | + (1u << ((uint32_t)'\t' - 1)) | + (1u << ((uint32_t)'\r' - 1)) | + (1u << ((uint32_t)'\n' - 1)) ; + +ufbx_static_assert(space_codepoint, + (uint32_t)' ' <= 32u && (uint32_t)'\t' <= 32u && + (uint32_t)'\r' <= 32u && (uint32_t)'\n' <= 32u); + +static ufbxi_forceinline bool ufbxi_is_space(char c) +{ + uint32_t v = (uint32_t)(uint8_t)c - 1; + return v < 32 && ((ufbxi_space_mask >> v) & 0x1) != 0; +} + +static ufbxi_noinline char ufbxi_ascii_skip_whitespace(ufbxi_context *uc) +{ + ufbxi_ascii *ua = &uc->ascii; + + // Ignore whitespace + char c = ufbxi_ascii_peek(uc); + for (;;) { + while (ufbxi_is_space(c)) { + c = ufbxi_ascii_next(uc); + } + + // Line comment + if (c == ';') { + + bool read_magic = false; + // FBX ASCII files begin with a magic comment of form "; FBX 7.7.0 project file" + // Try to extract the version number from the magic comment + if (!ua->read_first_comment) { + ua->read_first_comment = true; + uint32_t version = ufbxi_ascii_parse_version(uc); + if (version) { + uc->version = version; + ua->found_version = true; + read_magic = true; + } + } + + c = ufbxi_ascii_next(uc); + while (c != '\n' && c != '\0') { + c = ufbxi_ascii_next(uc); + } + c = ufbxi_ascii_next(uc); + + // Try to determine if this is a Blender 6100 ASCII file + if (read_magic) { + if (c == ';') { + char line[32]; + size_t line_len = 0; + + c = ufbxi_ascii_next(uc); + while (c != '\n' && c != '\0') { + if (line_len < sizeof(line)) { + line[line_len++] = c; + } + c = ufbxi_ascii_next(uc); + } + + if (line_len >= 19 && !memcmp(line, " Created by Blender", 19)) { + uc->exporter = UFBX_EXPORTER_BLENDER_ASCII; + } + } + } + + } else { + break; + } + } + return c; +} + +ufbxi_nodiscard static ufbxi_forceinline int ufbxi_ascii_push_token_char(ufbxi_context *uc, ufbxi_ascii_token *token, char c) +{ + // Grow the string data buffer if necessary + if (token->str_len == token->str_cap) { + size_t len = ufbxi_max_sz(token->str_len + 1, 256); + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &token->str_data, &token->str_cap, len)); + } + + token->str_data[token->str_len++] = c; + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_ascii_skip_until(ufbxi_context *uc, char dst) +{ + ufbxi_ascii *ua = &uc->ascii; + + for (;;) { + size_t buffered = ufbxi_to_size(ua->src_yield - ua->src); + const char *match = (const char*)memchr(ua->src, dst, buffered); + if (match) { + ua->src = match; + break; + } else { + ua->src += buffered; + } + if (buffered == 0) { + char c = ufbxi_ascii_yield(uc); + ufbxi_check(c != '\0'); + } + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_ascii_try_ignore_string(ufbxi_context *uc, ufbxi_ascii_token *token) +{ + ufbxi_ascii *ua = &uc->ascii; + + char c = ufbxi_ascii_skip_whitespace(uc); + token->str_len = 0; + + if (c == '"') { + // Replace `prev_token` with `token` but swap the buffers so `token` uses + // the now-unused string buffer of the old `prev_token`. + char *swap_data = ua->prev_token.str_data; + size_t swap_cap = ua->prev_token.str_cap; + ua->prev_token = ua->token; + ua->token.str_data = swap_data; + ua->token.str_cap = swap_cap; + + token->type = UFBXI_ASCII_STRING; + // Skip opening quote + ufbxi_ascii_next(uc); + ufbxi_check(ufbxi_ascii_skip_until(uc, '"')); + // Skip closing quote + ufbxi_ascii_next(uc); + return true; + } + + return false; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_ascii_next_token(ufbxi_context *uc, ufbxi_ascii_token *token) +{ + ufbxi_ascii *ua = &uc->ascii; + + // Replace `prev_token` with `token` but swap the buffers so `token` uses + // the now-unused string buffer of the old `prev_token`. + char *swap_data = ua->prev_token.str_data; + size_t swap_cap = ua->prev_token.str_cap; + ua->prev_token = ua->token; + ua->token.str_data = swap_data; + ua->token.str_cap = swap_cap; + + char c = ufbxi_ascii_skip_whitespace(uc); + token->str_len = 0; + + if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_') { + token->type = UFBXI_ASCII_BARE_WORD; + while ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') + || (c >= '0' && c <= '9') || c == '_') { + ufbxi_check(ufbxi_ascii_push_token_char(uc, token, c)); + c = ufbxi_ascii_next(uc); + } + + // Skip whitespace to find if there's a following ':' + c = ufbxi_ascii_skip_whitespace(uc); + if (c == ':') { + token->value.name_len = token->str_len; + token->type = UFBXI_ASCII_NAME; + ufbxi_ascii_next(uc); + } + } else if ((c >= '0' && c <= '9') || c == '-' || c == '+' || c == '.') { + token->type = UFBXI_ASCII_INT; + + token->negative = c == '-'; + while ((c >= '0' && c <= '9') || c == '-' || c == '+' || c == '.' || c == 'e' || c == 'E') { + if (c == '.' || c == 'e' || c == 'E') { + token->type = UFBXI_ASCII_FLOAT; + } + ufbxi_check(ufbxi_ascii_push_token_char(uc, token, c)); + c = ufbxi_ascii_next(uc); + } + + if (c == '#') { + ufbxi_check(token->type == UFBXI_ASCII_FLOAT); + ufbxi_check(ufbxi_ascii_push_token_char(uc, token, c)); + c = ufbxi_ascii_next(uc); + + bool is_inf = c == 'I' || c == 'i'; + while ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) { + ufbxi_check(ufbxi_ascii_push_token_char(uc, token, c)); + c = ufbxi_ascii_next(uc); + } + ufbxi_check(ufbxi_ascii_push_token_char(uc, token, '\0')); + + if (is_inf) { + token->value.f64 = token->str_data[0] == '-' ? -UFBX_INFINITY : UFBX_INFINITY; + } else { + token->value.f64 = UFBX_NAN; + } + + } else { + ufbxi_check(ufbxi_ascii_push_token_char(uc, token, '\0')); + + char *end; + if (token->type == UFBXI_ASCII_INT) { + // TODO: Custom parsing is probably better? + token->value.i64 = strtoll(token->str_data, &end, 10); + ufbxi_check(end == token->str_data + token->str_len - 1); + } else if (token->type == UFBXI_ASCII_FLOAT) { + if (ua->parse_as_f32) { + token->value.f64 = strtof(token->str_data, &end); + } else { + token->value.f64 = ufbxi_parse_double(token->str_data, token->str_len, &end, false); + } + ufbxi_check(end == token->str_data + token->str_len - 1); + } + } + } else if (c == '"') { + token->type = UFBXI_ASCII_STRING; + c = ufbxi_ascii_next(uc); + while (c != '"') { + + // Escape XML-like elements, funny enough there is no way to escape '&' itself, there is no `&`. + // '"' -> '"' + // '&cr;' -> '\r' + // '&lf;' -> '\n' + if (c == '&') { + const char *entity = NULL; + char replacement = '\0'; + + c = ufbxi_ascii_next(uc); + switch (c) { + case 'q': + entity = """; + replacement = '"'; + break; + case 'c': + entity = "&cr;"; + replacement = '\r'; + break; + case 'l': + entity = "&lf;"; + replacement = '\n'; + break; + default: + // As '&' is not escaped in any way just map '&' -> '&' + entity = "&"; + replacement = '&'; + break; + } + + size_t step = 1; + + ufbxi_dev_assert(entity && *entity); + // `entity` is a NULL terminated string longer than a single character + // cppcheck-suppress arrayIndexOutOfBounds + for (; entity[step]; step++) { + if (c != entity[step]) break; + c = ufbxi_ascii_next(uc); + } + + if (entity[step] == '\0') { + // Full match: Push the replacement character + ufbxi_check(ufbxi_ascii_push_token_char(uc, token, replacement)); + } else { + // Partial match: Push the prefix we have skipped already + for (size_t i = 0; i < step; i++) { + ufbxi_check(ufbxi_ascii_push_token_char(uc, token, entity[i])); + } + } + continue; + } + + ufbxi_check(c != '\0'); + ufbxi_check(ufbxi_ascii_push_token_char(uc, token, c)); + c = ufbxi_ascii_next(uc); + } + // Skip closing quote + ufbxi_ascii_next(uc); + } else { + // Single character token + token->type = c; + ufbxi_ascii_next(uc); + } + + return 1; +} + +ufbxi_nodiscard static int ufbxi_ascii_accept(ufbxi_context *uc, char type) +{ + ufbxi_ascii *ua = &uc->ascii; + + if (ua->token.type == type) { + ufbxi_check(ufbxi_ascii_next_token(uc, &ua->token)); + return 1; + } else { + return 0; + } +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_ascii_read_int_array(ufbxi_context *uc, char type, size_t *p_num_read) +{ + ufbxi_ascii *ua = &uc->ascii; + if (ua->parse_as_f32) return 1; + size_t initial_items = uc->tmp_stack.num_items; + + int64_t val; + if (ua->token.type == UFBXI_ASCII_INT) { + val = ua->token.value.i64; + } else { + return 1; + } + + const char *src = ua->src; + const char *end = ua->src_yield; + const char *src_scan = src; + + for (;;) { + + // Skip '\s*,\s*' between array elements. If we don't find a comma after an element + // don't push it as we can't be 100% certain whether it's a part of the array. + while (src_scan != end && ufbxi_is_space(*src_scan)) src_scan++; + if (src_scan == end || *src_scan != ',') break; + src_scan++; + while (src_scan != end && ufbxi_is_space(*src_scan)) src_scan++; + + // Found comma, commit to the position and push the previous value to the array + src = src_scan; + if (type == 'i') { + int32_t *v = ufbxi_push_fast(&uc->tmp_stack, int32_t, 1); + ufbxi_check(v); + *v = (int32_t)val; + } else if (type == 'l') { + int64_t *v = ufbxi_push_fast(&uc->tmp_stack, int64_t, 1); + ufbxi_check(v); + *v = (int64_t)val; + } + + // Try to parse the next value, we don't commit this until we find a comma after it above. + size_t left = ufbxi_to_size(end - src_scan); + if (left < 32) break; + + uint64_t abs_val = 0; + bool negative = *src_scan == '-'; + + size_t init_len = negative ? 1 : 0; + size_t len = init_len; + for (; len < 20; len++) { + char c = src_scan[len]; + if (!(c >= '0' && c <= '9')) break; + abs_val = 10 * abs_val + (uint64_t)(c - '0'); + } + if (len == 20 || len == init_len) break; + + // TODO: Do we want to wrap here? + val = negative ? -(int64_t)abs_val : (int64_t)abs_val; + src_scan += len; + } + + // Resume conventional parsing if we moved `src`. + if (src != ua->src) { + ua->src = src; + ufbxi_check(ufbxi_ascii_next_token(uc, &ua->token)); + } + + *p_num_read = uc->tmp_stack.num_items - initial_items; + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_ascii_read_float_array(ufbxi_context *uc, char type, size_t *p_num_read) +{ + ufbxi_ascii *ua = &uc->ascii; + if (ua->parse_as_f32) return 1; + size_t initial_items = uc->tmp_stack.num_items; + + double val; + if (ua->token.type == UFBXI_ASCII_FLOAT) { + val = ua->token.value.f64; + } else if (ua->token.type == UFBXI_ASCII_INT) { + double fsign = !ua->token.value.i64 && ua->token.negative ? -1.0 : 1.0; + val = (double)ua->token.value.i64 * fsign; + } else { + return 1; + } + + const char *src = ua->src; + const char *end = ua->src_yield; + const char *src_scan = src; + + for (;;) { + + // Skip '\s*,\s*' between array elements. If we don't find a comma after an element + // don't push it as we can't be 100% certain whether it's a part of the array. + while (src_scan != end && ufbxi_is_space(*src_scan)) src_scan++; + if (src_scan == end || *src_scan != ',') break; + src_scan++; + while (src_scan != end && ufbxi_is_space(*src_scan)) src_scan++; + + // Found comma, commit to the position and push the previous value to the array + src = src_scan; + if (type == 'd') { + double *v = ufbxi_push_fast(&uc->tmp_stack, double, 1); + ufbxi_check(v); + *v = (double)val; + } else if (type == 'f') { + float *v = ufbxi_push_fast(&uc->tmp_stack, float, 1); + ufbxi_check(v); + *v = (float)val; + } + + // Try to parse the next value, we don't commit this until we find a comma after it above. + char *num_end = NULL; + size_t left = ufbxi_to_size(end - src_scan); + if (left < 64) break; + val = ufbxi_parse_double(src_scan, left - 2, &num_end, true); + if (!num_end || num_end == src_scan) { + break; + } + + src_scan = num_end; + } + + // Resume conventional parsing if we moved `src`. + if (src != ua->src) { + ua->src = src; + ufbxi_check(ufbxi_ascii_next_token(uc, &ua->token)); + } + + *p_num_read = uc->tmp_stack.num_items - initial_items; + return 1; +} + +// Recursion limited by check at the start +ufbxi_nodiscard ufbxi_noinline static int ufbxi_ascii_parse_node(ufbxi_context *uc, uint32_t depth, ufbxi_parse_state parent_state, bool *p_end, ufbxi_buf *tmp_buf, bool recursive) + ufbxi_recursive_function(int, ufbxi_ascii_parse_node, (uc, depth, parent_state, p_end, tmp_buf, recursive), UFBXI_MAX_NODE_DEPTH + 1, + (ufbxi_context *uc, uint32_t depth, ufbxi_parse_state parent_state, bool *p_end, ufbxi_buf *tmp_buf, bool recursive)) +{ + ufbxi_ascii *ua = &uc->ascii; + + if (ua->token.type == '}') { + ufbxi_check(ufbxi_ascii_next_token(uc, &ua->token)); + *p_end = true; + return 1; + } + + if (ua->token.type == UFBXI_ASCII_END) { + ufbxi_check_msg(depth == 0, "Truncated file"); + *p_end = true; + return 1; + } + + // Parse the name eg. "Node:" token and intern the name + ufbxi_check(depth < UFBXI_MAX_NODE_DEPTH); + if (!uc->sure_fbx && depth == 0 && ua->token.type != UFBXI_ASCII_NAME) { + ufbxi_fail_msg("Expected a 'Name:' token", "Not an FBX file"); + } + ufbxi_check(ufbxi_ascii_accept(uc, UFBXI_ASCII_NAME)); + size_t name_len = ua->prev_token.value.name_len; + ufbxi_check(name_len <= 0xff); + const char *name = ufbxi_push_string(&uc->string_pool, ua->prev_token.str_data, ua->prev_token.str_len, NULL, true); + ufbxi_check(name); + + // Push the parsed node into the `tmp_stack` buffer, the nodes will be popped by + // calling code after its done parsing all of it's children. + ufbxi_node *node = ufbxi_push_zero(&uc->tmp_stack, ufbxi_node, 1); + ufbxi_check(node); + node->name = name; + node->name_len = (uint8_t)name_len; + + bool in_ascii_array = false; + + uint32_t num_values = 0; + uint32_t type_mask = 0; + + int arr_type = 0; + ufbxi_buf *arr_buf = NULL; + size_t arr_elem_size = 0; + + // Check if the values of the node we're parsing currently should be + // treated as an array. + ufbxi_array_info arr_info; + if (ufbxi_is_array_node(uc, parent_state, name, &arr_info)) { + uint32_t flags = arr_info.flags; + arr_type = ufbxi_normalize_array_type(arr_info.type); + arr_buf = tmp_buf; + if (flags & UFBXI_ARRAY_FLAG_RESULT) arr_buf = &uc->result; + else if (flags & UFBXI_ARRAY_FLAG_TMP_BUF) arr_buf = &uc->tmp; + + ufbxi_value_array *arr = ufbxi_push(tmp_buf, ufbxi_value_array, 1); + ufbxi_check(arr); + node->value_type_mask = UFBXI_VALUE_ARRAY; + node->array = arr; + arr->type = (char)arr_type; + + // Parse array values using strtof() if the array destination is 32-bit float + // since KeyAttrDataFloat packs integer data (!) into floating point values so we + // should try to be as exact as possible. + if (arr_info.flags & UFBXI_ARRAY_FLAG_ACCURATE_F32) { + ua->parse_as_f32 = true; + } + + arr_elem_size = ufbxi_array_type_size((char)arr_type); + + if (arr_type != '-') { + // Force alignment for array contents: This allows us to use `ufbxi_push_fast()` + // in fast parsing functions. + ufbxi_check(ufbxi_push_size_zero(&uc->tmp_stack, 8, 1)); + + // Pad with 4 zero elements to make indexing with `-1` safe. + if ((flags & UFBXI_ARRAY_FLAG_PAD_BEGIN) != 0) { + ufbxi_check(ufbxi_push_size_zero(&uc->tmp_stack, arr_elem_size, 4)); + num_values += 4; + } + } + } + + // Some fields in ASCII may have leading commas eg. `Content: , "base64-string"` + if (ua->token.type == ',') { + // HACK: If we are parsing an "array" that should be ignored, ie. `Content` when + // `opts.ignore_embedded == true` try to skip the next token string if possible. + if (arr_type == '-') { + if (!ufbxi_ascii_try_ignore_string(uc, &ua->token)) { + ufbxi_check(ufbxi_ascii_next_token(uc, &ua->token)); + } + } else { + ufbxi_check(ufbxi_ascii_next_token(uc, &ua->token)); + } + } + + ufbxi_parse_state parse_state = ufbxi_update_parse_state(parent_state, node->name); + ufbxi_value vals[UFBXI_MAX_NON_ARRAY_VALUES]; + + // NOTE: Infinite loop to allow skipping the comma parsing via `continue`. + for (;;) { + ufbxi_ascii_token *tok = &ua->prev_token; + + if (arr_type) { + size_t num_read = 0; + if (arr_type == 'f' || arr_type == 'd') { + ufbxi_check(ufbxi_ascii_read_float_array(uc, (char)arr_type, &num_read)); + } else if (arr_type == 'i' || arr_type == 'l') { + ufbxi_check(ufbxi_ascii_read_int_array(uc, (char)arr_type, &num_read)); + } + ufbxi_check(UINT32_MAX - num_values > num_read); + num_values += (uint32_t)num_read; + } + + if (ufbxi_ascii_accept(uc, UFBXI_ASCII_STRING)) { + + if (arr_type) { + + if (arr_type == 's' || arr_type == 'S' || arr_type == 'C') { + bool raw = arr_type == 's'; + ufbx_string *v = ufbxi_push(&uc->tmp_stack, ufbx_string, 1); + ufbxi_check(v); + v->data = tok->str_data; + v->length = tok->str_len; + if (arr_type == 'C') { + ufbxi_buf *buf = uc->opts.retain_dom ? &uc->result : tmp_buf; + v->data = ufbxi_push_copy(buf, char, v->length, v->data); + ufbxi_check(v->data); + } else { + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, v, raw)); + } + } else { + // Ignore strings in non-string arrays, decrement `num_values` as it will be + // incremented after the loop iteration is done to ignore it. + num_values--; + } + + } else if (num_values < UFBXI_MAX_NON_ARRAY_VALUES) { + type_mask |= (uint32_t)UFBXI_VALUE_STRING << (num_values*2); + ufbxi_value *v = &vals[num_values]; + + const char *str = tok->str_data; + size_t length = tok->str_len; + ufbxi_check(str); + + if (length == 0) { + v->s.raw_data = ufbxi_empty_char; + v->s.raw_length = 0; + v->s.utf8_length = 0; + } else { + bool non_ascii = false; + uint32_t hash = ufbxi_hash_string_check_ascii(str, length, &non_ascii); + bool raw = !non_ascii || ufbxi_is_raw_string(uc, parent_state, name, num_values); + ufbxi_check(ufbxi_push_sanitized_string(&uc->string_pool, &v->s, str, length, hash, raw)); + if (non_ascii && raw) v->s.utf8_length = UINT32_MAX; + } + } + + } else if (ufbxi_ascii_accept(uc, UFBXI_ASCII_INT)) { + int64_t val = tok->value.i64; + ufbx_real fsign = !val && tok->negative ? (ufbx_real)-1.0f : (ufbx_real)1.0f; + + switch (arr_type) { + + case 0: + // Parse version from comment if there was no magic comment + if (!ua->found_version && parse_state == UFBXI_PARSE_FBX_VERSION && num_values == 0) { + if (val >= 6000 && val <= 10000) { + ua->found_version = true; + uc->version = (uint32_t)val; + } + } + + if (num_values < UFBXI_MAX_NON_ARRAY_VALUES) { + type_mask |= (uint32_t)UFBXI_VALUE_NUMBER << (num_values*2); + ufbxi_value *v = &vals[num_values]; + // False positive: `v->f` and `v->i` do not overlap in the union. + // cppcheck-suppress overlappingWriteUnion + v->f = (double)(v->i = val) * (double)fsign; + } + break; + + case 'b': { bool *v = ufbxi_push(&uc->tmp_stack, bool, 1); ufbxi_check(v); *v = val != 0; } break; + case 'c': { uint8_t *v = ufbxi_push(&uc->tmp_stack, uint8_t, 1); ufbxi_check(v); *v = (uint8_t)val; } break; + case 'i': { int32_t *v = ufbxi_push(&uc->tmp_stack, int32_t, 1); ufbxi_check(v); *v = (int32_t)val; } break; + case 'l': { int64_t *v = ufbxi_push(&uc->tmp_stack, int64_t, 1); ufbxi_check(v); *v = (int64_t)val; } break; + case 'f': { float *v = ufbxi_push(&uc->tmp_stack, float, 1); ufbxi_check(v); *v = (float)val * (float)fsign; } break; + case 'd': { double *v = ufbxi_push(&uc->tmp_stack, double, 1); ufbxi_check(v); *v = (double)val * (double)fsign; } break; + case '-': num_values--; break; + + default: + ufbxi_fail("Bad array dst type"); + + } + + } else if (ufbxi_ascii_accept(uc, UFBXI_ASCII_FLOAT)) { + double val = tok->value.f64; + + switch (arr_type) { + + case 0: + if (num_values < UFBXI_MAX_NON_ARRAY_VALUES) { + type_mask |= (uint32_t)UFBXI_VALUE_NUMBER << (num_values*2); + ufbxi_value *v = &vals[num_values]; + // False positive: `v->f` and `v->i` do not overlap in the union. + // cppcheck-suppress overlappingWriteUnion + v->i = ufbxi_f64_to_i64(v->f = val); + } + break; + + case 'b': { bool *v = ufbxi_push(&uc->tmp_stack, bool, 1); ufbxi_check(v); *v = val != 0; } break; + case 'c': { uint8_t *v = ufbxi_push(&uc->tmp_stack, uint8_t, 1); ufbxi_check(v); *v = (uint8_t)val; } break; + case 'i': { int32_t *v = ufbxi_push(&uc->tmp_stack, int32_t, 1); ufbxi_check(v); *v = ufbxi_f64_to_i32(val); } break; + case 'l': { int64_t *v = ufbxi_push(&uc->tmp_stack, int64_t, 1); ufbxi_check(v); *v = ufbxi_f64_to_i64(val); } break; + case 'f': { float *v = ufbxi_push(&uc->tmp_stack, float, 1); ufbxi_check(v); *v = (float)val; } break; + case 'd': { double *v = ufbxi_push(&uc->tmp_stack, double, 1); ufbxi_check(v); *v = (double)val; } break; + case '-': num_values--; break; + + default: + ufbxi_fail("Bad array dst type"); + + } + + } else if (ufbxi_ascii_accept(uc, UFBXI_ASCII_BARE_WORD)) { + + int64_t val = 0; + if (tok->str_len >= 1) { + val = (int64_t)tok->str_data[0]; + } + + switch (arr_type) { + + case 0: + if (num_values < UFBXI_MAX_NON_ARRAY_VALUES) { + type_mask |= (uint32_t)UFBXI_VALUE_NUMBER << (num_values*2); + ufbxi_value *v = &vals[num_values]; + // False positive: `v->f` and `v->i` do not overlap in the union. + // cppcheck-suppress overlappingWriteUnion + v->f = (double)(v->i = val); + } + break; + + case 'b': { bool *v = ufbxi_push(&uc->tmp_stack, bool, 1); ufbxi_check(v); *v = val != 0; } break; + case 'c': { uint8_t *v = ufbxi_push(&uc->tmp_stack, uint8_t, 1); ufbxi_check(v); *v = (uint8_t)val; } break; + case 'i': { int32_t *v = ufbxi_push(&uc->tmp_stack, int32_t, 1); ufbxi_check(v); *v = (int32_t)val; } break; + case 'l': { int64_t *v = ufbxi_push(&uc->tmp_stack, int64_t, 1); ufbxi_check(v); *v = (int64_t)val; } break; + case 'f': { float *v = ufbxi_push(&uc->tmp_stack, float, 1); ufbxi_check(v); *v = (float)val; } break; + case 'd': { double *v = ufbxi_push(&uc->tmp_stack, double, 1); ufbxi_check(v); *v = (double)val; } break; + case '-': num_values--; break; + + } + + } else if (ufbxi_ascii_accept(uc, '*')) { + // Parse a post-7000 ASCII array eg. "*3 { 1,2,3 }" + ufbxi_check(!in_ascii_array); + ufbxi_check(ufbxi_ascii_accept(uc, UFBXI_ASCII_INT)); + + if (ufbxi_ascii_accept(uc, '{')) { + ufbxi_check(ufbxi_ascii_accept(uc, UFBXI_ASCII_NAME)); + + // NOTE: This `continue` skips incrementing `num_values` and parsing + // a comma, continuing to parse the values in the array. + in_ascii_array = true; + + // Optimized array skipping + if (arr_type == '-') { + ufbxi_check(ufbxi_ascii_skip_until(uc, '}')); + } + } + continue; + } else { + break; + } + + // Add value and keep parsing if there's a comma. This part may be + // skipped if we enter an array block. + num_values++; + ufbxi_check(num_values < UINT32_MAX); + if (!ufbxi_ascii_accept(uc, ',')) break; + } + + // Close the ASCII array if we are in one + if (in_ascii_array) { + ufbxi_check(ufbxi_ascii_accept(uc, '}')); + } + + ua->parse_as_f32 = false; + + if (arr_type) { + if (arr_type == '-') { + node->array->data = NULL; + node->array->size = 0; + } else { + void *arr_data = ufbxi_push_pop_size(arr_buf, &uc->tmp_stack, arr_elem_size, num_values); + ufbxi_check(arr_data); + if (arr_info.flags & UFBXI_ARRAY_FLAG_PAD_BEGIN) { + node->array->data = (char*)arr_data + 4*arr_elem_size; + node->array->size = num_values - 4; + } else { + node->array->data = arr_data; + node->array->size = num_values; + } + + // Pop alignment helper + ufbxi_pop_size(&uc->tmp_stack, 8, 1, NULL, false); + } + } else { + num_values = ufbxi_min32(num_values, UFBXI_MAX_NON_ARRAY_VALUES); + node->value_type_mask = (uint16_t)type_mask; + node->vals = ufbxi_push_copy(tmp_buf, ufbxi_value, num_values, vals); + ufbxi_check(node->vals); + } + + // Recursively parse the children of this node. Update the parse state + // to provide context for child node parsing. + if (ufbxi_ascii_accept(uc, '{')) { + if (recursive) { + size_t num_children = 0; + for (;;) { + bool end = false; + ufbxi_check(ufbxi_ascii_parse_node(uc, depth + 1, parse_state, &end, tmp_buf, recursive)); + if (end) break; + num_children++; + } + + // Pop children from `tmp_stack` to a contiguous array + node->children = ufbxi_push_pop(tmp_buf, &uc->tmp_stack, ufbxi_node, num_children); + ufbxi_check(node->children); + node->num_children = (uint32_t)num_children; + } + + uc->has_next_child = true; + } else { + uc->has_next_child = false; + } + + return 1; +} + +// -- DOM retention + +typedef struct { + uintptr_t node_ptr; + ufbx_dom_node *dom_node; +} ufbxi_dom_mapping; + +ufbxi_nodiscard static ufbxi_noinline ufbx_dom_node *ufbxi_get_dom_node_imp(ufbxi_context *uc, ufbxi_node *node) +{ + if (!node) return NULL; + ufbxi_dom_mapping mapping = { (uintptr_t)node, NULL }; + uint32_t hash = ufbxi_hash_uptr(mapping.node_ptr); + ufbxi_dom_mapping *result = ufbxi_map_find(&uc->dom_node_map, ufbxi_dom_mapping, hash, &mapping); + return result ? result->dom_node : NULL; +} + +ufbxi_nodiscard static ufbxi_forceinline ufbx_dom_node *ufbxi_get_dom_node(ufbxi_context *uc, ufbxi_node *node) +{ + if (!uc->opts.retain_dom) return NULL; + return ufbxi_get_dom_node_imp(uc, node); +} + +// Recursion limited by check in ufbxi_[binary/ascii]_parse_node() +ufbxi_nodiscard static ufbxi_noinline int ufbxi_retain_dom_node(ufbxi_context *uc, ufbxi_node *node, ufbx_dom_node **p_dom_node) + ufbxi_recursive_function(int, ufbxi_retain_dom_node, (uc, node, p_dom_node), UFBXI_MAX_NODE_DEPTH + 1, + (ufbxi_context *uc, ufbxi_node *node, ufbx_dom_node **p_dom_node)) +{ + ufbx_dom_node *dst = ufbxi_push_zero(&uc->result, ufbx_dom_node, 1); + ufbxi_check(dst); + ufbxi_check(ufbxi_push_copy(&uc->tmp_dom_nodes, ufbx_dom_node*, 1, &dst)); + + if (p_dom_node) { + *p_dom_node = dst; + } + + dst->name.data = node->name; + dst->name.length = node->name_len; + + { + ufbxi_dom_mapping mapping = { (uintptr_t)node, NULL }; + uint32_t hash = ufbxi_hash_uptr(mapping.node_ptr); + ufbxi_dom_mapping *result = ufbxi_map_find(&uc->dom_node_map, ufbxi_dom_mapping, hash, &mapping); + if (!result) { + result = ufbxi_map_insert(&uc->dom_node_map, ufbxi_dom_mapping, hash, &mapping); + ufbxi_check(result); + } + result->node_ptr = (uintptr_t)node; + result->dom_node = dst; + } + + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &dst->name, false)); + + if (node->value_type_mask == UFBXI_VALUE_ARRAY) { + ufbxi_value_array *arr = node->array; + ufbx_dom_value *val = ufbxi_push_zero(&uc->result, ufbx_dom_value, 1); + ufbxi_check(val); + + dst->values.data = val; + dst->values.count = 1; + + size_t elem_size = ufbxi_array_type_size(arr->type); + val->value_str.data = ufbxi_empty_char; + val->value_blob.data = arr->data; + val->value_blob.size = arr->size * elem_size; + val->value_float = (double)(val->value_int = (int64_t)arr->size); + + switch (arr->type) { + case 'c': val->type = UFBX_DOM_VALUE_ARRAY_I8; break; + case 'i': val->type = UFBX_DOM_VALUE_ARRAY_I32; break; + case 'l': val->type = UFBX_DOM_VALUE_ARRAY_I64; break; + case 'f': val->type = UFBX_DOM_VALUE_ARRAY_F32; break; + case 'd': val->type = UFBX_DOM_VALUE_ARRAY_F64; break; + case 's': val->type = UFBX_DOM_VALUE_ARRAY_RAW_STRING; break; + case 'C': val->type = UFBX_DOM_VALUE_ARRAY_RAW_STRING; break; + case '-': val->type = UFBX_DOM_VALUE_ARRAY_IGNORED; break; + default: ufbxi_fail("Bad array type"); break; + } + } else { + size_t ix; + for (ix = 0; ix < UFBXI_MAX_NON_ARRAY_VALUES; ix++) { + uint32_t mask = (node->value_type_mask >> (2*ix)) & 0x3; + if (!mask) break; + ufbx_dom_value *val = ufbxi_push_zero(&uc->tmp_stack, ufbx_dom_value, 1); + ufbxi_check(val); + val->value_str.data = ufbxi_empty_char; + + if (mask == UFBXI_VALUE_STRING) { + val->type = UFBX_DOM_VALUE_STRING; + ufbxi_ignore(ufbxi_get_val_at(node, ix, 'S', &val->value_str)); + ufbxi_ignore(ufbxi_get_val_at(node, ix, 'b', &val->value_blob)); + } else { + ufbx_assert(mask == UFBXI_VALUE_NUMBER); + val->type = UFBX_DOM_VALUE_NUMBER; + val->value_int = node->vals[ix].i; + val->value_float = node->vals[ix].f; + } + } + + dst->values.count = ix; + dst->values.data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_dom_value, ix); + ufbxi_check(dst->values.data); + } + + if (node->num_children > 0) { + ufbxi_for(ufbxi_node, child, node->children, node->num_children) { + ufbxi_check(ufbxi_retain_dom_node(uc, child, NULL)); + } + + dst->children.count = node->num_children; + dst->children.data = ufbxi_push_pop(&uc->result, &uc->tmp_dom_nodes, ufbx_dom_node*, node->num_children); + ufbxi_check(dst->children.data); + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_retain_toplevel(ufbxi_context *uc, ufbxi_node *node) +{ + if (uc->dom_parse_num_children > 0) { + ufbx_dom_node **children = ufbxi_push_pop(&uc->result, &uc->tmp_dom_nodes, ufbx_dom_node*, uc->dom_parse_num_children); + ufbxi_check(children); + uc->dom_parse_toplevel->children.data = children; + uc->dom_parse_toplevel->children.count = uc->dom_parse_num_children; + uc->dom_parse_num_children = 0; + } + + if (node) { + ufbxi_check(ufbxi_retain_dom_node(uc, node, &uc->dom_parse_toplevel)); + } else { + uc->dom_parse_toplevel = NULL; + + // Called with NULL argument to finish retaining DOM, collect the final nodes to `ufbx_scene`. + size_t num_top_nodes = uc->tmp_dom_nodes.num_items; + ufbx_dom_node **nodes = ufbxi_push_pop(&uc->result, &uc->tmp_dom_nodes, ufbx_dom_node*, num_top_nodes); + ufbxi_check(nodes); + + ufbx_dom_node *dom_root = ufbxi_push_zero(&uc->result, ufbx_dom_node, 1); + ufbxi_check(dom_root); + + dom_root->name.data = ufbxi_empty_char; + dom_root->children.data = nodes; + dom_root->children.count = num_top_nodes; + + uc->scene.dom_root = dom_root; + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_retain_toplevel_child(ufbxi_context *uc, ufbxi_node *child) +{ + ufbx_assert(uc->dom_parse_toplevel); + ufbxi_check(ufbxi_retain_dom_node(uc, child, NULL)); + uc->dom_parse_num_children++; + + return 1; +} + +// -- General parsing + +static ufbxi_noinline bool ufbxi_next_line(ufbx_string *line, ufbx_string *buf, bool skip_space) +{ + if (buf->length == 0) return false; + const char *newline = (const char*)memchr(buf->data, '\n', buf->length); + size_t length = newline ? ufbxi_to_size(newline - buf->data) + 1 : buf->length; + + line->data = buf->data; + line->length = length; + buf->data += length; + buf->length -= length; + + if (skip_space) { + while (line->length > 0 && ufbxi_is_space(line->data[0])) { + line->data++; + line->length--; + } + while (line->length > 0 && ufbxi_is_space(line->data[line->length - 1])) { + line->length--; + } + } + + return true; +} + +// Recursion limited by compile time patterns +static ufbxi_noinline const char *ufbxi_match_skip(const char *fmt, bool alternation) + ufbxi_recursive_function(const char *, ufbxi_match_skip, (fmt, alternation), 4, + (const char *fmt, bool alternation)) +{ + for (;;) { + char c = *fmt++; + switch (c) { + case '(': + fmt = ufbxi_match_skip(fmt, false) + 1; + break; + case '\\': + fmt++; + break; + case '[': + c = *fmt; + while (c != ']') { + c = *fmt++; + if (c == '\\') { + c = *fmt++; + } + } + fmt++; + break; + case '|': + if (alternation) return fmt - 1; + break; + case ')': + case '\0': + return fmt - 1; + } + } +} + +// Recursion limited by compile time patterns +static ufbxi_noinline bool ufbxi_match_imp(const char **p_str, const char *end, const char **p_fmt) + ufbxi_recursive_function(bool, ufbxi_match_imp, (p_str, end, p_fmt), 4, + (const char **p_str, const char *end, const char **p_fmt)) +{ + const char *str_original_begin = *p_str; + const char *str = str_original_begin; + const char *fmt_begin = *p_fmt; + const char *fmt = fmt_begin; + bool case_insensitive = false; + + size_t count = 0; + for (;;) { + char c = *fmt++; + if (!c) { + *p_str = str; + *p_fmt = fmt - 1; + return true; + } + + const char *str_begin = str; + char ref = str != end ? *str : '\0'; + + if (case_insensitive) { + if (ref >= 'A' && ref <= 'Z') { + ref = (ref - 'A') + 'a'; + } + } + + bool ok = false; + switch (c) { + + case '\\': { + const char *macro = NULL; + c = *fmt++; + switch (c) { + case 'd': + macro = "[0-9]"; + break; + case 'F': + macro = "[\\-+]?[0-9]+(\\.[0-9]+)?([eE][\\-+]?[0-9]+)?"; + break; + case 's': + if (ufbxi_is_space(ref)) { + ok = true; + str++; + } + break; + case 'S': + if (!ufbxi_is_space(ref)) { + ok = true; + str++; + } + break; + case 'c': + case 'C': + case_insensitive = c == 'c'; + ok = true; + break; + default: + if (ref == c) { + ok = true; + str++; + } + break; + } + if (macro) { + ok = ufbxi_match_imp(&str, end, ¯o); + } + } break; + + case '[': { + while (fmt[0] != ']') { + if (fmt[0] == '\\') { + if (ref == fmt[1]) ok = true; + fmt += 2; + } else if (fmt[1] == '-') { + if (ref >= fmt[0] && ref <= fmt[2]) { + ok = true; + } + fmt += 3; + } else { + if (ref == fmt[0]) ok = true; + fmt += 1; + } + } + fmt++; + if (ok) str++; + } break; + + case '(': + if (ufbxi_match_imp(&str, end, &fmt)) { + ok = true; + } + break; + + case '|': + fmt = ufbxi_match_skip(fmt, false); + ok = true; + break; + + case ')': + *p_str = str; + *p_fmt = fmt; + return true; + + case '.': + if (ref != '\0') { + ok = true; + str++; + } + break; + + default: + if (c == ref) { + str++; + ok = true; + } + break; + } + + bool did_fail = false; + c = *fmt; + switch (c) { + case '*': + fmt++; + if (ok) { + fmt = fmt_begin; + count++; + continue; + } + break; + case '+': + fmt++; + if (ok) { + fmt = fmt_begin; + count++; + continue; + } else if (count == 0) { + did_fail = true; + } + break; + case '?': + fmt++; + break; + default: + did_fail = !ok; + break; + } + + if (did_fail) { + fmt = ufbxi_match_skip(fmt, true); + if (*fmt == '|') { + fmt++; + str = str_original_begin; + } else { + *p_fmt = ufbxi_match_skip(fmt, false) + 1; + return false; + } + } else { + if (!ok) { + str = str_begin; + } + } + + fmt_begin = fmt; + count = 0; + } +} + +static ufbxi_noinline bool ufbxi_match(const ufbx_string *str, const char *fmt) +{ + const char *ptr = str->data, *end = str->data + str->length; + if (ufbxi_match_imp(&ptr, end, &fmt)) { + return ptr == end; + } else { + return false; + } +} + +static ufbxi_noinline bool ufbxi_is_format(const char *data, size_t size, ufbx_file_format format) +{ + ufbx_string line, buf = { data, size }; + + if (format == UFBX_FILE_FORMAT_FBX) { + if (size >= UFBXI_BINARY_MAGIC_SIZE && !memcmp(data, ufbxi_binary_magic, UFBXI_BINARY_MAGIC_SIZE)) { + return true; + } + + while (ufbxi_next_line(&line, &buf, true)) { + if (ufbxi_match(&line, ";\\s*FBX\\s*\\d+\\.\\d+\\.\\d+\\s*project\\s+file")) return true; + if (ufbxi_match(&line, "FBXHeaderExtension:.*")) return true; + } + } else if (format == UFBX_FILE_FORMAT_OBJ) { + while (ufbxi_next_line(&line, &buf, true)) { + const char *pattern = + "(vn?\\s+\\F|vt)\\s+\\F\\s+\\F.*" "|" + "f\\s+[\\-/0-9]+\\s+[\\-/0-9]+\\s*[\\-/0-9]+.*" "|" + "(usemtl|mtllib)\\s+\\S.*"; + if (ufbxi_match(&line, pattern)) return true; + } + } else if (format == UFBX_FILE_FORMAT_MTL) { + while (ufbxi_next_line(&line, &buf, true)) { + const char *pattern = + "newmtl\\s+\\S.*"; + if (ufbxi_match(&line, pattern)) return true; + } + } else { + ufbx_assert(0 && "Unhandled format"); + } + + return false; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_determine_format(ufbxi_context *uc) +{ + ufbx_file_format format = uc->opts.file_format; + + if (format == UFBX_FILE_FORMAT_UNKNOWN && !uc->opts.no_format_from_content) { + ufbxi_pause_progress(uc); + + size_t lookahead = UFBXI_MIN_FILE_FORMAT_LOOKAHEAD; + while (format == UFBX_FILE_FORMAT_UNKNOWN && lookahead <= uc->opts.file_format_lookahead) { + if (lookahead > uc->data_size) { + if (uc->eof) break; + ufbxi_check(ufbxi_refill(uc, lookahead, false)); + } + + size_t data_size = ufbxi_min_sz(lookahead, uc->data_size); + for (uint32_t fmt = UFBX_FILE_FORMAT_FBX; fmt < UFBX_FILE_FORMAT_COUNT; fmt++) { + if (ufbxi_is_format(uc->data, data_size, (ufbx_file_format)fmt)) { + format = (ufbx_file_format)fmt; + break; + } + } + + if (lookahead >= uc->opts.file_format_lookahead) { + break; + } else if (lookahead < SIZE_MAX / 2) { + lookahead = ufbxi_min_sz(lookahead * 2, uc->opts.file_format_lookahead); + } else { + lookahead = SIZE_MAX; + } + } + + ufbxi_check(ufbxi_resume_progress(uc)); + } + + if (format == UFBX_FILE_FORMAT_UNKNOWN && !uc->opts.no_format_from_extension) { + if (uc->opts.filename.length > 0) { + ufbx_string extension = uc->opts.filename; + for (size_t i = extension.length; i > 0; i--) { + if (extension.data[i - 1] == '.') { + extension.data += i - 1; + extension.length -= i - 1; + break; + } + } + + if (ufbxi_match(&extension, "\\c\\.fbx")) { + format = UFBX_FILE_FORMAT_FBX; + } else if (ufbxi_match(&extension, "\\c\\.obj")) { + format = UFBX_FILE_FORMAT_OBJ; + } else if (ufbxi_match(&extension, "\\c\\.mtl")) { + format = UFBX_FILE_FORMAT_MTL; + } + } + } + + ufbxi_check_msg(format != UFBX_FILE_FORMAT_UNKNOWN, "Unrecognized file format"); + uc->scene.metadata.file_format = format; + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_begin_parse(ufbxi_context *uc) +{ + const char *header = ufbxi_peek_bytes(uc, UFBXI_BINARY_HEADER_SIZE); + ufbxi_check(header); + + // If the file starts with the binary magic parse it as binary, otherwise + // treat it as an ASCII file. + if (!memcmp(header, ufbxi_binary_magic, UFBXI_BINARY_MAGIC_SIZE)) { + + // The byte after the magic indicates endianness + char endian = header[UFBXI_BINARY_MAGIC_SIZE + 0]; + uc->file_big_endian = endian != 0; + + // Read the version directly from the header + const char *version_word = header + UFBXI_BINARY_MAGIC_SIZE + 1; + if (uc->file_big_endian) { + version_word = ufbxi_swap_endian(uc, version_word, 1, 4); + ufbxi_check(version_word); + } + uc->version = ufbxi_read_u32(version_word); + + // This is quite probably an FBX file.. + uc->sure_fbx = true; + ufbxi_consume_bytes(uc, UFBXI_BINARY_HEADER_SIZE); + + } else { + uc->from_ascii = true; + + // Use the current read buffer as the initial parse buffer + memset(&uc->ascii, 0, sizeof(uc->ascii)); + uc->ascii.src = uc->data; + uc->ascii.src_yield = uc->data + uc->yield_size; + uc->ascii.src_end = uc->data + uc->data_size + uc->yield_size; + + // Initialize the first token + ufbxi_check(ufbxi_ascii_next_token(uc, &uc->ascii.token)); + + // Default to version 7400 if not found in header + if (uc->version > 0) { + uc->sure_fbx = true; + } else { + if (!uc->opts.strict) uc->version = 7400; + ufbxi_check_msg(uc->version > 0, "Not an FBX file"); + } + } + + return 1; +} + +ufbxi_nodiscard static int ufbxi_parse_toplevel_child_imp(ufbxi_context *uc, ufbxi_parse_state state, ufbxi_buf *buf, bool *p_end) +{ + if (uc->from_ascii) { + ufbxi_check(ufbxi_ascii_parse_node(uc, 0, state, p_end, buf, true)); + } else { + ufbxi_check(ufbxi_binary_parse_node(uc, 0, state, p_end, buf, true)); + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_parse_toplevel(ufbxi_context *uc, const char *name) +{ + ufbxi_for(ufbxi_node, node, uc->top_nodes, uc->top_nodes_len) { + if (node->name == name) { + uc->top_node = node; + uc->top_child_index = 0; + return 1; + } + } + + // Reached end and not found in cache + if (uc->parsed_to_end) { + uc->top_node = NULL; + uc->top_child_index = 0; + return 1; + } + + for (;;) { + // Parse the next top-level node + bool end = false; + if (uc->from_ascii) { + ufbxi_check(ufbxi_ascii_parse_node(uc, 0, UFBXI_PARSE_ROOT, &end, &uc->tmp, false)); + } else { + ufbxi_check(ufbxi_binary_parse_node(uc, 0, UFBXI_PARSE_ROOT, &end, &uc->tmp, false)); + } + + // Top-level node not found + if (end) { + uc->top_node = NULL; + uc->top_child_index = 0; + uc->parsed_to_end = true; + if (uc->opts.retain_dom) { + ufbxi_check(ufbxi_retain_toplevel(uc, NULL)); + } + + // Not needed anymore + ufbxi_buf_free(&uc->tmp_parse); + + return 1; + } + + uc->top_nodes_len++; + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->top_nodes, &uc->top_nodes_cap, uc->top_nodes_len)); + ufbxi_node *node = &uc->top_nodes[uc->top_nodes_len - 1]; + ufbxi_pop(&uc->tmp_stack, ufbxi_node, 1, node); + if (uc->opts.retain_dom) { + ufbxi_check(ufbxi_retain_toplevel(uc, node)); + } + + // Return if we parsed the right one + if (node->name == name) { + uc->top_node = node; + uc->top_child_index = SIZE_MAX; + return 1; + } + + // If not we need to parse all the children of the node for later + uint32_t num_children = 0; + ufbxi_parse_state state = ufbxi_update_parse_state(UFBXI_PARSE_ROOT, node->name); + if (uc->has_next_child) { + for (;;) { + ufbxi_check(ufbxi_parse_toplevel_child_imp(uc, state, &uc->tmp, &end)); + if (end) break; + num_children++; + } + } + + node->num_children = num_children; + node->children = ufbxi_push_pop(&uc->tmp, &uc->tmp_stack, ufbxi_node, num_children); + ufbxi_check(node->children); + + if (uc->opts.retain_dom) { + for (size_t i = 0; i < num_children; i++) { + ufbxi_check(ufbxi_retain_toplevel_child(uc, &node->children[i])); + } + } + } +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_parse_toplevel_child(ufbxi_context *uc, ufbxi_node **p_node) +{ + // Top-level node not found + if (!uc->top_node) { + *p_node = NULL; + return 1; + } + + if (uc->top_child_index == SIZE_MAX) { + // Parse children on demand + ufbxi_buf_clear(&uc->tmp_parse); + bool end = false; + ufbxi_parse_state state = ufbxi_update_parse_state(UFBXI_PARSE_ROOT, uc->top_node->name); + ufbxi_check(ufbxi_parse_toplevel_child_imp(uc, state, &uc->tmp_parse, &end)); + if (end) { + *p_node = NULL; + } else { + ufbxi_pop(&uc->tmp_stack, ufbxi_node, 1, &uc->top_child); + *p_node = &uc->top_child; + + if (uc->opts.retain_dom) { + ufbxi_check(ufbxi_retain_toplevel_child(uc, &uc->top_child)); + } + } + } else { + // Iterate already parsed nodes + size_t child_index = uc->top_child_index; + if (child_index == uc->top_node->num_children) { + *p_node = NULL; + } else { + uc->top_child_index++; + *p_node = &uc->top_node->children[child_index]; + } + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_parse_legacy_toplevel(ufbxi_context *uc) +{ + ufbx_assert(uc->top_nodes_len == 0); + + bool end = false; + if (uc->from_ascii) { + ufbxi_check(ufbxi_ascii_parse_node(uc, 0, UFBXI_PARSE_ROOT, &end, &uc->tmp, true)); + } else { + ufbxi_check(ufbxi_binary_parse_node(uc, 0, UFBXI_PARSE_ROOT, &end, &uc->tmp, true)); + } + + // Top-level node not found + if (end) { + uc->top_node = NULL; + uc->top_child_index = 0; + uc->parsed_to_end = true; + return 1; + } + + ufbxi_pop(&uc->tmp_stack, ufbxi_node, 1, &uc->legacy_node); + uc->top_child_index = 0; + uc->top_node = &uc->legacy_node; + + if (uc->opts.retain_dom) { + ufbxi_check(ufbxi_retain_toplevel(uc, &uc->legacy_node)); + } + + return 1; +} + +// -- Setup + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_load_strings(ufbxi_context *uc) +{ +#if defined(UFBX_REGRESSION) + ufbx_string reg_prev = ufbx_empty_string; +#endif + + // Push all the global 'ufbxi_*' strings into the pool without copying them + // This allows us to compare name pointers to the global values + ufbxi_for(ufbx_string, str, ufbxi_strings, ufbxi_arraycount(ufbxi_strings)) { +#if defined(UFBX_REGRESSION) + ufbx_assert(strlen(str->data) == str->length); + ufbx_assert(ufbxi_str_less(reg_prev, *str)); + reg_prev = *str; +#endif + ufbxi_check(ufbxi_push_string_imp(&uc->string_pool, str->data, str->length, NULL, false, true)); + } + + return 1; +} + +typedef struct { + const char *name; + ufbx_prop_type type; +} ufbxi_prop_type_name; + +static const ufbxi_prop_type_name ufbxi_prop_type_names[] = { + { "Boolean", UFBX_PROP_BOOLEAN }, + { "bool", UFBX_PROP_BOOLEAN }, + { "Bool", UFBX_PROP_BOOLEAN }, + { "Integer", UFBX_PROP_INTEGER }, + { "int", UFBX_PROP_INTEGER }, + { "enum", UFBX_PROP_INTEGER }, + { "Visibility", UFBX_PROP_INTEGER }, + { "Visibility Inheritance", UFBX_PROP_INTEGER }, + { "KTime", UFBX_PROP_INTEGER }, + { "Number", UFBX_PROP_NUMBER }, + { "double", UFBX_PROP_NUMBER }, + { "Real", UFBX_PROP_NUMBER }, + { "Float", UFBX_PROP_NUMBER }, + { "Intensity", UFBX_PROP_NUMBER }, + { "Vector", UFBX_PROP_VECTOR }, + { "Vector3D", UFBX_PROP_VECTOR }, + { "Color", UFBX_PROP_COLOR }, + { "ColorAndAlpha", UFBX_PROP_COLOR_WITH_ALPHA }, + { "ColorRGB", UFBX_PROP_COLOR }, + { "String", UFBX_PROP_STRING }, + { "KString", UFBX_PROP_STRING }, + { "object", UFBX_PROP_STRING }, + { "DateTime", UFBX_PROP_DATE_TIME }, + { "Lcl Translation", UFBX_PROP_TRANSLATION }, + { "Lcl Rotation", UFBX_PROP_ROTATION }, + { "Lcl Scaling", UFBX_PROP_SCALING }, + { "Distance", UFBX_PROP_DISTANCE }, + { "Compound", UFBX_PROP_COMPOUND }, + { "Blob", UFBX_PROP_BLOB }, + { "Reference", UFBX_PROP_REFERENCE }, +}; + +static ufbx_prop_type ufbxi_get_prop_type(ufbxi_context *uc, const char *name) +{ + uint32_t hash = ufbxi_hash_ptr(name); + ufbxi_prop_type_name *entry = ufbxi_map_find(&uc->prop_type_map, ufbxi_prop_type_name, hash, &name); + if (entry) { + return entry->type; + } + return UFBX_PROP_UNKNOWN; +} + +static ufbxi_noinline ufbx_prop *ufbxi_find_prop_with_key(const ufbx_props *props, const char *name, uint32_t key) +{ + do { + ufbx_prop *prop_data = props->props.data; + size_t begin = 0; + size_t end = props->props.count; + while (end - begin >= 16) { + size_t mid = (begin + end) >> 1; + const ufbx_prop *p = &prop_data[mid]; + if (p->_internal_key < key) { + begin = mid + 1; + } else { + end = mid; + } + } + + end = props->props.count; + for (; begin < end; begin++) { + const ufbx_prop *p = &prop_data[begin]; + if (p->_internal_key > key) break; + if (p->name.data == name && (p->flags & UFBX_PROP_FLAG_NO_VALUE) == 0) { + return (ufbx_prop*)p; + } + } + + props = props->defaults; + } while (props); + + return NULL; +} + +typedef struct { + const char *key; + ufbx_texture_file *file; +} ufbxi_texture_file_entry; + +#define ufbxi_find_prop(props, name) ufbxi_find_prop_with_key((props), (name), \ + ((uint32_t)(uint8_t)name[0] << 24u) | ((uint32_t)(uint8_t)name[1] << 16u) | \ + ((uint32_t)(uint8_t)name[2] << 8u) | (uint32_t)(uint8_t)name[3]) + +static ufbxi_forceinline ufbx_real ufbxi_find_real(const ufbx_props *props, const char *name, ufbx_real def) +{ + ufbx_prop *prop = ufbxi_find_prop(props, name); + if (prop) { + return prop->value_real; + } else { + return def; + } +} + +static ufbxi_forceinline ufbx_vec3 ufbxi_find_vec3(const ufbx_props *props, const char *name, ufbx_real def_x, ufbx_real def_y, ufbx_real def_z) +{ + ufbx_prop *prop = ufbxi_find_prop(props, name); + if (prop) { + return prop->value_vec3; + } else { + ufbx_vec3 def = { def_x, def_y, def_z }; + return def; + } +} + +static ufbxi_forceinline int64_t ufbxi_find_int(const ufbx_props *props, const char *name, int64_t def) +{ + ufbx_prop *prop = ufbxi_find_prop(props, name); + if (prop) { + return prop->value_int; + } else { + return def; + } +} + +static ufbxi_forceinline int64_t ufbxi_find_enum(const ufbx_props *props, const char *name, int64_t def, int64_t max_value) +{ + ufbx_prop *prop = ufbxi_find_prop(props, name); + if (prop) { + int64_t value = prop->value_int; + if (value >= 0 && value <= max_value) { + return value; + } else { + return def; + } + } else { + return def; + } +} + +ufbxi_noinline static bool ufbxi_matrix_all_zero(const ufbx_matrix *matrix) +{ + for (size_t i = 0; i < 12; i++) { + if (matrix->v[i] != 0.0f) return false; + } + return true; +} + +static ufbxi_forceinline bool ufbxi_is_vec3_zero(ufbx_vec3 v) +{ + return (v.x == 0.0) & (v.y == 0.0) & (v.z == 0.0); +} + +static ufbxi_forceinline bool ufbxi_is_vec4_zero(ufbx_vec4 v) +{ + return (v.x == 0.0) & (v.y == 0.0) & (v.z == 0.0); +} + +static ufbxi_forceinline bool ufbxi_is_vec3_one(ufbx_vec3 v) +{ + return (v.x == 1.0) & (v.y == 1.0) & (v.z == 1.0); +} + +static ufbxi_forceinline bool ufbxi_is_quat_identity(ufbx_quat v) +{ + return (v.x == 0.0) & (v.y == 0.0) & (v.z == 0.0) & (v.w == 1.0); +} + +static ufbxi_forceinline bool ufbxi_is_transform_identity(ufbx_transform t) +{ + return (bool)((int)ufbxi_is_vec3_zero(t.translation) & (int)ufbxi_is_quat_identity(t.rotation) & (int)ufbxi_is_vec3_one(t.scale)); +} + +static ufbxi_forceinline uint32_t ufbxi_get_name_key(const char *name, size_t len) +{ + uint32_t key = 0; + if (len >= 4) { + key = (uint32_t)(uint8_t)name[0]<<24 | (uint32_t)(uint8_t)name[1]<<16 + | (uint32_t)(uint8_t)name[2]<<8 | (uint32_t)(uint8_t)name[3]; + } else { + for (size_t i = 0; i < 4; i++) { + key <<= 8; + if (i < len) key |= (uint8_t)name[i]; + } + } + return key; +} + +static ufbxi_forceinline uint32_t ufbxi_get_name_key_c(const char *name) +{ + if (name[0] == '\0') return 0; + if (name[1] == '\0') return (uint32_t)(uint8_t)name[0]<<24; + if (name[2] == '\0') return (uint32_t)(uint8_t)name[0]<<24 | (uint32_t)(uint8_t)name[1]<<16; + return (uint32_t)(uint8_t)name[0]<<24 | (uint32_t)(uint8_t)name[1]<<16 + | (uint32_t)(uint8_t)name[2]<<8 | (uint32_t)(uint8_t)name[3]; +} + +static ufbxi_forceinline bool ufbxi_name_key_less(ufbx_prop *prop, const char *data, size_t name_len, uint32_t key) +{ + if (prop->_internal_key < key) return true; + if (prop->_internal_key > key) return false; + + size_t prop_len = prop->name.length; + size_t len = ufbxi_min_sz(prop_len, name_len); + int cmp = memcmp(prop->name.data, data, len); + if (cmp != 0) return cmp < 0; + return prop_len < name_len; +} + +static const char *ufbxi_node_prop_names[] = { + "AxisLen", + "DefaultAttributeIndex", + "Freeze", + "GeometricRotation", + "GeometricScaling", + "GeometricTranslation", + "InheritType", + "LODBox", + "Lcl Rotation", + "Lcl Scaling", + "Lcl Translation", + "LookAtProperty", + "MaxDampRangeX", + "MaxDampRangeY", + "MaxDampRangeZ", + "MaxDampStrengthX", + "MaxDampStrengthY", + "MaxDampStrengthZ", + "MinDampRangeX", + "MinDampRangeY", + "MinDampRangeZ", + "MinDampStrengthX", + "MinDampStrengthY", + "MinDampStrengthZ", + "NegativePercentShapeSupport", + "PostRotation", + "PreRotation", + "PreferedAngleX", + "PreferedAngleY", + "PreferedAngleZ", + "QuaternionInterpolate", + "RotationActive", + "RotationMax", + "RotationMaxX", + "RotationMaxY", + "RotationMaxZ", + "RotationMin", + "RotationMinX", + "RotationMinY", + "RotationMinZ", + "RotationOffset", + "RotationOrder", + "RotationPivot", + "RotationSpaceForLimitOnly", + "RotationStiffnessX", + "RotationStiffnessY", + "RotationStiffnessZ", + "ScalingActive", + "ScalingMax", + "ScalingMaxX", + "ScalingMaxY", + "ScalingMaxZ", + "ScalingMin", + "ScalingMinX", + "ScalingMinY", + "ScalingMinZ", + "ScalingOffset", + "ScalingPivot", + "Show", + "TranslationActive", + "TranslationMax", + "TranslationMaxX", + "TranslationMaxY", + "TranslationMaxZ", + "TranslationMin", + "TranslationMinX", + "TranslationMinY", + "TranslationMinZ", + "UpVectorProperty", + "Visibility Inheritance", + "Visibility", + "notes", +}; + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_init_node_prop_names(ufbxi_context *uc) +{ + ufbxi_check(ufbxi_map_grow(&uc->node_prop_set, const char*, ufbxi_arraycount(ufbxi_node_prop_names))); + ufbxi_for_ptr(const char, p_name, ufbxi_node_prop_names, ufbxi_arraycount(ufbxi_node_prop_names)) { + const char *name = *p_name; + const char *pooled = ufbxi_push_string_imp(&uc->string_pool, name, strlen(name), NULL, false, true); + ufbxi_check(pooled); + uint32_t hash = ufbxi_hash_ptr(pooled); + const char **entry = ufbxi_map_insert(&uc->node_prop_set, const char*, hash, &pooled); + ufbxi_check(entry); + *entry = pooled; + } + + return 1; +} + +static bool ufbxi_is_node_property(ufbxi_context *uc, const char *name) +{ + // You need to call `ufbxi_init_node_prop_names()` before calling this + ufbx_assert(uc->node_prop_set.size > 0); + + uint32_t hash = ufbxi_hash_ptr(name); + const char **entry = ufbxi_map_find(&uc->node_prop_set, const char*, hash, &name); + return entry != NULL; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_load_maps(ufbxi_context *uc) +{ + ufbxi_check(ufbxi_map_grow(&uc->prop_type_map, ufbxi_prop_type_name, ufbxi_arraycount(ufbxi_prop_type_names))); + ufbxi_for(const ufbxi_prop_type_name, name, ufbxi_prop_type_names, ufbxi_arraycount(ufbxi_prop_type_names)) { + const char *pooled = ufbxi_push_string_imp(&uc->string_pool, name->name, strlen(name->name), NULL, false, true); + ufbxi_check(pooled); + uint32_t hash = ufbxi_hash_ptr(pooled); + ufbxi_prop_type_name *entry = ufbxi_map_insert(&uc->prop_type_map, ufbxi_prop_type_name, hash, &pooled); + ufbxi_check(entry); + entry->type = name->type; + entry->name = pooled; + } + + return 1; +} + +// -- Reading the parsed data + +ufbxi_noinline static void ufbxi_decode_base64(char *dst, const char *src, size_t src_length) +{ + uint8_t table[256] = { 0 }; + for (char c = 'A'; c <= 'Z'; c++) table[(size_t)c] = (uint8_t)(c - 'A'); + for (char c = 'a'; c <= 'z'; c++) table[(size_t)c] = (uint8_t)(26 + (c - 'a')); + for (char c = '0'; c <= '9'; c++) table[(size_t)c] = (uint8_t)(52 + (c - '0')); + table[(size_t)'+'] = 62; + table[(size_t)'/'] = 63; + + for (size_t i = 0; i + 4 <= src_length; i += 4) { + uint32_t a = table[(size_t)(uint8_t)src[i + 0]]; + uint32_t b = table[(size_t)(uint8_t)src[i + 1]]; + uint32_t c = table[(size_t)(uint8_t)src[i + 2]]; + uint32_t d = table[(size_t)(uint8_t)src[i + 3]]; + + dst[0] = (char)(uint8_t)(a << 2 | b >> 4); + dst[1] = (char)(uint8_t)(b << 4 | c >> 2); + dst[2] = (char)(uint8_t)(c << 6 | d); + dst += 3; + } +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_embedded_blob(ufbxi_context *uc, ufbx_blob *dst_blob, ufbxi_node *node) +{ + if (!node) return 1; + + ufbxi_value_array *content_arr = ufbxi_get_array(node, 'C'); + if (content_arr && content_arr->size > 0) { + ufbx_string content; + size_t num_parts = content_arr->size; + ufbx_string *parts = (ufbx_string*)content_arr->data; + if (num_parts == 1) { + content = parts[0]; + } else { + size_t total_size = 0; + ufbxi_for(ufbx_string, part, parts, num_parts) { + total_size += part->length; + } + ufbxi_buf *dst_buf = uc->from_ascii ? &uc->tmp_parse : &uc->result; + char *dst = ufbxi_push(dst_buf, char, total_size); + ufbxi_check(dst); + content.data = dst; + content.length = total_size; + ufbxi_for(ufbx_string, part, parts, num_parts) { + memcpy(dst, part->data, part->length); + dst += part->length; + } + } + + if (uc->from_ascii) { + if (content.length % 4 == 0) { + size_t padding = 0; + while (padding < 2 && padding < content.length && content.data[content.length - 1 - padding] == '=') { + padding++; + } + + dst_blob->size = content.length / 4 * 3 - padding; + dst_blob->data = ufbxi_push(&uc->result, char, dst_blob->size + 3); + ufbxi_check(dst_blob->data); + + ufbxi_decode_base64((char*)dst_blob->data, content.data, content.length); + } + } else { + dst_blob->data = content.data; + dst_blob->size = content.length; + } + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_read_property(ufbxi_context *uc, ufbxi_node *node, ufbx_prop *prop, int version) +{ + const char *type_str = NULL, *subtype_str = NULL; + ufbxi_check(ufbxi_get_val2(node, "SC", &prop->name, (char**)&type_str)); + uint32_t val_ix = 2; + if (version == 70) { + ufbxi_check(ufbxi_get_val_at(node, val_ix++, 'C', (char**)&subtype_str)); + } + + uint32_t flags = 0; + prop->_internal_key = ufbxi_get_name_key(prop->name.data, prop->name.length); + + ufbx_string flags_str; + if (ufbxi_get_val_at(node, val_ix++, 'S', &flags_str)) { + for (size_t i = 0; i < flags_str.length; i++) { + char next = i + 1 < flags_str.length ? flags_str.data[i + 1] : '0'; + switch (flags_str.data[i]) { + case 'A': flags |= UFBX_PROP_FLAG_ANIMATABLE; break; + case 'U': flags |= UFBX_PROP_FLAG_USER_DEFINED; break; + case 'H': flags |= UFBX_PROP_FLAG_HIDDEN; break; + case 'L': flags |= ((uint32_t)(next - '0') & 0xf) << 4; break; // UFBX_PROP_FLAG_LOCK_* + case 'M': flags |= ((uint32_t)(next - '0') & 0xf) << 8; break; // UFBX_PROP_FLAG_MUTE_* + } + } + } + + prop->type = ufbxi_get_prop_type(uc, type_str); + if (prop->type == UFBX_PROP_UNKNOWN && subtype_str) { + prop->type = ufbxi_get_prop_type(uc, subtype_str); + } + + if (ufbxi_get_val_at(node, val_ix, 'L', &prop->value_int)) { + flags |= (uint32_t)UFBX_PROP_FLAG_VALUE_INT; + } + + size_t real_ix; + for (real_ix = 0; real_ix < 4; real_ix++) { + if (!ufbxi_get_val_at(node, val_ix + real_ix, 'R', &prop->value_real_arr[real_ix])) break; + } + if (real_ix > 0) { + flags |= (uint32_t)UFBX_PROP_FLAG_VALUE_REAL << (real_ix - 1); + } + + // Distance properties have a string unit _after_ the real value, eg. `10, "cm"` + if (prop->type == UFBX_PROP_DISTANCE) { + val_ix++; + } + + if (ufbxi_get_val_at(node, val_ix, 'S', &prop->value_str)) { + if (prop->value_str.length > 0) { + ufbxi_ignore(ufbxi_get_val_at(node, val_ix, 'b', &prop->value_blob)); + } + flags |= (uint32_t)UFBX_PROP_FLAG_VALUE_STR; + } else { + prop->value_str = ufbx_empty_string; + } + + // Very unlikely, seems to only exist in some "non standard" FBX files + if (node->num_children > 0) { + ufbxi_node *binary = ufbxi_find_child(node, ufbxi_BinaryData); + ufbxi_check(ufbxi_read_embedded_blob(uc, &prop->value_blob, binary)); + flags |= (uint32_t)UFBX_PROP_FLAG_VALUE_BLOB; + } + + prop->flags = (ufbx_prop_flags)flags; + + return 1; +} + +static ufbxi_forceinline bool ufbxi_prop_less(ufbx_prop *a, ufbx_prop *b) +{ + if (a->_internal_key < b->_internal_key) return true; + if (a->_internal_key > b->_internal_key) return false; + return strcmp(a->name.data, b->name.data) < 0; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_properties(ufbxi_context *uc, ufbx_prop *props, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbx_prop))); + ufbxi_macro_stable_sort(ufbx_prop, 32, props, uc->tmp_arr, count, ( ufbxi_prop_less(a, b) )); + return 1; +} + +ufbxi_noinline static void ufbxi_deduplicate_properties(ufbx_prop_list *list) +{ + if (list->count >= 2) { + ufbx_prop *ps = list->data; + size_t dst = 0, src = 0, end = list->count; + while (src < end) { + if (src + 1 < end && ps[src].name.data == ps[src + 1].name.data) { + src++; + } else if (dst != src) { + ps[dst++] = ps[src++]; + } else { + dst++; src++; + } + } + list->count = dst; + } +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_read_properties(ufbxi_context *uc, ufbxi_node *parent, ufbx_props *props) +{ + props->defaults = NULL; + + int version = 70; + ufbxi_node *node = ufbxi_find_child(parent, ufbxi_Properties70); + if (!node) { + node = ufbxi_find_child(parent, ufbxi_Properties60); + if (!node) { + // No properties found, not an error + props->props.data = NULL; + props->props.count = 0; + return 1; + } + version = 60; + } + + props->props.data = ufbxi_push_zero(&uc->result, ufbx_prop, node->num_children); + props->props.count = node->num_children; + ufbxi_check(props->props.data); + + for (size_t i = 0; i < props->props.count; i++) { + ufbxi_check(ufbxi_read_property(uc, &node->children[i], &props->props.data[i], version)); + } + + ufbxi_check(ufbxi_sort_properties(uc, props->props.data, props->props.count)); + ufbxi_deduplicate_properties(&props->props); + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_read_scene_info(ufbxi_context *uc, ufbxi_node *node) +{ + ufbxi_check(ufbxi_read_properties(uc, node, &uc->scene.metadata.scene_props)); + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_read_header_extension(ufbxi_context *uc) +{ + // TODO: Read TCDefinition and adjust timestamps + uc->ktime_to_sec = (1.0 / 46186158000.0); + + for (;;) { + ufbxi_node *child; + ufbxi_check(ufbxi_parse_toplevel_child(uc, &child)); + if (!child) break; + + if (child->name == ufbxi_Creator) { + ufbxi_ignore(ufbxi_get_val1(child, "S", &uc->scene.metadata.creator)); + } + + if (uc->version < 6000 && child->name == ufbxi_FBXVersion) { + int32_t version; + if (ufbxi_get_val1(child, "I", &version)) { + if (version > 0 && (uint32_t)version > uc->version) { + uc->version = (uint32_t)version; + } + } + } + + if (child->name == ufbxi_SceneInfo) { + ufbxi_check(ufbxi_read_scene_info(uc, child)); + } + + } + + return 1; +} + +static bool ufbxi_match_version_string(const char *fmt, ufbx_string str, uint32_t *p_version) +{ + size_t num_ix = 0; + size_t pos = 0; + while (*fmt) { + char c = *fmt++; + if (c >= 'a' && c <= 'z') { + if (pos >= str.length) return false; + char s = str.data[pos]; + if (s != c && (int)s + (int)('a' - 'A') != (int)c) return false; + pos++; + } else if (c == ' ') { + while (pos < str.length) { + char s = str.data[pos]; + if (s != ' ' && s != '\t') break; + pos++; + } + } else if (c == '-') { + while (pos < str.length) { + char s = str.data[pos]; + if (s == '-') break; + pos++; + } + if (pos >= str.length) return false; + pos++; + } else if (c == '/' || c == '.' || c == '(' || c == ')') { + if (pos >= str.length) return false; + if (str.data[pos] != c) return false; + pos++; + } else if (c == '?') { + uint32_t num = 0; + size_t len = 0; + while (pos < str.length) { + char s = str.data[pos]; + if (!(s >= '0' && s <= '9')) break; + num = num*10 + (uint32_t)(s - '0'); + pos++; + len++; + } + if (len == 0) return false; + p_version[num_ix++] = num; + } else { + ufbx_assert(0 && "Unhandled match character"); + } + } + + return true; +} + +ufbxi_nodiscard static int ufbxi_match_exporter(ufbxi_context *uc) +{ + ufbx_string creator = uc->scene.metadata.creator; + uint32_t version[3] = { 0 }; + if (ufbxi_match_version_string("blender-- ?.?.?", creator, version)) { + uc->exporter = UFBX_EXPORTER_BLENDER_BINARY; + uc->exporter_version = ufbx_pack_version(version[0], version[1], version[2]); + } else if (ufbxi_match_version_string("blender- ?.?", creator, version)) { + uc->exporter = UFBX_EXPORTER_BLENDER_BINARY; + uc->exporter_version = ufbx_pack_version(version[0], version[1], 0); + } else if (ufbxi_match_version_string("blender version ?.?", creator, version)) { + uc->exporter = UFBX_EXPORTER_BLENDER_ASCII; + uc->exporter_version = ufbx_pack_version(version[0], version[1], 0); + } else if (ufbxi_match_version_string("fbx sdk/fbx plugins version ?.?", creator, version)) { + uc->exporter = UFBX_EXPORTER_FBX_SDK; + uc->exporter_version = ufbx_pack_version(version[0], version[1], 0); + } else if (ufbxi_match_version_string("fbx sdk/fbx plugins build ?", creator, version)) { + uc->exporter = UFBX_EXPORTER_FBX_SDK; + uc->exporter_version = ufbx_pack_version(version[0]/10000u, version[0]/100u%100u, version[0]%100u); + } else if (ufbxi_match_version_string("motionbuilder version ?.?", creator, version)) { + uc->exporter = UFBX_EXPORTER_MOTION_BUILDER; + uc->exporter_version = ufbx_pack_version(version[0], version[1], 0); + } else if (ufbxi_match_version_string("motionbuilder/mocap/online version ?.?", creator, version)) { + uc->exporter = UFBX_EXPORTER_MOTION_BUILDER; + uc->exporter_version = ufbx_pack_version(version[0], version[1], 0); + } else if (ufbxi_match_version_string("fbx unity export version ?.?", creator, version)) { + uc->exporter = UFBX_EXPORTER_BC_UNITY_EXPORTER; + uc->exporter_version = ufbx_pack_version(version[0], version[1], 0); + } else if (ufbxi_match_version_string("fbx unity export version ?.?.?", creator, version)) { + uc->exporter = UFBX_EXPORTER_BC_UNITY_EXPORTER; + uc->exporter_version = ufbx_pack_version(version[0], version[1], version[2]); + } else if (ufbxi_match_version_string("made using asset forge", creator, version)) { + uc->exporter = UFBX_EXPORTER_BC_UNITY_EXPORTER; + } else if (ufbxi_match_version_string("model created by kenney", creator, version)) { + uc->exporter = UFBX_EXPORTER_BC_UNITY_EXPORTER; + } + + uc->scene.metadata.exporter = uc->exporter; + uc->scene.metadata.exporter_version = uc->exporter_version; + + // Un-detect the exporter in `ufbxi_context` to disable special cases + if (uc->opts.disable_quirks) { + uc->exporter = UFBX_EXPORTER_UNKNOWN; + uc->exporter_version = 0; + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_read_document(ufbxi_context *uc) +{ + bool found_root_id = 0; + + for (;;) { + ufbxi_node *child; + ufbxi_check(ufbxi_parse_toplevel_child(uc, &child)); + if (!child) break; + + if (child->name == ufbxi_Document && !found_root_id) { + // Post-7000: Try to find the first document node and root ID. + // TODO: Multiple documents / roots? + if (ufbxi_find_val1(child, ufbxi_RootNode, "L", &uc->root_id)) { + found_root_id = true; + } + } + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_read_definitions(ufbxi_context *uc) +{ + for (;;) { + ufbxi_node *object; + ufbxi_check(ufbxi_parse_toplevel_child(uc, &object)); + if (!object) break; + + if (object->name != ufbxi_ObjectType) continue; + + ufbxi_template *tmpl = ufbxi_push_zero(&uc->tmp_stack, ufbxi_template, 1); + uc->num_templates++; + ufbxi_check(tmpl); + ufbxi_check(ufbxi_get_val1(object, "C", (char**)&tmpl->type)); + + // Pre-7000 FBX versions don't have property templates, they just have + // the object counts by themselves. + ufbxi_node *props = ufbxi_find_child(object, ufbxi_PropertyTemplate); + if (props) { + ufbxi_check(ufbxi_get_val1(props, "S", &tmpl->sub_type)); + + // Remove the "Fbx" prefix from sub-types, remember to re-intern! + if (tmpl->sub_type.length > 3 && !strncmp(tmpl->sub_type.data, "Fbx", 3)) { + tmpl->sub_type.data += 3; + tmpl->sub_type.length -= 3; + + // HACK: LOD groups use LODGroup for Template, LodGroup for Object? + if (tmpl->sub_type.length == 8 && !memcmp(tmpl->sub_type.data, "LODGroup", 8)) { + tmpl->sub_type.data = "LodGroup"; + } + + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &tmpl->sub_type, false)); + } + + ufbxi_check(ufbxi_read_properties(uc, props, &tmpl->props)); + } + } + + // TODO: Preserve only the `props` part of the templates + uc->templates = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbxi_template, uc->num_templates); + ufbxi_check(uc->templates); + + return 1; +} + +ufbxi_nodiscard static ufbx_props *ufbxi_find_template(ufbxi_context *uc, const char *name, const char *sub_type) +{ + // TODO: Binary search + ufbxi_for(ufbxi_template, tmpl, uc->templates, uc->num_templates) { + if (tmpl->type == name) { + + // Check that sub_type matches unless the type is Material, Model, AnimationStack, AnimationLayer. + // Those match to all sub-types. + if (tmpl->type != ufbxi_Material && tmpl->type != ufbxi_Model + && tmpl->type != ufbxi_AnimationStack && tmpl->type != ufbxi_AnimationLayer) { + if (tmpl->sub_type.data != sub_type) { + return NULL; + } + } + + if (tmpl->props.props.count > 0) { + return &tmpl->props; + } else { + return NULL; + } + } + } + return NULL; +} + +// Name ID categories +#define UFBXI_SYNTHETIC_ID_BIT UINT64_C(0x8000000000000000) + +ufbx_static_assert(uptr_size, sizeof(uintptr_t) <= sizeof(uint64_t)); + +static ufbxi_forceinline uint64_t ufbxi_synthetic_id_from_pointer(const void *ptr) +{ + uintptr_t uptr = (uintptr_t)ptr; + ufbx_assert((uptr & 0x1) == 0); + return (uptr >> 1u) | UFBXI_SYNTHETIC_ID_BIT; +} + +static ufbxi_forceinline uint64_t ufbxi_synthetic_id_from_string(const char *str) +{ + uintptr_t uptr = (uintptr_t)str; + uptr &= ~(uintptr_t)1; + return (uptr >> 1u) | UFBXI_SYNTHETIC_ID_BIT; +} + +static ufbxi_noinline int ufbxi_push_synthetic_id(ufbxi_context *uc, uint64_t *p_dst) +{ + void *ptr = ufbxi_push_size(&uc->tmp, 8, 1); + ufbxi_check(ptr); + *p_dst = ufbxi_synthetic_id_from_pointer(ptr); + return 1; +} + +ufbxi_nodiscard static int ufbxi_split_type_and_name(ufbxi_context *uc, ufbx_string type_and_name, ufbx_string *type, ufbx_string *name) +{ + // Name and type are packed in a single property as Type::Name (in ASCII) + // or Name\x00\x01Type (in binary) + const char *sep = uc->from_ascii ? "::" : "\x00\x01"; + size_t type_end = 2; + for (; type_end <= type_and_name.length; type_end++) { + const char *ch = type_and_name.data + type_end - 2; + if (ch[0] == sep[0] && ch[1] == sep[1]) break; + } + + // ???: ASCII and binary store type and name in different order + if (type_end <= type_and_name.length) { + if (uc->from_ascii) { + name->data = type_and_name.data + type_end; + name->length = type_and_name.length - type_end; + type->data = type_and_name.data; + type->length = type_end - 2; + } else { + name->data = type_and_name.data; + name->length = type_end - 2; + type->data = type_and_name.data + type_end; + type->length = type_and_name.length - type_end; + } + } else { + *name = type_and_name; + type->data = ufbxi_empty_char; + type->length = 0; + } + + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, type, false)); + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, name, false)); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_insert_fbx_id(ufbxi_context *uc, uint64_t fbx_id, uint32_t element_id) +{ + uint32_t hash = ufbxi_hash64(fbx_id); + ufbxi_fbx_id_entry *entry = ufbxi_map_find(&uc->fbx_id_map, ufbxi_fbx_id_entry, hash, &fbx_id); + + if (!entry) { + entry = ufbxi_map_insert(&uc->fbx_id_map, ufbxi_fbx_id_entry, hash, &fbx_id); + ufbxi_check(entry); + entry->fbx_id = fbx_id; + entry->element_id = element_id; + entry->user_id = 0; + } else { + ufbxi_check(ufbxi_warnf(UFBX_WARNING_DUPLICATE_OBJECT_ID, "Duplicate object ID")); + } + + return 1; +} + +static ufbxi_noinline ufbxi_fbx_id_entry *ufbxi_find_fbx_id(ufbxi_context *uc, uint64_t fbx_id) +{ + uint32_t hash = ufbxi_hash64(fbx_id); + return ufbxi_map_find(&uc->fbx_id_map, ufbxi_fbx_id_entry, hash, &fbx_id); +} + +static ufbxi_forceinline bool ufbxi_fbx_id_exists(ufbxi_context *uc, uint64_t fbx_id) +{ + return ufbxi_find_fbx_id(uc, fbx_id) != NULL; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_insert_fbx_attr(ufbxi_context *uc, uint64_t fbx_id, uint64_t attrib_fbx_id) +{ + uint32_t hash = ufbxi_hash64(fbx_id); + ufbxi_fbx_attr_entry *entry = ufbxi_map_find(&uc->fbx_attr_map, ufbxi_fbx_attr_entry, hash, &fbx_id); + // TODO: Strict / warn about duplicate objects + + if (!entry) { + entry = ufbxi_map_insert(&uc->fbx_attr_map, ufbxi_fbx_attr_entry, hash, &fbx_id); + ufbxi_check(entry); + entry->node_fbx_id = fbx_id; + entry->attr_fbx_id = attrib_fbx_id; + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static ufbx_element *ufbxi_push_element_size(ufbxi_context *uc, ufbxi_element_info *info, size_t size, ufbx_element_type type) +{ + size_t aligned_size = (size + 7u) & ~0x7u; + + uint32_t typed_id = (uint32_t)uc->tmp_typed_element_offsets[type].num_items; + uint32_t element_id = uc->num_elements++; + + ufbxi_check_return(ufbxi_push_copy(&uc->tmp_typed_element_offsets[type], size_t, 1, &uc->tmp_element_byte_offset), NULL); + ufbxi_check_return(ufbxi_push_copy(&uc->tmp_element_offsets, size_t, 1, &uc->tmp_element_byte_offset), NULL); + uc->tmp_element_byte_offset += aligned_size; + + ufbx_element *elem = (ufbx_element*)ufbxi_push_zero(&uc->tmp_elements, uint64_t, aligned_size/8); + ufbxi_check_return(elem, NULL); + elem->type = type; + elem->element_id = element_id; + elem->typed_id = typed_id; + elem->name = info->name; + elem->props = info->props; + elem->dom_node = info->dom_node; + + ufbxi_check_return(ufbxi_push_copy(&uc->tmp_element_ptrs, ufbx_element*, 1, &elem), NULL); + + ufbxi_check_return(ufbxi_insert_fbx_id(uc, info->fbx_id, element_id), NULL); + + return elem; +} + +ufbxi_nodiscard ufbxi_noinline static ufbx_element *ufbxi_push_synthetic_element_size(ufbxi_context *uc, uint64_t *p_fbx_id, ufbxi_node *node, const char *name, size_t size, ufbx_element_type type) +{ + size_t aligned_size = (size + 7u) & ~0x7u; + + uint32_t typed_id = (uint32_t)uc->tmp_typed_element_offsets[type].num_items; + uint32_t element_id = uc->num_elements++; + + ufbxi_check_return(ufbxi_push_copy(&uc->tmp_typed_element_offsets[type], size_t, 1, &uc->tmp_element_byte_offset), NULL); + ufbxi_check_return(ufbxi_push_copy(&uc->tmp_element_offsets, size_t, 1, &uc->tmp_element_byte_offset), NULL); + uc->tmp_element_byte_offset += aligned_size; + + ufbx_element *elem = (ufbx_element*)ufbxi_push_zero(&uc->tmp_elements, uint64_t, aligned_size/8); + ufbxi_check_return(elem, NULL); + elem->type = type; + elem->element_id = element_id; + elem->typed_id = typed_id; + elem->dom_node = ufbxi_get_dom_node(uc, node); + if (name) { + elem->name.data = name; + elem->name.length = strlen(name); + } + + ufbxi_check_return(ufbxi_push_copy(&uc->tmp_element_ptrs, ufbx_element*, 1, &elem), NULL); + + uint64_t fbx_id = ufbxi_synthetic_id_from_pointer(elem); + *p_fbx_id = fbx_id; + + ufbxi_check_return(ufbxi_insert_fbx_id(uc, fbx_id, element_id), NULL); + + return elem; +} + +#define ufbxi_push_element(uc, info, type_name, type_enum) ufbxi_maybe_null((type_name*)ufbxi_push_element_size((uc), (info), sizeof(type_name), (type_enum))) +#define ufbxi_push_synthetic_element(uc, p_fbx_id, node, name, type_name, type_enum) ufbxi_maybe_null((type_name*)ufbxi_push_synthetic_element_size((uc), (p_fbx_id), (node), (name), sizeof(type_name), (type_enum))) + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_connect_oo(ufbxi_context *uc, uint64_t src, uint64_t dst) +{ + ufbxi_tmp_connection *conn = ufbxi_push(&uc->tmp_connections, ufbxi_tmp_connection, 1); + ufbxi_check(conn); + conn->src = src; + conn->dst = dst; + conn->src_prop = conn->dst_prop = ufbx_empty_string; + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_connect_op(ufbxi_context *uc, uint64_t src, uint64_t dst, ufbx_string prop) +{ + ufbxi_tmp_connection *conn = ufbxi_push(&uc->tmp_connections, ufbxi_tmp_connection, 1); + ufbxi_check(conn); + conn->src = src; + conn->dst = dst; + conn->src_prop = ufbx_empty_string; + conn->dst_prop = prop; + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_connect_pp(ufbxi_context *uc, uint64_t src, uint64_t dst, ufbx_string src_prop, ufbx_string dst_prop) +{ + ufbxi_tmp_connection *conn = ufbxi_push(&uc->tmp_connections, ufbxi_tmp_connection, 1); + ufbxi_check(conn); + conn->src = src; + conn->dst = dst; + conn->src_prop = src_prop; + conn->dst_prop = dst_prop; + return 1; +} + +ufbxi_noinline static void ufbxi_init_synthetic_vec3_prop(ufbx_prop *dst, const char *name, const ufbx_vec3 *value, ufbx_prop_type type) +{ + dst->type = type; + dst->name.data = name; + dst->name.length = strlen(name); + dst->value_vec3 = *value; + dst->flags = (ufbx_prop_flags)(UFBX_PROP_FLAG_SYNTHETIC|UFBX_PROP_FLAG_VALUE_VEC3|UFBX_PROP_FLAG_VALUE_INT); + dst->value_int = ufbxi_f64_to_i64(dst->value_real); + dst->value_str.data = ufbxi_empty_char; + + ufbxi_dev_assert(dst->name.length >= 4); + dst->_internal_key = ufbxi_get_name_key(name, 4); +} + +ufbxi_noinline static void ufbxi_set_own_prop_vec3_uniform(ufbx_props *props, const char *name, ufbx_real value) +{ + ufbx_props local_props = *props; + local_props.defaults = NULL; + ufbx_prop *prop = ufbx_find_prop(&local_props, name); + if (prop) { + prop->value_vec4.x = value; + prop->value_vec4.y = value; + prop->value_vec4.z = value; + prop->value_vec4.w = 0.0f; + prop->value_int = (int64_t)value; + } +} + +typedef struct { + uint32_t geometry_helper_id; +} ufbxi_node_extra; + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_setup_geometry_transform_helper(ufbxi_context *uc, ufbx_node *node, uint64_t node_fbx_id) +{ + ufbx_vec3 geo_translation = ufbxi_find_vec3(&node->props, ufbxi_GeometricTranslation, 0.0f, 0.0f, 0.0f); + ufbx_vec3 geo_rotation = ufbxi_find_vec3(&node->props, ufbxi_GeometricRotation, 0.0f, 0.0f, 0.0f); + ufbx_vec3 geo_scaling = ufbxi_find_vec3(&node->props, ufbxi_GeometricScaling, 1.0f, 1.0f, 1.0f); + if (!ufbxi_is_vec3_zero(geo_translation) || !ufbxi_is_vec3_zero(geo_rotation) || !ufbxi_is_vec3_one(geo_scaling)) { + + uint64_t geo_fbx_id; + ufbx_node *geo_node = ufbxi_push_synthetic_element(uc, &geo_fbx_id, NULL, uc->opts.geometry_transform_helper_name.data, ufbx_node, UFBX_ELEMENT_NODE); + ufbxi_check(geo_node); + ufbxi_check(ufbxi_push_copy(&uc->tmp_node_ids, uint32_t, 1, &geo_node->element.element_id)); + geo_node->element.dom_node = node->element.dom_node; + + ufbx_prop *props = ufbxi_push_zero(&uc->result, ufbx_prop, 3); + ufbxi_check(props); + ufbxi_init_synthetic_vec3_prop(&props[0], ufbxi_Lcl_Rotation, &geo_rotation, UFBX_PROP_ROTATION); + ufbxi_init_synthetic_vec3_prop(&props[1], ufbxi_Lcl_Scaling, &geo_scaling, UFBX_PROP_SCALING); + ufbxi_init_synthetic_vec3_prop(&props[2], ufbxi_Lcl_Translation, &geo_translation, UFBX_PROP_TRANSLATION); + + geo_node->props.props.data = props; + geo_node->props.props.count = 3; + + node->has_geometry_transform = true; + geo_node->is_geometry_transform_helper = true; + + ufbxi_check(ufbxi_connect_oo(uc, geo_fbx_id, node_fbx_id)); + uc->has_geometry_transform_nodes = true; + + ufbxi_node_extra *extra = ufbxi_push_element_extra(uc, node->element_id, ufbxi_node_extra); + ufbxi_check(extra); + extra->geometry_helper_id = geo_node->element_id; + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_model(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + (void)node; + ufbx_node *elem_node = ufbxi_push_element(uc, info, ufbx_node, UFBX_ELEMENT_NODE); + ufbxi_check(elem_node); + ufbxi_check(ufbxi_push_copy(&uc->tmp_node_ids, uint32_t, 1, &elem_node->element.element_id)); + + if (uc->opts.geometry_transform_handling == UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES) { + ufbxi_check(ufbxi_setup_geometry_transform_helper(uc, elem_node, info->fbx_id)); + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_element(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info, size_t size, ufbx_element_type type) +{ + (void)node; + ufbx_element *elem = ufbxi_push_element_size(uc, info, size, type); + ufbxi_check(elem); + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_unknown(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *element, ufbx_string type, ufbx_string sub_type, const char *node_name) +{ + (void)node; + ufbx_unknown *unknown = ufbxi_push_element(uc, element, ufbx_unknown, UFBX_ELEMENT_UNKNOWN); + ufbxi_check(unknown); + unknown->type = type; + unknown->sub_type = sub_type; + unknown->super_type.data = node_name; + unknown->super_type.length = strlen(node_name); + + // `type`, `sub_type` and `node_name` are raw strings so they may need to be sanitized. + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &unknown->type, false)); + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &unknown->sub_type, false)); + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &unknown->super_type, false)); + + return 1; +} + +typedef struct { + ufbx_vertex_vec3 elem; + uint32_t index; +} ufbxi_tangent_layer; + +static ufbx_real ufbxi_zero_element[8] = { 0 }; + +// Sentinel pointers used for zero/sequential index buffers +static const uint32_t ufbxi_sentinel_index_zero[1] = { 100000000 }; +static const uint32_t ufbxi_sentinel_index_consecutive[1] = { 123456789 }; + +ufbxi_noinline static int ufbxi_fix_index(ufbxi_context *uc, uint32_t *p_dst, uint32_t index, size_t one_past_max_val) +{ + switch (uc->opts.index_error_handling) { + case UFBX_INDEX_ERROR_HANDLING_CLAMP: + ufbxi_check(one_past_max_val > 0); + ufbxi_check(one_past_max_val <= UINT32_MAX); + *p_dst = (uint32_t)one_past_max_val - 1; + ufbxi_check(ufbxi_warnf(UFBX_WARNING_INDEX_CLAMPED, "Clamped index")); + break; + case UFBX_INDEX_ERROR_HANDLING_NO_INDEX: + *p_dst = UFBX_NO_INDEX; + break; + case UFBX_INDEX_ERROR_HANDLING_ABORT_LOADING: + ufbxi_fmt_err_info(&uc->error, "%u (max %u)", index, one_past_max_val ? (one_past_max_val - 1) : 0); + ufbxi_fail_msg("UFBX_INDEX_ERROR_HANDLING_ABORT_LOADING", "Bad index"); + break; + case UFBX_INDEX_ERROR_HANDLING_UNSAFE_IGNORE: + *p_dst = index; + break; + default: + ufbx_assert(0 && "Unhandled index_error_handling"); + return 0; + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_check_indices(ufbxi_context *uc, uint32_t **p_dst, uint32_t *indices, bool owns_indices, size_t num_indices, size_t num_indexers, size_t num_elems) +{ + // If the indices are truncated extend them with `UFBX_NO_INDEX`, the following normalization pass + // will handle them the same way as other out-of-bounds indices. + if (num_indices < num_indexers) { + uint32_t *new_indices = ufbxi_push(&uc->result, uint32_t, num_indexers); + ufbxi_check(new_indices); + + memcpy(new_indices, indices, sizeof(uint32_t) * num_indices); + for (size_t i = num_indices; i < num_indexers; i++) { + new_indices[i] = UFBX_NO_INDEX; + } + + indices = new_indices; + num_indices = num_indexers; + owns_indices = true; + } + + // Normalize out-of-bounds indices to `invalid_index` + for (size_t i = 0; i < num_indices; i++) { + uint32_t ix = indices[i]; + if (ix >= num_elems) { + // If the indices refer to an external buffer we need to + // allocate a separate buffer for them + if (!owns_indices) { + indices = ufbxi_push_copy(&uc->result, uint32_t, num_indices, indices); + ufbxi_check(indices); + owns_indices = true; + } + ufbxi_check(ufbxi_fix_index(uc, &indices[i], ix, num_elems)); + } + } + + *p_dst = indices; + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_vertex_element(ufbxi_context *uc, ufbx_mesh *mesh, ufbxi_node *node, + ufbx_vertex_attrib *attrib, const char *data_name, const char *index_name, char data_type, size_t num_components) +{ + ufbx_real **p_dst_data = (ufbx_real**)&attrib->values.data; + + ufbxi_value_array *data = ufbxi_find_array(node, data_name, data_type); + ufbxi_value_array *indices = ufbxi_find_array(node, index_name, 'i'); + + if (!uc->opts.strict) { + if (!data) return 1; + } + + ufbxi_check(data); + ufbxi_check(data->size % num_components == 0); + + size_t num_elems = data->size / num_components; + + // HACK: If there's no elements at all keep the attribute as NULL + // TODO: Strict mode for this? + if (num_elems == 0) { + return 1; + } + + ufbxi_check(num_elems > 0 && num_elems < INT32_MAX); + + attrib->exists = true; + attrib->indices.count = mesh->num_indices; + + const char *mapping; + ufbxi_check(ufbxi_find_val1(node, ufbxi_MappingInformationType, "C", (char**)&mapping)); + + attrib->values.count = num_elems ? num_elems : 1; + + // Data array is always used as-is, if empty set the data to a global + // zero buffer so invalid zero index can point to some valid data. + // The zero data is offset by 4 elements to accommodate for invalid index (-1) + if (num_elems > 0) { + *p_dst_data = (ufbx_real*)data->data; + } else { + *p_dst_data = ufbxi_zero_element + 4; + } + + if (indices) { + size_t num_indices = indices->size; + uint32_t *index_data = (uint32_t*)indices->data; + + if (mapping == ufbxi_ByPolygonVertex || mapping == ufbxi_ByPolygon) { + + // Indexed by polygon vertex: We can use the provided indices directly. + ufbxi_check(ufbxi_check_indices(uc, &attrib->indices.data, index_data, true, num_indices, mesh->num_indices, num_elems)); + + } else if (mapping == ufbxi_ByVertex || mapping == ufbxi_ByVertice) { + + // Indexed by vertex: Follow through the position index mapping to get the final indices. + uint32_t *new_index_data = ufbxi_push(&uc->result, uint32_t, mesh->num_indices); + ufbxi_check(new_index_data); + + uint32_t *vert_ix = mesh->vertex_indices.data; + for (size_t i = 0; i < mesh->num_indices; i++) { + uint32_t ix = vert_ix[i]; + if (ix < num_indices) { + new_index_data[i] = index_data[ix]; + } else { + ufbxi_check(ufbxi_fix_index(uc, &new_index_data[i], ix, num_elems)); + } + } + + ufbxi_check(ufbxi_check_indices(uc, &attrib->indices.data, new_index_data, true, mesh->num_indices, mesh->num_indices, num_elems)); + attrib->unique_per_vertex = true; + + } else if (mapping == ufbxi_AllSame) { + + // Indexed by all same: ??? This could be possibly used for making + // holes with invalid indices, but that seems really fringe. + // Just use the shared zero index buffer for this. + uc->max_zero_indices = ufbxi_max_sz(uc->max_zero_indices, mesh->num_indices); + attrib->indices.data = (uint32_t*)ufbxi_sentinel_index_zero; + attrib->unique_per_vertex = true; + + } else { + ufbxi_fail("Invalid mapping"); + } + + } else { + + if (mapping == ufbxi_ByPolygonVertex || mapping == ufbxi_ByPolygon) { + + // Direct by polygon index: Use shared consecutive array if there's enough + // elements, otherwise use a unique truncated consecutive index array. + if (num_elems >= mesh->num_indices) { + uc->max_consecutive_indices = ufbxi_max_sz(uc->max_consecutive_indices, mesh->num_indices); + attrib->indices.data = (uint32_t*)ufbxi_sentinel_index_consecutive; + } else { + uint32_t *index_data = ufbxi_push(&uc->result, uint32_t, mesh->num_indices); + ufbxi_check(index_data); + for (size_t i = 0; i < mesh->num_indices; i++) { + index_data[i] = (uint32_t)i; + } + ufbxi_check(ufbxi_check_indices(uc, &attrib->indices.data, index_data, true, mesh->num_indices, mesh->num_indices, num_elems)); + } + + } else if (mapping == ufbxi_ByVertex || mapping == ufbxi_ByVertice) { + + // Direct by vertex: We can re-use the position indices.. + ufbxi_check(ufbxi_check_indices(uc, &attrib->indices.data, mesh->vertex_position.indices.data, false, mesh->num_indices, mesh->num_indices, num_elems)); + attrib->unique_per_vertex = true; + + } else if (mapping == ufbxi_AllSame) { + + // Direct by all same: This cannot fail as the index list is just zero. + uc->max_zero_indices = ufbxi_max_sz(uc->max_zero_indices, mesh->num_indices); + attrib->indices.data = (uint32_t*)ufbxi_sentinel_index_zero; + attrib->unique_per_vertex = true; + + } else { + ufbxi_fail("Invalid mapping"); + } + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_truncated_array(ufbxi_context *uc, void *p_data, size_t *p_count, ufbxi_node *node, const char *name, char fmt, size_t size) +{ + ufbxi_value_array *arr = ufbxi_find_array(node, name, fmt); + ufbxi_check(arr); + + *p_count = size; + + void *data = arr->data; + if (arr->size < size) { + ufbxi_check(ufbxi_warnf(UFBX_WARNING_TRUNCATED_ARRAY, "Truncated array: %s", name)); + + size_t elem_size = ufbxi_array_type_size(fmt); + void *new_data = ufbxi_push_size(&uc->result, elem_size, size); + ufbxi_check(new_data); + memcpy(new_data, data, arr->size * elem_size); + // Extend the array with the last element if possible + if (arr->size > 0) { + char *first_elem = (char*)data + (arr->size - 1) * elem_size; + for (size_t i = arr->size; i < size; i++) { + memcpy((char*)new_data + i * elem_size, first_elem, elem_size); + } + } else { + memset(new_data, 0, size * elem_size); + } + data = new_data; + } + + *(void**)p_data = data; + return 1; +} + +ufbxi_noinline static bool ufbxi_uv_set_less(void *user, const void *va, const void *vb) +{ + (void)user; + const ufbx_uv_set *a = (const ufbx_uv_set *)va, *b = (const ufbx_uv_set *)vb; + return a->index < b->index; +} + +ufbxi_noinline static bool ufbxi_color_set_less(void *user, const void *va, const void *vb) +{ + (void)user; + const ufbx_color_set *a = (const ufbx_color_set *)va, *b = (const ufbx_color_set *)vb; + return a->index < b->index; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_uv_sets(ufbxi_context *uc, ufbx_uv_set *sets, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbx_uv_set))); + ufbxi_stable_sort(sizeof(ufbx_uv_set), 32, sets, uc->tmp_arr, count, &ufbxi_uv_set_less, NULL); + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_color_sets(ufbxi_context *uc, ufbx_color_set *sets, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbx_color_set))); + ufbxi_stable_sort(sizeof(ufbx_color_set), 32, sets, uc->tmp_arr, count, &ufbxi_color_set_less, NULL); + return 1; +} + +typedef struct ufbxi_blend_offset { + uint32_t vertex; + ufbx_vec3 position_offset; + ufbx_vec3 normal_offset; +} ufbxi_blend_offset; + +static ufbxi_noinline bool ufbxi_blend_offset_less(void *user, const void *va, const void *vb) +{ + (void)user; + const ufbxi_blend_offset *a = (const ufbxi_blend_offset*)va, *b = (const ufbxi_blend_offset*)vb; + return a->vertex < b->vertex; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_blend_offsets(ufbxi_context *uc, ufbxi_blend_offset *offsets, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbxi_blend_offset))); + ufbxi_stable_sort(sizeof(ufbxi_blend_offset), 16, offsets, uc->tmp_arr, count, &ufbxi_blend_offset_less, NULL); + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_shape(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbxi_node *node_vertices = ufbxi_find_child(node, ufbxi_Vertices); + ufbxi_node *node_indices = ufbxi_find_child(node, ufbxi_Indexes); + ufbxi_node *node_normals = ufbxi_find_child(node, ufbxi_Normals); + if (!node_vertices || !node_indices) return 1; + + ufbx_blend_shape *shape = ufbxi_push_element(uc, info, ufbx_blend_shape, UFBX_ELEMENT_BLEND_SHAPE); + ufbxi_check(shape); + + if (uc->opts.ignore_geometry) return 1; + + ufbxi_value_array *vertices = ufbxi_get_array(node_vertices, 'r'); + ufbxi_value_array *indices = ufbxi_get_array(node_indices, 'i'); + + ufbxi_check(vertices && indices); + ufbxi_check(vertices->size % 3 == 0); + ufbxi_check(indices->size == vertices->size / 3); + + size_t num_offsets = indices->size; + uint32_t *vertex_indices = (uint32_t*)indices->data; + + shape->num_offsets = num_offsets; + shape->position_offsets.data = (ufbx_vec3*)vertices->data; + shape->offset_vertices.data = vertex_indices; + shape->position_offsets.count = num_offsets; + shape->offset_vertices.count = num_offsets; + + if (node_normals) { + ufbxi_value_array *normals = ufbxi_get_array(node_normals, 'r'); + ufbxi_check(normals && normals->size == vertices->size); + shape->normal_offsets.data = (ufbx_vec3*)normals->data; + shape->normal_offsets.count = num_offsets; + } + + // Sort the blend shape vertices only if absolutely necessary + bool sorted = true; + for (size_t i = 1; i < num_offsets; i++) { + if (vertex_indices[i - 1] > vertex_indices[i]) { + sorted = false; + break; + } + } + + if (!sorted) { + ufbxi_blend_offset *offsets = ufbxi_push(&uc->tmp_stack, ufbxi_blend_offset, num_offsets); + ufbxi_check(offsets); + + for (size_t i = 0; i < num_offsets; i++) { + offsets[i].vertex = shape->offset_vertices.data[i]; + offsets[i].position_offset = shape->position_offsets.data[i]; + if (node_normals) offsets[i].normal_offset = shape->normal_offsets.data[i]; + } + + ufbxi_check(ufbxi_sort_blend_offsets(uc, offsets, num_offsets)); + + for (size_t i = 0; i < num_offsets; i++) { + shape->offset_vertices.data[i] = offsets[i].vertex; + shape->position_offsets.data[i] = offsets[i].position_offset; + if (node_normals) shape->normal_offsets.data[i] = offsets[i].normal_offset; + } + ufbxi_pop(&uc->tmp_stack, ufbxi_blend_offset, num_offsets, NULL); + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_synthetic_blend_shapes(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_blend_deformer *deformer = NULL; + uint64_t deformer_fbx_id = 0; + + ufbxi_for (ufbxi_node, n, node->children, node->num_children) { + if (n->name != ufbxi_Shape) continue; + + ufbx_string name; + ufbxi_check(ufbxi_get_val1(n, "S", &name)); + + if (deformer == NULL) { + deformer = ufbxi_push_synthetic_element(uc, &deformer_fbx_id, n, name.data, ufbx_blend_deformer, UFBX_ELEMENT_BLEND_DEFORMER); + ufbxi_check(deformer); + ufbxi_check(ufbxi_connect_oo(uc, deformer_fbx_id, info->fbx_id)); + } + + uint64_t channel_fbx_id = 0; + ufbx_blend_channel *channel = ufbxi_push_synthetic_element(uc, &channel_fbx_id, n, name.data, ufbx_blend_channel, UFBX_ELEMENT_BLEND_CHANNEL); + ufbxi_check(channel); + + ufbx_real_list weight_list = { NULL, 0 }; + ufbxi_check(ufbxi_push_copy(&uc->tmp_full_weights, ufbx_real_list, 1, &weight_list)); + + size_t num_shape_props = 1; + ufbx_prop *shape_props = ufbxi_push_zero(&uc->result, ufbx_prop, num_shape_props); + ufbxi_check(shape_props); + shape_props[0].name.data = ufbxi_DeformPercent; + shape_props[0].name.length = sizeof(ufbxi_DeformPercent) - 1; + shape_props[0]._internal_key = ufbxi_get_name_key_c(ufbxi_DeformPercent); + shape_props[0].type = UFBX_PROP_NUMBER; + shape_props[0].value_real = (ufbx_real)0.0; + shape_props[0].value_str = ufbx_empty_string; + shape_props[0].value_blob = ufbx_empty_blob; + + ufbx_prop *self_prop = ufbx_find_prop_len(&info->props, name.data, name.length); + if (self_prop && (self_prop->type == UFBX_PROP_NUMBER || self_prop->type == UFBX_PROP_INTEGER)) { + shape_props[0].value_real = self_prop->value_real; + ufbxi_check(ufbxi_connect_pp(uc, info->fbx_id, channel_fbx_id, name, shape_props[0].name)); + } else if (uc->version < 6000) { + ufbxi_check(ufbxi_connect_pp(uc, info->fbx_id, channel_fbx_id, name, shape_props[0].name)); + } + + channel->name = name; + channel->props.props.data = shape_props; + channel->props.props.count = num_shape_props; + + ufbxi_element_info shape_info = { 0 }; + + ufbxi_check(ufbxi_push_synthetic_id(uc, &shape_info.fbx_id)); + shape_info.name = name; + shape_info.dom_node = ufbxi_get_dom_node(uc, n); + + ufbxi_check(ufbxi_read_shape(uc, n, &shape_info)); + + ufbxi_check(ufbxi_connect_oo(uc, channel_fbx_id, deformer_fbx_id)); + ufbxi_check(ufbxi_connect_oo(uc, shape_info.fbx_id, channel_fbx_id)); + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_process_indices(ufbxi_context *uc, ufbx_mesh *mesh, uint32_t *index_data) +{ + // Count the number of faces and allocate the index list + // Indices less than zero (~actual_index) ends a polygon + size_t num_total_faces = 0; + ufbxi_for (uint32_t, p_ix, index_data, mesh->num_indices) { + num_total_faces += ((int32_t)*p_ix < 0) ? 1u : 0u; + } + mesh->faces.data = ufbxi_push(&uc->result, ufbx_face, num_total_faces); + ufbxi_check(mesh->faces.data); + + size_t num_triangles = 0; + size_t max_face_triangles = 0; + size_t num_bad_faces[3] = { 0 }; + + ufbx_face *dst_face = mesh->faces.data; + uint32_t *p_face_begin = index_data; + ufbxi_for (uint32_t, p_ix, index_data, mesh->num_indices) { + uint32_t ix = *p_ix; + // Un-negate final indices of polygons + if ((int32_t)ix < 0) { + ix = ~ix; + *p_ix = ix; + uint32_t num_indices = (uint32_t)((p_ix - p_face_begin) + 1); + dst_face->index_begin = (uint32_t)(p_face_begin - index_data); + dst_face->num_indices = num_indices; + if (num_indices >= 3) { + num_triangles += num_indices - 2; + max_face_triangles = ufbxi_max_sz(max_face_triangles, num_indices - 2); + } else { + num_bad_faces[num_indices]++; + } + dst_face++; + p_face_begin = p_ix + 1; + } + ufbxi_check((size_t)ix < mesh->num_vertices); + } + + mesh->vertex_position.indices.data = index_data; + mesh->num_faces = ufbxi_to_size(dst_face - mesh->faces.data); + mesh->faces.count = mesh->num_faces; + mesh->num_triangles = num_triangles; + mesh->max_face_triangles = max_face_triangles; + mesh->num_empty_faces = num_bad_faces[0]; + mesh->num_point_faces = num_bad_faces[1]; + mesh->num_line_faces = num_bad_faces[2]; + + mesh->vertex_first_index.count = mesh->num_vertices; + mesh->vertex_first_index.data = ufbxi_push(&uc->result, uint32_t, mesh->num_vertices); + ufbxi_check(mesh->vertex_first_index.data); + + ufbxi_for_list(uint32_t, p_vx_ix, mesh->vertex_first_index) { + *p_vx_ix = UFBX_NO_INDEX; + } + + for (size_t ix = 0; ix < mesh->num_indices; ix++) { + uint32_t vx = mesh->vertex_indices.data[ix]; + if (vx < mesh->num_vertices) { + if (mesh->vertex_first_index.data[vx] == UFBX_NO_INDEX) { + mesh->vertex_first_index.data[vx] = (uint32_t)ix; + } + } else { + ufbxi_check(ufbxi_fix_index(uc, &mesh->vertex_indices.data[ix], vx, mesh->num_vertices)); + } + } + + // HACK(consecutive-faces): Prepare for finalize to re-use a consecutive/zero + // index buffer for face materials.. + uc->max_zero_indices = ufbxi_max_sz(uc->max_zero_indices, mesh->num_faces); + uc->max_consecutive_indices = ufbxi_max_sz(uc->max_consecutive_indices, mesh->num_faces); + + return 1; +} + +ufbxi_noinline static void ufbxi_patch_mesh_reals(ufbx_mesh *mesh) +{ + mesh->vertex_position.value_reals = 3; + mesh->vertex_normal.value_reals = 3; + mesh->vertex_uv.value_reals = 2; + mesh->vertex_tangent.value_reals = 3; + mesh->vertex_bitangent.value_reals = 3; + mesh->vertex_color.value_reals = 4; + mesh->vertex_crease.value_reals = 1; + mesh->skinned_position.value_reals = 3; + mesh->skinned_normal.value_reals = 3; + + ufbxi_nounroll ufbxi_for_list(ufbx_uv_set, set, mesh->uv_sets) { + set->vertex_uv.value_reals = 2; + set->vertex_tangent.value_reals = 3; + set->vertex_bitangent.value_reals = 3; + } + + ufbxi_nounroll ufbxi_for_list(ufbx_color_set, set, mesh->color_sets) { + set->vertex_color.value_reals = 4; + } +} + +typedef struct { + uint32_t id, index; +} ufbxi_id_group; + +static int ufbxi_cmp_int32(const void *va, const void *vb) +{ + const int32_t a = *(const int32_t*)va, b = *(const int32_t*)vb; + if (a != b) return a < b ? -1 : +1; + return 0; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_assign_face_groups(ufbxi_buf *buf, ufbx_error *error, ufbx_mesh *mesh, size_t *p_consecutive_indices) +{ + size_t num_faces = mesh->num_faces; + ufbxi_check_err(error, num_faces > 0); + ufbxi_check_err(error, num_faces < UINT32_MAX); + ufbxi_check_err(error, mesh->face_group.count == num_faces); + + uint32_t *ids = ufbxi_push(buf, uint32_t, num_faces); + ufbxi_check_err(error, ids); + + uint32_t num_ids = 0; + + ufbxi_id_group seen_ids[1 << UFBXI_FACE_GROUP_HASH_BITS]; + memset(seen_ids, 0, sizeof(seen_ids)); + + uint32_t seed = 2654435769u; + uint32_t rehash_threshold = 256; + + // Loosely deduplicate group IDs + ufbxi_for_list(uint32_t, p_id, mesh->face_group) { + uint32_t id = *p_id; + uint32_t id_hash = (id * seed) >> (32u - UFBXI_FACE_GROUP_HASH_BITS); + if (seen_ids[id_hash].id != id || seen_ids[id_hash].index == 0) { + seen_ids[id_hash].id = id; + if (++seen_ids[id_hash].index > rehash_threshold) { + seed *= seed; + rehash_threshold *= 2; + } + ids[num_ids++] = id; + } + } + + // Sort and deduplicate remaining IDs + qsort(ids, num_ids, sizeof(uint32_t), &ufbxi_cmp_int32); + + size_t num_groups = 0; + for (size_t i = 0; i < num_ids; ) { + uint32_t id = ids[i]; + ids[num_groups++] = id; + do { i++; } while (i < num_ids && ids[i] == id); + } + + // Allocate group info structs + ufbx_face_group *groups = ufbxi_push_zero(buf, ufbx_face_group, num_groups); + ufbxi_check_err(error, groups); + for (size_t i = 0; i < num_groups; i++) { + groups[i].id = (int32_t)ids[i]; + groups[i].name.data = ufbxi_empty_char; + } + + mesh->face_groups.data = groups; + mesh->face_groups.count = num_groups; + + // Optimization: Use `consecutive_indices` for a single group + if (p_consecutive_indices && num_groups == 1) { + memset(mesh->face_group.data, 0, sizeof(uint32_t) * num_faces); + groups[0].face_indices.data = (uint32_t*)ufbxi_sentinel_index_consecutive; + groups[0].face_indices.count = num_faces; + groups[0].num_faces = num_faces; + groups[0].num_triangles = mesh->num_triangles; + *p_consecutive_indices = ufbxi_max_sz(*p_consecutive_indices, num_faces); + return 1; + } + + memset(seen_ids, 0, sizeof(seen_ids)); + + // Count faces and triangles per group and reassign IDs + const ufbx_face *p_face = mesh->faces.data; + ufbxi_for_list(uint32_t, p_id, mesh->face_group) { + uint32_t id = *p_id; + uint32_t id_hash = (id * seed) >> (32u - UFBXI_FACE_GROUP_HASH_BITS); + + uint32_t num_indices = p_face->num_indices; + uint32_t num_triangles = num_indices >= 3 ? num_indices - 2 : 0; + + size_t index; + if (seen_ids[id_hash].id == id && seen_ids[id_hash].index > 0) { + index = seen_ids[id_hash].index - 1; + *p_id = (uint32_t)index; + } else { + int32_t signed_id = (int32_t)id; + index = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_face_group, 8, &index, groups, 0, num_groups, ( a->id < signed_id ), ( a->id == signed_id )); + ufbx_assert(index < num_groups); + seen_ids[id_hash].id = id; + seen_ids[id_hash].index = (uint32_t)index + 1; + } + + groups[index].num_faces++; + groups[index].num_triangles += num_triangles; + *p_id = (uint32_t)index; + p_face++; + } + + // Subdivide `ids` for per-group `face_indices` + uint32_t *face_indices = ids; + ufbxi_for(ufbx_face_group, group, groups, num_groups) { + group->face_indices.data = face_indices; + face_indices += group->num_faces; + } + ufbx_assert(face_indices == ids + num_faces); + + // Collect per-group faces + uint32_t face_index = 0; + ufbxi_for_list(uint32_t, p_id, mesh->face_group) { + ufbx_face_group *info = &groups[*p_id]; + info->face_indices.data[info->face_indices.count++] = face_index++; + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_update_face_groups(ufbxi_buf *buf, ufbx_error *error, ufbx_mesh *mesh, bool need_copy) +{ + if (!mesh->face_group.count) return 1; + + size_t num_faces = mesh->faces.count; + + if (need_copy) { + mesh->face_groups.data = ufbxi_push_copy(buf, ufbx_face_group, mesh->face_groups.count, mesh->face_groups.data); + ufbxi_check_err(error, mesh->face_groups.data); + } + + uint32_t *face_indices = ufbxi_push(buf, uint32_t, num_faces); + ufbxi_check_err(error, face_indices); + + ufbxi_for_list(ufbx_face_group, group, mesh->face_groups) { + group->num_faces = 0; + group->num_triangles = 0; + } + + ufbxi_nounroll for (size_t i = 0; i < num_faces; i++) { + uint32_t num_indices = mesh->faces.data[i].num_indices; + ufbx_face_group *group = &mesh->face_groups.data[mesh->face_group.data[i]]; + group->num_faces++; + group->num_triangles += num_indices >= 3 ? num_indices - 2 : 0; + } + + ufbxi_for_list(ufbx_face_group, group, mesh->face_groups) { + group->face_indices.data = face_indices; + group->face_indices.count = 0; + face_indices += group->num_faces; + } + + ufbxi_nounroll for (uint32_t i = 0; i < num_faces; i++) { + ufbx_face_group *group = &mesh->face_groups.data[mesh->face_group.data[i]]; + group->face_indices.data[group->face_indices.count++] = i; + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_mesh(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_mesh *ufbxi_restrict mesh = ufbxi_push_element(uc, info, ufbx_mesh, UFBX_ELEMENT_MESH); + ufbxi_check(mesh); + + // In up to version 7100 FBX files blend shapes are contained within the same geometry node + if (uc->version <= 7100) { + ufbxi_check(ufbxi_read_synthetic_blend_shapes(uc, node, info)); + } + + ufbxi_patch_mesh_reals(mesh); + + // Sometimes there are empty meshes in FBX files? + // TODO: Should these be included in output? option? strict mode? + ufbxi_node *node_vertices = ufbxi_find_child(node, ufbxi_Vertices); + ufbxi_node *node_indices = ufbxi_find_child(node, ufbxi_PolygonVertexIndex); + if (!node_vertices || !node_indices) return 1; + + if (uc->opts.ignore_geometry) return 1; + + ufbxi_value_array *vertices = ufbxi_get_array(node_vertices, 'r'); + ufbxi_value_array *indices = ufbxi_get_array(node_indices, 'i'); + ufbxi_value_array *edge_indices = ufbxi_find_array(node, ufbxi_Edges, 'i'); + ufbxi_check(vertices && indices); + ufbxi_check(vertices->size % 3 == 0); + + mesh->num_vertices = vertices->size / 3; + mesh->num_indices = indices->size; + + uint32_t *index_data = (uint32_t*)indices->data; + + // Duplicate `index_data` for modification if we retain DOM + if (uc->opts.retain_dom) { + index_data = ufbxi_push_copy(&uc->result, uint32_t, indices->size, index_data); + ufbxi_check(index_data); + } + + mesh->vertices.data = (ufbx_vec3*)vertices->data; + mesh->vertices.count = mesh->num_vertices; + mesh->vertex_indices.data = index_data; + mesh->vertex_indices.count = mesh->num_indices; + + mesh->vertex_position.exists = true; + mesh->vertex_position.values.data = (ufbx_vec3*)vertices->data; + mesh->vertex_position.values.count = mesh->num_vertices; + mesh->vertex_position.indices.data = index_data; + mesh->vertex_position.indices.count = mesh->num_indices; + mesh->vertex_position.unique_per_vertex = true; + + // Check/make sure that the last index is negated (last of polygon) + if (mesh->num_indices > 0) { + if ((int32_t)index_data[mesh->num_indices - 1] >= 0) { + if (uc->opts.strict) ufbxi_fail("Non-negated last index"); + index_data[mesh->num_indices - 1] = ~index_data[mesh->num_indices - 1]; + } + } + + // Read edges before un-negating the indices + if (edge_indices) { + size_t num_edges = edge_indices->size; + ufbx_edge *edges = ufbxi_push(&uc->result, ufbx_edge, num_edges); + ufbxi_check(edges); + + size_t dst_ix = 0; + + // Edges are represented using a single index into PolygonVertexIndex. + // The edge is between two consecutive vertices in the polygon. + uint32_t *edge_data = (uint32_t*)edge_indices->data; + for (size_t i = 0; i < num_edges; i++) { + uint32_t index_ix = edge_data[i]; + if (index_ix >= mesh->num_indices) { + if (uc->opts.strict) ufbxi_fail("Edge index out of bounds"); + continue; + } + edges[dst_ix].a = index_ix; + if ((int32_t)index_data[index_ix] < 0) { + // Previous index is the last one of this polygon, rewind to first index. + while (index_ix > 0 && (int32_t)index_data[index_ix - 1] >= 0) { + index_ix--; + } + } else { + // Connect to the next index in the same polygon + index_ix++; + } + ufbxi_check(index_ix < mesh->num_indices); + edges[dst_ix].b = index_ix; + dst_ix++; + } + + mesh->edges.data = edges; + mesh->edges.count = dst_ix; + mesh->num_edges = mesh->edges.count; + } + + ufbxi_check(ufbxi_process_indices(uc, mesh, index_data)); + + // Count the number of UV/color sets + size_t num_uv = 0, num_color = 0, num_bitangents = 0, num_tangents = 0; + ufbxi_for (ufbxi_node, n, node->children, node->num_children) { + if (n->name == ufbxi_LayerElementUV) num_uv++; + if (n->name == ufbxi_LayerElementColor) num_color++; + if (n->name == ufbxi_LayerElementBinormal) num_bitangents++; + if (n->name == ufbxi_LayerElementTangent) num_tangents++; + } + + size_t num_textures = 0; + + ufbxi_tangent_layer *bitangents = ufbxi_push_zero(&uc->tmp_stack, ufbxi_tangent_layer, num_bitangents); + ufbxi_tangent_layer *tangents = ufbxi_push_zero(&uc->tmp_stack, ufbxi_tangent_layer, num_tangents); + ufbxi_check(bitangents); + ufbxi_check(tangents); + + mesh->uv_sets.data = ufbxi_push_zero(&uc->result, ufbx_uv_set, num_uv); + mesh->color_sets.data = ufbxi_push_zero(&uc->result, ufbx_color_set, num_color); + ufbxi_check(mesh->uv_sets.data); + ufbxi_check(mesh->color_sets.data); + + size_t num_bitangents_read = 0, num_tangents_read = 0; + ufbxi_for (ufbxi_node, n, node->children, node->num_children) { + if (n->name[0] != 'L') continue; // All names start with 'LayerElement*' + + if (n->name == ufbxi_LayerElementNormal) { + if (mesh->vertex_normal.exists) continue; + ufbxi_check(ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_attrib*)&mesh->vertex_normal, + ufbxi_Normals, ufbxi_NormalsIndex, 'r', 3)); + } else if (n->name == ufbxi_LayerElementBinormal) { + ufbxi_tangent_layer *layer = &bitangents[num_bitangents_read++]; + + ufbxi_ignore(ufbxi_get_val1(n, "I", &layer->index)); + ufbxi_check(ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_attrib*)&layer->elem, + ufbxi_Binormals, ufbxi_BinormalsIndex, 'r', 3)); + if (!layer->elem.exists) num_bitangents_read--; + + } else if (n->name == ufbxi_LayerElementTangent) { + ufbxi_tangent_layer *layer = &tangents[num_tangents_read++]; + + ufbxi_ignore(ufbxi_get_val1(n, "I", &layer->index)); + ufbxi_check(ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_attrib*)&layer->elem, + ufbxi_Tangents, ufbxi_TangentsIndex, 'r', 3)); + if (!layer->elem.exists) num_tangents_read--; + + } else if (n->name == ufbxi_LayerElementUV) { + ufbx_uv_set *set = &mesh->uv_sets.data[mesh->uv_sets.count++]; + + ufbxi_ignore(ufbxi_get_val1(n, "I", &set->index)); + if (!ufbxi_find_val1(n, ufbxi_Name, "S", &set->name)) { + set->name = ufbx_empty_string; + } + + ufbxi_check(ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_attrib*)&set->vertex_uv, + ufbxi_UV, ufbxi_UVIndex, 'r', 2)); + if (!set->vertex_uv.exists) mesh->uv_sets.count--; + + } else if (n->name == ufbxi_LayerElementColor) { + ufbx_color_set *set = &mesh->color_sets.data[mesh->color_sets.count++]; + + ufbxi_ignore(ufbxi_get_val1(n, "I", &set->index)); + if (!ufbxi_find_val1(n, ufbxi_Name, "S", &set->name)) { + set->name = ufbx_empty_string; + } + + ufbxi_check(ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_attrib*)&set->vertex_color, + ufbxi_Colors, ufbxi_ColorIndex, 'r', 4)); + if (!set->vertex_color.exists) mesh->color_sets.count--; + + } else if (n->name == ufbxi_LayerElementVertexCrease) { + ufbxi_check(ufbxi_read_vertex_element(uc, mesh, n, (ufbx_vertex_attrib*)&mesh->vertex_crease, + ufbxi_VertexCrease, ufbxi_VertexCreaseIndex, 'r', 1)); + } else if (n->name == ufbxi_LayerElementEdgeCrease) { + const char *mapping; + ufbxi_check(ufbxi_find_val1(n, ufbxi_MappingInformationType, "c", (char**)&mapping)); + if (mapping == ufbxi_ByEdge) { + if (mesh->edge_crease.count) continue; + ufbxi_check(ufbxi_read_truncated_array(uc, &mesh->edge_crease.data, &mesh->edge_crease.count, n, ufbxi_EdgeCrease, 'r', mesh->num_edges)); + } + } else if (n->name == ufbxi_LayerElementSmoothing) { + const char *mapping; + ufbxi_check(ufbxi_find_val1(n, ufbxi_MappingInformationType, "c", (char**)&mapping)); + if (mapping == ufbxi_ByEdge) { + if (mesh->edge_smoothing.count) continue; + ufbxi_check(ufbxi_read_truncated_array(uc, &mesh->edge_smoothing.data, &mesh->edge_smoothing.count, n, ufbxi_Smoothing, 'b', mesh->num_edges)); + } else if (mapping == ufbxi_ByPolygon) { + if (mesh->face_smoothing.count) continue; + ufbxi_check(ufbxi_read_truncated_array(uc, &mesh->face_smoothing.data, &mesh->face_smoothing.count, n, ufbxi_Smoothing, 'b', mesh->num_faces)); + } + } else if (n->name == ufbxi_LayerElementVisibility) { + const char *mapping; + ufbxi_check(ufbxi_find_val1(n, ufbxi_MappingInformationType, "c", (char**)&mapping)); + if (mapping == ufbxi_ByEdge) { + if (mesh->edge_visibility.count) continue; + ufbxi_check(ufbxi_read_truncated_array(uc, &mesh->edge_visibility.data, &mesh->edge_visibility.count, n, ufbxi_Visibility, 'b', mesh->num_edges)); + } + } else if (n->name == ufbxi_LayerElementMaterial) { + if (mesh->face_material.count) continue; + const char *mapping; + ufbxi_check(ufbxi_find_val1(n, ufbxi_MappingInformationType, "c", (char**)&mapping)); + if (mapping == ufbxi_ByPolygon) { + ufbxi_check(ufbxi_read_truncated_array(uc, &mesh->face_material.data, &mesh->face_material.count, n, ufbxi_Materials, 'i', mesh->num_faces)); + } else if (mapping == ufbxi_AllSame) { + ufbxi_value_array *arr = ufbxi_find_array(n, ufbxi_Materials, 'i'); + ufbxi_check(arr && arr->size >= 1); + uint32_t material = *(uint32_t*)arr->data; + mesh->face_material.count = mesh->num_faces; + if (material == 0) { + mesh->face_material.data = (uint32_t*)ufbxi_sentinel_index_zero; + } else { + mesh->face_material.data = ufbxi_push(&uc->result, uint32_t, mesh->num_faces); + ufbxi_check(mesh->face_material.data); + ufbxi_for_list(uint32_t, p_mat, mesh->face_material) { + *p_mat = material; + } + } + } + } else if (n->name == ufbxi_LayerElementPolygonGroup) { + if (mesh->face_group.count) continue; + const char *mapping; + ufbxi_check(ufbxi_find_val1(n, ufbxi_MappingInformationType, "c", (char**)&mapping)); + if (mapping == ufbxi_ByPolygon) { + ufbxi_check(ufbxi_read_truncated_array(uc, &mesh->face_group.data, &mesh->face_group.count, n, ufbxi_PolygonGroup, 'i', mesh->num_faces)); + } + } else if (n->name == ufbxi_LayerElementHole) { + if (mesh->face_group.count) continue; + const char *mapping; + ufbxi_check(ufbxi_find_val1(n, ufbxi_MappingInformationType, "c", (char**)&mapping)); + if (mapping == ufbxi_ByPolygon) { + ufbxi_check(ufbxi_read_truncated_array(uc, &mesh->face_hole.data, &mesh->face_hole.count, n, ufbxi_Hole, 'b', mesh->num_faces)); + } + } else if (!strncmp(n->name, "LayerElement", 12)) { + + // Make sure the name has no internal zero bytes + ufbxi_check(!memchr(n->name, '\0', n->name_len)); + + // What?! 6x00 stores textures in mesh geometry, eg. "LayerElementTexture", + // "LayerElementDiffuseFactorTextures", "LayerElementEmissive_Textures"... + ufbx_string prop_name = ufbx_empty_string; + if (n->name_len > 20 && !strcmp(n->name + n->name_len - 8, "Textures")) { + prop_name.data = n->name + 12; + prop_name.length = (size_t)n->name_len - 20; + if (prop_name.data[prop_name.length - 1] == '_') { + prop_name.length -= 1; + } + } else if (!strcmp(n->name, "LayerElementTexture")) { + prop_name.data = "Diffuse"; + prop_name.length = 7; + } + + if (prop_name.length > 0) { + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &prop_name, false)); + const char *mapping; + if (ufbxi_find_val1(n, ufbxi_MappingInformationType, "c", (char**)&mapping)) { + ufbxi_value_array *arr = ufbxi_find_array(n, ufbxi_TextureId, 'i'); + + ufbxi_tmp_mesh_texture *tex = ufbxi_push_zero(&uc->tmp_mesh_textures, ufbxi_tmp_mesh_texture, 1); + ufbxi_check(tex); + if (arr) { + tex->face_texture = (uint32_t*)arr->data; + tex->num_faces = arr->size; + } + tex->prop_name = prop_name; + tex->all_same = (mapping == ufbxi_AllSame); + num_textures++; + } + } + } + } + + // Always use a default zero material, this will be removed if no materials are found + if (!mesh->face_material.count) { + uc->max_zero_indices = ufbxi_max_sz(uc->max_zero_indices, mesh->num_faces); + mesh->face_material.data = (uint32_t*)ufbxi_sentinel_index_zero; + mesh->face_material.count = mesh->num_faces; + } + + if (uc->opts.strict) { + ufbxi_check(mesh->uv_sets.count == num_uv); + ufbxi_check(mesh->color_sets.count == num_color); + ufbxi_check(num_bitangents_read == num_bitangents); + ufbxi_check(num_tangents_read == num_tangents); + } + + // Connect bitangents/tangents to UV sets + ufbxi_for (ufbxi_node, n, node->children, node->num_children) { + if (n->name != ufbxi_Layer) continue; + ufbx_uv_set *uv_set = NULL; + ufbxi_tangent_layer *bitangent_layer = NULL; + ufbxi_tangent_layer *tangent_layer = NULL; + + ufbxi_for (ufbxi_node, c, n->children, n->num_children) { + uint32_t index; + const char *type; + if (c->name != ufbxi_LayerElement) continue; + if (!ufbxi_find_val1(c, ufbxi_TypedIndex, "I", &index)) continue; + if (!ufbxi_find_val1(c, ufbxi_Type, "C", (char**)&type)) continue; + + if (type == ufbxi_LayerElementUV) { + ufbxi_for(ufbx_uv_set, set, mesh->uv_sets.data, mesh->uv_sets.count) { + if (set->index == index) { + uv_set = set; + break; + } + } + } else if (type == ufbxi_LayerElementBinormal) { + ufbxi_for(ufbxi_tangent_layer, layer, bitangents, num_bitangents_read) { + if (layer->index == index) { + bitangent_layer = layer; + break; + } + } + } else if (type == ufbxi_LayerElementTangent) { + ufbxi_for(ufbxi_tangent_layer, layer, tangents, num_tangents_read) { + if (layer->index == index) { + tangent_layer = layer; + break; + } + } + } + } + + if (uv_set) { + if (bitangent_layer) { + uv_set->vertex_bitangent = bitangent_layer->elem; + } + if (tangent_layer) { + uv_set->vertex_tangent = tangent_layer->elem; + } + } + } + + mesh->skinned_is_local = true; + mesh->skinned_position = mesh->vertex_position; + mesh->skinned_normal = mesh->vertex_normal; + + ufbxi_patch_mesh_reals(mesh); + + if (mesh->face_group.count > 0 && mesh->face_groups.count == 0) { + ufbxi_check(ufbxi_assign_face_groups(&uc->result, &uc->error, mesh, &uc->max_consecutive_indices)); + } + + // Sort UV and color sets by set index + ufbxi_check(ufbxi_sort_uv_sets(uc, mesh->uv_sets.data, mesh->uv_sets.count)); + ufbxi_check(ufbxi_sort_color_sets(uc, mesh->color_sets.data, mesh->color_sets.count)); + + if (num_textures > 0) { + ufbxi_mesh_extra *extra = ufbxi_push_element_extra(uc, mesh->element.element_id, ufbxi_mesh_extra); + ufbxi_check(extra); + extra->texture_count = num_textures; + extra->texture_arr = ufbxi_push_pop(&uc->tmp, &uc->tmp_mesh_textures, ufbxi_tmp_mesh_texture, num_textures); + ufbxi_check(extra->texture_arr); + } + + // Subdivision + + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_PreviewDivisionLevels, "I", &mesh->subdivision_preview_levels)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_RenderDivisionLevels, "I", &mesh->subdivision_render_levels)); + + int32_t smoothness, boundary; + if (ufbxi_find_val1(node, ufbxi_Smoothness, "I", &smoothness)) { + if (smoothness >= 0 && smoothness <= UFBX_SUBDIVISION_DISPLAY_SMOOTH) { + mesh->subdivision_display_mode = (ufbx_subdivision_display_mode)smoothness; + } + } + if (ufbxi_find_val1(node, ufbxi_BoundaryRule, "I", &boundary)) { + if (boundary >= 0 && boundary <= UFBX_SUBDIVISION_BOUNDARY_SHARP_CORNERS - 1) { + mesh->subdivision_boundary = (ufbx_subdivision_boundary)(boundary + 1); + } + } + + return 1; +} + +ufbxi_noinline static ufbx_nurbs_topology ufbxi_read_nurbs_topology(const char *form) +{ + if (!strcmp(form, "Open")) { + return UFBX_NURBS_TOPOLOGY_OPEN; + } else if (!strcmp(form, "Closed")) { + return UFBX_NURBS_TOPOLOGY_CLOSED; + } else if (!strcmp(form, "Periodic")) { + return UFBX_NURBS_TOPOLOGY_PERIODIC; + } + return UFBX_NURBS_TOPOLOGY_OPEN; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_nurbs_curve(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_nurbs_curve *nurbs = ufbxi_push_element(uc, info, ufbx_nurbs_curve, UFBX_ELEMENT_NURBS_CURVE); + ufbxi_check(nurbs); + + int32_t dimension = 3; + + const char *form = NULL; + ufbxi_check(ufbxi_find_val1(node, ufbxi_Order, "I", &nurbs->basis.order)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_Dimension, "I", &dimension)); + ufbxi_check(ufbxi_find_val1(node, ufbxi_Form, "C", (char**)&form)); + nurbs->basis.topology = ufbxi_read_nurbs_topology(form); + nurbs->basis.is_2d = dimension == 2; + + if (!uc->opts.ignore_geometry) { + ufbxi_value_array *points = ufbxi_find_array(node, ufbxi_Points, 'r'); + ufbxi_value_array *knot = ufbxi_find_array(node, ufbxi_KnotVector, 'r'); + ufbxi_check(points); + ufbxi_check(knot); + ufbxi_check(points->size % 4 == 0); + + nurbs->control_points.count = points->size / 4; + nurbs->control_points.data = (ufbx_vec4*)points->data; + nurbs->basis.knot_vector.data = (ufbx_real*)knot->data; + nurbs->basis.knot_vector.count = knot->size; + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_nurbs_surface(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_nurbs_surface *nurbs = ufbxi_push_element(uc, info, ufbx_nurbs_surface, UFBX_ELEMENT_NURBS_SURFACE); + ufbxi_check(nurbs); + + const char *form_u = NULL, *form_v = NULL; + size_t dimension_u = 0, dimension_v = 0; + int32_t step_u = 0, step_v = 0; + ufbxi_check(ufbxi_find_val2(node, ufbxi_NurbsSurfaceOrder, "II", &nurbs->basis_u.order, &nurbs->basis_v.order)); + ufbxi_check(ufbxi_find_val2(node, ufbxi_Dimensions, "ZZ", &dimension_u, &dimension_v)); + ufbxi_check(ufbxi_find_val2(node, ufbxi_Step, "II", &step_u, &step_v)); + ufbxi_check(ufbxi_find_val2(node, ufbxi_Form, "CC", (char**)&form_u, (char**)&form_v)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_FlipNormals, "B", &nurbs->flip_normals)); + nurbs->basis_u.topology = ufbxi_read_nurbs_topology(form_u); + nurbs->basis_v.topology = ufbxi_read_nurbs_topology(form_v); + nurbs->num_control_points_u = dimension_u; + nurbs->num_control_points_v = dimension_v; + nurbs->span_subdivision_u = step_u > 0 ? (uint32_t)step_u : 4u; + nurbs->span_subdivision_v = step_v > 0 ? (uint32_t)step_v : 4u; + + if (!uc->opts.ignore_geometry) { + ufbxi_value_array *points = ufbxi_find_array(node, ufbxi_Points, 'r'); + ufbxi_value_array *knot_u = ufbxi_find_array(node, ufbxi_KnotVectorU, 'r'); + ufbxi_value_array *knot_v = ufbxi_find_array(node, ufbxi_KnotVectorV, 'r'); + ufbxi_check(points); + ufbxi_check(knot_u); + ufbxi_check(knot_v); + ufbxi_check(points->size % 4 == 0); + ufbxi_check(points->size / 4 == (size_t)dimension_u * (size_t)dimension_v); + + nurbs->control_points.count = points->size / 4; + nurbs->control_points.data = (ufbx_vec4*)points->data; + nurbs->basis_u.knot_vector.data = (ufbx_real*)knot_u->data; + nurbs->basis_u.knot_vector.count = knot_u->size; + nurbs->basis_v.knot_vector.data = (ufbx_real*)knot_v->data; + nurbs->basis_v.knot_vector.count = knot_v->size; + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_line(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_line_curve *line = ufbxi_push_element(uc, info, ufbx_line_curve, UFBX_ELEMENT_LINE_CURVE); + ufbxi_check(line); + + if (!uc->opts.ignore_geometry) { + ufbxi_value_array *points = ufbxi_find_array(node, ufbxi_Points, 'r'); + ufbxi_value_array *points_index = ufbxi_find_array(node, ufbxi_PointsIndex, 'i'); + ufbxi_check(points); + ufbxi_check(points_index); + ufbxi_check(points->size % 3 == 0); + + if (points->size > 0) { + line->control_points.count = points->size / 3; + line->control_points.data = (ufbx_vec3*)points->data; + line->point_indices.count = points_index->size; + line->point_indices.data = (uint32_t*)points_index->data; + + ufbxi_check(line->control_points.count < INT32_MAX); + + // Count end points + size_t num_segments = 1; + if (line->point_indices.count > 0) { + for (size_t i = 0; i < line->point_indices.count - 1; i++) { + uint32_t ix = line->point_indices.data[i]; + num_segments += (int32_t)ix < 0 ? 1u : 0u; + } + } + + size_t prev_end = 0; + line->segments.data = ufbxi_push(&uc->result, ufbx_line_segment, num_segments); + ufbxi_check(line->segments.data); + for (size_t i = 0; i < line->point_indices.count; i++) { + uint32_t ix = line->point_indices.data[i]; + if ((int32_t)ix < 0) { + ix = ~ix; + if (i + 1 < line->point_indices.count) { + ufbx_line_segment *segment = &line->segments.data[line->segments.count++]; + segment->index_begin = (uint32_t)prev_end; + segment->num_indices = (uint32_t)(i - prev_end); + prev_end = i; + } + } + + if (ix < line->control_points.count) { + line->point_indices.data[i] = ix; + } else { + ufbxi_check(ufbxi_fix_index(uc, &line->point_indices.data[i], ix, line->control_points.count)); + } + } + + ufbx_line_segment *segment = &line->segments.data[line->segments.count++]; + segment->index_begin = (uint32_t)prev_end; + segment->num_indices = (uint32_t)ufbxi_to_size(line->point_indices.count - prev_end); + ufbx_assert(line->segments.count == num_segments); + } + } + + return 1; +} + +ufbxi_noinline static void ufbxi_read_transform_matrix(ufbx_matrix *m, ufbx_real *data) +{ + m->m00 = data[ 0]; m->m10 = data[ 1]; m->m20 = data[ 2]; + m->m01 = data[ 4]; m->m11 = data[ 5]; m->m21 = data[ 6]; + m->m02 = data[ 8]; m->m12 = data[ 9]; m->m22 = data[10]; + m->m03 = data[12]; m->m13 = data[13]; m->m23 = data[14]; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_bone(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info, const char *sub_type) +{ + (void)node; + + ufbx_bone *bone = ufbxi_push_element(uc, info, ufbx_bone, UFBX_ELEMENT_BONE); + ufbxi_check(bone); + + if (sub_type == ufbxi_Root) { + bone->is_root = true; + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_marker(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info, const char *sub_type, ufbx_marker_type type) +{ + (void)node; + (void)sub_type; + + ufbx_marker *marker = ufbxi_push_element(uc, info, ufbx_marker, UFBX_ELEMENT_MARKER); + ufbxi_check(marker); + + marker->type = type; + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_skin(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_skin_deformer *skin = ufbxi_push_element(uc, info, ufbx_skin_deformer, UFBX_ELEMENT_SKIN_DEFORMER); + ufbxi_check(skin); + + const char *skinning_type = NULL; + if (ufbxi_find_val1(node, ufbxi_SkinningType, "C", (char**)&skinning_type)) { + if (!strcmp(skinning_type, "Rigid")) { + skin->skinning_method = UFBX_SKINNING_METHOD_RIGID; + } else if (!strcmp(skinning_type, "Linear")) { + skin->skinning_method = UFBX_SKINNING_METHOD_LINEAR; + } else if (!strcmp(skinning_type, "DualQuaternion")) { + skin->skinning_method = UFBX_SKINNING_METHOD_DUAL_QUATERNION; + } else if (!strcmp(skinning_type, "Blend")) { + skin->skinning_method = UFBX_SKINNING_METHOD_BLENDED_DQ_LINEAR; + } + } + + ufbxi_value_array *indices = ufbxi_find_array(node, ufbxi_Indexes, 'i'); + ufbxi_value_array *weights = ufbxi_find_array(node, ufbxi_BlendWeights, 'r'); + if (indices && weights) { + // TODO strict: ufbxi_check(indices->size == weights->size); + skin->num_dq_weights = ufbxi_min_sz(indices->size, weights->size); + skin->dq_vertices.data = (uint32_t*)indices->data; + skin->dq_weights.data = (ufbx_real*)weights->data; + skin->dq_vertices.count = skin->num_dq_weights; + skin->dq_weights.count = skin->num_dq_weights; + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_skin_cluster(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_skin_cluster *cluster = ufbxi_push_element(uc, info, ufbx_skin_cluster, UFBX_ELEMENT_SKIN_CLUSTER); + ufbxi_check(cluster); + + ufbxi_value_array *indices = ufbxi_find_array(node, ufbxi_Indexes, 'i'); + ufbxi_value_array *weights = ufbxi_find_array(node, ufbxi_Weights, 'r'); + + if (indices && weights) { + ufbxi_check(indices->size == weights->size); + cluster->num_weights = indices->size; + cluster->vertices.data = (uint32_t*)indices->data; + cluster->weights.data = (ufbx_real*)weights->data; + cluster->vertices.count = cluster->num_weights; + cluster->weights.count = cluster->num_weights; + } + + ufbxi_value_array *transform = ufbxi_find_array(node, ufbxi_Transform, 'r'); + ufbxi_value_array *transform_link = ufbxi_find_array(node, ufbxi_TransformLink, 'r'); + if (transform && transform_link) { + ufbxi_check(transform->size >= 16); + ufbxi_check(transform_link->size >= 16); + + ufbxi_read_transform_matrix(&cluster->mesh_node_to_bone, (ufbx_real*)transform->data); + ufbxi_read_transform_matrix(&cluster->bind_to_world, (ufbx_real*)transform_link->data); + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_blend_channel(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_blend_channel *channel = ufbxi_push_element(uc, info, ufbx_blend_channel, UFBX_ELEMENT_BLEND_CHANNEL); + ufbxi_check(channel); + + ufbx_real_list list = { NULL, 0 }; + ufbxi_value_array *full_weights = ufbxi_find_array(node, ufbxi_FullWeights, 'd'); + if (full_weights) { + list.data = (ufbx_real*)full_weights->data; + list.count = full_weights->size; + } + ufbxi_check(ufbxi_push_copy(&uc->tmp_full_weights, ufbx_real_list, 1, &list)); + + return 1; +} + +static ufbxi_forceinline float ufbxi_solve_auto_tangent(double prev_time, double time, double next_time, ufbx_real prev_value, ufbx_real value, ufbx_real next_value, float weight_left, float weight_right) +{ + // In between two keyframes: Set the initial slope to be the difference between + // the two keyframes. Prevent overshooting by clamping the slope in case either + // tangent goes above/below the endpoints. + double slope = (next_value - prev_value) / (next_time - prev_time); + + // Split the slope to sign and a non-negative absolute value + double slope_sign = slope >= 0.0 ? 1.0 : -1.0; + double abs_slope = slope_sign * slope; + + // Find limits for the absolute value of the slope + double range_left = weight_left * (time - prev_time); + double range_right = weight_right * (next_time - time); + double max_left = range_left > 0.0 ? slope_sign * (value - prev_value) / range_left : 0.0; + double max_right = range_right > 0.0 ? slope_sign * (next_value - value) / range_right : 0.0; + + // Clamp negative values and NaNs to zero + if (!(max_left > 0.0)) max_left = 0.0; + if (!(max_right > 0.0)) max_right = 0.0; + + // Clamp the absolute slope from both sides + if (abs_slope > max_left) abs_slope = max_left; + if (abs_slope > max_right) abs_slope = max_right; + + return (float)(slope_sign * abs_slope); +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_animation_curve(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_anim_curve *curve = ufbxi_push_element(uc, info, ufbx_anim_curve, UFBX_ELEMENT_ANIM_CURVE); + ufbxi_check(curve); + + if (uc->opts.ignore_animation) return 1; + + ufbxi_value_array *times, *values, *attr_flags, *attrs, *refs; + ufbxi_check(times = ufbxi_find_array(node, ufbxi_KeyTime, 'l')); + ufbxi_check(values = ufbxi_find_array(node, ufbxi_KeyValueFloat, 'r')); + ufbxi_check(attr_flags = ufbxi_find_array(node, ufbxi_KeyAttrFlags, 'i')); + ufbxi_check(attrs = ufbxi_find_array(node, ufbxi_KeyAttrDataFloat, '?')); + ufbxi_check(refs = ufbxi_find_array(node, ufbxi_KeyAttrRefCount, 'i')); + + // Time and value arrays that define the keyframes should be parallel + ufbxi_check(times->size == values->size); + + // Flags and attributes are run-length encoded where KeyAttrRefCount (refs) + // is an array that describes how many times to repeat a given flag/attribute. + // Attributes consist of 4 32-bit floating point values per key. + ufbxi_check(attr_flags->size == refs->size); + ufbxi_check(attrs->size == refs->size * 4u); + + size_t num_keys = times->size; + ufbx_keyframe *keys = ufbxi_push(&uc->result, ufbx_keyframe, num_keys); + ufbxi_check(keys); + + curve->keyframes.data = keys; + curve->keyframes.count = num_keys; + + int64_t *p_time = (int64_t*)times->data; + ufbx_real *p_value = (ufbx_real*)values->data; + int32_t *p_flag = (int32_t*)attr_flags->data; + float *p_attr = (float*)attrs->data; + int32_t *p_ref = (int32_t*)refs->data, *p_ref_end = p_ref + refs->size; + + // The previous key defines the weight/slope of the left tangent + float slope_left = 0.0f; + float weight_left = 0.333333f; + + double prev_time = 0.0; + double next_time = 0.0; + + if (num_keys > 0) { + next_time = (double)p_time[0] * uc->ktime_to_sec; + } + + for (size_t i = 0; i < num_keys; i++) { + ufbx_keyframe *key = &keys[i]; + ufbxi_check(p_ref < p_ref_end); + + key->time = next_time; + key->value = *p_value; + + if (i + 1 < num_keys) { + next_time = (double)p_time[1] * uc->ktime_to_sec; + } + + uint32_t flags = (uint32_t)*p_flag; + + float slope_right = p_attr[0]; + float weight_right = 0.333333f; + float next_slope_left = p_attr[1]; + float next_weight_left = 0.333333f; + + if (flags & 0x3000000) { + // At least one of the tangents is weighted. The weights are encoded as + // two 0.4 _decimal_ fixed point values that are packed into 32 bits and + // interpreted as a 32-bit float. + uint32_t packed_weights; + memcpy(&packed_weights, &p_attr[2], sizeof(uint32_t)); + + if (flags & 0x1000000) { + // Right tangent is weighted + weight_right = (float)(packed_weights & 0xffff) * 0.0001f; + } + + if (flags & 0x2000000) { + // Next left tangent is weighted + next_weight_left = (float)(packed_weights >> 16) * 0.0001f; + } + } + + if (flags & 0x2) { + // Constant interpolation: Set cubic tangents to flat. + + if (flags & 0x100) { + // Take constant value from next key + key->interpolation = UFBX_INTERPOLATION_CONSTANT_NEXT; + + } else { + // Take constant value from the previous key + key->interpolation = UFBX_INTERPOLATION_CONSTANT_PREV; + } + + weight_right = next_weight_left = 0.333333f; + slope_right = next_slope_left = 0.0f; + + } else if (flags & 0x8) { + // Cubic interpolation + key->interpolation = UFBX_INTERPOLATION_CUBIC; + + if (flags & 0x400) { + // User tangents + + if (flags & 0x800) { + // Broken tangents: No need to modify slopes + } else { + // Unified tangents: Use right slope for both sides + // TODO: ??? slope_left = slope_right; + } + + } else { + // Automatic (0x100) or unknown tangents + // TODO: TCB tangents (0x200) + // TODO: Auto break (0x800) + + if (i > 0 && i + 1 < num_keys && key->time > prev_time && next_time > key->time) { + slope_left = slope_right = ufbxi_solve_auto_tangent( + prev_time, key->time, next_time, + p_value[-1], key->value, p_value[1], + weight_left, weight_right); + } else { + // Endpoint / invalid keyframe: Set both slopes to zero + slope_left = slope_right = 0.0f; + } + } + + } else { + // Linear (0x4) or unknown interpolation: Set cubic tangents to match + // the linear interpolation with weights of 1/3. + key->interpolation = UFBX_INTERPOLATION_LINEAR; + + weight_right = 0.333333f; + next_weight_left = 0.333333f; + + if (next_time > key->time) { + double delta_time = next_time - key->time; + if (delta_time > 0.0) { + double slope = (p_value[1] - key->value) / delta_time; + slope_right = next_slope_left = (float)slope; + } else { + slope_right = next_slope_left = 0.0f; + } + } else { + slope_right = next_slope_left = 0.0f; + } + } + + // Set the tangents based on weights (dx relative to the time difference + // between the previous/next key) and slope (simply d = slope * dx) + + if (key->time > prev_time) { + double delta = key->time - prev_time; + key->left.dx = (float)(weight_left * delta); + key->left.dy = key->left.dx * slope_left; + } else { + key->left.dx = 0.0f; + key->left.dy = 0.0f; + } + + if (next_time > key->time) { + double delta = next_time - key->time; + key->right.dx = (float)(weight_right * delta); + key->right.dy = key->right.dx * slope_right; + } else { + key->right.dx = 0.0f; + key->right.dy = 0.0f; + } + + slope_left = next_slope_left; + weight_left = next_weight_left; + prev_time = key->time; + + // Decrement attribute refcount and potentially move to the next one. + int32_t refs_left = --*p_ref; + ufbxi_check(refs_left >= 0); + if (refs_left == 0) { + p_flag++; + p_attr += 4; + p_ref++; + } + p_time++; + p_value++; + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_material(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_material *material = ufbxi_push_element(uc, info, ufbx_material, UFBX_ELEMENT_MATERIAL); + ufbxi_check(material); + + if (!ufbxi_find_val1(node, ufbxi_ShadingModel, "S", &material->shading_model_name)) { + material->shading_model_name = ufbx_empty_string; + } + + material->shader_prop_prefix = ufbx_empty_string; + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_texture(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_texture *texture = ufbxi_push_element(uc, info, ufbx_texture, UFBX_ELEMENT_TEXTURE); + ufbxi_check(texture); + + texture->type = UFBX_TEXTURE_FILE; + + texture->filename = ufbx_empty_string; + texture->absolute_filename = ufbx_empty_string; + texture->relative_filename = ufbx_empty_string; + + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_FileName, "S", &texture->absolute_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_Filename, "S", &texture->absolute_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_RelativeFileName, "S", &texture->relative_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_RelativeFilename, "S", &texture->relative_filename)); + + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_FileName, "b", &texture->raw_absolute_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_Filename, "b", &texture->raw_absolute_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_RelativeFileName, "b", &texture->raw_relative_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_RelativeFilename, "b", &texture->raw_relative_filename)); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_layered_texture(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_texture *texture = ufbxi_push_element(uc, info, ufbx_texture, UFBX_ELEMENT_TEXTURE); + ufbxi_check(texture); + + texture->type = UFBX_TEXTURE_LAYERED; + + texture->filename = ufbx_empty_string; + texture->absolute_filename = ufbx_empty_string; + texture->relative_filename = ufbx_empty_string; + + ufbxi_texture_extra *extra = ufbxi_push_element_extra(uc, texture->element.element_id, ufbxi_texture_extra); + ufbxi_check(extra); + + ufbxi_value_array *alphas = ufbxi_find_array(node, ufbxi_Alphas, 'r'); + if (alphas) { + extra->alphas = (ufbx_real*)alphas->data; + extra->num_alphas = alphas->size; + } + + ufbxi_value_array *blend_modes = ufbxi_find_array(node, ufbxi_BlendModes, 'i'); + if (blend_modes) { + extra->blend_modes = (int32_t*)blend_modes->data; + extra->num_blend_modes = blend_modes->size; + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_video(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_video *video = ufbxi_push_element(uc, info, ufbx_video, UFBX_ELEMENT_VIDEO); + ufbxi_check(video); + + video->filename = ufbx_empty_string; + video->absolute_filename = ufbx_empty_string; + video->relative_filename = ufbx_empty_string; + + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_FileName, "S", &video->absolute_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_Filename, "S", &video->absolute_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_RelativeFileName, "S", &video->relative_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_RelativeFilename, "S", &video->relative_filename)); + + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_FileName, "b", &video->raw_absolute_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_Filename, "b", &video->raw_absolute_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_RelativeFileName, "b", &video->raw_relative_filename)); + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_RelativeFilename, "b", &video->raw_relative_filename)); + + ufbxi_node *content_node = ufbxi_find_child(node, ufbxi_Content); + ufbxi_check(ufbxi_read_embedded_blob(uc, &video->content, content_node)); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_pose(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info, const char *sub_type) +{ + ufbx_pose *pose = ufbxi_push_element(uc, info, ufbx_pose, UFBX_ELEMENT_POSE); + ufbxi_check(pose); + + // TODO: What are the actual other types? + pose->bind_pose = sub_type == ufbxi_BindPose; + + size_t num_bones = 0; + ufbxi_for(ufbxi_node, n, node->children, node->num_children) { + if (n->name != ufbxi_PoseNode) continue; + + // Bones are linked with FBX names/IDs bypassing the connection system (!?) + uint64_t fbx_id = 0; + if (uc->version < 7000) { + char *name = NULL; + if (!ufbxi_find_val1(n, ufbxi_Node, "c", &name)) continue; + fbx_id = ufbxi_synthetic_id_from_string(name); + } else { + if (!ufbxi_find_val1(n, ufbxi_Node, "L", &fbx_id)) continue; + } + + ufbxi_value_array *matrix = ufbxi_find_array(n, ufbxi_Matrix, 'r'); + if (!matrix) continue; + ufbxi_check(matrix->size >= 16); + + ufbxi_tmp_bone_pose *tmp_pose = ufbxi_push(&uc->tmp_stack, ufbxi_tmp_bone_pose, 1); + ufbxi_check(tmp_pose); + + num_bones++; + tmp_pose->bone_fbx_id = fbx_id; + ufbxi_read_transform_matrix(&tmp_pose->bone_to_world, (ufbx_real*)matrix->data); + } + + // HACK: Transport `ufbxi_tmp_bone_pose` array through the `ufbx_bone_pose` pointer + pose->bone_poses.count = num_bones; + pose->bone_poses.data = (ufbx_bone_pose*)ufbxi_push_pop(&uc->tmp, &uc->tmp_stack, ufbxi_tmp_bone_pose, num_bones); + ufbxi_check(pose->bone_poses.data); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_shader_prop_bindings(ufbxi_context *uc, ufbx_shader_prop_binding *bindings, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbx_shader_prop_binding))); + ufbxi_macro_stable_sort(ufbx_shader_prop_binding, 32, bindings, uc->tmp_arr, count, + ( ufbxi_str_less(a->shader_prop, b->shader_prop) ) ); + return 1; +} + + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_binding_table(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_shader_binding *bindings = ufbxi_push_element(uc, info, ufbx_shader_binding, UFBX_ELEMENT_SHADER_BINDING); + ufbxi_check(bindings); + + size_t num_entries = 0; + ufbxi_for (ufbxi_node, n, node->children, node->num_children) { + if (n->name != ufbxi_Entry) continue; + + ufbx_string src, dst; + const char *src_type = NULL, *dst_type = NULL; + if (!ufbxi_get_val4(n, "SCSC", &src, (char**)&src_type, &dst, (char**)&dst_type)) { + continue; + } + + if (src_type == ufbxi_FbxPropertyEntry && dst_type == ufbxi_FbxSemanticEntry) { + ufbx_shader_prop_binding *bind = ufbxi_push(&uc->tmp_stack, ufbx_shader_prop_binding, 1); + ufbxi_check(bind); + bind->material_prop = src; + bind->shader_prop = dst; + num_entries++; + } else if (src_type == ufbxi_FbxSemanticEntry && dst_type == ufbxi_FbxPropertyEntry) { + ufbx_shader_prop_binding *bind = ufbxi_push(&uc->tmp_stack, ufbx_shader_prop_binding, 1); + ufbxi_check(bind); + bind->material_prop = dst; + bind->shader_prop = src; + num_entries++; + } + } + + bindings->prop_bindings.count = num_entries; + bindings->prop_bindings.data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_shader_prop_binding, num_entries); + ufbxi_check(bindings->prop_bindings.data); + + ufbxi_check(ufbxi_sort_shader_prop_bindings(uc, bindings->prop_bindings.data, bindings->prop_bindings.count)); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_selection_set(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + (void)node; + + ufbx_selection_set *set = ufbxi_push_element(uc, info, ufbx_selection_set, UFBX_ELEMENT_SELECTION_SET); + ufbxi_check(set); + + return 1; +} + +ufbxi_noinline static void ufbxi_find_uint32_list(ufbx_uint32_list *dst, ufbxi_node *node, const char *name) +{ + ufbxi_value_array *arr = ufbxi_find_array(node, name, 'i'); + if (arr) { + dst->data = (uint32_t*)arr->data; + dst->count = arr->size; + } +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_selection_node(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_selection_node *sel = ufbxi_push_element(uc, info, ufbx_selection_node, UFBX_ELEMENT_SELECTION_NODE); + ufbxi_check(sel); + + int32_t in_set = 0; + if (ufbxi_find_val1(node, ufbxi_IsTheNodeInSet, "I", &in_set) && in_set) { + sel->include_node = true; + } + + ufbxi_find_uint32_list(&sel->vertices, node, ufbxi_VertexIndexArray); + ufbxi_find_uint32_list(&sel->edges, node, ufbxi_EdgeIndexArray); + ufbxi_find_uint32_list(&sel->faces, node, ufbxi_PolygonIndexArray); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_character(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + (void)node; + + ufbx_character *character = ufbxi_push_element(uc, info, ufbx_character, UFBX_ELEMENT_CHARACTER); + ufbxi_check(character); + + // TODO: There's some extremely cursed all-caps data in characters + + return 1; +} + +typedef struct { + ufbx_constraint_type type; + const char *name; +} ufbxi_constraint_type; + +static const ufbxi_constraint_type ufbxi_constraint_types[] = { + { UFBX_CONSTRAINT_AIM, "Aim" }, + { UFBX_CONSTRAINT_PARENT, "Parent-Child" }, + { UFBX_CONSTRAINT_POSITION, "Position From Positions" }, + { UFBX_CONSTRAINT_ROTATION, "Rotation From Rotations" }, + { UFBX_CONSTRAINT_SCALE, "Scale From Scales" }, + { UFBX_CONSTRAINT_SINGLE_CHAIN_IK, "Single Chain IK" }, +}; + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_constraint(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + (void)node; + + ufbx_constraint *constraint = ufbxi_push_element(uc, info, ufbx_constraint, UFBX_ELEMENT_CONSTRAINT); + ufbxi_check(constraint); + + if (!ufbxi_find_val1(node, ufbxi_Type, "S", &constraint->type_name)) { + constraint->type_name = ufbx_empty_string; + } + + ufbxi_for(const ufbxi_constraint_type, ctype, ufbxi_constraint_types, ufbxi_arraycount(ufbxi_constraint_types)) { + if (!strcmp(constraint->type_name.data, ctype->name)) { + constraint->type = ctype->type; + break; + } + } + + // TODO: There's some extremely cursed all-caps data in characters + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_synthetic_attribute(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info, ufbx_string type_str, const char *sub_type, const char *super_type) +{ + if ((sub_type == ufbxi_empty_char || sub_type == ufbxi_Model) && type_str.data == ufbxi_Model) { + // Plain model + return 1; + } + + ufbxi_element_info attrib_info = *info; + + ufbxi_check(ufbxi_push_synthetic_id(uc, &attrib_info.fbx_id)); + + // Use type and name from NodeAttributeName if it exists *uniquely* + ufbx_string type_and_name; + if (ufbxi_find_val1(node, ufbxi_NodeAttributeName, "s", &type_and_name)) { + ufbx_string attrib_type_str, attrib_name_str; + ufbxi_check(ufbxi_split_type_and_name(uc, type_and_name, &attrib_type_str, &attrib_name_str)); + if (attrib_name_str.length > 0) { + attrib_info.name = attrib_name_str; + uint64_t attrib_id = ufbxi_synthetic_id_from_string(type_and_name.data); + if (info->fbx_id != attrib_id && !ufbxi_fbx_id_exists(uc, attrib_id)) { + attrib_info.fbx_id = attrib_id; + } + } + } + + // 6x00: Link the node to the node attribute so property connections can be + // redirected from connections if necessary. + if (uc->version < 7000) { + ufbxi_check(ufbxi_insert_fbx_attr(uc, info->fbx_id, attrib_info.fbx_id)); + + // Split properties between the node and the attribute + ufbx_prop *ps = info->props.props.data; + size_t dst = 0, src = 0, end = info->props.props.count; + while (src < end) { + if (!ufbxi_is_node_property(uc, ps[src].name.data)) { + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_prop, 1, &ps[src])); + src++; + } else if (dst != src) { + ps[dst++] = ps[src++]; + } else { + dst++; src++; + } + } + attrib_info.props.props.count = end - dst; + attrib_info.props.props.data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_prop, attrib_info.props.props.count); + ufbxi_check(attrib_info.props.props.data); + info->props.props.count = dst; + } + + if (sub_type == ufbxi_Mesh) { + ufbxi_check(ufbxi_read_mesh(uc, node, &attrib_info)); + } else if (sub_type == ufbxi_Light) { + ufbxi_check(ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_light), UFBX_ELEMENT_LIGHT)); + } else if (sub_type == ufbxi_Camera) { + ufbxi_check(ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_camera), UFBX_ELEMENT_CAMERA)); + } else if (sub_type == ufbxi_LimbNode || sub_type == ufbxi_Limb || sub_type == ufbxi_Root) { + ufbxi_check(ufbxi_read_bone(uc, node, &attrib_info, sub_type)); + } else if (sub_type == ufbxi_Null || sub_type == ufbxi_Marker) { + ufbxi_check(ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_empty), UFBX_ELEMENT_EMPTY)); + } else if (sub_type == ufbxi_NurbsCurve) { + if (!ufbxi_find_child(node, ufbxi_KnotVector)) return 1; + ufbxi_check(ufbxi_read_nurbs_curve(uc, node, &attrib_info)); + } else if (sub_type == ufbxi_NurbsSurface) { + if (!ufbxi_find_child(node, ufbxi_KnotVectorU)) return 1; + if (!ufbxi_find_child(node, ufbxi_KnotVectorV)) return 1; + ufbxi_check(ufbxi_read_nurbs_surface(uc, node, &attrib_info)); + } else if (sub_type == ufbxi_Line) { + if (!ufbxi_find_child(node, ufbxi_Points)) return 1; + if (!ufbxi_find_child(node, ufbxi_PointsIndex)) return 1; + ufbxi_check(ufbxi_read_line(uc, node, &attrib_info)); + } else if (sub_type == ufbxi_TrimNurbsSurface) { + if (!ufbxi_find_child(node, ufbxi_Layer)) return 1; + ufbxi_check(ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_nurbs_trim_surface), UFBX_ELEMENT_NURBS_TRIM_SURFACE)); + } else if (sub_type == ufbxi_Boundary) { + ufbxi_check(ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_nurbs_trim_boundary), UFBX_ELEMENT_NURBS_TRIM_BOUNDARY)); + } else if (sub_type == ufbxi_CameraStereo) { + ufbxi_check(ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_stereo_camera), UFBX_ELEMENT_STEREO_CAMERA)); + } else if (sub_type == ufbxi_CameraSwitcher) { + ufbxi_check(ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_camera_switcher), UFBX_ELEMENT_CAMERA_SWITCHER)); + } else if (sub_type == ufbxi_FKEffector) { + ufbxi_check(ufbxi_read_marker(uc, node, &attrib_info, sub_type, UFBX_MARKER_FK_EFFECTOR)); + } else if (sub_type == ufbxi_IKEffector) { + ufbxi_check(ufbxi_read_marker(uc, node, &attrib_info, sub_type, UFBX_MARKER_IK_EFFECTOR)); + } else if (sub_type == ufbxi_LodGroup) { + ufbxi_check(ufbxi_read_element(uc, node, &attrib_info, sizeof(ufbx_lod_group), UFBX_ELEMENT_LOD_GROUP)); + } else { + ufbx_string sub_type_str = { sub_type, strlen(sub_type) }; + ufbxi_check(ufbxi_read_unknown(uc, node, &attrib_info, type_str, sub_type_str, super_type)); + } + + ufbxi_check(ufbxi_connect_oo(uc, attrib_info.fbx_id, info->fbx_id)); + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_global_settings(ufbxi_context *uc, ufbxi_node *node) +{ + ufbxi_check(ufbxi_read_properties(uc, node, &uc->scene.settings.props)); + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_objects(ufbxi_context *uc) +{ + ufbxi_element_info info = { 0 }; + for (;;) { + ufbxi_node *node; + ufbxi_check(ufbxi_parse_toplevel_child(uc, &node)); + if (!node) break; + + info.dom_node = ufbxi_get_dom_node(uc, node); + + if (node->name == ufbxi_GlobalSettings) { + ufbxi_check(ufbxi_read_global_settings(uc, node)); + continue; + } + + ufbx_string type_and_name, sub_type_str; + + // Failing to parse the object properties is not an error since + // there's some weird objects mixed in every now and then. + // FBX version 7000 and up uses 64-bit unique IDs per object, + // older FBX versions just use name/type pairs, which we can + // use as IDs since all strings are interned into a string pool. + if (uc->version >= 7000) { + if (!ufbxi_get_val3(node, "Lss", &info.fbx_id, &type_and_name, &sub_type_str)) continue; + ufbxi_check((info.fbx_id & UFBXI_SYNTHETIC_ID_BIT) == 0); + } else { + if (!ufbxi_get_val2(node, "ss", &type_and_name, &sub_type_str)) continue; + info.fbx_id = ufbxi_synthetic_id_from_string(type_and_name.data); + } + + // Remove the "Fbx" prefix from sub-types, remember to re-intern! + if (sub_type_str.length > 3 && !memcmp(sub_type_str.data, "Fbx", 3)) { + sub_type_str.data += 3; + sub_type_str.length -= 3; + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &sub_type_str, false)); + } + + ufbx_string type_str; + ufbxi_check(ufbxi_split_type_and_name(uc, type_and_name, &type_str, &info.name)); + + const char *name = node->name, *sub_type = sub_type_str.data; + ufbxi_check(ufbxi_read_properties(uc, node, &info.props)); + info.props.defaults = ufbxi_find_template(uc, name, sub_type); + + if (name == ufbxi_Model) { + if (uc->version < 7000) { + ufbxi_check(ufbxi_read_synthetic_attribute(uc, node, &info, type_str, sub_type, name)); + } + ufbxi_check(ufbxi_read_model(uc, node, &info)); + } else if (name == ufbxi_NodeAttribute) { + if (sub_type == ufbxi_Light) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_light), UFBX_ELEMENT_LIGHT)); + } else if (sub_type == ufbxi_Camera) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_camera), UFBX_ELEMENT_CAMERA)); + } else if (sub_type == ufbxi_LimbNode || sub_type == ufbxi_Limb || sub_type == ufbxi_Root) { + ufbxi_check(ufbxi_read_bone(uc, node, &info, sub_type)); + } else if (sub_type == ufbxi_Null || sub_type == ufbxi_Marker) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_empty), UFBX_ELEMENT_EMPTY)); + } else if (sub_type == ufbxi_CameraStereo) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_stereo_camera), UFBX_ELEMENT_STEREO_CAMERA)); + } else if (sub_type == ufbxi_CameraSwitcher) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_camera_switcher), UFBX_ELEMENT_CAMERA_SWITCHER)); + } else if (sub_type == ufbxi_FKEffector) { + ufbxi_check(ufbxi_read_marker(uc, node, &info, sub_type, UFBX_MARKER_FK_EFFECTOR)); + } else if (sub_type == ufbxi_IKEffector) { + ufbxi_check(ufbxi_read_marker(uc, node, &info, sub_type, UFBX_MARKER_IK_EFFECTOR)); + } else if (sub_type == ufbxi_LodGroup) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_lod_group), UFBX_ELEMENT_LOD_GROUP)); + } else { + ufbxi_check(ufbxi_read_unknown(uc, node, &info, type_str, sub_type_str, name)); + } + } else if (name == ufbxi_Geometry) { + if (sub_type == ufbxi_Mesh) { + ufbxi_check(ufbxi_read_mesh(uc, node, &info)); + } else if (sub_type == ufbxi_Shape) { + ufbxi_check(ufbxi_read_shape(uc, node, &info)); + } else if (sub_type == ufbxi_NurbsCurve) { + ufbxi_check(ufbxi_read_nurbs_curve(uc, node, &info)); + } else if (sub_type == ufbxi_NurbsSurface) { + ufbxi_check(ufbxi_read_nurbs_surface(uc, node, &info)); + } else if (sub_type == ufbxi_Line) { + ufbxi_check(ufbxi_read_line(uc, node, &info)); + } else if (sub_type == ufbxi_TrimNurbsSurface) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_nurbs_trim_surface), UFBX_ELEMENT_NURBS_TRIM_SURFACE)); + } else if (sub_type == ufbxi_Boundary) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_nurbs_trim_boundary), UFBX_ELEMENT_NURBS_TRIM_BOUNDARY)); + } else { + ufbxi_check(ufbxi_read_unknown(uc, node, &info, type_str, sub_type_str, name)); + } + } else if (name == ufbxi_Deformer) { + if (sub_type == ufbxi_Skin) { + ufbxi_check(ufbxi_read_skin(uc, node, &info)); + } else if (sub_type == ufbxi_Cluster) { + ufbxi_check(ufbxi_read_skin_cluster(uc, node, &info)); + } else if (sub_type == ufbxi_BlendShape) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_blend_deformer), UFBX_ELEMENT_BLEND_DEFORMER)); + } else if (sub_type == ufbxi_BlendShapeChannel) { + ufbxi_check(ufbxi_read_blend_channel(uc, node, &info)); + } else if (sub_type == ufbxi_VertexCacheDeformer) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_cache_deformer), UFBX_ELEMENT_CACHE_DEFORMER)); + } else { + ufbxi_check(ufbxi_read_unknown(uc, node, &info, type_str, sub_type_str, name)); + } + } else if (name == ufbxi_Material) { + ufbxi_check(ufbxi_read_material(uc, node, &info)); + } else if (name == ufbxi_Texture) { + ufbxi_check(ufbxi_read_texture(uc, node, &info)); + } else if (name == ufbxi_LayeredTexture) { + ufbxi_check(ufbxi_read_layered_texture(uc, node, &info)); + } else if (name == ufbxi_Video) { + ufbxi_check(ufbxi_read_video(uc, node, &info)); + } else if (name == ufbxi_AnimationStack) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_anim_stack), UFBX_ELEMENT_ANIM_STACK)); + } else if (name == ufbxi_AnimationLayer) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_anim_layer), UFBX_ELEMENT_ANIM_LAYER)); + } else if (name == ufbxi_AnimationCurveNode) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_anim_value), UFBX_ELEMENT_ANIM_VALUE)); + } else if (name == ufbxi_AnimationCurve) { + ufbxi_check(ufbxi_read_animation_curve(uc, node, &info)); + } else if (name == ufbxi_Pose) { + ufbxi_check(ufbxi_read_pose(uc, node, &info, sub_type)); + } else if (name == ufbxi_Implementation) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_shader), UFBX_ELEMENT_SHADER)); + } else if (name == ufbxi_BindingTable) { + ufbxi_check(ufbxi_read_binding_table(uc, node, &info)); + } else if (name == ufbxi_Collection) { + if (sub_type == ufbxi_SelectionSet) { + ufbxi_check(ufbxi_read_selection_set(uc, node, &info)); + } + } else if (name == ufbxi_CollectionExclusive) { + if (sub_type == ufbxi_DisplayLayer) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_display_layer), UFBX_ELEMENT_DISPLAY_LAYER)); + } + } else if (name == ufbxi_SelectionNode) { + ufbxi_check(ufbxi_read_selection_node(uc, node, &info)); + } else if (name == ufbxi_Constraint) { + if (sub_type == ufbxi_Character) { + ufbxi_check(ufbxi_read_character(uc, node, &info)); + } else { + ufbxi_check(ufbxi_read_constraint(uc, node, &info)); + } + } else if (name == ufbxi_SceneInfo) { + ufbxi_check(ufbxi_read_scene_info(uc, node)); + } else if (name == ufbxi_Cache) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_cache_file), UFBX_ELEMENT_CACHE_FILE)); + } else if (name == ufbxi_ObjectMetaData) { + ufbxi_check(ufbxi_read_element(uc, node, &info, sizeof(ufbx_metadata_object), UFBX_ELEMENT_METADATA_OBJECT)); + } else { + ufbxi_check(ufbxi_read_unknown(uc, node, &info, type_str, sub_type_str, name)); + } + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_connections(ufbxi_context *uc) +{ + // Read the connections to the list first + for (;;) { + ufbxi_node *node; + ufbxi_check(ufbxi_parse_toplevel_child(uc, &node)); + if (!node) break; + + char *type; + + uint64_t src_id = 0, dst_id = 0; + ufbx_string src_prop = ufbx_empty_string, dst_prop = ufbx_empty_string; + + if (uc->version < 7000) { + char *src_name = NULL, *dst_name = NULL; + // Pre-7000 versions use Type::Name pairs as identifiers + + if (!ufbxi_get_val1(node, "c", &type)) continue; + + if (type == ufbxi_OO) { + if (!ufbxi_get_val3(node, "_cc", NULL, &src_name, &dst_name)) continue; + } else if (type == ufbxi_OP) { + if (!ufbxi_get_val4(node, "_ccs", NULL, &src_name, &dst_name, &dst_prop)) continue; + } else if (type == ufbxi_PO) { + if (!ufbxi_get_val4(node, "_csc", NULL, &src_name, &src_prop, &dst_name)) continue; + } else if (type == ufbxi_PP) { + if (!ufbxi_get_val5(node, "_cscs", NULL, &src_name, &src_prop, &dst_name, &dst_prop)) continue; + } else { + // TODO: Strict mode? + continue; + } + + if (src_prop.length > 0) { + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &src_prop, false)); + } + if (dst_prop.length > 0) { + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &dst_prop, false)); + } + + src_id = ufbxi_synthetic_id_from_string(src_name); + dst_id = ufbxi_synthetic_id_from_string(dst_name); + + } else { + // Post-7000 versions use proper unique 64-bit IDs + + if (!ufbxi_get_val1(node, "C", &type)) continue; + + if (type == ufbxi_OO) { + if (!ufbxi_get_val3(node, "_LL", NULL, &src_id, &dst_id)) continue; + } else if (type == ufbxi_OP) { + if (!ufbxi_get_val4(node, "_LLS", NULL, &src_id, &dst_id, &dst_prop)) continue; + } else if (type == ufbxi_PO) { + if (!ufbxi_get_val4(node, "_LSL", NULL, &src_id, &src_prop, &dst_id)) continue; + } else if (type == ufbxi_PP) { + if (!ufbxi_get_val5(node, "_LSLS", NULL, &src_id, &src_prop, &dst_id, &dst_prop)) continue; + } else { + // TODO: Strict mode? + continue; + } + } + + ufbxi_tmp_connection *conn = ufbxi_push(&uc->tmp_connections, ufbxi_tmp_connection, 1); + ufbxi_check(conn); + conn->src = src_id; + conn->dst = dst_id; + conn->src_prop = src_prop; + conn->dst_prop = dst_prop; + } + + return 1; +} + +// -- Pre-7000 "Take" based animation + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_take_anim_channel(ufbxi_context *uc, ufbxi_node *node, uint64_t value_fbx_id, const char *name, ufbx_real *p_default) +{ + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_Default, "R", p_default)); + + // Find the key array, early return with success if not found as we may have only a default + ufbxi_value_array *keys = ufbxi_find_array(node, ufbxi_Key, 'd'); + if (!keys) return 1; + + uint64_t curve_fbx_id = 0; + ufbx_anim_curve *curve = ufbxi_push_synthetic_element(uc, &curve_fbx_id, node, name, ufbx_anim_curve, UFBX_ELEMENT_ANIM_CURVE); + ufbxi_check(curve); + + ufbxi_check(ufbxi_connect_op(uc, curve_fbx_id, value_fbx_id, curve->name)); + + if (uc->opts.ignore_animation) return 1; + + size_t num_keys; + ufbxi_check(ufbxi_find_val1(node, ufbxi_KeyCount, "Z", &num_keys)); + curve->keyframes.data = ufbxi_push(&uc->result, ufbx_keyframe, num_keys); + curve->keyframes.count = num_keys; + ufbxi_check(curve->keyframes.data); + + float slope_left = 0.0f; + float weight_left = 0.333333f; + + double next_time = 0.0; + double next_value = 0.0; + double prev_time = 0.0; + + // The pre-7000 keyframe data is stored as a _heterogenous_ array containing 64-bit integers, + // floating point values, and _bare characters_. We cast all values to double and interpret them. + double *data = (double*)keys->data, *data_end = data + keys->size; + + if (num_keys > 0) { + ufbxi_check(data_end - data >= 2); + // TODO: This could break with large times... + next_time = data[0] * uc->ktime_to_sec; + next_value = data[1]; + } + + for (size_t i = 0; i < num_keys; i++) { + ufbx_keyframe *key = &curve->keyframes.data[i]; + + // First three values: Time, Value, InterpolationMode + ufbxi_check(data_end - data >= 3); + key->time = next_time; + key->value = (ufbx_real)next_value; + char mode = (char)data[2]; + data += 3; + + float slope_right = 0.0f; + float weight_right = 0.333333f; + float next_slope_left = 0.0f; + float next_weight_left = 0.333333f; + bool auto_slope = false; + + if (mode == 'U') { + // Cubic interpolation + key->interpolation = UFBX_INTERPOLATION_CUBIC; + + ufbxi_check(data_end - data >= 1); + char slope_mode = (char)data[0]; + data += 1; + + size_t num_weights = 1; + if (slope_mode == 's' || slope_mode == 'b') { + // Slope mode 's'/'b' (standard? broken?) always have two explicit slopes + // TODO: `b` might actually be some kind of TCB curve + ufbxi_check(data_end - data >= 2); + slope_right = (float)data[0]; + next_slope_left = (float)data[1]; + data += 2; + } else if (slope_mode == 'a') { + // Parameterless slope mode 'a' seems to appear in baked animations. Let's just assume + // automatic tangents for now as they're the least likely to break with + // objectionable artifacts. We need to defer the automatic tangent resolve + // until we have read the next time/value. + // TODO: Solve what this is more throroughly + auto_slope = true; + if (uc->version == 5000) { + num_weights = 0; + } + } else if (slope_mode == 'p') { + // TODO: What is this mode? It seems to have negative values sometimes? + // Also it seems to have _two_ trailing weights values, currently observed: + // `n,n` and `a,X,Y,n`... + // Ignore unknown values for now + ufbxi_check(data_end - data >= 2); + data += 2; + num_weights = 2; + } else if (slope_mode == 't') { + // TODO: What is this mode? It seems that it does not have any weights and the + // third value seems _tiny_ (around 1e-30?) + ufbxi_check(data_end - data >= 3); + data += 3; + num_weights = 0; + } else { + ufbxi_fail("Unknown slope mode"); + } + + for (; num_weights > 0; num_weights--) { + ufbxi_check(data_end - data >= 1); + char weight_mode = (char)data[0]; + data += 1; + + if (weight_mode == 'n') { + // Automatic weights (0.3333...) + } else if (weight_mode == 'a') { + // Manual weights: RightWeight, NextLeftWeight + ufbxi_check(data_end - data >= 2); + weight_right = (float)data[0]; + next_weight_left = (float)data[1]; + data += 2; + } else if (weight_mode == 'l') { + // Next left tangent is weighted + ufbxi_check(data_end - data >= 1); + next_weight_left = (float)data[0]; + data += 1; + } else if (weight_mode == 'r') { + // Right tangent is weighted + ufbxi_check(data_end - data >= 1); + weight_right = (float)data[0]; + data += 1; + } else if (weight_mode == 'c') { + // TODO: What is this mode? At least it has no parameters so let's + // just assume automatic weights for the time being (0.3333...) + } else { + ufbxi_fail("Unknown weight mode"); + } + } + + } else if (mode == 'L') { + // Linear interpolation: No parameters + key->interpolation = UFBX_INTERPOLATION_LINEAR; + } else if (mode == 'C') { + // Constant interpolation: Single parameter (use prev/next) + ufbxi_check(data_end - data >= 1); + key->interpolation = (char)data[0] == 'n' ? UFBX_INTERPOLATION_CONSTANT_NEXT : UFBX_INTERPOLATION_CONSTANT_PREV; + data += 1; + } else { + ufbxi_fail("Unknown key mode"); + } + + // Retrieve next key and value + if (i + 1 < num_keys) { + ufbxi_check(data_end - data >= 2); + next_time = data[0] * uc->ktime_to_sec; + next_value = data[1]; + } + + if (auto_slope) { + if (i > 0) { + slope_left = slope_right = ufbxi_solve_auto_tangent( + prev_time, key->time, next_time, + key[-1].value, key->value, (ufbx_real)next_value, + weight_left, weight_right); + } else { + slope_left = slope_right = 0.0f; + } + } + + // Set up linear cubic tangents if necessary + if (key->interpolation == UFBX_INTERPOLATION_LINEAR) { + if (next_time > key->time) { + double slope = (next_value - key->value) / (next_time - key->time); + slope_right = next_slope_left = (float)slope; + } else { + slope_right = next_slope_left = 0.0f; + } + } + + if (key->time > prev_time) { + double delta = key->time - prev_time; + key->left.dx = (float)(weight_left * delta); + key->left.dy = key->left.dx * slope_left; + } else { + key->left.dx = 0.0f; + key->left.dy = 0.0f; + } + + if (next_time > key->time) { + double delta = next_time - key->time; + key->right.dx = (float)(weight_right * delta); + key->right.dy = key->right.dx * slope_right; + } else { + key->right.dx = 0.0f; + key->right.dy = 0.0f; + } + + slope_left = next_slope_left; + weight_left = next_weight_left; + prev_time = key->time; + } + + ufbxi_check(data == data_end); + + return 1; +} + +// Recursion limited as it is further called only for `name="T"/"R"/"S"` and +// cannot enter the `name=="Transform"` branch. +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_take_prop_channel(ufbxi_context *uc, ufbxi_node *node, uint64_t target_fbx_id, uint64_t layer_fbx_id, ufbx_string name) + ufbxi_recursive_function(int, ufbxi_read_take_prop_channel, (uc, node, target_fbx_id, layer_fbx_id, name), 2, + (ufbxi_context *uc, ufbxi_node *node, uint64_t target_fbx_id, uint64_t layer_fbx_id, ufbx_string name)) +{ + if (name.data == ufbxi_Transform) { + // Pre-7000 have transform keyframes in a deeply nested structure, + // flatten it to make it resemble post-7000 structure a bit closer: + // old: Model: { Channel: "Transform" { Channel: "T" { Channel "X": { ... } } } } + // new: Model: { Channel: "Lcl Translation" { Channel "X": { ... } } } + + ufbxi_for(ufbxi_node, child, node->children, node->num_children) { + if (child->name != ufbxi_Channel) continue; + + const char *old_name; + ufbxi_check(ufbxi_get_val1(child, "C", (char**)&old_name)); + + ufbx_string new_name; + if (old_name == ufbxi_T) { new_name.data = ufbxi_Lcl_Translation; new_name.length = sizeof(ufbxi_Lcl_Translation) - 1; } + else if (old_name == ufbxi_R) { new_name.data = ufbxi_Lcl_Rotation; new_name.length = sizeof(ufbxi_Lcl_Rotation) - 1; } + else if (old_name == ufbxi_S) { new_name.data = ufbxi_Lcl_Scaling; new_name.length = sizeof(ufbxi_Lcl_Scaling) - 1; } + else { + continue; + } + + // Read child as a top-level property channel + ufbxi_check(ufbxi_read_take_prop_channel(uc, child, target_fbx_id, layer_fbx_id, new_name)); + } + + } else { + + // Pre-6000 FBX files store blend shape keys with a " (Shape)" suffix + if (uc->version < 6000) { + const char *const suffix = " (Shape)"; + size_t suffix_len = strlen(suffix); + if (name.length > suffix_len && !memcmp(name.data + name.length - suffix_len, suffix, suffix_len)) { + name.length -= suffix_len; + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &name, false)); + } + } + + // Find 1-3 channel nodes that contain a `Key:` node + ufbxi_node *channel_nodes[3] = { 0 }; + const char *channel_names[3] = { 0 }; + size_t num_channel_nodes = 0; + + if (ufbxi_find_child(node, ufbxi_Key) || ufbxi_find_child(node, ufbxi_Default)) { + // Channel has only a single curve + channel_nodes[0] = node; + channel_names[0] = name.data; + num_channel_nodes = 1; + } else { + // Channel is a compound of multiple curves + ufbxi_for(ufbxi_node, child, node->children, node->num_children) { + if (child->name != ufbxi_Channel) continue; + if (!ufbxi_find_child(child, ufbxi_Key) && !ufbxi_find_child(child, ufbxi_Default)) continue; + if (!ufbxi_get_val1(child, "C", (char**)&channel_names[num_channel_nodes])) continue; + channel_nodes[num_channel_nodes] = child; + if (++num_channel_nodes == 3) break; + } + } + + // Early return: No valid channels found, not an error + if (num_channel_nodes == 0) return 1; + + uint64_t value_fbx_id = 0; + ufbx_anim_value *value = ufbxi_push_synthetic_element(uc, &value_fbx_id, node, name.data, ufbx_anim_value, UFBX_ELEMENT_ANIM_VALUE); + + // Add a "virtual" connection between the animated property and the layer/target + ufbxi_check(ufbxi_connect_oo(uc, value_fbx_id, layer_fbx_id)); + ufbxi_check(ufbxi_connect_op(uc, value_fbx_id, target_fbx_id, name)); + + for (size_t i = 0; i < num_channel_nodes; i++) { + ufbxi_check(ufbxi_read_take_anim_channel(uc, channel_nodes[i], value_fbx_id, channel_names[i], &value->default_value.v[i])); + } + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_take_object(ufbxi_context *uc, ufbxi_node *node, uint64_t layer_fbx_id) +{ + // Takes are used only in pre-7000 FBX versions so objects are identified + // by their unique Type::Name pair that we use as unique IDs through the + // pooled interned string pointers. + const char *type_and_name; + ufbxi_check(ufbxi_get_val1(node, "c", (char**)&type_and_name)); + uint64_t target_fbx_id = ufbxi_synthetic_id_from_string(type_and_name); + + // Add all suitable Channels as animated properties + ufbxi_for(ufbxi_node, child, node->children, node->num_children) { + ufbx_string name; + if (child->name != ufbxi_Channel) continue; + if (!ufbxi_get_val1(child, "S", &name)) continue; + + ufbxi_check(ufbxi_read_take_prop_channel(uc, child, target_fbx_id, layer_fbx_id, name)); + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_take(ufbxi_context *uc, ufbxi_node *node) +{ + uint64_t stack_fbx_id = 0, layer_fbx_id = 0; + + // Treat the Take as a post-7000 version animation stack and layer. + ufbx_anim_stack *stack = ufbxi_push_synthetic_element(uc, &stack_fbx_id, node, NULL, ufbx_anim_stack, UFBX_ELEMENT_ANIM_STACK); + ufbxi_check(stack); + ufbxi_check(ufbxi_get_val1(node, "S", &stack->name)); + + ufbx_anim_layer *layer = ufbxi_push_synthetic_element(uc, &layer_fbx_id, node, ufbxi_BaseLayer, ufbx_anim_layer, UFBX_ELEMENT_ANIM_LAYER); + ufbxi_check(layer); + + ufbxi_check(ufbxi_connect_oo(uc, layer_fbx_id, stack_fbx_id)); + + // Read stack properties from node + int64_t begin = 0, end = 0; + if (!ufbxi_find_val2(node, ufbxi_LocalTime, "LL", &begin, &end)) { + ufbxi_check(ufbxi_find_val2(node, ufbxi_ReferenceTime, "LL", &begin, &end)); + } + stack->time_begin = (double)begin * uc->ktime_to_sec; + stack->time_end = (double)end * uc->ktime_to_sec; + + // Read all properties of objects included in the take + ufbxi_for(ufbxi_node, child, node->children, node->num_children) { + // TODO: Do some object types have another name? + if (child->name != ufbxi_Model) continue; + + ufbxi_check(ufbxi_read_take_object(uc, child, layer_fbx_id)); + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_takes(ufbxi_context *uc) +{ + for (;;) { + ufbxi_node *node; + ufbxi_check(ufbxi_parse_toplevel_child(uc, &node)); + if (!node) break; + + if (node->name == ufbxi_Take) { + ufbxi_check(ufbxi_read_take(uc, node)); + } + } + + return 1; +} + +ufbxi_noinline static void ufbxi_setup_root_node(ufbxi_context *uc, ufbx_node *root) +{ + if (uc->opts.use_root_transform) { + root->local_transform = uc->opts.root_transform; + root->node_to_parent = ufbx_transform_to_matrix(&uc->opts.root_transform); + } else { + root->local_transform = ufbx_identity_transform; + root->node_to_parent = ufbx_identity_matrix; + } + root->is_root = true; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_root(ufbxi_context *uc) +{ + // FBXHeaderExtension: Some metadata (optional) + ufbxi_check(ufbxi_parse_toplevel(uc, ufbxi_FBXHeaderExtension)); + ufbxi_check(ufbxi_read_header_extension(uc)); + + // The ASCII exporter version is stored in top-level + if (uc->exporter == UFBX_EXPORTER_BLENDER_ASCII) { + ufbxi_check(ufbxi_parse_toplevel(uc, ufbxi_Creator)); + if (uc->top_node) { + ufbxi_ignore(ufbxi_get_val1(uc->top_node, "S", &uc->scene.metadata.creator)); + } + } + + // Resolve the exporter before continuing + ufbxi_check(ufbxi_match_exporter(uc)); + if (uc->version < 7000) { + ufbxi_check(ufbxi_init_node_prop_names(uc)); + } + + // Document: Read root ID + if (uc->version >= 7000) { + ufbxi_check(ufbxi_parse_toplevel(uc, ufbxi_Documents)); + ufbxi_check(ufbxi_read_document(uc)); + } else { + // Pre-7000: Root node has a specific type-name pair "Model::Scene" + // (or reversed in binary). Use the interned name as ID as usual. + const char *root_name = uc->from_ascii ? "Model::Scene" : "Scene\x00\x01Model"; + root_name = ufbxi_push_string_imp(&uc->string_pool, root_name, 12, NULL, false, true); + ufbxi_check(root_name); + uc->root_id = ufbxi_synthetic_id_from_string(root_name); + } + + // Add a nameless root node with the root ID + { + ufbxi_element_info root_info = { uc->root_id }; + root_info.name = ufbx_empty_string; + ufbx_node *root = ufbxi_push_element(uc, &root_info, ufbx_node, UFBX_ELEMENT_NODE); + ufbxi_check(root); + ufbxi_setup_root_node(uc, root); + ufbxi_check(ufbxi_push_copy(&uc->tmp_node_ids, uint32_t, 1, &root->element.element_id)); + } + + // Definitions: Object type counts and property templates (optional) + ufbxi_check(ufbxi_parse_toplevel(uc, ufbxi_Definitions)); + ufbxi_check(ufbxi_read_definitions(uc)); + + // Objects: Actual scene data + ufbxi_check(ufbxi_parse_toplevel(uc, ufbxi_Objects)); + if (!uc->sure_fbx) { + // If the file is a bit iffy about being a real FBX file reject it if + // even the objects are not found. + ufbxi_check_msg(uc->top_node, "Not an FBX file"); + } + ufbxi_check(ufbxi_read_objects(uc)); + + // Connections: Relationships between nodes + ufbxi_check(ufbxi_parse_toplevel(uc, ufbxi_Connections)); + ufbxi_check(ufbxi_read_connections(uc)); + + // Takes: Pre-7000 animations, don't even try to read them in + // post-7000 versions as the code has some assumptions about the version. + if (uc->version < 7000) { + ufbxi_check(ufbxi_parse_toplevel(uc, ufbxi_Takes)); + ufbxi_check(ufbxi_read_takes(uc)); + } + + // Check if there's a top-level GlobalSettings that we skimmed over + ufbxi_check(ufbxi_parse_toplevel(uc, ufbxi_GlobalSettings)); + if (uc->top_node) { + ufbxi_check(ufbxi_read_global_settings(uc, uc->top_node)); + } + + // Force parsing all the nodes by parsing a toplevel that cannot be found + if (uc->opts.retain_dom) { + ufbxi_check(ufbxi_parse_toplevel(uc, NULL)); + } + + return 1; +} + +typedef struct { + const char *prop_name; + ufbx_prop_type prop_type; + const char *node_name; + const char *node_fmt; +} ufbxi_legacy_prop; + +// Must be alphabetically sorted! +static const ufbxi_legacy_prop ufbxi_legacy_light_props[] = { + { ufbxi_CastLight, UFBX_PROP_BOOLEAN, ufbxi_CastLight, "L" }, + { ufbxi_CastShadows, UFBX_PROP_BOOLEAN, ufbxi_CastShadows, "L" }, + { ufbxi_Color, UFBX_PROP_COLOR, ufbxi_Color, "RRR" }, + { ufbxi_ConeAngle, UFBX_PROP_NUMBER, ufbxi_ConeAngle, "R" }, + { ufbxi_HotSpot, UFBX_PROP_NUMBER, ufbxi_HotSpot, "R" }, + { ufbxi_Intensity, UFBX_PROP_NUMBER, ufbxi_Intensity, "R" }, + { ufbxi_LightType, UFBX_PROP_INTEGER, ufbxi_LightType, "L" }, +}; + +// Must be alphabetically sorted! +static const ufbxi_legacy_prop ufbxi_legacy_camera_props[] = { + { ufbxi_ApertureMode, UFBX_PROP_INTEGER, ufbxi_ApertureMode, "L" }, + { ufbxi_AspectH, UFBX_PROP_NUMBER, ufbxi_AspectH, "R" }, + { ufbxi_AspectRatioMode, UFBX_PROP_INTEGER, "AspectType", "L" }, + { ufbxi_AspectW, UFBX_PROP_NUMBER, ufbxi_AspectW, "R" }, + { ufbxi_FieldOfView, UFBX_PROP_NUMBER, "Aperture", "R" }, + { ufbxi_FieldOfViewX, UFBX_PROP_NUMBER, "FieldOfViewXProperty", "R" }, + { ufbxi_FieldOfViewY, UFBX_PROP_NUMBER, "FieldOfViewYProperty", "R" }, + { ufbxi_FilmHeight, UFBX_PROP_NUMBER, "CameraAperture", "_R" }, + { ufbxi_FilmSqueezeRatio, UFBX_PROP_NUMBER, "SqueezeRatio", "R" }, + { ufbxi_FilmWidth, UFBX_PROP_NUMBER, "CameraAperture", "R_" }, + { ufbxi_FocalLength, UFBX_PROP_NUMBER, ufbxi_FocalLength, "R" }, +}; + +// Must be alphabetically sorted! +static const ufbxi_legacy_prop ufbxi_legacy_bone_props[] = { + { ufbxi_Size, UFBX_PROP_NUMBER, ufbxi_Size, "R" }, +}; + +// Must be alphabetically sorted! +static const ufbxi_legacy_prop ufbxi_legacy_material_props[] = { + { ufbxi_AmbientColor, UFBX_PROP_COLOR, "Ambient", "RRR" }, + { ufbxi_DiffuseColor, UFBX_PROP_COLOR, "Diffuse", "RRR" }, + { ufbxi_EmissiveColor, UFBX_PROP_COLOR, "Emissive", "RRR" }, + { ufbxi_ShadingModel, UFBX_PROP_COLOR, ufbxi_ShadingModel, "S" }, + { ufbxi_Shininess, UFBX_PROP_NUMBER, "Shininess", "R" }, + { ufbxi_SpecularColor, UFBX_PROP_COLOR, "Specular", "RRR" }, +}; + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_legacy_prop(ufbxi_node *node, ufbx_prop *prop, const ufbxi_legacy_prop *legacy_prop) +{ + size_t value_ix = 0; + uint32_t flags = 0; + + const char *fmt = legacy_prop->node_fmt; + for (size_t fmt_ix = 0; fmt[fmt_ix]; fmt_ix++) { + char c = fmt[fmt_ix]; + switch (c) { + case 'L': + ufbx_assert(value_ix == 0); + if (!ufbxi_get_val_at(node, fmt_ix, 'L', &prop->value_int)) return 0; + prop->value_real = (ufbx_real)prop->value_int; + prop->value_real_arr[1] = 0.0f; + prop->value_real_arr[2] = 0.0f; + prop->value_real_arr[3] = 0.0f; + prop->value_str = ufbx_empty_string; + prop->value_blob = ufbx_empty_blob; + flags |= (uint32_t)UFBX_PROP_FLAG_VALUE_INT; + value_ix++; + break; + case 'R': + ufbx_assert(value_ix < 4); + if (!ufbxi_get_val_at(node, fmt_ix, 'R', &prop->value_real_arr[value_ix])) return 0; + if (value_ix == 0) { + prop->value_int = ufbxi_f64_to_i64(prop->value_real); + prop->value_real_arr[1] = 0.0f; + prop->value_real_arr[2] = 0.0f; + prop->value_real_arr[3] = 0.0f; + prop->value_str = ufbx_empty_string; + prop->value_blob = ufbx_empty_blob; + } + flags &= ~(uint32_t)(UFBX_PROP_FLAG_VALUE_REAL|UFBX_PROP_FLAG_VALUE_VEC2|UFBX_PROP_FLAG_VALUE_VEC3|UFBX_PROP_FLAG_VALUE_VEC4); + flags |= (uint32_t)UFBX_PROP_FLAG_VALUE_REAL << value_ix; + value_ix++; + break; + case 'S': + ufbx_assert(value_ix == 0); + if (!ufbxi_get_val_at(node, fmt_ix, 'S', &prop->value_str)) return 0; + if (prop->value_str.length > 0) { + int found = ufbxi_get_val_at(node, fmt_ix, 'b', &prop->value_blob); + ufbxi_ignore(found); + ufbx_assert(found); + } else { + prop->value_blob = ufbx_empty_blob; + } + prop->value_real = 0.0f; + prop->value_real_arr[1] = 0.0f; + prop->value_real_arr[2] = 0.0f; + prop->value_real_arr[3] = 0.0f; + prop->value_int = 0; + flags |= (uint32_t)UFBX_PROP_FLAG_VALUE_STR; + value_ix++; + break; + case '_': + break; + default: + ufbx_assert(0 && "Unhandled legacy fmt"); + break; + } + } + + prop->flags = (ufbx_prop_flags)flags; + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static size_t ufbxi_read_legacy_props(ufbxi_node *node, ufbx_prop *props, const ufbxi_legacy_prop *legacy_props, size_t num_legacy) +{ + size_t num_props = 0; + for (size_t legacy_ix = 0; legacy_ix < num_legacy; legacy_ix++) { + const ufbxi_legacy_prop *legacy_prop = &legacy_props[legacy_ix]; + ufbx_prop *prop = &props[num_props]; + + ufbxi_node *n = ufbxi_find_child_strcmp(node, legacy_prop->node_name); + if (!n) continue; + if (!ufbxi_read_legacy_prop(n, prop, legacy_prop)) continue; + + prop->name.data = legacy_prop->prop_name; + prop->name.length = strlen(legacy_prop->prop_name); + prop->_internal_key = ufbxi_get_name_key(prop->name.data, prop->name.length); + prop->flags = (ufbx_prop_flags)0; + prop->type = legacy_prop->prop_type; + num_props++; + } + + return num_props; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_legacy_material(ufbxi_context *uc, ufbxi_node *node, uint64_t *p_fbx_id, const char *name) +{ + ufbx_material *ufbxi_restrict material = ufbxi_push_synthetic_element(uc, p_fbx_id, node, name, ufbx_material, UFBX_ELEMENT_MATERIAL); + ufbxi_check(material); + + ufbx_prop tmp_props[ufbxi_arraycount(ufbxi_legacy_material_props)]; + size_t num_props = ufbxi_read_legacy_props(node, tmp_props, ufbxi_legacy_material_props, ufbxi_arraycount(ufbxi_legacy_material_props)); + + material->shading_model_name = ufbx_empty_string; + material->props.props.count = num_props; + material->props.props.data = ufbxi_push_copy(&uc->result, ufbx_prop, num_props, tmp_props); + ufbxi_check(material->props.props.data); + + material->shader_prop_prefix = ufbx_empty_string; + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_legacy_link(ufbxi_context *uc, ufbxi_node *node, uint64_t *p_fbx_id, const char *name) +{ + ufbx_skin_cluster *ufbxi_restrict cluster = ufbxi_push_synthetic_element(uc, p_fbx_id, node, name, ufbx_skin_cluster, UFBX_ELEMENT_SKIN_CLUSTER); + ufbxi_check(cluster); + + // TODO: Merge with ufbxi_read_skin_cluster(), at least partially? + ufbxi_value_array *indices = ufbxi_find_array(node, ufbxi_Indexes, 'i'); + ufbxi_value_array *weights = ufbxi_find_array(node, ufbxi_Weights, 'r'); + + if (indices && weights) { + ufbxi_check(indices->size == weights->size); + cluster->num_weights = indices->size; + cluster->vertices.data = (uint32_t*)indices->data; + cluster->weights.data = (ufbx_real*)weights->data; + cluster->vertices.count = cluster->num_weights; + cluster->weights.count = cluster->num_weights; + } + + ufbxi_value_array *transform = ufbxi_find_array(node, ufbxi_Transform, 'r'); + ufbxi_value_array *transform_link = ufbxi_find_array(node, ufbxi_TransformLink, 'r'); + if (transform && transform_link) { + ufbxi_check(transform->size >= 16); + ufbxi_check(transform_link->size >= 16); + + ufbxi_read_transform_matrix(&cluster->mesh_node_to_bone, (ufbx_real*)transform->data); + ufbxi_read_transform_matrix(&cluster->bind_to_world, (ufbx_real*)transform_link->data); + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_legacy_light(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_light *ufbxi_restrict light = ufbxi_push_element(uc, info, ufbx_light, UFBX_ELEMENT_LIGHT); + ufbxi_check(light); + + ufbx_prop tmp_props[ufbxi_arraycount(ufbxi_legacy_light_props)]; + size_t num_props = ufbxi_read_legacy_props(node, tmp_props, ufbxi_legacy_light_props, ufbxi_arraycount(ufbxi_legacy_light_props)); + + light->props.props.count = num_props; + light->props.props.data = ufbxi_push_copy(&uc->result, ufbx_prop, num_props, tmp_props); + ufbxi_check(light->props.props.data); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_legacy_camera(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_camera *ufbxi_restrict camera = ufbxi_push_element(uc, info, ufbx_camera, UFBX_ELEMENT_CAMERA); + ufbxi_check(camera); + + ufbx_prop tmp_props[ufbxi_arraycount(ufbxi_legacy_camera_props)]; + size_t num_props = ufbxi_read_legacy_props(node, tmp_props, ufbxi_legacy_camera_props, ufbxi_arraycount(ufbxi_legacy_camera_props)); + + camera->props.props.count = num_props; + camera->props.props.data = ufbxi_push_copy(&uc->result, ufbx_prop, num_props, tmp_props); + ufbxi_check(camera->props.props.data); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_legacy_limb_node(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + ufbx_bone *ufbxi_restrict bone = ufbxi_push_element(uc, info, ufbx_bone, UFBX_ELEMENT_BONE); + ufbxi_check(bone); + + ufbx_prop tmp_props[ufbxi_arraycount(ufbxi_legacy_bone_props)]; + size_t num_props = 0; + + ufbxi_node *prop_node = ufbxi_find_child_strcmp(node, "Properties"); + if (prop_node) { + num_props = ufbxi_read_legacy_props(prop_node, tmp_props, ufbxi_legacy_bone_props, ufbxi_arraycount(ufbxi_legacy_bone_props)); + } + + bone->props.props.count = num_props; + bone->props.props.data = ufbxi_push_copy(&uc->result, ufbx_prop, num_props, tmp_props); + ufbxi_check(bone->props.props.data); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_legacy_mesh(ufbxi_context *uc, ufbxi_node *node, ufbxi_element_info *info) +{ + // Only read polygon meshes, ignore eg. NURBS without error + ufbxi_node *node_vertices = ufbxi_find_child(node, ufbxi_Vertices); + ufbxi_node *node_indices = ufbxi_find_child(node, ufbxi_PolygonVertexIndex); + if (!node_vertices || !node_indices) return 1; + + ufbx_mesh *ufbxi_restrict mesh = ufbxi_push_element(uc, info, ufbx_mesh, UFBX_ELEMENT_MESH); + ufbxi_check(mesh); + + ufbxi_check(ufbxi_read_synthetic_blend_shapes(uc, node, info)); + + ufbxi_patch_mesh_reals(mesh); + + if (uc->opts.ignore_geometry) return 1; + + ufbxi_value_array *vertices = ufbxi_get_array(node_vertices, 'r'); + ufbxi_value_array *indices = ufbxi_get_array(node_indices, 'i'); + ufbxi_check(vertices && indices); + ufbxi_check(vertices->size % 3 == 0); + + mesh->num_vertices = vertices->size / 3; + mesh->num_indices = indices->size; + + uint32_t *index_data = (uint32_t*)indices->data; + + // Duplicate `index_data` for modification if we retain DOM + if (uc->opts.retain_dom) { + index_data = ufbxi_push_copy(&uc->result, uint32_t, indices->size, index_data); + ufbxi_check(index_data); + } + + mesh->vertices.data = (ufbx_vec3*)vertices->data; + mesh->vertex_indices.data = index_data; + mesh->vertices.count = mesh->num_vertices; + mesh->vertex_indices.count = mesh->num_indices; + + mesh->vertex_position.exists = true; + mesh->vertex_position.values.data = (ufbx_vec3*)vertices->data; + mesh->vertex_position.values.count = mesh->num_vertices; + mesh->vertex_position.indices.data = index_data; + mesh->vertex_position.indices.count = mesh->num_indices; + mesh->vertex_position.unique_per_vertex = true; + + // Check/make sure that the last index is negated (last of polygon) + if (mesh->num_indices > 0) { + if ((int32_t)index_data[mesh->num_indices - 1] >= 0) { + if (uc->opts.strict) ufbxi_fail("Non-negated last index"); + index_data[mesh->num_indices - 1] = ~index_data[mesh->num_indices - 1]; + } + } + + ufbxi_check(ufbxi_process_indices(uc, mesh, index_data)); + + // Normals are either per-vertex or per-index in legacy FBX files? + // If the version is 5000 prefer per-vertex, otherwise per-index... + ufbxi_value_array *normals = ufbxi_find_array(node, ufbxi_Normals, 'r'); + if (normals) { + size_t num_normals = normals->size / 3; + bool per_vertex = num_normals == mesh->num_vertices; + bool per_index = num_normals == mesh->num_indices; + if (per_vertex && (!per_index || uc->version == 5000)) { + mesh->vertex_normal.exists = true; + mesh->vertex_normal.values.count = num_normals; + mesh->vertex_normal.indices.count = mesh->num_indices; + mesh->vertex_normal.unique_per_vertex = true; + mesh->vertex_normal.values.data = (ufbx_vec3*)normals->data; + mesh->vertex_normal.indices.data = mesh->vertex_indices.data; + } else if (per_index) { + uc->max_consecutive_indices = ufbxi_max_sz(uc->max_consecutive_indices, mesh->num_indices); + mesh->vertex_normal.exists = true; + mesh->vertex_normal.values.count = num_normals; + mesh->vertex_normal.indices.count = mesh->num_indices; + mesh->vertex_normal.unique_per_vertex = false; + mesh->vertex_normal.values.data = (ufbx_vec3*)normals->data; + mesh->vertex_normal.indices.data = (uint32_t*)ufbxi_sentinel_index_consecutive; + } + } + + // Optional UV values are stored pretty much like a modern vertex element + ufbxi_node *uv_info = ufbxi_find_child(node, ufbxi_GeometryUVInfo); + if (uv_info) { + ufbx_uv_set *set = ufbxi_push_zero(&uc->result, ufbx_uv_set, 1); + ufbxi_check(set); + set->index = 0; + set->name.data = ufbxi_empty_char; + ufbxi_check(ufbxi_read_vertex_element(uc, mesh, uv_info, (ufbx_vertex_attrib*)&set->vertex_uv, + ufbxi_TextureUV, ufbxi_TextureUVVerticeIndex, 'r', 2)); + + mesh->uv_sets.data = set; + mesh->uv_sets.count = 1; + mesh->vertex_uv = set->vertex_uv; + } + + // Material indices + { + const char *mapping; + ufbxi_check(ufbxi_find_val1(node, ufbxi_MaterialAssignation, "C", (char**)&mapping)); + if (mapping == ufbxi_ByPolygon) { + ufbxi_check(ufbxi_read_truncated_array(uc, &mesh->face_material.data, &mesh->face_material.count, node, ufbxi_Materials, 'i', mesh->num_faces)); + } else if (mapping == ufbxi_AllSame) { + ufbxi_value_array *arr = ufbxi_find_array(node, ufbxi_Materials, 'i'); + uint32_t material = 0; + if (arr && arr->size >= 1) { + material = ((uint32_t*)arr->data)[0]; + } + + mesh->face_material.count = mesh->num_faces; + if (material == 0) { + mesh->face_material.data = (uint32_t*)ufbxi_sentinel_index_zero; + } else { + mesh->face_material.data = ufbxi_push(&uc->result, uint32_t, mesh->num_faces); + ufbxi_check(mesh->face_material.data); + ufbxi_for_list(uint32_t, p_mat, mesh->face_material) { + *p_mat = material; + } + } + } + } + + uint64_t skin_fbx_id = 0; + ufbx_skin_deformer *skin = NULL; + + // Materials, Skin Clusters + ufbxi_for(ufbxi_node, child, node->children, node->num_children) { + if (child->name == ufbxi_Material) { + uint64_t fbx_id = 0; + ufbx_string type_and_name, type, name; + ufbxi_check(ufbxi_get_val1(child, "s", &type_and_name)); + ufbxi_check(ufbxi_split_type_and_name(uc, type_and_name, &type, &name)); + ufbxi_check(ufbxi_read_legacy_material(uc, child, &fbx_id, name.data)); + ufbxi_check(ufbxi_connect_oo(uc, fbx_id, info->fbx_id)); + } else if (child->name == ufbxi_Link) { + uint64_t fbx_id = 0; + ufbx_string type_and_name, type, name; + ufbxi_check(ufbxi_get_val1(child, "s", &type_and_name)); + ufbxi_check(ufbxi_split_type_and_name(uc, type_and_name, &type, &name)); + ufbxi_check(ufbxi_read_legacy_link(uc, child, &fbx_id, name.data)); + + uint64_t node_fbx_id = ufbxi_synthetic_id_from_string(type_and_name.data); + ufbxi_check(ufbxi_connect_oo(uc, node_fbx_id, fbx_id)); + if (!skin) { + skin = ufbxi_push_synthetic_element(uc, &skin_fbx_id, NULL, info->name.data, ufbx_skin_deformer, UFBX_ELEMENT_SKIN_DEFORMER); + ufbxi_check(skin); + ufbxi_check(ufbxi_connect_oo(uc, skin_fbx_id, info->fbx_id)); + } + ufbxi_check(ufbxi_connect_oo(uc, fbx_id, skin_fbx_id)); + } + } + + mesh->skinned_is_local = true; + mesh->skinned_position = mesh->vertex_position; + mesh->skinned_normal = mesh->vertex_normal; + + ufbxi_patch_mesh_reals(mesh); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_read_legacy_model(ufbxi_context *uc, ufbxi_node *node) +{ + ufbx_string type_and_name, type, name; + ufbxi_check(ufbxi_get_val1(node, "s", &type_and_name)); + ufbxi_check(ufbxi_split_type_and_name(uc, type_and_name, &type, &name)); + + ufbxi_element_info info = { 0 }; + info.fbx_id = ufbxi_synthetic_id_from_string(type_and_name.data); + info.name = name; + info.dom_node = ufbxi_get_dom_node(uc, node); + + ufbx_node *elem_node = ufbxi_push_element(uc, &info, ufbx_node, UFBX_ELEMENT_NODE); + ufbxi_check(elem_node); + ufbxi_check(ufbxi_push_copy(&uc->tmp_node_ids, uint32_t, 1, &elem_node->element.element_id)); + + ufbxi_element_info attrib_info = { 0 }; + ufbxi_check(ufbxi_push_synthetic_id(uc, &attrib_info.fbx_id)); + attrib_info.name = name; + attrib_info.dom_node = info.dom_node; + + // If we make unused connections it doesn't matter.. + ufbxi_check(ufbxi_connect_oo(uc, attrib_info.fbx_id, info.fbx_id)); + + const char *attrib_type = ufbxi_empty_char; + ufbxi_ignore(ufbxi_find_val1(node, ufbxi_Type, "C", (char**)&attrib_type)); + + bool has_attrib = true; + if (attrib_type == ufbxi_Light) { + ufbxi_check(ufbxi_read_legacy_light(uc, node, &attrib_info)); + } else if (attrib_type == ufbxi_Camera) { + ufbxi_check(ufbxi_read_legacy_camera(uc, node, &attrib_info)); + } else if (attrib_type == ufbxi_LimbNode) { + ufbxi_check(ufbxi_read_legacy_limb_node(uc, node, &attrib_info)); + } else if (ufbxi_find_child(node, ufbxi_Vertices)) { + ufbxi_check(ufbxi_read_legacy_mesh(uc, node, &attrib_info)); + } else { + has_attrib = false; + } + + // Mark the node as having an attribute so property connections can be forwarded + if (has_attrib) { + ufbxi_check(ufbxi_insert_fbx_attr(uc, info.fbx_id, attrib_info.fbx_id)); + } + + // Children are represented as an array of strings + ufbxi_value_array *children = ufbxi_find_array(node, ufbxi_Children, 's'); + if (children) { + ufbx_string *names = (ufbx_string*)children->data; + for (size_t i = 0; i < children->size; i++) { + uint64_t child_fbx_id = ufbxi_synthetic_id_from_string(names[i].data); + ufbxi_check(ufbxi_connect_oo(uc, child_fbx_id, info.fbx_id)); + } + } + + // Non-take animation channels + ufbxi_for(ufbxi_node, child, node->children, node->num_children) { + if (child->name == ufbxi_Channel) { + ufbx_string channel_name; + if (ufbxi_get_val1(child, "S", &channel_name)) { + if (uc->legacy_implicit_anim_layer_id == 0) { + // Defer creation so we won't be the first animation stack.. + ufbxi_check(ufbxi_push_synthetic_id(uc, &uc->legacy_implicit_anim_layer_id)); + } + ufbxi_check(ufbxi_read_take_prop_channel(uc, child, info.fbx_id, uc->legacy_implicit_anim_layer_id, channel_name)); + } + } + } + + return 1; +} + +// Read a pre-6000 FBX file where everything is stored at the root level +ufbxi_nodiscard static ufbxi_noinline int ufbxi_read_legacy_root(ufbxi_context *uc) +{ + ufbxi_check(ufbxi_init_node_prop_names(uc)); + + // Some legacy FBX files have an `Fbx_Root` node that could be used as the + // root node. However no other formats have root node with transforms so it + // might be better to leave it as-is and create an empty one. + { + ufbx_node *root = ufbxi_push_synthetic_element(uc, &uc->root_id, NULL, ufbxi_empty_char, ufbx_node, UFBX_ELEMENT_NODE); + ufbxi_check(root); + ufbxi_setup_root_node(uc, root); + ufbxi_check(ufbxi_push_copy(&uc->tmp_node_ids, uint32_t, 1, &root->element.element_id)); + } + + for (;;) { + ufbxi_check(ufbxi_parse_legacy_toplevel(uc)); + if (!uc->top_node) break; + + ufbxi_node *node = uc->top_node; + if (node->name == ufbxi_FBXHeaderExtension) { + ufbxi_check(ufbxi_read_header_extension(uc)); + } else if (node->name == ufbxi_Takes) { + ufbxi_check(ufbxi_read_takes(uc)); + } else if (node->name == ufbxi_Takes) { + ufbxi_check(ufbxi_read_takes(uc)); + } else if (node->name == ufbxi_Model) { + ufbxi_check(ufbxi_read_legacy_model(uc, node)); + } + } + + if (uc->opts.retain_dom) { + ufbxi_check(ufbxi_retain_toplevel(uc, NULL)); + } + + // Create the implicit animation stack if necessary + if (uc->legacy_implicit_anim_layer_id) { + ufbxi_element_info layer_info = { 0 }; + layer_info.fbx_id = uc->legacy_implicit_anim_layer_id; + layer_info.name.data = "(internal)"; + layer_info.name.length = strlen(layer_info.name.data); + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &layer_info.name, true)); + ufbx_anim_layer *layer = ufbxi_push_element(uc, &layer_info, ufbx_anim_layer, UFBX_ELEMENT_ANIM_LAYER); + ufbxi_check(layer); + + ufbxi_element_info stack_info = layer_info; + ufbxi_check(ufbxi_push_synthetic_id(uc, &stack_info.fbx_id)); + ufbx_anim_stack *stack = ufbxi_push_element(uc, &stack_info, ufbx_anim_stack, UFBX_ELEMENT_ANIM_STACK); + ufbxi_check(stack); + + ufbxi_check(ufbxi_connect_oo(uc, layer_info.fbx_id, stack_info.fbx_id)); + } + + return 1; +} + +// Filename manipulation + +ufbxi_nodiscard ufbxi_noinline static size_t ufbxi_trim_delimiters(ufbxi_context *uc, const char *data, size_t length) +{ + for (; length > 0; length--) { + char c = data[length - 1]; + bool is_separator = c == '/' || c == uc->opts.path_separator; + if (is_separator) { + length--; + break; + } + } + return length; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_init_file_paths(ufbxi_context *uc) +{ + if (uc->opts.filename.length > 0) { + uc->scene.metadata.filename = uc->opts.filename; + } else if (uc->opts.raw_filename.size > 0) { + uc->scene.metadata.filename.data = (const char*)uc->opts.raw_filename.data; + uc->scene.metadata.filename.length = uc->opts.raw_filename.size; + } + + if (uc->opts.raw_filename.size > 0) { + uc->scene.metadata.raw_filename = uc->opts.raw_filename; + } else if (uc->opts.filename.length > 0) { + uc->scene.metadata.raw_filename.data = uc->opts.filename.data; + uc->scene.metadata.raw_filename.size = uc->opts.filename.length; + } + + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &uc->scene.metadata.filename, false)); + ufbxi_check(ufbxi_push_string_place_blob(&uc->string_pool, &uc->scene.metadata.raw_filename, true)); + + uc->scene.metadata.relative_root.data = uc->scene.metadata.filename.data; + uc->scene.metadata.relative_root.length = ufbxi_trim_delimiters(uc, uc->scene.metadata.filename.data, uc->scene.metadata.filename.length); + + uc->scene.metadata.raw_relative_root.data = uc->scene.metadata.raw_filename.data; + uc->scene.metadata.raw_relative_root.size = ufbxi_trim_delimiters(uc, (const char*)uc->scene.metadata.raw_filename.data, uc->scene.metadata.raw_filename.size); + + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &uc->scene.metadata.relative_root, false)); + ufbxi_check(ufbxi_push_string_place_blob(&uc->string_pool, &uc->scene.metadata.raw_relative_root, true)); + + return 1; +} + +typedef union { + ufbx_string str; + ufbx_blob blob; +} ufbxi_strblob; + +static ufbxi_noinline void ufbxi_strblob_set(ufbxi_strblob *dst, const char *data, size_t length, bool raw) +{ + if (raw) { + dst->blob.data = data; + dst->blob.size = length; + } else { + dst->str.data = length == 0 ? ufbxi_empty_char : data; + dst->str.length = length; + } +} + +static ufbxi_forceinline const char *ufbxi_strblob_data(const ufbxi_strblob *strblob, bool raw) +{ + return raw ? (const char*)strblob->blob.data : strblob->str.data; +} + +static ufbxi_forceinline size_t ufbxi_strblob_length(const ufbxi_strblob *strblob, bool raw) +{ + return raw ? strblob->blob.size : strblob->str.length; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_resolve_relative_filename(ufbxi_context *uc, ufbxi_strblob *p_dst, const ufbxi_strblob *p_src, bool raw) +{ + const char *src = ufbxi_strblob_data(p_src, raw); + size_t src_length = ufbxi_strblob_length(p_src, raw); + + // Skip leading directory separators and early return if the relative path is empty + while (src_length > 0 && (src[0] == '/' || src[0] == '\\')) { + src++; + src_length--; + } + if (src_length == 0) { + ufbxi_strblob_set(p_dst, NULL, 0, raw); + return 1; + } + + const char *prefix_data; + size_t prefix_length; + if (raw) { + prefix_data = (const char*)uc->scene.metadata.raw_relative_root.data; + prefix_length = uc->scene.metadata.raw_relative_root.size; + } else { + prefix_data = (const char*)uc->scene.metadata.relative_root.data; + prefix_length = uc->scene.metadata.relative_root.length; + } + + // Undo directories from `prefix` for every `..` + while (prefix_length > 0 && src_length >= 3 && src[0] == '.' && src[1] == '.' && (src[2] == '/' || src[2] == '\\')) { + size_t part_start = prefix_length; + while (part_start > 0 && !(prefix_data[part_start - 1] == '/' || prefix_data[part_start - 1] == '\\')) { + part_start--; + } + size_t part_len = prefix_length - part_start; + + if (part_len == 2 && prefix_data[part_start] == '.' && prefix_data[part_start + 1] == '.') { + // Prefix itself ends in `..`, cannot cancel out a leading `../` + break; + } + + // Eat the leading '/' before the part segment + prefix_length = part_start > 0 ? part_start - 1 : 0; + + if (part_len == 1 && prefix_data[part_start] == '.') { + // Single '.' -> remove and continue without cancelling out a leading `../` + continue; + } + + src += 3; + src_length -= 3; + } + + size_t result_cap = prefix_length + src_length + 1; + char *result = ufbxi_push(&uc->tmp_stack, char, result_cap); + ufbxi_check(result); + char *ptr = result; + + // Copy prefix and suffix converting separators in the process + if (prefix_length > 0) { + memcpy(ptr, prefix_data, prefix_length); + ptr[prefix_length] = uc->opts.path_separator; + ptr += prefix_length + 1; + } + for (size_t i = 0; i < src_length; i++) { + char c = src[i]; + if (c == '/' || c == '\\') { + c = uc->opts.path_separator; + } + *ptr++ = c; + } + + // Intern the string and pop the temporary buffer + ufbx_string dst = { result, ufbxi_to_size(ptr - result) }; + ufbx_assert(dst.length <= result_cap); + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &dst, raw)); + ufbxi_pop(&uc->tmp_stack, char, result_cap, NULL); + + ufbxi_strblob_set(p_dst, dst.data, dst.length, raw); + + return 1; +} + +// Open file utility + +static void *ufbxi_ator_alloc(void *user, size_t size) +{ + ufbxi_allocator *ator = (ufbxi_allocator*)user; + return ufbxi_alloc(ator, char, size); +} + +static void *ufbxi_ator_realloc(void *user, void *old_ptr, size_t old_size, size_t new_size) +{ + ufbxi_allocator *ator = (ufbxi_allocator*)user; + return ufbxi_realloc(ator, char, old_ptr, old_size, new_size); +} + +static void ufbxi_ator_free(void *user, void *ptr, size_t size) +{ + ufbxi_allocator *ator = (ufbxi_allocator*)user; + ufbxi_free(ator, char, ptr, size); +} + +static ufbxi_noinline void ufbxi_setup_ator_allocator(ufbx_allocator *allocator, ufbxi_allocator *ator) +{ + allocator->alloc_fn = &ufbxi_ator_alloc; + allocator->realloc_fn = &ufbxi_ator_realloc; + allocator->free_fn = &ufbxi_ator_free; + allocator->free_allocator_fn = NULL; + allocator->user = ator; +} + +static ufbxi_noinline bool ufbxi_open_file(const ufbx_open_file_cb *cb, ufbx_stream *stream, const char *path, size_t path_len, const ufbx_blob *original_filename, ufbxi_allocator *ator, ufbx_open_file_type type) +{ + if (!cb || !cb->fn) return false; + + ufbx_open_file_info info; + if (ator) { + ufbxi_setup_ator_allocator(&info.temp_allocator, ator); + } else { + memset(&info.temp_allocator, 0, sizeof(info.temp_allocator)); + } + + if (original_filename) { + info.original_filename = *original_filename; + } else { + info.original_filename.data = path; + info.original_filename.size = path_len; + } + info.type = type; + + return cb->fn(cb->user, stream, path, path_len, &info); +} + +#define ufbxi_patch_zero(dst, src) do { \ + ufbx_assert((dst) == 0 || (dst) == (src)); \ + (dst) = (src); \ + } while (0) + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_finalize_mesh(ufbxi_buf *buf, ufbx_error *error, ufbx_mesh *mesh) +{ + if (mesh->vertices.count == 0) { + mesh->vertices = mesh->vertex_position.values; + } + if (mesh->vertex_indices.count == 0) { + mesh->vertex_indices = mesh->vertex_position.indices; + } + + ufbxi_patch_zero(mesh->num_vertices, mesh->vertices.count); + ufbxi_patch_zero(mesh->num_indices, mesh->vertex_indices.count); + ufbxi_patch_zero(mesh->num_faces, mesh->faces.count); + + if (mesh->num_triangles == 0 || mesh->max_face_triangles == 0) { + size_t num_triangles = 0; + size_t max_face_triangles = 0; + size_t num_bad_faces[3] = { 0 }; + ufbxi_nounroll ufbxi_for_list(ufbx_face, face, mesh->faces) { + if (face->num_indices >= 3) { + size_t tris = face->num_indices - 2; + num_triangles += tris; + max_face_triangles = ufbxi_max_sz(max_face_triangles, tris); + } else { + num_bad_faces[face->num_indices]++; + } + } + + ufbxi_patch_zero(mesh->num_triangles, num_triangles); + ufbxi_patch_zero(mesh->max_face_triangles, max_face_triangles); + ufbxi_patch_zero(mesh->num_empty_faces, num_bad_faces[0]); + ufbxi_patch_zero(mesh->num_point_faces, num_bad_faces[1]); + ufbxi_patch_zero(mesh->num_line_faces, num_bad_faces[2]); + } + + if (!mesh->skinned_position.exists) { + mesh->skinned_is_local = true; + mesh->skinned_position = mesh->vertex_position; + mesh->skinned_normal = mesh->vertex_normal; + } + + if (mesh->vertex_first_index.count == 0) { + mesh->vertex_first_index.count = mesh->num_vertices; + mesh->vertex_first_index.data = ufbxi_push(buf, uint32_t, mesh->num_vertices); + ufbxi_check_err(error, mesh->vertex_first_index.data); + + ufbxi_for_list(uint32_t, p_vx_ix, mesh->vertex_first_index) { + *p_vx_ix = UFBX_NO_INDEX; + } + + uint32_t num_vertices = (uint32_t)mesh->num_vertices; + for (size_t ix = 0; ix < mesh->num_indices; ix++) { + uint32_t vx = mesh->vertex_indices.data[ix]; + if (vx < num_vertices && mesh->vertex_first_index.data[vx] == UFBX_NO_INDEX) { + mesh->vertex_first_index.data[vx] = (uint32_t)ix; + } + } + } + + if (mesh->uv_sets.count == 0 && mesh->vertex_uv.exists) { + ufbx_uv_set *uv_set = ufbxi_push_zero(buf, ufbx_uv_set, 1); + ufbxi_check_err(error, uv_set); + + uv_set->name.data = ufbxi_empty_char; + uv_set->vertex_uv = mesh->vertex_uv; + uv_set->vertex_tangent = mesh->vertex_tangent; + uv_set->vertex_bitangent = mesh->vertex_bitangent; + + mesh->uv_sets.data = uv_set; + mesh->uv_sets.count = 1; + } + + if (mesh->color_sets.count == 0 && mesh->vertex_color.exists) { + ufbx_color_set *color_set = ufbxi_push_zero(buf, ufbx_color_set, 1); + ufbxi_check_err(error, color_set); + + color_set->name.data = ufbxi_empty_char; + color_set->vertex_color = mesh->vertex_color; + + mesh->color_sets.data = color_set; + mesh->color_sets.count = 1; + } + + ufbxi_patch_mesh_reals(mesh); + + return 1; +} + +// -- .obj file + +#if UFBXI_FEATURE_FORMAT_OBJ + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_pop_props(ufbxi_context *uc, ufbx_prop_list *dst, size_t count) +{ + ufbx_prop_list props; + props.count = count; + props.data = ufbxi_push_pop(&uc->result, &uc->obj.tmp_props, ufbx_prop, count); + ufbxi_check(props.data); + + ufbxi_for_list(ufbx_prop, prop, props) { + prop->_internal_key = ufbxi_get_name_key(prop->name.data, prop->name.length); + if (prop->value_str.length == 0) { + prop->value_str.data = ufbxi_empty_char; + } + if (!prop->value_int) { + prop->value_int = ufbxi_f64_to_i64(prop->value_real); + } + if (prop->value_blob.size == 0 && prop->value_str.length > 0) { + prop->value_blob.data = prop->value_str.data; + prop->value_blob.size = prop->value_str.length; + } + } + + if (props.count > 1) { + ufbxi_check(ufbxi_sort_properties(uc, props.data, props.count)); + ufbxi_deduplicate_properties(&props); + } + + *dst = props; + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_push_mesh(ufbxi_context *uc) +{ + ufbxi_obj_mesh *mesh = ufbxi_push_zero(&uc->obj.tmp_meshes, ufbxi_obj_mesh, 1); + ufbxi_check(mesh); + uc->obj.mesh = mesh; + + ufbxi_nounroll for (size_t i = 0; i < UFBXI_OBJ_NUM_ATTRIBS; i++) { + mesh->vertex_range[i].min_ix = UINT64_MAX; + } + + const char *name = ""; + if (uc->opts.obj_split_groups && uc->obj.group.length > 0) { + name = uc->obj.group.data; + } else if (!uc->opts.obj_merge_objects && uc->obj.object.length > 0) { + name = uc->obj.object.data; + } else if (!uc->opts.obj_merge_groups && uc->obj.group.length > 0) { + name = uc->obj.group.data; + } + + mesh->fbx_node = ufbxi_push_synthetic_element(uc, &mesh->fbx_node_id, NULL, name, ufbx_node, UFBX_ELEMENT_NODE); + mesh->fbx_mesh = ufbxi_push_synthetic_element(uc, &mesh->fbx_mesh_id, NULL, name, ufbx_mesh, UFBX_ELEMENT_MESH); + ufbxi_check(mesh->fbx_node && mesh->fbx_mesh); + + mesh->fbx_mesh->vertex_position.unique_per_vertex = true; + + ufbxi_check(ufbxi_push_copy(&uc->tmp_node_ids, uint32_t, 1, &mesh->fbx_node->element_id)); + + uc->obj.face_material = UFBX_NO_INDEX; + uc->obj.face_group = 0; + uc->obj.face_group_dirty = true; + uc->obj.material_dirty = true; + + ufbxi_check(ufbxi_connect_oo(uc, mesh->fbx_mesh_id, mesh->fbx_node_id)); + ufbxi_check(ufbxi_connect_oo(uc, mesh->fbx_node_id, 0)); + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_flush_mesh(ufbxi_context *uc) +{ + if (!uc->obj.mesh) return 1; + + size_t num_props = uc->obj.tmp_props.num_items; + ufbxi_check(ufbxi_obj_pop_props(uc, &uc->obj.mesh->fbx_mesh->props.props, num_props)); + + size_t num_groups = uc->obj.tmp_face_group_infos.num_items; + ufbx_face_group *groups = ufbxi_push_pop(&uc->result, &uc->obj.tmp_face_group_infos, ufbx_face_group, num_groups); + ufbxi_check(groups); + + uc->obj.mesh->fbx_mesh->face_groups.data = groups; + uc->obj.mesh->fbx_mesh->face_groups.count = num_groups; + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_init(ufbxi_context *uc) +{ + uc->from_ascii = true; + uc->obj.initialized = true; + + + ufbxi_nounroll for (size_t i = 0; i < UFBXI_OBJ_NUM_ATTRIBS_EXT; i++) { + uc->obj.tmp_vertices[i].ator = &uc->ator_tmp; + uc->obj.tmp_indices[i].ator = &uc->ator_tmp; + } + uc->obj.tmp_color_valid.ator = &uc->ator_tmp; + uc->obj.tmp_faces.ator = &uc->ator_tmp; + uc->obj.tmp_face_material.ator = &uc->ator_tmp; + uc->obj.tmp_face_smoothing.ator = &uc->ator_tmp; + uc->obj.tmp_face_group.ator = &uc->ator_tmp; + uc->obj.tmp_face_group_infos.ator = &uc->ator_tmp; + uc->obj.tmp_meshes.ator = &uc->ator_tmp; + uc->obj.tmp_props.ator = &uc->ator_tmp; + + // .obj parsing does its own yield logic + uc->data_size += uc->yield_size; + + uc->obj.object.data = ufbxi_empty_char; + uc->obj.group.data = ufbxi_empty_char; + + ufbxi_map_init(&uc->obj.group_map, &uc->ator_tmp, ufbxi_map_cmp_const_char_ptr, NULL); + + // Add a nameless root node with the root ID + { + ufbxi_element_info root_info = { uc->root_id }; + root_info.name = ufbx_empty_string; + ufbx_node *root = ufbxi_push_element(uc, &root_info, ufbx_node, UFBX_ELEMENT_NODE); + ufbxi_check(root); + ufbxi_setup_root_node(uc, root); + ufbxi_check(ufbxi_push_copy(&uc->tmp_node_ids, uint32_t, 1, &root->element.element_id)); + } + + return 1; +} + +static ufbxi_noinline void ufbxi_obj_free(ufbxi_context *uc) +{ + if (!uc->obj.initialized) return; + + ufbxi_nounroll for (size_t i = 0; i < UFBXI_OBJ_NUM_ATTRIBS_EXT; i++) { + ufbxi_buf_free(&uc->obj.tmp_vertices[i]); + ufbxi_buf_free(&uc->obj.tmp_indices[i]); + } + ufbxi_buf_free(&uc->obj.tmp_color_valid); + ufbxi_buf_free(&uc->obj.tmp_faces); + ufbxi_buf_free(&uc->obj.tmp_face_material); + ufbxi_buf_free(&uc->obj.tmp_face_smoothing); + ufbxi_buf_free(&uc->obj.tmp_face_group); + ufbxi_buf_free(&uc->obj.tmp_face_group_infos); + ufbxi_buf_free(&uc->obj.tmp_meshes); + ufbxi_buf_free(&uc->obj.tmp_props); + + ufbxi_map_free(&uc->obj.group_map); + + ufbxi_free(&uc->ator_tmp, ufbx_string, uc->obj.tokens, uc->obj.tokens_cap); + ufbxi_free(&uc->ator_tmp, ufbx_material*, uc->obj.tmp_materials, uc->obj.tmp_materials_cap); +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_read_line(ufbxi_context *uc) +{ + if (uc->obj.eof) { + uc->obj.line.data = "\n"; + uc->obj.line.length = 1; + return 1; + } + + size_t offset = 0; + + for (;;) { + const char *begin = ufbxi_add_ptr(uc->data, offset); + const char *end = begin ? (const char*)memchr(begin, '\n', uc->data_size - offset) : NULL; + if (!end) { + if (uc->eof) { + offset = uc->data_size; + uc->obj.eof = true; + break; + } else { + size_t new_cap = ufbxi_max_sz(1, uc->data_size * 2); + ufbxi_check(ufbxi_refill(uc, new_cap, false)); + continue; + } + } + + offset += ufbxi_to_size(end - begin) + 1; + + // Handle line continuations + const char *esc = end; + if (esc > begin && esc[-1] == '\r') esc--; + if (esc > begin && esc[-1] == '\\') { + continue; + } + + break; + } + + size_t line_len = offset; + + uc->obj.line.data = uc->data; + uc->obj.line.length = line_len; + uc->data += line_len; + uc->data_size -= line_len; + + uc->obj.read_progress += line_len; + if (uc->obj.read_progress >= uc->progress_interval) { + ufbxi_check(ufbxi_report_progress(uc)); + uc->obj.read_progress %= uc->progress_interval; + } + + if (uc->obj.eof) { + char *new_data = ufbxi_push(&uc->tmp, char, line_len + 1); + ufbxi_check(new_data); + memcpy(new_data, uc->obj.line.data, line_len); + new_data[line_len] = '\n'; + uc->obj.line.data = new_data; + uc->obj.line.length++; + } + + return 1; +} + +static ufbxi_noinline ufbx_string ufbxi_obj_span_token(ufbxi_context *uc, size_t start_token, size_t end_token) +{ + ufbx_assert(start_token < uc->obj.num_tokens); + end_token = ufbxi_min_sz(end_token, uc->obj.num_tokens - 1); + + ufbx_assert(start_token <= end_token); + ufbx_string start = uc->obj.tokens[start_token]; + ufbx_string end = uc->obj.tokens[end_token]; + size_t num_between = ufbxi_to_size(end.data - start.data); + + ufbx_string result; + result.data = start.data; + result.length = num_between + end.length; + return result; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_tokenize(ufbxi_context *uc) +{ + const char *ptr = uc->obj.line.data, *end = ptr + uc->obj.line.length; + uc->obj.num_tokens = 0; + + for (;;) { + char c; + + // Skip whitespace + for (;;) { + c = *ptr; + if (c == ' ' || c == '\t' || c == '\r') { + ptr++; + continue; + } + + // Treat line continuations as whitespace + if (c == '\\') { + const char *p = ptr + 1; + if (*p == '\r') p++; + if (*p == '\n' && p < end - 1) { + ptr = p + 1; + continue; + } + } + + break; + } + + c = *ptr; + if (c == '\n') break; + if (c == '#' && uc->obj.num_tokens > 0) break; + + size_t index = uc->obj.num_tokens++; + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->obj.tokens, &uc->obj.tokens_cap, index + 1)); + + ufbx_string *tok = &uc->obj.tokens[index]; + tok->data = ptr; + + // Treat comment start as a single token + if (c == '#') { + ptr++; + tok->length = 1; + continue; + } + + for (;;) { + c = *++ptr; + + if (ufbxi_is_space(c)) { + break; + } + + if (c == '\\') { + const char *p = ptr + 1; + if (*p == '\r') p++; + if (*p == '\n' && p < end - 1) { + break; + } + } + } + + tok->length = ufbxi_to_size(ptr - tok->data); + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_tokenize_line(ufbxi_context *uc) +{ + ufbxi_check(ufbxi_obj_read_line(uc)); + ufbxi_check(ufbxi_obj_tokenize(uc)); + return 1; +} + +static ufbxi_noinline int ufbxi_obj_parse_vertex(ufbxi_context *uc, ufbxi_obj_attrib attrib, size_t offset) +{ + if (uc->opts.ignore_geometry) return 1; + + ufbxi_buf *dst = &uc->obj.tmp_vertices[attrib]; + size_t num_values = ufbxi_obj_attrib_stride[attrib]; + uc->obj.vertex_count[attrib]++; + + size_t read_values = num_values; + if (attrib == UFBXI_OBJ_ATTRIB_COLOR) { + if (offset + read_values > uc->obj.num_tokens) { + read_values = 3; + } + } + ufbxi_check(offset + read_values <= uc->obj.num_tokens); + + ufbx_real *vals = ufbxi_push_fast(dst, ufbx_real, num_values); + ufbxi_check(vals); + for (size_t i = 0; i < read_values; i++) { + ufbx_string str = uc->obj.tokens[offset + i]; + char *end; + double val = ufbxi_parse_double(str.data, str.length, &end, false); + ufbxi_check(end == str.data + str.length); + vals[i] = (ufbx_real)val; + } + + if (read_values < num_values) { + ufbx_assert(read_values + 1 == num_values); + ufbx_assert(attrib == UFBXI_OBJ_ATTRIB_COLOR); + vals[read_values] = 1.0f; + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_parse_index(ufbxi_context *uc, ufbx_string *s, uint32_t attrib) +{ + const char *ptr = s->data, *end = ptr + s->length; + + bool negative = false; + if (*ptr == '-') { + negative = true; + ptr++; + } + + // As .obj indices are never zero we can detect missing indices + // by simply not writing to it. + uint64_t index = 0; + for (; ptr != end; ptr++) { + char c = *ptr; + if (c >= '0' && c <= '9') { + ufbxi_check(index < UINT64_MAX / 10 - 10); + index = index * 10 + (uint64_t)(c - '0'); + } else if (c == '/') { + ptr++; + break; + } + } + + if (negative) { + size_t count = uc->obj.vertex_count[attrib]; + index = index <= count ? count - index : UINT64_MAX; + } else { + // Corrects to zero based indices and wraps 0 to UINT64_MAX (missing) + index -= 1; + } + + ufbxi_obj_fast_indices *fast_indices = &uc->obj.fast_indices[attrib]; + if (fast_indices->num_left == 0) { + size_t num_push = 128; + uint64_t *dst = ufbxi_push(&uc->obj.tmp_indices[attrib], uint64_t, num_push); + ufbxi_check(dst); + uc->obj.fast_indices[attrib].indices = dst; + uc->obj.fast_indices[attrib].num_left = num_push; + } + + *fast_indices->indices++ = index; + fast_indices->num_left--; + + ufbxi_obj_mesh *mesh = uc->obj.mesh; + + if (index != UINT64_MAX) { + ufbxi_obj_index_range *range = &mesh->vertex_range[attrib]; + range->min_ix = ufbxi_min64(range->min_ix, index); + range->max_ix = ufbxi_max64(range->max_ix, index); + } + + s->data = ptr; + s->length = ufbxi_to_size(end - ptr); + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_parse_indices(ufbxi_context *uc, size_t token_begin, size_t num_tokens) +{ + bool flush_mesh = false; + if (uc->obj.object_dirty) { + if (!uc->opts.obj_merge_objects) { + flush_mesh = true; + } + uc->obj.object_dirty = false; + } + + if (uc->obj.group_dirty) { + if (((uc->obj.object.length == 0 || uc->opts.obj_merge_objects) && !uc->opts.obj_merge_groups) || uc->opts.obj_split_groups) { + flush_mesh = true; + } + uc->obj.group_dirty = false; + uc->obj.face_group_dirty = true; + } + + if (!uc->obj.mesh || flush_mesh) { + ufbxi_check(ufbxi_obj_flush_mesh(uc)); + ufbxi_check(ufbxi_obj_push_mesh(uc)); + } + ufbxi_obj_mesh *mesh = uc->obj.mesh; + + if (uc->obj.material_dirty) { + if (uc->obj.usemtl_fbx_id != 0) { + ufbxi_fbx_id_entry *entry = ufbxi_find_fbx_id(uc, uc->obj.usemtl_fbx_id); + ufbx_assert(entry); + if (mesh->usemtl_base == 0 || entry->user_id < mesh->usemtl_base) { + ufbxi_check(ufbxi_connect_oo(uc, uc->obj.usemtl_fbx_id, mesh->fbx_node_id)); + + uint32_t index = ++uc->obj.usemtl_index; + ufbxi_check(index < UINT32_MAX); + entry->user_id = index; + + if (mesh->usemtl_base == 0) { + mesh->usemtl_base = index; + } + uc->obj.face_material = index - mesh->usemtl_base; + } + uc->obj.face_material = entry->user_id - mesh->usemtl_base; + } + } + + // EARLY RETURN: Rest of the function should only be related to geometry! + if (uc->opts.ignore_geometry) return 1; + + if (num_tokens == 0 && !uc->opts.allow_empty_faces) { + ufbxi_check(ufbxi_warnf(UFBX_WARNING_EMPTY_FACE_REMOVED, "Empty face has been removed")); + return 1; + } + + if (uc->obj.face_group_dirty) { + ufbx_string name = ufbx_empty_string; + if (uc->obj.group.length > 0 && (uc->obj.object.length > 0 || uc->opts.obj_merge_groups) && !uc->opts.obj_split_groups) { + name = uc->obj.group; + } + + uint32_t hash = ufbxi_hash_ptr(name.data); + ufbxi_obj_group_entry *entry = ufbxi_map_find(&uc->obj.group_map, ufbxi_obj_group_entry, hash, &name.data); + if (!entry) { + entry = ufbxi_map_insert(&uc->obj.group_map, ufbxi_obj_group_entry, hash, &name.data); + ufbxi_check(entry); + entry->name = name.data; + entry->mesh_id = 0; + entry->local_id = 0; + } + + uint32_t mesh_id = mesh->fbx_mesh->element_id; + if (entry->mesh_id != mesh_id) { + uint32_t id = mesh->num_groups++; + entry->mesh_id = mesh_id; + entry->local_id = id; + + ufbx_face_group *group = ufbxi_push_zero(&uc->obj.tmp_face_group_infos, ufbx_face_group, 1); + ufbxi_check(group); + group->id = 0; + group->name = name; + } + + uc->obj.face_group = entry->local_id; + + if (!uc->obj.has_face_group) { + uc->obj.has_face_group = true; + ufbxi_check(ufbxi_push_zero(&uc->obj.tmp_face_group, uint32_t, uc->obj.tmp_faces.num_items)); + } + + uc->obj.face_group_dirty = false; + } + + size_t num_indices = num_tokens; + ufbxi_check(UINT32_MAX - mesh->num_indices >= num_indices); + + ufbx_face *face = ufbxi_push_fast(&uc->obj.tmp_faces, ufbx_face, 1); + ufbxi_check(face); + + face->index_begin = (uint32_t)mesh->num_indices; + face->num_indices = (uint32_t)num_indices; + + mesh->num_faces++; + mesh->num_indices += num_indices; + + uint32_t *p_face_mat = ufbxi_push_fast(&uc->obj.tmp_face_material, uint32_t, 1); + ufbxi_check(p_face_mat); + *p_face_mat = uc->obj.face_material; + + if (uc->obj.has_face_smoothing) { + bool *p_face_smooth = ufbxi_push_fast(&uc->obj.tmp_face_smoothing, bool, 1); + ufbxi_check(p_face_smooth); + *p_face_smooth = uc->obj.face_smoothing; + } + + if (uc->obj.has_face_group) { + uint32_t *p_face_group = ufbxi_push_fast(&uc->obj.tmp_face_group, uint32_t, 1); + ufbxi_check(p_face_group); + *p_face_group = uc->obj.face_group; + } + + for (size_t ix = 0; ix < num_indices; ix++) { + ufbx_string tok = uc->obj.tokens[token_begin + ix]; + for (uint32_t attrib = 0; attrib < UFBXI_OBJ_NUM_ATTRIBS; attrib++) { + ufbxi_check(ufbxi_obj_parse_index(uc, &tok, attrib)); + } + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_parse_multi_indices(ufbxi_context *uc, size_t window) +{ + for (size_t begin = 1; begin + window <= uc->obj.num_tokens; begin++) { + ufbxi_check(ufbxi_obj_parse_indices(uc, begin, window)); + } + return 1; +} + +static ufbxi_noinline uint32_t ufbxi_parse_hex(const char *digits, size_t length) +{ + uint32_t value = 0; + + for (size_t i = 0; i < length; i++) { + char c = digits[i]; + uint32_t v = 0; + if (c >= '0' && c <= '9') { + v = (uint32_t)(c - '0'); + } else if (c >= 'A' && c <= 'F') { + v = (uint32_t)(c - 'A') + 10; + } else if (c >= 'a' && c <= 'f') { + v = (uint32_t)(c - 'a') + 10; + } + value = (value << 4) | v; + } + + return value; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_parse_comment(ufbxi_context *uc) +{ + if (uc->obj.num_tokens >= 3 && ufbxi_str_equal(uc->obj.tokens[1], ufbxi_str_c("MRGB"))) { + size_t num_color = uc->obj.vertex_count[UFBXI_OBJ_ATTRIB_COLOR]; + + // Pop standard vertex colors and replace them with MRGB colors + if (num_color > uc->obj.mrgb_vertex_count) { + size_t num_pop = num_color - uc->obj.mrgb_vertex_count; + ufbxi_pop(&uc->obj.tmp_color_valid, bool, num_pop, NULL); + ufbxi_pop(&uc->obj.tmp_vertices[UFBXI_OBJ_ATTRIB_COLOR], ufbx_real, num_pop * 4, NULL); + uc->obj.vertex_count[UFBXI_OBJ_ATTRIB_COLOR] -= num_pop; + } + + ufbx_string mrgb = uc->obj.tokens[2]; + for (size_t i = 0; i + 8 <= mrgb.length; i += 8) { + ufbx_real *p_rgba = ufbxi_push(&uc->obj.tmp_vertices[UFBXI_OBJ_ATTRIB_COLOR], ufbx_real, 4); + bool *p_valid = ufbxi_push(&uc->obj.tmp_color_valid, bool, 1); + ufbxi_check(p_rgba && p_valid); + *p_valid = true; + + uint32_t hex = ufbxi_parse_hex(mrgb.data + i, 8); + p_rgba[0] = (ufbx_real)((hex >> 16u) & 0xff) / 255.0f; + p_rgba[1] = (ufbx_real)((hex >> 8u) & 0xff) / 255.0f; + p_rgba[2] = (ufbx_real)((hex >> 0u) & 0xff) / 255.0f; + p_rgba[3] = (ufbx_real)((hex >> 24u) & 0xff) / 255.0f; + } + + uc->obj.has_vertex_color = true; + } + + if (!uc->opts.disable_quirks) { + if (ufbxi_match(&uc->obj.line, "\\s*#\\s*File exported by ZBrush.*")) { + if (!uc->obj.mesh) { + uc->opts.obj_merge_groups = true; + } + } + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_parse_material(ufbxi_context *uc) +{ + ufbxi_check(uc->obj.num_tokens >= 2); + ufbx_string name = ufbxi_obj_span_token(uc, 1, SIZE_MAX); + + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &name, false)); + + uint64_t fbx_id = ufbxi_synthetic_id_from_string(name.data); + + ufbxi_fbx_id_entry *entry = ufbxi_find_fbx_id(uc, fbx_id); + + uc->obj.usemtl_fbx_id = fbx_id; + uc->obj.usemtl_name = name; + + if (!entry) { + ufbxi_element_info info = { 0 }; + info.fbx_id = fbx_id; + info.name = name; + + ufbx_material *material = ufbxi_push_element(uc, &info, ufbx_material, UFBX_ELEMENT_MATERIAL); + ufbxi_check(material); + + material->shader_type = UFBX_SHADER_WAVEFRONT_MTL; + material->shading_model_name.data = ufbxi_empty_char; + material->shader_prop_prefix.data = ufbxi_empty_char; + + size_t id = material->element_id; + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->obj.tmp_materials, &uc->obj.tmp_materials_cap, id + 1)); + uc->obj.tmp_materials[id] = material; + } + + uc->obj.material_dirty = true; + + return 1; +} + +#define ufbxi_obj_cmd1(a) ((uint32_t)(a)<<24u) +#define ufbxi_obj_cmd2(a,b) ((uint32_t)(a)<<24u | (uint32_t)(b)<<16) +#define ufbxi_obj_cmd3(a,b,c) ((uint32_t)(a)<<24u | (uint32_t)(b)<<16 | (uint32_t)(c)<<8u) + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_pop_vertices(ufbxi_context *uc, ufbx_real_list *dst, uint32_t attrib, uint64_t min_index) +{ + size_t stride = ufbxi_obj_attrib_stride[attrib]; + ufbxi_check(min_index < uc->obj.tmp_vertices[attrib].num_items / stride); + + size_t count = uc->obj.tmp_vertices[attrib].num_items - (size_t)min_index * stride; + ufbx_real *data = ufbxi_push(&uc->result, ufbx_real, count + 4); + ufbxi_check(data); + + data[0] = 0.0f; + data[1] = 0.0f; + data[2] = 0.0f; + data[3] = 0.0f; + data += 4; + + ufbxi_pop(&uc->obj.tmp_vertices[attrib], ufbx_real, count, data); + + dst->data = data; + dst->count = count; + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_setup_attrib(ufbxi_context *uc, ufbxi_obj_mesh *mesh, uint64_t *tmp_indices, + ufbx_vertex_attrib *dst, const ufbx_real_list *p_data, uint32_t attrib, bool non_disjoint, bool required) +{ + ufbx_real_list data = *p_data; + + size_t num_indices = mesh->num_indices; + size_t stride = ufbxi_obj_attrib_stride[attrib]; + size_t num_values = data.count / stride; + + uint64_t mesh_min_ix = mesh->vertex_range[attrib].min_ix; + if (num_indices == 0 || num_values == 0 || mesh_min_ix == UINT64_MAX) { + ufbxi_check(num_indices == 0 || !required); + + // Pop indices without copying if the attribute is not used + ufbxi_pop(&uc->obj.tmp_indices[attrib], uint64_t, num_indices, NULL); + return 1; + } + + uint64_t min_index = non_disjoint ? 0 : mesh_min_ix; + + ufbxi_pop(&uc->obj.tmp_indices[attrib], uint64_t, num_indices, tmp_indices); + + uint32_t *dst_indices = ufbxi_push(&uc->result, uint32_t, num_indices); + ufbxi_check(dst_indices); + + dst->exists = true; + + dst->values.data = data.data; + dst->values.count = num_values; + + dst->indices.data = dst_indices; + dst->indices.count = num_indices; + + ufbxi_nounroll for (size_t i = 0; i < num_indices; i++) { + uint64_t ix = tmp_indices[i]; + if (ix != UINT64_MAX) { + ix -= min_index; + ufbxi_check(ix < UINT32_MAX); + } + if (ix < num_values) { + dst_indices[i] = (uint32_t)ix; + } else { + ufbxi_check(ufbxi_fix_index(uc, &dst_indices[i], (uint32_t)ix, num_values)); + } + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_pad_colors(ufbxi_context *uc, size_t num_vertices) +{ + if (uc->opts.ignore_geometry) return 1; + + size_t num_colors = uc->obj.vertex_count[UFBXI_OBJ_ATTRIB_COLOR]; + if (num_vertices > num_colors) { + size_t num_pad = num_vertices - num_colors; + ufbxi_check(ufbxi_push_zero(&uc->obj.tmp_vertices[UFBXI_OBJ_ATTRIB_COLOR], ufbx_real, num_pad * 4)); + ufbxi_check(ufbxi_push_zero(&uc->obj.tmp_color_valid, bool, num_pad)); + uc->obj.vertex_count[UFBXI_OBJ_ATTRIB_COLOR] += num_pad; + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_pop_meshes(ufbxi_context *uc) +{ + size_t num_meshes = uc->obj.tmp_meshes.num_items; + ufbxi_obj_mesh *meshes = ufbxi_push_pop(&uc->tmp, &uc->obj.tmp_meshes, ufbxi_obj_mesh, num_meshes); + ufbxi_check(meshes); + + if (uc->obj.has_vertex_color) { + ufbxi_check(ufbxi_obj_pad_colors(uc, uc->obj.vertex_count[UFBXI_OBJ_ATTRIB_POSITION])); + } + + // Pop unused fast indices + for (size_t i = 0; i < UFBXI_OBJ_NUM_ATTRIBS; i++) { + ufbxi_pop(&uc->obj.tmp_indices[i], uint64_t, uc->obj.fast_indices[i].num_left, NULL); + } + + // Check if the file has disjoint vertices + bool non_disjoint[UFBXI_OBJ_NUM_ATTRIBS] = { 0 }; + uint64_t next_min[UFBXI_OBJ_NUM_ATTRIBS] = { 0 }; + ufbx_real_list vertices[UFBXI_OBJ_NUM_ATTRIBS_EXT] = { 0 }; + bool *color_valid = NULL; + + size_t max_indices = 0; + + for (size_t i = 0; i < num_meshes; i++) { + ufbxi_obj_mesh *mesh = &meshes[i]; + max_indices = ufbxi_max_sz(max_indices, mesh->num_indices); + ufbxi_nounroll for (uint32_t attrib = 0; attrib < UFBXI_OBJ_NUM_ATTRIBS; attrib++) { + ufbxi_obj_index_range range = mesh->vertex_range[attrib]; + if (range.min_ix > range.max_ix) continue; + if (range.min_ix < next_min[attrib]) { + non_disjoint[attrib] = true; + } + next_min[attrib] = range.max_ix + 1; + } + } + + uint64_t *tmp_indices = ufbxi_push(&uc->tmp, uint64_t, max_indices); + ufbxi_check(tmp_indices); + + ufbxi_nounroll for (uint32_t attrib = 0; attrib < UFBXI_OBJ_NUM_ATTRIBS; attrib++) { + if (!non_disjoint[attrib]) continue; + ufbxi_check(ufbxi_obj_pop_vertices(uc, &vertices[attrib], attrib, 0)); + } + if (uc->obj.has_vertex_color && non_disjoint[UFBXI_OBJ_ATTRIB_POSITION]) { + ufbxi_check(ufbxi_obj_pop_vertices(uc, &vertices[UFBXI_OBJ_ATTRIB_COLOR], UFBXI_OBJ_ATTRIB_COLOR, 0)); + color_valid = ufbxi_push_pop(&uc->tmp, &uc->obj.tmp_color_valid, bool, vertices[UFBXI_OBJ_ATTRIB_COLOR].count / 4); + ufbxi_check(color_valid); + } + + for (size_t i = num_meshes; i > 0; i--) { + ufbxi_obj_mesh *mesh = &meshes[i - 1]; + + ufbx_mesh *fbx_mesh = mesh->fbx_mesh; + + size_t num_faces = mesh->num_faces; + + if (!uc->opts.ignore_geometry) { + ufbxi_nounroll for (uint32_t attrib = 0; attrib < UFBXI_OBJ_NUM_ATTRIBS; attrib++) { + if (non_disjoint[attrib]) continue; + uint64_t min_ix = mesh->vertex_range[attrib].min_ix; + if (min_ix < UINT64_MAX) { + ufbxi_check(ufbxi_obj_pop_vertices(uc, &vertices[attrib], attrib, min_ix)); + } + } + if (uc->obj.has_vertex_color && !non_disjoint[UFBXI_OBJ_ATTRIB_POSITION]) { + uint64_t min_ix = mesh->vertex_range[UFBXI_OBJ_ATTRIB_POSITION].min_ix; + ufbxi_check(min_ix < UINT64_MAX); + ufbxi_check(ufbxi_obj_pop_vertices(uc, &vertices[UFBXI_OBJ_ATTRIB_COLOR], UFBXI_OBJ_ATTRIB_COLOR, min_ix)); + color_valid = ufbxi_push_pop(&uc->tmp, &uc->obj.tmp_color_valid, bool, vertices[UFBXI_OBJ_ATTRIB_COLOR].count / 4); + ufbxi_check(color_valid); + } + + fbx_mesh->faces.count = num_faces; + fbx_mesh->face_material.count = num_faces; + + fbx_mesh->faces.data = ufbxi_push_pop(&uc->result, &uc->obj.tmp_faces, ufbx_face, num_faces); + fbx_mesh->face_material.data = ufbxi_push_pop(&uc->result, &uc->obj.tmp_face_material, uint32_t, num_faces); + + ufbxi_check(fbx_mesh->faces.data); + ufbxi_check(fbx_mesh->face_material.data); + + if (uc->obj.has_face_smoothing) { + fbx_mesh->face_smoothing.count = num_faces; + fbx_mesh->face_smoothing.data = ufbxi_push_pop(&uc->result, &uc->obj.tmp_face_smoothing, bool, num_faces); + ufbxi_check(fbx_mesh->face_smoothing.data); + } + + if (uc->obj.has_face_group) { + if (mesh->num_groups > 1) { + fbx_mesh->face_group.count = num_faces; + fbx_mesh->face_group.data = ufbxi_push_pop(&uc->result, &uc->obj.tmp_face_group, uint32_t, num_faces); + ufbxi_check(fbx_mesh->face_group.data); + } else { + ufbxi_pop(&uc->obj.tmp_face_group, uint32_t, num_faces, NULL); + } + } + + ufbxi_check(ufbxi_obj_setup_attrib(uc, mesh, tmp_indices, (ufbx_vertex_attrib*)&fbx_mesh->vertex_position, + &vertices[UFBXI_OBJ_ATTRIB_POSITION], UFBXI_OBJ_ATTRIB_POSITION, non_disjoint[UFBXI_OBJ_ATTRIB_POSITION], true)); + + ufbxi_check(ufbxi_obj_setup_attrib(uc, mesh, tmp_indices, (ufbx_vertex_attrib*)&fbx_mesh->vertex_uv, + &vertices[UFBXI_OBJ_ATTRIB_UV], UFBXI_OBJ_ATTRIB_UV, non_disjoint[UFBXI_OBJ_ATTRIB_UV], false)); + + ufbxi_check(ufbxi_obj_setup_attrib(uc, mesh, tmp_indices, (ufbx_vertex_attrib*)&fbx_mesh->vertex_normal, + &vertices[UFBXI_OBJ_ATTRIB_NORMAL], UFBXI_OBJ_ATTRIB_NORMAL, non_disjoint[UFBXI_OBJ_ATTRIB_NORMAL], false)); + + if (uc->obj.has_vertex_color) { + ufbx_assert(color_valid); + bool has_color = false; + bool all_valid = true; + size_t max_index = fbx_mesh->vertex_position.values.count; + ufbxi_for_list(uint32_t, p_ix, fbx_mesh->vertex_position.indices) { + if (*p_ix < max_index) { + if (color_valid[*p_ix]) { + has_color = true; + } else { + all_valid = false; + } + } + } + + if (has_color) { + fbx_mesh->vertex_color.exists = true; + fbx_mesh->vertex_color.values.data = (ufbx_vec4*)vertices[UFBXI_OBJ_ATTRIB_COLOR].data; + fbx_mesh->vertex_color.values.count = vertices[UFBXI_OBJ_ATTRIB_COLOR].count / 4; + fbx_mesh->vertex_color.indices = fbx_mesh->vertex_position.indices; + fbx_mesh->vertex_color.unique_per_vertex = true; + + if (!all_valid) { + uint32_t *indices = fbx_mesh->vertex_color.indices.data; + indices = ufbxi_push_copy(&uc->result, uint32_t, mesh->num_indices, indices); + ufbxi_check(indices); + + size_t num_values = fbx_mesh->vertex_color.values.count; + ufbxi_for(uint32_t, p_ix, indices, mesh->num_indices) { + if (*p_ix >= num_values || !color_valid[*p_ix]) { + ufbxi_check(ufbxi_fix_index(uc, p_ix, *p_ix, num_values)); + } + } + + fbx_mesh->vertex_color.indices.data = indices; + } + } + } + } + + ufbxi_check_err(&uc->error, ufbxi_finalize_mesh(&uc->result, &uc->error, fbx_mesh)); + + if (mesh->num_groups > 1) { + ufbxi_check_err(&uc->error, ufbxi_update_face_groups(&uc->result, &uc->error, fbx_mesh, false)); + } else if (mesh->num_groups == 1) { + // NOTE: Consecutive and zero indices are always allocated so we can skip doing it here, + // see HACK(consecutiv-faces).. + fbx_mesh->face_group.data = (uint32_t*)ufbxi_sentinel_index_zero; + fbx_mesh->face_group.count = num_faces; + fbx_mesh->face_groups.data[0].num_faces = num_faces; + fbx_mesh->face_groups.data[0].num_triangles = fbx_mesh->num_triangles; + fbx_mesh->face_groups.data[0].face_indices.data = (uint32_t*)ufbxi_sentinel_index_consecutive; + fbx_mesh->face_groups.data[0].face_indices.count = num_faces; + } + + // HACK(consecutive-faces): Prepare for finalize to re-use a consecutive/zero + // index buffer for face materials.. + uc->max_zero_indices = ufbxi_max_sz(uc->max_zero_indices, num_faces); + uc->max_consecutive_indices = ufbxi_max_sz(uc->max_consecutive_indices, num_faces); + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_parse_file(ufbxi_context *uc) +{ + while (!uc->obj.eof) { + ufbxi_check(ufbxi_obj_tokenize_line(uc)); + size_t num_tokens = uc->obj.num_tokens; + if (num_tokens == 0) continue; + + ufbx_string cmd = uc->obj.tokens[0]; + uint32_t key = ufbxi_get_name_key(cmd.data, cmd.length); + if (key == ufbxi_obj_cmd1('v')) { + ufbxi_check(ufbxi_obj_parse_vertex(uc, UFBXI_OBJ_ATTRIB_POSITION, 1)); + if (num_tokens >= 7) { + size_t num_vertices = uc->obj.vertex_count[UFBXI_OBJ_ATTRIB_POSITION]; + uc->obj.has_vertex_color = true; + ufbxi_check(ufbxi_obj_pad_colors(uc, num_vertices - 1)); + if (uc->obj.vertex_count[UFBXI_OBJ_ATTRIB_COLOR] < num_vertices) { + ufbx_assert(uc->obj.vertex_count[UFBXI_OBJ_ATTRIB_COLOR] == num_vertices - 1); + ufbxi_check(ufbxi_obj_parse_vertex(uc, UFBXI_OBJ_ATTRIB_COLOR, 4)); + bool *valid = ufbxi_push(&uc->obj.tmp_color_valid, bool, 1); + ufbxi_check(valid); + *valid = true; + } + } + } else if (key == ufbxi_obj_cmd2('v','t')) { + ufbxi_check(ufbxi_obj_parse_vertex(uc, UFBXI_OBJ_ATTRIB_UV, 1)); + } else if (key == ufbxi_obj_cmd2('v','n')) { + ufbxi_check(ufbxi_obj_parse_vertex(uc, UFBXI_OBJ_ATTRIB_NORMAL, 1)); + } else if (key == ufbxi_obj_cmd1('f')) { + ufbxi_check(ufbxi_obj_parse_indices(uc, 1, uc->obj.num_tokens - 1)); + } else if (key == ufbxi_obj_cmd1('p')) { + ufbxi_check(ufbxi_obj_parse_multi_indices(uc, 1)); + } else if (key == ufbxi_obj_cmd1('l')) { + ufbxi_check(ufbxi_obj_parse_multi_indices(uc, 2)); + } else if (key == ufbxi_obj_cmd1('s')) { + if (num_tokens >= 2) { + uc->obj.has_face_smoothing = true; + uc->obj.face_smoothing = !ufbxi_str_equal(uc->obj.tokens[1], ufbxi_str_c("off")); + + // Fill in previously missed face smoothing data + if (uc->obj.tmp_face_smoothing.num_items == 0 && uc->obj.tmp_faces.num_items > 0) { + ufbxi_check(ufbxi_push_zero(&uc->obj.tmp_face_smoothing, bool, uc->obj.tmp_faces.num_items)); + } + } + } else if (key == ufbxi_obj_cmd1('o')) { + if (num_tokens >= 2) { + uc->obj.object = ufbxi_obj_span_token(uc, 1, SIZE_MAX); + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &uc->obj.object, false)); + uc->obj.object_dirty = true; + } + } else if (key == ufbxi_obj_cmd1('g')) { + if (num_tokens >= 2) { + uc->obj.group = ufbxi_obj_span_token(uc, 1, SIZE_MAX); + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &uc->obj.group, false)); + uc->obj.group_dirty = true; + } else { + uc->obj.group = ufbx_empty_string; + uc->obj.group_dirty = true; + } + } else if (key == ufbxi_obj_cmd1('#')) { + ufbxi_check(ufbxi_obj_parse_comment(uc)); + } else if (ufbxi_str_equal(cmd, ufbxi_str_c("mtllib"))) { + ufbxi_check(uc->obj.num_tokens >= 2); + ufbx_string lib = ufbxi_obj_span_token(uc, 1, SIZE_MAX); + lib.data = ufbxi_push_copy(&uc->tmp, char, lib.length + 1, lib.data); + ufbxi_check(lib.data); + uc->obj.mtllib_relative_path.data = lib.data; + uc->obj.mtllib_relative_path.size = lib.length; + } else if (ufbxi_str_equal(cmd, ufbxi_str_c("usemtl"))) { + ufbxi_check(ufbxi_obj_parse_material(uc)); + } else { + ufbxi_check(ufbxi_warnf(UFBX_WARNING_UNKNOWN_OBJ_DIRECTIVE, "Unknown .obj directive, skipped line")); + } + } + + ufbxi_check(ufbxi_obj_flush_mesh(uc)); + ufbxi_check(ufbxi_obj_pop_meshes(uc)); + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_flush_material(ufbxi_context *uc) +{ + if (uc->obj.usemtl_fbx_id == 0) return 1; + + ufbxi_fbx_id_entry *entry = ufbxi_find_fbx_id(uc, uc->obj.usemtl_fbx_id); + ufbx_assert(entry); + ufbx_material *material = uc->obj.tmp_materials[entry->element_id]; + + size_t num_props = uc->obj.tmp_props.num_items; + ufbxi_check(ufbxi_obj_pop_props(uc, &material->props.props, num_props)); + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_parse_prop(ufbxi_context *uc, ufbx_string name, size_t start, bool include_rest, size_t *p_next) +{ + if (start >= uc->obj.num_tokens) { + if (p_next) { + *p_next = start; + } + return 1; + } + + ufbx_prop *prop = ufbxi_push_zero(&uc->obj.tmp_props, ufbx_prop, 1); + ufbxi_check(prop); + prop->name = name; + + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &prop->name, false)); + + uint32_t flags = UFBX_PROP_FLAG_VALUE_STR; + + size_t num_reals = 0; + for (; num_reals < 4; num_reals++) { + if (start + num_reals >= uc->obj.num_tokens) break; + ufbx_string tok = uc->obj.tokens[start + num_reals]; + + char *end; + double val = ufbxi_parse_double(tok.data, tok.length, &end, false); + if (end != tok.data + tok.length) break; + + prop->value_real_arr[num_reals] = (ufbx_real)val; + if (num_reals == 0) { + prop->value_int = ufbxi_f64_to_i64(val); + flags |= UFBX_PROP_FLAG_VALUE_INT; + } + } + + size_t num_args = 0; + if (!include_rest) { + for (; start + num_args < uc->obj.num_tokens - 1; num_args++) { + if (ufbxi_match(&uc->obj.tokens[start + num_args], "-[A-Za-z][\\-A-Za-z0-9_]*")) break; + } + } + + if (num_args > 0 || include_rest) { + ufbx_string span = ufbxi_obj_span_token(uc, start, include_rest ? SIZE_MAX : start + num_args - 1); + prop->value_str = span; + prop->value_blob.data = span.data; + prop->value_blob.size = span.length; + + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &prop->value_str, false)); + ufbxi_check(ufbxi_push_string_place_blob(&uc->string_pool, &prop->value_blob, true)); + } else { + prop->value_str.data = ufbxi_empty_char; + } + + if (num_reals > 0) { + flags = (uint32_t)UFBX_PROP_FLAG_VALUE_REAL << (num_reals - 1); + } else { + if (!strcmp(prop->value_str.data, "on")) { + prop->value_int = 1; + prop->value_real = 1.0f; + flags |= UFBX_PROP_FLAG_VALUE_INT; + } else if (!strcmp(prop->value_str.data, "off")) { + prop->value_int = 0; + prop->value_real = 0.0f; + flags |= UFBX_PROP_FLAG_VALUE_INT; + } + } + + prop->flags = (ufbx_prop_flags)flags; + + if (p_next) { + *p_next = start + num_args; + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_parse_mtl_map(ufbxi_context *uc, size_t prefix_len) +{ + if (uc->obj.num_tokens < 2) return 1; + + size_t num_props = 1; + ufbxi_check(ufbxi_obj_parse_prop(uc, ufbxi_str_c("obj|args"), 1, true, NULL)); + + size_t start = 1; + for (; start + 1 < uc->obj.num_tokens; ) { + ufbx_string tok = uc->obj.tokens[start]; + if (ufbxi_match(&tok, "-[A-Za-z][\\-A-Za-z0-9_]*")) { + tok.data += 1; + tok.length -= 1; + ufbxi_check(ufbxi_obj_parse_prop(uc, tok, start + 1, false, &start)); + num_props++; + } else { + break; + } + } + + ufbx_string tex_str = ufbxi_obj_span_token(uc, start, SIZE_MAX); + ufbx_blob tex_raw = { tex_str.data, tex_str.length }; + + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &tex_str, false)); + ufbxi_check(ufbxi_push_string_place_blob(&uc->string_pool, &tex_raw, true)); + + uint64_t fbx_id = 0; + ufbx_texture *texture = ufbxi_push_synthetic_element(uc, &fbx_id, NULL, "", ufbx_texture, UFBX_ELEMENT_TEXTURE); + ufbxi_check(texture); + + texture->filename.data = ufbxi_empty_char; + texture->absolute_filename.data = ufbxi_empty_char; + texture->uv_set.data = ufbxi_empty_char; + + texture->relative_filename = tex_str; + texture->raw_relative_filename = tex_raw; + + ufbxi_check(ufbxi_obj_pop_props(uc, &texture->props.props, num_props)); + + ufbx_string prop = uc->obj.tokens[0]; + ufbx_assert(prop.length >= prefix_len); + prop.data += prefix_len; + prop.length -= prefix_len; + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &prop, false)); + + if (uc->obj.usemtl_fbx_id != 0) { + ufbxi_check(ufbxi_connect_op(uc, fbx_id, uc->obj.usemtl_fbx_id, prop)); + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_parse_mtl(ufbxi_context *uc) +{ + uc->obj.mesh = NULL; + uc->obj.usemtl_fbx_id = 0; + + while (!uc->obj.eof) { + ufbxi_check(ufbxi_obj_tokenize_line(uc)); + size_t num_tokens = uc->obj.num_tokens; + if (num_tokens == 0) continue; + + ufbx_string cmd = uc->obj.tokens[0]; + if (ufbxi_str_equal(cmd, ufbxi_str_c("newmtl"))) { + // HACK: Reuse mesh material parsing + ufbxi_check(ufbxi_obj_flush_material(uc)); + ufbxi_check(ufbxi_obj_parse_material(uc)); + } else if (cmd.length > 4 && !memcmp(cmd.data, "map_", 4)) { + ufbxi_check(ufbxi_obj_parse_mtl_map(uc, 4)); + } else if (cmd.length == 4 && (!memcmp(cmd.data, "bump", 4) || !memcmp(cmd.data, "disp", 4) || !memcmp(cmd.data, "norm", 4))) { + ufbxi_check(ufbxi_obj_parse_mtl_map(uc, 0)); + } else if (cmd.length == 1 && cmd.data[0] == '#') { + // Implement .mtl magic comment handling here if necessary + } else { + ufbxi_check(ufbxi_obj_parse_prop(uc, uc->obj.tokens[0], 1, true, NULL)); + } + } + + ufbxi_check(ufbxi_obj_flush_material(uc)); + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_load_mtl(ufbxi_context *uc) +{ + // HACK: Reset everything and switch to loading the .mtl file globally + if (uc->close_fn) { + uc->close_fn(uc->read_user); + } + + uc->read_fn = NULL; + uc->close_fn = NULL; + uc->read_user = NULL; + uc->data_begin = NULL; + uc->data = NULL; + uc->data_size = 0; + uc->yield_size = 0; + uc->eof = false; + uc->obj.eof = false; + + if (uc->opts.obj_mtl_data.size > 0) { + uc->data_begin = uc->data = (const char*)uc->opts.obj_mtl_data.data; + uc->data_size = uc->opts.obj_mtl_data.size; + ufbxi_check(ufbxi_obj_parse_mtl(uc)); + return 1; + } + + ufbx_stream stream = { 0 }; + bool has_stream = false; + + if (uc->opts.open_file_cb.fn) { + if (uc->opts.obj_mtl_path.length > 0) { + has_stream = ufbxi_open_file(&uc->opts.open_file_cb, &stream, uc->opts.obj_mtl_path.data, uc->opts.obj_mtl_path.length, NULL, &uc->ator_tmp, UFBX_OPEN_FILE_OBJ_MTL); + if (!has_stream) { + ufbxi_check(ufbxi_warnf(UFBX_WARNING_MISSING_EXTERNAL_FILE, "Could not open .mtl file: %s", uc->opts.obj_mtl_path.data)); + } + } + + if (!has_stream && uc->opts.load_external_files && uc->obj.mtllib_relative_path.size > 0) { + ufbx_blob dst; + ufbxi_check(ufbxi_resolve_relative_filename(uc, (ufbxi_strblob*)&dst, (const ufbxi_strblob*)&uc->obj.mtllib_relative_path, true)); + has_stream = ufbxi_open_file(&uc->opts.open_file_cb, &stream, (const char*)dst.data, dst.size, &uc->obj.mtllib_relative_path, &uc->ator_tmp, UFBX_OPEN_FILE_OBJ_MTL); + if (!has_stream) { + ufbxi_check(ufbxi_warnf(UFBX_WARNING_MISSING_EXTERNAL_FILE, "Could not open .mtl file: %s", dst.data)); + } + } + + ufbx_string path = uc->scene.metadata.filename; + if (!has_stream && uc->opts.load_external_files && uc->opts.obj_search_mtl_by_filename && path.length > 4) { + ufbx_string ext = { path.data + path.length - 4, 4 }; + if (ufbxi_match(&ext, "\\c.obj")) { + char *copy = ufbxi_push_copy(&uc->tmp, char, path.length + 1, path.data); + ufbxi_check(copy); + copy[path.length - 3] = copy[path.length - 3] == 'O' ? 'M' : 'm'; + copy[path.length - 2] = copy[path.length - 2] == 'B' ? 'T' : 't'; + copy[path.length - 1] = copy[path.length - 1] == 'J' ? 'L' : 'l'; + has_stream = ufbxi_open_file(&uc->opts.open_file_cb, &stream, copy, path.length, NULL, &uc->ator_tmp, UFBX_OPEN_FILE_OBJ_MTL); + if (has_stream) { + ufbxi_check(ufbxi_warnf(UFBX_WARNING_IMPLICIT_MTL, "Opened .mtl file derived from .obj filename: %s", copy)); + } + } + } + } + + if (has_stream) { + // Adopt `stream` to ufbx read callbacks + uc->read_fn = stream.read_fn; + uc->close_fn = stream.close_fn; + uc->read_user = stream.user; + + int ok = ufbxi_obj_parse_mtl(uc); + + if (uc->close_fn) { + uc->close_fn(uc->read_user); + } + uc->read_fn = NULL; + uc->close_fn = NULL; + uc->read_user = NULL; + + ufbxi_check(ok); + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_obj_load(ufbxi_context *uc) +{ + ufbxi_check(ufbxi_obj_init(uc)); + ufbxi_check(ufbxi_obj_parse_file(uc)); + ufbxi_check(ufbxi_init_file_paths(uc)); + ufbxi_check(ufbxi_obj_load_mtl(uc)); + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_mtl_load(ufbxi_context *uc) +{ + ufbxi_check(ufbxi_obj_init(uc)); + ufbxi_check(ufbxi_init_file_paths(uc)); + ufbxi_check(ufbxi_obj_parse_mtl(uc)); + + return 1; +} + +#else +ufbxi_nodiscard static ufbxi_forceinline int ufbxi_obj_load(ufbxi_context *uc) +{ + ufbxi_fmt_err_info(&uc->error, "UFBX_ENABLE_FORMAT_OBJ"); + ufbxi_fail_msg("UFBXI_FEATURE_FORMAT_OBJ", "Feature disabled"); + return 0; +} + +ufbxi_nodiscard static ufbxi_forceinline int ufbxi_mtl_load(ufbxi_context *uc) +{ + ufbxi_fmt_err_info(&uc->error, "UFBX_ENABLE_FORMAT_OBJ"); + ufbxi_fail_msg("UFBXI_FEATURE_FORMAT_OBJ", "Feature disabled"); + return 0; +} + +static ufbxi_forceinline void ufbxi_obj_free(ufbxi_context *uc) +{ +} +#endif + +// -- Scene pre-processing + +typedef struct { + ufbx_element *src, *dst; +} ufbxi_pre_connection; + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_pre_finalize_scene(ufbxi_context *uc) +{ + bool required = false; + if (uc->opts.geometry_transform_handling == UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY) required = true; +#if defined(UFBX_REGRESSION) + required = true; +#endif + + if (!required) return 1; + + uint32_t num_elements = uc->num_elements; + ufbx_element **elements = ufbxi_push_pop(&uc->tmp_parse, &uc->tmp_element_ptrs, ufbx_element*, num_elements); + ufbxi_check(elements); + + size_t num_connections = uc->tmp_connections.num_items; + ufbxi_tmp_connection *tmp_connections = ufbxi_push_peek(&uc->tmp_parse, &uc->tmp_connections, ufbxi_tmp_connection, num_connections); + ufbxi_check(tmp_connections); + + ufbxi_pre_connection *pre_connections = ufbxi_push(&uc->tmp_parse, ufbxi_pre_connection, num_connections); + ufbxi_check(pre_connections); + + uint32_t *instance_counts = ufbxi_push_zero(&uc->tmp_parse, uint32_t, num_elements); + ufbxi_check(instance_counts); + + bool *modify_not_supported = ufbxi_push_zero(&uc->tmp_parse, bool, num_elements); + ufbxi_check(modify_not_supported); + + uint64_t *fbx_ids = ufbxi_push_zero(&uc->tmp_parse, uint64_t, num_elements); + ufbxi_check(fbx_ids); + + for (size_t i = 0; i < num_connections; i++) { + ufbxi_tmp_connection *tmp = &tmp_connections[i]; + ufbxi_pre_connection *pre = &pre_connections[i]; + + ufbxi_fbx_id_entry *src_entry = ufbxi_find_fbx_id(uc, tmp->src); + ufbxi_fbx_id_entry *dst_entry = ufbxi_find_fbx_id(uc, tmp->dst); + + ufbx_element *src = src_entry ? elements[src_entry->element_id] : NULL; + ufbx_element *dst = dst_entry ? elements[dst_entry->element_id] : NULL; + pre->src = src; + pre->dst = dst; + if (!src || !dst) continue; + + fbx_ids[src->element_id] = tmp->src; + fbx_ids[dst->element_id] = tmp->dst; + + if (tmp->src_prop.length == 0 && tmp->dst_prop.length == 0) { + // Count number of instances of each attribute + if (dst->type == UFBX_ELEMENT_NODE) { + if (src->type >= UFBX_ELEMENT_TYPE_FIRST_ATTRIB && src->type <= UFBX_ELEMENT_TYPE_LAST_ATTRIB) { + ++instance_counts[src->element_id]; + + // These must match what can be trasnsformed in `ufbxi_handle_geometry_transforms()` + switch (src->type) { + case UFBX_ELEMENT_MESH: + case UFBX_ELEMENT_LINE_CURVE: + case UFBX_ELEMENT_NURBS_CURVE: + case UFBX_ELEMENT_NURBS_SURFACE: + break; // Nop, supported + default: + modify_not_supported[dst->element_id] = true; + break; + } + } + } + } + } + + for (size_t i = 0; i < num_connections; i++) { + ufbxi_tmp_connection *tmp = &tmp_connections[i]; + ufbxi_pre_connection *pre = &pre_connections[i]; + ufbx_element *src = pre->src, *dst = pre->dst; + if (!src || !dst) continue; + + if (tmp->src_prop.length == 0 && tmp->dst_prop.length == 0) { + // Count maximum number of instanced attributes in a node + if (dst->type == UFBX_ELEMENT_NODE) { + if (src->type >= UFBX_ELEMENT_TYPE_FIRST_ATTRIB && src->type <= UFBX_ELEMENT_TYPE_LAST_ATTRIB) { + instance_counts[dst->element_id] = ufbxi_max32(instance_counts[dst->element_id], instance_counts[src->element_id]); + } + } + } + } + + for (size_t i = 0; i < num_elements; i++) { + ufbx_element *element = elements[i]; + uint64_t fbx_id = fbx_ids[i]; + + if (element->type == UFBX_ELEMENT_NODE) { + ufbx_node *node = (ufbx_node*)element; + // Setup a geometry transform helper for nodes that have instanced attributes + if (uc->opts.geometry_transform_handling == UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY) { + if (instance_counts[i] > 1 || modify_not_supported[i]) { + ufbxi_check(ufbxi_setup_geometry_transform_helper(uc, node, fbx_id)); + } + } + } + } + + return 1; +} + +// -- Scene processing + +static ufbxi_noinline ufbx_element *ufbxi_find_element_by_fbx_id(ufbxi_context *uc, uint64_t fbx_id) +{ + ufbxi_fbx_id_entry *entry = ufbxi_find_fbx_id(uc, fbx_id); + if (entry) { + return uc->scene.elements.data[entry->element_id]; + } + return NULL; +} + +ufbxi_forceinline static bool ufbxi_cmp_name_element_less(const ufbx_name_element *a, const ufbx_name_element *b) +{ + if (a->_internal_key != b->_internal_key) return a->_internal_key < b->_internal_key; + int cmp = strcmp(a->name.data, b->name.data); + if (cmp != 0) return cmp < 0; + return a->type < b->type; +} + +ufbxi_forceinline static bool ufbxi_cmp_name_element_less_ref(const ufbx_name_element *a, ufbx_string name, ufbx_element_type type, uint32_t key) +{ + if (a->_internal_key != key) return a->_internal_key < key; + int cmp = ufbxi_str_cmp(a->name, name); + if (cmp != 0) return cmp < 0; + return a->type < type; +} + +ufbxi_forceinline static bool ufbxi_cmp_prop_less_ref(const ufbx_prop *a, ufbx_string name, uint32_t key) +{ + if (a->_internal_key != key) return a->_internal_key < key; + return ufbxi_str_less(a->name, name); +} + +ufbxi_forceinline static bool ufbxi_cmp_prop_less_concat(const ufbx_prop *a, const ufbx_string *parts, size_t num_parts, uint32_t key) +{ + if (a->_internal_key != key) return a->_internal_key < key; + return ufbxi_concat_str_cmp(&a->name, parts, num_parts) < 0; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_name_elements(ufbxi_context *uc, ufbx_name_element *name_elems, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbx_name_element))); + ufbxi_macro_stable_sort(ufbx_name_element, 32, name_elems, uc->tmp_arr, count, + ( ufbxi_cmp_name_element_less(a, b) ) ); + return 1; +} + +ufbxi_noinline static bool ufbxi_cmp_node_less(ufbx_node *a, ufbx_node *b) +{ + if (a->node_depth != b->node_depth) return a->node_depth < b->node_depth; + if (a->parent && b->parent) { + uint32_t a_pid = a->parent->element.element_id, b_pid = b->parent->element.element_id; + if (a_pid != b_pid) return a_pid < b_pid; + } else { + ufbx_assert(a->parent == NULL && b->parent == NULL); + } + if (a->is_geometry_transform_helper != b->is_geometry_transform_helper) { + // Sort geometry transform helpers always before rest of the children. + return (unsigned)a->is_geometry_transform_helper > (unsigned)b->is_geometry_transform_helper; + } + return a->element.element_id < b->element.element_id; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_node_ptrs(ufbxi_context *uc, ufbx_node **nodes, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbx_node*))); + ufbxi_macro_stable_sort(ufbx_node*, 32, nodes, uc->tmp_arr, count, + ( ufbxi_cmp_node_less(*a, *b) ) ); + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_cmp_tmp_material_texture_less(const ufbxi_tmp_material_texture *a, const ufbxi_tmp_material_texture *b) +{ + if (a->material_id != b->material_id) return a->material_id < b->material_id; + if (a->texture_id != b->texture_id) return a->texture_id < b->texture_id; + return ufbxi_str_less(a->prop_name, b->prop_name); +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_tmp_material_textures(ufbxi_context *uc, ufbxi_tmp_material_texture *mat_texs, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbxi_tmp_material_texture))); + ufbxi_macro_stable_sort(ufbxi_tmp_material_texture, 32, mat_texs, uc->tmp_arr, count, + ( ufbxi_cmp_tmp_material_texture_less(a, b) )); + return 1; +} + +// We need to be able to assume no padding! +ufbx_static_assert(connection_size, sizeof(ufbx_connection) == sizeof(ufbx_element*)*2 + sizeof(ufbx_string)*2); + +ufbxi_forceinline static bool ufbxi_cmp_connection_less(ufbx_connection *a, ufbx_connection *b, size_t index) +{ + ufbx_element *a_elem = (&a->src)[index], *b_elem = (&b->src)[index]; + if (a_elem != b_elem) return a_elem < b_elem; + int cmp = strcmp((&a->src_prop)[index].data, (&b->src_prop)[index].data); + if (cmp != 0) return cmp < 0; + cmp = strcmp((&a->src_prop)[index ^ 1].data, (&b->src_prop)[index ^ 1].data); + return cmp < 0; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_connections(ufbxi_context *uc, ufbx_connection *connections, size_t count, size_t index) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbx_connection))); + ufbxi_macro_stable_sort(ufbx_connection, 32, connections, uc->tmp_arr, count, ( ufbxi_cmp_connection_less(a, b, index) )); + return 1; +} + +static uint64_t ufbxi_find_attribute_fbx_id(ufbxi_context *uc, uint64_t node_fbx_id) +{ + uint32_t hash = ufbxi_hash64(node_fbx_id); + ufbxi_fbx_attr_entry *entry = ufbxi_map_find(&uc->fbx_attr_map, ufbxi_fbx_attr_entry, hash, &node_fbx_id); + if (entry) { + return entry->attr_fbx_id; + } + return node_fbx_id; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_resolve_connections(ufbxi_context *uc) +{ + size_t num_connections = uc->tmp_connections.num_items; + ufbxi_tmp_connection *tmp_connections = ufbxi_push_pop(&uc->tmp, &uc->tmp_connections, ufbxi_tmp_connection, num_connections); + ufbxi_buf_free(&uc->tmp_connections); + ufbxi_check(tmp_connections); + + // NOTE: We truncate this array in case not all connections are resolved + uc->scene.connections_src.data = ufbxi_push(&uc->result, ufbx_connection, num_connections); + ufbxi_check(uc->scene.connections_src.data); + + // HACK: Translate property connections from node to attribute if + // the property name is not included in the known node properties. + if (uc->version > 0 && uc->version < 7000) { + ufbxi_for(ufbxi_tmp_connection, tmp_conn, tmp_connections, num_connections) { + if (tmp_conn->src_prop.length > 0 && !ufbxi_is_node_property(uc, tmp_conn->src_prop.data)) { + tmp_conn->src = ufbxi_find_attribute_fbx_id(uc, tmp_conn->src); + } + if (tmp_conn->dst_prop.length > 0 && !ufbxi_is_node_property(uc, tmp_conn->dst_prop.data)) { + tmp_conn->dst = ufbxi_find_attribute_fbx_id(uc, tmp_conn->dst); + } + } + } + + ufbxi_for(ufbxi_tmp_connection, tmp_conn, tmp_connections, num_connections) { + ufbx_element *src = ufbxi_find_element_by_fbx_id(uc, tmp_conn->src); + ufbx_element *dst = ufbxi_find_element_by_fbx_id(uc, tmp_conn->dst); + if (!src || !dst) continue; + + if (!uc->opts.disable_quirks) { + // Some exporters connect arbitrary non-nodes to root breaking further code, ignore those connections here! + if (dst->type == UFBX_ELEMENT_NODE && src->type != UFBX_ELEMENT_NODE && ((ufbx_node*)dst)->is_root) { + ufbxi_check(ufbxi_warnf(UFBX_WARNING_BAD_ELEMENT_CONNECTED_TO_ROOT, "Non-node element connected to root")); + continue; + } + } + + // Remap connections to geometry transform helpers if necessary, see `ufbxi_read_model()` for how these are setup. + if (uc->has_geometry_transform_nodes) { + if (dst->type == UFBX_ELEMENT_NODE && src->type >= UFBX_ELEMENT_TYPE_FIRST_ATTRIB && src->type <= UFBX_ELEMENT_TYPE_LAST_ATTRIB) { + ufbx_node *node = (ufbx_node*)dst; + if (node->has_geometry_transform) { + ufbxi_node_extra *extra = (ufbxi_node_extra*)ufbxi_get_element_extra(uc, node->element_id); + ufbx_assert(extra); + dst = uc->scene.elements.data[extra->geometry_helper_id]; + ufbx_assert(dst->type == UFBX_ELEMENT_NODE && ((ufbx_node*)dst)->is_geometry_transform_helper); + } + } + } + + // Translate deformers to point to the geometry in 6100, we don't need to worry about + // blend shapes here as they're always connected synthetically in older files. + if (uc->version > 0 && uc->version < 7000 && dst->type == UFBX_ELEMENT_NODE) { + if (src->type == UFBX_ELEMENT_SKIN_DEFORMER || src->type == UFBX_ELEMENT_CACHE_DEFORMER) { + tmp_conn->dst = ufbxi_find_attribute_fbx_id(uc, tmp_conn->dst); + dst = ufbxi_find_element_by_fbx_id(uc, tmp_conn->dst); + } + } + + ufbx_connection *conn = &uc->scene.connections_src.data[uc->scene.connections_src.count++]; + conn->src = src; + conn->dst = dst; + conn->src_prop = tmp_conn->src_prop; + conn->dst_prop = tmp_conn->dst_prop; + } + + uc->scene.connections_dst.count = uc->scene.connections_src.count; + uc->scene.connections_dst.data = ufbxi_push_copy(&uc->result, ufbx_connection, + uc->scene.connections_src.count, uc->scene.connections_src.data); + ufbxi_check(uc->scene.connections_dst.data); + + ufbxi_check(ufbxi_sort_connections(uc, uc->scene.connections_src.data, uc->scene.connections_src.count, 0)); + ufbxi_check(ufbxi_sort_connections(uc, uc->scene.connections_dst.data, uc->scene.connections_dst.count, 1)); + + // We don't need the temporary connections at this point anymore + ufbxi_buf_free(&uc->tmp_connections); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_add_connections_to_elements(ufbxi_context *uc) +{ + ufbx_connection *conn_src = uc->scene.connections_src.data; + ufbx_connection *conn_src_end = ufbxi_add_ptr(conn_src, uc->scene.connections_src.count); + ufbx_connection *conn_dst = uc->scene.connections_dst.data; + ufbx_connection *conn_dst_end = ufbxi_add_ptr(conn_dst, uc->scene.connections_dst.count); + + ufbxi_for_ptr(ufbx_element, p_elem, uc->scene.elements.data, uc->scene.elements.count) { + ufbx_element *elem = *p_elem; + uint32_t id = elem->element_id; + + while (conn_src < conn_src_end && conn_src->src->element_id < id) conn_src++; + while (conn_dst < conn_dst_end && conn_dst->dst->element_id < id) conn_dst++; + ufbx_connection *src_end = conn_src, *dst_end = conn_dst; + + while (src_end < conn_src_end && src_end->src->element_id == id) src_end++; + while (dst_end < conn_dst_end && dst_end->dst->element_id == id) dst_end++; + + elem->connections_src.data = conn_src; + elem->connections_src.count = ufbxi_to_size(src_end - conn_src); + elem->connections_dst.data = conn_dst; + elem->connections_dst.count = ufbxi_to_size(dst_end - conn_dst); + + // Setup animated properties + // TODO: It seems we're invalidating a lot of properties here actually, maybe they + // should be initially pushed to `tmp` instead of result if this happens so much.. + { + ufbx_prop *prop = elem->props.props.data, *prop_end = ufbxi_add_ptr(prop, elem->props.props.count); + ufbx_prop *copy_start = prop; + bool needs_copy = false; + size_t num_animated = 0, num_synthetic = 0; + + for (;;) { + // Scan to the next animation connection + for (; conn_dst < dst_end; conn_dst++) { + if (conn_dst->dst_prop.length == 0) continue; + if (conn_dst->src_prop.length > 0) break; + if (conn_dst->src->type == UFBX_ELEMENT_ANIM_VALUE) break; + } + + ufbx_string name = ufbx_empty_string; + if (conn_dst < dst_end) { + name = conn_dst->dst_prop; + } + if (name.length == 0) break; + + // NOTE: "Animated" properties also include connected ones as we need + // to resolve them during evaluation + num_animated++; + + ufbx_anim_value *anim_value = NULL; + uint32_t flags = 0; + for (; conn_dst < dst_end && conn_dst->dst_prop.data == name.data; conn_dst++) { + if (conn_dst->src_prop.length > 0) { + flags |= UFBX_PROP_FLAG_CONNECTED; + } else if (conn_dst->src->type == UFBX_ELEMENT_ANIM_VALUE) { + anim_value = (ufbx_anim_value*)conn_dst->src; + flags |= UFBX_PROP_FLAG_ANIMATED; + } + } + + uint32_t key = ufbxi_get_name_key(name.data, name.length); + while (prop != prop_end && ufbxi_name_key_less(prop, name.data, name.length, key)) prop++; + + if (prop != prop_end && prop->name.data == name.data) { + prop->flags = (ufbx_prop_flags)((uint32_t)prop->flags | flags); + } else { + // Animated property that is not in the element property list + // Copy the preceding properties to the stack, then push a + // synthetic property for the animated property. + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_prop, ufbxi_to_size(prop - copy_start), copy_start)); + copy_start = prop; + needs_copy = true; + + // Let's hope we can find the property in the defaults at least + ufbx_prop anim_def_prop; + ufbx_prop *def_prop = NULL; + if (elem->props.defaults) { + def_prop = ufbxi_find_prop_with_key(elem->props.defaults, name.data, key); + } else if (anim_value) { + memset(&anim_def_prop, 0, sizeof(anim_def_prop)); + // Hack a couple of common types + ufbx_prop_type type = UFBX_PROP_UNKNOWN; + if (name.data == ufbxi_Lcl_Translation) type = UFBX_PROP_TRANSLATION; + else if (name.data == ufbxi_Lcl_Rotation) type = UFBX_PROP_ROTATION; + else if (name.data == ufbxi_Lcl_Scaling) type = UFBX_PROP_SCALING; + anim_def_prop.type = type; + anim_def_prop.value_vec3 = anim_value->default_value; + anim_def_prop.value_int = ufbxi_f64_to_i64(anim_value->default_value.x); + anim_def_prop.value_real_arr[3] = 0.0f; + def_prop = &anim_def_prop; + } else { + flags |= UFBX_PROP_FLAG_NO_VALUE; + } + + ufbx_prop *new_prop = ufbxi_push_zero(&uc->tmp_stack, ufbx_prop, 1); + ufbxi_check(new_prop); + if (def_prop) *new_prop = *def_prop; + flags |= (uint32_t)new_prop->flags; + new_prop->flags = (ufbx_prop_flags)(UFBX_PROP_FLAG_ANIMATABLE | UFBX_PROP_FLAG_SYNTHETIC | flags); + new_prop->name = name; + new_prop->_internal_key = key; + new_prop->value_str = ufbx_empty_string; + new_prop->value_blob = ufbx_empty_blob; + num_synthetic++; + } + } + + // Copy the properties if necessary + if (needs_copy) { + size_t num_new_props = elem->props.props.count + num_synthetic; + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_prop, ufbxi_to_size(prop_end - copy_start), copy_start)); + elem->props.props.data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_prop, num_new_props); + ufbxi_check(elem->props.props.data); + elem->props.props.count = num_new_props; + } + elem->props.num_animated = num_animated; + } + + conn_src = src_end; + conn_dst = dst_end; + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_linearize_nodes(ufbxi_context *uc) +{ + size_t num_nodes = uc->tmp_node_ids.num_items; + uint32_t *node_ids = ufbxi_push_pop(&uc->tmp, &uc->tmp_node_ids, uint32_t, num_nodes); + ufbxi_buf_free(&uc->tmp_node_ids); + ufbxi_check(node_ids); + + ufbx_node **node_ptrs = ufbxi_push(&uc->tmp_stack, ufbx_node*, num_nodes); + ufbxi_check(node_ptrs); + + // Fetch the node pointers + for (size_t i = 0; i < num_nodes; i++) { + node_ptrs[i] = (ufbx_node*)uc->scene.elements.data[node_ids[i]]; + ufbx_assert(node_ptrs[i]->element.type == UFBX_ELEMENT_NODE); + } + + uc->scene.root_node = node_ptrs[0]; + + size_t *node_offsets = ufbxi_push_pop(&uc->tmp_stack, &uc->tmp_typed_element_offsets[UFBX_ELEMENT_NODE], size_t, num_nodes); + ufbxi_check(node_offsets); + + // Hook up the parent nodes, we'll assume that there's no cycles at this point + ufbxi_for_ptr(ufbx_node, p_node, node_ptrs, num_nodes) { + ufbx_node *node = *p_node; + + // Pre-6000 files don't have any explicit root connections so they must always + // be connected to the root.. + if (node->parent == NULL && !(uc->opts.allow_nodes_out_of_root && uc->version >= 6000)) { + if (node != uc->scene.root_node) { + node->parent = uc->scene.root_node; + } + } + + ufbxi_for_list(ufbx_connection, conn, node->element.connections_dst) { + if (conn->src_prop.length > 0 || conn->dst_prop.length > 0) continue; + if (conn->src->type != UFBX_ELEMENT_NODE) continue; + ((ufbx_node*)conn->src)->parent = node; + } + } + + // Count the parent depths and child amounts + ufbxi_for_ptr(ufbx_node, p_node, node_ptrs, num_nodes) { + ufbx_node *node = *p_node; + uint32_t depth = 0; + + for (ufbx_node *p = node->parent; p; p = p->parent) { + depth += p->node_depth + 1; + if (p->node_depth > 0) break; + ufbxi_check_msg(depth <= num_nodes, "Cyclic node hierarchy"); + } + + node->node_depth = depth; + + // Second pass to cache the depths to avoid O(n^2) + for (ufbx_node *p = node->parent; p; p = p->parent) { + if (--depth <= p->node_depth) break; + p->node_depth = depth; + } + } + + ufbxi_check(ufbxi_sort_node_ptrs(uc, node_ptrs, num_nodes)); + + for (uint32_t i = 0; i < num_nodes; i++) { + size_t *p_offset = ufbxi_push(&uc->tmp_typed_element_offsets[UFBX_ELEMENT_NODE], size_t, 1); + ufbxi_check(p_offset); + ufbx_node *node = node_ptrs[i]; + + uint32_t original_id = node->element.typed_id; + node->element.typed_id = i; + *p_offset = node_offsets[original_id]; + } + + // Pop the temporary arrays + ufbxi_pop(&uc->tmp_stack, size_t, num_nodes, NULL); + ufbxi_pop(&uc->tmp_stack, ufbx_node*, num_nodes, NULL); + + return 1; +} + + +ufbxi_nodiscard ufbxi_noinline static ufbx_connection_list ufbxi_find_dst_connections(ufbx_element *element, const char *prop) +{ + if (!prop) prop = ufbxi_empty_char; + + size_t begin = element->connections_dst.count, end = begin; + + ufbxi_macro_lower_bound_eq(ufbx_connection, 32, &begin, + element->connections_dst.data, 0, element->connections_dst.count, + (strcmp(a->dst_prop.data, prop) < 0), + (a->dst_prop.data == prop && a->src_prop.length == 0)); + + ufbxi_macro_upper_bound_eq(ufbx_connection, 32, &end, + element->connections_dst.data, begin, element->connections_dst.count, + (a->dst_prop.data == prop && a->src_prop.length == 0)); + + ufbx_connection_list result = { element->connections_dst.data + begin, end - begin }; + return result; +} + +ufbxi_nodiscard ufbxi_noinline static ufbx_connection_list ufbxi_find_src_connections(ufbx_element *element, const char *prop) +{ + if (!prop) prop = ufbxi_empty_char; + + size_t begin = element->connections_src.count, end = begin; + + ufbxi_macro_lower_bound_eq(ufbx_connection, 32, &begin, + element->connections_src.data, 0, element->connections_src.count, + (strcmp(a->src_prop.data, prop) < 0), + (a->src_prop.data == prop && a->dst_prop.length == 0)); + + ufbxi_macro_upper_bound_eq(ufbx_connection, 32, &end, + element->connections_src.data, begin, element->connections_src.count, + (a->src_prop.data == prop && a->dst_prop.length == 0)); + + ufbx_connection_list result = { element->connections_src.data + begin, end - begin }; + return result; +} + +ufbxi_nodiscard static ufbx_element *ufbxi_get_element_node(ufbx_element *element) +{ + if (!element) return NULL; + if (element->type == UFBX_ELEMENT_NODE) { + ufbx_node *node = (ufbx_node*)element; + if (node->is_geometry_transform_helper) return (ufbx_element*)node->parent; + return NULL; + } else { + return element->instances.count > 0 ? &element->instances.data[0]->element : NULL; + } +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_fetch_dst_elements(ufbxi_context *uc, void *p_dst_list, ufbx_element *element, bool search_node, const char *prop, ufbx_element_type src_type) +{ + size_t num_elements = 0; + + do { + ufbx_connection_list conns = ufbxi_find_dst_connections(element, prop); + ufbxi_for_list(ufbx_connection, conn, conns) { + if (conn->src->type == src_type) { + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_element*, 1, &conn->src)); + num_elements++; + } + } + } while (search_node && (element = ufbxi_get_element_node(element)) != NULL); + + ufbx_element_list *list = (ufbx_element_list*)p_dst_list; + list->data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_element*, num_elements); + list->count = num_elements; + ufbxi_check(list->data); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_fetch_src_elements(ufbxi_context *uc, void *p_dst_list, ufbx_element *element, bool search_node, const char *prop, ufbx_element_type dst_type) +{ + size_t num_elements = 0; + + do { + ufbx_connection_list conns = ufbxi_find_src_connections(element, prop); + ufbxi_for_list(ufbx_connection, conn, conns) { + if (conn->dst->type == dst_type) { + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_element*, 1, &conn->dst)); + num_elements++; + } + } + } while (search_node && (element = ufbxi_get_element_node(element)) != NULL); + + ufbx_element_list *list = (ufbx_element_list*)p_dst_list; + list->data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_element*, num_elements); + list->count = num_elements; + ufbxi_check(list->data); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static ufbx_element *ufbxi_fetch_dst_element(ufbx_element *element, bool search_node, const char *prop, ufbx_element_type src_type) +{ + do { + ufbx_connection_list conns = ufbxi_find_dst_connections(element, prop); + ufbxi_for_list(ufbx_connection, conn, conns) { + if (conn->src->type == src_type) { + return conn->src; + } + } + } while (search_node && (element = ufbxi_get_element_node(element)) != NULL); + + return NULL; +} + +ufbxi_nodiscard ufbxi_noinline static ufbx_element *ufbxi_fetch_src_element(ufbx_element *element, bool search_node, const char *prop, ufbx_element_type dst_type) +{ + do { + ufbx_connection_list conns = ufbxi_find_src_connections(element, prop); + ufbxi_for_list(ufbx_connection, conn, conns) { + if (conn->dst->type == dst_type) { + return conn->dst; + } + } + } while (search_node && (element = ufbxi_get_element_node(element)) != NULL); + + return NULL; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_fetch_textures(ufbxi_context *uc, ufbx_material_texture_list *list, ufbx_element *element, bool search_node) +{ + size_t num_textures = 0; + + do { + ufbxi_for_list(ufbx_connection, conn, element->connections_dst) { + if (conn->src_prop.length > 0) continue; + if (conn->src->type == UFBX_ELEMENT_TEXTURE) { + ufbx_material_texture *tex = ufbxi_push(&uc->tmp_stack, ufbx_material_texture, 1); + ufbxi_check(tex); + tex->shader_prop = tex->material_prop = conn->dst_prop; + tex->texture = (ufbx_texture*)conn->src; + num_textures++; + } + } + } while (search_node && (element = ufbxi_get_element_node(element)) != NULL); + + list->data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_material_texture, num_textures); + list->count = num_textures; + ufbxi_check(list->data); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_fetch_mesh_materials(ufbxi_context *uc, ufbx_mesh_material_list *list, ufbx_element *element, bool search_node) +{ + size_t num_materials = 0; + + do { + ufbx_connection_list conns = ufbxi_find_dst_connections(element, NULL); + ufbxi_for_list(ufbx_connection, conn, conns) { + if (conn->src->type == UFBX_ELEMENT_MATERIAL) { + ufbx_mesh_material mesh_mat = { (ufbx_material*)conn->src }; + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_mesh_material, 1, &mesh_mat)); + num_materials++; + } + } + + if (num_materials > 0) break; + } while (search_node && (element = ufbxi_get_element_node(element)) != NULL); + + list->data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_mesh_material, num_materials); + list->count = num_materials; + ufbxi_check(list->data); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_fetch_deformers(ufbxi_context *uc, ufbx_element_list *list, ufbx_element *element, bool search_node) +{ + size_t num_deformers = 0; + + do { + ufbxi_for_list(ufbx_connection, conn, element->connections_dst) { + if (conn->src_prop.length > 0) continue; + ufbx_element_type type = conn->src->type; + if (type == UFBX_ELEMENT_SKIN_DEFORMER || type == UFBX_ELEMENT_BLEND_DEFORMER || type == UFBX_ELEMENT_CACHE_DEFORMER) { + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_element*, 1, &conn->src)); + num_deformers++; + } + } + } while (search_node && (element = ufbxi_get_element_node(element)) != NULL); + + list->data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_element*, num_deformers); + list->count = num_deformers; + ufbxi_check(list->data); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_fetch_blend_keyframes(ufbxi_context *uc, ufbx_blend_keyframe_list *list, ufbx_element *element) +{ + size_t num_keyframes = 0; + + ufbx_connection_list conns = ufbxi_find_dst_connections(element, NULL); + ufbxi_for_list(ufbx_connection, conn, conns) { + if (conn->src->type == UFBX_ELEMENT_BLEND_SHAPE) { + ufbx_blend_keyframe key = { (ufbx_blend_shape*)conn->src }; + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_blend_keyframe, 1, &key)); + num_keyframes++; + } + } + + list->data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_blend_keyframe, num_keyframes); + list->count = num_keyframes; + ufbxi_check(list->data); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_fetch_texture_layers(ufbxi_context *uc, ufbx_texture_layer_list *list, ufbx_element *element) +{ + size_t num_layers = 0; + + ufbx_connection_list conns = ufbxi_find_dst_connections(element, NULL); + ufbxi_for_list(ufbx_connection, conn, conns) { + if (conn->src->type == UFBX_ELEMENT_TEXTURE) { + ufbx_texture *texture = (ufbx_texture*)conn->src; + ufbx_texture_layer layer = { texture }; + layer.alpha = ufbxi_find_real(&texture->props, ufbxi_Texture_alpha, 1.0f); + layer.blend_mode = (ufbx_blend_mode)ufbxi_find_enum(&texture->props, ufbxi_BlendMode, UFBX_BLEND_REPLACE, UFBX_BLEND_OVERLAY); + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_texture_layer, 1, &layer)); + num_layers++; + } + } + + list->data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_texture_layer, num_layers); + list->count = num_layers; + ufbxi_check(list->data); + + return 1; +} + +static ufbxi_forceinline bool ufbxi_prop_connection_less(const ufbx_connection *a, const char *prop) +{ + int cmp = strcmp(a->dst_prop.data, prop); + if (cmp != 0) return cmp < 0; + return a->src_prop.length == 0; +} + +ufbxi_nodiscard ufbxi_noinline static ufbx_connection *ufbxi_find_prop_connection(const ufbx_element *element, const char *prop) +{ + if (!prop) prop = ufbxi_empty_char; + + size_t index = SIZE_MAX; + + ufbxi_macro_lower_bound_eq(ufbx_connection, 32, &index, + element->connections_dst.data, 0, element->connections_dst.count, + (ufbxi_prop_connection_less(a, prop)), + (a->dst_prop.data == prop && a->src_prop.length > 0)); + + return index < SIZE_MAX ? &element->connections_dst.data[index] : NULL; +} + +ufbxi_forceinline static void ufbxi_patch_index_pointer(ufbxi_context *uc, uint32_t **p_index) +{ + if (*p_index == ufbxi_sentinel_index_zero) { + *p_index = uc->zero_indices; + } else if (*p_index == ufbxi_sentinel_index_consecutive) { + *p_index = uc->consecutive_indices; + } +} + +ufbxi_nodiscard static bool ufbxi_cmp_anim_prop_less(const ufbx_anim_prop *a, const ufbx_anim_prop *b) +{ + if (a->element != b->element) return a->element < b->element; + if (a->_internal_key != b->_internal_key) return a->_internal_key < b->_internal_key; + return ufbxi_str_less(a->prop_name, b->prop_name); +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_anim_props(ufbxi_context *uc, ufbx_anim_prop *aprops, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbx_anim_prop))); + ufbxi_macro_stable_sort(ufbx_anim_prop, 32, aprops, uc->tmp_arr, count, ( ufbxi_cmp_anim_prop_less(a, b) )); + return 1; +} + +ufbxi_noinline static bool ufbxi_material_texture_less(void *user, const void *va, const void *vb) +{ + (void)user; + const ufbx_material_texture *a = (const ufbx_material_texture*)va, *b = (const ufbx_material_texture*)vb; + return ufbxi_str_less(a->material_prop, b->material_prop); +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_material_textures(ufbxi_context *uc, ufbx_material_texture *textures, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbx_material_texture))); + ufbxi_stable_sort(sizeof(ufbx_material_texture), 32, textures, uc->tmp_arr, count, &ufbxi_material_texture_less, NULL); + return 1; +} + +ufbxi_noinline static bool ufbxi_video_ptr_less(void *user, const void *va, const void *vb) +{ + (void)user; + const ufbx_video *a = *(const ufbx_video**)va, *b = *(const ufbx_video**)vb; + return ufbxi_str_less(a->absolute_filename, b->absolute_filename); +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_videos_by_filename(ufbxi_context *uc, ufbx_video **videos, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbx_video*))); + ufbxi_stable_sort(sizeof(ufbx_video*), 32, videos, uc->tmp_arr, count, &ufbxi_video_ptr_less, NULL); + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static ufbx_anim_prop *ufbxi_find_anim_prop_start(ufbx_anim_layer *layer, const ufbx_element *element) +{ + size_t index = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_anim_prop, 16, &index, layer->anim_props.data, 0, layer->anim_props.count, + (a->element < element), (a->element == element)); + return index != SIZE_MAX ? &layer->anim_props.data[index] : NULL; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_skin_weights(ufbxi_context *uc, ufbx_skin_deformer *skin) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, skin->max_weights_per_vertex * sizeof(ufbx_skin_weight))); + + for (size_t i = 0; i < skin->vertices.count; i++) { + ufbx_skin_vertex v = skin->vertices.data[i]; + ufbxi_macro_stable_sort(ufbx_skin_weight, 32, skin->weights.data + v.weight_begin, uc->tmp_arr, v.num_weights, + ( a->weight > b->weight )); + } + + return 1; +} + +ufbxi_noinline static bool ufbxi_blend_keyframe_less(void *user, const void *va, const void *vb) +{ + (void)user; + const ufbx_blend_keyframe *a = (const ufbx_blend_keyframe*)va, *b = (const ufbx_blend_keyframe*)vb; + return a->target_weight < b->target_weight; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_sort_blend_keyframes(ufbxi_context *uc, ufbx_blend_keyframe *keyframes, size_t count) +{ + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbx_blend_keyframe))); + ufbxi_stable_sort(sizeof(ufbx_blend_keyframe), 32, keyframes, uc->tmp_arr, count, &ufbxi_blend_keyframe_less, NULL); + return 1; +} + +// Material tables + +typedef void (*ufbxi_mat_transform_fn)(ufbx_vec4 *a); + +static void ufbxi_mat_transform_invert_x(ufbx_vec4 *v) { v->x = 1.0f - v->x; } +static void ufbxi_mat_transform_unknown_shininess(ufbx_vec4 *v) { if (v->x >= 0.0f) v->x = (ufbx_real)(1.0f - ufbx_sqrt(v->x) * (ufbx_real)0.1); if (!(v->x >= 0.0f)) v->x = 0.0f; } +static void ufbxi_mat_transform_blender_opacity(ufbx_vec4 *v) { v->x = 1.0f - v->x; } +static void ufbxi_mat_transform_blender_shininess(ufbx_vec4 *v) { if (v->x >= 0.0f) v->x = (ufbx_real)(1.0f - ufbx_sqrt(v->x) * (ufbx_real)0.1); if (!(v->x >= 0.0f)) v->x = 0.0f; } + +typedef enum { + UFBXI_MAT_TRANSFORM_IDENTITY, + UFBXI_MAT_TRANSFORM_INVERT_X, + UFBXI_MAT_TRANSFORM_UNKNOWN_SHININESS, + UFBXI_MAT_TRANSFORM_BLENDER_OPACITY, + UFBXI_MAT_TRANSFORM_BLENDER_SHININESS, + + UFBXI_MAT_TRANSFORM_COUNT, +} ufbxi_mat_transform; + +typedef enum { + // Set `value_vec4.w` (usually alpha) to 1.0 if not defined by the property + UFBXI_SHADER_MAPPING_DEFAULT_W_1 = 0x1, + // Widen values to RGB if only a single value is present. + UFBXI_SHADER_MAPPING_WIDEN_TO_RGB = 0x2, +} ufbxi_shader_mapping_flag; + +typedef enum { + // Invert the feature flag + UFBXI_SHADER_FEATURE_INVERTED = 0x1, + // Enable the feature if the given property exists + UFBXI_SHADER_FEATURE_IF_EXISTS = 0x2, + // Enable the feature if the given property has a texture + UFBXI_SHADER_FEATURE_IF_TEXTURE = 0x4, + // Enable if the feature is in [0.5, 1.5], (ie. 2 won't enable this feature) + UFBXI_SHADER_FEATURE_IF_AROUND_1 = 0x8, + + UFBXI_SHADER_FEATURE_IF_EXISTS_OR_TEXTURE = UFBXI_SHADER_FEATURE_IF_EXISTS|UFBXI_SHADER_FEATURE_IF_TEXTURE, +} ufbxi_shader_feature_flag; + +static const ufbxi_mat_transform_fn ufbxi_mat_transform_fns[] = { + NULL, + &ufbxi_mat_transform_invert_x, + &ufbxi_mat_transform_unknown_shininess, + &ufbxi_mat_transform_blender_opacity, + &ufbxi_mat_transform_blender_shininess, +}; + +ufbx_static_assert(transform_count, ufbxi_arraycount(ufbxi_mat_transform_fns) == UFBXI_MAT_TRANSFORM_COUNT); + +typedef struct { + uint8_t index; // < `ufbx_material_(fbx|pbr)_map` + uint8_t flags; // < Combination of `ufbxi_shader_mapping_flag` + uint8_t transform; // < `ufbxi_mat_transform` + uint8_t prop_len; // < Length of `prop` not including NULL terminator + const char *prop; // < Name of FBX material property or shader mapping +} ufbxi_shader_mapping; + +typedef struct { + const ufbxi_shader_mapping *data; + size_t count; + const ufbxi_shader_mapping *features; + size_t feature_count; + uint32_t default_features; + ufbx_string texture_prefix; + ufbx_string texture_suffix; + ufbx_string texture_enabled_prefix; + ufbx_string texture_enabled_suffix; +} ufbxi_shader_mapping_list; + +#define ufbxi_mat_string(str) sizeof(str) - 1, str + +static const ufbxi_shader_mapping ufbxi_base_fbx_mapping[] = { + { UFBX_MATERIAL_FBX_DIFFUSE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Diffuse") }, + { UFBX_MATERIAL_FBX_DIFFUSE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("DiffuseColor") }, + { UFBX_MATERIAL_FBX_DIFFUSE_FACTOR, 0, 0, ufbxi_mat_string("DiffuseFactor") }, + { UFBX_MATERIAL_FBX_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Specular") }, + { UFBX_MATERIAL_FBX_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("SpecularColor") }, + { UFBX_MATERIAL_FBX_SPECULAR_FACTOR, 0, 0, ufbxi_mat_string("SpecularFactor") }, + { UFBX_MATERIAL_FBX_SPECULAR_EXPONENT, 0, 0, ufbxi_mat_string("Shininess") }, + { UFBX_MATERIAL_FBX_SPECULAR_EXPONENT, 0, 0, ufbxi_mat_string("ShininessExponent") }, + { UFBX_MATERIAL_FBX_REFLECTION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Reflection") }, + { UFBX_MATERIAL_FBX_REFLECTION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("ReflectionColor") }, + { UFBX_MATERIAL_FBX_REFLECTION_FACTOR, 0, 0, ufbxi_mat_string("ReflectionFactor") }, + { UFBX_MATERIAL_FBX_TRANSPARENCY_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Transparent") }, + { UFBX_MATERIAL_FBX_TRANSPARENCY_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("TransparentColor") }, + { UFBX_MATERIAL_FBX_TRANSPARENCY_FACTOR, 0, 0, ufbxi_mat_string("TransparentFactor") }, + { UFBX_MATERIAL_FBX_TRANSPARENCY_FACTOR, 0, 0, ufbxi_mat_string("TransparencyFactor") }, + { UFBX_MATERIAL_FBX_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Emissive") }, + { UFBX_MATERIAL_FBX_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("EmissiveColor") }, + { UFBX_MATERIAL_FBX_EMISSION_FACTOR, 0, 0, ufbxi_mat_string("EmissiveFactor") }, + { UFBX_MATERIAL_FBX_AMBIENT_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Ambient") }, + { UFBX_MATERIAL_FBX_AMBIENT_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("AmbientColor") }, + { UFBX_MATERIAL_FBX_AMBIENT_FACTOR, 0, 0, ufbxi_mat_string("AmbientFactor") }, + { UFBX_MATERIAL_FBX_NORMAL_MAP, 0, 0, ufbxi_mat_string("NormalMap") }, + { UFBX_MATERIAL_FBX_BUMP, 0, 0, ufbxi_mat_string("Bump") }, + { UFBX_MATERIAL_FBX_BUMP_FACTOR, 0, 0, ufbxi_mat_string("BumpFactor") }, + { UFBX_MATERIAL_FBX_DISPLACEMENT, 0, 0, ufbxi_mat_string("Displacement") }, + { UFBX_MATERIAL_FBX_DISPLACEMENT_FACTOR, 0, 0, ufbxi_mat_string("DisplacementFactor") }, + { UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT, 0, 0, ufbxi_mat_string("VectorDisplacement") }, + { UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT_FACTOR, 0, 0, ufbxi_mat_string("VectorDisplacementFactor") }, +}; + +static const ufbxi_shader_mapping ufbxi_obj_fbx_mapping[] = { + { UFBX_MATERIAL_FBX_AMBIENT_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1|UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("Ka") }, + { UFBX_MATERIAL_FBX_DIFFUSE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1|UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("Kd") }, + { UFBX_MATERIAL_FBX_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1|UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("Ks") }, + { UFBX_MATERIAL_FBX_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1|UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("Ke") }, + { UFBX_MATERIAL_FBX_SPECULAR_EXPONENT, 0, 0, ufbxi_mat_string("Ns") }, + { UFBX_MATERIAL_FBX_TRANSPARENCY_FACTOR, 0, UFBXI_MAT_TRANSFORM_INVERT_X, ufbxi_mat_string("d") }, + { UFBX_MATERIAL_FBX_NORMAL_MAP, 0, 0, ufbxi_mat_string("norm") }, + { UFBX_MATERIAL_FBX_DISPLACEMENT, 0, 0, ufbxi_mat_string("disp") }, + { UFBX_MATERIAL_FBX_BUMP, 0, 0, ufbxi_mat_string("bump") }, +}; + +static const ufbxi_shader_mapping ufbxi_fbx_lambert_shader_pbr_mapping[] = { + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Diffuse") }, + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("DiffuseColor") }, + { UFBX_MATERIAL_PBR_BASE_FACTOR, 0, 0, ufbxi_mat_string("DiffuseFactor") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Transparent") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("TransparentColor") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR, 0, 0, ufbxi_mat_string("TransparentFactor") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR, 0, 0, ufbxi_mat_string("TransparencyFactor") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Emissive") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("EmissiveColor") }, + { UFBX_MATERIAL_PBR_EMISSION_FACTOR, 0, 0, ufbxi_mat_string("EmissiveFactor") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("NormalMap") }, +}; + +static const ufbxi_shader_mapping ufbxi_fbx_phong_shader_pbr_mapping[] = { + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Diffuse") }, + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("DiffuseColor") }, + { UFBX_MATERIAL_PBR_BASE_FACTOR, 0, 0, ufbxi_mat_string("DiffuseFactor") }, + { UFBX_MATERIAL_PBR_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Specular") }, + { UFBX_MATERIAL_PBR_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("SpecularColor") }, + { UFBX_MATERIAL_PBR_SPECULAR_FACTOR, 0, 0, ufbxi_mat_string("SpecularFactor") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, UFBXI_MAT_TRANSFORM_UNKNOWN_SHININESS, ufbxi_mat_string("Shininess") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, UFBXI_MAT_TRANSFORM_UNKNOWN_SHININESS, ufbxi_mat_string("ShininessExponent") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Transparent") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("TransparentColor") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR, 0, 0, ufbxi_mat_string("TransparentFactor") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR, 0, 0, ufbxi_mat_string("TransparencyFactor") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Emissive") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("EmissiveColor") }, + { UFBX_MATERIAL_PBR_EMISSION_FACTOR, 0, 0, ufbxi_mat_string("EmissiveFactor") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("NormalMap") }, +}; + +static const ufbxi_shader_mapping ufbxi_osl_standard_shader_pbr_mapping[] = { + { UFBX_MATERIAL_PBR_BASE_FACTOR, 0, 0, ufbxi_mat_string("base") }, + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("base_color") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, 0, ufbxi_mat_string("specular_roughness") }, + { UFBX_MATERIAL_PBR_DIFFUSE_ROUGHNESS, 0, 0, ufbxi_mat_string("diffuse_roughness") }, + { UFBX_MATERIAL_PBR_METALNESS, 0, 0, ufbxi_mat_string("metalness") }, + { UFBX_MATERIAL_PBR_SPECULAR_FACTOR, 0, 0, ufbxi_mat_string("specular") }, + { UFBX_MATERIAL_PBR_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("specular_color") }, + { UFBX_MATERIAL_PBR_SPECULAR_IOR, 0, 0, ufbxi_mat_string("specular_IOR") }, + { UFBX_MATERIAL_PBR_SPECULAR_ANISOTROPY, 0, 0, ufbxi_mat_string("specular_anisotropy") }, + { UFBX_MATERIAL_PBR_SPECULAR_ROTATION, 0, 0, ufbxi_mat_string("specular_rotation") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR, 0, 0, ufbxi_mat_string("transmission") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("transmission_color") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_DEPTH, 0, 0, ufbxi_mat_string("transmission_depth") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("transmission_scatter") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER_ANISOTROPY, 0, 0, ufbxi_mat_string("transmission_scatter_anisotropy") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_DISPERSION, 0, 0, ufbxi_mat_string("transmission_dispersion") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_EXTRA_ROUGHNESS, 0, 0, ufbxi_mat_string("transmission_extra_roughness") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_FACTOR, 0, 0, ufbxi_mat_string("subsurface") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("subsurface_color") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_RADIUS, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("subsurface_radius") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_SCALE, 0, 0, ufbxi_mat_string("subsurface_scale") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_ANISOTROPY, 0, 0, ufbxi_mat_string("subsurface_anisotropy") }, + { UFBX_MATERIAL_PBR_SHEEN_FACTOR, 0, 0, ufbxi_mat_string("sheen") }, + { UFBX_MATERIAL_PBR_SHEEN_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("sheen_color") }, + { UFBX_MATERIAL_PBR_SHEEN_ROUGHNESS, 0, 0, ufbxi_mat_string("sheen_roughness") }, + { UFBX_MATERIAL_PBR_COAT_FACTOR, 0, 0, ufbxi_mat_string("coat") }, + { UFBX_MATERIAL_PBR_COAT_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("coat_color") }, + { UFBX_MATERIAL_PBR_COAT_ROUGHNESS, 0, 0, ufbxi_mat_string("coat_roughness") }, + { UFBX_MATERIAL_PBR_COAT_IOR, 0, 0, ufbxi_mat_string("coat_IOR") }, + { UFBX_MATERIAL_PBR_COAT_ANISOTROPY, 0, 0, ufbxi_mat_string("coat_anisotropy") }, + { UFBX_MATERIAL_PBR_COAT_ROTATION, 0, 0, ufbxi_mat_string("coat_rotation") }, + { UFBX_MATERIAL_PBR_COAT_NORMAL, 0, 0, ufbxi_mat_string("coat_normal") }, + { UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("coat_affect_color") }, + { UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_ROUGHNESS, 0, 0, ufbxi_mat_string("coat_affect_roughness") }, + { UFBX_MATERIAL_PBR_THIN_FILM_THICKNESS, 0, 0, ufbxi_mat_string("thin_film_thickness") }, + { UFBX_MATERIAL_PBR_THIN_FILM_IOR, 0, 0, ufbxi_mat_string("thin_film_IOR") }, + { UFBX_MATERIAL_PBR_EMISSION_FACTOR, 0, 0, ufbxi_mat_string("emission") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("emission_color") }, + { UFBX_MATERIAL_PBR_OPACITY, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("opacity") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("NormalMap") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("normalCamera") }, + { UFBX_MATERIAL_PBR_TANGENT_MAP, 0, 0, ufbxi_mat_string("tangent") }, +}; + +static const ufbxi_shader_mapping ufbxi_osl_standard_shader_features[] = { + { UFBX_MATERIAL_FEATURE_THIN_WALLED, 0, 0, ufbxi_mat_string("thin_walled") }, +}; + +static const ufbxi_shader_mapping ufbxi_arnold_shader_pbr_mapping[] = { + { UFBX_MATERIAL_PBR_BASE_FACTOR, 0, 0, ufbxi_mat_string("base") }, + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("baseColor") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, 0, ufbxi_mat_string("specularRoughness") }, + { UFBX_MATERIAL_PBR_DIFFUSE_ROUGHNESS, 0, 0, ufbxi_mat_string("diffuseRoughness") }, + { UFBX_MATERIAL_PBR_METALNESS, 0, 0, ufbxi_mat_string("metalness") }, + { UFBX_MATERIAL_PBR_SPECULAR_FACTOR, 0, 0, ufbxi_mat_string("specular") }, + { UFBX_MATERIAL_PBR_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("specularColor") }, + { UFBX_MATERIAL_PBR_SPECULAR_IOR, 0, 0, ufbxi_mat_string("specularIOR") }, + { UFBX_MATERIAL_PBR_SPECULAR_ANISOTROPY, 0, 0, ufbxi_mat_string("specularAnisotropy") }, + { UFBX_MATERIAL_PBR_SPECULAR_ROTATION, 0, 0, ufbxi_mat_string("specularRotation") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR, 0, 0, ufbxi_mat_string("transmission") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("transmissionColor") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_DEPTH, 0, 0, ufbxi_mat_string("transmissionDepth") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("transmissionScatter") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER_ANISOTROPY, 0, 0, ufbxi_mat_string("transmissionScatterAnisotropy") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_DISPERSION, 0, 0, ufbxi_mat_string("transmissionDispersion") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_EXTRA_ROUGHNESS, 0, 0, ufbxi_mat_string("transmissionExtraRoughness") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_FACTOR, 0, 0, ufbxi_mat_string("subsurface") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("subsurfaceColor") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_RADIUS, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("subsurfaceRadius") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_SCALE, 0, 0, ufbxi_mat_string("subsurfaceScale") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_ANISOTROPY, 0, 0, ufbxi_mat_string("subsurfaceAnisotropy") }, + { UFBX_MATERIAL_PBR_SHEEN_FACTOR, 0, 0, ufbxi_mat_string("sheen") }, + { UFBX_MATERIAL_PBR_SHEEN_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("sheenColor") }, + { UFBX_MATERIAL_PBR_SHEEN_ROUGHNESS, 0, 0, ufbxi_mat_string("sheenRoughness") }, + { UFBX_MATERIAL_PBR_COAT_FACTOR, 0, 0, ufbxi_mat_string("coat") }, + { UFBX_MATERIAL_PBR_COAT_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("coatColor") }, + { UFBX_MATERIAL_PBR_COAT_ROUGHNESS, 0, 0, ufbxi_mat_string("coatRoughness") }, + { UFBX_MATERIAL_PBR_COAT_IOR, 0, 0, ufbxi_mat_string("coatIOR") }, + { UFBX_MATERIAL_PBR_COAT_ANISOTROPY, 0, 0, ufbxi_mat_string("coatAnisotropy") }, + { UFBX_MATERIAL_PBR_COAT_ROTATION, 0, 0, ufbxi_mat_string("coatRotation") }, + { UFBX_MATERIAL_PBR_COAT_NORMAL, 0, 0, ufbxi_mat_string("coatNormal") }, + { UFBX_MATERIAL_PBR_THIN_FILM_THICKNESS, 0, 0, ufbxi_mat_string("thinFilmThickness") }, + { UFBX_MATERIAL_PBR_THIN_FILM_IOR, 0, 0, ufbxi_mat_string("thinFilmIOR") }, + { UFBX_MATERIAL_PBR_EMISSION_FACTOR, 0, 0, ufbxi_mat_string("emission") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("emissionColor") }, + { UFBX_MATERIAL_PBR_OPACITY, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("opacity") }, + { UFBX_MATERIAL_PBR_INDIRECT_DIFFUSE, 0, 0, ufbxi_mat_string("indirectDiffuse") }, + { UFBX_MATERIAL_PBR_INDIRECT_SPECULAR, 0, 0, ufbxi_mat_string("indirectSpecular") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("NormalMap") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("normalCamera") }, + { UFBX_MATERIAL_PBR_TANGENT_MAP, 0, 0, ufbxi_mat_string("tangent") }, + { UFBX_MATERIAL_PBR_MATTE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("aiMatteColor") }, + { UFBX_MATERIAL_PBR_MATTE_FACTOR, 0, 0, ufbxi_mat_string("aiMatteColorA") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_TYPE, 0, 0, ufbxi_mat_string("subsurfaceType") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_PRIORITY, 0, 0, ufbxi_mat_string("dielectricPriority") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_ENABLE_IN_AOV, 0, 0, ufbxi_mat_string("transmitAovs") }, +}; + +static const ufbxi_shader_mapping ufbxi_arnold_shader_features[] = { + { UFBX_MATERIAL_FEATURE_MATTE, 0, 0, ufbxi_mat_string("aiEnableMatte") }, + { UFBX_MATERIAL_FEATURE_THIN_WALLED, 0, 0, ufbxi_mat_string("thinWalled") }, + { UFBX_MATERIAL_FEATURE_CAUSTICS, 0, 0, ufbxi_mat_string("caustics") }, + { UFBX_MATERIAL_FEATURE_INTERNAL_REFLECTIONS, 0, 0, ufbxi_mat_string("internalReflections") }, + { UFBX_MATERIAL_FEATURE_EXIT_TO_BACKGROUND, 0, 0, ufbxi_mat_string("exitToBackground") }, +}; + +static const ufbxi_shader_mapping ufbxi_3ds_max_physical_material_pbr_mapping[] = { + { UFBX_MATERIAL_PBR_BASE_FACTOR, 0, 0, ufbxi_mat_string("base_weight") }, + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("base_color") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, 0, ufbxi_mat_string("roughness") }, + { UFBX_MATERIAL_PBR_DIFFUSE_ROUGHNESS, 0, 0, ufbxi_mat_string("diff_rough") }, + { UFBX_MATERIAL_PBR_DIFFUSE_ROUGHNESS, 0, 0, ufbxi_mat_string("diff_roughness") }, + { UFBX_MATERIAL_PBR_METALNESS, 0, 0, ufbxi_mat_string("metalness") }, + { UFBX_MATERIAL_PBR_SPECULAR_FACTOR, 0, 0, ufbxi_mat_string("reflectivity") }, + { UFBX_MATERIAL_PBR_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("refl_color") }, + { UFBX_MATERIAL_PBR_SPECULAR_ANISOTROPY, 0, 0, ufbxi_mat_string("anisotropy") }, + { UFBX_MATERIAL_PBR_SPECULAR_ROTATION, 0, 0, ufbxi_mat_string("aniso_angle") }, + { UFBX_MATERIAL_PBR_SPECULAR_ROTATION, 0, 0, ufbxi_mat_string("anisoangle") }, + { UFBX_MATERIAL_PBR_SPECULAR_IOR, 0, 0, ufbxi_mat_string("trans_ior") }, // NOTE: Not a typo, IOR is same for transparency/specular + { UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR, 0, 0, ufbxi_mat_string("transparency") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("trans_color") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_DEPTH, 0, 0, ufbxi_mat_string("trans_depth") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_ROUGHNESS, 0, 0, ufbxi_mat_string("trans_rough") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_ROUGHNESS, 0, 0, ufbxi_mat_string("trans_roughness") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_FACTOR, 0, 0, ufbxi_mat_string("scattering") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_TINT_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("sss_color") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("sss_scatter_color") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_RADIUS, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("sss_depth") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_SCALE, 0, 0, ufbxi_mat_string("sss_scale") }, + { UFBX_MATERIAL_PBR_COAT_FACTOR, 0, 0, ufbxi_mat_string("coat") }, + { UFBX_MATERIAL_PBR_COAT_FACTOR, 0, 0, ufbxi_mat_string("coating") }, + { UFBX_MATERIAL_PBR_COAT_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("coat_color") }, + { UFBX_MATERIAL_PBR_COAT_ROUGHNESS, 0, 0, ufbxi_mat_string("coat_rough") }, + { UFBX_MATERIAL_PBR_COAT_ROUGHNESS, 0, 0, ufbxi_mat_string("coat_roughness") }, + { UFBX_MATERIAL_PBR_COAT_IOR, 0, 0, ufbxi_mat_string("coat_ior") }, + { UFBX_MATERIAL_PBR_COAT_NORMAL, 0, 0, ufbxi_mat_string("coat_bump") }, + { UFBX_MATERIAL_PBR_COAT_NORMAL, 0, 0, ufbxi_mat_string("clearcoat_bump_map_amt") }, + { UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("coat_affect_color") }, + { UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_ROUGHNESS, 0, 0, ufbxi_mat_string("coat_affect_roughness") }, + { UFBX_MATERIAL_PBR_EMISSION_FACTOR, 0, 0, ufbxi_mat_string("emission") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("emit_color") }, + { UFBX_MATERIAL_PBR_OPACITY, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("cutout") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("bump") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("bump_map_amt") }, + { UFBX_MATERIAL_PBR_DISPLACEMENT_MAP, 0, 0, ufbxi_mat_string("displacement") }, + { UFBX_MATERIAL_PBR_DISPLACEMENT_MAP, 0, 0, ufbxi_mat_string("displacement_map_amt") }, + { UFBX_MATERIAL_PBR_SUBSURFACE_TYPE, 0, 0, ufbxi_mat_string("subsurfaceType") }, +}; + +static const ufbxi_shader_mapping ufbxi_3ds_max_physical_material_features[] = { + { UFBX_MATERIAL_FEATURE_THIN_WALLED, 0, 0, ufbxi_mat_string("thin_walled") }, + { UFBX_MATERIAL_FEATURE_SPECULAR, 0, 0, ufbxi_mat_string("material_mode") }, + { UFBX_MATERIAL_FEATURE_DIFFUSE_ROUGHNESS, 0, 0, ufbxi_mat_string("material_mode") }, + { UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS, UFBXI_SHADER_FEATURE_INVERTED, 0, ufbxi_mat_string("trans_roughness_lock") }, + { UFBX_MATERIAL_FEATURE_ROUGHNESS_AS_GLOSSINESS, 0, 0, ufbxi_mat_string("roughness_inv") }, + { UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS_AS_GLOSSINESS, 0, 0, ufbxi_mat_string("trans_roughness_inv") }, + { UFBX_MATERIAL_FEATURE_COAT_ROUGHNESS_AS_GLOSSINESS, 0, 0, ufbxi_mat_string("coat_roughness_inv") }, +}; + +static const ufbxi_shader_mapping ufbxi_gltf_material_pbr_mapping[] = { + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("main|baseColor") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, 0, ufbxi_mat_string("main|roughness") }, + { UFBX_MATERIAL_PBR_METALNESS, 0, 0, ufbxi_mat_string("main|metalness") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("main|normal") }, + { UFBX_MATERIAL_PBR_AMBIENT_OCCLUSION, 0, 0, ufbxi_mat_string("main|ambientOcclusion") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("main|emission") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("main|emissionColor") }, + { UFBX_MATERIAL_PBR_OPACITY, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("main|Alpha") }, + { UFBX_MATERIAL_PBR_COAT_FACTOR, 0, 0, ufbxi_mat_string("extension|clearcoat") }, + { UFBX_MATERIAL_PBR_COAT_ROUGHNESS, 0, 0, ufbxi_mat_string("extension|clearcoatRoughness") }, + { UFBX_MATERIAL_PBR_COAT_NORMAL, 0, 0, ufbxi_mat_string("extension|clearcoatNormal") }, + { UFBX_MATERIAL_PBR_SHEEN_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("extension|sheenColor") }, + { UFBX_MATERIAL_PBR_SHEEN_ROUGHNESS, 0, 0, ufbxi_mat_string("extension|sheenRoughness") }, + { UFBX_MATERIAL_PBR_SPECULAR_FACTOR, 0, 0, ufbxi_mat_string("extension|specular") }, + { UFBX_MATERIAL_PBR_SPECULAR_FACTOR, 0, 0, ufbxi_mat_string("extension|Specular") }, + { UFBX_MATERIAL_PBR_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("extension|specularcolor") }, + { UFBX_MATERIAL_PBR_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("extension|specularColor") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR, 0, 0, ufbxi_mat_string("extension|transmission") }, + { UFBX_MATERIAL_PBR_SPECULAR_IOR, 0, 0, ufbxi_mat_string("extension|indexOfRefraction") }, +}; + +static const ufbxi_shader_mapping ufbxi_3ds_max_pbr_metal_rough_pbr_mapping[] = { + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("base_color") }, + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("baseColor") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, 0, ufbxi_mat_string("roughness") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, 0, ufbxi_mat_string("Roughness_Map") }, + { UFBX_MATERIAL_PBR_METALNESS, 0, 0, ufbxi_mat_string("metalness") }, + { UFBX_MATERIAL_PBR_AMBIENT_OCCLUSION, 0, 0, ufbxi_mat_string("ao") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("norm") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("emit_color") }, + { UFBX_MATERIAL_PBR_DISPLACEMENT_MAP, 0, 0, ufbxi_mat_string("displacement") }, + { UFBX_MATERIAL_PBR_DISPLACEMENT_MAP, 0, 0, ufbxi_mat_string("displacement_amt") }, + { UFBX_MATERIAL_PBR_OPACITY, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("opacity") }, +}; + +static const ufbxi_shader_mapping ufbxi_3ds_max_pbr_spec_gloss_pbr_mapping[] = { + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("base_color") }, + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("baseColor") }, + { UFBX_MATERIAL_PBR_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("Specular") }, + { UFBX_MATERIAL_PBR_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("specular") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, 0, ufbxi_mat_string("glossiness") }, + { UFBX_MATERIAL_PBR_AMBIENT_OCCLUSION, 0, 0, ufbxi_mat_string("ao") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("norm") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("emit_color") }, + { UFBX_MATERIAL_PBR_DISPLACEMENT_MAP, 0, 0, ufbxi_mat_string("displacement") }, + { UFBX_MATERIAL_PBR_DISPLACEMENT_MAP, 0, 0, ufbxi_mat_string("displacement_amt") }, + { UFBX_MATERIAL_PBR_OPACITY, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("opacity") }, +}; + +static const ufbxi_shader_mapping ufbxi_3ds_max_pbr_features[] = { + { UFBX_MATERIAL_FEATURE_ROUGHNESS_AS_GLOSSINESS, UFBXI_SHADER_FEATURE_IF_AROUND_1, 0, ufbxi_mat_string("useGlossiness") }, +}; + +static const ufbxi_shader_mapping ufbxi_gltf_material_features[] = { + { UFBX_MATERIAL_FEATURE_DOUBLE_SIDED, 0, 0, ufbxi_mat_string("main|DoubleSided") }, + { UFBX_MATERIAL_FEATURE_SHEEN, 0, 0, ufbxi_mat_string("extension|enableSheen") }, + { UFBX_MATERIAL_FEATURE_COAT, 0, 0, ufbxi_mat_string("extension|enableClearCoat") }, + { UFBX_MATERIAL_FEATURE_TRANSMISSION, 0, 0, ufbxi_mat_string("extension|enableTransmission") }, + { UFBX_MATERIAL_FEATURE_IOR, 0, 0, ufbxi_mat_string("extension|enableIndexOfRefraction") }, + { UFBX_MATERIAL_FEATURE_SPECULAR, 0, 0, ufbxi_mat_string("extension|enableSpecular") }, + { UFBX_MATERIAL_FEATURE_UNLIT, 0, 0, ufbxi_mat_string("extension|unlit") }, +}; + +// NOTE: These are just the names used by the standard PBS "preset". +// In _theory_ we could walk ShaderGraph but that's a bit out of scope for ufbx. +static const ufbxi_shader_mapping ufbxi_shaderfx_graph_pbr_mapping[] = { + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("color") }, + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("base_color") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, 0, ufbxi_mat_string("roughness") }, + { UFBX_MATERIAL_PBR_METALNESS, 0, 0, ufbxi_mat_string("metallic") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("normal") }, + { UFBX_MATERIAL_PBR_EMISSION_FACTOR, 0, 0, ufbxi_mat_string("emissive_intensity") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("emissive") }, + { UFBX_MATERIAL_PBR_AMBIENT_OCCLUSION, 0, 0, ufbxi_mat_string("ao") }, +}; + +static const ufbxi_shader_mapping ufbxi_blender_phong_shader_pbr_mapping[] = { + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("DiffuseColor") }, + { UFBX_MATERIAL_PBR_OPACITY, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, UFBXI_MAT_TRANSFORM_BLENDER_OPACITY, ufbxi_mat_string("TransparencyFactor") }, + { UFBX_MATERIAL_PBR_EMISSION_FACTOR, 0, 0, ufbxi_mat_string("EmissiveFactor") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1, 0, ufbxi_mat_string("EmissiveColor") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, UFBXI_MAT_TRANSFORM_BLENDER_SHININESS, ufbxi_mat_string("Shininess") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, UFBXI_MAT_TRANSFORM_BLENDER_SHININESS, ufbxi_mat_string("ShininessExponent") }, + { UFBX_MATERIAL_PBR_METALNESS, 0, 0, ufbxi_mat_string("ReflectionFactor") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("NormalMap") }, +}; + +static const ufbxi_shader_mapping ufbxi_obj_pbr_mapping[] = { + { UFBX_MATERIAL_PBR_BASE_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1|UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("Kd") }, + { UFBX_MATERIAL_PBR_SPECULAR_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1|UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("Ks") }, + { UFBX_MATERIAL_PBR_EMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1|UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("Ke") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, UFBXI_MAT_TRANSFORM_UNKNOWN_SHININESS, ufbxi_mat_string("Ns") }, + { UFBX_MATERIAL_PBR_ROUGHNESS, 0, 0, ufbxi_mat_string("Pr") }, + { UFBX_MATERIAL_PBR_SPECULAR_IOR, 0, 0, ufbxi_mat_string("Ni") }, + { UFBX_MATERIAL_PBR_METALNESS, 0, 0, ufbxi_mat_string("Pm") }, + { UFBX_MATERIAL_PBR_OPACITY, UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("d") }, + { UFBX_MATERIAL_PBR_TRANSMISSION_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1|UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("Tf") }, + { UFBX_MATERIAL_PBR_DISPLACEMENT_MAP, 0, 0, ufbxi_mat_string("disp") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("bump") }, + { UFBX_MATERIAL_PBR_NORMAL_MAP, 0, 0, ufbxi_mat_string("norm") }, + { UFBX_MATERIAL_PBR_SHEEN_COLOR, UFBXI_SHADER_MAPPING_DEFAULT_W_1|UFBXI_SHADER_MAPPING_WIDEN_TO_RGB, 0, ufbxi_mat_string("Ps") }, + { UFBX_MATERIAL_PBR_COAT_FACTOR, 0, 0, ufbxi_mat_string("Pc") }, + { UFBX_MATERIAL_PBR_COAT_ROUGHNESS, 0, 0, ufbxi_mat_string("Pcr") }, + { UFBX_MATERIAL_PBR_SPECULAR_ANISOTROPY, 0, 0, ufbxi_mat_string("aniso") }, + { UFBX_MATERIAL_PBR_SPECULAR_ROTATION, 0, 0, ufbxi_mat_string("anisor") }, +}; + +static const ufbxi_shader_mapping ufbxi_obj_features[] = { + { UFBX_MATERIAL_FEATURE_PBR, UFBXI_SHADER_FEATURE_IF_EXISTS_OR_TEXTURE, 0, ufbxi_mat_string("Pr") }, + { UFBX_MATERIAL_FEATURE_PBR, UFBXI_SHADER_FEATURE_IF_EXISTS_OR_TEXTURE, 0, ufbxi_mat_string("Pm") }, + { UFBX_MATERIAL_FEATURE_SHEEN, UFBXI_SHADER_FEATURE_IF_EXISTS_OR_TEXTURE, 0, ufbxi_mat_string("Ps") }, + { UFBX_MATERIAL_FEATURE_COAT, UFBXI_SHADER_FEATURE_IF_EXISTS_OR_TEXTURE, 0, ufbxi_mat_string("Pc") }, + { UFBX_MATERIAL_FEATURE_METALNESS, UFBXI_SHADER_FEATURE_IF_EXISTS_OR_TEXTURE, 0, ufbxi_mat_string("Pm") }, + { UFBX_MATERIAL_FEATURE_IOR, UFBXI_SHADER_FEATURE_IF_EXISTS_OR_TEXTURE, 0, ufbxi_mat_string("Ni") }, + { UFBX_MATERIAL_FEATURE_OPACITY, UFBXI_SHADER_FEATURE_IF_EXISTS_OR_TEXTURE, 0, ufbxi_mat_string("d") }, + { UFBX_MATERIAL_FEATURE_TRANSMISSION, UFBXI_SHADER_FEATURE_IF_EXISTS_OR_TEXTURE, 0, ufbxi_mat_string("Tf") }, + { UFBX_MATERIAL_FEATURE_EMISSION, UFBXI_SHADER_FEATURE_IF_EXISTS_OR_TEXTURE, 0, ufbxi_mat_string("Ke") }, +}; + +enum { + UFBXI_MAT_PBR = 1 << UFBX_MATERIAL_FEATURE_PBR, + UFBXI_MAT_METALNESS = 1 << UFBX_MATERIAL_FEATURE_METALNESS, + UFBXI_MAT_DIFFUSE = 1 << UFBX_MATERIAL_FEATURE_DIFFUSE, + UFBXI_MAT_SPECULAR = 1 << UFBX_MATERIAL_FEATURE_SPECULAR, + UFBXI_MAT_EMISSION = 1 << UFBX_MATERIAL_FEATURE_EMISSION, + UFBXI_MAT_COAT = 1 << UFBX_MATERIAL_FEATURE_COAT, + UFBXI_MAT_SHEEN = 1 << UFBX_MATERIAL_FEATURE_SHEEN, + UFBXI_MAT_TRANSMISSION = 1 << UFBX_MATERIAL_FEATURE_TRANSMISSION, + UFBXI_MAT_OPACITY = 1 << UFBX_MATERIAL_FEATURE_OPACITY, + UFBXI_MAT_AMBIENT_OCCLUSION = 1 << UFBX_MATERIAL_FEATURE_AMBIENT_OCCLUSION, + UFBXI_MAT_MATTE = 1 << UFBX_MATERIAL_FEATURE_MATTE, + UFBXI_MAT_UNLIT = 1 << UFBX_MATERIAL_FEATURE_UNLIT, + UFBXI_MAT_IOR = 1 << UFBX_MATERIAL_FEATURE_IOR, + UFBXI_MAT_DIFFUSE_ROUGHNESS = 1 << UFBX_MATERIAL_FEATURE_DIFFUSE_ROUGHNESS, + UFBXI_MAT_TRANSMISSION_ROUGHNESS = 1 << UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS, + UFBXI_MAT_THIN_WALLED = 1 << UFBX_MATERIAL_FEATURE_THIN_WALLED, + UFBXI_MAT_CAUSTICS = 1 << UFBX_MATERIAL_FEATURE_CAUSTICS, + UFBXI_MAT_EXIT_TO_BACKGROUND = 1 << UFBX_MATERIAL_FEATURE_EXIT_TO_BACKGROUND, + UFBXI_MAT_INTERNAL_REFLECTIONS = 1 << UFBX_MATERIAL_FEATURE_INTERNAL_REFLECTIONS, + UFBXI_MAT_DOUBLE_SIDED = 1 << UFBX_MATERIAL_FEATURE_DOUBLE_SIDED, +}; + +static const ufbxi_shader_mapping_list ufbxi_shader_pbr_mappings[] = { + { // UFBX_SHADER_UNKNOWN + ufbxi_fbx_phong_shader_pbr_mapping, ufbxi_arraycount(ufbxi_fbx_phong_shader_pbr_mapping), + NULL, 0, + (uint32_t)(UFBXI_MAT_DIFFUSE | UFBXI_MAT_SPECULAR | UFBXI_MAT_EMISSION | UFBXI_MAT_TRANSMISSION), + }, + { // UFBX_SHADER_FBX_LAMBERT + ufbxi_fbx_lambert_shader_pbr_mapping, ufbxi_arraycount(ufbxi_fbx_lambert_shader_pbr_mapping), + NULL, 0, + (uint32_t)(UFBXI_MAT_DIFFUSE | UFBXI_MAT_EMISSION | UFBXI_MAT_TRANSMISSION), + }, + { // UFBX_SHADER_FBX_PHONG + ufbxi_fbx_phong_shader_pbr_mapping, ufbxi_arraycount(ufbxi_fbx_phong_shader_pbr_mapping), + NULL, 0, + (uint32_t)(UFBXI_MAT_DIFFUSE | UFBXI_MAT_SPECULAR | UFBXI_MAT_EMISSION | UFBXI_MAT_TRANSMISSION), + }, + { // UFBX_SHADER_OSL_STANDARD_SURFACE + ufbxi_osl_standard_shader_pbr_mapping, ufbxi_arraycount(ufbxi_osl_standard_shader_pbr_mapping), + ufbxi_osl_standard_shader_features, ufbxi_arraycount(ufbxi_osl_standard_shader_features), + (uint32_t)(UFBXI_MAT_PBR | UFBXI_MAT_METALNESS | UFBXI_MAT_DIFFUSE | UFBXI_MAT_SPECULAR | UFBXI_MAT_COAT + | UFBXI_MAT_SHEEN | UFBXI_MAT_TRANSMISSION | UFBXI_MAT_OPACITY | UFBXI_MAT_IOR | UFBXI_MAT_DIFFUSE_ROUGHNESS), + }, + { // UFBX_SHADER_ARNOLD_STANDARD_SURFACE + ufbxi_arnold_shader_pbr_mapping, ufbxi_arraycount(ufbxi_arnold_shader_pbr_mapping), + ufbxi_arnold_shader_features, ufbxi_arraycount(ufbxi_arnold_shader_features), + (uint32_t)(UFBXI_MAT_PBR | UFBXI_MAT_METALNESS | UFBXI_MAT_DIFFUSE | UFBXI_MAT_SPECULAR | UFBXI_MAT_COAT + | UFBXI_MAT_SHEEN | UFBXI_MAT_TRANSMISSION | UFBXI_MAT_OPACITY | UFBXI_MAT_IOR | UFBXI_MAT_DIFFUSE_ROUGHNESS), + }, + { // UFBX_SHADER_3DS_MAX_PHYSICAL_MATERIAL + ufbxi_3ds_max_physical_material_pbr_mapping, ufbxi_arraycount(ufbxi_3ds_max_physical_material_pbr_mapping), + ufbxi_3ds_max_physical_material_features, ufbxi_arraycount(ufbxi_3ds_max_physical_material_features), + (uint32_t)(UFBXI_MAT_PBR | UFBXI_MAT_METALNESS | UFBXI_MAT_DIFFUSE | UFBXI_MAT_COAT + | UFBXI_MAT_SHEEN | UFBXI_MAT_TRANSMISSION | UFBXI_MAT_OPACITY | UFBXI_MAT_IOR), + { NULL, 0 }, ufbxi_string_literal("_map"), // texture_prefix/suffix + { NULL, 0 }, ufbxi_string_literal("_map_on"), // texture_enabled_prefix/suffix + }, + { // UFBX_SHADER_3DS_MAX_PBR_METAL_ROUGH + ufbxi_3ds_max_pbr_metal_rough_pbr_mapping, ufbxi_arraycount(ufbxi_3ds_max_pbr_metal_rough_pbr_mapping), + ufbxi_3ds_max_pbr_features, ufbxi_arraycount(ufbxi_3ds_max_pbr_features), + (uint32_t)(UFBXI_MAT_PBR | UFBXI_MAT_METALNESS | UFBXI_MAT_DIFFUSE | UFBXI_MAT_OPACITY), + { NULL, 0 }, ufbxi_string_literal("_map"), // texture_prefix/suffix + { NULL, 0 }, { NULL, 0 }, // texture_enabled_prefix/suffix + }, + { // UFBX_SHADER_3DS_MAX_PBR_SPEC_GLOSS + ufbxi_3ds_max_pbr_spec_gloss_pbr_mapping, ufbxi_arraycount(ufbxi_3ds_max_pbr_spec_gloss_pbr_mapping), + ufbxi_3ds_max_pbr_features, ufbxi_arraycount(ufbxi_3ds_max_pbr_features), + (uint32_t)(UFBXI_MAT_PBR | UFBXI_MAT_SPECULAR | UFBXI_MAT_DIFFUSE | UFBXI_MAT_OPACITY), + { NULL, 0 }, ufbxi_string_literal("_map"), // texture_prefix/suffix + { NULL, 0 }, { NULL, 0 }, // texture_enabled_prefix/suffix + }, + { // UFBX_SHADER_GLTF_MATERIAL + ufbxi_gltf_material_pbr_mapping, ufbxi_arraycount(ufbxi_gltf_material_pbr_mapping), + ufbxi_gltf_material_features, ufbxi_arraycount(ufbxi_gltf_material_features), + (uint32_t)(UFBXI_MAT_PBR | UFBXI_MAT_METALNESS | UFBXI_MAT_DIFFUSE | UFBXI_MAT_EMISSION | UFBXI_MAT_OPACITY | UFBXI_MAT_AMBIENT_OCCLUSION), + { NULL, 0 }, ufbxi_string_literal("Map"), // texture_prefix/suffix + { NULL, 0 }, { NULL, 0 }, // texture_enabled_prefix/suffix + }, + { // UFBX_SHADER_SHADERFX_GRAPH + ufbxi_shaderfx_graph_pbr_mapping, ufbxi_arraycount(ufbxi_shaderfx_graph_pbr_mapping), + NULL, 0, + (uint32_t)(UFBXI_MAT_PBR | UFBXI_MAT_METALNESS | UFBXI_MAT_DIFFUSE | UFBXI_MAT_EMISSION | UFBXI_MAT_AMBIENT_OCCLUSION), + ufbxi_string_literal("TEX_"), ufbxi_string_literal("_map"), // texture_prefix/suffix + ufbxi_string_literal("use_"), ufbxi_string_literal("_map"), // texture_enabled_prefix/suffix + }, + { // UFBX_SHADER_BLENDER_PHONG + ufbxi_blender_phong_shader_pbr_mapping, ufbxi_arraycount(ufbxi_blender_phong_shader_pbr_mapping), + NULL, 0, + (uint32_t)(UFBXI_MAT_PBR | UFBXI_MAT_METALNESS | UFBXI_MAT_DIFFUSE | UFBXI_MAT_EMISSION), + }, + { // UFBX_SHADER_WAVEFRONT_MTL + ufbxi_obj_pbr_mapping, ufbxi_arraycount(ufbxi_obj_pbr_mapping), + ufbxi_obj_features, ufbxi_arraycount(ufbxi_obj_features), + (uint32_t)(UFBXI_MAT_DIFFUSE | UFBXI_MAT_SPECULAR), + }, +}; + +ufbx_static_assert(shader_pbr_mapping_list, ufbxi_arraycount(ufbxi_shader_pbr_mappings) == UFBX_SHADER_TYPE_COUNT); + +enum { + UFBXI_MAPPING_FETCH_VALUE = 0x1, + UFBXI_MAPPING_FETCH_TEXTURE = 0x2, + UFBXI_MAPPING_FETCH_TEXTURE_ENABLED = 0x4, + UFBXI_MAPPING_FETCH_FEATURE = 0x8, +}; + +ufbxi_noinline static void ufbxi_fetch_mapping_maps(ufbx_material *material, ufbx_material_map *maps, ufbx_material_feature_info *features, + ufbx_shader *shader, const ufbxi_shader_mapping *mappings, size_t count, ufbx_string prefix, ufbx_string prefix2, ufbx_string suffix, uint32_t flags) +{ + char combined_name[512]; + ufbx_shader_prop_binding identity_binding; + + ufbxi_for(const ufbxi_shader_mapping, mapping, mappings, count) { + ufbx_string prop_name = { mapping->prop, mapping->prop_len }; + if (prefix.length > 0 || prefix2.length > 0 || suffix.length > 0) { + if (prop_name.length + prefix.length + prefix2.length + suffix.length <= sizeof(combined_name)) { + char *dst = combined_name; + + if (prefix.length > 0) { + memcpy(dst, prefix.data, prefix.length); + dst += prefix.length; + } + if (prefix2.length > 0) { + memcpy(dst, prefix2.data, prefix2.length); + dst += prefix2.length; + } + if (prop_name.length > 0) { + memcpy(dst, prop_name.data, prop_name.length); + dst += prop_name.length; + } + if (suffix.length > 0) { + memcpy(dst, suffix.data, suffix.length); + dst += suffix.length; + } + + prop_name.data = combined_name; + prop_name.length = ufbxi_to_size(dst - combined_name); + } + } + + ufbx_shader_prop_binding_list bindings = ufbx_find_shader_prop_bindings_len(shader, prop_name.data, prop_name.length); + if (bindings.count == 0) { + identity_binding.material_prop = prop_name; + identity_binding.shader_prop = ufbx_empty_string; + bindings.data = &identity_binding; + bindings.count = 1; + } + + uint32_t mapping_flags = mapping->flags; + ufbxi_for_list(ufbx_shader_prop_binding, binding, bindings) { + ufbx_string name = binding->material_prop; + + ufbx_prop *prop = ufbx_find_prop_len(&material->props, name.data, name.length); + if (flags & UFBXI_MAPPING_FETCH_FEATURE) { + ufbx_material_feature_info *feature = &features[mapping->index]; + if (prop && prop->type != UFBX_PROP_REFERENCE) { + feature->enabled = prop->value_int != 0; + feature->is_explicit = true; + if (mapping_flags & UFBXI_SHADER_FEATURE_IF_AROUND_1) { + feature->enabled = (prop->value_real >= 0.5f && prop->value_real <= 1.5f); + } + if (mapping_flags & UFBXI_SHADER_FEATURE_INVERTED) { + feature->enabled = !feature->enabled; + } + if (mapping_flags & UFBXI_SHADER_FEATURE_IF_EXISTS) { + feature->enabled = true; + } + } + if (mapping_flags & UFBXI_SHADER_FEATURE_IF_TEXTURE) { + ufbx_texture *texture = ufbx_find_prop_texture_len(material, name.data, name.length); + if (texture) { + feature->enabled = true; + } + } + continue; + } + + ufbx_material_map *map = &maps[mapping->index]; + + if (flags & UFBXI_MAPPING_FETCH_VALUE) { + if (prop && prop->type != UFBX_PROP_REFERENCE) { + map->value_vec4 = prop->value_vec4; + map->value_int = prop->value_int; + map->has_value = true; + if (mapping->transform) { + ufbxi_mat_transform_fn transform_fn = ufbxi_mat_transform_fns[mapping->transform]; + transform_fn(&map->value_vec4); + } + + uint32_t prop_flags = (uint32_t)prop->flags; + if ((mapping->flags & UFBXI_SHADER_MAPPING_DEFAULT_W_1) != 0 && (prop_flags & UFBX_PROP_FLAG_VALUE_VEC4) == 0) { + map->value_vec4.w = 1.0f; + } + if ((mapping->flags & UFBXI_SHADER_MAPPING_WIDEN_TO_RGB) != 0 && (prop_flags & UFBX_PROP_FLAG_VALUE_REAL) != 0) { + map->value_vec3.y = map->value_vec3.x; + map->value_vec3.z = map->value_vec3.x; + } + if ((prop_flags & UFBX_PROP_FLAG_VALUE_REAL) != 0) { + map->value_components = 1; + } else if ((prop_flags & UFBX_PROP_FLAG_VALUE_VEC2) != 0) { + map->value_components = 2; + } else if ((prop_flags & UFBX_PROP_FLAG_VALUE_VEC3) != 0) { + map->value_components = 3; + } else if ((prop_flags & UFBX_PROP_FLAG_VALUE_VEC4) != 0) { + map->value_components = 4; + } else { + map->value_components = 0; + } + } + } + + if (flags & UFBXI_MAPPING_FETCH_TEXTURE) { + ufbx_texture *texture = ufbx_find_prop_texture_len(material, name.data, name.length); + if (texture) { + map->texture = texture; + map->texture_enabled = true; + } + } + + if (flags & UFBXI_MAPPING_FETCH_TEXTURE_ENABLED) { + if (prop) { + map->texture_enabled = prop->value_int != 0; + } + } + } + } +} + +ufbxi_noinline static void ufbxi_update_factor(ufbx_material_map *factor_map, ufbx_material_map *color_map) +{ + if (!factor_map->has_value) { + if (color_map->has_value && !ufbxi_is_vec4_zero(color_map->value_vec4)) { + factor_map->value_real = 1.0f; + factor_map->value_int = 1; + } else { + factor_map->value_real = 0.0f; + factor_map->value_int = 0; + } + } +} + +// Some material modes have toggleable roughness/glossiness mode, we read it initially +// always as roughness and if a matching feature such as `roughness_as_glossiness` is set +// we transfer the data into the glossiness and invert the roughness. +typedef struct { + uint8_t feature; + uint8_t roughness_map; + uint8_t glossiness_map; +} ufbxi_glossiness_remap; + +static const ufbxi_glossiness_remap ufbxi_glossiness_remaps[] = { + { UFBX_MATERIAL_FEATURE_ROUGHNESS_AS_GLOSSINESS, UFBX_MATERIAL_PBR_ROUGHNESS, UFBX_MATERIAL_PBR_GLOSSINESS }, + { UFBX_MATERIAL_FEATURE_COAT_ROUGHNESS_AS_GLOSSINESS, UFBX_MATERIAL_PBR_COAT_ROUGHNESS, UFBX_MATERIAL_PBR_COAT_GLOSSINESS }, + { UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS_AS_GLOSSINESS, UFBX_MATERIAL_PBR_TRANSMISSION_ROUGHNESS, UFBX_MATERIAL_PBR_TRANSMISSION_GLOSSINESS }, +}; + +ufbxi_noinline static void ufbxi_fetch_maps(ufbx_scene *scene, ufbx_material *material) +{ + (void)scene; + + ufbx_shader *shader = material->shader; + ufbx_assert((uint32_t)material->shader_type < UFBX_SHADER_TYPE_COUNT); + + memset(&material->fbx, 0, sizeof(material->fbx)); + memset(&material->pbr, 0, sizeof(material->pbr)); + memset(&material->features, 0, sizeof(material->features)); + + const ufbxi_shader_mapping *base_mapping = ufbxi_base_fbx_mapping; + size_t num_base_mapping = ufbxi_arraycount(ufbxi_base_fbx_mapping); + + if (scene->metadata.file_format == UFBX_FILE_FORMAT_OBJ || scene->metadata.file_format == UFBX_FILE_FORMAT_MTL) { + base_mapping = ufbxi_obj_fbx_mapping; + num_base_mapping = ufbxi_arraycount(ufbxi_obj_fbx_mapping); + } + + ufbxi_fetch_mapping_maps(material, material->fbx.maps, NULL, NULL, + base_mapping, num_base_mapping, + ufbx_empty_string, ufbx_empty_string, ufbx_empty_string, + UFBXI_MAPPING_FETCH_VALUE | UFBXI_MAPPING_FETCH_TEXTURE); + + ufbxi_shader_mapping_list list = ufbxi_shader_pbr_mappings[material->shader_type]; + + for (uint32_t i = 0; i < UFBX_MATERIAL_FEATURE_COUNT; i++) { + if ((list.default_features & (1u << i)) != 0) { + material->features.features[i].enabled = true; + } + } + + ufbx_string prefix = ufbx_empty_string; + if (!shader) { + prefix = material->shader_prop_prefix; + } + + if (list.texture_prefix.length > 0 || list.texture_suffix.length > 0) { + ufbxi_fetch_mapping_maps(material, material->pbr.maps, NULL, shader, + list.data, list.count, prefix, list.texture_prefix, list.texture_suffix, + UFBXI_MAPPING_FETCH_TEXTURE); + } + + ufbxi_fetch_mapping_maps(material, material->pbr.maps, NULL, shader, + list.data, list.count, prefix, ufbx_empty_string, ufbx_empty_string, + UFBXI_MAPPING_FETCH_VALUE | UFBXI_MAPPING_FETCH_TEXTURE); + + if (list.texture_enabled_prefix.length > 0 || list.texture_enabled_suffix.length > 0) { + ufbxi_fetch_mapping_maps(material, material->pbr.maps, NULL, shader, + list.data, list.count, prefix, list.texture_enabled_prefix, list.texture_enabled_suffix, + UFBXI_MAPPING_FETCH_TEXTURE_ENABLED); + } + + ufbxi_fetch_mapping_maps(material, NULL, material->features.features, shader, + list.features, list.feature_count, prefix, ufbx_empty_string, ufbx_empty_string, + UFBXI_MAPPING_FETCH_FEATURE); + + ufbxi_update_factor(&material->fbx.diffuse_factor, &material->fbx.diffuse_color); + ufbxi_update_factor(&material->fbx.specular_factor, &material->fbx.specular_color); + ufbxi_update_factor(&material->fbx.reflection_factor, &material->fbx.reflection_color); + ufbxi_update_factor(&material->fbx.transparency_factor, &material->fbx.transparency_color); + ufbxi_update_factor(&material->fbx.emission_factor, &material->fbx.emission_color); + ufbxi_update_factor(&material->fbx.ambient_factor, &material->fbx.ambient_color); + + ufbxi_update_factor(&material->pbr.base_factor, &material->pbr.base_color); + ufbxi_update_factor(&material->pbr.specular_factor, &material->pbr.specular_color); + ufbxi_update_factor(&material->pbr.emission_factor, &material->pbr.emission_color); + ufbxi_update_factor(&material->pbr.sheen_factor, &material->pbr.sheen_color); + ufbxi_update_factor(&material->pbr.transmission_factor, &material->pbr.transmission_color); + + // Patch transmission roughness if only extra roughness is defined + if (!material->pbr.transmission_roughness.has_value && material->pbr.roughness.has_value && material->pbr.transmission_extra_roughness.has_value) { + material->pbr.transmission_roughness.value_real = material->pbr.roughness.value_real + material->pbr.transmission_extra_roughness.value_real; + } + + // Map roughness to glossiness and vice versa + ufbxi_for(const ufbxi_glossiness_remap, remap, ufbxi_glossiness_remaps, ufbxi_arraycount(ufbxi_glossiness_remaps)) { + ufbx_material_map *roughness = &material->pbr.maps[remap->roughness_map]; + ufbx_material_map *glossiness = &material->pbr.maps[remap->glossiness_map]; + if (material->features.features[remap->feature].enabled) { + *glossiness = *roughness; + memset(roughness, 0, sizeof(ufbx_material_map)); + if (glossiness->has_value) { + roughness->value_real = 1.0f - glossiness->value_real; + } + } else { + if (roughness->has_value) { + glossiness->value_real = 1.0f - roughness->value_real; + } + } + } +} + +typedef enum { + UFBXI_CONSTRAINT_PROP_NODE, + UFBXI_CONSTRAINT_PROP_IK_EFFECTOR, + UFBXI_CONSTRAINT_PROP_IK_END_NODE, + UFBXI_CONSTRAINT_PROP_AIM_UP, + UFBXI_CONSTRAINT_PROP_TARGET, +} ufbxi_constraint_prop_type; + +typedef struct { + ufbxi_constraint_prop_type type; + const char *name; +} ufbxi_constraint_prop; + +static const ufbxi_constraint_prop ufbxi_constraint_props[] = { + { UFBXI_CONSTRAINT_PROP_NODE, "Constrained Object" }, + { UFBXI_CONSTRAINT_PROP_NODE, "Constrained object (Child)" }, + { UFBXI_CONSTRAINT_PROP_NODE, "First Joint" }, + { UFBXI_CONSTRAINT_PROP_TARGET, "Source" }, + { UFBXI_CONSTRAINT_PROP_TARGET, "Source (Parent)" }, + { UFBXI_CONSTRAINT_PROP_TARGET, "Aim At Object" }, + { UFBXI_CONSTRAINT_PROP_TARGET, "Pole Vector Object" }, + { UFBXI_CONSTRAINT_PROP_IK_EFFECTOR, "Effector" }, + { UFBXI_CONSTRAINT_PROP_IK_END_NODE, "End Joint" }, + { UFBXI_CONSTRAINT_PROP_AIM_UP, "World Up Object" }, +}; + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_add_constraint_prop(ufbxi_context *uc, ufbx_constraint *constraint, ufbx_node *node, const char *prop) +{ + ufbxi_for(const ufbxi_constraint_prop, cprop, ufbxi_constraint_props, ufbxi_arraycount(ufbxi_constraint_props)) { + if (strcmp(cprop->name, prop) != 0) continue; + switch (cprop->type) { + case UFBXI_CONSTRAINT_PROP_NODE: constraint->node = node; break; + case UFBXI_CONSTRAINT_PROP_IK_EFFECTOR: constraint->ik_effector = node; break; + case UFBXI_CONSTRAINT_PROP_IK_END_NODE: constraint->ik_end_node = node; break; + case UFBXI_CONSTRAINT_PROP_AIM_UP: constraint->aim_up_node = node; break; + case UFBXI_CONSTRAINT_PROP_TARGET: { + ufbx_constraint_target *target = ufbxi_push_zero(&uc->tmp_stack, ufbx_constraint_target, 1); + ufbxi_check(target); + target->node = node; + target->weight = 1.0f; + target->transform = ufbx_identity_transform; + } break; + } + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_finalize_nurbs_basis(ufbxi_context *uc, ufbx_nurbs_basis *basis) +{ + if (basis->topology == UFBX_NURBS_TOPOLOGY_CLOSED) { + basis->num_wrap_control_points = 1; + } else if (basis->topology == UFBX_NURBS_TOPOLOGY_PERIODIC) { + basis->num_wrap_control_points = basis->order - 1; + } else { + basis->num_wrap_control_points = 0; + } + + if (basis->order > 1) { + size_t degree = basis->order - 1; + ufbx_real_list knots = basis->knot_vector; + if (knots.count >= 2*degree + 1) { + basis->t_min = knots.data[degree]; + basis->t_max = knots.data[knots.count - degree - 1]; + + size_t max_spans = knots.count - 2*degree; + ufbx_real *spans = ufbxi_push(&uc->result, ufbx_real, max_spans); + ufbxi_check(spans); + + ufbx_real prev = -UFBX_INFINITY; + size_t num_spans = 0; + for (size_t i = 0; i < max_spans; i++) { + ufbx_real t = knots.data[degree + i]; + if (t != prev) { + spans[num_spans++] = t; + prev = t; + } + } + + basis->spans.data = spans; + basis->spans.count = num_spans; + basis->valid = true; + for (size_t i = 1; i < knots.count; i++) { + if (knots.data[i - 1] > knots.data[i]) { + basis->valid = false; + break; + } + } + } + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_finalize_lod_group(ufbxi_context *uc, ufbx_lod_group *lod) +{ + size_t num_levels = 0; + for (size_t i = 0; i < lod->instances.count; i++) { + num_levels = ufbxi_max_sz(num_levels, lod->instances.data[0]->children.count); + } + + char prop_name[64]; + for (size_t i = 0; ; i++) { + int len = ufbxi_snprintf(prop_name, sizeof(prop_name), "Thresholds|Level%zu", i); + ufbx_prop *prop = ufbx_find_prop_len(&lod->props, prop_name, (size_t)len); + if (!prop) break; + num_levels = ufbxi_max_sz(num_levels, i + 1); + } + + ufbx_lod_level *levels = ufbxi_push_zero(&uc->result, ufbx_lod_level, num_levels); + ufbxi_check(levels); + + lod->relative_distances = ufbx_find_bool(&lod->props, "ThresholdsUsedAsPercentage", false); + lod->ignore_parent_transform = !ufbx_find_bool(&lod->props, "WorldSpace", true); + + lod->use_distance_limit = ufbx_find_bool(&lod->props, "MinMaxDistance", false); + lod->distance_limit_min = ufbx_find_real(&lod->props, "MinDistance", (ufbx_real)-100.0); + lod->distance_limit_max = ufbx_find_real(&lod->props, "MaxDistance", (ufbx_real)100.0); + + lod->lod_levels.data = levels; + lod->lod_levels.count = num_levels; + + for (size_t i = 0; i < num_levels; i++) { + ufbx_lod_level *level = &levels[i]; + + if (i > 0) { + int len = ufbxi_snprintf(prop_name, sizeof(prop_name), "Thresholds|Level%zu", i - 1); + level->distance = ufbx_find_real_len(&lod->props, prop_name, (size_t)len, 0.0f); + } else if (lod->relative_distances) { + level->distance = (ufbx_real)100.0; + } + + { + int len = ufbxi_snprintf(prop_name, sizeof(prop_name), "DisplayLevels|Level%zu", i); + int64_t display = ufbx_find_int_len(&lod->props, prop_name, (size_t)len, 0); + if (display >= 0 && display <= 2) { + level->display = (ufbx_lod_display)display; + } + } + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_generate_normals(ufbxi_context *uc, ufbx_mesh *mesh) +{ + size_t num_indices = mesh->num_indices; + + mesh->generated_normals = true; + + ufbx_topo_edge *topo = ufbxi_push(&uc->tmp_stack, ufbx_topo_edge, num_indices); + ufbxi_check(topo); + + uint32_t *normal_indices = ufbxi_push(&uc->result, uint32_t, num_indices); + ufbxi_check(normal_indices); + + ufbx_compute_topology(mesh, topo, num_indices); + size_t num_normals = ufbx_generate_normal_mapping(mesh, topo, num_indices, normal_indices, num_indices, false); + + if (num_normals == mesh->num_vertices) { + mesh->vertex_normal.unique_per_vertex = true; + } + + ufbx_vec3 *normal_data = ufbxi_push(&uc->result, ufbx_vec3, num_normals + 1); + ufbxi_check(normal_data); + + normal_data[0] = ufbx_zero_vec3; + normal_data++; + + ufbx_compute_normals(mesh, &mesh->vertex_position, normal_indices, num_indices, normal_data, num_normals); + + mesh->vertex_normal.exists = true; + mesh->vertex_normal.values.data = normal_data; + mesh->vertex_normal.values.count = num_normals; + mesh->vertex_normal.indices.data = normal_indices; + mesh->vertex_normal.indices.count = num_indices; + mesh->vertex_normal.value_reals = 3; + + mesh->skinned_normal = mesh->vertex_normal; + + ufbxi_pop(&uc->tmp_stack, ufbx_topo_edge, num_indices, NULL); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_push_prop_prefix(ufbxi_context *uc, ufbx_string *dst, ufbx_string prefix) +{ + size_t stack_size = 0; + if (prefix.length > 0 && prefix.data[prefix.length - 1] != '|') { + stack_size = prefix.length + 1; + char *copy = ufbxi_push(&uc->tmp_stack, char, stack_size); + ufbxi_check(copy); + memcpy(copy, prefix.data, prefix.length); + copy[prefix.length] = '|'; + + prefix.data = copy; + prefix.length += 1; + } + + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &prefix, false)); + *dst = prefix; + + if (stack_size > 0) { + ufbxi_pop(&uc->tmp_stack, char, stack_size, NULL); + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_shader_texture_find_prefix(ufbxi_context *uc, ufbx_texture *texture, ufbx_shader_texture *shader) +{ + ufbx_string suffixes[3]; + size_t num_suffixes = 0; + + suffixes[num_suffixes++] = ufbxi_str_c(" Parameters/Connections"); + if (shader->shader_name.length > 0) { + suffixes[num_suffixes++] = shader->shader_name; + } + suffixes[num_suffixes++] = ufbxi_str_c("3dsMax|parameters"); + + ufbx_assert(num_suffixes <= ufbxi_arraycount(suffixes)); + + ufbxi_for(ufbx_string, p_suffix, suffixes, num_suffixes) { + ufbx_string suffix = *p_suffix; + + ufbxi_for_list(ufbx_prop, prop, texture->props.props) { + if (prop->type != UFBX_PROP_COMPOUND) continue; + if (ufbxi_ends_with(prop->name, suffix)) { + ufbxi_check(ufbxi_push_prop_prefix(uc, &shader->prop_prefix, prop->name)); + return 1; + } + } + } + + // Pre-7000 files don't have explicit Compound properties, so let's look for + // any property that has the suffix before the last `|` ... + ufbxi_for(ufbx_string, p_suffix, suffixes, num_suffixes) { + ufbx_string suffix = *p_suffix; + + ufbxi_for_list(ufbx_prop, prop, texture->props.props) { + ufbx_string name = prop->name; + while (name.length > 0) { + if (name.data[name.length - 1] == '|') { + break; + } + name.length--; + } + if (name.length <= 1) continue; + name.length--; + + if (ufbxi_ends_with(name, suffix)) { + ufbxi_check(ufbxi_push_prop_prefix(uc, &shader->prop_prefix, name)); + return 1; + } + } + } + + return 1; +} + +typedef struct { + uint64_t shader_id; + const char *shader_name; + const char *input_name; +} ufbxi_file_shader; + +// Known shaders that represent sampled images. +static const ufbxi_file_shader ufbxi_file_shaders[] = { + { UINT64_C(0x7e73161fad53b12a), "ai_image", "filename" }, + { 0, "OSLBitmap", ufbxi_Filename }, + { 0, "OSLBitmap2", ufbxi_Filename }, + { 0, "UberBitmap", ufbxi_Filename }, + { 0, "UberBitmap2", ufbxi_Filename }, +}; + +ufbxi_noinline static void ufbxi_update_shader_texture(ufbx_texture *texture, ufbx_shader_texture *shader) +{ + ufbxi_for_list(ufbx_shader_texture_input, input, shader->inputs) { + ufbx_prop *prop = input->prop; + if (prop) { + input->prop = prop = ufbx_find_prop_len(&texture->props, prop->name.data, prop->name.length); + input->value_vec4 = prop->value_vec4; + input->value_int = prop->value_int; + input->value_str = prop->value_str; + input->value_blob = prop->value_blob; + input->texture = (ufbx_texture*)ufbx_get_prop_element(&texture->element, input->prop, UFBX_ELEMENT_TEXTURE); + } + + prop = input->texture_prop; + if (prop) { + input->texture_prop = prop = ufbx_find_prop_len(&texture->props, prop->name.data, prop->name.length); + ufbx_texture *tex = (ufbx_texture*)ufbx_get_prop_element(&texture->element, prop, UFBX_ELEMENT_TEXTURE); + if (tex) input->texture = tex; + } + + input->texture_enabled = input->texture != NULL; + prop = input->texture_enabled_prop; + if (prop) { + input->texture_enabled_prop = prop = ufbx_find_prop_len(&texture->props, prop->name.data, prop->name.length); + input->texture_enabled = prop->value_int != 0; + } + } + + if (shader->type == UFBX_SHADER_TEXTURE_SELECT_OUTPUT) { + ufbx_shader_texture_input *map = ufbx_find_shader_texture_input(shader, "sourceMap"); + ufbx_shader_texture_input *index = ufbx_find_shader_texture_input(shader, "outputChannelIndex"); + if (index) { + shader->main_texture_output_index = index->value_int; + } + if (map) { + shader->main_texture = map->texture; + map->texture_output_index = shader->main_texture_output_index; + } + } +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_finalize_shader_texture(ufbxi_context *uc, ufbx_texture *texture) +{ + uint32_t classid_a = (uint32_t)(uint64_t)ufbx_find_int(&texture->props, "3dsMax|ClassIDa", 0); + uint32_t classid_b = (uint32_t)(uint64_t)ufbx_find_int(&texture->props, "3dsMax|ClassIDb", 0); + uint64_t classid = (uint64_t)classid_a << 32u | classid_b; + + ufbx_string max_texture = ufbx_find_string(&texture->props, "3dsMax|MaxTexture", ufbx_empty_string); + + // Check first if the texture looks like it could be a shader. + ufbx_shader_texture_type type = (ufbx_shader_texture_type)UFBX_SHADER_TEXTURE_TYPE_COUNT; + + if (!strcmp(max_texture.data, "MULTIOUTPUT_TO_OSLMap") || classid == UINT64_C(0x896ef2fc44bd743f)) { + type = UFBX_SHADER_TEXTURE_SELECT_OUTPUT; + } else if (!strcmp(max_texture.data, "OSLMap") || classid == UINT64_C(0x7f9a7b9d6fcdf00d)) { + type = UFBX_SHADER_TEXTURE_OSL; + } else if (texture->type == UFBX_TEXTURE_FILE && texture->relative_filename.length == 0 && texture->absolute_filename.length == 0 && !texture->video) { + type = UFBX_SHADER_TEXTURE_UNKNOWN; + } + + if ((uint32_t)type == UFBX_SHADER_TEXTURE_TYPE_COUNT) return 1; + + ufbx_shader_texture *shader = ufbxi_push_zero(&uc->result, ufbx_shader_texture, 1); + ufbxi_check(shader); + + shader->type = type; + + static const char *name_props[] = { + "3dsMax|params|OSLShaderName", + }; + + static const char *source_props[] = { + "3dsMax|params|OSLCode", + }; + + shader->shader_source.data = ufbxi_empty_char; + shader->shader_name.data = ufbxi_empty_char; + + ufbxi_nounroll for (size_t i = 0; i < ufbxi_arraycount(name_props); i++) { + ufbx_prop *prop = ufbx_find_prop(&texture->props, name_props[i]); + if (prop) { + shader->shader_name = prop->value_str; + break; + } + } + + ufbxi_nounroll for (size_t i = 0; i < ufbxi_arraycount(source_props); i++) { + ufbx_prop *prop = ufbx_find_prop(&texture->props, source_props[i]); + if (prop) { + shader->shader_source = prop->value_str; + shader->raw_shader_source = prop->value_blob; + break; + } + } + + ufbxi_check(ufbxi_shader_texture_find_prefix(uc, texture, shader)); + + if (shader->shader_name.length == 0) { + ufbx_string name = shader->prop_prefix; + if (ufbxi_remove_suffix_c(&name, " Parameters/Connections|")) { + size_t begin = name.length; + while (begin > 0 && name.data[begin - 1] != '|') { + begin--; + } + + shader->shader_name.data = name.data + begin; + shader->shader_name.length = name.length - begin; + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, &shader->shader_name, false)); + } + } + + if (shader->shader_name.length == 0) { + if (max_texture.length > 0) { + shader->shader_name = max_texture; + } + } + + if (classid != 0) { + shader->shader_type_id = classid; + } + + if (shader->prop_prefix.length == 0) { + // If we not find any shader properties so we might have guessed wrong. + // We "leak" (freed with scene) the shader in this case but it's negligible. + return 1; + } + + ufbxi_for_list(ufbx_prop, prop, texture->props.props) { + + ufbx_string name = prop->name; + if (!ufbxi_remove_prefix_str(&name, shader->prop_prefix)) continue; + + // Check if this property is a modifier to an existing input. + ufbx_string base_name = name; + if (ufbxi_remove_suffix_c(&base_name, "_map") || ufbxi_remove_suffix_c(&base_name, ".shader")) { + ufbx_shader_texture_input *base = ufbx_find_shader_texture_input_len(shader, base_name.data, base_name.length); + if (base) { + base->texture_prop = prop; + continue; + } + } else if (ufbxi_remove_suffix_c(&base_name, ".connected") || ufbxi_remove_suffix_c(&base_name, "Enabled")) { + ufbx_shader_texture_input *base = ufbx_find_shader_texture_input_len(shader, base_name.data, base_name.length); + if (base) { + base->texture_enabled_prop = prop; + continue; + } + } + + // Use `uc->tmp_arr` to store the texture inputs so we can search them while we insert new ones. + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, + (shader->inputs.count + 1) * sizeof(ufbx_shader_texture_input))); + shader->inputs.data = (ufbx_shader_texture_input*)uc->tmp_arr; + + // Add a new property + ufbx_shader_texture_input *input = &shader->inputs.data[shader->inputs.count++]; + memset(input, 0, sizeof(ufbx_shader_texture_input)); + + // NOTE: This is a bit hackish, we are using a suffix of an interned string. It won't compare + // pointer equal to the same string but that shouldn't matter.. + input->name = name; + + // Connect the property only, values and textures etc are fetched in `ufbxi_update_shader_texture()`. + input->prop = prop; + } + + // Retain the shader inputs + shader->inputs.data = ufbxi_push_copy(&uc->result, ufbx_shader_texture_input, shader->inputs.count, shader->inputs.data); + ufbxi_check(shader->inputs.data); + + texture->shader = shader; + texture->type = UFBX_TEXTURE_SHADER; + uc->scene.metadata.num_shader_textures++; + + if (!uc->opts.disable_quirks) { + ufbxi_nounroll for (size_t i = 0; i < ufbxi_arraycount(ufbxi_file_shaders); i++) { + const ufbxi_file_shader *fs = &ufbxi_file_shaders[i]; + + if ((fs->shader_id && shader->shader_type_id == fs->shader_id) || !strcmp(shader->shader_name.data, fs->shader_name)) { + ufbx_shader_texture_input *input = ufbx_find_shader_texture_input(shader, fs->input_name); + if (input) { + // TODO: Support for specifying relative filename here if ever needed + ufbx_prop *prop = input->prop; + texture->absolute_filename = prop->value_str; + texture->raw_absolute_filename = prop->value_blob; + texture->type = UFBX_TEXTURE_FILE; + break; + } + } + } + } + + ufbxi_update_shader_texture(texture, shader); + + return 1; +} + +ufbxi_noinline static void ufbxi_propagate_main_textures(ufbx_scene *scene) +{ + // We need to do at least 2^(N-1) passes for N shader textures + size_t mask = scene->metadata.num_shader_textures; + while (mask) { + mask >>= 1; + + ufbxi_for_ptr_list(ufbx_texture, p_texture, scene->textures) { + ufbx_texture *texture = *p_texture; + ufbx_shader_texture *shader = texture->shader; + if (!shader) continue; + + ufbx_texture *main = shader->main_texture; + if (!main || shader->main_texture_output_index != 0) continue; + + ufbx_shader_texture *main_shader = main->shader; + if (!main_shader || !main_shader->main_texture) continue; + + shader->main_texture = main_shader->main_texture; + shader->main_texture_output_index = main_shader->main_texture_output_index; + } + } + + // Remove cyclic main textures + ufbxi_for_ptr_list(ufbx_texture, p_texture, scene->textures) { + ufbx_texture *texture = *p_texture; + ufbx_shader_texture *shader = texture->shader; + if (!shader || !shader->main_texture || shader->main_texture_output_index != 0) continue; + ufbx_texture *main = shader->main_texture; + if (main && main->shader && main->shader->main_texture) { + // Should have been propagated to `texture` + shader->main_texture = NULL; + } + } + + ufbxi_for_ptr_list(ufbx_texture, p_texture, scene->textures) { + ufbx_texture *texture = *p_texture; + ufbx_shader_texture *shader = texture->shader; + if (!shader) continue; + + ufbxi_for_list(ufbx_shader_texture_input, input, shader->inputs) { + if (!input->texture || !input->texture->shader) continue; + ufbx_shader_texture *input_shader = input->texture->shader; + if (input_shader->main_texture) { + input->texture = input_shader->main_texture; + input->texture_output_index = input_shader->main_texture_output_index; + } + } + } + + ufbxi_for_ptr_list(ufbx_material, p_material, scene->materials) { + ufbx_material *material = *p_material; + + ufbxi_for_list(ufbx_material_texture, tex, material->textures) { + ufbx_shader_texture *shader = tex->texture->shader; + if (shader && shader->main_texture && shader->main_texture_output_index == 0) { + tex->texture = shader->main_texture; + } + } + } +} + +#define ufbxi_patch_empty(m_dst, m_len, m_src) \ + if (!(m_dst).m_len) m_dst = m_src; + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_insert_texture_file(ufbxi_context *uc, ufbx_texture *texture) +{ + texture->file_index = UFBX_NO_INDEX; + + const char *key = NULL; + + // HACK: Even the raw entries have a null terminator so we can offset the + // pointer by one for relative filenames. This guarantees that an overlapping + // absolute and relative filenames will get separate textures. + if (texture->raw_absolute_filename.size > 0) { + key = (const char*)texture->raw_absolute_filename.data; + } else if (texture->raw_relative_filename.size > 0) { + key = (const char*)texture->raw_relative_filename.data + 1; + } + + if (key == NULL) return 1; + uint32_t hash = ufbxi_hash_ptr(key); + ufbxi_texture_file_entry *entry = ufbxi_map_find(&uc->texture_file_map, ufbxi_texture_file_entry, hash, &key); + if (!entry) { + entry = ufbxi_map_insert(&uc->texture_file_map, ufbxi_texture_file_entry, hash, &key); + ufbxi_check(entry); + + ufbx_texture_file *file = ufbxi_push_zero(&uc->tmp, ufbx_texture_file, 1); + ufbxi_check(file); + + file->index = uc->texture_file_map.size - 1; + + entry->key = key; + entry->file = file; + } + + ufbx_texture_file *file = entry->file; + texture->file_index = file->index; + texture->has_file = true; + ufbxi_patch_empty(file->filename, length, texture->filename); + ufbxi_patch_empty(file->relative_filename, length, texture->relative_filename); + ufbxi_patch_empty(file->absolute_filename, length, texture->absolute_filename); + ufbxi_patch_empty(file->raw_filename, size, texture->raw_filename); + ufbxi_patch_empty(file->raw_relative_filename, size, texture->raw_relative_filename); + ufbxi_patch_empty(file->raw_absolute_filename, size, texture->raw_absolute_filename); + ufbxi_patch_empty(file->content, size, texture->content); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_pop_texture_files(ufbxi_context *uc) +{ + uint32_t num_files = uc->texture_file_map.size; + ufbx_texture_file *files = ufbxi_push(&uc->result, ufbx_texture_file, num_files); + ufbxi_check(files); + + uc->scene.texture_files.data = files; + uc->scene.texture_files.count = num_files; + + ufbxi_texture_file_entry *entries = (ufbxi_texture_file_entry*)uc->texture_file_map.items; + for (size_t i = 0; i < num_files; i++) { + memcpy(&files[i], entries[i].file, sizeof(ufbx_texture_file)); + } + + return 1; +} + +typedef struct { + ufbx_texture *texture; + size_t order; +} ufbxi_ordered_texture; + +ufbxi_noinline static bool ufbxi_ordered_texture_less_texture(void *user, const void *va, const void *vb) +{ + (void)user; + const ufbxi_ordered_texture *a = (const ufbxi_ordered_texture*)va, *b = (const ufbxi_ordered_texture*)vb; + return a->texture < b->texture; +} + +ufbxi_noinline static bool ufbxi_ordered_texture_less_order(void *user, const void *va, const void *vb) +{ + (void)user; + const ufbxi_ordered_texture *a = (const ufbxi_ordered_texture*)va, *b = (const ufbxi_ordered_texture*)vb; + return a->order < b->order; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_deduplicate_textures(ufbxi_context *uc, ufbxi_buf *dst_buf, ufbxi_ordered_texture **p_dst, size_t *p_dst_count, size_t count) +{ + ufbxi_ordered_texture *textures = ufbxi_push_pop(dst_buf, &uc->tmp_stack, ufbxi_ordered_texture, count); + ufbxi_check(textures); + + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, count * sizeof(ufbxi_ordered_texture))); + + ufbxi_stable_sort(sizeof(ufbxi_ordered_texture), 16, textures, uc->tmp_arr, count, &ufbxi_ordered_texture_less_texture, NULL); + + // Remove adjacent duplicates + size_t dst_ix = 0; + for (size_t src_ix = 0; src_ix < count; src_ix++) { + if (src_ix > 0 && textures[src_ix - 1].texture == textures[src_ix].texture) { + continue; + } else { + if (src_ix != dst_ix) { + textures[dst_ix] = textures[src_ix]; + } + dst_ix++; + } + } + + size_t new_count = dst_ix; + ufbxi_stable_sort(sizeof(ufbxi_ordered_texture), 16, textures, uc->tmp_arr, new_count, &ufbxi_ordered_texture_less_order, NULL); + + *p_dst_count = new_count; + *p_dst = textures; + + return 1; +} + +typedef enum { + UFBXI_FILE_TEXTURE_FETCH_INITIAL, + UFBXI_FILE_TEXTURE_FETCH_STARTED, + UFBXI_FILE_TEXTURE_FETCH_FINISHED, +} ufbxi_file_texture_fetch_state; + +// Populate `ufbx_texture.file_textures[]` arrays. +ufbxi_nodiscard ufbxi_noinline static int ufbxi_fetch_file_textures(ufbxi_context *uc) +{ + // We keep pointers to `ufbx_texture` in `tmp_stack` as a working set, since we don't know + // how deep the shader graphs might be. + + // Start by pushing all the textures into the stack + size_t num_stack_textures = uc->scene.textures.count; + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_texture*, num_stack_textures, uc->scene.textures.data)); + + // Compressed `ufbxi_file_texture_fetch_state` + uint8_t *states = ufbxi_push_zero(&uc->tmp, uint8_t, uc->scene.textures.count); + ufbxi_check(states); + + while (num_stack_textures-- > 0) { + ufbx_texture *texture = NULL; + ufbxi_pop(&uc->tmp_stack, ufbx_texture*, 1, &texture); + + ufbxi_file_texture_fetch_state state = (ufbxi_file_texture_fetch_state)states[texture->typed_id]; + if (state == UFBXI_FILE_TEXTURE_FETCH_FINISHED) continue; + ufbx_shader_texture *shader = texture->shader; + + if (state == UFBXI_FILE_TEXTURE_FETCH_STARTED) { + states[texture->typed_id] = UFBXI_FILE_TEXTURE_FETCH_FINISHED; + + // HACK: Reuse `tmp_parse` for storing intermediate information as we can clear it. + ufbxi_buf_clear(&uc->tmp_parse); + + // Now all non-cyclical dependents should be processed. + size_t num_deps = 0; + + if (texture->type == UFBX_TEXTURE_FILE) { + ufbxi_ordered_texture *dst = ufbxi_push(&uc->tmp_stack, ufbxi_ordered_texture, 1); + ufbxi_check(dst); + dst->texture = texture; + dst->order = num_deps++; + } + + ufbxi_for_list(ufbx_texture_layer, layer, texture->layers) { + ufbx_texture *dep_tex = layer->texture; + if (dep_tex->file_textures.count > 0) { + ufbxi_ordered_texture *dst = ufbxi_push(&uc->tmp_stack, ufbxi_ordered_texture, 1); + ufbxi_check(dst); + dst->texture = dep_tex; + dst->order = num_deps++; + } + } + + if (shader) { + ufbxi_for_list(ufbx_shader_texture_input, input, shader->inputs) { + ufbx_texture *dep_tex = input->texture; + if (dep_tex && dep_tex->file_textures.count > 0) { + ufbxi_ordered_texture *dst = ufbxi_push(&uc->tmp_stack, ufbxi_ordered_texture, 1); + ufbxi_check(dst); + dst->texture = dep_tex; + dst->order = num_deps++; + } + } + } + + // Deduplicate the direct dependencies first + ufbxi_ordered_texture *deps; + ufbxi_check(ufbxi_deduplicate_textures(uc, &uc->tmp_parse, &deps, &num_deps, num_deps)); + + if (num_deps == 1) { + // If we have only a single dependency (that is not the same one) we can just copy the pointer + texture->file_textures = deps[0].texture->file_textures; + } else { + // Now collect all the file textures and deduplicate them + size_t num_files = 0; + ufbxi_for(ufbxi_ordered_texture, dep, deps, num_deps) { + ufbxi_for_ptr_list(ufbx_texture, p_tex, dep->texture->file_textures) { + ufbxi_ordered_texture *dst = ufbxi_push(&uc->tmp_stack, ufbxi_ordered_texture, 1); + ufbxi_check(dst); + dst->texture = *p_tex; + dst->order = num_files++; + } + } + + // Deduplicate the file textures + ufbxi_ordered_texture *files; + ufbxi_check(ufbxi_deduplicate_textures(uc, &uc->tmp_parse, &files, &num_files, num_files)); + + texture->file_textures.count = num_files; + texture->file_textures.data = ufbxi_push(&uc->result, ufbx_texture*, num_files); + ufbxi_check(texture->file_textures.data); + + for (size_t i = 0; i < num_files; i++) { + texture->file_textures.data[i] = files[i].texture; + } + } + + } else { + if (texture->type == UFBX_TEXTURE_FILE) { + // Simple case: Just point to self + texture->file_textures.count = 1; + texture->file_textures.data = ufbxi_push(&uc->result, ufbx_texture*, 1); + ufbxi_check(texture->file_textures.data); + texture->file_textures.data[0] = texture; + + // In simple cases we can quit here, for more complex file textures queue + // the texture in case there are other file textures as inputs. + if (!texture->shader) { + states[texture->typed_id] = UFBXI_FILE_TEXTURE_FETCH_FINISHED; + continue; + } + } + + // Complex: Process all dependencies first + states[texture->typed_id] = UFBXI_FILE_TEXTURE_FETCH_STARTED; + + // Push self first so we can return after processing dependencies + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_texture*, 1, &texture)); + num_stack_textures++; + + ufbxi_for_list(ufbx_texture_layer, layer, texture->layers) { + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_texture*, 1, &layer->texture)); + num_stack_textures++; + } + + if (shader) { + ufbxi_for_list(ufbx_shader_texture_input, input, shader->inputs) { + if (input->texture) { + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_texture*, 1, &input->texture)); + num_stack_textures++; + } + } + } + } + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static ufbx_node *ufbxi_get_geometry_transform_node(ufbx_element *element) +{ + if (element->instances.count == 1) { + ufbx_node *node = element->instances.data[0]; + if (node->has_geometry_transform) return node; + } + return NULL; +} + +ufbxi_noinline static void ufbxi_transform_vec3_list(const void *v_list, const ufbx_matrix *matrix, size_t stride) +{ + const ufbx_void_list *list = (const ufbx_void_list*)v_list; + if (!list || list->count == 0) return; + if (!stride) stride = sizeof(ufbx_vec3); + + void *ptr = list->data, *end = (char*)ptr + list->count * stride; + while (ptr != end) { + ufbx_vec3 *v = (ufbx_vec3*)ptr; + *v = ufbx_transform_position(matrix, *v); + ptr = (char*)ptr + stride; + } +} + +ufbxi_noinline static void ufbxi_normalize_vec3_list(const ufbx_vec3_list *list) +{ + ufbxi_nounroll ufbxi_for_list(ufbx_vec3, normal, *list) { + *normal = ufbxi_normalize3(*normal); + } +} + +// Forward declare as we're kind of preprocessing ata here that would usually happen later. +ufbxi_noinline static ufbx_transform ufbxi_get_geometry_transform(const ufbx_props *props); + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_handle_geometry_transforms(ufbxi_context *uc) +{ + if (uc->opts.geometry_transform_handling == UFBX_GEOMETRY_TRANSFORM_HANDLING_PRESERVE) return 1; + + if (uc->opts.geometry_transform_handling == UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY + || uc->opts.geometry_transform_handling == UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY_NO_FALLBACK) { + // Prefetch geometry transforms for processing, they will later be overwritten in `ufbxi_update_node()`. + ufbxi_for_ptr_list(ufbx_node, p_node, uc->scene.nodes) { + ufbx_node *node = *p_node; + if (node->is_root) continue; + + node->geometry_transform = ufbxi_get_geometry_transform(&node->props); + if (!ufbxi_is_transform_identity(node->geometry_transform)) { + node->geometry_to_node = ufbx_transform_to_matrix(&node->geometry_transform); + node->has_geometry_transform = true; + } else { + node->geometry_to_node = ufbx_identity_matrix; + node->has_geometry_transform = false; + } + } + + ufbxi_for_ptr_list(ufbx_mesh, p_mesh, uc->scene.meshes) { + ufbx_mesh *mesh = *p_mesh; + ufbx_node *geo_node = ufbxi_get_geometry_transform_node(&mesh->element); + if (!geo_node) continue; + + ufbx_matrix tangent_matrix = geo_node->geometry_to_node; + tangent_matrix.m03 = 0.0f; + tangent_matrix.m13 = 0.0f; + tangent_matrix.m23 = 0.0f; + ufbx_matrix normal_matrix = ufbx_matrix_for_normals(&geo_node->geometry_to_node); + + ufbxi_transform_vec3_list(&mesh->vertex_position.values, &geo_node->geometry_to_node, 0); + ufbxi_transform_vec3_list(&mesh->vertex_normal.values, &normal_matrix, 0); + ufbxi_normalize_vec3_list(&mesh->vertex_normal.values); + + ufbxi_for_list(ufbx_uv_set, set, mesh->uv_sets) { + ufbxi_transform_vec3_list(&set->vertex_tangent.values, &tangent_matrix, 0); + ufbxi_transform_vec3_list(&set->vertex_bitangent.values, &tangent_matrix, 0); + ufbxi_normalize_vec3_list(&set->vertex_tangent.values); + ufbxi_normalize_vec3_list(&set->vertex_bitangent.values); + } + } + + ufbxi_for_ptr_list(ufbx_line_curve, p_curve, uc->scene.line_curves) { + ufbx_line_curve *curve = *p_curve; + ufbx_node *geo_node = ufbxi_get_geometry_transform_node(&curve->element); + if (!geo_node) continue; + + ufbxi_transform_vec3_list(&curve->control_points, &geo_node->geometry_to_node, 0); + } + + ufbxi_for_ptr_list(ufbx_nurbs_curve, p_curve, uc->scene.nurbs_curves) { + ufbx_nurbs_curve *curve = *p_curve; + ufbx_node *geo_node = ufbxi_get_geometry_transform_node(&curve->element); + if (!geo_node) continue; + + ufbxi_transform_vec3_list(&curve->control_points, &geo_node->geometry_to_node, sizeof(ufbx_vec4)); + } + + ufbxi_for_ptr_list(ufbx_nurbs_surface, p_surface, uc->scene.nurbs_surfaces) { + ufbx_nurbs_surface *surface = *p_surface; + ufbx_node *geo_node = ufbxi_get_geometry_transform_node(&surface->element); + if (!geo_node) continue; + + ufbxi_transform_vec3_list(&surface->control_points, &geo_node->geometry_to_node, sizeof(ufbx_vec4)); + } + } + + // Reset all geometry transforms if we're not preserving them + ufbx_props *defaults = NULL; + ufbxi_for_ptr_list(ufbx_node, p_node, uc->scene.nodes) { + ufbx_node *node = *p_node; + if (!defaults) defaults = node->props.defaults; + + if (node->has_geometry_transform) { + ufbxi_set_own_prop_vec3_uniform(&node->props, ufbxi_GeometricTranslation, 0.0f); + ufbxi_set_own_prop_vec3_uniform(&node->props, ufbxi_GeometricRotation, 0.0f); + ufbxi_set_own_prop_vec3_uniform(&node->props, ufbxi_GeometricScaling, 1.0f); + } + } + + if (defaults) { + ufbxi_set_own_prop_vec3_uniform(defaults, ufbxi_GeometricTranslation, 0.0f); + ufbxi_set_own_prop_vec3_uniform(defaults, ufbxi_GeometricRotation, 0.0f); + ufbxi_set_own_prop_vec3_uniform(defaults, ufbxi_GeometricScaling, 1.0f); + } + + return 1; +} + +ufbxi_noinline static void ufbxi_postprocess_scene(ufbxi_context *uc) +{ + if (uc->opts.normalize_normals || uc->opts.normalize_tangents) { + ufbxi_for_ptr_list(ufbx_mesh, p_mesh, uc->scene.meshes) { + ufbx_mesh *mesh = *p_mesh; + if (uc->opts.normalize_normals) { + ufbxi_normalize_vec3_list(&mesh->vertex_normal.values); + } + if (uc->opts.normalize_tangents) { + ufbxi_for_list(ufbx_uv_set, set, mesh->uv_sets) { + ufbxi_normalize_vec3_list(&mesh->vertex_tangent.values); + ufbxi_normalize_vec3_list(&mesh->vertex_bitangent.values); + } + } + } + } +} + +ufbxi_noinline static size_t ufbxi_next_path_segment(const char *data, size_t begin, size_t length) +{ + for (size_t i = begin; i < length; i++) { + if (data[i] == '/' || data[i] == '\\') { + return i; + } + } + return length; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_absolute_to_relative_path(ufbxi_context *uc, ufbxi_strblob *p_dst, const ufbxi_strblob *p_rel, const ufbxi_strblob *p_src, bool raw) +{ + const char *rel = ufbxi_strblob_data(p_rel, raw); + const char *src = ufbxi_strblob_data(p_src, raw); + size_t rel_length = ufbxi_strblob_length(p_rel, raw); + size_t src_length = ufbxi_strblob_length(p_src, raw); + + if (rel_length == 0 || src_length == 0) return 1; + + // Absolute paths must start with the same character (either drive or '/') + if (rel[0] != src[0]) return 1; + + // Find the last directory of the path we want to be relative to + while (rel_length > 0 && (rel[rel_length - 1] != '/' && rel[rel_length - 1] != '\\')) { + rel_length--; + } + + if (rel_length == 0) return 1; + char separator = rel[rel_length - 1]; + + size_t max_length = rel_length * 2 + src_length; + + ufbxi_check(ufbxi_grow_array(&uc->ator_tmp, &uc->tmp_arr, &uc->tmp_arr_size, max_length)); + char *tmp = uc->tmp_arr; + size_t tmp_length = 0; + + size_t rel_begin = 0; + size_t src_begin = 0; + while (rel_begin < rel_length && src_begin < src_length) { + size_t rel_end = ufbxi_next_path_segment(rel, rel_begin, rel_length); + size_t src_end = ufbxi_next_path_segment(src, src_begin, src_length); + if (rel_end != src_end && memcmp(rel + rel_begin, src + src_begin, src_end - src_begin) != 0) break; + + rel_begin = rel_end + 1; + src_begin = src_end + 1; + } + + while (rel_begin < rel_length) { + size_t rel_end = ufbxi_next_path_segment(rel, rel_begin, rel_length); + tmp[tmp_length++] = '.'; + tmp[tmp_length++] = '.'; + tmp[tmp_length++] = separator; + rel_begin = rel_end + 1; + } + + while (src_begin < src_length) { + size_t src_end = ufbxi_next_path_segment(src, src_begin, src_length); + size_t len = src_end - src_begin; + + memcpy(tmp + tmp_length, src + src_begin, len); + tmp_length += len; + + if (src_end < src_length) { + tmp[tmp_length++] = separator; + } + + src_begin = src_end + 1; + } + + ufbx_assert(tmp_length <= max_length); + + const char *dst = ufbxi_push_string(&uc->string_pool, tmp, tmp_length, NULL, true); + ufbxi_check(dst); + + ufbxi_strblob_set(p_dst, dst, tmp_length, raw); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_resolve_filenames(ufbxi_context *uc, ufbxi_strblob *filename, ufbxi_strblob *absolute_filename, ufbxi_strblob *relative_filename, bool raw) +{ + if (ufbxi_strblob_length(relative_filename, raw) == 0) { + const ufbxi_strblob *original_file_path = raw + ? (const ufbxi_strblob*)&uc->scene.metadata.raw_original_file_path + : (const ufbxi_strblob*)&uc->scene.metadata.original_file_path; + + ufbxi_check(ufbxi_absolute_to_relative_path(uc, relative_filename, original_file_path, absolute_filename, raw)); + } + + ufbxi_check(ufbxi_resolve_relative_filename(uc, filename, relative_filename, raw)); + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_validate_indices(ufbxi_context *uc, ufbx_uint32_list *indices, size_t max_index) +{ + if (max_index == 0 && uc->opts.index_error_handling == UFBX_INDEX_ERROR_HANDLING_CLAMP) { + indices->data = NULL; + indices->count = 0; + return 1; + } + + ufbxi_nounroll ufbxi_for_list(uint32_t, p_ix, *indices) { + uint32_t ix = *p_ix; + if (ix >= max_index) { + ufbxi_check(ufbxi_fix_index(uc, p_ix, ix, max_index)); + } + } + + return 1; +} + +ufbx_static_assert(mesh_mat_point_faces, offsetof(ufbx_mesh_material, num_point_faces) - offsetof(ufbx_mesh_material, num_empty_faces) == 1 * sizeof(size_t)); +ufbx_static_assert(mesh_mat_line_faces, offsetof(ufbx_mesh_material, num_line_faces) - offsetof(ufbx_mesh_material, num_empty_faces) == 2 * sizeof(size_t)); + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_finalize_mesh_material(ufbxi_buf *buf, ufbx_error *error, ufbx_mesh *mesh) +{ + if (!mesh->face_material.count) return 1; + + size_t num_materials = mesh->materials.count; + size_t num_faces = mesh->faces.count; + + // Count the number of faces and triangles per material + ufbxi_nounroll for (size_t i = 0; i < num_faces; i++) { + ufbx_face face = mesh->faces.data[i]; + uint32_t mat_ix = mesh->face_material.data[i]; + if (mat_ix >= num_materials) { + mesh->face_material.data[i] = 0; + mat_ix = 0; + } + mesh->materials.data[mat_ix].num_faces++; + if (face.num_indices >= 3) { + mesh->materials.data[mat_ix].num_triangles += face.num_indices - 2; + } else { + // `num_empty/point/line_faces` are consecutive, see static asserts above. + // cppcheck-suppress objectIndex + (&mesh->materials.data[mat_ix].num_empty_faces)[face.num_indices]++; + } + } + + // Allocate per-material buffers (clear `num_faces` to 0 to re-use it as + // an index when fetching the face indices). + ufbxi_for_list(ufbx_mesh_material, mat, mesh->materials) { + mat->face_indices.count = mat->num_faces; + mat->face_indices.data = ufbxi_push(buf, uint32_t, mat->num_faces); + ufbxi_check_err(error, mat->face_indices.data); + mat->num_faces = 0; + } + + // Fetch the per-material face indices + ufbxi_nounroll for (size_t i = 0; i < num_faces; i++) { + uint32_t mat_ix = mesh->face_material.data ? mesh->face_material.data[i] : 0; + if (mat_ix < num_materials) { + ufbx_mesh_material *mat = &mesh->materials.data[mat_ix]; + mat->face_indices.data[mat->num_faces++] = (uint32_t)i; + } + } + + return 1; +} + +ufbxi_nodiscard ufbxi_noinline static int ufbxi_finalize_scene(ufbxi_context *uc) +{ + size_t num_elements = uc->num_elements; + + uc->scene.elements.count = num_elements; + uc->scene.elements.data = ufbxi_push(&uc->result, ufbx_element*, num_elements); + ufbxi_check(uc->scene.elements.data); + + uc->scene.metadata.element_buffer_size = uc->tmp_element_byte_offset; + char *element_data = (char*)ufbxi_push_pop(&uc->result, &uc->tmp_elements, uint64_t, uc->tmp_element_byte_offset/8); + ufbxi_buf_free(&uc->tmp_elements); + ufbxi_check(element_data); + + size_t *element_offsets = ufbxi_push_pop(&uc->tmp, &uc->tmp_element_offsets, size_t, uc->tmp_element_offsets.num_items); + ufbxi_buf_free(&uc->tmp_element_offsets); + ufbxi_check(element_offsets); + for (size_t i = 0; i < num_elements; i++) { + uc->scene.elements.data[i] = (ufbx_element*)(element_data + element_offsets[i]); + } + uc->scene.elements.count = num_elements; + ufbxi_buf_free(&uc->tmp_element_offsets); + + uc->scene.metadata.original_file_path = ufbx_find_string(&uc->scene.metadata.scene_props, "DocumentUrl", ufbx_empty_string); + uc->scene.metadata.raw_original_file_path = ufbx_find_blob(&uc->scene.metadata.scene_props, "DocumentUrl", ufbx_empty_blob); + + // Resolve and add the connections to elements + ufbxi_check(ufbxi_resolve_connections(uc)); + ufbxi_check(ufbxi_add_connections_to_elements(uc)); + ufbxi_check(ufbxi_linearize_nodes(uc)); + + for (size_t type = 0; type < UFBX_ELEMENT_TYPE_COUNT; type++) { + size_t num_typed = uc->tmp_typed_element_offsets[type].num_items; + size_t *typed_offsets = ufbxi_push_pop(&uc->tmp, &uc->tmp_typed_element_offsets[type], size_t, num_typed); + ufbxi_buf_free(&uc->tmp_typed_element_offsets[type]); + ufbxi_check(typed_offsets); + + ufbx_element_list *typed_elems = &uc->scene.elements_by_type[type]; + typed_elems->count = num_typed; + typed_elems->data = ufbxi_push(&uc->result, ufbx_element*, num_typed); + ufbxi_check(typed_elems->data); + + for (size_t i = 0; i < num_typed; i++) { + typed_elems->data[i] = (ufbx_element*)(element_data + typed_offsets[i]); + } + + ufbxi_buf_free(&uc->tmp_typed_element_offsets[type]); + } + + // Create named elements + uc->scene.elements_by_name.count = num_elements; + uc->scene.elements_by_name.data = ufbxi_push(&uc->result, ufbx_name_element, num_elements); + ufbxi_check(uc->scene.elements_by_name.data); + + for (size_t i = 0; i < num_elements; i++) { + + ufbx_element *elem = uc->scene.elements.data[i]; + ufbx_name_element *name_elem = &uc->scene.elements_by_name.data[i]; + + name_elem->name = elem->name; + name_elem->type = elem->type; + name_elem->_internal_key = ufbxi_get_name_key(elem->name.data, elem->name.length); + name_elem->element = elem; + } + + ufbxi_check(ufbxi_sort_name_elements(uc, uc->scene.elements_by_name.data, num_elements)); + + // Setup node children arrays and attribute pointers/lists + ufbxi_for_ptr_list(ufbx_node, p_node, uc->scene.nodes) { + ufbx_node *node = *p_node, *parent = node->parent; + if (parent) { + parent->children.count++; + if (parent->children.data == NULL) { + parent->children.data = p_node; + } + + if (node->is_geometry_transform_helper) { + parent->geometry_transform_helper = node; + } + } + + ufbx_connection_list conns = ufbxi_find_dst_connections(&node->element, NULL); + + ufbxi_for_list(ufbx_connection, conn, conns) { + ufbx_element *elem = conn->src; + ufbx_element_type type = elem->type; + if (!(type >= UFBX_ELEMENT_TYPE_FIRST_ATTRIB && type <= UFBX_ELEMENT_TYPE_LAST_ATTRIB)) continue; + + size_t index = node->all_attribs.count++; + if (index == 0) { + node->attrib = elem; + node->attrib_type = type; + } else { + if (index == 1) { + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_element*, 1, &node->attrib)); + } + ufbxi_check(ufbxi_push_copy(&uc->tmp_stack, ufbx_element*, 1, &elem)); + } + + switch (elem->type) { + case UFBX_ELEMENT_MESH: node->mesh = (ufbx_mesh*)elem; break; + case UFBX_ELEMENT_LIGHT: node->light = (ufbx_light*)elem; break; + case UFBX_ELEMENT_CAMERA: node->camera = (ufbx_camera*)elem; break; + case UFBX_ELEMENT_BONE: node->bone = (ufbx_bone*)elem; break; + default: /* No shorthand */ break; + } + } + + if (node->all_attribs.count > 1) { + node->all_attribs.data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_element*, node->all_attribs.count); + ufbxi_check(node->all_attribs.data); + } else if (node->all_attribs.count == 1) { + node->all_attribs.data = &node->attrib; + } + + ufbxi_check(ufbxi_fetch_dst_elements(uc, &node->materials, &node->element, false, NULL, UFBX_ELEMENT_MATERIAL)); + } + + // Resolve bind pose bones that don't use the normal connection system + ufbxi_for_ptr_list(ufbx_pose, p_pose, uc->scene.poses) { + ufbx_pose *pose = *p_pose; + + // HACK: Transport `ufbxi_tmp_bone_pose` array through the `ufbx_bone_pose` pointer + size_t num_bones = pose->bone_poses.count; + ufbxi_tmp_bone_pose *tmp_poses = (ufbxi_tmp_bone_pose*)pose->bone_poses.data; + pose->bone_poses.data = ufbxi_push(&uc->result, ufbx_bone_pose, num_bones); + ufbxi_check(pose->bone_poses.data); + + // Filter only found bones + pose->bone_poses.count = 0; + for (size_t i = 0; i < num_bones; i++) { + ufbx_element *elem = ufbxi_find_element_by_fbx_id(uc, tmp_poses[i].bone_fbx_id); + if (!elem || elem->type != UFBX_ELEMENT_NODE) continue; + + ufbx_bone_pose *bone = &pose->bone_poses.data[pose->bone_poses.count++]; + bone->bone_node = (ufbx_node*)elem; + bone->bone_to_world = tmp_poses[i].bone_to_world; + + if (pose->bind_pose) { + ufbx_connection_list node_conns = ufbxi_find_src_connections(elem, NULL); + ufbxi_for_list(ufbx_connection, conn, node_conns) { + if (conn->dst->type != UFBX_ELEMENT_SKIN_CLUSTER) continue; + ufbx_skin_cluster *cluster = (ufbx_skin_cluster*)conn->dst; + if (ufbxi_matrix_all_zero(&cluster->bind_to_world)) { + cluster->bind_to_world = bone->bone_to_world; + } + } + } + } + } + + // Fetch pointers that may break elements + + // Setup node attribute instances + for (int type = UFBX_ELEMENT_TYPE_FIRST_ATTRIB; type <= UFBX_ELEMENT_TYPE_LAST_ATTRIB; type++) { + ufbxi_for_ptr_list(ufbx_element, p_elem, uc->scene.elements_by_type[type]) { + ufbx_element *elem = *p_elem; + ufbxi_check(ufbxi_fetch_src_elements(uc, &elem->instances, elem, false, NULL, UFBX_ELEMENT_NODE)); + } + } + + bool search_node = uc->version < 7000; + + ufbxi_for_ptr_list(ufbx_skin_cluster, p_cluster, uc->scene.skin_clusters) { + ufbx_skin_cluster *cluster = *p_cluster; + cluster->bone_node = (ufbx_node*)ufbxi_fetch_dst_element(&cluster->element, false, NULL, UFBX_ELEMENT_NODE); + } + + ufbxi_for_ptr_list(ufbx_skin_deformer, p_skin, uc->scene.skin_deformers) { + ufbx_skin_deformer *skin = *p_skin; + ufbxi_check(ufbxi_fetch_dst_elements(uc, &skin->clusters, &skin->element, false, NULL, UFBX_ELEMENT_SKIN_CLUSTER)); + + // Remove clusters without a valid `bone` + if (!uc->opts.connect_broken_elements) { + size_t num_broken = 0; + for (size_t i = 0; i < skin->clusters.count; i++) { + if (!skin->clusters.data[i]->bone_node) { + num_broken++; + } else if (num_broken > 0) { + skin->clusters.data[i - num_broken] = skin->clusters.data[i]; + } + } + skin->clusters.count -= num_broken; + } + + size_t total_weights = 0; + ufbxi_for_ptr_list(ufbx_skin_cluster, p_cluster, skin->clusters) { + ufbx_skin_cluster *cluster = *p_cluster; + ufbxi_check(SIZE_MAX - total_weights > cluster->num_weights); + total_weights += cluster->num_weights; + } + + size_t num_vertices = 0; + + // Iterate through meshes so we can pad the vertices to the largest one + { + ufbx_connection_list conns = ufbxi_find_src_connections(&skin->element, NULL); + ufbxi_for_list(ufbx_connection, conn, conns) { + ufbx_mesh *mesh = NULL; + if (conn->dst_prop.length > 0) continue; + if (conn->dst->type == UFBX_ELEMENT_MESH) { + mesh = (ufbx_mesh*)conn->dst; + } else if (conn->dst->type == UFBX_ELEMENT_NODE) { + ufbx_node *node = (ufbx_node*)conn->dst; + if (node->geometry_transform_helper) node = node->geometry_transform_helper; + mesh = node->mesh; + } + if (!mesh) continue; + num_vertices = ufbxi_max_sz(num_vertices, mesh->num_vertices); + } + } + + if (!uc->opts.skip_skin_vertices) { + skin->vertices.count = num_vertices; + skin->vertices.data = ufbxi_push_zero(&uc->result, ufbx_skin_vertex, num_vertices); + ufbxi_check(skin->vertices.data); + + skin->weights.count = total_weights; + skin->weights.data = ufbxi_push_zero(&uc->result, ufbx_skin_weight, total_weights); + ufbxi_check(skin->weights.data); + + // Count the number of weights per vertex + ufbxi_for_ptr_list(ufbx_skin_cluster, p_cluster, skin->clusters) { + ufbx_skin_cluster *cluster = *p_cluster; + for (size_t i = 0; i < cluster->num_weights; i++) { + uint32_t vertex = cluster->vertices.data[i]; + if (vertex < num_vertices) { + skin->vertices.data[vertex].num_weights++; + } + } + } + + ufbx_real default_dq = skin->skinning_method == UFBX_SKINNING_METHOD_DUAL_QUATERNION ? 1.0f : 0.0f; + + // Prefix sum to assign the vertex weight offsets and set up default DQ values + uint32_t offset = 0; + uint32_t max_weights = 0; + for (size_t i = 0; i < num_vertices; i++) { + skin->vertices.data[i].weight_begin = offset; + skin->vertices.data[i].dq_weight = default_dq; + uint32_t num_weights = skin->vertices.data[i].num_weights; + offset += num_weights; + skin->vertices.data[i].num_weights = 0; + + if (num_weights > max_weights) max_weights = num_weights; + } + ufbx_assert(offset <= total_weights); + skin->max_weights_per_vertex = max_weights; + + // Copy the DQ weights to vertices + for (size_t i = 0; i < skin->num_dq_weights; i++) { + uint32_t vertex = skin->dq_vertices.data[i]; + if (vertex < num_vertices) { + skin->vertices.data[vertex].dq_weight = skin->dq_weights.data[i]; + } + } + + // Copy the weights to vertices + uint32_t cluster_index = 0; + ufbxi_for_ptr_list(ufbx_skin_cluster, p_cluster, skin->clusters) { + ufbx_skin_cluster *cluster = *p_cluster; + for (size_t i = 0; i < cluster->num_weights; i++) { + uint32_t vertex = cluster->vertices.data[i]; + if (vertex < num_vertices) { + uint32_t local_index = skin->vertices.data[vertex].num_weights++; + uint32_t index = skin->vertices.data[vertex].weight_begin + local_index; + skin->weights.data[index].cluster_index = cluster_index; + skin->weights.data[index].weight = cluster->weights.data[i]; + } + } + cluster_index++; + } + + // Sort the vertex weights by descending weight value + ufbxi_check(ufbxi_sort_skin_weights(uc, skin)); + } + } + + ufbxi_for_ptr_list(ufbx_blend_deformer, p_blend, uc->scene.blend_deformers) { + ufbx_blend_deformer *blend = *p_blend; + ufbxi_check(ufbxi_fetch_dst_elements(uc, &blend->channels, &blend->element, false, NULL, UFBX_ELEMENT_BLEND_CHANNEL)); + } + + ufbxi_for_ptr_list(ufbx_cache_deformer, p_deformer, uc->scene.cache_deformers) { + ufbx_cache_deformer *deformer = *p_deformer; + deformer->channel = ufbx_find_string(&deformer->props, "ChannelName", ufbx_empty_string); + deformer->file = (ufbx_cache_file*)ufbxi_fetch_dst_element(&deformer->element, false, NULL, UFBX_ELEMENT_CACHE_FILE); + } + + ufbxi_for_ptr_list(ufbx_cache_file, p_cache, uc->scene.cache_files) { + ufbx_cache_file *cache = *p_cache; + + cache->absolute_filename = ufbx_find_string(&cache->props, "CacheAbsoluteFileName", ufbx_empty_string); + cache->relative_filename = ufbx_find_string(&cache->props, "CacheFileName", ufbx_empty_string); + + cache->raw_absolute_filename = ufbx_find_blob(&cache->props, "CacheAbsoluteFileName", ufbx_empty_blob); + cache->raw_relative_filename = ufbx_find_blob(&cache->props, "CacheFileName", ufbx_empty_blob); + + int64_t type = ufbx_find_int(&cache->props, "CacheFileType", 0); + if (type >= 0 && type <= UFBX_CACHE_FILE_FORMAT_MC) { + cache->format = (ufbx_cache_file_format)type; + } + + ufbxi_check(ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&cache->filename, (ufbxi_strblob*)&cache->absolute_filename, (ufbxi_strblob*)&cache->relative_filename, false)); + ufbxi_check(ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&cache->raw_filename, (ufbxi_strblob*)&cache->raw_absolute_filename, (ufbxi_strblob*)&cache->raw_relative_filename, true)); + } + + ufbx_assert(uc->tmp_full_weights.num_items == uc->scene.blend_channels.count); + ufbx_real_list *full_weights = ufbxi_push_pop(&uc->tmp, &uc->tmp_full_weights, ufbx_real_list, uc->tmp_full_weights.num_items); + ufbxi_buf_free(&uc->tmp_full_weights); + ufbxi_check(full_weights); + + ufbxi_for_ptr_list(ufbx_blend_channel, p_channel, uc->scene.blend_channels) { + ufbx_blend_channel *channel = *p_channel; + + ufbxi_check(ufbxi_fetch_blend_keyframes(uc, &channel->keyframes, &channel->element)); + + for (size_t i = 0; i < channel->keyframes.count; i++) { + ufbx_blend_keyframe *key = &channel->keyframes.data[i]; + if (i < full_weights->count) { + key->target_weight = full_weights->data[i] / (ufbx_real)100.0; + } else { + key->target_weight = 1.0f; + } + } + + ufbxi_check(ufbxi_sort_blend_keyframes(uc, channel->keyframes.data, channel->keyframes.count)); + full_weights++; + } + ufbxi_buf_free(&uc->tmp_full_weights); + + { + // Generate and patch procedural index buffers + uint32_t *zero_indices = ufbxi_push(&uc->result, uint32_t, uc->max_zero_indices); + uint32_t *consecutive_indices = ufbxi_push(&uc->result, uint32_t, uc->max_consecutive_indices); + ufbxi_check(zero_indices && consecutive_indices); + + memset(zero_indices, 0, sizeof(uint32_t) * uc->max_zero_indices); + for (size_t i = 0; i < uc->max_consecutive_indices; i++) { + consecutive_indices[i] = (uint32_t)i; + } + + uc->zero_indices = zero_indices; + uc->consecutive_indices = consecutive_indices; + + ufbxi_for_ptr_list(ufbx_mesh, p_mesh, uc->scene.meshes) { + ufbx_mesh *mesh = *p_mesh; + + ufbxi_patch_index_pointer(uc, &mesh->vertex_position.indices.data); + ufbxi_patch_index_pointer(uc, &mesh->vertex_normal.indices.data); + ufbxi_patch_index_pointer(uc, &mesh->vertex_bitangent.indices.data); + ufbxi_patch_index_pointer(uc, &mesh->vertex_tangent.indices.data); + ufbxi_patch_index_pointer(uc, &mesh->face_material.data); + ufbxi_patch_index_pointer(uc, &mesh->face_group.data); + + ufbxi_patch_index_pointer(uc, &mesh->skinned_position.indices.data); + ufbxi_patch_index_pointer(uc, &mesh->skinned_normal.indices.data); + + ufbxi_for_list(ufbx_uv_set, set, mesh->uv_sets) { + ufbxi_patch_index_pointer(uc, &set->vertex_uv.indices.data); + ufbxi_patch_index_pointer(uc, &set->vertex_bitangent.indices.data); + ufbxi_patch_index_pointer(uc, &set->vertex_tangent.indices.data); + } + + ufbxi_for_list(ufbx_color_set, set, mesh->color_sets) { + ufbxi_patch_index_pointer(uc, &set->vertex_color.indices.data); + } + + // Generate normals if necessary + if (!mesh->vertex_normal.exists && uc->opts.generate_missing_normals) { + ufbxi_check(ufbxi_generate_normals(uc, mesh)); + } + + // Assign first UV and color sets as the "canonical" ones + if (mesh->uv_sets.count > 0) { + mesh->vertex_uv = mesh->uv_sets.data[0].vertex_uv; + mesh->vertex_bitangent = mesh->uv_sets.data[0].vertex_bitangent; + mesh->vertex_tangent = mesh->uv_sets.data[0].vertex_tangent; + } + if (mesh->color_sets.count > 0) { + mesh->vertex_color = mesh->color_sets.data[0].vertex_color; + } + + if (mesh->face_groups.count == 1) { + ufbxi_patch_index_pointer(uc, &mesh->face_groups.data[0].face_indices.data); + } + + ufbxi_check(ufbxi_fetch_mesh_materials(uc, &mesh->materials, &mesh->element, true)); + + // Patch materials to instances if necessary + if (mesh->materials.count > 0) { + ufbxi_for_ptr_list(ufbx_node, p_node, mesh->instances) { + ufbx_node *node = *p_node; + if (node->materials.count < mesh->materials.count && mesh->materials.data[0].material != NULL) { + ufbx_material **materials = ufbxi_push(&uc->result, ufbx_material*, mesh->materials.count); + ufbxi_check(materials); + ufbxi_nounroll for (size_t i = 0; i < node->materials.count; i++) { + materials[i] = node->materials.data[i]; + } + ufbxi_nounroll for (size_t i = node->materials.count; i < mesh->materials.count; i++) { + materials[i] = mesh->materials.data[i].material; + } + node->materials.data = materials; + node->materials.count = mesh->materials.count; + } + } + } + + // Push a NULL material if necessary if requested + if (mesh->materials.count == 0 && uc->opts.allow_null_material) { + mesh->materials.data = ufbxi_push_zero(&uc->result, ufbx_mesh_material, 1); + ufbxi_check(mesh->materials.data); + mesh->materials.count = 1; + } + + if (mesh->materials.count == 1) { + // Use the shared consecutive index buffer for mesh faces if there's only one material + // See HACK(consecutive-faces) in `ufbxi_read_mesh()`. + ufbx_mesh_material *mat = &mesh->materials.data[0]; + mat->num_faces = mesh->num_faces; + mat->num_triangles = mesh->num_triangles; + mat->num_empty_faces = mesh->num_empty_faces; + mat->num_point_faces = mesh->num_point_faces; + mat->num_line_faces = mesh->num_line_faces; + mat->face_indices.data = uc->consecutive_indices; + mat->face_indices.count = mat->num_faces; + mesh->face_material.data = uc->zero_indices; + mesh->face_material.count = mesh->num_faces; + } else if (mesh->materials.count > 0 && mesh->face_material.count) { + ufbxi_check(ufbxi_finalize_mesh_material(&uc->result, &uc->error, mesh)); + } else { + mesh->face_material.data = NULL; + mesh->face_material.count = 0; + } + + // Fetch deformers + ufbxi_check(ufbxi_fetch_dst_elements(uc, &mesh->skin_deformers, &mesh->element, search_node, NULL, UFBX_ELEMENT_SKIN_DEFORMER)); + ufbxi_check(ufbxi_fetch_dst_elements(uc, &mesh->blend_deformers, &mesh->element, search_node, NULL, UFBX_ELEMENT_BLEND_DEFORMER)); + ufbxi_check(ufbxi_fetch_dst_elements(uc, &mesh->cache_deformers, &mesh->element, search_node, NULL, UFBX_ELEMENT_CACHE_DEFORMER)); + ufbxi_check(ufbxi_fetch_deformers(uc, &mesh->all_deformers, &mesh->element, search_node)); + + // Vertex position must always exist if not explicitly allowed to be missing + if (!mesh->vertex_position.exists && !uc->opts.allow_missing_vertex_position) { + ufbxi_check(mesh->num_indices == 0); + mesh->vertex_position.exists = true; + mesh->vertex_position.unique_per_vertex = true; + mesh->skinned_position.exists = true; + mesh->skinned_position.unique_per_vertex = true; + } + + // Update metadata + if (mesh->max_face_triangles > uc->scene.metadata.max_face_triangles) { + uc->scene.metadata.max_face_triangles = mesh->max_face_triangles; + } + } + } + + ufbxi_for_ptr_list(ufbx_stereo_camera, p_stereo, uc->scene.stereo_cameras) { + ufbx_stereo_camera *stereo = *p_stereo; + stereo->left = (ufbx_camera*)ufbxi_fetch_dst_element(&stereo->element, search_node, ufbxi_LeftCamera, UFBX_ELEMENT_CAMERA); + stereo->right = (ufbx_camera*)ufbxi_fetch_dst_element(&stereo->element, search_node, ufbxi_RightCamera, UFBX_ELEMENT_CAMERA); + } + + ufbxi_for_ptr_list(ufbx_nurbs_curve, p_curve, uc->scene.nurbs_curves) { + ufbx_nurbs_curve *curve = *p_curve; + ufbxi_check(ufbxi_finalize_nurbs_basis(uc, &curve->basis)); + } + + ufbxi_for_ptr_list(ufbx_nurbs_surface, p_surface, uc->scene.nurbs_surfaces) { + ufbx_nurbs_surface *surface = *p_surface; + ufbxi_check(ufbxi_finalize_nurbs_basis(uc, &surface->basis_u)); + ufbxi_check(ufbxi_finalize_nurbs_basis(uc, &surface->basis_v)); + + surface->material = (ufbx_material*)ufbxi_fetch_dst_element(&surface->element, true, NULL, UFBX_ELEMENT_MATERIAL); + } + + ufbxi_for_ptr_list(ufbx_anim_stack, p_stack, uc->scene.anim_stacks) { + ufbx_anim_stack *stack = *p_stack; + ufbxi_check(ufbxi_fetch_dst_elements(uc, &stack->layers, &stack->element, false, NULL, UFBX_ELEMENT_ANIM_LAYER)); + + stack->anim.layers.count = stack->layers.count; + stack->anim.layers.data = ufbxi_push_zero(&uc->result, ufbx_anim_layer_desc, stack->layers.count); + ufbxi_check(stack->anim.layers.data); + + for (size_t i = 0; i < stack->layers.count; i++) { + ufbx_anim_layer_desc *desc = (ufbx_anim_layer_desc*)&stack->anim.layers.data[i]; + desc->layer = stack->layers.data[i]; + desc->weight = 1.0f; + } + } + + ufbxi_for_ptr_list(ufbx_anim_layer, p_layer, uc->scene.anim_layers) { + ufbx_anim_layer *layer = *p_layer; + ufbxi_check(ufbxi_fetch_dst_elements(uc, &layer->anim_values, &layer->element, false, NULL, UFBX_ELEMENT_ANIM_VALUE)); + + ufbx_anim_layer_desc *layer_desc = ufbxi_push_zero(&uc->result, ufbx_anim_layer_desc, 1); + ufbxi_check(layer_desc); + layer_desc->layer = layer; + layer_desc->weight = 1.0f; + + layer->anim.layers.data = layer_desc; + layer->anim.layers.count = 1; + + uint32_t min_id = UINT32_MAX, max_id = 0; + + // Combine the animated properties with elements (potentially duplicates!) + size_t num_anim_props = 0; + ufbxi_for_ptr_list(ufbx_anim_value, p_value, layer->anim_values) { + ufbx_anim_value *value = *p_value; + ufbxi_for_list(ufbx_connection, ac, value->element.connections_src) { + if (ac->src_prop.length == 0 && ac->dst_prop.length > 0) { + ufbx_anim_prop *aprop = ufbxi_push(&uc->tmp_stack, ufbx_anim_prop, 1); + uint32_t id = ac->dst->element_id; + min_id = ufbxi_min32(min_id, id); + max_id = ufbxi_max32(max_id, id); + uint32_t id_mask = ufbxi_arraycount(layer->_element_id_bitmask) - 1; + layer->_element_id_bitmask[(id >> 5) & id_mask] |= 1u << (id & 31); + ufbxi_check(aprop); + aprop->anim_value = value; + aprop->element = ac->dst; + aprop->_internal_key = ufbxi_get_name_key(ac->dst_prop.data, ac->dst_prop.length); + aprop->prop_name = ac->dst_prop; + num_anim_props++; + } + } + } + + if (min_id != UINT32_MAX) { + layer->_min_element_id = min_id; + layer->_max_element_id = max_id; + } + + switch (ufbxi_find_int(&layer->props, ufbxi_BlendMode, 0)) { + case 0: // Additive + layer->blended = true; + layer->additive = true; + break; + case 1: // Override + layer->blended = false; + layer->additive = false; + break; + case 2: // Override Passthrough + layer->blended = true; + layer->additive = false; + break; + default: // Unknown + layer->blended = false; + layer->additive = false; + break; + } + + ufbx_prop *weight_prop = ufbxi_find_prop(&layer->props, ufbxi_Weight); + if (weight_prop) { + layer->weight = weight_prop->value_real / (ufbx_real)100.0; + if (layer->weight < 0.0f) layer->weight = 0.0f; + if (layer->weight > 0.99999f) layer->weight = 1.0f; + layer->weight_is_animated = (weight_prop->flags & UFBX_PROP_FLAG_ANIMATED) != 0; + } else { + layer->weight = 1.0f; + layer->weight_is_animated = false; + } + layer->compose_rotation = ufbxi_find_int(&layer->props, ufbxi_RotationAccumulationMode, 0) == 0; + layer->compose_scale = ufbxi_find_int(&layer->props, ufbxi_ScaleAccumulationMode, 0) == 0; + + // Add a dummy NULL element animated prop at the end so we can iterate + // animated props without worrying about boundary conditions.. + { + ufbx_anim_prop *aprop = ufbxi_push_zero(&uc->tmp_stack, ufbx_anim_prop, 1); + ufbxi_check(aprop); + } + + layer->anim_props.data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_anim_prop, num_anim_props + 1); + ufbxi_check(layer->anim_props.data); + layer->anim_props.count = num_anim_props; + ufbxi_check(ufbxi_sort_anim_props(uc, layer->anim_props.data, layer->anim_props.count)); + } + + ufbxi_for_ptr_list(ufbx_anim_value, p_value, uc->scene.anim_values) { + ufbx_anim_value *value = *p_value; + + // TODO: Search for things like d|Visibility with a constructed name + value->default_value.x = ufbxi_find_real(&value->props, ufbxi_X, value->default_value.x); + value->default_value.x = ufbxi_find_real(&value->props, ufbxi_d_X, value->default_value.x); + value->default_value.y = ufbxi_find_real(&value->props, ufbxi_Y, value->default_value.y); + value->default_value.y = ufbxi_find_real(&value->props, ufbxi_d_Y, value->default_value.y); + value->default_value.z = ufbxi_find_real(&value->props, ufbxi_Z, value->default_value.z); + value->default_value.z = ufbxi_find_real(&value->props, ufbxi_d_Z, value->default_value.z); + + ufbxi_for_list(ufbx_connection, conn, value->element.connections_dst) { + if (conn->src->type == UFBX_ELEMENT_ANIM_CURVE && conn->src_prop.length == 0) { + ufbx_anim_curve *curve = (ufbx_anim_curve*)conn->src; + + uint32_t index = 0; + const char *name = conn->dst_prop.data; + if (name == ufbxi_Y || name == ufbxi_d_Y) index = 1; + if (name == ufbxi_Z || name == ufbxi_d_Z) index = 2; + + ufbx_prop *prop = ufbx_find_prop_len(&value->props, conn->dst_prop.data, conn->dst_prop.length); + if (prop) { + value->default_value.v[index] = prop->value_real; + } + value->curves[index] = curve; + } + } + } + + ufbxi_for_ptr_list(ufbx_shader, p_shader, uc->scene.shaders) { + ufbx_shader *shader = *p_shader; + ufbxi_check(ufbxi_fetch_dst_elements(uc, &shader->bindings, &shader->element, false, NULL, UFBX_ELEMENT_SHADER_BINDING)); + + ufbx_prop *api = ufbx_find_prop(&shader->props, "RenderAPI"); + if (api) { + if (!strcmp(api->value_str.data, "ARNOLD_SHADER_ID")) { + shader->type = UFBX_SHADER_ARNOLD_STANDARD_SURFACE; + } else if (!strcmp(api->value_str.data, "OSL")) { + shader->type = UFBX_SHADER_OSL_STANDARD_SURFACE; + } else if (!strcmp(api->value_str.data, "SFX_PBS_SHADER")) { + shader->type = UFBX_SHADER_SHADERFX_GRAPH; + } + } + } + + ufbxi_for_ptr_list(ufbx_material, p_material, uc->scene.materials) { + ufbx_material *material = *p_material; + material->shader = (ufbx_shader*)ufbxi_fetch_src_element(&material->element, false, NULL, UFBX_ELEMENT_SHADER); + + if (!strcmp(material->shading_model_name.data, "lambert") || !strcmp(material->shading_model_name.data, "Lambert")) { + material->shader_type = UFBX_SHADER_FBX_LAMBERT; + } else if (!strcmp(material->shading_model_name.data, "phong") || !strcmp(material->shading_model_name.data, "Phong")) { + material->shader_type = UFBX_SHADER_FBX_PHONG; + } + + if (material->shader) { + material->shader_type = material->shader->type; + } else { + if (uc->exporter == UFBX_EXPORTER_BLENDER_BINARY && uc->exporter_version >= ufbx_pack_version(4,12,0)) { + material->shader_type = UFBX_SHADER_BLENDER_PHONG; + } + + // TODO: Is this too strict? + if (material->shader_type == UFBX_SHADER_UNKNOWN) { + uint32_t classid_a = (uint32_t)(uint64_t)ufbx_find_int(&material->props, "3dsMax|ClassIDa", 0); + uint32_t classid_b = (uint32_t)(uint64_t)ufbx_find_int(&material->props, "3dsMax|ClassIDb", 0); + if (classid_a == 0x3d6b1cecu && classid_b == 0xdeadc001u) { + material->shader_type = UFBX_SHADER_3DS_MAX_PHYSICAL_MATERIAL; + material->shader_prop_prefix.data = "3dsMax|Parameters|"; + material->shader_prop_prefix.length = strlen("3dsMax|Parameters|"); + } else if (classid_a == 0x38420192u && classid_b == 0x45fe4e1bu) { + material->shader_type = UFBX_SHADER_GLTF_MATERIAL; + material->shader_prop_prefix.data = "3dsMax|"; + material->shader_prop_prefix.length = strlen("3dsMax|"); + } else if (classid_a == 0xd00f1e00u && classid_b == 0xbe77e500u) { + material->shader_type = UFBX_SHADER_3DS_MAX_PBR_METAL_ROUGH; + material->shader_prop_prefix.data = "3dsMax|main|"; + material->shader_prop_prefix.length = strlen("3dsMax|main|"); + } else if (classid_a == 0xd00f1e00u && classid_b == 0x01dbad33u) { + material->shader_type = UFBX_SHADER_3DS_MAX_PBR_SPEC_GLOSS; + material->shader_prop_prefix.data = "3dsMax|main|"; + material->shader_prop_prefix.length = strlen("3dsMax|main|"); + } + } + } + + ufbxi_check(ufbxi_fetch_textures(uc, &material->textures, &material->element, false)); + } + + // Ugh.. Patch the textures from meshes for legacy LayerElement-style textures + { + ufbxi_for_ptr_list(ufbx_mesh, p_mesh, uc->scene.meshes) { + ufbx_mesh *mesh = *p_mesh; + size_t num_materials = mesh->materials.count; + + ufbxi_mesh_extra *extra = (ufbxi_mesh_extra*)ufbxi_get_element_extra(uc, mesh->element.element_id); + if (!extra) continue; + if (num_materials == 0) continue; + + // TODO: This leaks currently to result, probably doesn't matter.. + ufbx_texture_list textures; + ufbxi_check(ufbxi_fetch_dst_elements(uc, &textures, &mesh->element, true, NULL, UFBX_ELEMENT_TEXTURE)); + + size_t num_material_textures = 0; + ufbxi_for(ufbxi_tmp_mesh_texture, tex, extra->texture_arr, extra->texture_count) { + if (tex->all_same) { + int32_t texture_id = tex->num_faces > 0 ? (int32_t)tex->face_texture[0] : 0; + if (texture_id >= 0 && (size_t)texture_id < textures.count) { + ufbxi_tmp_material_texture *mat_texs = ufbxi_push(&uc->tmp_stack, ufbxi_tmp_material_texture, num_materials); + ufbxi_check(mat_texs); + num_material_textures += num_materials; + for (size_t i = 0; i < num_materials; i++) { + mat_texs[i].material_id = (int32_t)i; + mat_texs[i].texture_id = texture_id; + mat_texs[i].prop_name = tex->prop_name; + } + } + } else if (mesh->face_material.count) { + size_t num_faces = ufbxi_min_sz(tex->num_faces, mesh->num_faces); + int32_t prev_material = -1; + int32_t prev_texture = -1; + for (size_t i = 0; i < num_faces; i++) { + int32_t texture_id = (int32_t)tex->face_texture[i]; + int32_t material_id = (int32_t)mesh->face_material.data[i]; + if (texture_id < 0 || (size_t)texture_id >= textures.count) continue; + if (material_id < 0 || (size_t)material_id >= num_materials) continue; + if (material_id == prev_material && texture_id == prev_texture) continue; + prev_material = material_id; + prev_texture = texture_id; + + ufbxi_tmp_material_texture *mat_tex = ufbxi_push(&uc->tmp_stack, ufbxi_tmp_material_texture, 1); + ufbxi_check(mat_tex); + mat_tex->material_id = material_id; + mat_tex->texture_id = texture_id; + mat_tex->prop_name = tex->prop_name; + num_material_textures++; + } + } + } + + // Push a sentinel material texture to the end so we don't need to + // duplicate the material texture flushing code twice. + { + ufbxi_tmp_material_texture *mat_tex = ufbxi_push(&uc->tmp_stack, ufbxi_tmp_material_texture, 1); + ufbxi_check(mat_tex); + mat_tex->material_id = -1; + mat_tex->texture_id = -1; + mat_tex->prop_name = ufbx_empty_string; + } + + ufbxi_tmp_material_texture *mat_texs = ufbxi_push_pop(&uc->tmp, &uc->tmp_stack, ufbxi_tmp_material_texture, num_material_textures + 1); + ufbxi_check(mat_texs); + ufbxi_check(ufbxi_sort_tmp_material_textures(uc, mat_texs, num_material_textures)); + + int32_t prev_material = -2; + int32_t prev_texture = -2; + const char *prev_prop = NULL; + size_t num_textures_in_material = 0; + for (size_t i = 0; i < num_material_textures + 1; i++) { + ufbxi_tmp_material_texture mat_tex = mat_texs[i]; + if (mat_tex.material_id != prev_material) { + if (prev_material >= 0 && num_textures_in_material > 0) { + ufbx_material *mat = mesh->materials.data[prev_material].material; + if (mat && mat->textures.count == 0) { + ufbx_material_texture *texs = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_material_texture, num_textures_in_material); + ufbxi_check(texs); + mat->textures.data = texs; + mat->textures.count = num_textures_in_material; + } else { + ufbxi_pop(&uc->tmp_stack, ufbx_material_texture, num_textures_in_material, NULL); + } + } + + if (mat_tex.material_id < 0) break; + prev_material = mat_tex.material_id; + prev_texture = -1; + prev_prop = NULL; + num_textures_in_material = 0; + } + if (mat_tex.texture_id == prev_texture && mat_tex.prop_name.data == prev_prop) continue; + prev_texture = mat_tex.texture_id; + prev_prop = mat_tex.prop_name.data; + + ufbx_material_texture *tex = ufbxi_push(&uc->tmp_stack, ufbx_material_texture, 1); + ufbxi_check(tex); + ufbx_assert(prev_texture >= 0 && (size_t)prev_texture < textures.count); + tex->texture = textures.data[prev_texture]; + tex->shader_prop = tex->material_prop = mat_tex.prop_name; + num_textures_in_material++; + } + } + } + + // HACK: If there are multiple textures in an FBX file that use the same embedded + // texture they get duplicated Video elements instead of a shared one _and only one + // of them has the content?!_ So let's gather all Video instances with content and + // sort them by filename so we can patch the other ones.. + ufbx_video **content_videos = ufbxi_push(&uc->tmp, ufbx_video*, uc->scene.videos.count); + ufbxi_check(content_videos); + + size_t num_content_videos = 0; + ufbxi_for_ptr_list(ufbx_video, p_video, uc->scene.videos) { + ufbx_video *video = *p_video; + ufbxi_check(ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&video->filename, (ufbxi_strblob*)&video->absolute_filename, (ufbxi_strblob*)&video->relative_filename, false)); + ufbxi_check(ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&video->raw_filename, (ufbxi_strblob*)&video->raw_absolute_filename, (ufbxi_strblob*)&video->raw_relative_filename, true)); + if (video->content.size > 0) { + content_videos[num_content_videos++] = video; + } + } + + if (num_content_videos > 0) { + ufbxi_check(ufbxi_sort_videos_by_filename(uc, content_videos, num_content_videos)); + + ufbxi_for_ptr_list(ufbx_video, p_video, uc->scene.videos) { + ufbx_video *video = *p_video; + if (video->content.size > 0) continue; + + size_t index = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_video*, 16, &index, content_videos, 0, num_content_videos, + ( ufbxi_str_less((*a)->absolute_filename, video->absolute_filename) ), + ( (*a)->absolute_filename.data == video->absolute_filename.data )); + if (index != SIZE_MAX) { + video->content = content_videos[index]->content; + } + } + } + + ufbxi_for_ptr_list(ufbx_texture, p_texture, uc->scene.textures) { + ufbx_texture *texture = *p_texture; + ufbxi_texture_extra *extra = (ufbxi_texture_extra*)ufbxi_get_element_extra(uc, texture->element.element_id); + + ufbx_prop *uv_set = ufbxi_find_prop(&texture->props, ufbxi_UVSet); + if (uv_set) { + texture->uv_set = uv_set->value_str; + } else { + texture->uv_set = ufbx_empty_string; + } + + texture->video = (ufbx_video*)ufbxi_fetch_dst_element(&texture->element, false, NULL, UFBX_ELEMENT_VIDEO); + if (texture->video) { + texture->content = texture->video->content; + } + + ufbxi_check(ufbxi_finalize_shader_texture(uc, texture)); + + ufbxi_check(ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&texture->filename, (ufbxi_strblob*)&texture->absolute_filename, (ufbxi_strblob*)&texture->relative_filename, false)); + ufbxi_check(ufbxi_resolve_filenames(uc, (ufbxi_strblob*)&texture->raw_filename, (ufbxi_strblob*)&texture->raw_absolute_filename, (ufbxi_strblob*)&texture->raw_relative_filename, true)); + + // Fetch layered texture layers and patch alphas/blend modes + if (texture->type == UFBX_TEXTURE_LAYERED) { + ufbxi_check(ufbxi_fetch_texture_layers(uc, &texture->layers, &texture->element)); + if (extra) { + for (size_t i = 0, num = ufbxi_min_sz(extra->num_alphas, texture->layers.count); i < num; i++) { + texture->layers.data[i].alpha = extra->alphas[i]; + } + for (size_t i = 0, num = ufbxi_min_sz(extra->num_blend_modes, texture->layers.count); i < num; i++) { + int32_t mode = extra->blend_modes[i]; + if (mode >= 0 && mode < UFBX_BLEND_OVERLAY) { + texture->layers.data[i].blend_mode = (ufbx_blend_mode)mode; + } + } + } + } + + ufbxi_check(ufbxi_insert_texture_file(uc, texture)); + } + + ufbxi_propagate_main_textures(&uc->scene); + ufbxi_check(ufbxi_pop_texture_files(uc)); + + // Second pass to fetch material maps + ufbxi_for_ptr_list(ufbx_material, p_material, uc->scene.materials) { + ufbx_material *material = *p_material; + + ufbxi_check(ufbxi_sort_material_textures(uc, material->textures.data, material->textures.count)); + ufbxi_fetch_maps(&uc->scene, material); + + // Fetch `ufbx_material_texture.shader_prop` names + if (material->shader) { + ufbxi_for_ptr_list(ufbx_shader_binding, p_binding, material->shader->bindings) { + ufbx_shader_binding *binding = *p_binding; + + ufbxi_for_list(ufbx_shader_prop_binding, prop, binding->prop_bindings) { + ufbx_string name = prop->material_prop; + + size_t index = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_material_texture, 4, &index, material->textures.data, 0, material->textures.count, + ( ufbxi_str_less(a->material_prop, name) ), ( a->material_prop.data == name.data )); + for (; index < material->textures.count && material->textures.data[index].shader_prop.data == name.data; index++) { + material->textures.data[index].shader_prop = prop->shader_prop; + } + } + } + } + } + + ufbxi_for_ptr_list(ufbx_display_layer, p_layer, uc->scene.display_layers) { + ufbx_display_layer *layer = *p_layer; + ufbxi_check(ufbxi_fetch_dst_elements(uc, &layer->nodes, &layer->element, false, NULL, UFBX_ELEMENT_NODE)); + } + + ufbxi_for_ptr_list(ufbx_selection_set, p_set, uc->scene.selection_sets) { + ufbx_selection_set *set = *p_set; + ufbxi_check(ufbxi_fetch_dst_elements(uc, &set->nodes, &set->element, false, NULL, UFBX_ELEMENT_SELECTION_NODE)); + } + + ufbxi_for_ptr_list(ufbx_selection_node, p_node, uc->scene.selection_nodes) { + ufbx_selection_node *node = *p_node; + node->target_node = (ufbx_node*)ufbxi_fetch_dst_element(&node->element, false, NULL, UFBX_ELEMENT_NODE); + node->target_mesh = (ufbx_mesh*)ufbxi_fetch_dst_element(&node->element, false, NULL, UFBX_ELEMENT_MESH); + if (!node->target_mesh && node->target_node) { + node->target_mesh = node->target_node->mesh; + } else if (!node->target_node && node->target_mesh && node->target_mesh->instances.count > 0) { + node->target_node = node->target_mesh->instances.data[0]; + } + + ufbx_mesh *mesh = node->target_mesh; + if (mesh) { + ufbxi_check(ufbxi_validate_indices(uc, &node->vertices, mesh->num_vertices)); + ufbxi_check(ufbxi_validate_indices(uc, &node->edges, mesh->num_edges)); + ufbxi_check(ufbxi_validate_indices(uc, &node->faces, mesh->num_faces)); + } + } + + ufbxi_for_ptr_list(ufbx_constraint, p_constraint, uc->scene.constraints) { + ufbx_constraint *constraint = *p_constraint; + + size_t tmp_base = uc->tmp_stack.num_items; + + // Find property connections in _both_ src and dst connections as they are inconsistent + // in pre-7000 files. For example "Constrained Object" is a "PO" connection in 6100. + ufbxi_for_list(ufbx_connection, conn, constraint->element.connections_src) { + if (conn->src_prop.length == 0 || conn->dst->type != UFBX_ELEMENT_NODE) continue; + ufbxi_check(ufbxi_add_constraint_prop(uc, constraint, (ufbx_node*)conn->dst, conn->src_prop.data)); + } + ufbxi_for_list(ufbx_connection, conn, constraint->element.connections_dst) { + if (conn->dst_prop.length == 0 || conn->src->type != UFBX_ELEMENT_NODE) continue; + ufbxi_check(ufbxi_add_constraint_prop(uc, constraint, (ufbx_node*)conn->src, conn->dst_prop.data)); + } + + size_t num_targets = uc->tmp_stack.num_items - tmp_base; + constraint->targets.count = num_targets; + constraint->targets.data = ufbxi_push_pop(&uc->result, &uc->tmp_stack, ufbx_constraint_target, num_targets); + ufbxi_check(constraint->targets.data); + } + + if (uc->scene.anim_stacks.count > 0) { + // Combine all animation stacks into one + size_t num_layers = 0; + ufbxi_for_ptr_list(ufbx_anim_stack, p_stack, uc->scene.anim_stacks) { + num_layers += (*p_stack)->layers.count; + } + + ufbx_anim_layer_desc *descs = ufbxi_push_zero(&uc->result, ufbx_anim_layer_desc, num_layers); + ufbxi_check(descs); + uc->scene.combined_anim.layers.data = descs; + uc->scene.combined_anim.layers.count = num_layers; + + ufbx_anim_layer_desc *desc = descs; + ufbxi_for_ptr_list(ufbx_anim_stack, p_stack, uc->scene.anim_stacks) { + ufbx_anim_stack *stack = *p_stack; + + ufbxi_for_ptr_list(ufbx_anim_layer, p_layer, stack->layers) { + desc->layer = *p_layer; + desc->weight = 1.0f; + desc++; + } + } + } + + ufbxi_for_ptr_list(ufbx_lod_group, p_lod, uc->scene.lod_groups) { + ufbxi_check(ufbxi_finalize_lod_group(uc, *p_lod)); + } + + ufbxi_check(ufbxi_fetch_file_textures(uc)); + ufbxi_check(ufbxi_handle_geometry_transforms(uc)); + ufbxi_postprocess_scene(uc); + + uc->scene.metadata.ktime_to_sec = uc->ktime_to_sec; + + // Maya seems to use scale of 100/3, Blender binary uses exactly 33, ASCII has always value of 1.0 + if (uc->version < 6000) { + uc->scene.metadata.bone_prop_size_unit = 1.0f; + } else if (uc->exporter == UFBX_EXPORTER_BLENDER_BINARY) { + uc->scene.metadata.bone_prop_size_unit = 33.0f; + } else if (uc->exporter == UFBX_EXPORTER_BLENDER_ASCII) { + uc->scene.metadata.bone_prop_size_unit = 1.0f; + } else { + uc->scene.metadata.bone_prop_size_unit = (ufbx_real)(100.0/3.0); + } + if (uc->exporter == UFBX_EXPORTER_BLENDER_ASCII) { + uc->scene.metadata.bone_prop_limb_length_relative = false; + } else { + uc->scene.metadata.bone_prop_limb_length_relative = true; + } + + return 1; +} + +// -- Interpret the read scene + +static ufbxi_forceinline void ufbxi_add_translate(ufbx_transform *t, ufbx_vec3 v) +{ + t->translation.x += v.x; + t->translation.y += v.y; + t->translation.z += v.z; +} + +static ufbxi_forceinline void ufbxi_sub_translate(ufbx_transform *t, ufbx_vec3 v) +{ + t->translation.x -= v.x; + t->translation.y -= v.y; + t->translation.z -= v.z; +} + +static ufbxi_forceinline void ufbxi_mul_scale(ufbx_transform *t, ufbx_vec3 v) +{ + t->translation.x *= v.x; + t->translation.y *= v.y; + t->translation.z *= v.z; + t->scale.x *= v.x; + t->scale.y *= v.y; + t->scale.z *= v.z; +} + +static ufbxi_forceinline ufbx_quat ufbxi_mul_quat(ufbx_quat a, ufbx_quat b) +{ + ufbx_quat r; + r.x = a.w*b.x + a.x*b.w + a.y*b.z - a.z*b.y; + r.y = a.w*b.y - a.x*b.z + a.y*b.w + a.z*b.x; + r.z = a.w*b.z + a.x*b.y - a.y*b.x + a.z*b.w; + r.w = a.w*b.w - a.x*b.x - a.y*b.y - a.z*b.z; + return r; +} + +static ufbxi_forceinline void ufbxi_add_weighted_vec3(ufbx_vec3 *r, ufbx_vec3 b, ufbx_real w) +{ + r->x += b.x * w; + r->y += b.y * w; + r->z += b.z * w; +} + +static ufbxi_forceinline void ufbxi_add_weighted_quat(ufbx_quat *r, ufbx_quat b, ufbx_real w) +{ + r->x += b.x * w; + r->y += b.y * w; + r->z += b.z * w; + r->w += b.w * w; +} + +static ufbxi_forceinline void ufbxi_add_weighted_mat(ufbx_matrix *r, const ufbx_matrix *b, ufbx_real w) +{ + ufbxi_add_weighted_vec3(&r->cols[0], b->cols[0], w); + ufbxi_add_weighted_vec3(&r->cols[1], b->cols[1], w); + ufbxi_add_weighted_vec3(&r->cols[2], b->cols[2], w); + ufbxi_add_weighted_vec3(&r->cols[3], b->cols[3], w); +} + +static void ufbxi_mul_rotate(ufbx_transform *t, ufbx_vec3 v, ufbx_rotation_order order) +{ + if (ufbxi_is_vec3_zero(v)) return; + + ufbx_quat q = ufbx_euler_to_quat(v, order); + if (t->rotation.w != 1.0) { + t->rotation = ufbxi_mul_quat(q, t->rotation); + } else { + t->rotation = q; + } + + if (!ufbxi_is_vec3_zero(t->translation)) { + t->translation = ufbx_quat_rotate_vec3(q, t->translation); + } +} + +static void ufbxi_mul_rotate_quat(ufbx_transform *t, ufbx_quat q) +{ + if (ufbxi_is_quat_identity(q)) return; + + if (t->rotation.w != 1.0) { + t->rotation = ufbxi_mul_quat(q, t->rotation); + } else { + t->rotation = q; + } + + if (!ufbxi_is_vec3_zero(t->translation)) { + t->translation = ufbx_quat_rotate_vec3(q, t->translation); + } +} + +static void ufbxi_mul_inv_rotate(ufbx_transform *t, ufbx_vec3 v, ufbx_rotation_order order) +{ + if (ufbxi_is_vec3_zero(v)) return; + + ufbx_quat q = ufbx_euler_to_quat(v, order); + q.x = -q.x; q.y = -q.y; q.z = -q.z; + if (t->rotation.w != 1.0) { + t->rotation = ufbxi_mul_quat(q, t->rotation); + } else { + t->rotation = q; + } + + if (!ufbxi_is_vec3_zero(t->translation)) { + t->translation = ufbx_quat_rotate_vec3(q, t->translation); + } +} + +// -- Updating state from properties + +ufbxi_noinline static ufbx_transform ufbxi_get_geometry_transform(const ufbx_props *props) +{ + ufbx_vec3 translation = ufbxi_find_vec3(props, ufbxi_GeometricTranslation, 0.0f, 0.0f, 0.0f); + ufbx_vec3 rotation = ufbxi_find_vec3(props, ufbxi_GeometricRotation, 0.0f, 0.0f, 0.0f); + ufbx_vec3 scaling = ufbxi_find_vec3(props, ufbxi_GeometricScaling, 1.0f, 1.0f, 1.0f); + + ufbx_transform t = { { 0,0,0 }, { 0,0,0,1 }, { 1,1,1 }}; + + // WorldTransform = ParentWorldTransform * T * R * S * (OT * OR * OS) + + ufbxi_mul_scale(&t, scaling); + ufbxi_mul_rotate(&t, rotation, UFBX_ROTATION_ORDER_XYZ); + ufbxi_add_translate(&t, translation); + + return t; +} + +ufbxi_noinline static ufbx_transform ufbxi_get_transform(const ufbx_props *props, ufbx_rotation_order order, const ufbx_node *node) +{ + ufbx_vec3 scale_pivot = ufbxi_find_vec3(props, ufbxi_ScalingPivot, 0.0f, 0.0f, 0.0f); + ufbx_vec3 rot_pivot = ufbxi_find_vec3(props, ufbxi_RotationPivot, 0.0f, 0.0f, 0.0f); + ufbx_vec3 scale_offset = ufbxi_find_vec3(props, ufbxi_ScalingOffset, 0.0f, 0.0f, 0.0f); + ufbx_vec3 rot_offset = ufbxi_find_vec3(props, ufbxi_RotationOffset, 0.0f, 0.0f, 0.0f); + + ufbx_vec3 translation = ufbxi_find_vec3(props, ufbxi_Lcl_Translation, 0.0f, 0.0f, 0.0f); + ufbx_vec3 rotation = ufbxi_find_vec3(props, ufbxi_Lcl_Rotation, 0.0f, 0.0f, 0.0f); + ufbx_vec3 scaling = ufbxi_find_vec3(props, ufbxi_Lcl_Scaling, 1.0f, 1.0f, 1.0f); + + ufbx_vec3 pre_rotation = ufbxi_find_vec3(props, ufbxi_PreRotation, 0.0f, 0.0f, 0.0f); + ufbx_vec3 post_rotation = ufbxi_find_vec3(props, ufbxi_PostRotation, 0.0f, 0.0f, 0.0f); + + ufbx_transform t = { { 0,0,0 }, { 0,0,0,1 }, { 1,1,1 }}; + + // WorldTransform = ParentWorldTransform * T * Roff * Rp * Rpre * R * Rpost * Rp-1 * Soff * Sp * S * Sp-1 + // NOTE: Rpost is inverted (!) after converting from PostRotation Euler angles + + if (node->has_adjust_transform) { + ufbxi_mul_rotate_quat(&t, node->adjust_post_rotation); + } + + ufbxi_sub_translate(&t, scale_pivot); + ufbxi_mul_scale(&t, scaling); + ufbxi_add_translate(&t, scale_pivot); + + ufbxi_add_translate(&t, scale_offset); + + ufbxi_sub_translate(&t, rot_pivot); + ufbxi_mul_inv_rotate(&t, post_rotation, UFBX_ROTATION_ORDER_XYZ); + ufbxi_mul_rotate(&t, rotation, order); + ufbxi_mul_rotate(&t, pre_rotation, UFBX_ROTATION_ORDER_XYZ); + ufbxi_add_translate(&t, rot_pivot); + + ufbxi_add_translate(&t, rot_offset); + + ufbxi_add_translate(&t, translation); + + if (node->has_adjust_transform) { + ufbxi_mul_rotate_quat(&t, node->adjust_pre_rotation); + ufbxi_mul_scale(&t, node->adjust_pre_scale); + } + + return t; +} + +ufbxi_noinline static ufbx_transform ufbxi_get_texture_transform(const ufbx_props *props) +{ + ufbx_vec3 scale_pivot = ufbxi_find_vec3(props, ufbxi_TextureScalingPivot, 0.0f, 0.0f, 0.0f); + ufbx_vec3 rot_pivot = ufbxi_find_vec3(props, ufbxi_TextureRotationPivot, 0.0f, 0.0f, 0.0f); + + ufbx_vec3 translation = ufbxi_find_vec3(props, ufbxi_Translation, 0.0f, 0.0f, 0.0f); + ufbx_vec3 rotation = ufbxi_find_vec3(props, ufbxi_Rotation, 0.0f, 0.0f, 0.0f); + ufbx_vec3 scaling = ufbxi_find_vec3(props, ufbxi_Scaling, 1.0f, 1.0f, 1.0f); + + ufbx_transform t = { { 0,0,0 }, { 0,0,0,1 }, { 1,1,1 }}; + + ufbxi_sub_translate(&t, scale_pivot); + ufbxi_mul_scale(&t, scaling); + ufbxi_add_translate(&t, scale_pivot); + + ufbxi_sub_translate(&t, rot_pivot); + ufbxi_mul_rotate(&t, rotation, UFBX_ROTATION_ORDER_XYZ); + ufbxi_add_translate(&t, rot_pivot); + + ufbxi_add_translate(&t, translation); + + if (ufbxi_find_int(props, ufbxi_UVSwap, 0) != 0) { + const ufbx_vec3 swap_scale = { -1.0f, 0.0f, 0.0f }; + const ufbx_vec3 swap_rotate = { 0.0f, 0.0f, -90.0f }; + ufbxi_mul_scale(&t, swap_scale); + ufbxi_mul_rotate(&t, swap_rotate, UFBX_ROTATION_ORDER_XYZ); + } + + return t; +} + +ufbxi_noinline static ufbx_transform ufbxi_get_constraint_transform(const ufbx_props *props) +{ + ufbx_vec3 translation = ufbxi_find_vec3(props, ufbxi_Translation, 0.0f, 0.0f, 0.0f); + ufbx_vec3 rotation = ufbxi_find_vec3(props, ufbxi_Rotation, 0.0f, 0.0f, 0.0f); + ufbx_vec3 rotation_offset = ufbxi_find_vec3(props, ufbxi_RotationOffset, 0.0f, 0.0f, 0.0f); + ufbx_vec3 scaling = ufbxi_find_vec3(props, ufbxi_Scaling, 1.0f, 1.0f, 1.0f); + + ufbx_transform t = { { 0,0,0 }, { 0,0,0,1 }, { 1,1,1 }}; + + ufbxi_mul_scale(&t, scaling); + ufbxi_mul_rotate(&t, rotation, UFBX_ROTATION_ORDER_XYZ); + ufbxi_mul_rotate(&t, rotation_offset, UFBX_ROTATION_ORDER_XYZ); + ufbxi_add_translate(&t, translation); + + return t; +} + +ufbxi_noinline static void ufbxi_update_node(ufbx_node *node) +{ + node->rotation_order = (ufbx_rotation_order)ufbxi_find_enum(&node->props, ufbxi_RotationOrder, UFBX_ROTATION_ORDER_XYZ, UFBX_ROTATION_ORDER_SPHERIC); + node->euler_rotation = ufbxi_find_vec3(&node->props, ufbxi_Lcl_Rotation, 0.0f, 0.0f, 0.0f); + + node->inherit_type = (ufbx_inherit_type)ufbxi_find_enum(&node->props, ufbxi_InheritType, UFBX_INHERIT_NORMAL, UFBX_INHERIT_NO_SCALE); + if (!node->is_root) { + node->local_transform = ufbxi_get_transform(&node->props, node->rotation_order, node); + node->geometry_transform = ufbxi_get_geometry_transform(&node->props); + node->node_to_parent = ufbx_transform_to_matrix(&node->local_transform); + } else { + node->geometry_transform = ufbx_identity_transform; + } + + ufbx_node *parent = node->parent; + if (parent) { + node->world_transform.rotation = ufbxi_mul_quat(parent->world_transform.rotation, node->local_transform.rotation); + node->world_transform.translation = ufbx_transform_position(&parent->node_to_world, node->local_transform.translation); + if (node->inherit_type != UFBX_INHERIT_NO_SCALE) { + node->world_transform.scale.x = parent->world_transform.scale.x * node->local_transform.scale.x; + node->world_transform.scale.y = parent->world_transform.scale.y * node->local_transform.scale.y; + node->world_transform.scale.z = parent->world_transform.scale.z * node->local_transform.scale.z; + } else { + node->world_transform.scale = node->local_transform.scale; + } + + if (node->inherit_type == UFBX_INHERIT_NORMAL) { + node->node_to_world = ufbx_matrix_mul(&parent->node_to_world, &node->node_to_parent); + } else { + node->node_to_world = ufbx_transform_to_matrix(&node->world_transform); + } + } else { + node->world_transform = node->local_transform; + node->node_to_world = node->node_to_parent; + } + + if (!ufbxi_is_transform_identity(node->geometry_transform)) { + node->geometry_to_node = ufbx_transform_to_matrix(&node->geometry_transform); + node->geometry_to_world = ufbx_matrix_mul(&node->node_to_world, &node->geometry_to_node); + node->has_geometry_transform = true; + } else { + node->geometry_to_node = ufbx_identity_matrix; + node->geometry_to_world = node->node_to_world; + node->has_geometry_transform = false; + } + + node->visible = ufbxi_find_int(&node->props, ufbxi_Visibility, 1) != 0; +} + +ufbxi_noinline static void ufbxi_update_light(ufbx_light *light) +{ + // NOTE: FBX seems to store intensities 100x of what's specified in at least + // Maya and Blender, should there be a quirks mode to not do this for specific + // exporters. Does the FBX SDK do this transparently as well? + light->intensity = ufbxi_find_real(&light->props, ufbxi_Intensity, (ufbx_real)100.0) / (ufbx_real)100.0; + + light->color = ufbxi_find_vec3(&light->props, ufbxi_Color, 1.0f, 1.0f, 1.0f); + light->type = (ufbx_light_type)ufbxi_find_enum(&light->props, ufbxi_LightType, 0, UFBX_LIGHT_VOLUME); + int64_t default_decay = light->type == UFBX_LIGHT_DIRECTIONAL ? UFBX_LIGHT_DECAY_NONE : UFBX_LIGHT_DECAY_QUADRATIC; + light->decay = (ufbx_light_decay)ufbxi_find_enum(&light->props, ufbxi_DecayType, default_decay, UFBX_LIGHT_DECAY_CUBIC); + light->area_shape = (ufbx_light_area_shape)ufbxi_find_enum(&light->props, ufbxi_AreaLightShape, 0, UFBX_LIGHT_AREA_SHAPE_SPHERE); + light->inner_angle = ufbxi_find_real(&light->props, ufbxi_HotSpot, 0.0f); + light->inner_angle = ufbxi_find_real(&light->props, ufbxi_InnerAngle, light->inner_angle); + light->outer_angle = ufbxi_find_real(&light->props, ufbxi_Cone_angle, 0.0f); + light->outer_angle = ufbxi_find_real(&light->props, ufbxi_ConeAngle, light->outer_angle); + light->outer_angle = ufbxi_find_real(&light->props, ufbxi_OuterAngle, light->outer_angle); + light->cast_light = ufbxi_find_int(&light->props, ufbxi_CastLight, 1) != 0; + light->cast_shadows = ufbxi_find_int(&light->props, ufbxi_CastShadows, 0) != 0; +} + +typedef struct { + // 1/1000 decimal fixed point for size + uint16_t film_size_x, film_size_y; +} ufbxi_aperture_format; + +static const ufbxi_aperture_format ufbxi_aperture_formats[] = { + { 1000, 1000, }, // UFBX_APERTURE_FORMAT_CUSTOM + { 404, 295, }, // UFBX_APERTURE_FORMAT_16MM_THEATRICAL + { 493, 292, }, // UFBX_APERTURE_FORMAT_SUPER_16MM + { 864, 630, }, // UFBX_APERTURE_FORMAT_35MM_ACADEMY + { 816, 612, }, // UFBX_APERTURE_FORMAT_35MM_TV_PROJECTION + { 980, 735, }, // UFBX_APERTURE_FORMAT_35MM_FULL_APERTURE + { 825, 446, }, // UFBX_APERTURE_FORMAT_35MM_185_PROJECTION + { 864, 732, }, // UFBX_APERTURE_FORMAT_35MM_ANAMORPHIC + { 2066, 906, }, // UFBX_APERTURE_FORMAT_70MM_PROJECTION + { 1485, 991, }, // UFBX_APERTURE_FORMAT_VISTAVISION + { 2080, 1480, }, // UFBX_APERTURE_FORMAT_DYNAVISION + { 2772, 2072, }, // UFBX_APERTURE_FORMAT_IMAX +}; + +ufbxi_noinline static void ufbxi_update_camera(ufbx_camera *camera) +{ + camera->projection_mode = (ufbx_projection_mode)ufbxi_find_enum(&camera->props, ufbxi_CameraProjectionType, 0, UFBX_PROJECTION_MODE_ORTHOGRAPHIC); + camera->aspect_mode = (ufbx_aspect_mode)ufbxi_find_enum(&camera->props, ufbxi_AspectRatioMode, 0, UFBX_ASPECT_MODE_FIXED_HEIGHT); + camera->aperture_mode = (ufbx_aperture_mode)ufbxi_find_enum(&camera->props, ufbxi_ApertureMode, UFBX_APERTURE_MODE_VERTICAL, UFBX_APERTURE_MODE_FOCAL_LENGTH); + camera->aperture_format = (ufbx_aperture_format)ufbxi_find_enum(&camera->props, ufbxi_ApertureFormat, UFBX_APERTURE_FORMAT_CUSTOM, UFBX_APERTURE_FORMAT_IMAX); + camera->gate_fit = (ufbx_gate_fit)ufbxi_find_enum(&camera->props, ufbxi_GateFit, 0, UFBX_GATE_FIT_STRETCH); + + camera->near_plane = ufbxi_find_real(&camera->props, ufbxi_NearPlane, 0.0f); + camera->far_plane = ufbxi_find_real(&camera->props, ufbxi_FarPlane, 0.0f); + + // Search both W/H and Width/Height but prefer the latter + ufbx_real aspect_x = ufbxi_find_real(&camera->props, ufbxi_AspectW, 0.0f); + ufbx_real aspect_y = ufbxi_find_real(&camera->props, ufbxi_AspectH, 0.0f); + aspect_x = ufbxi_find_real(&camera->props, ufbxi_AspectWidth, aspect_x); + aspect_y = ufbxi_find_real(&camera->props, ufbxi_AspectHeight, aspect_y); + + ufbx_real fov = ufbxi_find_real(&camera->props, ufbxi_FieldOfView, 0.0f); + ufbx_real fov_x = ufbxi_find_real(&camera->props, ufbxi_FieldOfViewX, 0.0f); + ufbx_real fov_y = ufbxi_find_real(&camera->props, ufbxi_FieldOfViewY, 0.0f); + + ufbx_real focal_length = ufbxi_find_real(&camera->props, ufbxi_FocalLength, 0.0f); + ufbx_real ortho_extent = (ufbx_real)30.0 * ufbxi_find_real(&camera->props, ufbxi_OrthoZoom, 1.0f); + + ufbxi_aperture_format format = ufbxi_aperture_formats[camera->aperture_format]; + ufbx_vec2 film_size = { (ufbx_real)format.film_size_x * (ufbx_real)0.001, (ufbx_real)format.film_size_y * (ufbx_real)0.001 }; + ufbx_real squeeze_ratio = camera->aperture_format == UFBX_APERTURE_FORMAT_35MM_ANAMORPHIC ? 2.0f : 1.0f; + + film_size.x = ufbxi_find_real(&camera->props, ufbxi_FilmWidth, film_size.x); + film_size.y = ufbxi_find_real(&camera->props, ufbxi_FilmHeight, film_size.y); + squeeze_ratio = ufbxi_find_real(&camera->props, ufbxi_FilmSqueezeRatio, squeeze_ratio); + + if (aspect_x <= 0.0f && aspect_y <= 0.0f) { + aspect_x = film_size.x > 0.0f ? film_size.x : 1.0f; + aspect_y = film_size.y > 0.0f ? film_size.y : 1.0f; + } else if (aspect_x <= 0.0f) { + if (film_size.x > 0.0f && film_size.y > 0.0f) { + aspect_x = aspect_y / film_size.y * film_size.x; + } else { + aspect_x = aspect_y; + } + } else if (aspect_y <= 0.0f) { + if (film_size.x > 0.0f && film_size.y > 0.0f) { + aspect_y = aspect_x / film_size.x * film_size.y; + } else { + aspect_y = aspect_x; + } + } + + film_size.y *= squeeze_ratio; + + camera->focal_length_mm = focal_length; + camera->film_size_inch = film_size; + camera->squeeze_ratio = squeeze_ratio; + camera->orthographic_extent = ortho_extent; + + switch (camera->aspect_mode) { + case UFBX_ASPECT_MODE_WINDOW_SIZE: + case UFBX_ASPECT_MODE_FIXED_RATIO: + camera->resolution_is_pixels = false; + camera->resolution.x = aspect_x; + camera->resolution.y = aspect_y; + break; + case UFBX_ASPECT_MODE_FIXED_RESOLUTION: + camera->resolution_is_pixels = true; + camera->resolution.x = aspect_x; + camera->resolution.y = aspect_y; + break; + case UFBX_ASPECT_MODE_FIXED_WIDTH: + camera->resolution_is_pixels = true; + camera->resolution.x = aspect_x; + camera->resolution.y = aspect_x * aspect_y; + break; + case UFBX_ASPECT_MODE_FIXED_HEIGHT: + camera->resolution_is_pixels = true; + camera->resolution.x = aspect_y * aspect_x; + camera->resolution.y = aspect_y; + break; + default: + ufbx_assert(0 && "Unexpected aspect mode"); + break; + } + + ufbx_real aspect_ratio = camera->resolution.x / camera->resolution.y; + ufbx_real film_ratio = film_size.x / film_size.y; + + camera->aspect_ratio = aspect_ratio; + + ufbx_gate_fit effective_fit = camera->gate_fit; + if (effective_fit == UFBX_GATE_FIT_FILL) { + effective_fit = aspect_ratio > film_ratio ? UFBX_GATE_FIT_HORIZONTAL : UFBX_GATE_FIT_VERTICAL; + } else if (effective_fit == UFBX_GATE_FIT_OVERSCAN) { + effective_fit = aspect_ratio < film_ratio ? UFBX_GATE_FIT_HORIZONTAL : UFBX_GATE_FIT_VERTICAL; + } + + switch (effective_fit) { + case UFBX_GATE_FIT_NONE: + camera->aperture_size_inch = camera->film_size_inch; + camera->orthographic_size.x = ortho_extent; + camera->orthographic_size.y = ortho_extent; + break; + case UFBX_GATE_FIT_VERTICAL: + camera->aperture_size_inch.x = camera->film_size_inch.y * aspect_ratio; + camera->aperture_size_inch.y = camera->film_size_inch.y; + camera->orthographic_size.x = ortho_extent * aspect_ratio; + camera->orthographic_size.y = ortho_extent; + break; + case UFBX_GATE_FIT_HORIZONTAL: + camera->aperture_size_inch.x = camera->film_size_inch.x; + camera->aperture_size_inch.y = camera->film_size_inch.x / aspect_ratio; + camera->orthographic_size.x = ortho_extent; + camera->orthographic_size.y = ortho_extent / aspect_ratio; + break; + case UFBX_GATE_FIT_FILL: + case UFBX_GATE_FIT_OVERSCAN: + camera->aperture_size_inch = camera->film_size_inch; + camera->orthographic_size.x = ortho_extent; + camera->orthographic_size.y = ortho_extent; + ufbx_assert(0 && "Unreachable, set to vertical/horizontal above"); + break; + case UFBX_GATE_FIT_STRETCH: + camera->aperture_size_inch = camera->film_size_inch; + camera->orthographic_size.x = ortho_extent; + camera->orthographic_size.y = ortho_extent; + // TODO: Not sure what to do here... + break; + default: + ufbx_assert(0 && "Unexpected gate fit"); + break; + } + + switch (camera->aperture_mode) { + case UFBX_APERTURE_MODE_HORIZONTAL_AND_VERTICAL: + camera->field_of_view_deg.x = fov_x; + camera->field_of_view_deg.y = fov_y; + camera->field_of_view_tan.x = (ufbx_real)ufbx_tan((double)(fov_x * (UFBXI_DEG_TO_RAD * 0.5f))); + camera->field_of_view_tan.y = (ufbx_real)ufbx_tan((double)(fov_y * (UFBXI_DEG_TO_RAD * 0.5f))); + break; + case UFBX_APERTURE_MODE_HORIZONTAL: + camera->field_of_view_deg.x = fov; + camera->field_of_view_tan.x = (ufbx_real)ufbx_tan((double)(fov * (UFBXI_DEG_TO_RAD * 0.5f))); + camera->field_of_view_tan.y = camera->field_of_view_tan.x / aspect_ratio; + camera->field_of_view_deg.y = (ufbx_real)ufbx_atan((double)camera->field_of_view_tan.y) * UFBXI_RAD_TO_DEG * 2.0f; + break; + case UFBX_APERTURE_MODE_VERTICAL: + camera->field_of_view_deg.y = fov; + camera->field_of_view_tan.y = (ufbx_real)ufbx_tan((double)(fov * (UFBXI_DEG_TO_RAD * 0.5f))); + camera->field_of_view_tan.x = camera->field_of_view_tan.y * aspect_ratio; + camera->field_of_view_deg.x = (ufbx_real)ufbx_atan((double)camera->field_of_view_tan.x) * UFBXI_RAD_TO_DEG * 2.0f; + break; + case UFBX_APERTURE_MODE_FOCAL_LENGTH: + camera->field_of_view_tan.x = camera->aperture_size_inch.x / (camera->focal_length_mm * UFBXI_MM_TO_INCH) * 0.5f; + camera->field_of_view_tan.y = camera->aperture_size_inch.y / (camera->focal_length_mm * UFBXI_MM_TO_INCH) * 0.5f; + camera->field_of_view_deg.x = (ufbx_real)ufbx_atan((double)camera->field_of_view_tan.x) * UFBXI_RAD_TO_DEG * 2.0f; + camera->field_of_view_deg.y = (ufbx_real)ufbx_atan((double)camera->field_of_view_tan.y) * UFBXI_RAD_TO_DEG * 2.0f; + break; + default: + ufbx_assert(0 && "Unexpected aperture mode"); + break; + } + + if (camera->projection_mode == UFBX_PROJECTION_MODE_PERSPECTIVE) { + camera->projection_plane = camera->field_of_view_tan; + } else { + camera->projection_plane = camera->orthographic_size; + } +} + +ufbxi_noinline static void ufbxi_update_bone(ufbx_scene *scene, ufbx_bone *bone) +{ + ufbx_real unit = scene->metadata.bone_prop_size_unit; + + bone->radius = ufbxi_find_real(&bone->props, ufbxi_Size, unit) / unit; + if (scene->metadata.bone_prop_limb_length_relative) { + bone->relative_length = ufbxi_find_real(&bone->props, ufbxi_LimbLength, 1.0f); + } else { + bone->relative_length = 1.0f; + } +} + +ufbxi_noinline static void ufbxi_update_line_curve(ufbx_line_curve *line) +{ + line->color = ufbxi_find_vec3(&line->props, ufbxi_Color, 1.0f, 1.0f, 1.0f); +} + +ufbxi_noinline static void ufbxi_update_skin_cluster(ufbx_skin_cluster *cluster) +{ + if (cluster->bone_node) { + cluster->geometry_to_world = ufbx_matrix_mul(&cluster->bone_node->node_to_world, &cluster->geometry_to_bone); + } else { + cluster->geometry_to_world = ufbx_matrix_mul(&cluster->bind_to_world, &cluster->geometry_to_bone); + } + cluster->geometry_to_world_transform = ufbx_matrix_to_transform(&cluster->geometry_to_world); +} + +ufbxi_noinline static void ufbxi_update_blend_channel(ufbx_blend_channel *channel) +{ + ufbx_real weight = ufbxi_find_real(&channel->props, ufbxi_DeformPercent, 0.0f) * (ufbx_real)0.01; + channel->weight = weight; + + ptrdiff_t num_keys = (ptrdiff_t)channel->keyframes.count; + if (num_keys > 0) { + ufbx_blend_keyframe *keys = channel->keyframes.data; + + // Reset the effective weights to zero and find the split around zero + ptrdiff_t last_negative = -1; + for (ptrdiff_t i = 0; i < num_keys; i++) { + keys[i].effective_weight = (ufbx_real)0.0; + if (keys[i].target_weight < 0.0) last_negative = i; + } + + // Find either the next or last keyframe away from zero + ufbx_blend_keyframe zero_key = { NULL }; + ufbx_blend_keyframe *prev = &zero_key, *next = &zero_key; + if (weight > 0.0) { + if (last_negative >= 0) prev = &keys[last_negative]; + for (ptrdiff_t i = last_negative + 1; i < num_keys; i++) { + prev = next; + next = &keys[i]; + if (next->target_weight > weight) break; + } + } else { + if (last_negative + 1 < num_keys) prev = &keys[last_negative + 1]; + for (ptrdiff_t i = last_negative; i >= 0; i--) { + prev = next; + next = &keys[i]; + if (next->target_weight < weight) break; + } + } + + // Linearly interpolate between the endpoints with the weight + ufbx_real delta = next->target_weight - prev->target_weight; + if (delta != 0.0) { + ufbx_real t = (weight - prev->target_weight) / delta; + prev->effective_weight = 1.0f - t; + next->effective_weight = t; + } + } +} + +ufbxi_noinline static void ufbxi_update_material(ufbx_scene *scene, ufbx_material *material) +{ + if (material->props.num_animated > 0) { + ufbxi_fetch_maps(scene, material); + } +} + +ufbxi_noinline static void ufbxi_update_texture(ufbx_texture *texture) +{ + texture->uv_transform = ufbxi_get_texture_transform(&texture->props); + if (!ufbxi_is_transform_identity(texture->uv_transform)) { + texture->has_uv_transform = true; + texture->texture_to_uv = ufbx_transform_to_matrix(&texture->uv_transform); + texture->uv_to_texture = ufbx_matrix_invert(&texture->texture_to_uv); + } else { + texture->has_uv_transform = false; + texture->texture_to_uv = ufbx_identity_matrix; + texture->uv_to_texture = ufbx_identity_matrix; + } + texture->wrap_u = (ufbx_wrap_mode)ufbxi_find_enum(&texture->props, ufbxi_WrapModeU, 0, UFBX_WRAP_CLAMP); + texture->wrap_v = (ufbx_wrap_mode)ufbxi_find_enum(&texture->props, ufbxi_WrapModeV, 0, UFBX_WRAP_CLAMP); + + if (texture->shader) { + ufbxi_update_shader_texture(texture, texture->shader); + } +} + +ufbxi_noinline static void ufbxi_update_anim_stack(ufbx_scene *scene, ufbx_anim_stack *stack) +{ + ufbx_prop *begin, *end; + begin = ufbxi_find_prop(&stack->props, ufbxi_LocalStart); + end = ufbxi_find_prop(&stack->props, ufbxi_LocalStop); + if (begin && end) { + stack->time_begin = (double)begin->value_int * scene->metadata.ktime_to_sec; + stack->time_end = (double)end->value_int * scene->metadata.ktime_to_sec; + } else { + begin = ufbxi_find_prop(&stack->props, ufbxi_ReferenceStart); + end = ufbxi_find_prop(&stack->props, ufbxi_ReferenceStop); + if (begin && end) { + stack->time_begin = (double)begin->value_int * scene->metadata.ktime_to_sec; + stack->time_end = (double)end->value_int * scene->metadata.ktime_to_sec; + } + } + + stack->anim.time_begin = stack->time_begin; + stack->anim.time_end = stack->time_end; +} + +ufbxi_noinline static void ufbxi_update_display_layer(ufbx_display_layer *layer) +{ + layer->visible = ufbxi_find_int(&layer->props, ufbxi_Show, 1) != 0; + layer->frozen = ufbxi_find_int(&layer->props, ufbxi_Freeze, 1) != 0; + layer->ui_color = ufbxi_find_vec3(&layer->props, ufbxi_Color, 0.8f, 0.8f, 0.8f); +} + +ufbxi_noinline static void ufbxi_find_bool3(bool *dst, ufbx_props *props, const char *name, bool default_value) +{ + size_t name_len = strlen(name); + char local[64]; + ufbx_assert(name_len < sizeof(local) - 2); + memcpy(local, name, name_len); + + size_t local_len = name_len + 1; + local[local_len] = '\0'; + + int64_t def = default_value ? 1 : 0; + local[name_len] = 'X'; + dst[0] = ufbx_find_int_len(props, local, local_len, def) != 0; + local[name_len] = 'Y'; + dst[1] = ufbx_find_int_len(props, local, local_len, def) != 0; + local[name_len] = 'Z'; + dst[2] = ufbx_find_int_len(props, local, local_len, def) != 0; +} + +ufbxi_noinline static void ufbxi_update_constraint(ufbx_constraint *constraint) +{ + ufbx_props *props = &constraint->props; + ufbx_constraint_type constraint_type = constraint->type; + + constraint->transform_offset = ufbxi_get_constraint_transform(props); + + constraint->weight = ufbxi_find_real(props, ufbxi_Weight, (ufbx_real)100.0) / (ufbx_real)100.0; + + ufbxi_for_list(ufbx_constraint_target, target, constraint->targets) { + ufbx_node *node = target->node; + + ufbx_real weight_scale = (ufbx_real)100.0; + if (constraint_type == UFBX_CONSTRAINT_SINGLE_CHAIN_IK) { + // IK weights seem to be not scaled 100x? + weight_scale = (ufbx_real)1.0; + } + + ufbx_prop *prop; + ufbx_string parts[2]; + parts[0] = node->name; + parts[1] = ufbxi_str_c(".Weight"); + prop = ufbx_find_prop_concat(props, parts, 2); + target->weight = (prop ? prop->value_real : weight_scale) / weight_scale; + + if (constraint_type == UFBX_CONSTRAINT_PARENT) { + parts[1] = ufbxi_str_c(".Offset T"); + prop = ufbx_find_prop_concat(props, parts, 2); + ufbx_vec3 t = prop ? prop->value_vec3 : ufbx_zero_vec3; + parts[1] = ufbxi_str_c(".Offset R"); + prop = ufbx_find_prop_concat(props, parts, 2); + ufbx_vec3 r = prop ? prop->value_vec3 : ufbx_zero_vec3; + parts[1] = ufbxi_str_c(".Offset S"); + prop = ufbx_find_prop_concat(props, parts, 2); + ufbx_vec3 s = prop ? prop->value_vec3 : ufbxi_one_vec3; + + target->transform.translation = t; + target->transform.rotation = ufbx_euler_to_quat(r, UFBX_ROTATION_ORDER_XYZ); + target->transform.scale = s; + } + } + + constraint->active = ufbx_find_int(props, "Active", 1) != 0; + if (constraint_type == UFBX_CONSTRAINT_AIM) { + ufbxi_find_bool3(constraint->constrain_rotation, props, "Affect", 1); + + const ufbx_vec3 default_aim = { 1.0f, 0.0f, 0.0f }; + const ufbx_vec3 default_up = { 0.0f, 1.0f, 0.0f }; + + int64_t up_type = ufbx_find_int(props, "WorldUpType", 0); + if (up_type >= 0 && up_type < UFBX_CONSTRAINT_AIM_UP_NONE) { + constraint->aim_up_type = (ufbx_constraint_aim_up_type)up_type; + } + constraint->aim_vector = ufbx_find_vec3(props, "AimVector", default_aim); + constraint->aim_up_vector = ufbx_find_vec3(props, "UpVector", default_up); + + } else if (constraint_type == UFBX_CONSTRAINT_PARENT) { + ufbxi_find_bool3(constraint->constrain_translation, props, "AffectTranslation", 1); + ufbxi_find_bool3(constraint->constrain_rotation, props, "AffectRotation", 1); + ufbxi_find_bool3(constraint->constrain_scale, props, "AffectScale", 0); + } else if (constraint_type == UFBX_CONSTRAINT_POSITION) { + ufbxi_find_bool3(constraint->constrain_translation, props, "Affect", 1); + } else if (constraint_type == UFBX_CONSTRAINT_ROTATION) { + ufbxi_find_bool3(constraint->constrain_rotation, props, "Affect", 1); + } else if (constraint_type == UFBX_CONSTRAINT_SCALE) { + ufbxi_find_bool3(constraint->constrain_scale, props, "Affect", 1); + } else if (constraint_type == UFBX_CONSTRAINT_SINGLE_CHAIN_IK) { + constraint->constrain_rotation[0] = true; + constraint->constrain_rotation[1] = true; + constraint->constrain_rotation[2] = true; + constraint->ik_pole_vector = ufbx_find_vec3(props, "PoleVectorType", ufbx_zero_vec3); + } +} + +ufbxi_noinline static void ufbxi_update_anim(ufbx_scene *scene) +{ + if (scene->anim_stacks.count > 0) { + scene->anim = scene->anim_stacks.data[0]->anim; + + scene->combined_anim.time_begin = scene->anim.time_begin; + scene->combined_anim.time_end = scene->anim.time_end; + + ufbxi_for_ptr_list(ufbx_anim_stack, p_stack, scene->anim_stacks) { + ufbx_anim_stack *stack = *p_stack; + + if (stack->time_begin < scene->combined_anim.time_begin) scene->combined_anim.time_begin = stack->time_begin; + if (stack->time_end > scene->combined_anim.time_end) scene->combined_anim.time_end = stack->time_end; + } + } +} + +ufbxi_noinline static void ufbxi_update_initial_clusters(ufbx_scene *scene) +{ + ufbxi_for_ptr_list(ufbx_skin_cluster, p_cluster, scene->skin_clusters) { + ufbx_skin_cluster *cluster = *p_cluster; + cluster->geometry_to_bone = cluster->mesh_node_to_bone; + } + + // Patch initial `mesh_node_to_bone` + ufbxi_for_ptr_list(ufbx_skin_cluster, p_cluster, scene->skin_clusters) { + ufbx_skin_cluster *cluster = *p_cluster; + + ufbx_skin_deformer *skin = (ufbx_skin_deformer*)ufbxi_fetch_src_element(&cluster->element, false, NULL, UFBX_ELEMENT_SKIN_DEFORMER); + if (!skin) continue; + + ufbx_node *node = (ufbx_node*)ufbxi_fetch_src_element(&skin->element, false, NULL, UFBX_ELEMENT_NODE); + if (!node) { + ufbx_mesh *mesh = (ufbx_mesh*)ufbxi_fetch_src_element(&skin->element, false, NULL, UFBX_ELEMENT_MESH); + if (mesh && mesh->instances.count > 0) { + node = mesh->instances.data[0]; + } + } + if (!node) continue; + + // Normalize to the non-helper node + if (node->is_geometry_transform_helper) { + node = node->parent; + } + + if (ufbxi_matrix_all_zero(&cluster->mesh_node_to_bone)) { + ufbx_matrix world_to_bind = ufbx_matrix_invert(&cluster->bind_to_world); + cluster->mesh_node_to_bone = ufbx_matrix_mul(&world_to_bind, &node->node_to_world); + } + + // HACK: Account for geometry transforms by looking at the transform of the + // helper node if one is present. I don't think this is exactly how the skinning + // matrices are formed. + // TODO: Add a test with moving the skinned mesh root around. + if (node->geometry_transform_helper) { + ufbx_node *geo_node = node->geometry_transform_helper; + cluster->geometry_to_bone = ufbx_matrix_mul(&cluster->mesh_node_to_bone, &geo_node->node_to_parent); + } else if (node->has_geometry_transform) { + cluster->geometry_to_bone = ufbx_matrix_mul(&cluster->mesh_node_to_bone, &node->geometry_to_node); + } else { + cluster->geometry_to_bone = cluster->mesh_node_to_bone; + } + } +} + +ufbxi_noinline static ufbx_coordinate_axis ufbxi_find_axis(const ufbx_props *props, const char *axis_name, const char *sign_name) +{ + int64_t axis = ufbxi_find_int(props, axis_name, 3); + int64_t sign = ufbxi_find_int(props, sign_name, 2); + + switch (axis) { + case 0: return sign > 0 ? UFBX_COORDINATE_AXIS_POSITIVE_X : UFBX_COORDINATE_AXIS_NEGATIVE_X; + case 1: return sign > 0 ? UFBX_COORDINATE_AXIS_POSITIVE_Y : UFBX_COORDINATE_AXIS_NEGATIVE_Y; + case 2: return sign > 0 ? UFBX_COORDINATE_AXIS_POSITIVE_Z : UFBX_COORDINATE_AXIS_NEGATIVE_Z; + default: return UFBX_COORDINATE_AXIS_UNKNOWN; + } +} + +static const ufbx_real ufbxi_time_mode_fps[] = { + 24.0f, // UFBX_TIME_MODE_DEFAULT + 120.0f, // UFBX_TIME_MODE_120_FPS + 100.0f, // UFBX_TIME_MODE_100_FPS + 60.0f, // UFBX_TIME_MODE_60_FPS + 50.0f, // UFBX_TIME_MODE_50_FPS + 48.0f, // UFBX_TIME_MODE_48_FPS + 30.0f, // UFBX_TIME_MODE_30_FPS + 30.0f, // UFBX_TIME_MODE_30_FPS_DROP + 29.97f, // UFBX_TIME_MODE_NTSC_DROP_FRAME + 29.97f, // UFBX_TIME_MODE_NTSC_FULL_FRAME + 25.0f, // UFBX_TIME_MODE_PAL + 24.0f, // UFBX_TIME_MODE_24_FPS + 1000.0f, // UFBX_TIME_MODE_1000_FPS + 23.976f, // UFBX_TIME_MODE_FILM_FULL_FRAME + 24.0f, // UFBX_TIME_MODE_CUSTOM + 96.0f, // UFBX_TIME_MODE_96_FPS + 72.0f, // UFBX_TIME_MODE_72_FPS + 59.94f, // UFBX_TIME_MODE_59_94_FPS +}; + +// Returns whether a non-identity matrix was needed +static ufbxi_noinline bool ufbxi_axis_matrix(ufbx_matrix *mat, ufbx_coordinate_axes src, ufbx_coordinate_axes dst) +{ + uint32_t src_x = (uint32_t)src.right; + uint32_t dst_x = (uint32_t)dst.right; + uint32_t src_y = (uint32_t)src.up; + uint32_t dst_y = (uint32_t)dst.up; + uint32_t src_z = (uint32_t)src.front; + uint32_t dst_z = (uint32_t)dst.front; + + if (src_x == dst_x && src_y == dst_y && src_z == dst_z) return false; + + // Remap axes (axis enum divided by 2) potentially flipping if the signs (enum parity) doesn't match + memset(mat, 0, sizeof(ufbx_matrix)); + mat->cols[src_x >> 1].v[dst_x >> 1] = ((src_x ^ dst_x) & 1) == 0 ? 1.0f : -1.0f; + mat->cols[src_y >> 1].v[dst_y >> 1] = ((src_y ^ dst_y) & 1) == 0 ? 1.0f : -1.0f; + mat->cols[src_z >> 1].v[dst_z >> 1] = ((src_z ^ dst_z) & 1) == 0 ? 1.0f : -1.0f; + + return true; +} + +ufbxi_noinline static void ufbxi_update_adjust_transforms(ufbxi_context *uc, ufbx_scene *scene) +{ + ufbx_transform root_transform = ufbx_identity_transform; + if (!ufbxi_matrix_all_zero(&uc->axis_matrix)) { + root_transform = ufbx_matrix_to_transform(&uc->axis_matrix); + } + root_transform.scale.x *= uc->unit_scale; + root_transform.scale.y *= uc->unit_scale; + root_transform.scale.z *= uc->unit_scale; + + ufbx_space_conversion conversion = uc->opts.space_conversion; + + ufbx_quat light_post_rotation = ufbx_identity_quat; + ufbx_quat camera_post_rotation = ufbx_identity_quat; + ufbx_vec3 light_direction = { 0.0f, -1.0f, 0.0f }; + bool has_light_transform = false; + bool has_camera_transform = false; + + if (ufbx_coordinate_axes_valid(uc->opts.target_light_axes)) { + ufbx_matrix mat; + ufbx_coordinate_axes light_axes = { + UFBX_COORDINATE_AXIS_POSITIVE_X, + UFBX_COORDINATE_AXIS_NEGATIVE_Z, + UFBX_COORDINATE_AXIS_POSITIVE_Y, + }; + if (ufbxi_axis_matrix(&mat, uc->opts.target_light_axes, light_axes)) { + light_post_rotation = ufbx_matrix_to_transform(&mat).rotation; + + ufbx_matrix inv = ufbx_matrix_invert(&mat); + light_direction = ufbx_transform_direction(&inv, light_direction); + has_light_transform = true; + } + } + + if (ufbx_coordinate_axes_valid(uc->opts.target_camera_axes)) { + ufbx_matrix mat; + ufbx_coordinate_axes camera_axes = { + UFBX_COORDINATE_AXIS_POSITIVE_Z, + UFBX_COORDINATE_AXIS_POSITIVE_Y, + UFBX_COORDINATE_AXIS_NEGATIVE_X, + }; + if (ufbxi_axis_matrix(&mat, uc->opts.target_camera_axes, camera_axes)) { + camera_post_rotation = ufbx_matrix_to_transform(&mat).rotation; + has_camera_transform = true; + } + } + + ufbxi_for_ptr_list(ufbx_light, p_light, scene->lights) { + ufbx_light *light = *p_light; + light->local_direction.x = 0.0f; + light->local_direction.y = -1.0f; + light->local_direction.z = 0.0f; + } + + ufbxi_for_ptr_list(ufbx_node, p_node, scene->nodes) { + ufbx_node *node = *p_node; + + node->adjust_post_rotation = ufbx_identity_quat; + node->adjust_pre_rotation = ufbx_identity_quat; + node->adjust_pre_scale = ufbxi_one_vec3; + + if (conversion == UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS && node->node_depth <= 1 && !node->is_root) { + node->adjust_pre_rotation = root_transform.rotation; + node->adjust_pre_scale = root_transform.scale; + node->has_adjust_transform = true; + } + + if (node->all_attribs.count == 1) { + if (has_light_transform && node->light) { + node->adjust_post_rotation = light_post_rotation; + node->light->local_direction = light_direction; + node->has_adjust_transform = true; + } + if (has_camera_transform && node->camera) { + node->adjust_post_rotation = camera_post_rotation; + node->camera->projection_axes = uc->opts.target_camera_axes; + node->has_adjust_transform = true; + } + } + } +} + +ufbxi_noinline static void ufbxi_update_scene(ufbx_scene *scene, bool initial) +{ + ufbxi_for_ptr_list(ufbx_node, p_node, scene->nodes) { + ufbxi_update_node(*p_node); + } + + ufbxi_for_ptr_list(ufbx_light, p_light, scene->lights) { + ufbxi_update_light(*p_light); + } + + ufbxi_for_ptr_list(ufbx_camera, p_camera, scene->cameras) { + ufbxi_update_camera(*p_camera); + } + + ufbxi_for_ptr_list(ufbx_bone, p_bone, scene->bones) { + ufbxi_update_bone(scene, *p_bone); + } + + ufbxi_for_ptr_list(ufbx_line_curve, p_line, scene->line_curves) { + ufbxi_update_line_curve(*p_line); + } + + if (initial) { + ufbxi_update_initial_clusters(scene); + } + + ufbxi_for_ptr_list(ufbx_skin_cluster, p_cluster, scene->skin_clusters) { + ufbxi_update_skin_cluster(*p_cluster); + } + + ufbxi_for_ptr_list(ufbx_blend_channel, p_channel, scene->blend_channels) { + ufbxi_update_blend_channel(*p_channel); + } + + ufbxi_for_ptr_list(ufbx_texture, p_texture, scene->textures) { + ufbxi_update_texture(*p_texture); + } + + ufbxi_propagate_main_textures(scene); + + ufbxi_for_ptr_list(ufbx_material, p_material, scene->materials) { + ufbxi_update_material(scene, *p_material); + } + + ufbxi_for_ptr_list(ufbx_anim_stack, p_stack, scene->anim_stacks) { + ufbxi_update_anim_stack(scene, *p_stack); + } + + ufbxi_for_ptr_list(ufbx_display_layer, p_layer, scene->display_layers) { + ufbxi_update_display_layer(*p_layer); + } + + ufbxi_for_ptr_list(ufbx_constraint, p_constraint, scene->constraints) { + ufbxi_update_constraint(*p_constraint); + } + + ufbxi_update_anim(scene); +} + +static ufbxi_noinline void ufbxi_update_scene_metadata(ufbx_metadata *metadata) +{ + ufbx_props *props = &metadata->scene_props; + metadata->original_application.vendor = ufbx_find_string(props, "Original|ApplicationVendor", ufbx_empty_string); + metadata->original_application.name = ufbx_find_string(props, "Original|ApplicationName", ufbx_empty_string); + metadata->original_application.version = ufbx_find_string(props, "Original|ApplicationVersion", ufbx_empty_string); + metadata->latest_application.vendor = ufbx_find_string(props, "LastSaved|ApplicationVendor", ufbx_empty_string); + metadata->latest_application.name = ufbx_find_string(props, "LastSaved|ApplicationName", ufbx_empty_string); + metadata->latest_application.version = ufbx_find_string(props, "LastSaved|ApplicationVersion", ufbx_empty_string); +} + +static const ufbx_real ufbxi_pow10_targets[] = { + 0.0f, + (ufbx_real)1e-8, (ufbx_real)1e-7, (ufbx_real)1e-6, (ufbx_real)1e-5, + (ufbx_real)1e-4, (ufbx_real)1e-3, (ufbx_real)1e-2, (ufbx_real)1e-1, + (ufbx_real)1e+0, (ufbx_real)1e+1, (ufbx_real)1e+2, (ufbx_real)1e+3, + (ufbx_real)1e+4, (ufbx_real)1e+5, (ufbx_real)1e+6, (ufbx_real)1e+7, + (ufbx_real)1e+8, (ufbx_real)1e+9, +}; + +static ufbxi_noinline ufbx_real ufbxi_round_if_near(const ufbx_real *targets, size_t num_targets, ufbx_real value) +{ + for (size_t i = 0; i < num_targets; i++) { + double target = targets[i]; + double error = target * 9.5367431640625e-7; + if (error < 0.0) error = -error; + if (error < 7.52316384526264005e-37) error = 7.52316384526264005e-37; + if (value >= target - error && value <= target + error) { + return (ufbx_real)target; + } + } + return value; +} + +static ufbxi_noinline void ufbxi_update_scene_settings(ufbx_scene_settings *settings) +{ + ufbx_real unit_scale_factor = ufbxi_find_real(&settings->props, ufbxi_UnitScaleFactor, 1.0f); + ufbx_real original_unit_scale_factor = ufbxi_find_real(&settings->props, ufbxi_OriginalUnitScaleFactor, unit_scale_factor); + + settings->axes.up = ufbxi_find_axis(&settings->props, ufbxi_UpAxis, ufbxi_UpAxisSign); + settings->axes.front = ufbxi_find_axis(&settings->props, ufbxi_FrontAxis, ufbxi_FrontAxisSign); + settings->axes.right = ufbxi_find_axis(&settings->props, ufbxi_CoordAxis, ufbxi_CoordAxisSign); + settings->unit_meters = ufbxi_round_if_near(ufbxi_pow10_targets, ufbxi_arraycount(ufbxi_pow10_targets), unit_scale_factor * (ufbx_real)0.01); + settings->original_unit_meters = ufbxi_round_if_near(ufbxi_pow10_targets, ufbxi_arraycount(ufbxi_pow10_targets), original_unit_scale_factor * (ufbx_real)0.01); + settings->frames_per_second = ufbxi_find_real(&settings->props, ufbxi_CustomFrameRate, 24.0f); + settings->ambient_color = ufbxi_find_vec3(&settings->props, ufbxi_AmbientColor, 0.0f, 0.0f, 0.0f); + settings->original_axis_up = ufbxi_find_axis(&settings->props, ufbxi_OriginalUpAxis, ufbxi_OriginalUpAxisSign); + + ufbx_prop *default_camera = ufbxi_find_prop(&settings->props, ufbxi_DefaultCamera); + if (default_camera) { + settings->default_camera = default_camera->value_str; + } else { + settings->default_camera = ufbx_empty_string; + } + + settings->time_mode = (ufbx_time_mode)ufbxi_find_enum(&settings->props, ufbxi_TimeMode, UFBX_TIME_MODE_24_FPS, UFBX_TIME_MODE_59_94_FPS); + settings->time_protocol = (ufbx_time_protocol)ufbxi_find_enum(&settings->props, ufbxi_TimeProtocol, UFBX_TIME_PROTOCOL_DEFAULT, UFBX_TIME_PROTOCOL_DEFAULT); + settings->snap_mode = (ufbx_snap_mode)ufbxi_find_enum(&settings->props, ufbxi_SnapOnFrameMode, UFBX_SNAP_MODE_NONE, UFBX_SNAP_MODE_SNAP_AND_PLAY); + + if (settings->time_mode != UFBX_TIME_MODE_CUSTOM) { + settings->frames_per_second = ufbxi_time_mode_fps[settings->time_mode]; + } +} + +// -- Geometry caches + +#if UFBXI_FEATURE_GEOMETRY_CACHE + +typedef struct { + ufbxi_refcount refcount; + ufbx_geometry_cache cache; + uint32_t magic; + bool owned_by_scene; + + ufbxi_allocator ator; + ufbxi_buf result_buf; + ufbxi_buf string_buf; +} ufbxi_geometry_cache_imp; + +ufbx_static_assert(geometry_cache_imp_offset, offsetof(ufbxi_geometry_cache_imp, cache) == sizeof(ufbxi_refcount)); + +typedef struct { + ufbx_string name; + ufbx_string interpretation; + uint32_t sample_rate; + uint32_t start_time; + uint32_t end_time; + uint32_t current_time; + uint32_t consecutive_fails; + bool try_load; +} ufbxi_cache_tmp_channel; + +typedef enum { + UFBXI_CACHE_XML_TYPE_NONE, + UFBXI_CACHE_XML_TYPE_FILE_PER_FRAME, + UFBXI_CACHE_XML_TYPE_SINGLE_FILE, +} ufbxi_cache_xml_type; + +typedef enum { + UFBXI_CACHE_XML_FORMAT_NONE, + UFBXI_CACHE_XML_FORMAT_MCC, + UFBXI_CACHE_XML_FORMAT_MCX, +} ufbxi_cache_xml_format; + +typedef struct { + ufbx_error error; + ufbx_string filename; + bool owned_by_scene; + bool ignore_if_not_found; + + ufbx_geometry_cache_opts opts; + + ufbxi_allocator *ator_tmp; + ufbxi_allocator ator_result; + + ufbxi_buf result; + ufbxi_buf tmp; + ufbxi_buf tmp_stack; + + ufbxi_cache_tmp_channel *channels; + size_t num_channels; + + // Temporary array + char *tmp_arr; + size_t tmp_arr_size; + + ufbxi_string_pool string_pool; + + ufbx_open_file_cb open_file_cb; + + double frames_per_second; + + ufbx_string stream_filename; + ufbx_stream stream; + + bool mc_for8; + + ufbx_string xml_filename; + uint32_t xml_ticks_per_frame; + ufbxi_cache_xml_type xml_type; + ufbxi_cache_xml_format xml_format; + + ufbx_string channel_name; + + char *name_buf; + size_t name_cap; + + uint64_t file_offset; + const char *pos, *pos_end; + + ufbx_geometry_cache cache; + ufbxi_geometry_cache_imp *imp; + + char buffer[128]; +} ufbxi_cache_context; + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_read(ufbxi_cache_context *cc, void *dst, size_t size, bool allow_eof) +{ + size_t buffered = ufbxi_min_sz(ufbxi_to_size(cc->pos_end - cc->pos), size); + memcpy(dst, cc->pos, buffered); + cc->pos += buffered; + size -= buffered; + cc->file_offset += buffered; + if (size == 0) return 1; + dst = (char*)dst + buffered; + + if (size >= sizeof(cc->buffer)) { + size_t num_read = cc->stream.read_fn(cc->stream.user, dst, size); + ufbxi_check_err_msg(&cc->error, num_read <= size, "IO error"); + if (!allow_eof) { + ufbxi_check_err_msg(&cc->error, num_read == size, "Truncated file"); + } + cc->file_offset += num_read; + size -= num_read; + dst = (char*)dst + num_read; + } else { + size_t num_read = cc->stream.read_fn(cc->stream.user, cc->buffer, sizeof(cc->buffer)); + ufbxi_check_err_msg(&cc->error, num_read <= sizeof(cc->buffer), "IO error"); + if (!allow_eof) { + ufbxi_check_err_msg(&cc->error, num_read >= size, "Truncated file"); + } + cc->pos = cc->buffer; + cc->pos_end = cc->buffer + sizeof(cc->buffer); + + memcpy(dst, cc->pos, size); + cc->pos += size; + cc->file_offset += size; + + size_t num_written = ufbxi_min_sz(size, num_read); + size -= num_written; + dst = (char*)dst + num_written; + } + + if (size > 0) { + memset(dst, 0, size); + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_skip(ufbxi_cache_context *cc, uint64_t size) +{ + cc->file_offset += size; + + uint64_t buffered = ufbxi_min64((uint64_t)(cc->pos_end - cc->pos), size); + cc->pos += buffered; + size -= buffered; + + if (cc->stream.skip_fn) { + while (size >= UFBXI_MAX_SKIP_SIZE) { + size -= UFBXI_MAX_SKIP_SIZE; + ufbxi_check_err_msg(&cc->error, cc->stream.skip_fn(cc->stream.user, UFBXI_MAX_SKIP_SIZE - 1), "Truncated file"); + + // Check that we can read at least one byte in case the file is broken + // and causes us to seek indefinitely forwards as `fseek()` does not + // report if we hit EOF... + char single_byte[1]; + size_t num_read = cc->stream.read_fn(cc->stream.user, single_byte, 1); + ufbxi_check_err_msg(&cc->error, num_read <= 1, "IO error"); + ufbxi_check_err_msg(&cc->error, num_read == 1, "Truncated file"); + } + + if (size > 0) { + ufbxi_check_err_msg(&cc->error, cc->stream.skip_fn(cc->stream.user, (size_t)size), "Truncated file"); + } + + } else { + char skip_buf[2048]; + while (size > 0) { + size_t to_skip = (size_t)ufbxi_min64(size, sizeof(skip_buf)); + size -= to_skip; + ufbxi_check_err_msg(&cc->error, cc->stream.read_fn(cc->stream.user, skip_buf, to_skip), "Truncated file"); + } + } + + return 1; +} + +#define ufbxi_cache_mc_tag(a,b,c,d) ((uint32_t)(a)<<24u | (uint32_t)(b)<<16 | (uint32_t)(c)<<8u | (uint32_t)(d)) + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_mc_read_tag(ufbxi_cache_context *cc, uint32_t *p_tag) +{ + char buf[4]; + ufbxi_check_err(&cc->error, ufbxi_cache_read(cc, buf, 4, true)); + *p_tag = (uint32_t)(uint8_t)buf[0]<<24u | (uint32_t)(uint8_t)buf[1]<<16 | (uint32_t)(uint8_t)buf[2]<<8u | (uint32_t)(uint8_t)buf[3]; + if (*p_tag == ufbxi_cache_mc_tag('F','O','R','8')) { + cc->mc_for8 = true; + } + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_mc_read_u32(ufbxi_cache_context *cc, uint32_t *p_value) +{ + char buf[4]; + ufbxi_check_err(&cc->error, ufbxi_cache_read(cc, buf, 4, false)); + *p_value = (uint32_t)(uint8_t)buf[0]<<24u | (uint32_t)(uint8_t)buf[1]<<16 | (uint32_t)(uint8_t)buf[2]<<8u | (uint32_t)(uint8_t)buf[3]; + if (cc->mc_for8) { + ufbxi_check_err(&cc->error, ufbxi_cache_read(cc, buf, 4, false)); + } + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_mc_read_u64(ufbxi_cache_context *cc, uint64_t *p_value) +{ + if (!cc->mc_for8) { + uint32_t v32; + ufbxi_check_err(&cc->error, ufbxi_cache_mc_read_u32(cc, &v32)); + *p_value = v32; + } else { + char buf[8]; + ufbxi_check_err(&cc->error, ufbxi_cache_read(cc, buf, 8, false)); + uint32_t hi = (uint32_t)(uint8_t)buf[0]<<24u | (uint32_t)(uint8_t)buf[1]<<16 | (uint32_t)(uint8_t)buf[2]<<8u | (uint32_t)(uint8_t)buf[3]; + uint32_t lo = (uint32_t)(uint8_t)buf[4]<<24u | (uint32_t)(uint8_t)buf[5]<<16 | (uint32_t)(uint8_t)buf[6]<<8u | (uint32_t)(uint8_t)buf[7]; + *p_value = (uint64_t)hi << 32u | (uint64_t)lo; + } + return 1; +} + +static const uint8_t ufbxi_cache_data_format_size[] = { + 0, 4, 12, 8, 24, +}; + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_load_mc(ufbxi_cache_context *cc) +{ + uint32_t version = 0, time_start = 0, time_end = 0; + uint32_t count = 0, time = 0; + char skip_buf[8]; + + for (;;) { + uint32_t tag; + uint64_t size; + ufbxi_check_err(&cc->error, ufbxi_cache_mc_read_tag(cc, &tag)); + if (tag == 0) break; + + if (tag == ufbxi_cache_mc_tag('C','A','C','H') || tag == ufbxi_cache_mc_tag('M','Y','C','H')) { + continue; + } + if (cc->mc_for8) { + ufbxi_check_err(&cc->error, ufbxi_cache_read(cc, skip_buf, 4, false)); + } + + ufbxi_check_err(&cc->error, ufbxi_cache_mc_read_u64(cc, &size)); + uint64_t begin = cc->file_offset; + + size_t alignment = cc->mc_for8 ? 8 : 4; + + ufbx_cache_data_format format = UFBX_CACHE_DATA_FORMAT_UNKNOWN; + switch (tag) { + case ufbxi_cache_mc_tag('F','O','R','4'): cc->mc_for8 = false; break; + case ufbxi_cache_mc_tag('F','O','R','8'): cc->mc_for8 = true; break; + case ufbxi_cache_mc_tag('V','R','S','N'): ufbxi_check_err(&cc->error, ufbxi_cache_mc_read_u32(cc, &version)); break; + case ufbxi_cache_mc_tag('S','T','I','M'): + ufbxi_check_err(&cc->error, ufbxi_cache_mc_read_u32(cc, &time_start)); + time = time_start; + break; + case ufbxi_cache_mc_tag('E','T','I','M'): ufbxi_check_err(&cc->error, ufbxi_cache_mc_read_u32(cc, &time_end)); break; + case ufbxi_cache_mc_tag('T','I','M','E'): ufbxi_check_err(&cc->error, ufbxi_cache_mc_read_u32(cc, &time)); break; + case ufbxi_cache_mc_tag('C','H','N','M'): { + ufbxi_check_err(&cc->error, size > 0 && size < SIZE_MAX); + size_t length = (size_t)size - 1; + size_t padded_length = ((size_t)size + alignment - 1) & ~(alignment - 1); + ufbxi_check_err(&cc->error, ufbxi_grow_array(cc->ator_tmp, &cc->name_buf, &cc->name_cap, padded_length)); + ufbxi_check_err(&cc->error, ufbxi_cache_read(cc, cc->name_buf, padded_length, false)); + cc->channel_name.data = cc->name_buf; + cc->channel_name.length = length; + ufbxi_check_err(&cc->error, ufbxi_push_string_place_str(&cc->string_pool, &cc->channel_name, false)); + } break; + case ufbxi_cache_mc_tag('S','I','Z','E'): ufbxi_check_err(&cc->error, ufbxi_cache_mc_read_u32(cc, &count)); break; + case ufbxi_cache_mc_tag('F','V','C','A'): format = UFBX_CACHE_DATA_FORMAT_VEC3_FLOAT; break; + case ufbxi_cache_mc_tag('D','V','C','A'): format = UFBX_CACHE_DATA_FORMAT_VEC3_DOUBLE; break; + case ufbxi_cache_mc_tag('F','B','C','A'): format = UFBX_CACHE_DATA_FORMAT_REAL_FLOAT; break; + case ufbxi_cache_mc_tag('D','B','C','A'): format = UFBX_CACHE_DATA_FORMAT_REAL_DOUBLE; break; + case ufbxi_cache_mc_tag('D','B','L','A'): format = UFBX_CACHE_DATA_FORMAT_REAL_DOUBLE; break; + default: ufbxi_fail_err(&cc->error, "Unknown tag"); + } + + if (format != UFBX_CACHE_DATA_FORMAT_UNKNOWN) { + ufbx_cache_frame *frame = ufbxi_push_zero(&cc->tmp_stack, ufbx_cache_frame, 1); + ufbxi_check_err(&cc->error, frame); + + uint32_t elem_size = ufbxi_cache_data_format_size[format]; + uint64_t total_size = (uint64_t)elem_size * (uint64_t)count; + ufbxi_check_err(&cc->error, size >= elem_size * count); + + frame->channel = cc->channel_name; + frame->time = (double)time * (1.0/6000.0); + frame->filename = cc->stream_filename; + frame->data_format = format; + frame->data_encoding = UFBX_CACHE_DATA_ENCODING_BIG_ENDIAN; + frame->data_offset = cc->file_offset; + frame->data_count = count; + frame->data_element_bytes = elem_size; + frame->data_total_bytes = total_size; + frame->file_format = UFBX_CACHE_FILE_FORMAT_MC; + + uint64_t end = begin + ((size + alignment - 1) & ~(uint64_t)(alignment - 1)); + ufbxi_check_err(&cc->error, end >= cc->file_offset); + uint64_t left = end - cc->file_offset; + ufbxi_check_err(&cc->error, ufbxi_cache_skip(cc, left)); + } + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_load_pc2(ufbxi_cache_context *cc) +{ + char header[32]; + ufbxi_check_err(&cc->error, ufbxi_cache_read(cc, header, sizeof(header), false)); + + uint32_t version = ufbxi_read_u32(header + 12); + uint32_t num_points = ufbxi_read_u32(header + 16); + double start_frame = ufbxi_read_f32(header + 20); + double frames_per_sample = ufbxi_read_f32(header + 24); + uint32_t num_samples = ufbxi_read_u32(header + 28); + + (void)version; + + ufbx_cache_frame *frames = ufbxi_push_zero(&cc->tmp_stack, ufbx_cache_frame, num_samples); + ufbxi_check_err(&cc->error, frames); + + uint64_t total_points = (uint64_t)num_points * (uint64_t)num_samples; + ufbxi_check_err(&cc->error, total_points < UINT64_MAX / 12); + + uint64_t offset = cc->file_offset; + + // Skip almost to the end of the data and try to read one byte as there's + // nothing after the data so we can't detect EOF.. + if (total_points > 0) { + char last_byte[1]; + ufbxi_check_err(&cc->error, ufbxi_cache_skip(cc, total_points * 12 - 1)); + ufbxi_check_err(&cc->error, ufbxi_cache_read(cc, last_byte, 1, false)); + } + + for (uint32_t i = 0; i < num_samples; i++) { + ufbx_cache_frame *frame = &frames[i]; + + double sample_frame = start_frame + (double)i * frames_per_sample; + frame->channel = cc->channel_name; + frame->time = sample_frame / cc->frames_per_second; + frame->filename = cc->stream_filename; + frame->data_format = UFBX_CACHE_DATA_FORMAT_VEC3_FLOAT; + frame->data_encoding = UFBX_CACHE_DATA_ENCODING_LITTLE_ENDIAN; + frame->data_offset = offset; + frame->data_count = num_points; + frame->data_element_bytes = 12; + frame->data_total_bytes = num_points * 12; + frame->file_format = UFBX_CACHE_FILE_FORMAT_PC2; + offset += num_points * 12; + } + + return 1; +} + +static ufbxi_noinline bool ufbxi_tmp_channel_less(void *user, const void *va, const void *vb) +{ + (void)user; + const ufbxi_cache_tmp_channel *a = (const ufbxi_cache_tmp_channel *)va, *b = (const ufbxi_cache_tmp_channel *)vb; + return ufbxi_str_less(a->name, b->name); +} + +static ufbxi_noinline int ufbxi_cache_sort_tmp_channels(ufbxi_cache_context *cc, ufbxi_cache_tmp_channel *channels, size_t count) +{ + ufbxi_check_err(&cc->error, ufbxi_grow_array(cc->ator_tmp, &cc->tmp_arr, &cc->tmp_arr_size, count * sizeof(ufbxi_cache_tmp_channel))); + ufbxi_stable_sort(sizeof(ufbxi_cache_tmp_channel), 16, channels, cc->tmp_arr, count, &ufbxi_tmp_channel_less, NULL); + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_load_xml_imp(ufbxi_cache_context *cc, ufbxi_xml_document *doc) +{ + cc->xml_ticks_per_frame = 250; + cc->xml_filename = cc->stream_filename; + + ufbxi_xml_tag *tag_root = ufbxi_xml_find_child(doc->root, "Autodesk_Cache_File"); + if (tag_root) { + ufbxi_xml_tag *tag_type = ufbxi_xml_find_child(tag_root, "cacheType"); + ufbxi_xml_tag *tag_fps = ufbxi_xml_find_child(tag_root, "cacheTimePerFrame"); + ufbxi_xml_tag *tag_channels = ufbxi_xml_find_child(tag_root, "Channels"); + + size_t num_extra = 0; + ufbxi_for(ufbxi_xml_tag, tag, tag_root->children, tag_root->num_children) { + if (tag->num_children != 1) continue; + if (strcmp(tag->name.data, "extra") != 0) continue; + ufbx_string *extra = ufbxi_push(&cc->tmp_stack, ufbx_string, 1); + ufbxi_check_err(&cc->error, extra); + *extra = tag->children[0].text; + ufbxi_check_err(&cc->error, ufbxi_push_string_place_str(&cc->string_pool, extra, false)); + num_extra++; + } + cc->cache.extra_info.count = num_extra; + cc->cache.extra_info.data = ufbxi_push_pop(&cc->result, &cc->tmp_stack, ufbx_string, num_extra); + ufbxi_check_err(&cc->error, cc->cache.extra_info.data); + + if (tag_type) { + ufbxi_xml_attrib *type = ufbxi_xml_find_attrib(tag_type, "Type"); + ufbxi_xml_attrib *format = ufbxi_xml_find_attrib(tag_type, "Format"); + if (type) { + if (!strcmp(type->value.data, "OneFilePerFrame")) { + cc->xml_type = UFBXI_CACHE_XML_TYPE_FILE_PER_FRAME; + } else if (!strcmp(type->value.data, "OneFile")) { + cc->xml_type = UFBXI_CACHE_XML_TYPE_SINGLE_FILE; + } + } + if (format) { + if (!strcmp(format->value.data, "mcc")) { + cc->xml_format = UFBXI_CACHE_XML_FORMAT_MCC; + } else if (!strcmp(format->value.data, "mcx")) { + cc->xml_format = UFBXI_CACHE_XML_FORMAT_MCX; + } + } + } + + if (tag_fps) { + ufbxi_xml_attrib *fps = ufbxi_xml_find_attrib(tag_fps, "TimePerFrame"); + if (fps) { + int value = atoi(fps->value.data); + if (value > 0) { + cc->xml_ticks_per_frame = (uint32_t)value; + } + } + } + + if (tag_channels) { + cc->channels = ufbxi_push_zero(&cc->tmp, ufbxi_cache_tmp_channel, tag_channels->num_children); + ufbxi_check_err(&cc->error, cc->channels); + + ufbxi_for(ufbxi_xml_tag, tag, tag_channels->children, tag_channels->num_children) { + ufbxi_xml_attrib *name = ufbxi_xml_find_attrib(tag, "ChannelName"); + ufbxi_xml_attrib *type = ufbxi_xml_find_attrib(tag, "ChannelType"); + ufbxi_xml_attrib *interpretation = ufbxi_xml_find_attrib(tag, "ChannelInterpretation"); + if (!(name && type && interpretation)) continue; + + ufbxi_cache_tmp_channel *channel = &cc->channels[cc->num_channels++]; + channel->name = name->value; + channel->interpretation = interpretation->value; + ufbxi_check_err(&cc->error, ufbxi_push_string_place_str(&cc->string_pool, &channel->name, false)); + ufbxi_check_err(&cc->error, ufbxi_push_string_place_str(&cc->string_pool, &channel->interpretation, false)); + + ufbxi_xml_attrib *sampling_rate = ufbxi_xml_find_attrib(tag, "SamplingRate"); + ufbxi_xml_attrib *start_time = ufbxi_xml_find_attrib(tag, "StartTime"); + ufbxi_xml_attrib *end_time = ufbxi_xml_find_attrib(tag, "EndTime"); + if (sampling_rate && start_time && end_time) { + channel->sample_rate = (uint32_t)atoi(sampling_rate->value.data); + channel->start_time = (uint32_t)atoi(start_time->value.data); + channel->end_time = (uint32_t)atoi(end_time->value.data); + channel->current_time = channel->start_time; + channel->try_load = true; + } + } + } + } + + ufbxi_check_err(&cc->error, ufbxi_cache_sort_tmp_channels(cc, cc->channels, cc->num_channels)); + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_load_xml(ufbxi_cache_context *cc) +{ + ufbxi_xml_load_opts opts = { 0 }; + opts.ator = cc->ator_tmp; + opts.read_fn = cc->stream.read_fn; + opts.read_user = cc->stream.user; + opts.prefix = cc->pos; + opts.prefix_length = ufbxi_to_size(cc->pos_end - cc->pos); + ufbxi_xml_document *doc = ufbxi_load_xml(&opts, &cc->error); + ufbxi_check_err(&cc->error, doc); + + int xml_ok = ufbxi_cache_load_xml_imp(cc, doc); + ufbxi_free_xml(doc); + ufbxi_check_err(&cc->error, xml_ok); + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_load_file(ufbxi_cache_context *cc, ufbx_string filename) +{ + cc->stream_filename = filename; + ufbxi_check_err(&cc->error, ufbxi_push_string_place_str(&cc->string_pool, &cc->stream_filename, false)); + + // Assume all files have at least 16 bytes of header + size_t magic_len = cc->stream.read_fn(cc->stream.user, cc->buffer, 16); + ufbxi_check_err_msg(&cc->error, magic_len <= 16, "IO error"); + ufbxi_check_err_msg(&cc->error, magic_len == 16, "Truncated file"); + cc->pos = cc->buffer; + cc->pos_end = cc->buffer + 16; + + cc->file_offset = 0; + + if (!memcmp(cc->buffer, "POINTCACHE2", 11)) { + ufbxi_check_err(&cc->error, ufbxi_cache_load_pc2(cc)); + } else if (!memcmp(cc->buffer, "FOR4", 4) || !memcmp(cc->buffer, "FOR8", 4)) { + ufbxi_check_err(&cc->error, ufbxi_cache_load_mc(cc)); + } else { + ufbxi_check_err(&cc->error, ufbxi_cache_load_xml(cc)); + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_try_open_file(ufbxi_cache_context *cc, ufbx_string filename, const ufbx_blob *original_filename, bool *p_found) +{ + memset(&cc->stream, 0, sizeof(cc->stream)); + ufbxi_regression_assert(strlen(filename.data) == filename.length); + if (!ufbxi_open_file(&cc->open_file_cb, &cc->stream, filename.data, filename.length, original_filename, cc->ator_tmp, UFBX_OPEN_FILE_GEOMETRY_CACHE)) { + return 1; + } + + int ok = ufbxi_cache_load_file(cc, filename); + *p_found = true; + + if (cc->stream.close_fn) { + cc->stream.close_fn(cc->stream.user); + } + + return ok; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_cache_load_frame_files(ufbxi_cache_context *cc) +{ + if (cc->xml_filename.length == 0) return 1; + + const char *extension = NULL; + switch (cc->xml_format) { + case UFBXI_CACHE_XML_FORMAT_MCC: extension = "mc"; break; + case UFBXI_CACHE_XML_FORMAT_MCX: extension = "mcx"; break; + default: return 1; + } + + // Ensure worst case space for `path/filenameFrame123Tick456.mcx` + size_t name_buf_len = cc->xml_filename.length + 64; + char *name_buf = ufbxi_push(&cc->tmp, char, name_buf_len); + ufbxi_check_err(&cc->error, name_buf); + + // Find the prefix before `.xml` + size_t prefix_len = cc->xml_filename.length; + for (size_t i = prefix_len; i > 0; --i) { + if (cc->xml_filename.data[i - 1] == '.') { + prefix_len = i - 1; + break; + } + } + memcpy(name_buf, cc->xml_filename.data, prefix_len); + + char *suffix_data = name_buf + prefix_len; + size_t suffix_len = name_buf_len - prefix_len; + + ufbx_string filename; + filename.data = name_buf; + + if (cc->xml_type == UFBXI_CACHE_XML_TYPE_SINGLE_FILE) { + filename.length = prefix_len + (size_t)ufbxi_snprintf(suffix_data, suffix_len, ".%s", extension); + bool found = false; + ufbxi_check_err(&cc->error, ufbxi_cache_try_open_file(cc, filename, NULL, &found)); + } else if (cc->xml_type == UFBXI_CACHE_XML_TYPE_FILE_PER_FRAME) { + uint32_t lowest_time = 0; + for (;;) { + // Find the first `time >= lowest_time` value that has data in some channel + uint32_t time = UINT32_MAX; + ufbxi_for(ufbxi_cache_tmp_channel, chan, cc->channels, cc->num_channels) { + if (!chan->try_load || chan->consecutive_fails > 10) continue; + uint32_t sample_rate = chan->sample_rate ? chan->sample_rate : cc->xml_ticks_per_frame; + if (chan->current_time < lowest_time) { + uint32_t delta = (lowest_time - chan->current_time - 1) / sample_rate; + chan->current_time += delta * sample_rate; + if (UINT32_MAX - chan->current_time >= sample_rate) { + chan->current_time += sample_rate; + } else { + chan->try_load = false; + continue; + } + } + if (chan->current_time <= chan->end_time) { + time = ufbxi_min32(time, chan->current_time); + } + } + if (time == UINT32_MAX) break; + + // Try to load a file at the specified frame/tick + uint32_t frame = time / cc->xml_ticks_per_frame; + uint32_t tick = time % cc->xml_ticks_per_frame; + if (tick == 0) { + filename.length = prefix_len + (size_t)ufbxi_snprintf(suffix_data, suffix_len, "Frame%u.%s", frame, extension); + } else { + filename.length = prefix_len + (size_t)ufbxi_snprintf(suffix_data, suffix_len, "Frame%uTick%u.%s", frame, tick, extension); + } + bool found = false; + ufbxi_check_err(&cc->error, ufbxi_cache_try_open_file(cc, filename, NULL, &found)); + + // Update channel status + ufbxi_for(ufbxi_cache_tmp_channel, chan, cc->channels, cc->num_channels) { + if (chan->current_time == time) { + chan->consecutive_fails = found ? 0 : chan->consecutive_fails + 1; + } + } + + lowest_time = time + 1; + } + } + + return 1; +} + +static ufbxi_noinline bool ufbxi_cmp_cache_frame_less(void *user, const void *va, const void *vb) +{ + (void)user; + const ufbx_cache_frame *a = (const ufbx_cache_frame *)va, *b = (const ufbx_cache_frame *)vb; + if (a->channel.data != b->channel.data) { + // Channel names should be interned + ufbxi_regression_assert(!ufbxi_str_equal(a->channel, b->channel)); + return ufbxi_str_less(a->channel, b->channel); + } + return a->time < b->time; +} + +static ufbxi_noinline int ufbxi_cache_sort_frames(ufbxi_cache_context *cc, ufbx_cache_frame *frames, size_t count) +{ + ufbxi_check_err(&cc->error, ufbxi_grow_array(cc->ator_tmp, &cc->tmp_arr, &cc->tmp_arr_size, count * sizeof(ufbx_cache_frame))); + ufbxi_stable_sort(sizeof(ufbx_cache_frame), 16, frames, cc->tmp_arr, count, &ufbxi_cmp_cache_frame_less, NULL); + return 1; +} + +typedef struct { + ufbx_cache_interpretation interpretation; + const char *pattern; +} ufbxi_cache_interpretation_name; + +static const ufbxi_cache_interpretation_name ufbxi_cache_interpretation_names[] = { + { UFBX_CACHE_INTERPRETATION_POINTS, "\\cpoints?" }, + { UFBX_CACHE_INTERPRETATION_VERTEX_POSITION, "\\cpositions?" }, + { UFBX_CACHE_INTERPRETATION_VERTEX_NORMAL, "\\cnormals?" }, +}; + +static ufbxi_noinline int ufbxi_cache_setup_channels(ufbxi_cache_context *cc) +{ + ufbxi_cache_tmp_channel *tmp_chan = cc->channels, *tmp_end = ufbxi_add_ptr(tmp_chan, cc->num_channels); + + size_t begin = 0, num_channels = 0; + while (begin < cc->cache.frames.count) { + ufbx_cache_frame *frame = &cc->cache.frames.data[begin]; + size_t end = begin + 1; + while (end < cc->cache.frames.count && cc->cache.frames.data[end].channel.data == frame->channel.data) { + end++; + } + + ufbx_cache_channel *chan = ufbxi_push_zero(&cc->tmp_stack, ufbx_cache_channel, 1); + ufbxi_check_err(&cc->error, chan); + + chan->name = frame->channel; + chan->interpretation_name = ufbx_empty_string; + chan->frames.data = frame; + chan->frames.count = end - begin; + + while (tmp_chan < tmp_end && ufbxi_str_less(tmp_chan->name, chan->name)) { + tmp_chan++; + } + if (tmp_chan < tmp_end && ufbxi_str_equal(tmp_chan->name, chan->name)) { + chan->interpretation_name = tmp_chan->interpretation; + } + + if (frame->file_format == UFBX_CACHE_FILE_FORMAT_PC2) { + chan->interpretation = UFBX_CACHE_INTERPRETATION_VERTEX_POSITION; + } else { + ufbxi_for(const ufbxi_cache_interpretation_name, name, ufbxi_cache_interpretation_names, ufbxi_arraycount(ufbxi_cache_interpretation_names)) { + if (ufbxi_match(&chan->interpretation_name, name->pattern)) { + chan->interpretation = name->interpretation; + break; + } + } + } + + num_channels++; + begin = end; + } + + cc->cache.channels.data = ufbxi_push_pop(&cc->result, &cc->tmp_stack, ufbx_cache_channel, num_channels); + ufbxi_check_err(&cc->error, cc->cache.channels.data); + cc->cache.channels.count = num_channels; + + return 1; +} + + +static ufbxi_noinline int ufbxi_cache_load_imp(ufbxi_cache_context *cc, ufbx_string filename) +{ + // `ufbx_geometry_cache_opts` must be cleared to zero first! + ufbx_assert(cc->opts._begin_zero == 0 && cc->opts._end_zero == 0); + ufbxi_check_err_msg(&cc->error, cc->opts._begin_zero == 0 && cc->opts._end_zero == 0, "Uninitialized options"); + + cc->tmp.ator = cc->ator_tmp; + cc->tmp_stack.ator = cc->ator_tmp; + + cc->channel_name.data = ufbxi_empty_char; + + if (!cc->open_file_cb.fn) { + cc->open_file_cb.fn = ufbx_default_open_file; + } + + // Make sure the filename we pass to `open_file_fn()` is NULL-terminated + char *filename_data = ufbxi_push(&cc->tmp, char, filename.length + 1); + ufbxi_check_err(&cc->error, filename_data); + memcpy(filename_data, filename.data, filename.length); + filename_data[filename.length] = '\0'; + ufbx_string filename_copy = { filename_data, filename.length }; + + // TODO: NULL termination! + bool found = false; + ufbxi_check_err(&cc->error, ufbxi_cache_try_open_file(cc, filename_copy, NULL, &found)); + if (!found) { + ufbxi_set_err_info(&cc->error, filename.data, filename.length); + ufbxi_fail_err_msg(&cc->error, "open_file_fn()", "File not found"); + } + + cc->cache.root_filename = cc->stream_filename; + + ufbxi_check_err(&cc->error, ufbxi_cache_load_frame_files(cc)); + + size_t num_frames = cc->tmp_stack.num_items; + cc->cache.frames.count = num_frames; + cc->cache.frames.data = ufbxi_push_pop(&cc->result, &cc->tmp_stack, ufbx_cache_frame, num_frames); + ufbxi_check_err(&cc->error, cc->cache.frames.data); + + ufbxi_check_err(&cc->error, ufbxi_cache_sort_frames(cc, cc->cache.frames.data, cc->cache.frames.count)); + ufbxi_check_err(&cc->error, ufbxi_cache_setup_channels(cc)); + + // Must be last allocation! + cc->imp = ufbxi_push(&cc->result, ufbxi_geometry_cache_imp, 1); + ufbxi_check_err(&cc->error, cc->imp); + + ufbxi_init_ref(&cc->imp->refcount, UFBXI_CACHE_IMP_MAGIC, NULL); + + cc->imp->cache = cc->cache; + cc->imp->magic = UFBXI_CACHE_IMP_MAGIC; + cc->imp->owned_by_scene = cc->owned_by_scene; + cc->imp->ator = cc->ator_result; + cc->imp->result_buf = cc->result; + cc->imp->result_buf.ator = &cc->imp->ator; + cc->imp->string_buf = cc->string_pool.buf; + cc->imp->string_buf.ator = &cc->imp->ator; + + return 1; +} + +ufbxi_noinline static ufbx_geometry_cache *ufbxi_cache_load(ufbxi_cache_context *cc, ufbx_string filename) +{ + int ok = ufbxi_cache_load_imp(cc, filename); + + ufbxi_buf_free(&cc->tmp); + ufbxi_buf_free(&cc->tmp_stack); + ufbxi_free(cc->ator_tmp, char, cc->name_buf, cc->name_cap); + ufbxi_free(cc->ator_tmp, char, cc->tmp_arr, cc->tmp_arr_size); + if (!cc->owned_by_scene) { + ufbxi_string_pool_temp_free(&cc->string_pool); + ufbxi_free_ator(cc->ator_tmp); + } + + if (ok) { + return &cc->imp->cache; + } else { + ufbxi_fix_error_type(&cc->error, "Failed to load geometry cache"); + if (!cc->owned_by_scene) { + ufbxi_buf_free(&cc->string_pool.buf); + ufbxi_free_ator(&cc->ator_result); + } + return NULL; + } +} + +ufbxi_noinline static ufbx_geometry_cache *ufbxi_load_geometry_cache(ufbx_string filename, const ufbx_geometry_cache_opts *user_opts, ufbx_error *p_error) +{ + ufbx_geometry_cache_opts opts; + if (user_opts) { + opts = *user_opts; + } else { + memset(&opts, 0, sizeof(opts)); + } + + ufbxi_cache_context cc = { UFBX_ERROR_NONE }; + ufbxi_allocator ator_tmp = { 0 }; + ufbxi_init_ator(&cc.error, &ator_tmp, &opts.temp_allocator, "temp"); + ufbxi_init_ator(&cc.error, &cc.ator_result, &opts.result_allocator, "result"); + cc.ator_tmp = &ator_tmp; + + cc.opts = opts; + + cc.open_file_cb = opts.open_file_cb; + + cc.string_pool.error = &cc.error; + ufbxi_map_init(&cc.string_pool.map, cc.ator_tmp, &ufbxi_map_cmp_string, NULL); + cc.string_pool.buf.ator = &cc.ator_result; + cc.string_pool.buf.unordered = true; + cc.string_pool.initial_size = 64; + cc.result.ator = &cc.ator_result; + + cc.frames_per_second = opts.frames_per_second > 0.0 ? opts.frames_per_second : 30.0; + + ufbx_geometry_cache *cache = ufbxi_cache_load(&cc, filename); + if (p_error) { + if (cache) { + ufbxi_clear_error(p_error); + } else { + *p_error = cc.error; + } + } + return cache; +} + +static ufbxi_noinline void ufbxi_free_geometry_cache_imp(ufbxi_geometry_cache_imp *imp) +{ + ufbx_assert(imp->magic == UFBXI_CACHE_IMP_MAGIC); + if (imp->magic != UFBXI_CACHE_IMP_MAGIC) return; + if (imp->owned_by_scene) return; + imp->magic = 0; + + ufbxi_buf_free(&imp->string_buf); + + // We need to free `result_buf` last and be careful to copy it to + // the stack since the `ufbxi_scene_imp` that contains it is allocated + // from the same result buffer! + ufbxi_allocator ator = imp->ator; + ufbxi_buf result = imp->result_buf; + result.ator = &ator; + ufbxi_buf_free(&result); + ufbxi_free_ator(&ator); +} + +#else + +typedef struct { + ufbxi_refcount refcount; + uint32_t magic; + bool owned_by_scene; +} ufbxi_geometry_cache_imp; + +static ufbxi_noinline ufbx_geometry_cache *ufbxi_load_geometry_cache(ufbx_string filename, const ufbx_geometry_cache_opts *user_opts, ufbx_error *p_error) +{ + if (p_error) { + memset(p_error, 0, sizeof(ufbx_error)); + ufbxi_fmt_err_info(p_error, "UFBX_ENABLE_GEOMETRY_CACHE"); + ufbxi_report_err_msg(p_error, "UFBXI_FEATURE_GEOMETRY_CACHE", "Feature disabled"); + } + return NULL; +} + +static ufbxi_forceinline void ufbxi_free_geometry_cache_imp(ufbxi_geometry_cache_imp *imp) +{ +} + +#endif + +// -- External files + +typedef enum { + UFBXI_EXTERNAL_FILE_GEOMETRY_CACHE, +} ufbxi_external_file_type; + +typedef struct { + ufbxi_external_file_type type; + ufbx_string filename; + ufbx_string absolute_filename; + size_t index; + void *data; + size_t data_size; +} ufbxi_external_file; + +static int ufbxi_cmp_external_file(const void *va, const void *vb) +{ + const ufbxi_external_file *a = (const ufbxi_external_file*)va, *b = (const ufbxi_external_file*)vb; + if (a->type != b->type) return a->type < b->type ? -1 : 1; + int cmp = ufbxi_str_cmp(a->filename, b->filename); + if (cmp != 0) return cmp; + if (a->index != b->index) return a->index < b->index ? -1 : 1; + return 0; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_load_external_cache(ufbxi_context *uc, ufbxi_external_file *file) +{ +#if UFBXI_FEATURE_GEOMETRY_CACHE + ufbxi_cache_context cc = { UFBX_ERROR_NONE }; + cc.owned_by_scene = true; + + cc.open_file_cb = uc->opts.open_file_cb; + cc.frames_per_second = uc->scene.settings.frames_per_second; + + // Temporarily "borrow" allocators for the geometry cache + cc.ator_tmp = &uc->ator_tmp; + cc.string_pool = uc->string_pool; + cc.result = uc->result; + + ufbx_geometry_cache *cache = ufbxi_cache_load(&cc, file->filename); + if (!cache) { + if (cc.error.type == UFBX_ERROR_FILE_NOT_FOUND) { + memset(&cc.error, 0, sizeof(cc.error)); + cache = ufbxi_cache_load(&cc, file->absolute_filename); + } + } + + // Return the "borrowed" allocators + uc->string_pool = cc.string_pool; + uc->result = cc.result; + + if (!cache) { + if (cc.error.type == UFBX_ERROR_FILE_NOT_FOUND && uc->opts.ignore_missing_external_files) { + ufbxi_check(ufbxi_warnf(UFBX_WARNING_MISSING_EXTERNAL_FILE, "Failed to open geometry cache: %s", file->filename.data)); + return 1; + } + + uc->error = cc.error; + return 0; + } + + file->data = cache; + return 1; +#else + if (uc->opts.ignore_missing_external_files) return 1; + + ufbxi_fmt_err_info(&uc->error, "UFBX_ENABLE_GEOMETRY_CACHE"); + ufbxi_fail_msg("UFBXI_FEATURE_GEOMETRY_CACHE", "Feature disabled"); +#endif +} + +static ufbxi_noinline ufbxi_external_file *ufbxi_find_external_file(ufbxi_external_file *files, size_t num_files, ufbxi_external_file_type type, const char *name) +{ + size_t ix = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbxi_external_file, 32, &ix, files, 0, num_files, + ( type != a->type ? type < a->type : strcmp(a->filename.data, name) < 0 ), + ( a->type == type && a->filename.data == name )); + return ix != SIZE_MAX ? &files[ix] : NULL; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_load_external_files(ufbxi_context *uc) +{ + size_t num_files = 0; + + // Gather external files to deduplicate them + ufbxi_for_ptr_list(ufbx_cache_file, p_cache, uc->scene.cache_files) { + ufbx_cache_file *cache = *p_cache; + if (cache->filename.length > 0) { + ufbxi_external_file *file = ufbxi_push_zero(&uc->tmp_stack, ufbxi_external_file, 1); + ufbxi_check(file); + file->index = num_files++; + file->type = UFBXI_EXTERNAL_FILE_GEOMETRY_CACHE; + file->filename = cache->filename; + file->absolute_filename = cache->absolute_filename; + } + } + + // Sort and load the external files + ufbxi_external_file *files = ufbxi_push_pop(&uc->tmp, &uc->tmp_stack, ufbxi_external_file, num_files); + ufbxi_check(files); + qsort(files, num_files, sizeof(ufbxi_external_file), &ufbxi_cmp_external_file); + + ufbxi_external_file_type prev_type = UFBXI_EXTERNAL_FILE_GEOMETRY_CACHE; + const char *prev_name = NULL; + ufbxi_for(ufbxi_external_file, file, files, num_files) { + if (file->filename.data == prev_name && file->type == prev_type) continue; + if (file->type == UFBXI_EXTERNAL_FILE_GEOMETRY_CACHE) { + ufbxi_check(ufbxi_load_external_cache(uc, file)); + } + prev_name = file->filename.data; + prev_type = file->type; + } + + // Patch the loaded files + ufbxi_for_ptr_list(ufbx_cache_file, p_cache, uc->scene.cache_files) { + ufbx_cache_file *cache = *p_cache; + ufbxi_external_file *file = ufbxi_find_external_file(files, num_files, + UFBXI_EXTERNAL_FILE_GEOMETRY_CACHE, cache->filename.data); + if (file && file->data) { + cache->external_cache = (ufbx_geometry_cache*)file->data; + } + } + + // Patch the geometry deformers + ufbxi_for_ptr_list(ufbx_cache_deformer, p_deformer, uc->scene.cache_deformers) { + ufbx_cache_deformer *deformer = *p_deformer; + if (!deformer->file || !deformer->file->external_cache) continue; + ufbx_geometry_cache *cache = deformer->file->external_cache; + deformer->external_cache = cache; + + // HACK: It seems like channels may be connected even if the name is wrong + // and they work when exporting from Marvelous to Maya... + if (cache->channels.count == 1) { + deformer->external_channel = &cache->channels.data[0]; + } else { + ufbx_string channel = deformer->channel; + size_t ix = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_cache_channel, 16, &ix, cache->channels.data, 0, cache->channels.count, + ( ufbxi_str_less(a->name, channel) ), ( a->name.data == channel.data )); + if (ix != SIZE_MAX) { + deformer->external_channel = &cache->channels.data[ix]; + } + } + } + + return 1; +} + +static ufbxi_noinline void ufbxi_transform_to_axes(ufbxi_context *uc, ufbx_coordinate_axes dst_axes) +{ + if (!ufbx_coordinate_axes_valid(uc->scene.settings.axes)) return; + if (!ufbxi_axis_matrix(&uc->axis_matrix, uc->scene.settings.axes, dst_axes)) return; + + if (uc->opts.space_conversion == UFBX_SPACE_CONVERSION_TRANSFORM_ROOT) { + ufbx_matrix axis_mat = uc->axis_matrix; + if (!ufbxi_is_transform_identity(uc->scene.root_node->local_transform)) { + ufbx_matrix root_mat = ufbx_transform_to_matrix(&uc->scene.root_node->local_transform); + axis_mat = ufbx_matrix_mul(&root_mat, &axis_mat); + } + + uc->scene.root_node->local_transform = ufbx_matrix_to_transform(&axis_mat); + uc->scene.root_node->node_to_parent = axis_mat; + } +} + +static ufbxi_noinline void ufbxi_scale_anim_curve(ufbx_anim_curve *curve, ufbx_real scale) +{ + if (!curve) return; + ufbxi_for_list(ufbx_keyframe, key, curve->keyframes) { + key->value *= scale; + } +} + +static ufbxi_noinline void ufbxi_scale_anim_value(ufbx_anim_value *value, ufbx_real scale) +{ + if (!value) return; + ufbxi_scale_anim_curve(value->curves[0], scale); + ufbxi_scale_anim_curve(value->curves[1], scale); + ufbxi_scale_anim_curve(value->curves[2], scale); +} + +static ufbxi_noinline int ufbxi_scale_units(ufbxi_context *uc, ufbx_real target_meters) +{ + if (uc->scene.settings.unit_meters <= 0.0f) return 1; + target_meters = ufbxi_round_if_near(ufbxi_pow10_targets, ufbxi_arraycount(ufbxi_pow10_targets), target_meters); + + ufbx_real ratio = uc->scene.settings.unit_meters / target_meters; + ratio = ufbxi_round_if_near(ufbxi_pow10_targets, ufbxi_arraycount(ufbxi_pow10_targets), ratio); + if (ratio == 1.0f) return 1; + + uc->unit_scale = ratio; + + if (uc->opts.space_conversion == UFBX_SPACE_CONVERSION_TRANSFORM_ROOT) { + uc->scene.root_node->local_transform.scale.x *= ratio; + uc->scene.root_node->local_transform.scale.y *= ratio; + uc->scene.root_node->local_transform.scale.z *= ratio; + uc->scene.root_node->node_to_parent.m00 *= ratio; + uc->scene.root_node->node_to_parent.m01 *= ratio; + uc->scene.root_node->node_to_parent.m02 *= ratio; + uc->scene.root_node->node_to_parent.m10 *= ratio; + uc->scene.root_node->node_to_parent.m11 *= ratio; + uc->scene.root_node->node_to_parent.m12 *= ratio; + uc->scene.root_node->node_to_parent.m20 *= ratio; + uc->scene.root_node->node_to_parent.m21 *= ratio; + uc->scene.root_node->node_to_parent.m22 *= ratio; + + // HACK: Pre-fetch `ufbx_node.inherit_type` as we need it multiple times below. + // This is a bit inconsistent but will get overwritten in `ufbxi_update_node()`. + if (!uc->opts.no_prop_unit_scaling || !uc->opts.no_anim_curve_unit_scaling) { + ufbxi_for_ptr_list(ufbx_node, p_node, uc->scene.nodes) { + ufbx_node *node = *p_node; + node->inherit_type = (ufbx_inherit_type)ufbxi_find_enum(&node->props, ufbxi_InheritType, UFBX_INHERIT_NORMAL, UFBX_INHERIT_NO_SCALE); + } + } + + if (!uc->opts.no_prop_unit_scaling) { + ufbxi_for_ptr_list(ufbx_node, p_node, uc->scene.nodes) { + ufbx_node *node = *p_node; + if (node->inherit_type != UFBX_INHERIT_NO_SCALE) continue; + + // Find only in own properties + ufbx_props own_props = node->props; + own_props.defaults = NULL; + ufbx_prop *prop = ufbxi_find_prop(&own_props, ufbxi_Lcl_Scaling); + if (prop) { + prop->value_vec3.x *= ratio; + prop->value_vec3.y *= ratio; + prop->value_vec3.z *= ratio; + prop->value_int = ufbxi_f64_to_i64(prop->value_vec3.x); + } else { + // We need to add a new Lcl Scaling property based on the defaults + ufbx_props *defaults = node->props.defaults; + ufbx_vec3 scale = { 1.0f, 1.0f, 1.0f }; + if (defaults) { + prop = ufbxi_find_prop(defaults, ufbxi_Lcl_Scaling); + if (prop) { + scale = prop->value_vec3; + } + } + + scale.x *= ratio; + scale.y *= ratio; + scale.z *= ratio; + + ufbx_prop new_prop = { 0 }; + new_prop.name.data = ufbxi_Lcl_Scaling; + new_prop.name.length = sizeof(ufbxi_Lcl_Scaling) - 1; + new_prop._internal_key = ufbxi_get_name_key(ufbxi_Lcl_Scaling, sizeof(ufbxi_Lcl_Scaling) - 1); + new_prop.type = UFBX_PROP_SCALING; + new_prop.flags = UFBX_PROP_FLAG_SYNTHETIC; + new_prop.value_str = ufbx_empty_string; + new_prop.value_blob = ufbx_empty_blob; + new_prop.value_vec3 = scale; + new_prop.value_int = ufbxi_f64_to_i64(new_prop.value_vec3.x); + + size_t new_num_props = node->props.props.count + 1; + ufbx_prop *props_copy = ufbxi_push(&uc->result, ufbx_prop, new_num_props); + ufbxi_check(props_copy); + + memcpy(props_copy, node->props.props.data, node->props.props.count * sizeof(ufbx_prop)); + props_copy[node->props.props.count] = new_prop; + + ufbxi_check(ufbxi_sort_properties(uc, props_copy, new_num_props)); + + node->props.props.data = props_copy; + node->props.props.count = new_num_props; + } + } + } + + if (!uc->opts.no_anim_curve_unit_scaling) { + ufbxi_for_ptr_list(ufbx_anim_layer, p_layer, uc->scene.anim_layers) { + ufbx_anim_layer *layer = *p_layer; + ufbxi_for_list(ufbx_anim_prop, aprop, layer->anim_props) { + if (aprop->prop_name.data == ufbxi_Lcl_Scaling) { + ufbx_element *elem = aprop->element; + if (elem->type != UFBX_ELEMENT_NODE) continue; + ufbx_node *node = (ufbx_node*)elem; + if (node->inherit_type != UFBX_INHERIT_NO_SCALE) continue; + ufbxi_scale_anim_value(aprop->anim_value, ratio); + } + } + } + } + } + + return 1; +} + +// -- Curve evaluation + +static ufbxi_forceinline double ufbxi_find_cubic_bezier_t(double p1, double p2, double x0) +{ + double p1_3 = p1 * 3.0, p2_3 = p2 * 3.0; + double a = p1_3 - p2_3 + 1.0; + double b = p2_3 - p1_3 - p1_3; + double c = p1_3; + + double a_3 = 3.0*a, b_2 = 2.0*b; + double t = x0; + double x1, t2, t3; + + // Manually unroll three iterations of Newton-Rhapson, this is enough + // for most tangents + t2 = t*t; t3 = t2*t; x1 = a*t3 + b*t2 + c*t - x0; + t -= x1 / (a_3*t2 + b_2*t + c); + + t2 = t*t; t3 = t2*t; x1 = a*t3 + b*t2 + c*t - x0; + t -= x1 / (a_3*t2 + b_2*t + c); + + t2 = t*t; t3 = t2*t; x1 = a*t3 + b*t2 + c*t - x0; + t -= x1 / (a_3*t2 + b_2*t + c); + + // 4 ULP from 1.0 + const double eps = 8.881784197001252e-16; + if (ufbx_fabs(x1) <= eps) return t; + + // Perform more iterations until we reach desired accuracy + for (size_t i = 0; i < 4; i++) { + + t2 = t*t; t3 = t2*t; x1 = a*t3 + b*t2 + c*t - x0; + t -= x1 / (a_3*t2 + b_2*t + c); + + t2 = t*t; t3 = t2*t; x1 = a*t3 + b*t2 + c*t - x0; + t -= x1 / (a_3*t2 + b_2*t + c); + + if (ufbx_fabs(x1) <= eps) return t; + } + + return t; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_evaluate_skinning(ufbx_scene *scene, ufbx_error *error, ufbxi_buf *buf_result, ufbxi_buf *buf_tmp, + double time, bool load_caches, ufbx_geometry_cache_data_opts *cache_opts) +{ +#if UFBXI_FEATURE_SKINNING_EVALUATION + size_t max_skinned_indices = 0; + + ufbxi_for_ptr_list(ufbx_mesh, p_mesh, scene->meshes) { + ufbx_mesh *mesh = *p_mesh; + if (mesh->blend_deformers.count == 0 && mesh->skin_deformers.count == 0 && (mesh->cache_deformers.count == 0 || !load_caches)) continue; + max_skinned_indices = ufbxi_max_sz(max_skinned_indices, mesh->num_indices); + } + + ufbx_topo_edge *topo = ufbxi_push(buf_tmp, ufbx_topo_edge, max_skinned_indices); + ufbxi_check_err(error, topo); + + ufbxi_for_ptr_list(ufbx_mesh, p_mesh, scene->meshes) { + ufbx_mesh *mesh = *p_mesh; + if (mesh->blend_deformers.count == 0 && mesh->skin_deformers.count == 0 && (mesh->cache_deformers.count == 0 || !load_caches)) continue; + if (mesh->num_vertices == 0) continue; + + size_t num_vertices = mesh->num_vertices; + ufbx_vec3 *result_pos = ufbxi_push(buf_result, ufbx_vec3, num_vertices + 1); + ufbxi_check_err(error, result_pos); + + result_pos[0] = ufbx_zero_vec3; + result_pos++; + + bool cached_position = false, cached_normals = false; + if (load_caches && mesh->cache_deformers.count > 0) { + ufbxi_for_ptr_list(ufbx_cache_deformer, p_cache, mesh->cache_deformers) { + ufbx_cache_channel *channel = (*p_cache)->external_channel; + if (!channel) continue; + + if ((channel->interpretation == UFBX_CACHE_INTERPRETATION_VERTEX_POSITION || channel->interpretation == UFBX_CACHE_INTERPRETATION_POINTS) && !cached_position) { + size_t num_read = ufbx_sample_geometry_cache_vec3(channel, time, result_pos, num_vertices, cache_opts); + if (num_read == num_vertices) { + mesh->skinned_is_local = true; + cached_position = true; + } + } else if (channel->interpretation == UFBX_CACHE_INTERPRETATION_VERTEX_NORMAL && !cached_normals) { + // TODO: Is this right at all? + size_t num_normals = mesh->skinned_normal.values.count; + ufbx_vec3 *normal_data = ufbxi_push(buf_result, ufbx_vec3, num_normals + 1); + ufbxi_check_err(error, normal_data); + normal_data[0] = ufbx_zero_vec3; + normal_data++; + + size_t num_read = ufbx_sample_geometry_cache_vec3(channel, time, normal_data, num_normals, cache_opts); + if (num_read == num_normals) { + cached_normals = true; + mesh->skinned_normal.values.data = normal_data; + } else { + ufbxi_pop(buf_result, ufbx_vec3, num_normals + 1, NULL); + } + } + } + } + + if (!cached_position) { + memcpy(result_pos, mesh->vertices.data, num_vertices * sizeof(ufbx_vec3)); + + ufbxi_for_ptr_list(ufbx_blend_deformer, p_blend, mesh->blend_deformers) { + ufbx_add_blend_vertex_offsets(*p_blend, result_pos, num_vertices, 1.0f); + } + + // TODO: What should we do about multiple skins?? + if (mesh->skin_deformers.count > 0) { + ufbx_matrix *fallback = mesh->instances.count > 0 ? &mesh->instances.data[0]->geometry_to_world : NULL; + ufbx_skin_deformer *skin = mesh->skin_deformers.data[0]; + for (size_t i = 0; i < num_vertices; i++) { + ufbx_matrix mat = ufbx_get_skin_vertex_matrix(skin, i, fallback); + result_pos[i] = ufbx_transform_position(&mat, result_pos[i]); + } + + mesh->skinned_is_local = false; + } + } + + mesh->skinned_position.values.data = result_pos; + + if (!cached_normals) { + size_t num_indices = mesh->num_indices; + uint32_t *normal_indices = ufbxi_push(buf_result, uint32_t, num_indices); + ufbxi_check_err(error, normal_indices); + + ufbx_compute_topology(mesh, topo, num_indices); + size_t num_normals = ufbx_generate_normal_mapping(mesh, topo, num_indices, normal_indices, num_indices, false); + + if (num_normals == mesh->num_vertices) { + mesh->skinned_normal.unique_per_vertex = true; + } + + ufbx_vec3 *normal_data = ufbxi_push(buf_result, ufbx_vec3, num_normals + 1); + ufbxi_check_err(error, normal_data); + + normal_data[0] = ufbx_zero_vec3; + normal_data++; + + ufbx_compute_normals(mesh, &mesh->skinned_position, normal_indices, num_indices, normal_data, num_normals); + + mesh->generated_normals = true; + mesh->skinned_normal.exists = true; + mesh->skinned_normal.values.data = normal_data; + mesh->skinned_normal.values.count = num_normals; + mesh->skinned_normal.indices.data = normal_indices; + mesh->skinned_normal.indices.count = num_indices; + mesh->skinned_normal.value_reals = 3; + } + } + + return 1; +#else + ufbxi_fmt_err_info(error, "UFBX_ENABLE_SKINNING_EVALUATION"); + ufbxi_report_err_msg(error, "UFBXI_FEATURE_SKINNING_EVALUATION", "Feature disabled"); + return 0; +#endif +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_fixup_opts_string(ufbxi_context *uc, ufbx_string *str, bool push) +{ + if (str->length > 0) { + if (str->length == SIZE_MAX) { + str->length = str->data ? strlen(str->data) : 0; + } + if (push) { + ufbxi_check(ufbxi_push_string_place_str(&uc->string_pool, str, false)); + } + } else { + str->data = ufbxi_empty_char; + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_load_imp(ufbxi_context *uc) +{ + // `ufbx_load_opts` must be cleared to zero first! + ufbx_assert(uc->opts._begin_zero == 0 && uc->opts._end_zero == 0); + ufbxi_check_msg(uc->opts._begin_zero == 0 && uc->opts._end_zero == 0, "Uninitialized options"); + ufbxi_check(uc->opts.path_separator >= 0x20 && uc->opts.path_separator <= 0x7e); + + ufbxi_check(ufbxi_fixup_opts_string(uc, &uc->opts.filename, false)); + ufbxi_check(ufbxi_fixup_opts_string(uc, &uc->opts.obj_mtl_path, true)); + ufbxi_check(ufbxi_fixup_opts_string(uc, &uc->opts.geometry_transform_helper_name, true)); + + if (!uc->opts.allow_unsafe) { + ufbxi_check_msg(uc->opts.index_error_handling != UFBX_INDEX_ERROR_HANDLING_UNSAFE_IGNORE, "Unsafe options"); + ufbxi_check_msg(uc->opts.unicode_error_handling != UFBX_UNICODE_ERROR_HANDLING_UNSAFE_IGNORE, "Unsafe options"); + } else { + uc->scene.metadata.is_unsafe = true; + } + + if (uc->opts.index_error_handling == UFBX_INDEX_ERROR_HANDLING_NO_INDEX) { + uc->scene.metadata.may_contain_no_index = true; + } + + uc->scene.metadata.may_contain_null_materials = uc->opts.allow_null_material; + uc->scene.metadata.may_contain_missing_vertex_position = uc->opts.allow_missing_vertex_position; + uc->scene.metadata.may_contain_broken_elements = uc->opts.connect_broken_elements; + + uc->scene.metadata.creator.data = ufbxi_empty_char; + + uc->unit_scale = 1.0f; + + ufbxi_check(ufbxi_load_strings(uc)); + ufbxi_check(ufbxi_load_maps(uc)); + ufbxi_check(ufbxi_determine_format(uc)); + + ufbx_file_format format = uc->scene.metadata.file_format; + + if (format == UFBX_FILE_FORMAT_FBX) { + ufbxi_check(ufbxi_begin_parse(uc)); + if (uc->version < 6000) { + ufbxi_check(ufbxi_read_legacy_root(uc)); + } else { + ufbxi_check(ufbxi_read_root(uc)); + } + ufbxi_update_scene_metadata(&uc->scene.metadata); + ufbxi_check(ufbxi_init_file_paths(uc)); + } else if (format == UFBX_FILE_FORMAT_OBJ) { + ufbxi_check(ufbxi_obj_load(uc)); + ufbxi_update_scene_metadata(&uc->scene.metadata); + } else if (format == UFBX_FILE_FORMAT_MTL) { + ufbxi_check(ufbxi_mtl_load(uc)); + ufbxi_update_scene_metadata(&uc->scene.metadata); + } + + // Fake DOM root if necessary + if (uc->opts.retain_dom && !uc->scene.dom_root) { + ufbx_dom_node *dom_root = ufbxi_push_zero(&uc->result, ufbx_dom_node, 1); + ufbxi_check(dom_root); + dom_root->name.data = ufbxi_empty_char; + uc->scene.dom_root = dom_root; + } + + ufbxi_check(ufbxi_pre_finalize_scene(uc)); + + // We can free `tmp_parse` already here as all parsing is done by now. + ufbxi_buf_free(&uc->tmp_parse); + + ufbxi_check(ufbxi_finalize_scene(uc)); + + ufbxi_update_scene_settings(&uc->scene.settings); + + // Axis conversion + if (ufbx_coordinate_axes_valid(uc->opts.target_axes)) { + ufbxi_transform_to_axes(uc, uc->opts.target_axes); + } + + // Unit conversion + if (uc->opts.target_unit_meters > 0.0f) { + ufbxi_check(ufbxi_scale_units(uc, uc->opts.target_unit_meters)); + } + + // TODO: This could be done in evaluate as well with refactoring + ufbxi_update_adjust_transforms(uc, &uc->scene); + + ufbxi_update_scene(&uc->scene, true); + + if (uc->opts.load_external_files) { + ufbxi_check(ufbxi_load_external_files(uc)); + } + + // Evaluate skinning if requested + if (uc->opts.evaluate_skinning) { + ufbx_geometry_cache_data_opts cache_opts = { 0 }; + cache_opts.open_file_cb = uc->opts.open_file_cb; + ufbxi_check(ufbxi_evaluate_skinning(&uc->scene, &uc->error, &uc->result, &uc->tmp, + 0.0, uc->opts.load_external_files && uc->opts.evaluate_caches, &cache_opts)); + } + + // Pop warnings to metadata + ufbxi_check(ufbxi_pop_warnings(&uc->warnings, &uc->scene.metadata.warnings, uc->scene.metadata.has_warning)); + + // Copy local data to the scene + uc->scene.metadata.version = uc->version; + uc->scene.metadata.ascii = uc->from_ascii; + uc->scene.metadata.big_endian = uc->file_big_endian; + uc->scene.metadata.geometry_ignored = uc->opts.ignore_geometry; + uc->scene.metadata.animation_ignored = uc->opts.ignore_animation; + uc->scene.metadata.embedded_ignored = uc->opts.ignore_embedded; + + // Retain the scene, this must be the final allocation as we copy + // `ator_result` to `ufbx_scene_imp`. + ufbxi_scene_imp *imp = ufbxi_push(&uc->result, ufbxi_scene_imp, 1); + ufbxi_check(imp); + + ufbxi_init_ref(&imp->refcount, UFBXI_SCENE_IMP_MAGIC, NULL); + + imp->magic = UFBXI_SCENE_IMP_MAGIC; + imp->scene = uc->scene; + imp->ator = uc->ator_result; + imp->ator.error = NULL; + + // Copy retained buffers and translate the allocator struct to the one + // contained within `ufbxi_scene_imp` + imp->result_buf = uc->result; + imp->result_buf.ator = &imp->ator; + imp->string_buf = uc->string_pool.buf; + imp->string_buf.ator = &imp->ator; + + imp->scene.metadata.result_memory_used = imp->ator.current_size; + imp->scene.metadata.temp_memory_used = uc->ator_tmp.current_size; + imp->scene.metadata.result_allocs = imp->ator.num_allocs; + imp->scene.metadata.temp_allocs = uc->ator_tmp.num_allocs; + + ufbxi_for_ptr_list(ufbx_element, p_elem, imp->scene.elements) { + (*p_elem)->scene = &imp->scene; + } + + uc->scene_imp = imp; + + return 1; +} + +static ufbxi_noinline void ufbxi_free_temp(ufbxi_context *uc) +{ + ufbxi_string_pool_temp_free(&uc->string_pool); + ufbxi_buf_free(&uc->warnings.tmp_stack); + + ufbxi_map_free(&uc->prop_type_map); + ufbxi_map_free(&uc->fbx_id_map); + ufbxi_map_free(&uc->texture_file_map); + ufbxi_map_free(&uc->fbx_attr_map); + ufbxi_map_free(&uc->node_prop_set); + ufbxi_map_free(&uc->dom_node_map); + + ufbxi_buf_free(&uc->tmp); + ufbxi_buf_free(&uc->tmp_parse); + ufbxi_buf_free(&uc->tmp_stack); + ufbxi_buf_free(&uc->tmp_connections); + ufbxi_buf_free(&uc->tmp_node_ids); + ufbxi_buf_free(&uc->tmp_elements); + ufbxi_buf_free(&uc->tmp_element_offsets); + ufbxi_buf_free(&uc->tmp_element_ptrs); + for (size_t i = 0; i < UFBX_ELEMENT_TYPE_COUNT; i++) { + ufbxi_buf_free(&uc->tmp_typed_element_offsets[i]); + } + ufbxi_buf_free(&uc->tmp_mesh_textures); + ufbxi_buf_free(&uc->tmp_full_weights); + ufbxi_buf_free(&uc->tmp_dom_nodes); + + ufbxi_free(&uc->ator_tmp, ufbxi_node, uc->top_nodes, uc->top_nodes_cap); + ufbxi_free(&uc->ator_tmp, void*, uc->element_extra_arr, uc->element_extra_cap); + + ufbxi_free(&uc->ator_tmp, char, uc->ascii.token.str_data, uc->ascii.token.str_cap); + ufbxi_free(&uc->ator_tmp, char, uc->ascii.prev_token.str_data, uc->ascii.prev_token.str_cap); + + ufbxi_free(&uc->ator_tmp, char, uc->read_buffer, uc->read_buffer_size); + ufbxi_free(&uc->ator_tmp, char, uc->tmp_arr, uc->tmp_arr_size); + ufbxi_free(&uc->ator_tmp, char, uc->swap_arr, uc->swap_arr_size); + + ufbxi_obj_free(uc); + + ufbxi_free_ator(&uc->ator_tmp); +} + +static ufbxi_noinline void ufbxi_free_result(ufbxi_context *uc) +{ + ufbxi_buf_free(&uc->result); + ufbxi_buf_free(&uc->string_pool.buf); + + ufbxi_free_ator(&uc->ator_result); +} + +static ufbxi_noinline ufbx_scene *ufbxi_load(ufbxi_context *uc, const ufbx_load_opts *user_opts, ufbx_error *p_error) +{ + // Test endianness + { + uint8_t buf[2]; + uint16_t val = 0xbbaa; + memcpy(buf, &val, 2); + uc->local_big_endian = buf[0] == 0xbb; + } + + if (user_opts) { + uc->opts = *user_opts; + } else { + memset(&uc->opts, 0, sizeof(uc->opts)); + } + + if (uc->opts.file_size_estimate) { + uc->progress_bytes_total = uc->opts.file_size_estimate; + } + + if (uc->opts.ignore_all_content) { + uc->opts.ignore_geometry = true; + uc->opts.ignore_animation = true; + uc->opts.ignore_embedded = true; + } + + ufbx_inflate_retain inflate_retain; + inflate_retain.initialized = false; + + ufbxi_init_ator(&uc->error, &uc->ator_tmp, &uc->opts.temp_allocator, "temp"); + ufbxi_init_ator(&uc->error, &uc->ator_result, &uc->opts.result_allocator, "result"); + + if (uc->opts.read_buffer_size == 0) { + uc->opts.read_buffer_size = 0x4000; + } + + if (uc->opts.file_format_lookahead == 0) { + uc->opts.file_format_lookahead = 0x4000; + } else if (uc->opts.file_format_lookahead < UFBXI_MIN_FILE_FORMAT_LOOKAHEAD) { + uc->opts.file_format_lookahead = UFBXI_MIN_FILE_FORMAT_LOOKAHEAD; + } + + if (!uc->opts.path_separator) { + uc->opts.path_separator = UFBX_PATH_SEPARATOR; + } + + if (!uc->opts.progress_cb.fn || uc->opts.progress_interval_hint >= SIZE_MAX) { + uc->progress_interval = SIZE_MAX; + } else if (uc->opts.progress_interval_hint > 0) { + uc->progress_interval = (size_t)uc->opts.progress_interval_hint; + } else { + uc->progress_interval = 0x4000; + } + + if (!uc->opts.open_file_cb.fn) { + uc->opts.open_file_cb.fn = &ufbx_default_open_file; + } + + uc->string_pool.error = &uc->error; + ufbxi_map_init(&uc->string_pool.map, &uc->ator_tmp, &ufbxi_map_cmp_string, NULL); + uc->string_pool.buf.ator = &uc->ator_result; + uc->string_pool.buf.unordered = true; + uc->string_pool.initial_size = 1024; + uc->string_pool.error_handling = uc->opts.unicode_error_handling; + + ufbxi_map_init(&uc->prop_type_map, &uc->ator_tmp, &ufbxi_map_cmp_const_char_ptr, NULL); + ufbxi_map_init(&uc->fbx_id_map, &uc->ator_tmp, &ufbxi_map_cmp_uint64, NULL); + ufbxi_map_init(&uc->texture_file_map, &uc->ator_tmp, &ufbxi_map_cmp_const_char_ptr, NULL); + ufbxi_map_init(&uc->fbx_attr_map, &uc->ator_tmp, &ufbxi_map_cmp_uint64, NULL); + ufbxi_map_init(&uc->node_prop_set, &uc->ator_tmp, &ufbxi_map_cmp_const_char_ptr, NULL); + ufbxi_map_init(&uc->dom_node_map, &uc->ator_tmp, &ufbxi_map_cmp_uintptr, NULL); + + uc->tmp.ator = &uc->ator_tmp; + uc->tmp_parse.ator = &uc->ator_tmp; + uc->tmp_stack.ator = &uc->ator_tmp; + uc->tmp_connections.ator = &uc->ator_tmp; + uc->tmp_node_ids.ator = &uc->ator_tmp; + uc->tmp_elements.ator = &uc->ator_tmp; + uc->tmp_element_offsets.ator = &uc->ator_tmp; + uc->tmp_element_ptrs.ator = &uc->ator_tmp; + for (size_t i = 0; i < UFBX_ELEMENT_TYPE_COUNT; i++) { + uc->tmp_typed_element_offsets[i].ator = &uc->ator_tmp; + } + uc->tmp_mesh_textures.ator = &uc->ator_tmp; + uc->tmp_full_weights.ator = &uc->ator_tmp; + uc->tmp_dom_nodes.ator = &uc->ator_tmp; + + uc->result.ator = &uc->ator_result; + + uc->tmp.unordered = true; + uc->tmp_parse.unordered = true; + uc->tmp_parse.clearable = true; + uc->result.unordered = true; + + uc->warnings.error = &uc->error; + uc->warnings.result = &uc->result; + uc->warnings.tmp_stack.ator = &uc->ator_tmp; + uc->string_pool.warnings = &uc->warnings; + + // Set zero size `swap_arr` to a non-NULL buffer so we can tell the difference between empty + // array and an allocation failure. + uc->swap_arr = (char*)ufbxi_zero_size_buffer; + + // NOTE: Though `inflate_retain` leaks out of the scope we don't use it outside this function. + // cppcheck-suppress autoVariables + uc->inflate_retain = &inflate_retain; + + int ok = ufbxi_load_imp(uc); + + ufbxi_free_temp(uc); + + if (uc->close_fn) { + uc->close_fn(uc->read_user); + } + + if (ok) { + if (p_error) { + ufbxi_clear_error(p_error); + } + return &uc->scene_imp->scene; + } else { + ufbxi_fix_error_type(&uc->error, "Failed to load"); + if (p_error) *p_error = uc->error; + ufbxi_free_result(uc); + return NULL; + } +} + +// -- Animation evaluation + +static int ufbxi_cmp_prop_override(const void *va, const void *vb) +{ + const ufbx_prop_override *a = (const ufbx_prop_override*)va, *b = (const ufbx_prop_override*)vb; + if (a->element_id != b->element_id) return a->element_id < b->element_id ? -1 : 1; + if (a->_internal_key != b->_internal_key) return a->_internal_key < b->_internal_key ? -1 : 1; + return strcmp(a->prop_name, b->prop_name); +} + +static ufbxi_forceinline bool ufbxi_override_less_than_prop(const ufbx_prop_override *over, uint32_t element_id, const ufbx_prop *prop) +{ + if (over->element_id != element_id) return over->element_id < element_id; + if (over->_internal_key != prop->_internal_key) return over->_internal_key < prop->_internal_key; + return strcmp(over->prop_name, prop->name.data); +} + +static ufbxi_forceinline bool ufbxi_override_equals_to_prop(const ufbx_prop_override *over, uint32_t element_id, const ufbx_prop *prop) +{ + if (over->element_id != element_id) return false; + if (over->_internal_key != prop->_internal_key) return false; + return strcmp(over->prop_name, prop->name.data) == 0; +} + +static ufbxi_forceinline ufbxi_unused bool ufbxi_prop_override_is_prepared(const ufbx_prop_override *over) +{ + if (over->_internal_key != ufbxi_get_name_key_c(over->prop_name)) return false; + if (over->value_str == NULL) return false; + return true; +} + +static ufbxi_noinline bool ufbxi_find_prop_override(const ufbx_const_prop_override_list *overrides, uint32_t element_id, ufbx_prop *prop) +{ + if (overrides->count > 0) { + // If this assert fails make sure to call `ufbx_prepare_prop_overrides()` first! + ufbx_assert(ufbxi_prop_override_is_prepared(&overrides->data[0])); + } + + size_t ix = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_prop_override, 16, &ix, overrides->data, 0, overrides->count, + ( ufbxi_override_less_than_prop(a, element_id, prop) ), + ( ufbxi_override_equals_to_prop(a, element_id, prop) )); + + if (ix != SIZE_MAX) { + const ufbx_prop_override *over = &overrides->data[ix]; + const uint32_t clear_flags = UFBX_PROP_FLAG_NO_VALUE | UFBX_PROP_FLAG_NOT_FOUND; + prop->flags = (ufbx_prop_flags)(((uint32_t)prop->flags & ~clear_flags) | UFBX_PROP_FLAG_OVERRIDDEN); + prop->value_vec3 = over->value; + prop->value_real_arr[3] = 0.0f; + prop->value_int = over->value_int; + prop->value_str = ufbxi_str_c(over->value_str); + prop->value_blob.data = prop->value_str.data; + prop->value_blob.size = prop->value_str.length; + return true; + } else { + return false; + } +} + +static ufbxi_noinline ufbx_const_prop_override_list ufbxi_find_element_prop_overrides(const ufbx_const_prop_override_list *overrides, uint32_t element_id) +{ + if (overrides->count > 0) { + // If this assert fails make sure to call `ufbx_prepare_prop_overrides()` first! + ufbx_assert(ufbxi_prop_override_is_prepared(&overrides->data[0])); + } + + size_t begin = overrides->count, end = begin; + + ufbxi_macro_lower_bound_eq(ufbx_prop_override, 32, &begin, overrides->data, 0, overrides->count, + (a->element_id < element_id), + (a->element_id == element_id)); + + ufbxi_macro_upper_bound_eq(ufbx_prop_override, 32, &end, overrides->data, begin, overrides->count, + (a->element_id == element_id)); + + ufbx_const_prop_override_list result = { overrides->data + begin, end - begin }; + return result; +} + +typedef struct ufbxi_anim_layer_combine_ctx { + ufbx_anim anim; + const ufbx_element *element; + double time; + ufbx_rotation_order rotation_order; + bool has_rotation_order; +} ufbxi_anim_layer_combine_ctx; + +static double ufbxi_pow_abs(double v, double e) +{ + if (e <= 0.0) return 1.0; + if (e >= 1.0) return v; + double sign = v < 0.0 ? -1.0 : 1.0; + return sign * ufbx_pow(v * sign, e); +} + +// Recursion is limited by the fact that we recurse only when the property name is "Lcl Rotation" +// and when recursing we always evaluate the property "RotationOrder" +static ufbxi_noinline void ufbxi_combine_anim_layer(ufbxi_anim_layer_combine_ctx *ctx, ufbx_anim_layer *layer, ufbx_real weight, const char *prop_name, ufbx_vec3 *result, const ufbx_vec3 *value) + ufbxi_recursive_function_void(ufbxi_combine_anim_layer, (ctx, layer, weight, prop_name, result, value), 2, + (ufbxi_anim_layer_combine_ctx *ctx, ufbx_anim_layer *layer, ufbx_real weight, const char *prop_name, ufbx_vec3 *result, const ufbx_vec3 *value)) +{ + if (layer->compose_rotation && layer->blended && prop_name == ufbxi_Lcl_Rotation && !ctx->has_rotation_order) { + ufbx_prop rp = ufbx_evaluate_prop_len(&ctx->anim, ctx->element, ufbxi_RotationOrder, sizeof(ufbxi_RotationOrder) - 1, ctx->time); + // NOTE: Defaults to 0 (UFBX_ROTATION_XYZ) gracefully if property is not found + if (rp.value_int >= 0 && rp.value_int <= UFBX_ROTATION_ORDER_SPHERIC) { + ctx->rotation_order = (ufbx_rotation_order)rp.value_int; + } else { + ctx->rotation_order = UFBX_ROTATION_ORDER_XYZ; + } + ctx->has_rotation_order = true; + } + + if (layer->additive) { + if (layer->compose_scale && prop_name == ufbxi_Lcl_Scaling) { + result->x *= (ufbx_real)ufbxi_pow_abs(value->x, weight); + result->y *= (ufbx_real)ufbxi_pow_abs(value->y, weight); + result->z *= (ufbx_real)ufbxi_pow_abs(value->z, weight); + } else if (layer->compose_rotation && prop_name == ufbxi_Lcl_Rotation) { + ufbx_quat a = ufbx_euler_to_quat(*result, ctx->rotation_order); + ufbx_quat b = ufbx_euler_to_quat(*value, ctx->rotation_order); + b = ufbx_quat_slerp(ufbx_identity_quat, b, weight); + ufbx_quat res = ufbxi_mul_quat(a, b); + *result = ufbx_quat_to_euler(res, ctx->rotation_order); + } else { + result->x += value->x * weight; + result->y += value->y * weight; + result->z += value->z * weight; + } + } else if (layer->blended) { + ufbx_real res_weight = 1.0f - weight; + if (layer->compose_scale && prop_name == ufbxi_Lcl_Scaling) { + result->x = (ufbx_real)(ufbxi_pow_abs(result->x, res_weight) * ufbxi_pow_abs(value->x, weight)); + result->y = (ufbx_real)(ufbxi_pow_abs(result->y, res_weight) * ufbxi_pow_abs(value->y, weight)); + result->z = (ufbx_real)(ufbxi_pow_abs(result->z, res_weight) * ufbxi_pow_abs(value->z, weight)); + } else if (layer->compose_rotation && prop_name == ufbxi_Lcl_Rotation) { + ufbx_quat a = ufbx_euler_to_quat(*result, ctx->rotation_order); + ufbx_quat b = ufbx_euler_to_quat(*value, ctx->rotation_order); + ufbx_quat res = ufbx_quat_slerp(a, b, weight); + *result = ufbx_quat_to_euler(res, ctx->rotation_order); + } else { + result->x = result->x * res_weight + value->x * weight; + result->y = result->y * res_weight + value->y * weight; + result->z = result->z * res_weight + value->z * weight; + } + } else { + *result = *value; + } +} + +static ufbxi_forceinline bool ufbxi_anim_layer_might_contain_id(const ufbx_anim_layer *layer, uint32_t id) +{ + uint32_t id_mask = ufbxi_arraycount(layer->_element_id_bitmask) - 1; + bool ok = id - layer->_min_element_id <= (layer->_max_element_id - layer->_min_element_id); + ok &= (layer->_element_id_bitmask[(id >> 5) & id_mask] & (1u << (id & 31))) != 0; + return ok; +} + +static ufbxi_noinline void ufbxi_evaluate_props(const ufbx_anim *anim, const ufbx_element *element, double time, ufbx_prop *props, size_t num_props) +{ + ufbxi_anim_layer_combine_ctx combine_ctx = { *anim, element, time }; + + uint32_t element_id = element->element_id; + ufbxi_for_list(const ufbx_anim_layer_desc, layer_desc, anim->layers) { + ufbx_anim_layer *layer = layer_desc->layer; + if (!ufbxi_anim_layer_might_contain_id(layer, element_id)) continue; + + // Find the weight for the current layer + // TODO: Should this be searched from multiple layers? + // TODO: Use weight from layer_desc + ufbx_real weight = layer->weight; + if (layer->weight_is_animated && layer->blended) { + ufbx_anim_prop *weight_aprop = ufbxi_find_anim_prop_start(layer, &layer->element); + if (weight_aprop) { + weight = ufbx_evaluate_anim_value_real(weight_aprop->anim_value, time) / (ufbx_real)100.0; + if (weight < 0.0f) weight = 0.0f; + if (weight > 0.99999f) weight = 1.0f; + } + } + + ufbx_anim_prop *aprop = ufbxi_find_anim_prop_start(layer, element); + if (!aprop) continue; + + for (size_t i = 0; i < num_props; i++) { + ufbx_prop *prop = &props[i]; + + // Don't evaluate on top of overridden properties + if ((prop->flags & UFBX_PROP_FLAG_OVERRIDDEN) != 0) continue; + + // Connections override animation by default + if ((prop->flags & UFBX_PROP_FLAG_CONNECTED) != 0 && !anim->ignore_connections) continue; + + // Skip until we reach `aprop >= prop` + while (aprop->element == element && aprop->_internal_key < prop->_internal_key) aprop++; + if (aprop->prop_name.data != prop->name.data) { + while (aprop->element == element && strcmp(aprop->prop_name.data, prop->name.data) < 0) aprop++; + } + + // TODO: Should we skip the blending for the first layer _per property_ + // This could be done by having `UFBX_PROP_FLAG_ANIMATION_EVALUATED` + // that gets set for the first layer of animation that is applied. + if (aprop->prop_name.data == prop->name.data) { + ufbx_vec3 v = ufbx_evaluate_anim_value_vec3(aprop->anim_value, time); + if (layer_desc == anim->layers.data) { + prop->value_vec3 = v; + } else { + ufbxi_combine_anim_layer(&combine_ctx, layer, weight, prop->name.data, &prop->value_vec3, &v); + } + } + } + } + + ufbxi_for(ufbx_prop, prop, props, num_props) { + prop->value_int = ufbxi_f64_to_i64(prop->value_real); + } +} + +// Recursion limited by not calling `ufbx_evaluate_prop_len()` with a connected property, +// meaning it will never call `ufbxi_evaluate_connected_prop()` again indirectly. +static ufbxi_noinline void ufbxi_evaluate_connected_prop(ufbx_prop *prop, const ufbx_anim *anim, const ufbx_element *element, const char *name, double time) + ufbxi_recursive_function_void(ufbxi_evaluate_connected_prop, (prop, anim, element, name, time), 3, + (ufbx_prop *prop, const ufbx_anim *anim, const ufbx_element *element, const char *name, double time)) +{ + ufbx_connection *conn = ufbxi_find_prop_connection(element, name); + + for (size_t i = 0; i < 1000 && conn; i++) { + ufbx_connection *next_conn = ufbxi_find_prop_connection(conn->src, conn->src_prop.data); + if (!next_conn) break; + conn = next_conn; + } + + // Found a non-cyclic connection + if (conn && !ufbxi_find_prop_connection(conn->src, conn->src_prop.data)) { + ufbx_prop ep = ufbx_evaluate_prop_len(anim, conn->src, conn->src_prop.data, conn->src_prop.length, time); + prop->value_vec4 = ep.value_vec4; + prop->value_int = ep.value_int; + prop->value_str = ep.value_str; + prop->value_blob = ep.value_blob; + } else { + // Connection not found, maybe it's animated? + prop->flags = (ufbx_prop_flags)((uint32_t)prop->flags & ~(uint32_t)UFBX_PROP_FLAG_CONNECTED); + } +} + +static ufbxi_noinline ufbx_props ufbxi_evaluate_selected_props(const ufbx_anim *anim, const ufbx_element *element, double time, ufbx_prop *props, const char **prop_names, size_t max_props) +{ + const char *name = prop_names[0]; + uint32_t key = ufbxi_get_name_key_c(name); + size_t num_props = 0; + + const ufbx_prop_override *over = NULL, *over_end = NULL; + if (anim->prop_overrides.count > 0) { + ufbx_const_prop_override_list list = ufbxi_find_element_prop_overrides(&anim->prop_overrides, element->element_id); + over = list.data; + over_end = over + list.count; + } + +#if defined(UFBX_REGRESSION) + for (size_t i = 1; i < max_props; i++) { + ufbx_assert(strcmp(prop_names[i - 1], prop_names[i]) < 0); + } +#endif + + size_t name_ix = 0; + for (size_t i = 0; i < element->props.props.count; i++) { + ufbx_prop *prop = &element->props.props.data[i]; + + while (name_ix < max_props) { + if (key > prop->_internal_key) break; + + if (over) { + bool found_override = false; + for (; over != over_end; over++) { + ufbx_prop *dst = &props[num_props]; + if (over->_internal_key < key || strcmp(over->prop_name, name) < 0) { + continue; + } else if (over->_internal_key == key && strcmp(over->prop_name, name) == 0) { + dst->name = ufbxi_str_c(name); + dst->_internal_key = key; + dst->type = UFBX_PROP_UNKNOWN; + dst->flags = UFBX_PROP_FLAG_OVERRIDDEN; + } else { + break; + } + dst->value_str = ufbxi_str_c(over->value_str); + dst->value_blob.data = dst->value_str.data; + dst->value_blob.size = dst->value_str.length; + dst->value_int = over->value_int; + dst->value_vec3 = over->value; + dst->value_real_arr[3] = 0.0f; + num_props++; + found_override = true; + } + if (found_override) break; + } + + if (name == prop->name.data) { + if ((prop->flags & UFBX_PROP_FLAG_CONNECTED) != 0 && !anim->ignore_connections) { + ufbx_prop *dst = &props[num_props++]; + *dst = *prop; + ufbxi_evaluate_connected_prop(dst, anim, element, name, time); + } else if (prop->flags & UFBX_PROP_FLAG_ANIMATED) { + props[num_props++] = *prop; + } + break; + } else if (strcmp(name, prop->name.data) < 0) { + name_ix++; + if (name_ix < max_props) { + name = prop_names[name_ix]; + key = ufbxi_get_name_key_c(name); + } + } else { + break; + } + } + } + + if (over) { + for (; over != over_end && name_ix < max_props; over++) { + ufbx_prop *dst = &props[num_props]; + if (over->_internal_key < key || strcmp(over->prop_name, name) < 0) { + continue; + } else if (over->_internal_key == key && strcmp(over->prop_name, name) == 0) { + dst->name = ufbxi_str_c(name); + dst->_internal_key = key; + dst->type = UFBX_PROP_UNKNOWN; + dst->flags = UFBX_PROP_FLAG_OVERRIDDEN; + } else { + name_ix++; + if (name_ix < max_props) { + name = prop_names[name_ix]; + key = ufbxi_get_name_key_c(name); + } + } + dst->value_str = ufbxi_str_c(over->value_str); + dst->value_blob.data = dst->value_str.data; + dst->value_blob.size = dst->value_str.length; + dst->value_int = over->value_int; + dst->value_vec3 = over->value; + dst->value_real_arr[3] = 0.0f; + num_props++; + } + } + + ufbxi_evaluate_props(anim, element, time, props, num_props); + + ufbx_props prop_list; + prop_list.props.data = props; + prop_list.props.count = prop_list.num_animated = num_props; + prop_list.defaults = (ufbx_props*)&element->props; + return prop_list; +} + +#if UFBXI_FEATURE_SCENE_EVALUATION + +typedef struct { + char *src_element; + char *dst_element; + + ufbxi_scene_imp *src_imp; + ufbx_scene src_scene; + ufbx_evaluate_opts opts; + ufbx_anim anim; + double time; + + ufbx_error error; + + // Allocators + ufbxi_allocator ator_result; + ufbxi_allocator ator_tmp; + + ufbxi_buf result; + ufbxi_buf tmp; + + ufbx_scene scene; + + ufbxi_scene_imp *scene_imp; +} ufbxi_eval_context; + +static ufbxi_forceinline ufbx_element *ufbxi_translate_element(ufbxi_eval_context *ec, void *elem) +{ + return elem ? (ufbx_element*)(ec->dst_element + ((char*)elem - ec->src_element)) : NULL; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_translate_element_list(ufbxi_eval_context *ec, void *p_list) +{ + ufbx_element_list *list = (ufbx_element_list*)p_list; + size_t count = list->count; + ufbx_element **src = list->data; + ufbx_element **dst = ufbxi_push(&ec->result, ufbx_element*, count); + ufbxi_check_err(&ec->error, dst); + list->data = dst; + for (size_t i = 0; i < count; i++) { + dst[i] = ufbxi_translate_element(ec, src[i]); + } + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_translate_anim(ufbxi_eval_context *ec, ufbx_anim *anim) +{ + ufbx_anim_layer_desc *layers = ufbxi_push(&ec->result, ufbx_anim_layer_desc, anim->layers.count); + ufbxi_check_err(&ec->error, layers); + for (size_t i = 0; i < anim->layers.count; i++) { + layers[i] = anim->layers.data[i]; + layers[i].layer = (ufbx_anim_layer*)ufbxi_translate_element(ec, layers[i].layer); + } + anim->layers.data = layers; + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_evaluate_imp(ufbxi_eval_context *ec) +{ + // `ufbx_evaluate_opts` must be cleared to zero first! + ufbx_assert(ec->opts._begin_zero == 0 && ec->opts._end_zero == 0); + ufbxi_check_err_msg(&ec->error, ec->opts._begin_zero == 0 && ec->opts._end_zero == 0, "Uninitialized options"); + + ec->scene = ec->src_scene; + size_t num_elements = ec->scene.elements.count; + + char *element_data = (char*)ufbxi_push(&ec->result, uint64_t, ec->scene.metadata.element_buffer_size/8); + ufbxi_check_err(&ec->error, element_data); + + ec->scene.elements.data = ufbxi_push(&ec->result, ufbx_element*, num_elements); + ufbxi_check_err(&ec->error, ec->scene.elements.data); + + ec->src_element = (char*)ec->src_scene.elements.data[0]; + ec->dst_element = element_data; + + for (size_t i = 0; i < UFBX_ELEMENT_TYPE_COUNT; i++) { + ec->scene.elements_by_type[i].data = ufbxi_push(&ec->result, ufbx_element*, ec->scene.elements_by_type[i].count); + ufbxi_check_err(&ec->error, ec->scene.elements_by_type[i].data); + } + + size_t num_connections = ec->scene.connections_dst.count; + ec->scene.connections_src.data = ufbxi_push(&ec->result, ufbx_connection, num_connections); + ec->scene.connections_dst.data = ufbxi_push(&ec->result, ufbx_connection, num_connections); + ufbxi_check_err(&ec->error, ec->scene.connections_src.data); + ufbxi_check_err(&ec->error, ec->scene.connections_dst.data); + for (size_t i = 0; i < num_connections; i++) { + ufbx_connection *src = &ec->scene.connections_src.data[i]; + ufbx_connection *dst = &ec->scene.connections_dst.data[i]; + *src = ec->src_scene.connections_src.data[i]; + *dst = ec->src_scene.connections_dst.data[i]; + src->src = ufbxi_translate_element(ec, src->src); + src->dst = ufbxi_translate_element(ec, src->dst); + dst->src = ufbxi_translate_element(ec, dst->src); + dst->dst = ufbxi_translate_element(ec, dst->dst); + } + + ec->scene.elements_by_name.data = ufbxi_push(&ec->result, ufbx_name_element, num_elements); + ufbxi_check_err(&ec->error, ec->scene.elements_by_name.data); + + ec->scene.root_node = (ufbx_node*)ufbxi_translate_element(ec, ec->scene.root_node); + ufbxi_check_err(&ec->error, ufbxi_translate_anim(ec, &ec->scene.anim)); + ufbxi_check_err(&ec->error, ufbxi_translate_anim(ec, &ec->scene.combined_anim)); + + for (size_t i = 0; i < num_elements; i++) { + ufbx_element *src = ec->src_scene.elements.data[i]; + ufbx_element *dst = ufbxi_translate_element(ec, src); + size_t size = ufbx_element_type_size[src->type]; + ufbx_assert(size > 0); + memcpy(dst, src, size); + + ec->scene.elements.data[i] = dst; + ec->scene.elements_by_type[src->type].data[src->typed_id] = dst; + + dst->connections_src.data = ec->scene.connections_src.data + (dst->connections_src.data - ec->src_scene.connections_src.data); + dst->connections_dst.data = ec->scene.connections_dst.data + (dst->connections_dst.data - ec->src_scene.connections_dst.data); + if (dst->instances.count > 0) { + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &dst->instances)); + } + + ufbx_name_element named = ec->src_scene.elements_by_name.data[i]; + named.element = ufbxi_translate_element(ec, named.element); + ec->scene.elements_by_name.data[i] = named; + } + + ufbxi_for_ptr_list(ufbx_node, p_node, ec->scene.nodes) { + ufbx_node *node = *p_node; + node->parent = (ufbx_node*)ufbxi_translate_element(ec, node->parent); + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &node->children)); + + node->attrib = ufbxi_translate_element(ec, node->attrib); + node->mesh = (ufbx_mesh*)ufbxi_translate_element(ec, node->mesh); + node->light = (ufbx_light*)ufbxi_translate_element(ec, node->light); + node->camera = (ufbx_camera*)ufbxi_translate_element(ec, node->camera); + node->bone = (ufbx_bone*)ufbxi_translate_element(ec, node->bone); + + if (node->all_attribs.count > 1) { + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &node->all_attribs)); + } else if (node->all_attribs.count == 1) { + node->all_attribs.data = &node->attrib; + } + + node->geometry_transform_helper = (ufbx_node*)ufbxi_translate_element(ec, node->geometry_transform_helper); + + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &node->materials)); + } + + ufbxi_for_ptr_list(ufbx_mesh, p_mesh, ec->scene.meshes) { + ufbx_mesh *mesh = *p_mesh; + + ufbx_mesh_material *materials = ufbxi_push(&ec->result, ufbx_mesh_material, mesh->materials.count); + ufbxi_check_err(&ec->error, materials); + for (size_t i = 0; i < mesh->materials.count; i++) { + materials[i] = mesh->materials.data[i]; + materials[i].material = (ufbx_material*)ufbxi_translate_element(ec, materials[i].material); + } + mesh->materials.data = materials; + + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &mesh->skin_deformers)); + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &mesh->blend_deformers)); + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &mesh->cache_deformers)); + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &mesh->all_deformers)); + } + + ufbxi_for_ptr_list(ufbx_stereo_camera, p_stereo, ec->scene.stereo_cameras) { + ufbx_stereo_camera *stereo = *p_stereo; + stereo->left = (ufbx_camera*)ufbxi_translate_element(ec, stereo->left); + stereo->right = (ufbx_camera*)ufbxi_translate_element(ec, stereo->right); + } + + ufbxi_for_ptr_list(ufbx_skin_deformer, p_skin, ec->scene.skin_deformers) { + ufbx_skin_deformer *skin = *p_skin; + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &skin->clusters)); + } + + ufbxi_for_ptr_list(ufbx_skin_cluster, p_cluster, ec->scene.skin_clusters) { + ufbx_skin_cluster *cluster = *p_cluster; + cluster->bone_node = (ufbx_node*)ufbxi_translate_element(ec, cluster->bone_node); + } + + ufbxi_for_ptr_list(ufbx_blend_deformer, p_blend, ec->scene.blend_deformers) { + ufbx_blend_deformer *blend = *p_blend; + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &blend->channels)); + } + + ufbxi_for_ptr_list(ufbx_blend_channel, p_chan, ec->scene.blend_channels) { + ufbx_blend_channel *chan = *p_chan; + + ufbx_blend_keyframe *keys = ufbxi_push(&ec->result, ufbx_blend_keyframe, chan->keyframes.count); + ufbxi_check_err(&ec->error, keys); + for (size_t i = 0; i < chan->keyframes.count; i++) { + keys[i] = chan->keyframes.data[i]; + keys[i].shape = (ufbx_blend_shape*)ufbxi_translate_element(ec, keys[i].shape); + } + chan->keyframes.data = keys; + } + + ufbxi_for_ptr_list(ufbx_cache_deformer, p_deformer, ec->scene.cache_deformers) { + ufbx_cache_deformer *deformer = *p_deformer; + deformer->file = (ufbx_cache_file*)ufbxi_translate_element(ec, deformer->file); + } + + ufbxi_for_ptr_list(ufbx_material, p_material, ec->scene.materials) { + ufbx_material *material = *p_material; + + material->shader = (ufbx_shader*)ufbxi_translate_element(ec, material->shader); + for (size_t i = 0; i < UFBX_MATERIAL_FBX_MAP_COUNT; i++) { + ufbx_material_map *map = &material->fbx.maps[i]; + map->texture = (ufbx_texture*)ufbxi_translate_element(ec, map->texture); + } + for (size_t i = 0; i < UFBX_MATERIAL_PBR_MAP_COUNT; i++) { + ufbx_material_map *map = &material->pbr.maps[i]; + map->texture = (ufbx_texture*)ufbxi_translate_element(ec, map->texture); + } + + ufbx_material_texture *textures = ufbxi_push(&ec->result, ufbx_material_texture, material->textures.count); + ufbxi_check_err(&ec->error, textures); + for (size_t i = 0; i < material->textures.count; i++) { + textures[i] = material->textures.data[i]; + textures[i].texture = (ufbx_texture*)ufbxi_translate_element(ec, textures[i].texture); + } + material->textures.data = textures; + } + + ufbxi_for_ptr_list(ufbx_texture, p_texture, ec->scene.textures) { + ufbx_texture *texture = *p_texture; + texture->video = (ufbx_video*)ufbxi_translate_element(ec, texture->video); + + ufbx_texture_layer *layers = ufbxi_push(&ec->result, ufbx_texture_layer, texture->layers.count); + ufbxi_check_err(&ec->error, layers); + for (size_t i = 0; i < texture->layers.count; i++) { + layers[i] = texture->layers.data[i]; + layers[i].texture = (ufbx_texture*)ufbxi_translate_element(ec, layers[i].texture); + } + texture->layers.data = layers; + + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &texture->file_textures)); + + if (texture->shader) { + ufbx_shader_texture *shader = texture->shader; + shader = ufbxi_push_copy(&ec->result, ufbx_shader_texture, 1, shader); + ufbxi_check_err(&ec->error, shader); + texture->shader = shader; + + ufbx_shader_texture_input *inputs = ufbxi_push_copy(&ec->result, ufbx_shader_texture_input, shader->inputs.count, shader->inputs.data); + ufbxi_check_err(&ec->error, inputs); + shader->inputs.data = inputs; + } + } + + ufbxi_for_ptr_list(ufbx_shader, p_shader, ec->scene.shaders) { + ufbx_shader *shader = *p_shader; + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &shader->bindings)); + } + + ufbxi_for_ptr_list(ufbx_display_layer, p_layer, ec->scene.display_layers) { + ufbx_display_layer *layer = *p_layer; + + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &layer->nodes)); + } + + ufbxi_for_ptr_list(ufbx_selection_set, p_set, ec->scene.selection_sets) { + ufbx_selection_set *set = *p_set; + + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &set->nodes)); + } + + ufbxi_for_ptr_list(ufbx_selection_node, p_node, ec->scene.selection_nodes) { + ufbx_selection_node *node = *p_node; + + node->target_node = (ufbx_node*)ufbxi_translate_element(ec, node->target_node); + node->target_mesh = (ufbx_mesh*)ufbxi_translate_element(ec, node->target_mesh); + } + + ufbxi_for_ptr_list(ufbx_constraint, p_constraint, ec->scene.constraints) { + ufbx_constraint *constraint = *p_constraint; + + constraint->node = (ufbx_node*)ufbxi_translate_element(ec, constraint->node); + constraint->aim_up_node = (ufbx_node*)ufbxi_translate_element(ec, constraint->aim_up_node); + constraint->ik_effector = (ufbx_node*)ufbxi_translate_element(ec, constraint->ik_effector); + constraint->ik_end_node = (ufbx_node*)ufbxi_translate_element(ec, constraint->ik_end_node); + + ufbx_constraint_target *targets = ufbxi_push(&ec->result, ufbx_constraint_target, constraint->targets.count); + ufbxi_check_err(&ec->error, targets); + for (size_t i = 0; i < constraint->targets.count; i++) { + targets[i] = constraint->targets.data[i]; + targets[i].node = (ufbx_node*)ufbxi_translate_element(ec, targets[i].node); + } + constraint->targets.data = targets; + } + + ufbxi_for_ptr_list(ufbx_anim_stack, p_stack, ec->scene.anim_stacks) { + ufbx_anim_stack *stack = *p_stack; + + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &stack->layers)); + ufbxi_check_err(&ec->error, ufbxi_translate_anim(ec, &stack->anim)); + } + + ufbxi_for_ptr_list(ufbx_anim_layer, p_layer, ec->scene.anim_layers) { + ufbx_anim_layer *layer = *p_layer; + + ufbxi_check_err(&ec->error, ufbxi_translate_element_list(ec, &layer->anim_values)); + ufbx_anim_prop *props = ufbxi_push(&ec->result, ufbx_anim_prop, layer->anim_props.count); + ufbxi_check_err(&ec->error, props); + for (size_t i = 0; i < layer->anim_props.count; i++) { + props[i] = layer->anim_props.data[i]; + props[i].element = ufbxi_translate_element(ec, props[i].element); + props[i].anim_value = (ufbx_anim_value*)ufbxi_translate_element(ec, props[i].anim_value); + } + layer->anim_props.data = props; + } + + ufbxi_for_ptr_list(ufbx_pose, p_pose, ec->scene.poses) { + ufbx_pose *pose = *p_pose; + + ufbx_bone_pose *bones = ufbxi_push(&ec->result, ufbx_bone_pose, pose->bone_poses.count); + ufbxi_check_err(&ec->error, bones); + for (size_t i = 0; i < pose->bone_poses.count; i++) { + bones[i] = pose->bone_poses.data[i]; + bones[i].bone_node = (ufbx_node*)ufbxi_translate_element(ec, bones[i].bone_node); + } + pose->bone_poses.data = bones; + } + + ufbxi_check_err(&ec->error, ufbxi_translate_anim(ec, &ec->anim)); + + ufbxi_for_ptr_list(ufbx_anim_value, p_value, ec->scene.anim_values) { + ufbx_anim_value *value = *p_value; + value->curves[0] = (ufbx_anim_curve*)ufbxi_translate_element(ec, value->curves[0]); + value->curves[1] = (ufbx_anim_curve*)ufbxi_translate_element(ec, value->curves[1]); + value->curves[2] = (ufbx_anim_curve*)ufbxi_translate_element(ec, value->curves[2]); + } + + ufbx_anim anim = ec->anim; + ufbx_const_prop_override_list overrides_left = ec->anim.prop_overrides; + + // Evaluate the properties + ufbxi_for_ptr_list(ufbx_element, p_elem, ec->scene.elements) { + ufbx_element *elem = *p_elem; + size_t num_animated = elem->props.num_animated; + + // Setup the overrides for this element if found + if (overrides_left.count > 0) { + if (overrides_left.data[0].element_id <= elem->element_id) { + anim.prop_overrides = ufbxi_find_element_prop_overrides(&overrides_left, elem->element_id); + overrides_left.data = anim.prop_overrides.data + anim.prop_overrides.count; + overrides_left.count = ufbxi_to_size((ec->anim.prop_overrides.data + ec->anim.prop_overrides.count) - overrides_left.data); + num_animated += anim.prop_overrides.count; + } + } + + if (num_animated == 0) continue; + + ufbx_prop *props = ufbxi_push(&ec->result, ufbx_prop, num_animated); + ufbxi_check_err(&ec->error, props); + + elem->props = ufbx_evaluate_props(&anim, elem, ec->time, props, num_animated); + elem->props.defaults = &ec->src_scene.elements.data[elem->element_id]->props; + + anim.prop_overrides.count = 0; + } + + // Update all derived values + ufbxi_update_scene(&ec->scene, false); + + // Evaluate skinning if requested + if (ec->opts.evaluate_skinning) { + ufbx_geometry_cache_data_opts cache_opts = { 0 }; + cache_opts.open_file_cb = ec->opts.open_file_cb; + ufbxi_check_err(&ec->error, ufbxi_evaluate_skinning(&ec->scene, &ec->error, &ec->result, &ec->tmp, + ec->time, ec->opts.load_external_files && ec->opts.evaluate_caches, &cache_opts)); + } + + // Retain the scene, this must be the final allocation as we copy + // `ator_result` to `ufbx_scene_imp`. + ufbxi_scene_imp *imp = ufbxi_push_zero(&ec->result, ufbxi_scene_imp, 1); + ufbxi_check_err(&ec->error, imp); + + ufbx_assert(ec->src_imp->magic == UFBXI_SCENE_IMP_MAGIC); + ufbxi_init_ref(&imp->refcount, UFBXI_SCENE_IMP_MAGIC, &ec->src_imp->refcount); + + imp->magic = UFBXI_SCENE_IMP_MAGIC; + imp->scene = ec->scene; + imp->ator = ec->ator_result; + imp->ator.error = NULL; + + // Copy retained buffers and translate the allocator struct to the one + // contained within `ufbxi_scene_imp` + imp->result_buf = ec->result; + imp->result_buf.ator = &imp->ator; + + imp->scene.metadata.result_memory_used = imp->ator.current_size; + imp->scene.metadata.temp_memory_used = ec->ator_tmp.current_size; + imp->scene.metadata.result_allocs = imp->ator.num_allocs; + imp->scene.metadata.temp_allocs = ec->ator_tmp.num_allocs; + + ufbxi_for_ptr_list(ufbx_element, p_elem, imp->scene.elements) { + (*p_elem)->scene = &imp->scene; + } + + ec->scene_imp = imp; + ec->result.ator = &ec->ator_result; + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline ufbx_scene *ufbxi_evaluate_scene(ufbxi_eval_context *ec, ufbx_scene *scene, const ufbx_anim *anim, double time, const ufbx_evaluate_opts *user_opts, ufbx_error *p_error) +{ + if (user_opts) { + ec->opts = *user_opts; + } else { + memset(&ec->opts, 0, sizeof(ec->opts)); + } + + ec->src_imp = ufbxi_get_imp(ufbxi_scene_imp, scene); + ec->src_scene = *scene; + ec->anim = anim ? *anim : scene->anim; + ec->time = time; + + ufbxi_init_ator(&ec->error, &ec->ator_tmp, &ec->opts.temp_allocator, "temp"); + ufbxi_init_ator(&ec->error, &ec->ator_result, &ec->opts.result_allocator, "result"); + + ec->result.ator = &ec->ator_result; + ec->tmp.ator = &ec->ator_tmp; + + ec->result.unordered = true; + ec->tmp.unordered = true; + + if (ufbxi_evaluate_imp(ec)) { + ufbxi_buf_free(&ec->tmp); + ufbxi_free_ator(&ec->ator_tmp); + if (p_error) { + ufbxi_clear_error(p_error); + } + return &ec->scene_imp->scene; + } else { + ufbxi_fix_error_type(&ec->error, "Failed to evaluate"); + if (p_error) *p_error = ec->error; + ufbxi_buf_free(&ec->tmp); + ufbxi_buf_free(&ec->result); + ufbxi_free_ator(&ec->ator_tmp); + ufbxi_free_ator(&ec->ator_result); + return NULL; + } +} + +#endif + +// -- Spatial + +#if UFBXI_FEATURE_SPATIAL + +typedef struct { + int32_t x, y, z; +} ufbxi_spatial_key; + +typedef struct { + ufbxi_spatial_key key; + ufbx_vec3 position; +} ufbxi_spatial_bucket; + +static ufbxi_forceinline uint32_t ufbxi_hash_spatial_key(ufbxi_spatial_key key) +{ + uint32_t h = 0; + h = (h<<6) + (h>>2) + 0x9e3779b9 + ufbxi_hash32((uint32_t)key.x); + h = (h<<6) + (h>>2) + 0x9e3779b9 + ufbxi_hash32((uint32_t)key.y); + h = (h<<6) + (h>>2) + 0x9e3779b9 + ufbxi_hash32((uint32_t)key.z); + return h; +} + +static int ufbxi_map_cmp_spatial_key(void *user, const void *va, const void *vb) +{ + (void)user; + ufbxi_spatial_key a = *(const ufbxi_spatial_key*)va, b = *(const ufbxi_spatial_key*)vb; + if (a.x != b.x) return a.x < b.x ? -1 : +1; + if (a.y != b.y) return a.y < b.y ? -1 : +1; + if (a.z != b.z) return a.z < b.z ? -1 : +1; + return 0; +} + +static int32_t ufbxi_noinline ufbxi_spatial_coord(ufbx_real v) +{ + bool negative = false; + if (v < 0.0f) { + v = -v; + negative = true; + } + if (!(v < 1.27605887595e+38f)) { + return INT32_MIN; + } + + const int32_t min_exponent = -20; + const int32_t mantissa_bits = 21; + const int32_t mantissa_max = 1 << mantissa_bits; + + int exponent = 0; + double mantissa = ufbx_frexp(v, &exponent); + if (exponent < min_exponent) { + return 0; + } else { + int32_t biased = (int32_t)(exponent - min_exponent); + int32_t truncated_mantissa = (int32_t)(mantissa * (double)(mantissa_max*2)) - mantissa_max; + int32_t value = (biased << mantissa_bits) + truncated_mantissa; + return negative ? -value : value; + } +} + +static uint32_t ufbxi_noinline ufbxi_insert_spatial_imp(ufbxi_map *map, int32_t kx, int32_t ky, int32_t kz) +{ + ufbxi_spatial_key key = { kx, ky, kz }; + uint32_t hash = ufbxi_hash_spatial_key(key); + ufbxi_spatial_bucket *bucket = ufbxi_map_find(map, ufbxi_spatial_bucket, hash, &key); + if (bucket) { + return (uint32_t)(bucket - (ufbxi_spatial_bucket*)map->items); + } else { + return UINT32_MAX; + } +} + +static uint32_t ufbxi_noinline ufbxi_insert_spatial(ufbxi_map *map, const ufbx_vec3 *pos) +{ + int32_t kx = ufbxi_spatial_coord(pos->x); + int32_t ky = ufbxi_spatial_coord(pos->y); + int32_t kz = ufbxi_spatial_coord(pos->z); + + uint32_t ix = UINT32_MAX; + if (kx != INT32_MIN && ky != INT32_MIN && kz != INT32_MIN) { + const int32_t low_bits = 2, low_mask = (1 << low_bits) - 1; + + kx += low_mask/2; + ky += low_mask/2; + kz += low_mask/2; + + int32_t dx = (((kx+1) & low_mask) < 2) ? (((kx >> (low_bits-1)) & 1) ? +1 : -1) : 0; + int32_t dy = (((ky+1) & low_mask) < 2) ? (((ky >> (low_bits-1)) & 1) ? +1 : -1) : 0; + int32_t dz = (((kz+1) & low_mask) < 2) ? (((kz >> (low_bits-1)) & 1) ? +1 : -1) : 0; + int32_t dnum = (dx&1) + (dy&1) + (dz&1); + + kx >>= low_bits; + ky >>= low_bits; + kz >>= low_bits; + + ix = ufbxi_insert_spatial_imp(map, kx, ky, kz); + + if (dnum >= 1 && ix == UINT32_MAX) { + if (dx) ix = ufbxi_insert_spatial_imp(map, kx+dx, ky, kz); + if (dy) ix = ufbxi_insert_spatial_imp(map, kx, ky+dy, kz); + if (dz) ix = ufbxi_insert_spatial_imp(map, kx, ky, kz+dz); + + if (dnum >= 2 && ix == UINT32_MAX) { + if (dx && dy) ix = ufbxi_insert_spatial_imp(map, kx+dx, ky+dy, kz); + if (dy && dz) ix = ufbxi_insert_spatial_imp(map, kx, ky+dy, kz+dz); + if (dx && dz) ix = ufbxi_insert_spatial_imp(map, kx+dx, ky, kz+dz); + + if (dnum >= 3 && ix == UINT32_MAX) { + ix = ufbxi_insert_spatial_imp(map, kx+dx, ky+dy, kz+dz); + } + } + } + } + + if (ix == UINT32_MAX) { + ix = map->size; + ufbxi_spatial_key key = { kx, ky, kz }; + uint32_t hash = ufbxi_hash_spatial_key(key); + ufbxi_spatial_bucket *bucket = ufbxi_map_insert(map, ufbxi_spatial_bucket, hash, &key); + ufbxi_check_return_err(map->ator->error, bucket, UINT32_MAX); + bucket->key = key; + bucket->position = *pos; + } + + return ix; +} + +#endif + +// -- NURBS + +static ufbxi_forceinline ufbx_real ufbxi_nurbs_weight(const ufbx_real_list *knots, size_t knot, size_t degree, ufbx_real u) +{ + if (knot >= knots->count) return 0.0f; + if (knots->count - knot < degree) return 0.0f; + ufbx_real prev_u = knots->data[knot], next_u = knots->data[knot + degree]; + if (prev_u >= next_u) return 0.0f; + if (u <= prev_u) return 0.0f; + if (u >= next_u) return 1.0f; + return (u - prev_u) / (next_u - prev_u); +} + +static ufbxi_forceinline ufbx_real ufbxi_nurbs_deriv(const ufbx_real_list *knots, size_t knot, size_t degree) +{ + if (knot >= knots->count) return 0.0f; + if (knots->count - knot < degree) return 0.0f; + ufbx_real prev_u = knots->data[knot], next_u = knots->data[knot + degree]; + if (prev_u >= next_u) return 0.0f; + return (ufbx_real)degree / (next_u - prev_u); +} + +typedef struct { + ufbxi_refcount refcount; + ufbx_line_curve curve; + uint32_t magic; + + ufbxi_allocator ator; + ufbxi_buf result_buf; +} ufbxi_line_curve_imp; + +ufbx_static_assert(line_curve_imp_offset, offsetof(ufbxi_line_curve_imp, curve) == sizeof(ufbxi_refcount)); + +#if UFBXI_FEATURE_TESSELLATION + +typedef struct { + ufbx_error error; + + ufbx_tessellate_curve_opts opts; + + const ufbx_nurbs_curve *curve; + + ufbxi_allocator ator_tmp; + ufbxi_allocator ator_result; + + ufbxi_buf result; + + ufbx_line_curve line; + + ufbxi_line_curve_imp *imp; + +} ufbxi_tessellate_curve_context; + +typedef struct { + ufbx_error error; + + ufbx_tessellate_surface_opts opts; + + const ufbx_nurbs_surface *surface; + + ufbxi_allocator ator_tmp; + ufbxi_allocator ator_result; + + ufbxi_buf tmp; + ufbxi_buf result; + + ufbxi_map position_map; + + ufbx_mesh mesh; + + ufbxi_mesh_imp *imp; + +} ufbxi_tessellate_surface_context; + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_tessellate_nurbs_curve_imp(ufbxi_tessellate_curve_context *tc) +{ + // `ufbx_tessellate_opts` must be cleared to zero first! + ufbx_assert(tc->opts._begin_zero == 0 && tc->opts._end_zero == 0); + ufbxi_check_err_msg(&tc->error, tc->opts._begin_zero == 0 && tc->opts._end_zero == 0, "Uninitialized options"); + + if (tc->opts.span_subdivision <= 0) { + tc->opts.span_subdivision = 4; + } + size_t num_sub = tc->opts.span_subdivision; + + const ufbx_nurbs_curve *curve = tc->curve; + ufbx_line_curve *line = &tc->line; + ufbxi_check_err_msg(&tc->error, curve->basis.valid && curve->control_points.count > 0, "Bad NURBS geometry"); + + ufbxi_init_ator(&tc->error, &tc->ator_tmp, &tc->opts.temp_allocator, "temp"); + ufbxi_init_ator(&tc->error, &tc->ator_result, &tc->opts.result_allocator, "result"); + + tc->result.unordered = true; + tc->result.ator = &tc->ator_result; + + size_t num_spans = curve->basis.spans.count; + + // Check conservatively that we don't overflow anything + { + size_t over_spans = num_spans * 2 * sizeof(ufbx_real); + size_t over = over_spans * num_sub; + ufbxi_check_err(&tc->error, !ufbxi_does_overflow(over, over_spans, num_sub)); + } + + bool is_open = curve->basis.topology == UFBX_NURBS_TOPOLOGY_OPEN; + + size_t num_indices = num_spans + (num_spans - 1) * (num_sub - 1); + size_t num_vertices = num_indices - (is_open ? 0u : 1u); + ufbxi_check_err(&tc->error, num_indices <= INT32_MAX); + + uint32_t *indices = ufbxi_push(&tc->result, uint32_t, num_indices); + ufbx_vec3 *vertices = ufbxi_push(&tc->result, ufbx_vec3, num_vertices); + ufbx_line_segment *segments = ufbxi_push(&tc->result, ufbx_line_segment, 1); + ufbxi_check_err(&tc->error, indices && vertices && segments); + + for (size_t span_ix = 0; span_ix < num_spans; span_ix++) { + size_t num_splits = span_ix + 1 == num_spans ? 1 : num_sub; + + for (size_t sub_ix = 0; sub_ix < num_splits; sub_ix++) { + size_t ix = span_ix * num_sub + sub_ix; + + if (ix < num_vertices) { + ufbx_real u = curve->basis.spans.data[span_ix]; + if (sub_ix > 0) { + ufbx_real t = (ufbx_real)sub_ix / num_sub; + u = u * (1.0f - t) + t * curve->basis.spans.data[span_ix + 1]; + } + + ufbx_curve_point point = ufbx_evaluate_nurbs_curve(curve, u); + vertices[ix] = point.position; + indices[ix] = (uint32_t)ix; + } else { + indices[ix] = 0; + } + } + } + + segments[0].index_begin = 0; + segments[0].num_indices = (uint32_t)num_indices; + + line->element.name.data = ufbxi_empty_char; + line->element.type = UFBX_ELEMENT_LINE_CURVE; + line->element.typed_id = UINT32_MAX; + line->element.element_id = UINT32_MAX; + + line->color.x = 1.0f; + line->color.y = 1.0f; + line->color.z = 1.0f; + + line->control_points.data = vertices; + line->control_points.count = num_vertices; + line->point_indices.data = indices; + line->point_indices.count = num_indices; + line->segments.data = segments; + line->segments.count = 1; + + line->from_tessellated_nurbs = true; + + tc->imp = ufbxi_push(&tc->result, ufbxi_line_curve_imp, 1); + ufbxi_check_err(&tc->error, tc->imp); + + ufbxi_init_ref(&tc->imp->refcount, UFBXI_LINE_CURVE_IMP_MAGIC, &(ufbxi_get_imp(ufbxi_scene_imp, curve->element.scene))->refcount); + + tc->imp->magic = UFBXI_LINE_CURVE_IMP_MAGIC; + tc->imp->curve = tc->line; + tc->imp->ator = tc->ator_result; + tc->imp->result_buf = tc->result; + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_tessellate_nurbs_surface_imp(ufbxi_tessellate_surface_context *tc) +{ + // `ufbx_tessellate_opts` must be cleared to zero first! + ufbx_assert(tc->opts._begin_zero == 0 && tc->opts._end_zero == 0); + ufbxi_check_err_msg(&tc->error, tc->opts._begin_zero == 0 && tc->opts._end_zero == 0, "Uninitialized options"); + + if (tc->opts.span_subdivision_u <= 0) { + tc->opts.span_subdivision_u = 4; + } + if (tc->opts.span_subdivision_v <= 0) { + tc->opts.span_subdivision_v = 4; + } + + size_t sub_u = tc->opts.span_subdivision_u; + size_t sub_v = tc->opts.span_subdivision_v; + + const ufbx_nurbs_surface *surface = tc->surface; + ufbx_mesh *mesh = &tc->mesh; + ufbxi_check_err_msg(&tc->error, surface->basis_u.valid && surface->basis_v.valid + && surface->num_control_points_u > 0 && surface->num_control_points_v > 0, "Bad NURBS geometry"); + + ufbxi_init_ator(&tc->error, &tc->ator_tmp, &tc->opts.temp_allocator, "temp"); + ufbxi_init_ator(&tc->error, &tc->ator_result, &tc->opts.result_allocator, "result"); + + tc->result.unordered = true; + tc->tmp.unordered = true; + + tc->result.ator = &tc->ator_result; + tc->tmp.ator = &tc->ator_tmp; + + bool open_u = surface->basis_u.topology == UFBX_NURBS_TOPOLOGY_OPEN; + bool open_v = surface->basis_v.topology == UFBX_NURBS_TOPOLOGY_OPEN; + + size_t spans_u = surface->basis_u.spans.count; + size_t spans_v = surface->basis_v.spans.count; + + // Check conservatively that we don't overflow anything + { + size_t over_spans_u = spans_u * 2 * sizeof(ufbx_real); + size_t over_spans_v = spans_v * 2 * sizeof(ufbx_real); + size_t over_u = over_spans_u * sub_u; + size_t over_v = over_spans_v * sub_v; + size_t over_uv = over_u * over_v; + ufbxi_check_err(&tc->error, !ufbxi_does_overflow(over_u, over_spans_u, sub_u)); + ufbxi_check_err(&tc->error, !ufbxi_does_overflow(over_v, over_spans_v, sub_v)); + ufbxi_check_err(&tc->error, !ufbxi_does_overflow(over_uv, over_u, over_v)); + } + + ufbxi_map_init(&tc->position_map, &tc->ator_tmp, &ufbxi_map_cmp_spatial_key, NULL); + + size_t faces_u = (spans_u - 1) * sub_u; + size_t faces_v = (spans_v - 1) * sub_v; + + size_t indices_u = spans_u + (spans_u - 1) * sub_u; + size_t indices_v = spans_v + (spans_v - 1) * sub_v; + + size_t num_faces = faces_u * faces_v; + size_t num_indices = indices_u * indices_v; + ufbxi_check_err(&tc->error, num_indices <= INT32_MAX); + + uint32_t *position_ix = ufbxi_push(&tc->tmp, uint32_t, num_indices); + ufbx_vec2 *uvs = ufbxi_push(&tc->result, ufbx_vec2, num_indices + 1); + ufbx_vec3 *tangents = ufbxi_push(&tc->result, ufbx_vec3, num_indices + 1); + ufbx_vec3 *bitangents = ufbxi_push(&tc->result, ufbx_vec3, num_indices + 1); + ufbxi_check_err(&tc->error, position_ix && uvs && tangents && bitangents); + + *uvs++ = ufbx_zero_vec2; + *tangents++ = ufbx_zero_vec3; + *bitangents++ = ufbx_zero_vec3; + + for (size_t span_v = 0; span_v < spans_v; span_v++) { + size_t splits_v = span_v + 1 == spans_v ? 1 : sub_v; + + for (size_t split_v = 0; split_v < splits_v; split_v++) { + size_t ix_v = span_v * sub_v + split_v; + + ufbx_real v = surface->basis_v.spans.data[span_v]; + if (split_v > 0) { + ufbx_real t = (ufbx_real)split_v / splits_v; + v = v * (1.0f - t) + t * surface->basis_v.spans.data[span_v + 1]; + } + ufbx_real original_v = v; + if (span_v + 1 == spans_v && !open_v) { + v = surface->basis_v.spans.data[0]; + } + + for (size_t span_u = 0; span_u < spans_u; span_u++) { + size_t splits_u = span_u + 1 == spans_u ? 1 : sub_u; + for (size_t split_u = 0; split_u < splits_u; split_u++) { + size_t ix_u = span_u * sub_u + split_u; + + ufbx_real u = surface->basis_u.spans.data[span_u]; + if (split_u > 0) { + ufbx_real t = (ufbx_real)split_u / splits_u; + u = u * (1.0f - t) + t * surface->basis_u.spans.data[span_u + 1]; + } + ufbx_real original_u = u; + if (span_u + 1 == spans_u && !open_u) { + u = surface->basis_u.spans.data[0]; + } + + ufbx_surface_point point = ufbx_evaluate_nurbs_surface(surface, u, v); + ufbx_vec3 pos = point.position; + + uint32_t pos_ix = ufbxi_insert_spatial(&tc->position_map, &pos); + ufbxi_check_err(&tc->error, pos_ix != UINT32_MAX); + + ufbx_vec3 tangent_u = ufbxi_slow_normalize3(&point.derivative_u); + ufbx_vec3 tangent_v = ufbxi_slow_normalize3(&point.derivative_v); + + size_t ix = ix_v * indices_u + ix_u; + position_ix[ix] = (uint32_t)pos_ix; + uvs[ix].x = original_u; + uvs[ix].y = original_v; + tangents[ix] = tangent_u; + bitangents[ix] = tangent_v; + } + } + } + } + + ufbx_face *faces = ufbxi_push(&tc->result, ufbx_face, num_faces); + uint32_t *vertex_ix = ufbxi_push(&tc->result, uint32_t, num_faces * 4); + uint32_t *attrib_ix = ufbxi_push(&tc->result, uint32_t, num_faces * 4); + ufbxi_check_err(&tc->error, faces && vertex_ix && attrib_ix); + + size_t face_ix = 0; + size_t dst_index = 0; + + size_t num_triangles = 0; + + for (size_t face_v = 0; face_v < faces_v; face_v++) { + for (size_t face_u = 0; face_u < faces_u; face_u++) { + + attrib_ix[dst_index + 0] = (uint32_t)((face_v + 0) * indices_u + (face_u + 0)); + attrib_ix[dst_index + 1] = (uint32_t)((face_v + 0) * indices_u + (face_u + 1)); + attrib_ix[dst_index + 2] = (uint32_t)((face_v + 1) * indices_u + (face_u + 1)); + attrib_ix[dst_index + 3] = (uint32_t)((face_v + 1) * indices_u + (face_u + 0)); + + vertex_ix[dst_index + 0] = position_ix[attrib_ix[dst_index + 0]]; + vertex_ix[dst_index + 1] = position_ix[attrib_ix[dst_index + 1]]; + vertex_ix[dst_index + 2] = position_ix[attrib_ix[dst_index + 2]]; + vertex_ix[dst_index + 3] = position_ix[attrib_ix[dst_index + 3]]; + + bool is_triangle = false; + for (size_t prev_ix = 0; prev_ix < 4; prev_ix++) { + size_t next_ix = (prev_ix + 1) % 4; + if (vertex_ix[dst_index + prev_ix] == vertex_ix[dst_index + next_ix]) { + for (size_t i = next_ix; i < 3; i++) { + attrib_ix[dst_index + i] = attrib_ix[dst_index + i + 1]; + vertex_ix[dst_index + i] = vertex_ix[dst_index + i + 1]; + } + is_triangle = true; + break; + } + } + + faces[face_ix].index_begin = (uint32_t)dst_index; + faces[face_ix].num_indices = is_triangle ? 3 : 4; + dst_index += is_triangle ? 3 : 4; + num_triangles += is_triangle ? 1 : 2; + face_ix++; + } + } + + size_t num_positions = tc->position_map.size; + ufbx_vec3 *positions = ufbxi_push(&tc->result, ufbx_vec3, num_positions + 1); + ufbx_vec3 *normals = ufbxi_push(&tc->result, ufbx_vec3, num_positions + 1); + ufbxi_check_err(&tc->error, positions && normals); + + *positions++ = ufbx_zero_vec3; + *normals++ = ufbx_zero_vec3; + + ufbxi_spatial_bucket *buckets = (ufbxi_spatial_bucket*)tc->position_map.items; + for (size_t i = 0; i < num_positions; i++) { + positions[i] = buckets[i].position; + } + + mesh->element.name.data = ufbxi_empty_char; + mesh->element.type = UFBX_ELEMENT_MESH; + mesh->element.typed_id = UINT32_MAX; + mesh->element.element_id = UINT32_MAX; + + mesh->vertices.data = positions; + mesh->vertices.count = num_positions; + mesh->num_vertices = num_positions; + mesh->vertex_indices.data = vertex_ix; + mesh->vertex_indices.count = dst_index; + + mesh->faces.data = faces; + mesh->faces.count = num_faces; + + mesh->vertex_position.exists = true; + mesh->vertex_position.values.data = positions; + mesh->vertex_position.values.count = num_positions; + mesh->vertex_position.indices.data = vertex_ix; + mesh->vertex_position.indices.count = dst_index; + mesh->vertex_position.unique_per_vertex = true; + + mesh->vertex_uv.exists = true; + mesh->vertex_uv.values.data = uvs; + mesh->vertex_uv.values.count = dst_index; + mesh->vertex_uv.indices.data = attrib_ix; + mesh->vertex_uv.indices.count = dst_index; + + mesh->vertex_normal.exists = true; + mesh->vertex_normal.values.data = normals; + mesh->vertex_normal.values.count = num_positions; + mesh->vertex_normal.indices.data = vertex_ix; + mesh->vertex_normal.indices.count = dst_index; + + mesh->vertex_tangent.exists = true; + mesh->vertex_tangent.values.data = tangents; + mesh->vertex_tangent.values.count = dst_index; + mesh->vertex_tangent.indices.data = attrib_ix; + mesh->vertex_tangent.indices.count = dst_index; + + mesh->vertex_bitangent.exists = true; + mesh->vertex_bitangent.values.data = bitangents; + mesh->vertex_bitangent.values.count = dst_index; + mesh->vertex_bitangent.indices.data = attrib_ix; + mesh->vertex_bitangent.indices.count = dst_index; + + mesh->num_faces = num_faces; + mesh->num_triangles = num_triangles; + mesh->num_indices = dst_index; + mesh->max_face_triangles = 2; + + if (surface->material) { + mesh->face_material.data = ufbxi_push_zero(&tc->result, uint32_t, num_faces); + ufbxi_check_err(&tc->error, mesh->face_material.data); + + ufbx_mesh_material *mat = ufbxi_push_zero(&tc->result, ufbx_mesh_material, 1); + ufbxi_check_err(&tc->error, mat); + + mat->material = surface->material; + mesh->materials.data = mat; + mesh->materials.count = 1; + } + + ufbxi_check_err(&tc->error, ufbxi_finalize_mesh_material(&tc->result, &tc->error, mesh)); + ufbxi_check_err(&tc->error, ufbxi_finalize_mesh(&tc->result, &tc->error, mesh)); + + mesh->generated_normals = true; + ufbx_compute_normals(mesh, &mesh->vertex_position, + mesh->vertex_normal.indices.data, mesh->vertex_normal.indices.count, + mesh->vertex_normal.values.data, mesh->vertex_normal.values.count); + + if (surface->flip_normals) { + ufbxi_nounroll ufbxi_for_list(ufbx_vec3, normal, mesh->vertex_normal.values) { + normal->x *= -1.0f; + normal->y *= -1.0f; + normal->z *= -1.0f; + } + } + + tc->imp = ufbxi_push(&tc->result, ufbxi_mesh_imp, 1); + ufbxi_check_err(&tc->error, tc->imp); + + ufbxi_init_ref(&tc->imp->refcount, UFBXI_MESH_IMP_MAGIC, &(ufbxi_get_imp(ufbxi_scene_imp, surface->element.scene))->refcount); + + tc->imp->magic = UFBXI_MESH_IMP_MAGIC; + tc->imp->mesh = tc->mesh; + tc->imp->ator = tc->ator_result; + tc->imp->result_buf = tc->result; + tc->imp->mesh.subdivision_evaluated = true; + + return 1; +} + +#endif + +// -- Topology + +#if UFBXI_FEATURE_KD + +typedef struct { + ufbx_real split; + uint32_t index; + uint32_t slow_left; + uint32_t slow_right; + uint32_t slow_end; +} ufbxi_kd_node; + +typedef struct { + ufbx_face face; + ufbx_vertex_vec3 positions; + ufbx_vec3 axes[3]; + ufbxi_kd_node kd_nodes[1 << (UFBXI_KD_FAST_DEPTH + 1)]; + uint32_t *kd_indices; + + // Temporary + ufbx_vec3 cur_axis_dir; + ufbx_face cur_face; +} ufbxi_ngon_context; + +typedef struct { + ufbx_real min_t[2]; + ufbx_real max_t[2]; + ufbx_vec2 points[3]; + uint32_t indices[3]; +} ufbxi_kd_triangle; + +ufbxi_forceinline static ufbx_vec2 ufbxi_ngon_project(ufbxi_ngon_context *nc, ufbx_vec3 point) +{ + ufbx_vec2 p; + p.x = ufbxi_dot3(nc->axes[0], point); + p.y = ufbxi_dot3(nc->axes[1], point); + return p; +} + +ufbxi_forceinline static ufbx_real ufbxi_orient2d(ufbx_vec2 a, ufbx_vec2 b, ufbx_vec2 c) +{ + return (b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x); +} + +ufbxi_forceinline static bool ufbxi_kd_check_point(ufbxi_ngon_context *nc, const ufbxi_kd_triangle *tri, uint32_t index, ufbx_vec3 point) +{ + if (index == tri->indices[0] || index == tri->indices[1] || index == tri->indices[2]) return false; + ufbx_vec2 p = ufbxi_ngon_project(nc, point); + + ufbx_real u = ufbxi_orient2d(p, tri->points[0], tri->points[1]); + ufbx_real v = ufbxi_orient2d(p, tri->points[1], tri->points[2]); + ufbx_real w = ufbxi_orient2d(p, tri->points[2], tri->points[0]); + + if (u <= 0.0f && v <= 0.0f && w <= 0.0f) return true; + if (u >= 0.0f && v >= 0.0f && w >= 0.0f) return true; + return false; +} + +// Recursion limited by 32-bit indices in input, minus halvings from `ufbxi_kd_check_fast()` +ufbxi_noinline static bool ufbxi_kd_check_slow(ufbxi_ngon_context *nc, const ufbxi_kd_triangle *tri, uint32_t begin, uint32_t count, uint32_t axis) + ufbxi_recursive_function(bool, ufbxi_kd_check_slow, (nc, tri, begin, count, axis), 32 - UFBXI_KD_FAST_DEPTH, + (ufbxi_ngon_context *nc, const ufbxi_kd_triangle *tri, uint32_t begin, uint32_t count, uint32_t axis)) +{ + ufbx_vertex_vec3 pos = nc->positions; + uint32_t *kd_indices = nc->kd_indices; + + while (count > 0) { + uint32_t num_left = count / 2; + uint32_t begin_right = begin + num_left + 1; + uint32_t num_right = count - (num_left + 1); + + uint32_t index = kd_indices[begin + num_left]; + ufbx_vec3 point = pos.values.data[pos.indices.data[nc->face.index_begin + index]]; + ufbx_real split = ufbxi_dot3(point, nc->axes[axis]); + bool hit_left = tri->min_t[axis] <= split; + bool hit_right = tri->max_t[axis] >= split; + + if (hit_left && hit_right) { + if (ufbxi_kd_check_point(nc, tri, index, point)) { + return true; + } + + if (ufbxi_kd_check_slow(nc, tri, begin_right, num_right, axis ^ 1)) { + return true; + } + } + + axis ^= 1; + if (hit_left) { + count = num_left; + } else { + begin = begin_right; + count = num_right; + } + } + + return false; +} + +// Recursion limited by `UFBXI_KD_FAST_DEPTH` +ufbxi_noinline static bool ufbxi_kd_check_fast(ufbxi_ngon_context *nc, const ufbxi_kd_triangle *tri, uint32_t kd_index, uint32_t axis, uint32_t depth) + ufbxi_recursive_function(bool, ufbxi_kd_check_fast, (nc, tri, kd_index, axis, depth), UFBXI_KD_FAST_DEPTH, + (ufbxi_ngon_context *nc, const ufbxi_kd_triangle *tri, uint32_t kd_index, uint32_t axis, uint32_t depth)) +{ + ufbx_vertex_vec3 pos = nc->positions; + + for (;;) { + ufbxi_kd_node node = nc->kd_nodes[kd_index]; + if (node.slow_end == 0) return false; + + bool hit_left = tri->min_t[axis] <= node.split; + bool hit_right = tri->max_t[axis] >= node.split; + + uint32_t side = hit_left ? 0 : 1; + uint32_t child_kd_index = kd_index * 2 + 1 + side; + if (hit_left && hit_right) { + + // Check for the point on the split plane + ufbx_vec3 point = pos.values.data[pos.indices.data[nc->face.index_begin + node.index]]; + if (ufbxi_kd_check_point(nc, tri, node.index, point)) { + return true; + } + + // Recurse always to the right if we hit both sides + if (depth + 1 == UFBXI_KD_FAST_DEPTH) { + if (ufbxi_kd_check_slow(nc, tri, node.slow_right, node.slow_end - node.slow_right, axis ^ 1)) { + return true; + } + } else { + if (ufbxi_kd_check_fast(nc, tri, child_kd_index + 1, axis ^ 1, depth + 1)) { + return true; + } + } + } + + depth++; + axis ^= 1; + kd_index = child_kd_index; + + if (depth == UFBXI_KD_FAST_DEPTH) { + if (hit_left) { + return ufbxi_kd_check_slow(nc, tri, node.slow_left, node.slow_right - node.slow_left, axis); + } else { + return ufbxi_kd_check_slow(nc, tri, node.slow_right, node.slow_end - node.slow_right, axis); + } + } + } +} + +ufbxi_noinline static bool ufbxi_kd_index_less(void *user, const void *va, const void *vb) +{ + ufbxi_ngon_context *nc = (ufbxi_ngon_context*)user; + ufbx_vertex_vec3 *pos = &nc->positions; + const uint32_t a = *(const uint32_t*)va, b = *(const uint32_t*)vb; + ufbx_real da = ufbxi_dot3(nc->cur_axis_dir, pos->values.data[pos->indices.data[nc->cur_face.index_begin + a]]); + ufbx_real db = ufbxi_dot3(nc->cur_axis_dir, pos->values.data[pos->indices.data[nc->cur_face.index_begin + b]]); + return da < db; +} + +// Recursion limited by 32-bit indices in input +ufbxi_noinline static void ufbxi_kd_build(ufbxi_ngon_context *nc, uint32_t *indices, uint32_t *tmp, uint32_t num, uint32_t axis, uint32_t fast_index, uint32_t depth) + ufbxi_recursive_function_void(ufbxi_kd_build, (nc, indices, tmp, num, axis, fast_index, depth), 32, + (ufbxi_ngon_context *nc, uint32_t *indices, uint32_t *tmp, uint32_t num, uint32_t axis, uint32_t fast_index, uint32_t depth)) +{ + if (num == 0) return; + + ufbx_vertex_vec3 pos = nc->positions; + ufbx_vec3 axis_dir = nc->axes[axis]; + ufbx_face face = nc->face; + + nc->cur_axis_dir = axis_dir; + nc->cur_face = face; + + // Sort the remaining indices based on the axis + ufbxi_stable_sort(sizeof(uint32_t), 16, indices, tmp, num, &ufbxi_kd_index_less, nc); + + uint32_t num_left = num / 2; + uint32_t begin_right = num_left + 1; + uint32_t num_right = num - begin_right; + uint32_t dst_right = num_left + 1; + if (depth < UFBXI_KD_FAST_DEPTH) { + uint32_t skip_left = 1u << (UFBXI_KD_FAST_DEPTH - depth - 1); + dst_right = dst_right > skip_left ? dst_right - skip_left : 0; + + uint32_t index = indices[num_left]; + ufbxi_kd_node *kd = &nc->kd_nodes[fast_index]; + + kd->split = ufbxi_dot3(axis_dir, pos.values.data[pos.indices.data[face.index_begin + index]]); + kd->index = index; + + if (depth + 1 == UFBXI_KD_FAST_DEPTH) { + kd->slow_left = (uint32_t)(indices - nc->kd_indices); + kd->slow_right = kd->slow_left + num_left; + kd->slow_end = kd->slow_right + num_right; + } else { + kd->slow_left = UINT32_MAX; + kd->slow_right = UINT32_MAX; + kd->slow_end = UINT32_MAX; + } + } + + uint32_t child_fast = fast_index * 2 + 1; + ufbxi_kd_build(nc, indices, tmp, num_left, axis ^ 1, child_fast + 0, depth + 1); + + if (dst_right != begin_right) { + memmove(indices + dst_right, indices + begin_right, num_right * sizeof(uint32_t)); + } + + ufbxi_kd_build(nc, indices + dst_right, tmp, num_right, axis ^ 1, child_fast + 1, depth + 1); +} + +#endif + +#if UFBXI_FEATURE_TRIANGULATION + +ufbxi_noinline static uint32_t ufbxi_triangulate_ngon(ufbxi_ngon_context *nc, uint32_t *indices, uint32_t num_indices) +{ + ufbx_face face = nc->face; + + // Form an orthonormal basis to project the polygon into a 2D plane + ufbx_vec3 normal = ufbx_get_weighted_face_normal(&nc->positions, face); + ufbx_real len = ufbxi_length3(normal); + if (len > UFBX_EPSILON) { + normal = ufbxi_mul3(normal, 1.0f / len); + } else { + normal.x = 1.0f; + normal.y = 0.0f; + normal.z = 0.0f; + } + + ufbx_vec3 axis; + if (normal.x*normal.x < 0.5f) { + axis.x = 1.0f; + axis.y = 0.0f; + axis.z = 0.0f; + } else { + axis.x = 0.0f; + axis.y = 1.0f; + axis.z = 0.0f; + } + nc->axes[0] = ufbxi_slow_normalized_cross3(&axis, &normal); + nc->axes[1] = ufbxi_slow_normalized_cross3(&normal, &nc->axes[0]); + nc->axes[2] = normal; + + uint32_t *kd_indices = indices; + nc->kd_indices = kd_indices; + + uint32_t *kd_tmp = indices + face.num_indices; + ufbx_vertex_vec3 pos = nc->positions; + + // Collect all the reflex corners for intersection testing. + uint32_t num_kd_indices = 0; + { + ufbx_vec2 a = ufbxi_ngon_project(nc, pos.values.data[pos.indices.data[face.index_begin + face.num_indices - 1]]); + ufbx_vec2 b = ufbxi_ngon_project(nc, pos.values.data[pos.indices.data[face.index_begin + 0]]); + for (uint32_t i = 0; i < face.num_indices; i++) { + uint32_t next = i + 1 < face.num_indices ? i + 1 : 0; + ufbx_vec2 c = ufbxi_ngon_project(nc, pos.values.data[pos.indices.data[face.index_begin + next]]); + + if (ufbxi_orient2d(a, b, c) < 0.0f) { + kd_indices[num_kd_indices++] = i; + } + + a = b; + b = c; + } + } + + // Build a KD-tree out of the collected reflex vertices. + uint32_t num_skip_indices = (1u << (UFBXI_KD_FAST_DEPTH + 1)) - 1; + uint32_t kd_slow_indices = num_kd_indices > num_skip_indices ? num_kd_indices - num_skip_indices : 0; + ufbxi_ignore(kd_slow_indices); + ufbx_assert(kd_slow_indices + face.num_indices * 2 <= num_indices); + ufbxi_kd_build(nc, kd_indices, kd_tmp, num_kd_indices, 0, 0, 0); + + uint32_t *edges = indices + num_indices - face.num_indices * 2; + + // Initialize `edges` to be a connectivity structure where: + // `edges[2*i + 0]` is the previous vertex of `i` + // `edges[2*i + 1]` is the next vertex of `i` + // When clipped we mark indices with the high bit (0x80000000) + for (uint32_t i = 0; i < face.num_indices; i++) { + edges[i*2 + 0] = i > 0 ? i - 1 : face.num_indices - 1; + edges[i*2 + 1] = i + 1 < face.num_indices ? i + 1 : 0; + } + + // Core of the ear clipping algorithm. + // Iterate through the polygon corners looking for potential ears satisfying: + // - Angle must be less than 180deg + // - The triangle formed by the two edges must be contained within the polygon + // As these properties change only locally between modifications we only need + // to iterate the polygon once if we move backwards one step every time we clip an ear. + uint32_t indices_left = face.num_indices; + { + ufbxi_kd_triangle tri; + + uint32_t ix = 1; + ufbx_vec2 a = ufbxi_ngon_project(nc, pos.values.data[pos.indices.data[face.index_begin + 0]]); + ufbx_vec2 b = ufbxi_ngon_project(nc, pos.values.data[pos.indices.data[face.index_begin + 1]]); + ufbx_vec2 c = ufbxi_ngon_project(nc, pos.values.data[pos.indices.data[face.index_begin + 2]]); + bool prev_was_reflex = false; + + uint32_t num_steps = 0; + + while (indices_left > 3) { + uint32_t prev = edges[ix*2 + 0]; + uint32_t next = edges[ix*2 + 1]; + if (ufbxi_orient2d(a, b, c) > 0.0f) { + + tri.points[0] = a; + tri.points[1] = b; + tri.points[2] = c; + tri.indices[0] = prev; + tri.indices[1] = ix; + tri.indices[2] = next; + tri.min_t[0] = ufbxi_min_real(ufbxi_min_real(a.x, b.x), c.x); + tri.min_t[1] = ufbxi_min_real(ufbxi_min_real(a.y, b.y), c.y); + tri.max_t[0] = ufbxi_max_real(ufbxi_max_real(a.x, b.x), c.x); + tri.max_t[1] = ufbxi_max_real(ufbxi_max_real(a.y, b.y), c.y); + + // If there is no reflex angle contained within the triangle formed + // by `{ a, b, c }` connect the vertices `a - c` (prev, next) directly. + if (!ufbxi_kd_check_fast(nc, &tri, 0, 0, 0)) { + + // Mark as clipped + edges[ix*2 + 0] |= 0x80000000; + edges[ix*2 + 1] |= 0x80000000; + + edges[next*2 + 0] = prev; + edges[prev*2 + 1] = next; + + indices_left -= 1; + + // Move backwards only if the previous was reflex as now it would + // cover a superset of the previous area, failing the intersection test. + if (prev_was_reflex) { + prev_was_reflex = false; + ix = prev; + b = a; + uint32_t prev_prev = edges[prev*2 + 0]; + a = ufbxi_ngon_project(nc, pos.values.data[pos.indices.data[face.index_begin + prev_prev]]); + } else { + ix = next; + b = c; + uint32_t next_next = edges[next*2 + 1]; + c = ufbxi_ngon_project(nc, pos.values.data[pos.indices.data[face.index_begin + next_next]]); + } + continue; + } + + prev_was_reflex = false; + } else { + prev_was_reflex = true; + } + + // Continue forward + ix = next; + a = b; + b = c; + next = edges[next*2 + 1]; + c = ufbxi_ngon_project(nc, pos.values.data[pos.indices.data[face.index_begin + next]]); + num_steps++; + + // If we have walked around the entire polygon it is irregular and + // ear cutting won't find any more triangles. + // TODO: This could be stricter? + if (num_steps >= face.num_indices*2) break; + } + + // Fallback: Cut non-ears until the polygon is completed. + // TODO: Could do something better here.. + while (indices_left > 3) { + uint32_t prev = edges[ix*2 + 0]; + uint32_t next = edges[ix*2 + 1]; + + // Mark as clipped + edges[ix*2 + 0] |= 0x80000000; + edges[ix*2 + 1] |= 0x80000000; + + edges[prev*2 + 1] = next; + edges[next*2 + 0] = prev; + + indices_left -= 1; + ix = next; + } + + // Now we have a single triangle left at `ix`. + edges[ix*2 + 0] |= 0x80000000; + edges[ix*2 + 1] |= 0x80000000; + } + + // Expand the adjacency information `edges` into proper triangles. + // Care needs to be taken here as both refer to the same memory area: + // The last 4 triangles may overlap in source and destination so we write + // them to a stack buffer and copy them over in the end. + uint32_t max_triangles = face.num_indices - 2; + uint32_t num_triangles = 0, num_last_triangles = 0; + uint32_t last_triangles[4*3]; + + uint32_t index_begin = face.index_begin; + for (uint32_t ix = 0; ix < face.num_indices; ix++) { + uint32_t prev = edges[ix*2 + 0]; + uint32_t next = edges[ix*2 + 1]; + if (!(prev & 0x80000000)) continue; + + uint32_t *dst = indices + num_triangles * 3; + if (num_triangles + 4 >= max_triangles) { + dst = last_triangles + num_last_triangles * 3; + num_last_triangles++; + } + + dst[0] = index_begin + (prev & 0x7fffffff); + dst[1] = index_begin + ix; + dst[2] = index_begin + (next & 0x7fffffff); + num_triangles++; + } + + // Copy over the last triangles + ufbx_assert(num_triangles == max_triangles); + memcpy(indices + (max_triangles - num_last_triangles) * 3, last_triangles, num_last_triangles * 3 * sizeof(uint32_t)); + + return num_triangles; +} + +#endif + +static int ufbxi_cmp_topo_index_prev_next(const void *va, const void *vb) +{ + const ufbx_topo_edge *a = (const ufbx_topo_edge*)va, *b = (const ufbx_topo_edge*)vb; + if ((int32_t)a->prev != (int32_t)b->prev) return (int32_t)a->prev < (int32_t)b->prev ? -1 : +1; + if ((int32_t)a->next != (int32_t)b->next) return (int32_t)a->next < (int32_t)b->next ? -1 : +1; + return 0; +} + +static int ufbxi_cmp_topo_index_index(const void *va, const void *vb) +{ + const ufbx_topo_edge *a = (const ufbx_topo_edge*)va, *b = (const ufbx_topo_edge*)vb; + if ((int32_t)a->index != (int32_t)b->index) return (int32_t)a->index < (int32_t)b->index ? -1 : +1; + return 0; +} + +ufbxi_noinline static void ufbxi_compute_topology(const ufbx_mesh *mesh, ufbx_topo_edge *topo) +{ + size_t num_indices = mesh->num_indices; + + // Temporarily use `prev` and `next` for vertices + for (uint32_t fi = 0; fi < mesh->num_faces; fi++) { + ufbx_face face = mesh->faces.data[fi]; + for (uint32_t pi = 0; pi < face.num_indices; pi++) { + ufbx_topo_edge *te = &topo[face.index_begin + pi]; + uint32_t ni = (pi + 1) % face.num_indices; + uint32_t va = mesh->vertex_indices.data[face.index_begin + pi]; + uint32_t vb = mesh->vertex_indices.data[face.index_begin + ni]; + + if (vb < va) { + uint32_t vt = va; va = vb; vb = vt; + } + te->index = face.index_begin + pi; + te->twin = UFBX_NO_INDEX; + te->edge = UFBX_NO_INDEX; + te->prev = va; + te->next = vb; + te->face = fi; + te->flags = (ufbx_topo_flags)0; + } + } + + // TODO: Macro unstable/non allocating sort + qsort(topo, num_indices, sizeof(ufbx_topo_edge), &ufbxi_cmp_topo_index_prev_next); + + if (mesh->edges.data) { + for (uint32_t ei = 0; ei < mesh->num_edges; ei++) { + ufbx_edge edge = mesh->edges.data[ei]; + uint32_t va = mesh->vertex_indices.data[edge.a]; + uint32_t vb = mesh->vertex_indices.data[edge.b]; + if (vb < va) { + uint32_t vt = va; va = vb; vb = vt; + } + + size_t ix = num_indices; + ufbxi_macro_lower_bound_eq(ufbx_topo_edge, 32, &ix, topo, 0, num_indices, + (a->prev == va ? a->next < vb : a->prev < va), (a->prev == va && a->next == vb)); + + for (; ix < num_indices && topo[ix].prev == va && topo[ix].next == vb; ix++) { + topo[ix].edge = ei; + } + } + } + + // Connect paired edges + for (size_t i0 = 0; i0 < num_indices; ) { + size_t i1 = i0; + + uint32_t a = topo[i0].prev, b = topo[i0].next; + while (i1 + 1 < num_indices && topo[i1 + 1].prev == a && topo[i1 + 1].next == b) i1++; + + if (i1 == i0 + 1) { + topo[i0].twin = topo[i1].index; + topo[i1].twin = topo[i0].index; + } else if (i1 > i0 + 1) { + for (size_t i = i0; i <= i1; i++) { + topo[i].flags = (ufbx_topo_flags)(topo[i].flags | UFBX_TOPO_NON_MANIFOLD); + } + } + + i0 = i1 + 1; + } + + // TODO: Macro unstable/non allocating sort + qsort(topo, num_indices, sizeof(ufbx_topo_edge), &ufbxi_cmp_topo_index_index); + + // Fix `prev` and `next` to the actual index values + for (uint32_t fi = 0; fi < mesh->num_faces; fi++) { + ufbx_face face = mesh->faces.data[fi]; + for (uint32_t i = 0; i < face.num_indices; i++) { + ufbx_topo_edge *to = &topo[face.index_begin + i]; + to->prev = (uint32_t)(face.index_begin + (i + face.num_indices - 1) % face.num_indices); + to->next = (uint32_t)(face.index_begin + (i + 1) % face.num_indices); + } + } +} + +static bool ufbxi_is_edge_smooth(const ufbx_mesh *mesh, const ufbx_topo_edge *topo, size_t num_topo, uint32_t index, bool assume_smooth) +{ + ufbxi_ignore(num_topo); + ufbx_assert((size_t)index < num_topo); + if (mesh->edge_smoothing.data) { + uint32_t edge = topo[index].edge; + if (edge != UFBX_NO_INDEX && mesh->edge_smoothing.data[edge]) return true; + } + + if (mesh->face_smoothing.data) { + if (mesh->face_smoothing.data[topo[index].face]) return true; + uint32_t twin = topo[index].twin; + if (twin != UFBX_NO_INDEX) { + if (mesh->face_smoothing.data[topo[twin].face]) return true; + } + } + + if (!mesh->edge_smoothing.data && !mesh->face_smoothing.data && mesh->vertex_normal.exists) { + uint32_t twin = topo[index].twin; + if (twin != UFBX_NO_INDEX && mesh->vertex_normal.exists) { + ufbx_assert((size_t)twin < num_topo); + ufbx_vec3 a0 = ufbx_get_vertex_vec3(&mesh->vertex_normal, index); + ufbx_vec3 a1 = ufbx_get_vertex_vec3(&mesh->vertex_normal, topo[index].next); + ufbx_vec3 b0 = ufbx_get_vertex_vec3(&mesh->vertex_normal, topo[twin].next); + ufbx_vec3 b1 = ufbx_get_vertex_vec3(&mesh->vertex_normal, twin); + if (a0.x == b0.x && a0.y == b0.y && a0.z == b0.z) return true; + if (a1.x == b1.x && a1.y == b1.y && a1.z == b1.z) return true; + } + } else if (assume_smooth) { + return true; + } + + return false; +} + +// -- Subdivision + +#if UFBXI_FEATURE_SUBDIVISION + +typedef struct { + const void *data; + ufbx_real weight; +} ufbxi_subdivide_input; + +typedef int ufbxi_subdivide_sum_fn(void *user, void *output, const ufbxi_subdivide_input *inputs, size_t num_inputs); + +typedef struct { + ufbxi_subdivide_sum_fn *sum_fn; + void *sum_user; + + const void *values; + size_t stride; + + const uint32_t *indices; + + bool check_split_data; + bool ignore_indices; + + ufbx_subdivision_boundary boundary; + +} ufbxi_subdivide_layer_input; + +typedef struct { + void *values; + size_t num_values; + uint32_t *indices; + size_t num_indices; + bool unique_per_vertex; +} ufbxi_subdivide_layer_output; + +typedef struct { + ufbx_subdivision_weight *weights; + size_t num_weights; +} ufbxi_subdivision_vertex_weights; + +typedef struct { + ufbxi_mesh_imp *imp; + + ufbx_error error; + + ufbx_mesh *src_mesh_ptr; + ufbx_mesh src_mesh; + ufbx_mesh dst_mesh; + ufbx_topo_edge *topo; + size_t num_topo; + + ufbx_subdivide_opts opts; + + ufbxi_allocator ator_result; + ufbxi_allocator ator_tmp; + + ufbxi_buf result; + ufbxi_buf tmp; + ufbxi_buf source; + + ufbxi_subdivide_input *inputs; + size_t inputs_cap; + + ufbx_real *tmp_vertex_weights; + ufbx_subdivision_weight *tmp_weights; + size_t total_weights; + size_t max_vertex_weights; + +} ufbxi_subdivide_context; + +static int ufbxi_subdivide_sum_real(void *user, void *output, const ufbxi_subdivide_input *inputs, size_t num_inputs) +{ + (void)user; + ufbx_real dst = 0.0f; + ufbxi_nounroll for (size_t i = 0; i != num_inputs; i++) { + ufbx_real src = *(const ufbx_real*)inputs[i].data; + ufbx_real weight = inputs[i].weight; + dst += src * weight; + } + *(ufbx_real*)output = dst; + + return 1; +} + +static int ufbxi_subdivide_sum_vec2(void *user, void *output, const ufbxi_subdivide_input *inputs, size_t num_inputs) +{ + (void)user; + ufbx_vec2 dst = { 0 }; + ufbxi_nounroll for (size_t i = 0; i != num_inputs; i++) { + const ufbx_vec2 *src = (const ufbx_vec2*)inputs[i].data; + ufbx_real weight = inputs[i].weight; + dst.x += src->x * weight; + dst.y += src->y * weight; + } + *(ufbx_vec2*)output = dst; + + return 1; +} + +static int ufbxi_subdivide_sum_vec3(void *user, void *output, const ufbxi_subdivide_input *inputs, size_t num_inputs) +{ + (void)user; + ufbx_vec3 dst = { 0 }; + ufbxi_nounroll for (size_t i = 0; i != num_inputs; i++) { + const ufbx_vec3 *src = (const ufbx_vec3*)inputs[i].data; + ufbx_real weight = inputs[i].weight; + dst.x += src->x * weight; + dst.y += src->y * weight; + dst.z += src->z * weight; + } + *(ufbx_vec3*)output = dst; + + return 1; +} + +static int ufbxi_subdivide_sum_vec4(void *user, void *output, const ufbxi_subdivide_input *inputs, size_t num_inputs) +{ + (void)user; + ufbx_vec4 dst = { 0 }; + ufbxi_nounroll for (size_t i = 0; i != num_inputs; i++) { + const ufbx_vec4 *src = (const ufbx_vec4*)inputs[i].data; + ufbx_real weight = inputs[i].weight; + dst.x += src->x * weight; + dst.y += src->y * weight; + dst.z += src->z * weight; + dst.w += src->w * weight; + } + *(ufbx_vec4*)output = dst; + + return 1; +} + +static ufbxi_noinline int ufbxi_cmp_subdivision_weight(const void *va, const void *vb) +{ + ufbx_subdivision_weight a = *(const ufbx_subdivision_weight*)va, b = *(const ufbx_subdivision_weight*)vb; + ufbxi_dev_assert(a.index != b.index); + if (a.weight != b.weight) return a.weight > b.weight ? -1 : +1; + return a.index < b.index ? -1 : +1; +} + +static int ufbxi_subdivide_sum_vertex_weights(void *user, void *output, const ufbxi_subdivide_input *inputs, size_t num_inputs) +{ + ufbxi_subdivide_context *sc = (ufbxi_subdivide_context*)user; + + ufbx_real *vertex_weights = sc->tmp_vertex_weights; + ufbx_subdivision_weight *tmp_weights = sc->tmp_weights; + size_t num_weights = 0; + + ufbxi_nounroll for (size_t input_ix = 0; input_ix != num_inputs; input_ix++) { + ufbxi_subdivision_vertex_weights src = *(const ufbxi_subdivision_vertex_weights*)inputs[input_ix].data; + ufbx_real input_weight = inputs[input_ix].weight; + + for (size_t weight_ix = 0; weight_ix < src.num_weights; weight_ix++) { + ufbx_real weight = input_weight * src.weights[weight_ix].weight; + if (weight < 1.175494351e-38f) continue; + + uint32_t vx = src.weights[weight_ix].index; + ufbxi_dev_assert(vx < sc->src_mesh.num_vertices); + + ufbx_real prev = vertex_weights[vx]; + vertex_weights[vx] = prev + weight; + if (prev == 0.0f) { + tmp_weights[num_weights++].index = vx; + } + } + } + + ufbxi_nounroll for (size_t i = 0; i != num_weights; i++) { + uint32_t vx = tmp_weights[i].index; + tmp_weights[i].weight = vertex_weights[vx]; + vertex_weights[vx] = 0.0f; + } + + qsort(tmp_weights, num_weights, sizeof(ufbx_subdivision_weight), ufbxi_cmp_subdivision_weight); + + if (num_weights > sc->max_vertex_weights) { + num_weights = sc->max_vertex_weights; + + // Normalize weights + ufbx_real prefix_weight = 0.0f; + ufbxi_nounroll for (size_t i = 0; i != num_weights; i++) { + prefix_weight += tmp_weights[i].weight; + } + ufbxi_nounroll for (size_t i = 0; i != num_weights; i++) { + tmp_weights[i].weight /= prefix_weight; + } + } + + sc->total_weights += num_weights; + ufbx_subdivision_weight *weights = ufbxi_push_copy(&sc->tmp, ufbx_subdivision_weight, num_weights, tmp_weights); + ufbxi_check_err(&sc->error, weights); + + ufbxi_subdivision_vertex_weights *dst = (ufbxi_subdivision_vertex_weights*)output; + dst->weights = weights; + dst->num_weights = num_weights; + + return 1; +} + +static ufbxi_subdivide_sum_fn *ufbxi_real_sum_fns[] = { + &ufbxi_subdivide_sum_real, + &ufbxi_subdivide_sum_vec2, + &ufbxi_subdivide_sum_vec3, + &ufbxi_subdivide_sum_vec4, +}; + +ufbxi_noinline static bool ufbxi_is_edge_split(const ufbxi_subdivide_layer_input *input, const ufbx_topo_edge *topo, uint32_t index) +{ + uint32_t twin = topo[index].twin; + if (twin != UFBX_NO_INDEX) { + uint32_t a0 = input->indices[index]; + uint32_t a1 = input->indices[topo[index].next]; + uint32_t b0 = input->indices[topo[twin].next]; + uint32_t b1 = input->indices[twin]; + if (a0 == b0 && a1 == b1) return false; + if (!input->check_split_data) return true; + size_t stride = input->stride; + char *da0 = (char*)input->values + a0 * stride; + char *da1 = (char*)input->values + a1 * stride; + char *db0 = (char*)input->values + b0 * stride; + char *db1 = (char*)input->values + b1 * stride; + if (!memcmp(da0, db0, stride) && !memcmp(da1, db1, stride)) return false; + return true; + } + + return false; +} + +static ufbx_real ufbxi_edge_crease(const ufbx_mesh *mesh, bool split, const ufbx_topo_edge *topo, uint32_t index) +{ + if (topo[index].twin == UFBX_NO_INDEX) return 1.0f; + if (split) return 1.0f; + if (mesh->edge_crease.data && topo[index].edge != UFBX_NO_INDEX) return mesh->edge_crease.data[topo[index].edge] * (ufbx_real)10.0; + return 0.0f; +} + +static ufbxi_noinline int ufbxi_subdivide_layer(ufbxi_subdivide_context *sc, ufbxi_subdivide_layer_output *output, const ufbxi_subdivide_layer_input *input) +{ + ufbx_subdivision_boundary boundary = input->boundary; + + const ufbx_mesh *mesh = &sc->src_mesh; + const ufbx_topo_edge *topo = sc->topo; + size_t num_topo = sc->num_topo; + + uint32_t *edge_indices = ufbxi_push(&sc->result, uint32_t, mesh->num_indices); + ufbxi_check_err(&sc->error, edge_indices); + + size_t num_edge_values = 0; + for (uint32_t ix = 0; ix < (uint32_t)mesh->num_indices; ix++) { + uint32_t twin = topo[ix].twin; + if (twin < ix && !ufbxi_is_edge_split(input, topo, ix)) { + edge_indices[ix] = edge_indices[twin]; + } else { + edge_indices[ix] = (uint32_t)num_edge_values++; + } + } + + size_t stride = input->stride; + size_t num_initial_values = (num_edge_values + mesh->num_faces + mesh->num_indices); + char *values = (char*)ufbxi_push_size(&sc->tmp, stride, num_initial_values); + ufbxi_check_err(&sc->error, values); + + char *face_values = values; + char *edge_values = face_values + mesh->num_faces * stride; + char *vertex_values = edge_values + num_edge_values * stride; + + size_t num_vertex_values = 0; + + uint32_t *vertex_indices = ufbxi_push(&sc->result, uint32_t, mesh->num_indices); + ufbxi_check_err(&sc->error, vertex_indices); + + size_t min_inputs = ufbxi_max_sz(32, mesh->max_face_triangles + 2); + ufbxi_check_err(&sc->error, ufbxi_grow_array(&sc->ator_tmp, &sc->inputs, &sc->inputs_cap, min_inputs)); + ufbxi_subdivide_input *inputs = sc->inputs; + + // Assume initially unique per vertex, remove if not the case + output->unique_per_vertex = true; + + bool sharp_corners = false; + bool sharp_splits = false; + bool sharp_all = false; + + switch (boundary) { + case UFBX_SUBDIVISION_BOUNDARY_DEFAULT: + case UFBX_SUBDIVISION_BOUNDARY_SHARP_NONE: + case UFBX_SUBDIVISION_BOUNDARY_LEGACY: + // All smooth + break; + case UFBX_SUBDIVISION_BOUNDARY_SHARP_CORNERS: + sharp_corners = true; + break; + case UFBX_SUBDIVISION_BOUNDARY_SHARP_BOUNDARY: + sharp_corners = true; + sharp_splits = true; + break; + case UFBX_SUBDIVISION_BOUNDARY_SHARP_INTERIOR: + sharp_all = true; + break; + default: + ufbx_assert(0 && "Bad boundary mode"); + break; + } + + ufbxi_subdivide_sum_fn *sum_fn = input->sum_fn; + void *sum_user = input->sum_user; + + // Mark unused indices as `UFBX_NO_INDEX` so we can patch non-manifold + ufbxi_nounroll for (size_t i = 0; i < mesh->num_indices; i++) { + vertex_indices[i] = UFBX_NO_INDEX; + } + + // Face points + for (size_t fi = 0; fi < mesh->num_faces; fi++) { + ufbx_face face = mesh->faces.data[fi]; + char *dst = face_values + fi * stride; + + ufbx_real weight = 1.0f / (ufbx_real)face.num_indices; + for (uint32_t ci = 0; ci < face.num_indices; ci++) { + uint32_t ix = face.index_begin + ci; + inputs[ci].data = (const char*)input->values + input->indices[ix] * stride; + inputs[ci].weight = weight; + } + + ufbxi_check_err(&sc->error, sum_fn(sum_user, dst, inputs, face.num_indices)); + } + + // Edge points + for (uint32_t ix = 0; ix < mesh->num_indices; ix++) { + char *dst = edge_values + edge_indices[ix] * stride; + + uint32_t twin = topo[ix].twin; + bool split = ufbxi_is_edge_split(input, topo, ix); + + if (split || (topo[ix].flags & UFBX_TOPO_NON_MANIFOLD) != 0) { + output->unique_per_vertex = false; + } + + ufbx_real crease = 0.0f; + if (split || twin == UFBX_NO_INDEX) { + crease = 1.0f; + } else if (topo[ix].edge != UFBX_NO_INDEX && mesh->edge_crease.data) { + crease = mesh->edge_crease.data[topo[ix].edge] * (ufbx_real)10.0; + } + if (sharp_all) crease = 1.0f; + + const char *v0 = (const char*)input->values + input->indices[ix] * stride; + const char *v1 = (const char*)input->values + input->indices[topo[ix].next] * stride; + + // TODO: Unify + if (twin < ix && !split) { + // Already calculated + } else if (crease <= 0.0f) { + const char *f0 = face_values + topo[ix].face * stride; + const char *f1 = face_values + topo[twin].face * stride; + inputs[0].data = v0; + inputs[0].weight = 0.25f; + inputs[1].data = v1; + inputs[1].weight = 0.25f; + inputs[2].data = f0; + inputs[2].weight = 0.25f; + inputs[3].data = f1; + inputs[3].weight = 0.25f; + ufbxi_check_err(&sc->error, sum_fn(sum_user, dst, inputs, 4)); + } else if (crease >= 1.0f) { + inputs[0].data = v0; + inputs[0].weight = 0.5f; + inputs[1].data = v1; + inputs[1].weight = 0.5f; + ufbxi_check_err(&sc->error, sum_fn(sum_user, dst, inputs, 2)); + } else if (crease < 1.0f) { + const char *f0 = face_values + topo[ix].face * stride; + const char *f1 = face_values + topo[twin].face * stride; + ufbx_real w0 = 0.25f + 0.25f * crease; + ufbx_real w1 = 0.25f - 0.25f * crease; + + inputs[0].data = v0; + inputs[0].weight = w0; + inputs[1].data = v1; + inputs[1].weight = w0; + inputs[2].data = f0; + inputs[2].weight = w1; + inputs[3].data = f1; + inputs[3].weight = w1; + ufbxi_check_err(&sc->error, sum_fn(sum_user, dst, inputs, 4)); + } + } + + // Vertex points + for (size_t vi = 0; vi < mesh->num_vertices; vi++) { + uint32_t original_start = mesh->vertex_first_index.data[vi]; + if (original_start == UFBX_NO_INDEX) continue; + + // Find a topological boundary, or if not found a split edge + uint32_t start = original_start; + for (uint32_t cur = start;;) { + uint32_t prev = ufbx_topo_prev_vertex_edge(topo, num_topo, cur); + if (prev == UFBX_NO_INDEX) { start = cur; break; } // Topological boundary: Stop and use as start + if (ufbxi_is_edge_split(input, topo, prev)) start = cur; // Split edge: Consider as start + if (prev == original_start) break; // Loop: Stop, use original start or split if found + cur = prev; + } + + original_start = start; + while (start != UFBX_NO_INDEX) { + if (start != original_start) { + output->unique_per_vertex = false; + } + + uint32_t value_index = (uint32_t)num_vertex_values++; + char *dst = vertex_values + value_index * stride; + + // We need to compute the average crease value and keep track of + // two creased edges, if there's more we use the corner rule that + // does not need the information. + ufbx_real total_crease = 0.0f; + size_t num_crease = 0; + size_t num_split = 0; + bool on_boundary = false; + bool non_manifold = false; + size_t crease_input_indices[2]; + + // At start we always have two edges and a single face + uint32_t start_prev = topo[start].prev; + uint32_t end_edge = topo[start_prev].twin; + size_t valence = 2; + + non_manifold |= (topo[start].flags & UFBX_TOPO_NON_MANIFOLD) != 0; + non_manifold |= (topo[start_prev].flags & UFBX_TOPO_NON_MANIFOLD) != 0; + + const char *v0 = (const char*)input->values + input->indices[start] * stride; + + size_t num_inputs = 4; + + { + const char *e0 = (const char*)input->values + input->indices[topo[start].next] * stride; + const char *e1 = (const char*)input->values + input->indices[start_prev] * stride; + const char *f0 = face_values + topo[start].face * stride; + inputs[0].data = v0; + inputs[1].data = e0; + inputs[2].data = e1; + inputs[3].data = f0; + } + + bool start_split = ufbxi_is_edge_split(input, topo, start); + bool prev_split = end_edge != UFBX_NO_INDEX && ufbxi_is_edge_split(input, topo, end_edge); + + // Either of the first two edges may be creased + ufbx_real start_crease = ufbxi_edge_crease(mesh, start_split, topo, start); + if (start_crease > 0.0f) { + total_crease += start_crease; + crease_input_indices[num_crease++] = 1; + } + ufbx_real prev_crease = ufbxi_edge_crease(mesh, prev_split, topo, start_prev); + if (prev_crease > 0.0f) { + total_crease += prev_crease; + crease_input_indices[num_crease++] = 2; + } + + if (end_edge != UFBX_NO_INDEX) { + if (prev_split) { + num_split++; + } + } else { + on_boundary = true; + } + + ufbxi_check_err(&sc->error, vertex_indices[start] == UFBX_NO_INDEX); + vertex_indices[start] = value_index; + + if (start_split) { + // We need to special case if the first edge is split as we have + // handled it already in the code above.. + start = ufbx_topo_next_vertex_edge(topo, num_topo, start); + num_split++; + } else { + // Follow vertex edges until we either hit a topological/split boundary + // or loop back to the left edge we accounted for in `start_prev` + uint32_t cur = start; + for (;;) { + cur = ufbx_topo_next_vertex_edge(topo, num_topo, cur); + + // Topological boundary: Finished + if (cur == UFBX_NO_INDEX) { + on_boundary = true; + start = UFBX_NO_INDEX; + break; + } + + non_manifold |= (topo[cur].flags & UFBX_TOPO_NON_MANIFOLD) != 0; + ufbxi_check_err(&sc->error, vertex_indices[cur] == UFBX_NO_INDEX); + vertex_indices[cur] = value_index; + + bool split = ufbxi_is_edge_split(input, topo, cur); + + // Looped: Add the face from the other side still if not split + if (cur == end_edge && !split) { + ufbxi_check_err(&sc->error, ufbxi_grow_array(&sc->ator_tmp, &sc->inputs, &sc->inputs_cap, num_inputs + 1)); + const char *f0 = face_values + topo[cur].face * stride; + inputs[num_inputs].data = f0; + start = UFBX_NO_INDEX; + num_inputs += 1; + break; + } + + // Add the edge crease, this also handles boundaries as they + // have an implicit crease of 1.0 using `ufbxi_edge_crease()` + ufbx_real cur_crease = ufbxi_edge_crease(mesh, split, topo, cur); + if (cur_crease > 0.0f) { + total_crease += cur_crease; + if (num_crease < 2) crease_input_indices[num_crease] = num_inputs; + num_crease++; + } + + // Add the new edge and face to the sum + { + ufbxi_check_err(&sc->error, ufbxi_grow_array(&sc->ator_tmp, &sc->inputs, &sc->inputs_cap, num_inputs + 2)); + inputs = sc->inputs; + + const char *e0 = (char*)input->values + input->indices[topo[cur].next] * stride; + const char *f0 = face_values + topo[cur].face * stride; + inputs[num_inputs + 0].data = e0; + inputs[num_inputs + 1].data = f0; + num_inputs += 2; + } + valence++; + + // If we landed at a split edge advance to the next one + // and continue from there in the outer loop + if (split) { + start = ufbx_topo_next_vertex_edge(topo, num_topo, cur); + num_split++; + break; + } + } + } + + if (start == original_start) start = UFBX_NO_INDEX; + + // Weights for various subdivision masks + ufbx_real fe_weight = 1.0f / (ufbx_real)(valence*valence); + ufbx_real v_weight = (ufbx_real)(valence - 2) / (ufbx_real)valence; + + // Select the right subdivision mask depending on valence and crease + if (num_crease > 2 + || (sharp_corners && valence == 2 && (num_split > 0 || on_boundary)) + || (sharp_splits && (num_split > 0 || on_boundary)) + || sharp_all + || non_manifold) { + // Corner: Copy as-is + inputs[0].data = v0; + inputs[0].weight = 1.0f; + num_inputs = 1; + } else if (num_crease == 2) { + // Boundary: Interpolate edge + total_crease *= 0.5f; + if (total_crease < 0.0f) total_crease = 0.0f; + if (total_crease > 1.0f) total_crease = 1.0f; + + inputs[0].weight = v_weight * (1.0f - total_crease) + 0.75f * total_crease; + ufbx_real few = fe_weight * (1.0f - total_crease); + for (size_t i = 1; i < num_inputs; i++) { + inputs[i].weight = few; + } + + // Add weight to the creased edges + inputs[crease_input_indices[0]].weight += 0.125f * total_crease; + inputs[crease_input_indices[1]].weight += 0.125f * total_crease; + } else { + // Regular: Weighted sum with the accumulated edge/face points + inputs[0].weight = v_weight; + for (size_t i = 1; i < num_inputs; i++) { + inputs[i].weight = fe_weight; + } + + } + + if (mesh->vertex_crease.exists) { + ufbx_real v = ufbx_get_vertex_real(&mesh->vertex_crease, original_start); + v *= (ufbx_real)10.0; + if (v > 0.0f) { + if (v > 1.0) v = 1.0f; + + ufbx_real iv = 1.0f - v; + inputs[0].weight = 1.0f * v + (inputs[0].weight) * iv; + for (size_t i = 1; i < num_inputs; i++) { + inputs[i].weight *= iv; + } + } + } + +#if defined(UFBX_REGRESSION) + { + ufbx_real total_weight = 0.0f; + for (size_t i = 0; i < num_inputs; i++) { + total_weight += inputs[i].weight; + } + ufbx_assert(ufbx_fabs(total_weight - 1.0f) < 0.001f); + } +#endif + + ufbxi_check_err(&sc->error, sum_fn(sum_user, dst, inputs, num_inputs)); + } + } + + // Copy non-manifold vertex values as-is + for (size_t old_ix = 0; old_ix < mesh->num_indices; old_ix++) { + uint32_t ix = vertex_indices[old_ix]; + if (ix == UFBX_NO_INDEX) { + ix = (uint32_t)num_vertex_values++; + vertex_indices[old_ix] = ix; + const char *src = (const char*)input->values + input->indices[old_ix] * stride; + char *dst = vertex_values + ix * stride; + + inputs[0].data = src; + inputs[0].weight = 1.0f; + ufbxi_check_err(&sc->error, sum_fn(sum_user, dst, inputs, 1)); + } + } + + ufbx_assert(num_vertex_values <= mesh->num_indices); + size_t num_values = num_edge_values + mesh->num_faces + num_vertex_values; + char *new_values = (char*)ufbxi_push_size(&sc->result, stride, (num_values+1)); + ufbxi_check_err(&sc->error, new_values); + + memset(new_values, 0, stride); + new_values += stride; + + memcpy(new_values, values, num_values * stride); + + output->values = new_values; + output->num_values = num_values; + + if (!input->ignore_indices) { + uint32_t *new_indices = ufbxi_push(&sc->result, uint32_t, mesh->num_indices * 4); + ufbxi_check_err(&sc->error, new_indices); + + uint32_t face_start = 0; + uint32_t edge_start = (uint32_t)(face_start + mesh->num_faces); + uint32_t vert_start = (uint32_t)(edge_start + num_edge_values); + uint32_t *p_ix = new_indices; + for (size_t ix = 0; ix < mesh->num_indices; ix++) { + p_ix[0] = vert_start + vertex_indices[ix]; + p_ix[1] = edge_start + edge_indices[ix]; + p_ix[2] = face_start + topo[ix].face; + p_ix[3] = edge_start + edge_indices[topo[ix].prev]; + p_ix += 4; + } + output->indices = new_indices; + output->num_indices = mesh->num_indices * 4; + } else { + output->indices = NULL; + output->num_indices = 0; + } + + return 1; +} + +static ufbxi_noinline int ufbxi_subdivide_attrib(ufbxi_subdivide_context *sc, ufbx_vertex_attrib *attrib, ufbx_subdivision_boundary boundary, bool check_split_data) +{ + if (!attrib->exists) return 1; + + ufbx_assert(attrib->value_reals >= 1 && attrib->value_reals <= 4); + + ufbxi_subdivide_layer_input input; + input.sum_fn = ufbxi_real_sum_fns[attrib->value_reals - 1]; + input.sum_user = NULL; + input.values = attrib->values.data; + input.indices = attrib->indices.data; + input.stride = attrib->value_reals * sizeof(ufbx_real); + input.boundary = boundary; + input.check_split_data = check_split_data; + input.ignore_indices = false; + + ufbxi_subdivide_layer_output output; + ufbxi_check_err(&sc->error, ufbxi_subdivide_layer(sc, &output, &input)); + + attrib->values.data = output.values; + attrib->indices.data = output.indices; + attrib->values.count = output.num_values; + attrib->indices.count = output.num_indices; + + return 1; +} + +static ufbxi_noinline ufbxi_subdivision_vertex_weights *ufbxi_subdivision_copy_weights(ufbxi_subdivide_context *sc, ufbx_subdivision_weight_range_list ranges, ufbx_subdivision_weight_list weights) +{ + ufbxi_subdivision_vertex_weights *dst = ufbxi_push(&sc->tmp, ufbxi_subdivision_vertex_weights, ranges.count); + ufbxi_check_return_err(&sc->error, dst, NULL); + + ufbxi_nounroll for (size_t i = 0; i != ranges.count; i++) { + ufbx_subdivision_weight_range range = ranges.data[i]; + dst[i].weights = weights.data + range.weight_begin; + dst[i].num_weights = range.num_weights; + } + + return dst; +} + +static ufbxi_noinline ufbxi_subdivision_vertex_weights *ufbxi_init_source_vertex_weights(ufbxi_subdivide_context *sc, size_t num_vertices) +{ + ufbxi_subdivision_vertex_weights *dst = ufbxi_push(&sc->tmp, ufbxi_subdivision_vertex_weights, num_vertices); + ufbx_subdivision_weight *weights = ufbxi_push(&sc->tmp, ufbx_subdivision_weight, num_vertices); + ufbxi_check_return_err(&sc->error, dst && weights, NULL); + + ufbxi_nounroll for (size_t i = 0; i != num_vertices; i++) { + dst[i].weights = weights + i; + dst[i].num_weights = 1; + weights[i].index = (uint32_t)i; + weights[i].weight = 1.0f; + } + + return dst; +} + +static ufbxi_noinline ufbxi_subdivision_vertex_weights *ufbxi_init_skin_weights(ufbxi_subdivide_context *sc, size_t num_vertices, const ufbx_skin_deformer *skin) +{ + ufbxi_subdivision_vertex_weights *dst = ufbxi_push(&sc->tmp, ufbxi_subdivision_vertex_weights, num_vertices); + ufbxi_check_return_err(&sc->error, dst, NULL); + + for (size_t i = 0; i < num_vertices; i++) { + ufbxi_dev_assert(i < skin->vertices.count); + ufbx_skin_vertex vertex = skin->vertices.data[i]; + size_t num_weights = ufbxi_min_sz(sc->max_vertex_weights, vertex.num_weights); + + ufbx_subdivision_weight *weights = ufbxi_push(&sc->tmp, ufbx_subdivision_weight, num_weights); + ufbxi_check_err(&sc->error, weights); + + const ufbx_skin_weight *skin_weights = skin->weights.data + vertex.weight_begin; + + dst[i].weights = weights; + dst[i].num_weights = num_weights; + ufbxi_nounroll for (size_t wi = 0; wi != num_weights; wi++) { + ufbxi_check_err(&sc->error, skin_weights[wi].cluster_index <= INT32_MAX); + weights[wi].index = skin_weights[wi].cluster_index; + weights[wi].weight = skin_weights[wi].weight; + } + } + + return dst; +} + +static ufbxi_noinline int ufbxi_subdivide_weights(ufbxi_subdivide_context *sc, ufbx_subdivision_weight_range_list *ranges, + ufbx_subdivision_weight_list *weights, const ufbxi_subdivision_vertex_weights *src) +{ + ufbxi_check_err(&sc->error, src); + + ufbxi_subdivide_layer_input input; + input.sum_fn = ufbxi_subdivide_sum_vertex_weights; + input.sum_user = sc; + input.values = src; + input.indices = sc->src_mesh.vertex_indices.data; + input.stride = sizeof(ufbxi_subdivision_vertex_weights); + input.boundary = sc->opts.boundary; + input.check_split_data = false; + input.ignore_indices = true; + + sc->total_weights = 0; + + ufbxi_subdivide_layer_output output; + ufbxi_check_err(&sc->error, ufbxi_subdivide_layer(sc, &output, &input)); + + size_t num_vertices = output.num_values; + ufbx_assert(num_vertices == sc->dst_mesh.vertex_position.values.count); + + ufbx_subdivision_weight_range *dst_ranges = ufbxi_push(&sc->result, ufbx_subdivision_weight_range, num_vertices); + ufbx_subdivision_weight *dst_weights = ufbxi_push(&sc->result, ufbx_subdivision_weight, sc->total_weights); + ufbxi_check_err(&sc->error, ranges && weights); + + ufbxi_subdivision_vertex_weights *src_weights = (ufbxi_subdivision_vertex_weights*)output.values; + + size_t weight_offset = 0; + for (size_t vi = 0; vi < num_vertices; vi++) { + ufbxi_subdivision_vertex_weights ws = src_weights[vi]; + ufbxi_check_err(&sc->error, (size_t)UINT32_MAX - weight_offset >= ws.num_weights); + + dst_ranges[vi].weight_begin = (uint32_t)weight_offset; + dst_ranges[vi].num_weights = (uint32_t)ws.num_weights; + memcpy(dst_weights + weight_offset, ws.weights, ws.num_weights * sizeof(ufbx_subdivision_weight)); + weight_offset += ws.num_weights; + } + + ranges->data = dst_ranges; + ranges->count = num_vertices; + weights->data = dst_weights; + weights->count = sc->total_weights; + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_subdivide_vertex_crease(ufbxi_subdivide_context *sc, ufbx_vertex_real *ufbxi_restrict dst, const ufbx_vertex_real *ufbxi_restrict src) +{ + size_t src_indices = src->indices.count; + size_t src_values = src->values.count; + + dst->values.count = src_values + 1; + dst->values.data = ufbxi_push(&sc->result, ufbx_real, dst->values.count); + ufbxi_check_err(&sc->error, dst->values.data); + dst->values.data[src_values] = 0.0f; + + dst->indices.count = src_indices * 4; + dst->indices.data = ufbxi_push(&sc->result, uint32_t, dst->indices.count); + ufbxi_check_err(&sc->error, dst->indices.data); + + // Reduce the amount of vertex crease on each iteration + ufbxi_nounroll for (size_t i = 0; i < src_values; i++) { + ufbx_real crease = src->values.data[i]; + if (crease < 0.999f) crease -= 0.1f; + if (crease < 0.0f) crease = 0.0f; + dst->values.data[i] = crease; + } + + // Write the crease at the vertex corner and zero (at `src_values`) on other ones + uint32_t zero_index = (uint32_t)src_values; + ufbxi_nounroll for (size_t i = 0; i < src_indices; i++) { + uint32_t *quad = dst->indices.data + i * 4; + quad[0] = src->indices.data[i]; + quad[1] = zero_index; + quad[2] = zero_index; + quad[3] = zero_index; + } + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_subdivide_mesh_level(ufbxi_subdivide_context *sc) +{ + const ufbx_mesh *mesh = &sc->src_mesh; + ufbx_mesh *result = &sc->dst_mesh; + + *result = *mesh; + + ufbx_topo_edge *topo = ufbxi_push(&sc->tmp, ufbx_topo_edge, mesh->num_indices); + ufbxi_check_err(&sc->error, topo); + ufbx_compute_topology(mesh, topo, mesh->num_indices); + sc->topo = topo; + sc->num_topo = mesh->num_indices; + + ufbxi_check_err(&sc->error, ufbxi_subdivide_attrib(sc, (ufbx_vertex_attrib*)&result->vertex_position, sc->opts.boundary, false)); + + memset(&result->vertex_uv, 0, sizeof(result->vertex_uv)); + memset(&result->vertex_tangent, 0, sizeof(result->vertex_tangent)); + memset(&result->vertex_bitangent, 0, sizeof(result->vertex_bitangent)); + memset(&result->vertex_color, 0, sizeof(result->vertex_color)); + + result->uv_sets.data = ufbxi_push_copy(&sc->result, ufbx_uv_set, result->uv_sets.count, result->uv_sets.data); + ufbxi_check_err(&sc->error, result->uv_sets.data); + + result->color_sets.data = ufbxi_push_copy(&sc->result, ufbx_color_set, result->color_sets.count, result->color_sets.data); + ufbxi_check_err(&sc->error, result->color_sets.data); + + ufbxi_for_list(ufbx_uv_set, set, result->uv_sets) { + ufbxi_check_err(&sc->error, ufbxi_subdivide_attrib(sc, (ufbx_vertex_attrib*)&set->vertex_uv, sc->opts.uv_boundary, true)); + if (sc->opts.interpolate_tangents) { + ufbxi_check_err(&sc->error, ufbxi_subdivide_attrib(sc, (ufbx_vertex_attrib*)&set->vertex_tangent, sc->opts.uv_boundary, true)); + ufbxi_check_err(&sc->error, ufbxi_subdivide_attrib(sc, (ufbx_vertex_attrib*)&set->vertex_bitangent, sc->opts.uv_boundary, true)); + } else { + memset(&set->vertex_tangent, 0, sizeof(set->vertex_tangent)); + memset(&set->vertex_bitangent, 0, sizeof(set->vertex_bitangent)); + } + } + + ufbxi_for_list(ufbx_color_set, set, result->color_sets) { + ufbxi_check_err(&sc->error, ufbxi_subdivide_attrib(sc, (ufbx_vertex_attrib*)&set->vertex_color, sc->opts.uv_boundary, true)); + } + + if (result->uv_sets.count > 0) { + result->vertex_uv = result->uv_sets.data[0].vertex_uv; + result->vertex_bitangent = result->uv_sets.data[0].vertex_bitangent; + result->vertex_tangent = result->uv_sets.data[0].vertex_tangent; + } + if (result->color_sets.count > 0) { + result->vertex_color = result->color_sets.data[0].vertex_color; + } + + if (sc->opts.interpolate_normals && !sc->opts.ignore_normals) { + ufbxi_check_err(&sc->error, ufbxi_subdivide_attrib(sc, (ufbx_vertex_attrib*)&result->vertex_normal, sc->opts.boundary, true)); + ufbxi_for_list(ufbx_vec3, normal, result->vertex_normal.values) { + *normal = ufbxi_slow_normalize3(normal); + } + if (mesh->skinned_normal.values.data == mesh->vertex_normal.values.data) { + result->skinned_normal = result->vertex_normal; + } else { + ufbxi_check_err(&sc->error, ufbxi_subdivide_attrib(sc, (ufbx_vertex_attrib*)&result->skinned_normal, sc->opts.boundary, true)); + ufbxi_for_list(ufbx_vec3, normal, result->skinned_normal.values) { + *normal = ufbxi_slow_normalize3(normal); + } + } + } + + if (result->vertex_crease.exists) { + ufbxi_check_err(&sc->error, ufbxi_subdivide_vertex_crease(sc, &result->vertex_crease, &mesh->vertex_crease)); + } + + if (mesh->skinned_position.values.data == mesh->vertex_position.values.data) { + result->skinned_position = result->vertex_position; + } else { + ufbxi_check_err(&sc->error, ufbxi_subdivide_attrib(sc, (ufbx_vertex_attrib*)&result->skinned_position, sc->opts.boundary, false)); + } + + ufbx_subdivision_result *result_sub = ufbxi_push_zero(&sc->result, ufbx_subdivision_result, 1); + ufbxi_check_err(&sc->error, result_sub); + result->subdivision_result = result_sub; + + if (sc->opts.evaluate_source_vertices || sc->opts.evaluate_skin_weights) { + ufbx_subdivision_result *mesh_sub = mesh->subdivision_result; + + ufbx_skin_deformer *skin = NULL; + if (sc->opts.evaluate_skin_weights) { + if (mesh->skin_deformers.count > 0) { + ufbxi_check_err(&sc->error, sc->opts.skin_deformer_index < mesh->skin_deformers.count); + skin = mesh->skin_deformers.data[sc->opts.skin_deformer_index]; + } + } + + size_t max_weights = 0; + if (sc->opts.evaluate_source_vertices) { + max_weights = ufbxi_max_sz(max_weights, mesh->num_vertices); + } + if (skin) { + max_weights = ufbxi_max_sz(max_weights, skin->clusters.count); + } + + sc->tmp_vertex_weights = ufbxi_push_zero(&sc->tmp, ufbx_real, mesh->num_vertices); + sc->tmp_weights = ufbxi_push(&sc->tmp, ufbx_subdivision_weight, max_weights); + ufbxi_check_err(&sc->error, sc->tmp_vertex_weights && sc->tmp_weights); + + if (sc->opts.evaluate_source_vertices) { + sc->max_vertex_weights = sc->opts.max_source_vertices ? sc->opts.max_source_vertices : SIZE_MAX; + + ufbxi_subdivision_vertex_weights *weights; + if (mesh_sub && mesh_sub->source_vertex_ranges.count > 0) { + weights = ufbxi_subdivision_copy_weights(sc, mesh_sub->source_vertex_ranges, mesh_sub->source_vertex_weights); + } else { + weights = ufbxi_init_source_vertex_weights(sc, mesh->num_vertices); + } + + ufbxi_check_err(&sc->error, ufbxi_subdivide_weights(sc, &result_sub->source_vertex_ranges, &result_sub->source_vertex_weights, weights)); + } + + if (skin) { + sc->max_vertex_weights = sc->opts.max_skin_weights ? sc->opts.max_skin_weights : SIZE_MAX; + + ufbxi_subdivision_vertex_weights *weights; + if (mesh_sub && mesh_sub->source_vertex_ranges.count > 0) { + weights = ufbxi_subdivision_copy_weights(sc, mesh_sub->skin_cluster_ranges, mesh_sub->skin_cluster_weights); + } else { + weights = ufbxi_init_skin_weights(sc, mesh->num_vertices, skin); + } + + ufbxi_check_err(&sc->error, ufbxi_subdivide_weights(sc, &result_sub->skin_cluster_ranges, &result_sub->skin_cluster_weights, weights)); + } + + } + + result->num_vertices = result->vertex_position.values.count; + result->num_indices = mesh->num_indices * 4; + result->num_faces = mesh->num_indices; + result->num_triangles = mesh->num_indices * 2; + + result->vertex_indices.data = result->vertex_position.indices.data; + result->vertex_indices.count = result->num_indices; + result->vertices.data = result->vertex_position.values.data; + result->vertices.count = result->num_vertices; + + result->faces.count = result->num_faces; + result->faces.data = ufbxi_push(&sc->result, ufbx_face, result->num_faces); + ufbxi_check_err(&sc->error, result->faces.data); + + for (size_t i = 0; i < result->num_faces; i++) { + result->faces.data[i].index_begin = (uint32_t)(i * 4); + result->faces.data[i].num_indices = 4; + } + + if (mesh->edges.data) { + result->num_edges = mesh->num_edges*2 + result->num_faces; + result->edges.count = result->num_edges; + result->edges.data = ufbxi_push(&sc->result, ufbx_edge, result->num_edges); + ufbxi_check_err(&sc->error, result->edges.data); + + if (mesh->edge_crease.data) { + result->edge_crease.count = result->num_edges; + result->edge_crease.data = ufbxi_push(&sc->result, ufbx_real, result->num_edges); + ufbxi_check_err(&sc->error, result->edge_crease.data); + } + if (mesh->edge_smoothing.data) { + result->edge_smoothing.count = result->num_edges; + result->edge_smoothing.data = ufbxi_push(&sc->result, bool, result->num_edges); + ufbxi_check_err(&sc->error, result->edge_smoothing.data); + } + if (mesh->edge_visibility.data) { + result->edge_visibility.count = result->num_edges; + result->edge_visibility.data = ufbxi_push(&sc->result, bool, result->num_edges); + ufbxi_check_err(&sc->error, result->edge_visibility.data); + } + + size_t di = 0; + for (size_t i = 0; i < mesh->num_edges; i++) { + ufbx_edge edge = mesh->edges.data[i]; + uint32_t face_ix = topo[edge.a].face; + ufbx_face face = mesh->faces.data[face_ix]; + uint32_t offset = edge.a - face.index_begin; + uint32_t next = (offset + 1) % (uint32_t)face.num_indices; + + uint32_t a = (face.index_begin + offset) * 4; + uint32_t b = (face.index_begin + next) * 4; + + result->edges.data[di + 0].a = a; + result->edges.data[di + 0].b = a + 1; + result->edges.data[di + 1].a = b + 3; + result->edges.data[di + 1].b = b; + + if (mesh->edge_crease.data) { + ufbx_real crease = mesh->edge_crease.data[i]; + if (crease < 0.999f) crease -= 0.1f; + if (crease < 0.0f) crease = 0.0f; + result->edge_crease.data[di + 0] = crease; + result->edge_crease.data[di + 1] = crease; + } + + if (mesh->edge_smoothing.data) { + result->edge_smoothing.data[di + 0] = mesh->edge_smoothing.data[i]; + result->edge_smoothing.data[di + 1] = mesh->edge_smoothing.data[i]; + } + + if (mesh->edge_visibility.data) { + result->edge_visibility.data[di + 0] = mesh->edge_visibility.data[i]; + result->edge_visibility.data[di + 1] = mesh->edge_visibility.data[i]; + } + + di += 2; + } + + for (size_t fi = 0; fi < result->num_faces; fi++) { + result->edges.data[di].a = (uint32_t)(fi * 4 + 1); + result->edges.data[di].b = (uint32_t)(fi * 4 + 2); + + if (result->edge_crease.data) { + result->edge_crease.data[di] = 0.0f; + } + + if (result->edge_smoothing.data) { + result->edge_smoothing.data[di + 0] = true; + } + + if (result->edge_visibility.data) { + result->edge_visibility.data[di + 0] = false; + } + + di++; + } + } + + if (mesh->face_material.data) { + result->face_material.count = result->num_faces; + result->face_material.data = ufbxi_push(&sc->result, uint32_t, result->num_faces); + ufbxi_check_err(&sc->error, result->face_material.data); + } + if (mesh->face_smoothing.data) { + result->face_smoothing.count = result->num_faces; + result->face_smoothing.data = ufbxi_push(&sc->result, bool, result->num_faces); + ufbxi_check_err(&sc->error, result->face_smoothing.data); + } + if (mesh->face_group.data) { + result->face_group.count = result->num_faces; + result->face_group.data = ufbxi_push(&sc->result, uint32_t, result->num_faces); + ufbxi_check_err(&sc->error, result->face_group.data); + } + if (mesh->face_hole.data) { + result->face_hole.count = result->num_faces; + result->face_hole.data = ufbxi_push(&sc->result, bool, result->num_faces); + ufbxi_check_err(&sc->error, result->face_hole.data); + } + + size_t num_materials = result->materials.count; + result->materials.data = ufbxi_push_copy(&sc->result, ufbx_mesh_material, num_materials, result->materials.data); + ufbxi_check_err(&sc->error, result->materials.data); + ufbxi_for_list(ufbx_mesh_material, mat, result->materials) { + mat->num_faces = 0; + mat->num_triangles = 0; + mat->num_empty_faces = 0; + mat->num_point_faces = 0; + mat->num_line_faces = 0; + } + + size_t index_offset = 0; + for (size_t i = 0; i < mesh->num_faces; i++) { + ufbx_face face = mesh->faces.data[i]; + + uint32_t mat = 0; + if (mesh->face_material.data) { + mat = mesh->face_material.data[i]; + for (size_t ci = 0; ci < face.num_indices; ci++) { + result->face_material.data[index_offset + ci] = mat; + } + } + if (mesh->face_smoothing.data) { + bool flag = mesh->face_smoothing.data[i]; + for (size_t ci = 0; ci < face.num_indices; ci++) { + result->face_smoothing.data[index_offset + ci] = flag; + } + } + if (mesh->face_group.data) { + uint32_t group = mesh->face_group.data[i]; + for (size_t ci = 0; ci < face.num_indices; ci++) { + result->face_group.data[index_offset + ci] = group; + } + } + if (mesh->face_hole.data) { + bool flag = mesh->face_hole.data[i]; + for (size_t ci = 0; ci < face.num_indices; ci++) { + result->face_hole.data[index_offset + ci] = flag; + } + } + index_offset += face.num_indices; + } + + // Will be filled in by `ufbxi_finalize_mesh()`. + result->vertex_first_index.count = 0; + + ufbxi_check_err(&sc->error, ufbxi_finalize_mesh_material(&sc->result, &sc->error, result)); + ufbxi_check_err(&sc->error, ufbxi_finalize_mesh(&sc->result, &sc->error, result)); + ufbxi_check_err(&sc->error, ufbxi_update_face_groups(&sc->result, &sc->error, result, true)); + + return 1; +} + +ufbxi_nodiscard static ufbxi_noinline int ufbxi_subdivide_mesh_imp(ufbxi_subdivide_context *sc, size_t level) +{ + // `ufbx_subdivide_opts` must be cleared to zero first! + ufbx_assert(sc->opts._begin_zero == 0 && sc->opts._end_zero == 0); + ufbxi_check_err_msg(&sc->error, sc->opts._begin_zero == 0 && sc->opts._end_zero == 0, "Uninitialized options"); + + if (sc->opts.boundary == UFBX_SUBDIVISION_BOUNDARY_DEFAULT) { + sc->opts.boundary = sc->src_mesh.subdivision_boundary; + } + + if (sc->opts.uv_boundary == UFBX_SUBDIVISION_BOUNDARY_DEFAULT) { + sc->opts.uv_boundary = sc->src_mesh.subdivision_uv_boundary; + } + + ufbxi_init_ator(&sc->error, &sc->ator_tmp, &sc->opts.temp_allocator, "temp"); + ufbxi_init_ator(&sc->error, &sc->ator_result, &sc->opts.result_allocator, "result"); + + sc->result.unordered = true; + sc->source.unordered = true; + sc->tmp.unordered = true; + + sc->source.ator = &sc->ator_tmp; + sc->tmp.ator = &sc->ator_tmp; + + for (size_t i = 1; i < level; i++) { + sc->result.ator = &sc->ator_tmp; + + ufbxi_check_err(&sc->error, ufbxi_subdivide_mesh_level(sc)); + + sc->src_mesh = sc->dst_mesh; + + ufbxi_buf_free(&sc->source); + ufbxi_buf_free(&sc->tmp); + sc->source = sc->result; + memset(&sc->result, 0, sizeof(sc->result)); + } + + sc->result.ator = &sc->ator_result; + ufbxi_check_err(&sc->error, ufbxi_subdivide_mesh_level(sc)); + ufbxi_buf_free(&sc->tmp); + + ufbx_mesh *mesh = &sc->dst_mesh; + memset(&mesh->vertex_normal, 0, sizeof(mesh->vertex_normal)); + memset(&mesh->skinned_normal, 0, sizeof(mesh->skinned_normal)); + + // Subdivision always results in a mesh that consists only of quads + mesh->max_face_triangles = 2; + mesh->num_empty_faces = 0; + mesh->num_point_faces = 0; + mesh->num_line_faces = 0; + + if (!sc->opts.interpolate_normals && !sc->opts.ignore_normals) { + + ufbx_topo_edge *topo = ufbxi_push(&sc->tmp, ufbx_topo_edge, mesh->num_indices); + ufbxi_check_err(&sc->error, topo); + ufbx_compute_topology(mesh, topo, mesh->num_indices); + + uint32_t *normal_indices = ufbxi_push(&sc->result, uint32_t, mesh->num_indices); + ufbxi_check_err(&sc->error, normal_indices); + + size_t num_normals = ufbx_generate_normal_mapping(mesh, topo, mesh->num_indices, normal_indices, mesh->num_indices, true); + if (num_normals == mesh->num_vertices) { + mesh->skinned_normal.unique_per_vertex = true; + } + + ufbx_vec3 *normal_data = ufbxi_push(&sc->result, ufbx_vec3, num_normals + 1); + ufbxi_check_err(&sc->error, normal_data); + normal_data[0] = ufbx_zero_vec3; + normal_data++; + + ufbx_compute_normals(mesh, &mesh->skinned_position, normal_indices, mesh->num_indices, normal_data, num_normals); + + mesh->generated_normals = true; + mesh->vertex_normal.exists = true; + mesh->vertex_normal.values.data = normal_data; + mesh->vertex_normal.values.count = num_normals; + mesh->vertex_normal.indices.data = normal_indices; + mesh->vertex_normal.indices.count = mesh->num_indices; + + mesh->skinned_normal = mesh->vertex_normal; + } + + ufbxi_refcount *parent = NULL; + if (sc->src_mesh_ptr->subdivision_evaluated && sc->src_mesh_ptr->from_tessellated_nurbs) { + parent = &(ufbxi_get_imp(ufbxi_mesh_imp, sc->src_mesh_ptr))->refcount; + } else { + parent = &(ufbxi_get_imp(ufbxi_scene_imp, sc->src_mesh_ptr->element.scene))->refcount; + } + + ufbxi_patch_mesh_reals(mesh); + + sc->imp = ufbxi_push(&sc->result, ufbxi_mesh_imp, 1); + ufbxi_check_err(&sc->error, sc->imp); + + sc->dst_mesh.subdivision_result->result_memory_used = sc->ator_result.current_size; + sc->dst_mesh.subdivision_result->temp_memory_used = sc->ator_tmp.current_size; + sc->dst_mesh.subdivision_result->result_allocs = sc->ator_result.num_allocs; + sc->dst_mesh.subdivision_result->temp_allocs = sc->ator_tmp.num_allocs; + + ufbxi_init_ref(&sc->imp->refcount, UFBXI_MESH_IMP_MAGIC, parent); + + sc->imp->magic = UFBXI_MESH_IMP_MAGIC; + sc->imp->mesh = sc->dst_mesh; + sc->imp->ator = sc->ator_result; + sc->imp->result_buf = sc->result; + sc->imp->mesh.subdivision_evaluated = true; + + return 1; +} + +ufbxi_noinline static ufbx_mesh *ufbxi_subdivide_mesh(const ufbx_mesh *mesh, size_t level, const ufbx_subdivide_opts *user_opts, ufbx_error *p_error) +{ + ufbxi_subdivide_context sc = { 0 }; + if (user_opts) { + sc.opts = *user_opts; + } + + sc.src_mesh_ptr = (ufbx_mesh*)mesh; + sc.src_mesh = *mesh; + + int ok = ufbxi_subdivide_mesh_imp(&sc, level); + + ufbxi_free(&sc.ator_tmp, ufbxi_subdivide_input, sc.inputs, sc.inputs_cap); + ufbxi_buf_free(&sc.tmp); + ufbxi_buf_free(&sc.source); + + if (ok) { + ufbxi_free_ator(&sc.ator_tmp); + if (p_error) { + ufbxi_clear_error(p_error); + } + + ufbxi_mesh_imp *imp = sc.imp; + return &imp->mesh; + } else { + ufbxi_fix_error_type(&sc.error, "Failed to subdivide"); + if (p_error) *p_error = sc.error; + ufbxi_buf_free(&sc.result); + ufbxi_free_ator(&sc.ator_tmp); + ufbxi_free_ator(&sc.ator_result); + return NULL; + } +} + +#else + +ufbxi_noinline static ufbx_mesh *ufbxi_subdivide_mesh(const ufbx_mesh *mesh, size_t level, const ufbx_subdivide_opts *user_opts, ufbx_error *p_error) +{ + if (p_error) { + memset(p_error, 0, sizeof(ufbx_error)); + ufbxi_fmt_err_info(p_error, "UFBX_ENABLE_SUBDIVISION"); + ufbxi_report_err_msg(p_error, "UFBXI_FEATURE_SUBDIVISION", "Feature disabled"); + } + return NULL; +} + +#endif + +// -- Utility + +#if UFBXI_FEATURE_INDEX_GENERATION + +static int ufbxi_map_cmp_vertex(void *user, const void *va, const void *vb) +{ + size_t size = *(size_t*)user; +#if defined(UFBX_REGRESSION) + ufbx_assert(size % 8 == 0); +#endif + for (size_t i = 0; i < size; i += 8) { + uint64_t a = *(const uint64_t*)((const char*)va + i); + uint64_t b = *(const uint64_t*)((const char*)vb + i); + if (a != b) return a < b ? -1 : +1; + } + return 0; +} + +typedef struct { + char *begin, *ptr; + size_t vertex_size; + size_t packed_offset; +} ufbxi_vertex_stream; + +static ufbxi_noinline size_t ufbxi_generate_indices(const ufbx_vertex_stream *user_streams, size_t num_streams, uint32_t *indices, size_t num_indices, const ufbx_allocator_opts *allocator, ufbx_error *error) +{ + bool fail = false; + + ufbxi_allocator ator = { 0 }; + ufbxi_init_ator(error, &ator, allocator, "allocator"); + + ufbxi_vertex_stream local_streams[16]; + uint64_t local_packed_vertex[64]; + + ufbxi_vertex_stream *streams = NULL; + if (num_streams > ufbxi_arraycount(local_streams)) { + streams = ufbxi_alloc(&ator, ufbxi_vertex_stream, num_streams); + if (!streams) fail = true; + } else { + streams = local_streams; + } + + size_t packed_size = 0; + if (!fail) { + for (size_t i = 0; i < num_streams; i++) { + size_t vertex_size = user_streams[i].vertex_size; + size_t align = ufbxi_size_align_mask(vertex_size); + packed_size = ufbxi_align_to_mask(packed_size, align); + streams[i].ptr = streams[i].begin = (char*)user_streams[i].data; + streams[i].vertex_size = vertex_size; + streams[i].packed_offset = packed_size; + packed_size += vertex_size; + } + packed_size = ufbxi_align_to_mask(packed_size, 7); + } + + if (!fail && packed_size == 0) { + ufbxi_report_err_msg(error, "packed_size != 0", "Zero vertex size"); + fail = true; + } + + char *packed_vertex = NULL; + if (!fail) { + if (packed_size > sizeof(local_packed_vertex)) { + ufbx_assert(packed_size % 8 == 0); + packed_vertex = (char*)ufbxi_alloc(&ator, uint64_t, packed_size / 8); + if (!packed_vertex) fail = true; + } else { + packed_vertex = (char*)local_packed_vertex; + } + } + + ufbxi_map map = { 0 }; + ufbxi_map_init(&map, &ator, &ufbxi_map_cmp_vertex, &packed_size); + + if (num_indices > 0 && !ufbxi_map_grow_size(&map, packed_size, num_indices)) { + fail = true; + } + + if (!fail) { + ufbx_assert(packed_vertex != NULL); + memset(packed_vertex, 0, packed_size); + + for (size_t i = 0; i < num_indices; i++) { + for (size_t si = 0; si < num_streams; si++) { + size_t size = streams[si].vertex_size, offset = streams[si].packed_offset; + char *ptr = streams[si].ptr; + memcpy(packed_vertex + offset, ptr, size); + streams[si].ptr = ptr + size; + } + + uint32_t hash = ufbxi_hash_string(packed_vertex, packed_size); + void *entry = ufbxi_map_find_size(&map, packed_size, hash, packed_vertex); + if (!entry) { + entry = ufbxi_map_insert_size(&map, packed_size, hash, packed_vertex); + if (!entry) { + fail = true; + break; + } + memcpy(entry, packed_vertex, packed_size); + } + uint32_t index = (uint32_t)(ufbxi_to_size((char*)entry - (char*)map.items) / packed_size); + indices[i] = index; + } + } + + size_t result_vertices = 0; + if (!fail) { + result_vertices = map.size; + + for (size_t si = 0; si < num_streams; si++) { + size_t vertex_size = streams[si].vertex_size; + char *dst = streams[si].begin; + char *src = (char*)map.items + streams[si].packed_offset; + for (size_t i = 0; i < result_vertices; i++) { + memcpy(dst, src, vertex_size); + dst += vertex_size; + src += packed_size; + } + } + + ufbxi_clear_error(error); + } else { + ufbxi_fix_error_type(error, "Failed to generate indices"); + } + + if (streams && streams != local_streams) { + ufbxi_free(&ator, ufbxi_vertex_stream, streams, num_streams); + } + if (packed_vertex && packed_vertex != (char*)local_packed_vertex) { + ufbxi_free(&ator, uint64_t, packed_vertex, packed_size / 8); + } + + ufbxi_map_free(&map); + ufbxi_free_ator(&ator); + + return result_vertices; +} + +#else + +static ufbxi_noinline size_t ufbxi_generate_indices(const ufbx_vertex_stream *user_streams, size_t num_streams, uint32_t *indices, size_t num_indices, const ufbx_allocator_opts *allocator, ufbx_error *error) +{ + if (error) { + memset(error, 0, sizeof(ufbx_error)); + ufbxi_fmt_err_info(error, "UFBX_ENABLE_INDEX_GENERATION"); + ufbxi_report_err_msg(error, "UFBXI_FEATURE_INDEX_GENERATION", "Feature disabled"); + } + return 0; +} + +#endif + +static ufbxi_noinline void ufbxi_free_scene_imp(ufbxi_scene_imp *imp) +{ + ufbx_assert(imp->magic == UFBXI_SCENE_IMP_MAGIC); + if (imp->magic != UFBXI_SCENE_IMP_MAGIC) return; + imp->magic = 0; + + ufbxi_buf_free(&imp->string_buf); + + // We need to free `result_buf` last and be careful to copy it to + // the stack since the `ufbxi_scene_imp` that contains it is allocated + // from the same result buffer! + ufbxi_allocator ator = imp->ator; + ufbxi_buf result = imp->result_buf; + result.ator = &ator; + ufbxi_buf_free(&result); + ufbxi_free_ator(&ator); +} + +static ufbxi_noinline void ufbxi_free_mesh_imp(ufbxi_mesh_imp *imp) +{ + ufbx_assert(imp->magic == UFBXI_MESH_IMP_MAGIC); + if (imp->magic != UFBXI_MESH_IMP_MAGIC) return; + imp->magic = 0; + + // See `ufbxi_free_scene()` for more information + ufbxi_allocator ator = imp->ator; + ufbxi_buf result = imp->result_buf; + result.ator = &ator; + ufbxi_buf_free(&result); + ufbxi_free_ator(&ator); +} + +static ufbxi_noinline void ufbxi_free_line_curve_imp(ufbxi_line_curve_imp *imp) +{ + ufbx_assert(imp->magic == UFBXI_LINE_CURVE_IMP_MAGIC); + if (imp->magic != UFBXI_LINE_CURVE_IMP_MAGIC) return; + imp->magic = 0; + + // See `ufbxi_free_scene()` for more information + ufbxi_allocator ator = imp->ator; + ufbxi_buf result = imp->result_buf; + result.ator = &ator; + ufbxi_buf_free(&result); + ufbxi_free_ator(&ator); +} + +static ufbxi_noinline void ufbxi_init_ref(ufbxi_refcount *refcount, uint32_t magic, ufbxi_refcount *parent) +{ + if (parent) { + ufbxi_retain_ref(parent); + } + + ufbxi_atomic_counter_init(&refcount->refcount); + refcount->self_magic = UFBXI_REFCOUNT_IMP_MAGIC; + refcount->type_magic = magic; + refcount->parent = parent; +} + +static ufbxi_noinline void ufbxi_retain_ref(ufbxi_refcount *refcount) +{ + ufbx_assert(refcount->self_magic == UFBXI_REFCOUNT_IMP_MAGIC); + size_t count = ufbxi_atomic_counter_inc(&refcount->refcount); + ufbxi_ignore(count); + ufbx_assert(count < SIZE_MAX / 2); +} + +static ufbxi_noinline void ufbxi_release_ref(ufbxi_refcount *refcount) +{ + while (refcount) { + ufbx_assert(refcount->self_magic == UFBXI_REFCOUNT_IMP_MAGIC); + if (ufbxi_atomic_counter_dec(&refcount->refcount) > 0) return; + + ufbxi_refcount *parent = refcount->parent; + uint32_t type_magic = refcount->type_magic; + + refcount->self_magic = 0; + refcount->type_magic = 0; + + switch (type_magic) { + case UFBXI_SCENE_IMP_MAGIC: ufbxi_free_scene_imp((ufbxi_scene_imp*)refcount); break; + case UFBXI_MESH_IMP_MAGIC: ufbxi_free_mesh_imp((ufbxi_mesh_imp*)refcount); break; + case UFBXI_LINE_CURVE_IMP_MAGIC: ufbxi_free_line_curve_imp((ufbxi_line_curve_imp*)refcount); break; + case UFBXI_CACHE_IMP_MAGIC: ufbxi_free_geometry_cache_imp((ufbxi_geometry_cache_imp*)refcount); break; + default: ufbx_assert(0 && "Bad refcount type_magic"); break; + } + + refcount = parent; + } +} + +// -- API + +#ifdef __cplusplus +extern "C" { +#endif + +const ufbx_string ufbx_empty_string = { ufbxi_empty_char, 0 }; +const ufbx_blob ufbx_empty_blob = { NULL, 0 }; +const ufbx_matrix ufbx_identity_matrix = { 1,0,0, 0,1,0, 0,0,1, 0,0,0 }; +const ufbx_transform ufbx_identity_transform = { {0,0,0}, {0,0,0,1}, {1,1,1} }; +const ufbx_vec2 ufbx_zero_vec2 = { 0,0 }; +const ufbx_vec3 ufbx_zero_vec3 = { 0,0,0 }; +const ufbx_vec4 ufbx_zero_vec4 = { 0,0,0,0 }; +const ufbx_quat ufbx_identity_quat = { 0,0,0,1 }; + +const ufbx_coordinate_axes ufbx_axes_right_handed_y_up = { + UFBX_COORDINATE_AXIS_POSITIVE_X, UFBX_COORDINATE_AXIS_POSITIVE_Y, UFBX_COORDINATE_AXIS_POSITIVE_Z, +}; +const ufbx_coordinate_axes ufbx_axes_right_handed_z_up = { + UFBX_COORDINATE_AXIS_POSITIVE_X, UFBX_COORDINATE_AXIS_POSITIVE_Z, UFBX_COORDINATE_AXIS_NEGATIVE_Y, +}; +const ufbx_coordinate_axes ufbx_axes_left_handed_y_up = { + UFBX_COORDINATE_AXIS_POSITIVE_X, UFBX_COORDINATE_AXIS_POSITIVE_Y, UFBX_COORDINATE_AXIS_NEGATIVE_Z, +}; +const ufbx_coordinate_axes ufbx_axes_left_handed_z_up = { + UFBX_COORDINATE_AXIS_POSITIVE_X, UFBX_COORDINATE_AXIS_POSITIVE_Z, UFBX_COORDINATE_AXIS_POSITIVE_Y, +}; + + +const size_t ufbx_element_type_size[UFBX_ELEMENT_TYPE_COUNT] = { + sizeof(ufbx_unknown), + sizeof(ufbx_node), + sizeof(ufbx_mesh), + sizeof(ufbx_light), + sizeof(ufbx_camera), + sizeof(ufbx_bone), + sizeof(ufbx_empty), + sizeof(ufbx_line_curve), + sizeof(ufbx_nurbs_curve), + sizeof(ufbx_nurbs_surface), + sizeof(ufbx_nurbs_trim_surface), + sizeof(ufbx_nurbs_trim_boundary), + sizeof(ufbx_procedural_geometry), + sizeof(ufbx_stereo_camera), + sizeof(ufbx_camera_switcher), + sizeof(ufbx_marker), + sizeof(ufbx_lod_group), + sizeof(ufbx_skin_deformer), + sizeof(ufbx_skin_cluster), + sizeof(ufbx_blend_deformer), + sizeof(ufbx_blend_channel), + sizeof(ufbx_blend_shape), + sizeof(ufbx_cache_deformer), + sizeof(ufbx_cache_file), + sizeof(ufbx_material), + sizeof(ufbx_texture), + sizeof(ufbx_video), + sizeof(ufbx_shader), + sizeof(ufbx_shader_binding), + sizeof(ufbx_anim_stack), + sizeof(ufbx_anim_layer), + sizeof(ufbx_anim_value), + sizeof(ufbx_anim_curve), + sizeof(ufbx_display_layer), + sizeof(ufbx_selection_set), + sizeof(ufbx_selection_node), + sizeof(ufbx_character), + sizeof(ufbx_constraint), + sizeof(ufbx_pose), + sizeof(ufbx_metadata_object), +}; + +ufbx_abi bool ufbx_open_file(ufbx_stream *stream, const char *path, size_t path_len) +{ + ufbxi_allocator tmp_ator = { 0 }; + ufbx_error tmp_error = { UFBX_ERROR_NONE }; + ufbxi_init_ator(&tmp_error, &tmp_ator, NULL, "filename"); + FILE *f = ufbxi_fopen(path, path_len, &tmp_ator); + if (!f) return false; + + stream->read_fn = &ufbxi_file_read; + stream->skip_fn = &ufbxi_file_skip; + stream->close_fn = &ufbxi_file_close; + stream->user = f; + return true; +} + +ufbx_abi bool ufbx_default_open_file(void *user, ufbx_stream *stream, const char *path, size_t path_len, const ufbx_open_file_info *info) +{ + (void)user; + (void)info; + return ufbx_open_file(stream, path, path_len); +} + +ufbx_abi bool ufbx_open_memory(ufbx_stream *stream, const void *data, size_t data_size, const ufbx_open_memory_opts *opts, ufbx_error *error) +{ + ufbx_open_memory_opts local_opts; + if (!opts) { + memset(&local_opts, 0, sizeof(local_opts)); + opts = &local_opts; + } + ufbx_assert(opts->_begin_zero == 0 && opts->_end_zero == 0); + + ufbx_error local_error = { UFBX_ERROR_NONE }; + if (!error) error = &local_error; + ufbxi_clear_error(error); + + ufbxi_allocator ator = { 0 }; + ufbxi_init_ator(error, &ator, &opts->allocator, "memory"); + + size_t copy_size = opts->no_copy ? 0 : data_size; + + // Align the allocation size to 8 bytes to make sure the header is aligned. + size_t self_size = ufbxi_align_to_mask(sizeof(ufbxi_memory_stream) + copy_size, 7); + + void *memory = ufbxi_alloc(&ator, char, self_size); + if (!memory) { + ufbxi_free_ator(&ator); + ufbxi_fix_error_type(error, "Failed to open memory"); + return false; + } + + ufbxi_memory_stream *mem = (ufbxi_memory_stream*)memory; + memset(mem, 0, sizeof(ufbxi_memory_stream)); + + mem->size = data_size; + mem->self_size = self_size; + mem->close_cb = opts->close_cb; + + if (opts->no_copy) { + mem->data = data; + } else { + memcpy(mem->data_copy, data, data_size); + mem->data = mem->data_copy; + } + + // Transplant the allocator in the result blob + mem->ator = ator; + mem->ator.error = &mem->error; + + stream->read_fn = ufbxi_memory_read; + stream->skip_fn = ufbxi_memory_skip; + stream->close_fn = ufbxi_memory_close; + stream->user = mem; + + return true; +} + +ufbx_abi bool ufbx_is_thread_safe(void) +{ + return UFBXI_THREAD_SAFE != 0; +} + +ufbx_abi ufbx_scene *ufbx_load_memory(const void *data, size_t size, const ufbx_load_opts *opts, ufbx_error *error) +{ + ufbxi_context uc = { UFBX_ERROR_NONE }; + uc.data_begin = uc.data = (const char *)data; + uc.data_size = size; + uc.progress_bytes_total = size; + return ufbxi_load(&uc, opts, error); +} + +ufbx_abi ufbx_scene *ufbx_load_file(const char *filename, const ufbx_load_opts *opts, ufbx_error *error) +{ + return ufbx_load_file_len(filename, SIZE_MAX, opts, error); +} + +ufbx_abi ufbx_scene *ufbx_load_file_len(const char *filename, size_t filename_len, const ufbx_load_opts *opts, ufbx_error *error) +{ + ufbx_load_opts opts_copy; + if (opts) { + opts_copy = *opts; + } else { + memset(&opts_copy, 0, sizeof(opts_copy)); + opts = &opts_copy; + } + if (opts_copy.filename.length == 0 || opts_copy.filename.data == NULL) { + opts_copy.filename.data = filename; + opts_copy.filename.length = filename_len; + } + + // Defer to `ufbx_load_stream()` if the user so prefers. + if (!opts->open_main_file_with_default && opts->open_file_cb.fn) { + ufbx_stream stream = { 0 }; + if (ufbxi_open_file(&opts->open_file_cb, &stream, filename, filename_len, NULL, NULL, UFBX_OPEN_FILE_MAIN_MODEL)) { + return ufbx_load_stream_prefix(&stream, NULL, 0, &opts_copy, error); + } else { + // TODO: Factor this? + ufbxi_set_err_info(error, filename, filename_len); + error->stack_size = 1; + error->type = UFBX_ERROR_FILE_NOT_FOUND; + error->description.data = "File not found"; + error->description.length = strlen(error->description.data); + error->stack[0].description.data = "File not found"; + error->stack[0].description.length = strlen(error->stack[0].description.data); + error->stack[0].function.data = ufbxi_function; + error->stack[0].function.length = strlen(ufbxi_function); + error->stack[0].source_line = ufbxi_line; + return NULL; + } + } + + ufbxi_allocator tmp_ator = { 0 }; + ufbx_error tmp_error = { UFBX_ERROR_NONE }; + ufbxi_init_ator(&tmp_error, &tmp_ator, opts ? &opts->temp_allocator : NULL, "filename"); + + FILE *file = ufbxi_fopen(filename, filename_len, &tmp_ator); + if (!file) { + if (error) { + ufbxi_set_err_info(error, filename, filename_len); + error->stack_size = 1; + error->type = UFBX_ERROR_FILE_NOT_FOUND; + error->description.data = "File not found"; + error->description.length = strlen(error->description.data); + error->stack[0].description.data = "File not found"; + error->stack[0].description.length = strlen(error->stack[0].description.data); + error->stack[0].function.data = ufbxi_function; + error->stack[0].function.length = strlen(ufbxi_function); + error->stack[0].source_line = ufbxi_line; + } + return NULL; + } + + ufbx_scene *scene = ufbx_load_stdio(file, &opts_copy, error); + + fclose(file); + + return scene; +} + +ufbx_abi ufbx_scene *ufbx_load_stdio(void *file_void, const ufbx_load_opts *opts, ufbx_error *error) +{ + return ufbx_load_stdio_prefix(file_void, NULL, 0, opts, error); +} + +ufbx_abi ufbx_scene *ufbx_load_stdio_prefix(void *file_void, const void *prefix, size_t prefix_size, const ufbx_load_opts *opts, ufbx_error *error) +{ + FILE *file = (FILE*)file_void; + + ufbxi_context uc = { UFBX_ERROR_NONE }; + uc.data_begin = uc.data = (const char *)prefix; + uc.data_size = prefix_size; + uc.read_fn = &ufbxi_file_read; + uc.skip_fn = &ufbxi_file_skip; + uc.read_user = file; + + if (opts && opts->progress_cb.fn && opts->file_size_estimate == 0) { + uint64_t begin = ufbxi_ftell(file); + if (begin < UINT64_MAX) { + fpos_t pos; + if (fgetpos(file, &pos) == 0) { + if (fseek(file, 0, SEEK_END) == 0) { + uint64_t end = ufbxi_ftell(file); + if (end != UINT64_MAX && begin < end) { + uc.progress_bytes_total = end - begin; + } + + // Both `rewind()` and `fsetpos()` to reset error and EOF + rewind(file); + fsetpos(file, &pos); + } + } + } + } + + ufbx_scene *scene = ufbxi_load(&uc, opts, error); + return scene; +} + +ufbx_abi ufbx_scene *ufbx_load_stream(const ufbx_stream *stream, const ufbx_load_opts *opts, ufbx_error *error) +{ + return ufbx_load_stream_prefix(stream, NULL, 0, opts, error); +} + +ufbx_abi ufbx_scene *ufbx_load_stream_prefix(const ufbx_stream *stream, const void *prefix, size_t prefix_size, const ufbx_load_opts *opts, ufbx_error *error) +{ + ufbxi_context uc = { UFBX_ERROR_NONE }; + uc.data_begin = uc.data = (const char *)prefix; + uc.data_size = prefix_size; + uc.read_fn = stream->read_fn; + uc.skip_fn = stream->skip_fn; + uc.close_fn = stream->close_fn; + uc.read_user = stream->user; + ufbx_scene *scene = ufbxi_load(&uc, opts, error); + return scene; +} + +ufbx_abi void ufbx_free_scene(ufbx_scene *scene) +{ + if (!scene) return; + + ufbxi_scene_imp *imp = ufbxi_get_imp(ufbxi_scene_imp, scene); + ufbx_assert(imp->magic == UFBXI_SCENE_IMP_MAGIC); + if (imp->magic != UFBXI_SCENE_IMP_MAGIC) return; + ufbxi_release_ref(&imp->refcount); +} + +ufbx_abi void ufbx_retain_scene(ufbx_scene *scene) +{ + if (!scene) return; + + ufbxi_scene_imp *imp = ufbxi_get_imp(ufbxi_scene_imp, scene); + ufbx_assert(imp->magic == UFBXI_SCENE_IMP_MAGIC); + if (imp->magic != UFBXI_SCENE_IMP_MAGIC) return; + ufbxi_retain_ref(&imp->refcount); +} + +ufbx_abi ufbxi_noinline size_t ufbx_format_error(char *dst, size_t dst_size, const ufbx_error *error) +{ + if (!dst || !dst_size) return 0; + if (!error) { + *dst = '\0'; + return 0; + } + + size_t offset = 0; + + { + int num; + if (error->info_length > 0 && error->info_length < UFBX_ERROR_INFO_LENGTH) { + num = ufbxi_snprintf(dst + offset, dst_size - offset, "ufbx v%u.%u.%u error: %s (%.*s)\n", + UFBX_SOURCE_VERSION/1000000, UFBX_SOURCE_VERSION/1000%1000, UFBX_SOURCE_VERSION%1000, + error->description.data ? error->description.data : "Unknown error", + (int)error->info_length, error->info); + } else { + num = ufbxi_snprintf(dst + offset, dst_size - offset, "ufbx v%u.%u.%u error: %s\n", + UFBX_SOURCE_VERSION/1000000, UFBX_SOURCE_VERSION/1000%1000, UFBX_SOURCE_VERSION%1000, + error->description.data ? error->description.data : "Unknown error"); + } + + if (num > 0) offset = ufbxi_min_sz(offset + (size_t)num, dst_size - 1); + } + + size_t stack_size = ufbxi_min_sz(error->stack_size, UFBX_ERROR_STACK_MAX_DEPTH); + for (size_t i = 0; i < stack_size; i++) { + const ufbx_error_frame *frame = &error->stack[i]; + int num = ufbxi_snprintf(dst + offset, dst_size - offset, "%6u:%s: %s\n", frame->source_line, frame->function.data, frame->description.data); + if (num > 0) offset = ufbxi_min_sz(offset + (size_t)num, dst_size - 1); + } + + return offset; +} + +ufbx_abi ufbx_prop *ufbx_find_prop_len(const ufbx_props *props, const char *name, size_t name_len) +{ + uint32_t key = ufbxi_get_name_key(name, name_len); + ufbx_string name_str = ufbxi_safe_string(name, name_len); + + while (props) { + size_t index = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_prop, 4, &index, props->props.data, 0, props->props.count, + ( ufbxi_cmp_prop_less_ref(a, name_str, key) ), ( a->_internal_key == key && ufbxi_str_equal(a->name, name_str) )); + if (index != SIZE_MAX) return &props->props.data[index]; + + props = props->defaults; + } + + return NULL; +} + +ufbx_abi ufbx_real ufbx_find_real_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_real def) +{ + ufbx_prop *prop = ufbx_find_prop_len(props, name, name_len); + if (prop) { + return prop->value_real; + } else { + return def; + } +} + +ufbx_abi ufbxi_noinline ufbx_vec3 ufbx_find_vec3_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_vec3 def) +{ + ufbx_prop *prop = ufbx_find_prop_len(props, name, name_len); + if (prop) { + return prop->value_vec3; + } else { + return def; + } +} + +ufbx_abi ufbxi_noinline int64_t ufbx_find_int_len(const ufbx_props *props, const char *name, size_t name_len, int64_t def) +{ + ufbx_prop *prop = ufbx_find_prop_len(props, name, name_len); + if (prop) { + return prop->value_int; + } else { + return def; + } +} + +ufbx_abi bool ufbx_find_bool_len(const ufbx_props *props, const char *name, size_t name_len, bool def) +{ + ufbx_prop *prop = ufbx_find_prop_len(props, name, name_len); + if (prop) { + return prop->value_int != 0; + } else { + return def; + } +} + +ufbx_abi ufbxi_noinline ufbx_string ufbx_find_string_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_string def) +{ + ufbx_prop *prop = ufbx_find_prop_len(props, name, name_len); + if (prop) { + return prop->value_str; + } else { + return def; + } +} + +ufbx_abi ufbx_blob ufbx_find_blob_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_blob def) +{ + ufbx_prop *prop = ufbx_find_prop_len(props, name, name_len); + if (prop) { + return prop->value_blob; + } else { + return def; + } +} + +ufbx_abi ufbx_prop *ufbx_find_prop_concat(const ufbx_props *props, const ufbx_string *parts, size_t num_parts) +{ + uint32_t key = ufbxi_get_concat_key(parts, num_parts); + + while (props) { + size_t index = SIZE_MAX; + + ufbxi_macro_lower_bound_eq(ufbx_prop, 2, &index, props->props.data, 0, props->props.count, + ( ufbxi_cmp_prop_less_concat(a, parts, num_parts, key) ), + ( a->_internal_key == key && ufbxi_concat_str_cmp(&a->name, parts, num_parts) == 0 )); + if (index != SIZE_MAX) return &props->props.data[index]; + + props = props->defaults; + } + + return NULL; +} + +ufbx_abi ufbx_element *ufbx_find_element_len(const ufbx_scene *scene, ufbx_element_type type, const char *name, size_t name_len) +{ + if (!scene) return NULL; + ufbx_string name_str = ufbxi_safe_string(name, name_len); + uint32_t key = ufbxi_get_name_key(name, name_len); + + size_t index = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_name_element, 16, &index, scene->elements_by_name.data, 0, scene->elements_by_name.count, + ( ufbxi_cmp_name_element_less_ref(a, name_str, type, key) ), ( ufbxi_str_equal(a->name, name_str) && a->type == type )); + + return index < SIZE_MAX ? scene->elements_by_name.data[index].element : NULL; +} + +ufbx_abi ufbx_element *ufbx_get_prop_element(const ufbx_element *element, const ufbx_prop *prop, ufbx_element_type type) +{ + ufbx_assert(element && prop); + if (!element || !prop) return NULL; + return ufbxi_fetch_dst_element((ufbx_element*)element, false, prop->name.data, type); +} + +ufbx_abi ufbx_node *ufbx_find_node_len(const ufbx_scene *scene, const char *name, size_t name_len) +{ + return (ufbx_node*)ufbx_find_element_len(scene, UFBX_ELEMENT_NODE, name, name_len); +} + +ufbx_abi ufbx_anim_stack *ufbx_find_anim_stack_len(const ufbx_scene *scene, const char *name, size_t name_len) +{ + return (ufbx_anim_stack*)ufbx_find_element_len(scene, UFBX_ELEMENT_ANIM_STACK, name, name_len); +} + +ufbx_abi ufbx_material *ufbx_find_material_len(const ufbx_scene *scene, const char *name, size_t name_len) +{ + return (ufbx_material*)ufbx_find_element_len(scene, UFBX_ELEMENT_MATERIAL, name, name_len); +} + +ufbx_abi ufbx_anim_prop *ufbx_find_anim_prop_len(const ufbx_anim_layer *layer, const ufbx_element *element, const char *prop, size_t prop_len) +{ + ufbx_assert(layer); + ufbx_assert(element); + if (!layer || !element) return NULL; + + ufbx_string prop_str = ufbxi_safe_string(prop, prop_len); + + size_t index = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_anim_prop, 16, &index, layer->anim_props.data, 0, layer->anim_props.count, + ( a->element != element ? a->element < element : ufbxi_str_less(a->prop_name, prop_str) ), + ( a->element == element && ufbxi_str_equal(a->prop_name, prop_str) )); + + if (index == SIZE_MAX) return NULL; + return &layer->anim_props.data[index]; +} + +ufbx_abi ufbxi_noinline ufbx_anim_prop_list ufbx_find_anim_props(const ufbx_anim_layer *layer, const ufbx_element *element) +{ + ufbx_anim_prop_list result = { 0 }; + ufbx_assert(layer); + ufbx_assert(element); + if (!layer || !element) return result; + + size_t begin = layer->anim_props.count, end = begin; + ufbxi_macro_lower_bound_eq(ufbx_anim_prop, 16, &begin, layer->anim_props.data, 0, layer->anim_props.count, + ( a->element < element ), ( a->element == element )); + + ufbxi_macro_upper_bound_eq(ufbx_anim_prop, 16, &end, layer->anim_props.data, begin, layer->anim_props.count, + ( a->element == element )); + + if (begin != end) { + result.data = layer->anim_props.data + begin; + result.count = end - begin; + } + + return result; +} + +ufbx_abi ufbxi_noinline ufbx_matrix ufbx_get_compatible_matrix_for_normals(const ufbx_node *node) +{ + if (!node) return ufbx_identity_matrix; + + ufbx_transform geom_rot = ufbx_identity_transform; + geom_rot.rotation = node->geometry_transform.rotation; + ufbx_matrix geom_rot_mat = ufbx_transform_to_matrix(&geom_rot); + + ufbx_matrix norm_mat = ufbx_matrix_mul(&node->node_to_world, &geom_rot_mat); + norm_mat = ufbx_matrix_for_normals(&norm_mat); + return norm_mat; +} + +ufbx_abi ufbx_real ufbx_evaluate_curve(const ufbx_anim_curve *curve, double time, ufbx_real default_value) +{ + if (!curve) return default_value; + if (curve->keyframes.count <= 1) { + if (curve->keyframes.count == 1) { + return curve->keyframes.data[0].value; + } else { + return default_value; + } + } + + size_t begin = 0; + size_t end = curve->keyframes.count; + const ufbx_keyframe *keys = curve->keyframes.data; + while (end - begin >= 8) { + size_t mid = (begin + end) >> 1; + if (keys[mid].time <= time) { + begin = mid + 1; + } else { + end = mid; + } + } + + end = curve->keyframes.count; + for (; begin < end; begin++) { + const ufbx_keyframe *next = &keys[begin]; + if (next->time <= time) continue; + + // First keyframe + if (begin == 0) return next->value; + + const ufbx_keyframe *prev = next - 1; + + // Exact keyframe + if (prev->time == time) return prev->value; + + double rcp_delta = 1.0 / (next->time - prev->time); + double t = (time - prev->time) * rcp_delta; + + switch (prev->interpolation) { + + case UFBX_INTERPOLATION_CONSTANT_PREV: + return prev->value; + + case UFBX_INTERPOLATION_CONSTANT_NEXT: + return next->value; + + case UFBX_INTERPOLATION_LINEAR: + return (ufbx_real)(prev->value*(1.0 - t) + next->value*t); + + case UFBX_INTERPOLATION_CUBIC: + { + double x1 = prev->right.dx * rcp_delta; + double x2 = 1.0 - next->left.dx * rcp_delta; + t = ufbxi_find_cubic_bezier_t(x1, x2, t); + + double t2 = t*t, t3 = t2*t; + double u = 1.0 - t, u2 = u*u, u3 = u2*u; + + double y0 = prev->value; + double y3 = next->value; + double y1 = y0 + prev->right.dy; + double y2 = y3 - next->left.dy; + + return (ufbx_real)(u3*y0 + 3.0 * (u2*t*y1 + u*t2*y2) + t3*y3); + } + + default: + ufbx_assert(0 && "Bad interpolation mode"); + return 0.0f; + + } + } + + // Last keyframe + return curve->keyframes.data[curve->keyframes.count - 1].value; +} + +ufbx_abi ufbx_real ufbx_evaluate_anim_value_real(const ufbx_anim_value *anim_value, double time) +{ + if (!anim_value) { + return 0.0f; + } + + ufbx_real res = anim_value->default_value.x; + if (anim_value->curves[0]) res = ufbx_evaluate_curve(anim_value->curves[0], time, res); + return res; +} + +ufbx_abi ufbxi_noinline ufbx_vec2 ufbx_evaluate_anim_value_vec2(const ufbx_anim_value *anim_value, double time) +{ + if (!anim_value) { + ufbx_vec2 zero = { 0.0f }; + return zero; + } + + ufbx_vec2 res = { anim_value->default_value.x, anim_value->default_value.y }; + if (anim_value->curves[0]) res.x = ufbx_evaluate_curve(anim_value->curves[0], time, res.x); + if (anim_value->curves[1]) res.y = ufbx_evaluate_curve(anim_value->curves[1], time, res.y); + return res; +} + +ufbx_abi ufbxi_noinline ufbx_vec3 ufbx_evaluate_anim_value_vec3(const ufbx_anim_value *anim_value, double time) +{ + if (!anim_value) { + ufbx_vec3 zero = { 0.0f }; + return zero; + } + + ufbx_vec3 res = anim_value->default_value; + if (anim_value->curves[0]) res.x = ufbx_evaluate_curve(anim_value->curves[0], time, res.x); + if (anim_value->curves[1]) res.y = ufbx_evaluate_curve(anim_value->curves[1], time, res.y); + if (anim_value->curves[2]) res.z = ufbx_evaluate_curve(anim_value->curves[2], time, res.z); + return res; +} + +ufbx_abi ufbxi_noinline ufbx_prop ufbx_evaluate_prop_len(const ufbx_anim *anim, const ufbx_element *element, const char *name, size_t name_len, double time) +{ + ufbx_prop result; + + ufbx_prop *prop = ufbx_find_prop_len(&element->props, name, name_len); + if (prop) { + result = *prop; + } else { + memset(&result, 0, sizeof(result)); + result.name.data = name; + result.name.length = name_len; + result._internal_key = ufbxi_get_name_key(name, name_len); + result.flags = UFBX_PROP_FLAG_NOT_FOUND; + result.value_str.data = ufbxi_empty_char; + result.value_str.length = 0; + result.value_blob.data = NULL; + result.value_blob.size = 0; + } + + if (anim->prop_overrides.count > 0) { + ufbxi_find_prop_override(&anim->prop_overrides, element->element_id, &result); + return result; + } + + if ((result.flags & (UFBX_PROP_FLAG_ANIMATED|UFBX_PROP_FLAG_CONNECTED)) == 0) return result; + + if ((prop->flags & UFBX_PROP_FLAG_CONNECTED) != 0 && !anim->ignore_connections) { + ufbxi_evaluate_connected_prop(&result, anim, element, prop->name.data, time); + } + + ufbxi_evaluate_props(anim, element, time, &result, 1); + + return result; +} + +ufbx_abi ufbxi_noinline ufbx_props ufbx_evaluate_props(const ufbx_anim *anim, const ufbx_element *element, double time, ufbx_prop *buffer, size_t buffer_size) +{ + ufbx_props ret = { NULL }; + if (!element) return ret; + + const ufbx_prop_override *over = NULL, *over_end = NULL; + if (anim->prop_overrides.count > 0) { + ufbx_const_prop_override_list list = ufbxi_find_element_prop_overrides(&anim->prop_overrides, element->element_id); + over = list.data; + over_end = over + list.count; + } + + size_t num_anim = 0; + ufbxi_for_list(ufbx_prop, prop, element->props.props) { + bool found_override = false; + for (; over != over_end && num_anim < buffer_size; over++) { + ufbx_prop *dst = &buffer[num_anim]; + if (over->_internal_key < prop->_internal_key + || (over->_internal_key == prop->_internal_key && strcmp(over->prop_name, prop->name.data) < 0)) { + dst->name = ufbxi_str_c(over->prop_name); + dst->_internal_key = over->_internal_key; + dst->type = UFBX_PROP_UNKNOWN; + dst->flags = UFBX_PROP_FLAG_OVERRIDDEN; + } else if (over->_internal_key == prop->_internal_key && strcmp(over->prop_name, prop->name.data) == 0) { + *dst = *prop; + dst->flags = (ufbx_prop_flags)(dst->flags | UFBX_PROP_FLAG_OVERRIDDEN); + } else { + break; + } + dst->value_str = ufbxi_str_c(over->value_str); + dst->value_blob.data = dst->value_str.data; + dst->value_blob.size = dst->value_str.length; + dst->value_int = over->value_int; + dst->value_vec3 = over->value; + dst->value_real_arr[3] = 0.0f; + num_anim++; + found_override = true; + } + + if (!(prop->flags & (UFBX_PROP_FLAG_ANIMATED|UFBX_PROP_FLAG_CONNECTED))) continue; + if (num_anim >= buffer_size) break; + if (found_override) continue; + + ufbx_prop *dst = &buffer[num_anim++]; + *dst = *prop; + + if ((prop->flags & UFBX_PROP_FLAG_CONNECTED) != 0 && !anim->ignore_connections) { + ufbxi_evaluate_connected_prop(dst, anim, element, prop->name.data, time); + } + } + + for (; over != over_end && num_anim < buffer_size; over++) { + ufbx_prop *dst = &buffer[num_anim++]; + dst->name = ufbxi_str_c(over->prop_name); + dst->_internal_key = over->_internal_key; + dst->type = UFBX_PROP_UNKNOWN; + dst->flags = UFBX_PROP_FLAG_OVERRIDDEN; + dst->value_str = ufbxi_str_c(over->value_str); + dst->value_blob.data = dst->value_str.data; + dst->value_blob.size = dst->value_str.length; + dst->value_int = over->value_int; + dst->value_vec3 = over->value; + dst->value_real_arr[3] = 0.0f; + } + + ufbxi_evaluate_props(anim, element, time, buffer, num_anim); + + ret.props.data = buffer; + ret.props.count = ret.num_animated = num_anim; + ret.defaults = (ufbx_props*)&element->props; + return ret; +} + +ufbx_abi ufbxi_noinline ufbx_transform ufbx_evaluate_transform(const ufbx_anim *anim, const ufbx_node *node, double time) +{ + ufbx_assert(anim); + ufbx_assert(node); + if (!node) return ufbx_identity_transform; + if (!anim) return node->local_transform; + if (node->is_root) return node->local_transform; + + const char *prop_names[] = { + ufbxi_Lcl_Rotation, + ufbxi_Lcl_Scaling, + ufbxi_Lcl_Translation, + ufbxi_PostRotation, + ufbxi_PreRotation, + ufbxi_RotationOffset, + ufbxi_RotationOrder, + ufbxi_RotationPivot, + ufbxi_ScalingOffset, + ufbxi_ScalingPivot, + }; + + ufbx_prop buf[ufbxi_arraycount(prop_names)]; + ufbx_props props = ufbxi_evaluate_selected_props(anim, &node->element, time, buf, prop_names, ufbxi_arraycount(prop_names)); + ufbx_rotation_order order = (ufbx_rotation_order)ufbxi_find_enum(&props, ufbxi_RotationOrder, UFBX_ROTATION_ORDER_XYZ, UFBX_ROTATION_ORDER_SPHERIC); + return ufbxi_get_transform(&props, order, node); +} + +ufbx_abi ufbx_real ufbx_evaluate_blend_weight(const ufbx_anim *anim, const ufbx_blend_channel *channel, double time) +{ + const char *prop_names[] = { + ufbxi_DeformPercent, + }; + + ufbx_prop buf[ufbxi_arraycount(prop_names)]; + ufbx_props props = ufbxi_evaluate_selected_props(anim, &channel->element, time, buf, prop_names, ufbxi_arraycount(prop_names)); + return ufbxi_find_real(&props, ufbxi_DeformPercent, channel->weight * (ufbx_real)100.0) * (ufbx_real)0.01; +} + +ufbx_abi ufbx_const_prop_override_list ufbx_prepare_prop_overrides(ufbx_prop_override *overrides, size_t num_overrides) +{ + ufbxi_for(ufbx_prop_override, over, overrides, num_overrides) { + if (over->prop_name == NULL) { + over->prop_name = ufbxi_empty_char; + } + if (over->value_str == NULL) { + over->value_str = ufbxi_empty_char; + } + if (over->value_int == 0) { + over->value_int = ufbxi_f64_to_i64(over->value.x); + } else if (over->value.x == 0.0) { + over->value.x = (ufbx_real)over->value_int; + } + + size_t len = strlen(over->prop_name); + over->prop_name = ufbxi_find_canonical_string(over->prop_name, len); + over->_internal_key = ufbxi_get_name_key(over->prop_name, len); + } + + // TODO: Macro for non-stable sort + qsort(overrides, num_overrides, sizeof(ufbx_prop_override), &ufbxi_cmp_prop_override); + + ufbx_const_prop_override_list result; + result.data = overrides; + result.count = num_overrides; + return result; +} + +ufbx_abi ufbx_scene *ufbx_evaluate_scene(const ufbx_scene *scene, const ufbx_anim *anim, double time, const ufbx_evaluate_opts *opts, ufbx_error *error) +{ +#if UFBXI_FEATURE_SCENE_EVALUATION + ufbxi_eval_context ec = { 0 }; + return ufbxi_evaluate_scene(&ec, (ufbx_scene*)scene, anim, time, opts, error); +#else + if (error) { + memset(error, 0, sizeof(ufbx_error)); + ufbxi_fmt_err_info(error, "UFBX_ENABLE_SCENE_EVALUATION"); + ufbxi_report_err_msg(error, "UFBXI_FEATURE_SCENE_EVALUATION", "Feature disabled"); + } + return NULL; +#endif +} + +ufbx_abi ufbx_texture *ufbx_find_prop_texture_len(const ufbx_material *material, const char *name, size_t name_len) +{ + ufbx_string name_str = ufbxi_safe_string(name, name_len); + if (!material) return NULL; + + size_t index = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_material_texture, 4, &index, material->textures.data, 0, material->textures.count, + ( ufbxi_str_less(a->material_prop, name_str) ), ( ufbxi_str_equal(a->material_prop, name_str) )); + return index < SIZE_MAX ? material->textures.data[index].texture : NULL; +} + +ufbx_abi ufbx_string ufbx_find_shader_prop_len(const ufbx_shader *shader, const char *name, size_t name_len) +{ + ufbx_string name_str = ufbxi_safe_string(name, name_len); + ufbx_shader_prop_binding_list bindings = ufbx_find_shader_prop_bindings_len(shader, name, name_len); + if (bindings.count > 0) { + return bindings.data[0].shader_prop; + } + return name_str; +} + +ufbx_abi ufbx_shader_prop_binding_list ufbx_find_shader_prop_bindings_len(const ufbx_shader *shader, const char *name, size_t name_len) +{ + ufbx_shader_prop_binding_list bindings = { NULL, 0 }; + + ufbx_string name_str = ufbxi_safe_string(name, name_len); + if (!shader) return bindings; + + ufbxi_for_ptr_list(ufbx_shader_binding, p_bind, shader->bindings) { + ufbx_shader_binding *bind = *p_bind; + + size_t begin = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_shader_prop_binding, 4, &begin, bind->prop_bindings.data, 0, bind->prop_bindings.count, + ( ufbxi_str_less(a->shader_prop, name_str) ), ( ufbxi_str_equal(a->shader_prop, name_str) )); + + if (begin != SIZE_MAX) { + + size_t end = begin; + ufbxi_macro_upper_bound_eq(ufbx_shader_prop_binding, 4, &end, bind->prop_bindings.data, begin, bind->prop_bindings.count, + ( ufbxi_str_equal(a->shader_prop, name_str) )); + + bindings.data = bind->prop_bindings.data + begin; + bindings.count = end - begin; + break; + } + } + + return bindings; +} + +ufbx_abi ufbx_shader_texture_input *ufbx_find_shader_texture_input_len(const ufbx_shader_texture *shader, const char *name, size_t name_len) +{ + ufbx_string name_str = ufbxi_safe_string(name, name_len); + + size_t index = SIZE_MAX; + ufbxi_macro_lower_bound_eq(ufbx_shader_texture_input, 4, &index, shader->inputs.data, 0, shader->inputs.count, + ( ufbxi_str_less(a->name, name_str) ), ( ufbxi_str_equal(a->name, name_str) )); + + if (index != SIZE_MAX) { + return &shader->inputs.data[index]; + } + + return NULL; +} + +ufbx_abi bool ufbx_coordinate_axes_valid(ufbx_coordinate_axes axes) +{ + if (axes.right < UFBX_COORDINATE_AXIS_POSITIVE_X || axes.right > UFBX_COORDINATE_AXIS_NEGATIVE_Z) return false; + if (axes.up < UFBX_COORDINATE_AXIS_POSITIVE_X || axes.up > UFBX_COORDINATE_AXIS_NEGATIVE_Z) return false; + if (axes.front < UFBX_COORDINATE_AXIS_POSITIVE_X || axes.front > UFBX_COORDINATE_AXIS_NEGATIVE_Z) return false; + + // Check that all the positive/negative axes are used + uint32_t mask = 0; + mask |= 1u << ((uint32_t)axes.right >> 1); + mask |= 1u << ((uint32_t)axes.up >> 1); + mask |= 1u << ((uint32_t)axes.front >> 1); + return (mask & 0x7u) == 0x7u; +} + +ufbx_abi ufbx_quat ufbx_quat_mul(ufbx_quat a, ufbx_quat b) +{ + return ufbxi_mul_quat(a, b); +} + +ufbx_abi ufbxi_noinline ufbx_real ufbx_quat_dot(ufbx_quat a, ufbx_quat b) +{ + return a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; +} + +ufbx_abi ufbxi_noinline ufbx_quat ufbx_quat_normalize(ufbx_quat q) +{ + ufbx_real norm = ufbx_quat_dot(q, q); + if (norm == 0.0) return ufbx_identity_quat; + q.x /= norm; + q.y /= norm; + q.z /= norm; + q.w /= norm; + return q; +} + +ufbx_abi ufbxi_noinline ufbx_quat ufbx_quat_fix_antipodal(ufbx_quat q, ufbx_quat reference) +{ + if (ufbx_quat_dot(q, reference) < 0.0f) { + q.x = -q.x; q.y = -q.y; q.z = -q.z; q.w = -q.w; + } + return q; +} + +ufbx_abi ufbxi_noinline ufbx_quat ufbx_quat_slerp(ufbx_quat a, ufbx_quat b, ufbx_real t) +{ + double dot = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; + if (dot < 0.0) { + dot = -dot; + b.x = -b.x; b.y = -b.y; b.z = -b.z; b.w = -b.w; + } + double omega = ufbx_acos(ufbx_fmin(ufbx_fmax(dot, 0.0), 1.0)); + if (omega <= 1.175494351e-38f) return a; + double rcp_so = 1.0 / ufbx_sin(omega); + double af = ufbx_sin((1.0 - t) * omega) * rcp_so; + double bf = ufbx_sin(t * omega) * rcp_so; + + double x = af*a.x + bf*b.x; + double y = af*a.y + bf*b.y; + double z = af*a.z + bf*b.z; + double w = af*a.w + bf*b.w; + double rcp_len = 1.0 / ufbx_sqrt(x*x + y*y + z*z + w*w); + + ufbx_quat ret; + ret.x = (ufbx_real)(x * rcp_len); + ret.y = (ufbx_real)(y * rcp_len); + ret.z = (ufbx_real)(z * rcp_len); + ret.w = (ufbx_real)(w * rcp_len); + return ret; +} + +ufbx_abi ufbxi_noinline ufbx_vec3 ufbx_quat_rotate_vec3(ufbx_quat q, ufbx_vec3 v) +{ + ufbx_real xy = q.x*v.y - q.y*v.x; + ufbx_real xz = q.x*v.z - q.z*v.x; + ufbx_real yz = q.y*v.z - q.z*v.y; + ufbx_vec3 r; + r.x = 2.0f * (+ q.w*yz + q.y*xy + q.z*xz) + v.x; + r.y = 2.0f * (- q.x*xy - q.w*xz + q.z*yz) + v.y; + r.z = 2.0f * (- q.x*xz - q.y*yz + q.w*xy) + v.z; + return r; +} + +ufbx_abi ufbxi_noinline ufbx_quat ufbx_euler_to_quat(ufbx_vec3 v, ufbx_rotation_order order) +{ + v.x *= UFBXI_DEG_TO_RAD * 0.5; + v.y *= UFBXI_DEG_TO_RAD * 0.5; + v.z *= UFBXI_DEG_TO_RAD * 0.5; + double cx = ufbx_cos((double)v.x), sx = ufbx_sin((double)v.x); + double cy = ufbx_cos((double)v.y), sy = ufbx_sin((double)v.y); + double cz = ufbx_cos((double)v.z), sz = ufbx_sin((double)v.z); + ufbx_quat q; + + // Generated by `misc/gen_rotation_order.py` + switch (order) { + case UFBX_ROTATION_ORDER_XYZ: + q.x = (ufbx_real)(-cx*sy*sz + cy*cz*sx); + q.y = (ufbx_real)(cx*cz*sy + cy*sx*sz); + q.z = (ufbx_real)(cx*cy*sz - cz*sx*sy); + q.w = (ufbx_real)(cx*cy*cz + sx*sy*sz); + break; + case UFBX_ROTATION_ORDER_XZY: + q.x = (ufbx_real)(cx*sy*sz + cy*cz*sx); + q.y = (ufbx_real)(cx*cz*sy + cy*sx*sz); + q.z = (ufbx_real)(cx*cy*sz - cz*sx*sy); + q.w = (ufbx_real)(cx*cy*cz - sx*sy*sz); + break; + case UFBX_ROTATION_ORDER_YZX: + q.x = (ufbx_real)(-cx*sy*sz + cy*cz*sx); + q.y = (ufbx_real)(cx*cz*sy - cy*sx*sz); + q.z = (ufbx_real)(cx*cy*sz + cz*sx*sy); + q.w = (ufbx_real)(cx*cy*cz + sx*sy*sz); + break; + case UFBX_ROTATION_ORDER_YXZ: + q.x = (ufbx_real)(-cx*sy*sz + cy*cz*sx); + q.y = (ufbx_real)(cx*cz*sy + cy*sx*sz); + q.z = (ufbx_real)(cx*cy*sz + cz*sx*sy); + q.w = (ufbx_real)(cx*cy*cz - sx*sy*sz); + break; + case UFBX_ROTATION_ORDER_ZXY: + q.x = (ufbx_real)(cx*sy*sz + cy*cz*sx); + q.y = (ufbx_real)(cx*cz*sy - cy*sx*sz); + q.z = (ufbx_real)(cx*cy*sz - cz*sx*sy); + q.w = (ufbx_real)(cx*cy*cz + sx*sy*sz); + break; + case UFBX_ROTATION_ORDER_ZYX: + q.x = (ufbx_real)(cx*sy*sz + cy*cz*sx); + q.y = (ufbx_real)(cx*cz*sy - cy*sx*sz); + q.z = (ufbx_real)(cx*cy*sz + cz*sx*sy); + q.w = (ufbx_real)(cx*cy*cz - sx*sy*sz); + break; + default: + q.x = q.y = q.z = 0.0f; q.w = 1.0f; + break; + } + + return q; +} + +ufbx_abi ufbxi_noinline ufbx_vec3 ufbx_quat_to_euler(ufbx_quat q, ufbx_rotation_order order) +{ + const double eps = 0.999999999; + + ufbx_vec3 v; + double t; + + double qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // Generated by `misc/gen_quat_to_euler.py` + switch (order) { + case UFBX_ROTATION_ORDER_XYZ: + t = 2.0f*(qw*qy - qx*qz); + if (ufbx_fabs(t) < eps) { + v.y = (ufbx_real)ufbx_asin(t); + v.z = (ufbx_real)ufbx_atan2(2.0f*(qw*qz + qx*qy), 2.0f*(qw*qw + qx*qx) - 1.0f); + v.x = (ufbx_real)-ufbx_atan2(-2.0f*(qw*qx + qy*qz), 2.0f*(qw*qw + qz*qz) - 1.0f); + } else { + v.y = (ufbx_real)ufbx_copysign(UFBXI_DPI*0.5, t); + v.z = (ufbx_real)(ufbx_atan2(-2.0f*t*(qw*qx - qy*qz), t*(2.0f*qw*qy + 2.0f*qx*qz))); + v.x = 0.0f; + } + break; + case UFBX_ROTATION_ORDER_XZY: + t = 2.0f*(qw*qz + qx*qy); + if (ufbx_fabs(t) < eps) { + v.z = (ufbx_real)ufbx_asin(t); + v.y = (ufbx_real)ufbx_atan2(2.0f*(qw*qy - qx*qz), 2.0f*(qw*qw + qx*qx) - 1.0f); + v.x = (ufbx_real)-ufbx_atan2(-2.0f*(qw*qx - qy*qz), 2.0f*(qw*qw + qy*qy) - 1.0f); + } else { + v.z = (ufbx_real)ufbx_copysign(UFBXI_DPI*0.5, t); + v.y = (ufbx_real)(ufbx_atan2(2.0f*t*(qw*qx + qy*qz), -t*(2.0f*qx*qy - 2.0f*qw*qz))); + v.x = 0.0f; + } + break; + case UFBX_ROTATION_ORDER_YZX: + t = 2.0f*(qw*qz - qx*qy); + if (ufbx_fabs(t) < eps) { + v.z = (ufbx_real)ufbx_asin(t); + v.x = (ufbx_real)ufbx_atan2(2.0f*(qw*qx + qy*qz), 2.0f*(qw*qw + qy*qy) - 1.0f); + v.y = (ufbx_real)-ufbx_atan2(-2.0f*(qw*qy + qx*qz), 2.0f*(qw*qw + qx*qx) - 1.0f); + } else { + v.z = (ufbx_real)ufbx_copysign(UFBXI_DPI*0.5, t); + v.x = (ufbx_real)(ufbx_atan2(-2.0f*t*(qw*qy - qx*qz), t*(2.0f*qw*qz + 2.0f*qx*qy))); + v.y = 0.0f; + } + break; + case UFBX_ROTATION_ORDER_YXZ: + t = 2.0f*(qw*qx + qy*qz); + if (ufbx_fabs(t) < eps) { + v.x = (ufbx_real)ufbx_asin(t); + v.z = (ufbx_real)ufbx_atan2(2.0f*(qw*qz - qx*qy), 2.0f*(qw*qw + qy*qy) - 1.0f); + v.y = (ufbx_real)-ufbx_atan2(-2.0f*(qw*qy - qx*qz), 2.0f*(qw*qw + qz*qz) - 1.0f); + } else { + v.x = (ufbx_real)ufbx_copysign(UFBXI_DPI*0.5, t); + v.z = (ufbx_real)(ufbx_atan2(2.0f*t*(qw*qy + qx*qz), -t*(2.0f*qy*qz - 2.0f*qw*qx))); + v.y = 0.0f; + } + break; + case UFBX_ROTATION_ORDER_ZXY: + t = 2.0f*(qw*qx - qy*qz); + if (ufbx_fabs(t) < eps) { + v.x = (ufbx_real)ufbx_asin(t); + v.y = (ufbx_real)ufbx_atan2(2.0f*(qw*qy + qx*qz), 2.0f*(qw*qw + qz*qz) - 1.0f); + v.z = (ufbx_real)-ufbx_atan2(-2.0f*(qw*qz + qx*qy), 2.0f*(qw*qw + qy*qy) - 1.0f); + } else { + v.x = (ufbx_real)ufbx_copysign(UFBXI_DPI*0.5, t); + v.y = (ufbx_real)(ufbx_atan2(-2.0f*t*(qw*qz - qx*qy), t*(2.0f*qw*qx + 2.0f*qy*qz))); + v.z = 0.0f; + } + break; + case UFBX_ROTATION_ORDER_ZYX: + t = 2.0f*(qw*qy + qx*qz); + if (ufbx_fabs(t) < eps) { + v.y = (ufbx_real)ufbx_asin(t); + v.x = (ufbx_real)ufbx_atan2(2.0f*(qw*qx - qy*qz), 2.0f*(qw*qw + qz*qz) - 1.0f); + v.z = (ufbx_real)-ufbx_atan2(-2.0f*(qw*qz - qx*qy), 2.0f*(qw*qw + qx*qx) - 1.0f); + } else { + v.y = (ufbx_real)ufbx_copysign(UFBXI_DPI*0.5, t); + v.x = (ufbx_real)(ufbx_atan2(2.0f*t*(qw*qz + qx*qy), -t*(2.0f*qx*qz - 2.0f*qw*qy))); + v.z = 0.0f; + } + break; + default: + v.x = v.y = v.z = 0.0; + break; + } + + v.x *= UFBXI_RAD_TO_DEG; + v.y *= UFBXI_RAD_TO_DEG; + v.z *= UFBXI_RAD_TO_DEG; + return v; +} + +ufbx_abi ufbxi_noinline ufbx_matrix ufbx_matrix_mul(const ufbx_matrix *a, const ufbx_matrix *b) +{ + ufbx_assert(a && b); + if (!a || !b) return ufbx_identity_matrix; + + ufbx_matrix dst; + + dst.m03 = a->m00*b->m03 + a->m01*b->m13 + a->m02*b->m23 + a->m03; + dst.m13 = a->m10*b->m03 + a->m11*b->m13 + a->m12*b->m23 + a->m13; + dst.m23 = a->m20*b->m03 + a->m21*b->m13 + a->m22*b->m23 + a->m23; + + dst.m00 = a->m00*b->m00 + a->m01*b->m10 + a->m02*b->m20; + dst.m10 = a->m10*b->m00 + a->m11*b->m10 + a->m12*b->m20; + dst.m20 = a->m20*b->m00 + a->m21*b->m10 + a->m22*b->m20; + + dst.m01 = a->m00*b->m01 + a->m01*b->m11 + a->m02*b->m21; + dst.m11 = a->m10*b->m01 + a->m11*b->m11 + a->m12*b->m21; + dst.m21 = a->m20*b->m01 + a->m21*b->m11 + a->m22*b->m21; + + dst.m02 = a->m00*b->m02 + a->m01*b->m12 + a->m02*b->m22; + dst.m12 = a->m10*b->m02 + a->m11*b->m12 + a->m12*b->m22; + dst.m22 = a->m20*b->m02 + a->m21*b->m12 + a->m22*b->m22; + + return dst; +} + +ufbx_abi ufbx_real ufbx_matrix_determinant(const ufbx_matrix *m) +{ + return + - m->m02*m->m11*m->m20 + m->m01*m->m12*m->m20 + m->m02*m->m10*m->m21 + - m->m00*m->m12*m->m21 - m->m01*m->m10*m->m22 + m->m00*m->m11*m->m22; +} + +ufbx_abi ufbx_matrix ufbx_matrix_invert(const ufbx_matrix *m) +{ + ufbx_real det = ufbx_matrix_determinant(m); + + ufbx_matrix r; + if (ufbx_fabs(det) <= UFBX_EPSILON) { + memset(&r, 0, sizeof(r)); + return r; + } + + ufbx_real rcp_det = 1.0f / det; + + r.m00 = ( - m->m12*m->m21 + m->m11*m->m22) * rcp_det; + r.m10 = ( + m->m12*m->m20 - m->m10*m->m22) * rcp_det; + r.m20 = ( - m->m11*m->m20 + m->m10*m->m21) * rcp_det; + r.m01 = ( + m->m02*m->m21 - m->m01*m->m22) * rcp_det; + r.m11 = ( - m->m02*m->m20 + m->m00*m->m22) * rcp_det; + r.m21 = ( + m->m01*m->m20 - m->m00*m->m21) * rcp_det; + r.m02 = ( - m->m02*m->m11 + m->m01*m->m12) * rcp_det; + r.m12 = ( + m->m02*m->m10 - m->m00*m->m12) * rcp_det; + r.m22 = ( - m->m01*m->m10 + m->m00*m->m11) * rcp_det; + r.m03 = (m->m03*m->m12*m->m21 - m->m02*m->m13*m->m21 - m->m03*m->m11*m->m22 + m->m01*m->m13*m->m22 + m->m02*m->m11*m->m23 - m->m01*m->m12*m->m23) * rcp_det; + r.m13 = (m->m02*m->m13*m->m20 - m->m03*m->m12*m->m20 + m->m03*m->m10*m->m22 - m->m00*m->m13*m->m22 - m->m02*m->m10*m->m23 + m->m00*m->m12*m->m23) * rcp_det; + r.m23 = (m->m03*m->m11*m->m20 - m->m01*m->m13*m->m20 - m->m03*m->m10*m->m21 + m->m00*m->m13*m->m21 + m->m01*m->m10*m->m23 - m->m00*m->m11*m->m23) * rcp_det; + + return r; +} + +ufbx_abi ufbxi_noinline ufbx_matrix ufbx_matrix_for_normals(const ufbx_matrix *m) +{ + ufbx_real det = ufbx_matrix_determinant(m); + + ufbx_matrix r; + if (ufbx_fabs(det) <= UFBX_EPSILON) { + memset(&r, 0, sizeof(r)); + return r; + } + + ufbx_real rcp_det = 1.0f / det; + + r.m00 = ( - m->m12*m->m21 + m->m11*m->m22) * rcp_det; + r.m01 = ( + m->m12*m->m20 - m->m10*m->m22) * rcp_det; + r.m02 = ( - m->m11*m->m20 + m->m10*m->m21) * rcp_det; + r.m10 = ( + m->m02*m->m21 - m->m01*m->m22) * rcp_det; + r.m11 = ( - m->m02*m->m20 + m->m00*m->m22) * rcp_det; + r.m12 = ( + m->m01*m->m20 - m->m00*m->m21) * rcp_det; + r.m20 = ( - m->m02*m->m11 + m->m01*m->m12) * rcp_det; + r.m21 = ( + m->m02*m->m10 - m->m00*m->m12) * rcp_det; + r.m22 = ( - m->m01*m->m10 + m->m00*m->m11) * rcp_det; + r.m03 = r.m13 = r.m23 = 0.0f; + + return r; +} + +ufbx_abi ufbxi_noinline ufbx_vec3 ufbx_transform_position(const ufbx_matrix *m, ufbx_vec3 v) +{ + ufbx_assert(m); + if (!m) return ufbx_zero_vec3; + + ufbx_vec3 r; + r.x = m->m00*v.x + m->m01*v.y + m->m02*v.z + m->m03; + r.y = m->m10*v.x + m->m11*v.y + m->m12*v.z + m->m13; + r.z = m->m20*v.x + m->m21*v.y + m->m22*v.z + m->m23; + return r; +} + +ufbx_abi ufbxi_noinline ufbx_vec3 ufbx_transform_direction(const ufbx_matrix *m, ufbx_vec3 v) +{ + ufbx_assert(m); + if (!m) return ufbx_zero_vec3; + + ufbx_vec3 r; + r.x = m->m00*v.x + m->m01*v.y + m->m02*v.z; + r.y = m->m10*v.x + m->m11*v.y + m->m12*v.z; + r.z = m->m20*v.x + m->m21*v.y + m->m22*v.z; + return r; +} + +ufbx_abi ufbxi_noinline ufbx_matrix ufbx_transform_to_matrix(const ufbx_transform *t) +{ + ufbx_assert(t); + if (!t) return ufbx_identity_matrix; + + ufbx_quat q = t->rotation; + ufbx_real sx = 2.0f * t->scale.x, sy = 2.0f * t->scale.y, sz = 2.0f * t->scale.z; + ufbx_real xx = q.x*q.x, xy = q.x*q.y, xz = q.x*q.z, xw = q.x*q.w; + ufbx_real yy = q.y*q.y, yz = q.y*q.z, yw = q.y*q.w; + ufbx_real zz = q.z*q.z, zw = q.z*q.w; + ufbx_matrix m; + m.m00 = sx * (- yy - zz + 0.5f); + m.m10 = sx * (+ xy + zw); + m.m20 = sx * (- yw + xz); + m.m01 = sy * (- zw + xy); + m.m11 = sy * (- xx - zz + 0.5f); + m.m21 = sy * (+ xw + yz); + m.m02 = sz * (+ xz + yw); + m.m12 = sz * (- xw + yz); + m.m22 = sz * (- xx - yy + 0.5f); + m.m03 = t->translation.x; + m.m13 = t->translation.y; + m.m23 = t->translation.z; + return m; +} + +ufbx_abi ufbxi_noinline ufbx_transform ufbx_matrix_to_transform(const ufbx_matrix *m) +{ + ufbx_assert(m); + if (!m) return ufbx_identity_transform; + + ufbx_real det = ufbx_matrix_determinant(m); + + ufbx_transform t; + t.translation = m->cols[3]; + t.scale.x = ufbxi_length3(m->cols[0]); + t.scale.y = ufbxi_length3(m->cols[1]); + t.scale.z = ufbxi_length3(m->cols[2]); + + // Flip a single non-zero axis if negative determinant + ufbx_real sign_x = 1.0f; + ufbx_real sign_y = 1.0f; + ufbx_real sign_z = 1.0f; + if (det < 0.0f) { + if (t.scale.x > 0.0f) sign_x = -1.0f; + else if (t.scale.y > 0.0f) sign_y = -1.0f; + else if (t.scale.z > 0.0f) sign_z = -1.0f; + } + + ufbx_vec3 x = ufbxi_mul3(m->cols[0], t.scale.x > 0.0f ? sign_x / t.scale.x : 0.0f); + ufbx_vec3 y = ufbxi_mul3(m->cols[1], t.scale.y > 0.0f ? sign_y / t.scale.y : 0.0f); + ufbx_vec3 z = ufbxi_mul3(m->cols[2], t.scale.z > 0.0f ? sign_z / t.scale.z : 0.0f); + ufbx_real trace = x.x + y.y + z.z; + if (trace > 0.0f) { + ufbx_real a = (ufbx_real)ufbx_sqrt(ufbx_fmax(0.0, trace + 1.0)), b = (a != 0.0f) ? 0.5f / a : 0.0f; + t.rotation.x = (y.z - z.y) * b; + t.rotation.y = (z.x - x.z) * b; + t.rotation.z = (x.y - y.x) * b; + t.rotation.w = 0.5f * a; + } else if (x.x > y.y && x.x > z.z) { + ufbx_real a = (ufbx_real)ufbx_sqrt(ufbx_fmax(0.0, 1.0 + x.x - y.y - z.z)), b = (a != 0.0f) ? 0.5f / a : 0.0f; + t.rotation.x = 0.5f * a; + t.rotation.y = (y.x + x.y) * b; + t.rotation.z = (z.x + x.z) * b; + t.rotation.w = (y.z - z.y) * b; + } + else if (y.y > z.z) { + ufbx_real a = (ufbx_real)ufbx_sqrt(ufbx_fmax(0.0, 1.0 - x.x + y.y - z.z)), b = (a != 0.0f) ? 0.5f / a : 0.0f; + t.rotation.x = (y.x + x.y) * b; + t.rotation.y = 0.5f * a; + t.rotation.z = (z.y + y.z) * b; + t.rotation.w = (z.x - x.z) * b; + } + else { + ufbx_real a = (ufbx_real)ufbx_sqrt(ufbx_fmax(0.0, 1.0 - x.x - y.y + z.z)), b = (a != 0.0f) ? 0.5f / a : 0.0f; + t.rotation.x = (z.x + x.z) * b; + t.rotation.y = (z.y + y.z) * b; + t.rotation.z = 0.5f * a; + t.rotation.w = (x.y - y.x) * b; + } + + ufbx_real len = t.rotation.x*t.rotation.x + t.rotation.y*t.rotation.y + t.rotation.z*t.rotation.z + t.rotation.w*t.rotation.w; + if (ufbx_fabs(len - 1.0f) > UFBX_EPSILON) { + if (ufbx_fabs(len) <= UFBX_EPSILON) { + t.rotation = ufbx_identity_quat; + } else { + t.rotation.x /= len; + t.rotation.y /= len; + t.rotation.z /= len; + t.rotation.w /= len; + } + } + + t.scale.x *= sign_x; + t.scale.y *= sign_y; + t.scale.z *= sign_z; + + return t; +} + +ufbx_abi ufbxi_noinline ufbx_matrix ufbx_catch_get_skin_vertex_matrix(ufbx_panic *panic, const ufbx_skin_deformer *skin, size_t vertex, const ufbx_matrix *fallback) +{ + ufbx_assert(skin); + if (ufbxi_panicf(panic, vertex < skin->vertices.count, "vertex (%zu) out of bounds (%zu)", vertex, skin->vertices.count)) return ufbx_identity_matrix; + + if (!skin || vertex >= skin->vertices.count) return ufbx_identity_matrix; + ufbx_skin_vertex skin_vertex = skin->vertices.data[vertex]; + + ufbx_matrix mat = { 0.0f }; + ufbx_quat q0 = { 0.0f }, qe = { 0.0f }; + ufbx_quat first_q0 = { 0.0f }; + ufbx_vec3 qs = { 0.0f, 0.0f, 0.0f }; + ufbx_real total_weight = 0.0f; + + for (uint32_t i = 0; i < skin_vertex.num_weights; i++) { + ufbx_skin_weight weight = skin->weights.data[skin_vertex.weight_begin + i]; + ufbx_skin_cluster *cluster = skin->clusters.data[weight.cluster_index]; + const ufbx_node *node = cluster->bone_node; + if (!node) continue; + + total_weight += weight.weight; + if (skin_vertex.dq_weight > 0.0f) { + ufbx_transform t = cluster->geometry_to_world_transform; + ufbx_quat vq0 = t.rotation; + if (i == 0) first_q0 = vq0; + + if (ufbx_quat_dot(first_q0, vq0) < 0.0f) { + vq0.x = -vq0.x; + vq0.y = -vq0.y; + vq0.z = -vq0.z; + vq0.w = -vq0.w; + } + + ufbx_quat vqt = { 0.5f * t.translation.x, 0.5f * t.translation.y, 0.5f * t.translation.z }; + ufbx_quat vqe = ufbxi_mul_quat(vqt, vq0); + ufbxi_add_weighted_quat(&q0, vq0, weight.weight); + ufbxi_add_weighted_quat(&qe, vqe, weight.weight); + ufbxi_add_weighted_vec3(&qs, t.scale, weight.weight); + } + + if (skin_vertex.dq_weight < 1.0f) { + ufbxi_add_weighted_mat(&mat, &cluster->geometry_to_world, (1.0f-skin_vertex.dq_weight) * weight.weight); + } + } + + if (total_weight <= 0.0f) { + if (fallback) { + return *fallback; + } else { + return ufbx_identity_matrix; + } + } + + if (ufbx_fabs(total_weight - 1.0f) > UFBX_EPSILON) { + ufbx_real rcp_weight = ufbx_fabs(total_weight) > UFBX_EPSILON ? 1.0f / total_weight : 0.0f; + if (skin_vertex.dq_weight > 0.0f) { + q0.x *= rcp_weight; q0.y *= rcp_weight; q0.z *= rcp_weight; q0.w *= rcp_weight; + qe.x *= rcp_weight; qe.y *= rcp_weight; qe.z *= rcp_weight; qe.w *= rcp_weight; + qs.x *= rcp_weight; qs.y *= rcp_weight; qs.z *= rcp_weight; + } + if (skin_vertex.dq_weight < 1.0f) { + mat.m00 *= rcp_weight; mat.m01 *= rcp_weight; mat.m02 *= rcp_weight; mat.m03 *= rcp_weight; + mat.m10 *= rcp_weight; mat.m11 *= rcp_weight; mat.m12 *= rcp_weight; mat.m13 *= rcp_weight; + mat.m20 *= rcp_weight; mat.m21 *= rcp_weight; mat.m22 *= rcp_weight; mat.m23 *= rcp_weight; + } + } + + if (skin_vertex.dq_weight > 0.0f) { + ufbx_transform dqt; + ufbx_real rcp_len = (ufbx_real)(1.0 / ufbx_sqrt(q0.x*q0.x + q0.y*q0.y + q0.z*q0.z + q0.w*q0.w)); + ufbx_real rcp_len2x2 = 2.0f * rcp_len * rcp_len; + dqt.rotation.x = q0.x * rcp_len; + dqt.rotation.y = q0.y * rcp_len; + dqt.rotation.z = q0.z * rcp_len; + dqt.rotation.w = q0.w * rcp_len; + dqt.scale.x = qs.x; + dqt.scale.y = qs.y; + dqt.scale.z = qs.z; + dqt.translation.x = rcp_len2x2 * (- qe.w*q0.x + qe.x*q0.w - qe.y*q0.z + qe.z*q0.y); + dqt.translation.y = rcp_len2x2 * (- qe.w*q0.y + qe.x*q0.z + qe.y*q0.w - qe.z*q0.x); + dqt.translation.z = rcp_len2x2 * (- qe.w*q0.z - qe.x*q0.y + qe.y*q0.x + qe.z*q0.w); + ufbx_matrix dqm = ufbx_transform_to_matrix(&dqt); + if (skin_vertex.dq_weight < 1.0f) { + ufbxi_add_weighted_mat(&mat, &dqm, skin_vertex.dq_weight); + } else { + mat = dqm; + } + } + + return mat; +} + +ufbx_abi ufbxi_noinline ufbx_vec3 ufbx_get_blend_shape_vertex_offset(const ufbx_blend_shape *shape, size_t vertex) +{ + ufbx_assert(shape); + if (!shape) return ufbx_zero_vec3; + + size_t index = SIZE_MAX; + uint32_t vertex_ix = (uint32_t)vertex; + + ufbxi_macro_lower_bound_eq(uint32_t, 16, &index, shape->offset_vertices.data, 0, shape->num_offsets, + ( *a < vertex_ix ), ( *a == vertex_ix )); + if (index == SIZE_MAX) return ufbx_zero_vec3; + + return shape->position_offsets.data[index]; +} + +ufbx_abi ufbxi_noinline ufbx_vec3 ufbx_get_blend_vertex_offset(const ufbx_blend_deformer *blend, size_t vertex) +{ + ufbx_assert(blend); + if (!blend) return ufbx_zero_vec3; + + ufbx_vec3 offset = ufbx_zero_vec3; + + ufbxi_for_ptr_list(ufbx_blend_channel, p_chan, blend->channels) { + ufbx_blend_channel *chan = *p_chan; + ufbxi_for_list(ufbx_blend_keyframe, key, chan->keyframes) { + if (key->effective_weight == 0.0f) continue; + + ufbx_vec3 key_offset = ufbx_get_blend_shape_vertex_offset(key->shape, vertex); + ufbxi_add_weighted_vec3(&offset, key_offset, key->effective_weight); + } + } + + return offset; +} + +ufbx_abi void ufbx_add_blend_shape_vertex_offsets(const ufbx_blend_shape *shape, ufbx_vec3 *vertices, size_t num_vertices, ufbx_real weight) +{ + if (weight == 0.0f) return; + if (!vertices) return; + + size_t num_offsets = shape->num_offsets; + uint32_t *vertex_indices = shape->offset_vertices.data; + ufbx_vec3 *offsets = shape->position_offsets.data; + for (size_t i = 0; i < num_offsets; i++) { + uint32_t index = vertex_indices[i]; + if (index < num_vertices) { + ufbxi_add_weighted_vec3(&vertices[index], offsets[i], weight); + } + } +} + +ufbx_abi void ufbx_add_blend_vertex_offsets(const ufbx_blend_deformer *blend, ufbx_vec3 *vertices, size_t num_vertices, ufbx_real weight) +{ + ufbx_assert(blend); + if (!blend) return; + + ufbxi_for_ptr_list(ufbx_blend_channel, p_chan, blend->channels) { + ufbx_blend_channel *chan = *p_chan; + ufbxi_for_list(ufbx_blend_keyframe, key, chan->keyframes) { + if (key->effective_weight == 0.0f) continue; + ufbx_add_blend_shape_vertex_offsets(key->shape, vertices, num_vertices, weight * key->effective_weight); + } + } +} + +ufbx_abi size_t ufbx_evaluate_nurbs_basis(const ufbx_nurbs_basis *basis, ufbx_real u, ufbx_real *weights, size_t num_weights, ufbx_real *derivatives, size_t num_derivatives) +{ + ufbx_assert(basis); + if (!basis) return SIZE_MAX; + if (basis->order == 0) return SIZE_MAX; + if (!basis->valid) return SIZE_MAX; + + size_t degree = basis->order - 1; + ufbx_assert(degree >= 1); + + // Binary search for the knot span `[min_u, max_u]` where `min_u <= u < max_u` + ufbx_real_list knots = basis->knot_vector; + size_t knot = SIZE_MAX; + + if (u <= basis->t_min) { + knot = degree; + u = basis->t_min; + } else if (u >= basis->t_max) { + knot = basis->knot_vector.count - degree - 2; + u = basis->t_max; + } else { + ufbxi_macro_lower_bound_eq(ufbx_real, 8, &knot, knots.data, 0, knots.count - 1, + ( a[1] <= u ), ( a[0] <= u && u < a[1] )); + } + + // The found effective control points are found left from `knot`, locally + // we use `knot - ix` here as it's more convenient for the following algorithm + // but we return it as `knot - degree` so that users can find the control points + // at `points[knot], points[knot+1], ..., points[knot+degree]` + if (knot < degree) return SIZE_MAX; + + if (num_derivatives == 0) derivatives = NULL; + if (num_weights < basis->order) return knot - degree; + if (!weights) return knot - degree; + + weights[0] = 1.0f; + for (size_t p = 1; p <= degree; p++) { + + ufbx_real prev = 0.0f; + ufbx_real g = 1.0f - ufbxi_nurbs_weight(&knots, knot - p + 1, p, u); + ufbx_real dg = 0.0f; + if (derivatives && p == degree) { + dg = ufbxi_nurbs_deriv(&knots, knot - p + 1, p); + } + + for (size_t i = p; i > 0; i--) { + ufbx_real f = ufbxi_nurbs_weight(&knots, knot - p + i, p, u); + ufbx_real weight = weights[i - 1]; + weights[i] = f*weight + g*prev; + + if (derivatives && p == degree) { + ufbx_real df = ufbxi_nurbs_deriv(&knots, knot - p + i, p); + if (i < num_derivatives) { + derivatives[i] = df*weight - dg*prev; + } + dg = df; + } + + prev = weight; + g = 1.0f - f; + } + + weights[0] = g*prev; + if (derivatives && p == degree) { + derivatives[0] = -dg*prev; + } + } + + return knot - degree; +} + +ufbx_abi ufbxi_noinline ufbx_curve_point ufbx_evaluate_nurbs_curve(const ufbx_nurbs_curve *curve, ufbx_real u) +{ + ufbx_curve_point result = { false }; + + ufbx_assert(curve); + if (!curve) return result; + + ufbx_real weights[UFBXI_MAX_NURBS_ORDER]; + ufbx_real derivs[UFBXI_MAX_NURBS_ORDER]; + size_t base = ufbx_evaluate_nurbs_basis(&curve->basis, u, weights, UFBXI_MAX_NURBS_ORDER, derivs, UFBXI_MAX_NURBS_ORDER); + if (base == SIZE_MAX) return result; + + ufbx_vec4 p = { 0 }; + ufbx_vec4 d = { 0 }; + + size_t order = curve->basis.order; + if (order > UFBXI_MAX_NURBS_ORDER) return result; + if (curve->control_points.count == 0) return result; + + for (size_t i = 0; i < order; i++) { + size_t ix = (base + i) % curve->control_points.count; + ufbx_vec4 cp = curve->control_points.data[ix]; + ufbx_real weight = weights[i] * cp.w, deriv = derivs[i] * cp.w; + + p.x += cp.x * weight; + p.y += cp.y * weight; + p.z += cp.z * weight; + p.w += weight; + + d.x += cp.x * deriv; + d.y += cp.y * deriv; + d.z += cp.z * deriv; + d.w += deriv; + } + + ufbx_real rcp_w = 1.0f / p.w; + result.valid = true; + result.position.x = p.x * rcp_w; + result.position.y = p.y * rcp_w; + result.position.z = p.z * rcp_w; + result.derivative.x = (d.x - d.w*result.position.x) * rcp_w; + result.derivative.y = (d.y - d.w*result.position.y) * rcp_w; + result.derivative.z = (d.z - d.w*result.position.z) * rcp_w; + return result; +} + +ufbx_abi ufbxi_noinline ufbx_surface_point ufbx_evaluate_nurbs_surface(const ufbx_nurbs_surface *surface, ufbx_real u, ufbx_real v) +{ + ufbx_surface_point result = { false }; + + ufbx_assert(surface); + if (!surface) return result; + + ufbx_real weights_u[UFBXI_MAX_NURBS_ORDER], weights_v[UFBXI_MAX_NURBS_ORDER]; + ufbx_real derivs_u[UFBXI_MAX_NURBS_ORDER], derivs_v[UFBXI_MAX_NURBS_ORDER]; + size_t base_u = ufbx_evaluate_nurbs_basis(&surface->basis_u, u, weights_u, UFBXI_MAX_NURBS_ORDER, derivs_u, UFBXI_MAX_NURBS_ORDER); + size_t base_v = ufbx_evaluate_nurbs_basis(&surface->basis_v, v, weights_v, UFBXI_MAX_NURBS_ORDER, derivs_v, UFBXI_MAX_NURBS_ORDER); + if (base_u == SIZE_MAX || base_v == SIZE_MAX) return result; + + ufbx_vec4 p = { 0 }; + ufbx_vec4 du = { 0 }; + ufbx_vec4 dv = { 0 }; + + size_t num_u = surface->num_control_points_u; + size_t num_v = surface->num_control_points_v; + size_t order_u = surface->basis_u.order; + size_t order_v = surface->basis_v.order; + if (order_u > UFBXI_MAX_NURBS_ORDER || order_v > UFBXI_MAX_NURBS_ORDER) return result; + if (num_u == 0 || num_v == 0) return result; + + for (size_t vi = 0; vi < order_v; vi++) { + size_t vix = (base_v + vi) % num_v; + ufbx_real weight_v = weights_v[vi], deriv_v = derivs_v[vi]; + + for (size_t ui = 0; ui < order_u; ui++) { + size_t uix = (base_u + ui) % num_u; + ufbx_real weight_u = weights_u[ui], deriv_u = derivs_u[ui]; + ufbx_vec4 cp = surface->control_points.data[vix * num_u + uix]; + + ufbx_real weight = weight_u * weight_v * cp.w; + ufbx_real wderiv_u = deriv_u * weight_v * cp.w; + ufbx_real wderiv_v = deriv_v * weight_u * cp.w; + + p.x += cp.x * weight; + p.y += cp.y * weight; + p.z += cp.z * weight; + p.w += weight; + + du.x += cp.x * wderiv_u; + du.y += cp.y * wderiv_u; + du.z += cp.z * wderiv_u; + du.w += wderiv_u; + + dv.x += cp.x * wderiv_v; + dv.y += cp.y * wderiv_v; + dv.z += cp.z * wderiv_v; + dv.w += wderiv_v; + } + } + + ufbx_real rcp_w = 1.0f / p.w; + result.valid = true; + result.position.x = p.x * rcp_w; + result.position.y = p.y * rcp_w; + result.position.z = p.z * rcp_w; + result.derivative_u.x = (du.x - du.w*result.position.x) * rcp_w; + result.derivative_u.y = (du.y - du.w*result.position.y) * rcp_w; + result.derivative_u.z = (du.z - du.w*result.position.z) * rcp_w; + result.derivative_v.x = (dv.x - dv.w*result.position.x) * rcp_w; + result.derivative_v.y = (dv.y - dv.w*result.position.y) * rcp_w; + result.derivative_v.z = (dv.z - dv.w*result.position.z) * rcp_w; + return result; +} + +ufbx_abi ufbx_line_curve *ufbx_tessellate_nurbs_curve(const ufbx_nurbs_curve *curve, const ufbx_tessellate_curve_opts *opts, ufbx_error *error) +{ +#if UFBXI_FEATURE_TESSELLATION + ufbx_assert(curve); + if (!curve) return NULL; + + ufbxi_tessellate_curve_context tc = { UFBX_ERROR_NONE }; + if (opts) { + tc.opts = *opts; + } + + tc.curve = curve; + + int ok = ufbxi_tessellate_nurbs_curve_imp(&tc); + + ufbxi_free_ator(&tc.ator_tmp); + + if (ok) { + ufbxi_clear_error(error); + ufbxi_line_curve_imp *imp = tc.imp; + return &imp->curve; + } else { + ufbxi_fix_error_type(&tc.error, "Failed to tessellate"); + if (error) *error = tc.error; + ufbxi_buf_free(&tc.result); + ufbxi_free_ator(&tc.ator_result); + return NULL; + } +#else + if (error) { + memset(error, 0, sizeof(ufbx_error)); + ufbxi_fmt_err_info(error, "UFBX_ENABLE_TESSELLATION"); + ufbxi_report_err_msg(error, "UFBXI_FEATURE_TESSELLATION", "Feature disabled"); + } + return NULL; +#endif +} + +ufbx_abi ufbx_mesh *ufbx_tessellate_nurbs_surface(const ufbx_nurbs_surface *surface, const ufbx_tessellate_surface_opts *opts, ufbx_error *error) +{ +#if UFBXI_FEATURE_TESSELLATION + ufbx_assert(surface); + if (!surface) return NULL; + + ufbxi_tessellate_surface_context tc = { UFBX_ERROR_NONE }; + if (opts) { + tc.opts = *opts; + } + + tc.surface = surface; + + int ok = ufbxi_tessellate_nurbs_surface_imp(&tc); + + ufbxi_buf_free(&tc.tmp); + ufbxi_map_free(&tc.position_map); + ufbxi_free_ator(&tc.ator_tmp); + + if (ok) { + ufbxi_clear_error(error); + ufbxi_mesh_imp *imp = tc.imp; + return &imp->mesh; + } else { + ufbxi_fix_error_type(&tc.error, "Failed to tessellate"); + if (error) *error = tc.error; + ufbxi_buf_free(&tc.result); + ufbxi_free_ator(&tc.ator_result); + return NULL; + } +#else + if (error) { + memset(error, 0, sizeof(ufbx_error)); + ufbxi_report_err_msg(error, "UFBXI_FEATURE_TESSELLATION", "Feature disabled"); + } + return NULL; +#endif +} + +ufbx_abi void ufbx_free_line_curve(ufbx_line_curve *line_curve) +{ + if (!line_curve) return; + if (!line_curve->from_tessellated_nurbs) return; + + ufbxi_line_curve_imp *imp = ufbxi_get_imp(ufbxi_line_curve_imp, line_curve); + ufbx_assert(imp->magic == UFBXI_LINE_CURVE_IMP_MAGIC); + if (imp->magic != UFBXI_LINE_CURVE_IMP_MAGIC) return; + ufbxi_release_ref(&imp->refcount); +} + +ufbx_abi void ufbx_retain_line_curve(ufbx_line_curve *line_curve) +{ + if (!line_curve) return; + if (!line_curve->from_tessellated_nurbs) return; + + ufbxi_line_curve_imp *imp = ufbxi_get_imp(ufbxi_line_curve_imp, line_curve); + ufbx_assert(imp->magic == UFBXI_LINE_CURVE_IMP_MAGIC); + if (imp->magic != UFBXI_LINE_CURVE_IMP_MAGIC) return; + ufbxi_retain_ref(&imp->refcount); +} + +ufbx_abi ufbxi_noinline uint32_t ufbx_catch_triangulate_face(ufbx_panic *panic, uint32_t *indices, size_t num_indices, const ufbx_mesh *mesh, ufbx_face face) +{ +#if UFBXI_FEATURE_TRIANGULATION + if (face.num_indices < 3) return 0; + + size_t required_indices = ((size_t)face.num_indices - 2) * 3; + if (ufbxi_panicf(panic, num_indices >= required_indices, "Face needs at least %zu indices for triangles, got space for %zu", required_indices, num_indices)) return 0; + if (ufbxi_panicf(panic, face.index_begin < mesh->num_indices, "Face index begin (%u) out of bounds (%zu)", face.index_begin, mesh->num_indices)) return 0; + if (ufbxi_panicf(panic, mesh->num_indices - face.index_begin >= face.num_indices, "Face index end (%u + %u) out of bounds (%zu)", face.index_begin, face.num_indices, mesh->num_indices)) return 0; + + if (face.num_indices == 3) { + // Fast case: Already a triangle + indices[0] = face.index_begin + 0; + indices[1] = face.index_begin + 1; + indices[2] = face.index_begin + 2; + return 1; + } else if (face.num_indices == 4) { + // Quad: Split along the shortest axis unless a vertex crosses the axis + uint32_t i0 = face.index_begin + 0; + uint32_t i1 = face.index_begin + 1; + uint32_t i2 = face.index_begin + 2; + uint32_t i3 = face.index_begin + 3; + ufbx_vec3 v0 = mesh->vertex_position.values.data[mesh->vertex_position.indices.data[i0]]; + ufbx_vec3 v1 = mesh->vertex_position.values.data[mesh->vertex_position.indices.data[i1]]; + ufbx_vec3 v2 = mesh->vertex_position.values.data[mesh->vertex_position.indices.data[i2]]; + ufbx_vec3 v3 = mesh->vertex_position.values.data[mesh->vertex_position.indices.data[i3]]; + + ufbx_vec3 a = ufbxi_sub3(v2, v0); + ufbx_vec3 b = ufbxi_sub3(v3, v1); + + ufbx_vec3 na1 = ufbxi_normalize3(ufbxi_cross3(a, ufbxi_sub3(v1, v0))); + ufbx_vec3 na3 = ufbxi_normalize3(ufbxi_cross3(a, ufbxi_sub3(v0, v3))); + ufbx_vec3 nb0 = ufbxi_normalize3(ufbxi_cross3(b, ufbxi_sub3(v1, v0))); + ufbx_vec3 nb2 = ufbxi_normalize3(ufbxi_cross3(b, ufbxi_sub3(v2, v1))); + + ufbx_real dot_aa = ufbxi_dot3(a, a); + ufbx_real dot_bb = ufbxi_dot3(b, b); + ufbx_real dot_na = ufbxi_dot3(na1, na3); + ufbx_real dot_nb = ufbxi_dot3(nb0, nb2); + + bool split_a = dot_aa <= dot_bb; + + if (dot_na < 0.0f || dot_nb < 0.0f) { + split_a = dot_na >= dot_nb; + } + + if (split_a) { + indices[0] = i0; + indices[1] = i1; + indices[2] = i2; + indices[3] = i2; + indices[4] = i3; + indices[5] = i0; + } else { + indices[0] = i1; + indices[1] = i2; + indices[2] = i3; + indices[3] = i3; + indices[4] = i0; + indices[5] = i1; + } + + return 2; + } else { + ufbxi_ngon_context nc = { 0 }; + nc.positions = mesh->vertex_position; + nc.face = face; + + uint32_t num_indices_u32 = num_indices < UINT32_MAX ? (uint32_t)num_indices : UINT32_MAX; + + uint32_t local_indices[12]; + if (num_indices_u32 < 12) { + uint32_t num_tris = ufbxi_triangulate_ngon(&nc, local_indices, 12); + memcpy(indices, local_indices, num_tris * 3 * sizeof(uint32_t)); + return num_tris; + } else { + return ufbxi_triangulate_ngon(&nc, indices, num_indices_u32); + } + } +#else + ufbxi_panicf_imp(panic, "Triangulation disabled"); + return 0; +#endif +} + +ufbx_abi void ufbx_catch_compute_topology(ufbx_panic *panic, const ufbx_mesh *mesh, ufbx_topo_edge *indices, size_t num_indices) +{ + if (ufbxi_panicf(panic, num_indices >= mesh->num_indices, "Required mesh.num_indices (%zu) indices, got %zu", mesh->num_indices, num_indices)) return; + + ufbxi_compute_topology(mesh, indices); +} + +ufbx_abi uint32_t ufbx_catch_topo_next_vertex_edge(ufbx_panic *panic, const ufbx_topo_edge *topo, size_t num_topo, uint32_t index) +{ + if (index == UFBX_NO_INDEX) return UFBX_NO_INDEX; + if (ufbxi_panicf(panic, (size_t)index < num_topo, "index (%d) out of bounds (%zu)", index, num_topo)) return UFBX_NO_INDEX; + uint32_t twin = topo[index].twin; + if (twin == UFBX_NO_INDEX) return UFBX_NO_INDEX; + if (ufbxi_panicf(panic, (size_t)twin < num_topo, "Corrupted topology structure")) return UFBX_NO_INDEX; + return topo[twin].next; +} + +ufbx_abi uint32_t ufbx_catch_topo_prev_vertex_edge(ufbx_panic *panic, const ufbx_topo_edge *topo, size_t num_topo, uint32_t index) +{ + if (index == UFBX_NO_INDEX) return UFBX_NO_INDEX; + if (ufbxi_panicf(panic, (size_t)index < num_topo, "index (%d) out of bounds (%zu)", index, num_topo)) return UFBX_NO_INDEX; + return topo[topo[index].prev].twin; +} + +ufbx_abi ufbxi_noinline ufbx_vec3 ufbx_catch_get_weighted_face_normal(ufbx_panic *panic, const ufbx_vertex_vec3 *positions, ufbx_face face) +{ + if (ufbxi_panicf(panic, face.index_begin <= positions->indices.count, "Face index begin (%u) out of bounds (%zu)", face.index_begin, positions->indices.count)) return ufbx_zero_vec3; + if (ufbxi_panicf(panic, positions->indices.count - face.index_begin >= face.num_indices, "Face index end (%u + %u) out of bounds (%zu)", face.index_begin, face.num_indices, positions->indices.count)) return ufbx_zero_vec3; + + if (face.num_indices < 3) { + return ufbx_zero_vec3; + } else if (face.num_indices == 3) { + ufbx_vec3 a, b, c; + if (panic) { + a = ufbx_catch_get_vertex_vec3(panic, positions, face.index_begin + 0); + b = ufbx_catch_get_vertex_vec3(panic, positions, face.index_begin + 1); + c = ufbx_catch_get_vertex_vec3(panic, positions, face.index_begin + 2); + } else { + a = ufbx_get_vertex_vec3(positions, face.index_begin + 0); + b = ufbx_get_vertex_vec3(positions, face.index_begin + 1); + c = ufbx_get_vertex_vec3(positions, face.index_begin + 2); + } + return ufbxi_cross3(ufbxi_sub3(b, a), ufbxi_sub3(c, a)); + } else if (face.num_indices == 4) { + ufbx_vec3 a, b, c, d; + if (panic) { + a = ufbx_catch_get_vertex_vec3(panic, positions, face.index_begin + 0); + b = ufbx_catch_get_vertex_vec3(panic, positions, face.index_begin + 1); + c = ufbx_catch_get_vertex_vec3(panic, positions, face.index_begin + 2); + d = ufbx_catch_get_vertex_vec3(panic, positions, face.index_begin + 3); + } else { + a = ufbx_get_vertex_vec3(positions, face.index_begin + 0); + b = ufbx_get_vertex_vec3(positions, face.index_begin + 1); + c = ufbx_get_vertex_vec3(positions, face.index_begin + 2); + d = ufbx_get_vertex_vec3(positions, face.index_begin + 3); + } + return ufbxi_cross3(ufbxi_sub3(c, a), ufbxi_sub3(d, b)); + } else { + ufbx_vec3 a, b; + + // Newell's Method + ufbx_vec3 result = ufbx_zero_vec3; + for (size_t i = 0; i < face.num_indices; i++) { + size_t next = i + 1 < face.num_indices ? i + 1 : 0; + if (panic) { + a = ufbx_catch_get_vertex_vec3(panic, positions, face.index_begin + i); + b = ufbx_catch_get_vertex_vec3(panic, positions, face.index_begin + next); + } else { + a = ufbx_get_vertex_vec3(positions, face.index_begin + i); + b = ufbx_get_vertex_vec3(positions, face.index_begin + next); + } + result.x += (a.y - b.y) * (a.z + b.z); + result.y += (a.z - b.z) * (a.x + b.x); + result.z += (a.x - b.x) * (a.y + b.y); + } + return result; + } +} + +size_t ufbx_catch_generate_normal_mapping(ufbx_panic *panic, const ufbx_mesh *mesh, const ufbx_topo_edge *topo, size_t num_topo, uint32_t *normal_indices, size_t num_normal_indices, bool assume_smooth) +{ + uint32_t next_index = 0; + if (ufbxi_panicf(panic, num_normal_indices >= mesh->num_indices, "Expected at least mesh.num_indices (%zu), got %zu", mesh->num_indices, num_normal_indices)) return 0; + + for (size_t i = 0; i < mesh->num_indices; i++) { + normal_indices[i] = UFBX_NO_INDEX; + } + + // Walk around vertices and merge around smooth edges + for (size_t vi = 0; vi < mesh->num_vertices; vi++) { + uint32_t original_start = mesh->vertex_first_index.data[vi]; + if (original_start == UFBX_NO_INDEX) continue; + uint32_t start = original_start, cur = start; + + for (;;) { + uint32_t prev = ufbx_topo_next_vertex_edge(topo, num_topo, cur); + if (!ufbxi_is_edge_smooth(mesh, topo, num_topo, cur, assume_smooth)) start = cur; + if (prev == UFBX_NO_INDEX) { start = cur; break; } + if (prev == original_start) break; + cur = prev; + } + + normal_indices[start] = next_index++; + uint32_t next = start; + for (;;) { + next = ufbx_topo_prev_vertex_edge(topo, num_topo, next); + if (next == UFBX_NO_INDEX || next == start) break; + + if (!ufbxi_is_edge_smooth(mesh, topo, num_topo, next, assume_smooth)) { + ++next_index; + } + normal_indices[next] = next_index - 1; + } + } + + // Assign non-manifold indices + for (size_t i = 0; i < mesh->num_indices; i++) { + if (normal_indices[i] == UFBX_NO_INDEX) { + normal_indices[i] = next_index++; + } + } + + return (size_t)next_index; +} + +ufbx_abi size_t ufbx_generate_normal_mapping(const ufbx_mesh *mesh, const ufbx_topo_edge *topo, size_t num_topo, uint32_t *normal_indices, size_t num_normal_indices, bool assume_smooth) +{ + return ufbx_catch_generate_normal_mapping(NULL, mesh, topo, num_topo, normal_indices, num_normal_indices, assume_smooth); +} + +ufbx_abi void ufbx_catch_compute_normals(ufbx_panic *panic, const ufbx_mesh *mesh, const ufbx_vertex_vec3 *positions, const uint32_t *normal_indices, size_t num_normal_indices, ufbx_vec3 *normals, size_t num_normals) +{ + if (ufbxi_panicf(panic, num_normal_indices >= mesh->num_indices, "Expected at least mesh.num_indices (%zu), got %zu", mesh->num_indices, num_normal_indices)) return; + + memset(normals, 0, sizeof(ufbx_vec3)*num_normals); + + for (size_t fi = 0; fi < mesh->num_faces; fi++) { + ufbx_face face = mesh->faces.data[fi]; + ufbx_vec3 normal = ufbx_get_weighted_face_normal(positions, face); + for (size_t ix = 0; ix < face.num_indices; ix++) { + uint32_t index = normal_indices[face.index_begin + ix]; + + if (ufbxi_panicf(panic, index < num_normals, "Normal index (%d) out of bounds (%zu) at %zu", index, num_normals, ix)) return; + + ufbx_vec3 *n = &normals[index]; + *n = ufbxi_add3(*n, normal); + } + } + + for (size_t i = 0; i < num_normals; i++) { + ufbx_real len = ufbxi_length3(normals[i]); + if (len > 0.0f) { + normals[i].x /= len; + normals[i].y /= len; + normals[i].z /= len; + } + } +} + +ufbx_abi void ufbx_compute_normals(const ufbx_mesh *mesh, const ufbx_vertex_vec3 *positions, const uint32_t *normal_indices, size_t num_normal_indices, ufbx_vec3 *normals, size_t num_normals) +{ + ufbx_catch_compute_normals(NULL, mesh, positions, normal_indices, num_normal_indices, normals, num_normals); +} + +ufbx_abi ufbx_mesh *ufbx_subdivide_mesh(const ufbx_mesh *mesh, size_t level, const ufbx_subdivide_opts *opts, ufbx_error *error) +{ + if (!mesh) return NULL; + if (level == 0) return (ufbx_mesh*)mesh; + return ufbxi_subdivide_mesh(mesh, level, opts, error); +} + +ufbx_abi void ufbx_free_mesh(ufbx_mesh *mesh) +{ + if (!mesh) return; + if (!mesh->subdivision_evaluated && !mesh->from_tessellated_nurbs) return; + + ufbxi_mesh_imp *imp = ufbxi_get_imp(ufbxi_mesh_imp, mesh); + ufbx_assert(imp->magic == UFBXI_MESH_IMP_MAGIC); + if (imp->magic != UFBXI_MESH_IMP_MAGIC) return; + ufbxi_release_ref(&imp->refcount); +} + +ufbx_abi void ufbx_retain_mesh(ufbx_mesh *mesh) +{ + if (!mesh) return; + if (!mesh->subdivision_evaluated && !mesh->from_tessellated_nurbs) return; + + ufbxi_mesh_imp *imp = ufbxi_get_imp(ufbxi_mesh_imp, mesh); + ufbx_assert(imp->magic == UFBXI_MESH_IMP_MAGIC); + if (imp->magic != UFBXI_MESH_IMP_MAGIC) return; + ufbxi_retain_ref(&imp->refcount); +} + +ufbx_abi ufbx_geometry_cache *ufbx_load_geometry_cache( + const char *filename, + const ufbx_geometry_cache_opts *opts, ufbx_error *error) +{ + return ufbx_load_geometry_cache_len(filename, strlen(filename), + opts, error); +} + +ufbx_abi ufbx_geometry_cache *ufbx_load_geometry_cache_len( + const char *filename, size_t filename_len, + const ufbx_geometry_cache_opts *opts, ufbx_error *error) +{ + ufbx_string str = ufbxi_safe_string(filename, filename_len); + return ufbxi_load_geometry_cache(str, opts, error); +} + +ufbx_abi void ufbx_free_geometry_cache(ufbx_geometry_cache *cache) +{ + if (!cache) return; + + ufbxi_geometry_cache_imp *imp = ufbxi_get_imp(ufbxi_geometry_cache_imp, cache); + ufbx_assert(imp->magic == UFBXI_CACHE_IMP_MAGIC); + if (imp->magic != UFBXI_CACHE_IMP_MAGIC) return; + if (imp->owned_by_scene) return; + ufbxi_release_ref(&imp->refcount); +} + +ufbx_abi void ufbx_retain_geometry_cache(ufbx_geometry_cache *cache) +{ + if (!cache) return; + + ufbxi_geometry_cache_imp *imp = ufbxi_get_imp(ufbxi_geometry_cache_imp, cache); + ufbx_assert(imp->magic == UFBXI_CACHE_IMP_MAGIC); + if (imp->magic != UFBXI_CACHE_IMP_MAGIC) return; + if (imp->owned_by_scene) return; + ufbxi_retain_ref(&imp->refcount); +} + +ufbx_abi ufbxi_noinline size_t ufbx_read_geometry_cache_real(const ufbx_cache_frame *frame, ufbx_real *data, size_t count, const ufbx_geometry_cache_data_opts *user_opts) +{ +#if UFBXI_FEATURE_GEOMETRY_CACHE + if (!frame || count == 0) return 0; + ufbx_assert(data); + if (!data) return 0; + + ufbx_geometry_cache_data_opts opts; + if (user_opts) { + opts = *user_opts; + } else { + memset(&opts, 0, sizeof(opts)); + } + + if (!opts.open_file_cb.fn) { + opts.open_file_cb.fn = ufbx_default_open_file; + } + + // `ufbx_geometry_cache_data_opts` must be cleared to zero first! + ufbx_assert(opts._begin_zero == 0 && opts._end_zero == 0); + if (!(opts._begin_zero == 0 && opts._end_zero == 0)) return 0; + + bool use_double = false; + + size_t src_count = 0; + + switch (frame->data_format) { + case UFBX_CACHE_DATA_FORMAT_UNKNOWN: src_count = 0; break; + case UFBX_CACHE_DATA_FORMAT_REAL_FLOAT: src_count = frame->data_count; break; + case UFBX_CACHE_DATA_FORMAT_VEC3_FLOAT: src_count = frame->data_count * 3; break; + case UFBX_CACHE_DATA_FORMAT_REAL_DOUBLE: src_count = frame->data_count; use_double = true; break; + case UFBX_CACHE_DATA_FORMAT_VEC3_DOUBLE: src_count = frame->data_count * 3; use_double = true; break; + default: ufbx_assert(0 && "Bad data_format"); break; + } + + bool src_big_endian = false; + switch (frame->data_encoding) { + case UFBX_CACHE_DATA_ENCODING_UNKNOWN: return 0; + case UFBX_CACHE_DATA_ENCODING_LITTLE_ENDIAN: src_big_endian = false; break; + case UFBX_CACHE_DATA_ENCODING_BIG_ENDIAN: src_big_endian = true; break; + default: ufbx_assert(0 && "Bad data_encoding"); break; + } + + // Test endianness + bool dst_big_endian; + { + uint8_t buf[2]; + uint16_t val = 0xbbaa; + memcpy(buf, &val, 2); + dst_big_endian = buf[0] == 0xbb; + } + + if (src_count == 0) return 0; + src_count = ufbxi_min_sz(src_count, count); + + ufbx_stream stream = { 0 }; + if (!ufbxi_open_file(&opts.open_file_cb, &stream, frame->filename.data, frame->filename.length, NULL, NULL, UFBX_OPEN_FILE_GEOMETRY_CACHE)) { + return 0; + } + + // Skip to the correct point in the file + uint64_t offset = frame->data_offset; + if (stream.skip_fn) { + while (offset > 0) { + size_t to_skip = (size_t)ufbxi_min64(offset, UFBXI_MAX_SKIP_SIZE); + if (!stream.skip_fn(stream.user, to_skip)) break; + offset -= to_skip; + } + } else { + char buffer[4096]; + while (offset > 0) { + size_t to_skip = (size_t)ufbxi_min64(offset, sizeof(buffer)); + size_t num_read = stream.read_fn(stream.user, buffer, to_skip); + if (num_read != to_skip) break; + offset -= to_skip; + } + } + + // Failed to skip all the way + if (offset > 0) { + if (stream.close_fn) { + stream.close_fn(stream.user); + } + return 0; + } + + ufbx_real *dst = data; + if (use_double) { + double buffer[512]; + while (src_count > 0) { + size_t to_read = ufbxi_min_sz(src_count, ufbxi_arraycount(buffer)); + src_count -= to_read; + size_t bytes_read = stream.read_fn(stream.user, buffer, to_read * sizeof(double)); + if (bytes_read == SIZE_MAX) bytes_read = 0; + size_t num_read = bytes_read / sizeof(double); + + if (src_big_endian != dst_big_endian) { + for (size_t i = 0; i < num_read; i++) { + char t, *v = (char*)&buffer[i]; + t = v[0]; v[0] = v[7]; v[7] = t; + t = v[1]; v[1] = v[6]; v[6] = t; + t = v[2]; v[2] = v[5]; v[5] = t; + t = v[3]; v[3] = v[4]; v[4] = t; + } + } + + if (dst) { + ufbx_real weight = opts.weight; + if (opts.additive && opts.use_weight) { + for (size_t i = 0; i < num_read; i++) { + dst[i] += (ufbx_real)buffer[i] * weight; + } + } else if (opts.additive) { + for (size_t i = 0; i < num_read; i++) { + dst[i] += (ufbx_real)buffer[i]; + } + } else if (opts.use_weight) { + for (size_t i = 0; i < num_read; i++) { + dst[i] = (ufbx_real)buffer[i] * weight; + } + } else { + for (size_t i = 0; i < num_read; i++) { + dst[i] = (ufbx_real)buffer[i]; + } + } + dst += num_read; + } + + if (num_read != to_read) break; + } + } else { + float buffer[1024]; + while (src_count > 0) { + size_t to_read = ufbxi_min_sz(src_count, ufbxi_arraycount(buffer)); + src_count -= to_read; + size_t bytes_read = stream.read_fn(stream.user, buffer, to_read * sizeof(float)); + if (bytes_read == SIZE_MAX) bytes_read = 0; + size_t num_read = bytes_read / sizeof(float); + + if (src_big_endian != dst_big_endian) { + for (size_t i = 0; i < num_read; i++) { + char t, *v = (char*)&buffer[i]; + t = v[0]; v[0] = v[3]; v[3] = t; + t = v[1]; v[1] = v[2]; v[2] = t; + } + } + + if (dst) { + ufbx_real weight = opts.weight; + if (opts.additive && opts.use_weight) { + for (size_t i = 0; i < num_read; i++) { + dst[i] += (ufbx_real)buffer[i] * weight; + } + } else if (opts.additive) { + for (size_t i = 0; i < num_read; i++) { + dst[i] += (ufbx_real)buffer[i]; + } + } else if (opts.use_weight) { + for (size_t i = 0; i < num_read; i++) { + dst[i] = (ufbx_real)buffer[i] * weight; + } + } else { + for (size_t i = 0; i < num_read; i++) { + dst[i] = (ufbx_real)buffer[i]; + } + } + dst += num_read; + } + + if (num_read != to_read) break; + } + } + + if (stream.close_fn) { + stream.close_fn(stream.user); + } + + return ufbxi_to_size(dst - data); +#else + return 0; +#endif +} + +ufbx_abi ufbxi_noinline size_t ufbx_sample_geometry_cache_real(const ufbx_cache_channel *channel, double time, ufbx_real *data, size_t count, const ufbx_geometry_cache_data_opts *user_opts) +{ +#if UFBXI_FEATURE_GEOMETRY_CACHE + if (!channel || count == 0) return 0; + ufbx_assert(data); + if (!data) return 0; + if (channel->frames.count == 0) return 0; + + ufbx_geometry_cache_data_opts opts; + if (user_opts) { + opts = *user_opts; + } else { + memset(&opts, 0, sizeof(opts)); + } + + // `ufbx_geometry_cache_data_opts` must be cleared to zero first! + ufbx_assert(opts._begin_zero == 0 && opts._end_zero == 0); + if (!(opts._begin_zero == 0 && opts._end_zero == 0)) return 0; + + size_t begin = 0; + size_t end = channel->frames.count; + const ufbx_cache_frame *frames = channel->frames.data; + while (end - begin >= 8) { + size_t mid = (begin + end) >> 1; + if (frames[mid].time < time) { + begin = mid + 1; + } else { + end = mid; + } + } + + const double eps = 0.00000001; + + end = channel->frames.count; + for (; begin < end; begin++) { + const ufbx_cache_frame *next = &frames[begin]; + if (next->time < time) continue; + + // First keyframe + if (begin == 0) { + return ufbx_read_geometry_cache_real(next, data, count, &opts); + } + + const ufbx_cache_frame *prev = next - 1; + + // Snap to exact frames if near + if (ufbx_fabs(next->time - time) < eps) { + return ufbx_read_geometry_cache_real(next, data, count, &opts); + } + if (ufbx_fabs(prev->time - time) < eps) { + return ufbx_read_geometry_cache_real(prev, data, count, &opts); + } + + double rcp_delta = 1.0 / (next->time - prev->time); + double t = (time - prev->time) * rcp_delta; + + ufbx_real original_weight = opts.use_weight ? opts.weight : 1.0f; + + opts.use_weight = true; + opts.weight = (ufbx_real)(original_weight * (1.0 - t)); + size_t num_prev = ufbx_read_geometry_cache_real(prev, data, count, &opts); + + opts.additive = true; + opts.weight = (ufbx_real)(original_weight * t); + return ufbx_read_geometry_cache_real(next, data, num_prev, &opts); + } + + // Last frame + const ufbx_cache_frame *last = &frames[end - 1]; + return ufbx_read_geometry_cache_real(last, data, count, &opts); +#else + return 0; +#endif +} + +ufbx_abi ufbxi_noinline size_t ufbx_read_geometry_cache_vec3(const ufbx_cache_frame *frame, ufbx_vec3 *data, size_t count, const ufbx_geometry_cache_data_opts *opts) +{ +#if UFBXI_FEATURE_GEOMETRY_CACHE + if (!frame || count == 0) return 0; + ufbx_assert(data); + if (!data) return 0; + return ufbx_read_geometry_cache_real(frame, (ufbx_real*)data, count * 3, opts) / 3; +#else + return 0; +#endif +} + +ufbx_abi ufbxi_noinline size_t ufbx_sample_geometry_cache_vec3(const ufbx_cache_channel *channel, double time, ufbx_vec3 *data, size_t count, const ufbx_geometry_cache_data_opts *opts) +{ +#if UFBXI_FEATURE_GEOMETRY_CACHE + if (!channel || count == 0) return 0; + ufbx_assert(data); + if (!data) return 0; + return ufbx_sample_geometry_cache_real(channel, time, (ufbx_real*)data, count * 3, opts) / 3; +#else + return 0; +#endif +} + +ufbx_abi ufbx_dom_node *ufbx_dom_find_len(const ufbx_dom_node *parent, const char *name, size_t name_len) +{ + ufbx_string ref = ufbxi_safe_string(name, name_len); + ufbxi_for_ptr_list(ufbx_dom_node, p_child, parent->children) { + if (ufbxi_str_equal((*p_child)->name, ref)) return (ufbx_dom_node*)*p_child; + } + return NULL; +} + +ufbx_abi size_t ufbx_generate_indices(const ufbx_vertex_stream *streams, size_t num_streams, uint32_t *indices, size_t num_indices, const ufbx_allocator_opts *allocator, ufbx_error *error) +{ + ufbx_error local_error; + if (!error) { + error = &local_error; + } + ufbxi_clear_error(error); + return ufbxi_generate_indices(streams, num_streams, indices, num_indices, allocator, error); +} + +ufbx_abi ufbx_real ufbx_catch_get_vertex_real(ufbx_panic *panic, const ufbx_vertex_real *v, size_t index) +{ + if (ufbxi_panicf(panic, index < v->indices.count, "index (%zu) out of range (%zu)", index, v->indices.count)) return 0.0f; + uint32_t ix = v->indices.data[index]; + if (ufbxi_panicf(panic, (size_t)ix < v->values.count || ix == UFBX_NO_INDEX, "Corrupted or missing vertex attribute (%u) at %zu", ix, index)) return 0.0f; + return v->values.data[(int32_t)ix]; +} + +ufbx_abi ufbx_vec2 ufbx_catch_get_vertex_vec2(ufbx_panic *panic, const ufbx_vertex_vec2 *v, size_t index) +{ + if (ufbxi_panicf(panic, index < v->indices.count, "index (%zu) out of range (%zu)", index, v->indices.count)) return ufbx_zero_vec2; + uint32_t ix = v->indices.data[index]; + if (ufbxi_panicf(panic, (size_t)ix < v->values.count || ix == UFBX_NO_INDEX, "Corrupted or missing vertex attribute (%u) at %zu", ix, index)) return ufbx_zero_vec2; + return v->values.data[(int32_t)ix]; +} + +ufbx_abi ufbx_vec3 ufbx_catch_get_vertex_vec3(ufbx_panic *panic, const ufbx_vertex_vec3 *v, size_t index) +{ + if (ufbxi_panicf(panic, index < v->indices.count, "index (%zu) out of range (%zu)", index, v->indices.count)) return ufbx_zero_vec3; + uint32_t ix = v->indices.data[index]; + if (ufbxi_panicf(panic, (size_t)ix < v->values.count || ix == UFBX_NO_INDEX, "Corrupted or missing vertex attribute (%u) at %zu", ix, index)) return ufbx_zero_vec3; + return v->values.data[(int32_t)ix]; +} + +ufbx_abi ufbx_vec4 ufbx_catch_get_vertex_vec4(ufbx_panic *panic, const ufbx_vertex_vec4 *v, size_t index) +{ + if (ufbxi_panicf(panic, index < v->indices.count, "index (%zu) out of range (%zu)", index, v->indices.count)) return ufbx_zero_vec4; + uint32_t ix = v->indices.data[index]; + if (ufbxi_panicf(panic, (size_t)ix < v->values.count || ix == UFBX_NO_INDEX, "Corrupted or missing vertex attribute (%u) at %zu", ix, index)) return ufbx_zero_vec4; + return v->values.data[(int32_t)ix]; +} + +ufbx_abi size_t ufbx_get_triangulate_face_num_indices(ufbx_face face) +{ + if (face.num_indices < 3) return 0; + return (face.num_indices - 2) * 3; +} + +ufbx_abi ufbx_unknown *ufbx_as_unknown(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_UNKNOWN ? (ufbx_unknown*)element : NULL; } +ufbx_abi ufbx_node *ufbx_as_node(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_NODE ? (ufbx_node*)element : NULL; } +ufbx_abi ufbx_mesh *ufbx_as_mesh(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_MESH ? (ufbx_mesh*)element : NULL; } +ufbx_abi ufbx_light *ufbx_as_light(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_LIGHT ? (ufbx_light*)element : NULL; } +ufbx_abi ufbx_camera *ufbx_as_camera(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_CAMERA ? (ufbx_camera*)element : NULL; } +ufbx_abi ufbx_bone *ufbx_as_bone(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_BONE ? (ufbx_bone*)element : NULL; } +ufbx_abi ufbx_empty *ufbx_as_empty(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_EMPTY ? (ufbx_empty*)element : NULL; } +ufbx_abi ufbx_line_curve *ufbx_as_line_curve(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_LINE_CURVE ? (ufbx_line_curve*)element : NULL; } +ufbx_abi ufbx_nurbs_curve *ufbx_as_nurbs_curve(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_NURBS_CURVE ? (ufbx_nurbs_curve*)element : NULL; } +ufbx_abi ufbx_nurbs_surface *ufbx_as_nurbs_surface(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_NURBS_SURFACE ? (ufbx_nurbs_surface*)element : NULL; } +ufbx_abi ufbx_nurbs_trim_surface *ufbx_as_nurbs_trim_surface(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_NURBS_TRIM_SURFACE ? (ufbx_nurbs_trim_surface*)element : NULL; } +ufbx_abi ufbx_nurbs_trim_boundary *ufbx_as_nurbs_trim_boundary(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_NURBS_TRIM_BOUNDARY ? (ufbx_nurbs_trim_boundary*)element : NULL; } +ufbx_abi ufbx_procedural_geometry *ufbx_as_procedural_geometry(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_PROCEDURAL_GEOMETRY ? (ufbx_procedural_geometry*)element : NULL; } +ufbx_abi ufbx_stereo_camera *ufbx_as_stereo_camera(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_STEREO_CAMERA ? (ufbx_stereo_camera*)element : NULL; } +ufbx_abi ufbx_camera_switcher *ufbx_as_camera_switcher(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_CAMERA_SWITCHER ? (ufbx_camera_switcher*)element : NULL; } +ufbx_abi ufbx_marker *ufbx_as_marker(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_MARKER ? (ufbx_marker*)element : NULL; } +ufbx_abi ufbx_lod_group *ufbx_as_lod_group(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_LOD_GROUP ? (ufbx_lod_group*)element : NULL; } +ufbx_abi ufbx_skin_deformer *ufbx_as_skin_deformer(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_SKIN_DEFORMER ? (ufbx_skin_deformer*)element : NULL; } +ufbx_abi ufbx_skin_cluster *ufbx_as_skin_cluster(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_SKIN_CLUSTER ? (ufbx_skin_cluster*)element : NULL; } +ufbx_abi ufbx_blend_deformer *ufbx_as_blend_deformer(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_BLEND_DEFORMER ? (ufbx_blend_deformer*)element : NULL; } +ufbx_abi ufbx_blend_channel *ufbx_as_blend_channel(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_BLEND_CHANNEL ? (ufbx_blend_channel*)element : NULL; } +ufbx_abi ufbx_blend_shape *ufbx_as_blend_shape(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_BLEND_SHAPE ? (ufbx_blend_shape*)element : NULL; } +ufbx_abi ufbx_cache_deformer *ufbx_as_cache_deformer(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_CACHE_DEFORMER ? (ufbx_cache_deformer*)element : NULL; } +ufbx_abi ufbx_cache_file *ufbx_as_cache_file(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_CACHE_FILE ? (ufbx_cache_file*)element : NULL; } +ufbx_abi ufbx_material *ufbx_as_material(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_MATERIAL ? (ufbx_material*)element : NULL; } +ufbx_abi ufbx_texture *ufbx_as_texture(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_TEXTURE ? (ufbx_texture*)element : NULL; } +ufbx_abi ufbx_video *ufbx_as_video(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_VIDEO ? (ufbx_video*)element : NULL; } +ufbx_abi ufbx_shader *ufbx_as_shader(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_SHADER ? (ufbx_shader*)element : NULL; } +ufbx_abi ufbx_shader_binding *ufbx_as_shader_binding(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_SHADER_BINDING ? (ufbx_shader_binding*)element : NULL; } +ufbx_abi ufbx_anim_stack *ufbx_as_anim_stack(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_ANIM_STACK ? (ufbx_anim_stack*)element : NULL; } +ufbx_abi ufbx_anim_layer *ufbx_as_anim_layer(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_ANIM_LAYER ? (ufbx_anim_layer*)element : NULL; } +ufbx_abi ufbx_anim_value *ufbx_as_anim_value(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_ANIM_VALUE ? (ufbx_anim_value*)element : NULL; } +ufbx_abi ufbx_anim_curve *ufbx_as_anim_curve(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_ANIM_CURVE ? (ufbx_anim_curve*)element : NULL; } +ufbx_abi ufbx_display_layer *ufbx_as_display_layer(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_DISPLAY_LAYER ? (ufbx_display_layer*)element : NULL; } +ufbx_abi ufbx_selection_set *ufbx_as_selection_set(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_SELECTION_SET ? (ufbx_selection_set*)element : NULL; } +ufbx_abi ufbx_selection_node *ufbx_as_selection_node(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_SELECTION_NODE ? (ufbx_selection_node*)element : NULL; } +ufbx_abi ufbx_character *ufbx_as_character(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_CHARACTER ? (ufbx_character*)element : NULL; } +ufbx_abi ufbx_constraint *ufbx_as_constraint(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_CONSTRAINT ? (ufbx_constraint*)element : NULL; } +ufbx_abi ufbx_pose *ufbx_as_pose(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_POSE ? (ufbx_pose*)element : NULL; } +ufbx_abi ufbx_metadata_object *ufbx_as_metadata_object(const ufbx_element *element) { return element && element->type == UFBX_ELEMENT_METADATA_OBJECT ? (ufbx_metadata_object*)element : NULL; } + +ufbx_abi void ufbx_ffi_find_int_len(int64_t *retval, const ufbx_props *props, const char *name, size_t name_len, const int64_t *def) +{ + *retval = ufbx_find_int_len(props, name, name_len, *def); +} + +ufbx_abi void ufbx_ffi_find_vec3_len(ufbx_vec3 *retval, const ufbx_props *props, const char *name, size_t name_len, const ufbx_vec3 *def) +{ + *retval = ufbx_find_vec3_len(props, name, name_len, *def); +} + +ufbx_abi void ufbx_ffi_find_string_len(ufbx_string *retval, const ufbx_props *props, const char *name, size_t name_len, const ufbx_string *def) +{ + *retval = ufbx_find_string_len(props, name, name_len, *def); +} + +ufbx_abi void ufbx_ffi_find_anim_props(ufbx_anim_prop_list *retval, const ufbx_anim_layer *layer, const ufbx_element *element) +{ + *retval = ufbx_find_anim_props(layer, element); +} + +ufbx_abi void ufbx_ffi_get_compatible_matrix_for_normals(ufbx_matrix *retval, const ufbx_node *node) +{ + *retval = ufbx_get_compatible_matrix_for_normals(node); +} + +ufbx_abi void ufbx_ffi_evaluate_anim_value_vec2(ufbx_vec2 *retval, const ufbx_anim_value *anim_value, double time) +{ + *retval = ufbx_evaluate_anim_value_vec2(anim_value, time); +} + +ufbx_abi void ufbx_ffi_evaluate_anim_value_vec3(ufbx_vec3 *retval, const ufbx_anim_value *anim_value, double time) +{ + *retval = ufbx_evaluate_anim_value_vec3(anim_value, time); +} + +ufbx_abi void ufbx_ffi_evaluate_prop_len(ufbx_prop *retval, const ufbx_anim *anim, const ufbx_element *element, const char *name, size_t name_len, double time) +{ + *retval = ufbx_evaluate_prop_len(anim, element, name, name_len, time); +} + +ufbx_abi void ufbx_ffi_evaluate_props(ufbx_props *retval, const ufbx_anim *anim, ufbx_element *element, double time, ufbx_prop *buffer, size_t buffer_size) +{ + *retval = ufbx_evaluate_props(anim, element, time, buffer, buffer_size); +} + +ufbx_abi void ufbx_ffi_evaluate_transform(ufbx_transform *retval, const ufbx_anim *anim, const ufbx_node *node, double time) +{ + *retval = ufbx_evaluate_transform(anim, node, time); +} + +ufbx_abi ufbx_real ufbx_ffi_evaluate_blend_weight(const ufbx_anim *anim, const ufbx_blend_channel *channel, double time) +{ + return ufbx_evaluate_blend_weight(anim, channel, time); +} + +ufbx_abi void ufbx_ffi_prepare_prop_overrides(ufbx_const_prop_override_list *retval, ufbx_prop_override *overrides, size_t num_overrides) +{ + *retval = ufbx_prepare_prop_overrides(overrides, num_overrides); +} + +ufbx_abi void ufbx_ffi_quat_mul(ufbx_quat *retval, const ufbx_quat *a, const ufbx_quat *b) +{ + *retval = ufbx_quat_mul(*a, *b); +} + +ufbx_abi void ufbx_ffi_quat_normalize(ufbx_quat *retval, const ufbx_quat *q) +{ + *retval = ufbx_quat_normalize(*q); +} + +ufbx_abi void ufbx_ffi_quat_fix_antipodal(ufbx_quat *retval, const ufbx_quat *q, const ufbx_quat *reference) +{ + *retval = ufbx_quat_fix_antipodal(*q, *reference); +} + +ufbx_abi void ufbx_ffi_quat_slerp(ufbx_quat *retval, const ufbx_quat *a, const ufbx_quat *b, ufbx_real t) +{ + *retval = ufbx_quat_slerp(*a, *b, t); +} + +ufbx_abi void ufbx_ffi_quat_rotate_vec3(ufbx_vec3 *retval, const ufbx_quat *q, const ufbx_vec3 *v) +{ + *retval = ufbx_quat_rotate_vec3(*q, *v); +} + +ufbx_abi void ufbx_ffi_quat_to_euler(ufbx_vec3 *retval, const ufbx_quat *q, ufbx_rotation_order order) +{ + *retval = ufbx_quat_to_euler(*q, order); +} + +ufbx_abi void ufbx_ffi_euler_to_quat(ufbx_quat *retval, const ufbx_vec3 *v, ufbx_rotation_order order) +{ + *retval = ufbx_euler_to_quat(*v, order); +} + +ufbx_abi void ufbx_ffi_matrix_mul(ufbx_matrix *retval, const ufbx_matrix *a, const ufbx_matrix *b) +{ + *retval = ufbx_matrix_mul(a, b); +} + +ufbx_abi void ufbx_ffi_matrix_invert(ufbx_matrix *retval, const ufbx_matrix *m) +{ + *retval = ufbx_matrix_invert(m); +} + +ufbx_abi void ufbx_ffi_matrix_for_normals(ufbx_matrix *retval, const ufbx_matrix *m) +{ + *retval = ufbx_matrix_for_normals(m); +} + +ufbx_abi void ufbx_ffi_transform_position(ufbx_vec3 *retval, const ufbx_matrix *m, const ufbx_vec3 *v) +{ + *retval = ufbx_transform_position(m, *v); +} + +ufbx_abi void ufbx_ffi_transform_direction(ufbx_vec3 *retval, const ufbx_matrix *m, const ufbx_vec3 *v) +{ + *retval = ufbx_transform_direction(m, *v); +} + +ufbx_abi void ufbx_ffi_transform_to_matrix(ufbx_matrix *retval, const ufbx_transform *t) +{ + *retval = ufbx_transform_to_matrix(t); +} + +ufbx_abi void ufbx_ffi_matrix_to_transform(ufbx_transform *retval, const ufbx_matrix *m) +{ + *retval = ufbx_matrix_to_transform(m); +} + +ufbx_abi void ufbx_ffi_get_skin_vertex_matrix(ufbx_matrix *retval, const ufbx_skin_deformer *skin, size_t vertex, const ufbx_matrix *fallback) +{ + *retval = ufbx_get_skin_vertex_matrix(skin, vertex, fallback); +} + +ufbx_abi void ufbx_ffi_get_blend_shape_vertex_offset(ufbx_vec3 *retval, const ufbx_blend_shape *shape, size_t vertex) +{ + *retval = ufbx_get_blend_shape_vertex_offset(shape, vertex); +} + +ufbx_abi void ufbx_ffi_get_blend_vertex_offset(ufbx_vec3 *retval, const ufbx_blend_deformer *blend, size_t vertex) +{ + *retval = ufbx_get_blend_vertex_offset(blend, vertex); +} + +ufbx_abi void ufbx_ffi_evaluate_nurbs_curve(ufbx_curve_point *retval, const ufbx_nurbs_curve *curve, ufbx_real u) +{ + *retval = ufbx_evaluate_nurbs_curve(curve, u); +} + +ufbx_abi void ufbx_ffi_evaluate_nurbs_surface(ufbx_surface_point *retval, const ufbx_nurbs_surface *surface, ufbx_real u, ufbx_real v) +{ + *retval = ufbx_evaluate_nurbs_surface(surface, u, v); +} + +ufbx_abi void ufbx_ffi_get_weighted_face_normal(ufbx_vec3 *retval, const ufbx_vertex_vec3 *positions, const ufbx_face *face) +{ + *retval = ufbx_get_weighted_face_normal(positions, *face); +} + +ufbx_abi uint32_t ufbx_ffi_triangulate_face(uint32_t *indices, size_t num_indices, const ufbx_mesh *mesh, const ufbx_face *face) +{ + return ufbx_triangulate_face(indices, num_indices, mesh, *face); +} + +ufbx_abi size_t ufbx_ffi_get_triangulate_face_num_indices(const ufbx_face *face) +{ + return ufbx_get_triangulate_face_num_indices(*face); +} + +#ifdef __cplusplus +} +#endif + +#endif + +#if defined(_MSC_VER) + #pragma warning(pop) +#elif defined(__clang__) + #pragma clang diagnostic pop +#elif defined(__GNUC__) + #pragma GCC diagnostic pop +#endif + diff --git a/modules/ufbx/ufbx.h b/modules/ufbx/ufbx.h new file mode 100644 index 0000000..9030478 --- /dev/null +++ b/modules/ufbx/ufbx.h @@ -0,0 +1,4702 @@ +#ifndef UFBX_UFBX_H_INCLUDED +#define UFBX_UFBX_H_INCLUDED + +// -- User configuration + +#if defined(UFBX_CONFIG_HEADER) + #include UFBX_CONFIG_HEADER +#endif + +// -- Headers + +#include +#include +#include +#include + +// -- Platform + +#ifndef UFBX_STDC + #if defined(__STDC_VERSION__) + #define UFBX_STDC __STDC_VERSION__ + #else + #define UFBX_STDC 0 + #endif +#endif + +#ifndef UFBX_CPP + #if defined(__cplusplus) + #define UFBX_CPP __cplusplus + #else + #define UFBX_CPP 0 + #endif +#endif + +#ifndef UFBX_PLATFORM_MSC + #if !defined(UFBX_STANDARD_C) && defined(_MSC_VER) + #define UFBX_PLATFORM_MSC _MSC_VER + #else + #define UFBX_PLATFORM_MSC 0 + #endif +#endif + +#ifndef UFBX_PLATFORM_GNUC + #if !defined(UFBX_STANDARD_C) && defined(__GNUC__) + #define UFBX_PLATFORM_GNUC __GNUC__ + #else + #define UFBX_PLATFORM_GNUC 0 + #endif +#endif + +#ifndef UFBX_CPP11 + // MSVC does not advertise C++11 by default so we need special detection + #if UFBX_CPP >= 201103L || (UFBX_CPP > 0 && UFBX_PLATFORM_MSC >= 1900) + #define UFBX_CPP11 1 + #else + #define UFBX_CPP11 0 + #endif +#endif + +#if defined(_MSC_VER) + #pragma warning(push) + #pragma warning(disable: 4201) // nonstandard extension used: nameless struct/union + #pragma warning(disable: 4505) // unreferenced local function has been removed +#elif defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpedantic" + #if defined(__cplusplus) + #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" + #endif +#elif defined(__GNUC__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpedantic" + #if defined(__cplusplus) + #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" + #endif +#endif + +#if UFBX_PLATFORM_MSC + #define ufbx_inline static __forceinline +#elif UFBX_PLATFORM_GNUC + #define ufbx_inline static inline __attribute__((always_inline, unused)) +#else + #define ufbx_inline static +#endif + +#ifndef ufbx_assert + #if !defined(UFBX_NO_ASSERT) + #include + #define ufbx_assert(cond) assert(cond) + #else + #define ufbx_assert(cond) (void)0 + #endif +#endif + +// Pointer may be `NULL`. +#define ufbx_nullable + +// Changing this value from default can lead into breaking API guarantees. +#define ufbx_unsafe + +#ifndef ufbx_abi + #define ufbx_abi +#endif + +// -- Configuration + +// TODO: Support overriding `ufbx_real` with `float` or anything else. +typedef double ufbx_real; + +#define UFBX_ERROR_STACK_MAX_DEPTH 8 +#define UFBX_PANIC_MESSAGE_LENGTH 128 +#define UFBX_ERROR_INFO_LENGTH 256 + +// -- Language + +#if defined(__cplusplus) + #define UFBX_LIST_TYPE(p_name, p_type) struct p_name { p_type *data; size_t count; \ + p_type &operator[](size_t index) const { ufbx_assert(index < count); return data[index]; } \ + p_type *begin() const { return data; } \ + p_type *end() const { return data + count; } } +#else + #define UFBX_LIST_TYPE(p_name, p_type) typedef struct p_name { p_type *data; size_t count; } p_name +#endif + +#if UFBX_STDC >= 202311L || UFBX_CPP11 + #define UFBX_ENUM_REPR : int + #define UFBX_ENUM_FORCE_WIDTH(p_prefix) + #define UFBX_FLAG_REPR : int + #define UFBX_FLAG_FORCE_WIDTH(p_prefix) +#else + #define UFBX_ENUM_REPR + #define UFBX_ENUM_FORCE_WIDTH(p_prefix) p_prefix##_FORCE_32BIT = 0x7fffffff + #define UFBX_FLAG_REPR + #define UFBX_FLAG_FORCE_WIDTH(p_prefix) p_prefix##_FORCE_32BIT = 0x7fffffff +#endif + +#define UFBX_ENUM_TYPE(p_name, p_prefix, p_last) \ + enum { p_prefix##_COUNT = p_last + 1 } + +#if UFBX_CPP + #define UFBX_VERTEX_ATTRIB_IMPL(p_type) \ + p_type &operator[](size_t index) const { ufbx_assert(index < indices.count); return values.data[indices.data[index]]; } +#else + #define UFBX_VERTEX_ATTRIB_IMPL(p_type) +#endif + +#if UFBX_CPP11 + #define UFBX_CALLBACK_IMPL(p_name, p_fn, p_return, p_params, p_args) \ + template static p_return _cpp_adapter p_params { F &f = *static_cast(user); return f p_args; } \ + p_name() = default; \ + p_name(p_fn *f) : fn(f), user(nullptr) { } \ + template p_name(F *f) : fn(&_cpp_adapter), user(static_cast(f)) { } +#else + #define UFBX_CALLBACK_IMPL(p_name, p_fn, p_return, p_params, p_args) +#endif + +// -- Version + +#define ufbx_pack_version(major, minor, patch) ((uint32_t)(major)*1000000u + (uint32_t)(minor)*1000u + (uint32_t)(patch)) +#define ufbx_version_major(version) ((uint32_t)(version)/1000000u%1000u) +#define ufbx_version_minor(version) ((uint32_t)(version)/1000u%1000u) +#define ufbx_version_patch(version) ((uint32_t)(version)%1000u) + +#define UFBX_HEADER_VERSION ufbx_pack_version(0, 3, 1) +#define UFBX_VERSION UFBX_HEADER_VERSION + +// -- Basic types + +#define UFBX_NO_INDEX ((uint32_t)~0u) + +// Null-terminated UTF-8 encoded string within an FBX file +typedef struct ufbx_string { + const char *data; + size_t length; +} ufbx_string; + +// Opaque byte buffer blob +typedef struct ufbx_blob { + const void *data; + size_t size; +} ufbx_blob; + +// 2D vector +typedef struct ufbx_vec2 { + union { + struct { ufbx_real x, y; }; + ufbx_real v[2]; + }; +} ufbx_vec2; + +// 3D vector +typedef struct ufbx_vec3 { + union { + struct { ufbx_real x, y, z; }; + ufbx_real v[3]; + }; +} ufbx_vec3; + +// 4D vector +typedef struct ufbx_vec4 { + union { + struct { ufbx_real x, y, z, w; }; + ufbx_real v[4]; + }; +} ufbx_vec4; + +// Quaternion +typedef struct ufbx_quat { + union { + struct { ufbx_real x, y, z, w; }; + ufbx_real v[4]; + }; +} ufbx_quat; + +// Order in which Euler-angle rotation axes are applied for a transform +// NOTE: The order in the name refers to the order of axes *applied*, +// not the multiplication order: eg. `UFBX_ROTATION_XYZ` is `Z*Y*X` +// [TODO: Figure out what the spheric rotation order is...] +typedef enum ufbx_rotation_order UFBX_ENUM_REPR { + UFBX_ROTATION_ORDER_XYZ, + UFBX_ROTATION_ORDER_XZY, + UFBX_ROTATION_ORDER_YZX, + UFBX_ROTATION_ORDER_YXZ, + UFBX_ROTATION_ORDER_ZXY, + UFBX_ROTATION_ORDER_ZYX, + UFBX_ROTATION_ORDER_SPHERIC, + + UFBX_ENUM_FORCE_WIDTH(UFBX_ROTATION_ORDER) +} ufbx_rotation_order; + +UFBX_ENUM_TYPE(ufbx_rotation_order, UFBX_ROTATION_ORDER, UFBX_ROTATION_ORDER_SPHERIC); + +// Explicit translation+rotation+scale transformation. +// NOTE: Rotation is a quaternion, not Euler angles! +typedef struct ufbx_transform { + ufbx_vec3 translation; + ufbx_quat rotation; + ufbx_vec3 scale; +} ufbx_transform; + +// 4x3 matrix encoding an affine transformation. +// `cols[0..2]` are the X/Y/Z basis vectors, `cols[3]` is the translation +typedef struct ufbx_matrix { + union { + struct { + ufbx_real m00, m10, m20; + ufbx_real m01, m11, m21; + ufbx_real m02, m12, m22; + ufbx_real m03, m13, m23; + }; + ufbx_vec3 cols[4]; + ufbx_real v[12]; + }; +} ufbx_matrix; + +typedef struct ufbx_void_list { + void *data; + size_t count; +} ufbx_void_list; + +UFBX_LIST_TYPE(ufbx_bool_list, bool); +UFBX_LIST_TYPE(ufbx_uint32_list, uint32_t); +UFBX_LIST_TYPE(ufbx_real_list, ufbx_real); +UFBX_LIST_TYPE(ufbx_vec2_list, ufbx_vec2); +UFBX_LIST_TYPE(ufbx_vec3_list, ufbx_vec3); +UFBX_LIST_TYPE(ufbx_vec4_list, ufbx_vec4); +UFBX_LIST_TYPE(ufbx_string_list, ufbx_string); + +// -- Document object model + +typedef enum ufbx_dom_value_type UFBX_ENUM_REPR { + UFBX_DOM_VALUE_NUMBER, + UFBX_DOM_VALUE_STRING, + UFBX_DOM_VALUE_ARRAY_I8, + UFBX_DOM_VALUE_ARRAY_I32, + UFBX_DOM_VALUE_ARRAY_I64, + UFBX_DOM_VALUE_ARRAY_F32, + UFBX_DOM_VALUE_ARRAY_F64, + UFBX_DOM_VALUE_ARRAY_RAW_STRING, + UFBX_DOM_VALUE_ARRAY_IGNORED, + + UFBX_ENUM_FORCE_WIDTH(UFBX_DOM_VALUE_TYPE) +} ufbx_dom_value_type; + +UFBX_ENUM_TYPE(ufbx_dom_value_type, UFBX_DOM_VALUE_TYPE, UFBX_DOM_VALUE_ARRAY_IGNORED); + +typedef struct ufbx_dom_node ufbx_dom_node; + +typedef struct ufbx_dom_value { + ufbx_dom_value_type type; + ufbx_string value_str; + ufbx_blob value_blob; + int64_t value_int; + double value_float; +} ufbx_dom_value; + +UFBX_LIST_TYPE(ufbx_dom_node_list, ufbx_dom_node*); +UFBX_LIST_TYPE(ufbx_dom_value_list, ufbx_dom_value); + +struct ufbx_dom_node { + ufbx_string name; + ufbx_dom_node_list children; + ufbx_dom_value_list values; +}; + +// -- Properties + +// FBX elements have properties which are arbitrary key/value pairs that can +// have inherited default values or be animated. In most cases you don't need +// to access these unless you need a feature not implemented directly in ufbx. +// NOTE: Prefer using `ufbx_find_prop[_len](...)` to search for a property by +// name as it can find it from the defaults if necessary. + +typedef struct ufbx_prop ufbx_prop; +typedef struct ufbx_props ufbx_props; + +// Data type contained within the property. All the data fields are always +// populated regardless of type, so there's no need to switch by type usually +// eg. `prop->value_real` and `prop->value_int` have the same value (well, close) +// if `prop->type == UFBX_PROP_INTEGER`. String values are not converted from/to. +typedef enum ufbx_prop_type UFBX_ENUM_REPR { + UFBX_PROP_UNKNOWN, + UFBX_PROP_BOOLEAN, + UFBX_PROP_INTEGER, + UFBX_PROP_NUMBER, + UFBX_PROP_VECTOR, + UFBX_PROP_COLOR, + UFBX_PROP_COLOR_WITH_ALPHA, + UFBX_PROP_STRING, + UFBX_PROP_DATE_TIME, + UFBX_PROP_TRANSLATION, + UFBX_PROP_ROTATION, + UFBX_PROP_SCALING, + UFBX_PROP_DISTANCE, + UFBX_PROP_COMPOUND, + UFBX_PROP_BLOB, + UFBX_PROP_REFERENCE, + + UFBX_ENUM_FORCE_WIDTH(UFBX_PROP_TYPE) +} ufbx_prop_type; + +UFBX_ENUM_TYPE(ufbx_prop_type, UFBX_PROP_TYPE, UFBX_PROP_REFERENCE); + +// Property flags: Advanced information about properties, not usually needed. +typedef enum ufbx_prop_flags UFBX_FLAG_REPR { + // Supports animation. + // NOTE: ufbx ignores this and allows animations on non-animatable properties. + UFBX_PROP_FLAG_ANIMATABLE = 0x1, + + // User defined (custom) property. + UFBX_PROP_FLAG_USER_DEFINED = 0x2, + + // Hidden in UI. + UFBX_PROP_FLAG_HIDDEN = 0x4, + + // Disallow modification from UI for components. + UFBX_PROP_FLAG_LOCK_X = 0x10, + UFBX_PROP_FLAG_LOCK_Y = 0x20, + UFBX_PROP_FLAG_LOCK_Z = 0x40, + UFBX_PROP_FLAG_LOCK_W = 0x80, + + // Disable animation from components. + UFBX_PROP_FLAG_MUTE_X = 0x100, + UFBX_PROP_FLAG_MUTE_Y = 0x200, + UFBX_PROP_FLAG_MUTE_Z = 0x400, + UFBX_PROP_FLAG_MUTE_W = 0x800, + + // Property created by ufbx when an element has a connected `ufbx_anim_prop` + // but doesn't contain the `ufbx_prop` it's referring to. + // NOTE: The property may have been found in the templated defaults. + UFBX_PROP_FLAG_SYNTHETIC = 0x1000, + + // The property has at least one `ufbx_anim_prop` in some layer. + UFBX_PROP_FLAG_ANIMATED = 0x2000, + + // Used by `ufbx_evaluate_prop()` to indicate the the property was not found. + UFBX_PROP_FLAG_NOT_FOUND = 0x4000, + + // The property is connected to another one. + // This use case is relatively rare so `ufbx_prop` does not track connections + // directly. You can find connections from `ufbx_element.connections_dst` where + // `ufbx_connection.dst_prop` is this property and `ufbx_connection.src_prop` is defined. + UFBX_PROP_FLAG_CONNECTED = 0x8000, + + // The value of this property is undefined (represented as zero). + UFBX_PROP_FLAG_NO_VALUE = 0x10000, + + // This property has been overridden by the user. + // See `ufbx_anim.prop_overrides` for more information. + UFBX_PROP_FLAG_OVERRIDDEN = 0x20000, + + // Value type. + // `REAL/VEC2/VEC3/VEC4` are mutually exclusive but may coexist with eg. `STRING` + // in some rare cases where the string defines the unit for the vector. + UFBX_PROP_FLAG_VALUE_REAL = 0x100000, + UFBX_PROP_FLAG_VALUE_VEC2 = 0x200000, + UFBX_PROP_FLAG_VALUE_VEC3 = 0x400000, + UFBX_PROP_FLAG_VALUE_VEC4 = 0x800000, + UFBX_PROP_FLAG_VALUE_INT = 0x1000000, + UFBX_PROP_FLAG_VALUE_STR = 0x2000000, + UFBX_PROP_FLAG_VALUE_BLOB = 0x4000000, + + UFBX_FLAG_FORCE_WIDTH(UFBX_PROP_FLAGS) +} ufbx_prop_flags; + +// Single property with name/type/value. +struct ufbx_prop { + ufbx_string name; + uint32_t _internal_key; + ufbx_prop_type type; + ufbx_prop_flags flags; + + ufbx_string value_str; + ufbx_blob value_blob; + int64_t value_int; + union { + ufbx_real value_real_arr[4]; + ufbx_real value_real; + ufbx_vec2 value_vec2; + ufbx_vec3 value_vec3; + ufbx_vec4 value_vec4; + }; +}; + +UFBX_LIST_TYPE(ufbx_prop_list, ufbx_prop); + +// List of alphabetically sorted properties with potential defaults. +// For animated objects in as scene from `ufbx_evaluate_scene()` this list +// only has the animated properties, the originals are stored under `defaults`. +struct ufbx_props { + ufbx_prop_list props; + size_t num_animated; + + ufbx_nullable ufbx_props *defaults; +}; + +typedef struct ufbx_scene ufbx_scene; + +// -- Elements + +// Element is the lowest level representation of the FBX file in ufbx. +// An element contains type, id, name, and properties (see `ufbx_props` above) +// Elements may be connected to each other arbitrarily via `ufbx_connection` + +typedef struct ufbx_element ufbx_element; + +// Unknown +typedef struct ufbx_unknown ufbx_unknown; + +// Nodes +typedef struct ufbx_node ufbx_node; + +// Node attributes (common) +typedef struct ufbx_mesh ufbx_mesh; +typedef struct ufbx_light ufbx_light; +typedef struct ufbx_camera ufbx_camera; +typedef struct ufbx_bone ufbx_bone; +typedef struct ufbx_empty ufbx_empty; + +// Node attributes (curves/surfaces) +typedef struct ufbx_line_curve ufbx_line_curve; +typedef struct ufbx_nurbs_curve ufbx_nurbs_curve; +typedef struct ufbx_nurbs_surface ufbx_nurbs_surface; +typedef struct ufbx_nurbs_trim_surface ufbx_nurbs_trim_surface; +typedef struct ufbx_nurbs_trim_boundary ufbx_nurbs_trim_boundary; + +// Node attributes (advanced) +typedef struct ufbx_procedural_geometry ufbx_procedural_geometry; +typedef struct ufbx_stereo_camera ufbx_stereo_camera; +typedef struct ufbx_camera_switcher ufbx_camera_switcher; +typedef struct ufbx_marker ufbx_marker; +typedef struct ufbx_lod_group ufbx_lod_group; + +// Deformers +typedef struct ufbx_skin_deformer ufbx_skin_deformer; +typedef struct ufbx_skin_cluster ufbx_skin_cluster; +typedef struct ufbx_blend_deformer ufbx_blend_deformer; +typedef struct ufbx_blend_channel ufbx_blend_channel; +typedef struct ufbx_blend_shape ufbx_blend_shape; +typedef struct ufbx_cache_deformer ufbx_cache_deformer; +typedef struct ufbx_cache_file ufbx_cache_file; + +// Materials +typedef struct ufbx_material ufbx_material; +typedef struct ufbx_texture ufbx_texture; +typedef struct ufbx_video ufbx_video; +typedef struct ufbx_shader ufbx_shader; +typedef struct ufbx_shader_binding ufbx_shader_binding; + +// Animation +typedef struct ufbx_anim_stack ufbx_anim_stack; +typedef struct ufbx_anim_layer ufbx_anim_layer; +typedef struct ufbx_anim_value ufbx_anim_value; +typedef struct ufbx_anim_curve ufbx_anim_curve; + +// Collections +typedef struct ufbx_display_layer ufbx_display_layer; +typedef struct ufbx_selection_set ufbx_selection_set; +typedef struct ufbx_selection_node ufbx_selection_node; + +// Constraints +typedef struct ufbx_character ufbx_character; +typedef struct ufbx_constraint ufbx_constraint; + +// Miscellaneous +typedef struct ufbx_pose ufbx_pose; +typedef struct ufbx_metadata_object ufbx_metadata_object; + +UFBX_LIST_TYPE(ufbx_element_list, ufbx_element*); +UFBX_LIST_TYPE(ufbx_unknown_list, ufbx_unknown*); +UFBX_LIST_TYPE(ufbx_node_list, ufbx_node*); +UFBX_LIST_TYPE(ufbx_mesh_list, ufbx_mesh*); +UFBX_LIST_TYPE(ufbx_light_list, ufbx_light*); +UFBX_LIST_TYPE(ufbx_camera_list, ufbx_camera*); +UFBX_LIST_TYPE(ufbx_bone_list, ufbx_bone*); +UFBX_LIST_TYPE(ufbx_empty_list, ufbx_empty*); +UFBX_LIST_TYPE(ufbx_line_curve_list, ufbx_line_curve*); +UFBX_LIST_TYPE(ufbx_nurbs_curve_list, ufbx_nurbs_curve*); +UFBX_LIST_TYPE(ufbx_nurbs_surface_list, ufbx_nurbs_surface*); +UFBX_LIST_TYPE(ufbx_nurbs_trim_surface_list, ufbx_nurbs_trim_surface*); +UFBX_LIST_TYPE(ufbx_nurbs_trim_boundary_list, ufbx_nurbs_trim_boundary*); +UFBX_LIST_TYPE(ufbx_procedural_geometry_list, ufbx_procedural_geometry*); +UFBX_LIST_TYPE(ufbx_stereo_camera_list, ufbx_stereo_camera*); +UFBX_LIST_TYPE(ufbx_camera_switcher_list, ufbx_camera_switcher*); +UFBX_LIST_TYPE(ufbx_marker_list, ufbx_marker*); +UFBX_LIST_TYPE(ufbx_lod_group_list, ufbx_lod_group*); +UFBX_LIST_TYPE(ufbx_skin_deformer_list, ufbx_skin_deformer*); +UFBX_LIST_TYPE(ufbx_skin_cluster_list, ufbx_skin_cluster*); +UFBX_LIST_TYPE(ufbx_blend_deformer_list, ufbx_blend_deformer*); +UFBX_LIST_TYPE(ufbx_blend_channel_list, ufbx_blend_channel*); +UFBX_LIST_TYPE(ufbx_blend_shape_list, ufbx_blend_shape*); +UFBX_LIST_TYPE(ufbx_cache_deformer_list, ufbx_cache_deformer*); +UFBX_LIST_TYPE(ufbx_cache_file_list, ufbx_cache_file*); +UFBX_LIST_TYPE(ufbx_material_list, ufbx_material*); +UFBX_LIST_TYPE(ufbx_texture_list, ufbx_texture*); +UFBX_LIST_TYPE(ufbx_video_list, ufbx_video*); +UFBX_LIST_TYPE(ufbx_shader_list, ufbx_shader*); +UFBX_LIST_TYPE(ufbx_shader_binding_list, ufbx_shader_binding*); +UFBX_LIST_TYPE(ufbx_anim_stack_list, ufbx_anim_stack*); +UFBX_LIST_TYPE(ufbx_anim_layer_list, ufbx_anim_layer*); +UFBX_LIST_TYPE(ufbx_anim_value_list, ufbx_anim_value*); +UFBX_LIST_TYPE(ufbx_anim_curve_list, ufbx_anim_curve*); +UFBX_LIST_TYPE(ufbx_display_layer_list, ufbx_display_layer*); +UFBX_LIST_TYPE(ufbx_selection_set_list, ufbx_selection_set*); +UFBX_LIST_TYPE(ufbx_selection_node_list, ufbx_selection_node*); +UFBX_LIST_TYPE(ufbx_character_list, ufbx_character*); +UFBX_LIST_TYPE(ufbx_constraint_list, ufbx_constraint*); +UFBX_LIST_TYPE(ufbx_pose_list, ufbx_pose*); +UFBX_LIST_TYPE(ufbx_metadata_object_list, ufbx_metadata_object*); + +typedef enum ufbx_element_type UFBX_ENUM_REPR { + UFBX_ELEMENT_UNKNOWN, // < `ufbx_unknown` + UFBX_ELEMENT_NODE, // < `ufbx_node` + UFBX_ELEMENT_MESH, // < `ufbx_mesh` + UFBX_ELEMENT_LIGHT, // < `ufbx_light` + UFBX_ELEMENT_CAMERA, // < `ufbx_camera` + UFBX_ELEMENT_BONE, // < `ufbx_bone` + UFBX_ELEMENT_EMPTY, // < `ufbx_empty` + UFBX_ELEMENT_LINE_CURVE, // < `ufbx_line_curve` + UFBX_ELEMENT_NURBS_CURVE, // < `ufbx_nurbs_curve` + UFBX_ELEMENT_NURBS_SURFACE, // < `ufbx_nurbs_surface` + UFBX_ELEMENT_NURBS_TRIM_SURFACE, // < `ufbx_nurbs_trim_surface` + UFBX_ELEMENT_NURBS_TRIM_BOUNDARY, // < `ufbx_nurbs_trim_boundary` + UFBX_ELEMENT_PROCEDURAL_GEOMETRY, // < `ufbx_procedural_geometry` + UFBX_ELEMENT_STEREO_CAMERA, // < `ufbx_stereo_camera` + UFBX_ELEMENT_CAMERA_SWITCHER, // < `ufbx_camera_switcher` + UFBX_ELEMENT_MARKER, // < `ufbx_marker` + UFBX_ELEMENT_LOD_GROUP, // < `ufbx_lod_group` + UFBX_ELEMENT_SKIN_DEFORMER, // < `ufbx_skin_deformer` + UFBX_ELEMENT_SKIN_CLUSTER, // < `ufbx_skin_cluster` + UFBX_ELEMENT_BLEND_DEFORMER, // < `ufbx_blend_deformer` + UFBX_ELEMENT_BLEND_CHANNEL, // < `ufbx_blend_channel` + UFBX_ELEMENT_BLEND_SHAPE, // < `ufbx_blend_shape` + UFBX_ELEMENT_CACHE_DEFORMER, // < `ufbx_cache_deformer` + UFBX_ELEMENT_CACHE_FILE, // < `ufbx_cache_file` + UFBX_ELEMENT_MATERIAL, // < `ufbx_material` + UFBX_ELEMENT_TEXTURE, // < `ufbx_texture` + UFBX_ELEMENT_VIDEO, // < `ufbx_video` + UFBX_ELEMENT_SHADER, // < `ufbx_shader` + UFBX_ELEMENT_SHADER_BINDING, // < `ufbx_shader_binding` + UFBX_ELEMENT_ANIM_STACK, // < `ufbx_anim_stack` + UFBX_ELEMENT_ANIM_LAYER, // < `ufbx_anim_layer` + UFBX_ELEMENT_ANIM_VALUE, // < `ufbx_anim_value` + UFBX_ELEMENT_ANIM_CURVE, // < `ufbx_anim_curve` + UFBX_ELEMENT_DISPLAY_LAYER, // < `ufbx_display_layer` + UFBX_ELEMENT_SELECTION_SET, // < `ufbx_selection_set` + UFBX_ELEMENT_SELECTION_NODE, // < `ufbx_selection_node` + UFBX_ELEMENT_CHARACTER, // < `ufbx_character` + UFBX_ELEMENT_CONSTRAINT, // < `ufbx_constraint` + UFBX_ELEMENT_POSE, // < `ufbx_pose` + UFBX_ELEMENT_METADATA_OBJECT, // < `ufbx_metadata_object` + + UFBX_ELEMENT_TYPE_FIRST_ATTRIB = UFBX_ELEMENT_MESH, + UFBX_ELEMENT_TYPE_LAST_ATTRIB = UFBX_ELEMENT_LOD_GROUP, + + UFBX_ENUM_FORCE_WIDTH(UFBX_ELEMENT_TYPE) +} ufbx_element_type; + +UFBX_ENUM_TYPE(ufbx_element_type, UFBX_ELEMENT_TYPE, UFBX_ELEMENT_METADATA_OBJECT); + +// Connection between two elements. +// Source and destination are somewhat arbitrary but the destination is +// often the "container" like a parent node or mesh containing a deformer. +typedef struct ufbx_connection { + ufbx_element *src; + ufbx_element *dst; + ufbx_string src_prop; + ufbx_string dst_prop; +} ufbx_connection; + +UFBX_LIST_TYPE(ufbx_connection_list, ufbx_connection); + +// Element "base-class" common to each element. +// Some fields (like `connections_src`) are advanced and not visible +// in the specialized element structs. +// NOTE: The `element_id` value is consistent when loading the +// _same_ file, but re-exporting the file will invalidate them. (TOMOVE) +struct ufbx_element { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + ufbx_element_type type; + ufbx_connection_list connections_src; + ufbx_connection_list connections_dst; + ufbx_nullable ufbx_dom_node *dom_node; + ufbx_scene *scene; +}; + +// -- Unknown + +struct ufbx_unknown { + // Shared "base-class" header, see `ufbx_element`. + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // FBX format specific type information. + // In ASCII FBX format: + // super_type: ID, "type::name", "sub_type" { ... } + ufbx_string type; + ufbx_string super_type; + ufbx_string sub_type; +}; + +// -- Nodes + +// Inherit type specifies how hierarchial node transforms are combined. +// `UFBX_INHERIT_NORMAL` is combined using the "proper" multiplication +// `UFBX_INHERIT_NO_SHEAR` does component-wise { pos+pos, rot*rot, scale*scale } +// `UFBX_INHERIT_NO_SCALE` ignores the parent scale { pos+pos, rot*rot, scale } +typedef enum ufbx_inherit_type UFBX_ENUM_REPR { + UFBX_INHERIT_NO_SHEAR, // R*r*S*s + UFBX_INHERIT_NORMAL, // R*S*r*s + UFBX_INHERIT_NO_SCALE, // R*r*s + + UFBX_ENUM_FORCE_WIDTH(UFBX_INHERIT_TYPE) +} ufbx_inherit_type; + +UFBX_ENUM_TYPE(ufbx_inherit_type, UFBX_INHERIT_TYPE, UFBX_INHERIT_NO_SCALE); + +// Nodes form the scene transformation hierarchy and can contain attached +// elements such as meshes or lights. In normal cases a single `ufbx_node` +// contains only a single attached element, so using `type/mesh/...` is safe. +struct ufbx_node { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // Node hierarchy + + // Parent node containing this one if not root. + // + // Always non-`NULL` for non-root nodes unless + // `ufbx_load_opts.allow_nodes_out_of_root` is enabled. + ufbx_nullable ufbx_node *parent; + + // List of child nodes parented to this node. + ufbx_node_list children; + + // Attached element type and typed pointers. + // + // Set to `NULL` if not in use, so checking `attrib_type` is not required. + ufbx_nullable ufbx_mesh *mesh; + ufbx_nullable ufbx_light *light; + ufbx_nullable ufbx_camera *camera; + ufbx_nullable ufbx_bone *bone; + + // Less common attributes use these fields. + // + // Defined even if it is one of the above, eg. `ufbx_mesh`. In case there + // is multiple attributes this will be the first one. + ufbx_nullable ufbx_element *attrib; + + // Geometry transform helper if one exists. + // See `UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES`. + ufbx_nullable ufbx_node *geometry_transform_helper; + + // `attrib->type` if `attrib` is defined, otherwise `UFBX_ELEMENT_UNKNOWN`. + ufbx_element_type attrib_type; + + // List of _all_ attached attribute elements. + // + // In most cases there is only zero or one attributes per node, but if you + // have a very exotic FBX file nodes may have multiple attributes. + ufbx_element_list all_attribs; + + // Local transform in parent, geometry transform is a non-inherited + // transform applied only to attachments like meshes + ufbx_inherit_type inherit_type; + ufbx_transform local_transform; + ufbx_transform geometry_transform; + + // Raw Euler angles in degrees for those who want them + + // Specifies the axis order `euler_rotation` is applied in. + ufbx_rotation_order rotation_order; + // Rotation around the local X/Y/Z axes in `rotation_order`. + // The angles are specified in degrees. + ufbx_vec3 euler_rotation; + + // Transform to the global "world" space, may be incorrect if the node + // uses `UFBX_INHERIT_NORMAL`, prefer using the `node_to_world` matrix. + ufbx_transform world_transform; + + // Matrices derived from the transformations, for transforming geometry + // prefer using `geometry_to_world` as that supports geometric transforms. + + // Transform from this node to `parent` space. + // Equivalent to `ufbx_transform_to_matrix(&local_transform)`. + ufbx_matrix node_to_parent; + // Transform from this node to the world space, ie. multiplying all the + // `node_to_parent` matrices of the parent chain together. + // NOTE: Not the same as `ufbx_transform_to_matrix(&world_transform)` + // as this matrix will account for potential shear (if `inherit_type == UFBX_INHERIT_NORMAL`). + ufbx_matrix node_to_world; + // Transform from the attribute to this node. Does not affect the transforms + // of `children`! + // Equivalent to `ufbx_transform_to_matrix(&geometry_transform)`. + ufbx_matrix geometry_to_node; + // Transform from attribute space to world space. + // Equivalent to `ufbx_matrix_mul(&node_to_world, &geometry_to_node)`. + ufbx_matrix geometry_to_world; + + // ufbx-specific adjustment for switching between coodrinate/unit systems. + // HINT: In most cases you don't need to deal with these as these are baked + // into all the transforms above and into `ufbx_evaluate_transform()`. + ufbx_quat adjust_pre_rotation; // < Rotation applied between parent and self + ufbx_vec3 adjust_pre_scale; // < Scaling applied between parent and self + ufbx_quat adjust_post_rotation; // < Rotation applied in local space at the end + + // Materials used by `mesh` or other `attrib`. + // There may be multiple copies of a single `ufbx_mesh` with different materials + // in the `ufbx_node` instances. + ufbx_material_list materials; + + // Visibility state. + bool visible; + + // True if this node is the implicit root node of the scene. + bool is_root; + + // True if the node has a non-identity `geometry_transform`. + bool has_geometry_transform; + + // If `true` the transform is adjusted by ufbx, not enabled by default. + // See `adjust_pre_rotation`, `adjust_pre_scale`, `adjust_post_rotation`. + bool has_adjust_transform; + + // True if this node is node is a synthetic geometry transform helper. + // See `UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES`. + bool is_geometry_transform_helper; + + // How deep is this node in the parent hierarchy. Root node is at depth `0` + // and the immediate children of root at `1`. + uint32_t node_depth; +}; + +// Vertex attribute: All attributes are stored in a consistent indexed format +// regardless of how it's actually stored in the file. +// +// `values` is a contiguous array of attribute values. +// `indices` maps each mesh index into a value in the `values` array. +// +// If `unique_per_vertex` is set then the attribute is guaranteed to have a +// single defined value per vertex accessible via: +// attrib.values.data[attrib.indices.data[mesh->vertex_first_index[vertex_ix]] +typedef struct ufbx_vertex_attrib { + bool exists; + ufbx_void_list values; + ufbx_uint32_list indices; + size_t value_reals; + bool unique_per_vertex; +} ufbx_vertex_attrib; + +// 1D vertex attribute, see `ufbx_vertex_attrib` for information +typedef struct ufbx_vertex_real { + bool exists; + ufbx_real_list values; + ufbx_uint32_list indices; + size_t value_reals; + bool unique_per_vertex; + + UFBX_VERTEX_ATTRIB_IMPL(ufbx_real) +} ufbx_vertex_real; + +// 2D vertex attribute, see `ufbx_vertex_attrib` for information +typedef struct ufbx_vertex_vec2 { + bool exists; + ufbx_vec2_list values; + ufbx_uint32_list indices; + size_t value_reals; + bool unique_per_vertex; + + UFBX_VERTEX_ATTRIB_IMPL(ufbx_vec2) +} ufbx_vertex_vec2; + +// 3D vertex attribute, see `ufbx_vertex_attrib` for information +typedef struct ufbx_vertex_vec3 { + bool exists; + ufbx_vec3_list values; + ufbx_uint32_list indices; + size_t value_reals; + bool unique_per_vertex; + + UFBX_VERTEX_ATTRIB_IMPL(ufbx_vec3) +} ufbx_vertex_vec3; + +// 4D vertex attribute, see `ufbx_vertex_attrib` for information +typedef struct ufbx_vertex_vec4 { + bool exists; + ufbx_vec4_list values; + ufbx_uint32_list indices; + size_t value_reals; + bool unique_per_vertex; + + UFBX_VERTEX_ATTRIB_IMPL(ufbx_vec4) +} ufbx_vertex_vec4; + +// Vertex UV set/layer +typedef struct ufbx_uv_set { + ufbx_string name; + uint32_t index; + + // Vertex attributes, see `ufbx_mesh` attributes for more information + ufbx_vertex_vec2 vertex_uv; // < UV / texture coordinates + ufbx_vertex_vec3 vertex_tangent; // < (optional) Tangent vector in UV.x direction + ufbx_vertex_vec3 vertex_bitangent; // < (optional) Tangent vector in UV.y direction +} ufbx_uv_set; + +// Vertex color set/layer +typedef struct ufbx_color_set { + ufbx_string name; + uint32_t index; + + // Vertex attributes, see `ufbx_mesh` attributes for more information + ufbx_vertex_vec4 vertex_color; // < Per-vertex RGBA color +} ufbx_color_set; + +UFBX_LIST_TYPE(ufbx_uv_set_list, ufbx_uv_set); +UFBX_LIST_TYPE(ufbx_color_set_list, ufbx_color_set); + +// Edge between two _indices_ in a mesh +typedef struct ufbx_edge { + union { + struct { uint32_t a, b; }; + uint32_t indices[2]; + }; +} ufbx_edge; + +UFBX_LIST_TYPE(ufbx_edge_list, ufbx_edge); + +// Polygonal face with arbitrary number vertices, a single face contains a +// contiguous range of mesh indices, eg. `{5,3}` would have indices 5, 6, 7 +// +// NOTE: `num_indices` maybe less than 3 in which case the face is invalid! +// [TODO #23: should probably remove the bad faces at load time] +typedef struct ufbx_face { + uint32_t index_begin; + uint32_t num_indices; +} ufbx_face; + +UFBX_LIST_TYPE(ufbx_face_list, ufbx_face); + +typedef struct ufbx_mesh_material { + ufbx_nullable ufbx_material *material; + + // Sub-set of the geometry that uses this specific material + size_t num_faces; // < Number of faces (polygons) using this material + size_t num_triangles; // < Number of triangles using this material if triangulated + + size_t num_empty_faces; // < Number of faces with zero vertices + size_t num_point_faces; // < Number of faces with a single vertex + size_t num_line_faces; // < Number of faces with two vertices + + // Indices to `ufbx_mesh.faces[]` that use this material. + // Always contains `num_faces` elements. + ufbx_uint32_list face_indices; + +} ufbx_mesh_material; + +UFBX_LIST_TYPE(ufbx_mesh_material_list, ufbx_mesh_material); + +typedef struct ufbx_face_group { + int32_t id; // < Numerical ID for this group. + ufbx_string name; // < Name for the face group. + + // Sub-set of the geometry in this face group + size_t num_faces; // < Number of faces (polygons) using this material + size_t num_triangles; // < Number of triangles using this material if triangulated + + // Indices to `ufbx_mesh.faces[]` that use this material. + // Always contains `num_faces` elements. + ufbx_uint32_list face_indices; +} ufbx_face_group; + +UFBX_LIST_TYPE(ufbx_face_group_list, ufbx_face_group); + +typedef struct ufbx_subdivision_weight_range { + uint32_t weight_begin; + uint32_t num_weights; +} ufbx_subdivision_weight_range; + +UFBX_LIST_TYPE(ufbx_subdivision_weight_range_list, ufbx_subdivision_weight_range); + +typedef struct ufbx_subdivision_weight { + ufbx_real weight; + uint32_t index; +} ufbx_subdivision_weight; + +UFBX_LIST_TYPE(ufbx_subdivision_weight_list, ufbx_subdivision_weight); + +typedef struct ufbx_subdivision_result { + size_t result_memory_used; + size_t temp_memory_used; + size_t result_allocs; + size_t temp_allocs; + + // Weights of vertices in the source model. + // Defined if `ufbx_subdivide_opts.evaluate_source_vertices` is set. + ufbx_subdivision_weight_range_list source_vertex_ranges; + ufbx_subdivision_weight_list source_vertex_weights; + + // Weights of skin clusters in the source model. + // Defined if `ufbx_subdivide_opts.evaluate_skin_weights` is set. + ufbx_subdivision_weight_range_list skin_cluster_ranges; + ufbx_subdivision_weight_list skin_cluster_weights; + +} ufbx_subdivision_result; + +typedef enum ufbx_subdivision_display_mode UFBX_ENUM_REPR { + UFBX_SUBDIVISION_DISPLAY_DISABLED, + UFBX_SUBDIVISION_DISPLAY_HULL, + UFBX_SUBDIVISION_DISPLAY_HULL_AND_SMOOTH, + UFBX_SUBDIVISION_DISPLAY_SMOOTH, + + UFBX_ENUM_FORCE_WIDTH(UFBX_SUBDIVISION_DISPLAY_MODE) +} ufbx_subdivision_display_mode; + +UFBX_ENUM_TYPE(ufbx_subdivision_display_mode, UFBX_SUBDIVISION_DISPLAY_MODE, UFBX_SUBDIVISION_DISPLAY_SMOOTH); + +typedef enum ufbx_subdivision_boundary UFBX_ENUM_REPR { + UFBX_SUBDIVISION_BOUNDARY_DEFAULT, + UFBX_SUBDIVISION_BOUNDARY_LEGACY, + // OpenSubdiv: `VTX_BOUNDARY_EDGE_AND_CORNER` / `FVAR_LINEAR_CORNERS_ONLY` + UFBX_SUBDIVISION_BOUNDARY_SHARP_CORNERS, + // OpenSubdiv: `VTX_BOUNDARY_EDGE_ONLY` / `FVAR_LINEAR_NONE` + UFBX_SUBDIVISION_BOUNDARY_SHARP_NONE, + // OpenSubdiv: `FVAR_LINEAR_BOUNDARIES` + UFBX_SUBDIVISION_BOUNDARY_SHARP_BOUNDARY, + // OpenSubdiv: `FVAR_LINEAR_ALL` + UFBX_SUBDIVISION_BOUNDARY_SHARP_INTERIOR, + + UFBX_ENUM_FORCE_WIDTH(UFBX_SUBDIVISION_BOUNDARY) +} ufbx_subdivision_boundary; + +UFBX_ENUM_TYPE(ufbx_subdivision_boundary, UFBX_SUBDIVISION_BOUNDARY, UFBX_SUBDIVISION_BOUNDARY_SHARP_INTERIOR); + +// Polygonal mesh geometry. +// +// Example mesh with two triangles (x, z) and a quad (y). +// The faces have a constant UV coordinate x/y/z. +// The vertices have _per vertex_ normals that point up/down. +// +// ^ ^ ^ +// A---B-----C +// |x / /| +// | / y / | +// |/ / z| +// D-----E---F +// v v v +// +// Attributes may have multiple values within a single vertex, for example a +// UV seam vertex has two UV coordinates. Thus polygons are defined using +// an index that counts each corner of each face polygon. If an attribute is +// defined (even per-vertex) it will always have a valid `indices` array. +// +// {0,3} {3,4} {7,3} faces ({ index_begin, num_indices }) +// 0 1 2 3 4 5 6 7 8 9 index +// +// 0 1 3 1 2 4 3 2 4 5 vertex_indices[index] +// A B D B C E D C E F vertices[vertex_indices[index]] +// +// 0 0 1 0 0 1 1 0 1 1 vertex_normal.indices[index] +// ^ ^ v ^ ^ v v ^ v v vertex_normal.data[vertex_normal.indices[index]] +// +// 0 0 0 1 1 1 1 2 2 2 vertex_uv.indices[index] +// x x x y y y y z z z vertex_uv.data[vertex_uv.indices[index]] +// +// Vertex position can also be accessed uniformly through an accessor: +// 0 1 3 1 2 4 3 2 4 5 vertex_position.indices[index] +// A B D B C E D C E F vertex_position.data[vertex_position.indices[index]] +// +// Some geometry data is specified per logical vertex. Vertex positions are +// the only attribute that is guaranteed to be defined _uniquely_ per vertex. +// Vertex attributes _may_ be defined per vertex if `unique_per_vertex == true`. +// You can access the per-vertex values by first finding the first index that +// refers to the given vertex. +// +// 0 1 2 3 4 5 vertex +// A B C D E F vertices[vertex] +// +// 0 1 4 2 5 9 vertex_first_index[vertex] +// 0 0 0 1 1 1 vertex_normal.indices[vertex_first_index[vertex]] +// ^ ^ ^ v v v vertex_normal.data[vertex_normal.indices[vertex_first_index[vertex]]] +// +struct ufbx_mesh { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; + + // Number of "logical" vertices that would be treated as a single point, + // one vertex may be split to multiple indices for split attributes, eg. UVs + size_t num_vertices; // < Number of logical "vertex" points + size_t num_indices; // < Number of combiend vertex/attribute tuples + size_t num_faces; // < Number of faces (polygons) in the mesh + size_t num_triangles; // < Number of triangles if triangulated + + // Number of edges in the mesh. + // NOTE: May be zero in valid meshes if the file doesn't contain edge adjacency data! + size_t num_edges; + + size_t max_face_triangles; // < Maximum number of triangles in a face in this mesh + + size_t num_empty_faces; // < Number of faces with zero vertices + size_t num_point_faces; // < Number of faces with a single vertex + size_t num_line_faces; // < Number of faces with two vertices + + // Faces and optional per-face extra data + ufbx_face_list faces; // < Face index range + ufbx_bool_list face_smoothing; // < Should the face have soft normals + ufbx_uint32_list face_material; // < Indices to `ufbx_mesh.materials[]` and `ufbx_node.materials[]` + ufbx_uint32_list face_group; // < Face polygon group index, indices to `ufbx_mesh.face_groups[]` + ufbx_bool_list face_hole; // < Should the face be hidden as a "hole" + + // Edges and optional per-edge extra data + ufbx_edge_list edges; // < Edge index range + ufbx_bool_list edge_smoothing; // < Should the edge have soft normals + ufbx_real_list edge_crease; // < Crease value for subdivision surfaces + ufbx_bool_list edge_visibility; // < Should the edge be visible + + // Logical vertices and positions, alternatively you can use + // `vertex_position` for consistent interface with other attributes. + ufbx_uint32_list vertex_indices; + ufbx_vec3_list vertices; + + // First index referring to a given vertex, `UFBX_NO_INDEX` if the vertex is unused. + ufbx_uint32_list vertex_first_index; + + // Vertex attributes, see the comment over the struct. + // + // NOTE: Not all meshes have all attributes, in that case `indices/data == NULL`! + // + // NOTE: UV/tangent/bitangent and color are the from first sets, + // use `uv_sets/color_sets` to access the other layers. + ufbx_vertex_vec3 vertex_position; // < Vertex positions + ufbx_vertex_vec3 vertex_normal; // < (optional) Normal vectors (TODO: Generate?) + ufbx_vertex_vec2 vertex_uv; // < (optional) UV / texture coordinates + ufbx_vertex_vec3 vertex_tangent; // < (optional) Tangent vector in UV.x direction + ufbx_vertex_vec3 vertex_bitangent; // < (optional) Tangent vector in UV.y direction + ufbx_vertex_vec4 vertex_color; // < (optional) Per-vertex RGBA color + ufbx_vertex_real vertex_crease; // < (optional) Crease value for subdivision surfaces + + // Multiple named UV/color sets + // NOTE: The first set contains the same data as `vertex_uv/color`! + ufbx_uv_set_list uv_sets; + ufbx_color_set_list color_sets; + + // List of materials used by the mesh. This is a list of structures that contains + // compact lists of face indices that use a specific material which can be more + // useful convenient `face_material`. Use `materials[index].material` for the + // actual material pointers. + // NOTE: These can be wrong if you want to support per-instance materials! + // Use `ufbx_node.materials[]` to get the per-instance materials at the same indices. + // HINT: If this mesh has no material then `materials[]` will be empty, but if + // you enable `ufbx_load_opts.allow_null_material` there will be a single + // `ufbx_mesh_material` with `material == NULL` with all the faces in it. + ufbx_mesh_material_list materials; + + // Face groups for this mesh. + ufbx_face_group_list face_groups; + + // Skinned vertex positions, for efficiency the skinned positions are the + // same as the static ones for non-skinned meshes and `skinned_is_local` + // is set to true meaning you need to transform them manually using + // `ufbx_transform_position(&node->geometry_to_world, skinned_pos)`! + bool skinned_is_local; + ufbx_vertex_vec3 skinned_position; + ufbx_vertex_vec3 skinned_normal; + + // Deformers + ufbx_skin_deformer_list skin_deformers; + ufbx_blend_deformer_list blend_deformers; + ufbx_cache_deformer_list cache_deformers; + ufbx_element_list all_deformers; + + // Subdivision + uint32_t subdivision_preview_levels; + uint32_t subdivision_render_levels; + ufbx_subdivision_display_mode subdivision_display_mode; + ufbx_subdivision_boundary subdivision_boundary; + ufbx_subdivision_boundary subdivision_uv_boundary; + + // Normals have been generated instead of evalauted. + // Either from missing normals (via `ufbx_load_opts.generate_missing_normals`), skinning, + // tessellation, or subdivision. + bool generated_normals; + + // Subdivision (result) + bool subdivision_evaluated; + ufbx_nullable ufbx_subdivision_result *subdivision_result; + + // Tessellation (result) + bool from_tessellated_nurbs; +}; + +// The kind of light source +typedef enum ufbx_light_type UFBX_ENUM_REPR { + // Single point at local origin, at `node->world_transform.position` + UFBX_LIGHT_POINT, + // Infinite directional light pointing locally towards `light->local_direction` + // For global: `ufbx_transform_direction(&node->node_to_world, light->local_direction)` + UFBX_LIGHT_DIRECTIONAL, + // Cone shaped light towards `light->local_direction`, between `light->inner/outer_angle`. + // For global: `ufbx_transform_direction(&node->node_to_world, light->local_direction)` + UFBX_LIGHT_SPOT, + // Area light, shape specified by `light->area_shape` + // TODO: Units? + UFBX_LIGHT_AREA, + // Volumetric light source + // TODO: How does this work + UFBX_LIGHT_VOLUME, + + UFBX_ENUM_FORCE_WIDTH(UFBX_LIGHT_TYPE) +} ufbx_light_type; + +UFBX_ENUM_TYPE(ufbx_light_type, UFBX_LIGHT_TYPE, UFBX_LIGHT_VOLUME); + +// How fast does the light intensity decay at a distance +typedef enum ufbx_light_decay UFBX_ENUM_REPR { + UFBX_LIGHT_DECAY_NONE, // < 1 (no decay) + UFBX_LIGHT_DECAY_LINEAR, // < 1 / d + UFBX_LIGHT_DECAY_QUADRATIC, // < 1 / d^2 (physically accurate) + UFBX_LIGHT_DECAY_CUBIC, // < 1 / d^3 + + UFBX_ENUM_FORCE_WIDTH(UFBX_LIGHT_DECAY) +} ufbx_light_decay; + +UFBX_ENUM_TYPE(ufbx_light_decay, UFBX_LIGHT_DECAY, UFBX_LIGHT_DECAY_CUBIC); + +typedef enum ufbx_light_area_shape UFBX_ENUM_REPR { + UFBX_LIGHT_AREA_SHAPE_RECTANGLE, + UFBX_LIGHT_AREA_SHAPE_SPHERE, + + UFBX_ENUM_FORCE_WIDTH(UFBX_LIGHT_AREA_SHAPE) +} ufbx_light_area_shape; + +UFBX_ENUM_TYPE(ufbx_light_area_shape, UFBX_LIGHT_AREA_SHAPE, UFBX_LIGHT_AREA_SHAPE_SPHERE); + +// Light source attached to a `ufbx_node` +struct ufbx_light { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; + + // Color and intensity of the light, usually you want to use `color * intensity` + // NOTE: `intensity` is 0.01x of the property `"Intensity"` as that matches + // matches values in DCC programs before exporting. + ufbx_vec3 color; + ufbx_real intensity; + + // Direction the light is aimed at in node's local space, usually -Y + ufbx_vec3 local_direction; + + // Type of the light and shape parameters + ufbx_light_type type; + ufbx_light_decay decay; + ufbx_light_area_shape area_shape; + ufbx_real inner_angle; + ufbx_real outer_angle; + + bool cast_light; + bool cast_shadows; +}; + +typedef enum ufbx_projection_mode UFBX_ENUM_REPR { + // Perspective projection. + UFBX_PROJECTION_MODE_PERSPECTIVE, + + // Orthographic projection. + UFBX_PROJECTION_MODE_ORTHOGRAPHIC, + + UFBX_ENUM_FORCE_WIDTH(UFBX_PROJECTION_MODE) +} ufbx_projection_mode; + +UFBX_ENUM_TYPE(ufbx_projection_mode, UFBX_PROJECTION_MODE, UFBX_PROJECTION_MODE_ORTHOGRAPHIC); + +// Method of specifying the rendering resolution from properties +// NOTE: Handled internally by ufbx, ignore unless you interpret `ufbx_props` directly! +typedef enum ufbx_aspect_mode UFBX_ENUM_REPR { + // No defined resolution + UFBX_ASPECT_MODE_WINDOW_SIZE, + // `"AspectWidth"` and `"AspectHeight"` are relative to each other + UFBX_ASPECT_MODE_FIXED_RATIO, + // `"AspectWidth"` and `"AspectHeight"` are both pixels + UFBX_ASPECT_MODE_FIXED_RESOLUTION, + // `"AspectWidth"` is pixels, `"AspectHeight"` is relative to width + UFBX_ASPECT_MODE_FIXED_WIDTH, + // < `"AspectHeight"` is pixels, `"AspectWidth"` is relative to height + UFBX_ASPECT_MODE_FIXED_HEIGHT, + + UFBX_ENUM_FORCE_WIDTH(UFBX_ASPECT_MODE) +} ufbx_aspect_mode; + +UFBX_ENUM_TYPE(ufbx_aspect_mode, UFBX_ASPECT_MODE, UFBX_ASPECT_MODE_FIXED_HEIGHT); + +// Method of specifying the field of view from properties +// NOTE: Handled internally by ufbx, ignore unless you interpret `ufbx_props` directly! +typedef enum ufbx_aperture_mode UFBX_ENUM_REPR { + // Use separate `"FieldOfViewX"` and `"FieldOfViewY"` as horizontal/vertical FOV angles + UFBX_APERTURE_MODE_HORIZONTAL_AND_VERTICAL, + // Use `"FieldOfView"` as horizontal FOV angle, derive vertical angle via aspect ratio + UFBX_APERTURE_MODE_HORIZONTAL, + // Use `"FieldOfView"` as vertical FOV angle, derive horizontal angle via aspect ratio + UFBX_APERTURE_MODE_VERTICAL, + // Compute the field of view from the render gate size and focal length + UFBX_APERTURE_MODE_FOCAL_LENGTH, + + UFBX_ENUM_FORCE_WIDTH(UFBX_APERTURE_MODE) +} ufbx_aperture_mode; + +UFBX_ENUM_TYPE(ufbx_aperture_mode, UFBX_APERTURE_MODE, UFBX_APERTURE_MODE_FOCAL_LENGTH); + +// Method of specifying the render gate size from properties +// NOTE: Handled internally by ufbx, ignore unless you interpret `ufbx_props` directly! +typedef enum ufbx_gate_fit UFBX_ENUM_REPR { + // Use the film/aperture size directly as the render gate + UFBX_GATE_FIT_NONE, + // Fit the render gate to the height of the film, derive width from aspect ratio + UFBX_GATE_FIT_VERTICAL, + // Fit the render gate to the width of the film, derive height from aspect ratio + UFBX_GATE_FIT_HORIZONTAL, + // Fit the render gate so that it is fully contained within the film gate + UFBX_GATE_FIT_FILL, + // Fit the render gate so that it fully contains the film gate + UFBX_GATE_FIT_OVERSCAN, + // Stretch the render gate to match the film gate + // TODO: Does this differ from `UFBX_GATE_FIT_NONE`? + UFBX_GATE_FIT_STRETCH, + + UFBX_ENUM_FORCE_WIDTH(UFBX_GATE_FIT) +} ufbx_gate_fit; + +UFBX_ENUM_TYPE(ufbx_gate_fit, UFBX_GATE_FIT, UFBX_GATE_FIT_STRETCH); + +// Camera film/aperture size defaults +// NOTE: Handled internally by ufbx, ignore unless you interpret `ufbx_props` directly! +typedef enum ufbx_aperture_format UFBX_ENUM_REPR { + UFBX_APERTURE_FORMAT_CUSTOM, // < Use `"FilmWidth"` and `"FilmHeight"` + UFBX_APERTURE_FORMAT_16MM_THEATRICAL, // < 0.404 x 0.295 inches + UFBX_APERTURE_FORMAT_SUPER_16MM, // < 0.493 x 0.292 inches + UFBX_APERTURE_FORMAT_35MM_ACADEMY, // < 0.864 x 0.630 inches + UFBX_APERTURE_FORMAT_35MM_TV_PROJECTION, // < 0.816 x 0.612 inches + UFBX_APERTURE_FORMAT_35MM_FULL_APERTURE, // < 0.980 x 0.735 inches + UFBX_APERTURE_FORMAT_35MM_185_PROJECTION, // < 0.825 x 0.446 inches + UFBX_APERTURE_FORMAT_35MM_ANAMORPHIC, // < 0.864 x 0.732 inches (squeeze ratio: 2) + UFBX_APERTURE_FORMAT_70MM_PROJECTION, // < 2.066 x 0.906 inches + UFBX_APERTURE_FORMAT_VISTAVISION, // < 1.485 x 0.991 inches + UFBX_APERTURE_FORMAT_DYNAVISION, // < 2.080 x 1.480 inches + UFBX_APERTURE_FORMAT_IMAX, // < 2.772 x 2.072 inches + + UFBX_ENUM_FORCE_WIDTH(UFBX_APERTURE_FORMAT) +} ufbx_aperture_format; + +UFBX_ENUM_TYPE(ufbx_aperture_format, UFBX_APERTURE_FORMAT, UFBX_APERTURE_FORMAT_IMAX); + +typedef enum ufbx_coordinate_axis UFBX_ENUM_REPR { + UFBX_COORDINATE_AXIS_POSITIVE_X, + UFBX_COORDINATE_AXIS_NEGATIVE_X, + UFBX_COORDINATE_AXIS_POSITIVE_Y, + UFBX_COORDINATE_AXIS_NEGATIVE_Y, + UFBX_COORDINATE_AXIS_POSITIVE_Z, + UFBX_COORDINATE_AXIS_NEGATIVE_Z, + UFBX_COORDINATE_AXIS_UNKNOWN, + + UFBX_ENUM_FORCE_WIDTH(UFBX_COORDINATE_AXIS) +} ufbx_coordinate_axis; + +UFBX_ENUM_TYPE(ufbx_coordinate_axis, UFBX_COORDINATE_AXIS, UFBX_COORDINATE_AXIS_UNKNOWN); + +// Coordinate axes the scene is represented in. +// NOTE: `front` is the _opposite_ from forward! +typedef struct ufbx_coordinate_axes { + ufbx_coordinate_axis right; + ufbx_coordinate_axis up; + ufbx_coordinate_axis front; +} ufbx_coordinate_axes; + +// Camera attached to a `ufbx_node` +struct ufbx_camera { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; + + // Projection mode (perspective/orthographic). + ufbx_projection_mode projection_mode; + + // If set to `true`, `resolution` reprensents actual pixel values, otherwise + // it's only useful for its aspect ratio. + bool resolution_is_pixels; + + // Render resolution, either in pixels or arbitrary units, depending on above + ufbx_vec2 resolution; + + // Horizontal/vertical field of view in degrees + // Valid if `projection_mode == UFBX_PROJECTION_MODE_PERSPECTIVE`. + ufbx_vec2 field_of_view_deg; + + // Component-wise `tan(field_of_view_deg)`, also represents the size of the + // proection frustum slice at distance of 1. + // Valid if `projection_mode == UFBX_PROJECTION_MODE_PERSPECTIVE`. + ufbx_vec2 field_of_view_tan; + + // Orthographic camera extents. + // Valid if `projection_mode == UFBX_PROJECTION_MODE_ORTHOGRAPHIC`. + ufbx_real orthographic_extent; + + // Orthographic camera size. + // Valid if `projection_mode == UFBX_PROJECTION_MODE_ORTHOGRAPHIC`. + ufbx_vec2 orthographic_size; + + // Size of the projection plane at distance 1. + // Equal to `field_of_view_tan` if perspective, `orthographic_size` if orthographic. + ufbx_vec2 projection_plane; + + // Aspect ratio of the camera. + ufbx_real aspect_ratio; + + // Near plane of the frustum in units from the camera. + ufbx_real near_plane; + + // Far plane of the frustum in units from the camera. + ufbx_real far_plane; + + // Coordinate system that the projection uses. + // FBX saves cameras with +X forward and +Y up, but you can override this using + // `ufbx_load_opts.target_camera_axes` and it will be reflected here. + ufbx_coordinate_axes projection_axes; + + // Advanced properties used to compute the above + ufbx_aspect_mode aspect_mode; + ufbx_aperture_mode aperture_mode; + ufbx_gate_fit gate_fit; + ufbx_aperture_format aperture_format; + ufbx_real focal_length_mm; // < Focal length in millimeters + ufbx_vec2 film_size_inch; // < Film size in inches + ufbx_vec2 aperture_size_inch; // < Aperture/film gate size in inches + ufbx_real squeeze_ratio; // < Anamoprhic stretch ratio +}; + +// Bone attached to a `ufbx_node`, provides the logical length of the bone +// but most interesting information is directly in `ufbx_node`. +struct ufbx_bone { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; + + // Visual radius of the bone + ufbx_real radius; + + // Length of the bone relative to the distance between two nodes + ufbx_real relative_length; + + // Is the bone a root bone + bool is_root; +}; + +// Empty/NULL/locator connected to a node, actual details in `ufbx_node` +struct ufbx_empty { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; +}; + +// -- Node attributes (curves/surfaces) + +// Segment of a `ufbx_line_curve`, indices refer to `ufbx_line_curve.point_indces[]` +typedef struct ufbx_line_segment { + uint32_t index_begin; + uint32_t num_indices; +} ufbx_line_segment; + +UFBX_LIST_TYPE(ufbx_line_segment_list, ufbx_line_segment); + +struct ufbx_line_curve { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; + + ufbx_vec3 color; + + ufbx_vec3_list control_points; // < List of possible values the line passes through + ufbx_uint32_list point_indices; // < Indices to `control_points[]` the line goes through + + ufbx_line_segment_list segments; + + // Tessellation (result) + bool from_tessellated_nurbs; +}; + +typedef enum ufbx_nurbs_topology UFBX_ENUM_REPR { + // The endpoints are not connected. + UFBX_NURBS_TOPOLOGY_OPEN, + // Repeats first `ufbx_nurbs_basis.order - 1` control points after the end. + UFBX_NURBS_TOPOLOGY_PERIODIC, + // Repeats the first control point after the end. + UFBX_NURBS_TOPOLOGY_CLOSED, + + UFBX_ENUM_FORCE_WIDTH(UFBX_NURBS_TOPOLOGY) +} ufbx_nurbs_topology; + +UFBX_ENUM_TYPE(ufbx_nurbs_topology, UFBX_NURBS_TOPOLOGY, UFBX_NURBS_TOPOLOGY_CLOSED); + +// NURBS basis functions for an axis +typedef struct ufbx_nurbs_basis { + + // Number of control points influencing a point on the curve/surface. + // Equal to the degree plus one. + uint32_t order; + + // Topology (periodicity) of the dimension. + ufbx_nurbs_topology topology; + + // Subdivision of the parameter range to control points. + ufbx_real_list knot_vector; + + // Range for the parameter value. + ufbx_real t_min; + ufbx_real t_max; + + // Parameter values of control points. + ufbx_real_list spans; + + // `true` if this axis is two-dimensional. + bool is_2d; + + // Number of control points that need to be copied to the end. + // This is just for convenience as it could be derived from `topology` and + // `order`. If for example `num_wrap_control_points == 3` you should repeat + // the first 3 control points after the end. + // HINT: You don't need to worry about this if you use ufbx functions + // like `ufbx_evaluate_nurbs_curve_point()` as they handle this internally. + size_t num_wrap_control_points; + + // `true` if the parametrization is well defined. + bool valid; + +} ufbx_nurbs_basis; + +struct ufbx_nurbs_curve { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; + + // Basis in the U axis + ufbx_nurbs_basis basis; + + // Linear array of control points + // NOTE: The control points are _not_ homogeneous, meaning you have to multiply + // them by `w` before evaluating the surface. + ufbx_vec4_list control_points; +}; + +struct ufbx_nurbs_surface { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; + + // Basis in the U/V axes + ufbx_nurbs_basis basis_u; + ufbx_nurbs_basis basis_v; + + // Number of control points for the U/V axes + size_t num_control_points_u; + size_t num_control_points_v; + + // 2D array of control points. + // Memory layout: `V * num_control_points_u + U` + // NOTE: The control points are _not_ homogeneous, meaning you have to multiply + // them by `w` before evaluating the surface. + ufbx_vec4_list control_points; + + // How many segments tessellate each step in `ufbx_nurbs_basis.steps`. + uint32_t span_subdivision_u; + uint32_t span_subdivision_v; + + // If `true` the resulting normals should be flipped when evaluated. + bool flip_normals; + + // Material for the whole surface. + // NOTE: May be `NULL`! + ufbx_nullable ufbx_material *material; +}; + +struct ufbx_nurbs_trim_surface { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; +}; + +struct ufbx_nurbs_trim_boundary { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; +}; + +// -- Node attributes (advanced) + +struct ufbx_procedural_geometry { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; +}; + +struct ufbx_stereo_camera { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; + + ufbx_camera *left; + ufbx_camera *right; +}; + +struct ufbx_camera_switcher { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; +}; + +typedef enum ufbx_marker_type UFBX_ENUM_REPR { + UFBX_MARKER_UNKNOWN, // < Unknown marker type + UFBX_MARKER_FK_EFFECTOR, // < FK (Forward Kinematics) effector + UFBX_MARKER_IK_EFFECTOR, // < IK (Inverse Kinematics) effector + + UFBX_ENUM_FORCE_WIDTH(UFBX_MARKER_TYPE) +} ufbx_marker_type; + +UFBX_ENUM_TYPE(ufbx_marker_type, UFBX_MARKER_TYPE, UFBX_MARKER_IK_EFFECTOR); + +// Tracking marker for effectors +struct ufbx_marker { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; + + // Type of the marker + ufbx_marker_type type; +}; + +// LOD level display mode. +typedef enum ufbx_lod_display UFBX_ENUM_REPR { + UFBX_LOD_DISPLAY_USE_LOD, // < Display the LOD level if the distance is appropriate. + UFBX_LOD_DISPLAY_SHOW, // < Always display the LOD level. + UFBX_LOD_DISPLAY_HIDE, // < Never display the LOD level. + + UFBX_ENUM_FORCE_WIDTH(UFBX_LOD_DISPLAY) +} ufbx_lod_display; + +UFBX_ENUM_TYPE(ufbx_lod_display, UFBX_LOD_DISPLAY, UFBX_LOD_DISPLAY_HIDE); + +// Single LOD level within an LOD group. +// Specifies properties of the Nth child of the _node_ containing the LOD group. +typedef struct ufbx_lod_level { + + // Minimum distance to show this LOD level. + // NOTE: In world units by default, or in screen percentage if + // `ufbx_lod_group.relative_thresholds` is set. + ufbx_real distance; + + // LOD display mode. + // NOTE: Mostly for editing, you should probably ignore this + // unless making a modeling program. + ufbx_lod_display display; + +} ufbx_lod_level; + +UFBX_LIST_TYPE(ufbx_lod_level_list, ufbx_lod_level); + +// Group of LOD (Level of Detail) levels for an object. +// The actual LOD models are defined in the parent `ufbx_node.children`. +struct ufbx_lod_group { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + ufbx_node_list instances; + }; }; + + // If set to `true`, `ufbx_lod_level.distance` represents a screen size percentage. + bool relative_distances; + + // LOD levels matching in order to `ufbx_node.children`. + ufbx_lod_level_list lod_levels; + + // If set to `true` don't account for parent transform when computing the distance. + bool ignore_parent_transform; + + // If `use_distance_limit` is enabled hide the group if the distance is not between + // `distance_limit_min` and `distance_limit_max`. + bool use_distance_limit; + ufbx_real distance_limit_min; + ufbx_real distance_limit_max; +}; + +// -- Deformers + +// Method to evaluate the skinning on a per-vertex level +typedef enum ufbx_skinning_method UFBX_ENUM_REPR { + // Linear blend skinning: Blend transformation matrices by vertex weights + UFBX_SKINNING_METHOD_LINEAR, + // One vertex should have only one bone attached + UFBX_SKINNING_METHOD_RIGID, + // Convert the transformations to dual quaternions and blend in that space + UFBX_SKINNING_METHOD_DUAL_QUATERNION, + // Blend between `UFBX_SKINNING_METHOD_LINEAR` and `UFBX_SKINNING_METHOD_BLENDED_DQ_LINEAR` + // The blend weight can be found either per-vertex in `ufbx_skin_vertex.dq_weight` + // or in `ufbx_skin_deformer.dq_vertices/dq_weights` (indexed by vertex). + UFBX_SKINNING_METHOD_BLENDED_DQ_LINEAR, + + UFBX_ENUM_FORCE_WIDTH(UFBX_SKINNING_METHOD) +} ufbx_skinning_method; + +UFBX_ENUM_TYPE(ufbx_skinning_method, UFBX_SKINNING_METHOD, UFBX_SKINNING_METHOD_BLENDED_DQ_LINEAR); + +// Skin weight information for a single mesh vertex +typedef struct ufbx_skin_vertex { + + // Each vertex is influenced by weights from `ufbx_skin_deformer.weights[]` + // The weights are sorted by decreasing weight so you can take the first N + // weights to get a cheaper approximation of the vertex. + // NOTE: The weights are not guaranteed to be normalized! + uint32_t weight_begin; // < Index to start from in the `weights[]` array + uint32_t num_weights; // < Number of weights influencing the vertex + + // Blend weight between Linear Blend Skinning (0.0) and Dual Quaternion (1.0). + // Should be used if `skinning_method == UFBX_SKINNING_METHOD_BLENDED_DQ_LINEAR` + ufbx_real dq_weight; + +} ufbx_skin_vertex; + +UFBX_LIST_TYPE(ufbx_skin_vertex_list, ufbx_skin_vertex); + +// Single per-vertex per-cluster weight, see `ufbx_skin_vertex` +typedef struct ufbx_skin_weight { + uint32_t cluster_index; // < Index into `ufbx_skin_deformer.clusters[]` + ufbx_real weight; // < Amount this bone influence the vertex +} ufbx_skin_weight; + +UFBX_LIST_TYPE(ufbx_skin_weight_list, ufbx_skin_weight); + +// Skin deformer specifies a binding between a logical set of bones (a skeleton) +// and a mesh. Each bone is represented by a `ufbx_skin_cluster` that contains +// the binding matrix and a `ufbx_node *bone` that has the current transformation. +struct ufbx_skin_deformer { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + ufbx_skinning_method skinning_method; + + // Clusters (bones) in the skin + ufbx_skin_cluster_list clusters; + + // Per-vertex weight information + ufbx_skin_vertex_list vertices; + ufbx_skin_weight_list weights; + + // Largest amount of weights a single vertex can have + size_t max_weights_per_vertex; + + // Blend weights between Linear Blend Skinning (0.0) and Dual Quaternion (1.0). + // HINT: You probably want to use `vertices` and `ufbx_skin_vertex.dq_weight` instead! + // NOTE: These may be out-of-bounds for a given mesh, `vertices` is always safe. + size_t num_dq_weights; + ufbx_uint32_list dq_vertices; + ufbx_real_list dq_weights; +}; + +// Cluster of vertices bound to a single bone. +struct ufbx_skin_cluster { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // The bone node the cluster is attached to + // NOTE: Always valid if found from `ufbx_skin_deformer.clusters[]` unless + // `ufbx_load_opts.connect_broken_elements` is `true`. + ufbx_nullable ufbx_node *bone_node; + + // Binding matrix from local mesh vertices to the bone + ufbx_matrix geometry_to_bone; + + // Binding matrix from local mesh _node_ to the bone. + // NOTE: Prefer `geometry_to_bone` in most use cases! + ufbx_matrix mesh_node_to_bone; + + // Matrix that specifies the rest/bind pose transform of the node, + // not generally needed for skinning, use `geometry_to_bone` instead. + ufbx_matrix bind_to_world; + + // Precomputed matrix/transform that accounts for the current bone transform + // ie. `ufbx_matrix_mul(&cluster->bone->node_to_world, &cluster->geometry_to_bone)` + ufbx_matrix geometry_to_world; + ufbx_transform geometry_to_world_transform; + + // Raw weights indexed by each _vertex_ of a mesh (not index!) + // HINT: It may be simpler to use `ufbx_skin_deformer.vertices[]/weights[]` instead! + // NOTE: These may be out-of-bounds for a given mesh, `ufbx_skin_deformer.vertices` is always safe. + size_t num_weights; // < Number of vertices in the cluster + ufbx_uint32_list vertices; // < Vertex indices in `ufbx_mesh.vertices[]` + ufbx_real_list weights; // < Per-vertex weight values +}; + +// Blend shape deformer can contain multiple channels (think of sliders between morphs) +// that may optionally have in-between keyframes. +struct ufbx_blend_deformer { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // Independent morph targets of the deformer. + ufbx_blend_channel_list channels; +}; + +// Blend shape associated with a target weight in a series of morphs +typedef struct ufbx_blend_keyframe { + // The target blend shape offsets. + ufbx_blend_shape *shape; + + // Weight value at which to apply the keyframe at full strength + ufbx_real target_weight; + + // The weight the shape should be currently applied with + ufbx_real effective_weight; +} ufbx_blend_keyframe; + +UFBX_LIST_TYPE(ufbx_blend_keyframe_list, ufbx_blend_keyframe); + +// Blend channel consists of multiple morph-key targets that are interpolated. +// In simple cases there will be only one keyframe that is the target shape. +struct ufbx_blend_channel { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // Current weight of the channel + ufbx_real weight; + + // Key morph targets to blend between depending on `weight` + // In usual cases there's only one target per channel + ufbx_blend_keyframe_list keyframes; +}; + +// Blend shape target containing the actual vertex offsets +struct ufbx_blend_shape { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // Vertex offsets to apply over the base mesh + // NOTE: The `offset_vertices` may be out-of-bounds for a given mesh! + size_t num_offsets; // < Number of vertex offsets in the following arrays + ufbx_uint32_list offset_vertices; // < Indices to `ufbx_mesh.vertices[]` + ufbx_vec3_list position_offsets; // < Always specified per-vertex offsets + ufbx_vec3_list normal_offsets; // < Empty if not specified +}; + +typedef enum ufbx_cache_file_format UFBX_ENUM_REPR { + UFBX_CACHE_FILE_FORMAT_UNKNOWN, // < Unknown cache file format + UFBX_CACHE_FILE_FORMAT_PC2, // < .pc2 Point cache file + UFBX_CACHE_FILE_FORMAT_MC, // < .mc/.mcx Maya cache file + + UFBX_ENUM_FORCE_WIDTH(UFBX_CACHE_FILE_FORMAT) +} ufbx_cache_file_format; + +UFBX_ENUM_TYPE(ufbx_cache_file_format, UFBX_CACHE_FILE_FORMAT, UFBX_CACHE_FILE_FORMAT_MC); + +typedef enum ufbx_cache_data_format UFBX_ENUM_REPR { + UFBX_CACHE_DATA_FORMAT_UNKNOWN, // < Unknown data format + UFBX_CACHE_DATA_FORMAT_REAL_FLOAT, // < `float data[]` + UFBX_CACHE_DATA_FORMAT_VEC3_FLOAT, // < `struct { float x, y, z; } data[]` + UFBX_CACHE_DATA_FORMAT_REAL_DOUBLE, // < `double data[]` + UFBX_CACHE_DATA_FORMAT_VEC3_DOUBLE, // < `struct { double x, y, z; } data[]` + + UFBX_ENUM_FORCE_WIDTH(UFBX_CACHE_DATA_FORMAT) +} ufbx_cache_data_format; + +UFBX_ENUM_TYPE(ufbx_cache_data_format, UFBX_CACHE_DATA_FORMAT, UFBX_CACHE_DATA_FORMAT_VEC3_DOUBLE); + +typedef enum ufbx_cache_data_encoding UFBX_ENUM_REPR { + UFBX_CACHE_DATA_ENCODING_UNKNOWN, // < Unknown data encoding + UFBX_CACHE_DATA_ENCODING_LITTLE_ENDIAN, // < Contiguous little-endian array + UFBX_CACHE_DATA_ENCODING_BIG_ENDIAN, // < Contiguous big-endian array + + UFBX_ENUM_FORCE_WIDTH(UFBX_CACHE_DATA_ENCODING) +} ufbx_cache_data_encoding; + +UFBX_ENUM_TYPE(ufbx_cache_data_encoding, UFBX_CACHE_DATA_ENCODING, UFBX_CACHE_DATA_ENCODING_BIG_ENDIAN); + +// Known interpretations of geometry cache data. +typedef enum ufbx_cache_interpretation UFBX_ENUM_REPR { + // Unknown interpretation, see `ufbx_cache_channel.interpretation_name` for more information. + UFBX_CACHE_INTERPRETATION_UNKNOWN, + + // Generic "points" interpretation, FBX SDK default. Usually fine to interpret + // as vertex positions if no other cache channels are specified. + UFBX_CACHE_INTERPRETATION_POINTS, + + // Vertex positions. + UFBX_CACHE_INTERPRETATION_VERTEX_POSITION, + + // Vertex normals. + UFBX_CACHE_INTERPRETATION_VERTEX_NORMAL, + + UFBX_ENUM_FORCE_WIDTH(UFBX_CACHE_INTERPRETATION) +} ufbx_cache_interpretation; + +UFBX_ENUM_TYPE(ufbx_cache_interpretation, UFBX_CACHE_INTERPRETATION, UFBX_CACHE_INTERPRETATION_VERTEX_NORMAL); + +typedef struct ufbx_cache_frame { + + // Name of the channel this frame belongs to. + ufbx_string channel; + + // Time of this frame in seconds. + double time; + + // Name of the file containing the data. + // The specified file may contain multiple frames, use `data_offset` etc. to + // read at the right position. + ufbx_string filename; + + // Format of the wrapper file. + ufbx_cache_file_format file_format; + + ufbx_cache_data_format data_format; // < Format of the data in the file + ufbx_cache_data_encoding data_encoding; // < Binary encoding of the data + uint64_t data_offset; // < Byte offset into the file + uint32_t data_count; // < Number of data elements + uint32_t data_element_bytes; // < Size of a single data element in bytes + uint64_t data_total_bytes; // < Size of the whole data blob in bytes +} ufbx_cache_frame; + +UFBX_LIST_TYPE(ufbx_cache_frame_list, ufbx_cache_frame); + +typedef struct ufbx_cache_channel { + + // Name of the geometry cache channel. + ufbx_string name; + + // What does the data in this channel represent. + ufbx_cache_interpretation interpretation; + + // Source name for `interpretation`, especially useful if `interpretation` is + // `UFBX_CACHE_INTERPRETATION_UNKNOWN`. + ufbx_string interpretation_name; + + // List of frames belonging to this channel. + // Sorted by time (`ufbx_cache_frame.time`). + ufbx_cache_frame_list frames; + +} ufbx_cache_channel; + +UFBX_LIST_TYPE(ufbx_cache_channel_list, ufbx_cache_channel); + +typedef struct ufbx_geometry_cache { + ufbx_string root_filename; + ufbx_cache_channel_list channels; + ufbx_cache_frame_list frames; + ufbx_string_list extra_info; +} ufbx_geometry_cache; + +struct ufbx_cache_deformer { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + ufbx_string channel; + ufbx_nullable ufbx_cache_file *file; + + // Only valid if `ufbx_load_opts.load_external_files` is set! + ufbx_nullable ufbx_geometry_cache *external_cache; + ufbx_nullable ufbx_cache_channel *external_channel; +}; + +struct ufbx_cache_file { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + ufbx_string filename; + ufbx_string absolute_filename; + ufbx_string relative_filename; + ufbx_blob raw_filename; + ufbx_blob raw_absolute_filename; + ufbx_blob raw_relative_filename; + + ufbx_cache_file_format format; + + // Only valid if `ufbx_load_opts.load_external_files` is set! + ufbx_nullable ufbx_geometry_cache *external_cache; +}; + +// -- Materials + +// Material property, either specified with a constant value or a mapped texture +typedef struct ufbx_material_map { + + // Constant value or factor for the map. + // May be specified simultaneously with a texture, in this case most shading models + // use multiplicative tinting of the texture values. + union { + ufbx_real value_real; + ufbx_vec2 value_vec2; + ufbx_vec3 value_vec3; + ufbx_vec4 value_vec4; + }; + int64_t value_int; + + // Texture if connected, otherwise `NULL`. + // May be valid but "disabled" (application specific) if `texture_enabled == false`. + ufbx_nullable ufbx_texture *texture; + + // `true` if the file has specified any of the values above. + // NOTE: The value may be set to a non-zero default even if `has_value == false`, + // for example missing factors are set to `1.0` if a color is defined. + bool has_value; + + // Controls whether shading should use `texture`. + // NOTE: Some shading models allow this to be `true` even if `texture == NULL`. + bool texture_enabled; + + // Set to `true` if this feature should be disabled (specific to shader type). + bool feature_disabled; + + // Number of components in the value from 1 to 4 if defined, 0 if not. + uint8_t value_components; + +} ufbx_material_map; + +// Material feature +typedef struct ufbx_material_feature_info { + + // Whether the material model uses this feature or not. + // NOTE: The feature can be enabled but still not used if eg. the corresponding factor is at zero! + bool enabled; + + // Explicitly enabled/disabled by the material. + bool is_explicit; + +} ufbx_material_feature_info; + +// Texture attached to an FBX property +typedef struct ufbx_material_texture { + ufbx_string material_prop; // < Name of the property in `ufbx_material.props` + ufbx_string shader_prop; // < Shader-specific property mapping name + + // Texture attached to the property. + ufbx_texture *texture; + +} ufbx_material_texture; + +UFBX_LIST_TYPE(ufbx_material_texture_list, ufbx_material_texture); + +// Shading model type +typedef enum ufbx_shader_type UFBX_ENUM_REPR { + // Unknown shading model + UFBX_SHADER_UNKNOWN, + // FBX builtin diffuse material + UFBX_SHADER_FBX_LAMBERT, + // FBX builtin diffuse+specular material + UFBX_SHADER_FBX_PHONG, + // Open Shading Language standard surface + // https://github.com/Autodesk/standard-surface + UFBX_SHADER_OSL_STANDARD_SURFACE, + // Arnold standard surface + // https://docs.arnoldrenderer.com/display/A5AFMUG/Standard+Surface + UFBX_SHADER_ARNOLD_STANDARD_SURFACE, + // 3ds Max Physical Material + // https://knowledge.autodesk.com/support/3ds-max/learn-explore/caas/CloudHelp/cloudhelp/2022/ENU/3DSMax-Lighting-Shading/files/GUID-C1328905-7783-4917-AB86-FC3CC19E8972-htm.html + UFBX_SHADER_3DS_MAX_PHYSICAL_MATERIAL, + // 3ds Max PBR (Metal/Rough) material + // https://knowledge.autodesk.com/support/3ds-max/learn-explore/caas/CloudHelp/cloudhelp/2021/ENU/3DSMax-Lighting-Shading/files/GUID-A16234A5-6500-4662-8B20-A5EC9FE1B255-htm.html + UFBX_SHADER_3DS_MAX_PBR_METAL_ROUGH, + // 3ds Max PBR (Spec/Gloss) material + // https://knowledge.autodesk.com/support/3ds-max/learn-explore/caas/CloudHelp/cloudhelp/2021/ENU/3DSMax-Lighting-Shading/files/GUID-18087194-B2A6-43EF-9B80-8FD1736FAE52-htm.html + UFBX_SHADER_3DS_MAX_PBR_SPEC_GLOSS, + // 3ds glTF Material + // https://help.autodesk.com/view/3DSMAX/2023/ENU/?guid=GUID-7ABFB805-1D9F-417E-9C22-704BFDF160FA + UFBX_SHADER_GLTF_MATERIAL, + // Stingray ShaderFX shader graph. + // Contains a serialized `"ShaderGraph"` in `ufbx_props`. + UFBX_SHADER_SHADERFX_GRAPH, + // Variation of the FBX phong shader that can recover PBR properties like + // `metalness` or `roughness` from the FBX non-physical values. + UFBX_SHADER_BLENDER_PHONG, + // Wavefront .mtl format shader (used by .obj files) + UFBX_SHADER_WAVEFRONT_MTL, + + UFBX_ENUM_FORCE_WIDTH(UFBX_SHADER_TYPE) +} ufbx_shader_type; + +UFBX_ENUM_TYPE(ufbx_shader_type, UFBX_SHADER_TYPE, UFBX_SHADER_WAVEFRONT_MTL); + +// FBX builtin material properties, matches maps in `ufbx_material_fbx_maps` +typedef enum ufbx_material_fbx_map UFBX_ENUM_REPR { + UFBX_MATERIAL_FBX_DIFFUSE_FACTOR, + UFBX_MATERIAL_FBX_DIFFUSE_COLOR, + UFBX_MATERIAL_FBX_SPECULAR_FACTOR, + UFBX_MATERIAL_FBX_SPECULAR_COLOR, + UFBX_MATERIAL_FBX_SPECULAR_EXPONENT, + UFBX_MATERIAL_FBX_REFLECTION_FACTOR, + UFBX_MATERIAL_FBX_REFLECTION_COLOR, + UFBX_MATERIAL_FBX_TRANSPARENCY_FACTOR, + UFBX_MATERIAL_FBX_TRANSPARENCY_COLOR, + UFBX_MATERIAL_FBX_EMISSION_FACTOR, + UFBX_MATERIAL_FBX_EMISSION_COLOR, + UFBX_MATERIAL_FBX_AMBIENT_FACTOR, + UFBX_MATERIAL_FBX_AMBIENT_COLOR, + UFBX_MATERIAL_FBX_NORMAL_MAP, + UFBX_MATERIAL_FBX_BUMP, + UFBX_MATERIAL_FBX_BUMP_FACTOR, + UFBX_MATERIAL_FBX_DISPLACEMENT_FACTOR, + UFBX_MATERIAL_FBX_DISPLACEMENT, + UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT_FACTOR, + UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT, + + UFBX_ENUM_FORCE_WIDTH(UFBX_MATERIAL_FBX_MAP) +} ufbx_material_fbx_map; + +UFBX_ENUM_TYPE(ufbx_material_fbx_map, UFBX_MATERIAL_FBX_MAP, UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT); + +// Known PBR material properties, matches maps in `ufbx_material_pbr_maps` +typedef enum ufbx_material_pbr_map UFBX_ENUM_REPR { + UFBX_MATERIAL_PBR_BASE_FACTOR, + UFBX_MATERIAL_PBR_BASE_COLOR, + UFBX_MATERIAL_PBR_ROUGHNESS, + UFBX_MATERIAL_PBR_METALNESS, + UFBX_MATERIAL_PBR_DIFFUSE_ROUGHNESS, + UFBX_MATERIAL_PBR_SPECULAR_FACTOR, + UFBX_MATERIAL_PBR_SPECULAR_COLOR, + UFBX_MATERIAL_PBR_SPECULAR_IOR, + UFBX_MATERIAL_PBR_SPECULAR_ANISOTROPY, + UFBX_MATERIAL_PBR_SPECULAR_ROTATION, + UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR, + UFBX_MATERIAL_PBR_TRANSMISSION_COLOR, + UFBX_MATERIAL_PBR_TRANSMISSION_DEPTH, + UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER, + UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER_ANISOTROPY, + UFBX_MATERIAL_PBR_TRANSMISSION_DISPERSION, + UFBX_MATERIAL_PBR_TRANSMISSION_ROUGHNESS, + UFBX_MATERIAL_PBR_TRANSMISSION_EXTRA_ROUGHNESS, + UFBX_MATERIAL_PBR_TRANSMISSION_PRIORITY, + UFBX_MATERIAL_PBR_TRANSMISSION_ENABLE_IN_AOV, + UFBX_MATERIAL_PBR_SUBSURFACE_FACTOR, + UFBX_MATERIAL_PBR_SUBSURFACE_COLOR, + UFBX_MATERIAL_PBR_SUBSURFACE_RADIUS, + UFBX_MATERIAL_PBR_SUBSURFACE_SCALE, + UFBX_MATERIAL_PBR_SUBSURFACE_ANISOTROPY, + UFBX_MATERIAL_PBR_SUBSURFACE_TINT_COLOR, + UFBX_MATERIAL_PBR_SUBSURFACE_TYPE, + UFBX_MATERIAL_PBR_SHEEN_FACTOR, + UFBX_MATERIAL_PBR_SHEEN_COLOR, + UFBX_MATERIAL_PBR_SHEEN_ROUGHNESS, + UFBX_MATERIAL_PBR_COAT_FACTOR, + UFBX_MATERIAL_PBR_COAT_COLOR, + UFBX_MATERIAL_PBR_COAT_ROUGHNESS, + UFBX_MATERIAL_PBR_COAT_IOR, + UFBX_MATERIAL_PBR_COAT_ANISOTROPY, + UFBX_MATERIAL_PBR_COAT_ROTATION, + UFBX_MATERIAL_PBR_COAT_NORMAL, + UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_COLOR, + UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_ROUGHNESS, + UFBX_MATERIAL_PBR_THIN_FILM_THICKNESS, + UFBX_MATERIAL_PBR_THIN_FILM_IOR, + UFBX_MATERIAL_PBR_EMISSION_FACTOR, + UFBX_MATERIAL_PBR_EMISSION_COLOR, + UFBX_MATERIAL_PBR_OPACITY, + UFBX_MATERIAL_PBR_INDIRECT_DIFFUSE, + UFBX_MATERIAL_PBR_INDIRECT_SPECULAR, + UFBX_MATERIAL_PBR_NORMAL_MAP, + UFBX_MATERIAL_PBR_TANGENT_MAP, + UFBX_MATERIAL_PBR_DISPLACEMENT_MAP, + UFBX_MATERIAL_PBR_MATTE_FACTOR, + UFBX_MATERIAL_PBR_MATTE_COLOR, + UFBX_MATERIAL_PBR_AMBIENT_OCCLUSION, + UFBX_MATERIAL_PBR_GLOSSINESS, + UFBX_MATERIAL_PBR_COAT_GLOSSINESS, + UFBX_MATERIAL_PBR_TRANSMISSION_GLOSSINESS, + + UFBX_ENUM_FORCE_WIDTH(UFBX_MATERIAL_PBR_MAP) +} ufbx_material_pbr_map; + +UFBX_ENUM_TYPE(ufbx_material_pbr_map, UFBX_MATERIAL_PBR_MAP, UFBX_MATERIAL_PBR_TRANSMISSION_GLOSSINESS); + +// Known material features +typedef enum ufbx_material_feature UFBX_ENUM_REPR { + UFBX_MATERIAL_FEATURE_PBR, + UFBX_MATERIAL_FEATURE_METALNESS, + UFBX_MATERIAL_FEATURE_DIFFUSE, + UFBX_MATERIAL_FEATURE_SPECULAR, + UFBX_MATERIAL_FEATURE_EMISSION, + UFBX_MATERIAL_FEATURE_TRANSMISSION, + UFBX_MATERIAL_FEATURE_COAT, + UFBX_MATERIAL_FEATURE_SHEEN, + UFBX_MATERIAL_FEATURE_OPACITY, + UFBX_MATERIAL_FEATURE_AMBIENT_OCCLUSION, + UFBX_MATERIAL_FEATURE_MATTE, + UFBX_MATERIAL_FEATURE_UNLIT, + UFBX_MATERIAL_FEATURE_IOR, + UFBX_MATERIAL_FEATURE_DIFFUSE_ROUGHNESS, + UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS, + UFBX_MATERIAL_FEATURE_THIN_WALLED, + UFBX_MATERIAL_FEATURE_CAUSTICS, + UFBX_MATERIAL_FEATURE_EXIT_TO_BACKGROUND, + UFBX_MATERIAL_FEATURE_INTERNAL_REFLECTIONS, + UFBX_MATERIAL_FEATURE_DOUBLE_SIDED, + UFBX_MATERIAL_FEATURE_ROUGHNESS_AS_GLOSSINESS, + UFBX_MATERIAL_FEATURE_COAT_ROUGHNESS_AS_GLOSSINESS, + UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS_AS_GLOSSINESS, + + UFBX_ENUM_FORCE_WIDTH(UFBX_MATERIAL_FEATURE) +} ufbx_material_feature; + +UFBX_ENUM_TYPE(ufbx_material_feature, UFBX_MATERIAL_FEATURE, UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS_AS_GLOSSINESS); + +typedef struct ufbx_material_fbx_maps { + union { + ufbx_material_map maps[UFBX_MATERIAL_FBX_MAP_COUNT]; + struct { + ufbx_material_map diffuse_factor; + ufbx_material_map diffuse_color; + ufbx_material_map specular_factor; + ufbx_material_map specular_color; + ufbx_material_map specular_exponent; + ufbx_material_map reflection_factor; + ufbx_material_map reflection_color; + ufbx_material_map transparency_factor; + ufbx_material_map transparency_color; + ufbx_material_map emission_factor; + ufbx_material_map emission_color; + ufbx_material_map ambient_factor; + ufbx_material_map ambient_color; + ufbx_material_map normal_map; + ufbx_material_map bump; + ufbx_material_map bump_factor; + ufbx_material_map displacement_factor; + ufbx_material_map displacement; + ufbx_material_map vector_displacement_factor; + ufbx_material_map vector_displacement; + }; + }; +} ufbx_material_fbx_maps; + +typedef struct ufbx_material_pbr_maps { + union { + ufbx_material_map maps[UFBX_MATERIAL_PBR_MAP_COUNT]; + struct { + ufbx_material_map base_factor; + ufbx_material_map base_color; + ufbx_material_map roughness; + ufbx_material_map metalness; + ufbx_material_map diffuse_roughness; + ufbx_material_map specular_factor; + ufbx_material_map specular_color; + ufbx_material_map specular_ior; + ufbx_material_map specular_anisotropy; + ufbx_material_map specular_rotation; + ufbx_material_map transmission_factor; + ufbx_material_map transmission_color; + ufbx_material_map transmission_depth; + ufbx_material_map transmission_scatter; + ufbx_material_map transmission_scatter_anisotropy; + ufbx_material_map transmission_dispersion; + ufbx_material_map transmission_roughness; + ufbx_material_map transmission_extra_roughness; + ufbx_material_map transmission_priority; + ufbx_material_map transmission_enable_in_aov; + ufbx_material_map subsurface_factor; + ufbx_material_map subsurface_color; + ufbx_material_map subsurface_radius; + ufbx_material_map subsurface_scale; + ufbx_material_map subsurface_anisotropy; + ufbx_material_map subsurface_tint_color; + ufbx_material_map subsurface_type; + ufbx_material_map sheen_factor; + ufbx_material_map sheen_color; + ufbx_material_map sheen_roughness; + ufbx_material_map coat_factor; + ufbx_material_map coat_color; + ufbx_material_map coat_roughness; + ufbx_material_map coat_ior; + ufbx_material_map coat_anisotropy; + ufbx_material_map coat_rotation; + ufbx_material_map coat_normal; + ufbx_material_map coat_affect_base_color; + ufbx_material_map coat_affect_base_roughness; + ufbx_material_map thin_film_thickness; + ufbx_material_map thin_film_ior; + ufbx_material_map emission_factor; + ufbx_material_map emission_color; + ufbx_material_map opacity; + ufbx_material_map indirect_diffuse; + ufbx_material_map indirect_specular; + ufbx_material_map normal_map; + ufbx_material_map tangent_map; + ufbx_material_map displacement_map; + ufbx_material_map matte_factor; + ufbx_material_map matte_color; + ufbx_material_map ambient_occlusion; + ufbx_material_map glossiness; + ufbx_material_map coat_glossiness; + ufbx_material_map transmission_glossiness; + }; + }; +} ufbx_material_pbr_maps; + +typedef struct ufbx_material_features { + union { + ufbx_material_feature_info features[UFBX_MATERIAL_FEATURE_COUNT]; + struct { + ufbx_material_feature_info pbr; + ufbx_material_feature_info metalness; + ufbx_material_feature_info diffuse; + ufbx_material_feature_info specular; + ufbx_material_feature_info emission; + ufbx_material_feature_info transmission; + ufbx_material_feature_info coat; + ufbx_material_feature_info sheen; + ufbx_material_feature_info opacity; + ufbx_material_feature_info ambient_occlusion; + ufbx_material_feature_info matte; + ufbx_material_feature_info unlit; + ufbx_material_feature_info ior; + ufbx_material_feature_info diffuse_roughness; + ufbx_material_feature_info transmission_roughness; + ufbx_material_feature_info thin_walled; + ufbx_material_feature_info caustics; + ufbx_material_feature_info exit_to_background; + ufbx_material_feature_info internal_reflections; + ufbx_material_feature_info double_sided; + ufbx_material_feature_info roughness_as_glossiness; + ufbx_material_feature_info coat_roughness_as_glossiness; + ufbx_material_feature_info transmission_roughness_as_glossiness; + }; + }; +} ufbx_material_features; + +// Surface material properties such as color, roughness, etc. Each property may +// be optionally bound to an `ufbx_texture`. +struct ufbx_material { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // FBX builtin properties + // NOTE: These may be empty if the material is using a custom shader + ufbx_material_fbx_maps fbx; + + // PBR material properties, defined for all shading models but may be + // somewhat approximate if `shader == NULL`. + ufbx_material_pbr_maps pbr; + + // Material features, primarily applies to `pbr`. + ufbx_material_features features; + + // Shading information + ufbx_shader_type shader_type; // < Always defined + ufbx_nullable ufbx_shader *shader; // < Optional extended shader information + ufbx_string shading_model_name; // < Often one of `{ "lambert", "phong", "unknown" }` + + // Prefix before shader property names with trailing `|`. + // For example `"3dsMax|Parameters|"` where properties would have names like + // `"3dsMax|Parameters|base_color"`. You can ignore this if you use the built-in + // `ufbx_material_fbx_maps fbx` and `ufbx_material_pbr_maps pbr` structures. + ufbx_string shader_prop_prefix; + + // All textures attached to the material, if you want specific maps if might be + // more convenient to use eg. `fbx.diffuse_color.texture` or `pbr.base_color.texture` + ufbx_material_texture_list textures; // < Sorted by `material_prop` +}; + +typedef enum ufbx_texture_type UFBX_ENUM_REPR { + + // Texture associated with an image file/sequence. `texture->filename` and + // and `texture->relative_filename` contain the texture's path. If the file + // has embedded content `texture->content` may hold `texture->content_size` + // bytes of raw image data. + UFBX_TEXTURE_FILE, + + // The texture consists of multiple texture layers blended together. + UFBX_TEXTURE_LAYERED, + + // Reserved as these _should_ exist in FBX files. + UFBX_TEXTURE_PROCEDURAL, + + // Node in a shader graph. + // Use `ufbx_texture.shader` for more information. + UFBX_TEXTURE_SHADER, + + UFBX_ENUM_FORCE_WIDTH(UFBX_TEXTURE_TYPE) +} ufbx_texture_type; + +UFBX_ENUM_TYPE(ufbx_texture_type, UFBX_TEXTURE_TYPE, UFBX_TEXTURE_SHADER); + +// Blend modes to combine layered textures with, compatible with common blend +// mode definitions in many art programs. Simpler blend modes have equations +// specified below where `src` is the layer to compososite over `dst`. +// See eg. https://www.w3.org/TR/2013/WD-compositing-1-20131010/#blendingseparable +typedef enum ufbx_blend_mode UFBX_ENUM_REPR { + UFBX_BLEND_TRANSLUCENT, // < `src` effects result alpha + UFBX_BLEND_ADDITIVE, // < `src + dst` + UFBX_BLEND_MULTIPLY, // < `src * dst` + UFBX_BLEND_MULTIPLY_2X, // < `2 * src * dst` + UFBX_BLEND_OVER, // < `src * src_alpha + dst * (1-src_alpha)` + UFBX_BLEND_REPLACE, // < `src` Replace the contents + UFBX_BLEND_DISSOLVE, // < `random() + src_alpha >= 1.0 ? src : dst` + UFBX_BLEND_DARKEN, // < `min(src, dst)` + UFBX_BLEND_COLOR_BURN, // < `src > 0 ? 1 - min(1, (1-dst) / src) : 0` + UFBX_BLEND_LINEAR_BURN, // < `src + dst - 1` + UFBX_BLEND_DARKER_COLOR, // < `value(src) < value(dst) ? src : dst` + UFBX_BLEND_LIGHTEN, // < `max(src, dst)` + UFBX_BLEND_SCREEN, // < `1 - (1-src)*(1-dst)` + UFBX_BLEND_COLOR_DODGE, // < `src < 1 ? dst / (1 - src)` : (dst>0?1:0)` + UFBX_BLEND_LINEAR_DODGE, // < `src + dst` + UFBX_BLEND_LIGHTER_COLOR, // < `value(src) > value(dst) ? src : dst` + UFBX_BLEND_SOFT_LIGHT, // < https://www.w3.org/TR/2013/WD-compositing-1-20131010/#blendingsoftlight + UFBX_BLEND_HARD_LIGHT, // < https://www.w3.org/TR/2013/WD-compositing-1-20131010/#blendinghardlight + UFBX_BLEND_VIVID_LIGHT, // < Combination of `COLOR_DODGE` and `COLOR_BURN` + UFBX_BLEND_LINEAR_LIGHT, // < Combination of `LINEAR_DODGE` and `LINEAR_BURN` + UFBX_BLEND_PIN_LIGHT, // < Combination of `DARKEN` and `LIGHTEN` + UFBX_BLEND_HARD_MIX, // < Produces primary colors depending on similarity + UFBX_BLEND_DIFFERENCE, // < `abs(src - dst)` + UFBX_BLEND_EXCLUSION, // < `dst + src - 2 * src * dst` + UFBX_BLEND_SUBTRACT, // < `dst - src` + UFBX_BLEND_DIVIDE, // < `dst / src` + UFBX_BLEND_HUE, // < Replace hue + UFBX_BLEND_SATURATION, // < Replace saturation + UFBX_BLEND_COLOR, // < Replace hue and saturatio + UFBX_BLEND_LUMINOSITY, // < Replace value + UFBX_BLEND_OVERLAY, // < Same as `HARD_LIGHT` but with `src` and `dst` swapped + + UFBX_ENUM_FORCE_WIDTH(UFBX_BLEND_MODE) +} ufbx_blend_mode; + +UFBX_ENUM_TYPE(ufbx_blend_mode, UFBX_BLEND_MODE, UFBX_BLEND_OVERLAY); + +// Blend modes to combine layered textures with, compatible with common blend +typedef enum ufbx_wrap_mode UFBX_ENUM_REPR { + UFBX_WRAP_REPEAT, // < Repeat the texture past the [0,1] range + UFBX_WRAP_CLAMP, // < Clamp the normalized texture coordinates to [0,1] + + UFBX_ENUM_FORCE_WIDTH(UFBX_WRAP_MODE) +} ufbx_wrap_mode; + +UFBX_ENUM_TYPE(ufbx_wrap_mode, UFBX_WRAP_MODE, UFBX_WRAP_CLAMP); + +// Single layer in a layered texture +typedef struct ufbx_texture_layer { + ufbx_texture *texture; // < The inner texture to evaluate, never `NULL` + ufbx_blend_mode blend_mode; // < Equation to combine the layer to the background + ufbx_real alpha; // < Blend weight of this layer +} ufbx_texture_layer; + +UFBX_LIST_TYPE(ufbx_texture_layer_list, ufbx_texture_layer); + +typedef enum ufbx_shader_texture_type UFBX_ENUM_REPR { + UFBX_SHADER_TEXTURE_UNKNOWN, + + // Select an output of a multi-output shader. + // HINT: If this type is used the `ufbx_shader_texture_texture` and + // `ufbx_shader_texture.main_texture_output_index` fields are set. + UFBX_SHADER_TEXTURE_SELECT_OUTPUT, + + // Open Shading Language (OSL) shader. + // https://github.com/AcademySoftwareFoundation/OpenShadingLanguage + UFBX_SHADER_TEXTURE_OSL, + + UFBX_ENUM_FORCE_WIDTH(UFBX_SHADER_TEXTURE_TYPE) +} ufbx_shader_texture_type; + +UFBX_ENUM_TYPE(ufbx_shader_texture_type, UFBX_SHADER_TEXTURE_TYPE, UFBX_SHADER_TEXTURE_OSL); + +typedef struct ufbx_shader_texture_input { + + // Name of the input. + ufbx_string name; + + // Constant value of the input. + union { + ufbx_real value_real; + ufbx_vec2 value_vec2; + ufbx_vec3 value_vec3; + ufbx_vec4 value_vec4; + }; + int64_t value_int; + ufbx_string value_str; + ufbx_blob value_blob; + + // Texture connected to this input. + ufbx_nullable ufbx_texture *texture; + + // Index of the output to use if `texture` is a multi-output shader node. + int64_t texture_output_index; + + // Controls whether shading should use `texture`. + // NOTE: Some shading models allow this to be `true` even if `texture == NULL`. + bool texture_enabled; + + // Property representing this input. + ufbx_prop *prop; + + // Property representing `texture`. + ufbx_nullable ufbx_prop *texture_prop; + + // Property representing `texture_enabled`. + ufbx_nullable ufbx_prop *texture_enabled_prop; + +} ufbx_shader_texture_input; + +UFBX_LIST_TYPE(ufbx_shader_texture_input_list, ufbx_shader_texture_input); + +typedef struct ufbx_shader_texture { + + // Type of this shader node. + ufbx_shader_texture_type type; + + // Name of the shader to use. + ufbx_string shader_name; + + // 64-bit opaque identifier for the shader type. + uint64_t shader_type_id; + + // Input values/textures (possibly further shader textures) to the shader. + // Sorted by `ufbx_shader_texture_input.name`. + ufbx_shader_texture_input_list inputs; + + // Shader source code if found. + ufbx_string shader_source; + ufbx_blob raw_shader_source; + + // Representative texture for this shader. + // Only specified if `main_texture.outputs[main_texture_output_index]` is semantically + // equivalent to this texture. + ufbx_texture *main_texture; + + // Output index of `main_texture` if it is a multi-output shader. + int64_t main_texture_output_index; + + // Prefix for properties related to this shader in `ufbx_texture`. + // NOTE: Contains the trailing '|' if not empty. + ufbx_string prop_prefix; + +} ufbx_shader_texture; + +// Unique texture within the file. +typedef struct ufbx_texture_file { + + // Index in `ufbx_scene.texture_files[]`. + uint32_t index; + + // Paths to the resource. + ufbx_string filename; + ufbx_string absolute_filename; + ufbx_string relative_filename; + ufbx_blob raw_filename; + ufbx_blob raw_absolute_filename; + ufbx_blob raw_relative_filename; + + // Optional embedded content blob, eg. raw .png format data + ufbx_blob content; + +} ufbx_texture_file; + +UFBX_LIST_TYPE(ufbx_texture_file_list, ufbx_texture_file); + +// Texture that controls material appearance +struct ufbx_texture { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // Texture type (file / layered / procedural / shader) + ufbx_texture_type type; + + // FILE: Paths to the resource + ufbx_string filename; + ufbx_string absolute_filename; + ufbx_string relative_filename; + ufbx_blob raw_filename; + ufbx_blob raw_absolute_filename; + ufbx_blob raw_relative_filename; + + // FILE: Optional embedded content blob, eg. raw .png format data + ufbx_blob content; + + // FILE: Optional video texture + ufbx_nullable ufbx_video *video; + + // FILE: Index into `ufbx_scene.texture_files[]` or `UFBX_NO_INDEX`. + uint32_t file_index; + + // FILE: True if `file_index` has a valid value. + bool has_file; + + // LAYERED: Inner texture layers, ordered from _bottom_ to _top_ + ufbx_texture_layer_list layers; + + // SHADER: Shader information + // NOTE: May be specified even if `type == UFBX_TEXTURE_FILE` if `ufbx_load_opts.disable_quirks` + // is _not_ specified. Some known shaders that represent files are interpreted as `UFBX_TEXTURE_FILE`. + ufbx_nullable ufbx_shader_texture *shader; + + // List of file textures representing this texture. + // Defined even if `type == UFBX_TEXTURE_FILE` in which case the array contains only itself. + ufbx_texture_list file_textures; + + // Name of the UV set to use + ufbx_string uv_set; + + // Wrapping mode + ufbx_wrap_mode wrap_u; + ufbx_wrap_mode wrap_v; + + // UV transform + bool has_uv_transform; // < Has a non-identity `transform` and derived matrices. + ufbx_transform uv_transform; // < Texture transformation in UV space + ufbx_matrix texture_to_uv; // < Matrix representation of `transform` + ufbx_matrix uv_to_texture; // < UV coordinate to normalized texture coordinate matrix +}; + +// TODO: Video textures +struct ufbx_video { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // Paths to the resource + ufbx_string filename; + ufbx_string absolute_filename; + ufbx_string relative_filename; + ufbx_blob raw_filename; + ufbx_blob raw_absolute_filename; + ufbx_blob raw_relative_filename; + + // Optional embedded content blob + ufbx_blob content; +}; + +// Shader specifies a shading model and contains `ufbx_shader_binding` elements +// that define how to interpret FBX properties in the shader. +struct ufbx_shader { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // Known shading model + ufbx_shader_type type; + + // TODO: Expose actual properties here + + // Bindings from FBX properties to the shader + // HINT: `ufbx_find_shader_prop()` translates shader properties to FBX properties + ufbx_shader_binding_list bindings; +}; + +// Binding from a material property to shader implementation +typedef struct ufbx_shader_prop_binding { + ufbx_string shader_prop; // < Property name used by the shader implementation + ufbx_string material_prop; // < Property name inside `ufbx_material.props` +} ufbx_shader_prop_binding; + +UFBX_LIST_TYPE(ufbx_shader_prop_binding_list, ufbx_shader_prop_binding); + +// Shader binding table +struct ufbx_shader_binding { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + ufbx_shader_prop_binding_list prop_bindings; // < Sorted by `shader_prop` +}; + +// -- Animation + +typedef struct ufbx_anim_layer_desc { + ufbx_anim_layer *layer; + ufbx_real weight; +} ufbx_anim_layer_desc; + +UFBX_LIST_TYPE(ufbx_const_anim_layer_desc_list, const ufbx_anim_layer_desc); + +typedef struct ufbx_prop_override { + // Element (`ufbx_element.id`) to override the property from + // NOTE: You can get this from typed structs eg. `my_node->element.id` + uint32_t element_id; + + // Property name to override. + const char *prop_name; + + // Override value, use `value.x` for scalars. `value_int` is initialized + // from `value.x` if zero so keep `value` zeroed even if you don't need it! + ufbx_vec3 value; + const char *value_str; + int64_t value_int; + + // Internal: Gets filled automatically by `ufbx_prepare_prop_overrides()` + uint32_t _internal_key; +} ufbx_prop_override; + +UFBX_LIST_TYPE(ufbx_const_prop_override_list, const ufbx_prop_override); + +typedef struct ufbx_anim { + ufbx_const_anim_layer_desc_list layers; + + // Override individual `ufbx_prop` values from elements + // NOTE: Call `ufbx_prepare_prop_overrides()` to obtain this! + ufbx_const_prop_override_list prop_overrides; + + bool ignore_connections; + + // Not used by evaluation + double time_begin; + double time_end; +} ufbx_anim; + +struct ufbx_anim_stack { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + double time_begin; + double time_end; + + ufbx_anim_layer_list layers; + ufbx_anim anim; +}; + +typedef struct ufbx_anim_prop { + ufbx_element *element; + uint32_t _internal_key; + ufbx_string prop_name; + ufbx_anim_value *anim_value; +} ufbx_anim_prop; + +UFBX_LIST_TYPE(ufbx_anim_prop_list, ufbx_anim_prop); + +struct ufbx_anim_layer { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + ufbx_real weight; + bool weight_is_animated; + bool blended; + bool additive; + bool compose_rotation; + bool compose_scale; + + ufbx_anim_value_list anim_values; + ufbx_anim_prop_list anim_props; // < Sorted by `element,prop_name` + + ufbx_anim anim; + + uint32_t _min_element_id; + uint32_t _max_element_id; + uint32_t _element_id_bitmask[4]; +}; + +struct ufbx_anim_value { + union { ufbx_element element; struct { ufbx_string name; ufbx_props props; }; }; + + ufbx_vec3 default_value; + ufbx_nullable ufbx_anim_curve *curves[3]; +}; + +// Animation curve segment interpolation mode between two keyframes +typedef enum ufbx_interpolation UFBX_ENUM_REPR { + UFBX_INTERPOLATION_CONSTANT_PREV, // < Hold previous key value + UFBX_INTERPOLATION_CONSTANT_NEXT, // < Hold next key value + UFBX_INTERPOLATION_LINEAR, // < Linear interpolation between two keys + UFBX_INTERPOLATION_CUBIC, // < Cubic interpolation, see `ufbx_tangent` + + UFBX_ENUM_FORCE_WIDTH(UFBX_INTERPOLATION) +} ufbx_interpolation; + +UFBX_ENUM_TYPE(ufbx_interpolation, UFBX_INTERPOLATION, UFBX_INTERPOLATION_CUBIC); + +// Tangent vector at a keyframe, may be split into left/right +typedef struct ufbx_tangent { + float dx; // < Derivative in the time axis + float dy; // < Derivative in the (curve specific) value axis +} ufbx_tangent; + +// Single real `value` at a specified `time`, interpolation between two keyframes +// is determined by the `interpolation` field of the _previous_ key. +// If `interpolation == UFBX_INTERPOLATION_CUBIC` the span is evaluated as a +// cubic bezier curve through the following points: +// +// (prev->time, prev->value) +// (prev->time + prev->right.dx, prev->value + prev->right.dy) +// (next->time - next->left.dx, next->value - next->left.dy) +// (next->time, next->value) +// +// HINT: You can use `ufbx_evaluate_curve(ufbx_anim_curve *curve, double time)` +// rather than trying to manually handle all the interpolation modes. +typedef struct ufbx_keyframe { + double time; + ufbx_real value; + ufbx_interpolation interpolation; + ufbx_tangent left; + ufbx_tangent right; +} ufbx_keyframe; + +UFBX_LIST_TYPE(ufbx_keyframe_list, ufbx_keyframe); + +struct ufbx_anim_curve { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + ufbx_keyframe_list keyframes; +}; + +// -- Collections + +// Collection of nodes to hide/freeze +struct ufbx_display_layer { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // Nodes included in the layer (exclusively at most one layer per node) + ufbx_node_list nodes; + + // Layer state + bool visible; // < Contained nodes are visible + bool frozen; // < Contained nodes cannot be edited + + ufbx_vec3 ui_color; // < Visual color for UI +}; + +// Named set of nodes/geometry features to select. +struct ufbx_selection_set { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // Included nodes and geometry features + ufbx_selection_node_list nodes; +}; + +// Selection state of a node, potentially contains vertex/edge/face selection as well. +struct ufbx_selection_node { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // Selection targets, possibly `NULL` + ufbx_nullable ufbx_node *target_node; + ufbx_nullable ufbx_mesh *target_mesh; + bool include_node; // < Is `target_node` included in the selection + + // Indices to selected components. + // Guaranteed to be valid as per `ufbx_load_opts.index_error_handling` + // if `target_mesh` is not `NULL`. + ufbx_uint32_list vertices; // < Indices to `ufbx_mesh.vertices` + ufbx_uint32_list edges; // < Indices to `ufbx_mesh.edges` + ufbx_uint32_list faces; // < Indices to `ufbx_mesh.faces` +}; + +// -- Constraints + +struct ufbx_character { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; +}; + +// Type of property constrain eg. position or look-at +typedef enum ufbx_constraint_type UFBX_ENUM_REPR { + UFBX_CONSTRAINT_UNKNOWN, + UFBX_CONSTRAINT_AIM, + UFBX_CONSTRAINT_PARENT, + UFBX_CONSTRAINT_POSITION, + UFBX_CONSTRAINT_ROTATION, + UFBX_CONSTRAINT_SCALE, + // Inverse kinematic chain to a single effector `ufbx_constraint.ik_effector` + // `targets` optionally contains a list of pole targets! + UFBX_CONSTRAINT_SINGLE_CHAIN_IK, + + UFBX_ENUM_FORCE_WIDTH(UFBX_CONSTRAINT_TYPE) +} ufbx_constraint_type; + +UFBX_ENUM_TYPE(ufbx_constraint_type, UFBX_CONSTRAINT_TYPE, UFBX_CONSTRAINT_SINGLE_CHAIN_IK); + +// Target to follow with a constraint +typedef struct ufbx_constraint_target { + ufbx_node *node; // < Target node reference + ufbx_real weight; // < Relative weight to other targets (does not always sum to 1) + ufbx_transform transform; // < Offset from the actual target +} ufbx_constraint_target; + +UFBX_LIST_TYPE(ufbx_constraint_target_list, ufbx_constraint_target); + +// Method to determine the up vector in aim constraints +typedef enum ufbx_constraint_aim_up_type UFBX_ENUM_REPR { + UFBX_CONSTRAINT_AIM_UP_SCENE, // < Align the up vector to the scene global up vector + UFBX_CONSTRAINT_AIM_UP_TO_NODE, // < Aim the up vector at `ufbx_constraint.aim_up_node` + UFBX_CONSTRAINT_AIM_UP_ALIGN_NODE, // < Copy the up vector from `ufbx_constraint.aim_up_node` + UFBX_CONSTRAINT_AIM_UP_VECTOR, // < Use `ufbx_constraint.aim_up_vector` as the up vector + UFBX_CONSTRAINT_AIM_UP_NONE, // < Don't align the up vector to anything + + UFBX_ENUM_FORCE_WIDTH(UFBX_CONSTRAINT_AIM_UP_TYPE) +} ufbx_constraint_aim_up_type; + +UFBX_ENUM_TYPE(ufbx_constraint_aim_up_type, UFBX_CONSTRAINT_AIM_UP_TYPE, UFBX_CONSTRAINT_AIM_UP_NONE); + +// Method to determine the up vector in aim constraints +typedef enum ufbx_constraint_ik_pole_type UFBX_ENUM_REPR { + UFBX_CONSTRAINT_IK_POLE_VECTOR, // < Use towards calculated from `ufbx_constraint.targets` + UFBX_CONSTRAINT_IK_POLE_NODE, // < Use `ufbx_constraint.ik_pole_vector` directly + + UFBX_ENUM_FORCE_WIDTH(UFBX_CONSTRAINT_IK_POLE_TYPE) +} ufbx_constraint_ik_pole_type; + +UFBX_ENUM_TYPE(ufbx_constraint_ik_pole_type, UFBX_CONSTRAINT_IK_POLE_TYPE, UFBX_CONSTRAINT_IK_POLE_NODE); + +struct ufbx_constraint { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + // Type of constraint to use + ufbx_constraint_type type; + ufbx_string type_name; + + // Node to be constrained + ufbx_nullable ufbx_node *node; + + // List of weighted targets for the constraint (pole vectors for IK) + ufbx_constraint_target_list targets; + + // State of the constraint + ufbx_real weight; + bool active; + + // Translation/rotation/scale axes the constraint is applied to + bool constrain_translation[3]; + bool constrain_rotation[3]; + bool constrain_scale[3]; + + // Offset from the constrained position + ufbx_transform transform_offset; + + // AIM: Target and up vectors + ufbx_vec3 aim_vector; + ufbx_constraint_aim_up_type aim_up_type; + ufbx_nullable ufbx_node *aim_up_node; + ufbx_vec3 aim_up_vector; + + // SINGLE_CHAIN_IK: Target for the IK, `targets` contains pole vectors! + ufbx_nullable ufbx_node *ik_effector; + ufbx_nullable ufbx_node *ik_end_node; + ufbx_vec3 ik_pole_vector; +}; + +// -- Miscellaneous + +typedef struct ufbx_bone_pose { + ufbx_node *bone_node; + ufbx_matrix bone_to_world; +} ufbx_bone_pose; + +UFBX_LIST_TYPE(ufbx_bone_pose_list, ufbx_bone_pose); + +struct ufbx_pose { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; + + bool bind_pose; + ufbx_bone_pose_list bone_poses; +}; + +struct ufbx_metadata_object { + union { ufbx_element element; struct { + ufbx_string name; + ufbx_props props; + uint32_t element_id; + uint32_t typed_id; + }; }; +}; + +// -- Named elements + +typedef struct ufbx_name_element { + ufbx_string name; + ufbx_element_type type; + uint32_t _internal_key; + ufbx_element *element; +} ufbx_name_element; + +UFBX_LIST_TYPE(ufbx_name_element_list, ufbx_name_element); + +// -- Scene + +// Scene is the root object loaded by ufbx that everything is accessed from. + +typedef enum ufbx_exporter UFBX_ENUM_REPR { + UFBX_EXPORTER_UNKNOWN, + UFBX_EXPORTER_FBX_SDK, + UFBX_EXPORTER_BLENDER_BINARY, + UFBX_EXPORTER_BLENDER_ASCII, + UFBX_EXPORTER_MOTION_BUILDER, + UFBX_EXPORTER_BC_UNITY_EXPORTER, + + UFBX_ENUM_FORCE_WIDTH(UFBX_EXPORTER) +} ufbx_exporter; + +UFBX_ENUM_TYPE(ufbx_exporter, UFBX_EXPORTER, UFBX_EXPORTER_BC_UNITY_EXPORTER); + +typedef struct ufbx_application { + ufbx_string vendor; + ufbx_string name; + ufbx_string version; +} ufbx_application; + +typedef enum ufbx_file_format UFBX_ENUM_REPR { + UFBX_FILE_FORMAT_UNKNOWN, // < Unknown file format + UFBX_FILE_FORMAT_FBX, // < .fbx Kaydara/Autodesk FBX file + UFBX_FILE_FORMAT_OBJ, // < .obj Wavefront OBJ file + UFBX_FILE_FORMAT_MTL, // < .mtl Wavefront MTL (Material template library) file + + UFBX_ENUM_FORCE_WIDTH(UFBX_FILE_FORMAT) +} ufbx_file_format; + +UFBX_ENUM_TYPE(ufbx_file_format, UFBX_FILE_FORMAT, UFBX_FILE_FORMAT_MTL); + +typedef enum ufbx_warning_type UFBX_ENUM_REPR { + // Missing external file file (for example .mtl for Wavefront .obj file or a + // geometry cache) + UFBX_WARNING_MISSING_EXTERNAL_FILE, + + // Loaded a Wavefront .mtl file derived from the filename instead of a proper + // `mtllib` statement. + UFBX_WARNING_IMPLICIT_MTL, + + // Truncated array has been auto-expanded. + UFBX_WARNING_TRUNCATED_ARRAY, + + // Out-of-bounds index has been clamped to be in-bounds. + // HINT: You can use `ufbx_index_error_handling` to adjust behavior. + UFBX_WARNING_INDEX_CLAMPED, + + // Non-UTF8 encoded strings. + // HINT: You can use `ufbx_unicode_error_handling` to adjust behavior. + UFBX_WARNING_BAD_UNICODE, + + // Non-node element connected to root. + UFBX_WARNING_BAD_ELEMENT_CONNECTED_TO_ROOT, + + // Duplicated object ID in the file, connections will be wrong. + UFBX_WARNING_DUPLICATE_OBJECT_ID, + + // Empty face has been removed. + // Use `ufbx_load_opts.allow_empty_faces` if you want to allow them. + UFBX_WARNING_EMPTY_FACE_REMOVED, + + // Unknown .obj file directive. + UFBX_WARNING_UNKNOWN_OBJ_DIRECTIVE, + + // Warnings after this one are deduplicated. + // See `ufbx_warning.count` for how many times they happened. + UFBX_WARNING_TYPE_FIRST_DEDUPLICATED = UFBX_WARNING_INDEX_CLAMPED, + + UFBX_ENUM_FORCE_WIDTH(UFBX_WARNING_TYPE) +} ufbx_warning_type; + +UFBX_ENUM_TYPE(ufbx_warning_type, UFBX_WARNING_TYPE, UFBX_WARNING_UNKNOWN_OBJ_DIRECTIVE); + +// Warning about a non-fatal issue in the file. +// Often contains information about issues that ufbx has corrected about the +// file but it might indicate something is not working properly. +typedef struct ufbx_warning { + // Type of the warning. + ufbx_warning_type type; + // Description of the warning. + ufbx_string description; + // Number of times this warning was encountered. + size_t count; +} ufbx_warning; + +UFBX_LIST_TYPE(ufbx_warning_list, ufbx_warning); + +// Miscellaneous data related to the loaded file +typedef struct ufbx_metadata { + + // List of non-fatal warnings about the file. + // If you need to only check whether a specific warning was triggered you + // can use `ufbx_metadata.has_warning[]`. + ufbx_warning_list warnings; + + // FBX ASCII file format. + bool ascii; + + // FBX version in integer format, eg. 7400 for 7.4. + uint32_t version; + + // File format of the source file. + ufbx_file_format file_format; + + // Index arrays may contain `UFBX_NO_INDEX` instead of a valid index + // to indicate gaps. + bool may_contain_no_index; + + // May contain `ufbx_mesh_material` entries where `ufbx_mesh_material.material == NULL`. + // NOTE: The corresponding `ufbx_node.material[]` will be empty in this case. + bool may_contain_null_materials; + + // May contain meshes with no defined vertex position. + // NOTE: `ufbx_mesh.vertex_position.exists` may be `false`! + bool may_contain_missing_vertex_position; + + // Arrays may contain items with `NULL` element references. + // See `ufbx_load_opts.connect_broken_elements`. + bool may_contain_broken_elements; + + // Some API guarantees do not apply (depending on unsafe options used). + // Loaded with `ufbx_load_opts.allow_unsafe` enabled. + bool is_unsafe; + + // Flag for each possible warning type. + // See `ufbx_metadata.warnings[]` for detailed warning information. + bool has_warning[UFBX_WARNING_TYPE_COUNT]; + + ufbx_string creator; + bool big_endian; + + ufbx_string filename; + ufbx_string relative_root; + + ufbx_blob raw_filename; + ufbx_blob raw_relative_root; + + ufbx_exporter exporter; + uint32_t exporter_version; + + ufbx_props scene_props; + + ufbx_application original_application; + ufbx_application latest_application; + + bool geometry_ignored; + bool animation_ignored; + bool embedded_ignored; + + size_t max_face_triangles; + + size_t result_memory_used; + size_t temp_memory_used; + size_t result_allocs; + size_t temp_allocs; + + size_t element_buffer_size; + size_t num_shader_textures; + + ufbx_real bone_prop_size_unit; + bool bone_prop_limb_length_relative; + double ktime_to_sec; + + ufbx_string original_file_path; + ufbx_blob raw_original_file_path; + +} ufbx_metadata; + +typedef enum ufbx_time_mode UFBX_ENUM_REPR { + UFBX_TIME_MODE_DEFAULT, + UFBX_TIME_MODE_120_FPS, + UFBX_TIME_MODE_100_FPS, + UFBX_TIME_MODE_60_FPS, + UFBX_TIME_MODE_50_FPS, + UFBX_TIME_MODE_48_FPS, + UFBX_TIME_MODE_30_FPS, + UFBX_TIME_MODE_30_FPS_DROP, + UFBX_TIME_MODE_NTSC_DROP_FRAME, + UFBX_TIME_MODE_NTSC_FULL_FRAME, + UFBX_TIME_MODE_PAL, + UFBX_TIME_MODE_24_FPS, + UFBX_TIME_MODE_1000_FPS, + UFBX_TIME_MODE_FILM_FULL_FRAME, + UFBX_TIME_MODE_CUSTOM, + UFBX_TIME_MODE_96_FPS, + UFBX_TIME_MODE_72_FPS, + UFBX_TIME_MODE_59_94_FPS, + + UFBX_ENUM_FORCE_WIDTH(UFBX_TIME_MODE) +} ufbx_time_mode; + +UFBX_ENUM_TYPE(ufbx_time_mode, UFBX_TIME_MODE, UFBX_TIME_MODE_59_94_FPS); + +typedef enum ufbx_time_protocol UFBX_ENUM_REPR { + UFBX_TIME_PROTOCOL_SMPTE, + UFBX_TIME_PROTOCOL_FRAME_COUNT, + UFBX_TIME_PROTOCOL_DEFAULT, + + UFBX_ENUM_FORCE_WIDTH(UFBX_TIME_PROTOCOL) +} ufbx_time_protocol; + +UFBX_ENUM_TYPE(ufbx_time_protocol, UFBX_TIME_PROTOCOL, UFBX_TIME_PROTOCOL_DEFAULT); + +typedef enum ufbx_snap_mode UFBX_ENUM_REPR { + UFBX_SNAP_MODE_NONE, + UFBX_SNAP_MODE_SNAP, + UFBX_SNAP_MODE_PLAY, + UFBX_SNAP_MODE_SNAP_AND_PLAY, + + UFBX_ENUM_FORCE_WIDTH(UFBX_SNAP_MODE) +} ufbx_snap_mode; + +UFBX_ENUM_TYPE(ufbx_snap_mode, UFBX_SNAP_MODE, UFBX_SNAP_MODE_SNAP_AND_PLAY); + +// Global settings: Axes and time/unit scales +typedef struct ufbx_scene_settings { + ufbx_props props; + + // Mapping of X/Y/Z axes to world-space directions. + // HINT: Use `ufbx_load_opts.target_axes` to normalize this. + // NOTE: This contains the _original_ axes even if you supply `ufbx_load_opts.target_axes`. + ufbx_coordinate_axes axes; + + // How many meters does a single world-space unit represent. + // FBX files usually default to centimeters, reported as `0.01` here. + // HINT: Use `ufbx_load_opts.target_unit_meters` to normalize this. + ufbx_real unit_meters; + + double frames_per_second; + + ufbx_vec3 ambient_color; + ufbx_string default_camera; + + ufbx_time_mode time_mode; + ufbx_time_protocol time_protocol; + ufbx_snap_mode snap_mode; + + // Original settings (?) + ufbx_coordinate_axis original_axis_up; + ufbx_real original_unit_meters; +} ufbx_scene_settings; + +struct ufbx_scene { + ufbx_metadata metadata; + + // Global settings + ufbx_scene_settings settings; + + // Node instances in the scene + ufbx_node *root_node; + + // Default animation descriptor + ufbx_anim anim; + + // All animation stacks combined + ufbx_anim combined_anim; + + union { + struct { + ufbx_unknown_list unknowns; + + // Nodes + ufbx_node_list nodes; + + // Node attributes (common) + ufbx_mesh_list meshes; + ufbx_light_list lights; + ufbx_camera_list cameras; + ufbx_bone_list bones; + ufbx_empty_list empties; + + // Node attributes (curves/surfaces) + ufbx_line_curve_list line_curves; + ufbx_nurbs_curve_list nurbs_curves; + ufbx_nurbs_surface_list nurbs_surfaces; + ufbx_nurbs_trim_surface_list nurbs_trim_surfaces; + ufbx_nurbs_trim_boundary_list nurbs_trim_boundaries; + + // Node attributes (advanced) + ufbx_procedural_geometry_list procedural_geometries; + ufbx_stereo_camera_list stereo_cameras; + ufbx_camera_switcher_list camera_switchers; + ufbx_marker_list markers; + ufbx_lod_group_list lod_groups; + + // Deformers + ufbx_skin_deformer_list skin_deformers; + ufbx_skin_cluster_list skin_clusters; + ufbx_blend_deformer_list blend_deformers; + ufbx_blend_channel_list blend_channels; + ufbx_blend_shape_list blend_shapes; + ufbx_cache_deformer_list cache_deformers; + ufbx_cache_file_list cache_files; + + // Materials + ufbx_material_list materials; + ufbx_texture_list textures; + ufbx_video_list videos; + ufbx_shader_list shaders; + ufbx_shader_binding_list shader_bindings; + + // Animation + ufbx_anim_stack_list anim_stacks; + ufbx_anim_layer_list anim_layers; + ufbx_anim_value_list anim_values; + ufbx_anim_curve_list anim_curves; + + // Collections + ufbx_display_layer_list display_layers; + ufbx_selection_set_list selection_sets; + ufbx_selection_node_list selection_nodes; + + // Constraints + ufbx_character_list characters; + ufbx_constraint_list constraints; + + // Miscellaneous + ufbx_pose_list poses; + ufbx_metadata_object_list metadata_objects; + }; + + ufbx_element_list elements_by_type[UFBX_ELEMENT_TYPE_COUNT]; + }; + + // Unique texture files referenced by the scene. + ufbx_texture_file_list texture_files; + + // All elements and connections in the whole file + ufbx_element_list elements; // < Sorted by `id` + ufbx_connection_list connections_src; // < Sorted by `src,src_prop` + ufbx_connection_list connections_dst; // < Sorted by `dst,dst_prop` + + // Elements sorted by name, type + ufbx_name_element_list elements_by_name; + + // Enabled if `ufbx_load_opts.retain_dom == true`. + ufbx_nullable ufbx_dom_node *dom_root; +}; + +// -- Curves + +typedef struct ufbx_curve_point { + bool valid; + ufbx_vec3 position; + ufbx_vec3 derivative; +} ufbx_curve_point; + +typedef struct ufbx_surface_point { + bool valid; + ufbx_vec3 position; + ufbx_vec3 derivative_u; + ufbx_vec3 derivative_v; +} ufbx_surface_point; + +// -- Mesh topology + +typedef enum ufbx_topo_flags UFBX_FLAG_REPR { + UFBX_TOPO_NON_MANIFOLD = 0x1, // < Edge with three or more faces + + UFBX_FLAG_FORCE_WIDTH(UFBX_TOPO_FLAGS) +} ufbx_topo_flags; + +typedef struct ufbx_topo_edge { + uint32_t index; // < Starting index of the edge, always defined + uint32_t next; // < Ending index of the edge / next per-face `ufbx_topo_edge`, always defined + uint32_t prev; // < Previous per-face `ufbx_topo_edge`, always defined + uint32_t twin; // < `ufbx_topo_edge` on the opposite side, `UFBX_NO_INDEX` if not found + uint32_t face; // < Index into `mesh->faces[]`, always defined + uint32_t edge; // < Index into `mesh->edges[]`, `UFBX_NO_INDEX` if not found + + ufbx_topo_flags flags; +} ufbx_topo_edge; + +typedef struct ufbx_vertex_stream { + const void *data; + size_t vertex_size; +} ufbx_vertex_stream; + +// -- Memory callbacks + +// You can optionally provide an allocator to ufbx, the default is to use the +// CRT malloc/realloc/free + +// Allocate `size` bytes, must be at least 8 byte aligned +typedef void *ufbx_alloc_fn(void *user, size_t size); + +// Reallocate `old_ptr` from `old_size` to `new_size` +// NOTE: If omit `alloc_fn` and `free_fn` they will be translated to: +// `alloc(size)` -> `realloc_fn(user, NULL, 0, size)` +// `free_fn(ptr, size)` -> `realloc_fn(user, ptr, size, 0)` +typedef void *ufbx_realloc_fn(void *user, void *old_ptr, size_t old_size, size_t new_size); + +// Free pointer `ptr` (of `size` bytes) returned by `alloc_fn` or `realloc_fn` +typedef void ufbx_free_fn(void *user, void *ptr, size_t size); + +// Free the allocator itself +typedef void ufbx_free_allocator_fn(void *user); + +// Allocator callbacks and user context +// NOTE: The allocator will be stored to the loaded scene and will be called +// again from `ufbx_free_scene()` so make sure `user` outlives that! +// You can use `free_allocator_fn()` to free the allocator yourself. +typedef struct ufbx_allocator { + // Callback functions, see `typedef`s above for information + ufbx_alloc_fn *alloc_fn; + ufbx_realloc_fn *realloc_fn; + ufbx_free_fn *free_fn; + ufbx_free_allocator_fn *free_allocator_fn; + void *user; +} ufbx_allocator; + +typedef struct ufbx_allocator_opts { + // Allocator callbacks + ufbx_allocator allocator; + + // Maximum number of bytes to allocate before failing + size_t memory_limit; + + // Maximum number of allocations to attempt before failing + size_t allocation_limit; + + // Threshold to swap from batched allocations to individual ones + // Defaults to 1MB if set to zero + // NOTE: If set to `1` ufbx will allocate everything in the smallest + // possible chunks which may be useful for debugging (eg. ASAN) + size_t huge_threshold; + + // Maximum size of a single allocation containing sub-allocations. + // Defaults to 16MB if set to zero + // The maximum amount of wasted memory depends on `max_chunk_size` and + // `huge_threshold`: each chunk can waste up to `huge_threshold` bytes + // internally and the last chunk might be incomplete. So for example + // with the defaults we can waste around 1MB/16MB = 6.25% overall plus + // up to 32MB due to the two incomplete blocks. The actual amounts differ + // slightly as the chunks start out at 4kB and double in size each time, + // meaning that the maximum fixed overhead (up to 32MB with defaults) is + // at most ~30% of the total allocation size. + size_t max_chunk_size; + +} ufbx_allocator_opts; + +// -- IO callbacks + +// Try to read up to `size` bytes to `data`, return the amount of read bytes. +// Return `SIZE_MAX` to indicate an IO error. +typedef size_t ufbx_read_fn(void *user, void *data, size_t size); + +// Skip `size` bytes in the file. +typedef bool ufbx_skip_fn(void *user, size_t size); + +// Close the file +typedef void ufbx_close_fn(void *user); + +typedef struct ufbx_stream { + ufbx_read_fn *read_fn; // < Required + ufbx_skip_fn *skip_fn; // < Optional: Will use `read_fn()` if missing + ufbx_close_fn *close_fn; // < Optional + + // Context passed to other functions + void *user; +} ufbx_stream; + +typedef enum ufbx_open_file_type UFBX_ENUM_REPR { + UFBX_OPEN_FILE_MAIN_MODEL, // < Main model file + UFBX_OPEN_FILE_GEOMETRY_CACHE, // < Unknown geometry cache file + UFBX_OPEN_FILE_OBJ_MTL, // < .mtl material library file + + UFBX_ENUM_FORCE_WIDTH(UFBX_OPEN_FILE_TYPE) +} ufbx_open_file_type; + +UFBX_ENUM_TYPE(ufbx_open_file_type, UFBX_OPEN_FILE_TYPE, UFBX_OPEN_FILE_OBJ_MTL); + +typedef struct ufbx_open_file_info { + // Kind of file to load. + ufbx_open_file_type type; + + // Temporary allocator to use. + ufbx_allocator temp_allocator; + + // Original filename in the file, not resolved or UTF-8 encoded. + // NOTE: Not necessarily NULL-terminated! + ufbx_blob original_filename; +} ufbx_open_file_info; + +// Callback for opening an external file from the filesystem +typedef bool ufbx_open_file_fn(void *user, ufbx_stream *stream, const char *path, size_t path_len, const ufbx_open_file_info *info); + +typedef struct ufbx_open_file_cb { + ufbx_open_file_fn *fn; + void *user; + + UFBX_CALLBACK_IMPL(ufbx_open_file_cb, ufbx_open_file_fn, bool, + (void *user, ufbx_stream *stream, const char *path, size_t path_len, const ufbx_open_file_info *info), + (stream, path, path_len, info)) +} ufbx_open_file_cb; + +// Memory stream options +typedef void ufbx_close_memory_fn(void *user, void *data, size_t data_size); + +typedef struct ufbx_close_memory_cb { + ufbx_close_memory_fn *fn; + void *user; + + UFBX_CALLBACK_IMPL(ufbx_close_memory_cb, ufbx_close_memory_fn, void, + (void *user, void *data, size_t data_size), + (data, data_size)) +} ufbx_close_memory_cb; + +// Options for `ufbx_open_memory()`. +typedef struct ufbx_open_memory_opts { + uint32_t _begin_zero; + + // Allocator to allocate the memory with. + // NOTE: Used even if no copy is made to allocate a small metadata block. + ufbx_allocator_opts allocator; + + // Do not copy the memory. + // You can use `close_cb` to free the memory when the stream is closed. + // NOTE: This means the provided data pointer is referenced after creating + // the memory stream, make sure the data stays valid until the stream is closed! + ufbx_unsafe bool no_copy; + + // Callback to free the memory blob. + ufbx_close_memory_cb close_cb; + + uint32_t _end_zero; +} ufbx_open_memory_opts; + +// Detailed error stack frame +typedef struct ufbx_error_frame { + uint32_t source_line; + ufbx_string function; + ufbx_string description; +} ufbx_error_frame; + +// Error causes (and `UFBX_ERROR_NONE` for no error). +typedef enum ufbx_error_type UFBX_ENUM_REPR { + + // No error, operation has been performed successfully. + UFBX_ERROR_NONE, + + // Unspecified error, most likely caused by an invalid FBX file or a file + // that contains something ufbx can't handle. + UFBX_ERROR_UNKNOWN, + + // File not found. + UFBX_ERROR_FILE_NOT_FOUND, + + // Out of memory (allocator returned `NULL`). + UFBX_ERROR_OUT_OF_MEMORY, + + // `ufbx_allocator_opts.memory_limit` exhausted. + UFBX_ERROR_MEMORY_LIMIT, + + // `ufbx_allocator_opts.allocation_limit` exhausted. + UFBX_ERROR_ALLOCATION_LIMIT, + + // File ended abruptly. + UFBX_ERROR_TRUNCATED_FILE, + + // IO read error. + // eg. returning `SIZE_MAX` from `ufbx_stream.read_fn` or stdio `ferror()` condition. + UFBX_ERROR_IO, + + // User cancelled the loading via `ufbx_load_opts.progress_cb` returning `UFBX_PROGRESS_CANCEL`. + UFBX_ERROR_CANCELLED, + + // Could not detect file format from file data or filename. + // HINT: You can supply it manually using `ufbx_load_opts.file_format` or use `ufbx_load_opts.filename` + // when using `ufbx_load_memory()` to let ufbx guess the format from the extension. + UFBX_ERROR_UNRECOGNIZED_FILE_FORMAT, + + // Options struct (eg. `ufbx_load_opts`) is not cleared to zero. + // Make sure you initialize the structure to zero via eg. + // ufbx_load_opts opts = { 0 }; // C + // ufbx_load_opts opts = { }; // C++ + UFBX_ERROR_UNINITIALIZED_OPTIONS, + + // The vertex streams in `ufbx_generate_indices()` are empty. + UFBX_ERROR_ZERO_VERTEX_SIZE, + + // Invalid UTF-8 encountered in a file when loading with `UFBX_UNICODE_ERROR_HANDLING_ABORT_LOADING`. + UFBX_ERROR_INVALID_UTF8, + + // Feature needed for the operation has been compiled out. + UFBX_ERROR_FEATURE_DISABLED, + + // Attempting to tessellate an invalid NURBS object. + // See `ufbx_nurbs_basis.valid`. + UFBX_ERROR_BAD_NURBS, + + // Out of bounds index in the file when loading with `UFBX_INDEX_ERROR_HANDLING_ABORT_LOADING`. + UFBX_ERROR_BAD_INDEX, + + // Unsafe options specified without enabling `ufbx_load_opts.allow_unsafe`. + UFBX_ERROR_UNSAFE_OPTIONS, + + UFBX_ENUM_FORCE_WIDTH(UFBX_ERROR_TYPE) +} ufbx_error_type; + +UFBX_ENUM_TYPE(ufbx_error_type, UFBX_ERROR_TYPE, UFBX_ERROR_UNSAFE_OPTIONS); + +// Error description with detailed stack trace +// HINT: You can use `ufbx_format_error()` for formatting the error +typedef struct ufbx_error { + ufbx_error_type type; + ufbx_string description; + uint32_t stack_size; + ufbx_error_frame stack[UFBX_ERROR_STACK_MAX_DEPTH]; + size_t info_length; + char info[UFBX_ERROR_INFO_LENGTH]; +} ufbx_error; + +// -- Progress callbacks + +typedef struct ufbx_progress { + uint64_t bytes_read; + uint64_t bytes_total; +} ufbx_progress; + +typedef enum ufbx_progress_result UFBX_ENUM_REPR { + UFBX_PROGRESS_CONTINUE = 0x100, + UFBX_PROGRESS_CANCEL = 0x200, + + UFBX_ENUM_FORCE_WIDTH(UFBX_PROGRESS_RESULT) +} ufbx_progress_result; + +// Called periodically with the current progress +// Return `false` to cancel further processing +typedef ufbx_progress_result ufbx_progress_fn(void *user, const ufbx_progress *progress); + +typedef struct ufbx_progress_cb { + ufbx_progress_fn *fn; + void *user; + + UFBX_CALLBACK_IMPL(ufbx_progress_cb, ufbx_progress_fn, ufbx_progress_result, + (void *user, const ufbx_progress *progress), + (progress)) +} ufbx_progress_cb; + +// -- Inflate + +typedef struct ufbx_inflate_input ufbx_inflate_input; +typedef struct ufbx_inflate_retain ufbx_inflate_retain; + +// Source data/stream to decompress with `ufbx_inflate()` +struct ufbx_inflate_input { + // Total size of the data in bytes + size_t total_size; + + // (optional) Initial or complete data chunk + const void *data; + size_t data_size; + + // (optional) Temporary buffer, defaults to 256b stack buffer + void *buffer; + size_t buffer_size; + + // (optional) Streaming read function, concatenated after `data` + ufbx_read_fn *read_fn; + void *read_user; + + // (optional) Progress reporting + ufbx_progress_cb progress_cb; + uint64_t progress_interval_hint; // < Bytes between progress report calls + + // (optional) Change the progress scope + uint64_t progress_size_before; + uint64_t progress_size_after; + + // (optional) No the DEFLATE header + bool no_header; + + // (optional) No the Adler32 checksum + bool no_checksum; + + // (optional) Force internal fast lookup bit amount + size_t internal_fast_bits; +}; + +// Persistent data between `ufbx_inflate()` calls +// NOTE: You must set `initialized` to `false`, but `data` may be uninitialized +struct ufbx_inflate_retain { + bool initialized; + uint64_t data[1024]; +}; + +typedef enum ufbx_index_error_handling UFBX_ENUM_REPR { + // Clamp to a valid value. + UFBX_INDEX_ERROR_HANDLING_CLAMP, + // Set bad indices to `UFBX_NO_INDEX`. + // This is the recommended way if you need to deal with files with gaps in information. + // HINT: If you use this `ufbx_get_vertex_TYPE()` functions will return zero + // on invalid indices instead of failing. + UFBX_INDEX_ERROR_HANDLING_NO_INDEX, + // Fail loading entierely when encountering a bad index. + UFBX_INDEX_ERROR_HANDLING_ABORT_LOADING, + // Pass bad indices through as-is. + // Requires `ufbx_load_opts.allow_unsafe`. + // UNSAFE: Breaks any API guarantees regarding indexes being in bounds and makes + // `ufbx_get_vertex_TYPE()` memory-unsafe to use. + UFBX_INDEX_ERROR_HANDLING_UNSAFE_IGNORE, + + UFBX_ENUM_FORCE_WIDTH(UFBX_INDEX_ERROR_HANDLING) +} ufbx_index_error_handling; + +UFBX_ENUM_TYPE(ufbx_index_error_handling, UFBX_INDEX_ERROR_HANDLING, UFBX_INDEX_ERROR_HANDLING_UNSAFE_IGNORE); + +typedef enum ufbx_unicode_error_handling UFBX_ENUM_REPR { + // Replace errors with U+FFFD "Replacement Character" + UFBX_UNICODE_ERROR_HANDLING_REPLACEMENT_CHARACTER, + // Replace errors with '_' U+5F "Low Line" + UFBX_UNICODE_ERROR_HANDLING_UNDERSCORE, + // Replace errors with '?' U+3F "Question Mark" + UFBX_UNICODE_ERROR_HANDLING_QUESTION_MARK, + // Remove errors from the output + UFBX_UNICODE_ERROR_HANDLING_REMOVE, + // Fail loading on encountering an Unicode error + UFBX_UNICODE_ERROR_HANDLING_ABORT_LOADING, + // Ignore and pass-through non-UTF-8 string data. + // Requires `ufbx_load_opts.allow_unsafe`. + // UNSAFE: Breaks API guarantee that `ufbx_string` is UTF-8 encoded. + UFBX_UNICODE_ERROR_HANDLING_UNSAFE_IGNORE, + + UFBX_ENUM_FORCE_WIDTH(UFBX_UNICODE_ERROR_HANDLING) +} ufbx_unicode_error_handling; + +UFBX_ENUM_TYPE(ufbx_unicode_error_handling, UFBX_UNICODE_ERROR_HANDLING, UFBX_UNICODE_ERROR_HANDLING_UNSAFE_IGNORE); + +// How to handle FBX node geometry transforms. +// FBX nodes can have "geometry transforms" that affect only the attached meshes, +// but not the children. This is not allowed in many scene representations so +// ufbx provides some ways to simplify them. +// Geometry transforms can also be used to transform any other attributes such +// as lights or cameras. +typedef enum ufbx_geometry_transform_handling UFBX_ENUM_REPR { + + // Preserve the geometry transforms as-is. + // To be correct for all files you have to use `ufbx_node.geometry_transform`, + // `ufbx_node.geometry_to_node`, or `ufbx_node.geometry_to_world` to compensate + // for any potential geometry transforms. + UFBX_GEOMETRY_TRANSFORM_HANDLING_PRESERVE, + + // Add helper nodes between the nodes and geometry where needed. + // The created nodes have `ufbx_node.is_geometry_transform_helper` set and are + // named `ufbx_load_opts.geometry_transform_helper_name`. + UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES, + + // Modify the geometry of meshes attached to nodes with geometry transforms. + // Will add helper nodes like `UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES` if + // necessary, for example if there are multiple instances of the same mesh with + // geometry transforms. + UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY, + + // Modify the geometry of meshes attached to nodes with geometry transforms. + // NOTE: This will not work correctly for instanced geometry. + UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY_NO_FALLBACK, + + UFBX_ENUM_FORCE_WIDTH(UFBX_GEOMETRY_TRANSFORM_HANDLING) +} ufbx_geometry_transform_handling; + +UFBX_ENUM_TYPE(ufbx_geometry_transform_handling, UFBX_GEOMETRY_TRANSFORM_HANDLING, UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY_NO_FALLBACK); + +// Specify how unit / coordinate system conversion should be performed. +// Affects how `ufbx_load_opts.target_axes` and `ufbx_load_opts.target_unit_meters` work, +// has no effect if neither is specified. +typedef enum ufbx_space_conversion UFBX_ENUM_REPR { + + // Store the space conversion transform in the root node. + // Sets `ufbx_node.local_transform` of the root node. + UFBX_SPACE_CONVERSION_TRANSFORM_ROOT, + + // Perform the conversion by using "adjust" transforms. + // Compensates for the transforms using `ufbx_node.adjust_pre_rotation` and + // `ufbx_node.adjust_pre_scale`. You don't need to account for these unless + // you are manually building transforms from `ufbx_props`. + UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS, + + UFBX_ENUM_FORCE_WIDTH(UFBX_SPACE_CONVERSION) +} ufbx_space_conversion; + +UFBX_ENUM_TYPE(ufbx_space_conversion, UFBX_SPACE_CONVERSION, UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS); + +// -- Main API + +// Options for `ufbx_load_file/memory/stream/stdio()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +typedef struct ufbx_load_opts { + uint32_t _begin_zero; + + ufbx_allocator_opts temp_allocator; // < Allocator used during loading + ufbx_allocator_opts result_allocator; // < Allocator used for the final scene + + // Preferences + bool ignore_geometry; // < Do not load geometry datsa (vertices, indices, etc) + bool ignore_animation; // < Do not load animation curves + bool ignore_embedded; // < Do not load embedded content + bool ignore_all_content; // < Do not load any content (geometry, animation, embedded) + + bool evaluate_skinning; // < Evaluate skinning (see ufbx_mesh.skinned_vertices) + bool evaluate_caches; // < Evaluate vertex caches (see ufbx_mesh.skinned_vertices) + + // Try to open external files referenced by the main file automatically. + // Applies to geometry caches and .mtl files for OBJ. + // NOTE: This may be risky for untrusted data as the input files may contain + // references to arbitrary paths in the filesystem. + // NOTE: This only applies to files *implicitly* referenced by the scene, if + // you request additional files via eg. `ufbx_load_opts.obj_mtl_path` they + // are still loaded. + bool load_external_files; + + // Don't fail loading if external files are not found. + bool ignore_missing_external_files; + + // Don't compute `ufbx_skin_deformer` `vertices` and `weights` arrays saving + // a bit of memory and time if not needed + bool skip_skin_vertices; + + // Don't adjust reading the FBX file depending on the detected exporter + bool disable_quirks; + + // Don't allow partially broken FBX files to load + bool strict; + + // UNSAFE: If enabled allows using unsafe options that may fundamentally + // break the API guarantees. + ufbx_unsafe bool allow_unsafe; + + // Specify how to handle broken indices. + ufbx_index_error_handling index_error_handling; + + // Connect related elements even if they are broken. If `false` (default) + // `ufbx_skin_cluster` with a missing `bone` field are _not_ included in + // the `ufbx_skin_deformer.clusters[]` array for example. + bool connect_broken_elements; + + // Allow nodes that are not connected in any way to the root. Conversely if + // disabled, all lone nodes will be parented under `ufbx_scene.root_node`. + bool allow_nodes_out_of_root; + + // If a mesh does not have a material create a `ufbx_mesh_material` part + // with a `NULL` material pointer. This can be more convenient if you need + // to split models into parts per material. + bool allow_null_material; + + // Allow meshes with no vertex position attribute. + // NOTE: If this is set `ufbx_mesh.vertex_position.exists` may be `false`. + bool allow_missing_vertex_position; + + // Allow faces with zero indices. + bool allow_empty_faces; + + // Generate vertex normals for a meshes that are missing normals. + // You can see if the normals have been generated from `ufbx_mesh.generated_normals`. + bool generate_missing_normals; + + // Ignore `open_file_cb` when loading the main file. + bool open_main_file_with_default; + + // Path separator character, defaults to '\' on Windows and '/' otherwise. + char path_separator; + + // Estimated file size for progress reporting + uint64_t file_size_estimate; + + // Buffer size in bytes to use for reading from files or IO callbacks + size_t read_buffer_size; + + // Filename to use as a base for relative file paths if not specified using + // `ufbx_load_file()`. Use `length = SIZE_MAX` for NULL-terminated strings. + // `raw_filename` will be derived from this if empty. + ufbx_string filename; + + // Raw non-UTF8 filename. Does not support NULL termination. + // `filename` will be derived from this if empty. + ufbx_blob raw_filename; + + // Progress reporting + ufbx_progress_cb progress_cb; + uint64_t progress_interval_hint; // < Bytes between progress report calls + + // External file callbacks (defaults to stdio.h) + ufbx_open_file_cb open_file_cb; + + // How to handle geometry transforms in the nodes. + // See `ufbx_geometry_transform_handling` for an explanation. + ufbx_geometry_transform_handling geometry_transform_handling; + + // How to perform space conversion by `target_axes` and `target_unit_meters`. + // See `ufbx_space_conversion` for an explanation. + ufbx_space_conversion space_conversion; + + // Apply an implicit root transformation to match axes. + // Used if `ufbx_coordinate_axes_valid(target_axes)`. + ufbx_coordinate_axes target_axes; + + // Scale the scene so that one world-space unit is `target_unit_meters` meters. + // By default units are not scaled. + ufbx_real target_unit_meters; + + // Target space for camera. + // By default FBX cameras point towards the positive X axis. + // Used if `ufbx_coordinate_axes_valid(target_camera_axes)`. + ufbx_coordinate_axes target_camera_axes; + + // Target space for directed lights. + // By default FBX lights point towards the negative Y axis. + // Used if `ufbx_coordinate_axes_valid(target_light_axes)`. + ufbx_coordinate_axes target_light_axes; + + // Name for dummy geometry transform helper nodes. + // See `UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES`. + ufbx_string geometry_transform_helper_name; + + // Do not scale necessary properties curves with `target_unit_meters`. + // Used only if `space_conversion == UFBX_SPACE_CONVERSION_TRANSFORM_ROOT`. + bool no_prop_unit_scaling; + + // Do not scale necessary animation curves with `target_unit_meters`. + // Used only if `space_conversion == UFBX_SPACE_CONVERSION_TRANSFORM_ROOT`. + bool no_anim_curve_unit_scaling; + + // Normalize vertex normals. + bool normalize_normals; + + // Normalize tangents and bitangents. + bool normalize_tangents; + + // Override for the root transform + bool use_root_transform; + ufbx_transform root_transform; + + // Specify how to handle Unicode errors in strings. + ufbx_unicode_error_handling unicode_error_handling; + + // Retain the raw document structure using `ufbx_dom_node`. + bool retain_dom; + + // Force a specific file format instead of detecting it. + ufbx_file_format file_format; + + // How far to read into the file to determine the file format. + // Default: 16kB + size_t file_format_lookahead; + + // Do not attempt to detect file format from file content. + bool no_format_from_content; + + // Do not attempt to detect file format from filename extension. + // ufbx primarily detects file format from the file header, + // this is just used as a fallback. + bool no_format_from_extension; + + // (.obj) Try to find .mtl file with matching filename as the .obj file. + // Used if the file specified `mtllib` line is not found, eg. for a file called + // `model.obj` that contains the line `usemtl materials.mtl`, ufbx would first + // try to open `materials.mtl` and if that fails it tries to open `model.mtl`. + bool obj_search_mtl_by_filename; + + // (.obj) Don't split geometry into meshes by object. + bool obj_merge_objects; + + // (.obj) Don't split geometry into meshes by groups. + bool obj_merge_groups; + + // (.obj) Force splitting groups even on object boundaries. + bool obj_split_groups; + + // (.obj) Path to the .mtl file. + // Use `length = SIZE_MAX` for NULL-terminated strings. + // NOTE: This is used _instead_ of the one in the file even if not found + // and sidesteps `load_external_files` as it's _explicitly_ requested. + ufbx_string obj_mtl_path; + + // (.obj) Data for the .mtl file. + ufbx_blob obj_mtl_data; + + uint32_t _end_zero; +} ufbx_load_opts; + +// Options for `ufbx_evaluate_scene()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +typedef struct ufbx_evaluate_opts { + uint32_t _begin_zero; + + ufbx_allocator_opts temp_allocator; // < Allocator used during evaluation + ufbx_allocator_opts result_allocator; // < Allocator used for the final scene + + bool evaluate_skinning; // < Evaluate skinning (see ufbx_mesh.skinned_vertices) + bool evaluate_caches; // < Evaluate vertex caches (see ufbx_mesh.skinned_vertices) + + // WARNING: Potentially unsafe! Try to open external files such as geometry caches + bool load_external_files; + + // External file callbacks (defaults to stdio.h) + ufbx_open_file_cb open_file_cb; + + uint32_t _end_zero; +} ufbx_evaluate_opts; + +// Options for `ufbx_tessellate_nurbs_curve()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +typedef struct ufbx_tessellate_curve_opts { + uint32_t _begin_zero; + + ufbx_allocator_opts temp_allocator; // < Allocator used during tessellation + ufbx_allocator_opts result_allocator; // < Allocator used for the final line curve + + // How many segments tessellate each step in `ufbx_nurbs_basis.steps`. + uint32_t span_subdivision; + + uint32_t _end_zero; +} ufbx_tessellate_curve_opts; + +// Options for `ufbx_tessellate_nurbs_surface()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +typedef struct ufbx_tessellate_surface_opts { + uint32_t _begin_zero; + + ufbx_allocator_opts temp_allocator; // < Allocator used during tessellation + ufbx_allocator_opts result_allocator; // < Allocator used for the final mesh + + // How many segments tessellate each step in `ufbx_nurbs_basis.steps`. + // NOTE: Default is `4`, _not_ `ufbx_nurbs_surface.span_subdivision_u/v` as that + // would make it easy to create an FBX file with an absurdly high subdivision + // rate (similar to mesh subdivision). Please enforce copy the value yourself + // enforcing whatever limits you deem reasonable. + uint32_t span_subdivision_u; + uint32_t span_subdivision_v; + + uint32_t _end_zero; +} ufbx_tessellate_surface_opts; + +// Options for `ufbx_subdivide_mesh()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +typedef struct ufbx_subdivide_opts { + uint32_t _begin_zero; + + ufbx_allocator_opts temp_allocator; // < Allocator used during subdivision + ufbx_allocator_opts result_allocator; // < Allocator used for the final mesh + + ufbx_subdivision_boundary boundary; + ufbx_subdivision_boundary uv_boundary; + + // Do not generate normals + bool ignore_normals; + + // Interpolate existing normals using the subdivision rules + // instead of generating new normals + bool interpolate_normals; + + // Subdivide also tangent attributes + bool interpolate_tangents; + + // Map subdivided vertices into weighted original vertices. + // NOTE: May be O(n^2) if `max_source_vertices` is not specified! + bool evaluate_source_vertices; + + // Limit source vertices per subdivided vertex. + size_t max_source_vertices; + + // Calculate bone influences over subdivided vertices (if applicable). + // NOTE: May be O(n^2) if `max_skin_weights` is not specified! + bool evaluate_skin_weights; + + // Limit bone influences per subdivided vertex. + size_t max_skin_weights; + + // Index of the skin deformer to use for `evaluate_skin_weights`. + size_t skin_deformer_index; + + uint32_t _end_zero; +} ufbx_subdivide_opts; + +// Options for `ufbx_load_geometry_cache()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +typedef struct ufbx_geometry_cache_opts { + uint32_t _begin_zero; + + ufbx_allocator_opts temp_allocator; // < Allocator used during loading + ufbx_allocator_opts result_allocator; // < Allocator used for the final scene + + // External file callbacks (defaults to stdio.h) + ufbx_open_file_cb open_file_cb; + + // FPS value for converting frame times to seconds + double frames_per_second; + + uint32_t _end_zero; +} ufbx_geometry_cache_opts; + +// Options for `ufbx_read_geometry_cache_*()` +// NOTE: Initialize to zero with `{ 0 }` (C) or `{ }` (C++) +typedef struct ufbx_geometry_cache_data_opts { + uint32_t _begin_zero; + + // External file callbacks (defaults to stdio.h) + ufbx_open_file_cb open_file_cb; + + bool additive; + bool use_weight; + ufbx_real weight; + + uint32_t _end_zero; +} ufbx_geometry_cache_data_opts; + +typedef struct ufbx_panic { + bool did_panic; + size_t message_length; + char message[UFBX_PANIC_MESSAGE_LENGTH]; +} ufbx_panic; + +// -- API + +#ifdef __cplusplus +extern "C" { +#endif + +// Various zero/empty/identity values +extern const ufbx_string ufbx_empty_string; +extern const ufbx_blob ufbx_empty_blob; +extern const ufbx_matrix ufbx_identity_matrix; +extern const ufbx_transform ufbx_identity_transform; +extern const ufbx_vec2 ufbx_zero_vec2; +extern const ufbx_vec3 ufbx_zero_vec3; +extern const ufbx_vec4 ufbx_zero_vec4; +extern const ufbx_quat ufbx_identity_quat; + +// Commonly used coordinate axes + +extern const ufbx_coordinate_axes ufbx_axes_right_handed_y_up; +extern const ufbx_coordinate_axes ufbx_axes_right_handed_z_up; +extern const ufbx_coordinate_axes ufbx_axes_left_handed_y_up; +extern const ufbx_coordinate_axes ufbx_axes_left_handed_z_up; + +// Sizes of element types. eg `sizeof(ufbx_node)` +extern const size_t ufbx_element_type_size[UFBX_ELEMENT_TYPE_COUNT]; + +// Version of the source file, comparable to `UFBX_HEADER_VERSION` +extern const uint32_t ufbx_source_version; + +// Practically always `true` (see below), if not you need to be careful with threads. +// +// Guaranteed to be `true` in _any_ of the following conditions: +// - ufbx.c has been compiled using: GCC / Clang / MSVC / ICC / EMCC / TCC +// - ufbx.c has been compiled as C++11 or later +// - ufbx.c has been compiled as C11 or later with `` support +// +// If `false` you can't call the following functions concurrently: +// ufbx_evaluate_scene() +// ufbx_free_scene() +// ufbx_subdivide_mesh() +// ufbx_tessellate_nurbs_surface() +// ufbx_free_mesh() +ufbx_abi bool ufbx_is_thread_safe(void); + +// Load a scene from a `size` byte memory buffer at `data` +ufbx_abi ufbx_scene *ufbx_load_memory( + const void *data, size_t data_size, + const ufbx_load_opts *opts, ufbx_error *error); + +// Load a scene by opening a file named `filename` +ufbx_abi ufbx_scene *ufbx_load_file( + const char *filename, + const ufbx_load_opts *opts, ufbx_error *error); +ufbx_abi ufbx_scene *ufbx_load_file_len( + const char *filename, size_t filename_len, + const ufbx_load_opts *opts, ufbx_error *error); + +// Load a scene by reading from an `FILE *file` stream +// NOTE: `file` is passed as a `void` pointer to avoid including +ufbx_abi ufbx_scene *ufbx_load_stdio( + void *file, + const ufbx_load_opts *opts, ufbx_error *error); + +// Load a scene by reading from an `FILE *file` stream with a prefix +// NOTE: `file` is passed as a `void` pointer to avoid including +ufbx_abi ufbx_scene *ufbx_load_stdio_prefix( + void *file, + const void *prefix, size_t prefix_size, + const ufbx_load_opts *opts, ufbx_error *error); + +// Load a scene from a user-specified stream +ufbx_abi ufbx_scene *ufbx_load_stream( + const ufbx_stream *stream, + const ufbx_load_opts *opts, ufbx_error *error); + +// Load a scene from a user-specified stream with a prefix +ufbx_abi ufbx_scene *ufbx_load_stream_prefix( + const ufbx_stream *stream, + const void *prefix, size_t prefix_size, + const ufbx_load_opts *opts, ufbx_error *error); + +// Free a previously loaded or evaluated scene +ufbx_abi void ufbx_free_scene(ufbx_scene *scene); + +// Increment `scene` refcount +ufbx_abi void ufbx_retain_scene(ufbx_scene *scene); + +// Format a textual description of `error`. +// Always produces a NULL-terminated string to `char dst[dst_size]`, truncating if +// necessary. Returns the number of characters written not including the NULL terminator. +ufbx_abi size_t ufbx_format_error(char *dst, size_t dst_size, const ufbx_error *error); + +// Query + +// Find a property `name` from `props`, returns `NULL` if not found. +// Searches through `ufbx_props.defaults` as well. +ufbx_abi ufbx_prop *ufbx_find_prop_len(const ufbx_props *props, const char *name, size_t name_len); +ufbx_inline ufbx_prop *ufbx_find_prop(const ufbx_props *props, const char *name) { return ufbx_find_prop_len(props, name, strlen(name));} + +// Utility functions for finding the value of a property, returns `def` if not found. +// NOTE: For `ufbx_string` you need to ensure the lifetime of the default is +// sufficient as no copy is made. +ufbx_abi ufbx_real ufbx_find_real_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_real def); +ufbx_inline ufbx_real ufbx_find_real(const ufbx_props *props, const char *name, ufbx_real def) { return ufbx_find_real_len(props, name, strlen(name), def); } +ufbx_abi ufbx_vec3 ufbx_find_vec3_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_vec3 def); +ufbx_inline ufbx_vec3 ufbx_find_vec3(const ufbx_props *props, const char *name, ufbx_vec3 def) { return ufbx_find_vec3_len(props, name, strlen(name), def); } +ufbx_abi int64_t ufbx_find_int_len(const ufbx_props *props, const char *name, size_t name_len, int64_t def); +ufbx_inline int64_t ufbx_find_int(const ufbx_props *props, const char *name, int64_t def) { return ufbx_find_int_len(props, name, strlen(name), def); } +ufbx_abi bool ufbx_find_bool_len(const ufbx_props *props, const char *name, size_t name_len, bool def); +ufbx_inline bool ufbx_find_bool(const ufbx_props *props, const char *name, bool def) { return ufbx_find_bool_len(props, name, strlen(name), def); } +ufbx_abi ufbx_string ufbx_find_string_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_string def); +ufbx_inline ufbx_string ufbx_find_string(const ufbx_props *props, const char *name, ufbx_string def) { return ufbx_find_string_len(props, name, strlen(name), def); } +ufbx_abi ufbx_blob ufbx_find_blob_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_blob def); +ufbx_inline ufbx_blob ufbx_find_blob(const ufbx_props *props, const char *name, ufbx_blob def) { return ufbx_find_blob_len(props, name, strlen(name), def); } + +// Find property in `props` with concatendated `parts[num_parts]`. +ufbx_abi ufbx_prop *ufbx_find_prop_concat(const ufbx_props *props, const ufbx_string *parts, size_t num_parts); + +// Get an element connected to a property. +ufbx_abi ufbx_element *ufbx_get_prop_element(const ufbx_element *element, const ufbx_prop *prop, ufbx_element_type type); + +// Find any element of type `type` in `scene` by `name`. +// For example if you want to find `ufbx_material` named `Mat`: +// (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Mat"); +ufbx_abi ufbx_element *ufbx_find_element_len(const ufbx_scene *scene, ufbx_element_type type, const char *name, size_t name_len); +ufbx_inline ufbx_element *ufbx_find_element(const ufbx_scene *scene, ufbx_element_type type, const char *name) { return ufbx_find_element_len(scene, type, name, strlen(name)); } + +// Find node in `scene` by `name` (shorthand for `ufbx_find_element(UFBX_ELEMENT_NODE)`). +ufbx_abi ufbx_node *ufbx_find_node_len(const ufbx_scene *scene, const char *name, size_t name_len); +ufbx_inline ufbx_node *ufbx_find_node(const ufbx_scene *scene, const char *name) { return ufbx_find_node_len(scene, name, strlen(name)); } + +// Find an animation stack in `scene` by `name` (shorthand for `ufbx_find_element(UFBX_ELEMENT_ANIM_STACK)`) +ufbx_abi ufbx_anim_stack *ufbx_find_anim_stack_len(const ufbx_scene *scene, const char *name, size_t name_len); +ufbx_inline ufbx_anim_stack *ufbx_find_anim_stack(const ufbx_scene *scene, const char *name) { return ufbx_find_anim_stack_len(scene, name, strlen(name)); } + +// Find a material in `scene` by `name` (shorthand for `ufbx_find_element(UFBX_ELEMENT_MATERIAL)`). +ufbx_abi ufbx_material *ufbx_find_material_len(const ufbx_scene *scene, const char *name, size_t name_len); +ufbx_inline ufbx_material *ufbx_find_material(const ufbx_scene *scene, const char *name) { return ufbx_find_material_len(scene, name, strlen(name)); } + +// Find a single animated property `prop` of `element` in `layer`. +// Returns `NULL` if not found. +ufbx_abi ufbx_anim_prop *ufbx_find_anim_prop_len(const ufbx_anim_layer *layer, const ufbx_element *element, const char *prop, size_t prop_len); +ufbx_inline ufbx_anim_prop *ufbx_find_anim_prop(const ufbx_anim_layer *layer, const ufbx_element *element, const char *prop) { return ufbx_find_anim_prop_len(layer, element, prop, strlen(prop)); } + +// Find all animated properties of `element` in `layer`. +ufbx_abi ufbx_anim_prop_list ufbx_find_anim_props(const ufbx_anim_layer *layer, const ufbx_element *element); + +// Get a matrix that transforms normals in the same way as Autodesk software. +// NOTE: The resulting normals are slightly incorrect as this function deliberately +// inverts geometric transformation wrong. For better results use +// `ufbx_matrix_for_normals(&node->geometry_to_world)`. +ufbx_abi ufbx_matrix ufbx_get_compatible_matrix_for_normals(const ufbx_node *node); + +// Utility + +// Decompress a DEFLATE compressed buffer. +// Returns the decompressed size or a negative error code (see source for details). +// NOTE: You must supply a valid `retain` with `ufbx_inflate_retain.initialized == false` +// but the rest can be uninitialized. +ufbx_abi ptrdiff_t ufbx_inflate(void *dst, size_t dst_size, const ufbx_inflate_input *input, ufbx_inflate_retain *retain); + +// Open a `ufbx_stream` from a file. +// Use `path_len == SIZE_MAX` for NULL terminated string. +ufbx_abi bool ufbx_open_file(ufbx_stream *stream, const char *path, size_t path_len); + +// Same as `ufbx_open_file()` but compatible with the callback in `ufbx_open_file_fn`. +// The `user` parameter is actually not used here. +ufbx_abi bool ufbx_default_open_file(void *user, ufbx_stream *stream, const char *path, size_t path_len, const ufbx_open_file_info *info); + +// NOTE: Uses the default ufbx allocator! +ufbx_abi bool ufbx_open_memory(ufbx_stream *stream, const void *data, size_t data_size, const ufbx_open_memory_opts *opts, ufbx_error *error); + +// Animation evaluation + +// Evaluate a single animation `curve` at a `time`. +// Returns `default_value` only if `curve == NULL` or it has no keyframes. +ufbx_abi ufbx_real ufbx_evaluate_curve(const ufbx_anim_curve *curve, double time, ufbx_real default_value); + +// Evaluate a value from bundled animation curves. +ufbx_abi ufbx_real ufbx_evaluate_anim_value_real(const ufbx_anim_value *anim_value, double time); +ufbx_abi ufbx_vec2 ufbx_evaluate_anim_value_vec2(const ufbx_anim_value *anim_value, double time); +ufbx_abi ufbx_vec3 ufbx_evaluate_anim_value_vec3(const ufbx_anim_value *anim_value, double time); + +// Evaluate an animated property `name` from `element` at `time`. +// NOTE: If the property is not found it will have the flag `UFBX_PROP_FLAG_NOT_FOUND`. +ufbx_abi ufbx_prop ufbx_evaluate_prop_len(const ufbx_anim *anim, const ufbx_element *element, const char *name, size_t name_len, double time); +ufbx_inline ufbx_prop ufbx_evaluate_prop(const ufbx_anim *anim, const ufbx_element *element, const char *name, double time) { + return ufbx_evaluate_prop_len(anim, element, name, strlen(name), time); +} + +// Evaluate all _animated_ properties of `element`. +// HINT: This function returns an `ufbx_props` structure with the original properties as +// `ufbx_props.defaults`. This lets you use `ufbx_find_prop/value()` for the results. +ufbx_abi ufbx_props ufbx_evaluate_props(const ufbx_anim *anim, const ufbx_element *element, double time, ufbx_prop *buffer, size_t buffer_size); + +ufbx_abi ufbx_transform ufbx_evaluate_transform(const ufbx_anim *anim, const ufbx_node *node, double time); +ufbx_abi ufbx_real ufbx_evaluate_blend_weight(const ufbx_anim *anim, const ufbx_blend_channel *channel, double time); + +ufbx_abi ufbx_const_prop_override_list ufbx_prepare_prop_overrides(ufbx_prop_override *overrides, size_t num_overrides); + +// Evaluate the whole `scene` at a specific `time` in the animation `anim`. +// The returned scene behaves as if it had been exported at a specific time +// in the specified animation, except that animated elements' properties contain +// only the animated values, the original ones are in `props->defaults`. +// +// NOTE: The returned scene refers to the original `scene` so the original +// scene cannot be freed until all evaluated scenes are freed. +ufbx_abi ufbx_scene *ufbx_evaluate_scene(const ufbx_scene *scene, const ufbx_anim *anim, double time, const ufbx_evaluate_opts *opts, ufbx_error *error); + +// Materials + +ufbx_abi ufbx_texture *ufbx_find_prop_texture_len(const ufbx_material *material, const char *name, size_t name_len); +ufbx_inline ufbx_texture *ufbx_find_prop_texture(const ufbx_material *material, const char *name) { + return ufbx_find_prop_texture_len(material, name, strlen(name)); +} + +ufbx_abi ufbx_string ufbx_find_shader_prop_len(const ufbx_shader *shader, const char *name, size_t name_len); +ufbx_inline ufbx_string ufbx_find_shader_prop(const ufbx_shader *shader, const char *name) { + return ufbx_find_shader_prop_len(shader, name, strlen(name)); +} + +ufbx_abi ufbx_shader_prop_binding_list ufbx_find_shader_prop_bindings_len(const ufbx_shader *shader, const char *name, size_t name_len); +ufbx_inline ufbx_shader_prop_binding_list ufbx_find_shader_prop_bindings(const ufbx_shader *shader, const char *name) { + return ufbx_find_shader_prop_bindings_len(shader, name, strlen(name)); +} + +ufbx_abi ufbx_shader_texture_input *ufbx_find_shader_texture_input_len(const ufbx_shader_texture *shader, const char *name, size_t name_len); +ufbx_inline ufbx_shader_texture_input *ufbx_find_shader_texture_input(const ufbx_shader_texture *shader, const char *name) { + return ufbx_find_shader_texture_input_len(shader, name, strlen(name)); +} + +// Math + +ufbx_abi bool ufbx_coordinate_axes_valid(ufbx_coordinate_axes axes); + +ufbx_abi ufbx_real ufbx_quat_dot(ufbx_quat a, ufbx_quat b); +ufbx_abi ufbx_quat ufbx_quat_mul(ufbx_quat a, ufbx_quat b); +ufbx_abi ufbx_quat ufbx_quat_normalize(ufbx_quat q); +ufbx_abi ufbx_quat ufbx_quat_fix_antipodal(ufbx_quat q, ufbx_quat reference); +ufbx_abi ufbx_quat ufbx_quat_slerp(ufbx_quat a, ufbx_quat b, ufbx_real t); +ufbx_abi ufbx_vec3 ufbx_quat_rotate_vec3(ufbx_quat q, ufbx_vec3 v); +ufbx_abi ufbx_vec3 ufbx_quat_to_euler(ufbx_quat q, ufbx_rotation_order order); +ufbx_abi ufbx_quat ufbx_euler_to_quat(ufbx_vec3 v, ufbx_rotation_order order); + +ufbx_abi ufbx_matrix ufbx_matrix_mul(const ufbx_matrix *a, const ufbx_matrix *b); +ufbx_abi ufbx_real ufbx_matrix_determinant(const ufbx_matrix *m); +ufbx_abi ufbx_matrix ufbx_matrix_invert(const ufbx_matrix *m); +ufbx_abi ufbx_matrix ufbx_matrix_for_normals(const ufbx_matrix *m); +ufbx_abi ufbx_vec3 ufbx_transform_position(const ufbx_matrix *m, ufbx_vec3 v); +ufbx_abi ufbx_vec3 ufbx_transform_direction(const ufbx_matrix *m, ufbx_vec3 v); +ufbx_abi ufbx_matrix ufbx_transform_to_matrix(const ufbx_transform *t); +ufbx_abi ufbx_transform ufbx_matrix_to_transform(const ufbx_matrix *m); + +// Skinning + +ufbx_abi ufbx_matrix ufbx_catch_get_skin_vertex_matrix(ufbx_panic *panic, const ufbx_skin_deformer *skin, size_t vertex, const ufbx_matrix *fallback); +ufbx_inline ufbx_matrix ufbx_get_skin_vertex_matrix(const ufbx_skin_deformer *skin, size_t vertex, const ufbx_matrix *fallback) { + return ufbx_catch_get_skin_vertex_matrix(NULL, skin, vertex, fallback); +} + +ufbx_abi ufbx_vec3 ufbx_get_blend_shape_vertex_offset(const ufbx_blend_shape *shape, size_t vertex); +ufbx_abi ufbx_vec3 ufbx_get_blend_vertex_offset(const ufbx_blend_deformer *blend, size_t vertex); + +ufbx_abi void ufbx_add_blend_shape_vertex_offsets(const ufbx_blend_shape *shape, ufbx_vec3 *vertices, size_t num_vertices, ufbx_real weight); +ufbx_abi void ufbx_add_blend_vertex_offsets(const ufbx_blend_deformer *blend, ufbx_vec3 *vertices, size_t num_vertices, ufbx_real weight); + +// Curves/surfaces + +ufbx_abi size_t ufbx_evaluate_nurbs_basis(const ufbx_nurbs_basis *basis, ufbx_real u, ufbx_real *weights, size_t num_weights, ufbx_real *derivatives, size_t num_derivatives); + +ufbx_abi ufbx_curve_point ufbx_evaluate_nurbs_curve(const ufbx_nurbs_curve *curve, ufbx_real u); +ufbx_abi ufbx_surface_point ufbx_evaluate_nurbs_surface(const ufbx_nurbs_surface *surface, ufbx_real u, ufbx_real v); + +ufbx_abi ufbx_line_curve *ufbx_tessellate_nurbs_curve(const ufbx_nurbs_curve *curve, const ufbx_tessellate_curve_opts *opts, ufbx_error *error); +ufbx_abi ufbx_mesh *ufbx_tessellate_nurbs_surface(const ufbx_nurbs_surface *surface, const ufbx_tessellate_surface_opts *opts, ufbx_error *error); + +ufbx_abi void ufbx_free_line_curve(ufbx_line_curve *curve); +ufbx_abi void ufbx_retain_line_curve(ufbx_line_curve *curve); + +// Mesh Topology + +ufbx_abi uint32_t ufbx_catch_triangulate_face(ufbx_panic *panic, uint32_t *indices, size_t num_indices, const ufbx_mesh *mesh, ufbx_face face); +ufbx_inline uint32_t ufbx_triangulate_face(uint32_t *indices, size_t num_indices, const ufbx_mesh *mesh, ufbx_face face) { + return ufbx_catch_triangulate_face(NULL, indices, num_indices, mesh, face); +} + +// Generate the half-edge representation of `mesh` to `topo[mesh->num_indices]` +ufbx_abi void ufbx_catch_compute_topology(ufbx_panic *panic, const ufbx_mesh *mesh, ufbx_topo_edge *topo, size_t num_topo); +ufbx_inline void ufbx_compute_topology(const ufbx_mesh *mesh, ufbx_topo_edge *topo, size_t num_topo) { + ufbx_catch_compute_topology(NULL, mesh, topo, num_topo); +} + +// Get the next/previous edge around a vertex +// NOTE: Does not return the half-edge on the opposite side (ie. `topo[index].twin`) + +ufbx_abi uint32_t ufbx_catch_topo_next_vertex_edge(ufbx_panic *panic, const ufbx_topo_edge *topo, size_t num_topo, uint32_t index); +ufbx_inline uint32_t ufbx_topo_next_vertex_edge(const ufbx_topo_edge *topo, size_t num_topo, uint32_t index) { + return ufbx_catch_topo_next_vertex_edge(NULL, topo, num_topo, index); +} + +ufbx_abi uint32_t ufbx_catch_topo_prev_vertex_edge(ufbx_panic *panic, const ufbx_topo_edge *topo, size_t num_topo, uint32_t index); +ufbx_inline uint32_t ufbx_topo_prev_vertex_edge(const ufbx_topo_edge *topo, size_t num_topo, uint32_t index) { + return ufbx_catch_topo_prev_vertex_edge(NULL, topo, num_topo, index); +} + +ufbx_abi ufbx_vec3 ufbx_catch_get_weighted_face_normal(ufbx_panic *panic, const ufbx_vertex_vec3 *positions, ufbx_face face); +ufbx_inline ufbx_vec3 ufbx_get_weighted_face_normal(const ufbx_vertex_vec3 *positions, ufbx_face face) { + return ufbx_catch_get_weighted_face_normal(NULL, positions, face); +} + +ufbx_abi size_t ufbx_catch_generate_normal_mapping(ufbx_panic *panic, const ufbx_mesh *mesh, + const ufbx_topo_edge *topo, size_t num_topo, + uint32_t *normal_indices, size_t num_normal_indices, bool assume_smooth); +ufbx_abi size_t ufbx_generate_normal_mapping(const ufbx_mesh *mesh, + const ufbx_topo_edge *topo, size_t num_topo, + uint32_t *normal_indices, size_t num_normal_indices, bool assume_smooth); + +ufbx_abi void ufbx_catch_compute_normals(ufbx_panic *panic, const ufbx_mesh *mesh, const ufbx_vertex_vec3 *positions, + const uint32_t *normal_indices, size_t num_normal_indices, + ufbx_vec3 *normals, size_t num_normals); +ufbx_abi void ufbx_compute_normals(const ufbx_mesh *mesh, const ufbx_vertex_vec3 *positions, + const uint32_t *normal_indices, size_t num_normal_indices, + ufbx_vec3 *normals, size_t num_normals); + +ufbx_abi ufbx_mesh *ufbx_subdivide_mesh(const ufbx_mesh *mesh, size_t level, const ufbx_subdivide_opts *opts, ufbx_error *error); + +ufbx_abi void ufbx_free_mesh(ufbx_mesh *mesh); +ufbx_abi void ufbx_retain_mesh(ufbx_mesh *mesh); + +// Geometry caches + +ufbx_abi ufbx_geometry_cache *ufbx_load_geometry_cache( + const char *filename, + const ufbx_geometry_cache_opts *opts, ufbx_error *error); +ufbx_abi ufbx_geometry_cache *ufbx_load_geometry_cache_len( + const char *filename, size_t filename_len, + const ufbx_geometry_cache_opts *opts, ufbx_error *error); + +ufbx_abi void ufbx_free_geometry_cache(ufbx_geometry_cache *cache); +ufbx_abi void ufbx_retain_geometry_cache(ufbx_geometry_cache *cache); + +ufbx_abi size_t ufbx_read_geometry_cache_real(const ufbx_cache_frame *frame, ufbx_real *data, size_t num_data, const ufbx_geometry_cache_data_opts *opts); +ufbx_abi size_t ufbx_sample_geometry_cache_real(const ufbx_cache_channel *channel, double time, ufbx_real *data, size_t num_data, const ufbx_geometry_cache_data_opts *opts); +ufbx_abi size_t ufbx_read_geometry_cache_vec3(const ufbx_cache_frame *frame, ufbx_vec3 *data, size_t num_data, const ufbx_geometry_cache_data_opts *opts); +ufbx_abi size_t ufbx_sample_geometry_cache_vec3(const ufbx_cache_channel *channel, double time, ufbx_vec3 *data, size_t num_data, const ufbx_geometry_cache_data_opts *opts); + +// DOM + +ufbx_abi ufbx_dom_node *ufbx_dom_find_len(const ufbx_dom_node *parent, const char *name, size_t name_len); +ufbx_inline ufbx_dom_node *ufbx_dom_find(const ufbx_dom_node *parent, const char *name) { return ufbx_dom_find_len(parent, name, strlen(name)); } + +// Utility + +ufbx_abi size_t ufbx_generate_indices(const ufbx_vertex_stream *streams, size_t num_streams, uint32_t *indices, size_t num_indices, const ufbx_allocator_opts *allocator, ufbx_error *error); + +// -- Inline API + +ufbx_abi ufbx_real ufbx_catch_get_vertex_real(ufbx_panic *panic, const ufbx_vertex_real *v, size_t index); +ufbx_abi ufbx_vec2 ufbx_catch_get_vertex_vec2(ufbx_panic *panic, const ufbx_vertex_vec2 *v, size_t index); +ufbx_abi ufbx_vec3 ufbx_catch_get_vertex_vec3(ufbx_panic *panic, const ufbx_vertex_vec3 *v, size_t index); +ufbx_abi ufbx_vec4 ufbx_catch_get_vertex_vec4(ufbx_panic *panic, const ufbx_vertex_vec4 *v, size_t index); + +ufbx_inline ufbx_real ufbx_get_vertex_real(const ufbx_vertex_real *v, size_t index) { ufbx_assert(index < v->indices.count); return v->values.data[(int32_t)v->indices.data[index]]; } +ufbx_inline ufbx_vec2 ufbx_get_vertex_vec2(const ufbx_vertex_vec2 *v, size_t index) { ufbx_assert(index < v->indices.count); return v->values.data[(int32_t)v->indices.data[index]]; } +ufbx_inline ufbx_vec3 ufbx_get_vertex_vec3(const ufbx_vertex_vec3 *v, size_t index) { ufbx_assert(index < v->indices.count); return v->values.data[(int32_t)v->indices.data[index]]; } +ufbx_inline ufbx_vec4 ufbx_get_vertex_vec4(const ufbx_vertex_vec4 *v, size_t index) { ufbx_assert(index < v->indices.count); return v->values.data[(int32_t)v->indices.data[index]]; } + +ufbx_abi size_t ufbx_get_triangulate_face_num_indices(ufbx_face face); + +ufbx_abi ufbx_unknown *ufbx_as_unknown(const ufbx_element *element); +ufbx_abi ufbx_node *ufbx_as_node(const ufbx_element *element); +ufbx_abi ufbx_mesh *ufbx_as_mesh(const ufbx_element *element); +ufbx_abi ufbx_light *ufbx_as_light(const ufbx_element *element); +ufbx_abi ufbx_camera *ufbx_as_camera(const ufbx_element *element); +ufbx_abi ufbx_bone *ufbx_as_bone(const ufbx_element *element); +ufbx_abi ufbx_empty *ufbx_as_empty(const ufbx_element *element); +ufbx_abi ufbx_line_curve *ufbx_as_line_curve(const ufbx_element *element); +ufbx_abi ufbx_nurbs_curve *ufbx_as_nurbs_curve(const ufbx_element *element); +ufbx_abi ufbx_nurbs_surface *ufbx_as_nurbs_surface(const ufbx_element *element); +ufbx_abi ufbx_nurbs_trim_surface *ufbx_as_nurbs_trim_surface(const ufbx_element *element); +ufbx_abi ufbx_nurbs_trim_boundary *ufbx_as_nurbs_trim_boundary(const ufbx_element *element); +ufbx_abi ufbx_procedural_geometry *ufbx_as_procedural_geometry(const ufbx_element *element); +ufbx_abi ufbx_stereo_camera *ufbx_as_stereo_camera(const ufbx_element *element); +ufbx_abi ufbx_camera_switcher *ufbx_as_camera_switcher(const ufbx_element *element); +ufbx_abi ufbx_marker *ufbx_as_marker(const ufbx_element *element); +ufbx_abi ufbx_lod_group *ufbx_as_lod_group(const ufbx_element *element); +ufbx_abi ufbx_skin_deformer *ufbx_as_skin_deformer(const ufbx_element *element); +ufbx_abi ufbx_skin_cluster *ufbx_as_skin_cluster(const ufbx_element *element); +ufbx_abi ufbx_blend_deformer *ufbx_as_blend_deformer(const ufbx_element *element); +ufbx_abi ufbx_blend_channel *ufbx_as_blend_channel(const ufbx_element *element); +ufbx_abi ufbx_blend_shape *ufbx_as_blend_shape(const ufbx_element *element); +ufbx_abi ufbx_cache_deformer *ufbx_as_cache_deformer(const ufbx_element *element); +ufbx_abi ufbx_cache_file *ufbx_as_cache_file(const ufbx_element *element); +ufbx_abi ufbx_material *ufbx_as_material(const ufbx_element *element); +ufbx_abi ufbx_texture *ufbx_as_texture(const ufbx_element *element); +ufbx_abi ufbx_video *ufbx_as_video(const ufbx_element *element); +ufbx_abi ufbx_shader *ufbx_as_shader(const ufbx_element *element); +ufbx_abi ufbx_shader_binding *ufbx_as_shader_binding(const ufbx_element *element); +ufbx_abi ufbx_anim_stack *ufbx_as_anim_stack(const ufbx_element *element); +ufbx_abi ufbx_anim_layer *ufbx_as_anim_layer(const ufbx_element *element); +ufbx_abi ufbx_anim_value *ufbx_as_anim_value(const ufbx_element *element); +ufbx_abi ufbx_anim_curve *ufbx_as_anim_curve(const ufbx_element *element); +ufbx_abi ufbx_display_layer *ufbx_as_display_layer(const ufbx_element *element); +ufbx_abi ufbx_selection_set *ufbx_as_selection_set(const ufbx_element *element); +ufbx_abi ufbx_selection_node *ufbx_as_selection_node(const ufbx_element *element); +ufbx_abi ufbx_character *ufbx_as_character(const ufbx_element *element); +ufbx_abi ufbx_constraint *ufbx_as_constraint(const ufbx_element *element); +ufbx_abi ufbx_pose *ufbx_as_pose(const ufbx_element *element); +ufbx_abi ufbx_metadata_object *ufbx_as_metadata_object(const ufbx_element *element); + +// -- FFI API + +ufbx_abi void ufbx_ffi_find_int_len(int64_t *retval, const ufbx_props *props, const char *name, size_t name_len, const int64_t *def); +ufbx_abi void ufbx_ffi_find_vec3_len(ufbx_vec3 *retval, const ufbx_props *props, const char *name, size_t name_len, const ufbx_vec3 *def); +ufbx_abi void ufbx_ffi_find_string_len(ufbx_string *retval, const ufbx_props *props, const char *name, size_t name_len, const ufbx_string *def); +ufbx_abi void ufbx_ffi_find_anim_props(ufbx_anim_prop_list *retval, const ufbx_anim_layer *layer, const ufbx_element *element); +ufbx_abi void ufbx_ffi_get_compatible_matrix_for_normals(ufbx_matrix *retval, const ufbx_node *node); +ufbx_abi void ufbx_ffi_evaluate_anim_value_vec2(ufbx_vec2 *retval, const ufbx_anim_value *anim_value, double time); +ufbx_abi void ufbx_ffi_evaluate_anim_value_vec3(ufbx_vec3 *retval, const ufbx_anim_value *anim_value, double time); +ufbx_abi void ufbx_ffi_evaluate_prop_len(ufbx_prop *retval, const ufbx_anim *anim, const ufbx_element *element, const char *name, size_t name_len, double time); +ufbx_abi void ufbx_ffi_evaluate_props(ufbx_props *retval, const ufbx_anim *anim, ufbx_element *element, double time, ufbx_prop *buffer, size_t buffer_size); +ufbx_abi void ufbx_ffi_evaluate_transform(ufbx_transform *retval, const ufbx_anim *anim, const ufbx_node *node, double time); +ufbx_abi ufbx_real ufbx_ffi_evaluate_blend_weight(const ufbx_anim *anim, const ufbx_blend_channel *channel, double time); +ufbx_abi void ufbx_ffi_prepare_prop_overrides(ufbx_const_prop_override_list *retval, ufbx_prop_override *overrides, size_t num_overrides); +ufbx_abi void ufbx_ffi_quat_mul(ufbx_quat *retval, const ufbx_quat *a, const ufbx_quat *b); +ufbx_abi void ufbx_ffi_quat_normalize(ufbx_quat *retval, const ufbx_quat *q); +ufbx_abi void ufbx_ffi_quat_fix_antipodal(ufbx_quat *retval, const ufbx_quat *q, const ufbx_quat *reference); +ufbx_abi void ufbx_ffi_quat_slerp(ufbx_quat *retval, const ufbx_quat *a, const ufbx_quat *b, ufbx_real t); +ufbx_abi void ufbx_ffi_quat_rotate_vec3(ufbx_vec3 *retval, const ufbx_quat *q, const ufbx_vec3 *v); +ufbx_abi void ufbx_ffi_quat_to_euler(ufbx_vec3 *retval, const ufbx_quat *q, ufbx_rotation_order order); +ufbx_abi void ufbx_ffi_euler_to_quat(ufbx_quat *retval, const ufbx_vec3 *v, ufbx_rotation_order order); +ufbx_abi void ufbx_ffi_matrix_mul(ufbx_matrix *retval, const ufbx_matrix *a, const ufbx_matrix *b); +ufbx_abi void ufbx_ffi_matrix_invert(ufbx_matrix *retval, const ufbx_matrix *m); +ufbx_abi void ufbx_ffi_matrix_for_normals(ufbx_matrix *retval, const ufbx_matrix *m); +ufbx_abi void ufbx_ffi_transform_position(ufbx_vec3 *retval, const ufbx_matrix *m, const ufbx_vec3 *v); +ufbx_abi void ufbx_ffi_transform_direction(ufbx_vec3 *retval, const ufbx_matrix *m, const ufbx_vec3 *v); +ufbx_abi void ufbx_ffi_transform_to_matrix(ufbx_matrix *retval, const ufbx_transform *t); +ufbx_abi void ufbx_ffi_matrix_to_transform(ufbx_transform *retval, const ufbx_matrix *m); +ufbx_abi void ufbx_ffi_get_skin_vertex_matrix(ufbx_matrix *retval, const ufbx_skin_deformer *skin, size_t vertex, const ufbx_matrix *fallback); +ufbx_abi void ufbx_ffi_get_blend_shape_vertex_offset(ufbx_vec3 *retval, const ufbx_blend_shape *shape, size_t vertex); +ufbx_abi void ufbx_ffi_get_blend_vertex_offset(ufbx_vec3 *retval, const ufbx_blend_deformer *blend, size_t vertex); +ufbx_abi void ufbx_ffi_evaluate_nurbs_curve(ufbx_curve_point *retval, const ufbx_nurbs_curve *curve, ufbx_real u); +ufbx_abi void ufbx_ffi_evaluate_nurbs_surface(ufbx_surface_point *retval, const ufbx_nurbs_surface *surface, ufbx_real u, ufbx_real v); +ufbx_abi void ufbx_ffi_get_weighted_face_normal(ufbx_vec3 *retval, const ufbx_vertex_vec3 *positions, const ufbx_face *face); +ufbx_abi size_t ufbx_ffi_get_triangulate_face_num_indices(const ufbx_face *face); +ufbx_abi uint32_t ufbx_ffi_triangulate_face(uint32_t *indices, size_t num_indices, const ufbx_mesh *mesh, const ufbx_face *face); + +#ifdef __cplusplus +} +#endif + +// bindgen-disable +#if UFBX_CPP11 + +ufbx_inline void ufbx_retain(ufbx_scene *scene) { ufbx_retain_scene(scene); } +ufbx_inline void ufbx_free(ufbx_scene *scene) { ufbx_free_scene(scene); } +ufbx_inline void ufbx_retain(ufbx_mesh *mesh) { ufbx_retain_mesh(mesh); } +ufbx_inline void ufbx_free(ufbx_mesh *mesh) { ufbx_free_mesh(mesh); } +ufbx_inline void ufbx_retain(ufbx_line_curve *curve) { ufbx_retain_line_curve(curve); } +ufbx_inline void ufbx_free(ufbx_line_curve *curve) { ufbx_free_line_curve(curve); } +ufbx_inline void ufbx_retain(ufbx_geometry_cache *cache) { ufbx_retain_geometry_cache(cache); } +ufbx_inline void ufbx_free(ufbx_geometry_cache *cache) { ufbx_free_geometry_cache(cache); } + +// RAII wrapper over refcounted ufbx types. +// Behaves like `std::shared_ptr`. +template +struct ufbx_ref { + ufbx_ref() noexcept : ptr(nullptr) { } + explicit ufbx_ref(T *ptr) noexcept : ptr(ptr) { } + ufbx_ref(const ufbx_ref &ref) noexcept : ptr(ref.ptr) { ufbx_retain(ref.ptr); } + ufbx_ref(ufbx_ref &&ref) noexcept : ptr(ref.ptr) { ref.ptr = nullptr; } + ~ufbx_ref() { ufbx_free(ptr); } + + ufbx_ref &operator=(const ufbx_ref &ref) noexcept { + if (&ref == this) return *this; + ufbx_free(ptr); + ufbx_retain(ref.ptr); + ptr = ref.ptr; + return *this; + } + + ufbx_ref &operator=(ufbx_ref &&ref) noexcept { + if (&ref == this) return *this; + ptr = ref.ptr; + ref.ptr = nullptr; + return *this; + } + + void reset() noexcept { + ufbx_free(ptr); + ptr = nullptr; + } + + void swap(ufbx_ref &ref) noexcept { + T *tmp = ptr; + ptr = ref.ptr; + ref.ptr = tmp; + } + + T &operator*() const noexcept { return *ptr; } + T *operator->() const noexcept { return ptr; } + T *get() const noexcept { return ptr; } + +private: + T *ptr; +}; + +typedef ufbx_ref ufbx_scene_ref; +typedef ufbx_ref ufbx_mesh_ref; +typedef ufbx_ref ufbx_line_curve_ref; +typedef ufbx_ref ufbx_geometry_cache_ref; + +#endif +// bindgen-enable + +#if defined(_MSC_VER) + #pragma warning(pop) +#elif defined(__clang__) + #pragma clang diagnostic pop +#elif defined(__GNUC__) + #pragma GCC diagnostic pop +#endif + +#endif + diff --git a/modules/ufbx/ufbx.lib b/modules/ufbx/ufbx.lib new file mode 100644 index 0000000..dfe8d43 Binary files /dev/null and b/modules/ufbx/ufbx.lib differ diff --git a/modules/ufbx/ufbx.obj b/modules/ufbx/ufbx.obj new file mode 100644 index 0000000..c857692 Binary files /dev/null and b/modules/ufbx/ufbx.obj differ